[
  {
    "path": "404.php",
    "content": "<?php \nif (!defined('__TYPECHO_ROOT_DIR__')) exit; \n?>\n<?php $this->need('compoment/head.php');?>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n              <div class=\"page-card\">\n              <center>\n              <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"200\" height=\"199\" viewBox=\"0 0 481 480\"><defs><linearGradient id=\"a\" x1=\"0.5\" y1=\"-0.453\" x2=\"0.5\" y2=\"1\" 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=\"#e0e5ef\" stop-opacity=\"0\"/><stop offset=\"0\" stop-color=\"#c5ccd8\"/><stop offset=\"1\" stop-color=\"#909aa9\"/></linearGradient><linearGradient id=\"c\" x1=\"0.5\" y1=\"1\" x2=\"0.5\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#e0e5ef\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#909aa9\"/></linearGradient><linearGradient id=\"d\" x1=\"0.5\" x2=\"0.5\" y2=\"1\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#c9d0db\"/><stop offset=\"1\" stop-color=\"#909aa9\"/></linearGradient><linearGradient id=\"e\" x1=\"1.2\" y1=\"0.363\" x2=\"0.223\" y2=\"0.334\" xlink:href=\"#d\"/><linearGradient id=\"f\" x1=\"-0.095\" y1=\"0.875\" x2=\"0.955\" y2=\"-0.031\" xlink:href=\"#d\"/><filter id=\"g\" x=\"285.702\" y=\"281.195\" width=\"57.512\" height=\"32.141\" filterUnits=\"userSpaceOnUse\"><feOffset dy=\"2\" input=\"SourceAlpha\"/><feGaussianBlur stdDeviation=\"1.5\" result=\"h\"/><feFlood flood-opacity=\"0.161\"/><feComposite operator=\"in\" in2=\"h\"/><feComposite in=\"SourceGraphic\"/></filter><linearGradient id=\"i\" 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=\"j\" x1=\"-0.906\" y1=\"1.646\" x2=\"0.636\" y2=\"0.061\" xlink:href=\"#i\"/><linearGradient id=\"k\" x1=\"-0.109\" y1=\"1.931\" x2=\"0.736\" y2=\"0.141\" xlink:href=\"#i\"/></defs><g transform=\"translate(1 0)\"><g transform=\"translate(0 -12)\"><g transform=\"translate(55 68)\"><ellipse cx=\"184\" cy=\"183.966\" rx=\"184\" ry=\"183.966\" fill=\"#f3f3fa\"/></g><g transform=\"translate(64 143.984)\"><path d=\"M44,0,88,56H0Z\" fill=\"#e1e6ef\"/><path d=\"M44,0,88,56H24Z\" fill=\"#cdd3df\"/></g><g transform=\"translate(104 127.986)\"><path d=\"M44,0,88,72H0Z\" fill=\"#e1e6ef\"/><path d=\"M44,0,88,72H64Z\" fill=\"#cdd3df\"/></g><g transform=\"translate(56 191.933)\"><path d=\"M0,60.067A183.747,183.747,0,0,1,9.981.135a604.193,604.193,0,0,1,96.267,5.684C199.753,18.913,230.562,32,304,32c26.248,0,45.995-3.344,60.537-7.642A184.016,184.016,0,1,1,0,60.067Z\" fill=\"#f1f3f6\"/><path d=\"M0,19.8C14.137,12.316,48.493-1.962,101.8.225c71.736,2.944,113.328,29.726,177.789,35.71,20.329,1.887,35.8,1.412,47.451-.121a183.93,183.93,0,0,1-159.4,92.024A184.036,184.036,0,0,1,0,19.8Z\" transform=\"translate(16.361 116.162)\" fill=\"#e8ebf1\"/></g><path d=\"M-2,3.74C-2.25-2.25,4.188-8.562,6.25,0s2.5,20.688,5.5,32.5,6.5,10.75,6.5,3.25-.312-16.75,1.5-25.5,7.875-6.562,10-1-2.812,17.875-1.5,23.25,5.211,7.253,6.75-1.75S33.657,3.74,33.657,3.74,35.789,1.56,37.5,1.75s3,2.75,3,2.75,5.938,20.75,2.25,33-12.375,2.563-17,16S22,89.5,22,89.5s-4.25,1.438-7.25,1A7.89,7.89,0,0,1,10,87.75S15.063,70.25,14.75,60s-3.187-6.25-7-11.5A46.328,46.328,0,0,1,2,37.5S-1.75,9.729-2,3.74Z\" transform=\"translate(380.007 157.155)\" fill=\"#e0e4ec\"/><path d=\"M29.988,14.593c.174-4.315-4.308-8.862-5.744-2.694s-3.829,8.456-3.829,8.456S15.89,28.1,15.89,22.7s.218-8.473-1.044-14.777S9.363,3.193,7.884,7.2s1.958,9.284,1.044,13.156S5.3,25.58,4.229,19.095,5.164-.362,5.164-.362,3.679-1.933,2.488-1.8.4.185.4.185-3.734,15.133-1.167,23.957,7.449,25.8,10.669,35.483s2.611,25.933,2.611,25.933a13.145,13.145,0,0,0,5.047.72,5.477,5.477,0,0,0,3.307-1.981s-3.524-12.606-3.307-19.99,2.219-4.5,4.873-8.284a33.841,33.841,0,0,0,4-7.924S29.814,18.908,29.988,14.593Z\" transform=\"translate(338.007 177.78)\" fill=\"#e0e4ec\"/><path d=\"M29.988,14.593c.174-4.315-4.308-8.862-5.744-2.694s-3.829,8.456-3.829,8.456S15.89,28.1,15.89,22.7s.218-8.473-1.044-14.777S9.363,3.193,7.884,7.2s1.958,9.284,1.044,13.156S5.3,25.58,4.229,19.095,5.164-.362,5.164-.362,3.679-1.933,2.488-1.8.4.185.4.185-3.734,15.133-1.167,23.957,7.449,25.8,10.669,35.483s2.611,25.933,2.611,25.933a13.145,13.145,0,0,0,5.047.72,5.477,5.477,0,0,0,3.307-1.981s-3.524-12.606-3.307-19.99,2.219-4.5,4.873-8.284a33.841,33.841,0,0,0,4-7.924S29.814,18.908,29.988,14.593Z\" transform=\"translate(90.007 257.763)\" fill=\"#e0e4ec\"/><path d=\"M143.3,233.331c57.725-31.349,121.023-71.406,127.244-99.139,11.667-52-90.333-78.667-140.667-81C50.376,51.7,8.124,43.5,0,30.29q.663-5.263,1.621-10.435C14.91,8.621,68.542,9.776,109.442,10.931c27.411.775,49.1,1.549,49.1-1.406,0-8-128-5.666-128-8s144-3.667,144,9-128.334,7-128,15c.114,2.743-4,4,40,8s81,3.667,136,8c37.381.639,104.356,22.832,139.606,52.153A184.078,184.078,0,0,1,182.547,237.526,184.617,184.617,0,0,1,143.3,233.331Z\" transform=\"translate(57.453 198.408)\" fill=\"url(#a)\"/></g><g transform=\"translate(-159.442 139.453) rotate(-20)\"><path d=\"M2,0H6L8,24H0Z\" transform=\"translate(296 144)\" fill=\"#bfc3c9\"/><g transform=\"translate(0 16)\"><rect width=\"56\" height=\"56\" rx=\"28\" transform=\"translate(272 144)\" fill=\"#909aa9\"/><ellipse cx=\"60\" cy=\"24\" rx=\"60\" ry=\"24\" transform=\"translate(240 160)\" fill=\"url(#b)\"/><ellipse cx=\"36\" cy=\"12\" rx=\"36\" ry=\"12\" transform=\"translate(264 174)\" fill=\"#909aa9\"/></g><path d=\"M0,0H72L96,88H-24Z\" transform=\"translate(264 200)\" opacity=\"0.6\" fill=\"url(#c)\"/><circle cx=\"2\" cy=\"2\" r=\"2\" transform=\"translate(298 142)\" fill=\"#909aa9\"/></g><path d=\"M403.8,89.126a1.164,1.164,0,0,1-.823-1.991,13.251,13.251,0,0,0,0-18.73,1.1,1.1,0,0,1-.339-.808,1.191,1.191,0,0,1,.34-.823,1.116,1.116,0,0,1,.808-.344,1.156,1.156,0,0,1,.821.345,15.589,15.589,0,0,1,.016,22.006,1.159,1.159,0,0,1-.823.345Z\" transform=\"matrix(0.848, -0.53, 0.53, 0.848, -156.348, 438.23)\" fill=\"#909aa9\" opacity=\"0.25\"/><path d=\"M240.638,196.484a1.156,1.156,0,0,1-.821-.345,9.7,9.7,0,0,1,0-13.717,1.117,1.117,0,0,1,.809-.345,1.168,1.168,0,0,1,.821,1.991,7.38,7.38,0,0,0,0,10.44,1.118,1.118,0,0,1,.345.8,1.155,1.155,0,0,1-.345.83A1.117,1.117,0,0,1,240.638,196.484Z\" transform=\"matrix(0.848, -0.53, 0.53, 0.848, -93.168, 268.028)\" fill=\"#909aa9\" opacity=\"0.65\"/><path d=\"M95.358,84.972a1.156,1.156,0,0,1-.821-.345,1.118,1.118,0,0,1-.345-.8,1.155,1.155,0,0,1,.345-.83,7.38,7.38,0,0,0,0-10.44,1.1,1.1,0,0,1-.339-.808,1.191,1.191,0,0,1,.34-.823,1.116,1.116,0,0,1,.808-.344,1.156,1.156,0,0,1,.821.345,9.678,9.678,0,0,1,0,13.7,1.117,1.117,0,0,1-.809.345Z\" transform=\"matrix(0.848, -0.53, 0.53, 0.848, 101.699, 277.986)\" fill=\"#909aa9\" opacity=\"0.65\"/><path d=\"M393.4,98.429a1.416,1.416,0,0,1-1.415-1.415V82.139l-.069-.025a4.438,4.438,0,0,1,1.484-8.62,4.44,4.44,0,0,1,4.436,4.436,4.457,4.457,0,0,1-2.953,4.184l-.069.025V97.014A1.416,1.416,0,0,1,393.4,98.429Zm0-22.137a1.623,1.623,0,1,0,1.623,1.623A1.625,1.625,0,0,0,393.4,76.292Z\" transform=\"matrix(0.848, -0.53, 0.53, 0.848, -157.348, 439.23)\" fill=\"#909aa9\"/><path d=\"M78.731,89.125a1.156,1.156,0,0,1-.821-.345l-.016-.016a15.527,15.527,0,0,1,.016-21.99,1.164,1.164,0,1,1,1.646,1.646,13.27,13.27,0,0,0-.016,18.73,1.118,1.118,0,0,1,.345.8,1.155,1.155,0,0,1-.345.83,1.117,1.117,0,0,1-.809.345Z\" transform=\"matrix(0.848, -0.53, 0.53, 0.848, 97.699, 279.986)\" fill=\"#909aa9\" opacity=\"0.25\"/><ellipse cx=\"44.972\" cy=\"12.785\" rx=\"44.972\" ry=\"12.785\" transform=\"translate(179.875 366.76)\" fill=\"#ced1d5\"/><path d=\"M33.989,403.59v-.056C30.442,394.187,18.9,389.8,9.1,391.147c7.263-4.223,19.256-5.349,24.887,1.126v.056c5.63-6.419,17.68-5.349,24.887-1.126-9.8-1.295-21.34,3.1-24.887,12.387Z\" transform=\"translate(247.999 -220.698)\" fill=\"#909aa9\" opacity=\"0.65\"/><path d=\"M21.052,395.329V395.3c-1.7-4.488-7.245-6.6-11.949-5.948,3.488-2.028,9.246-2.568,11.95.541v.027c2.7-3.082,8.489-2.568,11.95-.541-4.7-.622-10.246,1.487-11.95,5.948Z\" transform=\"translate(230.999 -245.698)\" fill=\"#909aa9\" opacity=\"0.65\"/><path d=\"M17.385,392.987v-.019c-1.181-3.111-5.022-4.572-8.283-4.123,2.417-1.405,6.409-1.78,8.283.375v.019c1.874-2.136,5.884-1.78,8.283-.375-3.261-.431-7.1,1.031-8.283,4.123Z\" transform=\"translate(297.999 -232.698)\" fill=\"#909aa9\" opacity=\"0.35\"/><path d=\"M17.385,392.987v-.019c-1.181-3.111-5.022-4.572-8.283-4.123,2.417-1.405,6.409-1.78,8.283.375v.019c1.874-2.136,5.884-1.78,8.283-.375-3.261-.431-7.1,1.031-8.283,4.123Z\" transform=\"translate(280.999 -255.698)\" fill=\"#909aa9\" opacity=\"0.35\"/><path d=\"M14.844,391.365v-.013c-.818-2.156-3.482-3.17-5.742-2.858,1.676-.974,4.443-1.234,5.742.26v.013c1.3-1.481,4.079-1.234,5.742-.26-2.26-.3-4.924.715-5.742,2.858Z\" transform=\"translate(328.999 -243.698)\" fill=\"#909aa9\" opacity=\"0.35\"/><ellipse cx=\"12.835\" cy=\"3.414\" rx=\"12.835\" ry=\"3.414\" transform=\"translate(261.875 366.503)\" fill=\"#ced1d5\" opacity=\"0.64\"/><path d=\"M0,0H4.9V88.248a4.832,4.832,0,0,1-2.463.943A4.709,4.709,0,0,1,0,88.248Z\" transform=\"translate(282.865 282.226)\" fill=\"url(#d)\"/><path d=\"M0,.677s4.83-1.54,13.41-.621A24.678,24.678,0,0,0,28.192-3s-4.9,4.55-4.9,13.742,7.563,27.832,7.563,27.832S27.588,29.508,13.411,36.7,0,30.91,0,30.91Z\" transform=\"translate(333.116 280.42)\" fill=\"url(#e)\"/><path d=\"M0,1.354s6.03,2.92,14.694.542C25.663-1.114,36.3-6,46.718-6,64.8-6,60.058,2.58,60.058,2.58s3.351,29.033.077,36.081c-1.455,2.834,4.9-7.89-13.176-7.89-10.088,0-20.163,4.66-31.806,7.8A25.4,25.4,0,0,1,0,38.124Z\" transform=\"translate(282.865 279.743)\" fill=\"url(#f)\"/><g transform=\"matrix(1, 0, 0, 1, -1, 0)\" filter=\"url(#g)\"><path d=\"M-16.663-1.608l2.084-3.6c.515-1.03,1.005-2.084,1.471-3.113h.1c-.049,1.152-.172,2.893-.172,4.045v2.672Zm9.585,0H-9.113V-11.977h-5.368L-20.83-1.314V1.7h7.648v4.56h4.069V1.7h2.035ZM3.463,4.153c3.849,0,6.472-3.285,6.472-9.56,0-6.226-2.623-9.364-6.472-9.364s-6.447,3.089-6.447,9.364S-.386,4.153,3.463,4.153Zm0-3.383c-1.3,0-2.329-1.177-2.329-6.177,0-4.976,1.03-6.006,2.329-6.006s2.353,1.03,2.353,6.006C5.816-.407,4.762.77,3.463.77ZM18.1-6.511l2.084-3.6c.515-1.03,1.005-2.084,1.471-3.113h.1c-.049,1.152-.172,2.893-.172,4.045v2.672Zm9.585,0H25.648V-16.88H20.279L13.93-6.217V-3.2h7.648v4.56h4.069V-3.2h2.035Z\" transform=\"translate(311.03 300.58)\" fill=\"#fff\"/></g><g transform=\"translate(214.729 294.147)\"><g transform=\"translate(37.299 41.039)\"><path d=\"M524.959,66.584a28.77,28.77,0,0,1,6.527,9.6c2.554,6.08,5.414,12.4,7.725,13.615s3.4,9.242-7.418,7.54S524.959,66.584,524.959,66.584Z\" transform=\"translate(-524.241 -66.584)\" fill=\"#fff\"/><path d=\"M525.471,68.3a29.792,29.792,0,0,1,6.405,15.523c.78,7.948,2.7,12.281,4.745,11.99a11.661,11.661,0,0,1-5.519-.023C527.864,95.079,524.163,68.4,525.471,68.3Z\" transform=\"translate(-523.876 -65.85)\" fill=\"url(#i)\"/></g><path d=\"M534.791,124.77a31.7,31.7,0,0,0,13.023,1c6.354-.9,8.04-12.664-.6-13.872-6.694-.94-5.551-11.209-6.785-20.665s-6.043-17.363-6.784-21.212,3.916-8.5,3.329-16.639c-.6-8.351-5.8-9.653-7.652-9.281s-3.325,2.2-5.669,3.2-5.8-.62-10.236,1.491-8.638,6.953-8.638,6.953c-1.85,2.359.37,9.809-.864,13.534s-6.167,36.132-6.043,45.2,5.92,15.4,18.379,17.011,17.888-.558,18.291-4.1c.257-2.251,1.755-10.182-7.19-11.547-4.45-.681-6.782-1.241-6.782-1.241\" transform=\"translate(-497.872 -36.225)\" fill=\"#fff\"/><path d=\"M519.206,44.835s.885-1.454,1.59-1.468c1.21-.024,2.484,1.5,2.484,1.5S519.246,46.466,519.206,44.835Z\" transform=\"translate(-488.951 -35.487)\" fill=\"#757f95\"/><path d=\"M521.691,37.916c-1.892-.494-2.1,1.921-2.1,1.921s-2.662-.289-2.4,1.605c.329,2.364,5.372,2.251,5.372,2.251S524,38.52,521.691,37.916Z\" transform=\"translate(-489.806 -37.849)\" fill=\"#757f95\"/><path d=\"M505.206,52.7s-5.609-1.233-6.223,3.056,3.852,6.917,7.052.556\" transform=\"translate(-497.421 -31.56)\" fill=\"#fff\"/><path d=\"M503.052,74.624s-1.336,16.489,1.013,20.621c2.119,3.726,9.822,4.733,15.435,4.265a23.065,23.065,0,0,0,5.539-1.148c5.59-1.987,2.608-5.708,0-8.192s-3.444-9.531-7.916-13.36\" transform=\"translate(-495.145 -21.886)\" fill=\"url(#j)\"/><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=\"translate(-493.064 -33.231)\" fill=\"#757f95\"/><path d=\"M530.283,76.271c-3.314-3.231-6.233.511-6.233.511s-5.711-4.5-7.834.24c-2.647,5.916,10.874,15.47,10.874,15.47S533.677,79.577,530.283,76.271Z\" transform=\"translate(-490.395 -22.005)\" fill=\"url(#k)\"/><path d=\"M504.118,75.051s4.625,14.071,6.974,18.2c2.981,5.24,8.722,7.839,14.309,5.854s2.608-5.092,0-7.575-3.753-10.859-8.225-14.688\" transform=\"translate(-496.176 -22.897)\" fill=\"#fff\"/></g></g></svg>\n              <div class=\"error-page\">\n            <h2 class=\"post-title\">404 - <?php _e('页面没找到'); ?></h2>\n            <p><?php _e('你想查看的页面已被转移或删除了'); ?></p>\n\n                <p>\n                <button class=\"ui button\" onclick=\"window.open('<?php $this->options->siteUrl();?>','_self')\">返回首页</button>\n                </p>\n        </div>\n              \n  </center>\n</div></div>\n\n\n\n</div>\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.MD",
    "content": "<img src=\"https://i.ibb.co/m0Q2dr0/IMG-20221202-015442.jpg\">\n<h1>Typecho主题 - Bearsimple <code>V2</code></h1>\n一款简洁大方的Typecho主题<br>\nQQ交流群:561848356<br>\n<a>若主题目录名为typecho-bearsimple-v2.x，则需改为bearsimple，配套插件目录中的BsCore需放入/usr/plugins中，否则无法正常使用。</a><br>\n<a>特别声明:本主题仅适用于单纯的博客日志，请勿用于违法站点，在遵守国家法律法规的前提下合理使用，谢谢~</a><br>\n<a href = \"https://www.bearnotion.ru/typecho-bearsimple.html\">使用说明</a>\n<a href = \"https://github.com/whitebearcode/typecho-bearsimple/releases/download/v2.9.9/Bearsimple_v2.9.9.release.zip\">最新版本[v2.9.9]下载</a>\n<a href = \"https://docs.whitebear.dev/\">文档中心</a>\n<a href = \"https://bearsimple.typecho.ru/\">演示站</a>\n<a href = \"https://www.bearnotion.ru/\">我的博客</a><br>\n<h2>主题功能</h2>\n<li>Pjax、图片灯箱、隐私评论、用户中心、投稿、微海报、切换文章字体等实用的功能</li>\n<li>BearSimple主打的就是简约而不简陋，所以功能全面也是BearSimple主题的一大特点</li>\n<h2>Thanks</h2>\nIDE：<code>JetBrains</code>、UI FrameWork：<code>Semantic-UI</code>\n<h2>License</h2>\n<code>GPL-3.0 license</code>"
  },
  {
    "path": "about.php",
    "content": "<?php\n    /**\n    * 关于我\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n<?php $this->need('compoment/head.php');?>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n            <div class=\"page-card\">\n                    <h2><i class=\"grin outline icon\"></i> <?php $this->title() ?></h2><br>\n\n  <div class=\"aboutcard\" data-state=\"#about\">\n  <div class=\"aboutcard-header\">\n    <div class=\"aboutcard-cover\" style=\"background-image: url('<?php echo Bsoptions('aboutme_background'); ?>')\"></div>\n    <img class=\"aboutcard-avatar\" src=\"<?php echo Bsoptions('aboutme_avatar'); ?>\" />\n    <h1 class=\"aboutcard-fullname\"><?php echo Bsoptions('aboutme_name'); ?></h1>\n    <h2 class=\"aboutcard-jobtitle\"><?php echo Bsoptions('aboutme_job'); ?></h2>\n  </div>\n  <div class=\"aboutcard-main\">\n    <div class=\"aboutcard-section is-active\" id=\"about\">\n      <div class=\"aboutcard-content\">\n        <div class=\"aboutcard-subtitle\">自我介绍</div>\n        <p class=\"aboutcard-desc\"><?php if(!empty(Bsoptions('aboutme_say'))): ?><?php echo Bsoptions('aboutme_say'); ?><?php else: ?>博主很懒，连自我介绍都懒得写～<?php endif; ?>\n        </p>\n      </div>\n      <div class=\"aboutcard-social\">\n    <?php\n    $socialLinks = [\n        'Github_URL' => [\n            'url' => Bsoptions('Github_URL'),\n            'icon' => 'github',\n            'id' => 'contactgithub',\n            'blank' => false,\n        ],\n        'Wechat_QRCODE' => [\n            'url' => Bsoptions('Wechat_QRCODE'),\n            'icon' => 'wechat',\n            'id' => 'contactwechat',\n            'blank' => false,\n        ],\n        'QQ_QRCODE' => [\n            'url' => Bsoptions('QQ_QRCODE'),\n            'icon' => 'qq',\n            'id' => 'contactqq',\n            'blank' => false,\n        ],\n        'Weibo_URL' => [\n            'url' => Bsoptions('Weibo_URL'),\n            'icon' => 'weibo',\n            'id' => 'contactweibo',\n            'blank' => (Bsoptions('Link_blank') == '2'),\n        ],\n        'Facebook_URL' => [\n            'url' => Bsoptions('Facebook_URL'),\n            'icon' => 'facebook',\n            'id' => 'contactfacebook',\n            'blank' => (Bsoptions('Link_blank') == '2'),\n        ],\n        'Twitter_URL' => [\n            'url' => Bsoptions('Twitter_URL'),\n            'icon' => 'times',\n            'id' => 'contacttwitter',\n            'blank' => (Bsoptions('Link_blank') == '2'),\n        ],\n        'Telegram_URL' => [\n            'url' => Bsoptions('Telegram_URL'),\n            'icon' => 'telegram',\n            'id' => 'contacttelegram',\n            'blank' => (Bsoptions('Link_blank') == '2'),\n        ],\n    ];\n\n    $hasSocial = false;\n    foreach ($socialLinks as $link) {\n        if (!empty($link['url'])) {\n            $hasSocial = true;\n            break;\n        }\n    }\n\n    if ($hasSocial) :\n    ?>\n        <div class=\"extra content center aligned\">\n            <?php foreach ($socialLinks as $key => $link): ?>\n                <?php if (!empty($link['url'])): ?>\n                    <a href=\"<?php echo esc_url($link['url']); ?>\" <?php echo $link['blank'] ? 'target=\"_blank\"' : ''; ?>>\n                        <i class=\"<?php echo esc_attr($link['icon']); ?> icon circular link\" \n                           style=\"margin-bottom: 10px\" \n                           id=\"<?php echo esc_attr($link['id']); ?>\"></i>\n                    </a>\n                <?php endif; ?>\n            <?php endforeach; ?>\n        </div>\n    <?php endif; ?>\n\n\n\n      </div>\n    </div>\n    <div class=\"aboutcard-section\" id=\"experience\" style=\"word-break:break-all\">\n      <div class=\"aboutcard-content\">\n        <div class=\"aboutcard-subtitle\">历程</div>\n        \n        \n         <div class=\"timeline-container\">\n\t\n<?php echo ParseAboutMe(); ?>\n\t\n</div>\n      \n      </div>\n    </div>\n    <?php if(Bsoptions('aboutme_ghOpen') == true) :?>\n    <div class=\"aboutcard-section\" id=\"plan\" style=\"word-break:break-all\">\n      <div class=\"aboutcard-content\">\n        <div class=\"aboutcard-subtitle\">规划</div>\n        \n        \n         <div class=\"timeline-container\">\n\t\n<?php echo ParseAboutMe('plan'); ?>\n\t\n</div>\n      \n      </div>\n    </div>\n    <?php endif;?>\n    <div class=\"aboutcard-section\" id=\"contact\">\n      <div class=\"aboutcard-content\">\n        <div class=\"aboutcard-subtitle\">联系方式</div>\n        <div class=\"aboutcard-contact-wrapper\">\n<?php if(!empty(Bsoptions('aboutme_qq'))): ?>\n          <div class=\"aboutcard-contact\">\n            <svg t=\"1644588288681\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"5473\" width=\"48\" height=\"48\"><path d=\"M110.08 808.409c22.43 7.581 46.927 2.973 68.962-13.135 0.572 0.886 1.123 1.752 1.694 2.619-37.632 22.961-58.624 55.02-58.624 90.762 0 73.511 86.469 126.858 205.627 126.858 63.193 0 121.758-16.404 159.39-44.288 12.229 0.689 23.138 0.689 35.505 0.02 37.632 27.864 96.177 44.268 159.37 44.268 119.138 0 205.646-53.347 205.646-126.858 0-35.663-20.913-67.624-58.387-90.605a99.888 99.888 0 0 0 1.713-2.638c21.977 15.99 46.316 20.618 68.766 13.016 67.17-22.823 70.833-140.012 40.192-238.69-16.266-52.342-46.16-93.361-71.07-120.655 0.295-3.78 0.453-7.542 0.453-11.343 0-28.947-7.582-57.029-22.528-83.672v-0.374c0-190.327-153.265-345.187-341.642-345.187-188.396 0-341.661 154.86-341.661 345.187v1.22c-14.632 26.388-22.056 54.213-22.056 82.807 0 3.446 0.118 6.931 0.394 10.476-25.226 27.451-55.473 68.785-71.857 121.54-30.661 98.718-26.998 215.868 40.113 238.672z m7.956-223.725c15.242-49.132 45.45-86.96 68.096-110.02a25.196 25.196 0 0 0 6.892-21.564c-0.827-5.317-1.26-10.397-1.26-15.34 0-21.681 6.301-43.047 18.688-63.429a25.488 25.488 0 0 0 3.623-14.828 79.882 79.882 0 0 1-0.236-5.79c0-162.56 130.678-294.813 291.288-294.813s291.289 132.253 291.289 294.813c0 1.753-0.079 3.446-0.197 5.16a25.277 25.277 0 0 0 3.683 14.828c12.642 20.559 19.042 42.102 19.042 64.04 0 5.159-0.453 10.377-1.359 15.93-1.339 7.917 1.221 15.951 6.833 21.721 22.37 22.902 52.264 60.475 67.407 109.292 26.959 86.784 17.507 167.286-8.211 176.03-13.332 4.51-29.125-9.708-38.952-21.445-5.336-6.42-13.41-9.807-21.937-8.881a25.137 25.137 0 0 0-19.594 13.233 324.714 324.714 0 0 1-31.252 47.97 25.242 25.242 0 0 0-4.549 21.918 25.215 25.215 0 0 0 14.69 16.876c35.152 14.651 55.277 35.88 55.277 58.25 0 42.181-69.651 76.485-155.274 76.485-55.512 0-107.185-14.828-134.813-38.715a25.174 25.174 0 0 0-16.463-6.124c-0.61 0-1.26 0.02-1.87 0.078-17.389 1.3-30.957 1.28-47.853-0.02-6.932-0.61-13.351 1.675-18.393 6.046-27.667 23.907-79.34 38.735-134.872 38.735-85.603 0-155.254-34.304-155.254-76.485 0-22.45 20.243-43.737 55.512-58.368 7.286-3.033 12.721-9.236 14.71-16.876a25.113 25.113 0 0 0-4.51-21.918c-11.874-15.183-22.37-31.35-31.231-48.049a25.163 25.163 0 0 0-19.633-13.253c-8.468-0.886-16.581 2.462-21.957 8.881-9.886 11.835-25.522 26.349-39.11 21.622-25.776-8.704-35.19-89.186-8.25-175.99z\" p-id=\"5474\"></path></svg>\n            QQ：<?php echo Bsoptions('aboutme_qq'); ?>\n          </div>\n<?php endif; ?>\n<?php if(!empty(Bsoptions('aboutme_weibo'))): ?>\n          <div class=\"aboutcard-contact\">\n            <svg t=\"1644588405938\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6826\" width=\"48\" height=\"48\"><path d=\"M478.24709287 882.98090484c-192.56217892 0-391.73747236-97.68201482-391.73747237-261.12875213 0-81.72278518 48.73656524-175.83742906 137.22883647-264.98786097 84.7101812-85.27848662 181.70602849-138.2569208 253.13396696-138.2569208 29.84361937 0 54.96808662 9.43480342 72.68941311 27.27515898 19.56160912 19.68647293 28.72101197 48.44949516 26.46762848 83.18030769l-0.63248775 9.9365926 9.47564672-3.05274531c33.65605014-10.83164444 64.6467829-16.31748376 92.14249573-16.31748376 56.57614587 0 84.54447407 23.17099031 98.04727066 42.61240342 11.89006952 17.07016752 23.2771829 47.29654701 10.07312592 94.34219943l-1.65473732 5.926947 5.72973219 2.23471226c69.59465755 27.11295271 109.51840456 78.82524444 109.51840457 141.88380627-0.03034074 130.70441026-172.72516923 276.35163533-420.48182337 276.35163532z m-1.37466894-603.22760569c-44.97781425 0-127.28057436 37.16974131-209.75137551 120.2076809-75.9277037 76.50067692-119.47250143 157.36925356-119.47250141 221.89117266 0 123.52299031 171.60256183 199.98282393 330.59737891 199.98282393 219.32271226 0 359.29505185-127.45445014 359.29505185-215.19987236 0-57.14911909-57.95548262-81.45438633-82.87690028-89.2519567-10.29484672-3.11225983-25.75695498-7.7847339-33.7750792-24.383453-5.37147806-11.1362188-5.25828376-24.01236239 0.36992364-38.26784273 10.1991567-25.83630769 11.4711339-46.2871339 3.6093812-57.59722849-7.34362621-10.56324559-24.33560798-16.38283305-47.85785071-16.38283305-29.39550997 0-67.4731396 9.23058689-107.23117949 25.9903453l-5.74140171 2.42025755h-0.79352707l-0.98023932 0.29873961c-6.44740741 1.98965242-12.54706325 3.00490029-18.12742564 3.00490028-12.89948262 0-24.30526723-5.51501311-31.32098005-15.13419488-4.3177208-5.90944274-10.64609915-18.6945641-4.49859829-37.92825982 10.08596239-32.66297436 9.3029379-58.9824-2.09701197-70.45470086-6.09965585-6.09382108-15.96389744-9.19557835-29.34883191-9.19557834z\" fill=\"#2C2C2C\" p-id=\"6827\"></path><path d=\"M444.50702222 793.67526838c-115.49903133 0-205.12674644-59.03024502-213.11452992-140.36560228-8.89683875-90.58344843 85.40335043-171.64340513 214.68524673-184.52538348a339.12896183 339.12896183 0 0 1 33.41099031-1.67924331c115.47569231 0 205.0917379 59.01974245 213.06201709 140.35393277 8.866498 90.61378918-85.43369117 171.67374587-214.66890939 184.55572422a342.33691168 342.33691168 0 0 1-33.37481482 1.66057208z m34.97003761-272.19378689c-9.32627692 0-18.74824388 0.47845014-28.01500628 1.39217321-97.33543021 9.70903704-171.78227236 65.83707351-165.96268489 125.10070884 5.12058348 52.06471111 73.47827236 91.32562963 159.01348831 91.32562962 9.27843191 0 18.6945641-0.47845014 27.99166725-1.39917492 97.30625641-9.69736752 171.75193162-65.84174131 165.93234415-125.15438861-5.08440798-52.02270085-73.44209687-91.26494815-158.95980854-91.26494814z\" fill=\"#2C2C2C\" p-id=\"6828\"></path><path d=\"M425.61407635 702.86426439c-7.35412877 0-14.51804444-1.12260741-21.28753049-3.31530941-15.41543021-5.01905869-27.01842963-15.12252535-32.67581082-28.47595213-5.41465527-12.78045356-4.79267008-27.19113846 1.7562621-40.5865755 11.17239431-22.82440569 37.1627396-38.16165014 64.67712365-38.16165014 5.96895726 0 11.83638974 0.74684901 17.44009117 2.21720797 16.15060969 4.19402393 29.09210256 14.24381082 35.52667351 27.56106211 6.02847179 12.48754872 6.01680228 26.87489458-0.02333904 40.52822792-10.40337322 23.69495157-37.29577208 40.23298918-65.41347008 40.23298918z m530.68756239-265.1967453a30.6091396 30.6091396 0 0 1-29.69424957-37.7602188 183.65016979 183.65016979 0 0 0 5.07857322-42.92981425c0-100.30415498-81.60492308-181.91374587-181.91607977-181.91374587-7.65870313 0-15.36641824 0.47845014-22.90025755 1.42134701a30.49477835 30.49477835 0 0 1-33.48917608-27.17246723l-0.00583475-0.04201026a30.48310883 30.48310883 0 0 1 26.0265208-33.48334131 246.97362963 246.97362963 0 0 1 30.36991453-1.87529117c134.02672136 0 243.05500627 109.03995441 243.05500627 243.06550883 0 19.37723077-2.28839202 38.65760456-6.79982678 57.29848888a30.50178005 30.50178005 0 0 1-29.67674531 23.39737893l-0.04784501-0.00583476z\" fill=\"#2C2C2C\" p-id=\"6829\"></path><path d=\"M849.42404558 398.17437721a27.21564444 27.21564444 0 0 1-26.77220285-31.88111681c0.80519658-4.61295954 1.14127864-9.38695841 1.00941311-14.1842963a70.10811624 70.10811624 0 0 0-21.99353619-49.01780056 69.51647179 69.51647179 0 0 0-48.02005697-19.11933448c-0.72234303 0-3.04574359 0.04784502-3.04574359 0.04784501a26.94607864 26.94607864 0 0 1-27.04877038-26.23540513 27.1082849 27.1082849 0 0 1 7.39730599-19.60945412 26.96474986 26.96474986 0 0 1 18.97579942-8.51407864 124.01894473 124.01894473 0 0 1 89.07224616 33.92561595 123.65485585 123.65485585 0 0 1 38.9913527 86.96823249 125.57799202 125.57799202 0 0 1-1.79827235 25.130302 27.16196467 27.16196467 0 0 1-26.75469859 22.5011601h-0.0361755v-0.01166951h0.02333904z\" fill=\"#2C2C2C\" p-id=\"6830\"></path></svg>微博：@<?php echo Bsoptions('aboutme_weibo'); ?></div>\n<?php endif; ?>\n<?php if(!empty(Bsoptions('aboutme_weixin'))): ?>\n<div class=\"aboutcard-contact\">\n            <svg t=\"1644588485012\" class=\"icon\" viewBox=\"0 0 1025 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1876\" width=\"48\" height=\"48\"><path d=\"M498.816 345.056c26.336 0 43.936-17.632 43.936-43.904 0-26.56-17.568-43.744-43.936-43.744s-52.832 17.184-52.832 43.744C446.016 327.424 472.48 345.056 498.816 345.056zM253.088 257.408c-26.336 0-52.96 17.184-52.96 43.744 0 26.272 26.624 43.904 52.96 43.904 26.24 0 43.808-17.632 43.808-43.904C296.864 274.592 279.328 257.408 253.088 257.408zM1024 626.112c0-138.88-128.832-257.216-286.976-269.536 0.224-1.728 0.32-3.52-0.064-5.312-31.712-147.84-190.688-259.296-369.824-259.296C164.704 91.968 0 233.12 0 406.624c0 93.088 47.52 176.96 137.568 243.104l-31.392 94.368c-2.016 6.144-0.192 12.896 4.704 17.152 2.976 2.56 6.72 3.904 10.496 3.904 2.432 0 4.896-0.576 7.168-1.696L246.4 704.48l14.528 2.944c36.288 7.456 67.616 13.92 106.208 13.92 11.36 0 22.88-0.512 34.176-1.472 4.576-0.384 8.448-2.688 11.072-6.016 42.496 106.336 159.616 183.104 297.44 183.104 35.296 0 71.04-8.512 103.104-16.544l90.848 49.664c2.4 1.312 5.056 1.984 7.68 1.984 3.584 0 7.168-1.216 10.048-3.552 5.056-4.096 7.136-10.848 5.248-17.024l-23.2-77.152C981.344 772.864 1024 699.328 1024 626.112zM398.592 687.968c-10.4 0.896-20.96 1.344-31.424 1.344-35.328 0-65.216-6.112-99.776-13.248L247.296 672c-3.456-0.736-7.104-0.256-10.272 1.376l-88.288 44.192 22.944-68.928c2.24-6.752-0.224-14.112-6.016-18.176C76.96 568.64 32 493.312 32 406.624c0-155.84 150.336-282.656 335.136-282.656 163.36 0 308 99.392 337.856 231.584-171.296 2.24-309.888 122.656-309.888 270.56 0 21.504 3.264 42.336 8.768 62.432C402.208 688.128 400.448 687.808 398.592 687.968zM875.456 815.552c-5.344 4.032-7.616 10.976-5.696 17.376l15.136 50.336-62.112-33.984c-2.368-1.312-5.024-1.984-7.68-1.984-1.312 0-2.624 0.16-3.904 0.512-33.312 8.416-67.776 17.088-101.344 17.088-155.904 0-282.72-107.136-282.72-238.816 0-131.68 126.816-238.784 282.72-238.784 152.928 0 282.144 109.344 282.144 238.784C992 691.744 950.624 759.04 875.456 815.552zM612.992 511.968c-17.568 0-35.136 17.696-35.136 35.232 0 17.664 17.568 35.104 35.136 35.104 26.4 0 43.84-17.44 43.84-35.104C656.832 529.632 639.392 511.968 612.992 511.968zM806.016 511.968c-17.312 0-34.88 17.696-34.88 35.232 0 17.664 17.568 35.104 34.88 35.104 26.304 0 44.064-17.44 44.064-35.104C850.08 529.632 832.352 511.968 806.016 511.968z\" p-id=\"1877\"></path></svg>微信：<?php echo Bsoptions('aboutme_weixin'); ?></div>\n<?php endif; ?>\n<?php if(!empty(Bsoptions('aboutme_mail'))): ?>\n          <div class=\"aboutcard-contact\">\n            <svg t=\"1644589187567\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1197\" width=\"48\" height=\"48\"><path d=\"M958.359001 286.941198c0-64.308655-52.132334-116.440989-116.440989-116.440989L181.453678 170.500209c-64.308655 0-116.440989 52.132334-116.440989 116.440989l0 448.63995c0 64.308655 52.132334 116.440989 116.440989 116.440989l660.464333 0c64.308655 0 116.440989-52.132334 116.440989-116.440989L958.359001 286.941198zM843.814198 212.455763c12.059664 0 23.444968 3.465938 33.519418 8.598842L530.749016 549.347606c-1.227967 1.161453-1.156336 0.916882-1.752924 1.868557-1.426489 1.067308-6.055926 3.922333-15.449877 3.922333-9.397021 0-14.025435-2.75474-15.4509-3.818979-0.676405-1.077541-0.662079-0.716314-1.995447-1.940189l-353.122503-324.412624c11.609409-7.557116 25.445532-12.509918 40.300868-12.509918L843.814198 212.456786zM916.403446 736.484727c0 40.857547-31.730679 73.582879-72.589248 73.582879L183.27721 810.067606c-40.85857 0-75.28566-32.725332-75.28566-73.582879L107.99155 287.657512c0-10.630105 2.860141-20.735253 6.909363-29.882588l351.486236 322.096882c4.91187 5.302773 19.479657 17.676591 47.009663 17.676591 27.799136 0 42.303478-12.618389 47.076178-17.830087l346.800517-328.899822c6.251378 10.860349 9.129938 23.433712 9.129938 36.838L916.403446 736.484727z\" p-id=\"1198\"></path></svg>\n            <a href=\"mailto:<?php echo Bsoptions('aboutme_mail'); ?>\">邮箱：<?php echo Bsoptions('aboutme_mail'); ?></a>\n          </div>\n          <?php endif; ?>\n        </div>\n      </div>\n    </div>\n    <div class=\"aboutcard-buttons\">\n      <button data-section=\"#about\" class=\"is-active\">关于</button>\n      <button data-section=\"#experience\">历程</button>\n      <?php if(Bsoptions('aboutme_ghOpen') == true) :?>\n      <button data-section=\"#plan\">规划</button>\n      <?php endif;?>\n<button data-section=\"#contact\">联系</button>\n    </div>\n  </div>\n</div>\n<!-- Tab切换 -->\n<script>\nconst buttons = document.querySelectorAll(\".aboutcard-buttons button\");\nconst sections = document.querySelectorAll(\".aboutcard-section\");\nconst card = document.querySelector(\".aboutcard\");\nconst handleButtonClick = e => {\n  const targetSection = e.target.getAttribute(\"data-section\");\n  const section = document.querySelector(targetSection);\n  targetSection !== \"#about\" ?\n  card.classList.add(\"is-active\") :\n  card.classList.remove(\"is-active\");\n  card.setAttribute(\"data-state\", targetSection);\n  sections.forEach(s => s.classList.remove(\"is-active\"));\n  buttons.forEach(b => b.classList.remove(\"is-active\"));\n  e.target.classList.add(\"is-active\");\n  section.classList.add(\"is-active\");\n};\n\nbuttons.forEach(btn => {\n  btn.addEventListener(\"click\", handleButtonClick);\n});\n    </script>\n</div></div>\n\n</div>\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "acg.php",
    "content": "<?php\n    /**\n    * 我的追番\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit;?>\n<?php $this->need('compoment/head.php');?>\n<link rel=\"stylesheet\" href=\"<?php AssetsDir();?>assets/vendors/bangumi/bangumi.css?v=<?php echo themeVersion(); ?>\">\n<script>\n    window.BangumiAPI = \"<?php echo Helper::options()->siteUrl.'index.php/getBangumi';?>\";\n    window.BangumiPageSize = 8;\n</script>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n              <div class=\"page-card\">\n                <h2><i class=\"tv icon\"></i> <?php $this->title() ?></h2>   \n\n\n <?php if(!empty(Bsoptions('bangumi_note'))): ?>     \n    <div class=\"ui segment\">\n  <i class=\"red heart icon\"></i>\n  <?php echo Bsoptions('bangumi_note');?>\n</div>\n<?php endif; ?>\n\n<section>\n    <?php if(Bsoptions('acg_choose') == '1'):?>\n    <div data-status=\"acg\" class=\"bangumi-movie-list bangumiboard-list\"></div>  \n    <?php endif;?>\n    <?php if(Bsoptions('acg_choose') == '2'):?>\n  <div class=\"tab\">\n\n\t<uls class=\"tabs\">\n\t\t<li><a>在看</a></li>\n\t\t<li><a>想看</a></li>\n\t\t<li><a>看过</a></li>\n\t\t<li><a>搁置</a></li>\n\t\t<li><a>抛弃</a></li>\n\t</uls>\n\n\t<div class=\"tab_content\">\n\n\t\t<div class=\"tabs_item\">\n\t\t<div data-status=\"watching\" class=\"bangumi-movie-list bangumiboard-list\"></div>  \n\t\t</div>\n\n\t\t<div class=\"tabs_item\">\n\t\t\t<div data-status=\"wish\" class=\"bangumi-movie-list bangumiboard-list\"></div>  \n\t\t</div>\n\n\t\t<div class=\"tabs_item\">\n\t\t\t<div data-status=\"watched\" class=\"bangumi-movie-list bangumiboard-list\"></div>  \n\t\t</div>\n\t\t\n\t\t<div class=\"tabs_item\">\n\t\t\t<div data-status=\"on_hold\" class=\"bangumi-movie-list bangumiboard-list\"></div>  \n\t\t</div>\n\t\t\n\t\t<div class=\"tabs_item\">\n\t\t\t<div data-status=\"dropped\" class=\"bangumi-movie-list bangumiboard-list\"></div>  \n\t\t</div>\n\t\t\n\t</div>\n</div>\n<?php endif;?>\n</section>\n</div> \n\n       </div> \n<script src=\"<?php AssetsDir();?>assets/vendors/bangumi/bangumi.js?v=<?php echo themeVersion(); ?>\"></script>\n</div>\n <script>\n$(document).ready(function () {\n  (function ($) {\n    $('.tab uls.tabs').addClass('active').find('> li:eq(0)').addClass('current');\n\n    $('.tab uls.tabs li a').click(function (g) {\n      var tab = $(this).closest('.tab'),\n      index = $(this).closest('li').index();\n\n      tab.find('uls.tabs > li').removeClass('current');\n      $(this).closest('li').addClass('current');\n\n      tab.find('.tab_content').find('div.tabs_item').not('div.tabs_item:eq(' + index + ')').slideUp();\n      tab.find('.tab_content').find('div.tabs_item:eq(' + index + ')').slideDown();\n\n      g.preventDefault();\n    });\n  })(jQuery);\n\n});\n    </script>\n\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "archive.php",
    "content": "<?php\nif (!defined('__TYPECHO_ROOT_DIR__')) exit;?>\n<?php $this->need('compoment/head.php');?>\n<?php \n$category = array();\n$category['title'] = $this->getArchiveTitle();\nif(empty(CategoryEncrypt(categeid($this->getArchiveSlug()))['Cate_Encrypt_Password'])){\n$category['md5_password'] = md5Encode('654321');//初始密码，即加密密码没填的情况下的默认密码，可改动    \n}\nelse{\n$category['md5_password'] = md5Encode(CategoryEncrypt(categeid($this->getArchiveSlug()))['Cate_Encrypt_Password']);\n}\n$category['type'] = \"category\";\n$category['category'] = $this->getArchiveSlug();\n$_POST['data'] = $category;\n$password = Typecho_Cookie::get('category_'.$this->getArchiveSlug());\nif ((!empty($password) && $password == $category['md5_password']) || $this->user->hasLogin()){\n    $cookie = true;\n}\n\n?>\n<?php if(Bsoptions('Cate_Encrypt_open') == true && !empty(CategoryEncrypt(categeid($this->getArchiveSlug()))) && !$cookie):?>\n<?php $this->need('modules/lock.php'); ?>\n<?php else:?>\n\n<?php if(!empty(CategoryAlbum(categeid($this->getArchiveSlug()))) && $this->is('category')):?>\n<?php $this->need('pages/album.php'); ?>\n<?php elseif($this->is('author')):?>\n<?php $this->need('pages/author.php'); ?>\n<?php else:?>\n\n\n\n<?php $this->need('pages/archive.php'); ?>\n\n<?php endif; ?>\n\n<?php endif; ?>\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "archived.php",
    "content": "<?php\n    /**\n    * 我的归档\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n<?php $this->need('compoment/head.php');?>\n\n\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n              <div class=\"page-card\">\n                    <h2><i class=\"list icon\"></i> <?php $this->title() ?></h2>\n    <div class=\"chart-category-title\">分类统计</div>\n    <div class=\"chart-container\">\n        \n        <canvas id=\"categoryChart\"></canvas>\n    </div>\n<?php\n$categories = $this->widget('Widget_Metas_Category_List');\n$categoryData = [];\nwhile ($categories->next()) {\n    $categoryData[] = [\n        'name' => $categories->name,\n        'count' => $categories->count,\n        'color' => sprintf('#%06X', mt_rand(0, 0xFFFFFF))\n    ];\n}\n?>\n\n<div class=\"archive-container\">\n    <div class=\"archive-category-title\">文章归档</div>\n    <?php\n    $currentYear = date('Y');\n    $years = [];\n    $page = $this->request->get('page', 1);\n    $pageSize = 5; \n    $archives = $this->widget('Widget_Contents_Post_Recent', 'pageSize=10000');\n    while ($archives->next()) {\n        $year = date('Y', $archives->created);\n        $years[$year][] = [\n            'title' => $archives->title,\n            'permalink' => $archives->permalink,\n            'date' => date('Y-m-d', $archives->created)\n        ];\n    }\n\n    krsort($years);\n    $yearKeys = array_keys($years);\n    $totalYears = count($yearKeys);\n    $currentPageYears = array_slice($yearKeys, ($page-1)*$pageSize, $pageSize);\n    \n    foreach ($currentPageYears as $year):\n        $isCurrentYear = $year == $currentYear;\n    ?>\n    <div class=\"year-group\" data-year=\"<?php echo $year; ?>\">\n        <div class=\"year-title <?php echo $isCurrentYear ? '' : 'collapsed'; ?>\" onclick=\"isCollapsed(this);\">\n            <span><?php echo $year; ?>年 <i class=\"pen icon\"></i>共 <?php echo count($years[$year]);?> 篇文章</span>\n        </div>\n        <div class=\"post-list\" style=\"<?php echo $isCurrentYear ? '' : 'display: none;' ?>\">\n            <?php foreach ($years[$year] as $post): ?>\n            <a href=\"<?php echo $post['permalink']; ?>\" class=\"post-item\" >\n                <span class=\"post-title\"><?php echo $post['title']; ?></span>\n                <span class=\"post-date\"><?php echo $post['date']; ?></span>\n            </a>\n            <?php endforeach; ?>\n        </div>\n    </div>\n    <?php endforeach; ?>\n    \n    <?php if ($page * $pageSize < $totalYears): ?>\n    <div class=\"archived-load-more\">\n        <button class=\"archived-load-btn\" onclick=\"loadMorePosts()\">加载更多年份</button>\n    </div>\n    <?php endif; ?>\n</div>\n\n<script>\nfunction isCollapsed(element){\n    const isCollapsed = $(element).hasClass('collapsed');\n    $(element).toggleClass('collapsed')\n           .next('.post-list').slideToggle(100);\n}\n\nlet currentPage = <?php echo $page; ?>;\nconst totalPages = Math.ceil(<?php echo $totalYears; ?> / <?php echo $pageSize; ?>);\n\nfunction loadMorePosts() {\n    const $btn = $('.archived-load-btn');\n    $btn.prop('disabled', true).text('加载中...');\n\n    $.get(window.location.href, { page: currentPage + 1 }, function(data) {\n        const $newContent = $(data).find('.year-group');\n        const $newButton = $(data).find('.archived-load-more');\n        $('.archived-load-more').before($newContent);\n        if ($newButton.length) {\n            $('.archived-load-more').replaceWith($newButton);\n        } else {\n            $('.archived-load-more').remove();\n        }\n        \n        currentPage++;\n        $btn.prop('disabled', false);\n    }).fail(function() {\n        $btn.prop('disabled', false).text('加载失败，点击重试');\n    });\n}\n\nfunction loadChart(){\n  $.getScript(\"<?php AssetsDir();?>assets/js/chart.umd.min.js\",function(){\n        var ctxs = $('#categoryChart');\n   if(ctxs){\n       var ctx = ctxs.get(0).getContext('2d');\n   }\n    new Chart(ctx, {\n        type: 'doughnut',\n        data: {\n            labels: <?= json_encode(array_column($categoryData, 'name')) ?>,\n            datasets: [{\n                data: <?= json_encode(array_column($categoryData, 'count')) ?>,\n                backgroundColor: <?= json_encode(array_column($categoryData, 'color')) ?>,\n                borderWidth: 1,\n                hoverOffset: 8\n            }]\n        },\n        options: {\n            responsive: true,\n            maintainAspectRatio: false,\n            plugins: {\n                legend: {\n                    position: 'bottom',\n                    labels: {\n                        boxWidth: 16,\n                        padding: 12,\n                        font: {\n                            size: 14\n                        }\n                    }\n                },\n                tooltip: {\n                    displayColors: false,\n                    bodyFont: { size: 14 }\n                }\n            },\n            layout: {\n                padding: {\n                    top: 20,\n                    bottom: 20\n                }\n            }\n        }\n    });\n    });   \n}\n$(document).ready(function() {\n   loadChart();\n\n});\n if (typeof pjax !== 'undefined') {\n    document.addEventListener('pjax:complete', function(){\n        loadChart();\n        });\n  }\n</script>\n\n\n</div></div>\n\n</div>\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "assets/check.json",
    "content": "{\r\n\t\t\"code\": \"1\",\r\n\t\t\"message\": \"success\"\r\n\t}"
  },
  {
    "path": "assets/css/copycode.css",
    "content": ".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}"
  },
  {
    "path": "assets/css/donate.css",
    "content": "#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)}}"
  },
  {
    "path": "assets/css/lxgw/lxgwwenkaigbscreen.css",
    "content": "/* LXGW WenKai Screen [4] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-4.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [5] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-5.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [6] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-6.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [21] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-21.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [22] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-22.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [23] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-23.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [24] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-24.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [25] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-25.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [26] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-26.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [27] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-27.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [28] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-28.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [29] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-29.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [30] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-30.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [31] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-31.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [32] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-32.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [33] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-33.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [34] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-34.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [35] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-35.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [36] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-36.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [37] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-37.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [38] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-38.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [39] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-39.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [40] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-40.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [41] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-41.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [42] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-42.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [43] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-43.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [44] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-44.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [45] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-45.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [46] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-46.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [47] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-47.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [48] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-48.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [49] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-49.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [50] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-50.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [51] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-51.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [52] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-52.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [53] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-53.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [54] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-54.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [55] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-55.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [56] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-56.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [57] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-57.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [58] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-58.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [59] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-59.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [60] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-60.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [61] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-61.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [62] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-62.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [63] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-63.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [64] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-64.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [65] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-65.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [66] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-66.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [67] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-67.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [68] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-68.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [69] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-69.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [70] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-70.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [71] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-71.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [72] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-72.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [73] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-73.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [74] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-74.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [75] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-75.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [76] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-76.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [77] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-77.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [78] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-78.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [79] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-79.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [80] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-80.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [81] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-81.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [82] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-82.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [83] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-83.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [84] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-84.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [85] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-85.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [86] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-86.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [87] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-87.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [88] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-88.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [89] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-89.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [90] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-90.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [91] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-91.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [97] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-97.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [98] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-98.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [99] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-99.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [100] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-100.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [101] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-101.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [102] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-102.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [103] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-103.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [104] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-104.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [105] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-105.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [106] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-106.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [107] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-107.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [108] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-108.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [109] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-109.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [110] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-110.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [111] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-111.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [112] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-112.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [113] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-113.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [114] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-114.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [115] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-115.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [116] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-116.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [117] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-117.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [118] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-118.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [119] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreen-subset-119.woff2') format('woff2');\n  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\n}\n"
  },
  {
    "path": "assets/css/lxgw/lxgwwenkaigbscreenr.css",
    "content": "/* LXGW WenKai Screen R [4] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-4.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [5] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-5.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [6] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-6.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [21] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-21.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [22] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-22.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [23] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-23.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [24] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-24.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [25] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-25.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [26] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-26.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [27] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-27.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [28] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-28.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [29] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-29.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [30] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-30.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [31] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-31.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [32] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-32.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [33] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-33.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [34] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-34.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [35] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-35.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [36] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-36.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [37] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-37.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [38] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-38.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [39] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-39.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [40] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-40.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [41] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-41.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [42] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-42.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [43] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-43.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [44] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-44.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [45] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-45.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [46] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-46.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [47] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-47.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [48] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-48.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [49] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-49.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [50] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-50.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [51] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-51.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [52] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-52.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [53] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-53.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [54] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-54.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [55] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-55.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [56] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-56.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [57] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-57.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [58] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-58.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [59] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-59.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [60] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-60.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [61] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-61.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [62] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-62.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [63] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-63.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [64] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-64.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [65] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-65.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [66] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-66.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [67] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-67.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [68] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-68.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [69] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-69.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [70] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-70.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [71] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-71.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [72] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-72.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [73] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-73.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [74] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-74.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [75] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-75.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [76] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-76.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [77] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-77.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [78] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-78.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [79] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-79.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [80] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-80.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [81] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-81.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [82] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-82.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [83] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-83.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [84] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-84.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [85] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-85.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [86] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-86.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [87] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-87.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [88] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-88.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [89] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-89.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [90] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-90.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [91] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-91.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [97] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-97.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [98] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-98.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [99] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-99.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [100] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-100.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [101] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-101.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [102] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-102.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [103] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-103.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [104] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-104.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [105] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-105.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [106] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-106.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [107] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-107.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [108] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-108.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [109] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-109.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [110] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-110.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [111] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-111.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [112] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-112.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [113] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-113.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [114] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-114.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [115] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-115.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [116] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-116.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [117] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-117.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [118] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-118.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [119] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaigbscreenr-subset-119.woff2') format('woff2');\n  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\n}\n"
  },
  {
    "path": "assets/css/lxgw/lxgwwenkaiscreen.css",
    "content": "/* LXGW WenKai Screen [4] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-4.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [5] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-5.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [6] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-6.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [21] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-21.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [22] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-22.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [23] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-23.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [24] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-24.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [25] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-25.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [26] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-26.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [27] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-27.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [28] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-28.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [29] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-29.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [30] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-30.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [31] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-31.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [32] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-32.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [33] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-33.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [34] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-34.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [35] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-35.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [36] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-36.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [37] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-37.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [38] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-38.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [39] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-39.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [40] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-40.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [41] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-41.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [42] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-42.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [43] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-43.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [44] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-44.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [45] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-45.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [46] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-46.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [47] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-47.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [48] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-48.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [49] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-49.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [50] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-50.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [51] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-51.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [52] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-52.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [53] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-53.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [54] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-54.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [55] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-55.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [56] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-56.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [57] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-57.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [58] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-58.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [59] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-59.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [60] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-60.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [61] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-61.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [62] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-62.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [63] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-63.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [64] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-64.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [65] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-65.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [66] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-66.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [67] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-67.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [68] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-68.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [69] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-69.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [70] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-70.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [71] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-71.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [72] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-72.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [73] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-73.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [74] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-74.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [75] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-75.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [76] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-76.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [77] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-77.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [78] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-78.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [79] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-79.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [80] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-80.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [81] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-81.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [82] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-82.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [83] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-83.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [84] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-84.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [85] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-85.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [86] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-86.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [87] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-87.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [88] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-88.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [89] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-89.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [90] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-90.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [91] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-91.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [97] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-97.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [98] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-98.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [99] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-99.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [100] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-100.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [101] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-101.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [102] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-102.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [103] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-103.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [104] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-104.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [105] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-105.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [106] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-106.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [107] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-107.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [108] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-108.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [109] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-109.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [110] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-110.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [111] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-111.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [112] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-112.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [113] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-113.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [114] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-114.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [115] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-115.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [116] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-116.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [117] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-117.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [118] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-118.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen [119] */\n@font-face {\n  font-family: 'LXGW WenKai Screen';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreen-subset-119.woff2') format('woff2');\n  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\n}\n"
  },
  {
    "path": "assets/css/lxgw/lxgwwenkaiscreenr.css",
    "content": "/* LXGW WenKai Screen R [4] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-4.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [5] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-5.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [6] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-6.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [21] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-21.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [22] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-22.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [23] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-23.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [24] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-24.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [25] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-25.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [26] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-26.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [27] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-27.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [28] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-28.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [29] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-29.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [30] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-30.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [31] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-31.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [32] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-32.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [33] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-33.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [34] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-34.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [35] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-35.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [36] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-36.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [37] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-37.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [38] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-38.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [39] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-39.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [40] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-40.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [41] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-41.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [42] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-42.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [43] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-43.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [44] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-44.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [45] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-45.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [46] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-46.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [47] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-47.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [48] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-48.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [49] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-49.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [50] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-50.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [51] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-51.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [52] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-52.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [53] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-53.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [54] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-54.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [55] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-55.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [56] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-56.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [57] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-57.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [58] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-58.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [59] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-59.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [60] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-60.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [61] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-61.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [62] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-62.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [63] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-63.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [64] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-64.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [65] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-65.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [66] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-66.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [67] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-67.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [68] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-68.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [69] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-69.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [70] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-70.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [71] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-71.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [72] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-72.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [73] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-73.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [74] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-74.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [75] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-75.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [76] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-76.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [77] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-77.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [78] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-78.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [79] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-79.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [80] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-80.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [81] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-81.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [82] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-82.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [83] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-83.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [84] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-84.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [85] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-85.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [86] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-86.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [87] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-87.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [88] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-88.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [89] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-89.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [90] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-90.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [91] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-91.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [97] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-97.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [98] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-98.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [99] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-99.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [100] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-100.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [101] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-101.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [102] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-102.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [103] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-103.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [104] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-104.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [105] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-105.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [106] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-106.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [107] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-107.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [108] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-108.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [109] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-109.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [110] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-110.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [111] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-111.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [112] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-112.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [113] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-113.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [114] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-114.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [115] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-115.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [116] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-116.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [117] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-117.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [118] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-118.woff2') format('woff2');\n  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\n}\n/* LXGW WenKai Screen R [119] */\n@font-face {\n  font-family: 'LXGW WenKai Screen R';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url('./files/lxgwwenkaiscreenr-subset-119.woff2') format('woff2');\n  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\n}\n"
  },
  {
    "path": "assets/css/lxgw/style.css",
    "content": "@import url('./lxgwwenkaigbscreen.css');\n@import url('./lxgwwenkaigbscreenr.css');\n@import url('./lxgwwenkaiscreen.css');\n@import url('./lxgwwenkaiscreenr.css');\n"
  },
  {
    "path": "assets/css/modules/steam/style.css",
    "content": ".steamContainer {\n  \n  border-radius: 4px;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n}\n\n.userProf {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  justify-content: space-between;\n  align-items: center;\n  position: relative;\n  margin: 0 0 48px 0;\n}\n\n.leftSide {\n  display: flex;\n  flex-direction: row;\n}\n\n\n.avatar_b {\n  height: 80px;\n  width: 80px;\n  margin: 0 18px 0 0;\n  position: relative;\n  border-radius: 30em;\n}\n.avatar_b .wrapp {\n  border-radius: 10px;\n\n  position: relative;\n}\n.avatar_b img {\n  display: block;\n  width: 100%;\n  border-radius:50%;\n}\n\n.avatar_b span {\n  position: absolute;\n  top: 6px;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  height: 50px;\n  border-radius: 30em;\n  width: 50px;\n  background-size: cover !important;\n  filter: blur(12px);\n  opacity: 0.6;\n}\n\n.userTitle {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n.userTitle h1 {\n  font-size: 24px!important;\n  margin: 0 0 15px 0;\n  font-weight: 500;\n}\n.userTitle h1:hover {\n  cursor: pointer;\n}\n.userTitle h1 a {\n  color: #000;\n  text-decoration: none;\n}\n\n.userTitle h1:active {\n  color: #7A92A5;\n}\n.userTitle h1 img {\n  margin: 0 0 0 6px;\n  opacity: 0;\n  height: 14px;\n  transform: translateX(2px);\n}\n.userTitle h5 {\n  font-size: 14px;\n  font-weight: 300;\n  color: #577083;\n  opacity: 0;\n}\n\n.userTitle h1:hover > a img {\n  opacity: 1;\n  transform: translateX(0px);\n}\n\n.userDesc {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  flex-wrap: wrap;\n\n}\n.userDesc .userlevel {\n  padding: 3px 6px;\n  border: 1px solid #577083;\n  border-radius: 2px;\n  font-size: 14px!important;\n  color: #577083;\n  font-weight: 400;\n  margin-top:-5px;\n}\n.userDesc .userhave {\n  padding: 3px 6px;\n  border: 1px solid #577083;\n  border-radius: 2px;\n  font-size: 14px!important;\n  color: #577083;\n  font-weight: 400;\n  margin-top:-5px;\n  margin-left:5px;\n}\n\n.avatar_b badge {\n  position: absolute;\n  height: 18px;\n  width: 18px;\n  background-color: green;\n  border-radius: 30em;\n  top: 60px;\n  display: flex;\n  align-items: center;\n  align-content: center;\n  justify-content: center;\n  right: 0;\n  box-shadow: 0 0 0 2px white;\n  z-index:10;\n}\n#honeynavbar{\n    z-index:100;\n}\n\n.userGames {\n \n  margin:-20px 20px 20px 20px;\n}\n\n.gamesTitle {\n  margin: 0 0 10px 0;\n}\n.gamesTitle h3 {\n  text-transform: uppercase;\n  font-weight: 500;\n  letter-spacing: 1.4px;\n}\n\nsection{\n    margin-top:30px;\n}\n.steamgames-container {\n  --grid: 180px;\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(var(--grid), 1fr));\n  grid-gap: 25px;\n}\n@media (max-width: 780px) {\n  .steamgames-container {\n    --grid: 170px;\n  }\n}\n@media (max-width: 450px) {\n  .steamgames-container {\n    --grid: 130px;\n  }\n}\n\n.steamgames-card {\n  background: var(--foreground);\n  border-radius: 5px;\n  box-shadow: 0 0 20px 0px rgba(0, 0, 0, 0.1);\n  border-radius:8px;\n}\n.steamgames-card:hover .cta {\n  opacity: 1;\n}\n.steamgames-card .image-wrapper {\n  position: relative;\n  width: 100%;\n}\n.steamgames-card img {\n  display: block;\n  width: 1200px;\n  border-radius: 10px 10px 0 0;\n}\n\n\n\n\n.steamgames-card .cta {\n  width: 40px;\n  height: 40px;\n  border: none;\n  outline: none;\n  position: absolute;\n  cursor: pointer;\n  bottom: 16px;\n  right: 16px;\n  background: rgba(0, 0, 0, 0.2);\n  border-radius: 50%;\n  display: flex;\n  opacity: 0;\n  transition: 0.3s;\n}\n.steamgames-card .cta:hover {\n  background: rgba(0, 0, 0, 0.5);\n}\n.steamgames-card .cta svg {\n  display: block;\n  fill: #fff;\n  width: 20px;\n  margin: auto;\n}\n.steamgames-card .details {\n  padding: 16px;\n  margin-top:-5px;\n}\n.steamgames-card a {\n  display: block;\n  text-decoration: none;\n  line-height: 1.8;\n  color: inherit;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  text-decoration: none!important;\n}\n.steamgames-card a:hover {\n  text-decoration: underline;\n}\n.steamgames-card a.title {\n  font-weight: bold;\n}\n.steamgames-card a.sub-title {\n  font-size: 14px;\n}\n.positioning {\n  margin: 50px auto;\n  position: relative;\n}\n\n.loading-sticks {\n  height: 5rem;\n  width: 5rem;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n.loading-sticks .loading {\n  flex: 0 0 20%;\n  height: 30%;\n  -webkit-animation: pulse 1s ease infinite;\n          animation: pulse 1s ease infinite;\n  background-color: #000;\n  -webkit-animation-delay: 0;\n          animation-delay: 0;\n}\n.loading-sticks .loading:nth-child(2) {\n  -webkit-animation-delay: 0.3s;\n          animation-delay: 0.3s;\n}\n.loading-sticks .loading:nth-child(3) {\n  -webkit-animation-delay: 0.6s;\n          animation-delay: 0.6s;\n}\n\n@-webkit-keyframes pulse {\n  0% {\n    height: 30%;\n  }\n  50% {\n    height: 100%;\n  }\n  100% {\n    height: 30%;\n  }\n}\n\n@keyframes pulse {\n  0% {\n    height: 30%;\n  }\n  50% {\n    height: 100%;\n  }\n  100% {\n    height: 30%;\n  }\n}"
  },
  {
    "path": "assets/css/modules/timeline_custom.css",
    "content": "/**\n*\n* BearSimple主题自定义样式 - 时光机微语\n* Update:18/01/2023\n*\n**/\n\n\n/* 时光机 PC端树状样式 */\n@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;}}"
  },
  {
    "path": "assets/images/loaders/index.html",
    "content": "<!doctype html>\r\n<head>\r\n    <meta charset=\"utf-8\"/>\r\n    <title>加载动画预览</title>\r\n    <style>\r\n        ul {\r\n            background: #fff;\r\n            width: 720px;\r\n            margin: auto;\r\n            margin-top: 60px;\r\n            list-style: none;\r\n            padding: 0;\r\n            -moz-box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.37);\r\n            box-shadow:      0px 0px 4px 0px rgba(0,0,0,0.37);\r\n        }\r\n        ul li {\r\n            width: 180px;\r\n            height: 180px;\r\n            line-height: 176px;\r\n            text-align: center;\r\n            float: left;\r\n            background-repeat: no-repeat;\r\n            background-position: center;\r\n            position: relative;\r\n        }\r\n        ul li img {\r\n            vertical-align: middle;\r\n        }\r\n        ul li div {\r\n            position: absolute;\r\n            left: 10px;\r\n            top: 12px;\r\n            font-size: 16px;\r\n            line-height: 16px;\r\n            color: #fff;\r\n        }\r\n        ul li div:before {\r\n            content: \"懒加载动画 \";\r\n        }\r\n        #close_this_page{\r\n            cursor: pointer;\r\n            font-size: 20px;\r\n            color: #fff;\r\n        }\r\n        li:nth-child(1) {\r\n            background-color: #1ABC9C;\r\n        }\r\n        li:nth-child(2) {\r\n            background-color: #34495E;\r\n        }\r\n        li:nth-child(3) {\r\n            background-color: #F39C12;\r\n        }\r\n        li:nth-child(4) {\r\n            background-color: #9B59B6;\r\n        }\r\n        li:nth-child(5) {\r\n            background-color: #3498DB;\r\n        }\r\n        li:nth-child(6) {\r\n            background-color: #E74C3C;\r\n        }\r\n        li:nth-child(7) {\r\n            background-color: #2ECC71;\r\n        }\r\n        li:nth-child(8) {\r\n            background-color: #2C3E50;\r\n        }\r\n        li:nth-child(9) {\r\n            background-color: #F1C40F;\r\n        }\r\n        li:nth-child(10) {\r\n            background-color: #8E44AD;\r\n        }\r\n        li:nth-child(11) {\r\n            background-color: #2980B9;\r\n        }\r\n        li:nth-child(12) {\r\n            background-color: #E74C3C;\r\n        }\r\n        .actions {\r\n            margin: auto;\r\n            margin-top: 45px;\r\n            width: 325px;\r\n        }\r\n        .actions a {\r\n            width: 150px;\r\n            height: 46px;\r\n            background-repeat: no-repeat;\r\n            background-size: 150px 46px;\r\n            display: block;\r\n            text-indent: -9999px;\r\n            float: left;\r\n        }\r\n\r\n\r\n        .attr {\r\n            color: #fff;\r\n            text-align: center;\r\n            font-size: 0.875rem;\r\n            margin-top: 20px;\r\n        }\r\n\r\n    </style>\r\n</head>\r\n\r\n<body>\r\n    <ul>\r\n        <li>\r\n            <img src=\"svg-loaders/tail-spin.svg\" width=\"50\" alt=\"\">\r\n            <div>#1</div>\r\n        </li>\r\n        <li>\r\n            <img src=\"svg-loaders/puff.svg\" width=\"50\" alt=\"\">\r\n            <div>#2</div>\r\n        </li>\r\n        <li>\r\n            <img src=\"svg-loaders/bars.svg\" width=\"40\" alt=\"\">\r\n            <div>#3</div>\r\n        </li>\r\n        <li>\r\n            <img src=\"svg-loaders/oval.svg\" width=\"50\" alt=\"\">\r\n            <div>#4</div>\r\n        </li>\r\n        <li>\r\n            <img src=\"svg-loaders/rings.svg\" width=\"60\" alt=\"\">\r\n            <div>#5</div>\r\n        </li>\r\n        <li>\r\n            <img src=\"svg-loaders/three-dots.svg\" width=\"60\" alt=\"\">\r\n            <div>#6</div>\r\n        </li>\r\n        <li>\r\n            <img src=\"svg-loaders/audio.svg\" width=\"40\" alt=\"\">\r\n            <div>#7</div>\r\n        </li>\r\n        <li>\r\n            <img src=\"svg-loaders/grid.svg\" width=\"40\" alt=\"\">\r\n            <div>#8</div>\r\n        </li>\r\n        <li>\r\n            <img src=\"svg-loaders/spinning-circles.svg\" width=\"50\" alt=\"\">\r\n            <div>#9</div>\r\n        </li>\r\n        <li>\r\n            <img src=\"svg-loaders/circles.svg\" width=\"50\" alt=\"\">\r\n            <div>#10</div>\r\n        </li>\r\n        <li>\r\n            <img src=\"svg-loaders/ball-triangle.svg\" width=\"50\" alt=\"\">\r\n            <div>#11</div>\r\n        </li>\r\n        <li>\r\n            <span id=\"close_this_page\" onclick=\"window.close();\">关闭当前页面</span>\r\n        </li>\r\n        <div style=\"clear: both\"></div>\r\n    </ul>\r\n\r\n</body>\r\n\r\n</html>\r\n"
  },
  {
    "path": "assets/js/article_donate.js",
    "content": "window.__DONATE_INSTANCE = null;\n\nfunction destroyDonateModal() {\n  if (window.__DONATE_INSTANCE) {\n    window.__DONATE_INSTANCE.destroy();\n    window.__DONATE_INSTANCE = null;\n  }\n}\n\n(function() {\n  class DonateModal {\n    constructor() {\n      this.modal = document.querySelector('.donate-modal__mask');\n      this.closeBtn = document.querySelector('.donate-modal__close');\n      this.tabs = document.querySelectorAll('.donate-tab');\n      this.panes = document.querySelectorAll('.donate-pane');\n\n      this._closeHandler = null;\n      this._maskHandler = null;\n      this._tabHandlers = new Map();\n      \n      this.init();\n    }\n\n    init() {\n      this.destroy();\n\n      this._closeHandler = () => this.hide();\n      this._maskHandler = (e) => {\n        if (e.target === this.modal) this.hide();\n      };\n\n      this.closeBtn.addEventListener('click', this._closeHandler);\n      this.modal.addEventListener('click', this._maskHandler);\n\n      this.tabs.forEach(tab => {\n        const handler = () => this.switchTab(tab);\n        this._tabHandlers.set(tab, handler);\n        tab.addEventListener('click', handler);\n      });\n\n      this.panes.forEach(pane => {\n        if (!pane.children.length) {\n          const tab = document.querySelector(`[data-target=\"${pane.id}\"]`);\n          if (tab) tab.style.display = 'none';\n        }\n      });\n    }\n\n    switchTab(selectedTab) {\n      this.tabs.forEach(tab => tab.classList.remove('active'));\n      selectedTab.classList.add('active');\n      \n      const target = selectedTab.dataset.target;\n      this.panes.forEach(pane => {\n        pane.classList.remove('active');\n        if (pane.id === target) pane.classList.add('active');\n      });\n    }\n\n    show() {\n      this.modal.style.display = 'flex';\n    }\n\n    hide() {\n      this.modal.style.display = 'none';\n    }\n\n    destroy() {\n      if (this.closeBtn && this._closeHandler) {\n        this.closeBtn.removeEventListener('click', this._closeHandler);\n      }\n      if (this.modal && this._maskHandler) {\n        this.modal.removeEventListener('click', this._maskHandler);\n      }\n\n      this.tabs.forEach(tab => {\n        const handler = this._tabHandlers.get(tab);\n        if (handler) {\n          tab.removeEventListener('click', handler);\n        }\n      });\n      this._tabHandlers.clear();\n    }\n  }\n\n  function initDonateModal() {\n    destroyDonateModal();\n    window.__DONATE_INSTANCE = new DonateModal();\n  }\n\n  if (document.readyState !== 'loading') {\n    initDonateModal();\n  } else {\n    document.addEventListener('DOMContentLoaded', initDonateModal);\n  }\n\n  if (typeof pjax !== 'undefined') {\n    document.addEventListener('pjax:complete', initDonateModal);\n  }\n})();"
  },
  {
    "path": "assets/js/bearsimple-comments.js",
    "content": "function wordStatic(input) {\n        var content = document.getElementById('num');\n        if (content && input) {\n            var value = input.value;\n            value = value.replace(/\\n|\\r/gi,\"\");\n            content .innerText = value.length;\n        }\n    }\n   "
  },
  {
    "path": "assets/js/commentTyping.js",
    "content": "(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;q<n.length;++q){var r=n[q];if(r.alpha<=0.1){continue}r.velocity.y+=0.075;r.x+=r.velocity.x;r.y+=r.velocity.y;r.alpha*=0.96;a.globalAlpha=r.alpha;a.fillStyle=r.color;a.fillRect(Math.round(r.x-1.5),Math.round(r.y-1.5),3,3)}}requestAnimationFrame(i);c.exports=o},function(b,a){(function(){var d=[\"direction\",\"boxSizing\",\"width\",\"height\",\"overflowX\",\"overflowY\",\"borderTopWidth\",\"borderRightWidth\",\"borderBottomWidth\",\"borderLeftWidth\",\"borderStyle\",\"paddingTop\",\"paddingRight\",\"paddingBottom\",\"paddingLeft\",\"fontStyle\",\"fontVariant\",\"fontWeight\",\"fontStretch\",\"fontSize\",\"fontSizeAdjust\",\"lineHeight\",\"fontFamily\",\"textAlign\",\"textTransform\",\"textIndent\",\"textDecoration\",\"letterSpacing\",\"wordSpacing\",\"tabSize\",\"MozTabSize\"];var e=window.mozInnerScreenX!=null;function c(k,l,o){var h=o&&o.debug||false;if(h){var i=document.querySelector(\"#input-textarea-caret-position-mirror-div\");if(i){i.parentNode.removeChild(i)}}var f=document.createElement(\"div\");f.id=\"input-textarea-caret-position-mirror-div\";document.body.appendChild(f);var g=f.style;var j=window.getComputedStyle?getComputedStyle(k):k.currentStyle;g.whiteSpace=\"pre-wrap\";if(k.nodeName!==\"INPUT\"){g.wordWrap=\"break-word\"}g.position=\"absolute\";if(!h){g.visibility=\"hidden\"}d.forEach(function(p){g[p]=j[p]});if(e){if(k.scrollHeight>parseInt(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}}())}])});\nPOWERMODE.colorful=true;POWERMODE.shake=false;document.body.addEventListener(\"input\",POWERMODE);"
  },
  {
    "path": "assets/js/emaction.js",
    "content": "/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst 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;\n\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */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\");\n\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nvar 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?\"<svg>\":\"\",u=f;for(let i=0;i<s;i++){const s=t[i];let d,c,v=-1,a=0;for(;a<s.length&&(u.lastIndex=a,c=u.exec(s),null!==c);)a=u.lastIndex,u===f?\"!--\"===c[1]?u=_:void 0!==c[1]?u=m:void 0!==c[2]?(y.test(c[2])&&(l=RegExp(\"</\"+c[2],\"g\")),u=p):void 0!==c[3]&&(u=p):u===p?\">\"===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?\"</svg>\":\"\")),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.length<c;){if(1===h.nodeType){if(h.hasAttributes()){const t=[];for(const i of h.getAttributeNames())if(i.endsWith(o$1)||i.startsWith(n$1)){const s=f[d++];if(t.push(i),void 0!==s){const t=h.getAttribute(s.toLowerCase()+o$1).split(n$1),i=/([.?@])?(.*)/.exec(s);v.push({type:1,index:r,name:i[2],strings:t,ctor:\".\"===i[1]?H:\"?\"===i[1]?L:\"@\"===i[1]?z:k});}else v.push({type:6,index:r});}for(const i of t)h.removeAttribute(i);}if(y.test(h.tagName)){const t=h.textContent.split(n$1),i=t.length-1;if(i>0){h.textContent=s$1?s$1.emptyScript:\"\";for(let s=0;s<i;s++)h.append(t[s],u()),C.nextNode(),v.push({type:2,index:++r});h.append(t[i],u());}}}else if(8===h.nodeType)if(h.data===l$1)v.push({type:2,index:r});else {let t=-1;for(;-1!==(t=h.data.indexOf(n$1,t+1));)v.push({type:7,index:r}),t+=n$1.length-1;}r++;}}static createElement(t,i){const s=r.createElement(\"template\");return s.innerHTML=t,s}}function S(t,i,s=t,e){var o,n,l,h;if(i===T)return i;let r=void 0!==e?null===(o=s._$Co)||void 0===o?void 0:o[e]:s._$Cl;const u=d(i)?void 0:i._$litDirective$;return (null==r?void 0:r.constructor)!==u&&(null===(n=null==r?void 0:r._$AO)||void 0===n||n.call(r,!1),void 0===u?r=void 0:(r=new u(t),r._$AT(t,s,e)),void 0!==e?(null!==(l=(h=s)._$Co)&&void 0!==l?l:h._$Co=[])[e]=r:s._$Cl=r),void 0!==r&&(i=S(t,r._$AS(t,i.values),r,e)),i}class M{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i;}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){var i;const{el:{content:s},parts:e}=this._$AD,o=(null!==(i=null==t?void 0:t.creationScope)&&void 0!==i?i:r).importNode(s,!0);C.currentNode=o;let n=C.nextNode(),l=0,h=0,u=e[0];for(;void 0!==u;){if(l===u.index){let i;2===u.type?i=new R(n,n.nextSibling,this,t):1===u.type?i=new u.ctor(n,u.name,u.strings,this,t):6===u.type&&(i=new Z(n,this,t)),this._$AV.push(i),u=e[++h];}l!==(null==u?void 0:u.index)&&(n=C.nextNode(),l++);}return C.currentNode=r,o}v(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++;}}class R{constructor(t,i,s,e){var o;this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cp=null===(o=null==e?void 0:e.isConnected)||void 0===o||o;}get _$AU(){var t,i;return null!==(i=null===(t=this._$AM)||void 0===t?void 0:t._$AU)&&void 0!==i?i:this._$Cp}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===(null==t?void 0:t.nodeType)&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=S(this,t,i),d(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==T&&this._(t):void 0!==t._$litType$?this.g(t):void 0!==t.nodeType?this.$(t):v(t)?this.T(t):this._(t);}k(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}$(t){this._$AH!==t&&(this._$AR(),this._$AH=this.k(t));}_(t){this._$AH!==A&&d(this._$AH)?this._$AA.nextSibling.data=t:this.$(r.createTextNode(t)),this._$AH=t;}g(t){var i;const{values:s,_$litType$:e}=t,o=\"number\"==typeof e?this._$AC(t):(void 0===e.el&&(e.el=N.createElement(P(e.h,e.h[0]),this.options)),e);if((null===(i=this._$AH)||void 0===i?void 0:i._$AD)===o)this._$AH.v(s);else {const t=new M(o,this),i=t.u(this.options);t.v(s),this.$(i),this._$AH=t;}}_$AC(t){let i=E.get(t.strings);return void 0===i&&E.set(t.strings,i=new N(t)),i}T(t){c(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const o of t)e===i.length?i.push(s=new R(this.k(u()),this.k(u()),this,this.options)):s=i[e],s._$AI(o),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e);}_$AR(t=this._$AA.nextSibling,i){var s;for(null===(s=this._$AP)||void 0===s||s.call(this,!1,!0,i);t&&t!==this._$AB;){const i=t.nextSibling;t.remove(),t=i;}}setConnected(t){var i;void 0===this._$AM&&(this._$Cp=t,null===(i=this._$AP)||void 0===i||i.call(this,t));}}class k{constructor(t,i,s,e,o){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=o,s.length>2||\"\"!==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<o.length-1;l++)h=S(this,e[s+l],i,l),h===T&&(h=this._$AH[l]),n||(n=!d(h)||h!==this._$AH[l]),h===A?t=A:t!==A&&(t+=(null!=h?h:\"\")+o[l+1]),this._$AH[l]=h;}n&&!e&&this.j(t);}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,null!=t?t:\"\");}}class H extends k{constructor(){super(...arguments),this.type=3;}j(t){this.element[this.name]=t===A?void 0:t;}}const I=s$1?s$1.emptyScript:\"\";class L extends k{constructor(){super(...arguments),this.type=4;}j(t){t&&t!==A?this.element.setAttribute(this.name,I):this.element.removeAttribute(this.name);}}class z extends k{constructor(t,i,s,e,o){super(t,i,s,e,o),this.type=5;}_$AI(t,i=this){var s;if((t=null!==(s=S(this,t,i,0))&&void 0!==s?s:A)===T)return;const e=this._$AH,o=t===A&&e!==A||t.capture!==e.capture||t.once!==e.once||t.passive!==e.passive,n=t!==A&&(e===A||o);o&&this.element.removeEventListener(this.name,this,e),n&&this.element.addEventListener(this.name,this,t),this._$AH=t;}handleEvent(t){var i,s;\"function\"==typeof this._$AH?this._$AH.call(null!==(s=null===(i=this.options)||void 0===i?void 0:i.host)&&void 0!==s?s:this.element,t):this._$AH.handleEvent(t);}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s;}get _$AU(){return this._$AM._$AU}_$AI(t){S(this,t);}}const B=i.litHtmlPolyfillSupport;null==B||B(N,R),(null!==(t=i.litHtmlVersions)&&void 0!==t?t:i.litHtmlVersions=[]).push(\"2.7.5\");const D=(t,i,s)=>{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};\n\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */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\");\n\n//const DEFAULT_EMOJIS = '👍,thumbs-up;😄,smile-face;🎉,party-popper;😎,cool;😕,confused-face;❤️,red-heart;🚀,rocket;👀,eyes;👎,thumbs-down;';\nconst DEFAULT_EMOJIS = '👍,thumbs-up;🎉,party-popper;❤️,red-heart;😎,cool;😄,smile-face;🚀,rocket;';\n\nclass EmojiReaction extends s {\n  static properties = {\n    showAvailable: {attribute: false},\n    availableReactions: { attribute: false },\n    availableArrayString: {},\n    endpoint: {},\n    reactTargetId: {},\n    theme: {},\n  };\n  // Define scoped styles right with your component, in plain CSS\n  static styles = i$1`\n    /* default light */\n    .container {\n      --start-smile-border-color-default: #d0d7de;\n      --start-smile-border-color-hover-default: #1f232826;\n      --start-smile-bg-color-default: #f6f8fa;\n      --start-smile-svg-fill-color-default: #656d76;\n      --reaction-got-not-reacted-bg-color-default: transparent;\n      --reaction-got-not-reacted-bg-color-hover-default: #eaeef2;\n      --reaction-got-not-reacted-border-color-default: #d0d7de;\n      --reaction-got-not-reacted-text-color-default: #656d76;\n      --reaction-got-reacted-bg-color-default: transparent;\n      --reaction-got-reacted-bg-color-hover-default: #eaeef2;\n      --reaction-got-reacted-border-color-default: #42b983;\n      --reaction-got-reacted-text-color-default: #42b983;\n      --reaction-available-popup-bg-color-default: #ffffff;\n      --reaction-available-popup-border-color-default: #d0d7de;\n      --reaction-available-popup-box-shadow-default: 0 4px 6px rgba(0,0,0,.04);\n      --reaction-available-emoji-reacted-bg-color-default: #ddf4ff;\n      --reaction-available-emoji-bg-color-hover-default: #f3f4f6;\n      --reaction-available-emoji-z-index-default: 100;\n      --reaction-available-mask-z-index-default: 80;\n    }\n    /* default dark */\n    .container-dark{\n      --start-smile-border-color-default: #3b3d42;\n      --start-smile-border-color-hover-default: #3b3d42;\n      --start-smile-bg-color-default: transparent;\n      --start-smile-svg-fill-color-default: #ffffff;\n      --reaction-got-not-reacted-bg-color-default: transparent;\n      --reaction-got-not-reacted-bg-color-hover-default: #272727;\n      --reaction-got-not-reacted-border-color-default: #3b3d42;\n      --reaction-got-not-reacted-text-color-default: #ffffff;\n      --reaction-got-reacted-bg-color-default: #272727;\n      --reaction-got-reacted-bg-color-hover-default: #272727;\n      --reaction-got-reacted-border-color-default: #42b983;\n      --reaction-got-reacted-text-color-default: #42b983;\n      --reaction-available-popup-bg-color-default: #161b22;\n      --reaction-available-popup-border-color-default: #30363d;\n      --reaction-available-popup-box-shadow-default: 0 4px 6px rgba(0,0,0,.04);\n      --reaction-available-emoji-reacted-bg-color-default: #388bfd1a;\n      --reaction-available-emoji-bg-color-hover-default: #30363d;\n      --reaction-available-emoji-z-index-default: 100;\n      --reaction-available-mask-z-index-default: 80;\n    }\n    .anim-scale-in {\n      animation-name: scale-in;\n      animation-duration: .15s;\n      animation-timing-function: cubic-bezier(0.2, 0, 0.13, 1.5);\n    }\n\n    @keyframes scale-in {\n      0% {\n          opacity: 0;\n          transform: scale(0.5);\n      }\n      100% {\n          opacity: 1;\n          transform: scale(1);\n      }\n    }\n  `;\n\n  // Render the UI as a function of component state\n  render() {\n    var system_theme = localStorage.getItem(\"theme\") || ''\n    if (system_theme == null || system_theme == \"undefined\" || system_theme == \"\") {\n      system_theme = window.matchMedia(\"(prefers-color-scheme: light)\").matches ? \"light\" : \"dark\";\n    }\n    return x`\n    <style>\n\n      #start-smile:hover {\n        border-color: var(--start-smile-border-color-hover, var(--start-smile-border-color-hover-default)) !important;\n      }\n      #start-smile-svg {\n        fill: var(--start-smile-svg-fill-color, var(--start-smile-svg-fill-color-default));\n        \n        border:1px solid var(--start-smile-border-color, var(--start-smile-border-color-default));\n        border-radius:100%;\n        padding:3px;\n        background-color: var(--start-smile-bg-color, var(--start-smile-bg-color-default));\n      }\n      .reaction-got-not-reacted {\n        background-color: var(--reaction-got-not-reacted-bg-color, var(--reaction-got-not-reacted-bg-color-default));\n        border-width: 1px;\n        border-style: solid;\n        border-color: var(--reaction-got-not-reacted-border-color, var(--reaction-got-not-reacted-border-color-default));\n        color: var(--reaction-got-not-reacted-text-color, var(--reaction-got-not-reacted-text-color-default));\n      }\n      .reaction-got-not-reacted:hover {\n        background-color: var(--reaction-got-not-reacted-bg-color-hover, var(--reaction-got-not-reacted-bg-color-hover-default));\n      }\n      .reaction-got-reacted {\n        background-color: var(--reaction-got-reacted-bg-color, var(--reaction-got-reacted-bg-color-default));\n        border-width: 1px;\n        border-style: solid;\n        border-color: var(--reaction-got-reacted-border-color, var(--reaction-got-reacted-border-color-default));\n        color: var(--reaction-got-reacted-text-color, var(--reaction-got-reacted-text-color-default));\n      }\n      .reaction-got-reacted:hover {\n        background-color: var(--reaction-got-reacted-bg-color-hover, var(--reaction-got-reacted-bg-color-hover-default));\n      }\n      .reaction-available-popup {\n        background-color: var(--reaction-available-popup-bg-color, var(--reaction-available-popup-bg-color-default));\n        border-width: 1px;\n        border-style: solid;\n        border-color: var(--reaction-available-popup-border-color, var(--reaction-available-popup-border-color-default));\n        box-shadow: var(--reaction-available-popup-box-shadow, var(--reaction-available-popup-box-shadow-default));\n      }\n      .reaction-available-emoji {\n        z-index: var(--reaction-available-emoji-z-index, var(--reaction-available-emoji-z-index-default));\n      }\n      .reaction-available-emoji:hover {\n        background-color: var(--reaction-available-emoji-bg-color-hover, var(--reaction-available-emoji-bg-color-hover-default));\n      }\n      .reaction-available-emoji-reacted {\n        background-color: var(--reaction-available-emoji-reacted-bg-color, var(--reaction-available-emoji-reacted-bg-color-default));\n      }\n      .reaction-available-popup::before {\n        position: fixed;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n        z-index: var(--reaction-available-mask-z-index, var(--reaction-available-mask-z-index-default));\n        display: block;\n        cursor: default;\n        content: \" \";\n        background: transparent;\n      }\n    </style>\n    <!-- container -->\n    <style>@media (prefers-color-scheme: dark){.container-dark{filter:invert(1) hue-rotate(180deg)}</style>\n    <divs style=\"flex-wrap: nowrap; max-width: 100%; display: flex; gap: 0.375rem;height: 1.5rem;\" class=\"${this?.theme === 'dark' || (this?.theme === 'system' && system_theme === 'dark') ? 'container-dark' : 'container'}\">\n      <!-- 灰色笑脸 -->\n      <div style=\"position: relative; user-select: none;\">\n        <div id=\"start-smile\" @click=\"${this._showAvailable}\">\n         <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" id=\"start-smile-svg\" style=\"cursor: pointer;\">\n            <path\n              d=\"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm3.82 1.636a.75.75 0 0 1 1.038.175l.007.009c.103.118.22.222.35.31.264.178.683.37 1.285.37.602 0 1.02-.192 1.285-.371.13-.088.247-.192.35-.31l.007-.008a.75.75 0 0 1 1.222.87l-.022-.015c.02.013.021.015.021.015v.001l-.001.002-.002.003-.005.007-.014.019a2.066 2.066 0 0 1-.184.213c-.16.166-.338.316-.53.445-.63.418-1.37.638-2.127.629-.946 0-1.652-.308-2.126-.63a3.331 3.331 0 0 1-.715-.657l-.014-.02-.005-.006-.002-.003v-.002h-.001l.613-.432-.614.43a.75.75 0 0 1 .183-1.044ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM5 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm5.25 2.25.592.416a97.71 97.71 0 0 0-.592-.416Z\">\n            </path>\n          </svg>\n         \n        </div>\n        <div class=\"anim-scale-in reaction-available-popup\" @click=${this._closePopup} style=\"display: ${this.showAvailable ? 'flex' : 'none'}; user-select: none; position: absolute; top: -3rem; font-size: 0.875rem; border-radius: 0.375rem; padding: 0 0.125rem;\">\n          <!-- reactions available -->\n          ${this.availableReactions.map(item => x`\n            <span @click=${this._react} data-name=\"${item.reaction_name}\" class=\"reaction-available-emoji ${item.meReacted ? 'reaction-available-emoji-reacted' : ''}\" style=\"cursor: pointer; margin: 0.25rem 0.25rem; padding: 0.25rem 0.35rem; border-radius: 0.375rem;\">${item.emoji}</span>\n          `)}\n        </div>\n      </div>\n      <!-- reactions got -->\n      <divs style=\"display: flex; overflow-x: auto; gap: 0.375rem;\">\n        ${this.availableReactions.map(item => x`\n          <div @click=${this._react} data-name=\"${item.reaction_name}\" class=\"${item.meReacted ? 'reaction-got-reacted' : 'reaction-got-not-reacted'}\" style=\"display: ${item?.count && item.count > 0 ? 'flex' : 'none'}; user-select: none; cursor: pointer; justify-content: center; align-items: center; border-radius: 108px; padding: 0 0.25rem; font-size: 0.75rem;\">\n            <span style=\"pointer-events: none;\">${item.emoji}</span><span style=\"padding:0 0.375rem; pointer-events: none;\">${item.count}</span>\n          </divs>\n        `)}\n      </div>\n    </divs>\n    `;\n  }\n\n  constructor() {\n    super();\n    // Declare reactive properties\n    this.showAvailable = false;\n    this.availableReactions = [];\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this.initReactions();\n  }\n\n  async initReactions() {\n    let arr_string = this?.availableArrayString;\n    if (!arr_string) {\n      arr_string = DEFAULT_EMOJIS;\n    }\n    const arr = arr_string.split(';').map(val => {\n      const [emoji, reaction_name] = val.split(',');\n      if (!emoji || !reaction_name) {\n        return null\n      }\n      return { emoji, reaction_name }\n    }).filter(val => val);\n    // 初始化 endpoint\n    if (!this?.endpoint) {\n      this.endpoint = 'https://www.diu2.com/emoji';\n    }\n    // 请求接口，获取哪些 emoji 有 reaction 数量\n    let url_2_generate_id = '';\n    const canonical = document.head.querySelector(\"link[rel='canonical']\");\n    url_2_generate_id = canonical && canonical.href ? canonical.href : window.location.href;\n    const urlObj = new URL(url_2_generate_id);\n    const url_without_hash = urlObj.origin + urlObj.pathname + urlObj.search;\n    if (!this?.reactTargetId) {\n      this.reactTargetId = await this._sha256(url_without_hash);\n    }\n    const { data: { reactionsGot } } = await fetch(this.endpoint, {\n      method: 'POST',\n      body: JSON.stringify({\n\t\t\t\taction:'getReact',\n\t\t\t\ttargetId: this.reactTargetId\n            }),\n      headers: {\n     'content-type': 'application/json' // 数据格式\n   },\n    })\n    .then(resp => resp.json())\n    .then(resp => {\n      if (!resp?.data || !Array.isArray(resp?.data?.reactionsGot)) {\n        throw new Error(\"获取 reactions 出错！\")\n      }\n      return resp;\n    });\n    // 获得的 reactions 数量放到 arr 里\n    reactionsGot.forEach(reaction => {\n      arr.forEach(availableReaction => {\n        if (reaction.reaction_name === availableReaction.reaction_name) {\n          availableReaction.count = Number(reaction.count);\n        }\n      });\n    });\n    // 读取 localStorage，获取当前用户点击过的 emoji\n    const storageKey = `meReactedReactions_${this.reactTargetId}`;\n    const meReactedReactions = JSON.parse(window.localStorage.getItem(storageKey) || \"[]\");\n    // 当前用户点击状态放到 arr\n    meReactedReactions.forEach(reaction_name => {\n      arr.forEach(availableReaction => {\n        if (reaction_name === availableReaction.reaction_name) {\n          availableReaction.meReacted = true;\n        }\n      });\n    });\n    // 初始化 avaiableArray\n    this.availableReactions = arr;\n  }\n\n  _closePopup(e) {\n    console.log(e.target);\n    this.showAvailable = false;\n  }\n\n  async _react(e) {\n    const { name: reaction_name } = e.target.dataset;\n    const reaction = this.availableReactions.find(ele => ele.reaction_name === reaction_name);\n    if (!reaction) {\n      console.error(\"未知的 reaction!\");\n      return\n    }\n    const cancel = reaction?.meReacted ? true : false;\n    const currentCount = Number(reaction?.count) || 0;\n    const count = Math.max(0, currentCount + (cancel ? -1 : 1));\n    const meReacted = !reaction.meReacted;\n    this.availableReactions = this.availableReactions.map(val => {\n      if (val.reaction_name === reaction_name) {\n        val.count = count;\n        val.meReacted = meReacted;\n      }\n      return val\n    });\n    this.showAvailable = false;\n    // 请求接口，更新 react 数量\n    await fetch(this.endpoint, { method: \"POST\",\n        body: JSON.stringify({\n\t\t\t\taction: 'updateReact',\n      targetId: this.reactTargetId,\n      reaction_name: reaction_name,\n      diff: cancel ? -1 : 1\n            }),\n        headers: {\n     'content-type': 'application/json' // 数据格式\n   },\n    });\n    // 更新 localStorage\n    const storageKey = `meReactedReactions_${this.reactTargetId}`;\n    const meReactedReactionsSet = new Set(JSON.parse(window.localStorage.getItem(storageKey) || \"[]\"));\n    if (cancel) {\n      meReactedReactionsSet.delete(reaction_name);\n    } else {\n      meReactedReactionsSet.add(reaction_name);\n    }\n    window.localStorage.setItem(storageKey, JSON.stringify(Array.from(meReactedReactionsSet)));\n  }\n  _showAvailable(e) {\n    e.preventDefault();\n    this.showAvailable = !this.showAvailable;\n  }\n  async _sha256(string) {\n    return Array.from(new Uint8Array(\n      await crypto.subtle.digest('sha-256', new TextEncoder().encode(string))\n    ))\n      .map(b => b.toString(16).padStart(2, \"0\")).join(\"\")\n  }\n}\ncustomElements.define('emoji-reaction', EmojiReaction);\n\nexport { EmojiReaction };\n"
  },
  {
    "path": "assets/js/gt4.js",
    "content": "\"v4.1.5 Geetest Inc.\";\n\n(function (window) {\n    \"use strict\";\n    if (typeof window === 'undefined') {\n        throw new Error('Geetest requires browser environment');\n    }\n\nvar document = window.document;\nvar Math = window.Math;\nvar head = document.getElementsByTagName(\"head\")[0];\nvar TIMEOUT = 10000;\n\nfunction _Object(obj) {\n    this._obj = obj;\n}\n\n_Object.prototype = {\n    _each: function (process) {\n        var _obj = this._obj;\n        for (var k in _obj) {\n            if (_obj.hasOwnProperty(k)) {\n                process(k, _obj[k]);\n            }\n        }\n        return this;\n    },\n    _extend: function (obj){\n        var self = this;\n        new _Object(obj)._each(function (key, value){\n            self._obj[key] = value;\n        })\n    }\n};\n\nvar uuid = function () {\n        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n            var r = Math.random() * 16 | 0;\n            var v = c === 'x' ? r : (r & 0x3 | 0x8);\n            return v.toString(16);\n        });\n    };\n\nfunction Config(config) {\n    var self = this;\n    new _Object(config)._each(function (key, value) {\n        self[key] = value;\n    });\n}\n\nConfig.prototype = {\n    apiServers: ['gcaptcha4.geetest.com','gcaptcha4.geevisit.com','gcaptcha4.gsensebot.com'],\n    staticServers: [\"static.geetest.com\",'static.geevisit.com', \"dn-staticdown.qbox.me\"],\n    protocol: 'http://',\n    typePath: '/load',\n    fallback_config: {\n        bypass: {\n            staticServers: [\"static.geetest.com\",'static.geevisit.com',\"dn-staticdown.qbox.me\"],\n            type: 'bypass',\n            bypass: '/v4/bypass.js'\n        }\n    },\n    _get_fallback_config: function () {\n        var self = this;\n        if (isString(self.type)) {\n            return self.fallback_config[self.type];\n        } else {\n            return self.fallback_config.bypass;\n        }\n    },\n    _extend: function (obj) {\n        var self = this;\n        new _Object(obj)._each(function (key, value) {\n            self[key] = value;\n        })\n    }\n};\nvar isNumber = function (value) {\n    return (typeof value === 'number');\n};\nvar isString = function (value) {\n    return (typeof value === 'string');\n};\nvar isBoolean = function (value) {\n    return (typeof value === 'boolean');\n};\nvar isObject = function (value) {\n    return (typeof value === 'object' && value !== null);\n};\nvar isFunction = function (value) {\n    return (typeof value === 'function');\n};\nvar MOBILE = /Mobi/i.test(navigator.userAgent);\n\nvar callbacks = {};\nvar status = {};\n\nvar random = function () {\n    return parseInt(Math.random() * 10000) + (new Date()).valueOf();\n};\n\n// bind 函数polify, 不带new功能的bind\n\nvar bind = function(target,context){\n    if(typeof target !== 'function'){\n        return;\n    }\n    var args = Array.prototype.slice.call(arguments,2);\n\n    if(Function.prototype.bind){\n        return target.bind(context, args);\n    }else {\n        return function(){\n            var _args = Array.prototype.slice.call(arguments);\n            return target.apply(context,args.concat(_args));\n        }\n    }\n}\n\n\n\nvar toString = Object.prototype.toString;\n\nvar _isFunction = function(obj) {\n  return typeof(obj) === 'function';\n};\nvar _isObject = function(obj) {\n  return obj === Object(obj);\n};\nvar _isArray = function(obj) {\n  return toString.call(obj) == '[object Array]';\n};\nvar _isDate = function(obj) {\n  return toString.call(obj) == '[object Date]';\n};\nvar _isRegExp = function(obj) {\n  return toString.call(obj) == '[object RegExp]';\n};\nvar _isBoolean = function(obj) {\n  return toString.call(obj) == '[object Boolean]';\n};\n\n\nfunction resolveKey(input){\n  return  input.replace(/(\\S)(_([a-zA-Z]))/g, function(match, $1, $2, $3){\n          return $1 + $3.toUpperCase() || \"\";\n  })\n}\n\nfunction camelizeKeys(input, convert){\n  if(!_isObject(input) || _isDate(input) || _isRegExp(input) || _isBoolean(input) || _isFunction(input)){\n      return convert ? resolveKey(input) : input;\n  }\n\n  if(_isArray(input)){\n      var temp = [];\n      for(var i = 0; i < input.length; i++){\n          temp.push(camelizeKeys(input[i]));\n      }\n\n  }else {\n      var temp = {};\n      for(var prop in input){\n          if(input.hasOwnProperty(prop)){\n              temp[camelizeKeys(prop, true)] = camelizeKeys(input[prop]);\n          }\n      }\n  }\n  return temp;\n}\n\nvar loadScript = function (url, cb, timeout) {\n    var script = document.createElement(\"script\");\n    script.charset = \"UTF-8\";\n    script.async = true;\n\n    // 对geetest的静态资源添加 crossOrigin\n    if ( /static\\.geetest\\.com/g.test(url)) {\n        script.crossOrigin = \"anonymous\";\n    }\n\n    script.onerror = function () {\n        cb(true);\n        // 错误触发了，超时逻辑就不用了\n        loaded = true;\n    };\n    var loaded = false;\n    script.onload = script.onreadystatechange = function () {\n        if (!loaded &&\n            (!script.readyState ||\n            \"loaded\" === script.readyState ||\n            \"complete\" === script.readyState)) {\n\n            loaded = true;\n            setTimeout(function () {\n                cb(false);\n            }, 0);\n        }\n    };\n    script.src = url;\n    head.appendChild(script);\n\n    setTimeout(function () {\n        if (!loaded) {\n            script.onerror = script.onload = null;\n            script.remove && script.remove();\n            cb(true);\n        }\n    }, timeout || TIMEOUT);\n};\n\nvar normalizeDomain = function (domain) {\n    // special domain: uems.sysu.edu.cn/jwxt/geetest/\n    // return domain.replace(/^https?:\\/\\/|\\/.*$/g, ''); uems.sysu.edu.cn\n    return domain.replace(/^https?:\\/\\/|\\/$/g, ''); // uems.sysu.edu.cn/jwxt/geetest\n};\nvar normalizePath = function (path) {\n    path = path.replace(/\\/+/g, '/');\n    if (path.indexOf('/') !== 0) {\n        path = '/' + path;\n    }\n    return path;\n};\nvar normalizeQuery = function (query) {\n    if (!query) {\n        return '';\n    }\n    var q = '?';\n    new _Object(query)._each(function (key, value) {\n        if (isString(value) || isNumber(value) || isBoolean(value)) {\n            q = q + encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&';\n        }\n    });\n    if (q === '?') {\n        q = '';\n    }\n    return q.replace(/&$/, '');\n};\nvar makeURL = function (protocol, domain, path, query) {\n    domain = normalizeDomain(domain);\n\n    var url = normalizePath(path) + normalizeQuery(query);\n    if (domain) {\n        url = protocol + domain + url;\n    }\n\n    return url;\n};\n\nvar load = function (config, protocol, domains, path, query, cb, handleCb) {\n    var tryRequest = function (at) {\n\n        // 处理jsonp回调，这里为了保证每个不同jsonp都有唯一的回调函数\n        if(handleCb){\n            var cbName = \"geetest_\" + random();\n            // 需要与预先定义好cbname参数，删除对象\n            window[cbName] = bind(handleCb, null, cbName);\n            query.callback = cbName;\n        }\n        var url = makeURL(protocol, domains[at], path, query);\n        loadScript(url, function (err) {\n            if (err) {\n                // 超时或者出错的时候 移除回调\n                if(cbName){\n                  try {\n                     window[cbName] = function(){\n                       window[cbName] = null;\n                      }\n                    } catch (e) {}\n                }\n\n                if (at >= domains.length - 1) {\n                    cb(true);\n                    // report gettype error\n                } else {\n                    tryRequest(at + 1);\n                }\n            } else {\n                cb(false);\n            }\n        }, config.timeout);\n    };\n    tryRequest(0);\n};\n\n\nvar jsonp = function (domains, path, config, callback) {\n\n    var handleCb = function (cbName, data) {\n\n        // 保证只执行一次，全部超时的情况下不会再触发;\n\n        if (data.status == 'success') {\n            callback(data.data);\n        } else if (!data.status) {\n            callback(data);\n        } else {\n            //接口有返回，但是返回了错误状态，进入报错逻辑\n            callback(data);\n        }\n        window[cbName] = undefined;\n        try {\n            delete window[cbName];\n        } catch (e) {\n        }\n    };\n    load(config, config.protocol, domains, path, {\n        captcha_id: config.captchaId,\n        challenge: config.challenge || uuid(),\n        client_type: MOBILE? 'h5':'web',\n        risk_type: config.riskType,\n        user_info: config.userInfo,\n        call_type: config.callType,\n        lang: config.language? config.language : navigator.appName === 'Netscape' ? navigator.language.toLowerCase() : navigator.userLanguage.toLowerCase()\n    }, function (err) {\n        // 网络问题接口没有返回，直接使用本地验证码，走宕机模式\n        // 这里可以添加用户的逻辑\n            if(err && typeof config.offlineCb === 'function'){\n                // 执行自己的宕机\n                config.offlineCb();\n                return;\n            }\n\n           if(err){\n            callback(config._get_fallback_config());\n           }\n    }, handleCb);\n};\n\nvar reportError = function (config, url) {\n    load(config, config.protocol, ['monitor.geetest.com'], '/monitor/send', {\n        time: Date.now().getTime(),\n        captcha_id: config.gt,\n        challenge: config.challenge,\n        exception_url: url,\n        error_code: config.error_code\n    }, function (err) {})\n}\n\nvar throwError = function (errorType, config, errObj) {\n    var errors = {\n        networkError: '网络错误',\n        gtTypeError: 'gt字段不是字符串类型'\n    };\n    if (typeof config.onError === 'function') {\n        config.onError({\n            desc: errObj.desc,\n            msg: errObj.msg,\n            code: errObj.code\n        });\n    } else {\n        throw new Error(errors[errorType]);\n    }\n};\n\nvar detect = function () {\n    return window.Geetest || document.getElementById(\"gt_lib\");\n};\n\nif (detect()) {\n    status.slide = \"loaded\";\n}\nvar GeetestIsLoad = function (fname) {\n  var GeetestIsLoad = false;\n  var tags = { js: 'script', css: 'link' };\n  var tagname = tags[fname.split('.').pop()];\n  if (tagname !== undefined) {\n    var elts = document.getElementsByTagName(tagname);\n    for (var i in elts) {\n      if ((elts[i].href && elts[i].href.toString().indexOf(fname) > 0)\n              || (elts[i].src && elts[i].src.toString().indexOf(fname) > 0)) {\n        GeetestIsLoad = true;\n      }\n    }\n  }\n  return GeetestIsLoad;\n};\nwindow.initGeetest4 = function (userConfig,callback) {\n\n    var config = new Config(userConfig);\n    if (userConfig.https) {\n        config.protocol = 'https://';\n    } else if (!userConfig.protocol) {\n        config.protocol = window.location.protocol + '//';\n    }\n\n\n    if (isObject(userConfig.getType)) {\n        config._extend(userConfig.getType);\n    }\n\n    jsonp(config.apiServers , config.typePath, config, function (newConfig) {\n            \n            //错误捕获，第一个load请求可能直接报错\n            var newConfig = camelizeKeys(newConfig);\n\n            if(newConfig.status === 'error'){\n               return throwError('networkError', config, newConfig);\n            }\n\n            var type = newConfig.type;\n            \n            if(config.debug){\n                new _Object(newConfig)._extend(config.debug)\n            }\n            var init = function () {\n                config._extend(newConfig);\n                callback(new window.Geetest4(config));\n            };\n\n            callbacks[type] = callbacks[type] || [];\n\n            var s = status[type] || 'init';\n            if (s === 'init') {\n\n                status[type] = 'loading';\n\n                callbacks[type].push(init);\n\n                if(newConfig.gctPath){\n                    load(config, config.protocol, Object.hasOwnProperty.call(config, 'staticServers') ? config.staticServers  : newConfig.staticServers || config.staticServers , newConfig.gctPath, null, function (err){\n                        if(err){\n                            throwError('networkError', config, {\n                                code: '60205',\n                                msg: 'Network failure',\n                                desc: {\n                                    detail: 'gct resource load timeout'\n                                }\n                            });\n                        }\n                    })\n                }\n\n                load(config,  config.protocol, Object.hasOwnProperty.call(config, 'staticServers') ? config.staticServers  : newConfig.staticServers || config.staticServers, newConfig.bypass || (newConfig.staticPath + newConfig.js), null, function (err) {\n                    if (err) {\n                        status[type] = 'fail';\n                        throwError('networkError', config, {\n                            code: '60204',\n                            msg: 'Network failure',\n                            desc: {\n                                detail: 'js resource load timeout'\n                            }\n                        });\n                    } else {\n                        status[type] = 'loaded';\n                        var cbs = callbacks[type];\n                        for (var i = 0, len = cbs.length; i < len; i = i + 1) {\n                            var cb = cbs[i];\n                            if (isFunction(cb)) {\n                                cb();\n                            }\n                        }\n                        callbacks[type] = [];\n                    }\n                });\n            } else if (s === \"loaded\") {\n                // 判断gct是否需要重新加载\n                if(!GeetestIsLoad(newConfig.gctPath)){\n                  load(config, config.protocol, Object.hasOwnProperty.call(config, 'staticServers') ? config.staticServers  : newConfig.staticServers || config.staticServers , newConfig.gctPath, null, function (err){\n                      if(err){\n                          throwError('networkError', config, {\n                              code: '60205',\n                              msg: 'Network failure',\n                              desc: {\n                                  detail: 'gct resource load timeout'\n                              }\n                          });\n                      }\n                  })\n                }\n                return  init();\n            } else if (s === \"fail\") {\n              throwError('networkError', config, {\n                code: '60204',\n                msg: 'Network failure',\n                desc: {\n                    detail: 'js resource load timeout'\n                }\n              });\n            } else if (s === \"loading\") {\n                callbacks[type].push(init);\n            }\n        });\n\n};\n\n\n})(window);\n"
  },
  {
    "path": "assets/js/instantPage.js",
    "content": "/*! instant.page v5.2.0 - (C) 2019-2023 Alexandre Dieulot - https://instant.page/license */\nlet 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<r)return;if(!(\"closest\"in t.target))return;const e=t.target.closest(\"a\");m(e)&&(e.addEventListener(\"mouseout\",f,{passive:!0}),i=setTimeout(()=>{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()-o<r)return;const e=t.target.closest(\"a\");if(t.which>1||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})}}();"
  },
  {
    "path": "assets/js/jquery.pjax.js",
    "content": "/*!\n * Copyright 2012, Chris Wanstrath\n * Released under the MIT License\n * https://github.com/defunkt/jquery-pjax\n */\n\n(function($){\n\n// When called on a container with a selector, fetches the href with\n// ajax into the container or with the data-pjax attribute on the link\n// itself.\n//\n// Tries to make sure the back button and ctrl+click work the way\n// you'd expect.\n//\n// Exported as $.fn.pjax\n//\n// Accepts a jQuery ajax options object that may include these\n// pjax specific options:\n//\n//\n// container - String selector for the element where to place the response body.\n//      push - Whether to pushState the URL. Defaults to true (of course).\n//   replace - Want to use replaceState instead? That's cool.\n//\n// For convenience the second parameter can be either the container or\n// the options object.\n//\n// Returns the jQuery object\nfunction fnPjax(selector, container, options) {\n  options = optionsFor(container, options)\n  return this.on('click.pjax', selector, function(event) {\n    var opts = options\n    if (!opts.container) {\n      opts = $.extend({}, options)\n      opts.container = $(this).attr('data-pjax')\n    }\n    handleClick(event, opts)\n  })\n}\n\n// Public: pjax on click handler\n//\n// Exported as $.pjax.click.\n//\n// event   - \"click\" jQuery.Event\n// options - pjax options\n//\n// Examples\n//\n//   $(document).on('click', 'a', $.pjax.click)\n//   // is the same as\n//   $(document).pjax('a')\n//\n// Returns nothing.\nfunction handleClick(event, container, options) {\n  options = optionsFor(container, options)\n\n  var link = event.currentTarget\n  var $link = $(link)\n\n  if (link.tagName.toUpperCase() !== 'A')\n    throw \"$.fn.pjax or $.pjax.click requires an anchor element\"\n\n  // Middle click, cmd click, and ctrl click should open\n  // links in a new tab as normal.\n  if ( event.which > 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey )\n    return\n\n  // Ignore cross origin links\n  if ( location.protocol !== link.protocol || location.hostname !== link.hostname )\n    return\n\n  // Ignore case when a hash is being tacked on the current URL\n  if ( link.href.indexOf('#') > -1 && stripHash(link) == stripHash(location) )\n    return\n\n  // Ignore event with default prevented\n  if (event.isDefaultPrevented())\n    return\n\n  var defaults = {\n    url: link.href,\n    container: $link.attr('data-pjax'),\n    target: link\n  }\n\n  var opts = $.extend({}, defaults, options)\n  var clickEvent = $.Event('pjax:click')\n  $link.trigger(clickEvent, [opts])\n\n  if (!clickEvent.isDefaultPrevented()) {\n    pjax(opts)\n    event.preventDefault()\n    $link.trigger('pjax:clicked', [opts])\n  }\n}\n\n// Public: pjax on form submit handler\n//\n// Exported as $.pjax.submit\n//\n// event   - \"click\" jQuery.Event\n// options - pjax options\n//\n// Examples\n//\n//  $(document).on('submit', 'form', function(event) {\n//    $.pjax.submit(event, '[data-pjax-container]')\n//  })\n//\n// Returns nothing.\nfunction handleSubmit(event, container, options) {\n  options = optionsFor(container, options)\n\n  var form = event.currentTarget\n  var $form = $(form)\n\n  if (form.tagName.toUpperCase() !== 'FORM')\n    throw \"$.pjax.submit requires a form element\"\n\n  var defaults = {\n    type: ($form.attr('method') || 'GET').toUpperCase(),\n    url: $form.attr('action'),\n    container: $form.attr('data-pjax'),\n    target: form\n  }\n\n  if (defaults.type !== 'GET' && window.FormData !== undefined) {\n    defaults.data = new FormData(form)\n    defaults.processData = false\n    defaults.contentType = false\n  } else {\n    // Can't handle file uploads, exit\n    if ($form.find(':file').length) {\n      return\n    }\n\n    // Fallback to manually serializing the fields\n    defaults.data = $form.serializeArray()\n  }\n\n  pjax($.extend({}, defaults, options))\n\n  event.preventDefault()\n}\n\n// Loads a URL with ajax, puts the response body inside a container,\n// then pushState()'s the loaded URL.\n//\n// Works just like $.ajax in that it accepts a jQuery ajax\n// settings object (with keys like url, type, data, etc).\n//\n// Accepts these extra keys:\n//\n// container - String selector for where to stick the response body.\n//      push - Whether to pushState the URL. Defaults to true (of course).\n//   replace - Want to use replaceState instead? That's cool.\n//\n// Use it just like $.ajax:\n//\n//   var xhr = $.pjax({ url: this.href, container: '#main' })\n//   console.log( xhr.readyState )\n//\n// Returns whatever $.ajax returns.\nfunction pjax(options) {\n  options = $.extend(true, {}, $.ajaxSettings, pjax.defaults, options)\n\n  if ($.isFunction(options.url)) {\n    options.url = options.url()\n  }\n\n  var hash = parseURL(options.url).hash\n\n  var containerType = $.type(options.container)\n  if (containerType !== 'string') {\n    throw \"expected string value for 'container' option; got \" + containerType\n  }\n  var context = options.context = $(options.container)\n  if (!context.length) {\n    throw \"the container selector '\" + options.container + \"' did not match anything\"\n  }\n\n  // We want the browser to maintain two separate internal caches: one\n  // for pjax'd partial page loads and one for normal page loads.\n  // Without adding this secret parameter, some browsers will often\n  // confuse the two.\n  if (!options.data) options.data = {}\n  if ($.isArray(options.data)) {\n    options.data.push({name: '_pjax', value: options.container})\n  } else {\n    options.data._pjax = options.container\n  }\n\n  function fire(type, args, props) {\n    if (!props) props = {}\n    props.relatedTarget = options.target\n    var event = $.Event(type, props)\n    context.trigger(event, args)\n    return !event.isDefaultPrevented()\n  }\n\n  var timeoutTimer\n\n  options.beforeSend = function(xhr, settings) {\n    // No timeout for non-GET requests\n    // Its not safe to request the resource again with a fallback method.\n    if (settings.type !== 'GET') {\n      settings.timeout = 0\n    }\n\n    xhr.setRequestHeader('X-PJAX', 'true')\n    xhr.setRequestHeader('X-PJAX-Container', options.container)\n\n    if (!fire('pjax:beforeSend', [xhr, settings]))\n      return false\n\n    if (settings.timeout > 0) {\n      timeoutTimer = setTimeout(function() {\n        if (fire('pjax:timeout', [xhr, options]))\n          xhr.abort('timeout')\n      }, settings.timeout)\n\n      // Clear timeout setting so jquerys internal timeout isn't invoked\n      settings.timeout = 0\n    }\n\n    var url = parseURL(settings.url)\n    if (hash) url.hash = hash\n    options.requestUrl = stripInternalParams(url)\n  }\n\n  options.complete = function(xhr, textStatus) {\n    if (timeoutTimer)\n      clearTimeout(timeoutTimer)\n\n    fire('pjax:complete', [xhr, textStatus, options])\n\n    fire('pjax:end', [xhr, options])\n  }\n\n  options.error = function(xhr, textStatus, errorThrown) {\n    var container = extractContainer(\"\", xhr, options)\n\n    var allowed = fire('pjax:error', [xhr, textStatus, errorThrown, options])\n    if (options.type == 'GET' && textStatus !== 'abort' && allowed) {\n      locationReplace(container.url)\n    }\n  }\n\n  options.success = function(data, status, xhr) {\n    var previousState = pjax.state\n\n    // If $.pjax.defaults.version is a function, invoke it first.\n    // Otherwise it can be a static string.\n    var currentVersion = typeof $.pjax.defaults.version === 'function' ?\n      $.pjax.defaults.version() :\n      $.pjax.defaults.version\n\n    var latestVersion = xhr.getResponseHeader('X-PJAX-Version')\n\n    var container = extractContainer(data, xhr, options)\n\n    var url = parseURL(container.url)\n    if (hash) {\n      url.hash = hash\n      container.url = url.href\n    }\n\n    // If there is a layout version mismatch, hard load the new url\n    if (currentVersion && latestVersion && currentVersion !== latestVersion) {\n      locationReplace(container.url)\n      return\n    }\n\n    // If the new response is missing a body, hard load the page\n    if (!container.contents) {\n      locationReplace(container.url)\n      return\n    }\n\n    pjax.state = {\n      id: options.id || uniqueId(),\n      url: container.url,\n      title: container.title,\n      container: options.container,\n      fragment: options.fragment,\n      timeout: options.timeout\n    }\n\n    if (options.push || options.replace) {\n      window.history.replaceState(pjax.state, container.title, container.url)\n    }\n\n    // Only blur the focus if the focused element is within the container.\n    var blurFocus = $.contains(context, document.activeElement)\n\n    // Clear out any focused controls before inserting new page contents.\n    if (blurFocus) {\n      try {\n        document.activeElement.blur()\n      } catch (e) { /* ignore */ }\n    }\n\n    if (container.title) document.title = container.title\n\n    fire('pjax:beforeReplace', [container.contents, options], {\n      state: pjax.state,\n      previousState: previousState\n    })\n    context.html(container.contents)\n\n    // FF bug: Won't autofocus fields that are inserted via JS.\n    // This behavior is incorrect. So if theres no current focus, autofocus\n    // the last field.\n    //\n    // http://www.w3.org/html/wg/drafts/html/master/forms.html\n    var autofocusEl = context.find('input[autofocus], textarea[autofocus]').last()[0]\n    if (autofocusEl && document.activeElement !== autofocusEl) {\n      autofocusEl.focus()\n    }\n\n    executeScriptTags(container.scripts)\n\n    var scrollTo = options.scrollTo\n\n    // Ensure browser scrolls to the element referenced by the URL anchor\n    if (hash) {\n      var name = decodeURIComponent(hash.slice(1))\n      var target = document.getElementById(name) || document.getElementsByName(name)[0]\n      if (target) scrollTo = $(target).offset().top\n    }\n\n    if (typeof scrollTo == 'number') $(window).scrollTop(scrollTo)\n\n    fire('pjax:success', [data, status, xhr, options])\n  }\n\n\n  // Initialize pjax.state for the initial page load. Assume we're\n  // using the container and options of the link we're loading for the\n  // back button to the initial page. This ensures good back button\n  // behavior.\n  if (!pjax.state) {\n    pjax.state = {\n      id: uniqueId(),\n      url: window.location.href,\n      title: document.title,\n      container: options.container,\n      fragment: options.fragment,\n      timeout: options.timeout\n    }\n    window.history.replaceState(pjax.state, document.title)\n  }\n\n  // Cancel the current request if we're already pjaxing\n  abortXHR(pjax.xhr)\n\n  pjax.options = options\n  var xhr = pjax.xhr = $.ajax(options)\n\n  if (xhr.readyState > 0) {\n    if (options.push && !options.replace) {\n      // Cache current container element before replacing it\n      cachePush(pjax.state.id, [options.container, cloneContents(context)])\n\n      window.history.pushState(null, \"\", options.requestUrl)\n    }\n\n    fire('pjax:start', [xhr, options])\n    fire('pjax:send', [xhr, options])\n  }\n\n  return pjax.xhr\n}\n\n// Public: Reload current page with pjax.\n//\n// Returns whatever $.pjax returns.\nfunction pjaxReload(container, options) {\n  var defaults = {\n    url: window.location.href,\n    push: false,\n    replace: true,\n    scrollTo: false\n  }\n\n  return pjax($.extend(defaults, optionsFor(container, options)))\n}\n\n// Internal: Hard replace current state with url.\n//\n// Work for around WebKit\n//   https://bugs.webkit.org/show_bug.cgi?id=93506\n//\n// Returns nothing.\nfunction locationReplace(url) {\n  window.history.replaceState(null, \"\", pjax.state.url)\n  window.location.replace(url)\n}\n\n\nvar initialPop = true\nvar initialURL = window.location.href\nvar initialState = window.history.state\n\n// Initialize $.pjax.state if possible\n// Happens when reloading a page and coming forward from a different\n// session history.\nif (initialState && initialState.container) {\n  pjax.state = initialState\n}\n\n// Non-webkit browsers don't fire an initial popstate event\nif ('state' in window.history) {\n  initialPop = false\n}\n\n// popstate handler takes care of the back and forward buttons\n//\n// You probably shouldn't use pjax on pages with other pushState\n// stuff yet.\nfunction onPjaxPopstate(event) {\n\n  // Hitting back or forward should override any pending PJAX request.\n  if (!initialPop) {\n    abortXHR(pjax.xhr)\n  }\n\n  var previousState = pjax.state\n  var state = event.state\n  var direction\n\n  if (state && state.container) {\n    // When coming forward from a separate history session, will get an\n    // initial pop with a state we are already at. Skip reloading the current\n    // page.\n    if (initialPop && initialURL == state.url) return\n\n    if (previousState) {\n      // If popping back to the same state, just skip.\n      // Could be clicking back from hashchange rather than a pushState.\n      if (previousState.id === state.id) return\n\n      // Since state IDs always increase, we can deduce the navigation direction\n      direction = previousState.id < state.id ? 'forward' : 'back'\n    }\n\n    var cache = cacheMapping[state.id] || []\n    var containerSelector = cache[0] || state.container\n    var container = $(containerSelector), contents = cache[1]\n\n    if (container.length) {\n      if (previousState) {\n        // Cache current container before replacement and inform the\n        // cache which direction the history shifted.\n        cachePop(direction, previousState.id, [containerSelector, cloneContents(container)])\n      }\n\n      var popstateEvent = $.Event('pjax:popstate', {\n        state: state,\n        direction: direction\n      })\n      container.trigger(popstateEvent)\n\n      var options = {\n        id: state.id,\n        url: state.url,\n        container: containerSelector,\n        push: false,\n        fragment: state.fragment,\n        timeout: state.timeout,\n        scrollTo: false\n      }\n\n      if (contents) {\n        container.trigger('pjax:start', [null, options])\n\n        pjax.state = state\n        if (state.title) document.title = state.title\n        var beforeReplaceEvent = $.Event('pjax:beforeReplace', {\n          state: state,\n          previousState: previousState\n        })\n        container.trigger(beforeReplaceEvent, [contents, options])\n        container.html(contents)\n\n        container.trigger('pjax:end', [null, options])\n      } else {\n        pjax(options)\n      }\n\n      // Force reflow/relayout before the browser tries to restore the\n      // scroll position.\n      container[0].offsetHeight // eslint-disable-line no-unused-expressions\n    } else {\n      locationReplace(location.href)\n    }\n  }\n  initialPop = false\n}\n\n// Fallback version of main pjax function for browsers that don't\n// support pushState.\n//\n// Returns nothing since it retriggers a hard form submission.\nfunction fallbackPjax(options) {\n  var url = $.isFunction(options.url) ? options.url() : options.url,\n      method = options.type ? options.type.toUpperCase() : 'GET'\n\n  var form = $('<form>', {\n    method: method === 'GET' ? 'GET' : 'POST',\n    action: url,\n    style: 'display:none'\n  })\n\n  if (method !== 'GET' && method !== 'POST') {\n    form.append($('<input>', {\n      type: 'hidden',\n      name: '_method',\n      value: method.toLowerCase()\n    }))\n  }\n\n  var data = options.data\n  if (typeof data === 'string') {\n    $.each(data.split('&'), function(index, value) {\n      var pair = value.split('=')\n      form.append($('<input>', {type: 'hidden', name: pair[0], value: pair[1]}))\n    })\n  } else if ($.isArray(data)) {\n    $.each(data, function(index, value) {\n      form.append($('<input>', {type: 'hidden', name: value.name, value: value.value}))\n    })\n  } else if (typeof data === 'object') {\n    var key\n    for (key in data)\n      form.append($('<input>', {type: 'hidden', name: key, value: data[key]}))\n  }\n\n  $(document.body).append(form)\n  form.submit()\n}\n\n// Internal: Abort an XmlHttpRequest if it hasn't been completed,\n// also removing its event handlers.\nfunction abortXHR(xhr) {\n  if ( xhr && xhr.readyState < 4) {\n    xhr.onreadystatechange = $.noop\n    xhr.abort()\n  }\n}\n\n// Internal: Generate unique id for state object.\n//\n// Use a timestamp instead of a counter since ids should still be\n// unique across page loads.\n//\n// Returns Number.\nfunction uniqueId() {\n  return (new Date).getTime()\n}\n\nfunction cloneContents(container) {\n  var cloned = container.clone()\n  // Unmark script tags as already being eval'd so they can get executed again\n  // when restored from cache. HAXX: Uses jQuery internal method.\n  cloned.find('script').each(function(){\n    if (!this.src) $._data(this, 'globalEval', false)\n  })\n  return cloned.contents()\n}\n\n// Internal: Strip internal query params from parsed URL.\n//\n// Returns sanitized url.href String.\nfunction stripInternalParams(url) {\n  url.search = url.search.replace(/([?&])(_pjax|_)=[^&]*/g, '').replace(/^&/, '')\n  return url.href.replace(/\\?($|#)/, '$1')\n}\n\n// Internal: Parse URL components and returns a Locationish object.\n//\n// url - String URL\n//\n// Returns HTMLAnchorElement that acts like Location.\nfunction parseURL(url) {\n  var a = document.createElement('a')\n  a.href = url\n  return a\n}\n\n// Internal: Return the `href` component of given URL object with the hash\n// portion removed.\n//\n// location - Location or HTMLAnchorElement\n//\n// Returns String\nfunction stripHash(location) {\n  return location.href.replace(/#.*/, '')\n}\n\n// Internal: Build options Object for arguments.\n//\n// For convenience the first parameter can be either the container or\n// the options object.\n//\n// Examples\n//\n//   optionsFor('#container')\n//   // => {container: '#container'}\n//\n//   optionsFor('#container', {push: true})\n//   // => {container: '#container', push: true}\n//\n//   optionsFor({container: '#container', push: true})\n//   // => {container: '#container', push: true}\n//\n// Returns options Object.\nfunction optionsFor(container, options) {\n  if (container && options) {\n    options = $.extend({}, options)\n    options.container = container\n    return options\n  } else if ($.isPlainObject(container)) {\n    return container\n  } else {\n    return {container: container}\n  }\n}\n\n// Internal: Filter and find all elements matching the selector.\n//\n// Where $.fn.find only matches descendants, findAll will test all the\n// top level elements in the jQuery object as well.\n//\n// elems    - jQuery object of Elements\n// selector - String selector to match\n//\n// Returns a jQuery object.\nfunction findAll(elems, selector) {\n  return elems.filter(selector).add(elems.find(selector))\n}\n\nfunction parseHTML(html) {\n  return $.parseHTML(html, document, true)\n}\n\n// Internal: Extracts container and metadata from response.\n//\n// 1. Extracts X-PJAX-URL header if set\n// 2. Extracts inline <title> tags\n// 3. Builds response Element and extracts fragment if set\n//\n// data    - String response data\n// xhr     - XHR response\n// options - pjax options Object\n//\n// Returns an Object with url, title, and contents keys.\nfunction extractContainer(data, xhr, options) {\n  var obj = {}, fullDocument = /<html/i.test(data)\n\n  // Prefer X-PJAX-URL header if it was set, otherwise fallback to\n  // using the original requested url.\n  var serverUrl = xhr.getResponseHeader('X-PJAX-URL')\n  obj.url = serverUrl ? stripInternalParams(parseURL(serverUrl)) : options.requestUrl\n\n  var $head, $body\n  // Attempt to parse response html into elements\n  if (fullDocument) {\n    $body = $(parseHTML(data.match(/<body[^>]*>([\\s\\S.]*)<\\/body>/i)[0]))\n    var head = data.match(/<head[^>]*>([\\s\\S.]*)<\\/head>/i)\n    $head = head != null ? $(parseHTML(head[0])) : $body\n  } else {\n    $head = $body = $(parseHTML(data))\n  }\n\n  // If response data is empty, return fast\n  if ($body.length === 0)\n    return obj\n\n  // If there's a <title> tag in the header, use it as\n  // the page's title.\n  obj.title = findAll($head, 'title').last().text()\n\n  if (options.fragment) {\n    var $fragment = $body\n    // If they specified a fragment, look for it in the response\n    // and pull it out.\n    if (options.fragment !== 'body') {\n      $fragment = findAll($fragment, options.fragment).first()\n    }\n\n    if ($fragment.length) {\n      obj.contents = options.fragment === 'body' ? $fragment : $fragment.contents()\n\n      // If there's no title, look for data-title and title attributes\n      // on the fragment\n      if (!obj.title)\n        obj.title = $fragment.attr('title') || $fragment.data('title')\n    }\n\n  } else if (!fullDocument) {\n    obj.contents = $body\n  }\n\n  // Clean up any <title> tags\n  if (obj.contents) {\n    // Remove any parent title elements\n    obj.contents = obj.contents.not(function() { return $(this).is('title') })\n\n    // Then scrub any titles from their descendants\n    obj.contents.find('title').remove()\n\n    // Gather all script[src] elements\n    \n  }\n\n  // Trim any whitespace off the title\n  if (obj.title) obj.title = $.trim(obj.title)\n\n  return obj\n}\n\n// Load an execute scripts using standard script request.\n//\n// Avoids jQuery's traditional $.getScript which does a XHR request and\n// globalEval.\n//\n// scripts - jQuery object of script Elements\n//\n// Returns nothing.\nfunction executeScriptTags(scripts) {\n  if (!scripts) return\n\n  var existingScripts = $('script[src]')\n\n  scripts.each(function() {\n    var src = this.src\n    var matchedScripts = existingScripts.filter(function() {\n      return this.src === src\n    })\n    if (matchedScripts.length) return\n\n    var script = document.createElement('script')\n    var type = $(this).attr('type')\n    if (type) script.type = type\n    script.src = $(this).attr('src')\n    document.head.appendChild(script)\n  })\n}\n\n// Internal: History DOM caching class.\nvar cacheMapping      = {}\nvar cacheForwardStack = []\nvar cacheBackStack    = []\n\n// Push previous state id and container contents into the history\n// cache. Should be called in conjunction with `pushState` to save the\n// previous container contents.\n//\n// id    - State ID Number\n// value - DOM Element to cache\n//\n// Returns nothing.\nfunction cachePush(id, value) {\n  cacheMapping[id] = value\n  cacheBackStack.push(id)\n\n  // Remove all entries in forward history stack after pushing a new page.\n  trimCacheStack(cacheForwardStack, 0)\n\n  // Trim back history stack to max cache length.\n  trimCacheStack(cacheBackStack, pjax.defaults.maxCacheLength)\n}\n\n// Shifts cache from directional history cache. Should be\n// called on `popstate` with the previous state id and container\n// contents.\n//\n// direction - \"forward\" or \"back\" String\n// id        - State ID Number\n// value     - DOM Element to cache\n//\n// Returns nothing.\nfunction cachePop(direction, id, value) {\n  var pushStack, popStack\n  cacheMapping[id] = value\n\n  if (direction === 'forward') {\n    pushStack = cacheBackStack\n    popStack  = cacheForwardStack\n  } else {\n    pushStack = cacheForwardStack\n    popStack  = cacheBackStack\n  }\n\n  pushStack.push(id)\n  id = popStack.pop()\n  if (id) delete cacheMapping[id]\n\n  // Trim whichever stack we just pushed to to max cache length.\n  trimCacheStack(pushStack, pjax.defaults.maxCacheLength)\n}\n\n// Trim a cache stack (either cacheBackStack or cacheForwardStack) to be no\n// longer than the specified length, deleting cached DOM elements as necessary.\n//\n// stack  - Array of state IDs\n// length - Maximum length to trim to\n//\n// Returns nothing.\nfunction trimCacheStack(stack, length) {\n  while (stack.length > length)\n    delete cacheMapping[stack.shift()]\n}\n\n// Public: Find version identifier for the initial page load.\n//\n// Returns String version or undefined.\nfunction findVersion() {\n  return $('meta').filter(function() {\n    var name = $(this).attr('http-equiv')\n    return name && name.toUpperCase() === 'X-PJAX-VERSION'\n  }).attr('content')\n}\n\n// Install pjax functions on $.pjax to enable pushState behavior.\n//\n// Does nothing if already enabled.\n//\n// Examples\n//\n//     $.pjax.enable()\n//\n// Returns nothing.\nfunction enable() {\n  $.fn.pjax = fnPjax\n  $.pjax = pjax\n  $.pjax.enable = $.noop\n  $.pjax.disable = disable\n  $.pjax.click = handleClick\n  $.pjax.submit = handleSubmit\n  $.pjax.reload = pjaxReload\n  $.pjax.defaults = {\n    timeout: 650,\n    push: true,\n    replace: false,\n    type: 'GET',\n    dataType: 'html',\n    scrollTo: 0,\n    maxCacheLength: 20,\n    version: findVersion\n  }\n  $(window).on('popstate.pjax', onPjaxPopstate)\n}\n\n// Disable pushState behavior.\n//\n// This is the case when a browser doesn't support pushState. It is\n// sometimes useful to disable pushState for debugging on a modern\n// browser.\n//\n// Examples\n//\n//     $.pjax.disable()\n//\n// Returns nothing.\nfunction disable() {\n  $.fn.pjax = function() { return this }\n  $.pjax = fallbackPjax\n  $.pjax.enable = enable\n  $.pjax.disable = $.noop\n  $.pjax.click = $.noop\n  $.pjax.submit = $.noop\n  $.pjax.reload = function() { window.location.reload() }\n\n  $(window).off('popstate.pjax', onPjaxPopstate)\n}\n\n\n// Add the state property to jQuery's event object so we can use it in\n// $(window).bind('popstate')\nif ($.event.props && $.inArray('state', $.event.props) < 0) {\n  $.event.props.push('state')\n} else if (!('state' in $.Event.prototype)) {\n  $.event.addProp('state')\n}\n\n// Is pjax supported by this browser?\n$.support.pjax =\n  window.history && window.history.pushState && window.history.replaceState &&\n  // pushState isn't reliable on iOS until 5.\n  !navigator.userAgent.match(/((iPod|iPhone|iPad).+\\bOS\\s+[1-4]\\D|WebApps\\/.+CFNetwork)/)\n\nif ($.support.pjax) {\n  enable()\n} else {\n  disable()\n}\n\n})(jQuery)\n"
  },
  {
    "path": "assets/js/lazyloads.js",
    "content": "/*!\n * Lazy Load - JavaScript plugin for lazy loading images\n *\n * Copyright (c) 2007-2019 Mika Tuupola\n *\n * Licensed under the MIT license:\n *   http://www.opensource.org/licenses/mit-license.php\n *\n * Project home:\n *   https://appelsiini.net/projects/lazyload\n *\n * Version: 2.0.0-rc.2\n *\n */\n\n(function (root, factory) {\n    if (typeof exports === \"object\") {\n        module.exports = factory(root);\n    } else if (typeof define === \"function\" && define.amd) {\n        define([], factory);\n    } else {\n        root.LazyLoad = factory(root);\n    }\n}) (typeof global !== \"undefined\" ? global : this.window || this.global, function (root) {\n\n    \"use strict\";\n\n    if (typeof define === \"function\" && define.amd){\n        root = window;\n    }\n\n    const defaults = {\n        src: \"data-src\",\n        srcset: \"data-srcset\",\n        selector: \".lazyload\",\n        root: null,\n        rootMargin: \"0px\",\n        threshold: 0\n    };\n\n    /**\n    * Merge two or more objects. Returns a new object.\n    * @private\n    * @param {Boolean}  deep     If true, do a deep (or recursive) merge [optional]\n    * @param {Object}   objects  The objects to merge together\n    * @returns {Object}          Merged values of defaults and options\n    */\n    const extend = function ()  {\n\n        let extended = {};\n        let deep = false;\n        let i = 0;\n        let length = arguments.length;\n\n        /* Check if a deep merge */\n        if (Object.prototype.toString.call(arguments[0]) === \"[object Boolean]\") {\n            deep = arguments[0];\n            i++;\n        }\n\n        /* Merge the object into the extended object */\n        let merge = function (obj) {\n            for (let prop in obj) {\n                if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n                    /* If deep merge and property is an object, merge properties */\n                    if (deep && Object.prototype.toString.call(obj[prop]) === \"[object Object]\") {\n                        extended[prop] = extend(true, extended[prop], obj[prop]);\n                    } else {\n                        extended[prop] = obj[prop];\n                    }\n                }\n            }\n        };\n\n        /* Loop through each object and conduct a merge */\n        for (; i < length; i++) {\n            let obj = arguments[i];\n            merge(obj);\n        }\n\n        return extended;\n    };\n\n    function LazyLoad(images, options) {\n        this.settings = extend(defaults, options || {});\n        this.images = images || document.querySelectorAll(this.settings.selector);\n        this.observer = null;\n        this.init();\n    }\n\n    LazyLoad.prototype = {\n        init: function() {\n\n            /* Without observers load everything and bail out early. */\n            if (!root.IntersectionObserver) {\n                this.loadImages();\n                return;\n            }\n\n            let self = this;\n            let observerConfig = {\n                root: this.settings.root,\n                rootMargin: this.settings.rootMargin,\n                threshold: [this.settings.threshold]\n            };\n\n            this.observer = new IntersectionObserver(function(entries) {\n                Array.prototype.forEach.call(entries, function (entry) {\n                    if (entry.isIntersecting) {\n                        self.observer.unobserve(entry.target);\n                        let src = entry.target.getAttribute(self.settings.src);\n                        let srcset = entry.target.getAttribute(self.settings.srcset);\n                        if (\"img\" === entry.target.tagName.toLowerCase()) {\n                            if (src) {\n                                entry.target.src = src;\n                            }\n                            if (srcset) {\n                                entry.target.srcset = srcset;\n                            }\n                        } else {\n                            entry.target.style.backgroundImage = \"url(\" + src + \")\";\n                        }\n                    }\n                });\n            }, observerConfig);\n\n            Array.prototype.forEach.call(this.images, function (image) {\n                self.observer.observe(image);\n            });\n        },\n\n        loadAndDestroy: function () {\n            if (!this.settings) { return; }\n            this.loadImages();\n            this.destroy();\n        },\n\n        loadImages: function () {\n            if (!this.settings) { return; }\n\n            let self = this;\n            Array.prototype.forEach.call(this.images, function (image) {\n                let src = image.getAttribute(self.settings.src);\n                let srcset = image.getAttribute(self.settings.srcset);\n                if (\"img\" === image.tagName.toLowerCase()) {\n                    if (src) {\n                        image.src = src;\n                    }\n                    if (srcset) {\n                        image.srcset = srcset;\n                    }\n                } else {\n                    image.style.backgroundImage = \"url('\" + src + \"')\";\n                }\n            });\n        },\n\n        destroy: function () {\n            if (!this.settings) { return; }\n            this.observer.disconnect();\n            this.settings = null;\n        }\n    };\n\n    root.lazyload = function(images, options) {\n        return new LazyLoad(images, options);\n    };\n\n    if (root.jQuery) {\n        const $ = root.jQuery;\n        $.fn.lazyload = function (options) {\n            options = options || {};\n            options.attribute = options.attribute || \"data-src\";\n            new LazyLoad($.makeArray(this), options);\n            return this;\n        };\n    }\n\n    return LazyLoad;\n});\n"
  },
  {
    "path": "assets/js/modules/darkmode.js",
    "content": "//黑暗模式\nfunction darkMode(){\n    //黑暗模式\nif(setting.darkmode == 'true'){\n    const logo = $('#sitelogo').attr('src');\n    if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){\n    if(localStorage.getItem('theme') == 'dark'){\n      $('#sitelogo').attr(\"src\",setting.darkmode_logo);  \n    }\n    else{\n      $('#sitelogo').attr(\"src\",logo);    \n    }\n    }\n    if(setting.darkmodetype !== '' && setting.darkmodetype.indexOf(\"2\") !== -1){\n //跟随系统逻辑判断\n   const media = window.matchMedia('(prefers-color-scheme:dark)');\n   media.addEventListener('change',(e) => {\n       if (e.matches) {\n   $('#darkmode').attr(\"checked\", true);\n  document.documentElement.setAttribute('data-theme', 'dark');\n  localStorage.setItem('theme', 'dark');\n  \n  if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){\n   $('#sitelogo').attr(\"src\",setting.darkmode_logo);   \n  }\n  \n} else {\n    $('#darkmode').attr(\"checked\", false);\n  document.documentElement.setAttribute('data-theme', 'light');\n  localStorage.setItem('theme', 'light');\n  \n  if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){\n   $('#sitelogo').attr(\"src\",logo);   \n  }\n}\n});\n}\n\nif(setting.darkmodetype !== '' && setting.darkmodetype.indexOf(\"1\") != -1){\n//根据早晚时间自动设置\nconst nowtime = new Date().getHours();\nif(localStorage.getItem('clickmode') !== 'true'){\nif (nowtime >= 22 && nowtime <= 6 || nowtime === 22){\n    $('#darkmode').attr(\"checked\", true);\n  document.documentElement.setAttribute('data-theme', 'dark');\n  localStorage.setItem('theme', 'dark');\n  localStorage.setItem('automode', 'true');\n  if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){\n   $('#sitelogo').attr(\"src\",setting.darkmode_logo);   \n  }\n}\nelse{\n    if(localStorage.getItem(\"automode\") == 'true'){\n        localStorage.removeItem('automode');\n        \n        if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){\n   $('#sitelogo').attr(\"src\",logo);   \n  }\n  \n    }\n}\n}\n}\n\n\nconst currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;\n$('#darkmode').on('click',function(){\n    if (setting.Mournmode == 'true') {\n    $('body').toast({\n\n\t\t\t\t\t\t\t    title:'抱歉',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '当前处于哀悼模式，无法进入夜间模式哦~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t        return false;\n}\n\nif(localStorage.getItem(\"automode\") == 'true'){\n   localStorage.setItem('clickmode', 'true'); \n}\nelse{\n    localStorage.removeItem('clickmode');\n}\n\nif($('#darkmode').is(':checked')){\n    document.documentElement.setAttribute('data-theme', 'dark');\n  localStorage.setItem('theme', 'dark');\n  if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){\n   $('#sitelogo').attr(\"src\",setting.darkmode_logo);   \n  }\n  \n}\nelse{\n    document.documentElement.setAttribute('data-theme', 'light');\n  localStorage.setItem('theme', 'light');\n  if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){\n   $('#sitelogo').attr(\"src\",logo);   \n  }\n}\n});\n\n\n\nif (currentTheme && setting.Mournmode !== 'true') {\n document.documentElement.setAttribute('data-theme', currentTheme);\n  if (currentTheme === 'light') {\n       $('#darkmode').attr(\"checked\", false);\n\n  }\n  else if (currentTheme === 'dark') {\n    $('#darkmode').attr(\"checked\", true);\n    \n  }\n}\n\n\n\n}\n}\n\n\ndarkMode();"
  },
  {
    "path": "assets/js/nprogress.js",
    "content": "/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\n;(function(root, factory) {\n\n  if (typeof define === 'function' && define.amd) {\n    define(factory);\n  } else if (typeof exports === 'object') {\n    module.exports = factory();\n  } else {\n    root.NProgress = factory();\n  }\n\n})(this, function() {\n  var NProgress = {};\n\n  NProgress.version = '0.2.0';\n\n  var Settings = NProgress.settings = {\n    minimum: 0.08,\n    easing: 'ease',\n    positionUsing: '',\n    speed: 200,\n    trickle: true,\n    trickleRate: 0.02,\n    trickleSpeed: 800,\n    showSpinner: true,\n    barSelector: '[role=\"bar\"]',\n    spinnerSelector: '[role=\"spinner\"]',\n    parent: 'body',\n    template: '<div class=\"bar\" role=\"bar\"><div class=\"peg\"></div></div><div class=\"spinner\" role=\"spinner\"><div class=\"spinner-icon\"></div></div>'\n  };\n\n  /**\n   * Updates configuration.\n   *\n   *     NProgress.configure({\n   *       minimum: 0.1\n   *     });\n   */\n  NProgress.configure = function(options) {\n    var key, value;\n    for (key in options) {\n      value = options[key];\n      if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value;\n    }\n\n    return this;\n  };\n\n  /**\n   * Last number.\n   */\n\n  NProgress.status = null;\n\n  /**\n   * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.\n   *\n   *     NProgress.set(0.4);\n   *     NProgress.set(1.0);\n   */\n\n  NProgress.set = function(n) {\n    var started = NProgress.isStarted();\n\n    n = clamp(n, Settings.minimum, 1);\n    NProgress.status = (n === 1 ? null : n);\n\n    var progress = NProgress.render(!started),\n        bar      = progress.querySelector(Settings.barSelector),\n        speed    = Settings.speed,\n        ease     = Settings.easing;\n\n    progress.offsetWidth; /* Repaint */\n\n    queue(function(next) {\n      // Set positionUsing if it hasn't already been set\n      if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS();\n\n      // Add transition\n      css(bar, barPositionCSS(n, speed, ease));\n\n      if (n === 1) {\n        // Fade out\n        css(progress, { \n          transition: 'none', \n          opacity: 1 \n        });\n        progress.offsetWidth; /* Repaint */\n\n        setTimeout(function() {\n          css(progress, { \n            transition: 'all ' + speed + 'ms linear', \n            opacity: 0 \n          });\n          setTimeout(function() {\n            NProgress.remove();\n            next();\n          }, speed);\n        }, speed);\n      } else {\n        setTimeout(next, speed);\n      }\n    });\n\n    return this;\n  };\n\n  NProgress.isStarted = function() {\n    return typeof NProgress.status === 'number';\n  };\n\n  /**\n   * Shows the progress bar.\n   * This is the same as setting the status to 0%, except that it doesn't go backwards.\n   *\n   *     NProgress.start();\n   *\n   */\n  NProgress.start = function() {\n    if (!NProgress.status) NProgress.set(0);\n\n    var work = function() {\n      setTimeout(function() {\n        if (!NProgress.status) return;\n        NProgress.trickle();\n        work();\n      }, Settings.trickleSpeed);\n    };\n\n    if (Settings.trickle) work();\n\n    return this;\n  };\n\n  /**\n   * Hides the progress bar.\n   * This is the *sort of* the same as setting the status to 100%, with the\n   * difference being `done()` makes some placebo effect of some realistic motion.\n   *\n   *     NProgress.done();\n   *\n   * If `true` is passed, it will show the progress bar even if its hidden.\n   *\n   *     NProgress.done(true);\n   */\n\n  NProgress.done = function(force) {\n    if (!force && !NProgress.status) return this;\n\n    return NProgress.inc(0.3 + 0.5 * Math.random()).set(1);\n  };\n\n  /**\n   * Increments by a random amount.\n   */\n\n  NProgress.inc = function(amount) {\n    var n = NProgress.status;\n\n    if (!n) {\n      return NProgress.start();\n    } else {\n      if (typeof amount !== 'number') {\n        amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95);\n      }\n\n      n = clamp(n + amount, 0, 0.994);\n      return NProgress.set(n);\n    }\n  };\n\n  NProgress.trickle = function() {\n    return NProgress.inc(Math.random() * Settings.trickleRate);\n  };\n\n  /**\n   * Waits for all supplied jQuery promises and\n   * increases the progress as the promises resolve.\n   *\n   * @param $promise jQUery Promise\n   */\n  (function() {\n    var initial = 0, current = 0;\n\n    NProgress.promise = function($promise) {\n      if (!$promise || $promise.state() === \"resolved\") {\n        return this;\n      }\n\n      if (current === 0) {\n        NProgress.start();\n      }\n\n      initial++;\n      current++;\n\n      $promise.always(function() {\n        current--;\n        if (current === 0) {\n            initial = 0;\n            NProgress.done();\n        } else {\n            NProgress.set((initial - current) / initial);\n        }\n      });\n\n      return this;\n    };\n\n  })();\n\n  /**\n   * (Internal) renders the progress bar markup based on the `template`\n   * setting.\n   */\n\n  NProgress.render = function(fromStart) {\n    if (NProgress.isRendered()) return document.getElementById('nprogress');\n\n    addClass(document.documentElement, 'nprogress-busy');\n    \n    var progress = document.createElement('div');\n    progress.id = 'nprogress';\n    progress.innerHTML = Settings.template;\n\n    var bar      = progress.querySelector(Settings.barSelector),\n        perc     = fromStart ? '-100' : toBarPerc(NProgress.status || 0),\n        parent   = document.querySelector(Settings.parent),\n        spinner;\n    \n    css(bar, {\n      transition: 'all 0 linear',\n      transform: 'translate3d(' + perc + '%,0,0)'\n    });\n\n    if (!Settings.showSpinner) {\n      spinner = progress.querySelector(Settings.spinnerSelector);\n      spinner && removeElement(spinner);\n    }\n\n    if (parent != document.body) {\n      addClass(parent, 'nprogress-custom-parent');\n    }\n\n    parent.appendChild(progress);\n    return progress;\n  };\n\n  /**\n   * Removes the element. Opposite of render().\n   */\n\n  NProgress.remove = function() {\n    removeClass(document.documentElement, 'nprogress-busy');\n    removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent');\n    var progress = document.getElementById('nprogress');\n    progress && removeElement(progress);\n  };\n\n  /**\n   * Checks if the progress bar is rendered.\n   */\n\n  NProgress.isRendered = function() {\n    return !!document.getElementById('nprogress');\n  };\n\n  /**\n   * Determine which positioning CSS rule to use.\n   */\n\n  NProgress.getPositioningCSS = function() {\n    // Sniff on document.body.style\n    var bodyStyle = document.body.style;\n\n    // Sniff prefixes\n    var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' :\n                       ('MozTransform' in bodyStyle) ? 'Moz' :\n                       ('msTransform' in bodyStyle) ? 'ms' :\n                       ('OTransform' in bodyStyle) ? 'O' : '';\n\n    if (vendorPrefix + 'Perspective' in bodyStyle) {\n      // Modern browsers with 3D support, e.g. Webkit, IE10\n      return 'translate3d';\n    } else if (vendorPrefix + 'Transform' in bodyStyle) {\n      // Browsers without 3D support, e.g. IE9\n      return 'translate';\n    } else {\n      // Browsers without translate() support, e.g. IE7-8\n      return 'margin';\n    }\n  };\n\n  /**\n   * Helpers\n   */\n\n  function clamp(n, min, max) {\n    if (n < min) return min;\n    if (n > max) return max;\n    return n;\n  }\n\n  /**\n   * (Internal) converts a percentage (`0..1`) to a bar translateX\n   * percentage (`-100%..0%`).\n   */\n\n  function toBarPerc(n) {\n    return (-1 + n) * 100;\n  }\n\n\n  /**\n   * (Internal) returns the correct CSS for changing the bar's\n   * position given an n percentage, and speed and ease from Settings\n   */\n\n  function barPositionCSS(n, speed, ease) {\n    var barCSS;\n\n    if (Settings.positionUsing === 'translate3d') {\n      barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' };\n    } else if (Settings.positionUsing === 'translate') {\n      barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' };\n    } else {\n      barCSS = { 'margin-left': toBarPerc(n)+'%' };\n    }\n\n    barCSS.transition = 'all '+speed+'ms '+ease;\n\n    return barCSS;\n  }\n\n  /**\n   * (Internal) Queues a function to be executed.\n   */\n\n  var queue = (function() {\n    var pending = [];\n    \n    function next() {\n      var fn = pending.shift();\n      if (fn) {\n        fn(next);\n      }\n    }\n\n    return function(fn) {\n      pending.push(fn);\n      if (pending.length == 1) next();\n    };\n  })();\n\n  /**\n   * (Internal) Applies css properties to an element, similar to the jQuery \n   * css method.\n   *\n   * While this helper does assist with vendor prefixed property names, it \n   * does not perform any manipulation of values prior to setting styles.\n   */\n\n  var css = (function() {\n    var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ],\n        cssProps    = {};\n\n    function camelCase(string) {\n      return string.replace(/^-ms-/, 'ms-').replace(/-([\\da-z])/gi, function(match, letter) {\n        return letter.toUpperCase();\n      });\n    }\n\n    function getVendorProp(name) {\n      var style = document.body.style;\n      if (name in style) return name;\n\n      var i = cssPrefixes.length,\n          capName = name.charAt(0).toUpperCase() + name.slice(1),\n          vendorName;\n      while (i--) {\n        vendorName = cssPrefixes[i] + capName;\n        if (vendorName in style) return vendorName;\n      }\n\n      return name;\n    }\n\n    function getStyleProp(name) {\n      name = camelCase(name);\n      return cssProps[name] || (cssProps[name] = getVendorProp(name));\n    }\n\n    function applyCss(element, prop, value) {\n      prop = getStyleProp(prop);\n      element.style[prop] = value;\n    }\n\n    return function(element, properties) {\n      var args = arguments,\n          prop, \n          value;\n\n      if (args.length == 2) {\n        for (prop in properties) {\n          value = properties[prop];\n          if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value);\n        }\n      } else {\n        applyCss(element, args[1], args[2]);\n      }\n    }\n  })();\n\n  /**\n   * (Internal) Determines if an element or space separated list of class names contains a class name.\n   */\n\n  function hasClass(element, name) {\n    var list = typeof element == 'string' ? element : classList(element);\n    return list.indexOf(' ' + name + ' ') >= 0;\n  }\n\n  /**\n   * (Internal) Adds a class to an element.\n   */\n\n  function addClass(element, name) {\n    var oldList = classList(element),\n        newList = oldList + name;\n\n    if (hasClass(oldList, name)) return; \n\n    // Trim the opening space.\n    element.className = newList.substring(1);\n  }\n\n  /**\n   * (Internal) Removes a class from an element.\n   */\n\n  function removeClass(element, name) {\n    var oldList = classList(element),\n        newList;\n\n    if (!hasClass(element, name)) return;\n\n    // Replace the class name.\n    newList = oldList.replace(' ' + name + ' ', ' ');\n\n    // Trim the opening and closing spaces.\n    element.className = newList.substring(1, newList.length - 1);\n  }\n\n  /**\n   * (Internal) Gets a space separated list of the class names on the element. \n   * The list is wrapped with a single space on each end to facilitate finding \n   * matches within the list.\n   */\n\n  function classList(element) {\n    return (' ' + (element.className || '') + ' ').replace(/\\s+/gi, ' ');\n  }\n\n  /**\n   * (Internal) Removes an element from the DOM.\n   */\n\n  function removeElement(element) {\n    element && element.parentNode && element.parentNode.removeChild(element);\n  }\n\n  return NProgress;\n});\n\n"
  },
  {
    "path": "assets/js/progress.js",
    "content": "(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));"
  },
  {
    "path": "assets/js/sw-toolbox.js",
    "content": "/* \n Copyright 2016 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/!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)});"
  },
  {
    "path": "assets/js/tokeninput.js",
    "content": "!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:\"&times;\",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);"
  },
  {
    "path": "assets/vendors/bangumi/bangumi.css",
    "content": ".tab {\n  padding-top: 10px;\n  position: relative;\n  overflow: hidden;\n  margin: 0 auto;\n  line-height: 1.5;\n  font-weight: 300;\n  color: #888;\n  -webkit-font-smoothing: antialiased;\n}\n\n.tabs {\n  display: table;\n  position: relative;\n  overflow: hidden;\n  margin: 0;\n  width: 100%;\n  list-style:none!important;\n}\n.tabs li {\n  float: left;\n  line-height: 38px;\n  overflow: hidden;\n  padding: 0;\n  position: relative;\n}\n.tabs a{\n  background-color: #eff0f2;\n  border-bottom: 1px solid #000;\n  color: #888;\n  font-weight: 500;\n  display: block;\n  letter-spacing: 0;\n  outline: none;\n  padding: 0 20px;\n  text-decoration: none;\n  -webkit-transition: all 0.2s ease-in-out;\n  -moz-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  border-bottom: 2px solid #000;\n  cursor:pointer;\n}\n\n.tabs_item {\n  display: none;\n  padding: 30px 0;\n}\n.tabs_item h4 {\n  font-weight: bold;\n  color: #fff;\n  font-size: 20px;\n}\n.tabs_item img {\n  width: 200px;\n  float: left;\n  margin-right: 30px;\n}\n.tabs_item:first-child {\n  display: block;\n}\n\n.current a{\n  color:#fff;\n  background: #000;\n}\n.current{\n  color: #fff;\n\n}\n.bangumiboard-list{\n    display: flex;\n    flex-flow: row wrap;\n    justify-content: flex-start;\n    margin-top: 1em;\n    width: calc(100% + 15px);\n    margin-left: -15px;\n}\n.bangumiboard-list,.bangumiboard-list *{\n    box-sizing: border-box;\n}\n.bangumiboard-item {\n    position: relative;\n    cursor: pointer;\n    box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);\n    transition: ease all 0.3s;\n    overflow: hidden;\n    background: #f7fbf7;\n    display: flex;\n    flex-flow: column nowrap;\n    justify-content: flex-start;\n    border: none!important;\n    display: block;\n    margin-left: 15px;\n    margin-bottom: 15px;\n    border-radius:8px;\n}\n.bangumiboard-item:hover{\n    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);\n}\n.bangumiboard-thumb {\n    width: 100%;\n    /* customize this for diffrent style */\n    padding-top: 141%;\n    background-repeat: no-repeat;\n    background-size: cover;\n}\n.bangumiboard-title,.bangumiboard-title a{\n    margin: 8px 0!important;\n    font-size: 1.2em!important;\n    overflow: hidden!important;\n    text-overflow: ellipsis!important;\n    white-space: nowrap !important;\n    text-align: center !important;\n    color: #202020 !important;\n    font-weight: 700 !important;\n    border:none !important;\n    padding:8px!important;\n}\n/* detail panel */\n.bangumiboard-info{\n    position: absolute;\n    top:0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    transition: all 0.3s;\n    background-color: #f7fbf7;\n    color: black;\n    font-size: 0.9em;\n    line-height: 1.3em;\n    transform: translateY(100%);\n    padding: 0.5em;\n    font-size: 16px;\n    font-weight: 400;\n}\n.bangumiboard-info::-webkit-scrollbar{\n    background: none;\n    width: 4px;\n    height: 6px;\n    border-radius:2px;\n}\n.bangumiboard-info::-webkit-scrollbar-thumb{\n    background: rgba(0,0,0,0.2);\n    border-radius:2px;\n    line-height: 1.15;\n    font-size: 1em;\n}\n.bangumiboard-info::-webkit-scrollbar-thumb:hover{\n    background: rgba(0,0,0,0.6);\n}\n.bangumiboard-info-show > .bangumiboard-info{\n    transform: translateY(0);\n}\n/* special for bangumi */\n.bangumiboard-info>.bangumiboard-info-basic{\n    white-space: nowrap!important;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n/* loadmore button (span) */\n.bangumi-loadmore{\n    display: block;\n    padding: 0.3em;\n    background: #000;\n    color: white;\n    transition:0.2s;\n    margin: 20px auto!important;\n    width: 6em;\n    text-align: center;\n    cursor: pointer;\n    border-radius:5px;\n}\n.bangumi-loadmore:hover{\n    background: rgba(0,0,0,0.6);\n}\n\n/* media query for responsive design */\n@media screen and (max-width: 767.5px){\n    .bangumiboard-item{\n        width: calc(33.333333333% - 15px);\n    }\n}\n@media screen and (min-width:767.5px){\n    .bangumiboard-item{\n        width: calc(25% - 15px);\n    }\n}\n@media screen and (max-width:450px){\n    .bangumiboard-item{\n        width: calc(50% - 15px);\n    }\n}\n\n.bangumi-single{\n    max-width: 100%;\n    height: 230px;\n    box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);\n    border-radius: 8px;\n    overflow: hidden;\n    position: relative;\n}\n.bangumi-single-img{\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 22%;\n    height: 100%;\n    float: left;\n    background-size: cover;\n    background-position: center center;\n}\n.bangumi-single-info{\n    position: absolute;\n    width: 76%;\n    height: 100%;\n    top: 0;\n    right: 0;\n    margin-left: 24%;\n    overflow-y: auto;\n    -webkit-overflow-scrolling: touch;\n    padding: 0.2em 0.5em 0.5em 0;\n    font-size: 16px;\n    font-weight: 400;\n    line-height: 1.4;\n}\n.bangumi-single-info::-webkit-scrollbar{\n    background: none;\n    width: 4px;\n    height: 6px;\n    border-radius:2px;\n}\n.bangumi-single-info::-webkit-scrollbar-thumb{\n    background: rgba(0,0,0,0.2);\n    border-radius:2px;\n    line-height: 1.15;\n    font-size: 1em;\n}\n.bangumi-single-info::-webkit-scrollbar-thumb:hover{\n    background: rgba(0,0,0,0.6);\n}\n.bangumi-single-summary{\n    margin-top: 0.3em;\n    display: inline-block;\n}\n.bangumi-single-title{\n    font-size: 1.3em;\n    color: #1abc9c;\n    text-decoration: none;\n    padding: 0;\n    margin: 0;\n    border:none!important;\n}\n.bangumi-single-rating{\n    background-image: url(/usr/plugins/bangumiBoard/assets/rating.png);\n    display: inline-block;\n    width: 75px;\n    height: 15px;\n}\n.bangumi-single-meta{\n    font-size: 0.8em;\n    font-size: 0.8em;\n    display: inline-block;\n    margin: 0.5em 0;\n    opacity: 0.5;\n}\n@media screen and (max-width:767px){\n    .bangumi-single{\n        height: 160px;\n    }\n    .bangumi-single-img{\n        width: 32%;\n    }\n    .bangumi-single-info{\n        margin-left: 35%;\n        width: 65%;\n    }\n}"
  },
  {
    "path": "assets/vendors/bangumi/bangumi.js",
    "content": "// Author:熊猫小A\n// Modified:Whitebear(whitebear@msn.com)\n\nvar curMovies_watched = 0;\nvar curMovies_acg= 0;\nvar curMovies_watching = 0;\nvar curMovies_wish = 0;\nvar curMovies_on_hold = 0;\nvar curMovies_dropped = 0;\nBangumiBoard = {\n    initBangumiBoard: function () {\n        $(`.bangumi-movie-list[data-status=\"acg\"]`).after(`<div class=\"bangumi-loadmore\" id=\"loadMoreMovies_acg\" onclick=\"BangumiBoard.loadBangumi('acg');\">加载更多</div>`);\n        $(`.bangumi-movie-list[data-status=\"watched\"]`).after(`<div class=\"bangumi-loadmore\" id=\"loadMoreMovies_watched\" onclick=\"BangumiBoard.loadBangumi('watched');\">加载更多</div>`);\n        $(`.bangumi-movie-list[data-status=\"watching\"]`).after(`<div class=\"bangumi-loadmore\" id=\"loadMoreMovies_watching\" onclick=\"BangumiBoard.loadBangumi('watching');\">加载更多</div>`);\n        $(`.bangumi-movie-list[data-status=\"wish\"]`).after(`<div class=\"bangumi-loadmore\" id=\"loadMoreMovies_wish\" onclick=\"BangumiBoard.loadBangumi('wish');\">加载更多</div>`);\n        $(`.bangumi-movie-list[data-status=\"on_hold\"]`).after(`<div class=\"bangumi-loadmore\" id=\"loadMoreMovies_on_hold\" onclick=\"BangumiBoard.loadBangumi('on_hold');\">加载更多</div>`);\n        $(`.bangumi-movie-list[data-status=\"dropped\"]`).after(`<div class=\"bangumi-loadmore\" id=\"loadMoreMovies_dropped\" onclick=\"BangumiBoard.loadBangumi('dropped');\">加载更多</div>`);\n        curMovies_watched = 0;\n        curMovies_watching = 0;\n        curMovies_wish = 0;\n        curMovies_on_hold = 0;\n        curMovies_dropped = 0;\n        curMovies_acg = 0;\n        BangumiBoard.loadBangumi('watched');\n        BangumiBoard.loadBangumi('watching');\n        BangumiBoard.loadBangumi('wish');\n        BangumiBoard.loadBangumi('on_hold');\n        BangumiBoard.loadBangumi('dropped');\n        BangumiBoard.loadBangumi('acg');\n    },\n    \n    loadBangumi: function (status) {\n        if ($(`.bangumi-movie-list[data-status=\"` + status + `\"]`).length < 1) return;\n        $(\"#loadMoreMovies_\" + status).html(\"加载中...\");\n\n        var curMovies;\n        if (status == 'watched') curMovies = curMovies_watched;\n        else if (status == 'watching') curMovies = curMovies_watching;\n        else if (status == 'on_hold') curMovies = curMovies_on_hold;\n        else if (status == 'dropped') curMovies = curMovies_dropped;\n        else if (status == 'acg') curMovies = curMovies_acg;\n        else curMovies = curMovies_wish;\n        if(status == 'acg'){\n         $.getJSON(window.BangumiAPI + \"?type=bilibili&from=\" + String(curMovies) + \"&status=\" + status, function (result) {\n            $(\"#loadMoreMovies_\" + status).html(\"加载更多\");\n            if (result.length < BangumiPageSize) {\n                $(\"#loadMoreMovies_\" + status).html(\"没有啦\");\n            }\n            $.each(result, function (i, item) {\n                var html = `<a href=\"` + item.url + `\" target=\"_blank\" id=\"bangumiboard-movie-item-` + String(curMovies) + `\" class=\"bangumiboard-item\" title=\"`+ item.name + `\">\n                            <div class=\"bangumiboard-thumb\" id=\"bangumiboard-movie-bg-item-` + String(curMovies) + `\" style=\"background-image:url(`+ item.img + `)\"></div>\n                            <div class=\"bangumiboard-title\">`+ item.name + `</div>\n                        </a>`;\n                $(`.bangumi-movie-list[data-status=\"` + status + `\"]`).append(html);\n               curMovies_acg++;\n              \n            });\n            \n        });    \n        }\n        else{\n        $.getJSON(window.BangumiAPI + \"?type=bangumi&from=\" + String(curMovies) + \"&status=\" + status, function (result) {\n            $(\"#loadMoreMovies_\" + status).html(\"加载更多\");\n            if (result.length < BangumiPageSize) {\n                $(\"#loadMoreMovies_\" + status).html(\"没有啦\");\n            }\n            $.each(result, function (i, item) {\n                var html = `<a href=\"` + item.url + `\" target=\"_blank\" id=\"bangumiboard-movie-item-` + String(curMovies) + `\" class=\"bangumiboard-item\" title=\"`+ item.name + `\">\n                            <div class=\"bangumiboard-thumb\" style=\"background-image:url(`+ item.img + `)\"></div>\n                            <div class=\"bangumiboard-title\">`+ item.name + `</div>\n                        </a>`;\n                $(`.bangumi-movie-list[data-status=\"` + status + `\"]`).append(html);\n                if (status == 'watched') curMovies_watched++;\n                else if (status == 'watching') curMovies_watching++;\n                else if (status == 'on_hold') curMovies = curMovies_on_hold++;\n                else if (status == 'dropped') curMovies = curMovies_dropped++;\n                else curMovies_wish++;\n            });\n        });\n        }\n    },\n\n}\n$(document).ready(function () {\n    BangumiBoard.initBangumiBoard();\n})\n\n\n\n$(document).click(function (e) {\n    var target = e.target;\n    $(\".bangumiboard-item\").removeClass(\"bangumiboard-info-show\");\n    $(\".bangumiboard-item\").each(function () {\n        if ($(target).parent()[0] == $(this)[0] || $(target) == $(this)[0]) {\n            $(this).addClass(\"bangumiboard-info-show\");\n        }\n    })\n})\n"
  },
  {
    "path": "assets/vendors/bs-audio/audio.css",
    "content": ".BAudio {\nmargin:10px 0 10px 0;\n    }\n\n    .toLus {\n      display: block;\n      position: absolute;\n      top: 0;\n      left: 0;\n    }\n\n    .toLus img {\n      display: block;\n      width: 40px;\n      height: 40px;\n    }\n.BAudio {\n  display: flex;\n  width: 100%;\n  color: #333;\n  font-family: Arial, Helvetica, sans-serif;\n  overflow: hidden;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  line-height: normal;\n  position: relative;\n  --theme-color: #d72630;\n}\n\n.BAudio .BAudio-artword {\n  width: 160px;\n  height: 160px;\n  margin-right: 15px;\n}\n\n.BAudio .BAudio-artword .BAudio-figure {\n  display: block;\n  width: 100%;\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  background-color: #f8f8f8;\n}\n\n.BAudio .BAudio-artword .BAudio-pic {\n  display: block;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n\n.BAudio .BAudio-content {\n  flex: 1;\n}\n\n.BAudio .BAudio-content .BAudio-header {\n  display: flex;\n  align-items: center;\n  padding: 5px 0 7px;\n}\n\n.BAudio .BAudio-content .BAudio-play {\n  width: 38px;\n  height: 38px;\n  border-radius: 50%;\n  color: #fff;\n  background-color: var(--theme-color);\n  margin-right: 5px;\n  cursor: not-allowed;\n  position: relative;\n}\n\n.BAudio.load .BAudio-content .BAudio-play {\n  cursor: pointer;\n}\n\n.BAudio .BAudio-content .BAudio-play svg {\n  position: absolute;\n  top: 8px;\n  left: 10px;\n  width: 22px;\n  height: 22px;\n}\n\n.BAudio .BAudio-content .BAudio-play svg path {\n  fill: #fff;\n}\n\n.BAudio .BAudio-content .BAudio-play__pause,\n.BAudio.play .BAudio-content .BAudio-play__playing {\n  visibility: visible;\n}\n\n.BAudio .BAudio-content .BAudio-play__playing,\n.BAudio.play .BAudio-content .BAudio-play__pause {\n  visibility: hidden;\n}\n\n.BAudio .BAudio-content .BAudio-play__playing {\n  left: 8px;\n}\n\n.BAudio .BAudio-content .BAudio-container {\n  flex: 1;\n}\n\n.BAudio .BAudio-content .BAudio-author {\n  font-size: 12px;\n  color: #999;\n  font-weight: 300;\n  margin: 0;\n}\n\n.BAudio .BAudio-content .BAudio-title {\n  font-size: 15px;\n  margin: 0;\n}\n\n.BAudio .BAudio-content .BAudio-time {\n  color: #ccc;\n  font-size: 12px;\n  font-weight: 100;\n  line-height: 1;\n}\n\n.BAudio .BAudio-content .BAudio-main {\n  width: 100%;\n  position: relative;\n}\n\n.BAudio .BAudio-content .BAudio-waveform {\n  width: 100%;\n  height: 60px;\n  cursor: pointer;\n  opacity: 0.8;\n  transform: scaleY(0);\n  transform-origin: left 75%;\n  transition: all 0.3s ease-out;\n  position: relative;\n}\n\n.BAudio .BAudio-content .BAudio-waveform::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: var(--bar-left);\n  width: 1px;\n  height: 100%;\n  opacity: 0;\n  background-color: var(--theme-color);\n  transition: opacity 0.3s ease-out;\n}\n\n.BAudio .BAudio-content .BAudio-waveform:hover,\n.BAudio.start .BAudio-content .BAudio-waveform,\n.BAudio .BAudio-content .BAudio-waveform:hover::before {\n  opacity: 1;\n}\n\n.BAudio.load .BAudio-content .BAudio-waveform {\n  transform: scaleY(1);\n}\n\n.BAudio .BAudio-content .BAudio-waveform .BAudio-pro {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0;\n  height: 60px;\n  overflow: hidden;\n  background-color: transparent;\n}\n\n.BAudio .BAudio-content .BAudio-current,\n.BAudio .BAudio-content .BAudio-total{\n  position: absolute;\n  top: 50px;\n  color: #fff;\n  padding: 3px 2px;\n  font-size: 15px;\n  line-height: 1;\n  opacity: 0;\n  border-radius:5px;\n}\n.BAudio .BAudio-content .BAudio-totaltip{\n    position: absolute;\n  top: 50px;\n  color: #999;\n  padding: 3px 2px;\n  font-size: 15px;\n  line-height: 1;\n  border-radius:5px;\n}\n.BAudio .BAudio-content .BAudio-current {\n  left:0;\n  z-index: 9;\n  color: #999;\n}\n\n.BAudio.start .BAudio-content .BAudio-current {\n  opacity: 1;\n}\n\n.BAudio .BAudio-content .BAudio-total {\n  right:0;\n  color: #999;\n\n}\n\n.BAudio.load .BAudio-content .BAudio-total {\n  opacity: 1;\n  animation: opacity 0.6s linear;\n}\n\n.BAudio .BAudio-content .BAudio-comments {\n  width: 100%;\n  position: relative;\n}\n\n.BAudio .BAudio-content .BAudio-wrapper {\n  position: absolute;\n  top: -15px;\n  left: 0;\n  width: 100%;\n  height: 12px;\n  cursor: pointer;\n}\n\n.BAudio .BAudio-content .BAudio-wrapper__item {\n  position: absolute;\n  top: 0;\n  left: 10px;\n  width: 12px;\n  height: 12px;\n  background-color: #222;\n  background-repeat: no-repeat;\n  background-size: cover;\n}\n\n.BAudio .BAudio-content .BAudio-wrapper__item.current {\n  border-radius: 50%;\n  box-shadow: 1px 2px 6px #6c6c6c;\n  z-index: 9;\n}\n\n.BAudio .BAudio-content .BAudio-popover {\n  display: flex;\n  width: 100%;\n  height: 30px;\n  line-height: 30px;\n  font-size: 12px;\n  box-sizing: border-box;\n  transition: all 0.3s ease-out;\n}\n\n.BAudio .BAudio-content .BAudio-popover-wrapper {\n  position: absolute;\n  top: 4px;\n  left: 0;\n  line-height: 1;\n  opacity: 0;\n  transition: top 0.25s, opacity 0.25s;\n}\n\n.BAudio\n  .BAudio-content\n  .BAudio-wrapper.active\n  ~ .BAudio-popover\n  .BAudio-popover-wrapper {\n  top: 7px;\n  opacity: 1;\n}\n\n.BAudio .BAudio-content .BAudio-popover-wrapper__user {\n  display: block;\n  float: left;\n  color: var(--theme-color);\n  padding: 0 8px;\n  text-decoration: none;\n  position: relative;\n}\n\n.BAudio .BAudio-content .BAudio-popover-wrapper__user::before {\n  content: '';\n  display: block;\n  position: absolute;\n  top: -12px;\n  left: 0;\n  width: 1px;\n  height: 200%;\n  background-image: linear-gradient(\n    rgba(255, 85, 0, 0.95),\n    rgba(255, 85, 0, 0.1)\n  );\n}\n\n.BAudio\n  .BAudio-content\n  .BAudio-popover-wrapper.right\n  .BAudio-popover-wrapper__user {\n  float: right;\n}\n\n.BAudio .BAudio-content .BAudio-popover-wrapper.right,\n.BAudio\n  .BAudio-content\n  .BAudio-popover-wrapper.right\n  .BAudio-popover-wrapper__user::before {\n  right: 0;\n  left: auto;\n}\n\n.BAudio .BAudio-content .BAudio-popover-wrapper__comment {\n  color: #666;\n  float: left;\n  margin: 0;\n}\n\n.BAudio .BAudio-content .BAudio-comments-from {\n  width: 100%;\n  height: 0;\n  opacity: 0;\n  padding: 5px 5px 5px 25px;\n  background-color: #f2f2f2;\n  border: 1px solid #e5e5e5;\n  box-sizing: border-box;\n  overflow: hidden;\n  position: relative;\n  transition: all 0.3s ease-out;\n}\n\n.BAudio.start .BAudio-content .BAudio-comments-from,\n.BAudio.comment .BAudio-content .BAudio-comments-from {\n  opacity: 1;\n  height: 32px;\n}\n\n.BAudio .BAudio-content .BAudio-comments-from::before {\n  content: '';\n  position: absolute;\n  top: 6px;\n  left: 6px;\n  width: 19px;\n  height: 19px;\n  background-image: linear-gradient(135deg, #846170, #70929c);\n}\n\n.BAudio .BAudio-content .BAudio-comments-from__input {\n  width: 100%;\n  height: 20px;\n  border-radius: 0 4px 4px 0;\n  padding: 0 9px;\n  font-size: 12px;\n  outline: none;\n  cursor: pointer;\n  border: 1px solid #e5e5e5;\n  border-left: none;\n  box-sizing: border-box;\n}\n\n.BAudio .BAudio-content .BAudio-footer {\n  position: relative;\n  box-sizing: border-box;\n  margin-top: 10px;\n}\n\n.BAudio .BAudio-content .BAudio-list {\n  border-radius: 0 0 4px 4px;\n  border: 1px solid #f2f2f2;\n  font-size: 12px;\n  overflow: hidden;\n}\n\n.BAudio .BAudio-content .BAudio-list-container {\n  max-height: 150px;\n  overflow-y: hidden;\n  transition: max-height 0.3s;\n}\n\n.BAudio .BAudio-content .BAudio-list-container.active {\n  overflow-y: scroll;\n  max-height: 300px;\n}\n\n.BAudio .BAudio-content .BAudio-list-wrapper {\n  margin: 0;\n  padding: 0;\n  transition: all 0.6s;\n}\n\n.BAudio .BAudio-content .BAudio-list-wrapper__item {\n  width: 100%;\n  height: 30px;\n  display: flex;\n  align-items: center;\n  padding: 0 5px;\n  box-sizing: border-box;\n  color: #ccc;\n  cursor: not-allowed;\n  border-bottom: 1px solid #f2f2f2;\n  transition: all 0.3s;\n}\n\n.BAudio .BAudio-content .BAudio-list-wrapper__item:last-child {\n  border-bottom: none;\n}\n\n.BAudio .BAudio-content .BAudio-list-wrapper__item.active,\n.BAudio .BAudio-content .BAudio-list-wrapper__item:hover,\n.BAudio .BAudio-content .BAudio-more:hover {\n  background-color: #f2f2f2;\n}\n\n.BAudio .BAudio-content .BAudio-list-wrapper__item-img {\n  display: block;\n  width: 20px;\n  height: 20px;\n  margin-right: 5px;\n  opacity: 0.5;\n  transition: all 0.3s;\n}\n\n.BAudio .BAudio-content .BAudio-list-wrapper__item-number {\n  margin-right: 5px;\n  font-size: 12px;\n  line-height: 1;\n  color: #ccc;\n  transition: all 0.3s;\n}\n\n.BAudio .BAudio-content .BAudio-list-wrapper__item-content {\n  flex: 1;\n  font-size: 0;\n}\n\n.BAudio .BAudio-content .BAudio-list-wrapper__item-user,\n.BAudio .BAudio-content .BAudio-list-wrapper__item-title {\n  display: inline-block;\n  font-size: 12px;\n  line-height: 1;\n  margin-right: 5px;\n}\n\n.BAudio .BAudio-content .BAudio-list-wrapper__item-title {\n  color: #ccc;\n  transition: all 0.3s;\n}\n\n.BAudio .BAudio-content .BAudio-list-bar {\n  position: absolute;\n  top: 4px;\n  right: 4px;\n  width: 6px;\n  height: 30px;\n  background-color: #ccc;\n  border-radius: 6px;\n  opacity: 0;\n  transition: opacity 0.6s;\n}\n\n.BAudio .BAudio-content .BAudio-list-bar.active,\n.BAudio .BAudio-content .BAudio-list-container.active:hover .BAudio-list-bar {\n  opacity: 1;\n}\n\n.BAudio .BAudio-content .BAudio-more {\n  text-align: center;\n  padding: 5px 10px;\n  color: #999;\n  border: none;\n  font-size: 12px;\n  cursor: pointer;\n}\n\n.BAudio.load .BAudio-content .BAudio-list-wrapper__item {\n  color: #999;\n  cursor: pointer;\n}\n\n.BAudio.load .BAudio-content .BAudio-list-wrapper__item-img {\n  opacity: 1;\n}\n\n.BAudio.load .BAudio-content .BAudio-list-wrapper__item-number,\n.BAudio.load .BAudio-content .BAudio-list-wrapper__item-title {\n  color: #333;\n}\n\n.BAudio\n  .BAudio-content\n  .BAudio-list-wrapper__item.isload\n  .BAudio-list-wrapper__item-number,\n.BAudio\n  .BAudio-content\n  .BAudio-list-wrapper__item.isload\n  .BAudio-list-wrapper__item-title,\n.BAudio\n  .BAudio-content\n  .BAudio-list-wrapper__item.isload\n  .BAudio-list-wrapper__item-user {\n  color: #b5b5b5;\n}\n\n.BAudio\n  .BAudio-content\n  .BAudio-list-wrapper__item.isload\n  .BAudio-list-wrapper__item-img {\n  opacity: 0.5;\n}\n\n.BAudio\n  .BAudio-content\n  .BAudio-list-wrapper__item.active\n  .BAudio-list-wrapper__item-number\n  .BAudio\n  .BAudio-content\n  .BAudio-list-wrapper__item.active\n  .BAudio-list-wrapper__item-user,\n.BAudio\n  .BAudio-content\n  .BAudio-list-wrapper__item.active\n  .BAudio-list-wrapper__item-title {\n  color: var(--theme-color);\n}\n\n.BAudio\n  .BAudio-content\n  .BAudio-list-wrapper__item.active\n  .BAudio-list-wrapper__item-img {\n  opacity: 1;\n}\n\n.BAudio .BAudio-content .BAudio-list-container.active::-webkit-scrollbar {\n  width: 0;\n  height: 0;\n}\n\n@keyframes opacity {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n"
  },
  {
    "path": "assets/vendors/bs-audio/audio.js",
    "content": "//根据YAudio修改适配并进行优化处理\n(function (window) {\n  var BAudio = function (params) {\n    var defaultOption = {\n      element: null,\n      autoplay: false,\n      audio: null,\n      playIndex: 0,\n      barColor: '#666666',\n      proBarColor: '#fe4f58,#b1060f'\n    }\n    // 合并后的参数\n    this.option = Object.assign({}, defaultOption, params)\n    // 歌曲索引\n    this.playIndex = this._isArray(this.option.audio)\n      ? this.option.playIndex\n      : -1\n    // 是否是单曲\n    this.single =\n      (this._isArray(this.option.audio) && this.option.audio.length === 1) ||\n      !this._isArray(this.option.audio)\n    this.music = this.getMusic(this.playIndex)\n    // 是否正在播放\n    this.playing = false\n    // 鼠标是否正在 波形 滑动中\n    this.moving = false\n    // 是否音频加载完成\n    this.load = false\n    // 是否已经开始播放\n    this.start = false\n    // 进度是否滚动到评论区\n    this.commentMoving = false\n    // 保存音频\n    this.audioMap = new Map()\n    // 保存滚动的参数\n    this.data = {\n      offsetTop: 0,\n      pageY: 0,\n      touching: false\n    }\n\n    this.init()\n\n    this.setMusic(this.playIndex, 'click')\n  }\n\n  BAudio.prototype = {\n    init: function () {\n      var element =\n        'string' === typeof this.option.element\n          ? document.querySelector(this.option.element)\n          : this.option.element\n      if (!element) {\n        throw new Error('必须要一个容器承载')\n      }\n\n      this.bindHandlers()\n      // 获取评论列表\n      this.getCommentList()\n      this.initDom()\n      this.attachDomEvents()\n    },\n    bindHandlers: function () {\n      for (var methodName of [\n        'onWaveformClick',\n        'onWaveformMouseMove',\n        'onWaveformMouseLeave',\n\n        'onCommentMouseMove',\n        'onCommentMouseLeave',\n\n        'onAudioEnd',\n        'onAudioLoadedData',\n        'onAudioDurationChange',\n\n        'onAudilListScroll',\n        'onAudioListClick',\n        'onAudioListMore',\n\n        'onScrollBarMousedown',\n        'onScrollBarMousemove',\n        'onScrollBarMouseup',\n\n        'onPlay',\n        'onSubmit'\n      ]) {\n        this[methodName] = this[methodName].bind(this)\n      }\n    },\n    initDom: function () {\n      var element = this.option.element\n      var html = `\n        <div class=\"BAudio-content\">\n          <headers class=\"BAudio-header\">\n            <div class=\"BAudio-play\">\n              <svg\n                class=\"BAudio-play__pause\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                version=\"1.1\"\n                viewBox=\"0 0 16 31\"\n              >\n                <path\n                  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\"\n                ></path>\n              </svg>\n              <svg\n                class=\"BAudio-play__playing\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                version=\"1.1\"\n                viewBox=\"0 0 17 32\"\n              >\n                <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>\n            </div>\n            <div class=\"BAudio-container\">\n              <p class=\"BAudio-author\">${this.music.artist}</p>\n              <p class=\"BAudio-title\">${this.music.name}</p>\n            </div>\n          </headers>\n          <main class=\"BAudio-main\">\n            <div class=\"BAudio-waveform\" style=\"display:none\">\n              <canvas class=\"BAudio-waveform-canvas\"></canvas>\n              <div class=\"BAudio-pro\" style=\"display:none\">\n                <canvas class=\"BAudio-pro-canvas\"></canvas>\n              </div>\n            </div>\n            ${\n              this.single\n                ? `\n                <div class=\"BAudio-comments\">\n                  <div class=\"BAudio-wrapper\"></div>\n                  <div class=\"BAudio-popover\">\n                    <div class=\"BAudio-popover-wrapper\">\n                      <a href=\"javascript:;\" class=\"BAudio-popover-wrapper__user\">中原</a>\n                      <p class=\"BAudio-popover-wrapper__comment\">这是一条评论！</p>\n                    </div>\n                  </div>\n                  <div class=\"BAudio-comments-from\">\n                    <input class=\"BAudio-comments-from__input\" placeholder=\"评论一下吧\" />\n                  </div>\n                </div>\n              `\n                : ``\n            }\n              \n          </main><br>\n        <time class=\"BAudio-current\">00:00</time>\n        <div class=\"BAudio-totaltip\">加载中，请稍候~~</div>\n            <time class=\"BAudio-total\">00:00</time>\n          ${\n            !this.single\n              ? `\n              <footer class=\"BAudio-footer\">\n                <div class=\"BAudio-list\">\n                  <div class=\"BAudio-list-container\">\n                    <ul class=\"BAudio-list-wrapper\">\n                    ${this.option.audio\n                      .map(\n                        (_, i) =>\n                          `\n                          <li class=\"BAudio-list-wrapper__item\">\n                            <img class=\"BAudio-list-wrapper__item-img\" src=\"${\n                              _.pic\n                            }\" />\n                            <div class=\"BAudio-list-wrapper__item-number\">${\n                              i + 1\n                            }</div>\n                            <div class=\"BAudio-list-wrapper__item-content\">\n                              <span class=\"BAudio-list-wrapper__item-user\">${\n                                _.artist\n                              } -</span>\n                              <span class=\"BAudio-list-wrapper__item-title\">${\n                                _.name\n                              }</span>\n                            </div>\n                            <div class=\"BAudio-list-wrapper__item-btn\"></div>\n                          </li>\n                        `\n                      )\n                      .join('')}\n                    </ul>\n                  </div>\n                  <div class=\"BAudio-more\">查看更多 ${\n                    this.option.audio.length\n                  } 首</div>\n                </div>\n              </footer>\n            `\n              : ``\n          }\n        </div>\n      `\n      element.insertAdjacentHTML('beforeEnd', html)\n    },\n    initAudio: function () {\n      // 创建一个音频上下文\n      var audioCtx = (this.audioCtx = new (window.AudioContext ||\n        window.webkitAudioContext)())\n\n      // 创建一个分析音频模块\n      this.analyser = audioCtx.createAnalyser()\n      // 设置音频的数量大小 默认是2048\n      this.analyser.fftSize = 512\n\n      // 关联音频\n      this.analyser.connect(audioCtx.destination)\n\n      // 对音频进行解码\n      this.decodeArrayBuffer()\n    },\n    decodeArrayBuffer: function () {\n      var self = this\n\n      this.width = this.waveform.clientWidth\n      this.height = this.waveform.clientHeight\n\n      this.audioCtx.decodeAudioData(\n        this.arraybuffer,\n        function (buffer) {\n          var pcm = self.loadDecodedBuffer(buffer)\n          self.pcm = pcm\n          self.pcmToCanvas(pcm)\n        },\n        function (err) {\n          console.log(err)\n        }\n      )\n    },\n    loadDecodedBuffer: function (buffer) {\n      var accuracy = 100\n      // 创建 AudioBufferSourceNode\n      this.befferSource = this.audioCtx.createBufferSource()\n      // 讲解码之后的 buffer 放到 AudioBufferSourceNode 的 buffer 中\n      this.befferSource.buffer = buffer\n      this.befferSource.connect(this.analyser)\n\n      // 返回计算断开时波形的最大值和最小值\n      var peaks = this.drawPeaks()\n\n      return peaks.map(function (item) {\n        return Math.abs(Math.round(item * accuracy) / accuracy)\n      })\n    },\n    drawPeaks: function () {\n      var befferSource = this.befferSource.buffer,\n        length = 200\n      var sampleSize = befferSource.length / length\n      var sampleStep = ~~(sampleSize / 10) || 1\n      var channels = befferSource.numberOfChannels\n      var splitPeaks = []\n      var mergedPeaks = []\n\n      for (var c = 0; c < channels; c++) {\n        var peaks = (splitPeaks[c] = [])\n        var chan = befferSource.getChannelData(c)\n\n        for (var i = 0; i < length; i++) {\n          var start = ~~(i * sampleSize)\n          var end = ~~(start + sampleSize)\n          var min = 0\n          var max = 0\n\n          for (var j = start; j < end; j += sampleStep) {\n            var value = chan[j]\n\n            if (value > max) {\n              max = value\n            }\n\n            if (value < min) {\n              min = value\n            }\n          }\n\n          peaks[2 * i] = max\n          peaks[2 * i + 1] = min\n\n          if (c == 0 || max > mergedPeaks[2 * i]) {\n            mergedPeaks[2 * i] = max\n          }\n\n          if (c == 0 || min < mergedPeaks[2 * i + 1]) {\n            mergedPeaks[2 * i + 1] = min\n          }\n        }\n      }\n\n      return mergedPeaks\n    },\n    drawCanvas: function (canvas, peaks, color) {\n      var bar_space = 1,\n        botSize = 0.25,\n        self = this\n\n      var ctx = canvas.getContext('2d')\n      var ratio = self._getPixelRatio(ctx)\n\n      canvas.width = self.width * ratio\n      canvas.height = self.height * ratio\n      canvas.style.width = self.width + 'px'\n      canvas.style.height = self.height + 'px'\n\n      ctx.scale(ratio, ratio)\n      ctx.imageSmoothingEnabled = false\n      ctx.imageSmoothing = false\n      ctx.imageSmoothingQuality = 'high'\n      ctx.webkitImageSmoothing = false\n\n      var max = Math.max.apply(null, peaks)\n\n      var newArr = []\n      for (var i = 0; i < peaks.length; i++) {\n        newArr[i] = parseFloat(peaks[i] / Number(max))\n      }\n\n      var barCount = self.width / 3\n\n      var bar_w = Math.ceil(self.width / barCount)\n\n      var topSize = 1 - botSize\n      var lastBarHeight = 0\n      var searched_index = null\n      var proBarColors = []\n\n      function drawBars(isReflection) {\n        for (var i = 0; i < barCount; i++) {\n          ctx.save()\n\n          searched_index = Math.ceil(i * (newArr.length / barCount))\n\n          if (i < barCount / 5) {\n            if (newArr[searched_index] < 0.1) {\n              newArr[searched_index] = 0.1\n            }\n          }\n          if (\n            newArr.length > barCount * 2.5 &&\n            i > 0 &&\n            i < newArr.length - 1\n          ) {\n            newArr[searched_index] =\n              Math.abs(\n                newArr[searched_index] +\n                  newArr[searched_index - 1] +\n                  newArr[searched_index + 1]\n              ) / 3\n          }\n\n          var targetRatio = isReflection ? botSize : topSize\n\n          var barHeight = Math.abs(\n            newArr[searched_index] * self.height * targetRatio\n          )\n\n          if (isNaN(lastBarHeight)) {\n            lastBarHeight = 0\n          }\n          barHeight = barHeight / 1.5 + lastBarHeight / 2.5\n          lastBarHeight = barHeight\n\n          ctx.lineWidth = 0\n          barHeight = Math.floor(barHeight)\n          var barPositionTop = isReflection\n            ? self.height * topSize\n            : Math.ceil(self.height * targetRatio - barHeight)\n\n          ctx.beginPath()\n          ctx.rect(i * bar_w, barPositionTop, bar_w - bar_space, barHeight)\n\n          if (isReflection) {\n            ctx.fillStyle = self.hexToRgb(color, 0.25)\n          } else {\n            ctx.fillStyle = color\n          }\n\n          if (color === self.option.proBarColor) {\n            if (color.indexOf(',') > -1) {\n              proBarColors = color.split(',')\n            }\n            if (proBarColors.length) {\n              var startColor = isReflection\n                ? self.hexToRgb(proBarColors[0], 0.25)\n                : proBarColors[0]\n              var endColor = isReflection\n                ? self.hexToRgb(proBarColors[1], 0.25)\n                : proBarColors[1]\n\n              gradient = ctx.createLinearGradient(0, 0, 0, self.height)\n              gradient.addColorStop(0, startColor)\n              gradient.addColorStop(1, endColor)\n              ctx.fillStyle = gradient\n            }\n          }\n\n          ctx.fill()\n          ctx.closePath()\n          ctx.restore()\n        }\n      }\n      ctx.clearRect(0, 0, self.width, self.height)\n      drawBars()\n      drawBars(true)\n    },\n    ready: function () {\n      var element = this.option.element,\n        playIndex = this.playIndex\n      if (\n        (playIndex > -1 && !this.audioMap.get(playIndex)) ||\n        playIndex === -1\n      ) {\n        this.audio = document.createElement('audio')\n        this.audio.src = this.music.url\n        this.audio.preload = 'metadata'\n        this.audio.volume = 0.7\n      } else {\n        this.audio = this.audioMap.get(playIndex)\n      }\n\n      this.load = true\n      this.attachAudioEvents()\n      element.classList.add('load')\n      element.querySelector('.BAudio-author').innerHTML = this.music.artist\n      element.querySelector('.BAudio-title').innerHTML = this.music.name\n\n      if (this.option.autoplay && !this._isMobile()) {\n        this.onPlay()\n      }\n      this.option.autoplay = true\n\n      if (playIndex > -1) {\n        this.audio.pcm = this.pcm\n        this.audioMap.set(playIndex, this.audio)\n      }\n    },\n    onWaveformClick: function (event) {\n      if (!this.playing && !this.start) return\n      var element = this.option.element\n      var duration = this.audio.duration\n      var x = event.pageX\n      var left = x - event.currentTarget.getBoundingClientRect().left\n      var time = (left / this.width) * duration\n\n      var totalWidth = element.querySelector('.BAudio-total').clientWidth\n\n      this.audio.currentTime = time\n\n      if (this.width - left > totalWidth) {\n        element.querySelector('.BAudio-current').style.left = left + 'px'\n      } else {\n        element.querySelector('.BAudio-current').style.left =\n          this.width - totalWidth + 'px'\n      }\n\n      event.currentTarget.style.setProperty('--bar-left', left + 'px')\n      element.querySelector('.BAudio-pro').style.width = left + 'px'\n      element.querySelector('.BAudio-current').innerHTML = this.formatTime(time)\n\n      this.single && this.renderComment(left)\n    },\n    onWaveformMouseMove: function (event) {\n      var element = this.option.element\n      var duration = this.audio.duration\n      var x = event.pageX\n      var left = x - event.currentTarget.getBoundingClientRect().left\n      var time = (left / this.width) * duration\n\n      this.moving = true\n      event.currentTarget.style.setProperty('--bar-left', left + 'px')\n      element.querySelector('.BAudio-current').innerHTML = this.formatTime(time)\n    },\n    onWaveformMouseLeave: function () {\n      var element = this.option.element\n\n      this.moving = false\n      element.querySelector('.BAudio-current').innerHTML = this.formatTime(\n        this.audio.currentTime\n      )\n    },\n    onCommentMouseMove: function (event) {\n      this.commentMoving = true\n      var element = this.option.element,\n        currentTarget = event.currentTarget\n\n      element.classList.add('comment')\n      currentTarget.classList.add('current')\n\n      this.single && this.renderComment(currentTarget.offsetLeft)\n    },\n    onCommentMouseLeave: function (event) {\n      this.commentMoving = false\n      var element = this.option.element,\n        currentTarget = event.currentTarget,\n        wrapper = element.querySelector('.BAudio-wrapper')\n\n      wrapper.classList.remove('active')\n      currentTarget.classList.remove('current')\n    },\n    onAudioError: function () {\n      this.waveform.innerHTML = ' - Error happens ╥﹏╥'\n    },\n    onAudioEnd: function () {\n      this.resetMusic()\n      if (this.playIndex < this.option.audio.length - 1) {\n        this.setMusic(this.playIndex, 'next')\n      } else {\n        this.audioPause()\n      }\n    },\n    onAudioLoadedData: function () {\n      var self = this\n      var element = this.option.element,\n        commentList = this.commentList,\n        wrapper = element.querySelector('.BAudio-wrapper')\n\n      wrapper.innerHTML = ''\n      commentList.forEach(function (item) {\n        var left = (item.duration / self.audio.duration) * self.width\n        var obj = {\n          class: 'BAudio-wrapper__item',\n          style:\n            'left: ' + left + 'px;background-image: url(' + item.avatar + ')',\n          'data-user': item.user,\n          'data-text': item.text\n        }\n        var comment = document.createElement('div')\n        for (var [key, value] of Object.entries(obj)) {\n          comment.setAttribute(key, value)\n        }\n        wrapper.appendChild(comment)\n        self.addEvent(comment, 'mousemove', self.onCommentMouseMove)\n        self.addEvent(comment, 'mouseleave', self.onCommentMouseLeave)\n      })\n    },\n    onAudioDurationChange: function () {\n      var element = this.option.element\n      var duration = this.audio.duration\n      if (duration !== 1) {\n          $('.BAudio-totaltip').fadeOut();\n        element.querySelector('.BAudio-total').innerHTML =\n          this.formatTime(duration)\n          \n      }\n    },\n    onAudilListScroll: function () {\n      var element = this.option.element,\n        container = element.querySelector('.BAudio-list-container'),\n        wrapper = element.querySelector('.BAudio-list-wrapper'),\n        bar = element.querySelector('.BAudio-list-bar')\n\n      var wHeight = wrapper.offsetHeight\n      var cHeight = container.offsetHeight\n\n      var top = (container.scrollTop * cHeight) / wHeight\n\n      if (bar) {\n        bar.style.top = top + 'px'\n      }\n    },\n    onAudioListClick: function (event) {\n      var element = this.option.element,\n        items = element.querySelectorAll('.BAudio-list-wrapper__item'),\n        item = event.target\n      var target = item.closest('.BAudio-list-wrapper__item')\n\n      var index = this._getIndex(target)\n\n      for (var i = 0, len = items.length; i < len; i++) {\n        items[i].classList.remove('active')\n      }\n\n      items[index].classList.add('active')\n\n      this.resetMusic()\n      this.audioPause()\n      this.setMusic(index, 'click')\n    },\n    onAudioListMore: function () {\n      var self = this\n      var element = this.option.element,\n        container = element.querySelector('.BAudio-list-container'),\n        wrapper = element.querySelector('.BAudio-list-wrapper'),\n        more = element.querySelector('.BAudio-more'),\n        height = 30\n\n      if (container.classList.contains('active')) {\n        container.classList.remove('active')\n        more.innerHTML = `查看更多 ${this.option.audio.length} 首`\n\n        element.querySelector('.BAudio-list-bar').remove()\n\n        container.scrollTo({\n          top: height * this.playIndex,\n          behavior: 'smooth'\n        })\n      } else {\n        container.classList.add('active')\n        more.innerHTML = `收起`\n\n        setTimeout(function () {\n          var wHeight = wrapper.offsetHeight\n          var cHeight = container.offsetHeight\n\n          var height = cHeight * (cHeight / wHeight)\n          var top = (container.scrollTop * cHeight) / wHeight\n\n          var bar = document.createElement('div')\n          bar.className = 'BAudio-list-bar'\n          bar.style.height = height + 'px'\n          bar.style.top = top + 'px'\n\n          self.addEvent(bar, 'mousedown', self.onScrollBarMousedown)\n\n          container.appendChild(bar)\n        }, 300)\n      }\n    },\n    onScrollBarMousedown: function (event) {\n      event.preventDefault()\n      var bar = event.target\n\n      this.data.offsetTop = bar.offsetTop\n      this.data.mouseY = event.pageY\n      this.data.touching = true\n\n      bar.classList.add('active')\n      this.addEvent(document, 'mousemove', this.onScrollBarMousemove)\n      this.addEvent(document, 'mouseup', this.onScrollBarMouseup)\n    },\n    onScrollBarMousemove: function (event) {\n      event.preventDefault()\n      if (!this.data.touching) return\n      var element = this.option.element,\n        container = element.querySelector('.BAudio-list-container'),\n        wrapper = element.querySelector('.BAudio-list-wrapper'),\n        bar = element.querySelector('.BAudio-list-bar'),\n        data = this.data\n\n      var wHeight = wrapper.offsetHeight\n      var cHeight = container.offsetHeight\n\n      var diff = (wHeight * cHeight) / wHeight - bar.offsetHeight\n      var diff2 = data.offsetTop + (event.pageY - data.mouseY)\n      var top = 0\n\n      if (data.offsetTop + (event.pageY - data.mouseY) <= 0) {\n        top = 0\n      } else if (data.offsetTop + (event.pageY - data.mouseY) >= diff) {\n        top = diff\n      } else {\n        top = diff2\n      }\n\n      bar.style.top = top + 'px'\n\n      container.scrollTop = bar.offsetTop * (wHeight / cHeight)\n    },\n    onScrollBarMouseup: function () {\n      var element = this.option.element,\n        bar = element.querySelector('.BAudio-list-bar')\n\n      this.data.touching = false\n\n      bar.classList.remove('active')\n      this.removeEvent(document, 'mousemove', this.onScrollBarMousemove)\n      this.removeEvent(document, 'mouseup', this.onScrollBarMouseup)\n    },\n    onPlay: function () {\n      if (!this.load) return\n      var element = this.option.element,\n        width = this.width,\n        self = this\n\n      var totalWidth = element.querySelector('.BAudio-total').clientWidth\n\n      this.playing = !this.playing\n\n      if (this.playing) {\n        this.audio.play()\n        this.start = true\n        element.classList.add('start')\n        element.classList.add('play')\n\n        function getCurrentTime() {\n          var proBarWidth =\n            (self.audio.currentTime / self.audio.duration) * width\n\n          if (proBarWidth > width) {\n            proBarWidth = width\n          }\n\n          if (!self.commentMoving && self.single) {\n            // 渲染评论\n            self.renderComment(proBarWidth)\n          }\n\n          if (!self.moving) {\n            element.querySelector('.BAudio-current').innerHTML =\n              self.formatTime(self.audio.currentTime)\n          }\n\n          if (self.width - proBarWidth > totalWidth) {\n            element.querySelector('.BAudio-current').style.left =\n              proBarWidth + 'px'\n          }\n\n          element.querySelector('.BAudio-pro').style.width = proBarWidth + 'px'\n\n          if (self.playing) {\n            requestAnimationFrame(getCurrentTime)\n          }\n        }\n        requestAnimationFrame(getCurrentTime)\n      } else {\n        this.audioPause()\n      }\n    },\n    onSubmit: function (event) {\n      console.log(11)\n      var duration = this.audio.currentTime\n      if (event.keyCode === 13) {\n        var text = event.target.value\n        this.commentList.push({\n          duration: duration,\n          avatar: './1.jpeg',\n          user: '周杰伦',\n          text: text\n        })\n        this.onAudioLoadedData()\n      }\n    },\n    audioPause: function () {\n      var element = this.option.element\n\n      this.audio.pause()\n      this.playing = false\n      element.classList.remove('play')\n    },\n    attachDomEvents: function () {\n      var element = this.option.element\n      this.waveform = element.querySelector('.BAudio-waveform')\n\n      this.addEvent(this.waveform, 'click', this.onWaveformClick)\n      this.addEvent(this.waveform, 'mousemove', this.onWaveformMouseMove)\n      this.addEvent(this.waveform, 'mouseleave', this.onWaveformMouseLeave)\n\n      !this.single &&\n        this.addEvent(\n          element.querySelector('.BAudio-list-container'),\n          'scroll',\n          this.onAudilListScroll\n        )\n      !this.single &&\n        this.addEvent(\n          element.querySelector('.BAudio-list-wrapper'),\n          'click',\n          this.onAudioListClick\n        )\n      !this.single &&\n        this.addEvent(\n          element.querySelector('.BAudio-more'),\n          'click',\n          this.onAudioListMore\n        )\n\n      this.addEvent(element.querySelector('.BAudio-play'), 'click', this.onPlay)\n\n      this.single &&\n        this.addEvent(\n          element.querySelector('.BAudio-comments-from__input'),\n          'keydown',\n          this.onSubmit\n        )\n    },\n    attachAudioEvents: function () {\n      this.addEvent(this.audio, 'error', this.onAudioError)\n      this.addEvent(this.audio, 'ended', this.onAudioEnd)\n      this.addEvent(this.audio, 'durationchange', this.onAudioDurationChange)\n\n      this.single &&\n        this.addEvent(this.audio, 'loadeddata', this.onAudioLoadedData)\n    },\n    hexToRgb: function (hex, palpha) {\n      var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n      var str = ''\n      if (result) {\n        result = {\n          r: parseInt(result[1], 16),\n          g: parseInt(result[2], 16),\n          b: parseInt(result[3], 16)\n        }\n\n        str =\n          'rgba(' +\n          result.r +\n          ',' +\n          result.g +\n          ',' +\n          result.b +\n          ',' +\n          (palpha ? palpha : 1) +\n          ')'\n      }\n\n      return str\n    },\n    formatTime: function (time) {\n      time = time | 0\n      var minute = (time / 60) | 0\n      var second = this._pad(time % 60)\n      return minute + ':' + second\n    },\n    addEvent: function (elm, type, fn) {\n      if (window.attachEvent) {\n        elm.attachEvent('on' + type, fn)\n      } else if (window.addEventListener) {\n        elm.addEventListener(type, fn, false)\n      } else {\n        elm['on' + type] = fn\n      }\n    },\n    removeEvent: function (elm, type, fn) {\n      if (window.detachEvent) {\n        elm.detachEvent('on' + type, fn)\n      } else if (window.removeEventListener) {\n        elm.removeEventListener(type, fn, false)\n      } else {\n        elm['on' + type] = null\n      }\n    },\n    renderComment: function (offsetLeft) {\n      var element = this.option.element,\n        popover = element.querySelector('.BAudio-popover-wrapper'),\n        wrapper = element.querySelector('.BAudio-wrapper'),\n        user = popover.querySelector('.BAudio-popover-wrapper__user'),\n        comment = popover.querySelector('.BAudio-popover-wrapper__comment'),\n        items = element.querySelectorAll('.BAudio-wrapper__item')\n\n      items.forEach(function (item) {\n        item.classList.remove('current')\n      })\n      var index = this._findClosestElementIndex(items, offsetLeft)\n\n      if (index === -1) {\n        wrapper.classList.remove('active')\n        return\n      }\n\n      if (offsetLeft < this.width / 2) {\n        popover.classList.remove('right')\n\n        popover.style.right = 'auto'\n        popover.style.left = items[index].offsetLeft + 'px'\n      } else {\n        popover.classList.add('right')\n\n        popover.style.left = 'auto'\n        popover.style.right =\n          this.width - items[index].offsetLeft - items[index].clientWidth + 'px'\n      }\n      wrapper.classList.add('active')\n      items[index].classList.add('current')\n      user.innerHTML = items[index].getAttribute('data-user')\n      comment.innerHTML = items[index].getAttribute('data-text')\n    },\n    getCommentList: function () {\n      this.commentList = [\n        {\n          duration: 8,\n          avatar: 'https://cdn.staticaly.com/gh/ZHOUYUANN/BlogBed@master/1.1mq8h4qx4ups.webp?raw=true',\n          user: '卷灯酒',\n          text: '哈哈哈哈哈'\n        },\n        {\n          duration: 40,\n          avatar: 'https://cdn.staticaly.com/gh/ZHOUYUANN/BlogBed@master/2.11s74qf2536o.webp?raw=true',\n          user: '深院空巷',\n          text: '我是一只小可爱'\n        },\n        {\n          duration: 42,\n          avatar: 'https://cdn.staticaly.com/gh/ZHOUYUANN/BlogBed@master/4.56lixtsqn0s0.webp?raw=true',\n          user: '周大帅',\n          text: '我是大帅哥！！！'\n        },\n        {\n          duration: 44,\n          avatar: 'https://cdn.staticaly.com/gh/ZHOUYUANN/BlogBed@master/3.5z5sa9i3xwg0.webp?raw=true',\n          user: '孤痞°',\n          text: '当爱情遗落成遗迹 用象形刻划成回忆'\n        },\n        {\n          duration: 146,\n          avatar: 'https://cdn.staticaly.com/gh/ZHOUYUANN/BlogBed@master/20210127165426_83208.5u72n89gbas0.gif?raw=true',\n          user: '莫忘初心丶',\n          text: '垃圾王者荣耀'\n        }\n      ]\n    },\n    getMusic: function (index) {\n      return index > -1 ? this.option.audio[index] : this.option.audio\n    },\n    setMusic: function (index, type) {\n      var self = this\n      var element = this.option.element,\n        container = element.querySelector('.BAudio-list-container'),\n        items = element.querySelectorAll('.BAudio-list-wrapper__item'),\n        height = 30\n      if (this.single) {\n        this.getMusicArrayBuffer(function () {\n          self.initAudio()\n        })\n        return\n      }\n      if (type === 'next') {\n        if (this.playIndex > -1) {\n          index++\n        }\n      }\n      items[this.playIndex].classList.remove('active')\n      items[this.playIndex].classList.add('isload')\n      items[index].classList.add('active')\n      this.playIndex = index\n      this.music = this.getMusic(this.playIndex)\n\n      var audio = this.audioMap.get(this.playIndex)\n      if (audio && audio.pcm) {\n        setTimeout(function () {\n          self.pcm = audio.pcm\n          self.pcmToCanvas(audio.pcm)\n        }, 300)\n      } else {\n        this.getMusicArrayBuffer(function () {\n          self.initAudio()\n        })\n      }\n      if (!container.classList.contains('active')) {\n        // 滚动列表\n        container.scrollTo({\n          top: height * this.playIndex,\n          behavior: 'smooth'\n        })\n      }\n    },\n    resetMusic: function () {\n      var element = this.option.element\n\n      this.load = false\n      this.start = false\n      this.playing = false\n      this.audio.currentTime = 0\n\n      element.classList.remove('load')\n      element.classList.remove('start')\n      element.classList.remove('play')\n    },\n    getMusicArrayBuffer: function (callback) {\n      var self = this\n      var xhr = new XMLHttpRequest()\n      xhr.open('GET', this.music.url, true)\n      xhr.responseType = 'arraybuffer'\n      xhr.onreadystatechange = function () {\n        if (xhr.readyState === 4) {\n          if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {\n            self.arraybuffer = xhr.response\n            callback()\n          } else {\n            throw new Error('获取音频地址失败: ' + xhr.status)\n          }\n        }\n      }\n      xhr.send()\n    },\n    pcmToCanvas: function (pcm) {\n      var element = this.option.element,\n        barColor = this.option.barColor,\n        proBarColor = this.option.proBarColor\n      this.drawCanvas(\n        element.querySelector('.BAudio-waveform-canvas'),\n        pcm,\n        barColor\n      )\n      this.drawCanvas(\n        element.querySelector('.BAudio-pro-canvas'),\n        pcm,\n        proBarColor\n      )\n      this.ready()\n    },\n    _getPixelRatio: function (context) {\n      var backingStore =\n        context.backingStorePixelRatio ||\n        context.webkitBackingStorePixelRatio ||\n        context.mozBackingStorePixelRatio ||\n        context.msBackingStorePixelRatio ||\n        context.oBackingStorePixelRatio ||\n        context.backingStorePixelRatio ||\n        1\n      return (window.devicePixelRatio || 1) / backingStore\n    },\n    _pad: function (num) {\n      var len = num.toString().length\n      while (len < 2) {\n        num = '0' + num\n        len++\n      }\n      return num\n    },\n    _isMobile: function () {\n      return navigator.userAgent.match(\n        /(iPad)|(iPhone)|(iPod)|(android)|(webOS)/i\n      )\n    },\n    _getIndex: function (ele) {\n      var index = 0\n      for (var p = ele.previousSibling; p; ) {\n        if (p.nodeType == 1) {\n          index++\n        }\n        p = p.previousSibling\n      }\n      return index\n    },\n    _findClosestElementIndex: function (elements, offsetLeft) {\n      var elementsArr = [].slice.call(elements)\n      var result = elementsArr.reduce(\n        function (last, current, index) {\n          var difference = offsetLeft - current.offsetLeft\n          if (\n            Math.abs(difference) < last.diff &&\n            0 <= difference &&\n            difference <= current.clientWidth\n          ) {\n            last.diff = Math.abs(difference)\n            last.index = index\n          }\n          return {\n            diff: last.diff,\n            index: last.index\n          }\n        },\n        {\n          diff: Infinity,\n          index: -1\n        }\n      )\n      return result.index\n    },\n    _isArray: function (data) {\n      return Object.prototype.toString.call(data) === '[object Array]'\n    }\n  }\n\n  window.BAudio = BAudio\n})(window)\n"
  },
  {
    "path": "assets/vendors/bs-emoji/bs-emoji.css",
    "content": "#face {\n    position: absolute;\n  transform:translate(10px,-60px);\n   \n}\n#facecross { \n\n  transform:translate(10px,-60px);\n\n}\n\n#facesays { \n\n  transform:translate(10px,-45px);\n\n}\n#facecircle {\ntransform:translate(10px,-45px);\n   \n}\n.emotions {\n    z-index: 94361;\n    font-size: 14px;\n    background: #f8f9fa;\n    width: 100%;\n    max-width: 500px;\n    border: 1px solid #e0e3e7;\n    border-radius: 12px;\n    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n    overflow:hidden;\n}\n\n.emotions .categorys {\n    background: #f1f3f5;\n    padding: 10px 15px;\n    border-bottom: 1px solid #e9ecef;\n    display: flex;\n    gap: 8px;\n    overflow-x: auto;\n}\n\n.emotions .categorys::-webkit-scrollbar {\n    height: 6px;\n}\n\n.emotions .categorys::-webkit-scrollbar-track {\n    background: #f1f1f1;\n}\n\n.emotions .categorys::-webkit-scrollbar-thumb {\n    background: #f1f3f5!important;\n    border-radius: 3px;\n}\n\n.emotions .categorys::-webkit-scrollbar-thumb:hover {\n    background: #555;\n}\n\n.emotions .categorys a {\n    display: inline-flex;\n    padding: 8px 16px;\n    border-radius: 8px;\n    color: #495057;\n    font-weight: 500;\n    transition: all 0.2s ease;\n    white-space: nowrap; \n    font-size: 13px;\n}\n\n.emotions .categorys a.current {\n    background: #495057;\n    color: white;\n    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n}\n\n.emotions .categorys a:hover:not(.current) {\n    background: #dee2e6;\n    color: #343a40;\n}\n\n.emotions .container a span{\n   display: inline-block;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  max-width: 100%;\n  margin: 5px;\n}\n\n.emotions .container {\n    padding: 15px;\n    display: grid;\n    grid-template-columns: repeat(auto-fill, 52px);\n    justify-content: center;\n    gap: 10px;\n    background: white;\n    min-height: 200px;\n}\n\n.emotions .emoticon-item {\n    width: 52px !important;\n    height: 52px !important;\n    border: 1px solid transparent;\n    border-radius: 8px;\n    padding: 4px;\n    transition: all 0.2s ease;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    box-sizing: border-box;\n}\n\n.emotions .emoticon-item img {\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n    border-radius: 6px;\n}\n\n.emotions .emoticon-item:hover {\n    transform: scale(1.08);\n    border-color: #6c757d;\n    box-shadow: 0 4px 8px rgba(108, 117, 125, 0.2);\n    z-index: 1;\n}\n\n.emotions .page {\n    padding: 12px 15px;\n    background: #f8f9fa;\n    border-top: 1px solid #e9ecef;\n    display: flex;\n    justify-content: flex-end;\n    gap: 8px;\n}\n\n.emotions .page a {\n    display: inline-flex;\n    padding: 8px 14px;\n    border-radius: 8px;\n    background: #dee2e6;\n    color: #343a40;\n    font-weight: 500;\n    transition: all 0.2s ease;\n    font-size: 13px;\n}\n\n.emotions .page a:hover {\n    background: #6c757d;\n    color: white;\n}\n\n.emotions .page a.current {\n    background: #495057;\n    color: white;\n}\n\n@media (max-width: 480px) {\n    .emotions .container {\n        grid-template-columns: repeat(auto-fill, 46px);\n        gap: 8px;\n        padding: 10px;\n    }\n    \n    .emotions .emoticon-item {\n        width: 46px !important;\n        height: 46px !important;\n    }\n    \n    .emotions .categorys {\n        padding: 8px 12px;\n    }\n    \n    .emotions .categorys a {\n        padding: 6px 12px;\n    }\n}"
  },
  {
    "path": "assets/vendors/bs-emoji/bs-emoji.js",
    "content": "/*\n*\n* Emoji\n*\n*/\nfunction Hashtable() {\n    this._hash = new Object();\n    this.put = function(key, value) {\n        if (typeof (key) != \"undefined\") {\n            if (this.containsKey(key) == false) {\n                this._hash[key] = typeof (value) == \"undefined\" ? null : value;\n                return true;\n            } else {\n                return false;\n            }\n        } else {\n            return false;\n        }\n    }\n    this.remove = function(key) { delete this._hash[key]; }\n    this.size = function() { var i = 0; for (var k in this._hash) { i++; } return i; }\n    this.get = function(key) { return this._hash[key]; }\n    this.containsKey = function(key) { return typeof (this._hash[key]) != \"undefined\"; }\n    this.clear = function() { for (var k in this._hash) { delete this._hash[k]; } }\n}\n\nvar emotions = new Array();\nvar categorys = new Array();\nvar uBsEmotionsHt = new Hashtable();\n\n$(function() {\n\t$.ajax( {\n\t\tdataType : 'json',\n\t\turl : '/index.php/bearEmoji',\n\t\tsuccess : function(response) {\n\t\t    //json = JSON.parse(response);\n\t\t\tdata = response;\n\t\t\tfor ( var i in data) {\n\t\t\t\tif (data[i].category == '') {\n\t\t\t\t\tdata[i].category = 'OwO颜文字';\n\t\t\t\t}\n\t\t\t\tif (emotions[data[i].category] == undefined) {\n\t\t\t\t\temotions[data[i].category] = new Array();\n\t\t\t\t\tcategorys.push(data[i].category);\n\t\t\t\t}\n\t\t\t\temotions[data[i].category].push( {\n\t\t\t\t\tname : data[i].data,\n\t\t\t\t\ticon : data[i].icon,\n\t\t\t\t\ttext : data[i].text\n\t\t\t\t});\n\t\t\t\tuBsEmotionsHt.put(data[i].data, data[i].icon, data[i].text);\n\t\t\t}\n\t\t}\n\t});\n});\n\n//替换\nfunction AnalyticEmotion(s) {\n\tif(typeof (s) != \"undefined\") {\n\t\tvar sArr = s.match(/\\[.*?\\]/g);\n\t\tfor(var i = 0; i < sArr.length; i++){\n\t\t\tif(uBsEmotionsHt.containsKey(sArr[i])) {\n\t\t\t\tvar reStr = \"<img src=\\\"\" + uBsEmotionsHt.get(sArr[i]) + \"\\\" />\";\n\t\t\t\ts = s.replace(sArr[i], reStr);\n\t\t\t}\n\t\t}\n\t}\n\treturn s;\n}\n\n(function($){\n\t$.fn.BearsimpleEmoji = function(target){\n\t\tvar cat_current;\n\t\tvar cat_page;\n\t\t$(this).click(function(event){\n\t\t    //console.log(event.target.id);\n\t\t\tevent.stopPropagation();\n\t\t\tvar eTop = target.offset().top + target.height() + 15;\n\t\t\tvar eLeft = target.offset().left - 1;\n\t\t\t\n\t\t\tif($('.emotions .categorys')[0]){\n\t\t\t\t$('.emotions').css({top: eTop, left: eLeft});\n\t\t\t\t$('.emotions').toggle();\n\t\t\t\treturn;\n\t\t\t}\n\t$('.emoemo').append('<div class=\"emotions\"></div>');\n\t\t\n\t\t\t$('.emotions').css({top: eTop, left: eLeft});\n\t\t\t$('.emotions').html('<div>正在加载，请稍候...</div>');\n\t\t\t$('.emotions').click(function(event){\n\t\t\t\tevent.stopPropagation();\n\t\t\t});\n\t\t\t\n\t\t\t$('.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;\">&laquo;</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;\">&raquo;</a></div></div><div class=\"container\"></div><div class=\"page\"></div>');\n\t\t\t$('.emotions #prev').click(function(){\n\t\t\t\tshowCategorys(cat_page - 1);\n\t\t\t});\n\t\t\t$('.emotions #next').click(function(){\n\t\t\t\tshowCategorys(cat_page + 1);\n\t\t\t});\n\t\t\t$('.emotions #sync').click(function(){\n\t\t\tshowCategorys();\n\t\t\tshowEmotions();\n\t\t\t});\n\t\t\tshowCategorys();\n\t\t\tshowEmotions();\n\t\t\t\n\t\t});\n\t\t$('body').click(function(){\n\t\t\t$('.emotions').fadeOut();\n\t\t});\n\t\t$.fn.insertText = function(text){\n\t\t\tthis.each(function() {\n\t\t\t\tif(this.tagName !== 'INPUT' && this.tagName !== 'TEXTAREA') {return;}\n\t\t\t\tif (document.selection) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\tvar cr = document.selection.createRange();\n\t\t\t\t\tcr.text = text;\n\t\t\t\t\tcr.collapse();\n\t\t\t\t\tcr.select();\n\t\t\t\t}else if (this.selectionStart || this.selectionStart == '0') {\n\t\t\t\t\tvar \n\t\t\t\t\tstart = this.selectionStart,\n\t\t\t\t\tend = this.selectionEnd;\n\t\t\t\t\tthis.value = this.value.substring(0, start)+ text+ this.value.substring(end, this.value.length);\n\t\t\t\t\tthis.selectionStart = this.selectionEnd = start+text.length;\n\t\t\t\t}else {\n\t\t\t\t\tthis.value += text;\n\t\t\t\t}\n\t\t\t});        \n\t\t\treturn this;\n\t\t}\n\t\tfunction showCategorys(){\n\t\t    \n\t\t\tvar page = arguments[0]?arguments[0]:0;\n\t\t\tif(page < 0 || page >= categorys.length / 5){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t$('.emotions .categorys').html('');\n\t\t\tcat_page = page;\n\t\t\tfor(var i = page * 5; i < (page + 1) * 5 && i < categorys.length; ++i){\n\t\t\t\t$('.emotions .categorys').append($('<a href=\"javascript:void(0);\">' + categorys[i] + '</a>'));\n\t\t\t}\n\t\t\t$('.emotions .categorys a').click(function(){\n\t\t\t\tshowEmotions($(this).text());\n\t\t\t});\n\t\t\t$('.emotions .categorys a').each(function(){\n\t\t\t\tif($(this).text() == cat_current){\n\t\t\t\t\t$(this).addClass('current');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tfunction showEmotions(){\n\t\t\tvar category = arguments[0]?arguments[0]:'OwO颜文字';\n\t\t\tvar page = arguments[1]?arguments[1] - 1:0;\n\t\t\t$('.emotions .container').html('');\n\t\t\t$('.emotions .page').html('');\n\t\t\tcat_current = category;\n\t\t\tfor(var i = page * 72; i < (page + 1) * 72 && i < emotions[category].length; ++i){\n\t\t\t    if(cat_current == 'OwO颜文字'){\n\t\t\t   $('.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>'));     \n\t\t\t    }\n\t\t\t    else{\n\t\t\t\t$('.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>'));\n\t\t\t\t\n\t\t\t\t\n\t\t\t    }\n\t\t\t}\n\t\t\t$('.emotions .container a').click(function(){\n\t\t\t\ttarget.insertText($(this).attr('title'));\n\t\t\t\tvar $textarea = $(\"#friendcircle-comment-textarea\");\nif ($textarea.length && $textarea.val().length > 1) {\n    $(\"#friendcircle-comment-container\").attr(\"style\", \"box-shadow: inset 0px 0px 0px 1px #07c160;\");\n    $(\"#friendcircle-comment-submit\").addClass(\"friendcircle-comment-readySubmit\");\n}\n\t\t\t\t$('.emotions').remove();\n\t\t\t});\n\t\t\tfor(var i = 1; i < emotions[category].length / 72 + 1; ++i){\n\t\t\t\t$('.emotions .page').append($('<a href=\"javascript:void(0);\"' + (i == page + 1?' class=\"current\"':'') + '>' + i + '</a>'));\n\t\t\t}\n\t\t\t$('.emotions .page a').click(function(){\n\t\t\t\tshowEmotions(category, $(this).text());\n\t\t\t});\n\t\t\t$('.emotions .categorys a.current').removeClass('current');\n\t\t\t$('.emotions .categorys a').each(function(){\n\t\t\t\tif($(this).text() == category){\n\t\t\t\t\t$(this).addClass('current');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n})(jQuery);\n"
  },
  {
    "path": "assets/vendors/bs-emoji/bs-emoji.json",
    "content": "[{\r\n\t\t\"data\": \"OωO\",\r\n\t\t\"text\": \"owo\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"|´・ω・)ノ\",\r\n\t\t\"text\": \"Hi\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"ヾ(≧∇≦*)ゝ\",\r\n\t\t\"text\": \"开心\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(☆ω☆)\",\r\n\t\t\"text\": \"星星眼\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"（╯‵□′）╯︵┴─┴\",\r\n\t\t\"text\": \"掀桌\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"￣﹃￣\",\r\n\t\t\"text\": \"流口水\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(/ω＼)\",\r\n\t\t\"text\": \"捂脸\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"∠( ᐛ 」∠)＿\",\r\n\t\t\"text\": \"给跪\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(๑•̀ㅁ•́ฅ)\",\r\n\t\t\"text\": \"Hi\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"→_→\",\r\n\t\t\"text\": \"斜眼\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"୧(๑•̀⌄•́๑)૭\",\r\n\t\t\"text\": \"加油\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"٩(ˊᗜˋ*)و\",\r\n\t\t\"text\": \"有木有WiFi\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(ノ°ο°)ノ\",\r\n\t\t\"text\": \"前方高能预警\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(´இ皿இ｀)\",\r\n\t\t\"text\": \"我从未见过如此厚颜无耻之人\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"⌇●﹏●⌇\",\r\n\t\t\"text\": \"吓死宝宝惹\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(ฅ´ω`ฅ)\",\r\n\t\t\"text\": \"已阅留爪\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(╯°A°)╯︵○○○\",\r\n\t\t\"text\": \"去吧大师球\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"φ(￣∇￣o)\",\r\n\t\t\"text\": \"太萌惹\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"ヾ(´･ ･｀｡)ノ\",\r\n\t\t\"text\": \"咦咦咦\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃\",\r\n\t\t\"text\": \"气呼呼\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(ó﹏ò｡)\",\r\n\t\t\"text\": \"我受到了惊吓\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"Σ(っ °Д °;)っ\",\r\n\t\t\"text\": \"什么鬼\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"( ,,´･ω･)ﾉ\\\"(´っω･｀｡)\",\r\n\t\t\"text\": \"摸摸头\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"╮(╯▽╰)╭ \",\r\n\t\t\"text\": \"无奈\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"o(*////▽////*)q \",\r\n\t\t\"text\": \"脸红\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"＞﹏＜\",\r\n\t\t\"text\": \"\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"( ๑´•ω•) \\\"(ㆆᴗㆆ)\",\r\n\t\t\"text\": \"\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(｡•ˇ‸ˇ•｡)\",\r\n\t\t\"text\": \"(｡•ˇ‸ˇ•｡)\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[微笑]\",\r\n\t\t\"zh\": \"[微笑]\",\r\n\t\t\"data\": \"[Smile]\",\r\n\t\t\"codex\": \"/::)\",\r\n\t\t\"web_codex\": \"/微笑\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Smile.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[撇嘴]\",\r\n\t\t\"zh\": \"[撇嘴]\",\r\n\t\t\"data\": \"[Grimace]\",\r\n\t\t\"codex\": \"/::~\",\r\n\t\t\"web_codex\": \"/撇嘴\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Grimace.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[色]\",\r\n\t\t\"zh\": \"[色]\",\r\n\t\t\"data\": \"[Drool]\",\r\n\t\t\"codex\": \"/::B\",\r\n\t\t\"web_codex\": \"/色\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Drool.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[发呆]\",\r\n\t\t\"zh\": \"[發呆]\",\r\n\t\t\"data\": \"[Scowl]\",\r\n\t\t\"codex\": \"/::|\",\r\n\t\t\"web_codex\": \"/发呆\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Scowl.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[得意]\",\r\n\t\t\"zh\": \"[得意]\",\r\n\t\t\"data\": \"[CoolGuy]\",\r\n\t\t\"codex\": \"/:8-)\",\r\n\t\t\"web_codex\": \"/得意\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/CoolGuy.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[流泪]\",\r\n\t\t\"zh\": \"[流淚]\",\r\n\t\t\"data\": \"[Sob]\",\r\n\t\t\"codex\": \"/::<\",\r\n\t\t\"web_codex\": \"/流泪\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Sob.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[害羞]\",\r\n\t\t\"zh\": \"[害羞]\",\r\n\t\t\"data\": \"[Shy]\",\r\n\t\t\"codex\": \"/::$\",\r\n\t\t\"web_codex\": \"/害羞\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Shy.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[闭嘴]\",\r\n\t\t\"zh\": \"[閉嘴]\",\r\n\t\t\"data\": \"[Silent]\",\r\n\t\t\"codex\": \"/::X\",\r\n\t\t\"web_codex\": \"/闭嘴\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Silent.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[睡]\",\r\n\t\t\"zh\": \"[睡]\",\r\n\t\t\"data\": \"[Sleep]\",\r\n\t\t\"codex\": \"/::Z\",\r\n\t\t\"web_codex\": \"/睡\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Sleep.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[大哭]\",\r\n\t\t\"zh\": \"[大哭]\",\r\n\t\t\"data\": \"[Cry]\",\r\n\t\t\"codex\": \"/::'(\",\r\n\t\t\"web_codex\": \"/大哭\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Cry.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[尴尬]\",\r\n\t\t\"zh\": \"[尷尬]\",\r\n\t\t\"data\": \"[Awkward]\",\r\n\t\t\"codex\": \"/::-|\",\r\n\t\t\"web_codex\": \"/尴尬\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Awkward.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[发怒]\",\r\n\t\t\"zh\": \"[發怒]\",\r\n\t\t\"data\": \"[Angry]\",\r\n\t\t\"codex\": \"/::@\",\r\n\t\t\"web_codex\": \"/发怒\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Angry.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[调皮]\",\r\n\t\t\"zh\": \"[調皮]\",\r\n\t\t\"data\": \"[Tongue]\",\r\n\t\t\"codex\": \"/::P\",\r\n\t\t\"web_codex\": \"/调皮\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Tongue.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[呲牙]\",\r\n\t\t\"zh\": \"[呲牙]\",\r\n\t\t\"data\": \"[Grin]\",\r\n\t\t\"codex\": \"/::D\",\r\n\t\t\"web_codex\": \"/呲牙\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Grin.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[惊讶]\",\r\n\t\t\"zh\": \"[驚訝]\",\r\n\t\t\"data\": \"[Surprise]\",\r\n\t\t\"codex\": \"/::O\",\r\n\t\t\"web_codex\": \"/惊讶\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Surprise.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[难过]\",\r\n\t\t\"zh\": \"[難過]\",\r\n\t\t\"data\": \"[Frown]\",\r\n\t\t\"codex\": \"/::(\",\r\n\t\t\"web_codex\": \"/难过\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Frown.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[酷]\",\r\n\t\t\"zh\": \"[酷]\",\r\n\t\t\"data\": \"[Ruthless]\",\r\n\t\t\"codex\": \"/::+\",\r\n\t\t\"web_codex\": \"/酷\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Ruthless.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[囧]\",\r\n\t\t\"zh\": \"[囧]\",\r\n\t\t\"data\": \"[Blush]\",\r\n\t\t\"codex\": \"/:--b\",\r\n\t\t\"web_codex\": \"/冷汗\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Blush.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[抓狂]\",\r\n\t\t\"zh\": \"[抓狂]\",\r\n\t\t\"data\": \"[Scream]\",\r\n\t\t\"codex\": \"/::Q\",\r\n\t\t\"web_codex\": \"/抓狂\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Scream.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[吐]\",\r\n\t\t\"zh\": \"[吐]\",\r\n\t\t\"data\": \"[Puke]\",\r\n\t\t\"codex\": \"/::T\",\r\n\t\t\"web_codex\": \"/吐\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Puke.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[偷笑]\",\r\n\t\t\"zh\": \"[偷笑]\",\r\n\t\t\"data\": \"[Chuckle]\",\r\n\t\t\"codex\": \"/:,@P\",\r\n\t\t\"web_codex\": \"/偷笑\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Chuckle.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[愉快]\",\r\n\t\t\"zh\": \"[愉快]\",\r\n\t\t\"data\": \"[Joyful]\",\r\n\t\t\"codex\": \"/:,@-D\",\r\n\t\t\"web_codex\": \"/可爱\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Joyful.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[白眼]\",\r\n\t\t\"zh\": \"[白眼]\",\r\n\t\t\"data\": \"[Slight]\",\r\n\t\t\"codex\": \"/::d\",\r\n\t\t\"web_codex\": \"/白眼\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Slight.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[傲慢]\",\r\n\t\t\"zh\": \"[傲慢]\",\r\n\t\t\"data\": \"[Smug]\",\r\n\t\t\"codex\": \"/:,@o\",\r\n\t\t\"web_codex\": \"/傲慢\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Smug.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[饥饿]\",\r\n\t\t\"zh\": \"[饑餓]\",\r\n\t\t\"data\": \"[Hungry]\",\r\n\t\t\"codex\": \"/::g\",\r\n\t\t\"web_codex\": \"/饥饿\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Hungry.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[困]\",\r\n\t\t\"zh\": \"[累]\",\r\n\t\t\"data\": \"[Drowsy]\",\r\n\t\t\"codex\": \"/:|-)\",\r\n\t\t\"web_codex\": \"/困\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Drowsy.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[惊恐]\",\r\n\t\t\"zh\": \"[驚恐]\",\r\n\t\t\"data\": \"[Panic]\",\r\n\t\t\"codex\": \"/::!\",\r\n\t\t\"web_codex\": \"/惊恐\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Panic.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[流汗]\",\r\n\t\t\"zh\": \"[流汗]\",\r\n\t\t\"data\": \"[Sweat]\",\r\n\t\t\"codex\": \"/::L\",\r\n\t\t\"web_codex\": \"/流汗\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Sweat.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[憨笑]\",\r\n\t\t\"zh\": \"[大笑]\",\r\n\t\t\"data\": \"[Laugh]\",\r\n\t\t\"codex\": \"/::>\",\r\n\t\t\"web_codex\": \"/憨笑\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Laugh.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[悠闲]\",\r\n\t\t\"zh\": \"[悠閑]\",\r\n\t\t\"data\": \"[Commando]\",\r\n\t\t\"codex\": \"/::,@\",\r\n\t\t\"web_codex\": \"/大兵\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Commando.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[奋斗]\",\r\n\t\t\"zh\": \"[奮鬥]\",\r\n\t\t\"data\": \"[Determined]\",\r\n\t\t\"codex\": \"/:,@f\",\r\n\t\t\"web_codex\": \"/奋斗\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Determined.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[咒骂]\",\r\n\t\t\"zh\": \"[咒罵]\",\r\n\t\t\"data\": \"[Scold]\",\r\n\t\t\"codex\": \"/::-S\",\r\n\t\t\"web_codex\": \"/咒骂\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Scold.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[疑问]\",\r\n\t\t\"zh\": \"[疑問]\",\r\n\t\t\"data\": \"[Shocked]\",\r\n\t\t\"codex\": \"/:?\",\r\n\t\t\"web_codex\": \"/疑问\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Shocked.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[嘘]\",\r\n\t\t\"zh\": \"[噓]\",\r\n\t\t\"data\": \"[Shhh]\",\r\n\t\t\"codex\": \"/:,@x\",\r\n\t\t\"web_codex\": \"/嘘\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Shhh.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[晕]\",\r\n\t\t\"zh\": \"[暈]\",\r\n\t\t\"data\": \"[Dizzy]\",\r\n\t\t\"codex\": \"/:,@@\",\r\n\t\t\"web_codex\": \"/晕\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Dizzy.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[疯了]\",\r\n\t\t\"zh\": \"[瘋了]\",\r\n\t\t\"data\": \"[Tormented]\",\r\n\t\t\"codex\": \"/::8\",\r\n\t\t\"web_codex\": \"/折磨\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Tormented.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[衰]\",\r\n\t\t\"zh\": \"[衰]\",\r\n\t\t\"data\": \"[Toasted]\",\r\n\t\t\"codex\": \"/:,@!\",\r\n\t\t\"web_codex\": \"/衰\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Toasted.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[骷髅]\",\r\n\t\t\"zh\": \"[骷髏頭]\",\r\n\t\t\"data\": \"[Skull]\",\r\n\t\t\"codex\": \"/:!!!\",\r\n\t\t\"web_codex\": \"/骷髅\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Skull.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[敲打]\",\r\n\t\t\"zh\": \"[敲打]\",\r\n\t\t\"data\": \"[Hammer]\",\r\n\t\t\"codex\": \"/:xx\",\r\n\t\t\"web_codex\": \"/敲打\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Hammer.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[再见]\",\r\n\t\t\"zh\": \"[再見]\",\r\n\t\t\"data\": \"[Wave]\",\r\n\t\t\"codex\": \"/:bye\",\r\n\t\t\"web_codex\": \"/再见\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Wave.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[擦汗]\",\r\n\t\t\"zh\": \"[擦汗]\",\r\n\t\t\"data\": \"[Speechless]\",\r\n\t\t\"codex\": \"/:wipe\",\r\n\t\t\"web_codex\": \"/擦汗\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Speechless.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[抠鼻]\",\r\n\t\t\"zh\": \"[摳鼻]\",\r\n\t\t\"data\": \"[NosePick]\",\r\n\t\t\"codex\": \"/:dig\",\r\n\t\t\"web_codex\": \"/抠鼻\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/NosePick.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[鼓掌]\",\r\n\t\t\"zh\": \"[鼓掌]\",\r\n\t\t\"data\": \"[Clap]\",\r\n\t\t\"codex\": \"/:handclap\",\r\n\t\t\"web_codex\": \"/鼓掌\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Clap.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[糗大了]\",\r\n\t\t\"zh\": \"[羞辱]\",\r\n\t\t\"data\": \"[Shame]\",\r\n\t\t\"codex\": \"/:&-(\",\r\n\t\t\"web_codex\": \"/糗大了\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Shame.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[坏笑]\",\r\n\t\t\"zh\": \"[壞笑]\",\r\n\t\t\"data\": \"[Trick]\",\r\n\t\t\"codex\": \"/:B-)\",\r\n\t\t\"web_codex\": \"/坏笑\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Trick.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[左哼哼]\",\r\n\t\t\"zh\": \"[左哼哼]\",\r\n\t\t\"data\": \"[Bah！L]\",\r\n\t\t\"codex\": \"/:<@\",\r\n\t\t\"web_codex\": \"/左哼哼\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Bah！L.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[右哼哼]\",\r\n\t\t\"zh\": \"[右哼哼]\",\r\n\t\t\"data\": \"[Bah！R]\",\r\n\t\t\"codex\": \"/:@>\",\r\n\t\t\"web_codex\": \"/右哼哼\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Bah！R.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[哈欠]\",\r\n\t\t\"zh\": \"[哈欠]\",\r\n\t\t\"data\": \"[Yawn]\",\r\n\t\t\"codex\": \"/::-O\",\r\n\t\t\"web_codex\": \"/哈欠\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Yawn.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[鄙视]\",\r\n\t\t\"zh\": \"[鄙視]\",\r\n\t\t\"data\": \"[Pooh-pooh]\",\r\n\t\t\"codex\": \"/:>-|\",\r\n\t\t\"web_codex\": \"/鄙视\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Pooh-pooh.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[委屈]\",\r\n\t\t\"zh\": \"[委屈]\",\r\n\t\t\"data\": \"[Shrunken]\",\r\n\t\t\"codex\": \"/:P-(\",\r\n\t\t\"web_codex\": \"/委屈\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Shrunken.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[快哭了]\",\r\n\t\t\"zh\": \"[快哭了]\",\r\n\t\t\"data\": \"[TearingUp]\",\r\n\t\t\"codex\": \"/::'|\",\r\n\t\t\"web_codex\": \"/快哭了\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/TearingUp.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[阴险]\",\r\n\t\t\"zh\": \"[陰險]\",\r\n\t\t\"data\": \"[Sly]\",\r\n\t\t\"codex\": \"/:X-)\",\r\n\t\t\"web_codex\": \"/阴险\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Sly.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[亲亲]\",\r\n\t\t\"zh\": \"[親親]\",\r\n\t\t\"data\": \"[Kiss]\",\r\n\t\t\"codex\": \"/::*\",\r\n\t\t\"web_codex\": \"/亲亲\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Kiss.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[吓]\",\r\n\t\t\"zh\": \"[嚇]\",\r\n\t\t\"data\": \"[Wrath]\",\r\n\t\t\"codex\": \"/:@x\",\r\n\t\t\"web_codex\": \"/吓\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Wrath.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[可怜]\",\r\n\t\t\"zh\": \"[可憐]\",\r\n\t\t\"data\": \"[Whimper]\",\r\n\t\t\"codex\": \"/:8*\",\r\n\t\t\"web_codex\": \"/可怜\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Whimper.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[菜刀]\",\r\n\t\t\"zh\": \"[菜刀]\",\r\n\t\t\"data\": \"[Cleaver]\",\r\n\t\t\"codex\": \"/:pd\",\r\n\t\t\"web_codex\": \"/菜刀\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Cleaver.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[西瓜]\",\r\n\t\t\"zh\": \"[西瓜]\",\r\n\t\t\"data\": \"[Watermelon]\",\r\n\t\t\"codex\": \"/:<W>\",\r\n\t\t\"web_codex\": \"/西瓜\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Watermelon.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[啤酒]\",\r\n\t\t\"zh\": \"[啤酒]\",\r\n\t\t\"data\": \"[Beer]\",\r\n\t\t\"codex\": \"/:beer\",\r\n\t\t\"web_codex\": \"/啤酒\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Beer.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[篮球]\",\r\n\t\t\"zh\": \"[籃球]\",\r\n\t\t\"data\": \"[Basketball]\",\r\n\t\t\"codex\": \"/:basketb\",\r\n\t\t\"web_codex\": \"/篮球\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Basketball.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[乒乓]\",\r\n\t\t\"zh\": \"[乒乓]\",\r\n\t\t\"data\": \"[PingPong]\",\r\n\t\t\"codex\": \"/:oo\",\r\n\t\t\"web_codex\": \"/乒乓\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/PingPong.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[咖啡]\",\r\n\t\t\"zh\": \"[咖啡]\",\r\n\t\t\"data\": \"[Coffee]\",\r\n\t\t\"codex\": \"/:coffee\",\r\n\t\t\"web_codex\": \"/咖啡\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Coffee.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[饭]\",\r\n\t\t\"zh\": \"[飯]\",\r\n\t\t\"data\": \"[Rice]\",\r\n\t\t\"codex\": \"/:eat\",\r\n\t\t\"web_codex\": \"/饭\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Rice.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[猪头]\",\r\n\t\t\"zh\": \"[豬頭]\",\r\n\t\t\"data\": \"[Pig]\",\r\n\t\t\"codex\": \"/:pig\",\r\n\t\t\"web_codex\": \"/猪头\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Pig.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[玫瑰]\",\r\n\t\t\"zh\": \"[玫瑰]\",\r\n\t\t\"data\": \"[Rose]\",\r\n\t\t\"codex\": \"/:rose\",\r\n\t\t\"web_codex\": \"/玫瑰\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Rose.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[凋谢]\",\r\n\t\t\"zh\": \"[枯萎]\",\r\n\t\t\"data\": \"[Wilt]\",\r\n\t\t\"codex\": \"/:fade\",\r\n\t\t\"web_codex\": \"/凋谢\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Wilt.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[嘴唇]\",\r\n\t\t\"zh\": \"[嘴唇]\",\r\n\t\t\"data\": \"[Lips]\",\r\n\t\t\"codex\": \"/:showlove\",\r\n\t\t\"web_codex\": \"/示爱\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Lips.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[爱心]\",\r\n\t\t\"zh\": \"[愛心]\",\r\n\t\t\"data\": \"[Heart]\",\r\n\t\t\"codex\": \"/:heart\",\r\n\t\t\"web_codex\": \"/爱心\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Heart.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[心碎]\",\r\n\t\t\"zh\": \"[心碎]\",\r\n\t\t\"data\": \"[BrokenHeart]\",\r\n\t\t\"codex\": \"/:break\",\r\n\t\t\"web_codex\": \"/心碎\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/BrokenHeart.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[蛋糕]\",\r\n\t\t\"zh\": \"[蛋糕]\",\r\n\t\t\"data\": \"[Cake]\",\r\n\t\t\"codex\": \"/:cake\",\r\n\t\t\"web_codex\": \"/蛋糕\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Cake.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[闪电]\",\r\n\t\t\"zh\": \"[閃電]\",\r\n\t\t\"data\": \"[Lightning]\",\r\n\t\t\"codex\": \"/:li\",\r\n\t\t\"web_codex\": \"/闪电\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Lightning.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[炸弹]\",\r\n\t\t\"zh\": \"[炸彈]\",\r\n\t\t\"data\": \"[Bomb]\",\r\n\t\t\"codex\": \"/:bome\",\r\n\t\t\"web_codex\": \"/炸弹\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Bomb.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[刀]\",\r\n\t\t\"zh\": \"[刀]\",\r\n\t\t\"data\": \"[Dagger]\",\r\n\t\t\"codex\": \"/:kn\",\r\n\t\t\"web_codex\": \"/刀\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Dagger.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[足球]\",\r\n\t\t\"zh\": \"[足球]\",\r\n\t\t\"data\": \"[Soccer]\",\r\n\t\t\"codex\": \"/:footb\",\r\n\t\t\"web_codex\": \"/足球\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Soccer.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[瓢虫]\",\r\n\t\t\"zh\": \"[甲蟲]\",\r\n\t\t\"data\": \"[Ladybug]\",\r\n\t\t\"codex\": \"/:ladybug\",\r\n\t\t\"web_codex\": \"/瓢虫\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Ladybug.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[便便]\",\r\n\t\t\"zh\": \"[便便]\",\r\n\t\t\"data\": \"[Poop]\",\r\n\t\t\"codex\": \"/:shit\",\r\n\t\t\"web_codex\": \"/便便\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Poop.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[月亮]\",\r\n\t\t\"zh\": \"[月亮]\",\r\n\t\t\"data\": \"[Moon]\",\r\n\t\t\"codex\": \"/:moon\",\r\n\t\t\"web_codex\": \"/月亮\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Moon.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[太阳]\",\r\n\t\t\"zh\": \"[太陽]\",\r\n\t\t\"data\": \"[Sun]\",\r\n\t\t\"codex\": \"/:sun\",\r\n\t\t\"web_codex\": \"/太阳\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Sun.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[礼物]\",\r\n\t\t\"zh\": \"[禮物]\",\r\n\t\t\"data\": \"[Gift]\",\r\n\t\t\"codex\": \"/:gift\",\r\n\t\t\"web_codex\": \"/礼物\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Gift.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[拥抱]\",\r\n\t\t\"zh\": \"[擁抱]\",\r\n\t\t\"data\": \"[Hug]\",\r\n\t\t\"codex\": \"/:hug\",\r\n\t\t\"web_codex\": \"/拥抱\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Hug.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[强]\",\r\n\t\t\"zh\": \"[強]\",\r\n\t\t\"data\": \"[ThumbsUp]\",\r\n\t\t\"codex\": \"/:strong\",\r\n\t\t\"web_codex\": \"/强\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/ThumbsUp.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[弱]\",\r\n\t\t\"zh\": \"[弱]\",\r\n\t\t\"data\": \"[ThumbsDown]\",\r\n\t\t\"codex\": \"/:weak\",\r\n\t\t\"web_codex\": \"/弱\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/ThumbsDown.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[握手]\",\r\n\t\t\"zh\": \"[握手]\",\r\n\t\t\"data\": \"[Shake]\",\r\n\t\t\"codex\": \"/:share\",\r\n\t\t\"web_codex\": \"/握手\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Shake.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[胜利]\",\r\n\t\t\"zh\": \"[勝利]\",\r\n\t\t\"data\": \"[Peace]\",\r\n\t\t\"codex\": \"/:v\",\r\n\t\t\"web_codex\": \"/胜利\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Peace.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[抱拳]\",\r\n\t\t\"zh\": \"[抱拳]\",\r\n\t\t\"data\": \"[Fight]\",\r\n\t\t\"codex\": \"/:@)\",\r\n\t\t\"web_codex\": \"/抱拳\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Fight.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[勾引]\",\r\n\t\t\"zh\": \"[勾引]\",\r\n\t\t\"data\": \"[Beckon]\",\r\n\t\t\"codex\": \"/:jj\",\r\n\t\t\"web_codex\": \"/勾引\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Beckon.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[拳头]\",\r\n\t\t\"zh\": \"[拳頭]\",\r\n\t\t\"data\": \"[Fist]\",\r\n\t\t\"codex\": \"/:@@\",\r\n\t\t\"web_codex\": \"/拳头\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Fist.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[差劲]\",\r\n\t\t\"zh\": \"[差勁]\",\r\n\t\t\"data\": \"[Pinky]\",\r\n\t\t\"codex\": \"/:bad\",\r\n\t\t\"web_codex\": \"/差劲\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Pinky.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[爱你]\",\r\n\t\t\"zh\": \"[愛你]\",\r\n\t\t\"data\": \"[RockOn]\",\r\n\t\t\"codex\": \"/:lvu\",\r\n\t\t\"web_codex\": \"/爱你\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/RockOn.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[NO]\",\r\n\t\t\"zh\": \"[NO]\",\r\n\t\t\"data\": \"[Nuh-uh]\",\r\n\t\t\"codex\": \"/:no\",\r\n\t\t\"web_codex\": \"/NO\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Nuh-uh.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[OK]\",\r\n\t\t\"zh\": \"[OK]\",\r\n\t\t\"data\": \"[OK]\",\r\n\t\t\"codex\": \"/:ok\",\r\n\t\t\"web_codex\": \"/OK\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/OK.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[爱情]\",\r\n\t\t\"zh\": \"[愛情]\",\r\n\t\t\"data\": \"[InLove]\",\r\n\t\t\"codex\": \"/:love\",\r\n\t\t\"web_codex\": \"/爱情\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/InLove.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[飞吻]\",\r\n\t\t\"zh\": \"[飛吻]\",\r\n\t\t\"data\": \"[Blowkiss]\",\r\n\t\t\"codex\": \"/:<L>\",\r\n\t\t\"web_codex\": \"/飞吻\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Blowkiss.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[跳跳]\",\r\n\t\t\"zh\": \"[跳跳]\",\r\n\t\t\"data\": \"[Waddle]\",\r\n\t\t\"codex\": \"/:jump\",\r\n\t\t\"web_codex\": \"/跳跳\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Waddle.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[发抖]\",\r\n\t\t\"zh\": \"[發抖]\",\r\n\t\t\"data\": \"[Tremble]\",\r\n\t\t\"codex\": \"/:shake\",\r\n\t\t\"web_codex\": \"/发抖\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Tremble.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[怄火]\",\r\n\t\t\"zh\": \"[噴火]\",\r\n\t\t\"data\": \"[Aaagh!]\",\r\n\t\t\"codex\": \"/:<O>\",\r\n\t\t\"web_codex\": \"/怄火\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Aaagh!.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[转圈]\",\r\n\t\t\"zh\": \"[轉圈]\",\r\n\t\t\"data\": \"[Twirl]\",\r\n\t\t\"codex\": \"/:circle\",\r\n\t\t\"web_codex\": \"/转圈\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Twirl.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[磕头]\",\r\n\t\t\"zh\": \"[磕頭]\",\r\n\t\t\"data\": \"[Kotow]\",\r\n\t\t\"codex\": \"/:kotow\",\r\n\t\t\"web_codex\": \"/磕头\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Kotow.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[回头]\",\r\n\t\t\"zh\": \"[回頭]\",\r\n\t\t\"data\": \"[Dramatic]\",\r\n\t\t\"codex\": \"/:turn\",\r\n\t\t\"web_codex\": \"/回头\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Dramatic.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[跳绳]\",\r\n\t\t\"zh\": \"[跳繩]\",\r\n\t\t\"data\": \"[JumpRope]\",\r\n\t\t\"codex\": \"/:skip\",\r\n\t\t\"web_codex\": \"/跳绳\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/JumpRope.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[投降]\",\r\n\t\t\"zh\": \"[投降]\",\r\n\t\t\"data\": \"[Surrender]\",\r\n\t\t\"codex\": \"/:oY\",\r\n\t\t\"web_codex\": \"/挥手\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Surrender.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[激动]\",\r\n\t\t\"zh\": \"[激動]\",\r\n\t\t\"data\": \"[Hooray]\",\r\n\t\t\"codex\": \"/:#-0\",\r\n\t\t\"web_codex\": \"/激动\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Hooray.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[乱舞]\",\r\n\t\t\"zh\": \"[亂舞]\",\r\n\t\t\"data\": \"[Meditate]\",\r\n\t\t\"codex\": \"/:hiphot\",\r\n\t\t\"web_codex\": \"/街舞\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Meditate.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[献吻]\",\r\n\t\t\"zh\": \"[獻吻]\",\r\n\t\t\"data\": \"[Smooch]\",\r\n\t\t\"codex\": \"/:kiss\",\r\n\t\t\"web_codex\": \"/献吻\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Smooch.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[左太极]\",\r\n\t\t\"zh\": \"[左太極]\",\r\n\t\t\"data\": \"[TaiChi L]\",\r\n\t\t\"codex\": \"/:<&\",\r\n\t\t\"web_codex\": \"/左太极\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/TaiChi L.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[右太极]\",\r\n\t\t\"zh\": \"[右太極]\",\r\n\t\t\"data\": \"[TaiChi R]\",\r\n\t\t\"codex\": \"/:&\\\"\",\r\n\t\t\"web_codex\": \"/右太极\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/TaiChi R.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[奸笑]\",\r\n\t\t\"zh\": \"[奸笑]\",\r\n\t\t\"data\": \"[Smirk]\",\r\n\t\t\"codex\": \"[Smirk]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Smirk.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[嘿哈]\",\r\n\t\t\"zh\": \"[吼嘿]\",\r\n\t\t\"data\": \"[Hey]\",\r\n\t\t\"codex\": \"[Hey]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Hey.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[捂脸]\",\r\n\t\t\"zh\": \"[掩面]\",\r\n\t\t\"data\": \"[Facepalm]\",\r\n\t\t\"codex\": \"[Facepalm]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Facepalm.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[机智]\",\r\n\t\t\"zh\": \"[機智]\",\r\n\t\t\"data\": \"[Smart]\",\r\n\t\t\"codex\": \"[Smart]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Smart.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[茶]\",\r\n\t\t\"zh\": \"[茶]\",\r\n\t\t\"data\": \"[Tea]\",\r\n\t\t\"codex\": \"[Tea]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Tea.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[红包]\",\r\n\t\t\"zh\": \"[Packet]\",\r\n\t\t\"data\": \"[Packet]\",\r\n\t\t\"codex\": \"[Packet]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Packet.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[蜡烛]\",\r\n\t\t\"zh\": \"[蠟燭]\",\r\n\t\t\"data\": \"[Candle]\",\r\n\t\t\"codex\": \"[Candle]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Candle.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[耶]\",\r\n\t\t\"zh\": \"[歐耶]\",\r\n\t\t\"data\": \"[Yeah!]\",\r\n\t\t\"codex\": \"[Yeah!]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Yeah!.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[皱眉]\",\r\n\t\t\"zh\": \"[皺眉]\",\r\n\t\t\"data\": \"[Concerned]\",\r\n\t\t\"codex\": \"[Concerned]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Concerned.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[抱拳]\",\r\n\t\t\"zh\": \"[抱拳]\",\r\n\t\t\"data\": \"[Salute]\",\r\n\t\t\"codex\": \"[Salute]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Salute.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[鸡]\",\r\n\t\t\"zh\": \"[小雞]\",\r\n\t\t\"data\": \"[Chick]\",\r\n\t\t\"codex\": \"[Chick]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Chick.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[福]\",\r\n\t\t\"zh\": \"[福]\",\r\n\t\t\"data\": \"[Blessing]\",\r\n\t\t\"codex\": \"[Blessing]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Blessing.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[再见]\",\r\n\t\t\"zh\": \"[再見]\",\r\n\t\t\"data\": \"[Bye]\",\r\n\t\t\"codex\": \"[Bye]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Bye.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[發]\",\r\n\t\t\"zh\": \"[發]\",\r\n\t\t\"data\": \"[Rich]\",\r\n\t\t\"codex\": \"[Rich]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Rich.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[小狗]\",\r\n\t\t\"zh\": \"[小狗]\",\r\n\t\t\"data\": \"[Pup]\",\r\n\t\t\"codex\": \"[Pup]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Pup.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[吃瓜]\",\r\n\t\t\"zh\": \"[吃西瓜]\",\r\n\t\t\"data\": \"[Onlooker]\",\r\n\t\t\"codex\": \"[Onlooker]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Onlooker.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[加油]\",\r\n\t\t\"zh\": \"[加油]\",\r\n\t\t\"data\": \"[GoForIt]\",\r\n\t\t\"codex\": \"[GoForIt]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/GoForIt.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[汗]\",\r\n\t\t\"zh\": \"[汗]\",\r\n\t\t\"data\": \"[Sweats]\",\r\n\t\t\"codex\": \"[Sweats]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Sweats.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[天啊]\",\r\n\t\t\"zh\": \"[天啊]\",\r\n\t\t\"data\": \"[OMG]\",\r\n\t\t\"codex\": \"[OMG]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/OMG.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[Emm]\",\r\n\t\t\"zh\": \"[一言難盡]\",\r\n\t\t\"data\": \"[Emm]\",\r\n\t\t\"codex\": \"[Emm]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Emm.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[社会社会]\",\r\n\t\t\"zh\": \"[失敬失敬]\",\r\n\t\t\"data\": \"[Respect]\",\r\n\t\t\"codex\": \"[Respect]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Respect.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[旺柴]\",\r\n\t\t\"zh\": \"[旺柴]\",\r\n\t\t\"data\": \"[Doge]\",\r\n\t\t\"codex\": \"[Doge]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Doge.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[好的]\",\r\n\t\t\"zh\": \"[好的]\",\r\n\t\t\"data\": \"[NoProb]\",\r\n\t\t\"codex\": \"[NoProb]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/NoProb.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[打脸]\",\r\n\t\t\"zh\": \"[打臉]\",\r\n\t\t\"data\": \"[MyBad]\",\r\n\t\t\"codex\": \"[MyBad]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/MyBad.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[哇]\",\r\n\t\t\"zh\": \"[哇]\",\r\n\t\t\"data\": \"[Wow]\",\r\n\t\t\"codex\": \"[Wow]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Wow.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[加油加油]\",\r\n\t\t\"zh\": \"[加油！]\",\r\n\t\t\"data\": \"[KeepFighting]\",\r\n\t\t\"codex\": \"[KeepFighting]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/KeepFighting.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[翻白眼]\",\r\n\t\t\"zh\": \"[翻白眼]\",\r\n\t\t\"data\": \"[Boring]\",\r\n\t\t\"codex\": \"[Boring]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Boring.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[666]\",\r\n\t\t\"zh\": \"[666]\",\r\n\t\t\"data\": \"[Awesome]\",\r\n\t\t\"codex\": \"[666]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Awesome.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[让我看看]\",\r\n\t\t\"zh\": \"[讓我看看]\",\r\n\t\t\"data\": \"[LetMeSee]\",\r\n\t\t\"codex\": \"[LetMeSee]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/LetMeSee.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[叹气]\",\r\n\t\t\"zh\": \"[嘆息]\",\r\n\t\t\"data\": \"[Sigh]\",\r\n\t\t\"codex\": \"[Sigh]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Sigh.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[苦涩]\",\r\n\t\t\"zh\": \"[難受]\",\r\n\t\t\"data\": \"[Hurt]\",\r\n\t\t\"codex\": \"[Hurt]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Hurt.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[裂开]\",\r\n\t\t\"zh\": \"[崩潰]\",\r\n\t\t\"data\": \"[Broken]\",\r\n\t\t\"codex\": \"[Broken]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Broken.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[脸红]\",\r\n\t\t\"zh\": \"[臉紅]\",\r\n\t\t\"data\": \"[Flushed]\",\r\n\t\t\"codex\": \"[Flushed]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Flushed.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[笑脸]\",\r\n\t\t\"zh\": \"[笑臉]\",\r\n\t\t\"data\": \"[Happy]\",\r\n\t\t\"codex\": \"[Happy]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Happy.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[破涕为笑]\",\r\n\t\t\"zh\": \"[破涕為笑]\",\r\n\t\t\"data\": \"[Lol]\",\r\n\t\t\"codex\": \"[Lol]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Lol.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[烟花]\",\r\n\t\t\"zh\": \"[煙花]\",\r\n\t\t\"data\": \"[Fireworks]\",\r\n\t\t\"codex\": \"[Fireworks]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Fireworks.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[爆竹]\",\r\n\t\t\"zh\": \"[爆竹]\",\r\n\t\t\"data\": \"[爆竹]\",\r\n\t\t\"codex\": \"[爆竹]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Firecracker.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[庆祝]\",\r\n\t\t\"zh\": \"[慶祝]\",\r\n\t\t\"data\": \"[Party]\",\r\n\t\t\"codex\": \"[Party]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Party.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[恐惧]\",\r\n\t\t\"zh\": \"[恐懼]\",\r\n\t\t\"data\": \"[Terror]\",\r\n\t\t\"codex\": \"[Terror]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Terror.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[无语]\",\r\n\t\t\"zh\": \"[無語]\",\r\n\t\t\"data\": \"[Duh]\",\r\n\t\t\"codex\": \"[Duh]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Duh.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[失望]\",\r\n\t\t\"zh\": \"[失望]\",\r\n\t\t\"data\": \"[Let Down]\",\r\n\t\t\"codex\": \"[LetDown]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Let Down.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[生病]\",\r\n\t\t\"zh\": \"[生病]\",\r\n\t\t\"data\": \"[Sick]\",\r\n\t\t\"codex\": \"[Sick]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Sick.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"text\": \"[合十]\",\r\n\t\t\"zh\": \"[合十]\",\r\n\t\t\"data\": \"[Worship]\",\r\n\t\t\"codex\": \"[Worship]\",\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/wechat/Worship.png\",\r\n\t\t\"category\": \"微信\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/ablobcatheart.png\",\r\n\t\t\"data\": \":[ablobcatheart]\",\r\n\t\t\"text\": \"ablobcatheart\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/ablobcatheartbroken.png\",\r\n\t\t\"data\": \":[ablobcatheartbroken]\",\r\n\t\t\"text\": \"ablobcatheartbroken\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatheart.png\",\r\n\t\t\"data\": \":[blobcatheart]\",\r\n\t\t\"text\": \"blobcatheart\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatheartpride.png\",\r\n\t\t\"data\": \":[blobcatheartpride]\",\r\n\t\t\"text\": \"blobcatheartpride\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatlove.png\",\r\n\t\t\"data\": \":[blobcatlove]\",\r\n\t\t\"text\": \"blobcatlove\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatkissheart.png\",\r\n\t\t\"data\": \":[blobcatkissheart]\",\r\n\t\t\"text\": \"blobcatkissheart\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatsnuggle.png\",\r\n\t\t\"data\": \":[blobcatsnuggle]\",\r\n\t\t\"text\": \"blobcatsnuggle\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/comfyuee.png\",\r\n\t\t\"data\": \":[comfyuee]\",\r\n\t\t\"text\": \"comfyuee\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/comfyslep.png\",\r\n\t\t\"data\": \":[comfyslep]\",\r\n\t\t\"text\": \"comfyslep\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/comfynight.png\",\r\n\t\t\"data\": \":[comfynight]\",\r\n\t\t\"text\": \"comfynight\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatcomfysweat.png\",\r\n\t\t\"data\": \":[blobcatcomfysweat]\",\r\n\t\t\"text\": \"blobcatcomfysweat\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatcomfy.png\",\r\n\t\t\"data\": \":[blobcatcomfy]\",\r\n\t\t\"text\": \"blobcatcomfy\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatcomftears.png\",\r\n\t\t\"data\": \":[blobcatcomftears]\",\r\n\t\t\"text\": \"blobcatcomftears\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatfacepalm.png\",\r\n\t\t\"data\": \":[blobcatfacepalm]\",\r\n\t\t\"text\": \"blobcatfacepalm\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcat0_0.png\",\r\n\t\t\"data\": \":[blobcat0_0]\",\r\n\t\t\"text\": \"blobcat0_0\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatangry.png\",\r\n\t\t\"data\": \":[blobcatangry]\",\r\n\t\t\"text\": \"blobcatangry\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobbanhammerr.png\",\r\n\t\t\"data\": \":[blobbanhammerr]\",\r\n\t\t\"text\": \"blobbanhammerr\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatt.png\",\r\n\t\t\"data\": \":[blobcatt]\",\r\n\t\t\"text\": \"blobcatt\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatblush.png\",\r\n\t\t\"data\": \":[blobcatblush]\",\r\n\t\t\"text\": \"blobcatblush\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatcoffee.png\",\r\n\t\t\"data\": \":[blobcatcoffee]\",\r\n\t\t\"text\": \"blobcatcoffee\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatcry.png\",\r\n\t\t\"data\": \":[blobcatcry]\",\r\n\t\t\"text\": \"blobcatcry\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatdead.png\",\r\n\t\t\"data\": \":[blobcatdead]\",\r\n\t\t\"text\": \"blobcatdead\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatdied.png\",\r\n\t\t\"data\": \":[blobcatdied]\",\r\n\t\t\"text\": \"blobcatdied\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatdisturbed.png\",\r\n\t\t\"data\": \":[blobcatdisturbed]\",\r\n\t\t\"text\": \"blobcatdisturbed\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatfearful.png\",\r\n\t\t\"data\": \":[blobcatfearful]\",\r\n\t\t\"text\": \"blobcatfearful\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatfingerguns.png\",\r\n\t\t\"data\": \":[blobcatfingerguns]\",\r\n\t\t\"text\": \"blobcatfingerguns\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatflip.png\",\r\n\t\t\"data\": \":[blobcatflip]\",\r\n\t\t\"text\": \"blobcatflip\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatflower.png\",\r\n\t\t\"data\": \":[blobcatflower]\",\r\n\t\t\"text\": \"blobcatflower\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatgay.png\",\r\n\t\t\"data\": \":[blobcatgay]\",\r\n\t\t\"text\": \"blobcatgay\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatgooglycry.png\",\r\n\t\t\"data\": \":[blobcatgooglycry]\",\r\n\t\t\"text\": \"blobcatgooglycry\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatneutral.png\",\r\n\t\t\"data\": \":[blobcatneutral]\",\r\n\t\t\"text\": \"blobcatneutral\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatopenmouth.png\",\r\n\t\t\"data\": \":[blobcatopenmouth]\",\r\n\t\t\"text\": \"blobcatopenmouth\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatsadreach.png\",\r\n\t\t\"data\": \":[blobcatsadreach]\",\r\n\t\t\"text\": \"blobcatsadreach\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatscared.png\",\r\n\t\t\"data\": \":[blobcatscared]\",\r\n\t\t\"text\": \"blobcatscared\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatnomblobcat.png\",\r\n\t\t\"data\": \":[blobcatnomblobcat]\",\r\n\t\t\"text\": \"blobcatnomblobcat\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatpresentred.png\",\r\n\t\t\"data\": \":[blobcatpresentred]\",\r\n\t\t\"text\": \"blobcatpresentred\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatread.png\",\r\n\t\t\"data\": \":[blobcatread]\",\r\n\t\t\"text\": \"blobcatread\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatsipsweat.png\",\r\n\t\t\"data\": \":[blobcatsipsweat]\",\r\n\t\t\"text\": \"blobcatsipsweat\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatsnapped.png\",\r\n\t\t\"data\": \":[blobcatsnapped]\",\r\n\t\t\"text\": \"blobcatsnapped\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatthink.png\",\r\n\t\t\"data\": \":[blobcatthink]\",\r\n\t\t\"text\": \"blobcatthink\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcattriumph.png\",\r\n\t\t\"data\": \":[blobcattriumph]\",\r\n\t\t\"text\": \"blobcattriumph\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatumm.png\",\r\n\t\t\"data\": \":[blobcatumm]\",\r\n\t\t\"text\": \"blobcatumm\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatverified.png\",\r\n\t\t\"data\": \":[blobcatverified]\",\r\n\t\t\"text\": \"blobcatverified\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatbox.png\",\r\n\t\t\"data\": \":[blobcatbox]\",\r\n\t\t\"text\": \"blobcatbox\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatcaged.png\",\r\n\t\t\"data\": \":[blobcatcaged]\",\r\n\t\t\"text\": \"blobcatcaged\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatgooglytrash.png\",\r\n\t\t\"data\": \":[blobcatgooglytrash]\",\r\n\t\t\"text\": \"blobcatgooglytrash\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatheadphones.png\",\r\n\t\t\"data\": \":[blobcatheadphones]\",\r\n\t\t\"text\": \"blobcatheadphones\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcathighfive.png\",\r\n\t\t\"data\": \":[blobcathighfive]\",\r\n\t\t\"text\": \"blobcathighfive\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatmelt.png\",\r\n\t\t\"data\": \":[blobcatmelt]\",\r\n\t\t\"text\": \"blobcatmelt\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatmeltthumb.png\",\r\n\t\t\"data\": \":[blobcatmeltthumb]\",\r\n\t\t\"text\": \"blobcatmeltthumb\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatnotlikethis.png\",\r\n\t\t\"data\": \":[blobcatnotlikethis]\",\r\n\t\t\"text\": \"blobcatnotlikethis\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatsaitama.png\",\r\n\t\t\"data\": \":[blobcatsaitama]\",\r\n\t\t\"text\": \"blobcatsaitama\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatyandere.png\",\r\n\t\t\"data\": \":[blobcatyandere]\",\r\n\t\t\"text\": \"blobcatyandere\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatpeek2.png\",\r\n\t\t\"data\": \":[blobcatpeek2]\",\r\n\t\t\"text\": \"blobcatpeek2\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatpeekaboo.png\",\r\n\t\t\"data\": \":[blobcatpeekaboo]\",\r\n\t\t\"text\": \"blobcatpeekaboo\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatphoto.png\",\r\n\t\t\"data\": \":[blobcatphoto]\",\r\n\t\t\"text\": \"blobcatphoto\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/ablobcatattentionreverse.png\",\r\n\t\t\"data\": \":[ablobcatattentionreverse]\",\r\n\t\t\"text\": \"ablobcatattentionreverse\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/ablobcatreachrev.png\",\r\n\t\t\"data\": \":[ablobcatreachrev]\",\r\n\t\t\"text\": \"ablobcatreachrev\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/ablobcatwave.png\",\r\n\t\t\"data\": \":[ablobcatwave]\",\r\n\t\t\"text\": \"ablobcatwave\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatalt.png\",\r\n\t\t\"data\": \":[blobcatalt]\",\r\n\t\t\"text\": \"blobcatalt\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatpolice.png\",\r\n\t\t\"data\": \":[blobcatpolice]\",\r\n\t\t\"text\": \"blobcatpolice\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/blobcatshocked.png\",\r\n\t\t\"data\": \":[blobcatshocked]\",\r\n\t\t\"text\": \"blobcatshocked\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/cat/ablobcatrainbow.png\",\r\n\t\t\"data\": \":[ablobcatrainbow]\",\r\n\t\t\"text\": \"ablobcatrainbow\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/3d眼镜.png\",\r\n\t\t\"data\": \":[3d眼镜]\",\r\n\t\t\"text\": \"3d眼镜\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/EDG.png\",\r\n\t\t\"data\": \":[EDG]\",\r\n\t\t\"text\": \"EDG\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/LPL.png\",\r\n\t\t\"data\": \":[LPL]\",\r\n\t\t\"text\": \"LPL\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/beluga.png\",\r\n\t\t\"data\": \":[beluga]\",\r\n\t\t\"text\": \"beluga\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/不好意思.png\",\r\n\t\t\"data\": \":[不好意思]\",\r\n\t\t\"text\": \"不好意思\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/不服吗.png\",\r\n\t\t\"data\": \":[不服吗]\",\r\n\t\t\"text\": \"不服吗\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/亲亲.png\",\r\n\t\t\"data\": \":[亲亲]\",\r\n\t\t\"text\": \"亲亲\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/伞兵.png\",\r\n\t\t\"data\": \":[伞兵]\",\r\n\t\t\"text\": \"伞兵\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/倚墙笑.png\",\r\n\t\t\"data\": \":[倚墙笑]\",\r\n\t\t\"text\": \"倚墙笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/值得肯定.png\",\r\n\t\t\"data\": \":[值得肯定]\",\r\n\t\t\"text\": \"值得肯定\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/偷偷看.png\",\r\n\t\t\"data\": \":[偷偷看]\",\r\n\t\t\"text\": \"偷偷看\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/傻笑.png\",\r\n\t\t\"data\": \":[傻笑]\",\r\n\t\t\"text\": \"傻笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/再见.png\",\r\n\t\t\"data\": \":[再见]\",\r\n\t\t\"text\": \"再见\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/出家人.png\",\r\n\t\t\"data\": \":[出家人]\",\r\n\t\t\"text\": \"出家人\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/击剑.png\",\r\n\t\t\"data\": \":[击剑]\",\r\n\t\t\"text\": \"击剑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/加班.png\",\r\n\t\t\"data\": \":[加班]\",\r\n\t\t\"text\": \"加班\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/勉强笑.png\",\r\n\t\t\"data\": \":[勉强笑]\",\r\n\t\t\"text\": \"勉强笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/危险.png\",\r\n\t\t\"data\": \":[危险]\",\r\n\t\t\"text\": \"危险\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/发红包.png\",\r\n\t\t\"data\": \":[发红包]\",\r\n\t\t\"text\": \"发红包\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/吃手.png\",\r\n\t\t\"data\": \":[吃手]\",\r\n\t\t\"text\": \"吃手\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/吃瓜.png\",\r\n\t\t\"data\": \":[吃瓜]\",\r\n\t\t\"text\": \"吃瓜\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/吐血.png\",\r\n\t\t\"data\": \":[吐血]\",\r\n\t\t\"text\": \"吐血\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/吵架.png\",\r\n\t\t\"data\": \":[吵架]\",\r\n\t\t\"text\": \"吵架\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/呦吼.png\",\r\n\t\t\"data\": \":[呦吼]\",\r\n\t\t\"text\": \"呦吼\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/呲牙笑.png\",\r\n\t\t\"data\": \":[呲牙笑]\",\r\n\t\t\"text\": \"呲牙笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/哈士奇.png\",\r\n\t\t\"data\": \":[哈士奇]\",\r\n\t\t\"text\": \"哈士奇\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/哈士奇失去意识.png\",\r\n\t\t\"data\": \":[哈士奇失去意识]\",\r\n\t\t\"text\": \"哈士奇失去意识\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/哈士奇失望.png\",\r\n\t\t\"data\": \":[哈士奇失望]\",\r\n\t\t\"text\": \"哈士奇失望\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/哭泣.png\",\r\n\t\t\"data\": \":[哭泣]\",\r\n\t\t\"text\": \"哭泣\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/唱歌.png\",\r\n\t\t\"data\": \":[唱歌]\",\r\n\t\t\"text\": \"唱歌\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/喜欢.png\",\r\n\t\t\"data\": \":[喜欢]\",\r\n\t\t\"text\": \"喜欢\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/嘿哈.png\",\r\n\t\t\"data\": \":[嘿哈]\",\r\n\t\t\"text\": \"嘿哈\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/大笑.png\",\r\n\t\t\"data\": \":[大笑]\",\r\n\t\t\"text\": \"大笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/失去信号.png\",\r\n\t\t\"data\": \":[失去信号]\",\r\n\t\t\"text\": \"失去信号\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/失望.png\",\r\n\t\t\"data\": \":[失望]\",\r\n\t\t\"text\": \"失望\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/头秃.png\",\r\n\t\t\"data\": \":[头秃]\",\r\n\t\t\"text\": \"头秃\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/奋斗.png\",\r\n\t\t\"data\": \":[奋斗]\",\r\n\t\t\"text\": \"奋斗\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/好奇.png\",\r\n\t\t\"data\": \":[好奇]\",\r\n\t\t\"text\": \"好奇\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/好的.png\",\r\n\t\t\"data\": \":[好的]\",\r\n\t\t\"text\": \"好的\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/害羞.png\",\r\n\t\t\"data\": \":[害羞]\",\r\n\t\t\"text\": \"害羞\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/小丑.png\",\r\n\t\t\"data\": \":[小丑]\",\r\n\t\t\"text\": \"小丑\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/小偷.png\",\r\n\t\t\"data\": \":[小偷]\",\r\n\t\t\"text\": \"小偷\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/尬笑.png\",\r\n\t\t\"data\": \":[尬笑]\",\r\n\t\t\"text\": \"尬笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/尴尬.png\",\r\n\t\t\"data\": \":[尴尬]\",\r\n\t\t\"text\": \"尴尬\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/应援.png\",\r\n\t\t\"data\": \":[应援]\",\r\n\t\t\"text\": \"应援\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/开心.png\",\r\n\t\t\"data\": \":[开心]\",\r\n\t\t\"text\": \"开心\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/引起不适.png\",\r\n\t\t\"data\": \":[引起不适]\",\r\n\t\t\"text\": \"引起不适\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/微笑.png\",\r\n\t\t\"data\": \":[微笑]\",\r\n\t\t\"text\": \"微笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/思考.png\",\r\n\t\t\"data\": \":[思考]\",\r\n\t\t\"text\": \"思考\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/恶心.png\",\r\n\t\t\"data\": \":[恶心]\",\r\n\t\t\"text\": \"恶心\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/恶魔.png\",\r\n\t\t\"data\": \":[恶魔]\",\r\n\t\t\"text\": \"恶魔\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/恶魔恐惧.png\",\r\n\t\t\"data\": \":[恶魔恐惧]\",\r\n\t\t\"text\": \"恶魔恐惧\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/惊吓.png\",\r\n\t\t\"data\": \":[惊吓]\",\r\n\t\t\"text\": \"惊吓\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/惊吓白眼.png\",\r\n\t\t\"data\": \":[惊吓白眼]\",\r\n\t\t\"text\": \"惊吓白眼\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/惊讶.png\",\r\n\t\t\"data\": \":[惊讶]\",\r\n\t\t\"text\": \"惊讶\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/惬意.png\",\r\n\t\t\"data\": \":[惬意]\",\r\n\t\t\"text\": \"惬意\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/感动.png\",\r\n\t\t\"data\": \":[感动]\",\r\n\t\t\"text\": \"感动\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/愤怒.png\",\r\n\t\t\"data\": \":[愤怒]\",\r\n\t\t\"text\": \"愤怒\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/我看好你.png\",\r\n\t\t\"data\": \":[我看好你]\",\r\n\t\t\"text\": \"我看好你\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/手机相机.png\",\r\n\t\t\"data\": \":[手机相机]\",\r\n\t\t\"text\": \"手机相机\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/打咩.png\",\r\n\t\t\"data\": \":[打咩]\",\r\n\t\t\"text\": \"打咩\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/打牌.png\",\r\n\t\t\"data\": \":[打牌]\",\r\n\t\t\"text\": \"打牌\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/托腮.png\",\r\n\t\t\"data\": \":[托腮]\",\r\n\t\t\"text\": \"托腮\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/扶额.png\",\r\n\t\t\"data\": \":[扶额]\",\r\n\t\t\"text\": \"扶额\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/抠鼻.png\",\r\n\t\t\"data\": \":[抠鼻]\",\r\n\t\t\"text\": \"抠鼻\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/抬眼镜.png\",\r\n\t\t\"data\": \":[抬眼镜]\",\r\n\t\t\"text\": \"抬眼镜\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/拜托.png\",\r\n\t\t\"data\": \":[拜托]\",\r\n\t\t\"text\": \"拜托\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/捂嘴笑.png\",\r\n\t\t\"data\": \":[捂嘴笑]\",\r\n\t\t\"text\": \"捂嘴笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/捂脸.png\",\r\n\t\t\"data\": \":[捂脸]\",\r\n\t\t\"text\": \"捂脸\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/擦汗.png\",\r\n\t\t\"data\": \":[擦汗]\",\r\n\t\t\"text\": \"擦汗\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/放鞭炮.png\",\r\n\t\t\"data\": \":[放鞭炮]\",\r\n\t\t\"text\": \"放鞭炮\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/敬礼.png\",\r\n\t\t\"data\": \":[敬礼]\",\r\n\t\t\"text\": \"敬礼\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/整理发型.png\",\r\n\t\t\"data\": \":[整理发型]\",\r\n\t\t\"text\": \"整理发型\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/斗鸡眼.png\",\r\n\t\t\"data\": \":[斗鸡眼]\",\r\n\t\t\"text\": \"斗鸡眼\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/智慧的眼神.png\",\r\n\t\t\"data\": \":[智慧的眼神]\",\r\n\t\t\"text\": \"智慧的眼神\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/月饼.png\",\r\n\t\t\"data\": \":[月饼]\",\r\n\t\t\"text\": \"月饼\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/有没有搞错.png\",\r\n\t\t\"data\": \":[有没有搞错]\",\r\n\t\t\"text\": \"有没有搞错\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/正确.png\",\r\n\t\t\"data\": \":[正确]\",\r\n\t\t\"text\": \"正确\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/没招.png\",\r\n\t\t\"data\": \":[没招]\",\r\n\t\t\"text\": \"没招\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/波吉.png\",\r\n\t\t\"data\": \":[波吉]\",\r\n\t\t\"text\": \"波吉\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/泪奔.png\",\r\n\t\t\"data\": \":[泪奔]\",\r\n\t\t\"text\": \"泪奔\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/流汗微笑.png\",\r\n\t\t\"data\": \":[流汗微笑]\",\r\n\t\t\"text\": \"流汗微笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/流鼻涕.png\",\r\n\t\t\"data\": \":[流鼻涕]\",\r\n\t\t\"text\": \"流鼻涕\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/深思.png\",\r\n\t\t\"data\": \":[深思]\",\r\n\t\t\"text\": \"深思\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/滑稽.png\",\r\n\t\t\"data\": \":[滑稽]\",\r\n\t\t\"text\": \"滑稽\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/滑稽吃瓜.png\",\r\n\t\t\"data\": \":[滑稽吃瓜]\",\r\n\t\t\"text\": \"滑稽吃瓜\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/滑稽喝水.png\",\r\n\t\t\"data\": \":[滑稽喝水]\",\r\n\t\t\"text\": \"滑稽喝水\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/滑稽奶茶.png\",\r\n\t\t\"data\": \":[滑稽奶茶]\",\r\n\t\t\"text\": \"滑稽奶茶\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/滑稽柠檬.png\",\r\n\t\t\"data\": \":[滑稽柠檬]\",\r\n\t\t\"text\": \"滑稽柠檬\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/滑稽狂汗.png\",\r\n\t\t\"data\": \":[滑稽狂汗]\",\r\n\t\t\"text\": \"滑稽狂汗\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/滑稽被子.png\",\r\n\t\t\"data\": \":[滑稽被子]\",\r\n\t\t\"text\": \"滑稽被子\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/烦恼.png\",\r\n\t\t\"data\": \":[烦恼]\",\r\n\t\t\"text\": \"烦恼\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/熊熊.png\",\r\n\t\t\"data\": \":[熊熊]\",\r\n\t\t\"text\": \"熊熊\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/熊猫.png\",\r\n\t\t\"data\": \":[熊猫]\",\r\n\t\t\"text\": \"熊猫\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/熊猫唱歌.png\",\r\n\t\t\"data\": \":[熊猫唱歌]\",\r\n\t\t\"text\": \"熊猫唱歌\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/熊猫喜欢.png\",\r\n\t\t\"data\": \":[熊猫喜欢]\",\r\n\t\t\"text\": \"熊猫喜欢\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/熊猫失望.png\",\r\n\t\t\"data\": \":[熊猫失望]\",\r\n\t\t\"text\": \"熊猫失望\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/熊猫意外.png\",\r\n\t\t\"data\": \":[熊猫意外]\",\r\n\t\t\"text\": \"熊猫意外\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/熬夜.png\",\r\n\t\t\"data\": \":[熬夜]\",\r\n\t\t\"text\": \"熬夜\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/爆炸.png\",\r\n\t\t\"data\": \":[爆炸]\",\r\n\t\t\"text\": \"爆炸\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/牛年进宝.png\",\r\n\t\t\"data\": \":[牛年进宝]\",\r\n\t\t\"text\": \"牛年进宝\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/狂热.png\",\r\n\t\t\"data\": \":[狂热]\",\r\n\t\t\"text\": \"狂热\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/狗头.png\",\r\n\t\t\"data\": \":[狗头]\",\r\n\t\t\"text\": \"狗头\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/狗头围脖.png\",\r\n\t\t\"data\": \":[狗头围脖]\",\r\n\t\t\"text\": \"狗头围脖\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/狗头失望.png\",\r\n\t\t\"data\": \":[狗头失望]\",\r\n\t\t\"text\": \"狗头失望\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/狗头意外.png\",\r\n\t\t\"data\": \":[狗头意外]\",\r\n\t\t\"text\": \"狗头意外\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/狗头胖次.png\",\r\n\t\t\"data\": \":[狗头胖次]\",\r\n\t\t\"text\": \"狗头胖次\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/狗头花.png\",\r\n\t\t\"data\": \":[狗头花]\",\r\n\t\t\"text\": \"狗头花\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/狗头草.png\",\r\n\t\t\"data\": \":[狗头草]\",\r\n\t\t\"text\": \"狗头草\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/猪头.png\",\r\n\t\t\"data\": \":[猪头]\",\r\n\t\t\"text\": \"猪头\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/猪头意外.png\",\r\n\t\t\"data\": \":[猪头意外]\",\r\n\t\t\"text\": \"猪头意外\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/生病.png\",\r\n\t\t\"data\": \":[生病]\",\r\n\t\t\"text\": \"生病\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/电话.png\",\r\n\t\t\"data\": \":[电话]\",\r\n\t\t\"text\": \"电话\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/疑问.png\",\r\n\t\t\"data\": \":[疑问]\",\r\n\t\t\"text\": \"疑问\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/疼痛.png\",\r\n\t\t\"data\": \":[疼痛]\",\r\n\t\t\"text\": \"疼痛\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/痛哭.png\",\r\n\t\t\"data\": \":[痛哭]\",\r\n\t\t\"text\": \"痛哭\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/看穿一切.png\",\r\n\t\t\"data\": \":[看穿一切]\",\r\n\t\t\"text\": \"看穿一切\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/眩晕.png\",\r\n\t\t\"data\": \":[眩晕]\",\r\n\t\t\"text\": \"眩晕\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/睡觉.png\",\r\n\t\t\"data\": \":[睡觉]\",\r\n\t\t\"text\": \"睡觉\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/禁言.png\",\r\n\t\t\"data\": \":[禁言]\",\r\n\t\t\"text\": \"禁言\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/笑哭.png\",\r\n\t\t\"data\": \":[笑哭]\",\r\n\t\t\"text\": \"笑哭\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/纠结.png\",\r\n\t\t\"data\": \":[纠结]\",\r\n\t\t\"text\": \"纠结\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/绿帽.png\",\r\n\t\t\"data\": \":[绿帽]\",\r\n\t\t\"text\": \"绿帽\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/缺牙笑.png\",\r\n\t\t\"data\": \":[缺牙笑]\",\r\n\t\t\"text\": \"缺牙笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/翻白眼.png\",\r\n\t\t\"data\": \":[翻白眼]\",\r\n\t\t\"text\": \"翻白眼\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/老虎意外.png\",\r\n\t\t\"data\": \":[老虎意外]\",\r\n\t\t\"text\": \"老虎意外\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/耍酷.png\",\r\n\t\t\"data\": \":[耍酷]\",\r\n\t\t\"text\": \"耍酷\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/胡子.png\",\r\n\t\t\"data\": \":[胡子]\",\r\n\t\t\"text\": \"胡子\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/菜狗.png\",\r\n\t\t\"data\": \":[菜狗]\",\r\n\t\t\"text\": \"菜狗\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/菜狗花.png\",\r\n\t\t\"data\": \":[菜狗花]\",\r\n\t\t\"text\": \"菜狗花\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/蒙面滑稽.png\",\r\n\t\t\"data\": \":[蒙面滑稽]\",\r\n\t\t\"text\": \"蒙面滑稽\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/虎年进宝.png\",\r\n\t\t\"data\": \":[虎年进宝]\",\r\n\t\t\"text\": \"虎年进宝\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/被打.png\",\r\n\t\t\"data\": \":[被打]\",\r\n\t\t\"text\": \"被打\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/裂开.png\",\r\n\t\t\"data\": \":[裂开]\",\r\n\t\t\"text\": \"裂开\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/警告.png\",\r\n\t\t\"data\": \":[警告]\",\r\n\t\t\"text\": \"警告\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/读书.png\",\r\n\t\t\"data\": \":[读书]\",\r\n\t\t\"text\": \"读书\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/财神红包.png\",\r\n\t\t\"data\": \":[财神红包]\",\r\n\t\t\"text\": \"财神红包\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/超爱.png\",\r\n\t\t\"data\": \":[超爱]\",\r\n\t\t\"text\": \"超爱\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/这是啥.png\",\r\n\t\t\"data\": \":[这是啥]\",\r\n\t\t\"text\": \"这是啥\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/送福.png\",\r\n\t\t\"data\": \":[送福]\",\r\n\t\t\"text\": \"送福\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/送花.png\",\r\n\t\t\"data\": \":[送花]\",\r\n\t\t\"text\": \"送花\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/错误.png\",\r\n\t\t\"data\": \":[错误]\",\r\n\t\t\"text\": \"错误\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/阴险.png\",\r\n\t\t\"data\": \":[阴险]\",\r\n\t\t\"text\": \"阴险\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/难以置信.png\",\r\n\t\t\"data\": \":[难以置信]\",\r\n\t\t\"text\": \"难以置信\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/面具.png\",\r\n\t\t\"data\": \":[面具]\",\r\n\t\t\"text\": \"面具\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/饥渴.png\",\r\n\t\t\"data\": \":[饥渴]\",\r\n\t\t\"text\": \"饥渴\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/鬼脸.png\",\r\n\t\t\"data\": \":[鬼脸]\",\r\n\t\t\"text\": \"鬼脸\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/黑线.png\",\r\n\t\t\"data\": \":[黑线]\",\r\n\t\t\"text\": \"黑线\",\r\n\t\t\"category\": \"Heo\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/heo/鼓掌.png\",\r\n\t\t\"data\": \":[鼓掌]\",\r\n\t\t\"text\": \"鼓掌\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/微笑.gif\",\r\n\t\t\"data\": \":^(微笑)\",\r\n\t\t\"text\": \"微笑\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/撇嘴.gif\",\r\n\t\t\"data\": \":^(撇嘴)\",\r\n\t\t\"text\": \"撇嘴\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/色.gif\",\r\n\t\t\"data\": \":^(色)\",\r\n\t\t\"text\": \"色\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/发呆.gif\",\r\n\t\t\"data\": \":^(发呆)\",\r\n\t\t\"text\": \"发呆\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/得意.gif\",\r\n\t\t\"data\": \":^(得意)\",\r\n\t\t\"text\": \"得意\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/流泪.gif\",\r\n\t\t\"data\": \":^(流泪)\",\r\n\t\t\"text\": \"流泪\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/害羞.gif\",\r\n\t\t\"data\": \":^(害羞)\",\r\n\t\t\"text\": \"害羞\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/闭嘴.gif\",\r\n\t\t\"data\": \":^(闭嘴)\",\r\n\t\t\"text\": \"闭嘴\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/睡.gif\",\r\n\t\t\"data\": \":^(睡)\",\r\n\t\t\"text\": \"睡\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/大哭.gif\",\r\n\t\t\"data\": \":^(大哭)\",\r\n\t\t\"text\": \"大哭\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/尴尬.gif\",\r\n\t\t\"data\": \":^(尴尬)\",\r\n\t\t\"text\": \"尴尬\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/呲牙.gif\",\r\n\t\t\"data\": \":^(呲牙)\",\r\n\t\t\"text\": \"呲牙\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/发怒.gif\",\r\n\t\t\"data\": \":^(发怒)\",\r\n\t\t\"text\": \"发怒\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/调皮.gif\",\r\n\t\t\"data\": \":^(调皮)\",\r\n\t\t\"text\": \"调皮\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/惊讶.gif\",\r\n\t\t\"data\": \":^(惊讶)\",\r\n\t\t\"text\": \"惊讶\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/难过.gif\",\r\n\t\t\"data\": \":^(难过)\",\r\n\t\t\"text\": \"难过\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/酷.gif\",\r\n\t\t\"data\": \":^(酷)\",\r\n\t\t\"text\": \"酷\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/冷汗.gif\",\r\n\t\t\"data\": \":^(冷汗)\",\r\n\t\t\"text\": \"冷汗\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/抓狂.gif\",\r\n\t\t\"data\": \":^(抓狂)\",\r\n\t\t\"text\": \"抓狂\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/吐.gif\",\r\n\t\t\"data\": \":^(吐)\",\r\n\t\t\"text\": \"吐\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/偷笑.gif\",\r\n\t\t\"data\": \":^(偷笑)\",\r\n\t\t\"text\": \"偷笑\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/可爱.gif\",\r\n\t\t\"data\": \":^(可爱)\",\r\n\t\t\"text\": \"可爱\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/白眼.gif\",\r\n\t\t\"data\": \":^(白眼)\",\r\n\t\t\"text\": \"白眼\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/傲慢.gif\",\r\n\t\t\"data\": \":^(傲慢)\",\r\n\t\t\"text\": \"傲慢\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/饥饿.gif\",\r\n\t\t\"data\": \":^(饥饿)\",\r\n\t\t\"text\": \"饥饿\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/困.gif\",\r\n\t\t\"data\": \":^(困)\",\r\n\t\t\"text\": \"困\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/惊恐.gif\",\r\n\t\t\"data\": \":^(惊恐)\",\r\n\t\t\"text\": \"惊恐\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/流汗.gif\",\r\n\t\t\"data\": \":^(流汗)\",\r\n\t\t\"text\": \"流汗\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/憨笑.gif\",\r\n\t\t\"data\": \":^(憨笑)\",\r\n\t\t\"text\": \"憨笑\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/大兵.gif\",\r\n\t\t\"data\": \":^(大兵)\",\r\n\t\t\"text\": \"大兵\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/奋斗.gif\",\r\n\t\t\"data\": \":^(奋斗)\",\r\n\t\t\"text\": \"奋斗\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/咒骂.gif\",\r\n\t\t\"data\": \":^(咒骂)\",\r\n\t\t\"text\": \"咒骂\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/疑问.gif\",\r\n\t\t\"data\": \":^(疑问)\",\r\n\t\t\"text\": \"疑问\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/嘘.gif\",\r\n\t\t\"data\": \":^(嘘)\",\r\n\t\t\"text\": \"嘘\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/晕.gif\",\r\n\t\t\"data\": \":^(晕)\",\r\n\t\t\"text\": \"晕\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/折磨.gif\",\r\n\t\t\"data\": \":^(折磨)\",\r\n\t\t\"text\": \"折磨\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/衰.gif\",\r\n\t\t\"data\": \":^(衰)\",\r\n\t\t\"text\": \"衰\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/骷髅.gif\",\r\n\t\t\"data\": \":^(骷髅)\",\r\n\t\t\"text\": \"骷髅\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/敲打.gif\",\r\n\t\t\"data\": \":^(敲打)\",\r\n\t\t\"text\": \"敲打\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/再见.gif\",\r\n\t\t\"data\": \":^(再见)\",\r\n\t\t\"text\": \"再见\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/擦汗.gif\",\r\n\t\t\"data\": \":^(擦汗)\",\r\n\t\t\"text\": \"擦汗\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/抠鼻.gif\",\r\n\t\t\"data\": \":^(抠鼻)\",\r\n\t\t\"text\": \"抠鼻\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/鼓掌.gif\",\r\n\t\t\"data\": \":^(鼓掌)\",\r\n\t\t\"text\": \"鼓掌\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/嗅大了.gif\",\r\n\t\t\"data\": \":^(嗅大了)\",\r\n\t\t\"text\": \"嗅大了\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/坏笑.gif\",\r\n\t\t\"data\": \":^(坏笑)\",\r\n\t\t\"text\": \"坏笑\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/左哼哼.gif\",\r\n\t\t\"data\": \":^(左哼哼)\",\r\n\t\t\"text\": \"左哼哼\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/右哼哼.gif\",\r\n\t\t\"data\": \":^(右哼哼)\",\r\n\t\t\"text\": \"右哼哼\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/哈欠.gif\",\r\n\t\t\"data\": \":^(哈欠)\",\r\n\t\t\"text\": \"哈欠\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/鄙视.gif\",\r\n\t\t\"data\": \":^(鄙视)\",\r\n\t\t\"text\": \"鄙视\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/委屈.gif\",\r\n\t\t\"data\": \":^(委屈)\",\r\n\t\t\"text\": \"委屈\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/可怜.gif\",\r\n\t\t\"data\": \":^(可怜)\",\r\n\t\t\"text\": \"可怜\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/阴险.gif\",\r\n\t\t\"data\": \":^(阴险)\",\r\n\t\t\"text\": \"阴险\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/亲亲.gif\",\r\n\t\t\"data\": \":^(亲亲)\",\r\n\t\t\"text\": \"亲亲\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/吓.gif\",\r\n\t\t\"data\": \":^(吓)\",\r\n\t\t\"text\": \"吓\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/快哭了.gif\",\r\n\t\t\"data\": \":^(快哭了)\",\r\n\t\t\"text\": \"快哭了\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/菜刀.gif\",\r\n\t\t\"data\": \":^(菜刀)\",\r\n\t\t\"text\": \"菜刀\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/西瓜.gif\",\r\n\t\t\"data\": \":^(西瓜)\",\r\n\t\t\"text\": \"西瓜\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/啤酒.gif\",\r\n\t\t\"data\": \":^(啤酒)\",\r\n\t\t\"text\": \"啤酒\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/篮球.gif\",\r\n\t\t\"data\": \":^(篮球)\",\r\n\t\t\"text\": \"篮球\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/乒乓.gif\",\r\n\t\t\"data\": \":^(乒乓)\",\r\n\t\t\"text\": \"乒乓\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/咖啡.gif\",\r\n\t\t\"data\": \":^(咖啡)\",\r\n\t\t\"text\": \"咖啡\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/饭.gif\",\r\n\t\t\"data\": \":^(饭)\",\r\n\t\t\"text\": \"饭\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/猪头.gif\",\r\n\t\t\"data\": \":^(猪头)\",\r\n\t\t\"text\": \"猪头\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/玫瑰.gif\",\r\n\t\t\"data\": \":^(玫瑰)\",\r\n\t\t\"text\": \"玫瑰\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/凋谢.gif\",\r\n\t\t\"data\": \":^(凋谢)\",\r\n\t\t\"text\": \"凋谢\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/心.gif\",\r\n\t\t\"data\": \":^(心)\",\r\n\t\t\"text\": \"心\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/心碎.gif\",\r\n\t\t\"data\": \":^(心碎)\",\r\n\t\t\"text\": \"心碎\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/蛋糕.gif\",\r\n\t\t\"data\": \":^(蛋糕)\",\r\n\t\t\"text\": \"蛋糕\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/炸弹.gif\",\r\n\t\t\"data\": \":^(炸弹)\",\r\n\t\t\"text\": \"炸弹\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/刀.gif\",\r\n\t\t\"data\": \":^(刀)\",\r\n\t\t\"text\": \"刀\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/足球.gif\",\r\n\t\t\"data\": \":^(足球)\",\r\n\t\t\"text\": \"足球\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/瓢虫.gif\",\r\n\t\t\"data\": \":^(瓢虫)\",\r\n\t\t\"text\": \"瓢虫\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/便便.gif\",\r\n\t\t\"data\": \":^(便便)\",\r\n\t\t\"text\": \"便便\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/夜晚.gif\",\r\n\t\t\"data\": \":^(夜晚)\",\r\n\t\t\"text\": \"夜晚\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/太阳.gif\",\r\n\t\t\"data\": \":^(太阳)\",\r\n\t\t\"text\": \"太阳\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/礼物.gif\",\r\n\t\t\"data\": \":^(礼物)\",\r\n\t\t\"text\": \"礼物\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/拥抱.gif\",\r\n\t\t\"data\": \":^(拥抱)\",\r\n\t\t\"text\": \"拥抱\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/强.gif\",\r\n\t\t\"data\": \":^(强)\",\r\n\t\t\"text\": \"强\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/弱.gif\",\r\n\t\t\"data\": \":^(弱)\",\r\n\t\t\"text\": \"弱\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/握手.gif\",\r\n\t\t\"data\": \":^(握手)\",\r\n\t\t\"text\": \"握手\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/胜利.gif\",\r\n\t\t\"data\": \":^(胜利)\",\r\n\t\t\"text\": \"胜利\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/抱拳.gif\",\r\n\t\t\"data\": \":^(抱拳)\",\r\n\t\t\"text\": \"抱拳\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/勾引.gif\",\r\n\t\t\"data\": \":^(勾引)\",\r\n\t\t\"text\": \"勾引\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/拳头.gif\",\r\n\t\t\"data\": \":^(拳头)\",\r\n\t\t\"text\": \"拳头\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/差劲.gif\",\r\n\t\t\"data\": \":^(差劲)\",\r\n\t\t\"text\": \"差劲\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/爱你.gif\",\r\n\t\t\"data\": \":^(爱你)\",\r\n\t\t\"text\": \"爱你\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/NO.gif\",\r\n\t\t\"data\": \":^(NO)\",\r\n\t\t\"text\": \"NO\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/OK.gif\",\r\n\t\t\"data\": \":^(OK)\",\r\n\t\t\"text\": \"OK\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/爱情.gif\",\r\n\t\t\"data\": \":^(爱情)\",\r\n\t\t\"text\": \"爱情\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/飞吻.gif\",\r\n\t\t\"data\": \":^(飞吻)\",\r\n\t\t\"text\": \"飞吻\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/发财.gif\",\r\n\t\t\"data\": \":^(发财)\",\r\n\t\t\"text\": \"发财\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/帅.gif\",\r\n\t\t\"data\": \":^(帅)\",\r\n\t\t\"text\": \"帅\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/雨伞.gif\",\r\n\t\t\"data\": \":^(雨伞)\",\r\n\t\t\"text\": \"雨伞\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/高铁左车头.gif\",\r\n\t\t\"data\": \":^(高铁左车头)\",\r\n\t\t\"text\": \"高铁左车头\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/车厢.gif\",\r\n\t\t\"data\": \":^(车厢)\",\r\n\t\t\"text\": \"车厢\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/高铁右车头.gif\",\r\n\t\t\"data\": \":^(高铁右车头)\",\r\n\t\t\"text\": \"高铁右车头\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/纸巾.gif\",\r\n\t\t\"data\": \":^(纸巾)\",\r\n\t\t\"text\": \"纸巾\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/右太极.gif\",\r\n\t\t\"data\": \":^(右太极)\",\r\n\t\t\"text\": \"右太极\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/左太极.gif\",\r\n\t\t\"data\": \":^(左太极)\",\r\n\t\t\"text\": \"左太极\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/献吻.gif\",\r\n\t\t\"data\": \":^(献吻)\",\r\n\t\t\"text\": \"献吻\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/街舞.gif\",\r\n\t\t\"data\": \":^(街舞)\",\r\n\t\t\"text\": \"街舞\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/激动.gif\",\r\n\t\t\"data\": \":^(激动)\",\r\n\t\t\"text\": \"激动\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/挥动.gif\",\r\n\t\t\"data\": \":^(挥动)\",\r\n\t\t\"text\": \"挥动\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/跳绳.gif\",\r\n\t\t\"data\": \":^(跳绳)\",\r\n\t\t\"text\": \"跳绳\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/回头.gif\",\r\n\t\t\"data\": \":^(回头)\",\r\n\t\t\"text\": \"回头\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/磕头.gif\",\r\n\t\t\"data\": \":^(磕头)\",\r\n\t\t\"text\": \"磕头\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/转圈.gif\",\r\n\t\t\"data\": \":^(转圈)\",\r\n\t\t\"text\": \"转圈\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/怄火.gif\",\r\n\t\t\"data\": \":^(怄火)\",\r\n\t\t\"text\": \"怄火\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/发抖.gif\",\r\n\t\t\"data\": \":^(发抖)\",\r\n\t\t\"text\": \"发抖\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/跳跳.gif\",\r\n\t\t\"data\": \":^(跳跳)\",\r\n\t\t\"text\": \"跳跳\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/爆筋.gif\",\r\n\t\t\"data\": \":^(爆筋)\",\r\n\t\t\"text\": \"爆筋\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/沙发.gif\",\r\n\t\t\"data\": \":^(沙发)\",\r\n\t\t\"text\": \"沙发\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/钱.gif\",\r\n\t\t\"data\": \":^(钱)\",\r\n\t\t\"text\": \"钱\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/蜡烛.gif\",\r\n\t\t\"data\": \":^(蜡烛)\",\r\n\t\t\"text\": \"蜡烛\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/枪.gif\",\r\n\t\t\"data\": \":^(枪)\",\r\n\t\t\"text\": \"枪\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/灯.gif\",\r\n\t\t\"data\": \":^(灯)\",\r\n\t\t\"text\": \"灯\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/香蕉.gif\",\r\n\t\t\"data\": \":^(香蕉)\",\r\n\t\t\"text\": \"香蕉\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/吻.gif\",\r\n\t\t\"data\": \":^(吻)\",\r\n\t\t\"text\": \"吻\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/下雨.gif\",\r\n\t\t\"data\": \":^(下雨)\",\r\n\t\t\"text\": \"下雨\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/闹钟.gif\",\r\n\t\t\"data\": \":^(闹钟)\",\r\n\t\t\"text\": \"闹钟\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/囍.gif\",\r\n\t\t\"data\": \":^(囍)\",\r\n\t\t\"text\": \"囍\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/棒棒糖.gif\",\r\n\t\t\"data\": \":^(棒棒糖)\",\r\n\t\t\"text\": \"棒棒糖\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/面条.gif\",\r\n\t\t\"data\": \":^(面条)\",\r\n\t\t\"text\": \"面条\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/车.gif\",\r\n\t\t\"data\": \":^(车)\",\r\n\t\t\"text\": \"车\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/邮件.gif\",\r\n\t\t\"data\": \":^(邮件)\",\r\n\t\t\"text\": \"邮件\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/风车.gif\",\r\n\t\t\"data\": \":^(风车)\",\r\n\t\t\"text\": \"风车\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/药丸.gif\",\r\n\t\t\"data\": \":^(药丸)\",\r\n\t\t\"text\": \"药丸\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/奶瓶.gif\",\r\n\t\t\"data\": \":^(奶瓶)\",\r\n\t\t\"text\": \"奶瓶\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/灯笼.gif\",\r\n\t\t\"data\": \":^(灯笼)\",\r\n\t\t\"text\": \"灯笼\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/青蛙.gif\",\r\n\t\t\"data\": \":^(青蛙)\",\r\n\t\t\"text\": \"青蛙\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/戒指.gif\",\r\n\t\t\"data\": \":^(戒指)\",\r\n\t\t\"text\": \"戒指\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/K歌.gif\",\r\n\t\t\"data\": \":^(K歌)\",\r\n\t\t\"text\": \"K歌\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/熊猫.gif\",\r\n\t\t\"data\": \":^(熊猫)\",\r\n\t\t\"text\": \"熊猫\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/喝彩.gif\",\r\n\t\t\"data\": \":^(喝彩)\",\r\n\t\t\"text\": \"喝彩\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/购物.gif\",\r\n\t\t\"data\": \":^(购物)\",\r\n\t\t\"text\": \"购物\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/多云.gif\",\r\n\t\t\"data\": \":^(多云)\",\r\n\t\t\"text\": \"多云\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/鞭炮.gif\",\r\n\t\t\"data\": \":^(鞭炮)\",\r\n\t\t\"text\": \"鞭炮\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/飞机.gif\",\r\n\t\t\"data\": \":^(飞机)\",\r\n\t\t\"text\": \"飞机\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/qq/气球.gif\",\r\n\t\t\"data\": \":^(气球)\",\r\n\t\t\"text\": \"气球\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/doge.png\",\r\n\t\t\"data\": \":)(doge)\",\r\n\t\t\"text\": \"doge\",\r\n\t\t\"category\": \"微博\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/miao.png\",\r\n\t\t\"data\": \":)(miao)\",\r\n\t\t\"text\": \"miao\",\r\n\t\t\"category\": \"微博\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog1.png\",\r\n\t\t\"data\": \":)(dog1)\",\r\n\t\t\"text\": \"dog1\",\r\n\t\t\"category\": \"微博\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/erha.png\",\r\n\t\t\"data\": \":)(erha)\",\r\n\t\t\"text\": \"erha\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog2.png\",\r\n\t\t\"data\": \":)(doge2)\",\r\n\t\t\"text\": \"doge2\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog3.png\",\r\n\t\t\"data\": \":)(doge3)\",\r\n\t\t\"text\": \"doge3\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog4.png\",\r\n\t\t\"data\": \":)(doge4)\",\r\n\t\t\"text\": \"doge4\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog5.png\",\r\n\t\t\"data\": \":)(doge5)\",\r\n\t\t\"text\": \"doge5\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog6.png\",\r\n\t\t\"data\": \":)(doge6)\",\r\n\t\t\"text\": \"doge6\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog7.png\",\r\n\t\t\"data\": \":)(doge7)\",\r\n\t\t\"text\": \"doge7\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog8.png\",\r\n\t\t\"data\": \":)(doge8)\",\r\n\t\t\"text\": \"doge8\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog9.png\",\r\n\t\t\"data\": \":)(doge9)\",\r\n\t\t\"text\": \"doge9\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog10.png\",\r\n\t\t\"data\": \":)(doge10)\",\r\n\t\t\"text\": \"doge10\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog11.png\",\r\n\t\t\"data\": \":)(doge11)\",\r\n\t\t\"text\": \"doge11\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog12.png\",\r\n\t\t\"data\": \":)(doge12)\",\r\n\t\t\"text\": \"doge12\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog13.png\",\r\n\t\t\"data\": \":)(doge13)\",\r\n\t\t\"text\": \"doge13\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog14.png\",\r\n\t\t\"data\": \":)(doge14)\",\r\n\t\t\"text\": \"doge14\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dog15.png\",\r\n\t\t\"data\": \":)(doge15)\",\r\n\t\t\"text\": \"doge15\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/aini.png\",\r\n\t\t\"data\": \":)(aini)\",\r\n\t\t\"text\": \"aini\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/aoteman.png\",\r\n\t\t\"data\": \":)(aoteman)\",\r\n\t\t\"text\": \"aoteman\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/baibai.png\",\r\n\t\t\"data\": \":)(baibai)\",\r\n\t\t\"text\": \"baibai\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/beishang.png\",\r\n\t\t\"data\": \":)(beishang)\",\r\n\t\t\"text\": \"beishang\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/bishi.png\",\r\n\t\t\"data\": \":)(bishi)\",\r\n\t\t\"text\": \"bishi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/bizui.png\",\r\n\t\t\"data\": \":)(bizui)\",\r\n\t\t\"text\": \"bizui\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/chanzui.png\",\r\n\t\t\"data\": \":)(chanzui)\",\r\n\t\t\"text\": \"chanzui\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/chijing.png\",\r\n\t\t\"data\": \":)(chijing)\",\r\n\t\t\"text\": \"chijing\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dahaqi.png\",\r\n\t\t\"data\": \":)(dahaqi)\",\r\n\t\t\"text\": \"dahaqi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/dalian.png\",\r\n\t\t\"data\": \":)(dalian)\",\r\n\t\t\"text\": \"dalian\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/ding.png\",\r\n\t\t\"data\": \":)(ding)\",\r\n\t\t\"text\": \"ding\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/feizao.png\",\r\n\t\t\"data\": \":)(feizao)\",\r\n\t\t\"text\": \"feizao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/ganmao.png\",\r\n\t\t\"data\": \":)(ganmao)\",\r\n\t\t\"text\": \"ganmao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/guzhang.png\",\r\n\t\t\"data\": \":)(guzhang)\",\r\n\t\t\"text\": \"guzhang\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/haha.png\",\r\n\t\t\"data\": \":)(haha)\",\r\n\t\t\"text\": \"haha\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/haixiu.png\",\r\n\t\t\"data\": \":)(haixiu)\",\r\n\t\t\"text\": \"haixiu\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/hehe.png\",\r\n\t\t\"data\": \":)(hehe)\",\r\n\t\t\"text\": \"hehe\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/heixian.png\",\r\n\t\t\"data\": \":)(heixian)\",\r\n\t\t\"text\": \"heixian\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/heng.png\",\r\n\t\t\"data\": \":)(heng)\",\r\n\t\t\"text\": \"heng\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/huaxin.png\",\r\n\t\t\"data\": \":)(huaxin)\",\r\n\t\t\"text\": \"huaxin\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/jiyan.png\",\r\n\t\t\"data\": \":)(jiyan)\",\r\n\t\t\"text\": \"jiyan\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/keai.png\",\r\n\t\t\"data\": \":)(keai)\",\r\n\t\t\"text\": \"keai\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/kelian.png\",\r\n\t\t\"data\": \":)(kelian)\",\r\n\t\t\"text\": \"kelian\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/ku.png\",\r\n\t\t\"data\": \":)(ku)\",\r\n\t\t\"text\": \"ku\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/kun.png\",\r\n\t\t\"data\": \":)(kun)\",\r\n\t\t\"text\": \"kun\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/landelini.png\",\r\n\t\t\"data\": \":)(landelini)\",\r\n\t\t\"text\": \"landelini\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/lei.png\",\r\n\t\t\"data\": \":)(lei)\",\r\n\t\t\"text\": \"lei\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/nanhaier.png\",\r\n\t\t\"data\": \":)(nanhaier)\",\r\n\t\t\"text\": \"nanhaier\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/nu.png\",\r\n\t\t\"data\": \":)(nu)\",\r\n\t\t\"text\": \"nu\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/numa.png\",\r\n\t\t\"data\": \":)(numa)\",\r\n\t\t\"text\": \"numa\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/nvhaier.png\",\r\n\t\t\"data\": \":)(nvhaier)\",\r\n\t\t\"text\": \"nvhaier\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/qian.png\",\r\n\t\t\"data\": \":)(qian)\",\r\n\t\t\"text\": \"qian\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/qinqin.png\",\r\n\t\t\"data\": \":)(qinqin)\",\r\n\t\t\"text\": \"qinqin\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/shayan.png\",\r\n\t\t\"data\": \":)(shayan)\",\r\n\t\t\"text\": \"shayan\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/shengbing.png\",\r\n\t\t\"data\": \":)(shengbing)\",\r\n\t\t\"text\": \"shengbing\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/shenshou.png\",\r\n\t\t\"data\": \":)(shenshou)\",\r\n\t\t\"text\": \"shenshou\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/shiwang.png\",\r\n\t\t\"data\": \":)(shiwang)\",\r\n\t\t\"text\": \"shiwang\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/shuai.png\",\r\n\t\t\"data\": \":)(shuai)\",\r\n\t\t\"text\": \"shuai\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/shuijiao.png\",\r\n\t\t\"data\": \":)(shuijiao)\",\r\n\t\t\"text\": \"shuijiao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/sikao.png\",\r\n\t\t\"data\": \":)(sikao)\",\r\n\t\t\"text\": \"sikao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/taikaixin.png\",\r\n\t\t\"data\": \":)(taikaixin)\",\r\n\t\t\"text\": \"taikaixin\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/touxiao.png\",\r\n\t\t\"data\": \":)(touxiao)\",\r\n\t\t\"text\": \"touxiao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/tu.png\",\r\n\t\t\"data\": \":)(tu)\",\r\n\t\t\"text\": \"tu\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/tuzi.png\",\r\n\t\t\"data\": \":)(tuzi)\",\r\n\t\t\"text\": \"tuzi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/wabishi.png\",\r\n\t\t\"data\": \":)(wabishi)\",\r\n\t\t\"text\": \"wabishi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/weiqu.png\",\r\n\t\t\"data\": \":)(weiqu)\",\r\n\t\t\"text\": \"weiqu\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/xiaoku.png\",\r\n\t\t\"data\": \":)(xiaoku)\",\r\n\t\t\"text\": \"xiaoku\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/xiongmao.png\",\r\n\t\t\"data\": \":)(xiongmao)\",\r\n\t\t\"text\": \"xiongmao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/xixi.png\",\r\n\t\t\"data\": \":)(xixi)\",\r\n\t\t\"text\": \"xixi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/xu.png\",\r\n\t\t\"data\": \":)(xu)\",\r\n\t\t\"text\": \"xu\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/yinxian.png\",\r\n\t\t\"data\": \":)(yinxian)\",\r\n\t\t\"text\": \"yinxian\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/yiwen.png\",\r\n\t\t\"data\": \":)(yiwen)\",\r\n\t\t\"text\": \"yiwen\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/youhengheng.png\",\r\n\t\t\"data\": \":)(youhengheng)\",\r\n\t\t\"text\": \"youhengheng\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/yun.png\",\r\n\t\t\"data\": \":)(yun)\",\r\n\t\t\"text\": \"yun\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/zhuakuang.png\",\r\n\t\t\"data\": \":)(zhuakuang)\",\r\n\t\t\"text\": \"zhuakuang\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/zhutou.png\",\r\n\t\t\"data\": \":)(zhutou)\",\r\n\t\t\"text\": \"zhutou\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/zuiyou.png\",\r\n\t\t\"data\": \":)(zuiyou)\",\r\n\t\t\"text\": \"zuiyou\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/zuohengheng.png\",\r\n\t\t\"data\": \":)(zuohengheng)\",\r\n\t\t\"text\": \"zuohengheng\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/geili.png\",\r\n\t\t\"data\": \":)(geili)\",\r\n\t\t\"text\": \"geili\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/hufen.png\",\r\n\t\t\"data\": \":)(hufen)\",\r\n\t\t\"text\": \"hufen\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/jiong.png\",\r\n\t\t\"data\": \":)(jiong)\",\r\n\t\t\"text\": \"jiong\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/meng.png\",\r\n\t\t\"data\": \":)(meng)\",\r\n\t\t\"text\": \"meng\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/shenma.png\",\r\n\t\t\"data\": \":)(shenma)\",\r\n\t\t\"text\": \"shenma\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/v5.png\",\r\n\t\t\"data\": \":)(v5)\",\r\n\t\t\"text\": \"v5\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/xi.png\",\r\n\t\t\"data\": \":)(xi)\",\r\n\t\t\"text\": \"xi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/weibo/zhi.png\",\r\n\t\t\"data\": \":)(zhi)\",\r\n\t\t\"text\": \"zhi\",\r\n\t\t\"category\": \"微博\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/呵呵.png\",\r\n\t\t\"data\": \":u(呵呵)\",\r\n\t\t\"text\": \"呵呵\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/哈哈.png\",\r\n\t\t\"data\": \":u(哈哈)\",\r\n\t\t\"text\": \"哈哈\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/吐舌.png\",\r\n\t\t\"data\": \":u(吐舌)\",\r\n\t\t\"text\": \"吐舌\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/太开心.png\",\r\n\t\t\"data\": \":u(太开心)\",\r\n\t\t\"text\": \"太开心\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/笑眼.png\",\r\n\t\t\"data\": \":u(笑眼)\",\r\n\t\t\"text\": \"笑眼\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/花心.png\",\r\n\t\t\"data\": \":u(花心)\",\r\n\t\t\"text\": \"花心\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/小乖.png\",\r\n\t\t\"data\": \":u(小乖)\",\r\n\t\t\"text\": \"小乖\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/乖.png\",\r\n\t\t\"data\": \":u(乖)\",\r\n\t\t\"text\": \"乖\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/捂嘴笑.png\",\r\n\t\t\"data\": \":u(捂嘴笑)\",\r\n\t\t\"text\": \"捂嘴笑\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/滑稽.png\",\r\n\t\t\"data\": \":u(滑稽)\",\r\n\t\t\"text\": \"滑稽\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/你懂的.png\",\r\n\t\t\"data\": \":u(你懂的)\",\r\n\t\t\"text\": \"你懂的\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/不高兴.png\",\r\n\t\t\"data\": \":u(不高兴)\",\r\n\t\t\"text\": \"不高兴\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/怒.png\",\r\n\t\t\"data\": \":u(怒)\",\r\n\t\t\"text\": \"怒\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/汗.png\",\r\n\t\t\"data\": \":u(汗)\",\r\n\t\t\"text\": \"汗\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/黑线.png\",\r\n\t\t\"data\": \":u(黑线)\",\r\n\t\t\"text\": \"黑线\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/泪.png\",\r\n\t\t\"data\": \":u(泪)\",\r\n\t\t\"text\": \"泪\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/喷.png\",\r\n\t\t\"data\": \":u(喷)\",\r\n\t\t\"text\": \"喷\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/惊哭.png\",\r\n\t\t\"data\": \":u(惊哭)\",\r\n\t\t\"text\": \"惊哭\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/阴险.png\",\r\n\t\t\"data\": \":u(阴险)\",\r\n\t\t\"text\": \"阴险\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/鄙视.png\",\r\n\t\t\"data\": \":u(鄙视)\",\r\n\t\t\"text\": \"鄙视\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/酷.png\",\r\n\t\t\"data\": \":u(酷)\",\r\n\t\t\"text\": \"酷\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/啊.png\",\r\n\t\t\"data\": \":u(啊)\",\r\n\t\t\"text\": \"啊\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/狂汗.png\",\r\n\t\t\"data\": \":u(狂汗)\",\r\n\t\t\"text\": \"狂汗\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/what.png\",\r\n\t\t\"data\": \":u(what)\",\r\n\t\t\"text\": \"what\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/疑问.png\",\r\n\t\t\"data\": \":u(疑问)\",\r\n\t\t\"text\": \"疑问\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/酸爽.png\",\r\n\t\t\"data\": \":u(酸爽)\",\r\n\t\t\"text\": \"酸爽\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/呀咩爹.png\",\r\n\t\t\"data\": \":u(呀咩爹)\",\r\n\t\t\"text\": \"呀咩爹\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/委屈.png\",\r\n\t\t\"data\": \":u(委屈)\",\r\n\t\t\"text\": \"委屈\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/惊讶.png\",\r\n\t\t\"data\": \":u(惊讶)\",\r\n\t\t\"text\": \"惊讶\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/睡觉.png\",\r\n\t\t\"data\": \":u(睡觉)\",\r\n\t\t\"text\": \"睡觉\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/笑尿.png\",\r\n\t\t\"data\": \":u(笑尿)\",\r\n\t\t\"text\": \"笑尿\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/挖鼻.png\",\r\n\t\t\"data\": \":u(挖鼻)\",\r\n\t\t\"text\": \"挖鼻\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/吐.png\",\r\n\t\t\"data\": \":u(吐)\",\r\n\t\t\"text\": \"吐\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/犀利.png\",\r\n\t\t\"data\": \":u(犀利)\",\r\n\t\t\"text\": \"犀利\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/小红脸.png\",\r\n\t\t\"data\": \":u(小红脸)\",\r\n\t\t\"text\": \"小红脸\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/懒得理.png\",\r\n\t\t\"data\": \":u(懒得理)\",\r\n\t\t\"text\": \"懒得理\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/勉强.png\",\r\n\t\t\"data\": \":u(勉强)\",\r\n\t\t\"text\": \"勉强\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/爱心.png\",\r\n\t\t\"data\": \":u(爱心)\",\r\n\t\t\"text\": \"爱心\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/心碎.png\",\r\n\t\t\"data\": \":u(心碎)\",\r\n\t\t\"text\": \"心碎\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/玫瑰.png\",\r\n\t\t\"data\": \":u(玫瑰)\",\r\n\t\t\"text\": \"玫瑰\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/礼物.png\",\r\n\t\t\"data\": \":u(礼物)\",\r\n\t\t\"text\": \"礼物\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/彩虹.png\",\r\n\t\t\"data\": \":u(彩虹)\",\r\n\t\t\"text\": \"彩虹\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/太阳.png\",\r\n\t\t\"data\": \":u(太阳)\",\r\n\t\t\"text\": \"太阳\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/星星月亮.png\",\r\n\t\t\"data\": \":u(星星月亮)\",\r\n\t\t\"text\": \"星星月亮\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/钱币.png\",\r\n\t\t\"data\": \":u(钱币)\",\r\n\t\t\"text\": \"钱币\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/茶杯.png\",\r\n\t\t\"data\": \":u(茶杯)\",\r\n\t\t\"text\": \"茶杯\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/蛋糕.png\",\r\n\t\t\"data\": \":u(蛋糕)\",\r\n\t\t\"text\": \"蛋糕\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/大拇指.png\",\r\n\t\t\"data\": \":u(大拇指)\",\r\n\t\t\"text\": \"大拇指\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/胜利.png\",\r\n\t\t\"data\": \":u(胜利)\",\r\n\t\t\"text\": \"胜利\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/haha.png\",\r\n\t\t\"data\": \":u(haha)\",\r\n\t\t\"text\": \"haha\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/OK.png\",\r\n\t\t\"data\": \":u(OK)\",\r\n\t\t\"text\": \"OK\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/沙发.png\",\r\n\t\t\"data\": \":u(沙发)\",\r\n\t\t\"text\": \"沙发\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/手纸.png\",\r\n\t\t\"data\": \":u(手纸)\",\r\n\t\t\"text\": \"手纸\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/香蕉.png\",\r\n\t\t\"data\": \":u(香蕉)\",\r\n\t\t\"text\": \"香蕉\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/便便.png\",\r\n\t\t\"data\": \":u(便便)\",\r\n\t\t\"text\": \"便便\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/药丸.png\",\r\n\t\t\"data\": \":u(药丸)\",\r\n\t\t\"text\": \"药丸\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/红领巾.png\",\r\n\t\t\"data\": \":u(红领巾)\",\r\n\t\t\"text\": \"红领巾\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/蜡烛.png\",\r\n\t\t\"data\": \":u(蜡烛)\",\r\n\t\t\"text\": \"蜡烛\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/音乐.png\",\r\n\t\t\"data\": \":u(音乐)\",\r\n\t\t\"text\": \"音乐\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/newtieba/灯泡.png\",\r\n\t\t\"data\": \":u(灯泡)\",\r\n\t\t\"text\": \"灯泡\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/呵呵.png\",\r\n\t\t\"data\": \":w(呵呵)\",\r\n\t\t\"text\": \"呵呵\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/哈哈.png\",\r\n\t\t\"data\": \":w(哈哈)\",\r\n\t\t\"text\": \"哈哈\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/吐舌.png\",\r\n\t\t\"data\": \":w(吐舌)\",\r\n\t\t\"text\": \"吐舌\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/啊.png\",\r\n\t\t\"data\": \":w(啊)\",\r\n\t\t\"text\": \"啊\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/酷.png\",\r\n\t\t\"data\": \":w(酷)\",\r\n\t\t\"text\": \"酷\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/怒.png\",\r\n\t\t\"data\": \":w(怒)\",\r\n\t\t\"text\": \"怒\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/开心.png\",\r\n\t\t\"data\": \":w(开心)\",\r\n\t\t\"text\": \"开心\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/汗.png\",\r\n\t\t\"data\": \":w(汗)\",\r\n\t\t\"text\": \"汗\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/泪.png\",\r\n\t\t\"data\": \":w(泪)\",\r\n\t\t\"text\": \"泪\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/黑线.png\",\r\n\t\t\"data\": \":w(黑线)\",\r\n\t\t\"text\": \"黑线\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/鄙视.png\",\r\n\t\t\"data\": \":w(鄙视)\",\r\n\t\t\"text\": \"鄙视\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/不高兴.png\",\r\n\t\t\"data\": \":w(不高兴)\",\r\n\t\t\"text\": \"不高兴\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/真棒.png\",\r\n\t\t\"data\": \":w(真棒)\",\r\n\t\t\"text\": \"真棒\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/钱.png\",\r\n\t\t\"data\": \":w(钱)\",\r\n\t\t\"text\": \"钱\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/疑问.png\",\r\n\t\t\"data\": \":w(疑问)\",\r\n\t\t\"text\": \"疑问\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/阴险.png\",\r\n\t\t\"data\": \":w(阴险)\",\r\n\t\t\"text\": \"阴险\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/吐.png\",\r\n\t\t\"data\": \":w(吐)\",\r\n\t\t\"text\": \"吐\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/咦.png\",\r\n\t\t\"data\": \":w(咦)\",\r\n\t\t\"text\": \"咦\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/委屈.png\",\r\n\t\t\"data\": \":w(委屈)\",\r\n\t\t\"text\": \"委屈\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/花心.png\",\r\n\t\t\"data\": \":w(花心)\",\r\n\t\t\"text\": \"花心\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/呼.png\",\r\n\t\t\"data\": \":w(呼)\",\r\n\t\t\"text\": \"呼\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/笑眼.png\",\r\n\t\t\"data\": \":w(笑眼)\",\r\n\t\t\"text\": \"笑眼\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/冷.png\",\r\n\t\t\"data\": \":w(冷)\",\r\n\t\t\"text\": \"冷\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/太开心.png\",\r\n\t\t\"data\": \":w(太开心)\",\r\n\t\t\"text\": \"太开心\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/滑稽.png\",\r\n\t\t\"data\": \":w(滑稽)\",\r\n\t\t\"text\": \"滑稽\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/勉强.png\",\r\n\t\t\"data\": \":w(勉强)\",\r\n\t\t\"text\": \"勉强\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/狂汗.png\",\r\n\t\t\"data\": \":w(狂汗)\",\r\n\t\t\"text\": \"狂汗\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/乖.png\",\r\n\t\t\"data\": \":w(乖)\",\r\n\t\t\"text\": \"乖\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/睡觉.png\",\r\n\t\t\"data\": \":w(睡觉)\",\r\n\t\t\"text\": \"睡觉\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/惊哭.png\",\r\n\t\t\"data\": \":w(惊哭)\",\r\n\t\t\"text\": \"惊哭\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/生气.png\",\r\n\t\t\"data\": \":w(生气)\",\r\n\t\t\"text\": \"生气\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/惊讶.png\",\r\n\t\t\"data\": \":w(惊讶)\",\r\n\t\t\"text\": \"惊讶\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/喷.png\",\r\n\t\t\"data\": \":w(喷)\",\r\n\t\t\"text\": \"喷\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/玫瑰.png\",\r\n\t\t\"data\": \":w(玫瑰)\",\r\n\t\t\"text\": \"玫瑰\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/礼物.png\",\r\n\t\t\"data\": \":w(礼物)\",\r\n\t\t\"text\": \"礼物\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/彩虹.png\",\r\n\t\t\"data\": \":w(彩虹)\",\r\n\t\t\"text\": \"彩虹\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/钱币.png\",\r\n\t\t\"data\": \":w(钱币)\",\r\n\t\t\"text\": \"钱币\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/灯泡.png\",\r\n\t\t\"data\": \":w(灯泡)\",\r\n\t\t\"text\": \"灯泡\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/茶杯.png\",\r\n\t\t\"data\": \":w(茶杯)\",\r\n\t\t\"text\": \"茶杯\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/音乐.png\",\r\n\t\t\"data\": \":w(音乐)\",\r\n\t\t\"text\": \"音乐\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/haha.png\",\r\n\t\t\"data\": \":w(haha)\",\r\n\t\t\"text\": \"haha\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/胜利.png\",\r\n\t\t\"data\": \":w(胜利)\",\r\n\t\t\"text\": \"胜利\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/大拇指.png\",\r\n\t\t\"data\": \":w(大拇指)\",\r\n\t\t\"text\": \"大拇指\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/tieba/弱.png\",\r\n\t\t\"data\": \":w(弱)\",\r\n\t\t\"text\": \"弱\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E9AB98E585B4_2x.png\",\r\n\t\t\"data\": \":@(高兴)\",\r\n\t\t\"text\": \"高兴\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E5B08FE68092_2x.png\",\r\n\t\t\"data\": \":@(小怒)\",\r\n\t\t\"text\": \"小怒\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E884B8E7BAA2_2x.png\",\r\n\t\t\"data\": \":@(脸红)\",\r\n\t\t\"text\": \"脸红\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E58685E4BCA4_2x.png\",\r\n\t\t\"data\": \":@(内伤)\",\r\n\t\t\"text\": \"内伤\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E8A385E5A4A7E6ACBE_2x.png\",\r\n\t\t\"data\": \":@(装大款)\",\r\n\t\t\"text\": \"装大款\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E8B59EE4B880E4B8AA_2x.png\",\r\n\t\t\"data\": \":@(赞一个)\",\r\n\t\t\"text\": \"赞一个\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E5AEB3E7BE9E_2x.png\",\r\n\t\t\"data\": \":@(害羞)\",\r\n\t\t\"text\": \"害羞\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E6B197_2x.png\",\r\n\t\t\"data\": \":@(汗)\",\r\n\t\t\"text\": \"汗\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E59090E8A180E58092E59CB0_2x.png\",\r\n\t\t\"data\": \":@(吐血倒地)\",\r\n\t\t\"text\": \"吐血倒地\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E6B7B1E6809D_2x.png\",\r\n\t\t\"data\": \":@(深思)\",\r\n\t\t\"text\": \"深思\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E4B88DE9AB98E585B4_2x.png\",\r\n\t\t\"data\": \":@(不高兴)\",\r\n\t\t\"text\": \"不高兴\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E697A0E8AFAD_2x.png\",\r\n\t\t\"data\": \":@(无语)\",\r\n\t\t\"text\": \"无语\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E4BAB2E4BAB2_2x.png\",\r\n\t\t\"data\": \":@(亲亲)\",\r\n\t\t\"text\": \"亲亲\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E58FA3E6B0B4_2x.png\",\r\n\t\t\"data\": \":@(口水)\",\r\n\t\t\"text\": \"口水\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E5B0B4E5B0AC_2x.png\",\r\n\t\t\"data\": \":@(尴尬)\",\r\n\t\t\"text\": \"尴尬\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E4B8ADE68C87_2x.png\",\r\n\t\t\"data\": \":@(中指)\",\r\n\t\t\"text\": \"中指\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E683B3E4B880E683B3_2x.png\",\r\n\t\t\"data\": \":@(想一想)\",\r\n\t\t\"text\": \"想一想\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E593ADE6B3A3_2x.png\",\r\n\t\t\"data\": \":@(哭泣)\",\r\n\t\t\"text\": \"哭泣\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E4BEBFE4BEBF_2x.png\",\r\n\t\t\"data\": \":@(便便)\",\r\n\t\t\"text\": \"便便\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E78CAEE88AB1_2x.png\",\r\n\t\t\"data\": \":@(献花)\",\r\n\t\t\"text\": \"献花\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E79AB1E79C89_2x.png\",\r\n\t\t\"data\": \":@(皱眉)\",\r\n\t\t\"text\": \"皱眉\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E582BBE7AC91_2x.png\",\r\n\t\t\"data\": \":@(傻笑)\",\r\n\t\t\"text\": \"傻笑\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E78B82E6B197_2x.png\",\r\n\t\t\"data\": \":@(狂汗)\",\r\n\t\t\"text\": \"狂汗\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E59090_2x.png\",\r\n\t\t\"data\": \":@(吐)\",\r\n\t\t\"text\": \"吐\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E596B7E6B0B4_2x.png\",\r\n\t\t\"data\": \":@(喷水)\",\r\n\t\t\"text\": \"喷水\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E79C8BE4B88DE8A781_2x.png\",\r\n\t\t\"data\": \":@(看不见)\",\r\n\t\t\"text\": \"看不见\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E9BC93E68E8C_2x.png\",\r\n\t\t\"data\": \":@(鼓掌)\",\r\n\t\t\"text\": \"鼓掌\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E998B4E69A97_2x.png\",\r\n\t\t\"data\": \":@(阴暗)\",\r\n\t\t\"text\": \"阴暗\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E995BFE88D89_2x.png\",\r\n\t\t\"data\": \":@(长草)\",\r\n\t\t\"text\": \"长草\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E78CAEE9BB84E7939C_2x.png\",\r\n\t\t\"data\": \":@(献黄瓜)\",\r\n\t\t\"text\": \"献黄瓜\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E982AAE681B6_2x.png\",\r\n\t\t\"data\": \":@(邪恶)\",\r\n\t\t\"text\": \"邪恶\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E69C9FE5BE85_2x.png\",\r\n\t\t\"data\": \":@(期待)\",\r\n\t\t\"text\": \"期待\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E5BE97E6848F_2x.png\",\r\n\t\t\"data\": \":@(得意)\",\r\n\t\t\"text\": \"得意\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E59090E8888C_2x.png\",\r\n\t\t\"data\": \":@(吐舌)\",\r\n\t\t\"text\": \"吐舌\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E596B7E8A180_2x.png\",\r\n\t\t\"data\": \":@(喷血)\",\r\n\t\t\"text\": \"喷血\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E697A0E68980E8B093_2x.png\",\r\n\t\t\"data\": \":@(无所谓)\",\r\n\t\t\"text\": \"无所谓\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E8A782E5AF9F_2x.png\",\r\n\t\t\"data\": \":@(观察)\",\r\n\t\t\"text\": \"观察\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E69A97E59CB0E8A782E5AF9F_2x.png\",\r\n\t\t\"data\": \":@(暗地观察)\",\r\n\t\t\"text\": \"暗地观察\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E882BFE58C85_2x.png\",\r\n\t\t\"data\": \":@(肿包)\",\r\n\t\t\"text\": \"肿包\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E4B8ADE69EAA_2x.png\",\r\n\t\t\"data\": \":@(中枪)\",\r\n\t\t\"text\": \"中枪\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E5A4A7E59BA7_2x.png\",\r\n\t\t\"data\": \":@(大囧)\",\r\n\t\t\"text\": \"大囧\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E591B2E78999_2x.png\",\r\n\t\t\"data\": \":@(呲牙)\",\r\n\t\t\"text\": \"呲牙\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E68AA0E9BCBB_2x.png\",\r\n\t\t\"data\": \":@(抠鼻)\",\r\n\t\t\"text\": \"抠鼻\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E4B88DE8AFB4E8AF9D_2x.png\",\r\n\t\t\"data\": \":@(不说话)\",\r\n\t\t\"text\": \"不说话\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E592BDE6B094_2x.png\",\r\n\t\t\"data\": \":@(咽气)\",\r\n\t\t\"text\": \"咽气\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E6ACA2E591BC_2x.png\",\r\n\t\t\"data\": \":@(欢呼)\",\r\n\t\t\"text\": \"欢呼\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E99481E79C89_2x.png\",\r\n\t\t\"data\": \":@(锁眉)\",\r\n\t\t\"text\": \"锁眉\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E89CA1E7839B_2x.png\",\r\n\t\t\"data\": \":@(蜡烛)\",\r\n\t\t\"text\": \"蜡烛\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E59D90E7AD89_2x.png\",\r\n\t\t\"data\": \":@(坐等)\",\r\n\t\t\"text\": \"坐等\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E587BBE68E8C_2x.png\",\r\n\t\t\"data\": \":@(击掌)\",\r\n\t\t\"text\": \"击掌\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E6838AE5969C_2x.png\",\r\n\t\t\"data\": \":@(惊喜)\",\r\n\t\t\"text\": \"惊喜\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E5969CE69E81E8808CE6B3A3_2x.png\",\r\n\t\t\"data\": \":@(喜极而泣)\",\r\n\t\t\"text\": \"喜极而泣\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E68ABDE7839F_2x.png\",\r\n\t\t\"data\": \":@(抽烟)\",\r\n\t\t\"text\": \"抽烟\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E4B88DE587BAE68980E69699_2x.png\",\r\n\t\t\"data\": \":@(不出所料)\",\r\n\t\t\"text\": \"不出所料\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E684A4E68092_2x.png\",\r\n\t\t\"data\": \":@(愤怒)\",\r\n\t\t\"text\": \"愤怒\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E697A0E5A588_2x.png\",\r\n\t\t\"data\": \":@(无奈)\",\r\n\t\t\"text\": \"无奈\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E9BB91E7BABF_2x.png\",\r\n\t\t\"data\": \":@(黑线)\",\r\n\t\t\"text\": \"黑线\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E68A95E9998D_2x.png\",\r\n\t\t\"data\": \":@(投降)\",\r\n\t\t\"text\": \"投降\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E79C8BE783ADE997B9_2x.png\",\r\n\t\t\"data\": \":@(看热闹)\",\r\n\t\t\"text\": \"看热闹\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E68987E880B3E58589_2x.png\",\r\n\t\t\"data\": \":@(扇耳光)\",\r\n\t\t\"text\": \"扇耳光\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E5B08FE79CBCE79D9B_2x.png\",\r\n\t\t\"data\": \":@(小眼睛)\",\r\n\t\t\"text\": \"小眼睛\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/aru/E4B8ADE58880_2x.png\",\r\n\t\t\"data\": \":@(中刀)\",\r\n\t\t\"text\": \"中刀\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E581B7E79C8B.png\",\r\n\t\t\"data\": \":&(蛆音娘_偷看)\",\r\n\t\t\"text\": \"蛆音娘_偷看\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E6918AE6898B.png\",\r\n\t\t\"data\": \":&(蛆音娘_摊手)\",\r\n\t\t\"text\": \"蛆音娘_摊手\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E697A0E8AFAD.png\",\r\n\t\t\"data\": \":&(蛆音娘_无语)\",\r\n\t\t\"text\": \"蛆音娘_无语\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E5AEB3E68095.png\",\r\n\t\t\"data\": \":&(蛆音娘_害怕)\",\r\n\t\t\"text\": \"蛆音娘_害怕\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E58EBBE4B896.png\",\r\n\t\t\"data\": \":&(蛆音娘_去世)\",\r\n\t\t\"text\": \"蛆音娘_去世\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E79DA1E8A789.png\",\r\n\t\t\"data\": \":&(蛆音娘_睡觉)\",\r\n\t\t\"text\": \"蛆音娘_睡觉\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E593ADE6B3A3.png\",\r\n\t\t\"data\": \":&(蛆音娘_哭泣)\",\r\n\t\t\"text\": \"蛆音娘_哭泣\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E6BB91E7A8BD.png\",\r\n\t\t\"data\": \":&(蛆音娘_滑稽)\",\r\n\t\t\"text\": \"蛆音娘_滑稽\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E882A5E79A82.png\",\r\n\t\t\"data\": \":&(蛆音娘_肥皂)\",\r\n\t\t\"text\": \"蛆音娘_肥皂\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E7949FE6B094.png\",\r\n\t\t\"data\": \":&(蛆音娘_生气)\",\r\n\t\t\"text\": \"蛆音娘_生气\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E4B88DE684A7E698AFE68891.png\",\r\n\t\t\"data\": \":&(蛆音娘_不愧是我)\",\r\n\t\t\"text\": \"蛆音娘_不愧是我\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E59083E6838A.png\",\r\n\t\t\"data\": \":&(蛆音娘_吃惊)\",\r\n\t\t\"text\": \"蛆音娘_吃惊\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E689B6E9A29D.png\",\r\n\t\t\"data\": \":&(蛆音娘_扶额)\",\r\n\t\t\"text\": \"蛆音娘_扶额\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E5A4A7E7AC91.png\",\r\n\t\t\"data\": \":&(蛆音娘_大笑)\",\r\n\t\t\"text\": \"蛆音娘_大笑\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E58D96E8908C.png\",\r\n\t\t\"data\": \":&(蛆音娘_卖萌)\",\r\n\t\t\"text\": \"蛆音娘_卖萌\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E59083E7939C.png\",\r\n\t\t\"data\": \":&(蛆音娘_吃瓜)\",\r\n\t\t\"text\": \"蛆音娘_吃瓜\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E59090E8A180.png\",\r\n\t\t\"data\": \":&(蛆音娘_吐血)\",\r\n\t\t\"text\": \"蛆音娘_吐血\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_OK.png\",\r\n\t\t\"data\": \":&(蛆音娘_OK)\",\r\n\t\t\"text\": \"蛆音娘_OK\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E593BC.png\",\r\n\t\t\"data\": \":&(蛆音娘_哼)\",\r\n\t\t\"text\": \"蛆音娘_哼\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E79691E997AE.png\",\r\n\t\t\"data\": \":&(蛆音娘_疑问)\",\r\n\t\t\"text\": \"蛆音娘_疑问\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t}\r\n]"
  },
  {
    "path": "assets/vendors/douban/douban.css",
    "content": ".tab {\n  padding-top: 10px;\n  position: relative;\n  overflow: hidden;\n  margin: 0 auto;\n  line-height: 1.5;\n  font-weight: 300;\n  color: #888;\n  -webkit-font-smoothing: antialiased;\n}\n\n.tabs {\n  display: table;\n  position: relative;\n  overflow: hidden;\n  margin: 0;\n  width: 100%;\n  list-style:none!important;\n}\n.tabs li {\n  float: left;\n  line-height: 38px;\n  overflow: hidden;\n  padding: 0;\n  position: relative;\n}\n.tabs a{\n  background-color: #eff0f2;\n  border-bottom: 1px solid #000;\n  color: #888;\n  font-weight: 500;\n  display: block;\n  letter-spacing: 0;\n  outline: none;\n  padding: 0 20px;\n  text-decoration: none;\n  -webkit-transition: all 0.2s ease-in-out;\n  -moz-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  border-bottom: 2px solid #000;\n  cursor:pointer;\n}\n\n.tabs_item {\n  display: none;\n  padding: 30px 0;\n}\n.tabs_item h4 {\n  font-weight: bold;\n  color: #fff;\n  font-size: 20px;\n}\n.tabs_item img {\n  width: 200px;\n  float: left;\n  margin-right: 30px;\n}\n.tabs_item:first-child {\n  display: block;\n}\n\n.current a{\n  color:#fff;\n  background: #000;\n}\n.current{\n  color: #fff;\n\n}\n.doubanboard-list{\n    display: flex;\n    flex-flow: row wrap;\n    justify-content: flex-start;\n    margin-top: 1em;\n    width: calc(100% + 15px);\n    margin-left: -15px;\n}\n.doubanboard-list,.doubanboard-list *{\n    box-sizing: border-box;\n}\n.doubanboard-item {\n    position: relative;\n    cursor: pointer;\n    box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);\n    transition: ease all 0.3s;\n    overflow: hidden;\n    background: #f7fbf7;\n    display: flex;\n    flex-flow: column nowrap;\n    justify-content: flex-start;\n    border: none!important;\n    display: block;\n    margin-left: 15px;\n    margin-bottom: 15px;\n    border-radius:8px;\n}\n.doubanboard-item:hover{\n    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);\n}\n.doubanboard-thumb {\n    width: 100%;\n    /* customize this for diffrent style */\n    padding-top: 141%;\n    background-repeat: no-repeat;\n    background-size: cover;\n}\n.doubanboard-title,.doubanboard-title a{\n    margin: 8px 0!important;\n    font-size: 1.2em!important;\n    overflow: hidden!important;\n    text-overflow: ellipsis!important;\n    white-space: nowrap !important;\n    text-align: center !important;\n    color: #202020 !important;\n    font-weight: 700 !important;\n    border:none !important;\n    padding:8px!important;\n}\n/* detail panel */\n.doubanboard-info{\n    position: absolute;\n    top:0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    transition: all 0.3s;\n    background-color: #f7fbf7;\n    color: black;\n    font-size: 0.9em;\n    line-height: 1.3em;\n    transform: translateY(100%);\n    padding: 0.5em;\n    font-size: 16px;\n    font-weight: 400;\n}\n.doubanboard-info::-webkit-scrollbar{\n    background: none;\n    width: 4px;\n    height: 6px;\n    border-radius:2px;\n}\n.doubanboard-info::-webkit-scrollbar-thumb{\n    background: rgba(0,0,0,0.2);\n    border-radius:2px;\n    line-height: 1.15;\n    font-size: 1em;\n}\n.doubanboard-info::-webkit-scrollbar-thumb:hover{\n    background: rgba(0,0,0,0.6);\n}\n.doubanboard-info-show > .doubanboard-info{\n    transform: translateY(0);\n}\n/* special for douban */\n.doubanboard-info>.doubanboard-info-basic{\n    white-space: nowrap!important;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n/* loadmore button (span) */\n.douban-loadmore{\n    display: block;\n    padding: 0.3em;\n    background: #000;\n    color: white;\n    transition:0.2s;\n    margin: 20px auto!important;\n    width: 6em;\n    text-align: center;\n    cursor: pointer;\n    border-radius:5px;\n}\n.douban-loadmore:hover{\n    background: rgba(0,0,0,0.6);\n}\n\n/* media query for responsive design */\n@media screen and (max-width: 767.5px){\n    .doubanboard-item{\n        width: calc(33.333333333% - 15px);\n    }\n}\n@media screen and (min-width:767.5px){\n    .doubanboard-item{\n        width: calc(25% - 15px);\n    }\n}\n@media screen and (max-width:450px){\n    .doubanboard-item{\n        width: calc(50% - 15px);\n    }\n}\n\n.douban-single{\n    max-width: 100%;\n    height: 230px;\n    box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);\n    border-radius: 8px;\n    overflow: hidden;\n    position: relative;\n}\n.douban-single-img{\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 22%;\n    height: 100%;\n    float: left;\n    background-size: cover;\n    background-position: center center;\n}\n.douban-single-info{\n    position: absolute;\n    width: 76%;\n    height: 100%;\n    top: 0;\n    right: 0;\n    margin-left: 24%;\n    overflow-y: auto;\n    -webkit-overflow-scrolling: touch;\n    padding: 0.2em 0.5em 0.5em 0;\n    font-size: 16px;\n    font-weight: 400;\n    line-height: 1.4;\n}\n.douban-single-info::-webkit-scrollbar{\n    background: none;\n    width: 4px;\n    height: 6px;\n    border-radius:2px;\n}\n.douban-single-info::-webkit-scrollbar-thumb{\n    background: rgba(0,0,0,0.2);\n    border-radius:2px;\n    line-height: 1.15;\n    font-size: 1em;\n}\n.douban-single-info::-webkit-scrollbar-thumb:hover{\n    background: rgba(0,0,0,0.6);\n}\n.douban-single-summary{\n    margin-top: 0.3em;\n    display: inline-block;\n}\n.douban-single-title{\n    font-size: 1.3em;\n    color: #1abc9c;\n    text-decoration: none;\n    padding: 0;\n    margin: 0;\n    border:none!important;\n}\n.douban-single-rating{\n    background-image: url(/usr/plugins/DoubanBoard/assets/rating.png);\n    display: inline-block;\n    width: 75px;\n    height: 15px;\n}\n.douban-single-meta{\n    font-size: 0.8em;\n    font-size: 0.8em;\n    display: inline-block;\n    margin: 0.5em 0;\n    opacity: 0.5;\n}\n@media screen and (max-width:767px){\n    .douban-single{\n        height: 160px;\n    }\n    .douban-single-img{\n        width: 32%;\n    }\n    .douban-single-info{\n        margin-left: 35%;\n        width: 65%;\n    }\n}"
  },
  {
    "path": "assets/vendors/douban/douban.js",
    "content": "// Author:熊猫小A\n// Modified:Whitebear(whitebear@msn.com)\n\nvar curBooks_read = 0;\nvar curBooks_reading = 0;\nvar curBooks_wish = 0;\nvar curMovies_watched = 0;\nvar curMovies_watching = 0;\nvar curMovies_wish = 0;\nvar curMusic_listened = 0;\nvar curMusic_listening = 0;\nvar curMusic_wish = 0;\nDoubanBoard = {\n    initDoubanBoard: function () {\n        \n        $(`.douban-book-list[data-status=\"read\"]`).after(`<div class=\"douban-loadmore\" id=\"loadMoreBooks_read\" onclick=\"DoubanBoard.loadBooks('read');\">加载更多</div>`);\n        $(`.douban-book-list[data-status=\"reading\"]`).after(`<div class=\"douban-loadmore\" id=\"loadMoreBooks_reading\" onclick=\"DoubanBoard.loadBooks('reading');\">加载更多</div>`);\n        $(`.douban-book-list[data-status=\"wish\"]`).after(`<div class=\"douban-loadmore\" id=\"loadMoreBooks_wish\" onclick=\"DoubanBoard.loadBooks('wish');\">加载更多</div>`);\n        $(`.douban-movie-list[data-status=\"watched\"]`).after(`<div class=\"douban-loadmore\" id=\"loadMoreMovies_watched\" onclick=\"DoubanBoard.loadMovies('watched');\">加载更多</div>`);\n        $(`.douban-movie-list[data-status=\"watching\"]`).after(`<div class=\"douban-loadmore\" id=\"loadMoreMovies_watching\" onclick=\"DoubanBoard.loadMovies('watching');\">加载更多</div>`);\n        $(`.douban-movie-list[data-status=\"wish\"]`).after(`<div class=\"douban-loadmore\" id=\"loadMoreMovies_wish\" onclick=\"DoubanBoard.loadMovies('wish');\">加载更多</div>`);\n         $(`.douban-music-list[data-status=\"listened\"]`).after(`<div class=\"douban-loadmore\" id=\"loadMoreMusics_listened\" onclick=\"DoubanBoard.loadMusics('listened');\">加载更多</div>`);\n        $(`.douban-music-list[data-status=\"listening\"]`).after(`<div class=\"douban-loadmore\" id=\"loadMoreMusics_listening\" onclick=\"DoubanBoard.loadMusics('listening');\">加载更多</div>`);\n        $(`.douban-music-list[data-status=\"wish\"]`).after(`<div class=\"douban-loadmore\" id=\"loadMoreMusics_wish\" onclick=\"DoubanBoard.loadMusics('wish');\">加载更多</div>`);\n        curBooks_read = 0;\n        curBooks_reading = 0;\n        curBooks_wish = 0;\n        curMovies_watched = 0;\n        curMovies_watching = 0;\n        curMovies_wish = 0;\n        curMusics_listened = 0;\n        curMusics_listening = 0;\n        curMusics_wish = 0;\n        DoubanBoard.loadBooks('read');\n        DoubanBoard.loadBooks('reading');\n        DoubanBoard.loadBooks('wish');\n        DoubanBoard.loadMovies('watched');\n        DoubanBoard.loadMovies('watching');\n        DoubanBoard.loadMovies('wish');\n        DoubanBoard.loadMusics('listened');\n        DoubanBoard.loadMusics('listening');\n        DoubanBoard.loadMusics('wish');\n    },\n\n    loadBooks: function (status) {\n        $(\"#honeyLoading\").show();\n        if ($(`.douban-book-list[data-status=\"` + status + `\"]`).length < 1) return;\n        $(`#loadMoreBooks_` + status).html(\"加载中...\");\n        var curBooks;\n        if (status == 'read') curBooks = curBooks_read;\n        else if (status == 'reading') curBooks = curBooks_reading;\n        else curBooks = curBooks_wish;\n        var api = window.DoubanAPI + \"?type=book&from=\" + String(curBooks) + \"&status=\" + status;\n        $.getJSON(api, function (result) {\n            $(`#loadMoreBooks_` + status).html(\"加载更多\");\n            if (result.length < DoubanPageSize) {\n                $(`#loadMoreBooks_` + status).html(\"没有啦\");\n            }\n            $.each(result, function (i, item) {\n                var html = `<a href=\"` + item.url + `\" target=\"_blank\" id=\"doubanboard-book-item-` + String(curBooks) + `\" class=\"doubanboard-item\">\n                            <div class=\"doubanboard-thumb\" style=\"background-image:url(`+ item.img + `)\"></div>\n                            <div class=\"doubanboard-title\">`+ item.name + `</div>\n                        </a>`;\n                $(`.douban-book-list[data-status=\"` + status + `\"]`).append(html);\n                if (status == 'read') curBooks_read++;\n                else if (status == 'reading') curBooks_reading++;\n                else curBooks_wish++;\n            });\n        });\n    },\n\n    loadMovies: function (status) {\n        if ($(`.douban-movie-list[data-status=\"` + status + `\"]`).length < 1) return;\n        $(\"#loadMoreMovies_\" + status).html(\"加载中...\");\n\n        var curMovies;\n        if (status == 'watched') curMovies = curMovies_watched;\n        else if (status == 'watching') curMovies = curMovies_watching;\n        else curMovies = curMovies_wish;\n\n        $.getJSON(window.DoubanAPI + \"?type=movie&from=\" + String(curMovies) + \"&status=\" + status, function (result) {\n            $(\"#loadMoreMovies_\" + status).html(\"加载更多\");\n            if (result.length < DoubanPageSize) {\n                $(\"#loadMoreMovies_\" + status).html(\"没有啦\");\n            }\n            $.each(result, function (i, item) {\n                var html = `<a href=\"` + item.url + `\" target=\"_blank\" id=\"doubanboard-movie-item-` + String(curMovies) + `\" class=\"doubanboard-item\">\n                            <div class=\"doubanboard-thumb\" style=\"background-image:url(`+ item.img + `)\"></div>\n                            <div class=\"doubanboard-title\">`+ item.name + `</div>\n                        </a>`;\n                $(`.douban-movie-list[data-status=\"` + status + `\"]`).append(html);\n                if (status == 'watched') curMovies_watched++;\n                else if (status == 'watching') curMovies_watching++;\n                else curMovies_wish++;\n            });\n        });\n    },\n\nloadMusics: function (status) {\n        if ($(`.douban-music-list[data-status=\"` + status + `\"]`).length < 1) return;\n        $(\"#loadMoreMusics_\" + status).html(\"加载中...\");\n\n        var curMusics;\n        if (status == 'listened') curMusics = curMusics_listened;\n        else if (status == 'listening') curMusics = curMusics_listening;\n        else curMusics = curMusics_wish;\n\n        $.getJSON(window.DoubanAPI + \"?type=music&from=\" + String(curMusics) + \"&status=\" + status, function (result) {\n            $(\"#loadMoreMusics_\" + status).html(\"加载更多\");\n            if (result.length < DoubanPageSize) {\n                $(\"#loadMoreMusics_\" + status).html(\"没有啦\");\n            }\n            $.each(result, function (i, item) {\n                var html = `<a href=\"` + item.url + `\" target=\"_blank\" id=\"doubanboard-music-item-` + String(curMusics) + `\" class=\"doubanboard-item\">\n                            <div class=\"doubanboard-thumb\" style=\"background-image:url(`+ item.img + `)\"></div>\n                            <div class=\"doubanboard-title\">`+ item.name + `</div>\n                        </a>`;\n                $(`.douban-music-list[data-status=\"` + status + `\"]`).append(html);\n                if (status == 'listened') curMusics_listened++;\n                else if (status == 'listening') curMusics_listening++;\n                else curMusics_wish++;\n            });\n        });\n    }\n\n}\n$(document).ready(function () {\n    DoubanBoard.initDoubanBoard();\n})\n\n$(document).click(function (e) {\n    var target = e.target;\n    $(\".doubanboard-item\").removeClass(\"doubanboard-info-show\");\n    $(\".doubanboard-item\").each(function () {\n        if ($(target).parent()[0] == $(this)[0] || $(target) == $(this)[0]) {\n            $(this).addClass(\"doubanboard-info-show\");\n        }\n    })\n})\n"
  },
  {
    "path": "assets/vendors/driver.js/driver.min.js.iife.js",
    "content": "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\n    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=\"&times;\",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=\"&larr; Previous\",document.createElement(\"button\"));return a.type=\"button\",a.classList.add(\"driver-popover-next-btn\"),a.innerHTML=\"Next &rarr;\",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 &rarr;\",prevBtnText:a=S(\"prevBtnText\")||\"&larr; 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}({});"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/accordion.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Accordion\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Accordion\n*******************************/\n\n.ui.accordion,\n.ui.accordion .accordion {\n  max-width: 100%;\n}\n.ui.accordion .accordion {\n  margin: 1em 0 0;\n  padding: 0;\n}\n\n/* Title */\n.ui.accordion.menu .item > .title,\n.ui.accordion > .title,\n.ui.accordion .accordion > .title {\n  cursor: pointer;\n  padding: 0.5em 0;\n  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\";\n  font-size: 1em;\n  color: rgba(0, 0, 0, 0.87);\n  list-style: none;\n  line-height: 1;\n}\n\n/* Default Styling */\n.ui.accordion:not(.styled) .title ~ .content,\n.ui.accordion:not(.styled) .accordion .title ~ .content {\n  margin: \"\";\n  padding: 0.5em 0 1em;\n}\n.ui.accordion:not(.styled) .title ~ .content:last-child {\n  padding-bottom: 0;\n}\n\n/* Arrow */\n.ui.accordion .ui.header > .dropdown.icon,\n.ui.accordion .title > .dropdown.icon,\n.ui.accordion .accordion .title > .dropdown.icon {\n  display: inline-block;\n  float: none;\n  opacity: 1;\n  width: 1.25em;\n  height: 1em;\n  margin: 0 0.25rem 0 0;\n  padding: 0;\n  font-size: 1em;\n  transition: transform 0.1s ease, opacity 0.1s ease;\n  vertical-align: baseline;\n  transform: none;\n}\n.ui.accordion .ui.header > .dropdown.icon.right,\n.ui.accordion .title > .dropdown.icon.right,\n.ui.accordion .accordion .title > .dropdown.icon.right {\n  float: right;\n  transform: rotate(180deg);\n}\n\n/* --------------\n    Coupling\n--------------- */\n\n/* Menu */\n.ui.accordion.menu .item .title {\n  display: block;\n  padding: 0;\n}\n.ui.accordion.menu .item .title > .dropdown.icon {\n  float: right;\n  margin: 0 0.25rem 0 0;\n  transform: rotate(180deg);\n}\n\n/* Header */\n.ui.accordion .ui.header > .dropdown.icon {\n  font-size: 1em;\n  margin: 0 0.25rem 0 0;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n.ui.accordion[open] > .title > .dropdown.icon,\n.ui.accordion .accordion[open] > .title > .dropdown.icon,\n.ui.accordion .active.title > .dropdown.icon,\n.ui.accordion .accordion .active.title > .dropdown.icon {\n  transform: rotate(90deg);\n}\n.ui.accordion.menu .item .active.title > .dropdown.icon {\n  transform: rotate(90deg);\n}\n\n\n/*******************************\n            Types\n*******************************/\n\n\n/* --------------\n         Styled\n    --------------- */\n.ui.styled.accordion {\n  width: 600px;\n}\n.ui.styled.accordion,\n.ui.styled.accordion .accordion {\n  border-radius: 0.28571429rem;\n  background: #fff;\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15);\n}\n.ui.styled.accordion > .title,\n.ui.styled.accordion .accordion > .title {\n  margin: 0;\n  padding: 0.75em 1em;\n  color: rgba(0, 0, 0, 0.4);\n  font-weight: bold;\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n  transition: background 0.1s ease, color 0.1s ease;\n}\n.ui.styled.accordion > .title:first-child,\n.ui.styled.accordion .accordion > .title:first-child {\n  border-top: none;\n}\n\n/* Content */\n.ui.styled.accordion > .content {\n  margin: 0;\n  padding: 0.5em 1em 1.5em;\n}\n.ui.styled.accordion .accordion > .content {\n  margin: 0;\n  padding: 0.5em 1em 1.5em;\n}\n\n/* Hover */\n.ui.styled.accordion > .title:hover {\n  background: transparent;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.styled.accordion .accordion > .title:hover {\n  background: transparent;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* Active */\n.ui.styled.accordion[open] > .title,\n.ui.styled.accordion .active.title {\n  background: transparent;\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.styled.accordion .accordion[open] > .title,\n.ui.styled.accordion .accordion .active.title {\n  background: transparent;\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------\n         Compact\n    --------------- */\n\n/* Default Styling */\n.ui.compact.accordion:not(.styled) > .title,\n.ui.compact.accordion:not(.styled) .accordion > .title {\n  padding: 0.25em 0;\n}\n.ui.compact.accordion:not(.styled) .title ~ .content,\n.ui.compact.accordion:not(.styled) .accordion .title ~ .content {\n  padding: 0.25em 0 0.5em;\n}\n\n/* Styled */\n.ui.compact.styled.accordion > .title,\n.ui.compact.styled.accordion .accordion > .title {\n  padding: 0.375em 0.5em;\n}\n.ui.compact.styled.accordion .title ~ .content,\n.ui.compact.styled.accordion .accordion .title ~ .content {\n  padding: 0.25em 0.5em 0.75em;\n}\n\n/* --------------\n    Very Compact\n  --------------- */\n.ui[class*=\"very compact\"].accordion:not(.styled) > .title,\n.ui[class*=\"very compact\"].accordion:not(.styled) .accordion > .title {\n  padding: 0.125em 0;\n}\n.ui[class*=\"very compact\"].accordion:not(.styled) .title ~ .content,\n.ui[class*=\"very compact\"].accordion:not(.styled) .accordion .title ~ .content {\n  padding: 0.125em 0 0.25em;\n}\n.ui[class*=\"very compact\"].styled.accordion > .title,\n.ui[class*=\"very compact\"].styled.accordion .accordion > .title {\n  padding: 0.1875em 0.25em;\n}\n.ui[class*=\"very compact\"].styled.accordion .title ~ .content,\n.ui[class*=\"very compact\"].styled.accordion .accordion .title ~ .content {\n  padding: 0.125em 0.25em 0.375em;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------\n   Not Active\n--------------- */\n.ui.accordion:not(details) .title ~ .content:not(.active),\n.ui.accordion .accordion:not(details) .title ~ .content:not(.active) {\n  display: none;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n         Fluid\n    --------------- */\n.ui.fluid.accordion,\n.ui.fluid.accordion .accordion {\n  width: 100%;\n}\n\n/* --------------\n         Inverted\n    --------------- */\n.ui.inverted.accordion.menu .item > .title,\n.ui.inverted.accordion > .title,\n.ui.inverted.accordion .accordion > .title {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.styled.accordion,\n.ui.inverted.styled.accordion .accordion {\n  background: #1b1c1d;\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(255, 255, 255, 0.1);\n}\n.ui.inverted.styled.accordion > .title,\n.ui.inverted.styled.accordion .accordion > .title {\n  color: rgba(255, 255, 255, 0.5);\n  border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n/* Hover */\n.ui.inverted.styled.accordion > .title:hover {\n  background: transparent;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.styled.accordion .accordion > .title:hover {\n  background: transparent;\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* Active */\n.ui.inverted.styled.accordion[open] > .title,\n.ui.inverted.styled.accordion .active.title {\n  background: transparent;\n  color: #ffffff;\n}\n.ui.inverted.styled.accordion .accordion[open] > .title,\n.ui.inverted.styled.accordion .accordion .active.title {\n  background: transparent;\n  color: #ffffff;\n}\n.ui.basic.styled.accordion,\n.ui.basic.styled.accordion .accordion {\n  background: transparent;\n  box-shadow: none;\n}\n.ui.basic.styled.accordion > .title,\n.ui.basic.styled.accordion .accordion > .title {\n  border: none;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.basic.styled.accordion > .title:hover,\n.ui.basic.styled.accordion .accordion > .title:hover {\n  background: transparent;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.basic.styled.accordion[open] > .title,\n.ui.basic.styled.accordion .active.title,\n.ui.basic.styled.accordion .accordion[open] > .title,\n.ui.basic.styled.accordion .accordion .active.title {\n  background: transparent;\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.inverted.basic.styled.accordion > .title,\n.ui.inverted.basic.styled.accordion .accordion > .title {\n  background: transparent;\n  color: rgba(255, 255, 255, 0.8);\n}\n.ui.inverted.basic.styled.accordion > .title:hover,\n.ui.inverted.basic.styled.accordion .accordion > .title:hover {\n  background: transparent;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.basic.styled.accordion[open] > .title,\n.ui.inverted.basic.styled.accordion .active.title,\n.ui.inverted.basic.styled.accordion .accordion[open] > .title,\n.ui.inverted.basic.styled.accordion .accordion .active.title {\n  background: transparent;\n  color: #ffffff;\n}\n.ui.tree.accordion:not(.styled) .title ~ .content,\n.ui.tree.accordion:not(.styled) .accordion .title ~ .content {\n  padding: 0;\n}\n.ui.tree.accordion > .content,\n.ui.tree.accordion .accordion > .content {\n  margin-left: 1.7em;\n}\n.ui.tree.accordion .accordion {\n  margin-top: 0;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n@font-face {\n  font-family: Accordion;\n  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\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n/* Dropdown Icon */\n.ui.accordion .ui.header > .dropdown.icon,\n.ui.accordion .title > .dropdown.icon,\n.ui.accordion .accordion .title > .dropdown.icon {\n  font-family: Accordion;\n  line-height: 1;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  font-weight: normal;\n  font-style: normal;\n  text-align: center;\n}\n.ui.accordion .ui.header > .dropdown.icon::before,\n.ui.accordion .title > .dropdown.icon::before,\n.ui.accordion .accordion .title > .dropdown.icon::before {\n  content: \"\\f0da\" \n/* rtl: \"\\f0d9\" */;\n}\n\n\n/*******************************\n        User Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/accordion.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Accordion\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.accordion = function (parameters) {\n        var\n            $allModules     = $(this),\n\n            time            = Date.now(),\n            performance     = [],\n\n            query           = arguments[0],\n            methodInvoked   = typeof query === 'string',\n            queryArguments  = [].slice.call(arguments, 1),\n\n            returnedValue\n        ;\n        $allModules.each(function () {\n            var\n                settings        = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.accordion.settings, parameters)\n                    : $.extend({}, $.fn.accordion.settings),\n\n                className       = settings.className,\n                namespace       = settings.namespace,\n                selector        = settings.selector,\n                error           = settings.error,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                $module  = $(this),\n                $title   = $module.find(selector.title),\n                $content = $module.find(selector.content),\n\n                element  = this,\n                instance = $module.data(moduleNamespace),\n                observer,\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.debug('Initializing', $module);\n                    module.bind.events();\n                    if (settings.observeChanges) {\n                        module.observeChanges();\n                    }\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n\n                destroy: function () {\n                    module.debug('Destroying previous instance', $module);\n                    $module\n                        .off(eventNamespace)\n                        .removeData(moduleNamespace)\n                    ;\n                },\n\n                refresh: function () {\n                    $title = $module.find(selector.title);\n                    $content = $module.find(selector.content);\n                },\n\n                observeChanges: function () {\n                    if ('MutationObserver' in window) {\n                        observer = new MutationObserver(function (mutations) {\n                            module.debug('DOM tree modified, updating selector cache');\n                            module.refresh();\n                        });\n                        observer.observe(element, {\n                            childList: true,\n                            subtree: true,\n                        });\n                        module.debug('Setting up mutation observer', observer);\n                    }\n                },\n\n                bind: {\n                    events: function () {\n                        module.debug('Binding delegated events');\n                        $module\n                            .on(settings.on + eventNamespace, selector.trigger, module.event.click)\n                        ;\n                    },\n                },\n\n                event: {\n                    click: function (event) {\n                        if ($(event.target).closest(selector.ignore).length === 0) {\n                            module.toggle.call(this);\n                        }\n                    },\n                },\n\n                toggle: function (query) {\n                    var\n                        $activeTitle = query !== undefined\n                            ? (typeof query === 'number'\n                                ? $title.eq(query)\n                                : $(query).closest(selector.title))\n                            : $(this).closest(selector.title),\n                        $activeContent = $activeTitle.next($content),\n                        isAnimating = $activeContent.hasClass(className.animating),\n                        isActive    = $activeContent.hasClass(className.active),\n                        isOpen      = isActive && !isAnimating,\n                        isOpening   = !isActive && isAnimating\n                    ;\n                    module.debug('Toggling visibility of content', $activeTitle);\n                    if (isOpen || isOpening) {\n                        if (settings.collapsible) {\n                            module.close.call($activeTitle);\n                        } else {\n                            module.debug('Cannot close accordion content collapsing is disabled');\n                        }\n                    } else {\n                        module.open.call($activeTitle);\n                    }\n                },\n\n                open: function (query) {\n                    var\n                        $activeTitle = query !== undefined\n                            ? (typeof query === 'number'\n                                ? $title.eq(query)\n                                : $(query).closest(selector.title))\n                            : $(this).closest(selector.title),\n                        $activeContent = $activeTitle.next($content),\n                        isAnimating = $activeContent.hasClass(className.animating),\n                        isActive    = $activeContent.hasClass(className.active),\n                        isOpen      = isActive || isAnimating\n                    ;\n                    if (isOpen) {\n                        module.debug('Accordion already open, skipping', $activeContent);\n\n                        return;\n                    }\n                    module.debug('Opening accordion content', $activeTitle);\n                    settings.onOpening.call($activeContent);\n                    settings.onChanging.call($activeContent);\n                    if (settings.exclusive) {\n                        module.closeOthers.call($activeTitle);\n                    }\n                    $activeTitle\n                        .addClass(className.active)\n                    ;\n                    $activeContent\n                        .stop(true, true)\n                        .addClass(className.animating)\n                    ;\n                    if (settings.animateChildren) {\n                        if ($.fn.transition !== undefined) {\n                            $activeContent\n                                .children()\n                                .transition({\n                                    animation: 'fade in',\n                                    queue: false,\n                                    useFailSafe: true,\n                                    debug: settings.debug,\n                                    verbose: settings.verbose,\n                                    silent: settings.silent,\n                                    duration: settings.duration,\n                                    skipInlineHidden: true,\n                                    onComplete: function () {\n                                        $activeContent.children().removeClass(className.transition);\n                                    },\n                                })\n                            ;\n                        } else {\n                            $activeContent\n                                .children()\n                                .stop(true, true)\n                                .animate({\n                                    opacity: 1,\n                                }, settings.duration, module.resetOpacity);\n                        }\n                    }\n                    $activeContent\n                        .slideDown(settings.duration, settings.easing, function () {\n                            $activeContent\n                                .removeClass(className.animating)\n                                .addClass(className.active)\n                            ;\n                            module.reset.display.call(this);\n                            settings.onOpen.call(this);\n                            settings.onChange.call(this);\n                        })\n                    ;\n                },\n\n                close: function (query) {\n                    var\n                        $activeTitle = query !== undefined\n                            ? (typeof query === 'number'\n                                ? $title.eq(query)\n                                : $(query).closest(selector.title))\n                            : $(this).closest(selector.title),\n                        $activeContent = $activeTitle.next($content),\n                        isAnimating    = $activeContent.hasClass(className.animating),\n                        isActive       = $activeContent.hasClass(className.active),\n                        isOpening      = !isActive && isAnimating,\n                        isClosing      = isActive && isAnimating\n                    ;\n                    if ((isActive || isOpening) && !isClosing) {\n                        module.debug('Closing accordion content', $activeContent);\n                        settings.onClosing.call($activeContent);\n                        settings.onChanging.call($activeContent);\n                        $activeTitle\n                            .removeClass(className.active)\n                        ;\n                        $activeContent\n                            .stop(true, true)\n                            .addClass(className.animating)\n                        ;\n                        if (settings.animateChildren) {\n                            if ($.fn.transition !== undefined) {\n                                $activeContent\n                                    .children()\n                                    .transition({\n                                        animation: 'fade out',\n                                        queue: false,\n                                        useFailSafe: true,\n                                        debug: settings.debug,\n                                        verbose: settings.verbose,\n                                        silent: settings.silent,\n                                        duration: settings.duration,\n                                        skipInlineHidden: true,\n                                    })\n                                ;\n                            } else {\n                                $activeContent\n                                    .children()\n                                    .stop(true, true)\n                                    .animate({\n                                        opacity: 0,\n                                    }, settings.duration, module.resetOpacity);\n                            }\n                        }\n                        $activeContent\n                            .slideUp(settings.duration, settings.easing, function () {\n                                $activeContent\n                                    .removeClass(className.animating)\n                                    .removeClass(className.active)\n                                ;\n                                module.reset.display.call(this);\n                                settings.onClose.call(this);\n                                settings.onChange.call(this);\n                            })\n                        ;\n                    }\n                },\n\n                closeOthers: function (index) {\n                    var\n                        $activeTitle = index !== undefined\n                            ? $title.eq(index)\n                            : $(this).closest(selector.title),\n                        $parentTitles    = $activeTitle.parents(selector.content).prev(selector.title),\n                        $activeAccordion = $activeTitle.closest(selector.accordion),\n                        activeSelector   = selector.title + '.' + className.active + ':visible',\n                        activeContent    = selector.content + '.' + className.active + ':visible',\n                        $openTitles,\n                        $nestedTitles,\n                        $openContents\n                    ;\n                    if (settings.closeNested) {\n                        $openTitles = $activeAccordion.find(activeSelector).not($parentTitles);\n                        $openContents = $openTitles.next($content);\n                    } else {\n                        $openTitles = $activeAccordion.find(activeSelector).not($parentTitles);\n                        $nestedTitles = $activeAccordion.find(activeContent).find(activeSelector).not($parentTitles);\n                        $openTitles = $openTitles.not($nestedTitles);\n                        $openContents = $openTitles.next($content);\n                    }\n                    if ($openTitles.length > 0) {\n                        module.debug('Exclusive enabled, closing other content', $openTitles);\n                        $openTitles\n                            .removeClass(className.active)\n                        ;\n                        $openContents\n                            .removeClass(className.animating)\n                            .stop(true, true)\n                        ;\n                        if (settings.animateChildren) {\n                            if ($.fn.transition !== undefined) {\n                                $openContents\n                                    .children()\n                                    .transition({\n                                        animation: 'fade out',\n                                        useFailSafe: true,\n                                        debug: settings.debug,\n                                        verbose: settings.verbose,\n                                        silent: settings.silent,\n                                        duration: settings.duration,\n                                        skipInlineHidden: true,\n                                    })\n                                ;\n                            } else {\n                                $openContents\n                                    .children()\n                                    .stop(true, true)\n                                    .animate({\n                                        opacity: 0,\n                                    }, settings.duration, module.resetOpacity);\n                            }\n                        }\n                        $openContents\n                            .slideUp(settings.duration, settings.easing, function () {\n                                $(this).removeClass(className.active);\n                                module.reset.display.call(this);\n                            })\n                        ;\n                    }\n                },\n\n                reset: {\n\n                    display: function () {\n                        module.verbose('Removing inline display from element', this);\n                        var $element = $(this);\n                        $element.css('display', '');\n                        if ($element.attr('style') === '') {\n                            $element\n                                .attr('style', '')\n                                .removeAttr('style')\n                            ;\n                        }\n                    },\n\n                    opacity: function () {\n                        module.verbose('Removing inline opacity from element', this);\n                        var $element = $(this);\n                        $element.css('opacity', '');\n                        if ($element.attr('style') === '') {\n                            $element\n                                .attr('style', '')\n                                .removeAttr('style')\n                            ;\n                        }\n                    },\n\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    module.debug('Changing internal', name, value);\n                    if (value !== undefined) {\n                        if ($.isPlainObject(name)) {\n                            $.extend(true, module, name);\n                        } else {\n                            module[name] = value;\n                        }\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.accordion.settings = {\n\n        name: 'Accordion',\n        namespace: 'accordion',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        on: 'click', // event on title that opens accordion\n\n        observeChanges: true, // whether accordion should automatically refresh on DOM insertion\n\n        exclusive: true, // whether a single accordion content panel should be open at once\n        collapsible: true, // whether accordion content can be closed\n        closeNested: false, // whether nested content should be closed when a panel is closed\n        animateChildren: true, // whether children opacity should be animated\n\n        duration: 350, // duration of animation\n        easing: 'easeOutQuad', // easing equation for animation\n\n        onOpening: function () {}, // callback before open animation\n        onClosing: function () {}, // callback before closing animation\n        onChanging: function () {}, // callback before closing or opening animation\n\n        onOpen: function () {}, // callback after open animation\n        onClose: function () {}, // callback after closing animation\n        onChange: function () {}, // callback after closing or opening animation\n\n        error: {\n            method: 'The method you called is not defined',\n        },\n\n        className: {\n            active: 'active',\n            animating: 'animating',\n            transition: 'transition',\n        },\n\n        selector: {\n            accordion: '.accordion',\n            title: '.title',\n            trigger: '.title',\n            ignore: '.ui.dropdown',\n            content: '.content',\n        },\n\n    };\n\n    // Adds easing\n    $.extend($.easing, {\n        easeOutQuad: function (x) {\n            return 1 - (1 - x) * (1 - x);\n        },\n    });\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/ad.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Ad\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Copyright 2013 Contributors\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n         Advertisement\n*******************************/\n\n.ui.ad {\n  display: block;\n  overflow: hidden;\n  margin: 1em 0;\n}\n.ui.ad:first-child {\n  margin: 0;\n}\n.ui.ad:last-child {\n  margin: 0;\n}\n.ui.ad iframe {\n  margin: 0;\n  padding: 0;\n  border: none;\n  overflow: hidden;\n}\n\n/* --------------\n     Common\n--------------- */\n\n/* Leaderboard */\n.ui.leaderboard.ad {\n  width: 728px;\n  height: 90px;\n}\n\n/* Medium Rectangle */\n.ui[class*=\"medium rectangle\"].ad {\n  width: 300px;\n  height: 250px;\n}\n\n/* Large Rectangle */\n.ui[class*=\"large rectangle\"].ad {\n  width: 336px;\n  height: 280px;\n}\n\n/* Half Page */\n.ui[class*=\"half page\"].ad {\n  width: 300px;\n  height: 600px;\n}\n\n/* --------------\n         Square\n    --------------- */\n\n/* Square */\n.ui.square.ad {\n  width: 250px;\n  height: 250px;\n}\n\n/* Small Square */\n.ui[class*=\"small square\"].ad {\n  width: 200px;\n  height: 200px;\n}\n\n/* --------------\n        Rectangle\n    --------------- */\n\n/* Small Rectangle */\n.ui[class*=\"small rectangle\"].ad {\n  width: 180px;\n  height: 150px;\n}\n\n/* Vertical Rectangle */\n.ui[class*=\"vertical rectangle\"].ad {\n  width: 240px;\n  height: 400px;\n}\n\n/* --------------\n         Button\n    --------------- */\n.ui.button.ad {\n  width: 120px;\n  height: 90px;\n}\n.ui[class*=\"square button\"].ad {\n  width: 125px;\n  height: 125px;\n}\n.ui[class*=\"small button\"].ad {\n  width: 120px;\n  height: 60px;\n}\n\n/* --------------\n       Skyscrapers\n    --------------- */\n\n/* Skyscraper */\n.ui.skyscraper.ad {\n  width: 120px;\n  height: 600px;\n}\n\n/* Wide Skyscraper */\n.ui[class*=\"wide skyscraper\"].ad {\n  width: 160px;\n}\n\n/* --------------\n         Banners\n    --------------- */\n\n/* Banner */\n.ui.banner.ad {\n  width: 468px;\n  height: 60px;\n}\n\n/* Vertical Banner */\n.ui[class*=\"vertical banner\"].ad {\n  width: 120px;\n  height: 240px;\n}\n\n/* Top Banner */\n.ui[class*=\"top banner\"].ad {\n  width: 930px;\n  height: 180px;\n}\n\n/* Half Banner */\n.ui[class*=\"half banner\"].ad {\n  width: 234px;\n  height: 60px;\n}\n\n/* --------------\n    Boards\n--------------- */\n\n/* Leaderboard */\n.ui[class*=\"large leaderboard\"].ad {\n  width: 970px;\n  height: 90px;\n}\n\n/* Billboard */\n.ui.billboard.ad {\n  width: 970px;\n  height: 250px;\n}\n\n/* --------------\n        Panorama\n    --------------- */\n\n/* Panorama */\n.ui.panorama.ad {\n  width: 980px;\n  height: 120px;\n}\n\n/* --------------\n         Netboard\n    --------------- */\n\n/* Netboard */\n.ui.netboard.ad {\n  width: 580px;\n  height: 400px;\n}\n\n/* --------------\n         Mobile\n    --------------- */\n\n/* Large Mobile Banner */\n.ui[class*=\"large mobile banner\"].ad {\n  width: 320px;\n  height: 100px;\n}\n\n/* Mobile Leaderboard */\n.ui[class*=\"mobile leaderboard\"].ad {\n  width: 320px;\n  height: 50px;\n}\n\n\n/*******************************\n                 Types\n    *******************************/\n\n\n/* Mobile Sizes */\n.ui.mobile.ad {\n  display: none;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.mobile.ad {\n    display: block;\n  }\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n.ui.centered.ad {\n  margin-left: auto;\n  margin-right: auto;\n}\n.ui.test.ad {\n  position: relative;\n  background: #545454;\n}\n.ui.test.ad::after {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  width: 100%;\n  text-align: center;\n  transform: translateX(-50%) translateY(-50%);\n  content: \"Ad\";\n  color: #fff;\n  font-size: 1em;\n  font-weight: bold;\n}\n.ui.mobile.test.ad::after {\n  font-size: 0.85714286em;\n}\n.ui.test.ad[data-text]::after {\n  content: attr(data-text);\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/api.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - API\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isWindow(obj) {\n        return obj !== null && obj === obj.window;\n    }\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.api = function (parameters) {\n        var\n            // use window context if none specified\n            $allModules     = isFunction(this)\n                ? $(window)\n                : $(this),\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n            contextCheck   = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $(context);\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : window;\n                    }\n                }\n\n                return $context;\n            },\n            returnedValue\n        ;\n\n        $allModules.each(function () {\n            var\n                settings          = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.api.settings, parameters)\n                    : $.extend({}, $.fn.api.settings),\n\n                // internal aliases\n                regExp          = settings.regExp,\n                namespace       = settings.namespace,\n                metadata        = settings.metadata,\n                selector        = settings.selector,\n                error           = settings.error,\n                className       = settings.className,\n\n                // define namespaces for modules\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                // element that creates request\n                $module         = $(this),\n                $form           = $module.closest(selector.form),\n\n                // context used for state\n                $context        = settings.stateContext ? contextCheck(settings.stateContext, window) : $module,\n\n                // request details\n                ajaxSettings,\n                requestSettings,\n                url,\n                data,\n                requestStartTime,\n                originalData,\n\n                // standard module\n                element         = this,\n                context         = $context[0],\n                instance        = $module.data(moduleNamespace),\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    if (!methodInvoked) {\n                        originalData = settings.data;\n                        module.bind.events();\n                    }\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, instance)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous module for', element);\n                    $module\n                        .removeData(moduleNamespace)\n                        .off(eventNamespace)\n                    ;\n                },\n\n                bind: {\n                    events: function () {\n                        var\n                            triggerEvent = module.get.event()\n                        ;\n                        if (triggerEvent) {\n                            module.verbose('Attaching API events to element', triggerEvent);\n                            $module\n                                .on(triggerEvent + eventNamespace, module.event.trigger)\n                            ;\n                        } else if (settings.on === 'now') {\n                            module.debug('Querying API endpoint immediately');\n                            module.query();\n                        }\n                    },\n                },\n\n                decode: {\n                    json: function (response) {\n                        if (response !== undefined && typeof response === 'string') {\n                            try {\n                                response = JSON.parse(response);\n                            } catch (e) {\n                                // isn't json string\n                            }\n                        }\n\n                        return response;\n                    },\n                },\n\n                read: {\n                    cachedResponse: function (url) {\n                        var\n                            response\n                        ;\n                        if (window.Storage === undefined) {\n                            module.error(error.noStorage);\n\n                            return;\n                        }\n                        response = sessionStorage.getItem(url + module.get.normalizedData());\n                        module.debug('Using cached response', url, settings.data, response);\n                        response = module.decode.json(response);\n\n                        return response;\n                    },\n                },\n                write: {\n                    cachedResponse: function (url, response) {\n                        if (window.Storage === undefined) {\n                            module.error(error.noStorage);\n\n                            return;\n                        }\n                        if ($.isPlainObject(response)) {\n                            response = JSON.stringify(response);\n                        }\n                        sessionStorage.setItem(url + module.get.normalizedData(), response);\n                        module.verbose('Storing cached response for url', url, settings.data, response);\n                    },\n                },\n\n                query: function () {\n                    if (module.is.disabled()) {\n                        module.debug('Element is disabled API request aborted');\n\n                        return;\n                    }\n\n                    if (module.is.loading()) {\n                        if (settings.interruptRequests) {\n                            module.debug('Interrupting previous request');\n                            module.abort();\n                        } else {\n                            module.debug('Cancelling request, previous request is still pending');\n\n                            return;\n                        }\n                    }\n\n                    // pass element metadata to url (value, text)\n                    if (settings.defaultData) {\n                        $.extend(true, settings.urlData, module.get.defaultData());\n                    }\n\n                    // Add form content\n                    if (settings.serializeForm) {\n                        settings.data = module.add.formData(originalData || settings.data);\n                    }\n\n                    // call beforesend and get any settings changes\n                    requestSettings = module.get.settings();\n\n                    // check if before send cancelled request\n                    if (requestSettings === false) {\n                        module.cancelled = true;\n                        module.error(error.beforeSend);\n\n                        return;\n                    }\n\n                    module.cancelled = false;\n\n                    // get url\n                    url = module.get.templatedURL();\n\n                    if (!url && !module.is.mocked()) {\n                        module.error(error.missingURL);\n\n                        return;\n                    }\n\n                    // replace variables\n                    url = module.add.urlData(url);\n                    // missing url parameters\n                    if (!url && !module.is.mocked()) {\n                        return;\n                    }\n\n                    requestSettings.url = settings.base + url;\n\n                    // look for jQuery ajax parameters in settings\n                    ajaxSettings = $.extend(true, {}, settings, {\n                        type: settings.method || settings.type,\n                        data: data,\n                        url: settings.base + url,\n                        beforeSend: settings.beforeXHR,\n                        success: function () {},\n                        failure: function () {},\n                        complete: function () {},\n                    });\n\n                    module.debug('Querying URL', ajaxSettings.url);\n                    module.verbose('Using AJAX settings', ajaxSettings);\n                    if (settings.cache === 'local' && module.read.cachedResponse(url)) {\n                        module.debug('Response returned from local cache');\n                        module.request = module.create.request();\n                        module.request.resolveWith(context, [module.read.cachedResponse(url)]);\n\n                        return;\n                    }\n\n                    if (!settings.throttle) {\n                        module.debug('Sending request', data, ajaxSettings.method);\n                        module.send.request();\n                    } else {\n                        if (!settings.throttleFirstRequest && !module.timer) {\n                            module.debug('Sending request', data, ajaxSettings.method);\n                            module.send.request();\n                            module.timer = setTimeout(function () {}, settings.throttle);\n                        } else {\n                            module.debug('Throttling request', settings.throttle);\n                            clearTimeout(module.timer);\n                            module.timer = setTimeout(function () {\n                                if (module.timer) {\n                                    delete module.timer;\n                                }\n                                module.debug('Sending throttled request', data, ajaxSettings.method);\n                                module.send.request();\n                            }, settings.throttle);\n                        }\n                    }\n                },\n\n                should: {\n                    removeError: function () {\n                        return settings.hideError === true || (settings.hideError === 'auto' && !module.is.form());\n                    },\n                },\n\n                is: {\n                    disabled: function () {\n                        return $module.filter(selector.disabled).length > 0;\n                    },\n                    expectingJSON: function () {\n                        return settings.dataType === 'json' || settings.dataType === 'jsonp';\n                    },\n                    form: function () {\n                        return $module.is('form') || $context.is('form');\n                    },\n                    mocked: function () {\n                        return settings.mockResponse || settings.mockResponseAsync || settings.response || settings.responseAsync;\n                    },\n                    input: function () {\n                        return $module.is('input');\n                    },\n                    loading: function () {\n                        return module.request\n                            ? module.request.state() === 'pending'\n                            : false;\n                    },\n                    abortedRequest: function (xhr) {\n                        if (xhr && xhr.readyState !== undefined && xhr.readyState === 0) {\n                            module.verbose('XHR request determined to be aborted');\n\n                            return true;\n                        }\n\n                        module.verbose('XHR request was not aborted');\n\n                        return false;\n                    },\n                    validResponse: function (response) {\n                        if (!module.is.expectingJSON() || !isFunction(settings.successTest)) {\n                            module.verbose('Response is not JSON, skipping validation', settings.successTest, response);\n\n                            return true;\n                        }\n                        module.debug('Checking JSON returned success', settings.successTest, response);\n                        if (settings.successTest(response)) {\n                            module.debug('Response passed success test', response);\n\n                            return true;\n                        }\n\n                        module.debug('Response failed success test', response);\n\n                        return false;\n                    },\n                },\n\n                was: {\n                    cancelled: function () {\n                        return module.cancelled || false;\n                    },\n                    successful: function () {\n                        return module.request && module.request.state() === 'resolved';\n                    },\n                    failure: function () {\n                        return module.request && module.request.state() === 'rejected';\n                    },\n                    complete: function () {\n                        return module.request && (module.request.state() === 'resolved' || module.request.state() === 'rejected');\n                    },\n                },\n\n                add: {\n                    urlData: function (url, urlData) {\n                        var\n                            requiredVariables,\n                            optionalVariables\n                        ;\n                        if (url) {\n                            requiredVariables = url.match(regExp.required);\n                            optionalVariables = url.match(regExp.optional);\n                            urlData = urlData || settings.urlData;\n                            if (requiredVariables) {\n                                module.debug('Looking for required URL variables', requiredVariables);\n                                $.each(requiredVariables, function (index, templatedString) {\n                                    var\n                                        // allow legacy {$var} style\n                                        variable = templatedString.indexOf('$') !== -1\n                                            ? templatedString.slice(2, -1)\n                                            : templatedString.slice(1, -1),\n                                        value   = $.isPlainObject(urlData) && urlData[variable] !== undefined\n                                            ? urlData[variable]\n                                            : ($module.data(variable) !== undefined\n                                                ? $module.data(variable)\n                                                : ($context.data(variable) !== undefined // eslint-disable-line unicorn/no-nested-ternary\n                                                    ? $context.data(variable)\n                                                    : urlData[variable]))\n                                    ;\n                                    // remove value\n                                    if (value === undefined) {\n                                        module.error(error.requiredParameter, variable, url);\n                                        url = false;\n\n                                        return false;\n                                    }\n\n                                    module.verbose('Found required variable', variable, value);\n                                    value = settings.encodeParameters\n                                        ? module.get.urlEncodedValue(value)\n                                        : value;\n                                    url = url.replace(templatedString, value);\n                                });\n                            }\n                            if (optionalVariables) {\n                                module.debug('Looking for optional URL variables', requiredVariables);\n                                $.each(optionalVariables, function (index, templatedString) {\n                                    var\n                                        // allow legacy {/$var} style\n                                        variable = templatedString.indexOf('$') !== -1\n                                            ? templatedString.slice(3, -1)\n                                            : templatedString.slice(2, -1),\n                                        value   = $.isPlainObject(urlData) && urlData[variable] !== undefined\n                                            ? urlData[variable]\n                                            : ($module.data(variable) !== undefined\n                                                ? $module.data(variable)\n                                                : ($context.data(variable) !== undefined // eslint-disable-line unicorn/no-nested-ternary\n                                                    ? $context.data(variable)\n                                                    : urlData[variable]))\n                                    ;\n                                    // optional replacement\n                                    if (value !== undefined) {\n                                        module.verbose('Optional variable Found', variable, value);\n                                        url = url.replace(templatedString, value);\n                                    } else {\n                                        module.verbose('Optional variable not found', variable);\n                                        // remove preceding slash if set\n                                        url = url.indexOf('/' + templatedString) !== -1\n                                            ? url.replace('/' + templatedString, '')\n                                            : url.replace(templatedString, '');\n                                    }\n                                });\n                            }\n                        }\n\n                        return url;\n                    },\n                    formData: function (data) {\n                        var\n                            formData = {},\n                            hasOtherData,\n                            useFormDataApi = settings.serializeForm === 'formdata'\n                        ;\n                        data = data || originalData || settings.data;\n                        hasOtherData = $.isPlainObject(data);\n\n                        if (useFormDataApi) {\n                            formData = new FormData($form[0]);\n                            settings.processData = settings.processData !== undefined ? settings.processData : false;\n                            settings.contentType = settings.contentType !== undefined ? settings.contentType : false;\n                        } else {\n                            var\n                                formArray = $form.serializeArray(),\n                                pushes = {},\n                                pushValues = {},\n                                build = function (base, key, value) {\n                                    base[key] = value;\n\n                                    return base;\n                                }\n                            ;\n                            // add files\n                            $.each($('input[type=\"file\"]', $form), function (i, tag) {\n                                $.each($(tag)[0].files, function (j, file) {\n                                    formArray.push({ name: tag.name, value: file });\n                                });\n                            });\n                            $.each(formArray, function (i, el) {\n                                if (!regExp.validate.test(el.name)) {\n                                    return;\n                                }\n                                var\n                                    isCheckbox = $('[name=\"' + el.name + '\"]', $form).attr('type') === 'checkbox',\n                                    floatValue = parseFloat(el.value),\n                                    value = (isCheckbox && el.value === 'on')\n                                        || el.value === 'true'\n                                        || (String(floatValue) === el.value\n                                            ? floatValue\n                                            : (el.value === 'false' ? false : el.value)),\n                                    nameKeys = el.name.match(regExp.key) || [],\n                                    pushKey = el.name.replace(/\\[]$/, '')\n                                ;\n                                if (!(pushKey in pushes)) {\n                                    pushes[pushKey] = 0;\n                                    pushValues[pushKey] = value;\n                                } else if (Array.isArray(pushValues[pushKey])) {\n                                    pushValues[pushKey].push(value);\n                                } else {\n                                    pushValues[pushKey] = [pushValues[pushKey], value];\n                                }\n                                if (pushKey.indexOf('[]') === -1) {\n                                    value = pushValues[pushKey];\n                                }\n\n                                while (nameKeys.length > 0) {\n                                    var k = nameKeys.pop();\n\n                                    if (k === '' && !Array.isArray(value)) { // foo[]\n                                        value = build([], pushes[pushKey]++, value);\n                                    } else if (regExp.fixed.test(k)) { // foo[n]\n                                        value = build([], k, value);\n                                    } else if (regExp.named.test(k)) { // foo; foo[bar]\n                                        value = build({}, k, value);\n                                    }\n                                }\n                                formData = $.extend(true, formData, value);\n                            });\n                        }\n\n                        if (hasOtherData) {\n                            module.debug('Extending existing data with form data', data, formData);\n                            if (useFormDataApi) {\n                                $.each(Object.keys(data), function (i, el) {\n                                    formData.append(el, data[el]);\n                                });\n                                data = formData;\n                            } else {\n                                data = $.extend(true, {}, data, formData);\n                            }\n                        } else {\n                            module.debug('Adding form data', formData);\n                            data = formData;\n                        }\n\n                        return data;\n                    },\n                },\n\n                send: {\n                    request: function () {\n                        module.set.loading();\n                        module.request = module.create.request();\n                        if (module.is.mocked()) {\n                            module.mockedXHR = module.create.mockedXHR();\n                        } else {\n                            module.xhr = module.create.xhr();\n                        }\n                        settings.onRequest.call(context, module.request, module.xhr);\n                    },\n                },\n\n                event: {\n                    trigger: function (event) {\n                        module.query();\n                        if (event.type === 'submit' || event.type === 'click') {\n                            event.preventDefault();\n                        }\n                    },\n                    xhr: {\n                        always: function () {\n                            // nothing special\n                        },\n                        done: function (response, textStatus, xhr) {\n                            var\n                                context            = this,\n                                elapsedTime        = Date.now() - requestStartTime,\n                                timeLeft           = settings.loadingDuration - elapsedTime,\n                                translatedResponse = isFunction(settings.onResponse)\n                                    ? (module.is.expectingJSON() && !settings.rawResponse\n                                        ? settings.onResponse.call(context, $.extend(true, {}, response))\n                                        : settings.onResponse.call(context, response))\n                                    : false\n                            ;\n                            timeLeft = timeLeft > 0\n                                ? timeLeft\n                                : 0;\n                            if (translatedResponse) {\n                                module.debug('Modified API response in onResponse callback', settings.onResponse, translatedResponse, response);\n                                response = translatedResponse;\n                            }\n                            if (timeLeft > 0) {\n                                module.debug('Response completed early delaying state change by', timeLeft);\n                            }\n                            setTimeout(function () {\n                                if (module.is.validResponse(response)) {\n                                    module.request.resolveWith(context, [response, xhr]);\n                                } else {\n                                    module.request.rejectWith(context, [xhr, 'invalid']);\n                                }\n                            }, timeLeft);\n                        },\n                        fail: function (xhr, status, httpMessage) {\n                            var\n                                context     = this,\n                                elapsedTime = Date.now() - requestStartTime,\n                                timeLeft    = settings.loadingDuration - elapsedTime\n                            ;\n                            timeLeft = timeLeft > 0\n                                ? timeLeft\n                                : 0;\n                            if (timeLeft > 0) {\n                                module.debug('Response completed early delaying state change by', timeLeft);\n                            }\n                            setTimeout(function () {\n                                if (module.is.abortedRequest(xhr)) {\n                                    module.request.rejectWith(context, [xhr, 'aborted', httpMessage]);\n                                } else {\n                                    module.request.rejectWith(context, [xhr, 'error', status, httpMessage]);\n                                }\n                            }, timeLeft);\n                        },\n                    },\n                    request: {\n                        done: function (response, xhr) {\n                            module.debug('Successful API Response', response);\n                            if (settings.cache === 'local' && url) {\n                                module.write.cachedResponse(url, response);\n                                module.debug('Saving server response locally', module.cache);\n                            }\n                            settings.onSuccess.call(context, response, $module, xhr);\n                        },\n                        complete: function (firstParameter, secondParameter) {\n                            var\n                                xhr,\n                                response\n                            ;\n                            // have to guess callback parameters based on request success\n                            if (module.was.successful()) {\n                                response = firstParameter;\n                                xhr = secondParameter;\n                            } else {\n                                xhr = firstParameter;\n                                response = module.get.responseFromXHR(xhr);\n                            }\n                            module.remove.loading();\n                            settings.onComplete.call(context, response, $module, xhr);\n                        },\n                        fail: function (xhr, status, httpMessage) {\n                            var\n                                // pull response from xhr if available\n                                response     = module.get.responseFromXHR(xhr),\n                                errorMessage = module.get.errorFromRequest(response, status, httpMessage)\n                            ;\n                            if (status === 'aborted') {\n                                module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage);\n                                settings.onAbort.call(context, status, $module, xhr);\n\n                                return true;\n                            }\n                            if (status === 'invalid') {\n                                module.debug('JSON did not pass success test. A server-side error has most likely occurred', response);\n                            } else if (status === 'error') {\n                                if (xhr !== undefined) {\n                                    module.debug('XHR produced a server error', status, httpMessage);\n                                    // make sure we have an error to display to console\n                                    if ((xhr.status < 200 || xhr.status >= 300) && httpMessage !== undefined && httpMessage !== '') {\n                                        module.error(error.statusMessage + httpMessage, ajaxSettings.url);\n                                    }\n                                    settings.onError.call(context, errorMessage, $module, xhr);\n                                }\n                            }\n\n                            if (settings.errorDuration && status !== 'aborted') {\n                                module.debug('Adding error state');\n                                module.set.error();\n                                if (module.should.removeError()) {\n                                    setTimeout(function () {\n                                        module.remove.error();\n                                    }, settings.errorDuration);\n                                }\n                            }\n                            module.debug('API Request failed', errorMessage, xhr);\n                            settings.onFailure.call(context, response, $module, xhr);\n                        },\n                    },\n                },\n\n                create: {\n\n                    request: function () {\n                        // api request promise\n                        return $.Deferred()\n                            .always(module.event.request.complete)\n                            .done(module.event.request.done)\n                            .fail(module.event.request.fail)\n                        ;\n                    },\n\n                    mockedXHR: function () {\n                        var\n                            // xhr does not simulate these properties of xhr but must return them\n                            textStatus     = false,\n                            status         = false,\n                            httpMessage    = false,\n                            responder      = settings.mockResponse || settings.response,\n                            asyncResponder = settings.mockResponseAsync || settings.responseAsync,\n                            asyncCallback,\n                            response,\n                            mockedXHR\n                        ;\n\n                        mockedXHR = $.Deferred()\n                            .always(module.event.xhr.complete)\n                            .done(module.event.xhr.done)\n                            .fail(module.event.xhr.fail)\n                        ;\n\n                        if (responder) {\n                            if (isFunction(responder)) {\n                                module.debug('Using specified synchronous callback', responder);\n                                response = responder.call(context, requestSettings);\n                            } else {\n                                module.debug('Using settings specified response', responder);\n                                response = responder;\n                            }\n                            // simulating response\n                            mockedXHR.resolveWith(context, [response, textStatus, { responseText: response }]);\n                        } else if (isFunction(asyncResponder)) {\n                            asyncCallback = function (response) {\n                                module.debug('Async callback returned response', response);\n\n                                if (response) {\n                                    mockedXHR.resolveWith(context, [response, textStatus, { responseText: response }]);\n                                } else {\n                                    mockedXHR.rejectWith(context, [{ responseText: response }, status, httpMessage]);\n                                }\n                            };\n                            module.debug('Using specified async response callback', asyncResponder);\n                            asyncResponder.call(context, requestSettings, asyncCallback);\n                        }\n\n                        return mockedXHR;\n                    },\n\n                    xhr: function () {\n                        var\n                            xhr\n                        ;\n                        // ajax request promise\n                        xhr = $.ajax(ajaxSettings)\n                            .always(module.event.xhr.always)\n                            .done(module.event.xhr.done)\n                            .fail(module.event.xhr.fail)\n                        ;\n                        module.verbose('Created server request', xhr, ajaxSettings);\n\n                        return xhr;\n                    },\n                },\n\n                set: {\n                    error: function () {\n                        module.verbose('Adding error state to element', $context);\n                        $context.addClass(className.error);\n                    },\n                    loading: function () {\n                        module.verbose('Adding loading state to element', $context);\n                        $context.addClass(className.loading);\n                        requestStartTime = Date.now();\n                    },\n                },\n\n                remove: {\n                    error: function () {\n                        module.verbose('Removing error state from element', $context);\n                        $context.removeClass(className.error);\n                    },\n                    loading: function () {\n                        module.verbose('Removing loading state from element', $context);\n                        $context.removeClass(className.loading);\n                    },\n                },\n\n                get: {\n                    normalizedData: function () {\n                        return typeof settings.data === 'string' ? settings.data : JSON.stringify(settings.data, Object.keys(settings.data).sort());\n                    },\n                    responseFromXHR: function (xhr) {\n                        return $.isPlainObject(xhr)\n                            ? (module.is.expectingJSON()\n                                ? module.decode.json(xhr.responseText)\n                                : xhr.responseText)\n                            : false;\n                    },\n                    errorFromRequest: function (response, status, httpMessage) {\n                        return $.isPlainObject(response) && response.error !== undefined\n                            ? response.error // use json error message\n                            : (settings.error[status] !== undefined // use server error message\n                                ? settings.error[status]\n                                : httpMessage);\n                    },\n                    request: function () {\n                        return module.request || false;\n                    },\n                    xhr: function () {\n                        return module.xhr || false;\n                    },\n                    settings: function () {\n                        var\n                            runSettings\n                        ;\n                        runSettings = settings.beforeSend.call($module, settings);\n                        if (runSettings) {\n                            if (runSettings.success !== undefined) {\n                                module.debug('Legacy success callback detected', runSettings);\n                                module.error(error.legacyParameters, runSettings.success);\n                                runSettings.onSuccess = runSettings.success;\n                            }\n                            if (runSettings.failure !== undefined) {\n                                module.debug('Legacy failure callback detected', runSettings);\n                                module.error(error.legacyParameters, runSettings.failure);\n                                runSettings.onFailure = runSettings.failure;\n                            }\n                            if (runSettings.complete !== undefined) {\n                                module.debug('Legacy complete callback detected', runSettings);\n                                module.error(error.legacyParameters, runSettings.complete);\n                                runSettings.onComplete = runSettings.complete;\n                            }\n                        }\n                        if (runSettings === undefined) {\n                            module.error(error.noReturnedValue);\n                        }\n                        if (runSettings === false) {\n                            return runSettings;\n                        }\n\n                        return runSettings !== undefined\n                            ? $.extend(true, {}, runSettings)\n                            : $.extend(true, {}, settings);\n                    },\n                    urlEncodedValue: function (value) {\n                        var\n                            decodedValue   = window.decodeURIComponent(value),\n                            encodedValue   = window.encodeURIComponent(value),\n                            alreadyEncoded = decodedValue !== value\n                        ;\n                        if (alreadyEncoded) {\n                            module.debug('URL value is already encoded, avoiding double encoding', value);\n\n                            return value;\n                        }\n                        module.verbose('Encoding value using encodeURIComponent', value, encodedValue);\n\n                        return encodedValue;\n                    },\n                    defaultData: function () {\n                        var\n                            data = {}\n                        ;\n                        if (!isWindow(element)) {\n                            if (module.is.input()) {\n                                data.value = $module.val();\n                            } else if (!module.is.form()) {\n                                data.text = $module.text();\n                            }\n                        }\n\n                        return data;\n                    },\n                    event: function () {\n                        if (isWindow(element) || settings.on === 'now') {\n                            module.debug('API called without element, no events attached');\n\n                            return false;\n                        }\n                        if (settings.on === 'auto') {\n                            if ($module.is('input')) {\n                                return element.oninput !== undefined\n                                    ? 'input'\n                                    : (element.onpropertychange !== undefined\n                                        ? 'propertychange'\n                                        : 'keyup');\n                            }\n                            if ($module.is('form')) {\n                                return 'submit';\n                            }\n\n                            return 'click';\n                        }\n\n                        return settings.on;\n                    },\n                    templatedURL: function (action) {\n                        action = action || settings.action || $module.data(metadata.action) || false;\n                        url = settings.url || $module.data(metadata.url) || false;\n                        if (url) {\n                            module.debug('Using specified url', url);\n\n                            return url;\n                        }\n                        if (action) {\n                            module.debug('Looking up url for action', action, settings.api);\n                            if (settings.api[action] === undefined && !module.is.mocked()) {\n                                module.error(error.missingAction, settings.action, settings.api);\n\n                                return;\n                            }\n                            url = settings.api[action];\n                        } else if (module.is.form()) {\n                            url = $module.attr('action') || $context.attr('action') || false;\n                            module.debug('No url or action specified, defaulting to form action', url);\n                        }\n\n                        return url;\n                    },\n                },\n\n                abort: function () {\n                    var\n                        xhr = module.get.xhr()\n                    ;\n                    if (xhr && xhr.state() !== 'resolved') {\n                        module.debug('Cancelling API request');\n                        xhr.abort();\n                    }\n                },\n\n                // reset state\n                reset: function () {\n                    module.remove.error();\n                    module.remove.loading();\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                // 'Element'        : element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n    $.api = $.fn.api;\n\n    $.api.settings = {\n\n        name: 'API',\n        namespace: 'api',\n\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        // object containing all templates endpoints\n        api: {},\n\n        // whether to cache responses\n        cache: true,\n\n        // whether new requests should abort previous requests\n        interruptRequests: true,\n\n        // event binding\n        on: 'auto',\n\n        // context for applying state classes\n        stateContext: false,\n\n        // duration for loading state\n        loadingDuration: 0,\n\n        // whether to hide errors after a period of time\n        hideError: 'auto',\n\n        // duration for error state\n        errorDuration: 2000,\n\n        // whether parameters should be encoded with encodeURIComponent\n        encodeParameters: true,\n\n        // API action to use\n        action: false,\n\n        // templated URL to use\n        url: false,\n\n        // base URL to apply to all endpoints\n        base: '',\n\n        // data that will\n        urlData: {},\n\n        // whether to add default data to url data\n        defaultData: true,\n\n        // whether to serialize closest form\n        // use true to convert complex named keys like a[b][1][c][] into a nested object\n        // use 'formdata' for formdata web api\n        serializeForm: false,\n\n        // how long to wait before request should occur\n        throttle: 0,\n\n        // whether to throttle first request or only repeated\n        throttleFirstRequest: true,\n\n        // standard ajax settings\n        method: 'get',\n        data: {},\n        dataType: 'json',\n\n        // mock response\n        mockResponse: false,\n        mockResponseAsync: false,\n\n        // aliases for mock\n        response: false,\n        responseAsync: false,\n\n        // whether onResponse should work with response value without force converting into an object\n        rawResponse: true,\n\n        // callbacks before request\n        beforeSend: function (settings) {\n            return settings;\n        },\n        beforeXHR: function (xhr) {},\n        onRequest: function (promise, xhr) {},\n\n        // after request\n        onResponse: false, // function(response) { },\n\n        // response was successful, if JSON passed validation\n        onSuccess: function (response, $module) {},\n\n        // request finished without aborting\n        onComplete: function (response, $module) {},\n\n        // failed JSON success test\n        onFailure: function (response, $module) {},\n\n        // server error\n        onError: function (errorMessage, $module) {},\n\n        // request aborted\n        onAbort: function (errorMessage, $module) {},\n\n        successTest: false,\n\n        // errors\n        error: {\n            beforeSend: 'The before send function has aborted the request',\n            error: 'There was an error with your request',\n            exitConditions: 'API Request Aborted. Exit conditions met',\n            JSONParse: 'JSON could not be parsed during error handling',\n            legacyParameters: 'You are using legacy API success callback names',\n            method: 'The method you called is not defined',\n            missingAction: 'API action used but no url was defined',\n            missingURL: 'No URL specified for api event',\n            noReturnedValue: 'The beforeSend callback must return a settings object, beforeSend ignored.',\n            noStorage: 'Caching responses locally requires session storage',\n            parseError: 'There was an error parsing your request',\n            requiredParameter: 'Missing a required URL parameter: ',\n            statusMessage: 'Server gave an error: ',\n            timeout: 'Your request timed out',\n        },\n\n        regExp: {\n            required: /{\\$*[\\da-z]+}/gi,\n            optional: /{\\/\\$*[\\da-z]+}/gi,\n            validate: /^[_a-z][\\w-]*(?:\\[[\\w-]*])*$/i,\n            key: /[\\w-]+|(?=\\[])/gi,\n            push: /^$/,\n            fixed: /^\\d+$/,\n            named: /^[\\w-]+$/i,\n        },\n\n        className: {\n            loading: 'loading',\n            error: 'error',\n        },\n\n        selector: {\n            disabled: '.disabled',\n            form: 'form',\n        },\n\n        metadata: {\n            action: 'action',\n            url: 'url',\n        },\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/breadcrumb.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Breadcrumb\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n           Breadcrumb\n*******************************/\n\n.ui.breadcrumb {\n  line-height: 1.4285em;\n  display: inline-block;\n  margin: 0 0;\n  vertical-align: middle;\n}\n.ui.breadcrumb:first-child {\n  margin-top: 0;\n}\n.ui.breadcrumb:last-child {\n  margin-bottom: 0;\n}\n\n\n/*******************************\n          Content\n*******************************/\n\n\n/* Divider */\n.ui.breadcrumb .divider {\n  display: inline-block;\n  opacity: 0.7;\n  margin: 0 0.21428571rem;\n  font-size: 0.92857143em;\n  color: rgba(0, 0, 0, 0.4);\n  vertical-align: baseline;\n}\n\n/* Link */\n.ui.breadcrumb a {\n  color: #4183c4;\n}\n.ui.breadcrumb a:hover {\n  color: #1e70bf;\n}\n\n/* Icon Divider */\n.ui.breadcrumb .icon.divider {\n  font-size: 0.85714286em;\n  vertical-align: baseline;\n}\n\n/* Section */\n.ui.breadcrumb a.section {\n  cursor: pointer;\n}\n.ui.breadcrumb .section {\n  display: inline-block;\n  margin: 0;\n  padding: 0;\n}\n\n/* Loose Coupling */\n.ui.breadcrumb.segment {\n  display: inline-block;\n  padding: 0.78571429em 1em;\n}\n\n/* Inverted */\n.ui.inverted.breadcrumb {\n  color: #dcddde;\n}\n.ui.inverted.breadcrumb > .active.section {\n  color: #fff;\n}\n.ui.inverted.breadcrumb > .divider {\n  color: rgba(255, 255, 255, 0.7);\n}\n\n\n/*******************************\n            States\n*******************************/\n\n.ui.breadcrumb .active.section {\n  font-weight: bold;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n.ui.breadcrumb {\n  font-size: 1rem;\n}\n.ui.mini.breadcrumb {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.breadcrumb {\n  font-size: 0.85714286rem;\n}\n.ui.small.breadcrumb {\n  font-size: 0.92857143rem;\n}\n.ui.large.breadcrumb {\n  font-size: 1.14285714rem;\n}\n.ui.big.breadcrumb {\n  font-size: 1.28571429rem;\n}\n.ui.huge.breadcrumb {\n  font-size: 1.42857143rem;\n}\n.ui.massive.breadcrumb {\n  font-size: 1.71428571rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/button.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Button\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Button\n*******************************/\n\n.ui.button {\n  cursor: pointer;\n  display: inline-block;\n  min-height: 1em;\n  outline: none;\n  border: none;\n  vertical-align: baseline;\n  background: #e0e1e2 none;\n  color: rgba(0, 0, 0, 0.6);\n  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\";\n  margin: 0 0.25em 0 0;\n  padding: 0.78571429em 1.5em 0.78571429em;\n  text-transform: none;\n  text-shadow: none;\n  font-weight: bold;\n  line-height: 1em;\n  font-style: normal;\n  text-align: center;\n  text-decoration: none;\n  border-radius: 0.28571429rem;\n  box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, background 0.1s ease;\n  will-change: auto;\n  -webkit-tap-highlight-color: transparent;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------\n      Hover\n--------------- */\n.ui.button:hover {\n  background-color: #cacbcd;\n  background-image: none;\n  box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n  color: rgba(0, 0, 0, 0.8);\n}\n.ui.button:hover .icon {\n  opacity: 0.85;\n}\n\n/* --------------\n      Focus\n--------------- */\n.ui.button:focus {\n  background-color: #cacbcd;\n  color: rgba(0, 0, 0, 0.8);\n  background-image: none;\n  box-shadow: \"\";\n}\n.ui.button:focus .icon {\n  opacity: 0.85;\n}\n\n/* --------------\n      Down\n--------------- */\n.ui.button:active,\n.ui.active.button:active {\n  background-color: #babbbc;\n  background-image: \"\";\n  color: rgba(0, 0, 0, 0.9);\n  box-shadow: none;\n}\n\n/* --------------\n     Active\n--------------- */\n.ui.active.button {\n  background-color: #c0c1c2;\n  background-image: none;\n  box-shadow: 0 0 0 1px transparent inset;\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.active.button:hover {\n  background-color: #c0c1c2;\n  background-image: none;\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.active.button:active {\n  background-color: #c0c1c2;\n  background-image: none;\n}\n\n/* --------------\n        Loading\n    --------------- */\n\n/* Specificity hack */\n.ui.ui.ui.ui.ui.ui.loading.button {\n  position: relative;\n  cursor: default;\n  text-shadow: none !important;\n  color: transparent;\n  opacity: 1;\n  pointer-events: auto;\n  transition: all 0s linear, opacity 0.1s ease;\n}\n.ui.loading.button::before {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -0.64285714em 0 0 -0.64285714em;\n  width: 1.28571429em;\n  height: 1.28571429em;\n  border-radius: 500rem;\n  border: 0.2em solid rgba(0, 0, 0, 0.15);\n}\n.ui.loading.button::after {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -0.64285714em 0 0 -0.64285714em;\n  width: 1.28571429em;\n  height: 1.28571429em;\n  border-radius: 500rem;\n  animation: loader 0.6s infinite linear;\n  border: 0.2em solid currentColor;\n  color: #fff;\n  box-shadow: 0 0 0 1px transparent;\n}\n.ui.ui.ui.loading.button .label {\n  background-color: transparent;\n  border-color: transparent;\n  color: transparent;\n}\n.ui.labeled.icon.loading.button .icon {\n  background-color: transparent;\n  box-shadow: none;\n}\n.ui.basic.loading.button:not(.inverted)::before {\n  border-color: rgba(0, 0, 0, 0.1);\n}\n.ui.basic.loading.button:not(.inverted)::after {\n  border-color: #767676;\n}\n\n/* -------------------\n          Disabled\n    -------------------- */\n.ui.buttons .disabled.button:not(.basic),\n.ui.disabled.button,\n.ui.button:disabled,\n.ui.disabled.button:hover,\n.ui.disabled.active.button {\n  cursor: default;\n  opacity: 0.45 !important;\n  background-image: none;\n  box-shadow: none;\n  pointer-events: none !important;\n}\n\n/* Basic Group With Disabled */\n.ui.basic.buttons .ui.disabled.button {\n  border-color: rgba(34, 36, 38, 0.5);\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/* -------------------\n           Animated\n    -------------------- */\n.ui.animated.button {\n  position: relative;\n  overflow: hidden;\n  padding-right: 0 !important;\n  vertical-align: middle;\n  z-index: 1;\n}\n.ui.animated.button .content {\n  will-change: transform, opacity;\n}\n.ui.animated.button .visible.content {\n  position: relative;\n  margin-right: 1.5em;\n}\n.ui.animated.button .hidden.content {\n  position: absolute;\n  width: 100%;\n}\n\n/* Horizontal */\n.ui.animated.button .visible.content,\n.ui.animated.button .hidden.content {\n  transition: right 0.3s ease 0s;\n}\n.ui.animated.button .visible.content {\n  left: auto;\n  right: 0;\n}\n.ui.animated.button .hidden.content {\n  top: 50%;\n  left: auto;\n  right: -100%;\n  margin-top: -0.5em;\n}\n.ui.animated.button:focus .visible.content,\n.ui.animated.button:hover .visible.content {\n  left: auto;\n  right: 200%;\n}\n.ui.animated.button:focus .hidden.content,\n.ui.animated.button:hover .hidden.content {\n  left: auto;\n  right: 0;\n}\n\n/* Vertical */\n.ui.vertical.animated.button .visible.content,\n.ui.vertical.animated.button .hidden.content {\n  transition: top 0.3s ease, transform 0.3s ease;\n}\n.ui.vertical.animated.button .visible.content {\n  transform: translateY(0);\n  right: auto;\n}\n.ui.vertical.animated.button .hidden.content {\n  top: -50%;\n  left: 0;\n  right: auto;\n}\n.ui.vertical.animated.button:focus .visible.content,\n.ui.vertical.animated.button:hover .visible.content {\n  transform: translateY(200%);\n  right: auto;\n}\n.ui.vertical.animated.button:focus .hidden.content,\n.ui.vertical.animated.button:hover .hidden.content {\n  top: 50%;\n  right: auto;\n}\n\n/* Fade */\n.ui.fade.animated.button .visible.content,\n.ui.fade.animated.button .hidden.content {\n  transition: opacity 0.3s ease, transform 0.3s ease;\n}\n.ui.fade.animated.button .visible.content {\n  left: auto;\n  right: auto;\n  opacity: 1;\n  transform: scale(1);\n}\n.ui.fade.animated.button .hidden.content {\n  opacity: 0;\n  left: 0;\n  right: auto;\n  transform: scale(1.5);\n}\n.ui.fade.animated.button:focus .visible.content,\n.ui.fade.animated.button:hover .visible.content {\n  left: auto;\n  right: auto;\n  opacity: 0;\n  transform: scale(0.75);\n}\n.ui.fade.animated.button:focus .hidden.content,\n.ui.fade.animated.button:hover .hidden.content {\n  left: 0;\n  right: auto;\n  opacity: 1;\n  transform: scale(1);\n}\n\n/* -------------------\n           Inverted\n    -------------------- */\n.ui.inverted.button {\n  box-shadow: 0 0 0 2px #fff inset;\n  background: transparent none;\n  color: #fff;\n  text-shadow: none !important;\n}\n\n/* Group */\n.ui.inverted.buttons .button {\n  margin: 0 0 0 -2px;\n}\n.ui.inverted.buttons .button:first-child {\n  margin-left: 0;\n}\n.ui.inverted.vertical.buttons .button {\n  margin: 0 0 -2px 0;\n}\n.ui.inverted.vertical.buttons .button:first-child {\n  margin-top: 0;\n}\n\n/* States */\n\n/* Hover */\n.ui.inverted.button:hover {\n  background: #fff;\n  box-shadow: 0 0 0 2px #fff inset;\n  color: rgba(0, 0, 0, 0.8);\n}\n\n/* Active / Focus */\n.ui.inverted.button:focus,\n.ui.inverted.button.active {\n  background: #fff;\n  box-shadow: 0 0 0 2px #fff inset;\n  color: rgba(0, 0, 0, 0.8);\n}\n\n/* Active Focus */\n.ui.inverted.button.active:focus {\n  background: #dcddde;\n  box-shadow: 0 0 0 2px #dcddde inset;\n  color: rgba(0, 0, 0, 0.8);\n}\n\n/* -------------------\n        Labeled Button\n    -------------------- */\n.ui.labeled.button:not(.icon) {\n  display: inline-flex;\n  flex-direction: row;\n  background: none;\n  padding: 0 !important;\n  border: none;\n  box-shadow: none;\n}\n.ui.labeled.button > .button {\n  margin: 0;\n}\n.ui.labeled.button > .label {\n  display: flex;\n  align-items: center;\n  margin: 0 0 0 -1px !important;\n  font-size: 1em;\n  padding: \"\";\n  border-color: rgba(34, 36, 38, 0.15);\n}\n\n/* Tag */\n.ui.labeled.button > .tag.label::before {\n  width: 1.85em;\n  height: 1.85em;\n}\n\n/* Right */\n.ui.labeled.button:not([class*=\"left labeled\"]) > .button {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.labeled.button:not([class*=\"left labeled\"]) > .label {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n/* Left Side */\n.ui[class*=\"left labeled\"].button > .button {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ui[class*=\"left labeled\"].button > .label {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n/* -------------------\n           Social\n    -------------------- */\n\n/* Facebook */\n.ui.facebook.button {\n  background-color: #3b5998;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.facebook.button:hover {\n  background-color: #304d8a;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.facebook.button:active {\n  background-color: #2d4373;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Twitter */\n.ui.twitter.button {\n  background-color: #1da1f2;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.twitter.button:hover {\n  background-color: #0298f3;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.twitter.button:active {\n  background-color: #0c85d0;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Google Plus */\n.ui.google.plus.button {\n  background-color: #dd4b39;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.google.plus.button:hover {\n  background-color: #e0321c;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.google.plus.button:active {\n  background-color: #c23321;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Linked In */\n.ui.linkedin.button {\n  background-color: #0077b5;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.linkedin.button:hover {\n  background-color: #00669c;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.linkedin.button:active {\n  background-color: #005582;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* YouTube */\n.ui.youtube.button {\n  background-color: #f00;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.youtube.button:hover {\n  background-color: #e60000;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.youtube.button:active {\n  background-color: #cc0000;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Instagram */\n.ui.instagram.button {\n  background-color: #49769c;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.instagram.button:hover {\n  background-color: #3d698e;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.instagram.button:active {\n  background-color: #395c79;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Pinterest */\n.ui.pinterest.button {\n  background-color: #bd081c;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.pinterest.button:hover {\n  background-color: #ac0013;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.pinterest.button:active {\n  background-color: #8c0615;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* VK */\n.ui.vk.button {\n  background-color: #45668e;\n  color: #fff;\n  background-image: none;\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.vk.button:hover {\n  background-color: #395980;\n  color: #fff;\n}\n.ui.vk.button:active {\n  background-color: #344d6c;\n  color: #fff;\n}\n\n/* WhatsApp */\n.ui.whatsapp.button {\n  background-color: #25d366;\n  color: #fff;\n  background-image: none;\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.whatsapp.button:hover {\n  background-color: #19c55a;\n  color: #fff;\n}\n.ui.whatsapp.button:active {\n  background-color: #1da851;\n  color: #fff;\n}\n\n/* Telegram */\n.ui.telegram.button {\n  background-color: #08c;\n  color: #fff;\n  background-image: none;\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.telegram.button:hover {\n  background-color: #0077b3;\n  color: #fff;\n}\n.ui.telegram.button:active {\n  background-color: #006699;\n  color: #fff;\n}\n\n/* --------------\n     Icon\n--------------- */\n.ui.button > .icon:not(.button) {\n  height: auto;\n  opacity: 0.8;\n  transition: opacity 0.1s ease;\n  color: \"\";\n}\n.ui.button:not(.icon) > .icon:not(.button):not(.dropdown),\n.ui.button:not(.icon) > .icons:not(.button):not(.dropdown) {\n  margin: 0 0.42857143em 0 -0.21428571em;\n  vertical-align: baseline;\n}\n.ui.button:not(.icon) > .icons:not(.button):not(.dropdown) > .icon {\n  vertical-align: baseline;\n}\n.ui.button:not(.icon) > .right.icon:not(.button):not(.dropdown) {\n  margin: 0 -0.21428571em 0 0.42857143em;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n       Stackable\n    --------------- */\n\n/* Tablet Or Below */\n@media only screen and (max-width: 767.98px) {\n  .ui.stackable.buttons {\n    flex-direction: column;\n    width: 100%;\n  }\n  .ui.stackable.buttons .button:first-child {\n    border-bottom-left-radius: 0;\n    border-top-right-radius: 0.28571429rem;\n  }\n  .ui.stackable.buttons .button:last-child {\n    border-bottom-left-radius: 0.28571429rem;\n    border-top-right-radius: 0;\n  }\n  .ui.stackable.buttons .button:only-child {\n    border-radius: 0.28571429rem;\n  }\n}\n\n/* -------------------\n           Floated\n    -------------------- */\n.ui[class*=\"left floated\"].buttons,\n.ui[class*=\"left floated\"].button {\n  float: left;\n  margin-left: 0;\n  margin-right: 0.25em;\n}\n.ui[class*=\"right floated\"].buttons,\n.ui[class*=\"right floated\"].button {\n  float: right;\n  margin-right: 0;\n  margin-left: 0.25em;\n}\n\n/* -------------------\n           Compact\n    -------------------- */\n.ui.compact.buttons .button,\n.ui.compact.button {\n  padding: 0.58928571em 1.125em 0.58928571em;\n}\n.ui.compact.icon.buttons .button,\n.ui.compact.icon.button {\n  padding: 0.58928571em 0.58928571em 0.58928571em;\n}\n.ui.compact.labeled.icon.buttons .button,\n.ui.compact.labeled.icon.button {\n  padding: 0.58928571em 3.69642857em 0.58928571em;\n}\n.ui.compact.labeled.icon.buttons .button > .icon,\n.ui.compact.labeled.icon.button > .icon {\n  padding: 0.58928571em 0;\n}\n\n/* -------------------\n        Sizes\n-------------------- */\n.ui.buttons .button,\n.ui.buttons .or,\n.ui.button {\n  font-size: 1rem;\n}\n.ui.mini.buttons .dropdown,\n.ui.mini.buttons .dropdown .menu > .item,\n.ui.mini.buttons .button,\n.ui.mini.buttons .or,\n.ui.ui.ui.ui.mini.button {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.buttons .dropdown,\n.ui.tiny.buttons .dropdown .menu > .item,\n.ui.tiny.buttons .button,\n.ui.tiny.buttons .or,\n.ui.ui.ui.ui.tiny.button {\n  font-size: 0.85714286rem;\n}\n.ui.small.buttons .dropdown,\n.ui.small.buttons .dropdown .menu > .item,\n.ui.small.buttons .button,\n.ui.small.buttons .or,\n.ui.ui.ui.ui.small.button {\n  font-size: 0.92857143rem;\n}\n.ui.large.buttons .dropdown,\n.ui.large.buttons .dropdown .menu > .item,\n.ui.large.buttons .button,\n.ui.large.buttons .or,\n.ui.ui.ui.ui.large.button {\n  font-size: 1.14285714rem;\n}\n.ui.big.buttons .dropdown,\n.ui.big.buttons .dropdown .menu > .item,\n.ui.big.buttons .button,\n.ui.big.buttons .or,\n.ui.ui.ui.ui.big.button {\n  font-size: 1.28571429rem;\n}\n.ui.huge.buttons .dropdown,\n.ui.huge.buttons .dropdown .menu > .item,\n.ui.huge.buttons .button,\n.ui.huge.buttons .or,\n.ui.ui.ui.ui.huge.button {\n  font-size: 1.42857143rem;\n}\n.ui.massive.buttons .dropdown,\n.ui.massive.buttons .dropdown .menu > .item,\n.ui.massive.buttons .button,\n.ui.massive.buttons .or,\n.ui.ui.ui.ui.massive.button {\n  font-size: 1.71428571rem;\n}\n\n/* --------------\n        Icon Only\n    --------------- */\n.ui.icon.buttons .button,\n.ui.icon.button:not(.animated):not(.compact):not(.labeled) {\n  padding: 0.78571429em 0.78571429em 0.78571429em;\n}\n.ui.animated.icon.button > .content > .icon,\n.ui.icon.buttons .button > .icon,\n.ui.icon.button > .icon {\n  opacity: 0.9;\n  margin: 0 !important;\n  vertical-align: top;\n}\n.ui.animated.button > .content > .icon {\n  vertical-align: top;\n}\n\n/* -------------------\n            Basic\n    -------------------- */\n.ui.basic.buttons .button,\n.ui.basic.button {\n  background: transparent none;\n  color: rgba(0, 0, 0, 0.6);\n  font-weight: normal;\n  border-radius: 0.28571429rem;\n  text-transform: none;\n  text-shadow: none !important;\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15) inset;\n}\n.ui.basic.buttons {\n  box-shadow: none;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  border-radius: 0.28571429rem;\n  border-right: none;\n}\n.ui.basic.buttons .button {\n  border-radius: 0;\n}\n.ui.basic.buttons .button:hover,\n.ui.basic.button:hover {\n  background: #fff;\n  color: rgba(0, 0, 0, 0.8);\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.35) inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.basic.buttons .button:focus,\n.ui.basic.button:focus {\n  background: #fff;\n  color: rgba(0, 0, 0, 0.8);\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.35) inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.basic.buttons .button:active,\n.ui.basic.button:active {\n  background: #f8f8f8;\n  color: rgba(0, 0, 0, 0.9);\n  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset, 0 1px 4px 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.basic.buttons .active.button,\n.ui.basic.active.button {\n  background: rgba(0, 0, 0, 0.05);\n  box-shadow: \"\";\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.basic.buttons .active.button:hover,\n.ui.basic.active.button:hover {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n.ui.basic.buttons .button:hover {\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.35) inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.basic.buttons .button:active {\n  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset, 0 1px 4px 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.basic.buttons .active.button {\n  box-shadow: \"\";\n}\n\n/* Standard Basic Inverted */\n.ui.basic.inverted.buttons .button,\n.ui.basic.inverted.button {\n  background-color: transparent;\n  color: #f9fafb;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n}\n.ui.basic.inverted.buttons .button:hover,\n.ui.basic.inverted.button:hover {\n  color: #fff;\n  box-shadow: 0 0 0 2px #ffffff inset;\n}\n.ui.basic.inverted.buttons .button:focus,\n.ui.basic.inverted.button:focus {\n  color: #fff;\n  box-shadow: 0 0 0 2px #ffffff inset;\n}\n.ui.basic.inverted.buttons .button:active,\n.ui.basic.inverted.button:active {\n  background-color: rgba(255, 255, 255, 0.08);\n  color: #fff;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.9) inset;\n}\n.ui.basic.inverted.buttons .active.button,\n.ui.basic.inverted.active.button {\n  background-color: rgba(255, 255, 255, 0.08);\n  color: #fff;\n  text-shadow: none;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.7) inset;\n}\n.ui.basic.inverted.buttons .active.button:hover,\n.ui.basic.inverted.active.button:hover {\n  background-color: rgba(255, 255, 255, 0.15);\n  box-shadow: 0 0 0 2px #ffffff inset;\n}\n\n/* Basic Group */\n.ui.basic.buttons:not(.inverted) .button:not(.basic) {\n  border-right: 1px solid rgba(34, 36, 38, 0.15);\n  box-shadow: none;\n}\n.ui.basic.vertical.buttons .button {\n  border-left: none;\n  border-left-width: 0;\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.basic.vertical.buttons:not(.spaced):not(.circular) .button:first-child {\n  border-top: none;\n}\n\n/* -------------------\n           Tertiary\n    -------------------- */\n\n/* Overline Mixin */\n.ui.tertiary.button {\n  transition: color 0.1s ease !important;\n  border-radius: 0;\n  margin: 0.28571429em 0.25em 0.28571429em 0 !important;\n  padding: 0.5em 0.5em !important;\n  box-shadow: none;\n  color: rgba(0, 0, 0, 0.6);\n  background: none;\n}\n.ui.tertiary.button:hover {\n  box-shadow: inset 0 -0.2em 0 #666666;\n  color: #333333;\n  background: none;\n}\n.ui.tertiary.button:focus {\n  box-shadow: inset 0 -0.2em 0 #666666;\n  color: #333333;\n  background: none;\n}\n.ui.tertiary.button:active {\n  box-shadow: inset 0 -0.2em 0 #999999;\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n  color: #666666;\n  background: none;\n}\n\n/* --------------\n      Labeled Icon\n    --------------- */\n.ui.labeled.icon.buttons .button,\n.ui.labeled.icon.button {\n  position: relative;\n  padding-left: 4.07142857em !important;\n  padding-right: 1.5em !important;\n}\n\n/* Left Labeled */\n.ui.labeled.icon.buttons > .button > .icon,\n.ui.labeled.icon.button > .icon {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n  line-height: 1;\n  border-radius: 0;\n  border-top-left-radius: inherit;\n  border-bottom-left-radius: inherit;\n  text-align: center;\n  animation: none;\n  padding: 0.78571429em 0;\n  margin: 0;\n  width: 2.57142857em;\n  background-color: rgba(0, 0, 0, 0.05);\n  color: \"\";\n  box-shadow: -1px 0 0 0 transparent inset;\n}\n\n/* Right Labeled */\n.ui[class*=\"right labeled\"].icon.button {\n  padding-right: 4.07142857em !important;\n  padding-left: 1.5em !important;\n}\n.ui[class*=\"right labeled\"].icon.button > .icon {\n  left: auto;\n  right: 0;\n  border-radius: 0;\n  border-top-right-radius: inherit;\n  border-bottom-right-radius: inherit;\n  box-shadow: 1px 0 0 0 transparent inset;\n}\n.ui.labeled.icon.buttons > .button > .icon::before,\n.ui.labeled.icon.button > .icon::before,\n.ui.labeled.icon.buttons > .button > .icon::after,\n.ui.labeled.icon.button > .icon::after {\n  display: block;\n  position: relative;\n  width: 100%;\n  top: 0;\n  text-align: center;\n}\n.ui.labeled.icon.buttons .button > .icon {\n  border-radius: 0;\n}\n.ui.labeled.icon.buttons .button:first-child > .icon {\n  border-top-left-radius: 0.28571429rem;\n  border-bottom-left-radius: 0.28571429rem;\n}\n.ui.labeled.icon.buttons .button:last-child > .icon {\n  border-top-right-radius: 0.28571429rem;\n  border-bottom-right-radius: 0.28571429rem;\n}\n.ui.vertical.labeled.icon.buttons .button:first-child > .icon {\n  border-radius: 0;\n  border-top-left-radius: 0.28571429rem;\n}\n.ui.vertical.labeled.icon.buttons .button:last-child > .icon {\n  border-radius: 0;\n  border-bottom-left-radius: 0.28571429rem;\n}\n\n/* Loading Icon in Labeled Button */\n.ui.labeled.icon.button > .loading.icon::before {\n  animation: loader 2s linear infinite;\n}\n\n/* --------------\n         Toggle\n    --------------- */\n\n/* Toggle (Modifies active state to give affordances) */\n.ui.toggle.buttons .active.button,\n.ui.buttons .button.toggle.active,\n.ui.button.toggle.active {\n  background-color: #21ba45;\n  box-shadow: none;\n  text-shadow: none;\n  color: #fff;\n}\n.ui.button.toggle.active:hover {\n  background-color: #16ab39;\n  text-shadow: none;\n  color: #fff;\n}\n\n/* --------------\n        Circular\n    --------------- */\n.ui.ui.circular.buttons .button,\n.ui.ui.ui.ui.circular.button {\n  border-radius: 10em;\n  min-width: 2.5em;\n}\n.ui.circular.buttons .button > .icon,\n.ui.circular.button > .icon {\n  width: 1em;\n  vertical-align: baseline;\n}\n.ui.circular.buttons:not(.vertical):not(.spaced) .button {\n  margin-right: 0.25em;\n}\n.ui.vertical.circular.buttons .button {\n  margin-bottom: 0.25em;\n}\n.ui.circular.basic.buttons {\n  border: none;\n}\n.ui.circular.basic.buttons .button {\n  border: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.circular.basic.buttons .button.basic {\n  border: none;\n}\n\n/* -------------------\n          Or Buttons\n    -------------------- */\n.ui.buttons .or {\n  position: relative;\n  width: 0.3em;\n  height: 2.57142857em;\n  z-index: 3;\n}\n.ui.buttons .or::before {\n  position: absolute;\n  text-align: center;\n  border-radius: 500rem;\n  content: \"or\";\n  top: 50%;\n  left: 50%;\n  background-color: #fff;\n  text-shadow: none;\n  margin-top: -0.89285714em;\n  margin-left: -0.89285714em;\n  width: 1.78571429em;\n  height: 1.78571429em;\n  line-height: 1.78571429em;\n  color: rgba(0, 0, 0, 0.4);\n  font-style: normal;\n  font-weight: bold;\n  box-shadow: 0 0 0 1px transparent inset;\n}\n.ui.buttons .or[data-text]::before {\n  content: attr(data-text);\n}\n\n/* Fluid Or */\n.ui.fluid.buttons .or {\n  width: 0 !important;\n}\n.ui.fluid.buttons .or::after {\n  display: none;\n}\n\n/* -------------------\n           Attached\n    -------------------- */\n\n/* Singular */\n.ui.attached.button {\n  position: relative;\n  display: block;\n  margin: 0;\n  border-radius: 0;\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15);\n}\n\n/* Top / Bottom */\n.ui.attached.top.button {\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.attached.bottom.button {\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n\n/* Left / Right */\n.ui.left.attached.button {\n  display: inline-block;\n  border-left: none;\n  text-align: right;\n  padding-right: 0.75em;\n  border-radius: 0.28571429rem 0 0 0.28571429rem;\n}\n.ui.right.attached.button {\n  display: inline-block;\n  text-align: left;\n  padding-left: 0.75em;\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n}\n\n/* Plural */\n.ui.attached.buttons {\n  position: relative;\n  display: flex;\n  border-radius: 0;\n  width: auto !important;\n  z-index: auto;\n  margin-left: -1px;\n  margin-right: -1px;\n}\n.ui.attached.buttons .button {\n  margin: 0;\n}\n.ui.attached.buttons .button:first-child {\n  border-radius: 0;\n}\n.ui.attached.buttons .button:last-child {\n  border-radius: 0;\n}\n\n/* Top / Bottom */\n.ui[class*=\"top attached\"].buttons {\n  margin-bottom: 0;\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui[class*=\"top attached\"].buttons .button:first-child {\n  border-radius: 0.28571429rem 0 0 0;\n}\n.ui[class*=\"top attached\"].buttons .button:last-child {\n  border-radius: 0 0.28571429rem 0 0;\n}\n.ui[class*=\"bottom attached\"].buttons {\n  margin-top: -1px;\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui[class*=\"bottom attached\"].buttons .button:first-child {\n  border-radius: 0 0 0 0.28571429rem;\n}\n.ui[class*=\"bottom attached\"].buttons .button:last-child {\n  border-radius: 0 0 0.28571429rem 0;\n}\n\n/* Left / Right */\n.ui[class*=\"left attached\"].buttons {\n  display: inline-flex;\n  margin-right: 0;\n  margin-left: -1px;\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n}\n.ui[class*=\"left attached\"].buttons .button:first-child {\n  margin-left: -1px;\n  border-radius: 0 0.28571429rem 0 0;\n}\n.ui[class*=\"left attached\"].buttons .button:last-child {\n  margin-left: -1px;\n  border-radius: 0 0 0.28571429rem 0;\n}\n.ui[class*=\"right attached\"].buttons {\n  display: inline-flex;\n  margin-left: 0;\n  margin-right: -1px;\n  border-radius: 0.28571429rem 0 0 0.28571429rem;\n}\n.ui[class*=\"right attached\"].buttons .button:first-child {\n  margin-left: -1px;\n  border-radius: 0.28571429rem 0 0 0;\n}\n.ui[class*=\"right attached\"].buttons .button:last-child {\n  margin-left: -1px;\n  border-radius: 0 0 0 0.28571429rem;\n}\n\n/* -------------------\n            Fluid\n    -------------------- */\n.ui.fluid.buttons,\n.ui.fluid.button {\n  width: 100%;\n}\n.ui.fluid.button {\n  display: block;\n}\n.ui.two.buttons {\n  width: 100%;\n}\n.ui.two.buttons > .button {\n  width: 50%;\n}\n.ui.three.buttons {\n  width: 100%;\n}\n.ui.three.buttons > .button {\n  width: 33.333%;\n}\n.ui.four.buttons {\n  width: 100%;\n}\n.ui.four.buttons > .button {\n  width: 25%;\n}\n.ui.five.buttons {\n  width: 100%;\n}\n.ui.five.buttons > .button {\n  width: 20%;\n}\n.ui.six.buttons {\n  width: 100%;\n}\n.ui.six.buttons > .button {\n  width: 16.666%;\n}\n.ui.seven.buttons {\n  width: 100%;\n}\n.ui.seven.buttons > .button {\n  width: 14.285%;\n}\n.ui.eight.buttons {\n  width: 100%;\n}\n.ui.eight.buttons > .button {\n  width: 12.5%;\n}\n.ui.nine.buttons {\n  width: 100%;\n}\n.ui.nine.buttons > .button {\n  width: 11.11%;\n}\n.ui.ten.buttons {\n  width: 100%;\n}\n.ui.ten.buttons > .button {\n  width: 10%;\n}\n.ui.eleven.buttons {\n  width: 100%;\n}\n.ui.eleven.buttons > .button {\n  width: 9.09%;\n}\n.ui.twelve.buttons {\n  width: 100%;\n}\n.ui.twelve.buttons > .button {\n  width: 8.3333%;\n}\n\n/* Fluid Vertical Buttons */\n.ui.fluid.vertical.buttons,\n.ui.fluid.vertical.buttons > .button {\n  display: flex;\n  width: auto;\n  justify-content: center;\n}\n.ui.two.vertical.buttons > .button {\n  height: 50%;\n}\n.ui.three.vertical.buttons > .button {\n  height: 33.333%;\n}\n.ui.four.vertical.buttons > .button {\n  height: 25%;\n}\n.ui.five.vertical.buttons > .button {\n  height: 20%;\n}\n.ui.six.vertical.buttons > .button {\n  height: 16.666%;\n}\n.ui.seven.vertical.buttons > .button {\n  height: 14.285%;\n}\n.ui.eight.vertical.buttons > .button {\n  height: 12.5%;\n}\n.ui.nine.vertical.buttons > .button {\n  height: 11.11%;\n}\n.ui.ten.vertical.buttons > .button {\n  height: 10%;\n}\n.ui.eleven.vertical.buttons > .button {\n  height: 9.09%;\n}\n.ui.twelve.vertical.buttons > .button {\n  height: 8.3333%;\n}\n\n/* -------------------\n       Colors\n-------------------- */\n.ui.primary.buttons .button,\n.ui.primary.button {\n  background-color: #2185d0;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.primary.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.primary.buttons .button:hover,\n.ui.primary.button:hover {\n  background-color: #1678c2;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.primary.buttons .button:focus,\n.ui.primary.button:focus {\n  background-color: #0d71bb;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.primary.buttons .button:active,\n.ui.primary.button:active {\n  background-color: #1a69a4;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.primary.buttons .active.button,\n.ui.primary.buttons .active.button:active,\n.ui.primary.active.button,\n.ui.primary.button .active.button:active {\n  background-color: #1279c6;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.primary.buttons .button,\n.ui.basic.primary.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #2185d0 inset;\n  color: #2185d0;\n}\n.ui.basic.primary.buttons .button:hover,\n.ui.basic.primary.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #1678c2 inset;\n  color: #1678c2;\n}\n.ui.basic.primary.buttons .button:focus,\n.ui.basic.primary.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #0d71bb inset;\n  color: #1678c2;\n}\n.ui.basic.primary.buttons .active.button,\n.ui.basic.primary.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #1279c6 inset;\n  color: #1a69a4;\n}\n.ui.basic.primary.buttons .button:active,\n.ui.basic.primary.button:active {\n  box-shadow: 0 0 0 1px #1a69a4 inset;\n  color: #1a69a4;\n}\n\n/* Inverted */\n.ui.inverted.primary.buttons .button,\n.ui.inverted.primary.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #54c8ff inset;\n  color: #54c8ff;\n}\n.ui.inverted.primary.buttons .button:hover,\n.ui.inverted.primary.button:hover,\n.ui.inverted.primary.buttons .button:focus,\n.ui.inverted.primary.button:focus,\n.ui.inverted.primary.buttons .button.active,\n.ui.inverted.primary.button.active,\n.ui.inverted.primary.buttons .button:active,\n.ui.inverted.primary.button:active {\n  box-shadow: none;\n  color: #fff;\n}\n.ui.inverted.primary.buttons .button:hover,\n.ui.inverted.primary.button:hover {\n  background-color: #21b8ff;\n}\n.ui.inverted.primary.buttons .button:focus,\n.ui.inverted.primary.button:focus {\n  background-color: #2bbbff;\n}\n.ui.inverted.primary.buttons .active.button,\n.ui.inverted.primary.active.button {\n  background-color: #3ac0ff;\n}\n.ui.inverted.primary.buttons .button:active,\n.ui.inverted.primary.button:active {\n  background-color: #21b8ff;\n}\n\n/* Inverted Basic */\n.ui.inverted.primary.basic.buttons .button,\n.ui.inverted.primary.buttons .basic.button,\n.ui.inverted.primary.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.primary.basic.buttons .button:hover,\n.ui.inverted.primary.buttons .basic.button:hover,\n.ui.inverted.primary.basic.button:hover {\n  box-shadow: 0 0 0 2px #21b8ff inset;\n  color: #54c8ff;\n}\n.ui.inverted.primary.basic.buttons .button:focus,\n.ui.inverted.primary.basic.buttons .button:focus,\n.ui.inverted.primary.basic.button:focus {\n  box-shadow: 0 0 0 2px #2bbbff inset;\n  color: #54c8ff;\n}\n.ui.inverted.primary.basic.buttons .active.button,\n.ui.inverted.primary.buttons .basic.active.button,\n.ui.inverted.primary.basic.active.button {\n  box-shadow: 0 0 0 2px #3ac0ff inset;\n  color: #54c8ff;\n}\n.ui.inverted.primary.basic.buttons .button:active,\n.ui.inverted.primary.buttons .basic.button:active,\n.ui.inverted.primary.basic.button:active {\n  box-shadow: 0 0 0 2px #21b8ff inset;\n  color: #54c8ff;\n}\n\n/* Tertiary */\n.ui.tertiary.primary.buttons .button,\n.ui.tertiary.primary.buttons .tertiary.button,\n.ui.tertiary.primary.button {\n  background: transparent;\n  box-shadow: none;\n  color: #2185d0;\n}\n.ui.tertiary.primary.buttons .button:hover,\n.ui.tertiary.primary.buttons button:hover,\n.ui.tertiary.primary.button:hover {\n  box-shadow: inset 0 -0.2em 0 #2b75ac;\n  color: #2b75ac;\n}\n.ui.tertiary.primary.buttons .button:focus,\n.ui.tertiary.primary.buttons .tertiary.button:focus,\n.ui.tertiary.primary.button:focus {\n  box-shadow: inset 0 -0.2em 0 #216ea7;\n  color: #216ea7;\n}\n.ui.tertiary.primary.buttons .active.button,\n.ui.tertiary.primary.buttons .tertiary.active.button,\n.ui.tertiary.primary.active.button,\n.ui.tertiary.primary.buttons .button:active,\n.ui.tertiary.primary.buttons .tertiary.button:active,\n.ui.tertiary.primary.button:active {\n  box-shadow: inset 0 -0.2em 0 #007bd8;\n  color: #1279c6;\n}\n.ui.secondary.buttons .button,\n.ui.secondary.button {\n  background-color: #1b1c1d;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.secondary.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.secondary.buttons .button:hover,\n.ui.secondary.button:hover {\n  background-color: #27292a;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.secondary.buttons .button:focus,\n.ui.secondary.button:focus {\n  background-color: #2e3032;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.secondary.buttons .button:active,\n.ui.secondary.button:active {\n  background-color: #343637;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.secondary.buttons .active.button,\n.ui.secondary.buttons .active.button:active,\n.ui.secondary.active.button,\n.ui.secondary.button .active.button:active {\n  background-color: #27292a;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.secondary.buttons .button,\n.ui.basic.secondary.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #1b1c1d inset;\n  color: #1b1c1d;\n}\n.ui.basic.secondary.buttons .button:hover,\n.ui.basic.secondary.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #27292a inset;\n  color: #27292a;\n}\n.ui.basic.secondary.buttons .button:focus,\n.ui.basic.secondary.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #2e3032 inset;\n  color: #27292a;\n}\n.ui.basic.secondary.buttons .active.button,\n.ui.basic.secondary.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #27292a inset;\n  color: #343637;\n}\n.ui.basic.secondary.buttons .button:active,\n.ui.basic.secondary.button:active {\n  box-shadow: 0 0 0 1px #343637 inset;\n  color: #343637;\n}\n\n/* Inverted */\n.ui.inverted.secondary.buttons .button,\n.ui.inverted.secondary.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #545454 inset;\n  color: #545454;\n}\n.ui.inverted.secondary.buttons .button:hover,\n.ui.inverted.secondary.button:hover,\n.ui.inverted.secondary.buttons .button:focus,\n.ui.inverted.secondary.button:focus,\n.ui.inverted.secondary.buttons .button.active,\n.ui.inverted.secondary.button.active,\n.ui.inverted.secondary.buttons .button:active,\n.ui.inverted.secondary.button:active {\n  box-shadow: none;\n  color: #fff;\n}\n.ui.inverted.secondary.buttons .button:hover,\n.ui.inverted.secondary.button:hover {\n  background-color: #6e6e6e;\n}\n.ui.inverted.secondary.buttons .button:focus,\n.ui.inverted.secondary.button:focus {\n  background-color: #686868;\n}\n.ui.inverted.secondary.buttons .active.button,\n.ui.inverted.secondary.active.button {\n  background-color: #616161;\n}\n.ui.inverted.secondary.buttons .button:active,\n.ui.inverted.secondary.button:active {\n  background-color: #6e6e6e;\n}\n\n/* Inverted Basic */\n.ui.inverted.secondary.basic.buttons .button,\n.ui.inverted.secondary.buttons .basic.button,\n.ui.inverted.secondary.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.secondary.basic.buttons .button:hover,\n.ui.inverted.secondary.buttons .basic.button:hover,\n.ui.inverted.secondary.basic.button:hover {\n  box-shadow: 0 0 0 2px #6e6e6e inset;\n  color: #545454;\n}\n.ui.inverted.secondary.basic.buttons .button:focus,\n.ui.inverted.secondary.basic.buttons .button:focus,\n.ui.inverted.secondary.basic.button:focus {\n  box-shadow: 0 0 0 2px #686868 inset;\n  color: #545454;\n}\n.ui.inverted.secondary.basic.buttons .active.button,\n.ui.inverted.secondary.buttons .basic.active.button,\n.ui.inverted.secondary.basic.active.button {\n  box-shadow: 0 0 0 2px #616161 inset;\n  color: #545454;\n}\n.ui.inverted.secondary.basic.buttons .button:active,\n.ui.inverted.secondary.buttons .basic.button:active,\n.ui.inverted.secondary.basic.button:active {\n  box-shadow: 0 0 0 2px #6e6e6e inset;\n  color: #545454;\n}\n\n/* Tertiary */\n.ui.tertiary.secondary.buttons .button,\n.ui.tertiary.secondary.buttons .tertiary.button,\n.ui.tertiary.secondary.button {\n  background: transparent;\n  box-shadow: none;\n  color: #1b1c1d;\n}\n.ui.tertiary.secondary.buttons .button:hover,\n.ui.tertiary.secondary.buttons button:hover,\n.ui.tertiary.secondary.button:hover {\n  box-shadow: inset 0 -0.2em 0 #292929;\n  color: #292929;\n}\n.ui.tertiary.secondary.buttons .button:focus,\n.ui.tertiary.secondary.buttons .tertiary.button:focus,\n.ui.tertiary.secondary.button:focus {\n  box-shadow: inset 0 -0.2em 0 #303030;\n  color: #303030;\n}\n.ui.tertiary.secondary.buttons .active.button,\n.ui.tertiary.secondary.buttons .tertiary.active.button,\n.ui.tertiary.secondary.active.button,\n.ui.tertiary.secondary.buttons .button:active,\n.ui.tertiary.secondary.buttons .tertiary.button:active,\n.ui.tertiary.secondary.button:active {\n  box-shadow: inset 0 -0.2em 0 #1f2933;\n  color: #27292a;\n}\n.ui.red.buttons .button,\n.ui.red.button {\n  background-color: #db2828;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.red.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.red.buttons .button:hover,\n.ui.red.button:hover {\n  background-color: #d01919;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.red.buttons .button:focus,\n.ui.red.button:focus {\n  background-color: #ca1010;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.red.buttons .button:active,\n.ui.red.button:active {\n  background-color: #b21e1e;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.red.buttons .active.button,\n.ui.red.buttons .active.button:active,\n.ui.red.active.button,\n.ui.red.button .active.button:active {\n  background-color: #d41515;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.red.buttons .button,\n.ui.basic.red.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #db2828 inset;\n  color: #db2828;\n}\n.ui.basic.red.buttons .button:hover,\n.ui.basic.red.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #d01919 inset;\n  color: #d01919;\n}\n.ui.basic.red.buttons .button:focus,\n.ui.basic.red.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #ca1010 inset;\n  color: #d01919;\n}\n.ui.basic.red.buttons .active.button,\n.ui.basic.red.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #d41515 inset;\n  color: #b21e1e;\n}\n.ui.basic.red.buttons .button:active,\n.ui.basic.red.button:active {\n  box-shadow: 0 0 0 1px #b21e1e inset;\n  color: #b21e1e;\n}\n\n/* Inverted */\n.ui.inverted.red.buttons .button,\n.ui.inverted.red.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #ff695e inset;\n  color: #ff695e;\n}\n.ui.inverted.red.buttons .button:hover,\n.ui.inverted.red.button:hover,\n.ui.inverted.red.buttons .button:focus,\n.ui.inverted.red.button:focus,\n.ui.inverted.red.buttons .button.active,\n.ui.inverted.red.button.active,\n.ui.inverted.red.buttons .button:active,\n.ui.inverted.red.button:active {\n  box-shadow: none;\n  color: #fff;\n}\n.ui.inverted.red.buttons .button:hover,\n.ui.inverted.red.button:hover {\n  background-color: #ff392b;\n}\n.ui.inverted.red.buttons .button:focus,\n.ui.inverted.red.button:focus {\n  background-color: #ff4335;\n}\n.ui.inverted.red.buttons .active.button,\n.ui.inverted.red.active.button {\n  background-color: #ff5144;\n}\n.ui.inverted.red.buttons .button:active,\n.ui.inverted.red.button:active {\n  background-color: #ff392b;\n}\n\n/* Inverted Basic */\n.ui.inverted.red.basic.buttons .button,\n.ui.inverted.red.buttons .basic.button,\n.ui.inverted.red.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.red.basic.buttons .button:hover,\n.ui.inverted.red.buttons .basic.button:hover,\n.ui.inverted.red.basic.button:hover {\n  box-shadow: 0 0 0 2px #ff392b inset;\n  color: #ff695e;\n}\n.ui.inverted.red.basic.buttons .button:focus,\n.ui.inverted.red.basic.buttons .button:focus,\n.ui.inverted.red.basic.button:focus {\n  box-shadow: 0 0 0 2px #ff4335 inset;\n  color: #ff695e;\n}\n.ui.inverted.red.basic.buttons .active.button,\n.ui.inverted.red.buttons .basic.active.button,\n.ui.inverted.red.basic.active.button {\n  box-shadow: 0 0 0 2px #ff5144 inset;\n  color: #ff695e;\n}\n.ui.inverted.red.basic.buttons .button:active,\n.ui.inverted.red.buttons .basic.button:active,\n.ui.inverted.red.basic.button:active {\n  box-shadow: 0 0 0 2px #ff392b inset;\n  color: #ff695e;\n}\n\n/* Tertiary */\n.ui.tertiary.red.buttons .button,\n.ui.tertiary.red.buttons .tertiary.button,\n.ui.tertiary.red.button {\n  background: transparent;\n  box-shadow: none;\n  color: #db2828;\n}\n.ui.tertiary.red.buttons .button:hover,\n.ui.tertiary.red.buttons button:hover,\n.ui.tertiary.red.button:hover {\n  box-shadow: inset 0 -0.2em 0 #b93131;\n  color: #b93131;\n}\n.ui.tertiary.red.buttons .button:focus,\n.ui.tertiary.red.buttons .tertiary.button:focus,\n.ui.tertiary.red.button:focus {\n  box-shadow: inset 0 -0.2em 0 #b52626;\n  color: #b52626;\n}\n.ui.tertiary.red.buttons .active.button,\n.ui.tertiary.red.buttons .tertiary.active.button,\n.ui.tertiary.red.active.button,\n.ui.tertiary.red.buttons .button:active,\n.ui.tertiary.red.buttons .tertiary.button:active,\n.ui.tertiary.red.button:active {\n  box-shadow: inset 0 -0.2em 0 #ea0000;\n  color: #d41515;\n}\n.ui.orange.buttons .button,\n.ui.orange.button {\n  background-color: #f2711c;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.orange.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.orange.buttons .button:hover,\n.ui.orange.button:hover {\n  background-color: #f26202;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.orange.buttons .button:focus,\n.ui.orange.button:focus {\n  background-color: #e55b00;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.orange.buttons .button:active,\n.ui.orange.button:active {\n  background-color: #cf590c;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.orange.buttons .active.button,\n.ui.orange.buttons .active.button:active,\n.ui.orange.active.button,\n.ui.orange.button .active.button:active {\n  background-color: #f56100;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.orange.buttons .button,\n.ui.basic.orange.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #f2711c inset;\n  color: #f2711c;\n}\n.ui.basic.orange.buttons .button:hover,\n.ui.basic.orange.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #f26202 inset;\n  color: #f26202;\n}\n.ui.basic.orange.buttons .button:focus,\n.ui.basic.orange.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #e55b00 inset;\n  color: #f26202;\n}\n.ui.basic.orange.buttons .active.button,\n.ui.basic.orange.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #f56100 inset;\n  color: #cf590c;\n}\n.ui.basic.orange.buttons .button:active,\n.ui.basic.orange.button:active {\n  box-shadow: 0 0 0 1px #cf590c inset;\n  color: #cf590c;\n}\n\n/* Inverted */\n.ui.inverted.orange.buttons .button,\n.ui.inverted.orange.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #ff851b inset;\n  color: #ff851b;\n}\n.ui.inverted.orange.buttons .button:hover,\n.ui.inverted.orange.button:hover,\n.ui.inverted.orange.buttons .button:focus,\n.ui.inverted.orange.button:focus,\n.ui.inverted.orange.buttons .button.active,\n.ui.inverted.orange.button.active,\n.ui.inverted.orange.buttons .button:active,\n.ui.inverted.orange.button:active {\n  box-shadow: none;\n  color: #fff;\n}\n.ui.inverted.orange.buttons .button:hover,\n.ui.inverted.orange.button:hover {\n  background-color: #e76b00;\n}\n.ui.inverted.orange.buttons .button:focus,\n.ui.inverted.orange.button:focus {\n  background-color: #f17000;\n}\n.ui.inverted.orange.buttons .active.button,\n.ui.inverted.orange.active.button {\n  background-color: #ff7701;\n}\n.ui.inverted.orange.buttons .button:active,\n.ui.inverted.orange.button:active {\n  background-color: #e76b00;\n}\n\n/* Inverted Basic */\n.ui.inverted.orange.basic.buttons .button,\n.ui.inverted.orange.buttons .basic.button,\n.ui.inverted.orange.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.orange.basic.buttons .button:hover,\n.ui.inverted.orange.buttons .basic.button:hover,\n.ui.inverted.orange.basic.button:hover {\n  box-shadow: 0 0 0 2px #e76b00 inset;\n  color: #ff851b;\n}\n.ui.inverted.orange.basic.buttons .button:focus,\n.ui.inverted.orange.basic.buttons .button:focus,\n.ui.inverted.orange.basic.button:focus {\n  box-shadow: 0 0 0 2px #f17000 inset;\n  color: #ff851b;\n}\n.ui.inverted.orange.basic.buttons .active.button,\n.ui.inverted.orange.buttons .basic.active.button,\n.ui.inverted.orange.basic.active.button {\n  box-shadow: 0 0 0 2px #ff7701 inset;\n  color: #ff851b;\n}\n.ui.inverted.orange.basic.buttons .button:active,\n.ui.inverted.orange.buttons .basic.button:active,\n.ui.inverted.orange.basic.button:active {\n  box-shadow: 0 0 0 2px #e76b00 inset;\n  color: #ff851b;\n}\n\n/* Tertiary */\n.ui.tertiary.orange.buttons .button,\n.ui.tertiary.orange.buttons .tertiary.button,\n.ui.tertiary.orange.button {\n  background: transparent;\n  box-shadow: none;\n  color: #f2711c;\n}\n.ui.tertiary.orange.buttons .button:hover,\n.ui.tertiary.orange.buttons button:hover,\n.ui.tertiary.orange.button:hover {\n  box-shadow: inset 0 -0.2em 0 #da671b;\n  color: #da671b;\n}\n.ui.tertiary.orange.buttons .button:focus,\n.ui.tertiary.orange.buttons .tertiary.button:focus,\n.ui.tertiary.orange.button:focus {\n  box-shadow: inset 0 -0.2em 0 #ce6017;\n  color: #ce6017;\n}\n.ui.tertiary.orange.buttons .active.button,\n.ui.tertiary.orange.buttons .tertiary.active.button,\n.ui.tertiary.orange.active.button,\n.ui.tertiary.orange.buttons .button:active,\n.ui.tertiary.orange.buttons .tertiary.button:active,\n.ui.tertiary.orange.button:active {\n  box-shadow: inset 0 -0.2em 0 #f56100;\n  color: #f56100;\n}\n.ui.yellow.buttons .button,\n.ui.yellow.button {\n  background-color: #fbbd08;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.yellow.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.yellow.buttons .button:hover,\n.ui.yellow.button:hover {\n  background-color: #eaae00;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.yellow.buttons .button:focus,\n.ui.yellow.button:focus {\n  background-color: #daa300;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.yellow.buttons .button:active,\n.ui.yellow.button:active {\n  background-color: #cd9903;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.yellow.buttons .active.button,\n.ui.yellow.buttons .active.button:active,\n.ui.yellow.active.button,\n.ui.yellow.button .active.button:active {\n  background-color: #eaae00;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.yellow.buttons .button,\n.ui.basic.yellow.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #fbbd08 inset;\n  color: #fbbd08;\n}\n.ui.basic.yellow.buttons .button:hover,\n.ui.basic.yellow.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #eaae00 inset;\n  color: #eaae00;\n}\n.ui.basic.yellow.buttons .button:focus,\n.ui.basic.yellow.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #daa300 inset;\n  color: #eaae00;\n}\n.ui.basic.yellow.buttons .active.button,\n.ui.basic.yellow.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #eaae00 inset;\n  color: #cd9903;\n}\n.ui.basic.yellow.buttons .button:active,\n.ui.basic.yellow.button:active {\n  box-shadow: 0 0 0 1px #cd9903 inset;\n  color: #cd9903;\n}\n\n/* Inverted */\n.ui.inverted.yellow.buttons .button,\n.ui.inverted.yellow.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #ffe21f inset;\n  color: #ffe21f;\n}\n.ui.inverted.yellow.buttons .button:hover,\n.ui.inverted.yellow.button:hover,\n.ui.inverted.yellow.buttons .button:focus,\n.ui.inverted.yellow.button:focus,\n.ui.inverted.yellow.buttons .button.active,\n.ui.inverted.yellow.button.active,\n.ui.inverted.yellow.buttons .button:active,\n.ui.inverted.yellow.button:active {\n  box-shadow: none;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.inverted.yellow.buttons .button:hover,\n.ui.inverted.yellow.button:hover {\n  background-color: #ebcd00;\n}\n.ui.inverted.yellow.buttons .button:focus,\n.ui.inverted.yellow.button:focus {\n  background-color: #f5d500;\n}\n.ui.inverted.yellow.buttons .active.button,\n.ui.inverted.yellow.active.button {\n  background-color: #ffdf05;\n}\n.ui.inverted.yellow.buttons .button:active,\n.ui.inverted.yellow.button:active {\n  background-color: #ebcd00;\n}\n\n/* Inverted Basic */\n.ui.inverted.yellow.basic.buttons .button,\n.ui.inverted.yellow.buttons .basic.button,\n.ui.inverted.yellow.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.yellow.basic.buttons .button:hover,\n.ui.inverted.yellow.buttons .basic.button:hover,\n.ui.inverted.yellow.basic.button:hover {\n  box-shadow: 0 0 0 2px #ebcd00 inset;\n  color: #ffe21f;\n}\n.ui.inverted.yellow.basic.buttons .button:focus,\n.ui.inverted.yellow.basic.buttons .button:focus,\n.ui.inverted.yellow.basic.button:focus {\n  box-shadow: 0 0 0 2px #f5d500 inset;\n  color: #ffe21f;\n}\n.ui.inverted.yellow.basic.buttons .active.button,\n.ui.inverted.yellow.buttons .basic.active.button,\n.ui.inverted.yellow.basic.active.button {\n  box-shadow: 0 0 0 2px #ffdf05 inset;\n  color: #ffe21f;\n}\n.ui.inverted.yellow.basic.buttons .button:active,\n.ui.inverted.yellow.buttons .basic.button:active,\n.ui.inverted.yellow.basic.button:active {\n  box-shadow: 0 0 0 2px #ebcd00 inset;\n  color: #ffe21f;\n}\n\n/* Tertiary */\n.ui.tertiary.yellow.buttons .button,\n.ui.tertiary.yellow.buttons .tertiary.button,\n.ui.tertiary.yellow.button {\n  background: transparent;\n  box-shadow: none;\n  color: #fbbd08;\n}\n.ui.tertiary.yellow.buttons .button:hover,\n.ui.tertiary.yellow.buttons button:hover,\n.ui.tertiary.yellow.button:hover {\n  box-shadow: inset 0 -0.2em 0 #d2a217;\n  color: #d2a217;\n}\n.ui.tertiary.yellow.buttons .button:focus,\n.ui.tertiary.yellow.buttons .tertiary.button:focus,\n.ui.tertiary.yellow.button:focus {\n  box-shadow: inset 0 -0.2em 0 #c49816;\n  color: #c49816;\n}\n.ui.tertiary.yellow.buttons .active.button,\n.ui.tertiary.yellow.buttons .tertiary.active.button,\n.ui.tertiary.yellow.active.button,\n.ui.tertiary.yellow.buttons .button:active,\n.ui.tertiary.yellow.buttons .tertiary.button:active,\n.ui.tertiary.yellow.button:active {\n  box-shadow: inset 0 -0.2em 0 #eaae00;\n  color: #eaae00;\n}\n.ui.olive.buttons .button,\n.ui.olive.button {\n  background-color: #b5cc18;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.olive.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.olive.buttons .button:hover,\n.ui.olive.button:hover {\n  background-color: #a7bd0d;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.olive.buttons .button:focus,\n.ui.olive.button:focus {\n  background-color: #a0b605;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.olive.buttons .button:active,\n.ui.olive.button:active {\n  background-color: #8d9e13;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.olive.buttons .active.button,\n.ui.olive.buttons .active.button:active,\n.ui.olive.active.button,\n.ui.olive.button .active.button:active {\n  background-color: #aac109;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.olive.buttons .button,\n.ui.basic.olive.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #b5cc18 inset;\n  color: #b5cc18;\n}\n.ui.basic.olive.buttons .button:hover,\n.ui.basic.olive.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #a7bd0d inset;\n  color: #a7bd0d;\n}\n.ui.basic.olive.buttons .button:focus,\n.ui.basic.olive.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #a0b605 inset;\n  color: #a7bd0d;\n}\n.ui.basic.olive.buttons .active.button,\n.ui.basic.olive.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #aac109 inset;\n  color: #8d9e13;\n}\n.ui.basic.olive.buttons .button:active,\n.ui.basic.olive.button:active {\n  box-shadow: 0 0 0 1px #8d9e13 inset;\n  color: #8d9e13;\n}\n\n/* Inverted */\n.ui.inverted.olive.buttons .button,\n.ui.inverted.olive.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #d9e778 inset;\n  color: #d9e778;\n}\n.ui.inverted.olive.buttons .button:hover,\n.ui.inverted.olive.button:hover,\n.ui.inverted.olive.buttons .button:focus,\n.ui.inverted.olive.button:focus,\n.ui.inverted.olive.buttons .button.active,\n.ui.inverted.olive.button.active,\n.ui.inverted.olive.buttons .button:active,\n.ui.inverted.olive.button:active {\n  box-shadow: none;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.inverted.olive.buttons .button:hover,\n.ui.inverted.olive.button:hover {\n  background-color: #d2e745;\n}\n.ui.inverted.olive.buttons .button:focus,\n.ui.inverted.olive.button:focus {\n  background-color: #daef47;\n}\n.ui.inverted.olive.buttons .active.button,\n.ui.inverted.olive.active.button {\n  background-color: #daed59;\n}\n.ui.inverted.olive.buttons .button:active,\n.ui.inverted.olive.button:active {\n  background-color: #cddf4d;\n}\n\n/* Inverted Basic */\n.ui.inverted.olive.basic.buttons .button,\n.ui.inverted.olive.buttons .basic.button,\n.ui.inverted.olive.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.olive.basic.buttons .button:hover,\n.ui.inverted.olive.buttons .basic.button:hover,\n.ui.inverted.olive.basic.button:hover {\n  box-shadow: 0 0 0 2px #d2e745 inset;\n  color: #d9e778;\n}\n.ui.inverted.olive.basic.buttons .button:focus,\n.ui.inverted.olive.basic.buttons .button:focus,\n.ui.inverted.olive.basic.button:focus {\n  box-shadow: 0 0 0 2px #daef47 inset;\n  color: #d9e778;\n}\n.ui.inverted.olive.basic.buttons .active.button,\n.ui.inverted.olive.buttons .basic.active.button,\n.ui.inverted.olive.basic.active.button {\n  box-shadow: 0 0 0 2px #daed59 inset;\n  color: #d9e778;\n}\n.ui.inverted.olive.basic.buttons .button:active,\n.ui.inverted.olive.buttons .basic.button:active,\n.ui.inverted.olive.basic.button:active {\n  box-shadow: 0 0 0 2px #cddf4d inset;\n  color: #d9e778;\n}\n\n/* Tertiary */\n.ui.tertiary.olive.buttons .button,\n.ui.tertiary.olive.buttons .tertiary.button,\n.ui.tertiary.olive.button {\n  background: transparent;\n  box-shadow: none;\n  color: #b5cc18;\n}\n.ui.tertiary.olive.buttons .button:hover,\n.ui.tertiary.olive.buttons button:hover,\n.ui.tertiary.olive.button:hover {\n  box-shadow: inset 0 -0.2em 0 #98a922;\n  color: #98a922;\n}\n.ui.tertiary.olive.buttons .button:focus,\n.ui.tertiary.olive.buttons .tertiary.button:focus,\n.ui.tertiary.olive.button:focus {\n  box-shadow: inset 0 -0.2em 0 #92a418;\n  color: #92a418;\n}\n.ui.tertiary.olive.buttons .active.button,\n.ui.tertiary.olive.buttons .tertiary.active.button,\n.ui.tertiary.olive.active.button,\n.ui.tertiary.olive.buttons .button:active,\n.ui.tertiary.olive.buttons .tertiary.button:active,\n.ui.tertiary.olive.button:active {\n  box-shadow: inset 0 -0.2em 0 #b1cb00;\n  color: #aac109;\n}\n.ui.green.buttons .button,\n.ui.green.button {\n  background-color: #21ba45;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.green.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.green.buttons .button:hover,\n.ui.green.button:hover {\n  background-color: #16ab39;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.green.buttons .button:focus,\n.ui.green.button:focus {\n  background-color: #0ea432;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.green.buttons .button:active,\n.ui.green.button:active {\n  background-color: #198f35;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.green.buttons .active.button,\n.ui.green.buttons .active.button:active,\n.ui.green.active.button,\n.ui.green.button .active.button:active {\n  background-color: #13ae38;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.green.buttons .button,\n.ui.basic.green.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #21ba45 inset;\n  color: #21ba45;\n}\n.ui.basic.green.buttons .button:hover,\n.ui.basic.green.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #16ab39 inset;\n  color: #16ab39;\n}\n.ui.basic.green.buttons .button:focus,\n.ui.basic.green.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #0ea432 inset;\n  color: #16ab39;\n}\n.ui.basic.green.buttons .active.button,\n.ui.basic.green.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #13ae38 inset;\n  color: #198f35;\n}\n.ui.basic.green.buttons .button:active,\n.ui.basic.green.button:active {\n  box-shadow: 0 0 0 1px #198f35 inset;\n  color: #198f35;\n}\n\n/* Inverted */\n.ui.inverted.green.buttons .button,\n.ui.inverted.green.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #2ecc40 inset;\n  color: #2ecc40;\n}\n.ui.inverted.green.buttons .button:hover,\n.ui.inverted.green.button:hover,\n.ui.inverted.green.buttons .button:focus,\n.ui.inverted.green.button:focus,\n.ui.inverted.green.buttons .button.active,\n.ui.inverted.green.button.active,\n.ui.inverted.green.buttons .button:active,\n.ui.inverted.green.button:active {\n  box-shadow: none;\n  color: #fff;\n}\n.ui.inverted.green.buttons .button:hover,\n.ui.inverted.green.button:hover {\n  background-color: #1ea92e;\n}\n.ui.inverted.green.buttons .button:focus,\n.ui.inverted.green.button:focus {\n  background-color: #19b82b;\n}\n.ui.inverted.green.buttons .active.button,\n.ui.inverted.green.active.button {\n  background-color: #1fc231;\n}\n.ui.inverted.green.buttons .button:active,\n.ui.inverted.green.button:active {\n  background-color: #25a233;\n}\n\n/* Inverted Basic */\n.ui.inverted.green.basic.buttons .button,\n.ui.inverted.green.buttons .basic.button,\n.ui.inverted.green.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.green.basic.buttons .button:hover,\n.ui.inverted.green.buttons .basic.button:hover,\n.ui.inverted.green.basic.button:hover {\n  box-shadow: 0 0 0 2px #1ea92e inset;\n  color: #2ecc40;\n}\n.ui.inverted.green.basic.buttons .button:focus,\n.ui.inverted.green.basic.buttons .button:focus,\n.ui.inverted.green.basic.button:focus {\n  box-shadow: 0 0 0 2px #19b82b inset;\n  color: #2ecc40;\n}\n.ui.inverted.green.basic.buttons .active.button,\n.ui.inverted.green.buttons .basic.active.button,\n.ui.inverted.green.basic.active.button {\n  box-shadow: 0 0 0 2px #1fc231 inset;\n  color: #2ecc40;\n}\n.ui.inverted.green.basic.buttons .button:active,\n.ui.inverted.green.buttons .basic.button:active,\n.ui.inverted.green.basic.button:active {\n  box-shadow: 0 0 0 2px #25a233 inset;\n  color: #2ecc40;\n}\n\n/* Tertiary */\n.ui.tertiary.green.buttons .button,\n.ui.tertiary.green.buttons .tertiary.button,\n.ui.tertiary.green.button {\n  background: transparent;\n  box-shadow: none;\n  color: #21ba45;\n}\n.ui.tertiary.green.buttons .button:hover,\n.ui.tertiary.green.buttons button:hover,\n.ui.tertiary.green.button:hover {\n  box-shadow: inset 0 -0.2em 0 #2a9844;\n  color: #2a9844;\n}\n.ui.tertiary.green.buttons .button:focus,\n.ui.tertiary.green.buttons .tertiary.button:focus,\n.ui.tertiary.green.button:focus {\n  box-shadow: inset 0 -0.2em 0 #20923b;\n  color: #20923b;\n}\n.ui.tertiary.green.buttons .active.button,\n.ui.tertiary.green.buttons .tertiary.active.button,\n.ui.tertiary.green.active.button,\n.ui.tertiary.green.buttons .button:active,\n.ui.tertiary.green.buttons .tertiary.button:active,\n.ui.tertiary.green.button:active {\n  box-shadow: inset 0 -0.2em 0 #00c22e;\n  color: #13ae38;\n}\n.ui.teal.buttons .button,\n.ui.teal.button {\n  background-color: #00b5ad;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.teal.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.teal.buttons .button:hover,\n.ui.teal.button:hover {\n  background-color: #009c95;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.teal.buttons .button:focus,\n.ui.teal.button:focus {\n  background-color: #008c86;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.teal.buttons .button:active,\n.ui.teal.button:active {\n  background-color: #00827c;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.teal.buttons .active.button,\n.ui.teal.buttons .active.button:active,\n.ui.teal.active.button,\n.ui.teal.button .active.button:active {\n  background-color: #009c95;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.teal.buttons .button,\n.ui.basic.teal.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #00b5ad inset;\n  color: #00b5ad;\n}\n.ui.basic.teal.buttons .button:hover,\n.ui.basic.teal.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #009c95 inset;\n  color: #009c95;\n}\n.ui.basic.teal.buttons .button:focus,\n.ui.basic.teal.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #008c86 inset;\n  color: #009c95;\n}\n.ui.basic.teal.buttons .active.button,\n.ui.basic.teal.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #009c95 inset;\n  color: #00827c;\n}\n.ui.basic.teal.buttons .button:active,\n.ui.basic.teal.button:active {\n  box-shadow: 0 0 0 1px #00827c inset;\n  color: #00827c;\n}\n\n/* Inverted */\n.ui.inverted.teal.buttons .button,\n.ui.inverted.teal.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #6dffff inset;\n  color: #6dffff;\n}\n.ui.inverted.teal.buttons .button:hover,\n.ui.inverted.teal.button:hover,\n.ui.inverted.teal.buttons .button:focus,\n.ui.inverted.teal.button:focus,\n.ui.inverted.teal.buttons .button.active,\n.ui.inverted.teal.button.active,\n.ui.inverted.teal.buttons .button:active,\n.ui.inverted.teal.button:active {\n  box-shadow: none;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.inverted.teal.buttons .button:hover,\n.ui.inverted.teal.button:hover {\n  background-color: #3affff;\n}\n.ui.inverted.teal.buttons .button:focus,\n.ui.inverted.teal.button:focus {\n  background-color: #44ffff;\n}\n.ui.inverted.teal.buttons .active.button,\n.ui.inverted.teal.active.button {\n  background-color: #54ffff;\n}\n.ui.inverted.teal.buttons .button:active,\n.ui.inverted.teal.button:active {\n  background-color: #3affff;\n}\n\n/* Inverted Basic */\n.ui.inverted.teal.basic.buttons .button,\n.ui.inverted.teal.buttons .basic.button,\n.ui.inverted.teal.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.teal.basic.buttons .button:hover,\n.ui.inverted.teal.buttons .basic.button:hover,\n.ui.inverted.teal.basic.button:hover {\n  box-shadow: 0 0 0 2px #3affff inset;\n  color: #6dffff;\n}\n.ui.inverted.teal.basic.buttons .button:focus,\n.ui.inverted.teal.basic.buttons .button:focus,\n.ui.inverted.teal.basic.button:focus {\n  box-shadow: 0 0 0 2px #44ffff inset;\n  color: #6dffff;\n}\n.ui.inverted.teal.basic.buttons .active.button,\n.ui.inverted.teal.buttons .basic.active.button,\n.ui.inverted.teal.basic.active.button {\n  box-shadow: 0 0 0 2px #54ffff inset;\n  color: #6dffff;\n}\n.ui.inverted.teal.basic.buttons .button:active,\n.ui.inverted.teal.buttons .basic.button:active,\n.ui.inverted.teal.basic.button:active {\n  box-shadow: 0 0 0 2px #3affff inset;\n  color: #6dffff;\n}\n\n/* Tertiary */\n.ui.tertiary.teal.buttons .button,\n.ui.tertiary.teal.buttons .tertiary.button,\n.ui.tertiary.teal.button {\n  background: transparent;\n  box-shadow: none;\n  color: #00b5ad;\n}\n.ui.tertiary.teal.buttons .button:hover,\n.ui.tertiary.teal.buttons button:hover,\n.ui.tertiary.teal.button:hover {\n  box-shadow: inset 0 -0.2em 0 #108c86;\n  color: #108c86;\n}\n.ui.tertiary.teal.buttons .button:focus,\n.ui.tertiary.teal.buttons .tertiary.button:focus,\n.ui.tertiary.teal.button:focus {\n  box-shadow: inset 0 -0.2em 0 #0e7e79;\n  color: #0e7e79;\n}\n.ui.tertiary.teal.buttons .active.button,\n.ui.tertiary.teal.buttons .tertiary.active.button,\n.ui.tertiary.teal.active.button,\n.ui.tertiary.teal.buttons .button:active,\n.ui.tertiary.teal.buttons .tertiary.button:active,\n.ui.tertiary.teal.button:active {\n  box-shadow: inset 0 -0.2em 0 #009c95;\n  color: #009c95;\n}\n.ui.blue.buttons .button,\n.ui.blue.button {\n  background-color: #2185d0;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.blue.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.blue.buttons .button:hover,\n.ui.blue.button:hover {\n  background-color: #1678c2;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.blue.buttons .button:focus,\n.ui.blue.button:focus {\n  background-color: #0d71bb;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.blue.buttons .button:active,\n.ui.blue.button:active {\n  background-color: #1a69a4;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.blue.buttons .active.button,\n.ui.blue.buttons .active.button:active,\n.ui.blue.active.button,\n.ui.blue.button .active.button:active {\n  background-color: #1279c6;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.blue.buttons .button,\n.ui.basic.blue.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #2185d0 inset;\n  color: #2185d0;\n}\n.ui.basic.blue.buttons .button:hover,\n.ui.basic.blue.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #1678c2 inset;\n  color: #1678c2;\n}\n.ui.basic.blue.buttons .button:focus,\n.ui.basic.blue.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #0d71bb inset;\n  color: #1678c2;\n}\n.ui.basic.blue.buttons .active.button,\n.ui.basic.blue.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #1279c6 inset;\n  color: #1a69a4;\n}\n.ui.basic.blue.buttons .button:active,\n.ui.basic.blue.button:active {\n  box-shadow: 0 0 0 1px #1a69a4 inset;\n  color: #1a69a4;\n}\n\n/* Inverted */\n.ui.inverted.blue.buttons .button,\n.ui.inverted.blue.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #54c8ff inset;\n  color: #54c8ff;\n}\n.ui.inverted.blue.buttons .button:hover,\n.ui.inverted.blue.button:hover,\n.ui.inverted.blue.buttons .button:focus,\n.ui.inverted.blue.button:focus,\n.ui.inverted.blue.buttons .button.active,\n.ui.inverted.blue.button.active,\n.ui.inverted.blue.buttons .button:active,\n.ui.inverted.blue.button:active {\n  box-shadow: none;\n  color: #fff;\n}\n.ui.inverted.blue.buttons .button:hover,\n.ui.inverted.blue.button:hover {\n  background-color: #21b8ff;\n}\n.ui.inverted.blue.buttons .button:focus,\n.ui.inverted.blue.button:focus {\n  background-color: #2bbbff;\n}\n.ui.inverted.blue.buttons .active.button,\n.ui.inverted.blue.active.button {\n  background-color: #3ac0ff;\n}\n.ui.inverted.blue.buttons .button:active,\n.ui.inverted.blue.button:active {\n  background-color: #21b8ff;\n}\n\n/* Inverted Basic */\n.ui.inverted.blue.basic.buttons .button,\n.ui.inverted.blue.buttons .basic.button,\n.ui.inverted.blue.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.blue.basic.buttons .button:hover,\n.ui.inverted.blue.buttons .basic.button:hover,\n.ui.inverted.blue.basic.button:hover {\n  box-shadow: 0 0 0 2px #21b8ff inset;\n  color: #54c8ff;\n}\n.ui.inverted.blue.basic.buttons .button:focus,\n.ui.inverted.blue.basic.buttons .button:focus,\n.ui.inverted.blue.basic.button:focus {\n  box-shadow: 0 0 0 2px #2bbbff inset;\n  color: #54c8ff;\n}\n.ui.inverted.blue.basic.buttons .active.button,\n.ui.inverted.blue.buttons .basic.active.button,\n.ui.inverted.blue.basic.active.button {\n  box-shadow: 0 0 0 2px #3ac0ff inset;\n  color: #54c8ff;\n}\n.ui.inverted.blue.basic.buttons .button:active,\n.ui.inverted.blue.buttons .basic.button:active,\n.ui.inverted.blue.basic.button:active {\n  box-shadow: 0 0 0 2px #21b8ff inset;\n  color: #54c8ff;\n}\n\n/* Tertiary */\n.ui.tertiary.blue.buttons .button,\n.ui.tertiary.blue.buttons .tertiary.button,\n.ui.tertiary.blue.button {\n  background: transparent;\n  box-shadow: none;\n  color: #2185d0;\n}\n.ui.tertiary.blue.buttons .button:hover,\n.ui.tertiary.blue.buttons button:hover,\n.ui.tertiary.blue.button:hover {\n  box-shadow: inset 0 -0.2em 0 #2b75ac;\n  color: #2b75ac;\n}\n.ui.tertiary.blue.buttons .button:focus,\n.ui.tertiary.blue.buttons .tertiary.button:focus,\n.ui.tertiary.blue.button:focus {\n  box-shadow: inset 0 -0.2em 0 #216ea7;\n  color: #216ea7;\n}\n.ui.tertiary.blue.buttons .active.button,\n.ui.tertiary.blue.buttons .tertiary.active.button,\n.ui.tertiary.blue.active.button,\n.ui.tertiary.blue.buttons .button:active,\n.ui.tertiary.blue.buttons .tertiary.button:active,\n.ui.tertiary.blue.button:active {\n  box-shadow: inset 0 -0.2em 0 #007bd8;\n  color: #1279c6;\n}\n.ui.violet.buttons .button,\n.ui.violet.button {\n  background-color: #6435c9;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.violet.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.violet.buttons .button:hover,\n.ui.violet.button:hover {\n  background-color: #5829bb;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.violet.buttons .button:focus,\n.ui.violet.button:focus {\n  background-color: #4f20b5;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.violet.buttons .button:active,\n.ui.violet.button:active {\n  background-color: #502aa1;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.violet.buttons .active.button,\n.ui.violet.buttons .active.button:active,\n.ui.violet.active.button,\n.ui.violet.button .active.button:active {\n  background-color: #5626bf;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.violet.buttons .button,\n.ui.basic.violet.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #6435c9 inset;\n  color: #6435c9;\n}\n.ui.basic.violet.buttons .button:hover,\n.ui.basic.violet.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #5829bb inset;\n  color: #5829bb;\n}\n.ui.basic.violet.buttons .button:focus,\n.ui.basic.violet.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #4f20b5 inset;\n  color: #5829bb;\n}\n.ui.basic.violet.buttons .active.button,\n.ui.basic.violet.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #5626bf inset;\n  color: #502aa1;\n}\n.ui.basic.violet.buttons .button:active,\n.ui.basic.violet.button:active {\n  box-shadow: 0 0 0 1px #502aa1 inset;\n  color: #502aa1;\n}\n\n/* Inverted */\n.ui.inverted.violet.buttons .button,\n.ui.inverted.violet.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #a291fb inset;\n  color: #a291fb;\n}\n.ui.inverted.violet.buttons .button:hover,\n.ui.inverted.violet.button:hover,\n.ui.inverted.violet.buttons .button:focus,\n.ui.inverted.violet.button:focus,\n.ui.inverted.violet.buttons .button.active,\n.ui.inverted.violet.button.active,\n.ui.inverted.violet.buttons .button:active,\n.ui.inverted.violet.button:active {\n  box-shadow: none;\n  color: #fff;\n}\n.ui.inverted.violet.buttons .button:hover,\n.ui.inverted.violet.button:hover {\n  background-color: #745aff;\n}\n.ui.inverted.violet.buttons .button:focus,\n.ui.inverted.violet.button:focus {\n  background-color: #7d64ff;\n}\n.ui.inverted.violet.buttons .active.button,\n.ui.inverted.violet.active.button {\n  background-color: #8a73ff;\n}\n.ui.inverted.violet.buttons .button:active,\n.ui.inverted.violet.button:active {\n  background-color: #7860f9;\n}\n\n/* Inverted Basic */\n.ui.inverted.violet.basic.buttons .button,\n.ui.inverted.violet.buttons .basic.button,\n.ui.inverted.violet.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.violet.basic.buttons .button:hover,\n.ui.inverted.violet.buttons .basic.button:hover,\n.ui.inverted.violet.basic.button:hover {\n  box-shadow: 0 0 0 2px #745aff inset;\n  color: #a291fb;\n}\n.ui.inverted.violet.basic.buttons .button:focus,\n.ui.inverted.violet.basic.buttons .button:focus,\n.ui.inverted.violet.basic.button:focus {\n  box-shadow: 0 0 0 2px #7d64ff inset;\n  color: #a291fb;\n}\n.ui.inverted.violet.basic.buttons .active.button,\n.ui.inverted.violet.buttons .basic.active.button,\n.ui.inverted.violet.basic.active.button {\n  box-shadow: 0 0 0 2px #8a73ff inset;\n  color: #a291fb;\n}\n.ui.inverted.violet.basic.buttons .button:active,\n.ui.inverted.violet.buttons .basic.button:active,\n.ui.inverted.violet.basic.button:active {\n  box-shadow: 0 0 0 2px #7860f9 inset;\n  color: #a291fb;\n}\n\n/* Tertiary */\n.ui.tertiary.violet.buttons .button,\n.ui.tertiary.violet.buttons .tertiary.button,\n.ui.tertiary.violet.button {\n  background: transparent;\n  box-shadow: none;\n  color: #6435c9;\n}\n.ui.tertiary.violet.buttons .button:hover,\n.ui.tertiary.violet.buttons button:hover,\n.ui.tertiary.violet.button:hover {\n  box-shadow: inset 0 -0.2em 0 #6040a5;\n  color: #6040a5;\n}\n.ui.tertiary.violet.buttons .button:focus,\n.ui.tertiary.violet.buttons .tertiary.button:focus,\n.ui.tertiary.violet.button:focus {\n  box-shadow: inset 0 -0.2em 0 #5735a0;\n  color: #5735a0;\n}\n.ui.tertiary.violet.buttons .active.button,\n.ui.tertiary.violet.buttons .tertiary.active.button,\n.ui.tertiary.violet.active.button,\n.ui.tertiary.violet.buttons .button:active,\n.ui.tertiary.violet.buttons .tertiary.button:active,\n.ui.tertiary.violet.button:active {\n  box-shadow: inset 0 -0.2em 0 #4e0fd6;\n  color: #5626bf;\n}\n.ui.purple.buttons .button,\n.ui.purple.button {\n  background-color: #a333c8;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.purple.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.purple.buttons .button:hover,\n.ui.purple.button:hover {\n  background-color: #9627ba;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.purple.buttons .button:focus,\n.ui.purple.button:focus {\n  background-color: #8f1eb4;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.purple.buttons .button:active,\n.ui.purple.button:active {\n  background-color: #82299f;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.purple.buttons .active.button,\n.ui.purple.buttons .active.button:active,\n.ui.purple.active.button,\n.ui.purple.button .active.button:active {\n  background-color: #9724be;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.purple.buttons .button,\n.ui.basic.purple.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #a333c8 inset;\n  color: #a333c8;\n}\n.ui.basic.purple.buttons .button:hover,\n.ui.basic.purple.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #9627ba inset;\n  color: #9627ba;\n}\n.ui.basic.purple.buttons .button:focus,\n.ui.basic.purple.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #8f1eb4 inset;\n  color: #9627ba;\n}\n.ui.basic.purple.buttons .active.button,\n.ui.basic.purple.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #9724be inset;\n  color: #82299f;\n}\n.ui.basic.purple.buttons .button:active,\n.ui.basic.purple.button:active {\n  box-shadow: 0 0 0 1px #82299f inset;\n  color: #82299f;\n}\n\n/* Inverted */\n.ui.inverted.purple.buttons .button,\n.ui.inverted.purple.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #dc73ff inset;\n  color: #dc73ff;\n}\n.ui.inverted.purple.buttons .button:hover,\n.ui.inverted.purple.button:hover,\n.ui.inverted.purple.buttons .button:focus,\n.ui.inverted.purple.button:focus,\n.ui.inverted.purple.buttons .button.active,\n.ui.inverted.purple.button.active,\n.ui.inverted.purple.buttons .button:active,\n.ui.inverted.purple.button:active {\n  box-shadow: none;\n  color: #fff;\n}\n.ui.inverted.purple.buttons .button:hover,\n.ui.inverted.purple.button:hover {\n  background-color: #cf40ff;\n}\n.ui.inverted.purple.buttons .button:focus,\n.ui.inverted.purple.button:focus {\n  background-color: #d24aff;\n}\n.ui.inverted.purple.buttons .active.button,\n.ui.inverted.purple.active.button {\n  background-color: #d65aff;\n}\n.ui.inverted.purple.buttons .button:active,\n.ui.inverted.purple.button:active {\n  background-color: #cf40ff;\n}\n\n/* Inverted Basic */\n.ui.inverted.purple.basic.buttons .button,\n.ui.inverted.purple.buttons .basic.button,\n.ui.inverted.purple.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.purple.basic.buttons .button:hover,\n.ui.inverted.purple.buttons .basic.button:hover,\n.ui.inverted.purple.basic.button:hover {\n  box-shadow: 0 0 0 2px #cf40ff inset;\n  color: #dc73ff;\n}\n.ui.inverted.purple.basic.buttons .button:focus,\n.ui.inverted.purple.basic.buttons .button:focus,\n.ui.inverted.purple.basic.button:focus {\n  box-shadow: 0 0 0 2px #d24aff inset;\n  color: #dc73ff;\n}\n.ui.inverted.purple.basic.buttons .active.button,\n.ui.inverted.purple.buttons .basic.active.button,\n.ui.inverted.purple.basic.active.button {\n  box-shadow: 0 0 0 2px #d65aff inset;\n  color: #dc73ff;\n}\n.ui.inverted.purple.basic.buttons .button:active,\n.ui.inverted.purple.buttons .basic.button:active,\n.ui.inverted.purple.basic.button:active {\n  box-shadow: 0 0 0 2px #cf40ff inset;\n  color: #dc73ff;\n}\n\n/* Tertiary */\n.ui.tertiary.purple.buttons .button,\n.ui.tertiary.purple.buttons .tertiary.button,\n.ui.tertiary.purple.button {\n  background: transparent;\n  box-shadow: none;\n  color: #a333c8;\n}\n.ui.tertiary.purple.buttons .button:hover,\n.ui.tertiary.purple.buttons button:hover,\n.ui.tertiary.purple.button:hover {\n  box-shadow: inset 0 -0.2em 0 #8a3ea4;\n  color: #8a3ea4;\n}\n.ui.tertiary.purple.buttons .button:focus,\n.ui.tertiary.purple.buttons .tertiary.button:focus,\n.ui.tertiary.purple.button:focus {\n  box-shadow: inset 0 -0.2em 0 #84339f;\n  color: #84339f;\n}\n.ui.tertiary.purple.buttons .active.button,\n.ui.tertiary.purple.buttons .tertiary.active.button,\n.ui.tertiary.purple.active.button,\n.ui.tertiary.purple.buttons .button:active,\n.ui.tertiary.purple.buttons .tertiary.button:active,\n.ui.tertiary.purple.button:active {\n  box-shadow: inset 0 -0.2em 0 #a30dd4;\n  color: #9724be;\n}\n.ui.pink.buttons .button,\n.ui.pink.button {\n  background-color: #e03997;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.pink.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.pink.buttons .button:hover,\n.ui.pink.button:hover {\n  background-color: #e61a8d;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.pink.buttons .button:focus,\n.ui.pink.button:focus {\n  background-color: #e10f85;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.pink.buttons .button:active,\n.ui.pink.button:active {\n  background-color: #c71f7e;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.pink.buttons .active.button,\n.ui.pink.buttons .active.button:active,\n.ui.pink.active.button,\n.ui.pink.button .active.button:active {\n  background-color: #ea158d;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.pink.buttons .button,\n.ui.basic.pink.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #e03997 inset;\n  color: #e03997;\n}\n.ui.basic.pink.buttons .button:hover,\n.ui.basic.pink.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #e61a8d inset;\n  color: #e61a8d;\n}\n.ui.basic.pink.buttons .button:focus,\n.ui.basic.pink.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #e10f85 inset;\n  color: #e61a8d;\n}\n.ui.basic.pink.buttons .active.button,\n.ui.basic.pink.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #ea158d inset;\n  color: #c71f7e;\n}\n.ui.basic.pink.buttons .button:active,\n.ui.basic.pink.button:active {\n  box-shadow: 0 0 0 1px #c71f7e inset;\n  color: #c71f7e;\n}\n\n/* Inverted */\n.ui.inverted.pink.buttons .button,\n.ui.inverted.pink.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #ff8edf inset;\n  color: #ff8edf;\n}\n.ui.inverted.pink.buttons .button:hover,\n.ui.inverted.pink.button:hover,\n.ui.inverted.pink.buttons .button:focus,\n.ui.inverted.pink.button:focus,\n.ui.inverted.pink.buttons .button.active,\n.ui.inverted.pink.button.active,\n.ui.inverted.pink.buttons .button:active,\n.ui.inverted.pink.button:active {\n  box-shadow: none;\n  color: #fff;\n}\n.ui.inverted.pink.buttons .button:hover,\n.ui.inverted.pink.button:hover {\n  background-color: #ff5bd1;\n}\n.ui.inverted.pink.buttons .button:focus,\n.ui.inverted.pink.button:focus {\n  background-color: #ff65d3;\n}\n.ui.inverted.pink.buttons .active.button,\n.ui.inverted.pink.active.button {\n  background-color: #ff74d8;\n}\n.ui.inverted.pink.buttons .button:active,\n.ui.inverted.pink.button:active {\n  background-color: #ff5bd1;\n}\n\n/* Inverted Basic */\n.ui.inverted.pink.basic.buttons .button,\n.ui.inverted.pink.buttons .basic.button,\n.ui.inverted.pink.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.pink.basic.buttons .button:hover,\n.ui.inverted.pink.buttons .basic.button:hover,\n.ui.inverted.pink.basic.button:hover {\n  box-shadow: 0 0 0 2px #ff5bd1 inset;\n  color: #ff8edf;\n}\n.ui.inverted.pink.basic.buttons .button:focus,\n.ui.inverted.pink.basic.buttons .button:focus,\n.ui.inverted.pink.basic.button:focus {\n  box-shadow: 0 0 0 2px #ff65d3 inset;\n  color: #ff8edf;\n}\n.ui.inverted.pink.basic.buttons .active.button,\n.ui.inverted.pink.buttons .basic.active.button,\n.ui.inverted.pink.basic.active.button {\n  box-shadow: 0 0 0 2px #ff74d8 inset;\n  color: #ff8edf;\n}\n.ui.inverted.pink.basic.buttons .button:active,\n.ui.inverted.pink.buttons .basic.button:active,\n.ui.inverted.pink.basic.button:active {\n  box-shadow: 0 0 0 2px #ff5bd1 inset;\n  color: #ff8edf;\n}\n\n/* Tertiary */\n.ui.tertiary.pink.buttons .button,\n.ui.tertiary.pink.buttons .tertiary.button,\n.ui.tertiary.pink.button {\n  background: transparent;\n  box-shadow: none;\n  color: #e03997;\n}\n.ui.tertiary.pink.buttons .button:hover,\n.ui.tertiary.pink.buttons button:hover,\n.ui.tertiary.pink.button:hover {\n  box-shadow: inset 0 -0.2em 0 #cc3389;\n  color: #cc3389;\n}\n.ui.tertiary.pink.buttons .button:focus,\n.ui.tertiary.pink.buttons .tertiary.button:focus,\n.ui.tertiary.pink.button:focus {\n  box-shadow: inset 0 -0.2em 0 #c92782;\n  color: #c92782;\n}\n.ui.tertiary.pink.buttons .active.button,\n.ui.tertiary.pink.buttons .tertiary.active.button,\n.ui.tertiary.pink.active.button,\n.ui.tertiary.pink.buttons .button:active,\n.ui.tertiary.pink.buttons .tertiary.button:active,\n.ui.tertiary.pink.button:active {\n  box-shadow: inset 0 -0.2em 0 #ff0090;\n  color: #ea158d;\n}\n.ui.brown.buttons .button,\n.ui.brown.button {\n  background-color: #a5673f;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.brown.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.brown.buttons .button:hover,\n.ui.brown.button:hover {\n  background-color: #975b33;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.brown.buttons .button:focus,\n.ui.brown.button:focus {\n  background-color: #90532b;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.brown.buttons .button:active,\n.ui.brown.button:active {\n  background-color: #805031;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.brown.buttons .active.button,\n.ui.brown.buttons .active.button:active,\n.ui.brown.active.button,\n.ui.brown.button .active.button:active {\n  background-color: #995a31;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.brown.buttons .button,\n.ui.basic.brown.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #a5673f inset;\n  color: #a5673f;\n}\n.ui.basic.brown.buttons .button:hover,\n.ui.basic.brown.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #975b33 inset;\n  color: #975b33;\n}\n.ui.basic.brown.buttons .button:focus,\n.ui.basic.brown.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #90532b inset;\n  color: #975b33;\n}\n.ui.basic.brown.buttons .active.button,\n.ui.basic.brown.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #995a31 inset;\n  color: #805031;\n}\n.ui.basic.brown.buttons .button:active,\n.ui.basic.brown.button:active {\n  box-shadow: 0 0 0 1px #805031 inset;\n  color: #805031;\n}\n\n/* Inverted */\n.ui.inverted.brown.buttons .button,\n.ui.inverted.brown.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #d67c1c inset;\n  color: #d67c1c;\n}\n.ui.inverted.brown.buttons .button:hover,\n.ui.inverted.brown.button:hover,\n.ui.inverted.brown.buttons .button:focus,\n.ui.inverted.brown.button:focus,\n.ui.inverted.brown.buttons .button.active,\n.ui.inverted.brown.button.active,\n.ui.inverted.brown.buttons .button:active,\n.ui.inverted.brown.button:active {\n  box-shadow: none;\n  color: #fff;\n}\n.ui.inverted.brown.buttons .button:hover,\n.ui.inverted.brown.button:hover {\n  background-color: #b0620f;\n}\n.ui.inverted.brown.buttons .button:focus,\n.ui.inverted.brown.button:focus {\n  background-color: #c16808;\n}\n.ui.inverted.brown.buttons .active.button,\n.ui.inverted.brown.active.button {\n  background-color: #cc6f0d;\n}\n.ui.inverted.brown.buttons .button:active,\n.ui.inverted.brown.button:active {\n  background-color: #a96216;\n}\n\n/* Inverted Basic */\n.ui.inverted.brown.basic.buttons .button,\n.ui.inverted.brown.buttons .basic.button,\n.ui.inverted.brown.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.brown.basic.buttons .button:hover,\n.ui.inverted.brown.buttons .basic.button:hover,\n.ui.inverted.brown.basic.button:hover {\n  box-shadow: 0 0 0 2px #b0620f inset;\n  color: #d67c1c;\n}\n.ui.inverted.brown.basic.buttons .button:focus,\n.ui.inverted.brown.basic.buttons .button:focus,\n.ui.inverted.brown.basic.button:focus {\n  box-shadow: 0 0 0 2px #c16808 inset;\n  color: #d67c1c;\n}\n.ui.inverted.brown.basic.buttons .active.button,\n.ui.inverted.brown.buttons .basic.active.button,\n.ui.inverted.brown.basic.active.button {\n  box-shadow: 0 0 0 2px #cc6f0d inset;\n  color: #d67c1c;\n}\n.ui.inverted.brown.basic.buttons .button:active,\n.ui.inverted.brown.buttons .basic.button:active,\n.ui.inverted.brown.basic.button:active {\n  box-shadow: 0 0 0 2px #a96216 inset;\n  color: #d67c1c;\n}\n\n/* Tertiary */\n.ui.tertiary.brown.buttons .button,\n.ui.tertiary.brown.buttons .tertiary.button,\n.ui.tertiary.brown.button {\n  background: transparent;\n  box-shadow: none;\n  color: #a5673f;\n}\n.ui.tertiary.brown.buttons .button:hover,\n.ui.tertiary.brown.buttons button:hover,\n.ui.tertiary.brown.button:hover {\n  box-shadow: inset 0 -0.2em 0 #835f48;\n  color: #835f48;\n}\n.ui.tertiary.brown.buttons .button:focus,\n.ui.tertiary.brown.buttons .tertiary.button:focus,\n.ui.tertiary.brown.button:focus {\n  box-shadow: inset 0 -0.2em 0 #7d573e;\n  color: #7d573e;\n}\n.ui.tertiary.brown.buttons .active.button,\n.ui.tertiary.brown.buttons .tertiary.active.button,\n.ui.tertiary.brown.active.button,\n.ui.tertiary.brown.buttons .button:active,\n.ui.tertiary.brown.buttons .tertiary.button:active,\n.ui.tertiary.brown.button:active {\n  box-shadow: inset 0 -0.2em 0 #ae561d;\n  color: #995a31;\n}\n.ui.grey.buttons .button,\n.ui.grey.button {\n  background-color: #767676;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.grey.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.grey.buttons .button:hover,\n.ui.grey.button:hover {\n  background-color: #838383;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.grey.buttons .button:focus,\n.ui.grey.button:focus {\n  background-color: #8a8a8a;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.grey.buttons .button:active,\n.ui.grey.button:active {\n  background-color: #909090;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.grey.buttons .active.button,\n.ui.grey.buttons .active.button:active,\n.ui.grey.active.button,\n.ui.grey.button .active.button:active {\n  background-color: #696969;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.grey.buttons .button,\n.ui.basic.grey.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #767676 inset;\n  color: #767676;\n}\n.ui.basic.grey.buttons .button:hover,\n.ui.basic.grey.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #838383 inset;\n  color: #838383;\n}\n.ui.basic.grey.buttons .button:focus,\n.ui.basic.grey.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #8a8a8a inset;\n  color: #838383;\n}\n.ui.basic.grey.buttons .active.button,\n.ui.basic.grey.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #696969 inset;\n  color: #909090;\n}\n.ui.basic.grey.buttons .button:active,\n.ui.basic.grey.button:active {\n  box-shadow: 0 0 0 1px #909090 inset;\n  color: #909090;\n}\n\n/* Inverted */\n.ui.inverted.grey.buttons .button,\n.ui.inverted.grey.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #d4d4d5 inset;\n  color: #fff;\n}\n.ui.inverted.grey.buttons .button:hover,\n.ui.inverted.grey.button:hover,\n.ui.inverted.grey.buttons .button:focus,\n.ui.inverted.grey.button:focus,\n.ui.inverted.grey.buttons .button.active,\n.ui.inverted.grey.button.active,\n.ui.inverted.grey.buttons .button:active,\n.ui.inverted.grey.button:active {\n  box-shadow: none;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.inverted.grey.buttons .button:hover,\n.ui.inverted.grey.button:hover {\n  background-color: #c2c4c5;\n}\n.ui.inverted.grey.buttons .button:focus,\n.ui.inverted.grey.button:focus {\n  background-color: #c7c9cb;\n}\n.ui.inverted.grey.buttons .active.button,\n.ui.inverted.grey.active.button {\n  background-color: #cfd0d2;\n}\n.ui.inverted.grey.buttons .button:active,\n.ui.inverted.grey.button:active {\n  background-color: #c2c4c5;\n}\n\n/* Inverted Basic */\n.ui.inverted.grey.basic.buttons .button,\n.ui.inverted.grey.buttons .basic.button,\n.ui.inverted.grey.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.grey.basic.buttons .button:hover,\n.ui.inverted.grey.buttons .basic.button:hover,\n.ui.inverted.grey.basic.button:hover {\n  box-shadow: 0 0 0 2px #c2c4c5 inset;\n  color: #fff;\n}\n.ui.inverted.grey.basic.buttons .button:focus,\n.ui.inverted.grey.basic.buttons .button:focus,\n.ui.inverted.grey.basic.button:focus {\n  box-shadow: 0 0 0 2px #c7c9cb inset;\n  color: #dcddde;\n}\n.ui.inverted.grey.basic.buttons .active.button,\n.ui.inverted.grey.buttons .basic.active.button,\n.ui.inverted.grey.basic.active.button {\n  box-shadow: 0 0 0 2px #cfd0d2 inset;\n  color: #fff;\n}\n.ui.inverted.grey.basic.buttons .button:active,\n.ui.inverted.grey.buttons .basic.button:active,\n.ui.inverted.grey.basic.button:active {\n  box-shadow: 0 0 0 2px #c2c4c5 inset;\n  color: #fff;\n}\n\n/* Tertiary */\n.ui.tertiary.grey.buttons .button,\n.ui.tertiary.grey.buttons .tertiary.button,\n.ui.tertiary.grey.button {\n  background: transparent;\n  box-shadow: none;\n  color: #767676;\n}\n.ui.tertiary.grey.buttons .button:hover,\n.ui.tertiary.grey.buttons button:hover,\n.ui.tertiary.grey.button:hover {\n  box-shadow: inset 0 -0.2em 0 #909090;\n  color: #909090;\n}\n.ui.tertiary.grey.buttons .button:focus,\n.ui.tertiary.grey.buttons .tertiary.button:focus,\n.ui.tertiary.grey.button:focus {\n  box-shadow: inset 0 -0.2em 0 #9f9f9f;\n  color: #9f9f9f;\n}\n.ui.tertiary.grey.buttons .active.button,\n.ui.tertiary.grey.buttons .tertiary.active.button,\n.ui.tertiary.grey.active.button,\n.ui.tertiary.grey.buttons .button:active,\n.ui.tertiary.grey.buttons .tertiary.button:active,\n.ui.tertiary.grey.button:active {\n  box-shadow: inset 0 -0.2em 0 #5d5d5d;\n  color: #696969;\n}\n.ui.black.buttons .button,\n.ui.black.button {\n  background-color: #1b1c1d;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.black.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.black.buttons .button:hover,\n.ui.black.button:hover {\n  background-color: #27292a;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.black.buttons .button:focus,\n.ui.black.button:focus {\n  background-color: #2f3032;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.black.buttons .button:active,\n.ui.black.button:active {\n  background-color: #343637;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.black.buttons .active.button,\n.ui.black.buttons .active.button:active,\n.ui.black.active.button,\n.ui.black.button .active.button:active {\n  background-color: #0f0f10;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.black.buttons .button,\n.ui.basic.black.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #1b1c1d inset;\n  color: #1b1c1d;\n}\n.ui.basic.black.buttons .button:hover,\n.ui.basic.black.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #27292a inset;\n  color: #27292a;\n}\n.ui.basic.black.buttons .button:focus,\n.ui.basic.black.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #2f3032 inset;\n  color: #27292a;\n}\n.ui.basic.black.buttons .active.button,\n.ui.basic.black.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #0f0f10 inset;\n  color: #343637;\n}\n.ui.basic.black.buttons .button:active,\n.ui.basic.black.button:active {\n  box-shadow: 0 0 0 1px #343637 inset;\n  color: #343637;\n}\n\n/* Inverted */\n.ui.inverted.black.buttons .button,\n.ui.inverted.black.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px #d4d4d5 inset;\n  color: #fff;\n}\n.ui.inverted.black.buttons .button:hover,\n.ui.inverted.black.button:hover,\n.ui.inverted.black.buttons .button:focus,\n.ui.inverted.black.button:focus,\n.ui.inverted.black.buttons .button.active,\n.ui.inverted.black.button.active,\n.ui.inverted.black.buttons .button:active,\n.ui.inverted.black.button:active {\n  box-shadow: none;\n  color: #fff;\n}\n.ui.inverted.black.buttons .button:hover,\n.ui.inverted.black.button:hover {\n  background-color: #000000;\n}\n.ui.inverted.black.buttons .button:focus,\n.ui.inverted.black.button:focus {\n  background-color: #000000;\n}\n.ui.inverted.black.buttons .active.button,\n.ui.inverted.black.active.button {\n  background-color: #000000;\n}\n.ui.inverted.black.buttons .button:active,\n.ui.inverted.black.button:active {\n  background-color: #000000;\n}\n\n/* Inverted Basic */\n.ui.inverted.black.basic.buttons .button,\n.ui.inverted.black.buttons .basic.button,\n.ui.inverted.black.basic.button {\n  background-color: transparent;\n  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset;\n  color: #fff;\n}\n.ui.inverted.black.basic.buttons .button:hover,\n.ui.inverted.black.buttons .basic.button:hover,\n.ui.inverted.black.basic.button:hover {\n  box-shadow: 0 0 0 2px #000000 inset;\n  color: #fff;\n}\n.ui.inverted.black.basic.buttons .button:focus,\n.ui.inverted.black.basic.buttons .button:focus,\n.ui.inverted.black.basic.button:focus {\n  box-shadow: 0 0 0 2px #000000 inset;\n  color: #545454;\n}\n.ui.inverted.black.basic.buttons .active.button,\n.ui.inverted.black.buttons .basic.active.button,\n.ui.inverted.black.basic.active.button {\n  box-shadow: 0 0 0 2px #000000 inset;\n  color: #fff;\n}\n.ui.inverted.black.basic.buttons .button:active,\n.ui.inverted.black.buttons .basic.button:active,\n.ui.inverted.black.basic.button:active {\n  box-shadow: 0 0 0 2px #000000 inset;\n  color: #fff;\n}\n\n/* Tertiary */\n.ui.tertiary.black.buttons .button,\n.ui.tertiary.black.buttons .tertiary.button,\n.ui.tertiary.black.button {\n  background: transparent;\n  box-shadow: none;\n  color: #1b1c1d;\n}\n.ui.tertiary.black.buttons .button:hover,\n.ui.tertiary.black.buttons button:hover,\n.ui.tertiary.black.button:hover {\n  box-shadow: inset 0 -0.2em 0 #8b8f93;\n  color: #8b8f93;\n}\n.ui.tertiary.black.buttons .button:focus,\n.ui.tertiary.black.buttons .tertiary.button:focus,\n.ui.tertiary.black.button:focus {\n  box-shadow: inset 0 -0.2em 0 #93969a;\n  color: #93969a;\n}\n.ui.tertiary.black.buttons .active.button,\n.ui.tertiary.black.buttons .tertiary.active.button,\n.ui.tertiary.black.active.button,\n.ui.tertiary.black.buttons .button:active,\n.ui.tertiary.black.buttons .tertiary.button:active,\n.ui.tertiary.black.button:active {\n  box-shadow: inset 0 -0.2em 0 #404245;\n  color: #0f0f10;\n}\n\n/* Standard */\n.ui.positive.buttons .button,\n.ui.positive.button {\n  background-color: #21ba45;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.positive.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.positive.buttons .button:hover,\n.ui.positive.button:hover {\n  background-color: #16ab39;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.positive.buttons .button:focus,\n.ui.positive.button:focus {\n  background-color: #0ea432;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.positive.buttons .button:active,\n.ui.positive.button:active {\n  background-color: #198f35;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.positive.buttons .active.button,\n.ui.positive.buttons .active.button:active,\n.ui.positive.active.button,\n.ui.positive.button .active.button:active {\n  background-color: #13ae38;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.positive.buttons .button,\n.ui.basic.positive.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #21ba45 inset;\n  color: #21ba45;\n}\n.ui.basic.positive.buttons .button:hover,\n.ui.basic.positive.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #16ab39 inset;\n  color: #16ab39;\n}\n.ui.basic.positive.buttons .button:focus,\n.ui.basic.positive.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #0ea432 inset;\n  color: #16ab39;\n}\n.ui.basic.positive.buttons .active.button,\n.ui.basic.positive.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #13ae38 inset;\n  color: #198f35;\n}\n.ui.basic.positive.buttons .button:active,\n.ui.basic.positive.button:active {\n  box-shadow: 0 0 0 1px #198f35 inset;\n  color: #198f35;\n}\n.ui.buttons:not(.vertical) > .basic.positive.button:not(:first-child) {\n  margin-left: -1px;\n}\n\n/* Standard */\n.ui.negative.buttons .button,\n.ui.negative.button {\n  background-color: #db2828;\n  color: #fff;\n  text-shadow: none;\n  background-image: none;\n}\n.ui.negative.button {\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.negative.buttons .button:hover,\n.ui.negative.button:hover {\n  background-color: #d01919;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.negative.buttons .button:focus,\n.ui.negative.button:focus {\n  background-color: #ca1010;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.negative.buttons .button:active,\n.ui.negative.button:active {\n  background-color: #b21e1e;\n  color: #fff;\n  text-shadow: none;\n}\n.ui.negative.buttons .active.button,\n.ui.negative.buttons .active.button:active,\n.ui.negative.active.button,\n.ui.negative.button .active.button:active {\n  background-color: #d41515;\n  color: #fff;\n  text-shadow: none;\n}\n\n/* Basic */\n.ui.basic.negative.buttons .button,\n.ui.basic.negative.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #db2828 inset;\n  color: #db2828;\n}\n.ui.basic.negative.buttons .button:hover,\n.ui.basic.negative.button:hover {\n  background: transparent;\n  box-shadow: 0 0 0 1px #d01919 inset;\n  color: #d01919;\n}\n.ui.basic.negative.buttons .button:focus,\n.ui.basic.negative.button:focus {\n  background: transparent;\n  box-shadow: 0 0 0 1px #ca1010 inset;\n  color: #d01919;\n}\n.ui.basic.negative.buttons .active.button,\n.ui.basic.negative.active.button {\n  background: transparent;\n  box-shadow: 0 0 0 1px #d41515 inset;\n  color: #b21e1e;\n}\n.ui.basic.negative.buttons .button:active,\n.ui.basic.negative.button:active {\n  box-shadow: 0 0 0 1px #b21e1e inset;\n  color: #b21e1e;\n}\n.ui.buttons:not(.vertical) > .basic.negative.button:not(:first-child) {\n  margin-left: -1px;\n}\n\n\n/*******************************\n                Groups\n    *******************************/\n\n.ui.buttons {\n  display: inline-flex;\n  flex-direction: row;\n  font-size: 0;\n  vertical-align: baseline;\n  margin: 0 0.25em 0 0;\n}\n.ui.buttons:not(.basic):not(.inverted) {\n  box-shadow: none;\n}\n\n/* Clearfix */\n.ui.buttons::after {\n  content: \".\";\n  display: block;\n  height: 0;\n  clear: both;\n  visibility: hidden;\n}\n\n/* Standard Group */\n.ui.buttons .button {\n  flex: 1 0 auto;\n  border-radius: 0;\n  margin: 0;\n}\n.ui.buttons:not(.basic):not(.inverted) > .button:not(.basic):not(.inverted) {\n  box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset;\n}\n.ui.buttons .button:first-child {\n  border-left: none;\n  margin-left: 0;\n  border-top-left-radius: 0.28571429rem;\n  border-bottom-left-radius: 0.28571429rem;\n}\n.ui.buttons .button:last-child {\n  border-top-right-radius: 0.28571429rem;\n  border-bottom-right-radius: 0.28571429rem;\n}\n\n/* Vertical Style */\n.ui.vertical.buttons {\n  display: inline-flex;\n  flex-direction: column;\n}\n.ui.vertical.buttons .button {\n  display: block;\n  float: none;\n  width: 100%;\n  margin: 0;\n  border-radius: 0;\n}\n.ui.vertical.buttons .button:not(.basic) {\n  box-shadow: none;\n}\n.ui.vertical.buttons .button:first-child {\n  border-top-left-radius: 0.28571429rem;\n  border-top-right-radius: 0.28571429rem;\n}\n.ui.vertical.buttons .button:last-child {\n  margin-bottom: 0;\n  border-bottom-left-radius: 0.28571429rem;\n  border-bottom-right-radius: 0.28571429rem;\n}\n.ui.vertical.buttons .button:only-child {\n  border-radius: 0.28571429rem;\n}\n.ui.vertical.buttons .basic.button:not(:first-child) {\n  border-top: none;\n}\n.ui.wrapping.buttons {\n  flex-wrap: wrap;\n}\n.ui.wrapping.basic.buttons {\n  border-bottom: none;\n}\n.ui.wrapping.basic.buttons .button {\n  border-bottom: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.wrapping.basic.buttons .button:hover {\n  background: transparent !important;\n}\n.ui.compact.wrapping.buttons .button {\n  flex: none;\n}\n.ui.wrapped.buttons:not(.spaced) {\n  border-top-right-radius: 0;\n}\n.ui.wrapped.buttons:not(.spaced) .button:first-child {\n  border-radius: 0.28571429rem 0 0 0;\n}\n.ui.wrapped.buttons:not(.spaced) .button:last-child {\n  border-radius: 0 0 0.28571429rem 0;\n}\n.ui.wrapped[class*=\"top attached\"].buttons {\n  border-radius: 0.28571429rem 0 0 0;\n}\n.ui.wrapped[class*=\"top attached\"].buttons .button:last-child {\n  border-radius: 0;\n}\n.ui.wrapped[class*=\"bottom attached\"].buttons {\n  border-radius: 0 0 0 0.28571429rem;\n}\n.ui.wrapped[class*=\"bottom attached\"].buttons .button:first-child {\n  border-radius: 0;\n}\n.ui.spaced.buttons .ui.button {\n  margin-bottom: 1em;\n  margin-right: 1em;\n  border-radius: 0.28571429rem;\n}\n.ui.spaced.basic.buttons {\n  border: none;\n}\n.ui.spaced.basic.buttons .button {\n  border: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.spaced.basic.buttons .button.basic {\n  border: none;\n}\n.ui.spaced.basic.vertical.buttons .button:first-child {\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.spaced.basic.wrapping.buttons .button:not(.basic) {\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n  border-right: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.spaced.basic.wrapping.buttons .button:not(.basic):first-child {\n  border-left: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.spaced.basic.inverted.buttons .basic.button {\n  margin-bottom: calc(1em + 1px);\n  margin-top: 1px;\n}\n.ui.basic.buttons:not(.vertical).inverted .button,\n.ui.basic.buttons:not(.vertical) .basic.button {\n  margin-left: -1px;\n  border-right: none;\n}\n.ui.basic.buttons:not(.vertical):not(.spaced):not(.inverted) .basic.button {\n  margin-top: -1px;\n  border-bottom: none;\n}\n.ui.inverted.basic.buttons:not(.spaced) .button,\n.ui.attached.basic.buttons:not(.wrapping):not(.inverted) .basic.button {\n  margin-bottom: -1px;\n}\n.ui.basic.buttons:not(.vertical):not(.attached):not(.spaced):not(.wrapping):not(.inverted) .basic.button {\n  margin-bottom: -1px;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/calendar.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Calendar\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Popup\n*******************************/\n\n.ui.calendar.popup {\n  max-width: none;\n  padding: 0;\n  border: none;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n.ui.calendar.popup.inverted::before {\n  background: #2b2b2b;\n}\n\n\n/*******************************\n            Calendar\n*******************************/\n\n.ui.calendar .calendar:focus,\n.ui.calendar.popup:focus {\n  outline: 0;\n}\n\n\n/*******************************\n            Grid\n*******************************/\n\n.ui.calendar.popup .ui.grid {\n  display: block;\n  white-space: nowrap;\n}\n.ui.calendar.popup .ui.grid > .column {\n  width: auto;\n}\n\n\n/*******************************\n            Table\n*******************************/\n\n.ui.calendar .ui.table.year,\n.ui.calendar .ui.table.month,\n.ui.calendar .ui.table.minute {\n  min-width: 15em;\n}\n.ui.calendar .ui.table.day {\n  min-width: 18em;\n}\n.ui.calendar .ui.table.day.andweek {\n  min-width: 22em;\n}\n.ui.calendar .ui.table.hour {\n  min-width: 20em;\n}\n.ui.calendar .ui.table tr th,\n.ui.calendar .ui.table tr td {\n  padding: 0.5em;\n  white-space: nowrap;\n}\n.ui.calendar .ui.table tr th {\n  border-left: none;\n}\n.ui.calendar .ui.table tr th i.icon {\n  margin: 0;\n}\n.ui.calendar .ui.table tr:first-child th {\n  position: relative;\n  padding-left: 0;\n  padding-right: 0;\n}\n.ui.calendar .ui.table.day tr:first-child th {\n  border: none;\n}\n.ui.calendar .ui.table.day tr:nth-child(2) th {\n  padding-top: 0.2em;\n  padding-bottom: 0.3em;\n}\n.ui.calendar .ui.table tr td {\n  padding-left: 0.1em;\n  padding-right: 0.1em;\n}\n.ui.calendar .ui.table tr .link {\n  cursor: pointer;\n}\n.ui.calendar .ui.table tr .prev.link {\n  width: 14.28571429%;\n  position: absolute;\n  left: 0;\n}\n.ui.calendar .ui.table tr .next.link {\n  width: 14.28571429%;\n  position: absolute;\n  right: 0;\n}\n.ui.ui.calendar .ui.table tr .disabled {\n  pointer-events: auto;\n  cursor: default;\n  color: rgba(40, 40, 40, 0.3);\n}\n.ui.calendar .ui.table tr .adjacent:not(.disabled):not(.active) {\n  color: rgba(0, 0, 0, 0.6);\n  background: rgba(0, 0, 0, 0.03);\n}\n\n/* --------------\n     States\n--------------- */\n.ui.calendar .ui.table tr td.today {\n  font-weight: bold;\n}\n.ui.calendar .ui.table tr td.range {\n  background: rgba(0, 0, 0, 0.05);\n  color: rgba(0, 0, 0, 0.95);\n  box-shadow: none;\n}\n.ui.calendar:not(.disabled):focus .ui.table tbody tr td.focus,\n.ui.calendar:not(.disabled).popup.active .ui.table tbody tr td.focus {\n  box-shadow: inset 0 0 0 1px #85b7d9;\n}\n.ui.inverted.calendar .ui.table.inverted tr td.range {\n  background: rgba(255, 255, 255, 0.08);\n  color: #ffffff;\n  box-shadow: none;\n}\n.ui.inverted.calendar:not(.disabled) .calendar:focus .ui.table.inverted tbody tr td.focus,\n.ui.inverted.calendar:not(.disabled).popup.active .ui.table.inverted tbody tr td.focus {\n  box-shadow: inset 0 0 0 1px #85b7d9;\n}\n.ui.inverted.calendar .ui.ui.ui.inverted.table tr .disabled {\n  color: rgba(225, 225, 225, 0.3);\n}\n.ui.inverted.calendar .ui.inverted.table tr .adjacent:not(.disabled):not(.active) {\n  color: rgba(255, 255, 255, 0.8);\n  background: rgba(255, 255, 255, 0.02);\n}\n.ui.ui.ui.calendar.popup > .ui.ui.grid {\n  margin: -1rem;\n}\n.ui.ui.ui.calendar.popup > .ui.ui.grid > .column:not(:first-child) {\n  padding-left: 0;\n}\n.ui.ui.ui.calendar.popup > .ui.ui.grid > .column:not(:first-child) > .ui.table {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ui.ui.ui.calendar.popup > .ui.ui.grid > .column:not(:last-child) {\n  padding-right: 0;\n}\n.ui.ui.ui.calendar.popup > .ui.ui.grid > .column:not(:last-child) > .ui.table {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n/* --------------------\n        Sizes\n--------------------- */\n.ui.mini.calendar,\n.ui.mini.calendar .ui.table tr th,\n.ui.mini.calendar .ui.table tr td {\n  font-size: 0.78571429rem;\n}\n.ui.mini.calendar .ui.table.year,\n.ui.mini.calendar .ui.table.month,\n.ui.mini.calendar .ui.table.minute {\n  min-width: 11.78571429em;\n}\n.ui.mini.calendar .ui.table.day {\n  min-width: 14.14285714em;\n}\n.ui.mini.calendar .ui.table.day.andweek {\n  min-width: 17.28571429em;\n}\n.ui.mini.calendar .ui.table.hour {\n  min-width: 15.71428571em;\n}\n.ui.tiny.calendar,\n.ui.tiny.calendar .ui.table tr th,\n.ui.tiny.calendar .ui.table tr td {\n  font-size: 0.85714286rem;\n}\n.ui.tiny.calendar .ui.table.year,\n.ui.tiny.calendar .ui.table.month,\n.ui.tiny.calendar .ui.table.minute {\n  min-width: 12.85714286em;\n}\n.ui.tiny.calendar .ui.table.day {\n  min-width: 15.42857143em;\n}\n.ui.tiny.calendar .ui.table.day.andweek {\n  min-width: 18.85714286em;\n}\n.ui.tiny.calendar .ui.table.hour {\n  min-width: 17.14285714em;\n}\n.ui.small.calendar,\n.ui.small.calendar .ui.table tr th,\n.ui.small.calendar .ui.table tr td {\n  font-size: 0.92857143rem;\n}\n.ui.small.calendar .ui.table.year,\n.ui.small.calendar .ui.table.month,\n.ui.small.calendar .ui.table.minute {\n  min-width: 13.92857143em;\n}\n.ui.small.calendar .ui.table.day {\n  min-width: 16.71428571em;\n}\n.ui.small.calendar .ui.table.day.andweek {\n  min-width: 20.42857143em;\n}\n.ui.small.calendar .ui.table.hour {\n  min-width: 18.57142857em;\n}\n.ui.large.calendar,\n.ui.large.calendar .ui.table tr th,\n.ui.large.calendar .ui.table tr td {\n  font-size: 1.14285714rem;\n}\n.ui.large.calendar .ui.table.year,\n.ui.large.calendar .ui.table.month,\n.ui.large.calendar .ui.table.minute {\n  min-width: 17.14285714em;\n}\n.ui.large.calendar .ui.table.day {\n  min-width: 20.57142857em;\n}\n.ui.large.calendar .ui.table.day.andweek {\n  min-width: 25.14285714em;\n}\n.ui.large.calendar .ui.table.hour {\n  min-width: 22.85714286em;\n}\n.ui.big.calendar,\n.ui.big.calendar .ui.table tr th,\n.ui.big.calendar .ui.table tr td {\n  font-size: 1.28571429rem;\n}\n.ui.big.calendar .ui.table.year,\n.ui.big.calendar .ui.table.month,\n.ui.big.calendar .ui.table.minute {\n  min-width: 19.28571429em;\n}\n.ui.big.calendar .ui.table.day {\n  min-width: 23.14285714em;\n}\n.ui.big.calendar .ui.table.day.andweek {\n  min-width: 28.28571429em;\n}\n.ui.big.calendar .ui.table.hour {\n  min-width: 25.71428571em;\n}\n.ui.huge.calendar,\n.ui.huge.calendar .ui.table tr th,\n.ui.huge.calendar .ui.table tr td {\n  font-size: 1.42857143rem;\n}\n.ui.huge.calendar .ui.table.year,\n.ui.huge.calendar .ui.table.month,\n.ui.huge.calendar .ui.table.minute {\n  min-width: 21.42857143em;\n}\n.ui.huge.calendar .ui.table.day {\n  min-width: 25.71428571em;\n}\n.ui.huge.calendar .ui.table.day.andweek {\n  min-width: 31.42857143em;\n}\n.ui.huge.calendar .ui.table.hour {\n  min-width: 28.57142857em;\n}\n.ui.massive.calendar,\n.ui.massive.calendar .ui.table tr th,\n.ui.massive.calendar .ui.table tr td {\n  font-size: 1.71428571rem;\n}\n.ui.massive.calendar .ui.table.year,\n.ui.massive.calendar .ui.table.month,\n.ui.massive.calendar .ui.table.minute {\n  min-width: 25.71428571em;\n}\n.ui.massive.calendar .ui.table.day {\n  min-width: 30.85714286em;\n}\n.ui.massive.calendar .ui.table.day.andweek {\n  min-width: 37.71428571em;\n}\n.ui.massive.calendar .ui.table.hour {\n  min-width: 34.28571429em;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------------\n            Disabled\n    --------------------- */\n.ui.disabled.calendar {\n  opacity: 0.45;\n}\n.ui.disabled.calendar > .input,\n.ui.disabled.calendar .ui.table tr .link {\n  pointer-events: none;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n        User Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/calendar.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Calendar\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.calendar = function (parameters) {\n        var\n            $allModules    = $(this),\n            $document      = $(document),\n\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n            returnedValue,\n            timeGapTable = {\n                5: { row: 4, column: 3 },\n                10: { row: 3, column: 2 },\n                15: { row: 2, column: 2 },\n                20: { row: 3, column: 1 },\n                30: { row: 2, column: 1 },\n            },\n            numberText = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight']\n        ;\n\n        $allModules.each(function () {\n            var\n                settings = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.calendar.settings, parameters)\n                    : $.extend({}, $.fn.calendar.settings),\n\n                className = settings.className,\n                namespace = settings.namespace,\n                selector = settings.selector,\n                formatter = settings.formatter,\n                parser = settings.parser,\n                metadata = settings.metadata,\n                timeGap = timeGapTable[settings.minTimeGap],\n                error = settings.error,\n\n                eventNamespace = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                $module = $(this),\n                $input = $module.find(selector.input),\n                $activator = $module.find(selector.activator),\n\n                element = this,\n                instance = $module.data(moduleNamespace),\n                $container = instance && instance.popupId ? $document.find('#' + instance.popupId) : $module.find(selector.popup),\n\n                isTouch,\n                isTouchDown = false,\n                isInverted = $module.hasClass(className.inverted),\n                focusDateUsedForRange = false,\n                selectionComplete = false,\n                classObserver,\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.debug('Initializing calendar for', element, $module);\n\n                    isTouch = module.get.isTouch();\n                    module.setup.config();\n                    module.setup.popup();\n                    module.setup.inline();\n                    module.setup.input();\n                    module.setup.date();\n                    module.create.calendar();\n\n                    module.bind.events();\n                    module.observeChanges();\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of calendar');\n                    instance = module;\n                    $module.data(moduleNamespace, instance);\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous calendar for', element);\n                    $module.removeData([\n                        metadata.date,\n                        metadata.focusDate,\n                        metadata.startDate,\n                        metadata.endDate,\n                        metadata.minDate,\n                        metadata.maxDate,\n                        metadata.mode,\n                        metadata.monthOffset,\n                        moduleNamespace,\n                    ]);\n                    module.unbind.events();\n                    module.disconnect.classObserver();\n                },\n\n                setup: {\n                    config: function () {\n                        if (module.get.minDate() !== null) {\n                            module.set.minDate($module.data(metadata.minDate));\n                        }\n                        if (module.get.maxDate() !== null) {\n                            module.set.maxDate($module.data(metadata.maxDate));\n                        }\n                        module.setting('type', module.get.type());\n                        module.setting('on', settings.on || 'click');\n                    },\n                    popup: function () {\n                        if (settings.inline) {\n                            return;\n                        }\n                        if ($activator.length === 0) {\n                            $activator = $module.children().first();\n                            if ($activator.length === 0) {\n                                return;\n                            }\n                        }\n                        if ($.fn.popup === undefined) {\n                            module.error(error.popup);\n\n                            return;\n                        }\n                        if ($container.length === 0) {\n                            if (settings.context) {\n                                module.popupId = namespace + '_popup_' + (Math.random().toString(16) + '000000000').slice(2, 10);\n                                $container = $('<div/>', { id: module.popupId }).addClass(className.popup).appendTo($document.find(settings.context));\n                            } else {\n                                // prepend the popup element to the activator's parent so that it has less chance of messing with\n                                // the styling (eg input action button needs to be the last child to have correct border radius)\n                                var\n                                    $activatorParent = $activator.parent(),\n                                    domPositionFunction = $activatorParent.closest(selector.append).length > 0 ? 'appendTo' : 'prependTo'\n                                ;\n                                $container = $('<div/>').addClass(className.popup)[domPositionFunction]($activatorParent);\n                            }\n                        }\n                        $container.addClass(className.calendar);\n                        if (isInverted) {\n                            $container.addClass(className.inverted);\n                        }\n                        var onVisible = function () {\n                            module.refreshTooltips();\n\n                            return settings.onVisible.apply($container, arguments);\n                        };\n                        var onHidden = function () {\n                            module.blur();\n\n                            return settings.onHidden.apply($container, arguments);\n                        };\n                        if ($input.length === 0) {\n                            // no input, $container has to handle focus/blur\n                            $container.attr('tabindex', '0');\n                            onVisible = function () {\n                                module.refreshTooltips();\n                                module.focus();\n\n                                return settings.onVisible.apply($container, arguments);\n                            };\n                        }\n                        var onShow = function () {\n                            // reset the focus date onShow\n                            module.set.focusDate(module.get.date());\n                            module.set.mode(module.get.validatedMode(settings.startMode));\n\n                            return settings.onShow.apply($container, arguments);\n                        };\n                        var on = module.setting('on');\n                        var options = $.extend({}, settings.popupOptions, {\n                            popup: $container,\n                            movePopup: !settings.context,\n                            on: on,\n                            hoverable: on === 'hover',\n                            closable: on === 'click',\n                            onShow: onShow,\n                            onVisible: onVisible,\n                            onHide: settings.onHide,\n                            onHidden: onHidden,\n                        });\n                        module.popup(options);\n                    },\n                    inline: function () {\n                        if ($activator.length > 0 && !settings.inline) {\n                            return;\n                        }\n                        settings.inline = true;\n                        $container = $('<div/>').addClass(className.calendar).appendTo($module);\n                        if ($input.length === 0) {\n                            $container.attr('tabindex', '0');\n                        }\n                    },\n                    input: function () {\n                        if (settings.touchReadonly && $input.length > 0 && isTouch) {\n                            $input.prop('readonly', true);\n                        }\n                        module.check.disabled();\n                    },\n                    date: function () {\n                        var date;\n                        if (settings.initialDate) {\n                            date = parser.date(settings.initialDate, settings);\n                        } else if ($module.data(metadata.date) !== undefined) {\n                            date = parser.date($module.data(metadata.date), settings);\n                        } else if ($input.length > 0) {\n                            date = parser.date($input.val(), settings);\n                        }\n                        module.set.date(date, settings.formatInput, false);\n                        module.set.mode(module.get.mode(), false);\n                    },\n                },\n\n                trigger: {\n                    change: function () {\n                        var\n                            inputElement = $input[0]\n                        ;\n                        if (inputElement) {\n                            var events = document.createEvent('HTMLEvents');\n                            module.verbose('Triggering native change event');\n                            events.initEvent('change', true, false);\n                            inputElement.dispatchEvent(events);\n                        }\n                    },\n                },\n\n                create: {\n                    calendar: function () {\n                        var\n                            i,\n                            r,\n                            c,\n                            p,\n                            row,\n                            cell,\n                            pageGrid\n                        ;\n\n                        var\n                            mode = module.get.mode(),\n                            today = new Date(),\n                            date = module.get.date(),\n                            focusDate = module.get.focusDate(),\n                            display = module.helper.dateInRange(focusDate || date || parser.date(settings.initialDate, settings) || today)\n                        ;\n\n                        if (!focusDate) {\n                            focusDate = display;\n                            module.set.focusDate(focusDate, false, false);\n                        }\n\n                        var\n                            isYear = mode === 'year',\n                            isMonth = mode === 'month',\n                            isDay = mode === 'day',\n                            isHour = mode === 'hour',\n                            isMinute = mode === 'minute',\n                            isTimeOnly = settings.type === 'time'\n                        ;\n\n                        var multiMonth = Math.max(settings.multiMonth, 1);\n                        var monthOffset = !isDay ? 0 : module.get.monthOffset();\n\n                        var\n                            minute = display.getMinutes(),\n                            hour = display.getHours(),\n                            day = display.getDate(),\n                            startMonth = display.getMonth() + monthOffset,\n                            year = display.getFullYear()\n                        ;\n\n                        var columns = isDay\n                            ? (settings.showWeekNumbers ? 8 : 7)\n                            : (isHour ? 4 : timeGap.column);\n                        var rows = isDay || isHour ? 6 : timeGap.row;\n                        var pages = isDay ? multiMonth : 1;\n\n                        var container = $container;\n                        var tooltipPosition = container.hasClass('left') ? 'right center' : 'left center';\n                        container.empty();\n                        if (pages > 1) {\n                            pageGrid = $('<div/>').addClass(className.grid).appendTo(container);\n                        }\n\n                        for (p = 0; p < pages; p++) {\n                            if (pages > 1) {\n                                var pageColumn = $('<div/>').addClass(className.column).appendTo(pageGrid);\n                                container = pageColumn;\n                            }\n\n                            var month = startMonth + p;\n                            var firstMonthDayColumn = (new Date(year, month, 1).getDay() - (settings.firstDayOfWeek % 7) + 7) % 7;\n                            if (!settings.constantHeight && isDay) {\n                                var requiredCells = new Date(year, month + 1, 0).getDate() + firstMonthDayColumn;\n                                rows = Math.ceil(requiredCells / 7);\n                            }\n\n                            var\n                                yearChange = isYear ? 10 : (isMonth ? 1 : 0),\n                                monthChange = isDay ? 1 : 0,\n                                dayChange = isHour || isMinute ? 1 : 0,\n                                prevNextDay = isHour || isMinute ? day : 1,\n                                prevDate = new Date(year - yearChange, month - monthChange, prevNextDay - dayChange, hour),\n                                nextDate = new Date(year + yearChange, month + monthChange, prevNextDay + dayChange, hour),\n                                prevLast = isYear\n                                    ? new Date(Math.ceil(year / 10) * 10 - 9, 0, 0)\n                                    : (isMonth\n                                        ? new Date(year, 0, 0)\n                                        : (isDay // eslint-disable-line unicorn/no-nested-ternary\n                                            ? new Date(year, month, 0)\n                                            : new Date(year, month, day, -1))),\n                                nextFirst = isYear\n                                    ? new Date(Math.ceil(year / 10) * 10 + 1, 0, 1)\n                                    : (isMonth\n                                        ? new Date(year + 1, 0, 1)\n                                        : (isDay // eslint-disable-line unicorn/no-nested-ternary\n                                            ? new Date(year, month + 1, 1)\n                                            : new Date(year, month, day + 1)))\n                            ;\n\n                            var tempMode = mode;\n                            if (isDay && settings.showWeekNumbers) {\n                                tempMode += ' andweek';\n                            }\n                            var table = $('<table/>').addClass(className.table).addClass(tempMode).addClass(numberText[columns] + ' column')\n                                .appendTo(container);\n                            if (isInverted) {\n                                table.addClass(className.inverted);\n                            }\n                            var textColumns = columns;\n                            // no header for time-only mode\n                            if (!isTimeOnly) {\n                                var thead = $('<thead/>').appendTo(table);\n\n                                row = $('<tr/>').appendTo(thead);\n                                cell = $('<th/>').attr('colspan', '' + columns).appendTo(row);\n\n                                var headerDate = isYear || isMonth\n                                    ? new Date(year, 0, 1)\n                                    : (isDay\n                                        ? new Date(year, month, 1)\n                                        : new Date(year, month, day, hour, minute));\n                                var headerText = $('<span/>').addClass(className.link).appendTo(cell);\n                                headerText.text(module.helper.dateFormat(formatter[mode + 'Header'], headerDate));\n                                var newMode = isMonth\n                                    ? (settings.disableYear ? 'day' : 'year')\n                                    : (isDay\n                                        ? (settings.disableMonth ? 'year' : 'month') // eslint-disable-line unicorn/no-nested-ternary\n                                        : 'day');\n                                headerText.data(metadata.mode, newMode);\n\n                                if (p === 0) {\n                                    var prev = $('<span/>').addClass(className.prev).appendTo(cell);\n                                    prev.data(metadata.focusDate, prevDate);\n                                    prev.toggleClass(className.disabledCell, !module.helper.isDateInRange(prevLast, mode));\n                                    $('<i/>').addClass(className.prevIcon).appendTo(prev);\n                                }\n\n                                if (p === pages - 1) {\n                                    var next = $('<span/>').addClass(className.next).appendTo(cell);\n                                    next.data(metadata.focusDate, nextDate);\n                                    next.toggleClass(className.disabledCell, !module.helper.isDateInRange(nextFirst, mode));\n                                    $('<i/>').addClass(className.nextIcon).appendTo(next);\n                                }\n                                if (isDay) {\n                                    row = $('<tr/>').appendTo(thead);\n                                    if (settings.showWeekNumbers) {\n                                        cell = $('<th/>').appendTo(row);\n                                        cell.text(settings.text.weekNo);\n                                        cell.addClass(className.weekCell);\n                                        textColumns--;\n                                    }\n                                    for (i = 0; i < textColumns; i++) {\n                                        cell = $('<th/>').appendTo(row);\n                                        cell.text(formatter.dayColumnHeader((i + settings.firstDayOfWeek) % 7, settings));\n                                    }\n                                }\n                            }\n\n                            var tbody = $('<tbody/>').appendTo(table);\n                            i = isYear\n                                ? Math.ceil(year / 10) * 10 - 9\n                                : (isDay ? 1 - firstMonthDayColumn : 0);\n                            for (r = 0; r < rows; r++) {\n                                row = $('<tr/>').appendTo(tbody);\n                                if (isDay && settings.showWeekNumbers) {\n                                    cell = $('<th/>').appendTo(row);\n                                    cell.text(module.get.weekOfYear(year, month, i + 1 - settings.firstDayOfWeek));\n                                    cell.addClass(className.weekCell);\n                                }\n                                for (c = 0; c < textColumns; c++, i++) {\n                                    var cellDate = isYear\n                                        ? new Date(i, month, 1, hour, minute)\n                                        : (isMonth\n                                            ? new Date(year, i, 1, hour, minute)\n                                            : (isDay // eslint-disable-line unicorn/no-nested-ternary\n                                                ? new Date(year, month, i, hour, minute)\n                                                : (isHour\n                                                    ? new Date(year, month, day, i)\n                                                    : new Date(year, month, day, hour, i * settings.minTimeGap))));\n                                    var cellText = isYear\n                                        ? i\n                                        : (isMonth\n                                            ? settings.text.monthsShort[i]\n                                            : (isDay // eslint-disable-line unicorn/no-nested-ternary\n                                                ? cellDate.getDate()\n                                                : module.helper.dateFormat(formatter.cellTime, cellDate)));\n                                    cell = $('<td/>').addClass(className.cell).appendTo(row);\n                                    cell.text(cellText);\n                                    cell.data(metadata.date, cellDate);\n                                    var adjacent = isDay && cellDate.getMonth() !== ((month + 12) % 12);\n                                    var disabled = (!settings.selectAdjacentDays && adjacent) || !module.helper.isDateInRange(cellDate, mode) || settings.isDisabled(cellDate, mode) || module.helper.isDisabled(cellDate, mode) || !module.helper.isEnabled(cellDate, mode);\n                                    var eventDate;\n                                    if (disabled) {\n                                        var disabledDate = module.helper.findDayAsObject(cellDate, mode, settings.disabledDates);\n                                        if (disabledDate !== null && disabledDate[metadata.message]) {\n                                            cell.attr('data-tooltip', disabledDate[metadata.message]);\n                                            cell.attr('data-position', disabledDate[metadata.position] || tooltipPosition);\n                                            if (disabledDate[metadata.inverted] || (isInverted && disabledDate[metadata.inverted] === undefined)) {\n                                                cell.attr('data-inverted', '');\n                                            }\n                                            if (disabledDate[metadata.variation]) {\n                                                cell.attr('data-variation', disabledDate[metadata.variation]);\n                                            }\n                                        }\n                                        if (mode === 'hour') {\n                                            var disabledHour = module.helper.findHourAsObject(cellDate, mode, settings.disabledHours);\n                                            if (disabledHour !== null && disabledHour[metadata.message]) {\n                                                cell.attr('data-tooltip', disabledHour[metadata.message]);\n                                                cell.attr('data-position', disabledHour[metadata.position] || tooltipPosition);\n                                                if (disabledHour[metadata.inverted] || (isInverted && disabledHour[metadata.inverted] === undefined)) {\n                                                    cell.attr('data-inverted', '');\n                                                }\n                                                if (disabledHour[metadata.variation]) {\n                                                    cell.attr('data-variation', disabledHour[metadata.variation]);\n                                                }\n                                            }\n                                        }\n                                    } else {\n                                        eventDate = module.helper.findDayAsObject(cellDate, mode, settings.eventDates);\n                                        if (eventDate !== null) {\n                                            cell.addClass(eventDate[metadata.class] || settings.eventClass);\n                                            if (eventDate[metadata.message]) {\n                                                cell.attr('data-tooltip', eventDate[metadata.message]);\n                                                cell.attr('data-position', eventDate[metadata.position] || tooltipPosition);\n                                                if (eventDate[metadata.inverted] || (isInverted && eventDate[metadata.inverted] === undefined)) {\n                                                    cell.attr('data-inverted', '');\n                                                }\n                                                if (eventDate[metadata.variation]) {\n                                                    cell.attr('data-variation', eventDate[metadata.variation]);\n                                                }\n                                            }\n                                        }\n                                    }\n                                    var active = module.helper.dateEqual(cellDate, date, mode);\n                                    var isToday = module.helper.dateEqual(cellDate, today, mode);\n                                    cell.toggleClass(className.adjacentCell, adjacent && !eventDate);\n                                    cell.toggleClass(className.disabledCell, disabled);\n                                    cell.toggleClass(className.activeCell, active && !(adjacent && disabled));\n                                    if (!isHour && !isMinute) {\n                                        cell.toggleClass(className.todayCell, !adjacent && isToday);\n                                    }\n\n                                    // Allow for external modifications of each cell\n                                    var cellOptions = {\n                                        mode: mode,\n                                        adjacent: adjacent,\n                                        disabled: disabled,\n                                        active: active,\n                                        today: isToday,\n                                    };\n                                    formatter.cell(cell, cellDate, cellOptions);\n\n                                    if (module.helper.dateEqual(cellDate, focusDate, mode)) {\n                                        // ensure that the focus date is exactly equal to the cell date\n                                        // so that, if selected, the correct value is set\n                                        module.set.focusDate(cellDate, false, false);\n                                    }\n                                }\n                            }\n\n                            if (settings.today) {\n                                var todayRow = $('<tr/>').appendTo(tbody);\n                                var todayButton = $('<td/>').attr('colspan', '' + columns).addClass(className.today).appendTo(todayRow);\n                                todayButton.text(formatter.today(settings));\n                                todayButton.data(metadata.date, today);\n                            }\n\n                            module.update.focus(false, table);\n\n                            if (settings.inline) {\n                                module.refreshTooltips();\n                            }\n                        }\n                    },\n                },\n\n                update: {\n                    focus: function (updateRange, container) {\n                        container = container || $container;\n                        var mode = module.get.mode();\n                        var date = module.get.date();\n                        var focusDate = module.get.focusDate();\n                        var startDate = module.get.startDate();\n                        var endDate = module.get.endDate();\n                        var rangeDate = (updateRange ? focusDate : null) || date || (!isTouch ? focusDate : null);\n\n                        container.find('td').each(function () {\n                            var $cell = $(this);\n                            var cellDate = $cell.data(metadata.date);\n                            if (!cellDate) {\n                                return;\n                            }\n                            var disabled = $cell.hasClass(className.disabledCell);\n                            var active = $cell.hasClass(className.activeCell);\n                            var adjacent = $cell.hasClass(className.adjacentCell);\n                            var focused = module.helper.dateEqual(cellDate, focusDate, mode);\n                            var inRange = !rangeDate\n                                ? false\n                                : (!!startDate && module.helper.isDateInRange(cellDate, mode, startDate, rangeDate))\n                                    || (!!endDate && module.helper.isDateInRange(cellDate, mode, rangeDate, endDate));\n                            $cell.toggleClass(className.focusCell, focused && (!isTouch || isTouchDown) && (!adjacent || (settings.selectAdjacentDays && adjacent)) && !disabled);\n\n                            if (module.helper.isTodayButton($cell)) {\n                                return;\n                            }\n                            $cell.toggleClass(className.rangeCell, inRange && !active && !disabled);\n                        });\n                    },\n                },\n\n                refresh: function () {\n                    module.create.calendar();\n                },\n\n                refreshTooltips: function () {\n                    var winWidth = $(window).width();\n                    $container.find('td[data-position]').each(function () {\n                        var $cell = $(this);\n                        var tooltipWidth = window.getComputedStyle($cell[0], '::after').width.replace(/[^\\d.]/g, '');\n                        var tooltipPosition = $cell.attr('data-position');\n                        // use a fallback width of 250 (calendar width) for IE/Edge (which return \"auto\")\n                        var calcPosition = (winWidth - $cell.width() - (parseInt(tooltipWidth, 10) || 250)) > $cell.offset().left ? 'right' : 'left';\n                        if (tooltipPosition.indexOf(calcPosition) === -1) {\n                            $cell.attr('data-position', tooltipPosition.replace(/(left|right)/, calcPosition));\n                        }\n                    });\n                },\n\n                bind: {\n                    events: function () {\n                        module.debug('Binding events');\n                        $container.on('mousedown' + eventNamespace, module.event.mousedown);\n                        $container.on('touchstart' + eventNamespace, module.event.mousedown);\n                        $container.on('mouseup' + eventNamespace, module.event.mouseup);\n                        $container.on('touchend' + eventNamespace, module.event.mouseup);\n                        $container.on('mouseover' + eventNamespace, module.event.mouseover);\n                        if ($input.length > 0) {\n                            $input.on('input' + eventNamespace, module.event.inputChange);\n                            $input.on('focus' + eventNamespace, module.event.inputFocus);\n                            $input.on('blur' + eventNamespace, module.event.inputBlur);\n                            $input.on('keydown' + eventNamespace, module.event.keydown);\n                        } else {\n                            $container.on('keydown' + eventNamespace, module.event.keydown);\n                        }\n                    },\n                },\n\n                unbind: {\n                    events: function () {\n                        module.debug('Unbinding events');\n                        $container.off(eventNamespace);\n                        if ($input.length > 0) {\n                            $input.off(eventNamespace);\n                        }\n                    },\n                },\n\n                event: {\n                    mouseover: function (event) {\n                        var target = $(event.target);\n                        var date = target.data(metadata.date);\n                        var mousedown = event.buttons === 1;\n                        if (date) {\n                            module.set.focusDate(date, false, true, mousedown);\n                        }\n                    },\n                    mousedown: function (event) {\n                        if ($input.length > 0) {\n                            // prevent the mousedown on the calendar causing the input to lose focus\n                            event.preventDefault();\n                        }\n                        isTouchDown = event.type.indexOf('touch') >= 0;\n                        var target = $(event.target);\n                        var date = target.data(metadata.date);\n                        if (date) {\n                            module.set.focusDate(date, false, true, true);\n                        }\n                    },\n                    mouseup: function (event) {\n                        // ensure input has focus so that it receives keydown events for calendar navigation\n                        module.focus();\n                        event.preventDefault();\n                        event.stopPropagation();\n                        isTouchDown = false;\n                        var target = $(event.target);\n                        if (target.hasClass('disabled')) {\n                            return;\n                        }\n                        var parent = target.parent();\n                        if (parent.data(metadata.date) || parent.data(metadata.focusDate) || parent.data(metadata.mode)) {\n                            // clicked on a child element, switch to parent (used when clicking directly on prev/next <i> icon element)\n                            target = parent;\n                        }\n                        var date = target.data(metadata.date);\n                        var focusDate = target.data(metadata.focusDate);\n                        var mode = target.data(metadata.mode);\n                        if (date && settings.onSelect.call(element, date, module.get.mode()) !== false) {\n                            var forceSet = target.hasClass(className.today);\n                            module.selectDate(date, forceSet);\n                        } else if (focusDate) {\n                            module.set.focusDate(focusDate);\n                        } else if (mode) {\n                            module.set.mode(mode);\n                        }\n                    },\n                    keydown: function (event) {\n                        var keyCode = event.which;\n                        if (keyCode === 9) {\n                            // tab\n                            module.popup('hide');\n                        }\n\n                        if (module.popup('is visible')) {\n                            var mode = module.get.mode();\n                            switch (keyCode) {\n                                // arrow keys\n                                case 37:\n                                case 38:\n                                case 39:\n                                case 40: {\n                                    var bigIncrement = mode === 'day'\n                                        ? 7\n                                        : (mode === 'hour'\n                                            ? 4\n                                            : (mode === 'minute' ? timeGap.column : 3)); // eslint-disable-line unicorn/no-nested-ternary\n                                    var increment = keyCode === 37\n                                        ? -1\n                                        : (keyCode === 38\n                                            ? -bigIncrement\n                                            : (keyCode === 39 ? 1 : bigIncrement)); // eslint-disable-line unicorn/no-nested-ternary\n                                    increment *= mode === 'minute' ? settings.minTimeGap : 1;\n                                    var focusDate = module.get.focusDate() || module.get.date() || new Date();\n                                    var year = focusDate.getFullYear() + (mode === 'year' ? increment : 0);\n                                    var month = focusDate.getMonth() + (mode === 'month' ? increment : 0);\n                                    var day = focusDate.getDate() + (mode === 'day' ? increment : 0);\n                                    var hour = focusDate.getHours() + (mode === 'hour' ? increment : 0);\n                                    var minute = focusDate.getMinutes() + (mode === 'minute' ? increment : 0);\n                                    var newFocusDate = new Date(year, month, day, hour, minute);\n                                    if (settings.type === 'time') {\n                                        newFocusDate = module.helper.mergeDateTime(focusDate, newFocusDate);\n                                    }\n                                    if (module.helper.isDateInRange(newFocusDate, mode)) {\n                                        module.set.focusDate(newFocusDate);\n                                    }\n\n                                    break;\n                                }\n                                // enter key\n                                case 13: {\n                                    var date = module.get.focusDate();\n                                    if (date && !settings.isDisabled(date, mode) && !module.helper.isDisabled(date, mode) && module.helper.isEnabled(date, mode)) {\n                                        if (settings.onSelect.call(element, date, module.get.mode()) !== false) {\n                                            module.selectDate(date);\n                                        }\n                                    }\n                                    // disable form submission:\n                                    event.preventDefault();\n                                    event.stopPropagation();\n\n                                    break;\n                                }\n                                // escape key\n                                case 27: {\n                                    module.popup('hide');\n                                    event.stopPropagation();\n\n                                    break;\n                                }\n                            }\n                        }\n\n                        if (keyCode === 38 || keyCode === 40) {\n                            // arrow-up || arrow-down\n                            event.preventDefault(); // don't scroll\n                            module.popup('show');\n                        }\n                    },\n                    inputChange: function () {\n                        var val = $input.val();\n                        var date = parser.date(val, settings);\n                        module.set.date(date, false);\n                    },\n                    inputFocus: function () {\n                        $container.addClass(className.active);\n                    },\n                    inputBlur: function () {\n                        $container.removeClass(className.active);\n                        if (settings.formatInput) {\n                            var date = module.get.date();\n                            var text = module.helper.dateFormat(formatter[settings.type], date);\n                            $input.val(text);\n                        }\n                        if (selectionComplete) {\n                            module.trigger.change();\n                            selectionComplete = false;\n                        }\n                    },\n                    class: {\n                        mutation: function (mutations) {\n                            mutations.forEach(function (mutation) {\n                                if (mutation.attributeName === 'class') {\n                                    module.check.disabled();\n                                }\n                            });\n                        },\n                    },\n                },\n\n                observeChanges: function () {\n                    if ('MutationObserver' in window) {\n                        classObserver = new MutationObserver(module.event.class.mutation);\n                        module.debug('Setting up mutation observer', classObserver);\n                        module.observe.class();\n                    }\n                },\n\n                disconnect: {\n                    classObserver: function () {\n                        if ($input.length > 0 && classObserver) {\n                            classObserver.disconnect();\n                        }\n                    },\n                },\n\n                observe: {\n                    class: function () {\n                        if ($input.length > 0 && classObserver) {\n                            classObserver.observe($module[0], {\n                                attributes: true,\n                            });\n                        }\n                    },\n                },\n\n                is: {\n                    disabled: function () {\n                        return $module.hasClass(className.disabled);\n                    },\n                },\n\n                check: {\n                    disabled: function () {\n                        $input.attr('tabindex', module.is.disabled() ? -1 : 0);\n                    },\n                },\n\n                get: {\n                    weekOfYear: function (weekYear, weekMonth, weekDay) {\n                        // adapted from http://www.merlyn.demon.co.uk/weekcalc.htm\n                        var ms1d = 24 * 3600 * 1000,\n                            ms7d = 7 * ms1d,\n                            DC3 = Date.UTC(weekYear, weekMonth, weekDay + 3) / ms1d, // an absolute day number\n                            AWN = Math.floor(DC3 / 7), // an absolute week number\n                            Wyr = new Date(AWN * ms7d).getUTCFullYear()\n                        ;\n\n                        return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;\n                    },\n                    formattedDate: function (format, date) {\n                        return module.helper.dateFormat(format || formatter[settings.type], date || module.get.date());\n                    },\n                    date: function (format) {\n                        return module.helper.dateObjectOrFormatted(format, $module.data(metadata.date));\n                    },\n                    inputDate: function () {\n                        return $input.val();\n                    },\n                    focusDate: function (format) {\n                        return module.helper.dateObjectOrFormatted(format, $module.data(metadata.focusDate));\n                    },\n                    startDate: function (format) {\n                        var startModule = module.get.calendarModule(settings.startCalendar);\n\n                        if (startModule) {\n                            return startModule.get.date(format);\n                        }\n\n                        return module.helper.dateObjectOrFormatted(format, $module.data(metadata.startDate));\n                    },\n                    endDate: function (format) {\n                        var endModule = module.get.calendarModule(settings.endCalendar);\n\n                        if (endModule) {\n                            return endModule.get.date(format);\n                        }\n\n                        return module.helper.dateObjectOrFormatted(format, $module.data(metadata.endDate));\n                    },\n                    minDate: function () {\n                        return $module.data(metadata.minDate) || null;\n                    },\n                    maxDate: function () {\n                        return $module.data(metadata.maxDate) || null;\n                    },\n                    monthOffset: function () {\n                        return $module.data(metadata.monthOffset) || settings.monthOffset || 0;\n                    },\n                    mode: function () {\n                        // only returns valid modes for the current settings\n                        var mode = $module.data(metadata.mode) || settings.startMode;\n\n                        return module.get.validatedMode(mode);\n                    },\n                    validatedMode: function (mode) {\n                        var validModes = module.get.validModes();\n                        if ($.inArray(mode, validModes) >= 0) {\n                            return mode;\n                        }\n\n                        return settings.type === 'time'\n                            ? 'hour'\n                            : (settings.type === 'month'\n                                ? 'month'\n                                : (settings.type === 'year' ? 'year' : 'day')); // eslint-disable-line unicorn/no-nested-ternary\n                    },\n                    type: function () {\n                        return $module.data(metadata.type) || settings.type;\n                    },\n                    validModes: function () {\n                        var validModes = [];\n                        if (settings.type !== 'time') {\n                            if (!settings.disableYear || settings.type === 'year') {\n                                validModes.push('year');\n                            }\n                            if (!(settings.disableMonth || settings.type === 'year') || settings.type === 'month') {\n                                validModes.push('month');\n                            }\n                            if (settings.type.indexOf('date') >= 0) {\n                                validModes.push('day');\n                            }\n                        }\n                        if (settings.type.indexOf('time') >= 0) {\n                            validModes.push('hour');\n                            if (!settings.disableMinute) {\n                                validModes.push('minute');\n                            }\n                        }\n\n                        return validModes;\n                    },\n                    isTouch: function () {\n                        try {\n                            document.createEvent('TouchEvent');\n\n                            return true;\n                        } catch (e) {\n                            return false;\n                        }\n                    },\n                    calendarModule: function (selector) {\n                        if (!selector) {\n                            return null;\n                        }\n                        if (!(selector instanceof $)) {\n                            selector = $document.find(selector).first();\n                        }\n\n                        // assume range related calendars are using the same namespace\n                        return selector.data(moduleNamespace);\n                    },\n                },\n\n                set: {\n                    date: function (date, updateInput, fireChange) {\n                        updateInput = updateInput !== false;\n                        fireChange = fireChange !== false;\n                        date = module.helper.sanitiseDate(date);\n                        date = module.helper.dateInRange(date);\n\n                        var mode = module.get.mode();\n                        var text = module.helper.dateFormat(formatter[settings.type], date);\n\n                        if (fireChange && settings.onBeforeChange.call(element, date, text, mode) === false) {\n                            return false;\n                        }\n\n                        module.set.focusDate(date);\n\n                        if (settings.isDisabled(date, mode)) {\n                            return false;\n                        }\n\n                        var endDate = module.get.endDate();\n                        if (!!endDate && !!date && date > endDate) {\n                            // selected date is greater than end date in range, so clear end date\n                            module.set.endDate();\n                        }\n                        module.set.dataKeyValue(metadata.date, date);\n\n                        if (updateInput && $input.length > 0) {\n                            $input.val(text);\n                        }\n\n                        if (fireChange) {\n                            settings.onChange.call(element, date, text, mode);\n                        }\n                    },\n                    startDate: function (date, refreshCalendar) {\n                        date = module.helper.sanitiseDate(date);\n                        var startModule = module.get.calendarModule(settings.startCalendar);\n                        if (startModule) {\n                            startModule.set.date(date);\n                        }\n                        module.set.dataKeyValue(metadata.startDate, date, refreshCalendar);\n                    },\n                    endDate: function (date, refreshCalendar) {\n                        date = module.helper.sanitiseDate(date);\n                        var endModule = module.get.calendarModule(settings.endCalendar);\n                        if (endModule) {\n                            endModule.set.date(date);\n                        }\n                        module.set.dataKeyValue(metadata.endDate, date, refreshCalendar);\n                    },\n                    focusDate: function (date, refreshCalendar, updateFocus, updateRange) {\n                        date = module.helper.sanitiseDate(date);\n                        date = module.helper.dateInRange(date);\n                        var isDay = module.get.mode() === 'day';\n                        var oldFocusDate = module.get.focusDate();\n                        if (isDay && date && oldFocusDate) {\n                            var yearDelta = date.getFullYear() - oldFocusDate.getFullYear();\n                            var monthDelta = yearDelta * 12 + date.getMonth() - oldFocusDate.getMonth();\n                            if (monthDelta) {\n                                var monthOffset = module.get.monthOffset() - monthDelta;\n                                module.set.monthOffset(monthOffset, false);\n                            }\n                        }\n                        var changed = module.set.dataKeyValue(metadata.focusDate, date, !!date && refreshCalendar);\n                        updateFocus = (updateFocus !== false && changed && refreshCalendar === false) || focusDateUsedForRange != updateRange;\n                        focusDateUsedForRange = updateRange;\n                        if (updateFocus) {\n                            module.update.focus(updateRange);\n                        }\n                    },\n                    minDate: function (date) {\n                        date = module.helper.sanitiseDate(date);\n                        if (settings.maxDate !== null && settings.maxDate <= date) {\n                            module.verbose('Unable to set minDate variable bigger that maxDate variable', date, settings.maxDate);\n                        } else {\n                            module.setting('minDate', date);\n                            module.set.dataKeyValue(metadata.minDate, date);\n                        }\n                    },\n                    maxDate: function (date) {\n                        date = module.helper.sanitiseDate(date);\n                        if (settings.minDate !== null && settings.minDate >= date) {\n                            module.verbose('Unable to set maxDate variable lower that minDate variable', date, settings.minDate);\n                        } else {\n                            module.setting('maxDate', date);\n                            module.set.dataKeyValue(metadata.maxDate, date);\n                        }\n                    },\n                    monthOffset: function (monthOffset, refreshCalendar) {\n                        var multiMonth = Math.max(settings.multiMonth, 1);\n                        monthOffset = Math.max(1 - multiMonth, Math.min(0, monthOffset));\n                        module.set.dataKeyValue(metadata.monthOffset, monthOffset, refreshCalendar);\n                    },\n                    mode: function (mode, refreshCalendar) {\n                        module.set.dataKeyValue(metadata.mode, mode, refreshCalendar);\n                    },\n                    dataKeyValue: function (key, value, refreshCalendar) {\n                        var oldValue = $module.data(key);\n                        var equal = oldValue === value || (oldValue <= value && oldValue >= value); // equality test for dates and string objects\n                        if (value) {\n                            $module.data(key, value);\n                        } else {\n                            $module.removeData(key);\n                        }\n                        refreshCalendar = refreshCalendar !== false && !equal;\n                        if (refreshCalendar) {\n                            module.refresh();\n                        }\n\n                        return !equal;\n                    },\n                },\n\n                selectDate: function (date, forceSet) {\n                    module.verbose('New date selection', date);\n                    var mode = module.get.mode();\n                    var complete = forceSet || mode === 'minute'\n                        || (settings.disableMinute && mode === 'hour')\n                        || (settings.type === 'date' && mode === 'day')\n                        || (settings.type === 'month' && mode === 'month')\n                        || (settings.type === 'year' && mode === 'year');\n                    if (complete) {\n                        var canceled = module.set.date(date) === false;\n                        if (!canceled) {\n                            selectionComplete = true;\n                            if (settings.closable) {\n                                module.popup('hide');\n                                // if this is a range calendar, focus the container or input. This will open the popup from its event listeners.\n                                var endModule = module.get.calendarModule(settings.endCalendar);\n                                if (endModule) {\n                                    endModule.refresh();\n                                    if (endModule.setting('on') !== 'focus') {\n                                        endModule.popup('show');\n                                    }\n                                    endModule.focus();\n                                }\n                            }\n                        }\n                    } else {\n                        var newMode = mode === 'year'\n                            ? (!settings.disableMonth ? 'month' : 'day')\n                            : (mode === 'month'\n                                ? 'day'\n                                : (mode === 'day' ? 'hour' : 'minute')); // eslint-disable-line unicorn/no-nested-ternary\n                        module.set.mode(newMode);\n                        if (mode === 'hour' || (mode === 'day' && module.get.date())) {\n                            // the user has chosen enough to consider a valid date/time has been chosen\n                            module.set.date(date, true, false);\n                        } else {\n                            module.set.focusDate(date);\n                        }\n                    }\n                },\n\n                changeDate: function (date) {\n                    module.set.date(date);\n                },\n\n                clear: function () {\n                    module.set.date();\n                },\n\n                popup: function () {\n                    return $activator.popup.apply($activator, arguments);\n                },\n\n                focus: function () {\n                    if ($input.length > 0) {\n                        $input.trigger('focus');\n                    } else {\n                        $container.trigger('focus');\n                    }\n                },\n                blur: function () {\n                    if ($input.length > 0) {\n                        $input.trigger('blur');\n                    } else {\n                        $container.trigger('blur');\n                    }\n                },\n\n                helper: {\n                    dateFormat: function (format, date) {\n                        if (!(date instanceof Date)) {\n                            return '';\n                        }\n                        if (typeof format === 'function') {\n                            return format.call(module, date, settings);\n                        }\n\n                        var\n                            D = date.getDate(),\n                            M = date.getMonth(),\n                            Y = date.getFullYear(),\n                            d = date.getDay(),\n                            H = date.getHours(),\n                            m = date.getMinutes(),\n                            s = date.getSeconds(),\n                            w = module.get.weekOfYear(Y, M, D + 1 - settings.firstDayOfWeek),\n                            h = H % 12 || 12,\n                            a = H < 12 ? settings.text.am.toLowerCase() : settings.text.pm.toLowerCase(),\n                            tokens = {\n                                D: D,\n                                DD: ('0' + D).slice(-2),\n                                M: M + 1,\n                                MM: ('0' + (M + 1)).slice(-2),\n                                MMM: settings.text.monthsShort[M],\n                                MMMM: settings.text.months[M],\n                                Y: Y,\n                                YY: String(Y).slice(2),\n                                YYYY: Y,\n                                d: d,\n                                dd: settings.text.dayNamesShort[d].slice(0, 2),\n                                ddd: settings.text.dayNamesShort[d],\n                                dddd: settings.text.dayNames[d],\n                                h: h,\n                                hh: ('0' + h).slice(-2),\n                                H: H,\n                                HH: ('0' + H).slice(-2),\n                                m: m,\n                                mm: ('0' + m).slice(-2),\n                                s: s,\n                                ss: ('0' + s).slice(-2),\n                                a: a,\n                                A: a.toUpperCase(),\n                                S: ['th', 'st', 'nd', 'rd'][(D % 10) > 3 ? 0 : ((D % 100) - (D % 10) === 10 ? 0 : D % 10)],\n                                w: w,\n                                ww: ('0' + w).slice(-2),\n                            }\n                        ;\n\n                        return format.replace(settings.regExp.token, function (match) {\n                            if (match in tokens) {\n                                return tokens[match];\n                            }\n\n                            return match.slice(1, -1);\n                        });\n                    },\n                    dateObjectOrFormatted: function (format, date) {\n                        format = format || '';\n                        date = module.helper.sanitiseDate(date) || null;\n\n                        if (!date) {\n                            return null;\n                        }\n\n                        if (format === '') {\n                            return date;\n                        }\n\n                        return module.helper.dateFormat(format, date);\n                    },\n                    isDisabled: function (date, mode) {\n                        return (mode === 'day' || mode === 'month' || mode === 'year' || mode === 'hour') && (((mode === 'day' && settings.disabledDaysOfWeek.indexOf(date.getDay()) !== -1) || settings.disabledDates.some(function (d) {\n                            var blocked = false;\n\n                            if (typeof d === 'string') {\n                                d = module.helper.sanitiseDate(d);\n                            }\n                            if (d instanceof Date) {\n                                blocked = module.helper.dateEqual(date, d, mode);\n                            } else if (d !== null && typeof d === 'object') {\n                                if (d[metadata.year]) {\n                                    if (typeof d[metadata.year] === 'number') {\n                                        blocked = date.getFullYear() === d[metadata.year];\n                                    } else if (Array.isArray(d[metadata.year])) {\n                                        blocked = d[metadata.year].indexOf(date.getFullYear()) > -1;\n                                    }\n                                } else if (d[metadata.month]) {\n                                    if (typeof d[metadata.month] === 'number') {\n                                        blocked = date.getMonth() === d[metadata.month];\n                                    } else if (Array.isArray(d[metadata.month])) {\n                                        blocked = d[metadata.month].indexOf(date.getMonth()) > -1;\n                                    } else if (d[metadata.month] instanceof Date) {\n                                        var sdate = module.helper.sanitiseDate(d[metadata.month]);\n\n                                        blocked = (date.getMonth() === sdate.getMonth()) && (date.getFullYear() === sdate.getFullYear());\n                                    }\n                                } else if (d[metadata.date] && mode === 'day') {\n                                    if (d[metadata.date] instanceof Date) {\n                                        blocked = module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode);\n                                    } else if (Array.isArray(d[metadata.date])) {\n                                        blocked = d[metadata.date].some(function (idate) {\n                                            return module.helper.dateEqual(date, idate, mode);\n                                        });\n                                    }\n                                }\n                            }\n\n                            return blocked;\n                        })) || (mode === 'hour' && settings.disabledHours.some(function (d) {\n                            var blocked = false;\n\n                            if (typeof d === 'string') {\n                                d = module.helper.sanitiseDate(d);\n                            }\n                            if (d instanceof Date) {\n                                blocked = module.helper.dateEqual(date, d, mode);\n                            } else if (typeof d === 'number') {\n                                blocked = date.getHours() === d;\n                            } else if (d !== null && typeof d === 'object') {\n                                if (d[metadata.date]) {\n                                    if (d[metadata.date] instanceof Date) {\n                                        blocked = module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]));\n                                    } else if (Array.isArray(d[metadata.date])) {\n                                        blocked = d[metadata.date].some(function (idate) {\n                                            return module.helper.dateEqual(date, idate, mode);\n                                        });\n                                    }\n                                }\n\n                                if (d[metadata.days]) {\n                                    if (typeof d[metadata.days] === 'number') {\n                                        blocked = date.getDay() === d[metadata.days];\n                                    } else if (Array.isArray(d[metadata.days])) {\n                                        blocked = d[metadata.days].indexOf(date.getDay()) > -1;\n                                    }\n                                }\n\n                                if (d[metadata.hours]) {\n                                    if (typeof d[metadata.hours] === 'number') {\n                                        blocked = blocked && date.getHours() === d[metadata.hours];\n                                    } else if (Array.isArray(d[metadata.hours])) {\n                                        blocked = blocked && d[metadata.hours].indexOf(date.getHours()) > -1;\n                                    }\n                                }\n                            }\n\n                            return blocked;\n                        })));\n                    },\n                    isEnabled: function (date, mode) {\n                        if (mode === 'day') {\n                            return settings.enabledDates.length === 0 || settings.enabledDates.some(function (d) {\n                                var enabled = false;\n\n                                if (typeof d === 'string') {\n                                    d = module.helper.sanitiseDate(d);\n                                }\n                                if (d instanceof Date) {\n                                    enabled = module.helper.dateEqual(date, d, mode);\n                                } else if (d !== null && typeof d === 'object' && d[metadata.date]) {\n                                    enabled = module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode);\n                                }\n\n                                return enabled;\n                            });\n                        }\n\n                        return true;\n                    },\n                    findDayAsObject: function (date, mode, dates) {\n                        if (mode === 'day' || mode === 'month' || mode === 'year') {\n                            var d;\n                            for (var i = 0; i < dates.length; i++) {\n                                d = dates[i];\n                                if (typeof d === 'string') {\n                                    d = module.helper.sanitiseDate(d);\n                                }\n                                if (d instanceof Date && module.helper.dateEqual(date, d, mode)) {\n                                    var dateObject = {};\n                                    dateObject[metadata.date] = d;\n\n                                    return dateObject;\n                                }\n                                if (d !== null && typeof d === 'object') {\n                                    if (d[metadata.year]) {\n                                        if (typeof d[metadata.year] === 'number' && date.getFullYear() === d[metadata.year]) {\n                                            return d;\n                                        }\n                                        if (Array.isArray(d[metadata.year])) {\n                                            if (d[metadata.year].indexOf(date.getFullYear()) > -1) {\n                                                return d;\n                                            }\n                                        }\n                                    } else if (d[metadata.month]) {\n                                        if (typeof d[metadata.month] === 'number' && date.getMonth() === d[metadata.month]) {\n                                            return d;\n                                        }\n                                        if (Array.isArray(d[metadata.month])) {\n                                            if (d[metadata.month].indexOf(date.getMonth()) > -1) {\n                                                return d;\n                                            }\n                                        } else if (d[metadata.month] instanceof Date) {\n                                            var sdate = module.helper.sanitiseDate(d[metadata.month]);\n                                            if ((date.getMonth() === sdate.getMonth()) && (date.getFullYear() === sdate.getFullYear())) {\n                                                return d;\n                                            }\n                                        }\n                                    } else if (d[metadata.date] && mode === 'day') {\n                                        if (d[metadata.date] instanceof Date && module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode)) {\n                                            return d;\n                                        }\n                                        if (Array.isArray(d[metadata.date])) {\n                                            if (d[metadata.date].some(function (idate) {\n                                                return module.helper.dateEqual(date, idate, mode);\n                                            })) {\n                                                return d;\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n\n                        return null;\n                    },\n                    findHourAsObject: function (date, mode, hours) {\n                        if (mode === 'hour') {\n                            var d;\n                            var hourCheck = function (date, d) {\n                                if (d[metadata.hours]) {\n                                    if (typeof d[metadata.hours] === 'number' && date.getHours() === d[metadata.hours]) {\n                                        return d;\n                                    }\n                                    if (Array.isArray(d[metadata.hours])) {\n                                        if (d[metadata.hours].indexOf(date.getHours()) > -1) {\n                                            return d;\n                                        }\n                                    }\n                                }\n                            };\n                            for (var i = 0; i < hours.length; i++) {\n                                d = hours[i];\n                                if (typeof d === 'number' && date.getHours() === d) {\n                                    return null;\n                                }\n                                if (d !== null && typeof d === 'object') {\n                                    if (d[metadata.days] && hourCheck(date, d)) {\n                                        if (typeof d[metadata.days] === 'number' && date.getDay() === d[metadata.days]) {\n                                            return d;\n                                        }\n                                        if (Array.isArray(d[metadata.days])) {\n                                            if (d[metadata.days].indexOf(date.getDay()) > -1) {\n                                                return d;\n                                            }\n                                        }\n                                    } else if (d[metadata.date] && hourCheck(date, d)) {\n                                        if (d[metadata.date] instanceof Date && module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]))) {\n                                            return d;\n                                        }\n                                        if (Array.isArray(d[metadata.date])) {\n                                            if (d[metadata.date].some(function (idate) {\n                                                return module.helper.dateEqual(date, idate, mode);\n                                            })) {\n                                                return d;\n                                            }\n                                        }\n                                    } else if (hourCheck(date, d)) {\n                                        return d;\n                                    }\n                                }\n                            }\n                        }\n\n                        return null;\n                    },\n                    sanitiseDate: function (date) {\n                        if (!(date instanceof Date)) {\n                            date = parser.date('' + date, settings);\n                        }\n                        if (!date || isNaN(date.getTime())) {\n                            return null;\n                        }\n\n                        return date;\n                    },\n                    dateDiff: function (date1, date2, mode) {\n                        if (!mode) {\n                            mode = 'day';\n                        }\n\n                        var isTimeOnly = settings.type === 'time';\n                        var isYear = mode === 'year';\n                        var isYearOrMonth = isYear || mode === 'month';\n                        var isMinute = mode === 'minute';\n                        var isHourOrMinute = isMinute || mode === 'hour';\n                        // only care about a minute accuracy of settings.minTimeGap\n                        date1 = new Date(\n                            isTimeOnly ? 2000 : date1.getFullYear(),\n                            isTimeOnly ? 0 : (isYear ? 0 : date1.getMonth()),\n                            isTimeOnly ? 1 : (isYearOrMonth ? 1 : date1.getDate()),\n                            !isHourOrMinute ? 0 : date1.getHours(),\n                            !isMinute ? 0 : settings.minTimeGap * Math.floor(date1.getMinutes() / settings.minTimeGap)\n                        );\n                        date2 = new Date(\n                            isTimeOnly ? 2000 : date2.getFullYear(),\n                            isTimeOnly ? 0 : (isYear ? 0 : date2.getMonth()),\n                            isTimeOnly ? 1 : (isYearOrMonth ? 1 : date2.getDate()),\n                            !isHourOrMinute ? 0 : date2.getHours(),\n                            !isMinute ? 0 : settings.minTimeGap * Math.floor(date2.getMinutes() / settings.minTimeGap)\n                        );\n\n                        return date2.getTime() - date1.getTime();\n                    },\n                    dateEqual: function (date1, date2, mode) {\n                        return !!date1 && !!date2 && module.helper.dateDiff(date1, date2, mode) === 0;\n                    },\n                    isDateInRange: function (date, mode, minDate, maxDate) {\n                        if (!minDate && !maxDate) {\n                            var startDate = module.get.startDate();\n                            minDate = startDate && settings.minDate ? new Date(Math.max(startDate, settings.minDate)) : startDate || settings.minDate;\n                            maxDate = settings.maxDate;\n                        }\n                        minDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), minDate.getHours(), settings.minTimeGap * Math.ceil(minDate.getMinutes() / settings.minTimeGap));\n\n                        return !(!date\n                            || (minDate && module.helper.dateDiff(date, minDate, mode) > 0)\n                            || (maxDate && module.helper.dateDiff(maxDate, date, mode) > 0));\n                    },\n                    dateInRange: function (date, minDate, maxDate) {\n                        if (!minDate && !maxDate) {\n                            var startDate = module.get.startDate();\n                            minDate = startDate && settings.minDate ? new Date(Math.max(startDate, settings.minDate)) : startDate || settings.minDate;\n                            maxDate = settings.maxDate;\n                        }\n                        minDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), minDate.getHours(), settings.minTimeGap * Math.ceil(minDate.getMinutes() / settings.minTimeGap));\n                        var isTimeOnly = settings.type === 'time';\n\n                        return !date\n                            ? date\n                            : (minDate && module.helper.dateDiff(date, minDate, 'minute') > 0\n                                ? (isTimeOnly ? module.helper.mergeDateTime(date, minDate) : minDate) // eslint-disable-line unicorn/no-nested-ternary\n                                : (maxDate && module.helper.dateDiff(maxDate, date, 'minute') > 0 // eslint-disable-line unicorn/no-nested-ternary\n                                    ? (isTimeOnly ? module.helper.mergeDateTime(date, maxDate) : maxDate)\n                                    : date));\n                    },\n                    mergeDateTime: function (date, time) {\n                        return !date || !time\n                            ? time\n                            : new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes());\n                    },\n                    isTodayButton: function (element) {\n                        return element.text() === settings.text.today;\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.calendar.settings = {\n\n        name: 'Calendar',\n        namespace: 'calendar',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        context: false,\n\n        type: 'datetime', // picker type, can be 'datetime', 'date', 'time', 'month', or 'year'\n        firstDayOfWeek: 0, // day for first day column (0 = Sunday)\n        constantHeight: true, // add rows to shorter months to keep day calendar height consistent (6 rows)\n        today: false, // show a 'today/now' button at the bottom of the calendar\n        closable: true, // close the popup after selecting a date/time\n        monthFirst: true, // month before day when parsing date from text\n        touchReadonly: true, // set input to readonly on touch devices\n        inline: false, // create the calendar inline instead of inside a popup\n        on: null, // when to show the popup (defaults to 'focus' for input, 'click' for others)\n        initialDate: null, // date to display initially when no date is selected (null = now)\n        startMode: false, // display mode to start in, can be 'year', 'month', 'day', 'hour', 'minute' (false = 'day')\n        minDate: null, // minimum date/time that can be selected, dates/times before are disabled\n        maxDate: null, // maximum date/time that can be selected, dates/times after are disabled\n        disableYear: false, // disable year selection mode\n        disableMonth: false, // disable month selection mode\n        disableMinute: false, // disable minute selection mode\n        formatInput: true, // format the input text upon input blur and module creation\n        startCalendar: null, // jquery object or selector for another calendar that represents the start date of a date range\n        endCalendar: null, // jquery object or selector for another calendar that represents the end date of a date range\n        multiMonth: 1, // show multiple months when in 'day' mode\n        monthOffset: 0, // position current month by offset when multimonth > 1\n        minTimeGap: 5,\n        showWeekNumbers: false, // show Number of Week at the very first column of a dayView\n        disabledHours: [], // specific hour(s) which won't be selectable and contain additional information.\n        disabledDates: [], // specific day(s) which won't be selectable and contain additional information.\n        disabledDaysOfWeek: [], // day(s) which won't be selectable(s) (0 = Sunday)\n        enabledDates: [], // specific day(s) which will be selectable, all other days will be disabled\n        eventDates: [], // specific day(s) which will be shown in a different color and using tooltips\n        centuryBreak: 60, // starting short year until 99 where it will be assumed to belong to the last century\n        currentCentury: 2000, // century to be added to 2-digit years (00 to {centuryBreak}-1)\n        selectAdjacentDays: false, // The calendar can show dates from adjacent month. These adjacent month dates can also be made selectable.\n        // popup options ('popup', 'on', 'hoverable', and show/hide callbacks are overridden)\n        popupOptions: {\n            position: 'bottom left',\n            lastResort: 'bottom left',\n            prefer: 'opposite',\n            observeChanges: false,\n            hideOnScroll: false,\n        },\n\n        text: {\n            days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n            dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n            dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n            months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n            monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n            today: 'Today',\n            now: 'Now',\n            am: 'AM',\n            pm: 'PM',\n            weekNo: 'Week',\n        },\n\n        formatter: {\n            yearHeader: function (date, settings) {\n                var decadeYear = Math.ceil(date.getFullYear() / 10) * 10;\n\n                return (decadeYear - 9) + ' - ' + (decadeYear + 2);\n            },\n            monthHeader: 'YYYY',\n            dayHeader: 'MMMM YYYY',\n            hourHeader: 'MMMM D, YYYY',\n            minuteHeader: 'MMMM D, YYYY',\n            dayColumnHeader: function (day, settings) {\n                return settings.text.days[day];\n            },\n            datetime: 'MMMM D, YYYY h:mm A',\n            date: 'MMMM D, YYYY',\n            time: 'h:mm A',\n            cellTime: 'h:mm A',\n            month: 'MMMM YYYY',\n            year: 'YYYY',\n            today: function (settings) {\n                return settings.type === 'date' ? settings.text.today : settings.text.now;\n            },\n            cell: function (cell, date, cellOptions) {},\n        },\n\n        parser: {\n            date: function (text, settings) {\n                if (text instanceof Date) {\n                    return text;\n                }\n                if (!text) {\n                    return null;\n                }\n                text = String(text).trim().replace(/([./:-])\\s+/g, '$1').replace(/\\s+([./:-])/g, '$1')\n                    .replace(/\\s+/g, ' ');\n                if (text.length === 0) {\n                    return null;\n                }\n                if (/^\\d{4}(?:[./-]\\d{1,2}){2}$/.test(text)) {\n                    text = text.replace(/[./-]/g, '/') + ' 00:00:00';\n                }\n                // Reverse date and month in some cases\n                text = settings.monthFirst || !/^\\d{1,2}[./-]/.test(text) ? text : text.replace(/[./-]/g, '/').replace(/(\\d+)\\/(\\d+)/, '$2/$1');\n                var textDate = new Date(text);\n                var numberOnly = text.match(/^\\d+$/) !== null;\n                var isShortYear = text.match(/^(?:\\d{1,2}[./-]){2}\\d{1,2}$/) !== null;\n                if (!isShortYear && !numberOnly && !isNaN(textDate.getDate())) {\n                    return textDate;\n                }\n                text = text.toLowerCase();\n\n                var\n                    i,\n                    j,\n                    k\n                ;\n                var\n                    minute = -1,\n                    hour = -1,\n                    day = -1,\n                    month = -1,\n                    year = -1\n                ;\n                var isAm;\n\n                var isTimeOnly = settings.type === 'time';\n                var isDateOnly = settings.type.indexOf('time') < 0;\n\n                var\n                    words = text.split(settings.regExp.dateWords),\n                    word\n                ;\n                var\n                    numbers = text.split(settings.regExp.dateNumbers),\n                    number\n                ;\n\n                var parts;\n                var monthString;\n\n                if (!isDateOnly) {\n                    // am/pm\n                    isAm = $.inArray(settings.text.am.toLowerCase(), words) >= 0\n                        ? true\n                        : ($.inArray(settings.text.pm.toLowerCase(), words) >= 0 ? false : undefined);\n\n                    // time with ':'\n                    for (i = 0; i < numbers.length; i++) {\n                        number = numbers[i];\n                        if (number.indexOf(':') >= 0) {\n                            if (hour < 0 || minute < 0) {\n                                parts = number.split(':');\n                                for (k = 0; k < Math.min(2, parts.length); k++) {\n                                    j = parseInt(parts[k], 10);\n                                    if (isNaN(j)) {\n                                        j = 0;\n                                    }\n                                    if (k === 0) {\n                                        hour = j % 24;\n                                    } else {\n                                        minute = j % 60;\n                                    }\n                                }\n                            }\n                            numbers.splice(i, 1);\n                        }\n                    }\n                }\n\n                if (!isTimeOnly) {\n                    // textual month\n                    for (i = 0; i < words.length; i++) {\n                        word = words[i];\n                        if (word.length <= 0) {\n                            continue;\n                        }\n                        for (j = 0; j < settings.text.months.length; j++) {\n                            monthString = settings.text.months[j];\n                            monthString = monthString.slice(0, word.length).toLowerCase();\n                            if (monthString === word) {\n                                month = j + 1;\n\n                                break;\n                            }\n                        }\n                        if (month >= 0) {\n                            break;\n                        }\n                    }\n\n                    // year > settings.centuryBreak\n                    for (i = 0; i < numbers.length; i++) {\n                        j = parseInt(numbers[i], 10);\n                        if (isNaN(j)) {\n                            continue;\n                        }\n                        if (j >= settings.centuryBreak && i === numbers.length - 1) {\n                            if (j <= 99) {\n                                j += settings.currentCentury - 100;\n                            }\n                            year = j;\n                            numbers.splice(i, 1);\n\n                            break;\n                        }\n                    }\n\n                    // numeric month\n                    if (month < 0) {\n                        for (i = 0; i < numbers.length; i++) {\n                            k = i > 1 || settings.monthFirst\n                                ? i\n                                : (i === 1 ? 0 : 1);\n                            j = parseInt(numbers[k], 10);\n                            if (isNaN(j)) {\n                                continue;\n                            }\n                            if (j >= 1 && j <= 12) {\n                                month = j;\n                                numbers.splice(k, 1);\n\n                                break;\n                            }\n                        }\n                    }\n\n                    // day\n                    for (i = 0; i < numbers.length; i++) {\n                        j = parseInt(numbers[i], 10);\n                        if (isNaN(j)) {\n                            continue;\n                        }\n                        if (j >= 1 && j <= 31) {\n                            day = j;\n                            numbers.splice(i, 1);\n\n                            break;\n                        }\n                    }\n\n                    // year <= settings.centuryBreak\n                    if (year < 0) {\n                        for (i = numbers.length - 1; i >= 0; i--) {\n                            j = parseInt(numbers[i], 10);\n                            if (isNaN(j)) {\n                                continue;\n                            }\n                            if (j <= 99) {\n                                j += settings.currentCentury;\n                            }\n                            year = j;\n                            numbers.splice(i, 1);\n\n                            break;\n                        }\n                    }\n                }\n\n                if (!isDateOnly) {\n                    // hour\n                    if (hour < 0) {\n                        for (i = 0; i < numbers.length; i++) {\n                            j = parseInt(numbers[i], 10);\n                            if (isNaN(j)) {\n                                continue;\n                            }\n                            if (j >= 0 && j <= 23) {\n                                hour = j;\n                                numbers.splice(i, 1);\n\n                                break;\n                            }\n                        }\n                    }\n\n                    // minute\n                    if (minute < 0) {\n                        for (i = 0; i < numbers.length; i++) {\n                            j = parseInt(numbers[i], 10);\n                            if (isNaN(j)) {\n                                continue;\n                            }\n                            if (j >= 0 && j <= 59) {\n                                minute = j;\n                                numbers.splice(i, 1);\n\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                if (minute < 0 && hour < 0 && day < 0 && month < 0 && year < 0) {\n                    return null;\n                }\n\n                if (minute < 0) {\n                    minute = 0;\n                }\n                if (hour < 0) {\n                    hour = 0;\n                }\n                if (day < 0) {\n                    day = 1;\n                }\n                if (month < 0) {\n                    month = 1;\n                }\n                if (year < 0) {\n                    year = new Date().getFullYear();\n                }\n\n                if (isAm !== undefined) {\n                    if (isAm) {\n                        if (hour === 12) {\n                            hour = 0;\n                        }\n                    } else if (hour < 12) {\n                        hour += 12;\n                    }\n                }\n\n                var date = new Date(year, month - 1, day, hour, minute);\n                if (date.getMonth() !== month - 1 || date.getFullYear() !== year) {\n                    // month or year don't match up, switch to last day of the month\n                    date = new Date(year, month, 0, hour, minute);\n                }\n\n                return isNaN(date.getTime()) ? null : date;\n            },\n        },\n\n        // callback before date is changed, return false to cancel the change\n        onBeforeChange: function (date, text, mode) {\n            return true;\n        },\n\n        // callback when date changes\n        onChange: function (date, text, mode) {},\n\n        // callback before show animation, return false to prevent show\n        onShow: function () {},\n\n        // callback after show animation\n        onVisible: function () {},\n\n        // callback before hide animation, return false to prevent hide\n        onHide: function () {},\n\n        // callback after hide animation\n        onHidden: function () {},\n\n        // callback before item is selected, return false to prevent selection\n        onSelect: function (date, mode) {},\n\n        // is the given date disabled?\n        isDisabled: function (date, mode) {\n            return false;\n        },\n\n        selector: {\n            popup: '.ui.popup',\n            input: 'input',\n            activator: 'input',\n            append: '.inline.field,.inline.fields',\n        },\n\n        regExp: {\n            dateWords: /[^A-Za-z\\u00C0-\\u024F]+/g,\n            dateNumbers: /[^\\d:]+/g,\n            token: /d{1,4}|D{1,2}|M{1,4}|YY(?:YY)?|([Hhmsw])\\1?|[ASYa]|\"[^\"]*\"|'[^']*'/g,\n        },\n\n        error: {\n            popup: 'UI Popup, a required component is not included in this page',\n            method: 'The method you called is not defined.',\n        },\n\n        className: {\n            calendar: 'calendar',\n            active: 'active',\n            popup: 'ui popup',\n            grid: 'ui equal width grid',\n            column: 'column',\n            table: 'ui celled center aligned unstackable table',\n            inverted: 'inverted',\n            prev: 'prev link',\n            next: 'next link',\n            prevIcon: 'chevron left icon',\n            nextIcon: 'chevron right icon',\n            link: 'link',\n            cell: 'link',\n            disabledCell: 'disabled',\n            weekCell: 'disabled',\n            adjacentCell: 'adjacent',\n            activeCell: 'active',\n            rangeCell: 'range',\n            focusCell: 'focus',\n            todayCell: 'today',\n            today: 'today link',\n            disabled: 'disabled',\n        },\n\n        metadata: {\n            date: 'date',\n            focusDate: 'focusDate',\n            startDate: 'startDate',\n            endDate: 'endDate',\n            minDate: 'minDate',\n            maxDate: 'maxDate',\n            mode: 'mode',\n            type: 'type',\n            monthOffset: 'monthOffset',\n            message: 'message',\n            class: 'class',\n            inverted: 'inverted',\n            variation: 'variation',\n            position: 'position',\n            month: 'month',\n            year: 'year',\n            hours: 'hours',\n            days: 'days',\n        },\n\n        eventClass: 'blue',\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/card.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Card\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Standard\n*******************************/\n\n\n/* --------------\n      Card\n--------------- */\n.ui.cards > .card,\n.ui.card {\n  max-width: 100%;\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 290px;\n  min-height: 0;\n  background: #fff;\n  padding: 0;\n  border: none;\n  border-radius: 0.28571429rem;\n  box-shadow: 0 1px 3px 0 #d4d4d5, 0 0 0 1px #d4d4d5;\n  transition: box-shadow 0.1s ease, transform 0.1s ease;\n  z-index: \"\";\n  word-wrap: break-word;\n}\n.ui.card {\n  margin: 1em 0;\n}\n.ui.cards > .card a,\n.ui.card a {\n  cursor: pointer;\n}\n.ui.card:first-child {\n  margin-top: 0;\n}\n.ui.card:last-child {\n  margin-bottom: 0;\n}\n\n/* --------------\n      Cards\n--------------- */\n.ui.cards {\n  display: flex;\n  margin: -0.875em -0.5em;\n  flex-wrap: wrap;\n}\n.ui.cards > .card {\n  display: flex;\n  margin: 0.875em 0.5em;\n  float: none;\n}\n\n/* Clearing */\n.ui.cards::after,\n.ui.card::after {\n  display: block;\n  content: \" \";\n  height: 0;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n/* Consecutive Card Groups Preserve Row Spacing */\n.ui.cards ~ .ui.cards {\n  margin-top: 0.875em;\n}\n\n/* --------------\n  Rounded Edges\n--------------- */\n.ui.cards > .card > :first-child,\n.ui.card > :first-child {\n  border-radius: 0.28571429rem 0.28571429rem 0 0 !important;\n  border-top: none !important;\n}\n.ui.cards > .card > :last-child,\n.ui.card > :last-child {\n  border-radius: 0 0 0.28571429rem 0.28571429rem !important;\n}\n.ui.cards > .card > :only-child,\n.ui.card > :only-child {\n  border-radius: 0.28571429rem !important;\n}\n\n/* --------------\n         Images\n    --------------- */\n.ui.cards > .card > .image,\n.ui.card > .image {\n  position: relative;\n  display: block;\n  flex: 0 0 auto;\n  padding: 0;\n  background: rgba(0, 0, 0, 0.05);\n}\n.ui.cards > .card > .image > img,\n.ui.card > .image > img {\n  display: block;\n  width: 100%;\n  height: auto;\n  border-radius: inherit;\n}\n.ui.cards > .card > .image:not(.ui) > img,\n.ui.card > .image:not(.ui) > img {\n  border: none;\n}\n\n/* --------------\n     Content\n--------------- */\n.ui.cards > .card > .content,\n.ui.card > .content {\n  flex-grow: 1;\n  border: none;\n  border-top: 1px solid rgba(34, 36, 38, 0.1);\n  background: none;\n  margin: 0;\n  padding: 1em;\n  box-shadow: none;\n  font-size: 1em;\n  border-radius: 0;\n}\n.ui.cards > .card > .content::after,\n.ui.card > .content::after {\n  display: block;\n  content: \" \";\n  height: 0;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n.ui.cards > .card > .content > .header,\n.ui.card > .content > .header {\n  display: block;\n  margin: \"\";\n  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\";\n  color: rgba(0, 0, 0, 0.85);\n}\n\n/* Default Header Size */\n.ui.cards > .card > .content > .header:not(.ui),\n.ui.card > .content > .header:not(.ui) {\n  font-weight: bold;\n  font-size: 1.28571429em;\n  margin-top: -0.21425em;\n  line-height: 1.28571429em;\n}\n.ui.cards > .card > .content > .meta + .description,\n.ui.cards > .card > .content > .header + .description,\n.ui.card > .content > .meta + .description,\n.ui.card > .content > .header + .description {\n  margin-top: 0.5em;\n}\n\n/* ----------------\n     Floated Content\n    ----------------- */\n.ui.cards > .card [class*=\"left floated\"],\n.ui.card [class*=\"left floated\"] {\n  float: left;\n}\n.ui.cards > .card [class*=\"right floated\"],\n.ui.card [class*=\"right floated\"] {\n  float: right;\n}\n\n/* --------------\n         Aligned\n    --------------- */\n.ui.cards > .card [class*=\"left aligned\"],\n.ui.card [class*=\"left aligned\"] {\n  text-align: left;\n}\n.ui.cards > .card [class*=\"center aligned\"],\n.ui.card [class*=\"center aligned\"] {\n  text-align: center;\n}\n.ui.cards > .card [class*=\"right aligned\"],\n.ui.card [class*=\"right aligned\"] {\n  text-align: right;\n}\n\n/* --------------\n      Content Image\n    --------------- */\n.ui.cards > .card .content img,\n.ui.card .content img {\n  display: inline-block;\n  vertical-align: middle;\n  width: \"\";\n}\n.ui.cards > .card img.avatar,\n.ui.cards > .card .avatar img,\n.ui.card img.avatar,\n.ui.card .avatar img {\n  width: 2em;\n  height: 2em;\n  border-radius: 500rem;\n}\n\n/* --------------\n       Description\n    --------------- */\n.ui.cards > .card > .content > .description,\n.ui.card > .content > .description {\n  clear: both;\n  color: rgba(0, 0, 0, 0.68);\n}\n\n/* --------------\n    Paragraph\n--------------- */\n.ui.cards > .card > .content p,\n.ui.card > .content p {\n  margin: 0 0 0.5em;\n}\n.ui.cards > .card > .content p:last-child,\n.ui.card > .content p:last-child {\n  margin-bottom: 0;\n}\n\n/* --------------\n          Meta\n    --------------- */\n.ui.cards > .card .meta,\n.ui.card .meta {\n  font-size: 1em;\n  color: rgba(0, 0, 0, 0.4);\n}\n.ui.cards > .card .meta *,\n.ui.card .meta * {\n  margin-right: 0.3em;\n}\n.ui.cards > .card .meta :last-child,\n.ui.card .meta :last-child {\n  margin-right: 0;\n}\n.ui.cards > .card .meta [class*=\"right floated\"],\n.ui.card .meta [class*=\"right floated\"] {\n  margin-right: 0;\n  margin-left: 0.3em;\n}\n\n/* --------------\n      Links\n--------------- */\n\n/* Generic */\n.ui.cards > .card > .content a:not(.ui),\n.ui.card > .content a:not(.ui) {\n  color: \"\";\n  transition: color 0.1s ease;\n}\n.ui.cards > .card > .content a:not(.ui):hover,\n.ui.card > .content a:not(.ui):hover {\n  color: \"\";\n}\n\n/* Header */\n.ui.cards > .card > .content > a.header,\n.ui.card > .content > a.header {\n  color: rgba(0, 0, 0, 0.85);\n}\n.ui.cards > .card > .content > a.header:hover,\n.ui.card > .content > a.header:hover {\n  color: #1e70bf;\n}\n\n/* Meta */\n.ui.cards > .card .meta > a:not(.ui),\n.ui.card .meta > a:not(.ui) {\n  color: rgba(0, 0, 0, 0.4);\n}\n.ui.cards > .card .meta > a:not(.ui):hover,\n.ui.card .meta > a:not(.ui):hover {\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* --------------\n         Buttons\n    --------------- */\n.ui.cards > .card > .buttons,\n.ui.card > .buttons,\n.ui.cards > .card > .button,\n.ui.card > .button {\n  margin: 0 -1px;\n  width: calc(100% + 2px);\n}\n.ui.cards > .card > .buttons:last-child,\n.ui.card > .buttons:last-child,\n.ui.cards > .card > .button:last-child,\n.ui.card > .button:last-child {\n  margin-bottom: -1px;\n}\n\n/* --------------\n       Basic\n    --------------- */\n.ui.cards:not(.raised) > .basic.card:not(.raised),\n.ui.ui.ui.basic.cards:not(.raised) > .card:not(.raised),\n.ui.ui.ui.basic.card:not(.raised) {\n  box-shadow: none;\n}\n.ui.cards:not(.raised) > .basic.card:not(.raised) > .buttons,\n.ui.ui.ui.basic.cards:not(.raised) > .card:not(.raised) > .buttons,\n.ui.ui.ui.basic.card:not(.raised) > .buttons,\n.ui.cards:not(.raised) > .basic.card:not(.raised) > .button,\n.ui.ui.ui.basic.cards:not(.raised) > .card:not(.raised) > .button,\n.ui.ui.ui.basic.card:not(.raised) > .button {\n  margin: 0;\n  width: 100%;\n}\n.ui.ui.ui.ui.ui.basic.card:not(.raised):hover,\n.ui.ui.ui.ui.ui.basic.cards:not(.raised) .card:not(.raised):hover {\n  box-shadow: none;\n}\n\n/* --------------\n      Dimmer\n--------------- */\n.ui.cards > .card .dimmer,\n.ui.card .dimmer {\n  background: \"\";\n  z-index: 10;\n}\n\n/* --------------\n     Labels\n--------------- */\n\n/* -----Star----- */\n\n/* Icon */\n.ui.cards > .card > .content .star.icon,\n.ui.card > .content .star.icon {\n  cursor: pointer;\n  opacity: 0.75;\n  transition: color 0.1s ease;\n}\n.ui.cards > .card > .content .star.icon:hover,\n.ui.card > .content .star.icon:hover {\n  opacity: 1;\n  color: #ffb70a;\n}\n.ui.cards > .card > .content .active.star.icon,\n.ui.card > .content .active.star.icon {\n  color: #ffe623;\n}\n\n/* -----Like----- */\n\n/* Icon */\n.ui.cards > .card > .content .like.icon,\n.ui.card > .content .like.icon {\n  cursor: pointer;\n  opacity: 0.75;\n  transition: color 0.1s ease;\n}\n.ui.cards > .card > .content .like.icon:hover,\n.ui.card > .content .like.icon:hover {\n  opacity: 1;\n  color: #ff2733;\n}\n.ui.cards > .card > .content .active.like.icon,\n.ui.card > .content .active.like.icon {\n  color: #ff2733;\n}\n\n/* ----------------\n      Extra Content\n    ----------------- */\n.ui.cards > .card > .extra,\n.ui.card > .extra {\n  max-width: 100%;\n  min-height: 0 !important;\n  flex-grow: 0;\n  border-top: 1px solid rgba(0, 0, 0, 0.05) !important;\n  position: static;\n  background: none;\n  width: auto;\n  margin: 0;\n  padding: 0.75em 1em;\n  top: 0;\n  left: 0;\n  color: rgba(0, 0, 0, 0.4);\n  box-shadow: none;\n  transition: color 0.1s ease;\n}\n.ui.cards > .card > .extra a:not(.ui),\n.ui.card > .extra a:not(.ui) {\n  color: rgba(0, 0, 0, 0.4);\n}\n.ui.cards > .card > .extra a:not(.ui):hover,\n.ui.card > .extra a:not(.ui):hover {\n  color: #1e70bf;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------\n        Disabled\n    --------------- */\n.ui.disabled.card {\n  opacity: 0.45;\n  color: rgba(40, 40, 40, 0.3);\n  pointer-events: none;\n}\n\n/* --------------\n        Loading\n    --------------- */\n.ui.loading.card {\n  position: relative;\n  cursor: default;\n  pointer-events: none;\n  transition: all 0s linear;\n}\n.ui.loading.card::before {\n  position: absolute;\n  content: \"\";\n  top: 0;\n  left: 0;\n  background: rgba(255, 255, 255, 0.8);\n  width: 100%;\n  height: 100%;\n  border-radius: 0.28571429rem;\n  z-index: 100;\n}\n.ui.loading.card::after {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -1.5em 0 0 -1.5em;\n  width: 3em;\n  height: 3em;\n  animation: loader 0.6s infinite linear;\n  border: 0.2em solid #767676;\n  border-radius: 500rem;\n  box-shadow: 0 0 0 1px transparent;\n  visibility: visible;\n  z-index: 101;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* -------------------\n          Horizontal\n    -------------------- */\n.ui.horizontal.cards > .card,\n.ui.card.horizontal {\n  flex-flow: row wrap;\n  min-width: 270px;\n  width: 400px;\n  max-width: 100%;\n}\n.ui.horizontal.cards > .card > .image,\n.ui.card.horizontal > .image {\n  border-radius: 0.28571429rem 0 0 0.28571429rem;\n  width: 150px;\n}\n.ui.horizontal.cards > .card > .image > img,\n.ui.card.horizontal > .image > img {\n  background-size: cover;\n  background-repeat: no-repeat;\n  background-position: center;\n  justify-content: center;\n  align-items: center;\n  display: flex;\n  width: 100%;\n  border-radius: 0.28571429rem 0 0 0.28571429rem;\n}\n.ui.horizontal.cards > .card > .image:last-child > img,\n.ui.card.horizontal > .image:last-child > img {\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n}\n.ui.horizontal.cards > .card > .content,\n.ui.horizontal.card > .content {\n  border-top: none;\n  flex-basis: 1px;\n}\n.ui.horizontal.cards > .card > .extra,\n.ui.horizontal.card > .extra {\n  flex-basis: 100%;\n}\n\n/* -------------------\n           Raised\n    -------------------- */\n.ui.cards > .raised.card,\n.ui.raised.cards > .card,\n.ui.raised.card {\n  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);\n}\n.ui.raised.cards a.card:hover,\n.ui.link.cards .raised.card:hover,\na.ui.raised.card:hover,\n.ui.link.raised.card:hover {\n  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);\n}\n.ui.basic.cards > .raised.card,\n.ui.basic.raised.cards > .card,\n.ui.raised.cards > .basic.card,\n.ui.basic.raised.card {\n  box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);\n}\n.ui.basic.raised.cards a.card:hover,\n.ui.link.cards .basic.raised.card:hover,\n.ui.link.basic.cards .raised.card:hover,\n.ui.link.basic.raised.cards .card:hover,\na.ui.basic.raised.card:hover,\n.ui.link.basic.raised.card:hover {\n  box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.15), 0 2px 10px 0 rgba(34, 36, 38, 0.25);\n}\n\n/* -------------------\n           Centered\n    -------------------- */\n.ui.centered.cards {\n  justify-content: center;\n}\n.ui.centered.card {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n/* -------------------\n            Fluid\n    -------------------- */\n.ui.fluid.card {\n  width: 100%;\n  max-width: 9999px;\n}\n\n/* -------------------\n            Link\n    -------------------- */\n.ui.cards a.card,\n.ui.link.cards .card,\na.ui.card,\n.ui.link.card {\n  transform: none;\n}\n.ui.cards a.card:hover,\n.ui.link.cards .card:not(.icon):hover,\na.ui.card:hover,\n.ui.link.card:hover {\n  cursor: pointer;\n  z-index: 5;\n  background: #fff;\n  border: none;\n  box-shadow: 0 1px 3px 0 #bcbdbd, 0 0 0 1px #d4d4d5;\n  transform: translateY(-3px);\n}\n\n/* -------------------\n       Colors\n-------------------- */\n.ui.primary.cards > .card,\n.ui.cards > .primary.card,\n.ui.primary.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #2185d0, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.primary.card:hover,\n.ui.primary.cards a.card:hover,\n.ui.link.primary.cards .card:not(.icon):hover,\n.ui.link.cards .primary.card:not(.icon):hover,\na.ui.primary.card:hover,\n.ui.link.primary.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #1678c2, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.primary.card,\n.ui.basic.primary.cards > .card,\n.ui.basic.cards > .primary.card,\n.ui.basic.primary.card {\n  background: #54c8ff;\n}\n.ui.basic.cards a.primary.card:hover,\n.ui.cards a.basic.primary.card:hover,\n.ui.basic.primary.cards a.card:hover,\n.ui.link.cards .basic.primary.card:not(.icon):hover,\n.ui.link.basic.primary.cards .card:not(.icon):hover,\n.ui.link.basic.cards .primary.card:not(.icon):hover,\na.ui.basic.primary.card:hover,\n.ui.link.basic.primary.card:hover {\n  background: #21b8ff;\n}\n.ui.inverted.primary.cards > .card,\n.ui.inverted.cards > .primary.card,\n.ui.inverted.primary.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #54c8ff, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.primary.card:hover,\n.ui.inverted.primary.cards a.card:hover,\n.ui.link.inverted.primary.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .primary.card:not(.icon):hover,\na.ui.inverted.primary.card:hover,\n.ui.link.inverted.primary.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #21b8ff, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.primary.card,\n.ui.basic.inverted.primary.cards > .card,\n.ui.basic.inverted.cards > .primary.card,\n.ui.basic.inverted.primary.card {\n  background: #2185d0;\n}\n.ui.inverted.cards a.basic.primary.card:hover,\n.ui.basic.inverted.cards a.primary.card:hover,\n.ui.basic.inverted.primary.cards a.card:hover,\n.ui.link.inverted.cards .basic.primary.card:not(.icon):hover,\n.ui.link.basic.inverted.primary.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .primary.card:not(.icon):hover,\na.ui.basic.inverted.primary.card:hover,\n.ui.link.basic.inverted.primary.card:hover {\n  background: #1678c2;\n}\n.ui.secondary.cards > .card,\n.ui.cards > .secondary.card,\n.ui.secondary.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #1b1c1d, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.secondary.card:hover,\n.ui.secondary.cards a.card:hover,\n.ui.link.secondary.cards .card:not(.icon):hover,\n.ui.link.cards .secondary.card:not(.icon):hover,\na.ui.secondary.card:hover,\n.ui.link.secondary.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #27292a, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.secondary.card,\n.ui.basic.secondary.cards > .card,\n.ui.basic.cards > .secondary.card,\n.ui.basic.secondary.card {\n  background: #545454;\n}\n.ui.basic.cards a.secondary.card:hover,\n.ui.cards a.basic.secondary.card:hover,\n.ui.basic.secondary.cards a.card:hover,\n.ui.link.cards .basic.secondary.card:not(.icon):hover,\n.ui.link.basic.secondary.cards .card:not(.icon):hover,\n.ui.link.basic.cards .secondary.card:not(.icon):hover,\na.ui.basic.secondary.card:hover,\n.ui.link.basic.secondary.card:hover {\n  background: #6e6e6e;\n}\n.ui.inverted.secondary.cards > .card,\n.ui.inverted.cards > .secondary.card,\n.ui.inverted.secondary.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #545454, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.secondary.card:hover,\n.ui.inverted.secondary.cards a.card:hover,\n.ui.link.inverted.secondary.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .secondary.card:not(.icon):hover,\na.ui.inverted.secondary.card:hover,\n.ui.link.inverted.secondary.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #6e6e6e, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.secondary.card,\n.ui.basic.inverted.secondary.cards > .card,\n.ui.basic.inverted.cards > .secondary.card,\n.ui.basic.inverted.secondary.card {\n  background: #1b1c1d;\n}\n.ui.inverted.cards a.basic.secondary.card:hover,\n.ui.basic.inverted.cards a.secondary.card:hover,\n.ui.basic.inverted.secondary.cards a.card:hover,\n.ui.link.inverted.cards .basic.secondary.card:not(.icon):hover,\n.ui.link.basic.inverted.secondary.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .secondary.card:not(.icon):hover,\na.ui.basic.inverted.secondary.card:hover,\n.ui.link.basic.inverted.secondary.card:hover {\n  background: #27292a;\n}\n.ui.red.cards > .card,\n.ui.cards > .red.card,\n.ui.red.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #db2828, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.red.card:hover,\n.ui.red.cards a.card:hover,\n.ui.link.red.cards .card:not(.icon):hover,\n.ui.link.cards .red.card:not(.icon):hover,\na.ui.red.card:hover,\n.ui.link.red.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #d01919, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.red.card,\n.ui.basic.red.cards > .card,\n.ui.basic.cards > .red.card,\n.ui.basic.red.card {\n  background: #ff695e;\n}\n.ui.basic.cards a.red.card:hover,\n.ui.cards a.basic.red.card:hover,\n.ui.basic.red.cards a.card:hover,\n.ui.link.cards .basic.red.card:not(.icon):hover,\n.ui.link.basic.red.cards .card:not(.icon):hover,\n.ui.link.basic.cards .red.card:not(.icon):hover,\na.ui.basic.red.card:hover,\n.ui.link.basic.red.card:hover {\n  background: #ff392b;\n}\n.ui.inverted.red.cards > .card,\n.ui.inverted.cards > .red.card,\n.ui.inverted.red.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ff695e, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.red.card:hover,\n.ui.inverted.red.cards a.card:hover,\n.ui.link.inverted.red.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .red.card:not(.icon):hover,\na.ui.inverted.red.card:hover,\n.ui.link.inverted.red.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ff392b, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.red.card,\n.ui.basic.inverted.red.cards > .card,\n.ui.basic.inverted.cards > .red.card,\n.ui.basic.inverted.red.card {\n  background: #db2828;\n}\n.ui.inverted.cards a.basic.red.card:hover,\n.ui.basic.inverted.cards a.red.card:hover,\n.ui.basic.inverted.red.cards a.card:hover,\n.ui.link.inverted.cards .basic.red.card:not(.icon):hover,\n.ui.link.basic.inverted.red.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .red.card:not(.icon):hover,\na.ui.basic.inverted.red.card:hover,\n.ui.link.basic.inverted.red.card:hover {\n  background: #d01919;\n}\n.ui.orange.cards > .card,\n.ui.cards > .orange.card,\n.ui.orange.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #f2711c, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.orange.card:hover,\n.ui.orange.cards a.card:hover,\n.ui.link.orange.cards .card:not(.icon):hover,\n.ui.link.cards .orange.card:not(.icon):hover,\na.ui.orange.card:hover,\n.ui.link.orange.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #f26202, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.orange.card,\n.ui.basic.orange.cards > .card,\n.ui.basic.cards > .orange.card,\n.ui.basic.orange.card {\n  background: #ff851b;\n}\n.ui.basic.cards a.orange.card:hover,\n.ui.cards a.basic.orange.card:hover,\n.ui.basic.orange.cards a.card:hover,\n.ui.link.cards .basic.orange.card:not(.icon):hover,\n.ui.link.basic.orange.cards .card:not(.icon):hover,\n.ui.link.basic.cards .orange.card:not(.icon):hover,\na.ui.basic.orange.card:hover,\n.ui.link.basic.orange.card:hover {\n  background: #e76b00;\n}\n.ui.inverted.orange.cards > .card,\n.ui.inverted.cards > .orange.card,\n.ui.inverted.orange.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ff851b, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.orange.card:hover,\n.ui.inverted.orange.cards a.card:hover,\n.ui.link.inverted.orange.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .orange.card:not(.icon):hover,\na.ui.inverted.orange.card:hover,\n.ui.link.inverted.orange.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #e76b00, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.orange.card,\n.ui.basic.inverted.orange.cards > .card,\n.ui.basic.inverted.cards > .orange.card,\n.ui.basic.inverted.orange.card {\n  background: #f2711c;\n}\n.ui.inverted.cards a.basic.orange.card:hover,\n.ui.basic.inverted.cards a.orange.card:hover,\n.ui.basic.inverted.orange.cards a.card:hover,\n.ui.link.inverted.cards .basic.orange.card:not(.icon):hover,\n.ui.link.basic.inverted.orange.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .orange.card:not(.icon):hover,\na.ui.basic.inverted.orange.card:hover,\n.ui.link.basic.inverted.orange.card:hover {\n  background: #f26202;\n}\n.ui.yellow.cards > .card,\n.ui.cards > .yellow.card,\n.ui.yellow.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #fbbd08, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.yellow.card:hover,\n.ui.yellow.cards a.card:hover,\n.ui.link.yellow.cards .card:not(.icon):hover,\n.ui.link.cards .yellow.card:not(.icon):hover,\na.ui.yellow.card:hover,\n.ui.link.yellow.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #eaae00, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.yellow.card,\n.ui.basic.yellow.cards > .card,\n.ui.basic.cards > .yellow.card,\n.ui.basic.yellow.card {\n  background: #ffe21f;\n}\n.ui.basic.cards a.yellow.card:hover,\n.ui.cards a.basic.yellow.card:hover,\n.ui.basic.yellow.cards a.card:hover,\n.ui.link.cards .basic.yellow.card:not(.icon):hover,\n.ui.link.basic.yellow.cards .card:not(.icon):hover,\n.ui.link.basic.cards .yellow.card:not(.icon):hover,\na.ui.basic.yellow.card:hover,\n.ui.link.basic.yellow.card:hover {\n  background: #ebcd00;\n}\n.ui.inverted.yellow.cards > .card,\n.ui.inverted.cards > .yellow.card,\n.ui.inverted.yellow.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ffe21f, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.yellow.card:hover,\n.ui.inverted.yellow.cards a.card:hover,\n.ui.link.inverted.yellow.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .yellow.card:not(.icon):hover,\na.ui.inverted.yellow.card:hover,\n.ui.link.inverted.yellow.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ebcd00, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.yellow.card,\n.ui.basic.inverted.yellow.cards > .card,\n.ui.basic.inverted.cards > .yellow.card,\n.ui.basic.inverted.yellow.card {\n  background: #fbbd08;\n}\n.ui.inverted.cards a.basic.yellow.card:hover,\n.ui.basic.inverted.cards a.yellow.card:hover,\n.ui.basic.inverted.yellow.cards a.card:hover,\n.ui.link.inverted.cards .basic.yellow.card:not(.icon):hover,\n.ui.link.basic.inverted.yellow.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .yellow.card:not(.icon):hover,\na.ui.basic.inverted.yellow.card:hover,\n.ui.link.basic.inverted.yellow.card:hover {\n  background: #eaae00;\n}\n.ui.olive.cards > .card,\n.ui.cards > .olive.card,\n.ui.olive.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #b5cc18, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.olive.card:hover,\n.ui.olive.cards a.card:hover,\n.ui.link.olive.cards .card:not(.icon):hover,\n.ui.link.cards .olive.card:not(.icon):hover,\na.ui.olive.card:hover,\n.ui.link.olive.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #a7bd0d, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.olive.card,\n.ui.basic.olive.cards > .card,\n.ui.basic.cards > .olive.card,\n.ui.basic.olive.card {\n  background: #d9e778;\n}\n.ui.basic.cards a.olive.card:hover,\n.ui.cards a.basic.olive.card:hover,\n.ui.basic.olive.cards a.card:hover,\n.ui.link.cards .basic.olive.card:not(.icon):hover,\n.ui.link.basic.olive.cards .card:not(.icon):hover,\n.ui.link.basic.cards .olive.card:not(.icon):hover,\na.ui.basic.olive.card:hover,\n.ui.link.basic.olive.card:hover {\n  background: #d2e745;\n}\n.ui.inverted.olive.cards > .card,\n.ui.inverted.cards > .olive.card,\n.ui.inverted.olive.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #d9e778, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.olive.card:hover,\n.ui.inverted.olive.cards a.card:hover,\n.ui.link.inverted.olive.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .olive.card:not(.icon):hover,\na.ui.inverted.olive.card:hover,\n.ui.link.inverted.olive.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #d2e745, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.olive.card,\n.ui.basic.inverted.olive.cards > .card,\n.ui.basic.inverted.cards > .olive.card,\n.ui.basic.inverted.olive.card {\n  background: #b5cc18;\n}\n.ui.inverted.cards a.basic.olive.card:hover,\n.ui.basic.inverted.cards a.olive.card:hover,\n.ui.basic.inverted.olive.cards a.card:hover,\n.ui.link.inverted.cards .basic.olive.card:not(.icon):hover,\n.ui.link.basic.inverted.olive.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .olive.card:not(.icon):hover,\na.ui.basic.inverted.olive.card:hover,\n.ui.link.basic.inverted.olive.card:hover {\n  background: #a7bd0d;\n}\n.ui.green.cards > .card,\n.ui.cards > .green.card,\n.ui.green.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #21ba45, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.green.card:hover,\n.ui.green.cards a.card:hover,\n.ui.link.green.cards .card:not(.icon):hover,\n.ui.link.cards .green.card:not(.icon):hover,\na.ui.green.card:hover,\n.ui.link.green.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #16ab39, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.green.card,\n.ui.basic.green.cards > .card,\n.ui.basic.cards > .green.card,\n.ui.basic.green.card {\n  background: #2ecc40;\n}\n.ui.basic.cards a.green.card:hover,\n.ui.cards a.basic.green.card:hover,\n.ui.basic.green.cards a.card:hover,\n.ui.link.cards .basic.green.card:not(.icon):hover,\n.ui.link.basic.green.cards .card:not(.icon):hover,\n.ui.link.basic.cards .green.card:not(.icon):hover,\na.ui.basic.green.card:hover,\n.ui.link.basic.green.card:hover {\n  background: #1ea92e;\n}\n.ui.inverted.green.cards > .card,\n.ui.inverted.cards > .green.card,\n.ui.inverted.green.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #2ecc40, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.green.card:hover,\n.ui.inverted.green.cards a.card:hover,\n.ui.link.inverted.green.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .green.card:not(.icon):hover,\na.ui.inverted.green.card:hover,\n.ui.link.inverted.green.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #1ea92e, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.green.card,\n.ui.basic.inverted.green.cards > .card,\n.ui.basic.inverted.cards > .green.card,\n.ui.basic.inverted.green.card {\n  background: #21ba45;\n}\n.ui.inverted.cards a.basic.green.card:hover,\n.ui.basic.inverted.cards a.green.card:hover,\n.ui.basic.inverted.green.cards a.card:hover,\n.ui.link.inverted.cards .basic.green.card:not(.icon):hover,\n.ui.link.basic.inverted.green.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .green.card:not(.icon):hover,\na.ui.basic.inverted.green.card:hover,\n.ui.link.basic.inverted.green.card:hover {\n  background: #16ab39;\n}\n.ui.teal.cards > .card,\n.ui.cards > .teal.card,\n.ui.teal.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #00b5ad, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.teal.card:hover,\n.ui.teal.cards a.card:hover,\n.ui.link.teal.cards .card:not(.icon):hover,\n.ui.link.cards .teal.card:not(.icon):hover,\na.ui.teal.card:hover,\n.ui.link.teal.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #009c95, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.teal.card,\n.ui.basic.teal.cards > .card,\n.ui.basic.cards > .teal.card,\n.ui.basic.teal.card {\n  background: #6dffff;\n}\n.ui.basic.cards a.teal.card:hover,\n.ui.cards a.basic.teal.card:hover,\n.ui.basic.teal.cards a.card:hover,\n.ui.link.cards .basic.teal.card:not(.icon):hover,\n.ui.link.basic.teal.cards .card:not(.icon):hover,\n.ui.link.basic.cards .teal.card:not(.icon):hover,\na.ui.basic.teal.card:hover,\n.ui.link.basic.teal.card:hover {\n  background: #3affff;\n}\n.ui.inverted.teal.cards > .card,\n.ui.inverted.cards > .teal.card,\n.ui.inverted.teal.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #6dffff, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.teal.card:hover,\n.ui.inverted.teal.cards a.card:hover,\n.ui.link.inverted.teal.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .teal.card:not(.icon):hover,\na.ui.inverted.teal.card:hover,\n.ui.link.inverted.teal.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #3affff, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.teal.card,\n.ui.basic.inverted.teal.cards > .card,\n.ui.basic.inverted.cards > .teal.card,\n.ui.basic.inverted.teal.card {\n  background: #00b5ad;\n}\n.ui.inverted.cards a.basic.teal.card:hover,\n.ui.basic.inverted.cards a.teal.card:hover,\n.ui.basic.inverted.teal.cards a.card:hover,\n.ui.link.inverted.cards .basic.teal.card:not(.icon):hover,\n.ui.link.basic.inverted.teal.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .teal.card:not(.icon):hover,\na.ui.basic.inverted.teal.card:hover,\n.ui.link.basic.inverted.teal.card:hover {\n  background: #009c95;\n}\n.ui.blue.cards > .card,\n.ui.cards > .blue.card,\n.ui.blue.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #2185d0, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.blue.card:hover,\n.ui.blue.cards a.card:hover,\n.ui.link.blue.cards .card:not(.icon):hover,\n.ui.link.cards .blue.card:not(.icon):hover,\na.ui.blue.card:hover,\n.ui.link.blue.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #1678c2, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.blue.card,\n.ui.basic.blue.cards > .card,\n.ui.basic.cards > .blue.card,\n.ui.basic.blue.card {\n  background: #54c8ff;\n}\n.ui.basic.cards a.blue.card:hover,\n.ui.cards a.basic.blue.card:hover,\n.ui.basic.blue.cards a.card:hover,\n.ui.link.cards .basic.blue.card:not(.icon):hover,\n.ui.link.basic.blue.cards .card:not(.icon):hover,\n.ui.link.basic.cards .blue.card:not(.icon):hover,\na.ui.basic.blue.card:hover,\n.ui.link.basic.blue.card:hover {\n  background: #21b8ff;\n}\n.ui.inverted.blue.cards > .card,\n.ui.inverted.cards > .blue.card,\n.ui.inverted.blue.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #54c8ff, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.blue.card:hover,\n.ui.inverted.blue.cards a.card:hover,\n.ui.link.inverted.blue.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .blue.card:not(.icon):hover,\na.ui.inverted.blue.card:hover,\n.ui.link.inverted.blue.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #21b8ff, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.blue.card,\n.ui.basic.inverted.blue.cards > .card,\n.ui.basic.inverted.cards > .blue.card,\n.ui.basic.inverted.blue.card {\n  background: #2185d0;\n}\n.ui.inverted.cards a.basic.blue.card:hover,\n.ui.basic.inverted.cards a.blue.card:hover,\n.ui.basic.inverted.blue.cards a.card:hover,\n.ui.link.inverted.cards .basic.blue.card:not(.icon):hover,\n.ui.link.basic.inverted.blue.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .blue.card:not(.icon):hover,\na.ui.basic.inverted.blue.card:hover,\n.ui.link.basic.inverted.blue.card:hover {\n  background: #1678c2;\n}\n.ui.violet.cards > .card,\n.ui.cards > .violet.card,\n.ui.violet.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #6435c9, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.violet.card:hover,\n.ui.violet.cards a.card:hover,\n.ui.link.violet.cards .card:not(.icon):hover,\n.ui.link.cards .violet.card:not(.icon):hover,\na.ui.violet.card:hover,\n.ui.link.violet.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #5829bb, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.violet.card,\n.ui.basic.violet.cards > .card,\n.ui.basic.cards > .violet.card,\n.ui.basic.violet.card {\n  background: #a291fb;\n}\n.ui.basic.cards a.violet.card:hover,\n.ui.cards a.basic.violet.card:hover,\n.ui.basic.violet.cards a.card:hover,\n.ui.link.cards .basic.violet.card:not(.icon):hover,\n.ui.link.basic.violet.cards .card:not(.icon):hover,\n.ui.link.basic.cards .violet.card:not(.icon):hover,\na.ui.basic.violet.card:hover,\n.ui.link.basic.violet.card:hover {\n  background: #745aff;\n}\n.ui.inverted.violet.cards > .card,\n.ui.inverted.cards > .violet.card,\n.ui.inverted.violet.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #a291fb, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.violet.card:hover,\n.ui.inverted.violet.cards a.card:hover,\n.ui.link.inverted.violet.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .violet.card:not(.icon):hover,\na.ui.inverted.violet.card:hover,\n.ui.link.inverted.violet.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #745aff, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.violet.card,\n.ui.basic.inverted.violet.cards > .card,\n.ui.basic.inverted.cards > .violet.card,\n.ui.basic.inverted.violet.card {\n  background: #6435c9;\n}\n.ui.inverted.cards a.basic.violet.card:hover,\n.ui.basic.inverted.cards a.violet.card:hover,\n.ui.basic.inverted.violet.cards a.card:hover,\n.ui.link.inverted.cards .basic.violet.card:not(.icon):hover,\n.ui.link.basic.inverted.violet.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .violet.card:not(.icon):hover,\na.ui.basic.inverted.violet.card:hover,\n.ui.link.basic.inverted.violet.card:hover {\n  background: #5829bb;\n}\n.ui.purple.cards > .card,\n.ui.cards > .purple.card,\n.ui.purple.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #a333c8, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.purple.card:hover,\n.ui.purple.cards a.card:hover,\n.ui.link.purple.cards .card:not(.icon):hover,\n.ui.link.cards .purple.card:not(.icon):hover,\na.ui.purple.card:hover,\n.ui.link.purple.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #9627ba, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.purple.card,\n.ui.basic.purple.cards > .card,\n.ui.basic.cards > .purple.card,\n.ui.basic.purple.card {\n  background: #dc73ff;\n}\n.ui.basic.cards a.purple.card:hover,\n.ui.cards a.basic.purple.card:hover,\n.ui.basic.purple.cards a.card:hover,\n.ui.link.cards .basic.purple.card:not(.icon):hover,\n.ui.link.basic.purple.cards .card:not(.icon):hover,\n.ui.link.basic.cards .purple.card:not(.icon):hover,\na.ui.basic.purple.card:hover,\n.ui.link.basic.purple.card:hover {\n  background: #cf40ff;\n}\n.ui.inverted.purple.cards > .card,\n.ui.inverted.cards > .purple.card,\n.ui.inverted.purple.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #dc73ff, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.purple.card:hover,\n.ui.inverted.purple.cards a.card:hover,\n.ui.link.inverted.purple.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .purple.card:not(.icon):hover,\na.ui.inverted.purple.card:hover,\n.ui.link.inverted.purple.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #cf40ff, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.purple.card,\n.ui.basic.inverted.purple.cards > .card,\n.ui.basic.inverted.cards > .purple.card,\n.ui.basic.inverted.purple.card {\n  background: #a333c8;\n}\n.ui.inverted.cards a.basic.purple.card:hover,\n.ui.basic.inverted.cards a.purple.card:hover,\n.ui.basic.inverted.purple.cards a.card:hover,\n.ui.link.inverted.cards .basic.purple.card:not(.icon):hover,\n.ui.link.basic.inverted.purple.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .purple.card:not(.icon):hover,\na.ui.basic.inverted.purple.card:hover,\n.ui.link.basic.inverted.purple.card:hover {\n  background: #9627ba;\n}\n.ui.pink.cards > .card,\n.ui.cards > .pink.card,\n.ui.pink.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #e03997, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.pink.card:hover,\n.ui.pink.cards a.card:hover,\n.ui.link.pink.cards .card:not(.icon):hover,\n.ui.link.cards .pink.card:not(.icon):hover,\na.ui.pink.card:hover,\n.ui.link.pink.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #e61a8d, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.pink.card,\n.ui.basic.pink.cards > .card,\n.ui.basic.cards > .pink.card,\n.ui.basic.pink.card {\n  background: #ff8edf;\n}\n.ui.basic.cards a.pink.card:hover,\n.ui.cards a.basic.pink.card:hover,\n.ui.basic.pink.cards a.card:hover,\n.ui.link.cards .basic.pink.card:not(.icon):hover,\n.ui.link.basic.pink.cards .card:not(.icon):hover,\n.ui.link.basic.cards .pink.card:not(.icon):hover,\na.ui.basic.pink.card:hover,\n.ui.link.basic.pink.card:hover {\n  background: #ff5bd1;\n}\n.ui.inverted.pink.cards > .card,\n.ui.inverted.cards > .pink.card,\n.ui.inverted.pink.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ff8edf, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.pink.card:hover,\n.ui.inverted.pink.cards a.card:hover,\n.ui.link.inverted.pink.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .pink.card:not(.icon):hover,\na.ui.inverted.pink.card:hover,\n.ui.link.inverted.pink.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ff5bd1, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.pink.card,\n.ui.basic.inverted.pink.cards > .card,\n.ui.basic.inverted.cards > .pink.card,\n.ui.basic.inverted.pink.card {\n  background: #e03997;\n}\n.ui.inverted.cards a.basic.pink.card:hover,\n.ui.basic.inverted.cards a.pink.card:hover,\n.ui.basic.inverted.pink.cards a.card:hover,\n.ui.link.inverted.cards .basic.pink.card:not(.icon):hover,\n.ui.link.basic.inverted.pink.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .pink.card:not(.icon):hover,\na.ui.basic.inverted.pink.card:hover,\n.ui.link.basic.inverted.pink.card:hover {\n  background: #e61a8d;\n}\n.ui.brown.cards > .card,\n.ui.cards > .brown.card,\n.ui.brown.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #a5673f, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.brown.card:hover,\n.ui.brown.cards a.card:hover,\n.ui.link.brown.cards .card:not(.icon):hover,\n.ui.link.cards .brown.card:not(.icon):hover,\na.ui.brown.card:hover,\n.ui.link.brown.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #975b33, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.brown.card,\n.ui.basic.brown.cards > .card,\n.ui.basic.cards > .brown.card,\n.ui.basic.brown.card {\n  background: #d67c1c;\n}\n.ui.basic.cards a.brown.card:hover,\n.ui.cards a.basic.brown.card:hover,\n.ui.basic.brown.cards a.card:hover,\n.ui.link.cards .basic.brown.card:not(.icon):hover,\n.ui.link.basic.brown.cards .card:not(.icon):hover,\n.ui.link.basic.cards .brown.card:not(.icon):hover,\na.ui.basic.brown.card:hover,\n.ui.link.basic.brown.card:hover {\n  background: #b0620f;\n}\n.ui.inverted.brown.cards > .card,\n.ui.inverted.cards > .brown.card,\n.ui.inverted.brown.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #d67c1c, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.brown.card:hover,\n.ui.inverted.brown.cards a.card:hover,\n.ui.link.inverted.brown.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .brown.card:not(.icon):hover,\na.ui.inverted.brown.card:hover,\n.ui.link.inverted.brown.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #b0620f, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.brown.card,\n.ui.basic.inverted.brown.cards > .card,\n.ui.basic.inverted.cards > .brown.card,\n.ui.basic.inverted.brown.card {\n  background: #a5673f;\n}\n.ui.inverted.cards a.basic.brown.card:hover,\n.ui.basic.inverted.cards a.brown.card:hover,\n.ui.basic.inverted.brown.cards a.card:hover,\n.ui.link.inverted.cards .basic.brown.card:not(.icon):hover,\n.ui.link.basic.inverted.brown.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .brown.card:not(.icon):hover,\na.ui.basic.inverted.brown.card:hover,\n.ui.link.basic.inverted.brown.card:hover {\n  background: #975b33;\n}\n.ui.grey.cards > .card,\n.ui.cards > .grey.card,\n.ui.grey.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #767676, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.grey.card:hover,\n.ui.grey.cards a.card:hover,\n.ui.link.grey.cards .card:not(.icon):hover,\n.ui.link.cards .grey.card:not(.icon):hover,\na.ui.grey.card:hover,\n.ui.link.grey.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #838383, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.grey.card,\n.ui.basic.grey.cards > .card,\n.ui.basic.cards > .grey.card,\n.ui.basic.grey.card {\n  background: #dcddde;\n}\n.ui.basic.cards a.grey.card:hover,\n.ui.cards a.basic.grey.card:hover,\n.ui.basic.grey.cards a.card:hover,\n.ui.link.cards .basic.grey.card:not(.icon):hover,\n.ui.link.basic.grey.cards .card:not(.icon):hover,\n.ui.link.basic.cards .grey.card:not(.icon):hover,\na.ui.basic.grey.card:hover,\n.ui.link.basic.grey.card:hover {\n  background: #c2c4c5;\n}\n.ui.inverted.grey.cards > .card,\n.ui.inverted.cards > .grey.card,\n.ui.inverted.grey.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #dcddde, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.grey.card:hover,\n.ui.inverted.grey.cards a.card:hover,\n.ui.link.inverted.grey.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .grey.card:not(.icon):hover,\na.ui.inverted.grey.card:hover,\n.ui.link.inverted.grey.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #c2c4c5, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.grey.card,\n.ui.basic.inverted.grey.cards > .card,\n.ui.basic.inverted.cards > .grey.card,\n.ui.basic.inverted.grey.card {\n  background: #767676;\n}\n.ui.inverted.cards a.basic.grey.card:hover,\n.ui.basic.inverted.cards a.grey.card:hover,\n.ui.basic.inverted.grey.cards a.card:hover,\n.ui.link.inverted.cards .basic.grey.card:not(.icon):hover,\n.ui.link.basic.inverted.grey.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .grey.card:not(.icon):hover,\na.ui.basic.inverted.grey.card:hover,\n.ui.link.basic.inverted.grey.card:hover {\n  background: #838383;\n}\n.ui.black.cards > .card,\n.ui.cards > .black.card,\n.ui.black.card {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #1b1c1d, 0 1px 3px 0 #d4d4d5;\n}\n.ui.cards a.black.card:hover,\n.ui.black.cards a.card:hover,\n.ui.link.black.cards .card:not(.icon):hover,\n.ui.link.cards .black.card:not(.icon):hover,\na.ui.black.card:hover,\n.ui.link.black.card:hover {\n  box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #27292a, 0 1px 3px 0 #bcbdbd;\n}\n.ui.cards > .basic.black.card,\n.ui.basic.black.cards > .card,\n.ui.basic.cards > .black.card,\n.ui.basic.black.card {\n  background: #545454;\n}\n.ui.cards > .basic.black.card .header,\n.ui.basic.black.cards > .card .header,\n.ui.basic.cards > .black.card .header,\n.ui.basic.black.card .header,\n.ui.cards > .basic.black.card .content,\n.ui.basic.black.cards > .card .content,\n.ui.basic.cards > .black.card .content,\n.ui.basic.black.card .content,\n.ui.cards > .basic.black.card .meta,\n.ui.basic.black.cards > .card .meta,\n.ui.basic.cards > .black.card .meta,\n.ui.basic.black.card .meta,\n.ui.cards > .basic.black.card .description,\n.ui.basic.black.cards > .card .description,\n.ui.basic.cards > .black.card .description,\n.ui.basic.black.card .description {\n  color: #fff;\n}\n.ui.basic.cards a.black.card:hover,\n.ui.cards a.basic.black.card:hover,\n.ui.basic.black.cards a.card:hover,\n.ui.link.cards .basic.black.card:not(.icon):hover,\n.ui.link.basic.black.cards .card:not(.icon):hover,\n.ui.link.basic.cards .black.card:not(.icon):hover,\na.ui.basic.black.card:hover,\n.ui.link.basic.black.card:hover {\n  background: #000000;\n}\n.ui.inverted.black.cards > .card,\n.ui.inverted.cards > .black.card,\n.ui.inverted.black.card {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #545454, 0 0 0 1px #555;\n}\n.ui.inverted.cards a.black.card:hover,\n.ui.inverted.black.cards a.card:hover,\n.ui.link.inverted.black.cards .card:not(.icon):hover,\n.ui.link.inverted.cards .black.card:not(.icon):hover,\na.ui.inverted.black.card:hover,\n.ui.link.inverted.black.card:hover {\n  box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #000000, 0 0 0 1px #555;\n}\n.ui.inverted.cards > .basic.black.card,\n.ui.basic.inverted.black.cards > .card,\n.ui.basic.inverted.cards > .black.card,\n.ui.basic.inverted.black.card {\n  background: #1b1c1d;\n}\n.ui.inverted.cards a.basic.black.card:hover,\n.ui.basic.inverted.cards a.black.card:hover,\n.ui.basic.inverted.black.cards a.card:hover,\n.ui.link.inverted.cards .basic.black.card:not(.icon):hover,\n.ui.link.basic.inverted.black.cards .card:not(.icon):hover,\n.ui.link.basic.inverted.cards .black.card:not(.icon):hover,\na.ui.basic.inverted.black.card:hover,\n.ui.link.basic.inverted.black.card:hover {\n  background: #27292a;\n}\n\n/* --------------\n       Card Count\n    --------------- */\n.ui.one.cards {\n  margin-left: 0;\n  margin-right: 0;\n}\n.ui.one.cards > .card {\n  width: 100%;\n}\n.ui.two.cards {\n  margin-left: -1em;\n  margin-right: -1em;\n}\n.ui.two.cards > .card {\n  width: calc(50% - 2em);\n  margin-left: 1em;\n  margin-right: 1em;\n}\n.ui.three.cards {\n  margin-left: -1em;\n  margin-right: -1em;\n}\n.ui.three.cards > .card {\n  width: calc(33.33333333333333% - 2em);\n  margin-left: 1em;\n  margin-right: 1em;\n}\n.ui.four.cards {\n  margin-left: -0.75em;\n  margin-right: -0.75em;\n}\n.ui.four.cards > .card {\n  width: calc(25% - 1.5em);\n  margin-left: 0.75em;\n  margin-right: 0.75em;\n}\n.ui.five.cards {\n  margin-left: -0.75em;\n  margin-right: -0.75em;\n}\n.ui.five.cards > .card {\n  width: calc(20% - 1.5em);\n  margin-left: 0.75em;\n  margin-right: 0.75em;\n}\n.ui.six.cards {\n  margin-left: -0.75em;\n  margin-right: -0.75em;\n}\n.ui.six.cards > .card {\n  width: calc(16.666666666666664% - 1.5em);\n  margin-left: 0.75em;\n  margin-right: 0.75em;\n}\n.ui.seven.cards {\n  margin-left: -0.5em;\n  margin-right: -0.5em;\n}\n.ui.seven.cards > .card {\n  width: calc(14.285714285714285% - 1em);\n  margin-left: 0.5em;\n  margin-right: 0.5em;\n}\n.ui.eight.cards {\n  margin-left: -0.5em;\n  margin-right: -0.5em;\n}\n.ui.eight.cards > .card {\n  width: calc(12.5% - 1em);\n  margin-left: 0.5em;\n  margin-right: 0.5em;\n  font-size: 11px;\n}\n.ui.nine.cards {\n  margin-left: -0.5em;\n  margin-right: -0.5em;\n}\n.ui.nine.cards > .card {\n  width: calc(11.11111111111111% - 1em);\n  margin-left: 0.5em;\n  margin-right: 0.5em;\n  font-size: 10px;\n}\n.ui.ten.cards {\n  margin-left: -0.5em;\n  margin-right: -0.5em;\n}\n.ui.ten.cards > .card {\n  width: calc(10% - 1em);\n  margin-left: 0.5em;\n  margin-right: 0.5em;\n}\n\n/* -------------------\n          Doubling\n    -------------------- */\n\n/* Mobile Only */\n@media only screen and (max-width: 767.98px) {\n  .ui.two.doubling.cards {\n    margin-left: 0;\n    margin-right: 0;\n  }\n  .ui.two.doubling.cards > .card {\n    width: 100%;\n    margin-left: 0;\n    margin-right: 0;\n  }\n  .ui.three.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.three.doubling.cards > .card {\n    width: calc(50% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.four.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.four.doubling.cards > .card {\n    width: calc(50% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.five.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.five.doubling.cards > .card {\n    width: calc(50% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.six.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.six.doubling.cards > .card {\n    width: calc(50% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.seven.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.seven.doubling.cards > .card {\n    width: calc(33.33333333333333% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.eight.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.eight.doubling.cards > .card {\n    width: calc(33.33333333333333% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.nine.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.nine.doubling.cards > .card {\n    width: calc(33.33333333333333% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.ten.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.ten.doubling.cards > .card {\n    width: calc(33.33333333333333% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n}\n\n/* Tablet Only */\n@media only screen and (min-width: 768px) and (max-width: 991.98px) {\n  .ui.two.doubling.cards {\n    margin-left: 0;\n    margin-right: 0;\n  }\n  .ui.two.doubling.cards > .card {\n    width: 100%;\n    margin-left: 0;\n    margin-right: 0;\n  }\n  .ui.three.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.three.doubling.cards > .card {\n    width: calc(50% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.four.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.four.doubling.cards > .card {\n    width: calc(50% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.five.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.five.doubling.cards > .card {\n    width: calc(33.33333333333333% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.six.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.six.doubling.cards > .card {\n    width: calc(33.33333333333333% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.eight.doubling.cards {\n    margin-left: -1em;\n    margin-right: -1em;\n  }\n  .ui.eight.doubling.cards > .card {\n    width: calc(33.33333333333333% - 2em);\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.eight.doubling.cards {\n    margin-left: -0.75em;\n    margin-right: -0.75em;\n  }\n  .ui.eight.doubling.cards > .card {\n    width: calc(25% - 1.5em);\n    margin-left: 0.75em;\n    margin-right: 0.75em;\n  }\n  .ui.nine.doubling.cards {\n    margin-left: -0.75em;\n    margin-right: -0.75em;\n  }\n  .ui.nine.doubling.cards > .card {\n    width: calc(25% - 1.5em);\n    margin-left: 0.75em;\n    margin-right: 0.75em;\n  }\n  .ui.ten.doubling.cards {\n    margin-left: -0.75em;\n    margin-right: -0.75em;\n  }\n  .ui.ten.doubling.cards > .card {\n    width: calc(20% - 1.5em);\n    margin-left: 0.75em;\n    margin-right: 0.75em;\n  }\n}\n\n/* -------------------\n          Stackable\n    -------------------- */\n@media only screen and (max-width: 767.98px) {\n  .ui.stackable.cards {\n    display: block !important;\n  }\n  .ui.stackable.cards .card:first-child {\n    margin-top: 0 !important;\n  }\n  .ui.stackable.cards > .card {\n    display: block !important;\n    height: auto !important;\n    margin: 1em 1em;\n    padding: 0 !important;\n    width: calc(100% - 2em) !important;\n  }\n}\n\n/* --------------\n      Size\n--------------- */\n.ui.cards > .card {\n  font-size: 1em;\n}\n.ui.mini.card,\n.ui.mini.cards .card {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.card,\n.ui.tiny.cards .card {\n  font-size: 0.85714286rem;\n}\n.ui.small.card,\n.ui.small.cards .card {\n  font-size: 0.92857143rem;\n}\n.ui.large.card,\n.ui.large.cards .card {\n  font-size: 1.14285714rem;\n}\n.ui.big.card,\n.ui.big.cards .card {\n  font-size: 1.28571429rem;\n}\n.ui.huge.card,\n.ui.huge.cards .card {\n  font-size: 1.42857143rem;\n}\n.ui.massive.card,\n.ui.massive.cards .card {\n  font-size: 1.71428571rem;\n}\n\n/* -----------------\n          Inverted\n    ------------------ */\n.ui.inverted.cards > .card,\n.ui.inverted.card {\n  background: #1b1c1d;\n  box-shadow: 0 1px 3px 0 #555, 0 0 0 1px #555;\n}\n\n/* Content */\n.ui.inverted.cards > .card > .content,\n.ui.inverted.card > .content {\n  border-top: 1px solid rgba(255, 255, 255, 0.15);\n}\n\n/* Header */\n.ui.inverted.cards > .card > .content > .header,\n.ui.inverted.card > .content > .header {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.cards > .card > .content > a.header,\n.ui.inverted.card > .content > a.header {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.cards > .card > .content > a.header:hover,\n.ui.inverted.card > .content > a.header:hover {\n  color: #1e70bf;\n}\n\n/* Description */\n.ui.inverted.cards > .card > .content > .description,\n.ui.inverted.card > .content > .description {\n  color: rgba(255, 255, 255, 0.8);\n}\n\n/* Meta */\n.ui.inverted.cards > .card .meta,\n.ui.inverted.card .meta {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.cards > .card .meta > a:not(.ui),\n.ui.inverted.card .meta > a:not(.ui) {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.cards > .card .meta > a:not(.ui):hover,\n.ui.inverted.card .meta > a:not(.ui):hover {\n  color: #ffffff;\n}\n\n/* Extra */\n.ui.inverted.cards > .card > .extra,\n.ui.inverted.card > .extra {\n  border-top: 1px solid rgba(255, 255, 255, 0.15) !important;\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.cards > .card > .extra a:not(.ui),\n.ui.inverted.card > .extra a:not(.ui) {\n  color: rgba(255, 255, 255, 0.5);\n}\n.ui.inverted.cards > .card > .extra a:not(.ui):hover,\n.ui.inverted.card > .extra a:not(.ui):hover {\n  color: #1e70bf;\n}\n\n/* Link card(s) */\n.ui.inverted.cards a.card:hover,\n.ui.inverted.link.cards .card:not(.icon):hover,\na.inverted.ui.card:hover,\n.ui.inverted.link.card:hover {\n  background: #1b1c1d;\n}\n\n/* Loading */\n.ui.inverted.loading.card {\n  color: #fff;\n}\n.ui.inverted.loading.card::before {\n  background: rgba(0, 0, 0, 0.85);\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/checkbox.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Checkbox\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n           Checkbox\n*******************************/\n\n\n/* --------------\n    Content\n--------------- */\n.ui.checkbox {\n  position: relative;\n  display: inline-block;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  outline: none;\n  vertical-align: baseline;\n  font-style: normal;\n  min-height: 17px;\n  font-size: 1em;\n  line-height: 17px;\n  min-width: 17px;\n}\n\n/* HTML Checkbox */\n.ui.checkbox input[type=\"checkbox\"],\n.ui.checkbox input[type=\"radio\"] {\n  cursor: pointer;\n  position: absolute;\n  top: 0;\n  left: 0;\n  opacity: 0 !important;\n  outline: none;\n  z-index: 3;\n  width: 17px;\n  height: 17px;\n}\n.ui.checkbox label {\n  cursor: auto;\n  position: relative;\n  display: block;\n  outline: none;\n  font-size: 1em;\n}\n.ui.checkbox:not(.invisible) label {\n  padding-left: 1.85714em;\n}\n.ui.checkbox label::before {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 17px;\n  height: 17px;\n  content: \"\";\n  background: #fff;\n  border-radius: 0.21428571rem;\n  transition: border 0.1s ease, opacity 0.1s ease, transform 0.1s ease, box-shadow 0.1s ease;\n  border: 1px solid #d4d4d5;\n}\n\n/* --------------\n    Checkmark\n--------------- */\n.ui.checkbox label::after {\n  position: absolute;\n  font-size: 14px;\n  top: 0;\n  left: 0;\n  width: 17px;\n  height: 17px;\n  text-align: center;\n  opacity: 0;\n  color: rgba(0, 0, 0, 0.87);\n  transition: border 0.1s ease, opacity 0.1s ease, transform 0.1s ease, box-shadow 0.1s ease;\n}\n.ui.right.aligned.checkbox label {\n  padding-left: 0;\n  padding-right: 1.85714em;\n}\n.ui.right.aligned.checkbox label::after,\n.ui.right.aligned.checkbox label::before {\n  right: 0;\n  left: auto;\n}\n\n/* --------------\n      Label\n--------------- */\n\n/* Inside */\n.ui.checkbox label,\n.ui.checkbox + label {\n  color: rgba(0, 0, 0, 0.87);\n  transition: color 0.1s ease;\n}\n\n/* Outside */\n.ui.checkbox + label {\n  vertical-align: middle;\n}\n\n\n/*******************************\n           States\n*******************************/\n\n\n/* --------------\n      Hover\n--------------- */\n.ui.checkbox label:hover::before {\n  background: #fff;\n  border-color: rgba(34, 36, 38, 0.35);\n}\n.ui.checkbox:not(.invisible) label:hover,\n.ui.checkbox:not(.invisible) + label:hover {\n  color: rgba(0, 0, 0, 0.8);\n}\n\n/* --------------\n      Down\n--------------- */\n.ui.checkbox label:active::before {\n  background: #f9fafb;\n  border-color: rgba(34, 36, 38, 0.35);\n}\n.ui.checkbox label:active::after {\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.checkbox:not(.invisible) input:active ~ label {\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------\n     Focus\n--------------- */\n.ui.checkbox input:focus ~ label::before {\n  background: #fff;\n  border-color: #96c8da;\n}\n.ui.checkbox input:focus ~ label::after {\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.checkbox:not(.invisible) input:focus ~ label {\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------\n     Active\n--------------- */\n.ui.checkbox input:checked ~ label::before {\n  background: #fff;\n  border-color: rgba(34, 36, 38, 0.35);\n}\n.ui.checkbox input:checked ~ label::after {\n  opacity: 1;\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------\n      Indeterminate\n    --------------- */\n.ui.checkbox input:not([type=\"radio\"]):indeterminate ~ label::before {\n  background: #fff;\n  border-color: rgba(34, 36, 38, 0.35);\n}\n.ui.checkbox input:not([type=\"radio\"]):indeterminate ~ label::after {\n  opacity: 1;\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.indeterminate.toggle.checkbox input:not([type=\"radio\"]):indeterminate ~ label::before {\n  background: rgba(0, 0, 0, 0.15);\n}\n.ui.indeterminate.toggle.checkbox input:not([type=\"radio\"]) ~ label::after {\n  left: 1.075rem;\n}\n.ui.right.aligned.indeterminate.toggle.checkbox input:not([type=\"radio\"]) ~ label::after {\n  left: auto;\n  right: 1.075rem;\n}\n\n/* --------------\n  Active Focus\n--------------- */\n.ui.checkbox input:not([type=\"radio\"]):indeterminate:focus ~ label::before,\n.ui.checkbox input:checked:focus ~ label::before {\n  background: #fff;\n  border-color: #96c8da;\n}\n.ui.checkbox input:not([type=\"radio\"]):indeterminate:focus ~ label::after,\n.ui.checkbox input:checked:focus ~ label::after {\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------\n        Read-Only\n    --------------- */\n.ui.read-only.checkbox,\n.ui.read-only.checkbox label {\n  cursor: default;\n  pointer-events: none;\n}\n\n/* --------------\n         Disabled\n    --------------- */\n.ui.disabled.checkbox label,\n.ui.checkbox input[disabled] ~ label {\n  cursor: default;\n  opacity: 0.5;\n  color: #000000;\n  pointer-events: none;\n}\n\n/* --------------\n     Hidden\n--------------- */\n\n/* Initialized checkbox moves input below element\n to prevent manually triggering */\n.ui.checkbox input.hidden {\n  z-index: -1;\n}\n\n/* Selectable Label */\n.ui.checkbox input + label[for],\n.ui.checkbox input.hidden + label {\n  cursor: pointer;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/* --------------\n         Radio\n    --------------- */\n.ui.radio.checkbox {\n  min-height: 15px;\n}\n.ui.radio.checkbox label {\n  padding-left: 1.85714em;\n}\n\n/* Box */\n.ui.radio.checkbox label::before {\n  content: \"\";\n  transform: none;\n  width: 15px;\n  height: 15px;\n  border-radius: 500rem;\n  top: 1px;\n  left: 0;\n}\n\n/* Bullet */\n.ui.radio.checkbox label::after {\n  border: none;\n  content: \"\" !important;\n  line-height: 15px;\n  top: 1px;\n  left: 0;\n  width: 15px;\n  height: 15px;\n  border-radius: 500rem;\n  transform: scale(0.46666667);\n  background-color: rgba(0, 0, 0, 0.87);\n}\n\n/* Focus */\n.ui.radio.checkbox input:focus ~ label::before {\n  background-color: #fff;\n}\n.ui.radio.checkbox input:focus ~ label::after {\n  background-color: rgba(0, 0, 0, 0.95);\n}\n\n/* Indeterminate */\n.ui.radio.checkbox input:indeterminate ~ label::after {\n  opacity: 0;\n}\n\n/* Active */\n.ui.radio.checkbox input:checked ~ label::before {\n  background-color: #fff;\n}\n.ui.radio.checkbox input:checked ~ label::after {\n  background-color: rgba(0, 0, 0, 0.95);\n}\n\n/* Active Focus */\n.ui.radio.checkbox input:focus:checked ~ label::before {\n  background-color: #fff;\n}\n.ui.radio.checkbox input:focus:checked ~ label::after {\n  background-color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------\n         Slider\n    --------------- */\n.ui.slider.checkbox {\n  min-height: 1.25rem;\n}\n\n/* Input */\n.ui.slider.checkbox input {\n  width: 3.5rem;\n  height: 1.25rem;\n}\n\n/* Label */\n.ui.slider.checkbox label {\n  padding-left: 4.5rem;\n  line-height: 1rem;\n  color: rgba(0, 0, 0, 0.4);\n}\n\n/* Line */\n.ui.slider.checkbox label::before {\n  display: block;\n  position: absolute;\n  content: \"\";\n  transform: none;\n  border: none !important;\n  left: 0;\n  z-index: 1;\n  top: 0.4rem;\n  background-color: rgba(0, 0, 0, 0.05);\n  width: 3.5rem;\n  height: 0.21428571rem;\n  border-radius: 500rem;\n  transition: background 0.3s ease;\n}\n\n/* Handle */\n.ui.slider.checkbox label::after {\n  background: #fff linear-gradient(transparent, rgba(0, 0, 0, 0.05));\n  position: absolute;\n  content: \"\" !important;\n  opacity: 1;\n  z-index: 2;\n  border: none;\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15) inset;\n  width: 1.5rem;\n  height: 1.5rem;\n  top: -0.25rem;\n  left: 0;\n  transform: none;\n  border-radius: 500rem;\n  transition: left 0.3s ease;\n}\n\n/* Focus */\n.ui.slider.checkbox input:focus ~ label::before {\n  background-color: rgba(0, 0, 0, 0.15);\n  border: none;\n}\n\n/* Hover */\n.ui.slider.checkbox label:hover {\n  color: rgba(0, 0, 0, 0.8);\n}\n.ui.slider.checkbox label:hover::before {\n  background: rgba(0, 0, 0, 0.15);\n}\n\n/* Active */\n.ui.slider.checkbox input:checked ~ label {\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.slider.checkbox input:checked ~ label::before {\n  background-color: #545454;\n}\n.ui.slider.checkbox input:checked ~ label::after {\n  left: 2rem;\n}\n\n/* Active Focus */\n.ui.slider.checkbox input:focus:checked ~ label {\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.slider.checkbox input:focus:checked ~ label::before {\n  background-color: #000000;\n}\n.ui.right.aligned.slider.checkbox label {\n  padding-left: 0;\n  padding-right: 4.5rem;\n}\n.ui.right.aligned.slider.checkbox label::after {\n  left: auto;\n  right: 2rem;\n  transition: right 0.3s ease;\n}\n.ui.right.aligned.slider.checkbox input:checked ~ label::after {\n  left: auto;\n  right: 0;\n}\n\n/* --------------\n         Toggle\n    --------------- */\n.ui.toggle.checkbox {\n  min-height: 1.5rem;\n}\n\n/* Input */\n.ui.toggle.checkbox input {\n  width: 3.5rem;\n  height: 1.5rem;\n}\n\n/* Label */\n.ui.toggle.checkbox label {\n  min-height: 1.5rem;\n  padding-left: 4.5rem;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.toggle.checkbox label {\n  padding-top: 0.15em;\n}\n\n/* Switch */\n.ui.toggle.checkbox label::before {\n  display: block;\n  position: absolute;\n  content: \"\";\n  z-index: 1;\n  transform: none;\n  border: none;\n  top: 0;\n  background: rgba(0, 0, 0, 0.05);\n  box-shadow: none;\n  width: 3.5rem;\n  height: 1.5rem;\n  border-radius: 500rem;\n}\n\n/* Handle */\n.ui.toggle.checkbox label::after {\n  background: #fff linear-gradient(transparent, rgba(0, 0, 0, 0.05));\n  position: absolute;\n  content: \"\" !important;\n  opacity: 1;\n  z-index: 2;\n  border: none;\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15) inset;\n  width: 1.5rem;\n  height: 1.5rem;\n  top: 0;\n  left: 0;\n  border-radius: 500rem;\n  transition: background 0.3s ease, left 0.3s ease;\n}\n.ui.toggle.checkbox input ~ label::after {\n  left: -0.05rem;\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15) inset;\n}\n\n/* Focus */\n.ui.toggle.checkbox input:focus ~ label::before {\n  background-color: rgba(0, 0, 0, 0.15);\n  border: none;\n}\n\n/* Hover */\n.ui.toggle.checkbox label:hover::before {\n  background-color: rgba(0, 0, 0, 0.15);\n  border: none;\n}\n\n/* Active */\n.ui.toggle.checkbox input:checked ~ label {\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.toggle.checkbox input:checked ~ label::before {\n  background-color: #2185d0;\n}\n.ui.toggle.checkbox input:checked ~ label::after {\n  left: 2.15rem;\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15) inset;\n}\n\n/* Active Focus */\n.ui.toggle.checkbox input:focus:checked ~ label {\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.toggle.checkbox input:focus:checked ~ label::before {\n  background-color: #0d71bb;\n}\n.ui.right.aligned.toggle.checkbox label {\n  padding-left: 0;\n  padding-right: 4.5rem;\n}\n.ui.right.aligned.toggle.checkbox input ~ label::after {\n  left: auto;\n  right: 2.15rem;\n  transition: background 0.3s ease, right 0.3s ease;\n}\n.ui.right.aligned.toggle.checkbox input:checked ~ label::after {\n  left: auto;\n  right: -0.05rem;\n}\n\n\n/*******************************\n            Variations\n*******************************/\n\n\n/* --------------\n         Fitted\n    --------------- */\n.ui.ui.fitted.checkbox label {\n  padding-left: 0;\n}\n.ui.fitted.toggle.checkbox {\n  width: 3.5rem;\n}\n.ui.fitted.slider.checkbox {\n  width: 3.5rem;\n}\n\n/* --------------\n         Inverted\n    --------------- */\n.ui.ui.ui.inverted.checkbox label,\n.ui.ui.ui.inverted.checkbox + label {\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* Hover */\n.ui.ui.inverted.checkbox label:hover {\n  color: #ffffff;\n}\n.ui.inverted.checkbox label:hover::before {\n  border-color: rgba(34, 36, 38, 0.5);\n}\n\n/* Slider Label */\n.ui.inverted.slider.checkbox label {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n/* Slider Line */\n.ui.ui.inverted.slider.checkbox label::before {\n  background-color: rgba(255, 255, 255, 0.5);\n}\n\n/* Slider Hover */\n.ui.ui.inverted.slider.checkbox label:hover::before {\n  background: rgba(255, 255, 255, 0.7);\n}\n\n/* Slider Active */\n.ui.ui.inverted.slider.checkbox input:checked ~ label {\n  color: #ffffff;\n}\n.ui.ui.inverted.slider.checkbox input:checked ~ label::before {\n  background-color: rgba(255, 255, 255, 0.8);\n}\n\n/* Slider Active Focus */\n.ui.ui.inverted.slider.checkbox input:focus:checked ~ label {\n  color: #ffffff;\n}\n.ui.ui.inverted.slider.checkbox input:focus:checked ~ label::before {\n  background-color: rgba(255, 255, 255, 0.8);\n}\n\n/* Toggle Switch */\n.ui.ui.inverted.toggle.checkbox label::before {\n  background-color: rgba(255, 255, 255, 0.9);\n}\n\n/* Toggle Hover */\n.ui.ui.inverted.toggle.checkbox label:hover::before {\n  background: #ffffff;\n}\n\n/* Toggle Active */\n.ui.ui.inverted.toggle.checkbox input:checked ~ label {\n  color: #ffffff;\n}\n.ui.ui.inverted.toggle.checkbox input:checked ~ label::before {\n  background-color: #2185d0;\n}\n\n/* Toggle Active Focus */\n.ui.ui.inverted.toggle.checkbox input:focus:checked ~ label {\n  color: #ffffff;\n}\n.ui.ui.inverted.toggle.checkbox input:focus:checked ~ label::before {\n  background-color: #0d71bb;\n}\n\n/* --------------\n         Invisible\n    --------------- */\n.ui.invisible.checkbox:not(.compact) {\n  display: block;\n}\n.ui.invisible.checkbox input {\n  left: -99999px;\n  position: absolute;\n}\n.ui.invisible.checkbox label::before,\n.ui.invisible.checkbox label::after {\n  display: none;\n}\n.ui.invisible.checkbox label {\n  transition: all 0.1s ease;\n}\n.ui.ui.ui.ui.ui.invisible.checkbox input:not(:checked) + label {\n  background: transparent;\n  border-color: transparent;\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15) inset;\n  color: inherit;\n}\n.ui.ui.ui.ui.ui.invisible.checkbox input:not(:checked):not(:hover):focus + label:not(.image) {\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.35) inset;\n}\n.ui.ui.ui.ui.ui.invisible.checkbox input:not(:checked) + label.image,\n.basic.ui.ui.ui.ui.ui.invisible.checkbox input:not(:checked) + label {\n  box-shadow: none;\n}\n.ui.invisible.checkbox input:not(:checked) + label.image {\n  opacity: 0.5;\n  filter: grayscale(1);\n}\n.ui.invisible.checkbox input:not(:checked):not(:hover):focus + label.image {\n  opacity: 0.75;\n}\n.ui.invisible.checkbox input:not(:checked)[disabled] + label.image,\n.disabled.ui.invisible.checkbox input:not(:checked) + label.image {\n  opacity: 0.25;\n}\n\n/* --------------------\n        Size\n--------------------- */\n.ui.mini.checkbox {\n  font-size: 0.78571429em;\n}\n.ui.tiny.checkbox {\n  font-size: 0.85714286em;\n}\n.ui.small.checkbox {\n  font-size: 0.92857143em;\n}\n.ui.large.checkbox {\n  font-size: 1.14285714em;\n}\n.ui.large.form .checkbox:not(.slider):not(.toggle):not(.radio) label::after,\n.ui.large.checkbox:not(.slider):not(.toggle):not(.radio) label::after,\n.ui.large.form .checkbox:not(.slider):not(.toggle):not(.radio) label::before,\n.ui.large.checkbox:not(.slider):not(.toggle):not(.radio) label::before {\n  transform: scale(1.14285714);\n  transform-origin: left;\n}\n.ui.large.form .checkbox.radio label::before,\n.ui.large.checkbox.radio label::before {\n  transform: scale(1.14285714);\n  transform-origin: left;\n}\n.ui.large.form .checkbox.radio label::after,\n.ui.large.checkbox.radio label::after {\n  transform: scale(0.57142857);\n  transform-origin: left;\n  left: 0.33571429em;\n}\n.ui.big.checkbox {\n  font-size: 1.28571429em;\n}\n.ui.big.form .checkbox:not(.slider):not(.toggle):not(.radio) label::after,\n.ui.big.checkbox:not(.slider):not(.toggle):not(.radio) label::after,\n.ui.big.form .checkbox:not(.slider):not(.toggle):not(.radio) label::before,\n.ui.big.checkbox:not(.slider):not(.toggle):not(.radio) label::before {\n  transform: scale(1.28571429);\n  transform-origin: left;\n}\n.ui.big.form .checkbox.radio label::before,\n.ui.big.checkbox.radio label::before {\n  transform: scale(1.28571429);\n  transform-origin: left;\n}\n.ui.big.form .checkbox.radio label::after,\n.ui.big.checkbox.radio label::after {\n  transform: scale(0.64285714);\n  transform-origin: left;\n  left: 0.37142857em;\n}\n.ui.huge.checkbox {\n  font-size: 1.42857143em;\n}\n.ui.huge.form .checkbox:not(.slider):not(.toggle):not(.radio) label::after,\n.ui.huge.checkbox:not(.slider):not(.toggle):not(.radio) label::after,\n.ui.huge.form .checkbox:not(.slider):not(.toggle):not(.radio) label::before,\n.ui.huge.checkbox:not(.slider):not(.toggle):not(.radio) label::before {\n  transform: scale(1.42857143);\n  transform-origin: left;\n}\n.ui.huge.form .checkbox.radio label::before,\n.ui.huge.checkbox.radio label::before {\n  transform: scale(1.42857143);\n  transform-origin: left;\n}\n.ui.huge.form .checkbox.radio label::after,\n.ui.huge.checkbox.radio label::after {\n  transform: scale(0.71428571);\n  transform-origin: left;\n  left: 0.40714286em;\n}\n.ui.massive.checkbox {\n  font-size: 1.71428571em;\n}\n.ui.massive.form .checkbox:not(.slider):not(.toggle):not(.radio) label::after,\n.ui.massive.checkbox:not(.slider):not(.toggle):not(.radio) label::after,\n.ui.massive.form .checkbox:not(.slider):not(.toggle):not(.radio) label::before,\n.ui.massive.checkbox:not(.slider):not(.toggle):not(.radio) label::before {\n  transform: scale(1.71428571);\n  transform-origin: left;\n}\n.ui.massive.form .checkbox.radio label::before,\n.ui.massive.checkbox.radio label::before {\n  transform: scale(1.71428571);\n  transform-origin: left;\n}\n.ui.massive.form .checkbox.radio label::after,\n.ui.massive.checkbox.radio label::after {\n  transform: scale(0.85714286);\n  transform-origin: left;\n  left: 0.47857143em;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n@font-face {\n  font-family: Checkbox;\n  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\");\n}\n\n/* Checkmark */\n.ui.checkbox label::after {\n  font-family: Checkbox;\n}\n\n/* Checked */\n.ui.checkbox input:checked ~ label::after {\n  content: \"\\e800\";\n}\n\n/* Indeterminate */\n.ui.checkbox input:indeterminate ~ label::after {\n  font-size: 12px;\n  content: \"\\e801\";\n}\n/* UTF Reference\n.check::before { content: '\\e800'; }\n.dash::before { content: '\\e801'; }\n.plus::before { content: '\\e802'; }\n*/\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/checkbox.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Checkbox\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.checkbox = function (parameters) {\n        var\n            $allModules    = $(this),\n\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n            returnedValue\n        ;\n\n        $allModules.each(function () {\n            var\n                settings        = $.extend(true, {}, $.fn.checkbox.settings, parameters),\n\n                className       = settings.className,\n                namespace       = settings.namespace,\n                selector        = settings.selector,\n                error           = settings.error,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                $module         = $(this),\n                $label          = $(this).children(selector.label),\n                $input          = $(this).children(selector.input),\n                input           = $input[0],\n\n                initialLoad     = false,\n                shortcutPressed = false,\n                instance        = $module.data(moduleNamespace),\n\n                observer,\n                element         = this,\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.verbose('Initializing checkbox', settings);\n\n                    module.create.label();\n                    module.bind.events();\n\n                    module.set.tabbable();\n                    module.hide.input();\n\n                    module.observeChanges();\n                    module.instantiate();\n                    module.setup();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying module');\n                    module.unbind.events();\n                    module.show.input();\n                    $module.removeData(moduleNamespace);\n                },\n\n                fix: {\n                    reference: function () {\n                        if ($module.is(selector.input)) {\n                            module.debug('Behavior called on <input> adjusting invoked element');\n                            $module = $module.closest(selector.checkbox);\n                            module.refresh();\n                        }\n                    },\n                },\n\n                setup: function () {\n                    module.set.initialLoad();\n                    if (module.is.indeterminate()) {\n                        module.debug('Initial value is indeterminate');\n                        module.indeterminate();\n                    } else if (module.is.checked()) {\n                        module.debug('Initial value is checked');\n                        module.check();\n                    } else {\n                        module.debug('Initial value is unchecked');\n                        module.uncheck();\n                    }\n                    module.remove.initialLoad();\n                },\n\n                refresh: function () {\n                    $label = $module.children(selector.label);\n                    $input = $module.children(selector.input);\n                    input = $input[0];\n                },\n\n                hide: {\n                    input: function () {\n                        module.verbose('Modifying <input> z-index to be unselectable');\n                        $input.addClass(className.hidden);\n                    },\n                },\n                show: {\n                    input: function () {\n                        module.verbose('Modifying <input> z-index to be selectable');\n                        $input.removeClass(className.hidden);\n                    },\n                },\n\n                observeChanges: function () {\n                    if ('MutationObserver' in window) {\n                        observer = new MutationObserver(function (mutations) {\n                            module.debug('DOM tree modified, updating selector cache');\n                            module.refresh();\n                        });\n                        observer.observe(element, {\n                            childList: true,\n                            subtree: true,\n                        });\n                        module.debug('Setting up mutation observer', observer);\n                    }\n                },\n\n                attachEvents: function (selector, event) {\n                    var\n                        $element = $(selector)\n                    ;\n                    event = isFunction(module[event])\n                        ? module[event]\n                        : module.toggle;\n                    if ($element.length > 0) {\n                        module.debug('Attaching checkbox events to element', selector, event);\n                        $element\n                            .on('click' + eventNamespace, event)\n                        ;\n                    } else {\n                        module.error(error.notFound);\n                    }\n                },\n\n                preventDefaultOnInputTarget: function () {\n                    if (event !== undefined && event !== null && $(event.target).is(selector.input)) {\n                        module.verbose('Preventing default check action after manual check action');\n                        event.preventDefault();\n                    }\n                },\n\n                event: {\n                    change: function (event) {\n                        if (!module.should.ignoreCallbacks()) {\n                            settings.onChange.call(input);\n                        }\n                    },\n                    click: function (event) {\n                        var\n                            $target = $(event.target)\n                        ;\n                        if ($target.is(selector.input)) {\n                            module.verbose('Using default check action on initialized checkbox');\n\n                            return;\n                        }\n                        if ($target.is(selector.link)) {\n                            module.debug('Clicking link inside checkbox, skipping toggle');\n\n                            return;\n                        }\n                        module.toggle();\n                        $input.trigger('focus');\n                        event.preventDefault();\n                    },\n                    keydown: function (event) {\n                        var\n                            key     = event.which,\n                            keyCode = {\n                                enter: 13,\n                                space: 32,\n                                escape: 27,\n                                left: 37,\n                                up: 38,\n                                right: 39,\n                                down: 40,\n                            }\n                        ;\n\n                        var\n                            r = module.get.radios().not(selector.disabled),\n                            rIndex = r.index($module),\n                            rLen = r.length,\n                            checkIndex = false\n                        ;\n\n                        if (key === keyCode.left || key === keyCode.up) {\n                            checkIndex = (rIndex === 0 ? rLen : rIndex) - 1;\n                        } else if (key === keyCode.right || key === keyCode.down) {\n                            checkIndex = rIndex === rLen - 1 ? 0 : rIndex + 1;\n                        }\n\n                        if (!module.should.ignoreCallbacks() && checkIndex !== false) {\n                            if (settings.beforeUnchecked.apply(input) === false) {\n                                module.verbose('Option not allowed to be unchecked, cancelling key navigation');\n\n                                return false;\n                            }\n                            var nextOption = $(r[checkIndex]),\n                                nextInput = nextOption.children(selector.input),\n                                disallowOption = nextOption.hasClass(className.readOnly) || nextInput.prop('readonly');\n                            if (disallowOption || settings.beforeChecked.apply(nextInput[0]) === false) {\n                                module.verbose('Next option should not allow check, cancelling key navigation');\n\n                                return false;\n                            }\n                        }\n\n                        shortcutPressed = false;\n                        if (key === keyCode.escape) {\n                            module.verbose('Escape key pressed blurring field');\n                            $input.trigger('blur');\n                            shortcutPressed = true;\n                            event.stopPropagation();\n                        } else if (!module.can.change()) {\n                            shortcutPressed = true;\n                        } else if (!event.ctrlKey) {\n                            if (key === keyCode.space || (key === keyCode.enter && settings.enableEnterKey)) {\n                                module.verbose('Enter/space key pressed, toggling checkbox');\n                                module.toggle();\n                                shortcutPressed = true;\n                            } else if ($module.is('.toggle, .slider') && !module.is.radio()) {\n                                if (key === keyCode.left && module.is.checked()) {\n                                    module.uncheck();\n                                    shortcutPressed = true;\n                                } else if (key === keyCode.right && module.is.unchecked()) {\n                                    module.check();\n                                    shortcutPressed = true;\n                                }\n                            }\n                        }\n                    },\n                    keyup: function (event) {\n                        if (shortcutPressed) {\n                            event.preventDefault();\n                        }\n                    },\n                },\n\n                check: function () {\n                    if (!module.should.allowCheck()) {\n                        return;\n                    }\n                    module.debug('Checking checkbox', $input);\n                    module.set.checked();\n                    if (!module.should.ignoreCallbacks()) {\n                        settings.onChecked.call(input);\n                        module.trigger.change();\n                    }\n                    module.preventDefaultOnInputTarget();\n                },\n\n                uncheck: function () {\n                    if (!module.should.allowUncheck()) {\n                        return;\n                    }\n                    module.debug('Unchecking checkbox');\n                    module.set.unchecked();\n                    if (!module.should.ignoreCallbacks()) {\n                        settings.onUnchecked.call(input);\n                        module.trigger.change();\n                    }\n                    module.preventDefaultOnInputTarget();\n                },\n\n                indeterminate: function () {\n                    if (module.should.allowIndeterminate()) {\n                        module.debug('Checkbox is already indeterminate');\n\n                        return;\n                    }\n                    module.debug('Making checkbox indeterminate');\n                    module.set.indeterminate();\n                    if (!module.should.ignoreCallbacks()) {\n                        settings.onIndeterminate.call(input);\n                        module.trigger.change();\n                    }\n                },\n\n                determinate: function () {\n                    if (module.should.allowDeterminate()) {\n                        module.debug('Checkbox is already determinate');\n\n                        return;\n                    }\n                    module.debug('Making checkbox determinate');\n                    module.set.determinate();\n                    if (!module.should.ignoreCallbacks()) {\n                        settings.onDeterminate.call(input);\n                        module.trigger.change();\n                    }\n                },\n\n                enable: function () {\n                    if (module.is.enabled()) {\n                        module.debug('Checkbox is already enabled');\n\n                        return;\n                    }\n                    module.debug('Enabling checkbox');\n                    module.set.enabled();\n                    if (!module.should.ignoreCallbacks()) {\n                        settings.onEnable.call(input);\n                        // preserve legacy callbacks\n                        settings.onEnabled.call(input);\n                    }\n                },\n\n                disable: function () {\n                    if (module.is.disabled()) {\n                        module.debug('Checkbox is already disabled');\n\n                        return;\n                    }\n                    module.debug('Disabling checkbox');\n                    module.set.disabled();\n                    if (!module.should.ignoreCallbacks()) {\n                        settings.onDisable.call(input);\n                        // preserve legacy callbacks\n                        settings.onDisabled.call(input);\n                    }\n                },\n\n                get: {\n                    radios: function () {\n                        var\n                            name = module.get.name()\n                        ;\n\n                        return $('input[name=\"' + name + '\"]').closest(selector.checkbox);\n                    },\n                    otherRadios: function () {\n                        return module.get.radios().not($module);\n                    },\n                    name: function () {\n                        return $input.attr('name');\n                    },\n                },\n\n                is: {\n                    initialLoad: function () {\n                        return initialLoad;\n                    },\n                    radio: function () {\n                        return $input.hasClass(className.radio) || $input.attr('type') === 'radio';\n                    },\n                    indeterminate: function () {\n                        return $input.prop('indeterminate') !== undefined && $input.prop('indeterminate');\n                    },\n                    checked: function () {\n                        return $input.prop('checked') !== undefined && $input.prop('checked');\n                    },\n                    disabled: function () {\n                        return $input.prop('disabled') !== undefined && $input.prop('disabled');\n                    },\n                    enabled: function () {\n                        return !module.is.disabled();\n                    },\n                    determinate: function () {\n                        return !module.is.indeterminate();\n                    },\n                    unchecked: function () {\n                        return !module.is.checked();\n                    },\n                },\n\n                should: {\n                    allowCheck: function () {\n                        if (module.is.determinate() && module.is.checked() && !module.is.initialLoad()) {\n                            module.debug('Should not allow check, checkbox is already checked');\n\n                            return false;\n                        }\n                        if (!module.should.ignoreCallbacks() && settings.beforeChecked.apply(input) === false) {\n                            module.debug('Should not allow check, beforeChecked cancelled');\n\n                            return false;\n                        }\n\n                        return true;\n                    },\n                    allowUncheck: function () {\n                        if (module.is.determinate() && module.is.unchecked() && !module.is.initialLoad()) {\n                            module.debug('Should not allow uncheck, checkbox is already unchecked');\n\n                            return false;\n                        }\n                        if (!module.should.ignoreCallbacks() && settings.beforeUnchecked.apply(input) === false) {\n                            module.debug('Should not allow uncheck, beforeUnchecked cancelled');\n\n                            return false;\n                        }\n\n                        return true;\n                    },\n                    allowIndeterminate: function () {\n                        if (module.is.indeterminate() && !module.is.initialLoad()) {\n                            module.debug('Should not allow indeterminate, checkbox is already indeterminate');\n\n                            return false;\n                        }\n                        if (!module.should.ignoreCallbacks() && settings.beforeIndeterminate.apply(input) === false) {\n                            module.debug('Should not allow indeterminate, beforeIndeterminate cancelled');\n\n                            return false;\n                        }\n\n                        return true;\n                    },\n                    allowDeterminate: function () {\n                        if (module.is.determinate() && !module.is.initialLoad()) {\n                            module.debug('Should not allow determinate, checkbox is already determinate');\n\n                            return false;\n                        }\n                        if (!module.should.ignoreCallbacks() && settings.beforeDeterminate.apply(input) === false) {\n                            module.debug('Should not allow determinate, beforeDeterminate cancelled');\n\n                            return false;\n                        }\n\n                        return true;\n                    },\n                    ignoreCallbacks: function () {\n                        return initialLoad && !settings.fireOnInit;\n                    },\n                },\n\n                can: {\n                    change: function () {\n                        return !($module.hasClass(className.disabled) || $module.hasClass(className.readOnly) || $input.prop('disabled') || $input.prop('readonly'));\n                    },\n                    uncheck: function () {\n                        return typeof settings.uncheckable === 'boolean'\n                            ? settings.uncheckable\n                            : !module.is.radio();\n                    },\n                },\n\n                set: {\n                    initialLoad: function () {\n                        initialLoad = true;\n                    },\n                    checked: function () {\n                        module.verbose('Setting class to checked');\n                        $module\n                            .removeClass(className.indeterminate)\n                            .addClass(className.checked)\n                        ;\n                        if (module.is.radio()) {\n                            module.uncheckOthers();\n                        }\n                        if (!module.is.indeterminate() && module.is.checked()) {\n                            module.debug('Input is already checked, skipping input property change');\n\n                            return;\n                        }\n                        module.verbose('Setting state to checked', input);\n                        $input\n                            .prop('indeterminate', false)\n                            .prop('checked', true)\n                        ;\n                    },\n                    unchecked: function () {\n                        module.verbose('Removing checked class');\n                        $module\n                            .removeClass(className.indeterminate)\n                            .removeClass(className.checked)\n                        ;\n                        if (!module.is.indeterminate() && module.is.unchecked()) {\n                            module.debug('Input is already unchecked');\n\n                            return;\n                        }\n                        module.debug('Setting state to unchecked');\n                        $input\n                            .prop('indeterminate', false)\n                            .prop('checked', false)\n                        ;\n                    },\n                    indeterminate: function () {\n                        module.verbose('Setting class to indeterminate');\n                        $module\n                            .addClass(className.indeterminate)\n                        ;\n                        if (module.is.indeterminate()) {\n                            module.debug('Input is already indeterminate, skipping input property change');\n\n                            return;\n                        }\n                        module.debug('Setting state to indeterminate');\n                        $input\n                            .prop('indeterminate', true)\n                        ;\n                    },\n                    determinate: function () {\n                        module.verbose('Removing indeterminate class');\n                        $module\n                            .removeClass(className.indeterminate)\n                        ;\n                        if (module.is.determinate()) {\n                            module.debug('Input is already determinate, skipping input property change');\n\n                            return;\n                        }\n                        module.debug('Setting state to determinate');\n                        $input\n                            .prop('indeterminate', false)\n                        ;\n                    },\n                    disabled: function () {\n                        module.verbose('Setting class to disabled');\n                        $module\n                            .addClass(className.disabled)\n                        ;\n                        if (module.is.disabled()) {\n                            module.debug('Input is already disabled, skipping input property change');\n\n                            return;\n                        }\n                        module.debug('Setting state to disabled');\n                        $input\n                            .prop('disabled', 'disabled')\n                        ;\n                    },\n                    enabled: function () {\n                        module.verbose('Removing disabled class');\n                        $module.removeClass(className.disabled);\n                        if (module.is.enabled()) {\n                            module.debug('Input is already enabled, skipping input property change');\n\n                            return;\n                        }\n                        module.debug('Setting state to enabled');\n                        $input\n                            .prop('disabled', false)\n                        ;\n                    },\n                    tabbable: function () {\n                        module.verbose('Adding tabindex to checkbox');\n                        if ($input.attr('tabindex') === undefined) {\n                            $input.attr('tabindex', 0);\n                        }\n                    },\n                },\n\n                remove: {\n                    initialLoad: function () {\n                        initialLoad = false;\n                    },\n                },\n\n                trigger: {\n                    change: function () {\n                        var\n                            inputElement = $input[0]\n                        ;\n                        if (inputElement) {\n                            var events = document.createEvent('HTMLEvents');\n                            module.verbose('Triggering native change event');\n                            events.initEvent('change', true, false);\n                            inputElement.dispatchEvent(events);\n                        }\n                    },\n                },\n\n                create: {\n                    label: function () {\n                        if ($input.prevAll(selector.label).length > 0) {\n                            $input.prev(selector.label).detach().insertAfter($input);\n                            module.debug('Moving existing label', $label);\n                        } else if (!module.has.label()) {\n                            $label = $('<label>').insertAfter($input);\n                            module.debug('Creating label', $label);\n                        }\n                    },\n                },\n\n                has: {\n                    label: function () {\n                        return $label.length > 0;\n                    },\n                },\n\n                bind: {\n                    events: function () {\n                        module.verbose('Attaching checkbox events');\n                        $module\n                            .on('click' + eventNamespace, module.event.click)\n                            .on('change' + eventNamespace, module.event.change)\n                            .on('keydown' + eventNamespace, selector.input, module.event.keydown)\n                            .on('keyup' + eventNamespace, selector.input, module.event.keyup)\n                        ;\n                    },\n                },\n\n                unbind: {\n                    events: function () {\n                        module.debug('Removing events');\n                        $module\n                            .off(eventNamespace)\n                        ;\n                    },\n                },\n\n                uncheckOthers: function () {\n                    var\n                        $radios = module.get.otherRadios()\n                    ;\n                    module.debug('Unchecking other radios', $radios);\n                    $radios.removeClass(className.checked);\n                },\n\n                toggle: function () {\n                    if (!module.can.change()) {\n                        if (!module.is.radio()) {\n                            module.debug('Checkbox is read-only or disabled, ignoring toggle');\n                        }\n\n                        return;\n                    }\n                    if (module.is.indeterminate() || module.is.unchecked()) {\n                        module.debug('Currently unchecked');\n                        module.check();\n                    } else if (module.is.checked() && module.can.uncheck()) {\n                        module.debug('Currently checked');\n                        module.uncheck();\n                    }\n                },\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.checkbox.settings = {\n\n        name: 'Checkbox',\n        namespace: 'checkbox',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        // delegated event context\n        uncheckable: 'auto',\n        fireOnInit: false,\n        enableEnterKey: true,\n\n        onChange: function () {},\n\n        beforeChecked: function () {},\n        beforeUnchecked: function () {},\n        beforeDeterminate: function () {},\n        beforeIndeterminate: function () {},\n\n        onChecked: function () {},\n        onUnchecked: function () {},\n\n        onDeterminate: function () {},\n        onIndeterminate: function () {},\n\n        onEnable: function () {},\n        onDisable: function () {},\n\n        // preserve misspelled callbacks (will be removed in 3.0)\n        onEnabled: function () {},\n        onDisabled: function () {},\n\n        className: {\n            checked: 'checked',\n            indeterminate: 'indeterminate',\n            disabled: 'disabled',\n            hidden: 'hidden',\n            radio: 'radio',\n            readOnly: 'read-only',\n        },\n\n        error: {\n            method: 'The method you called is not defined',\n        },\n\n        selector: {\n            checkbox: '.ui.checkbox',\n            disabled: '.disabled, :has(input[disabled])',\n            label: 'label',\n            input: 'input[type=\"checkbox\"], input[type=\"radio\"]',\n            link: 'a[href]',\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/comment.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Comment\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Standard\n*******************************/\n\n\n/* --------------\n    Comments\n--------------- */\n.ui.comments {\n  margin: 1.5em 0;\n  max-width: 650px;\n}\n.ui.comments:first-child {\n  margin-top: 0;\n}\n.ui.comments:last-child {\n  margin-bottom: 0;\n}\n\n/* --------------\n     Comment\n--------------- */\n.ui.comments .comment {\n  position: relative;\n  background: none;\n  margin: 0.5em 0 0;\n  padding: 0.5em 0 0;\n  border: none;\n  border-top: none;\n  line-height: 1.2;\n}\n.ui.comments .comment:first-child {\n  margin-top: 0;\n  padding-top: 0;\n}\n\n/* --------------------\n    Nested Comments\n--------------------- */\n.ui.comments .comment > .comments {\n  margin: 0 0 0.5em 0.5em;\n  padding: 1em 0 1em 1em;\n}\n.ui.comments .comment > .comments::before {\n  position: absolute;\n  top: 0;\n  left: 0;\n}\n.ui.comments .comment > .comments .comment {\n  border: none;\n  border-top: none;\n  background: none;\n}\n\n/* --------------\n         Avatar\n    --------------- */\n.ui.comments .comment .avatar {\n  display: block;\n  width: 2.5em;\n  height: auto;\n  float: left;\n  margin: 0.2em 0 0;\n}\n.ui.comments .comment img.avatar,\n.ui.comments .comment .avatar img {\n  display: block;\n  margin: 0 auto;\n  width: 100%;\n  height: 100%;\n  border-radius: 0.25rem;\n}\n\n/* --------------\n     Content\n--------------- */\n.ui.comments .comment > .content {\n  display: block;\n}\n\n/* If there is an avatar move content over */\n.ui.comments .comment > .avatar ~ .content {\n  margin-left: 3.5em;\n}\n\n/* --------------\n         Author\n    --------------- */\n.ui.comments .comment .author {\n  font-size: 1em;\n  color: rgba(0, 0, 0, 0.87);\n  font-weight: bold;\n}\n.ui.comments .comment a.author {\n  cursor: pointer;\n}\n.ui.comments .comment a.author:hover {\n  color: #1e70bf;\n}\n\n/* --------------\n         Metadata\n    --------------- */\n.ui.comments .comment .metadata {\n  display: inline-block;\n  margin-left: 0.5em;\n  color: rgba(0, 0, 0, 0.4);\n  font-size: 0.875em;\n}\n.ui.comments .comment .metadata > * {\n  display: inline-block;\n  margin: 0 0.5em 0 0;\n}\n.ui.comments .comment .metadata > :last-child {\n  margin-right: 0;\n}\n\n/* --------------------\n     Comment Text\n--------------------- */\n.ui.comments .comment .text {\n  margin: 0.25em 0 0.5em;\n  font-size: 1em;\n  word-wrap: break-word;\n  color: rgba(0, 0, 0, 0.87);\n  line-height: 1.3;\n}\n\n/* --------------------\n         User Actions\n    --------------------- */\n.ui.comments .comment .actions {\n  font-size: 0.875em;\n}\n.ui.comments .comment .actions a {\n  cursor: pointer;\n  display: inline-block;\n  margin: 0 0.75em 0 0;\n  color: rgba(0, 0, 0, 0.4);\n}\n.ui.comments .comment .actions a:last-child {\n  margin-right: 0;\n}\n.ui.comments .comment .actions a.active,\n.ui.comments .comment .actions a:hover {\n  color: rgba(0, 0, 0, 0.8);\n}\n\n/* --------------------\n          Reply Form\n    --------------------- */\n.ui.comments > .reply.form {\n  margin-top: 1em;\n}\n.ui.comments .comment .reply.form {\n  width: 100%;\n  margin-top: 1em;\n}\n.ui.comments .reply.form textarea {\n  font-size: 1em;\n  height: 12em;\n}\n\n\n/*******************************\n            State\n*******************************/\n\n.ui.collapsed.comments,\n.ui.comments .collapsed.comments,\n.ui.comments .collapsed.comment {\n  display: none;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------------\n            Threaded\n    --------------------- */\n.ui.threaded.comments .comment > .comments {\n  margin: -1.5em 0 -1em 1.25em;\n  padding: 3em 0 2em 2.25em;\n  box-shadow: -1px 0 0 rgba(34, 36, 38, 0.15);\n}\n\n/* --------------------\n            Minimal\n    --------------------- */\n.ui.minimal.comments .comment .actions {\n  opacity: 0;\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: auto;\n  transition: opacity 0.2s ease;\n  transition-delay: 0.1s;\n}\n.ui.minimal.comments .comment > .content:hover > .actions {\n  opacity: 1;\n}\n\n/* -------------------\n        Sizes\n-------------------- */\n.ui.comments {\n  font-size: 1rem;\n}\n.ui.mini.comments {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.comments {\n  font-size: 0.85714286rem;\n}\n.ui.small.comments {\n  font-size: 0.92857143rem;\n}\n.ui.large.comments {\n  font-size: 1.14285714rem;\n}\n.ui.big.comments {\n  font-size: 1.28571429rem;\n}\n.ui.huge.comments {\n  font-size: 1.42857143rem;\n}\n.ui.massive.comments {\n  font-size: 1.71428571rem;\n}\n\n/* -------------------\n            Inverted\n    -------------------- */\n.ui.inverted.comments .comment {\n  background-color: #1b1c1d;\n}\n.ui.inverted.comments .comment .author,\n.ui.inverted.comments .comment .text {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.comments .comment .metadata,\n.ui.inverted.comments .comment .actions a {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.comments .comment a.author:hover,\n.ui.inverted.comments .comment .actions a.active,\n.ui.inverted.comments .comment .actions a:hover {\n  color: #ffffff;\n}\n.ui.inverted.threaded.comments .comment > .comments {\n  box-shadow: -1px 0 0 #555;\n}\n.ui.disabled.comments,\n.ui.comments .disabled.comment {\n  opacity: 0.45;\n  pointer-events: none;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/container.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Container\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Container\n*******************************/\n\n\n/* All Sizes */\n.ui.container {\n  display: block;\n  max-width: 100%;\n}\n\n/* Mobile */\n@media only screen and (max-width: 767.98px) {\n  .ui.ui.ui.container:not(.fluid) {\n    width: auto;\n    margin-left: 1em;\n    margin-right: 1em;\n  }\n  .ui.ui.ui.grid.container {\n    width: auto;\n  }\n  .ui.ui.ui.relaxed.grid.container {\n    width: auto;\n  }\n  .ui.ui.ui.very.relaxed.grid.container {\n    width: auto;\n  }\n}\n\n/* Tablet */\n@media only screen and (min-width: 768px) and (max-width: 991.98px) {\n  .ui.ui.ui.container:not(.fluid) {\n    width: 723px;\n    margin-left: auto;\n    margin-right: auto;\n  }\n  .ui.ui.ui.grid.container {\n    width: calc(723px + 2rem);\n  }\n  .ui.ui.ui.relaxed.grid.container {\n    width: calc(723px + 3rem);\n  }\n  .ui.ui.ui.very.relaxed.grid.container {\n    width: calc(723px + 5rem);\n  }\n}\n\n/* Small Monitor */\n@media only screen and (min-width: 992px) and (max-width: 1199.98px) {\n  .ui.ui.ui.container:not(.fluid) {\n    width: 933px;\n    margin-left: auto;\n    margin-right: auto;\n  }\n  .ui.ui.ui.grid.container {\n    width: calc(933px + 2rem);\n  }\n  .ui.ui.ui.relaxed.grid.container {\n    width: calc(933px + 3rem);\n  }\n  .ui.ui.ui.very.relaxed.grid.container {\n    width: calc(933px + 5rem);\n  }\n}\n\n/* Large Monitor */\n@media only screen and (min-width: 1200px) {\n  .ui.ui.ui.container:not(.fluid) {\n    width: 1127px;\n    margin-left: auto;\n    margin-right: auto;\n  }\n  .ui.ui.ui.grid.container {\n    width: calc(1127px + 2rem);\n  }\n  .ui.ui.ui.relaxed.grid.container {\n    width: calc(1127px + 3rem);\n  }\n  .ui.ui.ui.very.relaxed.grid.container {\n    width: calc(1127px + 5rem);\n  }\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/* Text Container */\n.ui.text.container {\n  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\";\n  max-width: 700px;\n  line-height: 1.5;\n  font-size: 1.14285714rem;\n}\n\n/* Wide Container */\n@media only screen and (min-width: 768px) and (max-width: 991.98px) {\n  .ui.ui.ui.wide.container {\n    width: 867.6px;\n  }\n}\n@media only screen and (min-width: 992px) and (max-width: 1199.98px) {\n  .ui.ui.ui.wide.container {\n    width: 1119.6px;\n  }\n}\n@media only screen and (min-width: 1200px) {\n  .ui.ui.ui.wide.container {\n    width: 1352.4px;\n  }\n}\n\n/* Fluid */\n.ui.fluid.container {\n  width: 100%;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n.ui[class*=\"left aligned\"].container {\n  text-align: left;\n}\n.ui[class*=\"center aligned\"].container {\n  text-align: center;\n}\n.ui[class*=\"right aligned\"].container {\n  text-align: right;\n}\n.ui.justified.container {\n  text-align: justify;\n  -webkit-hyphens: auto;\n      -ms-hyphens: auto;\n          hyphens: auto;\n}\n\n/* --------------\n      Scrolling\n    --------------- */\n.ui.scrolling.container {\n  overflow: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.scrolling.container.short {\n    max-height: 11.25em;\n  }\n  .ui.scrolling.container.short.resizable {\n    height: 11.25em;\n  }\n  .ui.scrolling.container[class*=\"very short\"] {\n    max-height: 7.5em;\n  }\n  .ui.scrolling.container[class*=\"very short\"].resizable {\n    height: 7.5em;\n  }\n  .ui.scrolling.container {\n    max-height: 15em;\n  }\n  .ui.scrolling.container.long {\n    max-height: 30em;\n  }\n  .ui.scrolling.container.long.resizable {\n    height: 30em;\n  }\n  .ui.scrolling.container[class*=\"very long\"] {\n    max-height: 45em;\n  }\n  .ui.scrolling.container[class*=\"very long\"].resizable {\n    height: 45em;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.scrolling.container.short {\n    max-height: 13.5em;\n  }\n  .ui.scrolling.container.short.resizable {\n    height: 13.5em;\n  }\n  .ui.scrolling.container[class*=\"very short\"] {\n    max-height: 9em;\n  }\n  .ui.scrolling.container[class*=\"very short\"].resizable {\n    height: 9em;\n  }\n  .ui.scrolling.container {\n    max-height: 18em;\n  }\n  .ui.scrolling.container.resizable {\n    height: 18em;\n  }\n  .ui.scrolling.container.long {\n    max-height: 36em;\n  }\n  .ui.scrolling.container.long.resizable {\n    height: 36em;\n  }\n  .ui.scrolling.container[class*=\"very long\"] {\n    max-height: 54em;\n  }\n  .ui.scrolling.container[class*=\"very long\"].resizable {\n    height: 54em;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.scrolling.container.short {\n    max-height: 18em;\n  }\n  .ui.scrolling.container.short.resizable {\n    height: 18em;\n  }\n  .ui.scrolling.container[class*=\"very short\"] {\n    max-height: 12em;\n  }\n  .ui.scrolling.container[class*=\"very short\"].resizable {\n    height: 12em;\n  }\n  .ui.scrolling.container {\n    max-height: 24em;\n  }\n  .ui.scrolling.container.resizable {\n    height: 24em;\n  }\n  .ui.scrolling.container.long {\n    max-height: 48em;\n  }\n  .ui.scrolling.container.long.resizable {\n    height: 48em;\n  }\n  .ui.scrolling.container[class*=\"very long\"] {\n    max-height: 72em;\n  }\n  .ui.scrolling.container[class*=\"very long\"].resizable {\n    height: 72em;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.scrolling.container.short {\n    max-height: 22.5em;\n  }\n  .ui.scrolling.container.short.resizable {\n    height: 22.5em;\n  }\n  .ui.scrolling.container[class*=\"very short\"] {\n    max-height: 15em;\n  }\n  .ui.scrolling.container[class*=\"very short\"].resizable {\n    height: 15em;\n  }\n  .ui.scrolling.container {\n    max-height: 30em;\n  }\n  .ui.scrolling.container.resizable {\n    height: 30em;\n  }\n  .ui.scrolling.container.long {\n    max-height: 60em;\n  }\n  .ui.scrolling.container.long.resizable {\n    height: 60em;\n  }\n  .ui.scrolling.container[class*=\"very long\"] {\n    max-height: 90em;\n  }\n  .ui.scrolling.container[class*=\"very long\"].resizable {\n    height: 90em;\n  }\n}\n.ui.resizable.scrolling.container {\n  resize: vertical;\n  max-height: none;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/dimmer.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Dimmer\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Dimmer\n*******************************/\n\n.dimmable:not(body) {\n  position: relative;\n}\n.ui.dimmer {\n  display: none;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  text-align: center;\n  vertical-align: middle;\n  padding: 1em;\n  background: rgba(0, 0, 0, 0.85);\n  opacity: 0;\n  line-height: 1;\n  animation-fill-mode: both;\n  animation-duration: 0.5s;\n  transition: all 0.5s linear;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  will-change: opacity;\n  z-index: 1000;\n}\n\n/* Dimmer Content */\n.ui.dimmer > .content {\n  -webkit-user-select: text;\n      -ms-user-select: text;\n          user-select: text;\n  color: #fff;\n}\n\n/* Loose Coupling */\n.ui.segment > .ui.dimmer:not(.page) {\n  border-radius: inherit;\n}\n\n/* Scrollbars */\n.ui.dimmer:not(.inverted)::-webkit-scrollbar-track {\n  background: rgba(255, 255, 255, 0.1);\n}\n.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb {\n  background: rgba(255, 255, 255, 0.25);\n}\n.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:window-inactive {\n  background: rgba(255, 255, 255, 0.15);\n}\n.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:hover {\n  background: rgba(255, 255, 255, 0.35);\n}\n.ui.dimmer:not(.inverted) {\n  \n/* IE11 */\n  scrollbar-face-color: #656565;\n  scrollbar-shadow-color: #656565;\n  scrollbar-track-color: #323232;\n  scrollbar-arrow-color: #323232;\n}\n@supports (-moz-appearance: none) {\n  .ui.dimmer:not(.inverted) {\n    \n/* firefox: first color thumb, second track */\n    scrollbar-color: rgba(255, 255, 255, 0.25) rgba(255, 255, 255, 0.1);\n  }\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* Animating */\n.animating.dimmable:not(body),\n.dimmed.dimmable:not(body) {\n  overflow: hidden;\n}\n\n/* Animating / Active / Visible */\n.dimmed.dimmable > .ui.animating.dimmer,\n.dimmed.dimmable > .ui.visible.dimmer,\n.ui.active.dimmer {\n  display: flex;\n  opacity: 1;\n}\n\n/* Disabled */\n.ui.disabled.dimmer {\n  width: 0 !important;\n  height: 0 !important;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n        Legacy\n    --------------- */\n\n/* Animating / Active / Visible */\n.dimmed.dimmable > .ui.animating.legacy.dimmer,\n.dimmed.dimmable > .ui.visible.legacy.dimmer,\n.ui.active.legacy.dimmer {\n  display: block;\n}\n\n/* --------------\n        Alignment\n    --------------- */\n.ui[class*=\"top aligned\"].dimmer {\n  justify-content: flex-start;\n}\n.ui[class*=\"bottom aligned\"].dimmer {\n  justify-content: flex-end;\n}\n\n/* --------------\n          Page\n    --------------- */\n.ui.page.dimmer {\n  position: fixed;\n  transform-style: \"\";\n  perspective: 2000px;\n  transform-origin: center center;\n}\n.ui.page.dimmer.modals {\n  -moz-perspective: none;\n}\nbody.animating.in.dimmable,\nbody.dimmed.dimmable {\n  overflow: hidden;\n}\nbody.dimmable > .dimmer {\n  position: fixed;\n}\n\n/* --------------\n        Blurring\n    --------------- */\n@supports (not (-webkit-backdrop-filter: none)) and (not ((-webkit-backdrop-filter: none) or (backdrop-filter: none))) {\n  .blurring.dimmable > :not(.dimmer) {\n    filter: initial;\n    transition: 800ms filter ease;\n  }\n  .blurring.dimmed.dimmable > :not(.dimmer):not(.popup) {\n    filter: blur(5px) grayscale(0.7);\n  }\n}\n\n/* Dimmer Color */\n.blurring.dimmable > .dimmer {\n  background: rgba(0, 0, 0, 0.6);\n  -webkit-backdrop-filter: blur(5px) grayscale(0.7);\n  backdrop-filter: blur(5px) grayscale(0.7);\n}\n.blurring.dimmable > .inverted.dimmer {\n  background: rgba(255, 255, 255, 0.6);\n}\n\n/* --------------\n        Aligned\n    --------------- */\n.ui.dimmer > .top.aligned.content > * {\n  vertical-align: top;\n}\n.ui.dimmer > .bottom.aligned.content > * {\n  vertical-align: bottom;\n}\n\n/* --------------\n        Shades\n    --------------- */\n.medium.medium.medium.medium.medium.dimmer {\n  background: rgba(0, 0, 0, 0.65);\n}\n.light.light.light.light.light.dimmer {\n  background: rgba(0, 0, 0, 0.45);\n}\n.very.very.very.very.light.dimmer {\n  background: rgba(0, 0, 0, 0.25);\n}\n\n/* --------------\n        Inverted\n    --------------- */\n.ui.inverted.dimmer {\n  background: rgba(255, 255, 255, 0.85);\n}\n.ui.inverted.dimmer > .content,\n.ui.inverted.dimmer > .content > * {\n  color: #000;\n}\n\n/* --------------\n         Inverted Shades\n        --------------- */\n.medium.medium.medium.medium.medium.inverted.dimmer {\n  background: rgba(255, 255, 255, 0.65);\n}\n.light.light.light.light.light.inverted.dimmer {\n  background: rgba(255, 255, 255, 0.45);\n}\n.very.very.very.very.light.inverted.dimmer {\n  background: rgba(255, 255, 255, 0.25);\n}\n\n/* --------------\n         Simple\n    --------------- */\n\n/* Displays without javascript */\n.ui.simple.dimmer {\n  display: block;\n  overflow: hidden;\n  opacity: 0;\n  width: 0;\n  height: 0;\n  z-index: -100;\n  background: rgba(0, 0, 0, 0);\n}\n.dimmed.dimmable > .ui.simple.dimmer {\n  overflow: visible;\n  opacity: 1;\n  width: 100%;\n  height: 100%;\n  background: rgba(0, 0, 0, 0.85);\n  z-index: 1;\n}\n.ui.simple.inverted.dimmer {\n  background: rgba(255, 255, 255, 0);\n}\n.dimmed.dimmable > .ui.simple.inverted.dimmer {\n  background: rgba(255, 255, 255, 0.85);\n}\n\n/* --------------\n         Partially\n    ---------------- */\n.ui[class*=\"top dimmer\"],\n.ui[class*=\"center dimmer\"],\n.ui[class*=\"bottom dimmer\"] {\n  height: auto;\n}\n.ui[class*=\"bottom dimmer\"] {\n  top: auto;\n  bottom: 0;\n}\n.ui[class*=\"center dimmer\"] {\n  top: 50%;\n  transform: translateY(-50%);\n}\n.ui.segment > .ui.ui[class*=\"top dimmer\"] {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.segment > .ui.ui[class*=\"center dimmer\"] {\n  border-radius: 0;\n}\n.ui.segment > .ui.ui[class*=\"bottom dimmer\"] {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.ui[class*=\"center dimmer\"].transition[class*=\"fade up\"].in {\n  animation-name: fadeInUpCenter;\n}\n.ui[class*=\"center dimmer\"].transition[class*=\"fade down\"].in {\n  animation-name: fadeInDownCenter;\n}\n.ui[class*=\"center dimmer\"].transition[class*=\"fade up\"].out {\n  animation-name: fadeOutUpCenter;\n}\n.ui[class*=\"center dimmer\"].transition[class*=\"fade down\"].out {\n  animation-name: fadeOutDownCenter;\n}\n.ui[class*=\"center dimmer\"].bounce.transition {\n  animation-name: bounceCenter;\n}\n@keyframes fadeInUpCenter {\n  0% {\n    opacity: 0;\n    transform: translateY(-40%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(-50%);\n  }\n}\n@keyframes fadeInDownCenter {\n  0% {\n    opacity: 0;\n    transform: translateY(-60%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(-50%);\n  }\n}\n@keyframes fadeOutUpCenter {\n  0% {\n    opacity: 1;\n    transform: translateY(-50%);\n  }\n  100% {\n    opacity: 0;\n    transform: translateY(-45%);\n  }\n}\n@keyframes fadeOutDownCenter {\n  0% {\n    opacity: 1;\n    transform: translateY(-50%);\n  }\n  100% {\n    opacity: 0;\n    transform: translateY(-55%);\n  }\n}\n@keyframes bounceCenter {\n  0%,\n  20%,\n  50%,\n  80%,\n  100% {\n    transform: translateY(-50%);\n  }\n  40% {\n    transform: translateY(calc(-50% - 30px));\n  }\n  60% {\n    transform: translateY(calc(-50% - 15px));\n  }\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n        User Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/dimmer.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Dimmer\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.dimmer = function (parameters) {\n        var\n            $allModules     = $(this),\n\n            time            = Date.now(),\n            performance     = [],\n\n            query           = arguments[0],\n            methodInvoked   = typeof query === 'string',\n            queryArguments  = [].slice.call(arguments, 1),\n\n            returnedValue\n        ;\n\n        $allModules.each(function () {\n            var\n                settings        = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.dimmer.settings, parameters)\n                    : $.extend({}, $.fn.dimmer.settings),\n\n                selector        = settings.selector,\n                namespace       = settings.namespace,\n                className       = settings.className,\n                error           = settings.error,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                clickEvent      = 'ontouchstart' in document.documentElement\n                    ? 'touchstart'\n                    : 'click',\n\n                $module = $(this),\n                $dimmer,\n                $dimmable,\n\n                element   = this,\n                instance  = $module.data(moduleNamespace),\n                module\n            ;\n\n            module = {\n\n                preinitialize: function () {\n                    if (module.is.dimmer()) {\n                        $dimmable = $module.parent();\n                        $dimmer = $module;\n                    } else {\n                        $dimmable = $module;\n                        if (module.has.dimmer()) {\n                            $dimmer = settings.dimmerName\n                                ? $dimmable.find(selector.dimmer).filter('.' + settings.dimmerName)\n                                : $dimmable.find(selector.dimmer);\n                        } else {\n                            $dimmer = module.create();\n                        }\n                    }\n                },\n\n                initialize: function () {\n                    module.debug('Initializing dimmer', settings);\n\n                    module.bind.events();\n                    module.set.dimmable();\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, instance)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous module', $dimmer);\n                    module.unbind.events();\n                    module.remove.variation();\n                    $dimmable\n                        .off(eventNamespace)\n                    ;\n                },\n\n                bind: {\n                    events: function () {\n                        if (settings.on === 'hover') {\n                            $dimmable\n                                .on('mouseenter' + eventNamespace, module.show)\n                                .on('mouseleave' + eventNamespace, module.hide)\n                            ;\n                        } else if (settings.on === 'click') {\n                            $dimmable\n                                .on(clickEvent + eventNamespace, module.toggle)\n                            ;\n                        }\n                        if (module.is.page()) {\n                            module.debug('Setting as a page dimmer', $dimmable);\n                            module.set.pageDimmer();\n                        }\n\n                        if (module.is.closable()) {\n                            module.verbose('Adding dimmer close event', $dimmer);\n                            $dimmable\n                                .on(clickEvent + eventNamespace, selector.dimmer, module.event.click)\n                            ;\n                        }\n                    },\n                },\n\n                unbind: {\n                    events: function () {\n                        $module\n                            .removeData(moduleNamespace)\n                        ;\n                        $dimmable\n                            .off(eventNamespace)\n                        ;\n                    },\n                },\n\n                event: {\n                    click: function (event) {\n                        module.verbose('Determining if event occurred on dimmer', event);\n                        if ($dimmer.find(event.target).length === 0 || $(event.target).is(selector.content)) {\n                            module.hide();\n                            event.stopImmediatePropagation();\n                        }\n                    },\n                },\n\n                addContent: function (element) {\n                    var\n                        $content = $(element)\n                    ;\n                    module.debug('Add content to dimmer', $content);\n                    if ($content.parent()[0] !== $dimmer[0]) {\n                        $content.detach().appendTo($dimmer);\n                    }\n                },\n\n                create: function () {\n                    var\n                        $element = $(settings.template.dimmer(settings))\n                    ;\n                    if (settings.dimmerName) {\n                        module.debug('Creating named dimmer', settings.dimmerName);\n                        $element.addClass(settings.dimmerName);\n                    }\n                    $element\n                        .appendTo($dimmable)\n                    ;\n\n                    return $element;\n                },\n\n                show: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if ((!module.is.dimmed() || module.is.animating()) && module.is.enabled()) {\n                        if (settings.onShow.call(element) === false) {\n                            module.verbose('Show callback returned false cancelling dimmer show');\n\n                            return;\n                        }\n                        module.debug('Showing dimmer', $dimmer, settings);\n                        module.set.variation();\n                        module.animate.show(callback);\n                        settings.onChange.call(element);\n                    } else {\n                        module.debug('Dimmer is already shown or disabled');\n                    }\n                },\n\n                hide: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if (module.is.dimmed() || module.is.animating()) {\n                        if (settings.onHide.call(element) === false) {\n                            module.verbose('Hide callback returned false cancelling dimmer hide');\n\n                            return;\n                        }\n                        module.debug('Hiding dimmer', $dimmer);\n                        module.animate.hide(callback);\n                        settings.onChange.call(element);\n                    } else {\n                        module.debug('Dimmer is not visible');\n                    }\n                },\n\n                toggle: function () {\n                    module.verbose('Toggling dimmer visibility', $dimmer);\n                    if (!module.is.dimmed()) {\n                        module.show();\n                    } else {\n                        if (module.is.closable()) {\n                            module.hide();\n                        }\n                    }\n                },\n\n                animate: {\n                    show: function (callback) {\n                        callback = isFunction(callback)\n                            ? callback\n                            : function () {};\n                        if (settings.useCSS && $.fn.transition !== undefined) {\n                            if (settings.useFlex) {\n                                module.debug('Using flex dimmer');\n                                module.remove.legacy();\n                            } else {\n                                module.debug('Using legacy non-flex dimmer');\n                                module.set.legacy();\n                            }\n                            if (settings.opacity !== 'auto') {\n                                module.set.opacity();\n                            }\n                            $dimmer\n                                .transition({\n                                    debug: settings.debug,\n                                    verbose: settings.verbose,\n                                    silent: settings.silent,\n                                    displayType: settings.useFlex\n                                        ? 'flex'\n                                        : 'block',\n                                    animation: (settings.transition.showMethod || settings.transition) + ' in',\n                                    queue: false,\n                                    duration: module.get.duration(),\n                                    useFailSafe: true,\n                                    onStart: function () {\n                                        module.set.dimmed();\n                                    },\n                                    onComplete: function () {\n                                        module.set.active();\n                                        settings.onVisible.call($dimmer);\n                                        callback();\n                                    },\n                                })\n                            ;\n                        } else {\n                            module.verbose('Showing dimmer animation with javascript');\n                            module.set.dimmed();\n                            if (settings.opacity === 'auto') {\n                                settings.opacity = 0.8;\n                            }\n                            $dimmer\n                                .stop()\n                                .css({\n                                    opacity: 0,\n                                    width: '100%',\n                                    height: '100%',\n                                })\n                                .fadeTo(module.get.duration(), settings.opacity, function () {\n                                    $dimmer.removeAttr('style');\n                                    module.set.active();\n                                    settings.onVisible.call($dimmer);\n                                    callback();\n                                })\n                            ;\n                        }\n                    },\n                    hide: function (callback) {\n                        callback = isFunction(callback)\n                            ? callback\n                            : function () {};\n                        if (settings.useCSS && $.fn.transition !== undefined) {\n                            module.verbose('Hiding dimmer with css');\n                            $dimmer\n                                .transition({\n                                    debug: settings.debug,\n                                    verbose: settings.verbose,\n                                    silent: settings.silent,\n                                    displayType: settings.useFlex\n                                        ? 'flex'\n                                        : 'block',\n                                    animation: (settings.transition.hideMethod || settings.transition) + ' out',\n                                    queue: false,\n                                    duration: module.get.duration(),\n                                    useFailSafe: true,\n                                    onComplete: function () {\n                                        module.remove.dimmed();\n                                        module.remove.variation();\n                                        module.remove.active();\n                                        settings.onHidden.call($dimmer);\n                                        callback();\n                                    },\n                                })\n                            ;\n                        } else {\n                            module.verbose('Hiding dimmer with javascript');\n                            $dimmer\n                                .stop()\n                                .fadeOut(module.get.duration(), function () {\n                                    module.remove.dimmed();\n                                    module.remove.active();\n                                    $dimmer.removeAttr('style');\n                                    settings.onHidden.call($dimmer);\n                                    callback();\n                                })\n                            ;\n                        }\n                    },\n                },\n\n                get: {\n                    dimmer: function () {\n                        return $dimmer;\n                    },\n                    duration: function () {\n                        if (module.is.active()) {\n                            return settings.transition.hideDuration || settings.duration.hide || settings.duration;\n                        }\n\n                        return settings.transition.showDuration || settings.duration.show || settings.duration;\n                    },\n                },\n\n                has: {\n                    dimmer: function () {\n                        if (settings.dimmerName) {\n                            return $module.find(selector.dimmer).filter('.' + settings.dimmerName).length > 0;\n                        }\n\n                        return $module.find(selector.dimmer).length > 0;\n                    },\n                },\n\n                is: {\n                    active: function () {\n                        return $dimmer.hasClass(className.active);\n                    },\n                    animating: function () {\n                        return $dimmer.is(':animated') || $dimmer.hasClass(className.animating);\n                    },\n                    closable: function () {\n                        if (settings.closable === 'auto') {\n                            return settings.on !== 'hover';\n                        }\n\n                        return settings.closable;\n                    },\n                    dimmer: function () {\n                        return $module.hasClass(className.dimmer);\n                    },\n                    dimmable: function () {\n                        return $module.hasClass(className.dimmable);\n                    },\n                    dimmed: function () {\n                        return $dimmable.hasClass(className.dimmed);\n                    },\n                    disabled: function () {\n                        return $dimmable.hasClass(className.disabled);\n                    },\n                    enabled: function () {\n                        return !module.is.disabled();\n                    },\n                    page: function () {\n                        return $dimmable.is('body');\n                    },\n                    pageDimmer: function () {\n                        return $dimmer.hasClass(className.pageDimmer);\n                    },\n                },\n\n                can: {\n                    show: function () {\n                        return !$dimmer.hasClass(className.disabled);\n                    },\n                },\n\n                set: {\n                    opacity: function (opacity) {\n                        var\n                            color      = $dimmer.css('background-color'),\n                            colorArray = color.split(','),\n                            isRGB      = colorArray && colorArray.length >= 3\n                        ;\n                        opacity = settings.opacity === 0 ? 0 : settings.opacity || opacity;\n                        if (isRGB) {\n                            colorArray[2] = colorArray[2].replace(')', '');\n                            colorArray[3] = opacity + ')';\n                            color = colorArray.join(',');\n                        } else {\n                            color = 'rgba(0, 0, 0, ' + opacity + ')';\n                        }\n                        module.debug('Setting opacity to', opacity);\n                        $dimmer.css('background-color', color);\n                    },\n                    legacy: function () {\n                        $dimmer.addClass(className.legacy);\n                    },\n                    active: function () {\n                        $dimmer.addClass(className.active);\n                    },\n                    dimmable: function () {\n                        $dimmable.addClass(className.dimmable);\n                    },\n                    dimmed: function () {\n                        $dimmable.addClass(className.dimmed);\n                    },\n                    pageDimmer: function () {\n                        $dimmer.addClass(className.pageDimmer);\n                    },\n                    disabled: function () {\n                        $dimmer.addClass(className.disabled);\n                    },\n                    variation: function (variation) {\n                        variation = variation || settings.variation;\n                        if (variation) {\n                            $dimmer.addClass(variation);\n                        }\n                    },\n                },\n\n                remove: {\n                    active: function () {\n                        $dimmer\n                            .removeClass(className.active)\n                        ;\n                    },\n                    legacy: function () {\n                        $dimmer.removeClass(className.legacy);\n                    },\n                    dimmed: function () {\n                        $dimmable.removeClass(className.dimmed);\n                    },\n                    disabled: function () {\n                        $dimmer.removeClass(className.disabled);\n                    },\n                    variation: function (variation) {\n                        variation = variation || settings.variation;\n                        if (variation) {\n                            $dimmer.removeClass(variation);\n                        }\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if ($allModules.length > 1) {\n                            title += ' (' + $allModules.length + ')';\n                        }\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            module.preinitialize();\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.dimmer.settings = {\n\n        name: 'Dimmer',\n        namespace: 'dimmer',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        // whether should use flex layout\n        useFlex: true,\n\n        // name to distinguish between multiple dimmers in context\n        dimmerName: false,\n\n        // whether to add a variation type\n        variation: false,\n\n        // whether to bind close events\n        closable: 'auto',\n\n        // whether to use css animations\n        useCSS: true,\n\n        // css animation to use\n        transition: 'fade',\n\n        // event to bind to\n        on: false,\n\n        // overriding opacity value\n        opacity: 'auto',\n\n        // transition durations\n        duration: {\n            show: 500,\n            hide: 500,\n        },\n        // whether the dynamically created dimmer should have a loader\n        displayLoader: false,\n        loaderText: false,\n        loaderVariation: '',\n\n        onChange: function () {},\n        onShow: function () {},\n        onHide: function () {},\n        onVisible: function () {},\n        onHidden: function () {},\n\n        error: {\n            method: 'The method you called is not defined.',\n        },\n\n        className: {\n            active: 'active',\n            animating: 'animating',\n            dimmable: 'dimmable',\n            dimmed: 'dimmed',\n            dimmer: 'dimmer',\n            disabled: 'disabled',\n            hide: 'hide',\n            legacy: 'legacy',\n            pageDimmer: 'page',\n            show: 'show',\n            loader: 'ui loader',\n        },\n\n        selector: {\n            dimmer: '> .ui.dimmer',\n            content: '.ui.dimmer > .content, .ui.dimmer > .content > .center',\n        },\n\n        template: {\n            dimmer: function (settings) {\n                var\n                    d = $('<div/>').addClass('ui dimmer'),\n                    l\n                ;\n                if (settings.displayLoader) {\n                    l = $('<div/>')\n                        .addClass(settings.className.loader)\n                        .addClass(settings.loaderVariation)\n                    ;\n                    if (settings.loaderText) {\n                        l.text(settings.loaderText);\n                        l.addClass('text');\n                    }\n                    d.append(l);\n                }\n\n                return d;\n            },\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/divider.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Divider\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Divider\n*******************************/\n\n.ui.divider {\n  margin: 1rem 0;\n  line-height: 1;\n  height: 0;\n  font-weight: bold;\n  text-transform: uppercase;\n  letter-spacing: 0.05em;\n  color: rgba(0, 0, 0, 0.85);\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\n/* --------------\n      Basic\n--------------- */\n.ui.divider:not(.vertical):not(.horizontal) {\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n  border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n/* --------------\n    Coupling\n--------------- */\n\n/* Allow divider between each column row */\n.ui.grid > .column + .divider:not(.vertical),\n.ui.grid > .row > .column + .divider:not(.vertical) {\n  left: auto;\n}\n\n/* --------------\n       Horizontal\n    --------------- */\n.ui.horizontal.divider {\n  display: table;\n  white-space: nowrap;\n  height: auto;\n  margin: \"\";\n  line-height: 1;\n  text-align: center;\n}\n.ui.horizontal.divider::before,\n.ui.horizontal.divider::after {\n  content: \"\";\n  display: table-cell;\n  position: relative;\n  top: 50%;\n  width: 50%;\n  background-repeat: no-repeat;\n}\n.ui.horizontal.divider::before {\n  background-position: right 1em top 50%;\n}\n.ui.horizontal.divider::after {\n  background-position: left 1em top 50%;\n}\n\n/* --------------\n        Vertical\n    --------------- */\n.ui.vertical.divider {\n  position: absolute;\n  z-index: 2;\n  top: 50%;\n  left: 50%;\n  margin: 0;\n  padding: 0;\n  width: auto;\n  height: 50%;\n  line-height: 0;\n  text-align: center;\n  transform: translateX(-50%);\n}\n.ui.vertical.divider::before,\n.ui.vertical.divider::after {\n  position: absolute;\n  left: 50%;\n  content: \"\";\n  z-index: 3;\n  border-left: 1px solid rgba(34, 36, 38, 0.15);\n  border-right: 1px solid rgba(255, 255, 255, 0.1);\n  width: 0;\n  height: calc(100% - 1rem);\n}\n.ui.vertical.divider::before {\n  top: -100%;\n}\n.ui.vertical.divider::after {\n  top: auto;\n  bottom: 0;\n}\n\n/* Inside grid */\n.ui.stackable.grid .ui.vertical.divider,\n.ui.grid .stackable.row .ui.vertical.divider {\n  flex: 1;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.stackable.grid .column + .ui.vertical.divider,\n  .ui.grid .stackable.row .column + .ui.vertical.divider {\n    margin: 1rem;\n  }\n  .ui.stackable.grid .ui.vertical.divider,\n  .ui.grid .stackable.row .ui.vertical.divider {\n    display: table;\n    white-space: nowrap;\n    height: auto;\n    margin: \"\";\n    overflow: hidden;\n    line-height: 1;\n    text-align: center;\n    position: static;\n    top: 0;\n    left: 0;\n    transform: none;\n  }\n  .ui.stackable.grid .ui.vertical.divider::before,\n  .ui.grid .stackable.row .ui.vertical.divider::before,\n  .ui.stackable.grid .ui.vertical.divider::after,\n  .ui.grid .stackable.row .ui.vertical.divider::after {\n    left: 0;\n    border-left: none;\n    border-right: none;\n    content: \"\";\n    display: table-cell;\n    position: relative;\n    top: 50%;\n    width: 50%;\n    background-repeat: no-repeat;\n  }\n  .ui.stackable.grid .ui.vertical.divider::before,\n  .ui.grid .stackable.row .ui.vertical.divider::before {\n    background-position: right 1em top 50%;\n  }\n  .ui.stackable.grid .ui.vertical.divider::after,\n  .ui.grid .stackable.row .ui.vertical.divider::after {\n    background-position: left 1em top 50%;\n  }\n}\n\n/* --------------\n          Icon\n    --------------- */\n.ui.divider > .icon {\n  margin: 0;\n  font-size: 1rem;\n  height: 1em;\n  vertical-align: middle;\n}\n\n/* --------------\n         Header\n    --------------- */\n.ui.horizontal.divider[class*=\"left aligned\"]::before {\n  display: none;\n}\n.ui.horizontal.divider[class*=\"left aligned\"]::after {\n  width: 100%;\n}\n.ui.horizontal.divider[class*=\"right aligned\"]::before {\n  width: 100%;\n}\n.ui.horizontal.divider[class*=\"right aligned\"]::after {\n  display: none;\n}\n\n\n/*******************************\n          Variations\n*******************************/\n\n\n/* --------------\n        Hidden\n    --------------- */\n.ui.hidden.divider {\n  border-color: transparent !important;\n}\n.ui.hidden.divider::before,\n.ui.hidden.divider::after {\n  display: none;\n}\n\n/* --------------\n    Inverted\n--------------- */\n.ui.divider.inverted,\n.ui.vertical.inverted.divider,\n.ui.horizontal.inverted.divider {\n  color: #fff;\n}\n.ui.divider.inverted,\n.ui.divider.inverted::after,\n.ui.divider.inverted::before {\n  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;\n}\n\n/* --------------\n    Fitted\n--------------- */\n.ui.fitted.divider {\n  margin: 0;\n}\n\n/* --------------\n        Clearing\n    --------------- */\n.ui.clearing.divider {\n  clear: both;\n}\n\n/* --------------\n        Section\n    --------------- */\n.ui.section.divider {\n  margin-top: 2rem;\n  margin-bottom: 2rem;\n}\n\n/* --------------\n     Sizes\n--------------- */\n.ui.divider {\n  font-size: 1rem;\n}\n.ui.mini.divider {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.divider {\n  font-size: 0.85714286rem;\n}\n.ui.small.divider {\n  font-size: 0.92857143rem;\n}\n.ui.large.divider {\n  font-size: 1.14285714rem;\n}\n.ui.big.divider {\n  font-size: 1.28571429rem;\n}\n.ui.huge.divider {\n  font-size: 1.42857143rem;\n}\n.ui.massive.divider {\n  font-size: 1.71428571rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n.ui.horizontal.divider::before,\n.ui.horizontal.divider::after {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC\");\n}\n@media only screen and (max-width: 767px) {\n  .ui.stackable.grid .ui.vertical.divider::before,\n  .ui.grid .stackable.row .ui.vertical.divider::before,\n  .ui.stackable.grid .ui.vertical.divider::after,\n  .ui.grid .stackable.row .ui.vertical.divider::after {\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC\");\n  }\n}\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/dropdown.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Dropdown\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Dropdown\n*******************************/\n\n.ui.dropdown {\n  cursor: pointer;\n  position: relative;\n  display: inline-block;\n  outline: none;\n  text-align: left;\n  transition: box-shadow 0.1s ease, width 0.1s ease;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\n\n/*******************************\n            Content\n*******************************/\n\n\n/* --------------\n      Menu\n--------------- */\n.ui.dropdown .menu {\n  cursor: auto;\n  position: absolute;\n  display: none;\n  outline: none;\n  top: 100%;\n  min-width: max-content;\n  margin: 0;\n  padding: 0;\n  background: #fff;\n  font-size: 1em;\n  text-shadow: none;\n  text-align: left;\n  box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15);\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  border-radius: 0.28571429rem;\n  transition: opacity 0.1s ease;\n  z-index: 11;\n  will-change: transform, opacity;\n}\n.ui.dropdown .menu > * {\n  white-space: nowrap;\n}\n\n/* --------------\n  Hidden Input\n--------------- */\n.ui.dropdown > input:not(.search):first-child,\n.ui.dropdown > select {\n  display: none !important;\n}\n\n/* --------------\n Dropdown Icon\n--------------- */\n.ui.dropdown:not(.labeled) > .dropdown.icon {\n  position: relative;\n  width: auto;\n  min-width: 1em;\n  font-size: 0.85714286em;\n  margin: 0 0 0 1em;\n}\n.ui.dropdown .menu > .item .dropdown.icon {\n  width: auto;\n  float: right;\n  margin: 0em 0 0 1em;\n}\n.ui.dropdown .menu > .item .dropdown.icon + .text {\n  margin-right: 1em;\n}\n\n/* --------------\n      Text\n--------------- */\n.ui.dropdown > .text {\n  display: inline-block;\n  transition: none;\n}\n\n/* --------------\n    Menu Item\n--------------- */\n.ui.dropdown .menu > .item {\n  position: relative;\n  cursor: pointer;\n  display: block;\n  border: none;\n  height: auto;\n  min-height: 2.57142857rem;\n  text-align: left;\n  border-top: none;\n  line-height: 1em;\n  font-size: 1rem;\n  color: rgba(0, 0, 0, 0.87);\n  padding: 0.78571429rem 1.14285714rem;\n  text-transform: none;\n  font-weight: normal;\n  box-shadow: none;\n  -webkit-touch-callout: none;\n}\n.ui.dropdown .menu > .item:first-child {\n  border-top-width: 0;\n}\n.ui.dropdown .menu > .item.vertical {\n  display: flex;\n  flex-direction: column-reverse;\n}\n\n/* --------------\n  Floated Content\n--------------- */\n.ui.dropdown > .text > [class*=\"right floated\"],\n.ui.dropdown .menu .item > [class*=\"right floated\"] {\n  float: right !important;\n  margin-right: 0 !important;\n  margin-left: 1em !important;\n}\n.ui.dropdown > .text > [class*=\"left floated\"],\n.ui.dropdown .menu .item > [class*=\"left floated\"] {\n  float: left !important;\n  margin-left: 0 !important;\n  margin-right: 1em !important;\n}\n.ui.dropdown .menu .item > i.icon.floated,\n.ui.dropdown .menu .item > .flag.floated,\n.ui.dropdown .menu .item > .image.floated,\n.ui.dropdown .menu .item > img.floated {\n  margin-top: 0em;\n}\n\n/* --------------\n  Menu Divider\n--------------- */\n.ui.dropdown .menu > .header {\n  margin: 1rem 0 0.75rem;\n  padding: 0 1.14285714rem;\n  font-weight: bold;\n  text-transform: uppercase;\n}\n.ui.dropdown .menu > .header:not(.ui) {\n  color: rgba(0, 0, 0, 0.85);\n  font-size: 0.78571429em;\n}\n.ui.dropdown .menu > .divider {\n  border-top: 1px solid rgba(34, 36, 38, 0.1);\n  height: 0;\n  margin: 0.5em 0;\n}\n.ui.dropdown .menu > .horizontal.divider {\n  border-top: none;\n}\n.ui.ui.ui.dropdown .menu > .input {\n  width: auto;\n  display: flex;\n  margin: 1.14285714rem 0.78571429rem;\n  min-width: 10rem;\n}\n.ui.dropdown .menu > .header + .input {\n  margin-top: 0;\n}\n.ui.dropdown .menu > .input:not(.transparent) input {\n  padding: 0.5em 1em;\n}\n.ui.dropdown .menu > .input:not(.transparent) .button,\n.ui.dropdown .menu > .input:not(.transparent) i.icon,\n.ui.dropdown .menu > .input:not(.transparent) .label {\n  padding-top: 0.5em;\n  padding-bottom: 0.5em;\n}\n\n/* -----------------\n  Item Description\n------------------- */\n.ui.dropdown > .text > .description,\n.ui.dropdown .menu > .item > .description {\n  float: right;\n  margin: 0 0 0 1em;\n  color: rgba(0, 0, 0, 0.4);\n}\n.ui.dropdown .menu > .item.vertical > .description {\n  margin: 0;\n}\n\n/* -----------------\n      Item Text\n------------------- */\n.ui.dropdown .menu > .item.vertical > .text {\n  margin-bottom: 0.25em;\n}\n\n/* -----------------\n       Message\n------------------- */\n.ui.dropdown .menu > .message {\n  padding: 0.78571429rem 1.14285714rem;\n  font-weight: normal;\n}\n.ui.dropdown .menu > .message:not(.ui) {\n  color: rgba(0, 0, 0, 0.4);\n}\n\n/* --------------\n    Sub Menu\n--------------- */\n.ui.dropdown .menu .menu {\n  top: 0;\n  left: 100%;\n  right: auto;\n  margin: 0 -0.5em !important;\n  border-radius: 0.28571429rem !important;\n  z-index: 21 !important;\n}\n\n/* Hide Arrow */\n.ui.dropdown .menu .menu::after {\n  display: none;\n}\n\n/* --------------\n   Sub Elements\n--------------- */\n\n/* Icons / Flags / Labels / Image */\n.ui.dropdown > .text > i.icons,\n.ui.dropdown > .text > i.icon,\n.ui.dropdown > .text > .label,\n.ui.dropdown > .text > .flag,\n.ui.dropdown > .text > img,\n.ui.dropdown > .text > .image {\n  margin-top: 0em;\n}\n.ui.dropdown .menu > .item > i.icons,\n.ui.dropdown .menu > .item > i.icon,\n.ui.dropdown .menu > .item > .label,\n.ui.dropdown .menu > .item > .flag,\n.ui.dropdown .menu > .item > .image,\n.ui.dropdown .menu > .item > img {\n  margin-top: 0em;\n}\n.ui.dropdown > .text > i.icons,\n.ui.dropdown > .text > i.icon,\n.ui.dropdown > .text > .label,\n.ui.dropdown > .text > .flag,\n.ui.dropdown > .text > img,\n.ui.dropdown > .text > .image,\n.ui.dropdown .menu > .item > i.icons,\n.ui.dropdown .menu > .item > i.icon,\n.ui.dropdown .menu > .item > .label,\n.ui.dropdown .menu > .item > .flag,\n.ui.dropdown .menu > .item > .image,\n.ui.dropdown .menu > .item > img {\n  margin-left: 0;\n  float: none;\n  margin-right: 0.78571429rem;\n}\n\n/* --------------\n     Image\n--------------- */\n.ui.dropdown > .text > img,\n.ui.dropdown > .text > .image:not(.icon),\n.ui.dropdown .menu > .item > .image:not(.icon),\n.ui.dropdown .menu > .item > img {\n  display: inline-block;\n  vertical-align: top;\n  width: auto;\n  margin-top: -0.5em;\n  margin-bottom: -0.5em;\n  max-height: 2em;\n}\n\n\n/*******************************\n            Coupling\n*******************************/\n\n\n/* --------------\n      Menu\n--------------- */\n\n/* Remove Menu Item Divider */\n.ui.dropdown .ui.menu > .item::before,\n.ui.menu .ui.dropdown .menu > .item::before {\n  display: none;\n}\n\n/* Prevent Menu Item Border */\n.ui.menu .ui.dropdown .menu .active.item {\n  border-left: none;\n}\n\n/* Automatically float dropdown menu right on last menu item */\n.ui.menu .right.menu .dropdown:last-child > .menu:not(.left),\n.ui.menu .right.dropdown.item > .menu:not(.left),\n.ui.buttons > .ui.dropdown:last-child > .menu:not(.left) {\n  left: auto;\n  right: 0;\n}\n\n/* --------------\n          Label\n    --------------- */\n\n/* Dropdown Menu */\n.ui.label.dropdown .menu {\n  min-width: 100%;\n}\n\n/* --------------\n         Button\n    --------------- */\n\n/* No Margin On Icon Button */\n.ui.dropdown.icon.button > .dropdown.icon {\n  margin: 0;\n}\n.ui.dropdown.button .menu {\n  min-width: 100%;\n}\n.ui.dropdown.button:not(.pointing):not(.floating).active {\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.dropdown.button:not(.pointing):not(.floating) > .menu {\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n\n\n/*******************************\n              Types\n*******************************/\n\nselect.ui.dropdown {\n  height: 38px;\n  padding: 0.5em;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  visibility: visible;\n}\n\n/* --------------\n        Selection\n    --------------- */\n\n/* Displays like a select box */\n.ui.selection.dropdown {\n  cursor: pointer;\n  word-wrap: break-word;\n  line-height: 1em;\n  white-space: normal;\n  outline: 0;\n  transform: rotateZ(0);\n  min-width: 14em;\n  min-height: 2.71428571em;\n  background: #fff;\n  display: inline-block;\n  padding: 0.78571429em 3.2em 0.78571429em 1em;\n  color: rgba(0, 0, 0, 0.87);\n  box-shadow: none;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  border-radius: 0.28571429rem;\n  transition: box-shadow 0.1s ease, width 0.1s ease;\n}\n.ui.selection.dropdown.visible,\n.ui.selection.dropdown.active {\n  z-index: 10;\n}\n.ui.selection.dropdown > .search.icon,\n.ui.selection.dropdown > .delete.icon,\n.ui.selection.dropdown > .dropdown.icon {\n  cursor: pointer;\n  position: absolute;\n  width: auto;\n  height: auto;\n  line-height: 1.21428571em;\n  top: 0.78571429em;\n  right: 1em;\n  z-index: 3;\n  margin: -0.78571429em;\n  padding: 0.91666667em;\n  opacity: 0.5;\n  transition: opacity 0.1s ease;\n}\n\n/* Compact */\n.ui.compact.selection.dropdown {\n  min-width: 0;\n}\n.ui.compact.selection.dropdown > .menu {\n  width: auto;\n}\n.ui.compact.selection.dropdown > .menu:not(.multiline) {\n  width: max-content;\n}\n\n/* Selection Menu */\n.ui.selection.dropdown:not(.unlimited) .menu {\n  overflow-x: hidden;\n  overflow-y: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\n.ui.selection.dropdown .menu {\n  outline: none;\n  margin: 0 -1px;\n  min-width: calc(100% + 2px);\n  width: calc(100% + 2px);\n  box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15);\n  transition: opacity 0.1s ease;\n}\n.ui.selection.dropdown:not(.pointing):not(.floating) > .menu {\n  border-top-width: 0;\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui.selection.dropdown .menu::after,\n.ui.selection.dropdown .menu::before {\n  display: none;\n}\n\n/* --------------\n        Message\n    --------------- */\n.ui.selection.dropdown .menu > .message {\n  padding: 0.78571429rem 1.14285714rem;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.ui.selection.dropdown.short .menu {\n    max-height: 6.01071429rem;\n  }\n  .ui.ui.selection.dropdown[class*=\"very short\"] .menu {\n    max-height: 4.00714286rem;\n  }\n  .ui.selection.dropdown:not(.unlimited) .menu {\n    max-height: 8.01428571rem;\n  }\n  .ui.ui.selection.dropdown.long .menu {\n    max-height: 16.02857143rem;\n  }\n  .ui.ui.selection.dropdown[class*=\"very long\"] .menu {\n    max-height: 24.04285714rem;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.ui.selection.dropdown.short .menu {\n    max-height: 8.01428571rem;\n  }\n  .ui.ui.selection.dropdown[class*=\"very short\"] .menu {\n    max-height: 5.34285714rem;\n  }\n  .ui.selection.dropdown:not(.unlimited) .menu {\n    max-height: 10.68571429rem;\n  }\n  .ui.ui.selection.dropdown.long .menu {\n    max-height: 21.37142857rem;\n  }\n  .ui.ui.selection.dropdown[class*=\"very long\"] .menu {\n    max-height: 32.05714286rem;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.ui.selection.dropdown.short .menu {\n    max-height: 12.02142857rem;\n  }\n  .ui.ui.selection.dropdown[class*=\"very short\"] .menu {\n    max-height: 8.01428571rem;\n  }\n  .ui.selection.dropdown:not(.unlimited) .menu {\n    max-height: 16.02857143rem;\n  }\n  .ui.ui.selection.dropdown.long .menu {\n    max-height: 32.05714286rem;\n  }\n  .ui.ui.selection.dropdown[class*=\"very long\"] .menu {\n    max-height: 48.08571429rem;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.ui.selection.dropdown.short .menu {\n    max-height: 16.02857143rem;\n  }\n  .ui.ui.selection.dropdown[class*=\"very short\"] .menu {\n    max-height: 10.68571429rem;\n  }\n  .ui.selection.dropdown:not(.unlimited) .menu {\n    max-height: 21.37142857rem;\n  }\n  .ui.ui.selection.dropdown.long .menu {\n    max-height: 42.74285714rem;\n  }\n  .ui.ui.selection.dropdown[class*=\"very long\"] .menu {\n    max-height: 64.11428571rem;\n  }\n}\n\n/* Menu Item */\n.ui.selection.dropdown .menu > .item {\n  border-top: 1px solid #fafafa;\n  padding: 0.78571429rem 1.14285714rem;\n  white-space: normal;\n  word-wrap: normal;\n}\n.ui.selection.pointing.dropdown .menu > .item:first-child,\n.ui.selection.floating.dropdown .menu > .item:first-child {\n  border-top: none;\n}\n\n/* User Item */\n.ui.selection.dropdown .menu > .hidden.addition.item {\n  display: none;\n}\n\n/* User addition item */\n.ui.dropdown > .menu > .stuck.addition.item:first-child {\n  position: sticky;\n  top: 0;\n  box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15);\n  background: #fff;\n  z-index: 14;\n}\n\n/* Hover */\n.ui.selection.dropdown:hover {\n  border-color: rgba(34, 36, 38, 0.35);\n  box-shadow: none;\n}\n\n/* Active */\n.ui.selection.simple.dropdown:hover,\n.ui.selection.active.dropdown {\n  border-color: #96c8da;\n  box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15);\n}\n.ui.selection.simple.dropdown:hover .menu,\n.ui.selection.active.dropdown .menu {\n  border-color: #96c8da;\n  box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15);\n}\n\n/* Focus */\n.ui.selection.dropdown:focus {\n  border-color: #96c8da;\n  box-shadow: none;\n}\n.ui.selection.dropdown:focus .menu {\n  border-color: #96c8da;\n  box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15);\n}\n@supports selector(:has(.f)) {\n  .ui.ui.selection.dropdown:not(.inverted):has(> input:focus) {\n    border-color: #96c8da;\n    box-shadow: none;\n  }\n  .ui.ui.selection.dropdown:not(.inverted):has(> input:focus) > i.icon {\n    opacity: 1;\n  }\n}\n.ui.ui.selection.dropdown:focus > i.icon {\n  opacity: 1;\n}\n\n/* Visible */\n.ui.selection.visible.dropdown > .text:not(.default) {\n  font-weight: normal;\n  color: rgba(0, 0, 0, 0.8);\n}\n\n/* Visible Hover */\n.ui.selection.active.dropdown:hover {\n  border-color: #96c8da;\n  box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15);\n}\n.ui.selection.active.dropdown:hover .menu {\n  border-color: #96c8da;\n  box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15);\n}\n\n/* Dropdown Icon */\n.ui.active.selection.dropdown > .dropdown.icon,\n.ui.visible.selection.dropdown > .dropdown.icon {\n  opacity: \"\";\n  z-index: 3;\n}\n\n/* Connecting Border */\n.ui.active.selection.dropdown:not(.pointing):not(.floating) {\n  border-bottom-left-radius: 0 !important;\n  border-bottom-right-radius: 0 !important;\n}\n\n/* Empty Connecting Border */\n.ui.active.empty.selection.dropdown {\n  border-radius: 0.28571429rem !important;\n  box-shadow: none !important;\n}\n.ui.active.empty.selection.dropdown .menu {\n  border: none !important;\n  box-shadow: none !important;\n}\n\n/* CSS specific to iOS devices or firefox mobile only */\n@supports (-webkit-touch-callout: none) or (-moz-appearance: none) {\n  @media (-moz-touch-enabled), (pointer: coarse) {\n    .ui.dropdown .scrollhint.menu:not(.hidden)::before {\n      animation: scrollhint 2s ease 2;\n      content: \"\";\n      z-index: 15;\n      display: block;\n      position: absolute;\n      opacity: 0;\n      right: 0.25em;\n      top: 0;\n      height: 100%;\n      border-right: 0.25em solid;\n      border-left: 0;\n      border-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0)) 1 100%;\n    }\n    .ui.inverted.dropdown .scrollhint.menu:not(.hidden)::before {\n      border-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.75), rgba(255, 255, 255, 0)) 1 100%;\n    }\n    @keyframes scrollhint {\n      0% {\n        opacity: 1;\n        top: 100%;\n      }\n      100% {\n        opacity: 0;\n        top: 0;\n      }\n    }\n  }\n}\n\n/* --------------\n       Searchable\n    --------------- */\n\n/* Search Selection */\n.ui.search.dropdown {\n  min-width: \"\";\n}\n\n/* Search Dropdown */\n.ui.search.dropdown > input.search {\n  background: none transparent !important;\n  border: none !important;\n  box-shadow: none !important;\n  cursor: text;\n  top: 0;\n  left: 1px;\n  width: 100%;\n  outline: none;\n  -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n  padding: inherit;\n}\n\n/* Text Layering */\n.ui.search.dropdown > input.search {\n  position: absolute;\n  z-index: 2;\n}\n.ui.search.dropdown > .text {\n  cursor: text;\n  position: relative;\n  left: 1px;\n  z-index: auto;\n}\n\n/* Search Selection */\n.ui.search.selection.dropdown > input.search {\n  line-height: 1.21428571em;\n  padding: 0.67857143em 3.2em 0.67857143em 1em;\n}\n\n/* Used to size multi select input to character width */\n.ui.search.selection.dropdown > span.sizer {\n  line-height: 1.21428571em;\n  padding: 0.67857143em 3.2em 0.67857143em 1em;\n  display: none;\n  white-space: pre;\n}\n\n/* Active/Visible Search */\n.ui.search.dropdown.active > input.search,\n.ui.search.dropdown.visible > input.search {\n  cursor: auto;\n}\n.ui.search.dropdown.active > .text,\n.ui.search.dropdown.visible > .text {\n  pointer-events: none;\n}\n\n/* Filtered Text */\n.ui.active.search.dropdown input.search:focus + .text i.icon,\n.ui.active.search.dropdown input.search:focus + .text .flag {\n  opacity: 0.45;\n}\n.ui.active.search.dropdown input.search:focus + .text {\n  color: rgba(115, 115, 115, 0.87);\n}\n.ui.search.dropdown.button > span.sizer {\n  display: none;\n}\n\n/* Search Menu */\n.ui.search.dropdown:not(.unlimited) .menu {\n  overflow-x: hidden;\n  overflow-y: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.search.dropdown:not(.unlimited) .menu {\n    max-height: 8.01428571rem;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.search.dropdown:not(.unlimited) .menu {\n    max-height: 10.68571429rem;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.search.dropdown:not(.unlimited) .menu {\n    max-height: 16.02857143rem;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.search.dropdown:not(.unlimited) .menu {\n    max-height: 21.37142857rem;\n  }\n}\n\n/* Clearable Selection */\n.ui.dropdown > .remove.icon {\n  cursor: pointer;\n  font-size: 0.85714286em;\n  margin: -0.78571429em;\n  padding: 0.91666667em;\n  right: 2em;\n  top: 0.78571429em;\n  position: absolute;\n  opacity: 0.5;\n  z-index: 3;\n}\n.ui.selection.dropdown > .remove.icon {\n  right: 3em;\n}\n.ui.inline.dropdown > .remove.icon {\n  right: 2.2em;\n}\n.ui.clearable.dropdown .text:not(.default),\n.ui.clearable.dropdown:not(.search) > .ui.label:last-of-type {\n  margin-right: 1.5em;\n}\n.ui.dropdown select.noselection ~ .remove.icon,\n.ui.dropdown input[value=\"\"] ~ .remove.icon,\n.ui.dropdown input:not([value]):not(.search) ~ .remove.icon,\n.ui.dropdown.loading > .remove.icon {\n  display: none;\n}\n.ui.dropdown:not(.selection) > .remove.icon ~ .dropdown.icon {\n  margin-left: 1.5em;\n}\n.ui.dropdown:not(.selection):not(.multiple) > .remove.icon {\n  margin-top: -1.35em;\n}\n\n/* --------------\n        Multiple\n    --------------- */\n\n/* Multiple Selection */\n.ui.ui.multiple.dropdown {\n  padding: 0.22619048em 3.2em 0.22619048em 0.35714286em;\n}\n.ui.multiple.dropdown .menu {\n  cursor: auto;\n}\n\n/* Selection Label */\n.ui.multiple.dropdown > .label {\n  display: inline-block;\n  white-space: normal;\n  font-size: 1em;\n  padding: 0.35714286em 0.78571429em;\n  margin: 0.14285714rem 0.28571429rem 0.14285714rem 0;\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15) inset;\n}\n\n/* Dropdown Icon */\n.ui.multiple.dropdown .dropdown.icon {\n  margin: \"\";\n  padding: \"\";\n}\n\n/* Text */\n.ui.multiple.dropdown > .text {\n  position: static;\n  padding: 0;\n  max-width: 100%;\n  margin: 0.45238095em 0 0.45238095em 0.64285714em;\n  line-height: 1.21428571em;\n}\n.ui.multiple.dropdown > .text.default {\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.ui.multiple.dropdown > .label ~ input.search {\n  margin-left: 0.14285714em !important;\n}\n.ui.multiple.dropdown > .label ~ .text {\n  display: none;\n}\n.ui.multiple.dropdown > .label:not(.image) > img:not(.centered) {\n  margin-right: 0.78571429rem;\n}\n.ui.multiple.dropdown > .label:not(.image) > img.ui:not(.avatar) {\n  margin-bottom: 0.39285714rem;\n}\n.ui.multiple.dropdown > .image.label img {\n  margin: -0.35714286em 0.78571429em -0.35714286em -0.78571429em;\n  height: 1.71428571em;\n}\n.ui.multiple.dropdown:not(.selection):not(.labeled) > .dropdown.icon {\n  right: -1.5em;\n}\n.ui.multiple.dropdown:not(.selection):not(.labeled) > .remove.icon {\n  margin-right: -1.5em;\n}\n.ui.multiple.dropdown:not(.selection):not(.labeled):not(.search) > .remove.icon ~ .text.default,\n.ui.multiple.dropdown:not(.selection):not(.labeled) > .text.default:first-child {\n  overflow: inherit;\n}\n\n/* -----------------\n          Multiple Search\n        ----------------- */\n\n/* Multiple Search Selection */\n.ui.multiple.search.dropdown,\n.ui.multiple.search.dropdown > input.search {\n  cursor: text;\n}\n\n/* Prompt Text */\n.ui.multiple.search.dropdown > .text {\n  display: inline-block;\n  position: absolute;\n  top: 0;\n  left: 0;\n  padding: inherit;\n  margin: 0.45238095em 0 0.45238095em 0.64285714em;\n  line-height: 1.21428571em;\n}\n.ui.multiple.search.dropdown > .text.default {\n  z-index: -1;\n}\n.ui.multiple.search.dropdown > .label ~ .text {\n  display: none;\n}\n\n/* Search */\n.ui.multiple.search.dropdown > input.search {\n  position: static;\n  padding: 0;\n  max-width: 100%;\n  margin: 0.45238095em 0 0.45238095em 0.64285714em;\n  width: 2.2em;\n  line-height: 1.21428571em;\n}\n.ui.multiple.search.dropdown.button {\n  min-width: 14em;\n}\n.ui.multiple.search.dropdown > span.sizer {\n  display: none;\n}\n.ui.multiple.search.dropdown:not(.selection) > .remove.icon + input.search,\n.ui.multiple.search.dropdown:not(.selection) > input.search:first-child {\n  min-width: 5.05em;\n}\n\n/* --------------\n         Inline\n    --------------- */\n.ui.inline.dropdown {\n  cursor: pointer;\n  display: inline-block;\n  color: inherit;\n}\n.ui.inline.dropdown .dropdown.icon {\n  margin: 0 0.21428571em;\n  vertical-align: baseline;\n}\n.ui.inline.dropdown > .text {\n  font-weight: bold;\n}\n.ui.inline.dropdown .menu {\n  cursor: auto;\n  margin-top: 0.21428571em;\n  border-radius: 0.28571429rem;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------------\n        Active\n---------------------- */\n\n/* Menu Item Active */\n.ui.dropdown .menu .active.item {\n  background: transparent;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.95);\n  box-shadow: none;\n  z-index: 12;\n}\n\n/* --------------------\n        Hover\n---------------------- */\n\n/* Menu Item Hover */\n.ui.dropdown .menu > .item:hover {\n  background: #f2f2f2;\n  color: rgba(0, 0, 0, 0.95);\n  z-index: 13;\n}\n\n/* --------------------\n     Default Text\n---------------------- */\n.ui.dropdown:not(.button) > .default.text,\n.ui.default.dropdown:not(.button) > .text {\n  color: rgba(191, 191, 191, 0.87);\n}\n.ui.dropdown:not(.button) > input:focus ~ .default.text,\n.ui.default.dropdown:not(.button) > input:focus ~ .text {\n  color: rgba(115, 115, 115, 0.87);\n}\n\n/* --------------------\n           Loading\n    --------------------- */\n.ui.loading.dropdown > i.icon {\n  height: 1em !important;\n}\n.ui.loading.selection.dropdown > i.icon {\n  padding: 1.5em 1.28571429em !important;\n}\n.ui.loading.dropdown > i.icon::before {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -0.64285714em 0 0 -0.64285714em;\n  width: 1.28571429em;\n  height: 1.28571429em;\n  border-radius: 500rem;\n  border: 0.2em solid rgba(0, 0, 0, 0.1);\n}\n.ui.loading.dropdown > i.icon::after {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  box-shadow: 0 0 0 1px transparent;\n  margin: -0.64285714em 0 0 -0.64285714em;\n  width: 1.28571429em;\n  height: 1.28571429em;\n  animation: loader 0.6s infinite linear;\n  border: 0.2em solid #767676;\n  border-radius: 500rem;\n}\n\n/* Coupling */\n.ui.loading.dropdown.button > i.icon::before,\n.ui.loading.dropdown.button > i.icon::after {\n  display: none;\n}\n.ui.loading.dropdown > .text {\n  transition: none;\n}\n\n/* Used To Check Position */\n.ui.dropdown .loading.menu {\n  display: block;\n  visibility: hidden;\n  z-index: -1;\n}\n.ui.dropdown > .loading.menu {\n  left: 0 !important;\n  right: auto !important;\n}\n.ui.dropdown > .menu .loading.menu {\n  left: 100% !important;\n  right: auto !important;\n}\n\n/* --------------------\n    Keyboard Select\n---------------------- */\n\n/* Selected Item */\n.ui.dropdown.selected,\n.ui.dropdown .menu .selected.item {\n  background: #f7f7f7;\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------------\n    Search Filtered\n---------------------- */\n\n/* Filtered Item */\n.ui.dropdown > .filtered.text {\n  visibility: hidden;\n}\n.ui.dropdown .filtered.item {\n  display: none !important;\n}\n\n/* --------------------\n            States\n    ---------------------- */\n.ui.dropdown.error,\n.ui.dropdown.error > .text,\n.ui.dropdown.error > .default.text {\n  color: #9f3a38;\n}\n.ui.selection.dropdown.error {\n  background: #fff6f6;\n  border-color: #e0b4b4;\n}\n.ui.selection.dropdown.error:hover {\n  border-color: #e0b4b4;\n}\n.ui.multiple.selection.error.dropdown > .label {\n  border-color: #e0b4b4;\n}\n.ui.dropdown.error > .menu,\n.ui.dropdown.error > .menu .menu {\n  border-color: #e0b4b4;\n}\n.ui.dropdown.error > .menu > .item {\n  color: #9f3a38;\n}\n\n/* Item Hover */\n.ui.dropdown.error > .menu > .item:hover {\n  background-color: #fbe7e7;\n}\n\n/* Item Active */\n.ui.dropdown.error > .menu .active.item {\n  background-color: #fdcfcf;\n}\n.ui.dropdown.info,\n.ui.dropdown.info > .text,\n.ui.dropdown.info > .default.text {\n  color: #276f86;\n}\n.ui.selection.dropdown.info {\n  background: #f8ffff;\n  border-color: #a9d5de;\n}\n.ui.selection.dropdown.info:hover {\n  border-color: #a9d5de;\n}\n.ui.multiple.selection.info.dropdown > .label {\n  border-color: #a9d5de;\n}\n.ui.dropdown.info > .menu,\n.ui.dropdown.info > .menu .menu {\n  border-color: #a9d5de;\n}\n.ui.dropdown.info > .menu > .item {\n  color: #276f86;\n}\n\n/* Item Hover */\n.ui.dropdown.info > .menu > .item:hover {\n  background-color: #e9f2fb;\n}\n\n/* Item Active */\n.ui.dropdown.info > .menu .active.item {\n  background-color: #cef1fd;\n}\n.ui.dropdown.success,\n.ui.dropdown.success > .text,\n.ui.dropdown.success > .default.text {\n  color: #2c662d;\n}\n.ui.selection.dropdown.success {\n  background: #fcfff5;\n  border-color: #a3c293;\n}\n.ui.selection.dropdown.success:hover {\n  border-color: #a3c293;\n}\n.ui.multiple.selection.success.dropdown > .label {\n  border-color: #a3c293;\n}\n.ui.dropdown.success > .menu,\n.ui.dropdown.success > .menu .menu {\n  border-color: #a3c293;\n}\n.ui.dropdown.success > .menu > .item {\n  color: #2c662d;\n}\n\n/* Item Hover */\n.ui.dropdown.success > .menu > .item:hover {\n  background-color: #e9fbe9;\n}\n\n/* Item Active */\n.ui.dropdown.success > .menu .active.item {\n  background-color: #dafdce;\n}\n.ui.dropdown.warning,\n.ui.dropdown.warning > .text,\n.ui.dropdown.warning > .default.text {\n  color: #573a08;\n}\n.ui.selection.dropdown.warning {\n  background: #fffaf3;\n  border-color: #c9ba9b;\n}\n.ui.selection.dropdown.warning:hover {\n  border-color: #c9ba9b;\n}\n.ui.multiple.selection.warning.dropdown > .label {\n  border-color: #c9ba9b;\n}\n.ui.dropdown.warning > .menu,\n.ui.dropdown.warning > .menu .menu {\n  border-color: #c9ba9b;\n}\n.ui.dropdown.warning > .menu > .item {\n  color: #573a08;\n}\n\n/* Item Hover */\n.ui.dropdown.warning > .menu > .item:hover {\n  background-color: #fbfbe9;\n}\n\n/* Item Active */\n.ui.dropdown.warning > .menu .active.item {\n  background-color: #fdfdce;\n}\n\n/* --------------------\n            Clear\n    ---------------------- */\n.ui.dropdown > .remove.icon,\n.ui.dropdown > .clear.dropdown.icon {\n  opacity: 0.5;\n  transition: opacity 0.1s ease;\n}\n.ui.dropdown > .remove.icon:hover,\n.ui.dropdown > .clear.dropdown.icon:hover {\n  opacity: 1;\n}\n\n/* --------------------\n            Disabled\n    ---------------------- */\n\n/* Disabled */\n.ui.disabled.dropdown,\n.ui.dropdown .menu > .disabled.item {\n  cursor: default;\n  pointer-events: none;\n  opacity: 0.45;\n}\n\n/* --------------------\n            Read-Only\n    ---------------------- */\n.ui.read-only.dropdown {\n  cursor: default;\n  pointer-events: none;\n}\n.ui.disabled.dropdown > .remove.icon,\n.ui.read-only.dropdown > .remove.icon,\n.ui.disabled.dropdown > .label > .delete.icon,\n.ui.read-only.dropdown > .label > .delete.icon {\n  display: none;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n    Direction\n--------------- */\n\n/* Flyout Direction */\n.ui.dropdown .menu {\n  left: 0;\n}\n\n/* Default Side (Right) */\n.ui.dropdown .right.menu > .menu,\n.ui.dropdown .menu .right.menu {\n  left: 100% !important;\n  right: auto !important;\n  border-radius: 0.28571429rem !important;\n}\n\n/* Leftward Opening Menu */\n.ui.dropdown > .left.menu {\n  left: auto !important;\n  right: 0 !important;\n}\n.ui.dropdown > .left.menu .menu,\n.ui.dropdown .menu .left.menu {\n  left: auto;\n  right: 100%;\n  margin: 0 -0.5em 0 0 !important;\n  border-radius: 0.28571429rem !important;\n}\n.ui.dropdown .item .left.dropdown.icon,\n.ui.dropdown .left.menu .item .dropdown.icon {\n  width: auto;\n  float: left;\n  margin: 0em 0 0 0;\n}\n.ui.dropdown .item .left.dropdown.icon,\n.ui.dropdown .left.menu .item .dropdown.icon {\n  width: auto;\n  float: left;\n  margin: 0em 0 0 0;\n}\n.ui.dropdown .item .left.dropdown.icon + .text,\n.ui.dropdown .left.menu .item .dropdown.icon + .text {\n  margin-left: 1em;\n  margin-right: 0;\n}\n\n/* --------------\n         Upward\n    --------------- */\n\n/* Upward Main Menu */\n.ui.upward.dropdown > .menu {\n  top: auto;\n  bottom: 100%;\n  box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.08);\n}\n\n/* Upward Sub Menu */\n.ui.dropdown .upward.menu {\n  top: auto !important;\n  bottom: 0 !important;\n}\n\n/* Active Upward */\n.ui.simple.upward.active.dropdown,\n.ui.simple.upward.dropdown:hover {\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n\n/* Button */\n.ui.upward.dropdown.button:not(.pointing):not(.floating).active {\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui.upward.dropdown.button:not(.pointing):not(.floating) > .menu {\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n\n/* Selection */\n.ui.ui.upward.selection.dropdown:not(.pointing):not(.floating) > .menu {\n  border-top-width: 1px;\n  border-bottom-width: 0;\n  box-shadow: 0 -2px 3px 0 rgba(0, 0, 0, 0.08);\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.upward.selection.dropdown:hover {\n  box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.05);\n}\n\n/* Active Upward */\n.ui.active.upward.selection.dropdown:not(.pointing):not(.floating) {\n  border-radius: 0 0 0.28571429rem 0.28571429rem !important;\n}\n\n/* Visible Upward */\n.ui.upward.selection.dropdown.visible {\n  box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.08);\n}\n.ui.upward.selection.dropdown.visible:not(.pointing):not(.floating) {\n  border-radius: 0 0 0.28571429rem 0.28571429rem !important;\n}\n\n/* Visible Hover Upward */\n.ui.upward.active.selection.dropdown:hover {\n  box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.05);\n}\n.ui.upward.active.selection.dropdown:hover:not(.pointing):not(.floating) .menu {\n  box-shadow: 0 -2px 3px 0 rgba(0, 0, 0, 0.08);\n}\n\n/* --------------\n         Scrolling\n    --------------- */\n\n/* Selection Menu */\n.ui.scrolling.dropdown .menu,\n.ui.dropdown .scrolling.menu {\n  overflow-x: hidden;\n  overflow-y: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  min-width: 100% !important;\n  width: auto !important;\n}\n.ui.dropdown .scrolling.menu {\n  position: static;\n  border: none;\n  box-shadow: none !important;\n  border-radius: 0 0 0.28571429rem 0.28571429rem !important;\n  margin: 0 !important;\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.ui.ui.scrolling.dropdown .menu .item,\n.ui.ui.ui.dropdown .scrolling.menu > .item {\n  border-top: none;\n}\n.ui.scrolling.dropdown .menu .item:first-child,\n.ui.dropdown .scrolling.menu .item:first-child {\n  border-top: none;\n}\n.ui.dropdown > .animating.menu .scrolling.menu,\n.ui.dropdown > .visible.menu .scrolling.menu {\n  display: block;\n}\n\n/* Scrollbar in IE */\n@media all and (-ms-high-contrast: none) {\n  .ui.scrolling.dropdown .menu,\n  .ui.dropdown .scrolling.menu {\n    min-width: calc(100% - 17px);\n  }\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.scrolling.dropdown .menu,\n  .ui.dropdown .scrolling.menu {\n    max-height: 10.28571429rem;\n  }\n  .ui.scrolling.resizable.dropdown .menu,\n  .ui.dropdown .scrolling.resizable.menu {\n    height: 10.28571429rem;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.scrolling.dropdown .menu,\n  .ui.dropdown .scrolling.menu {\n    max-height: 15.42857143rem;\n  }\n  .ui.scrolling.resizable.dropdown .menu,\n  .ui.dropdown .scrolling.resizable.menu {\n    height: 15.42857143rem;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.scrolling.dropdown .menu,\n  .ui.dropdown .scrolling.menu {\n    max-height: 20.57142857rem;\n  }\n  .ui.scrolling.resizable.dropdown .menu,\n  .ui.dropdown .scrolling.resizable.menu {\n    height: 20.57142857rem;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.scrolling.dropdown .menu,\n  .ui.dropdown .scrolling.menu {\n    max-height: 20.57142857rem;\n  }\n  .ui.scrolling.resizable.dropdown .menu,\n  .ui.dropdown .scrolling.resizable.menu {\n    height: 20.57142857rem;\n  }\n}\n.ui.scrolling.resizable.dropdown .menu,\n.ui.dropdown .scrolling.resizable.menu {\n  resize: vertical;\n  max-height: none;\n}\n\n/* --------------------\n            Labeled\n    --------------------- */\n\n/* Regular Label on Left */\n.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child + .dropdown {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n  border-left-color: transparent;\n}\n\n/* Regular Label on Right */\n.ui[class*=\"right labeled\"].input > .dropdown:not(:last-child) {\n  border-top-right-radius: 0 !important;\n  border-bottom-right-radius: 0 !important;\n  border-right-color: transparent !important;\n}\n.ui[class*=\"right labeled\"].input > .dropdown + .label {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n/* --------------\n         Columnar\n    --------------- */\n.ui.column.dropdown > .menu {\n  flex-wrap: wrap;\n}\n.ui.dropdown[class*=\"two column\"] > .menu > .item {\n  width: 50%;\n}\n.ui.dropdown[class*=\"three column\"] > .menu > .item {\n  width: 33%;\n}\n.ui.dropdown[class*=\"four column\"] > .menu > .item {\n  width: 25%;\n}\n.ui.dropdown[class*=\"five column\"] > .menu > .item {\n  width: 20%;\n}\n\n/* --------------\n         Simple\n    --------------- */\n\n/* Displays without javascript */\n.ui.simple.dropdown .menu::before,\n.ui.simple.dropdown .menu::after {\n  display: none;\n}\n.ui.simple.dropdown .menu {\n  position: absolute;\n  \n/* IE hack to make dropdown icons appear inline */\n  display: -ms-inline-flexbox !important;\n  display: block;\n  overflow: hidden;\n  top: -9999px;\n  opacity: 0;\n  width: 0;\n  height: 0;\n  transition: opacity 0.1s ease;\n  margin-top: 0 !important;\n}\n.ui.simple.dropdown .upward.menu {\n  margin-bottom: 1.5em;\n}\n.ui.simple.selection.dropdown .upward.menu {\n  margin-bottom: 2.5em;\n}\n.ui.menu:not(.vertical) .ui.simple.dropdown.item .upward.menu {\n  margin-bottom: 2.8em;\n}\n.ui.simple.active.dropdown,\n.ui.simple.dropdown:hover {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.simple.active.dropdown > .menu,\n.ui.simple.dropdown:hover > .menu {\n  overflow: visible;\n  width: auto;\n  height: auto;\n  top: 100%;\n  opacity: 1;\n}\n.ui.simple.dropdown > .menu > .item:active > .menu,\n.ui.simple.dropdown .menu .item:hover > .menu {\n  overflow: visible;\n  width: auto;\n  height: auto;\n  top: 0 !important;\n  left: 100%;\n  opacity: 1;\n}\n.ui.simple.selection.active.dropdown > .menu,\n.ui.simple.selection.dropdown:hover > .menu,\n.ui.simple.selection.dropdown > .menu > .item:active > .menu,\n.ui.simple.selection.dropdown .menu .item:hover > .menu {\n  overflow: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n}\n.ui.simple.dropdown > .menu > .item:active > .left.menu,\n.ui.simple.dropdown .menu .item:hover > .left.menu,\n.right.menu .ui.simple.dropdown > .menu > .item:active > .menu:not(.right),\n.right.menu .ui.simple.dropdown > .menu .item:hover > .menu:not(.right) {\n  left: auto;\n  right: 100%;\n}\n.ui.simple.disabled.dropdown:hover .menu {\n  display: none;\n  height: 0;\n  width: 0;\n  overflow: hidden;\n}\n\n/* Visible */\n.ui.simple.visible.dropdown > .menu {\n  display: block;\n}\n\n/* Scrolling */\n.ui.simple.scrolling.active.dropdown > .menu,\n.ui.simple.scrolling.dropdown:hover > .menu {\n  overflow-x: hidden;\n  overflow-y: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n}\n\n/* --------------\n          Fluid\n    --------------- */\n.ui.fluid.dropdown {\n  display: block;\n  width: 100% !important;\n  min-width: 0;\n}\n.ui.fluid.dropdown > .dropdown.icon {\n  float: right;\n}\n\n/* --------------\n        Floating\n    --------------- */\n.ui.floating.dropdown > .menu {\n  left: 0;\n  right: auto;\n  box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15) !important;\n  border-radius: 0.28571429rem !important;\n}\n.ui:not(.upward).floating.dropdown > .menu {\n  margin-top: 0.5em;\n}\n.ui.upward.floating.dropdown:not(.simple) > .menu {\n  margin-bottom: 0.5em;\n}\n\n/* --------------\n         Pointing\n    --------------- */\n.ui.pointing.dropdown > .menu {\n  top: 100%;\n  margin-top: 0.78571429rem;\n  border-radius: 0.28571429rem;\n}\n.ui.pointing.dropdown > .menu:not(.hidden)::after {\n  display: block;\n  position: absolute;\n  pointer-events: none;\n  content: \"\";\n  visibility: visible;\n  transform: rotate(45deg);\n  width: 0.5em;\n  height: 0.5em;\n  box-shadow: -1px -1px 0 0 rgba(34, 36, 38, 0.15);\n  background: #fff;\n  z-index: 2;\n}\n@supports selector(:has(.f)) {\n  .ui.pointing.dropdown:not(.upward) .menu:has(:first-child:hover)::after,\n  .ui.upward.pointing.dropdown .menu:has(:last-child:hover)::after {\n    background: #f2f2f2;\n  }\n  .ui.pointing.dropdown:not(.upward) .menu:has(.selected.item:first-child)::after,\n  .ui.upward.pointing.dropdown .menu:has(.selected.item:last-child)::after {\n    background: #f7f7f7;\n  }\n}\n.ui.selection.pointing.dropdown > .menu::after {\n  box-shadow: -1px -1px 0 0 #96c8da;\n}\n.ui.pointing.dropdown > .menu:not(.hidden)::after {\n  top: -0.25em;\n  left: 50%;\n  margin: 0 0 0 -0.25em;\n}\n\n/* Top Left Pointing */\n.ui.top.left.pointing.dropdown > .menu {\n  top: 100%;\n  bottom: auto;\n  left: 0;\n  right: auto;\n  margin: 1em 0 0;\n}\n.ui.top.left.pointing.dropdown > .menu {\n  top: 100%;\n  bottom: auto;\n  left: 0;\n  right: auto;\n  margin: 1em 0 0;\n}\n.ui.top.left.pointing.dropdown > .menu::after {\n  top: -0.25em;\n  left: 1em;\n  right: auto;\n  margin: 0;\n  transform: rotate(45deg);\n}\n\n/* Top Right Pointing */\n.ui.top.right.pointing.dropdown > .menu {\n  top: 100%;\n  bottom: auto;\n  right: 0;\n  left: auto;\n  margin: 1em 0 0;\n}\n.ui.top.pointing.dropdown > .left.menu::after,\n.ui.top.right.pointing.dropdown > .menu::after {\n  top: -0.25em;\n  left: auto !important;\n  right: 1em !important;\n  margin: 0;\n  transform: rotate(45deg);\n}\n\n/* Left Pointing */\n.ui.left.pointing.dropdown > .menu {\n  top: 0;\n  left: 100%;\n  right: auto;\n  margin: 0 0 0 1em;\n}\n.ui.left.pointing.dropdown > .menu::after {\n  top: 1em;\n  left: -0.25em;\n  margin: 0;\n  transform: rotate(-45deg);\n}\n.ui.left:not(.top):not(.bottom).pointing.dropdown > .left.menu {\n  left: auto !important;\n  right: 100% !important;\n  margin: 0 1em 0 0;\n}\n.ui.left:not(.top):not(.bottom).pointing.dropdown > .left.menu::after {\n  top: 1em;\n  left: auto;\n  right: -0.25em;\n  margin: 0;\n  transform: rotate(135deg);\n}\n\n/* Right Pointing */\n.ui.right.pointing.dropdown > .menu {\n  top: 0;\n  left: auto;\n  right: 100%;\n  margin: 0 1em 0 0;\n}\n.ui.right.pointing.dropdown > .menu::after {\n  top: 1em;\n  left: auto;\n  right: -0.25em;\n  margin: 0;\n  transform: rotate(135deg);\n}\n\n/* Bottom Pointing */\n.ui.bottom.pointing.dropdown > .menu {\n  top: auto;\n  bottom: 100%;\n  left: 0;\n  right: auto;\n  margin: 0 0 1em;\n}\n.ui.bottom.pointing.dropdown > .menu::after {\n  top: auto;\n  bottom: -0.25em;\n  right: auto;\n  margin: 0;\n  transform: rotate(-135deg);\n}\n\n/* Reverse Sub-Menu Direction */\n.ui.bottom.pointing.dropdown > .menu .menu {\n  top: auto !important;\n  bottom: 0 !important;\n}\n\n/* Bottom Left */\n.ui.bottom.left.pointing.dropdown > .menu {\n  left: 0;\n  right: auto;\n}\n.ui.bottom.left.pointing.dropdown > .menu::after {\n  left: 1em;\n  right: auto;\n}\n\n/* Bottom Right */\n.ui.bottom.right.pointing.dropdown > .menu {\n  right: 0;\n  left: auto;\n}\n.ui.bottom.right.pointing.dropdown > .menu::after {\n  left: auto;\n  right: 1em;\n}\n\n/* Upward pointing */\n.ui.pointing.upward.dropdown .menu,\n.ui.top.pointing.upward.dropdown .menu {\n  top: auto !important;\n  bottom: 100% !important;\n  margin: 0 0 0.78571429rem;\n  border-radius: 0.28571429rem;\n}\n.ui.pointing.upward.dropdown .menu::after,\n.ui.top.pointing.upward.dropdown .menu::after {\n  top: 100% !important;\n  bottom: auto !important;\n  box-shadow: 1px 1px 0 0 rgba(34, 36, 38, 0.15);\n  margin: -0.25em 0 0;\n}\n.ui.selection.pointing.upward.dropdown .menu::after {\n  box-shadow: 1px 1px 0 0 #96c8da;\n}\n\n/* Right Pointing Upward */\n.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu {\n  top: auto !important;\n  bottom: 0 !important;\n  margin: 0 1em 0 0;\n}\n.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu::after {\n  top: auto !important;\n  bottom: 0 !important;\n  margin: 0 0 1em 0;\n  box-shadow: -1px -1px 0 0 rgba(34, 36, 38, 0.15);\n}\n\n/* Left Pointing Upward */\n.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu {\n  top: auto !important;\n  bottom: 0 !important;\n  margin: 0 0 0 1em;\n}\n.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu::after {\n  top: auto !important;\n  bottom: 0 !important;\n  margin: 0 0 1em 0;\n  box-shadow: -1px -1px 0 0 rgba(34, 36, 38, 0.15);\n}\n.ui.floating.dropdown .menu .item:first-child,\n.ui.pointing.dropdown .menu .item:first-child {\n  border-top-left-radius: 0.28571429rem;\n  border-top-right-radius: 0.28571429rem;\n}\n.ui.floating.dropdown .menu .item:last-child,\n.ui.pointing.dropdown .menu .item:last-child {\n  border-bottom-left-radius: 0.28571429rem;\n  border-bottom-right-radius: 0.28571429rem;\n}\n\n/* --------------------\n        Sizes\n--------------------- */\n.ui.dropdown,\n.ui.dropdown .menu > .item {\n  font-size: 1rem;\n}\n.ui.ui.mini.dropdown,\n.ui.ui.mini.dropdown .menu > .item {\n  font-size: 0.78571429rem;\n}\n.ui.ui.tiny.dropdown,\n.ui.ui.tiny.dropdown .menu > .item {\n  font-size: 0.85714286rem;\n}\n.ui.ui.small.dropdown,\n.ui.ui.small.dropdown .menu > .item {\n  font-size: 0.92857143rem;\n}\n.ui.ui.large.dropdown,\n.ui.ui.large.dropdown .menu > .item {\n  font-size: 1.14285714rem;\n}\n.ui.ui.big.dropdown,\n.ui.ui.big.dropdown .menu > .item {\n  font-size: 1.28571429rem;\n}\n.ui.ui.huge.dropdown,\n.ui.ui.huge.dropdown .menu > .item {\n  font-size: 1.42857143rem;\n}\n.ui.ui.massive.dropdown,\n.ui.ui.massive.dropdown .menu > .item {\n  font-size: 1.71428571rem;\n}\n\n/* --------------\n        Inverted\n    --------------- */\n\n/* General rules and basic dropdowns */\n.ui.dropdown .inverted.menu,\n.ui.inverted.dropdown .menu {\n  background: #1b1c1d;\n  box-shadow: none;\n  border: 1px solid rgba(255, 255, 255, 0.15);\n}\n.ui.dropdown .inverted.menu > .item,\n.ui.inverted.dropdown .menu > .item {\n  color: rgba(255, 255, 255, 0.8);\n}\n.ui.dropdown .inverted.menu .active.item,\n.ui.inverted.dropdown .menu .active.item {\n  background: transparent;\n  color: rgba(255, 255, 255, 0.8);\n  box-shadow: none;\n}\n.ui.dropdown .inverted.menu > .item:hover,\n.ui.inverted.dropdown .menu > .item:hover {\n  background: #2d2e2f;\n  color: rgba(255, 255, 255, 0.8);\n}\n.ui.inverted.dropdown.selected,\n.ui.dropdown .inverted.menu .selected.item,\n.ui.inverted.dropdown .menu .selected.item {\n  background: #3d3e3f;\n  color: rgba(255, 255, 255, 0.8);\n}\n.ui.dropdown .inverted.menu > .header,\n.ui.inverted.dropdown .menu > .header {\n  color: #fff;\n}\n.ui.inverted.dropdown > .text > .description,\n.ui.dropdown .inverted.menu > .item > .description,\n.ui.inverted.dropdown .menu > .item > .description {\n  color: rgba(255, 255, 255, 0.5);\n}\n.ui.dropdown .inverted.menu > .divider,\n.ui.inverted.dropdown .menu > .divider {\n  border-top: 1px solid rgba(255, 255, 255, 0.15);\n}\n.ui.dropdown .inverted.scrolling.menu,\n.ui.inverted.dropdown .scrolling.menu {\n  border: none;\n  border-top: 1px solid rgba(255, 255, 255, 0.15);\n}\n\n/* Selection */\n.ui.inverted.selection.dropdown {\n  border: 1px solid rgba(255, 255, 255, 0.15);\n  background: #1b1c1d;\n  color: rgba(255, 255, 255, 0.8);\n}\n.ui.inverted.selection.dropdown:hover {\n  border-color: rgba(255, 255, 255, 0.25);\n  box-shadow: none;\n}\n.ui.inverted.selection.dropdown input {\n  color: #fff;\n}\n.ui.inverted.selection.visible.dropdown > .text:not(.default) {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.selection.simple.dropdown:hover .inverted.menu,\n.ui.inverted.selection.simple.dropdown:hover .menu,\n.ui.selection.active.dropdown .inverted.menu,\n.ui.inverted.selection.active.dropdown .menu,\n.ui.inverted.selection.active.dropdown:hover {\n  border-color: rgba(255, 255, 255, 0.15);\n}\n.ui.selection.dropdown .inverted.menu > .item,\n.ui.inverted.selection.dropdown .menu > .item {\n  border-top: 1px solid #242526;\n}\n.ui.inverted.dropdown:not(.button) > .default.text,\n.ui.inverted.default.dropdown:not(.button) > .text {\n  color: rgba(255, 255, 255, 0.5);\n}\n.ui.inverted.dropdown:not(.button) > input:focus ~ .default.text,\n.ui.inverted.default.dropdown:not(.button) > input:focus ~ .text {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.active.search.dropdown input.search:focus + .text i.icon,\n.ui.inverted.active.search.dropdown input.search:focus + .text .flag {\n  opacity: 0.45;\n}\n.ui.inverted.active.search.dropdown input.search:focus + .text {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.dropdown .inverted.menu > .message:not(.ui),\n.ui.inverted.dropdown .menu > .message:not(.ui) {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n/* Fixing the border */\n.ui.dropdown .inverted.menu > .item:first-child,\n.ui.inverted.dropdown .menu > .item:first-child {\n  border-top-width: 0;\n}\n\n/* Labels */\n.ui.inverted.multiple.dropdown > .label {\n  background-color: rgba(255, 255, 255, 0.7);\n  background-image: none;\n  color: #000000;\n  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0) inset;\n}\n.ui.inverted.multiple.dropdown > .label:hover {\n  background-color: rgba(255, 255, 255, 0.9);\n  border-color: rgba(255, 255, 255, 0.9);\n  background-image: none;\n  color: #000000;\n}\n.ui.inverted.multiple.dropdown > .label > .close.icon,\n.ui.inverted.multiple.dropdown > .label > .delete.icon {\n  opacity: 0.6;\n}\n.ui.inverted.multiple.dropdown > .label > .close.icon:hover,\n.ui.inverted.multiple.dropdown > .label > .delete.icon:hover {\n  opacity: 0.8;\n}\n\n/* Selection for form elements */\n.ui.inverted.dropdown textarea::selection,\n.ui.inverted.dropdown input::selection {\n  background-color: rgba(255, 255, 255, 0.25);\n  color: rgba(255, 255, 255, 0.8);\n}\n\n/* Scrollbars */\n.ui.dropdown .inverted.menu::-webkit-scrollbar-track,\n.ui.inverted.dropdown .menu::-webkit-scrollbar-track {\n  background: rgba(255, 255, 255, 0.1);\n}\n.ui.dropdown .inverted.menu::-webkit-scrollbar-thumb,\n.ui.inverted.dropdown .menu::-webkit-scrollbar-thumb {\n  background: rgba(255, 255, 255, 0.25);\n}\n.ui.dropdown .inverted.menu::-webkit-scrollbar-thumb:window-inactive,\n.ui.inverted.dropdown .menu::-webkit-scrollbar-thumb:window-inactive {\n  background: rgba(255, 255, 255, 0.15);\n}\n.ui.dropdown .inverted.menu::-webkit-scrollbar-thumb:hover,\n.ui.inverted.dropdown .menu::-webkit-scrollbar-thumb:hover {\n  background: rgba(255, 255, 255, 0.35);\n}\n.ui.dropdown .inverted.menu,\n.ui.inverted.dropdown .menu {\n  \n/* IE11 */\n  scrollbar-face-color: #656565;\n  scrollbar-shadow-color: #656565;\n  scrollbar-track-color: #323232;\n  scrollbar-arrow-color: #323232;\n}\n@supports (-moz-appearance: none) {\n  .ui.dropdown .inverted.menu,\n  .ui.inverted.dropdown .menu {\n    \n/* firefox: first color thumb, second track */\n    scrollbar-color: rgba(255, 255, 255, 0.25) rgba(255, 255, 255, 0.1);\n  }\n}\n.ui.pointing.dropdown > .inverted.menu::after,\n.ui.inverted.pointing.dropdown > .menu::after {\n  background: #1b1c1d;\n  box-shadow: -1px -1px 0 0 rgba(255, 255, 255, 0.15);\n}\n.ui.inverted.upward.pointing.dropdown > .menu::after {\n  box-shadow: 1px 1px 0 0 rgba(255, 255, 255, 0.15);\n}\n@supports selector(:has(.f)) {\n  .ui.inverted.pointing.dropdown:not(.upward) .menu:has(:first-child:hover)::after,\n  .ui.inverted.upward.pointing.dropdown .menu:has(:last-child:hover)::after {\n    background: #2d2e2f;\n  }\n  .ui.inverted.pointing.dropdown:not(.upward) .menu:has(.selected.item:first-child)::after,\n  .ui.inverted.upward.pointing.dropdown .menu:has(.selected.item:last-child)::after {\n    background: #3d3e3f;\n  }\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n/* Dropdown Carets */\n@font-face {\n  font-family: Dropdown;\n  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\");\n  font-weight: normal;\n  font-style: normal;\n}\n.ui.dropdown > .dropdown.icon {\n  font-family: Dropdown;\n  line-height: 1;\n  height: 1em;\n  width: 1.23em;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  font-weight: normal;\n  font-style: normal;\n  text-align: center;\n}\n.ui.dropdown > .dropdown.icon {\n  width: auto;\n}\n.ui.dropdown > .dropdown.icon::before {\n  content: \"\\f0d7\";\n}\n\n/* Sub Menu */\n.ui.dropdown .menu .item .dropdown.icon::before {\n  content: \"\\f0da\" \n/* rtl: \"\\f0d9\" */;\n}\n.ui.dropdown .item .left.dropdown.icon::before,\n.ui.dropdown .left.menu .item .dropdown.icon::before {\n  content: \"\\f0d9\" /*rtl: \"\\f0da\" */;\n}\n\n/* Vertical Menu Dropdown */\n.ui.vertical.menu .dropdown.item > .dropdown.icon::before {\n  content: \"\\f0da\" \n/* rtl: \"\\f0d9\" */;\n}\n/* Icons for Reference\n.dropdown.down.icon {\n  content: \"\\f0d7\";\n}\n.dropdown.up.icon {\n  content: \"\\f0d8\";\n}\n.dropdown.left.icon {\n  content: \"\\f0d9\";\n}\n.dropdown.icon.icon {\n  content: \"\\f0da\";\n}\n*/\n\n\n/*******************************\n        User Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/dropdown.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Dropdown\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.dropdown = function (parameters) {\n        var\n            $allModules    = $(this),\n            $document      = $(document),\n\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n            contextCheck   = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $(context);\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : window;\n                    }\n                }\n\n                return $context;\n            },\n            returnedValue\n        ;\n\n        $allModules.each(function (elementIndex) {\n            var\n                settings          = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.dropdown.settings, parameters)\n                    : $.extend({}, $.fn.dropdown.settings),\n\n                className       = settings.className,\n                message         = settings.message,\n                fields          = settings.fields,\n                keys            = settings.keys,\n                metadata        = settings.metadata,\n                namespace       = settings.namespace,\n                regExp          = settings.regExp,\n                selector        = settings.selector,\n                error           = settings.error,\n                templates       = settings.templates,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                $module         = $(this),\n                $context        = contextCheck(settings.context, window),\n                $text           = $module.find(selector.text),\n                $search         = $module.find(selector.search),\n                $sizer          = $module.find(selector.sizer),\n                $input          = $module.find(selector.input),\n                $icon           = $module.find(selector.icon),\n                $clear          = $module.find(selector.clearIcon),\n\n                $combo = $module.prev().find(selector.text).length > 0\n                    ? $module.prev().find(selector.text)\n                    : $module.prev(),\n\n                $menu           = $module.children(selector.menu),\n                $item           = $menu.find(selector.item),\n                $divider        = settings.hideDividers\n                    ? $item.parent().children(selector.divider)\n                    : $(),\n\n                activated       = false,\n                itemActivated   = false,\n                internalChange  = false,\n                iconClicked     = false,\n                element         = this,\n                focused         = false,\n                instance        = $module.data(moduleNamespace),\n\n                selectActionActive,\n                initialLoad,\n                pageLostFocus,\n                willRefocus,\n                elementNamespace,\n                id,\n                selectObserver,\n                menuObserver,\n                classObserver,\n                module,\n                tempDisableApiCache = false\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.debug('Initializing dropdown', settings);\n\n                    if (module.is.alreadySetup()) {\n                        module.setup.reference();\n                    } else {\n                        if (settings.ignoreDiacritics && !String.prototype.normalize) {\n                            settings.ignoreDiacritics = false;\n                            module.error(error.noNormalize, element);\n                        }\n\n                        module.create.id();\n                        module.setup.layout();\n\n                        if (settings.values) {\n                            module.set.initialLoad();\n                            module.change.values(settings.values);\n                            module.remove.initialLoad();\n                        }\n                        if (module.get.placeholderText() !== '') {\n                            module.set.placeholderText();\n                        }\n\n                        module.refreshData();\n\n                        module.save.defaults();\n                        module.restore.selected();\n\n                        module.bind.events();\n\n                        module.observeChanges();\n                        module.instantiate();\n                    }\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of dropdown', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous dropdown', $module);\n                    module.remove.tabbable();\n                    module.remove.active();\n                    $menu.transition('stop all');\n                    $menu.removeClass(className.visible).addClass(className.hidden);\n                    $module\n                        .off(eventNamespace)\n                        .removeData(moduleNamespace)\n                    ;\n                    $menu\n                        .off(eventNamespace)\n                    ;\n                    $document\n                        .off(elementNamespace)\n                    ;\n                    module.disconnect.menuObserver();\n                    module.disconnect.selectObserver();\n                    module.disconnect.classObserver();\n                },\n\n                observeChanges: function () {\n                    if ('MutationObserver' in window) {\n                        selectObserver = new MutationObserver(module.event.select.mutation);\n                        menuObserver = new MutationObserver(module.event.menu.mutation);\n                        classObserver = new MutationObserver(module.event.class.mutation);\n                        module.debug('Setting up mutation observer', selectObserver, menuObserver, classObserver);\n                        module.observe.select();\n                        module.observe.menu();\n                        module.observe.class();\n                    }\n                },\n\n                disconnect: {\n                    menuObserver: function () {\n                        if (menuObserver) {\n                            menuObserver.disconnect();\n                        }\n                    },\n                    selectObserver: function () {\n                        if (selectObserver) {\n                            selectObserver.disconnect();\n                        }\n                    },\n                    classObserver: function () {\n                        if (classObserver) {\n                            classObserver.disconnect();\n                        }\n                    },\n                },\n                observe: {\n                    select: function () {\n                        if (module.has.input() && selectObserver) {\n                            selectObserver.observe($module[0], {\n                                attributes: true,\n                                childList: true,\n                                subtree: true,\n                            });\n                        }\n                    },\n                    menu: function () {\n                        if (module.has.menu() && menuObserver) {\n                            menuObserver.observe($menu[0], {\n                                childList: true,\n                                subtree: true,\n                            });\n                        }\n                    },\n                    class: function () {\n                        if (module.has.search() && classObserver) {\n                            classObserver.observe($module[0], {\n                                attributes: true,\n                            });\n                        }\n                    },\n                },\n\n                create: {\n                    id: function () {\n                        id = (Math.random().toString(16) + '000000000').slice(2, 10);\n                        elementNamespace = '.' + id;\n                        module.verbose('Creating unique id for element', id);\n                    },\n                    userChoice: function (values) {\n                        var\n                            $userChoices,\n                            $userChoice,\n                            html\n                        ;\n                        values = values || module.get.userValues();\n                        if (!values) {\n                            return false;\n                        }\n                        values = Array.isArray(values)\n                            ? values\n                            : [values];\n                        $.each(values, function (index, value) {\n                            if (module.get.item(value) === false) {\n                                html = settings.templates.addition(module.add.variables(message.addResult, value));\n                                $userChoice = $('<div />')\n                                    .html(html)\n                                    .attr('data-' + metadata.value, value)\n                                    .attr('data-' + metadata.text, value)\n                                    .addClass(className.addition)\n                                    .addClass(className.item)\n                                ;\n                                if (settings.hideAdditions) {\n                                    $userChoice.addClass(className.hidden);\n                                }\n                                $userChoices = $userChoices === undefined\n                                    ? $userChoice\n                                    : $userChoices.add($userChoice);\n                                module.verbose('Creating user choices for value', value, $userChoice);\n                            }\n                        });\n\n                        return $userChoices;\n                    },\n                    userLabels: function (value) {\n                        var\n                            userValues = module.get.userValues()\n                        ;\n                        if (userValues) {\n                            module.debug('Adding user labels', userValues);\n                            $.each(userValues, function (index, value) {\n                                module.verbose('Adding custom user value');\n                                module.add.label(value, value);\n                            });\n                        }\n                    },\n                    menu: function () {\n                        $menu = $('<div />')\n                            .addClass(className.menu)\n                            .appendTo($module)\n                        ;\n                    },\n                    sizer: function () {\n                        $sizer = $('<span />')\n                            .addClass(className.sizer)\n                            .insertAfter($search)\n                        ;\n                    },\n                },\n\n                search: function (query) {\n                    query = query !== undefined\n                        ? query\n                        : module.get.query();\n                    module.verbose('Searching for query', query);\n                    if (settings.fireOnInit === false && module.is.initialLoad()) {\n                        module.verbose('Skipping callback on initial load', settings.onSearch);\n                    } else if (module.has.minCharacters(query) && settings.onSearch.call(element, query) !== false) {\n                        module.filter(query);\n                    } else {\n                        module.hide(null, true);\n                    }\n                },\n\n                select: {\n                    firstUnfiltered: function () {\n                        module.verbose('Selecting first non-filtered element');\n                        module.remove.selectedItem();\n                        $item\n                            .not(selector.unselectable)\n                            .not(selector.addition + selector.hidden)\n                            .eq(0)\n                            .addClass(className.selected)\n                        ;\n                    },\n                    nextAvailable: function ($selected) {\n                        $selected = $selected.eq(0);\n                        var\n                            $nextAvailable = $selected.nextAll(selector.item).not(selector.unselectable).eq(0),\n                            $prevAvailable = $selected.prevAll(selector.item).not(selector.unselectable).eq(0),\n                            hasNext        = $nextAvailable.length > 0\n                        ;\n                        if (hasNext) {\n                            module.verbose('Moving selection to', $nextAvailable);\n                            $nextAvailable.addClass(className.selected);\n                        } else {\n                            module.verbose('Moving selection to', $prevAvailable);\n                            $prevAvailable.addClass(className.selected);\n                        }\n                    },\n                },\n\n                setup: {\n                    api: function () {\n                        var\n                            apiSettings = {\n                                debug: settings.debug,\n                                urlData: {\n                                    value: module.get.value(),\n                                    query: module.get.query(),\n                                },\n                                on: false,\n                            }\n                        ;\n                        module.verbose('First request, initializing API');\n                        $module\n                            .api(apiSettings)\n                        ;\n                    },\n                    layout: function () {\n                        if ($module.is('select')) {\n                            module.setup.select();\n                            module.setup.returnedObject();\n                        }\n                        if (!module.has.menu()) {\n                            module.create.menu();\n                        }\n                        if (module.is.clearable() && !module.has.clearItem()) {\n                            module.verbose('Adding clear icon');\n                            $clear = $('<i />')\n                                .addClass('remove icon')\n                                .insertAfter($icon)\n                            ;\n                        }\n                        if (module.is.search() && !module.has.search()) {\n                            module.verbose('Adding search input');\n                            var\n                                labelNode = $module.prev('label')\n                            ;\n                            $search = $('<input />')\n                                .addClass(className.search)\n                                .prop('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')\n                            ;\n                            if (labelNode.length > 0) {\n                                if (!labelNode.attr('id')) {\n                                    labelNode.attr('id', '_' + module.get.id() + '_formLabel');\n                                }\n                                $search.attr('aria-labelledby', labelNode.attr('id'));\n                            }\n                            $search.insertBefore($text);\n                        }\n                        if (module.is.multiple() && module.is.searchSelection() && !module.has.sizer()) {\n                            module.create.sizer();\n                        }\n                        if (settings.allowTab) {\n                            module.set.tabbable();\n                        }\n                    },\n                    select: function () {\n                        var\n                            selectValues  = module.get.selectValues()\n                        ;\n                        module.debug('Dropdown initialized on a select', selectValues);\n                        if ($module.is('select')) {\n                            $input = $module;\n                        }\n                        // see if select is placed correctly already\n                        if ($input.parent(selector.dropdown).length > 0) {\n                            module.debug('UI dropdown already exists. Creating dropdown menu only');\n                            $module = $input.closest(selector.dropdown);\n                            if (!module.has.menu()) {\n                                module.create.menu();\n                            }\n                            $menu = $module.children(selector.menu);\n                            module.setup.menu(selectValues);\n                        } else {\n                            module.debug('Creating entire dropdown from select');\n                            $module = $('<div />')\n                                .attr('class', $input.attr('class'))\n                                .addClass(className.selection)\n                                .addClass(className.dropdown)\n                                .html(templates.dropdown(selectValues, fields, settings.preserveHTML, settings.className))\n                                .insertBefore($input)\n                            ;\n                            if ($input.hasClass(className.multiple) && $input.prop('multiple') === false) {\n                                module.error(error.missingMultiple);\n                                $input.prop('multiple', true);\n                            }\n                            if ($input.is('[multiple]')) {\n                                module.set.multiple();\n                            }\n                            if ($input.prop('disabled')) {\n                                module.debug('Disabling dropdown');\n                                $module.addClass(className.disabled);\n                            }\n                            if ($input.is('[required]')) {\n                                settings.forceSelection = true;\n                            }\n                            if (!settings.allowTab) {\n                                $input.removeAttr('tabindex');\n                            }\n                            $input\n                                .prop('required', false)\n                                .removeAttr('class')\n                                .detach()\n                                .prependTo($module)\n                            ;\n                        }\n                        module.refresh();\n                    },\n                    menu: function (values) {\n                        $menu.html(templates.menu(values, fields, settings.preserveHTML, settings.className));\n                        $item = $menu.find(selector.item);\n                        $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $();\n                    },\n                    reference: function () {\n                        module.debug('Dropdown behavior was called on select, replacing with closest dropdown');\n                        // replace module reference\n                        $module = $module.parent(selector.dropdown);\n                        instance = $module.data(moduleNamespace);\n                        element = $module[0];\n                        module.refresh();\n                        module.setup.returnedObject();\n                    },\n                    returnedObject: function () {\n                        var\n                            $firstModules = $allModules.slice(0, elementIndex),\n                            $lastModules  = $allModules.slice(elementIndex + 1)\n                        ;\n                        // adjust all modules to use correct reference\n                        $allModules = $firstModules.add($module).add($lastModules);\n                    },\n                },\n\n                refresh: function () {\n                    module.refreshSelectors();\n                    module.refreshData();\n                },\n\n                refreshItems: function () {\n                    $item = $menu.find(selector.item);\n                    $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $();\n                },\n\n                refreshSelectors: function () {\n                    module.verbose('Refreshing selector cache');\n                    $text = $module.find(selector.text);\n                    $search = $module.find(selector.search);\n                    $input = $module.find(selector.input);\n                    $icon = $module.find(selector.icon);\n                    $combo = $module.prev().find(selector.text).length > 0\n                        ? $module.prev().find(selector.text)\n                        : $module.prev();\n                    $menu = $module.children(selector.menu);\n                    $item = $menu.find(selector.item);\n                    $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $();\n                },\n\n                refreshData: function () {\n                    module.verbose('Refreshing cached metadata');\n                    $item\n                        .removeData(metadata.text)\n                        .removeData(metadata.value)\n                    ;\n                },\n\n                clearData: function () {\n                    module.verbose('Clearing metadata');\n                    $item\n                        .removeData(metadata.text)\n                        .removeData(metadata.value)\n                    ;\n                    $module\n                        .removeData(metadata.defaultText)\n                        .removeData(metadata.defaultValue)\n                        .removeData(metadata.placeholderText)\n                    ;\n                },\n\n                clearItems: function () {\n                    $menu.empty();\n                    module.refreshItems();\n                },\n\n                toggle: function () {\n                    module.verbose('Toggling menu visibility');\n                    if (!module.is.active()) {\n                        module.show();\n                    } else {\n                        module.hide();\n                    }\n                },\n\n                show: function (callback, preventFocus) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if ((focused || iconClicked) && module.is.remote() && module.is.noApiCache() && !module.has.maxSelections()) {\n                        module.clearItems();\n                    }\n                    if (!module.can.show() && module.is.remote()) {\n                        module.debug('No API results retrieved, searching before show');\n                        module.queryRemote(module.get.query(), module.show, [callback, preventFocus]);\n                    }\n                    if (module.can.show() && !module.is.active()) {\n                        module.debug('Showing dropdown');\n                        if (module.has.message() && !(module.has.maxSelections() || module.has.allResultsFiltered())) {\n                            module.remove.message();\n                        }\n                        if (module.is.allFiltered()) {\n                            return true;\n                        }\n                        if (settings.onShow.call(element) !== false) {\n                            module.remove.empty();\n                            module.animate.show(function () {\n                                module.bind.intent();\n                                if (module.has.search() && !preventFocus) {\n                                    module.focusSearch();\n                                }\n                                module.set.visible();\n                                callback.call(element);\n                            });\n                        }\n                    }\n                },\n\n                hide: function (callback, preventBlur) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if (module.is.active() && !module.is.animatingOutward()) {\n                        module.debug('Hiding dropdown');\n                        if (settings.onHide.call(element) !== false) {\n                            module.animate.hide(function () {\n                                module.remove.visible();\n                                // hiding search focus\n                                if (module.is.focusedOnSearch() && preventBlur !== true) {\n                                    $search.trigger('blur');\n                                }\n                                callback.call(element);\n                            });\n                            // Hide submenus explicitly. On some browsers (esp. mobile), they will not automatically receive a\n                            // mouseleave event\n                            var $subMenu = $module.find(selector.menu);\n                            if ($subMenu.length > 0) {\n                                module.verbose('Hiding sub-menu', $subMenu);\n                                $subMenu.each(function () {\n                                    var $sub = $(this);\n                                    if (!module.is.animating($sub)) {\n                                        module.animate.hide(false, $sub);\n                                    }\n                                });\n                            }\n                        }\n                    } else {\n                        module.unbind.intent();\n                    }\n                    iconClicked = false;\n                    focused = false;\n                },\n\n                hideOthers: function () {\n                    module.verbose('Finding other dropdowns to hide');\n                    $allModules\n                        .not($module)\n                        .has(selector.menu + '.' + className.visible)\n                        .dropdown('hide')\n                    ;\n                },\n\n                hideMenu: function () {\n                    module.verbose('Hiding menu  instantaneously');\n                    module.remove.active();\n                    module.remove.visible();\n                    $menu.transition('destroy').transition('hide');\n                },\n\n                hideSubMenus: function () {\n                    var\n                        $subMenus = $menu.children(selector.item).find(selector.menu)\n                    ;\n                    module.verbose('Hiding sub menus', $subMenus);\n                    $subMenus.transition('hide');\n                },\n\n                bind: {\n                    events: function () {\n                        module.bind.keyboardEvents();\n                        module.bind.inputEvents();\n                        module.bind.mouseEvents();\n                    },\n                    keyboardEvents: function () {\n                        module.verbose('Binding keyboard events');\n                        $module\n                            .on('keydown' + eventNamespace, module.event.keydown)\n                        ;\n                        if (module.has.search()) {\n                            $module\n                                .on(module.get.inputEvent() + eventNamespace, selector.search, module.event.input)\n                            ;\n                        }\n                        if (module.is.multiple()) {\n                            $document\n                                .on('keydown' + elementNamespace, module.event.document.keydown)\n                            ;\n                        }\n                    },\n                    inputEvents: function () {\n                        module.verbose('Binding input change events');\n                        $module\n                            .on('change' + eventNamespace, selector.input, module.event.change)\n                        ;\n                        if (module.is.multiple() && module.is.searchSelection()) {\n                            $module\n                                .on('paste' + eventNamespace, selector.search, module.event.paste)\n                            ;\n                        }\n                    },\n                    mouseEvents: function () {\n                        module.verbose('Binding mouse events');\n                        if (module.is.multiple()) {\n                            $module\n                                .on('click' + eventNamespace, selector.label, module.event.label.click)\n                                .on('click' + eventNamespace, selector.remove, module.event.remove.click)\n                            ;\n                        }\n                        if (module.is.searchSelection()) {\n                            $module\n                                .on('mousedown' + eventNamespace, module.event.mousedown)\n                                .on('mouseup' + eventNamespace, module.event.mouseup)\n                                .on('mousedown' + eventNamespace, selector.menu, module.event.menu.mousedown)\n                                .on('mouseup' + eventNamespace, selector.menu, module.event.menu.mouseup)\n                                .on('click' + eventNamespace, selector.icon, module.event.icon.click)\n                                .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)\n                                .on('focus' + eventNamespace, selector.search, module.event.search.focus)\n                                .on('click' + eventNamespace, selector.search, module.event.search.focus)\n                                .on('blur' + eventNamespace, selector.search, module.event.search.blur)\n                                .on('click' + eventNamespace, selector.text, module.event.text.focus)\n                            ;\n                            if (module.is.multiple()) {\n                                $module\n                                    .on('click' + eventNamespace, module.event.click)\n                                    .on('click' + eventNamespace, module.event.search.focus)\n                                ;\n                            }\n                        } else {\n                            if (settings.on === 'click') {\n                                $module\n                                    .on('click' + eventNamespace, selector.icon, module.event.icon.click)\n                                    .on('click' + eventNamespace, module.event.test.toggle)\n                                ;\n                            } else if (settings.on === 'hover') {\n                                $module\n                                    .on('mouseenter' + eventNamespace, module.delay.show)\n                                    .on('mouseleave' + eventNamespace, module.delay.hide)\n                                    .on('touchstart' + eventNamespace, module.event.test.toggle)\n                                    .on('touchstart' + eventNamespace, selector.icon, module.event.icon.click)\n                                ;\n                            } else {\n                                $module\n                                    .on(settings.on + eventNamespace, module.toggle)\n                                ;\n                            }\n                            $module\n                                .on('mousedown' + eventNamespace, module.event.mousedown)\n                                .on('mouseup' + eventNamespace, module.event.mouseup)\n                                .on('focus' + eventNamespace, module.event.focus)\n                                .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)\n                            ;\n                            if (module.has.menuSearch()) {\n                                $module\n                                    .on('blur' + eventNamespace, selector.search, module.event.search.blur)\n                                ;\n                            } else {\n                                $module\n                                    .on('blur' + eventNamespace, module.event.blur)\n                                ;\n                            }\n                        }\n                        $menu\n                            .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter)\n                            .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)\n                            .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)\n                            .on('click' + eventNamespace, selector.item, module.event.item.click)\n                        ;\n                    },\n                    intent: function () {\n                        module.verbose('Binding hide intent event to document');\n                        $document\n                            .on('click' + elementNamespace, module.event.test.hide)\n                        ;\n                    },\n                },\n\n                unbind: {\n                    intent: function () {\n                        module.verbose('Removing hide intent event from document');\n                        $document\n                            .off('click' + elementNamespace)\n                        ;\n                    },\n                },\n\n                filter: function (query) {\n                    var\n                        searchTerm = query !== undefined\n                            ? query\n                            : module.get.query(),\n                        afterFiltered = function () {\n                            if (module.is.multiple()) {\n                                module.filterActive();\n                            }\n                            if (query || (!query && module.get.activeItem().length === 0)) {\n                                module.select.firstUnfiltered();\n                            }\n                            if (module.has.allResultsFiltered()) {\n                                if (settings.onNoResults.call(element, searchTerm)) {\n                                    if (settings.allowAdditions) {\n                                        if (settings.hideAdditions) {\n                                            module.verbose('User addition with no menu, setting empty style');\n                                            module.set.empty();\n                                            module.hideMenu();\n                                        }\n                                    } else {\n                                        module.verbose('All items filtered, showing message', searchTerm);\n                                        module.add.message(message.noResults);\n                                    }\n                                } else {\n                                    module.verbose('All items filtered, hiding dropdown', searchTerm);\n                                    module.set.empty();\n                                    module.hideMenu();\n                                }\n                            } else {\n                                module.remove.empty();\n                                module.remove.message();\n                            }\n                            if (settings.allowAdditions) {\n                                module.add.userSuggestion(module.escape.htmlEntities(query));\n                            }\n                            if (module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() && !module.is.empty()) {\n                                module.show();\n                            }\n                        }\n                    ;\n                    if (settings.useLabels && module.has.maxSelections()) {\n                        module.show();\n\n                        return;\n                    }\n                    if (settings.apiSettings) {\n                        if (module.can.useAPI()) {\n                            module.queryRemote(searchTerm, function () {\n                                if (settings.filterRemoteData) {\n                                    module.filterItems(searchTerm);\n                                }\n                                var preSelected = $input.val();\n                                if (!Array.isArray(preSelected)) {\n                                    preSelected = preSelected && preSelected !== '' ? preSelected.split(settings.delimiter) : [];\n                                }\n                                if (module.is.multiple()) {\n                                    $.each(preSelected, function (index, value) {\n                                        $item.filter('[data-' + metadata.value + '=\"' + value + '\"]')\n                                            .addClass(className.filtered)\n                                        ;\n                                    });\n                                }\n                                module.focusSearch(true);\n                                afterFiltered();\n                            });\n                        } else {\n                            module.error(error.noAPI);\n                        }\n                    } else {\n                        module.filterItems(searchTerm);\n                        afterFiltered();\n                    }\n                },\n\n                queryRemote: function (query, callback, callbackParameters) {\n                    if (!Array.isArray(callbackParameters)) {\n                        callbackParameters = [callbackParameters];\n                    }\n                    var\n                        apiSettings = {\n                            errorDuration: false,\n                            cache: 'local',\n                            throttle: settings.throttle,\n                            urlData: {\n                                query: query,\n                            },\n                        },\n                        apiCallbacks = {\n                            onError: function (errorMessage, $module, xhr) {\n                                module.add.message(message.serverError);\n                                iconClicked = false;\n                                focused = false;\n                                callback.apply(null, callbackParameters);\n                                if (typeof settings.apiSettings.onError === 'function') {\n                                    settings.apiSettings.onError.call(this, errorMessage, $module, xhr);\n                                }\n                            },\n                            onFailure: function (response, $module, xhr) {\n                                module.add.message(message.serverError);\n                                iconClicked = false;\n                                focused = false;\n                                callback.apply(null, callbackParameters);\n                                if (typeof settings.apiSettings.onFailure === 'function') {\n                                    settings.apiSettings.onFailure.call(this, response, $module, xhr);\n                                }\n                            },\n                            onSuccess: function (response, $module, xhr) {\n                                var\n                                    values          = response[fields.remoteValues]\n                                ;\n                                if (!Array.isArray(values)) {\n                                    values = [];\n                                }\n                                module.remove.message();\n                                var menuConfig = {};\n                                menuConfig[fields.values] = values;\n                                module.setup.menu(menuConfig);\n\n                                if (values.length === 0 && !settings.allowAdditions) {\n                                    module.add.message(message.noResults);\n                                } else {\n                                    var value = module.is.multiple() ? module.get.values() : module.get.value();\n                                    if (value !== '') {\n                                        module.verbose('Value(s) present after click icon, select value(s) in items');\n                                        module.set.selected(value, null, true, true);\n                                    }\n                                }\n                                iconClicked = false;\n                                focused = false;\n                                callback.apply(null, callbackParameters);\n                                if (typeof settings.apiSettings.onSuccess === 'function') {\n                                    settings.apiSettings.onSuccess.call(this, response, $module, xhr);\n                                }\n                            },\n                        }\n                    ;\n                    if (!$module.api('get request')) {\n                        module.setup.api();\n                    }\n                    apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings, apiCallbacks, tempDisableApiCache ? { cache: false } : {});\n                    $module\n                        .api('setting', apiSettings)\n                        .api('query')\n                    ;\n                    tempDisableApiCache = false;\n                },\n\n                filterItems: function (query) {\n                    var\n                        searchTerm = module.remove.diacritics(\n                            query !== undefined\n                                ? query\n                                : module.get.query()\n                        ),\n                        results = null,\n                        escapedTerm = module.escape.string(searchTerm),\n                        regExpIgnore = settings.ignoreSearchCase ? 'i' : '',\n                        regExpFlags = regExpIgnore + 'gm',\n                        beginsWithRegExp = new RegExp('^' + escapedTerm, regExpFlags)\n                    ;\n                    module.remove.filteredItem();\n                    // avoid loop if we're matching nothing\n                    if (module.has.query()) {\n                        results = [];\n\n                        module.verbose('Searching for matching values', searchTerm);\n                        $item\n                            .each(function () {\n                                var\n                                    $choice = $(this),\n                                    text,\n                                    value\n                                ;\n                                if ($choice.hasClass(className.unfilterable)) {\n                                    results.push(this);\n\n                                    return true;\n                                }\n                                if (settings.match === 'both' || settings.match === 'text') {\n                                    text = module.remove.diacritics(String(module.get.choiceText($choice, false)));\n                                    if (text.search(beginsWithRegExp) !== -1\n                                        || (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text))\n                                        || (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text))\n                                    ) {\n                                        results.push(this);\n\n                                        return true;\n                                    }\n                                }\n                                if (settings.match === 'both' || settings.match === 'value') {\n                                    value = module.remove.diacritics(String(module.get.choiceValue($choice, text)));\n                                    if (value.search(beginsWithRegExp) !== -1\n                                        || (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, value))\n                                        || (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, value))\n                                    ) {\n                                        results.push(this);\n\n                                        return true;\n                                    }\n                                }\n                            })\n                        ;\n                    }\n                    module.debug('Showing only matched items', searchTerm);\n                    if (results) {\n                        $item\n                            .not(results)\n                            .addClass(className.filtered)\n                        ;\n                        if (settings.highlightMatches && (settings.match === 'both' || settings.match === 'text')) {\n                            var querySplit = query.split(''),\n                                diacriticReg = settings.ignoreDiacritics ? '[\\u0300-\\u036F]?' : '',\n                                htmlReg = '(?![^<]*>)',\n                                markedRegExp = new RegExp(htmlReg + '(' + querySplit.join(diacriticReg + ')(.*?)' + htmlReg + '(') + diacriticReg + ')', regExpIgnore),\n                                markedReplacer = function () {\n                                    var args = [].slice.call(arguments, 1, querySplit.length * 2).map(function (x, i) {\n                                        return i & 1 ? x : '<mark>' + x + '</mark>'; // eslint-disable-line no-bitwise\n                                    });\n\n                                    return args.join('');\n                                }\n                            ;\n                            $.each(results, function (index, result) {\n                                var $result = $(result),\n                                    markedHTML = module.get.choiceText($result, true)\n                                ;\n                                if (settings.ignoreDiacritics) {\n                                    markedHTML = markedHTML.normalize('NFD');\n                                }\n                                $result.html(markedHTML.replace(markedRegExp, markedReplacer));\n                            });\n                        }\n                    }\n\n                    if (!module.has.query()) {\n                        $divider\n                            .removeClass(className.hidden)\n                        ;\n                    } else if (settings.hideDividers === true) {\n                        $divider\n                            .addClass(className.hidden)\n                        ;\n                    } else if (settings.hideDividers === 'empty') {\n                        $divider\n                            .removeClass(className.hidden)\n                            .filter(function () {\n                                // First find the last divider in this divider group\n                                // Dividers which are direct siblings are considered a group\n                                var $lastDivider = $(this).nextUntil(selector.item);\n\n                                return ($lastDivider.length > 0 ? $lastDivider : $(this))\n                                    // Count all non-filtered items until the next divider (or end of the dropdown)\n                                    .nextUntil(selector.divider)\n                                    .filter(selector.item + ':not(.' + className.filtered + ')')\n                                    // Hide divider if no items are found\n                                    .length === 0;\n                            })\n                            .addClass(className.hidden)\n                        ;\n                    }\n                },\n\n                fuzzySearch: function (query, term) {\n                    var\n                        termLength  = term.length,\n                        queryLength = query.length\n                    ;\n                    if (settings.ignoreSearchCase) {\n                        query = query.toLowerCase();\n                        term = term.toLowerCase();\n                    }\n                    if (queryLength > termLength) {\n                        return false;\n                    }\n                    if (queryLength === termLength) {\n                        return query === term;\n                    }\n                    for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {\n                        var\n                            continueSearch = false,\n                            queryCharacter = query.charCodeAt(characterIndex)\n                        ;\n                        while (nextCharacterIndex < termLength) {\n                            if (term.charCodeAt(nextCharacterIndex++) === queryCharacter) {\n                                continueSearch = true;\n\n                                break;\n                            }\n                        }\n\n                        if (!continueSearch) {\n                            return false;\n                        }\n                    }\n\n                    return true;\n                },\n                exactSearch: function (query, term) {\n                    query = settings.ignoreSearchCase ? query.toLowerCase() : query;\n                    term = settings.ignoreSearchCase ? term.toLowerCase() : term;\n\n                    return term.indexOf(query) > -1;\n                },\n                filterActive: function () {\n                    if (settings.useLabels) {\n                        $item.filter('.' + className.active)\n                            .addClass(className.filtered)\n                        ;\n                    }\n                },\n\n                focusSearch: function (skipHandler) {\n                    if (module.has.search() && !module.is.focusedOnSearch()) {\n                        if (skipHandler) {\n                            $module.off('focus' + eventNamespace, selector.search);\n                            $search.trigger('focus');\n                            $module.on('focus' + eventNamespace, selector.search, module.event.search.focus);\n                        } else {\n                            $search.trigger('focus');\n                        }\n                    }\n                },\n\n                blurSearch: function () {\n                    if (module.has.search()) {\n                        $search.trigger('blur');\n                    }\n                },\n\n                forceSelection: function () {\n                    var\n                        $currentlySelected = $item.not(className.filtered).filter('.' + className.selected).eq(0),\n                        $activeItem        = $item.not(className.filtered).filter('.' + className.active).eq(0),\n                        $selectedItem      = $currentlySelected.length > 0\n                            ? $currentlySelected\n                            : $activeItem,\n                        hasSelected = $selectedItem.length > 0\n                    ;\n                    if (settings.allowAdditions || (hasSelected && !module.is.multiple())) {\n                        module.debug('Forcing partial selection to selected item', $selectedItem);\n                        module.event.item.click.call($selectedItem, {}, true);\n                    } else {\n                        module.remove.searchTerm();\n                    }\n                },\n\n                change: {\n                    values: function (values) {\n                        if (!settings.allowAdditions) {\n                            module.clear();\n                        }\n                        module.debug('Creating dropdown with specified values', values);\n                        var menuConfig = {};\n                        menuConfig[fields.values] = values;\n                        module.setup.menu(menuConfig);\n                        $.each(values, function (index, item) {\n                            if (item.selected === true) {\n                                module.debug('Setting initial selection to', item[fields.value]);\n                                module.set.selected(item[fields.value]);\n                                if (!module.is.multiple()) {\n                                    return false;\n                                }\n                            }\n                        });\n\n                        if (module.has.selectInput()) {\n                            module.disconnect.selectObserver();\n                            $input.html('');\n                            $input.append('<option disabled selected value></option>');\n                            $.each(values, function (index, item) {\n                                var\n                                    value = settings.templates.deQuote(item[fields.value]),\n                                    name = settings.templates.escape(\n                                        item[fields.name] || '',\n                                        settings.preserveHTML\n                                    )\n                                ;\n                                $input.append('<option value=\"' + value + '\"' + (item.selected === true ? ' selected' : '') + '>' + name + '</option>');\n                            });\n                            module.observe.select();\n                        }\n                    },\n                },\n\n                event: {\n                    paste: function (event) {\n                        var\n                            pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text'),\n                            tokens = pasteValue.split(settings.delimiter),\n                            notFoundTokens = []\n                        ;\n                        tokens.forEach(function (value) {\n                            if (module.set.selected(module.escape.htmlEntities(value.trim()), null, false, true) === false) {\n                                notFoundTokens.push(value.trim());\n                            }\n                        });\n                        event.preventDefault();\n                        if (notFoundTokens.length > 0) {\n                            var searchEl = $search[0],\n                                startPos = searchEl.selectionStart,\n                                endPos = searchEl.selectionEnd,\n                                orgText = searchEl.value,\n                                pasteText = notFoundTokens.join(settings.delimiter),\n                                newEndPos = startPos + pasteText.length\n                            ;\n                            $search.val(orgText.slice(0, startPos) + pasteText + orgText.slice(endPos));\n                            searchEl.selectionStart = newEndPos;\n                            searchEl.selectionEnd = newEndPos;\n                            module.event.input(event);\n                        }\n                    },\n                    change: function () {\n                        if (!internalChange) {\n                            module.debug('Input changed, updating selection');\n                            module.set.selected();\n                        }\n                    },\n                    focus: function () {\n                        if (settings.showOnFocus && !activated && module.is.hidden() && !pageLostFocus) {\n                            focused = true;\n                            module.show();\n                        }\n                    },\n                    blur: function (event) {\n                        pageLostFocus = document.activeElement === this;\n                        if (!activated && !pageLostFocus) {\n                            module.remove.activeLabel();\n                            module.hide();\n                        }\n                    },\n                    mousedown: function () {\n                        if (module.is.searchSelection(true)) {\n                            // prevent menu hiding on immediate re-focus\n                            willRefocus = true;\n                        } else {\n                            // prevents focus callback from occurring on mousedown\n                            activated = true;\n                        }\n                    },\n                    mouseup: function () {\n                        if (module.is.searchSelection(true)) {\n                            // prevent menu hiding on immediate re-focus\n                            willRefocus = false;\n                        } else {\n                            activated = false;\n                        }\n                    },\n                    click: function (event) {\n                        var\n                            $target = $(event.target)\n                        ;\n                        // focus search\n                        if ($target.is($module)) {\n                            if (!module.is.focusedOnSearch()) {\n                                module.focusSearch();\n                            } else {\n                                module.show();\n                            }\n                        }\n                    },\n                    search: {\n                        focus: function (event) {\n                            activated = true;\n                            if (module.is.multiple()) {\n                                module.remove.activeLabel();\n                            }\n                            if (!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin')) && event.type !== 'touchstart') {\n                                focused = true;\n                                module.search();\n                            }\n                        },\n                        blur: function (event) {\n                            pageLostFocus = document.activeElement === this;\n                            if (module.is.searchSelection(true) && !willRefocus) {\n                                if (!itemActivated && !pageLostFocus) {\n                                    if (settings.forceSelection) {\n                                        module.forceSelection();\n                                    } else if (!settings.allowAdditions && !settings.keepSearchTerm && !module.has.menuSearch()) {\n                                        module.remove.searchTerm();\n                                    }\n                                    module.hide();\n                                }\n                            }\n                            willRefocus = false;\n                        },\n                    },\n                    clearIcon: {\n                        click: function (event) {\n                            module.clear();\n                            if (module.is.searchSelection()) {\n                                module.remove.searchTerm();\n                            }\n                            if (settings.collapseOnClearable) {\n                                module.hide();\n                            }\n                            event.stopPropagation();\n                        },\n                    },\n                    icon: {\n                        click: function (event) {\n                            iconClicked = true;\n                            if (module.has.search()) {\n                                if (!module.is.active()) {\n                                    if (settings.showOnFocus) {\n                                        module.focusSearch();\n                                    } else {\n                                        module.toggle();\n                                    }\n                                } else {\n                                    module.blurSearch();\n                                }\n                            } else {\n                                module.toggle();\n                            }\n                            event.stopPropagation();\n                        },\n                    },\n                    text: {\n                        focus: function (event) {\n                            activated = true;\n                            module.focusSearch();\n                        },\n                    },\n                    input: function (event) {\n                        if (module.is.multiple() || module.is.searchSelection()) {\n                            module.set.filtered();\n                        }\n                        clearTimeout(module.timer);\n                        module.timer = setTimeout(function () {\n                            module.search();\n                        }, settings.delay.search);\n                    },\n                    label: {\n                        click: function (event) {\n                            var\n                                $label        = $(this),\n                                $labels       = $module.find(selector.label),\n                                $activeLabels = $labels.filter('.' + className.active),\n                                $nextActive   = $label.nextAll('.' + className.active),\n                                $prevActive   = $label.prevAll('.' + className.active),\n                                $range = $nextActive.length > 0\n                                    ? $label.nextUntil($nextActive).add($activeLabels).add($label)\n                                    : $label.prevUntil($prevActive).add($activeLabels).add($label)\n                            ;\n                            if (event.shiftKey) {\n                                $activeLabels.removeClass(className.active);\n                                $range.addClass(className.active);\n                            } else if (event.ctrlKey) {\n                                $label.toggleClass(className.active);\n                            } else {\n                                $activeLabels.removeClass(className.active);\n                                $label.addClass(className.active);\n                            }\n                            settings.onLabelSelect.apply(this, $labels.filter('.' + className.active));\n                            event.stopPropagation();\n                        },\n                    },\n                    remove: {\n                        click: function (event) {\n                            var\n                                $label = $(this).parent()\n                            ;\n                            if ($label.hasClass(className.active)) {\n                                // remove all selected labels\n                                module.remove.activeLabels();\n                            } else {\n                                // remove this label only\n                                module.remove.activeLabels($label);\n                            }\n                            event.stopPropagation();\n                        },\n                    },\n                    test: {\n                        toggle: function (event) {\n                            var\n                                toggleBehavior = module.is.multiple()\n                                    ? module.show\n                                    : module.toggle\n                            ;\n                            if (module.is.bubbledLabelClick(event) || module.is.bubbledIconClick(event)) {\n                                return;\n                            }\n                            if (!module.is.multiple() || (module.is.multiple() && !module.is.active())) {\n                                focused = true;\n                            }\n                            if (module.determine.eventOnElement(event, toggleBehavior) && event.type !== 'touchstart') {\n                                // do not preventDefault of touchstart; so emulated mouseenter is triggered on first touch and not later\n                                // (when selecting an item). The double-showing of the dropdown through both events does not hurt.\n                                event.preventDefault();\n                            }\n                        },\n                        hide: function (event) {\n                            if (module.determine.eventInModule(event, module.hide)) {\n                                if (element.id && $(event.target).attr('for') === element.id) {\n                                    event.preventDefault();\n                                }\n                            }\n                        },\n                    },\n                    class: {\n                        mutation: function (mutations) {\n                            mutations.forEach(function (mutation) {\n                                if (mutation.attributeName === 'class') {\n                                    module.check.disabled();\n                                }\n                            });\n                        },\n                    },\n                    select: {\n                        mutation: function (mutations) {\n                            if (module.is.selectMutation(mutations)) {\n                                module.debug('<select> modified, recreating menu');\n                                module.disconnect.selectObserver();\n                                module.refresh();\n                                module.setup.select();\n                                module.set.selected();\n                                module.observe.select();\n                            }\n                        },\n                    },\n                    menu: {\n                        mutation: function (mutations) {\n                            var\n                                mutation   = mutations[0],\n                                $addedNode = mutation.addedNodes\n                                    ? $(mutation.addedNodes[0])\n                                    : $(false),\n                                $removedNode = mutation.removedNodes\n                                    ? $(mutation.removedNodes[0])\n                                    : $(false),\n                                $changedNodes  = $addedNode.add($removedNode),\n                                isUserAddition = $changedNodes.is(selector.addition) || $changedNodes.closest(selector.addition).length > 0,\n                                isMessage      = $changedNodes.is(selector.message) || $changedNodes.closest(selector.message).length > 0\n                            ;\n                            if (isUserAddition || isMessage) {\n                                module.debug('Updating item selector cache');\n                                module.refreshItems();\n                            } else {\n                                module.debug('Menu modified, updating selector cache');\n                                module.refresh();\n                            }\n                        },\n                        mousedown: function () {\n                            itemActivated = true;\n                        },\n                        mouseup: function () {\n                            itemActivated = false;\n                        },\n                    },\n                    item: {\n                        mouseenter: function (event) {\n                            var\n                                $target        = $(event.target),\n                                $item          = $(this),\n                                $subMenu       = $item.children(selector.menu),\n                                $otherMenus    = $item.siblings(selector.item).children(selector.menu),\n                                hasSubMenu     = $subMenu.length > 0,\n                                isBubbledEvent = $subMenu.find($target).length > 0\n                            ;\n                            if (!isBubbledEvent && hasSubMenu) {\n                                clearTimeout(module.itemTimer);\n                                module.itemTimer = setTimeout(function () {\n                                    module.verbose('Showing sub-menu', $subMenu);\n                                    $.each($otherMenus, function () {\n                                        module.animate.hide(false, $(this));\n                                    });\n                                    module.animate.show(false, $subMenu);\n                                }, settings.delay.show);\n                                event.preventDefault();\n                            }\n                        },\n                        mouseleave: function (event) {\n                            var\n                                $subMenu = $(this).find(selector.menu)\n                            ;\n                            if ($subMenu.length > 0) {\n                                clearTimeout(module.itemTimer);\n                                module.itemTimer = setTimeout(function () {\n                                    module.verbose('Hiding sub-menu', $subMenu);\n                                    $subMenu.each(function () {\n                                        module.animate.hide(false, $(this));\n                                    });\n                                }, settings.delay.hide);\n                            }\n                        },\n                        click: function (event, skipRefocus) {\n                            var\n                                $choice        = $(this),\n                                $target        = event\n                                    ? $(event.target || '')\n                                    : $(''),\n                                $subMenu       = $choice.find(selector.menu),\n                                text           = module.get.choiceText($choice),\n                                value          = module.get.choiceValue($choice, text),\n                                hasSubMenu     = $subMenu.length > 0,\n                                isBubbledEvent = $subMenu.find($target).length > 0\n                            ;\n                            // prevents IE11 bug where menu receives focus even though `tabindex=-1`\n                            if (document.activeElement.tagName.toLowerCase() !== 'input') {\n                                $(document.activeElement).trigger('blur');\n                            }\n                            if (!isBubbledEvent && (!hasSubMenu || settings.allowCategorySelection)) {\n                                if (module.is.searchSelection()) {\n                                    if (settings.allowAdditions) {\n                                        module.remove.userAddition();\n                                    }\n                                    if (!settings.keepSearchTerm) {\n                                        if (module.is.multiple()) {\n                                            module.remove.filteredItem();\n                                        }\n                                        module.remove.searchTerm();\n                                    }\n                                    if (!module.is.visible() && $target.length > 0) {\n                                        module.show();\n                                    }\n                                    if (!module.is.focusedOnSearch() && skipRefocus !== true) {\n                                        module.focusSearch(true);\n                                    }\n                                }\n                                if (!settings.useLabels) {\n                                    module.remove.filteredItem();\n                                    module.set.scrollPosition($choice);\n                                }\n                                module.determine.selectAction.call(this, text, value);\n                            }\n                        },\n                    },\n\n                    document: {\n                        // label selection should occur even when element has no focus\n                        keydown: function (event) {\n                            var\n                                pressedKey    = event.which,\n                                isShortcutKey = module.is.inObject(pressedKey, keys)\n                            ;\n                            if (isShortcutKey) {\n                                var\n                                    $label            = $module.find(selector.label),\n                                    $activeLabel      = $label.filter('.' + className.active),\n                                    activeValue       = $activeLabel.data(metadata.value),\n                                    labelIndex        = $label.index($activeLabel),\n                                    labelCount        = $label.length,\n                                    hasActiveLabel    = $activeLabel.length > 0,\n                                    hasMultipleActive = $activeLabel.length > 1,\n                                    isFirstLabel      = labelIndex === 0,\n                                    isLastLabel       = labelIndex + 1 === labelCount,\n                                    isSearch          = module.is.searchSelection(),\n                                    isFocusedOnSearch = module.is.focusedOnSearch(),\n                                    isFocused         = module.is.focused(),\n                                    caretAtStart      = isFocusedOnSearch && module.get.caretPosition(false) === 0,\n                                    isSelectedSearch  = caretAtStart && module.get.caretPosition(true) !== 0\n                                ;\n                                if (isSearch && !hasActiveLabel && !isFocusedOnSearch) {\n                                    return;\n                                }\n\n                                switch (pressedKey) {\n                                    case keys.leftArrow: {\n                                        // activate previous label\n                                        if ((isFocused || caretAtStart) && !hasActiveLabel) {\n                                            module.verbose('Selecting previous label');\n                                            $label.last().addClass(className.active);\n                                        } else if (hasActiveLabel) {\n                                            if (!event.shiftKey) {\n                                                module.verbose('Selecting previous label');\n                                                $label.removeClass(className.active);\n                                            } else {\n                                                module.verbose('Adding previous label to selection');\n                                            }\n                                            if (isFirstLabel && !hasMultipleActive) {\n                                                $activeLabel.addClass(className.active);\n                                            } else {\n                                                $activeLabel.prev(selector.siblingLabel)\n                                                    .addClass(className.active)\n                                                    .end()\n                                                ;\n                                            }\n                                            event.preventDefault();\n                                        }\n\n                                        break;\n                                    }\n                                    case keys.rightArrow: {\n                                        // activate first label\n                                        if (isFocused && !hasActiveLabel) {\n                                            $label.first().addClass(className.active);\n                                        }\n                                        // activate next label\n                                        if (hasActiveLabel) {\n                                            if (!event.shiftKey) {\n                                                module.verbose('Selecting next label');\n                                                $label.removeClass(className.active);\n                                            } else {\n                                                module.verbose('Adding next label to selection');\n                                            }\n                                            if (isLastLabel) {\n                                                if (isSearch) {\n                                                    if (!isFocusedOnSearch) {\n                                                        module.focusSearch();\n                                                    } else {\n                                                        $label.removeClass(className.active);\n                                                    }\n                                                } else if (hasMultipleActive) {\n                                                    $activeLabel.next(selector.siblingLabel).addClass(className.active);\n                                                } else {\n                                                    $activeLabel.addClass(className.active);\n                                                }\n                                            } else {\n                                                $activeLabel.next(selector.siblingLabel).addClass(className.active);\n                                            }\n                                            event.preventDefault();\n                                        }\n\n                                        break;\n                                    }\n                                    case keys.deleteKey:\n                                    case keys.backspace: {\n                                        if (hasActiveLabel) {\n                                            module.verbose('Removing active labels');\n                                            if (isLastLabel) {\n                                                if (isSearch && !isFocusedOnSearch) {\n                                                    module.focusSearch();\n                                                }\n                                            }\n                                            $activeLabel.last().next(selector.siblingLabel).addClass(className.active);\n                                            module.remove.activeLabels($activeLabel);\n                                            if (!module.is.visible()) {\n                                                module.show();\n                                            }\n                                            event.preventDefault();\n                                        } else if (caretAtStart && !isSelectedSearch && !hasActiveLabel && pressedKey === keys.backspace) {\n                                            module.verbose('Removing last label on input backspace');\n                                            $activeLabel = $label.last().addClass(className.active);\n                                            module.remove.activeLabels($activeLabel);\n                                            if (!module.is.visible()) {\n                                                module.show();\n                                            }\n                                        }\n\n                                        break;\n                                    }\n                                    default: {\n                                        $activeLabel.removeClass(className.active);\n                                    }\n                                }\n                            }\n                        },\n                    },\n\n                    keydown: function (event) {\n                        var\n                            pressedKey    = event.which,\n                            isShortcutKey = module.is.inObject(pressedKey, keys) || event.key === settings.delimiter\n                        ;\n                        if (isShortcutKey) {\n                            var\n                                $currentlySelected = $item.not(selector.unselectable).filter('.' + className.selected).eq(0),\n                                $activeItem        = $menu.children('.' + className.active).eq(0),\n                                $selectedItem      = $currentlySelected.length > 0\n                                    ? $currentlySelected\n                                    : $activeItem,\n                                $visibleItems = $selectedItem.length > 0\n                                    ? $selectedItem.siblings(':not(.' + className.filtered + ')').addBack()\n                                    : $menu.children(':not(.' + className.filtered + ')'),\n                                $subMenu              = $selectedItem.children(selector.menu),\n                                $parentMenu           = $selectedItem.closest(selector.menu),\n                                inVisibleMenu         = $parentMenu.hasClass(className.visible) || $parentMenu.hasClass(className.animating) || $parentMenu.parent(selector.menu).length > 0,\n                                hasSubMenu            = $subMenu.length > 0,\n                                hasSelectedItem       = $selectedItem.length > 0,\n                                selectedIsSelectable  = $selectedItem.not(selector.unselectable).length > 0,\n                                delimiterPressed      = event.key === settings.delimiter && module.is.multiple(),\n                                isAdditionWithoutMenu = settings.allowAdditions && (pressedKey === keys.enter || delimiterPressed),\n                                $nextItem,\n                                isSubMenuItem\n                            ;\n                            // allow selection with menu closed\n                            if (isAdditionWithoutMenu) {\n                                if (selectedIsSelectable && settings.hideAdditions) {\n                                    module.verbose('Selecting item from keyboard shortcut', $selectedItem);\n                                    module.event.item.click.call($selectedItem, event);\n                                }\n                                if (module.is.searchSelection() && !settings.keepSearchTerm) {\n                                    module.remove.searchTerm();\n                                }\n                                if (module.is.multiple()) {\n                                    event.preventDefault();\n                                }\n                            }\n\n                            // visible menu keyboard shortcuts\n                            if (module.is.visible()) {\n                                // enter (select or open sub-menu)\n                                if (pressedKey === keys.enter || delimiterPressed) {\n                                    if (pressedKey === keys.enter && hasSelectedItem && hasSubMenu && !settings.allowCategorySelection) {\n                                        module.verbose('Pressed enter on unselectable category, opening sub menu');\n                                        pressedKey = keys.rightArrow;\n                                    } else if (selectedIsSelectable) {\n                                        module.verbose('Selecting item from keyboard shortcut', $selectedItem);\n                                        module.event.item.click.call($selectedItem, event);\n                                        if (module.is.searchSelection()) {\n                                            if (!settings.keepSearchTerm) {\n                                                module.remove.searchTerm();\n                                            }\n                                            if (module.is.multiple()) {\n                                                $search.trigger('focus');\n                                            }\n                                        }\n                                    }\n                                    event.preventDefault();\n                                }\n\n                                // sub-menu actions\n                                if (hasSelectedItem) {\n                                    if (pressedKey === keys.leftArrow) {\n                                        isSubMenuItem = $parentMenu[0] !== $menu[0];\n\n                                        if (isSubMenuItem) {\n                                            module.verbose('Left key pressed, closing sub-menu');\n                                            module.animate.hide(false, $parentMenu);\n                                            $selectedItem\n                                                .removeClass(className.selected)\n                                            ;\n                                            $parentMenu\n                                                .closest(selector.item)\n                                                .addClass(className.selected)\n                                            ;\n                                            event.preventDefault();\n                                        }\n                                    }\n\n                                    // right arrow (show sub-menu)\n                                    if (pressedKey === keys.rightArrow) {\n                                        if (hasSubMenu) {\n                                            module.verbose('Right key pressed, opening sub-menu');\n                                            module.animate.show(false, $subMenu);\n                                            $selectedItem\n                                                .removeClass(className.selected)\n                                            ;\n                                            $subMenu\n                                                .find(selector.item).eq(0)\n                                                .addClass(className.selected)\n                                            ;\n                                            event.preventDefault();\n                                        }\n                                    }\n                                }\n\n                                // up arrow (traverse menu up)\n                                if (pressedKey === keys.upArrow) {\n                                    $nextItem = hasSelectedItem && inVisibleMenu\n                                        ? $selectedItem.prevAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)\n                                        : $item.eq(0);\n                                    if ($visibleItems.index($nextItem) < 0) {\n                                        module.verbose('Up key pressed but reached top of current menu');\n                                        event.preventDefault();\n\n                                        return;\n                                    }\n\n                                    module.verbose('Up key pressed, changing active item');\n                                    $selectedItem\n                                        .removeClass(className.selected)\n                                    ;\n                                    $nextItem\n                                        .addClass(className.selected)\n                                    ;\n                                    module.set.scrollPosition($nextItem);\n                                    if (settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {\n                                        module.set.selectedItem($nextItem);\n                                    }\n\n                                    event.preventDefault();\n                                }\n\n                                // down arrow (traverse menu down)\n                                if (pressedKey === keys.downArrow) {\n                                    $nextItem = hasSelectedItem && inVisibleMenu\n                                        ? $selectedItem.nextAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)\n                                        : $item.eq(0);\n                                    if ($nextItem.length === 0) {\n                                        module.verbose('Down key pressed but reached bottom of current menu');\n                                        event.preventDefault();\n\n                                        return;\n                                    }\n\n                                    module.verbose('Down key pressed, changing active item');\n                                    $item\n                                        .removeClass(className.selected)\n                                    ;\n                                    $nextItem\n                                        .addClass(className.selected)\n                                    ;\n                                    module.set.scrollPosition($nextItem);\n                                    if (settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {\n                                        module.set.selectedItem($nextItem);\n                                    }\n\n                                    event.preventDefault();\n                                }\n\n                                // page down (show next page)\n                                if (pressedKey === keys.pageUp) {\n                                    module.scrollPage('up');\n                                    event.preventDefault();\n                                }\n                                if (pressedKey === keys.pageDown) {\n                                    module.scrollPage('down');\n                                    event.preventDefault();\n                                }\n\n                                // escape (close menu)\n                                if (pressedKey === keys.escape) {\n                                    module.verbose('Escape key pressed, closing dropdown');\n                                    module.hide();\n                                    event.stopPropagation();\n                                }\n                            } else {\n                                // delimiter key\n                                if (pressedKey === keys.enter || delimiterPressed) {\n                                    event.preventDefault();\n                                }\n                                // down arrow (open menu)\n                                if (pressedKey === keys.downArrow && !module.is.visible()) {\n                                    module.verbose('Down key pressed, showing dropdown');\n                                    module.show();\n                                    event.preventDefault();\n                                }\n                            }\n                        } else {\n                            if (!module.has.search()) {\n                                module.set.selectedLetter(String.fromCharCode(pressedKey));\n                            }\n                        }\n                    },\n                },\n\n                trigger: {\n                    change: function () {\n                        var\n                            inputElement = $input[0]\n                        ;\n                        if (inputElement) {\n                            var events = document.createEvent('HTMLEvents');\n                            module.verbose('Triggering native change event');\n                            events.initEvent('change', true, false);\n                            inputElement.dispatchEvent(events);\n                        }\n                    },\n                },\n\n                determine: {\n                    selectAction: function (text, value) {\n                        selectActionActive = true;\n                        module.verbose('Determining action', settings.action);\n                        if (isFunction(module.action[settings.action])) {\n                            module.verbose('Triggering preset action', settings.action, text, value);\n                            module.action[settings.action].call(element, text, value, this);\n                        } else if (isFunction(settings.action)) {\n                            module.verbose('Triggering user action', settings.action, text, value);\n                            settings.action.call(element, text, value, this);\n                        } else {\n                            module.error(error.action, settings.action);\n                        }\n                        selectActionActive = false;\n                    },\n                    eventInModule: function (event, callback) {\n                        var\n                            $target    = $(event.target),\n                            inDocument = $target.closest(document.documentElement).length > 0,\n                            inModule   = $target.closest($module).length > 0\n                        ;\n                        callback = isFunction(callback)\n                            ? callback\n                            : function () {};\n                        if (inDocument && !inModule) {\n                            module.verbose('Triggering event', callback);\n                            callback();\n\n                            return true;\n                        }\n\n                        module.verbose('Event occurred in dropdown, canceling callback');\n\n                        return false;\n                    },\n                    eventOnElement: function (event, callback) {\n                        var\n                            $target      = $(event.target),\n                            $label       = $target.closest(selector.siblingLabel),\n                            inVisibleDOM = document.body.contains(event.target),\n                            notOnLabel   = $module.find($label).length === 0 || !(module.is.multiple() && settings.useLabels),\n                            notInMenu    = $target.closest($menu).length === 0\n                        ;\n                        callback = isFunction(callback)\n                            ? callback\n                            : function () {};\n                        if (inVisibleDOM && notOnLabel && notInMenu) {\n                            module.verbose('Triggering event', callback);\n                            callback();\n\n                            return true;\n                        }\n\n                        module.verbose('Event occurred in dropdown menu, canceling callback');\n\n                        return false;\n                    },\n                },\n\n                action: {\n\n                    nothing: function () {},\n\n                    activate: function (text, value, element) {\n                        value = value !== undefined\n                            ? value\n                            : text;\n                        if (module.can.activate($(element))) {\n                            module.set.selected(value, $(element), false, settings.keepSearchTerm);\n                            if (!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {\n                                module.hideAndClear();\n                            }\n                        }\n                    },\n\n                    select: function (text, value, element) {\n                        value = value !== undefined\n                            ? value\n                            : text;\n                        if (module.can.activate($(element))) {\n                            module.set.value(value, text, $(element));\n                            if (!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {\n                                module.hideAndClear();\n                            }\n                        }\n                    },\n\n                    combo: function (text, value, element) {\n                        value = value !== undefined\n                            ? value\n                            : text;\n                        module.set.selected(value, $(element));\n                        module.hideAndClear();\n                    },\n\n                    hide: function (text, value, element) {\n                        module.set.value(value, text, $(element));\n                        module.hideAndClear();\n                    },\n\n                },\n\n                get: {\n                    id: function () {\n                        return id;\n                    },\n                    defaultText: function () {\n                        return $module.data(metadata.defaultText);\n                    },\n                    defaultValue: function () {\n                        return $module.data(metadata.defaultValue);\n                    },\n                    placeholderText: function () {\n                        if (settings.placeholder !== 'auto' && typeof settings.placeholder === 'string') {\n                            return settings.placeholder;\n                        }\n\n                        return $module.data(metadata.placeholderText) || '';\n                    },\n                    text: function () {\n                        return settings.preserveHTML ? $text.html() : $text.text();\n                    },\n                    query: function () {\n                        return String($search.val()).trim();\n                    },\n                    searchWidth: function (value) {\n                        value = value !== undefined\n                            ? value\n                            : $search.val();\n                        $sizer.text(value);\n\n                        // prevent rounding issues\n                        return Math.ceil($sizer.width() + (module.is.edge() ? 3 : 1));\n                    },\n                    selectionCount: function () {\n                        var\n                            values = module.get.values(),\n                            count\n                        ;\n                        count = module.is.multiple()\n                            ? (Array.isArray(values) ? values.length : 0)\n                            : (module.get.value() !== '' ? 1 : 0);\n\n                        return count;\n                    },\n                    transition: function ($subMenu) {\n                        return settings.transition === 'auto'\n                            ? (module.is.upward($subMenu) ? 'slide up' : 'slide down')\n                            : settings.transition;\n                    },\n                    userValues: function () {\n                        var\n                            values = module.get.values(true)\n                        ;\n                        if (!values) {\n                            return false;\n                        }\n                        values = Array.isArray(values)\n                            ? values\n                            : [values];\n\n                        return $.grep(values, function (value) {\n                            return module.get.item(value) === false;\n                        });\n                    },\n                    uniqueArray: function (array) {\n                        return $.grep(array, function (value, index) {\n                            return $.inArray(value, array) === index;\n                        });\n                    },\n                    caretPosition: function (returnEndPos) {\n                        var\n                            input = $search[0],\n                            range,\n                            rangeLength\n                        ;\n                        if (returnEndPos && 'selectionEnd' in input) {\n                            return input.selectionEnd;\n                        }\n                        if (!returnEndPos && 'selectionStart' in input) {\n                            return input.selectionStart;\n                        }\n                        if (document.selection) {\n                            input.focus();\n                            range = document.selection.createRange();\n                            rangeLength = range.text.length;\n                            if (returnEndPos) {\n                                return rangeLength;\n                            }\n                            range.moveStart('character', -input.value.length);\n\n                            return range.text.length - rangeLength;\n                        }\n                    },\n                    value: function () {\n                        var\n                            value = $input.length > 0\n                                ? $input.val()\n                                : $module.data(metadata.value),\n                            isEmptyMultiselect = Array.isArray(value) && value.length === 1 && value[0] === ''\n                        ;\n\n                        // prevents placeholder element from being selected when multiple\n                        return value === undefined || isEmptyMultiselect\n                            ? ''\n                            : value;\n                    },\n                    values: function (raw) {\n                        var\n                            value = module.get.value()\n                        ;\n                        if (value === '') {\n                            return '';\n                        }\n\n                        return !module.has.selectInput() && module.is.multiple()\n                            ? (typeof value === 'string' // delimited string\n                                ? (raw\n                                    ? value\n                                    : module.escape.htmlEntities(value)).split(settings.delimiter)\n                                : '')\n                            : value;\n                    },\n                    remoteValues: function () {\n                        var\n                            values = module.get.values(),\n                            remoteValues = false\n                        ;\n                        if (values) {\n                            if (typeof values === 'string') {\n                                values = [values];\n                            }\n                            $.each(values, function (index, value) {\n                                var\n                                    name = module.read.remoteData(value)\n                                ;\n                                module.verbose('Restoring value from session data', name, value);\n                                if (name) {\n                                    if (!remoteValues) {\n                                        remoteValues = {};\n                                    }\n                                    remoteValues[value] = name;\n                                }\n                            });\n                        }\n\n                        return remoteValues;\n                    },\n                    choiceText: function ($choice, preserveHTML) {\n                        preserveHTML = preserveHTML !== undefined\n                            ? preserveHTML\n                            : settings.preserveHTML;\n                        if ($choice) {\n                            if ($choice.find(selector.menu).length > 0) {\n                                module.verbose('Retrieving text of element with sub-menu');\n                                $choice = $choice.clone();\n                                $choice.find(selector.menu).remove();\n                                $choice.find(selector.menuIcon).remove();\n                            }\n\n                            return $choice.data(metadata.text) !== undefined\n                                ? $choice.data(metadata.text)\n                                : (preserveHTML\n                                    ? $choice.html() && $choice.html().trim()\n                                    : $choice.text() && $choice.text().trim());\n                        }\n                    },\n                    choiceValue: function ($choice, choiceText) {\n                        choiceText = choiceText || module.get.choiceText($choice);\n                        if (!$choice) {\n                            return false;\n                        }\n\n                        return $choice.data(metadata.value) !== undefined\n                            ? String($choice.data(metadata.value))\n                            : (typeof choiceText === 'string'\n                                ? String(\n                                    settings.ignoreSearchCase\n                                        ? choiceText.toLowerCase()\n                                        : choiceText\n                                ).trim()\n                                : String(choiceText));\n                    },\n                    inputEvent: function () {\n                        var\n                            input = $search[0]\n                        ;\n                        if (input) {\n                            return input.oninput !== undefined\n                                ? 'input'\n                                : (input.onpropertychange !== undefined\n                                    ? 'propertychange'\n                                    : 'keyup');\n                        }\n\n                        return false;\n                    },\n                    selectValues: function () {\n                        var\n                            select = {},\n                            oldGroup = [],\n                            values = []\n                        ;\n                        $module\n                            .find('option')\n                            .each(function () {\n                                var\n                                    $option  = $(this),\n                                    name     = $option.html(),\n                                    disabled = $option.attr('disabled'),\n                                    value    = $option.attr('value') !== undefined\n                                        ? $option.attr('value')\n                                        : name,\n                                    text     = $option.data(metadata.text) !== undefined\n                                        ? $option.data(metadata.text)\n                                        : name,\n                                    group = $option.parent('optgroup')\n                                ;\n                                if (settings.placeholder === 'auto' && value === '') {\n                                    select.placeholder = name;\n                                } else {\n                                    if (group.length !== oldGroup.length || group[0] !== oldGroup[0]) {\n                                        values.push({\n                                            type: 'header',\n                                            divider: settings.headerDivider,\n                                            name: group.attr('label') || '',\n                                        });\n                                        oldGroup = group;\n                                    }\n                                    values.push({\n                                        name: name,\n                                        value: value,\n                                        text: module.escape.htmlEntities(text, true),\n                                        disabled: disabled,\n                                    });\n                                }\n                            })\n                        ;\n                        if (settings.placeholder && settings.placeholder !== 'auto') {\n                            module.debug('Setting placeholder value to', settings.placeholder);\n                            select.placeholder = settings.placeholder;\n                        }\n                        if (settings.sortSelect) {\n                            if (settings.sortSelect === true) {\n                                values.sort(function (a, b) {\n                                    return a.name.localeCompare(b.name);\n                                });\n                            } else if (settings.sortSelect === 'natural') {\n                                values.sort(function (a, b) {\n                                    return a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n                                });\n                            } else if (isFunction(settings.sortSelect)) {\n                                values.sort(settings.sortSelect);\n                            }\n                            select[fields.values] = values;\n                            module.debug('Retrieved and sorted values from select', select);\n                        } else {\n                            select[fields.values] = values;\n                            module.debug('Retrieved values from select', select);\n                        }\n\n                        return select;\n                    },\n                    activeItem: function () {\n                        return $item.filter('.' + className.active);\n                    },\n                    selectedItem: function () {\n                        var\n                            $selectedItem = $item.not(selector.unselectable).filter('.' + className.selected)\n                        ;\n\n                        return $selectedItem.length > 0\n                            ? $selectedItem\n                            : $item.eq(0);\n                    },\n                    itemWithAdditions: function (value) {\n                        var\n                            $items       = module.get.item(value),\n                            $userItems   = module.create.userChoice(value),\n                            hasUserItems = $userItems && $userItems.length > 0\n                        ;\n                        if (hasUserItems) {\n                            $items = $items.length > 0\n                                ? $items.add($userItems)\n                                : $userItems;\n                        }\n\n                        return $items;\n                    },\n                    item: function (value, strict) {\n                        var\n                            $selectedItem = false,\n                            shouldSearch,\n                            isMultiple\n                        ;\n                        value = value !== undefined\n                            ? value\n                            : (module.get.values() !== undefined\n                                ? module.get.values()\n                                : module.get.text());\n                        isMultiple = module.is.multiple() && Array.isArray(value);\n                        shouldSearch = isMultiple\n                            ? value.length > 0\n                            : value !== undefined && value !== null;\n                        strict = value === '' || value === false || value === true\n                            ? true\n                            : strict || false;\n                        if (shouldSearch) {\n                            $item\n                                .each(function () {\n                                    var\n                                        $choice       = $(this),\n                                        optionText    = module.get.choiceText($choice),\n                                        optionValue   = module.get.choiceValue($choice, optionText)\n                                    ;\n                                    // safe early exit\n                                    if (optionValue === null || optionValue === undefined) {\n                                        return;\n                                    }\n                                    if (isMultiple) {\n                                        if ($.inArray(module.escape.htmlEntities(String(optionValue)), value.map(String).map(module.escape.htmlEntities)) !== -1) {\n                                            $selectedItem = $selectedItem\n                                                ? $selectedItem.add($choice)\n                                                : $choice;\n                                        }\n                                    } else if (strict) {\n                                        module.verbose('Ambiguous dropdown value using strict type check', $choice, value);\n                                        if (optionValue === value) {\n                                            $selectedItem = $choice;\n\n                                            return true;\n                                        }\n                                    } else {\n                                        if (settings.ignoreCase) {\n                                            optionValue = optionValue.toLowerCase();\n                                            value = value.toLowerCase();\n                                        }\n                                        if (module.escape.htmlEntities(String(optionValue)) === module.escape.htmlEntities(String(value))) {\n                                            module.verbose('Found select item by value', optionValue, value);\n                                            $selectedItem = $choice;\n\n                                            return true;\n                                        }\n                                    }\n                                })\n                            ;\n                        }\n\n                        return $selectedItem;\n                    },\n                    displayType: function () {\n                        return $module.hasClass('column') ? 'flex' : settings.displayType;\n                    },\n                },\n\n                check: {\n                    maxSelections: function (selectionCount) {\n                        if (settings.maxSelections) {\n                            selectionCount = selectionCount !== undefined\n                                ? selectionCount\n                                : module.get.selectionCount();\n                            if (selectionCount >= settings.maxSelections) {\n                                module.debug('Maximum selection count reached');\n                                if (settings.useLabels) {\n                                    $item.addClass(className.filtered);\n                                    module.add.message(message.maxSelections);\n                                }\n\n                                return true;\n                            }\n\n                            module.verbose('No longer at maximum selection count');\n                            module.remove.message();\n                            module.remove.filteredItem();\n                            if (module.is.searchSelection()) {\n                                module.filterItems();\n                            }\n\n                            return false;\n                        }\n\n                        return false;\n                    },\n                    disabled: function () {\n                        $search.attr('tabindex', module.is.disabled() ? -1 : 0);\n                    },\n                },\n\n                restore: {\n                    defaults: function (preventChangeTrigger) {\n                        module.clear(preventChangeTrigger);\n                        module.restore.defaultText();\n                        module.restore.defaultValue();\n                    },\n                    defaultText: function () {\n                        var\n                            defaultText     = module.get.defaultText(),\n                            placeholderText = module.get.placeholderText\n                        ;\n                        if (defaultText === placeholderText) {\n                            module.debug('Restoring default placeholder text', defaultText);\n                            module.set.placeholderText(defaultText);\n                        } else {\n                            module.debug('Restoring default text', defaultText);\n                            module.set.text(defaultText);\n                        }\n                    },\n                    placeholderText: function () {\n                        module.set.placeholderText();\n                    },\n                    defaultValue: function () {\n                        var\n                            defaultValue = module.get.defaultValue()\n                        ;\n                        if (defaultValue !== undefined) {\n                            module.debug('Restoring default value', defaultValue);\n                            if (defaultValue !== '') {\n                                module.set.value(defaultValue);\n                                module.set.selected();\n                            } else {\n                                module.remove.activeItem();\n                                module.remove.selectedItem();\n                            }\n                        }\n                    },\n                    labels: function () {\n                        if (settings.allowAdditions) {\n                            if (!settings.useLabels) {\n                                module.error(error.labels);\n                                settings.useLabels = true;\n                            }\n                            module.debug('Restoring selected values');\n                            module.create.userLabels();\n                        }\n                        module.check.maxSelections();\n                    },\n                    selected: function () {\n                        module.restore.values();\n                        if (module.is.multiple()) {\n                            module.debug('Restoring previously selected values and labels');\n                            module.restore.labels();\n                        } else {\n                            module.debug('Restoring previously selected values');\n                        }\n                    },\n                    values: function () {\n                        // prevents callbacks from occurring on initial load\n                        module.set.initialLoad();\n                        if (settings.apiSettings && settings.saveRemoteData && module.get.remoteValues()) {\n                            module.restore.remoteValues();\n                        } else {\n                            module.set.selected();\n                        }\n                        var value = module.get.value();\n                        if (value && value !== '' && !(Array.isArray(value) && value.length === 0)) {\n                            $input.removeClass(className.noselection);\n                        } else {\n                            $input.addClass(className.noselection);\n                        }\n                        module.remove.initialLoad();\n                    },\n                    remoteValues: function () {\n                        var\n                            values = module.get.remoteValues()\n                        ;\n                        module.debug('Recreating selected from session data', values);\n                        if (values) {\n                            if (module.is.single()) {\n                                $.each(values, function (value, name) {\n                                    module.set.text(name);\n                                });\n                            } else if (settings.useLabels) {\n                                $.each(values, function (value, name) {\n                                    module.add.label(value, name);\n                                });\n                            }\n                        }\n                    },\n                },\n\n                read: {\n                    remoteData: function (value) {\n                        var\n                            name\n                        ;\n                        if (window.Storage === undefined) {\n                            module.error(error.noStorage);\n\n                            return;\n                        }\n                        name = sessionStorage.getItem(value + elementNamespace);\n\n                        return name !== undefined\n                            ? name\n                            : false;\n                    },\n                },\n\n                save: {\n                    defaults: function () {\n                        module.save.defaultText();\n                        module.save.placeholderText();\n                        module.save.defaultValue();\n                    },\n                    defaultValue: function () {\n                        var\n                            value = module.get.value()\n                        ;\n                        module.verbose('Saving default value as', value);\n                        $module.data(metadata.defaultValue, value);\n                    },\n                    defaultText: function () {\n                        var\n                            text = module.get.text()\n                        ;\n                        module.verbose('Saving default text as', text);\n                        $module.data(metadata.defaultText, text);\n                    },\n                    placeholderText: function () {\n                        var\n                            text\n                        ;\n                        if (settings.placeholder !== false && $text.hasClass(className.placeholder)) {\n                            text = module.get.text();\n                            module.verbose('Saving placeholder text as', text);\n                            $module.data(metadata.placeholderText, text);\n                        }\n                    },\n                    remoteData: function (name, value) {\n                        if (window.Storage === undefined) {\n                            module.error(error.noStorage);\n\n                            return;\n                        }\n                        module.verbose('Saving remote data to session storage', value, name);\n                        sessionStorage.setItem(value + elementNamespace, name);\n                    },\n                },\n\n                clear: function (preventChangeTrigger) {\n                    if (module.is.multiple() && settings.useLabels) {\n                        module.remove.labels($module.find(selector.label), preventChangeTrigger);\n                    } else {\n                        module.remove.activeItem();\n                        module.remove.selectedItem();\n                        module.remove.filteredItem();\n                    }\n                    module.set.placeholderText();\n                    module.clearValue(preventChangeTrigger);\n                },\n\n                clearValue: function (preventChangeTrigger) {\n                    module.set.value('', null, null, preventChangeTrigger);\n                },\n\n                clearCache: function () {\n                    module.debug('Clearing API cache once');\n                    tempDisableApiCache = true;\n                },\n\n                scrollPage: function (direction, $selectedItem) {\n                    var\n                        $currentItem  = $selectedItem || module.get.selectedItem(),\n                        $menu         = $currentItem.closest(selector.menu),\n                        menuHeight    = $menu.outerHeight(),\n                        currentScroll = $menu.scrollTop(),\n                        itemHeight    = $item.eq(0).outerHeight(),\n                        itemsPerPage  = Math.floor(menuHeight / itemHeight),\n                        newScroll     = direction === 'up'\n                            ? currentScroll - (itemHeight * itemsPerPage)\n                            : currentScroll + (itemHeight * itemsPerPage),\n                        $selectableItem = $item.not(selector.unselectable),\n                        isWithinRange,\n                        $nextSelectedItem,\n                        elementIndex\n                    ;\n                    elementIndex = direction === 'up'\n                        ? $selectableItem.index($currentItem) - itemsPerPage\n                        : $selectableItem.index($currentItem) + itemsPerPage;\n                    isWithinRange = direction === 'up'\n                        ? elementIndex >= 0\n                        : elementIndex < $selectableItem.length;\n                    $nextSelectedItem = isWithinRange\n                        ? $selectableItem.eq(elementIndex)\n                        : (direction === 'up'\n                            ? $selectableItem.first()\n                            : $selectableItem.last());\n                    if ($nextSelectedItem.length > 0) {\n                        module.debug('Scrolling page', direction, $nextSelectedItem);\n                        $currentItem\n                            .removeClass(className.selected)\n                        ;\n                        $nextSelectedItem\n                            .addClass(className.selected)\n                        ;\n                        if (settings.selectOnKeydown && module.is.single() && !$nextSelectedItem.hasClass(className.actionable)) {\n                            module.set.selectedItem($nextSelectedItem);\n                        }\n                        $menu\n                            .scrollTop(newScroll)\n                        ;\n                    }\n                },\n\n                set: {\n                    filtered: function () {\n                        var\n                            isMultiple       = module.is.multiple(),\n                            isSearch         = module.is.searchSelection(),\n                            isSearchMultiple = isMultiple && isSearch,\n                            searchValue      = isSearch\n                                ? module.get.query()\n                                : '',\n                            hasSearchValue   = typeof searchValue === 'string' && searchValue.length > 0,\n                            searchWidth      = module.get.searchWidth(),\n                            valueIsSet       = searchValue !== ''\n                        ;\n                        if (isMultiple && hasSearchValue) {\n                            module.verbose('Adjusting input width', searchWidth);\n                            $search.css('width', searchWidth + 'px');\n                        }\n                        if (hasSearchValue || (isSearchMultiple && valueIsSet)) {\n                            module.verbose('Hiding placeholder text');\n                            $text.addClass(className.filtered);\n                        } else if (!isMultiple || (isSearchMultiple && !valueIsSet)) {\n                            module.verbose('Showing placeholder text');\n                            $text.removeClass(className.filtered);\n                        }\n                    },\n                    empty: function () {\n                        $module.addClass(className.empty);\n                    },\n                    loading: function () {\n                        $module.addClass(className.loading);\n                    },\n                    placeholderText: function (text) {\n                        text = text || module.get.placeholderText();\n                        module.debug('Setting placeholder text', text);\n                        module.set.text(text);\n                        $text.addClass(className.placeholder);\n                    },\n                    tabbable: function () {\n                        if (module.is.searchSelection()) {\n                            module.debug('Added tabindex to searchable dropdown');\n                            $search\n                                .val('')\n                            ;\n                            module.check.disabled();\n                            $menu\n                                .attr('tabindex', -1)\n                            ;\n                        } else {\n                            module.debug('Added tabindex to dropdown');\n                            if ($module.attr('tabindex') === undefined) {\n                                $module\n                                    .attr('tabindex', $input.attr('tabindex') || 0)\n                                ;\n                                $menu\n                                    .attr('tabindex', -1)\n                                ;\n                            }\n                        }\n                        $input.removeAttr('tabindex');\n                    },\n                    initialLoad: function () {\n                        module.verbose('Setting initial load');\n                        initialLoad = true;\n                    },\n                    activeItem: function ($item) {\n                        if (settings.allowAdditions && $item.filter(selector.addition).length > 0) {\n                            $item.addClass(className.filtered);\n                        } else {\n                            $item.addClass(className.active);\n                        }\n                    },\n                    partialSearch: function (text) {\n                        var\n                            length = module.get.query().length\n                        ;\n                        $search.val(text.slice(0, length));\n                    },\n                    scrollPosition: function ($item, forceScroll) {\n                        var\n                            edgeTolerance = 5,\n                            $menu,\n                            hasActive,\n                            offset,\n                            itemOffset,\n                            menuOffset,\n                            menuScroll,\n                            menuHeight,\n                            abovePage,\n                            belowPage\n                        ;\n\n                        $item = $item || module.get.selectedItem();\n                        $menu = $item.closest(selector.menu);\n                        hasActive = $item && $item.length > 0;\n                        forceScroll = forceScroll !== undefined\n                            ? forceScroll\n                            : false;\n                        if (module.get.activeItem().length === 0) {\n                            forceScroll = false;\n                        }\n                        if ($item && $menu.length > 0 && hasActive) {\n                            itemOffset = $item.position().top;\n\n                            $menu.addClass(className.loading);\n                            menuScroll = $menu.scrollTop();\n                            menuOffset = $menu.offset().top;\n                            itemOffset = $item.offset().top;\n                            offset = menuScroll - menuOffset + itemOffset;\n                            if (!forceScroll) {\n                                menuHeight = $menu.height();\n                                belowPage = menuScroll + menuHeight < (offset + edgeTolerance);\n                                abovePage = (offset - edgeTolerance) < menuScroll;\n                            }\n                            module.debug('Scrolling to active item', offset);\n                            if (forceScroll || abovePage || belowPage) {\n                                $menu.scrollTop(offset);\n                            }\n                            $menu.removeClass(className.loading);\n                        }\n                    },\n                    text: function (text, isNotPlaceholder) {\n                        if (settings.action === 'combo') {\n                            module.debug('Changing combo button text', text, $combo);\n                            if (settings.preserveHTML) {\n                                $combo.html(text);\n                            } else {\n                                $combo.text(text);\n                            }\n                        } else if (settings.action === 'activate' || isFunction(settings.action)) {\n                            if (text !== module.get.placeholderText() || isNotPlaceholder) {\n                                $text.removeClass(className.placeholder);\n                            }\n                            module.debug('Changing text', text, $text);\n                            $text\n                                .removeClass(className.filtered)\n                            ;\n                            if (settings.preserveHTML) {\n                                $text.html(text);\n                            } else {\n                                $text.text(text);\n                            }\n                        }\n                    },\n                    selectedItem: function ($item) {\n                        var\n                            value      = module.get.choiceValue($item),\n                            searchText = module.get.choiceText($item, false),\n                            text       = module.get.choiceText($item)\n                        ;\n                        module.debug('Setting user selection to item', $item);\n                        module.remove.activeItem();\n                        module.set.partialSearch(searchText);\n                        module.set.activeItem($item);\n                        module.set.selected(value, $item);\n                        module.set.text(text);\n                    },\n                    selectedLetter: function (letter) {\n                        var\n                            $selectedItem         = $item.filter('.' + className.selected),\n                            alreadySelectedLetter = $selectedItem.length > 0 && module.has.firstLetter($selectedItem, letter),\n                            $nextValue            = false,\n                            $nextItem\n                        ;\n                        // check next of same letter\n                        if (alreadySelectedLetter) {\n                            $nextItem = $selectedItem.nextAll($item).eq(0);\n                            if (module.has.firstLetter($nextItem, letter)) {\n                                $nextValue = $nextItem;\n                            }\n                        }\n                        // check all values\n                        if (!$nextValue) {\n                            $item\n                                .each(function () {\n                                    if (module.has.firstLetter($(this), letter)) {\n                                        $nextValue = $(this);\n\n                                        return false;\n                                    }\n                                })\n                            ;\n                        }\n                        // set next value\n                        if ($nextValue) {\n                            module.verbose('Scrolling to next value with letter', letter);\n                            module.set.scrollPosition($nextValue);\n                            $selectedItem.removeClass(className.selected);\n                            $nextValue.addClass(className.selected);\n                            if (settings.selectOnKeydown && module.is.single() && (!$nextItem || !$nextItem.hasClass(className.actionable))) {\n                                module.set.selectedItem($nextValue);\n                            }\n                        }\n                    },\n                    direction: function ($menu) {\n                        if (settings.direction === 'auto') {\n                            // reset position, remove upward if it's base menu\n                            if (!$menu) {\n                                module.remove.upward();\n                            } else if (module.is.upward($menu)) {\n                                // we need make sure when make assertion openDownward for $menu, $menu does not have upward class\n                                module.remove.upward($menu);\n                            }\n\n                            if (module.can.openDownward($menu)) {\n                                module.remove.upward($menu);\n                            } else {\n                                module.set.upward($menu);\n                            }\n                            if (!module.is.leftward($menu) && !module.can.openRightward($menu)) {\n                                module.set.leftward($menu);\n                            }\n                        } else if (settings.direction === 'upward') {\n                            module.set.upward($menu);\n                        }\n                    },\n                    upward: function ($currentMenu) {\n                        var $element = $currentMenu || $module;\n                        $element.addClass(className.upward);\n                    },\n                    leftward: function ($currentMenu) {\n                        var $element = $currentMenu || $menu;\n                        $element.addClass(className.leftward);\n                    },\n                    value: function (value, text, $selected, preventChangeTrigger) {\n                        if (typeof text === 'boolean') {\n                            preventChangeTrigger = text;\n                            $selected = undefined;\n                            text = undefined;\n                        }\n                        if (value !== undefined && value !== '' && !(Array.isArray(value) && value.length === 0)) {\n                            $input.removeClass(className.noselection);\n                        } else {\n                            $input.addClass(className.noselection);\n                        }\n                        var\n                            escapedValue = module.escape.value(value),\n                            hasInput     = $input.length > 0,\n                            currentValue = module.get.values(),\n                            stringValue  = value !== undefined\n                                ? String(value)\n                                : value\n                        ;\n                        if (hasInput) {\n                            if (!settings.allowReselection && stringValue == currentValue) {\n                                module.verbose('Skipping value update already same value', value, currentValue);\n                                if (!module.is.initialLoad()) {\n                                    return;\n                                }\n                            }\n\n                            if (module.is.single() && module.has.selectInput() && module.can.extendSelect()) {\n                                module.debug('Adding user option', value);\n                                module.add.optionValue(value);\n                            }\n                            module.debug('Updating input value', escapedValue, currentValue);\n                            internalChange = true;\n                            $input\n                                .val(escapedValue)\n                            ;\n                            if (settings.fireOnInit === false && module.is.initialLoad()) {\n                                module.debug('Input native change event ignored on initial load');\n                            } else if (preventChangeTrigger !== true) {\n                                module.trigger.change();\n                            }\n                            internalChange = false;\n                        } else {\n                            module.verbose('Storing value in metadata', escapedValue, $input);\n                            if (escapedValue !== currentValue) {\n                                $module.data(metadata.value, stringValue);\n                            }\n                        }\n                        if (settings.fireOnInit === false && module.is.initialLoad()) {\n                            module.verbose('No callback on initial load', settings.onChange);\n                        } else if (preventChangeTrigger !== true) {\n                            settings.onChange.call(element, value, text, $selected);\n                        }\n                    },\n                    active: function () {\n                        $module\n                            .addClass(className.active)\n                        ;\n                    },\n                    multiple: function () {\n                        $module.addClass(className.multiple);\n                    },\n                    visible: function () {\n                        $module.addClass(className.visible);\n                    },\n                    exactly: function (value, $selectedItem, preventChangeTrigger) {\n                        if (typeof $selectedItem === 'boolean') {\n                            preventChangeTrigger = $selectedItem;\n                            $selectedItem = undefined;\n                        }\n                        module.debug('Setting selected to exact values');\n                        module.clear();\n                        module.set.selected(value, $selectedItem, preventChangeTrigger);\n                    },\n                    selected: function (value, $selectedItem, preventChangeTrigger, keepSearchTerm) {\n                        if (typeof $selectedItem === 'boolean') {\n                            keepSearchTerm = preventChangeTrigger;\n                            preventChangeTrigger = $selectedItem;\n                            $selectedItem = undefined;\n                        }\n                        var\n                            isMultiple = module.is.multiple()\n                        ;\n                        $selectedItem = settings.allowAdditions\n                            ? $selectedItem || module.get.itemWithAdditions(value)\n                            : $selectedItem || module.get.item(value);\n                        if (!$selectedItem && value !== undefined) {\n                            return false;\n                        }\n                        if (isMultiple) {\n                            if (!keepSearchTerm) {\n                                module.remove.searchWidth();\n                            }\n                            if (settings.useLabels) {\n                                module.remove.selectedItem();\n                                if (value === undefined) {\n                                    module.remove.labels($module.find(selector.label), true);\n                                }\n                            }\n                        } else {\n                            module.remove.activeItem();\n                            module.remove.selectedItem();\n                        }\n                        if (!$selectedItem) {\n                            return false;\n                        }\n                        module.debug('Setting selected menu item to', $selectedItem);\n                        // select each item\n                        $selectedItem\n                            .each(function () {\n                                var\n                                    $selected      = $(this),\n                                    selectedText   = module.get.choiceText($selected),\n                                    selectedValue  = module.get.choiceValue($selected, selectedText),\n\n                                    isFiltered     = $selected.hasClass(className.filtered),\n                                    isActive       = $selected.hasClass(className.active),\n                                    isActionable   = $selected.hasClass(className.actionable),\n                                    isUserValue    = $selected.hasClass(className.addition),\n                                    shouldAnimate  = isMultiple && $selectedItem && $selectedItem.length === 1\n                                ;\n                                if (isActionable) {\n                                    if ((!isMultiple || (!isActive || isUserValue)) && settings.apiSettings && settings.saveRemoteData) {\n                                        module.save.remoteData(selectedText, selectedValue);\n                                    }\n                                    settings.onActionable.call(element, selectedValue, selectedText, $selected);\n                                } else if (isMultiple) {\n                                    if (!isActive || isUserValue) {\n                                        if (settings.apiSettings && settings.saveRemoteData) {\n                                            module.save.remoteData(selectedText, selectedValue);\n                                        }\n                                        if (settings.useLabels) {\n                                            module.add.label(selectedValue, selectedText, shouldAnimate);\n                                            module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);\n                                            module.set.activeItem($selected);\n                                            module.filterActive();\n                                            module.select.nextAvailable($selectedItem);\n                                        } else {\n                                            module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);\n                                            module.set.text(module.add.variables(message.count));\n                                            module.set.activeItem($selected);\n                                        }\n                                    } else if (!isFiltered && (settings.useLabels || selectActionActive)) {\n                                        module.debug('Selected active value, removing label');\n                                        module.remove.selected(selectedValue);\n                                    }\n                                } else {\n                                    if (settings.apiSettings && settings.saveRemoteData) {\n                                        module.save.remoteData(selectedText, selectedValue);\n                                    }\n                                    if (!keepSearchTerm && !$selected.hasClass(className.actionable)) {\n                                        module.set.text(selectedText, true);\n                                    }\n                                    module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);\n                                    $selected\n                                        .addClass(className.active)\n                                        .addClass(className.selected)\n                                    ;\n                                }\n                            })\n                        ;\n                        if (!keepSearchTerm) {\n                            module.remove.searchTerm();\n                        }\n                        if (module.is.allFiltered()) {\n                            module.set.empty();\n                            module.hideMenu();\n                        }\n                    },\n                },\n\n                add: {\n                    label: function (value, text, shouldAnimate) {\n                        var\n                            $next  = module.is.searchSelection()\n                                ? $search\n                                : $text,\n                            escapedValue = module.escape.value(value),\n                            $label\n                        ;\n                        if (settings.ignoreCase) {\n                            escapedValue = escapedValue.toLowerCase();\n                        }\n                        $label = $('<a />')\n                            .addClass(className.label)\n                            .attr('data-' + metadata.value, escapedValue)\n                            .html(templates.label(escapedValue, text, settings.preserveHTML, settings.className))\n                        ;\n                        $label = settings.onLabelCreate.call($label, escapedValue, text);\n\n                        if (module.has.label(value)) {\n                            module.debug('User selection already exists, skipping', escapedValue);\n\n                            return;\n                        }\n                        if (settings.label.variation) {\n                            $label.addClass(settings.label.variation);\n                        }\n                        if (shouldAnimate === true && settings.label.transition) {\n                            module.debug('Animating in label', $label);\n                            $label\n                                .addClass(className.hidden)\n                                .insertBefore($next)\n                                .transition({\n                                    animation: settings.label.transition,\n                                    debug: settings.debug,\n                                    verbose: settings.verbose,\n                                    silent: settings.silent,\n                                    duration: settings.label.duration,\n                                })\n                            ;\n                        } else {\n                            module.debug('Adding selection label', $label);\n                            $label\n                                .insertBefore($next)\n                            ;\n                        }\n                    },\n                    message: function (message) {\n                        var\n                            $message = $menu.children(selector.message),\n                            html     = settings.templates.message(module.add.variables(message))\n                        ;\n                        if ($message.length > 0) {\n                            $message\n                                .html(html)\n                            ;\n                        } else {\n                            $('<div/>')\n                                .html(html)\n                                .addClass(className.message)\n                                .appendTo($menu)\n                            ;\n                        }\n                    },\n                    optionValue: function (value) {\n                        var\n                            escapedValue = module.escape.value(value),\n                            $option      = $input.find('option[value=\"' + module.escape.string(escapedValue) + '\"]'),\n                            hasOption    = $option.length > 0\n                        ;\n                        if (hasOption) {\n                            return;\n                        }\n                        // temporarily disconnect observer\n                        module.disconnect.selectObserver();\n                        if (module.is.single()) {\n                            module.verbose('Removing previous user addition');\n                            $input.find('option.' + className.addition).remove();\n                        }\n                        $('<option/>')\n                            .prop('value', escapedValue)\n                            .addClass(className.addition)\n                            .text(value)\n                            .appendTo($input)\n                        ;\n                        module.verbose('Adding user addition as an <option>', value);\n                        module.observe.select();\n                    },\n                    userSuggestion: function (value) {\n                        var\n                            $addition         = $menu.children(selector.addition),\n                            $existingItem     = module.get.item(value),\n                            alreadyHasValue   = $existingItem && $existingItem.not(selector.addition).length > 0,\n                            hasUserSuggestion = $addition.length > 0,\n                            html\n                        ;\n                        if (settings.useLabels && module.has.maxSelections()) {\n                            return;\n                        }\n                        if (value === '' || alreadyHasValue) {\n                            $addition.remove();\n\n                            return;\n                        }\n                        if (hasUserSuggestion) {\n                            $addition\n                                .data(metadata.value, value)\n                                .data(metadata.text, value)\n                                .attr('data-' + metadata.value, value)\n                                .attr('data-' + metadata.text, value)\n                                .removeClass(className.filtered)\n                            ;\n                            if (!settings.hideAdditions) {\n                                html = settings.templates.addition(module.add.variables(message.addResult, value));\n                                $addition\n                                    .html(html)\n                                ;\n                            }\n                            module.verbose('Replacing user suggestion with new value', $addition);\n                        } else {\n                            $addition = module.create.userChoice(value);\n                            $addition\n                                .prependTo($menu)\n                            ;\n                            module.verbose('Adding item choice to menu corresponding with user choice addition', $addition);\n                        }\n                        if (!settings.hideAdditions || module.is.allFiltered()) {\n                            $addition\n                                .addClass(className.selected)\n                                .siblings()\n                                .removeClass(className.selected)\n                            ;\n                        }\n                        module.refreshItems();\n                    },\n                    variables: function (message, term) {\n                        var\n                            hasCount    = message.search('{count}') !== -1,\n                            hasMaxCount = message.search('{maxCount}') !== -1,\n                            hasTerm     = message.search('{term}') !== -1,\n                            query\n                        ;\n                        module.verbose('Adding templated variables to message', message);\n                        if (hasCount) {\n                            message = message.replace('{count}', module.get.selectionCount());\n                        }\n                        if (hasMaxCount) {\n                            message = message.replace('{maxCount}', settings.maxSelections);\n                        }\n                        if (hasTerm) {\n                            query = term || module.get.query();\n                            message = message.replace('{term}', query);\n                        }\n\n                        return message;\n                    },\n                    value: function (addedValue, addedText, $selectedItem, preventChangeTrigger) {\n                        if (typeof addedText === 'boolean') {\n                            preventChangeTrigger = addedText;\n                            $selectedItem = undefined;\n                            addedText = undefined;\n                        }\n                        var\n                            currentValue = module.get.values(true),\n                            newValue\n                        ;\n                        if (module.has.value(addedValue)) {\n                            module.debug('Value already selected');\n\n                            return;\n                        }\n                        if (addedValue === '') {\n                            module.debug('Cannot select blank values from multiselect');\n\n                            return;\n                        }\n                        // extend current array\n                        if (Array.isArray(currentValue)) {\n                            newValue = $selectedItem && $selectedItem.hasClass(className.actionable) ? currentValue : currentValue.concat([addedValue]);\n                            newValue = module.get.uniqueArray(newValue);\n                        } else {\n                            newValue = [addedValue];\n                        }\n                        // add values\n                        if (module.has.selectInput()) {\n                            if (module.can.extendSelect()) {\n                                module.debug('Adding value to select', addedValue, newValue, $input);\n                                module.add.optionValue(addedValue);\n                            }\n                        } else {\n                            newValue = newValue.join(settings.delimiter);\n                            module.debug('Setting hidden input to delimited value', newValue, $input);\n                        }\n\n                        if (settings.fireOnInit === false && module.is.initialLoad()) {\n                            module.verbose('Skipping onadd callback on initial load', settings.onAdd);\n                        } else {\n                            settings.onAdd.call(element, addedValue, addedText, $selectedItem);\n                        }\n                        module.set.value(newValue, addedText, $selectedItem, preventChangeTrigger);\n                        module.check.maxSelections();\n                    },\n                },\n\n                remove: {\n                    active: function () {\n                        $module.removeClass(className.active);\n                    },\n                    activeLabel: function () {\n                        $module.find(selector.label).removeClass(className.active);\n                    },\n                    empty: function () {\n                        $module.removeClass(className.empty);\n                    },\n                    loading: function () {\n                        $module.removeClass(className.loading);\n                    },\n                    initialLoad: function () {\n                        initialLoad = false;\n                    },\n                    upward: function ($currentMenu) {\n                        var $element = $currentMenu || $module;\n                        $element.removeClass(className.upward);\n                    },\n                    leftward: function ($currentMenu) {\n                        var $element = $currentMenu || $menu;\n                        $element.removeClass(className.leftward);\n                    },\n                    visible: function () {\n                        $module.removeClass(className.visible);\n                    },\n                    activeItem: function () {\n                        $item.removeClass(className.active);\n                    },\n                    filteredItem: function () {\n                        if (settings.highlightMatches) {\n                            $.each($item, function (index, item) {\n                                var $markItem = $(item);\n                                $markItem.html($markItem.html().replace(/<\\/?mark>/g, ''));\n                            });\n                        }\n                        if (settings.useLabels && module.has.maxSelections()) {\n                            return;\n                        }\n                        if (settings.useLabels && module.is.multiple()) {\n                            $item.not('.' + className.active).removeClass(className.filtered);\n                        } else {\n                            $item.removeClass(className.filtered);\n                        }\n                        if (settings.hideDividers) {\n                            $divider.removeClass(className.hidden);\n                        }\n                        module.remove.empty();\n                    },\n                    optionValue: function (value) {\n                        var\n                            escapedValue = module.escape.value(value),\n                            $option      = $input.find('option[value=\"' + module.escape.string(escapedValue) + '\"]'),\n                            hasOption    = $option.length > 0\n                        ;\n                        if (!hasOption || !$option.hasClass(className.addition)) {\n                            return;\n                        }\n                        // temporarily disconnect observer\n                        module.disconnect.selectObserver();\n                        $option.remove();\n                        module.verbose('Removing user addition as an <option>', escapedValue);\n                        module.observe.select();\n                    },\n                    message: function () {\n                        $menu.children(selector.message).remove();\n                    },\n                    searchWidth: function () {\n                        $search.css('width', '');\n                    },\n                    searchTerm: function () {\n                        module.verbose('Cleared search term');\n                        $search.val('');\n                        module.set.filtered();\n                    },\n                    userAddition: function () {\n                        $item.filter(selector.addition).remove();\n                    },\n                    selected: function (value, $selectedItem, preventChangeTrigger) {\n                        $selectedItem = settings.allowAdditions\n                            ? $selectedItem || module.get.itemWithAdditions(value)\n                            : $selectedItem || module.get.item(value);\n\n                        if (!$selectedItem) {\n                            return false;\n                        }\n\n                        $selectedItem\n                            .each(function () {\n                                var\n                                    $selected     = $(this),\n                                    selectedText  = module.get.choiceText($selected),\n                                    selectedValue = module.get.choiceValue($selected, selectedText)\n                                ;\n                                if (module.is.multiple()) {\n                                    if (settings.useLabels) {\n                                        module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger);\n                                        module.remove.label(selectedValue);\n                                    } else {\n                                        module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger);\n                                        if (module.get.selectionCount() === 0) {\n                                            module.set.placeholderText();\n                                        } else {\n                                            module.set.text(module.add.variables(message.count));\n                                        }\n                                    }\n                                } else {\n                                    module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger);\n                                }\n                                $selected\n                                    .removeClass(className.filtered)\n                                    .removeClass(className.active)\n                                ;\n                                if (settings.useLabels) {\n                                    $selected.removeClass(className.selected);\n                                }\n                            })\n                        ;\n                    },\n                    selectedItem: function () {\n                        $item.removeClass(className.selected);\n                    },\n                    value: function (removedValue, removedText, $removedItem, preventChangeTrigger) {\n                        var\n                            values = module.get.values(true),\n                            newValue\n                        ;\n                        if (module.has.selectInput()) {\n                            module.verbose('Input is <select> removing selected option', removedValue);\n                            newValue = module.remove.arrayValue(removedValue, values);\n                            module.remove.optionValue(removedValue);\n                        } else {\n                            module.verbose('Removing from delimited values', removedValue);\n                            newValue = module.remove.arrayValue(removedValue, values);\n                            newValue = newValue.join(settings.delimiter);\n                        }\n                        if (settings.fireOnInit === false && module.is.initialLoad()) {\n                            module.verbose('No callback on initial load', settings.onRemove);\n                        } else {\n                            settings.onRemove.call(element, removedValue, removedText, $removedItem);\n                        }\n                        module.set.value(newValue, removedText, $removedItem, preventChangeTrigger);\n                        module.check.maxSelections();\n                    },\n                    arrayValue: function (removedValue, values) {\n                        if (!Array.isArray(values)) {\n                            values = [values];\n                        }\n                        values = $.grep(values, function (value) {\n                            return removedValue != value;\n                        });\n                        module.verbose('Removed value from delimited string', removedValue, values);\n\n                        return values;\n                    },\n                    label: function (value, shouldAnimate) {\n                        var\n                            escapedValue  = module.escape.value(value),\n                            $labels       = $module.find(selector.label),\n                            $removedLabel = $labels.filter('[data-' + metadata.value + '=\"' + module.escape.string(settings.ignoreCase ? escapedValue.toLowerCase() : escapedValue) + '\"]')\n                        ;\n                        module.verbose('Removing label', $removedLabel);\n                        $removedLabel.remove();\n                    },\n                    activeLabels: function ($activeLabels) {\n                        $activeLabels = $activeLabels || $module.find(selector.label).filter('.' + className.active);\n                        module.verbose('Removing active label selections', $activeLabels);\n                        module.remove.labels($activeLabels);\n                    },\n                    labels: function ($labels, preventChangeTrigger) {\n                        $labels = $labels || $module.find(selector.label);\n                        module.verbose('Removing labels', $labels);\n                        $labels\n                            .each(function () {\n                                var\n                                    $label      = $(this),\n                                    value       = $label.data(metadata.value),\n                                    stringValue = value !== undefined\n                                        ? String(value)\n                                        : value,\n                                    isUserValue = module.is.userValue(stringValue)\n                                ;\n                                if (settings.onLabelRemove.call($label, value) === false) {\n                                    module.debug('Label remove callback cancelled removal');\n\n                                    return;\n                                }\n                                module.remove.message();\n                                if (isUserValue) {\n                                    module.remove.value(stringValue, stringValue, module.get.item(stringValue), preventChangeTrigger);\n                                    module.remove.label(stringValue);\n                                } else {\n                                    // selected will also remove label\n                                    module.remove.selected(stringValue, false, preventChangeTrigger);\n                                }\n                            })\n                        ;\n                    },\n                    tabbable: function () {\n                        if (module.is.searchSelection()) {\n                            module.debug('Searchable dropdown initialized');\n                            $search\n                                .removeAttr('tabindex')\n                            ;\n                            $menu\n                                .removeAttr('tabindex')\n                            ;\n                        } else {\n                            module.debug('Simple selection dropdown initialized');\n                            $module\n                                .removeAttr('tabindex')\n                            ;\n                            $menu\n                                .removeAttr('tabindex')\n                            ;\n                        }\n                    },\n                    diacritics: function (text) {\n                        return settings.ignoreDiacritics ? text.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '') : text;\n                    },\n                },\n\n                has: {\n                    menuSearch: function () {\n                        return module.has.search() && $search.closest($menu).length > 0;\n                    },\n                    clearItem: function () {\n                        return $clear.length > 0;\n                    },\n                    search: function () {\n                        return $search.length > 0;\n                    },\n                    sizer: function () {\n                        return $sizer.length > 0;\n                    },\n                    selectInput: function () {\n                        return $input.is('select');\n                    },\n                    minCharacters: function (searchTerm) {\n                        if (settings.minCharacters && !iconClicked) {\n                            searchTerm = searchTerm !== undefined\n                                ? String(searchTerm)\n                                : String(module.get.query());\n\n                            return searchTerm.length >= settings.minCharacters;\n                        }\n                        iconClicked = false;\n\n                        return true;\n                    },\n                    firstLetter: function ($item, letter) {\n                        var\n                            text,\n                            firstLetter\n                        ;\n                        if (!$item || $item.length === 0 || typeof letter !== 'string') {\n                            return false;\n                        }\n                        text = module.get.choiceText($item, false);\n                        letter = letter.toLowerCase();\n                        firstLetter = String(text).charAt(0).toLowerCase();\n\n                        return letter == firstLetter;\n                    },\n                    input: function () {\n                        return $input.length > 0;\n                    },\n                    items: function () {\n                        return $item.length > 0;\n                    },\n                    menu: function () {\n                        return $menu.length > 0;\n                    },\n                    subMenu: function ($currentMenu) {\n                        return ($currentMenu || $menu).find(selector.menu).length > 0;\n                    },\n                    message: function () {\n                        return $menu.children(selector.message).length > 0;\n                    },\n                    label: function (value) {\n                        var\n                            escapedValue = module.escape.value(value),\n                            $labels      = $module.find(selector.label)\n                        ;\n                        if (settings.ignoreCase) {\n                            escapedValue = escapedValue.toLowerCase();\n                        }\n\n                        return $labels.filter('[data-' + metadata.value + '=\"' + module.escape.string(escapedValue) + '\"]').length > 0;\n                    },\n                    maxSelections: function () {\n                        return settings.maxSelections && module.get.selectionCount() >= settings.maxSelections;\n                    },\n                    allResultsFiltered: function () {\n                        var\n                            $normalResults = $item.not(selector.addition)\n                        ;\n\n                        return $normalResults.filter(selector.unselectable).length === $normalResults.length;\n                    },\n                    userSuggestion: function () {\n                        return $menu.children(selector.addition).length > 0;\n                    },\n                    query: function () {\n                        return module.get.query() !== '';\n                    },\n                    value: function (value) {\n                        return settings.ignoreCase\n                            ? module.has.valueIgnoringCase(value)\n                            : module.has.valueMatchingCase(value);\n                    },\n                    valueMatchingCase: function (value) {\n                        var\n                            values   = module.get.values(true),\n                            hasValue = Array.isArray(values)\n                                ? values && ($.inArray(value, values) !== -1)\n                                : values == value\n                        ;\n\n                        return !!hasValue;\n                    },\n                    valueIgnoringCase: function (value) {\n                        var\n                            values   = module.get.values(true),\n                            hasValue = false\n                        ;\n                        if (!Array.isArray(values)) {\n                            values = [values];\n                        }\n                        $.each(values, function (index, existingValue) {\n                            if (String(value).toLowerCase() === String(existingValue).toLowerCase()) {\n                                hasValue = true;\n\n                                return false;\n                            }\n                        });\n\n                        return hasValue;\n                    },\n                },\n\n                is: {\n                    active: function () {\n                        return $module.hasClass(className.active);\n                    },\n                    animatingInward: function () {\n                        return $menu.transition('is inward');\n                    },\n                    animatingOutward: function () {\n                        return $menu.transition('is outward');\n                    },\n                    bubbledLabelClick: function (event) {\n                        return $(event.target).is('select, input') && $module.closest('label').length > 0;\n                    },\n                    bubbledIconClick: function (event) {\n                        return $(event.target).closest($icon).length > 0;\n                    },\n                    edge: function () {\n                        return !!window.chrome && !!window.StyleMedia;\n                    },\n                    empty: function () {\n                        return $module.hasClass(className.empty);\n                    },\n                    chrome: function () {\n                        return !!window.chrome && !window.StyleMedia;\n                    },\n                    alreadySetup: function () {\n                        return $module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0;\n                    },\n                    animating: function ($subMenu) {\n                        return $subMenu\n                            ? $subMenu.transition && $subMenu.transition('is animating')\n                            : $menu.transition && $menu.transition('is animating');\n                    },\n                    leftward: function ($subMenu) {\n                        var $selectedMenu = $subMenu || $menu;\n\n                        return $selectedMenu.hasClass(className.leftward);\n                    },\n                    clearable: function () {\n                        var hasClearableClass = $module.hasClass(className.clearable);\n                        if (!hasClearableClass && settings.clearable) {\n                            $module.addClass(className.clearable);\n                        }\n\n                        return hasClearableClass || settings.clearable;\n                    },\n                    disabled: function () {\n                        return $module.hasClass(className.disabled);\n                    },\n                    focused: function () {\n                        return document.activeElement === $module[0];\n                    },\n                    focusedOnSearch: function () {\n                        return document.activeElement === $search[0];\n                    },\n                    allFiltered: function () {\n                        return (module.is.multiple() || module.has.search()) && !(!settings.hideAdditions && module.has.userSuggestion()) && !module.has.message() && module.has.allResultsFiltered();\n                    },\n                    hidden: function ($subMenu) {\n                        return !module.is.visible($subMenu);\n                    },\n                    initialLoad: function () {\n                        return initialLoad;\n                    },\n                    inObject: function (needle, object) {\n                        var\n                            found = false\n                        ;\n                        $.each(object, function (index, property) {\n                            if (property == needle) {\n                                found = true;\n\n                                return true;\n                            }\n                        });\n\n                        return found;\n                    },\n                    multiple: function () {\n                        return $module.hasClass(className.multiple);\n                    },\n                    remote: function () {\n                        return settings.apiSettings && module.can.useAPI();\n                    },\n                    noApiCache: function () {\n                        return tempDisableApiCache || (settings.apiSettings && !settings.apiSettings.cache);\n                    },\n                    single: function () {\n                        return !module.is.multiple();\n                    },\n                    selectMutation: function (mutations) {\n                        var\n                            selectChanged = false\n                        ;\n                        $.each(mutations, function (index, mutation) {\n                            if ($(mutation.target).is('option, optgroup') || $(mutation.addedNodes).is('select') || ($(mutation.target).is('select') && mutation.type !== 'attributes')) {\n                                selectChanged = true;\n\n                                return false;\n                            }\n                        });\n\n                        return selectChanged;\n                    },\n                    search: function () {\n                        return $module.hasClass(className.search);\n                    },\n                    searchSelection: function (deep) {\n                        return module.has.search() && (deep ? $search.parents(selector.dropdown) : $search.parent(selector.dropdown)).length === 1;\n                    },\n                    selection: function () {\n                        return $module.hasClass(className.selection);\n                    },\n                    userValue: function (value) {\n                        return $.inArray(value, module.get.userValues()) !== -1;\n                    },\n                    upward: function ($menu) {\n                        var $element = $menu || $module;\n\n                        return $element.hasClass(className.upward);\n                    },\n                    visible: function ($subMenu) {\n                        return $subMenu\n                            ? $subMenu.hasClass(className.visible)\n                            : $menu.hasClass(className.visible);\n                    },\n                    verticallyScrollableContext: function () {\n                        var\n                            overflowY = $context[0] !== window\n                                ? $context.css('overflow-y')\n                                : false\n                        ;\n\n                        return overflowY === 'auto' || overflowY === 'scroll';\n                    },\n                    horizontallyScrollableContext: function () {\n                        var\n                            overflowX = $context[0] !== window\n                                ? $context.css('overflow-X')\n                                : false\n                        ;\n\n                        return overflowX === 'auto' || overflowX === 'scroll';\n                    },\n                },\n\n                can: {\n                    activate: function ($item) {\n                        return (\n                            settings.useLabels\n                                || !module.has.maxSelections()\n                                || (module.has.maxSelections() && $item.hasClass(className.active))\n                        );\n                    },\n                    openDownward: function ($subMenu) {\n                        var\n                            $currentMenu    = $subMenu || $menu,\n                            canOpenDownward,\n                            onScreen,\n                            calculations\n                        ;\n                        $currentMenu\n                            .addClass(className.loading)\n                        ;\n                        calculations = {\n                            context: {\n                                offset: $context[0] === window\n                                    ? { top: 0, left: 0 }\n                                    : $context.offset(),\n                                scrollTop: $context.scrollTop(),\n                                height: $context.outerHeight(),\n                            },\n                            menu: {\n                                offset: $currentMenu.offset(),\n                                height: $currentMenu.outerHeight(),\n                            },\n                        };\n                        if (module.is.verticallyScrollableContext()) {\n                            calculations.menu.offset.top += calculations.context.scrollTop;\n                        }\n                        if (module.has.subMenu($currentMenu)) {\n                            calculations.menu.height += $currentMenu.find(selector.menu).first().outerHeight();\n                        }\n                        onScreen = {\n                            above: calculations.context.scrollTop <= calculations.menu.offset.top - calculations.context.offset.top - calculations.menu.height,\n                            below: (calculations.context.scrollTop + calculations.context.height) >= calculations.menu.offset.top - calculations.context.offset.top + calculations.menu.height,\n                        };\n                        if (onScreen.below) {\n                            module.verbose('Dropdown can fit in context downward', onScreen);\n                            canOpenDownward = true;\n                        } else if (!onScreen.below && !onScreen.above) {\n                            module.verbose('Dropdown cannot fit in either direction, favoring downward', onScreen);\n                            canOpenDownward = true;\n                        } else {\n                            module.verbose('Dropdown cannot fit below, opening upward', onScreen);\n                            canOpenDownward = false;\n                        }\n                        $currentMenu.removeClass(className.loading);\n\n                        return canOpenDownward;\n                    },\n                    openRightward: function ($subMenu) {\n                        var\n                            $currentMenu     = $subMenu || $menu,\n                            canOpenRightward = true,\n                            isOffscreenRight = false,\n                            calculations\n                        ;\n                        $currentMenu\n                            .addClass(className.loading)\n                        ;\n                        calculations = {\n                            context: {\n                                offset: $context[0] === window\n                                    ? { top: 0, left: 0 }\n                                    : $context.offset(),\n                                scrollLeft: $context.scrollLeft(),\n                                width: $context.outerWidth(),\n                            },\n                            menu: {\n                                offset: $currentMenu.offset(),\n                                width: $currentMenu.outerWidth(),\n                            },\n                        };\n                        if (module.is.horizontallyScrollableContext()) {\n                            calculations.menu.offset.left += calculations.context.scrollLeft;\n                        }\n                        isOffscreenRight = calculations.menu.offset.left - calculations.context.offset.left + calculations.menu.width >= calculations.context.scrollLeft + calculations.context.width;\n                        if (isOffscreenRight) {\n                            module.verbose('Dropdown cannot fit in context rightward', isOffscreenRight);\n                            canOpenRightward = false;\n                        }\n                        $currentMenu.removeClass(className.loading);\n\n                        return canOpenRightward;\n                    },\n                    extendSelect: function () {\n                        return settings.allowAdditions || settings.apiSettings;\n                    },\n                    show: function () {\n                        return !module.is.disabled() && (module.has.items() || module.has.message());\n                    },\n                    useAPI: function () {\n                        return $.fn.api !== undefined;\n                    },\n                    useElement: function (element) {\n                        if ($.fn[element] !== undefined) {\n                            return true;\n                        }\n                        module.error(error.noElement.replace('{element}', element));\n\n                        return false;\n                    },\n                },\n\n                animate: {\n                    show: function (callback, $subMenu) {\n                        var\n                            $currentMenu = $subMenu || $menu,\n                            start = $subMenu\n                                ? function () {}\n                                : function () {\n                                    module.hideSubMenus();\n                                    module.hideOthers();\n                                    module.set.active();\n                                },\n                            transition\n                        ;\n                        callback = isFunction(callback)\n                            ? callback\n                            : function () {};\n                        module.verbose('Doing menu show animation', $currentMenu);\n                        module.set.direction($subMenu);\n                        transition = settings.transition.showMethod || module.get.transition($subMenu);\n                        if (module.is.selection()) {\n                            module.set.scrollPosition(module.get.selectedItem(), true);\n                        }\n                        if (module.is.hidden($currentMenu) || module.is.animating($currentMenu)) {\n                            if (transition === 'none') {\n                                start();\n                                $currentMenu.transition({\n                                    displayType: module.get.displayType(),\n                                }).transition('show');\n                                callback.call(element);\n                            } else if (module.can.useElement('transition')) {\n                                $currentMenu\n                                    .transition({\n                                        animation: transition + ' in',\n                                        debug: settings.debug,\n                                        verbose: settings.verbose,\n                                        silent: settings.silent,\n                                        duration: settings.transition.showDuration || settings.duration,\n                                        queue: true,\n                                        onStart: start,\n                                        displayType: module.get.displayType(),\n                                        onComplete: function () {\n                                            callback.call(element);\n                                        },\n                                    })\n                                ;\n                            }\n                        }\n                    },\n                    hide: function (callback, $subMenu) {\n                        var\n                            $currentMenu = $subMenu || $menu,\n                            start = $subMenu\n                                ? function () {}\n                                : function () {\n                                    module.unbind.intent();\n                                    module.remove.active();\n                                },\n                            transition = settings.transition.hideMethod || module.get.transition($subMenu)\n                        ;\n                        callback = isFunction(callback)\n                            ? callback\n                            : function () {};\n                        if (module.is.visible($currentMenu) || module.is.animating($currentMenu)) {\n                            module.verbose('Doing menu hide animation', $currentMenu);\n\n                            if (transition === 'none') {\n                                start();\n                                $currentMenu.transition({\n                                    displayType: module.get.displayType(),\n                                }).transition('hide');\n                                callback.call(element);\n                            } else if ($.fn.transition !== undefined) {\n                                $currentMenu\n                                    .transition({\n                                        animation: transition + ' out',\n                                        duration: settings.transition.hideDuration || settings.duration,\n                                        debug: settings.debug,\n                                        verbose: settings.verbose,\n                                        silent: settings.silent,\n                                        queue: false,\n                                        onStart: start,\n                                        displayType: module.get.displayType(),\n                                        onComplete: function () {\n                                            callback.call(element);\n                                        },\n                                    })\n                                ;\n                            } else {\n                                module.error(error.transition);\n                            }\n                        }\n                    },\n                },\n\n                hideAndClear: function () {\n                    module.remove.searchTerm();\n                    if (module.has.maxSelections()) {\n                        return;\n                    }\n                    if (module.has.search()) {\n                        module.hide(function () {\n                            module.remove.filteredItem();\n                        });\n                    } else {\n                        module.hide();\n                    }\n                },\n\n                delay: {\n                    show: function () {\n                        module.verbose('Delaying show event to ensure user intent');\n                        clearTimeout(module.timer);\n                        module.timer = setTimeout(function () {\n                            module.show();\n                        }, settings.delay.show);\n                    },\n                    hide: function () {\n                        module.verbose('Delaying hide event to ensure user intent');\n                        clearTimeout(module.timer);\n                        module.timer = setTimeout(function () {\n                            module.hide();\n                        }, settings.delay.hide);\n                    },\n                },\n\n                escape: {\n                    value: function (value) {\n                        var\n                            multipleValues = Array.isArray(value),\n                            stringValue    = typeof value === 'string',\n                            isUnparsable   = !stringValue && !multipleValues,\n                            hasQuotes      = stringValue && value.search(regExp.quote) !== -1,\n                            values         = []\n                        ;\n                        if (isUnparsable || !hasQuotes) {\n                            return value;\n                        }\n                        module.debug('Encoding quote values for use in select', value);\n                        if (multipleValues) {\n                            $.each(value, function (index, value) {\n                                values.push(value.replace(regExp.quote, '&quot;'));\n                            });\n\n                            return values;\n                        }\n\n                        return value.replace(regExp.quote, '&quot;');\n                    },\n                    string: function (text) {\n                        text = String(text);\n\n                        return text.replace(regExp.escape, '\\\\$&');\n                    },\n                    htmlEntities: function (string, forceAmpersand) {\n                        forceAmpersand = typeof forceAmpersand === 'number' ? false : forceAmpersand;\n                        var\n                            badChars     = /[\"'<>`]/g,\n                            shouldEscape = /[\"&'<>`]/,\n                            escape       = {\n                                '<': '&lt;',\n                                '>': '&gt;',\n                                '\"': '&quot;',\n                                \"'\": '&#x27;',\n                                '`': '&#x60;',\n                            },\n                            escapedChar  = function (chr) {\n                                return escape[chr];\n                            }\n                        ;\n                        if (shouldEscape.test(string)) {\n                            string = string.replace(forceAmpersand ? /&/g : /&(?![\\d#a-z]{1,12};)/gi, '&amp;');\n                            string = string.replace(badChars, escapedChar);\n                        }\n\n                        return string;\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : $allModules;\n    };\n\n    $.fn.dropdown.settings = {\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        on: 'click', // what event should show menu action on item selection\n        action: 'activate', // action on item selection (nothing, activate, select, combo, hide, function(){})\n\n        values: false, // specify values to use for dropdown\n\n        clearable: false, // whether the value of the dropdown can be cleared\n\n        apiSettings: false,\n        selectOnKeydown: true, // Whether selection should occur automatically when keyboard shortcuts used\n        minCharacters: 0, // Minimum characters required to trigger API call\n\n        filterRemoteData: false, // Whether API results should be filtered after being returned for query term\n        saveRemoteData: true, // Whether remote name/value pairs should be stored in sessionStorage to allow remote data to be restored on page refresh\n\n        throttle: 200, // How long to wait after last user input to search remotely\n\n        context: window, // Context to use when determining if on screen\n        direction: 'auto', // Whether dropdown should always open in one direction\n        keepOnScreen: true, // Whether dropdown should check whether it is on screen before showing\n\n        match: 'both', // what to match against with search selection (both, text, or label)\n        fullTextSearch: 'exact', // search anywhere in value (set to 'exact' to require exact matches)\n        highlightMatches: false, // Whether search result should highlight matching strings\n        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...)\n        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)\n\n        placeholder: 'auto', // whether to convert blank <select> values to placeholder text\n        preserveHTML: true, // preserve html when selecting value\n        sortSelect: false, // sort selection on init\n\n        forceSelection: false, // force a choice on blur with search selection\n\n        allowAdditions: false, // whether multiple select should allow user added values\n        keepSearchTerm: false, // whether the search value should be kept and menu stays filtered on item selection\n        ignoreCase: false, // whether to consider case sensitivity when creating labels\n        ignoreSearchCase: true, // whether to consider case sensitivity when filtering items\n        hideAdditions: true, // whether or not to hide special message prompting a user they can enter a value\n\n        maxSelections: false, // When set to a number limits the number of selections to this count\n        useLabels: true, // whether multiple select should filter currently active selections from choices\n        delimiter: ',', // when multiselect uses normal <input> the values will be delimited with this character\n\n        showOnFocus: false, // show menu on focus\n        allowReselection: false, // whether current value should trigger callbacks when reselected\n        allowTab: true, // add tabindex to element\n        allowCategorySelection: false, // allow elements with sub-menus to be selected\n\n        fireOnInit: false, // Whether callbacks should fire when initializing dropdown values\n\n        transition: 'auto', // auto transition will slide down or up based on direction\n        duration: 200, // duration of transition\n        displayType: false, // displayType of transition\n\n        headerDivider: true, // whether option headers should have an additional divider line underneath when converted from <select> <optgroup>\n\n        collapseOnActionable: true, // whether the dropdown should collapse upon selection of an actionable item\n        collapseOnClearable: false, // whether the dropdown should collapse upon clicking the clearable icon\n\n        // label settings on multi-select\n        label: {\n            transition: 'scale',\n            duration: 200,\n            variation: false,\n        },\n\n        // delay before event\n        delay: {\n            hide: 300,\n            show: 200,\n            search: 20,\n        },\n\n        /* Callbacks */\n        onChange: function (value, text, $selected) {},\n        onAdd: function (value, text, $selected) {},\n        onRemove: function (value, text, $selected) {},\n        onActionable: function (value, text, $selected) {},\n        onSearch: function (searchTerm) {},\n\n        onLabelSelect: function ($selectedLabels) {},\n        onLabelCreate: function (value, text) {\n            return $(this);\n        },\n        onLabelRemove: function (value) {\n            return true;\n        },\n        onNoResults: function (searchTerm) {\n            return true;\n        },\n        onShow: function () {},\n        onHide: function () {},\n\n        /* Component */\n        name: 'Dropdown',\n        namespace: 'dropdown',\n\n        message: {\n            addResult: 'Add <b>{term}</b>',\n            count: '{count} selected',\n            maxSelections: 'Max {maxCount} selections',\n            noResults: 'No results found.',\n            serverError: 'There was an error contacting the server',\n        },\n\n        error: {\n            action: 'You called a dropdown action that was not defined',\n            alreadySetup: 'Once a select has been initialized behaviors must be called on the created ui dropdown',\n            labels: 'Allowing user additions currently requires the use of labels.',\n            missingMultiple: '<select> requires multiple property to be set to correctly preserve multiple values',\n            method: 'The method you called is not defined.',\n            noAPI: 'The API module is required to load resources remotely',\n            noStorage: 'Saving remote data requires session storage',\n            noElement: 'This module requires ui {element}',\n            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.',\n        },\n\n        regExp: {\n            escape: /[\\s#$()*+,.:=?@[\\\\\\]^{|}-]/g,\n            quote: /\"/g,\n        },\n\n        metadata: {\n            defaultText: 'defaultText',\n            defaultValue: 'defaultValue',\n            placeholderText: 'placeholder',\n            text: 'text',\n            value: 'value',\n        },\n\n        // property names for remote query\n        fields: {\n            remoteValues: 'results', // grouping for api results\n            values: 'values', // grouping for all dropdown values\n            disabled: 'disabled', // whether value should be disabled\n            name: 'name', // displayed dropdown text\n            description: 'description', // displayed dropdown description\n            descriptionVertical: 'descriptionVertical', // whether description should be vertical\n            value: 'value', // actual dropdown value\n            text: 'text', // displayed text when selected\n            data: 'data', // custom data attributes\n            type: 'type', // type of dropdown element\n            image: 'image', // optional image path\n            imageClass: 'imageClass', // optional individual class for image\n            alt: 'alt', // optional alt text for image\n            icon: 'icon', // optional icon name\n            iconClass: 'iconClass', // optional individual class for icon (for example to use flag instead)\n            class: 'class', // optional individual class for item/header\n            divider: 'divider', // optional divider append for group headers\n            actionable: 'actionable', // optional actionable item\n        },\n\n        keys: {\n            backspace: 8,\n            deleteKey: 46,\n            enter: 13,\n            escape: 27,\n            pageUp: 33,\n            pageDown: 34,\n            leftArrow: 37,\n            upArrow: 38,\n            rightArrow: 39,\n            downArrow: 40,\n        },\n\n        selector: {\n            addition: '.addition',\n            divider: '.divider, .header',\n            dropdown: '.ui.dropdown',\n            hidden: '.hidden',\n            icon: '> .dropdown.icon',\n            input: '> input[type=\"hidden\"], > select',\n            item: '.item',\n            label: '> .label',\n            remove: '> .label > .delete.icon',\n            siblingLabel: '.label',\n            menu: '.menu',\n            message: '.message',\n            menuIcon: '.dropdown.icon',\n            search: 'input.search, .menu > .search > input, .menu input.search',\n            sizer: '> span.sizer',\n            text: '> .text:not(.icon)',\n            unselectable: '.disabled, .filtered',\n            clearIcon: '> .remove.icon',\n        },\n\n        className: {\n            active: 'active',\n            addition: 'addition',\n            animating: 'animating',\n            description: 'description',\n            descriptionVertical: 'vertical',\n            disabled: 'disabled',\n            empty: 'empty',\n            dropdown: 'ui dropdown',\n            filtered: 'filtered',\n            hidden: 'hidden transition',\n            icon: 'icon',\n            image: 'image',\n            item: 'item',\n            label: 'ui label',\n            loading: 'loading',\n            menu: 'menu',\n            message: 'message',\n            multiple: 'multiple',\n            placeholder: 'default',\n            sizer: 'sizer',\n            search: 'search',\n            selected: 'selected',\n            selection: 'selection',\n            text: 'text',\n            upward: 'upward',\n            leftward: 'left',\n            visible: 'visible',\n            clearable: 'clearable',\n            noselection: 'noselection',\n            delete: 'delete',\n            header: 'header',\n            divider: 'divider',\n            groupIcon: '',\n            unfilterable: 'unfilterable',\n            actionable: 'actionable',\n        },\n\n    };\n\n    /* Templates */\n    $.fn.dropdown.settings.templates = {\n        deQuote: function (string, encode) {\n            return String(string).replace(/\"/g, encode ? '&quot;' : '');\n        },\n        escape: function (string, preserveHTML) {\n            if (preserveHTML) {\n                return string;\n            }\n            var\n                badChars     = /[\"'<>`]/g,\n                shouldEscape = /[\"&'<>`]/,\n                escape       = {\n                    '<': '&lt;',\n                    '>': '&gt;',\n                    '\"': '&quot;',\n                    \"'\": '&#x27;',\n                    '`': '&#x60;',\n                },\n                escapedChar  = function (chr) {\n                    return escape[chr];\n                }\n            ;\n            if (shouldEscape.test(string)) {\n                string = string.replace(/&(?![\\d#a-z]{1,12};)/gi, '&amp;');\n                string = string.replace(badChars, escapedChar);\n            }\n\n            return string;\n        },\n        // generates dropdown from select values\n        dropdown: function (select, fields, preserveHTML, className) {\n            var\n                placeholder = select.placeholder || false,\n                html        = '',\n                escape = $.fn.dropdown.settings.templates.escape,\n                deQuote = $.fn.dropdown.settings.templates.deQuote\n            ;\n            html += '<i class=\"dropdown icon\"></i>';\n            html += placeholder\n                ? '<div class=\"default text\">' + escape(placeholder, preserveHTML) + '</div>'\n                : '<div class=\"text\"></div>';\n            html += '<div class=\"' + deQuote(className.menu) + '\">';\n            html += $.fn.dropdown.settings.templates.menu(select, fields, preserveHTML, className);\n            html += '</div>';\n\n            return html;\n        },\n\n        // generates just menu from select\n        menu: function (response, fields, preserveHTML, className) {\n            var\n                values = response[fields.values] || [],\n                html   = '',\n                escape = $.fn.dropdown.settings.templates.escape,\n                deQuote = $.fn.dropdown.settings.templates.deQuote\n            ;\n            $.each(values, function (index, option) {\n                var\n                    itemType = option[fields.type] || 'item',\n                    isMenu = itemType.indexOf('menu') !== -1,\n                    maybeData = '',\n                    dataObject = option[fields.data]\n                ;\n                if (dataObject) {\n                    var dataKey,\n                        dataKeyEscaped\n                    ;\n                    for (dataKey in dataObject) {\n                        dataKeyEscaped = String(dataKey).replace(/\\W/g, '');\n                        if (Object.prototype.hasOwnProperty.call(dataObject, dataKey) && ['text', 'value'].indexOf(dataKeyEscaped.toLowerCase()) === -1) {\n                            maybeData += ' data-' + dataKeyEscaped + '=\"' + deQuote(String(dataObject[dataKey])) + '\"';\n                        }\n                    }\n                }\n                if (itemType === 'item' || isMenu) {\n                    var\n                        maybeText = option[fields.text]\n                            ? ' data-text=\"' + deQuote(option[fields.text], true) + '\"'\n                            : '',\n                        maybeActionable = option[fields.actionable]\n                            ? className.actionable + ' '\n                            : '',\n                        maybeDisabled = option[fields.disabled]\n                            ? className.disabled + ' '\n                            : '',\n                        maybeDescriptionVertical = option[fields.descriptionVertical]\n                            ? className.descriptionVertical + ' '\n                            : '',\n                        hasDescription = escape(option[fields.description] || '', preserveHTML) !== ''\n                    ;\n                    html += '<div class=\"' + deQuote(maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] || className.item)) + '\" data-value=\"' + deQuote(option[fields.value], true) + '\"' + maybeText + maybeData + '>';\n                    if (isMenu) {\n                        html += '<i class=\"' + (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon\"></i>';\n                    }\n                    if (option[fields.image]) {\n                        html += '<img class=\"' + deQuote(option[fields.imageClass] || className.image) + '\" src=\"' + deQuote(option[fields.image]) + (option[fields.alt] ? '\" alt=\"' + deQuote(option[fields.alt]) : '') + '\">';\n                    }\n                    if (option[fields.icon]) {\n                        html += '<i class=\"' + deQuote(option[fields.icon] + ' ' + (option[fields.iconClass] || className.icon)) + '\"></i>';\n                    }\n                    if (hasDescription) {\n                        html += '<span class=\"' + deQuote(className.description) + '\">' + escape(option[fields.description] || '', preserveHTML) + '</span>';\n                        html += !isMenu ? '<span class=\"' + deQuote(className.text) + '\">' : '';\n                    }\n                    if (isMenu) {\n                        html += '<span class=\"' + deQuote(className.text) + '\">';\n                    }\n                    html += escape(option[fields.name] || '', preserveHTML);\n                    if (isMenu) {\n                        html += '</span>';\n                        html += '<div class=\"' + deQuote(itemType) + '\">';\n                        html += $.fn.dropdown.settings.templates.menu(option, fields, preserveHTML, className);\n                        html += '</div>';\n                    } else if (hasDescription) {\n                        html += '</span>';\n                    }\n                    html += '</div>';\n                } else if (itemType === 'header') {\n                    var\n                        groupName = escape(option[fields.name] || '', preserveHTML),\n                        groupIcon = deQuote(option[fields.icon] || className.groupIcon)\n                    ;\n                    if (groupName !== '' || groupIcon !== '') {\n                        html += '<div class=\"' + deQuote(option[fields.class] || className.header) + '\">';\n                        if (groupIcon !== '') {\n                            html += '<i class=\"' + deQuote(groupIcon + ' ' + (option[fields.iconClass] || className.icon)) + '\"></i>';\n                        }\n                        html += groupName;\n                        html += '</div>';\n                    }\n                    if (option[fields.divider]) {\n                        html += '<div class=\"' + deQuote(className.divider) + '\"></div>';\n                    }\n                }\n            });\n\n            return html;\n        },\n\n        // generates label for multiselect\n        label: function (value, text, preserveHTML, className) {\n            var\n                escape = $.fn.dropdown.settings.templates.escape,\n                deQuote = $.fn.dropdown.settings.templates.deQuote\n            ;\n\n            return escape(text, preserveHTML) + '<i class=\"' + deQuote(className.delete) + ' icon\"></i>';\n        },\n\n        // generates messages like \"No results\"\n        message: function (message) {\n            return message;\n        },\n\n        // generates user addition to selection menu\n        addition: function (choice) {\n            return choice;\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/embed.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Embed\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Types\n*******************************/\n\n.ui.embed {\n  position: relative;\n  max-width: 100%;\n  height: 0;\n  overflow: hidden;\n  background: #dcddde;\n  padding-bottom: 56.25%;\n}\n\n/* -----------------\n  Embedded Content\n------------------ */\n.ui.embed iframe,\n.ui.embed embed,\n.ui.embed object {\n  position: absolute;\n  border: none;\n  width: 100%;\n  height: 100%;\n  top: 0;\n  left: 0;\n  margin: 0;\n  padding: 0;\n  overflow: hidden;\n}\n\n/* -----------------\n      Embed\n------------------ */\n.ui.embed > .embed {\n  display: none;\n}\n\n/* --------------\n   Placeholder\n--------------- */\n.ui.embed > .placeholder {\n  position: absolute;\n  cursor: pointer;\n  top: 0;\n  left: 0;\n  display: block;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3));\n}\n\n/* --------------\n      Icon\n--------------- */\n.ui.embed > i.icon {\n  cursor: pointer;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 2;\n}\n.ui.embed > i.icon::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 3;\n  content: \"\";\n  background: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3));\n  opacity: 0.5;\n  transition: opacity 0.5s ease;\n}\n.ui.embed > i.icon::before {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translateX(-50%) translateY(-50%);\n  color: #fff;\n  font-size: 6rem;\n  text-shadow: 0 2px 10px rgba(34, 36, 38, 0.2);\n  transition: opacity 0.5s ease, color 0.5s ease;\n  z-index: 10;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------\n     Hover\n--------------- */\n.ui.embed i.icon:hover::after {\n  background: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3));\n  opacity: 1;\n}\n.ui.embed i.icon:hover::before {\n  color: #fff;\n}\n\n/* --------------\n     Active\n--------------- */\n.ui.active.embed > i.icon,\n.ui.active.embed > .placeholder {\n  display: none;\n}\n.ui.active.embed > .embed {\n  display: block;\n}\n\n\n/*******************************\n          Variations\n*******************************/\n\n.ui.square.embed {\n  padding-bottom: 100%;\n}\n.ui[class*=\"4:3\"].embed {\n  padding-bottom: 75%;\n}\n.ui[class*=\"16:9\"].embed {\n  padding-bottom: 56.25%;\n}\n.ui[class*=\"21:9\"].embed {\n  padding-bottom: 42.85714286%;\n}\n\n\n/*******************************\n        Video Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/embed.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Embed\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.embed = function (parameters) {\n        var\n            $allModules     = $(this),\n\n            time            = Date.now(),\n            performance     = [],\n\n            query           = arguments[0],\n            methodInvoked   = typeof query === 'string',\n            queryArguments  = [].slice.call(arguments, 1),\n\n            returnedValue\n        ;\n\n        $allModules.each(function () {\n            var\n                settings        = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.embed.settings, parameters)\n                    : $.extend({}, $.fn.embed.settings),\n\n                selector        = settings.selector,\n                className       = settings.className,\n                sources         = settings.sources,\n                error           = settings.error,\n                metadata        = settings.metadata,\n                namespace       = settings.namespace,\n                templates       = settings.templates,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                $module         = $(this),\n                $placeholder    = $module.find(selector.placeholder),\n                $icon           = $module.find(selector.icon),\n                $embed          = $module.find(selector.embed),\n\n                element         = this,\n                instance        = $module.data(moduleNamespace),\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.debug('Initializing embed');\n                    module.determine.autoplay();\n                    module.create();\n                    module.bind.events();\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous instance of embed');\n                    module.reset();\n                    $module\n                        .removeData(moduleNamespace)\n                        .off(eventNamespace)\n                    ;\n                },\n\n                refresh: function () {\n                    module.verbose('Refreshing selector cache');\n                    $placeholder = $module.find(selector.placeholder);\n                    $icon = $module.find(selector.icon);\n                    $embed = $module.find(selector.embed);\n                },\n\n                bind: {\n                    events: function () {\n                        if (module.has.placeholder()) {\n                            module.debug('Adding placeholder events');\n                            $module\n                                .on('click' + eventNamespace, selector.placeholder, module.createAndShow)\n                                .on('click' + eventNamespace, selector.icon, module.createAndShow)\n                            ;\n                        }\n                    },\n                },\n\n                create: function () {\n                    var\n                        placeholder = module.get.placeholder()\n                    ;\n                    if (placeholder) {\n                        module.createPlaceholder();\n                    } else {\n                        module.createAndShow();\n                    }\n                },\n\n                createPlaceholder: function (placeholder) {\n                    var\n                        icon  = module.get.icon(),\n                        alt   = module.get.alt()\n                    ;\n                    placeholder = placeholder || module.get.placeholder();\n                    $module.html(templates.placeholder(placeholder, icon, alt));\n                    module.debug('Creating placeholder for embed', placeholder, icon, alt);\n                },\n\n                createEmbed: function (url) {\n                    module.refresh();\n                    url = url || module.get.url();\n                    $embed = $('<div/>')\n                        .addClass(className.embed)\n                        .html(module.generate.embed(url))\n                        .appendTo($module)\n                    ;\n                    settings.onCreate.call(element, url);\n                    module.debug('Creating embed object', $embed);\n                },\n\n                changeEmbed: function (url) {\n                    $embed\n                        .html(module.generate.embed(url))\n                    ;\n                },\n\n                createAndShow: function () {\n                    module.createEmbed();\n                    module.show();\n                },\n\n                // sets new embed\n                change: function (source, id, url) {\n                    module.debug('Changing video to ', source, id, url);\n                    $module\n                        .data(metadata.source, source)\n                        .data(metadata.id, id)\n                    ;\n                    if (url) {\n                        $module.data(metadata.url, url);\n                    } else {\n                        $module.removeData(metadata.url);\n                    }\n                    if (module.has.embed()) {\n                        module.changeEmbed();\n                    } else {\n                        module.create();\n                    }\n                },\n\n                // clears embed\n                reset: function () {\n                    module.debug('Clearing embed and showing placeholder');\n                    module.remove.data();\n                    module.remove.active();\n                    module.remove.embed();\n                    module.showPlaceholder();\n                    settings.onReset.call(element);\n                },\n\n                // shows current embed\n                show: function () {\n                    module.debug('Showing embed');\n                    module.set.active();\n                    settings.onDisplay.call(element);\n                },\n\n                hide: function () {\n                    module.debug('Hiding embed');\n                    module.showPlaceholder();\n                },\n\n                showPlaceholder: function () {\n                    module.debug('Showing placeholder image');\n                    module.remove.active();\n                    settings.onPlaceholderDisplay.call(element);\n                },\n\n                get: {\n                    id: function () {\n                        return settings.id || $module.data(metadata.id);\n                    },\n                    placeholder: function () {\n                        return settings.placeholder || $module.data(metadata.placeholder);\n                    },\n                    alt: function () {\n                        return settings.alt || $module.data(metadata.alt);\n                    },\n                    icon: function () {\n                        return settings.icon || ($module.data(metadata.icon) !== undefined\n                            ? $module.data(metadata.icon)\n                            : module.determine.icon());\n                    },\n                    source: function (url) {\n                        return settings.source || ($module.data(metadata.source) !== undefined\n                            ? $module.data(metadata.source)\n                            : module.determine.source());\n                    },\n                    type: function () {\n                        var source = module.get.source();\n\n                        return sources[source] !== undefined\n                            ? sources[source].type\n                            : false;\n                    },\n                    url: function () {\n                        return settings.url || ($module.data(metadata.url) !== undefined\n                            ? $module.data(metadata.url)\n                            : module.determine.url());\n                    },\n                },\n\n                determine: {\n                    autoplay: function () {\n                        if (module.should.autoplay()) {\n                            settings.autoplay = true;\n                        }\n                    },\n                    source: function (url) {\n                        var\n                            matchedSource = false\n                        ;\n                        url = url || module.get.url();\n                        if (url) {\n                            $.each(sources, function (name, source) {\n                                if (url.search(source.domain) !== -1) {\n                                    matchedSource = name;\n\n                                    return false;\n                                }\n                            });\n                        }\n\n                        return matchedSource;\n                    },\n                    icon: function () {\n                        var\n                            source = module.get.source()\n                        ;\n\n                        return sources[source] !== undefined\n                            ? sources[source].icon\n                            : false;\n                    },\n                    url: function () {\n                        var\n                            id     = settings.id || $module.data(metadata.id),\n                            source = settings.source || $module.data(metadata.source),\n                            url\n                        ;\n                        url = sources[source] !== undefined\n                            ? sources[source].url.replace('{id}', id)\n                            : false;\n                        if (url) {\n                            $module.data(metadata.url, url);\n                        }\n\n                        return url;\n                    },\n                },\n\n                set: {\n                    active: function () {\n                        $module.addClass(className.active);\n                    },\n                },\n\n                remove: {\n                    data: function () {\n                        $module\n                            .removeData(metadata.id)\n                            .removeData(metadata.icon)\n                            .removeData(metadata.placeholder)\n                            .removeData(metadata.alt)\n                            .removeData(metadata.source)\n                            .removeData(metadata.url)\n                        ;\n                    },\n                    active: function () {\n                        $module.removeClass(className.active);\n                    },\n                    embed: function () {\n                        $embed.empty();\n                    },\n                },\n\n                encode: {\n                    parameters: function (parameters) {\n                        var\n                            urlString = [],\n                            index\n                        ;\n                        for (index in parameters) {\n                            urlString.push(encodeURIComponent(index) + '=' + encodeURIComponent(parameters[index]));\n                        }\n\n                        return urlString.join('&amp;');\n                    },\n                },\n\n                generate: {\n                    embed: function (url) {\n                        module.debug('Generating embed html');\n                        var\n                            source = module.get.source(),\n                            html,\n                            parameters\n                        ;\n                        url = module.get.url(url);\n                        if (url) {\n                            parameters = module.generate.parameters(source);\n                            html = templates.iframe(url, parameters);\n                        } else {\n                            module.error(error.noURL, $module);\n                        }\n\n                        return html;\n                    },\n                    parameters: function (source, extraParameters) {\n                        var\n                            parameters = sources[source] && sources[source].parameters !== undefined\n                                ? sources[source].parameters(settings)\n                                : {}\n                        ;\n                        extraParameters = extraParameters || settings.parameters;\n                        if (extraParameters) {\n                            parameters = $.extend({}, parameters, extraParameters);\n                        }\n                        parameters = settings.onEmbed(parameters);\n\n                        return module.encode.parameters(parameters);\n                    },\n                },\n\n                has: {\n                    embed: function () {\n                        return $embed.length > 0;\n                    },\n                    placeholder: function () {\n                        return settings.placeholder || $module.data(metadata.placeholder);\n                    },\n                },\n\n                should: {\n                    autoplay: function () {\n                        return settings.autoplay === 'auto'\n                            ? settings.placeholder || $module.data(metadata.placeholder) !== undefined\n                            : settings.autoplay;\n                    },\n                },\n\n                is: {\n                    video: function () {\n                        return module.get.type() === 'video';\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if ($allModules.length > 1) {\n                            title += ' (' + $allModules.length + ')';\n                        }\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.embed.settings = {\n\n        name: 'Embed',\n        namespace: 'embed',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        icon: false,\n        source: false,\n        url: false,\n        id: false,\n        placeholder: false,\n        alt: false,\n\n        // standard video settings\n        autoplay: 'auto',\n        color: '#444',\n        hd: true,\n        brandedUI: false,\n\n        // additional parameters to include with the embed\n        parameters: false,\n\n        onDisplay: function () {},\n        onPlaceholderDisplay: function () {},\n        onReset: function () {},\n        onCreate: function (url) {},\n        onEmbed: function (parameters) {\n            return parameters;\n        },\n\n        metadata: {\n            id: 'id',\n            icon: 'icon',\n            placeholder: 'placeholder',\n            alt: 'alt',\n            source: 'source',\n            url: 'url',\n        },\n\n        error: {\n            noURL: 'No URL specified',\n            method: 'The method you called is not defined',\n        },\n\n        className: {\n            active: 'active',\n            embed: 'embed',\n        },\n\n        selector: {\n            embed: '.embed',\n            placeholder: '.placeholder',\n            icon: '.icon',\n        },\n\n        sources: {\n            youtube: {\n                name: 'youtube',\n                type: 'video',\n                icon: 'video play',\n                domain: 'youtube.com',\n                url: '//www.youtube.com/embed/{id}',\n                parameters: function (settings) {\n                    return {\n                        autohide: !settings.brandedUI,\n                        autoplay: settings.autoplay,\n                        color: settings.color || undefined,\n                        hq: settings.hd,\n                        jsapi: settings.api,\n                        modestbranding: !settings.brandedUI,\n                    };\n                },\n            },\n            vimeo: {\n                name: 'vimeo',\n                type: 'video',\n                icon: 'video play',\n                domain: 'vimeo.com',\n                url: '//player.vimeo.com/video/{id}',\n                parameters: function (settings) {\n                    return {\n                        api: settings.api,\n                        autoplay: settings.autoplay,\n                        byline: settings.brandedUI,\n                        color: settings.color || undefined,\n                        portrait: settings.brandedUI,\n                        title: settings.brandedUI,\n                    };\n                },\n            },\n        },\n\n        templates: {\n            deQuote: function (string, encode) {\n                return String(string).replace(/\"/g, encode ? '&quot;' : '');\n            },\n            iframe: function (url, parameters) {\n                var\n                    src = url,\n                    deQuote = $.fn.embed.settings.templates.deQuote\n                ;\n                if (parameters) {\n                    src += '?' + parameters;\n                }\n\n                return ''\n                    + '<iframe src=\"' + deQuote(src) + '\"'\n                    + ' width=\"100%\" height=\"100%\"'\n                    + ' msallowFullScreen allowFullScreen></iframe>';\n            },\n            placeholder: function (image, icon, alt) {\n                var\n                    html = '',\n                    deQuote = $.fn.embed.settings.templates.deQuote\n                ;\n                if (icon) {\n                    html += '<i class=\"' + deQuote(icon) + ' icon\"></i>';\n                }\n                if (image) {\n                    html += '<img class=\"placeholder\" src=\"' + deQuote(image) + (alt ? '\" alt=\"' + deQuote(alt) : '') + '\">';\n                }\n\n                return html;\n            },\n        },\n\n        // NOT YET IMPLEMENTED\n        api: false,\n        onPause: function () {},\n        onPlay: function () {},\n        onStop: function () {},\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/emoji.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Emoji\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Emoji\n*******************************/\n\nem[data-emoji] {\n  opacity: 1;\n  speak: none;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\nem[data-emoji]::before {\n  content: \"\\00A0\\00A0\\00A0\\00A0\\00A0\\00A0\\00A0\";\n  display: inline-block;\n  line-height: 1em;\n  background-repeat: no-repeat;\n  background-position: center center;\n}\n\n\n/*******************************\n             States\n*******************************/\n\nem[data-emoji].disabled {\n  opacity: 0.45;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\nem[data-emoji].loading::before {\n  animation: loader 2s linear infinite;\n}\n\n/* -------------------\n             Link\n    -------------------- */\nem[data-emoji].link:not(.disabled) {\n  cursor: pointer;\n}\n\n/* rtl:begin:ignore */\nem[data-emoji].small {\n  font-size: 1.5em;\n  vertical-align: middle;\n}\nem[data-emoji].medium {\n  font-size: 3em;\n  vertical-align: middle;\n}\nem[data-emoji].large {\n  font-size: 6em;\n  vertical-align: middle;\n}\nem[data-emoji].big {\n  font-size: 7.5em;\n  vertical-align: middle;\n}\nem[data-emoji=\":interrobang:\"]::before,\nem[data-emoji=\"interrobang\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2049.svg\");\n}\nem[data-emoji=\":tm:\"]::before,\nem[data-emoji=\"tm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2122.svg\");\n}\nem[data-emoji=\":information_source:\"]::before,\nem[data-emoji=\"information_source\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2139.svg\");\n}\nem[data-emoji=\":left_right_arrow:\"]::before,\nem[data-emoji=\"left_right_arrow\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2194.svg\");\n}\nem[data-emoji=\":arrow_up_down:\"]::before,\nem[data-emoji=\"arrow_up_down\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2195.svg\");\n}\nem[data-emoji=\":arrow_upper_left:\"]::before,\nem[data-emoji=\"arrow_upper_left\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2196.svg\");\n}\nem[data-emoji=\":arrow_upper_right:\"]::before,\nem[data-emoji=\"arrow_upper_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2197.svg\");\n}\nem[data-emoji=\":arrow_lower_right:\"]::before,\nem[data-emoji=\"arrow_lower_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2198.svg\");\n}\nem[data-emoji=\":arrow_lower_left:\"]::before,\nem[data-emoji=\"arrow_lower_left\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2199.svg\");\n}\nem[data-emoji=\":keyboard:\"]::before,\nem[data-emoji=\"keyboard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2328.svg\");\n}\nem[data-emoji=\":sunny:\"]::before,\nem[data-emoji=\"sunny\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2600.svg\");\n}\nem[data-emoji=\":cloud:\"]::before,\nem[data-emoji=\"cloud\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2601.svg\");\n}\nem[data-emoji=\":umbrella2:\"]::before,\nem[data-emoji=\"umbrella2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2602.svg\");\n}\nem[data-emoji=\":snowman2:\"]::before,\nem[data-emoji=\"snowman2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2603.svg\");\n}\nem[data-emoji=\":comet:\"]::before,\nem[data-emoji=\"comet\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2604.svg\");\n}\nem[data-emoji=\":ballot_box_with_check:\"]::before,\nem[data-emoji=\"ballot_box_with_check\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2611.svg\");\n}\nem[data-emoji=\":umbrella:\"]::before,\nem[data-emoji=\"umbrella\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2614.svg\");\n}\nem[data-emoji=\":coffee:\"]::before,\nem[data-emoji=\"coffee\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2615.svg\");\n}\nem[data-emoji=\":shamrock:\"]::before,\nem[data-emoji=\"shamrock\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2618.svg\");\n}\nem[data-emoji=\":skull_crossbones:\"]::before,\nem[data-emoji=\"skull_crossbones\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2620.svg\");\n}\nem[data-emoji=\":radioactive:\"]::before,\nem[data-emoji=\"radioactive\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2622.svg\");\n}\nem[data-emoji=\":biohazard:\"]::before,\nem[data-emoji=\"biohazard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2623.svg\");\n}\nem[data-emoji=\":orthodox_cross:\"]::before,\nem[data-emoji=\"orthodox_cross\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2626.svg\");\n}\nem[data-emoji=\":wheel_of_dharma:\"]::before,\nem[data-emoji=\"wheel_of_dharma\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2638.svg\");\n}\nem[data-emoji=\":frowning2:\"]::before,\nem[data-emoji=\"frowning2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2639.svg\");\n}\nem[data-emoji=\":female_sign:\"]::before,\nem[data-emoji=\"female_sign\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2640.svg\");\n}\nem[data-emoji=\":male_sign:\"]::before,\nem[data-emoji=\"male_sign\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2642.svg\");\n}\nem[data-emoji=\":aries:\"]::before,\nem[data-emoji=\"aries\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2648.svg\");\n}\nem[data-emoji=\":taurus:\"]::before,\nem[data-emoji=\"taurus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2649.svg\");\n}\nem[data-emoji=\":sagittarius:\"]::before,\nem[data-emoji=\"sagittarius\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2650.svg\");\n}\nem[data-emoji=\":capricorn:\"]::before,\nem[data-emoji=\"capricorn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2651.svg\");\n}\nem[data-emoji=\":aquarius:\"]::before,\nem[data-emoji=\"aquarius\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2652.svg\");\n}\nem[data-emoji=\":pisces:\"]::before,\nem[data-emoji=\"pisces\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2653.svg\");\n}\nem[data-emoji=\":spades:\"]::before,\nem[data-emoji=\"spades\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2660.svg\");\n}\nem[data-emoji=\":clubs:\"]::before,\nem[data-emoji=\"clubs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2663.svg\");\n}\nem[data-emoji=\":hearts:\"]::before,\nem[data-emoji=\"hearts\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2665.svg\");\n}\nem[data-emoji=\":diamonds:\"]::before,\nem[data-emoji=\"diamonds\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2666.svg\");\n}\nem[data-emoji=\":hotsprings:\"]::before,\nem[data-emoji=\"hotsprings\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2668.svg\");\n}\nem[data-emoji=\":hammer_pick:\"]::before,\nem[data-emoji=\"hammer_pick\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2692.svg\");\n}\nem[data-emoji=\":anchor:\"]::before,\nem[data-emoji=\"anchor\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2693.svg\");\n}\nem[data-emoji=\":crossed_swords:\"]::before,\nem[data-emoji=\"crossed_swords\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2694.svg\");\n}\nem[data-emoji=\":medical_symbol:\"]::before,\nem[data-emoji=\"medical_symbol\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2695.svg\");\n}\nem[data-emoji=\":scales:\"]::before,\nem[data-emoji=\"scales\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2696.svg\");\n}\nem[data-emoji=\":alembic:\"]::before,\nem[data-emoji=\"alembic\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2697.svg\");\n}\nem[data-emoji=\":gear:\"]::before,\nem[data-emoji=\"gear\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2699.svg\");\n}\nem[data-emoji=\":scissors:\"]::before,\nem[data-emoji=\"scissors\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2702.svg\");\n}\nem[data-emoji=\":white_check_mark:\"]::before,\nem[data-emoji=\"white_check_mark\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2705.svg\");\n}\nem[data-emoji=\":airplane:\"]::before,\nem[data-emoji=\"airplane\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2708.svg\");\n}\nem[data-emoji=\":envelope:\"]::before,\nem[data-emoji=\"envelope\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2709.svg\");\n}\nem[data-emoji=\":black_nib:\"]::before,\nem[data-emoji=\"black_nib\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2712.svg\");\n}\nem[data-emoji=\":heavy_check_mark:\"]::before,\nem[data-emoji=\"heavy_check_mark\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2714.svg\");\n}\nem[data-emoji=\":heavy_multiplication_x:\"]::before,\nem[data-emoji=\"heavy_multiplication_x\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2716.svg\");\n}\nem[data-emoji=\":star_of_david:\"]::before,\nem[data-emoji=\"star_of_david\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2721.svg\");\n}\nem[data-emoji=\":sparkles:\"]::before,\nem[data-emoji=\"sparkles\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2728.svg\");\n}\nem[data-emoji=\":eight_spoked_asterisk:\"]::before,\nem[data-emoji=\"eight_spoked_asterisk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2733.svg\");\n}\nem[data-emoji=\":eight_pointed_black_star:\"]::before,\nem[data-emoji=\"eight_pointed_black_star\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2734.svg\");\n}\nem[data-emoji=\":snowflake:\"]::before,\nem[data-emoji=\"snowflake\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2744.svg\");\n}\nem[data-emoji=\":sparkle:\"]::before,\nem[data-emoji=\"sparkle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2747.svg\");\n}\nem[data-emoji=\":question:\"]::before,\nem[data-emoji=\"question\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2753.svg\");\n}\nem[data-emoji=\":grey_question:\"]::before,\nem[data-emoji=\"grey_question\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2754.svg\");\n}\nem[data-emoji=\":grey_exclamation:\"]::before,\nem[data-emoji=\"grey_exclamation\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2755.svg\");\n}\nem[data-emoji=\":exclamation:\"]::before,\nem[data-emoji=\"exclamation\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2757.svg\");\n}\nem[data-emoji=\":heart_exclamation:\"]::before,\nem[data-emoji=\"heart_exclamation\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2763.svg\");\n}\nem[data-emoji=\":heart:\"]::before,\nem[data-emoji=\"heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2764.svg\");\n}\nem[data-emoji=\":heavy_plus_sign:\"]::before,\nem[data-emoji=\"heavy_plus_sign\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2795.svg\");\n}\nem[data-emoji=\":heavy_minus_sign:\"]::before,\nem[data-emoji=\"heavy_minus_sign\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2796.svg\");\n}\nem[data-emoji=\":heavy_division_sign:\"]::before,\nem[data-emoji=\"heavy_division_sign\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2797.svg\");\n}\nem[data-emoji=\":arrow_heading_up:\"]::before,\nem[data-emoji=\"arrow_heading_up\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2934.svg\");\n}\nem[data-emoji=\":arrow_heading_down:\"]::before,\nem[data-emoji=\"arrow_heading_down\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2935.svg\");\n}\nem[data-emoji=\":wavy_dash:\"]::before,\nem[data-emoji=\"wavy_dash\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/3030.svg\");\n}\nem[data-emoji=\":congratulations:\"]::before,\nem[data-emoji=\"congratulations\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/3297.svg\");\n}\nem[data-emoji=\":secret:\"]::before,\nem[data-emoji=\"secret\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/3299.svg\");\n}\nem[data-emoji=\":grinning:\"]::before,\nem[data-emoji=\"grinning\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f600.svg\");\n}\nem[data-emoji=\":smiley:\"]::before,\nem[data-emoji=\"smiley\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f603.svg\");\n}\nem[data-emoji=\":smile:\"]::before,\nem[data-emoji=\"smile\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f604.svg\");\n}\nem[data-emoji=\":grin:\"]::before,\nem[data-emoji=\"grin\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f601.svg\");\n}\nem[data-emoji=\":laughing:\"]::before,\nem[data-emoji=\"laughing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f606.svg\");\n}\nem[data-emoji=\":face_holding_back_tears:\"]::before,\nem[data-emoji=\"face_holding_back_tears\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f979.svg\");\n}\nem[data-emoji=\":sweat_smile:\"]::before,\nem[data-emoji=\"sweat_smile\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f605.svg\");\n}\nem[data-emoji=\":joy:\"]::before,\nem[data-emoji=\"joy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f602.svg\");\n}\nem[data-emoji=\":rofl:\"]::before,\nem[data-emoji=\"rofl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f923.svg\");\n}\nem[data-emoji=\":smiling_face_with_tear:\"]::before,\nem[data-emoji=\"smiling_face_with_tear\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f972.svg\");\n}\nem[data-emoji=\":relaxed:\"]::before,\nem[data-emoji=\"relaxed\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/263a.svg\");\n}\nem[data-emoji=\":blush:\"]::before,\nem[data-emoji=\"blush\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60a.svg\");\n}\nem[data-emoji=\":innocent:\"]::before,\nem[data-emoji=\"innocent\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f607.svg\");\n}\nem[data-emoji=\":slight_smile:\"]::before,\nem[data-emoji=\"slight_smile\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f642.svg\");\n}\nem[data-emoji=\":upside_down:\"]::before,\nem[data-emoji=\"upside_down\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f643.svg\");\n}\nem[data-emoji=\":wink:\"]::before,\nem[data-emoji=\"wink\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f609.svg\");\n}\nem[data-emoji=\":relieved:\"]::before,\nem[data-emoji=\"relieved\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60c.svg\");\n}\nem[data-emoji=\":heart_eyes:\"]::before,\nem[data-emoji=\"heart_eyes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60d.svg\");\n}\nem[data-emoji=\":smiling_face_with_3_hearts:\"]::before,\nem[data-emoji=\"smiling_face_with_3_hearts\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f970.svg\");\n}\nem[data-emoji=\":kissing_heart:\"]::before,\nem[data-emoji=\"kissing_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f618.svg\");\n}\nem[data-emoji=\":kissing:\"]::before,\nem[data-emoji=\"kissing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f617.svg\");\n}\nem[data-emoji=\":kissing_smiling_eyes:\"]::before,\nem[data-emoji=\"kissing_smiling_eyes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f619.svg\");\n}\nem[data-emoji=\":kissing_closed_eyes:\"]::before,\nem[data-emoji=\"kissing_closed_eyes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61a.svg\");\n}\nem[data-emoji=\":yum:\"]::before,\nem[data-emoji=\"yum\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60b.svg\");\n}\nem[data-emoji=\":stuck_out_tongue:\"]::before,\nem[data-emoji=\"stuck_out_tongue\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61b.svg\");\n}\nem[data-emoji=\":stuck_out_tongue_closed_eyes:\"]::before,\nem[data-emoji=\"stuck_out_tongue_closed_eyes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61d.svg\");\n}\nem[data-emoji=\":stuck_out_tongue_winking_eye:\"]::before,\nem[data-emoji=\"stuck_out_tongue_winking_eye\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61c.svg\");\n}\nem[data-emoji=\":zany_face:\"]::before,\nem[data-emoji=\"zany_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92a.svg\");\n}\nem[data-emoji=\":face_with_raised_eyebrow:\"]::before,\nem[data-emoji=\"face_with_raised_eyebrow\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f928.svg\");\n}\nem[data-emoji=\":face_with_monocle:\"]::before,\nem[data-emoji=\"face_with_monocle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d0.svg\");\n}\nem[data-emoji=\":nerd:\"]::before,\nem[data-emoji=\"nerd\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f913.svg\");\n}\nem[data-emoji=\":sunglasses:\"]::before,\nem[data-emoji=\"sunglasses\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60e.svg\");\n}\nem[data-emoji=\":disguised_face:\"]::before,\nem[data-emoji=\"disguised_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f978.svg\");\n}\nem[data-emoji=\":star_struck:\"]::before,\nem[data-emoji=\"star_struck\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f929.svg\");\n}\nem[data-emoji=\":partying_face:\"]::before,\nem[data-emoji=\"partying_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f973.svg\");\n}\nem[data-emoji=\":smirk:\"]::before,\nem[data-emoji=\"smirk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60f.svg\");\n}\nem[data-emoji=\":unamused:\"]::before,\nem[data-emoji=\"unamused\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f612.svg\");\n}\nem[data-emoji=\":disappointed:\"]::before,\nem[data-emoji=\"disappointed\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61e.svg\");\n}\nem[data-emoji=\":pensive:\"]::before,\nem[data-emoji=\"pensive\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f614.svg\");\n}\nem[data-emoji=\":worried:\"]::before,\nem[data-emoji=\"worried\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61f.svg\");\n}\nem[data-emoji=\":confused:\"]::before,\nem[data-emoji=\"confused\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f615.svg\");\n}\nem[data-emoji=\":slight_frown:\"]::before,\nem[data-emoji=\"slight_frown\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f641.svg\");\n}\nem[data-emoji=\":persevere:\"]::before,\nem[data-emoji=\"persevere\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f623.svg\");\n}\nem[data-emoji=\":confounded:\"]::before,\nem[data-emoji=\"confounded\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f616.svg\");\n}\nem[data-emoji=\":tired_face:\"]::before,\nem[data-emoji=\"tired_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62b.svg\");\n}\nem[data-emoji=\":weary:\"]::before,\nem[data-emoji=\"weary\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f629.svg\");\n}\nem[data-emoji=\":pleading_face:\"]::before,\nem[data-emoji=\"pleading_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97a.svg\");\n}\nem[data-emoji=\":cry:\"]::before,\nem[data-emoji=\"cry\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f622.svg\");\n}\nem[data-emoji=\":sob:\"]::before,\nem[data-emoji=\"sob\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62d.svg\");\n}\nem[data-emoji=\":triumph:\"]::before,\nem[data-emoji=\"triumph\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f624.svg\");\n}\nem[data-emoji=\":angry:\"]::before,\nem[data-emoji=\"angry\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f620.svg\");\n}\nem[data-emoji=\":rage:\"]::before,\nem[data-emoji=\"rage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f621.svg\");\n}\nem[data-emoji=\":face_with_symbols_over_mouth:\"]::before,\nem[data-emoji=\"face_with_symbols_over_mouth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92c.svg\");\n}\nem[data-emoji=\":exploding_head:\"]::before,\nem[data-emoji=\"exploding_head\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92f.svg\");\n}\nem[data-emoji=\":flushed:\"]::before,\nem[data-emoji=\"flushed\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f633.svg\");\n}\nem[data-emoji=\":hot_face:\"]::before,\nem[data-emoji=\"hot_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f975.svg\");\n}\nem[data-emoji=\":cold_face:\"]::before,\nem[data-emoji=\"cold_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f976.svg\");\n}\nem[data-emoji=\":face_in_clouds:\"]::before,\nem[data-emoji=\"face_in_clouds\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f636-200d-1f32b-fe0f.svg\");\n}\nem[data-emoji=\":scream:\"]::before,\nem[data-emoji=\"scream\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f631.svg\");\n}\nem[data-emoji=\":fearful:\"]::before,\nem[data-emoji=\"fearful\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f628.svg\");\n}\nem[data-emoji=\":cold_sweat:\"]::before,\nem[data-emoji=\"cold_sweat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f630.svg\");\n}\nem[data-emoji=\":disappointed_relieved:\"]::before,\nem[data-emoji=\"disappointed_relieved\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f625.svg\");\n}\nem[data-emoji=\":sweat:\"]::before,\nem[data-emoji=\"sweat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f613.svg\");\n}\nem[data-emoji=\":hugging:\"]::before,\nem[data-emoji=\"hugging\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f917.svg\");\n}\nem[data-emoji=\":thinking:\"]::before,\nem[data-emoji=\"thinking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f914.svg\");\n}\nem[data-emoji=\":face_with_peeking_eye:\"]::before,\nem[data-emoji=\"face_with_peeking_eye\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae3.svg\");\n}\nem[data-emoji=\":face_with_hand_over_mouth:\"]::before,\nem[data-emoji=\"face_with_hand_over_mouth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92d.svg\");\n}\nem[data-emoji=\":face_with_open_eyes_and_hand_over_mouth:\"]::before,\nem[data-emoji=\"face_with_open_eyes_and_hand_over_mouth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae2.svg\");\n}\nem[data-emoji=\":saluting_face:\"]::before,\nem[data-emoji=\"saluting_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae1.svg\");\n}\nem[data-emoji=\":shushing_face:\"]::before,\nem[data-emoji=\"shushing_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92b.svg\");\n}\nem[data-emoji=\":melting_face:\"]::before,\nem[data-emoji=\"melting_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae0.svg\");\n}\nem[data-emoji=\":lying_face:\"]::before,\nem[data-emoji=\"lying_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f925.svg\");\n}\nem[data-emoji=\":no_mouth:\"]::before,\nem[data-emoji=\"no_mouth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f636.svg\");\n}\nem[data-emoji=\":dotted_line_face:\"]::before,\nem[data-emoji=\"dotted_line_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae5.svg\");\n}\nem[data-emoji=\":neutral_face:\"]::before,\nem[data-emoji=\"neutral_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f610.svg\");\n}\nem[data-emoji=\":face_with_diagonal_mouth:\"]::before,\nem[data-emoji=\"face_with_diagonal_mouth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae4.svg\");\n}\nem[data-emoji=\":expressionless:\"]::before,\nem[data-emoji=\"expressionless\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f611.svg\");\n}\nem[data-emoji=\":shaking_face:\"]::before,\nem[data-emoji=\"shaking_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae8.svg\");\n}\nem[data-emoji=\":head_shaking_horizontally:\"]::before,\nem[data-emoji=\"head_shaking_horizontally\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f642-200d-2194-fe0f.svg\");\n}\nem[data-emoji=\":head_shaking_vertically:\"]::before,\nem[data-emoji=\"head_shaking_vertically\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f642-200d-2195-fe0f.svg\");\n}\nem[data-emoji=\":grimacing:\"]::before,\nem[data-emoji=\"grimacing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62c.svg\");\n}\nem[data-emoji=\":rolling_eyes:\"]::before,\nem[data-emoji=\"rolling_eyes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f644.svg\");\n}\nem[data-emoji=\":hushed:\"]::before,\nem[data-emoji=\"hushed\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62f.svg\");\n}\nem[data-emoji=\":frowning:\"]::before,\nem[data-emoji=\"frowning\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f626.svg\");\n}\nem[data-emoji=\":anguished:\"]::before,\nem[data-emoji=\"anguished\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f627.svg\");\n}\nem[data-emoji=\":open_mouth:\"]::before,\nem[data-emoji=\"open_mouth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62e.svg\");\n}\nem[data-emoji=\":astonished:\"]::before,\nem[data-emoji=\"astonished\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f632.svg\");\n}\nem[data-emoji=\":yawning_face:\"]::before,\nem[data-emoji=\"yawning_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f971.svg\");\n}\nem[data-emoji=\":sleeping:\"]::before,\nem[data-emoji=\"sleeping\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f634.svg\");\n}\nem[data-emoji=\":drooling_face:\"]::before,\nem[data-emoji=\"drooling_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f924.svg\");\n}\nem[data-emoji=\":sleepy:\"]::before,\nem[data-emoji=\"sleepy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62a.svg\");\n}\nem[data-emoji=\":face_exhaling:\"]::before,\nem[data-emoji=\"face_exhaling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62e-200d-1f4a8.svg\");\n}\nem[data-emoji=\":dizzy_face:\"]::before,\nem[data-emoji=\"dizzy_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f635.svg\");\n}\nem[data-emoji=\":face_with_spiral_eyes:\"]::before,\nem[data-emoji=\"face_with_spiral_eyes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f635-200d-1f4ab.svg\");\n}\nem[data-emoji=\":zipper_mouth:\"]::before,\nem[data-emoji=\"zipper_mouth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f910.svg\");\n}\nem[data-emoji=\":woozy_face:\"]::before,\nem[data-emoji=\"woozy_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f974.svg\");\n}\nem[data-emoji=\":nauseated_face:\"]::before,\nem[data-emoji=\"nauseated_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f922.svg\");\n}\nem[data-emoji=\":face_vomiting:\"]::before,\nem[data-emoji=\"face_vomiting\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92e.svg\");\n}\nem[data-emoji=\":sneezing_face:\"]::before,\nem[data-emoji=\"sneezing_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f927.svg\");\n}\nem[data-emoji=\":mask:\"]::before,\nem[data-emoji=\"mask\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f637.svg\");\n}\nem[data-emoji=\":thermometer_face:\"]::before,\nem[data-emoji=\"thermometer_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f912.svg\");\n}\nem[data-emoji=\":head_bandage:\"]::before,\nem[data-emoji=\"head_bandage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f915.svg\");\n}\nem[data-emoji=\":money_mouth:\"]::before,\nem[data-emoji=\"money_mouth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f911.svg\");\n}\nem[data-emoji=\":cowboy:\"]::before,\nem[data-emoji=\"cowboy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f920.svg\");\n}\nem[data-emoji=\":smiling_imp:\"]::before,\nem[data-emoji=\"smiling_imp\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f608.svg\");\n}\nem[data-emoji=\":imp:\"]::before,\nem[data-emoji=\"imp\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47f.svg\");\n}\nem[data-emoji=\":japanese_ogre:\"]::before,\nem[data-emoji=\"japanese_ogre\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f479.svg\");\n}\nem[data-emoji=\":japanese_goblin:\"]::before,\nem[data-emoji=\"japanese_goblin\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47a.svg\");\n}\nem[data-emoji=\":clown:\"]::before,\nem[data-emoji=\"clown\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f921.svg\");\n}\nem[data-emoji=\":poop:\"]::before,\nem[data-emoji=\"poop\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a9.svg\");\n}\nem[data-emoji=\":ghost:\"]::before,\nem[data-emoji=\"ghost\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47b.svg\");\n}\nem[data-emoji=\":skull:\"]::before,\nem[data-emoji=\"skull\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f480.svg\");\n}\nem[data-emoji=\":alien:\"]::before,\nem[data-emoji=\"alien\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47d.svg\");\n}\nem[data-emoji=\":space_invader:\"]::before,\nem[data-emoji=\"space_invader\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47e.svg\");\n}\nem[data-emoji=\":robot:\"]::before,\nem[data-emoji=\"robot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f916.svg\");\n}\nem[data-emoji=\":jack_o_lantern:\"]::before,\nem[data-emoji=\"jack_o_lantern\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f383.svg\");\n}\nem[data-emoji=\":smiley_cat:\"]::before,\nem[data-emoji=\"smiley_cat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63a.svg\");\n}\nem[data-emoji=\":smile_cat:\"]::before,\nem[data-emoji=\"smile_cat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f638.svg\");\n}\nem[data-emoji=\":joy_cat:\"]::before,\nem[data-emoji=\"joy_cat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f639.svg\");\n}\nem[data-emoji=\":heart_eyes_cat:\"]::before,\nem[data-emoji=\"heart_eyes_cat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63b.svg\");\n}\nem[data-emoji=\":smirk_cat:\"]::before,\nem[data-emoji=\"smirk_cat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63c.svg\");\n}\nem[data-emoji=\":kissing_cat:\"]::before,\nem[data-emoji=\"kissing_cat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63d.svg\");\n}\nem[data-emoji=\":scream_cat:\"]::before,\nem[data-emoji=\"scream_cat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f640.svg\");\n}\nem[data-emoji=\":crying_cat_face:\"]::before,\nem[data-emoji=\"crying_cat_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63f.svg\");\n}\nem[data-emoji=\":pouting_cat:\"]::before,\nem[data-emoji=\"pouting_cat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63e.svg\");\n}\nem[data-emoji=\":heart_hands:\"]::before,\nem[data-emoji=\"heart_hands\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6.svg\");\n}\nem[data-emoji=\":heart_hands_tone1:\"]::before,\nem[data-emoji=\"heart_hands_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6-1f3fb.svg\");\n}\nem[data-emoji=\":heart_hands_tone2:\"]::before,\nem[data-emoji=\"heart_hands_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6-1f3fc.svg\");\n}\nem[data-emoji=\":heart_hands_tone3:\"]::before,\nem[data-emoji=\"heart_hands_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6-1f3fd.svg\");\n}\nem[data-emoji=\":heart_hands_tone4:\"]::before,\nem[data-emoji=\"heart_hands_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6-1f3fe.svg\");\n}\nem[data-emoji=\":heart_hands_tone5:\"]::before,\nem[data-emoji=\"heart_hands_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6-1f3ff.svg\");\n}\nem[data-emoji=\":palms_up_together:\"]::before,\nem[data-emoji=\"palms_up_together\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932.svg\");\n}\nem[data-emoji=\":palms_up_together_tone1:\"]::before,\nem[data-emoji=\"palms_up_together_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932-1f3fb.svg\");\n}\nem[data-emoji=\":palms_up_together_tone2:\"]::before,\nem[data-emoji=\"palms_up_together_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932-1f3fc.svg\");\n}\nem[data-emoji=\":palms_up_together_tone3:\"]::before,\nem[data-emoji=\"palms_up_together_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932-1f3fd.svg\");\n}\nem[data-emoji=\":palms_up_together_tone4:\"]::before,\nem[data-emoji=\"palms_up_together_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932-1f3fe.svg\");\n}\nem[data-emoji=\":palms_up_together_tone5:\"]::before,\nem[data-emoji=\"palms_up_together_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932-1f3ff.svg\");\n}\nem[data-emoji=\":open_hands:\"]::before,\nem[data-emoji=\"open_hands\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450.svg\");\n}\nem[data-emoji=\":open_hands_tone1:\"]::before,\nem[data-emoji=\"open_hands_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450-1f3fb.svg\");\n}\nem[data-emoji=\":open_hands_tone2:\"]::before,\nem[data-emoji=\"open_hands_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450-1f3fc.svg\");\n}\nem[data-emoji=\":open_hands_tone3:\"]::before,\nem[data-emoji=\"open_hands_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450-1f3fd.svg\");\n}\nem[data-emoji=\":open_hands_tone4:\"]::before,\nem[data-emoji=\"open_hands_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450-1f3fe.svg\");\n}\nem[data-emoji=\":open_hands_tone5:\"]::before,\nem[data-emoji=\"open_hands_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450-1f3ff.svg\");\n}\nem[data-emoji=\":raised_hands:\"]::before,\nem[data-emoji=\"raised_hands\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c.svg\");\n}\nem[data-emoji=\":raised_hands_tone1:\"]::before,\nem[data-emoji=\"raised_hands_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c-1f3fb.svg\");\n}\nem[data-emoji=\":raised_hands_tone2:\"]::before,\nem[data-emoji=\"raised_hands_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c-1f3fc.svg\");\n}\nem[data-emoji=\":raised_hands_tone3:\"]::before,\nem[data-emoji=\"raised_hands_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c-1f3fd.svg\");\n}\nem[data-emoji=\":raised_hands_tone4:\"]::before,\nem[data-emoji=\"raised_hands_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c-1f3fe.svg\");\n}\nem[data-emoji=\":raised_hands_tone5:\"]::before,\nem[data-emoji=\"raised_hands_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c-1f3ff.svg\");\n}\nem[data-emoji=\":clap:\"]::before,\nem[data-emoji=\"clap\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f.svg\");\n}\nem[data-emoji=\":clap_tone1:\"]::before,\nem[data-emoji=\"clap_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f-1f3fb.svg\");\n}\nem[data-emoji=\":clap_tone2:\"]::before,\nem[data-emoji=\"clap_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f-1f3fc.svg\");\n}\nem[data-emoji=\":clap_tone3:\"]::before,\nem[data-emoji=\"clap_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f-1f3fd.svg\");\n}\nem[data-emoji=\":clap_tone4:\"]::before,\nem[data-emoji=\"clap_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f-1f3fe.svg\");\n}\nem[data-emoji=\":clap_tone5:\"]::before,\nem[data-emoji=\"clap_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f-1f3ff.svg\");\n}\nem[data-emoji=\":handshake:\"]::before,\nem[data-emoji=\"handshake\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d.svg\");\n}\nem[data-emoji=\":handshake_tone1:\"]::before,\nem[data-emoji=\"handshake_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d-1f3fb.svg\");\n}\nem[data-emoji=\":handshake_tone1_tone2:\"]::before,\nem[data-emoji=\"handshake_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fb-200d-1faf2-1f3fc.svg\");\n}\nem[data-emoji=\":handshake_tone1_tone3:\"]::before,\nem[data-emoji=\"handshake_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fb-200d-1faf2-1f3fd.svg\");\n}\nem[data-emoji=\":handshake_tone1_tone4:\"]::before,\nem[data-emoji=\"handshake_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fb-200d-1faf2-1f3fe.svg\");\n}\nem[data-emoji=\":handshake_tone1_tone5:\"]::before,\nem[data-emoji=\"handshake_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fb-200d-1faf2-1f3ff.svg\");\n}\nem[data-emoji=\":handshake_tone2_tone1:\"]::before,\nem[data-emoji=\"handshake_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fc-200d-1faf2-1f3fb.svg\");\n}\nem[data-emoji=\":handshake_tone2:\"]::before,\nem[data-emoji=\"handshake_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d-1f3fc.svg\");\n}\nem[data-emoji=\":handshake_tone2_tone3:\"]::before,\nem[data-emoji=\"handshake_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fc-200d-1faf2-1f3fd.svg\");\n}\nem[data-emoji=\":handshake_tone2_tone4:\"]::before,\nem[data-emoji=\"handshake_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fc-200d-1faf2-1f3fe.svg\");\n}\nem[data-emoji=\":handshake_tone2_tone5:\"]::before,\nem[data-emoji=\"handshake_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fc-200d-1faf2-1f3ff.svg\");\n}\nem[data-emoji=\":handshake_tone3_tone1:\"]::before,\nem[data-emoji=\"handshake_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fd-200d-1faf2-1f3fb.svg\");\n}\nem[data-emoji=\":handshake_tone3_tone2:\"]::before,\nem[data-emoji=\"handshake_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fd-200d-1faf2-1f3fc.svg\");\n}\nem[data-emoji=\":handshake_tone3:\"]::before,\nem[data-emoji=\"handshake_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d-1f3fd.svg\");\n}\nem[data-emoji=\":handshake_tone3_tone4:\"]::before,\nem[data-emoji=\"handshake_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fd-200d-1faf2-1f3fe.svg\");\n}\nem[data-emoji=\":handshake_tone3_tone5:\"]::before,\nem[data-emoji=\"handshake_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fd-200d-1faf2-1f3ff.svg\");\n}\nem[data-emoji=\":handshake_tone4_tone1:\"]::before,\nem[data-emoji=\"handshake_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fe-200d-1faf2-1f3fb.svg\");\n}\nem[data-emoji=\":handshake_tone4_tone2:\"]::before,\nem[data-emoji=\"handshake_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fe-200d-1faf2-1f3fc.svg\");\n}\nem[data-emoji=\":handshake_tone4_tone3:\"]::before,\nem[data-emoji=\"handshake_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fe-200d-1faf2-1f3fd.svg\");\n}\nem[data-emoji=\":handshake_tone4:\"]::before,\nem[data-emoji=\"handshake_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d-1f3fe.svg\");\n}\nem[data-emoji=\":handshake_tone4_tone5:\"]::before,\nem[data-emoji=\"handshake_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fe-200d-1faf2-1f3ff.svg\");\n}\nem[data-emoji=\":handshake_tone5_tone1:\"]::before,\nem[data-emoji=\"handshake_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3ff-200d-1faf2-1f3fb.svg\");\n}\nem[data-emoji=\":handshake_tone5_tone2:\"]::before,\nem[data-emoji=\"handshake_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3ff-200d-1faf2-1f3fc.svg\");\n}\nem[data-emoji=\":handshake_tone5_tone3:\"]::before,\nem[data-emoji=\"handshake_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3ff-200d-1faf2-1f3fd.svg\");\n}\nem[data-emoji=\":handshake_tone5_tone4:\"]::before,\nem[data-emoji=\"handshake_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3ff-200d-1faf2-1f3fe.svg\");\n}\nem[data-emoji=\":handshake_tone5:\"]::before,\nem[data-emoji=\"handshake_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d-1f3ff.svg\");\n}\nem[data-emoji=\":thumbsup:\"]::before,\nem[data-emoji=\"thumbsup\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d.svg\");\n}\nem[data-emoji=\":thumbsup_tone1:\"]::before,\nem[data-emoji=\"thumbsup_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d-1f3fb.svg\");\n}\nem[data-emoji=\":thumbsup_tone2:\"]::before,\nem[data-emoji=\"thumbsup_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d-1f3fc.svg\");\n}\nem[data-emoji=\":thumbsup_tone3:\"]::before,\nem[data-emoji=\"thumbsup_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d-1f3fd.svg\");\n}\nem[data-emoji=\":thumbsup_tone4:\"]::before,\nem[data-emoji=\"thumbsup_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d-1f3fe.svg\");\n}\nem[data-emoji=\":thumbsup_tone5:\"]::before,\nem[data-emoji=\"thumbsup_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d-1f3ff.svg\");\n}\nem[data-emoji=\":thumbsdown:\"]::before,\nem[data-emoji=\"thumbsdown\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e.svg\");\n}\nem[data-emoji=\":thumbsdown_tone1:\"]::before,\nem[data-emoji=\"thumbsdown_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e-1f3fb.svg\");\n}\nem[data-emoji=\":thumbsdown_tone2:\"]::before,\nem[data-emoji=\"thumbsdown_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e-1f3fc.svg\");\n}\nem[data-emoji=\":thumbsdown_tone3:\"]::before,\nem[data-emoji=\"thumbsdown_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e-1f3fd.svg\");\n}\nem[data-emoji=\":thumbsdown_tone4:\"]::before,\nem[data-emoji=\"thumbsdown_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e-1f3fe.svg\");\n}\nem[data-emoji=\":thumbsdown_tone5:\"]::before,\nem[data-emoji=\"thumbsdown_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e-1f3ff.svg\");\n}\nem[data-emoji=\":punch:\"]::before,\nem[data-emoji=\"punch\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a.svg\");\n}\nem[data-emoji=\":punch_tone1:\"]::before,\nem[data-emoji=\"punch_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a-1f3fb.svg\");\n}\nem[data-emoji=\":punch_tone2:\"]::before,\nem[data-emoji=\"punch_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a-1f3fc.svg\");\n}\nem[data-emoji=\":punch_tone3:\"]::before,\nem[data-emoji=\"punch_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a-1f3fd.svg\");\n}\nem[data-emoji=\":punch_tone4:\"]::before,\nem[data-emoji=\"punch_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a-1f3fe.svg\");\n}\nem[data-emoji=\":punch_tone5:\"]::before,\nem[data-emoji=\"punch_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a-1f3ff.svg\");\n}\nem[data-emoji=\":fist:\"]::before,\nem[data-emoji=\"fist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a.svg\");\n}\nem[data-emoji=\":fist_tone1:\"]::before,\nem[data-emoji=\"fist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a-1f3fb.svg\");\n}\nem[data-emoji=\":fist_tone2:\"]::before,\nem[data-emoji=\"fist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a-1f3fc.svg\");\n}\nem[data-emoji=\":fist_tone3:\"]::before,\nem[data-emoji=\"fist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a-1f3fd.svg\");\n}\nem[data-emoji=\":fist_tone4:\"]::before,\nem[data-emoji=\"fist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a-1f3fe.svg\");\n}\nem[data-emoji=\":fist_tone5:\"]::before,\nem[data-emoji=\"fist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a-1f3ff.svg\");\n}\nem[data-emoji=\":left_facing_fist:\"]::before,\nem[data-emoji=\"left_facing_fist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b.svg\");\n}\nem[data-emoji=\":left_facing_fist_tone1:\"]::before,\nem[data-emoji=\"left_facing_fist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b-1f3fb.svg\");\n}\nem[data-emoji=\":left_facing_fist_tone2:\"]::before,\nem[data-emoji=\"left_facing_fist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b-1f3fc.svg\");\n}\nem[data-emoji=\":left_facing_fist_tone3:\"]::before,\nem[data-emoji=\"left_facing_fist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b-1f3fd.svg\");\n}\nem[data-emoji=\":left_facing_fist_tone4:\"]::before,\nem[data-emoji=\"left_facing_fist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b-1f3fe.svg\");\n}\nem[data-emoji=\":left_facing_fist_tone5:\"]::before,\nem[data-emoji=\"left_facing_fist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b-1f3ff.svg\");\n}\nem[data-emoji=\":right_facing_fist:\"]::before,\nem[data-emoji=\"right_facing_fist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c.svg\");\n}\nem[data-emoji=\":right_facing_fist_tone1:\"]::before,\nem[data-emoji=\"right_facing_fist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c-1f3fb.svg\");\n}\nem[data-emoji=\":right_facing_fist_tone2:\"]::before,\nem[data-emoji=\"right_facing_fist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c-1f3fc.svg\");\n}\nem[data-emoji=\":right_facing_fist_tone3:\"]::before,\nem[data-emoji=\"right_facing_fist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c-1f3fd.svg\");\n}\nem[data-emoji=\":right_facing_fist_tone4:\"]::before,\nem[data-emoji=\"right_facing_fist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c-1f3fe.svg\");\n}\nem[data-emoji=\":right_facing_fist_tone5:\"]::before,\nem[data-emoji=\"right_facing_fist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c-1f3ff.svg\");\n}\nem[data-emoji=\":leftwards_pushing_hand:\"]::before,\nem[data-emoji=\"leftwards_pushing_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7.svg\");\n}\nem[data-emoji=\":leftwards_pushing_hand_tone1:\"]::before,\nem[data-emoji=\"leftwards_pushing_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7-1f3fb.svg\");\n}\nem[data-emoji=\":leftwards_pushing_hand_tone2:\"]::before,\nem[data-emoji=\"leftwards_pushing_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7-1f3fc.svg\");\n}\nem[data-emoji=\":leftwards_pushing_hand_tone3:\"]::before,\nem[data-emoji=\"leftwards_pushing_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7-1f3fd.svg\");\n}\nem[data-emoji=\":leftwards_pushing_hand_tone4:\"]::before,\nem[data-emoji=\"leftwards_pushing_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7-1f3fe.svg\");\n}\nem[data-emoji=\":leftwards_pushing_hand_tone5:\"]::before,\nem[data-emoji=\"leftwards_pushing_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7-1f3ff.svg\");\n}\nem[data-emoji=\":rightwards_pushing_hand:\"]::before,\nem[data-emoji=\"rightwards_pushing_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8.svg\");\n}\nem[data-emoji=\":rightwards_pushing_hand_tone1:\"]::before,\nem[data-emoji=\"rightwards_pushing_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8-1f3fb.svg\");\n}\nem[data-emoji=\":rightwards_pushing_hand_tone2:\"]::before,\nem[data-emoji=\"rightwards_pushing_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8-1f3fc.svg\");\n}\nem[data-emoji=\":rightwards_pushing_hand_tone3:\"]::before,\nem[data-emoji=\"rightwards_pushing_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8-1f3fd.svg\");\n}\nem[data-emoji=\":rightwards_pushing_hand_tone4:\"]::before,\nem[data-emoji=\"rightwards_pushing_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8-1f3fe.svg\");\n}\nem[data-emoji=\":rightwards_pushing_hand_tone5:\"]::before,\nem[data-emoji=\"rightwards_pushing_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8-1f3ff.svg\");\n}\nem[data-emoji=\":fingers_crossed:\"]::before,\nem[data-emoji=\"fingers_crossed\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e.svg\");\n}\nem[data-emoji=\":fingers_crossed_tone1:\"]::before,\nem[data-emoji=\"fingers_crossed_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e-1f3fb.svg\");\n}\nem[data-emoji=\":fingers_crossed_tone2:\"]::before,\nem[data-emoji=\"fingers_crossed_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e-1f3fc.svg\");\n}\nem[data-emoji=\":fingers_crossed_tone3:\"]::before,\nem[data-emoji=\"fingers_crossed_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e-1f3fd.svg\");\n}\nem[data-emoji=\":fingers_crossed_tone4:\"]::before,\nem[data-emoji=\"fingers_crossed_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e-1f3fe.svg\");\n}\nem[data-emoji=\":fingers_crossed_tone5:\"]::before,\nem[data-emoji=\"fingers_crossed_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e-1f3ff.svg\");\n}\nem[data-emoji=\":v:\"]::before,\nem[data-emoji=\"v\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c.svg\");\n}\nem[data-emoji=\":v_tone1:\"]::before,\nem[data-emoji=\"v_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c-1f3fb.svg\");\n}\nem[data-emoji=\":v_tone2:\"]::before,\nem[data-emoji=\"v_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c-1f3fc.svg\");\n}\nem[data-emoji=\":v_tone3:\"]::before,\nem[data-emoji=\"v_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c-1f3fd.svg\");\n}\nem[data-emoji=\":v_tone4:\"]::before,\nem[data-emoji=\"v_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c-1f3fe.svg\");\n}\nem[data-emoji=\":v_tone5:\"]::before,\nem[data-emoji=\"v_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c-1f3ff.svg\");\n}\nem[data-emoji=\":hand_with_index_finger_and_thumb_crossed:\"]::before,\nem[data-emoji=\"hand_with_index_finger_and_thumb_crossed\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0.svg\");\n}\nem[data-emoji=\":hand_with_index_finger_and_thumb_crossed_tone1:\"]::before,\nem[data-emoji=\"hand_with_index_finger_and_thumb_crossed_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0-1f3fb.svg\");\n}\nem[data-emoji=\":hand_with_index_finger_and_thumb_crossed_tone2:\"]::before,\nem[data-emoji=\"hand_with_index_finger_and_thumb_crossed_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0-1f3fc.svg\");\n}\nem[data-emoji=\":hand_with_index_finger_and_thumb_crossed_tone3:\"]::before,\nem[data-emoji=\"hand_with_index_finger_and_thumb_crossed_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0-1f3fd.svg\");\n}\nem[data-emoji=\":hand_with_index_finger_and_thumb_crossed_tone4:\"]::before,\nem[data-emoji=\"hand_with_index_finger_and_thumb_crossed_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0-1f3fe.svg\");\n}\nem[data-emoji=\":hand_with_index_finger_and_thumb_crossed_tone5:\"]::before,\nem[data-emoji=\"hand_with_index_finger_and_thumb_crossed_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0-1f3ff.svg\");\n}\nem[data-emoji=\":love_you_gesture:\"]::before,\nem[data-emoji=\"love_you_gesture\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f.svg\");\n}\nem[data-emoji=\":love_you_gesture_tone1:\"]::before,\nem[data-emoji=\"love_you_gesture_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f-1f3fb.svg\");\n}\nem[data-emoji=\":love_you_gesture_tone2:\"]::before,\nem[data-emoji=\"love_you_gesture_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f-1f3fc.svg\");\n}\nem[data-emoji=\":love_you_gesture_tone3:\"]::before,\nem[data-emoji=\"love_you_gesture_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f-1f3fd.svg\");\n}\nem[data-emoji=\":love_you_gesture_tone4:\"]::before,\nem[data-emoji=\"love_you_gesture_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f-1f3fe.svg\");\n}\nem[data-emoji=\":love_you_gesture_tone5:\"]::before,\nem[data-emoji=\"love_you_gesture_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f-1f3ff.svg\");\n}\nem[data-emoji=\":metal:\"]::before,\nem[data-emoji=\"metal\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918.svg\");\n}\nem[data-emoji=\":metal_tone1:\"]::before,\nem[data-emoji=\"metal_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918-1f3fb.svg\");\n}\nem[data-emoji=\":metal_tone2:\"]::before,\nem[data-emoji=\"metal_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918-1f3fc.svg\");\n}\nem[data-emoji=\":metal_tone3:\"]::before,\nem[data-emoji=\"metal_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918-1f3fd.svg\");\n}\nem[data-emoji=\":metal_tone4:\"]::before,\nem[data-emoji=\"metal_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918-1f3fe.svg\");\n}\nem[data-emoji=\":metal_tone5:\"]::before,\nem[data-emoji=\"metal_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918-1f3ff.svg\");\n}\nem[data-emoji=\":ok_hand:\"]::before,\nem[data-emoji=\"ok_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c.svg\");\n}\nem[data-emoji=\":ok_hand_tone1:\"]::before,\nem[data-emoji=\"ok_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c-1f3fb.svg\");\n}\nem[data-emoji=\":ok_hand_tone2:\"]::before,\nem[data-emoji=\"ok_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c-1f3fc.svg\");\n}\nem[data-emoji=\":ok_hand_tone3:\"]::before,\nem[data-emoji=\"ok_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c-1f3fd.svg\");\n}\nem[data-emoji=\":ok_hand_tone4:\"]::before,\nem[data-emoji=\"ok_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c-1f3fe.svg\");\n}\nem[data-emoji=\":ok_hand_tone5:\"]::before,\nem[data-emoji=\"ok_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c-1f3ff.svg\");\n}\nem[data-emoji=\":pinched_fingers:\"]::before,\nem[data-emoji=\"pinched_fingers\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c.svg\");\n}\nem[data-emoji=\":pinched_fingers_tone2:\"]::before,\nem[data-emoji=\"pinched_fingers_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c-1f3fc.svg\");\n}\nem[data-emoji=\":pinched_fingers_tone1:\"]::before,\nem[data-emoji=\"pinched_fingers_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c-1f3fb.svg\");\n}\nem[data-emoji=\":pinched_fingers_tone3:\"]::before,\nem[data-emoji=\"pinched_fingers_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c-1f3fd.svg\");\n}\nem[data-emoji=\":pinched_fingers_tone4:\"]::before,\nem[data-emoji=\"pinched_fingers_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c-1f3fe.svg\");\n}\nem[data-emoji=\":pinched_fingers_tone5:\"]::before,\nem[data-emoji=\"pinched_fingers_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c-1f3ff.svg\");\n}\nem[data-emoji=\":pinching_hand:\"]::before,\nem[data-emoji=\"pinching_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f.svg\");\n}\nem[data-emoji=\":pinching_hand_tone1:\"]::before,\nem[data-emoji=\"pinching_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f-1f3fb.svg\");\n}\nem[data-emoji=\":pinching_hand_tone2:\"]::before,\nem[data-emoji=\"pinching_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f-1f3fc.svg\");\n}\nem[data-emoji=\":pinching_hand_tone3:\"]::before,\nem[data-emoji=\"pinching_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f-1f3fd.svg\");\n}\nem[data-emoji=\":pinching_hand_tone4:\"]::before,\nem[data-emoji=\"pinching_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f-1f3fe.svg\");\n}\nem[data-emoji=\":pinching_hand_tone5:\"]::before,\nem[data-emoji=\"pinching_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f-1f3ff.svg\");\n}\nem[data-emoji=\":palm_down_hand:\"]::before,\nem[data-emoji=\"palm_down_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3.svg\");\n}\nem[data-emoji=\":palm_down_hand_tone1:\"]::before,\nem[data-emoji=\"palm_down_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3-1f3fb.svg\");\n}\nem[data-emoji=\":palm_down_hand_tone2:\"]::before,\nem[data-emoji=\"palm_down_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3-1f3fc.svg\");\n}\nem[data-emoji=\":palm_down_hand_tone3:\"]::before,\nem[data-emoji=\"palm_down_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3-1f3fd.svg\");\n}\nem[data-emoji=\":palm_down_hand_tone4:\"]::before,\nem[data-emoji=\"palm_down_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3-1f3fe.svg\");\n}\nem[data-emoji=\":palm_down_hand_tone5:\"]::before,\nem[data-emoji=\"palm_down_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3-1f3ff.svg\");\n}\nem[data-emoji=\":palm_up_hand:\"]::before,\nem[data-emoji=\"palm_up_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4.svg\");\n}\nem[data-emoji=\":palm_up_hand_tone1:\"]::before,\nem[data-emoji=\"palm_up_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4-1f3fb.svg\");\n}\nem[data-emoji=\":palm_up_hand_tone2:\"]::before,\nem[data-emoji=\"palm_up_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4-1f3fc.svg\");\n}\nem[data-emoji=\":palm_up_hand_tone3:\"]::before,\nem[data-emoji=\"palm_up_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4-1f3fd.svg\");\n}\nem[data-emoji=\":palm_up_hand_tone4:\"]::before,\nem[data-emoji=\"palm_up_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4-1f3fe.svg\");\n}\nem[data-emoji=\":palm_up_hand_tone5:\"]::before,\nem[data-emoji=\"palm_up_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4-1f3ff.svg\");\n}\nem[data-emoji=\":point_left:\"]::before,\nem[data-emoji=\"point_left\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448.svg\");\n}\nem[data-emoji=\":point_left_tone1:\"]::before,\nem[data-emoji=\"point_left_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448-1f3fb.svg\");\n}\nem[data-emoji=\":point_left_tone2:\"]::before,\nem[data-emoji=\"point_left_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448-1f3fc.svg\");\n}\nem[data-emoji=\":point_left_tone3:\"]::before,\nem[data-emoji=\"point_left_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448-1f3fd.svg\");\n}\nem[data-emoji=\":point_left_tone4:\"]::before,\nem[data-emoji=\"point_left_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448-1f3fe.svg\");\n}\nem[data-emoji=\":point_left_tone5:\"]::before,\nem[data-emoji=\"point_left_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448-1f3ff.svg\");\n}\nem[data-emoji=\":point_right:\"]::before,\nem[data-emoji=\"point_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449.svg\");\n}\nem[data-emoji=\":point_right_tone1:\"]::before,\nem[data-emoji=\"point_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449-1f3fb.svg\");\n}\nem[data-emoji=\":point_right_tone2:\"]::before,\nem[data-emoji=\"point_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449-1f3fc.svg\");\n}\nem[data-emoji=\":point_right_tone3:\"]::before,\nem[data-emoji=\"point_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449-1f3fd.svg\");\n}\nem[data-emoji=\":point_right_tone4:\"]::before,\nem[data-emoji=\"point_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449-1f3fe.svg\");\n}\nem[data-emoji=\":point_right_tone5:\"]::before,\nem[data-emoji=\"point_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449-1f3ff.svg\");\n}\nem[data-emoji=\":point_up_2:\"]::before,\nem[data-emoji=\"point_up_2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446.svg\");\n}\nem[data-emoji=\":point_up_2_tone1:\"]::before,\nem[data-emoji=\"point_up_2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446-1f3fb.svg\");\n}\nem[data-emoji=\":point_up_2_tone2:\"]::before,\nem[data-emoji=\"point_up_2_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446-1f3fc.svg\");\n}\nem[data-emoji=\":point_up_2_tone3:\"]::before,\nem[data-emoji=\"point_up_2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446-1f3fd.svg\");\n}\nem[data-emoji=\":point_up_2_tone4:\"]::before,\nem[data-emoji=\"point_up_2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446-1f3fe.svg\");\n}\nem[data-emoji=\":point_up_2_tone5:\"]::before,\nem[data-emoji=\"point_up_2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446-1f3ff.svg\");\n}\nem[data-emoji=\":point_down:\"]::before,\nem[data-emoji=\"point_down\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447.svg\");\n}\nem[data-emoji=\":point_down_tone1:\"]::before,\nem[data-emoji=\"point_down_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447-1f3fb.svg\");\n}\nem[data-emoji=\":point_down_tone2:\"]::before,\nem[data-emoji=\"point_down_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447-1f3fc.svg\");\n}\nem[data-emoji=\":point_down_tone3:\"]::before,\nem[data-emoji=\"point_down_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447-1f3fd.svg\");\n}\nem[data-emoji=\":point_down_tone4:\"]::before,\nem[data-emoji=\"point_down_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447-1f3fe.svg\");\n}\nem[data-emoji=\":point_down_tone5:\"]::before,\nem[data-emoji=\"point_down_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447-1f3ff.svg\");\n}\nem[data-emoji=\":point_up:\"]::before,\nem[data-emoji=\"point_up\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d.svg\");\n}\nem[data-emoji=\":point_up_tone1:\"]::before,\nem[data-emoji=\"point_up_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d-1f3fb.svg\");\n}\nem[data-emoji=\":point_up_tone2:\"]::before,\nem[data-emoji=\"point_up_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d-1f3fc.svg\");\n}\nem[data-emoji=\":point_up_tone3:\"]::before,\nem[data-emoji=\"point_up_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d-1f3fd.svg\");\n}\nem[data-emoji=\":point_up_tone4:\"]::before,\nem[data-emoji=\"point_up_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d-1f3fe.svg\");\n}\nem[data-emoji=\":point_up_tone5:\"]::before,\nem[data-emoji=\"point_up_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d-1f3ff.svg\");\n}\nem[data-emoji=\":raised_hand:\"]::before,\nem[data-emoji=\"raised_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b.svg\");\n}\nem[data-emoji=\":raised_hand_tone1:\"]::before,\nem[data-emoji=\"raised_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b-1f3fb.svg\");\n}\nem[data-emoji=\":raised_hand_tone2:\"]::before,\nem[data-emoji=\"raised_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b-1f3fc.svg\");\n}\nem[data-emoji=\":raised_hand_tone3:\"]::before,\nem[data-emoji=\"raised_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b-1f3fd.svg\");\n}\nem[data-emoji=\":raised_hand_tone4:\"]::before,\nem[data-emoji=\"raised_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b-1f3fe.svg\");\n}\nem[data-emoji=\":raised_hand_tone5:\"]::before,\nem[data-emoji=\"raised_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b-1f3ff.svg\");\n}\nem[data-emoji=\":raised_back_of_hand:\"]::before,\nem[data-emoji=\"raised_back_of_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a.svg\");\n}\nem[data-emoji=\":raised_back_of_hand_tone1:\"]::before,\nem[data-emoji=\"raised_back_of_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a-1f3fb.svg\");\n}\nem[data-emoji=\":raised_back_of_hand_tone2:\"]::before,\nem[data-emoji=\"raised_back_of_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a-1f3fc.svg\");\n}\nem[data-emoji=\":raised_back_of_hand_tone3:\"]::before,\nem[data-emoji=\"raised_back_of_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a-1f3fd.svg\");\n}\nem[data-emoji=\":raised_back_of_hand_tone4:\"]::before,\nem[data-emoji=\"raised_back_of_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a-1f3fe.svg\");\n}\nem[data-emoji=\":raised_back_of_hand_tone5:\"]::before,\nem[data-emoji=\"raised_back_of_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a-1f3ff.svg\");\n}\nem[data-emoji=\":hand_splayed:\"]::before,\nem[data-emoji=\"hand_splayed\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590.svg\");\n}\nem[data-emoji=\":hand_splayed_tone1:\"]::before,\nem[data-emoji=\"hand_splayed_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590-1f3fb.svg\");\n}\nem[data-emoji=\":hand_splayed_tone2:\"]::before,\nem[data-emoji=\"hand_splayed_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590-1f3fc.svg\");\n}\nem[data-emoji=\":hand_splayed_tone3:\"]::before,\nem[data-emoji=\"hand_splayed_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590-1f3fd.svg\");\n}\nem[data-emoji=\":hand_splayed_tone4:\"]::before,\nem[data-emoji=\"hand_splayed_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590-1f3fe.svg\");\n}\nem[data-emoji=\":hand_splayed_tone5:\"]::before,\nem[data-emoji=\"hand_splayed_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590-1f3ff.svg\");\n}\nem[data-emoji=\":vulcan:\"]::before,\nem[data-emoji=\"vulcan\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596.svg\");\n}\nem[data-emoji=\":vulcan_tone1:\"]::before,\nem[data-emoji=\"vulcan_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596-1f3fb.svg\");\n}\nem[data-emoji=\":vulcan_tone2:\"]::before,\nem[data-emoji=\"vulcan_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596-1f3fc.svg\");\n}\nem[data-emoji=\":vulcan_tone3:\"]::before,\nem[data-emoji=\"vulcan_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596-1f3fd.svg\");\n}\nem[data-emoji=\":vulcan_tone4:\"]::before,\nem[data-emoji=\"vulcan_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596-1f3fe.svg\");\n}\nem[data-emoji=\":vulcan_tone5:\"]::before,\nem[data-emoji=\"vulcan_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596-1f3ff.svg\");\n}\nem[data-emoji=\":wave:\"]::before,\nem[data-emoji=\"wave\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b.svg\");\n}\nem[data-emoji=\":wave_tone1:\"]::before,\nem[data-emoji=\"wave_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b-1f3fb.svg\");\n}\nem[data-emoji=\":wave_tone2:\"]::before,\nem[data-emoji=\"wave_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b-1f3fc.svg\");\n}\nem[data-emoji=\":wave_tone3:\"]::before,\nem[data-emoji=\"wave_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b-1f3fd.svg\");\n}\nem[data-emoji=\":wave_tone4:\"]::before,\nem[data-emoji=\"wave_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b-1f3fe.svg\");\n}\nem[data-emoji=\":wave_tone5:\"]::before,\nem[data-emoji=\"wave_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b-1f3ff.svg\");\n}\nem[data-emoji=\":call_me:\"]::before,\nem[data-emoji=\"call_me\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919.svg\");\n}\nem[data-emoji=\":call_me_tone1:\"]::before,\nem[data-emoji=\"call_me_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919-1f3fb.svg\");\n}\nem[data-emoji=\":call_me_tone2:\"]::before,\nem[data-emoji=\"call_me_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919-1f3fc.svg\");\n}\nem[data-emoji=\":call_me_tone3:\"]::before,\nem[data-emoji=\"call_me_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919-1f3fd.svg\");\n}\nem[data-emoji=\":call_me_tone4:\"]::before,\nem[data-emoji=\"call_me_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919-1f3fe.svg\");\n}\nem[data-emoji=\":call_me_tone5:\"]::before,\nem[data-emoji=\"call_me_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919-1f3ff.svg\");\n}\nem[data-emoji=\":leftwards_hand:\"]::before,\nem[data-emoji=\"leftwards_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2.svg\");\n}\nem[data-emoji=\":leftwards_hand_tone1:\"]::before,\nem[data-emoji=\"leftwards_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2-1f3fb.svg\");\n}\nem[data-emoji=\":leftwards_hand_tone2:\"]::before,\nem[data-emoji=\"leftwards_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2-1f3fc.svg\");\n}\nem[data-emoji=\":leftwards_hand_tone3:\"]::before,\nem[data-emoji=\"leftwards_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2-1f3fd.svg\");\n}\nem[data-emoji=\":leftwards_hand_tone4:\"]::before,\nem[data-emoji=\"leftwards_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2-1f3fe.svg\");\n}\nem[data-emoji=\":leftwards_hand_tone5:\"]::before,\nem[data-emoji=\"leftwards_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2-1f3ff.svg\");\n}\nem[data-emoji=\":rightwards_hand:\"]::before,\nem[data-emoji=\"rightwards_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1.svg\");\n}\nem[data-emoji=\":rightwards_hand_tone1:\"]::before,\nem[data-emoji=\"rightwards_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fb.svg\");\n}\nem[data-emoji=\":rightwards_hand_tone2:\"]::before,\nem[data-emoji=\"rightwards_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fc.svg\");\n}\nem[data-emoji=\":rightwards_hand_tone3:\"]::before,\nem[data-emoji=\"rightwards_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fd.svg\");\n}\nem[data-emoji=\":rightwards_hand_tone4:\"]::before,\nem[data-emoji=\"rightwards_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fe.svg\");\n}\nem[data-emoji=\":rightwards_hand_tone5:\"]::before,\nem[data-emoji=\"rightwards_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3ff.svg\");\n}\nem[data-emoji=\":muscle:\"]::before,\nem[data-emoji=\"muscle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa.svg\");\n}\nem[data-emoji=\":muscle_tone1:\"]::before,\nem[data-emoji=\"muscle_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa-1f3fb.svg\");\n}\nem[data-emoji=\":muscle_tone2:\"]::before,\nem[data-emoji=\"muscle_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa-1f3fc.svg\");\n}\nem[data-emoji=\":muscle_tone3:\"]::before,\nem[data-emoji=\"muscle_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa-1f3fd.svg\");\n}\nem[data-emoji=\":muscle_tone4:\"]::before,\nem[data-emoji=\"muscle_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa-1f3fe.svg\");\n}\nem[data-emoji=\":muscle_tone5:\"]::before,\nem[data-emoji=\"muscle_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa-1f3ff.svg\");\n}\nem[data-emoji=\":mechanical_arm:\"]::before,\nem[data-emoji=\"mechanical_arm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9be.svg\");\n}\nem[data-emoji=\":middle_finger:\"]::before,\nem[data-emoji=\"middle_finger\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595.svg\");\n}\nem[data-emoji=\":middle_finger_tone1:\"]::before,\nem[data-emoji=\"middle_finger_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595-1f3fb.svg\");\n}\nem[data-emoji=\":middle_finger_tone2:\"]::before,\nem[data-emoji=\"middle_finger_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595-1f3fc.svg\");\n}\nem[data-emoji=\":middle_finger_tone3:\"]::before,\nem[data-emoji=\"middle_finger_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595-1f3fd.svg\");\n}\nem[data-emoji=\":middle_finger_tone4:\"]::before,\nem[data-emoji=\"middle_finger_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595-1f3fe.svg\");\n}\nem[data-emoji=\":middle_finger_tone5:\"]::before,\nem[data-emoji=\"middle_finger_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595-1f3ff.svg\");\n}\nem[data-emoji=\":writing_hand:\"]::before,\nem[data-emoji=\"writing_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d.svg\");\n}\nem[data-emoji=\":writing_hand_tone1:\"]::before,\nem[data-emoji=\"writing_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d-1f3fb.svg\");\n}\nem[data-emoji=\":writing_hand_tone2:\"]::before,\nem[data-emoji=\"writing_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d-1f3fc.svg\");\n}\nem[data-emoji=\":writing_hand_tone3:\"]::before,\nem[data-emoji=\"writing_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d-1f3fd.svg\");\n}\nem[data-emoji=\":writing_hand_tone4:\"]::before,\nem[data-emoji=\"writing_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d-1f3fe.svg\");\n}\nem[data-emoji=\":writing_hand_tone5:\"]::before,\nem[data-emoji=\"writing_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d-1f3ff.svg\");\n}\nem[data-emoji=\":pray:\"]::before,\nem[data-emoji=\"pray\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f.svg\");\n}\nem[data-emoji=\":pray_tone1:\"]::before,\nem[data-emoji=\"pray_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f-1f3fb.svg\");\n}\nem[data-emoji=\":pray_tone2:\"]::before,\nem[data-emoji=\"pray_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f-1f3fc.svg\");\n}\nem[data-emoji=\":pray_tone3:\"]::before,\nem[data-emoji=\"pray_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f-1f3fd.svg\");\n}\nem[data-emoji=\":pray_tone4:\"]::before,\nem[data-emoji=\"pray_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f-1f3fe.svg\");\n}\nem[data-emoji=\":pray_tone5:\"]::before,\nem[data-emoji=\"pray_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f-1f3ff.svg\");\n}\nem[data-emoji=\":index_pointing_at_the_viewer:\"]::before,\nem[data-emoji=\"index_pointing_at_the_viewer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5.svg\");\n}\nem[data-emoji=\":index_pointing_at_the_viewer_tone1:\"]::before,\nem[data-emoji=\"index_pointing_at_the_viewer_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5-1f3fb.svg\");\n}\nem[data-emoji=\":index_pointing_at_the_viewer_tone2:\"]::before,\nem[data-emoji=\"index_pointing_at_the_viewer_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5-1f3fc.svg\");\n}\nem[data-emoji=\":index_pointing_at_the_viewer_tone3:\"]::before,\nem[data-emoji=\"index_pointing_at_the_viewer_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5-1f3fd.svg\");\n}\nem[data-emoji=\":index_pointing_at_the_viewer_tone4:\"]::before,\nem[data-emoji=\"index_pointing_at_the_viewer_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5-1f3fe.svg\");\n}\nem[data-emoji=\":index_pointing_at_the_viewer_tone5:\"]::before,\nem[data-emoji=\"index_pointing_at_the_viewer_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5-1f3ff.svg\");\n}\nem[data-emoji=\":foot:\"]::before,\nem[data-emoji=\"foot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6.svg\");\n}\nem[data-emoji=\":foot_tone1:\"]::before,\nem[data-emoji=\"foot_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6-1f3fb.svg\");\n}\nem[data-emoji=\":foot_tone2:\"]::before,\nem[data-emoji=\"foot_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6-1f3fc.svg\");\n}\nem[data-emoji=\":foot_tone3:\"]::before,\nem[data-emoji=\"foot_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6-1f3fd.svg\");\n}\nem[data-emoji=\":foot_tone4:\"]::before,\nem[data-emoji=\"foot_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6-1f3fe.svg\");\n}\nem[data-emoji=\":foot_tone5:\"]::before,\nem[data-emoji=\"foot_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6-1f3ff.svg\");\n}\nem[data-emoji=\":leg:\"]::before,\nem[data-emoji=\"leg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5.svg\");\n}\nem[data-emoji=\":leg_tone1:\"]::before,\nem[data-emoji=\"leg_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5-1f3fb.svg\");\n}\nem[data-emoji=\":leg_tone2:\"]::before,\nem[data-emoji=\"leg_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5-1f3fc.svg\");\n}\nem[data-emoji=\":leg_tone3:\"]::before,\nem[data-emoji=\"leg_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5-1f3fd.svg\");\n}\nem[data-emoji=\":leg_tone4:\"]::before,\nem[data-emoji=\"leg_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5-1f3fe.svg\");\n}\nem[data-emoji=\":leg_tone5:\"]::before,\nem[data-emoji=\"leg_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5-1f3ff.svg\");\n}\nem[data-emoji=\":mechanical_leg:\"]::before,\nem[data-emoji=\"mechanical_leg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bf.svg\");\n}\nem[data-emoji=\":lipstick:\"]::before,\nem[data-emoji=\"lipstick\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f484.svg\");\n}\nem[data-emoji=\":kiss:\"]::before,\nem[data-emoji=\"kiss\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48b.svg\");\n}\nem[data-emoji=\":lips:\"]::before,\nem[data-emoji=\"lips\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f444.svg\");\n}\nem[data-emoji=\":biting_lip:\"]::before,\nem[data-emoji=\"biting_lip\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae6.svg\");\n}\nem[data-emoji=\":tooth:\"]::before,\nem[data-emoji=\"tooth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b7.svg\");\n}\nem[data-emoji=\":tongue:\"]::before,\nem[data-emoji=\"tongue\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f445.svg\");\n}\nem[data-emoji=\":ear:\"]::before,\nem[data-emoji=\"ear\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442.svg\");\n}\nem[data-emoji=\":ear_tone1:\"]::before,\nem[data-emoji=\"ear_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442-1f3fb.svg\");\n}\nem[data-emoji=\":ear_tone2:\"]::before,\nem[data-emoji=\"ear_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442-1f3fc.svg\");\n}\nem[data-emoji=\":ear_tone3:\"]::before,\nem[data-emoji=\"ear_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442-1f3fd.svg\");\n}\nem[data-emoji=\":ear_tone4:\"]::before,\nem[data-emoji=\"ear_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442-1f3fe.svg\");\n}\nem[data-emoji=\":ear_tone5:\"]::before,\nem[data-emoji=\"ear_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442-1f3ff.svg\");\n}\nem[data-emoji=\":ear_with_hearing_aid:\"]::before,\nem[data-emoji=\"ear_with_hearing_aid\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb.svg\");\n}\nem[data-emoji=\":ear_with_hearing_aid_tone1:\"]::before,\nem[data-emoji=\"ear_with_hearing_aid_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb-1f3fb.svg\");\n}\nem[data-emoji=\":ear_with_hearing_aid_tone2:\"]::before,\nem[data-emoji=\"ear_with_hearing_aid_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb-1f3fc.svg\");\n}\nem[data-emoji=\":ear_with_hearing_aid_tone3:\"]::before,\nem[data-emoji=\"ear_with_hearing_aid_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb-1f3fd.svg\");\n}\nem[data-emoji=\":ear_with_hearing_aid_tone4:\"]::before,\nem[data-emoji=\"ear_with_hearing_aid_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb-1f3fe.svg\");\n}\nem[data-emoji=\":ear_with_hearing_aid_tone5:\"]::before,\nem[data-emoji=\"ear_with_hearing_aid_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb-1f3ff.svg\");\n}\nem[data-emoji=\":nose:\"]::before,\nem[data-emoji=\"nose\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443.svg\");\n}\nem[data-emoji=\":nose_tone1:\"]::before,\nem[data-emoji=\"nose_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443-1f3fb.svg\");\n}\nem[data-emoji=\":nose_tone2:\"]::before,\nem[data-emoji=\"nose_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443-1f3fc.svg\");\n}\nem[data-emoji=\":nose_tone3:\"]::before,\nem[data-emoji=\"nose_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443-1f3fd.svg\");\n}\nem[data-emoji=\":nose_tone4:\"]::before,\nem[data-emoji=\"nose_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443-1f3fe.svg\");\n}\nem[data-emoji=\":nose_tone5:\"]::before,\nem[data-emoji=\"nose_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443-1f3ff.svg\");\n}\nem[data-emoji=\":footprints:\"]::before,\nem[data-emoji=\"footprints\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f463.svg\");\n}\nem[data-emoji=\":eye:\"]::before,\nem[data-emoji=\"eye\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f441.svg\");\n}\nem[data-emoji=\":eyes:\"]::before,\nem[data-emoji=\"eyes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f440.svg\");\n}\nem[data-emoji=\":anatomical_heart:\"]::before,\nem[data-emoji=\"anatomical_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac0.svg\");\n}\nem[data-emoji=\":lungs:\"]::before,\nem[data-emoji=\"lungs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac1.svg\");\n}\nem[data-emoji=\":brain:\"]::before,\nem[data-emoji=\"brain\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e0.svg\");\n}\nem[data-emoji=\":speaking_head:\"]::before,\nem[data-emoji=\"speaking_head\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5e3.svg\");\n}\nem[data-emoji=\":bust_in_silhouette:\"]::before,\nem[data-emoji=\"bust_in_silhouette\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f464.svg\");\n}\nem[data-emoji=\":busts_in_silhouette:\"]::before,\nem[data-emoji=\"busts_in_silhouette\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f465.svg\");\n}\nem[data-emoji=\":people_hugging:\"]::before,\nem[data-emoji=\"people_hugging\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac2.svg\");\n}\nem[data-emoji=\":baby:\"]::before,\nem[data-emoji=\"baby\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476.svg\");\n}\nem[data-emoji=\":baby_tone1:\"]::before,\nem[data-emoji=\"baby_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476-1f3fb.svg\");\n}\nem[data-emoji=\":baby_tone2:\"]::before,\nem[data-emoji=\"baby_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476-1f3fc.svg\");\n}\nem[data-emoji=\":baby_tone3:\"]::before,\nem[data-emoji=\"baby_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476-1f3fd.svg\");\n}\nem[data-emoji=\":baby_tone4:\"]::before,\nem[data-emoji=\"baby_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476-1f3fe.svg\");\n}\nem[data-emoji=\":baby_tone5:\"]::before,\nem[data-emoji=\"baby_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476-1f3ff.svg\");\n}\nem[data-emoji=\":child:\"]::before,\nem[data-emoji=\"child\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2.svg\");\n}\nem[data-emoji=\":child_tone1:\"]::before,\nem[data-emoji=\"child_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2-1f3fb.svg\");\n}\nem[data-emoji=\":child_tone2:\"]::before,\nem[data-emoji=\"child_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2-1f3fc.svg\");\n}\nem[data-emoji=\":child_tone3:\"]::before,\nem[data-emoji=\"child_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2-1f3fd.svg\");\n}\nem[data-emoji=\":child_tone4:\"]::before,\nem[data-emoji=\"child_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2-1f3fe.svg\");\n}\nem[data-emoji=\":child_tone5:\"]::before,\nem[data-emoji=\"child_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2-1f3ff.svg\");\n}\nem[data-emoji=\":girl:\"]::before,\nem[data-emoji=\"girl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467.svg\");\n}\nem[data-emoji=\":girl_tone1:\"]::before,\nem[data-emoji=\"girl_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467-1f3fb.svg\");\n}\nem[data-emoji=\":girl_tone2:\"]::before,\nem[data-emoji=\"girl_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467-1f3fc.svg\");\n}\nem[data-emoji=\":girl_tone3:\"]::before,\nem[data-emoji=\"girl_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467-1f3fd.svg\");\n}\nem[data-emoji=\":girl_tone4:\"]::before,\nem[data-emoji=\"girl_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467-1f3fe.svg\");\n}\nem[data-emoji=\":girl_tone5:\"]::before,\nem[data-emoji=\"girl_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467-1f3ff.svg\");\n}\nem[data-emoji=\":boy:\"]::before,\nem[data-emoji=\"boy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466.svg\");\n}\nem[data-emoji=\":boy_tone1:\"]::before,\nem[data-emoji=\"boy_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466-1f3fb.svg\");\n}\nem[data-emoji=\":boy_tone2:\"]::before,\nem[data-emoji=\"boy_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466-1f3fc.svg\");\n}\nem[data-emoji=\":boy_tone3:\"]::before,\nem[data-emoji=\"boy_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466-1f3fd.svg\");\n}\nem[data-emoji=\":boy_tone4:\"]::before,\nem[data-emoji=\"boy_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466-1f3fe.svg\");\n}\nem[data-emoji=\":boy_tone5:\"]::before,\nem[data-emoji=\"boy_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466-1f3ff.svg\");\n}\nem[data-emoji=\":adult:\"]::before,\nem[data-emoji=\"adult\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1.svg\");\n}\nem[data-emoji=\":adult_tone1:\"]::before,\nem[data-emoji=\"adult_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":adult_tone2:\"]::before,\nem[data-emoji=\"adult_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":adult_tone3:\"]::before,\nem[data-emoji=\"adult_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":adult_tone4:\"]::before,\nem[data-emoji=\"adult_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":adult_tone5:\"]::before,\nem[data-emoji=\"adult_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":woman:\"]::before,\nem[data-emoji=\"woman\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469.svg\");\n}\nem[data-emoji=\":woman_tone1:\"]::before,\nem[data-emoji=\"woman_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb.svg\");\n}\nem[data-emoji=\":woman_tone2:\"]::before,\nem[data-emoji=\"woman_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc.svg\");\n}\nem[data-emoji=\":woman_tone3:\"]::before,\nem[data-emoji=\"woman_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd.svg\");\n}\nem[data-emoji=\":woman_tone4:\"]::before,\nem[data-emoji=\"woman_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe.svg\");\n}\nem[data-emoji=\":woman_tone5:\"]::before,\nem[data-emoji=\"woman_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff.svg\");\n}\nem[data-emoji=\":man:\"]::before,\nem[data-emoji=\"man\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468.svg\");\n}\nem[data-emoji=\":man_tone1:\"]::before,\nem[data-emoji=\"man_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb.svg\");\n}\nem[data-emoji=\":man_tone2:\"]::before,\nem[data-emoji=\"man_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc.svg\");\n}\nem[data-emoji=\":man_tone3:\"]::before,\nem[data-emoji=\"man_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd.svg\");\n}\nem[data-emoji=\":man_tone4:\"]::before,\nem[data-emoji=\"man_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe.svg\");\n}\nem[data-emoji=\":man_tone5:\"]::before,\nem[data-emoji=\"man_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff.svg\");\n}\nem[data-emoji=\":person_curly_hair:\"]::before,\nem[data-emoji=\"person_curly_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9b1.svg\");\n}\nem[data-emoji=\":person_tone1_curly_hair:\"]::before,\nem[data-emoji=\"person_tone1_curly_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9b1.svg\");\n}\nem[data-emoji=\":person_tone2_curly_hair:\"]::before,\nem[data-emoji=\"person_tone2_curly_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9b1.svg\");\n}\nem[data-emoji=\":person_tone3_curly_hair:\"]::before,\nem[data-emoji=\"person_tone3_curly_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9b1.svg\");\n}\nem[data-emoji=\":person_tone4_curly_hair:\"]::before,\nem[data-emoji=\"person_tone4_curly_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9b1.svg\");\n}\nem[data-emoji=\":person_tone5_curly_hair:\"]::before,\nem[data-emoji=\"person_tone5_curly_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9b1.svg\");\n}\nem[data-emoji=\":woman_curly_haired:\"]::before,\nem[data-emoji=\"woman_curly_haired\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9b1.svg\");\n}\nem[data-emoji=\":woman_curly_haired_tone1:\"]::before,\nem[data-emoji=\"woman_curly_haired_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9b1.svg\");\n}\nem[data-emoji=\":woman_curly_haired_tone2:\"]::before,\nem[data-emoji=\"woman_curly_haired_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9b1.svg\");\n}\nem[data-emoji=\":woman_curly_haired_tone3:\"]::before,\nem[data-emoji=\"woman_curly_haired_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9b1.svg\");\n}\nem[data-emoji=\":woman_curly_haired_tone4:\"]::before,\nem[data-emoji=\"woman_curly_haired_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9b1.svg\");\n}\nem[data-emoji=\":woman_curly_haired_tone5:\"]::before,\nem[data-emoji=\"woman_curly_haired_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9b1.svg\");\n}\nem[data-emoji=\":man_curly_haired:\"]::before,\nem[data-emoji=\"man_curly_haired\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9b1.svg\");\n}\nem[data-emoji=\":man_curly_haired_tone1:\"]::before,\nem[data-emoji=\"man_curly_haired_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9b1.svg\");\n}\nem[data-emoji=\":man_curly_haired_tone2:\"]::before,\nem[data-emoji=\"man_curly_haired_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9b1.svg\");\n}\nem[data-emoji=\":man_curly_haired_tone3:\"]::before,\nem[data-emoji=\"man_curly_haired_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9b1.svg\");\n}\nem[data-emoji=\":man_curly_haired_tone4:\"]::before,\nem[data-emoji=\"man_curly_haired_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9b1.svg\");\n}\nem[data-emoji=\":man_curly_haired_tone5:\"]::before,\nem[data-emoji=\"man_curly_haired_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9b1.svg\");\n}\nem[data-emoji=\":person_red_hair:\"]::before,\nem[data-emoji=\"person_red_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9b0.svg\");\n}\nem[data-emoji=\":person_tone1_red_hair:\"]::before,\nem[data-emoji=\"person_tone1_red_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9b0.svg\");\n}\nem[data-emoji=\":person_tone2_red_hair:\"]::before,\nem[data-emoji=\"person_tone2_red_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9b0.svg\");\n}\nem[data-emoji=\":person_tone3_red_hair:\"]::before,\nem[data-emoji=\"person_tone3_red_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9b0.svg\");\n}\nem[data-emoji=\":person_tone4_red_hair:\"]::before,\nem[data-emoji=\"person_tone4_red_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9b0.svg\");\n}\nem[data-emoji=\":person_tone5_red_hair:\"]::before,\nem[data-emoji=\"person_tone5_red_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9b0.svg\");\n}\nem[data-emoji=\":woman_red_haired:\"]::before,\nem[data-emoji=\"woman_red_haired\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9b0.svg\");\n}\nem[data-emoji=\":woman_red_haired_tone1:\"]::before,\nem[data-emoji=\"woman_red_haired_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9b0.svg\");\n}\nem[data-emoji=\":woman_red_haired_tone2:\"]::before,\nem[data-emoji=\"woman_red_haired_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9b0.svg\");\n}\nem[data-emoji=\":woman_red_haired_tone3:\"]::before,\nem[data-emoji=\"woman_red_haired_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9b0.svg\");\n}\nem[data-emoji=\":woman_red_haired_tone4:\"]::before,\nem[data-emoji=\"woman_red_haired_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9b0.svg\");\n}\nem[data-emoji=\":woman_red_haired_tone5:\"]::before,\nem[data-emoji=\"woman_red_haired_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9b0.svg\");\n}\nem[data-emoji=\":man_red_haired:\"]::before,\nem[data-emoji=\"man_red_haired\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9b0.svg\");\n}\nem[data-emoji=\":man_red_haired_tone1:\"]::before,\nem[data-emoji=\"man_red_haired_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9b0.svg\");\n}\nem[data-emoji=\":man_red_haired_tone2:\"]::before,\nem[data-emoji=\"man_red_haired_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9b0.svg\");\n}\nem[data-emoji=\":man_red_haired_tone3:\"]::before,\nem[data-emoji=\"man_red_haired_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9b0.svg\");\n}\nem[data-emoji=\":man_red_haired_tone4:\"]::before,\nem[data-emoji=\"man_red_haired_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9b0.svg\");\n}\nem[data-emoji=\":man_red_haired_tone5:\"]::before,\nem[data-emoji=\"man_red_haired_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9b0.svg\");\n}\nem[data-emoji=\":blond_haired_person:\"]::before,\nem[data-emoji=\"blond_haired_person\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471.svg\");\n}\nem[data-emoji=\":blond_haired_person_tone1:\"]::before,\nem[data-emoji=\"blond_haired_person_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fb.svg\");\n}\nem[data-emoji=\":blond_haired_person_tone2:\"]::before,\nem[data-emoji=\"blond_haired_person_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fc.svg\");\n}\nem[data-emoji=\":blond_haired_person_tone3:\"]::before,\nem[data-emoji=\"blond_haired_person_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fd.svg\");\n}\nem[data-emoji=\":blond_haired_person_tone4:\"]::before,\nem[data-emoji=\"blond_haired_person_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fe.svg\");\n}\nem[data-emoji=\":blond_haired_person_tone5:\"]::before,\nem[data-emoji=\"blond_haired_person_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3ff.svg\");\n}\nem[data-emoji=\":blond-haired_woman:\"]::before,\nem[data-emoji=\"blond-haired_woman\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":blond-haired_woman_tone1:\"]::before,\nem[data-emoji=\"blond-haired_woman_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":blond-haired_woman_tone2:\"]::before,\nem[data-emoji=\"blond-haired_woman_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":blond-haired_woman_tone3:\"]::before,\nem[data-emoji=\"blond-haired_woman_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":blond-haired_woman_tone4:\"]::before,\nem[data-emoji=\"blond-haired_woman_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":blond-haired_woman_tone5:\"]::before,\nem[data-emoji=\"blond-haired_woman_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":blond-haired_man:\"]::before,\nem[data-emoji=\"blond-haired_man\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":blond-haired_man_tone1:\"]::before,\nem[data-emoji=\"blond-haired_man_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":blond-haired_man_tone2:\"]::before,\nem[data-emoji=\"blond-haired_man_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":blond-haired_man_tone3:\"]::before,\nem[data-emoji=\"blond-haired_man_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":blond-haired_man_tone4:\"]::before,\nem[data-emoji=\"blond-haired_man_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":blond-haired_man_tone5:\"]::before,\nem[data-emoji=\"blond-haired_man_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_white_hair:\"]::before,\nem[data-emoji=\"person_white_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9b3.svg\");\n}\nem[data-emoji=\":person_tone1_white_hair:\"]::before,\nem[data-emoji=\"person_tone1_white_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9b3.svg\");\n}\nem[data-emoji=\":person_tone2_white_hair:\"]::before,\nem[data-emoji=\"person_tone2_white_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9b3.svg\");\n}\nem[data-emoji=\":person_tone3_white_hair:\"]::before,\nem[data-emoji=\"person_tone3_white_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9b3.svg\");\n}\nem[data-emoji=\":person_tone4_white_hair:\"]::before,\nem[data-emoji=\"person_tone4_white_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9b3.svg\");\n}\nem[data-emoji=\":person_tone5_white_hair:\"]::before,\nem[data-emoji=\"person_tone5_white_hair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9b3.svg\");\n}\nem[data-emoji=\":woman_white_haired:\"]::before,\nem[data-emoji=\"woman_white_haired\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9b3.svg\");\n}\nem[data-emoji=\":woman_white_haired_tone1:\"]::before,\nem[data-emoji=\"woman_white_haired_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9b3.svg\");\n}\nem[data-emoji=\":woman_white_haired_tone2:\"]::before,\nem[data-emoji=\"woman_white_haired_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9b3.svg\");\n}\nem[data-emoji=\":woman_white_haired_tone3:\"]::before,\nem[data-emoji=\"woman_white_haired_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9b3.svg\");\n}\nem[data-emoji=\":woman_white_haired_tone4:\"]::before,\nem[data-emoji=\"woman_white_haired_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9b3.svg\");\n}\nem[data-emoji=\":woman_white_haired_tone5:\"]::before,\nem[data-emoji=\"woman_white_haired_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9b3.svg\");\n}\nem[data-emoji=\":man_white_haired:\"]::before,\nem[data-emoji=\"man_white_haired\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9b3.svg\");\n}\nem[data-emoji=\":man_white_haired_tone1:\"]::before,\nem[data-emoji=\"man_white_haired_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9b3.svg\");\n}\nem[data-emoji=\":man_white_haired_tone2:\"]::before,\nem[data-emoji=\"man_white_haired_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9b3.svg\");\n}\nem[data-emoji=\":man_white_haired_tone3:\"]::before,\nem[data-emoji=\"man_white_haired_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9b3.svg\");\n}\nem[data-emoji=\":man_white_haired_tone4:\"]::before,\nem[data-emoji=\"man_white_haired_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9b3.svg\");\n}\nem[data-emoji=\":man_white_haired_tone5:\"]::before,\nem[data-emoji=\"man_white_haired_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9b3.svg\");\n}\nem[data-emoji=\":person_bald:\"]::before,\nem[data-emoji=\"person_bald\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9b2.svg\");\n}\nem[data-emoji=\":person_tone1_bald:\"]::before,\nem[data-emoji=\"person_tone1_bald\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9b2.svg\");\n}\nem[data-emoji=\":person_tone2_bald:\"]::before,\nem[data-emoji=\"person_tone2_bald\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9b2.svg\");\n}\nem[data-emoji=\":person_tone3_bald:\"]::before,\nem[data-emoji=\"person_tone3_bald\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9b2.svg\");\n}\nem[data-emoji=\":person_tone4_bald:\"]::before,\nem[data-emoji=\"person_tone4_bald\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9b2.svg\");\n}\nem[data-emoji=\":person_tone5_bald:\"]::before,\nem[data-emoji=\"person_tone5_bald\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9b2.svg\");\n}\nem[data-emoji=\":woman_bald:\"]::before,\nem[data-emoji=\"woman_bald\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9b2.svg\");\n}\nem[data-emoji=\":woman_bald_tone1:\"]::before,\nem[data-emoji=\"woman_bald_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9b2.svg\");\n}\nem[data-emoji=\":woman_bald_tone2:\"]::before,\nem[data-emoji=\"woman_bald_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9b2.svg\");\n}\nem[data-emoji=\":woman_bald_tone3:\"]::before,\nem[data-emoji=\"woman_bald_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9b2.svg\");\n}\nem[data-emoji=\":woman_bald_tone4:\"]::before,\nem[data-emoji=\"woman_bald_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9b2.svg\");\n}\nem[data-emoji=\":woman_bald_tone5:\"]::before,\nem[data-emoji=\"woman_bald_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9b2.svg\");\n}\nem[data-emoji=\":man_bald:\"]::before,\nem[data-emoji=\"man_bald\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9b2.svg\");\n}\nem[data-emoji=\":man_bald_tone1:\"]::before,\nem[data-emoji=\"man_bald_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9b2.svg\");\n}\nem[data-emoji=\":man_bald_tone2:\"]::before,\nem[data-emoji=\"man_bald_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9b2.svg\");\n}\nem[data-emoji=\":man_bald_tone3:\"]::before,\nem[data-emoji=\"man_bald_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9b2.svg\");\n}\nem[data-emoji=\":man_bald_tone4:\"]::before,\nem[data-emoji=\"man_bald_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9b2.svg\");\n}\nem[data-emoji=\":man_bald_tone5:\"]::before,\nem[data-emoji=\"man_bald_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9b2.svg\");\n}\nem[data-emoji=\":bearded_person:\"]::before,\nem[data-emoji=\"bearded_person\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4.svg\");\n}\nem[data-emoji=\":bearded_person_tone1:\"]::before,\nem[data-emoji=\"bearded_person_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fb.svg\");\n}\nem[data-emoji=\":bearded_person_tone2:\"]::before,\nem[data-emoji=\"bearded_person_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fc.svg\");\n}\nem[data-emoji=\":bearded_person_tone3:\"]::before,\nem[data-emoji=\"bearded_person_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fd.svg\");\n}\nem[data-emoji=\":bearded_person_tone4:\"]::before,\nem[data-emoji=\"bearded_person_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fe.svg\");\n}\nem[data-emoji=\":bearded_person_tone5:\"]::before,\nem[data-emoji=\"bearded_person_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3ff.svg\");\n}\nem[data-emoji=\":woman_beard:\"]::before,\nem[data-emoji=\"woman_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_tone1_beard:\"]::before,\nem[data-emoji=\"woman_tone1_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_tone2_beard:\"]::before,\nem[data-emoji=\"woman_tone2_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_tone3_beard:\"]::before,\nem[data-emoji=\"woman_tone3_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_tone4_beard:\"]::before,\nem[data-emoji=\"woman_tone4_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_tone5_beard:\"]::before,\nem[data-emoji=\"woman_tone5_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_beard:\"]::before,\nem[data-emoji=\"man_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_tone1_beard:\"]::before,\nem[data-emoji=\"man_tone1_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_tone2_beard:\"]::before,\nem[data-emoji=\"man_tone2_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_tone3_beard:\"]::before,\nem[data-emoji=\"man_tone3_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_tone4_beard:\"]::before,\nem[data-emoji=\"man_tone4_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_tone5_beard:\"]::before,\nem[data-emoji=\"man_tone5_beard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":older_adult:\"]::before,\nem[data-emoji=\"older_adult\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3.svg\");\n}\nem[data-emoji=\":older_adult_tone1:\"]::before,\nem[data-emoji=\"older_adult_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3-1f3fb.svg\");\n}\nem[data-emoji=\":older_adult_tone2:\"]::before,\nem[data-emoji=\"older_adult_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3-1f3fc.svg\");\n}\nem[data-emoji=\":older_adult_tone3:\"]::before,\nem[data-emoji=\"older_adult_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3-1f3fd.svg\");\n}\nem[data-emoji=\":older_adult_tone4:\"]::before,\nem[data-emoji=\"older_adult_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3-1f3fe.svg\");\n}\nem[data-emoji=\":older_adult_tone5:\"]::before,\nem[data-emoji=\"older_adult_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3-1f3ff.svg\");\n}\nem[data-emoji=\":older_woman:\"]::before,\nem[data-emoji=\"older_woman\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475.svg\");\n}\nem[data-emoji=\":older_woman_tone1:\"]::before,\nem[data-emoji=\"older_woman_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475-1f3fb.svg\");\n}\nem[data-emoji=\":older_woman_tone2:\"]::before,\nem[data-emoji=\"older_woman_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475-1f3fc.svg\");\n}\nem[data-emoji=\":older_woman_tone3:\"]::before,\nem[data-emoji=\"older_woman_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475-1f3fd.svg\");\n}\nem[data-emoji=\":older_woman_tone4:\"]::before,\nem[data-emoji=\"older_woman_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475-1f3fe.svg\");\n}\nem[data-emoji=\":older_woman_tone5:\"]::before,\nem[data-emoji=\"older_woman_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475-1f3ff.svg\");\n}\nem[data-emoji=\":older_man:\"]::before,\nem[data-emoji=\"older_man\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474.svg\");\n}\nem[data-emoji=\":older_man_tone1:\"]::before,\nem[data-emoji=\"older_man_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474-1f3fb.svg\");\n}\nem[data-emoji=\":older_man_tone2:\"]::before,\nem[data-emoji=\"older_man_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474-1f3fc.svg\");\n}\nem[data-emoji=\":older_man_tone3:\"]::before,\nem[data-emoji=\"older_man_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474-1f3fd.svg\");\n}\nem[data-emoji=\":older_man_tone4:\"]::before,\nem[data-emoji=\"older_man_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474-1f3fe.svg\");\n}\nem[data-emoji=\":older_man_tone5:\"]::before,\nem[data-emoji=\"older_man_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474-1f3ff.svg\");\n}\nem[data-emoji=\":man_with_chinese_cap:\"]::before,\nem[data-emoji=\"man_with_chinese_cap\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472.svg\");\n}\nem[data-emoji=\":man_with_chinese_cap_tone1:\"]::before,\nem[data-emoji=\"man_with_chinese_cap_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472-1f3fb.svg\");\n}\nem[data-emoji=\":man_with_chinese_cap_tone2:\"]::before,\nem[data-emoji=\"man_with_chinese_cap_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472-1f3fc.svg\");\n}\nem[data-emoji=\":man_with_chinese_cap_tone3:\"]::before,\nem[data-emoji=\"man_with_chinese_cap_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472-1f3fd.svg\");\n}\nem[data-emoji=\":man_with_chinese_cap_tone4:\"]::before,\nem[data-emoji=\"man_with_chinese_cap_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472-1f3fe.svg\");\n}\nem[data-emoji=\":man_with_chinese_cap_tone5:\"]::before,\nem[data-emoji=\"man_with_chinese_cap_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472-1f3ff.svg\");\n}\nem[data-emoji=\":person_wearing_turban:\"]::before,\nem[data-emoji=\"person_wearing_turban\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473.svg\");\n}\nem[data-emoji=\":person_wearing_turban_tone1:\"]::before,\nem[data-emoji=\"person_wearing_turban_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fb.svg\");\n}\nem[data-emoji=\":person_wearing_turban_tone2:\"]::before,\nem[data-emoji=\"person_wearing_turban_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fc.svg\");\n}\nem[data-emoji=\":person_wearing_turban_tone3:\"]::before,\nem[data-emoji=\"person_wearing_turban_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fd.svg\");\n}\nem[data-emoji=\":person_wearing_turban_tone4:\"]::before,\nem[data-emoji=\"person_wearing_turban_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fe.svg\");\n}\nem[data-emoji=\":person_wearing_turban_tone5:\"]::before,\nem[data-emoji=\"person_wearing_turban_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3ff.svg\");\n}\nem[data-emoji=\":woman_wearing_turban:\"]::before,\nem[data-emoji=\"woman_wearing_turban\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_wearing_turban_tone1:\"]::before,\nem[data-emoji=\"woman_wearing_turban_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_wearing_turban_tone2:\"]::before,\nem[data-emoji=\"woman_wearing_turban_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_wearing_turban_tone3:\"]::before,\nem[data-emoji=\"woman_wearing_turban_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_wearing_turban_tone4:\"]::before,\nem[data-emoji=\"woman_wearing_turban_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_wearing_turban_tone5:\"]::before,\nem[data-emoji=\"woman_wearing_turban_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_wearing_turban:\"]::before,\nem[data-emoji=\"man_wearing_turban\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_wearing_turban_tone1:\"]::before,\nem[data-emoji=\"man_wearing_turban_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_wearing_turban_tone2:\"]::before,\nem[data-emoji=\"man_wearing_turban_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_wearing_turban_tone3:\"]::before,\nem[data-emoji=\"man_wearing_turban_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_wearing_turban_tone4:\"]::before,\nem[data-emoji=\"man_wearing_turban_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_wearing_turban_tone5:\"]::before,\nem[data-emoji=\"man_wearing_turban_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_headscarf:\"]::before,\nem[data-emoji=\"woman_with_headscarf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5.svg\");\n}\nem[data-emoji=\":woman_with_headscarf_tone1:\"]::before,\nem[data-emoji=\"woman_with_headscarf_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5-1f3fb.svg\");\n}\nem[data-emoji=\":woman_with_headscarf_tone2:\"]::before,\nem[data-emoji=\"woman_with_headscarf_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5-1f3fc.svg\");\n}\nem[data-emoji=\":woman_with_headscarf_tone3:\"]::before,\nem[data-emoji=\"woman_with_headscarf_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5-1f3fd.svg\");\n}\nem[data-emoji=\":woman_with_headscarf_tone4:\"]::before,\nem[data-emoji=\"woman_with_headscarf_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5-1f3fe.svg\");\n}\nem[data-emoji=\":woman_with_headscarf_tone5:\"]::before,\nem[data-emoji=\"woman_with_headscarf_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5-1f3ff.svg\");\n}\nem[data-emoji=\":police_officer:\"]::before,\nem[data-emoji=\"police_officer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e.svg\");\n}\nem[data-emoji=\":police_officer_tone1:\"]::before,\nem[data-emoji=\"police_officer_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fb.svg\");\n}\nem[data-emoji=\":police_officer_tone2:\"]::before,\nem[data-emoji=\"police_officer_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fc.svg\");\n}\nem[data-emoji=\":police_officer_tone3:\"]::before,\nem[data-emoji=\"police_officer_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fd.svg\");\n}\nem[data-emoji=\":police_officer_tone4:\"]::before,\nem[data-emoji=\"police_officer_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fe.svg\");\n}\nem[data-emoji=\":police_officer_tone5:\"]::before,\nem[data-emoji=\"police_officer_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3ff.svg\");\n}\nem[data-emoji=\":woman_police_officer:\"]::before,\nem[data-emoji=\"woman_police_officer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_police_officer_tone1:\"]::before,\nem[data-emoji=\"woman_police_officer_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_police_officer_tone2:\"]::before,\nem[data-emoji=\"woman_police_officer_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_police_officer_tone3:\"]::before,\nem[data-emoji=\"woman_police_officer_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_police_officer_tone4:\"]::before,\nem[data-emoji=\"woman_police_officer_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_police_officer_tone5:\"]::before,\nem[data-emoji=\"woman_police_officer_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_police_officer:\"]::before,\nem[data-emoji=\"man_police_officer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_police_officer_tone1:\"]::before,\nem[data-emoji=\"man_police_officer_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_police_officer_tone2:\"]::before,\nem[data-emoji=\"man_police_officer_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_police_officer_tone3:\"]::before,\nem[data-emoji=\"man_police_officer_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_police_officer_tone4:\"]::before,\nem[data-emoji=\"man_police_officer_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_police_officer_tone5:\"]::before,\nem[data-emoji=\"man_police_officer_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":construction_worker:\"]::before,\nem[data-emoji=\"construction_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477.svg\");\n}\nem[data-emoji=\":construction_worker_tone1:\"]::before,\nem[data-emoji=\"construction_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fb.svg\");\n}\nem[data-emoji=\":construction_worker_tone2:\"]::before,\nem[data-emoji=\"construction_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fc.svg\");\n}\nem[data-emoji=\":construction_worker_tone3:\"]::before,\nem[data-emoji=\"construction_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fd.svg\");\n}\nem[data-emoji=\":construction_worker_tone4:\"]::before,\nem[data-emoji=\"construction_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fe.svg\");\n}\nem[data-emoji=\":construction_worker_tone5:\"]::before,\nem[data-emoji=\"construction_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3ff.svg\");\n}\nem[data-emoji=\":woman_construction_worker:\"]::before,\nem[data-emoji=\"woman_construction_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_construction_worker_tone1:\"]::before,\nem[data-emoji=\"woman_construction_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_construction_worker_tone2:\"]::before,\nem[data-emoji=\"woman_construction_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_construction_worker_tone3:\"]::before,\nem[data-emoji=\"woman_construction_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_construction_worker_tone4:\"]::before,\nem[data-emoji=\"woman_construction_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_construction_worker_tone5:\"]::before,\nem[data-emoji=\"woman_construction_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_construction_worker:\"]::before,\nem[data-emoji=\"man_construction_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_construction_worker_tone1:\"]::before,\nem[data-emoji=\"man_construction_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_construction_worker_tone2:\"]::before,\nem[data-emoji=\"man_construction_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_construction_worker_tone3:\"]::before,\nem[data-emoji=\"man_construction_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_construction_worker_tone4:\"]::before,\nem[data-emoji=\"man_construction_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_construction_worker_tone5:\"]::before,\nem[data-emoji=\"man_construction_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":guard:\"]::before,\nem[data-emoji=\"guard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482.svg\");\n}\nem[data-emoji=\":guard_tone1:\"]::before,\nem[data-emoji=\"guard_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fb.svg\");\n}\nem[data-emoji=\":guard_tone2:\"]::before,\nem[data-emoji=\"guard_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fc.svg\");\n}\nem[data-emoji=\":guard_tone3:\"]::before,\nem[data-emoji=\"guard_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fd.svg\");\n}\nem[data-emoji=\":guard_tone4:\"]::before,\nem[data-emoji=\"guard_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fe.svg\");\n}\nem[data-emoji=\":guard_tone5:\"]::before,\nem[data-emoji=\"guard_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3ff.svg\");\n}\nem[data-emoji=\":woman_guard:\"]::before,\nem[data-emoji=\"woman_guard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_guard_tone1:\"]::before,\nem[data-emoji=\"woman_guard_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_guard_tone2:\"]::before,\nem[data-emoji=\"woman_guard_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_guard_tone3:\"]::before,\nem[data-emoji=\"woman_guard_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_guard_tone4:\"]::before,\nem[data-emoji=\"woman_guard_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_guard_tone5:\"]::before,\nem[data-emoji=\"woman_guard_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_guard:\"]::before,\nem[data-emoji=\"man_guard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_guard_tone1:\"]::before,\nem[data-emoji=\"man_guard_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_guard_tone2:\"]::before,\nem[data-emoji=\"man_guard_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_guard_tone3:\"]::before,\nem[data-emoji=\"man_guard_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_guard_tone4:\"]::before,\nem[data-emoji=\"man_guard_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_guard_tone5:\"]::before,\nem[data-emoji=\"man_guard_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":detective:\"]::before,\nem[data-emoji=\"detective\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575.svg\");\n}\nem[data-emoji=\":detective_tone1:\"]::before,\nem[data-emoji=\"detective_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fb.svg\");\n}\nem[data-emoji=\":detective_tone2:\"]::before,\nem[data-emoji=\"detective_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fc.svg\");\n}\nem[data-emoji=\":detective_tone3:\"]::before,\nem[data-emoji=\"detective_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fd.svg\");\n}\nem[data-emoji=\":detective_tone4:\"]::before,\nem[data-emoji=\"detective_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fe.svg\");\n}\nem[data-emoji=\":detective_tone5:\"]::before,\nem[data-emoji=\"detective_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3ff.svg\");\n}\nem[data-emoji=\":woman_detective:\"]::before,\nem[data-emoji=\"woman_detective\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-fe0f-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_detective_tone1:\"]::before,\nem[data-emoji=\"woman_detective_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_detective_tone2:\"]::before,\nem[data-emoji=\"woman_detective_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_detective_tone3:\"]::before,\nem[data-emoji=\"woman_detective_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_detective_tone4:\"]::before,\nem[data-emoji=\"woman_detective_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_detective_tone5:\"]::before,\nem[data-emoji=\"woman_detective_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_detective:\"]::before,\nem[data-emoji=\"man_detective\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-fe0f-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_detective_tone1:\"]::before,\nem[data-emoji=\"man_detective_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_detective_tone2:\"]::before,\nem[data-emoji=\"man_detective_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_detective_tone3:\"]::before,\nem[data-emoji=\"man_detective_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_detective_tone4:\"]::before,\nem[data-emoji=\"man_detective_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_detective_tone5:\"]::before,\nem[data-emoji=\"man_detective_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":health_worker:\"]::before,\nem[data-emoji=\"health_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":health_worker_tone1:\"]::before,\nem[data-emoji=\"health_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":health_worker_tone2:\"]::before,\nem[data-emoji=\"health_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":health_worker_tone3:\"]::before,\nem[data-emoji=\"health_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":health_worker_tone4:\"]::before,\nem[data-emoji=\"health_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":health_worker_tone5:\"]::before,\nem[data-emoji=\"health_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":woman_health_worker:\"]::before,\nem[data-emoji=\"woman_health_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":woman_health_worker_tone1:\"]::before,\nem[data-emoji=\"woman_health_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":woman_health_worker_tone2:\"]::before,\nem[data-emoji=\"woman_health_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":woman_health_worker_tone3:\"]::before,\nem[data-emoji=\"woman_health_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":woman_health_worker_tone4:\"]::before,\nem[data-emoji=\"woman_health_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":woman_health_worker_tone5:\"]::before,\nem[data-emoji=\"woman_health_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":man_health_worker:\"]::before,\nem[data-emoji=\"man_health_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":man_health_worker_tone1:\"]::before,\nem[data-emoji=\"man_health_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":man_health_worker_tone2:\"]::before,\nem[data-emoji=\"man_health_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":man_health_worker_tone3:\"]::before,\nem[data-emoji=\"man_health_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":man_health_worker_tone4:\"]::before,\nem[data-emoji=\"man_health_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":man_health_worker_tone5:\"]::before,\nem[data-emoji=\"man_health_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2695-fe0f.svg\");\n}\nem[data-emoji=\":farmer:\"]::before,\nem[data-emoji=\"farmer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f33e.svg\");\n}\nem[data-emoji=\":farmer_tone1:\"]::before,\nem[data-emoji=\"farmer_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f33e.svg\");\n}\nem[data-emoji=\":farmer_tone2:\"]::before,\nem[data-emoji=\"farmer_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f33e.svg\");\n}\nem[data-emoji=\":farmer_tone3:\"]::before,\nem[data-emoji=\"farmer_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f33e.svg\");\n}\nem[data-emoji=\":farmer_tone4:\"]::before,\nem[data-emoji=\"farmer_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f33e.svg\");\n}\nem[data-emoji=\":farmer_tone5:\"]::before,\nem[data-emoji=\"farmer_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f33e.svg\");\n}\nem[data-emoji=\":woman_farmer:\"]::before,\nem[data-emoji=\"woman_farmer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f33e.svg\");\n}\nem[data-emoji=\":woman_farmer_tone1:\"]::before,\nem[data-emoji=\"woman_farmer_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f33e.svg\");\n}\nem[data-emoji=\":woman_farmer_tone2:\"]::before,\nem[data-emoji=\"woman_farmer_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f33e.svg\");\n}\nem[data-emoji=\":woman_farmer_tone3:\"]::before,\nem[data-emoji=\"woman_farmer_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f33e.svg\");\n}\nem[data-emoji=\":woman_farmer_tone4:\"]::before,\nem[data-emoji=\"woman_farmer_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f33e.svg\");\n}\nem[data-emoji=\":woman_farmer_tone5:\"]::before,\nem[data-emoji=\"woman_farmer_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f33e.svg\");\n}\nem[data-emoji=\":man_farmer:\"]::before,\nem[data-emoji=\"man_farmer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f33e.svg\");\n}\nem[data-emoji=\":man_farmer_tone1:\"]::before,\nem[data-emoji=\"man_farmer_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f33e.svg\");\n}\nem[data-emoji=\":man_farmer_tone2:\"]::before,\nem[data-emoji=\"man_farmer_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f33e.svg\");\n}\nem[data-emoji=\":man_farmer_tone3:\"]::before,\nem[data-emoji=\"man_farmer_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f33e.svg\");\n}\nem[data-emoji=\":man_farmer_tone4:\"]::before,\nem[data-emoji=\"man_farmer_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f33e.svg\");\n}\nem[data-emoji=\":man_farmer_tone5:\"]::before,\nem[data-emoji=\"man_farmer_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f33e.svg\");\n}\nem[data-emoji=\":cook:\"]::before,\nem[data-emoji=\"cook\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f373.svg\");\n}\nem[data-emoji=\":cook_tone1:\"]::before,\nem[data-emoji=\"cook_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f373.svg\");\n}\nem[data-emoji=\":cook_tone2:\"]::before,\nem[data-emoji=\"cook_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f373.svg\");\n}\nem[data-emoji=\":cook_tone3:\"]::before,\nem[data-emoji=\"cook_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f373.svg\");\n}\nem[data-emoji=\":cook_tone4:\"]::before,\nem[data-emoji=\"cook_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f373.svg\");\n}\nem[data-emoji=\":cook_tone5:\"]::before,\nem[data-emoji=\"cook_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f373.svg\");\n}\nem[data-emoji=\":woman_cook:\"]::before,\nem[data-emoji=\"woman_cook\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f373.svg\");\n}\nem[data-emoji=\":woman_cook_tone1:\"]::before,\nem[data-emoji=\"woman_cook_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f373.svg\");\n}\nem[data-emoji=\":woman_cook_tone2:\"]::before,\nem[data-emoji=\"woman_cook_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f373.svg\");\n}\nem[data-emoji=\":woman_cook_tone3:\"]::before,\nem[data-emoji=\"woman_cook_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f373.svg\");\n}\nem[data-emoji=\":woman_cook_tone4:\"]::before,\nem[data-emoji=\"woman_cook_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f373.svg\");\n}\nem[data-emoji=\":woman_cook_tone5:\"]::before,\nem[data-emoji=\"woman_cook_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f373.svg\");\n}\nem[data-emoji=\":man_cook:\"]::before,\nem[data-emoji=\"man_cook\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f373.svg\");\n}\nem[data-emoji=\":man_cook_tone1:\"]::before,\nem[data-emoji=\"man_cook_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f373.svg\");\n}\nem[data-emoji=\":man_cook_tone2:\"]::before,\nem[data-emoji=\"man_cook_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f373.svg\");\n}\nem[data-emoji=\":man_cook_tone3:\"]::before,\nem[data-emoji=\"man_cook_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f373.svg\");\n}\nem[data-emoji=\":man_cook_tone4:\"]::before,\nem[data-emoji=\"man_cook_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f373.svg\");\n}\nem[data-emoji=\":man_cook_tone5:\"]::before,\nem[data-emoji=\"man_cook_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f373.svg\");\n}\nem[data-emoji=\":student:\"]::before,\nem[data-emoji=\"student\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f393.svg\");\n}\nem[data-emoji=\":student_tone1:\"]::before,\nem[data-emoji=\"student_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f393.svg\");\n}\nem[data-emoji=\":student_tone2:\"]::before,\nem[data-emoji=\"student_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f393.svg\");\n}\nem[data-emoji=\":student_tone3:\"]::before,\nem[data-emoji=\"student_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f393.svg\");\n}\nem[data-emoji=\":student_tone4:\"]::before,\nem[data-emoji=\"student_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f393.svg\");\n}\nem[data-emoji=\":student_tone5:\"]::before,\nem[data-emoji=\"student_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f393.svg\");\n}\nem[data-emoji=\":woman_student:\"]::before,\nem[data-emoji=\"woman_student\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f393.svg\");\n}\nem[data-emoji=\":woman_student_tone1:\"]::before,\nem[data-emoji=\"woman_student_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f393.svg\");\n}\nem[data-emoji=\":woman_student_tone2:\"]::before,\nem[data-emoji=\"woman_student_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f393.svg\");\n}\nem[data-emoji=\":woman_student_tone3:\"]::before,\nem[data-emoji=\"woman_student_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f393.svg\");\n}\nem[data-emoji=\":woman_student_tone4:\"]::before,\nem[data-emoji=\"woman_student_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f393.svg\");\n}\nem[data-emoji=\":woman_student_tone5:\"]::before,\nem[data-emoji=\"woman_student_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f393.svg\");\n}\nem[data-emoji=\":man_student:\"]::before,\nem[data-emoji=\"man_student\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f393.svg\");\n}\nem[data-emoji=\":man_student_tone1:\"]::before,\nem[data-emoji=\"man_student_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f393.svg\");\n}\nem[data-emoji=\":man_student_tone2:\"]::before,\nem[data-emoji=\"man_student_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f393.svg\");\n}\nem[data-emoji=\":man_student_tone3:\"]::before,\nem[data-emoji=\"man_student_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f393.svg\");\n}\nem[data-emoji=\":man_student_tone4:\"]::before,\nem[data-emoji=\"man_student_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f393.svg\");\n}\nem[data-emoji=\":man_student_tone5:\"]::before,\nem[data-emoji=\"man_student_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f393.svg\");\n}\nem[data-emoji=\":singer:\"]::before,\nem[data-emoji=\"singer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f3a4.svg\");\n}\nem[data-emoji=\":singer_tone1:\"]::before,\nem[data-emoji=\"singer_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f3a4.svg\");\n}\nem[data-emoji=\":singer_tone2:\"]::before,\nem[data-emoji=\"singer_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f3a4.svg\");\n}\nem[data-emoji=\":singer_tone3:\"]::before,\nem[data-emoji=\"singer_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f3a4.svg\");\n}\nem[data-emoji=\":singer_tone4:\"]::before,\nem[data-emoji=\"singer_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f3a4.svg\");\n}\nem[data-emoji=\":singer_tone5:\"]::before,\nem[data-emoji=\"singer_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f3a4.svg\");\n}\nem[data-emoji=\":woman_singer:\"]::before,\nem[data-emoji=\"woman_singer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f3a4.svg\");\n}\nem[data-emoji=\":woman_singer_tone1:\"]::before,\nem[data-emoji=\"woman_singer_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f3a4.svg\");\n}\nem[data-emoji=\":woman_singer_tone2:\"]::before,\nem[data-emoji=\"woman_singer_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f3a4.svg\");\n}\nem[data-emoji=\":woman_singer_tone3:\"]::before,\nem[data-emoji=\"woman_singer_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f3a4.svg\");\n}\nem[data-emoji=\":woman_singer_tone4:\"]::before,\nem[data-emoji=\"woman_singer_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f3a4.svg\");\n}\nem[data-emoji=\":woman_singer_tone5:\"]::before,\nem[data-emoji=\"woman_singer_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f3a4.svg\");\n}\nem[data-emoji=\":man_singer:\"]::before,\nem[data-emoji=\"man_singer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f3a4.svg\");\n}\nem[data-emoji=\":man_singer_tone1:\"]::before,\nem[data-emoji=\"man_singer_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f3a4.svg\");\n}\nem[data-emoji=\":man_singer_tone2:\"]::before,\nem[data-emoji=\"man_singer_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f3a4.svg\");\n}\nem[data-emoji=\":man_singer_tone3:\"]::before,\nem[data-emoji=\"man_singer_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f3a4.svg\");\n}\nem[data-emoji=\":man_singer_tone4:\"]::before,\nem[data-emoji=\"man_singer_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f3a4.svg\");\n}\nem[data-emoji=\":man_singer_tone5:\"]::before,\nem[data-emoji=\"man_singer_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f3a4.svg\");\n}\nem[data-emoji=\":teacher:\"]::before,\nem[data-emoji=\"teacher\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f3eb.svg\");\n}\nem[data-emoji=\":teacher_tone1:\"]::before,\nem[data-emoji=\"teacher_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f3eb.svg\");\n}\nem[data-emoji=\":teacher_tone2:\"]::before,\nem[data-emoji=\"teacher_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f3eb.svg\");\n}\nem[data-emoji=\":teacher_tone3:\"]::before,\nem[data-emoji=\"teacher_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f3eb.svg\");\n}\nem[data-emoji=\":teacher_tone4:\"]::before,\nem[data-emoji=\"teacher_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f3eb.svg\");\n}\nem[data-emoji=\":teacher_tone5:\"]::before,\nem[data-emoji=\"teacher_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f3eb.svg\");\n}\nem[data-emoji=\":woman_teacher:\"]::before,\nem[data-emoji=\"woman_teacher\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f3eb.svg\");\n}\nem[data-emoji=\":woman_teacher_tone1:\"]::before,\nem[data-emoji=\"woman_teacher_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f3eb.svg\");\n}\nem[data-emoji=\":woman_teacher_tone2:\"]::before,\nem[data-emoji=\"woman_teacher_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f3eb.svg\");\n}\nem[data-emoji=\":woman_teacher_tone3:\"]::before,\nem[data-emoji=\"woman_teacher_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f3eb.svg\");\n}\nem[data-emoji=\":woman_teacher_tone4:\"]::before,\nem[data-emoji=\"woman_teacher_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f3eb.svg\");\n}\nem[data-emoji=\":woman_teacher_tone5:\"]::before,\nem[data-emoji=\"woman_teacher_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f3eb.svg\");\n}\nem[data-emoji=\":man_teacher:\"]::before,\nem[data-emoji=\"man_teacher\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f3eb.svg\");\n}\nem[data-emoji=\":man_teacher_tone1:\"]::before,\nem[data-emoji=\"man_teacher_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f3eb.svg\");\n}\nem[data-emoji=\":man_teacher_tone2:\"]::before,\nem[data-emoji=\"man_teacher_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f3eb.svg\");\n}\nem[data-emoji=\":man_teacher_tone3:\"]::before,\nem[data-emoji=\"man_teacher_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f3eb.svg\");\n}\nem[data-emoji=\":man_teacher_tone4:\"]::before,\nem[data-emoji=\"man_teacher_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f3eb.svg\");\n}\nem[data-emoji=\":man_teacher_tone5:\"]::before,\nem[data-emoji=\"man_teacher_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f3eb.svg\");\n}\nem[data-emoji=\":factory_worker:\"]::before,\nem[data-emoji=\"factory_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f3ed.svg\");\n}\nem[data-emoji=\":factory_worker_tone1:\"]::before,\nem[data-emoji=\"factory_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f3ed.svg\");\n}\nem[data-emoji=\":factory_worker_tone2:\"]::before,\nem[data-emoji=\"factory_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f3ed.svg\");\n}\nem[data-emoji=\":factory_worker_tone3:\"]::before,\nem[data-emoji=\"factory_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f3ed.svg\");\n}\nem[data-emoji=\":factory_worker_tone4:\"]::before,\nem[data-emoji=\"factory_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f3ed.svg\");\n}\nem[data-emoji=\":factory_worker_tone5:\"]::before,\nem[data-emoji=\"factory_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f3ed.svg\");\n}\nem[data-emoji=\":woman_factory_worker:\"]::before,\nem[data-emoji=\"woman_factory_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f3ed.svg\");\n}\nem[data-emoji=\":woman_factory_worker_tone1:\"]::before,\nem[data-emoji=\"woman_factory_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f3ed.svg\");\n}\nem[data-emoji=\":woman_factory_worker_tone2:\"]::before,\nem[data-emoji=\"woman_factory_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f3ed.svg\");\n}\nem[data-emoji=\":woman_factory_worker_tone3:\"]::before,\nem[data-emoji=\"woman_factory_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f3ed.svg\");\n}\nem[data-emoji=\":woman_factory_worker_tone4:\"]::before,\nem[data-emoji=\"woman_factory_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f3ed.svg\");\n}\nem[data-emoji=\":woman_factory_worker_tone5:\"]::before,\nem[data-emoji=\"woman_factory_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f3ed.svg\");\n}\nem[data-emoji=\":man_factory_worker:\"]::before,\nem[data-emoji=\"man_factory_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f3ed.svg\");\n}\nem[data-emoji=\":man_factory_worker_tone1:\"]::before,\nem[data-emoji=\"man_factory_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f3ed.svg\");\n}\nem[data-emoji=\":man_factory_worker_tone2:\"]::before,\nem[data-emoji=\"man_factory_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f3ed.svg\");\n}\nem[data-emoji=\":man_factory_worker_tone3:\"]::before,\nem[data-emoji=\"man_factory_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f3ed.svg\");\n}\nem[data-emoji=\":man_factory_worker_tone4:\"]::before,\nem[data-emoji=\"man_factory_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f3ed.svg\");\n}\nem[data-emoji=\":man_factory_worker_tone5:\"]::before,\nem[data-emoji=\"man_factory_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f3ed.svg\");\n}\nem[data-emoji=\":technologist:\"]::before,\nem[data-emoji=\"technologist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f4bb.svg\");\n}\nem[data-emoji=\":technologist_tone1:\"]::before,\nem[data-emoji=\"technologist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f4bb.svg\");\n}\nem[data-emoji=\":technologist_tone2:\"]::before,\nem[data-emoji=\"technologist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f4bb.svg\");\n}\nem[data-emoji=\":technologist_tone3:\"]::before,\nem[data-emoji=\"technologist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f4bb.svg\");\n}\nem[data-emoji=\":technologist_tone4:\"]::before,\nem[data-emoji=\"technologist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f4bb.svg\");\n}\nem[data-emoji=\":technologist_tone5:\"]::before,\nem[data-emoji=\"technologist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f4bb.svg\");\n}\nem[data-emoji=\":woman_technologist:\"]::before,\nem[data-emoji=\"woman_technologist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f4bb.svg\");\n}\nem[data-emoji=\":woman_technologist_tone1:\"]::before,\nem[data-emoji=\"woman_technologist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f4bb.svg\");\n}\nem[data-emoji=\":woman_technologist_tone2:\"]::before,\nem[data-emoji=\"woman_technologist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f4bb.svg\");\n}\nem[data-emoji=\":woman_technologist_tone3:\"]::before,\nem[data-emoji=\"woman_technologist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f4bb.svg\");\n}\nem[data-emoji=\":woman_technologist_tone4:\"]::before,\nem[data-emoji=\"woman_technologist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f4bb.svg\");\n}\nem[data-emoji=\":woman_technologist_tone5:\"]::before,\nem[data-emoji=\"woman_technologist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f4bb.svg\");\n}\nem[data-emoji=\":man_technologist:\"]::before,\nem[data-emoji=\"man_technologist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f4bb.svg\");\n}\nem[data-emoji=\":man_technologist_tone1:\"]::before,\nem[data-emoji=\"man_technologist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f4bb.svg\");\n}\nem[data-emoji=\":man_technologist_tone2:\"]::before,\nem[data-emoji=\"man_technologist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f4bb.svg\");\n}\nem[data-emoji=\":man_technologist_tone3:\"]::before,\nem[data-emoji=\"man_technologist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f4bb.svg\");\n}\nem[data-emoji=\":man_technologist_tone4:\"]::before,\nem[data-emoji=\"man_technologist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f4bb.svg\");\n}\nem[data-emoji=\":man_technologist_tone5:\"]::before,\nem[data-emoji=\"man_technologist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f4bb.svg\");\n}\nem[data-emoji=\":office_worker:\"]::before,\nem[data-emoji=\"office_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f4bc.svg\");\n}\nem[data-emoji=\":office_worker_tone1:\"]::before,\nem[data-emoji=\"office_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f4bc.svg\");\n}\nem[data-emoji=\":office_worker_tone2:\"]::before,\nem[data-emoji=\"office_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f4bc.svg\");\n}\nem[data-emoji=\":office_worker_tone3:\"]::before,\nem[data-emoji=\"office_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f4bc.svg\");\n}\nem[data-emoji=\":office_worker_tone4:\"]::before,\nem[data-emoji=\"office_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f4bc.svg\");\n}\nem[data-emoji=\":office_worker_tone5:\"]::before,\nem[data-emoji=\"office_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f4bc.svg\");\n}\nem[data-emoji=\":woman_office_worker:\"]::before,\nem[data-emoji=\"woman_office_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f4bc.svg\");\n}\nem[data-emoji=\":woman_office_worker_tone1:\"]::before,\nem[data-emoji=\"woman_office_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f4bc.svg\");\n}\nem[data-emoji=\":woman_office_worker_tone2:\"]::before,\nem[data-emoji=\"woman_office_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f4bc.svg\");\n}\nem[data-emoji=\":woman_office_worker_tone3:\"]::before,\nem[data-emoji=\"woman_office_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f4bc.svg\");\n}\nem[data-emoji=\":woman_office_worker_tone4:\"]::before,\nem[data-emoji=\"woman_office_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f4bc.svg\");\n}\nem[data-emoji=\":woman_office_worker_tone5:\"]::before,\nem[data-emoji=\"woman_office_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f4bc.svg\");\n}\nem[data-emoji=\":man_office_worker:\"]::before,\nem[data-emoji=\"man_office_worker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f4bc.svg\");\n}\nem[data-emoji=\":man_office_worker_tone1:\"]::before,\nem[data-emoji=\"man_office_worker_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f4bc.svg\");\n}\nem[data-emoji=\":man_office_worker_tone2:\"]::before,\nem[data-emoji=\"man_office_worker_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f4bc.svg\");\n}\nem[data-emoji=\":man_office_worker_tone3:\"]::before,\nem[data-emoji=\"man_office_worker_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f4bc.svg\");\n}\nem[data-emoji=\":man_office_worker_tone4:\"]::before,\nem[data-emoji=\"man_office_worker_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f4bc.svg\");\n}\nem[data-emoji=\":man_office_worker_tone5:\"]::before,\nem[data-emoji=\"man_office_worker_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f4bc.svg\");\n}\nem[data-emoji=\":mechanic:\"]::before,\nem[data-emoji=\"mechanic\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f527.svg\");\n}\nem[data-emoji=\":mechanic_tone1:\"]::before,\nem[data-emoji=\"mechanic_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f527.svg\");\n}\nem[data-emoji=\":mechanic_tone2:\"]::before,\nem[data-emoji=\"mechanic_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f527.svg\");\n}\nem[data-emoji=\":mechanic_tone3:\"]::before,\nem[data-emoji=\"mechanic_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f527.svg\");\n}\nem[data-emoji=\":mechanic_tone4:\"]::before,\nem[data-emoji=\"mechanic_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f527.svg\");\n}\nem[data-emoji=\":mechanic_tone5:\"]::before,\nem[data-emoji=\"mechanic_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f527.svg\");\n}\nem[data-emoji=\":woman_mechanic:\"]::before,\nem[data-emoji=\"woman_mechanic\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f527.svg\");\n}\nem[data-emoji=\":woman_mechanic_tone1:\"]::before,\nem[data-emoji=\"woman_mechanic_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f527.svg\");\n}\nem[data-emoji=\":woman_mechanic_tone2:\"]::before,\nem[data-emoji=\"woman_mechanic_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f527.svg\");\n}\nem[data-emoji=\":woman_mechanic_tone3:\"]::before,\nem[data-emoji=\"woman_mechanic_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f527.svg\");\n}\nem[data-emoji=\":woman_mechanic_tone4:\"]::before,\nem[data-emoji=\"woman_mechanic_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f527.svg\");\n}\nem[data-emoji=\":woman_mechanic_tone5:\"]::before,\nem[data-emoji=\"woman_mechanic_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f527.svg\");\n}\nem[data-emoji=\":man_mechanic:\"]::before,\nem[data-emoji=\"man_mechanic\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f527.svg\");\n}\nem[data-emoji=\":man_mechanic_tone1:\"]::before,\nem[data-emoji=\"man_mechanic_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f527.svg\");\n}\nem[data-emoji=\":man_mechanic_tone2:\"]::before,\nem[data-emoji=\"man_mechanic_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f527.svg\");\n}\nem[data-emoji=\":man_mechanic_tone3:\"]::before,\nem[data-emoji=\"man_mechanic_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f527.svg\");\n}\nem[data-emoji=\":man_mechanic_tone4:\"]::before,\nem[data-emoji=\"man_mechanic_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f527.svg\");\n}\nem[data-emoji=\":man_mechanic_tone5:\"]::before,\nem[data-emoji=\"man_mechanic_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f527.svg\");\n}\nem[data-emoji=\":scientist:\"]::before,\nem[data-emoji=\"scientist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f52c.svg\");\n}\nem[data-emoji=\":scientist_tone1:\"]::before,\nem[data-emoji=\"scientist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f52c.svg\");\n}\nem[data-emoji=\":scientist_tone2:\"]::before,\nem[data-emoji=\"scientist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f52c.svg\");\n}\nem[data-emoji=\":scientist_tone3:\"]::before,\nem[data-emoji=\"scientist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f52c.svg\");\n}\nem[data-emoji=\":scientist_tone4:\"]::before,\nem[data-emoji=\"scientist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f52c.svg\");\n}\nem[data-emoji=\":scientist_tone5:\"]::before,\nem[data-emoji=\"scientist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f52c.svg\");\n}\nem[data-emoji=\":woman_scientist:\"]::before,\nem[data-emoji=\"woman_scientist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f52c.svg\");\n}\nem[data-emoji=\":woman_scientist_tone1:\"]::before,\nem[data-emoji=\"woman_scientist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f52c.svg\");\n}\nem[data-emoji=\":woman_scientist_tone2:\"]::before,\nem[data-emoji=\"woman_scientist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f52c.svg\");\n}\nem[data-emoji=\":woman_scientist_tone3:\"]::before,\nem[data-emoji=\"woman_scientist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f52c.svg\");\n}\nem[data-emoji=\":woman_scientist_tone4:\"]::before,\nem[data-emoji=\"woman_scientist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f52c.svg\");\n}\nem[data-emoji=\":woman_scientist_tone5:\"]::before,\nem[data-emoji=\"woman_scientist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f52c.svg\");\n}\nem[data-emoji=\":man_scientist:\"]::before,\nem[data-emoji=\"man_scientist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f52c.svg\");\n}\nem[data-emoji=\":man_scientist_tone1:\"]::before,\nem[data-emoji=\"man_scientist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f52c.svg\");\n}\nem[data-emoji=\":man_scientist_tone2:\"]::before,\nem[data-emoji=\"man_scientist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f52c.svg\");\n}\nem[data-emoji=\":man_scientist_tone3:\"]::before,\nem[data-emoji=\"man_scientist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f52c.svg\");\n}\nem[data-emoji=\":man_scientist_tone4:\"]::before,\nem[data-emoji=\"man_scientist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f52c.svg\");\n}\nem[data-emoji=\":man_scientist_tone5:\"]::before,\nem[data-emoji=\"man_scientist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f52c.svg\");\n}\nem[data-emoji=\":artist:\"]::before,\nem[data-emoji=\"artist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f3a8.svg\");\n}\nem[data-emoji=\":artist_tone1:\"]::before,\nem[data-emoji=\"artist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f3a8.svg\");\n}\nem[data-emoji=\":artist_tone2:\"]::before,\nem[data-emoji=\"artist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f3a8.svg\");\n}\nem[data-emoji=\":artist_tone3:\"]::before,\nem[data-emoji=\"artist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f3a8.svg\");\n}\nem[data-emoji=\":artist_tone4:\"]::before,\nem[data-emoji=\"artist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f3a8.svg\");\n}\nem[data-emoji=\":artist_tone5:\"]::before,\nem[data-emoji=\"artist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f3a8.svg\");\n}\nem[data-emoji=\":woman_artist:\"]::before,\nem[data-emoji=\"woman_artist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f3a8.svg\");\n}\nem[data-emoji=\":woman_artist_tone1:\"]::before,\nem[data-emoji=\"woman_artist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f3a8.svg\");\n}\nem[data-emoji=\":woman_artist_tone2:\"]::before,\nem[data-emoji=\"woman_artist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f3a8.svg\");\n}\nem[data-emoji=\":woman_artist_tone3:\"]::before,\nem[data-emoji=\"woman_artist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f3a8.svg\");\n}\nem[data-emoji=\":woman_artist_tone4:\"]::before,\nem[data-emoji=\"woman_artist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f3a8.svg\");\n}\nem[data-emoji=\":woman_artist_tone5:\"]::before,\nem[data-emoji=\"woman_artist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f3a8.svg\");\n}\nem[data-emoji=\":man_artist:\"]::before,\nem[data-emoji=\"man_artist\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f3a8.svg\");\n}\nem[data-emoji=\":man_artist_tone1:\"]::before,\nem[data-emoji=\"man_artist_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f3a8.svg\");\n}\nem[data-emoji=\":man_artist_tone2:\"]::before,\nem[data-emoji=\"man_artist_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f3a8.svg\");\n}\nem[data-emoji=\":man_artist_tone3:\"]::before,\nem[data-emoji=\"man_artist_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f3a8.svg\");\n}\nem[data-emoji=\":man_artist_tone4:\"]::before,\nem[data-emoji=\"man_artist_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f3a8.svg\");\n}\nem[data-emoji=\":man_artist_tone5:\"]::before,\nem[data-emoji=\"man_artist_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f3a8.svg\");\n}\nem[data-emoji=\":firefighter:\"]::before,\nem[data-emoji=\"firefighter\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f692.svg\");\n}\nem[data-emoji=\":firefighter_tone1:\"]::before,\nem[data-emoji=\"firefighter_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f692.svg\");\n}\nem[data-emoji=\":firefighter_tone2:\"]::before,\nem[data-emoji=\"firefighter_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f692.svg\");\n}\nem[data-emoji=\":firefighter_tone3:\"]::before,\nem[data-emoji=\"firefighter_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f692.svg\");\n}\nem[data-emoji=\":firefighter_tone4:\"]::before,\nem[data-emoji=\"firefighter_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f692.svg\");\n}\nem[data-emoji=\":firefighter_tone5:\"]::before,\nem[data-emoji=\"firefighter_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f692.svg\");\n}\nem[data-emoji=\":woman_firefighter:\"]::before,\nem[data-emoji=\"woman_firefighter\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f692.svg\");\n}\nem[data-emoji=\":woman_firefighter_tone1:\"]::before,\nem[data-emoji=\"woman_firefighter_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f692.svg\");\n}\nem[data-emoji=\":woman_firefighter_tone2:\"]::before,\nem[data-emoji=\"woman_firefighter_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f692.svg\");\n}\nem[data-emoji=\":woman_firefighter_tone3:\"]::before,\nem[data-emoji=\"woman_firefighter_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f692.svg\");\n}\nem[data-emoji=\":woman_firefighter_tone4:\"]::before,\nem[data-emoji=\"woman_firefighter_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f692.svg\");\n}\nem[data-emoji=\":woman_firefighter_tone5:\"]::before,\nem[data-emoji=\"woman_firefighter_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f692.svg\");\n}\nem[data-emoji=\":man_firefighter:\"]::before,\nem[data-emoji=\"man_firefighter\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f692.svg\");\n}\nem[data-emoji=\":man_firefighter_tone1:\"]::before,\nem[data-emoji=\"man_firefighter_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f692.svg\");\n}\nem[data-emoji=\":man_firefighter_tone2:\"]::before,\nem[data-emoji=\"man_firefighter_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f692.svg\");\n}\nem[data-emoji=\":man_firefighter_tone3:\"]::before,\nem[data-emoji=\"man_firefighter_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f692.svg\");\n}\nem[data-emoji=\":man_firefighter_tone4:\"]::before,\nem[data-emoji=\"man_firefighter_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f692.svg\");\n}\nem[data-emoji=\":man_firefighter_tone5:\"]::before,\nem[data-emoji=\"man_firefighter_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f692.svg\");\n}\nem[data-emoji=\":pilot:\"]::before,\nem[data-emoji=\"pilot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":pilot_tone1:\"]::before,\nem[data-emoji=\"pilot_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":pilot_tone2:\"]::before,\nem[data-emoji=\"pilot_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":pilot_tone3:\"]::before,\nem[data-emoji=\"pilot_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":pilot_tone4:\"]::before,\nem[data-emoji=\"pilot_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":pilot_tone5:\"]::before,\nem[data-emoji=\"pilot_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":woman_pilot:\"]::before,\nem[data-emoji=\"woman_pilot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":woman_pilot_tone1:\"]::before,\nem[data-emoji=\"woman_pilot_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":woman_pilot_tone2:\"]::before,\nem[data-emoji=\"woman_pilot_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":woman_pilot_tone3:\"]::before,\nem[data-emoji=\"woman_pilot_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":woman_pilot_tone4:\"]::before,\nem[data-emoji=\"woman_pilot_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":woman_pilot_tone5:\"]::before,\nem[data-emoji=\"woman_pilot_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":man_pilot:\"]::before,\nem[data-emoji=\"man_pilot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":man_pilot_tone1:\"]::before,\nem[data-emoji=\"man_pilot_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":man_pilot_tone2:\"]::before,\nem[data-emoji=\"man_pilot_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":man_pilot_tone3:\"]::before,\nem[data-emoji=\"man_pilot_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":man_pilot_tone4:\"]::before,\nem[data-emoji=\"man_pilot_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":man_pilot_tone5:\"]::before,\nem[data-emoji=\"man_pilot_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2708-fe0f.svg\");\n}\nem[data-emoji=\":astronaut:\"]::before,\nem[data-emoji=\"astronaut\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f680.svg\");\n}\nem[data-emoji=\":astronaut_tone1:\"]::before,\nem[data-emoji=\"astronaut_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f680.svg\");\n}\nem[data-emoji=\":astronaut_tone2:\"]::before,\nem[data-emoji=\"astronaut_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f680.svg\");\n}\nem[data-emoji=\":astronaut_tone3:\"]::before,\nem[data-emoji=\"astronaut_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f680.svg\");\n}\nem[data-emoji=\":astronaut_tone4:\"]::before,\nem[data-emoji=\"astronaut_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f680.svg\");\n}\nem[data-emoji=\":astronaut_tone5:\"]::before,\nem[data-emoji=\"astronaut_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f680.svg\");\n}\nem[data-emoji=\":woman_astronaut:\"]::before,\nem[data-emoji=\"woman_astronaut\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f680.svg\");\n}\nem[data-emoji=\":woman_astronaut_tone1:\"]::before,\nem[data-emoji=\"woman_astronaut_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f680.svg\");\n}\nem[data-emoji=\":woman_astronaut_tone2:\"]::before,\nem[data-emoji=\"woman_astronaut_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f680.svg\");\n}\nem[data-emoji=\":woman_astronaut_tone3:\"]::before,\nem[data-emoji=\"woman_astronaut_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f680.svg\");\n}\nem[data-emoji=\":woman_astronaut_tone4:\"]::before,\nem[data-emoji=\"woman_astronaut_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f680.svg\");\n}\nem[data-emoji=\":woman_astronaut_tone5:\"]::before,\nem[data-emoji=\"woman_astronaut_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f680.svg\");\n}\nem[data-emoji=\":man_astronaut:\"]::before,\nem[data-emoji=\"man_astronaut\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f680.svg\");\n}\nem[data-emoji=\":man_astronaut_tone1:\"]::before,\nem[data-emoji=\"man_astronaut_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f680.svg\");\n}\nem[data-emoji=\":man_astronaut_tone2:\"]::before,\nem[data-emoji=\"man_astronaut_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f680.svg\");\n}\nem[data-emoji=\":man_astronaut_tone3:\"]::before,\nem[data-emoji=\"man_astronaut_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f680.svg\");\n}\nem[data-emoji=\":man_astronaut_tone4:\"]::before,\nem[data-emoji=\"man_astronaut_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f680.svg\");\n}\nem[data-emoji=\":man_astronaut_tone5:\"]::before,\nem[data-emoji=\"man_astronaut_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f680.svg\");\n}\nem[data-emoji=\":judge:\"]::before,\nem[data-emoji=\"judge\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":judge_tone1:\"]::before,\nem[data-emoji=\"judge_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":judge_tone2:\"]::before,\nem[data-emoji=\"judge_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":judge_tone3:\"]::before,\nem[data-emoji=\"judge_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":judge_tone4:\"]::before,\nem[data-emoji=\"judge_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":judge_tone5:\"]::before,\nem[data-emoji=\"judge_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":woman_judge:\"]::before,\nem[data-emoji=\"woman_judge\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":woman_judge_tone1:\"]::before,\nem[data-emoji=\"woman_judge_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":woman_judge_tone2:\"]::before,\nem[data-emoji=\"woman_judge_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":woman_judge_tone3:\"]::before,\nem[data-emoji=\"woman_judge_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":woman_judge_tone4:\"]::before,\nem[data-emoji=\"woman_judge_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":woman_judge_tone5:\"]::before,\nem[data-emoji=\"woman_judge_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":man_judge:\"]::before,\nem[data-emoji=\"man_judge\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":man_judge_tone1:\"]::before,\nem[data-emoji=\"man_judge_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":man_judge_tone2:\"]::before,\nem[data-emoji=\"man_judge_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":man_judge_tone3:\"]::before,\nem[data-emoji=\"man_judge_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":man_judge_tone4:\"]::before,\nem[data-emoji=\"man_judge_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":man_judge_tone5:\"]::before,\nem[data-emoji=\"man_judge_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2696-fe0f.svg\");\n}\nem[data-emoji=\":person_with_veil:\"]::before,\nem[data-emoji=\"person_with_veil\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470.svg\");\n}\nem[data-emoji=\":person_with_veil_tone1:\"]::before,\nem[data-emoji=\"person_with_veil_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fb.svg\");\n}\nem[data-emoji=\":person_with_veil_tone2:\"]::before,\nem[data-emoji=\"person_with_veil_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fc.svg\");\n}\nem[data-emoji=\":person_with_veil_tone3:\"]::before,\nem[data-emoji=\"person_with_veil_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fd.svg\");\n}\nem[data-emoji=\":person_with_veil_tone4:\"]::before,\nem[data-emoji=\"person_with_veil_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fe.svg\");\n}\nem[data-emoji=\":person_with_veil_tone5:\"]::before,\nem[data-emoji=\"person_with_veil_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3ff.svg\");\n}\nem[data-emoji=\":woman_with_veil:\"]::before,\nem[data-emoji=\"woman_with_veil\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_veil_tone1:\"]::before,\nem[data-emoji=\"woman_with_veil_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_veil_tone2:\"]::before,\nem[data-emoji=\"woman_with_veil_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_veil_tone3:\"]::before,\nem[data-emoji=\"woman_with_veil_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_veil_tone4:\"]::before,\nem[data-emoji=\"woman_with_veil_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_veil_tone5:\"]::before,\nem[data-emoji=\"woman_with_veil_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_with_veil:\"]::before,\nem[data-emoji=\"man_with_veil\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_with_veil_tone1:\"]::before,\nem[data-emoji=\"man_with_veil_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_with_veil_tone2:\"]::before,\nem[data-emoji=\"man_with_veil_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_with_veil_tone3:\"]::before,\nem[data-emoji=\"man_with_veil_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_with_veil_tone4:\"]::before,\nem[data-emoji=\"man_with_veil_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_with_veil_tone5:\"]::before,\nem[data-emoji=\"man_with_veil_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_in_tuxedo:\"]::before,\nem[data-emoji=\"person_in_tuxedo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935.svg\");\n}\nem[data-emoji=\":person_in_tuxedo_tone1:\"]::before,\nem[data-emoji=\"person_in_tuxedo_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fb.svg\");\n}\nem[data-emoji=\":person_in_tuxedo_tone2:\"]::before,\nem[data-emoji=\"person_in_tuxedo_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fc.svg\");\n}\nem[data-emoji=\":person_in_tuxedo_tone3:\"]::before,\nem[data-emoji=\"person_in_tuxedo_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fd.svg\");\n}\nem[data-emoji=\":person_in_tuxedo_tone4:\"]::before,\nem[data-emoji=\"person_in_tuxedo_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fe.svg\");\n}\nem[data-emoji=\":person_in_tuxedo_tone5:\"]::before,\nem[data-emoji=\"person_in_tuxedo_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3ff.svg\");\n}\nem[data-emoji=\":woman_in_tuxedo:\"]::before,\nem[data-emoji=\"woman_in_tuxedo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_tuxedo_tone1:\"]::before,\nem[data-emoji=\"woman_in_tuxedo_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_tuxedo_tone2:\"]::before,\nem[data-emoji=\"woman_in_tuxedo_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_tuxedo_tone3:\"]::before,\nem[data-emoji=\"woman_in_tuxedo_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_tuxedo_tone4:\"]::before,\nem[data-emoji=\"woman_in_tuxedo_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_tuxedo_tone5:\"]::before,\nem[data-emoji=\"woman_in_tuxedo_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_in_tuxedo:\"]::before,\nem[data-emoji=\"man_in_tuxedo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_tuxedo_tone1:\"]::before,\nem[data-emoji=\"man_in_tuxedo_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_tuxedo_tone2:\"]::before,\nem[data-emoji=\"man_in_tuxedo_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_tuxedo_tone3:\"]::before,\nem[data-emoji=\"man_in_tuxedo_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_tuxedo_tone4:\"]::before,\nem[data-emoji=\"man_in_tuxedo_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_tuxedo_tone5:\"]::before,\nem[data-emoji=\"man_in_tuxedo_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_with_crown:\"]::before,\nem[data-emoji=\"person_with_crown\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5.svg\");\n}\nem[data-emoji=\":person_with_crown_tone1:\"]::before,\nem[data-emoji=\"person_with_crown_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5-1f3fb.svg\");\n}\nem[data-emoji=\":person_with_crown_tone2:\"]::before,\nem[data-emoji=\"person_with_crown_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5-1f3fc.svg\");\n}\nem[data-emoji=\":person_with_crown_tone3:\"]::before,\nem[data-emoji=\"person_with_crown_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5-1f3fd.svg\");\n}\nem[data-emoji=\":person_with_crown_tone4:\"]::before,\nem[data-emoji=\"person_with_crown_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5-1f3fe.svg\");\n}\nem[data-emoji=\":person_with_crown_tone5:\"]::before,\nem[data-emoji=\"person_with_crown_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5-1f3ff.svg\");\n}\nem[data-emoji=\":princess:\"]::before,\nem[data-emoji=\"princess\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478.svg\");\n}\nem[data-emoji=\":princess_tone1:\"]::before,\nem[data-emoji=\"princess_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478-1f3fb.svg\");\n}\nem[data-emoji=\":princess_tone2:\"]::before,\nem[data-emoji=\"princess_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478-1f3fc.svg\");\n}\nem[data-emoji=\":princess_tone3:\"]::before,\nem[data-emoji=\"princess_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478-1f3fd.svg\");\n}\nem[data-emoji=\":princess_tone4:\"]::before,\nem[data-emoji=\"princess_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478-1f3fe.svg\");\n}\nem[data-emoji=\":princess_tone5:\"]::before,\nem[data-emoji=\"princess_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478-1f3ff.svg\");\n}\nem[data-emoji=\":prince:\"]::before,\nem[data-emoji=\"prince\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934.svg\");\n}\nem[data-emoji=\":prince_tone1:\"]::before,\nem[data-emoji=\"prince_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934-1f3fb.svg\");\n}\nem[data-emoji=\":prince_tone2:\"]::before,\nem[data-emoji=\"prince_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934-1f3fc.svg\");\n}\nem[data-emoji=\":prince_tone3:\"]::before,\nem[data-emoji=\"prince_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934-1f3fd.svg\");\n}\nem[data-emoji=\":prince_tone4:\"]::before,\nem[data-emoji=\"prince_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934-1f3fe.svg\");\n}\nem[data-emoji=\":prince_tone5:\"]::before,\nem[data-emoji=\"prince_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934-1f3ff.svg\");\n}\nem[data-emoji=\":superhero:\"]::before,\nem[data-emoji=\"superhero\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8.svg\");\n}\nem[data-emoji=\":superhero_tone1:\"]::before,\nem[data-emoji=\"superhero_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fb.svg\");\n}\nem[data-emoji=\":superhero_tone2:\"]::before,\nem[data-emoji=\"superhero_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fc.svg\");\n}\nem[data-emoji=\":superhero_tone3:\"]::before,\nem[data-emoji=\"superhero_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fd.svg\");\n}\nem[data-emoji=\":superhero_tone4:\"]::before,\nem[data-emoji=\"superhero_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fe.svg\");\n}\nem[data-emoji=\":superhero_tone5:\"]::before,\nem[data-emoji=\"superhero_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3ff.svg\");\n}\nem[data-emoji=\":woman_superhero:\"]::before,\nem[data-emoji=\"woman_superhero\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_superhero_tone1:\"]::before,\nem[data-emoji=\"woman_superhero_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_superhero_tone2:\"]::before,\nem[data-emoji=\"woman_superhero_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_superhero_tone3:\"]::before,\nem[data-emoji=\"woman_superhero_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_superhero_tone4:\"]::before,\nem[data-emoji=\"woman_superhero_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_superhero_tone5:\"]::before,\nem[data-emoji=\"woman_superhero_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_superhero:\"]::before,\nem[data-emoji=\"man_superhero\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_superhero_tone1:\"]::before,\nem[data-emoji=\"man_superhero_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_superhero_tone2:\"]::before,\nem[data-emoji=\"man_superhero_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_superhero_tone3:\"]::before,\nem[data-emoji=\"man_superhero_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_superhero_tone4:\"]::before,\nem[data-emoji=\"man_superhero_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_superhero_tone5:\"]::before,\nem[data-emoji=\"man_superhero_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":supervillain:\"]::before,\nem[data-emoji=\"supervillain\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9.svg\");\n}\nem[data-emoji=\":supervillain_tone1:\"]::before,\nem[data-emoji=\"supervillain_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fb.svg\");\n}\nem[data-emoji=\":supervillain_tone2:\"]::before,\nem[data-emoji=\"supervillain_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fc.svg\");\n}\nem[data-emoji=\":supervillain_tone3:\"]::before,\nem[data-emoji=\"supervillain_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fd.svg\");\n}\nem[data-emoji=\":supervillain_tone4:\"]::before,\nem[data-emoji=\"supervillain_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fe.svg\");\n}\nem[data-emoji=\":supervillain_tone5:\"]::before,\nem[data-emoji=\"supervillain_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3ff.svg\");\n}\nem[data-emoji=\":woman_supervillain:\"]::before,\nem[data-emoji=\"woman_supervillain\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_supervillain_tone1:\"]::before,\nem[data-emoji=\"woman_supervillain_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_supervillain_tone2:\"]::before,\nem[data-emoji=\"woman_supervillain_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_supervillain_tone3:\"]::before,\nem[data-emoji=\"woman_supervillain_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_supervillain_tone4:\"]::before,\nem[data-emoji=\"woman_supervillain_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_supervillain_tone5:\"]::before,\nem[data-emoji=\"woman_supervillain_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_supervillain:\"]::before,\nem[data-emoji=\"man_supervillain\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_supervillain_tone1:\"]::before,\nem[data-emoji=\"man_supervillain_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_supervillain_tone2:\"]::before,\nem[data-emoji=\"man_supervillain_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_supervillain_tone3:\"]::before,\nem[data-emoji=\"man_supervillain_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_supervillain_tone4:\"]::before,\nem[data-emoji=\"man_supervillain_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_supervillain_tone5:\"]::before,\nem[data-emoji=\"man_supervillain_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":ninja:\"]::before,\nem[data-emoji=\"ninja\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977.svg\");\n}\nem[data-emoji=\":ninja_tone1:\"]::before,\nem[data-emoji=\"ninja_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977-1f3fb.svg\");\n}\nem[data-emoji=\":ninja_tone2:\"]::before,\nem[data-emoji=\"ninja_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977-1f3fc.svg\");\n}\nem[data-emoji=\":ninja_tone3:\"]::before,\nem[data-emoji=\"ninja_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977-1f3fd.svg\");\n}\nem[data-emoji=\":ninja_tone4:\"]::before,\nem[data-emoji=\"ninja_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977-1f3fe.svg\");\n}\nem[data-emoji=\":ninja_tone5:\"]::before,\nem[data-emoji=\"ninja_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977-1f3ff.svg\");\n}\nem[data-emoji=\":mx_claus:\"]::before,\nem[data-emoji=\"mx_claus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f384.svg\");\n}\nem[data-emoji=\":mx_claus_tone1:\"]::before,\nem[data-emoji=\"mx_claus_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f384.svg\");\n}\nem[data-emoji=\":mx_claus_tone2:\"]::before,\nem[data-emoji=\"mx_claus_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f384.svg\");\n}\nem[data-emoji=\":mx_claus_tone3:\"]::before,\nem[data-emoji=\"mx_claus_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f384.svg\");\n}\nem[data-emoji=\":mx_claus_tone4:\"]::before,\nem[data-emoji=\"mx_claus_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f384.svg\");\n}\nem[data-emoji=\":mx_claus_tone5:\"]::before,\nem[data-emoji=\"mx_claus_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f384.svg\");\n}\nem[data-emoji=\":mrs_claus:\"]::before,\nem[data-emoji=\"mrs_claus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936.svg\");\n}\nem[data-emoji=\":mrs_claus_tone1:\"]::before,\nem[data-emoji=\"mrs_claus_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936-1f3fb.svg\");\n}\nem[data-emoji=\":mrs_claus_tone2:\"]::before,\nem[data-emoji=\"mrs_claus_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936-1f3fc.svg\");\n}\nem[data-emoji=\":mrs_claus_tone3:\"]::before,\nem[data-emoji=\"mrs_claus_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936-1f3fd.svg\");\n}\nem[data-emoji=\":mrs_claus_tone4:\"]::before,\nem[data-emoji=\"mrs_claus_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936-1f3fe.svg\");\n}\nem[data-emoji=\":mrs_claus_tone5:\"]::before,\nem[data-emoji=\"mrs_claus_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936-1f3ff.svg\");\n}\nem[data-emoji=\":santa:\"]::before,\nem[data-emoji=\"santa\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385.svg\");\n}\nem[data-emoji=\":santa_tone1:\"]::before,\nem[data-emoji=\"santa_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385-1f3fb.svg\");\n}\nem[data-emoji=\":santa_tone2:\"]::before,\nem[data-emoji=\"santa_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385-1f3fc.svg\");\n}\nem[data-emoji=\":santa_tone3:\"]::before,\nem[data-emoji=\"santa_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385-1f3fd.svg\");\n}\nem[data-emoji=\":santa_tone4:\"]::before,\nem[data-emoji=\"santa_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385-1f3fe.svg\");\n}\nem[data-emoji=\":santa_tone5:\"]::before,\nem[data-emoji=\"santa_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385-1f3ff.svg\");\n}\nem[data-emoji=\":mage:\"]::before,\nem[data-emoji=\"mage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9.svg\");\n}\nem[data-emoji=\":mage_tone1:\"]::before,\nem[data-emoji=\"mage_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fb.svg\");\n}\nem[data-emoji=\":mage_tone2:\"]::before,\nem[data-emoji=\"mage_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fc.svg\");\n}\nem[data-emoji=\":mage_tone3:\"]::before,\nem[data-emoji=\"mage_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fd.svg\");\n}\nem[data-emoji=\":mage_tone4:\"]::before,\nem[data-emoji=\"mage_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fe.svg\");\n}\nem[data-emoji=\":mage_tone5:\"]::before,\nem[data-emoji=\"mage_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3ff.svg\");\n}\nem[data-emoji=\":woman_mage:\"]::before,\nem[data-emoji=\"woman_mage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_mage_tone1:\"]::before,\nem[data-emoji=\"woman_mage_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_mage_tone2:\"]::before,\nem[data-emoji=\"woman_mage_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_mage_tone3:\"]::before,\nem[data-emoji=\"woman_mage_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_mage_tone4:\"]::before,\nem[data-emoji=\"woman_mage_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_mage_tone5:\"]::before,\nem[data-emoji=\"woman_mage_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_mage:\"]::before,\nem[data-emoji=\"man_mage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_mage_tone1:\"]::before,\nem[data-emoji=\"man_mage_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_mage_tone2:\"]::before,\nem[data-emoji=\"man_mage_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_mage_tone3:\"]::before,\nem[data-emoji=\"man_mage_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_mage_tone4:\"]::before,\nem[data-emoji=\"man_mage_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_mage_tone5:\"]::before,\nem[data-emoji=\"man_mage_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":elf:\"]::before,\nem[data-emoji=\"elf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd.svg\");\n}\nem[data-emoji=\":elf_tone1:\"]::before,\nem[data-emoji=\"elf_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fb.svg\");\n}\nem[data-emoji=\":elf_tone2:\"]::before,\nem[data-emoji=\"elf_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fc.svg\");\n}\nem[data-emoji=\":elf_tone3:\"]::before,\nem[data-emoji=\"elf_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fd.svg\");\n}\nem[data-emoji=\":elf_tone4:\"]::before,\nem[data-emoji=\"elf_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fe.svg\");\n}\nem[data-emoji=\":elf_tone5:\"]::before,\nem[data-emoji=\"elf_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3ff.svg\");\n}\nem[data-emoji=\":woman_elf:\"]::before,\nem[data-emoji=\"woman_elf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_elf_tone1:\"]::before,\nem[data-emoji=\"woman_elf_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_elf_tone2:\"]::before,\nem[data-emoji=\"woman_elf_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_elf_tone3:\"]::before,\nem[data-emoji=\"woman_elf_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_elf_tone4:\"]::before,\nem[data-emoji=\"woman_elf_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_elf_tone5:\"]::before,\nem[data-emoji=\"woman_elf_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_elf:\"]::before,\nem[data-emoji=\"man_elf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_elf_tone1:\"]::before,\nem[data-emoji=\"man_elf_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_elf_tone2:\"]::before,\nem[data-emoji=\"man_elf_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_elf_tone3:\"]::before,\nem[data-emoji=\"man_elf_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_elf_tone4:\"]::before,\nem[data-emoji=\"man_elf_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_elf_tone5:\"]::before,\nem[data-emoji=\"man_elf_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":troll:\"]::before,\nem[data-emoji=\"troll\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cc.svg\");\n}\nem[data-emoji=\":vampire:\"]::before,\nem[data-emoji=\"vampire\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db.svg\");\n}\nem[data-emoji=\":vampire_tone1:\"]::before,\nem[data-emoji=\"vampire_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fb.svg\");\n}\nem[data-emoji=\":vampire_tone2:\"]::before,\nem[data-emoji=\"vampire_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fc.svg\");\n}\nem[data-emoji=\":vampire_tone3:\"]::before,\nem[data-emoji=\"vampire_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fd.svg\");\n}\nem[data-emoji=\":vampire_tone4:\"]::before,\nem[data-emoji=\"vampire_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fe.svg\");\n}\nem[data-emoji=\":vampire_tone5:\"]::before,\nem[data-emoji=\"vampire_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3ff.svg\");\n}\nem[data-emoji=\":woman_vampire:\"]::before,\nem[data-emoji=\"woman_vampire\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_vampire_tone1:\"]::before,\nem[data-emoji=\"woman_vampire_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_vampire_tone2:\"]::before,\nem[data-emoji=\"woman_vampire_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_vampire_tone3:\"]::before,\nem[data-emoji=\"woman_vampire_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_vampire_tone4:\"]::before,\nem[data-emoji=\"woman_vampire_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_vampire_tone5:\"]::before,\nem[data-emoji=\"woman_vampire_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_vampire:\"]::before,\nem[data-emoji=\"man_vampire\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_vampire_tone1:\"]::before,\nem[data-emoji=\"man_vampire_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_vampire_tone2:\"]::before,\nem[data-emoji=\"man_vampire_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_vampire_tone3:\"]::before,\nem[data-emoji=\"man_vampire_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_vampire_tone4:\"]::before,\nem[data-emoji=\"man_vampire_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_vampire_tone5:\"]::before,\nem[data-emoji=\"man_vampire_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":zombie:\"]::before,\nem[data-emoji=\"zombie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9df.svg\");\n}\nem[data-emoji=\":woman_zombie:\"]::before,\nem[data-emoji=\"woman_zombie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9df-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_zombie:\"]::before,\nem[data-emoji=\"man_zombie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9df-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":genie:\"]::before,\nem[data-emoji=\"genie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9de.svg\");\n}\nem[data-emoji=\":woman_genie:\"]::before,\nem[data-emoji=\"woman_genie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9de-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_genie:\"]::before,\nem[data-emoji=\"man_genie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9de-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":merperson:\"]::before,\nem[data-emoji=\"merperson\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc.svg\");\n}\nem[data-emoji=\":merperson_tone1:\"]::before,\nem[data-emoji=\"merperson_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fb.svg\");\n}\nem[data-emoji=\":merperson_tone2:\"]::before,\nem[data-emoji=\"merperson_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fc.svg\");\n}\nem[data-emoji=\":merperson_tone3:\"]::before,\nem[data-emoji=\"merperson_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fd.svg\");\n}\nem[data-emoji=\":merperson_tone4:\"]::before,\nem[data-emoji=\"merperson_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fe.svg\");\n}\nem[data-emoji=\":merperson_tone5:\"]::before,\nem[data-emoji=\"merperson_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3ff.svg\");\n}\nem[data-emoji=\":mermaid:\"]::before,\nem[data-emoji=\"mermaid\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":mermaid_tone1:\"]::before,\nem[data-emoji=\"mermaid_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":mermaid_tone2:\"]::before,\nem[data-emoji=\"mermaid_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":mermaid_tone3:\"]::before,\nem[data-emoji=\"mermaid_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":mermaid_tone4:\"]::before,\nem[data-emoji=\"mermaid_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":mermaid_tone5:\"]::before,\nem[data-emoji=\"mermaid_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":merman:\"]::before,\nem[data-emoji=\"merman\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":merman_tone1:\"]::before,\nem[data-emoji=\"merman_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":merman_tone2:\"]::before,\nem[data-emoji=\"merman_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":merman_tone3:\"]::before,\nem[data-emoji=\"merman_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":merman_tone4:\"]::before,\nem[data-emoji=\"merman_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":merman_tone5:\"]::before,\nem[data-emoji=\"merman_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":fairy:\"]::before,\nem[data-emoji=\"fairy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da.svg\");\n}\nem[data-emoji=\":fairy_tone1:\"]::before,\nem[data-emoji=\"fairy_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fb.svg\");\n}\nem[data-emoji=\":fairy_tone2:\"]::before,\nem[data-emoji=\"fairy_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fc.svg\");\n}\nem[data-emoji=\":fairy_tone3:\"]::before,\nem[data-emoji=\"fairy_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fd.svg\");\n}\nem[data-emoji=\":fairy_tone4:\"]::before,\nem[data-emoji=\"fairy_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fe.svg\");\n}\nem[data-emoji=\":fairy_tone5:\"]::before,\nem[data-emoji=\"fairy_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3ff.svg\");\n}\nem[data-emoji=\":woman_fairy:\"]::before,\nem[data-emoji=\"woman_fairy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_fairy_tone1:\"]::before,\nem[data-emoji=\"woman_fairy_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_fairy_tone2:\"]::before,\nem[data-emoji=\"woman_fairy_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_fairy_tone3:\"]::before,\nem[data-emoji=\"woman_fairy_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_fairy_tone4:\"]::before,\nem[data-emoji=\"woman_fairy_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_fairy_tone5:\"]::before,\nem[data-emoji=\"woman_fairy_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_fairy:\"]::before,\nem[data-emoji=\"man_fairy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_fairy_tone1:\"]::before,\nem[data-emoji=\"man_fairy_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_fairy_tone2:\"]::before,\nem[data-emoji=\"man_fairy_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_fairy_tone3:\"]::before,\nem[data-emoji=\"man_fairy_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_fairy_tone4:\"]::before,\nem[data-emoji=\"man_fairy_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_fairy_tone5:\"]::before,\nem[data-emoji=\"man_fairy_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":angel:\"]::before,\nem[data-emoji=\"angel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c.svg\");\n}\nem[data-emoji=\":angel_tone1:\"]::before,\nem[data-emoji=\"angel_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c-1f3fb.svg\");\n}\nem[data-emoji=\":angel_tone2:\"]::before,\nem[data-emoji=\"angel_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c-1f3fc.svg\");\n}\nem[data-emoji=\":angel_tone3:\"]::before,\nem[data-emoji=\"angel_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c-1f3fd.svg\");\n}\nem[data-emoji=\":angel_tone4:\"]::before,\nem[data-emoji=\"angel_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c-1f3fe.svg\");\n}\nem[data-emoji=\":angel_tone5:\"]::before,\nem[data-emoji=\"angel_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c-1f3ff.svg\");\n}\nem[data-emoji=\":pregnant_person:\"]::before,\nem[data-emoji=\"pregnant_person\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4.svg\");\n}\nem[data-emoji=\":pregnant_person_tone1:\"]::before,\nem[data-emoji=\"pregnant_person_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4-1f3fb.svg\");\n}\nem[data-emoji=\":pregnant_person_tone2:\"]::before,\nem[data-emoji=\"pregnant_person_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4-1f3fc.svg\");\n}\nem[data-emoji=\":pregnant_person_tone3:\"]::before,\nem[data-emoji=\"pregnant_person_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4-1f3fd.svg\");\n}\nem[data-emoji=\":pregnant_person_tone4:\"]::before,\nem[data-emoji=\"pregnant_person_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4-1f3fe.svg\");\n}\nem[data-emoji=\":pregnant_person_tone5:\"]::before,\nem[data-emoji=\"pregnant_person_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4-1f3ff.svg\");\n}\nem[data-emoji=\":pregnant_woman:\"]::before,\nem[data-emoji=\"pregnant_woman\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930.svg\");\n}\nem[data-emoji=\":pregnant_woman_tone1:\"]::before,\nem[data-emoji=\"pregnant_woman_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930-1f3fb.svg\");\n}\nem[data-emoji=\":pregnant_woman_tone2:\"]::before,\nem[data-emoji=\"pregnant_woman_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930-1f3fc.svg\");\n}\nem[data-emoji=\":pregnant_woman_tone3:\"]::before,\nem[data-emoji=\"pregnant_woman_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930-1f3fd.svg\");\n}\nem[data-emoji=\":pregnant_woman_tone4:\"]::before,\nem[data-emoji=\"pregnant_woman_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930-1f3fe.svg\");\n}\nem[data-emoji=\":pregnant_woman_tone5:\"]::before,\nem[data-emoji=\"pregnant_woman_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930-1f3ff.svg\");\n}\nem[data-emoji=\":pregnant_man:\"]::before,\nem[data-emoji=\"pregnant_man\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3.svg\");\n}\nem[data-emoji=\":pregnant_man_tone1:\"]::before,\nem[data-emoji=\"pregnant_man_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3-1f3fb.svg\");\n}\nem[data-emoji=\":pregnant_man_tone2:\"]::before,\nem[data-emoji=\"pregnant_man_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3-1f3fc.svg\");\n}\nem[data-emoji=\":pregnant_man_tone3:\"]::before,\nem[data-emoji=\"pregnant_man_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3-1f3fd.svg\");\n}\nem[data-emoji=\":pregnant_man_tone4:\"]::before,\nem[data-emoji=\"pregnant_man_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3-1f3fe.svg\");\n}\nem[data-emoji=\":pregnant_man_tone5:\"]::before,\nem[data-emoji=\"pregnant_man_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3-1f3ff.svg\");\n}\nem[data-emoji=\":breast_feeding:\"]::before,\nem[data-emoji=\"breast_feeding\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931.svg\");\n}\nem[data-emoji=\":breast_feeding_tone1:\"]::before,\nem[data-emoji=\"breast_feeding_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931-1f3fb.svg\");\n}\nem[data-emoji=\":breast_feeding_tone2:\"]::before,\nem[data-emoji=\"breast_feeding_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931-1f3fc.svg\");\n}\nem[data-emoji=\":breast_feeding_tone3:\"]::before,\nem[data-emoji=\"breast_feeding_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931-1f3fd.svg\");\n}\nem[data-emoji=\":breast_feeding_tone4:\"]::before,\nem[data-emoji=\"breast_feeding_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931-1f3fe.svg\");\n}\nem[data-emoji=\":breast_feeding_tone5:\"]::before,\nem[data-emoji=\"breast_feeding_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931-1f3ff.svg\");\n}\nem[data-emoji=\":person_feeding_baby:\"]::before,\nem[data-emoji=\"person_feeding_baby\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f37c.svg\");\n}\nem[data-emoji=\":person_feeding_baby_tone1:\"]::before,\nem[data-emoji=\"person_feeding_baby_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f37c.svg\");\n}\nem[data-emoji=\":person_feeding_baby_tone2:\"]::before,\nem[data-emoji=\"person_feeding_baby_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f37c.svg\");\n}\nem[data-emoji=\":person_feeding_baby_tone3:\"]::before,\nem[data-emoji=\"person_feeding_baby_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f37c.svg\");\n}\nem[data-emoji=\":person_feeding_baby_tone4:\"]::before,\nem[data-emoji=\"person_feeding_baby_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f37c.svg\");\n}\nem[data-emoji=\":person_feeding_baby_tone5:\"]::before,\nem[data-emoji=\"person_feeding_baby_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f37c.svg\");\n}\nem[data-emoji=\":woman_feeding_baby:\"]::before,\nem[data-emoji=\"woman_feeding_baby\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f37c.svg\");\n}\nem[data-emoji=\":woman_feeding_baby_tone1:\"]::before,\nem[data-emoji=\"woman_feeding_baby_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f37c.svg\");\n}\nem[data-emoji=\":woman_feeding_baby_tone2:\"]::before,\nem[data-emoji=\"woman_feeding_baby_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f37c.svg\");\n}\nem[data-emoji=\":woman_feeding_baby_tone3:\"]::before,\nem[data-emoji=\"woman_feeding_baby_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f37c.svg\");\n}\nem[data-emoji=\":woman_feeding_baby_tone4:\"]::before,\nem[data-emoji=\"woman_feeding_baby_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f37c.svg\");\n}\nem[data-emoji=\":woman_feeding_baby_tone5:\"]::before,\nem[data-emoji=\"woman_feeding_baby_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f37c.svg\");\n}\nem[data-emoji=\":man_feeding_baby:\"]::before,\nem[data-emoji=\"man_feeding_baby\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f37c.svg\");\n}\nem[data-emoji=\":man_feeding_baby_tone1:\"]::before,\nem[data-emoji=\"man_feeding_baby_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f37c.svg\");\n}\nem[data-emoji=\":man_feeding_baby_tone2:\"]::before,\nem[data-emoji=\"man_feeding_baby_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f37c.svg\");\n}\nem[data-emoji=\":man_feeding_baby_tone3:\"]::before,\nem[data-emoji=\"man_feeding_baby_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f37c.svg\");\n}\nem[data-emoji=\":man_feeding_baby_tone4:\"]::before,\nem[data-emoji=\"man_feeding_baby_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f37c.svg\");\n}\nem[data-emoji=\":man_feeding_baby_tone5:\"]::before,\nem[data-emoji=\"man_feeding_baby_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f37c.svg\");\n}\nem[data-emoji=\":person_bowing:\"]::before,\nem[data-emoji=\"person_bowing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647.svg\");\n}\nem[data-emoji=\":person_bowing_tone1:\"]::before,\nem[data-emoji=\"person_bowing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fb.svg\");\n}\nem[data-emoji=\":person_bowing_tone2:\"]::before,\nem[data-emoji=\"person_bowing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fc.svg\");\n}\nem[data-emoji=\":person_bowing_tone3:\"]::before,\nem[data-emoji=\"person_bowing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fd.svg\");\n}\nem[data-emoji=\":person_bowing_tone4:\"]::before,\nem[data-emoji=\"person_bowing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fe.svg\");\n}\nem[data-emoji=\":person_bowing_tone5:\"]::before,\nem[data-emoji=\"person_bowing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3ff.svg\");\n}\nem[data-emoji=\":woman_bowing:\"]::before,\nem[data-emoji=\"woman_bowing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_bowing_tone1:\"]::before,\nem[data-emoji=\"woman_bowing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_bowing_tone2:\"]::before,\nem[data-emoji=\"woman_bowing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_bowing_tone3:\"]::before,\nem[data-emoji=\"woman_bowing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_bowing_tone4:\"]::before,\nem[data-emoji=\"woman_bowing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_bowing_tone5:\"]::before,\nem[data-emoji=\"woman_bowing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_bowing:\"]::before,\nem[data-emoji=\"man_bowing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_bowing_tone1:\"]::before,\nem[data-emoji=\"man_bowing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_bowing_tone2:\"]::before,\nem[data-emoji=\"man_bowing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_bowing_tone3:\"]::before,\nem[data-emoji=\"man_bowing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_bowing_tone4:\"]::before,\nem[data-emoji=\"man_bowing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_bowing_tone5:\"]::before,\nem[data-emoji=\"man_bowing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_tipping_hand:\"]::before,\nem[data-emoji=\"person_tipping_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481.svg\");\n}\nem[data-emoji=\":person_tipping_hand_tone1:\"]::before,\nem[data-emoji=\"person_tipping_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fb.svg\");\n}\nem[data-emoji=\":person_tipping_hand_tone2:\"]::before,\nem[data-emoji=\"person_tipping_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fc.svg\");\n}\nem[data-emoji=\":person_tipping_hand_tone3:\"]::before,\nem[data-emoji=\"person_tipping_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fd.svg\");\n}\nem[data-emoji=\":person_tipping_hand_tone4:\"]::before,\nem[data-emoji=\"person_tipping_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fe.svg\");\n}\nem[data-emoji=\":person_tipping_hand_tone5:\"]::before,\nem[data-emoji=\"person_tipping_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3ff.svg\");\n}\nem[data-emoji=\":woman_tipping_hand:\"]::before,\nem[data-emoji=\"woman_tipping_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_tipping_hand_tone1:\"]::before,\nem[data-emoji=\"woman_tipping_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_tipping_hand_tone2:\"]::before,\nem[data-emoji=\"woman_tipping_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_tipping_hand_tone3:\"]::before,\nem[data-emoji=\"woman_tipping_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_tipping_hand_tone4:\"]::before,\nem[data-emoji=\"woman_tipping_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_tipping_hand_tone5:\"]::before,\nem[data-emoji=\"woman_tipping_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_tipping_hand:\"]::before,\nem[data-emoji=\"man_tipping_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_tipping_hand_tone1:\"]::before,\nem[data-emoji=\"man_tipping_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_tipping_hand_tone2:\"]::before,\nem[data-emoji=\"man_tipping_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_tipping_hand_tone3:\"]::before,\nem[data-emoji=\"man_tipping_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_tipping_hand_tone4:\"]::before,\nem[data-emoji=\"man_tipping_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_tipping_hand_tone5:\"]::before,\nem[data-emoji=\"man_tipping_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_gesturing_no:\"]::before,\nem[data-emoji=\"person_gesturing_no\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645.svg\");\n}\nem[data-emoji=\":person_gesturing_no_tone1:\"]::before,\nem[data-emoji=\"person_gesturing_no_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fb.svg\");\n}\nem[data-emoji=\":person_gesturing_no_tone2:\"]::before,\nem[data-emoji=\"person_gesturing_no_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fc.svg\");\n}\nem[data-emoji=\":person_gesturing_no_tone3:\"]::before,\nem[data-emoji=\"person_gesturing_no_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fd.svg\");\n}\nem[data-emoji=\":person_gesturing_no_tone4:\"]::before,\nem[data-emoji=\"person_gesturing_no_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fe.svg\");\n}\nem[data-emoji=\":person_gesturing_no_tone5:\"]::before,\nem[data-emoji=\"person_gesturing_no_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3ff.svg\");\n}\nem[data-emoji=\":woman_gesturing_no:\"]::before,\nem[data-emoji=\"woman_gesturing_no\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_gesturing_no_tone1:\"]::before,\nem[data-emoji=\"woman_gesturing_no_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_gesturing_no_tone2:\"]::before,\nem[data-emoji=\"woman_gesturing_no_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_gesturing_no_tone3:\"]::before,\nem[data-emoji=\"woman_gesturing_no_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_gesturing_no_tone4:\"]::before,\nem[data-emoji=\"woman_gesturing_no_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_gesturing_no_tone5:\"]::before,\nem[data-emoji=\"woman_gesturing_no_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_no:\"]::before,\nem[data-emoji=\"man_gesturing_no\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_no_tone1:\"]::before,\nem[data-emoji=\"man_gesturing_no_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_no_tone2:\"]::before,\nem[data-emoji=\"man_gesturing_no_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_no_tone3:\"]::before,\nem[data-emoji=\"man_gesturing_no_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_no_tone4:\"]::before,\nem[data-emoji=\"man_gesturing_no_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_no_tone5:\"]::before,\nem[data-emoji=\"man_gesturing_no_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_gesturing_ok:\"]::before,\nem[data-emoji=\"person_gesturing_ok\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646.svg\");\n}\nem[data-emoji=\":person_gesturing_ok_tone1:\"]::before,\nem[data-emoji=\"person_gesturing_ok_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fb.svg\");\n}\nem[data-emoji=\":person_gesturing_ok_tone2:\"]::before,\nem[data-emoji=\"person_gesturing_ok_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fc.svg\");\n}\nem[data-emoji=\":person_gesturing_ok_tone3:\"]::before,\nem[data-emoji=\"person_gesturing_ok_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fd.svg\");\n}\nem[data-emoji=\":person_gesturing_ok_tone4:\"]::before,\nem[data-emoji=\"person_gesturing_ok_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fe.svg\");\n}\nem[data-emoji=\":person_gesturing_ok_tone5:\"]::before,\nem[data-emoji=\"person_gesturing_ok_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3ff.svg\");\n}\nem[data-emoji=\":woman_gesturing_ok:\"]::before,\nem[data-emoji=\"woman_gesturing_ok\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_gesturing_ok_tone1:\"]::before,\nem[data-emoji=\"woman_gesturing_ok_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_gesturing_ok_tone2:\"]::before,\nem[data-emoji=\"woman_gesturing_ok_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_gesturing_ok_tone3:\"]::before,\nem[data-emoji=\"woman_gesturing_ok_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_gesturing_ok_tone4:\"]::before,\nem[data-emoji=\"woman_gesturing_ok_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_gesturing_ok_tone5:\"]::before,\nem[data-emoji=\"woman_gesturing_ok_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_ok:\"]::before,\nem[data-emoji=\"man_gesturing_ok\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_ok_tone1:\"]::before,\nem[data-emoji=\"man_gesturing_ok_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_ok_tone2:\"]::before,\nem[data-emoji=\"man_gesturing_ok_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_ok_tone3:\"]::before,\nem[data-emoji=\"man_gesturing_ok_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_ok_tone4:\"]::before,\nem[data-emoji=\"man_gesturing_ok_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_gesturing_ok_tone5:\"]::before,\nem[data-emoji=\"man_gesturing_ok_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_raising_hand:\"]::before,\nem[data-emoji=\"person_raising_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b.svg\");\n}\nem[data-emoji=\":person_raising_hand_tone1:\"]::before,\nem[data-emoji=\"person_raising_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fb.svg\");\n}\nem[data-emoji=\":person_raising_hand_tone2:\"]::before,\nem[data-emoji=\"person_raising_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fc.svg\");\n}\nem[data-emoji=\":person_raising_hand_tone3:\"]::before,\nem[data-emoji=\"person_raising_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fd.svg\");\n}\nem[data-emoji=\":person_raising_hand_tone4:\"]::before,\nem[data-emoji=\"person_raising_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fe.svg\");\n}\nem[data-emoji=\":person_raising_hand_tone5:\"]::before,\nem[data-emoji=\"person_raising_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3ff.svg\");\n}\nem[data-emoji=\":woman_raising_hand:\"]::before,\nem[data-emoji=\"woman_raising_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_raising_hand_tone1:\"]::before,\nem[data-emoji=\"woman_raising_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_raising_hand_tone2:\"]::before,\nem[data-emoji=\"woman_raising_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_raising_hand_tone3:\"]::before,\nem[data-emoji=\"woman_raising_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_raising_hand_tone4:\"]::before,\nem[data-emoji=\"woman_raising_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_raising_hand_tone5:\"]::before,\nem[data-emoji=\"woman_raising_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_raising_hand:\"]::before,\nem[data-emoji=\"man_raising_hand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_raising_hand_tone1:\"]::before,\nem[data-emoji=\"man_raising_hand_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_raising_hand_tone2:\"]::before,\nem[data-emoji=\"man_raising_hand_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_raising_hand_tone3:\"]::before,\nem[data-emoji=\"man_raising_hand_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_raising_hand_tone4:\"]::before,\nem[data-emoji=\"man_raising_hand_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_raising_hand_tone5:\"]::before,\nem[data-emoji=\"man_raising_hand_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":deaf_person:\"]::before,\nem[data-emoji=\"deaf_person\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf.svg\");\n}\nem[data-emoji=\":deaf_person_tone1:\"]::before,\nem[data-emoji=\"deaf_person_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fb.svg\");\n}\nem[data-emoji=\":deaf_person_tone2:\"]::before,\nem[data-emoji=\"deaf_person_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fc.svg\");\n}\nem[data-emoji=\":deaf_person_tone3:\"]::before,\nem[data-emoji=\"deaf_person_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fd.svg\");\n}\nem[data-emoji=\":deaf_person_tone4:\"]::before,\nem[data-emoji=\"deaf_person_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fe.svg\");\n}\nem[data-emoji=\":deaf_person_tone5:\"]::before,\nem[data-emoji=\"deaf_person_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3ff.svg\");\n}\nem[data-emoji=\":deaf_woman:\"]::before,\nem[data-emoji=\"deaf_woman\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":deaf_woman_tone1:\"]::before,\nem[data-emoji=\"deaf_woman_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":deaf_woman_tone2:\"]::before,\nem[data-emoji=\"deaf_woman_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":deaf_woman_tone3:\"]::before,\nem[data-emoji=\"deaf_woman_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":deaf_woman_tone4:\"]::before,\nem[data-emoji=\"deaf_woman_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":deaf_woman_tone5:\"]::before,\nem[data-emoji=\"deaf_woman_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":deaf_man:\"]::before,\nem[data-emoji=\"deaf_man\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":deaf_man_tone1:\"]::before,\nem[data-emoji=\"deaf_man_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":deaf_man_tone2:\"]::before,\nem[data-emoji=\"deaf_man_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":deaf_man_tone3:\"]::before,\nem[data-emoji=\"deaf_man_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":deaf_man_tone4:\"]::before,\nem[data-emoji=\"deaf_man_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":deaf_man_tone5:\"]::before,\nem[data-emoji=\"deaf_man_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_facepalming:\"]::before,\nem[data-emoji=\"person_facepalming\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926.svg\");\n}\nem[data-emoji=\":person_facepalming_tone1:\"]::before,\nem[data-emoji=\"person_facepalming_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fb.svg\");\n}\nem[data-emoji=\":person_facepalming_tone2:\"]::before,\nem[data-emoji=\"person_facepalming_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fc.svg\");\n}\nem[data-emoji=\":person_facepalming_tone3:\"]::before,\nem[data-emoji=\"person_facepalming_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fd.svg\");\n}\nem[data-emoji=\":person_facepalming_tone4:\"]::before,\nem[data-emoji=\"person_facepalming_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fe.svg\");\n}\nem[data-emoji=\":person_facepalming_tone5:\"]::before,\nem[data-emoji=\"person_facepalming_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3ff.svg\");\n}\nem[data-emoji=\":woman_facepalming:\"]::before,\nem[data-emoji=\"woman_facepalming\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_facepalming_tone1:\"]::before,\nem[data-emoji=\"woman_facepalming_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_facepalming_tone2:\"]::before,\nem[data-emoji=\"woman_facepalming_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_facepalming_tone3:\"]::before,\nem[data-emoji=\"woman_facepalming_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_facepalming_tone4:\"]::before,\nem[data-emoji=\"woman_facepalming_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_facepalming_tone5:\"]::before,\nem[data-emoji=\"woman_facepalming_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_facepalming:\"]::before,\nem[data-emoji=\"man_facepalming\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_facepalming_tone1:\"]::before,\nem[data-emoji=\"man_facepalming_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_facepalming_tone2:\"]::before,\nem[data-emoji=\"man_facepalming_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_facepalming_tone3:\"]::before,\nem[data-emoji=\"man_facepalming_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_facepalming_tone4:\"]::before,\nem[data-emoji=\"man_facepalming_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_facepalming_tone5:\"]::before,\nem[data-emoji=\"man_facepalming_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_shrugging:\"]::before,\nem[data-emoji=\"person_shrugging\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937.svg\");\n}\nem[data-emoji=\":person_shrugging_tone1:\"]::before,\nem[data-emoji=\"person_shrugging_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fb.svg\");\n}\nem[data-emoji=\":person_shrugging_tone2:\"]::before,\nem[data-emoji=\"person_shrugging_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fc.svg\");\n}\nem[data-emoji=\":person_shrugging_tone3:\"]::before,\nem[data-emoji=\"person_shrugging_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fd.svg\");\n}\nem[data-emoji=\":person_shrugging_tone4:\"]::before,\nem[data-emoji=\"person_shrugging_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fe.svg\");\n}\nem[data-emoji=\":person_shrugging_tone5:\"]::before,\nem[data-emoji=\"person_shrugging_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3ff.svg\");\n}\nem[data-emoji=\":woman_shrugging:\"]::before,\nem[data-emoji=\"woman_shrugging\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_shrugging_tone1:\"]::before,\nem[data-emoji=\"woman_shrugging_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_shrugging_tone2:\"]::before,\nem[data-emoji=\"woman_shrugging_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_shrugging_tone3:\"]::before,\nem[data-emoji=\"woman_shrugging_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_shrugging_tone4:\"]::before,\nem[data-emoji=\"woman_shrugging_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_shrugging_tone5:\"]::before,\nem[data-emoji=\"woman_shrugging_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_shrugging:\"]::before,\nem[data-emoji=\"man_shrugging\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_shrugging_tone1:\"]::before,\nem[data-emoji=\"man_shrugging_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_shrugging_tone2:\"]::before,\nem[data-emoji=\"man_shrugging_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_shrugging_tone3:\"]::before,\nem[data-emoji=\"man_shrugging_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_shrugging_tone4:\"]::before,\nem[data-emoji=\"man_shrugging_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_shrugging_tone5:\"]::before,\nem[data-emoji=\"man_shrugging_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_pouting:\"]::before,\nem[data-emoji=\"person_pouting\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e.svg\");\n}\nem[data-emoji=\":person_pouting_tone1:\"]::before,\nem[data-emoji=\"person_pouting_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fb.svg\");\n}\nem[data-emoji=\":person_pouting_tone2:\"]::before,\nem[data-emoji=\"person_pouting_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fc.svg\");\n}\nem[data-emoji=\":person_pouting_tone3:\"]::before,\nem[data-emoji=\"person_pouting_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fd.svg\");\n}\nem[data-emoji=\":person_pouting_tone4:\"]::before,\nem[data-emoji=\"person_pouting_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fe.svg\");\n}\nem[data-emoji=\":person_pouting_tone5:\"]::before,\nem[data-emoji=\"person_pouting_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3ff.svg\");\n}\nem[data-emoji=\":woman_pouting:\"]::before,\nem[data-emoji=\"woman_pouting\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_pouting_tone1:\"]::before,\nem[data-emoji=\"woman_pouting_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_pouting_tone2:\"]::before,\nem[data-emoji=\"woman_pouting_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_pouting_tone3:\"]::before,\nem[data-emoji=\"woman_pouting_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_pouting_tone4:\"]::before,\nem[data-emoji=\"woman_pouting_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_pouting_tone5:\"]::before,\nem[data-emoji=\"woman_pouting_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_pouting:\"]::before,\nem[data-emoji=\"man_pouting\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_pouting_tone1:\"]::before,\nem[data-emoji=\"man_pouting_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_pouting_tone2:\"]::before,\nem[data-emoji=\"man_pouting_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_pouting_tone3:\"]::before,\nem[data-emoji=\"man_pouting_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_pouting_tone4:\"]::before,\nem[data-emoji=\"man_pouting_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_pouting_tone5:\"]::before,\nem[data-emoji=\"man_pouting_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_frowning:\"]::before,\nem[data-emoji=\"person_frowning\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d.svg\");\n}\nem[data-emoji=\":person_frowning_tone1:\"]::before,\nem[data-emoji=\"person_frowning_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fb.svg\");\n}\nem[data-emoji=\":person_frowning_tone2:\"]::before,\nem[data-emoji=\"person_frowning_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fc.svg\");\n}\nem[data-emoji=\":person_frowning_tone3:\"]::before,\nem[data-emoji=\"person_frowning_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fd.svg\");\n}\nem[data-emoji=\":person_frowning_tone4:\"]::before,\nem[data-emoji=\"person_frowning_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fe.svg\");\n}\nem[data-emoji=\":person_frowning_tone5:\"]::before,\nem[data-emoji=\"person_frowning_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3ff.svg\");\n}\nem[data-emoji=\":woman_frowning:\"]::before,\nem[data-emoji=\"woman_frowning\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_frowning_tone1:\"]::before,\nem[data-emoji=\"woman_frowning_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_frowning_tone2:\"]::before,\nem[data-emoji=\"woman_frowning_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_frowning_tone3:\"]::before,\nem[data-emoji=\"woman_frowning_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_frowning_tone4:\"]::before,\nem[data-emoji=\"woman_frowning_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_frowning_tone5:\"]::before,\nem[data-emoji=\"woman_frowning_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_frowning:\"]::before,\nem[data-emoji=\"man_frowning\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_frowning_tone1:\"]::before,\nem[data-emoji=\"man_frowning_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_frowning_tone2:\"]::before,\nem[data-emoji=\"man_frowning_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_frowning_tone3:\"]::before,\nem[data-emoji=\"man_frowning_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_frowning_tone4:\"]::before,\nem[data-emoji=\"man_frowning_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_frowning_tone5:\"]::before,\nem[data-emoji=\"man_frowning_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_getting_haircut:\"]::before,\nem[data-emoji=\"person_getting_haircut\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487.svg\");\n}\nem[data-emoji=\":person_getting_haircut_tone1:\"]::before,\nem[data-emoji=\"person_getting_haircut_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fb.svg\");\n}\nem[data-emoji=\":person_getting_haircut_tone2:\"]::before,\nem[data-emoji=\"person_getting_haircut_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fc.svg\");\n}\nem[data-emoji=\":person_getting_haircut_tone3:\"]::before,\nem[data-emoji=\"person_getting_haircut_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fd.svg\");\n}\nem[data-emoji=\":person_getting_haircut_tone4:\"]::before,\nem[data-emoji=\"person_getting_haircut_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fe.svg\");\n}\nem[data-emoji=\":person_getting_haircut_tone5:\"]::before,\nem[data-emoji=\"person_getting_haircut_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3ff.svg\");\n}\nem[data-emoji=\":woman_getting_haircut:\"]::before,\nem[data-emoji=\"woman_getting_haircut\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_getting_haircut_tone1:\"]::before,\nem[data-emoji=\"woman_getting_haircut_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_getting_haircut_tone2:\"]::before,\nem[data-emoji=\"woman_getting_haircut_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_getting_haircut_tone3:\"]::before,\nem[data-emoji=\"woman_getting_haircut_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_getting_haircut_tone4:\"]::before,\nem[data-emoji=\"woman_getting_haircut_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_getting_haircut_tone5:\"]::before,\nem[data-emoji=\"woman_getting_haircut_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_haircut:\"]::before,\nem[data-emoji=\"man_getting_haircut\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_haircut_tone1:\"]::before,\nem[data-emoji=\"man_getting_haircut_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_haircut_tone2:\"]::before,\nem[data-emoji=\"man_getting_haircut_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_haircut_tone3:\"]::before,\nem[data-emoji=\"man_getting_haircut_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_haircut_tone4:\"]::before,\nem[data-emoji=\"man_getting_haircut_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_haircut_tone5:\"]::before,\nem[data-emoji=\"man_getting_haircut_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_getting_massage:\"]::before,\nem[data-emoji=\"person_getting_massage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486.svg\");\n}\nem[data-emoji=\":person_getting_massage_tone1:\"]::before,\nem[data-emoji=\"person_getting_massage_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fb.svg\");\n}\nem[data-emoji=\":person_getting_massage_tone2:\"]::before,\nem[data-emoji=\"person_getting_massage_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fc.svg\");\n}\nem[data-emoji=\":person_getting_massage_tone3:\"]::before,\nem[data-emoji=\"person_getting_massage_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fd.svg\");\n}\nem[data-emoji=\":person_getting_massage_tone4:\"]::before,\nem[data-emoji=\"person_getting_massage_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fe.svg\");\n}\nem[data-emoji=\":person_getting_massage_tone5:\"]::before,\nem[data-emoji=\"person_getting_massage_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3ff.svg\");\n}\nem[data-emoji=\":woman_getting_face_massage:\"]::before,\nem[data-emoji=\"woman_getting_face_massage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_getting_face_massage_tone1:\"]::before,\nem[data-emoji=\"woman_getting_face_massage_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_getting_face_massage_tone2:\"]::before,\nem[data-emoji=\"woman_getting_face_massage_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_getting_face_massage_tone3:\"]::before,\nem[data-emoji=\"woman_getting_face_massage_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_getting_face_massage_tone4:\"]::before,\nem[data-emoji=\"woman_getting_face_massage_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_getting_face_massage_tone5:\"]::before,\nem[data-emoji=\"woman_getting_face_massage_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_face_massage:\"]::before,\nem[data-emoji=\"man_getting_face_massage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_face_massage_tone1:\"]::before,\nem[data-emoji=\"man_getting_face_massage_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_face_massage_tone2:\"]::before,\nem[data-emoji=\"man_getting_face_massage_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_face_massage_tone3:\"]::before,\nem[data-emoji=\"man_getting_face_massage_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_face_massage_tone4:\"]::before,\nem[data-emoji=\"man_getting_face_massage_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_getting_face_massage_tone5:\"]::before,\nem[data-emoji=\"man_getting_face_massage_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_in_steamy_room:\"]::before,\nem[data-emoji=\"person_in_steamy_room\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6.svg\");\n}\nem[data-emoji=\":person_in_steamy_room_tone1:\"]::before,\nem[data-emoji=\"person_in_steamy_room_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fb.svg\");\n}\nem[data-emoji=\":person_in_steamy_room_tone2:\"]::before,\nem[data-emoji=\"person_in_steamy_room_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fc.svg\");\n}\nem[data-emoji=\":person_in_steamy_room_tone3:\"]::before,\nem[data-emoji=\"person_in_steamy_room_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fd.svg\");\n}\nem[data-emoji=\":person_in_steamy_room_tone4:\"]::before,\nem[data-emoji=\"person_in_steamy_room_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fe.svg\");\n}\nem[data-emoji=\":person_in_steamy_room_tone5:\"]::before,\nem[data-emoji=\"person_in_steamy_room_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3ff.svg\");\n}\nem[data-emoji=\":woman_in_steamy_room:\"]::before,\nem[data-emoji=\"woman_in_steamy_room\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_steamy_room_tone1:\"]::before,\nem[data-emoji=\"woman_in_steamy_room_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_steamy_room_tone2:\"]::before,\nem[data-emoji=\"woman_in_steamy_room_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_steamy_room_tone3:\"]::before,\nem[data-emoji=\"woman_in_steamy_room_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_steamy_room_tone4:\"]::before,\nem[data-emoji=\"woman_in_steamy_room_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_steamy_room_tone5:\"]::before,\nem[data-emoji=\"woman_in_steamy_room_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_in_steamy_room:\"]::before,\nem[data-emoji=\"man_in_steamy_room\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_steamy_room_tone1:\"]::before,\nem[data-emoji=\"man_in_steamy_room_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_steamy_room_tone2:\"]::before,\nem[data-emoji=\"man_in_steamy_room_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_steamy_room_tone3:\"]::before,\nem[data-emoji=\"man_in_steamy_room_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_steamy_room_tone4:\"]::before,\nem[data-emoji=\"man_in_steamy_room_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_steamy_room_tone5:\"]::before,\nem[data-emoji=\"man_in_steamy_room_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":nail_care:\"]::before,\nem[data-emoji=\"nail_care\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485.svg\");\n}\nem[data-emoji=\":nail_care_tone1:\"]::before,\nem[data-emoji=\"nail_care_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485-1f3fb.svg\");\n}\nem[data-emoji=\":nail_care_tone2:\"]::before,\nem[data-emoji=\"nail_care_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485-1f3fc.svg\");\n}\nem[data-emoji=\":nail_care_tone3:\"]::before,\nem[data-emoji=\"nail_care_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485-1f3fd.svg\");\n}\nem[data-emoji=\":nail_care_tone4:\"]::before,\nem[data-emoji=\"nail_care_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485-1f3fe.svg\");\n}\nem[data-emoji=\":nail_care_tone5:\"]::before,\nem[data-emoji=\"nail_care_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485-1f3ff.svg\");\n}\nem[data-emoji=\":selfie:\"]::before,\nem[data-emoji=\"selfie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933.svg\");\n}\nem[data-emoji=\":selfie_tone1:\"]::before,\nem[data-emoji=\"selfie_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933-1f3fb.svg\");\n}\nem[data-emoji=\":selfie_tone2:\"]::before,\nem[data-emoji=\"selfie_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933-1f3fc.svg\");\n}\nem[data-emoji=\":selfie_tone3:\"]::before,\nem[data-emoji=\"selfie_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933-1f3fd.svg\");\n}\nem[data-emoji=\":selfie_tone4:\"]::before,\nem[data-emoji=\"selfie_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933-1f3fe.svg\");\n}\nem[data-emoji=\":selfie_tone5:\"]::before,\nem[data-emoji=\"selfie_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933-1f3ff.svg\");\n}\nem[data-emoji=\":dancer:\"]::before,\nem[data-emoji=\"dancer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483.svg\");\n}\nem[data-emoji=\":dancer_tone1:\"]::before,\nem[data-emoji=\"dancer_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483-1f3fb.svg\");\n}\nem[data-emoji=\":dancer_tone2:\"]::before,\nem[data-emoji=\"dancer_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483-1f3fc.svg\");\n}\nem[data-emoji=\":dancer_tone3:\"]::before,\nem[data-emoji=\"dancer_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483-1f3fd.svg\");\n}\nem[data-emoji=\":dancer_tone4:\"]::before,\nem[data-emoji=\"dancer_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483-1f3fe.svg\");\n}\nem[data-emoji=\":dancer_tone5:\"]::before,\nem[data-emoji=\"dancer_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483-1f3ff.svg\");\n}\nem[data-emoji=\":man_dancing:\"]::before,\nem[data-emoji=\"man_dancing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a.svg\");\n}\nem[data-emoji=\":man_dancing_tone1:\"]::before,\nem[data-emoji=\"man_dancing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a-1f3fb.svg\");\n}\nem[data-emoji=\":man_dancing_tone2:\"]::before,\nem[data-emoji=\"man_dancing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a-1f3fc.svg\");\n}\nem[data-emoji=\":man_dancing_tone3:\"]::before,\nem[data-emoji=\"man_dancing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a-1f3fd.svg\");\n}\nem[data-emoji=\":man_dancing_tone5:\"]::before,\nem[data-emoji=\"man_dancing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a-1f3ff.svg\");\n}\nem[data-emoji=\":man_dancing_tone4:\"]::before,\nem[data-emoji=\"man_dancing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a-1f3fe.svg\");\n}\nem[data-emoji=\":people_with_bunny_ears_partying:\"]::before,\nem[data-emoji=\"people_with_bunny_ears_partying\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46f.svg\");\n}\nem[data-emoji=\":women_with_bunny_ears_partying:\"]::before,\nem[data-emoji=\"women_with_bunny_ears_partying\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46f-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":men_with_bunny_ears_partying:\"]::before,\nem[data-emoji=\"men_with_bunny_ears_partying\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46f-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":levitate:\"]::before,\nem[data-emoji=\"levitate\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574.svg\");\n}\nem[data-emoji=\":levitate_tone1:\"]::before,\nem[data-emoji=\"levitate_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574-1f3fb.svg\");\n}\nem[data-emoji=\":levitate_tone2:\"]::before,\nem[data-emoji=\"levitate_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574-1f3fc.svg\");\n}\nem[data-emoji=\":levitate_tone3:\"]::before,\nem[data-emoji=\"levitate_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574-1f3fd.svg\");\n}\nem[data-emoji=\":levitate_tone4:\"]::before,\nem[data-emoji=\"levitate_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574-1f3fe.svg\");\n}\nem[data-emoji=\":levitate_tone5:\"]::before,\nem[data-emoji=\"levitate_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574-1f3ff.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9bd.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair_tone1:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9bd.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair_tone2:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9bd.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair_tone3:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9bd.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair_tone4:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9bd.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair_tone5:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9bd.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9bd.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair_tone1:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9bd.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair_tone2:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9bd.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair_tone3:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9bd.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair_tone4:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9bd.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair_tone5:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9bd.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9bd.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair_tone1:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9bd.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair_tone2:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9bd.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair_tone3:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9bd.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair_tone4:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9bd.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair_tone5:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9bd.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair_facing_right:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair_facing_right_tone1:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair_facing_right_tone2:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair_facing_right_tone3:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair_facing_right_tone4:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_in_manual_wheelchair_facing_right_tone5:\"]::before,\nem[data-emoji=\"person_in_manual_wheelchair_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair_facing_right:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair_facing_right_tone2:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair_facing_right_tone1:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair_facing_right_tone3:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair_facing_right_tone4:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_manual_wheelchair_facing_right_tone5:\"]::before,\nem[data-emoji=\"man_in_manual_wheelchair_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair_facing_right:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair_facing_right_tone1:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair_facing_right_tone2:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair_facing_right_tone3:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair_facing_right_tone4:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_manual_wheelchair_facing_right_tone5:\"]::before,\nem[data-emoji=\"woman_in_manual_wheelchair_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9bd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9bc.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair_tone1:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9bc.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair_tone2:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9bc.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair_tone3:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9bc.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair_tone4:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9bc.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair_tone5:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9bc.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9bc.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair_tone1:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9bc.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair_tone2:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9bc.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair_tone3:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9bc.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair_tone4:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9bc.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair_tone5:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9bc.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9bc.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair_tone1:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9bc.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair_tone2:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9bc.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair_tone3:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9bc.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair_tone4:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9bc.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair_tone5:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9bc.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair_facing_right:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair_facing_right_tone1:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair_facing_right_tone2:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair_facing_right_tone3:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair_facing_right_tone4:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_in_motorized_wheelchair_facing_right_tone5:\"]::before,\nem[data-emoji=\"person_in_motorized_wheelchair_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair_facing_right:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair_facing_right_tone1:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair_facing_right_tone2:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair_facing_right_tone3:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair_facing_right_tone4:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_in_motorized_wheelchair_facing_right_tone5:\"]::before,\nem[data-emoji=\"man_in_motorized_wheelchair_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair_facing_right:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair_facing_right_tone1:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair_facing_right_tone2:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair_facing_right_tone3:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair_facing_right_tone4:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_motorized_wheelchair_facing_right_tone5:\"]::before,\nem[data-emoji=\"woman_in_motorized_wheelchair_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9bc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_walking:\"]::before,\nem[data-emoji=\"person_walking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6.svg\");\n}\nem[data-emoji=\":person_walking_tone1:\"]::before,\nem[data-emoji=\"person_walking_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb.svg\");\n}\nem[data-emoji=\":person_walking_tone2:\"]::before,\nem[data-emoji=\"person_walking_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc.svg\");\n}\nem[data-emoji=\":person_walking_tone3:\"]::before,\nem[data-emoji=\"person_walking_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd.svg\");\n}\nem[data-emoji=\":person_walking_tone4:\"]::before,\nem[data-emoji=\"person_walking_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe.svg\");\n}\nem[data-emoji=\":person_walking_tone5:\"]::before,\nem[data-emoji=\"person_walking_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff.svg\");\n}\nem[data-emoji=\":woman_walking:\"]::before,\nem[data-emoji=\"woman_walking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_walking_tone1:\"]::before,\nem[data-emoji=\"woman_walking_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_walking_tone2:\"]::before,\nem[data-emoji=\"woman_walking_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_walking_tone3:\"]::before,\nem[data-emoji=\"woman_walking_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_walking_tone4:\"]::before,\nem[data-emoji=\"woman_walking_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_walking_tone5:\"]::before,\nem[data-emoji=\"woman_walking_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_walking:\"]::before,\nem[data-emoji=\"man_walking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_walking_tone1:\"]::before,\nem[data-emoji=\"man_walking_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_walking_tone2:\"]::before,\nem[data-emoji=\"man_walking_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_walking_tone3:\"]::before,\nem[data-emoji=\"man_walking_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_walking_tone4:\"]::before,\nem[data-emoji=\"man_walking_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_walking_tone5:\"]::before,\nem[data-emoji=\"man_walking_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_walking_facing_right:\"]::before,\nem[data-emoji=\"person_walking_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_walking_facing_right_tone1:\"]::before,\nem[data-emoji=\"person_walking_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_walking_facing_right_tone2:\"]::before,\nem[data-emoji=\"person_walking_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_walking_facing_right_tone3:\"]::before,\nem[data-emoji=\"person_walking_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_walking_facing_right_tone4:\"]::before,\nem[data-emoji=\"person_walking_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_walking_facing_right_tone5:\"]::before,\nem[data-emoji=\"person_walking_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_walking_facing_right:\"]::before,\nem[data-emoji=\"woman_walking_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_walking_facing_right_tone1:\"]::before,\nem[data-emoji=\"woman_walking_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_walking_facing_right_tone2:\"]::before,\nem[data-emoji=\"woman_walking_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_walking_facing_right_tone3:\"]::before,\nem[data-emoji=\"woman_walking_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_walking_facing_right_tone4:\"]::before,\nem[data-emoji=\"woman_walking_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_walking_facing_right_tone5:\"]::before,\nem[data-emoji=\"woman_walking_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_walking_facing_right:\"]::before,\nem[data-emoji=\"man_walking_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_walking_facing_right_tone1:\"]::before,\nem[data-emoji=\"man_walking_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_walking_facing_right_tone2:\"]::before,\nem[data-emoji=\"man_walking_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_walking_facing_right_tone3:\"]::before,\nem[data-emoji=\"man_walking_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_walking_facing_right_tone4:\"]::before,\nem[data-emoji=\"man_walking_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_walking_facing_right_tone5:\"]::before,\nem[data-emoji=\"man_walking_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_with_probing_cane:\"]::before,\nem[data-emoji=\"person_with_probing_cane\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9af.svg\");\n}\nem[data-emoji=\":person_with_probing_cane_tone1:\"]::before,\nem[data-emoji=\"person_with_probing_cane_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9af.svg\");\n}\nem[data-emoji=\":person_with_probing_cane_tone2:\"]::before,\nem[data-emoji=\"person_with_probing_cane_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9af.svg\");\n}\nem[data-emoji=\":person_with_probing_cane_tone3:\"]::before,\nem[data-emoji=\"person_with_probing_cane_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9af.svg\");\n}\nem[data-emoji=\":person_with_probing_cane_tone4:\"]::before,\nem[data-emoji=\"person_with_probing_cane_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9af.svg\");\n}\nem[data-emoji=\":person_with_probing_cane_tone5:\"]::before,\nem[data-emoji=\"person_with_probing_cane_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9af.svg\");\n}\nem[data-emoji=\":woman_with_probing_cane:\"]::before,\nem[data-emoji=\"woman_with_probing_cane\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9af.svg\");\n}\nem[data-emoji=\":woman_with_probing_cane_tone1:\"]::before,\nem[data-emoji=\"woman_with_probing_cane_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9af.svg\");\n}\nem[data-emoji=\":woman_with_probing_cane_tone2:\"]::before,\nem[data-emoji=\"woman_with_probing_cane_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9af.svg\");\n}\nem[data-emoji=\":woman_with_probing_cane_tone3:\"]::before,\nem[data-emoji=\"woman_with_probing_cane_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9af.svg\");\n}\nem[data-emoji=\":woman_with_probing_cane_tone4:\"]::before,\nem[data-emoji=\"woman_with_probing_cane_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9af.svg\");\n}\nem[data-emoji=\":woman_with_probing_cane_tone5:\"]::before,\nem[data-emoji=\"woman_with_probing_cane_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9af.svg\");\n}\nem[data-emoji=\":man_with_probing_cane:\"]::before,\nem[data-emoji=\"man_with_probing_cane\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9af.svg\");\n}\nem[data-emoji=\":man_with_probing_cane_tone1:\"]::before,\nem[data-emoji=\"man_with_probing_cane_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9af.svg\");\n}\nem[data-emoji=\":man_with_probing_cane_tone2:\"]::before,\nem[data-emoji=\"man_with_probing_cane_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9af.svg\");\n}\nem[data-emoji=\":man_with_probing_cane_tone3:\"]::before,\nem[data-emoji=\"man_with_probing_cane_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9af.svg\");\n}\nem[data-emoji=\":man_with_probing_cane_tone4:\"]::before,\nem[data-emoji=\"man_with_probing_cane_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9af.svg\");\n}\nem[data-emoji=\":man_with_probing_cane_tone5:\"]::before,\nem[data-emoji=\"man_with_probing_cane_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9af.svg\");\n}\nem[data-emoji=\":person_with_white_cane_facing_right:\"]::before,\nem[data-emoji=\"person_with_white_cane_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_with_white_cane_facing_right_tone1:\"]::before,\nem[data-emoji=\"person_with_white_cane_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_with_white_cane_facing_right_tone2:\"]::before,\nem[data-emoji=\"person_with_white_cane_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_with_white_cane_facing_right_tone3:\"]::before,\nem[data-emoji=\"person_with_white_cane_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_with_white_cane_facing_right_tone4:\"]::before,\nem[data-emoji=\"person_with_white_cane_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_with_white_cane_facing_right_tone5:\"]::before,\nem[data-emoji=\"person_with_white_cane_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_with_white_cane_facing_right:\"]::before,\nem[data-emoji=\"man_with_white_cane_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_with_white_cane_facing_right_tone1:\"]::before,\nem[data-emoji=\"man_with_white_cane_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_with_white_cane_facing_right_tone2:\"]::before,\nem[data-emoji=\"man_with_white_cane_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_with_white_cane_facing_right_tone3:\"]::before,\nem[data-emoji=\"man_with_white_cane_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_with_white_cane_facing_right_tone4:\"]::before,\nem[data-emoji=\"man_with_white_cane_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_with_white_cane_facing_right_tone5:\"]::before,\nem[data-emoji=\"man_with_white_cane_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_white_cane_facing_right:\"]::before,\nem[data-emoji=\"woman_with_white_cane_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_white_cane_facing_right_tone1:\"]::before,\nem[data-emoji=\"woman_with_white_cane_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_white_cane_facing_right_tone2:\"]::before,\nem[data-emoji=\"woman_with_white_cane_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_white_cane_facing_right_tone3:\"]::before,\nem[data-emoji=\"woman_with_white_cane_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_white_cane_facing_right_tone4:\"]::before,\nem[data-emoji=\"woman_with_white_cane_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_with_white_cane_facing_right_tone5:\"]::before,\nem[data-emoji=\"woman_with_white_cane_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9af-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_kneeling:\"]::before,\nem[data-emoji=\"person_kneeling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce.svg\");\n}\nem[data-emoji=\":person_kneeling_tone1:\"]::before,\nem[data-emoji=\"person_kneeling_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb.svg\");\n}\nem[data-emoji=\":person_kneeling_tone2:\"]::before,\nem[data-emoji=\"person_kneeling_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc.svg\");\n}\nem[data-emoji=\":person_kneeling_tone3:\"]::before,\nem[data-emoji=\"person_kneeling_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd.svg\");\n}\nem[data-emoji=\":person_kneeling_tone4:\"]::before,\nem[data-emoji=\"person_kneeling_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe.svg\");\n}\nem[data-emoji=\":person_kneeling_tone5:\"]::before,\nem[data-emoji=\"person_kneeling_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff.svg\");\n}\nem[data-emoji=\":woman_kneeling:\"]::before,\nem[data-emoji=\"woman_kneeling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_kneeling_tone1:\"]::before,\nem[data-emoji=\"woman_kneeling_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_kneeling_tone2:\"]::before,\nem[data-emoji=\"woman_kneeling_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_kneeling_tone3:\"]::before,\nem[data-emoji=\"woman_kneeling_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_kneeling_tone4:\"]::before,\nem[data-emoji=\"woman_kneeling_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_kneeling_tone5:\"]::before,\nem[data-emoji=\"woman_kneeling_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling:\"]::before,\nem[data-emoji=\"man_kneeling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling_tone1:\"]::before,\nem[data-emoji=\"man_kneeling_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling_tone2:\"]::before,\nem[data-emoji=\"man_kneeling_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling_tone3:\"]::before,\nem[data-emoji=\"man_kneeling_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling_tone4:\"]::before,\nem[data-emoji=\"man_kneeling_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling_tone5:\"]::before,\nem[data-emoji=\"man_kneeling_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_kneeling_facing_right:\"]::before,\nem[data-emoji=\"person_kneeling_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_kneeling_facing_right_tone1:\"]::before,\nem[data-emoji=\"person_kneeling_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_kneeling_facing_right_tone2:\"]::before,\nem[data-emoji=\"person_kneeling_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_kneeling_facing_right_tone3:\"]::before,\nem[data-emoji=\"person_kneeling_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_kneeling_facing_right_tone4:\"]::before,\nem[data-emoji=\"person_kneeling_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_kneeling_facing_right_tone5:\"]::before,\nem[data-emoji=\"person_kneeling_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_kneeling_facing_right:\"]::before,\nem[data-emoji=\"woman_kneeling_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_kneeling_facing_right_tone1:\"]::before,\nem[data-emoji=\"woman_kneeling_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_kneeling_facing_right_tone2:\"]::before,\nem[data-emoji=\"woman_kneeling_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_kneeling_facing_right_tone3:\"]::before,\nem[data-emoji=\"woman_kneeling_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_kneeling_facing_right_tone4:\"]::before,\nem[data-emoji=\"woman_kneeling_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_kneeling_facing_right_tone5:\"]::before,\nem[data-emoji=\"woman_kneeling_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling_facing_right:\"]::before,\nem[data-emoji=\"man_kneeling_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling_facing_right_tone1:\"]::before,\nem[data-emoji=\"man_kneeling_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling_facing_right_tone2:\"]::before,\nem[data-emoji=\"man_kneeling_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling_facing_right_tone3:\"]::before,\nem[data-emoji=\"man_kneeling_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling_facing_right_tone4:\"]::before,\nem[data-emoji=\"man_kneeling_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_kneeling_facing_right_tone5:\"]::before,\nem[data-emoji=\"man_kneeling_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_running:\"]::before,\nem[data-emoji=\"person_running\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3.svg\");\n}\nem[data-emoji=\":person_running_tone1:\"]::before,\nem[data-emoji=\"person_running_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb.svg\");\n}\nem[data-emoji=\":person_running_tone2:\"]::before,\nem[data-emoji=\"person_running_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc.svg\");\n}\nem[data-emoji=\":person_running_tone3:\"]::before,\nem[data-emoji=\"person_running_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd.svg\");\n}\nem[data-emoji=\":person_running_tone4:\"]::before,\nem[data-emoji=\"person_running_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe.svg\");\n}\nem[data-emoji=\":person_running_tone5:\"]::before,\nem[data-emoji=\"person_running_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff.svg\");\n}\nem[data-emoji=\":woman_running:\"]::before,\nem[data-emoji=\"woman_running\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_running_tone1:\"]::before,\nem[data-emoji=\"woman_running_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_running_tone2:\"]::before,\nem[data-emoji=\"woman_running_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_running_tone3:\"]::before,\nem[data-emoji=\"woman_running_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_running_tone4:\"]::before,\nem[data-emoji=\"woman_running_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_running_tone5:\"]::before,\nem[data-emoji=\"woman_running_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_running:\"]::before,\nem[data-emoji=\"man_running\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_running_tone1:\"]::before,\nem[data-emoji=\"man_running_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_running_tone2:\"]::before,\nem[data-emoji=\"man_running_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_running_tone3:\"]::before,\nem[data-emoji=\"man_running_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_running_tone4:\"]::before,\nem[data-emoji=\"man_running_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_running_tone5:\"]::before,\nem[data-emoji=\"man_running_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_running_facing_right:\"]::before,\nem[data-emoji=\"person_running_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_running_facing_right_tone1:\"]::before,\nem[data-emoji=\"person_running_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_running_facing_right_tone2:\"]::before,\nem[data-emoji=\"person_running_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_running_facing_right_tone3:\"]::before,\nem[data-emoji=\"person_running_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_running_facing_right_tone4:\"]::before,\nem[data-emoji=\"person_running_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_running_facing_right_tone5:\"]::before,\nem[data-emoji=\"person_running_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_running_facing_right:\"]::before,\nem[data-emoji=\"woman_running_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_running_facing_right_tone1:\"]::before,\nem[data-emoji=\"woman_running_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_running_facing_right_tone2:\"]::before,\nem[data-emoji=\"woman_running_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_running_facing_right_tone3:\"]::before,\nem[data-emoji=\"woman_running_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_running_facing_right_tone4:\"]::before,\nem[data-emoji=\"woman_running_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":woman_running_facing_right_tone5:\"]::before,\nem[data-emoji=\"woman_running_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff-200d-2640-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_running_facing_right:\"]::before,\nem[data-emoji=\"man_running_facing_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_running_facing_right_tone1:\"]::before,\nem[data-emoji=\"man_running_facing_right_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_running_facing_right_tone2:\"]::before,\nem[data-emoji=\"man_running_facing_right_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_running_facing_right_tone3:\"]::before,\nem[data-emoji=\"man_running_facing_right_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_running_facing_right_tone4:\"]::before,\nem[data-emoji=\"man_running_facing_right_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":man_running_facing_right_tone5:\"]::before,\nem[data-emoji=\"man_running_facing_right_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff-200d-2642-fe0f-200d-27a1-fe0f.svg\");\n}\nem[data-emoji=\":person_standing:\"]::before,\nem[data-emoji=\"person_standing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd.svg\");\n}\nem[data-emoji=\":person_standing_tone1:\"]::before,\nem[data-emoji=\"person_standing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fb.svg\");\n}\nem[data-emoji=\":person_standing_tone2:\"]::before,\nem[data-emoji=\"person_standing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fc.svg\");\n}\nem[data-emoji=\":person_standing_tone3:\"]::before,\nem[data-emoji=\"person_standing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fd.svg\");\n}\nem[data-emoji=\":person_standing_tone4:\"]::before,\nem[data-emoji=\"person_standing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fe.svg\");\n}\nem[data-emoji=\":person_standing_tone5:\"]::before,\nem[data-emoji=\"person_standing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3ff.svg\");\n}\nem[data-emoji=\":woman_standing:\"]::before,\nem[data-emoji=\"woman_standing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_standing_tone1:\"]::before,\nem[data-emoji=\"woman_standing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_standing_tone2:\"]::before,\nem[data-emoji=\"woman_standing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_standing_tone3:\"]::before,\nem[data-emoji=\"woman_standing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_standing_tone4:\"]::before,\nem[data-emoji=\"woman_standing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_standing_tone5:\"]::before,\nem[data-emoji=\"woman_standing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_standing:\"]::before,\nem[data-emoji=\"man_standing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_standing_tone1:\"]::before,\nem[data-emoji=\"man_standing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_standing_tone2:\"]::before,\nem[data-emoji=\"man_standing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_standing_tone3:\"]::before,\nem[data-emoji=\"man_standing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_standing_tone4:\"]::before,\nem[data-emoji=\"man_standing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_standing_tone5:\"]::before,\nem[data-emoji=\"man_standing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":people_holding_hands:\"]::before,\nem[data-emoji=\"people_holding_hands\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f91d-200d-1f9d1.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone1:\"]::before,\nem[data-emoji=\"people_holding_hands_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone1_tone2:\"]::before,\nem[data-emoji=\"people_holding_hands_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone1_tone3:\"]::before,\nem[data-emoji=\"people_holding_hands_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone1_tone4:\"]::before,\nem[data-emoji=\"people_holding_hands_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone1_tone5:\"]::before,\nem[data-emoji=\"people_holding_hands_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone2_tone1:\"]::before,\nem[data-emoji=\"people_holding_hands_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone2:\"]::before,\nem[data-emoji=\"people_holding_hands_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone2_tone3:\"]::before,\nem[data-emoji=\"people_holding_hands_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone2_tone4:\"]::before,\nem[data-emoji=\"people_holding_hands_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone2_tone5:\"]::before,\nem[data-emoji=\"people_holding_hands_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone3_tone1:\"]::before,\nem[data-emoji=\"people_holding_hands_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone3_tone2:\"]::before,\nem[data-emoji=\"people_holding_hands_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone3:\"]::before,\nem[data-emoji=\"people_holding_hands_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone3_tone4:\"]::before,\nem[data-emoji=\"people_holding_hands_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone3_tone5:\"]::before,\nem[data-emoji=\"people_holding_hands_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone4_tone1:\"]::before,\nem[data-emoji=\"people_holding_hands_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone4_tone2:\"]::before,\nem[data-emoji=\"people_holding_hands_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone4_tone3:\"]::before,\nem[data-emoji=\"people_holding_hands_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone4:\"]::before,\nem[data-emoji=\"people_holding_hands_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone4_tone5:\"]::before,\nem[data-emoji=\"people_holding_hands_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone5_tone1:\"]::before,\nem[data-emoji=\"people_holding_hands_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone5_tone2:\"]::before,\nem[data-emoji=\"people_holding_hands_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone5_tone3:\"]::before,\nem[data-emoji=\"people_holding_hands_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone5_tone4:\"]::before,\nem[data-emoji=\"people_holding_hands_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":people_holding_hands_tone5:\"]::before,\nem[data-emoji=\"people_holding_hands_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":couple:\"]::before,\nem[data-emoji=\"couple\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone1:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b-1f3fb.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone1_tone2:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone1_tone3:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone1_tone4:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone1_tone5:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone2_tone1:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone2:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b-1f3fc.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone2_tone3:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone2_tone4:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone2_tone5:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone3_tone1:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone3_tone2:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone3:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b-1f3fd.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone3_tone4:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone3_tone5:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone4_tone1:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone4_tone2:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone4_tone3:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone4:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b-1f3fe.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone4_tone5:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone5_tone1:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone5_tone2:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone5_tone3:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone5_tone4:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":woman_and_man_holding_hands_tone5:\"]::before,\nem[data-emoji=\"woman_and_man_holding_hands_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b-1f3ff.svg\");\n}\nem[data-emoji=\":two_women_holding_hands:\"]::before,\nem[data-emoji=\"two_women_holding_hands\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone1:\"]::before,\nem[data-emoji=\"women_holding_hands_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d-1f3fb.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone1_tone2:\"]::before,\nem[data-emoji=\"women_holding_hands_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone1_tone3:\"]::before,\nem[data-emoji=\"women_holding_hands_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone1_tone4:\"]::before,\nem[data-emoji=\"women_holding_hands_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone1_tone5:\"]::before,\nem[data-emoji=\"women_holding_hands_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone2_tone1:\"]::before,\nem[data-emoji=\"women_holding_hands_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone2:\"]::before,\nem[data-emoji=\"women_holding_hands_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d-1f3fc.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone2_tone3:\"]::before,\nem[data-emoji=\"women_holding_hands_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone2_tone4:\"]::before,\nem[data-emoji=\"women_holding_hands_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone2_tone5:\"]::before,\nem[data-emoji=\"women_holding_hands_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone3_tone1:\"]::before,\nem[data-emoji=\"women_holding_hands_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone3_tone2:\"]::before,\nem[data-emoji=\"women_holding_hands_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone3:\"]::before,\nem[data-emoji=\"women_holding_hands_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d-1f3fd.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone3_tone4:\"]::before,\nem[data-emoji=\"women_holding_hands_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone3_tone5:\"]::before,\nem[data-emoji=\"women_holding_hands_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone4_tone1:\"]::before,\nem[data-emoji=\"women_holding_hands_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone4_tone2:\"]::before,\nem[data-emoji=\"women_holding_hands_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone4_tone3:\"]::before,\nem[data-emoji=\"women_holding_hands_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone4:\"]::before,\nem[data-emoji=\"women_holding_hands_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d-1f3fe.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone4_tone5:\"]::before,\nem[data-emoji=\"women_holding_hands_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone5_tone1:\"]::before,\nem[data-emoji=\"women_holding_hands_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone5_tone2:\"]::before,\nem[data-emoji=\"women_holding_hands_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone5_tone3:\"]::before,\nem[data-emoji=\"women_holding_hands_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone5_tone4:\"]::before,\nem[data-emoji=\"women_holding_hands_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":women_holding_hands_tone5:\"]::before,\nem[data-emoji=\"women_holding_hands_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d-1f3ff.svg\");\n}\nem[data-emoji=\":two_men_holding_hands:\"]::before,\nem[data-emoji=\"two_men_holding_hands\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone1:\"]::before,\nem[data-emoji=\"men_holding_hands_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c-1f3fb.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone1_tone2:\"]::before,\nem[data-emoji=\"men_holding_hands_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone1_tone3:\"]::before,\nem[data-emoji=\"men_holding_hands_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone1_tone4:\"]::before,\nem[data-emoji=\"men_holding_hands_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone1_tone5:\"]::before,\nem[data-emoji=\"men_holding_hands_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone2_tone1:\"]::before,\nem[data-emoji=\"men_holding_hands_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone2:\"]::before,\nem[data-emoji=\"men_holding_hands_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c-1f3fc.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone2_tone3:\"]::before,\nem[data-emoji=\"men_holding_hands_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone2_tone4:\"]::before,\nem[data-emoji=\"men_holding_hands_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone2_tone5:\"]::before,\nem[data-emoji=\"men_holding_hands_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone3_tone1:\"]::before,\nem[data-emoji=\"men_holding_hands_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone3_tone2:\"]::before,\nem[data-emoji=\"men_holding_hands_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone3:\"]::before,\nem[data-emoji=\"men_holding_hands_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c-1f3fd.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone3_tone4:\"]::before,\nem[data-emoji=\"men_holding_hands_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone3_tone5:\"]::before,\nem[data-emoji=\"men_holding_hands_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone4_tone1:\"]::before,\nem[data-emoji=\"men_holding_hands_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone4_tone2:\"]::before,\nem[data-emoji=\"men_holding_hands_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone4_tone3:\"]::before,\nem[data-emoji=\"men_holding_hands_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone4:\"]::before,\nem[data-emoji=\"men_holding_hands_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c-1f3fe.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone4_tone5:\"]::before,\nem[data-emoji=\"men_holding_hands_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone5_tone1:\"]::before,\nem[data-emoji=\"men_holding_hands_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone5_tone2:\"]::before,\nem[data-emoji=\"men_holding_hands_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone5_tone3:\"]::before,\nem[data-emoji=\"men_holding_hands_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone5_tone4:\"]::before,\nem[data-emoji=\"men_holding_hands_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":men_holding_hands_tone5:\"]::before,\nem[data-emoji=\"men_holding_hands_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart:\"]::before,\nem[data-emoji=\"couple_with_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491.svg\");\n}\nem[data-emoji=\":couple_with_heart_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone1_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone1_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone1_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone1_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone2_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone2_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone2_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone2_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone3_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone3_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone3_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone3_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone4_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone4_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone4_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone4_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone5_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone5_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone5_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_person_person_tone5_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_person_person_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2764-fe0f-200d-1f468.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone1_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone1_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone1_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone1_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone2_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone2_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone2_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone2_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone3_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone3_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone3_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone3_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone4_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone4_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone4_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone4_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone5_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone5_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone5_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone5_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_man_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_man_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":couple_ww:\"]::before,\nem[data-emoji=\"couple_ww\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2764-fe0f-200d-1f469.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone1_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone1_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone1_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone1_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone2_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone2_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone2_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone2_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone3_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone3_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone3_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone3_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone4_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone4_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone4_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone4_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone5_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone5_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone5_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone5_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_woman_woman_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_woman_woman_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":couple_mm:\"]::before,\nem[data-emoji=\"couple_mm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-2764-fe0f-200d-1f468.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone1_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone1_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone1_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone1_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone2_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone2_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone2_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone2_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone3_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone3_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone3_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone3_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone4_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone4_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone4_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone4_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone5_tone1:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone5_tone2:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone5_tone3:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone5_tone4:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":couple_with_heart_man_man_tone5:\"]::before,\nem[data-emoji=\"couple_with_heart_man_man_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":couplekiss:\"]::before,\nem[data-emoji=\"couplekiss\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f.svg\");\n}\nem[data-emoji=\":kiss_tone1:\"]::before,\nem[data-emoji=\"kiss_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone1_tone2:\"]::before,\nem[data-emoji=\"kiss_person_person_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone1_tone3:\"]::before,\nem[data-emoji=\"kiss_person_person_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone1_tone4:\"]::before,\nem[data-emoji=\"kiss_person_person_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone1_tone5:\"]::before,\nem[data-emoji=\"kiss_person_person_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone2_tone1:\"]::before,\nem[data-emoji=\"kiss_person_person_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_tone2:\"]::before,\nem[data-emoji=\"kiss_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone2_tone3:\"]::before,\nem[data-emoji=\"kiss_person_person_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone2_tone4:\"]::before,\nem[data-emoji=\"kiss_person_person_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone2_tone5:\"]::before,\nem[data-emoji=\"kiss_person_person_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone3_tone1:\"]::before,\nem[data-emoji=\"kiss_person_person_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone3_tone2:\"]::before,\nem[data-emoji=\"kiss_person_person_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_tone3:\"]::before,\nem[data-emoji=\"kiss_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone3_tone4:\"]::before,\nem[data-emoji=\"kiss_person_person_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone3_tone5:\"]::before,\nem[data-emoji=\"kiss_person_person_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone4_tone1:\"]::before,\nem[data-emoji=\"kiss_person_person_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone4_tone2:\"]::before,\nem[data-emoji=\"kiss_person_person_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone4_tone3:\"]::before,\nem[data-emoji=\"kiss_person_person_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_tone4:\"]::before,\nem[data-emoji=\"kiss_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone4_tone5:\"]::before,\nem[data-emoji=\"kiss_person_person_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone5_tone1:\"]::before,\nem[data-emoji=\"kiss_person_person_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone5_tone2:\"]::before,\nem[data-emoji=\"kiss_person_person_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone5_tone3:\"]::before,\nem[data-emoji=\"kiss_person_person_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_person_person_tone5_tone4:\"]::before,\nem[data-emoji=\"kiss_person_person_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_tone5:\"]::before,\nem[data-emoji=\"kiss_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_woman_man:\"]::before,\nem[data-emoji=\"kiss_woman_man\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone1:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone1_tone2:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone1_tone3:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone1_tone4:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone1_tone5:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone2_tone1:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone2:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone2_tone3:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone2_tone4:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone2_tone5:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone3_tone1:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone3_tone2:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone3:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone3_tone4:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone3_tone5:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone4_tone1:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone4_tone2:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone4_tone3:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone4:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone4_tone5:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone5_tone1:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone5_tone2:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone5_tone3:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone5_tone4:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_woman_man_tone5:\"]::before,\nem[data-emoji=\"kiss_woman_man_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_ww:\"]::before,\nem[data-emoji=\"kiss_ww\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone1:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone1_tone2:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone1_tone3:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone1_tone4:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone1_tone5:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone2_tone1:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone2:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone2_tone3:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone2_tone4:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone2_tone5:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone3_tone1:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone3_tone2:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone3:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone3_tone4:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone3_tone5:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone4_tone1:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone4_tone2:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone4_tone3:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone4:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone4_tone5:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone5_tone1:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone5_tone2:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone5_tone3:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone5_tone4:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_woman_woman_tone5:\"]::before,\nem[data-emoji=\"kiss_woman_woman_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_mm:\"]::before,\nem[data-emoji=\"kiss_mm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone1:\"]::before,\nem[data-emoji=\"kiss_man_man_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone1_tone2:\"]::before,\nem[data-emoji=\"kiss_man_man_tone1_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone1_tone3:\"]::before,\nem[data-emoji=\"kiss_man_man_tone1_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone1_tone4:\"]::before,\nem[data-emoji=\"kiss_man_man_tone1_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone1_tone5:\"]::before,\nem[data-emoji=\"kiss_man_man_tone1_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone2_tone1:\"]::before,\nem[data-emoji=\"kiss_man_man_tone2_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone2:\"]::before,\nem[data-emoji=\"kiss_man_man_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone2_tone3:\"]::before,\nem[data-emoji=\"kiss_man_man_tone2_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone2_tone4:\"]::before,\nem[data-emoji=\"kiss_man_man_tone2_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone2_tone5:\"]::before,\nem[data-emoji=\"kiss_man_man_tone2_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone3_tone1:\"]::before,\nem[data-emoji=\"kiss_man_man_tone3_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone3_tone2:\"]::before,\nem[data-emoji=\"kiss_man_man_tone3_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone3:\"]::before,\nem[data-emoji=\"kiss_man_man_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone3_tone4:\"]::before,\nem[data-emoji=\"kiss_man_man_tone3_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone3_tone5:\"]::before,\nem[data-emoji=\"kiss_man_man_tone3_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone4_tone1:\"]::before,\nem[data-emoji=\"kiss_man_man_tone4_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone4_tone2:\"]::before,\nem[data-emoji=\"kiss_man_man_tone4_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone4_tone3:\"]::before,\nem[data-emoji=\"kiss_man_man_tone4_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone4:\"]::before,\nem[data-emoji=\"kiss_man_man_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone4_tone5:\"]::before,\nem[data-emoji=\"kiss_man_man_tone4_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone5_tone1:\"]::before,\nem[data-emoji=\"kiss_man_man_tone5_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone5_tone2:\"]::before,\nem[data-emoji=\"kiss_man_man_tone5_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone5_tone3:\"]::before,\nem[data-emoji=\"kiss_man_man_tone5_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone5_tone4:\"]::before,\nem[data-emoji=\"kiss_man_man_tone5_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg\");\n}\nem[data-emoji=\":kiss_man_man_tone5:\"]::before,\nem[data-emoji=\"kiss_man_man_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg\");\n}\nem[data-emoji=\":family_adult_adult_child_child:\"]::before,\nem[data-emoji=\"family_adult_adult_child_child\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9d1-200d-1f9d2-200d-1f9d2.svg\");\n}\nem[data-emoji=\":family_adult_adult_child:\"]::before,\nem[data-emoji=\"family_adult_adult_child\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9d1-200d-1f9d2.svg\");\n}\nem[data-emoji=\":family_adult_child_child:\"]::before,\nem[data-emoji=\"family_adult_child_child\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9d2-200d-1f9d2.svg\");\n}\nem[data-emoji=\":family_adult_child:\"]::before,\nem[data-emoji=\"family_adult_child\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9d2.svg\");\n}\nem[data-emoji=\":family:\"]::before,\nem[data-emoji=\"family\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46a.svg\");\n}\nem[data-emoji=\":family_man_woman_boy:\"]::before,\nem[data-emoji=\"family_man_woman_boy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f469-200d-1f466.svg\");\n}\nem[data-emoji=\":family_mwg:\"]::before,\nem[data-emoji=\"family_mwg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f469-200d-1f467.svg\");\n}\nem[data-emoji=\":family_mwgb:\"]::before,\nem[data-emoji=\"family_mwgb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f469-200d-1f467-200d-1f466.svg\");\n}\nem[data-emoji=\":family_mwbb:\"]::before,\nem[data-emoji=\"family_mwbb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f469-200d-1f466-200d-1f466.svg\");\n}\nem[data-emoji=\":family_mwgg:\"]::before,\nem[data-emoji=\"family_mwgg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f469-200d-1f467-200d-1f467.svg\");\n}\nem[data-emoji=\":family_wwb:\"]::before,\nem[data-emoji=\"family_wwb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f469-200d-1f466.svg\");\n}\nem[data-emoji=\":family_wwg:\"]::before,\nem[data-emoji=\"family_wwg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f469-200d-1f467.svg\");\n}\nem[data-emoji=\":family_wwgb:\"]::before,\nem[data-emoji=\"family_wwgb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f469-200d-1f467-200d-1f466.svg\");\n}\nem[data-emoji=\":family_wwbb:\"]::before,\nem[data-emoji=\"family_wwbb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f469-200d-1f466-200d-1f466.svg\");\n}\nem[data-emoji=\":family_wwgg:\"]::before,\nem[data-emoji=\"family_wwgg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f469-200d-1f467-200d-1f467.svg\");\n}\nem[data-emoji=\":family_mmb:\"]::before,\nem[data-emoji=\"family_mmb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f468-200d-1f466.svg\");\n}\nem[data-emoji=\":family_mmg:\"]::before,\nem[data-emoji=\"family_mmg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f468-200d-1f467.svg\");\n}\nem[data-emoji=\":family_mmgb:\"]::before,\nem[data-emoji=\"family_mmgb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f468-200d-1f467-200d-1f466.svg\");\n}\nem[data-emoji=\":family_mmbb:\"]::before,\nem[data-emoji=\"family_mmbb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f468-200d-1f466-200d-1f466.svg\");\n}\nem[data-emoji=\":family_mmgg:\"]::before,\nem[data-emoji=\"family_mmgg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f468-200d-1f467-200d-1f467.svg\");\n}\nem[data-emoji=\":family_woman_boy:\"]::before,\nem[data-emoji=\"family_woman_boy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f466.svg\");\n}\nem[data-emoji=\":family_woman_girl:\"]::before,\nem[data-emoji=\"family_woman_girl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f467.svg\");\n}\nem[data-emoji=\":family_woman_girl_boy:\"]::before,\nem[data-emoji=\"family_woman_girl_boy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f467-200d-1f466.svg\");\n}\nem[data-emoji=\":family_woman_boy_boy:\"]::before,\nem[data-emoji=\"family_woman_boy_boy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f466-200d-1f466.svg\");\n}\nem[data-emoji=\":family_woman_girl_girl:\"]::before,\nem[data-emoji=\"family_woman_girl_girl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f467-200d-1f467.svg\");\n}\nem[data-emoji=\":family_man_boy:\"]::before,\nem[data-emoji=\"family_man_boy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f466.svg\");\n}\nem[data-emoji=\":family_man_girl:\"]::before,\nem[data-emoji=\"family_man_girl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f467.svg\");\n}\nem[data-emoji=\":family_man_girl_boy:\"]::before,\nem[data-emoji=\"family_man_girl_boy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f467-200d-1f466.svg\");\n}\nem[data-emoji=\":family_man_boy_boy:\"]::before,\nem[data-emoji=\"family_man_boy_boy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f466-200d-1f466.svg\");\n}\nem[data-emoji=\":family_man_girl_girl:\"]::before,\nem[data-emoji=\"family_man_girl_girl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f467-200d-1f467.svg\");\n}\nem[data-emoji=\":knot:\"]::before,\nem[data-emoji=\"knot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa2.svg\");\n}\nem[data-emoji=\":yarn:\"]::before,\nem[data-emoji=\"yarn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f6.svg\");\n}\nem[data-emoji=\":thread:\"]::before,\nem[data-emoji=\"thread\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f5.svg\");\n}\nem[data-emoji=\":sewing_needle:\"]::before,\nem[data-emoji=\"sewing_needle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa1.svg\");\n}\nem[data-emoji=\":coat:\"]::before,\nem[data-emoji=\"coat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e5.svg\");\n}\nem[data-emoji=\":lab_coat:\"]::before,\nem[data-emoji=\"lab_coat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97c.svg\");\n}\nem[data-emoji=\":safety_vest:\"]::before,\nem[data-emoji=\"safety_vest\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ba.svg\");\n}\nem[data-emoji=\":womans_clothes:\"]::before,\nem[data-emoji=\"womans_clothes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45a.svg\");\n}\nem[data-emoji=\":shirt:\"]::before,\nem[data-emoji=\"shirt\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f455.svg\");\n}\nem[data-emoji=\":jeans:\"]::before,\nem[data-emoji=\"jeans\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f456.svg\");\n}\nem[data-emoji=\":briefs:\"]::before,\nem[data-emoji=\"briefs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa72.svg\");\n}\nem[data-emoji=\":shorts:\"]::before,\nem[data-emoji=\"shorts\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa73.svg\");\n}\nem[data-emoji=\":necktie:\"]::before,\nem[data-emoji=\"necktie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f454.svg\");\n}\nem[data-emoji=\":dress:\"]::before,\nem[data-emoji=\"dress\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f457.svg\");\n}\nem[data-emoji=\":bikini:\"]::before,\nem[data-emoji=\"bikini\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f459.svg\");\n}\nem[data-emoji=\":one_piece_swimsuit:\"]::before,\nem[data-emoji=\"one_piece_swimsuit\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa71.svg\");\n}\nem[data-emoji=\":kimono:\"]::before,\nem[data-emoji=\"kimono\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f458.svg\");\n}\nem[data-emoji=\":sari:\"]::before,\nem[data-emoji=\"sari\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97b.svg\");\n}\nem[data-emoji=\":thong_sandal:\"]::before,\nem[data-emoji=\"thong_sandal\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa74.svg\");\n}\nem[data-emoji=\":womans_flat_shoe:\"]::before,\nem[data-emoji=\"womans_flat_shoe\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97f.svg\");\n}\nem[data-emoji=\":high_heel:\"]::before,\nem[data-emoji=\"high_heel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f460.svg\");\n}\nem[data-emoji=\":sandal:\"]::before,\nem[data-emoji=\"sandal\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f461.svg\");\n}\nem[data-emoji=\":boot:\"]::before,\nem[data-emoji=\"boot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f462.svg\");\n}\nem[data-emoji=\":mans_shoe:\"]::before,\nem[data-emoji=\"mans_shoe\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45e.svg\");\n}\nem[data-emoji=\":athletic_shoe:\"]::before,\nem[data-emoji=\"athletic_shoe\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45f.svg\");\n}\nem[data-emoji=\":hiking_boot:\"]::before,\nem[data-emoji=\"hiking_boot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97e.svg\");\n}\nem[data-emoji=\":socks:\"]::before,\nem[data-emoji=\"socks\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e6.svg\");\n}\nem[data-emoji=\":gloves:\"]::before,\nem[data-emoji=\"gloves\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e4.svg\");\n}\nem[data-emoji=\":scarf:\"]::before,\nem[data-emoji=\"scarf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e3.svg\");\n}\nem[data-emoji=\":tophat:\"]::before,\nem[data-emoji=\"tophat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a9.svg\");\n}\nem[data-emoji=\":billed_cap:\"]::before,\nem[data-emoji=\"billed_cap\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e2.svg\");\n}\nem[data-emoji=\":womans_hat:\"]::before,\nem[data-emoji=\"womans_hat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f452.svg\");\n}\nem[data-emoji=\":mortar_board:\"]::before,\nem[data-emoji=\"mortar_board\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f393.svg\");\n}\nem[data-emoji=\":helmet_with_cross:\"]::before,\nem[data-emoji=\"helmet_with_cross\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26d1.svg\");\n}\nem[data-emoji=\":military_helmet:\"]::before,\nem[data-emoji=\"military_helmet\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa96.svg\");\n}\nem[data-emoji=\":crown:\"]::before,\nem[data-emoji=\"crown\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f451.svg\");\n}\nem[data-emoji=\":ring:\"]::before,\nem[data-emoji=\"ring\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48d.svg\");\n}\nem[data-emoji=\":pouch:\"]::before,\nem[data-emoji=\"pouch\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45d.svg\");\n}\nem[data-emoji=\":purse:\"]::before,\nem[data-emoji=\"purse\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45b.svg\");\n}\nem[data-emoji=\":handbag:\"]::before,\nem[data-emoji=\"handbag\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45c.svg\");\n}\nem[data-emoji=\":briefcase:\"]::before,\nem[data-emoji=\"briefcase\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4bc.svg\");\n}\nem[data-emoji=\":school_satchel:\"]::before,\nem[data-emoji=\"school_satchel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f392.svg\");\n}\nem[data-emoji=\":luggage:\"]::before,\nem[data-emoji=\"luggage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f3.svg\");\n}\nem[data-emoji=\":eyeglasses:\"]::before,\nem[data-emoji=\"eyeglasses\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f453.svg\");\n}\nem[data-emoji=\":dark_sunglasses:\"]::before,\nem[data-emoji=\"dark_sunglasses\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f576.svg\");\n}\nem[data-emoji=\":goggles:\"]::before,\nem[data-emoji=\"goggles\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97d.svg\");\n}\nem[data-emoji=\":closed_umbrella:\"]::before,\nem[data-emoji=\"closed_umbrella\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f302.svg\");\n}\nem[data-emoji=\":curly_haired:\"]::before,\nem[data-emoji=\"curly_haired\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b1.svg\");\n}\nem[data-emoji=\":red_haired:\"]::before,\nem[data-emoji=\"red_haired\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b0.svg\");\n}\nem[data-emoji=\":white_haired:\"]::before,\nem[data-emoji=\"white_haired\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b3.svg\");\n}\nem[data-emoji=\":bald:\"]::before,\nem[data-emoji=\"bald\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b2.svg\");\n}\nem[data-emoji=\":dog:\"]::before,\nem[data-emoji=\"dog\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f436.svg\");\n}\nem[data-emoji=\":cat:\"]::before,\nem[data-emoji=\"cat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f431.svg\");\n}\nem[data-emoji=\":mouse:\"]::before,\nem[data-emoji=\"mouse\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42d.svg\");\n}\nem[data-emoji=\":hamster:\"]::before,\nem[data-emoji=\"hamster\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f439.svg\");\n}\nem[data-emoji=\":rabbit:\"]::before,\nem[data-emoji=\"rabbit\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f430.svg\");\n}\nem[data-emoji=\":fox:\"]::before,\nem[data-emoji=\"fox\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98a.svg\");\n}\nem[data-emoji=\":bear:\"]::before,\nem[data-emoji=\"bear\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43b.svg\");\n}\nem[data-emoji=\":panda_face:\"]::before,\nem[data-emoji=\"panda_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43c.svg\");\n}\nem[data-emoji=\":polar_bear:\"]::before,\nem[data-emoji=\"polar_bear\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43b-200d-2744-fe0f.svg\");\n}\nem[data-emoji=\":koala:\"]::before,\nem[data-emoji=\"koala\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f428.svg\");\n}\nem[data-emoji=\":tiger:\"]::before,\nem[data-emoji=\"tiger\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42f.svg\");\n}\nem[data-emoji=\":lion_face:\"]::before,\nem[data-emoji=\"lion_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f981.svg\");\n}\nem[data-emoji=\":cow:\"]::before,\nem[data-emoji=\"cow\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42e.svg\");\n}\nem[data-emoji=\":pig:\"]::before,\nem[data-emoji=\"pig\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f437.svg\");\n}\nem[data-emoji=\":pig_nose:\"]::before,\nem[data-emoji=\"pig_nose\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43d.svg\");\n}\nem[data-emoji=\":frog:\"]::before,\nem[data-emoji=\"frog\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f438.svg\");\n}\nem[data-emoji=\":monkey_face:\"]::before,\nem[data-emoji=\"monkey_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f435.svg\");\n}\nem[data-emoji=\":see_no_evil:\"]::before,\nem[data-emoji=\"see_no_evil\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f648.svg\");\n}\nem[data-emoji=\":hear_no_evil:\"]::before,\nem[data-emoji=\"hear_no_evil\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f649.svg\");\n}\nem[data-emoji=\":speak_no_evil:\"]::before,\nem[data-emoji=\"speak_no_evil\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64a.svg\");\n}\nem[data-emoji=\":monkey:\"]::before,\nem[data-emoji=\"monkey\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f412.svg\");\n}\nem[data-emoji=\":chicken:\"]::before,\nem[data-emoji=\"chicken\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f414.svg\");\n}\nem[data-emoji=\":penguin:\"]::before,\nem[data-emoji=\"penguin\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f427.svg\");\n}\nem[data-emoji=\":bird:\"]::before,\nem[data-emoji=\"bird\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f426.svg\");\n}\nem[data-emoji=\":baby_chick:\"]::before,\nem[data-emoji=\"baby_chick\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f424.svg\");\n}\nem[data-emoji=\":hatching_chick:\"]::before,\nem[data-emoji=\"hatching_chick\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f423.svg\");\n}\nem[data-emoji=\":hatched_chick:\"]::before,\nem[data-emoji=\"hatched_chick\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f425.svg\");\n}\nem[data-emoji=\":goose:\"]::before,\nem[data-emoji=\"goose\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fabf.svg\");\n}\nem[data-emoji=\":duck:\"]::before,\nem[data-emoji=\"duck\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f986.svg\");\n}\nem[data-emoji=\":black_bird:\"]::before,\nem[data-emoji=\"black_bird\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f426-200d-2b1b.svg\");\n}\nem[data-emoji=\":eagle:\"]::before,\nem[data-emoji=\"eagle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f985.svg\");\n}\nem[data-emoji=\":owl:\"]::before,\nem[data-emoji=\"owl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f989.svg\");\n}\nem[data-emoji=\":bat:\"]::before,\nem[data-emoji=\"bat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f987.svg\");\n}\nem[data-emoji=\":wolf:\"]::before,\nem[data-emoji=\"wolf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43a.svg\");\n}\nem[data-emoji=\":boar:\"]::before,\nem[data-emoji=\"boar\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f417.svg\");\n}\nem[data-emoji=\":horse:\"]::before,\nem[data-emoji=\"horse\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f434.svg\");\n}\nem[data-emoji=\":unicorn:\"]::before,\nem[data-emoji=\"unicorn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f984.svg\");\n}\nem[data-emoji=\":moose:\"]::before,\nem[data-emoji=\"moose\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1face.svg\");\n}\nem[data-emoji=\":bee:\"]::before,\nem[data-emoji=\"bee\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41d.svg\");\n}\nem[data-emoji=\":worm:\"]::before,\nem[data-emoji=\"worm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab1.svg\");\n}\nem[data-emoji=\":bug:\"]::before,\nem[data-emoji=\"bug\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41b.svg\");\n}\nem[data-emoji=\":butterfly:\"]::before,\nem[data-emoji=\"butterfly\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98b.svg\");\n}\nem[data-emoji=\":snail:\"]::before,\nem[data-emoji=\"snail\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40c.svg\");\n}\nem[data-emoji=\":lady_beetle:\"]::before,\nem[data-emoji=\"lady_beetle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41e.svg\");\n}\nem[data-emoji=\":ant:\"]::before,\nem[data-emoji=\"ant\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41c.svg\");\n}\nem[data-emoji=\":fly:\"]::before,\nem[data-emoji=\"fly\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab0.svg\");\n}\nem[data-emoji=\":beetle:\"]::before,\nem[data-emoji=\"beetle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab2.svg\");\n}\nem[data-emoji=\":cockroach:\"]::before,\nem[data-emoji=\"cockroach\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab3.svg\");\n}\nem[data-emoji=\":mosquito:\"]::before,\nem[data-emoji=\"mosquito\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99f.svg\");\n}\nem[data-emoji=\":cricket:\"]::before,\nem[data-emoji=\"cricket\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f997.svg\");\n}\nem[data-emoji=\":spider:\"]::before,\nem[data-emoji=\"spider\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f577.svg\");\n}\nem[data-emoji=\":spider_web:\"]::before,\nem[data-emoji=\"spider_web\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f578.svg\");\n}\nem[data-emoji=\":scorpion:\"]::before,\nem[data-emoji=\"scorpion\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f982.svg\");\n}\nem[data-emoji=\":turtle:\"]::before,\nem[data-emoji=\"turtle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f422.svg\");\n}\nem[data-emoji=\":snake:\"]::before,\nem[data-emoji=\"snake\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40d.svg\");\n}\nem[data-emoji=\":lizard:\"]::before,\nem[data-emoji=\"lizard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98e.svg\");\n}\nem[data-emoji=\":t_rex:\"]::before,\nem[data-emoji=\"t_rex\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f996.svg\");\n}\nem[data-emoji=\":sauropod:\"]::before,\nem[data-emoji=\"sauropod\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f995.svg\");\n}\nem[data-emoji=\":octopus:\"]::before,\nem[data-emoji=\"octopus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f419.svg\");\n}\nem[data-emoji=\":squid:\"]::before,\nem[data-emoji=\"squid\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f991.svg\");\n}\nem[data-emoji=\":jellyfish:\"]::before,\nem[data-emoji=\"jellyfish\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fabc.svg\");\n}\nem[data-emoji=\":shrimp:\"]::before,\nem[data-emoji=\"shrimp\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f990.svg\");\n}\nem[data-emoji=\":lobster:\"]::before,\nem[data-emoji=\"lobster\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99e.svg\");\n}\nem[data-emoji=\":crab:\"]::before,\nem[data-emoji=\"crab\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f980.svg\");\n}\nem[data-emoji=\":blowfish:\"]::before,\nem[data-emoji=\"blowfish\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f421.svg\");\n}\nem[data-emoji=\":tropical_fish:\"]::before,\nem[data-emoji=\"tropical_fish\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f420.svg\");\n}\nem[data-emoji=\":fish:\"]::before,\nem[data-emoji=\"fish\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41f.svg\");\n}\nem[data-emoji=\":dolphin:\"]::before,\nem[data-emoji=\"dolphin\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42c.svg\");\n}\nem[data-emoji=\":whale:\"]::before,\nem[data-emoji=\"whale\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f433.svg\");\n}\nem[data-emoji=\":whale2:\"]::before,\nem[data-emoji=\"whale2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40b.svg\");\n}\nem[data-emoji=\":shark:\"]::before,\nem[data-emoji=\"shark\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f988.svg\");\n}\nem[data-emoji=\":seal:\"]::before,\nem[data-emoji=\"seal\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ad.svg\");\n}\nem[data-emoji=\":crocodile:\"]::before,\nem[data-emoji=\"crocodile\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40a.svg\");\n}\nem[data-emoji=\":tiger2:\"]::before,\nem[data-emoji=\"tiger2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f405.svg\");\n}\nem[data-emoji=\":leopard:\"]::before,\nem[data-emoji=\"leopard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f406.svg\");\n}\nem[data-emoji=\":zebra:\"]::before,\nem[data-emoji=\"zebra\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f993.svg\");\n}\nem[data-emoji=\":gorilla:\"]::before,\nem[data-emoji=\"gorilla\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98d.svg\");\n}\nem[data-emoji=\":orangutan:\"]::before,\nem[data-emoji=\"orangutan\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a7.svg\");\n}\nem[data-emoji=\":mammoth:\"]::before,\nem[data-emoji=\"mammoth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a3.svg\");\n}\nem[data-emoji=\":elephant:\"]::before,\nem[data-emoji=\"elephant\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f418.svg\");\n}\nem[data-emoji=\":hippopotamus:\"]::before,\nem[data-emoji=\"hippopotamus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99b.svg\");\n}\nem[data-emoji=\":rhino:\"]::before,\nem[data-emoji=\"rhino\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98f.svg\");\n}\nem[data-emoji=\":dromedary_camel:\"]::before,\nem[data-emoji=\"dromedary_camel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42a.svg\");\n}\nem[data-emoji=\":camel:\"]::before,\nem[data-emoji=\"camel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42b.svg\");\n}\nem[data-emoji=\":giraffe:\"]::before,\nem[data-emoji=\"giraffe\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f992.svg\");\n}\nem[data-emoji=\":kangaroo:\"]::before,\nem[data-emoji=\"kangaroo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f998.svg\");\n}\nem[data-emoji=\":bison:\"]::before,\nem[data-emoji=\"bison\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ac.svg\");\n}\nem[data-emoji=\":water_buffalo:\"]::before,\nem[data-emoji=\"water_buffalo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f403.svg\");\n}\nem[data-emoji=\":ox:\"]::before,\nem[data-emoji=\"ox\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f402.svg\");\n}\nem[data-emoji=\":cow2:\"]::before,\nem[data-emoji=\"cow2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f404.svg\");\n}\nem[data-emoji=\":donkey:\"]::before,\nem[data-emoji=\"donkey\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1facf.svg\");\n}\nem[data-emoji=\":racehorse:\"]::before,\nem[data-emoji=\"racehorse\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40e.svg\");\n}\nem[data-emoji=\":pig2:\"]::before,\nem[data-emoji=\"pig2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f416.svg\");\n}\nem[data-emoji=\":ram:\"]::before,\nem[data-emoji=\"ram\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40f.svg\");\n}\nem[data-emoji=\":sheep:\"]::before,\nem[data-emoji=\"sheep\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f411.svg\");\n}\nem[data-emoji=\":llama:\"]::before,\nem[data-emoji=\"llama\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f999.svg\");\n}\nem[data-emoji=\":goat:\"]::before,\nem[data-emoji=\"goat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f410.svg\");\n}\nem[data-emoji=\":deer:\"]::before,\nem[data-emoji=\"deer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98c.svg\");\n}\nem[data-emoji=\":dog2:\"]::before,\nem[data-emoji=\"dog2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f415.svg\");\n}\nem[data-emoji=\":poodle:\"]::before,\nem[data-emoji=\"poodle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f429.svg\");\n}\nem[data-emoji=\":guide_dog:\"]::before,\nem[data-emoji=\"guide_dog\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ae.svg\");\n}\nem[data-emoji=\":service_dog:\"]::before,\nem[data-emoji=\"service_dog\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f415-200d-1f9ba.svg\");\n}\nem[data-emoji=\":cat2:\"]::before,\nem[data-emoji=\"cat2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f408.svg\");\n}\nem[data-emoji=\":black_cat:\"]::before,\nem[data-emoji=\"black_cat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f408-200d-2b1b.svg\");\n}\nem[data-emoji=\":feather:\"]::before,\nem[data-emoji=\"feather\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab6.svg\");\n}\nem[data-emoji=\":wing:\"]::before,\nem[data-emoji=\"wing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fabd.svg\");\n}\nem[data-emoji=\":rooster:\"]::before,\nem[data-emoji=\"rooster\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f413.svg\");\n}\nem[data-emoji=\":turkey:\"]::before,\nem[data-emoji=\"turkey\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f983.svg\");\n}\nem[data-emoji=\":dodo:\"]::before,\nem[data-emoji=\"dodo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a4.svg\");\n}\nem[data-emoji=\":peacock:\"]::before,\nem[data-emoji=\"peacock\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99a.svg\");\n}\nem[data-emoji=\":parrot:\"]::before,\nem[data-emoji=\"parrot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99c.svg\");\n}\nem[data-emoji=\":swan:\"]::before,\nem[data-emoji=\"swan\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a2.svg\");\n}\nem[data-emoji=\":flamingo:\"]::before,\nem[data-emoji=\"flamingo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a9.svg\");\n}\nem[data-emoji=\":dove:\"]::before,\nem[data-emoji=\"dove\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f54a.svg\");\n}\nem[data-emoji=\":rabbit2:\"]::before,\nem[data-emoji=\"rabbit2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f407.svg\");\n}\nem[data-emoji=\":raccoon:\"]::before,\nem[data-emoji=\"raccoon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99d.svg\");\n}\nem[data-emoji=\":skunk:\"]::before,\nem[data-emoji=\"skunk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a8.svg\");\n}\nem[data-emoji=\":badger:\"]::before,\nem[data-emoji=\"badger\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a1.svg\");\n}\nem[data-emoji=\":beaver:\"]::before,\nem[data-emoji=\"beaver\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ab.svg\");\n}\nem[data-emoji=\":otter:\"]::before,\nem[data-emoji=\"otter\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a6.svg\");\n}\nem[data-emoji=\":sloth:\"]::before,\nem[data-emoji=\"sloth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a5.svg\");\n}\nem[data-emoji=\":mouse2:\"]::before,\nem[data-emoji=\"mouse2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f401.svg\");\n}\nem[data-emoji=\":rat:\"]::before,\nem[data-emoji=\"rat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f400.svg\");\n}\nem[data-emoji=\":chipmunk:\"]::before,\nem[data-emoji=\"chipmunk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43f.svg\");\n}\nem[data-emoji=\":hedgehog:\"]::before,\nem[data-emoji=\"hedgehog\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f994.svg\");\n}\nem[data-emoji=\":feet:\"]::before,\nem[data-emoji=\"feet\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43e.svg\");\n}\nem[data-emoji=\":dragon:\"]::before,\nem[data-emoji=\"dragon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f409.svg\");\n}\nem[data-emoji=\":dragon_face:\"]::before,\nem[data-emoji=\"dragon_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f432.svg\");\n}\nem[data-emoji=\":phoenix:\"]::before,\nem[data-emoji=\"phoenix\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f426-200d-1f525.svg\");\n}\nem[data-emoji=\":cactus:\"]::before,\nem[data-emoji=\"cactus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f335.svg\");\n}\nem[data-emoji=\":christmas_tree:\"]::before,\nem[data-emoji=\"christmas_tree\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f384.svg\");\n}\nem[data-emoji=\":evergreen_tree:\"]::before,\nem[data-emoji=\"evergreen_tree\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f332.svg\");\n}\nem[data-emoji=\":deciduous_tree:\"]::before,\nem[data-emoji=\"deciduous_tree\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f333.svg\");\n}\nem[data-emoji=\":palm_tree:\"]::before,\nem[data-emoji=\"palm_tree\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f334.svg\");\n}\nem[data-emoji=\":wood:\"]::before,\nem[data-emoji=\"wood\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab5.svg\");\n}\nem[data-emoji=\":seedling:\"]::before,\nem[data-emoji=\"seedling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f331.svg\");\n}\nem[data-emoji=\":herb:\"]::before,\nem[data-emoji=\"herb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33f.svg\");\n}\nem[data-emoji=\":four_leaf_clover:\"]::before,\nem[data-emoji=\"four_leaf_clover\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f340.svg\");\n}\nem[data-emoji=\":bamboo:\"]::before,\nem[data-emoji=\"bamboo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38d.svg\");\n}\nem[data-emoji=\":potted_plant:\"]::before,\nem[data-emoji=\"potted_plant\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab4.svg\");\n}\nem[data-emoji=\":tanabata_tree:\"]::before,\nem[data-emoji=\"tanabata_tree\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38b.svg\");\n}\nem[data-emoji=\":leaves:\"]::before,\nem[data-emoji=\"leaves\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f343.svg\");\n}\nem[data-emoji=\":fallen_leaf:\"]::before,\nem[data-emoji=\"fallen_leaf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f342.svg\");\n}\nem[data-emoji=\":maple_leaf:\"]::before,\nem[data-emoji=\"maple_leaf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f341.svg\");\n}\nem[data-emoji=\":nest_with_eggs:\"]::before,\nem[data-emoji=\"nest_with_eggs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faba.svg\");\n}\nem[data-emoji=\":empty_nest:\"]::before,\nem[data-emoji=\"empty_nest\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab9.svg\");\n}\nem[data-emoji=\":mushroom:\"]::before,\nem[data-emoji=\"mushroom\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f344.svg\");\n}\nem[data-emoji=\":brown_mushroom:\"]::before,\nem[data-emoji=\"brown_mushroom\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f344-200d-1f7eb.svg\");\n}\nem[data-emoji=\":shell:\"]::before,\nem[data-emoji=\"shell\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41a.svg\");\n}\nem[data-emoji=\":coral:\"]::before,\nem[data-emoji=\"coral\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab8.svg\");\n}\nem[data-emoji=\":rock:\"]::before,\nem[data-emoji=\"rock\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa8.svg\");\n}\nem[data-emoji=\":ear_of_rice:\"]::before,\nem[data-emoji=\"ear_of_rice\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33e.svg\");\n}\nem[data-emoji=\":bouquet:\"]::before,\nem[data-emoji=\"bouquet\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f490.svg\");\n}\nem[data-emoji=\":tulip:\"]::before,\nem[data-emoji=\"tulip\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f337.svg\");\n}\nem[data-emoji=\":rose:\"]::before,\nem[data-emoji=\"rose\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f339.svg\");\n}\nem[data-emoji=\":wilted_rose:\"]::before,\nem[data-emoji=\"wilted_rose\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f940.svg\");\n}\nem[data-emoji=\":hyacinth:\"]::before,\nem[data-emoji=\"hyacinth\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fabb.svg\");\n}\nem[data-emoji=\":lotus:\"]::before,\nem[data-emoji=\"lotus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab7.svg\");\n}\nem[data-emoji=\":hibiscus:\"]::before,\nem[data-emoji=\"hibiscus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33a.svg\");\n}\nem[data-emoji=\":cherry_blossom:\"]::before,\nem[data-emoji=\"cherry_blossom\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f338.svg\");\n}\nem[data-emoji=\":blossom:\"]::before,\nem[data-emoji=\"blossom\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33c.svg\");\n}\nem[data-emoji=\":sunflower:\"]::before,\nem[data-emoji=\"sunflower\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33b.svg\");\n}\nem[data-emoji=\":sun_with_face:\"]::before,\nem[data-emoji=\"sun_with_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31e.svg\");\n}\nem[data-emoji=\":full_moon_with_face:\"]::before,\nem[data-emoji=\"full_moon_with_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31d.svg\");\n}\nem[data-emoji=\":first_quarter_moon_with_face:\"]::before,\nem[data-emoji=\"first_quarter_moon_with_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31b.svg\");\n}\nem[data-emoji=\":last_quarter_moon_with_face:\"]::before,\nem[data-emoji=\"last_quarter_moon_with_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31c.svg\");\n}\nem[data-emoji=\":new_moon_with_face:\"]::before,\nem[data-emoji=\"new_moon_with_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31a.svg\");\n}\nem[data-emoji=\":full_moon:\"]::before,\nem[data-emoji=\"full_moon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f315.svg\");\n}\nem[data-emoji=\":waning_gibbous_moon:\"]::before,\nem[data-emoji=\"waning_gibbous_moon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f316.svg\");\n}\nem[data-emoji=\":last_quarter_moon:\"]::before,\nem[data-emoji=\"last_quarter_moon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f317.svg\");\n}\nem[data-emoji=\":waning_crescent_moon:\"]::before,\nem[data-emoji=\"waning_crescent_moon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f318.svg\");\n}\nem[data-emoji=\":new_moon:\"]::before,\nem[data-emoji=\"new_moon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f311.svg\");\n}\nem[data-emoji=\":waxing_crescent_moon:\"]::before,\nem[data-emoji=\"waxing_crescent_moon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f312.svg\");\n}\nem[data-emoji=\":first_quarter_moon:\"]::before,\nem[data-emoji=\"first_quarter_moon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f313.svg\");\n}\nem[data-emoji=\":waxing_gibbous_moon:\"]::before,\nem[data-emoji=\"waxing_gibbous_moon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f314.svg\");\n}\nem[data-emoji=\":crescent_moon:\"]::before,\nem[data-emoji=\"crescent_moon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f319.svg\");\n}\nem[data-emoji=\":earth_americas:\"]::before,\nem[data-emoji=\"earth_americas\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30e.svg\");\n}\nem[data-emoji=\":earth_africa:\"]::before,\nem[data-emoji=\"earth_africa\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30d.svg\");\n}\nem[data-emoji=\":earth_asia:\"]::before,\nem[data-emoji=\"earth_asia\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30f.svg\");\n}\nem[data-emoji=\":ringed_planet:\"]::before,\nem[data-emoji=\"ringed_planet\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa90.svg\");\n}\nem[data-emoji=\":dizzy:\"]::before,\nem[data-emoji=\"dizzy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ab.svg\");\n}\nem[data-emoji=\":star:\"]::before,\nem[data-emoji=\"star\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b50.svg\");\n}\nem[data-emoji=\":star2:\"]::before,\nem[data-emoji=\"star2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31f.svg\");\n}\nem[data-emoji=\":zap:\"]::before,\nem[data-emoji=\"zap\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26a1.svg\");\n}\nem[data-emoji=\":boom:\"]::before,\nem[data-emoji=\"boom\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a5.svg\");\n}\nem[data-emoji=\":fire:\"]::before,\nem[data-emoji=\"fire\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f525.svg\");\n}\nem[data-emoji=\":cloud_tornado:\"]::before,\nem[data-emoji=\"cloud_tornado\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32a.svg\");\n}\nem[data-emoji=\":rainbow:\"]::before,\nem[data-emoji=\"rainbow\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f308.svg\");\n}\nem[data-emoji=\":white_sun_small_cloud:\"]::before,\nem[data-emoji=\"white_sun_small_cloud\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f324.svg\");\n}\nem[data-emoji=\":partly_sunny:\"]::before,\nem[data-emoji=\"partly_sunny\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26c5.svg\");\n}\nem[data-emoji=\":white_sun_cloud:\"]::before,\nem[data-emoji=\"white_sun_cloud\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f325.svg\");\n}\nem[data-emoji=\":white_sun_rain_cloud:\"]::before,\nem[data-emoji=\"white_sun_rain_cloud\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f326.svg\");\n}\nem[data-emoji=\":cloud_rain:\"]::before,\nem[data-emoji=\"cloud_rain\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f327.svg\");\n}\nem[data-emoji=\":thunder_cloud_rain:\"]::before,\nem[data-emoji=\"thunder_cloud_rain\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26c8.svg\");\n}\nem[data-emoji=\":cloud_lightning:\"]::before,\nem[data-emoji=\"cloud_lightning\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f329.svg\");\n}\nem[data-emoji=\":cloud_snow:\"]::before,\nem[data-emoji=\"cloud_snow\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f328.svg\");\n}\nem[data-emoji=\":snowman:\"]::before,\nem[data-emoji=\"snowman\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26c4.svg\");\n}\nem[data-emoji=\":wind_blowing_face:\"]::before,\nem[data-emoji=\"wind_blowing_face\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32c.svg\");\n}\nem[data-emoji=\":dash:\"]::before,\nem[data-emoji=\"dash\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a8.svg\");\n}\nem[data-emoji=\":droplet:\"]::before,\nem[data-emoji=\"droplet\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a7.svg\");\n}\nem[data-emoji=\":sweat_drops:\"]::before,\nem[data-emoji=\"sweat_drops\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a6.svg\");\n}\nem[data-emoji=\":bubbles:\"]::before,\nem[data-emoji=\"bubbles\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae7.svg\");\n}\nem[data-emoji=\":ocean:\"]::before,\nem[data-emoji=\"ocean\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30a.svg\");\n}\nem[data-emoji=\":fog:\"]::before,\nem[data-emoji=\"fog\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32b.svg\");\n}\nem[data-emoji=\":green_apple:\"]::before,\nem[data-emoji=\"green_apple\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34f.svg\");\n}\nem[data-emoji=\":apple:\"]::before,\nem[data-emoji=\"apple\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34e.svg\");\n}\nem[data-emoji=\":pear:\"]::before,\nem[data-emoji=\"pear\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f350.svg\");\n}\nem[data-emoji=\":tangerine:\"]::before,\nem[data-emoji=\"tangerine\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34a.svg\");\n}\nem[data-emoji=\":lemon:\"]::before,\nem[data-emoji=\"lemon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34b.svg\");\n}\nem[data-emoji=\":lime:\"]::before,\nem[data-emoji=\"lime\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34b-200d-1f7e9.svg\");\n}\nem[data-emoji=\":banana:\"]::before,\nem[data-emoji=\"banana\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34c.svg\");\n}\nem[data-emoji=\":watermelon:\"]::before,\nem[data-emoji=\"watermelon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f349.svg\");\n}\nem[data-emoji=\":grapes:\"]::before,\nem[data-emoji=\"grapes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f347.svg\");\n}\nem[data-emoji=\":strawberry:\"]::before,\nem[data-emoji=\"strawberry\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f353.svg\");\n}\nem[data-emoji=\":blueberries:\"]::before,\nem[data-emoji=\"blueberries\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad0.svg\");\n}\nem[data-emoji=\":melon:\"]::before,\nem[data-emoji=\"melon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f348.svg\");\n}\nem[data-emoji=\":cherries:\"]::before,\nem[data-emoji=\"cherries\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f352.svg\");\n}\nem[data-emoji=\":peach:\"]::before,\nem[data-emoji=\"peach\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f351.svg\");\n}\nem[data-emoji=\":mango:\"]::before,\nem[data-emoji=\"mango\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96d.svg\");\n}\nem[data-emoji=\":pineapple:\"]::before,\nem[data-emoji=\"pineapple\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34d.svg\");\n}\nem[data-emoji=\":coconut:\"]::before,\nem[data-emoji=\"coconut\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f965.svg\");\n}\nem[data-emoji=\":kiwi:\"]::before,\nem[data-emoji=\"kiwi\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95d.svg\");\n}\nem[data-emoji=\":tomato:\"]::before,\nem[data-emoji=\"tomato\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f345.svg\");\n}\nem[data-emoji=\":eggplant:\"]::before,\nem[data-emoji=\"eggplant\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f346.svg\");\n}\nem[data-emoji=\":avocado:\"]::before,\nem[data-emoji=\"avocado\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f951.svg\");\n}\nem[data-emoji=\":pea_pod:\"]::before,\nem[data-emoji=\"pea_pod\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fadb.svg\");\n}\nem[data-emoji=\":broccoli:\"]::before,\nem[data-emoji=\"broccoli\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f966.svg\");\n}\nem[data-emoji=\":leafy_green:\"]::before,\nem[data-emoji=\"leafy_green\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96c.svg\");\n}\nem[data-emoji=\":cucumber:\"]::before,\nem[data-emoji=\"cucumber\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f952.svg\");\n}\nem[data-emoji=\":hot_pepper:\"]::before,\nem[data-emoji=\"hot_pepper\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f336.svg\");\n}\nem[data-emoji=\":bell_pepper:\"]::before,\nem[data-emoji=\"bell_pepper\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad1.svg\");\n}\nem[data-emoji=\":corn:\"]::before,\nem[data-emoji=\"corn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33d.svg\");\n}\nem[data-emoji=\":carrot:\"]::before,\nem[data-emoji=\"carrot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f955.svg\");\n}\nem[data-emoji=\":olive:\"]::before,\nem[data-emoji=\"olive\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad2.svg\");\n}\nem[data-emoji=\":garlic:\"]::before,\nem[data-emoji=\"garlic\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c4.svg\");\n}\nem[data-emoji=\":onion:\"]::before,\nem[data-emoji=\"onion\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c5.svg\");\n}\nem[data-emoji=\":potato:\"]::before,\nem[data-emoji=\"potato\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f954.svg\");\n}\nem[data-emoji=\":sweet_potato:\"]::before,\nem[data-emoji=\"sweet_potato\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f360.svg\");\n}\nem[data-emoji=\":ginger_root:\"]::before,\nem[data-emoji=\"ginger_root\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fada.svg\");\n}\nem[data-emoji=\":croissant:\"]::before,\nem[data-emoji=\"croissant\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f950.svg\");\n}\nem[data-emoji=\":bagel:\"]::before,\nem[data-emoji=\"bagel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96f.svg\");\n}\nem[data-emoji=\":bread:\"]::before,\nem[data-emoji=\"bread\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35e.svg\");\n}\nem[data-emoji=\":french_bread:\"]::before,\nem[data-emoji=\"french_bread\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f956.svg\");\n}\nem[data-emoji=\":pretzel:\"]::before,\nem[data-emoji=\"pretzel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f968.svg\");\n}\nem[data-emoji=\":cheese:\"]::before,\nem[data-emoji=\"cheese\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c0.svg\");\n}\nem[data-emoji=\":egg:\"]::before,\nem[data-emoji=\"egg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95a.svg\");\n}\nem[data-emoji=\":cooking:\"]::before,\nem[data-emoji=\"cooking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f373.svg\");\n}\nem[data-emoji=\":butter:\"]::before,\nem[data-emoji=\"butter\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c8.svg\");\n}\nem[data-emoji=\":pancakes:\"]::before,\nem[data-emoji=\"pancakes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95e.svg\");\n}\nem[data-emoji=\":waffle:\"]::before,\nem[data-emoji=\"waffle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c7.svg\");\n}\nem[data-emoji=\":bacon:\"]::before,\nem[data-emoji=\"bacon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f953.svg\");\n}\nem[data-emoji=\":cut_of_meat:\"]::before,\nem[data-emoji=\"cut_of_meat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f969.svg\");\n}\nem[data-emoji=\":poultry_leg:\"]::before,\nem[data-emoji=\"poultry_leg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f357.svg\");\n}\nem[data-emoji=\":meat_on_bone:\"]::before,\nem[data-emoji=\"meat_on_bone\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f356.svg\");\n}\nem[data-emoji=\":bone:\"]::before,\nem[data-emoji=\"bone\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b4.svg\");\n}\nem[data-emoji=\":hotdog:\"]::before,\nem[data-emoji=\"hotdog\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32d.svg\");\n}\nem[data-emoji=\":hamburger:\"]::before,\nem[data-emoji=\"hamburger\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f354.svg\");\n}\nem[data-emoji=\":fries:\"]::before,\nem[data-emoji=\"fries\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35f.svg\");\n}\nem[data-emoji=\":pizza:\"]::before,\nem[data-emoji=\"pizza\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f355.svg\");\n}\nem[data-emoji=\":flatbread:\"]::before,\nem[data-emoji=\"flatbread\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad3.svg\");\n}\nem[data-emoji=\":sandwich:\"]::before,\nem[data-emoji=\"sandwich\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96a.svg\");\n}\nem[data-emoji=\":stuffed_flatbread:\"]::before,\nem[data-emoji=\"stuffed_flatbread\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f959.svg\");\n}\nem[data-emoji=\":falafel:\"]::before,\nem[data-emoji=\"falafel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c6.svg\");\n}\nem[data-emoji=\":taco:\"]::before,\nem[data-emoji=\"taco\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32e.svg\");\n}\nem[data-emoji=\":burrito:\"]::before,\nem[data-emoji=\"burrito\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32f.svg\");\n}\nem[data-emoji=\":tamale:\"]::before,\nem[data-emoji=\"tamale\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad4.svg\");\n}\nem[data-emoji=\":salad:\"]::before,\nem[data-emoji=\"salad\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f957.svg\");\n}\nem[data-emoji=\":shallow_pan_of_food:\"]::before,\nem[data-emoji=\"shallow_pan_of_food\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f958.svg\");\n}\nem[data-emoji=\":fondue:\"]::before,\nem[data-emoji=\"fondue\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad5.svg\");\n}\nem[data-emoji=\":canned_food:\"]::before,\nem[data-emoji=\"canned_food\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96b.svg\");\n}\nem[data-emoji=\":jar:\"]::before,\nem[data-emoji=\"jar\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad9.svg\");\n}\nem[data-emoji=\":spaghetti:\"]::before,\nem[data-emoji=\"spaghetti\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35d.svg\");\n}\nem[data-emoji=\":ramen:\"]::before,\nem[data-emoji=\"ramen\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35c.svg\");\n}\nem[data-emoji=\":stew:\"]::before,\nem[data-emoji=\"stew\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f372.svg\");\n}\nem[data-emoji=\":curry:\"]::before,\nem[data-emoji=\"curry\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35b.svg\");\n}\nem[data-emoji=\":sushi:\"]::before,\nem[data-emoji=\"sushi\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f363.svg\");\n}\nem[data-emoji=\":bento:\"]::before,\nem[data-emoji=\"bento\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f371.svg\");\n}\nem[data-emoji=\":dumpling:\"]::before,\nem[data-emoji=\"dumpling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95f.svg\");\n}\nem[data-emoji=\":oyster:\"]::before,\nem[data-emoji=\"oyster\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9aa.svg\");\n}\nem[data-emoji=\":fried_shrimp:\"]::before,\nem[data-emoji=\"fried_shrimp\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f364.svg\");\n}\nem[data-emoji=\":rice_ball:\"]::before,\nem[data-emoji=\"rice_ball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f359.svg\");\n}\nem[data-emoji=\":rice:\"]::before,\nem[data-emoji=\"rice\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35a.svg\");\n}\nem[data-emoji=\":rice_cracker:\"]::before,\nem[data-emoji=\"rice_cracker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f358.svg\");\n}\nem[data-emoji=\":fish_cake:\"]::before,\nem[data-emoji=\"fish_cake\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f365.svg\");\n}\nem[data-emoji=\":fortune_cookie:\"]::before,\nem[data-emoji=\"fortune_cookie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f960.svg\");\n}\nem[data-emoji=\":moon_cake:\"]::before,\nem[data-emoji=\"moon_cake\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96e.svg\");\n}\nem[data-emoji=\":oden:\"]::before,\nem[data-emoji=\"oden\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f362.svg\");\n}\nem[data-emoji=\":dango:\"]::before,\nem[data-emoji=\"dango\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f361.svg\");\n}\nem[data-emoji=\":shaved_ice:\"]::before,\nem[data-emoji=\"shaved_ice\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f367.svg\");\n}\nem[data-emoji=\":ice_cream:\"]::before,\nem[data-emoji=\"ice_cream\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f368.svg\");\n}\nem[data-emoji=\":icecream:\"]::before,\nem[data-emoji=\"icecream\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f366.svg\");\n}\nem[data-emoji=\":pie:\"]::before,\nem[data-emoji=\"pie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f967.svg\");\n}\nem[data-emoji=\":cupcake:\"]::before,\nem[data-emoji=\"cupcake\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c1.svg\");\n}\nem[data-emoji=\":cake:\"]::before,\nem[data-emoji=\"cake\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f370.svg\");\n}\nem[data-emoji=\":birthday:\"]::before,\nem[data-emoji=\"birthday\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f382.svg\");\n}\nem[data-emoji=\":custard:\"]::before,\nem[data-emoji=\"custard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36e.svg\");\n}\nem[data-emoji=\":lollipop:\"]::before,\nem[data-emoji=\"lollipop\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36d.svg\");\n}\nem[data-emoji=\":candy:\"]::before,\nem[data-emoji=\"candy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36c.svg\");\n}\nem[data-emoji=\":chocolate_bar:\"]::before,\nem[data-emoji=\"chocolate_bar\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36b.svg\");\n}\nem[data-emoji=\":popcorn:\"]::before,\nem[data-emoji=\"popcorn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37f.svg\");\n}\nem[data-emoji=\":doughnut:\"]::before,\nem[data-emoji=\"doughnut\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f369.svg\");\n}\nem[data-emoji=\":cookie:\"]::before,\nem[data-emoji=\"cookie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36a.svg\");\n}\nem[data-emoji=\":chestnut:\"]::before,\nem[data-emoji=\"chestnut\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f330.svg\");\n}\nem[data-emoji=\":peanuts:\"]::before,\nem[data-emoji=\"peanuts\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95c.svg\");\n}\nem[data-emoji=\":beans:\"]::before,\nem[data-emoji=\"beans\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad8.svg\");\n}\nem[data-emoji=\":honey_pot:\"]::before,\nem[data-emoji=\"honey_pot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36f.svg\");\n}\nem[data-emoji=\":milk:\"]::before,\nem[data-emoji=\"milk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95b.svg\");\n}\nem[data-emoji=\":pouring_liquid:\"]::before,\nem[data-emoji=\"pouring_liquid\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad7.svg\");\n}\nem[data-emoji=\":baby_bottle:\"]::before,\nem[data-emoji=\"baby_bottle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37c.svg\");\n}\nem[data-emoji=\":teapot:\"]::before,\nem[data-emoji=\"teapot\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad6.svg\");\n}\nem[data-emoji=\":tea:\"]::before,\nem[data-emoji=\"tea\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f375.svg\");\n}\nem[data-emoji=\":mate:\"]::before,\nem[data-emoji=\"mate\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c9.svg\");\n}\nem[data-emoji=\":beverage_box:\"]::before,\nem[data-emoji=\"beverage_box\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c3.svg\");\n}\nem[data-emoji=\":cup_with_straw:\"]::before,\nem[data-emoji=\"cup_with_straw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f964.svg\");\n}\nem[data-emoji=\":bubble_tea:\"]::before,\nem[data-emoji=\"bubble_tea\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cb.svg\");\n}\nem[data-emoji=\":sake:\"]::before,\nem[data-emoji=\"sake\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f376.svg\");\n}\nem[data-emoji=\":beer:\"]::before,\nem[data-emoji=\"beer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37a.svg\");\n}\nem[data-emoji=\":beers:\"]::before,\nem[data-emoji=\"beers\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37b.svg\");\n}\nem[data-emoji=\":champagne_glass:\"]::before,\nem[data-emoji=\"champagne_glass\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f942.svg\");\n}\nem[data-emoji=\":wine_glass:\"]::before,\nem[data-emoji=\"wine_glass\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f377.svg\");\n}\nem[data-emoji=\":tumbler_glass:\"]::before,\nem[data-emoji=\"tumbler_glass\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f943.svg\");\n}\nem[data-emoji=\":cocktail:\"]::before,\nem[data-emoji=\"cocktail\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f378.svg\");\n}\nem[data-emoji=\":tropical_drink:\"]::before,\nem[data-emoji=\"tropical_drink\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f379.svg\");\n}\nem[data-emoji=\":champagne:\"]::before,\nem[data-emoji=\"champagne\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37e.svg\");\n}\nem[data-emoji=\":ice_cube:\"]::before,\nem[data-emoji=\"ice_cube\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ca.svg\");\n}\nem[data-emoji=\":spoon:\"]::before,\nem[data-emoji=\"spoon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f944.svg\");\n}\nem[data-emoji=\":fork_and_knife:\"]::before,\nem[data-emoji=\"fork_and_knife\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f374.svg\");\n}\nem[data-emoji=\":fork_knife_plate:\"]::before,\nem[data-emoji=\"fork_knife_plate\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37d.svg\");\n}\nem[data-emoji=\":bowl_with_spoon:\"]::before,\nem[data-emoji=\"bowl_with_spoon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f963.svg\");\n}\nem[data-emoji=\":takeout_box:\"]::before,\nem[data-emoji=\"takeout_box\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f961.svg\");\n}\nem[data-emoji=\":chopsticks:\"]::before,\nem[data-emoji=\"chopsticks\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f962.svg\");\n}\nem[data-emoji=\":salt:\"]::before,\nem[data-emoji=\"salt\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c2.svg\");\n}\nem[data-emoji=\":soccer:\"]::before,\nem[data-emoji=\"soccer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26bd.svg\");\n}\nem[data-emoji=\":basketball:\"]::before,\nem[data-emoji=\"basketball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c0.svg\");\n}\nem[data-emoji=\":football:\"]::before,\nem[data-emoji=\"football\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c8.svg\");\n}\nem[data-emoji=\":baseball:\"]::before,\nem[data-emoji=\"baseball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26be.svg\");\n}\nem[data-emoji=\":softball:\"]::before,\nem[data-emoji=\"softball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94e.svg\");\n}\nem[data-emoji=\":tennis:\"]::before,\nem[data-emoji=\"tennis\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3be.svg\");\n}\nem[data-emoji=\":volleyball:\"]::before,\nem[data-emoji=\"volleyball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d0.svg\");\n}\nem[data-emoji=\":rugby_football:\"]::before,\nem[data-emoji=\"rugby_football\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c9.svg\");\n}\nem[data-emoji=\":flying_disc:\"]::before,\nem[data-emoji=\"flying_disc\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94f.svg\");\n}\nem[data-emoji=\":8ball:\"]::before,\nem[data-emoji=\"8ball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b1.svg\");\n}\nem[data-emoji=\":yo_yo:\"]::before,\nem[data-emoji=\"yo_yo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa80.svg\");\n}\nem[data-emoji=\":ping_pong:\"]::before,\nem[data-emoji=\"ping_pong\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d3.svg\");\n}\nem[data-emoji=\":badminton:\"]::before,\nem[data-emoji=\"badminton\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f8.svg\");\n}\nem[data-emoji=\":hockey:\"]::before,\nem[data-emoji=\"hockey\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d2.svg\");\n}\nem[data-emoji=\":field_hockey:\"]::before,\nem[data-emoji=\"field_hockey\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d1.svg\");\n}\nem[data-emoji=\":lacrosse:\"]::before,\nem[data-emoji=\"lacrosse\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94d.svg\");\n}\nem[data-emoji=\":cricket_game:\"]::before,\nem[data-emoji=\"cricket_game\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cf.svg\");\n}\nem[data-emoji=\":boomerang:\"]::before,\nem[data-emoji=\"boomerang\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa83.svg\");\n}\nem[data-emoji=\":goal:\"]::before,\nem[data-emoji=\"goal\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f945.svg\");\n}\nem[data-emoji=\":golf:\"]::before,\nem[data-emoji=\"golf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f3.svg\");\n}\nem[data-emoji=\":kite:\"]::before,\nem[data-emoji=\"kite\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa81.svg\");\n}\nem[data-emoji=\":playground_slide:\"]::before,\nem[data-emoji=\"playground_slide\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6dd.svg\");\n}\nem[data-emoji=\":bow_and_arrow:\"]::before,\nem[data-emoji=\"bow_and_arrow\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f9.svg\");\n}\nem[data-emoji=\":fishing_pole_and_fish:\"]::before,\nem[data-emoji=\"fishing_pole_and_fish\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a3.svg\");\n}\nem[data-emoji=\":diving_mask:\"]::before,\nem[data-emoji=\"diving_mask\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93f.svg\");\n}\nem[data-emoji=\":boxing_glove:\"]::before,\nem[data-emoji=\"boxing_glove\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94a.svg\");\n}\nem[data-emoji=\":martial_arts_uniform:\"]::before,\nem[data-emoji=\"martial_arts_uniform\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94b.svg\");\n}\nem[data-emoji=\":running_shirt_with_sash:\"]::before,\nem[data-emoji=\"running_shirt_with_sash\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3bd.svg\");\n}\nem[data-emoji=\":skateboard:\"]::before,\nem[data-emoji=\"skateboard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f9.svg\");\n}\nem[data-emoji=\":roller_skate:\"]::before,\nem[data-emoji=\"roller_skate\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6fc.svg\");\n}\nem[data-emoji=\":sled:\"]::before,\nem[data-emoji=\"sled\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f7.svg\");\n}\nem[data-emoji=\":ice_skate:\"]::before,\nem[data-emoji=\"ice_skate\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f8.svg\");\n}\nem[data-emoji=\":curling_stone:\"]::before,\nem[data-emoji=\"curling_stone\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94c.svg\");\n}\nem[data-emoji=\":ski:\"]::before,\nem[data-emoji=\"ski\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3bf.svg\");\n}\nem[data-emoji=\":skier:\"]::before,\nem[data-emoji=\"skier\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f7.svg\");\n}\nem[data-emoji=\":snowboarder:\"]::before,\nem[data-emoji=\"snowboarder\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2.svg\");\n}\nem[data-emoji=\":snowboarder_tone1:\"]::before,\nem[data-emoji=\"snowboarder_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2-1f3fb.svg\");\n}\nem[data-emoji=\":snowboarder_tone2:\"]::before,\nem[data-emoji=\"snowboarder_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2-1f3fc.svg\");\n}\nem[data-emoji=\":snowboarder_tone3:\"]::before,\nem[data-emoji=\"snowboarder_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2-1f3fd.svg\");\n}\nem[data-emoji=\":snowboarder_tone4:\"]::before,\nem[data-emoji=\"snowboarder_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2-1f3fe.svg\");\n}\nem[data-emoji=\":snowboarder_tone5:\"]::before,\nem[data-emoji=\"snowboarder_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2-1f3ff.svg\");\n}\nem[data-emoji=\":parachute:\"]::before,\nem[data-emoji=\"parachute\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa82.svg\");\n}\nem[data-emoji=\":person_lifting_weights:\"]::before,\nem[data-emoji=\"person_lifting_weights\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb.svg\");\n}\nem[data-emoji=\":person_lifting_weights_tone1:\"]::before,\nem[data-emoji=\"person_lifting_weights_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fb.svg\");\n}\nem[data-emoji=\":person_lifting_weights_tone2:\"]::before,\nem[data-emoji=\"person_lifting_weights_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fc.svg\");\n}\nem[data-emoji=\":person_lifting_weights_tone3:\"]::before,\nem[data-emoji=\"person_lifting_weights_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fd.svg\");\n}\nem[data-emoji=\":person_lifting_weights_tone4:\"]::before,\nem[data-emoji=\"person_lifting_weights_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fe.svg\");\n}\nem[data-emoji=\":person_lifting_weights_tone5:\"]::before,\nem[data-emoji=\"person_lifting_weights_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3ff.svg\");\n}\nem[data-emoji=\":woman_lifting_weights:\"]::before,\nem[data-emoji=\"woman_lifting_weights\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-fe0f-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_lifting_weights_tone1:\"]::before,\nem[data-emoji=\"woman_lifting_weights_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_lifting_weights_tone2:\"]::before,\nem[data-emoji=\"woman_lifting_weights_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_lifting_weights_tone3:\"]::before,\nem[data-emoji=\"woman_lifting_weights_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_lifting_weights_tone4:\"]::before,\nem[data-emoji=\"woman_lifting_weights_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_lifting_weights_tone5:\"]::before,\nem[data-emoji=\"woman_lifting_weights_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_lifting_weights:\"]::before,\nem[data-emoji=\"man_lifting_weights\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-fe0f-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_lifting_weights_tone1:\"]::before,\nem[data-emoji=\"man_lifting_weights_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_lifting_weights_tone2:\"]::before,\nem[data-emoji=\"man_lifting_weights_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_lifting_weights_tone3:\"]::before,\nem[data-emoji=\"man_lifting_weights_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_lifting_weights_tone4:\"]::before,\nem[data-emoji=\"man_lifting_weights_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_lifting_weights_tone5:\"]::before,\nem[data-emoji=\"man_lifting_weights_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":people_wrestling:\"]::before,\nem[data-emoji=\"people_wrestling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93c.svg\");\n}\nem[data-emoji=\":women_wrestling:\"]::before,\nem[data-emoji=\"women_wrestling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93c-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":men_wrestling:\"]::before,\nem[data-emoji=\"men_wrestling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93c-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_doing_cartwheel:\"]::before,\nem[data-emoji=\"person_doing_cartwheel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938.svg\");\n}\nem[data-emoji=\":person_doing_cartwheel_tone1:\"]::before,\nem[data-emoji=\"person_doing_cartwheel_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fb.svg\");\n}\nem[data-emoji=\":person_doing_cartwheel_tone2:\"]::before,\nem[data-emoji=\"person_doing_cartwheel_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fc.svg\");\n}\nem[data-emoji=\":person_doing_cartwheel_tone3:\"]::before,\nem[data-emoji=\"person_doing_cartwheel_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fd.svg\");\n}\nem[data-emoji=\":person_doing_cartwheel_tone4:\"]::before,\nem[data-emoji=\"person_doing_cartwheel_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fe.svg\");\n}\nem[data-emoji=\":person_doing_cartwheel_tone5:\"]::before,\nem[data-emoji=\"person_doing_cartwheel_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3ff.svg\");\n}\nem[data-emoji=\":woman_cartwheeling:\"]::before,\nem[data-emoji=\"woman_cartwheeling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_cartwheeling_tone1:\"]::before,\nem[data-emoji=\"woman_cartwheeling_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_cartwheeling_tone2:\"]::before,\nem[data-emoji=\"woman_cartwheeling_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_cartwheeling_tone3:\"]::before,\nem[data-emoji=\"woman_cartwheeling_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_cartwheeling_tone4:\"]::before,\nem[data-emoji=\"woman_cartwheeling_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_cartwheeling_tone5:\"]::before,\nem[data-emoji=\"woman_cartwheeling_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_cartwheeling:\"]::before,\nem[data-emoji=\"man_cartwheeling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_cartwheeling_tone1:\"]::before,\nem[data-emoji=\"man_cartwheeling_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_cartwheeling_tone2:\"]::before,\nem[data-emoji=\"man_cartwheeling_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_cartwheeling_tone3:\"]::before,\nem[data-emoji=\"man_cartwheeling_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_cartwheeling_tone4:\"]::before,\nem[data-emoji=\"man_cartwheeling_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_cartwheeling_tone5:\"]::before,\nem[data-emoji=\"man_cartwheeling_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_bouncing_ball:\"]::before,\nem[data-emoji=\"person_bouncing_ball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9.svg\");\n}\nem[data-emoji=\":person_bouncing_ball_tone1:\"]::before,\nem[data-emoji=\"person_bouncing_ball_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fb.svg\");\n}\nem[data-emoji=\":person_bouncing_ball_tone2:\"]::before,\nem[data-emoji=\"person_bouncing_ball_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fc.svg\");\n}\nem[data-emoji=\":person_bouncing_ball_tone3:\"]::before,\nem[data-emoji=\"person_bouncing_ball_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fd.svg\");\n}\nem[data-emoji=\":person_bouncing_ball_tone4:\"]::before,\nem[data-emoji=\"person_bouncing_ball_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fe.svg\");\n}\nem[data-emoji=\":person_bouncing_ball_tone5:\"]::before,\nem[data-emoji=\"person_bouncing_ball_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3ff.svg\");\n}\nem[data-emoji=\":woman_bouncing_ball:\"]::before,\nem[data-emoji=\"woman_bouncing_ball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-fe0f-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_bouncing_ball_tone1:\"]::before,\nem[data-emoji=\"woman_bouncing_ball_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_bouncing_ball_tone2:\"]::before,\nem[data-emoji=\"woman_bouncing_ball_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_bouncing_ball_tone3:\"]::before,\nem[data-emoji=\"woman_bouncing_ball_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_bouncing_ball_tone4:\"]::before,\nem[data-emoji=\"woman_bouncing_ball_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_bouncing_ball_tone5:\"]::before,\nem[data-emoji=\"woman_bouncing_ball_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_bouncing_ball:\"]::before,\nem[data-emoji=\"man_bouncing_ball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-fe0f-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_bouncing_ball_tone1:\"]::before,\nem[data-emoji=\"man_bouncing_ball_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_bouncing_ball_tone2:\"]::before,\nem[data-emoji=\"man_bouncing_ball_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_bouncing_ball_tone3:\"]::before,\nem[data-emoji=\"man_bouncing_ball_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_bouncing_ball_tone4:\"]::before,\nem[data-emoji=\"man_bouncing_ball_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_bouncing_ball_tone5:\"]::before,\nem[data-emoji=\"man_bouncing_ball_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_fencing:\"]::before,\nem[data-emoji=\"person_fencing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93a.svg\");\n}\nem[data-emoji=\":person_playing_handball:\"]::before,\nem[data-emoji=\"person_playing_handball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e.svg\");\n}\nem[data-emoji=\":person_playing_handball_tone1:\"]::before,\nem[data-emoji=\"person_playing_handball_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fb.svg\");\n}\nem[data-emoji=\":person_playing_handball_tone2:\"]::before,\nem[data-emoji=\"person_playing_handball_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fc.svg\");\n}\nem[data-emoji=\":person_playing_handball_tone3:\"]::before,\nem[data-emoji=\"person_playing_handball_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fd.svg\");\n}\nem[data-emoji=\":person_playing_handball_tone4:\"]::before,\nem[data-emoji=\"person_playing_handball_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fe.svg\");\n}\nem[data-emoji=\":person_playing_handball_tone5:\"]::before,\nem[data-emoji=\"person_playing_handball_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3ff.svg\");\n}\nem[data-emoji=\":woman_playing_handball:\"]::before,\nem[data-emoji=\"woman_playing_handball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_playing_handball_tone1:\"]::before,\nem[data-emoji=\"woman_playing_handball_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_playing_handball_tone2:\"]::before,\nem[data-emoji=\"woman_playing_handball_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_playing_handball_tone3:\"]::before,\nem[data-emoji=\"woman_playing_handball_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_playing_handball_tone4:\"]::before,\nem[data-emoji=\"woman_playing_handball_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_playing_handball_tone5:\"]::before,\nem[data-emoji=\"woman_playing_handball_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_handball:\"]::before,\nem[data-emoji=\"man_playing_handball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_handball_tone1:\"]::before,\nem[data-emoji=\"man_playing_handball_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_handball_tone2:\"]::before,\nem[data-emoji=\"man_playing_handball_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_handball_tone3:\"]::before,\nem[data-emoji=\"man_playing_handball_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_handball_tone4:\"]::before,\nem[data-emoji=\"man_playing_handball_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_handball_tone5:\"]::before,\nem[data-emoji=\"man_playing_handball_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_golfing:\"]::before,\nem[data-emoji=\"person_golfing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc.svg\");\n}\nem[data-emoji=\":person_golfing_tone1:\"]::before,\nem[data-emoji=\"person_golfing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fb.svg\");\n}\nem[data-emoji=\":person_golfing_tone2:\"]::before,\nem[data-emoji=\"person_golfing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fc.svg\");\n}\nem[data-emoji=\":person_golfing_tone3:\"]::before,\nem[data-emoji=\"person_golfing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fd.svg\");\n}\nem[data-emoji=\":person_golfing_tone4:\"]::before,\nem[data-emoji=\"person_golfing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fe.svg\");\n}\nem[data-emoji=\":person_golfing_tone5:\"]::before,\nem[data-emoji=\"person_golfing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3ff.svg\");\n}\nem[data-emoji=\":woman_golfing:\"]::before,\nem[data-emoji=\"woman_golfing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-fe0f-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_golfing_tone1:\"]::before,\nem[data-emoji=\"woman_golfing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_golfing_tone2:\"]::before,\nem[data-emoji=\"woman_golfing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_golfing_tone3:\"]::before,\nem[data-emoji=\"woman_golfing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_golfing_tone4:\"]::before,\nem[data-emoji=\"woman_golfing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_golfing_tone5:\"]::before,\nem[data-emoji=\"woman_golfing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_golfing:\"]::before,\nem[data-emoji=\"man_golfing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-fe0f-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_golfing_tone1:\"]::before,\nem[data-emoji=\"man_golfing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_golfing_tone2:\"]::before,\nem[data-emoji=\"man_golfing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_golfing_tone3:\"]::before,\nem[data-emoji=\"man_golfing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_golfing_tone4:\"]::before,\nem[data-emoji=\"man_golfing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_golfing_tone5:\"]::before,\nem[data-emoji=\"man_golfing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":horse_racing:\"]::before,\nem[data-emoji=\"horse_racing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7.svg\");\n}\nem[data-emoji=\":horse_racing_tone1:\"]::before,\nem[data-emoji=\"horse_racing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7-1f3fb.svg\");\n}\nem[data-emoji=\":horse_racing_tone2:\"]::before,\nem[data-emoji=\"horse_racing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7-1f3fc.svg\");\n}\nem[data-emoji=\":horse_racing_tone3:\"]::before,\nem[data-emoji=\"horse_racing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7-1f3fd.svg\");\n}\nem[data-emoji=\":horse_racing_tone4:\"]::before,\nem[data-emoji=\"horse_racing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7-1f3fe.svg\");\n}\nem[data-emoji=\":horse_racing_tone5:\"]::before,\nem[data-emoji=\"horse_racing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7-1f3ff.svg\");\n}\nem[data-emoji=\":person_in_lotus_position:\"]::before,\nem[data-emoji=\"person_in_lotus_position\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8.svg\");\n}\nem[data-emoji=\":person_in_lotus_position_tone1:\"]::before,\nem[data-emoji=\"person_in_lotus_position_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fb.svg\");\n}\nem[data-emoji=\":person_in_lotus_position_tone2:\"]::before,\nem[data-emoji=\"person_in_lotus_position_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fc.svg\");\n}\nem[data-emoji=\":person_in_lotus_position_tone3:\"]::before,\nem[data-emoji=\"person_in_lotus_position_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fd.svg\");\n}\nem[data-emoji=\":person_in_lotus_position_tone4:\"]::before,\nem[data-emoji=\"person_in_lotus_position_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fe.svg\");\n}\nem[data-emoji=\":person_in_lotus_position_tone5:\"]::before,\nem[data-emoji=\"person_in_lotus_position_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3ff.svg\");\n}\nem[data-emoji=\":woman_in_lotus_position:\"]::before,\nem[data-emoji=\"woman_in_lotus_position\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_lotus_position_tone1:\"]::before,\nem[data-emoji=\"woman_in_lotus_position_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_lotus_position_tone2:\"]::before,\nem[data-emoji=\"woman_in_lotus_position_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_lotus_position_tone3:\"]::before,\nem[data-emoji=\"woman_in_lotus_position_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_lotus_position_tone4:\"]::before,\nem[data-emoji=\"woman_in_lotus_position_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_in_lotus_position_tone5:\"]::before,\nem[data-emoji=\"woman_in_lotus_position_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_in_lotus_position:\"]::before,\nem[data-emoji=\"man_in_lotus_position\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_lotus_position_tone1:\"]::before,\nem[data-emoji=\"man_in_lotus_position_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_lotus_position_tone2:\"]::before,\nem[data-emoji=\"man_in_lotus_position_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_lotus_position_tone3:\"]::before,\nem[data-emoji=\"man_in_lotus_position_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_lotus_position_tone4:\"]::before,\nem[data-emoji=\"man_in_lotus_position_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_in_lotus_position_tone5:\"]::before,\nem[data-emoji=\"man_in_lotus_position_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_surfing:\"]::before,\nem[data-emoji=\"person_surfing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4.svg\");\n}\nem[data-emoji=\":person_surfing_tone1:\"]::before,\nem[data-emoji=\"person_surfing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fb.svg\");\n}\nem[data-emoji=\":person_surfing_tone2:\"]::before,\nem[data-emoji=\"person_surfing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fc.svg\");\n}\nem[data-emoji=\":person_surfing_tone3:\"]::before,\nem[data-emoji=\"person_surfing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fd.svg\");\n}\nem[data-emoji=\":person_surfing_tone4:\"]::before,\nem[data-emoji=\"person_surfing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fe.svg\");\n}\nem[data-emoji=\":person_surfing_tone5:\"]::before,\nem[data-emoji=\"person_surfing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3ff.svg\");\n}\nem[data-emoji=\":woman_surfing:\"]::before,\nem[data-emoji=\"woman_surfing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_surfing_tone1:\"]::before,\nem[data-emoji=\"woman_surfing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_surfing_tone2:\"]::before,\nem[data-emoji=\"woman_surfing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_surfing_tone3:\"]::before,\nem[data-emoji=\"woman_surfing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_surfing_tone4:\"]::before,\nem[data-emoji=\"woman_surfing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_surfing_tone5:\"]::before,\nem[data-emoji=\"woman_surfing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_surfing:\"]::before,\nem[data-emoji=\"man_surfing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_surfing_tone1:\"]::before,\nem[data-emoji=\"man_surfing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_surfing_tone2:\"]::before,\nem[data-emoji=\"man_surfing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_surfing_tone3:\"]::before,\nem[data-emoji=\"man_surfing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_surfing_tone4:\"]::before,\nem[data-emoji=\"man_surfing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_surfing_tone5:\"]::before,\nem[data-emoji=\"man_surfing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_swimming:\"]::before,\nem[data-emoji=\"person_swimming\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca.svg\");\n}\nem[data-emoji=\":person_swimming_tone1:\"]::before,\nem[data-emoji=\"person_swimming_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fb.svg\");\n}\nem[data-emoji=\":person_swimming_tone2:\"]::before,\nem[data-emoji=\"person_swimming_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fc.svg\");\n}\nem[data-emoji=\":person_swimming_tone3:\"]::before,\nem[data-emoji=\"person_swimming_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fd.svg\");\n}\nem[data-emoji=\":person_swimming_tone4:\"]::before,\nem[data-emoji=\"person_swimming_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fe.svg\");\n}\nem[data-emoji=\":person_swimming_tone5:\"]::before,\nem[data-emoji=\"person_swimming_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3ff.svg\");\n}\nem[data-emoji=\":woman_swimming:\"]::before,\nem[data-emoji=\"woman_swimming\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_swimming_tone1:\"]::before,\nem[data-emoji=\"woman_swimming_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_swimming_tone2:\"]::before,\nem[data-emoji=\"woman_swimming_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_swimming_tone3:\"]::before,\nem[data-emoji=\"woman_swimming_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_swimming_tone4:\"]::before,\nem[data-emoji=\"woman_swimming_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_swimming_tone5:\"]::before,\nem[data-emoji=\"woman_swimming_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_swimming:\"]::before,\nem[data-emoji=\"man_swimming\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_swimming_tone1:\"]::before,\nem[data-emoji=\"man_swimming_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_swimming_tone2:\"]::before,\nem[data-emoji=\"man_swimming_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_swimming_tone3:\"]::before,\nem[data-emoji=\"man_swimming_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_swimming_tone4:\"]::before,\nem[data-emoji=\"man_swimming_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_swimming_tone5:\"]::before,\nem[data-emoji=\"man_swimming_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_playing_water_polo:\"]::before,\nem[data-emoji=\"person_playing_water_polo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d.svg\");\n}\nem[data-emoji=\":person_playing_water_polo_tone1:\"]::before,\nem[data-emoji=\"person_playing_water_polo_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fb.svg\");\n}\nem[data-emoji=\":person_playing_water_polo_tone2:\"]::before,\nem[data-emoji=\"person_playing_water_polo_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fc.svg\");\n}\nem[data-emoji=\":person_playing_water_polo_tone3:\"]::before,\nem[data-emoji=\"person_playing_water_polo_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fd.svg\");\n}\nem[data-emoji=\":person_playing_water_polo_tone4:\"]::before,\nem[data-emoji=\"person_playing_water_polo_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fe.svg\");\n}\nem[data-emoji=\":person_playing_water_polo_tone5:\"]::before,\nem[data-emoji=\"person_playing_water_polo_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3ff.svg\");\n}\nem[data-emoji=\":woman_playing_water_polo:\"]::before,\nem[data-emoji=\"woman_playing_water_polo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_playing_water_polo_tone1:\"]::before,\nem[data-emoji=\"woman_playing_water_polo_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_playing_water_polo_tone2:\"]::before,\nem[data-emoji=\"woman_playing_water_polo_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_playing_water_polo_tone3:\"]::before,\nem[data-emoji=\"woman_playing_water_polo_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_playing_water_polo_tone4:\"]::before,\nem[data-emoji=\"woman_playing_water_polo_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_playing_water_polo_tone5:\"]::before,\nem[data-emoji=\"woman_playing_water_polo_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_water_polo:\"]::before,\nem[data-emoji=\"man_playing_water_polo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_water_polo_tone1:\"]::before,\nem[data-emoji=\"man_playing_water_polo_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_water_polo_tone2:\"]::before,\nem[data-emoji=\"man_playing_water_polo_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_water_polo_tone3:\"]::before,\nem[data-emoji=\"man_playing_water_polo_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_water_polo_tone4:\"]::before,\nem[data-emoji=\"man_playing_water_polo_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_playing_water_polo_tone5:\"]::before,\nem[data-emoji=\"man_playing_water_polo_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_rowing_boat:\"]::before,\nem[data-emoji=\"person_rowing_boat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3.svg\");\n}\nem[data-emoji=\":person_rowing_boat_tone1:\"]::before,\nem[data-emoji=\"person_rowing_boat_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fb.svg\");\n}\nem[data-emoji=\":person_rowing_boat_tone2:\"]::before,\nem[data-emoji=\"person_rowing_boat_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fc.svg\");\n}\nem[data-emoji=\":person_rowing_boat_tone3:\"]::before,\nem[data-emoji=\"person_rowing_boat_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fd.svg\");\n}\nem[data-emoji=\":person_rowing_boat_tone4:\"]::before,\nem[data-emoji=\"person_rowing_boat_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fe.svg\");\n}\nem[data-emoji=\":person_rowing_boat_tone5:\"]::before,\nem[data-emoji=\"person_rowing_boat_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3ff.svg\");\n}\nem[data-emoji=\":woman_rowing_boat:\"]::before,\nem[data-emoji=\"woman_rowing_boat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_rowing_boat_tone1:\"]::before,\nem[data-emoji=\"woman_rowing_boat_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_rowing_boat_tone2:\"]::before,\nem[data-emoji=\"woman_rowing_boat_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_rowing_boat_tone3:\"]::before,\nem[data-emoji=\"woman_rowing_boat_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_rowing_boat_tone4:\"]::before,\nem[data-emoji=\"woman_rowing_boat_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_rowing_boat_tone5:\"]::before,\nem[data-emoji=\"woman_rowing_boat_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_rowing_boat:\"]::before,\nem[data-emoji=\"man_rowing_boat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_rowing_boat_tone1:\"]::before,\nem[data-emoji=\"man_rowing_boat_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_rowing_boat_tone2:\"]::before,\nem[data-emoji=\"man_rowing_boat_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_rowing_boat_tone3:\"]::before,\nem[data-emoji=\"man_rowing_boat_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_rowing_boat_tone4:\"]::before,\nem[data-emoji=\"man_rowing_boat_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_rowing_boat_tone5:\"]::before,\nem[data-emoji=\"man_rowing_boat_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_climbing:\"]::before,\nem[data-emoji=\"person_climbing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7.svg\");\n}\nem[data-emoji=\":person_climbing_tone1:\"]::before,\nem[data-emoji=\"person_climbing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fb.svg\");\n}\nem[data-emoji=\":person_climbing_tone2:\"]::before,\nem[data-emoji=\"person_climbing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fc.svg\");\n}\nem[data-emoji=\":person_climbing_tone3:\"]::before,\nem[data-emoji=\"person_climbing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fd.svg\");\n}\nem[data-emoji=\":person_climbing_tone4:\"]::before,\nem[data-emoji=\"person_climbing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fe.svg\");\n}\nem[data-emoji=\":person_climbing_tone5:\"]::before,\nem[data-emoji=\"person_climbing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3ff.svg\");\n}\nem[data-emoji=\":woman_climbing:\"]::before,\nem[data-emoji=\"woman_climbing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_climbing_tone1:\"]::before,\nem[data-emoji=\"woman_climbing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_climbing_tone2:\"]::before,\nem[data-emoji=\"woman_climbing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_climbing_tone3:\"]::before,\nem[data-emoji=\"woman_climbing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_climbing_tone4:\"]::before,\nem[data-emoji=\"woman_climbing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_climbing_tone5:\"]::before,\nem[data-emoji=\"woman_climbing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_climbing:\"]::before,\nem[data-emoji=\"man_climbing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_climbing_tone1:\"]::before,\nem[data-emoji=\"man_climbing_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_climbing_tone2:\"]::before,\nem[data-emoji=\"man_climbing_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_climbing_tone3:\"]::before,\nem[data-emoji=\"man_climbing_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_climbing_tone4:\"]::before,\nem[data-emoji=\"man_climbing_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_climbing_tone5:\"]::before,\nem[data-emoji=\"man_climbing_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_mountain_biking:\"]::before,\nem[data-emoji=\"person_mountain_biking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5.svg\");\n}\nem[data-emoji=\":person_mountain_biking_tone1:\"]::before,\nem[data-emoji=\"person_mountain_biking_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fb.svg\");\n}\nem[data-emoji=\":person_mountain_biking_tone2:\"]::before,\nem[data-emoji=\"person_mountain_biking_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fc.svg\");\n}\nem[data-emoji=\":person_mountain_biking_tone3:\"]::before,\nem[data-emoji=\"person_mountain_biking_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fd.svg\");\n}\nem[data-emoji=\":person_mountain_biking_tone4:\"]::before,\nem[data-emoji=\"person_mountain_biking_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fe.svg\");\n}\nem[data-emoji=\":person_mountain_biking_tone5:\"]::before,\nem[data-emoji=\"person_mountain_biking_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3ff.svg\");\n}\nem[data-emoji=\":woman_mountain_biking:\"]::before,\nem[data-emoji=\"woman_mountain_biking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_mountain_biking_tone1:\"]::before,\nem[data-emoji=\"woman_mountain_biking_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_mountain_biking_tone2:\"]::before,\nem[data-emoji=\"woman_mountain_biking_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_mountain_biking_tone3:\"]::before,\nem[data-emoji=\"woman_mountain_biking_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_mountain_biking_tone4:\"]::before,\nem[data-emoji=\"woman_mountain_biking_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_mountain_biking_tone5:\"]::before,\nem[data-emoji=\"woman_mountain_biking_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_mountain_biking:\"]::before,\nem[data-emoji=\"man_mountain_biking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_mountain_biking_tone1:\"]::before,\nem[data-emoji=\"man_mountain_biking_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_mountain_biking_tone2:\"]::before,\nem[data-emoji=\"man_mountain_biking_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_mountain_biking_tone3:\"]::before,\nem[data-emoji=\"man_mountain_biking_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_mountain_biking_tone4:\"]::before,\nem[data-emoji=\"man_mountain_biking_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_mountain_biking_tone5:\"]::before,\nem[data-emoji=\"man_mountain_biking_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":person_biking:\"]::before,\nem[data-emoji=\"person_biking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4.svg\");\n}\nem[data-emoji=\":person_biking_tone1:\"]::before,\nem[data-emoji=\"person_biking_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fb.svg\");\n}\nem[data-emoji=\":person_biking_tone2:\"]::before,\nem[data-emoji=\"person_biking_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fc.svg\");\n}\nem[data-emoji=\":person_biking_tone3:\"]::before,\nem[data-emoji=\"person_biking_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fd.svg\");\n}\nem[data-emoji=\":person_biking_tone4:\"]::before,\nem[data-emoji=\"person_biking_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fe.svg\");\n}\nem[data-emoji=\":person_biking_tone5:\"]::before,\nem[data-emoji=\"person_biking_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3ff.svg\");\n}\nem[data-emoji=\":woman_biking:\"]::before,\nem[data-emoji=\"woman_biking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_biking_tone1:\"]::before,\nem[data-emoji=\"woman_biking_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_biking_tone2:\"]::before,\nem[data-emoji=\"woman_biking_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_biking_tone3:\"]::before,\nem[data-emoji=\"woman_biking_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_biking_tone4:\"]::before,\nem[data-emoji=\"woman_biking_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_biking_tone5:\"]::before,\nem[data-emoji=\"woman_biking_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_biking:\"]::before,\nem[data-emoji=\"man_biking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_biking_tone1:\"]::before,\nem[data-emoji=\"man_biking_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_biking_tone2:\"]::before,\nem[data-emoji=\"man_biking_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_biking_tone3:\"]::before,\nem[data-emoji=\"man_biking_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_biking_tone4:\"]::before,\nem[data-emoji=\"man_biking_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_biking_tone5:\"]::before,\nem[data-emoji=\"man_biking_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":trophy:\"]::before,\nem[data-emoji=\"trophy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c6.svg\");\n}\nem[data-emoji=\":first_place:\"]::before,\nem[data-emoji=\"first_place\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f947.svg\");\n}\nem[data-emoji=\":second_place:\"]::before,\nem[data-emoji=\"second_place\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f948.svg\");\n}\nem[data-emoji=\":third_place:\"]::before,\nem[data-emoji=\"third_place\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f949.svg\");\n}\nem[data-emoji=\":medal:\"]::before,\nem[data-emoji=\"medal\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c5.svg\");\n}\nem[data-emoji=\":military_medal:\"]::before,\nem[data-emoji=\"military_medal\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f396.svg\");\n}\nem[data-emoji=\":rosette:\"]::before,\nem[data-emoji=\"rosette\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f5.svg\");\n}\nem[data-emoji=\":reminder_ribbon:\"]::before,\nem[data-emoji=\"reminder_ribbon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f397.svg\");\n}\nem[data-emoji=\":ticket:\"]::before,\nem[data-emoji=\"ticket\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ab.svg\");\n}\nem[data-emoji=\":tickets:\"]::before,\nem[data-emoji=\"tickets\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f39f.svg\");\n}\nem[data-emoji=\":circus_tent:\"]::before,\nem[data-emoji=\"circus_tent\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3aa.svg\");\n}\nem[data-emoji=\":person_juggling:\"]::before,\nem[data-emoji=\"person_juggling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939.svg\");\n}\nem[data-emoji=\":person_juggling_tone1:\"]::before,\nem[data-emoji=\"person_juggling_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fb.svg\");\n}\nem[data-emoji=\":person_juggling_tone2:\"]::before,\nem[data-emoji=\"person_juggling_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fc.svg\");\n}\nem[data-emoji=\":person_juggling_tone3:\"]::before,\nem[data-emoji=\"person_juggling_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fd.svg\");\n}\nem[data-emoji=\":person_juggling_tone4:\"]::before,\nem[data-emoji=\"person_juggling_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fe.svg\");\n}\nem[data-emoji=\":person_juggling_tone5:\"]::before,\nem[data-emoji=\"person_juggling_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3ff.svg\");\n}\nem[data-emoji=\":woman_juggling:\"]::before,\nem[data-emoji=\"woman_juggling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_juggling_tone1:\"]::before,\nem[data-emoji=\"woman_juggling_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fb-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_juggling_tone2:\"]::before,\nem[data-emoji=\"woman_juggling_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fc-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_juggling_tone3:\"]::before,\nem[data-emoji=\"woman_juggling_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fd-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_juggling_tone4:\"]::before,\nem[data-emoji=\"woman_juggling_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fe-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":woman_juggling_tone5:\"]::before,\nem[data-emoji=\"woman_juggling_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3ff-200d-2640-fe0f.svg\");\n}\nem[data-emoji=\":man_juggling:\"]::before,\nem[data-emoji=\"man_juggling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_juggling_tone1:\"]::before,\nem[data-emoji=\"man_juggling_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fb-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_juggling_tone2:\"]::before,\nem[data-emoji=\"man_juggling_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fc-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_juggling_tone3:\"]::before,\nem[data-emoji=\"man_juggling_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fd-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_juggling_tone4:\"]::before,\nem[data-emoji=\"man_juggling_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fe-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":man_juggling_tone5:\"]::before,\nem[data-emoji=\"man_juggling_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3ff-200d-2642-fe0f.svg\");\n}\nem[data-emoji=\":performing_arts:\"]::before,\nem[data-emoji=\"performing_arts\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ad.svg\");\n}\nem[data-emoji=\":ballet_shoes:\"]::before,\nem[data-emoji=\"ballet_shoes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa70.svg\");\n}\nem[data-emoji=\":art:\"]::before,\nem[data-emoji=\"art\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a8.svg\");\n}\nem[data-emoji=\":clapper:\"]::before,\nem[data-emoji=\"clapper\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ac.svg\");\n}\nem[data-emoji=\":microphone:\"]::before,\nem[data-emoji=\"microphone\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a4.svg\");\n}\nem[data-emoji=\":headphones:\"]::before,\nem[data-emoji=\"headphones\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a7.svg\");\n}\nem[data-emoji=\":musical_score:\"]::before,\nem[data-emoji=\"musical_score\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3bc.svg\");\n}\nem[data-emoji=\":musical_keyboard:\"]::before,\nem[data-emoji=\"musical_keyboard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b9.svg\");\n}\nem[data-emoji=\":maracas:\"]::before,\nem[data-emoji=\"maracas\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa87.svg\");\n}\nem[data-emoji=\":drum:\"]::before,\nem[data-emoji=\"drum\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f941.svg\");\n}\nem[data-emoji=\":long_drum:\"]::before,\nem[data-emoji=\"long_drum\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa98.svg\");\n}\nem[data-emoji=\":saxophone:\"]::before,\nem[data-emoji=\"saxophone\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b7.svg\");\n}\nem[data-emoji=\":trumpet:\"]::before,\nem[data-emoji=\"trumpet\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ba.svg\");\n}\nem[data-emoji=\":accordion:\"]::before,\nem[data-emoji=\"accordion\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa97.svg\");\n}\nem[data-emoji=\":guitar:\"]::before,\nem[data-emoji=\"guitar\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b8.svg\");\n}\nem[data-emoji=\":banjo:\"]::before,\nem[data-emoji=\"banjo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa95.svg\");\n}\nem[data-emoji=\":violin:\"]::before,\nem[data-emoji=\"violin\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3bb.svg\");\n}\nem[data-emoji=\":flute:\"]::before,\nem[data-emoji=\"flute\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa88.svg\");\n}\nem[data-emoji=\":game_die:\"]::before,\nem[data-emoji=\"game_die\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b2.svg\");\n}\nem[data-emoji=\":chess_pawn:\"]::before,\nem[data-emoji=\"chess_pawn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/265f.svg\");\n}\nem[data-emoji=\":dart:\"]::before,\nem[data-emoji=\"dart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3af.svg\");\n}\nem[data-emoji=\":bowling:\"]::before,\nem[data-emoji=\"bowling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b3.svg\");\n}\nem[data-emoji=\":video_game:\"]::before,\nem[data-emoji=\"video_game\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ae.svg\");\n}\nem[data-emoji=\":slot_machine:\"]::before,\nem[data-emoji=\"slot_machine\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b0.svg\");\n}\nem[data-emoji=\":jigsaw:\"]::before,\nem[data-emoji=\"jigsaw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e9.svg\");\n}\nem[data-emoji=\":red_car:\"]::before,\nem[data-emoji=\"red_car\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f697.svg\");\n}\nem[data-emoji=\":taxi:\"]::before,\nem[data-emoji=\"taxi\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f695.svg\");\n}\nem[data-emoji=\":blue_car:\"]::before,\nem[data-emoji=\"blue_car\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f699.svg\");\n}\nem[data-emoji=\":pickup_truck:\"]::before,\nem[data-emoji=\"pickup_truck\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6fb.svg\");\n}\nem[data-emoji=\":minibus:\"]::before,\nem[data-emoji=\"minibus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f690.svg\");\n}\nem[data-emoji=\":bus:\"]::before,\nem[data-emoji=\"bus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68c.svg\");\n}\nem[data-emoji=\":trolleybus:\"]::before,\nem[data-emoji=\"trolleybus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68e.svg\");\n}\nem[data-emoji=\":race_car:\"]::before,\nem[data-emoji=\"race_car\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ce.svg\");\n}\nem[data-emoji=\":police_car:\"]::before,\nem[data-emoji=\"police_car\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f693.svg\");\n}\nem[data-emoji=\":ambulance:\"]::before,\nem[data-emoji=\"ambulance\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f691.svg\");\n}\nem[data-emoji=\":fire_engine:\"]::before,\nem[data-emoji=\"fire_engine\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f692.svg\");\n}\nem[data-emoji=\":truck:\"]::before,\nem[data-emoji=\"truck\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69a.svg\");\n}\nem[data-emoji=\":articulated_lorry:\"]::before,\nem[data-emoji=\"articulated_lorry\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69b.svg\");\n}\nem[data-emoji=\":tractor:\"]::before,\nem[data-emoji=\"tractor\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69c.svg\");\n}\nem[data-emoji=\":probing_cane:\"]::before,\nem[data-emoji=\"probing_cane\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9af.svg\");\n}\nem[data-emoji=\":manual_wheelchair:\"]::before,\nem[data-emoji=\"manual_wheelchair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bd.svg\");\n}\nem[data-emoji=\":motorized_wheelchair:\"]::before,\nem[data-emoji=\"motorized_wheelchair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bc.svg\");\n}\nem[data-emoji=\":crutch:\"]::before,\nem[data-emoji=\"crutch\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa7c.svg\");\n}\nem[data-emoji=\":scooter:\"]::before,\nem[data-emoji=\"scooter\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f4.svg\");\n}\nem[data-emoji=\":bike:\"]::before,\nem[data-emoji=\"bike\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b2.svg\");\n}\nem[data-emoji=\":motor_scooter:\"]::before,\nem[data-emoji=\"motor_scooter\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f5.svg\");\n}\nem[data-emoji=\":motorcycle:\"]::before,\nem[data-emoji=\"motorcycle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cd.svg\");\n}\nem[data-emoji=\":auto_rickshaw:\"]::before,\nem[data-emoji=\"auto_rickshaw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6fa.svg\");\n}\nem[data-emoji=\":wheel:\"]::before,\nem[data-emoji=\"wheel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6de.svg\");\n}\nem[data-emoji=\":rotating_light:\"]::before,\nem[data-emoji=\"rotating_light\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a8.svg\");\n}\nem[data-emoji=\":oncoming_police_car:\"]::before,\nem[data-emoji=\"oncoming_police_car\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f694.svg\");\n}\nem[data-emoji=\":oncoming_bus:\"]::before,\nem[data-emoji=\"oncoming_bus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68d.svg\");\n}\nem[data-emoji=\":oncoming_automobile:\"]::before,\nem[data-emoji=\"oncoming_automobile\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f698.svg\");\n}\nem[data-emoji=\":oncoming_taxi:\"]::before,\nem[data-emoji=\"oncoming_taxi\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f696.svg\");\n}\nem[data-emoji=\":aerial_tramway:\"]::before,\nem[data-emoji=\"aerial_tramway\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a1.svg\");\n}\nem[data-emoji=\":mountain_cableway:\"]::before,\nem[data-emoji=\"mountain_cableway\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a0.svg\");\n}\nem[data-emoji=\":suspension_railway:\"]::before,\nem[data-emoji=\"suspension_railway\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69f.svg\");\n}\nem[data-emoji=\":railway_car:\"]::before,\nem[data-emoji=\"railway_car\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f683.svg\");\n}\nem[data-emoji=\":train:\"]::before,\nem[data-emoji=\"train\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68b.svg\");\n}\nem[data-emoji=\":mountain_railway:\"]::before,\nem[data-emoji=\"mountain_railway\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69e.svg\");\n}\nem[data-emoji=\":monorail:\"]::before,\nem[data-emoji=\"monorail\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69d.svg\");\n}\nem[data-emoji=\":bullettrain_side:\"]::before,\nem[data-emoji=\"bullettrain_side\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f684.svg\");\n}\nem[data-emoji=\":bullettrain_front:\"]::before,\nem[data-emoji=\"bullettrain_front\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f685.svg\");\n}\nem[data-emoji=\":light_rail:\"]::before,\nem[data-emoji=\"light_rail\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f688.svg\");\n}\nem[data-emoji=\":steam_locomotive:\"]::before,\nem[data-emoji=\"steam_locomotive\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f682.svg\");\n}\nem[data-emoji=\":train2:\"]::before,\nem[data-emoji=\"train2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f686.svg\");\n}\nem[data-emoji=\":metro:\"]::before,\nem[data-emoji=\"metro\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f687.svg\");\n}\nem[data-emoji=\":tram:\"]::before,\nem[data-emoji=\"tram\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68a.svg\");\n}\nem[data-emoji=\":station:\"]::before,\nem[data-emoji=\"station\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f689.svg\");\n}\nem[data-emoji=\":airplane_departure:\"]::before,\nem[data-emoji=\"airplane_departure\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6eb.svg\");\n}\nem[data-emoji=\":airplane_arriving:\"]::before,\nem[data-emoji=\"airplane_arriving\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ec.svg\");\n}\nem[data-emoji=\":airplane_small:\"]::before,\nem[data-emoji=\"airplane_small\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e9.svg\");\n}\nem[data-emoji=\":seat:\"]::before,\nem[data-emoji=\"seat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ba.svg\");\n}\nem[data-emoji=\":satellite_orbital:\"]::before,\nem[data-emoji=\"satellite_orbital\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f0.svg\");\n}\nem[data-emoji=\":rocket:\"]::before,\nem[data-emoji=\"rocket\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f680.svg\");\n}\nem[data-emoji=\":flying_saucer:\"]::before,\nem[data-emoji=\"flying_saucer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f8.svg\");\n}\nem[data-emoji=\":helicopter:\"]::before,\nem[data-emoji=\"helicopter\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f681.svg\");\n}\nem[data-emoji=\":canoe:\"]::before,\nem[data-emoji=\"canoe\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f6.svg\");\n}\nem[data-emoji=\":sailboat:\"]::before,\nem[data-emoji=\"sailboat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f5.svg\");\n}\nem[data-emoji=\":speedboat:\"]::before,\nem[data-emoji=\"speedboat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a4.svg\");\n}\nem[data-emoji=\":motorboat:\"]::before,\nem[data-emoji=\"motorboat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e5.svg\");\n}\nem[data-emoji=\":cruise_ship:\"]::before,\nem[data-emoji=\"cruise_ship\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f3.svg\");\n}\nem[data-emoji=\":ferry:\"]::before,\nem[data-emoji=\"ferry\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f4.svg\");\n}\nem[data-emoji=\":ship:\"]::before,\nem[data-emoji=\"ship\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a2.svg\");\n}\nem[data-emoji=\":ring_buoy:\"]::before,\nem[data-emoji=\"ring_buoy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6df.svg\");\n}\nem[data-emoji=\":hook:\"]::before,\nem[data-emoji=\"hook\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9d.svg\");\n}\nem[data-emoji=\":fuelpump:\"]::before,\nem[data-emoji=\"fuelpump\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26fd.svg\");\n}\nem[data-emoji=\":construction:\"]::before,\nem[data-emoji=\"construction\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a7.svg\");\n}\nem[data-emoji=\":vertical_traffic_light:\"]::before,\nem[data-emoji=\"vertical_traffic_light\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a6.svg\");\n}\nem[data-emoji=\":traffic_light:\"]::before,\nem[data-emoji=\"traffic_light\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a5.svg\");\n}\nem[data-emoji=\":busstop:\"]::before,\nem[data-emoji=\"busstop\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68f.svg\");\n}\nem[data-emoji=\":map:\"]::before,\nem[data-emoji=\"map\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5fa.svg\");\n}\nem[data-emoji=\":moyai:\"]::before,\nem[data-emoji=\"moyai\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5ff.svg\");\n}\nem[data-emoji=\":statue_of_liberty:\"]::before,\nem[data-emoji=\"statue_of_liberty\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5fd.svg\");\n}\nem[data-emoji=\":tokyo_tower:\"]::before,\nem[data-emoji=\"tokyo_tower\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5fc.svg\");\n}\nem[data-emoji=\":european_castle:\"]::before,\nem[data-emoji=\"european_castle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f0.svg\");\n}\nem[data-emoji=\":japanese_castle:\"]::before,\nem[data-emoji=\"japanese_castle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ef.svg\");\n}\nem[data-emoji=\":stadium:\"]::before,\nem[data-emoji=\"stadium\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3df.svg\");\n}\nem[data-emoji=\":ferris_wheel:\"]::before,\nem[data-emoji=\"ferris_wheel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a1.svg\");\n}\nem[data-emoji=\":roller_coaster:\"]::before,\nem[data-emoji=\"roller_coaster\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a2.svg\");\n}\nem[data-emoji=\":carousel_horse:\"]::before,\nem[data-emoji=\"carousel_horse\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a0.svg\");\n}\nem[data-emoji=\":fountain:\"]::before,\nem[data-emoji=\"fountain\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f2.svg\");\n}\nem[data-emoji=\":beach_umbrella:\"]::before,\nem[data-emoji=\"beach_umbrella\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f1.svg\");\n}\nem[data-emoji=\":beach:\"]::before,\nem[data-emoji=\"beach\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d6.svg\");\n}\nem[data-emoji=\":island:\"]::before,\nem[data-emoji=\"island\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3dd.svg\");\n}\nem[data-emoji=\":desert:\"]::before,\nem[data-emoji=\"desert\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3dc.svg\");\n}\nem[data-emoji=\":volcano:\"]::before,\nem[data-emoji=\"volcano\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30b.svg\");\n}\nem[data-emoji=\":mountain:\"]::before,\nem[data-emoji=\"mountain\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f0.svg\");\n}\nem[data-emoji=\":mountain_snow:\"]::before,\nem[data-emoji=\"mountain_snow\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d4.svg\");\n}\nem[data-emoji=\":mount_fuji:\"]::before,\nem[data-emoji=\"mount_fuji\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5fb.svg\");\n}\nem[data-emoji=\":camping:\"]::before,\nem[data-emoji=\"camping\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d5.svg\");\n}\nem[data-emoji=\":tent:\"]::before,\nem[data-emoji=\"tent\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26fa.svg\");\n}\nem[data-emoji=\":house:\"]::before,\nem[data-emoji=\"house\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e0.svg\");\n}\nem[data-emoji=\":house_with_garden:\"]::before,\nem[data-emoji=\"house_with_garden\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e1.svg\");\n}\nem[data-emoji=\":homes:\"]::before,\nem[data-emoji=\"homes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d8.svg\");\n}\nem[data-emoji=\":house_abandoned:\"]::before,\nem[data-emoji=\"house_abandoned\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3da.svg\");\n}\nem[data-emoji=\":hut:\"]::before,\nem[data-emoji=\"hut\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d6.svg\");\n}\nem[data-emoji=\":construction_site:\"]::before,\nem[data-emoji=\"construction_site\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d7.svg\");\n}\nem[data-emoji=\":factory:\"]::before,\nem[data-emoji=\"factory\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ed.svg\");\n}\nem[data-emoji=\":office:\"]::before,\nem[data-emoji=\"office\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e2.svg\");\n}\nem[data-emoji=\":department_store:\"]::before,\nem[data-emoji=\"department_store\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ec.svg\");\n}\nem[data-emoji=\":post_office:\"]::before,\nem[data-emoji=\"post_office\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e3.svg\");\n}\nem[data-emoji=\":european_post_office:\"]::before,\nem[data-emoji=\"european_post_office\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e4.svg\");\n}\nem[data-emoji=\":hospital:\"]::before,\nem[data-emoji=\"hospital\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e5.svg\");\n}\nem[data-emoji=\":bank:\"]::before,\nem[data-emoji=\"bank\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e6.svg\");\n}\nem[data-emoji=\":hotel:\"]::before,\nem[data-emoji=\"hotel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e8.svg\");\n}\nem[data-emoji=\":convenience_store:\"]::before,\nem[data-emoji=\"convenience_store\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ea.svg\");\n}\nem[data-emoji=\":school:\"]::before,\nem[data-emoji=\"school\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3eb.svg\");\n}\nem[data-emoji=\":love_hotel:\"]::before,\nem[data-emoji=\"love_hotel\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e9.svg\");\n}\nem[data-emoji=\":wedding:\"]::before,\nem[data-emoji=\"wedding\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f492.svg\");\n}\nem[data-emoji=\":classical_building:\"]::before,\nem[data-emoji=\"classical_building\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3db.svg\");\n}\nem[data-emoji=\":church:\"]::before,\nem[data-emoji=\"church\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26ea.svg\");\n}\nem[data-emoji=\":mosque:\"]::before,\nem[data-emoji=\"mosque\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f54c.svg\");\n}\nem[data-emoji=\":synagogue:\"]::before,\nem[data-emoji=\"synagogue\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f54d.svg\");\n}\nem[data-emoji=\":hindu_temple:\"]::before,\nem[data-emoji=\"hindu_temple\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d5.svg\");\n}\nem[data-emoji=\":kaaba:\"]::before,\nem[data-emoji=\"kaaba\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f54b.svg\");\n}\nem[data-emoji=\":shinto_shrine:\"]::before,\nem[data-emoji=\"shinto_shrine\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26e9.svg\");\n}\nem[data-emoji=\":railway_track:\"]::before,\nem[data-emoji=\"railway_track\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e4.svg\");\n}\nem[data-emoji=\":motorway:\"]::before,\nem[data-emoji=\"motorway\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e3.svg\");\n}\nem[data-emoji=\":japan:\"]::before,\nem[data-emoji=\"japan\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5fe.svg\");\n}\nem[data-emoji=\":rice_scene:\"]::before,\nem[data-emoji=\"rice_scene\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f391.svg\");\n}\nem[data-emoji=\":park:\"]::before,\nem[data-emoji=\"park\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3de.svg\");\n}\nem[data-emoji=\":sunrise:\"]::before,\nem[data-emoji=\"sunrise\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f305.svg\");\n}\nem[data-emoji=\":sunrise_over_mountains:\"]::before,\nem[data-emoji=\"sunrise_over_mountains\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f304.svg\");\n}\nem[data-emoji=\":stars:\"]::before,\nem[data-emoji=\"stars\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f320.svg\");\n}\nem[data-emoji=\":sparkler:\"]::before,\nem[data-emoji=\"sparkler\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f387.svg\");\n}\nem[data-emoji=\":fireworks:\"]::before,\nem[data-emoji=\"fireworks\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f386.svg\");\n}\nem[data-emoji=\":city_sunset:\"]::before,\nem[data-emoji=\"city_sunset\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f307.svg\");\n}\nem[data-emoji=\":city_dusk:\"]::before,\nem[data-emoji=\"city_dusk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f306.svg\");\n}\nem[data-emoji=\":cityscape:\"]::before,\nem[data-emoji=\"cityscape\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d9.svg\");\n}\nem[data-emoji=\":night_with_stars:\"]::before,\nem[data-emoji=\"night_with_stars\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f303.svg\");\n}\nem[data-emoji=\":milky_way:\"]::before,\nem[data-emoji=\"milky_way\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30c.svg\");\n}\nem[data-emoji=\":bridge_at_night:\"]::before,\nem[data-emoji=\"bridge_at_night\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f309.svg\");\n}\nem[data-emoji=\":foggy:\"]::before,\nem[data-emoji=\"foggy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f301.svg\");\n}\nem[data-emoji=\":watch:\"]::before,\nem[data-emoji=\"watch\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/231a.svg\");\n}\nem[data-emoji=\":mobile_phone:\"]::before,\nem[data-emoji=\"mobile_phone\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f1.svg\");\n}\nem[data-emoji=\":calling:\"]::before,\nem[data-emoji=\"calling\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f2.svg\");\n}\nem[data-emoji=\":computer:\"]::before,\nem[data-emoji=\"computer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4bb.svg\");\n}\nem[data-emoji=\":desktop:\"]::before,\nem[data-emoji=\"desktop\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5a5.svg\");\n}\nem[data-emoji=\":printer:\"]::before,\nem[data-emoji=\"printer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5a8.svg\");\n}\nem[data-emoji=\":mouse_three_button:\"]::before,\nem[data-emoji=\"mouse_three_button\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5b1.svg\");\n}\nem[data-emoji=\":trackball:\"]::before,\nem[data-emoji=\"trackball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5b2.svg\");\n}\nem[data-emoji=\":joystick:\"]::before,\nem[data-emoji=\"joystick\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f579.svg\");\n}\nem[data-emoji=\":compression:\"]::before,\nem[data-emoji=\"compression\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5dc.svg\");\n}\nem[data-emoji=\":minidisc:\"]::before,\nem[data-emoji=\"minidisc\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4bd.svg\");\n}\nem[data-emoji=\":floppy_disk:\"]::before,\nem[data-emoji=\"floppy_disk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4be.svg\");\n}\nem[data-emoji=\":cd:\"]::before,\nem[data-emoji=\"cd\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4bf.svg\");\n}\nem[data-emoji=\":dvd:\"]::before,\nem[data-emoji=\"dvd\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c0.svg\");\n}\nem[data-emoji=\":vhs:\"]::before,\nem[data-emoji=\"vhs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4fc.svg\");\n}\nem[data-emoji=\":camera:\"]::before,\nem[data-emoji=\"camera\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f7.svg\");\n}\nem[data-emoji=\":camera_with_flash:\"]::before,\nem[data-emoji=\"camera_with_flash\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f8.svg\");\n}\nem[data-emoji=\":video_camera:\"]::before,\nem[data-emoji=\"video_camera\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f9.svg\");\n}\nem[data-emoji=\":movie_camera:\"]::before,\nem[data-emoji=\"movie_camera\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a5.svg\");\n}\nem[data-emoji=\":projector:\"]::before,\nem[data-emoji=\"projector\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4fd.svg\");\n}\nem[data-emoji=\":film_frames:\"]::before,\nem[data-emoji=\"film_frames\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f39e.svg\");\n}\nem[data-emoji=\":telephone_receiver:\"]::before,\nem[data-emoji=\"telephone_receiver\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4de.svg\");\n}\nem[data-emoji=\":telephone:\"]::before,\nem[data-emoji=\"telephone\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/260e.svg\");\n}\nem[data-emoji=\":pager:\"]::before,\nem[data-emoji=\"pager\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4df.svg\");\n}\nem[data-emoji=\":fax:\"]::before,\nem[data-emoji=\"fax\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e0.svg\");\n}\nem[data-emoji=\":tv:\"]::before,\nem[data-emoji=\"tv\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4fa.svg\");\n}\nem[data-emoji=\":radio:\"]::before,\nem[data-emoji=\"radio\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4fb.svg\");\n}\nem[data-emoji=\":microphone2:\"]::before,\nem[data-emoji=\"microphone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f399.svg\");\n}\nem[data-emoji=\":level_slider:\"]::before,\nem[data-emoji=\"level_slider\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f39a.svg\");\n}\nem[data-emoji=\":control_knobs:\"]::before,\nem[data-emoji=\"control_knobs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f39b.svg\");\n}\nem[data-emoji=\":compass:\"]::before,\nem[data-emoji=\"compass\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ed.svg\");\n}\nem[data-emoji=\":stopwatch:\"]::before,\nem[data-emoji=\"stopwatch\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f1.svg\");\n}\nem[data-emoji=\":timer:\"]::before,\nem[data-emoji=\"timer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f2.svg\");\n}\nem[data-emoji=\":alarm_clock:\"]::before,\nem[data-emoji=\"alarm_clock\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f0.svg\");\n}\nem[data-emoji=\":clock:\"]::before,\nem[data-emoji=\"clock\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f570.svg\");\n}\nem[data-emoji=\":hourglass:\"]::before,\nem[data-emoji=\"hourglass\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/231b.svg\");\n}\nem[data-emoji=\":hourglass_flowing_sand:\"]::before,\nem[data-emoji=\"hourglass_flowing_sand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f3.svg\");\n}\nem[data-emoji=\":satellite:\"]::before,\nem[data-emoji=\"satellite\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e1.svg\");\n}\nem[data-emoji=\":battery:\"]::before,\nem[data-emoji=\"battery\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50b.svg\");\n}\nem[data-emoji=\":low_battery:\"]::before,\nem[data-emoji=\"low_battery\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faab.svg\");\n}\nem[data-emoji=\":electric_plug:\"]::before,\nem[data-emoji=\"electric_plug\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50c.svg\");\n}\nem[data-emoji=\":bulb:\"]::before,\nem[data-emoji=\"bulb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a1.svg\");\n}\nem[data-emoji=\":flashlight:\"]::before,\nem[data-emoji=\"flashlight\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f526.svg\");\n}\nem[data-emoji=\":candle:\"]::before,\nem[data-emoji=\"candle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f56f.svg\");\n}\nem[data-emoji=\":diya_lamp:\"]::before,\nem[data-emoji=\"diya_lamp\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa94.svg\");\n}\nem[data-emoji=\":fire_extinguisher:\"]::before,\nem[data-emoji=\"fire_extinguisher\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ef.svg\");\n}\nem[data-emoji=\":oil:\"]::before,\nem[data-emoji=\"oil\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e2.svg\");\n}\nem[data-emoji=\":money_with_wings:\"]::before,\nem[data-emoji=\"money_with_wings\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b8.svg\");\n}\nem[data-emoji=\":dollar:\"]::before,\nem[data-emoji=\"dollar\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b5.svg\");\n}\nem[data-emoji=\":yen:\"]::before,\nem[data-emoji=\"yen\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b4.svg\");\n}\nem[data-emoji=\":euro:\"]::before,\nem[data-emoji=\"euro\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b6.svg\");\n}\nem[data-emoji=\":pound:\"]::before,\nem[data-emoji=\"pound\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b7.svg\");\n}\nem[data-emoji=\":coin:\"]::before,\nem[data-emoji=\"coin\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa99.svg\");\n}\nem[data-emoji=\":moneybag:\"]::before,\nem[data-emoji=\"moneybag\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b0.svg\");\n}\nem[data-emoji=\":credit_card:\"]::before,\nem[data-emoji=\"credit_card\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b3.svg\");\n}\nem[data-emoji=\":identification_card:\"]::before,\nem[data-emoji=\"identification_card\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faaa.svg\");\n}\nem[data-emoji=\":gem:\"]::before,\nem[data-emoji=\"gem\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48e.svg\");\n}\nem[data-emoji=\":ladder:\"]::before,\nem[data-emoji=\"ladder\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9c.svg\");\n}\nem[data-emoji=\":toolbox:\"]::before,\nem[data-emoji=\"toolbox\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f0.svg\");\n}\nem[data-emoji=\":screwdriver:\"]::before,\nem[data-emoji=\"screwdriver\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9b.svg\");\n}\nem[data-emoji=\":wrench:\"]::before,\nem[data-emoji=\"wrench\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f527.svg\");\n}\nem[data-emoji=\":hammer:\"]::before,\nem[data-emoji=\"hammer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f528.svg\");\n}\nem[data-emoji=\":tools:\"]::before,\nem[data-emoji=\"tools\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e0.svg\");\n}\nem[data-emoji=\":pick:\"]::before,\nem[data-emoji=\"pick\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26cf.svg\");\n}\nem[data-emoji=\":carpentry_saw:\"]::before,\nem[data-emoji=\"carpentry_saw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9a.svg\");\n}\nem[data-emoji=\":nut_and_bolt:\"]::before,\nem[data-emoji=\"nut_and_bolt\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f529.svg\");\n}\nem[data-emoji=\":mouse_trap:\"]::before,\nem[data-emoji=\"mouse_trap\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa4.svg\");\n}\nem[data-emoji=\":bricks:\"]::before,\nem[data-emoji=\"bricks\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f1.svg\");\n}\nem[data-emoji=\":chains:\"]::before,\nem[data-emoji=\"chains\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26d3.svg\");\n}\nem[data-emoji=\":link:\"]::before,\nem[data-emoji=\"link\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f517.svg\");\n}\nem[data-emoji=\":broken_chain:\"]::before,\nem[data-emoji=\"broken_chain\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26d3-fe0f-200d-1f4a5.svg\");\n}\nem[data-emoji=\":magnet:\"]::before,\nem[data-emoji=\"magnet\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f2.svg\");\n}\nem[data-emoji=\":gun:\"]::before,\nem[data-emoji=\"gun\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52b.svg\");\n}\nem[data-emoji=\":bomb:\"]::before,\nem[data-emoji=\"bomb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a3.svg\");\n}\nem[data-emoji=\":firecracker:\"]::before,\nem[data-emoji=\"firecracker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e8.svg\");\n}\nem[data-emoji=\":axe:\"]::before,\nem[data-emoji=\"axe\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa93.svg\");\n}\nem[data-emoji=\":knife:\"]::before,\nem[data-emoji=\"knife\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52a.svg\");\n}\nem[data-emoji=\":dagger:\"]::before,\nem[data-emoji=\"dagger\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5e1.svg\");\n}\nem[data-emoji=\":shield:\"]::before,\nem[data-emoji=\"shield\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e1.svg\");\n}\nem[data-emoji=\":smoking:\"]::before,\nem[data-emoji=\"smoking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ac.svg\");\n}\nem[data-emoji=\":coffin:\"]::before,\nem[data-emoji=\"coffin\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26b0.svg\");\n}\nem[data-emoji=\":headstone:\"]::before,\nem[data-emoji=\"headstone\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa6.svg\");\n}\nem[data-emoji=\":urn:\"]::before,\nem[data-emoji=\"urn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26b1.svg\");\n}\nem[data-emoji=\":amphora:\"]::before,\nem[data-emoji=\"amphora\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3fa.svg\");\n}\nem[data-emoji=\":crystal_ball:\"]::before,\nem[data-emoji=\"crystal_ball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52e.svg\");\n}\nem[data-emoji=\":prayer_beads:\"]::before,\nem[data-emoji=\"prayer_beads\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ff.svg\");\n}\nem[data-emoji=\":nazar_amulet:\"]::before,\nem[data-emoji=\"nazar_amulet\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ff.svg\");\n}\nem[data-emoji=\":hamsa:\"]::before,\nem[data-emoji=\"hamsa\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faac.svg\");\n}\nem[data-emoji=\":barber:\"]::before,\nem[data-emoji=\"barber\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f488.svg\");\n}\nem[data-emoji=\":telescope:\"]::before,\nem[data-emoji=\"telescope\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52d.svg\");\n}\nem[data-emoji=\":microscope:\"]::before,\nem[data-emoji=\"microscope\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52c.svg\");\n}\nem[data-emoji=\":hole:\"]::before,\nem[data-emoji=\"hole\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f573.svg\");\n}\nem[data-emoji=\":x_ray:\"]::before,\nem[data-emoji=\"x_ray\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa7b.svg\");\n}\nem[data-emoji=\":adhesive_bandage:\"]::before,\nem[data-emoji=\"adhesive_bandage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa79.svg\");\n}\nem[data-emoji=\":stethoscope:\"]::before,\nem[data-emoji=\"stethoscope\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa7a.svg\");\n}\nem[data-emoji=\":pill:\"]::before,\nem[data-emoji=\"pill\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48a.svg\");\n}\nem[data-emoji=\":syringe:\"]::before,\nem[data-emoji=\"syringe\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f489.svg\");\n}\nem[data-emoji=\":drop_of_blood:\"]::before,\nem[data-emoji=\"drop_of_blood\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa78.svg\");\n}\nem[data-emoji=\":dna:\"]::before,\nem[data-emoji=\"dna\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ec.svg\");\n}\nem[data-emoji=\":microbe:\"]::before,\nem[data-emoji=\"microbe\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a0.svg\");\n}\nem[data-emoji=\":petri_dish:\"]::before,\nem[data-emoji=\"petri_dish\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9eb.svg\");\n}\nem[data-emoji=\":test_tube:\"]::before,\nem[data-emoji=\"test_tube\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ea.svg\");\n}\nem[data-emoji=\":thermometer:\"]::before,\nem[data-emoji=\"thermometer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f321.svg\");\n}\nem[data-emoji=\":broom:\"]::before,\nem[data-emoji=\"broom\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f9.svg\");\n}\nem[data-emoji=\":plunger:\"]::before,\nem[data-emoji=\"plunger\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa0.svg\");\n}\nem[data-emoji=\":basket:\"]::before,\nem[data-emoji=\"basket\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9fa.svg\");\n}\nem[data-emoji=\":roll_of_paper:\"]::before,\nem[data-emoji=\"roll_of_paper\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9fb.svg\");\n}\nem[data-emoji=\":toilet:\"]::before,\nem[data-emoji=\"toilet\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6bd.svg\");\n}\nem[data-emoji=\":potable_water:\"]::before,\nem[data-emoji=\"potable_water\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b0.svg\");\n}\nem[data-emoji=\":shower:\"]::before,\nem[data-emoji=\"shower\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6bf.svg\");\n}\nem[data-emoji=\":bathtub:\"]::before,\nem[data-emoji=\"bathtub\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c1.svg\");\n}\nem[data-emoji=\":bath:\"]::before,\nem[data-emoji=\"bath\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0.svg\");\n}\nem[data-emoji=\":bath_tone1:\"]::before,\nem[data-emoji=\"bath_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0-1f3fb.svg\");\n}\nem[data-emoji=\":bath_tone2:\"]::before,\nem[data-emoji=\"bath_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0-1f3fc.svg\");\n}\nem[data-emoji=\":bath_tone3:\"]::before,\nem[data-emoji=\"bath_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0-1f3fd.svg\");\n}\nem[data-emoji=\":bath_tone4:\"]::before,\nem[data-emoji=\"bath_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0-1f3fe.svg\");\n}\nem[data-emoji=\":bath_tone5:\"]::before,\nem[data-emoji=\"bath_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0-1f3ff.svg\");\n}\nem[data-emoji=\":soap:\"]::before,\nem[data-emoji=\"soap\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9fc.svg\");\n}\nem[data-emoji=\":toothbrush:\"]::before,\nem[data-emoji=\"toothbrush\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa5.svg\");\n}\nem[data-emoji=\":razor:\"]::before,\nem[data-emoji=\"razor\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa92.svg\");\n}\nem[data-emoji=\":hair_pick:\"]::before,\nem[data-emoji=\"hair_pick\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faae.svg\");\n}\nem[data-emoji=\":sponge:\"]::before,\nem[data-emoji=\"sponge\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9fd.svg\");\n}\nem[data-emoji=\":bucket:\"]::before,\nem[data-emoji=\"bucket\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa3.svg\");\n}\nem[data-emoji=\":squeeze_bottle:\"]::before,\nem[data-emoji=\"squeeze_bottle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f4.svg\");\n}\nem[data-emoji=\":bellhop:\"]::before,\nem[data-emoji=\"bellhop\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ce.svg\");\n}\nem[data-emoji=\":key:\"]::before,\nem[data-emoji=\"key\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f511.svg\");\n}\nem[data-emoji=\":key2:\"]::before,\nem[data-emoji=\"key2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5dd.svg\");\n}\nem[data-emoji=\":door:\"]::before,\nem[data-emoji=\"door\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6aa.svg\");\n}\nem[data-emoji=\":chair:\"]::before,\nem[data-emoji=\"chair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa91.svg\");\n}\nem[data-emoji=\":couch:\"]::before,\nem[data-emoji=\"couch\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cb.svg\");\n}\nem[data-emoji=\":bed:\"]::before,\nem[data-emoji=\"bed\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cf.svg\");\n}\nem[data-emoji=\":sleeping_accommodation:\"]::before,\nem[data-emoji=\"sleeping_accommodation\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc.svg\");\n}\nem[data-emoji=\":person_in_bed_tone1:\"]::before,\nem[data-emoji=\"person_in_bed_tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc-1f3fb.svg\");\n}\nem[data-emoji=\":person_in_bed_tone2:\"]::before,\nem[data-emoji=\"person_in_bed_tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc-1f3fc.svg\");\n}\nem[data-emoji=\":person_in_bed_tone3:\"]::before,\nem[data-emoji=\"person_in_bed_tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc-1f3fd.svg\");\n}\nem[data-emoji=\":person_in_bed_tone4:\"]::before,\nem[data-emoji=\"person_in_bed_tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc-1f3fe.svg\");\n}\nem[data-emoji=\":person_in_bed_tone5:\"]::before,\nem[data-emoji=\"person_in_bed_tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc-1f3ff.svg\");\n}\nem[data-emoji=\":teddy_bear:\"]::before,\nem[data-emoji=\"teddy_bear\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f8.svg\");\n}\nem[data-emoji=\":nesting_dolls:\"]::before,\nem[data-emoji=\"nesting_dolls\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa86.svg\");\n}\nem[data-emoji=\":frame_photo:\"]::before,\nem[data-emoji=\"frame_photo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5bc.svg\");\n}\nem[data-emoji=\":mirror:\"]::before,\nem[data-emoji=\"mirror\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9e.svg\");\n}\nem[data-emoji=\":window:\"]::before,\nem[data-emoji=\"window\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9f.svg\");\n}\nem[data-emoji=\":shopping_bags:\"]::before,\nem[data-emoji=\"shopping_bags\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cd.svg\");\n}\nem[data-emoji=\":shopping_cart:\"]::before,\nem[data-emoji=\"shopping_cart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d2.svg\");\n}\nem[data-emoji=\":gift:\"]::before,\nem[data-emoji=\"gift\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f381.svg\");\n}\nem[data-emoji=\":balloon:\"]::before,\nem[data-emoji=\"balloon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f388.svg\");\n}\nem[data-emoji=\":flags:\"]::before,\nem[data-emoji=\"flags\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38f.svg\");\n}\nem[data-emoji=\":ribbon:\"]::before,\nem[data-emoji=\"ribbon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f380.svg\");\n}\nem[data-emoji=\":magic_wand:\"]::before,\nem[data-emoji=\"magic_wand\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa84.svg\");\n}\nem[data-emoji=\":pinata:\"]::before,\nem[data-emoji=\"pinata\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa85.svg\");\n}\nem[data-emoji=\":confetti_ball:\"]::before,\nem[data-emoji=\"confetti_ball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38a.svg\");\n}\nem[data-emoji=\":tada:\"]::before,\nem[data-emoji=\"tada\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f389.svg\");\n}\nem[data-emoji=\":dolls:\"]::before,\nem[data-emoji=\"dolls\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38e.svg\");\n}\nem[data-emoji=\":folding_hand_fan:\"]::before,\nem[data-emoji=\"folding_hand_fan\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faad.svg\");\n}\nem[data-emoji=\":izakaya_lantern:\"]::before,\nem[data-emoji=\"izakaya_lantern\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ee.svg\");\n}\nem[data-emoji=\":wind_chime:\"]::before,\nem[data-emoji=\"wind_chime\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f390.svg\");\n}\nem[data-emoji=\":mirror_ball:\"]::before,\nem[data-emoji=\"mirror_ball\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa9.svg\");\n}\nem[data-emoji=\":red_envelope:\"]::before,\nem[data-emoji=\"red_envelope\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e7.svg\");\n}\nem[data-emoji=\":envelope_with_arrow:\"]::before,\nem[data-emoji=\"envelope_with_arrow\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e9.svg\");\n}\nem[data-emoji=\":incoming_envelope:\"]::before,\nem[data-emoji=\"incoming_envelope\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e8.svg\");\n}\nem[data-emoji=\":e-mail:\"]::before,\nem[data-emoji=\"e-mail\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e7.svg\");\n}\nem[data-emoji=\":love_letter:\"]::before,\nem[data-emoji=\"love_letter\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48c.svg\");\n}\nem[data-emoji=\":inbox_tray:\"]::before,\nem[data-emoji=\"inbox_tray\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e5.svg\");\n}\nem[data-emoji=\":outbox_tray:\"]::before,\nem[data-emoji=\"outbox_tray\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e4.svg\");\n}\nem[data-emoji=\":package:\"]::before,\nem[data-emoji=\"package\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e6.svg\");\n}\nem[data-emoji=\":label:\"]::before,\nem[data-emoji=\"label\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f7.svg\");\n}\nem[data-emoji=\":placard:\"]::before,\nem[data-emoji=\"placard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa7.svg\");\n}\nem[data-emoji=\":mailbox_closed:\"]::before,\nem[data-emoji=\"mailbox_closed\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ea.svg\");\n}\nem[data-emoji=\":mailbox:\"]::before,\nem[data-emoji=\"mailbox\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4eb.svg\");\n}\nem[data-emoji=\":mailbox_with_mail:\"]::before,\nem[data-emoji=\"mailbox_with_mail\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ec.svg\");\n}\nem[data-emoji=\":mailbox_with_no_mail:\"]::before,\nem[data-emoji=\"mailbox_with_no_mail\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ed.svg\");\n}\nem[data-emoji=\":postbox:\"]::before,\nem[data-emoji=\"postbox\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ee.svg\");\n}\nem[data-emoji=\":postal_horn:\"]::before,\nem[data-emoji=\"postal_horn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ef.svg\");\n}\nem[data-emoji=\":scroll:\"]::before,\nem[data-emoji=\"scroll\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4dc.svg\");\n}\nem[data-emoji=\":page_with_curl:\"]::before,\nem[data-emoji=\"page_with_curl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c3.svg\");\n}\nem[data-emoji=\":page_facing_up:\"]::before,\nem[data-emoji=\"page_facing_up\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c4.svg\");\n}\nem[data-emoji=\":bookmark_tabs:\"]::before,\nem[data-emoji=\"bookmark_tabs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d1.svg\");\n}\nem[data-emoji=\":receipt:\"]::before,\nem[data-emoji=\"receipt\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9fe.svg\");\n}\nem[data-emoji=\":bar_chart:\"]::before,\nem[data-emoji=\"bar_chart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ca.svg\");\n}\nem[data-emoji=\":chart_with_upwards_trend:\"]::before,\nem[data-emoji=\"chart_with_upwards_trend\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c8.svg\");\n}\nem[data-emoji=\":chart_with_downwards_trend:\"]::before,\nem[data-emoji=\"chart_with_downwards_trend\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c9.svg\");\n}\nem[data-emoji=\":notepad_spiral:\"]::before,\nem[data-emoji=\"notepad_spiral\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5d2.svg\");\n}\nem[data-emoji=\":calendar_spiral:\"]::before,\nem[data-emoji=\"calendar_spiral\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5d3.svg\");\n}\nem[data-emoji=\":calendar:\"]::before,\nem[data-emoji=\"calendar\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c6.svg\");\n}\nem[data-emoji=\":date:\"]::before,\nem[data-emoji=\"date\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c5.svg\");\n}\nem[data-emoji=\":wastebasket:\"]::before,\nem[data-emoji=\"wastebasket\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5d1.svg\");\n}\nem[data-emoji=\":card_index:\"]::before,\nem[data-emoji=\"card_index\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c7.svg\");\n}\nem[data-emoji=\":card_box:\"]::before,\nem[data-emoji=\"card_box\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5c3.svg\");\n}\nem[data-emoji=\":ballot_box:\"]::before,\nem[data-emoji=\"ballot_box\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5f3.svg\");\n}\nem[data-emoji=\":file_cabinet:\"]::before,\nem[data-emoji=\"file_cabinet\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5c4.svg\");\n}\nem[data-emoji=\":clipboard:\"]::before,\nem[data-emoji=\"clipboard\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4cb.svg\");\n}\nem[data-emoji=\":file_folder:\"]::before,\nem[data-emoji=\"file_folder\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c1.svg\");\n}\nem[data-emoji=\":open_file_folder:\"]::before,\nem[data-emoji=\"open_file_folder\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c2.svg\");\n}\nem[data-emoji=\":dividers:\"]::before,\nem[data-emoji=\"dividers\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5c2.svg\");\n}\nem[data-emoji=\":newspaper2:\"]::before,\nem[data-emoji=\"newspaper2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5de.svg\");\n}\nem[data-emoji=\":newspaper:\"]::before,\nem[data-emoji=\"newspaper\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f0.svg\");\n}\nem[data-emoji=\":notebook:\"]::before,\nem[data-emoji=\"notebook\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d3.svg\");\n}\nem[data-emoji=\":notebook_with_decorative_cover:\"]::before,\nem[data-emoji=\"notebook_with_decorative_cover\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d4.svg\");\n}\nem[data-emoji=\":ledger:\"]::before,\nem[data-emoji=\"ledger\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d2.svg\");\n}\nem[data-emoji=\":closed_book:\"]::before,\nem[data-emoji=\"closed_book\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d5.svg\");\n}\nem[data-emoji=\":green_book:\"]::before,\nem[data-emoji=\"green_book\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d7.svg\");\n}\nem[data-emoji=\":blue_book:\"]::before,\nem[data-emoji=\"blue_book\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d8.svg\");\n}\nem[data-emoji=\":orange_book:\"]::before,\nem[data-emoji=\"orange_book\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d9.svg\");\n}\nem[data-emoji=\":books:\"]::before,\nem[data-emoji=\"books\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4da.svg\");\n}\nem[data-emoji=\":book:\"]::before,\nem[data-emoji=\"book\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d6.svg\");\n}\nem[data-emoji=\":bookmark:\"]::before,\nem[data-emoji=\"bookmark\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f516.svg\");\n}\nem[data-emoji=\":safety_pin:\"]::before,\nem[data-emoji=\"safety_pin\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f7.svg\");\n}\nem[data-emoji=\":paperclip:\"]::before,\nem[data-emoji=\"paperclip\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ce.svg\");\n}\nem[data-emoji=\":paperclips:\"]::before,\nem[data-emoji=\"paperclips\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f587.svg\");\n}\nem[data-emoji=\":triangular_ruler:\"]::before,\nem[data-emoji=\"triangular_ruler\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d0.svg\");\n}\nem[data-emoji=\":straight_ruler:\"]::before,\nem[data-emoji=\"straight_ruler\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4cf.svg\");\n}\nem[data-emoji=\":abacus:\"]::before,\nem[data-emoji=\"abacus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ee.svg\");\n}\nem[data-emoji=\":pushpin:\"]::before,\nem[data-emoji=\"pushpin\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4cc.svg\");\n}\nem[data-emoji=\":round_pushpin:\"]::before,\nem[data-emoji=\"round_pushpin\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4cd.svg\");\n}\nem[data-emoji=\":pen_ballpoint:\"]::before,\nem[data-emoji=\"pen_ballpoint\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f58a.svg\");\n}\nem[data-emoji=\":pen_fountain:\"]::before,\nem[data-emoji=\"pen_fountain\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f58b.svg\");\n}\nem[data-emoji=\":paintbrush:\"]::before,\nem[data-emoji=\"paintbrush\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f58c.svg\");\n}\nem[data-emoji=\":crayon:\"]::before,\nem[data-emoji=\"crayon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f58d.svg\");\n}\nem[data-emoji=\":pencil:\"]::before,\nem[data-emoji=\"pencil\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4dd.svg\");\n}\nem[data-emoji=\":pencil2:\"]::before,\nem[data-emoji=\"pencil2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270f.svg\");\n}\nem[data-emoji=\":mag:\"]::before,\nem[data-emoji=\"mag\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50d.svg\");\n}\nem[data-emoji=\":mag_right:\"]::before,\nem[data-emoji=\"mag_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50e.svg\");\n}\nem[data-emoji=\":lock_with_ink_pen:\"]::before,\nem[data-emoji=\"lock_with_ink_pen\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50f.svg\");\n}\nem[data-emoji=\":closed_lock_with_key:\"]::before,\nem[data-emoji=\"closed_lock_with_key\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f510.svg\");\n}\nem[data-emoji=\":lock:\"]::before,\nem[data-emoji=\"lock\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f512.svg\");\n}\nem[data-emoji=\":unlock:\"]::before,\nem[data-emoji=\"unlock\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f513.svg\");\n}\nem[data-emoji=\":pink_heart:\"]::before,\nem[data-emoji=\"pink_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa77.svg\");\n}\nem[data-emoji=\":orange_heart:\"]::before,\nem[data-emoji=\"orange_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e1.svg\");\n}\nem[data-emoji=\":yellow_heart:\"]::before,\nem[data-emoji=\"yellow_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49b.svg\");\n}\nem[data-emoji=\":green_heart:\"]::before,\nem[data-emoji=\"green_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49a.svg\");\n}\nem[data-emoji=\":light_blue_heart:\"]::before,\nem[data-emoji=\"light_blue_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa75.svg\");\n}\nem[data-emoji=\":blue_heart:\"]::before,\nem[data-emoji=\"blue_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f499.svg\");\n}\nem[data-emoji=\":purple_heart:\"]::before,\nem[data-emoji=\"purple_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49c.svg\");\n}\nem[data-emoji=\":black_heart:\"]::before,\nem[data-emoji=\"black_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5a4.svg\");\n}\nem[data-emoji=\":grey_heart:\"]::before,\nem[data-emoji=\"grey_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa76.svg\");\n}\nem[data-emoji=\":white_heart:\"]::before,\nem[data-emoji=\"white_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90d.svg\");\n}\nem[data-emoji=\":brown_heart:\"]::before,\nem[data-emoji=\"brown_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90e.svg\");\n}\nem[data-emoji=\":broken_heart:\"]::before,\nem[data-emoji=\"broken_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f494.svg\");\n}\nem[data-emoji=\":two_hearts:\"]::before,\nem[data-emoji=\"two_hearts\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f495.svg\");\n}\nem[data-emoji=\":revolving_hearts:\"]::before,\nem[data-emoji=\"revolving_hearts\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49e.svg\");\n}\nem[data-emoji=\":heartbeat:\"]::before,\nem[data-emoji=\"heartbeat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f493.svg\");\n}\nem[data-emoji=\":heartpulse:\"]::before,\nem[data-emoji=\"heartpulse\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f497.svg\");\n}\nem[data-emoji=\":sparkling_heart:\"]::before,\nem[data-emoji=\"sparkling_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f496.svg\");\n}\nem[data-emoji=\":cupid:\"]::before,\nem[data-emoji=\"cupid\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f498.svg\");\n}\nem[data-emoji=\":gift_heart:\"]::before,\nem[data-emoji=\"gift_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49d.svg\");\n}\nem[data-emoji=\":mending_heart:\"]::before,\nem[data-emoji=\"mending_heart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2764-fe0f-200d-1fa79.svg\");\n}\nem[data-emoji=\":heart_on_fire:\"]::before,\nem[data-emoji=\"heart_on_fire\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2764-fe0f-200d-1f525.svg\");\n}\nem[data-emoji=\":heart_decoration:\"]::before,\nem[data-emoji=\"heart_decoration\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49f.svg\");\n}\nem[data-emoji=\":peace:\"]::before,\nem[data-emoji=\"peace\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/262e.svg\");\n}\nem[data-emoji=\":cross:\"]::before,\nem[data-emoji=\"cross\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/271d.svg\");\n}\nem[data-emoji=\":star_and_crescent:\"]::before,\nem[data-emoji=\"star_and_crescent\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/262a.svg\");\n}\nem[data-emoji=\":om_symbol:\"]::before,\nem[data-emoji=\"om_symbol\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f549.svg\");\n}\nem[data-emoji=\":khanda:\"]::before,\nem[data-emoji=\"khanda\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faaf.svg\");\n}\nem[data-emoji=\":six_pointed_star:\"]::before,\nem[data-emoji=\"six_pointed_star\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52f.svg\");\n}\nem[data-emoji=\":menorah:\"]::before,\nem[data-emoji=\"menorah\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f54e.svg\");\n}\nem[data-emoji=\":yin_yang:\"]::before,\nem[data-emoji=\"yin_yang\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/262f.svg\");\n}\nem[data-emoji=\":place_of_worship:\"]::before,\nem[data-emoji=\"place_of_worship\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d0.svg\");\n}\nem[data-emoji=\":ophiuchus:\"]::before,\nem[data-emoji=\"ophiuchus\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26ce.svg\");\n}\nem[data-emoji=\":gemini:\"]::before,\nem[data-emoji=\"gemini\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264a.svg\");\n}\nem[data-emoji=\":cancer:\"]::before,\nem[data-emoji=\"cancer\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264b.svg\");\n}\nem[data-emoji=\":leo:\"]::before,\nem[data-emoji=\"leo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264c.svg\");\n}\nem[data-emoji=\":virgo:\"]::before,\nem[data-emoji=\"virgo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264d.svg\");\n}\nem[data-emoji=\":libra:\"]::before,\nem[data-emoji=\"libra\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264e.svg\");\n}\nem[data-emoji=\":scorpius:\"]::before,\nem[data-emoji=\"scorpius\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264f.svg\");\n}\nem[data-emoji=\":id:\"]::before,\nem[data-emoji=\"id\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f194.svg\");\n}\nem[data-emoji=\":atom:\"]::before,\nem[data-emoji=\"atom\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/269b.svg\");\n}\nem[data-emoji=\":accept:\"]::before,\nem[data-emoji=\"accept\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f251.svg\");\n}\nem[data-emoji=\":mobile_phone_off:\"]::before,\nem[data-emoji=\"mobile_phone_off\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f4.svg\");\n}\nem[data-emoji=\":vibration_mode:\"]::before,\nem[data-emoji=\"vibration_mode\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f3.svg\");\n}\nem[data-emoji=\":u6709:\"]::before,\nem[data-emoji=\"u6709\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f236.svg\");\n}\nem[data-emoji=\":u7121:\"]::before,\nem[data-emoji=\"u7121\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f21a.svg\");\n}\nem[data-emoji=\":u7533:\"]::before,\nem[data-emoji=\"u7533\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f238.svg\");\n}\nem[data-emoji=\":u55b6:\"]::before,\nem[data-emoji=\"u55b6\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f23a.svg\");\n}\nem[data-emoji=\":u6708:\"]::before,\nem[data-emoji=\"u6708\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f237.svg\");\n}\nem[data-emoji=\":vs:\"]::before,\nem[data-emoji=\"vs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f19a.svg\");\n}\nem[data-emoji=\":white_flower:\"]::before,\nem[data-emoji=\"white_flower\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ae.svg\");\n}\nem[data-emoji=\":ideograph_advantage:\"]::before,\nem[data-emoji=\"ideograph_advantage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f250.svg\");\n}\nem[data-emoji=\":u5408:\"]::before,\nem[data-emoji=\"u5408\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f234.svg\");\n}\nem[data-emoji=\":u6e80:\"]::before,\nem[data-emoji=\"u6e80\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f235.svg\");\n}\nem[data-emoji=\":u5272:\"]::before,\nem[data-emoji=\"u5272\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f239.svg\");\n}\nem[data-emoji=\":u7981:\"]::before,\nem[data-emoji=\"u7981\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f232.svg\");\n}\nem[data-emoji=\":a:\"]::before,\nem[data-emoji=\"a\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f170.svg\");\n}\nem[data-emoji=\":b:\"]::before,\nem[data-emoji=\"b\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f171.svg\");\n}\nem[data-emoji=\":ab:\"]::before,\nem[data-emoji=\"ab\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f18e.svg\");\n}\nem[data-emoji=\":cl:\"]::before,\nem[data-emoji=\"cl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f191.svg\");\n}\nem[data-emoji=\":o2:\"]::before,\nem[data-emoji=\"o2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f17e.svg\");\n}\nem[data-emoji=\":sos:\"]::before,\nem[data-emoji=\"sos\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f198.svg\");\n}\nem[data-emoji=\":x:\"]::before,\nem[data-emoji=\"x\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/274c.svg\");\n}\nem[data-emoji=\":o:\"]::before,\nem[data-emoji=\"o\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b55.svg\");\n}\nem[data-emoji=\":octagonal_sign:\"]::before,\nem[data-emoji=\"octagonal_sign\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d1.svg\");\n}\nem[data-emoji=\":no_entry:\"]::before,\nem[data-emoji=\"no_entry\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26d4.svg\");\n}\nem[data-emoji=\":name_badge:\"]::before,\nem[data-emoji=\"name_badge\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4db.svg\");\n}\nem[data-emoji=\":no_entry_sign:\"]::before,\nem[data-emoji=\"no_entry_sign\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ab.svg\");\n}\nem[data-emoji=\":100:\"]::before,\nem[data-emoji=\"100\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4af.svg\");\n}\nem[data-emoji=\":anger:\"]::before,\nem[data-emoji=\"anger\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a2.svg\");\n}\nem[data-emoji=\":no_pedestrians:\"]::before,\nem[data-emoji=\"no_pedestrians\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b7.svg\");\n}\nem[data-emoji=\":do_not_litter:\"]::before,\nem[data-emoji=\"do_not_litter\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6af.svg\");\n}\nem[data-emoji=\":no_bicycles:\"]::before,\nem[data-emoji=\"no_bicycles\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b3.svg\");\n}\nem[data-emoji=\":non-potable_water:\"]::before,\nem[data-emoji=\"non-potable_water\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b1.svg\");\n}\nem[data-emoji=\":underage:\"]::before,\nem[data-emoji=\"underage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51e.svg\");\n}\nem[data-emoji=\":no_mobile_phones:\"]::before,\nem[data-emoji=\"no_mobile_phones\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f5.svg\");\n}\nem[data-emoji=\":no_smoking:\"]::before,\nem[data-emoji=\"no_smoking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ad.svg\");\n}\nem[data-emoji=\":bangbang:\"]::before,\nem[data-emoji=\"bangbang\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/203c.svg\");\n}\nem[data-emoji=\":low_brightness:\"]::before,\nem[data-emoji=\"low_brightness\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f505.svg\");\n}\nem[data-emoji=\":high_brightness:\"]::before,\nem[data-emoji=\"high_brightness\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f506.svg\");\n}\nem[data-emoji=\":part_alternation_mark:\"]::before,\nem[data-emoji=\"part_alternation_mark\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/303d.svg\");\n}\nem[data-emoji=\":warning:\"]::before,\nem[data-emoji=\"warning\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26a0.svg\");\n}\nem[data-emoji=\":children_crossing:\"]::before,\nem[data-emoji=\"children_crossing\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b8.svg\");\n}\nem[data-emoji=\":trident:\"]::before,\nem[data-emoji=\"trident\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f531.svg\");\n}\nem[data-emoji=\":fleur-de-lis:\"]::before,\nem[data-emoji=\"fleur-de-lis\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/269c.svg\");\n}\nem[data-emoji=\":beginner:\"]::before,\nem[data-emoji=\"beginner\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f530.svg\");\n}\nem[data-emoji=\":recycle:\"]::before,\nem[data-emoji=\"recycle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/267b.svg\");\n}\nem[data-emoji=\":u6307:\"]::before,\nem[data-emoji=\"u6307\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f22f.svg\");\n}\nem[data-emoji=\":chart:\"]::before,\nem[data-emoji=\"chart\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b9.svg\");\n}\nem[data-emoji=\":negative_squared_cross_mark:\"]::before,\nem[data-emoji=\"negative_squared_cross_mark\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/274e.svg\");\n}\nem[data-emoji=\":globe_with_meridians:\"]::before,\nem[data-emoji=\"globe_with_meridians\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f310.svg\");\n}\nem[data-emoji=\":diamond_shape_with_a_dot_inside:\"]::before,\nem[data-emoji=\"diamond_shape_with_a_dot_inside\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a0.svg\");\n}\nem[data-emoji=\":m:\"]::before,\nem[data-emoji=\"m\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/24c2.svg\");\n}\nem[data-emoji=\":cyclone:\"]::before,\nem[data-emoji=\"cyclone\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f300.svg\");\n}\nem[data-emoji=\":zzz:\"]::before,\nem[data-emoji=\"zzz\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a4.svg\");\n}\nem[data-emoji=\":atm:\"]::before,\nem[data-emoji=\"atm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e7.svg\");\n}\nem[data-emoji=\":wc:\"]::before,\nem[data-emoji=\"wc\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6be.svg\");\n}\nem[data-emoji=\":wheelchair:\"]::before,\nem[data-emoji=\"wheelchair\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/267f.svg\");\n}\nem[data-emoji=\":parking:\"]::before,\nem[data-emoji=\"parking\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f17f.svg\");\n}\nem[data-emoji=\":elevator:\"]::before,\nem[data-emoji=\"elevator\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d7.svg\");\n}\nem[data-emoji=\":u7a7a:\"]::before,\nem[data-emoji=\"u7a7a\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f233.svg\");\n}\nem[data-emoji=\":sa:\"]::before,\nem[data-emoji=\"sa\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f202.svg\");\n}\nem[data-emoji=\":passport_control:\"]::before,\nem[data-emoji=\"passport_control\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c2.svg\");\n}\nem[data-emoji=\":customs:\"]::before,\nem[data-emoji=\"customs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c3.svg\");\n}\nem[data-emoji=\":baggage_claim:\"]::before,\nem[data-emoji=\"baggage_claim\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c4.svg\");\n}\nem[data-emoji=\":left_luggage:\"]::before,\nem[data-emoji=\"left_luggage\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c5.svg\");\n}\nem[data-emoji=\":wireless:\"]::before,\nem[data-emoji=\"wireless\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6dc.svg\");\n}\nem[data-emoji=\":mens:\"]::before,\nem[data-emoji=\"mens\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b9.svg\");\n}\nem[data-emoji=\":womens:\"]::before,\nem[data-emoji=\"womens\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ba.svg\");\n}\nem[data-emoji=\":baby_symbol:\"]::before,\nem[data-emoji=\"baby_symbol\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6bc.svg\");\n}\nem[data-emoji=\":restroom:\"]::before,\nem[data-emoji=\"restroom\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6bb.svg\");\n}\nem[data-emoji=\":put_litter_in_its_place:\"]::before,\nem[data-emoji=\"put_litter_in_its_place\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ae.svg\");\n}\nem[data-emoji=\":cinema:\"]::before,\nem[data-emoji=\"cinema\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a6.svg\");\n}\nem[data-emoji=\":signal_strength:\"]::before,\nem[data-emoji=\"signal_strength\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f6.svg\");\n}\nem[data-emoji=\":koko:\"]::before,\nem[data-emoji=\"koko\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f201.svg\");\n}\nem[data-emoji=\":symbols:\"]::before,\nem[data-emoji=\"symbols\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f523.svg\");\n}\nem[data-emoji=\":abc:\"]::before,\nem[data-emoji=\"abc\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f524.svg\");\n}\nem[data-emoji=\":abcd:\"]::before,\nem[data-emoji=\"abcd\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f521.svg\");\n}\nem[data-emoji=\":capital_abcd:\"]::before,\nem[data-emoji=\"capital_abcd\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f520.svg\");\n}\nem[data-emoji=\":ng:\"]::before,\nem[data-emoji=\"ng\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f196.svg\");\n}\nem[data-emoji=\":ok:\"]::before,\nem[data-emoji=\"ok\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f197.svg\");\n}\nem[data-emoji=\":up:\"]::before,\nem[data-emoji=\"up\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f199.svg\");\n}\nem[data-emoji=\":cool:\"]::before,\nem[data-emoji=\"cool\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f192.svg\");\n}\nem[data-emoji=\":new:\"]::before,\nem[data-emoji=\"new\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f195.svg\");\n}\nem[data-emoji=\":free:\"]::before,\nem[data-emoji=\"free\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f193.svg\");\n}\nem[data-emoji=\":zero:\"]::before,\nem[data-emoji=\"zero\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/30-20e3.svg\");\n}\nem[data-emoji=\":one:\"]::before,\nem[data-emoji=\"one\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/31-20e3.svg\");\n}\nem[data-emoji=\":two:\"]::before,\nem[data-emoji=\"two\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/32-20e3.svg\");\n}\nem[data-emoji=\":three:\"]::before,\nem[data-emoji=\"three\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/33-20e3.svg\");\n}\nem[data-emoji=\":four:\"]::before,\nem[data-emoji=\"four\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/34-20e3.svg\");\n}\nem[data-emoji=\":five:\"]::before,\nem[data-emoji=\"five\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/35-20e3.svg\");\n}\nem[data-emoji=\":six:\"]::before,\nem[data-emoji=\"six\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/36-20e3.svg\");\n}\nem[data-emoji=\":seven:\"]::before,\nem[data-emoji=\"seven\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/37-20e3.svg\");\n}\nem[data-emoji=\":eight:\"]::before,\nem[data-emoji=\"eight\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/38-20e3.svg\");\n}\nem[data-emoji=\":nine:\"]::before,\nem[data-emoji=\"nine\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/39-20e3.svg\");\n}\nem[data-emoji=\":keycap_ten:\"]::before,\nem[data-emoji=\"keycap_ten\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51f.svg\");\n}\nem[data-emoji=\":1234:\"]::before,\nem[data-emoji=\"1234\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f522.svg\");\n}\nem[data-emoji=\":hash:\"]::before,\nem[data-emoji=\"hash\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23-20e3.svg\");\n}\nem[data-emoji=\":asterisk:\"]::before,\nem[data-emoji=\"asterisk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2a-20e3.svg\");\n}\nem[data-emoji=\":eject:\"]::before,\nem[data-emoji=\"eject\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23cf.svg\");\n}\nem[data-emoji=\":arrow_forward:\"]::before,\nem[data-emoji=\"arrow_forward\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25b6.svg\");\n}\nem[data-emoji=\":pause_button:\"]::before,\nem[data-emoji=\"pause_button\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f8.svg\");\n}\nem[data-emoji=\":play_pause:\"]::before,\nem[data-emoji=\"play_pause\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23ef.svg\");\n}\nem[data-emoji=\":stop_button:\"]::before,\nem[data-emoji=\"stop_button\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f9.svg\");\n}\nem[data-emoji=\":record_button:\"]::before,\nem[data-emoji=\"record_button\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23fa.svg\");\n}\nem[data-emoji=\":track_next:\"]::before,\nem[data-emoji=\"track_next\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23ed.svg\");\n}\nem[data-emoji=\":track_previous:\"]::before,\nem[data-emoji=\"track_previous\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23ee.svg\");\n}\nem[data-emoji=\":fast_forward:\"]::before,\nem[data-emoji=\"fast_forward\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23e9.svg\");\n}\nem[data-emoji=\":rewind:\"]::before,\nem[data-emoji=\"rewind\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23ea.svg\");\n}\nem[data-emoji=\":arrow_double_up:\"]::before,\nem[data-emoji=\"arrow_double_up\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23eb.svg\");\n}\nem[data-emoji=\":arrow_double_down:\"]::before,\nem[data-emoji=\"arrow_double_down\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23ec.svg\");\n}\nem[data-emoji=\":arrow_backward:\"]::before,\nem[data-emoji=\"arrow_backward\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25c0.svg\");\n}\nem[data-emoji=\":arrow_up_small:\"]::before,\nem[data-emoji=\"arrow_up_small\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f53c.svg\");\n}\nem[data-emoji=\":arrow_down_small:\"]::before,\nem[data-emoji=\"arrow_down_small\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f53d.svg\");\n}\nem[data-emoji=\":arrow_right:\"]::before,\nem[data-emoji=\"arrow_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/27a1.svg\");\n}\nem[data-emoji=\":arrow_left:\"]::before,\nem[data-emoji=\"arrow_left\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b05.svg\");\n}\nem[data-emoji=\":arrow_up:\"]::before,\nem[data-emoji=\"arrow_up\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b06.svg\");\n}\nem[data-emoji=\":arrow_down:\"]::before,\nem[data-emoji=\"arrow_down\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b07.svg\");\n}\nem[data-emoji=\":arrow_right_hook:\"]::before,\nem[data-emoji=\"arrow_right_hook\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/21aa.svg\");\n}\nem[data-emoji=\":leftwards_arrow_with_hook:\"]::before,\nem[data-emoji=\"leftwards_arrow_with_hook\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/21a9.svg\");\n}\nem[data-emoji=\":twisted_rightwards_arrows:\"]::before,\nem[data-emoji=\"twisted_rightwards_arrows\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f500.svg\");\n}\nem[data-emoji=\":repeat:\"]::before,\nem[data-emoji=\"repeat\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f501.svg\");\n}\nem[data-emoji=\":repeat_one:\"]::before,\nem[data-emoji=\"repeat_one\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f502.svg\");\n}\nem[data-emoji=\":arrows_counterclockwise:\"]::before,\nem[data-emoji=\"arrows_counterclockwise\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f504.svg\");\n}\nem[data-emoji=\":arrows_clockwise:\"]::before,\nem[data-emoji=\"arrows_clockwise\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f503.svg\");\n}\nem[data-emoji=\":musical_note:\"]::before,\nem[data-emoji=\"musical_note\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b5.svg\");\n}\nem[data-emoji=\":notes:\"]::before,\nem[data-emoji=\"notes\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b6.svg\");\n}\nem[data-emoji=\":heavy_equals_sign:\"]::before,\nem[data-emoji=\"heavy_equals_sign\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7f0.svg\");\n}\nem[data-emoji=\":infinity:\"]::before,\nem[data-emoji=\"infinity\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/267e.svg\");\n}\nem[data-emoji=\":heavy_dollar_sign:\"]::before,\nem[data-emoji=\"heavy_dollar_sign\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b2.svg\");\n}\nem[data-emoji=\":currency_exchange:\"]::before,\nem[data-emoji=\"currency_exchange\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b1.svg\");\n}\nem[data-emoji=\":copyright:\"]::before,\nem[data-emoji=\"copyright\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/a9.svg\");\n}\nem[data-emoji=\":registered:\"]::before,\nem[data-emoji=\"registered\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/ae.svg\");\n}\nem[data-emoji=\":curly_loop:\"]::before,\nem[data-emoji=\"curly_loop\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/27b0.svg\");\n}\nem[data-emoji=\":loop:\"]::before,\nem[data-emoji=\"loop\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/27bf.svg\");\n}\nem[data-emoji=\":end:\"]::before,\nem[data-emoji=\"end\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51a.svg\");\n}\nem[data-emoji=\":back:\"]::before,\nem[data-emoji=\"back\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f519.svg\");\n}\nem[data-emoji=\":on:\"]::before,\nem[data-emoji=\"on\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51b.svg\");\n}\nem[data-emoji=\":top:\"]::before,\nem[data-emoji=\"top\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51d.svg\");\n}\nem[data-emoji=\":soon:\"]::before,\nem[data-emoji=\"soon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51c.svg\");\n}\nem[data-emoji=\":radio_button:\"]::before,\nem[data-emoji=\"radio_button\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f518.svg\");\n}\nem[data-emoji=\":white_circle:\"]::before,\nem[data-emoji=\"white_circle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26aa.svg\");\n}\nem[data-emoji=\":black_circle:\"]::before,\nem[data-emoji=\"black_circle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26ab.svg\");\n}\nem[data-emoji=\":red_circle:\"]::before,\nem[data-emoji=\"red_circle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f534.svg\");\n}\nem[data-emoji=\":blue_circle:\"]::before,\nem[data-emoji=\"blue_circle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f535.svg\");\n}\nem[data-emoji=\":brown_circle:\"]::before,\nem[data-emoji=\"brown_circle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e4.svg\");\n}\nem[data-emoji=\":purple_circle:\"]::before,\nem[data-emoji=\"purple_circle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e3.svg\");\n}\nem[data-emoji=\":green_circle:\"]::before,\nem[data-emoji=\"green_circle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e2.svg\");\n}\nem[data-emoji=\":yellow_circle:\"]::before,\nem[data-emoji=\"yellow_circle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e1.svg\");\n}\nem[data-emoji=\":orange_circle:\"]::before,\nem[data-emoji=\"orange_circle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e0.svg\");\n}\nem[data-emoji=\":small_red_triangle:\"]::before,\nem[data-emoji=\"small_red_triangle\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f53a.svg\");\n}\nem[data-emoji=\":small_red_triangle_down:\"]::before,\nem[data-emoji=\"small_red_triangle_down\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f53b.svg\");\n}\nem[data-emoji=\":small_orange_diamond:\"]::before,\nem[data-emoji=\"small_orange_diamond\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f538.svg\");\n}\nem[data-emoji=\":small_blue_diamond:\"]::before,\nem[data-emoji=\"small_blue_diamond\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f539.svg\");\n}\nem[data-emoji=\":large_orange_diamond:\"]::before,\nem[data-emoji=\"large_orange_diamond\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f536.svg\");\n}\nem[data-emoji=\":large_blue_diamond:\"]::before,\nem[data-emoji=\"large_blue_diamond\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f537.svg\");\n}\nem[data-emoji=\":white_square_button:\"]::before,\nem[data-emoji=\"white_square_button\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f533.svg\");\n}\nem[data-emoji=\":black_square_button:\"]::before,\nem[data-emoji=\"black_square_button\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f532.svg\");\n}\nem[data-emoji=\":black_small_square:\"]::before,\nem[data-emoji=\"black_small_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25aa.svg\");\n}\nem[data-emoji=\":white_small_square:\"]::before,\nem[data-emoji=\"white_small_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25ab.svg\");\n}\nem[data-emoji=\":black_medium_small_square:\"]::before,\nem[data-emoji=\"black_medium_small_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25fe.svg\");\n}\nem[data-emoji=\":white_medium_small_square:\"]::before,\nem[data-emoji=\"white_medium_small_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25fd.svg\");\n}\nem[data-emoji=\":black_medium_square:\"]::before,\nem[data-emoji=\"black_medium_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25fc.svg\");\n}\nem[data-emoji=\":white_medium_square:\"]::before,\nem[data-emoji=\"white_medium_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25fb.svg\");\n}\nem[data-emoji=\":black_large_square:\"]::before,\nem[data-emoji=\"black_large_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b1b.svg\");\n}\nem[data-emoji=\":white_large_square:\"]::before,\nem[data-emoji=\"white_large_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b1c.svg\");\n}\nem[data-emoji=\":orange_square:\"]::before,\nem[data-emoji=\"orange_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e7.svg\");\n}\nem[data-emoji=\":blue_square:\"]::before,\nem[data-emoji=\"blue_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e6.svg\");\n}\nem[data-emoji=\":red_square:\"]::before,\nem[data-emoji=\"red_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e5.svg\");\n}\nem[data-emoji=\":brown_square:\"]::before,\nem[data-emoji=\"brown_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7eb.svg\");\n}\nem[data-emoji=\":purple_square:\"]::before,\nem[data-emoji=\"purple_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7ea.svg\");\n}\nem[data-emoji=\":green_square:\"]::before,\nem[data-emoji=\"green_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e9.svg\");\n}\nem[data-emoji=\":yellow_square:\"]::before,\nem[data-emoji=\"yellow_square\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e8.svg\");\n}\nem[data-emoji=\":speaker:\"]::before,\nem[data-emoji=\"speaker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f508.svg\");\n}\nem[data-emoji=\":mute:\"]::before,\nem[data-emoji=\"mute\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f507.svg\");\n}\nem[data-emoji=\":sound:\"]::before,\nem[data-emoji=\"sound\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f509.svg\");\n}\nem[data-emoji=\":loud_sound:\"]::before,\nem[data-emoji=\"loud_sound\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50a.svg\");\n}\nem[data-emoji=\":bell:\"]::before,\nem[data-emoji=\"bell\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f514.svg\");\n}\nem[data-emoji=\":no_bell:\"]::before,\nem[data-emoji=\"no_bell\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f515.svg\");\n}\nem[data-emoji=\":mega:\"]::before,\nem[data-emoji=\"mega\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e3.svg\");\n}\nem[data-emoji=\":loudspeaker:\"]::before,\nem[data-emoji=\"loudspeaker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e2.svg\");\n}\nem[data-emoji=\":speech_left:\"]::before,\nem[data-emoji=\"speech_left\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5e8.svg\");\n}\nem[data-emoji=\":eye_in_speech_bubble:\"]::before,\nem[data-emoji=\"eye_in_speech_bubble\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f441-200d-1f5e8.svg\");\n}\nem[data-emoji=\":speech_balloon:\"]::before,\nem[data-emoji=\"speech_balloon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ac.svg\");\n}\nem[data-emoji=\":thought_balloon:\"]::before,\nem[data-emoji=\"thought_balloon\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ad.svg\");\n}\nem[data-emoji=\":anger_right:\"]::before,\nem[data-emoji=\"anger_right\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5ef.svg\");\n}\nem[data-emoji=\":black_joker:\"]::before,\nem[data-emoji=\"black_joker\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f0cf.svg\");\n}\nem[data-emoji=\":flower_playing_cards:\"]::before,\nem[data-emoji=\"flower_playing_cards\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b4.svg\");\n}\nem[data-emoji=\":mahjong:\"]::before,\nem[data-emoji=\"mahjong\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f004.svg\");\n}\nem[data-emoji=\":clock1:\"]::before,\nem[data-emoji=\"clock1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f550.svg\");\n}\nem[data-emoji=\":clock2:\"]::before,\nem[data-emoji=\"clock2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f551.svg\");\n}\nem[data-emoji=\":clock3:\"]::before,\nem[data-emoji=\"clock3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f552.svg\");\n}\nem[data-emoji=\":clock4:\"]::before,\nem[data-emoji=\"clock4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f553.svg\");\n}\nem[data-emoji=\":clock5:\"]::before,\nem[data-emoji=\"clock5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f554.svg\");\n}\nem[data-emoji=\":clock6:\"]::before,\nem[data-emoji=\"clock6\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f555.svg\");\n}\nem[data-emoji=\":clock7:\"]::before,\nem[data-emoji=\"clock7\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f556.svg\");\n}\nem[data-emoji=\":clock8:\"]::before,\nem[data-emoji=\"clock8\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f557.svg\");\n}\nem[data-emoji=\":clock9:\"]::before,\nem[data-emoji=\"clock9\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f558.svg\");\n}\nem[data-emoji=\":clock10:\"]::before,\nem[data-emoji=\"clock10\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f559.svg\");\n}\nem[data-emoji=\":clock11:\"]::before,\nem[data-emoji=\"clock11\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55a.svg\");\n}\nem[data-emoji=\":clock12:\"]::before,\nem[data-emoji=\"clock12\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55b.svg\");\n}\nem[data-emoji=\":clock130:\"]::before,\nem[data-emoji=\"clock130\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55c.svg\");\n}\nem[data-emoji=\":clock230:\"]::before,\nem[data-emoji=\"clock230\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55d.svg\");\n}\nem[data-emoji=\":clock330:\"]::before,\nem[data-emoji=\"clock330\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55e.svg\");\n}\nem[data-emoji=\":clock430:\"]::before,\nem[data-emoji=\"clock430\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55f.svg\");\n}\nem[data-emoji=\":clock530:\"]::before,\nem[data-emoji=\"clock530\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f560.svg\");\n}\nem[data-emoji=\":clock630:\"]::before,\nem[data-emoji=\"clock630\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f561.svg\");\n}\nem[data-emoji=\":clock730:\"]::before,\nem[data-emoji=\"clock730\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f562.svg\");\n}\nem[data-emoji=\":clock830:\"]::before,\nem[data-emoji=\"clock830\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f563.svg\");\n}\nem[data-emoji=\":clock930:\"]::before,\nem[data-emoji=\"clock930\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f564.svg\");\n}\nem[data-emoji=\":clock1030:\"]::before,\nem[data-emoji=\"clock1030\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f565.svg\");\n}\nem[data-emoji=\":clock1130:\"]::before,\nem[data-emoji=\"clock1130\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f566.svg\");\n}\nem[data-emoji=\":clock1230:\"]::before,\nem[data-emoji=\"clock1230\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f567.svg\");\n}\nem[data-emoji=\":transgender_symbol:\"]::before,\nem[data-emoji=\"transgender_symbol\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26a7.svg\");\n}\nem[data-emoji=\":flag_white:\"]::before,\nem[data-emoji=\"flag_white\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f3.svg\");\n}\nem[data-emoji=\":flag_black:\"]::before,\nem[data-emoji=\"flag_black\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4.svg\");\n}\nem[data-emoji=\":pirate_flag:\"]::before,\nem[data-emoji=\"pirate_flag\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-200d-2620-fe0f.svg\");\n}\nem[data-emoji=\":checkered_flag:\"]::before,\nem[data-emoji=\"checkered_flag\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c1.svg\");\n}\nem[data-emoji=\":triangular_flag_on_post:\"]::before,\nem[data-emoji=\"triangular_flag_on_post\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a9.svg\");\n}\nem[data-emoji=\":rainbow_flag:\"]::before,\nem[data-emoji=\"rainbow_flag\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f3-fe0f-200d-1f308.svg\");\n}\nem[data-emoji=\":transgender_flag:\"]::before,\nem[data-emoji=\"transgender_flag\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f3-fe0f-200d-26a7-fe0f.svg\");\n}\nem[data-emoji=\":united_nations:\"]::before,\nem[data-emoji=\"united_nations\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f3.svg\");\n}\nem[data-emoji=\":flag_af:\"]::before,\nem[data-emoji=\"flag_af\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1eb.svg\");\n}\nem[data-emoji=\":flag_ax:\"]::before,\nem[data-emoji=\"flag_ax\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fd.svg\");\n}\nem[data-emoji=\":flag_al:\"]::before,\nem[data-emoji=\"flag_al\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f1.svg\");\n}\nem[data-emoji=\":flag_dz:\"]::before,\nem[data-emoji=\"flag_dz\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ff.svg\");\n}\nem[data-emoji=\":flag_as:\"]::before,\nem[data-emoji=\"flag_as\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f8.svg\");\n}\nem[data-emoji=\":flag_ad:\"]::before,\nem[data-emoji=\"flag_ad\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1e9.svg\");\n}\nem[data-emoji=\":flag_ao:\"]::before,\nem[data-emoji=\"flag_ao\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f4.svg\");\n}\nem[data-emoji=\":flag_ai:\"]::before,\nem[data-emoji=\"flag_ai\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ee.svg\");\n}\nem[data-emoji=\":flag_aq:\"]::before,\nem[data-emoji=\"flag_aq\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f6.svg\");\n}\nem[data-emoji=\":flag_ag:\"]::before,\nem[data-emoji=\"flag_ag\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ec.svg\");\n}\nem[data-emoji=\":flag_ar:\"]::before,\nem[data-emoji=\"flag_ar\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f7.svg\");\n}\nem[data-emoji=\":flag_am:\"]::before,\nem[data-emoji=\"flag_am\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f2.svg\");\n}\nem[data-emoji=\":flag_aw:\"]::before,\nem[data-emoji=\"flag_aw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fc.svg\");\n}\nem[data-emoji=\":flag_au:\"]::before,\nem[data-emoji=\"flag_au\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fa.svg\");\n}\nem[data-emoji=\":flag_at:\"]::before,\nem[data-emoji=\"flag_at\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f9.svg\");\n}\nem[data-emoji=\":flag_az:\"]::before,\nem[data-emoji=\"flag_az\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ff.svg\");\n}\nem[data-emoji=\":flag_bs:\"]::before,\nem[data-emoji=\"flag_bs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f8.svg\");\n}\nem[data-emoji=\":flag_bh:\"]::before,\nem[data-emoji=\"flag_bh\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ed.svg\");\n}\nem[data-emoji=\":flag_bd:\"]::before,\nem[data-emoji=\"flag_bd\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e9.svg\");\n}\nem[data-emoji=\":flag_bb:\"]::before,\nem[data-emoji=\"flag_bb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e7.svg\");\n}\nem[data-emoji=\":flag_by:\"]::before,\nem[data-emoji=\"flag_by\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fe.svg\");\n}\nem[data-emoji=\":flag_be:\"]::before,\nem[data-emoji=\"flag_be\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ea.svg\");\n}\nem[data-emoji=\":flag_bz:\"]::before,\nem[data-emoji=\"flag_bz\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ff.svg\");\n}\nem[data-emoji=\":flag_bj:\"]::before,\nem[data-emoji=\"flag_bj\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ef.svg\");\n}\nem[data-emoji=\":flag_bm:\"]::before,\nem[data-emoji=\"flag_bm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f2.svg\");\n}\nem[data-emoji=\":flag_bt:\"]::before,\nem[data-emoji=\"flag_bt\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f9.svg\");\n}\nem[data-emoji=\":flag_bo:\"]::before,\nem[data-emoji=\"flag_bo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f4.svg\");\n}\nem[data-emoji=\":flag_ba:\"]::before,\nem[data-emoji=\"flag_ba\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e6.svg\");\n}\nem[data-emoji=\":flag_bw:\"]::before,\nem[data-emoji=\"flag_bw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fc.svg\");\n}\nem[data-emoji=\":flag_br:\"]::before,\nem[data-emoji=\"flag_br\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f7.svg\");\n}\nem[data-emoji=\":flag_io:\"]::before,\nem[data-emoji=\"flag_io\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f4.svg\");\n}\nem[data-emoji=\":flag_vg:\"]::before,\nem[data-emoji=\"flag_vg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ec.svg\");\n}\nem[data-emoji=\":flag_bn:\"]::before,\nem[data-emoji=\"flag_bn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f3.svg\");\n}\nem[data-emoji=\":flag_bg:\"]::before,\nem[data-emoji=\"flag_bg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ec.svg\");\n}\nem[data-emoji=\":flag_bf:\"]::before,\nem[data-emoji=\"flag_bf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1eb.svg\");\n}\nem[data-emoji=\":flag_bi:\"]::before,\nem[data-emoji=\"flag_bi\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ee.svg\");\n}\nem[data-emoji=\":flag_kh:\"]::before,\nem[data-emoji=\"flag_kh\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ed.svg\");\n}\nem[data-emoji=\":flag_cm:\"]::before,\nem[data-emoji=\"flag_cm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f2.svg\");\n}\nem[data-emoji=\":flag_ca:\"]::before,\nem[data-emoji=\"flag_ca\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e6.svg\");\n}\nem[data-emoji=\":flag_ic:\"]::before,\nem[data-emoji=\"flag_ic\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1e8.svg\");\n}\nem[data-emoji=\":flag_cv:\"]::before,\nem[data-emoji=\"flag_cv\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fb.svg\");\n}\nem[data-emoji=\":flag_bq:\"]::before,\nem[data-emoji=\"flag_bq\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f6.svg\");\n}\nem[data-emoji=\":flag_ky:\"]::before,\nem[data-emoji=\"flag_ky\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1fe.svg\");\n}\nem[data-emoji=\":flag_cf:\"]::before,\nem[data-emoji=\"flag_cf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1eb.svg\");\n}\nem[data-emoji=\":flag_td:\"]::before,\nem[data-emoji=\"flag_td\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e9.svg\");\n}\nem[data-emoji=\":flag_cl:\"]::before,\nem[data-emoji=\"flag_cl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f1.svg\");\n}\nem[data-emoji=\":flag_cn:\"]::before,\nem[data-emoji=\"flag_cn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f3.svg\");\n}\nem[data-emoji=\":flag_cx:\"]::before,\nem[data-emoji=\"flag_cx\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fd.svg\");\n}\nem[data-emoji=\":flag_cc:\"]::before,\nem[data-emoji=\"flag_cc\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e8.svg\");\n}\nem[data-emoji=\":flag_co:\"]::before,\nem[data-emoji=\"flag_co\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f4.svg\");\n}\nem[data-emoji=\":flag_km:\"]::before,\nem[data-emoji=\"flag_km\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f2.svg\");\n}\nem[data-emoji=\":flag_cg:\"]::before,\nem[data-emoji=\"flag_cg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ec.svg\");\n}\nem[data-emoji=\":flag_cd:\"]::before,\nem[data-emoji=\"flag_cd\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e9.svg\");\n}\nem[data-emoji=\":flag_ck:\"]::before,\nem[data-emoji=\"flag_ck\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f0.svg\");\n}\nem[data-emoji=\":flag_cr:\"]::before,\nem[data-emoji=\"flag_cr\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f7.svg\");\n}\nem[data-emoji=\":flag_ci:\"]::before,\nem[data-emoji=\"flag_ci\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ee.svg\");\n}\nem[data-emoji=\":flag_hr:\"]::before,\nem[data-emoji=\"flag_hr\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f7.svg\");\n}\nem[data-emoji=\":flag_cu:\"]::before,\nem[data-emoji=\"flag_cu\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fa.svg\");\n}\nem[data-emoji=\":flag_cw:\"]::before,\nem[data-emoji=\"flag_cw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fc.svg\");\n}\nem[data-emoji=\":flag_cy:\"]::before,\nem[data-emoji=\"flag_cy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fe.svg\");\n}\nem[data-emoji=\":flag_cz:\"]::before,\nem[data-emoji=\"flag_cz\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ff.svg\");\n}\nem[data-emoji=\":flag_dk:\"]::before,\nem[data-emoji=\"flag_dk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f0.svg\");\n}\nem[data-emoji=\":flag_dj:\"]::before,\nem[data-emoji=\"flag_dj\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ef.svg\");\n}\nem[data-emoji=\":flag_dm:\"]::before,\nem[data-emoji=\"flag_dm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f2.svg\");\n}\nem[data-emoji=\":flag_do:\"]::before,\nem[data-emoji=\"flag_do\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f4.svg\");\n}\nem[data-emoji=\":flag_ec:\"]::before,\nem[data-emoji=\"flag_ec\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1e8.svg\");\n}\nem[data-emoji=\":flag_eg:\"]::before,\nem[data-emoji=\"flag_eg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ec.svg\");\n}\nem[data-emoji=\":flag_sv:\"]::before,\nem[data-emoji=\"flag_sv\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fb.svg\");\n}\nem[data-emoji=\":flag_gq:\"]::before,\nem[data-emoji=\"flag_gq\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f6.svg\");\n}\nem[data-emoji=\":flag_er:\"]::before,\nem[data-emoji=\"flag_er\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f7.svg\");\n}\nem[data-emoji=\":flag_ee:\"]::before,\nem[data-emoji=\"flag_ee\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ea.svg\");\n}\nem[data-emoji=\":flag_et:\"]::before,\nem[data-emoji=\"flag_et\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f9.svg\");\n}\nem[data-emoji=\":flag_eu:\"]::before,\nem[data-emoji=\"flag_eu\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1fa.svg\");\n}\nem[data-emoji=\":flag_fk:\"]::before,\nem[data-emoji=\"flag_fk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f0.svg\");\n}\nem[data-emoji=\":flag_fo:\"]::before,\nem[data-emoji=\"flag_fo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f4.svg\");\n}\nem[data-emoji=\":flag_fj:\"]::before,\nem[data-emoji=\"flag_fj\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1ef.svg\");\n}\nem[data-emoji=\":flag_fi:\"]::before,\nem[data-emoji=\"flag_fi\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1ee.svg\");\n}\nem[data-emoji=\":flag_fr:\"]::before,\nem[data-emoji=\"flag_fr\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f7.svg\");\n}\nem[data-emoji=\":flag_gf:\"]::before,\nem[data-emoji=\"flag_gf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1eb.svg\");\n}\nem[data-emoji=\":flag_pf:\"]::before,\nem[data-emoji=\"flag_pf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1eb.svg\");\n}\nem[data-emoji=\":flag_tf:\"]::before,\nem[data-emoji=\"flag_tf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1eb.svg\");\n}\nem[data-emoji=\":flag_ga:\"]::before,\nem[data-emoji=\"flag_ga\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e6.svg\");\n}\nem[data-emoji=\":flag_gm:\"]::before,\nem[data-emoji=\"flag_gm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f2.svg\");\n}\nem[data-emoji=\":flag_ge:\"]::before,\nem[data-emoji=\"flag_ge\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ea.svg\");\n}\nem[data-emoji=\":flag_de:\"]::before,\nem[data-emoji=\"flag_de\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ea.svg\");\n}\nem[data-emoji=\":flag_gh:\"]::before,\nem[data-emoji=\"flag_gh\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ed.svg\");\n}\nem[data-emoji=\":flag_gi:\"]::before,\nem[data-emoji=\"flag_gi\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ee.svg\");\n}\nem[data-emoji=\":flag_gr:\"]::before,\nem[data-emoji=\"flag_gr\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f7.svg\");\n}\nem[data-emoji=\":flag_gl:\"]::before,\nem[data-emoji=\"flag_gl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f1.svg\");\n}\nem[data-emoji=\":flag_gd:\"]::before,\nem[data-emoji=\"flag_gd\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e9.svg\");\n}\nem[data-emoji=\":flag_gp:\"]::before,\nem[data-emoji=\"flag_gp\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f5.svg\");\n}\nem[data-emoji=\":flag_gu:\"]::before,\nem[data-emoji=\"flag_gu\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fa.svg\");\n}\nem[data-emoji=\":flag_gt:\"]::before,\nem[data-emoji=\"flag_gt\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f9.svg\");\n}\nem[data-emoji=\":flag_gg:\"]::before,\nem[data-emoji=\"flag_gg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ec.svg\");\n}\nem[data-emoji=\":flag_gn:\"]::before,\nem[data-emoji=\"flag_gn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f3.svg\");\n}\nem[data-emoji=\":flag_gw:\"]::before,\nem[data-emoji=\"flag_gw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fc.svg\");\n}\nem[data-emoji=\":flag_gy:\"]::before,\nem[data-emoji=\"flag_gy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fe.svg\");\n}\nem[data-emoji=\":flag_ht:\"]::before,\nem[data-emoji=\"flag_ht\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f9.svg\");\n}\nem[data-emoji=\":flag_hn:\"]::before,\nem[data-emoji=\"flag_hn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f3.svg\");\n}\nem[data-emoji=\":flag_hk:\"]::before,\nem[data-emoji=\"flag_hk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f0.svg\");\n}\nem[data-emoji=\":flag_hu:\"]::before,\nem[data-emoji=\"flag_hu\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1fa.svg\");\n}\nem[data-emoji=\":flag_is:\"]::before,\nem[data-emoji=\"flag_is\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f8.svg\");\n}\nem[data-emoji=\":flag_in:\"]::before,\nem[data-emoji=\"flag_in\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f3.svg\");\n}\nem[data-emoji=\":flag_id:\"]::before,\nem[data-emoji=\"flag_id\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1e9.svg\");\n}\nem[data-emoji=\":flag_ir:\"]::before,\nem[data-emoji=\"flag_ir\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f7.svg\");\n}\nem[data-emoji=\":flag_iq:\"]::before,\nem[data-emoji=\"flag_iq\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f6.svg\");\n}\nem[data-emoji=\":flag_ie:\"]::before,\nem[data-emoji=\"flag_ie\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1ea.svg\");\n}\nem[data-emoji=\":flag_im:\"]::before,\nem[data-emoji=\"flag_im\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f2.svg\");\n}\nem[data-emoji=\":flag_il:\"]::before,\nem[data-emoji=\"flag_il\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f1.svg\");\n}\nem[data-emoji=\":flag_it:\"]::before,\nem[data-emoji=\"flag_it\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f9.svg\");\n}\nem[data-emoji=\":flag_jm:\"]::before,\nem[data-emoji=\"flag_jm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f2.svg\");\n}\nem[data-emoji=\":flag_jp:\"]::before,\nem[data-emoji=\"flag_jp\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f5.svg\");\n}\nem[data-emoji=\":crossed_flags:\"]::before,\nem[data-emoji=\"crossed_flags\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38c.svg\");\n}\nem[data-emoji=\":flag_je:\"]::before,\nem[data-emoji=\"flag_je\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1ea.svg\");\n}\nem[data-emoji=\":flag_jo:\"]::before,\nem[data-emoji=\"flag_jo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f4.svg\");\n}\nem[data-emoji=\":flag_kz:\"]::before,\nem[data-emoji=\"flag_kz\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ff.svg\");\n}\nem[data-emoji=\":flag_ke:\"]::before,\nem[data-emoji=\"flag_ke\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ea.svg\");\n}\nem[data-emoji=\":flag_ki:\"]::before,\nem[data-emoji=\"flag_ki\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ee.svg\");\n}\nem[data-emoji=\":flag_xk:\"]::before,\nem[data-emoji=\"flag_xk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fd-1f1f0.svg\");\n}\nem[data-emoji=\":flag_kw:\"]::before,\nem[data-emoji=\"flag_kw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1fc.svg\");\n}\nem[data-emoji=\":flag_kg:\"]::before,\nem[data-emoji=\"flag_kg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ec.svg\");\n}\nem[data-emoji=\":flag_la:\"]::before,\nem[data-emoji=\"flag_la\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e6.svg\");\n}\nem[data-emoji=\":flag_lv:\"]::before,\nem[data-emoji=\"flag_lv\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fb.svg\");\n}\nem[data-emoji=\":flag_lb:\"]::before,\nem[data-emoji=\"flag_lb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e7.svg\");\n}\nem[data-emoji=\":flag_ls:\"]::before,\nem[data-emoji=\"flag_ls\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f8.svg\");\n}\nem[data-emoji=\":flag_lr:\"]::before,\nem[data-emoji=\"flag_lr\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f7.svg\");\n}\nem[data-emoji=\":flag_ly:\"]::before,\nem[data-emoji=\"flag_ly\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fe.svg\");\n}\nem[data-emoji=\":flag_li:\"]::before,\nem[data-emoji=\"flag_li\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1ee.svg\");\n}\nem[data-emoji=\":flag_lt:\"]::before,\nem[data-emoji=\"flag_lt\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f9.svg\");\n}\nem[data-emoji=\":flag_lu:\"]::before,\nem[data-emoji=\"flag_lu\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fa.svg\");\n}\nem[data-emoji=\":flag_mo:\"]::before,\nem[data-emoji=\"flag_mo\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f4.svg\");\n}\nem[data-emoji=\":flag_mk:\"]::before,\nem[data-emoji=\"flag_mk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f0.svg\");\n}\nem[data-emoji=\":flag_mg:\"]::before,\nem[data-emoji=\"flag_mg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ec.svg\");\n}\nem[data-emoji=\":flag_mw:\"]::before,\nem[data-emoji=\"flag_mw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fc.svg\");\n}\nem[data-emoji=\":flag_my:\"]::before,\nem[data-emoji=\"flag_my\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fe.svg\");\n}\nem[data-emoji=\":flag_mv:\"]::before,\nem[data-emoji=\"flag_mv\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fb.svg\");\n}\nem[data-emoji=\":flag_ml:\"]::before,\nem[data-emoji=\"flag_ml\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f1.svg\");\n}\nem[data-emoji=\":flag_mt:\"]::before,\nem[data-emoji=\"flag_mt\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f9.svg\");\n}\nem[data-emoji=\":flag_mh:\"]::before,\nem[data-emoji=\"flag_mh\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ed.svg\");\n}\nem[data-emoji=\":flag_mq:\"]::before,\nem[data-emoji=\"flag_mq\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f6.svg\");\n}\nem[data-emoji=\":flag_mr:\"]::before,\nem[data-emoji=\"flag_mr\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f7.svg\");\n}\nem[data-emoji=\":flag_mu:\"]::before,\nem[data-emoji=\"flag_mu\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fa.svg\");\n}\nem[data-emoji=\":flag_yt:\"]::before,\nem[data-emoji=\"flag_yt\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fe-1f1f9.svg\");\n}\nem[data-emoji=\":flag_mx:\"]::before,\nem[data-emoji=\"flag_mx\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fd.svg\");\n}\nem[data-emoji=\":flag_fm:\"]::before,\nem[data-emoji=\"flag_fm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f2.svg\");\n}\nem[data-emoji=\":flag_md:\"]::before,\nem[data-emoji=\"flag_md\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e9.svg\");\n}\nem[data-emoji=\":flag_mc:\"]::before,\nem[data-emoji=\"flag_mc\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e8.svg\");\n}\nem[data-emoji=\":flag_mn:\"]::before,\nem[data-emoji=\"flag_mn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f3.svg\");\n}\nem[data-emoji=\":flag_me:\"]::before,\nem[data-emoji=\"flag_me\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ea.svg\");\n}\nem[data-emoji=\":flag_ms:\"]::before,\nem[data-emoji=\"flag_ms\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f8.svg\");\n}\nem[data-emoji=\":flag_ma:\"]::before,\nem[data-emoji=\"flag_ma\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e6.svg\");\n}\nem[data-emoji=\":flag_mz:\"]::before,\nem[data-emoji=\"flag_mz\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ff.svg\");\n}\nem[data-emoji=\":flag_mm:\"]::before,\nem[data-emoji=\"flag_mm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f2.svg\");\n}\nem[data-emoji=\":flag_na:\"]::before,\nem[data-emoji=\"flag_na\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1e6.svg\");\n}\nem[data-emoji=\":flag_nr:\"]::before,\nem[data-emoji=\"flag_nr\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f7.svg\");\n}\nem[data-emoji=\":flag_np:\"]::before,\nem[data-emoji=\"flag_np\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f5.svg\");\n}\nem[data-emoji=\":flag_nl:\"]::before,\nem[data-emoji=\"flag_nl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f1.svg\");\n}\nem[data-emoji=\":flag_nc:\"]::before,\nem[data-emoji=\"flag_nc\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1e8.svg\");\n}\nem[data-emoji=\":flag_nz:\"]::before,\nem[data-emoji=\"flag_nz\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ff.svg\");\n}\nem[data-emoji=\":flag_ni:\"]::before,\nem[data-emoji=\"flag_ni\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ee.svg\");\n}\nem[data-emoji=\":flag_ne:\"]::before,\nem[data-emoji=\"flag_ne\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ea.svg\");\n}\nem[data-emoji=\":flag_ng:\"]::before,\nem[data-emoji=\"flag_ng\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ec.svg\");\n}\nem[data-emoji=\":flag_nu:\"]::before,\nem[data-emoji=\"flag_nu\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1fa.svg\");\n}\nem[data-emoji=\":flag_nf:\"]::before,\nem[data-emoji=\"flag_nf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1eb.svg\");\n}\nem[data-emoji=\":flag_kp:\"]::before,\nem[data-emoji=\"flag_kp\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f5.svg\");\n}\nem[data-emoji=\":flag_mp:\"]::before,\nem[data-emoji=\"flag_mp\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f5.svg\");\n}\nem[data-emoji=\":flag_no:\"]::before,\nem[data-emoji=\"flag_no\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f4.svg\");\n}\nem[data-emoji=\":flag_om:\"]::before,\nem[data-emoji=\"flag_om\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f4-1f1f2.svg\");\n}\nem[data-emoji=\":flag_pk:\"]::before,\nem[data-emoji=\"flag_pk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f0.svg\");\n}\nem[data-emoji=\":flag_pw:\"]::before,\nem[data-emoji=\"flag_pw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1fc.svg\");\n}\nem[data-emoji=\":flag_ps:\"]::before,\nem[data-emoji=\"flag_ps\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f8.svg\");\n}\nem[data-emoji=\":flag_pa:\"]::before,\nem[data-emoji=\"flag_pa\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1e6.svg\");\n}\nem[data-emoji=\":flag_pg:\"]::before,\nem[data-emoji=\"flag_pg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ec.svg\");\n}\nem[data-emoji=\":flag_py:\"]::before,\nem[data-emoji=\"flag_py\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1fe.svg\");\n}\nem[data-emoji=\":flag_pe:\"]::before,\nem[data-emoji=\"flag_pe\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ea.svg\");\n}\nem[data-emoji=\":flag_ph:\"]::before,\nem[data-emoji=\"flag_ph\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ed.svg\");\n}\nem[data-emoji=\":flag_pn:\"]::before,\nem[data-emoji=\"flag_pn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f3.svg\");\n}\nem[data-emoji=\":flag_pl:\"]::before,\nem[data-emoji=\"flag_pl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f1.svg\");\n}\nem[data-emoji=\":flag_pt:\"]::before,\nem[data-emoji=\"flag_pt\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f9.svg\");\n}\nem[data-emoji=\":flag_pr:\"]::before,\nem[data-emoji=\"flag_pr\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f7.svg\");\n}\nem[data-emoji=\":flag_qa:\"]::before,\nem[data-emoji=\"flag_qa\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f6-1f1e6.svg\");\n}\nem[data-emoji=\":flag_re:\"]::before,\nem[data-emoji=\"flag_re\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1ea.svg\");\n}\nem[data-emoji=\":flag_ro:\"]::before,\nem[data-emoji=\"flag_ro\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1f4.svg\");\n}\nem[data-emoji=\":flag_ru:\"]::before,\nem[data-emoji=\"flag_ru\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1fa.svg\");\n}\nem[data-emoji=\":flag_rw:\"]::before,\nem[data-emoji=\"flag_rw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1fc.svg\");\n}\nem[data-emoji=\":flag_ws:\"]::before,\nem[data-emoji=\"flag_ws\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fc-1f1f8.svg\");\n}\nem[data-emoji=\":flag_sm:\"]::before,\nem[data-emoji=\"flag_sm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f2.svg\");\n}\nem[data-emoji=\":flag_st:\"]::before,\nem[data-emoji=\"flag_st\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f9.svg\");\n}\nem[data-emoji=\":flag_sa:\"]::before,\nem[data-emoji=\"flag_sa\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e6.svg\");\n}\nem[data-emoji=\":flag_sn:\"]::before,\nem[data-emoji=\"flag_sn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f3.svg\");\n}\nem[data-emoji=\":flag_rs:\"]::before,\nem[data-emoji=\"flag_rs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1f8.svg\");\n}\nem[data-emoji=\":flag_sc:\"]::before,\nem[data-emoji=\"flag_sc\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e8.svg\");\n}\nem[data-emoji=\":flag_sl:\"]::before,\nem[data-emoji=\"flag_sl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f1.svg\");\n}\nem[data-emoji=\":flag_sg:\"]::before,\nem[data-emoji=\"flag_sg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ec.svg\");\n}\nem[data-emoji=\":flag_sx:\"]::before,\nem[data-emoji=\"flag_sx\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fd.svg\");\n}\nem[data-emoji=\":flag_sk:\"]::before,\nem[data-emoji=\"flag_sk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f0.svg\");\n}\nem[data-emoji=\":flag_si:\"]::before,\nem[data-emoji=\"flag_si\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ee.svg\");\n}\nem[data-emoji=\":flag_gs:\"]::before,\nem[data-emoji=\"flag_gs\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f8.svg\");\n}\nem[data-emoji=\":flag_sb:\"]::before,\nem[data-emoji=\"flag_sb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e7.svg\");\n}\nem[data-emoji=\":flag_so:\"]::before,\nem[data-emoji=\"flag_so\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f4.svg\");\n}\nem[data-emoji=\":flag_za:\"]::before,\nem[data-emoji=\"flag_za\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1e6.svg\");\n}\nem[data-emoji=\":flag_kr:\"]::before,\nem[data-emoji=\"flag_kr\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f7.svg\");\n}\nem[data-emoji=\":flag_ss:\"]::before,\nem[data-emoji=\"flag_ss\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f8.svg\");\n}\nem[data-emoji=\":flag_es:\"]::before,\nem[data-emoji=\"flag_es\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f8.svg\");\n}\nem[data-emoji=\":flag_lk:\"]::before,\nem[data-emoji=\"flag_lk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f0.svg\");\n}\nem[data-emoji=\":flag_bl:\"]::before,\nem[data-emoji=\"flag_bl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f1.svg\");\n}\nem[data-emoji=\":flag_sh:\"]::before,\nem[data-emoji=\"flag_sh\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ed.svg\");\n}\nem[data-emoji=\":flag_kn:\"]::before,\nem[data-emoji=\"flag_kn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f3.svg\");\n}\nem[data-emoji=\":flag_lc:\"]::before,\nem[data-emoji=\"flag_lc\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e8.svg\");\n}\nem[data-emoji=\":flag_pm:\"]::before,\nem[data-emoji=\"flag_pm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f2.svg\");\n}\nem[data-emoji=\":flag_vc:\"]::before,\nem[data-emoji=\"flag_vc\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1e8.svg\");\n}\nem[data-emoji=\":flag_sd:\"]::before,\nem[data-emoji=\"flag_sd\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e9.svg\");\n}\nem[data-emoji=\":flag_sr:\"]::before,\nem[data-emoji=\"flag_sr\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f7.svg\");\n}\nem[data-emoji=\":flag_sz:\"]::before,\nem[data-emoji=\"flag_sz\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ff.svg\");\n}\nem[data-emoji=\":flag_se:\"]::before,\nem[data-emoji=\"flag_se\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ea.svg\");\n}\nem[data-emoji=\":flag_ch:\"]::before,\nem[data-emoji=\"flag_ch\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ed.svg\");\n}\nem[data-emoji=\":flag_sy:\"]::before,\nem[data-emoji=\"flag_sy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fe.svg\");\n}\nem[data-emoji=\":flag_tw:\"]::before,\nem[data-emoji=\"flag_tw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1fc.svg\");\n}\nem[data-emoji=\":flag_tj:\"]::before,\nem[data-emoji=\"flag_tj\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ef.svg\");\n}\nem[data-emoji=\":flag_tz:\"]::before,\nem[data-emoji=\"flag_tz\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ff.svg\");\n}\nem[data-emoji=\":flag_th:\"]::before,\nem[data-emoji=\"flag_th\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ed.svg\");\n}\nem[data-emoji=\":flag_tl:\"]::before,\nem[data-emoji=\"flag_tl\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f1.svg\");\n}\nem[data-emoji=\":flag_tg:\"]::before,\nem[data-emoji=\"flag_tg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ec.svg\");\n}\nem[data-emoji=\":flag_tk:\"]::before,\nem[data-emoji=\"flag_tk\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f0.svg\");\n}\nem[data-emoji=\":flag_to:\"]::before,\nem[data-emoji=\"flag_to\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f4.svg\");\n}\nem[data-emoji=\":flag_tt:\"]::before,\nem[data-emoji=\"flag_tt\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f9.svg\");\n}\nem[data-emoji=\":flag_tn:\"]::before,\nem[data-emoji=\"flag_tn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f3.svg\");\n}\nem[data-emoji=\":flag_tr:\"]::before,\nem[data-emoji=\"flag_tr\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f7.svg\");\n}\nem[data-emoji=\":flag_tm:\"]::before,\nem[data-emoji=\"flag_tm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f2.svg\");\n}\nem[data-emoji=\":flag_tc:\"]::before,\nem[data-emoji=\"flag_tc\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e8.svg\");\n}\nem[data-emoji=\":flag_vi:\"]::before,\nem[data-emoji=\"flag_vi\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ee.svg\");\n}\nem[data-emoji=\":flag_tv:\"]::before,\nem[data-emoji=\"flag_tv\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1fb.svg\");\n}\nem[data-emoji=\":flag_ug:\"]::before,\nem[data-emoji=\"flag_ug\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1ec.svg\");\n}\nem[data-emoji=\":flag_ua:\"]::before,\nem[data-emoji=\"flag_ua\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1e6.svg\");\n}\nem[data-emoji=\":flag_ae:\"]::before,\nem[data-emoji=\"flag_ae\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ea.svg\");\n}\nem[data-emoji=\":flag_gb:\"]::before,\nem[data-emoji=\"flag_gb\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e7.svg\");\n}\nem[data-emoji=\":england:\"]::before,\nem[data-emoji=\"england\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.svg\");\n}\nem[data-emoji=\":scotland:\"]::before,\nem[data-emoji=\"scotland\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.svg\");\n}\nem[data-emoji=\":wales:\"]::before,\nem[data-emoji=\"wales\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg\");\n}\nem[data-emoji=\":flag_us:\"]::before,\nem[data-emoji=\"flag_us\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f8.svg\");\n}\nem[data-emoji=\":flag_uy:\"]::before,\nem[data-emoji=\"flag_uy\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1fe.svg\");\n}\nem[data-emoji=\":flag_uz:\"]::before,\nem[data-emoji=\"flag_uz\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1ff.svg\");\n}\nem[data-emoji=\":flag_vu:\"]::before,\nem[data-emoji=\"flag_vu\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1fa.svg\");\n}\nem[data-emoji=\":flag_va:\"]::before,\nem[data-emoji=\"flag_va\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1e6.svg\");\n}\nem[data-emoji=\":flag_ve:\"]::before,\nem[data-emoji=\"flag_ve\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ea.svg\");\n}\nem[data-emoji=\":flag_vn:\"]::before,\nem[data-emoji=\"flag_vn\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1f3.svg\");\n}\nem[data-emoji=\":flag_wf:\"]::before,\nem[data-emoji=\"flag_wf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fc-1f1eb.svg\");\n}\nem[data-emoji=\":flag_eh:\"]::before,\nem[data-emoji=\"flag_eh\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ed.svg\");\n}\nem[data-emoji=\":flag_ye:\"]::before,\nem[data-emoji=\"flag_ye\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fe-1f1ea.svg\");\n}\nem[data-emoji=\":flag_zm:\"]::before,\nem[data-emoji=\"flag_zm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1f2.svg\");\n}\nem[data-emoji=\":flag_zw:\"]::before,\nem[data-emoji=\"flag_zw\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1fc.svg\");\n}\nem[data-emoji=\":flag_ac:\"]::before,\nem[data-emoji=\"flag_ac\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1e8.svg\");\n}\nem[data-emoji=\":flag_bv:\"]::before,\nem[data-emoji=\"flag_bv\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fb.svg\");\n}\nem[data-emoji=\":flag_cp:\"]::before,\nem[data-emoji=\"flag_cp\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f5.svg\");\n}\nem[data-emoji=\":flag_ea:\"]::before,\nem[data-emoji=\"flag_ea\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1e6.svg\");\n}\nem[data-emoji=\":flag_dg:\"]::before,\nem[data-emoji=\"flag_dg\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ec.svg\");\n}\nem[data-emoji=\":flag_hm:\"]::before,\nem[data-emoji=\"flag_hm\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f2.svg\");\n}\nem[data-emoji=\":flag_mf:\"]::before,\nem[data-emoji=\"flag_mf\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1eb.svg\");\n}\nem[data-emoji=\":flag_sj:\"]::before,\nem[data-emoji=\"flag_sj\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ef.svg\");\n}\nem[data-emoji=\":flag_ta:\"]::before,\nem[data-emoji=\"flag_ta\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e6.svg\");\n}\nem[data-emoji=\":flag_um:\"]::before,\nem[data-emoji=\"flag_um\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f2.svg\");\n}\nem[data-emoji=\":tone1:\"]::before,\nem[data-emoji=\"tone1\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3fb.svg\");\n}\nem[data-emoji=\":tone2:\"]::before,\nem[data-emoji=\"tone2\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3fc.svg\");\n}\nem[data-emoji=\":tone3:\"]::before,\nem[data-emoji=\"tone3\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3fd.svg\");\n}\nem[data-emoji=\":tone4:\"]::before,\nem[data-emoji=\"tone4\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3fe.svg\");\n}\nem[data-emoji=\":tone5:\"]::before,\nem[data-emoji=\"tone5\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ff.svg\");\n}\nem[data-emoji=\":regional_indicator_z:\"]::before,\nem[data-emoji=\"regional_indicator_z\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff.svg\");\n}\nem[data-emoji=\":regional_indicator_y:\"]::before,\nem[data-emoji=\"regional_indicator_y\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fe.svg\");\n}\nem[data-emoji=\":regional_indicator_x:\"]::before,\nem[data-emoji=\"regional_indicator_x\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fd.svg\");\n}\nem[data-emoji=\":regional_indicator_w:\"]::before,\nem[data-emoji=\"regional_indicator_w\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fc.svg\");\n}\nem[data-emoji=\":regional_indicator_v:\"]::before,\nem[data-emoji=\"regional_indicator_v\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb.svg\");\n}\nem[data-emoji=\":regional_indicator_u:\"]::before,\nem[data-emoji=\"regional_indicator_u\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa.svg\");\n}\nem[data-emoji=\":regional_indicator_t:\"]::before,\nem[data-emoji=\"regional_indicator_t\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9.svg\");\n}\nem[data-emoji=\":regional_indicator_s:\"]::before,\nem[data-emoji=\"regional_indicator_s\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8.svg\");\n}\nem[data-emoji=\":regional_indicator_r:\"]::before,\nem[data-emoji=\"regional_indicator_r\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7.svg\");\n}\nem[data-emoji=\":regional_indicator_q:\"]::before,\nem[data-emoji=\"regional_indicator_q\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f6.svg\");\n}\nem[data-emoji=\":regional_indicator_p:\"]::before,\nem[data-emoji=\"regional_indicator_p\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5.svg\");\n}\nem[data-emoji=\":regional_indicator_o:\"]::before,\nem[data-emoji=\"regional_indicator_o\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f4.svg\");\n}\nem[data-emoji=\":regional_indicator_n:\"]::before,\nem[data-emoji=\"regional_indicator_n\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3.svg\");\n}\nem[data-emoji=\":regional_indicator_m:\"]::before,\nem[data-emoji=\"regional_indicator_m\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2.svg\");\n}\nem[data-emoji=\":regional_indicator_l:\"]::before,\nem[data-emoji=\"regional_indicator_l\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1.svg\");\n}\nem[data-emoji=\":regional_indicator_k:\"]::before,\nem[data-emoji=\"regional_indicator_k\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0.svg\");\n}\nem[data-emoji=\":regional_indicator_j:\"]::before,\nem[data-emoji=\"regional_indicator_j\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef.svg\");\n}\nem[data-emoji=\":regional_indicator_i:\"]::before,\nem[data-emoji=\"regional_indicator_i\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee.svg\");\n}\nem[data-emoji=\":regional_indicator_h:\"]::before,\nem[data-emoji=\"regional_indicator_h\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed.svg\");\n}\nem[data-emoji=\":regional_indicator_g:\"]::before,\nem[data-emoji=\"regional_indicator_g\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec.svg\");\n}\nem[data-emoji=\":regional_indicator_f:\"]::before,\nem[data-emoji=\"regional_indicator_f\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb.svg\");\n}\nem[data-emoji=\":regional_indicator_e:\"]::before,\nem[data-emoji=\"regional_indicator_e\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea.svg\");\n}\nem[data-emoji=\":regional_indicator_d:\"]::before,\nem[data-emoji=\"regional_indicator_d\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9.svg\");\n}\nem[data-emoji=\":regional_indicator_c:\"]::before,\nem[data-emoji=\"regional_indicator_c\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8.svg\");\n}\nem[data-emoji=\":regional_indicator_b:\"]::before,\nem[data-emoji=\"regional_indicator_b\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7.svg\");\n}\nem[data-emoji=\":regional_indicator_a:\"]::before,\nem[data-emoji=\"regional_indicator_a\"]::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6.svg\");\n}\n\n/* rtl:end:ignore */\n\n\n/*******************************\n             Emojis\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/feed.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Feed\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n         Activity Feed\n*******************************/\n\n.ui.feed {\n  margin: 1em 0;\n}\n.ui.feed:first-child {\n  margin-top: 0;\n}\n.ui.feed:last-child {\n  margin-bottom: 0;\n}\n\n\n/*******************************\n            Content\n*******************************/\n\n\n/* Event */\n.ui.feed > .event {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  padding: 0.21428571rem 0;\n  margin: 0;\n  background: none;\n}\n.ui.feed > .event:not(:first-child) {\n  border-top: none;\n}\n.ui.feed:not(.connected) > .event:first-child {\n  padding-top: 0;\n}\n.ui.feed > .event:last-child {\n  padding-bottom: 0;\n}\n\n/* Event Label */\n.ui.feed > .event > .label {\n  display: block;\n  flex: 0 0 auto;\n  width: 2.5em;\n  height: auto;\n  align-self: stretch;\n  text-align: left;\n}\n.ui.feed > .event > .label .icon {\n  opacity: 1;\n  font-size: 1.5em;\n  width: 100%;\n  padding: 0.25em;\n  background: none;\n  border: none;\n  border-radius: 0;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.feed > .event > .label img {\n  width: 100%;\n  height: auto;\n  border-radius: 500rem;\n}\n.ui.feed > .event > .label > .text {\n  display: block;\n  text-align: center;\n  margin-top: 0.5em;\n}\n.ui.feed > .event > .label > .text.ui {\n  margin-top: 0.65em;\n}\n.ui.feed > .event > .label > .text.multiline {\n  margin-top: 0;\n}\n.ui.feed > .event > .label > .text.multiline.ui {\n  margin-top: 0.3em;\n}\n.ui.feed > .event > .label > .ui.label {\n  margin-top: 0.4em;\n  position: relative;\n  z-index: 1;\n}\n.ui.feed > .event > .label + .content {\n  margin: 0.5em 0 0.35714286em 1.14285714em;\n}\n\n/* --------------\n     Content\n--------------- */\n\n/* Content */\n.ui.feed > .event > .content {\n  display: block;\n  flex: 1 1 auto;\n  align-self: stretch;\n  text-align: left;\n  word-wrap: break-word;\n}\n.ui.feed > .event:last-child > .content {\n  padding-bottom: 0;\n}\n\n/* Link */\n.ui.feed > .event > .content a {\n  cursor: pointer;\n}\n\n/* --------------\n          Date\n    --------------- */\n.ui.feed > .event > .content .date {\n  margin: -0.5rem 0 0;\n  padding: 0;\n  color: rgba(0, 0, 0, 0.4);\n  font-weight: normal;\n  font-size: 1em;\n  font-style: normal;\n}\n\n/* --------------\n         Summary\n    --------------- */\n.ui.feed > .event > .content .summary {\n  margin: 0;\n  font-size: 1em;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* Summary Image */\n.ui.feed > .event > .content .summary img {\n  display: inline-block;\n  width: auto;\n  height: 10em;\n  margin: -0.25em 0.25em 0 0;\n  border-radius: 0.25em;\n  vertical-align: middle;\n}\n\n/* --------------\n           Inline Date\n        --------------- */\n\n/* Date inside Summary */\n.ui.feed > .event > .content .summary > .date {\n  display: inline-block;\n  font-weight: normal;\n  font-size: 0.85714286em;\n  font-style: normal;\n  margin: 0 0 0 0.5em;\n  padding: 0;\n  color: rgba(0, 0, 0, 0.4);\n}\n.ui.feed > .event > .content .summary > .date:not(.floated) {\n  float: none;\n}\n\n/* --------------\n          User\n    --------------- */\n.ui.feed > .event > .content .user {\n  display: inline-block;\n  font-weight: bold;\n  margin-right: 0;\n  vertical-align: baseline;\n}\n.ui.feed > .event > .content .user img {\n  margin: -0.25em 0.25em 0 0;\n  width: auto;\n  height: 10em;\n  vertical-align: middle;\n}\n\n/* --------------\n      Extra Summary\n    --------------- */\n.ui.feed > .event > .content .extra {\n  margin: 0.5em 0 0;\n  background: none;\n  padding: 0;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* Images */\n.ui.feed > .event > .content .extra.images img {\n  display: inline-block;\n  margin: 0 0.25em 0 0;\n  width: 6em;\n}\n\n/* Text */\n.ui.feed > .event > .content .extra.text {\n  padding: 0;\n  border-left: none;\n  font-size: 1em;\n  max-width: 500px;\n  line-height: 1.4285em;\n}\n\n/* --------------\n          Meta\n    --------------- */\n.ui.feed > .event > .content .meta {\n  display: inline-block;\n  font-size: 0.85714286em;\n  margin: 0.5em 0 0;\n  background: none;\n  border: none;\n  border-radius: 0;\n  box-shadow: none;\n  padding: 0;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.feed > .event > .content .meta > * {\n  position: relative;\n  margin-left: 0.75em;\n}\n.ui.feed > .event > .content .meta > *::after {\n  content: \"\";\n  color: rgba(0, 0, 0, 0.2);\n  top: 0;\n  left: -1em;\n  opacity: 1;\n  position: absolute;\n  vertical-align: top;\n}\n.ui.feed > .event > .content .meta .like {\n  color: \"\";\n  transition: 0.2s color ease;\n}\n.ui.feed > .event > .content .meta .like:hover i.icon {\n  color: #ff2733;\n}\n.ui.feed > .event > .content .meta .active.like i.icon {\n  color: #ef404a;\n}\n\n/* First element */\n.ui.feed > .event > .content .meta > :first-child {\n  margin-left: 0;\n}\n.ui.feed > .event > .content .meta > :first-child::after {\n  display: none;\n}\n\n/* Action */\n.ui.feed > .event > .content .meta a,\n.ui.feed > .event > .content .meta > i.icon {\n  cursor: pointer;\n  opacity: 1;\n  color: rgba(0, 0, 0, 0.5);\n  transition: color 0.1s ease;\n}\n.ui.feed > .event > .content .meta a:hover,\n.ui.feed > .event > .content .meta a:hover i.icon,\n.ui.feed > .event > .content .meta > i.icon:hover {\n  color: rgba(0, 0, 0, 0.95);\n}\n\n\n/*******************************\n            Variations\n*******************************/\n\n\n/* rtl:rename */\n.ui.feed .right.floated {\n  float: right;\n}\n.ui.connected.feed > .event {\n  position: relative;\n}\n.ui.connected.feed > .event:not(:last-child)::before {\n  border-left: 2px solid rgba(34, 36, 38, 0.15);\n  content: \"\";\n  left: 1.2em;\n  position: absolute;\n  top: 2.1em;\n  height: calc(100% - 1.5em);\n}\n.ui.connected.feed > .event > .label {\n  position: relative;\n}\n.ui.inverted.connected.feed > .event::before {\n  border-left-color: rgba(255, 255, 255, 0.1);\n}\n.ui.divided.feed > .event:not(:first-child) {\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.inverted.divided.feed > .event {\n  border-top-color: rgba(255, 255, 255, 0.1);\n}\n.ui.ui.feed > .event > .label[data-text]::before {\n  content: attr(data-text);\n}\n.ui.feed > .event > .label[data-text]::before,\n.ui.ordered.feed > .event > .label::before {\n  text-align: center;\n  line-height: 1;\n  height: 2.5em;\n  background: #bbbbbb;\n  color: #fff;\n  border-radius: 50%;\n  padding-top: 0.6em;\n  position: relative;\n  display: block;\n  margin-bottom: 0.3em;\n  border: 2px solid transparent;\n}\n.ui.ordered.feed {\n  counter-reset: ordered;\n}\n.ui.ordered.feed > .event > .label::before {\n  counter-increment: ordered;\n  content: counter(ordered);\n}\n.ui.ordered.basic.feed > .event > .label::before,\n.ui.ordered.feed > .event > .basic.label::before {\n  border-color: #bbbbbb;\n  color: inherit;\n  background: transparent;\n}\n.ui.ordered.connected.feed > .event::before {\n  top: 2.7em;\n  height: calc(100% - 2.5em);\n}\n\n/* workaround until all browsers support :has() */\n.ui.connected.labeled.feed > .event::before,\n.ui.connected.feed > .labeled.event::before {\n  top: 4.85em;\n  height: calc(100% - 4.6499999999999995em);\n}\n@supports selector(:has(.f)) {\n  .ui.connected.feed > .event:has(> .label[data-text] > *)::before,\n  .ui.ordered.connected.feed > .event:has(> .label > *)::before {\n    top: 4.85em;\n    height: calc(100% - 4.6499999999999995em);\n  }\n}\n.ui.feed {\n  font-size: 1rem;\n}\n.ui.mini.feed {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.feed {\n  font-size: 0.85714286rem;\n}\n.ui.small.feed {\n  font-size: 0.92857143rem;\n}\n.ui.large.feed {\n  font-size: 1.14285714rem;\n}\n.ui.big.feed {\n  font-size: 1.28571429rem;\n}\n.ui.huge.feed {\n  font-size: 1.42857143rem;\n}\n.ui.massive.feed {\n  font-size: 1.71428571rem;\n}\n\n/* ------------------\n          Inverted\n    ------------------- */\n.ui.inverted.feed > .event {\n  background: #1b1c1d;\n}\n.ui.inverted.feed > .event > .label i.icon {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.feed > .event > .label .text:not(.ui) {\n  color: #fff;\n}\n.ui.inverted.feed > .event > .content .date,\n.ui.inverted.feed > .event > .content .meta .like {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.feed > .event > .content .summary,\n.ui.inverted.feed > .event > .content .extra.text {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.feed > .event > .content .meta .like:hover {\n  color: #ffffff;\n}\n.ui.inverted.feed > .event > .content .meta .active.like i.icon {\n  color: rgba(255, 255, 255, 0.7);\n}\n\n/* Action */\n.ui.inverted.feed > .event > .content .meta a,\n.ui.inverted.feed > .event > .content .meta > i.icon {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.feed > .event > .content .meta a:hover,\n.ui.inverted.feed > .event > .content .meta a:hover i.icon,\n.ui.inverted.feed > .event > .content .meta > i.icon:hover {\n  color: #ffffff;\n}\n\n/* --------------\n     Colors\n--------------- */\n.ui.ui.feed > .event > .primary.label::before,\n.ui.primary.feed > .event > .label::before {\n  background: #2185d0;\n}\n.ui.primary.connected.feed > .event::before,\n.ui.connected.feed > .primary.event::before {\n  border-color: #2185d0;\n}\n.ui.inverted.primary.connected.feed > .event::before,\n.ui.connected.feed > .inverted.primary.event::before {\n  border-color: #54c8ff;\n}\n.ui.ui.feed > .event > .primary.basic.label::before,\n.ui.primary.basic.feed > .event > .label::before {\n  color: #2185d0;\n}\n.ui.feed > .event > .inverted.primary.label::before,\n.ui.inverted.primary.feed > .event > .label::before {\n  background: #54c8ff;\n}\n.ui.feed > .event > .inverted.primary.basic.label::before,\n.ui.inverted.primary.basic.feed > .event > .label::before {\n  color: #54c8ff;\n}\n.ui.ui.feed > .event > .secondary.label::before,\n.ui.secondary.feed > .event > .label::before {\n  background: #1b1c1d;\n}\n.ui.secondary.connected.feed > .event::before,\n.ui.connected.feed > .secondary.event::before {\n  border-color: #1b1c1d;\n}\n.ui.inverted.secondary.connected.feed > .event::before,\n.ui.connected.feed > .inverted.secondary.event::before {\n  border-color: #545454;\n}\n.ui.ui.feed > .event > .secondary.basic.label::before,\n.ui.secondary.basic.feed > .event > .label::before {\n  color: #1b1c1d;\n}\n.ui.feed > .event > .inverted.secondary.label::before,\n.ui.inverted.secondary.feed > .event > .label::before {\n  background: #545454;\n}\n.ui.feed > .event > .inverted.secondary.basic.label::before,\n.ui.inverted.secondary.basic.feed > .event > .label::before {\n  color: #545454;\n}\n.ui.ui.feed > .event > .red.label::before,\n.ui.red.feed > .event > .label::before {\n  background: #db2828;\n}\n.ui.red.connected.feed > .event::before,\n.ui.connected.feed > .red.event::before {\n  border-color: #db2828;\n}\n.ui.inverted.red.connected.feed > .event::before,\n.ui.connected.feed > .inverted.red.event::before {\n  border-color: #ff695e;\n}\n.ui.ui.feed > .event > .red.basic.label::before,\n.ui.red.basic.feed > .event > .label::before {\n  color: #db2828;\n}\n.ui.feed > .event > .inverted.red.label::before,\n.ui.inverted.red.feed > .event > .label::before {\n  background: #ff695e;\n}\n.ui.feed > .event > .inverted.red.basic.label::before,\n.ui.inverted.red.basic.feed > .event > .label::before {\n  color: #ff695e;\n}\n.ui.ui.feed > .event > .orange.label::before,\n.ui.orange.feed > .event > .label::before {\n  background: #f2711c;\n}\n.ui.orange.connected.feed > .event::before,\n.ui.connected.feed > .orange.event::before {\n  border-color: #f2711c;\n}\n.ui.inverted.orange.connected.feed > .event::before,\n.ui.connected.feed > .inverted.orange.event::before {\n  border-color: #ff851b;\n}\n.ui.ui.feed > .event > .orange.basic.label::before,\n.ui.orange.basic.feed > .event > .label::before {\n  color: #f2711c;\n}\n.ui.feed > .event > .inverted.orange.label::before,\n.ui.inverted.orange.feed > .event > .label::before {\n  background: #ff851b;\n}\n.ui.feed > .event > .inverted.orange.basic.label::before,\n.ui.inverted.orange.basic.feed > .event > .label::before {\n  color: #ff851b;\n}\n.ui.ui.feed > .event > .yellow.label::before,\n.ui.yellow.feed > .event > .label::before {\n  background: #fbbd08;\n}\n.ui.yellow.connected.feed > .event::before,\n.ui.connected.feed > .yellow.event::before {\n  border-color: #fbbd08;\n}\n.ui.inverted.yellow.connected.feed > .event::before,\n.ui.connected.feed > .inverted.yellow.event::before {\n  border-color: #ffe21f;\n}\n.ui.ui.feed > .event > .yellow.basic.label::before,\n.ui.yellow.basic.feed > .event > .label::before {\n  color: #fbbd08;\n}\n.ui.feed > .event > .inverted.yellow.label::before,\n.ui.inverted.yellow.feed > .event > .label::before {\n  background: #ffe21f;\n}\n.ui.feed > .event > .inverted.yellow.basic.label::before,\n.ui.inverted.yellow.basic.feed > .event > .label::before {\n  color: #ffe21f;\n}\n.ui.ui.feed > .event > .olive.label::before,\n.ui.olive.feed > .event > .label::before {\n  background: #b5cc18;\n}\n.ui.olive.connected.feed > .event::before,\n.ui.connected.feed > .olive.event::before {\n  border-color: #b5cc18;\n}\n.ui.inverted.olive.connected.feed > .event::before,\n.ui.connected.feed > .inverted.olive.event::before {\n  border-color: #d9e778;\n}\n.ui.ui.feed > .event > .olive.basic.label::before,\n.ui.olive.basic.feed > .event > .label::before {\n  color: #b5cc18;\n}\n.ui.feed > .event > .inverted.olive.label::before,\n.ui.inverted.olive.feed > .event > .label::before {\n  background: #d9e778;\n}\n.ui.feed > .event > .inverted.olive.basic.label::before,\n.ui.inverted.olive.basic.feed > .event > .label::before {\n  color: #d9e778;\n}\n.ui.ui.feed > .event > .green.label::before,\n.ui.green.feed > .event > .label::before {\n  background: #21ba45;\n}\n.ui.green.connected.feed > .event::before,\n.ui.connected.feed > .green.event::before {\n  border-color: #21ba45;\n}\n.ui.inverted.green.connected.feed > .event::before,\n.ui.connected.feed > .inverted.green.event::before {\n  border-color: #2ecc40;\n}\n.ui.ui.feed > .event > .green.basic.label::before,\n.ui.green.basic.feed > .event > .label::before {\n  color: #21ba45;\n}\n.ui.feed > .event > .inverted.green.label::before,\n.ui.inverted.green.feed > .event > .label::before {\n  background: #2ecc40;\n}\n.ui.feed > .event > .inverted.green.basic.label::before,\n.ui.inverted.green.basic.feed > .event > .label::before {\n  color: #2ecc40;\n}\n.ui.ui.feed > .event > .teal.label::before,\n.ui.teal.feed > .event > .label::before {\n  background: #00b5ad;\n}\n.ui.teal.connected.feed > .event::before,\n.ui.connected.feed > .teal.event::before {\n  border-color: #00b5ad;\n}\n.ui.inverted.teal.connected.feed > .event::before,\n.ui.connected.feed > .inverted.teal.event::before {\n  border-color: #6dffff;\n}\n.ui.ui.feed > .event > .teal.basic.label::before,\n.ui.teal.basic.feed > .event > .label::before {\n  color: #00b5ad;\n}\n.ui.feed > .event > .inverted.teal.label::before,\n.ui.inverted.teal.feed > .event > .label::before {\n  background: #6dffff;\n}\n.ui.feed > .event > .inverted.teal.basic.label::before,\n.ui.inverted.teal.basic.feed > .event > .label::before {\n  color: #6dffff;\n}\n.ui.ui.feed > .event > .blue.label::before,\n.ui.blue.feed > .event > .label::before {\n  background: #2185d0;\n}\n.ui.blue.connected.feed > .event::before,\n.ui.connected.feed > .blue.event::before {\n  border-color: #2185d0;\n}\n.ui.inverted.blue.connected.feed > .event::before,\n.ui.connected.feed > .inverted.blue.event::before {\n  border-color: #54c8ff;\n}\n.ui.ui.feed > .event > .blue.basic.label::before,\n.ui.blue.basic.feed > .event > .label::before {\n  color: #2185d0;\n}\n.ui.feed > .event > .inverted.blue.label::before,\n.ui.inverted.blue.feed > .event > .label::before {\n  background: #54c8ff;\n}\n.ui.feed > .event > .inverted.blue.basic.label::before,\n.ui.inverted.blue.basic.feed > .event > .label::before {\n  color: #54c8ff;\n}\n.ui.ui.feed > .event > .violet.label::before,\n.ui.violet.feed > .event > .label::before {\n  background: #6435c9;\n}\n.ui.violet.connected.feed > .event::before,\n.ui.connected.feed > .violet.event::before {\n  border-color: #6435c9;\n}\n.ui.inverted.violet.connected.feed > .event::before,\n.ui.connected.feed > .inverted.violet.event::before {\n  border-color: #a291fb;\n}\n.ui.ui.feed > .event > .violet.basic.label::before,\n.ui.violet.basic.feed > .event > .label::before {\n  color: #6435c9;\n}\n.ui.feed > .event > .inverted.violet.label::before,\n.ui.inverted.violet.feed > .event > .label::before {\n  background: #a291fb;\n}\n.ui.feed > .event > .inverted.violet.basic.label::before,\n.ui.inverted.violet.basic.feed > .event > .label::before {\n  color: #a291fb;\n}\n.ui.ui.feed > .event > .purple.label::before,\n.ui.purple.feed > .event > .label::before {\n  background: #a333c8;\n}\n.ui.purple.connected.feed > .event::before,\n.ui.connected.feed > .purple.event::before {\n  border-color: #a333c8;\n}\n.ui.inverted.purple.connected.feed > .event::before,\n.ui.connected.feed > .inverted.purple.event::before {\n  border-color: #dc73ff;\n}\n.ui.ui.feed > .event > .purple.basic.label::before,\n.ui.purple.basic.feed > .event > .label::before {\n  color: #a333c8;\n}\n.ui.feed > .event > .inverted.purple.label::before,\n.ui.inverted.purple.feed > .event > .label::before {\n  background: #dc73ff;\n}\n.ui.feed > .event > .inverted.purple.basic.label::before,\n.ui.inverted.purple.basic.feed > .event > .label::before {\n  color: #dc73ff;\n}\n.ui.ui.feed > .event > .pink.label::before,\n.ui.pink.feed > .event > .label::before {\n  background: #e03997;\n}\n.ui.pink.connected.feed > .event::before,\n.ui.connected.feed > .pink.event::before {\n  border-color: #e03997;\n}\n.ui.inverted.pink.connected.feed > .event::before,\n.ui.connected.feed > .inverted.pink.event::before {\n  border-color: #ff8edf;\n}\n.ui.ui.feed > .event > .pink.basic.label::before,\n.ui.pink.basic.feed > .event > .label::before {\n  color: #e03997;\n}\n.ui.feed > .event > .inverted.pink.label::before,\n.ui.inverted.pink.feed > .event > .label::before {\n  background: #ff8edf;\n}\n.ui.feed > .event > .inverted.pink.basic.label::before,\n.ui.inverted.pink.basic.feed > .event > .label::before {\n  color: #ff8edf;\n}\n.ui.ui.feed > .event > .brown.label::before,\n.ui.brown.feed > .event > .label::before {\n  background: #a5673f;\n}\n.ui.brown.connected.feed > .event::before,\n.ui.connected.feed > .brown.event::before {\n  border-color: #a5673f;\n}\n.ui.inverted.brown.connected.feed > .event::before,\n.ui.connected.feed > .inverted.brown.event::before {\n  border-color: #d67c1c;\n}\n.ui.ui.feed > .event > .brown.basic.label::before,\n.ui.brown.basic.feed > .event > .label::before {\n  color: #a5673f;\n}\n.ui.feed > .event > .inverted.brown.label::before,\n.ui.inverted.brown.feed > .event > .label::before {\n  background: #d67c1c;\n}\n.ui.feed > .event > .inverted.brown.basic.label::before,\n.ui.inverted.brown.basic.feed > .event > .label::before {\n  color: #d67c1c;\n}\n.ui.ui.feed > .event > .grey.label::before,\n.ui.grey.feed > .event > .label::before {\n  background: #767676;\n}\n.ui.grey.connected.feed > .event::before,\n.ui.connected.feed > .grey.event::before {\n  border-color: #767676;\n}\n.ui.inverted.grey.connected.feed > .event::before,\n.ui.connected.feed > .inverted.grey.event::before {\n  border-color: #dcddde;\n}\n.ui.ui.feed > .event > .grey.basic.label::before,\n.ui.grey.basic.feed > .event > .label::before {\n  color: #767676;\n}\n.ui.feed > .event > .inverted.grey.label::before,\n.ui.inverted.grey.feed > .event > .label::before {\n  background: #dcddde;\n}\n.ui.feed > .event > .inverted.grey.basic.label::before,\n.ui.inverted.grey.basic.feed > .event > .label::before {\n  color: #dcddde;\n}\n.ui.ui.feed > .event > .black.label::before,\n.ui.black.feed > .event > .label::before {\n  background: #1b1c1d;\n}\n.ui.black.connected.feed > .event::before,\n.ui.connected.feed > .black.event::before {\n  border-color: #1b1c1d;\n}\n.ui.inverted.black.connected.feed > .event::before,\n.ui.connected.feed > .inverted.black.event::before {\n  border-color: #545454;\n}\n.ui.ui.feed > .event > .black.basic.label::before,\n.ui.black.basic.feed > .event > .label::before {\n  color: #1b1c1d;\n}\n.ui.feed > .event > .inverted.black.label::before,\n.ui.inverted.black.feed > .event > .label::before {\n  background: #545454;\n}\n.ui.feed > .event > .inverted.black.basic.label::before,\n.ui.inverted.black.basic.feed > .event > .label::before {\n  color: #545454;\n}\n.ui.ui.feed > .event > .basic.label::before,\n.ui.ui.ui.basic.feed > .event > .label::before {\n  background: transparent;\n  border-color: currentColor;\n}\n.ui.disabled.feed,\n.ui.feed .disabled.event {\n  opacity: 0.45;\n  pointer-events: none;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/flag.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Flag\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Flag\n*******************************/\n\ni.flag:not(.icon) {\n  speak: none;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\ni.flag:not(.icon)::before {\n  content: \"\\00A0\\00A0\\00A0\\00A0\\00A0\\00A0\\00A0\";\n  display: inline-block;\n  line-height: 1em;\n  background-repeat: no-repeat;\n  background-position: center center;\n}\ni.flag.small {\n  font-size: 1.5em;\n  vertical-align: middle;\n}\ni.flag.medium {\n  font-size: 3em;\n  vertical-align: middle;\n}\ni.flag.large {\n  font-size: 6em;\n  vertical-align: middle;\n}\ni.flag.big {\n  font-size: 7.5em;\n  vertical-align: middle;\n}\ni.flag.huge {\n  font-size: 9em;\n  vertical-align: middle;\n}\ni.flag.massive {\n  font-size: 12em;\n  vertical-align: middle;\n}\n\n/* rtl:begin:ignore */\ni.flag.transgender::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f3-fe0f-200d-26a7-fe0f.svg\");\n}\ni.flag.rainbow::before,\ni.flag.pride::before,\ni.flag.lgbt::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f3-fe0f-200d-1f308.svg\");\n}\ni.flag.pirate::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-200d-2620-fe0f.svg\");\n}\ni.flag.af::before,\ni.flag.afghanistan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1eb.svg\");\n}\ni.flag.ax::before,\ni.flag.aland.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fd.svg\");\n}\ni.flag.al::before,\ni.flag.albania::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f1.svg\");\n}\ni.flag.dz::before,\ni.flag.algeria::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ff.svg\");\n}\ni.flag.as::before,\ni.flag.american.samoa::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f8.svg\");\n}\ni.flag.ad::before,\ni.flag.andorra::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1e9.svg\");\n}\ni.flag.ao::before,\ni.flag.angola::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f4.svg\");\n}\ni.flag.ai::before,\ni.flag.anguilla::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ee.svg\");\n}\ni.flag.aq::before,\ni.flag.antarctica::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f6.svg\");\n}\ni.flag.ag::before,\ni.flag.antigua.and.barbuda::before,\ni.flag.antigua::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ec.svg\");\n}\ni.flag.ar::before,\ni.flag.argentina::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f7.svg\");\n}\ni.flag.am::before,\ni.flag.armenia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f2.svg\");\n}\ni.flag.aw::before,\ni.flag.aruba::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fc.svg\");\n}\ni.flag.au::before,\ni.flag.australia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fa.svg\");\n}\ni.flag.at::before,\ni.flag.austria::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f9.svg\");\n}\ni.flag.az::before,\ni.flag.azerbaijan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ff.svg\");\n}\ni.flag.bs::before,\ni.flag.bahamas::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f8.svg\");\n}\ni.flag.bh::before,\ni.flag.bahrain::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ed.svg\");\n}\ni.flag.bd::before,\ni.flag.bangladesh::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e9.svg\");\n}\ni.flag.bb::before,\ni.flag.barbados::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e7.svg\");\n}\ni.flag.by::before,\ni.flag.belarus::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fe.svg\");\n}\ni.flag.be::before,\ni.flag.belgium::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ea.svg\");\n}\ni.flag.bz::before,\ni.flag.belize::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ff.svg\");\n}\ni.flag.bj::before,\ni.flag.benin::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ef.svg\");\n}\ni.flag.bm::before,\ni.flag.bermuda::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f2.svg\");\n}\ni.flag.bt::before,\ni.flag.bhutan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f9.svg\");\n}\ni.flag.bo::before,\ni.flag.bolivia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f4.svg\");\n}\ni.flag.ba::before,\ni.flag.bosnia.and.herzegovina::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e6.svg\");\n}\ni.flag.bw::before,\ni.flag.botswana::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fc.svg\");\n}\ni.flag.br::before,\ni.flag.brazil::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f7.svg\");\n}\ni.flag.io::before,\ni.flag.british.indian.ocean.territory::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f4.svg\");\n}\ni.flag.vg::before,\ni.flag.british.virgin.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ec.svg\");\n}\ni.flag.bn::before,\ni.flag.brunei::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f3.svg\");\n}\ni.flag.bg::before,\ni.flag.bulgaria::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ec.svg\");\n}\ni.flag.bf::before,\ni.flag.burkina.faso::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1eb.svg\");\n}\ni.flag.bi::before,\ni.flag.burundi::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ee.svg\");\n}\ni.flag.kh::before,\ni.flag.cambodia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ed.svg\");\n}\ni.flag.cm::before,\ni.flag.cameroon::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f2.svg\");\n}\ni.flag.ca::before,\ni.flag.canada::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e6.svg\");\n}\ni.flag.ic::before,\ni.flag.canary.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1e8.svg\");\n}\ni.flag.cv::before,\ni.flag.cape.verde::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fb.svg\");\n}\ni.flag.bq::before,\ni.flag.caribbean.netherlands::before,\ni.flag.an::before,\ni.flag.netherlands.antilles::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f6.svg\");\n}\ni.flag.ky::before,\ni.flag.cayman.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1fe.svg\");\n}\ni.flag.cf::before,\ni.flag.central.african.republic::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1eb.svg\");\n}\ni.flag.td::before,\ni.flag.chad::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e9.svg\");\n}\ni.flag.cl::before,\ni.flag.chile::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f1.svg\");\n}\ni.flag.cn::before,\ni.flag.china::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f3.svg\");\n}\ni.flag.cx::before,\ni.flag.christmas.island::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fd.svg\");\n}\ni.flag.cc::before,\ni.flag.cocos.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e8.svg\");\n}\ni.flag.co::before,\ni.flag.colombia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f4.svg\");\n}\ni.flag.km::before,\ni.flag.comoros::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f2.svg\");\n}\ni.flag.cg::before,\ni.flag.congo.brazzaville::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ec.svg\");\n}\ni.flag.cd::before,\ni.flag.congo.kinshasa::before,\ni.flag.congo::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e9.svg\");\n}\ni.flag.ck::before,\ni.flag.cook.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f0.svg\");\n}\ni.flag.cr::before,\ni.flag.costa.rica::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f7.svg\");\n}\ni.flag.ci::before,\ni.flag.côte.d’ivoire::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ee.svg\");\n}\ni.flag.hr::before,\ni.flag.croatia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f7.svg\");\n}\ni.flag.cu::before,\ni.flag.cuba::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fa.svg\");\n}\ni.flag.cw::before,\ni.flag.curacao::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fc.svg\");\n}\ni.flag.cy::before,\ni.flag.cyprus::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fe.svg\");\n}\ni.flag.cz::before,\ni.flag.czechia::before,\ni.flag.czech.republic::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ff.svg\");\n}\ni.flag.dk::before,\ni.flag.denmark::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f0.svg\");\n}\ni.flag.dj::before,\ni.flag.djibouti::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ef.svg\");\n}\ni.flag.dm::before,\ni.flag.dominica::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f2.svg\");\n}\ni.flag.do::before,\ni.flag.dominican.republic::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f4.svg\");\n}\ni.flag.ec::before,\ni.flag.ecuador::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1e8.svg\");\n}\ni.flag.eg::before,\ni.flag.egypt::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ec.svg\");\n}\ni.flag.sv::before,\ni.flag.el.salvador::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fb.svg\");\n}\ni.flag.gq::before,\ni.flag.equatorial.guinea::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f6.svg\");\n}\ni.flag.er::before,\ni.flag.eritrea::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f7.svg\");\n}\ni.flag.ee::before,\ni.flag.estonia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ea.svg\");\n}\ni.flag.et::before,\ni.flag.ethiopia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f9.svg\");\n}\ni.flag.eu::before,\ni.flag.european.union::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1fa.svg\");\n}\ni.flag.fk::before,\ni.flag.falkland.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f0.svg\");\n}\ni.flag.fo::before,\ni.flag.faroe.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f4.svg\");\n}\ni.flag.fj::before,\ni.flag.fiji::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1ef.svg\");\n}\ni.flag.fi::before,\ni.flag.finland::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1ee.svg\");\n}\ni.flag.fr::before,\ni.flag.france::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f7.svg\");\n}\ni.flag.gf::before,\ni.flag.french.guiana::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1eb.svg\");\n}\ni.flag.pf::before,\ni.flag.french.polynesia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1eb.svg\");\n}\ni.flag.tf::before,\ni.flag.french.southern.territories::before,\ni.flag.french.territories::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1eb.svg\");\n}\ni.flag.ga::before,\ni.flag.gabon::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e6.svg\");\n}\ni.flag.gm::before,\ni.flag.gambia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f2.svg\");\n}\ni.flag.ge::before,\ni.flag.georgia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ea.svg\");\n}\ni.flag.de::before,\ni.flag.germany::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ea.svg\");\n}\ni.flag.gh::before,\ni.flag.ghana::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ed.svg\");\n}\ni.flag.gi::before,\ni.flag.gibraltar::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ee.svg\");\n}\ni.flag.gr::before,\ni.flag.greece::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f7.svg\");\n}\ni.flag.gl::before,\ni.flag.greenland::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f1.svg\");\n}\ni.flag.gd::before,\ni.flag.grenada::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e9.svg\");\n}\ni.flag.gp::before,\ni.flag.guadeloupe::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f5.svg\");\n}\ni.flag.gu::before,\ni.flag.guam::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fa.svg\");\n}\ni.flag.gt::before,\ni.flag.guatemala::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f9.svg\");\n}\ni.flag.gg::before,\ni.flag.guernsey::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ec.svg\");\n}\ni.flag.gn::before,\ni.flag.guinea::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f3.svg\");\n}\ni.flag.gw::before,\ni.flag.guinea-bissau::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fc.svg\");\n}\ni.flag.gy::before,\ni.flag.guyana::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fe.svg\");\n}\ni.flag.ht::before,\ni.flag.haiti::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f9.svg\");\n}\ni.flag.hn::before,\ni.flag.honduras::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f3.svg\");\n}\ni.flag.hk::before,\ni.flag.hong.kong.sar.china::before,\ni.flag.hong.kong::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f0.svg\");\n}\ni.flag.hu::before,\ni.flag.hungary::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1fa.svg\");\n}\ni.flag.is::before,\ni.flag.iceland::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f8.svg\");\n}\ni.flag.in::before,\ni.flag.india::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f3.svg\");\n}\ni.flag.id::before,\ni.flag.indonesia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1e9.svg\");\n}\ni.flag.ir::before,\ni.flag.iran::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f7.svg\");\n}\ni.flag.iq::before,\ni.flag.iraq::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f6.svg\");\n}\ni.flag.ie::before,\ni.flag.ireland::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1ea.svg\");\n}\ni.flag.im::before,\ni.flag.isle.of.man::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f2.svg\");\n}\ni.flag.il::before,\ni.flag.israel::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f1.svg\");\n}\ni.flag.it::before,\ni.flag.italy::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f9.svg\");\n}\ni.flag.jm::before,\ni.flag.jamaica::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f2.svg\");\n}\ni.flag.jp::before,\ni.flag.japan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f5.svg\");\n}\ni.flag.je::before,\ni.flag.jersey::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1ea.svg\");\n}\ni.flag.jo::before,\ni.flag.jordan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f4.svg\");\n}\ni.flag.kz::before,\ni.flag.kazakhstan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ff.svg\");\n}\ni.flag.ke::before,\ni.flag.kenya::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ea.svg\");\n}\ni.flag.ki::before,\ni.flag.kiribati::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ee.svg\");\n}\ni.flag.xk::before,\ni.flag.kosovo::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fd-1f1f0.svg\");\n}\ni.flag.kw::before,\ni.flag.kuwait::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1fc.svg\");\n}\ni.flag.kg::before,\ni.flag.kyrgyzstan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ec.svg\");\n}\ni.flag.la::before,\ni.flag.laos::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e6.svg\");\n}\ni.flag.lv::before,\ni.flag.latvia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fb.svg\");\n}\ni.flag.lb::before,\ni.flag.lebanon::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e7.svg\");\n}\ni.flag.ls::before,\ni.flag.lesotho::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f8.svg\");\n}\ni.flag.lr::before,\ni.flag.liberia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f7.svg\");\n}\ni.flag.ly::before,\ni.flag.libya::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fe.svg\");\n}\ni.flag.li::before,\ni.flag.liechtenstein::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1ee.svg\");\n}\ni.flag.lt::before,\ni.flag.lithuania::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f9.svg\");\n}\ni.flag.lu::before,\ni.flag.luxembourg::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fa.svg\");\n}\ni.flag.mo::before,\ni.flag.macao.sar.china::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f4.svg\");\n}\ni.flag.mk::before,\ni.flag.republic.of.north.macedonia::before,\ni.flag.north.macedonia::before,\ni.flag.macedonia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f0.svg\");\n}\ni.flag.mg::before,\ni.flag.madagascar::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ec.svg\");\n}\ni.flag.mw::before,\ni.flag.malawi::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fc.svg\");\n}\ni.flag.my::before,\ni.flag.malaysia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fe.svg\");\n}\ni.flag.mv::before,\ni.flag.maldives::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fb.svg\");\n}\ni.flag.ml::before,\ni.flag.mali::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f1.svg\");\n}\ni.flag.mt::before,\ni.flag.malta::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f9.svg\");\n}\ni.flag.mh::before,\ni.flag.marshall.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ed.svg\");\n}\ni.flag.mq::before,\ni.flag.martinique::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f6.svg\");\n}\ni.flag.mr::before,\ni.flag.mauritania::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f7.svg\");\n}\ni.flag.mu::before,\ni.flag.mauritius::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fa.svg\");\n}\ni.flag.yt::before,\ni.flag.mayotte::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fe-1f1f9.svg\");\n}\ni.flag.mx::before,\ni.flag.mexico::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fd.svg\");\n}\ni.flag.fm::before,\ni.flag.micronesia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f2.svg\");\n}\ni.flag.md::before,\ni.flag.moldova::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e9.svg\");\n}\ni.flag.mc::before,\ni.flag.monaco::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e8.svg\");\n}\ni.flag.mn::before,\ni.flag.mongolia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f3.svg\");\n}\ni.flag.me::before,\ni.flag.montenegro::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ea.svg\");\n}\ni.flag.ms::before,\ni.flag.montserrat::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f8.svg\");\n}\ni.flag.ma::before,\ni.flag.morocco::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e6.svg\");\n}\ni.flag.mz::before,\ni.flag.mozambique::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ff.svg\");\n}\ni.flag.mm::before,\ni.flag.myanmar::before,\ni.flag.burma::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f2.svg\");\n}\ni.flag.na::before,\ni.flag.namibia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1e6.svg\");\n}\ni.flag.nr::before,\ni.flag.nauru::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f7.svg\");\n}\ni.flag.np::before,\ni.flag.nepal::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f5.svg\");\n}\ni.flag.nl::before,\ni.flag.netherlands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f1.svg\");\n}\ni.flag.nc::before,\ni.flag.new.caledonia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1e8.svg\");\n}\ni.flag.nz::before,\ni.flag.new.zealand::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ff.svg\");\n}\ni.flag.ni::before,\ni.flag.nicaragua::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ee.svg\");\n}\ni.flag.ne::before,\ni.flag.niger::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ea.svg\");\n}\ni.flag.ng::before,\ni.flag.nigeria::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ec.svg\");\n}\ni.flag.nu::before,\ni.flag.niue::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1fa.svg\");\n}\ni.flag.nf::before,\ni.flag.norfolk.island::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1eb.svg\");\n}\ni.flag.kp::before,\ni.flag.north.korea::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f5.svg\");\n}\ni.flag.mp::before,\ni.flag.northern.mariana.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f5.svg\");\n}\ni.flag.no::before,\ni.flag.norway::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f4.svg\");\n}\ni.flag.om::before,\ni.flag.oman::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f4-1f1f2.svg\");\n}\ni.flag.pk::before,\ni.flag.pakistan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f0.svg\");\n}\ni.flag.pw::before,\ni.flag.palau::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1fc.svg\");\n}\ni.flag.ps::before,\ni.flag.palestinian.territories::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f8.svg\");\n}\ni.flag.pa::before,\ni.flag.panama::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1e6.svg\");\n}\ni.flag.pg::before,\ni.flag.papua.new.guinea::before,\ni.flag.new.guinea::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ec.svg\");\n}\ni.flag.py::before,\ni.flag.paraguay::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1fe.svg\");\n}\ni.flag.pe::before,\ni.flag.peru::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ea.svg\");\n}\ni.flag.ph::before,\ni.flag.philippines::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ed.svg\");\n}\ni.flag.pn::before,\ni.flag.pitcairn.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f3.svg\");\n}\ni.flag.pl::before,\ni.flag.poland::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f1.svg\");\n}\ni.flag.pt::before,\ni.flag.portugal::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f9.svg\");\n}\ni.flag.pr::before,\ni.flag.puerto.rico::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f7.svg\");\n}\ni.flag.qa::before,\ni.flag.qatar::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f6-1f1e6.svg\");\n}\ni.flag.re::before,\ni.flag.réunion::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1ea.svg\");\n}\ni.flag.ro::before,\ni.flag.romania::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1f4.svg\");\n}\ni.flag.ru::before,\ni.flag.russia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1fa.svg\");\n}\ni.flag.rw::before,\ni.flag.rwanda::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1fc.svg\");\n}\ni.flag.ws::before,\ni.flag.samoa::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fc-1f1f8.svg\");\n}\ni.flag.sm::before,\ni.flag.san.marino::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f2.svg\");\n}\ni.flag.st::before,\ni.flag.sao.tome.and.principe::before,\ni.flag.samo.tome::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f9.svg\");\n}\ni.flag.sa::before,\ni.flag.saudi.arabia::before,\ni.flag.saudiarabia::before,\ni.flag.saudi::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e6.svg\");\n}\ni.flag.sn::before,\ni.flag.senegal::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f3.svg\");\n}\ni.flag.rs::before,\ni.flag.serbia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1f8.svg\");\n}\ni.flag.sc::before,\ni.flag.seychelles::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e8.svg\");\n}\ni.flag.sl::before,\ni.flag.sierra.leone::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f1.svg\");\n}\ni.flag.sg::before,\ni.flag.singapore::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ec.svg\");\n}\ni.flag.sx::before,\ni.flag.sint.maarten::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fd.svg\");\n}\ni.flag.sk::before,\ni.flag.slovakia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f0.svg\");\n}\ni.flag.si::before,\ni.flag.slovenia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ee.svg\");\n}\ni.flag.gs::before,\ni.flag.south.georgia.and.south.sandwich.islands::before,\ni.flag.sandwich.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f8.svg\");\n}\ni.flag.sb::before,\ni.flag.solomon.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e7.svg\");\n}\ni.flag.so::before,\ni.flag.somalia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f4.svg\");\n}\ni.flag.za::before,\ni.flag.south.africa::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1e6.svg\");\n}\ni.flag.kr::before,\ni.flag.south.korea::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f7.svg\");\n}\ni.flag.ss::before,\ni.flag.south.sudan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f8.svg\");\n}\ni.flag.es::before,\ni.flag.spain::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f8.svg\");\n}\ni.flag.lk::before,\ni.flag.sri.lanka::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f0.svg\");\n}\ni.flag.bl::before,\ni.flag.st.barthelemy::before,\ni.flag.saint.barth::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f1.svg\");\n}\ni.flag.sh::before,\ni.flag.st.helena::before,\ni.flag.saint.helena::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ed.svg\");\n}\ni.flag.kn::before,\ni.flag.st.kitts.and.nevis::before,\ni.flag.saint.kitts.and.navis::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f3.svg\");\n}\ni.flag.lc::before,\ni.flag.st.lucia::before,\ni.flag.saint.lucia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e8.svg\");\n}\ni.flag.pm::before,\ni.flag.st.pierre.and.miquelon::before,\ni.flag.saint.pierre::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f2.svg\");\n}\ni.flag.vc::before,\ni.flag.st.vincent.and.grenadines::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1e8.svg\");\n}\ni.flag.sd::before,\ni.flag.sudan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e9.svg\");\n}\ni.flag.sr::before,\ni.flag.suriname::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f7.svg\");\n}\ni.flag.sz::before,\ni.flag.eswatini::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ff.svg\");\n}\ni.flag.se::before,\ni.flag.sweden::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ea.svg\");\n}\ni.flag.ch::before,\ni.flag.switzerland::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ed.svg\");\n}\ni.flag.sy::before,\ni.flag.syria::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fe.svg\");\n}\ni.flag.tw::before,\ni.flag.taiwan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1fc.svg\");\n}\ni.flag.tj::before,\ni.flag.tajikistan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ef.svg\");\n}\ni.flag.tz::before,\ni.flag.tanzania::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ff.svg\");\n}\ni.flag.th::before,\ni.flag.thailand::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ed.svg\");\n}\ni.flag.tl::before,\ni.flag.timor-leste::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f1.svg\");\n}\ni.flag.tg::before,\ni.flag.togo::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ec.svg\");\n}\ni.flag.tk::before,\ni.flag.tokelau::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f0.svg\");\n}\ni.flag.to::before,\ni.flag.tonga::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f4.svg\");\n}\ni.flag.tt::before,\ni.flag.trinidad.and.tobago::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f9.svg\");\n}\ni.flag.tn::before,\ni.flag.tunisia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f3.svg\");\n}\ni.flag.tr::before,\ni.flag.turkey::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f7.svg\");\n}\ni.flag.tm::before,\ni.flag.turkmenistan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f2.svg\");\n}\ni.flag.tc::before,\ni.flag.turks.and.caicos.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e8.svg\");\n}\ni.flag.vi::before,\ni.flag.us.virgin.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ee.svg\");\n}\ni.flag.tv::before,\ni.flag.tuvalu::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1fb.svg\");\n}\ni.flag.ug::before,\ni.flag.uganda::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1ec.svg\");\n}\ni.flag.ua::before,\ni.flag.ukraine::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1e6.svg\");\n}\ni.flag.ae::before,\ni.flag.united.arab.emirates::before,\ni.flag.uae::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ea.svg\");\n}\ni.flag.gb::before,\ni.flag.united.kingdom::before,\ni.flag.uk::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e7.svg\");\n}\ni.flag.gb.eng::before,\ni.flag.england::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.svg\");\n}\ni.flag.gb.sct::before,\ni.flag.scotland::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.svg\");\n}\ni.flag.gb.wls::before,\ni.flag.wales::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg\");\n}\ni.flag.us::before,\ni.flag.united.states::before,\ni.flag.america::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f8.svg\");\n}\ni.flag.uy::before,\ni.flag.uruguay::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1fe.svg\");\n}\ni.flag.uz::before,\ni.flag.uzbekistan::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1ff.svg\");\n}\ni.flag.vu::before,\ni.flag.vanuatu::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1fa.svg\");\n}\ni.flag.va::before,\ni.flag.vatican.city::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1e6.svg\");\n}\ni.flag.ve::before,\ni.flag.venezuela::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ea.svg\");\n}\ni.flag.vn::before,\ni.flag.vietnam::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1f3.svg\");\n}\ni.flag.wf::before,\ni.flag.wallis.and.futuna::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fc-1f1eb.svg\");\n}\ni.flag.eh::before,\ni.flag.western.sahara::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ed.svg\");\n}\ni.flag.ye::before,\ni.flag.yemen::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fe-1f1ea.svg\");\n}\ni.flag.zm::before,\ni.flag.zambia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1f2.svg\");\n}\ni.flag.zw::before,\ni.flag.zimbabwe::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1fc.svg\");\n}\ni.flag.ac::before,\ni.flag.ascension.island::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1e8.svg\");\n}\ni.flag.bv::before,\ni.flag.bouvet.island::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fb.svg\");\n}\ni.flag.cp::before,\ni.flag.clipperton.island::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f5.svg\");\n}\ni.flag.ea::before,\ni.flag.ceuta.and.melilla::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1e6.svg\");\n}\ni.flag.dg::before,\ni.flag.diego.garcia::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ec.svg\");\n}\ni.flag.hm::before,\ni.flag.heard.and.mcdonald.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f2.svg\");\n}\ni.flag.mf::before,\ni.flag.st.martin::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1eb.svg\");\n}\ni.flag.sj::before,\ni.flag.svalbard.and.jan.mayen::before,\ni.flag.svalbard::before,\ni.flag.jan.mayen::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ef.svg\");\n}\ni.flag.ta::before,\ni.flag.tristan.da.cunha::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e6.svg\");\n}\ni.flag.um::before,\ni.flag.us.outlying.islands::before,\ni.flag.minor.islands::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f2.svg\");\n}\ni.flag.un::before,\ni.flag.united.nations::before,\ni.flag.united.nations::before {\n  background-image: url(\"https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f3.svg\");\n}\n\n/* rtl:end:ignore */\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/flyout.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Flyout\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Flyout\n*******************************/\n\n\n/* Flyout Menu */\n.ui.flyout {\n  position: fixed;\n  top: 0;\n  left: 0;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  transition: none;\n  will-change: transform;\n  transform: translate3d(0, 0, 0);\n  visibility: hidden;\n  height: 100%;\n  max-height: 100%;\n  max-width: 100%;\n  border-radius: 0;\n  margin: 0;\n  overflow-y: hidden;\n  z-index: 102;\n  background: #fff;\n  outline: none;\n}\n\n/* GPU Layers for Child Elements */\n.ui.flyout > * {\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\n\n/* --------------\n       Close\n    --------------- */\n.ui.flyout > .close {\n  cursor: pointer;\n  position: absolute;\n  top: 1.25rem;\n  right: 1.5rem;\n  z-index: 1;\n  opacity: 0.8;\n  font-size: 1.25em;\n  color: rgba(0, 0, 0, 0.85);\n  width: 2.25rem;\n  height: 2.25rem;\n  padding: 0;\n  margin: 0 0 0 0.25rem;\n  text-align: right;\n}\n.ui.flyout > .close:focus,\n.ui.flyout > .close:hover {\n  opacity: 1;\n  outline: none;\n}\n\n/* --------------\n   Header\n--------------- */\n.ui.flyout > .header {\n  display: block;\n  background: #fff;\n  margin: 0;\n  padding: 1.25rem 1.5rem;\n  box-shadow: none;\n  color: rgba(0, 0, 0, 0.85);\n  border-bottom: 1px solid rgba(34, 36, 38, 0.15);\n}\n\n/* --------------\n   Content\n--------------- */\n.ui.flyout > .content {\n  display: block;\n  width: 100%;\n  font-size: 1em;\n  line-height: 1.4;\n  padding: 1.5rem;\n  background: #fff;\n}\n.ui.flyout > .content.scrolling {\n  overflow: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n}\n.ui.flyout.left > .content,\n.ui.flyout.right > .content {\n  min-height: calc(100vh - 4.7rem);\n}\n.ui.flyout.left > .header + .content,\n.ui.flyout.right > .header + .content {\n  min-height: calc(100vh - 9.1rem);\n}\n.ui.flyout.left > .scrolling.content,\n.ui.flyout.right > .scrolling.content {\n  max-height: calc(100vh - 4.7rem);\n}\n.ui.flyout.left > .header + .scrolling.content,\n.ui.flyout.right > .header + .scrolling.content {\n  max-height: calc(100vh - 9.1rem);\n}\n.ui.flyout.top > .scrolling.content,\n.ui.flyout.bottom > .scrolling.content {\n  max-height: calc(80vh - 9.1rem);\n}\n\n/* --------------\n       Actions\n    --------------- */\n.ui.flyout > .actions {\n  background: #f9fafb;\n  padding: 1rem;\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n  text-align: right;\n}\n.ui.flyout .actions > .button:not(.fluid) {\n  margin-left: 0.75em;\n}\n.ui.ui.flyout > .basic.actions {\n  border-top: none;\n}\n.ui.flyout > .left.actions {\n  text-align: left;\n}\n.ui.flyout > .left.actions > .button:not(.fluid) {\n  margin-left: 0.5em;\n  margin-right: 0.5em;\n}\n.ui.flyout > .centered,\n.ui.flyout > .center.aligned {\n  text-align: center;\n}\n.ui.flyout > .centered.actions > .button:not(.fluid),\n.ui.flyout > .center.aligned.actions > .button:not(.fluid) {\n  margin-left: 0.5em;\n  margin-right: 0.5em;\n}\n.ui.ui.flyout > .basic.header,\n.ui.ui.flyout > .basic.actions {\n  background-color: transparent;\n}\n.ui.flyout > .basic.header {\n  border-bottom: none;\n}\n\n/* --------------\n   Direction\n--------------- */\n.ui.left.flyout {\n  right: auto;\n  left: 0;\n  transform: translate3d(-100%, 0, 0);\n}\n.ui.right.flyout {\n  right: 0;\n  left: auto;\n  transform: translate3d(100%, 0, 0);\n}\n.ui.top.flyout,\n.ui.bottom.flyout {\n  width: 100%;\n  height: auto;\n}\n.ui.top.flyout {\n  top: 0;\n  bottom: auto;\n  transform: translate3d(0, -100%, 0);\n}\n.ui.bottom.flyout {\n  top: auto;\n  bottom: 0;\n  transform: translate3d(0, 100%, 0);\n}\n\n/* --------------\n     Pushable\n--------------- */\n.pushable.pushable.pushable {\n  height: 100%;\n  overflow-x: hidden;\n  padding: 0;\n}\n.pushable.pushable.pushable.locked {\n  overflow-y: hidden;\n  background: inherit;\n}\n\n/* Whole Page */\nbody.pushable {\n  background: #545454;\n}\nbody.pushable.dimmed {\n  background: inherit;\n}\n\n/* Page Context */\n.pushable:not(body) {\n  transform: translate3d(0, 0, 0);\n  overflow-y: hidden;\n}\n.pushable:not(body) > .ui.flyout,\n.pushable:not(body) > .fixed,\n.pushable:not(body) > .pusher::after {\n  position: absolute;\n}\n\n/* --------------\n     Fixed\n--------------- */\n.pushable > .fixed {\n  position: fixed;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  transition: transform 500ms ease;\n  will-change: transform;\n  z-index: 101;\n}\n\n/* --------------\n     Page\n--------------- */\n.pushable > .pusher {\n  position: relative;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  min-height: 100%;\n  transition: transform 500ms ease;\n  z-index: 2;\n  \n/* Pusher should inherit background from context */\n  background: inherit;\n}\n.pushable > .pusher:not(.overflowing) {\n  overflow: hidden;\n}\nbody.pushable > .pusher {\n  background: #fff;\n}\n\n/* --------------\n     Dimmer\n--------------- */\n.pushable > .pusher::after {\n  position: fixed;\n  top: 0;\n  right: 0;\n  content: \"\";\n  background: rgba(0, 0, 0, 0.4);\n  overflow: hidden;\n  opacity: 0;\n  transition: all 500ms;\n  will-change: opacity;\n  z-index: 1000;\n}\n\n/* --------------\n    Coupling\n--------------- */\n.ui.flyout.menu .item {\n  border-radius: 0 !important;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------\n     Dimmed\n--------------- */\n.pushable > .pusher.dimmed::after {\n  width: 100% !important;\n  height: 100% !important;\n  opacity: 1 !important;\n}\n.pushable > .pusher.dimmed.blurring:not(.closing)::after {\n  background: rgba(0, 0, 0, 0.6);\n  -webkit-backdrop-filter: blur(5px) grayscale(0.7);\n  backdrop-filter: blur(5px) grayscale(0.7);\n}\n.pushable > .pusher.closing.dimmed::after {\n  opacity: 0 !important;\n}\n\n/* --------------\n    Animating\n--------------- */\n.ui.animating.flyout {\n  visibility: visible;\n}\n\n/* --------------\n     Visible\n--------------- */\n.ui.visible.flyout {\n  visibility: visible;\n  transform: translate3d(0, 0, 0);\n}\n\n/* Shadow Direction */\n.ui.left.visible.flyout,\n.ui.right.visible.flyout {\n  box-shadow: 0 0 20px rgba(34, 36, 38, 0.15);\n}\n.ui.top.visible.flyout,\n.ui.bottom.visible.flyout {\n  box-shadow: 0 0 20px rgba(34, 36, 38, 0.15);\n}\n\n/* Visible On Load */\n.ui.visible.left.flyout ~ .fixed,\n.ui.visible.left.flyout ~ .pusher {\n  transform: translate3d(400px, 0, 0);\n}\n.ui.visible.right.flyout ~ .fixed,\n.ui.visible.right.flyout ~ .pusher {\n  transform: translate3d(-400px, 0, 0);\n}\n.ui.visible.top.flyout ~ .fixed,\n.ui.visible.top.flyout ~ .pusher {\n  transform: translate3d(0, 36px, 0);\n}\n.ui.visible.bottom.flyout ~ .fixed,\n.ui.visible.bottom.flyout ~ .pusher {\n  transform: translate3d(0, -36px, 0);\n}\n\n/* opposite sides visible forces content overlay */\n.ui.visible.left.flyout ~ .ui.visible.right.flyout ~ .fixed,\n.ui.visible.left.flyout ~ .ui.visible.right.flyout ~ .pusher,\n.ui.visible.right.flyout ~ .ui.visible.left.flyout ~ .fixed,\n.ui.visible.right.flyout ~ .ui.visible.left.flyout ~ .pusher {\n  transform: translate3d(0, 0, 0);\n}\n\n/* --------------\n         Inverted\n    --------------- */\n.ui.flyout.inverted {\n  background: #000;\n}\n.ui.flyout.inverted > .close {\n  color: #fff;\n}\n.ui.flyout.inverted > .header,\n.ui.flyout.inverted > .content {\n  background: #000;\n  color: #fff;\n}\n.ui.flyout.inverted > .actions {\n  background: #191a1b;\n  border-top: 1px solid rgba(34, 36, 38, 0.85);\n  color: #fff;\n}\n\n\n/*******************************\n          Variations\n*******************************/\n\n\n/* --------------\n     Width\n--------------- */\n\n/* Left / Right */\n.ui.left.flyout,\n.ui.right.flyout {\n  width: 400px;\n}\n.ui.thin.left.flyout,\n.ui.thin.right.flyout {\n  width: 200px;\n}\n.ui[class*=\"very thin\"].left.flyout,\n.ui[class*=\"very thin\"].right.flyout {\n  width: 120px;\n}\n.ui.wide.left.flyout,\n.ui.wide.right.flyout {\n  width: 600px;\n}\n.ui[class*=\"very wide\"].left.flyout,\n.ui[class*=\"very wide\"].right.flyout {\n  width: 800px;\n}\n\n/* Left Visible */\n.ui.visible.thin.left.flyout ~ .fixed,\n.ui.visible.thin.left.flyout ~ .pusher {\n  transform: translate3d(200px, 0, 0);\n}\n.ui.visible[class*=\"very thin\"].left.flyout ~ .fixed,\n.ui.visible[class*=\"very thin\"].left.flyout ~ .pusher {\n  transform: translate3d(120px, 0, 0);\n}\n.ui.visible.wide.left.flyout ~ .fixed,\n.ui.visible.wide.left.flyout ~ .pusher {\n  transform: translate3d(600px, 0, 0);\n}\n.ui.visible[class*=\"very wide\"].left.flyout ~ .fixed,\n.ui.visible[class*=\"very wide\"].left.flyout ~ .pusher {\n  transform: translate3d(800px, 0, 0);\n}\n\n/* Right Visible */\n.ui.visible.thin.right.flyout ~ .fixed,\n.ui.visible.thin.right.flyout ~ .pusher {\n  transform: translate3d(-200px, 0, 0);\n}\n.ui.visible[class*=\"very thin\"].right.flyout ~ .fixed,\n.ui.visible[class*=\"very thin\"].right.flyout ~ .pusher {\n  transform: translate3d(-120px, 0, 0);\n}\n.ui.visible.wide.right.flyout ~ .fixed,\n.ui.visible.wide.right.flyout ~ .pusher {\n  transform: translate3d(-600px, 0, 0);\n}\n.ui.visible[class*=\"very wide\"].right.flyout ~ .fixed,\n.ui.visible[class*=\"very wide\"].right.flyout ~ .pusher {\n  transform: translate3d(-800px, 0, 0);\n}\n\n/* Fullscreen */\n.ui.fullscreen.flyout {\n  width: 100%;\n}\n\n/* -------------------\n      Column Width\n    -------------------- */\n\n/* Sizing Combinations */\n.ui[class*=\"one wide\"].flyout:not(.fullscreen) {\n  width: 6.25%;\n}\n.ui[class*=\"two wide\"].flyout:not(.fullscreen) {\n  width: 12.5%;\n}\n.ui[class*=\"three wide\"].flyout:not(.fullscreen) {\n  width: 18.75%;\n}\n.ui[class*=\"four wide\"].flyout:not(.fullscreen) {\n  width: 25%;\n}\n.ui[class*=\"five wide\"].flyout:not(.fullscreen) {\n  width: 31.25%;\n}\n.ui[class*=\"six wide\"].flyout:not(.fullscreen) {\n  width: 37.5%;\n}\n.ui[class*=\"seven wide\"].flyout:not(.fullscreen) {\n  width: 43.75%;\n}\n.ui[class*=\"eight wide\"].flyout:not(.fullscreen) {\n  width: 50%;\n}\n.ui[class*=\"nine wide\"].flyout:not(.fullscreen) {\n  width: 56.25%;\n}\n.ui[class*=\"ten wide\"].flyout:not(.fullscreen) {\n  width: 62.5%;\n}\n.ui[class*=\"eleven wide\"].flyout:not(.fullscreen) {\n  width: 68.75%;\n}\n.ui[class*=\"twelve wide\"].flyout:not(.fullscreen) {\n  width: 75%;\n}\n.ui[class*=\"thirteen wide\"].flyout:not(.fullscreen) {\n  width: 81.25%;\n}\n.ui[class*=\"fourteen wide\"].flyout:not(.fullscreen) {\n  width: 87.5%;\n}\n.ui[class*=\"fifteen wide\"].flyout:not(.fullscreen) {\n  width: 93.75%;\n}\n.ui[class*=\"sixteen wide\"].flyout:not(.fullscreen) {\n  width: 100%;\n}\n\n\n/*******************************\n          Animations\n*******************************/\n\n\n/* --------------\n        Overlay\n    --------------- */\n\n/* Set-up */\n.ui.overlay.flyout {\n  z-index: 102;\n}\n\n/* Initial */\n.ui.left.overlay.flyout {\n  transform: translate3d(-100%, 0, 0);\n}\n.ui.right.overlay.flyout {\n  transform: translate3d(100%, 0, 0);\n}\n.ui.top.overlay.flyout {\n  transform: translate3d(0, -100%, 0);\n}\n.ui.bottom.overlay.flyout {\n  transform: translate3d(0, 100%, 0);\n}\n\n/* Animation */\n.animating.ui.overlay.flyout,\n.ui.visible.overlay.flyout {\n  transition: transform 500ms ease;\n}\n\n/* End - flyout */\n.ui.visible.overlay.flyout {\n  transform: translate3d(0, 0, 0);\n}\n\n/* End - Pusher */\n.ui.visible.overlay.flyout ~ .fixed,\n.ui.visible.overlay.flyout ~ .pusher {\n  transform: none !important;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n        User Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/flyout.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Flyout\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.flyout = function (parameters) {\n        var\n            $allModules     = $(this),\n            $window         = $(window),\n            $document       = $(document),\n            $html           = $('html'),\n            $head           = $('head'),\n            $body           = $('body'),\n\n            time            = Date.now(),\n            performance     = [],\n\n            query           = arguments[0],\n            methodInvoked   = typeof query === 'string',\n            queryArguments  = [].slice.call(arguments, 1),\n            contextCheck    = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $body;\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : $body;\n                    }\n                }\n\n                return $context;\n            },\n            returnedValue\n        ;\n\n        $allModules.each(function () {\n            var\n                settings             = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.flyout.settings, parameters)\n                    : $.extend({}, $.fn.flyout.settings),\n\n                selector             = settings.selector,\n                className            = settings.className,\n                namespace            = settings.namespace,\n                fields               = settings.fields,\n                regExp               = settings.regExp,\n                error                = settings.error,\n\n                eventNamespace       = '.' + namespace,\n                moduleNamespace      = 'module-' + namespace,\n\n                $module              = $(this),\n                $context             = contextCheck(settings.context, window),\n                $closeIcon           = $module.find(selector.close),\n                $inputs,\n                $focusedElement,\n\n                $flyouts             = $module.children(selector.flyout),\n                $pusher              = $context.children(selector.pusher),\n                $style,\n\n                isFlyoutComponent    = $module.hasClass('flyout'),\n\n                element              = this,\n                instance             = isFlyoutComponent ? $module.data(moduleNamespace) : undefined,\n\n                ignoreRepeatedEvents = false,\n                isBody               = $context[0] === $body[0],\n                initialBodyMargin    = '',\n                tempBodyMargin       = '',\n                hadScrollbar         = false,\n                windowRefocused      = false,\n\n                elementNamespace,\n                id,\n                observer,\n                observeAttributes = false,\n                currentScroll,\n\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.debug('Initializing flyout', parameters);\n\n                    module.create.id();\n                    if (!isFlyoutComponent) {\n                        module.create.flyout();\n                        if (!isFunction(settings.onHidden)) {\n                            settings.onHidden = function () {\n                                module.destroy();\n                                $module.remove();\n                            };\n                        }\n                        if (!settings.autoShow) {\n                            settings.autoShow = true;\n                        }\n                    }\n                    $module.addClass(settings.class);\n                    if (settings.title !== '') {\n                        $module.find(selector.header).html(module.helpers.escape(settings.title, settings.preserveHTML)).addClass(settings.classTitle);\n                    }\n                    if (settings.content !== '') {\n                        $module.find(selector.content).html(module.helpers.escape(settings.content, settings.preserveHTML)).addClass(settings.classContent);\n                    }\n                    if (module.has.configActions()) {\n                        var $actions = $module.find(selector.actions).addClass(settings.classActions);\n                        if ($actions.length === 0) {\n                            $actions = $('<div/>', { class: className.actions + ' ' + (settings.classActions || '') }).appendTo($module);\n                        } else {\n                            $actions.empty();\n                        }\n                        settings.actions.forEach(function (el) {\n                            var\n                                icon = el[fields.icon]\n                                    ? '<i ' + (el[fields.text] ? 'aria-hidden=\"true\"' : '') + ' class=\"' + module.helpers.deQuote(el[fields.icon]) + ' icon\"></i>'\n                                    : '',\n                                text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),\n                                cls = module.helpers.deQuote(el[fields.class] || ''),\n                                click = el[fields.click] && isFunction(el[fields.click])\n                                    ? el[fields.click]\n                                    : function () {}\n                            ;\n                            $actions.append($('<button/>', {\n                                html: icon + text,\n                                'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g, ''),\n                                class: className.button + ' ' + cls,\n                                on: {\n                                    click: function () {\n                                        if (click.call(element, $module) === false) {\n                                            return;\n                                        }\n                                        module.hide();\n                                    },\n                                },\n                            }));\n                        });\n                    }\n\n                    // avoids locking rendering if initialized in onReady\n                    if (settings.delaySetup) {\n                        requestAnimationFrame(module.setup.layout);\n                    } else {\n                        module.setup.layout();\n                    }\n\n                    requestAnimationFrame(function () {\n                        module.setup.cache();\n                    });\n\n                    if (module.get.direction() === 'left' || module.get.direction() === 'right') {\n                        module.setup.heights();\n                        module.bind.resize();\n                    }\n                    module.bind.events();\n                    module.observeChanges();\n                    module.instantiate();\n\n                    if (settings.autoShow) {\n                        module.show();\n                    }\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, instance)\n                    ;\n                },\n\n                create: {\n                    flyout: function () {\n                        module.verbose('Programmaticaly create flyout', $context);\n                        $module = $('<div/>', { class: className.flyout, role: 'dialog', 'aria-modal': settings.dimPage });\n                        if (settings.closeIcon) {\n                            $closeIcon = $('<i/>', {\n                                class: className.close,\n                                role: 'button',\n                                tabindex: 0,\n                                'aria-label': settings.text.close,\n                            });\n                            $module.append($closeIcon);\n                        }\n                        if (settings.title !== '') {\n                            var titleId = '_' + module.get.id() + 'title';\n                            $module.attr('aria-labelledby', titleId);\n                            $('<div/>', { class: className.header, id: titleId }).appendTo($module);\n                        }\n                        if (settings.content !== '') {\n                            var descId = '_' + module.get.id() + 'desc';\n                            $module.attr('aria-describedby', descId);\n                            $('<div/>', { class: className.content, id: descId }).appendTo($module);\n                        }\n                        if (module.has.configActions()) {\n                            $('<div/>', { class: className.actions }).appendTo($module);\n                        }\n                        $module.prependTo($context);\n                        element = $module[0];\n                    },\n                    id: function () {\n                        id = (Math.random().toString(16) + '000000000').slice(2, 10);\n                        elementNamespace = '.' + id;\n                        module.verbose('Creating unique id for element', id);\n                    },\n                },\n\n                destroy: function () {\n                    if (observer) {\n                        observer.disconnect();\n                    }\n                    module.verbose('Destroying previous module for', $module);\n                    $module\n                        .off(eventNamespace)\n                        .removeData(moduleNamespace)\n                    ;\n                    $closeIcon.off(elementNamespace);\n                    if ($inputs) {\n                        $inputs.off(elementNamespace);\n                    }\n                    // bound by uuid\n                    $context.off(elementNamespace);\n                    $window.off(elementNamespace);\n                    $document.off(elementNamespace);\n                },\n\n                event: {\n                    keyboard: function (event) {\n                        var\n                            keyCode   = event.which\n                        ;\n                        if (keyCode === settings.keys.escape) {\n                            if (settings.closable) {\n                                module.debug('Escape key pressed hiding flyout');\n                                module.hide();\n                            } else {\n                                module.debug('Escape key pressed, but closable is set to false');\n                            }\n                            event.preventDefault();\n                        }\n                    },\n                    resize: function () {\n                        module.setup.heights();\n                    },\n                    focus: function () {\n                        windowRefocused = true;\n                    },\n                    click: function (event) {\n                        if (windowRefocused && document.activeElement !== event.target && module.is.visible() && settings.autofocus && settings.dimPage && $(document.activeElement).closest(selector.flyout).length === 0) {\n                            requestAnimationFrame(module.set.autofocus);\n                        }\n                        windowRefocused = false;\n                    },\n                    clickaway: function (event) {\n                        if (settings.closable) {\n                            var\n                                clickedInPusher = $pusher.find(event.target).length > 0 || $pusher.is(event.target),\n                                clickedContext  = $context.is(event.target)\n                            ;\n                            if (clickedInPusher) {\n                                module.verbose('User clicked on dimmed page');\n                                module.hide();\n                            }\n                            if (clickedContext) {\n                                module.verbose('User clicked on dimmable context (scaled out page)');\n                                module.hide();\n                            }\n                        }\n                    },\n                    close: function (event) {\n                        module.hide();\n                    },\n                    closeKeyUp: function (event) {\n                        var\n                            keyCode   = event.which\n                        ;\n                        if (keyCode === settings.keys.enter || keyCode === settings.keys.space) {\n                            module.hide();\n                        }\n                    },\n                    inputKeyDown: {\n                        first: function (event) {\n                            var\n                                keyCode = event.which\n                            ;\n                            if (keyCode === settings.keys.tab && event.shiftKey) {\n                                $inputs.last().trigger('focus');\n                                event.preventDefault();\n                            }\n                        },\n                        last: function (event) {\n                            var\n                                keyCode = event.which\n                            ;\n                            if (keyCode === settings.keys.tab && !event.shiftKey) {\n                                $inputs.first().trigger('focus');\n                                event.preventDefault();\n                            }\n                        },\n                    },\n                    approve: function (event) {\n                        if (ignoreRepeatedEvents || settings.onApprove.call(module.element, $(this)) === false) {\n                            module.verbose('Approve callback returned false cancelling close');\n\n                            return;\n                        }\n                        ignoreRepeatedEvents = true;\n                        module.hide(function () {\n                            ignoreRepeatedEvents = false;\n                        });\n                    },\n                    deny: function (event) {\n                        if (ignoreRepeatedEvents || settings.onDeny.call(module.element, $(this)) === false) {\n                            module.verbose('Deny callback returned false cancelling close');\n\n                            return;\n                        }\n                        ignoreRepeatedEvents = true;\n                        module.hide(function () {\n                            ignoreRepeatedEvents = false;\n                        });\n                    },\n                    touch: function (event) {\n                        // event.stopPropagation();\n                    },\n                    containScroll: function (event) {\n                        if (element.scrollTop <= 0) {\n                            element.scrollTop = 1;\n                        }\n                        if ((element.scrollTop + element.offsetHeight) >= element.scrollHeight) {\n                            element.scrollTop = element.scrollHeight - element.offsetHeight - 1;\n                        }\n                    },\n                    scroll: function (event) {\n                        if ($(event.target).closest(selector.flyout).length === 0) {\n                            event.preventDefault();\n                        }\n                    },\n                },\n\n                bind: {\n                    resize: function () {\n                        module.verbose('Adding resize event to window', $window);\n                        $window.on('resize' + elementNamespace, module.event.resize);\n                    },\n                    events: function () {\n                        module.verbose('Attaching events');\n                        $module\n                            .on('click' + eventNamespace, selector.close, module.event.close)\n                            .on('click' + eventNamespace, selector.approve, module.event.approve)\n                            .on('click' + eventNamespace, selector.deny, module.event.deny)\n                        ;\n                        $closeIcon\n                            .on('keyup' + elementNamespace, module.event.closeKeyUp)\n                        ;\n                        $window\n                            .on('focus' + elementNamespace, module.event.focus)\n                        ;\n                        $context\n                            .on('click' + elementNamespace, module.event.click)\n                        ;\n                    },\n                    clickaway: function () {\n                        module.verbose('Adding clickaway events to context', $context);\n                        $context\n                            .on('click' + elementNamespace, module.event.clickaway)\n                            .on('touchend' + elementNamespace, module.event.clickaway)\n                        ;\n                    },\n                    scrollLock: function () {\n                        if (settings.scrollLock) {\n                            module.debug('Disabling page scroll');\n                            hadScrollbar = module.has.scrollbar();\n                            if (hadScrollbar) {\n                                module.save.bodyMargin();\n                                module.set.bodyMargin();\n                            }\n                            $context.addClass(className.locked);\n                        }\n                        module.verbose('Adding events to contain flyout scroll');\n                        $document\n                            .on('touchmove' + elementNamespace, module.event.touch)\n                        ;\n                        $module\n                            .on('scroll' + eventNamespace, module.event.containScroll)\n                        ;\n                    },\n                },\n                unbind: {\n                    clickaway: function () {\n                        module.verbose('Removing clickaway events from context', $context);\n                        $context.off(elementNamespace);\n                    },\n                    scrollLock: function () {\n                        module.verbose('Removing scroll lock from page');\n                        if (hadScrollbar) {\n                            module.restore.bodyMargin();\n                        }\n                        $context.removeClass(className.locked);\n                        $document.off(elementNamespace);\n                        $module.off('scroll' + eventNamespace);\n                    },\n                },\n\n                add: {\n                    inlineCSS: function () {\n                        var\n                            width     = module.cache.width || $module.outerWidth(),\n                            height    = module.cache.height || $module.outerHeight(),\n                            isRTL     = module.is.rtl(),\n                            direction = module.get.direction(),\n                            distance  = {\n                                left: width,\n                                right: -width,\n                                top: height,\n                                bottom: -height,\n                            },\n                            style\n                        ;\n\n                        if (isRTL) {\n                            module.verbose('RTL detected, flipping widths');\n                            distance.left = -width;\n                            distance.right = width;\n                        }\n\n                        style = '<style>';\n\n                        if (direction === 'left' || direction === 'right') {\n                            module.debug('Adding CSS rules for animation distance', width);\n                            style += ''\n                                + ' .ui.visible.' + direction + '.flyout ~ .fixed,'\n                                + ' .ui.visible.' + direction + '.flyout ~ .pusher {'\n                                + '           transform: translate3d(' + distance[direction] + 'px, 0, 0);'\n                                + ' }';\n                        } else if (direction === 'top' || direction === 'bottom') {\n                            style += ''\n                                + ' .ui.visible.' + direction + '.flyout ~ .fixed,'\n                                + ' .ui.visible.' + direction + '.flyout ~ .pusher {'\n                                + '           transform: translate3d(0, ' + distance[direction] + 'px, 0);'\n                                + ' }';\n                        }\n\n                        /* IE is only browser not to create context with transforms */\n                        /* https://www.w3.org/Bugs/Public/show_bug.cgi?id=16328 */\n                        if (module.is.ie()) {\n                            if (direction === 'left' || direction === 'right') {\n                                module.debug('Adding CSS rules for animation distance', width);\n                                style += ''\n                                    + ' body.pushable > .ui.visible.' + direction + '.flyout ~ .pusher::after {'\n                                    + '           transform: translate3d(' + distance[direction] + 'px, 0, 0);'\n                                    + ' }';\n                            } else if (direction === 'top' || direction === 'bottom') {\n                                style += ''\n                                    + ' body.pushable > .ui.visible.' + direction + '.flyout ~ .pusher::after {'\n                                    + '           transform: translate3d(0, ' + distance[direction] + 'px, 0);'\n                                    + ' }';\n                            }\n                            /* opposite sides visible forces content overlay */\n                            style += ''\n                                + ' body.pushable > .ui.visible.left.flyout ~ .ui.visible.right.flyout ~ .pusher::after,'\n                                + ' body.pushable > .ui.visible.right.flyout ~ .ui.visible.left.flyout ~ .pusher::after {'\n                                + '           transform: translate3d(0, 0, 0);'\n                                + ' }';\n                        }\n                        style += '</style>';\n                        $style = $(style)\n                            .appendTo($head)\n                        ;\n                        module.debug('Adding sizing css to head', $style);\n                    },\n                    keyboardShortcuts: function () {\n                        module.verbose('Adding keyboard shortcuts');\n                        $document\n                            .on('keydown' + eventNamespace, module.event.keyboard)\n                        ;\n                    },\n                },\n                observeChanges: function () {\n                    if ('MutationObserver' in window) {\n                        observer = new MutationObserver(function (mutations) {\n                            var collectNodes = function (parent) {\n                                    var nodes = [];\n                                    for (var c = 0, cl = parent.length; c < cl; c++) {\n                                        Array.prototype.push.apply(nodes, collectNodes(parent[c].childNodes));\n                                        nodes.push(parent[c]);\n                                    }\n\n                                    return nodes;\n                                },\n                                shouldRefreshInputs = false,\n                                ignoreAutofocus = true\n                            ;\n                            mutations.every(function (mutation) {\n                                if (mutation.type === 'attributes') {\n                                    if (observeAttributes && (mutation.attributeName === 'disabled' || $(mutation.target).find(':input').addBack(':input').filter(':visible').length > 0)) {\n                                        shouldRefreshInputs = true;\n                                    }\n                                } else {\n                                    // mutationobserver only provides the parent nodes\n                                    // so let's collect all childs as well to find nested inputs\n                                    var $addedInputs = $(collectNodes(mutation.addedNodes)).filter('a[href], [tabindex], :input:enabled').filter(':visible'),\n                                        $removedInputs = $(collectNodes(mutation.removedNodes)).filter('a[href], [tabindex], :input');\n                                    if ($addedInputs.length > 0 || $removedInputs.length > 0) {\n                                        shouldRefreshInputs = true;\n                                        if ($addedInputs.filter(':input').length > 0 || $removedInputs.filter(':input').length > 0) {\n                                            ignoreAutofocus = false;\n                                        }\n                                    }\n                                }\n\n                                return !shouldRefreshInputs;\n                            });\n\n                            if (shouldRefreshInputs) {\n                                module.refreshInputs(ignoreAutofocus);\n                            }\n                        });\n                        observer.observe(element, {\n                            attributeFilter: ['class', 'disabled'],\n                            attributes: true,\n                            childList: true,\n                            subtree: true,\n                        });\n                        module.debug('Setting up mutation observer', observer);\n                    }\n                },\n                refresh: function () {\n                    module.verbose('Refreshing selector cache');\n                    $context = contextCheck(settings.context, window);\n                    module.refreshFlyouts();\n                    $pusher = $context.children(selector.pusher);\n                    module.clear.cache();\n                },\n\n                refreshFlyouts: function () {\n                    module.verbose('Refreshing other flyouts');\n                    $flyouts = $context.children(selector.flyout);\n                },\n\n                refreshInputs: function (ignoreAutofocus) {\n                    if ($inputs) {\n                        $inputs\n                            .off('keydown' + elementNamespace)\n                        ;\n                    }\n                    if (!settings.dimPage) {\n                        return;\n                    }\n                    $inputs = $module.find('a[href], [tabindex], :input:enabled').filter(':visible').filter(function () {\n                        return $(this).closest('.disabled').length === 0;\n                    });\n                    if ($inputs.filter(':input').length === 0) {\n                        $inputs = $module.add($inputs);\n                        $module.attr('tabindex', -1);\n                    } else {\n                        $module.removeAttr('tabindex');\n                    }\n                    $inputs.first()\n                        .on('keydown' + elementNamespace, module.event.inputKeyDown.first)\n                    ;\n                    $inputs.last()\n                        .on('keydown' + elementNamespace, module.event.inputKeyDown.last)\n                    ;\n                    if (!ignoreAutofocus && settings.autofocus && $inputs.filter(':focus').length === 0) {\n                        module.set.autofocus();\n                    }\n                },\n\n                setup: {\n                    cache: function () {\n                        module.cache = {\n                            width: $module.outerWidth(),\n                            height: $module.outerHeight(),\n                        };\n                    },\n                    layout: function () {\n                        if ($context.children(selector.pusher).length === 0) {\n                            module.debug('Adding wrapper element for flyout');\n                            module.error(error.pusher);\n                            $pusher = $('<div class=\"pusher\" />');\n                            $context\n                                .children()\n                                .not(selector.omitted)\n                                .not($flyouts)\n                                .wrapAll($pusher)\n                            ;\n                            module.refresh();\n                        }\n                        if ($module.nextAll(selector.pusher).length === 0 || $module.nextAll(selector.pusher)[0] !== $pusher[0]) {\n                            module.debug('Moved flyout to correct parent element');\n                            module.error(error.movedFlyout, element);\n                            $module.detach().prependTo($context);\n                            module.refresh();\n                        }\n                        if (module.is.mobile()) {\n                            $module.addClass(className.fullscreen);\n                        }\n                        module.clear.cache();\n                        module.set.pushable();\n                        module.set.direction();\n                    },\n                    heights: function () {\n                        module.debug('Setting up heights', $module);\n                        var\n                            $header = $module.children(selector.header),\n                            $content = $module.children(selector.content),\n                            $actions = $module.children(selector.actions),\n                            newContentHeight = ($context.height() || 0) - ($header.outerHeight() || 0) - ($actions.outerHeight() || 0)\n                        ;\n                        if (newContentHeight > 0) {\n                            $content.css('min-height', String(newContentHeight) + 'px');\n                        }\n                    },\n                },\n\n                attachEvents: function (selector, event) {\n                    var\n                        $toggle = $(selector)\n                    ;\n                    event = isFunction(module[event])\n                        ? module[event]\n                        : module.toggle;\n                    if ($toggle.length > 0) {\n                        module.debug('Attaching flyout events to element', selector, event);\n                        $toggle\n                            .on('click' + eventNamespace, event)\n                        ;\n                    } else {\n                        module.error(error.notFound, selector);\n                    }\n                },\n\n                show: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if (module.is.hidden()) {\n                        if (settings.onShow.call(element) === false) {\n                            module.verbose('Show callback returned false cancelling show');\n\n                            return;\n                        }\n                        module.refresh();\n                        if (module.othersActive()) {\n                            module.debug('Other flyouts currently visible');\n                            if (settings.exclusive) {\n                                module.hideOthers();\n                            } else {\n                                ignoreRepeatedEvents = false;\n                            }\n                        }\n                        module.set.dimmerStyles();\n                        module.set.observeAttributes(false);\n                        module.pushPage(function () {\n                            callback.call(element);\n                            settings.onVisible.call(element);\n                            if (settings.keyboardShortcuts) {\n                                module.add.keyboardShortcuts();\n                            }\n                            module.save.focus();\n                            module.refreshInputs();\n                            requestAnimationFrame(module.set.observeAttributes);\n                        });\n                        settings.onChange.call(element);\n                    } else {\n                        module.debug('Flyout is already visible');\n                    }\n                },\n\n                hide: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if (settings.onHide.call(element, $(this)) === false) {\n                        module.verbose('Hide callback returned false cancelling hide');\n                        ignoreRepeatedEvents = false;\n\n                        return false;\n                    }\n                    if (module.is.visible() || module.is.animating()) {\n                        module.debug('Hiding flyout', callback);\n                        module.refreshFlyouts();\n                        module.set.observeAttributes(false);\n                        module.pullPage(function () {\n                            callback.call(element);\n                            if (isFunction(settings.onHidden)) {\n                                settings.onHidden.call(element);\n                            }\n                            module.restore.focus();\n                        });\n                        settings.onChange.call(element);\n                    }\n                },\n\n                othersAnimating: function () {\n                    return $flyouts.not($module).filter('.' + className.animating).length > 0;\n                },\n                othersVisible: function () {\n                    return $flyouts.not($module).filter('.' + className.visible).length > 0;\n                },\n                othersActive: function () {\n                    return module.othersVisible() || module.othersAnimating();\n                },\n\n                hideOthers: function (callback) {\n                    var\n                        $otherFlyouts = $flyouts.not($module).filter('.' + className.visible),\n                        flyoutCount   = $otherFlyouts.length,\n                        callbackCount  = 0\n                    ;\n                    callback = callback || function () {};\n                    $otherFlyouts\n                        .flyout('hide', function () {\n                            callbackCount++;\n                            if (callbackCount === flyoutCount) {\n                                callback();\n                            }\n                        })\n                    ;\n                },\n\n                toggle: function () {\n                    module.verbose('Determining toggled direction');\n                    if (module.is.hidden()) {\n                        module.show();\n                    } else {\n                        module.hide();\n                    }\n                },\n\n                pushPage: function (callback) {\n                    var\n                        animate,\n                        dim,\n                        transitionEnd\n                    ;\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    module.set.overlay();\n                    if (settings.returnScroll) {\n                        currentScroll = (isBody ? $window : $context).scrollTop();\n                    }\n                    module.bind.scrollLock();\n                    animate = function () {\n                        module.bind.clickaway();\n                        module.add.inlineCSS();\n                        module.set.animating();\n                        module.set.visible();\n                    };\n                    dim = function () {\n                        module.set.dimmed();\n                    };\n                    transitionEnd = function (event) {\n                        if (event.target === $module[0]) {\n                            $module.off('transitionend' + elementNamespace, transitionEnd);\n                            module.remove.animating();\n                            callback.call(element);\n                        }\n                    };\n                    $module.off('transitionend' + elementNamespace);\n                    $module.on('transitionend' + elementNamespace, transitionEnd);\n                    requestAnimationFrame(animate);\n                    if (settings.dimPage && !module.othersVisible()) {\n                        requestAnimationFrame(dim);\n                    }\n                },\n\n                pullPage: function (callback) {\n                    var\n                        animate,\n                        transitionEnd\n                    ;\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    module.verbose('Removing context push state', module.get.direction());\n\n                    module.unbind.clickaway();\n                    if (!module.othersActive()) {\n                        module.unbind.scrollLock();\n                        if (settings.keyboardShortcuts) {\n                            module.remove.keyboardShortcuts();\n                        }\n                    }\n\n                    animate = function () {\n                        module.set.overlay();\n                        module.set.animating();\n                        if (settings.dimPage && !module.othersVisible()) {\n                            module.set.closing();\n                        }\n                        module.remove.visible();\n                    };\n                    transitionEnd = function (event) {\n                        if (event.target === $module[0]) {\n                            $module.off('transitionend' + elementNamespace, transitionEnd);\n                            module.remove.animating();\n                            module.remove.closing();\n                            module.remove.overlay();\n                            module.remove.inlineCSS();\n                            if (settings.returnScroll) {\n                                module.scrollBack();\n                            }\n                            if (settings.dimPage && !module.othersVisible()) {\n                                $pusher.removeClass(className.dimmed);\n                            }\n                            callback.call(element);\n                        }\n                    };\n                    $module.off('transitionend' + elementNamespace);\n                    $module.on('transitionend' + elementNamespace, transitionEnd);\n                    requestAnimationFrame(animate);\n                },\n\n                scrollToTop: function () {\n                    module.verbose('Scrolling to top of page to avoid animation issues');\n                    $module.scrollTop(0);\n                    (isBody ? $window : $context)[0].scrollTo(0, 0);\n                },\n\n                scrollBack: function () {\n                    module.verbose('Scrolling back to original page position');\n                    (isBody ? $window : $context)[0].scrollTo(0, currentScroll);\n                },\n\n                clear: {\n                    cache: function () {\n                        module.verbose('Clearing cached dimensions');\n                        module.cache = {};\n                    },\n                },\n\n                set: {\n                    observeAttributes: function (state) {\n                        observeAttributes = state !== false;\n                    },\n                    autofocus: function () {\n                        var\n                            $autofocus = $inputs.filter('[autofocus]'),\n                            $rawInputs = $inputs.filter(':input'),\n                            $input     = ($autofocus.length > 0\n                                ? $autofocus\n                                : ($rawInputs.length > 0\n                                    ? $rawInputs\n                                    : $module)\n                            ).first()\n                        ;\n                        $input.trigger('focus');\n                    },\n                    dimmerStyles: function () {\n                        if (settings.blurring) {\n                            $pusher.addClass(className.blurring);\n                        } else {\n                            $pusher.removeClass(className.blurring);\n                        }\n                    },\n                    bodyMargin: function () {\n                        var position = module.can.leftBodyScrollbar() ? 'left' : 'right';\n                        $context.css((isBody ? 'margin-' : 'padding-') + position, tempBodyMargin + 'px');\n                        $context.find(selector.bodyFixed.replace('right', position)).each(function () {\n                            var\n                                el = $(this),\n                                attribute = el.css('position') === 'fixed' ? 'padding-' + position : position\n                            ;\n                            el.css(attribute, 'calc(' + el.css(attribute) + ' + ' + tempBodyMargin + 'px)');\n                        });\n                    },\n\n                    // container\n                    pushed: function () {\n                        $context.addClass(className.pushed);\n                    },\n                    pushable: function () {\n                        $context.addClass(className.pushable);\n                    },\n\n                    // pusher\n                    dimmed: function () {\n                        $pusher.addClass(className.dimmed);\n                    },\n\n                    // flyout\n                    active: function () {\n                        $module.addClass(className.active);\n                    },\n                    animating: function () {\n                        $module.addClass(className.animating);\n                    },\n                    closing: function () {\n                        $pusher.addClass(className.closing);\n                    },\n                    direction: function (direction) {\n                        direction = direction || module.get.direction();\n                        $module.addClass(className[direction]);\n                    },\n                    visible: function () {\n                        $module.addClass(className.visible);\n                    },\n                    overlay: function () {\n                        $module.addClass(className.overlay);\n                    },\n                },\n                remove: {\n\n                    inlineCSS: function () {\n                        module.debug('Removing inline css styles', $style);\n                        if ($style && $style.length > 0) {\n                            $style.remove();\n                        }\n                    },\n                    keyboardShortcuts: function () {\n                        module.verbose('Removing keyboard shortcuts');\n                        $document\n                            .off('keydown' + eventNamespace)\n                        ;\n                    },\n\n                    // context\n                    pushed: function () {\n                        $context.removeClass(className.pushed);\n                    },\n                    pushable: function () {\n                        $context.removeClass(className.pushable);\n                    },\n\n                    // flyout\n                    active: function () {\n                        $module.removeClass(className.active);\n                    },\n                    animating: function () {\n                        $module.removeClass(className.animating);\n                    },\n                    closing: function () {\n                        $pusher.removeClass(className.closing);\n                    },\n                    direction: function (direction) {\n                        direction = direction || module.get.direction();\n                        $module.removeClass(className[direction]);\n                    },\n                    visible: function () {\n                        $module.removeClass(className.visible);\n                    },\n                    overlay: function () {\n                        $module.removeClass(className.overlay);\n                    },\n                },\n\n                get: {\n                    direction: function () {\n                        if ($module.hasClass(className.top)) {\n                            return className.top;\n                        }\n                        if ($module.hasClass(className.right)) {\n                            return className.right;\n                        }\n                        if ($module.hasClass(className.bottom)) {\n                            return className.bottom;\n                        }\n\n                        return className.left;\n                    },\n                    id: function () {\n                        return id;\n                    },\n                    element: function () {\n                        return $module;\n                    },\n                    settings: function () {\n                        return settings;\n                    },\n                },\n\n                can: {\n                    leftBodyScrollbar: function () {\n                        if (module.cache.leftBodyScrollbar === undefined) {\n                            module.cache.leftBodyScrollbar = module.is.rtl() && ((module.is.iframe && !module.is.firefox()) || module.is.safari() || module.is.edge() || module.is.ie());\n                        }\n\n                        return module.cache.leftBodyScrollbar;\n                    },\n                },\n\n                save: {\n                    focus: function () {\n                        var\n                            $activeElement = $(document.activeElement),\n                            inCurrentFlyout = $activeElement.closest($module).length > 0\n                        ;\n                        if (!inCurrentFlyout) {\n                            $focusedElement = $(document.activeElement).trigger('blur');\n                        }\n                    },\n                    bodyMargin: function () {\n                        initialBodyMargin = $context.css((isBody ? 'margin-' : 'padding-') + (module.can.leftBodyScrollbar() ? 'left' : 'right'));\n                        var\n                            bodyMarginRightPixel = parseInt(initialBodyMargin.replace(/[^\\d.]/g, ''), 10),\n                            bodyScrollbarWidth = isBody ? window.innerWidth - document.documentElement.clientWidth : $context[0].offsetWidth - $context[0].clientWidth\n                        ;\n                        tempBodyMargin = bodyMarginRightPixel + bodyScrollbarWidth;\n                    },\n                },\n\n                is: {\n                    safari: function () {\n                        if (module.cache.isSafari === undefined) {\n                            module.cache.isSafari = /constructor/i.test(window.HTMLElement) || !!window.ApplePaySession;\n                        }\n\n                        return module.cache.isSafari;\n                    },\n                    edge: function () {\n                        if (module.cache.isEdge === undefined) {\n                            module.cache.isEdge = !!window.setImmediate && !module.is.ie();\n                        }\n\n                        return module.cache.isEdge;\n                    },\n                    firefox: function () {\n                        if (module.cache.isFirefox === undefined) {\n                            module.cache.isFirefox = !!window.InstallTrigger;\n                        }\n\n                        return module.cache.isFirefox;\n                    },\n                    iframe: function () {\n                        return !(self === top);\n                    },\n                    ie: function () {\n                        if (module.cache.isIE === undefined) {\n                            var\n                                isIE11 = !window.ActiveXObject && 'ActiveXObject' in window,\n                                isIE = 'ActiveXObject' in window\n                            ;\n                            module.cache.isIE = isIE11 || isIE;\n                        }\n\n                        return module.cache.isIE;\n                    },\n                    mobile: function () {\n                        var\n                            userAgent    = navigator.userAgent,\n                            isMobile     = userAgent.match(regExp.mobile)\n                        ;\n                        if (isMobile) {\n                            module.verbose('Browser was found to be mobile', userAgent);\n\n                            return true;\n                        }\n\n                        module.verbose('Browser is not mobile, using regular transition', userAgent);\n\n                        return false;\n                    },\n                    hidden: function () {\n                        return !module.is.visible();\n                    },\n                    visible: function () {\n                        return $module.hasClass(className.visible);\n                    },\n                    animating: function () {\n                        return $context.hasClass(className.animating);\n                    },\n                    rtl: function () {\n                        if (module.cache.isRTL === undefined) {\n                            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';\n                        }\n\n                        return module.cache.isRTL;\n                    },\n                },\n\n                has: {\n                    configActions: function () {\n                        return Array.isArray(settings.actions) && settings.actions.length > 0;\n                    },\n                    scrollbar: function () {\n                        return isBody || $context.css('overflow-y') !== 'hidden';\n                    },\n                },\n\n                restore: {\n                    focus: function () {\n                        if ($focusedElement && $focusedElement.length > 0 && settings.restoreFocus) {\n                            $focusedElement.trigger('focus');\n                        }\n                    },\n                    bodyMargin: function () {\n                        var position = module.can.leftBodyScrollbar() ? 'left' : 'right';\n                        $context.css((isBody ? 'margin-' : 'padding-') + position, initialBodyMargin);\n                        $context.find(selector.bodyFixed.replace('right', position)).each(function () {\n                            var\n                                el = $(this),\n                                attribute = el.css('position') === 'fixed' ? 'padding-' + position : position\n                            ;\n                            el.css(attribute, '');\n                        });\n                    },\n                },\n\n                helpers: {\n                    deQuote: function (string) {\n                        return String(string).replace(/\"/g, '');\n                    },\n                    escape: function (string, preserveHTML) {\n                        if (preserveHTML) {\n                            return string;\n                        }\n                        var\n                            badChars     = /[\"'<>`]/g,\n                            shouldEscape = /[\"&'<>`]/,\n                            escape       = {\n                                '<': '&lt;',\n                                '>': '&gt;',\n                                '\"': '&quot;',\n                                \"'\": '&#x27;',\n                                '`': '&#x60;',\n                            },\n                            escapedChar  = function (chr) {\n                                return escape[chr];\n                            }\n                        ;\n                        if (shouldEscape.test(string)) {\n                            string = string.replace(/&(?![\\d#a-z]{1,12};)/gi, '&amp;');\n\n                            return string.replace(badChars, escapedChar);\n                        }\n\n                        return string;\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = element || context;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    if (isFunction(settings.templates[query])) {\n                        settings.autoShow = true;\n                        settings.className.flyout = settings.className.template;\n                        settings = $.extend(true, {}, settings, settings.templates[query].apply(module, queryArguments));\n\n                        // reassign shortcuts\n                        className = settings.className;\n                        namespace = settings.namespace;\n                        fields = settings.fields;\n                        error = settings.error;\n                    }\n                    module.initialize();\n                }\n                if (!isFunction(settings.templates[query])) {\n                    module.invoke(query);\n                }\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n                returnedValue = $module;\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n    $.flyout = $.fn.flyout;\n\n    $.fn.flyout.settings = {\n\n        name: 'Flyout',\n        namespace: 'flyout',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        context: 'body',\n        exclusive: false,\n        closable: true,\n        autofocus: true,\n        restoreFocus: true,\n        dimPage: true,\n        scrollLock: false,\n        returnScroll: false,\n        delaySetup: false,\n        autoShow: false,\n\n        keyboardShortcuts: true,\n\n        // dynamic content\n        title: '',\n        content: '',\n        class: '',\n        classTitle: '',\n        classContent: '',\n        classActions: '',\n        closeIcon: false,\n        actions: false,\n        preserveHTML: true,\n\n        fields: {\n            class: 'class',\n            text: 'text',\n            icon: 'icon',\n            click: 'click',\n        },\n\n        onChange: function () {},\n        onShow: function () {},\n        onHide: function () {\n            return true;\n        },\n\n        onHidden: false,\n        onVisible: function () {},\n\n        onApprove: function () {},\n        onDeny: function () {},\n\n        keys: {\n            space: 32,\n            enter: 13,\n            escape: 27,\n            tab: 9,\n        },\n\n        className: {\n            flyout: 'ui flyout',\n            close: 'close icon',\n            header: 'ui header',\n            content: 'content',\n            actions: 'actions',\n            active: 'active',\n            animating: 'animating',\n            blurring: 'blurring',\n            closing: 'closing',\n            dimmed: 'dimmed',\n            locked: 'locked',\n            pushable: 'pushable',\n            pushed: 'pushed',\n            right: 'right',\n            top: 'top',\n            left: 'left',\n            bottom: 'bottom',\n            visible: 'visible',\n            overlay: 'overlay',\n            fullscreen: 'fullscreen',\n            template: 'ui flyout',\n            button: 'ui button',\n            ok: 'positive',\n            cancel: 'negative',\n            prompt: 'ui fluid input',\n        },\n\n        selector: {\n            bodyFixed: '> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.right.flyout, > .ui.fixed.nag, > .ui.fixed.nag > .close',\n            fixed: '.fixed',\n            omitted: 'script, link, style, .ui.modal, .ui.dimmer, .ui.nag, .ui.fixed',\n            pusher: '.pusher',\n            flyout: '.ui.flyout',\n            header: '.ui.header',\n            content: '.content',\n            actions: '.actions',\n            close: '.close',\n            approve: '.actions .positive, .actions .approve, .actions .ok',\n            deny: '.actions .negative, .actions .deny, .actions .cancel',\n        },\n\n        regExp: {\n            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,\n        },\n\n        error: {\n            method: 'The method you called is not defined.',\n            pusher: 'Had to add pusher element. For optimal performance make sure body content is inside a pusher element',\n            movedFlyout: 'Had to move flyout. For optimal performance make sure flyout and pusher are direct children of your body tag',\n            notFound: 'There were no elements that matched the specified selector',\n        },\n\n        text: {\n            ok: 'Ok',\n            cancel: 'Cancel',\n            close: 'Close',\n        },\n    };\n\n    $.fn.flyout.settings.templates = {\n        getArguments: function (args) {\n            var queryArguments = [].slice.call(args);\n            if ($.isPlainObject(queryArguments[0])) {\n                return $.extend({\n                    handler: function () {},\n                    content: '',\n                    title: '',\n                }, queryArguments[0]);\n            }\n            if (!isFunction(queryArguments[queryArguments.length - 1])) {\n                queryArguments.push(function () {});\n            }\n\n            return {\n                handler: queryArguments.pop(),\n                content: queryArguments.pop() || '',\n                title: queryArguments.pop() || '',\n            };\n        },\n        alert: function () {\n            var\n                settings = this.get.settings(),\n                args     = settings.templates.getArguments(arguments)\n            ;\n\n            return {\n                title: args.title,\n                content: args.content,\n                actions: [{\n                    text: settings.text.ok,\n                    class: settings.className.ok,\n                    click: args.handler,\n                }],\n            };\n        },\n        confirm: function () {\n            var\n                settings = this.get.settings(),\n                args     = settings.templates.getArguments(arguments)\n            ;\n\n            return {\n                title: args.title,\n                content: args.content,\n                actions: [{\n                    text: settings.text.ok,\n                    class: settings.className.ok,\n                    click: function () {\n                        args.handler(true);\n                    },\n                }, {\n                    text: settings.text.cancel,\n                    class: settings.className.cancel,\n                    click: function () {\n                        args.handler(false);\n                    },\n                }],\n            };\n        },\n        prompt: function () {\n            var\n                $this    = this,\n                settings = this.get.settings(),\n                args     = settings.templates.getArguments(arguments),\n                input    = $($.parseHTML(args.content)).filter('.ui.input')\n            ;\n            if (input.length === 0) {\n                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>';\n            }\n\n            return {\n                title: args.title,\n                content: args.content,\n                actions: [{\n                    text: settings.text.ok,\n                    class: settings.className.ok,\n                    click: function () {\n                        var\n                            settings = $this.get.settings(),\n                            inputField = $this.get.element().find(settings.selector.prompt)[0]\n                        ;\n                        args.handler($(inputField).val());\n                    },\n                }, {\n                    text: settings.text.cancel,\n                    class: settings.className.cancel,\n                    click: function () {\n                        args.handler(null);\n                    },\n                }],\n            };\n        },\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/form.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Form\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Elements\n*******************************/\n\n\n/* --------------------\n        Form\n--------------------- */\n.ui.form {\n  position: relative;\n  max-width: 100%;\n}\n\n/* --------------------\n        Content\n--------------------- */\n.ui.form > p {\n  margin: 1em 0;\n}\n\n/* --------------------\n        Field\n--------------------- */\n.ui.form .field {\n  clear: both;\n  margin: 0 0 1em;\n}\n.ui.form .fields .fields,\n.ui.form .field:last-child,\n.ui.form .fields:last-child .field {\n  margin-bottom: 0;\n}\n.ui.form .fields .field {\n  clear: both;\n  margin: 0;\n}\n\n/* --------------------\n        Labels\n--------------------- */\n.ui.form .field > label {\n  display: block;\n  margin: 0 0 0.28571429rem 0;\n  font-size: 0.92857143em;\n  font-weight: bold;\n  text-transform: none;\n}\n.ui.form:not(.inverted) .field > label:not(.button) {\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* --------------------\n    Standard Inputs\n--------------------- */\n.ui.form textarea,\n.ui.form input:not([type]),\n.ui.form input[type=\"color\"],\n.ui.form input[type=\"date\"],\n.ui.form input[type=\"datetime-local\"],\n.ui.form input[type=\"email\"],\n.ui.form input[type=\"month\"],\n.ui.form input[type=\"number\"],\n.ui.form input[type=\"password\"],\n.ui.form input[type=\"search\"],\n.ui.form input[type=\"tel\"],\n.ui.form input[type=\"time\"],\n.ui.form input[type=\"text\"],\n.ui.form input[type=\"file\"],\n.ui.form input[type=\"url\"],\n.ui.form input[type=\"week\"] {\n  width: 100%;\n  vertical-align: top;\n}\n\n/* Set max height on unusual input */\n.ui.form ::-webkit-datetime-edit,\n.ui.form ::-webkit-inner-spin-button {\n  height: 1.21428571em;\n}\n.ui.form input:not([type]),\n.ui.form input[type=\"color\"],\n.ui.form input[type=\"date\"],\n.ui.form input[type=\"datetime-local\"],\n.ui.form input[type=\"email\"],\n.ui.form input[type=\"month\"],\n.ui.form input[type=\"number\"],\n.ui.form input[type=\"password\"],\n.ui.form input[type=\"search\"],\n.ui.form input[type=\"tel\"],\n.ui.form input[type=\"time\"],\n.ui.form input[type=\"text\"],\n.ui.form input[type=\"file\"],\n.ui.form input[type=\"url\"],\n.ui.form input[type=\"week\"] {\n  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\";\n  margin: 0;\n  outline: none;\n  -webkit-appearance: none;\n  -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n  line-height: 1.21428571em;\n  padding: 0.67857143em 1em;\n  font-size: 1em;\n  background: #fff;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  color: rgba(0, 0, 0, 0.87);\n  border-radius: 0.28571429rem;\n  box-shadow: 0 0 0 0 transparent inset;\n  transition: color 0.1s ease, border-color 0.1s ease;\n}\n.ui.form input[type=\"color\"] {\n  padding: initial;\n}\n.ui.form input::-webkit-calendar-picker-indicator {\n  padding: 0;\n  opacity: 0.5;\n  -webkit-transition: opacity 0.3s ease;\n  transition: opacity 0.3s ease;\n  cursor: pointer;\n}\n\n/* Text Area */\n.ui.input textarea,\n.ui.form textarea {\n  margin: 0;\n  -webkit-appearance: none;\n  -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n  padding: 0.78571429em 1em;\n  background: #fff;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  outline: none;\n  color: rgba(0, 0, 0, 0.87);\n  border-radius: 0.28571429rem;\n  box-shadow: 0 0 0 0 transparent inset;\n  transition: color 0.1s ease, border-color 0.1s ease;\n  font-size: 1em;\n  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\";\n  line-height: 1.2857;\n  resize: vertical;\n  min-height: 2.99992857em;\n}\n.ui.input > textarea {\n  flex: 1 1 auto;\n  max-width: 100%;\n}\n.ui.form textarea:not([rows]) {\n  height: 12em;\n  min-height: 8em;\n  max-height: 24em;\n}\n.ui.form textarea,\n.ui.form input[type=\"checkbox\"] {\n  vertical-align: top;\n}\n\n/* --------------------\n    Checkbox margin\n--------------------- */\n.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) label + .ui.ui.checkbox {\n  margin-top: 0.7em;\n}\n.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.checkbox {\n  margin-top: 2.41428571em;\n}\n.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.toggle.checkbox {\n  margin-top: 2.21428571em;\n}\n.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.slider.checkbox {\n  margin-top: 2.61428571em;\n}\n.ui.ui.form .field .fields .field:not(:only-child) .ui.checkbox {\n  margin-top: 0.6em;\n}\n.ui.ui.form .field .fields .field:not(:only-child) .ui.toggle.checkbox {\n  margin-top: 0.5em;\n}\n.ui.ui.form .field .fields .field:not(:only-child) .ui.slider.checkbox {\n  margin-top: 0.7em;\n}\n\n/* --------------------\n          Transparent\n    --------------------- */\n.ui.form .field .transparent.input:not(.icon) input,\n.ui.form .field input.transparent,\n.ui.form .field textarea.transparent {\n  padding: 0.67857143em 1em;\n}\n.ui.form .field input.transparent,\n.ui.form .field textarea.transparent {\n  border-color: transparent !important;\n  background-color: transparent !important;\n  box-shadow: none !important;\n}\n\n/* --------------------------\n  Input w/ attached Button\n--------------------------- */\n.ui.form input.attached {\n  width: auto;\n}\n\n/* --------------------\n     Basic Select\n--------------------- */\n.ui.form select {\n  display: block;\n  height: auto;\n  width: 100%;\n  background: #fff;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  border-radius: 0.28571429rem;\n  box-shadow: 0 0 0 0 transparent inset;\n  padding: 0.62em 1em;\n  color: rgba(0, 0, 0, 0.87);\n  transition: color 0.1s ease, border-color 0.1s ease;\n}\n\n/* --------------------\n       Dropdown\n--------------------- */\n\n/* Block */\n.ui.form .field > .selection.dropdown:not(.compact) {\n  min-width: auto;\n  width: 100%;\n}\n.ui.form .field > .selection.dropdown > .dropdown.icon {\n  float: right;\n}\n\n/* Inline */\n.ui.form .inline.fields .field > .selection.dropdown,\n.ui.form .inline.field > .selection.dropdown {\n  width: auto;\n}\n.ui.form .inline.fields .field > .selection.dropdown > .dropdown.icon,\n.ui.form .inline.field > .selection.dropdown > .dropdown.icon {\n  float: none;\n}\n\n/* --------------------\n       UI Input\n--------------------- */\n\n/* Block */\n.ui.form .field .ui.input,\n.ui.form .fields .field .ui.input,\n.ui.form .wide.field .ui.input {\n  width: 100%;\n}\n\n/* Inline */\n.ui.form .inline.fields .field:not(.wide) .ui.input,\n.ui.form .inline.field:not(.wide) .ui.input {\n  width: auto;\n  vertical-align: middle;\n}\n\n/* Auto Input */\n.ui.form .fields .field .ui.input input,\n.ui.form .fields .field .ui.input textarea,\n.ui.form .field .ui.input input,\n.ui.form .field .ui.input textarea {\n  width: 100%;\n}\n\n/* Full Width Input */\n.ui.form .ten.fields .ui.input input,\n.ui.form .nine.fields .ui.input input,\n.ui.form .eight.fields .ui.input input,\n.ui.form .seven.fields .ui.input input,\n.ui.form .six.fields .ui.input input,\n.ui.form .five.fields .ui.input input,\n.ui.form .four.fields .ui.input input,\n.ui.form .three.fields .ui.input input,\n.ui.form .two.fields .ui.input input,\n.ui.form .wide.field .ui.input input {\n  flex: 1 0 auto;\n  width: 0;\n}\n\n/* --------------------\n   Types of Messages\n--------------------- */\n.ui.form .error.message,\n.ui.form .error.message:empty {\n  display: none;\n}\n.ui.form .info.message,\n.ui.form .info.message:empty {\n  display: none;\n}\n.ui.form .success.message,\n.ui.form .success.message:empty {\n  display: none;\n}\n.ui.form .warning.message,\n.ui.form .warning.message:empty {\n  display: none;\n}\n\n/* Assumptions */\n.ui.form .message:first-child {\n  margin-top: 0;\n}\n\n/* --------------------\n   Validation Prompt\n--------------------- */\n.ui.form .field .prompt.label {\n  white-space: normal;\n  background: #fff !important;\n  border: 1px solid #e0b4b4 !important;\n  color: #9f3a38 !important;\n}\n.ui.form .field .prompt.label li::before {\n  color: #9f3a38;\n}\n.ui.form .inline.fields .field .prompt,\n.ui.form .inline.field .prompt {\n  vertical-align: top;\n  margin: -0.25em 0 -0.5em 0.5em;\n}\n.ui.form .inline.fields .field .prompt::before,\n.ui.form .inline.field .prompt::before {\n  border-width: 0 0 1px 1px;\n  bottom: auto;\n  right: auto;\n  top: 50%;\n  left: 0;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------------\n      Autofilled\n--------------------- */\n.ui.form .field.field input:-webkit-autofill {\n  box-shadow: 0 0 0 100px #fffff0 inset !important;\n  border-color: #e5dfa1 !important;\n}\n\n/* Focus */\n.ui.form .field.field input:-webkit-autofill:focus {\n  box-shadow: 0 0 0 100px #fffff0 inset !important;\n  border-color: #d5c315 !important;\n}\n\n/* --------------------\n      Placeholder\n--------------------- */\n\n/* browsers require these rules separate */\n.ui.form :-ms-input-placeholder {\n  color: rgba(191, 191, 191, 0.87);\n}\n.ui.form ::-ms-input-placeholder {\n  color: rgba(191, 191, 191, 0.87);\n}\n.ui.form ::placeholder {\n  color: rgba(191, 191, 191, 0.87);\n}\n.ui.form :-ms-input-placeholder {\n  color: rgba(191, 191, 191, 0.87) !important;\n}\n.ui.form :focus:-ms-input-placeholder {\n  color: rgba(115, 115, 115, 0.87);\n}\n.ui.form :focus::-ms-input-placeholder {\n  color: rgba(115, 115, 115, 0.87);\n}\n.ui.form :focus::placeholder {\n  color: rgba(115, 115, 115, 0.87);\n}\n.ui.form :focus:-ms-input-placeholder {\n  color: rgba(115, 115, 115, 0.87) !important;\n}\n\n/* --------------------\n        Focus\n--------------------- */\n.ui.form input:not([type]):focus,\n.ui.form input[type=\"color\"]:focus,\n.ui.form input[type=\"date\"]:focus,\n.ui.form input[type=\"datetime-local\"]:focus,\n.ui.form input[type=\"email\"]:focus,\n.ui.form input[type=\"month\"]:focus,\n.ui.form input[type=\"number\"]:focus,\n.ui.form input[type=\"password\"]:focus,\n.ui.form input[type=\"search\"]:focus,\n.ui.form input[type=\"tel\"]:focus,\n.ui.form input[type=\"time\"]:focus,\n.ui.form input[type=\"text\"]:focus,\n.ui.form input[type=\"file\"]:focus,\n.ui.form input[type=\"url\"]:focus,\n.ui.form input[type=\"week\"]:focus {\n  color: rgba(0, 0, 0, 0.95);\n  border-color: #85b7d9;\n  border-radius: 0.28571429rem;\n  background: #fff;\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.35) inset;\n}\n.ui.form .ui.action.input:not([class*=\"left action\"]) input:not([type]):focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"color\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"date\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"datetime-local\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"email\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"month\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"number\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"password\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"search\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"tel\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"time\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"text\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"file\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"url\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) input[type=\"week\"]:focus,\n.ui.form .ui.action.input:not([class*=\"left action\"]) textarea:focus {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.form .ui[class*=\"left action\"].input input:not([type]),\n.ui.form .ui[class*=\"left action\"].input input[type=\"color\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"date\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"datetime-local\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"email\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"month\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"number\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"password\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"search\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"tel\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"time\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"text\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"file\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"url\"],\n.ui.form .ui[class*=\"left action\"].input input[type=\"week\"],\n.ui.form .ui[class*=\"left action\"].input textarea {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.ui.form textarea:focus {\n  color: rgba(0, 0, 0, 0.95);\n  border-color: #85b7d9;\n  border-radius: 0.28571429rem;\n  background: #fff;\n  box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.35) inset;\n  -webkit-appearance: none;\n}\n\n/* Focus */\n.ui.form input:focus::-webkit-calendar-picker-indicator {\n  opacity: 1;\n}\n\n/* --------------------\n            States\n    --------------------- */\n\n/* On Form */\n.ui.form.error .error.message:not(:empty) {\n  display: block;\n}\n.ui.form.error .compact.error.message:not(:empty) {\n  display: inline-block;\n}\n.ui.form.error .icon.error.message:not(:empty) {\n  display: flex;\n}\n\n/* On Field(s) */\n.ui.form .fields.error .error.message:not(:empty),\n.ui.form .field.error .error.message:not(:empty) {\n  display: block;\n}\n.ui.form .fields.error .compact.error.message:not(:empty),\n.ui.form .field.error .compact.error.message:not(:empty) {\n  display: inline-block;\n}\n.ui.form .fields.error .icon.error.message:not(:empty),\n.ui.form .field.error .icon.error.message:not(:empty) {\n  display: flex;\n}\n.ui.ui.form .fields.error .field label,\n.ui.ui.form .fields.error .field .ui.label:not(.corner),\n.ui.ui.form .field.error label,\n.ui.ui.form .field.error .ui.label:not(.corner),\n.ui.ui.form .fields.error .field .input,\n.ui.ui.form .field.error .input {\n  color: #9f3a38;\n}\n@supports selector(:has(.f)) {\n  .ui.form .fields:has(.error) > label {\n    color: #9f3a38;\n  }\n}\n.ui.form .fields.error .field .ui.label,\n.ui.form .field.error .ui.label {\n  background-color: #ecd1d1;\n}\n.ui.form .fields.error .field .corner.label,\n.ui.form .field.error .corner.label {\n  border-color: #9f3a38;\n  color: #fff;\n}\n.ui.form .fields.error .field textarea,\n.ui.form .fields.error .field select,\n.ui.form .fields.error .field input:not([type]),\n.ui.form .fields.error .field input[type=\"color\"],\n.ui.form .fields.error .field input[type=\"date\"],\n.ui.form .fields.error .field input[type=\"datetime-local\"],\n.ui.form .fields.error .field input[type=\"email\"],\n.ui.form .fields.error .field input[type=\"month\"],\n.ui.form .fields.error .field input[type=\"number\"],\n.ui.form .fields.error .field input[type=\"password\"],\n.ui.form .fields.error .field input[type=\"search\"],\n.ui.form .fields.error .field input[type=\"tel\"],\n.ui.form .fields.error .field input[type=\"time\"],\n.ui.form .fields.error .field input[type=\"text\"],\n.ui.form .fields.error .field input[type=\"file\"],\n.ui.form .fields.error .field input[type=\"url\"],\n.ui.form .fields.error .field input[type=\"week\"],\n.ui.form .field.error textarea,\n.ui.form .field.error select,\n.ui.form .field.error input:not([type]),\n.ui.form .field.error input[type=\"color\"],\n.ui.form .field.error input[type=\"date\"],\n.ui.form .field.error input[type=\"datetime-local\"],\n.ui.form .field.error input[type=\"email\"],\n.ui.form .field.error input[type=\"month\"],\n.ui.form .field.error input[type=\"number\"],\n.ui.form .field.error input[type=\"password\"],\n.ui.form .field.error input[type=\"search\"],\n.ui.form .field.error input[type=\"tel\"],\n.ui.form .field.error input[type=\"time\"],\n.ui.form .field.error input[type=\"text\"],\n.ui.form .field.error input[type=\"file\"],\n.ui.form .field.error input[type=\"url\"],\n.ui.form .field.error input[type=\"week\"] {\n  color: #9f3a38;\n  background: #fff6f6;\n  border-color: #e0b4b4;\n  border-radius: \"\";\n  box-shadow: none;\n}\n.ui.form:not(.initial) .field input:invalid {\n  color: #9f3a38;\n  background: #fff6f6;\n  border-color: #e0b4b4;\n  border-radius: \"\";\n  box-shadow: none;\n}\n.ui.form .field.error textarea:focus,\n.ui.form .field.error select:focus,\n.ui.form .field.error input:not([type]):focus,\n.ui.form .field.error input[type=\"color\"]:focus,\n.ui.form .field.error input[type=\"date\"]:focus,\n.ui.form .field.error input[type=\"datetime-local\"]:focus,\n.ui.form .field.error input[type=\"email\"]:focus,\n.ui.form .field.error input[type=\"month\"]:focus,\n.ui.form .field.error input[type=\"number\"]:focus,\n.ui.form .field.error input[type=\"password\"]:focus,\n.ui.form .field.error input[type=\"search\"]:focus,\n.ui.form .field.error input[type=\"tel\"]:focus,\n.ui.form .field.error input[type=\"time\"]:focus,\n.ui.form .field.error input[type=\"text\"]:focus,\n.ui.form .field.error input[type=\"file\"]:focus,\n.ui.form .field.error input[type=\"url\"]:focus,\n.ui.form .field.error input[type=\"week\"]:focus {\n  background: #fff6f6;\n  border-color: #e0b4b4;\n  color: #9f3a38;\n  box-shadow: none;\n}\n.ui.form .field.error > textarea:hover:not(:focus),\n.ui.form .field.error > input:hover:not(:focus) {\n  border-color: #e0b4b4;\n}\n\n/* Preserve Native Select Stylings */\n.ui.form .field.error select {\n  -webkit-appearance: menulist-button;\n}\n\n/*------------------\n            Input State\n        --------------------*/\n\n\n/* Transparent */\n.ui.form .field.error .transparent.input input,\n.ui.form .field.error .transparent.input textarea,\n.ui.form .field.error input.transparent,\n.ui.form .field.error textarea.transparent {\n  background-color: #fff6f6 !important;\n  color: #9f3a38 !important;\n}\n\n/* Autofilled */\n.ui.form .error.error input:-webkit-autofill {\n  box-shadow: 0 0 0 100px #fffaf0 inset !important;\n  border-color: #e0b4b4 !important;\n}\n\n/* Placeholder */\n.ui.form .error :-ms-input-placeholder {\n  color: #e7bdbc;\n}\n.ui.form .error ::-ms-input-placeholder {\n  color: #e7bdbc;\n}\n.ui.form .error .ui.dropdown > .default.text,\n.ui.form .error ::placeholder {\n  color: #e7bdbc;\n}\n.ui.form .error :-ms-input-placeholder {\n  color: #e7bdbc !important;\n}\n.ui.form .error :focus:-ms-input-placeholder {\n  color: #da9796;\n}\n.ui.form .error :focus::-ms-input-placeholder {\n  color: #da9796;\n}\n.ui.form .error .ui.dropdown > input:focus ~ .default.text,\n.ui.form .error :focus::placeholder {\n  color: #da9796;\n}\n.ui.form .error :focus:-ms-input-placeholder {\n  color: #da9796 !important;\n}\n\n/*------------------\n            Dropdown State\n        --------------------*/\n\n.ui.form .fields.error .field .ui.dropdown,\n.ui.form .fields.error .field .ui.dropdown .item,\n.ui.form .field.error .ui.dropdown,\n.ui.form .field.error .ui.dropdown > .text,\n.ui.form .field.error .ui.dropdown .item {\n  background: #fff6f6;\n  color: #9f3a38;\n}\n.ui.form .fields.error .field .ui.dropdown,\n.ui.form .field.error .ui.dropdown {\n  border-color: #e0b4b4 !important;\n}\n.ui.form .fields.error .field .ui.dropdown:hover,\n.ui.form .field.error .ui.dropdown:hover {\n  border-color: #e0b4b4 !important;\n}\n.ui.form .fields.error .field .ui.dropdown:hover .menu,\n.ui.form .field.error .ui.dropdown:hover .menu {\n  border-color: #e0b4b4;\n}\n.ui.form .fields.error .field .ui.multiple.selection.dropdown > .label,\n.ui.form .field.error .ui.multiple.selection.dropdown > .label {\n  background-color: #eacbcb;\n  color: #9f3a38;\n}\n\n/* Hover */\n.ui.form .fields.error .field .ui.dropdown .menu .item:hover,\n.ui.form .field.error .ui.dropdown .menu .item:hover {\n  background-color: #fbe7e7;\n}\n\n/* Selected */\n.ui.form .fields.error .field .ui.dropdown .menu .selected.item,\n.ui.form .field.error .ui.dropdown .menu .selected.item {\n  background-color: #fbe7e7;\n}\n\n/* Active */\n.ui.form .fields.error .field .ui.dropdown .menu .active.item,\n.ui.form .field.error .ui.dropdown .menu .active.item {\n  background-color: #fdcfcf !important;\n}\n\n/*--------------------\n            Checkbox State\n        ---------------------*/\n\n.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label,\n.ui.form .field.error .checkbox:not(.toggle):not(.slider) label {\n  color: #9f3a38;\n}\n.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label::before,\n.ui.form .field.error .checkbox:not(.toggle):not(.slider) label::before {\n  background: #fff6f6;\n  border-color: #e0b4b4;\n}\n.ui.form .fields.error .field .checkbox label::after,\n.ui.form .field.error .checkbox label::after {\n  color: #9f3a38;\n}\n.ui.inverted.form .fields.error .field label,\n.ui.inverted.form .error.field label {\n  color: #ecd1d1;\n}\n@supports selector(:has(.f)) {\n  .ui.inverted.form .fields:has(.error) > label {\n    color: #ecd1d1;\n  }\n}\n\n/* On Form */\n.ui.form.info .info.message:not(:empty) {\n  display: block;\n}\n.ui.form.info .compact.info.message:not(:empty) {\n  display: inline-block;\n}\n.ui.form.info .icon.info.message:not(:empty) {\n  display: flex;\n}\n\n/* On Field(s) */\n.ui.form .fields.info .info.message:not(:empty),\n.ui.form .field.info .info.message:not(:empty) {\n  display: block;\n}\n.ui.form .fields.info .compact.info.message:not(:empty),\n.ui.form .field.info .compact.info.message:not(:empty) {\n  display: inline-block;\n}\n.ui.form .fields.info .icon.info.message:not(:empty),\n.ui.form .field.info .icon.info.message:not(:empty) {\n  display: flex;\n}\n.ui.ui.form .fields.info .field label,\n.ui.ui.form .fields.info .field .ui.label:not(.corner),\n.ui.ui.form .field.info label,\n.ui.ui.form .field.info .ui.label:not(.corner),\n.ui.ui.form .fields.info .field .input,\n.ui.ui.form .field.info .input {\n  color: #276f86;\n}\n@supports selector(:has(.f)) {\n  .ui.form .fields:has(.info) > label {\n    color: #276f86;\n  }\n}\n.ui.form .fields.info .field .ui.label,\n.ui.form .field.info .ui.label {\n  background-color: #c6e3e9;\n}\n.ui.form .fields.info .field .corner.label,\n.ui.form .field.info .corner.label {\n  border-color: #276f86;\n  color: #fff;\n}\n.ui.form .fields.info .field textarea,\n.ui.form .fields.info .field select,\n.ui.form .fields.info .field input:not([type]),\n.ui.form .fields.info .field input[type=\"color\"],\n.ui.form .fields.info .field input[type=\"date\"],\n.ui.form .fields.info .field input[type=\"datetime-local\"],\n.ui.form .fields.info .field input[type=\"email\"],\n.ui.form .fields.info .field input[type=\"month\"],\n.ui.form .fields.info .field input[type=\"number\"],\n.ui.form .fields.info .field input[type=\"password\"],\n.ui.form .fields.info .field input[type=\"search\"],\n.ui.form .fields.info .field input[type=\"tel\"],\n.ui.form .fields.info .field input[type=\"time\"],\n.ui.form .fields.info .field input[type=\"text\"],\n.ui.form .fields.info .field input[type=\"file\"],\n.ui.form .fields.info .field input[type=\"url\"],\n.ui.form .fields.info .field input[type=\"week\"],\n.ui.form .field.info textarea,\n.ui.form .field.info select,\n.ui.form .field.info input:not([type]),\n.ui.form .field.info input[type=\"color\"],\n.ui.form .field.info input[type=\"date\"],\n.ui.form .field.info input[type=\"datetime-local\"],\n.ui.form .field.info input[type=\"email\"],\n.ui.form .field.info input[type=\"month\"],\n.ui.form .field.info input[type=\"number\"],\n.ui.form .field.info input[type=\"password\"],\n.ui.form .field.info input[type=\"search\"],\n.ui.form .field.info input[type=\"tel\"],\n.ui.form .field.info input[type=\"time\"],\n.ui.form .field.info input[type=\"text\"],\n.ui.form .field.info input[type=\"file\"],\n.ui.form .field.info input[type=\"url\"],\n.ui.form .field.info input[type=\"week\"] {\n  color: #276f86;\n  background: #f8ffff;\n  border-color: #a9d5de;\n  border-radius: \"\";\n  box-shadow: none;\n}\n.ui.form .field.info textarea:focus,\n.ui.form .field.info select:focus,\n.ui.form .field.info input:not([type]):focus,\n.ui.form .field.info input[type=\"color\"]:focus,\n.ui.form .field.info input[type=\"date\"]:focus,\n.ui.form .field.info input[type=\"datetime-local\"]:focus,\n.ui.form .field.info input[type=\"email\"]:focus,\n.ui.form .field.info input[type=\"month\"]:focus,\n.ui.form .field.info input[type=\"number\"]:focus,\n.ui.form .field.info input[type=\"password\"]:focus,\n.ui.form .field.info input[type=\"search\"]:focus,\n.ui.form .field.info input[type=\"tel\"]:focus,\n.ui.form .field.info input[type=\"time\"]:focus,\n.ui.form .field.info input[type=\"text\"]:focus,\n.ui.form .field.info input[type=\"file\"]:focus,\n.ui.form .field.info input[type=\"url\"]:focus,\n.ui.form .field.info input[type=\"week\"]:focus {\n  background: #f8ffff;\n  border-color: #a9d5de;\n  color: #276f86;\n  box-shadow: none;\n}\n.ui.form .field.info > textarea:hover:not(:focus),\n.ui.form .field.info > input:hover:not(:focus) {\n  border-color: #a9d5de;\n}\n\n/* Preserve Native Select Stylings */\n.ui.form .field.info select {\n  -webkit-appearance: menulist-button;\n}\n\n/*------------------\n            Input State\n        --------------------*/\n\n\n/* Transparent */\n.ui.form .field.info .transparent.input input,\n.ui.form .field.info .transparent.input textarea,\n.ui.form .field.info input.transparent,\n.ui.form .field.info textarea.transparent {\n  background-color: #f8ffff !important;\n  color: #276f86 !important;\n}\n\n/* Autofilled */\n.ui.form .info.info input:-webkit-autofill {\n  box-shadow: 0 0 0 100px #f0faff inset !important;\n  border-color: #b3e0e0 !important;\n}\n\n/* Placeholder */\n.ui.form .info :-ms-input-placeholder {\n  color: #98cfe1;\n}\n.ui.form .info ::-ms-input-placeholder {\n  color: #98cfe1;\n}\n.ui.form .info .ui.dropdown > .default.text,\n.ui.form .info ::placeholder {\n  color: #98cfe1;\n}\n.ui.form .info :-ms-input-placeholder {\n  color: #98cfe1 !important;\n}\n.ui.form .info :focus:-ms-input-placeholder {\n  color: #70bdd6;\n}\n.ui.form .info :focus::-ms-input-placeholder {\n  color: #70bdd6;\n}\n.ui.form .info .ui.dropdown > input:focus ~ .default.text,\n.ui.form .info :focus::placeholder {\n  color: #70bdd6;\n}\n.ui.form .info :focus:-ms-input-placeholder {\n  color: #70bdd6 !important;\n}\n\n/*------------------\n            Dropdown State\n        --------------------*/\n\n.ui.form .fields.info .field .ui.dropdown,\n.ui.form .fields.info .field .ui.dropdown .item,\n.ui.form .field.info .ui.dropdown,\n.ui.form .field.info .ui.dropdown > .text,\n.ui.form .field.info .ui.dropdown .item {\n  background: #f8ffff;\n  color: #276f86;\n}\n.ui.form .fields.info .field .ui.dropdown,\n.ui.form .field.info .ui.dropdown {\n  border-color: #a9d5de !important;\n}\n.ui.form .fields.info .field .ui.dropdown:hover,\n.ui.form .field.info .ui.dropdown:hover {\n  border-color: #a9d5de !important;\n}\n.ui.form .fields.info .field .ui.dropdown:hover .menu,\n.ui.form .field.info .ui.dropdown:hover .menu {\n  border-color: #a9d5de;\n}\n.ui.form .fields.info .field .ui.multiple.selection.dropdown > .label,\n.ui.form .field.info .ui.multiple.selection.dropdown > .label {\n  background-color: #cce3ea;\n  color: #276f86;\n}\n\n/* Hover */\n.ui.form .fields.info .field .ui.dropdown .menu .item:hover,\n.ui.form .field.info .ui.dropdown .menu .item:hover {\n  background-color: #e9f2fb;\n}\n\n/* Selected */\n.ui.form .fields.info .field .ui.dropdown .menu .selected.item,\n.ui.form .field.info .ui.dropdown .menu .selected.item {\n  background-color: #e9f2fb;\n}\n\n/* Active */\n.ui.form .fields.info .field .ui.dropdown .menu .active.item,\n.ui.form .field.info .ui.dropdown .menu .active.item {\n  background-color: #cef1fd !important;\n}\n\n/*--------------------\n            Checkbox State\n        ---------------------*/\n\n.ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) label,\n.ui.form .field.info .checkbox:not(.toggle):not(.slider) label {\n  color: #276f86;\n}\n.ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) label::before,\n.ui.form .field.info .checkbox:not(.toggle):not(.slider) label::before {\n  background: #f8ffff;\n  border-color: #a9d5de;\n}\n.ui.form .fields.info .field .checkbox label::after,\n.ui.form .field.info .checkbox label::after {\n  color: #276f86;\n}\n.ui.inverted.form .fields.info .field label,\n.ui.inverted.form .info.field label {\n  color: #c6e3e9;\n}\n@supports selector(:has(.f)) {\n  .ui.inverted.form .fields:has(.info) > label {\n    color: #c6e3e9;\n  }\n}\n\n/* On Form */\n.ui.form.success .success.message:not(:empty) {\n  display: block;\n}\n.ui.form.success .compact.success.message:not(:empty) {\n  display: inline-block;\n}\n.ui.form.success .icon.success.message:not(:empty) {\n  display: flex;\n}\n\n/* On Field(s) */\n.ui.form .fields.success .success.message:not(:empty),\n.ui.form .field.success .success.message:not(:empty) {\n  display: block;\n}\n.ui.form .fields.success .compact.success.message:not(:empty),\n.ui.form .field.success .compact.success.message:not(:empty) {\n  display: inline-block;\n}\n.ui.form .fields.success .icon.success.message:not(:empty),\n.ui.form .field.success .icon.success.message:not(:empty) {\n  display: flex;\n}\n.ui.ui.form .fields.success .field label,\n.ui.ui.form .fields.success .field .ui.label:not(.corner),\n.ui.ui.form .field.success label,\n.ui.ui.form .field.success .ui.label:not(.corner),\n.ui.ui.form .fields.success .field .input,\n.ui.ui.form .field.success .input {\n  color: #2c662d;\n}\n@supports selector(:has(.f)) {\n  .ui.form .fields:has(.success) > label {\n    color: #2c662d;\n  }\n}\n.ui.form .fields.success .field .ui.label,\n.ui.form .field.success .ui.label {\n  background-color: #b9d1ad;\n}\n.ui.form .fields.success .field .corner.label,\n.ui.form .field.success .corner.label {\n  border-color: #2c662d;\n  color: #fff;\n}\n.ui.form .fields.success .field textarea,\n.ui.form .fields.success .field select,\n.ui.form .fields.success .field input:not([type]),\n.ui.form .fields.success .field input[type=\"color\"],\n.ui.form .fields.success .field input[type=\"date\"],\n.ui.form .fields.success .field input[type=\"datetime-local\"],\n.ui.form .fields.success .field input[type=\"email\"],\n.ui.form .fields.success .field input[type=\"month\"],\n.ui.form .fields.success .field input[type=\"number\"],\n.ui.form .fields.success .field input[type=\"password\"],\n.ui.form .fields.success .field input[type=\"search\"],\n.ui.form .fields.success .field input[type=\"tel\"],\n.ui.form .fields.success .field input[type=\"time\"],\n.ui.form .fields.success .field input[type=\"text\"],\n.ui.form .fields.success .field input[type=\"file\"],\n.ui.form .fields.success .field input[type=\"url\"],\n.ui.form .fields.success .field input[type=\"week\"],\n.ui.form .field.success textarea,\n.ui.form .field.success select,\n.ui.form .field.success input:not([type]),\n.ui.form .field.success input[type=\"color\"],\n.ui.form .field.success input[type=\"date\"],\n.ui.form .field.success input[type=\"datetime-local\"],\n.ui.form .field.success input[type=\"email\"],\n.ui.form .field.success input[type=\"month\"],\n.ui.form .field.success input[type=\"number\"],\n.ui.form .field.success input[type=\"password\"],\n.ui.form .field.success input[type=\"search\"],\n.ui.form .field.success input[type=\"tel\"],\n.ui.form .field.success input[type=\"time\"],\n.ui.form .field.success input[type=\"text\"],\n.ui.form .field.success input[type=\"file\"],\n.ui.form .field.success input[type=\"url\"],\n.ui.form .field.success input[type=\"week\"] {\n  color: #2c662d;\n  background: #fcfff5;\n  border-color: #a3c293;\n  border-radius: \"\";\n  box-shadow: none;\n}\n.ui.form .field.success textarea:focus,\n.ui.form .field.success select:focus,\n.ui.form .field.success input:not([type]):focus,\n.ui.form .field.success input[type=\"color\"]:focus,\n.ui.form .field.success input[type=\"date\"]:focus,\n.ui.form .field.success input[type=\"datetime-local\"]:focus,\n.ui.form .field.success input[type=\"email\"]:focus,\n.ui.form .field.success input[type=\"month\"]:focus,\n.ui.form .field.success input[type=\"number\"]:focus,\n.ui.form .field.success input[type=\"password\"]:focus,\n.ui.form .field.success input[type=\"search\"]:focus,\n.ui.form .field.success input[type=\"tel\"]:focus,\n.ui.form .field.success input[type=\"time\"]:focus,\n.ui.form .field.success input[type=\"text\"]:focus,\n.ui.form .field.success input[type=\"file\"]:focus,\n.ui.form .field.success input[type=\"url\"]:focus,\n.ui.form .field.success input[type=\"week\"]:focus {\n  background: #fcfff5;\n  border-color: #a3c293;\n  color: #2c662d;\n  box-shadow: none;\n}\n.ui.form .field.success > textarea:hover:not(:focus),\n.ui.form .field.success > input:hover:not(:focus) {\n  border-color: #a3c293;\n}\n\n/* Preserve Native Select Stylings */\n.ui.form .field.success select {\n  -webkit-appearance: menulist-button;\n}\n\n/*------------------\n            Input State\n        --------------------*/\n\n\n/* Transparent */\n.ui.form .field.success .transparent.input input,\n.ui.form .field.success .transparent.input textarea,\n.ui.form .field.success input.transparent,\n.ui.form .field.success textarea.transparent {\n  background-color: #fcfff5 !important;\n  color: #2c662d !important;\n}\n\n/* Autofilled */\n.ui.form .success.success input:-webkit-autofill {\n  box-shadow: 0 0 0 100px #f0fff0 inset !important;\n  border-color: #bee0b3 !important;\n}\n\n/* Placeholder */\n.ui.form .success :-ms-input-placeholder {\n  color: #8fcf90;\n}\n.ui.form .success ::-ms-input-placeholder {\n  color: #8fcf90;\n}\n.ui.form .success .ui.dropdown > .default.text,\n.ui.form .success ::placeholder {\n  color: #8fcf90;\n}\n.ui.form .success :-ms-input-placeholder {\n  color: #8fcf90 !important;\n}\n.ui.form .success :focus:-ms-input-placeholder {\n  color: #6cbf6d;\n}\n.ui.form .success :focus::-ms-input-placeholder {\n  color: #6cbf6d;\n}\n.ui.form .success .ui.dropdown > input:focus ~ .default.text,\n.ui.form .success :focus::placeholder {\n  color: #6cbf6d;\n}\n.ui.form .success :focus:-ms-input-placeholder {\n  color: #6cbf6d !important;\n}\n\n/*------------------\n            Dropdown State\n        --------------------*/\n\n.ui.form .fields.success .field .ui.dropdown,\n.ui.form .fields.success .field .ui.dropdown .item,\n.ui.form .field.success .ui.dropdown,\n.ui.form .field.success .ui.dropdown > .text,\n.ui.form .field.success .ui.dropdown .item {\n  background: #fcfff5;\n  color: #2c662d;\n}\n.ui.form .fields.success .field .ui.dropdown,\n.ui.form .field.success .ui.dropdown {\n  border-color: #a3c293 !important;\n}\n.ui.form .fields.success .field .ui.dropdown:hover,\n.ui.form .field.success .ui.dropdown:hover {\n  border-color: #a3c293 !important;\n}\n.ui.form .fields.success .field .ui.dropdown:hover .menu,\n.ui.form .field.success .ui.dropdown:hover .menu {\n  border-color: #a3c293;\n}\n.ui.form .fields.success .field .ui.multiple.selection.dropdown > .label,\n.ui.form .field.success .ui.multiple.selection.dropdown > .label {\n  background-color: #cceacc;\n  color: #2c662d;\n}\n\n/* Hover */\n.ui.form .fields.success .field .ui.dropdown .menu .item:hover,\n.ui.form .field.success .ui.dropdown .menu .item:hover {\n  background-color: #e9fbe9;\n}\n\n/* Selected */\n.ui.form .fields.success .field .ui.dropdown .menu .selected.item,\n.ui.form .field.success .ui.dropdown .menu .selected.item {\n  background-color: #e9fbe9;\n}\n\n/* Active */\n.ui.form .fields.success .field .ui.dropdown .menu .active.item,\n.ui.form .field.success .ui.dropdown .menu .active.item {\n  background-color: #dafdce !important;\n}\n\n/*--------------------\n            Checkbox State\n        ---------------------*/\n\n.ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) label,\n.ui.form .field.success .checkbox:not(.toggle):not(.slider) label {\n  color: #2c662d;\n}\n.ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) label::before,\n.ui.form .field.success .checkbox:not(.toggle):not(.slider) label::before {\n  background: #fcfff5;\n  border-color: #a3c293;\n}\n.ui.form .fields.success .field .checkbox label::after,\n.ui.form .field.success .checkbox label::after {\n  color: #2c662d;\n}\n.ui.inverted.form .fields.success .field label,\n.ui.inverted.form .success.field label {\n  color: #b9d1ad;\n}\n@supports selector(:has(.f)) {\n  .ui.inverted.form .fields:has(.success) > label {\n    color: #b9d1ad;\n  }\n}\n\n/* On Form */\n.ui.form.warning .warning.message:not(:empty) {\n  display: block;\n}\n.ui.form.warning .compact.warning.message:not(:empty) {\n  display: inline-block;\n}\n.ui.form.warning .icon.warning.message:not(:empty) {\n  display: flex;\n}\n\n/* On Field(s) */\n.ui.form .fields.warning .warning.message:not(:empty),\n.ui.form .field.warning .warning.message:not(:empty) {\n  display: block;\n}\n.ui.form .fields.warning .compact.warning.message:not(:empty),\n.ui.form .field.warning .compact.warning.message:not(:empty) {\n  display: inline-block;\n}\n.ui.form .fields.warning .icon.warning.message:not(:empty),\n.ui.form .field.warning .icon.warning.message:not(:empty) {\n  display: flex;\n}\n.ui.ui.form .fields.warning .field label,\n.ui.ui.form .fields.warning .field .ui.label:not(.corner),\n.ui.ui.form .field.warning label,\n.ui.ui.form .field.warning .ui.label:not(.corner),\n.ui.ui.form .fields.warning .field .input,\n.ui.ui.form .field.warning .input {\n  color: #573a08;\n}\n@supports selector(:has(.f)) {\n  .ui.form .fields:has(.warning) > label {\n    color: #573a08;\n  }\n}\n.ui.form .fields.warning .field .ui.label,\n.ui.form .field.warning .ui.label {\n  background-color: #d7ccb5;\n}\n.ui.form .fields.warning .field .corner.label,\n.ui.form .field.warning .corner.label {\n  border-color: #573a08;\n  color: #fff;\n}\n.ui.form .fields.warning .field textarea,\n.ui.form .fields.warning .field select,\n.ui.form .fields.warning .field input:not([type]),\n.ui.form .fields.warning .field input[type=\"color\"],\n.ui.form .fields.warning .field input[type=\"date\"],\n.ui.form .fields.warning .field input[type=\"datetime-local\"],\n.ui.form .fields.warning .field input[type=\"email\"],\n.ui.form .fields.warning .field input[type=\"month\"],\n.ui.form .fields.warning .field input[type=\"number\"],\n.ui.form .fields.warning .field input[type=\"password\"],\n.ui.form .fields.warning .field input[type=\"search\"],\n.ui.form .fields.warning .field input[type=\"tel\"],\n.ui.form .fields.warning .field input[type=\"time\"],\n.ui.form .fields.warning .field input[type=\"text\"],\n.ui.form .fields.warning .field input[type=\"file\"],\n.ui.form .fields.warning .field input[type=\"url\"],\n.ui.form .fields.warning .field input[type=\"week\"],\n.ui.form .field.warning textarea,\n.ui.form .field.warning select,\n.ui.form .field.warning input:not([type]),\n.ui.form .field.warning input[type=\"color\"],\n.ui.form .field.warning input[type=\"date\"],\n.ui.form .field.warning input[type=\"datetime-local\"],\n.ui.form .field.warning input[type=\"email\"],\n.ui.form .field.warning input[type=\"month\"],\n.ui.form .field.warning input[type=\"number\"],\n.ui.form .field.warning input[type=\"password\"],\n.ui.form .field.warning input[type=\"search\"],\n.ui.form .field.warning input[type=\"tel\"],\n.ui.form .field.warning input[type=\"time\"],\n.ui.form .field.warning input[type=\"text\"],\n.ui.form .field.warning input[type=\"file\"],\n.ui.form .field.warning input[type=\"url\"],\n.ui.form .field.warning input[type=\"week\"] {\n  color: #573a08;\n  background: #fffaf3;\n  border-color: #c9ba9b;\n  border-radius: \"\";\n  box-shadow: none;\n}\n.ui.form .field.warning textarea:focus,\n.ui.form .field.warning select:focus,\n.ui.form .field.warning input:not([type]):focus,\n.ui.form .field.warning input[type=\"color\"]:focus,\n.ui.form .field.warning input[type=\"date\"]:focus,\n.ui.form .field.warning input[type=\"datetime-local\"]:focus,\n.ui.form .field.warning input[type=\"email\"]:focus,\n.ui.form .field.warning input[type=\"month\"]:focus,\n.ui.form .field.warning input[type=\"number\"]:focus,\n.ui.form .field.warning input[type=\"password\"]:focus,\n.ui.form .field.warning input[type=\"search\"]:focus,\n.ui.form .field.warning input[type=\"tel\"]:focus,\n.ui.form .field.warning input[type=\"time\"]:focus,\n.ui.form .field.warning input[type=\"text\"]:focus,\n.ui.form .field.warning input[type=\"file\"]:focus,\n.ui.form .field.warning input[type=\"url\"]:focus,\n.ui.form .field.warning input[type=\"week\"]:focus {\n  background: #fffaf3;\n  border-color: #c9ba9b;\n  color: #573a08;\n  box-shadow: none;\n}\n.ui.form .field.warning > textarea:hover:not(:focus),\n.ui.form .field.warning > input:hover:not(:focus) {\n  border-color: #c9ba9b;\n}\n\n/* Preserve Native Select Stylings */\n.ui.form .field.warning select {\n  -webkit-appearance: menulist-button;\n}\n\n/*------------------\n            Input State\n        --------------------*/\n\n\n/* Transparent */\n.ui.form .field.warning .transparent.input input,\n.ui.form .field.warning .transparent.input textarea,\n.ui.form .field.warning input.transparent,\n.ui.form .field.warning textarea.transparent {\n  background-color: #fffaf3 !important;\n  color: #573a08 !important;\n}\n\n/* Autofilled */\n.ui.form .warning.warning input:-webkit-autofill {\n  box-shadow: 0 0 0 100px #ffffe0 inset !important;\n  border-color: #e0e0b3 !important;\n}\n\n/* Placeholder */\n.ui.form .warning :-ms-input-placeholder {\n  color: #edad3e;\n}\n.ui.form .warning ::-ms-input-placeholder {\n  color: #edad3e;\n}\n.ui.form .warning .ui.dropdown > .default.text,\n.ui.form .warning ::placeholder {\n  color: #edad3e;\n}\n.ui.form .warning :-ms-input-placeholder {\n  color: #edad3e !important;\n}\n.ui.form .warning :focus:-ms-input-placeholder {\n  color: #e39715;\n}\n.ui.form .warning :focus::-ms-input-placeholder {\n  color: #e39715;\n}\n.ui.form .warning .ui.dropdown > input:focus ~ .default.text,\n.ui.form .warning :focus::placeholder {\n  color: #e39715;\n}\n.ui.form .warning :focus:-ms-input-placeholder {\n  color: #e39715 !important;\n}\n\n/*------------------\n            Dropdown State\n        --------------------*/\n\n.ui.form .fields.warning .field .ui.dropdown,\n.ui.form .fields.warning .field .ui.dropdown .item,\n.ui.form .field.warning .ui.dropdown,\n.ui.form .field.warning .ui.dropdown > .text,\n.ui.form .field.warning .ui.dropdown .item {\n  background: #fffaf3;\n  color: #573a08;\n}\n.ui.form .fields.warning .field .ui.dropdown,\n.ui.form .field.warning .ui.dropdown {\n  border-color: #c9ba9b !important;\n}\n.ui.form .fields.warning .field .ui.dropdown:hover,\n.ui.form .field.warning .ui.dropdown:hover {\n  border-color: #c9ba9b !important;\n}\n.ui.form .fields.warning .field .ui.dropdown:hover .menu,\n.ui.form .field.warning .ui.dropdown:hover .menu {\n  border-color: #c9ba9b;\n}\n.ui.form .fields.warning .field .ui.multiple.selection.dropdown > .label,\n.ui.form .field.warning .ui.multiple.selection.dropdown > .label {\n  background-color: #eaeacc;\n  color: #573a08;\n}\n\n/* Hover */\n.ui.form .fields.warning .field .ui.dropdown .menu .item:hover,\n.ui.form .field.warning .ui.dropdown .menu .item:hover {\n  background-color: #fbfbe9;\n}\n\n/* Selected */\n.ui.form .fields.warning .field .ui.dropdown .menu .selected.item,\n.ui.form .field.warning .ui.dropdown .menu .selected.item {\n  background-color: #fbfbe9;\n}\n\n/* Active */\n.ui.form .fields.warning .field .ui.dropdown .menu .active.item,\n.ui.form .field.warning .ui.dropdown .menu .active.item {\n  background-color: #fdfdce !important;\n}\n\n/*--------------------\n            Checkbox State\n        ---------------------*/\n\n.ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) label,\n.ui.form .field.warning .checkbox:not(.toggle):not(.slider) label {\n  color: #573a08;\n}\n.ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) label::before,\n.ui.form .field.warning .checkbox:not(.toggle):not(.slider) label::before {\n  background: #fffaf3;\n  border-color: #c9ba9b;\n}\n.ui.form .fields.warning .field .checkbox label::after,\n.ui.form .field.warning .checkbox label::after {\n  color: #573a08;\n}\n.ui.inverted.form .fields.warning .field label,\n.ui.inverted.form .warning.field label {\n  color: #d7ccb5;\n}\n@supports selector(:has(.f)) {\n  .ui.inverted.form .fields:has(.warning) > label {\n    color: #d7ccb5;\n  }\n}\n\n/* --------------------\n           Disabled\n    --------------------- */\n.ui.form .disabled.fields .field,\n.ui.form .disabled.field,\n.ui.form .field :disabled {\n  pointer-events: none;\n  opacity: 0.45;\n}\n.ui.form .field.disabled > label,\n.ui.form .fields.disabled > label {\n  opacity: 0.45;\n}\n.ui.form .field.disabled :disabled {\n  opacity: 1;\n}\n\n/* --------------\n        Loading\n    --------------- */\n.ui.loading.form {\n  position: relative;\n  cursor: default;\n  pointer-events: none;\n}\n.ui.loading.form::before {\n  position: absolute;\n  content: \"\";\n  top: 0;\n  left: 0;\n  background: rgba(255, 255, 255, 0.8);\n  width: 100%;\n  height: 100%;\n  z-index: 100;\n}\n.ui.loading.form.segments::before {\n  border-radius: 0.28571429rem;\n}\n.ui.loading.form::after {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -1.5em 0 0 -1.5em;\n  width: 3em;\n  height: 3em;\n  animation: loader 0.6s infinite linear;\n  border: 0.2em solid #767676;\n  border-radius: 500rem;\n  box-shadow: 0 0 0 1px transparent;\n  visibility: visible;\n  z-index: 101;\n}\n\n\n/*******************************\n         Element Types\n*******************************/\n\n\n/* --------------------\n         Required Field\n    --------------------- */\n.ui.form .required.fields:not(.grouped):not(.inline) > .field > label::after,\n.ui.form .required.fields.inline > label::after,\n.ui.form .required.fields.grouped > label::after,\n.ui.form .required.field > label::after,\n.ui.form .required.fields:not(.grouped):not(.inline) > .field > .checkbox::after,\n.ui.form .required.field > .checkbox::after,\n.ui.form label.required::after {\n  margin: -0.2em 0 0 0.2em;\n  content: \"*\";\n  color: #db2828;\n}\n.ui.form .required.fields:not(.grouped):not(.inline) > .field > label::after,\n.ui.form .required.fields.inline > label::after,\n.ui.form .required.fields.grouped > label::after,\n.ui.form .required.field > label::after,\n.ui.form label.required::after {\n  display: inline-block;\n  vertical-align: top;\n}\n.ui.form .required.fields:not(.grouped):not(.inline) > .field > .checkbox::after,\n.ui.form .required.field > .checkbox::after {\n  position: absolute;\n  top: 0;\n  left: 100%;\n}\n.ui.ui.ui.ui.form .fields:not(.required) > label:empty::after,\n.ui.ui.ui.ui.form .fields:not(.grouped):not(.inline) > .field:not(.required) > label:empty::after {\n  content: \" \";\n  display: inline-block;\n}\n.ui.ui.ui.ui.form .inline.fields .field:not(.required) > label:empty {\n  display: none;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------------\n        Inverted Colors\n    --------------------- */\n.ui.inverted.form label,\n.ui.form .inverted.segment label,\n.ui.form .inverted.segment .ui.checkbox label,\n.ui.inverted.form .ui.checkbox label,\n.ui.inverted.form .grouped.fields > label,\n.ui.inverted.form .inline.fields > label,\n.ui.inverted.form .inline.fields .field > label,\n.ui.inverted.form .inline.fields .field > p,\n.ui.inverted.form .inline.field > label,\n.ui.inverted.form .inline.field > p {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.loading.form {\n  color: #fff;\n}\n.ui.inverted.loading.form::before {\n  background: rgba(0, 0, 0, 0.85);\n}\n\n/* Inverted Field */\n.ui.inverted.form input:not([type]),\n.ui.inverted.form input[type=\"color\"],\n.ui.inverted.form input[type=\"date\"],\n.ui.inverted.form input[type=\"datetime-local\"],\n.ui.inverted.form input[type=\"email\"],\n.ui.inverted.form input[type=\"month\"],\n.ui.inverted.form input[type=\"number\"],\n.ui.inverted.form input[type=\"password\"],\n.ui.inverted.form input[type=\"search\"],\n.ui.inverted.form input[type=\"tel\"],\n.ui.inverted.form input[type=\"time\"],\n.ui.inverted.form input[type=\"text\"],\n.ui.inverted.form input[type=\"file\"],\n.ui.inverted.form input[type=\"url\"],\n.ui.inverted.form input[type=\"week\"] {\n  background: #fff;\n  border-color: rgba(255, 255, 255, 0.1);\n  color: rgba(0, 0, 0, 0.87);\n  box-shadow: none;\n}\n\n/* --------------------\n         Field Groups\n    --------------------- */\n\n/* Grouped Vertically */\n.ui.form .grouped.fields {\n  display: block;\n  margin: 0 0 1em;\n}\n.ui.form .grouped.fields:last-child {\n  margin-bottom: 0;\n}\n.ui.form .grouped.fields > label {\n  margin: 0 0 0.28571429rem 0;\n  color: rgba(0, 0, 0, 0.87);\n  font-size: 0.92857143em;\n  font-weight: bold;\n  text-transform: none;\n}\n.ui.form .grouped.fields .field,\n.ui.form .grouped.inline.fields .field {\n  display: block;\n  margin: 0.5em 0;\n  padding: 0;\n}\n.ui.form .grouped.inline.fields .ui.checkbox {\n  margin-bottom: 0.4em;\n}\n\n/* --------------------\n        Fields\n--------------------- */\n\n/* Split fields */\n.ui.form .fields {\n  display: flex;\n  flex-direction: row;\n  margin: 0 -0.5em 1em;\n}\n.ui.form .fields > .field {\n  flex: 0 1 auto;\n  padding-left: 0.5em;\n  padding-right: 0.5em;\n}\n.ui.form .fields > .field:first-child {\n  border-left: none;\n  box-shadow: none;\n}\n\n/* Other Combinations */\n.ui.form .two.fields > .fields,\n.ui.form .two.fields > .field {\n  width: 50%;\n}\n.ui.form .three.fields > .fields,\n.ui.form .three.fields > .field {\n  width: 33.33333333%;\n}\n.ui.form .four.fields > .fields,\n.ui.form .four.fields > .field {\n  width: 25%;\n}\n.ui.form .five.fields > .fields,\n.ui.form .five.fields > .field {\n  width: 20%;\n}\n.ui.form .six.fields > .fields,\n.ui.form .six.fields > .field {\n  width: 16.66666667%;\n}\n.ui.form .seven.fields > .fields,\n.ui.form .seven.fields > .field {\n  width: 14.28571429%;\n}\n.ui.form .eight.fields > .fields,\n.ui.form .eight.fields > .field {\n  width: 12.5%;\n}\n.ui.form .nine.fields > .fields,\n.ui.form .nine.fields > .field {\n  width: 11.11111111%;\n}\n.ui.form .ten.fields > .fields,\n.ui.form .ten.fields > .field {\n  width: 10%;\n}\n\n/* Swap to full width on mobile */\n@media only screen and (max-width: 767.98px) {\n  .ui.form .fields {\n    flex-wrap: wrap;\n    margin-bottom: 0;\n  }\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .field {\n    width: 100%;\n    margin: 0 0 1em;\n  }\n}\n\n/* Sizing Combinations */\n.ui.form .fields .wide.field {\n  width: 6.25%;\n  padding-left: 0.5em;\n  padding-right: 0.5em;\n}\n.ui.form .one.wide.field {\n  width: 6.25%;\n}\n.ui.form .two.wide.field {\n  width: 12.5%;\n}\n.ui.form .three.wide.field {\n  width: 18.75%;\n}\n.ui.form .four.wide.field {\n  width: 25%;\n}\n.ui.form .five.wide.field {\n  width: 31.25%;\n}\n.ui.form .six.wide.field {\n  width: 37.5%;\n}\n.ui.form .seven.wide.field {\n  width: 43.75%;\n}\n.ui.form .eight.wide.field {\n  width: 50%;\n}\n.ui.form .nine.wide.field {\n  width: 56.25%;\n}\n.ui.form .ten.wide.field {\n  width: 62.5%;\n}\n.ui.form .eleven.wide.field {\n  width: 68.75%;\n}\n.ui.form .twelve.wide.field {\n  width: 75%;\n}\n.ui.form .thirteen.wide.field {\n  width: 81.25%;\n}\n.ui.form .fourteen.wide.field {\n  width: 87.5%;\n}\n.ui.form .fifteen.wide.field {\n  width: 93.75%;\n}\n.ui.form .sixteen.wide.field {\n  width: 100%;\n}\n\n/* --------------------\n     Equal Width\n--------------------- */\n.ui[class*=\"equal width\"].form .fields > .field,\n.ui.form [class*=\"equal width\"].fields > .field {\n  width: 100%;\n  flex: 1 1 auto;\n}\n\n/* --------------------\n        Inline Fields\n    --------------------- */\n.ui.form .inline.fields {\n  margin: 0 0 1em;\n  align-items: center;\n}\n.ui.form .inline.fields .field {\n  margin: 0;\n  padding: 0 1em 0 0;\n}\n\n/* Inline Label */\n.ui.form .inline.fields > label,\n.ui.form .inline.fields .field > label,\n.ui.form .inline.fields .field > p,\n.ui.form .inline.field > label,\n.ui.form .inline.field > p {\n  display: inline-block;\n  width: auto;\n  margin-top: 0;\n  margin-bottom: 0;\n  vertical-align: baseline;\n  font-size: 0.92857143em;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.87);\n  text-transform: none;\n}\n\n/* Grouped Inline Label */\n.ui.form .inline.fields > label {\n  margin: 0.03571em 1em 0 0;\n}\n\n/* Inline Input */\n.ui.form .inline.fields .field > input,\n.ui.form .inline.fields .field > select,\n.ui.form .inline.field > input,\n.ui.form .inline.field > select {\n  display: inline-block;\n  width: auto;\n  margin-top: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-size: 1em;\n}\n.ui.form .inline.fields .field .calendar:not(.popup),\n.ui.form .inline.field .calendar:not(.popup) {\n  display: inline-block;\n}\n.ui.form .inline.fields .field .calendar:not(.popup) > .input > input,\n.ui.form .inline.field .calendar:not(.popup) > .input > input {\n  width: 13.11em;\n}\n\n/* Label */\n.ui.form .inline.fields .field > :first-child,\n.ui.form .inline.field > :first-child {\n  margin: 0 0.85714286em 0 0;\n}\n.ui.form .inline.fields .field > :only-child,\n.ui.form .inline.field > :only-child {\n  margin: 0;\n}\n\n/* Wide */\n.ui.form .inline.fields .wide.field {\n  display: flex;\n  align-items: center;\n}\n.ui.form .inline.fields .wide.field > input,\n.ui.form .inline.fields .wide.field > select {\n  width: 100%;\n}\n\n/* --------------------\n        Sizes\n--------------------- */\n.ui.form,\n.ui.form .field .dropdown,\n.ui.form .field .dropdown .menu > .item {\n  font-size: 1rem;\n}\n.ui.mini.form,\n.ui.mini.form .field .dropdown,\n.ui.mini.form .field .dropdown .menu > .item {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.form,\n.ui.tiny.form .field .dropdown,\n.ui.tiny.form .field .dropdown .menu > .item {\n  font-size: 0.85714286rem;\n}\n.ui.small.form,\n.ui.small.form .field .dropdown,\n.ui.small.form .field .dropdown .menu > .item {\n  font-size: 0.92857143rem;\n}\n.ui.large.form,\n.ui.large.form .field .dropdown,\n.ui.large.form .field .dropdown .menu > .item {\n  font-size: 1.14285714rem;\n}\n.ui.big.form,\n.ui.big.form .field .dropdown,\n.ui.big.form .field .dropdown .menu > .item {\n  font-size: 1.28571429rem;\n}\n.ui.huge.form,\n.ui.huge.form .field .dropdown,\n.ui.huge.form .field .dropdown .menu > .item {\n  font-size: 1.42857143rem;\n}\n.ui.massive.form,\n.ui.massive.form .field .dropdown,\n.ui.massive.form .field .dropdown .menu > .item {\n  font-size: 1.71428571rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/form.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Form Validation\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.form = function (parameters) {\n        var\n            $allModules      = $(this),\n            $window        = $(window),\n\n            time             = Date.now(),\n            performance      = [],\n\n            query            = arguments[0],\n            methodInvoked    = typeof query === 'string',\n            queryArguments   = [].slice.call(arguments, 1),\n            returnedValue\n        ;\n        $allModules.each(function () {\n            var\n                $module     = $(this),\n                element     = this,\n\n                formErrors  = [],\n                formErrorsTracker = {},\n                keyHeldDown = false,\n\n                // set at run-time\n                $field,\n                $group,\n                $message,\n                $prompt,\n                $submit,\n                $clear,\n                $reset,\n\n                settings,\n                validation,\n\n                metadata,\n                selector,\n                className,\n                regExp,\n                error,\n\n                namespace,\n                moduleNamespace,\n                eventNamespace,\n                attachEventsSelector,\n                attachEventsAction,\n\n                submitting = false,\n                dirty = false,\n                history = ['clean', 'clean'],\n\n                instance,\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    // settings grabbed at run time\n                    module.get.settings();\n                    $module.addClass(className.initial);\n                    if (methodInvoked) {\n                        if (instance === undefined) {\n                            module.instantiate();\n                        }\n                        module.invoke(query);\n                    } else {\n                        if (instance !== undefined) {\n                            instance.invoke('destroy');\n                            module.refresh();\n                        }\n                        module.verbose('Initializing form validation', $module, settings);\n                        module.bindEvents();\n                        module.set.defaults();\n                        if (settings.autoCheckRequired) {\n                            module.set.autoCheck();\n                        }\n                        module.instantiate();\n                    }\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous module', instance);\n                    module.removeEvents();\n                    $module\n                        .removeData(moduleNamespace)\n                    ;\n                },\n\n                refresh: function () {\n                    module.verbose('Refreshing selector cache');\n                    $field = $module.find(selector.field);\n                    $group = $module.find(selector.group);\n                    $message = $module.find(selector.message);\n                    $prompt = $module.find(selector.prompt);\n\n                    $submit = $module.find(selector.submit);\n                    $clear = $module.find(selector.clear);\n                    $reset = $module.find(selector.reset);\n                },\n\n                refreshEvents: function () {\n                    module.removeEvents();\n                    module.bindEvents();\n                },\n\n                submit: function (event) {\n                    module.verbose('Submitting form', $module);\n                    submitting = true;\n                    $module.trigger('submit');\n                    if (event) {\n                        event.preventDefault();\n                    }\n                },\n\n                attachEvents: function (selector, action) {\n                    if (!action) {\n                        action = 'submit';\n                    }\n\n                    $(selector).on('click' + eventNamespace, function (event) {\n                        module[action]();\n                        event.preventDefault();\n                    });\n\n                    attachEventsSelector = selector;\n                    attachEventsAction = action;\n                },\n\n                bindEvents: function () {\n                    module.verbose('Attaching form events');\n                    $module\n                        .on('submit' + eventNamespace, module.validate.form)\n                        .on('blur' + eventNamespace, selector.field, module.event.field.blur)\n                        .on('click' + eventNamespace, selector.submit, module.submit)\n                        .on('click' + eventNamespace, selector.reset, module.reset)\n                        .on('click' + eventNamespace, selector.clear, module.clear)\n                    ;\n                    $field.on('invalid' + eventNamespace, module.event.field.invalid);\n                    if (settings.keyboardShortcuts) {\n                        $module.on('keydown' + eventNamespace, selector.field, module.event.field.keydown);\n                    }\n                    $field.each(function (index, el) {\n                        var\n                            $input     = $(el),\n                            type       = $input.prop('type'),\n                            inputEvent = module.get.changeEvent(type, $input)\n                        ;\n                        $input.on(inputEvent + eventNamespace, module.event.field.change);\n                    });\n\n                    // Dirty events\n                    if (settings.preventLeaving) {\n                        $window.on('beforeunload' + eventNamespace, module.event.beforeUnload);\n                    }\n\n                    $field.on('change' + eventNamespace\n                        + ' click' + eventNamespace\n                        + ' keyup' + eventNamespace\n                        + ' keydown' + eventNamespace\n                        + ' blur' + eventNamespace, function (e) {\n                        module.determine.isDirty();\n                    });\n\n                    $module.on('dirty' + eventNamespace, function (e) {\n                        settings.onDirty.call();\n                    });\n\n                    $module.on('clean' + eventNamespace, function (e) {\n                        settings.onClean.call();\n                    });\n                    if (attachEventsSelector) {\n                        module.attachEvents(attachEventsSelector, attachEventsAction);\n                    }\n                },\n\n                clear: function () {\n                    $field.each(function (index, el) {\n                        var\n                            $field       = $(el),\n                            $element     = $field.parent(),\n                            $fieldGroup  = $field.closest($group),\n                            $prompt      = $fieldGroup.find(selector.prompt),\n                            $calendar    = $field.closest(selector.uiCalendar),\n                            defaultValue = $field.data(metadata.defaultValue) || '',\n                            isCheckbox   = $field.is(selector.checkbox),\n                            isDropdown   = $element.is(selector.uiDropdown) && module.can.useElement('dropdown'),\n                            isCalendar   = $calendar.length > 0 && module.can.useElement('calendar'),\n                            isErrored    = $fieldGroup.hasClass(className.error)\n                        ;\n                        if (isErrored) {\n                            module.verbose('Resetting error on field', $fieldGroup);\n                            $fieldGroup.removeClass(className.error);\n                            $prompt.remove();\n                        }\n                        if (isDropdown) {\n                            module.verbose('Resetting dropdown value', $element, defaultValue);\n                            $element.dropdown('clear', true);\n                        } else if (isCheckbox) {\n                            $field.prop('checked', false);\n                        } else if (isCalendar) {\n                            $calendar.calendar('clear');\n                        } else {\n                            module.verbose('Resetting field value', $field, defaultValue);\n                            $field.val('');\n                        }\n                    });\n                    module.remove.states();\n                },\n\n                reset: function () {\n                    $field.each(function (index, el) {\n                        var\n                            $field       = $(el),\n                            $element     = $field.parent(),\n                            $fieldGroup  = $field.closest($group),\n                            $calendar    = $field.closest(selector.uiCalendar),\n                            $prompt      = $fieldGroup.find(selector.prompt),\n                            defaultValue = $field.data(metadata.defaultValue),\n                            isCheckbox   = $field.is(selector.checkbox),\n                            isDropdown   = $element.is(selector.uiDropdown) && module.can.useElement('dropdown'),\n                            isCalendar   = $calendar.length > 0 && module.can.useElement('calendar'),\n                            isFile       = $field.is(selector.file),\n                            isErrored    = $fieldGroup.hasClass(className.error)\n                        ;\n                        if (defaultValue === undefined) {\n                            return;\n                        }\n                        if (isErrored) {\n                            module.verbose('Resetting error on field', $fieldGroup);\n                            $fieldGroup.removeClass(className.error);\n                            $prompt.remove();\n                        }\n                        if (isDropdown) {\n                            module.verbose('Resetting dropdown value', $element, defaultValue);\n                            $element.dropdown('restore defaults', true);\n                        } else if (isCheckbox) {\n                            module.verbose('Resetting checkbox value', $field, defaultValue);\n                            $field.prop('checked', defaultValue);\n                        } else if (isCalendar) {\n                            $calendar.calendar('set date', defaultValue);\n                        } else {\n                            module.verbose('Resetting field value', $field, defaultValue);\n                            $field.val(isFile ? '' : defaultValue);\n                        }\n                    });\n                    module.remove.states();\n                },\n\n                determine: {\n                    isValid: function () {\n                        var\n                            allValid = true\n                        ;\n                        $field.each(function (index, el) {\n                            var $el = $(el),\n                                validation = module.get.validation($el) || {},\n                                identifier = module.get.identifier(validation, $el)\n                            ;\n                            if (!module.validate.field(validation, identifier, true)) {\n                                allValid = false;\n                            }\n                        });\n\n                        return allValid;\n                    },\n                    isDirty: function (e) {\n                        var formIsDirty = false;\n\n                        $field.each(function (index, el) {\n                            var\n                                $el = $(el),\n                                isCheckbox = $el.filter(selector.checkbox).length > 0,\n                                isDirty\n                            ;\n\n                            isDirty = isCheckbox\n                                ? module.is.checkboxDirty($el)\n                                : module.is.fieldDirty($el);\n\n                            $el.data(settings.metadata.isDirty, isDirty);\n\n                            formIsDirty = formIsDirty || isDirty;\n                        });\n\n                        if (formIsDirty) {\n                            module.set.dirty();\n                        } else {\n                            module.set.clean();\n                        }\n                    },\n                },\n\n                is: {\n                    bracketedRule: function (rule) {\n                        return rule.type && rule.type.match(settings.regExp.bracket);\n                    },\n                    // duck type rule test\n                    shorthandRules: function (rules) {\n                        return typeof rules === 'string' || Array.isArray(rules);\n                    },\n                    empty: function ($field) {\n                        if (!$field || $field.length === 0) {\n                            return true;\n                        }\n                        if ($field.is(selector.checkbox)) {\n                            return !$field.is(':checked');\n                        }\n\n                        return module.is.blank($field);\n                    },\n                    blank: function ($field) {\n                        return String($field.val()).trim() === '';\n                    },\n                    valid: function (field, showErrors) {\n                        var\n                            allValid = true\n                        ;\n                        if (field) {\n                            module.verbose('Checking if field is valid', field);\n\n                            return module.validate.field(validation[field], field, !!showErrors);\n                        }\n\n                        module.verbose('Checking if form is valid');\n                        $.each(validation, function (fieldName, field) {\n                            if (!module.is.valid(fieldName, showErrors)) {\n                                allValid = false;\n                            }\n                        });\n\n                        return allValid;\n                    },\n                    dirty: function () {\n                        return dirty;\n                    },\n                    clean: function () {\n                        return !dirty;\n                    },\n                    fieldDirty: function ($el) {\n                        var initialValue = $el.data(metadata.defaultValue);\n                        // Explicitly check for undefined/null here as value may be `false`, so ($el.data(dataInitialValue) || '') would not work\n                        if (initialValue === undefined || initialValue === null) {\n                            initialValue = '';\n                        } else if (Array.isArray(initialValue)) {\n                            initialValue = initialValue.toString();\n                        }\n                        var currentValue = $el.val();\n                        if (currentValue === undefined || currentValue === null) {\n                            currentValue = '';\n                        } else if (Array.isArray(currentValue)) {\n                            // multiple select values are returned as arrays which are never equal, so do string conversion first\n                            currentValue = currentValue.toString();\n                        }\n                        // Boolean values can be encoded as \"true/false\" or \"True/False\" depending on underlying frameworks so we need a case insensitive comparison\n                        var boolRegex = /^(true|false)$/i;\n                        var isBoolValue = boolRegex.test(initialValue) && boolRegex.test(currentValue);\n                        if (isBoolValue) {\n                            var regex = new RegExp('^' + initialValue + '$', 'i');\n\n                            return !regex.test(currentValue);\n                        }\n\n                        return currentValue !== initialValue;\n                    },\n                    checkboxDirty: function ($el) {\n                        var initialValue = $el.data(metadata.defaultValue);\n                        var currentValue = $el.is(':checked');\n\n                        return initialValue !== currentValue;\n                    },\n                    justDirty: function () {\n                        return history[0] === 'dirty';\n                    },\n                    justClean: function () {\n                        return history[0] === 'clean';\n                    },\n                },\n\n                removeEvents: function () {\n                    $module.off(eventNamespace);\n                    $field.off(eventNamespace);\n                    $submit.off(eventNamespace);\n                    if (settings.preventLeaving) {\n                        $window.off(eventNamespace);\n                    }\n                    if (attachEventsSelector) {\n                        $(attachEventsSelector).off(eventNamespace);\n                        attachEventsSelector = undefined;\n                    }\n                },\n\n                event: {\n                    field: {\n                        keydown: function (event) {\n                            var\n                                $field       = $(this),\n                                key          = event.which,\n                                isInput      = $field.is(selector.input),\n                                isCheckbox   = $field.is(selector.checkbox),\n                                isInDropdown = $field.closest(selector.uiDropdown).length > 0,\n                                keyCode      = {\n                                    enter: 13,\n                                    escape: 27,\n                                }\n                            ;\n                            if (key === keyCode.escape) {\n                                module.verbose('Escape key pressed blurring field');\n                                $field[0]\n                                    .blur()\n                                ;\n                            }\n                            if (!event.ctrlKey && key === keyCode.enter && isInput && !isInDropdown && !isCheckbox) {\n                                if (!keyHeldDown) {\n                                    $field.one('keyup' + eventNamespace, module.event.field.keyup);\n                                    module.submit(event);\n                                    module.debug('Enter pressed on input submitting form');\n                                }\n                                keyHeldDown = true;\n                            }\n                        },\n                        keyup: function () {\n                            keyHeldDown = false;\n                        },\n                        invalid: function (event) {\n                            event.preventDefault();\n                        },\n                        blur: function (event) {\n                            var\n                                $field          = $(this),\n                                validationRules = module.get.validation($field) || {},\n                                identifier      = module.get.identifier(validationRules, $field)\n                            ;\n                            if (settings.on === 'blur' || (!$module.hasClass(className.initial) && settings.revalidate)) {\n                                module.debug('Revalidating field', $field, validationRules);\n                                module.validate.field(validationRules, identifier);\n                                if (!settings.inline) {\n                                    module.validate.form(false, true);\n                                }\n                            }\n                        },\n                        change: function (event) {\n                            var\n                                $field      = $(this),\n                                validationRules = module.get.validation($field) || {},\n                                identifier = module.get.identifier(validationRules, $field)\n                            ;\n                            if (settings.on === 'change' || (!$module.hasClass(className.initial) && settings.revalidate)) {\n                                clearTimeout(module.timer);\n                                module.timer = setTimeout(function () {\n                                    module.debug('Revalidating field', $field, validationRules);\n                                    module.validate.field(validationRules, identifier);\n                                    if (!settings.inline) {\n                                        module.validate.form(false, true);\n                                    }\n                                }, settings.delay);\n                            }\n                        },\n                    },\n                    beforeUnload: function (event) {\n                        if (module.is.dirty() && !submitting) {\n                            event = event || window.event;\n\n                            // For modern browsers\n                            if (event) {\n                                event.returnValue = settings.text.leavingMessage;\n                            }\n\n                            // For olders...\n                            return settings.text.leavingMessage;\n                        }\n                    },\n\n                },\n\n                get: {\n                    ancillaryValue: function (rule) {\n                        if (!rule.type || (!rule.value && !module.is.bracketedRule(rule))) {\n                            return false;\n                        }\n\n                        return rule.value !== undefined\n                            ? rule.value\n                            : rule.type.match(settings.regExp.bracket)[1] + '';\n                    },\n                    ruleName: function (rule) {\n                        if (module.is.bracketedRule(rule)) {\n                            return rule.type.replace(rule.type.match(settings.regExp.bracket)[0], '');\n                        }\n\n                        return rule.type;\n                    },\n                    changeEvent: function (type, $input) {\n                        return ['file', 'checkbox', 'radio', 'hidden'].indexOf(type) >= 0 || $input.is('select') ? 'change' : 'input';\n                    },\n                    fieldsFromShorthand: function (fields) {\n                        var\n                            fullFields = {}\n                        ;\n                        $.each(fields, function (name, rules) {\n                            if (!Array.isArray(rules) && typeof rules === 'object') {\n                                fullFields[name] = rules;\n                            } else {\n                                if (typeof rules === 'string') {\n                                    rules = [rules];\n                                }\n                                fullFields[name] = {\n                                    rules: [],\n                                };\n                                $.each(rules, function (index, rule) {\n                                    fullFields[name].rules.push({ type: rule });\n                                });\n                            }\n\n                            $.each(fullFields[name].rules, function (index, rule) {\n                                var ruleName = module.get.ruleName(rule);\n                                if (ruleName === 'empty') {\n                                    module.warn('*** DEPRECATED *** : Rule \"empty\" for field \"' + name + '\" will be removed in a future version. -> Use \"notEmpty\" rule instead.');\n                                }\n                            });\n                        });\n\n                        return fullFields;\n                    },\n                    identifier: function (validation, $el) {\n                        return validation.identifier || $el.attr('id') || $el.attr('name') || $el.data(metadata.validate);\n                    },\n                    prompt: function (rule, field) {\n                        var\n                            ruleName      = module.get.ruleName(rule),\n                            ancillary     = module.get.ancillaryValue(rule),\n                            $field        = module.get.field(field.identifier),\n                            value         = $field.val(),\n                            promptCheck   = rule.prompt || settings.prompt[ruleName] || settings.text.unspecifiedRule,\n                            prompt        = String(isFunction(promptCheck)\n                                ? promptCheck.call($field[0], value)\n                                : promptCheck),\n                            requiresValue = prompt.search('{value}') !== -1,\n                            requiresName  = prompt.search('{name}') !== -1,\n                            parts,\n                            suffixPrompt\n                        ;\n                        if (ancillary && ['integer', 'decimal', 'number', 'size'].indexOf(ruleName) >= 0 && ancillary.indexOf('..') >= 0) {\n                            parts = ancillary.split('..', 2);\n                            if (!rule.prompt && ruleName !== 'size') {\n                                suffixPrompt = parts[0] === ''\n                                    ? settings.prompt.maxValue.replace(/{ruleValue}/g, '{max}')\n                                    : (parts[1] === ''\n                                        ? settings.prompt.minValue.replace(/{ruleValue}/g, '{min}')\n                                        : settings.prompt.range);\n                                prompt += suffixPrompt.replace(/{name}/g, ' ' + settings.text.and);\n                            }\n                            prompt = prompt.replace(/{min}/g, parts[0]);\n                            prompt = prompt.replace(/{max}/g, parts[1]);\n                        }\n                        if (ancillary && ['match', 'different'].indexOf(ruleName) >= 0) {\n                            prompt = prompt.replace(/{ruleValue}/g, module.get.fieldLabel(ancillary, true));\n                        }\n                        if (requiresValue) {\n                            prompt = prompt.replace(/{value}/g, $field.val());\n                        }\n                        if (requiresName) {\n                            prompt = prompt.replace(/{name}/g, module.get.fieldLabel($field));\n                        }\n                        prompt = prompt.replace(/{identifier}/g, field.identifier);\n                        prompt = prompt.replace(/{ruleValue}/g, ancillary);\n                        if (!rule.prompt) {\n                            module.verbose('Using default validation prompt for type', prompt, ruleName);\n                        }\n\n                        return prompt;\n                    },\n                    settings: function () {\n                        if ($.isPlainObject(parameters)) {\n                            settings = $.extend(true, {}, $.fn.form.settings, parameters);\n                            if (settings.fields) {\n                                settings.fields = module.get.fieldsFromShorthand(settings.fields);\n                            }\n                            validation = $.extend(true, {}, $.fn.form.settings.defaults, settings.fields);\n                            module.verbose('Extending settings', validation, settings);\n                        } else {\n                            settings = $.extend(true, {}, $.fn.form.settings);\n                            validation = $.extend(true, {}, $.fn.form.settings.defaults);\n                            module.verbose('Using default form validation', validation, settings);\n                        }\n\n                        // shorthand\n                        namespace = settings.namespace;\n                        metadata = settings.metadata;\n                        selector = settings.selector;\n                        className = settings.className;\n                        regExp = settings.regExp;\n                        error = settings.error;\n                        moduleNamespace = 'module-' + namespace;\n                        eventNamespace = '.' + namespace;\n\n                        // grab instance\n                        instance = $module.data(moduleNamespace);\n\n                        // refresh selector cache\n                        (instance || module).refresh();\n                    },\n                    field: function (identifier, strict, ignoreMissing) {\n                        module.verbose('Finding field with identifier', identifier);\n                        identifier = module.escape.string(identifier);\n                        var t;\n                        t = $field.filter('#' + identifier);\n                        if (t.length > 0) {\n                            return t;\n                        }\n                        t = $field.filter('[name=\"' + identifier + '\"]');\n                        if (t.length > 0) {\n                            return t;\n                        }\n                        t = $field.filter('[name=\"' + identifier + '[]\"]');\n                        if (t.length > 0) {\n                            return t;\n                        }\n                        t = $field.filter('[data-' + metadata.validate + '=\"' + identifier + '\"]');\n                        if (t.length > 0) {\n                            return t;\n                        }\n                        if (!ignoreMissing) {\n                            module.error(error.noField.replace('{identifier}', identifier));\n                        }\n\n                        return strict ? $() : $('<input/>');\n                    },\n                    fields: function (fields, strict) {\n                        var\n                            $fields = $()\n                        ;\n                        $.each(fields, function (index, name) {\n                            $fields = $fields.add(module.get.field(name, strict));\n                        });\n\n                        return $fields;\n                    },\n                    fieldLabel: function (identifier, useIdAsFallback) {\n                        var $field = typeof identifier === 'string'\n                                ? module.get.field(identifier)\n                                : identifier,\n                            $label = $field.closest(selector.group).find('label:not(:empty)').eq(0)\n                        ;\n\n                        return $label.length === 1\n                            ? $label.text()\n                            : $field.prop('placeholder') || (useIdAsFallback ? identifier : settings.text.unspecifiedField);\n                    },\n                    validation: function ($field) {\n                        var\n                            fieldValidation,\n                            identifier\n                        ;\n                        if (!validation) {\n                            return false;\n                        }\n                        $.each(validation, function (fieldName, field) {\n                            identifier = field.identifier || fieldName;\n                            $.each(module.get.field(identifier), function (index, groupField) {\n                                if (groupField == $field[0]) {\n                                    field.identifier = identifier;\n                                    fieldValidation = field;\n\n                                    return false;\n                                }\n                            });\n                        });\n\n                        return fieldValidation || false;\n                    },\n                    value: function (field, strict) {\n                        var\n                            fields = [],\n                            results,\n                            resultKeys\n                        ;\n                        fields.push(field);\n                        results = module.get.values.call(element, fields, strict);\n                        resultKeys = Object.keys(results);\n\n                        return resultKeys.length > 0 ? results[resultKeys[0]] : undefined;\n                    },\n                    values: function (fields, strict) {\n                        var\n                            $fields = Array.isArray(fields) && fields.length > 0\n                                ? module.get.fields(fields, strict)\n                                : $field,\n                            values = {}\n                        ;\n                        $fields.each(function (index, field) {\n                            var\n                                $field       = $(field),\n                                $calendar    = $field.closest(selector.uiCalendar),\n                                name         = $field.prop('name') || $field.prop('id'),\n                                value        = $field.val(),\n                                isCheckbox   = $field.is(selector.checkbox),\n                                isRadio      = $field.is(selector.radio),\n                                isMultiple   = name.indexOf('[]') !== -1,\n                                isCalendar   = $calendar.length > 0 && module.can.useElement('calendar'),\n                                isChecked    = isCheckbox\n                                    ? $field.is(':checked')\n                                    : false\n                            ;\n                            if (name) {\n                                if (isMultiple) {\n                                    name = name.replace('[]', '');\n                                    if (!values[name]) {\n                                        values[name] = [];\n                                    }\n                                    if (isCheckbox) {\n                                        if (isChecked) {\n                                            values[name].push(value || true);\n                                        } else {\n                                            values[name].push(false);\n                                        }\n                                    } else {\n                                        values[name].push(value);\n                                    }\n                                } else {\n                                    if (isRadio) {\n                                        if (values[name] === undefined || values[name] === false) {\n                                            values[name] = isChecked\n                                                ? value || true\n                                                : false;\n                                        }\n                                    } else if (isCheckbox) {\n                                        values[name] = isChecked ? value || true : false;\n                                    } else if (isCalendar) {\n                                        var date = $calendar.calendar('get date');\n\n                                        if (date !== null) {\n                                            switch (settings.dateHandling) {\n                                                case 'date': {\n                                                    values[name] = date;\n\n                                                    break;\n                                                }\n                                                case 'input': {\n                                                    values[name] = $calendar.calendar('get input date');\n\n                                                    break;\n                                                }\n                                                case 'formatter': {\n                                                    var type = $calendar.calendar('setting', 'type');\n\n                                                    switch (type) {\n                                                        case 'date': {\n                                                            values[name] = settings.formatter.date(date);\n\n                                                            break;\n                                                        }\n                                                        case 'datetime': {\n                                                            values[name] = settings.formatter.datetime(date);\n\n                                                            break;\n                                                        }\n                                                        case 'time': {\n                                                            values[name] = settings.formatter.time(date);\n\n                                                            break;\n                                                        }\n                                                        case 'month': {\n                                                            values[name] = settings.formatter.month(date);\n\n                                                            break;\n                                                        }\n                                                        case 'year': {\n                                                            values[name] = settings.formatter.year(date);\n\n                                                            break;\n                                                        }\n                                                        default: {\n                                                            module.debug('Wrong calendar mode', $calendar, type);\n                                                            values[name] = '';\n                                                        }\n                                                    }\n\n                                                    break;\n                                                }\n                                            }\n                                        } else {\n                                            values[name] = '';\n                                        }\n                                    } else {\n                                        values[name] = value;\n                                    }\n                                }\n                            }\n                        });\n\n                        return values;\n                    },\n                    dirtyFields: function () {\n                        return $field.filter(function (index, e) {\n                            return $(e).data(metadata.isDirty);\n                        });\n                    },\n                },\n\n                has: {\n\n                    field: function (identifier, ignoreMissing) {\n                        module.verbose('Checking for existence of a field with identifier', identifier);\n\n                        return module.get.field(identifier, true, ignoreMissing).length > 0;\n                    },\n\n                },\n\n                can: {\n                    useElement: function (element) {\n                        if ($.fn[element] !== undefined) {\n                            return true;\n                        }\n                        module.error(error.noElement.replace('{element}', element));\n\n                        return false;\n                    },\n                },\n\n                escape: {\n                    string: function (text) {\n                        text = String(text);\n\n                        return text.replace(regExp.escape, '\\\\$&');\n                    },\n                },\n\n                checkErrors: function (errors, internal) {\n                    if (!errors || errors.length === 0) {\n                        if (!internal) {\n                            module.error(settings.error.noErrorMessage);\n                        }\n\n                        return false;\n                    }\n                    if (!internal) {\n                        errors = typeof errors === 'string'\n                            ? [errors]\n                            : errors;\n                    }\n\n                    return errors;\n                },\n                add: {\n                    // alias\n                    rule: function (name, rules) {\n                        module.add.field(name, rules);\n                    },\n                    field: function (name, rules) {\n                        // Validation should have at least a standard format\n                        if (validation[name] === undefined || validation[name].rules === undefined) {\n                            validation[name] = {\n                                rules: [],\n                            };\n                        }\n                        var\n                            newValidation = {\n                                rules: [],\n                            }\n                        ;\n                        if (module.is.shorthandRules(rules)) {\n                            rules = Array.isArray(rules)\n                                ? rules\n                                : [rules];\n                            $.each(rules, function (_index, rule) {\n                                newValidation.rules.push({ type: rule });\n                            });\n                        } else {\n                            newValidation.rules = rules.rules;\n                        }\n                        // For each new rule, check if there's not already one with the same type\n                        $.each(newValidation.rules, function (_index, rule) {\n                            if ($.grep(validation[name].rules, function (item) {\n                                return item.type === rule.type;\n                            }).length === 0) {\n                                validation[name].rules.push(rule);\n                            }\n                        });\n                        module.debug('Adding rules', newValidation.rules, validation);\n                        module.refreshEvents();\n                    },\n                    fields: function (fields) {\n                        validation = $.extend(true, {}, validation, module.get.fieldsFromShorthand(fields));\n                        module.refreshEvents();\n                    },\n                    prompt: function (identifier, errors, internal) {\n                        errors = module.checkErrors(errors);\n                        if (errors === false) {\n                            return;\n                        }\n                        var\n                            $field       = module.get.field(identifier),\n                            $fieldGroup  = $field.closest($group),\n                            $prompt      = $fieldGroup.children(selector.prompt),\n                            promptExists = $prompt.length > 0,\n                            canTransition = settings.transition && module.can.useElement('transition')\n                        ;\n                        module.verbose('Adding field error state', identifier);\n                        if (!internal) {\n                            $fieldGroup\n                                .addClass(className.error)\n                            ;\n                        }\n                        if (settings.inline) {\n                            if (promptExists) {\n                                if (canTransition) {\n                                    if ($prompt.transition('is animating')) {\n                                        $prompt.transition('stop all');\n                                    }\n                                } else if ($prompt.is(':animated')) {\n                                    $prompt.stop(true, true);\n                                }\n                                $prompt = $fieldGroup.children(selector.prompt);\n                                promptExists = $prompt.length > 0;\n                            }\n                            if (!promptExists) {\n                                $prompt = $('<div/>').addClass(className.label);\n                                if (!canTransition) {\n                                    $prompt.css('display', 'none');\n                                }\n                                $prompt\n                                    .appendTo($fieldGroup.filter('.' + className.error))\n                                ;\n                            }\n                            $prompt\n                                .html(settings.templates.prompt(errors))\n                            ;\n                            if (!promptExists) {\n                                if (canTransition) {\n                                    module.verbose('Displaying error with css transition', settings.transition);\n                                    $prompt.transition(settings.transition + ' in', settings.duration);\n                                } else {\n                                    module.verbose('Displaying error with fallback javascript animation');\n                                    $prompt\n                                        .fadeIn(settings.duration)\n                                    ;\n                                }\n                            }\n                        } else {\n                            module.verbose('Inline errors are disabled, no inline error added', identifier);\n                        }\n                    },\n                    errors: function (errors) {\n                        errors = module.checkErrors(errors);\n                        if (errors === false) {\n                            return;\n                        }\n                        module.debug('Adding form error messages', errors);\n                        module.set.error();\n                        var customErrors = [],\n                            tempErrors\n                        ;\n                        if ($.isPlainObject(errors)) {\n                            $.each(Object.keys(errors), function (i, id) {\n                                if (module.checkErrors(errors[id], true) !== false) {\n                                    if (settings.inline) {\n                                        module.add.prompt(id, errors[id]);\n                                    } else {\n                                        tempErrors = module.checkErrors(errors[id]);\n                                        if (tempErrors !== false) {\n                                            $.each(tempErrors, function (index, tempError) {\n                                                customErrors.push(settings.prompt.addErrors\n                                                    .replace(/{name}/g, module.get.fieldLabel(id))\n                                                    .replace(/{error}/g, tempError));\n                                            });\n                                        }\n                                    }\n                                }\n                            });\n                        } else {\n                            customErrors = errors;\n                        }\n                        if (customErrors.length > 0) {\n                            $message\n                                .html(settings.templates.error(customErrors))\n                            ;\n                        }\n                    },\n                },\n\n                remove: {\n                    errors: function () {\n                        module.debug('Removing form error messages');\n                        $message.empty();\n                    },\n                    states: function () {\n                        $module.removeClass(className.error).removeClass(className.success).addClass(className.initial);\n                        if (!settings.inline) {\n                            module.remove.errors();\n                        }\n                        module.determine.isDirty();\n                    },\n                    rule: function (field, rule) {\n                        var\n                            rules = Array.isArray(rule)\n                                ? rule\n                                : [rule]\n                        ;\n                        if (validation[field] === undefined || !Array.isArray(validation[field].rules)) {\n                            return;\n                        }\n                        if (rule === undefined) {\n                            module.debug('Removed all rules');\n                            if (module.has.field(field, true)) {\n                                validation[field].rules = [];\n                            } else {\n                                delete validation[field];\n                            }\n\n                            return;\n                        }\n                        $.each(validation[field].rules, function (index, rule) {\n                            if (rule && rules.indexOf(rule.type) !== -1) {\n                                module.debug('Removed rule', rule.type);\n                                validation[field].rules.splice(index, 1);\n                            }\n                        });\n                    },\n                    field: function (field) {\n                        var\n                            fields = Array.isArray(field)\n                                ? field\n                                : [field]\n                        ;\n                        $.each(fields, function (index, field) {\n                            module.remove.rule(field);\n                        });\n                        module.refreshEvents();\n                    },\n                    // alias\n                    rules: function (field, rules) {\n                        if (Array.isArray(field)) {\n                            $.each(field, function (index, field) {\n                                module.remove.rule(field, rules);\n                            });\n                        } else {\n                            module.remove.rule(field, rules);\n                        }\n                    },\n                    fields: function (fields) {\n                        module.remove.field(fields);\n                    },\n                    prompt: function (identifier) {\n                        var\n                            $field      = module.get.field(identifier),\n                            $fieldGroup = $field.closest($group),\n                            $prompt     = $fieldGroup.children(selector.prompt)\n                        ;\n                        $fieldGroup\n                            .removeClass(className.error)\n                        ;\n                        if (settings.inline && $prompt.is(':visible')) {\n                            module.verbose('Removing prompt for field', identifier);\n                            if (settings.transition && module.can.useElement('transition')) {\n                                $prompt.transition(settings.transition + ' out', settings.duration, function () {\n                                    $prompt.remove();\n                                });\n                            } else {\n                                $prompt\n                                    .fadeOut(settings.duration, function () {\n                                        $prompt.remove();\n                                    })\n                                ;\n                            }\n                        }\n                    },\n                },\n\n                set: {\n                    success: function () {\n                        $module\n                            .removeClass(className.error)\n                            .addClass(className.success)\n                        ;\n                    },\n                    defaults: function () {\n                        $field.each(function (index, el) {\n                            var\n                                $el        = $(el),\n                                $parent    = $el.parent(),\n                                isCheckbox = $el.filter(selector.checkbox).length > 0,\n                                isDropdown = ($parent.is(selector.uiDropdown) || $el.is(selector.uiDropdown)) && module.can.useElement('dropdown'),\n                                $calendar  = $el.closest(selector.uiCalendar),\n                                isCalendar = $calendar.length > 0 && module.can.useElement('calendar'),\n                                value      = isCheckbox\n                                    ? $el.is(':checked')\n                                    : $el.val()\n                            ;\n                            if (isDropdown) {\n                                if ($parent.is(selector.uiDropdown)) {\n                                    $parent.dropdown('save defaults');\n                                } else {\n                                    $el.dropdown('save defaults');\n                                }\n                            } else if (isCalendar) {\n                                $calendar.calendar('refresh');\n                            }\n                            $el.data(metadata.defaultValue, value);\n                            $el.data(metadata.isDirty, false);\n                        });\n                    },\n                    error: function () {\n                        $module\n                            .removeClass(className.success)\n                            .addClass(className.error)\n                        ;\n                    },\n                    value: function (field, value) {\n                        var\n                            fields = {}\n                        ;\n                        fields[field] = value;\n\n                        return module.set.values.call(element, fields);\n                    },\n                    values: function (fields) {\n                        if ($.isEmptyObject(fields)) {\n                            return;\n                        }\n                        $.each(fields, function (key, value) {\n                            var\n                                $field      = module.get.field(key),\n                                $element    = $field.parent(),\n                                $calendar   = $field.closest(selector.uiCalendar),\n                                isFile      = $field.is(selector.file),\n                                isMultiple  = Array.isArray(value),\n                                isCheckbox  = $element.is(selector.uiCheckbox) && module.can.useElement('checkbox'),\n                                isDropdown  = $element.is(selector.uiDropdown) && module.can.useElement('dropdown'),\n                                isRadio     = $field.is(selector.radio) && isCheckbox,\n                                isCalendar  = $calendar.length > 0 && module.can.useElement('calendar'),\n                                fieldExists = $field.length > 0,\n                                $multipleField\n                            ;\n                            if (fieldExists) {\n                                if (isMultiple && isCheckbox) {\n                                    module.verbose('Selecting multiple', value, $field);\n                                    $element.checkbox('uncheck');\n                                    $.each(value, function (index, value) {\n                                        $multipleField = $field.filter('[value=\"' + value + '\"]');\n                                        $element = $multipleField.parent();\n                                        if ($multipleField.length > 0) {\n                                            $element.checkbox('check');\n                                        }\n                                    });\n                                } else if (isRadio) {\n                                    module.verbose('Selecting radio value', value, $field);\n                                    $field.filter('[value=\"' + value + '\"]')\n                                        .parent(selector.uiCheckbox)\n                                        .checkbox('check')\n                                    ;\n                                } else if (isCheckbox) {\n                                    module.verbose('Setting checkbox value', value, $element);\n                                    if (value === true || value === 1 || value === 'on') {\n                                        $element.checkbox('check');\n                                    } else {\n                                        $element.checkbox('uncheck');\n                                    }\n                                    if (typeof value === 'string') {\n                                        $field.val(value);\n                                    }\n                                } else if (isDropdown) {\n                                    module.verbose('Setting dropdown value', value, $element);\n                                    $element.dropdown('set selected', value);\n                                } else if (isCalendar) {\n                                    $calendar.calendar('set date', value);\n                                } else {\n                                    module.verbose('Setting field value', value, $field);\n                                    $field.val(isFile ? '' : value);\n                                }\n                            }\n                        });\n                    },\n                    dirty: function () {\n                        module.verbose('Setting state dirty');\n                        dirty = true;\n                        history[0] = history[1];\n                        history[1] = 'dirty';\n\n                        if (module.is.justClean()) {\n                            $module.trigger('dirty');\n                        }\n                    },\n                    clean: function () {\n                        module.verbose('Setting state clean');\n                        dirty = false;\n                        history[0] = history[1];\n                        history[1] = 'clean';\n\n                        if (module.is.justDirty()) {\n                            $module.trigger('clean');\n                        }\n                    },\n                    asClean: function () {\n                        module.set.defaults();\n                        module.set.clean();\n                    },\n                    asDirty: function () {\n                        module.set.defaults();\n                        module.set.dirty();\n                    },\n                    autoCheck: function () {\n                        module.debug('Enabling auto check on required fields');\n                        if (validation) {\n                            $.each(validation, function (fieldName) {\n                                if (!module.has.field(fieldName, true)) {\n                                    module.verbose('Field not found, removing from validation', fieldName);\n                                    module.remove.field(fieldName);\n                                }\n                            });\n                        }\n                        $field.each(function (_index, el) {\n                            var\n                                $el        = $(el),\n                                $elGroup   = $el.closest($group),\n                                isCheckbox = $el.filter(selector.checkbox).length > 0,\n                                isRequired = $el.prop('required') || $elGroup.hasClass(className.required) || $elGroup.parent().hasClass(className.required),\n                                isDisabled = $el.is(':disabled') || $elGroup.hasClass(className.disabled) || $elGroup.parent().hasClass(className.disabled),\n                                validation = module.get.validation($el),\n                                hasNotEmptyRule = validation\n                                    ? $.grep(validation.rules, function (rule) {\n                                        return ['notEmpty', 'checked', 'empty'].indexOf(rule.type) >= 0;\n                                    }).length > 0\n                                    : false,\n                                identifier = module.get.identifier(validation, $el)\n                            ;\n                            if (isRequired && !isDisabled && !hasNotEmptyRule && identifier !== undefined) {\n                                if (isCheckbox) {\n                                    module.verbose(\"Adding 'checked' rule on field\", identifier);\n                                    module.add.rule(identifier, 'checked');\n                                } else {\n                                    module.verbose(\"Adding 'notEmpty' rule on field\", identifier);\n                                    module.add.rule(identifier, 'notEmpty');\n                                }\n                            }\n                        });\n                    },\n                    optional: function (identifier, bool) {\n                        bool = bool !== false;\n                        $.each(validation, function (fieldName, field) {\n                            if (identifier === fieldName || identifier === field.identifier) {\n                                field.optional = bool;\n                            }\n                        });\n                    },\n                },\n\n                validate: {\n\n                    form: function (event, ignoreCallbacks) {\n                        var values = module.get.values();\n\n                        // input keydown event will fire submit repeatedly by browser default\n                        if (keyHeldDown) {\n                            return false;\n                        }\n                        $module.removeClass(className.initial);\n                        // reset errors\n                        formErrors = [];\n                        formErrorsTracker = {};\n                        if (module.determine.isValid()) {\n                            module.debug('Form has no validation errors, submitting');\n                            module.set.success();\n                            if (!settings.inline) {\n                                module.remove.errors();\n                            }\n                            if (ignoreCallbacks !== true) {\n                                return settings.onSuccess.call(element, event, values);\n                            }\n                        } else {\n                            module.debug('Form has errors');\n                            submitting = false;\n                            module.set.error();\n                            if (!settings.inline) {\n                                module.add.errors(formErrors);\n                            }\n                            // prevent ajax submit\n                            if (event && $module.data('moduleApi') !== undefined) {\n                                event.stopImmediatePropagation();\n                            }\n                            if (settings.errorFocus && ignoreCallbacks !== true) {\n                                var\n                                    $focusElement,\n                                    hasTabIndex = true\n                                ;\n                                if (typeof settings.errorFocus === 'string') {\n                                    $focusElement = $(document).find(settings.errorFocus);\n                                    hasTabIndex = $focusElement.is('[tabindex]');\n                                    // to be able to focus/scroll into non input elements we need a tabindex\n                                    if (!hasTabIndex) {\n                                        $focusElement.attr('tabindex', -1);\n                                    }\n                                } else {\n                                    $focusElement = $group.filter('.' + className.error).first().find(selector.field);\n                                }\n                                $focusElement.trigger('focus');\n                                // only remove tabindex if it was dynamically created above\n                                if (!hasTabIndex) {\n                                    $focusElement.removeAttr('tabindex');\n                                }\n                            }\n                            if (ignoreCallbacks !== true) {\n                                return settings.onFailure.call(element, formErrors, values);\n                            }\n                        }\n                    },\n\n                    // takes a validation object and returns whether field passes validation\n                    field: function (field, fieldName, showErrors) {\n                        showErrors = showErrors !== undefined\n                            ? showErrors\n                            : true;\n                        if (typeof field === 'string') {\n                            module.verbose('Validating field', field);\n                            fieldName = field;\n                            field = validation[field];\n                        }\n                        if (!field) {\n                            module.debug('Unable to find field validation. Skipping', fieldName);\n\n                            return true;\n                        }\n                        var\n                            identifier    = field.identifier || fieldName,\n                            $field        = module.get.field(identifier),\n                            $fieldGroup = $field.closest($group),\n                            $dependsField = field.depends\n                                ? module.get.field(field.depends)\n                                : false,\n                            fieldValid  = true,\n                            fieldErrors = [],\n                            isDisabled = $field.filter(':not(:disabled)').length === 0 || $fieldGroup.hasClass(className.disabled) || $fieldGroup.parent().hasClass(className.disabled),\n                            validationMessage = $field[0].validationMessage,\n                            noNativeValidation = field.noNativeValidation || settings.noNativeValidation || $field.filter('[formnovalidate],[novalidate]').length > 0 || $module.filter('[novalidate]').length > 0,\n                            errorLimit\n                        ;\n                        if (!field.identifier) {\n                            module.debug('Using field name as identifier', identifier);\n                            field.identifier = identifier;\n                        }\n                        if (validationMessage && !noNativeValidation && !isDisabled) {\n                            module.debug('Field is natively invalid', identifier);\n                            fieldErrors.push(validationMessage);\n                            fieldValid = false;\n                            if (showErrors) {\n                                $fieldGroup.addClass(className.error);\n                            }\n                        } else if (showErrors) {\n                            $fieldGroup.removeClass(className.error);\n                        }\n                        if (isDisabled) {\n                            module.debug('Field is disabled. Skipping', identifier);\n                        } else if (field.optional && module.is.blank($field)) {\n                            module.debug('Field is optional and blank. Skipping', identifier);\n                        } else if (field.depends && module.is.empty($dependsField)) {\n                            module.debug('Field depends on another value that is not present or empty. Skipping', $dependsField);\n                        } else if (field.rules !== undefined) {\n                            errorLimit = field.errorLimit || settings.errorLimit;\n                            $.each(field.rules, function (index, rule) {\n                                if (module.has.field(identifier) && (!errorLimit || fieldErrors.length < errorLimit)) {\n                                    var invalidFields = module.validate.rule(field, rule, true) || [];\n                                    if (invalidFields.length > 0) {\n                                        module.debug('Field is invalid', identifier, rule.type);\n                                        var fieldError = module.get.prompt(rule, field);\n                                        if (!settings.inline) {\n                                            if (\n                                                // Always allow the first error prompt for new field identifiers\n                                                (!(identifier in formErrorsTracker)\n                                                // Also allow multiple error prompts per field identifier but make sure each prompt is unique\n                                                || formErrorsTracker[identifier].indexOf(fieldError) === -1)\n                                                // Limit the number of unique error prompts for every field identifier if specified\n                                                && (!errorLimit || (formErrorsTracker[identifier] || []).length < errorLimit)\n                                            ) {\n                                                fieldErrors.push(fieldError);\n                                                (formErrorsTracker[identifier] = formErrorsTracker[identifier] || []).push(fieldError);\n                                            }\n                                        } else {\n                                            fieldErrors.push(fieldError);\n                                        }\n                                        fieldValid = false;\n                                        if (showErrors) {\n                                            $(invalidFields).closest($group).addClass(className.error);\n                                        }\n                                    }\n                                }\n                            });\n                        }\n                        if (fieldValid) {\n                            if (showErrors) {\n                                module.remove.prompt(identifier);\n                                settings.onValid.call($field);\n                            }\n                        } else {\n                            if (showErrors && fieldErrors.length > 0) {\n                                formErrors = formErrors.concat(fieldErrors);\n                                module.add.prompt(identifier, fieldErrors, true);\n                                settings.onInvalid.call($field, fieldErrors);\n                            }\n\n                            return false;\n                        }\n\n                        return true;\n                    },\n\n                    // takes validation rule and returns whether field passes rule\n                    rule: function (field, rule, internal) {\n                        var\n                            $field       = module.get.field(field.identifier),\n                            ancillary    = module.get.ancillaryValue(rule),\n                            ruleName     = module.get.ruleName(rule),\n                            ruleFunction = settings.rules[ruleName],\n                            invalidFields = [],\n                            isCheckbox = $field.is(selector.checkbox),\n                            isValid = function (field) {\n                                var value = isCheckbox ? $(field).filter(':checked').val() : $(field).val();\n                                // cast to string avoiding encoding special values\n                                value = value === undefined || value === '' || value === null\n                                    ? ''\n                                    : ((settings.shouldTrim && rule.shouldTrim !== false) || rule.shouldTrim\n                                        ? String(value + '').trim()\n                                        : String(value + ''));\n\n                                return ruleFunction.call(field, value, ancillary, module);\n                            }\n                        ;\n                        if (!isFunction(ruleFunction)) {\n                            module.error(error.noRule, ruleName);\n\n                            return;\n                        }\n                        if (isCheckbox) {\n                            if (!isValid($field)) {\n                                invalidFields = $field;\n                            }\n                        } else {\n                            $.each($field, function (index, field) {\n                                if (!isValid(field)) {\n                                    invalidFields.push(field);\n                                }\n                            });\n                        }\n\n                        return internal ? invalidFields : invalidFields.length === 0;\n                    },\n                },\n\n                setting: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        settings[name] = value;\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                warn: function () {\n                    if (!settings.silent) {\n                        module.warn = Function.prototype.bind.call(console.warn, console, settings.name + ':');\n                        module.warn.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if ($allModules.length > 1) {\n                            title += ' (' + $allModules.length + ')';\n                        }\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n            module.initialize();\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.form.settings = {\n\n        name: 'Form',\n        namespace: 'form',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        fields: false,\n\n        keyboardShortcuts: true,\n        on: 'submit',\n        inline: false,\n\n        delay: 200,\n        revalidate: true,\n        shouldTrim: true,\n\n        transition: 'scale',\n        duration: 200,\n\n        autoCheckRequired: false,\n        preventLeaving: false,\n        errorFocus: true,\n        dateHandling: 'date', // 'date', 'input', 'formatter'\n        errorLimit: 0,\n        noNativeValidation: false,\n\n        onValid: function () {},\n        onInvalid: function () {},\n        onSuccess: function () {\n            return true;\n        },\n        onFailure: function () {\n            return false;\n        },\n        onDirty: function () {},\n        onClean: function () {},\n\n        metadata: {\n            defaultValue: 'default',\n            validate: 'validate',\n            isDirty: 'isDirty',\n        },\n\n        regExp: {\n            htmlID: /^[A-Za-z][\\w.:-]*$/g,\n            bracket: /\\[(.*)]/i,\n            decimal: /^\\d+\\.?\\d*$/,\n            email: /^[\\w!#$%&'*+./=?^`{|}~-]+@[\\da-z]([\\da-z-]*[\\da-z])?(\\.[\\da-z]([\\da-z-]*[\\da-z])?)*$/i,\n            escape: /[$()*+,./:=?@[\\\\\\]^{|}-]/g,\n            flags: /^\\/(.*)\\/(.*)?/,\n            integer: /^-?\\d+$/,\n            number: /^-?\\d*(\\.\\d+)?$/,\n            url: /(https?:\\/\\/(?:www\\.|(?!www))[^\\s.]+\\.\\S{2,}|www\\.\\S+\\.\\S{2,})/i,\n        },\n\n        text: {\n            and: 'and',\n            unspecifiedRule: 'Please enter a valid value',\n            unspecifiedField: 'This field',\n            leavingMessage: 'There are unsaved changes on this page which will be discarded if you continue.',\n        },\n\n        prompt: {\n            range: '{name} must be in a range from {min} to {max}',\n            maxValue: '{name} must have a maximum value of {ruleValue}',\n            minValue: '{name} must have a minimum value of {ruleValue}',\n            empty: '{name} must have a value',\n            notEmpty: '{name} must have a value',\n            checked: '{name} must be checked',\n            email: '{name} must be a valid e-mail',\n            url: '{name} must be a valid url',\n            regExp: '{name} is not formatted correctly',\n            integer: '{name} must be an integer',\n            decimal: '{name} must be a decimal number',\n            number: '{name} must be set to a number',\n            is: '{name} must be \"{ruleValue}\"',\n            isExactly: '{name} must be exactly \"{ruleValue}\"',\n            not: '{name} cannot be set to \"{ruleValue}\"',\n            notExactly: '{name} cannot be set to exactly \"{ruleValue}\"',\n            contains: '{name} must contain \"{ruleValue}\"',\n            containsExactly: '{name} must contain exactly \"{ruleValue}\"',\n            doesntContain: '{name} cannot contain \"{ruleValue}\"',\n            doesntContainExactly: '{name} cannot contain exactly \"{ruleValue}\"',\n            minLength: '{name} must be at least {ruleValue} characters',\n            exactLength: '{name} must be exactly {ruleValue} characters',\n            maxLength: '{name} cannot be longer than {ruleValue} characters',\n            size: '{name} must have a length between {min} and {max} characters',\n            match: '{name} must match {ruleValue} field',\n            different: '{name} must have a different value than {ruleValue} field',\n            creditCard: '{name} must be a valid credit card number',\n            minCount: '{name} must have at least {ruleValue} choices',\n            exactCount: '{name} must have exactly {ruleValue} choices',\n            maxCount: '{name} must have {ruleValue} or less choices',\n            addErrors: '{name}: {error}',\n        },\n\n        selector: {\n            checkbox: 'input[type=\"checkbox\"], input[type=\"radio\"]',\n            clear: '.clear',\n            field: 'input:not(.search):not([type=\"reset\"]):not([type=\"button\"]):not([type=\"submit\"]), textarea, select',\n            file: 'input[type=\"file\"]',\n            group: '.field',\n            input: 'input',\n            message: '.error.message',\n            prompt: '.prompt.label',\n            radio: 'input[type=\"radio\"]',\n            reset: '.reset:not([type=\"reset\"])',\n            submit: '.submit:not([type=\"submit\"])',\n            uiCheckbox: '.ui.checkbox',\n            uiDropdown: '.ui.dropdown',\n            uiCalendar: '.ui.calendar',\n        },\n\n        className: {\n            initial: 'initial',\n            error: 'error',\n            label: 'ui basic red pointing prompt label',\n            pressed: 'down',\n            success: 'success',\n            required: 'required',\n            disabled: 'disabled',\n        },\n\n        error: {\n            method: 'The method you called is not defined.',\n            noRule: 'There is no rule matching the one you specified',\n            noField: 'Field identifier {identifier} not found',\n            noElement: 'This module requires ui {element}',\n            noErrorMessage: 'No error message provided',\n        },\n\n        templates: {\n\n            // template that produces error message\n            error: function (errors) {\n                var\n                    html = '<ul class=\"list\">'\n                ;\n                $.each(errors, function (index, value) {\n                    html += '<li>' + value + '</li>';\n                });\n                html += '</ul>';\n\n                return html;\n            },\n\n            // template that produces label content\n            prompt: function (errors) {\n                if (errors.length === 1) {\n                    return errors[0];\n                }\n                var\n                    html = '<ul class=\"ui list\">'\n                ;\n                $.each(errors, function (index, value) {\n                    html += '<li>' + value + '</li>';\n                });\n                html += '</ul>';\n\n                return html;\n            },\n        },\n\n        formatter: {\n            date: function (date) {\n                return Intl.DateTimeFormat('en-GB').format(date);\n            },\n            datetime: function (date) {\n                return Intl.DateTimeFormat('en-GB', {\n                    year: 'numeric',\n                    month: '2-digit',\n                    day: '2-digit',\n                    hour: '2-digit',\n                    minute: '2-digit',\n                    second: '2-digit',\n                }).format(date);\n            },\n            time: function (date) {\n                return Intl.DateTimeFormat('en-GB', {\n                    hour: '2-digit',\n                    minute: '2-digit',\n                    second: '2-digit',\n                }).format(date);\n            },\n            month: function (date) {\n                return Intl.DateTimeFormat('en-GB', {\n                    month: '2-digit',\n                    year: 'numeric',\n                }).format(date);\n            },\n            year: function (date) {\n                return Intl.DateTimeFormat('en-GB', {\n                    year: 'numeric',\n                }).format(date);\n            },\n        },\n\n        rules: {\n\n            // is not empty or blank string\n            notEmpty: function (value) {\n                return !(value === undefined || value === '' || (Array.isArray(value) && value.length === 0));\n            },\n\n            /* Deprecated */\n            empty: function (value) {\n                return $.fn.form.settings.rules.notEmpty(value);\n            },\n\n            // checkbox checked\n            checked: function () {\n                return $(this).filter(':checked').length > 0;\n            },\n\n            // is most likely an email\n            email: function (value) {\n                return $.fn.form.settings.regExp.email.test(value);\n            },\n\n            // value is most likely url\n            url: function (value) {\n                return $.fn.form.settings.regExp.url.test(value);\n            },\n\n            // matches specified regExp\n            regExp: function (value, regExp) {\n                if (regExp instanceof RegExp) {\n                    return value.match(regExp);\n                }\n                var\n                    regExpParts = regExp.match($.fn.form.settings.regExp.flags),\n                    flags\n                ;\n                // regular expression specified as /baz/gi (flags)\n                if (regExpParts) {\n                    regExp = regExpParts.length >= 2\n                        ? regExpParts[1]\n                        : regExp;\n                    flags = regExpParts.length >= 3\n                        ? regExpParts[2]\n                        : '';\n                }\n\n                return value.match(new RegExp(regExp, flags));\n            },\n            minValue: function (value, range) {\n                return $.fn.form.settings.rules.range(value, range + '..', 'number');\n            },\n            maxValue: function (value, range) {\n                return $.fn.form.settings.rules.range(value, '..' + range, 'number');\n            },\n            // is valid integer or matches range\n            integer: function (value, range) {\n                return $.fn.form.settings.rules.range(value, range, 'integer');\n            },\n            range: function (value, range, regExp, testLength) {\n                if (typeof regExp === 'string') {\n                    regExp = $.fn.form.settings.regExp[regExp];\n                }\n                if (!(regExp instanceof RegExp)) {\n                    regExp = $.fn.form.settings.regExp.integer;\n                }\n                var\n                    min,\n                    max,\n                    parts\n                ;\n                if (!range || ['', '..'].indexOf(range) !== -1) {\n\n                    // do nothing\n                } else if (range.indexOf('..') === -1) {\n                    if (regExp.test(range)) {\n                        min = range - 0;\n                        max = min;\n                    }\n                } else {\n                    parts = range.split('..', 2);\n                    if (regExp.test(parts[0])) {\n                        min = parts[0] - 0;\n                    }\n                    if (regExp.test(parts[1])) {\n                        max = parts[1] - 0;\n                    }\n                }\n                if (testLength) {\n                    value = value.length;\n                }\n\n                return (\n                    regExp.test(value)\n                        && (min === undefined || value >= min)\n                        && (max === undefined || value <= max)\n                );\n            },\n\n            // is valid number (with decimal)\n            decimal: function (value, range) {\n                return $.fn.form.settings.rules.range(value, range, 'decimal');\n            },\n\n            // is valid number\n            number: function (value, range) {\n                return $.fn.form.settings.rules.range(value, range, 'number');\n            },\n\n            // is value (case insensitive)\n            is: function (value, text) {\n                text = typeof text === 'string'\n                    ? text.toLowerCase()\n                    : text;\n                value = typeof value === 'string'\n                    ? value.toLowerCase()\n                    : value;\n\n                return value == text;\n            },\n\n            // is value\n            isExactly: function (value, text) {\n                return value == text;\n            },\n\n            // value is not another value (case insensitive)\n            not: function (value, notValue) {\n                value = typeof value === 'string'\n                    ? value.toLowerCase()\n                    : value;\n                notValue = typeof notValue === 'string'\n                    ? notValue.toLowerCase()\n                    : notValue;\n\n                return value != notValue;\n            },\n\n            // value is not another value (case sensitive)\n            notExactly: function (value, notValue) {\n                return value != notValue;\n            },\n\n            // value contains text (insensitive)\n            contains: function (value, text) {\n                // escape regex characters\n                text = text.replace($.fn.form.settings.regExp.escape, '\\\\$&');\n\n                return value.search(new RegExp(text, 'i')) !== -1;\n            },\n\n            // value contains text (case sensitive)\n            containsExactly: function (value, text) {\n                // escape regex characters\n                text = text.replace($.fn.form.settings.regExp.escape, '\\\\$&');\n\n                return value.search(new RegExp(text)) !== -1;\n            },\n\n            // value contains text (insensitive)\n            doesntContain: function (value, text) {\n                // escape regex characters\n                text = text.replace($.fn.form.settings.regExp.escape, '\\\\$&');\n\n                return value.search(new RegExp(text, 'i')) === -1;\n            },\n\n            // value contains text (case sensitive)\n            doesntContainExactly: function (value, text) {\n                // escape regex characters\n                text = text.replace($.fn.form.settings.regExp.escape, '\\\\$&');\n\n                return value.search(new RegExp(text)) === -1;\n            },\n\n            // is at least string length\n            minLength: function (value, minLength) {\n                return $.fn.form.settings.rules.range(value, minLength + '..', 'integer', true);\n            },\n\n            // is exactly length\n            exactLength: function (value, requiredLength) {\n                return $.fn.form.settings.rules.range(value, requiredLength + '..' + requiredLength, 'integer', true);\n            },\n\n            // is less than length\n            maxLength: function (value, maxLength) {\n                return $.fn.form.settings.rules.range(value, '..' + maxLength, 'integer', true);\n            },\n\n            size: function (value, range) {\n                return $.fn.form.settings.rules.range(value, range, 'integer', true);\n            },\n\n            // matches another field\n            match: function (value, identifier, module) {\n                var matchingValue = module.get.value(identifier, true);\n\n                return matchingValue !== undefined\n                    ? value.toString() === matchingValue.toString()\n                    : false;\n            },\n\n            // different than another field\n            different: function (value, identifier, module) {\n                var matchingValue = module.get.value(identifier, true);\n\n                return matchingValue !== undefined\n                    ? value.toString() !== matchingValue.toString()\n                    : false;\n            },\n\n            creditCard: function (cardNumber, cardTypes) {\n                var\n                    cards = {\n                        visa: {\n                            pattern: /^4/,\n                            length: [16],\n                        },\n                        amex: {\n                            pattern: /^3[47]/,\n                            length: [15],\n                        },\n                        mastercard: {\n                            pattern: /^5[1-5]/,\n                            length: [16],\n                        },\n                        discover: {\n                            pattern: /^(6011|622(12[6-9]|1[3-9]\\d|[2-8]\\d{2}|9[01]\\d|92[0-5]|64[4-9])|65)/,\n                            length: [16],\n                        },\n                        unionPay: {\n                            pattern: /^(62|88)/,\n                            length: [16, 17, 18, 19],\n                        },\n                        jcb: {\n                            pattern: /^35(2[89]|[3-8]\\d)/,\n                            length: [16],\n                        },\n                        maestro: {\n                            pattern: /^(5018|5020|5038|6304|6759|676[1-3])/,\n                            length: [12, 13, 14, 15, 16, 17, 18, 19],\n                        },\n                        dinersClub: {\n                            pattern: /^(30[0-5]|^36)/,\n                            length: [14],\n                        },\n                        laser: {\n                            pattern: /^(6304|670[69]|6771)/,\n                            length: [16, 17, 18, 19],\n                        },\n                        visaElectron: {\n                            pattern: /^(4026|417500|4508|4844|491(3|7))/,\n                            length: [16],\n                        },\n                    },\n                    valid         = {},\n                    validCard     = false,\n                    requiredTypes = typeof cardTypes === 'string'\n                        ? cardTypes.split(',')\n                        : false,\n                    unionPay,\n                    validation\n                ;\n\n                if (typeof cardNumber !== 'string' || cardNumber.length === 0) {\n                    return;\n                }\n\n                // allow dashes and spaces in card\n                cardNumber = cardNumber.replace(/[\\s-]/g, '');\n\n                // verify card types\n                if (requiredTypes) {\n                    $.each(requiredTypes, function (index, type) {\n                        // verify each card type\n                        validation = cards[type];\n                        if (validation) {\n                            valid = {\n                                length: $.inArray(cardNumber.length, validation.length) !== -1,\n                                pattern: cardNumber.search(validation.pattern) !== -1,\n                            };\n                            if (valid.length > 0 && valid.pattern) {\n                                validCard = true;\n                            }\n                        }\n                    });\n\n                    if (!validCard) {\n                        return false;\n                    }\n                }\n\n                // skip luhn for UnionPay\n                unionPay = {\n                    number: $.inArray(cardNumber.length, cards.unionPay.length) !== -1,\n                    pattern: cardNumber.search(cards.unionPay.pattern) !== -1,\n                };\n                if (unionPay.number && unionPay.pattern) {\n                    return true;\n                }\n\n                // verify luhn, adapted from  <https://gist.github.com/2134376>\n                var\n                    length        = cardNumber.length,\n                    multiple      = 0,\n                    producedValue = [\n                        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n                        [0, 2, 4, 6, 8, 1, 3, 5, 7, 9],\n                    ],\n                    sum           = 0\n                ;\n                while (length--) {\n                    sum += producedValue[multiple][parseInt(cardNumber.charAt(length), 10)];\n                    multiple ^= 1; // eslint-disable-line no-bitwise\n                }\n\n                return sum % 10 === 0 && sum > 0;\n            },\n\n            minCount: function (value, minCount) {\n                minCount = Number(minCount);\n\n                if (minCount === 0) {\n                    return true;\n                }\n                if (minCount === 1) {\n                    return value !== '';\n                }\n\n                return value.split(',').length >= minCount;\n            },\n\n            exactCount: function (value, exactCount) {\n                exactCount = Number(exactCount);\n\n                if (exactCount === 0) {\n                    return value === '';\n                }\n                if (exactCount === 1) {\n                    return value !== '' && value.search(',') === -1;\n                }\n\n                return value.split(',').length === exactCount;\n            },\n\n            maxCount: function (value, maxCount) {\n                maxCount = Number(maxCount);\n\n                if (maxCount === 0) {\n                    return false;\n                }\n                if (maxCount === 1) {\n                    return value.search(',') === -1;\n                }\n\n                return value.split(',').length <= maxCount;\n            },\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/grid.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Grid\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Standard\n*******************************/\n\n.ui.grid {\n  display: flex;\n  flex-flow: row wrap;\n  align-items: stretch;\n  padding: 0;\n}\n\n/* ----------------------\n      Remove Gutters\n----------------------- */\n.ui.grid {\n  margin: -1rem -1rem;\n}\n.ui.relaxed.grid {\n  margin-left: -1.5rem;\n  margin-right: -1.5rem;\n}\n.ui[class*=\"very relaxed\"].grid {\n  margin-left: -2.5rem;\n  margin-right: -2.5rem;\n}\n\n/* Preserve Rows Spacing on Consecutive Grids */\n.ui.grid + .grid {\n  margin-top: 1rem;\n}\n\n/* -------------------\n       Columns\n-------------------- */\n\n/* Standard 16 column */\n.ui.grid > .column:not(.row),\n.ui.grid > .row > .column {\n  position: relative;\n  display: inline-block;\n  width: 6.25%;\n  padding-left: 1rem;\n  padding-right: 1rem;\n  vertical-align: top;\n}\n.ui.grid > * {\n  padding-left: 1rem;\n  padding-right: 1rem;\n}\n\n/* -------------------\n        Rows\n-------------------- */\n.ui.grid > .row {\n  position: relative;\n  display: flex;\n  flex-flow: row wrap;\n  justify-content: inherit;\n  align-items: stretch;\n  width: 100% !important;\n  padding: 0;\n  padding-top: 1rem;\n  padding-bottom: 1rem;\n}\n\n/* -------------------\n       Columns\n-------------------- */\n\n/* Vertical padding when no rows */\n.ui.grid > .column:not(.row) {\n  padding-top: 1rem;\n  padding-bottom: 1rem;\n}\n.ui.grid > .row > .column {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n/* -------------------\n      Content\n-------------------- */\n.ui.grid > .row > img,\n.ui.grid > .row > .column > img {\n  max-width: 100%;\n}\n\n/* -------------------\n    Loose Coupling\n-------------------- */\n\n/* Collapse Margin on Consecutive Grid */\n.ui.grid > .ui.grid:first-child {\n  margin-top: 0;\n}\n.ui.grid > .ui.grid:last-child {\n  margin-bottom: 0;\n}\n\n/* Segment inside Aligned Grid */\n.ui.grid .aligned.row > .column > .segment:not(.compact):not(.attached),\n.ui.aligned.grid .column > .segment:not(.compact):not(.attached) {\n  width: 100%;\n}\n\n/* Align Dividers with Gutter */\n.ui.grid .row + .ui.divider {\n  flex-grow: 1;\n  margin: 1rem 1rem;\n}\n.ui.grid .column + .ui.vertical.divider {\n  height: calc(50% - 1rem);\n}\n\n/* Remove Border on Last Horizontal Segment */\n.ui.grid > .row > .column:last-child > .horizontal.segment,\n.ui.grid > .column:last-child > .horizontal.segment {\n  box-shadow: none;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* -----------------------\n           Page Grid\n    ------------------------- */\n@media only screen and (max-width: 767.98px) {\n  .ui.page.grid {\n    width: auto;\n    padding-left: 0;\n    padding-right: 0;\n    margin-left: 0;\n    margin-right: 0;\n  }\n}\n@media only screen and (min-width: 768px) and (max-width: 991.98px) {\n  .ui.page.grid {\n    width: auto;\n    margin-left: 0;\n    margin-right: 0;\n    padding-left: 2em;\n    padding-right: 2em;\n  }\n}\n@media only screen and (min-width: 992px) and (max-width: 1199.98px) {\n  .ui.page.grid {\n    width: auto;\n    margin-left: 0;\n    margin-right: 0;\n    padding-left: 3%;\n    padding-right: 3%;\n  }\n}\n@media only screen and (min-width: 1200px) and (max-width: 1919.98px) {\n  .ui.page.grid {\n    width: auto;\n    margin-left: 0;\n    margin-right: 0;\n    padding-left: 15%;\n    padding-right: 15%;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.page.grid {\n    width: auto;\n    margin-left: 0;\n    margin-right: 0;\n    padding-left: 23%;\n    padding-right: 23%;\n  }\n}\n\n/* -------------------\n     Column Count\n-------------------- */\n\n/* Assume full width with one column */\n.ui.grid > .column:only-child,\n.ui.grid > .row > .column:only-child {\n  width: 100%;\n}\n\n/* Grid Based */\n.ui[class*=\"one column\"].grid > .row > .column,\n.ui[class*=\"one column\"].grid > .column:not(.row) {\n  width: 100%;\n}\n.ui[class*=\"two column\"].grid > .row > .column,\n.ui[class*=\"two column\"].grid > .column:not(.row) {\n  width: 50%;\n}\n.ui[class*=\"three column\"].grid > .row > .column,\n.ui[class*=\"three column\"].grid > .column:not(.row) {\n  width: 33.33333333%;\n}\n.ui[class*=\"four column\"].grid > .row > .column,\n.ui[class*=\"four column\"].grid > .column:not(.row) {\n  width: 25%;\n}\n.ui[class*=\"five column\"].grid > .row > .column,\n.ui[class*=\"five column\"].grid > .column:not(.row) {\n  width: 20%;\n}\n.ui[class*=\"six column\"].grid > .row > .column,\n.ui[class*=\"six column\"].grid > .column:not(.row) {\n  width: 16.66666667%;\n}\n.ui[class*=\"seven column\"].grid > .row > .column,\n.ui[class*=\"seven column\"].grid > .column:not(.row) {\n  width: 14.28571429%;\n}\n.ui[class*=\"eight column\"].grid > .row > .column,\n.ui[class*=\"eight column\"].grid > .column:not(.row) {\n  width: 12.5%;\n}\n.ui[class*=\"nine column\"].grid > .row > .column,\n.ui[class*=\"nine column\"].grid > .column:not(.row) {\n  width: 11.11111111%;\n}\n.ui[class*=\"ten column\"].grid > .row > .column,\n.ui[class*=\"ten column\"].grid > .column:not(.row) {\n  width: 10%;\n}\n.ui[class*=\"eleven column\"].grid > .row > .column,\n.ui[class*=\"eleven column\"].grid > .column:not(.row) {\n  width: 9.09090909%;\n}\n.ui[class*=\"twelve column\"].grid > .row > .column,\n.ui[class*=\"twelve column\"].grid > .column:not(.row) {\n  width: 8.33333333%;\n}\n.ui[class*=\"thirteen column\"].grid > .row > .column,\n.ui[class*=\"thirteen column\"].grid > .column:not(.row) {\n  width: 7.69230769%;\n}\n.ui[class*=\"fourteen column\"].grid > .row > .column,\n.ui[class*=\"fourteen column\"].grid > .column:not(.row) {\n  width: 7.14285714%;\n}\n.ui[class*=\"fifteen column\"].grid > .row > .column,\n.ui[class*=\"fifteen column\"].grid > .column:not(.row) {\n  width: 6.66666667%;\n}\n.ui[class*=\"sixteen column\"].grid > .row > .column,\n.ui[class*=\"sixteen column\"].grid > .column:not(.row) {\n  width: 6.25%;\n}\n\n/* Row Based Overrides */\n.ui.grid > [class*=\"one column\"].row > .column {\n  width: 100% !important;\n}\n.ui.grid > [class*=\"two column\"].row > .column {\n  width: 50% !important;\n}\n.ui.grid > [class*=\"three column\"].row > .column {\n  width: 33.33333333% !important;\n}\n.ui.grid > [class*=\"four column\"].row > .column {\n  width: 25% !important;\n}\n.ui.grid > [class*=\"five column\"].row > .column {\n  width: 20% !important;\n}\n.ui.grid > [class*=\"six column\"].row > .column {\n  width: 16.66666667% !important;\n}\n.ui.grid > [class*=\"seven column\"].row > .column {\n  width: 14.28571429% !important;\n}\n.ui.grid > [class*=\"eight column\"].row > .column {\n  width: 12.5% !important;\n}\n.ui.grid > [class*=\"nine column\"].row > .column {\n  width: 11.11111111% !important;\n}\n.ui.grid > [class*=\"ten column\"].row > .column {\n  width: 10% !important;\n}\n.ui.grid > [class*=\"eleven column\"].row > .column {\n  width: 9.09090909% !important;\n}\n.ui.grid > [class*=\"twelve column\"].row > .column {\n  width: 8.33333333% !important;\n}\n.ui.grid > [class*=\"thirteen column\"].row > .column {\n  width: 7.69230769% !important;\n}\n.ui.grid > [class*=\"fourteen column\"].row > .column {\n  width: 7.14285714% !important;\n}\n.ui.grid > [class*=\"fifteen column\"].row > .column {\n  width: 6.66666667% !important;\n}\n.ui.grid > [class*=\"sixteen column\"].row > .column {\n  width: 6.25% !important;\n}\n\n/* Celled Page */\n.ui.celled.page.grid {\n  box-shadow: none;\n}\n\n/* -------------------\n        Column Width\n    -------------------- */\n\n/* Sizing Combinations */\n.ui.grid > .row > [class*=\"one wide\"].column,\n.ui.grid > .column.row > [class*=\"one wide\"].column,\n.ui.grid > [class*=\"one wide\"].column,\n.ui.column.grid > [class*=\"one wide\"].column {\n  width: 6.25% !important;\n}\n.ui.grid > .row > [class*=\"two wide\"].column,\n.ui.grid > .column.row > [class*=\"two wide\"].column,\n.ui.grid > [class*=\"two wide\"].column,\n.ui.column.grid > [class*=\"two wide\"].column {\n  width: 12.5% !important;\n}\n.ui.grid > .row > [class*=\"three wide\"].column,\n.ui.grid > .column.row > [class*=\"three wide\"].column,\n.ui.grid > [class*=\"three wide\"].column,\n.ui.column.grid > [class*=\"three wide\"].column {\n  width: 18.75% !important;\n}\n.ui.grid > .row > [class*=\"four wide\"].column,\n.ui.grid > .column.row > [class*=\"four wide\"].column,\n.ui.grid > [class*=\"four wide\"].column,\n.ui.column.grid > [class*=\"four wide\"].column {\n  width: 25% !important;\n}\n.ui.grid > .row > [class*=\"five wide\"].column,\n.ui.grid > .column.row > [class*=\"five wide\"].column,\n.ui.grid > [class*=\"five wide\"].column,\n.ui.column.grid > [class*=\"five wide\"].column {\n  width: 31.25% !important;\n}\n.ui.grid > .row > [class*=\"six wide\"].column,\n.ui.grid > .column.row > [class*=\"six wide\"].column,\n.ui.grid > [class*=\"six wide\"].column,\n.ui.column.grid > [class*=\"six wide\"].column {\n  width: 37.5% !important;\n}\n.ui.grid > .row > [class*=\"seven wide\"].column,\n.ui.grid > .column.row > [class*=\"seven wide\"].column,\n.ui.grid > [class*=\"seven wide\"].column,\n.ui.column.grid > [class*=\"seven wide\"].column {\n  width: 43.75% !important;\n}\n.ui.grid > .row > [class*=\"eight wide\"].column,\n.ui.grid > .column.row > [class*=\"eight wide\"].column,\n.ui.grid > [class*=\"eight wide\"].column,\n.ui.column.grid > [class*=\"eight wide\"].column {\n  width: 50% !important;\n}\n.ui.grid > .row > [class*=\"nine wide\"].column,\n.ui.grid > .column.row > [class*=\"nine wide\"].column,\n.ui.grid > [class*=\"nine wide\"].column,\n.ui.column.grid > [class*=\"nine wide\"].column {\n  width: 56.25% !important;\n}\n.ui.grid > .row > [class*=\"ten wide\"].column,\n.ui.grid > .column.row > [class*=\"ten wide\"].column,\n.ui.grid > [class*=\"ten wide\"].column,\n.ui.column.grid > [class*=\"ten wide\"].column {\n  width: 62.5% !important;\n}\n.ui.grid > .row > [class*=\"eleven wide\"].column,\n.ui.grid > .column.row > [class*=\"eleven wide\"].column,\n.ui.grid > [class*=\"eleven wide\"].column,\n.ui.column.grid > [class*=\"eleven wide\"].column {\n  width: 68.75% !important;\n}\n.ui.grid > .row > [class*=\"twelve wide\"].column,\n.ui.grid > .column.row > [class*=\"twelve wide\"].column,\n.ui.grid > [class*=\"twelve wide\"].column,\n.ui.column.grid > [class*=\"twelve wide\"].column {\n  width: 75% !important;\n}\n.ui.grid > .row > [class*=\"thirteen wide\"].column,\n.ui.grid > .column.row > [class*=\"thirteen wide\"].column,\n.ui.grid > [class*=\"thirteen wide\"].column,\n.ui.column.grid > [class*=\"thirteen wide\"].column {\n  width: 81.25% !important;\n}\n.ui.grid > .row > [class*=\"fourteen wide\"].column,\n.ui.grid > .column.row > [class*=\"fourteen wide\"].column,\n.ui.grid > [class*=\"fourteen wide\"].column,\n.ui.column.grid > [class*=\"fourteen wide\"].column {\n  width: 87.5% !important;\n}\n.ui.grid > .row > [class*=\"fifteen wide\"].column,\n.ui.grid > .column.row > [class*=\"fifteen wide\"].column,\n.ui.grid > [class*=\"fifteen wide\"].column,\n.ui.column.grid > [class*=\"fifteen wide\"].column {\n  width: 93.75% !important;\n}\n.ui.grid > .row > [class*=\"sixteen wide\"].column,\n.ui.grid > .column.row > [class*=\"sixteen wide\"].column,\n.ui.grid > [class*=\"sixteen wide\"].column,\n.ui.column.grid > [class*=\"sixteen wide\"].column {\n  width: 100% !important;\n}\n\n/* ----------------------\n        Width per Device\n    ----------------------- */\n\n/* Mobile Sizing Combinations */\n@media only screen and (min-width: 320px) and (max-width: 767.98px) {\n  .ui.grid > .row > [class*=\"one wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"one wide mobile\"].column,\n  .ui.grid > [class*=\"one wide mobile\"].column,\n  .ui.column.grid > [class*=\"one wide mobile\"].column {\n    width: 6.25% !important;\n  }\n  .ui.grid > .row > [class*=\"two wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"two wide mobile\"].column,\n  .ui.grid > [class*=\"two wide mobile\"].column,\n  .ui.column.grid > [class*=\"two wide mobile\"].column {\n    width: 12.5% !important;\n  }\n  .ui.grid > .row > [class*=\"three wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"three wide mobile\"].column,\n  .ui.grid > [class*=\"three wide mobile\"].column,\n  .ui.column.grid > [class*=\"three wide mobile\"].column {\n    width: 18.75% !important;\n  }\n  .ui.grid > .row > [class*=\"four wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"four wide mobile\"].column,\n  .ui.grid > [class*=\"four wide mobile\"].column,\n  .ui.column.grid > [class*=\"four wide mobile\"].column {\n    width: 25% !important;\n  }\n  .ui.grid > .row > [class*=\"five wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"five wide mobile\"].column,\n  .ui.grid > [class*=\"five wide mobile\"].column,\n  .ui.column.grid > [class*=\"five wide mobile\"].column {\n    width: 31.25% !important;\n  }\n  .ui.grid > .row > [class*=\"six wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"six wide mobile\"].column,\n  .ui.grid > [class*=\"six wide mobile\"].column,\n  .ui.column.grid > [class*=\"six wide mobile\"].column {\n    width: 37.5% !important;\n  }\n  .ui.grid > .row > [class*=\"seven wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"seven wide mobile\"].column,\n  .ui.grid > [class*=\"seven wide mobile\"].column,\n  .ui.column.grid > [class*=\"seven wide mobile\"].column {\n    width: 43.75% !important;\n  }\n  .ui.grid > .row > [class*=\"eight wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"eight wide mobile\"].column,\n  .ui.grid > [class*=\"eight wide mobile\"].column,\n  .ui.column.grid > [class*=\"eight wide mobile\"].column {\n    width: 50% !important;\n  }\n  .ui.grid > .row > [class*=\"nine wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"nine wide mobile\"].column,\n  .ui.grid > [class*=\"nine wide mobile\"].column,\n  .ui.column.grid > [class*=\"nine wide mobile\"].column {\n    width: 56.25% !important;\n  }\n  .ui.grid > .row > [class*=\"ten wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"ten wide mobile\"].column,\n  .ui.grid > [class*=\"ten wide mobile\"].column,\n  .ui.column.grid > [class*=\"ten wide mobile\"].column {\n    width: 62.5% !important;\n  }\n  .ui.grid > .row > [class*=\"eleven wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"eleven wide mobile\"].column,\n  .ui.grid > [class*=\"eleven wide mobile\"].column,\n  .ui.column.grid > [class*=\"eleven wide mobile\"].column {\n    width: 68.75% !important;\n  }\n  .ui.grid > .row > [class*=\"twelve wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"twelve wide mobile\"].column,\n  .ui.grid > [class*=\"twelve wide mobile\"].column,\n  .ui.column.grid > [class*=\"twelve wide mobile\"].column {\n    width: 75% !important;\n  }\n  .ui.grid > .row > [class*=\"thirteen wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"thirteen wide mobile\"].column,\n  .ui.grid > [class*=\"thirteen wide mobile\"].column,\n  .ui.column.grid > [class*=\"thirteen wide mobile\"].column {\n    width: 81.25% !important;\n  }\n  .ui.grid > .row > [class*=\"fourteen wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"fourteen wide mobile\"].column,\n  .ui.grid > [class*=\"fourteen wide mobile\"].column,\n  .ui.column.grid > [class*=\"fourteen wide mobile\"].column {\n    width: 87.5% !important;\n  }\n  .ui.grid > .row > [class*=\"fifteen wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"fifteen wide mobile\"].column,\n  .ui.grid > [class*=\"fifteen wide mobile\"].column,\n  .ui.column.grid > [class*=\"fifteen wide mobile\"].column {\n    width: 93.75% !important;\n  }\n  .ui.grid > .row > [class*=\"sixteen wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"sixteen wide mobile\"].column,\n  .ui.grid > [class*=\"sixteen wide mobile\"].column,\n  .ui.column.grid > [class*=\"sixteen wide mobile\"].column {\n    width: 100% !important;\n  }\n}\n\n/* Tablet Sizing Combinations */\n@media only screen and (min-width: 768px) and (max-width: 991.98px) {\n  .ui.grid > .row > [class*=\"one wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"one wide tablet\"].column,\n  .ui.grid > [class*=\"one wide tablet\"].column,\n  .ui.column.grid > [class*=\"one wide tablet\"].column {\n    width: 6.25% !important;\n  }\n  .ui.grid > .row > [class*=\"two wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"two wide tablet\"].column,\n  .ui.grid > [class*=\"two wide tablet\"].column,\n  .ui.column.grid > [class*=\"two wide tablet\"].column {\n    width: 12.5% !important;\n  }\n  .ui.grid > .row > [class*=\"three wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"three wide tablet\"].column,\n  .ui.grid > [class*=\"three wide tablet\"].column,\n  .ui.column.grid > [class*=\"three wide tablet\"].column {\n    width: 18.75% !important;\n  }\n  .ui.grid > .row > [class*=\"four wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"four wide tablet\"].column,\n  .ui.grid > [class*=\"four wide tablet\"].column,\n  .ui.column.grid > [class*=\"four wide tablet\"].column {\n    width: 25% !important;\n  }\n  .ui.grid > .row > [class*=\"five wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"five wide tablet\"].column,\n  .ui.grid > [class*=\"five wide tablet\"].column,\n  .ui.column.grid > [class*=\"five wide tablet\"].column {\n    width: 31.25% !important;\n  }\n  .ui.grid > .row > [class*=\"six wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"six wide tablet\"].column,\n  .ui.grid > [class*=\"six wide tablet\"].column,\n  .ui.column.grid > [class*=\"six wide tablet\"].column {\n    width: 37.5% !important;\n  }\n  .ui.grid > .row > [class*=\"seven wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"seven wide tablet\"].column,\n  .ui.grid > [class*=\"seven wide tablet\"].column,\n  .ui.column.grid > [class*=\"seven wide tablet\"].column {\n    width: 43.75% !important;\n  }\n  .ui.grid > .row > [class*=\"eight wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"eight wide tablet\"].column,\n  .ui.grid > [class*=\"eight wide tablet\"].column,\n  .ui.column.grid > [class*=\"eight wide tablet\"].column {\n    width: 50% !important;\n  }\n  .ui.grid > .row > [class*=\"nine wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"nine wide tablet\"].column,\n  .ui.grid > [class*=\"nine wide tablet\"].column,\n  .ui.column.grid > [class*=\"nine wide tablet\"].column {\n    width: 56.25% !important;\n  }\n  .ui.grid > .row > [class*=\"ten wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"ten wide tablet\"].column,\n  .ui.grid > [class*=\"ten wide tablet\"].column,\n  .ui.column.grid > [class*=\"ten wide tablet\"].column {\n    width: 62.5% !important;\n  }\n  .ui.grid > .row > [class*=\"eleven wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"eleven wide tablet\"].column,\n  .ui.grid > [class*=\"eleven wide tablet\"].column,\n  .ui.column.grid > [class*=\"eleven wide tablet\"].column {\n    width: 68.75% !important;\n  }\n  .ui.grid > .row > [class*=\"twelve wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"twelve wide tablet\"].column,\n  .ui.grid > [class*=\"twelve wide tablet\"].column,\n  .ui.column.grid > [class*=\"twelve wide tablet\"].column {\n    width: 75% !important;\n  }\n  .ui.grid > .row > [class*=\"thirteen wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"thirteen wide tablet\"].column,\n  .ui.grid > [class*=\"thirteen wide tablet\"].column,\n  .ui.column.grid > [class*=\"thirteen wide tablet\"].column {\n    width: 81.25% !important;\n  }\n  .ui.grid > .row > [class*=\"fourteen wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"fourteen wide tablet\"].column,\n  .ui.grid > [class*=\"fourteen wide tablet\"].column,\n  .ui.column.grid > [class*=\"fourteen wide tablet\"].column {\n    width: 87.5% !important;\n  }\n  .ui.grid > .row > [class*=\"fifteen wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"fifteen wide tablet\"].column,\n  .ui.grid > [class*=\"fifteen wide tablet\"].column,\n  .ui.column.grid > [class*=\"fifteen wide tablet\"].column {\n    width: 93.75% !important;\n  }\n  .ui.grid > .row > [class*=\"sixteen wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"sixteen wide tablet\"].column,\n  .ui.grid > [class*=\"sixteen wide tablet\"].column,\n  .ui.column.grid > [class*=\"sixteen wide tablet\"].column {\n    width: 100% !important;\n  }\n}\n\n/* Computer/Desktop Sizing Combinations */\n@media only screen and (min-width: 992px) {\n  .ui.grid > .row > [class*=\"one wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"one wide computer\"].column,\n  .ui.grid > [class*=\"one wide computer\"].column,\n  .ui.column.grid > [class*=\"one wide computer\"].column {\n    width: 6.25% !important;\n  }\n  .ui.grid > .row > [class*=\"two wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"two wide computer\"].column,\n  .ui.grid > [class*=\"two wide computer\"].column,\n  .ui.column.grid > [class*=\"two wide computer\"].column {\n    width: 12.5% !important;\n  }\n  .ui.grid > .row > [class*=\"three wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"three wide computer\"].column,\n  .ui.grid > [class*=\"three wide computer\"].column,\n  .ui.column.grid > [class*=\"three wide computer\"].column {\n    width: 18.75% !important;\n  }\n  .ui.grid > .row > [class*=\"four wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"four wide computer\"].column,\n  .ui.grid > [class*=\"four wide computer\"].column,\n  .ui.column.grid > [class*=\"four wide computer\"].column {\n    width: 25% !important;\n  }\n  .ui.grid > .row > [class*=\"five wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"five wide computer\"].column,\n  .ui.grid > [class*=\"five wide computer\"].column,\n  .ui.column.grid > [class*=\"five wide computer\"].column {\n    width: 31.25% !important;\n  }\n  .ui.grid > .row > [class*=\"six wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"six wide computer\"].column,\n  .ui.grid > [class*=\"six wide computer\"].column,\n  .ui.column.grid > [class*=\"six wide computer\"].column {\n    width: 37.5% !important;\n  }\n  .ui.grid > .row > [class*=\"seven wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"seven wide computer\"].column,\n  .ui.grid > [class*=\"seven wide computer\"].column,\n  .ui.column.grid > [class*=\"seven wide computer\"].column {\n    width: 43.75% !important;\n  }\n  .ui.grid > .row > [class*=\"eight wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"eight wide computer\"].column,\n  .ui.grid > [class*=\"eight wide computer\"].column,\n  .ui.column.grid > [class*=\"eight wide computer\"].column {\n    width: 50% !important;\n  }\n  .ui.grid > .row > [class*=\"nine wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"nine wide computer\"].column,\n  .ui.grid > [class*=\"nine wide computer\"].column,\n  .ui.column.grid > [class*=\"nine wide computer\"].column {\n    width: 56.25% !important;\n  }\n  .ui.grid > .row > [class*=\"ten wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"ten wide computer\"].column,\n  .ui.grid > [class*=\"ten wide computer\"].column,\n  .ui.column.grid > [class*=\"ten wide computer\"].column {\n    width: 62.5% !important;\n  }\n  .ui.grid > .row > [class*=\"eleven wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"eleven wide computer\"].column,\n  .ui.grid > [class*=\"eleven wide computer\"].column,\n  .ui.column.grid > [class*=\"eleven wide computer\"].column {\n    width: 68.75% !important;\n  }\n  .ui.grid > .row > [class*=\"twelve wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"twelve wide computer\"].column,\n  .ui.grid > [class*=\"twelve wide computer\"].column,\n  .ui.column.grid > [class*=\"twelve wide computer\"].column {\n    width: 75% !important;\n  }\n  .ui.grid > .row > [class*=\"thirteen wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"thirteen wide computer\"].column,\n  .ui.grid > [class*=\"thirteen wide computer\"].column,\n  .ui.column.grid > [class*=\"thirteen wide computer\"].column {\n    width: 81.25% !important;\n  }\n  .ui.grid > .row > [class*=\"fourteen wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"fourteen wide computer\"].column,\n  .ui.grid > [class*=\"fourteen wide computer\"].column,\n  .ui.column.grid > [class*=\"fourteen wide computer\"].column {\n    width: 87.5% !important;\n  }\n  .ui.grid > .row > [class*=\"fifteen wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"fifteen wide computer\"].column,\n  .ui.grid > [class*=\"fifteen wide computer\"].column,\n  .ui.column.grid > [class*=\"fifteen wide computer\"].column {\n    width: 93.75% !important;\n  }\n  .ui.grid > .row > [class*=\"sixteen wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"sixteen wide computer\"].column,\n  .ui.grid > [class*=\"sixteen wide computer\"].column,\n  .ui.column.grid > [class*=\"sixteen wide computer\"].column {\n    width: 100% !important;\n  }\n}\n\n/* Large Monitor Sizing Combinations */\n@media only screen and (min-width: 1200px) and (max-width: 1919.98px) {\n  .ui.grid > .row > [class*=\"one wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"one wide large screen\"].column,\n  .ui.grid > [class*=\"one wide large screen\"].column,\n  .ui.column.grid > [class*=\"one wide large screen\"].column {\n    width: 6.25% !important;\n  }\n  .ui.grid > .row > [class*=\"two wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"two wide large screen\"].column,\n  .ui.grid > [class*=\"two wide large screen\"].column,\n  .ui.column.grid > [class*=\"two wide large screen\"].column {\n    width: 12.5% !important;\n  }\n  .ui.grid > .row > [class*=\"three wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"three wide large screen\"].column,\n  .ui.grid > [class*=\"three wide large screen\"].column,\n  .ui.column.grid > [class*=\"three wide large screen\"].column {\n    width: 18.75% !important;\n  }\n  .ui.grid > .row > [class*=\"four wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"four wide large screen\"].column,\n  .ui.grid > [class*=\"four wide large screen\"].column,\n  .ui.column.grid > [class*=\"four wide large screen\"].column {\n    width: 25% !important;\n  }\n  .ui.grid > .row > [class*=\"five wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"five wide large screen\"].column,\n  .ui.grid > [class*=\"five wide large screen\"].column,\n  .ui.column.grid > [class*=\"five wide large screen\"].column {\n    width: 31.25% !important;\n  }\n  .ui.grid > .row > [class*=\"six wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"six wide large screen\"].column,\n  .ui.grid > [class*=\"six wide large screen\"].column,\n  .ui.column.grid > [class*=\"six wide large screen\"].column {\n    width: 37.5% !important;\n  }\n  .ui.grid > .row > [class*=\"seven wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"seven wide large screen\"].column,\n  .ui.grid > [class*=\"seven wide large screen\"].column,\n  .ui.column.grid > [class*=\"seven wide large screen\"].column {\n    width: 43.75% !important;\n  }\n  .ui.grid > .row > [class*=\"eight wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"eight wide large screen\"].column,\n  .ui.grid > [class*=\"eight wide large screen\"].column,\n  .ui.column.grid > [class*=\"eight wide large screen\"].column {\n    width: 50% !important;\n  }\n  .ui.grid > .row > [class*=\"nine wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"nine wide large screen\"].column,\n  .ui.grid > [class*=\"nine wide large screen\"].column,\n  .ui.column.grid > [class*=\"nine wide large screen\"].column {\n    width: 56.25% !important;\n  }\n  .ui.grid > .row > [class*=\"ten wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"ten wide large screen\"].column,\n  .ui.grid > [class*=\"ten wide large screen\"].column,\n  .ui.column.grid > [class*=\"ten wide large screen\"].column {\n    width: 62.5% !important;\n  }\n  .ui.grid > .row > [class*=\"eleven wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"eleven wide large screen\"].column,\n  .ui.grid > [class*=\"eleven wide large screen\"].column,\n  .ui.column.grid > [class*=\"eleven wide large screen\"].column {\n    width: 68.75% !important;\n  }\n  .ui.grid > .row > [class*=\"twelve wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"twelve wide large screen\"].column,\n  .ui.grid > [class*=\"twelve wide large screen\"].column,\n  .ui.column.grid > [class*=\"twelve wide large screen\"].column {\n    width: 75% !important;\n  }\n  .ui.grid > .row > [class*=\"thirteen wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"thirteen wide large screen\"].column,\n  .ui.grid > [class*=\"thirteen wide large screen\"].column,\n  .ui.column.grid > [class*=\"thirteen wide large screen\"].column {\n    width: 81.25% !important;\n  }\n  .ui.grid > .row > [class*=\"fourteen wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"fourteen wide large screen\"].column,\n  .ui.grid > [class*=\"fourteen wide large screen\"].column,\n  .ui.column.grid > [class*=\"fourteen wide large screen\"].column {\n    width: 87.5% !important;\n  }\n  .ui.grid > .row > [class*=\"fifteen wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"fifteen wide large screen\"].column,\n  .ui.grid > [class*=\"fifteen wide large screen\"].column,\n  .ui.column.grid > [class*=\"fifteen wide large screen\"].column {\n    width: 93.75% !important;\n  }\n  .ui.grid > .row > [class*=\"sixteen wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"sixteen wide large screen\"].column,\n  .ui.grid > [class*=\"sixteen wide large screen\"].column,\n  .ui.column.grid > [class*=\"sixteen wide large screen\"].column {\n    width: 100% !important;\n  }\n}\n\n/* Widescreen Sizing Combinations */\n@media only screen and (min-width: 1920px) {\n  .ui.grid > .row > [class*=\"one wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"one wide widescreen\"].column,\n  .ui.grid > [class*=\"one wide widescreen\"].column,\n  .ui.column.grid > [class*=\"one wide widescreen\"].column {\n    width: 6.25% !important;\n  }\n  .ui.grid > .row > [class*=\"two wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"two wide widescreen\"].column,\n  .ui.grid > [class*=\"two wide widescreen\"].column,\n  .ui.column.grid > [class*=\"two wide widescreen\"].column {\n    width: 12.5% !important;\n  }\n  .ui.grid > .row > [class*=\"three wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"three wide widescreen\"].column,\n  .ui.grid > [class*=\"three wide widescreen\"].column,\n  .ui.column.grid > [class*=\"three wide widescreen\"].column {\n    width: 18.75% !important;\n  }\n  .ui.grid > .row > [class*=\"four wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"four wide widescreen\"].column,\n  .ui.grid > [class*=\"four wide widescreen\"].column,\n  .ui.column.grid > [class*=\"four wide widescreen\"].column {\n    width: 25% !important;\n  }\n  .ui.grid > .row > [class*=\"five wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"five wide widescreen\"].column,\n  .ui.grid > [class*=\"five wide widescreen\"].column,\n  .ui.column.grid > [class*=\"five wide widescreen\"].column {\n    width: 31.25% !important;\n  }\n  .ui.grid > .row > [class*=\"six wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"six wide widescreen\"].column,\n  .ui.grid > [class*=\"six wide widescreen\"].column,\n  .ui.column.grid > [class*=\"six wide widescreen\"].column {\n    width: 37.5% !important;\n  }\n  .ui.grid > .row > [class*=\"seven wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"seven wide widescreen\"].column,\n  .ui.grid > [class*=\"seven wide widescreen\"].column,\n  .ui.column.grid > [class*=\"seven wide widescreen\"].column {\n    width: 43.75% !important;\n  }\n  .ui.grid > .row > [class*=\"eight wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"eight wide widescreen\"].column,\n  .ui.grid > [class*=\"eight wide widescreen\"].column,\n  .ui.column.grid > [class*=\"eight wide widescreen\"].column {\n    width: 50% !important;\n  }\n  .ui.grid > .row > [class*=\"nine wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"nine wide widescreen\"].column,\n  .ui.grid > [class*=\"nine wide widescreen\"].column,\n  .ui.column.grid > [class*=\"nine wide widescreen\"].column {\n    width: 56.25% !important;\n  }\n  .ui.grid > .row > [class*=\"ten wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"ten wide widescreen\"].column,\n  .ui.grid > [class*=\"ten wide widescreen\"].column,\n  .ui.column.grid > [class*=\"ten wide widescreen\"].column {\n    width: 62.5% !important;\n  }\n  .ui.grid > .row > [class*=\"eleven wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"eleven wide widescreen\"].column,\n  .ui.grid > [class*=\"eleven wide widescreen\"].column,\n  .ui.column.grid > [class*=\"eleven wide widescreen\"].column {\n    width: 68.75% !important;\n  }\n  .ui.grid > .row > [class*=\"twelve wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"twelve wide widescreen\"].column,\n  .ui.grid > [class*=\"twelve wide widescreen\"].column,\n  .ui.column.grid > [class*=\"twelve wide widescreen\"].column {\n    width: 75% !important;\n  }\n  .ui.grid > .row > [class*=\"thirteen wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"thirteen wide widescreen\"].column,\n  .ui.grid > [class*=\"thirteen wide widescreen\"].column,\n  .ui.column.grid > [class*=\"thirteen wide widescreen\"].column {\n    width: 81.25% !important;\n  }\n  .ui.grid > .row > [class*=\"fourteen wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"fourteen wide widescreen\"].column,\n  .ui.grid > [class*=\"fourteen wide widescreen\"].column,\n  .ui.column.grid > [class*=\"fourteen wide widescreen\"].column {\n    width: 87.5% !important;\n  }\n  .ui.grid > .row > [class*=\"fifteen wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"fifteen wide widescreen\"].column,\n  .ui.grid > [class*=\"fifteen wide widescreen\"].column,\n  .ui.column.grid > [class*=\"fifteen wide widescreen\"].column {\n    width: 93.75% !important;\n  }\n  .ui.grid > .row > [class*=\"sixteen wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"sixteen wide widescreen\"].column,\n  .ui.grid > [class*=\"sixteen wide widescreen\"].column,\n  .ui.column.grid > [class*=\"sixteen wide widescreen\"].column {\n    width: 100% !important;\n  }\n}\n\n/* ----------------------\n            Centered\n    ----------------------- */\n.ui.centered.grid,\n.ui.centered.grid > .row,\n.ui.grid > .centered.row {\n  text-align: center;\n  justify-content: center;\n}\n.ui.centered.grid > .column:not(.aligned):not(.justified):not(.row),\n.ui.centered.grid > .row > .column:not(.aligned):not(.justified),\n.ui.grid .centered.row > .column:not(.aligned):not(.justified) {\n  text-align: left;\n}\n.ui.grid > .centered.column,\n.ui.grid > .row > .centered.column {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n/* ----------------------\n            Relaxed\n    ----------------------- */\n.ui.relaxed.grid > .column:not(.row),\n.ui.relaxed.grid > .row > .column,\n.ui.grid > .relaxed.row > .column {\n  padding-left: 1.5rem;\n  padding-right: 1.5rem;\n}\n.ui[class*=\"very relaxed\"].grid > .column:not(.row),\n.ui[class*=\"very relaxed\"].grid > .row > .column,\n.ui.grid > [class*=\"very relaxed\"].row > .column {\n  padding-left: 2.5rem;\n  padding-right: 2.5rem;\n}\n\n/* Coupling with UI Divider */\n.ui.relaxed.grid .row + .ui.divider,\n.ui.grid .relaxed.row + .ui.divider {\n  margin-left: 1.5rem;\n  margin-right: 1.5rem;\n}\n.ui[class*=\"very relaxed\"].grid .row + .ui.divider,\n.ui.grid [class*=\"very relaxed\"].row + .ui.divider {\n  margin-left: 2.5rem;\n  margin-right: 2.5rem;\n}\n\n/* ----------------------\n            Padded\n    ----------------------- */\n.ui.padded.grid:not(.vertically):not(.horizontally) {\n  margin: 0;\n}\n[class*=\"horizontally padded\"].ui.grid {\n  margin-left: 0;\n  margin-right: 0;\n}\n[class*=\"vertically padded\"].ui.grid {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n/* ----------------------\n           \"Floated\"\n    ----------------------- */\n.ui.grid [class*=\"left floated\"].column {\n  margin-right: auto;\n}\n.ui.grid [class*=\"right floated\"].column {\n  margin-left: auto;\n}\n\n/* ----------------------\n            Divided\n    ----------------------- */\n.ui.divided.grid:not([class*=\"vertically divided\"]) > .column:not(.row),\n.ui.divided.grid:not([class*=\"vertically divided\"]) > .row > .column {\n  box-shadow: -1px 0 0 0 rgba(34, 36, 38, 0.15);\n}\n\n/* Swap from padding to margin on columns to have dividers align */\n.ui[class*=\"vertically divided\"].grid > .column:not(.row),\n.ui[class*=\"vertically divided\"].grid > .row > .column {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  padding-top: 0;\n  padding-bottom: 0;\n}\n.ui[class*=\"vertically divided\"].grid > .row {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n/* No divider on first column on row */\n.ui.divided.grid:not([class*=\"vertically divided\"]) > .column:first-child,\n.ui.divided.grid:not([class*=\"vertically divided\"]) > .row > .column:first-child {\n  box-shadow: none;\n}\n\n/* No space on top of first row */\n.ui[class*=\"vertically divided\"].grid > .row:first-child > .column {\n  margin-top: 0;\n}\n\n/* Divided Row */\n.ui.grid > .divided.row > .column {\n  box-shadow: -1px 0 0 0 rgba(34, 36, 38, 0.15);\n}\n.ui.grid > .divided.row > .column:first-child {\n  box-shadow: none;\n}\n\n/* Vertically Divided */\n.ui[class*=\"vertically divided\"].grid > .row {\n  position: relative;\n}\n.ui[class*=\"vertically divided\"].grid > .row::before {\n  position: absolute;\n  content: \"\";\n  top: 0;\n  left: 0;\n  width: calc(100% - 2rem);\n  height: 1px;\n  margin: 0 1rem;\n  box-shadow: 0 -1px 0 0 rgba(34, 36, 38, 0.15);\n}\n\n/* Padded Horizontally Divided */\n[class*=\"horizontally padded\"].ui.divided.grid,\n.ui.padded.divided.grid:not(.vertically):not(.horizontally) {\n  width: 100%;\n}\n\n/* First Row Vertically Divided */\n.ui[class*=\"vertically divided\"].grid > .row:first-child::before {\n  box-shadow: none;\n}\n\n/* Inverted Divided */\n.ui.inverted.divided.grid:not([class*=\"vertically divided\"]) > .column:not(.row),\n.ui.inverted.divided.grid:not([class*=\"vertically divided\"]) > .row > .column {\n  box-shadow: -1px 0 0 0 rgba(255, 255, 255, 0.1);\n}\n.ui.inverted.divided.grid:not([class*=\"vertically divided\"]) > .column:not(.row):first-child,\n.ui.inverted.divided.grid:not([class*=\"vertically divided\"]) > .row > .column:first-child {\n  box-shadow: none;\n}\n.ui.inverted[class*=\"vertically divided\"].grid > .row::before {\n  box-shadow: 0 -1px 0 0 rgba(255, 255, 255, 0.1);\n}\n\n/* Relaxed */\n.ui.relaxed[class*=\"vertically divided\"].grid > .row::before {\n  margin-left: 1.5rem;\n  margin-right: 1.5rem;\n  width: calc(100% - 3rem);\n}\n.ui[class*=\"very relaxed\"][class*=\"vertically divided\"].grid > .row::before {\n  margin-left: 2.5rem;\n  margin-right: 2.5rem;\n  width: calc(100% - 5rem);\n}\n\n/* ----------------------\n             Celled\n    ----------------------- */\n.ui.celled.grid {\n  width: 100%;\n  margin: 1em 0;\n  box-shadow: 0 0 0 1px #d4d4d5;\n}\n.ui.celled.grid > .row {\n  width: 100% !important;\n  margin: 0;\n  padding: 0;\n  box-shadow: 0 -1px 0 0 #d4d4d5;\n}\n.ui.celled.grid > .column:not(.row),\n.ui.celled.grid > .row > .column {\n  box-shadow: -1px 0 0 0 #d4d4d5;\n}\n.ui.celled.grid > .column:first-child,\n.ui.celled.grid > .row > .column:first-child {\n  box-shadow: none;\n}\n.ui.celled.grid > .column:not(.row),\n.ui.celled.grid > .row > .column {\n  padding: 1em;\n}\n.ui.relaxed.celled.grid > .column:not(.row),\n.ui.relaxed.celled.grid > .row > .column {\n  padding: 1.5em;\n}\n.ui[class*=\"very relaxed\"].celled.grid > .column:not(.row),\n.ui[class*=\"very relaxed\"].celled.grid > .row > .column {\n  padding: 2em;\n}\n\n/* Internally Celled */\n.ui[class*=\"internally celled\"].grid {\n  box-shadow: none;\n  margin: 0;\n}\n.ui[class*=\"internally celled\"].grid > .row:first-child {\n  box-shadow: none;\n}\n.ui[class*=\"internally celled\"].grid > .row > .column:first-child {\n  box-shadow: none;\n}\n\n/* ----------------------\n       Vertically Aligned\n    ----------------------- */\n\n/* Top Aligned */\n.ui[class*=\"top aligned\"].grid > .column:not(.row),\n.ui[class*=\"top aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"top aligned\"].row > .column,\n.ui.grid > [class*=\"top aligned\"].column:not(.row),\n.ui.grid > .row > [class*=\"top aligned\"].column {\n  flex-direction: column;\n  vertical-align: top;\n  align-self: flex-start !important;\n}\n\n/* Middle Aligned */\n.ui[class*=\"middle aligned\"].grid > .column:not(.row),\n.ui[class*=\"middle aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"middle aligned\"].row > .column,\n.ui.grid > [class*=\"middle aligned\"].column:not(.row),\n.ui.grid > .row > [class*=\"middle aligned\"].column {\n  flex-direction: column;\n  vertical-align: middle;\n  align-self: center !important;\n}\n\n/* Bottom Aligned */\n.ui[class*=\"bottom aligned\"].grid > .column:not(.row),\n.ui[class*=\"bottom aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"bottom aligned\"].row > .column,\n.ui.grid > [class*=\"bottom aligned\"].column:not(.row),\n.ui.grid > .row > [class*=\"bottom aligned\"].column {\n  flex-direction: column;\n  vertical-align: bottom;\n  align-self: flex-end !important;\n}\n\n/* Stretched */\n.ui.stretched.grid > .row > .column,\n.ui.stretched.grid > .column,\n.ui.grid > .stretched.row > .column,\n.ui.grid > .stretched.column:not(.row),\n.ui.grid > .row > .stretched.column {\n  display: inline-flex !important;\n  align-self: stretch;\n  flex-direction: column;\n}\n.ui.stretched.grid > .row > .column > *,\n.ui.stretched.grid > .column > *,\n.ui.grid > .stretched.row > .column > *,\n.ui.grid > .stretched.column:not(.row) > *,\n.ui.grid > .row > .stretched.column > * {\n  flex-grow: 1;\n}\n\n/* ----------------------\n      Horizontally Centered\n    ----------------------- */\n\n/* Left Aligned */\n.ui[class*=\"left aligned\"].grid > .column,\n.ui[class*=\"left aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"left aligned\"].row > .column,\n.ui.ui.grid > [class*=\"left aligned\"].column,\n.ui.ui.grid > .row > [class*=\"left aligned\"].column {\n  text-align: left;\n  align-self: inherit;\n}\n\n/* Center Aligned */\n.ui[class*=\"center aligned\"].grid > .column,\n.ui[class*=\"center aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"center aligned\"].row > .column,\n.ui.ui.grid > [class*=\"center aligned\"].column,\n.ui.ui.grid > .row > [class*=\"center aligned\"].column {\n  text-align: center;\n  align-self: inherit;\n}\n.ui[class*=\"center aligned\"].grid {\n  justify-content: center;\n}\n\n/* Right Aligned */\n.ui[class*=\"right aligned\"].grid > .column,\n.ui[class*=\"right aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"right aligned\"].row > .column,\n.ui.ui.grid > [class*=\"right aligned\"].column,\n.ui.ui.grid > .row > [class*=\"right aligned\"].column {\n  text-align: right;\n  align-self: inherit;\n}\n\n/* Justified */\n.ui.justified.grid > .column,\n.ui.justified.grid > .row > .column,\n.ui.grid > .justified.row > .column,\n.ui.ui.grid > .justified.column,\n.ui.ui.grid > .row > .justified.column {\n  text-align: justify;\n  -webkit-hyphens: auto;\n      -ms-hyphens: auto;\n          hyphens: auto;\n}\n\n/* ----------------------\n         Colored\n----------------------- */\n.ui.grid > .primary.row,\n.ui.grid > .primary.column,\n.ui.grid > .row > .primary.column {\n  background-color: #2185d0;\n  color: #fff;\n}\n.ui.grid > .secondary.row,\n.ui.grid > .secondary.column,\n.ui.grid > .row > .secondary.column {\n  background-color: #1b1c1d;\n  color: #fff;\n}\n.ui.grid > .red.row,\n.ui.grid > .red.column,\n.ui.grid > .row > .red.column {\n  background-color: #db2828;\n  color: #fff;\n}\n.ui.grid > .orange.row,\n.ui.grid > .orange.column,\n.ui.grid > .row > .orange.column {\n  background-color: #f2711c;\n  color: #fff;\n}\n.ui.grid > .yellow.row,\n.ui.grid > .yellow.column,\n.ui.grid > .row > .yellow.column {\n  background-color: #fbbd08;\n  color: #fff;\n}\n.ui.grid > .olive.row,\n.ui.grid > .olive.column,\n.ui.grid > .row > .olive.column {\n  background-color: #b5cc18;\n  color: #fff;\n}\n.ui.grid > .green.row,\n.ui.grid > .green.column,\n.ui.grid > .row > .green.column {\n  background-color: #21ba45;\n  color: #fff;\n}\n.ui.grid > .teal.row,\n.ui.grid > .teal.column,\n.ui.grid > .row > .teal.column {\n  background-color: #00b5ad;\n  color: #fff;\n}\n.ui.grid > .blue.row,\n.ui.grid > .blue.column,\n.ui.grid > .row > .blue.column {\n  background-color: #2185d0;\n  color: #fff;\n}\n.ui.grid > .violet.row,\n.ui.grid > .violet.column,\n.ui.grid > .row > .violet.column {\n  background-color: #6435c9;\n  color: #fff;\n}\n.ui.grid > .purple.row,\n.ui.grid > .purple.column,\n.ui.grid > .row > .purple.column {\n  background-color: #a333c8;\n  color: #fff;\n}\n.ui.grid > .pink.row,\n.ui.grid > .pink.column,\n.ui.grid > .row > .pink.column {\n  background-color: #e03997;\n  color: #fff;\n}\n.ui.grid > .brown.row,\n.ui.grid > .brown.column,\n.ui.grid > .row > .brown.column {\n  background-color: #a5673f;\n  color: #fff;\n}\n.ui.grid > .grey.row,\n.ui.grid > .grey.column,\n.ui.grid > .row > .grey.column {\n  background-color: #767676;\n  color: #fff;\n}\n.ui.grid > .black.row,\n.ui.grid > .black.column,\n.ui.grid > .row > .black.column {\n  background-color: #1b1c1d;\n  color: #fff;\n}\n\n/* ----------------------\n          Equal Width\n    ----------------------- */\n.ui[class*=\"equal width\"].grid > .column:not(.row),\n.ui[class*=\"equal width\"].grid > .row > .column,\n.ui.grid > [class*=\"equal width\"].row > .column {\n  display: inline-block;\n  flex-grow: 1;\n}\n.ui[class*=\"equal width\"].grid > .wide.column,\n.ui[class*=\"equal width\"].grid > .row > .wide.column,\n.ui.grid > [class*=\"equal width\"].row > .wide.column {\n  flex-grow: 0;\n}\n\n/* ----------------------\n            Reverse\n    ----------------------- */\n\n/* Mobile */\n@media only screen and (max-width: 767.98px) {\n  .ui[class*=\"mobile reversed\"].grid,\n  .ui[class*=\"mobile reversed\"].grid > .row,\n  .ui.grid > [class*=\"mobile reversed\"].row {\n    flex-direction: row-reverse;\n  }\n  .ui[class*=\"mobile vertically reversed\"].grid,\n  .ui.stackable[class*=\"mobile reversed\"] {\n    flex-direction: column-reverse;\n  }\n  \n/* Divided Reversed */\n  .ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:first-child,\n  .ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:first-child {\n    box-shadow: -1px 0 0 0 rgba(34, 36, 38, 0.15);\n  }\n  .ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:last-child,\n  .ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:last-child {\n    box-shadow: none;\n  }\n  \n/* Vertically Divided Reversed */\n  .ui.grid[class*=\"vertically divided\"][class*=\"mobile vertically reversed\"] > .row:first-child::before {\n    box-shadow: 0 -1px 0 0 rgba(34, 36, 38, 0.15);\n  }\n  .ui.grid[class*=\"vertically divided\"][class*=\"mobile vertically reversed\"] > .row:last-child::before {\n    box-shadow: none;\n  }\n  \n/* Celled Reversed */\n  .ui[class*=\"mobile reversed\"].celled.grid > .row > .column:first-child {\n    box-shadow: -1px 0 0 0 #d4d4d5;\n  }\n  .ui[class*=\"mobile reversed\"].celled.grid > .row > .column:last-child {\n    box-shadow: none;\n  }\n}\n\n/* Tablet */\n@media only screen and (min-width: 768px) and (max-width: 991.98px) {\n  .ui[class*=\"tablet reversed\"].grid,\n  .ui[class*=\"tablet reversed\"].grid > .row,\n  .ui.grid > [class*=\"tablet reversed\"].row {\n    flex-direction: row-reverse;\n  }\n  .ui[class*=\"tablet vertically reversed\"].grid {\n    flex-direction: column-reverse;\n  }\n  \n/* Divided Reversed */\n  .ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:first-child,\n  .ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:first-child {\n    box-shadow: -1px 0 0 0 rgba(34, 36, 38, 0.15);\n  }\n  .ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:last-child,\n  .ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:last-child {\n    box-shadow: none;\n  }\n  \n/* Vertically Divided Reversed */\n  .ui.grid[class*=\"vertically divided\"][class*=\"tablet vertically reversed\"] > .row:first-child::before {\n    box-shadow: 0 -1px 0 0 rgba(34, 36, 38, 0.15);\n  }\n  .ui.grid[class*=\"vertically divided\"][class*=\"tablet vertically reversed\"] > .row:last-child::before {\n    box-shadow: none;\n  }\n  \n/* Celled Reversed */\n  .ui[class*=\"tablet reversed\"].celled.grid > .row > .column:first-child {\n    box-shadow: -1px 0 0 0 #d4d4d5;\n  }\n  .ui[class*=\"tablet reversed\"].celled.grid > .row > .column:last-child {\n    box-shadow: none;\n  }\n}\n\n/* Computer */\n@media only screen and (min-width: 992px) {\n  .ui[class*=\"computer reversed\"].grid,\n  .ui[class*=\"computer reversed\"].grid > .row,\n  .ui.grid > [class*=\"computer reversed\"].row {\n    flex-direction: row-reverse;\n  }\n  .ui[class*=\"computer vertically reversed\"].grid {\n    flex-direction: column-reverse;\n  }\n  \n/* Divided Reversed */\n  .ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:first-child,\n  .ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:first-child {\n    box-shadow: -1px 0 0 0 rgba(34, 36, 38, 0.15);\n  }\n  .ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:last-child,\n  .ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:last-child {\n    box-shadow: none;\n  }\n  \n/* Vertically Divided Reversed */\n  .ui.grid[class*=\"vertically divided\"][class*=\"computer vertically reversed\"] > .row:first-child::before {\n    box-shadow: 0 -1px 0 0 rgba(34, 36, 38, 0.15);\n  }\n  .ui.grid[class*=\"vertically divided\"][class*=\"computer vertically reversed\"] > .row:last-child::before {\n    box-shadow: none;\n  }\n  \n/* Celled Reversed */\n  .ui[class*=\"computer reversed\"].celled.grid > .row > .column:first-child {\n    box-shadow: -1px 0 0 0 #d4d4d5;\n  }\n  .ui[class*=\"computer reversed\"].celled.grid > .row > .column:last-child {\n    box-shadow: none;\n  }\n}\n\n/* -------------------\n          Doubling\n    -------------------- */\n\n/* Tablet Only */\n@media only screen and (min-width: 768px) and (max-width: 991.98px) {\n  .ui.doubling.grid {\n    width: auto;\n  }\n  .ui.grid > .doubling.row,\n  .ui.doubling.grid > .row {\n    margin: 0 !important;\n    padding: 0 !important;\n  }\n  .ui.grid > .doubling.row > .column,\n  .ui.doubling.grid > .row > .column {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n    box-shadow: none !important;\n    margin: 0;\n  }\n  .ui.grid:not(.stretched) > .doubling.row:not(.stretched) > .column:not(.stretched),\n  .ui.doubling.grid:not(.stretched) > .row:not(.stretched) > .column:not(.stretched) {\n    display: inline-block !important;\n  }\n  .ui[class*=\"two column\"].doubling.grid > .row > .column,\n  .ui[class*=\"two column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"two column\"].doubling.row > .column {\n    width: 100% !important;\n  }\n  .ui[class*=\"three column\"].doubling.grid > .row > .column,\n  .ui[class*=\"three column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"three column\"].doubling.row > .column {\n    width: 50% !important;\n  }\n  .ui[class*=\"four column\"].doubling.grid > .row > .column,\n  .ui[class*=\"four column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"four column\"].doubling.row > .column {\n    width: 50% !important;\n  }\n  .ui[class*=\"five column\"].doubling.grid > .row > .column,\n  .ui[class*=\"five column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"five column\"].doubling.row > .column {\n    width: 33.33333333% !important;\n  }\n  .ui[class*=\"six column\"].doubling.grid > .row > .column,\n  .ui[class*=\"six column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"six column\"].doubling.row > .column {\n    width: 33.33333333% !important;\n  }\n  .ui[class*=\"seven column\"].doubling.grid > .row > .column,\n  .ui[class*=\"seven column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"seven column\"].doubling.row > .column {\n    width: 33.33333333% !important;\n  }\n  .ui[class*=\"eight column\"].doubling.grid > .row > .column,\n  .ui[class*=\"eight column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"eight column\"].doubling.row > .column {\n    width: 25% !important;\n  }\n  .ui[class*=\"nine column\"].doubling.grid > .row > .column,\n  .ui[class*=\"nine column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"nine column\"].doubling.row > .column {\n    width: 25% !important;\n  }\n  .ui[class*=\"ten column\"].doubling.grid > .row > .column,\n  .ui[class*=\"ten column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"ten column\"].doubling.row > .column {\n    width: 20% !important;\n  }\n  .ui[class*=\"eleven column\"].doubling.grid > .row > .column,\n  .ui[class*=\"eleven column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"eleven column\"].doubling.row > .column {\n    width: 20% !important;\n  }\n  .ui[class*=\"twelve column\"].doubling.grid > .row > .column,\n  .ui[class*=\"twelve column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"twelve column\"].doubling.row > .column {\n    width: 16.66666667% !important;\n  }\n  .ui[class*=\"thirteen column\"].doubling.grid > .row > .column,\n  .ui[class*=\"thirteen column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"thirteen column\"].doubling.row > .column {\n    width: 16.66666667% !important;\n  }\n  .ui[class*=\"fourteen column\"].doubling.grid > .row > .column,\n  .ui[class*=\"fourteen column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"fourteen column\"].doubling.row > .column {\n    width: 14.28571429% !important;\n  }\n  .ui[class*=\"fifteen column\"].doubling.grid > .row > .column,\n  .ui[class*=\"fifteen column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"fifteen column\"].doubling.row > .column {\n    width: 14.28571429% !important;\n  }\n  .ui[class*=\"sixteen column\"].doubling.grid > .row > .column,\n  .ui[class*=\"sixteen column\"].doubling.grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"sixteen column\"].doubling.row > .column {\n    width: 12.5% !important;\n  }\n}\n\n/* Mobile Only */\n@media only screen and (max-width: 767.98px) {\n  .ui.grid > .doubling.row,\n  .ui.doubling.grid > .row {\n    margin: 0 !important;\n    padding: 0 !important;\n  }\n  .ui.grid > .doubling.row > .column,\n  .ui.doubling.grid > .row > .column {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n    margin: 0 !important;\n    box-shadow: none !important;\n  }\n  .ui[class*=\"two column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"two column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"two column\"].doubling:not(.stackable).row > .column {\n    width: 100% !important;\n  }\n  .ui[class*=\"three column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"three column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"three column\"].doubling:not(.stackable).row > .column {\n    width: 50% !important;\n  }\n  .ui[class*=\"four column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"four column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"four column\"].doubling:not(.stackable).row > .column {\n    width: 50% !important;\n  }\n  .ui[class*=\"five column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"five column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"five column\"].doubling:not(.stackable).row > .column {\n    width: 50% !important;\n  }\n  .ui[class*=\"six column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"six column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"six column\"].doubling:not(.stackable).row > .column {\n    width: 50% !important;\n  }\n  .ui[class*=\"seven column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"seven column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"seven column\"].doubling:not(.stackable).row > .column {\n    width: 50% !important;\n  }\n  .ui[class*=\"eight column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"eight column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"eight column\"].doubling:not(.stackable).row > .column {\n    width: 50% !important;\n  }\n  .ui[class*=\"nine column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"nine column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"nine column\"].doubling:not(.stackable).row > .column {\n    width: 33.33333333% !important;\n  }\n  .ui[class*=\"ten column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"ten column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"ten column\"].doubling:not(.stackable).row > .column {\n    width: 33.33333333% !important;\n  }\n  .ui[class*=\"eleven column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"eleven column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"eleven column\"].doubling:not(.stackable).row > .column {\n    width: 33.33333333% !important;\n  }\n  .ui[class*=\"twelve column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"twelve column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"twelve column\"].doubling:not(.stackable).row > .column {\n    width: 33.33333333% !important;\n  }\n  .ui[class*=\"thirteen column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"thirteen column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"thirteen column\"].doubling:not(.stackable).row > .column {\n    width: 33.33333333% !important;\n  }\n  .ui[class*=\"fourteen column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"fourteen column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"fourteen column\"].doubling:not(.stackable).row > .column {\n    width: 25% !important;\n  }\n  .ui[class*=\"fifteen column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"fifteen column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"fifteen column\"].doubling:not(.stackable).row > .column {\n    width: 25% !important;\n  }\n  .ui[class*=\"sixteen column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"sixteen column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.ui.grid > [class*=\"sixteen column\"].doubling:not(.stackable).row > .column {\n    width: 25% !important;\n  }\n}\n\n/* -------------------\n          Stackable\n    -------------------- */\n@media only screen and (max-width: 767.98px) {\n  body > .ui.stackable.grid,\n  .ui:not(.segment):not(.grid) .ui.stackable.grid {\n    width: auto;\n    margin-left: 0;\n    margin-right: 0;\n  }\n  .ui.stackable.grid > .row > .wide.column,\n  .ui.stackable.grid > .wide.column,\n  .ui.stackable.grid > .column.grid > .column,\n  .ui.stackable.grid > .column.row > .column,\n  .ui.stackable.grid > .row > .column,\n  .ui.stackable.grid > .column:not(.row),\n  .ui.grid > .stackable.stackable.stackable.row > .column {\n    width: 100% !important;\n    margin: 0 !important;\n    box-shadow: none !important;\n    padding: 1rem 1rem;\n  }\n  .ui.stackable.grid:not(.vertically) > .row {\n    margin: 0;\n    padding: 0;\n  }\n  \n/* Coupling */\n  .ui.container > .ui.stackable.grid > .column,\n  .ui.container > .ui.stackable.grid > .row > .column {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  \n/* Don't pad inside segment or nested grid */\n  .ui.grid .ui.stackable.grid,\n  .ui.segment:not(.vertical) .ui.stackable.page.grid {\n    margin-left: -1rem;\n    margin-right: -1rem;\n  }\n  \n/* Divided Stackable */\n  .ui.stackable.divided.grid > .row:first-child > .column:first-child,\n  .ui.stackable.celled.grid > .row:first-child > .column:first-child,\n  .ui.stackable.divided.grid > .column:not(.row):first-child,\n  .ui.stackable.celled.grid > .column:not(.row):first-child {\n    border-top: none !important;\n  }\n  .ui.ui.inverted.stackable.celled.grid > .column:not(.row),\n  .ui.ui.inverted.stackable.divided.grid > .column:not(.row),\n  .ui.ui.inverted.stackable.celled.grid > .row > .column,\n  .ui.ui.inverted.stackable.divided.grid > .row > .column {\n    border-top: 1px solid rgba(255, 255, 255, 0.1);\n  }\n  .ui.stackable.celled.grid > .column:not(.row),\n  .ui.stackable.divided:not(.vertically).grid > .column:not(.row),\n  .ui.stackable.celled.grid > .row > .column,\n  .ui.stackable.divided:not(.vertically).grid > .row > .column {\n    border-top: 1px solid rgba(34, 36, 38, 0.15);\n    box-shadow: none !important;\n    padding-top: 2rem !important;\n    padding-bottom: 2rem !important;\n  }\n  .ui.stackable.celled.grid > .row {\n    box-shadow: none !important;\n  }\n  .ui.stackable.divided:not(.vertically).grid > .column:not(.row),\n  .ui.stackable.divided:not(.vertically).grid > .row > .column {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n}\n\n/* ----------------------\n     Only (Device)\n----------------------- */\n\n/* These include arbitrary class repetitions for forced specificity */\n\n/* Mobile Only Hide */\n@media only screen and (max-width: 767.98px) {\n  .ui.ui.ui[class*=\"tablet only\"].grid:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"tablet only\"].row:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"tablet only\"].column:not(.mobile),\n  .ui.ui.ui.grid > .row > [class*=\"tablet only\"].column:not(.mobile) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"computer only\"].grid:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"computer only\"].row:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"computer only\"].column:not(.mobile),\n  .ui.ui.ui.grid > .row > [class*=\"computer only\"].column:not(.mobile) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"large screen only\"].grid:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"large screen only\"].row:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"large screen only\"].column:not(.mobile),\n  .ui.ui.ui.grid > .row > [class*=\"large screen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"widescreen only\"].grid:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"widescreen only\"].row:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"widescreen only\"].column:not(.mobile),\n  .ui.ui.ui.grid > .row > [class*=\"widescreen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n}\n\n/* Tablet Only Hide */\n@media only screen and (min-width: 768px) and (max-width: 991.98px) {\n  .ui.ui.ui[class*=\"mobile only\"].grid:not(.tablet),\n  .ui.ui.ui.grid > [class*=\"mobile only\"].row:not(.tablet),\n  .ui.ui.ui.grid > [class*=\"mobile only\"].column:not(.tablet),\n  .ui.ui.ui.grid > .row > [class*=\"mobile only\"].column:not(.tablet) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"computer only\"].grid:not(.tablet),\n  .ui.ui.ui.grid > [class*=\"computer only\"].row:not(.tablet),\n  .ui.ui.ui.grid > [class*=\"computer only\"].column:not(.tablet),\n  .ui.ui.ui.grid > .row > [class*=\"computer only\"].column:not(.tablet) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"large screen only\"].grid:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"large screen only\"].row:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"large screen only\"].column:not(.mobile),\n  .ui.ui.ui.grid > .row > [class*=\"large screen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"widescreen only\"].grid:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"widescreen only\"].row:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"widescreen only\"].column:not(.mobile),\n  .ui.ui.ui.grid > .row > [class*=\"widescreen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n}\n\n/* Computer Only Hide */\n@media only screen and (min-width: 992px) and (max-width: 1199.98px) {\n  .ui.ui.ui[class*=\"mobile only\"].grid:not(.computer),\n  .ui.ui.ui.grid > [class*=\"mobile only\"].row:not(.computer),\n  .ui.ui.ui.grid > [class*=\"mobile only\"].column:not(.computer),\n  .ui.ui.ui.grid > .row > [class*=\"mobile only\"].column:not(.computer) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"tablet only\"].grid:not(.computer),\n  .ui.ui.ui.grid > [class*=\"tablet only\"].row:not(.computer),\n  .ui.ui.ui.grid > [class*=\"tablet only\"].column:not(.computer),\n  .ui.ui.ui.grid > .row > [class*=\"tablet only\"].column:not(.computer) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"large screen only\"].grid:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"large screen only\"].row:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"large screen only\"].column:not(.mobile),\n  .ui.ui.ui.grid > .row > [class*=\"large screen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"widescreen only\"].grid:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"widescreen only\"].row:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"widescreen only\"].column:not(.mobile),\n  .ui.ui.ui.grid > .row > [class*=\"widescreen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n}\n\n/* Large Screen Only Hide */\n@media only screen and (min-width: 1200px) and (max-width: 1919.98px) {\n  .ui.ui.ui[class*=\"mobile only\"].grid:not(.computer),\n  .ui.ui.ui.grid > [class*=\"mobile only\"].row:not(.computer),\n  .ui.ui.ui.grid > [class*=\"mobile only\"].column:not(.computer),\n  .ui.ui.ui.grid > .row > [class*=\"mobile only\"].column:not(.computer) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"tablet only\"].grid:not(.computer),\n  .ui.ui.ui.grid > [class*=\"tablet only\"].row:not(.computer),\n  .ui.ui.ui.grid > [class*=\"tablet only\"].column:not(.computer),\n  .ui.ui.ui.grid > .row > [class*=\"tablet only\"].column:not(.computer) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"widescreen only\"].grid:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"widescreen only\"].row:not(.mobile),\n  .ui.ui.ui.grid > [class*=\"widescreen only\"].column:not(.mobile),\n  .ui.ui.ui.grid > .row > [class*=\"widescreen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n}\n\n/* Widescreen Only Hide */\n@media only screen and (min-width: 1920px) {\n  .ui.ui.ui[class*=\"mobile only\"].grid:not(.computer),\n  .ui.ui.ui.grid > [class*=\"mobile only\"].row:not(.computer),\n  .ui.ui.ui.grid > [class*=\"mobile only\"].column:not(.computer),\n  .ui.ui.ui.grid > .row > [class*=\"mobile only\"].column:not(.computer) {\n    display: none !important;\n  }\n  .ui.ui.ui[class*=\"tablet only\"].grid:not(.computer),\n  .ui.ui.ui.grid > [class*=\"tablet only\"].row:not(.computer),\n  .ui.ui.ui.grid > [class*=\"tablet only\"].column:not(.computer),\n  .ui.ui.ui.grid > .row > [class*=\"tablet only\"].column:not(.computer) {\n    display: none !important;\n  }\n}\n\n/* -----------------\n          Compact\n    ----------------- */\n.ui.ui.ui.compact.grid {\n  margin: -0.5rem;\n}\n.ui.ui.ui.compact.grid > .column:not(.row),\n.ui.ui.ui.compact.grid > .row > .column {\n  padding-left: 0.5rem;\n  padding-right: 0.5rem;\n}\n.ui.ui.ui.compact.grid > * {\n  padding-left: 0.5rem;\n  padding-right: 0.5rem;\n}\n\n/* Row */\n.ui.ui.ui.compact.grid > .row {\n  padding: 0.5rem 0;\n}\n\n/* Columns */\n.ui.ui.ui.compact.grid > .column:not(.row) {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n\n/* Relaxed + Celled */\n.ui.compact.relaxed.celled.grid > .column:not(.row),\n.ui.compact.relaxed.celled.grid > .row > .column {\n  padding: 0.75em;\n}\n.ui.compact[class*=\"very relaxed\"].celled.grid > .column:not(.row),\n.ui.compact[class*=\"very relaxed\"].celled.grid > .row > .column {\n  padding: 1em;\n}\n\n/* -----------------\n        Very compact\n    ----------------- */\n.ui.ui.ui[class*=\"very compact\"].grid {\n  margin: -0.25rem;\n}\n.ui.ui.ui[class*=\"very compact\"].grid > .column:not(.row),\n.ui.ui.ui[class*=\"very compact\"].grid > .row > .column {\n  padding-left: 0.25rem;\n  padding-right: 0.25rem;\n}\n.ui.ui.ui[class*=\"very compact\"].grid > * {\n  padding-left: 0.25rem;\n  padding-right: 0.25rem;\n}\n\n/* Row */\n.ui.ui.ui[class*=\"very compact\"].grid > .row {\n  padding: 0.25rem 0;\n}\n\n/* Columns */\n.ui.ui.ui[class*=\"very compact\"].grid > .column:not(.row) {\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n}\n\n/* Relaxed + Celled */\n.ui[class*=\"very compact\"].relaxed.celled.grid > .column:not(.row),\n.ui[class*=\"very compact\"].relaxed.celled.grid > .row > .column {\n  padding: 0.375em;\n}\n.ui[class*=\"very compact\"][class*=\"very relaxed\"].celled.grid > .column:not(.row),\n.ui[class*=\"very compact\"][class*=\"very relaxed\"].celled.grid > .row > .column {\n  padding: 0.5em;\n}\n.ui.grid .left.attached.column {\n  padding-right: 0;\n}\n.ui.grid .right.attached.column {\n  padding-left: 0;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/header.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Header\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Header\n*******************************/\n\n\n/* Standard */\n.ui.header {\n  border: none;\n  margin: calc(2rem - 0.1428571428571429em) 0 1rem;\n  padding: 0 0;\n  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\";\n  font-weight: bold;\n  line-height: 1.28571429em;\n  text-transform: none;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.header:first-child {\n  margin-top: -0.14285714em;\n}\n.ui.header:last-child {\n  margin-bottom: 0;\n}\n\n/* --------------\n       Sub Header\n    --------------- */\n.ui.header .sub.header {\n  display: block;\n  font-weight: normal;\n  padding: 0;\n  margin: 0;\n  font-size: 1rem;\n  line-height: 1.2em;\n  color: rgba(0, 0, 0, 0.6);\n}\n\n/* --------------\n      Icon\n--------------- */\n.ui.header > .icons,\n.ui.header > i.icon {\n  display: table-cell;\n  opacity: 1;\n  font-size: 1.5em;\n  padding-top: 0;\n  vertical-align: middle;\n}\n\n/* With Text Node */\n.ui.header:not(.icon) > .icons:only-child,\n.ui.header:not(.icon) > i.icon:only-child {\n  display: inline-block;\n  padding: 0;\n  margin-right: 0.75rem;\n}\n\n/* -------------------\n        Image\n-------------------- */\n.ui.header > .image:not(.icon),\n.ui.header > img {\n  display: inline-block;\n  margin-top: 0.14285714em;\n  width: 2.5em;\n  height: auto;\n  vertical-align: middle;\n}\n.ui.header > .image:not(.icon):only-child,\n.ui.header > img:only-child {\n  margin-right: 0.75rem;\n}\n\n/* --------------\n     Content\n--------------- */\n.ui.header .content {\n  display: inline-block;\n  vertical-align: top;\n}\n\n/* After Image */\n.ui.header > img + .content,\n.ui.header > .image + .content {\n  padding-left: 0.75rem;\n  vertical-align: middle;\n}\n\n/* After Icon */\n.ui.header:not(.icon):not(.centered):not(.aligned) > .icons + .content,\n.ui.header:not(.icon):not(.centered):not(.aligned) > i.icon + .content {\n  padding-left: 0.75rem;\n  display: table-cell;\n  vertical-align: middle;\n}\n\n/* --------------\n Loose Coupling\n--------------- */\n.ui.header .ui.label {\n  font-size: \"\";\n  margin-left: 0.5rem;\n  vertical-align: middle;\n}\n\n/* Positioning */\n.ui.header + p {\n  margin-top: 0;\n}\n\n\n/*******************************\n            Types\n*******************************/\n\n\n/* --------------\n     Page\n--------------- */\nh1.ui.header {\n  font-size: 2rem;\n}\nh1.ui.header .sub.header {\n  font-size: 1.14285714rem;\n}\nh2.ui.header {\n  font-size: 1.71428571rem;\n}\nh2.ui.header .sub.header {\n  font-size: 1.14285714rem;\n}\nh3.ui.header {\n  font-size: 1.28571429rem;\n}\nh3.ui.header .sub.header {\n  font-size: 1rem;\n}\nh4.ui.header {\n  font-size: 1.07142857rem;\n}\nh4.ui.header .sub.header {\n  font-size: 1rem;\n}\nh5.ui.header {\n  font-size: 1rem;\n}\nh5.ui.header .sub.header {\n  font-size: 0.92857143rem;\n}\nh6.ui.header {\n  font-size: 0.85714286rem;\n}\nh6.ui.header .sub.header {\n  font-size: 0.92857143rem;\n}\n\n/* --------------\n Content Heading\n--------------- */\n.ui.mini.header {\n  font-size: 0.85714286em;\n}\n.ui.mini.header .sub.header {\n  font-size: 0.92857143rem;\n}\n.ui.mini.sub.header {\n  font-size: 0.78571429em;\n}\n.ui.tiny.header {\n  font-size: 1em;\n}\n.ui.tiny.header .sub.header {\n  font-size: 0.92857143rem;\n}\n.ui.tiny.sub.header {\n  font-size: 0.78571429em;\n}\n.ui.small.header {\n  font-size: 1.07142857em;\n}\n.ui.small.header .sub.header {\n  font-size: 1rem;\n}\n.ui.small.sub.header {\n  font-size: 0.78571429em;\n}\n.ui.large.header {\n  font-size: 1.71428571em;\n}\n.ui.large.header .sub.header {\n  font-size: 1.14285714rem;\n}\n.ui.large.sub.header {\n  font-size: 0.92857143em;\n}\n.ui.big.header {\n  font-size: 1.85714286em;\n}\n.ui.big.header .sub.header {\n  font-size: 1.14285714rem;\n}\n.ui.big.sub.header {\n  font-size: 1em;\n}\n.ui.huge.header {\n  font-size: 2em;\n  min-height: 1em;\n}\n.ui.huge.header .sub.header {\n  font-size: 1.14285714rem;\n}\n.ui.huge.sub.header {\n  font-size: 1em;\n}\n.ui.massive.header {\n  font-size: 2.28571429em;\n  min-height: 1em;\n}\n.ui.massive.header .sub.header {\n  font-size: 1.42857143rem;\n}\n.ui.massive.sub.header {\n  font-size: 1.14285714em;\n}\n\n/* --------------\n       Sub Heading\n    --------------- */\n.ui.sub.header {\n  padding: 0;\n  margin-bottom: 0.14285714rem;\n  font-weight: bold;\n  font-size: 0.85714286em;\n  text-transform: uppercase;\n  color: \"\";\n}\n\n/* -------------------\n            Icon\n    -------------------- */\n.ui.icon.header {\n  display: inline-block;\n  text-align: center;\n  margin: 2rem 0 1rem;\n}\n.ui.icon.header::after {\n  content: \"\";\n  display: block;\n  height: 0;\n  clear: both;\n  visibility: hidden;\n}\n.ui.icon.header:first-child {\n  margin-top: 0;\n}\n.ui.icon.header > .image.icon,\n.ui.icon.header > .icons,\n.ui.icon.header > i.icon {\n  float: none;\n  display: block;\n  width: auto;\n  height: auto;\n  line-height: 1;\n  padding: 0;\n  font-size: 3em;\n  margin: 0 auto 0.5rem;\n  opacity: 1;\n}\n.ui.icon.header .corner.icon {\n  font-size: calc(3em * 0.45);\n}\n.ui.icon.header .content {\n  display: block;\n  padding: 0;\n}\n.ui.icon.header > i.circular {\n  font-size: 2em;\n}\n.ui.icon.header > i.square {\n  font-size: 2em;\n}\n.ui.block.icon.header > .image.icon,\n.ui.block.icon.header > .icons,\n.ui.block.icon.header > i.icon {\n  margin-bottom: 0;\n}\n.ui.icon.header.aligned {\n  margin-left: auto;\n  margin-right: auto;\n  display: block;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n.ui.disabled.header {\n  opacity: 0.45;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* -------------------\n          Inverted\n    -------------------- */\n.ui.inverted.header {\n  color: #fff;\n}\n.ui.inverted.header .sub.header {\n  color: rgba(255, 255, 255, 0.8);\n}\n.ui.inverted.attached.header {\n  background: #1b1c1d;\n  box-shadow: none;\n  border-color: transparent;\n}\n.ui.inverted.block.header {\n  background: #545454 linear-gradient(transparent, rgba(0, 0, 0, 0.05));\n  box-shadow: none;\n  border-bottom: none;\n}\n\n/* -------------------\n       Colors\n-------------------- */\n.ui.primary.header {\n  color: #2185d0;\n}\na.ui.primary.header:hover {\n  color: #1678c2;\n}\n.ui.primary.dividing.header {\n  border-bottom: 2px solid #2185d0;\n}\n.ui.inverted.primary.header.header.header {\n  color: #54c8ff;\n}\na.ui.inverted.primary.header.header.header:hover {\n  color: #21b8ff;\n}\n.ui.inverted.primary.dividing.header {\n  border-bottom: 2px solid #54c8ff;\n}\n.ui.secondary.header {\n  color: #1b1c1d;\n}\na.ui.secondary.header:hover {\n  color: #27292a;\n}\n.ui.secondary.dividing.header {\n  border-bottom: 2px solid #1b1c1d;\n}\n.ui.inverted.secondary.header.header.header {\n  color: #545454;\n}\na.ui.inverted.secondary.header.header.header:hover {\n  color: #6e6e6e;\n}\n.ui.inverted.secondary.dividing.header {\n  border-bottom: 2px solid #545454;\n}\n.ui.red.header {\n  color: #db2828;\n}\na.ui.red.header:hover {\n  color: #d01919;\n}\n.ui.red.dividing.header {\n  border-bottom: 2px solid #db2828;\n}\n.ui.inverted.red.header.header.header {\n  color: #ff695e;\n}\na.ui.inverted.red.header.header.header:hover {\n  color: #ff392b;\n}\n.ui.inverted.red.dividing.header {\n  border-bottom: 2px solid #ff695e;\n}\n.ui.orange.header {\n  color: #f2711c;\n}\na.ui.orange.header:hover {\n  color: #f26202;\n}\n.ui.orange.dividing.header {\n  border-bottom: 2px solid #f2711c;\n}\n.ui.inverted.orange.header.header.header {\n  color: #ff851b;\n}\na.ui.inverted.orange.header.header.header:hover {\n  color: #e76b00;\n}\n.ui.inverted.orange.dividing.header {\n  border-bottom: 2px solid #ff851b;\n}\n.ui.yellow.header {\n  color: #fbbd08;\n}\na.ui.yellow.header:hover {\n  color: #eaae00;\n}\n.ui.yellow.dividing.header {\n  border-bottom: 2px solid #fbbd08;\n}\n.ui.inverted.yellow.header.header.header {\n  color: #ffe21f;\n}\na.ui.inverted.yellow.header.header.header:hover {\n  color: #ebcd00;\n}\n.ui.inverted.yellow.dividing.header {\n  border-bottom: 2px solid #ffe21f;\n}\n.ui.olive.header {\n  color: #b5cc18;\n}\na.ui.olive.header:hover {\n  color: #a7bd0d;\n}\n.ui.olive.dividing.header {\n  border-bottom: 2px solid #b5cc18;\n}\n.ui.inverted.olive.header.header.header {\n  color: #d9e778;\n}\na.ui.inverted.olive.header.header.header:hover {\n  color: #d2e745;\n}\n.ui.inverted.olive.dividing.header {\n  border-bottom: 2px solid #d9e778;\n}\n.ui.green.header {\n  color: #21ba45;\n}\na.ui.green.header:hover {\n  color: #16ab39;\n}\n.ui.green.dividing.header {\n  border-bottom: 2px solid #21ba45;\n}\n.ui.inverted.green.header.header.header {\n  color: #2ecc40;\n}\na.ui.inverted.green.header.header.header:hover {\n  color: #1ea92e;\n}\n.ui.inverted.green.dividing.header {\n  border-bottom: 2px solid #2ecc40;\n}\n.ui.teal.header {\n  color: #00b5ad;\n}\na.ui.teal.header:hover {\n  color: #009c95;\n}\n.ui.teal.dividing.header {\n  border-bottom: 2px solid #00b5ad;\n}\n.ui.inverted.teal.header.header.header {\n  color: #6dffff;\n}\na.ui.inverted.teal.header.header.header:hover {\n  color: #3affff;\n}\n.ui.inverted.teal.dividing.header {\n  border-bottom: 2px solid #6dffff;\n}\n.ui.blue.header {\n  color: #2185d0;\n}\na.ui.blue.header:hover {\n  color: #1678c2;\n}\n.ui.blue.dividing.header {\n  border-bottom: 2px solid #2185d0;\n}\n.ui.inverted.blue.header.header.header {\n  color: #54c8ff;\n}\na.ui.inverted.blue.header.header.header:hover {\n  color: #21b8ff;\n}\n.ui.inverted.blue.dividing.header {\n  border-bottom: 2px solid #54c8ff;\n}\n.ui.violet.header {\n  color: #6435c9;\n}\na.ui.violet.header:hover {\n  color: #5829bb;\n}\n.ui.violet.dividing.header {\n  border-bottom: 2px solid #6435c9;\n}\n.ui.inverted.violet.header.header.header {\n  color: #a291fb;\n}\na.ui.inverted.violet.header.header.header:hover {\n  color: #745aff;\n}\n.ui.inverted.violet.dividing.header {\n  border-bottom: 2px solid #a291fb;\n}\n.ui.purple.header {\n  color: #a333c8;\n}\na.ui.purple.header:hover {\n  color: #9627ba;\n}\n.ui.purple.dividing.header {\n  border-bottom: 2px solid #a333c8;\n}\n.ui.inverted.purple.header.header.header {\n  color: #dc73ff;\n}\na.ui.inverted.purple.header.header.header:hover {\n  color: #cf40ff;\n}\n.ui.inverted.purple.dividing.header {\n  border-bottom: 2px solid #dc73ff;\n}\n.ui.pink.header {\n  color: #e03997;\n}\na.ui.pink.header:hover {\n  color: #e61a8d;\n}\n.ui.pink.dividing.header {\n  border-bottom: 2px solid #e03997;\n}\n.ui.inverted.pink.header.header.header {\n  color: #ff8edf;\n}\na.ui.inverted.pink.header.header.header:hover {\n  color: #ff5bd1;\n}\n.ui.inverted.pink.dividing.header {\n  border-bottom: 2px solid #ff8edf;\n}\n.ui.brown.header {\n  color: #a5673f;\n}\na.ui.brown.header:hover {\n  color: #975b33;\n}\n.ui.brown.dividing.header {\n  border-bottom: 2px solid #a5673f;\n}\n.ui.inverted.brown.header.header.header {\n  color: #d67c1c;\n}\na.ui.inverted.brown.header.header.header:hover {\n  color: #b0620f;\n}\n.ui.inverted.brown.dividing.header {\n  border-bottom: 2px solid #d67c1c;\n}\n.ui.grey.header {\n  color: #767676;\n}\na.ui.grey.header:hover {\n  color: #838383;\n}\n.ui.grey.dividing.header {\n  border-bottom: 2px solid #767676;\n}\n.ui.inverted.grey.header.header.header {\n  color: #dcddde;\n}\na.ui.inverted.grey.header.header.header:hover {\n  color: #c2c4c5;\n}\n.ui.inverted.grey.dividing.header {\n  border-bottom: 2px solid #dcddde;\n}\n.ui.black.header {\n  color: #1b1c1d;\n}\na.ui.black.header:hover {\n  color: #27292a;\n}\n.ui.black.dividing.header {\n  border-bottom: 2px solid #1b1c1d;\n}\n.ui.inverted.black.header.header.header {\n  color: #545454;\n}\na.ui.inverted.black.header.header.header:hover {\n  color: #000000;\n}\n.ui.inverted.black.dividing.header {\n  border-bottom: 2px solid #545454;\n}\n\n/* -------------------\n           Aligned\n    -------------------- */\n.ui.left.aligned.header {\n  text-align: left;\n}\n.ui.right.aligned.header {\n  text-align: right;\n}\n.ui.centered.header,\n.ui.center.aligned.header {\n  text-align: center;\n}\n.ui.justified.header {\n  text-align: justify;\n}\n.ui.justified.header::after {\n  display: inline-block;\n  content: \"\";\n  width: 100%;\n}\n\n/* -------------------\n           Floated\n    -------------------- */\n.ui.floated.header,\n.ui[class*=\"left floated\"].header {\n  float: left;\n  margin-top: 0;\n  margin-right: 0.5em;\n}\n.ui[class*=\"right floated\"].header {\n  float: right;\n  margin-top: 0;\n  margin-left: 0.5em;\n}\n\n/* -------------------\n           Fitted\n    -------------------- */\n.ui.fitted.header {\n  padding: 0;\n}\n\n/* -------------------\n          Dividing\n    -------------------- */\n.ui.dividing.header {\n  padding-bottom: 0.21428571rem;\n  border-bottom: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.dividing.header .sub.header {\n  padding-bottom: 0.21428571rem;\n}\n.ui.dividing.header i.icon {\n  margin-bottom: 0;\n}\n.ui.inverted.dividing.header {\n  border-bottom-color: rgba(255, 255, 255, 0.1);\n}\n\n/* -------------------\n            Block\n    -------------------- */\n.ui.block.header {\n  background: #f3f4f5;\n  padding: 0.78571429rem 1rem;\n  box-shadow: none;\n  border: 1px solid #d4d4d5;\n  border-radius: 0.28571429rem;\n}\n.ui.block.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {\n  font-size: 1rem;\n}\n.ui.mini.block.header {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.block.header {\n  font-size: 0.85714286rem;\n}\n.ui.small.block.header {\n  font-size: 0.92857143rem;\n}\n.ui.large.block.header {\n  font-size: 1.14285714rem;\n}\n.ui.big.block.header {\n  font-size: 1.28571429rem;\n}\n.ui.huge.block.header {\n  font-size: 1.42857143rem;\n}\n.ui.massive.block.header {\n  font-size: 1.71428571rem;\n}\n\n/* -------------------\n           Attached\n    -------------------- */\n.ui.attached.header {\n  background: #fff;\n  padding: 0.78571429rem 1rem;\n  margin: 0 -1px;\n  box-shadow: none;\n  border: 1px solid #d4d4d5;\n  border-radius: 0;\n}\n.ui.attached.block.header {\n  background: #f3f4f5;\n}\n.ui.attached:not(.top).header {\n  border-top: none;\n}\n.ui.top.attached.header {\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.bottom.attached.header {\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui.seamless.attached:not(.bottom).header {\n  border-bottom: none;\n}\n\n/* Attached Sizes */\n.ui.attached.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {\n  font-size: 1em;\n}\n.ui.mini.attached.header {\n  font-size: 0.78571429em;\n}\n.ui.tiny.attached.header {\n  font-size: 0.85714286em;\n}\n.ui.small.attached.header {\n  font-size: 0.92857143em;\n}\n.ui.large.attached.header {\n  font-size: 1.14285714em;\n}\n.ui.big.attached.header {\n  font-size: 1.28571429em;\n}\n.ui.huge.attached.header {\n  font-size: 1.42857143em;\n}\n.ui.massive.attached.header {\n  font-size: 1.71428571em;\n}\n\n/* -------------------\n        Sizing\n-------------------- */\n.ui.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {\n  font-size: 1.28571429em;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/icon.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Icon\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Icon\n*******************************/\n\n@font-face {\n  font-family: \"icons\";\n  src: url(\"./../themes/default/assets/fonts/icons.woff2\") format(\"woff2\") , url(\"./../themes/default/assets/fonts/icons.woff\") format(\"woff\");\n  font-style: normal;\n  font-weight: normal;\n  font-display: block;\n  font-variant: normal;\n  text-decoration: inherit;\n  text-transform: none;\n}\n@font-face {\n  font-family: \"outline-icons\";\n  src: url(\"./../themes/default/assets/fonts/outline-icons.woff2\") format(\"woff2\") , url(\"./../themes/default/assets/fonts/outline-icons.woff\") format(\"woff\");\n  font-style: normal;\n  font-weight: normal;\n  font-display: block;\n  font-variant: normal;\n  text-decoration: inherit;\n  text-transform: none;\n}\n@font-face {\n  font-family: \"brand-icons\";\n  src: url(\"./../themes/default/assets/fonts/brand-icons.woff2\") format(\"woff2\") , url(\"./../themes/default/assets/fonts/brand-icons.woff\") format(\"woff\");\n  font-style: normal;\n  font-weight: normal;\n  font-display: block;\n  font-variant: normal;\n  text-decoration: inherit;\n  text-transform: none;\n}\ni.icon {\n  display: inline-block;\n  opacity: 1;\n  margin: 0 0.25rem 0 0;\n  width: 1.18em;\n  height: 1em;\n  font-family: \"icons\";\n  font-style: normal;\n  font-weight: normal;\n  text-decoration: inherit;\n  text-align: center;\n  speak: none;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\ni.icon::before {\n  background: none;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/* --------------\n        Loading\n    --------------- */\ni.loading.icon {\n  height: 1em;\n  line-height: 1;\n}\ni.loading.icon,\ni.loading.icons {\n  animation: loader 2s linear infinite;\n}\n\n\n/*******************************\n             States\n*******************************/\n\ni.icon:hover,\ni.icons:hover,\ni.icon:active,\ni.icons:active,\ni.emphasized.icon:not(.disabled),\ni.emphasized.icons:not(.disabled) {\n  opacity: 1;\n}\ni.disabled.icon,\ni.disabled.icons {\n  opacity: 0.45;\n  cursor: default;\n  pointer-events: none;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* -------------------\n            Fitted\n    -------------------- */\ni.fitted.icons,\ni.fitted.icon {\n  width: auto;\n  margin: 0 !important;\n}\n\n/* -------------------\n             Link\n    -------------------- */\ni.link.icon:not(.disabled),\ni.link.icons:not(.disabled) {\n  cursor: pointer;\n  opacity: 0.8;\n  transition: opacity 0.1s ease;\n}\ni.link.icon:hover,\ni.link.icons:hover {\n  opacity: 1;\n}\n\n/* -------------------\n          Circular\n    -------------------- */\ni.circular.icon {\n  border-radius: 500em !important;\n  line-height: 1 !important;\n  padding: 0.5em 0 !important;\n  box-shadow: 0 0 0 0.1em rgba(0, 0, 0, 0.1) inset;\n  width: 2em !important;\n  height: 2em !important;\n}\ni.circular.icon.colored {\n  box-shadow: 0 0 0 0.1em currentColor inset;\n}\ni.circular.inverted.icon {\n  border: none;\n  box-shadow: none;\n}\n\n/* -------------------\n          Flipped\n    -------------------- */\ni.flipped.icon,\ni.horizontally.flipped.icon {\n  transform: scale(-1, 1);\n}\ni.vertically.flipped.icon {\n  transform: scale(1, -1);\n}\n.icons i.flipped.icon:not(.corner):not(:first-child),\n.icons i.horizontally.flipped.icon:not(.corner):not(:first-child) {\n  transform: translateX(-50%) translateY(-50%) scale(-1, 1);\n}\n.icons i.vertically.flipped.icon:not(.corner):not(:first-child) {\n  transform: translateX(-50%) translateY(-50%) scale(1, -1);\n}\n\n/* -------------------\n          Rotated\n    -------------------- */\ni.rotated.icon,\ni.right.rotated.icon,\ni.clockwise.rotated.icon {\n  transform: rotate(90deg);\n}\ni.left.rotated.icon,\ni.counterclockwise.rotated.icon {\n  transform: rotate(-90deg);\n}\ni.halfway.rotated.icon {\n  transform: rotate(180deg);\n}\n.icons i.rotated.rotated.icon:not(.corner):not(:first-child),\n.icons i.right.rotated.icon:not(.corner):not(:first-child),\n.icons i.clockwise.rotated.icon:not(.corner):not(:first-child) {\n  transform: translateX(-50%) translateY(-50%) rotate(90deg);\n}\n.icons i.left.rotated.icon:not(.corner):not(:first-child),\n.icons i.counterclockwise.rotated.icon:not(.corner):not(:first-child) {\n  transform: translateX(-50%) translateY(-50%) rotate(-90deg);\n}\n.icons i.halfway.rotated.icon:not(.corner):not(:first-child) {\n  transform: translateX(-50%) translateY(-50%) rotate(180deg);\n}\n\n/* --------------------------\n          Flipped & Rotated\n    --------------------------- */\ni.rotated.flipped.icon,\ni.right.rotated.flipped.icon,\ni.clockwise.rotated.flipped.icon {\n  transform: scale(-1, 1) rotate(90deg);\n}\ni.left.rotated.flipped.icon,\ni.counterclockwise.rotated.flipped.icon {\n  transform: scale(-1, 1) rotate(-90deg);\n}\ni.halfway.rotated.flipped.icon {\n  transform: scale(-1, 1) rotate(180deg);\n}\ni.rotated.vertically.flipped.icon,\ni.right.rotated.vertically.flipped.icon,\ni.clockwise.rotated.vertically.flipped.icon {\n  transform: scale(1, -1) rotate(90deg);\n}\ni.left.rotated.vertically.flipped.icon,\ni.counterclockwise.rotated.vertically.flipped.icon {\n  transform: scale(1, -1) rotate(-90deg);\n}\ni.halfway.rotated.vertically.flipped.icon {\n  transform: scale(1, -1) rotate(180deg);\n}\n.icons i.rotated.flipped.icon:not(.corner):not(:first-child),\n.icons i.right.rotated.flipped.icon:not(.corner):not(:first-child),\n.icons i.clockwise.rotated.flipped.icon:not(.corner):not(:first-child) {\n  transform: translateX(-50%) translateY(-50%) scale(-1, 1) rotate(90deg);\n}\n.icons i.left.rotated.flipped.icon:not(.corner):not(:first-child),\n.icons i.counterclockwise.rotated.flipped.icon:not(.corner):not(:first-child) {\n  transform: translateX(-50%) translateY(-50%) scale(-1, 1) rotate(-90deg);\n}\n.icons i.halfway.rotated.flipped.icon:not(.corner):not(:first-child) {\n  transform: translateX(-50%) translateY(-50%) scale(-1, 1) rotate(180deg);\n}\n.icons i.rotated.vertically.flipped.icon:not(.corner):not(:first-child),\n.icons i.right.rotated.vertically.flipped.icon:not(.corner):not(:first-child),\n.icons i.clockwise.rotated.vertically.flipped.icon:not(.corner):not(:first-child) {\n  transform: translateX(-50%) translateY(-50%) scale(1, -1) rotate(90deg);\n}\n.icons i.left.rotated.vertically.flipped.icon:not(.corner):not(:first-child),\n.icons i.counterclockwise.rotated.vertically.flipped.icon:not(.corner):not(:first-child) {\n  transform: translateX(-50%) translateY(-50%) scale(1, -1) rotate(-90deg);\n}\n.icons i.halfway.rotated.vertically.flipped.icon:not(.corner):not(:first-child) {\n  transform: translateX(-50%) translateY(-50%) scale(1, -1) rotate(180deg);\n}\n\n/* -------------------\n          Bordered\n    -------------------- */\ni.bordered.icon {\n  line-height: 1;\n  vertical-align: baseline;\n  width: 2em;\n  height: 2em;\n  padding: 0.5em 0 !important;\n  box-shadow: 0 0 0 0.1em rgba(0, 0, 0, 0.1) inset;\n}\ni.bordered.icon.colored {\n  box-shadow: 0 0 0 0.1em currentColor inset;\n}\ni.bordered.inverted.icon {\n  border: none;\n  box-shadow: none;\n}\n\n/* -------------------\n          Inverted\n    -------------------- */\n\n/* Inverted Shapes */\ni.inverted.bordered.icon,\ni.inverted.circular.icon {\n  background-color: #1b1c1d;\n  color: #fff;\n}\ni.inverted.icon {\n  color: #fff;\n}\n\n/* -------------------\n       Colors\n-------------------- */\ni.primary.icon.icon.icon.icon.icon.icon {\n  color: #2185d0;\n}\ni.inverted.primary.icon.icon.icon.icon.icon.icon {\n  color: #54c8ff;\n}\ni.inverted.bordered.primary.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.primary.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.primary.icons,\ni.inverted.circular.primary.icons {\n  background-color: #2185d0;\n  color: #fff;\n}\ni.secondary.icon.icon.icon.icon.icon.icon {\n  color: #1b1c1d;\n}\ni.inverted.secondary.icon.icon.icon.icon.icon.icon {\n  color: #545454;\n}\ni.inverted.bordered.secondary.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.secondary.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.secondary.icons,\ni.inverted.circular.secondary.icons {\n  background-color: #1b1c1d;\n  color: #fff;\n}\ni.red.icon.icon.icon.icon.icon.icon {\n  color: #db2828;\n}\ni.inverted.red.icon.icon.icon.icon.icon.icon {\n  color: #ff695e;\n}\ni.inverted.bordered.red.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.red.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.red.icons,\ni.inverted.circular.red.icons {\n  background-color: #db2828;\n  color: #fff;\n}\ni.orange.icon.icon.icon.icon.icon.icon {\n  color: #f2711c;\n}\ni.inverted.orange.icon.icon.icon.icon.icon.icon {\n  color: #ff851b;\n}\ni.inverted.bordered.orange.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.orange.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.orange.icons,\ni.inverted.circular.orange.icons {\n  background-color: #f2711c;\n  color: #fff;\n}\ni.yellow.icon.icon.icon.icon.icon.icon {\n  color: #fbbd08;\n}\ni.inverted.yellow.icon.icon.icon.icon.icon.icon {\n  color: #ffe21f;\n}\ni.inverted.bordered.yellow.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.yellow.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.yellow.icons,\ni.inverted.circular.yellow.icons {\n  background-color: #fbbd08;\n  color: #fff;\n}\ni.olive.icon.icon.icon.icon.icon.icon {\n  color: #b5cc18;\n}\ni.inverted.olive.icon.icon.icon.icon.icon.icon {\n  color: #d9e778;\n}\ni.inverted.bordered.olive.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.olive.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.olive.icons,\ni.inverted.circular.olive.icons {\n  background-color: #b5cc18;\n  color: #fff;\n}\ni.green.icon.icon.icon.icon.icon.icon {\n  color: #21ba45;\n}\ni.inverted.green.icon.icon.icon.icon.icon.icon {\n  color: #2ecc40;\n}\ni.inverted.bordered.green.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.green.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.green.icons,\ni.inverted.circular.green.icons {\n  background-color: #21ba45;\n  color: #fff;\n}\ni.teal.icon.icon.icon.icon.icon.icon {\n  color: #00b5ad;\n}\ni.inverted.teal.icon.icon.icon.icon.icon.icon {\n  color: #6dffff;\n}\ni.inverted.bordered.teal.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.teal.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.teal.icons,\ni.inverted.circular.teal.icons {\n  background-color: #00b5ad;\n  color: #fff;\n}\ni.blue.icon.icon.icon.icon.icon.icon {\n  color: #2185d0;\n}\ni.inverted.blue.icon.icon.icon.icon.icon.icon {\n  color: #54c8ff;\n}\ni.inverted.bordered.blue.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.blue.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.blue.icons,\ni.inverted.circular.blue.icons {\n  background-color: #2185d0;\n  color: #fff;\n}\ni.violet.icon.icon.icon.icon.icon.icon {\n  color: #6435c9;\n}\ni.inverted.violet.icon.icon.icon.icon.icon.icon {\n  color: #a291fb;\n}\ni.inverted.bordered.violet.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.violet.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.violet.icons,\ni.inverted.circular.violet.icons {\n  background-color: #6435c9;\n  color: #fff;\n}\ni.purple.icon.icon.icon.icon.icon.icon {\n  color: #a333c8;\n}\ni.inverted.purple.icon.icon.icon.icon.icon.icon {\n  color: #dc73ff;\n}\ni.inverted.bordered.purple.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.purple.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.purple.icons,\ni.inverted.circular.purple.icons {\n  background-color: #a333c8;\n  color: #fff;\n}\ni.pink.icon.icon.icon.icon.icon.icon {\n  color: #e03997;\n}\ni.inverted.pink.icon.icon.icon.icon.icon.icon {\n  color: #ff8edf;\n}\ni.inverted.bordered.pink.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.pink.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.pink.icons,\ni.inverted.circular.pink.icons {\n  background-color: #e03997;\n  color: #fff;\n}\ni.brown.icon.icon.icon.icon.icon.icon {\n  color: #a5673f;\n}\ni.inverted.brown.icon.icon.icon.icon.icon.icon {\n  color: #d67c1c;\n}\ni.inverted.bordered.brown.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.brown.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.brown.icons,\ni.inverted.circular.brown.icons {\n  background-color: #a5673f;\n  color: #fff;\n}\ni.grey.icon.icon.icon.icon.icon.icon {\n  color: #767676;\n}\ni.inverted.grey.icon.icon.icon.icon.icon.icon {\n  color: #dcddde;\n}\ni.inverted.bordered.grey.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.grey.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.grey.icons,\ni.inverted.circular.grey.icons {\n  background-color: #767676;\n  color: #fff;\n}\ni.black.icon.icon.icon.icon.icon.icon {\n  color: #1b1c1d;\n}\ni.inverted.black.icon.icon.icon.icon.icon.icon {\n  color: #545454;\n}\ni.inverted.bordered.black.icon.icon.icon.icon.icon.icon,\ni.inverted.circular.black.icon.icon.icon.icon.icon.icon,\ni.inverted.bordered.black.icons,\ni.inverted.circular.black.icons {\n  background-color: #1b1c1d;\n  color: #fff;\n}\n\n/* -------------------\n        Sizes\n-------------------- */\ni.icon,\ni.icons {\n  font-size: 1em;\n  line-height: 1;\n  font-style: normal;\n}\ni.mini.mini.mini.icon,\ni.mini.mini.mini.icons {\n  font-size: 0.4em;\n  vertical-align: middle;\n}\ni.tiny.tiny.tiny.icon,\ni.tiny.tiny.tiny.icons {\n  font-size: 0.5em;\n  vertical-align: middle;\n}\ni.small.small.small.icon,\ni.small.small.small.icons {\n  font-size: 0.75em;\n  vertical-align: middle;\n}\ni.large.large.large.icon,\ni.large.large.large.icons {\n  font-size: 1.5em;\n  vertical-align: middle;\n}\ni.big.big.big.icon,\ni.big.big.big.icons {\n  font-size: 2em;\n  vertical-align: middle;\n}\ni.huge.huge.huge.icon,\ni.huge.huge.huge.icons {\n  font-size: 4em;\n  vertical-align: middle;\n}\ni.massive.massive.massive.icon,\ni.massive.massive.massive.icons {\n  font-size: 8em;\n  vertical-align: middle;\n}\n\n\n/*******************************\n                Groups\n    *******************************/\n\ni.icons {\n  display: inline-block;\n  position: relative;\n  line-height: 1;\n  min-width: 1.18em;\n  min-height: 1em;\n  margin: 0 0.25rem 0 0;\n  text-align: center;\n}\ni.icons .icon {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin: 0;\n}\ni.icons .icon:not(.corner):not(.rotated):not(.flipped) {\n  transform: translateX(-50%) translateY(-50%);\n}\ni.icons .icon:first-child {\n  position: static;\n  width: auto;\n  height: auto;\n  vertical-align: top;\n}\ni.icons:not(.bordered):not(.circular) .icon:first-child:not(.rotated):not(.flipped) {\n  transform: none;\n}\n\n/* Corner Icon */\ni.icons .corner.icon {\n  top: auto;\n  left: auto;\n  right: 0;\n  bottom: 0;\n  font-size: 0.45em;\n  text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff;\n}\ni.icons .corner.icon:not(.rotated):not(.flipped) {\n  transform: none;\n}\ni.icons .icon.corner[class*=\"top right\"] {\n  top: 0;\n  left: auto;\n  right: 0;\n  bottom: auto;\n}\ni.icons .icon.corner[class*=\"top left\"] {\n  top: 0;\n  left: 0;\n  right: auto;\n  bottom: auto;\n}\ni.icons .icon.corner[class*=\"bottom left\"] {\n  top: auto;\n  left: 0;\n  right: auto;\n  bottom: 0;\n}\ni.icons .icon.corner[class*=\"bottom right\"] {\n  top: auto;\n  left: auto;\n  right: 0;\n  bottom: 0;\n}\ni.icons .inverted.corner.icon {\n  text-shadow: -1px -1px 0 #1b1c1d, 1px -1px 0 #1b1c1d, -1px 1px 0 #1b1c1d, 1px 1px 0 #1b1c1d;\n}\n\n\n/*************************************************\n       Bordered/circular with corner or group icons\n    *************************************************/\n\ni.bordered.icons,\ni.circular.icons {\n  width: 2em;\n  height: 2em;\n  box-shadow: 0 0 0 0.1em rgba(0, 0, 0, 0.1) inset;\n  vertical-align: middle;\n}\ni.bordered.icons.colored,\ni.circular.icons.colored {\n  box-shadow: 0 0 0 0.1em currentColor inset;\n}\ni.circular.icons {\n  border-radius: 500em;\n}\ni.bordered.icons i.icon:first-child,\ni.circular.icons i.icon:first-child {\n  position: absolute;\n  transform: translateX(-50%) translateY(-50%);\n}\n\n/* Inverted Icon */\ni.bordered.inverted.icons,\ni.circular.inverted.icons {\n  border: none;\n  box-shadow: none;\n  background-color: #1b1c1d;\n  color: #fff;\n}\n\n/* Corner Icon */\ni.bordered.icons .icon.corner,\ni.circular.icons .icon.corner,\ni.bordered.icons .icon.corner[class*=\"bottom right\"],\ni.circular.icons .icon.corner[class*=\"bottom right\"] {\n  top: auto;\n  left: auto;\n  right: 1.15em;\n  bottom: 1.15em;\n}\ni.bordered.icons .icon.corner[class*=\"top right\"],\ni.circular.icons .icon.corner[class*=\"top right\"] {\n  top: 1.15em;\n  left: auto;\n  right: 1.15em;\n  bottom: auto;\n}\ni.bordered.icons .icon.corner[class*=\"top left\"],\ni.circular.icons .icon.corner[class*=\"top left\"] {\n  top: 1.15em;\n  left: 1.15em;\n  right: auto;\n  bottom: auto;\n}\ni.bordered.icons .icon.corner[class*=\"bottom left\"],\ni.circular.icons .icon.corner[class*=\"bottom left\"] {\n  top: auto;\n  left: 1.15em;\n  right: auto;\n  bottom: 1.15em;\n}\n\n/* Deprecated *In/Out Naming Conflict) */\ni.icon.linkedin.in::before {\n  content: \"\\f0e1\";\n}\ni.icon.zoom.in::before {\n  content: \"\\f00e\";\n}\ni.icon.zoom.out::before {\n  content: \"\\f010\";\n}\ni.icon.sign.in::before {\n  content: \"\\f2f6\";\n}\ni.icon.in.cart::before {\n  content: \"\\f218\";\n}\ni.icon.log.out::before {\n  content: \"\\f2f5\";\n}\ni.icon.sign.out::before {\n  content: \"\\f2f5\";\n}\ni.icon.sign.in.alternate::before {\n  content: \"\\f2f6\";\n}\ni.icon.sign.out.alternate::before {\n  content: \"\\f2f5\";\n}\n\n\n/*******************************\n            Solid Icons\n    *******************************/\n\n\n/* Icons */\ni.icon.ad::before {\n  content: \"\\f641\";\n}\ni.icon.address.book::before {\n  content: \"\\f2b9\";\n}\ni.icon.address.card::before {\n  content: \"\\f2bb\";\n}\ni.icon.adjust::before {\n  content: \"\\f042\";\n}\ni.icon.air.freshener::before {\n  content: \"\\f5d0\";\n}\ni.icon.align.center::before {\n  content: \"\\f037\";\n}\ni.icon.align.justify::before {\n  content: \"\\f039\";\n}\ni.icon.align.left::before {\n  content: \"\\f036\";\n}\ni.icon.align.right::before {\n  content: \"\\f038\";\n}\ni.icon.allergies::before {\n  content: \"\\f461\";\n}\ni.icon.ambulance::before {\n  content: \"\\f0f9\";\n}\ni.icon.american.sign.language.interpreting::before {\n  content: \"\\f2a3\";\n}\ni.icon.anchor::before {\n  content: \"\\f13d\";\n}\ni.icon.angle.double.down::before {\n  content: \"\\f103\";\n}\ni.icon.angle.double.left::before {\n  content: \"\\f100\";\n}\ni.icon.angle.double.right::before {\n  content: \"\\f101\";\n}\ni.icon.angle.double.up::before {\n  content: \"\\f102\";\n}\ni.icon.angle.left::before {\n  content: \"\\f104\";\n}\ni.icon.angle.right::before {\n  content: \"\\f105\";\n}\ni.icon.angle.up::before {\n  content: \"\\f106\";\n}\ni.icon.angle.down::before {\n  content: \"\\f107\";\n}\ni.icon.angry::before {\n  content: \"\\f556\";\n}\ni.icon.ankh::before {\n  content: \"\\f644\";\n}\ni.icon.archive::before {\n  content: \"\\f187\";\n}\ni.icon.archway::before {\n  content: \"\\f557\";\n}\ni.icon.arrow.alternate.circle.down::before {\n  content: \"\\f358\";\n}\ni.icon.arrow.alternate.circle.left::before {\n  content: \"\\f359\";\n}\ni.icon.arrow.alternate.circle.right::before {\n  content: \"\\f35a\";\n}\ni.icon.arrow.alternate.circle.up::before {\n  content: \"\\f35b\";\n}\ni.icon.arrow.circle.down::before {\n  content: \"\\f0ab\";\n}\ni.icon.arrow.circle.left::before {\n  content: \"\\f0a8\";\n}\ni.icon.arrow.circle.right::before {\n  content: \"\\f0a9\";\n}\ni.icon.arrow.circle.up::before {\n  content: \"\\f0aa\";\n}\ni.icon.arrow.down::before {\n  content: \"\\f063\";\n}\ni.icon.arrow.left::before {\n  content: \"\\f060\";\n}\ni.icon.arrow.right::before {\n  content: \"\\f061\";\n}\ni.icon.arrow.up::before {\n  content: \"\\f062\";\n}\ni.icon.arrows.alternate::before {\n  content: \"\\f0b2\";\n}\ni.icon.arrows.alternate.horizontal::before {\n  content: \"\\f337\";\n}\ni.icon.arrows.alternate.vertical::before {\n  content: \"\\f338\";\n}\ni.icon.assistive.listening.systems::before {\n  content: \"\\f2a2\";\n}\ni.icon.asterisk::before {\n  content: \"\\f069\";\n}\ni.icon.at::before {\n  content: \"\\f1fa\";\n}\ni.icon.atlas::before {\n  content: \"\\f558\";\n}\ni.icon.atom::before {\n  content: \"\\f5d2\";\n}\ni.icon.audio.description::before {\n  content: \"\\f29e\";\n}\ni.icon.award::before {\n  content: \"\\f559\";\n}\ni.icon.baby::before {\n  content: \"\\f77c\";\n}\ni.icon.baby.carriage::before {\n  content: \"\\f77d\";\n}\ni.icon.backspace::before {\n  content: \"\\f55a\";\n}\ni.icon.backward::before {\n  content: \"\\f04a\";\n}\ni.icon.bacon::before {\n  content: \"\\f7e5\";\n}\ni.icon.bacteria::before {\n  content: \"\\e059\";\n}\ni.icon.bacterium::before {\n  content: \"\\e05a\";\n}\ni.icon.bahai::before {\n  content: \"\\f666\";\n}\ni.icon.balance.scale::before {\n  content: \"\\f24e\";\n}\ni.icon.balance.scale.left::before {\n  content: \"\\f515\";\n}\ni.icon.balance.scale.right::before {\n  content: \"\\f516\";\n}\ni.icon.ban::before {\n  content: \"\\f05e\";\n}\ni.icon.band.aid::before {\n  content: \"\\f462\";\n}\ni.icon.barcode::before {\n  content: \"\\f02a\";\n}\ni.icon.bars::before {\n  content: \"\\f0c9\";\n}\ni.icon.baseball.ball::before {\n  content: \"\\f433\";\n}\ni.icon.basketball.ball::before {\n  content: \"\\f434\";\n}\ni.icon.bath::before {\n  content: \"\\f2cd\";\n}\ni.icon.battery.empty::before {\n  content: \"\\f244\";\n}\ni.icon.battery.full::before {\n  content: \"\\f240\";\n}\ni.icon.battery.half::before {\n  content: \"\\f242\";\n}\ni.icon.battery.quarter::before {\n  content: \"\\f243\";\n}\ni.icon.battery.three.quarters::before {\n  content: \"\\f241\";\n}\ni.icon.bed::before {\n  content: \"\\f236\";\n}\ni.icon.beer::before {\n  content: \"\\f0fc\";\n}\ni.icon.bell::before {\n  content: \"\\f0f3\";\n}\ni.icon.bell.slash::before {\n  content: \"\\f1f6\";\n}\ni.icon.bezier.curve::before {\n  content: \"\\f55b\";\n}\ni.icon.bible::before {\n  content: \"\\f647\";\n}\ni.icon.bicycle::before {\n  content: \"\\f206\";\n}\ni.icon.biking::before {\n  content: \"\\f84a\";\n}\ni.icon.binoculars::before {\n  content: \"\\f1e5\";\n}\ni.icon.biohazard::before {\n  content: \"\\f780\";\n}\ni.icon.birthday.cake::before {\n  content: \"\\f1fd\";\n}\ni.icon.blender::before {\n  content: \"\\f517\";\n}\ni.icon.blender.phone::before {\n  content: \"\\f6b6\";\n}\ni.icon.blind::before {\n  content: \"\\f29d\";\n}\ni.icon.blog::before {\n  content: \"\\f781\";\n}\ni.icon.bold::before {\n  content: \"\\f032\";\n}\ni.icon.bolt::before {\n  content: \"\\f0e7\";\n}\ni.icon.bomb::before {\n  content: \"\\f1e2\";\n}\ni.icon.bone::before {\n  content: \"\\f5d7\";\n}\ni.icon.bong::before {\n  content: \"\\f55c\";\n}\ni.icon.book::before {\n  content: \"\\f02d\";\n}\ni.icon.book.dead::before {\n  content: \"\\f6b7\";\n}\ni.icon.book.medical::before {\n  content: \"\\f7e6\";\n}\ni.icon.book.open::before {\n  content: \"\\f518\";\n}\ni.icon.book.reader::before {\n  content: \"\\f5da\";\n}\ni.icon.bookmark::before {\n  content: \"\\f02e\";\n}\ni.icon.border.all::before {\n  content: \"\\f84c\";\n}\ni.icon.border.none::before {\n  content: \"\\f850\";\n}\ni.icon.border.style::before {\n  content: \"\\f853\";\n}\ni.icon.bowling.ball::before {\n  content: \"\\f436\";\n}\ni.icon.box::before {\n  content: \"\\f466\";\n}\ni.icon.box.open::before {\n  content: \"\\f49e\";\n}\ni.icon.box.tissue::before {\n  content: \"\\e05b\";\n}\ni.icon.boxes::before {\n  content: \"\\f468\";\n}\ni.icon.braille::before {\n  content: \"\\f2a1\";\n}\ni.icon.brain::before {\n  content: \"\\f5dc\";\n}\ni.icon.bread.slice::before {\n  content: \"\\f7ec\";\n}\ni.icon.briefcase::before {\n  content: \"\\f0b1\";\n}\ni.icon.briefcase.medical::before {\n  content: \"\\f469\";\n}\ni.icon.broadcast.tower::before {\n  content: \"\\f519\";\n}\ni.icon.broom::before {\n  content: \"\\f51a\";\n}\ni.icon.brush::before {\n  content: \"\\f55d\";\n}\ni.icon.bug::before {\n  content: \"\\f188\";\n}\ni.icon.building::before {\n  content: \"\\f1ad\";\n}\ni.icon.bullhorn::before {\n  content: \"\\f0a1\";\n}\ni.icon.bullseye::before {\n  content: \"\\f140\";\n}\ni.icon.burn::before {\n  content: \"\\f46a\";\n}\ni.icon.bus::before {\n  content: \"\\f207\";\n}\ni.icon.bus.alternate::before {\n  content: \"\\f55e\";\n}\ni.icon.business.time::before {\n  content: \"\\f64a\";\n}\ni.icon.calculator::before {\n  content: \"\\f1ec\";\n}\ni.icon.calendar::before {\n  content: \"\\f133\";\n}\ni.icon.calendar.alternate::before {\n  content: \"\\f073\";\n}\ni.icon.calendar.check::before {\n  content: \"\\f274\";\n}\ni.icon.calendar.day::before {\n  content: \"\\f783\";\n}\ni.icon.calendar.minus::before {\n  content: \"\\f272\";\n}\ni.icon.calendar.plus::before {\n  content: \"\\f271\";\n}\ni.icon.calendar.times::before {\n  content: \"\\f273\";\n}\ni.icon.calendar.week::before {\n  content: \"\\f784\";\n}\ni.icon.camera::before {\n  content: \"\\f030\";\n}\ni.icon.camera.retro::before {\n  content: \"\\f083\";\n}\ni.icon.campground::before {\n  content: \"\\f6bb\";\n}\ni.icon.candy.cane::before {\n  content: \"\\f786\";\n}\ni.icon.cannabis::before {\n  content: \"\\f55f\";\n}\ni.icon.capsules::before {\n  content: \"\\f46b\";\n}\ni.icon.car::before {\n  content: \"\\f1b9\";\n}\ni.icon.car.alternate::before {\n  content: \"\\f5de\";\n}\ni.icon.car.battery::before {\n  content: \"\\f5df\";\n}\ni.icon.car.crash::before {\n  content: \"\\f5e1\";\n}\ni.icon.car.side::before {\n  content: \"\\f5e4\";\n}\ni.icon.caravan::before {\n  content: \"\\f8ff\";\n}\ni.icon.caret.down::before {\n  content: \"\\f0d7\";\n}\ni.icon.caret.left::before {\n  content: \"\\f0d9\";\n}\ni.icon.caret.right::before {\n  content: \"\\f0da\";\n}\ni.icon.caret.square.down::before {\n  content: \"\\f150\";\n}\ni.icon.caret.square.left::before {\n  content: \"\\f191\";\n}\ni.icon.caret.square.right::before {\n  content: \"\\f152\";\n}\ni.icon.caret.square.up::before {\n  content: \"\\f151\";\n}\ni.icon.caret.up::before {\n  content: \"\\f0d8\";\n}\ni.icon.carrot::before {\n  content: \"\\f787\";\n}\ni.icon.cart.arrow.down::before {\n  content: \"\\f218\";\n}\ni.icon.cart.plus::before {\n  content: \"\\f217\";\n}\ni.icon.cash.register::before {\n  content: \"\\f788\";\n}\ni.icon.cat::before {\n  content: \"\\f6be\";\n}\ni.icon.certificate::before {\n  content: \"\\f0a3\";\n}\ni.icon.chair::before {\n  content: \"\\f6c0\";\n}\ni.icon.chalkboard::before {\n  content: \"\\f51b\";\n}\ni.icon.chalkboard.teacher::before {\n  content: \"\\f51c\";\n}\ni.icon.charging.station::before {\n  content: \"\\f5e7\";\n}\ni.icon.chart.area::before {\n  content: \"\\f1fe\";\n}\ni.icon.chart.bar::before {\n  content: \"\\f080\";\n}\ni.icon.chart.pie::before {\n  content: \"\\f200\";\n}\ni.icon.chartline::before {\n  content: \"\\f201\";\n}\ni.icon.check::before {\n  content: \"\\f00c\";\n}\ni.icon.check.circle::before {\n  content: \"\\f058\";\n}\ni.icon.check.double::before {\n  content: \"\\f560\";\n}\ni.icon.check.square::before {\n  content: \"\\f14a\";\n}\ni.icon.cheese::before {\n  content: \"\\f7ef\";\n}\ni.icon.chess::before {\n  content: \"\\f439\";\n}\ni.icon.chess.bishop::before {\n  content: \"\\f43a\";\n}\ni.icon.chess.board::before {\n  content: \"\\f43c\";\n}\ni.icon.chess.king::before {\n  content: \"\\f43f\";\n}\ni.icon.chess.knight::before {\n  content: \"\\f441\";\n}\ni.icon.chess.pawn::before {\n  content: \"\\f443\";\n}\ni.icon.chess.queen::before {\n  content: \"\\f445\";\n}\ni.icon.chess.rook::before {\n  content: \"\\f447\";\n}\ni.icon.chevron.circle.down::before {\n  content: \"\\f13a\";\n}\ni.icon.chevron.circle.left::before {\n  content: \"\\f137\";\n}\ni.icon.chevron.circle.right::before {\n  content: \"\\f138\";\n}\ni.icon.chevron.circle.up::before {\n  content: \"\\f139\";\n}\ni.icon.chevron.down::before {\n  content: \"\\f078\";\n}\ni.icon.chevron.left::before {\n  content: \"\\f053\";\n}\ni.icon.chevron.right::before {\n  content: \"\\f054\";\n}\ni.icon.chevron.up::before {\n  content: \"\\f077\";\n}\ni.icon.child::before {\n  content: \"\\f1ae\";\n}\ni.icon.church::before {\n  content: \"\\f51d\";\n}\ni.icon.circle::before {\n  content: \"\\f111\";\n}\ni.icon.circle.notch::before {\n  content: \"\\f1ce\";\n}\ni.icon.city::before {\n  content: \"\\f64f\";\n}\ni.icon.clinic.medical::before {\n  content: \"\\f7f2\";\n}\ni.icon.clipboard::before {\n  content: \"\\f328\";\n}\ni.icon.clipboard.check::before {\n  content: \"\\f46c\";\n}\ni.icon.clipboard.list::before {\n  content: \"\\f46d\";\n}\ni.icon.clock::before {\n  content: \"\\f017\";\n}\ni.icon.clone::before {\n  content: \"\\f24d\";\n}\ni.icon.closed.captioning::before {\n  content: \"\\f20a\";\n}\ni.icon.cloud::before {\n  content: \"\\f0c2\";\n}\ni.icon.cloud.download.alternate::before {\n  content: \"\\f381\";\n}\ni.icon.cloud.meatball::before {\n  content: \"\\f73b\";\n}\ni.icon.cloud.moon::before {\n  content: \"\\f6c3\";\n}\ni.icon.cloud.moon.rain::before {\n  content: \"\\f73c\";\n}\ni.icon.cloud.rain::before {\n  content: \"\\f73d\";\n}\ni.icon.cloud.showers.heavy::before {\n  content: \"\\f740\";\n}\ni.icon.cloud.sun::before {\n  content: \"\\f6c4\";\n}\ni.icon.cloud.sun.rain::before {\n  content: \"\\f743\";\n}\ni.icon.cloud.upload.alternate::before {\n  content: \"\\f382\";\n}\ni.icon.cocktail::before {\n  content: \"\\f561\";\n}\ni.icon.code::before {\n  content: \"\\f121\";\n}\ni.icon.code.branch::before {\n  content: \"\\f126\";\n}\ni.icon.coffee::before {\n  content: \"\\f0f4\";\n}\ni.icon.cog::before {\n  content: \"\\f013\";\n}\ni.icon.cogs::before {\n  content: \"\\f085\";\n}\ni.icon.coins::before {\n  content: \"\\f51e\";\n}\ni.icon.columns::before {\n  content: \"\\f0db\";\n}\ni.icon.comment::before {\n  content: \"\\f075\";\n}\ni.icon.comment.alternate::before {\n  content: \"\\f27a\";\n}\ni.icon.comment.dollar::before {\n  content: \"\\f651\";\n}\ni.icon.comment.dots::before {\n  content: \"\\f4ad\";\n}\ni.icon.comment.medical::before {\n  content: \"\\f7f5\";\n}\ni.icon.comment.slash::before {\n  content: \"\\f4b3\";\n}\ni.icon.comments::before {\n  content: \"\\f086\";\n}\ni.icon.comments.dollar::before {\n  content: \"\\f653\";\n}\ni.icon.compact.disc::before {\n  content: \"\\f51f\";\n}\ni.icon.compass::before {\n  content: \"\\f14e\";\n}\ni.icon.compress::before {\n  content: \"\\f066\";\n}\ni.icon.compress.alternate::before {\n  content: \"\\f422\";\n}\ni.icon.compress.arrows.alternate::before {\n  content: \"\\f78c\";\n}\ni.icon.concierge.bell::before {\n  content: \"\\f562\";\n}\ni.icon.cookie::before {\n  content: \"\\f563\";\n}\ni.icon.cookie.bite::before {\n  content: \"\\f564\";\n}\ni.icon.copy::before {\n  content: \"\\f0c5\";\n}\ni.icon.copyright::before {\n  content: \"\\f1f9\";\n}\ni.icon.couch::before {\n  content: \"\\f4b8\";\n}\ni.icon.credit.card::before {\n  content: \"\\f09d\";\n}\ni.icon.crop::before {\n  content: \"\\f125\";\n}\ni.icon.crop.alternate::before {\n  content: \"\\f565\";\n}\ni.icon.cross::before {\n  content: \"\\f654\";\n}\ni.icon.crosshairs::before {\n  content: \"\\f05b\";\n}\ni.icon.crow::before {\n  content: \"\\f520\";\n}\ni.icon.crown::before {\n  content: \"\\f521\";\n}\ni.icon.crutch::before {\n  content: \"\\f7f7\";\n}\ni.icon.cube::before {\n  content: \"\\f1b2\";\n}\ni.icon.cubes::before {\n  content: \"\\f1b3\";\n}\ni.icon.cut::before {\n  content: \"\\f0c4\";\n}\ni.icon.database::before {\n  content: \"\\f1c0\";\n}\ni.icon.deaf::before {\n  content: \"\\f2a4\";\n}\ni.icon.democrat::before {\n  content: \"\\f747\";\n}\ni.icon.desktop::before {\n  content: \"\\f108\";\n}\ni.icon.dharmachakra::before {\n  content: \"\\f655\";\n}\ni.icon.diagnoses::before {\n  content: \"\\f470\";\n}\ni.icon.dice::before {\n  content: \"\\f522\";\n}\ni.icon.dice.d20::before {\n  content: \"\\f6cf\";\n}\ni.icon.dice.d6::before {\n  content: \"\\f6d1\";\n}\ni.icon.dice.five::before {\n  content: \"\\f523\";\n}\ni.icon.dice.four::before {\n  content: \"\\f524\";\n}\ni.icon.dice.one::before {\n  content: \"\\f525\";\n}\ni.icon.dice.six::before {\n  content: \"\\f526\";\n}\ni.icon.dice.three::before {\n  content: \"\\f527\";\n}\ni.icon.dice.two::before {\n  content: \"\\f528\";\n}\ni.icon.digital.tachograph::before {\n  content: \"\\f566\";\n}\ni.icon.directions::before {\n  content: \"\\f5eb\";\n}\ni.icon.disease::before {\n  content: \"\\f7fa\";\n}\ni.icon.divide::before {\n  content: \"\\f529\";\n}\ni.icon.dizzy::before {\n  content: \"\\f567\";\n}\ni.icon.dna::before {\n  content: \"\\f471\";\n}\ni.icon.dog::before {\n  content: \"\\f6d3\";\n}\ni.icon.dollar.sign::before {\n  content: \"\\f155\";\n}\ni.icon.dolly::before {\n  content: \"\\f472\";\n}\ni.icon.dolly.flatbed::before {\n  content: \"\\f474\";\n}\ni.icon.donate::before {\n  content: \"\\f4b9\";\n}\ni.icon.door.closed::before {\n  content: \"\\f52a\";\n}\ni.icon.door.open::before {\n  content: \"\\f52b\";\n}\ni.icon.dot.circle::before {\n  content: \"\\f192\";\n}\ni.icon.dove::before {\n  content: \"\\f4ba\";\n}\ni.icon.download::before {\n  content: \"\\f019\";\n}\ni.icon.drafting.compass::before {\n  content: \"\\f568\";\n}\ni.icon.dragon::before {\n  content: \"\\f6d5\";\n}\ni.icon.draw.polygon::before {\n  content: \"\\f5ee\";\n}\ni.icon.drum::before {\n  content: \"\\f569\";\n}\ni.icon.drum.steelpan::before {\n  content: \"\\f56a\";\n}\ni.icon.drumstick.bite::before {\n  content: \"\\f6d7\";\n}\ni.icon.dumbbell::before {\n  content: \"\\f44b\";\n}\ni.icon.dumpster::before {\n  content: \"\\f793\";\n}\ni.icon.dumpster.fire::before {\n  content: \"\\f794\";\n}\ni.icon.dungeon::before {\n  content: \"\\f6d9\";\n}\ni.icon.edit::before {\n  content: \"\\f044\";\n}\ni.icon.egg::before {\n  content: \"\\f7fb\";\n}\ni.icon.eject::before {\n  content: \"\\f052\";\n}\ni.icon.ellipsis.horizontal::before {\n  content: \"\\f141\";\n}\ni.icon.ellipsis.vertical::before {\n  content: \"\\f142\";\n}\ni.icon.envelope::before {\n  content: \"\\f0e0\";\n}\ni.icon.envelope.open::before {\n  content: \"\\f2b6\";\n}\ni.icon.envelope.open.text::before {\n  content: \"\\f658\";\n}\ni.icon.envelope.square::before {\n  content: \"\\f199\";\n}\ni.icon.equals::before {\n  content: \"\\f52c\";\n}\ni.icon.eraser::before {\n  content: \"\\f12d\";\n}\ni.icon.ethernet::before {\n  content: \"\\f796\";\n}\ni.icon.euro.sign::before {\n  content: \"\\f153\";\n}\ni.icon.exchange.alternate::before {\n  content: \"\\f362\";\n}\ni.icon.exclamation::before {\n  content: \"\\f12a\";\n}\ni.icon.exclamation.circle::before {\n  content: \"\\f06a\";\n}\ni.icon.exclamation.triangle::before {\n  content: \"\\f071\";\n}\ni.icon.expand::before {\n  content: \"\\f065\";\n}\ni.icon.expand.alternate::before {\n  content: \"\\f424\";\n}\ni.icon.expand.arrows.alternate::before {\n  content: \"\\f31e\";\n}\ni.icon.external.alternate::before {\n  content: \"\\f35d\";\n}\ni.icon.external.link.square.alternate::before {\n  content: \"\\f360\";\n}\ni.icon.eye::before {\n  content: \"\\f06e\";\n}\ni.icon.eye.dropper::before {\n  content: \"\\f1fb\";\n}\ni.icon.eye.slash::before {\n  content: \"\\f070\";\n}\ni.icon.fan::before {\n  content: \"\\f863\";\n}\ni.icon.fast.backward::before {\n  content: \"\\f049\";\n}\ni.icon.fast.forward::before {\n  content: \"\\f050\";\n}\ni.icon.faucet::before {\n  content: \"\\e005\";\n}\ni.icon.fax::before {\n  content: \"\\f1ac\";\n}\ni.icon.feather::before {\n  content: \"\\f52d\";\n}\ni.icon.feather.alternate::before {\n  content: \"\\f56b\";\n}\ni.icon.female::before {\n  content: \"\\f182\";\n}\ni.icon.fighter.jet::before {\n  content: \"\\f0fb\";\n}\ni.icon.file::before {\n  content: \"\\f15b\";\n}\ni.icon.file.alternate::before {\n  content: \"\\f15c\";\n}\ni.icon.file.archive::before {\n  content: \"\\f1c6\";\n}\ni.icon.file.audio::before {\n  content: \"\\f1c7\";\n}\ni.icon.file.code::before {\n  content: \"\\f1c9\";\n}\ni.icon.file.contract::before {\n  content: \"\\f56c\";\n}\ni.icon.file.csv::before {\n  content: \"\\f6dd\";\n}\ni.icon.file.download::before {\n  content: \"\\f56d\";\n}\ni.icon.file.excel::before {\n  content: \"\\f1c3\";\n}\ni.icon.file.export::before {\n  content: \"\\f56e\";\n}\ni.icon.file.image::before {\n  content: \"\\f1c5\";\n}\ni.icon.file.import::before {\n  content: \"\\f56f\";\n}\ni.icon.file.invoice::before {\n  content: \"\\f570\";\n}\ni.icon.file.invoice.dollar::before {\n  content: \"\\f571\";\n}\ni.icon.file.medical::before {\n  content: \"\\f477\";\n}\ni.icon.file.medical.alternate::before {\n  content: \"\\f478\";\n}\ni.icon.file.pdf::before {\n  content: \"\\f1c1\";\n}\ni.icon.file.powerpoint::before {\n  content: \"\\f1c4\";\n}\ni.icon.file.prescription::before {\n  content: \"\\f572\";\n}\ni.icon.file.signature::before {\n  content: \"\\f573\";\n}\ni.icon.file.upload::before {\n  content: \"\\f574\";\n}\ni.icon.file.video::before {\n  content: \"\\f1c8\";\n}\ni.icon.file.word::before {\n  content: \"\\f1c2\";\n}\ni.icon.fill::before {\n  content: \"\\f575\";\n}\ni.icon.fill.drip::before {\n  content: \"\\f576\";\n}\ni.icon.film::before {\n  content: \"\\f008\";\n}\ni.icon.filter::before {\n  content: \"\\f0b0\";\n}\ni.icon.fingerprint::before {\n  content: \"\\f577\";\n}\ni.icon.fire::before {\n  content: \"\\f06d\";\n}\ni.icon.fire.alternate::before {\n  content: \"\\f7e4\";\n}\ni.icon.fire.extinguisher::before {\n  content: \"\\f134\";\n}\ni.icon.first.aid::before {\n  content: \"\\f479\";\n}\ni.icon.fish::before {\n  content: \"\\f578\";\n}\ni.icon.fist.raised::before {\n  content: \"\\f6de\";\n}\ni.icon.flag::before {\n  content: \"\\f024\";\n}\ni.icon.flag.checkered::before {\n  content: \"\\f11e\";\n}\ni.icon.flag.usa::before {\n  content: \"\\f74d\";\n}\ni.icon.flask::before {\n  content: \"\\f0c3\";\n}\ni.icon.flushed::before {\n  content: \"\\f579\";\n}\ni.icon.folder::before {\n  content: \"\\f07b\";\n}\ni.icon.folder.minus::before {\n  content: \"\\f65d\";\n}\ni.icon.folder.open::before {\n  content: \"\\f07c\";\n}\ni.icon.folder.plus::before {\n  content: \"\\f65e\";\n}\ni.icon.font::before {\n  content: \"\\f031\";\n}\ni.icon.football.ball::before {\n  content: \"\\f44e\";\n}\ni.icon.forward::before {\n  content: \"\\f04e\";\n}\ni.icon.frog::before {\n  content: \"\\f52e\";\n}\ni.icon.frown::before {\n  content: \"\\f119\";\n}\ni.icon.frown.open::before {\n  content: \"\\f57a\";\n}\ni.icon.fruit-apple::before {\n  content: \"\\f5d1\";\n}\ni.icon.funnel.dollar::before {\n  content: \"\\f662\";\n}\ni.icon.futbol::before {\n  content: \"\\f1e3\";\n}\ni.icon.gamepad::before {\n  content: \"\\f11b\";\n}\ni.icon.gas.pump::before {\n  content: \"\\f52f\";\n}\ni.icon.gavel::before {\n  content: \"\\f0e3\";\n}\ni.icon.gem::before {\n  content: \"\\f3a5\";\n}\ni.icon.genderless::before {\n  content: \"\\f22d\";\n}\ni.icon.ghost::before {\n  content: \"\\f6e2\";\n}\ni.icon.gift::before {\n  content: \"\\f06b\";\n}\ni.icon.gifts::before {\n  content: \"\\f79c\";\n}\ni.icon.glass.cheers::before {\n  content: \"\\f79f\";\n}\ni.icon.glass.martini::before {\n  content: \"\\f000\";\n}\ni.icon.glass.martini.alternate::before {\n  content: \"\\f57b\";\n}\ni.icon.glass.whiskey::before {\n  content: \"\\f7a0\";\n}\ni.icon.glasses::before {\n  content: \"\\f530\";\n}\ni.icon.globe::before {\n  content: \"\\f0ac\";\n}\ni.icon.globe.africa::before {\n  content: \"\\f57c\";\n}\ni.icon.globe.americas::before {\n  content: \"\\f57d\";\n}\ni.icon.globe.asia::before {\n  content: \"\\f57e\";\n}\ni.icon.globe.europe::before {\n  content: \"\\f7a2\";\n}\ni.icon.golf.ball::before {\n  content: \"\\f450\";\n}\ni.icon.gopuram::before {\n  content: \"\\f664\";\n}\ni.icon.graduation.cap::before {\n  content: \"\\f19d\";\n}\ni.icon.greater.than::before {\n  content: \"\\f531\";\n}\ni.icon.greater.than.equal::before {\n  content: \"\\f532\";\n}\ni.icon.grimace::before {\n  content: \"\\f57f\";\n}\ni.icon.grin::before {\n  content: \"\\f580\";\n}\ni.icon.grin.alternate::before {\n  content: \"\\f581\";\n}\ni.icon.grin.beam::before {\n  content: \"\\f582\";\n}\ni.icon.grin.beam.sweat::before {\n  content: \"\\f583\";\n}\ni.icon.grin.hearts::before {\n  content: \"\\f584\";\n}\ni.icon.grin.squint::before {\n  content: \"\\f585\";\n}\ni.icon.grin.squint.tears::before {\n  content: \"\\f586\";\n}\ni.icon.grin.stars::before {\n  content: \"\\f587\";\n}\ni.icon.grin.tears::before {\n  content: \"\\f588\";\n}\ni.icon.grin.tongue::before {\n  content: \"\\f589\";\n}\ni.icon.grin.tongue.squint::before {\n  content: \"\\f58a\";\n}\ni.icon.grin.tongue.wink::before {\n  content: \"\\f58b\";\n}\ni.icon.grin.wink::before {\n  content: \"\\f58c\";\n}\ni.icon.grip.horizontal::before {\n  content: \"\\f58d\";\n}\ni.icon.grip.lines::before {\n  content: \"\\f7a4\";\n}\ni.icon.grip.lines.vertical::before {\n  content: \"\\f7a5\";\n}\ni.icon.grip.vertical::before {\n  content: \"\\f58e\";\n}\ni.icon.guitar::before {\n  content: \"\\f7a6\";\n}\ni.icon.h.square::before {\n  content: \"\\f0fd\";\n}\ni.icon.hamburger::before {\n  content: \"\\f805\";\n}\ni.icon.hammer::before {\n  content: \"\\f6e3\";\n}\ni.icon.hamsa::before {\n  content: \"\\f665\";\n}\ni.icon.hand.holding::before {\n  content: \"\\f4bd\";\n}\ni.icon.hand.holding.heart::before {\n  content: \"\\f4be\";\n}\ni.icon.hand.holding.medical::before {\n  content: \"\\e05c\";\n}\ni.icon.hand.holding.usd::before {\n  content: \"\\f4c0\";\n}\ni.icon.hand.holding.water::before {\n  content: \"\\f4c1\";\n}\ni.icon.hand.lizard::before {\n  content: \"\\f258\";\n}\ni.icon.hand.middle.finger::before {\n  content: \"\\f806\";\n}\ni.icon.hand.paper::before {\n  content: \"\\f256\";\n}\ni.icon.hand.peace::before {\n  content: \"\\f25b\";\n}\ni.icon.hand.point.down::before {\n  content: \"\\f0a7\";\n}\ni.icon.hand.point.left::before {\n  content: \"\\f0a5\";\n}\ni.icon.hand.point.right::before {\n  content: \"\\f0a4\";\n}\ni.icon.hand.point.up::before {\n  content: \"\\f0a6\";\n}\ni.icon.hand.pointer::before {\n  content: \"\\f25a\";\n}\ni.icon.hand.rock::before {\n  content: \"\\f255\";\n}\ni.icon.hand.scissors::before {\n  content: \"\\f257\";\n}\ni.icon.hand.sparkles::before {\n  content: \"\\e05d\";\n}\ni.icon.hand.spock::before {\n  content: \"\\f259\";\n}\ni.icon.hands::before {\n  content: \"\\f4c2\";\n}\ni.icon.hands.helping::before {\n  content: \"\\f4c4\";\n}\ni.icon.hands.wash::before {\n  content: \"\\e05e\";\n}\ni.icon.handshake::before {\n  content: \"\\f2b5\";\n}\ni.icon.handshake.alternate.slash::before {\n  content: \"\\e05f\";\n}\ni.icon.handshake.slash::before {\n  content: \"\\e060\";\n}\ni.icon.hanukiah::before {\n  content: \"\\f6e6\";\n}\ni.icon.hard.hat::before {\n  content: \"\\f807\";\n}\ni.icon.hashtag::before {\n  content: \"\\f292\";\n}\ni.icon.hat.cowboy::before {\n  content: \"\\f8c0\";\n}\ni.icon.hat.cowboy.side::before {\n  content: \"\\f8c1\";\n}\ni.icon.hat.wizard::before {\n  content: \"\\f6e8\";\n}\ni.icon.hdd::before {\n  content: \"\\f0a0\";\n}\ni.icon.head.side.cough::before {\n  content: \"\\e061\";\n}\ni.icon.head.side.cough.slash::before {\n  content: \"\\e062\";\n}\ni.icon.head.side.mask::before {\n  content: \"\\e063\";\n}\ni.icon.head.side.virus::before {\n  content: \"\\e064\";\n}\ni.icon.heading::before {\n  content: \"\\f1dc\";\n}\ni.icon.headphones::before {\n  content: \"\\f025\";\n}\ni.icon.headphones.alternate::before {\n  content: \"\\f58f\";\n}\ni.icon.headset::before {\n  content: \"\\f590\";\n}\ni.icon.heart::before {\n  content: \"\\f004\";\n}\ni.icon.heart.broken::before {\n  content: \"\\f7a9\";\n}\ni.icon.heartbeat::before {\n  content: \"\\f21e\";\n}\ni.icon.helicopter::before {\n  content: \"\\f533\";\n}\ni.icon.highlighter::before {\n  content: \"\\f591\";\n}\ni.icon.hiking::before {\n  content: \"\\f6ec\";\n}\ni.icon.hippo::before {\n  content: \"\\f6ed\";\n}\ni.icon.history::before {\n  content: \"\\f1da\";\n}\ni.icon.hockey.puck::before {\n  content: \"\\f453\";\n}\ni.icon.holly.berry::before {\n  content: \"\\f7aa\";\n}\ni.icon.home::before {\n  content: \"\\f015\";\n}\ni.icon.horse::before {\n  content: \"\\f6f0\";\n}\ni.icon.horse.head::before {\n  content: \"\\f7ab\";\n}\ni.icon.hospital::before {\n  content: \"\\f0f8\";\n}\ni.icon.hospital.alternate::before {\n  content: \"\\f47d\";\n}\ni.icon.hospital.symbol::before {\n  content: \"\\f47e\";\n}\ni.icon.hospital.user::before {\n  content: \"\\f80d\";\n}\ni.icon.hot.tub::before {\n  content: \"\\f593\";\n}\ni.icon.hotdog::before {\n  content: \"\\f80f\";\n}\ni.icon.hotel::before {\n  content: \"\\f594\";\n}\ni.icon.hourglass::before {\n  content: \"\\f254\";\n}\ni.icon.hourglass.end::before {\n  content: \"\\f253\";\n}\ni.icon.hourglass.half::before {\n  content: \"\\f252\";\n}\ni.icon.hourglass.start::before {\n  content: \"\\f251\";\n}\ni.icon.house.damage::before {\n  content: \"\\f6f1\";\n}\ni.icon.house.user::before {\n  content: \"\\e065\";\n}\ni.icon.hryvnia::before {\n  content: \"\\f6f2\";\n}\ni.icon.i.cursor::before {\n  content: \"\\f246\";\n}\ni.icon.ice.cream::before {\n  content: \"\\f810\";\n}\ni.icon.icicles::before {\n  content: \"\\f7ad\";\n}\ni.icon.icons::before {\n  content: \"\\f86d\";\n}\ni.icon.id.badge::before {\n  content: \"\\f2c1\";\n}\ni.icon.id.card::before {\n  content: \"\\f2c2\";\n}\ni.icon.id.card.alternate::before {\n  content: \"\\f47f\";\n}\ni.icon.igloo::before {\n  content: \"\\f7ae\";\n}\ni.icon.image::before {\n  content: \"\\f03e\";\n}\ni.icon.images::before {\n  content: \"\\f302\";\n}\ni.icon.inbox::before {\n  content: \"\\f01c\";\n}\ni.icon.indent::before {\n  content: \"\\f03c\";\n}\ni.icon.industry::before {\n  content: \"\\f275\";\n}\ni.icon.infinity::before {\n  content: \"\\f534\";\n}\ni.icon.info::before {\n  content: \"\\f129\";\n}\ni.icon.info.circle::before {\n  content: \"\\f05a\";\n}\ni.icon.italic::before {\n  content: \"\\f033\";\n}\ni.icon.jedi::before {\n  content: \"\\f669\";\n}\ni.icon.joint::before {\n  content: \"\\f595\";\n}\ni.icon.journal.whills::before {\n  content: \"\\f66a\";\n}\ni.icon.kaaba::before {\n  content: \"\\f66b\";\n}\ni.icon.key::before {\n  content: \"\\f084\";\n}\ni.icon.keyboard::before {\n  content: \"\\f11c\";\n}\ni.icon.khanda::before {\n  content: \"\\f66d\";\n}\ni.icon.kiss::before {\n  content: \"\\f596\";\n}\ni.icon.kiss.beam::before {\n  content: \"\\f597\";\n}\ni.icon.kiss.wink.heart::before {\n  content: \"\\f598\";\n}\ni.icon.kiwi.bird::before {\n  content: \"\\f535\";\n}\ni.icon.landmark::before {\n  content: \"\\f66f\";\n}\ni.icon.language::before {\n  content: \"\\f1ab\";\n}\ni.icon.laptop::before {\n  content: \"\\f109\";\n}\ni.icon.laptop.code::before {\n  content: \"\\f5fc\";\n}\ni.icon.laptop.house::before {\n  content: \"\\e066\";\n}\ni.icon.laptop.medical::before {\n  content: \"\\f812\";\n}\ni.icon.laugh::before {\n  content: \"\\f599\";\n}\ni.icon.laugh.beam::before {\n  content: \"\\f59a\";\n}\ni.icon.laugh.squint::before {\n  content: \"\\f59b\";\n}\ni.icon.laugh.wink::before {\n  content: \"\\f59c\";\n}\ni.icon.layer.group::before {\n  content: \"\\f5fd\";\n}\ni.icon.leaf::before {\n  content: \"\\f06c\";\n}\ni.icon.lemon::before {\n  content: \"\\f094\";\n}\ni.icon.less.than::before {\n  content: \"\\f536\";\n}\ni.icon.less.than.equal::before {\n  content: \"\\f537\";\n}\ni.icon.level.down.alternate::before {\n  content: \"\\f3be\";\n}\ni.icon.level.up.alternate::before {\n  content: \"\\f3bf\";\n}\ni.icon.life.ring::before {\n  content: \"\\f1cd\";\n}\ni.icon.lightbulb::before {\n  content: \"\\f0eb\";\n}\ni.icon.linkify::before {\n  content: \"\\f0c1\";\n}\ni.icon.lira.sign::before {\n  content: \"\\f195\";\n}\ni.icon.list::before {\n  content: \"\\f03a\";\n}\ni.icon.list.alternate::before {\n  content: \"\\f022\";\n}\ni.icon.list.ol::before {\n  content: \"\\f0cb\";\n}\ni.icon.list.ul::before {\n  content: \"\\f0ca\";\n}\ni.icon.location.arrow::before {\n  content: \"\\f124\";\n}\ni.icon.lock::before {\n  content: \"\\f023\";\n}\ni.icon.lock.open::before {\n  content: \"\\f3c1\";\n}\ni.icon.long.arrow.alternate.down::before {\n  content: \"\\f309\";\n}\ni.icon.long.arrow.alternate.left::before {\n  content: \"\\f30a\";\n}\ni.icon.long.arrow.alternate.right::before {\n  content: \"\\f30b\";\n}\ni.icon.long.arrow.alternate.up::before {\n  content: \"\\f30c\";\n}\ni.icon.low.vision::before {\n  content: \"\\f2a8\";\n}\ni.icon.luggage.cart::before {\n  content: \"\\f59d\";\n}\ni.icon.lungs::before {\n  content: \"\\f604\";\n}\ni.icon.lungs.virus::before {\n  content: \"\\e067\";\n}\ni.icon.magic::before {\n  content: \"\\f0d0\";\n}\ni.icon.magnet::before {\n  content: \"\\f076\";\n}\ni.icon.mail.bulk::before {\n  content: \"\\f674\";\n}\ni.icon.male::before {\n  content: \"\\f183\";\n}\ni.icon.map::before {\n  content: \"\\f279\";\n}\ni.icon.map.marked::before {\n  content: \"\\f59f\";\n}\ni.icon.map.marked.alternate::before {\n  content: \"\\f5a0\";\n}\ni.icon.map.marker::before {\n  content: \"\\f041\";\n}\ni.icon.map.marker.alternate::before {\n  content: \"\\f3c5\";\n}\ni.icon.map.pin::before {\n  content: \"\\f276\";\n}\ni.icon.map.signs::before {\n  content: \"\\f277\";\n}\ni.icon.marker::before {\n  content: \"\\f5a1\";\n}\ni.icon.mars::before {\n  content: \"\\f222\";\n}\ni.icon.mars.double::before {\n  content: \"\\f227\";\n}\ni.icon.mars.stroke::before {\n  content: \"\\f229\";\n}\ni.icon.mars.stroke.horizontal::before {\n  content: \"\\f22b\";\n}\ni.icon.mars.stroke.vertical::before {\n  content: \"\\f22a\";\n}\ni.icon.mask::before {\n  content: \"\\f6fa\";\n}\ni.icon.medal::before {\n  content: \"\\f5a2\";\n}\ni.icon.medkit::before {\n  content: \"\\f0fa\";\n}\ni.icon.meh::before {\n  content: \"\\f11a\";\n}\ni.icon.meh.blank::before {\n  content: \"\\f5a4\";\n}\ni.icon.meh.rolling.eyes::before {\n  content: \"\\f5a5\";\n}\ni.icon.memory::before {\n  content: \"\\f538\";\n}\ni.icon.menorah::before {\n  content: \"\\f676\";\n}\ni.icon.mercury::before {\n  content: \"\\f223\";\n}\ni.icon.meteor::before {\n  content: \"\\f753\";\n}\ni.icon.microchip::before {\n  content: \"\\f2db\";\n}\ni.icon.microphone::before {\n  content: \"\\f130\";\n}\ni.icon.microphone.alternate::before {\n  content: \"\\f3c9\";\n}\ni.icon.microphone.alternate.slash::before {\n  content: \"\\f539\";\n}\ni.icon.microphone.slash::before {\n  content: \"\\f131\";\n}\ni.icon.microscope::before {\n  content: \"\\f610\";\n}\ni.icon.minus::before {\n  content: \"\\f068\";\n}\ni.icon.minus.circle::before {\n  content: \"\\f056\";\n}\ni.icon.minus.square::before {\n  content: \"\\f146\";\n}\ni.icon.mitten::before {\n  content: \"\\f7b5\";\n}\ni.icon.mobile::before {\n  content: \"\\f10b\";\n}\ni.icon.mobile.alternate::before {\n  content: \"\\f3cd\";\n}\ni.icon.money.bill::before {\n  content: \"\\f0d6\";\n}\ni.icon.money.bill.alternate::before {\n  content: \"\\f3d1\";\n}\ni.icon.money.bill.wave::before {\n  content: \"\\f53a\";\n}\ni.icon.money.bill.wave.alternate::before {\n  content: \"\\f53b\";\n}\ni.icon.money.check::before {\n  content: \"\\f53c\";\n}\ni.icon.money.check.alternate::before {\n  content: \"\\f53d\";\n}\ni.icon.monument::before {\n  content: \"\\f5a6\";\n}\ni.icon.moon::before {\n  content: \"\\f186\";\n}\ni.icon.mortar.pestle::before {\n  content: \"\\f5a7\";\n}\ni.icon.mosque::before {\n  content: \"\\f678\";\n}\ni.icon.motorcycle::before {\n  content: \"\\f21c\";\n}\ni.icon.mountain::before {\n  content: \"\\f6fc\";\n}\ni.icon.mouse::before {\n  content: \"\\f8cc\";\n}\ni.icon.mouse.pointer::before {\n  content: \"\\f245\";\n}\ni.icon.mug.hot::before {\n  content: \"\\f7b6\";\n}\ni.icon.music::before {\n  content: \"\\f001\";\n}\ni.icon.network.wired::before {\n  content: \"\\f6ff\";\n}\ni.icon.neuter::before {\n  content: \"\\f22c\";\n}\ni.icon.newspaper::before {\n  content: \"\\f1ea\";\n}\ni.icon.not.equal::before {\n  content: \"\\f53e\";\n}\ni.icon.notes.medical::before {\n  content: \"\\f481\";\n}\ni.icon.object.group::before {\n  content: \"\\f247\";\n}\ni.icon.object.ungroup::before {\n  content: \"\\f248\";\n}\ni.icon.oil.can::before {\n  content: \"\\f613\";\n}\ni.icon.om::before {\n  content: \"\\f679\";\n}\ni.icon.otter::before {\n  content: \"\\f700\";\n}\ni.icon.outdent::before {\n  content: \"\\f03b\";\n}\ni.icon.pager::before {\n  content: \"\\f815\";\n}\ni.icon.paint.brush::before {\n  content: \"\\f1fc\";\n}\ni.icon.paint.roller::before {\n  content: \"\\f5aa\";\n}\ni.icon.palette::before {\n  content: \"\\f53f\";\n}\ni.icon.pallet::before {\n  content: \"\\f482\";\n}\ni.icon.paper.plane::before {\n  content: \"\\f1d8\";\n}\ni.icon.paperclip::before {\n  content: \"\\f0c6\";\n}\ni.icon.parachute.box::before {\n  content: \"\\f4cd\";\n}\ni.icon.paragraph::before {\n  content: \"\\f1dd\";\n}\ni.icon.parking::before {\n  content: \"\\f540\";\n}\ni.icon.passport::before {\n  content: \"\\f5ab\";\n}\ni.icon.pastafarianism::before {\n  content: \"\\f67b\";\n}\ni.icon.paste::before {\n  content: \"\\f0ea\";\n}\ni.icon.pause::before {\n  content: \"\\f04c\";\n}\ni.icon.pause.circle::before {\n  content: \"\\f28b\";\n}\ni.icon.paw::before {\n  content: \"\\f1b0\";\n}\ni.icon.peace::before {\n  content: \"\\f67c\";\n}\ni.icon.pen::before {\n  content: \"\\f304\";\n}\ni.icon.pen.alternate::before {\n  content: \"\\f305\";\n}\ni.icon.pen.fancy::before {\n  content: \"\\f5ac\";\n}\ni.icon.pen.nib::before {\n  content: \"\\f5ad\";\n}\ni.icon.pen.square::before {\n  content: \"\\f14b\";\n}\ni.icon.pencil.alternate::before {\n  content: \"\\f303\";\n}\ni.icon.pencil.ruler::before {\n  content: \"\\f5ae\";\n}\ni.icon.people.arrows::before {\n  content: \"\\e068\";\n}\ni.icon.people.carry::before {\n  content: \"\\f4ce\";\n}\ni.icon.pepper.hot::before {\n  content: \"\\f816\";\n}\ni.icon.percent::before {\n  content: \"\\f295\";\n}\ni.icon.percentage::before {\n  content: \"\\f541\";\n}\ni.icon.person.booth::before {\n  content: \"\\f756\";\n}\ni.icon.phone::before {\n  content: \"\\f095\";\n}\ni.icon.phone.alternate::before {\n  content: \"\\f879\";\n}\ni.icon.phone.slash::before {\n  content: \"\\f3dd\";\n}\ni.icon.phone.square::before {\n  content: \"\\f098\";\n}\ni.icon.phone.square.alternate::before {\n  content: \"\\f87b\";\n}\ni.icon.phone.volume::before {\n  content: \"\\f2a0\";\n}\ni.icon.photo.video::before {\n  content: \"\\f87c\";\n}\ni.icon.piggy.bank::before {\n  content: \"\\f4d3\";\n}\ni.icon.pills::before {\n  content: \"\\f484\";\n}\ni.icon.pizza.slice::before {\n  content: \"\\f818\";\n}\ni.icon.place.of.worship::before {\n  content: \"\\f67f\";\n}\ni.icon.plane::before {\n  content: \"\\f072\";\n}\ni.icon.plane.arrival::before {\n  content: \"\\f5af\";\n}\ni.icon.plane.departure::before {\n  content: \"\\f5b0\";\n}\ni.icon.plane.slash::before {\n  content: \"\\e069\";\n}\ni.icon.play::before {\n  content: \"\\f04b\";\n}\ni.icon.play.circle::before {\n  content: \"\\f144\";\n}\ni.icon.plug::before {\n  content: \"\\f1e6\";\n}\ni.icon.plus::before {\n  content: \"\\f067\";\n}\ni.icon.plus.circle::before {\n  content: \"\\f055\";\n}\ni.icon.plus.square::before {\n  content: \"\\f0fe\";\n}\ni.icon.podcast::before {\n  content: \"\\f2ce\";\n}\ni.icon.poll::before {\n  content: \"\\f681\";\n}\ni.icon.poll.horizontal::before {\n  content: \"\\f682\";\n}\ni.icon.poo::before {\n  content: \"\\f2fe\";\n}\ni.icon.poo.storm::before {\n  content: \"\\f75a\";\n}\ni.icon.poop::before {\n  content: \"\\f619\";\n}\ni.icon.portrait::before {\n  content: \"\\f3e0\";\n}\ni.icon.pound.sign::before {\n  content: \"\\f154\";\n}\ni.icon.power.off::before {\n  content: \"\\f011\";\n}\ni.icon.pray::before {\n  content: \"\\f683\";\n}\ni.icon.praying.hands::before {\n  content: \"\\f684\";\n}\ni.icon.prescription::before {\n  content: \"\\f5b1\";\n}\ni.icon.prescription.bottle::before {\n  content: \"\\f485\";\n}\ni.icon.prescription.bottle.alternate::before {\n  content: \"\\f486\";\n}\ni.icon.print::before {\n  content: \"\\f02f\";\n}\ni.icon.procedures::before {\n  content: \"\\f487\";\n}\ni.icon.project.diagram::before {\n  content: \"\\f542\";\n}\ni.icon.pump.medical::before {\n  content: \"\\e06a\";\n}\ni.icon.pump.soap::before {\n  content: \"\\e06b\";\n}\ni.icon.puzzle.piece::before {\n  content: \"\\f12e\";\n}\ni.icon.qrcode::before {\n  content: \"\\f029\";\n}\ni.icon.question::before {\n  content: \"\\f128\";\n}\ni.icon.question.circle::before {\n  content: \"\\f059\";\n}\ni.icon.quidditch::before {\n  content: \"\\f458\";\n}\ni.icon.quote.left::before {\n  content: \"\\f10d\";\n}\ni.icon.quote.right::before {\n  content: \"\\f10e\";\n}\ni.icon.quran::before {\n  content: \"\\f687\";\n}\ni.icon.radiation::before {\n  content: \"\\f7b9\";\n}\ni.icon.radiation.alternate::before {\n  content: \"\\f7ba\";\n}\ni.icon.rainbow::before {\n  content: \"\\f75b\";\n}\ni.icon.random::before {\n  content: \"\\f074\";\n}\ni.icon.receipt::before {\n  content: \"\\f543\";\n}\ni.icon.record.vinyl::before {\n  content: \"\\f8d9\";\n}\ni.icon.recycle::before {\n  content: \"\\f1b8\";\n}\ni.icon.redo::before {\n  content: \"\\f01e\";\n}\ni.icon.redo.alternate::before {\n  content: \"\\f2f9\";\n}\ni.icon.registered::before {\n  content: \"\\f25d\";\n}\ni.icon.remove.format::before {\n  content: \"\\f87d\";\n}\ni.icon.reply::before {\n  content: \"\\f3e5\";\n}\ni.icon.reply.all::before {\n  content: \"\\f122\";\n}\ni.icon.republican::before {\n  content: \"\\f75e\";\n}\ni.icon.restroom::before {\n  content: \"\\f7bd\";\n}\ni.icon.retweet::before {\n  content: \"\\f079\";\n}\ni.icon.ribbon::before {\n  content: \"\\f4d6\";\n}\ni.icon.ring::before {\n  content: \"\\f70b\";\n}\ni.icon.road::before {\n  content: \"\\f018\";\n}\ni.icon.robot::before {\n  content: \"\\f544\";\n}\ni.icon.rocket::before {\n  content: \"\\f135\";\n}\ni.icon.route::before {\n  content: \"\\f4d7\";\n}\ni.icon.rss::before {\n  content: \"\\f09e\";\n}\ni.icon.rss.square::before {\n  content: \"\\f143\";\n}\ni.icon.ruble.sign::before {\n  content: \"\\f158\";\n}\ni.icon.ruler::before {\n  content: \"\\f545\";\n}\ni.icon.ruler.combined::before {\n  content: \"\\f546\";\n}\ni.icon.ruler.horizontal::before {\n  content: \"\\f547\";\n}\ni.icon.ruler.vertical::before {\n  content: \"\\f548\";\n}\ni.icon.running::before {\n  content: \"\\f70c\";\n}\ni.icon.rupee.sign::before {\n  content: \"\\f156\";\n}\ni.icon.sad.cry::before {\n  content: \"\\f5b3\";\n}\ni.icon.sad.tear::before {\n  content: \"\\f5b4\";\n}\ni.icon.satellite::before {\n  content: \"\\f7bf\";\n}\ni.icon.satellite.dish::before {\n  content: \"\\f7c0\";\n}\ni.icon.save::before {\n  content: \"\\f0c7\";\n}\ni.icon.school::before {\n  content: \"\\f549\";\n}\ni.icon.screwdriver::before {\n  content: \"\\f54a\";\n}\ni.icon.scroll::before {\n  content: \"\\f70e\";\n}\ni.icon.sd.card::before {\n  content: \"\\f7c2\";\n}\ni.icon.search::before {\n  content: \"\\f002\";\n}\ni.icon.search.dollar::before {\n  content: \"\\f688\";\n}\ni.icon.search.location::before {\n  content: \"\\f689\";\n}\ni.icon.search.minus::before {\n  content: \"\\f010\";\n}\ni.icon.search.plus::before {\n  content: \"\\f00e\";\n}\ni.icon.seedling::before {\n  content: \"\\f4d8\";\n}\ni.icon.server::before {\n  content: \"\\f233\";\n}\ni.icon.shapes::before {\n  content: \"\\f61f\";\n}\ni.icon.share::before {\n  content: \"\\f064\";\n}\ni.icon.share.alternate::before {\n  content: \"\\f1e0\";\n}\ni.icon.share.alternate.square::before {\n  content: \"\\f1e1\";\n}\ni.icon.share.square::before {\n  content: \"\\f14d\";\n}\ni.icon.shekel.sign::before {\n  content: \"\\f20b\";\n}\ni.icon.shield.alternate::before {\n  content: \"\\f3ed\";\n}\ni.icon.shield.virus::before {\n  content: \"\\e06c\";\n}\ni.icon.ship::before {\n  content: \"\\f21a\";\n}\ni.icon.shipping.fast::before {\n  content: \"\\f48b\";\n}\ni.icon.shoe.prints::before {\n  content: \"\\f54b\";\n}\ni.icon.shopping.bag::before {\n  content: \"\\f290\";\n}\ni.icon.shopping.basket::before {\n  content: \"\\f291\";\n}\ni.icon.shopping.cart::before {\n  content: \"\\f07a\";\n}\ni.icon.shower::before {\n  content: \"\\f2cc\";\n}\ni.icon.shuttle.van::before {\n  content: \"\\f5b6\";\n}\ni.icon.sign::before {\n  content: \"\\f4d9\";\n}\ni.icon.sign.language::before {\n  content: \"\\f2a7\";\n}\ni.icon.signal::before {\n  content: \"\\f012\";\n}\ni.icon.signature::before {\n  content: \"\\f5b7\";\n}\ni.icon.sim.card::before {\n  content: \"\\f7c4\";\n}\ni.icon.sink::before {\n  content: \"\\e06d\";\n}\ni.icon.sitemap::before {\n  content: \"\\f0e8\";\n}\ni.icon.skating::before {\n  content: \"\\f7c5\";\n}\ni.icon.skiing::before {\n  content: \"\\f7c9\";\n}\ni.icon.skiing.nordic::before {\n  content: \"\\f7ca\";\n}\ni.icon.skull::before {\n  content: \"\\f54c\";\n}\ni.icon.skull.crossbones::before {\n  content: \"\\f714\";\n}\ni.icon.slash::before {\n  content: \"\\f715\";\n}\ni.icon.sleigh::before {\n  content: \"\\f7cc\";\n}\ni.icon.sliders.horizontal::before {\n  content: \"\\f1de\";\n}\ni.icon.smile::before {\n  content: \"\\f118\";\n}\ni.icon.smile.beam::before {\n  content: \"\\f5b8\";\n}\ni.icon.smile.wink::before {\n  content: \"\\f4da\";\n}\ni.icon.smog::before {\n  content: \"\\f75f\";\n}\ni.icon.smoking::before {\n  content: \"\\f48d\";\n}\ni.icon.smoking.ban::before {\n  content: \"\\f54d\";\n}\ni.icon.sms::before {\n  content: \"\\f7cd\";\n}\ni.icon.snowboarding::before {\n  content: \"\\f7ce\";\n}\ni.icon.snowflake::before {\n  content: \"\\f2dc\";\n}\ni.icon.snowman::before {\n  content: \"\\f7d0\";\n}\ni.icon.snowplow::before {\n  content: \"\\f7d2\";\n}\ni.icon.soap::before {\n  content: \"\\e06e\";\n}\ni.icon.socks::before {\n  content: \"\\f696\";\n}\ni.icon.solar.panel::before {\n  content: \"\\f5ba\";\n}\ni.icon.sort::before {\n  content: \"\\f0dc\";\n}\ni.icon.sort.alphabet.down::before {\n  content: \"\\f15d\";\n}\ni.icon.sort.alphabet.down.alternate::before {\n  content: \"\\f881\";\n}\ni.icon.sort.alphabet.up::before {\n  content: \"\\f15e\";\n}\ni.icon.sort.alphabet.up.alternate::before {\n  content: \"\\f882\";\n}\ni.icon.sort.amount.down::before {\n  content: \"\\f160\";\n}\ni.icon.sort.amount.down.alternate::before {\n  content: \"\\f884\";\n}\ni.icon.sort.amount.up::before {\n  content: \"\\f161\";\n}\ni.icon.sort.amount.up.alternate::before {\n  content: \"\\f885\";\n}\ni.icon.sort.down::before {\n  content: \"\\f0dd\";\n}\ni.icon.sort.numeric.down::before {\n  content: \"\\f162\";\n}\ni.icon.sort.numeric.down.alternate::before {\n  content: \"\\f886\";\n}\ni.icon.sort.numeric.up::before {\n  content: \"\\f163\";\n}\ni.icon.sort.numeric.up.alternate::before {\n  content: \"\\f887\";\n}\ni.icon.sort.up::before {\n  content: \"\\f0de\";\n}\ni.icon.spa::before {\n  content: \"\\f5bb\";\n}\ni.icon.space.shuttle::before {\n  content: \"\\f197\";\n}\ni.icon.spell.check::before {\n  content: \"\\f891\";\n}\ni.icon.spider::before {\n  content: \"\\f717\";\n}\ni.icon.spinner::before {\n  content: \"\\f110\";\n}\ni.icon.splotch::before {\n  content: \"\\f5bc\";\n}\ni.icon.spray.can::before {\n  content: \"\\f5bd\";\n}\ni.icon.square::before {\n  content: \"\\f0c8\";\n}\ni.icon.square.full::before {\n  content: \"\\f45c\";\n}\ni.icon.square.root.alternate::before {\n  content: \"\\f698\";\n}\ni.icon.stamp::before {\n  content: \"\\f5bf\";\n}\ni.icon.star::before {\n  content: \"\\f005\";\n}\ni.icon.star.and.crescent::before {\n  content: \"\\f699\";\n}\ni.icon.star.half::before {\n  content: \"\\f089\";\n}\ni.icon.star.half.alternate::before {\n  content: \"\\f5c0\";\n}\ni.icon.star.of.david::before {\n  content: \"\\f69a\";\n}\ni.icon.star.of.life::before {\n  content: \"\\f621\";\n}\ni.icon.step.backward::before {\n  content: \"\\f048\";\n}\ni.icon.step.forward::before {\n  content: \"\\f051\";\n}\ni.icon.stethoscope::before {\n  content: \"\\f0f1\";\n}\ni.icon.sticky.note::before {\n  content: \"\\f249\";\n}\ni.icon.stop::before {\n  content: \"\\f04d\";\n}\ni.icon.stop.circle::before {\n  content: \"\\f28d\";\n}\ni.icon.stopwatch::before {\n  content: \"\\f2f2\";\n}\ni.icon.stopwatch.twenty::before {\n  content: \"\\e06f\";\n}\ni.icon.store::before {\n  content: \"\\f54e\";\n}\ni.icon.store.alternate::before {\n  content: \"\\f54f\";\n}\ni.icon.store.alternate.slash::before {\n  content: \"\\e070\";\n}\ni.icon.store.slash::before {\n  content: \"\\e071\";\n}\ni.icon.stream::before {\n  content: \"\\f550\";\n}\ni.icon.street.view::before {\n  content: \"\\f21d\";\n}\ni.icon.strikethrough::before {\n  content: \"\\f0cc\";\n}\ni.icon.stroopwafel::before {\n  content: \"\\f551\";\n}\ni.icon.subscript::before {\n  content: \"\\f12c\";\n}\ni.icon.subway::before {\n  content: \"\\f239\";\n}\ni.icon.suitcase::before {\n  content: \"\\f0f2\";\n}\ni.icon.suitcase.rolling::before {\n  content: \"\\f5c1\";\n}\ni.icon.sun::before {\n  content: \"\\f185\";\n}\ni.icon.superscript::before {\n  content: \"\\f12b\";\n}\ni.icon.surprise::before {\n  content: \"\\f5c2\";\n}\ni.icon.swatchbook::before {\n  content: \"\\f5c3\";\n}\ni.icon.swimmer::before {\n  content: \"\\f5c4\";\n}\ni.icon.swimming.pool::before {\n  content: \"\\f5c5\";\n}\ni.icon.synagogue::before {\n  content: \"\\f69b\";\n}\ni.icon.sync::before {\n  content: \"\\f021\";\n}\ni.icon.sync.alternate::before {\n  content: \"\\f2f1\";\n}\ni.icon.syringe::before {\n  content: \"\\f48e\";\n}\ni.icon.table::before {\n  content: \"\\f0ce\";\n}\ni.icon.table.tennis::before {\n  content: \"\\f45d\";\n}\ni.icon.tablet::before {\n  content: \"\\f10a\";\n}\ni.icon.tablet.alternate::before {\n  content: \"\\f3fa\";\n}\ni.icon.tablets::before {\n  content: \"\\f490\";\n}\ni.icon.tachometer.alternate::before {\n  content: \"\\f3fd\";\n}\ni.icon.tag::before {\n  content: \"\\f02b\";\n}\ni.icon.tags::before {\n  content: \"\\f02c\";\n}\ni.icon.tape::before {\n  content: \"\\f4db\";\n}\ni.icon.tasks::before {\n  content: \"\\f0ae\";\n}\ni.icon.taxi::before {\n  content: \"\\f1ba\";\n}\ni.icon.teeth::before {\n  content: \"\\f62e\";\n}\ni.icon.teeth.open::before {\n  content: \"\\f62f\";\n}\ni.icon.temperature.high::before {\n  content: \"\\f769\";\n}\ni.icon.temperature.low::before {\n  content: \"\\f76b\";\n}\ni.icon.tenge::before {\n  content: \"\\f7d7\";\n}\ni.icon.terminal::before {\n  content: \"\\f120\";\n}\ni.icon.text.height::before {\n  content: \"\\f034\";\n}\ni.icon.text.width::before {\n  content: \"\\f035\";\n}\ni.icon.th::before {\n  content: \"\\f00a\";\n}\ni.icon.th.large::before {\n  content: \"\\f009\";\n}\ni.icon.th.list::before {\n  content: \"\\f00b\";\n}\ni.icon.theater.masks::before {\n  content: \"\\f630\";\n}\ni.icon.thermometer::before {\n  content: \"\\f491\";\n}\ni.icon.thermometer.empty::before {\n  content: \"\\f2cb\";\n}\ni.icon.thermometer.full::before {\n  content: \"\\f2c7\";\n}\ni.icon.thermometer.half::before {\n  content: \"\\f2c9\";\n}\ni.icon.thermometer.quarter::before {\n  content: \"\\f2ca\";\n}\ni.icon.thermometer.three.quarters::before {\n  content: \"\\f2c8\";\n}\ni.icon.thumbs.down::before {\n  content: \"\\f165\";\n}\ni.icon.thumbs.up::before {\n  content: \"\\f164\";\n}\ni.icon.thumbtack::before {\n  content: \"\\f08d\";\n}\ni.icon.ticket.alternate::before {\n  content: \"\\f3ff\";\n}\ni.icon.times::before {\n  content: \"\\f00d\";\n}\ni.icon.times.circle::before {\n  content: \"\\f057\";\n}\ni.icon.tint::before {\n  content: \"\\f043\";\n}\ni.icon.tint.slash::before {\n  content: \"\\f5c7\";\n}\ni.icon.tired::before {\n  content: \"\\f5c8\";\n}\ni.icon.toggle.off::before {\n  content: \"\\f204\";\n}\ni.icon.toggle.on::before {\n  content: \"\\f205\";\n}\ni.icon.toilet::before {\n  content: \"\\f7d8\";\n}\ni.icon.toilet.paper::before {\n  content: \"\\f71e\";\n}\ni.icon.toilet.paper.slash::before {\n  content: \"\\e072\";\n}\ni.icon.toolbox::before {\n  content: \"\\f552\";\n}\ni.icon.tools::before {\n  content: \"\\f7d9\";\n}\ni.icon.tooth::before {\n  content: \"\\f5c9\";\n}\ni.icon.torah::before {\n  content: \"\\f6a0\";\n}\ni.icon.torii.gate::before {\n  content: \"\\f6a1\";\n}\ni.icon.tractor::before {\n  content: \"\\f722\";\n}\ni.icon.trademark::before {\n  content: \"\\f25c\";\n}\ni.icon.traffic.light::before {\n  content: \"\\f637\";\n}\ni.icon.trailer::before {\n  content: \"\\e041\";\n}\ni.icon.train::before {\n  content: \"\\f238\";\n}\ni.icon.tram::before {\n  content: \"\\f7da\";\n}\ni.icon.transgender::before {\n  content: \"\\f224\";\n}\ni.icon.transgender.alternate::before {\n  content: \"\\f225\";\n}\ni.icon.trash::before {\n  content: \"\\f1f8\";\n}\ni.icon.trash.alternate::before {\n  content: \"\\f2ed\";\n}\ni.icon.trash.restore::before {\n  content: \"\\f829\";\n}\ni.icon.trash.restore.alternate::before {\n  content: \"\\f82a\";\n}\ni.icon.tree::before {\n  content: \"\\f1bb\";\n}\ni.icon.trophy::before {\n  content: \"\\f091\";\n}\ni.icon.truck::before {\n  content: \"\\f0d1\";\n}\ni.icon.truck.monster::before {\n  content: \"\\f63b\";\n}\ni.icon.truck.moving::before {\n  content: \"\\f4df\";\n}\ni.icon.truck.packing::before {\n  content: \"\\f4de\";\n}\ni.icon.truck.pickup::before {\n  content: \"\\f63c\";\n}\ni.icon.tshirt::before {\n  content: \"\\f553\";\n}\ni.icon.tty::before {\n  content: \"\\f1e4\";\n}\ni.icon.tv::before {\n  content: \"\\f26c\";\n}\ni.icon.umbrella::before {\n  content: \"\\f0e9\";\n}\ni.icon.umbrella.beach::before {\n  content: \"\\f5ca\";\n}\ni.icon.underline::before {\n  content: \"\\f0cd\";\n}\ni.icon.undo::before {\n  content: \"\\f0e2\";\n}\ni.icon.undo.alternate::before {\n  content: \"\\f2ea\";\n}\ni.icon.universal.access::before {\n  content: \"\\f29a\";\n}\ni.icon.university::before {\n  content: \"\\f19c\";\n}\ni.icon.unlink::before {\n  content: \"\\f127\";\n}\ni.icon.unlock::before {\n  content: \"\\f09c\";\n}\ni.icon.unlock.alternate::before {\n  content: \"\\f13e\";\n}\ni.icon.upload::before {\n  content: \"\\f093\";\n}\ni.icon.user::before {\n  content: \"\\f007\";\n}\ni.icon.user.alternate::before {\n  content: \"\\f406\";\n}\ni.icon.user.alternate.slash::before {\n  content: \"\\f4fa\";\n}\ni.icon.user.astronaut::before {\n  content: \"\\f4fb\";\n}\ni.icon.user.check::before {\n  content: \"\\f4fc\";\n}\ni.icon.user.circle::before {\n  content: \"\\f2bd\";\n}\ni.icon.user.clock::before {\n  content: \"\\f4fd\";\n}\ni.icon.user.cog::before {\n  content: \"\\f4fe\";\n}\ni.icon.user.edit::before {\n  content: \"\\f4ff\";\n}\ni.icon.user.friends::before {\n  content: \"\\f500\";\n}\ni.icon.user.graduate::before {\n  content: \"\\f501\";\n}\ni.icon.user.injured::before {\n  content: \"\\f728\";\n}\ni.icon.user.lock::before {\n  content: \"\\f502\";\n}\ni.icon.user.md::before {\n  content: \"\\f0f0\";\n}\ni.icon.user.minus::before {\n  content: \"\\f503\";\n}\ni.icon.user.ninja::before {\n  content: \"\\f504\";\n}\ni.icon.user.nurse::before {\n  content: \"\\f82f\";\n}\ni.icon.user.plus::before {\n  content: \"\\f234\";\n}\ni.icon.user.secret::before {\n  content: \"\\f21b\";\n}\ni.icon.user.shield::before {\n  content: \"\\f505\";\n}\ni.icon.user.slash::before {\n  content: \"\\f506\";\n}\ni.icon.user.tag::before {\n  content: \"\\f507\";\n}\ni.icon.user.tie::before {\n  content: \"\\f508\";\n}\ni.icon.user.times::before {\n  content: \"\\f235\";\n}\ni.icon.users::before {\n  content: \"\\f0c0\";\n}\ni.icon.users.cog::before {\n  content: \"\\f509\";\n}\ni.icon.users.slash::before {\n  content: \"\\e073\";\n}\ni.icon.utensil.spoon::before {\n  content: \"\\f2e5\";\n}\ni.icon.utensils::before {\n  content: \"\\f2e7\";\n}\ni.icon.vector.square::before {\n  content: \"\\f5cb\";\n}\ni.icon.venus::before {\n  content: \"\\f221\";\n}\ni.icon.venus.double::before {\n  content: \"\\f226\";\n}\ni.icon.venus.mars::before {\n  content: \"\\f228\";\n}\ni.icon.vest::before {\n  content: \"\\e085\";\n}\ni.icon.vest.patches::before {\n  content: \"\\e086\";\n}\ni.icon.vial::before {\n  content: \"\\f492\";\n}\ni.icon.vials::before {\n  content: \"\\f493\";\n}\ni.icon.video::before {\n  content: \"\\f03d\";\n}\ni.icon.video.slash::before {\n  content: \"\\f4e2\";\n}\ni.icon.vihara::before {\n  content: \"\\f6a7\";\n}\ni.icon.virus::before {\n  content: \"\\e074\";\n}\ni.icon.virus.slash::before {\n  content: \"\\e075\";\n}\ni.icon.viruses::before {\n  content: \"\\e076\";\n}\ni.icon.voicemail::before {\n  content: \"\\f897\";\n}\ni.icon.volleyball.ball::before {\n  content: \"\\f45f\";\n}\ni.icon.volume.down::before {\n  content: \"\\f027\";\n}\ni.icon.volume.mute::before {\n  content: \"\\f6a9\";\n}\ni.icon.volume.off::before {\n  content: \"\\f026\";\n}\ni.icon.volume.up::before {\n  content: \"\\f028\";\n}\ni.icon.vote.yea::before {\n  content: \"\\f772\";\n}\ni.icon.vr.cardboard::before {\n  content: \"\\f729\";\n}\ni.icon.walking::before {\n  content: \"\\f554\";\n}\ni.icon.wallet::before {\n  content: \"\\f555\";\n}\ni.icon.warehouse::before {\n  content: \"\\f494\";\n}\ni.icon.water::before {\n  content: \"\\f773\";\n}\ni.icon.wave.square::before {\n  content: \"\\f83e\";\n}\ni.icon.weight::before {\n  content: \"\\f496\";\n}\ni.icon.weight.hanging::before {\n  content: \"\\f5cd\";\n}\ni.icon.wheelchair::before {\n  content: \"\\f193\";\n}\ni.icon.wifi::before {\n  content: \"\\f1eb\";\n}\ni.icon.wind::before {\n  content: \"\\f72e\";\n}\ni.icon.window.close::before {\n  content: \"\\f410\";\n}\ni.icon.window.maximize::before {\n  content: \"\\f2d0\";\n}\ni.icon.window.minimize::before {\n  content: \"\\f2d1\";\n}\ni.icon.window.restore::before {\n  content: \"\\f2d2\";\n}\ni.icon.wine.bottle::before {\n  content: \"\\f72f\";\n}\ni.icon.wine.glass::before {\n  content: \"\\f4e3\";\n}\ni.icon.wine.glass.alternate::before {\n  content: \"\\f5ce\";\n}\ni.icon.won.sign::before {\n  content: \"\\f159\";\n}\ni.icon.wrench::before {\n  content: \"\\f0ad\";\n}\ni.icon.x.ray::before {\n  content: \"\\f497\";\n}\ni.icon.yen.sign::before {\n  content: \"\\f157\";\n}\ni.icon.yin.yang::before {\n  content: \"\\f6ad\";\n}\n\n/* Aliases */\ni.icon.add::before {\n  content: \"\\f067\";\n}\ni.icon.add.circle::before {\n  content: \"\\f055\";\n}\ni.icon.add.square::before {\n  content: \"\\f0fe\";\n}\ni.icon.add.to.calendar::before {\n  content: \"\\f271\";\n}\ni.icon.add.to.cart::before {\n  content: \"\\f217\";\n}\ni.icon.add.user::before {\n  content: \"\\f234\";\n}\ni.icon.alarm::before {\n  content: \"\\f0f3\";\n}\ni.icon.alarm.mute::before {\n  content: \"\\f1f6\";\n}\ni.icon.ald::before {\n  content: \"\\f2a2\";\n}\ni.icon.als::before {\n  content: \"\\f2a2\";\n}\ni.icon.announcement::before {\n  content: \"\\f0a1\";\n}\ni.icon.area.chart::before {\n  content: \"\\f1fe\";\n}\ni.icon.area.graph::before {\n  content: \"\\f1fe\";\n}\ni.icon.arrow.down.cart::before {\n  content: \"\\f218\";\n}\ni.icon.asexual::before {\n  content: \"\\f22d\";\n}\ni.icon.asl::before {\n  content: \"\\f2a3\";\n}\ni.icon.asl.interpreting::before {\n  content: \"\\f2a3\";\n}\ni.icon.assistive.listening.devices::before {\n  content: \"\\f2a2\";\n}\ni.icon.attach::before {\n  content: \"\\f0c6\";\n}\ni.icon.attention::before {\n  content: \"\\f06a\";\n}\ni.icon.balance::before {\n  content: \"\\f24e\";\n}\ni.icon.bar::before {\n  content: \"\\f0fc\";\n}\ni.icon.bathtub::before {\n  content: \"\\f2cd\";\n}\ni.icon.battery.four::before {\n  content: \"\\f240\";\n}\ni.icon.battery.high::before {\n  content: \"\\f241\";\n}\ni.icon.battery.low::before {\n  content: \"\\f243\";\n}\ni.icon.battery.medium::before {\n  content: \"\\f242\";\n}\ni.icon.battery.one::before {\n  content: \"\\f243\";\n}\ni.icon.battery.three::before {\n  content: \"\\f241\";\n}\ni.icon.battery.two::before {\n  content: \"\\f242\";\n}\ni.icon.battery.zero::before {\n  content: \"\\f244\";\n}\ni.icon.birthday::before {\n  content: \"\\f1fd\";\n}\ni.icon.block.layout::before {\n  content: \"\\f009\";\n}\ni.icon.broken.chain::before {\n  content: \"\\f127\";\n}\ni.icon.browser::before {\n  content: \"\\f022\";\n}\ni.icon.call::before {\n  content: \"\\f095\";\n}\ni.icon.call.square::before {\n  content: \"\\f098\";\n}\ni.icon.cancel::before {\n  content: \"\\f00d\";\n}\ni.icon.cart::before {\n  content: \"\\f07a\";\n}\ni.icon.cc::before {\n  content: \"\\f20a\";\n}\ni.icon.chain::before {\n  content: \"\\f0c1\";\n}\ni.icon.chat::before {\n  content: \"\\f075\";\n}\ni.icon.checked.calendar::before {\n  content: \"\\f274\";\n}\ni.icon.checkmark::before {\n  content: \"\\f00c\";\n}\ni.icon.checkmark.box::before {\n  content: \"\\f14a\";\n}\ni.icon.chess.rock::before {\n  content: \"\\f447\";\n}\ni.icon.circle.notched::before {\n  content: \"\\f1ce\";\n}\ni.icon.circle.thin::before {\n  content: \"\\f111\";\n}\ni.icon.close::before {\n  content: \"\\f00d\";\n}\ni.icon.cloud.download::before {\n  content: \"\\f381\";\n}\ni.icon.cloud.upload::before {\n  content: \"\\f382\";\n}\ni.icon.cny::before {\n  content: \"\\f157\";\n}\ni.icon.cocktail::before {\n  content: \"\\f000\";\n}\ni.icon.commenting::before {\n  content: \"\\f27a\";\n}\ni.icon.compose::before {\n  content: \"\\f303\";\n}\ni.icon.computer::before {\n  content: \"\\f108\";\n}\ni.icon.configure::before {\n  content: \"\\f0ad\";\n}\ni.icon.content::before {\n  content: \"\\f0c9\";\n}\ni.icon.conversation::before {\n  content: \"\\f086\";\n}\ni.icon.credit.card.alternative::before {\n  content: \"\\f09d\";\n}\ni.icon.currency::before {\n  content: \"\\f3d1\";\n}\ni.icon.dashboard::before {\n  content: \"\\f3fd\";\n}\ni.icon.deafness::before {\n  content: \"\\f2a4\";\n}\ni.icon.delete::before {\n  content: \"\\f00d\";\n}\ni.icon.delete.calendar::before {\n  content: \"\\f273\";\n}\ni.icon.detective::before {\n  content: \"\\f21b\";\n}\ni.icon.diamond::before {\n  content: \"\\f3a5\";\n}\ni.icon.discussions::before {\n  content: \"\\f086\";\n}\ni.icon.disk::before {\n  content: \"\\f0a0\";\n}\ni.icon.doctor::before {\n  content: \"\\f0f0\";\n}\ni.icon.dollar::before {\n  content: \"\\f155\";\n}\ni.icon.dont::before {\n  content: \"\\f05e\";\n}\ni.icon.drivers.license::before {\n  content: \"\\f2c2\";\n}\ni.icon.dropdown::before {\n  content: \"\\f0d7\";\n}\ni.icon.emergency::before {\n  content: \"\\f0f9\";\n}\ni.icon.erase::before {\n  content: \"\\f12d\";\n}\ni.icon.eur::before {\n  content: \"\\f153\";\n}\ni.icon.euro::before {\n  content: \"\\f153\";\n}\ni.icon.exchange::before {\n  content: \"\\f362\";\n}\ni.icon.external::before {\n  content: \"\\f35d\";\n}\ni.icon.external.share::before {\n  content: \"\\f14d\";\n}\ni.icon.external.square::before {\n  content: \"\\f360\";\n}\ni.icon.eyedropper::before {\n  content: \"\\f1fb\";\n}\ni.icon.factory::before {\n  content: \"\\f275\";\n}\ni.icon.favorite::before {\n  content: \"\\f005\";\n}\ni.icon.feed::before {\n  content: \"\\f09e\";\n}\ni.icon.female.homosexual::before {\n  content: \"\\f226\";\n}\ni.icon.file.text::before {\n  content: \"\\f15c\";\n}\ni.icon.find::before {\n  content: \"\\f1e5\";\n}\ni.icon.first.aid::before {\n  content: \"\\f0fa\";\n}\ni.icon.food::before {\n  content: \"\\f2e7\";\n}\ni.icon.fork::before {\n  content: \"\\f126\";\n}\ni.icon.game::before {\n  content: \"\\f11b\";\n}\ni.icon.gay::before {\n  content: \"\\f227\";\n}\ni.icon.gbp::before {\n  content: \"\\f154\";\n}\ni.icon.grab::before {\n  content: \"\\f255\";\n}\ni.icon.graduation::before {\n  content: \"\\f19d\";\n}\ni.icon.grid.layout::before {\n  content: \"\\f00a\";\n}\ni.icon.group::before {\n  content: \"\\f0c0\";\n}\ni.icon.h::before {\n  content: \"\\f0fd\";\n}\ni.icon.hamburger::before {\n  content: \"\\f0c9\";\n}\ni.icon.hand.victory::before {\n  content: \"\\f25b\";\n}\ni.icon.handicap::before {\n  content: \"\\f193\";\n}\ni.icon.hard.of.hearing::before {\n  content: \"\\f2a4\";\n}\ni.icon.header::before {\n  content: \"\\f1dc\";\n}\ni.icon.heart.empty::before {\n  content: \"\\f004\";\n}\ni.icon.help::before {\n  content: \"\\f128\";\n}\ni.icon.help.circle::before {\n  content: \"\\f059\";\n}\ni.icon.heterosexual::before {\n  content: \"\\f228\";\n}\ni.icon.hide::before {\n  content: \"\\f070\";\n}\ni.icon.hotel::before {\n  content: \"\\f236\";\n}\ni.icon.hourglass.four::before {\n  content: \"\\f254\";\n}\ni.icon.hourglass.full::before {\n  content: \"\\f254\";\n}\ni.icon.hourglass.one::before {\n  content: \"\\f251\";\n}\ni.icon.hourglass.three::before {\n  content: \"\\f253\";\n}\ni.icon.hourglass.two::before {\n  content: \"\\f252\";\n}\ni.icon.hourglass.zero::before {\n  content: \"\\f253\";\n}\ni.icon.idea::before {\n  content: \"\\f0eb\";\n}\ni.icon.ils::before {\n  content: \"\\f20b\";\n}\ni.icon.inr::before {\n  content: \"\\f156\";\n}\ni.icon.intergender::before {\n  content: \"\\f224\";\n}\ni.icon.intersex::before {\n  content: \"\\f224\";\n}\ni.icon.jpy::before {\n  content: \"\\f157\";\n}\ni.icon.krw::before {\n  content: \"\\f159\";\n}\ni.icon.lab::before {\n  content: \"\\f0c3\";\n}\ni.icon.law::before {\n  content: \"\\f24e\";\n}\ni.icon.legal::before {\n  content: \"\\f0e3\";\n}\ni.icon.lesbian::before {\n  content: \"\\f226\";\n}\ni.icon.level.down::before {\n  content: \"\\f3be\";\n}\ni.icon.level.up::before {\n  content: \"\\f3bf\";\n}\ni.icon.lightning::before {\n  content: \"\\f0e7\";\n}\ni.icon.like::before {\n  content: \"\\f004\";\n}\ni.icon.linegraph::before {\n  content: \"\\f201\";\n}\ni.icon.linkify::before {\n  content: \"\\f0c1\";\n}\ni.icon.lira::before {\n  content: \"\\f195\";\n}\ni.icon.list.layout::before {\n  content: \"\\f00b\";\n}\ni.icon.magnify::before {\n  content: \"\\f00e\";\n}\ni.icon.mail::before {\n  content: \"\\f0e0\";\n}\ni.icon.mail.forward::before {\n  content: \"\\f064\";\n}\ni.icon.mail.square::before {\n  content: \"\\f199\";\n}\ni.icon.male.homosexual::before {\n  content: \"\\f227\";\n}\ni.icon.man::before {\n  content: \"\\f222\";\n}\ni.icon.marker::before {\n  content: \"\\f041\";\n}\ni.icon.mars.alternate::before {\n  content: \"\\f229\";\n}\ni.icon.mars.horizontal::before {\n  content: \"\\f22b\";\n}\ni.icon.mars.vertical::before {\n  content: \"\\f22a\";\n}\ni.icon.meanpath::before {\n  content: \"\\f0c8\";\n}\ni.icon.military::before {\n  content: \"\\f0fb\";\n}\ni.icon.money::before {\n  content: \"\\f3d1\";\n}\ni.icon.move::before {\n  content: \"\\f0b2\";\n}\ni.icon.mute::before {\n  content: \"\\f131\";\n}\ni.icon.non.binary.transgender::before {\n  content: \"\\f223\";\n}\ni.icon.numbered.list::before {\n  content: \"\\f0cb\";\n}\ni.icon.options::before {\n  content: \"\\f1de\";\n}\ni.icon.ordered.list::before {\n  content: \"\\f0cb\";\n}\ni.icon.other.gender::before {\n  content: \"\\f229\";\n}\ni.icon.other.gender.horizontal::before {\n  content: \"\\f22b\";\n}\ni.icon.other.gender.vertical::before {\n  content: \"\\f22a\";\n}\ni.icon.payment::before {\n  content: \"\\f09d\";\n}\ni.icon.pencil::before {\n  content: \"\\f303\";\n}\ni.icon.pencil.square::before {\n  content: \"\\f14b\";\n}\ni.icon.photo::before {\n  content: \"\\f030\";\n}\ni.icon.picture::before {\n  content: \"\\f03e\";\n}\ni.icon.pie.chart::before {\n  content: \"\\f200\";\n}\ni.icon.pie.graph::before {\n  content: \"\\f200\";\n}\ni.icon.pin::before {\n  content: \"\\f08d\";\n}\ni.icon.plus.cart::before {\n  content: \"\\f217\";\n}\ni.icon.point::before {\n  content: \"\\f041\";\n}\ni.icon.pointing.down::before {\n  content: \"\\f0a7\";\n}\ni.icon.pointing.left::before {\n  content: \"\\f0a5\";\n}\ni.icon.pointing.right::before {\n  content: \"\\f0a4\";\n}\ni.icon.pointing.up::before {\n  content: \"\\f0a6\";\n}\ni.icon.pound::before {\n  content: \"\\f154\";\n}\ni.icon.power::before {\n  content: \"\\f011\";\n}\ni.icon.power.cord::before {\n  content: \"\\f1e6\";\n}\ni.icon.privacy::before {\n  content: \"\\f084\";\n}\ni.icon.protect::before {\n  content: \"\\f023\";\n}\ni.icon.puzzle::before {\n  content: \"\\f12e\";\n}\ni.icon.r.circle::before {\n  content: \"\\f25d\";\n}\ni.icon.radio::before {\n  content: \"\\f192\";\n}\ni.icon.rain::before {\n  content: \"\\f0e9\";\n}\ni.icon.record::before {\n  content: \"\\f03d\";\n}\ni.icon.refresh::before {\n  content: \"\\f021\";\n}\ni.icon.remove::before {\n  content: \"\\f00d\";\n}\ni.icon.remove.bookmark::before {\n  content: \"\\f02e\";\n}\ni.icon.remove.circle::before {\n  content: \"\\f057\";\n}\ni.icon.remove.from.calendar::before {\n  content: \"\\f272\";\n}\ni.icon.remove.user::before {\n  content: \"\\f235\";\n}\ni.icon.repeat::before {\n  content: \"\\f01e\";\n}\ni.icon.resize.horizontal::before {\n  content: \"\\f337\";\n}\ni.icon.resize.vertical::before {\n  content: \"\\f338\";\n}\ni.icon.rmb::before {\n  content: \"\\f157\";\n}\ni.icon.rouble::before {\n  content: \"\\f158\";\n}\ni.icon.rub::before {\n  content: \"\\f158\";\n}\ni.icon.ruble::before {\n  content: \"\\f158\";\n}\ni.icon.rupee::before {\n  content: \"\\f156\";\n}\ni.icon.s15::before {\n  content: \"\\f2cd\";\n}\ni.icon.selected.radio::before {\n  content: \"\\f192\";\n}\ni.icon.send::before {\n  content: \"\\f1d8\";\n}\ni.icon.setting::before {\n  content: \"\\f013\";\n}\ni.icon.settings::before {\n  content: \"\\f085\";\n}\ni.icon.shekel::before {\n  content: \"\\f20b\";\n}\ni.icon.sheqel::before {\n  content: \"\\f20b\";\n}\ni.icon.shield::before {\n  content: \"\\f3ed\";\n}\ni.icon.shipping::before {\n  content: \"\\f0d1\";\n}\ni.icon.shop::before {\n  content: \"\\f07a\";\n}\ni.icon.shuffle::before {\n  content: \"\\f074\";\n}\ni.icon.shutdown::before {\n  content: \"\\f011\";\n}\ni.icon.sidebar::before {\n  content: \"\\f0c9\";\n}\ni.icon.signing::before {\n  content: \"\\f2a7\";\n}\ni.icon.signup::before {\n  content: \"\\f044\";\n}\ni.icon.sliders::before {\n  content: \"\\f1de\";\n}\ni.icon.soccer::before {\n  content: \"\\f1e3\";\n}\ni.icon.sort.alphabet.ascending::before {\n  content: \"\\f15d\";\n}\ni.icon.sort.alphabet.descending::before {\n  content: \"\\f15e\";\n}\ni.icon.sort.ascending::before {\n  content: \"\\f0de\";\n}\ni.icon.sort.content.ascending::before {\n  content: \"\\f160\";\n}\ni.icon.sort.content.descending::before {\n  content: \"\\f161\";\n}\ni.icon.sort.descending::before {\n  content: \"\\f0dd\";\n}\ni.icon.sort.numeric.ascending::before {\n  content: \"\\f162\";\n}\ni.icon.sort.numeric.descending::before {\n  content: \"\\f163\";\n}\ni.icon.sound::before {\n  content: \"\\f025\";\n}\ni.icon.spoon::before {\n  content: \"\\f2e5\";\n}\ni.icon.spy::before {\n  content: \"\\f21b\";\n}\ni.icon.star.empty::before {\n  content: \"\\f005\";\n}\ni.icon.star.half.empty::before {\n  content: \"\\f089\";\n}\ni.icon.star.half.full::before {\n  content: \"\\f089\";\n}\ni.icon.student::before {\n  content: \"\\f19d\";\n}\ni.icon.talk::before {\n  content: \"\\f27a\";\n}\ni.icon.target::before {\n  content: \"\\f140\";\n}\ni.icon.teletype::before {\n  content: \"\\f1e4\";\n}\ni.icon.television::before {\n  content: \"\\f26c\";\n}\ni.icon.text.cursor::before {\n  content: \"\\f246\";\n}\ni.icon.text.telephone::before {\n  content: \"\\f1e4\";\n}\ni.icon.theme::before {\n  content: \"\\f043\";\n}\ni.icon.thermometer::before {\n  content: \"\\f2c7\";\n}\ni.icon.thumb.tack::before {\n  content: \"\\f08d\";\n}\ni.icon.ticket::before {\n  content: \"\\f3ff\";\n}\ni.icon.time::before {\n  content: \"\\f017\";\n}\ni.icon.times.rectangle::before {\n  content: \"\\f410\";\n}\ni.icon.tm::before {\n  content: \"\\f25c\";\n}\ni.icon.toggle.down::before {\n  content: \"\\f150\";\n}\ni.icon.toggle.left::before {\n  content: \"\\f191\";\n}\ni.icon.toggle.right::before {\n  content: \"\\f152\";\n}\ni.icon.toggle.up::before {\n  content: \"\\f151\";\n}\ni.icon.translate::before {\n  content: \"\\f1ab\";\n}\ni.icon.travel::before {\n  content: \"\\f0b1\";\n}\ni.icon.treatment::before {\n  content: \"\\f0f1\";\n}\ni.icon.triangle.down::before {\n  content: \"\\f0d7\";\n}\ni.icon.triangle.left::before {\n  content: \"\\f0d9\";\n}\ni.icon.triangle.right::before {\n  content: \"\\f0da\";\n}\ni.icon.triangle.up::before {\n  content: \"\\f0d8\";\n}\ni.icon.try::before {\n  content: \"\\f195\";\n}\ni.icon.unhide::before {\n  content: \"\\f06e\";\n}\ni.icon.unlinkify::before {\n  content: \"\\f127\";\n}\ni.icon.unmute::before {\n  content: \"\\f130\";\n}\ni.icon.unordered.list::before {\n  content: \"\\f0ca\";\n}\ni.icon.usd::before {\n  content: \"\\f155\";\n}\ni.icon.user.cancel::before {\n  content: \"\\f235\";\n}\ni.icon.user.close::before {\n  content: \"\\f235\";\n}\ni.icon.user.delete::before {\n  content: \"\\f235\";\n}\ni.icon.user.doctor::before {\n  content: \"\\f0f0\";\n}\ni.icon.user.x::before {\n  content: \"\\f235\";\n}\ni.icon.vcard::before {\n  content: \"\\f2bb\";\n}\ni.icon.video.camera::before {\n  content: \"\\f03d\";\n}\ni.icon.video.play::before {\n  content: \"\\f144\";\n}\ni.icon.volume.control.phone::before {\n  content: \"\\f2a0\";\n}\ni.icon.wait::before {\n  content: \"\\f017\";\n}\ni.icon.warning::before {\n  content: \"\\f12a\";\n}\ni.icon.warning.circle::before {\n  content: \"\\f06a\";\n}\ni.icon.warning.sign::before {\n  content: \"\\f071\";\n}\ni.icon.wi.fi::before {\n  content: \"\\f1eb\";\n}\ni.icon.winner::before {\n  content: \"\\f091\";\n}\ni.icon.wizard::before {\n  content: \"\\f0d0\";\n}\ni.icon.woman::before {\n  content: \"\\f221\";\n}\ni.icon.won::before {\n  content: \"\\f159\";\n}\ni.icon.world::before {\n  content: \"\\f0ac\";\n}\ni.icon.write::before {\n  content: \"\\f303\";\n}\ni.icon.write.square::before {\n  content: \"\\f14b\";\n}\ni.icon.x::before {\n  content: \"\\f00d\";\n}\ni.icon.yen::before {\n  content: \"\\f157\";\n}\ni.icon.zip::before {\n  content: \"\\f187\";\n}\ni.icon.zoom::before {\n  content: \"\\f00e\";\n}\n\n\n/*******************************\n             Outline Icons\n    *******************************/\n\ni.icon.outline {\n  font-family: \"outline-icons\";\n}\n\n/* Icons */\ni.icon.address.book.outline::before {\n  content: \"\\f2b9\";\n}\ni.icon.address.card.outline::before {\n  content: \"\\f2bb\";\n}\ni.icon.angry.outline::before {\n  content: \"\\f556\";\n}\ni.icon.arrow.alternate.circle.down.outline::before {\n  content: \"\\f358\";\n}\ni.icon.arrow.alternate.circle.left.outline::before {\n  content: \"\\f359\";\n}\ni.icon.arrow.alternate.circle.right.outline::before {\n  content: \"\\f35a\";\n}\ni.icon.arrow.alternate.circle.up.outline::before {\n  content: \"\\f35b\";\n}\ni.icon.bell.outline::before {\n  content: \"\\f0f3\";\n}\ni.icon.bell.slash.outline::before {\n  content: \"\\f1f6\";\n}\ni.icon.bookmark.outline::before {\n  content: \"\\f02e\";\n}\ni.icon.building.outline::before {\n  content: \"\\f1ad\";\n}\ni.icon.calendar.alternate.outline::before {\n  content: \"\\f073\";\n}\ni.icon.calendar.check.outline::before {\n  content: \"\\f274\";\n}\ni.icon.calendar.minus.outline::before {\n  content: \"\\f272\";\n}\ni.icon.calendar.outline::before {\n  content: \"\\f133\";\n}\ni.icon.calendar.plus.outline::before {\n  content: \"\\f271\";\n}\ni.icon.calendar.times.outline::before {\n  content: \"\\f273\";\n}\ni.icon.caret.square.down.outline::before {\n  content: \"\\f150\";\n}\ni.icon.caret.square.left.outline::before {\n  content: \"\\f191\";\n}\ni.icon.caret.square.right.outline::before {\n  content: \"\\f152\";\n}\ni.icon.caret.square.up.outline::before {\n  content: \"\\f151\";\n}\ni.icon.chart.bar.outline::before {\n  content: \"\\f080\";\n}\ni.icon.check.circle.outline::before {\n  content: \"\\f058\";\n}\ni.icon.check.square.outline::before {\n  content: \"\\f14a\";\n}\ni.icon.circle.outline::before {\n  content: \"\\f111\";\n}\ni.icon.clipboard.outline::before {\n  content: \"\\f328\";\n}\ni.icon.clock.outline::before {\n  content: \"\\f017\";\n}\ni.icon.clone.outline::before {\n  content: \"\\f24d\";\n}\ni.icon.closed.captioning.outline::before {\n  content: \"\\f20a\";\n}\ni.icon.comment.alternate.outline::before {\n  content: \"\\f27a\";\n}\ni.icon.comment.dots.outline::before {\n  content: \"\\f4ad\";\n}\ni.icon.comment.outline::before {\n  content: \"\\f075\";\n}\ni.icon.comments.outline::before {\n  content: \"\\f086\";\n}\ni.icon.compass.outline::before {\n  content: \"\\f14e\";\n}\ni.icon.copy.outline::before {\n  content: \"\\f0c5\";\n}\ni.icon.copyright.outline::before {\n  content: \"\\f1f9\";\n}\ni.icon.credit.card.outline::before {\n  content: \"\\f09d\";\n}\ni.icon.dizzy.outline::before {\n  content: \"\\f567\";\n}\ni.icon.dot.circle.outline::before {\n  content: \"\\f192\";\n}\ni.icon.edit.outline::before {\n  content: \"\\f044\";\n}\ni.icon.envelope.open.outline::before {\n  content: \"\\f2b6\";\n}\ni.icon.envelope.outline::before {\n  content: \"\\f0e0\";\n}\ni.icon.eye.outline::before {\n  content: \"\\f06e\";\n}\ni.icon.eye.slash.outline::before {\n  content: \"\\f070\";\n}\ni.icon.file.alternate.outline::before {\n  content: \"\\f15c\";\n}\ni.icon.file.archive.outline::before {\n  content: \"\\f1c6\";\n}\ni.icon.file.audio.outline::before {\n  content: \"\\f1c7\";\n}\ni.icon.file.code.outline::before {\n  content: \"\\f1c9\";\n}\ni.icon.file.excel.outline::before {\n  content: \"\\f1c3\";\n}\ni.icon.file.image.outline::before {\n  content: \"\\f1c5\";\n}\ni.icon.file.outline::before {\n  content: \"\\f15b\";\n}\ni.icon.file.pdf.outline::before {\n  content: \"\\f1c1\";\n}\ni.icon.file.powerpoint.outline::before {\n  content: \"\\f1c4\";\n}\ni.icon.file.video.outline::before {\n  content: \"\\f1c8\";\n}\ni.icon.file.word.outline::before {\n  content: \"\\f1c2\";\n}\ni.icon.flag.outline::before {\n  content: \"\\f024\";\n}\ni.icon.flushed.outline::before {\n  content: \"\\f579\";\n}\ni.icon.folder.open.outline::before {\n  content: \"\\f07c\";\n}\ni.icon.folder.outline::before {\n  content: \"\\f07b\";\n}\ni.icon.frown.open.outline::before {\n  content: \"\\f57a\";\n}\ni.icon.frown.outline::before {\n  content: \"\\f119\";\n}\ni.icon.futbol.outline::before {\n  content: \"\\f1e3\";\n}\ni.icon.gem.outline::before {\n  content: \"\\f3a5\";\n}\ni.icon.grimace.outline::before {\n  content: \"\\f57f\";\n}\ni.icon.grin.alternate.outline::before {\n  content: \"\\f581\";\n}\ni.icon.grin.beam.outline::before {\n  content: \"\\f582\";\n}\ni.icon.grin.beam.sweat.outline::before {\n  content: \"\\f583\";\n}\ni.icon.grin.hearts.outline::before {\n  content: \"\\f584\";\n}\ni.icon.grin.outline::before {\n  content: \"\\f580\";\n}\ni.icon.grin.squint.outline::before {\n  content: \"\\f585\";\n}\ni.icon.grin.squint.tears.outline::before {\n  content: \"\\f586\";\n}\ni.icon.grin.stars.outline::before {\n  content: \"\\f587\";\n}\ni.icon.grin.tears.outline::before {\n  content: \"\\f588\";\n}\ni.icon.grin.tongue.outline::before {\n  content: \"\\f589\";\n}\ni.icon.grin.tongue.squint.outline::before {\n  content: \"\\f58a\";\n}\ni.icon.grin.tongue.wink.outline::before {\n  content: \"\\f58b\";\n}\ni.icon.grin.wink.outline::before {\n  content: \"\\f58c\";\n}\ni.icon.hand.lizard.outline::before {\n  content: \"\\f258\";\n}\ni.icon.hand.paper.outline::before {\n  content: \"\\f256\";\n}\ni.icon.hand.peace.outline::before {\n  content: \"\\f25b\";\n}\ni.icon.hand.point.down.outline::before {\n  content: \"\\f0a7\";\n}\ni.icon.hand.point.left.outline::before {\n  content: \"\\f0a5\";\n}\ni.icon.hand.point.right.outline::before {\n  content: \"\\f0a4\";\n}\ni.icon.hand.point.up.outline::before {\n  content: \"\\f0a6\";\n}\ni.icon.hand.pointer.outline::before {\n  content: \"\\f25a\";\n}\ni.icon.hand.rock.outline::before {\n  content: \"\\f255\";\n}\ni.icon.hand.scissors.outline::before {\n  content: \"\\f257\";\n}\ni.icon.hand.spock.outline::before {\n  content: \"\\f259\";\n}\ni.icon.handshake.outline::before {\n  content: \"\\f2b5\";\n}\ni.icon.hdd.outline::before {\n  content: \"\\f0a0\";\n}\ni.icon.heart.outline::before {\n  content: \"\\f004\";\n}\ni.icon.hospital.outline::before {\n  content: \"\\f0f8\";\n}\ni.icon.hourglass.outline::before {\n  content: \"\\f254\";\n}\ni.icon.id.badge.outline::before {\n  content: \"\\f2c1\";\n}\ni.icon.id.card.outline::before {\n  content: \"\\f2c2\";\n}\ni.icon.image.outline::before {\n  content: \"\\f03e\";\n}\ni.icon.images.outline::before {\n  content: \"\\f302\";\n}\ni.icon.keyboard.outline::before {\n  content: \"\\f11c\";\n}\ni.icon.kiss.beam.outline::before {\n  content: \"\\f597\";\n}\ni.icon.kiss.outline::before {\n  content: \"\\f596\";\n}\ni.icon.kiss.wink.heart.outline::before {\n  content: \"\\f598\";\n}\ni.icon.laugh.beam.outline::before {\n  content: \"\\f59a\";\n}\ni.icon.laugh.outline::before {\n  content: \"\\f599\";\n}\ni.icon.laugh.squint.outline::before {\n  content: \"\\f59b\";\n}\ni.icon.laugh.wink.outline::before {\n  content: \"\\f59c\";\n}\ni.icon.lemon.outline::before {\n  content: \"\\f094\";\n}\ni.icon.life.ring.outline::before {\n  content: \"\\f1cd\";\n}\ni.icon.lightbulb.outline::before {\n  content: \"\\f0eb\";\n}\ni.icon.list.alternate.outline::before {\n  content: \"\\f022\";\n}\ni.icon.map.outline::before {\n  content: \"\\f279\";\n}\ni.icon.meh.blank.outline::before {\n  content: \"\\f5a4\";\n}\ni.icon.meh.outline::before {\n  content: \"\\f11a\";\n}\ni.icon.meh.rolling.eyes.outline::before {\n  content: \"\\f5a5\";\n}\ni.icon.minus.square.outline::before {\n  content: \"\\f146\";\n}\ni.icon.money.bill.alternate.outline::before {\n  content: \"\\f3d1\";\n}\ni.icon.moon.outline::before {\n  content: \"\\f186\";\n}\ni.icon.newspaper.outline::before {\n  content: \"\\f1ea\";\n}\ni.icon.object.group.outline::before {\n  content: \"\\f247\";\n}\ni.icon.object.ungroup.outline::before {\n  content: \"\\f248\";\n}\ni.icon.paper.plane.outline::before {\n  content: \"\\f1d8\";\n}\ni.icon.pause.circle.outline::before {\n  content: \"\\f28b\";\n}\ni.icon.play.circle.outline::before {\n  content: \"\\f144\";\n}\ni.icon.plus.square.outline::before {\n  content: \"\\f0fe\";\n}\ni.icon.question.circle.outline::before {\n  content: \"\\f059\";\n}\ni.icon.registered.outline::before {\n  content: \"\\f25d\";\n}\ni.icon.sad.cry.outline::before {\n  content: \"\\f5b3\";\n}\ni.icon.sad.tear.outline::before {\n  content: \"\\f5b4\";\n}\ni.icon.save.outline::before {\n  content: \"\\f0c7\";\n}\ni.icon.share.square.outline::before {\n  content: \"\\f14d\";\n}\ni.icon.smile.beam.outline::before {\n  content: \"\\f5b8\";\n}\ni.icon.smile.outline::before {\n  content: \"\\f118\";\n}\ni.icon.smile.wink.outline::before {\n  content: \"\\f4da\";\n}\ni.icon.snowflake.outline::before {\n  content: \"\\f2dc\";\n}\ni.icon.square.outline::before {\n  content: \"\\f0c8\";\n}\ni.icon.star.half.outline::before {\n  content: \"\\f089\";\n}\ni.icon.star.outline::before {\n  content: \"\\f005\";\n}\ni.icon.sticky.note.outline::before {\n  content: \"\\f249\";\n}\ni.icon.stop.circle.outline::before {\n  content: \"\\f28d\";\n}\ni.icon.sun.outline::before {\n  content: \"\\f185\";\n}\ni.icon.surprise.outline::before {\n  content: \"\\f5c2\";\n}\ni.icon.thumbs.down.outline::before {\n  content: \"\\f165\";\n}\ni.icon.thumbs.up.outline::before {\n  content: \"\\f164\";\n}\ni.icon.times.circle.outline::before {\n  content: \"\\f057\";\n}\ni.icon.tired.outline::before {\n  content: \"\\f5c8\";\n}\ni.icon.trash.alternate.outline::before {\n  content: \"\\f2ed\";\n}\ni.icon.user.circle.outline::before {\n  content: \"\\f2bd\";\n}\ni.icon.user.outline::before {\n  content: \"\\f007\";\n}\ni.icon.window.close.outline::before {\n  content: \"\\f410\";\n}\ni.icon.window.maximize.outline::before {\n  content: \"\\f2d0\";\n}\ni.icon.window.minimize.outline::before {\n  content: \"\\f2d1\";\n}\ni.icon.window.restore.outline::before {\n  content: \"\\f2d2\";\n}\n\n/* Aliases */\n\n\n/*******************************\n              Brand Icons\n    *******************************/\n\n\n/* Icons */\ni.icon.\\35 00px::before {\n  content: \"\\f26e\";\n  font-family: \"brand-icons\";\n}\ni.icon.accessible::before {\n  content: \"\\f368\";\n  font-family: \"brand-icons\";\n}\ni.icon.accusoft::before {\n  content: \"\\f369\";\n  font-family: \"brand-icons\";\n}\ni.icon.acquisitions.incorporated::before {\n  content: \"\\f6af\";\n  font-family: \"brand-icons\";\n}\ni.icon.adn::before {\n  content: \"\\f170\";\n  font-family: \"brand-icons\";\n}\ni.icon.adversal::before {\n  content: \"\\f36a\";\n  font-family: \"brand-icons\";\n}\ni.icon.affiliatetheme::before {\n  content: \"\\f36b\";\n  font-family: \"brand-icons\";\n}\ni.icon.airbnb::before {\n  content: \"\\f834\";\n  font-family: \"brand-icons\";\n}\ni.icon.algolia::before {\n  content: \"\\f36c\";\n  font-family: \"brand-icons\";\n}\ni.icon.alipay::before {\n  content: \"\\f642\";\n  font-family: \"brand-icons\";\n}\ni.icon.amazon::before {\n  content: \"\\f270\";\n  font-family: \"brand-icons\";\n}\ni.icon.amazon.pay::before {\n  content: \"\\f42c\";\n  font-family: \"brand-icons\";\n}\ni.icon.amilia::before {\n  content: \"\\f36d\";\n  font-family: \"brand-icons\";\n}\ni.icon.android::before {\n  content: \"\\f17b\";\n  font-family: \"brand-icons\";\n}\ni.icon.angellist::before {\n  content: \"\\f209\";\n  font-family: \"brand-icons\";\n}\ni.icon.angrycreative::before {\n  content: \"\\f36e\";\n  font-family: \"brand-icons\";\n}\ni.icon.angular::before {\n  content: \"\\f420\";\n  font-family: \"brand-icons\";\n}\ni.icon.app.store::before {\n  content: \"\\f36f\";\n  font-family: \"brand-icons\";\n}\ni.icon.app.store.ios::before {\n  content: \"\\f370\";\n  font-family: \"brand-icons\";\n}\ni.icon.apper::before {\n  content: \"\\f371\";\n  font-family: \"brand-icons\";\n}\ni.icon.apple::before {\n  content: \"\\f179\";\n  font-family: \"brand-icons\";\n}\ni.icon.apple.pay::before {\n  content: \"\\f415\";\n  font-family: \"brand-icons\";\n}\ni.icon.artstation::before {\n  content: \"\\f77a\";\n  font-family: \"brand-icons\";\n}\ni.icon.asymmetrik::before {\n  content: \"\\f372\";\n  font-family: \"brand-icons\";\n}\ni.icon.atlassian::before {\n  content: \"\\f77b\";\n  font-family: \"brand-icons\";\n}\ni.icon.audible::before {\n  content: \"\\f373\";\n  font-family: \"brand-icons\";\n}\ni.icon.autoprefixer::before {\n  content: \"\\f41c\";\n  font-family: \"brand-icons\";\n}\ni.icon.avianex::before {\n  content: \"\\f374\";\n  font-family: \"brand-icons\";\n}\ni.icon.aviato::before {\n  content: \"\\f421\";\n  font-family: \"brand-icons\";\n}\ni.icon.aws::before {\n  content: \"\\f375\";\n  font-family: \"brand-icons\";\n}\ni.icon.bandcamp::before {\n  content: \"\\f2d5\";\n  font-family: \"brand-icons\";\n}\ni.icon.battle.net::before {\n  content: \"\\f835\";\n  font-family: \"brand-icons\";\n}\ni.icon.behance::before {\n  content: \"\\f1b4\";\n  font-family: \"brand-icons\";\n}\ni.icon.behance.square::before {\n  content: \"\\f1b5\";\n  font-family: \"brand-icons\";\n}\ni.icon.bimobject::before {\n  content: \"\\f378\";\n  font-family: \"brand-icons\";\n}\ni.icon.bitbucket::before {\n  content: \"\\f171\";\n  font-family: \"brand-icons\";\n}\ni.icon.bitcoin::before {\n  content: \"\\f379\";\n  font-family: \"brand-icons\";\n}\ni.icon.bity::before {\n  content: \"\\f37a\";\n  font-family: \"brand-icons\";\n}\ni.icon.black.tie::before {\n  content: \"\\f27e\";\n  font-family: \"brand-icons\";\n}\ni.icon.blackberry::before {\n  content: \"\\f37b\";\n  font-family: \"brand-icons\";\n}\ni.icon.blogger::before {\n  content: \"\\f37c\";\n  font-family: \"brand-icons\";\n}\ni.icon.blogger.b::before {\n  content: \"\\f37d\";\n  font-family: \"brand-icons\";\n}\ni.icon.bluetooth::before {\n  content: \"\\f293\";\n  font-family: \"brand-icons\";\n}\ni.icon.bluetooth.b::before {\n  content: \"\\f294\";\n  font-family: \"brand-icons\";\n}\ni.icon.bootstrap::before {\n  content: \"\\f836\";\n  font-family: \"brand-icons\";\n}\ni.icon.btc::before {\n  content: \"\\f15a\";\n  font-family: \"brand-icons\";\n}\ni.icon.buffer::before {\n  content: \"\\f837\";\n  font-family: \"brand-icons\";\n}\ni.icon.buromobelexperte::before {\n  content: \"\\f37f\";\n  font-family: \"brand-icons\";\n}\ni.icon.buy.n.large::before {\n  content: \"\\f8a6\";\n  font-family: \"brand-icons\";\n}\ni.icon.buysellads::before {\n  content: \"\\f20d\";\n  font-family: \"brand-icons\";\n}\ni.icon.canadian.maple.leaf::before {\n  content: \"\\f785\";\n  font-family: \"brand-icons\";\n}\ni.icon.cc.amazon.pay::before {\n  content: \"\\f42d\";\n  font-family: \"brand-icons\";\n}\ni.icon.cc.amex::before {\n  content: \"\\f1f3\";\n  font-family: \"brand-icons\";\n}\ni.icon.cc.apple.pay::before {\n  content: \"\\f416\";\n  font-family: \"brand-icons\";\n}\ni.icon.cc.diners.club::before {\n  content: \"\\f24c\";\n  font-family: \"brand-icons\";\n}\ni.icon.cc.discover::before {\n  content: \"\\f1f2\";\n  font-family: \"brand-icons\";\n}\ni.icon.cc.jcb::before {\n  content: \"\\f24b\";\n  font-family: \"brand-icons\";\n}\ni.icon.cc.mastercard::before {\n  content: \"\\f1f1\";\n  font-family: \"brand-icons\";\n}\ni.icon.cc.paypal::before {\n  content: \"\\f1f4\";\n  font-family: \"brand-icons\";\n}\ni.icon.cc.stripe::before {\n  content: \"\\f1f5\";\n  font-family: \"brand-icons\";\n}\ni.icon.cc.visa::before {\n  content: \"\\f1f0\";\n  font-family: \"brand-icons\";\n}\ni.icon.centercode::before {\n  content: \"\\f380\";\n  font-family: \"brand-icons\";\n}\ni.icon.centos::before {\n  content: \"\\f789\";\n  font-family: \"brand-icons\";\n}\ni.icon.chrome::before {\n  content: \"\\f268\";\n  font-family: \"brand-icons\";\n}\ni.icon.chromecast::before {\n  content: \"\\f838\";\n  font-family: \"brand-icons\";\n}\ni.icon.cloudflare::before {\n  content: \"\\e07d\";\n  font-family: \"brand-icons\";\n}\ni.icon.cloudscale::before {\n  content: \"\\f383\";\n  font-family: \"brand-icons\";\n}\ni.icon.cloudsmith::before {\n  content: \"\\f384\";\n  font-family: \"brand-icons\";\n}\ni.icon.cloudversify::before {\n  content: \"\\f385\";\n  font-family: \"brand-icons\";\n}\ni.icon.codepen::before {\n  content: \"\\f1cb\";\n  font-family: \"brand-icons\";\n}\ni.icon.codiepie::before {\n  content: \"\\f284\";\n  font-family: \"brand-icons\";\n}\ni.icon.confluence::before {\n  content: \"\\f78d\";\n  font-family: \"brand-icons\";\n}\ni.icon.connectdevelop::before {\n  content: \"\\f20e\";\n  font-family: \"brand-icons\";\n}\ni.icon.contao::before {\n  content: \"\\f26d\";\n  font-family: \"brand-icons\";\n}\ni.icon.cotton.bureau::before {\n  content: \"\\f89e\";\n  font-family: \"brand-icons\";\n}\ni.icon.cpanel::before {\n  content: \"\\f388\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons::before {\n  content: \"\\f25e\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.by::before {\n  content: \"\\f4e7\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.nc::before {\n  content: \"\\f4e8\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.nc.eu::before {\n  content: \"\\f4e9\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.nc.jp::before {\n  content: \"\\f4ea\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.nd::before {\n  content: \"\\f4eb\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.pd::before {\n  content: \"\\f4ec\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.pd.alternate::before {\n  content: \"\\f4ed\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.remix::before {\n  content: \"\\f4ee\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.sa::before {\n  content: \"\\f4ef\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.sampling::before {\n  content: \"\\f4f0\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.sampling.plus::before {\n  content: \"\\f4f1\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.share::before {\n  content: \"\\f4f2\";\n  font-family: \"brand-icons\";\n}\ni.icon.creative.commons.zero::before {\n  content: \"\\f4f3\";\n  font-family: \"brand-icons\";\n}\ni.icon.critical.role::before {\n  content: \"\\f6c9\";\n  font-family: \"brand-icons\";\n}\ni.icon.css3::before {\n  content: \"\\f13c\";\n  font-family: \"brand-icons\";\n}\ni.icon.css3.alternate::before {\n  content: \"\\f38b\";\n  font-family: \"brand-icons\";\n}\ni.icon.cuttlefish::before {\n  content: \"\\f38c\";\n  font-family: \"brand-icons\";\n}\ni.icon.d.and.d::before {\n  content: \"\\f38d\";\n  font-family: \"brand-icons\";\n}\ni.icon.d.and.d.beyond::before {\n  content: \"\\f6ca\";\n  font-family: \"brand-icons\";\n}\ni.icon.dailymotion::before {\n  content: \"\\e052\";\n  font-family: \"brand-icons\";\n}\ni.icon.dashcube::before {\n  content: \"\\f210\";\n  font-family: \"brand-icons\";\n}\ni.icon.deezer::before {\n  content: \"\\e077\";\n  font-family: \"brand-icons\";\n}\ni.icon.delicious::before {\n  content: \"\\f1a5\";\n  font-family: \"brand-icons\";\n}\ni.icon.deploydog::before {\n  content: \"\\f38e\";\n  font-family: \"brand-icons\";\n}\ni.icon.deskpro::before {\n  content: \"\\f38f\";\n  font-family: \"brand-icons\";\n}\ni.icon.dev::before {\n  content: \"\\f6cc\";\n  font-family: \"brand-icons\";\n}\ni.icon.deviantart::before {\n  content: \"\\f1bd\";\n  font-family: \"brand-icons\";\n}\ni.icon.dhl::before {\n  content: \"\\f790\";\n  font-family: \"brand-icons\";\n}\ni.icon.diaspora::before {\n  content: \"\\f791\";\n  font-family: \"brand-icons\";\n}\ni.icon.digg::before {\n  content: \"\\f1a6\";\n  font-family: \"brand-icons\";\n}\ni.icon.digital.ocean::before {\n  content: \"\\f391\";\n  font-family: \"brand-icons\";\n}\ni.icon.discord::before {\n  content: \"\\f392\";\n  font-family: \"brand-icons\";\n}\ni.icon.discourse::before {\n  content: \"\\f393\";\n  font-family: \"brand-icons\";\n}\ni.icon.dochub::before {\n  content: \"\\f394\";\n  font-family: \"brand-icons\";\n}\ni.icon.docker::before {\n  content: \"\\f395\";\n  font-family: \"brand-icons\";\n}\ni.icon.draft2digital::before {\n  content: \"\\f396\";\n  font-family: \"brand-icons\";\n}\ni.icon.dribbble::before {\n  content: \"\\f17d\";\n  font-family: \"brand-icons\";\n}\ni.icon.dribbble.square::before {\n  content: \"\\f397\";\n  font-family: \"brand-icons\";\n}\ni.icon.dropbox::before {\n  content: \"\\f16b\";\n  font-family: \"brand-icons\";\n}\ni.icon.drupal::before {\n  content: \"\\f1a9\";\n  font-family: \"brand-icons\";\n}\ni.icon.dyalog::before {\n  content: \"\\f399\";\n  font-family: \"brand-icons\";\n}\ni.icon.earlybirds::before {\n  content: \"\\f39a\";\n  font-family: \"brand-icons\";\n}\ni.icon.ebay::before {\n  content: \"\\f4f4\";\n  font-family: \"brand-icons\";\n}\ni.icon.edge::before {\n  content: \"\\f282\";\n  font-family: \"brand-icons\";\n}\ni.icon.edge.legacy::before {\n  content: \"\\e078\";\n  font-family: \"brand-icons\";\n}\ni.icon.elementor::before {\n  content: \"\\f430\";\n  font-family: \"brand-icons\";\n}\ni.icon.ello::before {\n  content: \"\\f5f1\";\n  font-family: \"brand-icons\";\n}\ni.icon.ember::before {\n  content: \"\\f423\";\n  font-family: \"brand-icons\";\n}\ni.icon.empire::before {\n  content: \"\\f1d1\";\n  font-family: \"brand-icons\";\n}\ni.icon.envira::before {\n  content: \"\\f299\";\n  font-family: \"brand-icons\";\n}\ni.icon.erlang::before {\n  content: \"\\f39d\";\n  font-family: \"brand-icons\";\n}\ni.icon.ethereum::before {\n  content: \"\\f42e\";\n  font-family: \"brand-icons\";\n}\ni.icon.etsy::before {\n  content: \"\\f2d7\";\n  font-family: \"brand-icons\";\n}\ni.icon.evernote::before {\n  content: \"\\f839\";\n  font-family: \"brand-icons\";\n}\ni.icon.expeditedssl::before {\n  content: \"\\f23e\";\n  font-family: \"brand-icons\";\n}\ni.icon.facebook::before {\n  content: \"\\f09a\";\n  font-family: \"brand-icons\";\n}\ni.icon.facebook.f::before {\n  content: \"\\f39e\";\n  font-family: \"brand-icons\";\n}\ni.icon.facebook.messenger::before {\n  content: \"\\f39f\";\n  font-family: \"brand-icons\";\n}\ni.icon.facebook.square::before {\n  content: \"\\f082\";\n  font-family: \"brand-icons\";\n}\ni.icon.fantasy.flight.games::before {\n  content: \"\\f6dc\";\n  font-family: \"brand-icons\";\n}\ni.icon.fedex::before {\n  content: \"\\f797\";\n  font-family: \"brand-icons\";\n}\ni.icon.fedora::before {\n  content: \"\\f798\";\n  font-family: \"brand-icons\";\n}\ni.icon.figma::before {\n  content: \"\\f799\";\n  font-family: \"brand-icons\";\n}\ni.icon.firefox::before {\n  content: \"\\f269\";\n  font-family: \"brand-icons\";\n}\ni.icon.firefox.browser::before {\n  content: \"\\e007\";\n  font-family: \"brand-icons\";\n}\ni.icon.first.order::before {\n  content: \"\\f2b0\";\n  font-family: \"brand-icons\";\n}\ni.icon.first.order.alternate::before {\n  content: \"\\f50a\";\n  font-family: \"brand-icons\";\n}\ni.icon.firstdraft::before {\n  content: \"\\f3a1\";\n  font-family: \"brand-icons\";\n}\ni.icon.flickr::before {\n  content: \"\\f16e\";\n  font-family: \"brand-icons\";\n}\ni.icon.flipboard::before {\n  content: \"\\f44d\";\n  font-family: \"brand-icons\";\n}\ni.icon.fly::before {\n  content: \"\\f417\";\n  font-family: \"brand-icons\";\n}\ni.icon.font.awesome::before {\n  content: \"\\f2b4\";\n  font-family: \"brand-icons\";\n}\ni.icon.font.awesome.alternate::before {\n  content: \"\\f35c\";\n  font-family: \"brand-icons\";\n}\ni.icon.font.awesome.flag::before {\n  content: \"\\f425\";\n  font-family: \"brand-icons\";\n}\ni.icon.fonticons::before {\n  content: \"\\f280\";\n  font-family: \"brand-icons\";\n}\ni.icon.fonticons.fi::before {\n  content: \"\\f3a2\";\n  font-family: \"brand-icons\";\n}\ni.icon.fort.awesome::before {\n  content: \"\\f286\";\n  font-family: \"brand-icons\";\n}\ni.icon.fort.awesome.alternate::before {\n  content: \"\\f3a3\";\n  font-family: \"brand-icons\";\n}\ni.icon.forumbee::before {\n  content: \"\\f211\";\n  font-family: \"brand-icons\";\n}\ni.icon.foursquare::before {\n  content: \"\\f180\";\n  font-family: \"brand-icons\";\n}\ni.icon.free.code.camp::before {\n  content: \"\\f2c5\";\n  font-family: \"brand-icons\";\n}\ni.icon.freebsd::before {\n  content: \"\\f3a4\";\n  font-family: \"brand-icons\";\n}\ni.icon.fulcrum::before {\n  content: \"\\f50b\";\n  font-family: \"brand-icons\";\n}\ni.icon.galactic.republic::before {\n  content: \"\\f50c\";\n  font-family: \"brand-icons\";\n}\ni.icon.galactic.senate::before {\n  content: \"\\f50d\";\n  font-family: \"brand-icons\";\n}\ni.icon.get.pocket::before {\n  content: \"\\f265\";\n  font-family: \"brand-icons\";\n}\ni.icon.gg::before {\n  content: \"\\f260\";\n  font-family: \"brand-icons\";\n}\ni.icon.gg.circle::before {\n  content: \"\\f261\";\n  font-family: \"brand-icons\";\n}\ni.icon.git::before {\n  content: \"\\f1d3\";\n  font-family: \"brand-icons\";\n}\ni.icon.git.alternate::before {\n  content: \"\\f841\";\n  font-family: \"brand-icons\";\n}\ni.icon.git.square::before {\n  content: \"\\f1d2\";\n  font-family: \"brand-icons\";\n}\ni.icon.github::before {\n  content: \"\\f09b\";\n  font-family: \"brand-icons\";\n}\ni.icon.github.alternate::before {\n  content: \"\\f113\";\n  font-family: \"brand-icons\";\n}\ni.icon.github.square::before {\n  content: \"\\f092\";\n  font-family: \"brand-icons\";\n}\ni.icon.gitkraken::before {\n  content: \"\\f3a6\";\n  font-family: \"brand-icons\";\n}\ni.icon.gitlab::before {\n  content: \"\\f296\";\n  font-family: \"brand-icons\";\n}\ni.icon.gitter::before {\n  content: \"\\f426\";\n  font-family: \"brand-icons\";\n}\ni.icon.glide::before {\n  content: \"\\f2a5\";\n  font-family: \"brand-icons\";\n}\ni.icon.glide.g::before {\n  content: \"\\f2a6\";\n  font-family: \"brand-icons\";\n}\ni.icon.gofore::before {\n  content: \"\\f3a7\";\n  font-family: \"brand-icons\";\n}\ni.icon.goodreads::before {\n  content: \"\\f3a8\";\n  font-family: \"brand-icons\";\n}\ni.icon.goodreads.g::before {\n  content: \"\\f3a9\";\n  font-family: \"brand-icons\";\n}\ni.icon.google::before {\n  content: \"\\f1a0\";\n  font-family: \"brand-icons\";\n}\ni.icon.google.drive::before {\n  content: \"\\f3aa\";\n  font-family: \"brand-icons\";\n}\ni.icon.google.pay::before {\n  content: \"\\e079\";\n  font-family: \"brand-icons\";\n}\ni.icon.google.play::before {\n  content: \"\\f3ab\";\n  font-family: \"brand-icons\";\n}\ni.icon.google.plus::before {\n  content: \"\\f2b3\";\n  font-family: \"brand-icons\";\n}\ni.icon.google.plus.g::before {\n  content: \"\\f0d5\";\n  font-family: \"brand-icons\";\n}\ni.icon.google.plus.square::before {\n  content: \"\\f0d4\";\n  font-family: \"brand-icons\";\n}\ni.icon.google.wallet::before {\n  content: \"\\f1ee\";\n  font-family: \"brand-icons\";\n}\ni.icon.gratipay::before {\n  content: \"\\f184\";\n  font-family: \"brand-icons\";\n}\ni.icon.grav::before {\n  content: \"\\f2d6\";\n  font-family: \"brand-icons\";\n}\ni.icon.gripfire::before {\n  content: \"\\f3ac\";\n  font-family: \"brand-icons\";\n}\ni.icon.grunt::before {\n  content: \"\\f3ad\";\n  font-family: \"brand-icons\";\n}\ni.icon.guilded::before {\n  content: \"\\e07e\";\n  font-family: \"brand-icons\";\n}\ni.icon.gulp::before {\n  content: \"\\f3ae\";\n  font-family: \"brand-icons\";\n}\ni.icon.hacker.news::before {\n  content: \"\\f1d4\";\n  font-family: \"brand-icons\";\n}\ni.icon.hacker.news.square::before {\n  content: \"\\f3af\";\n  font-family: \"brand-icons\";\n}\ni.icon.hackerrank::before {\n  content: \"\\f5f7\";\n  font-family: \"brand-icons\";\n}\ni.icon.hips::before {\n  content: \"\\f452\";\n  font-family: \"brand-icons\";\n}\ni.icon.hire.a.helper::before {\n  content: \"\\f3b0\";\n  font-family: \"brand-icons\";\n}\ni.icon.hive::before {\n  content: \"\\e07f\";\n  font-family: \"brand-icons\";\n}\ni.icon.hooli::before {\n  content: \"\\f427\";\n  font-family: \"brand-icons\";\n}\ni.icon.hornbill::before {\n  content: \"\\f592\";\n  font-family: \"brand-icons\";\n}\ni.icon.hotjar::before {\n  content: \"\\f3b1\";\n  font-family: \"brand-icons\";\n}\ni.icon.houzz::before {\n  content: \"\\f27c\";\n  font-family: \"brand-icons\";\n}\ni.icon.html5::before {\n  content: \"\\f13b\";\n  font-family: \"brand-icons\";\n}\ni.icon.hubspot::before {\n  content: \"\\f3b2\";\n  font-family: \"brand-icons\";\n}\ni.icon.ideal::before {\n  content: \"\\e013\";\n  font-family: \"brand-icons\";\n}\ni.icon.imdb::before {\n  content: \"\\f2d8\";\n  font-family: \"brand-icons\";\n}\ni.icon.innosoft::before {\n  content: \"\\e080\";\n  font-family: \"brand-icons\";\n}\ni.icon.instagram::before {\n  content: \"\\f16d\";\n  font-family: \"brand-icons\";\n}\ni.icon.instagram.square::before {\n  content: \"\\e055\";\n  font-family: \"brand-icons\";\n}\ni.icon.instalod::before {\n  content: \"\\e081\";\n  font-family: \"brand-icons\";\n}\ni.icon.intercom::before {\n  content: \"\\f7af\";\n  font-family: \"brand-icons\";\n}\ni.icon.internet.explorer::before {\n  content: \"\\f26b\";\n  font-family: \"brand-icons\";\n}\ni.icon.invision::before {\n  content: \"\\f7b0\";\n  font-family: \"brand-icons\";\n}\ni.icon.ioxhost::before {\n  content: \"\\f208\";\n  font-family: \"brand-icons\";\n}\ni.icon.itch.io::before {\n  content: \"\\f83a\";\n  font-family: \"brand-icons\";\n}\ni.icon.itunes::before {\n  content: \"\\f3b4\";\n  font-family: \"brand-icons\";\n}\ni.icon.itunes.note::before {\n  content: \"\\f3b5\";\n  font-family: \"brand-icons\";\n}\ni.icon.java::before {\n  content: \"\\f4e4\";\n  font-family: \"brand-icons\";\n}\ni.icon.jedi.order::before {\n  content: \"\\f50e\";\n  font-family: \"brand-icons\";\n}\ni.icon.jenkins::before {\n  content: \"\\f3b6\";\n  font-family: \"brand-icons\";\n}\ni.icon.jira::before {\n  content: \"\\f7b1\";\n  font-family: \"brand-icons\";\n}\ni.icon.joget::before {\n  content: \"\\f3b7\";\n  font-family: \"brand-icons\";\n}\ni.icon.joomla::before {\n  content: \"\\f1aa\";\n  font-family: \"brand-icons\";\n}\ni.icon.js::before {\n  content: \"\\f3b8\";\n  font-family: \"brand-icons\";\n}\ni.icon.js.square::before {\n  content: \"\\f3b9\";\n  font-family: \"brand-icons\";\n}\ni.icon.jsfiddle::before {\n  content: \"\\f1cc\";\n  font-family: \"brand-icons\";\n}\ni.icon.kaggle::before {\n  content: \"\\f5fa\";\n  font-family: \"brand-icons\";\n}\ni.icon.keybase::before {\n  content: \"\\f4f5\";\n  font-family: \"brand-icons\";\n}\ni.icon.keycdn::before {\n  content: \"\\f3ba\";\n  font-family: \"brand-icons\";\n}\ni.icon.kickstarter::before {\n  content: \"\\f3bb\";\n  font-family: \"brand-icons\";\n}\ni.icon.kickstarter.k::before {\n  content: \"\\f3bc\";\n  font-family: \"brand-icons\";\n}\ni.icon.korvue::before {\n  content: \"\\f42f\";\n  font-family: \"brand-icons\";\n}\ni.icon.laravel::before {\n  content: \"\\f3bd\";\n  font-family: \"brand-icons\";\n}\ni.icon.lastfm::before {\n  content: \"\\f202\";\n  font-family: \"brand-icons\";\n}\ni.icon.lastfm.square::before {\n  content: \"\\f203\";\n  font-family: \"brand-icons\";\n}\ni.icon.leanpub::before {\n  content: \"\\f212\";\n  font-family: \"brand-icons\";\n}\ni.icon.lesscss::before {\n  content: \"\\f41d\";\n  font-family: \"brand-icons\";\n}\ni.icon.linechat::before {\n  content: \"\\f3c0\";\n  font-family: \"brand-icons\";\n}\ni.icon.linkedin::before {\n  content: \"\\f08c\";\n  font-family: \"brand-icons\";\n}\ni.icon.linode::before {\n  content: \"\\f2b8\";\n  font-family: \"brand-icons\";\n}\ni.icon.linux::before {\n  content: \"\\f17c\";\n  font-family: \"brand-icons\";\n}\ni.icon.lyft::before {\n  content: \"\\f3c3\";\n  font-family: \"brand-icons\";\n}\ni.icon.magento::before {\n  content: \"\\f3c4\";\n  font-family: \"brand-icons\";\n}\ni.icon.mailchimp::before {\n  content: \"\\f59e\";\n  font-family: \"brand-icons\";\n}\ni.icon.mandalorian::before {\n  content: \"\\f50f\";\n  font-family: \"brand-icons\";\n}\ni.icon.markdown::before {\n  content: \"\\f60f\";\n  font-family: \"brand-icons\";\n}\ni.icon.mastodon::before {\n  content: \"\\f4f6\";\n  font-family: \"brand-icons\";\n}\ni.icon.maxcdn::before {\n  content: \"\\f136\";\n  font-family: \"brand-icons\";\n}\ni.icon.mdb::before {\n  content: \"\\f8ca\";\n  font-family: \"brand-icons\";\n}\ni.icon.medapps::before {\n  content: \"\\f3c6\";\n  font-family: \"brand-icons\";\n}\ni.icon.medium::before {\n  content: \"\\f23a\";\n  font-family: \"brand-icons\";\n}\ni.icon.medium.m::before {\n  content: \"\\f3c7\";\n  font-family: \"brand-icons\";\n}\ni.icon.medrt::before {\n  content: \"\\f3c8\";\n  font-family: \"brand-icons\";\n}\ni.icon.meetup::before {\n  content: \"\\f2e0\";\n  font-family: \"brand-icons\";\n}\ni.icon.megaport::before {\n  content: \"\\f5a3\";\n  font-family: \"brand-icons\";\n}\ni.icon.mendeley::before {\n  content: \"\\f7b3\";\n  font-family: \"brand-icons\";\n}\ni.icon.microblog::before {\n  content: \"\\e01a\";\n  font-family: \"brand-icons\";\n}\ni.icon.microsoft::before {\n  content: \"\\f3ca\";\n  font-family: \"brand-icons\";\n}\ni.icon.mix::before {\n  content: \"\\f3cb\";\n  font-family: \"brand-icons\";\n}\ni.icon.mixcloud::before {\n  content: \"\\f289\";\n  font-family: \"brand-icons\";\n}\ni.icon.mixer::before {\n  content: \"\\e056\";\n  font-family: \"brand-icons\";\n}\ni.icon.mizuni::before {\n  content: \"\\f3cc\";\n  font-family: \"brand-icons\";\n}\ni.icon.modx::before {\n  content: \"\\f285\";\n  font-family: \"brand-icons\";\n}\ni.icon.monero::before {\n  content: \"\\f3d0\";\n  font-family: \"brand-icons\";\n}\ni.icon.napster::before {\n  content: \"\\f3d2\";\n  font-family: \"brand-icons\";\n}\ni.icon.neos::before {\n  content: \"\\f612\";\n  font-family: \"brand-icons\";\n}\ni.icon.nimblr::before {\n  content: \"\\f5a8\";\n  font-family: \"brand-icons\";\n}\ni.icon.node::before {\n  content: \"\\f419\";\n  font-family: \"brand-icons\";\n}\ni.icon.node.js::before {\n  content: \"\\f3d3\";\n  font-family: \"brand-icons\";\n}\ni.icon.npm::before {\n  content: \"\\f3d4\";\n  font-family: \"brand-icons\";\n}\ni.icon.ns8::before {\n  content: \"\\f3d5\";\n  font-family: \"brand-icons\";\n}\ni.icon.nutritionix::before {\n  content: \"\\f3d6\";\n  font-family: \"brand-icons\";\n}\ni.icon.octopus.deploy::before {\n  content: \"\\e082\";\n  font-family: \"brand-icons\";\n}\ni.icon.odnoklassniki::before {\n  content: \"\\f263\";\n  font-family: \"brand-icons\";\n}\ni.icon.odnoklassniki.square::before {\n  content: \"\\f264\";\n  font-family: \"brand-icons\";\n}\ni.icon.old.republic::before {\n  content: \"\\f510\";\n  font-family: \"brand-icons\";\n}\ni.icon.opencart::before {\n  content: \"\\f23d\";\n  font-family: \"brand-icons\";\n}\ni.icon.openid::before {\n  content: \"\\f19b\";\n  font-family: \"brand-icons\";\n}\ni.icon.opera::before {\n  content: \"\\f26a\";\n  font-family: \"brand-icons\";\n}\ni.icon.optin.monster::before {\n  content: \"\\f23c\";\n  font-family: \"brand-icons\";\n}\ni.icon.orcid::before {\n  content: \"\\f8d2\";\n  font-family: \"brand-icons\";\n}\ni.icon.osi::before {\n  content: \"\\f41a\";\n  font-family: \"brand-icons\";\n}\ni.icon.page4::before {\n  content: \"\\f3d7\";\n  font-family: \"brand-icons\";\n}\ni.icon.pagelines::before {\n  content: \"\\f18c\";\n  font-family: \"brand-icons\";\n}\ni.icon.palfed::before {\n  content: \"\\f3d8\";\n  font-family: \"brand-icons\";\n}\ni.icon.patreon::before {\n  content: \"\\f3d9\";\n  font-family: \"brand-icons\";\n}\ni.icon.paypal::before {\n  content: \"\\f1ed\";\n  font-family: \"brand-icons\";\n}\ni.icon.penny.arcade::before {\n  content: \"\\f704\";\n  font-family: \"brand-icons\";\n}\ni.icon.perbyte::before {\n  content: \"\\e083\";\n  font-family: \"brand-icons\";\n}\ni.icon.periscope::before {\n  content: \"\\f3da\";\n  font-family: \"brand-icons\";\n}\ni.icon.phabricator::before {\n  content: \"\\f3db\";\n  font-family: \"brand-icons\";\n}\ni.icon.phoenix.framework::before {\n  content: \"\\f3dc\";\n  font-family: \"brand-icons\";\n}\ni.icon.phoenix.squadron::before {\n  content: \"\\f511\";\n  font-family: \"brand-icons\";\n}\ni.icon.php::before {\n  content: \"\\f457\";\n  font-family: \"brand-icons\";\n}\ni.icon.pied.piper::before {\n  content: \"\\f2ae\";\n  font-family: \"brand-icons\";\n}\ni.icon.pied.piper.alternate::before {\n  content: \"\\f1a8\";\n  font-family: \"brand-icons\";\n}\ni.icon.pied.piper.hat::before {\n  content: \"\\f4e5\";\n  font-family: \"brand-icons\";\n}\ni.icon.pied.piper.pp::before {\n  content: \"\\f1a7\";\n  font-family: \"brand-icons\";\n}\ni.icon.pied.piper.square::before {\n  content: \"\\e01e\";\n  font-family: \"brand-icons\";\n}\ni.icon.pinterest::before {\n  content: \"\\f0d2\";\n  font-family: \"brand-icons\";\n}\ni.icon.pinterest.p::before {\n  content: \"\\f231\";\n  font-family: \"brand-icons\";\n}\ni.icon.pinterest.square::before {\n  content: \"\\f0d3\";\n  font-family: \"brand-icons\";\n}\ni.icon.playstation::before {\n  content: \"\\f3df\";\n  font-family: \"brand-icons\";\n}\ni.icon.product.hunt::before {\n  content: \"\\f288\";\n  font-family: \"brand-icons\";\n}\ni.icon.pushed::before {\n  content: \"\\f3e1\";\n  font-family: \"brand-icons\";\n}\ni.icon.python::before {\n  content: \"\\f3e2\";\n  font-family: \"brand-icons\";\n}\ni.icon.qq::before {\n  content: \"\\f1d6\";\n  font-family: \"brand-icons\";\n}\ni.icon.quinscape::before {\n  content: \"\\f459\";\n  font-family: \"brand-icons\";\n}\ni.icon.quora::before {\n  content: \"\\f2c4\";\n  font-family: \"brand-icons\";\n}\ni.icon.r.project::before {\n  content: \"\\f4f7\";\n  font-family: \"brand-icons\";\n}\ni.icon.raspberry.pi::before {\n  content: \"\\f7bb\";\n  font-family: \"brand-icons\";\n}\ni.icon.ravelry::before {\n  content: \"\\f2d9\";\n  font-family: \"brand-icons\";\n}\ni.icon.react::before {\n  content: \"\\f41b\";\n  font-family: \"brand-icons\";\n}\ni.icon.reacteurope::before {\n  content: \"\\f75d\";\n  font-family: \"brand-icons\";\n}\ni.icon.readme::before {\n  content: \"\\f4d5\";\n  font-family: \"brand-icons\";\n}\ni.icon.rebel::before {\n  content: \"\\f1d0\";\n  font-family: \"brand-icons\";\n}\ni.icon.reddit::before {\n  content: \"\\f1a1\";\n  font-family: \"brand-icons\";\n}\ni.icon.reddit.alien::before {\n  content: \"\\f281\";\n  font-family: \"brand-icons\";\n}\ni.icon.reddit.square::before {\n  content: \"\\f1a2\";\n  font-family: \"brand-icons\";\n}\ni.icon.redhat::before {\n  content: \"\\f7bc\";\n  font-family: \"brand-icons\";\n}\ni.icon.redriver::before {\n  content: \"\\f3e3\";\n  font-family: \"brand-icons\";\n}\ni.icon.redyeti::before {\n  content: \"\\f69d\";\n  font-family: \"brand-icons\";\n}\ni.icon.renren::before {\n  content: \"\\f18b\";\n  font-family: \"brand-icons\";\n}\ni.icon.replyd::before {\n  content: \"\\f3e6\";\n  font-family: \"brand-icons\";\n}\ni.icon.researchgate::before {\n  content: \"\\f4f8\";\n  font-family: \"brand-icons\";\n}\ni.icon.resolving::before {\n  content: \"\\f3e7\";\n  font-family: \"brand-icons\";\n}\ni.icon.rev::before {\n  content: \"\\f5b2\";\n  font-family: \"brand-icons\";\n}\ni.icon.rocketchat::before {\n  content: \"\\f3e8\";\n  font-family: \"brand-icons\";\n}\ni.icon.rockrms::before {\n  content: \"\\f3e9\";\n  font-family: \"brand-icons\";\n}\ni.icon.rust::before {\n  content: \"\\e07a\";\n  font-family: \"brand-icons\";\n}\ni.icon.safari::before {\n  content: \"\\f267\";\n  font-family: \"brand-icons\";\n}\ni.icon.salesforce::before {\n  content: \"\\f83b\";\n  font-family: \"brand-icons\";\n}\ni.icon.sass::before {\n  content: \"\\f41e\";\n  font-family: \"brand-icons\";\n}\ni.icon.schlix::before {\n  content: \"\\f3ea\";\n  font-family: \"brand-icons\";\n}\ni.icon.scribd::before {\n  content: \"\\f28a\";\n  font-family: \"brand-icons\";\n}\ni.icon.searchengin::before {\n  content: \"\\f3eb\";\n  font-family: \"brand-icons\";\n}\ni.icon.sellcast::before {\n  content: \"\\f2da\";\n  font-family: \"brand-icons\";\n}\ni.icon.sellsy::before {\n  content: \"\\f213\";\n  font-family: \"brand-icons\";\n}\ni.icon.servicestack::before {\n  content: \"\\f3ec\";\n  font-family: \"brand-icons\";\n}\ni.icon.shirtsinbulk::before {\n  content: \"\\f214\";\n  font-family: \"brand-icons\";\n}\ni.icon.shopify::before {\n  content: \"\\e057\";\n  font-family: \"brand-icons\";\n}\ni.icon.shopware::before {\n  content: \"\\f5b5\";\n  font-family: \"brand-icons\";\n}\ni.icon.simplybuilt::before {\n  content: \"\\f215\";\n  font-family: \"brand-icons\";\n}\ni.icon.sistrix::before {\n  content: \"\\f3ee\";\n  font-family: \"brand-icons\";\n}\ni.icon.sith::before {\n  content: \"\\f512\";\n  font-family: \"brand-icons\";\n}\ni.icon.sketch::before {\n  content: \"\\f7c6\";\n  font-family: \"brand-icons\";\n}\ni.icon.skyatlas::before {\n  content: \"\\f216\";\n  font-family: \"brand-icons\";\n}\ni.icon.skype::before {\n  content: \"\\f17e\";\n  font-family: \"brand-icons\";\n}\ni.icon.slack::before {\n  content: \"\\f198\";\n  font-family: \"brand-icons\";\n}\ni.icon.slack.hash::before {\n  content: \"\\f3ef\";\n  font-family: \"brand-icons\";\n}\ni.icon.slideshare::before {\n  content: \"\\f1e7\";\n  font-family: \"brand-icons\";\n}\ni.icon.snapchat::before {\n  content: \"\\f2ab\";\n  font-family: \"brand-icons\";\n}\ni.icon.snapchat.ghost::before {\n  content: \"\\f2ac\";\n  font-family: \"brand-icons\";\n}\ni.icon.snapchat.square::before {\n  content: \"\\f2ad\";\n  font-family: \"brand-icons\";\n}\ni.icon.soundcloud::before {\n  content: \"\\f1be\";\n  font-family: \"brand-icons\";\n}\ni.icon.sourcetree::before {\n  content: \"\\f7d3\";\n  font-family: \"brand-icons\";\n}\ni.icon.speakap::before {\n  content: \"\\f3f3\";\n  font-family: \"brand-icons\";\n}\ni.icon.speaker.deck::before {\n  content: \"\\f83c\";\n  font-family: \"brand-icons\";\n}\ni.icon.spotify::before {\n  content: \"\\f1bc\";\n  font-family: \"brand-icons\";\n}\ni.icon.squarespace::before {\n  content: \"\\f5be\";\n  font-family: \"brand-icons\";\n}\ni.icon.stack.exchange::before {\n  content: \"\\f18d\";\n  font-family: \"brand-icons\";\n}\ni.icon.stack.overflow::before {\n  content: \"\\f16c\";\n  font-family: \"brand-icons\";\n}\ni.icon.stackpath::before {\n  content: \"\\f842\";\n  font-family: \"brand-icons\";\n}\ni.icon.staylinked::before {\n  content: \"\\f3f5\";\n  font-family: \"brand-icons\";\n}\ni.icon.steam::before {\n  content: \"\\f1b6\";\n  font-family: \"brand-icons\";\n}\ni.icon.steam.square::before {\n  content: \"\\f1b7\";\n  font-family: \"brand-icons\";\n}\ni.icon.steam.symbol::before {\n  content: \"\\f3f6\";\n  font-family: \"brand-icons\";\n}\ni.icon.sticker.mule::before {\n  content: \"\\f3f7\";\n  font-family: \"brand-icons\";\n}\ni.icon.strava::before {\n  content: \"\\f428\";\n  font-family: \"brand-icons\";\n}\ni.icon.stripe::before {\n  content: \"\\f429\";\n  font-family: \"brand-icons\";\n}\ni.icon.stripe.s::before {\n  content: \"\\f42a\";\n  font-family: \"brand-icons\";\n}\ni.icon.studiovinari::before {\n  content: \"\\f3f8\";\n  font-family: \"brand-icons\";\n}\ni.icon.stumbleupon::before {\n  content: \"\\f1a4\";\n  font-family: \"brand-icons\";\n}\ni.icon.stumbleupon.circle::before {\n  content: \"\\f1a3\";\n  font-family: \"brand-icons\";\n}\ni.icon.superpowers::before {\n  content: \"\\f2dd\";\n  font-family: \"brand-icons\";\n}\ni.icon.supple::before {\n  content: \"\\f3f9\";\n  font-family: \"brand-icons\";\n}\ni.icon.suse::before {\n  content: \"\\f7d6\";\n  font-family: \"brand-icons\";\n}\ni.icon.swift::before {\n  content: \"\\f8e1\";\n  font-family: \"brand-icons\";\n}\ni.icon.symfony::before {\n  content: \"\\f83d\";\n  font-family: \"brand-icons\";\n}\ni.icon.teamspeak::before {\n  content: \"\\f4f9\";\n  font-family: \"brand-icons\";\n}\ni.icon.telegram::before {\n  content: \"\\f2c6\";\n  font-family: \"brand-icons\";\n}\ni.icon.telegram.plane::before {\n  content: \"\\f3fe\";\n  font-family: \"brand-icons\";\n}\ni.icon.tencent.weibo::before {\n  content: \"\\f1d5\";\n  font-family: \"brand-icons\";\n}\ni.icon.themeco::before {\n  content: \"\\f5c6\";\n  font-family: \"brand-icons\";\n}\ni.icon.themeisle::before {\n  content: \"\\f2b2\";\n  font-family: \"brand-icons\";\n}\ni.icon.think.peaks::before {\n  content: \"\\f731\";\n  font-family: \"brand-icons\";\n}\ni.icon.tiktok::before {\n  content: \"\\e07b\";\n  font-family: \"brand-icons\";\n}\ni.icon.trade.federation::before {\n  content: \"\\f513\";\n  font-family: \"brand-icons\";\n}\ni.icon.trello::before {\n  content: \"\\f181\";\n  font-family: \"brand-icons\";\n}\ni.icon.tumblr::before {\n  content: \"\\f173\";\n  font-family: \"brand-icons\";\n}\ni.icon.tumblr.square::before {\n  content: \"\\f174\";\n  font-family: \"brand-icons\";\n}\ni.icon.twitch::before {\n  content: \"\\f1e8\";\n  font-family: \"brand-icons\";\n}\ni.icon.twitter::before {\n  content: \"\\f099\";\n  font-family: \"brand-icons\";\n}\ni.icon.twitter.square::before {\n  content: \"\\f081\";\n  font-family: \"brand-icons\";\n}\ni.icon.typo3::before {\n  content: \"\\f42b\";\n  font-family: \"brand-icons\";\n}\ni.icon.uber::before {\n  content: \"\\f402\";\n  font-family: \"brand-icons\";\n}\ni.icon.ubuntu::before {\n  content: \"\\f7df\";\n  font-family: \"brand-icons\";\n}\ni.icon.uikit::before {\n  content: \"\\f403\";\n  font-family: \"brand-icons\";\n}\ni.icon.umbraco::before {\n  content: \"\\f8e8\";\n  font-family: \"brand-icons\";\n}\ni.icon.uncharted::before {\n  content: \"\\e084\";\n  font-family: \"brand-icons\";\n}\ni.icon.uniregistry::before {\n  content: \"\\f404\";\n  font-family: \"brand-icons\";\n}\ni.icon.unity::before {\n  content: \"\\e049\";\n  font-family: \"brand-icons\";\n}\ni.icon.unsplash::before {\n  content: \"\\e07c\";\n  font-family: \"brand-icons\";\n}\ni.icon.untappd::before {\n  content: \"\\f405\";\n  font-family: \"brand-icons\";\n}\ni.icon.ups::before {\n  content: \"\\f7e0\";\n  font-family: \"brand-icons\";\n}\ni.icon.usb::before {\n  content: \"\\f287\";\n  font-family: \"brand-icons\";\n}\ni.icon.usps::before {\n  content: \"\\f7e1\";\n  font-family: \"brand-icons\";\n}\ni.icon.ussunnah::before {\n  content: \"\\f407\";\n  font-family: \"brand-icons\";\n}\ni.icon.vaadin::before {\n  content: \"\\f408\";\n  font-family: \"brand-icons\";\n}\ni.icon.viacoin::before {\n  content: \"\\f237\";\n  font-family: \"brand-icons\";\n}\ni.icon.viadeo::before {\n  content: \"\\f2a9\";\n  font-family: \"brand-icons\";\n}\ni.icon.viadeo.square::before {\n  content: \"\\f2aa\";\n  font-family: \"brand-icons\";\n}\ni.icon.viber::before {\n  content: \"\\f409\";\n  font-family: \"brand-icons\";\n}\ni.icon.vimeo::before {\n  content: \"\\f40a\";\n  font-family: \"brand-icons\";\n}\ni.icon.vimeo.square::before {\n  content: \"\\f194\";\n  font-family: \"brand-icons\";\n}\ni.icon.vimeo.v::before {\n  content: \"\\f27d\";\n  font-family: \"brand-icons\";\n}\ni.icon.vine::before {\n  content: \"\\f1ca\";\n  font-family: \"brand-icons\";\n}\ni.icon.vk::before {\n  content: \"\\f189\";\n  font-family: \"brand-icons\";\n}\ni.icon.vnv::before {\n  content: \"\\f40b\";\n  font-family: \"brand-icons\";\n}\ni.icon.vuejs::before {\n  content: \"\\f41f\";\n  font-family: \"brand-icons\";\n}\ni.icon.watchman.monitoring::before {\n  content: \"\\e087\";\n  font-family: \"brand-icons\";\n}\ni.icon.waze::before {\n  content: \"\\f83f\";\n  font-family: \"brand-icons\";\n}\ni.icon.weebly::before {\n  content: \"\\f5cc\";\n  font-family: \"brand-icons\";\n}\ni.icon.weibo::before {\n  content: \"\\f18a\";\n  font-family: \"brand-icons\";\n}\ni.icon.weixin::before {\n  content: \"\\f1d7\";\n  font-family: \"brand-icons\";\n}\ni.icon.whatsapp::before {\n  content: \"\\f232\";\n  font-family: \"brand-icons\";\n}\ni.icon.whatsapp.square::before {\n  content: \"\\f40c\";\n  font-family: \"brand-icons\";\n}\ni.icon.whmcs::before {\n  content: \"\\f40d\";\n  font-family: \"brand-icons\";\n}\ni.icon.wikipedia.w::before {\n  content: \"\\f266\";\n  font-family: \"brand-icons\";\n}\ni.icon.windows::before {\n  content: \"\\f17a\";\n  font-family: \"brand-icons\";\n}\ni.icon.wix::before {\n  content: \"\\f5cf\";\n  font-family: \"brand-icons\";\n}\ni.icon.wizards.of.the.coast::before {\n  content: \"\\f730\";\n  font-family: \"brand-icons\";\n}\ni.icon.wodu::before {\n  content: \"\\e088\";\n  font-family: \"brand-icons\";\n}\ni.icon.wolf.pack.battalion::before {\n  content: \"\\f514\";\n  font-family: \"brand-icons\";\n}\ni.icon.wordpress::before {\n  content: \"\\f19a\";\n  font-family: \"brand-icons\";\n}\ni.icon.wordpress.simple::before {\n  content: \"\\f411\";\n  font-family: \"brand-icons\";\n}\ni.icon.wpbeginner::before {\n  content: \"\\f297\";\n  font-family: \"brand-icons\";\n}\ni.icon.wpexplorer::before {\n  content: \"\\f2de\";\n  font-family: \"brand-icons\";\n}\ni.icon.wpforms::before {\n  content: \"\\f298\";\n  font-family: \"brand-icons\";\n}\ni.icon.wpressr::before {\n  content: \"\\f3e4\";\n  font-family: \"brand-icons\";\n}\ni.icon.xbox::before {\n  content: \"\\f412\";\n  font-family: \"brand-icons\";\n}\ni.icon.xing::before {\n  content: \"\\f168\";\n  font-family: \"brand-icons\";\n}\ni.icon.xing.square::before {\n  content: \"\\f169\";\n  font-family: \"brand-icons\";\n}\ni.icon.y.combinator::before {\n  content: \"\\f23b\";\n  font-family: \"brand-icons\";\n}\ni.icon.yahoo::before {\n  content: \"\\f19e\";\n  font-family: \"brand-icons\";\n}\ni.icon.yammer::before {\n  content: \"\\f840\";\n  font-family: \"brand-icons\";\n}\ni.icon.yandex::before {\n  content: \"\\f413\";\n  font-family: \"brand-icons\";\n}\ni.icon.yandex.international::before {\n  content: \"\\f414\";\n  font-family: \"brand-icons\";\n}\ni.icon.yarn::before {\n  content: \"\\f7e3\";\n  font-family: \"brand-icons\";\n}\ni.icon.yelp::before {\n  content: \"\\f1e9\";\n  font-family: \"brand-icons\";\n}\ni.icon.yoast::before {\n  content: \"\\f2b1\";\n  font-family: \"brand-icons\";\n}\ni.icon.youtube::before {\n  content: \"\\f167\";\n  font-family: \"brand-icons\";\n}\ni.icon.youtube.square::before {\n  content: \"\\f431\";\n  font-family: \"brand-icons\";\n}\ni.icon.zhihu::before {\n  content: \"\\f63f\";\n  font-family: \"brand-icons\";\n}\n\n/* Aliases */\ni.icon.american.express::before {\n  content: \"\\f1f3\";\n  font-family: \"brand-icons\";\n}\ni.icon.american.express.card::before {\n  content: \"\\f1f3\";\n  font-family: \"brand-icons\";\n}\ni.icon.amex::before {\n  content: \"\\f1f3\";\n  font-family: \"brand-icons\";\n}\ni.icon.bitbucket.square::before {\n  content: \"\\f171\";\n  font-family: \"brand-icons\";\n}\ni.icon.bluetooth.alternative::before {\n  content: \"\\f294\";\n  font-family: \"brand-icons\";\n}\ni.icon.credit.card.amazon.pay::before {\n  content: \"\\f42d\";\n  font-family: \"brand-icons\";\n}\ni.icon.credit.card.american.express::before {\n  content: \"\\f1f3\";\n  font-family: \"brand-icons\";\n}\ni.icon.credit.card.diners.club::before {\n  content: \"\\f24c\";\n  font-family: \"brand-icons\";\n}\ni.icon.credit.card.discover::before {\n  content: \"\\f1f2\";\n  font-family: \"brand-icons\";\n}\ni.icon.credit.card.jcb::before {\n  content: \"\\f24b\";\n  font-family: \"brand-icons\";\n}\ni.icon.credit.card.mastercard::before {\n  content: \"\\f1f1\";\n  font-family: \"brand-icons\";\n}\ni.icon.credit.card.paypal::before {\n  content: \"\\f1f4\";\n  font-family: \"brand-icons\";\n}\ni.icon.credit.card.stripe::before {\n  content: \"\\f1f5\";\n  font-family: \"brand-icons\";\n}\ni.icon.credit.card.visa::before {\n  content: \"\\f1f0\";\n  font-family: \"brand-icons\";\n}\ni.icon.diners.club::before {\n  content: \"\\f24c\";\n  font-family: \"brand-icons\";\n}\ni.icon.diners.club.card::before {\n  content: \"\\f24c\";\n  font-family: \"brand-icons\";\n}\ni.icon.discover::before {\n  content: \"\\f1f2\";\n  font-family: \"brand-icons\";\n}\ni.icon.discover.card::before {\n  content: \"\\f1f2\";\n  font-family: \"brand-icons\";\n}\ni.icon.disk.outline::before {\n  content: \"\\f369\";\n  font-family: \"brand-icons\";\n}\ni.icon.dribble::before {\n  content: \"\\f17d\";\n  font-family: \"brand-icons\";\n}\ni.icon.eercast::before {\n  content: \"\\f2da\";\n  font-family: \"brand-icons\";\n}\ni.icon.envira.gallery::before {\n  content: \"\\f299\";\n  font-family: \"brand-icons\";\n}\ni.icon.fa::before {\n  content: \"\\f2b4\";\n  font-family: \"brand-icons\";\n}\ni.icon.facebook.official::before {\n  content: \"\\f082\";\n  font-family: \"brand-icons\";\n}\ni.icon.five.hundred.pixels::before {\n  content: \"\\f26e\";\n  font-family: \"brand-icons\";\n}\ni.icon.gittip::before {\n  content: \"\\f184\";\n  font-family: \"brand-icons\";\n}\ni.icon.google.plus.circle::before {\n  content: \"\\f2b3\";\n  font-family: \"brand-icons\";\n}\ni.icon.google.plus.official::before {\n  content: \"\\f2b3\";\n  font-family: \"brand-icons\";\n}\ni.icon.japan.credit.bureau::before {\n  content: \"\\f24b\";\n  font-family: \"brand-icons\";\n}\ni.icon.japan.credit.bureau.card::before {\n  content: \"\\f24b\";\n  font-family: \"brand-icons\";\n}\ni.icon.jcb::before {\n  content: \"\\f24b\";\n  font-family: \"brand-icons\";\n}\ni.icon.linkedin.square::before {\n  content: \"\\f08c\";\n  font-family: \"brand-icons\";\n}\ni.icon.mastercard::before {\n  content: \"\\f1f1\";\n  font-family: \"brand-icons\";\n}\ni.icon.mastercard.card::before {\n  content: \"\\f1f1\";\n  font-family: \"brand-icons\";\n}\ni.icon.microsoft.edge::before {\n  content: \"\\f282\";\n  font-family: \"brand-icons\";\n}\ni.icon.ms.edge::before {\n  content: \"\\f282\";\n  font-family: \"brand-icons\";\n}\ni.icon.new.pied.piper::before {\n  content: \"\\f2ae\";\n  font-family: \"brand-icons\";\n}\ni.icon.optinmonster::before {\n  content: \"\\f23c\";\n  font-family: \"brand-icons\";\n}\ni.icon.paypal.card::before {\n  content: \"\\f1f4\";\n  font-family: \"brand-icons\";\n}\ni.icon.pied.piper.hat::before {\n  content: \"\\f2ae\";\n  font-family: \"brand-icons\";\n}\ni.icon.pocket::before {\n  content: \"\\f265\";\n  font-family: \"brand-icons\";\n}\ni.icon.stripe.card::before {\n  content: \"\\f1f5\";\n  font-family: \"brand-icons\";\n}\ni.icon.theme.isle::before {\n  content: \"\\f2b2\";\n  font-family: \"brand-icons\";\n}\ni.icon.visa::before {\n  content: \"\\f1f0\";\n  font-family: \"brand-icons\";\n}\ni.icon.visa.card::before {\n  content: \"\\f1f0\";\n  font-family: \"brand-icons\";\n}\ni.icon.wechat::before {\n  content: \"\\f1d7\";\n  font-family: \"brand-icons\";\n}\ni.icon.wikipedia::before {\n  content: \"\\f266\";\n  font-family: \"brand-icons\";\n}\ni.icon.wordpress.beginner::before {\n  content: \"\\f297\";\n  font-family: \"brand-icons\";\n}\ni.icon.wordpress.forms::before {\n  content: \"\\f298\";\n  font-family: \"brand-icons\";\n}\ni.icon.yc::before {\n  content: \"\\f23b\";\n  font-family: \"brand-icons\";\n}\ni.icon.ycombinator::before {\n  content: \"\\f23b\";\n  font-family: \"brand-icons\";\n}\ni.icon.youtube.play::before {\n  content: \"\\f167\";\n  font-family: \"brand-icons\";\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/image.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Image\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Image\n*******************************/\n\n.ui.image {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n  max-width: 100%;\n  background-color: transparent;\n}\nimg.ui.image {\n  display: block;\n}\n.ui.image svg,\n.ui.image img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n.ui.hidden.images,\n.ui.ui.hidden.image {\n  display: none;\n}\n.ui.hidden.transition.images,\n.ui.hidden.transition.image {\n  display: block;\n  visibility: hidden;\n}\n.ui.images > .hidden.transition {\n  display: inline-block;\n  visibility: hidden;\n}\n.ui.disabled.images,\n.ui.disabled.image {\n  cursor: default;\n  opacity: 0.45;\n}\n\n\n/*******************************\n          Variations\n*******************************/\n\n\n/* --------------\n         Inline\n    --------------- */\n.ui.inline.image,\n.ui.inline.image svg,\n.ui.inline.image img {\n  display: inline-block;\n}\n\n/* ------------------\n      Vertical Aligned\n    ------------------- */\n.ui.top.aligned.image,\n.ui.top.aligned.image svg,\n.ui.top.aligned.image img {\n  display: inline-block;\n  vertical-align: top;\n}\n.ui.middle.aligned.image,\n.ui.middle.aligned.image svg,\n.ui.middle.aligned.image img {\n  display: inline-block;\n  vertical-align: middle;\n}\n.ui.bottom.aligned.image,\n.ui.bottom.aligned.image svg,\n.ui.bottom.aligned.image img {\n  display: inline-block;\n  vertical-align: bottom;\n}\n.ui.top.aligned.images .image,\n.ui.images .ui.top.aligned.image {\n  align-self: flex-start;\n}\n.ui.middle.aligned.images .image,\n.ui.images .ui.middle.aligned.image {\n  align-self: center;\n}\n.ui.bottom.aligned.images .image,\n.ui.images .ui.bottom.aligned.image {\n  align-self: flex-end;\n}\n\n/* --------------\n         Rounded\n    --------------- */\n.ui.rounded.images .image,\n.ui.rounded.image,\n.ui.rounded.images .image > *,\n.ui.rounded.image > * {\n  border-radius: 0.3125em;\n}\n\n/* --------------\n        Bordered\n    --------------- */\n.ui.bordered.images .image,\n.ui.bordered.images img,\n.ui.bordered.images svg,\n.ui.bordered.image img,\n.ui.bordered.image svg,\nimg.ui.bordered.image {\n  border: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n/* --------------\n        Circular\n    --------------- */\n.ui.circular.images,\n.ui.circular.image {\n  overflow: hidden;\n}\n.ui.circular.images .image,\n.ui.circular.image,\n.ui.circular.images .image > *,\n.ui.circular.image > * {\n  border-radius: 500rem;\n}\n\n/* --------------\n         Fluid\n    --------------- */\n.ui.fluid.images,\n.ui.fluid.image,\n.ui.fluid.images img,\n.ui.fluid.images svg,\n.ui.fluid.image svg,\n.ui.fluid.image img {\n  display: block;\n  width: 100%;\n  height: auto;\n}\n\n/* --------------\n         Avatar\n    --------------- */\n.ui.avatar.images .image,\n.ui.avatar.images img,\n.ui.avatar.images svg,\n.ui.avatar.image img,\n.ui.avatar.image svg,\n.ui.avatar.image {\n  margin-right: 0.25em;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  border-radius: 500rem;\n}\n\n/* -------------------\n           Spaced\n    -------------------- */\n.ui.spaced.image {\n  display: inline-block !important;\n  margin-left: 0.5em;\n  margin-right: 0.5em;\n}\n.ui[class*=\"left spaced\"].image {\n  margin-left: 0.5em;\n  margin-right: 0;\n}\n.ui[class*=\"right spaced\"].image {\n  margin-left: 0;\n  margin-right: 0.5em;\n}\n\n/* -------------------\n           Floated\n    -------------------- */\n.ui.floated.image,\n.ui.floated.images {\n  float: left;\n  margin-right: 1em;\n  margin-bottom: 1em;\n}\n.ui.right.floated.images,\n.ui.right.floated.image {\n  float: right;\n  margin-right: 0;\n  margin-bottom: 1em;\n  margin-left: 1em;\n}\n.ui.floated.images:last-child,\n.ui.floated.image:last-child {\n  margin-bottom: 0;\n}\n.ui.centered.image {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.ui.centered.images {\n  display: flex;\n  flex-flow: row wrap;\n  align-items: stretch;\n  justify-content: center;\n}\n\n/* --------------\n     Sizes\n--------------- */\n.ui.medium.images .image,\n.ui.medium.images img,\n.ui.medium.images svg,\n.ui.medium.image {\n  width: 300px;\n  height: auto;\n  font-size: 1rem;\n}\n.ui.mini.images .image,\n.ui.mini.images img,\n.ui.mini.images svg,\n.ui.mini.image {\n  width: 35px;\n  height: auto;\n  font-size: 0.78571429rem;\n}\n.ui.tiny.images .image,\n.ui.tiny.images img,\n.ui.tiny.images svg,\n.ui.tiny.image {\n  width: 80px;\n  height: auto;\n  font-size: 0.85714286rem;\n}\n.ui.small.images .image,\n.ui.small.images img,\n.ui.small.images svg,\n.ui.small.image {\n  width: 150px;\n  height: auto;\n  font-size: 0.92857143rem;\n}\n.ui.large.images .image,\n.ui.large.images img,\n.ui.large.images svg,\n.ui.large.image {\n  width: 450px;\n  height: auto;\n  font-size: 1.14285714rem;\n}\n.ui.big.images .image,\n.ui.big.images img,\n.ui.big.images svg,\n.ui.big.image {\n  width: 600px;\n  height: auto;\n  font-size: 1.28571429rem;\n}\n.ui.huge.images .image,\n.ui.huge.images img,\n.ui.huge.images svg,\n.ui.huge.image {\n  width: 800px;\n  height: auto;\n  font-size: 1.42857143rem;\n}\n.ui.massive.images .image,\n.ui.massive.images img,\n.ui.massive.images svg,\n.ui.massive.image {\n  width: 960px;\n  height: auto;\n  font-size: 1.71428571rem;\n}\n\n\n/*******************************\n                  Groups\n    *******************************/\n\n.ui.images {\n  font-size: 0;\n  margin: 0 -0.25rem;\n}\n.ui.images .image,\n.ui.images > img,\n.ui.images > svg {\n  display: inline-block;\n  margin: 0 0.25rem 0.5rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/input.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Input\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n           Standard\n*******************************/\n\n\n/* --------------------\n        Inputs\n--------------------- */\n.ui.input {\n  position: relative;\n  font-weight: normal;\n  font-style: normal;\n  display: inline-flex;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.input > input {\n  margin: 0;\n  max-width: 100%;\n  flex: 1 1 auto;\n  outline: none;\n  -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n  text-align: left;\n  line-height: 1.21428571em;\n  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\";\n  background: #fff;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  color: rgba(0, 0, 0, 0.87);\n  border-radius: 0.28571429rem;\n  transition: box-shadow 0.1s ease, border-color 0.1s ease;\n  box-shadow: none;\n}\n.ui.input > input:not([type=\"color\"]) {\n  padding: 0.67857143em 1em;\n}\n.ui.input > input::-webkit-calendar-picker-indicator {\n  padding: 0;\n  opacity: 0.5;\n  -webkit-transition: opacity 0.3s ease;\n  transition: opacity 0.3s ease;\n  cursor: pointer;\n}\n\n/* --------------------\n      Placeholder\n--------------------- */\n\n/* browsers require these rules separate */\n.ui.input > input:-ms-input-placeholder {\n  color: rgba(191, 191, 191, 0.87);\n}\n.ui.input > input::-ms-input-placeholder {\n  color: rgba(191, 191, 191, 0.87);\n}\n.ui.input > input::placeholder {\n  color: rgba(191, 191, 191, 0.87);\n}\n.ui.input > input::-moz-placeholder {\n  opacity: 1;\n}\n.ui.input > input:-ms-input-placeholder {\n  color: rgba(191, 191, 191, 0.87);\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------------\n            Disabled\n    --------------------- */\n.ui.disabled.input,\n.ui.input:not(.disabled) input[disabled] {\n  opacity: 0.45;\n}\n.ui.disabled.input > input,\n.ui.input:not(.disabled) input[disabled] {\n  pointer-events: none;\n}\n\n/* --------------------\n        Active\n--------------------- */\n.ui.input > input:active,\n.ui.input.down input {\n  border-color: rgba(0, 0, 0, 0.3);\n  background: #fafafa;\n  color: rgba(0, 0, 0, 0.87);\n  box-shadow: none;\n}\n.ui.form .field > textarea:hover:not(:focus),\n.ui.input > textarea:hover:not(:focus),\n.ui.form .field > input:hover:not(:focus),\n.ui.input > input:hover:not(:focus) {\n  border-color: rgba(34, 36, 38, 0.35);\n}\n\n/* --------------------\n           Loading\n    --------------------- */\n.ui.ui.loading.input > i.icon::before {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -0.64285714em 0 0 -0.64285714em;\n  width: 1.28571429em;\n  height: 1.28571429em;\n  border-radius: 500rem;\n  border: 0.2em solid rgba(0, 0, 0, 0.1);\n}\n.ui.ui.loading.input > i.icon::after {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -0.64285714em 0 0 -0.64285714em;\n  width: 1.28571429em;\n  height: 1.28571429em;\n  animation: loader 0.6s infinite linear;\n  border: 0.2em solid #767676;\n  border-radius: 500rem;\n  box-shadow: 0 0 0 1px transparent;\n}\n\n/* --------------------\n        Focus\n--------------------- */\n.ui.input.focus > input,\n.ui.input > input:focus {\n  border-color: #85b7d9;\n  background: #fff;\n  color: rgba(0, 0, 0, 0.8);\n  box-shadow: none;\n}\n.ui.input.focus > input:-ms-input-placeholder, .ui.input > input:focus:-ms-input-placeholder {\n  color: rgba(115, 115, 115, 0.87);\n}\n.ui.input.focus > input::-ms-input-placeholder, .ui.input > input:focus::-ms-input-placeholder {\n  color: rgba(115, 115, 115, 0.87);\n}\n.ui.input.focus > input::placeholder,\n.ui.input > input:focus::placeholder {\n  color: rgba(115, 115, 115, 0.87);\n}\n.ui.input.focus > input:-ms-input-placeholder,\n.ui.input > input:focus:-ms-input-placeholder {\n  color: rgba(115, 115, 115, 0.87);\n}\n\n/* --------------------\n            States\n    --------------------- */\n.ui.input.error > input {\n  background-color: #fff6f6;\n  border-color: #e0b4b4;\n  color: #9f3a38;\n  box-shadow: none;\n}\n\n/* Placeholder */\n.ui.input.error > input:-ms-input-placeholder {\n  color: #e7bdbc;\n}\n.ui.input.error > input::-ms-input-placeholder {\n  color: #e7bdbc;\n}\n.ui.input.error > input::placeholder {\n  color: #e7bdbc;\n}\n.ui.input.error > input:-ms-input-placeholder {\n  color: #e7bdbc !important;\n}\n\n/* Focused Placeholder */\n.ui.input.error > input:focus:-ms-input-placeholder {\n  color: #da9796;\n}\n.ui.input.error > input:focus::-ms-input-placeholder {\n  color: #da9796;\n}\n.ui.input.error > input:focus::placeholder {\n  color: #da9796;\n}\n.ui.input.error > input:focus:-ms-input-placeholder {\n  color: #da9796 !important;\n}\n.ui.input.info > input {\n  background-color: #f8ffff;\n  border-color: #a9d5de;\n  color: #276f86;\n  box-shadow: none;\n}\n\n/* Placeholder */\n.ui.input.info > input:-ms-input-placeholder {\n  color: #98cfe1;\n}\n.ui.input.info > input::-ms-input-placeholder {\n  color: #98cfe1;\n}\n.ui.input.info > input::placeholder {\n  color: #98cfe1;\n}\n.ui.input.info > input:-ms-input-placeholder {\n  color: #98cfe1 !important;\n}\n\n/* Focused Placeholder */\n.ui.input.info > input:focus:-ms-input-placeholder {\n  color: #70bdd6;\n}\n.ui.input.info > input:focus::-ms-input-placeholder {\n  color: #70bdd6;\n}\n.ui.input.info > input:focus::placeholder {\n  color: #70bdd6;\n}\n.ui.input.info > input:focus:-ms-input-placeholder {\n  color: #70bdd6 !important;\n}\n.ui.input.success > input {\n  background-color: #fcfff5;\n  border-color: #a3c293;\n  color: #2c662d;\n  box-shadow: none;\n}\n\n/* Placeholder */\n.ui.input.success > input:-ms-input-placeholder {\n  color: #8fcf90;\n}\n.ui.input.success > input::-ms-input-placeholder {\n  color: #8fcf90;\n}\n.ui.input.success > input::placeholder {\n  color: #8fcf90;\n}\n.ui.input.success > input:-ms-input-placeholder {\n  color: #8fcf90 !important;\n}\n\n/* Focused Placeholder */\n.ui.input.success > input:focus:-ms-input-placeholder {\n  color: #6cbf6d;\n}\n.ui.input.success > input:focus::-ms-input-placeholder {\n  color: #6cbf6d;\n}\n.ui.input.success > input:focus::placeholder {\n  color: #6cbf6d;\n}\n.ui.input.success > input:focus:-ms-input-placeholder {\n  color: #6cbf6d !important;\n}\n.ui.input.warning > input {\n  background-color: #fffaf3;\n  border-color: #c9ba9b;\n  color: #573a08;\n  box-shadow: none;\n}\n\n/* Placeholder */\n.ui.input.warning > input:-ms-input-placeholder {\n  color: #edad3e;\n}\n.ui.input.warning > input::-ms-input-placeholder {\n  color: #edad3e;\n}\n.ui.input.warning > input::placeholder {\n  color: #edad3e;\n}\n.ui.input.warning > input:-ms-input-placeholder {\n  color: #edad3e !important;\n}\n\n/* Focused Placeholder */\n.ui.input.warning > input:focus:-ms-input-placeholder {\n  color: #e39715;\n}\n.ui.input.warning > input:focus::-ms-input-placeholder {\n  color: #e39715;\n}\n.ui.input.warning > input:focus::placeholder {\n  color: #e39715;\n}\n.ui.input.warning > input:focus:-ms-input-placeholder {\n  color: #e39715 !important;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------------\n          Transparent\n    --------------------- */\n.ui.transparent.input > textarea,\n.ui.transparent.input > input {\n  border-color: transparent !important;\n  background-color: transparent !important;\n  padding: 0;\n  box-shadow: none !important;\n  border-radius: 0 !important;\n}\n.field .ui.transparent.input > textarea {\n  padding: 0.67857143em 1em;\n}\n\n/* Transparent Icon */\n:not(.field) > .ui.transparent.icon.input > i.icon {\n  width: 1.1em;\n}\n:not(.field) > .ui.ui.ui.transparent.icon.input > input {\n  padding-left: 0;\n  padding-right: 2em;\n}\n:not(.field) > .ui.ui.ui.transparent[class*=\"left icon\"].input > input {\n  padding-left: 2em;\n  padding-right: 0;\n}\n\n/* Transparent Inverted */\n.ui.transparent.inverted.input {\n  color: #fff;\n}\n.ui.ui.transparent.inverted.input > textarea,\n.ui.ui.transparent.inverted.input > input {\n  color: inherit;\n}\n.ui.transparent.inverted.input > input:-ms-input-placeholder {\n  color: rgba(255, 255, 255, 0.5);\n}\n.ui.transparent.inverted.input > input::-ms-input-placeholder {\n  color: rgba(255, 255, 255, 0.5);\n}\n.ui.transparent.inverted.input > input::placeholder {\n  color: rgba(255, 255, 255, 0.5);\n}\n.ui.transparent.inverted.input > input:-ms-input-placeholder {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n/* --------------------\n             Icon\n    --------------------- */\n.ui.icon.input > i.icon {\n  cursor: default;\n  position: absolute;\n  line-height: 1;\n  text-align: center;\n  top: 0;\n  right: 0;\n  margin: 0;\n  height: 100%;\n  width: 2.67142857em;\n  opacity: 0.5;\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n  transition: opacity 0.3s ease;\n}\n.ui.icon.input > i.icon:not(.link) {\n  pointer-events: none;\n}\n.ui.ui.ui.ui.icon.input:not(.corner) > textarea,\n.ui.ui.ui.ui.icon.input:not(.corner) > input {\n  padding-right: 2.67142857em;\n}\n.ui.icon.input > i.icon::before,\n.ui.icon.input > i.icon::after {\n  left: 0;\n  position: absolute;\n  text-align: center;\n  top: 50%;\n  width: 100%;\n  margin-top: -0.5em;\n}\n.ui.icon.input > i.link.icon {\n  cursor: pointer;\n}\n.ui.icon.input > i.circular.icon {\n  top: 0.35em;\n  right: 0.5em;\n}\n\n/* Left Icon Input */\n.ui[class*=\"left icon\"].input > i.icon {\n  right: auto;\n  left: 1px;\n  border-radius: 0.28571429rem 0 0 0.28571429rem;\n}\n.ui[class*=\"left icon\"].input > i.circular.icon {\n  right: auto;\n  left: 0.5em;\n}\n.ui.ui.ui.ui[class*=\"left icon\"]:not([class*=\"left corner\"]).input > textarea,\n.ui.ui.ui.ui[class*=\"left icon\"]:not([class*=\"left corner\"]).input > input {\n  padding-left: 2.67142857em;\n}\n.ui.ui.ui.ui[class*=\"left icon\"]:not(.corner).input > textarea,\n.ui.ui.ui.ui[class*=\"left icon\"]:not(.corner).input > input {\n  padding-right: 1em;\n}\n\n/* Focus */\n.ui.input > input:focus::-webkit-calendar-picker-indicator,\n.ui.icon.input > textarea:focus ~ i.icon,\n.ui.icon.input > input:focus ~ i.icon {\n  opacity: 1;\n}\n\n/* --------------------\n            Labeled\n    --------------------- */\n\n/* Adjacent Label */\n.ui.labeled.input > .label {\n  flex: 0 0 auto;\n  margin: 0;\n  font-size: 1em;\n}\n.ui.labeled.input > .label:not(.corner) {\n  padding-top: 0.78571429em;\n  padding-bottom: 0.78571429em;\n}\n\n/* Regular Label on Left */\n.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child + input {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n  border-left-color: transparent;\n}\n.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child + input:focus {\n  border-left-color: #85b7d9;\n}\n\n/* Regular Label on Right */\n.ui[class*=\"right labeled\"].input > input {\n  border-top-right-radius: 0 !important;\n  border-bottom-right-radius: 0 !important;\n  border-right-color: transparent !important;\n}\n.ui[class*=\"right labeled\"].input > input + .label {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ui[class*=\"right labeled\"].input > input:focus {\n  border-right-color: #85b7d9 !important;\n}\n\n/* Corner Label */\n.ui.labeled.input .corner.label {\n  top: 1px;\n  right: 1px;\n  font-size: 0.64285714em;\n  border-radius: 0 0.28571429rem 0 0;\n}\n\n/* Spacing with corner label */\n.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).input > .ui.dropdown,\n.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).input > textarea,\n.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).input > input {\n  padding-right: 2.5em;\n}\n.ui[class*=\"corner labeled\"].icon.input:not([class*=\"left corner labeled\"]) > .ui.dropdown,\n.ui[class*=\"corner labeled\"].icon.input:not([class*=\"left corner labeled\"]) > textarea,\n.ui[class*=\"corner labeled\"].icon.input:not([class*=\"left corner labeled\"]) > input {\n  padding-right: 3.25em;\n}\n.ui[class*=\"corner labeled\"].icon.input:not([class*=\"left corner labeled\"]) > i.icon {\n  margin-right: 1.25em;\n}\n\n/* Left Labeled */\n.ui[class*=\"left icon\"].input > .ui.dropdown:first-child,\n.ui[class*=\"left icon\"].input > i.icon + .ui.dropdown,\n.ui[class*=\"left corner labeled\"].input > .ui.dropdown,\n.ui[class*=\"left corner labeled\"].input > textarea,\n.ui[class*=\"left corner labeled\"].input > input {\n  padding-left: 2.5em;\n}\n.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"])[class*=\"left icon\"].input > .ui.dropdown,\n.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"])[class*=\"left icon\"].input > textarea,\n.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"])[class*=\"left icon\"].input > input {\n  padding-right: 3.25em;\n}\n.ui.ui[class*=\"left corner labeled\"][class*=\"left icon\"].input > .ui.dropdown,\n.ui.ui[class*=\"left corner labeled\"][class*=\"left icon\"].input > textarea,\n.ui.ui[class*=\"left corner labeled\"][class*=\"left icon\"].input > input {\n  padding-left: 4em;\n}\n.ui[class*=\"left corner labeled\"].icon.input > i.icon {\n  margin-left: 1.25em;\n}\n.ui[class*=\"left corner labeled\"].icon:not([class*=\"left icon\"]).input > input {\n  padding-right: 2.5em;\n}\n.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).icon:not([class*=\"left icon\"]).input > input {\n  padding-right: 5em;\n}\n.ui[class*=\"left icon\"].input > .ui.dropdown > .search,\n.ui[class*=\"left corner labeled\"].input > .ui.dropdown > .search {\n  padding-left: 2.5em;\n}\n.ui[class*=\"left icon\"].input > .ui.dropdown > .menu,\n.ui[class*=\"left corner labeled\"].input > .ui.dropdown > .menu {\n  padding-left: 1.25em;\n}\n.ui[class*=\"left icon\"].input > .ui.dropdown > .menu > .item,\n.ui[class*=\"left corner labeled\"].input > .ui.dropdown > .menu > .item {\n  padding-left: 2.5em;\n  margin-left: -1.25em;\n}\n.ui[class*=\"left corner labeled\"][class*=\"left icon\"].input > .ui.dropdown > .search {\n  padding-left: 4em;\n}\n.ui[class*=\"left corner labeled\"][class*=\"left icon\"].input > .ui.dropdown > .menu > .item {\n  padding-left: 4em;\n}\n.ui.icon.input:not([class*=\"left icon\"]) > .ui.dropdown > .search,\n.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).input > .ui.dropdown > .search {\n  padding-right: 5.75em;\n}\n.ui.icon.input:not([class*=\"left icon\"]) > .ui.dropdown > .remove.icon,\n.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).input > .ui.dropdown > .remove.icon,\n.ui.icon.input:not([class*=\"left icon\"]) > .ui.dropdown > .dropdown.icon,\n.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).input > .ui.dropdown > .dropdown.icon {\n  padding-right: 2.5em;\n}\n@supports selector(:has(.f)) {\n  .ui.icon.input:not([class*=\"left icon\"]) > .ui.dropdown > .dropdown.icon {\n    padding-right: initial;\n  }\n  .ui.icon.input:not([class*=\"left icon\"]):not(:has(.ui.dropdown ~ input)) > .ui.dropdown > .dropdown.icon {\n    padding-right: 2.5em;\n  }\n}\n.ui.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).icon:not([class*=\"left icon\"]).input > .ui.dropdown > .search {\n  padding-right: 7.25em;\n}\n.ui.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).icon:not([class*=\"left icon\"]).input > .ui.dropdown > .remove.icon,\n.ui.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).icon:not([class*=\"left icon\"]).input > .ui.dropdown > .dropdown.icon {\n  padding-right: 4em;\n}\n.ui.icon.input > .ui.visible.dropdown ~ i.icon,\n.ui.icon.input > .ui.active.dropdown ~ i.icon,\n.ui[class*=\"corner labeled\"].input > .ui.visible.dropdown ~ .ui.corner.label,\n.ui[class*=\"corner labeled\"].input > .ui.active.dropdown ~ .ui.corner.label {\n  z-index: 10;\n}\n.ui.icon.input > textarea ~ i.icon {\n  height: 3em;\n}\n:not(.field) > .ui.transparent.icon.input > textarea ~ i.icon {\n  height: 1.3em;\n}\n\n/* Corner Label Position */\n.ui.input > .ui.corner.label {\n  top: 1px;\n  right: 1px;\n}\n.ui.input > .ui.left.corner.label {\n  right: auto;\n  left: 1px;\n}\n\n/* Labeled and action input states */\n.ui.form .field.error > .ui.action.input > .ui.button,\n.ui.form .field.error > .ui.labeled.input:not([class*=\"corner labeled\"]) > .ui.label,\n.ui.action.input.error > .ui.button,\n.ui.labeled.input.error:not([class*=\"corner labeled\"]) > .ui.label {\n  border-top: 1px solid #e0b4b4;\n  border-bottom: 1px solid #e0b4b4;\n}\n.ui.form .field.error > .ui[class*=\"left action\"].input > .ui.button,\n.ui.form .field.error > .ui.labeled.input:not(.right):not([class*=\"corner labeled\"]) > .ui.label,\n.ui[class*=\"left action\"].input.error > .ui.button,\n.ui.labeled.input.error:not(.right):not([class*=\"corner labeled\"]) > .ui.label {\n  border-left: 1px solid #e0b4b4;\n}\n.ui.form .field.error > .ui.action.input:not([class*=\"left action\"]) > input + .ui.button,\n.ui.form .field.error > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > input + .ui.label,\n.ui.action.input.error:not([class*=\"left action\"]) > input + .ui.button,\n.ui.right.labeled.input.error:not([class*=\"corner labeled\"]) > input + .ui.label,\n.ui.form .field.error > .ui.action.input:not([class*=\"left action\"]) > textarea + .ui.button,\n.ui.form .field.error > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > textarea + .ui.label,\n.ui.action.input.error:not([class*=\"left action\"]) > textarea + .ui.button,\n.ui.right.labeled.input.error:not([class*=\"corner labeled\"]) > textarea + .ui.label {\n  border-right: 1px solid #e0b4b4;\n}\n.ui.form .field.error > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > .ui.label:first-child,\n.ui.right.labeled.input.error:not([class*=\"corner labeled\"]) > .ui.label:first-child {\n  border-left: 1px solid #e0b4b4;\n}\n.ui.form .field.info > .ui.action.input > .ui.button,\n.ui.form .field.info > .ui.labeled.input:not([class*=\"corner labeled\"]) > .ui.label,\n.ui.action.input.info > .ui.button,\n.ui.labeled.input.info:not([class*=\"corner labeled\"]) > .ui.label {\n  border-top: 1px solid #a9d5de;\n  border-bottom: 1px solid #a9d5de;\n}\n.ui.form .field.info > .ui[class*=\"left action\"].input > .ui.button,\n.ui.form .field.info > .ui.labeled.input:not(.right):not([class*=\"corner labeled\"]) > .ui.label,\n.ui[class*=\"left action\"].input.info > .ui.button,\n.ui.labeled.input.info:not(.right):not([class*=\"corner labeled\"]) > .ui.label {\n  border-left: 1px solid #a9d5de;\n}\n.ui.form .field.info > .ui.action.input:not([class*=\"left action\"]) > input + .ui.button,\n.ui.form .field.info > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > input + .ui.label,\n.ui.action.input.info:not([class*=\"left action\"]) > input + .ui.button,\n.ui.right.labeled.input.info:not([class*=\"corner labeled\"]) > input + .ui.label,\n.ui.form .field.info > .ui.action.input:not([class*=\"left action\"]) > textarea + .ui.button,\n.ui.form .field.info > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > textarea + .ui.label,\n.ui.action.input.info:not([class*=\"left action\"]) > textarea + .ui.button,\n.ui.right.labeled.input.info:not([class*=\"corner labeled\"]) > textarea + .ui.label {\n  border-right: 1px solid #a9d5de;\n}\n.ui.form .field.info > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > .ui.label:first-child,\n.ui.right.labeled.input.info:not([class*=\"corner labeled\"]) > .ui.label:first-child {\n  border-left: 1px solid #a9d5de;\n}\n.ui.form .field.success > .ui.action.input > .ui.button,\n.ui.form .field.success > .ui.labeled.input:not([class*=\"corner labeled\"]) > .ui.label,\n.ui.action.input.success > .ui.button,\n.ui.labeled.input.success:not([class*=\"corner labeled\"]) > .ui.label {\n  border-top: 1px solid #a3c293;\n  border-bottom: 1px solid #a3c293;\n}\n.ui.form .field.success > .ui[class*=\"left action\"].input > .ui.button,\n.ui.form .field.success > .ui.labeled.input:not(.right):not([class*=\"corner labeled\"]) > .ui.label,\n.ui[class*=\"left action\"].input.success > .ui.button,\n.ui.labeled.input.success:not(.right):not([class*=\"corner labeled\"]) > .ui.label {\n  border-left: 1px solid #a3c293;\n}\n.ui.form .field.success > .ui.action.input:not([class*=\"left action\"]) > input + .ui.button,\n.ui.form .field.success > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > input + .ui.label,\n.ui.action.input.success:not([class*=\"left action\"]) > input + .ui.button,\n.ui.right.labeled.input.success:not([class*=\"corner labeled\"]) > input + .ui.label,\n.ui.form .field.success > .ui.action.input:not([class*=\"left action\"]) > textarea + .ui.button,\n.ui.form .field.success > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > textarea + .ui.label,\n.ui.action.input.success:not([class*=\"left action\"]) > textarea + .ui.button,\n.ui.right.labeled.input.success:not([class*=\"corner labeled\"]) > textarea + .ui.label {\n  border-right: 1px solid #a3c293;\n}\n.ui.form .field.success > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > .ui.label:first-child,\n.ui.right.labeled.input.success:not([class*=\"corner labeled\"]) > .ui.label:first-child {\n  border-left: 1px solid #a3c293;\n}\n.ui.form .field.warning > .ui.action.input > .ui.button,\n.ui.form .field.warning > .ui.labeled.input:not([class*=\"corner labeled\"]) > .ui.label,\n.ui.action.input.warning > .ui.button,\n.ui.labeled.input.warning:not([class*=\"corner labeled\"]) > .ui.label {\n  border-top: 1px solid #c9ba9b;\n  border-bottom: 1px solid #c9ba9b;\n}\n.ui.form .field.warning > .ui[class*=\"left action\"].input > .ui.button,\n.ui.form .field.warning > .ui.labeled.input:not(.right):not([class*=\"corner labeled\"]) > .ui.label,\n.ui[class*=\"left action\"].input.warning > .ui.button,\n.ui.labeled.input.warning:not(.right):not([class*=\"corner labeled\"]) > .ui.label {\n  border-left: 1px solid #c9ba9b;\n}\n.ui.form .field.warning > .ui.action.input:not([class*=\"left action\"]) > input + .ui.button,\n.ui.form .field.warning > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > input + .ui.label,\n.ui.action.input.warning:not([class*=\"left action\"]) > input + .ui.button,\n.ui.right.labeled.input.warning:not([class*=\"corner labeled\"]) > input + .ui.label,\n.ui.form .field.warning > .ui.action.input:not([class*=\"left action\"]) > textarea + .ui.button,\n.ui.form .field.warning > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > textarea + .ui.label,\n.ui.action.input.warning:not([class*=\"left action\"]) > textarea + .ui.button,\n.ui.right.labeled.input.warning:not([class*=\"corner labeled\"]) > textarea + .ui.label {\n  border-right: 1px solid #c9ba9b;\n}\n.ui.form .field.warning > .ui.right.labeled.input:not([class*=\"corner labeled\"]) > .ui.label:first-child,\n.ui.right.labeled.input.warning:not([class*=\"corner labeled\"]) > .ui.label:first-child {\n  border-left: 1px solid #c9ba9b;\n}\n\n/* --------------------\n            Action\n    --------------------- */\n.ui.action.input > .button,\n.ui.action.input > .buttons {\n  display: flex;\n  align-items: center;\n  flex: 0 0 auto;\n}\n.ui.action.input > .button,\n.ui.action.input > .buttons > .button {\n  padding-top: 0.78571429em;\n  padding-bottom: 0.78571429em;\n  margin: 0;\n}\n\n/* Input when ui Left */\n.ui[class*=\"left action\"].input > input,\n.ui[class*=\"left action\"].input > textarea {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n  border-left-color: transparent;\n}\n\n/* Input when ui Right */\n.ui.action.input:not([class*=\"left action\"]) > input,\n.ui.action.input:not([class*=\"left action\"]) > textarea {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  border-right-color: transparent;\n}\n\n/* Button and Dropdown */\n.ui.action.input > .dropdown:first-child,\n.ui.action.input > .button:first-child,\n.ui.action.input > .buttons:first-child > .button {\n  border-radius: 0.28571429rem 0 0 0.28571429rem;\n}\n.ui.action.input > .dropdown:not(:first-child),\n.ui.action.input > .button:not(:first-child),\n.ui.action.input > .buttons:not(:first-child) > .button {\n  border-radius: 0;\n}\n.ui.action.input > .dropdown:last-child,\n.ui.action.input > .button:last-child,\n.ui.action.input > .buttons:last-child > .button {\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n}\n\n/* Input Focus */\n.ui.action.input:not([class*=\"left action\"]) > input:focus,\n.ui.action.input:not([class*=\"left action\"]) > textarea:focus {\n  border-right-color: #85b7d9;\n}\n.ui.ui[class*=\"left action\"].input > input:focus,\n.ui.ui[class*=\"left action\"].input > textarea:focus {\n  border-left-color: #85b7d9;\n}\n\n/* --------------------\n           Inverted\n    --------------------- */\n\n/* Standard */\n.ui.inverted.input > input {\n  border: none;\n}\n\n/* --------------------\n            Fluid\n    --------------------- */\n.ui.fluid.input {\n  display: flex;\n}\n.ui.fluid.input > input {\n  width: 0 !important;\n}\n\n/* --------------------\n            File\n    --------------------- */\n\n/* width hack for chrome/edge */\n.ui.file.input {\n  width: 100%;\n}\n.ui.file.input input[type=\"file\"] {\n  width: 0;\n}\n.ui.form .field > input[type=\"file\"],\n.ui.file.input:not(.action) input[type=\"file\"] {\n  padding: 0;\n}\n.ui.action.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  display: none;\n}\n.ui.form .field input[type=\"file\"]::-webkit-file-upload-button,\n.ui.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  border: none;\n  cursor: pointer;\n  padding: 0.67857143em 1em;\n  margin-right: 1em;\n  background: #e0e1e2;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.form .field input[type=\"file\"]::-webkit-file-upload-button:hover,\n.ui.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #cacbcd;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.action.file.input input[type=\"file\"]::-ms-browse {\n  display: none;\n}\n.ui.form .field input[type=\"file\"]::-ms-browse,\n.ui.file.input input[type=\"file\"]::-ms-browse {\n  border: none;\n  cursor: pointer;\n  padding: 0.67857143em 1em;\n  margin: 0;\n  background: #e0e1e2;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.form .field input[type=\"file\"]::-ms-browse:hover,\n.ui.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #cacbcd;\n  color: rgba(0, 0, 0, 0.6);\n}\n\n/* IE needs additional styling for input field :S */\n@media all and (-ms-high-contrast: none) {\n  .ui.file.input > input[type=\"file\"],\n  input[type=\"file\"].ui.file.input {\n    padding: 0 !important;\n  }\n}\n.ui.action.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  display: none;\n}\n.ui.action.file.input input[type=\"file\"]::file-selector-button {\n  display: none;\n}\n.ui.form .field input[type=\"file\"]::-webkit-file-upload-button, .ui.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  border: none;\n  cursor: pointer;\n  padding: 0.67857143em 1em;\n  margin-right: 1em;\n  background: #e0e1e2;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.form .field input[type=\"file\"]::file-selector-button,\n.ui.file.input input[type=\"file\"]::file-selector-button {\n  border: none;\n  cursor: pointer;\n  padding: 0.67857143em 1em;\n  margin-right: 1em;\n  background: #e0e1e2;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.form .field input[type=\"file\"]::-webkit-file-upload-button:hover, .ui.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #cacbcd;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.form .field input[type=\"file\"]::file-selector-button:hover,\n.ui.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #cacbcd;\n  color: rgba(0, 0, 0, 0.6);\n}\ninput[type=\"file\"].ui.invisible.file.input,\n.ui.invisible.file.input input[type=\"file\"] {\n  left: -99999px;\n  position: absolute;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.button:not(.basic):not(.tertiary) {\n  background: #cacbcd;\n  color: rgba(0, 0, 0, 0.8);\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.button:not(.basic):not(.tertiary).inverted {\n  background: #fff;\n}\n\n/* this is related to existing buttons, so the button color variable is used here! */\ninput[type=\"file\"].ui.file.input:focus + label.ui.primary.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.primary.button:not(.basic):not(.tertiary) {\n  background-color: #1678c2;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.primary.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.primary.button:not(.basic):not(.tertiary).inverted {\n  background-color: #21b8ff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.secondary.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.secondary.button:not(.basic):not(.tertiary) {\n  background-color: #27292a;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.secondary.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.secondary.button:not(.basic):not(.tertiary).inverted {\n  background-color: #6e6e6e;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.red.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.red.button:not(.basic):not(.tertiary) {\n  background-color: #d01919;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.red.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.red.button:not(.basic):not(.tertiary).inverted {\n  background-color: #ff392b;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.orange.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.orange.button:not(.basic):not(.tertiary) {\n  background-color: #f26202;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.orange.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.orange.button:not(.basic):not(.tertiary).inverted {\n  background-color: #e76b00;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.yellow.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.yellow.button:not(.basic):not(.tertiary) {\n  background-color: #eaae00;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.yellow.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.yellow.button:not(.basic):not(.tertiary).inverted {\n  background-color: #ebcd00;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.olive.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.olive.button:not(.basic):not(.tertiary) {\n  background-color: #a7bd0d;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.olive.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.olive.button:not(.basic):not(.tertiary).inverted {\n  background-color: #d2e745;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.green.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.green.button:not(.basic):not(.tertiary) {\n  background-color: #16ab39;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.green.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.green.button:not(.basic):not(.tertiary).inverted {\n  background-color: #1ea92e;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.teal.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.teal.button:not(.basic):not(.tertiary) {\n  background-color: #009c95;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.teal.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.teal.button:not(.basic):not(.tertiary).inverted {\n  background-color: #3affff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.blue.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.blue.button:not(.basic):not(.tertiary) {\n  background-color: #1678c2;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.blue.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.blue.button:not(.basic):not(.tertiary).inverted {\n  background-color: #21b8ff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.violet.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.violet.button:not(.basic):not(.tertiary) {\n  background-color: #5829bb;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.violet.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.violet.button:not(.basic):not(.tertiary).inverted {\n  background-color: #745aff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.purple.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.purple.button:not(.basic):not(.tertiary) {\n  background-color: #9627ba;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.purple.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.purple.button:not(.basic):not(.tertiary).inverted {\n  background-color: #cf40ff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.pink.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.pink.button:not(.basic):not(.tertiary) {\n  background-color: #e61a8d;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.pink.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.pink.button:not(.basic):not(.tertiary).inverted {\n  background-color: #ff5bd1;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.brown.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.brown.button:not(.basic):not(.tertiary) {\n  background-color: #975b33;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.brown.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.brown.button:not(.basic):not(.tertiary).inverted {\n  background-color: #b0620f;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.grey.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.grey.button:not(.basic):not(.tertiary) {\n  background-color: #838383;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.grey.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.grey.button:not(.basic):not(.tertiary).inverted {\n  background-color: #c2c4c5;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.black.button:not(.basic):not(.tertiary),\n.ui.file.input input[type=\"file\"]:focus + label.ui.black.button:not(.basic):not(.tertiary) {\n  background-color: #27292a;\n  color: #fff;\n}\ninput[type=\"file\"].ui.file.input:focus + label.ui.black.button:not(.basic):not(.tertiary).inverted,\n.ui.file.input input[type=\"file\"]:focus + label.ui.black.button:not(.basic):not(.tertiary).inverted {\n  background-color: #000000;\n}\ninput[type=\"file\"].ui.primary.file.input::-webkit-file-upload-button,\n.ui.primary.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #2185d0;\n  color: #fff;\n}\ninput[type=\"file\"].ui.primary.file.input::-webkit-file-upload-button:hover,\n.ui.primary.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #1678c2;\n}\ninput[type=\"file\"].ui.primary.file.input::-ms-browse,\n.ui.primary.file.input input[type=\"file\"]::-ms-browse {\n  background: #2185d0;\n  color: #fff;\n}\ninput[type=\"file\"].ui.primary.file.input::-ms-browse:hover,\n.ui.primary.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #1678c2;\n}\ninput[type=\"file\"].ui.primary.file.input::-webkit-file-upload-button, .ui.primary.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #2185d0;\n  color: #fff;\n}\ninput[type=\"file\"].ui.primary.file.input::file-selector-button,\n.ui.primary.file.input input[type=\"file\"]::file-selector-button {\n  background: #2185d0;\n  color: #fff;\n}\ninput[type=\"file\"].ui.primary.file.input::-webkit-file-upload-button:hover, .ui.primary.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #1678c2;\n}\ninput[type=\"file\"].ui.primary.file.input::file-selector-button:hover,\n.ui.primary.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #1678c2;\n}\ninput[type=\"file\"].ui.secondary.file.input::-webkit-file-upload-button,\n.ui.secondary.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #1b1c1d;\n  color: #fff;\n}\ninput[type=\"file\"].ui.secondary.file.input::-webkit-file-upload-button:hover,\n.ui.secondary.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #27292a;\n}\ninput[type=\"file\"].ui.secondary.file.input::-ms-browse,\n.ui.secondary.file.input input[type=\"file\"]::-ms-browse {\n  background: #1b1c1d;\n  color: #fff;\n}\ninput[type=\"file\"].ui.secondary.file.input::-ms-browse:hover,\n.ui.secondary.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #27292a;\n}\ninput[type=\"file\"].ui.secondary.file.input::-webkit-file-upload-button, .ui.secondary.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #1b1c1d;\n  color: #fff;\n}\ninput[type=\"file\"].ui.secondary.file.input::file-selector-button,\n.ui.secondary.file.input input[type=\"file\"]::file-selector-button {\n  background: #1b1c1d;\n  color: #fff;\n}\ninput[type=\"file\"].ui.secondary.file.input::-webkit-file-upload-button:hover, .ui.secondary.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #27292a;\n}\ninput[type=\"file\"].ui.secondary.file.input::file-selector-button:hover,\n.ui.secondary.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #27292a;\n}\ninput[type=\"file\"].ui.red.file.input::-webkit-file-upload-button,\n.ui.red.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #db2828;\n  color: #fff;\n}\ninput[type=\"file\"].ui.red.file.input::-webkit-file-upload-button:hover,\n.ui.red.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #d01919;\n}\ninput[type=\"file\"].ui.red.file.input::-ms-browse,\n.ui.red.file.input input[type=\"file\"]::-ms-browse {\n  background: #db2828;\n  color: #fff;\n}\ninput[type=\"file\"].ui.red.file.input::-ms-browse:hover,\n.ui.red.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #d01919;\n}\ninput[type=\"file\"].ui.red.file.input::-webkit-file-upload-button, .ui.red.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #db2828;\n  color: #fff;\n}\ninput[type=\"file\"].ui.red.file.input::file-selector-button,\n.ui.red.file.input input[type=\"file\"]::file-selector-button {\n  background: #db2828;\n  color: #fff;\n}\ninput[type=\"file\"].ui.red.file.input::-webkit-file-upload-button:hover, .ui.red.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #d01919;\n}\ninput[type=\"file\"].ui.red.file.input::file-selector-button:hover,\n.ui.red.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #d01919;\n}\ninput[type=\"file\"].ui.orange.file.input::-webkit-file-upload-button,\n.ui.orange.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #f2711c;\n  color: #fff;\n}\ninput[type=\"file\"].ui.orange.file.input::-webkit-file-upload-button:hover,\n.ui.orange.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #f26202;\n}\ninput[type=\"file\"].ui.orange.file.input::-ms-browse,\n.ui.orange.file.input input[type=\"file\"]::-ms-browse {\n  background: #f2711c;\n  color: #fff;\n}\ninput[type=\"file\"].ui.orange.file.input::-ms-browse:hover,\n.ui.orange.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #f26202;\n}\ninput[type=\"file\"].ui.orange.file.input::-webkit-file-upload-button, .ui.orange.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #f2711c;\n  color: #fff;\n}\ninput[type=\"file\"].ui.orange.file.input::file-selector-button,\n.ui.orange.file.input input[type=\"file\"]::file-selector-button {\n  background: #f2711c;\n  color: #fff;\n}\ninput[type=\"file\"].ui.orange.file.input::-webkit-file-upload-button:hover, .ui.orange.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #f26202;\n}\ninput[type=\"file\"].ui.orange.file.input::file-selector-button:hover,\n.ui.orange.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #f26202;\n}\ninput[type=\"file\"].ui.yellow.file.input::-webkit-file-upload-button,\n.ui.yellow.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #fbbd08;\n  color: #fff;\n}\ninput[type=\"file\"].ui.yellow.file.input::-webkit-file-upload-button:hover,\n.ui.yellow.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #eaae00;\n}\ninput[type=\"file\"].ui.yellow.file.input::-ms-browse,\n.ui.yellow.file.input input[type=\"file\"]::-ms-browse {\n  background: #fbbd08;\n  color: #fff;\n}\ninput[type=\"file\"].ui.yellow.file.input::-ms-browse:hover,\n.ui.yellow.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #eaae00;\n}\ninput[type=\"file\"].ui.yellow.file.input::-webkit-file-upload-button, .ui.yellow.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #fbbd08;\n  color: #fff;\n}\ninput[type=\"file\"].ui.yellow.file.input::file-selector-button,\n.ui.yellow.file.input input[type=\"file\"]::file-selector-button {\n  background: #fbbd08;\n  color: #fff;\n}\ninput[type=\"file\"].ui.yellow.file.input::-webkit-file-upload-button:hover, .ui.yellow.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #eaae00;\n}\ninput[type=\"file\"].ui.yellow.file.input::file-selector-button:hover,\n.ui.yellow.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #eaae00;\n}\ninput[type=\"file\"].ui.olive.file.input::-webkit-file-upload-button,\n.ui.olive.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #b5cc18;\n  color: #fff;\n}\ninput[type=\"file\"].ui.olive.file.input::-webkit-file-upload-button:hover,\n.ui.olive.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #a7bd0d;\n}\ninput[type=\"file\"].ui.olive.file.input::-ms-browse,\n.ui.olive.file.input input[type=\"file\"]::-ms-browse {\n  background: #b5cc18;\n  color: #fff;\n}\ninput[type=\"file\"].ui.olive.file.input::-ms-browse:hover,\n.ui.olive.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #a7bd0d;\n}\ninput[type=\"file\"].ui.olive.file.input::-webkit-file-upload-button, .ui.olive.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #b5cc18;\n  color: #fff;\n}\ninput[type=\"file\"].ui.olive.file.input::file-selector-button,\n.ui.olive.file.input input[type=\"file\"]::file-selector-button {\n  background: #b5cc18;\n  color: #fff;\n}\ninput[type=\"file\"].ui.olive.file.input::-webkit-file-upload-button:hover, .ui.olive.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #a7bd0d;\n}\ninput[type=\"file\"].ui.olive.file.input::file-selector-button:hover,\n.ui.olive.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #a7bd0d;\n}\ninput[type=\"file\"].ui.green.file.input::-webkit-file-upload-button,\n.ui.green.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #21ba45;\n  color: #fff;\n}\ninput[type=\"file\"].ui.green.file.input::-webkit-file-upload-button:hover,\n.ui.green.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #16ab39;\n}\ninput[type=\"file\"].ui.green.file.input::-ms-browse,\n.ui.green.file.input input[type=\"file\"]::-ms-browse {\n  background: #21ba45;\n  color: #fff;\n}\ninput[type=\"file\"].ui.green.file.input::-ms-browse:hover,\n.ui.green.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #16ab39;\n}\ninput[type=\"file\"].ui.green.file.input::-webkit-file-upload-button, .ui.green.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #21ba45;\n  color: #fff;\n}\ninput[type=\"file\"].ui.green.file.input::file-selector-button,\n.ui.green.file.input input[type=\"file\"]::file-selector-button {\n  background: #21ba45;\n  color: #fff;\n}\ninput[type=\"file\"].ui.green.file.input::-webkit-file-upload-button:hover, .ui.green.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #16ab39;\n}\ninput[type=\"file\"].ui.green.file.input::file-selector-button:hover,\n.ui.green.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #16ab39;\n}\ninput[type=\"file\"].ui.teal.file.input::-webkit-file-upload-button,\n.ui.teal.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #00b5ad;\n  color: #fff;\n}\ninput[type=\"file\"].ui.teal.file.input::-webkit-file-upload-button:hover,\n.ui.teal.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #009c95;\n}\ninput[type=\"file\"].ui.teal.file.input::-ms-browse,\n.ui.teal.file.input input[type=\"file\"]::-ms-browse {\n  background: #00b5ad;\n  color: #fff;\n}\ninput[type=\"file\"].ui.teal.file.input::-ms-browse:hover,\n.ui.teal.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #009c95;\n}\ninput[type=\"file\"].ui.teal.file.input::-webkit-file-upload-button, .ui.teal.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #00b5ad;\n  color: #fff;\n}\ninput[type=\"file\"].ui.teal.file.input::file-selector-button,\n.ui.teal.file.input input[type=\"file\"]::file-selector-button {\n  background: #00b5ad;\n  color: #fff;\n}\ninput[type=\"file\"].ui.teal.file.input::-webkit-file-upload-button:hover, .ui.teal.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #009c95;\n}\ninput[type=\"file\"].ui.teal.file.input::file-selector-button:hover,\n.ui.teal.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #009c95;\n}\ninput[type=\"file\"].ui.blue.file.input::-webkit-file-upload-button,\n.ui.blue.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #2185d0;\n  color: #fff;\n}\ninput[type=\"file\"].ui.blue.file.input::-webkit-file-upload-button:hover,\n.ui.blue.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #1678c2;\n}\ninput[type=\"file\"].ui.blue.file.input::-ms-browse,\n.ui.blue.file.input input[type=\"file\"]::-ms-browse {\n  background: #2185d0;\n  color: #fff;\n}\ninput[type=\"file\"].ui.blue.file.input::-ms-browse:hover,\n.ui.blue.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #1678c2;\n}\ninput[type=\"file\"].ui.blue.file.input::-webkit-file-upload-button, .ui.blue.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #2185d0;\n  color: #fff;\n}\ninput[type=\"file\"].ui.blue.file.input::file-selector-button,\n.ui.blue.file.input input[type=\"file\"]::file-selector-button {\n  background: #2185d0;\n  color: #fff;\n}\ninput[type=\"file\"].ui.blue.file.input::-webkit-file-upload-button:hover, .ui.blue.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #1678c2;\n}\ninput[type=\"file\"].ui.blue.file.input::file-selector-button:hover,\n.ui.blue.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #1678c2;\n}\ninput[type=\"file\"].ui.violet.file.input::-webkit-file-upload-button,\n.ui.violet.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #6435c9;\n  color: #fff;\n}\ninput[type=\"file\"].ui.violet.file.input::-webkit-file-upload-button:hover,\n.ui.violet.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #5829bb;\n}\ninput[type=\"file\"].ui.violet.file.input::-ms-browse,\n.ui.violet.file.input input[type=\"file\"]::-ms-browse {\n  background: #6435c9;\n  color: #fff;\n}\ninput[type=\"file\"].ui.violet.file.input::-ms-browse:hover,\n.ui.violet.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #5829bb;\n}\ninput[type=\"file\"].ui.violet.file.input::-webkit-file-upload-button, .ui.violet.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #6435c9;\n  color: #fff;\n}\ninput[type=\"file\"].ui.violet.file.input::file-selector-button,\n.ui.violet.file.input input[type=\"file\"]::file-selector-button {\n  background: #6435c9;\n  color: #fff;\n}\ninput[type=\"file\"].ui.violet.file.input::-webkit-file-upload-button:hover, .ui.violet.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #5829bb;\n}\ninput[type=\"file\"].ui.violet.file.input::file-selector-button:hover,\n.ui.violet.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #5829bb;\n}\ninput[type=\"file\"].ui.purple.file.input::-webkit-file-upload-button,\n.ui.purple.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #a333c8;\n  color: #fff;\n}\ninput[type=\"file\"].ui.purple.file.input::-webkit-file-upload-button:hover,\n.ui.purple.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #9627ba;\n}\ninput[type=\"file\"].ui.purple.file.input::-ms-browse,\n.ui.purple.file.input input[type=\"file\"]::-ms-browse {\n  background: #a333c8;\n  color: #fff;\n}\ninput[type=\"file\"].ui.purple.file.input::-ms-browse:hover,\n.ui.purple.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #9627ba;\n}\ninput[type=\"file\"].ui.purple.file.input::-webkit-file-upload-button, .ui.purple.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #a333c8;\n  color: #fff;\n}\ninput[type=\"file\"].ui.purple.file.input::file-selector-button,\n.ui.purple.file.input input[type=\"file\"]::file-selector-button {\n  background: #a333c8;\n  color: #fff;\n}\ninput[type=\"file\"].ui.purple.file.input::-webkit-file-upload-button:hover, .ui.purple.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #9627ba;\n}\ninput[type=\"file\"].ui.purple.file.input::file-selector-button:hover,\n.ui.purple.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #9627ba;\n}\ninput[type=\"file\"].ui.pink.file.input::-webkit-file-upload-button,\n.ui.pink.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #e03997;\n  color: #fff;\n}\ninput[type=\"file\"].ui.pink.file.input::-webkit-file-upload-button:hover,\n.ui.pink.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #e61a8d;\n}\ninput[type=\"file\"].ui.pink.file.input::-ms-browse,\n.ui.pink.file.input input[type=\"file\"]::-ms-browse {\n  background: #e03997;\n  color: #fff;\n}\ninput[type=\"file\"].ui.pink.file.input::-ms-browse:hover,\n.ui.pink.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #e61a8d;\n}\ninput[type=\"file\"].ui.pink.file.input::-webkit-file-upload-button, .ui.pink.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #e03997;\n  color: #fff;\n}\ninput[type=\"file\"].ui.pink.file.input::file-selector-button,\n.ui.pink.file.input input[type=\"file\"]::file-selector-button {\n  background: #e03997;\n  color: #fff;\n}\ninput[type=\"file\"].ui.pink.file.input::-webkit-file-upload-button:hover, .ui.pink.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #e61a8d;\n}\ninput[type=\"file\"].ui.pink.file.input::file-selector-button:hover,\n.ui.pink.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #e61a8d;\n}\ninput[type=\"file\"].ui.brown.file.input::-webkit-file-upload-button,\n.ui.brown.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #a5673f;\n  color: #fff;\n}\ninput[type=\"file\"].ui.brown.file.input::-webkit-file-upload-button:hover,\n.ui.brown.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #975b33;\n}\ninput[type=\"file\"].ui.brown.file.input::-ms-browse,\n.ui.brown.file.input input[type=\"file\"]::-ms-browse {\n  background: #a5673f;\n  color: #fff;\n}\ninput[type=\"file\"].ui.brown.file.input::-ms-browse:hover,\n.ui.brown.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #975b33;\n}\ninput[type=\"file\"].ui.brown.file.input::-webkit-file-upload-button, .ui.brown.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #a5673f;\n  color: #fff;\n}\ninput[type=\"file\"].ui.brown.file.input::file-selector-button,\n.ui.brown.file.input input[type=\"file\"]::file-selector-button {\n  background: #a5673f;\n  color: #fff;\n}\ninput[type=\"file\"].ui.brown.file.input::-webkit-file-upload-button:hover, .ui.brown.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #975b33;\n}\ninput[type=\"file\"].ui.brown.file.input::file-selector-button:hover,\n.ui.brown.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #975b33;\n}\ninput[type=\"file\"].ui.grey.file.input::-webkit-file-upload-button,\n.ui.grey.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #767676;\n  color: #fff;\n}\ninput[type=\"file\"].ui.grey.file.input::-webkit-file-upload-button:hover,\n.ui.grey.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #838383;\n}\ninput[type=\"file\"].ui.grey.file.input::-ms-browse,\n.ui.grey.file.input input[type=\"file\"]::-ms-browse {\n  background: #767676;\n  color: #fff;\n}\ninput[type=\"file\"].ui.grey.file.input::-ms-browse:hover,\n.ui.grey.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #838383;\n}\ninput[type=\"file\"].ui.grey.file.input::-webkit-file-upload-button, .ui.grey.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #767676;\n  color: #fff;\n}\ninput[type=\"file\"].ui.grey.file.input::file-selector-button,\n.ui.grey.file.input input[type=\"file\"]::file-selector-button {\n  background: #767676;\n  color: #fff;\n}\ninput[type=\"file\"].ui.grey.file.input::-webkit-file-upload-button:hover, .ui.grey.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #838383;\n}\ninput[type=\"file\"].ui.grey.file.input::file-selector-button:hover,\n.ui.grey.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #838383;\n}\ninput[type=\"file\"].ui.black.file.input::-webkit-file-upload-button,\n.ui.black.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #1b1c1d;\n  color: #fff;\n}\ninput[type=\"file\"].ui.black.file.input::-webkit-file-upload-button:hover,\n.ui.black.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #27292a;\n}\ninput[type=\"file\"].ui.black.file.input::-ms-browse,\n.ui.black.file.input input[type=\"file\"]::-ms-browse {\n  background: #1b1c1d;\n  color: #fff;\n}\ninput[type=\"file\"].ui.black.file.input::-ms-browse:hover,\n.ui.black.file.input input[type=\"file\"]::-ms-browse:hover {\n  background: #27292a;\n}\ninput[type=\"file\"].ui.black.file.input::-webkit-file-upload-button, .ui.black.file.input input[type=\"file\"]::-webkit-file-upload-button {\n  background: #1b1c1d;\n  color: #fff;\n}\ninput[type=\"file\"].ui.black.file.input::file-selector-button,\n.ui.black.file.input input[type=\"file\"]::file-selector-button {\n  background: #1b1c1d;\n  color: #fff;\n}\ninput[type=\"file\"].ui.black.file.input::-webkit-file-upload-button:hover, .ui.black.file.input input[type=\"file\"]::-webkit-file-upload-button:hover {\n  background: #27292a;\n}\ninput[type=\"file\"].ui.black.file.input::file-selector-button:hover,\n.ui.black.file.input input[type=\"file\"]::file-selector-button:hover {\n  background: #27292a;\n}\n\n/* --------------------\n        Size\n--------------------- */\n.ui.input {\n  font-size: 1em;\n}\n.ui.mini.input {\n  font-size: 0.78571429em;\n}\n.ui.tiny.input {\n  font-size: 0.85714286em;\n}\n.ui.small.input {\n  font-size: 0.92857143em;\n}\n.ui.large.input {\n  font-size: 1.14285714em;\n}\n.ui.big.input {\n  font-size: 1.28571429em;\n}\n.ui.huge.input {\n  font-size: 1.42857143em;\n}\n.ui.massive.input {\n  font-size: 1.71428571em;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/item.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Item\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Standard\n*******************************/\n\n\n/* --------------\n      Item\n--------------- */\n.ui.items > .item {\n  display: flex;\n  margin: 1em 0;\n  width: 100%;\n  min-height: 0;\n  background: transparent;\n  padding: 0;\n  border: none;\n  border-radius: 0;\n  box-shadow: none;\n  transition: box-shadow 0.1s ease;\n  z-index: \"\";\n}\n.ui.items > .item a {\n  cursor: pointer;\n}\n\n/* --------------\n      Items\n--------------- */\n.ui.items {\n  margin: 1.5em 0;\n}\n.ui.items:first-child {\n  margin-top: 0 !important;\n}\n.ui.items:last-child {\n  margin-bottom: 0 !important;\n}\n\n/* --------------\n      Item\n--------------- */\n.ui.items > .item::after {\n  display: block;\n  content: \" \";\n  height: 0;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n.ui.items > .item:first-child {\n  margin-top: 0;\n}\n.ui.items > .item:last-child {\n  margin-bottom: 0;\n}\n\n/* --------------\n         Images\n    --------------- */\n.ui.items > .item > .image {\n  position: relative;\n  flex: 0 0 auto;\n  display: block;\n  float: none;\n  margin: 0;\n  padding: 0;\n  max-height: \"\";\n  align-self: start;\n}\n.ui.items > .item > .image > img {\n  display: block;\n  width: 100%;\n  height: auto;\n  border-radius: 0.125rem;\n  border: none;\n}\n.ui.items > .item > .image:only-child > img {\n  border-radius: 0;\n}\n\n/* --------------\n     Content\n--------------- */\n.ui.items > .item > .content {\n  display: block;\n  flex: 1 1 auto;\n  background: none;\n  color: rgba(0, 0, 0, 0.87);\n  margin: 0;\n  padding: 0;\n  box-shadow: none;\n  font-size: 1em;\n  border: none;\n  border-radius: 0;\n}\n.ui.items > .item > .content::after {\n  display: block;\n  content: \" \";\n  height: 0;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n.ui.items > .item > .image + .content {\n  min-width: 0;\n  width: auto;\n  display: block;\n  margin-left: 0;\n  align-self: start;\n  padding-left: 1.5em;\n}\n.ui.items > .item > .content > .header {\n  display: inline-block;\n  margin: -0.21425em 0 0;\n  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\";\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.85);\n}\n\n/* Default Header Size */\n.ui.items > .item > .content > .header:not(.ui) {\n  font-size: 1.28571429em;\n}\n\n/* --------------\n         Floated\n    --------------- */\n.ui.items > .item [class*=\"left floated\"] {\n  float: left;\n}\n.ui.items > .item [class*=\"right floated\"] {\n  float: right;\n}\n\n/* --------------\n      Content Image\n    --------------- */\n.ui.items > .item .content img {\n  align-self: center;\n  width: \"\";\n}\n.ui.items > .item img.avatar,\n.ui.items > .item .avatar img {\n  width: \"\";\n  height: \"\";\n  border-radius: 500rem;\n}\n\n/* --------------\n       Description\n    --------------- */\n.ui.items > .item > .content > .description {\n  margin-top: 0.6em;\n  max-width: none;\n  font-size: 1em;\n  line-height: 1.4285em;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* --------------\n    Paragraph\n--------------- */\n.ui.items > .item > .content p {\n  margin: 0 0 0.5em;\n}\n.ui.items > .item > .content p:last-child {\n  margin-bottom: 0;\n}\n\n/* --------------\n          Meta\n    --------------- */\n.ui.items > .item .meta {\n  margin: 0.5em 0 0.5em;\n  font-size: 1em;\n  line-height: 1em;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.items > .item .meta * {\n  margin-right: 0.3em;\n}\n.ui.items > .item .meta :last-child {\n  margin-right: 0;\n}\n.ui.items > .item .meta [class*=\"right floated\"] {\n  margin-right: 0;\n  margin-left: 0.3em;\n}\n\n/* --------------\n      Links\n--------------- */\n\n/* Generic */\n.ui.items > .item > .content a:not(.ui) {\n  color: \"\";\n  transition: color 0.1s ease;\n}\n.ui.items > .item > .content a:not(.ui):hover {\n  color: \"\";\n}\n\n/* Header */\n.ui.items > .item > .content > a.header {\n  color: rgba(0, 0, 0, 0.85);\n}\n.ui.items > .item > .content > a.header:hover {\n  color: #1e70bf;\n}\n\n/* Meta */\n.ui.items > .item .meta > a:not(.ui) {\n  color: rgba(0, 0, 0, 0.4);\n}\n.ui.items > .item .meta > a:not(.ui):hover {\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* --------------\n     Labels\n--------------- */\n\n/* -----Star----- */\n\n/* Icon */\n.ui.items > .item > .content .favorite.icon {\n  cursor: pointer;\n  opacity: 0.75;\n  transition: color 0.1s ease;\n}\n.ui.items > .item > .content .favorite.icon:hover {\n  opacity: 1;\n  color: #ffb70a;\n}\n.ui.items > .item > .content .active.favorite.icon {\n  color: #ffe623;\n}\n\n/* -----Like----- */\n\n/* Icon */\n.ui.items > .item > .content .like.icon {\n  cursor: pointer;\n  opacity: 0.75;\n  transition: color 0.1s ease;\n}\n.ui.items > .item > .content .like.icon:hover {\n  opacity: 1;\n  color: #ff2733;\n}\n.ui.items > .item > .content .active.like.icon {\n  color: #ff2733;\n}\n\n/* ----------------\n      Extra Content\n    ----------------- */\n.ui.items > .item .extra {\n  display: block;\n  position: relative;\n  background: none;\n  margin: 0.5rem 0 0;\n  width: 100%;\n  padding: 0;\n  top: 0;\n  left: 0;\n  color: rgba(0, 0, 0, 0.4);\n  box-shadow: none;\n  transition: color 0.1s ease;\n  border-top: none;\n}\n.ui.items > .item .extra > * {\n  margin: 0.25rem 0.5rem 0.25rem 0;\n}\n.ui.items > .item .extra > [class*=\"right floated\"] {\n  margin: 0.25rem 0 0.25rem 0.5rem;\n}\n.ui.items > .item .extra::after {\n  display: block;\n  content: \" \";\n  height: 0;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n\n/*******************************\n          Responsive\n*******************************/\n\n\n/* Default Image Width */\n.ui.items > .item > .image:not(.ui) {\n  width: 175px;\n}\n\n/* Tablet Only */\n@media only screen and (min-width: 768px) and (max-width: 991.98px) {\n  .ui.items > .item {\n    margin: 1em 0;\n  }\n  .ui.items > .item > .image:not(.ui) {\n    width: 150px;\n  }\n  .ui.items > .item > .image + .content {\n    display: block;\n    padding: 0 0 0 1em;\n  }\n}\n\n/* Mobile Only */\n@media only screen and (max-width: 767.98px) {\n  .ui.items:not(.unstackable) > .item {\n    flex-direction: column;\n    margin: 2em 0;\n  }\n  .ui.items:not(.unstackable) > .item > .image {\n    display: block;\n    margin-left: auto;\n    margin-right: auto;\n  }\n  .ui.items:not(.unstackable) > .item > .image,\n  .ui.items:not(.unstackable) > .item > .image > img {\n    max-width: 100% !important;\n    width: auto !important;\n    max-height: 250px !important;\n  }\n  .ui.items:not(.unstackable) > .item > .image + .content {\n    display: block;\n    padding: 1.5em 0 0;\n  }\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* -------------------\n           Aligned\n    -------------------- */\n.ui.items > .item > .image + [class*=\"top aligned\"].content {\n  align-self: flex-start;\n}\n.ui.items > .item > .image + [class*=\"middle aligned\"].content {\n  align-self: center;\n}\n.ui.items > .item > .image + [class*=\"bottom aligned\"].content {\n  align-self: flex-end;\n}\n\n/* --------------\n         Relaxed\n    --------------- */\n.ui.relaxed.items > .item {\n  margin: 1.5em 0;\n}\n.ui[class*=\"very relaxed\"].items > .item {\n  margin: 2em 0;\n}\n\n/* -------------------\n          Divided\n    -------------------- */\n.ui.divided.items > .item {\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n  margin: 0;\n  padding: 1em 0;\n}\n.ui.divided.items > .item:first-child {\n  border-top: none;\n  margin-top: 0 !important;\n  padding-top: 0 !important;\n}\n.ui.divided.items > .item:last-child {\n  margin-bottom: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n/* Relaxed Divided */\n.ui.relaxed.divided.items > .item {\n  margin: 0;\n  padding: 1.5em 0;\n}\n.ui[class*=\"very relaxed\"].divided.items > .item {\n  margin: 0;\n  padding: 2em 0;\n}\n\n/* -------------------\n            Link\n    -------------------- */\n.ui.items a.item:hover,\n.ui.link.items > .item:hover {\n  cursor: pointer;\n}\n.ui.items a.item:hover .content .header,\n.ui.link.items > .item:hover .content .header {\n  color: #1e70bf;\n}\n\n/* --------------\n      Size\n--------------- */\n.ui.items > .item {\n  font-size: 1em;\n}\n.ui.mini.items > .item {\n  font-size: 0.78571429em;\n}\n.ui.tiny.items > .item {\n  font-size: 0.85714286em;\n}\n.ui.small.items > .item {\n  font-size: 0.92857143em;\n}\n.ui.large.items > .item {\n  font-size: 1.14285714em;\n}\n.ui.big.items > .item {\n  font-size: 1.28571429em;\n}\n.ui.huge.items > .item {\n  font-size: 1.42857143em;\n}\n.ui.massive.items > .item {\n  font-size: 1.71428571em;\n}\n\n/* ---------------\n       Unstackable\n    ---------------- */\n@media only screen and (max-width: 767.98px) {\n  .ui.unstackable.items > .item > .image,\n  .ui.unstackable.items > .item > .image > img {\n    width: 125px !important;\n  }\n}\n\n/* --------------\n         Inverted\n    --------------- */\n.ui.inverted.items > .item {\n  background: transparent;\n}\n.ui.inverted.items > .item > .content {\n  background: none;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.items > .item .extra {\n  background: none;\n}\n.ui.inverted.items > .item > .content > .header {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.items > .item > .content > .description {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.items > .item .meta {\n  color: rgba(255, 255, 255, 0.8);\n}\n.ui.inverted.items > .item > .content a:not(.ui) {\n  color: #57a4ef;\n}\n.ui.inverted.items > .item > .content a:not(.ui):hover {\n  color: #4183c4;\n}\n.ui.inverted.items > .item > .content > a.header {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.items > .item > .content > a.header:hover {\n  color: #ffffff;\n}\n.ui.inverted.items > .item .meta > a:not(.ui) {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.items > .item .meta > a:not(.ui):hover {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.items > .item > .content .favorite.icon:hover {\n  color: #ffc63d;\n}\n.ui.inverted.items > .item > .content .active.favorite.icon {\n  color: #ffec56;\n}\n.ui.inverted.items > .item > .content .like.icon:hover {\n  color: #ff5a63;\n}\n.ui.inverted.items > .item > .content .active.like.icon {\n  color: #ff5a63;\n}\n.ui.inverted.items > .item .extra {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.items a.item:hover .content .header,\n.ui.inverted.link.items > .item:hover .content .header {\n  color: #ffffff;\n}\n.ui.inverted.divided.items > .item {\n  border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n.ui.inverted.divided.items > .item:first-child {\n  border-top: none;\n}\n.ui.disabled.items,\n.ui.items > .disabled.item {\n  opacity: 0.45;\n  pointer-events: none;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/label.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Label\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Label\n*******************************/\n\n.ui.label {\n  display: inline-block;\n  line-height: 1;\n  vertical-align: baseline;\n  margin: 0 0.14285714em;\n  background-color: #e8e8e8;\n  background-image: none;\n  padding: 0.5833em 0.833em;\n  color: rgba(0, 0, 0, 0.6);\n  text-transform: none;\n  font-weight: bold;\n  border: 0 solid transparent;\n  border-radius: 0.28571429rem;\n  transition: background 0.1s ease;\n}\n.ui.label:first-child {\n  margin-left: 0;\n}\n.ui.label:last-child {\n  margin-right: 0;\n}\n\n/* Link */\na.ui.label {\n  cursor: pointer;\n}\n\n/* Inside Link */\n.ui.label > a {\n  cursor: pointer;\n  color: inherit;\n  opacity: 0.5;\n  transition: 0.1s opacity ease;\n}\n.ui.label > a:hover {\n  opacity: 1;\n}\n\n/* Image */\n.ui.label > img {\n  width: auto !important;\n  vertical-align: middle;\n  height: 2.1666em;\n}\n\n/* Icon */\n.ui.ui[class*=\"left icon\"].label > .icon,\n.ui.label > .icon {\n  width: auto;\n  margin: 0 0.75em 0 0;\n}\n\n/* Detail */\n.ui.label > .detail {\n  display: inline-block;\n  vertical-align: top;\n  font-weight: bold;\n  margin-left: 1em;\n  opacity: 0.8;\n}\n.ui.label > .detail .icon {\n  margin: 0 0.25em 0 0;\n}\n\n/* Removable label */\n.ui.label > .close.icon,\n.ui.label > .delete.icon {\n  cursor: pointer;\n  font-size: 0.92857143em;\n  opacity: 0.5;\n  transition: background 0.1s ease;\n}\n.ui.label > .close.icon:hover,\n.ui.label > .delete.icon:hover {\n  opacity: 1;\n}\n\n/* Backward compatible positioning */\n.ui.label[class*=\"left icon\"] > .close.icon,\n.ui.label[class*=\"left icon\"] > .delete.icon {\n  margin: 0 0.5em 0 0;\n}\n.ui.label[class*=\"left icon\"] > .close.icon.right,\n.ui.label[class*=\"left icon\"] > .delete.icon.right {\n  margin: 0 0 0 0.5em;\n}\n.ui.label:not(.icon) > .close.icon,\n.ui.label:not(.icon) > .delete.icon {\n  margin: 0 0 0 0.5em;\n}\n\n/* Label for only an icon */\n.ui.icon.label > .icon {\n  margin: 0 auto;\n}\n\n/* Right Side Icon */\n.ui[class*=\"right icon\"].label > .icon {\n  margin: 0 0 0 0.75em;\n}\n\n/* -------------------\n       Group\n-------------------- */\n.ui.labels > .label {\n  margin: 0 0.5em 0.5em 0;\n}\n\n/* -------------------\n       Coupling\n-------------------- */\n.ui.header > .ui.label {\n  margin-top: -0.29165em;\n}\n\n/* Remove border radius on attached segment */\n.ui.attached.segment > .ui.top.left.attached.label,\n.ui.bottom.attached.segment > .ui.top.left.attached.label {\n  border-top-left-radius: 0;\n}\n.ui.attached.segment > .ui.top.right.attached.label,\n.ui.bottom.attached.segment > .ui.top.right.attached.label {\n  border-top-right-radius: 0;\n}\n.ui.top.attached.segment > .ui.bottom.left.attached.label {\n  border-bottom-left-radius: 0;\n}\n.ui.top.attached.segment > .ui.bottom.right.attached.label {\n  border-bottom-right-radius: 0;\n}\n\n/* Padding on next content after a label */\n.ui.top.attached.label ~ .ui.bottom.attached.label + :not(.attached),\n.ui.top.attached.label + :not(.attached) {\n  margin-top: 2rem !important;\n}\n.ui.bottom.attached.label ~ :last-child:not(.attached) {\n  margin-top: 0;\n  margin-bottom: 2rem !important;\n}\n.ui.segment:not(.basic) > .ui.top.attached.label {\n  margin-top: -1px;\n}\n.ui.segment:not(.basic) > .ui.bottom.attached.label {\n  margin-bottom: -1px;\n}\n.ui.segment:not(.basic) > .ui.attached.label:not(.right) {\n  margin-left: -1px;\n}\n.ui.segment:not(.basic) > .ui.right.attached.label {\n  margin-right: -1px;\n}\n.ui.segment:not(.basic) > .ui.attached.label:not(.left):not(.right) {\n  width: calc(100% + 2px);\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n.ui.image.labels .label,\n.ui.image.label {\n  width: auto;\n  margin-top: 0;\n  margin-bottom: 0;\n  max-width: 9999px;\n  vertical-align: baseline;\n  text-transform: none;\n  background: #e8e8e8;\n  padding: 0.5833em 0.833em 0.5833em 0.5em;\n  border-radius: 0.28571429rem;\n  box-shadow: none;\n}\n.ui.image.labels .label.attached:not(.basic),\n.ui.image.label.attached:not(.basic) {\n  padding: 0.5833em 0.833em 0.5833em 0.5em;\n}\n.ui.labels .image.label,\n.ui.image.labels .label {\n  margin-bottom: 0.5em;\n}\n.ui.image.label img {\n  display: inline-block;\n  vertical-align: top;\n  height: 2.1666em;\n  margin: -0.5833em 0.5em -0.5833em -0.5em;\n  border-radius: 0.28571429rem 0 0 0.28571429rem;\n}\n.ui.image.label .detail {\n  background: rgba(0, 0, 0, 0.1);\n  margin: -0.5833em -0.833em -0.5833em 0.5em;\n  padding: 0.5833em 0.833em;\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n}\n.ui.bottom.attached.image.label:not(.right) > img,\n.ui.top.right.attached.image.label > img {\n  border-top-left-radius: 0;\n}\n.ui.top.attached.image.label:not(.right) > img,\n.ui.bottom.right.attached.image.label > img {\n  border-bottom-left-radius: 0;\n}\n\n/* -------------------\n             Tag\n    -------------------- */\n.ui.tag.labels .label,\n.ui.tag.label {\n  margin-left: 1em;\n  position: relative;\n  padding-left: 1.5em;\n  padding-right: 1.5em;\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n  transition: none;\n}\n.ui.tag.labels .label::before,\n.ui.tag.label::before {\n  position: absolute;\n  transform: translateY(-50%) translateX(50%) rotate(-45deg);\n  top: 50%;\n  right: 100%;\n  content: \"\";\n  background-color: inherit;\n  background-image: none;\n  width: 1.56em;\n  height: 1.56em;\n  transition: none;\n}\n.ui.tag.labels .label::after,\n.ui.tag.label::after {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: -0.25em;\n  margin-top: -0.25em;\n  background-color: #fff;\n  width: 0.5em;\n  height: 0.5em;\n  box-shadow: 0 -1px 1px 0 rgba(0, 0, 0, 0.3);\n  border-radius: 500rem;\n}\n.ui.basic.tag.labels .label::before,\n.ui.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  right: calc(100% + 1px);\n}\n.ui.basic.tag.labels .label::after,\n.ui.basic.tag.label::after {\n  box-shadow: 0 -1px 3px 0 rgba(0, 0, 0, 0.8);\n}\n\n/* -------------------\n        Corner Label\n    -------------------- */\n.ui.corner.label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  margin: 0;\n  padding: 0;\n  text-align: center;\n  border-color: #e8e8e8;\n  width: 4em;\n  height: 4em;\n  z-index: 1;\n  transition: border-color 0.1s ease;\n}\n\n/* Icon Label */\n.ui.corner.label {\n  background-color: transparent !important;\n}\n.ui.corner.label::after {\n  position: absolute;\n  content: \"\";\n  right: 0;\n  top: 0;\n  z-index: -1;\n  width: 0;\n  height: 0;\n  background-color: transparent;\n  border-top: 0 solid transparent;\n  border-right: 4em solid transparent;\n  border-bottom: 4em solid transparent;\n  border-left: 0 solid transparent;\n  border-right-color: inherit;\n  transition: border-color 0.1s ease;\n}\n.ui.corner.label .icon {\n  cursor: inherit;\n  position: absolute;\n  top: 0.64285714em;\n  left: auto;\n  right: 0.57142857em;\n  font-size: 1.14285714em;\n  margin: 0;\n}\n\n/* Left Corner */\n.ui.left.corner.label,\n.ui.left.corner.label::after {\n  right: auto;\n  left: 0;\n}\n.ui.left.corner.label::after {\n  border-top: 4em solid transparent;\n  border-right: 4em solid transparent;\n  border-bottom: 0 solid transparent;\n  border-left: 0 solid transparent;\n  border-top-color: inherit;\n}\n.ui.left.corner.label .icon {\n  left: 0.57142857em;\n  right: auto;\n}\n\n/* Segment */\n.ui.segment > .ui.corner.label {\n  top: -1px;\n  right: -1px;\n}\n.ui.segment > .ui.left.corner.label {\n  right: auto;\n  left: -1px;\n}\n\n/* -------------------\n           Ribbon\n    -------------------- */\n.ui.ribbon.label {\n  position: relative;\n  margin: 0;\n  min-width: max-content;\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.ui.ribbon.label::after {\n  position: absolute;\n  content: \"\";\n  top: 100%;\n  left: 0;\n  background-color: transparent;\n  border-style: solid;\n  border-width: 0 1.2em 1.2em 0;\n  border-color: transparent;\n  border-right-color: inherit;\n  width: 0;\n  height: 0;\n}\n\n/* Positioning */\n.ui.ribbon.label {\n  left: calc(-1rem - 1.2em);\n  margin-right: -1.2em;\n  padding-left: calc(1rem + 1.2em);\n  padding-right: 1.2em;\n}\n.ui[class*=\"right ribbon\"].label {\n  left: calc(100% + 1rem + 1.2em);\n  padding-left: 1.2em;\n  padding-right: calc(1rem + 1.2em);\n}\n.ui.basic.ribbon.label {\n  padding-top: calc(0.5833em - 1px);\n  padding-bottom: calc(0.5833em - 1px);\n}\n.ui.basic.ribbon.label:not([class*=\"right ribbon\"]) {\n  padding-left: calc(1rem + 1.2em - 1px);\n  padding-right: calc(1.2em - 1px);\n}\n.ui.basic[class*=\"right ribbon\"].label {\n  padding-left: calc(1.2em - 1px);\n  padding-right: calc(1rem + 1.2em - 1px);\n}\n.ui.basic.ribbon.label::after {\n  top: calc(100% + 1px);\n}\n.ui.basic.ribbon.label:not([class*=\"right ribbon\"])::after {\n  left: -1px;\n}\n.ui.basic[class*=\"right ribbon\"].label::after {\n  right: -1px;\n}\n\n/* Right Ribbon */\n.ui[class*=\"right ribbon\"].label {\n  text-align: left;\n  transform: translateX(-100%);\n  border-radius: 0.28571429rem 0 0 0.28571429rem;\n}\n.ui[class*=\"right ribbon\"].label::after {\n  left: auto;\n  right: 0;\n  border-style: solid;\n  border-width: 1.2em 1.2em 0 0;\n  border-color: transparent;\n  border-top-color: inherit;\n}\n.ui.ui.center.ribbon.label {\n  top: calc(50% - 1em);\n  z-index: 1;\n}\n.ui.bottom.ribbon.label::after {\n  bottom: 100%;\n  top: auto;\n  border-width: 1.2em 1.2em 0 0;\n}\n.ui.bottom[class*=\"right ribbon\"].label::after {\n  border-width: 1.2em 0 0 1.2em;\n  border-color: transparent;\n  border-left-color: inherit;\n}\n\n/* Inside Image */\n.ui.image > .ribbon.label,\n.ui.card .image > .ribbon.label {\n  position: absolute;\n  top: 1rem;\n}\n.ui.card .image > .ui.ribbon.label,\n.ui.image > .ui.ribbon.label {\n  left: calc(0.05rem - 1.2em);\n}\n.ui.card .image > .ui[class*=\"right ribbon\"].label,\n.ui.image > .ui[class*=\"right ribbon\"].label {\n  left: calc(100% + -0.05rem + 1.2em);\n  padding-left: 0.833em;\n}\n.ui.card .image > .ui.bottom.ribbon.label,\n.ui.image > .ui.bottom.ribbon.label {\n  bottom: 1rem;\n  top: auto;\n}\n\n/* Inside Table */\n.ui.table td > .ui.ribbon.label {\n  left: calc(-1em - 1.2em);\n}\n.ui.table td > .ui[class*=\"right ribbon\"].label {\n  left: calc(100% + 1em + 1.2em);\n  padding-left: 0.833em;\n}\n\n/* -------------------\n          Attached\n    -------------------- */\n.ui[class*=\"top attached\"].label,\n.ui.attached.label {\n  width: 100%;\n  position: absolute;\n  margin: 0;\n  top: 0;\n  left: 0;\n  padding: 0.75em 1em;\n  border-radius: 0.21428571rem 0.21428571rem 0 0;\n}\n.ui[class*=\"bottom attached\"].label {\n  top: auto;\n  bottom: 0;\n  border-radius: 0 0 0.21428571rem 0.21428571rem;\n}\n.ui[class*=\"top left attached\"].label {\n  width: auto;\n  margin-top: 0;\n  border-radius: 0.21428571rem 0 0.28571429rem 0;\n}\n.ui[class*=\"top right attached\"].label {\n  width: auto;\n  left: auto;\n  right: 0;\n  border-radius: 0 0.21428571rem 0 0.28571429rem;\n}\n.ui[class*=\"bottom left attached\"].label {\n  width: auto;\n  top: auto;\n  bottom: 0;\n  border-radius: 0 0.28571429rem 0 0.21428571rem;\n}\n.ui[class*=\"bottom right attached\"].label {\n  top: auto;\n  bottom: 0;\n  left: auto;\n  right: 0;\n  width: auto;\n  border-radius: 0.28571429rem 0 0.21428571rem 0;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n\n/* -------------------\n      Disabled\n-------------------- */\n.ui.disabled.labels .label,\n.ui.label.disabled {\n  opacity: 0.45;\n  pointer-events: none;\n}\n\n/* -------------------\n        Hover\n-------------------- */\n.ui.labels a.label:hover,\na.ui.label:hover {\n  background-color: #e0e0e0;\n  border-color: #e0e0e0;\n  background-image: none;\n  color: rgba(0, 0, 0, 0.8);\n}\n.ui.labels a.label:hover::before,\na.ui.label:hover::before {\n  color: rgba(0, 0, 0, 0.8);\n}\n\n/* -------------------\n        Active\n-------------------- */\n.ui.active.label {\n  background-color: #d0d0d0;\n  border-color: #d0d0d0;\n  background-image: none;\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.active.label::before {\n  background-color: #d0d0d0;\n  background-image: none;\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* -------------------\n     Active Hover\n-------------------- */\n.ui.labels a.active.label:hover,\na.ui.active.label:hover {\n  background-color: #c8c8c8;\n  border-color: #c8c8c8;\n  background-image: none;\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.labels a.active.label:hover::before,\na.ui.active.label:hover::before {\n  background-color: #c8c8c8;\n  background-image: none;\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* -------------------\n      Visible\n-------------------- */\n.ui.labels.visible .label,\n.ui.label.visible:not(.dropdown) {\n  display: inline-block !important;\n}\n\n/* -------------------\n      Hidden\n-------------------- */\n.ui.labels.hidden .label,\n.ui.label.hidden {\n  display: none !important;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* -------------------\n            Basic\n    -------------------- */\n.ui.basic.labels .label,\n.ui.basic.label {\n  background: none #fff;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  color: rgba(0, 0, 0, 0.87);\n  box-shadow: none;\n  padding-top: calc(0.5833em - 1px);\n  padding-bottom: calc(0.5833em - 1px);\n  padding-right: calc(0.833em - 1px);\n}\n.ui.basic.labels:not(.tag):not(.image):not(.ribbon) .label,\n.ui.basic.label:not(.tag):not(.image):not(.ribbon) {\n  padding-left: calc(0.833em - 1px);\n}\n.ui.basic.image.label {\n  padding-left: calc(0.5em - 1px);\n}\n\n/* Link */\n.ui.basic.labels a.label:hover,\na.ui.basic.label:hover {\n  text-decoration: none;\n  background: none #fff;\n  color: #1e70bf;\n  box-shadow: none;\n}\n\n/* Pointing */\n.ui.basic.pointing.label::before {\n  border-color: inherit;\n}\n\n/* -------------------\n           Fluid\n    -------------------- */\n.ui.label.fluid,\n.ui.fluid.labels > .label {\n  width: 100%;\n  box-sizing: border-box;\n}\n.ui.centered.labels .label,\n.ui.centered.label {\n  text-align: center;\n}\n\n/* -------------------\n           Inverted\n    -------------------- */\n.ui.inverted.labels .label,\n.ui.inverted.label {\n  color: rgba(255, 255, 255, 0.9);\n  background-color: #b5b5b5;\n}\n.ui.inverted.corner.label {\n  border-color: #b5b5b5;\n}\n.ui.inverted.corner.label:hover {\n  border-color: #e8e8e8;\n  transition: none;\n}\n.ui.inverted.basic.labels .label,\n.ui.inverted.basic.label,\n.ui.inverted.basic.label:hover {\n  border-color: rgba(255, 255, 255, 0.5);\n  background: #1b1c1d;\n}\n.ui.inverted.basic.label:hover {\n  color: #4183c4;\n}\n\n/* -------------------\n       Colors\n-------------------- */\n.ui.primary.labels .label,\n.ui.ui.ui.primary.label {\n  background-color: #2185d0;\n  border-color: #2185d0;\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* Link */\n.ui.primary.labels a.label:hover,\na.ui.ui.ui.primary.label:hover {\n  background-color: #1678c2;\n  border-color: #1678c2;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.primary.ribbon.label {\n  border-color: #1a69a4;\n}\n\n/* Basic */\n.ui.basic.labels .primary.label,\n.ui.ui.ui.basic.primary.label {\n  background: none #fff;\n  border-color: #2185d0;\n  color: #2185d0;\n}\n.ui.basic.labels a.primary.label:hover,\na.ui.ui.ui.basic.primary.label:hover {\n  background: none #fff;\n  border-color: #1678c2;\n  color: #1678c2;\n}\n\n/* Inverted */\n.ui.inverted.labels .primary.label,\n.ui.ui.ui.inverted.primary.label {\n  background-color: #54c8ff;\n  border-color: #54c8ff;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.primary.label:hover,\na.ui.ui.ui.inverted.primary.label:hover {\n  background-color: #21b8ff;\n  border-color: #21b8ff;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.primary.ribbon.label {\n  border-color: #21b8ff;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .primary.label,\n.ui.ui.ui.inverted.basic.primary.label {\n  background-color: #1b1c1d;\n  border-color: #54c8ff;\n  color: #54c8ff;\n}\n.ui.inverted.basic.labels a.primary.label:hover,\na.ui.ui.ui.inverted.basic.primary.label:hover {\n  border-color: #21b8ff;\n  background-color: #1b1c1d;\n  color: #21b8ff;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .primary.label,\n.ui.ui.ui.inverted.primary.basic.tag.label {\n  border: 1px solid #54c8ff;\n}\n.ui.inverted.basic.tag.labels .primary.label::before,\n.ui.ui.ui.inverted.primary.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.secondary.labels .label,\n.ui.ui.ui.secondary.label {\n  background-color: #1b1c1d;\n  border-color: #1b1c1d;\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* Link */\n.ui.secondary.labels a.label:hover,\na.ui.ui.ui.secondary.label:hover {\n  background-color: #27292a;\n  border-color: #27292a;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.secondary.ribbon.label {\n  border-color: #020203;\n}\n\n/* Basic */\n.ui.basic.labels .secondary.label,\n.ui.ui.ui.basic.secondary.label {\n  background: none #fff;\n  border-color: #1b1c1d;\n  color: #1b1c1d;\n}\n.ui.basic.labels a.secondary.label:hover,\na.ui.ui.ui.basic.secondary.label:hover {\n  background: none #fff;\n  border-color: #27292a;\n  color: #27292a;\n}\n\n/* Inverted */\n.ui.inverted.labels .secondary.label,\n.ui.ui.ui.inverted.secondary.label {\n  background-color: #545454;\n  border-color: #545454;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.secondary.label:hover,\na.ui.ui.ui.inverted.secondary.label:hover {\n  background-color: #6e6e6e;\n  border-color: #6e6e6e;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.secondary.ribbon.label {\n  border-color: #3b3b3b;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .secondary.label,\n.ui.ui.ui.inverted.basic.secondary.label {\n  background-color: #1b1c1d;\n  border-color: #545454;\n  color: #545454;\n}\n.ui.inverted.basic.labels a.secondary.label:hover,\na.ui.ui.ui.inverted.basic.secondary.label:hover {\n  border-color: #6e6e6e;\n  background-color: #1b1c1d;\n  color: #6e6e6e;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .secondary.label,\n.ui.ui.ui.inverted.secondary.basic.tag.label {\n  border: 1px solid #545454;\n}\n.ui.inverted.basic.tag.labels .secondary.label::before,\n.ui.ui.ui.inverted.secondary.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.red.labels .label,\n.ui.ui.ui.red.label {\n  background-color: #db2828;\n  border-color: #db2828;\n  color: #fff;\n}\n\n/* Link */\n.ui.red.labels a.label:hover,\na.ui.ui.ui.red.label:hover {\n  background-color: #d01919;\n  border-color: #d01919;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.red.ribbon.label {\n  border-color: #b21e1e;\n}\n\n/* Basic */\n.ui.basic.labels .red.label,\n.ui.ui.ui.basic.red.label {\n  background: none #fff;\n  border-color: #db2828;\n  color: #db2828;\n}\n.ui.basic.labels a.red.label:hover,\na.ui.ui.ui.basic.red.label:hover {\n  background: none #fff;\n  border-color: #d01919;\n  color: #d01919;\n}\n\n/* Inverted */\n.ui.inverted.labels .red.label,\n.ui.ui.ui.inverted.red.label {\n  background-color: #ff695e;\n  border-color: #ff695e;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.red.label:hover,\na.ui.ui.ui.inverted.red.label:hover {\n  background-color: #ff392b;\n  border-color: #ff392b;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.red.ribbon.label {\n  border-color: #ff392b;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .red.label,\n.ui.ui.ui.inverted.basic.red.label {\n  background-color: #1b1c1d;\n  border-color: #ff695e;\n  color: #ff695e;\n}\n.ui.inverted.basic.labels a.red.label:hover,\na.ui.ui.ui.inverted.basic.red.label:hover {\n  border-color: #ff392b;\n  background-color: #1b1c1d;\n  color: #ff392b;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .red.label,\n.ui.ui.ui.inverted.red.basic.tag.label {\n  border: 1px solid #ff695e;\n}\n.ui.inverted.basic.tag.labels .red.label::before,\n.ui.ui.ui.inverted.red.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.orange.labels .label,\n.ui.ui.ui.orange.label {\n  background-color: #f2711c;\n  border-color: #f2711c;\n  color: #fff;\n}\n\n/* Link */\n.ui.orange.labels a.label:hover,\na.ui.ui.ui.orange.label:hover {\n  background-color: #f26202;\n  border-color: #f26202;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.orange.ribbon.label {\n  border-color: #cf590c;\n}\n\n/* Basic */\n.ui.basic.labels .orange.label,\n.ui.ui.ui.basic.orange.label {\n  background: none #fff;\n  border-color: #f2711c;\n  color: #f2711c;\n}\n.ui.basic.labels a.orange.label:hover,\na.ui.ui.ui.basic.orange.label:hover {\n  background: none #fff;\n  border-color: #f26202;\n  color: #f26202;\n}\n\n/* Inverted */\n.ui.inverted.labels .orange.label,\n.ui.ui.ui.inverted.orange.label {\n  background-color: #ff851b;\n  border-color: #ff851b;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.orange.label:hover,\na.ui.ui.ui.inverted.orange.label:hover {\n  background-color: #e76b00;\n  border-color: #e76b00;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.orange.ribbon.label {\n  border-color: #e76b00;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .orange.label,\n.ui.ui.ui.inverted.basic.orange.label {\n  background-color: #1b1c1d;\n  border-color: #ff851b;\n  color: #ff851b;\n}\n.ui.inverted.basic.labels a.orange.label:hover,\na.ui.ui.ui.inverted.basic.orange.label:hover {\n  border-color: #e76b00;\n  background-color: #1b1c1d;\n  color: #e76b00;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .orange.label,\n.ui.ui.ui.inverted.orange.basic.tag.label {\n  border: 1px solid #ff851b;\n}\n.ui.inverted.basic.tag.labels .orange.label::before,\n.ui.ui.ui.inverted.orange.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.yellow.labels .label,\n.ui.ui.ui.yellow.label {\n  background-color: #fbbd08;\n  border-color: #fbbd08;\n  color: #fff;\n}\n\n/* Link */\n.ui.yellow.labels a.label:hover,\na.ui.ui.ui.yellow.label:hover {\n  background-color: #eaae00;\n  border-color: #eaae00;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.yellow.ribbon.label {\n  border-color: #cd9903;\n}\n\n/* Basic */\n.ui.basic.labels .yellow.label,\n.ui.ui.ui.basic.yellow.label {\n  background: none #fff;\n  border-color: #fbbd08;\n  color: #fbbd08;\n}\n.ui.basic.labels a.yellow.label:hover,\na.ui.ui.ui.basic.yellow.label:hover {\n  background: none #fff;\n  border-color: #eaae00;\n  color: #eaae00;\n}\n\n/* Inverted */\n.ui.inverted.labels .yellow.label,\n.ui.ui.ui.inverted.yellow.label {\n  background-color: #ffe21f;\n  border-color: #ffe21f;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.yellow.label:hover,\na.ui.ui.ui.inverted.yellow.label:hover {\n  background-color: #ebcd00;\n  border-color: #ebcd00;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.yellow.ribbon.label {\n  border-color: #ebcd00;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .yellow.label,\n.ui.ui.ui.inverted.basic.yellow.label {\n  background-color: #1b1c1d;\n  border-color: #ffe21f;\n  color: #ffe21f;\n}\n.ui.inverted.basic.labels a.yellow.label:hover,\na.ui.ui.ui.inverted.basic.yellow.label:hover {\n  border-color: #ebcd00;\n  background-color: #1b1c1d;\n  color: #ebcd00;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .yellow.label,\n.ui.ui.ui.inverted.yellow.basic.tag.label {\n  border: 1px solid #ffe21f;\n}\n.ui.inverted.basic.tag.labels .yellow.label::before,\n.ui.ui.ui.inverted.yellow.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.olive.labels .label,\n.ui.ui.ui.olive.label {\n  background-color: #b5cc18;\n  border-color: #b5cc18;\n  color: #fff;\n}\n\n/* Link */\n.ui.olive.labels a.label:hover,\na.ui.ui.ui.olive.label:hover {\n  background-color: #a7bd0d;\n  border-color: #a7bd0d;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.olive.ribbon.label {\n  border-color: #8d9e13;\n}\n\n/* Basic */\n.ui.basic.labels .olive.label,\n.ui.ui.ui.basic.olive.label {\n  background: none #fff;\n  border-color: #b5cc18;\n  color: #b5cc18;\n}\n.ui.basic.labels a.olive.label:hover,\na.ui.ui.ui.basic.olive.label:hover {\n  background: none #fff;\n  border-color: #a7bd0d;\n  color: #a7bd0d;\n}\n\n/* Inverted */\n.ui.inverted.labels .olive.label,\n.ui.ui.ui.inverted.olive.label {\n  background-color: #d9e778;\n  border-color: #d9e778;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.olive.label:hover,\na.ui.ui.ui.inverted.olive.label:hover {\n  background-color: #d2e745;\n  border-color: #d2e745;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.olive.ribbon.label {\n  border-color: #cddf4d;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .olive.label,\n.ui.ui.ui.inverted.basic.olive.label {\n  background-color: #1b1c1d;\n  border-color: #d9e778;\n  color: #d9e778;\n}\n.ui.inverted.basic.labels a.olive.label:hover,\na.ui.ui.ui.inverted.basic.olive.label:hover {\n  border-color: #d2e745;\n  background-color: #1b1c1d;\n  color: #d2e745;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .olive.label,\n.ui.ui.ui.inverted.olive.basic.tag.label {\n  border: 1px solid #d9e778;\n}\n.ui.inverted.basic.tag.labels .olive.label::before,\n.ui.ui.ui.inverted.olive.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.green.labels .label,\n.ui.ui.ui.green.label {\n  background-color: #21ba45;\n  border-color: #21ba45;\n  color: #fff;\n}\n\n/* Link */\n.ui.green.labels a.label:hover,\na.ui.ui.ui.green.label:hover {\n  background-color: #16ab39;\n  border-color: #16ab39;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.green.ribbon.label {\n  border-color: #198f35;\n}\n\n/* Basic */\n.ui.basic.labels .green.label,\n.ui.ui.ui.basic.green.label {\n  background: none #fff;\n  border-color: #21ba45;\n  color: #21ba45;\n}\n.ui.basic.labels a.green.label:hover,\na.ui.ui.ui.basic.green.label:hover {\n  background: none #fff;\n  border-color: #16ab39;\n  color: #16ab39;\n}\n\n/* Inverted */\n.ui.inverted.labels .green.label,\n.ui.ui.ui.inverted.green.label {\n  background-color: #2ecc40;\n  border-color: #2ecc40;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.green.label:hover,\na.ui.ui.ui.inverted.green.label:hover {\n  background-color: #1ea92e;\n  border-color: #1ea92e;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.green.ribbon.label {\n  border-color: #25a233;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .green.label,\n.ui.ui.ui.inverted.basic.green.label {\n  background-color: #1b1c1d;\n  border-color: #2ecc40;\n  color: #2ecc40;\n}\n.ui.inverted.basic.labels a.green.label:hover,\na.ui.ui.ui.inverted.basic.green.label:hover {\n  border-color: #1ea92e;\n  background-color: #1b1c1d;\n  color: #1ea92e;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .green.label,\n.ui.ui.ui.inverted.green.basic.tag.label {\n  border: 1px solid #2ecc40;\n}\n.ui.inverted.basic.tag.labels .green.label::before,\n.ui.ui.ui.inverted.green.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.teal.labels .label,\n.ui.ui.ui.teal.label {\n  background-color: #00b5ad;\n  border-color: #00b5ad;\n  color: #fff;\n}\n\n/* Link */\n.ui.teal.labels a.label:hover,\na.ui.ui.ui.teal.label:hover {\n  background-color: #009c95;\n  border-color: #009c95;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.teal.ribbon.label {\n  border-color: #00827c;\n}\n\n/* Basic */\n.ui.basic.labels .teal.label,\n.ui.ui.ui.basic.teal.label {\n  background: none #fff;\n  border-color: #00b5ad;\n  color: #00b5ad;\n}\n.ui.basic.labels a.teal.label:hover,\na.ui.ui.ui.basic.teal.label:hover {\n  background: none #fff;\n  border-color: #009c95;\n  color: #009c95;\n}\n\n/* Inverted */\n.ui.inverted.labels .teal.label,\n.ui.ui.ui.inverted.teal.label {\n  background-color: #6dffff;\n  border-color: #6dffff;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.teal.label:hover,\na.ui.ui.ui.inverted.teal.label:hover {\n  background-color: #3affff;\n  border-color: #3affff;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.teal.ribbon.label {\n  border-color: #3affff;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .teal.label,\n.ui.ui.ui.inverted.basic.teal.label {\n  background-color: #1b1c1d;\n  border-color: #6dffff;\n  color: #6dffff;\n}\n.ui.inverted.basic.labels a.teal.label:hover,\na.ui.ui.ui.inverted.basic.teal.label:hover {\n  border-color: #3affff;\n  background-color: #1b1c1d;\n  color: #3affff;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .teal.label,\n.ui.ui.ui.inverted.teal.basic.tag.label {\n  border: 1px solid #6dffff;\n}\n.ui.inverted.basic.tag.labels .teal.label::before,\n.ui.ui.ui.inverted.teal.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.blue.labels .label,\n.ui.ui.ui.blue.label {\n  background-color: #2185d0;\n  border-color: #2185d0;\n  color: #fff;\n}\n\n/* Link */\n.ui.blue.labels a.label:hover,\na.ui.ui.ui.blue.label:hover {\n  background-color: #1678c2;\n  border-color: #1678c2;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.blue.ribbon.label {\n  border-color: #1a69a4;\n}\n\n/* Basic */\n.ui.basic.labels .blue.label,\n.ui.ui.ui.basic.blue.label {\n  background: none #fff;\n  border-color: #2185d0;\n  color: #2185d0;\n}\n.ui.basic.labels a.blue.label:hover,\na.ui.ui.ui.basic.blue.label:hover {\n  background: none #fff;\n  border-color: #1678c2;\n  color: #1678c2;\n}\n\n/* Inverted */\n.ui.inverted.labels .blue.label,\n.ui.ui.ui.inverted.blue.label {\n  background-color: #54c8ff;\n  border-color: #54c8ff;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.blue.label:hover,\na.ui.ui.ui.inverted.blue.label:hover {\n  background-color: #21b8ff;\n  border-color: #21b8ff;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.blue.ribbon.label {\n  border-color: #21b8ff;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .blue.label,\n.ui.ui.ui.inverted.basic.blue.label {\n  background-color: #1b1c1d;\n  border-color: #54c8ff;\n  color: #54c8ff;\n}\n.ui.inverted.basic.labels a.blue.label:hover,\na.ui.ui.ui.inverted.basic.blue.label:hover {\n  border-color: #21b8ff;\n  background-color: #1b1c1d;\n  color: #21b8ff;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .blue.label,\n.ui.ui.ui.inverted.blue.basic.tag.label {\n  border: 1px solid #54c8ff;\n}\n.ui.inverted.basic.tag.labels .blue.label::before,\n.ui.ui.ui.inverted.blue.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.violet.labels .label,\n.ui.ui.ui.violet.label {\n  background-color: #6435c9;\n  border-color: #6435c9;\n  color: #fff;\n}\n\n/* Link */\n.ui.violet.labels a.label:hover,\na.ui.ui.ui.violet.label:hover {\n  background-color: #5829bb;\n  border-color: #5829bb;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.violet.ribbon.label {\n  border-color: #502aa1;\n}\n\n/* Basic */\n.ui.basic.labels .violet.label,\n.ui.ui.ui.basic.violet.label {\n  background: none #fff;\n  border-color: #6435c9;\n  color: #6435c9;\n}\n.ui.basic.labels a.violet.label:hover,\na.ui.ui.ui.basic.violet.label:hover {\n  background: none #fff;\n  border-color: #5829bb;\n  color: #5829bb;\n}\n\n/* Inverted */\n.ui.inverted.labels .violet.label,\n.ui.ui.ui.inverted.violet.label {\n  background-color: #a291fb;\n  border-color: #a291fb;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.violet.label:hover,\na.ui.ui.ui.inverted.violet.label:hover {\n  background-color: #745aff;\n  border-color: #745aff;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.violet.ribbon.label {\n  border-color: #7860f9;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .violet.label,\n.ui.ui.ui.inverted.basic.violet.label {\n  background-color: #1b1c1d;\n  border-color: #a291fb;\n  color: #a291fb;\n}\n.ui.inverted.basic.labels a.violet.label:hover,\na.ui.ui.ui.inverted.basic.violet.label:hover {\n  border-color: #745aff;\n  background-color: #1b1c1d;\n  color: #745aff;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .violet.label,\n.ui.ui.ui.inverted.violet.basic.tag.label {\n  border: 1px solid #a291fb;\n}\n.ui.inverted.basic.tag.labels .violet.label::before,\n.ui.ui.ui.inverted.violet.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.purple.labels .label,\n.ui.ui.ui.purple.label {\n  background-color: #a333c8;\n  border-color: #a333c8;\n  color: #fff;\n}\n\n/* Link */\n.ui.purple.labels a.label:hover,\na.ui.ui.ui.purple.label:hover {\n  background-color: #9627ba;\n  border-color: #9627ba;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.purple.ribbon.label {\n  border-color: #82299f;\n}\n\n/* Basic */\n.ui.basic.labels .purple.label,\n.ui.ui.ui.basic.purple.label {\n  background: none #fff;\n  border-color: #a333c8;\n  color: #a333c8;\n}\n.ui.basic.labels a.purple.label:hover,\na.ui.ui.ui.basic.purple.label:hover {\n  background: none #fff;\n  border-color: #9627ba;\n  color: #9627ba;\n}\n\n/* Inverted */\n.ui.inverted.labels .purple.label,\n.ui.ui.ui.inverted.purple.label {\n  background-color: #dc73ff;\n  border-color: #dc73ff;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.purple.label:hover,\na.ui.ui.ui.inverted.purple.label:hover {\n  background-color: #cf40ff;\n  border-color: #cf40ff;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.purple.ribbon.label {\n  border-color: #cf40ff;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .purple.label,\n.ui.ui.ui.inverted.basic.purple.label {\n  background-color: #1b1c1d;\n  border-color: #dc73ff;\n  color: #dc73ff;\n}\n.ui.inverted.basic.labels a.purple.label:hover,\na.ui.ui.ui.inverted.basic.purple.label:hover {\n  border-color: #cf40ff;\n  background-color: #1b1c1d;\n  color: #cf40ff;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .purple.label,\n.ui.ui.ui.inverted.purple.basic.tag.label {\n  border: 1px solid #dc73ff;\n}\n.ui.inverted.basic.tag.labels .purple.label::before,\n.ui.ui.ui.inverted.purple.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.pink.labels .label,\n.ui.ui.ui.pink.label {\n  background-color: #e03997;\n  border-color: #e03997;\n  color: #fff;\n}\n\n/* Link */\n.ui.pink.labels a.label:hover,\na.ui.ui.ui.pink.label:hover {\n  background-color: #e61a8d;\n  border-color: #e61a8d;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.pink.ribbon.label {\n  border-color: #c71f7e;\n}\n\n/* Basic */\n.ui.basic.labels .pink.label,\n.ui.ui.ui.basic.pink.label {\n  background: none #fff;\n  border-color: #e03997;\n  color: #e03997;\n}\n.ui.basic.labels a.pink.label:hover,\na.ui.ui.ui.basic.pink.label:hover {\n  background: none #fff;\n  border-color: #e61a8d;\n  color: #e61a8d;\n}\n\n/* Inverted */\n.ui.inverted.labels .pink.label,\n.ui.ui.ui.inverted.pink.label {\n  background-color: #ff8edf;\n  border-color: #ff8edf;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.pink.label:hover,\na.ui.ui.ui.inverted.pink.label:hover {\n  background-color: #ff5bd1;\n  border-color: #ff5bd1;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.pink.ribbon.label {\n  border-color: #ff5bd1;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .pink.label,\n.ui.ui.ui.inverted.basic.pink.label {\n  background-color: #1b1c1d;\n  border-color: #ff8edf;\n  color: #ff8edf;\n}\n.ui.inverted.basic.labels a.pink.label:hover,\na.ui.ui.ui.inverted.basic.pink.label:hover {\n  border-color: #ff5bd1;\n  background-color: #1b1c1d;\n  color: #ff5bd1;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .pink.label,\n.ui.ui.ui.inverted.pink.basic.tag.label {\n  border: 1px solid #ff8edf;\n}\n.ui.inverted.basic.tag.labels .pink.label::before,\n.ui.ui.ui.inverted.pink.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.brown.labels .label,\n.ui.ui.ui.brown.label {\n  background-color: #a5673f;\n  border-color: #a5673f;\n  color: #fff;\n}\n\n/* Link */\n.ui.brown.labels a.label:hover,\na.ui.ui.ui.brown.label:hover {\n  background-color: #975b33;\n  border-color: #975b33;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.brown.ribbon.label {\n  border-color: #805031;\n}\n\n/* Basic */\n.ui.basic.labels .brown.label,\n.ui.ui.ui.basic.brown.label {\n  background: none #fff;\n  border-color: #a5673f;\n  color: #a5673f;\n}\n.ui.basic.labels a.brown.label:hover,\na.ui.ui.ui.basic.brown.label:hover {\n  background: none #fff;\n  border-color: #975b33;\n  color: #975b33;\n}\n\n/* Inverted */\n.ui.inverted.labels .brown.label,\n.ui.ui.ui.inverted.brown.label {\n  background-color: #d67c1c;\n  border-color: #d67c1c;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.brown.label:hover,\na.ui.ui.ui.inverted.brown.label:hover {\n  background-color: #b0620f;\n  border-color: #b0620f;\n  color: #1b1c1d;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.brown.ribbon.label {\n  border-color: #a96216;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .brown.label,\n.ui.ui.ui.inverted.basic.brown.label {\n  background-color: #1b1c1d;\n  border-color: #d67c1c;\n  color: #d67c1c;\n}\n.ui.inverted.basic.labels a.brown.label:hover,\na.ui.ui.ui.inverted.basic.brown.label:hover {\n  border-color: #b0620f;\n  background-color: #1b1c1d;\n  color: #b0620f;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .brown.label,\n.ui.ui.ui.inverted.brown.basic.tag.label {\n  border: 1px solid #d67c1c;\n}\n.ui.inverted.basic.tag.labels .brown.label::before,\n.ui.ui.ui.inverted.brown.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.grey.labels .label,\n.ui.ui.ui.grey.label {\n  background-color: #767676;\n  border-color: #767676;\n  color: #fff;\n}\n\n/* Link */\n.ui.grey.labels a.label:hover,\na.ui.ui.ui.grey.label:hover {\n  background-color: #838383;\n  border-color: #838383;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.grey.ribbon.label {\n  border-color: #5d5d5d;\n}\n\n/* Basic */\n.ui.basic.labels .grey.label,\n.ui.ui.ui.basic.grey.label {\n  background: none #fff;\n  border-color: #767676;\n  color: #767676;\n}\n.ui.basic.labels a.grey.label:hover,\na.ui.ui.ui.basic.grey.label:hover {\n  background: none #fff;\n  border-color: #838383;\n  color: #838383;\n}\n\n/* Inverted */\n.ui.inverted.labels .grey.label,\n.ui.ui.ui.inverted.grey.label {\n  background-color: #dcddde;\n  border-color: #dcddde;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.grey.label:hover,\na.ui.ui.ui.inverted.grey.label:hover {\n  background-color: #c2c4c5;\n  border-color: #c2c4c5;\n  color: #fff;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.grey.ribbon.label {\n  border-color: #e9eaea;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .grey.label,\n.ui.ui.ui.inverted.basic.grey.label {\n  background-color: #1b1c1d;\n  border-color: #dcddde;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.basic.labels a.grey.label:hover,\na.ui.ui.ui.inverted.basic.grey.label:hover {\n  border-color: #c2c4c5;\n  background-color: #1b1c1d;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .grey.label,\n.ui.ui.ui.inverted.grey.basic.tag.label {\n  border: 1px solid #dcddde;\n}\n.ui.inverted.basic.tag.labels .grey.label::before,\n.ui.ui.ui.inverted.grey.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n.ui.black.labels .label,\n.ui.ui.ui.black.label {\n  background-color: #1b1c1d;\n  border-color: #1b1c1d;\n  color: #fff;\n}\n\n/* Link */\n.ui.black.labels a.label:hover,\na.ui.ui.ui.black.label:hover {\n  background-color: #27292a;\n  border-color: #27292a;\n  color: #fff;\n}\n\n/* Ribbon */\n.ui.ui.ui.black.ribbon.label {\n  border-color: #020203;\n}\n\n/* Basic */\n.ui.basic.labels .black.label,\n.ui.ui.ui.basic.black.label {\n  background: none #fff;\n  border-color: #1b1c1d;\n  color: #1b1c1d;\n}\n.ui.basic.labels a.black.label:hover,\na.ui.ui.ui.basic.black.label:hover {\n  background: none #fff;\n  border-color: #27292a;\n  color: #27292a;\n}\n\n/* Inverted */\n.ui.inverted.labels .black.label,\n.ui.ui.ui.inverted.black.label {\n  background-color: #545454;\n  border-color: #545454;\n  color: #1b1c1d;\n}\n\n/* Inverted Link */\n.ui.inverted.labels a.black.label:hover,\na.ui.ui.ui.inverted.black.label:hover {\n  background-color: #000000;\n  border-color: #000000;\n  color: #fff;\n}\n\n/* Inverted Ribbon */\n.ui.ui.ui.inverted.black.ribbon.label {\n  border-color: #616161;\n}\n\n/* Inverted Basic */\n.ui.inverted.basic.labels .black.label,\n.ui.ui.ui.inverted.basic.black.label {\n  background-color: #1b1c1d;\n  border-color: #545454;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.basic.labels a.black.label:hover,\na.ui.ui.ui.inverted.basic.black.label:hover {\n  border-color: #000000;\n  background-color: #1b1c1d;\n}\n\n/* Inverted Basic Tags */\n.ui.inverted.basic.tag.labels .black.label,\n.ui.ui.ui.inverted.black.basic.tag.label {\n  border: 1px solid #545454;\n}\n.ui.inverted.basic.tag.labels .black.label::before,\n.ui.ui.ui.inverted.black.basic.tag.label::before {\n  border-color: inherit;\n  border-width: 1px 0 0 1px;\n  border-style: inherit;\n  background-color: #1b1c1d;\n  right: calc(100% + 1px);\n}\n\n/* -------------------\n     Horizontal\n-------------------- */\n.ui.horizontal.labels .label,\n.ui.horizontal.label {\n  margin: 0 0.5em 0 0;\n  padding: 0.4em 0.833em;\n  min-width: 3em;\n  text-align: center;\n}\n\n/* -------------------\n           Circular\n    -------------------- */\n.ui.circular.labels .label,\n.ui.circular.label {\n  min-width: 2em;\n  min-height: 2em;\n  padding: 0.5em !important;\n  line-height: 1em;\n  text-align: center;\n  border-radius: 500rem;\n}\n.ui.empty.circular.labels .label,\n.ui.empty.circular.label {\n  min-width: 0;\n  min-height: 0;\n  overflow: hidden;\n  width: 0.5em;\n  height: 0.5em;\n  vertical-align: baseline;\n}\n\n/* -------------------\n           Pointing\n    -------------------- */\n.ui.pointing.label {\n  position: relative;\n}\n.ui.attached.pointing.label {\n  position: absolute;\n}\n.ui.pointing.label::before {\n  background-color: inherit;\n  background-image: inherit;\n  border-width: 0;\n  border-style: solid;\n  border-color: inherit;\n}\n\n/* Arrow */\n.ui.pointing.label::before {\n  position: absolute;\n  content: \"\";\n  transform: rotate(45deg);\n  background-image: none;\n  z-index: 2;\n  width: 0.6666em;\n  height: 0.6666em;\n  transition: none;\n}\n\n/* --- Above --- */\n.ui.pointing.label,\n.ui[class*=\"pointing above\"].label {\n  margin-top: 1em;\n}\n.ui.pointing.label::before,\n.ui[class*=\"pointing above\"].label::before {\n  border-width: 1px 0 0 1px;\n  transform: translateX(-50%) translateY(-50%) rotate(45deg);\n  top: 0;\n  left: 50%;\n}\n\n/* --- Below --- */\n.ui[class*=\"bottom pointing\"].label,\n.ui[class*=\"pointing below\"].label {\n  margin-top: 0;\n  margin-bottom: 1em;\n}\n.ui[class*=\"bottom pointing\"].label::before,\n.ui[class*=\"pointing below\"].label::before {\n  border-width: 0 1px 1px 0;\n  right: auto;\n  transform: translateX(-50%) translateY(-50%) rotate(45deg);\n  top: 100%;\n  left: 50%;\n}\n\n/* --- Left --- */\n.ui[class*=\"left pointing\"].label {\n  margin-top: 0;\n  margin-left: 0.6666em;\n}\n.ui[class*=\"left pointing\"].label::before {\n  border-width: 0 0 1px 1px;\n  transform: translateX(-50%) translateY(-50%) rotate(45deg);\n  bottom: auto;\n  right: auto;\n  top: 50%;\n  left: 0;\n}\n\n/* --- Right --- */\n.ui[class*=\"right pointing\"].label {\n  margin-top: 0;\n  margin-right: 0.6666em;\n}\n.ui[class*=\"right pointing\"].label::before {\n  border-width: 1px 1px 0 0;\n  transform: translateX(50%) translateY(-50%) rotate(45deg);\n  top: 50%;\n  right: 0;\n  bottom: auto;\n  left: auto;\n}\n\n/* Basic Pointing */\n\n/* --- Above --- */\n.ui.basic.pointing.label::before,\n.ui.basic[class*=\"pointing above\"].label::before {\n  margin-top: -1px;\n}\n\n/* --- Below --- */\n.ui.basic[class*=\"bottom pointing\"].label::before,\n.ui.basic[class*=\"pointing below\"].label::before {\n  bottom: auto;\n  top: 100%;\n  margin-top: 1px;\n}\n\n/* --- Left --- */\n.ui.basic[class*=\"left pointing\"].label::before {\n  top: 50%;\n  left: -1px;\n}\n\n/* --- Right --- */\n.ui.basic[class*=\"right pointing\"].label::before {\n  top: 50%;\n  right: -1px;\n}\n\n/* ------------------\n       Floating Label\n    ------------------- */\n.ui.floating.label {\n  position: absolute;\n  z-index: 100;\n  top: -1em;\n  right: 0;\n  white-space: nowrap;\n  transform: translateX(50%);\n}\n.ui.right.aligned.floating.label {\n  transform: translateX(1.2em);\n}\n.ui.left.floating.label {\n  left: 0;\n  right: auto;\n  transform: translateX(-50%);\n}\n.ui.left.aligned.floating.label {\n  transform: translateX(-1.2em);\n}\n.ui.bottom.floating.label {\n  top: auto;\n  bottom: -1em;\n}\n\n/* -------------------\n        Sizes\n-------------------- */\n.ui.labels .label,\n.ui.label {\n  font-size: 0.85714286rem;\n}\n.ui.mini.labels .label,\n.ui.mini.label {\n  font-size: 0.64285714rem;\n}\n.ui.tiny.labels .label,\n.ui.tiny.label {\n  font-size: 0.71428571rem;\n}\n.ui.small.labels .label,\n.ui.small.label {\n  font-size: 0.78571429rem;\n}\n.ui.large.labels .label,\n.ui.large.label {\n  font-size: 1rem;\n}\n.ui.big.labels .label,\n.ui.big.label {\n  font-size: 1.28571429rem;\n}\n.ui.huge.labels .label,\n.ui.huge.label {\n  font-size: 1.42857143rem;\n}\n.ui.massive.labels .label,\n.ui.massive.label {\n  font-size: 1.71428571rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/list.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - List\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            List\n*******************************/\n\nul.ui.list,\nol.ui.list,\n.ui.list {\n  list-style-type: none;\n  margin: 1em 0;\n  padding: 0 0;\n}\nul.ui.list:first-child,\nol.ui.list:first-child,\n.ui.list:first-child {\n  margin-top: 0;\n  padding-top: 0;\n}\nul.ui.list:last-child,\nol.ui.list:last-child,\n.ui.list:last-child {\n  margin-bottom: 0;\n  padding-bottom: 0;\n}\n\n\n/*******************************\n            Content\n*******************************/\n\n\n/* List Item */\nul.ui.list li,\nol.ui.list li,\n.ui.list > .item,\n.ui.list .list > .item {\n  display: list-item;\n  table-layout: fixed;\n  list-style-type: none;\n  list-style-position: outside;\n  padding: 0.21428571em 0;\n  line-height: 1.14285714em;\n}\nul.ui.list > li:first-child::after,\nol.ui.list > li:first-child::after,\n.ui.list > .list > .item::after,\n.ui.list > .item::after {\n  content: \"\";\n  display: block;\n  height: 0;\n  clear: both;\n  visibility: hidden;\n}\nul.ui.list li:first-child,\nol.ui.list li:first-child,\n.ui.list .list > .item:first-child,\n.ui.list > .item:first-child {\n  padding-top: 0;\n}\nul.ui.list li:last-child,\nol.ui.list li:last-child,\n.ui.list .list > .item:last-child,\n.ui.list > .item:last-child {\n  padding-bottom: 0;\n}\n\n/* Child List */\nul.ui.list ul,\nol.ui.list ol,\n.ui.list .list:not(.icon) {\n  clear: both;\n  margin: 0;\n  padding: 0.75em 0 0.25em 0.5em;\n}\n\n/* Child Item */\nul.ui.list ul li,\nol.ui.list ol li,\n.ui.list .list > .item {\n  padding: 0.14285714em 0;\n  line-height: inherit;\n}\n\n/* Icon */\n.ui.list .list > .item > i.icon,\n.ui.list > .item > i.icon {\n  display: table-cell;\n  min-width: 1.55em;\n  margin: 0;\n  padding-top: 0;\n  transition: color 0.1s ease;\n}\n.ui.list .list > .item > i.icon:not(.loading),\n.ui.list > .item > i.icon:not(.loading) {\n  padding-right: 0.28571429em;\n  vertical-align: top;\n}\n.ui.list .list > .item > i.icon:only-child,\n.ui.list > .item > i.icon:only-child {\n  display: inline-block;\n  min-width: auto;\n  vertical-align: top;\n}\n\n/* Image */\n.ui.list .list > .item > .image,\n.ui.list > .item > .image {\n  display: table-cell;\n  background-color: transparent;\n  margin: 0;\n  vertical-align: top;\n}\n.ui.list .list > .item > .image:not(:only-child):not(img),\n.ui.list > .item > .image:not(:only-child):not(img) {\n  padding-right: 0.5em;\n}\n.ui.list .list > .item > .image img,\n.ui.list > .item > .image img {\n  vertical-align: top;\n}\n.ui.list .list > .item > img.image,\n.ui.list .list > .item > .image:only-child,\n.ui.list > .item > img.image,\n.ui.list > .item > .image:only-child {\n  display: inline-block;\n}\n\n/* Content */\n.ui.list .list > .item > .content,\n.ui.list > .item > .content {\n  line-height: 1.14285714em;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.list .list > .item > .image + .content,\n.ui.list .list > .item > i.icon + .content,\n.ui.list > .item > .image + .content,\n.ui.list > .item > i.icon + .content {\n  display: table-cell;\n  width: 100%;\n  padding: 0 0 0 0.5em;\n  vertical-align: top;\n}\n.ui.list .list > .item > i.loading.icon + .content,\n.ui.list > .item > i.loading.icon + .content {\n  padding-left: calc(0.2857142857142857em + 0.5em);\n}\n.ui.list .list > .item > img.image + .content,\n.ui.list > .item > img.image + .content {\n  display: inline-block;\n  width: auto;\n}\n.ui.list .list > .item > .content > .list,\n.ui.list > .item > .content > .list {\n  margin-left: 0;\n  padding-left: 0;\n}\n\n/* Header */\n.ui.list .list > .item .header,\n.ui.list > .item .header {\n  display: block;\n  margin: 0;\n  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\";\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* Description */\n.ui.list .list > .item .description,\n.ui.list > .item .description {\n  display: block;\n  color: rgba(0, 0, 0, 0.7);\n}\n\n/* Child Link */\n.ui.list > .item a,\n.ui.list .list > .item a {\n  cursor: pointer;\n}\n\n/* Linking Item */\n.ui.list .list > a.item,\n.ui.list > a.item {\n  cursor: pointer;\n  color: #4183c4;\n}\n.ui.list .list > a.item:hover,\n.ui.list > a.item:hover {\n  color: #1e70bf;\n}\n\n/* Linked Item Icons */\n.ui.list .list > a.item > i.icons,\n.ui.list > a.item > i.icons,\n.ui.list .list > a.item > i.icon,\n.ui.list > a.item > i.icon {\n  color: rgba(0, 0, 0, 0.4);\n}\n\n/* Header Link */\n.ui.list .list > .item a.header,\n.ui.list > .item a.header {\n  cursor: pointer;\n  color: #4183c4 !important;\n}\n.ui.list .list > .item > a.header:hover,\n.ui.list > .item > a.header:hover {\n  color: #1e70bf !important;\n}\n\n/* Floated Content */\n.ui[class*=\"left floated\"].list {\n  float: left;\n}\n.ui[class*=\"right floated\"].list {\n  float: right;\n}\n.ui.list .list > .item [class*=\"left floated\"],\n.ui.list > .item [class*=\"left floated\"] {\n  float: left;\n  margin: 0 1em 0 0;\n}\n.ui.list .list > .item [class*=\"right floated\"],\n.ui.list > .item [class*=\"right floated\"] {\n  float: right;\n  margin: 0 0 0 1em;\n}\n\n\n/*******************************\n            Coupling\n*******************************/\n\n.ui.menu .ui.list > .item,\n.ui.menu .ui.list .list > .item {\n  display: list-item;\n  table-layout: fixed;\n  background-color: transparent;\n  list-style-type: none;\n  list-style-position: outside;\n  padding: 0.21428571em 0;\n  line-height: 1.14285714em;\n}\n.ui.menu .ui.list .list > .item::before,\n.ui.menu .ui.list > .item::before {\n  border: none;\n  background: none;\n}\n.ui.menu .ui.list .list > .item:first-child,\n.ui.menu .ui.list > .item:first-child {\n  padding-top: 0;\n}\n.ui.menu .ui.list .list > .item:last-child,\n.ui.menu .ui.list > .item:last-child {\n  padding-bottom: 0;\n}\n\n\n/*******************************\n            Types\n*******************************/\n\n\n/* -------------------\n          Horizontal\n    -------------------- */\n.ui.horizontal.list {\n  display: inline-block;\n  font-size: 0;\n}\n.ui.horizontal.list > .item {\n  display: inline-block;\n  margin-right: 1em;\n  font-size: 1rem;\n}\n.ui.horizontal.list:not(.celled) > .item:last-child {\n  margin-right: 0;\n  padding-right: 0;\n}\n.ui.horizontal.list .list:not(.icon) {\n  padding-left: 0;\n  padding-bottom: 0;\n}\n.ui.horizontal.list > .item > .image,\n.ui.horizontal.list .list > .item > .image,\n.ui.horizontal.list > .item > i.icon,\n.ui.horizontal.list .list > .item > i.icon,\n.ui.horizontal.list > .item > .content,\n.ui.horizontal.list .list > .item > .content {\n  vertical-align: middle;\n}\n\n/* Padding on all elements */\n.ui.horizontal.list > .item:first-child,\n.ui.horizontal.list > .item:last-child {\n  padding-top: 0.21428571em;\n  padding-bottom: 0.21428571em;\n}\n\n/* Horizontal List */\n.ui.horizontal.list > .item > i.icon,\n.ui.horizontal.list .item > i.icons > i.icon {\n  margin: 0;\n  padding: 0 0.25em 0 0;\n}\n.ui.horizontal.list > .item > .image + .content,\n.ui.horizontal.list > .item > i.icon,\n.ui.horizontal.list > .item > i.icon + .content {\n  float: none;\n  display: inline-block;\n  width: auto;\n}\n.ui.horizontal.list > .item > .image {\n  display: inline-block;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n\n/* -------------------\n           Disabled\n    -------------------- */\n.ui.list .list > .disabled.item,\n.ui.list > .disabled.item {\n  pointer-events: none;\n  color: rgba(40, 40, 40, 0.3) !important;\n}\n.ui.inverted.list .list > .disabled.item,\n.ui.inverted.list > .disabled.item {\n  color: rgba(225, 225, 225, 0.3) !important;\n}\n\n/* -------------------\n        Hover\n-------------------- */\n.ui.list .list > a.item:hover > .icons,\n.ui.list > a.item:hover > .icons,\n.ui.list .list > a.item:hover > i.icon,\n.ui.list > a.item:hover > i.icon {\n  color: rgba(0, 0, 0, 0.87);\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* -------------------\n           Inverted\n    -------------------- */\n.ui.inverted.list .list > a.item > i.icon,\n.ui.inverted.list > a.item > i.icon {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.list .list > .item .header,\n.ui.inverted.list > .item .header {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.list .list > .item .description,\n.ui.inverted.list > .item .description {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.inverted.list .list > .item > .content,\n.ui.inverted.list > .item > .content {\n  color: rgba(255, 255, 255, 0.7);\n}\n\n/* Item Link */\n.ui.inverted.list .list > a.item,\n.ui.inverted.list > a.item {\n  cursor: pointer;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.list .list > a.item:hover,\n.ui.inverted.list > a.item:hover {\n  color: #1e70bf;\n}\n\n/* Linking Content */\n.ui.inverted.list .item a:not(.ui) {\n  color: rgba(255, 255, 255, 0.9) !important;\n}\n.ui.inverted.list .item a:not(.ui):hover {\n  color: #1e70bf !important;\n}\n\n/* -------------------\n           Aligned\n    -------------------- */\n.ui.list[class*=\"top aligned\"] .image,\n.ui.list[class*=\"top aligned\"] .content,\n.ui.list [class*=\"top aligned\"] {\n  vertical-align: top !important;\n}\n.ui.list[class*=\"middle aligned\"] .image,\n.ui.list[class*=\"middle aligned\"] .content,\n.ui.list [class*=\"middle aligned\"] {\n  vertical-align: middle !important;\n}\n.ui.list[class*=\"bottom aligned\"] .image,\n.ui.list[class*=\"bottom aligned\"] .content,\n.ui.list [class*=\"bottom aligned\"] {\n  vertical-align: bottom !important;\n}\n\n/* -------------------\n           Link\n    -------------------- */\n.ui.link.list .item,\n.ui.link.list a.item,\n.ui.link.list .item a:not(.ui) {\n  color: rgba(0, 0, 0, 0.4);\n  transition: 0.1s color ease;\n}\n.ui.ui.link.list a.item:hover,\n.ui.ui.link.list .item a:not(.ui):hover {\n  color: rgba(0, 0, 0, 0.8);\n}\n.ui.ui.link.list a.item:active,\n.ui.ui.link.list .item a:not(.ui):active {\n  color: rgba(0, 0, 0, 0.9);\n}\n.ui.ui.link.list .active.item,\n.ui.ui.link.list .active.item a:not(.ui) {\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* Inverted */\n.ui.inverted.link.list .item,\n.ui.inverted.link.list a.item,\n.ui.inverted.link.list .item a:not(.ui) {\n  color: rgba(255, 255, 255, 0.5);\n}\n.ui.ui.inverted.link.list a.item:hover,\n.ui.ui.inverted.link.list .item a:not(.ui):hover {\n  color: #ffffff;\n}\n.ui.ui.inverted.link.list a.item:active,\n.ui.ui.inverted.link.list .item a:not(.ui):active {\n  color: #ffffff;\n}\n.ui.ui.inverted.link.list a.active.item,\n.ui.ui.inverted.link.list .active.item a:not(.ui) {\n  color: #ffffff;\n}\n\n/* -------------------\n          Selection\n    -------------------- */\n.ui.selection.list .list > .item,\n.ui.selection.list > .item {\n  cursor: pointer;\n  background: transparent;\n  padding: 0.5em 0.5em;\n  margin: 0;\n  color: rgba(0, 0, 0, 0.4);\n  border-radius: 0.5em;\n  transition: 0.1s color ease, 0.1s padding-left ease, 0.1s background-color ease;\n}\n.ui.selection.list .list > .item:last-child,\n.ui.selection.list > .item:last-child {\n  margin-bottom: 0;\n}\n.ui.selection.list .list > .item:hover,\n.ui.selection.list > .item:hover {\n  background: rgba(0, 0, 0, 0.03);\n  color: rgba(0, 0, 0, 0.8);\n}\n.ui.selection.list .list > .item:active,\n.ui.selection.list > .item:active {\n  background: rgba(0, 0, 0, 0.05);\n  color: rgba(0, 0, 0, 0.9);\n}\n.ui.selection.list .list > .item.active,\n.ui.selection.list > .item.active {\n  background: rgba(0, 0, 0, 0.05);\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* Inverted */\n.ui.inverted.selection.list > .item {\n  background: transparent;\n  color: rgba(255, 255, 255, 0.5);\n}\n.ui.inverted.selection.list > .item:hover {\n  background: rgba(255, 255, 255, 0.02);\n  color: #ffffff;\n}\n.ui.inverted.selection.list > .item:active {\n  background: rgba(255, 255, 255, 0.08);\n  color: #ffffff;\n}\n.ui.inverted.selection.list > .item.active {\n  background: rgba(255, 255, 255, 0.08);\n  color: #ffffff;\n}\n\n/* Celled / Divided Selection List */\n.ui.celled.selection.list .list > .item,\n.ui.divided.selection.list .list > .item,\n.ui.celled.selection.list > .item,\n.ui.divided.selection.list > .item {\n  border-radius: 0;\n}\n\n/* -------------------\n           Animated\n    -------------------- */\n.ui.animated.list > .item {\n  transition: 0.25s color ease 0.1s, 0.25s padding-left ease 0.1s, 0.25s background-color ease 0.1s;\n}\n.ui.animated.list:not(.horizontal) > .item:hover {\n  padding-left: 1em;\n}\n\n/* -------------------\n           Fitted\n    -------------------- */\n.ui.fitted.list:not(.selection) .list > .item,\n.ui.fitted.list:not(.selection) > .item {\n  padding-left: 0;\n  padding-right: 0;\n}\n.ui.fitted.selection.list .list > .item,\n.ui.fitted.selection.list > .item {\n  margin-left: -0.5em;\n  margin-right: -0.5em;\n}\n\n/* -------------------\n          Bulleted\n    -------------------- */\nul.ui.list,\n.ui.bulleted.list {\n  margin-left: 1.25rem;\n}\nul.ui.list li,\n.ui.bulleted.list .list > .item,\n.ui.bulleted.list > .item {\n  position: relative;\n}\nul.ui.list li::before,\n.ui.bulleted.list .list > .item::before,\n.ui.bulleted.list > .item::before {\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  pointer-events: none;\n  position: absolute;\n  top: auto;\n  left: auto;\n  font-weight: normal;\n  margin-left: -1.25rem;\n  content: \"\\2022\";\n  opacity: 1;\n  color: inherit;\n  vertical-align: top;\n}\nul.ui.list li::before,\n.ui.bulleted.list .list > a.item::before,\n.ui.bulleted.list > a.item::before {\n  color: rgba(0, 0, 0, 0.87);\n}\nul.ui.list ul,\n.ui.bulleted.list .list:not(.icon) {\n  padding-left: 1.25rem;\n}\n\n/* Horizontal Bulleted */\nul.ui.horizontal.bulleted.list,\n.ui.horizontal.bulleted.list {\n  margin-left: 0;\n}\nul.ui.horizontal.bulleted.list li,\n.ui.horizontal.bulleted.list > .item {\n  margin-left: 1.75rem;\n}\nul.ui.horizontal.bulleted.list li:first-child,\n.ui.horizontal.bulleted.list > .item:first-child {\n  margin-left: 0;\n}\nul.ui.horizontal.bulleted.list li::before,\n.ui.horizontal.bulleted.list > .item::before {\n  color: rgba(0, 0, 0, 0.87);\n}\nul.ui.horizontal.bulleted.list li:first-child::before,\n.ui.horizontal.bulleted.list > .item:first-child::before {\n  display: none;\n}\n\n/* -------------------\n           Ordered\n    -------------------- */\nol.ui.list,\n.ui.ordered.list,\n.ui.ordered.list .list:not(.icon),\nol.ui.list ol {\n  counter-reset: ordered;\n  margin-left: 1.25rem;\n  list-style-type: none;\n}\nol.ui.list li,\n.ui.ordered.list .list > .item,\n.ui.ordered.list > .item {\n  list-style-type: none;\n  position: relative;\n}\nol.ui.list li::before,\n.ui.ordered.list .list > .item::before,\n.ui.ordered.list > .item::before {\n  position: absolute;\n  top: auto;\n  left: auto;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  pointer-events: none;\n  margin-left: -1.25rem;\n  counter-increment: ordered;\n  content: counters(ordered, \".\") \" \";\n  text-align: right;\n  color: rgba(0, 0, 0, 0.87);\n  vertical-align: middle;\n  opacity: 0.8;\n}\nol.ui.inverted.list li::before,\n.ui.ordered.inverted.list .list > .item::before,\n.ui.ordered.inverted.list > .item::before {\n  color: rgba(255, 255, 255, 0.7);\n}\n\n/* Value */\n.ui.ordered.list .list > .item[data-value]::before,\n.ui.ordered.list > .item[data-value]::before {\n  content: attr(data-value);\n}\nol.ui.list li[value]::before {\n  content: attr(value);\n}\n\n/* Child Lists */\nol.ui.list ol,\n.ui.ordered.list .list:not(.icon) {\n  margin-left: 1em;\n}\nol.ui.list ol li::before,\n.ui.ordered.list .list > .item::before {\n  margin-left: -2em;\n}\n\n/* Horizontal Ordered */\nol.ui.horizontal.list,\n.ui.ordered.horizontal.list {\n  margin-left: 0;\n}\nol.ui.horizontal.list li::before,\n.ui.ordered.horizontal.list .list > .item::before,\n.ui.ordered.horizontal.list > .item::before {\n  position: static;\n  margin: 0 0.5em 0 0;\n}\n\n/* Suffixed Ordered */\nol.ui.suffixed.list li::before,\n.ui.suffixed.ordered.list .list > .item::before,\n.ui.suffixed.ordered.list > .item::before {\n  content: counters(ordered, \".\") \".\";\n}\n\n/* -------------------\n           Divided\n    -------------------- */\n.ui.divided.list > .item {\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.divided.list .list > .item {\n  border-top: none;\n}\n.ui.divided.list .item .list > .item {\n  border-top: none;\n}\n.ui.divided.list .list > .item:first-child,\n.ui.divided.list > .item:first-child {\n  border-top: none;\n}\n\n/* Sub Menu */\n.ui.divided.list:not(.horizontal) .list > .item:first-child {\n  border-top-width: 1px;\n}\n\n/* Divided bulleted */\n.ui.divided.bulleted.list:not(.horizontal),\n.ui.divided.bulleted.list .list:not(.icon) {\n  margin-left: 0;\n  padding-left: 0;\n}\n.ui.divided.bulleted.list > .item:not(.horizontal) {\n  padding-left: 1.25rem;\n}\n\n/* Divided Ordered */\n.ui.divided.ordered.list {\n  margin-left: 0;\n}\n.ui.divided.ordered.list .list > .item,\n.ui.divided.ordered.list > .item {\n  padding-left: 1.25rem;\n}\n.ui.divided.ordered.list .item .list:not(.icon) {\n  margin-left: 0;\n  margin-right: 0;\n  padding-bottom: 0.21428571em;\n}\n.ui.divided.ordered.list .item .list > .item {\n  padding-left: 1em;\n}\n\n/* Divided Selection */\n.ui.divided.selection.list .list > .item,\n.ui.divided.selection.list > .item {\n  margin: 0;\n  border-radius: 0;\n}\n\n/* Divided horizontal */\n.ui.divided.horizontal.list {\n  margin-left: 0;\n}\n.ui.divided.horizontal.list > .item {\n  padding-left: 0.5em;\n}\n.ui.divided.horizontal.list > .item:not(:last-child) {\n  padding-right: 0.5em;\n}\n.ui.divided.horizontal.list > .item {\n  border-top: none;\n  border-right: 1px solid rgba(34, 36, 38, 0.15);\n  margin: 0;\n  line-height: 0.6;\n}\n.ui.horizontal.divided.list > .item:last-child {\n  border-right: none;\n}\n\n/* Inverted */\n.ui.divided.inverted.list > .item,\n.ui.divided.inverted.list > .list,\n.ui.divided.inverted.horizontal.list > .item {\n  border-color: rgba(255, 255, 255, 0.1);\n}\n\n/* -------------------\n            Celled\n    -------------------- */\n.ui.celled.list > .item,\n.ui.celled.list > .list {\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n  padding-left: 0.5em;\n  padding-right: 0.5em;\n}\n.ui.celled.list > .item:last-child {\n  border-bottom: 1px solid rgba(34, 36, 38, 0.15);\n}\n\n/* Padding on all elements */\n.ui.celled.list > .item:first-child,\n.ui.celled.list > .item:last-child {\n  padding-top: 0.21428571em;\n  padding-bottom: 0.21428571em;\n}\n\n/* Sub Menu */\n.ui.celled.list .item .list > .item {\n  border-width: 0;\n}\n.ui.celled.list .list > .item:first-child {\n  border-top-width: 0;\n}\n\n/* Celled Bulleted */\n.ui.celled.bulleted.list {\n  margin-left: 0;\n}\n.ui.celled.bulleted.list .list > .item,\n.ui.celled.bulleted.list > .item {\n  padding-left: 1.25rem;\n}\n.ui.celled.bulleted.list .item .list:not(.icon) {\n  margin-left: -1.25rem;\n  margin-right: -1.25rem;\n  padding-bottom: 0.21428571em;\n}\n\n/* Celled Ordered */\n.ui.celled.ordered.list {\n  margin-left: 0;\n}\n.ui.celled.ordered.list .list > .item,\n.ui.celled.ordered.list > .item {\n  padding-left: 1.25rem;\n}\n.ui.celled.ordered.list .item .list:not(.icon) {\n  margin-left: 0;\n  margin-right: 0;\n  padding-bottom: 0.21428571em;\n}\n.ui.celled.ordered.list .list > .item {\n  padding-left: 1em;\n}\n\n/* Celled Horizontal */\n.ui.horizontal.celled.list {\n  margin-left: 0;\n}\n.ui.horizontal.celled.list .list > .item,\n.ui.horizontal.celled.list > .item {\n  border-top: none;\n  border-left: 1px solid rgba(34, 36, 38, 0.15);\n  margin: 0;\n  padding-left: 0.5em;\n  padding-right: 0.5em;\n  line-height: 0.6;\n}\n.ui.horizontal.celled.list .list > .item:last-child,\n.ui.horizontal.celled.list > .item:last-child {\n  border-bottom: none;\n  border-right: 1px solid rgba(34, 36, 38, 0.15);\n}\n\n/* Inverted */\n.ui.celled.inverted.list > .item,\n.ui.celled.inverted.list > .list {\n  border-color: rgba(255, 255, 255, 0.1);\n}\n.ui.celled.inverted.horizontal.list .list > .item,\n.ui.celled.inverted.horizontal.list > .item {\n  border-color: rgba(255, 255, 255, 0.1);\n}\n\n/* -------------------\n           Relaxed\n    -------------------- */\n.ui.relaxed.list:not(.horizontal) > .item:not(:first-child) {\n  padding-top: 0.42857143em;\n}\n.ui.relaxed.list:not(.horizontal) > .item:not(:last-child) {\n  padding-bottom: 0.42857143em;\n}\n.ui.horizontal.relaxed.list .list > .item:not(:first-child),\n.ui.horizontal.relaxed.list > .item:not(:first-child) {\n  padding-left: 1rem;\n}\n.ui.horizontal.relaxed.list .list > .item:not(:last-child),\n.ui.horizontal.relaxed.list > .item:not(:last-child) {\n  padding-right: 1rem;\n}\n\n/* Very Relaxed */\n.ui[class*=\"very relaxed\"].list:not(.horizontal) > .item:not(:first-child) {\n  padding-top: 0.85714286em;\n}\n.ui[class*=\"very relaxed\"].list:not(.horizontal) > .item:not(:last-child) {\n  padding-bottom: 0.85714286em;\n}\n.ui.horizontal[class*=\"very relaxed\"].list .list > .item:not(:first-child),\n.ui.horizontal[class*=\"very relaxed\"].list > .item:not(:first-child) {\n  padding-left: 1.5rem;\n}\n.ui.horizontal[class*=\"very relaxed\"].list .list > .item:not(:last-child),\n.ui.horizontal[class*=\"very relaxed\"].list > .item:not(:last-child) {\n  padding-right: 1.5rem;\n}\n\n/* -------------------\n      Sizes\n-------------------- */\n.ui.list {\n  font-size: 1em;\n}\n.ui.mini.list {\n  font-size: 0.78571429em;\n}\n.ui.mini.horizontal.list .list > .item,\n.ui.mini.horizontal.list > .item {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.list {\n  font-size: 0.85714286em;\n}\n.ui.tiny.horizontal.list .list > .item,\n.ui.tiny.horizontal.list > .item {\n  font-size: 0.85714286rem;\n}\n.ui.small.list {\n  font-size: 0.92857143em;\n}\n.ui.small.horizontal.list .list > .item,\n.ui.small.horizontal.list > .item {\n  font-size: 0.92857143rem;\n}\n.ui.large.list {\n  font-size: 1.14285714em;\n}\n.ui.large.horizontal.list .list > .item,\n.ui.large.horizontal.list > .item {\n  font-size: 1.14285714rem;\n}\n.ui.big.list {\n  font-size: 1.28571429em;\n}\n.ui.big.horizontal.list .list > .item,\n.ui.big.horizontal.list > .item {\n  font-size: 1.28571429rem;\n}\n.ui.huge.list {\n  font-size: 1.42857143em;\n}\n.ui.huge.horizontal.list .list > .item,\n.ui.huge.horizontal.list > .item {\n  font-size: 1.42857143rem;\n}\n.ui.massive.list {\n  font-size: 1.71428571em;\n}\n.ui.massive.horizontal.list .list > .item,\n.ui.massive.horizontal.list > .item {\n  font-size: 1.71428571rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/loader.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Loader\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Loader\n*******************************/\n\n\n/* Standard Size */\n.ui.loader {\n  display: none;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin: 0;\n  text-align: center;\n  z-index: 1000;\n  transform: translateX(-50%) translateY(-50%);\n}\n\n/* Static Shape */\n.ui.loader::before {\n  position: absolute;\n  content: \"\";\n  top: 0;\n  left: 50%;\n  width: 100%;\n  height: 100%;\n  border-radius: 500rem;\n  border: 0.2em solid rgba(0, 0, 0, 0.1);\n}\n\n/* Active Shape */\n.ui.loader::after {\n  position: absolute;\n  content: \"\";\n  top: 0;\n  left: 50%;\n  width: 100%;\n  height: 100%;\n  animation: loader 0.6s infinite linear;\n  border: 0.2em solid #767676;\n  border-radius: 500rem;\n  box-shadow: 0 0 0 1px transparent;\n}\n\n/* Speeds */\n.ui.ui.fast.loading::after,\n.ui.ui.fast.loading .input > i.icon::after,\n.ui.ui.fast.loading > i.icon::after,\n.ui.fast.loader::after {\n  animation-duration: 0.3s;\n}\n.ui.ui.slow.loading::after,\n.ui.ui.slow.loading .input > i.icon::after,\n.ui.ui.slow.loading > i.icon::after,\n.ui.slow.loader::after {\n  animation-duration: 0.9s;\n}\n\n/* Active Animation */\n@keyframes loader {\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n/* -------------------\n      Coupling\n-------------------- */\n\n/* Show inside active dimmer */\n.ui.dimmer > .loader {\n  display: block;\n}\n\n/* Black Dimmer */\n.ui.dimmer > .ui.loader {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.dimmer > .ui.loader:not(.elastic)::before {\n  border-color: rgba(255, 255, 255, 0.15);\n}\n\n/* White Dimmer (Inverted) */\n.ui.inverted.dimmer > .ui.loader {\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.inverted.dimmer > .ui.loader:not(.elastic)::before {\n  border-color: rgba(0, 0, 0, 0.1);\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/* -------------------\n            Text\n    -------------------- */\n.ui.ui.ui.ui.text.loader {\n  width: auto;\n  height: auto;\n  text-align: center;\n  font-style: normal;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n.ui.indeterminate.loader::after {\n  animation-direction: reverse;\n  animation-duration: 1.2s;\n}\n.ui.loader.active,\n.ui.loader.visible {\n  display: block;\n}\n.ui.loader.disabled,\n.ui.loader.hidden {\n  display: none;\n}\n\n\n/*******************************\n            Variations\n*******************************/\n\n\n/* -------------------\n        Sizes\n-------------------- */\n.ui.loader {\n  width: 2.28571429rem;\n  height: 2.28571429rem;\n  font-size: 1em;\n}\n.ui.loader::before,\n.ui.loader::after {\n  width: 2.28571429rem;\n  height: 2.28571429rem;\n  margin: 0 0 0 -1.14285714rem;\n}\n.ui.text.loader {\n  min-width: 2.28571429rem;\n  padding-top: 3.07142857rem;\n}\n.ui.mini.loader {\n  width: 1rem;\n  height: 1rem;\n  font-size: 0.78571429em;\n}\n.ui.mini.loader::before,\n.ui.mini.loader::after {\n  width: 1rem;\n  height: 1rem;\n  margin: 0 0 0 -0.5rem;\n}\n.ui.mini.text.loader {\n  min-width: 1rem;\n  padding-top: 1.78571429rem;\n}\n.ui.tiny.loader {\n  width: 1.14285714rem;\n  height: 1.14285714rem;\n  font-size: 0.85714286em;\n}\n.ui.tiny.loader::before,\n.ui.tiny.loader::after {\n  width: 1.14285714rem;\n  height: 1.14285714rem;\n  margin: 0 0 0 -0.57142857rem;\n}\n.ui.tiny.text.loader {\n  min-width: 1.14285714rem;\n  padding-top: 1.92857143rem;\n}\n.ui.small.loader {\n  width: 1.71428571rem;\n  height: 1.71428571rem;\n  font-size: 0.92857143em;\n}\n.ui.small.loader::before,\n.ui.small.loader::after {\n  width: 1.71428571rem;\n  height: 1.71428571rem;\n  margin: 0 0 0 -0.85714286rem;\n}\n.ui.small.text.loader {\n  min-width: 1.71428571rem;\n  padding-top: 2.5rem;\n}\n.ui.large.loader {\n  width: 3.42857143rem;\n  height: 3.42857143rem;\n  font-size: 1.14285714em;\n}\n.ui.large.loader::before,\n.ui.large.loader::after {\n  width: 3.42857143rem;\n  height: 3.42857143rem;\n  margin: 0 0 0 -1.71428571rem;\n}\n.ui.large.text.loader {\n  min-width: 3.42857143rem;\n  padding-top: 4.21428571rem;\n}\n.ui.big.loader {\n  width: 3.71428571rem;\n  height: 3.71428571rem;\n  font-size: 1.28571429em;\n}\n.ui.big.loader::before,\n.ui.big.loader::after {\n  width: 3.71428571rem;\n  height: 3.71428571rem;\n  margin: 0 0 0 -1.85714286rem;\n}\n.ui.big.text.loader {\n  min-width: 3.71428571rem;\n  padding-top: 4.5rem;\n}\n.ui.huge.loader {\n  width: 4.14285714rem;\n  height: 4.14285714rem;\n  font-size: 1.42857143em;\n}\n.ui.huge.loader::before,\n.ui.huge.loader::after {\n  width: 4.14285714rem;\n  height: 4.14285714rem;\n  margin: 0 0 0 -2.07142857rem;\n}\n.ui.huge.text.loader {\n  min-width: 4.14285714rem;\n  padding-top: 4.92857143rem;\n}\n.ui.massive.loader {\n  width: 4.57142857rem;\n  height: 4.57142857rem;\n  font-size: 1.71428571em;\n}\n.ui.massive.loader::before,\n.ui.massive.loader::after {\n  width: 4.57142857rem;\n  height: 4.57142857rem;\n  margin: 0 0 0 -2.28571429rem;\n}\n.ui.massive.text.loader {\n  min-width: 4.57142857rem;\n  padding-top: 5.35714286rem;\n}\n\n/* -------------------\n       Colors\n-------------------- */\n.ui.ui.primary.elastic.loader::before,\n.ui.primary.basic.elastic.loading.button::before,\n.ui.primary.basic.elastic.loading.button::after,\n.ui.ui.ui.primary.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.primary.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.primary.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.primary.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.primary.loading .input > i.icon::after,\n.ui.ui.ui.ui.primary.loading > i.icon::after,\n.ui.ui.ui.primary.loader::after {\n  color: #2185d0;\n}\n.ui.inverted.primary.elastic.loader::before,\n.ui.ui.ui.inverted.primary.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.primary.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.primary.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.primary.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.primary.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.primary.loading > i.icon::after,\n.ui.ui.ui.inverted.primary.loader::after {\n  color: #54c8ff;\n}\n.ui.ui.secondary.elastic.loader::before,\n.ui.secondary.basic.elastic.loading.button::before,\n.ui.secondary.basic.elastic.loading.button::after,\n.ui.ui.ui.secondary.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.secondary.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.secondary.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.secondary.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.secondary.loading .input > i.icon::after,\n.ui.ui.ui.ui.secondary.loading > i.icon::after,\n.ui.ui.ui.secondary.loader::after {\n  color: #1b1c1d;\n}\n.ui.inverted.secondary.elastic.loader::before,\n.ui.ui.ui.inverted.secondary.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.secondary.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.secondary.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.secondary.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.secondary.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.secondary.loading > i.icon::after,\n.ui.ui.ui.inverted.secondary.loader::after {\n  color: #545454;\n}\n.ui.ui.red.elastic.loader::before,\n.ui.red.basic.elastic.loading.button::before,\n.ui.red.basic.elastic.loading.button::after,\n.ui.ui.ui.red.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.red.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.red.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.red.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.red.loading .input > i.icon::after,\n.ui.ui.ui.ui.red.loading > i.icon::after,\n.ui.ui.ui.red.loader::after {\n  color: #db2828;\n}\n.ui.inverted.red.elastic.loader::before,\n.ui.ui.ui.inverted.red.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.red.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.red.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.red.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.red.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.red.loading > i.icon::after,\n.ui.ui.ui.inverted.red.loader::after {\n  color: #ff695e;\n}\n.ui.ui.orange.elastic.loader::before,\n.ui.orange.basic.elastic.loading.button::before,\n.ui.orange.basic.elastic.loading.button::after,\n.ui.ui.ui.orange.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.orange.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.orange.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.orange.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.orange.loading .input > i.icon::after,\n.ui.ui.ui.ui.orange.loading > i.icon::after,\n.ui.ui.ui.orange.loader::after {\n  color: #f2711c;\n}\n.ui.inverted.orange.elastic.loader::before,\n.ui.ui.ui.inverted.orange.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.orange.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.orange.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.orange.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.orange.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.orange.loading > i.icon::after,\n.ui.ui.ui.inverted.orange.loader::after {\n  color: #ff851b;\n}\n.ui.ui.yellow.elastic.loader::before,\n.ui.yellow.basic.elastic.loading.button::before,\n.ui.yellow.basic.elastic.loading.button::after,\n.ui.ui.ui.yellow.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.yellow.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.yellow.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.yellow.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.yellow.loading .input > i.icon::after,\n.ui.ui.ui.ui.yellow.loading > i.icon::after,\n.ui.ui.ui.yellow.loader::after {\n  color: #fbbd08;\n}\n.ui.inverted.yellow.elastic.loader::before,\n.ui.ui.ui.inverted.yellow.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.yellow.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.yellow.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.yellow.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.yellow.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.yellow.loading > i.icon::after,\n.ui.ui.ui.inverted.yellow.loader::after {\n  color: #ffe21f;\n}\n.ui.ui.olive.elastic.loader::before,\n.ui.olive.basic.elastic.loading.button::before,\n.ui.olive.basic.elastic.loading.button::after,\n.ui.ui.ui.olive.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.olive.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.olive.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.olive.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.olive.loading .input > i.icon::after,\n.ui.ui.ui.ui.olive.loading > i.icon::after,\n.ui.ui.ui.olive.loader::after {\n  color: #b5cc18;\n}\n.ui.inverted.olive.elastic.loader::before,\n.ui.ui.ui.inverted.olive.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.olive.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.olive.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.olive.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.olive.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.olive.loading > i.icon::after,\n.ui.ui.ui.inverted.olive.loader::after {\n  color: #d9e778;\n}\n.ui.ui.green.elastic.loader::before,\n.ui.green.basic.elastic.loading.button::before,\n.ui.green.basic.elastic.loading.button::after,\n.ui.ui.ui.green.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.green.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.green.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.green.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.green.loading .input > i.icon::after,\n.ui.ui.ui.ui.green.loading > i.icon::after,\n.ui.ui.ui.green.loader::after {\n  color: #21ba45;\n}\n.ui.inverted.green.elastic.loader::before,\n.ui.ui.ui.inverted.green.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.green.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.green.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.green.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.green.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.green.loading > i.icon::after,\n.ui.ui.ui.inverted.green.loader::after {\n  color: #2ecc40;\n}\n.ui.ui.teal.elastic.loader::before,\n.ui.teal.basic.elastic.loading.button::before,\n.ui.teal.basic.elastic.loading.button::after,\n.ui.ui.ui.teal.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.teal.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.teal.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.teal.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.teal.loading .input > i.icon::after,\n.ui.ui.ui.ui.teal.loading > i.icon::after,\n.ui.ui.ui.teal.loader::after {\n  color: #00b5ad;\n}\n.ui.inverted.teal.elastic.loader::before,\n.ui.ui.ui.inverted.teal.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.teal.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.teal.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.teal.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.teal.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.teal.loading > i.icon::after,\n.ui.ui.ui.inverted.teal.loader::after {\n  color: #6dffff;\n}\n.ui.ui.blue.elastic.loader::before,\n.ui.blue.basic.elastic.loading.button::before,\n.ui.blue.basic.elastic.loading.button::after,\n.ui.ui.ui.blue.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.blue.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.blue.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.blue.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.blue.loading .input > i.icon::after,\n.ui.ui.ui.ui.blue.loading > i.icon::after,\n.ui.ui.ui.blue.loader::after {\n  color: #2185d0;\n}\n.ui.inverted.blue.elastic.loader::before,\n.ui.ui.ui.inverted.blue.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.blue.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.blue.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.blue.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.blue.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.blue.loading > i.icon::after,\n.ui.ui.ui.inverted.blue.loader::after {\n  color: #54c8ff;\n}\n.ui.ui.violet.elastic.loader::before,\n.ui.violet.basic.elastic.loading.button::before,\n.ui.violet.basic.elastic.loading.button::after,\n.ui.ui.ui.violet.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.violet.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.violet.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.violet.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.violet.loading .input > i.icon::after,\n.ui.ui.ui.ui.violet.loading > i.icon::after,\n.ui.ui.ui.violet.loader::after {\n  color: #6435c9;\n}\n.ui.inverted.violet.elastic.loader::before,\n.ui.ui.ui.inverted.violet.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.violet.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.violet.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.violet.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.violet.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.violet.loading > i.icon::after,\n.ui.ui.ui.inverted.violet.loader::after {\n  color: #a291fb;\n}\n.ui.ui.purple.elastic.loader::before,\n.ui.purple.basic.elastic.loading.button::before,\n.ui.purple.basic.elastic.loading.button::after,\n.ui.ui.ui.purple.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.purple.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.purple.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.purple.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.purple.loading .input > i.icon::after,\n.ui.ui.ui.ui.purple.loading > i.icon::after,\n.ui.ui.ui.purple.loader::after {\n  color: #a333c8;\n}\n.ui.inverted.purple.elastic.loader::before,\n.ui.ui.ui.inverted.purple.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.purple.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.purple.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.purple.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.purple.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.purple.loading > i.icon::after,\n.ui.ui.ui.inverted.purple.loader::after {\n  color: #dc73ff;\n}\n.ui.ui.pink.elastic.loader::before,\n.ui.pink.basic.elastic.loading.button::before,\n.ui.pink.basic.elastic.loading.button::after,\n.ui.ui.ui.pink.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.pink.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.pink.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.pink.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.pink.loading .input > i.icon::after,\n.ui.ui.ui.ui.pink.loading > i.icon::after,\n.ui.ui.ui.pink.loader::after {\n  color: #e03997;\n}\n.ui.inverted.pink.elastic.loader::before,\n.ui.ui.ui.inverted.pink.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.pink.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.pink.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.pink.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.pink.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.pink.loading > i.icon::after,\n.ui.ui.ui.inverted.pink.loader::after {\n  color: #ff8edf;\n}\n.ui.ui.brown.elastic.loader::before,\n.ui.brown.basic.elastic.loading.button::before,\n.ui.brown.basic.elastic.loading.button::after,\n.ui.ui.ui.brown.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.brown.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.brown.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.brown.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.brown.loading .input > i.icon::after,\n.ui.ui.ui.ui.brown.loading > i.icon::after,\n.ui.ui.ui.brown.loader::after {\n  color: #a5673f;\n}\n.ui.inverted.brown.elastic.loader::before,\n.ui.ui.ui.inverted.brown.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.brown.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.brown.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.brown.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.brown.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.brown.loading > i.icon::after,\n.ui.ui.ui.inverted.brown.loader::after {\n  color: #d67c1c;\n}\n.ui.ui.grey.elastic.loader::before,\n.ui.grey.basic.elastic.loading.button::before,\n.ui.grey.basic.elastic.loading.button::after,\n.ui.ui.ui.grey.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.grey.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.grey.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.grey.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.grey.loading .input > i.icon::after,\n.ui.ui.ui.ui.grey.loading > i.icon::after,\n.ui.ui.ui.grey.loader::after {\n  color: #767676;\n}\n.ui.inverted.grey.elastic.loader::before,\n.ui.ui.ui.inverted.grey.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.grey.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.grey.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.grey.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.grey.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.grey.loading > i.icon::after,\n.ui.ui.ui.inverted.grey.loader::after {\n  color: #dcddde;\n}\n.ui.ui.black.elastic.loader::before,\n.ui.black.basic.elastic.loading.button::before,\n.ui.black.basic.elastic.loading.button::after,\n.ui.ui.ui.black.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.black.elastic.loading .input > i.icon::before,\n.ui.ui.ui.ui.black.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.black.loading:not(.usual):not(.button)::after,\n.ui.ui.ui.ui.black.loading .input > i.icon::after,\n.ui.ui.ui.ui.black.loading > i.icon::after,\n.ui.ui.ui.black.loader::after {\n  color: #1b1c1d;\n}\n.ui.inverted.black.elastic.loader::before,\n.ui.ui.ui.inverted.black.elastic.loading:not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.inverted.black.elastic.loading .input > i.icon::before,\n.ui.ui.ui.inverted.black.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.inverted.black.loading:not(.usual)::after,\n.ui.ui.ui.ui.inverted.black.loading .input > i.icon::after,\n.ui.ui.ui.ui.inverted.black.loading > i.icon::after,\n.ui.ui.ui.inverted.black.loader::after {\n  color: #545454;\n}\n.ui.ui.elastic.loader::before,\n.ui.ui.ui.elastic.loading::before,\n.ui.ui.ui.elastic.loading .input > i.icon::before,\n.ui.ui.ui.elastic.loading > i.icon::before,\n.ui.ui.ui.ui.loading:not(.usual)::after,\n.ui.ui.ui.ui.loading .input > i.icon::after,\n.ui.ui.ui.ui.loading > i.icon::after,\n.ui.ui.ui.loader::after {\n  border-color: currentColor;\n}\n.ui.ui.ui.ui.elastic.loading.button:not(.inverted):not(.basic)::before {\n  color: #fff;\n}\n.ui.elastic.basic.loading.button::before,\n.ui.elastic.basic.loading.button::after {\n  color: #767676;\n}\n.ui.ui.ui.ui.double.loading.button::after {\n  border-bottom-color: currentColor;\n}\n\n/* -------------------\n           Inline\n    -------------------- */\n.ui.inline.loader {\n  position: relative;\n  vertical-align: middle;\n  margin: 0;\n  left: 0;\n  top: 0;\n  transform: none;\n}\n.ui.inline.loader.active,\n.ui.inline.loader.visible {\n  display: inline-block;\n}\n\n/* Centered Inline */\n.ui.centered.inline.loader.active,\n.ui.centered.inline.loader.visible {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.ui.ui.ui.ui.ui.ui.loading::after,\n.ui.ui.ui.ui.ui.ui.loading .input > i.icon::after,\n.ui.ui.ui.ui.ui.ui.loading > i.icon::after,\n.ui.ui.ui.ui.ui.loader::after {\n  border-left-color: transparent;\n  border-right-color: transparent;\n}\n.ui.ui.ui.ui.ui.ui.ui.loading:not(.double)::after,\n.ui.ui.ui.ui.ui.ui.ui.loading:not(.double) .input > i.icon::after,\n.ui.ui.ui.ui.ui.ui.ui.loading:not(.double) > i.icon::after,\n.ui.ui.ui.ui.ui.ui.loader:not(.double)::after {\n  border-bottom-color: transparent;\n}\n.ui.ui.ui.ui.ui.ui.loading.card::after,\n.ui.ui.ui.ui.ui.ui.loading.segments::after,\n.ui.ui.ui.ui.ui.ui.loading.segment::after,\n.ui.ui.ui.ui.ui.ui.loading.form::after {\n  border-left-color: rgba(0, 0, 0, 0.1);\n  border-right-color: rgba(0, 0, 0, 0.1);\n}\n.ui.ui.ui.ui.ui.ui.loading.card:not(.double)::after,\n.ui.ui.ui.ui.ui.ui.loading.segments:not(.double)::after,\n.ui.ui.ui.ui.ui.ui.loading.segment:not(.double)::after,\n.ui.ui.ui.ui.ui.ui.loading.form:not(.double)::after {\n  border-bottom-color: rgba(0, 0, 0, 0.1);\n}\n\n/* -------------------\n           Elastic\n    -------------------- */\n.ui.dimmer > .ui.elastic.loader {\n  color: #fff;\n}\n.ui.inverted.dimmer > .ui.elastic.loader {\n  color: #767676;\n}\n.ui.ui.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::after,\n.ui.ui.elastic.loading .input > i.icon::after,\n.ui.ui.elastic.loading > i.icon::after,\n.ui.ui.elastic.loader::after {\n  animation: loader 1s infinite cubic-bezier(0.27, 1.05, 0.92, 0.61);\n  animation-delay: 0.3s;\n}\n.ui.ui.ui.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.elastic.loading .input > i.icon::before,\n.ui.ui.ui.elastic.loading > i.icon::before,\n.ui.ui.elastic.loader::before {\n  animation: elastic-loader 1s infinite cubic-bezier(0.27, 1.05, 0.92, 0.61);\n  -moz-animation: currentcolor-elastic-loader 1s infinite cubic-bezier(0.27, 1.05, 0.92, 0.61);\n  border-right-color: transparent;\n}\n.ui.elastic.inline.loader:empty {\n  animation: loader 8s infinite linear;\n}\n.ui.ui.slow.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::after,\n.ui.ui.slow.elastic.loading .input > i.icon::after,\n.ui.ui.slow.elastic.loading > i.icon::after,\n.ui.ui.slow.elastic.loader::after {\n  animation-duration: 1.5s;\n  animation-delay: 0.45s;\n}\n.ui.ui.ui.slow.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.slow.elastic.loading .input > i.icon::before,\n.ui.ui.ui.slow.elastic.loading > i.icon::before,\n.ui.ui.slow.elastic.loader::before {\n  animation-duration: 1.5s;\n}\n.ui.ui.fast.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::after,\n.ui.ui.fast.elastic.loading .input > i.icon::after,\n.ui.ui.fast.elastic.loading > i.icon::after,\n.ui.ui.fast.elastic.loader::after {\n  animation-duration: 0.66s;\n  animation-delay: 0.2s;\n}\n.ui.ui.ui.fast.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::before,\n.ui.ui.ui.fast.elastic.loading .input > i.icon::before,\n.ui.ui.ui.fast.elastic.loading > i.icon::before,\n.ui.ui.fast.elastic.loader::before {\n  animation-duration: 0.66s;\n}\n@keyframes elastic-loader {\n  0%,\n  1% {\n    border-left-color: transparent;\n    border-bottom-color: transparent;\n  }\n  1.1%,\n  50% {\n    border-left-color: inherit;\n  }\n  10%,\n  35.1% {\n    border-bottom-color: transparent;\n  }\n  10.1%,\n  35% {\n    border-bottom-color: inherit;\n  }\n  50.1% {\n    border-left-color: transparent;\n  }\n  100% {\n    border-left-color: transparent;\n    border-bottom-color: transparent;\n    transform: rotate(360deg);\n  }\n}\n@keyframes currentcolor-elastic-loader {\n  0%,\n  1% {\n    border-left-color: transparent;\n    border-bottom-color: transparent;\n  }\n  1.1%,\n  50% {\n    border-left-color: currentColor;\n  }\n  10%,\n  35.1% {\n    border-bottom-color: transparent;\n  }\n  10.1%,\n  35% {\n    border-bottom-color: currentColor;\n  }\n  50.1% {\n    border-left-color: transparent;\n  }\n  100% {\n    border-left-color: transparent;\n    border-bottom-color: transparent;\n    transform: rotate(360deg);\n  }\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/menu.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Menu\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Standard\n*******************************/\n\n\n/* --------------\n      Menu\n--------------- */\n.ui.menu {\n  display: flex;\n  margin: 1rem 0;\n  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\";\n  background: #fff;\n  font-weight: normal;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);\n  border-radius: 0.28571429rem;\n  min-height: 2.85714286em;\n}\n.ui.menu::after {\n  content: \"\";\n  display: block;\n  height: 0;\n  clear: both;\n  visibility: hidden;\n}\n.ui.menu:first-child {\n  margin-top: 0;\n}\n.ui.menu:last-child {\n  margin-bottom: 0;\n}\n\n/* --------------\n    Sub-Menu\n--------------- */\n.ui.menu .menu {\n  margin: 0;\n}\n.ui.menu:not(.vertical) > .menu {\n  display: flex;\n}\n\n/* --------------\n      Item\n--------------- */\n.ui.menu:not(.vertical) .item {\n  display: flex;\n  align-items: center;\n}\n.ui.menu .item {\n  position: relative;\n  vertical-align: middle;\n  line-height: 1;\n  text-decoration: none;\n  -webkit-tap-highlight-color: transparent;\n  flex: 0 0 auto;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background: none;\n  padding: 0.92857143em 1.14285714em;\n  text-transform: none;\n  color: rgba(0, 0, 0, 0.87);\n  font-weight: normal;\n  transition: background 0.1s ease, box-shadow 0.1s ease, color 0.1s ease;\n}\n.ui.menu > .item:first-child {\n  border-radius: 0.28571429rem 0 0 0.28571429rem;\n}\n\n/* Border */\n.ui.menu .item::before {\n  position: absolute;\n  content: \"\";\n  top: 0;\n  right: 0;\n  height: 100%;\n  width: 1px;\n  background: rgba(34, 36, 38, 0.1);\n}\n\n/* --------------\n  Text Content\n--------------- */\n.ui.menu .text.item > *,\n.ui.menu .item > a:not(.ui),\n.ui.menu .item > p:only-child {\n  -webkit-user-select: text;\n      -ms-user-select: text;\n          user-select: text;\n  line-height: 1.3;\n}\n.ui.menu .item > p:first-child {\n  margin-top: 0;\n}\n.ui.menu .item > p:last-child {\n  margin-bottom: 0;\n}\n\n/* --------------\n      Icons\n--------------- */\n.ui.menu .item > i.icon {\n  opacity: 0.9;\n  float: none;\n  margin: 0 0.35714286em 0 0;\n}\n\n/* --------------\n     Button\n--------------- */\n.ui.menu:not(.vertical) .item > .button {\n  position: relative;\n  top: 0;\n  margin: -0.5em 0;\n  padding-bottom: 0.78571429em;\n  padding-top: 0.78571429em;\n  font-size: 1em;\n}\n\n/* ----------------\n Grid / Container\n----------------- */\n.ui.menu > .grid,\n.ui.menu > .container {\n  display: flex;\n  align-items: inherit;\n  flex-direction: inherit;\n}\n\n/* --------------\n     Inputs\n--------------- */\n.ui.menu .item > .input {\n  width: 100%;\n}\n.ui.menu:not(.vertical) .item > .input {\n  position: relative;\n  top: 0;\n  margin: -0.5em 0;\n}\n.ui.menu .item > .input input {\n  font-size: 1em;\n  padding-top: 0.57142857em;\n  padding-bottom: 0.57142857em;\n}\n\n/* --------------\n     Header\n--------------- */\n.ui.menu .header.item,\n.ui.vertical.menu .header.item {\n  margin: 0;\n  background: \"\";\n  text-transform: normal;\n  font-weight: bold;\n}\n.ui.vertical.menu .item > .header:not(.ui) {\n  margin: 0 0 0.5em;\n  font-size: 1em;\n  font-weight: bold;\n}\n\n/* --------------\n    Dropdowns\n--------------- */\n\n/* Dropdown Icon */\n.ui.menu .item > i.dropdown.icon {\n  padding: 0;\n  float: right;\n  margin: 0 0 0 1em;\n}\n\n/* Menu */\n.ui.menu .dropdown.item .menu {\n  min-width: calc(100% - 1px);\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n  background: #fff;\n  margin: 0 0 0;\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.08);\n}\n.ui.menu .dropdown.item:not(.column) .menu {\n  flex-direction: column;\n}\n\n/* Menu Items */\n.ui.menu .ui.dropdown .menu > .item {\n  margin: 0;\n  text-align: left;\n  font-size: 1em !important;\n  padding: 0.78571429em 1.14285714em !important;\n  background: transparent !important;\n  color: rgba(0, 0, 0, 0.87) !important;\n  text-transform: none !important;\n  font-weight: normal !important;\n  box-shadow: none !important;\n  transition: none !important;\n}\n.ui.menu .ui.dropdown .menu > .item:hover {\n  background: rgba(0, 0, 0, 0.05) !important;\n  color: rgba(0, 0, 0, 0.95) !important;\n}\n.ui.menu .ui.dropdown .menu > .selected.item {\n  background: rgba(0, 0, 0, 0.05) !important;\n  color: rgba(0, 0, 0, 0.95) !important;\n}\n.ui.menu .ui.dropdown .menu > .active.item {\n  background: rgba(0, 0, 0, 0.03) !important;\n  font-weight: bold !important;\n  color: rgba(0, 0, 0, 0.95) !important;\n}\n.ui.menu .ui.dropdown.item .menu .item:not(.filtered) {\n  display: block;\n}\n.ui.menu .ui.dropdown .menu > .item > .icons,\n.ui.menu .ui.dropdown .menu > .item > i.icon:not(.dropdown) {\n  display: inline-block;\n  font-size: 1em !important;\n  float: none;\n  margin: 0 0.75em 0 0 !important;\n}\n\n/* Secondary */\n.ui.secondary.menu .dropdown.item > .menu,\n.ui.text.menu .dropdown.item > .menu {\n  border-radius: 0.28571429rem;\n  margin-top: 0.35714286em;\n}\n\n/* Pointing */\n.ui.menu .pointing.dropdown.item .menu {\n  margin-top: 0.75em;\n}\n\n/* Inverted */\n.ui.inverted.menu .search.dropdown.item > .search,\n.ui.inverted.menu .search.dropdown.item > .text {\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* Vertical */\n.ui.vertical.menu .dropdown.item > i.icon {\n  float: right;\n  content: \"\\f0da\";\n  margin-left: 1em;\n}\n.ui.vertical.menu .dropdown.item .menu {\n  left: 100%;\n  \n/* IE needs 0, all others support max-content to show dropdown icon inline, so keep both settings! */\n  min-width: 0;\n  min-width: max-content;\n  margin: 0 0 0 0;\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.08);\n  border-radius: 0 0.28571429rem 0.28571429rem 0.28571429rem;\n}\n.ui.vertical.menu .dropdown.item.upward .menu {\n  bottom: 0;\n}\n.ui.vertical.menu .dropdown.item:not(.upward) .menu {\n  top: 0;\n}\n.ui.vertical.menu .active.dropdown.item {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.vertical.menu .dropdown.active.item {\n  box-shadow: none;\n}\n\n/* Evenly Divided */\n.ui.item.menu .dropdown .menu .item {\n  width: 100%;\n}\n\n/* --------------\n     Labels\n--------------- */\n.ui.menu .item > .label:not(.floating) {\n  margin-left: 1em;\n  padding: 0.3em 0.78571429em;\n}\n.ui.vertical.menu .item > .label {\n  margin-top: -0.15em;\n  margin-bottom: -0.15em;\n  padding: 0.3em 0.78571429em;\n}\n.ui.menu .item > .floating.label {\n  padding: 0.3em 0.78571429em;\n}\n.ui.menu .item > .label {\n  background: #999;\n  color: #fff;\n}\n.ui.menu .item > .image.label img {\n  margin: -0.2833em 0.8em -0.2833em -0.8em;\n  height: 1.5666em;\n}\n\n/* --------------\n     Images\n--------------- */\n.ui.menu .item > img:not(.ui) {\n  display: inline-block;\n  vertical-align: middle;\n  margin: -0.3em 0;\n  width: 2.5em;\n}\n.ui.vertical.menu .item > img:not(.ui):only-child {\n  display: block;\n  max-width: 100%;\n  width: auto;\n}\n\n\n/*******************************\n          Coupling\n*******************************/\n\n\n/* --------------\n     List\n--------------- */\n\n/* Menu divider shouldn't apply */\n.ui.menu .list .item::before {\n  background: none !important;\n}\n\n/* --------------\n         Sidebar\n    --------------- */\n\n/* Show vertical dividers below last */\n.ui.vertical.sidebar.menu > .item:first-child::before {\n  display: block !important;\n}\n.ui.vertical.sidebar.menu > .item::before {\n  top: auto;\n  bottom: 0;\n}\n\n/* --------------\n    Container\n--------------- */\n@media only screen and (max-width: 767.98px) {\n  .ui.menu > .ui.container {\n    width: 100% !important;\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) > .container > .item:not(.right):not(.borderless):first-child {\n    border-left: 1px solid rgba(34, 36, 38, 0.1);\n  }\n  .ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) > .container > .right.item:not(.borderless):last-child,\n  .ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) > .container > .right.menu > .item:not(.borderless):last-child {\n    border-right: 1px solid rgba(34, 36, 38, 0.1);\n  }\n}\n\n\n/*******************************\n             States\n*******************************/\n\n\n/* --------------\n      Hover\n--------------- */\n.ui.link.menu .item:hover,\n.ui.menu .dropdown.item:hover,\n.ui.menu .link.item:hover,\n.ui.menu a.item:hover {\n  cursor: pointer;\n  background: rgba(0, 0, 0, 0.03);\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------\n     Pressed\n--------------- */\n.ui.link.menu .item:active,\n.ui.menu .link.item:active,\n.ui.menu a.item:active {\n  background: rgba(0, 0, 0, 0.03);\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------\n     Active\n--------------- */\n.ui.menu .active.item {\n  background: rgba(0, 0, 0, 0.05);\n  color: rgba(0, 0, 0, 0.95);\n  font-weight: normal;\n  box-shadow: none;\n}\n.ui.menu .active.item > i.icon {\n  opacity: 1;\n}\n\n/* --------------\n  Active Hover\n--------------- */\n.ui.menu .active.item:hover,\n.ui.vertical.menu .active.item:hover {\n  background-color: rgba(0, 0, 0, 0.05);\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------\n     Disabled\n--------------- */\n.ui.ui.menu .item.disabled {\n  cursor: default;\n  background-color: transparent;\n  color: rgba(40, 40, 40, 0.3);\n  pointer-events: none;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/* ------------------\nFloated Menu / Item\n------------------- */\n\n/* Left Floated */\n.ui.menu:not(.vertical) .left.item,\n.ui.menu:not(.vertical) .left.menu {\n  display: flex;\n  margin-right: auto !important;\n}\n\n/* Right Floated */\n.ui.menu:not(.vertical) .right.item,\n.ui.menu:not(.vertical) .right.menu {\n  display: flex;\n  margin-left: auto !important;\n}\n.ui.menu:not(.vertical) :not(.dropdown) > .left.menu,\n.ui.menu:not(.vertical) :not(.dropdown) > .right.menu {\n  display: inherit;\n}\n\n/* Center */\n.ui.menu:not(.vertical) .center.item,\n.ui.menu:not(.vertical) .center.menu {\n  display: flex;\n  margin-left: auto !important;\n  margin-right: auto !important;\n}\n\n/* Swapped Borders */\n.ui.menu .right.item::before,\n.ui.menu .right.menu > .item::before {\n  right: auto;\n  left: 0;\n}\n\n/* Remove Outer Borders */\n.ui.menu .center.item:last-child::before,\n.ui.menu .center.menu > .item:last-child::before {\n  display: none;\n}\n\n/* --------------\n        Vertical\n    --------------- */\n.ui.vertical.menu {\n  display: block;\n  flex-direction: column;\n  background: #fff;\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);\n}\n\n/* --- Item --- */\n.ui.vertical.menu .item {\n  display: block;\n  background: none;\n  border-top: none;\n  border-right: none;\n}\n.ui.vertical.menu > .item:first-child {\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.vertical.menu > .item:last-child {\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n\n/* --- Label --- */\n.ui.vertical.menu .item > .label {\n  float: right;\n  text-align: center;\n}\n\n/* --- Icon --- */\n.ui.vertical.menu .item > i.icon,\n.ui.vertical.menu .item > i.icons {\n  width: 1.18em;\n  float: right;\n  margin: 0 0 0 0.5em;\n}\n.ui.vertical.menu .item > .label + i.icon {\n  float: none;\n  margin: 0 0.5em 0 0;\n}\n\n/* --- Border --- */\n.ui.vertical.menu .item::before {\n  position: absolute;\n  content: \"\";\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 1px;\n  background: rgba(34, 36, 38, 0.1);\n}\n.ui.vertical.menu .item:first-child::before {\n  display: none !important;\n}\n\n/* --- Sub Menu --- */\n.ui.vertical.menu .item > .menu {\n  margin: 0.5em -1.14285714em 0;\n}\n.ui.vertical.menu .menu .item {\n  background: none;\n  padding: 0.5em 1.33333333em;\n  font-size: 0.85714286em;\n  color: rgba(0, 0, 0, 0.5);\n}\n.ui.vertical.menu .item .menu a.item:hover,\n.ui.vertical.menu .item .menu .link.item:hover {\n  color: rgba(0, 0, 0, 0.85);\n}\n.ui.vertical.menu .menu .item::before {\n  display: none;\n}\n\n/* Vertical Active */\n.ui.vertical.menu .active.item {\n  background: rgba(0, 0, 0, 0.05);\n  border-radius: 0;\n  box-shadow: none;\n}\n.ui.vertical.menu > .active.item:first-child {\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.vertical.menu > .active.item:last-child {\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui.vertical.menu > .active.item:only-child {\n  border-radius: 0.28571429rem;\n}\n.ui.vertical.menu .active.item .menu .active.item {\n  border-left: none;\n}\n.ui.vertical.menu .item .menu .active.item {\n  background-color: transparent;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------\n         Tabular\n    --------------- */\n.ui.tabular.menu {\n  border-radius: 0;\n  box-shadow: none !important;\n  border: none;\n  background: none transparent;\n  border-bottom: 1px solid #d4d4d5;\n}\n.ui.tabular.fluid.menu {\n  width: calc(100% + 2px) !important;\n}\n.ui.tabular.menu .item {\n  background: transparent;\n  border-bottom: none;\n  border-left: 1px solid transparent;\n  border-right: 1px solid transparent;\n  border-top: 2px solid transparent;\n  padding: 0.92857143em 1.42857143em;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.tabular.menu .item::before {\n  display: none;\n}\n\n/* Hover */\n.ui.tabular.menu .item:hover {\n  background-color: transparent;\n  color: rgba(0, 0, 0, 0.8);\n}\n\n/* Active */\n.ui.tabular.menu .active.item {\n  background: none #fff;\n  color: rgba(0, 0, 0, 0.95);\n  border-top-width: 1px;\n  border-color: #d4d4d5;\n  font-weight: bold;\n  margin-bottom: -1px;\n  box-shadow: none;\n  border-radius: 0.28571429rem 0.28571429rem 0 0 !important;\n}\n.ui.tabular.menu .active.item:hover {\n  cursor: default;\n}\n\n/* Coupling with segment for attachment */\n.ui.tabular.menu ~ .attached:not(.top).segment {\n  border-top: none;\n  margin-left: 0;\n  margin-top: 0;\n  margin-right: 0;\n  width: 100%;\n}\n.top.attached.segment + .ui.bottom.tabular.menu {\n  position: relative;\n  width: calc(100% + 2px);\n  left: -1px;\n}\n\n/* Bottom Vertical Tabular */\n.ui.bottom.tabular.menu {\n  background: none transparent;\n  border-radius: 0;\n  box-shadow: none !important;\n  border-bottom: none;\n  border-top: 1px solid #d4d4d5;\n}\n.ui.bottom.tabular.menu .item {\n  background: none;\n  border-left: 1px solid transparent;\n  border-right: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  border-top: none;\n}\n.ui.bottom.tabular.menu .active.item {\n  background: none #fff;\n  color: rgba(0, 0, 0, 0.95);\n  border-color: #d4d4d5;\n  margin: -1px 0 0 0;\n  border-radius: 0 0 0.28571429rem 0.28571429rem !important;\n}\n\n/* Vertical Tabular (Left) */\n.ui.vertical.tabular.menu {\n  background: none transparent;\n  border-radius: 0;\n  box-shadow: none !important;\n  border-bottom: none;\n  border-right: 1px solid #d4d4d5;\n}\n.ui.vertical.tabular.menu .item {\n  background: none;\n  border-left: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  border-top: 1px solid transparent;\n  border-right: none;\n}\n.ui.vertical.tabular.menu .active.item {\n  background: none #fff;\n  color: rgba(0, 0, 0, 0.95);\n  border-color: #d4d4d5;\n  margin: 0 -1px 0 0;\n  border-radius: 0.28571429rem 0 0 0.28571429rem !important;\n}\n\n/* Vertical Right Tabular */\n.ui.vertical.right.tabular.menu {\n  background: none transparent;\n  border-radius: 0;\n  box-shadow: none !important;\n  border-bottom: none;\n  border-right: none;\n  border-left: 1px solid #d4d4d5;\n}\n.ui.vertical.right.tabular.menu .item {\n  background: none;\n  border-right: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  border-top: 1px solid transparent;\n  border-left: none;\n}\n.ui.vertical.right.tabular.menu .active.item {\n  background: none #fff;\n  color: rgba(0, 0, 0, 0.95);\n  border-color: #d4d4d5;\n  margin: 0 0 0 -1px;\n  border-radius: 0 0.28571429rem 0.28571429rem 0 !important;\n}\n\n/* Dropdown */\n.ui.tabular.menu .active.dropdown.item {\n  margin-bottom: 0;\n  border-left: 1px solid transparent;\n  border-right: 1px solid transparent;\n  border-top: 2px solid transparent;\n  border-bottom: none;\n}\n.ui.inverted.tabular.menu .active.item,\n.ui.inverted.tabular.menu .active.item:hover {\n  background: none #1b1c1d;\n  border-color: #555;\n}\n.ui.inverted.tabular.menu .item:not(.active):hover {\n  color: #ffffff;\n  background: transparent;\n  cursor: pointer;\n}\n\n/* --------------\n       Pagination\n    --------------- */\n.ui.pagination.menu {\n  margin: 0;\n  display: inline-flex;\n  vertical-align: middle;\n}\n.ui.pagination.menu .item:last-child {\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n}\n.ui.compact.menu .item:last-child {\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n}\n.ui.pagination.menu:not(.wrapping) .item:last-child::before {\n  display: none;\n}\n.ui.pagination.menu .item {\n  min-width: 3em;\n  text-align: center;\n}\n.ui.pagination.menu .icon.item i.icon {\n  vertical-align: top;\n}\n\n/* Active */\n.ui.pagination.menu .active.item {\n  border-top: none;\n  padding-top: 0.92857143em;\n  background-color: rgba(0, 0, 0, 0.05);\n  color: rgba(0, 0, 0, 0.95);\n  box-shadow: none;\n}\n\n/* --------------\n       Secondary\n    --------------- */\n.ui.secondary.menu {\n  background: none;\n  margin-left: -0.35714286em;\n  margin-right: -0.35714286em;\n  border-radius: 0;\n  border: none;\n  box-shadow: none;\n}\n\n/* Item */\n.ui.secondary.menu .item {\n  align-self: center;\n  box-shadow: none;\n  border: none;\n  padding: 0.78571429em 0.92857143em;\n  margin: 0 0.35714286em;\n  background: none;\n  transition: color 0.1s ease;\n  border-radius: 0.28571429rem;\n}\n\n/* No Divider */\n.ui.secondary.menu .item::before {\n  display: none !important;\n}\n\n/* Header */\n.ui.secondary.menu .header.item {\n  border-radius: 0;\n  border-right: none;\n  background: none transparent;\n}\n\n/* Image */\n.ui.secondary.menu .item > img:not(.ui) {\n  margin: 0;\n}\n\n/* Hover */\n.ui.secondary.menu .dropdown.item:hover,\n.ui.secondary.menu .link.item:hover,\n.ui.secondary.menu a.item:hover {\n  background: rgba(0, 0, 0, 0.05);\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* Active */\n.ui.secondary.menu .active.item {\n  box-shadow: none;\n  background: rgba(0, 0, 0, 0.05);\n  color: rgba(0, 0, 0, 0.95);\n  border-radius: 0.28571429rem;\n}\n\n/* Active Hover */\n.ui.secondary.menu .active.item:hover {\n  box-shadow: none;\n  background: rgba(0, 0, 0, 0.05);\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* Inverted */\n.ui.secondary.inverted.menu .link.item:not(.disabled),\n.ui.secondary.inverted.menu a.item:not(.disabled) {\n  color: rgba(255, 255, 255, 0.7);\n}\n.ui.secondary.inverted.menu .dropdown.item:hover,\n.ui.secondary.inverted.menu .link.item:hover,\n.ui.secondary.inverted.menu a.item:hover {\n  background: rgba(255, 255, 255, 0.08);\n  color: #ffffff;\n}\n.ui.secondary.inverted.menu .active.item {\n  background: rgba(255, 255, 255, 0.15);\n  color: #ffffff;\n}\n\n/* Fix item margins */\n.ui.secondary.item.menu {\n  margin-left: 0;\n  margin-right: 0;\n}\n.ui.secondary.item.menu .item:last-child {\n  margin-right: 0;\n}\n.ui.secondary.attached.menu {\n  box-shadow: none;\n}\n\n/* ---------------------\n           Secondary Vertical\n        ----------------------- */\n\n/* Sub Menu */\n.ui.vertical.secondary.menu .item:not(.dropdown) > .menu {\n  margin: 0 -0.92857143em;\n}\n.ui.vertical.secondary.menu .item:not(.dropdown) > .menu > .item {\n  margin: 0;\n  padding: 0.5em 1.33333333em;\n}\n.ui.secondary.vertical.menu > .item {\n  border: none;\n  margin: 0 0 0.35714286em;\n  border-radius: 0.28571429rem !important;\n}\n.ui.secondary.vertical.menu > .header.item {\n  border-radius: 0;\n}\n\n/* Sub Menu */\n.ui.vertical.secondary.menu .item > .menu .item {\n  background-color: transparent;\n}\n\n/* Inverted */\n.ui.secondary.inverted.menu {\n  background-color: transparent;\n}\n\n/* ---------------------\n           Secondary Pointing\n        ----------------------- */\n.ui.secondary.pointing.menu {\n  margin-left: 0;\n  margin-right: 0;\n  border-bottom: 2px solid rgba(34, 36, 38, 0.15);\n}\n.ui.secondary.pointing.menu .item {\n  border-bottom: 2px solid transparent;\n  border-radius: 0;\n  align-self: flex-end;\n  margin: 0 0 -2px;\n  padding: 0.85714286em 1.14285714em;\n  transition: color 0.1s ease;\n}\n.ui.secondary.pointing.menu .ui.dropdown .menu .item {\n  border-bottom-width: 0;\n}\n.ui.secondary.pointing.menu .item > .label:not(.floating) {\n  margin-top: -0.3em;\n  margin-bottom: -0.3em;\n}\n.ui.secondary.pointing.menu .item > .circular.label {\n  margin-top: -0.5em;\n  margin-bottom: -0.5em;\n}\n\n/* Item Types */\n.ui.secondary.pointing.menu .header.item {\n  color: rgba(0, 0, 0, 0.85) !important;\n}\n.ui.secondary.pointing.menu .text.item {\n  box-shadow: none !important;\n}\n.ui.secondary.pointing.menu .item::after {\n  display: none;\n}\n\n/* Hover */\n.ui.secondary.pointing.menu .dropdown.item:hover,\n.ui.secondary.pointing.menu .link.item:hover,\n.ui.secondary.pointing.menu a.item:hover {\n  background-color: transparent;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* Pressed */\n.ui.secondary.pointing.menu .dropdown.item:active,\n.ui.secondary.pointing.menu .link.item:active,\n.ui.secondary.pointing.menu a.item:active {\n  background-color: transparent;\n  border-color: rgba(34, 36, 38, 0.15);\n}\n\n/* Active */\n.ui.secondary.pointing.menu .active.item {\n  background-color: transparent;\n  box-shadow: none;\n  border-color: currentColor;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* Active Hover */\n.ui.secondary.pointing.menu .active.item:hover {\n  border-color: currentColor;\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* Active Dropdown */\n.ui.secondary.pointing.menu .active.dropdown.item {\n  border-color: transparent;\n}\n\n/* Vertical Pointing */\n.ui.secondary.vertical.pointing.menu {\n  border-bottom-width: 0;\n  border-right: 2px solid rgba(34, 36, 38, 0.15);\n}\n.ui.secondary.vertical.pointing.menu .item {\n  border-bottom: none;\n  border-right: 2px solid transparent;\n  border-radius: 0 !important;\n  margin: 0 -2px 0 0;\n}\n\n/* Vertical Active */\n.ui.secondary.vertical.pointing.menu .active.item {\n  border-color: currentColor;\n}\n\n/* Inverted */\n.ui.secondary.inverted.pointing.menu {\n  border-color: rgba(255, 255, 255, 0.1);\n}\n.ui.secondary.inverted.pointing.menu .item:not(.disabled) {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.secondary.inverted.pointing.menu .header.item {\n  color: #fff !important;\n}\n\n/* Hover */\n.ui.secondary.inverted.pointing.menu .link.item:hover,\n.ui.secondary.inverted.pointing.menu a.item:hover {\n  color: #ffffff;\n}\n\n/* Active */\n.ui.ui.secondary.inverted.pointing.menu .active.item {\n  border-color: #fff;\n  color: #ffffff;\n  background-color: transparent;\n}\n\n/* --------------\n        Text Menu\n    --------------- */\n.ui.text.menu {\n  background: none transparent;\n  border-radius: 0;\n  box-shadow: none;\n  border: none;\n  margin: 1em -0.5em;\n}\n.ui.text.menu .item {\n  border-radius: 0;\n  box-shadow: none;\n  align-self: center;\n  margin: 0;\n  padding: 0.35714286em 0.5em;\n  font-weight: normal;\n  color: rgba(0, 0, 0, 0.6);\n  transition: opacity 0.1s ease;\n}\n\n/* Border */\n.ui.text.menu .item::before,\n.ui.text.menu .menu .item::before {\n  display: none !important;\n}\n\n/* Header */\n.ui.text.menu .header.item {\n  background-color: transparent;\n  opacity: 1;\n  color: rgba(0, 0, 0, 0.85);\n  font-size: 0.92857143em;\n  text-transform: uppercase;\n  font-weight: bold;\n}\n\n/* Image */\n.ui.text.menu .item > img:not(.ui) {\n  margin: 0;\n}\n\n/* --- fluid text --- */\n.ui.text.item.menu .item {\n  margin: 0;\n}\n\n/* --- vertical text --- */\n.ui.vertical.text.menu {\n  margin: 1em 0;\n}\n.ui.vertical.text.menu:first-child {\n  margin-top: 0;\n}\n.ui.vertical.text.menu:last-child {\n  margin-bottom: 0;\n}\n.ui.vertical.text.menu .item {\n  margin: 0.57142857em 0;\n  padding-left: 0;\n  padding-right: 0;\n}\n.ui.vertical.text.menu .item > i.icon {\n  float: none;\n  margin: 0 0.35714286em 0 0;\n}\n.ui.vertical.text.menu .header.item {\n  margin: 0.57142857em 0 0.71428571em;\n}\n\n/* Vertical Sub Menu */\n.ui.vertical.text.menu .item:not(.dropdown) > .menu {\n  margin: 0;\n}\n.ui.vertical.text.menu .item:not(.dropdown) > .menu > .item {\n  margin: 0;\n  padding: 0.5em 0;\n}\n\n/* --- hover --- */\n.ui.text.menu .item:hover {\n  opacity: 1;\n  background-color: transparent;\n}\n\n/* --- active --- */\n.ui.text.menu .active.item {\n  background-color: transparent;\n  border: none;\n  box-shadow: none;\n  font-weight: normal;\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --- active hover --- */\n.ui.text.menu .active.item:hover {\n  background-color: transparent;\n}\n\n/* Disable Bariations */\n.ui.text.pointing.menu .active.item::after {\n  box-shadow: none;\n}\n.ui.text.attached.menu {\n  box-shadow: none;\n}\n\n/* Inverted */\n.ui.inverted.text.menu,\n.ui.inverted.text.menu .item,\n.ui.inverted.text.menu .item:hover,\n.ui.inverted.text.menu .active.item {\n  background-color: transparent;\n}\n\n/* Fluid */\n.ui.fluid.text.menu {\n  margin-left: 0;\n  margin-right: 0;\n}\n\n/* --------------\n        Icon Only\n    --------------- */\n\n/* Vertical Menu */\n.ui.vertical.icon.menu {\n  display: inline-block;\n  width: auto;\n}\n\n/* Item */\n.ui.icon.menu .item {\n  height: auto;\n  text-align: center;\n  color: #1b1c1d;\n}\n\n/* Icon */\n.ui.icon.menu .item > i.icon:not(.dropdown) {\n  margin: 0;\n  opacity: 1;\n}\n\n/* Icon Glyph */\n.ui.icon.menu i.icon::before {\n  opacity: 1;\n}\n\n/* (x) Item Icon */\n.ui.menu .icon.item > i.icon {\n  width: auto;\n  margin: 0 auto;\n}\n\n/* Vertical Icon */\n.ui.vertical.icon.menu .item > i.icon:not(.dropdown) {\n  display: block;\n  opacity: 1;\n  margin: 0 auto;\n  float: none;\n}\n\n/* Inverted */\n.ui.inverted.icon.menu .item {\n  color: #fff;\n}\n\n/* --------------\n       Labeled Icon\n    --------------- */\n\n/* Menu */\n.ui.labeled.icon.menu {\n  text-align: center;\n}\n\n/* Item */\n.ui.labeled.icon.menu .item {\n  min-width: 6em;\n  flex-direction: column;\n}\n\n/* Icon */\n.ui.labeled.icon.menu > .right.menu > .item > i.icon:not(.dropdown),\n.ui.labeled.icon.menu > .item > i.icon:not(.dropdown) {\n  height: 1em;\n  display: block;\n  font-size: 1.71428571em !important;\n  margin: 0 auto 0.5rem !important;\n}\n\n/* Fluid */\n.ui.fluid.labeled.icon.menu > .item {\n  min-width: 0;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n        Stackable\n    --------------- */\n@media only screen and (max-width: 767.98px) {\n  .ui.stackable.menu {\n    flex-direction: column;\n  }\n  .ui.stackable.menu.pointing .active.item::after {\n    display: none;\n  }\n  .ui.stackable.menu .item {\n    width: 100% !important;\n  }\n  .ui.stackable.menu .item::before {\n    position: absolute;\n    content: \"\";\n    top: auto;\n    bottom: 0;\n    left: 0;\n    width: 100%;\n    height: 1px;\n    background: rgba(34, 36, 38, 0.1);\n  }\n  .ui.stackable.menu .left.menu,\n  .ui.stackable.menu .left.item {\n    margin-right: 0 !important;\n  }\n  .ui.stackable.menu .right.menu,\n  .ui.stackable.menu .right.item {\n    margin-left: 0 !important;\n  }\n  .ui.stackable.menu .center.menu,\n  .ui.stackable.menu .center.item {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .ui.stackable.menu .right.menu,\n  .ui.stackable.menu .center.menu,\n  .ui.stackable.menu .left.menu {\n    flex-direction: column;\n  }\n}\n\n/* --------------\n     Colors\n--------------- */\n.ui.ui.ui.menu .primary.active.item,\n.ui.ui.primary.menu .active.item:hover,\n.ui.ui.primary.menu .active.item {\n  color: #2185d0;\n}\n.ui.ui.ui.menu .red.active.item,\n.ui.ui.red.menu .active.item:hover,\n.ui.ui.red.menu .active.item {\n  color: #db2828;\n}\n.ui.ui.ui.menu .orange.active.item,\n.ui.ui.orange.menu .active.item:hover,\n.ui.ui.orange.menu .active.item {\n  color: #f2711c;\n}\n.ui.ui.ui.menu .yellow.active.item,\n.ui.ui.yellow.menu .active.item:hover,\n.ui.ui.yellow.menu .active.item {\n  color: #fbbd08;\n}\n.ui.ui.ui.menu .olive.active.item,\n.ui.ui.olive.menu .active.item:hover,\n.ui.ui.olive.menu .active.item {\n  color: #b5cc18;\n}\n.ui.ui.ui.menu .green.active.item,\n.ui.ui.green.menu .active.item:hover,\n.ui.ui.green.menu .active.item {\n  color: #21ba45;\n}\n.ui.ui.ui.menu .teal.active.item,\n.ui.ui.teal.menu .active.item:hover,\n.ui.ui.teal.menu .active.item {\n  color: #00b5ad;\n}\n.ui.ui.ui.menu .blue.active.item,\n.ui.ui.blue.menu .active.item:hover,\n.ui.ui.blue.menu .active.item {\n  color: #2185d0;\n}\n.ui.ui.ui.menu .violet.active.item,\n.ui.ui.violet.menu .active.item:hover,\n.ui.ui.violet.menu .active.item {\n  color: #6435c9;\n}\n.ui.ui.ui.menu .purple.active.item,\n.ui.ui.purple.menu .active.item:hover,\n.ui.ui.purple.menu .active.item {\n  color: #a333c8;\n}\n.ui.ui.ui.menu .pink.active.item,\n.ui.ui.pink.menu .active.item:hover,\n.ui.ui.pink.menu .active.item {\n  color: #e03997;\n}\n.ui.ui.ui.menu .brown.active.item,\n.ui.ui.brown.menu .active.item:hover,\n.ui.ui.brown.menu .active.item {\n  color: #a5673f;\n}\n.ui.ui.ui.menu .grey.active.item,\n.ui.ui.grey.menu .active.item:hover,\n.ui.ui.grey.menu .active.item {\n  color: #767676;\n}\n.ui.ui.ui.menu .black.active.item,\n.ui.ui.black.menu .active.item:hover,\n.ui.ui.black.menu .active.item {\n  color: #1b1c1d;\n}\n\n/* --------------\n        Inverted\n    --------------- */\n.ui.inverted.menu {\n  border: 0 solid transparent;\n  background: #1b1c1d;\n  box-shadow: none;\n}\n\n/* Menu Item */\n.ui.inverted.menu .item,\n.ui.inverted.menu .item > a:not(.ui) {\n  background: transparent;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.menu .item.menu {\n  background: transparent;\n}\n\n/* --- Border --- */\n.ui.inverted.menu .item::before {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ui.vertical.inverted.menu .item::before {\n  background: rgba(255, 255, 255, 0.08);\n}\n\n/* Sub Menu */\n.ui.vertical.inverted.menu .menu .item,\n.ui.vertical.inverted.menu .menu .item a:not(.ui) {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n/* Header */\n.ui.inverted.menu .header.item {\n  margin: 0;\n  background: transparent;\n  box-shadow: none;\n}\n\n/* Disabled */\n.ui.ui.inverted.menu .item.disabled {\n  color: rgba(225, 225, 225, 0.3);\n}\n\n/* --- Hover --- */\n.ui.link.inverted.menu .item:hover,\n.ui.inverted.menu .dropdown.item:hover,\n.ui.inverted.menu .link.item:hover,\n.ui.inverted.menu a.item:hover {\n  background: rgba(255, 255, 255, 0.08);\n  color: #ffffff;\n}\n.ui.vertical.inverted.menu .item .menu a.item:hover,\n.ui.vertical.inverted.menu .item .menu .link.item:hover {\n  background: transparent;\n  color: #ffffff;\n}\n\n/* --- Pressed --- */\n.ui.inverted.menu a.item:active,\n.ui.inverted.menu .link.item:active {\n  background: rgba(255, 255, 255, 0.08);\n  color: #ffffff;\n}\n\n/* --- Active --- */\n.ui.inverted.menu .active.item {\n  background: #3d3e3f;\n  color: #ffffff !important;\n}\n.ui.inverted.vertical.menu .item .menu .active.item {\n  background: transparent;\n  color: #fff;\n}\n.ui.inverted.pointing.menu .active.item::after {\n  background: #3d3e3f;\n  margin: 0 !important;\n  box-shadow: none !important;\n  border: none !important;\n}\n\n/* --- Active Hover --- */\n.ui.inverted.menu .active.item:hover {\n  background: #3d3e3f;\n  color: #fff !important;\n}\n.ui.inverted.pointing.menu .active.item:hover::after {\n  background: #3d3e3f;\n}\n\n/* --------------\n         Floated\n    --------------- */\n.ui.floated.menu {\n  float: left;\n  margin: 0 0.5rem 0 0;\n}\n.ui.floated.menu .item:last-child::before {\n  display: none;\n}\n.ui.right.floated.menu {\n  float: right;\n  margin: 0 0 0 0.5rem;\n}\n.ui.center.aligned.menu:not(.fluid),\n.ui.centered.menu:not(.fluid) {\n  display: inline-flex;\n  transform: translateX(-50%);\n  margin-left: 50%;\n}\n.ui.center.aligned.menu .item,\n.ui.centered.menu .item {\n  flex: 1 0 auto;\n  justify-content: center;\n}\n\n/* --------------\n        Inverted\n    --------------- */\n.ui.ui.ui.inverted.menu .primary.active.item,\n.ui.ui.inverted.primary.menu {\n  background-color: #2185d0;\n}\n.ui.inverted.primary.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.primary.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.primary.menu .active.item {\n  background-color: #1678c2;\n}\n.ui.ui.ui.inverted.menu .red.active.item,\n.ui.ui.inverted.red.menu {\n  background-color: #db2828;\n}\n.ui.inverted.red.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.red.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.red.menu .active.item {\n  background-color: #d01919;\n}\n.ui.ui.ui.inverted.menu .orange.active.item,\n.ui.ui.inverted.orange.menu {\n  background-color: #f2711c;\n}\n.ui.inverted.orange.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.orange.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.orange.menu .active.item {\n  background-color: #f26202;\n}\n.ui.ui.ui.inverted.menu .yellow.active.item,\n.ui.ui.inverted.yellow.menu {\n  background-color: #fbbd08;\n}\n.ui.inverted.yellow.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.yellow.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.yellow.menu .active.item {\n  background-color: #eaae00;\n}\n.ui.ui.ui.inverted.menu .olive.active.item,\n.ui.ui.inverted.olive.menu {\n  background-color: #b5cc18;\n}\n.ui.inverted.olive.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.olive.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.olive.menu .active.item {\n  background-color: #a7bd0d;\n}\n.ui.ui.ui.inverted.menu .green.active.item,\n.ui.ui.inverted.green.menu {\n  background-color: #21ba45;\n}\n.ui.inverted.green.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.green.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.green.menu .active.item {\n  background-color: #16ab39;\n}\n.ui.ui.ui.inverted.menu .teal.active.item,\n.ui.ui.inverted.teal.menu {\n  background-color: #00b5ad;\n}\n.ui.inverted.teal.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.teal.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.teal.menu .active.item {\n  background-color: #009c95;\n}\n.ui.ui.ui.inverted.menu .blue.active.item,\n.ui.ui.inverted.blue.menu {\n  background-color: #2185d0;\n}\n.ui.inverted.blue.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.blue.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.blue.menu .active.item {\n  background-color: #1678c2;\n}\n.ui.ui.ui.inverted.menu .violet.active.item,\n.ui.ui.inverted.violet.menu {\n  background-color: #6435c9;\n}\n.ui.inverted.violet.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.violet.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.violet.menu .active.item {\n  background-color: #5829bb;\n}\n.ui.ui.ui.inverted.menu .purple.active.item,\n.ui.ui.inverted.purple.menu {\n  background-color: #a333c8;\n}\n.ui.inverted.purple.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.purple.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.purple.menu .active.item {\n  background-color: #9627ba;\n}\n.ui.ui.ui.inverted.menu .pink.active.item,\n.ui.ui.inverted.pink.menu {\n  background-color: #e03997;\n}\n.ui.inverted.pink.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.pink.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.pink.menu .active.item {\n  background-color: #e61a8d;\n}\n.ui.ui.ui.inverted.menu .brown.active.item,\n.ui.ui.inverted.brown.menu {\n  background-color: #a5673f;\n}\n.ui.inverted.brown.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.brown.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.brown.menu .active.item {\n  background-color: #975b33;\n}\n.ui.ui.ui.inverted.menu .grey.active.item,\n.ui.ui.inverted.grey.menu {\n  background-color: #767676;\n}\n.ui.inverted.grey.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.grey.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.grey.menu .active.item {\n  background-color: #838383;\n}\n.ui.ui.ui.inverted.menu .black.active.item,\n.ui.ui.inverted.black.menu {\n  background-color: #1b1c1d;\n}\n.ui.inverted.black.menu .item::before {\n  background-color: rgba(34, 36, 38, 0.1);\n}\n.ui.ui.inverted.black.menu .active.item {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.ui.inverted.pointing.black.menu .active.item {\n  background-color: #27292a;\n}\n.ui.ui.ui.inverted.pointing.menu .active.item::after {\n  background-color: inherit;\n}\n\n/* --------------\n         Fitted\n    --------------- */\n.ui.fitted.menu .item,\n.ui.fitted.menu .item .menu .item,\n.ui.menu .fitted.item {\n  padding: 0;\n}\n.ui.horizontally.fitted.menu .item,\n.ui.horizontally.fitted.menu .item .menu .item,\n.ui.menu .horizontally.fitted.item {\n  padding-top: 0.92857143em;\n  padding-bottom: 0.92857143em;\n}\n.ui.vertically.fitted.menu .item,\n.ui.vertically.fitted.menu .item .menu .item,\n.ui.menu .vertically.fitted.item {\n  padding-left: 1.14285714em;\n  padding-right: 1.14285714em;\n}\n\n/* --------------\n       Borderless\n    --------------- */\n.ui.borderless.menu .item::before,\n.ui.borderless.menu .item .menu .item::before,\n.ui.menu .borderless.item::before {\n  background: none !important;\n}\n\n/* -------------------\n           Compact\n    -------------------- */\n.ui.compact.menu {\n  display: inline-flex;\n  margin: 0;\n  vertical-align: middle;\n}\n.ui.compact.vertical.menu {\n  \n/* IE hack to make dropdown icons appear inline */\n  display: -ms-inline-flexbox !important;\n  display: inline-block;\n}\n.ui.compact.menu:not(.secondary) .item:last-child {\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n}\n.ui.compact.menu .item:last-child::before {\n  display: none;\n}\n.ui.compact.vertical.menu {\n  width: auto !important;\n}\n.ui.compact.vertical.menu .item:last-child::before {\n  display: block;\n}\n\n/* -------------------\n            Fluid\n    -------------------- */\n.ui.menu.fluid,\n.ui.vertical.menu.fluid {\n  width: 100% !important;\n}\n\n/* -------------------\n          Evenly Sized\n    -------------------- */\n.ui[class*=\"equal width\"].menu > .item {\n  flex: 1;\n}\n.ui[class*=\"equal width\"].menu > .item,\n.ui.item.menu,\n.ui.item.menu .item {\n  width: 100%;\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n  text-align: center;\n  justify-content: center;\n}\n.ui.attached[class*=\"equal width\"].menu:not(.tabular),\n.ui.attached.item.menu:not(.tabular) {\n  margin: 0 -1px !important;\n}\n.ui[class*=\"equal width\"].menu > .item:last-child::before,\n.ui.item.menu .item:last-child::before {\n  display: none;\n}\n.ui.menu.two.item .item {\n  width: 50%;\n}\n.ui.menu.three.item .item {\n  width: 33.333%;\n}\n.ui.menu.four.item .item {\n  width: 25%;\n}\n.ui.menu.five.item .item {\n  width: 20%;\n}\n.ui.menu.six.item .item {\n  width: 16.666%;\n}\n.ui.menu.seven.item .item {\n  width: 14.285%;\n}\n.ui.menu.eight.item .item {\n  width: 12.5%;\n}\n.ui.menu.nine.item .item {\n  width: 11.11%;\n}\n.ui.menu.ten.item .item {\n  width: 10%;\n}\n.ui.menu.eleven.item .item {\n  width: 9.09%;\n}\n.ui.menu.twelve.item .item {\n  width: 8.333%;\n}\n\n/* --------------\n         Fixed\n    --------------- */\n.ui.menu.fixed {\n  position: fixed;\n  z-index: 101;\n  margin: 0;\n  width: 100%;\n}\n.ui.menu.fixed,\n.ui.menu.fixed .item:first-child,\n.ui.menu.fixed .item:last-child {\n  border-radius: 0 !important;\n}\n.ui.fixed.menu,\n.ui[class*=\"top fixed\"].menu {\n  top: 0;\n  left: 0;\n  right: auto;\n  bottom: auto;\n}\n.ui[class*=\"top fixed\"].menu {\n  border-top: none;\n  border-left: none;\n  border-right: none;\n}\n.ui[class*=\"right fixed\"].menu {\n  border-top: none;\n  border-bottom: none;\n  border-right: none;\n  top: 0;\n  right: 0;\n  left: auto;\n  bottom: auto;\n  width: auto;\n  height: 100%;\n}\n.ui[class*=\"bottom fixed\"].menu {\n  border-bottom: none;\n  border-left: none;\n  border-right: none;\n  bottom: 0;\n  left: 0;\n  top: auto;\n  right: auto;\n}\n.ui[class*=\"left fixed\"].menu {\n  border-top: none;\n  border-bottom: none;\n  border-left: none;\n  top: 0;\n  left: 0;\n  right: auto;\n  bottom: auto;\n  width: auto;\n  height: 100%;\n}\n\n/* Coupling with Grid */\n.ui.fixed.menu + .ui.grid {\n  padding-top: 2.75rem;\n}\n\n/* -------------------\n           Pointing\n    -------------------- */\n.ui.pointing.menu .item::after {\n  visibility: hidden;\n  position: absolute;\n  content: \"\";\n  top: 100%;\n  left: 50%;\n  transform: translateX(-50%) translateY(-50%) rotate(45deg);\n  background: none;\n  margin: 0.5px 0 0;\n  width: 0.57142857em;\n  height: 0.57142857em;\n  border: none;\n  border-bottom: 1px solid #d4d4d5;\n  border-right: 1px solid #d4d4d5;\n  z-index: 2;\n  transition: background 0.1s ease;\n}\n.ui.vertical.pointing.menu .item::after {\n  position: absolute;\n  top: 50%;\n  right: 0;\n  bottom: auto;\n  left: auto;\n  transform: translateX(50%) translateY(-50%) rotate(45deg);\n  margin: 0 -0.5px 0 0;\n  border: none;\n  border-top: 1px solid #d4d4d5;\n  border-right: 1px solid #d4d4d5;\n}\n.ui.pointing.menu .ui.dropdown .menu .item::after,\n.ui.vertical.pointing.menu .ui.dropdown .menu .item::after {\n  display: none;\n}\n\n/* Active */\n.ui.pointing.menu .active.item::after {\n  visibility: visible;\n}\n.ui.pointing.menu .active.dropdown.item::after {\n  visibility: hidden;\n}\n\n/* Don't double up pointers */\n.ui.pointing.menu .dropdown.active.item::after,\n.ui.pointing.menu .active.item .menu .active.item::after {\n  display: none;\n}\n\n/* Colors */\n.ui.pointing.menu .active.item:hover::after {\n  background-color: #f2f2f2;\n}\n.ui.pointing.menu .active.item::after {\n  background-color: #f2f2f2;\n}\n.ui.pointing.menu .active.item:hover::after {\n  background-color: #f2f2f2;\n}\n.ui.vertical.pointing.menu .active.item:hover::after {\n  background-color: #f2f2f2;\n}\n.ui.vertical.pointing.menu .active.item::after {\n  background-color: #f2f2f2;\n}\n.ui.vertical.pointing.menu .menu .active.item::after {\n  background-color: #fff;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.stackable.grid .ui.fluid.vertical.pointing.menu .active.item::after {\n    display: none;\n  }\n}\n.ui.inverted.pointing.menu .primary.active.item::after {\n  background-color: #2185d0;\n}\n.ui.inverted.pointing.menu .secondary.active.item::after {\n  background-color: #1b1c1d;\n}\n.ui.inverted.pointing.menu .red.active.item::after {\n  background-color: #db2828;\n}\n.ui.inverted.pointing.menu .orange.active.item::after {\n  background-color: #f2711c;\n}\n.ui.inverted.pointing.menu .yellow.active.item::after {\n  background-color: #fbbd08;\n}\n.ui.inverted.pointing.menu .olive.active.item::after {\n  background-color: #b5cc18;\n}\n.ui.inverted.pointing.menu .green.active.item::after {\n  background-color: #21ba45;\n}\n.ui.inverted.pointing.menu .teal.active.item::after {\n  background-color: #00b5ad;\n}\n.ui.inverted.pointing.menu .blue.active.item::after {\n  background-color: #2185d0;\n}\n.ui.inverted.pointing.menu .violet.active.item::after {\n  background-color: #6435c9;\n}\n.ui.inverted.pointing.menu .purple.active.item::after {\n  background-color: #a333c8;\n}\n.ui.inverted.pointing.menu .pink.active.item::after {\n  background-color: #e03997;\n}\n.ui.inverted.pointing.menu .brown.active.item::after {\n  background-color: #a5673f;\n}\n.ui.inverted.pointing.menu .grey.active.item::after {\n  background-color: #767676;\n}\n.ui.inverted.pointing.menu .black.active.item::after {\n  background-color: #1b1c1d;\n}\n\n/* --------------\n        Attached\n    --------------- */\n\n/* Middle */\n.ui.attached.menu {\n  top: 0;\n  bottom: 0;\n  border-radius: 0;\n  margin: 0 -1px;\n  width: calc(100% + 2px);\n  max-width: calc(100% + 2px);\n  box-shadow: none;\n}\n.ui.attached + .ui.attached.menu:not(.top) {\n  border-top: none;\n}\n\n/* Top */\n.ui[class*=\"top attached\"].menu {\n  bottom: 0;\n  margin-bottom: 0;\n  top: 0;\n  margin-top: 1rem;\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.menu[class*=\"top attached\"]:first-child {\n  margin-top: 0;\n}\n\n/* Bottom */\n.ui[class*=\"bottom attached\"].menu {\n  bottom: 0;\n  margin-top: 0;\n  top: 0;\n  margin-bottom: 1rem;\n  box-shadow: none;\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui[class*=\"bottom attached\"].menu:last-child {\n  margin-bottom: 0;\n}\n\n/* Attached Menu Item */\n.ui.top.attached.menu > .item:first-child {\n  border-radius: 0.28571429rem 0 0 0;\n}\n.ui.bottom.attached.menu > .item:first-child {\n  border-radius: 0 0 0 0.28571429rem;\n}\n\n/* Tabular Attached */\n.ui.attached.menu:not(.tabular):not(.text) {\n  border: 1px solid #d4d4d5;\n}\n.ui.attached.inverted.menu {\n  border: none;\n}\n.ui[class*=\"top attached\"].inverted.tabular.menu {\n  border-bottom: 1px solid #555;\n}\n.ui.attached.tabular.menu {\n  margin-left: 0;\n  margin-right: 0;\n  width: 100%;\n}\n.ui.wrapping.menu {\n  flex-wrap: wrap;\n}\n.ui.wrapping.menu .item::before {\n  right: auto;\n  left: 0;\n}\n.ui.wrapping.menu .item:first-child::before {\n  display: none;\n}\n.ui.wrapping.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) .item:last-of-type,\n.ui.wrapping.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) .item:last-child {\n  border-right: 1px solid rgba(34, 36, 38, 0.1);\n}\n.ui.wrapped.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) .item:first-child {\n  border-bottom-left-radius: 0;\n}\n.ui.wrapped.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) .item:last-child {\n  border-top-right-radius: 0;\n}\n\n/* --------------\n     Sizes\n--------------- */\n.ui.menu {\n  font-size: 1rem;\n}\n.ui.vertical.menu {\n  width: 15rem;\n}\n.ui.mini.menu,\n.ui.mini.menu .dropdown,\n.ui.mini.menu .dropdown .menu > .item {\n  font-size: 0.78571429rem;\n}\n.ui.mini.vertical.menu:not(.icon) {\n  width: 9rem;\n}\n.ui.tiny.menu,\n.ui.tiny.menu .dropdown,\n.ui.tiny.menu .dropdown .menu > .item {\n  font-size: 0.85714286rem;\n}\n.ui.tiny.vertical.menu:not(.icon) {\n  width: 11rem;\n}\n.ui.small.menu,\n.ui.small.menu .dropdown,\n.ui.small.menu .dropdown .menu > .item {\n  font-size: 0.92857143rem;\n}\n.ui.small.vertical.menu:not(.icon) {\n  width: 13rem;\n}\n.ui.large.menu,\n.ui.large.menu .dropdown,\n.ui.large.menu .dropdown .menu > .item {\n  font-size: 1.07142857rem;\n}\n.ui.large.vertical.menu:not(.icon) {\n  width: 18rem;\n}\n.ui.big.menu,\n.ui.big.menu .dropdown,\n.ui.big.menu .dropdown .menu > .item {\n  font-size: 1.14285714rem;\n}\n.ui.big.vertical.menu:not(.icon) {\n  width: 20rem;\n}\n.ui.huge.menu,\n.ui.huge.menu .dropdown,\n.ui.huge.menu .dropdown .menu > .item {\n  font-size: 1.21428571rem;\n}\n.ui.huge.vertical.menu:not(.icon) {\n  width: 22rem;\n}\n.ui.massive.menu,\n.ui.massive.menu .dropdown,\n.ui.massive.menu .dropdown .menu > .item {\n  font-size: 1.28571429rem;\n}\n.ui.massive.vertical.menu:not(.icon) {\n  width: 25rem;\n}\n\n/* -------------------\n  Inverted dropdowns\n-------------------- */\n.ui.menu .ui.inverted.inverted.dropdown.item .menu {\n  background: #1b1c1d;\n  box-shadow: none;\n}\n.ui.menu .ui.inverted.dropdown .menu > .item {\n  color: rgba(255, 255, 255, 0.8) !important;\n}\n.ui.menu .ui.inverted.dropdown .menu > .active.item {\n  background: transparent !important;\n  color: rgba(255, 255, 255, 0.8) !important;\n}\n.ui.menu .ui.inverted.dropdown .menu > .item:hover {\n  background: rgba(255, 255, 255, 0.08) !important;\n  color: rgba(255, 255, 255, 0.8) !important;\n}\n.ui.menu .ui.inverted.dropdown .menu > .selected.item {\n  background: rgba(255, 255, 255, 0.15) !important;\n  color: rgba(255, 255, 255, 0.8) !important;\n}\n\n/* Vertical */\n.ui.vertical.menu .inverted.dropdown.item .menu {\n  box-shadow: none;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/message.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Message\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Message\n*******************************/\n\n.ui.message {\n  position: relative;\n  min-height: 1em;\n  margin: 1em 0;\n  background: #f8f8f9;\n  padding: 1em 1.5em;\n  line-height: 1.4285em;\n  color: rgba(0, 0, 0, 0.87);\n  transition: opacity 0.1s ease, color 0.1s ease, background 0.1s ease, box-shadow 0.1s ease;\n  border-radius: 0.28571429rem;\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.22) inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.message:first-child {\n  margin-top: 0;\n}\n.ui.message:last-child {\n  margin-bottom: 0;\n}\n\n/* --------------\n     Content\n--------------- */\n\n/* Header */\n.ui.message .header {\n  display: block;\n  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\";\n  font-weight: bold;\n  margin: -0.14285714em 0 0 0;\n}\n\n/* Default font size */\n.ui.message .header:not(.ui) {\n  font-size: 1.14285714em;\n}\n\n/* Paragraph */\n.ui.message p {\n  opacity: 0.85;\n  margin: 0.75em 0;\n}\n.ui.message p:first-child {\n  margin-top: 0;\n}\n.ui.message p:last-child {\n  margin-bottom: 0;\n}\n.ui.message .header + p {\n  margin-top: 0.25em;\n}\n\n/* List */\n.ui.message .list:not(.ui) {\n  text-align: left;\n  padding: 0;\n  opacity: 0.85;\n  list-style-position: inside;\n  margin: 0.5em 0 0;\n}\n.ui.message .list:not(.ui):first-child {\n  margin-top: 0;\n}\n.ui.message .list:not(.ui):last-child {\n  margin-bottom: 0;\n}\n.ui.message .list:not(.ui) li {\n  position: relative;\n  list-style-type: none;\n  margin: 0 0 0.3em 1em;\n  padding: 0;\n}\n.ui.message .list:not(.ui) li::before {\n  position: absolute;\n  content: \"•\";\n  left: -1em;\n  height: 100%;\n  vertical-align: baseline;\n}\n.ui.message .list:not(.ui) li:last-child {\n  margin-bottom: 0;\n}\n\n/* Icon */\n.ui.icon.message > .icons,\n.ui.icon.message > i.icon {\n  margin-right: 0.6em;\n}\n.ui.icon.message > .icons:last-child,\n.ui.icon.message > i.icon:last-child {\n  margin: 0 0 0 0.6em;\n}\n\n/* Close Icon */\n.ui.message > .close.icon {\n  cursor: pointer;\n  position: absolute;\n  margin: 0;\n  top: 0.78575em;\n  right: 0.5em;\n  opacity: 0.7;\n  transition: opacity 0.1s ease;\n}\n.ui.message > .close.icon:hover {\n  opacity: 1;\n}\n\n/* First / Last Element */\n.ui.message > :first-child {\n  margin-top: 0;\n}\n.ui.message > :last-child {\n  margin-bottom: 0;\n}\n\n\n/*******************************\n            Coupling\n*******************************/\n\n.ui.dropdown .menu > .message {\n  margin: 0 -1px;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------\n    Visible\n--------------- */\n.ui.visible.visible.visible.visible.message {\n  display: block;\n}\n.ui.icon.visible.visible.visible.visible.message {\n  display: flex;\n}\n\n/* --------------\n     Hidden\n--------------- */\n.ui.hidden.hidden.hidden.hidden.message {\n  display: none;\n}\n\n\n/*******************************\n            Variations\n*******************************/\n\n.ui.centered.message,\n.ui.center.aligned.message {\n  text-align: center;\n  justify-content: center;\n}\n.ui.centered.message > .content,\n.ui.center.aligned.message > .content {\n  flex: 0 0 auto;\n}\n.ui.right.aligned.message {\n  text-align: right;\n}\n\n/* --------------\n        Compact\n    --------------- */\n.ui.compact.message {\n  display: inline-block;\n  max-width: 100%;\n}\n.ui.compact.icon.message {\n  display: inline-flex;\n  width: auto;\n}\n\n/* --------------\n        Attached\n    --------------- */\n.ui.attached.message {\n  margin-bottom: -1px;\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15) inset;\n  margin-left: -1px;\n  margin-right: -1px;\n}\n.ui.attached + .ui.attached.message:not(.top):not(.bottom) {\n  margin-top: -1px;\n  border-radius: 0;\n}\n.ui.bottom.attached.message {\n  margin-top: -1px;\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15) inset, 0 1px 2px 0 rgba(34, 36, 38, 0.15);\n}\n.ui.bottom.attached.message:not(:last-child) {\n  margin-bottom: 1em;\n}\n.ui.attached.icon.message {\n  width: auto;\n}\n\n/* --------------\n          Icon\n    --------------- */\n.ui.icon.message {\n  display: flex;\n  width: 100%;\n  align-items: center;\n}\n.ui.icon.message > .icons,\n.ui.icon.message > i.icon:not(.close) {\n  display: block;\n  flex: 0 0 auto;\n  width: auto;\n  line-height: 1;\n  vertical-align: middle;\n  font-size: 3em;\n  opacity: 0.8;\n}\n.ui.icon.message > .content {\n  display: block;\n  flex: 1 1 auto;\n  vertical-align: middle;\n}\n.ui.icon.message > .icons + .content,\n.ui.icon.message > i.icon:not(.close) + .content {\n  padding-left: 0;\n}\n.ui.icon.message > i.circular {\n  width: 1em;\n}\n\n/* --------------\n        Floating\n    --------------- */\n.ui.floating.message {\n  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);\n}\n\n/* --------------\n     Colors\n--------------- */\n\n/* --------------\n     Types\n--------------- */\n\n/* Colors */\n.ui.positive.message {\n  background-color: #fcfff5;\n  color: #2c662d;\n}\n.ui.positive.message,\n.ui.attached.positive.message {\n  box-shadow: 0 0 0 1px #a3c293 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.positive.message {\n  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);\n}\n.ui.positive.message .header {\n  color: #1a531b;\n}\n.ui.inverted.positive.message,\n.ui.inverted.positive.message .header {\n  color: #a3c293;\n}\n.ui.negative.message {\n  background-color: #fff6f6;\n  color: #9f3a38;\n}\n.ui.negative.message,\n.ui.attached.negative.message {\n  box-shadow: 0 0 0 1px #e0b4b4 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.negative.message {\n  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);\n}\n.ui.negative.message .header {\n  color: #912d2b;\n}\n.ui.inverted.negative.message,\n.ui.inverted.negative.message .header {\n  color: #e0b4b4;\n}\n.ui.error.message {\n  background-color: #fff6f6;\n  color: #9f3a38;\n}\n.ui.error.message,\n.ui.attached.error.message {\n  box-shadow: 0 0 0 1px #e0b4b4 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.error.message {\n  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);\n}\n.ui.error.message .header {\n  color: #912d2b;\n}\n.ui.inverted.error.message,\n.ui.inverted.error.message .header {\n  color: #ecd1d1;\n}\n.ui.info.message {\n  background-color: #f8ffff;\n  color: #276f86;\n}\n.ui.info.message,\n.ui.attached.info.message {\n  box-shadow: 0 0 0 1px #a9d5de inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.info.message {\n  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);\n}\n.ui.info.message .header {\n  color: #0e566c;\n}\n.ui.inverted.info.message,\n.ui.inverted.info.message .header {\n  color: #c6e3e9;\n}\n.ui.success.message {\n  background-color: #fcfff5;\n  color: #2c662d;\n}\n.ui.success.message,\n.ui.attached.success.message {\n  box-shadow: 0 0 0 1px #a3c293 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.success.message {\n  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);\n}\n.ui.success.message .header {\n  color: #1a531b;\n}\n.ui.inverted.success.message,\n.ui.inverted.success.message .header {\n  color: #b9d1ad;\n}\n.ui.warning.message {\n  background-color: #fffaf3;\n  color: #573a08;\n}\n.ui.warning.message,\n.ui.attached.warning.message {\n  box-shadow: 0 0 0 1px #c9ba9b inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.warning.message {\n  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);\n}\n.ui.warning.message .header {\n  color: #794b02;\n}\n.ui.inverted.warning.message,\n.ui.inverted.warning.message .header {\n  color: #d7ccb5;\n}\n.ui.primary.message {\n  background-color: #dff0ff;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.primary.message,\n.ui.attached.primary.message {\n  box-shadow: 0 0 0 1px #2185d0 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.primary.message {\n  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);\n}\n.ui.primary.message .header {\n  color: rgba(242, 242, 242, 0.9);\n}\n.ui.secondary.message {\n  background-color: #f4f4f4;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.secondary.message,\n.ui.attached.secondary.message {\n  box-shadow: 0 0 0 1px #1b1c1d inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.secondary.message {\n  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);\n}\n.ui.secondary.message .header {\n  color: rgba(242, 242, 242, 0.9);\n}\n.ui.red.message {\n  background-color: #ffe8e6;\n  color: #db2828;\n}\n.ui.red.message,\n.ui.attached.red.message {\n  box-shadow: 0 0 0 1px #db2828 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.red.message {\n  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);\n}\n.ui.red.message .header {\n  color: #c82121;\n}\n.ui.orange.message {\n  background-color: #ffedde;\n  color: #f2711c;\n}\n.ui.orange.message,\n.ui.attached.orange.message {\n  box-shadow: 0 0 0 1px #f2711c inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.orange.message {\n  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);\n}\n.ui.orange.message .header {\n  color: #e7640d;\n}\n.ui.yellow.message {\n  background-color: #fff8db;\n  color: #b58105;\n}\n.ui.yellow.message,\n.ui.attached.yellow.message {\n  box-shadow: 0 0 0 1px #b58105 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.yellow.message {\n  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);\n}\n.ui.yellow.message .header {\n  color: #9c6f04;\n}\n.ui.olive.message {\n  background-color: #fbfdef;\n  color: #8abc1e;\n}\n.ui.olive.message,\n.ui.attached.olive.message {\n  box-shadow: 0 0 0 1px #8abc1e inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.olive.message {\n  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);\n}\n.ui.olive.message .header {\n  color: #7aa61a;\n}\n.ui.green.message {\n  background-color: #e5f9e7;\n  color: #1ebc30;\n}\n.ui.green.message,\n.ui.attached.green.message {\n  box-shadow: 0 0 0 1px #1ebc30 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.green.message {\n  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);\n}\n.ui.green.message .header {\n  color: #1aa62a;\n}\n.ui.teal.message {\n  background-color: #e1f7f7;\n  color: #10a3a3;\n}\n.ui.teal.message,\n.ui.attached.teal.message {\n  box-shadow: 0 0 0 1px #10a3a3 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.teal.message {\n  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);\n}\n.ui.teal.message .header {\n  color: #0e8c8c;\n}\n.ui.blue.message {\n  background-color: #dff0ff;\n  color: #2185d0;\n}\n.ui.blue.message,\n.ui.attached.blue.message {\n  box-shadow: 0 0 0 1px #2185d0 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.blue.message {\n  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);\n}\n.ui.blue.message .header {\n  color: #1e77ba;\n}\n.ui.violet.message {\n  background-color: #eae7ff;\n  color: #6435c9;\n}\n.ui.violet.message,\n.ui.attached.violet.message {\n  box-shadow: 0 0 0 1px #6435c9 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.violet.message {\n  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);\n}\n.ui.violet.message .header {\n  color: #5a30b5;\n}\n.ui.purple.message {\n  background-color: #f6e7ff;\n  color: #a333c8;\n}\n.ui.purple.message,\n.ui.attached.purple.message {\n  box-shadow: 0 0 0 1px #a333c8 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.purple.message {\n  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);\n}\n.ui.purple.message .header {\n  color: #922eb4;\n}\n.ui.pink.message {\n  background-color: #ffe3fb;\n  color: #e03997;\n}\n.ui.pink.message,\n.ui.attached.pink.message {\n  box-shadow: 0 0 0 1px #e03997 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.pink.message {\n  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);\n}\n.ui.pink.message .header {\n  color: #dd238b;\n}\n.ui.brown.message {\n  background-color: #f1e2d3;\n  color: #a5673f;\n}\n.ui.brown.message,\n.ui.attached.brown.message {\n  box-shadow: 0 0 0 1px #a5673f inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.brown.message {\n  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);\n}\n.ui.brown.message .header {\n  color: #935b38;\n}\n.ui.grey.message {\n  background-color: #f4f4f4;\n  color: #767676;\n}\n.ui.grey.message,\n.ui.attached.grey.message {\n  box-shadow: 0 0 0 1px #767676 inset, 0 0 0 0 rgba(0, 0, 0, 0);\n}\n.ui.floating.grey.message {\n  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);\n}\n.ui.grey.message .header {\n  color: #696969;\n}\n.ui.black.message {\n  background-color: #1b1c1d;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.black.message .header {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.message {\n  background-color: #1b1c1d;\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* --------------\n     Sizes\n--------------- */\n.ui.message {\n  font-size: 1em;\n}\n.ui.mini.message {\n  font-size: 0.78571429em;\n}\n.ui.tiny.message {\n  font-size: 0.85714286em;\n}\n.ui.small.message {\n  font-size: 0.92857143em;\n}\n.ui.large.message {\n  font-size: 1.14285714em;\n}\n.ui.big.message {\n  font-size: 1.28571429em;\n}\n.ui.huge.message {\n  font-size: 1.42857143em;\n}\n.ui.massive.message {\n  font-size: 1.71428571em;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/modal.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Modal\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Modal\n*******************************/\n\n.ui.modal {\n  position: absolute;\n  display: none;\n  z-index: 1001;\n  text-align: left;\n  background: #fff;\n  border: none;\n  box-shadow: 1px 3px 3px 0 rgba(0, 0, 0, 0.2), 1px 3px 15px 2px rgba(0, 0, 0, 0.2);\n  transform-origin: 50% 25%;\n  flex: 0 0 auto;\n  border-radius: 0.28571429rem;\n  -webkit-user-select: text;\n      -ms-user-select: text;\n          user-select: text;\n  will-change: top, left, margin, transform, opacity;\n  outline: none;\n}\n.ui.modal > :first-child:not(.close):not(.dimmer),\n.ui.modal > i.icon:first-child + *,\n.ui.modal > .dimmer:first-child + *:not(.close),\n.ui.modal > .dimmer:first-child + i.icon + * {\n  border-top-left-radius: 0.28571429rem;\n  border-top-right-radius: 0.28571429rem;\n}\n.ui.modal > :last-child {\n  border-bottom-left-radius: 0.28571429rem;\n  border-bottom-right-radius: 0.28571429rem;\n}\n.ui.modal > .ui.dimmer {\n  border-radius: inherit;\n}\n\n\n/*******************************\n            Content\n*******************************/\n\n\n/* --------------\n         Close\n    --------------- */\n.ui.modal > .close {\n  cursor: pointer;\n  position: absolute;\n  top: -2.5rem;\n  right: -2.5rem;\n  z-index: 1;\n  opacity: 0.8;\n  font-size: 1.25em;\n  color: #fff;\n  width: 2.25rem;\n  height: 2.25rem;\n  padding: 0.625rem 0 0 0;\n}\n.ui.modal > .close:focus,\n.ui.modal > .close:hover {\n  opacity: 1;\n  outline: none;\n}\n\n/* --------------\n     Header\n--------------- */\n.ui.modal > .header {\n  display: block;\n  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\";\n  background: #fff;\n  margin: 0;\n  padding: 1.25rem 1.5rem;\n  box-shadow: none;\n  color: rgba(0, 0, 0, 0.85);\n  border-bottom: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.modal > .header:not(.ui) {\n  font-size: 1.42857143rem;\n  line-height: 1.28571429em;\n  font-weight: bold;\n}\n\n/* --------------\n     Content\n--------------- */\n.ui.modal > .content {\n  display: block;\n  width: 100%;\n  font-size: 1em;\n  line-height: 1.4;\n  padding: 1.5rem;\n  background: #fff;\n}\n.ui.modal > .image.content {\n  display: flex;\n  flex-direction: row;\n}\n\n/* Image */\n.ui.modal > .content > .image {\n  display: block;\n  flex: 0 1 auto;\n  width: \"\";\n  align-self: start;\n  max-width: 100%;\n}\n.ui.modal > [class*=\"top aligned\"] {\n  align-self: start;\n}\n.ui.modal > [class*=\"middle aligned\"] {\n  align-self: center;\n}\n.ui.modal > [class*=\"stretched\"] {\n  align-self: stretch;\n}\n\n/* Description */\n.ui.modal > .content > .description {\n  display: block;\n  flex: 1 0 auto;\n  min-width: 0;\n  align-self: start;\n}\n.ui.modal > .content > i.icon + .description,\n.ui.modal > .content > .image + .description {\n  flex: 0 1 auto;\n  min-width: \"\";\n  width: auto;\n  padding-left: 2em;\n}\n\n/* rtl:ignore */\n.ui.modal > .content > .image > i.icon {\n  margin: 0;\n  opacity: 1;\n  width: auto;\n  line-height: 1;\n  font-size: 8rem;\n}\n\n/* --------------\n         Actions\n    --------------- */\n.ui.modal > .actions {\n  background: #f9fafb;\n  padding: 1rem;\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n  text-align: right;\n}\n.ui.modal .actions > .button:not(.fluid) {\n  margin-left: 0.75em;\n}\n.ui.ui.modal > .basic.actions,\n.ui.basic.modal > .actions {\n  border-top: none;\n}\n.ui.modal > .left.actions {\n  text-align: left;\n}\n.ui.modal > .left.actions > .button:not(.fluid) {\n  margin-left: 0.5em;\n  margin-right: 0.5em;\n}\n.ui.modal > .centered,\n.ui.modal > .center.aligned {\n  text-align: center;\n}\n.ui.modal > .centered.actions > .button:not(.fluid),\n.ui.modal > .center.aligned.actions > .button:not(.fluid) {\n  margin-left: 0.5em;\n  margin-right: 0.5em;\n}\n\n/* -------------------\n       Responsive\n-------------------- */\n\n/* Modal Width */\n@media only screen and (max-width: 767.98px) {\n  .ui.modal:not(.fullscreen) {\n    width: 95%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.modal:not(.fullscreen) {\n    width: 88%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.modal:not(.fullscreen) {\n    width: 850px;\n    margin: 0;\n  }\n  .ui.modal:not(.fullscreen) > .active.dimmer + .close:not(.inside) {\n    pointer-events: none;\n    opacity: 0.1;\n  }\n  .ui.dimmer > .ui.modal:not(.fullscreen) > .close:not(.inside) {\n    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);\n  }\n  .ui.inverted.dimmer > .ui.modal:not(.fullscreen) > .close:not(.inside) {\n    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);\n  }\n}\n@media only screen and (min-width: 1200px) {\n  .ui.modal:not(.fullscreen) {\n    width: 900px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.modal:not(.fullscreen) {\n    width: 950px;\n    margin: 0;\n  }\n}\n\n/* Tablet and Mobile */\n@media only screen and (max-width: 991.98px) {\n  .ui.modal > .close + .header {\n    padding-right: 2.25rem;\n  }\n  .ui.modal > .close {\n    top: 1.0535rem;\n    right: 1rem;\n    color: rgba(0, 0, 0, 0.87);\n  }\n}\n\n/* Mobile */\n@media only screen and (max-width: 767.98px) {\n  .ui.modal > .header {\n    padding: 0.75rem 1rem;\n  }\n  .ui.modal > .close + .header {\n    padding-right: 2.25rem;\n  }\n  .ui.overlay.fullscreen.modal > .content.content.content {\n    min-height: calc(100vh - 8.1rem);\n  }\n  .ui.overlay.fullscreen.modal > .scrolling.content.content.content {\n    max-height: calc(100vh - 8.1rem);\n  }\n  .ui.modal > .content {\n    display: block;\n    padding: 1rem !important;\n  }\n  .ui.modal > .close {\n    top: 0.5rem !important;\n    right: 0.5rem !important;\n  }\n  \n/* rtl:ignore */\n  .ui.modal .image.content {\n    flex-direction: column;\n  }\n  .ui.modal > .content > .image {\n    display: block;\n    max-width: 100%;\n    margin: 0 auto !important;\n    text-align: center;\n    padding: 0 0 1rem !important;\n  }\n  .ui.modal > .content > .image > i.icon {\n    font-size: 5rem;\n    text-align: center;\n  }\n  \n/* rtl:ignore */\n  .ui.modal > .content > .description {\n    display: block;\n    width: 100% !important;\n    margin: 0 !important;\n    padding: 1rem 0 !important;\n    box-shadow: none;\n  }\n  \n/* Let Buttons Stack */\n  .ui.modal > .actions {\n    padding: 1rem 1rem 0rem !important;\n  }\n  .ui.modal .actions > .buttons,\n  .ui.modal .actions > .button {\n    margin-bottom: 1rem;\n  }\n}\n\n/* --------------\n    Coupling\n--------------- */\n.ui.inverted.dimmer > .ui.modal {\n  box-shadow: 1px 3px 10px 2px rgba(0, 0, 0, 0.2);\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n.ui.basic.modal {\n  background-color: transparent;\n  border: none;\n  border-radius: 0;\n  box-shadow: none !important;\n  color: #fff;\n}\n.ui.ui.modal > .basic.header,\n.ui.ui.modal > .basic.actions,\n.ui.basic.modal > .header,\n.ui.basic.modal > .content,\n.ui.basic.modal > .actions {\n  background-color: transparent;\n}\n.ui.modal > .basic.header {\n  border-bottom: none;\n}\n.ui.basic.modal > .header {\n  color: #fff;\n  border-bottom: none;\n}\n.ui.basic.modal > .close {\n  top: 1rem;\n  right: 1.5rem;\n  color: #fff;\n}\n.ui.inverted.dimmer > .basic.modal {\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.inverted.dimmer > .ui.basic.modal > .header {\n  color: rgba(0, 0, 0, 0.85);\n}\n\n/* Resort to margin positioning if legacy */\n.ui.legacy.legacy.modal,\n.ui.legacy.legacy.page.dimmer > .ui.modal {\n  left: 50% !important;\n}\n.ui.legacy.legacy.modal:not(.aligned),\n.ui.legacy.legacy.page.dimmer > .ui.modal:not(.aligned) {\n  top: 50%;\n}\n.ui.legacy.legacy.page.dimmer > .ui.scrolling.modal:not(.aligned),\n.ui.page.dimmer > .ui.scrolling.legacy.legacy.modal:not(.aligned),\n.ui.top.aligned.legacy.legacy.page.dimmer > .ui.modal:not(.aligned),\n.ui.top.aligned.dimmer > .ui.legacy.legacy.modal:not(.aligned) {\n  top: auto;\n}\n.ui.legacy.overlay.fullscreen.modal {\n  margin-top: -2rem !important;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n.ui.loading.modal {\n  display: block;\n  visibility: hidden;\n  z-index: -1;\n}\n.ui.active.modal {\n  display: block;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n       Aligned\n    --------------- */\n.modals.dimmer .ui.top.aligned.modal {\n  top: 5vh;\n}\n.modals.dimmer .ui.bottom.aligned.modal {\n  bottom: 5vh;\n}\n@media only screen and (max-width: 767.98px) {\n  .modals.dimmer .ui.top.aligned.modal {\n    top: 1rem;\n  }\n  .modals.dimmer .ui.bottom.aligned.modal {\n    bottom: 1rem;\n  }\n}\n\n/* --------------\n        Scrolling\n    --------------- */\n\n/* Scrolling Dimmer */\n.scrolling.dimmable.dimmed {\n  overflow: hidden;\n}\n.scrolling.dimmable > .dimmer {\n  justify-content: center;\n  position: fixed;\n}\n.scrolling.dimmable:not(body) > .dimmer {\n  position: absolute;\n}\n.scrolling.dimmable.dimmed > .dimmer {\n  overflow: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n}\n.modals.dimmer .ui.scrolling.modal.fullscreen {\n  top: 0;\n}\n.modals.dimmer .ui.scrolling.modal:not(.fullscreen) {\n  margin: 2rem auto;\n  top: 1em;\n}\n\n/* Fix for Firefox, Edge, IE11 */\n.modals.dimmer .ui.scrolling.modal:not([class*=\"overlay fullscreen\"])::after {\n  content: \"\\00A0\";\n  position: absolute;\n  height: 2rem;\n}\n\n/* Undetached Scrolling */\n.scrolling.undetached.dimmable.dimmed {\n  overflow: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n}\n.scrolling.undetached.dimmable.dimmed > .dimmer {\n  overflow: hidden;\n}\n.scrolling.undetached.dimmable .ui.scrolling.modal:not(.fullscreen) {\n  position: absolute;\n  left: 50%;\n}\n\n/* Scrolling Content */\n.ui.modal > .scrolling.content {\n  max-height: calc(80vh - 10rem);\n  overflow: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n}\n.ui.modal > .resizable.scrolling.content {\n  resize: vertical;\n  max-height: none;\n}\n.ui.overlay.fullscreen.modal > .content {\n  min-height: calc(100vh - 9.1rem);\n}\n.ui.overlay.fullscreen.modal > .scrolling.content {\n  max-height: calc(100vh - 9.1rem);\n}\n\n/* --------------\n       Full Screen\n    --------------- */\n.ui.fullscreen.modal {\n  width: 95%;\n  left: 2.5%;\n  margin: 1em auto;\n}\n.ui.overlay.fullscreen.modal {\n  width: 100%;\n  left: 0;\n  margin: 0 auto;\n  top: 0;\n  border-radius: 0;\n}\n.ui.modal > .close.inside + .header:not(.centered):not(.center):not(.icon),\n.ui.fullscreen.modal > .close + .header:not(.centered):not(.center):not(.icon) {\n  padding-right: 2.25rem;\n}\n.ui.modal > .close.inside,\n.ui.fullscreen.modal > .close {\n  top: 1.0535rem;\n  right: 1rem;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.basic.fullscreen.modal > .close {\n  color: #fff;\n}\n\n/* --------------\n      Size\n--------------- */\n.ui.modal {\n  font-size: 1rem;\n}\n.ui.mini.modal > .header:not(.ui) {\n  font-size: 1.3em;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.mini.modal {\n    width: 95%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.mini.modal {\n    width: 35.2%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.mini.modal {\n    width: 340px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1200px) {\n  .ui.mini.modal {\n    width: 360px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.mini.modal {\n    width: 380px;\n    margin: 0;\n  }\n}\n.ui.tiny.modal > .header:not(.ui) {\n  font-size: 1.3em;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.tiny.modal {\n    width: 95%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.tiny.modal {\n    width: 52.8%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.tiny.modal {\n    width: 510px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1200px) {\n  .ui.tiny.modal {\n    width: 540px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.tiny.modal {\n    width: 570px;\n    margin: 0;\n  }\n}\n.ui.small.modal > .header:not(.ui) {\n  font-size: 1.3em;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.small.modal {\n    width: 95%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.small.modal {\n    width: 70.4%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.small.modal {\n    width: 680px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1200px) {\n  .ui.small.modal {\n    width: 720px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.small.modal {\n    width: 760px;\n    margin: 0;\n  }\n}\n.ui.large.modal > .header:not(.ui) {\n  font-size: 1.6em;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.large.modal {\n    width: 95%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.large.modal {\n    width: 88%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.large.modal {\n    width: 1020px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1200px) {\n  .ui.large.modal {\n    width: 1080px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.large.modal {\n    width: 1140px;\n    margin: 0;\n  }\n}\n.ui.big.modal > .header:not(.ui) {\n  font-size: 1.6em;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.big.modal {\n    width: 95%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.big.modal {\n    width: 88%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.big.modal {\n    width: 1190px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1200px) {\n  .ui.big.modal {\n    width: 1260px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.big.modal {\n    width: 1330px;\n    margin: 0;\n  }\n}\n.ui.huge.modal > .header:not(.ui) {\n  font-size: 1.6em;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.huge.modal {\n    width: 95%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.huge.modal {\n    width: 88%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.huge.modal {\n    width: 1360px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1200px) {\n  .ui.huge.modal {\n    width: 1440px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.huge.modal {\n    width: 1520px;\n    margin: 0;\n  }\n}\n.ui.massive.modal > .header:not(.ui) {\n  font-size: 1.8em;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.massive.modal {\n    width: 95%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.massive.modal {\n    width: 88%;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.massive.modal {\n    width: 1530px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1200px) {\n  .ui.massive.modal {\n    width: 1620px;\n    margin: 0;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.massive.modal {\n    width: 1710px;\n    margin: 0;\n  }\n}\n\n\n/*****************************\n              Inverted\n    *******************************/\n\n.ui.inverted.modal {\n  background: #000;\n}\n.ui.inverted.modal > .header,\n.ui.inverted.modal > .content {\n  background: #000;\n  color: #fff;\n}\n.ui.inverted.modal > .actions {\n  background: #191a1b;\n  border-top: 1px solid rgba(34, 36, 38, 0.85);\n  color: #fff;\n}\n.ui.inverted.dimmer > .modal > .close {\n  color: rgba(0, 0, 0, 0.85);\n}\n@media only screen and (max-width: 991.98px) {\n  .ui.dimmer .inverted.modal > .close {\n    color: #fff;\n  }\n}\n.ui.inverted.modal > .close.inside,\n.ui.inverted.fullscreen.modal > .close {\n  color: #fff;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/modal.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Modal\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.modal = function (parameters) {\n        var\n            $allModules    = $(this),\n            $window        = $(window),\n            $document      = $(document),\n            $body          = $('body'),\n\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n            contextCheck   = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $body;\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : $body;\n                    }\n                }\n\n                return $context;\n            },\n            returnedValue\n        ;\n\n        $allModules.each(function () {\n            var\n                settings    = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.modal.settings, parameters)\n                    : $.extend({}, $.fn.modal.settings),\n\n                selector        = settings.selector,\n                className       = settings.className,\n                namespace       = settings.namespace,\n                fields          = settings.fields,\n                error           = settings.error,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                $module         = $(this),\n                $context        = contextCheck(settings.context, window),\n                isBody          = $context[0] === $body[0],\n                $closeIcon      = $module.find(selector.closeIcon),\n                $inputs,\n\n                $allModals,\n                $otherModals,\n                $focusedElement,\n                $dimmable,\n                $dimmer,\n\n                isModalComponent = $module.hasClass('modal'),\n\n                element         = this,\n                instance        = isModalComponent ? $module.data(moduleNamespace) : undefined,\n\n                ignoreRepeatedEvents = false,\n\n                initialMouseDownInModal,\n                initialMouseDownInScrollbar,\n                initialBodyMargin = '',\n                tempBodyMargin = '',\n                keepScrollingClass = false,\n                hadScrollbar = false,\n                windowRefocused = false,\n\n                elementEventNamespace,\n                id,\n                observer,\n                observeAttributes = false,\n                module\n            ;\n            module = {\n\n                initialize: function () {\n                    module.create.id();\n                    if (!isModalComponent) {\n                        module.create.modal();\n                        if (!isFunction(settings.onHidden)) {\n                            settings.onHidden = function () {\n                                module.destroy();\n                                $module.remove();\n                            };\n                        }\n                    }\n                    $module.addClass(settings.class);\n                    if (settings.title !== '') {\n                        $module.find(selector.title).html(module.helpers.escape(settings.title, settings.preserveHTML)).addClass(settings.classTitle);\n                    }\n                    if (settings.content !== '') {\n                        $module.find(selector.content).html(module.helpers.escape(settings.content, settings.preserveHTML)).addClass(settings.classContent);\n                    }\n                    if (module.has.configActions()) {\n                        var $actions = $module.find(selector.actions).addClass(settings.classActions);\n                        if ($actions.length === 0) {\n                            $actions = $('<div/>', { class: className.actions + ' ' + (settings.classActions || '') }).appendTo($module);\n                        } else {\n                            $actions.empty();\n                        }\n                        settings.actions.forEach(function (el) {\n                            var\n                                icon = el[fields.icon]\n                                    ? '<i ' + (el[fields.text] ? 'aria-hidden=\"true\"' : '') + ' class=\"' + module.helpers.deQuote(el[fields.icon]) + ' icon\"></i>'\n                                    : '',\n                                text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),\n                                cls = module.helpers.deQuote(el[fields.class] || ''),\n                                click = el[fields.click] && isFunction(el[fields.click])\n                                    ? el[fields.click]\n                                    : function () {}\n                            ;\n                            $actions.append($('<button/>', {\n                                html: icon + text,\n                                'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g, ''),\n                                class: className.button + ' ' + cls,\n                                on: {\n                                    click: function () {\n                                        var button = $(this);\n                                        if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) {\n                                            return;\n                                        }\n                                        module.hide();\n                                    },\n                                },\n                            }));\n                        });\n                    }\n                    module.cache = {};\n                    module.verbose('Initializing dimmer', $context);\n\n                    module.create.dimmer();\n\n                    if (settings.allowMultiple) {\n                        module.create.innerDimmer();\n                    }\n                    if (!settings.centered) {\n                        $module.addClass('top aligned');\n                    }\n                    module.refreshModals();\n                    module.bind.events();\n                    module.observeChanges();\n                    module.instantiate();\n                    if (settings.autoShow) {\n                        module.show();\n                    }\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of modal');\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, instance)\n                    ;\n                },\n\n                create: {\n                    modal: function () {\n                        $module = $('<div/>', { class: className.modal, role: 'dialog', 'aria-modal': true });\n                        if (settings.closeIcon) {\n                            $closeIcon = $('<i/>', {\n                                class: className.close,\n                                role: 'button',\n                                tabindex: 0,\n                                'aria-label': settings.text.close,\n                            });\n                            $module.append($closeIcon);\n                        }\n                        if (settings.title !== '') {\n                            var titleId = '_' + module.get.id() + 'title';\n                            $module.attr('aria-labelledby', titleId);\n                            $('<div/>', { class: className.title, id: titleId }).appendTo($module);\n                        }\n                        if (settings.content !== '') {\n                            var descId = '_' + module.get.id() + 'desc';\n                            $module.attr('aria-describedby', descId);\n                            $('<div/>', { class: className.content, id: descId }).appendTo($module);\n                        }\n                        if (module.has.configActions()) {\n                            $('<div/>', { class: className.actions }).appendTo($module);\n                        }\n                        $context.append($module);\n                        element = $module[0];\n                    },\n                    dimmer: function () {\n                        var\n                            defaultSettings = {\n                                debug: settings.debug,\n                                dimmerName: 'modals',\n                            },\n                            dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)\n                        ;\n                        if ($.fn.dimmer === undefined) {\n                            module.error(error.dimmer);\n\n                            return;\n                        }\n                        module.debug('Creating dimmer');\n                        $dimmable = $context.dimmer(dimmerSettings);\n                        keepScrollingClass = module.is.scrolling();\n                        if (settings.detachable) {\n                            module.verbose('Modal is detachable, moving content into dimmer');\n                            $dimmable.dimmer('add content', $module);\n                        } else {\n                            module.set.undetached();\n                        }\n                        $dimmer = $dimmable.dimmer('get dimmer');\n                    },\n                    id: function () {\n                        id = (Math.random().toString(16) + '000000000').slice(2, 10);\n                        elementEventNamespace = '.' + id;\n                        module.verbose('Creating unique id for element', id);\n                    },\n                    innerDimmer: function () {\n                        if ($module.find(selector.dimmer).length === 0) {\n                            $('<div/>', { class: className.innerDimmer }).prependTo($module);\n                        }\n                    },\n                },\n\n                destroy: function () {\n                    if (observer) {\n                        observer.disconnect();\n                    }\n                    module.verbose('Destroying previous modal');\n                    $module\n                        .removeData(moduleNamespace)\n                        .off(eventNamespace)\n                    ;\n                    $window.off(elementEventNamespace);\n                    $context.off(elementEventNamespace);\n                    $dimmer.off(elementEventNamespace);\n                    $closeIcon.off(elementEventNamespace);\n                    if ($inputs) {\n                        $inputs.off(elementEventNamespace);\n                    }\n                    $context.dimmer('destroy');\n                },\n\n                observeChanges: function () {\n                    if ('MutationObserver' in window) {\n                        observer = new MutationObserver(function (mutations) {\n                            var collectNodes = function (parent) {\n                                    var nodes = [];\n                                    for (var c = 0, cl = parent.length; c < cl; c++) {\n                                        Array.prototype.push.apply(nodes, collectNodes(parent[c].childNodes));\n                                        nodes.push(parent[c]);\n                                    }\n\n                                    return nodes;\n                                },\n                                shouldRefresh = false,\n                                shouldRefreshInputs = false,\n                                ignoreAutofocus = true\n                            ;\n                            mutations.every(function (mutation) {\n                                if (mutation.type === 'attributes') {\n                                    if (observeAttributes && (mutation.attributeName === 'disabled' || $(mutation.target).find(':input').addBack(':input').filter(':visible').length > 0)) {\n                                        shouldRefreshInputs = true;\n                                    }\n                                } else {\n                                    shouldRefresh = true;\n                                    // mutationobserver only provides the parent nodes\n                                    // so let's collect all childs as well to find nested inputs\n                                    var $addedInputs = $(collectNodes(mutation.addedNodes)).filter('a[href], [tabindex], :input:enabled').filter(':visible'),\n                                        $removedInputs = $(collectNodes(mutation.removedNodes)).filter('a[href], [tabindex], :input');\n                                    if ($addedInputs.length > 0 || $removedInputs.length > 0) {\n                                        shouldRefreshInputs = true;\n                                        if ($addedInputs.filter(':input').length > 0 || $removedInputs.filter(':input').length > 0) {\n                                            ignoreAutofocus = false;\n                                        }\n                                    }\n                                }\n\n                                return !shouldRefreshInputs;\n                            });\n\n                            if (shouldRefresh && settings.observeChanges) {\n                                module.debug('DOM tree modified, refreshing');\n                                module.refresh();\n                            }\n                            if (shouldRefreshInputs) {\n                                module.refreshInputs(ignoreAutofocus);\n                            }\n                        });\n                        observer.observe(element, {\n                            attributeFilter: ['class', 'disabled'],\n                            attributes: true,\n                            childList: true,\n                            subtree: true,\n                        });\n                        module.debug('Setting up mutation observer', observer);\n                    }\n                },\n\n                refresh: function () {\n                    module.remove.scrolling();\n                    module.cacheSizes();\n                    if (!module.can.useFlex()) {\n                        module.set.modalOffset();\n                    }\n                    module.set.screenHeight();\n                    module.set.type();\n                },\n\n                refreshModals: function () {\n                    $otherModals = $module.siblings(selector.modal);\n                    $allModals = $otherModals.add($module);\n                },\n\n                refreshInputs: function (ignoreAutofocus) {\n                    if ($inputs) {\n                        $inputs\n                            .off('keydown' + elementEventNamespace)\n                        ;\n                    }\n                    $inputs = $module.find('a[href], [tabindex], :input:enabled').filter(':visible').filter(function () {\n                        return $(this).closest('.disabled').length === 0;\n                    });\n                    if ($inputs.filter(':input').length === 0) {\n                        $inputs = $module.add($inputs);\n                        $module.attr('tabindex', -1);\n                    } else {\n                        $module.removeAttr('tabindex');\n                    }\n                    $inputs.first()\n                        .on('keydown' + elementEventNamespace, module.event.inputKeyDown.first)\n                    ;\n                    $inputs.last()\n                        .on('keydown' + elementEventNamespace, module.event.inputKeyDown.last)\n                    ;\n                    if (!ignoreAutofocus && settings.autofocus && $inputs.filter(':focus').length === 0) {\n                        module.set.autofocus();\n                    }\n                },\n\n                attachEvents: function (selector, event) {\n                    var\n                        $toggle = $(selector)\n                    ;\n                    event = isFunction(module[event])\n                        ? module[event]\n                        : module.toggle;\n                    if ($toggle.length > 0) {\n                        module.debug('Attaching modal events to element', selector, event);\n                        $toggle\n                            .off(eventNamespace)\n                            .on('click' + eventNamespace, event)\n                        ;\n                    } else {\n                        module.error(error.notFound, selector);\n                    }\n                },\n\n                bind: {\n                    events: function () {\n                        module.verbose('Attaching events');\n                        $module\n                            .on('click' + eventNamespace, selector.close, module.event.close)\n                            .on('click' + eventNamespace, selector.approve, module.event.approve)\n                            .on('click' + eventNamespace, selector.deny, module.event.deny)\n                        ;\n                        $closeIcon\n                            .on('keyup' + elementEventNamespace, module.event.closeKeyUp)\n                        ;\n                        $window\n                            .on('resize' + elementEventNamespace, module.event.resize)\n                            .on('focus' + elementEventNamespace, module.event.focus)\n                        ;\n                        $context\n                            .on('click' + elementEventNamespace, module.event.click)\n                        ;\n                    },\n                    scrollLock: function () {\n                        // touch events default to passive, due to changes in chrome to optimize mobile perf\n                        $dimmable[0].addEventListener('touchmove', module.event.preventScroll, { passive: false });\n                    },\n                },\n\n                unbind: {\n                    scrollLock: function () {\n                        $dimmable[0].removeEventListener('touchmove', module.event.preventScroll, { passive: false });\n                    },\n                },\n\n                get: {\n                    id: function () {\n                        return id;\n                    },\n                    element: function () {\n                        return $module;\n                    },\n                    settings: function () {\n                        return settings;\n                    },\n                },\n\n                event: {\n                    approve: function () {\n                        if (ignoreRepeatedEvents || settings.onApprove.call(element, $(this)) === false) {\n                            module.verbose('Approve callback returned false cancelling hide');\n\n                            return;\n                        }\n                        ignoreRepeatedEvents = true;\n                        module.hide(function () {\n                            ignoreRepeatedEvents = false;\n                        });\n                    },\n                    preventScroll: function (event) {\n                        if (event.target.className.indexOf('dimmer') !== -1) {\n                            event.preventDefault();\n                        }\n                    },\n                    deny: function () {\n                        if (ignoreRepeatedEvents || settings.onDeny.call(element, $(this)) === false) {\n                            module.verbose('Deny callback returned false cancelling hide');\n\n                            return;\n                        }\n                        ignoreRepeatedEvents = true;\n                        module.hide(function () {\n                            ignoreRepeatedEvents = false;\n                        });\n                    },\n                    close: function () {\n                        module.hide();\n                    },\n                    closeKeyUp: function (event) {\n                        var\n                            keyCode   = event.which\n                        ;\n                        if ((keyCode === settings.keys.enter || keyCode === settings.keys.space) && $module.hasClass(className.front)) {\n                            module.hide();\n                        }\n                    },\n                    inputKeyDown: {\n                        first: function (event) {\n                            var\n                                keyCode = event.which\n                            ;\n                            if (keyCode === settings.keys.tab && event.shiftKey) {\n                                $inputs.last().trigger('focus');\n                                event.preventDefault();\n                            }\n                        },\n                        last: function (event) {\n                            var\n                                keyCode = event.which\n                            ;\n                            if (keyCode === settings.keys.tab && !event.shiftKey) {\n                                $inputs.first().trigger('focus');\n                                event.preventDefault();\n                            }\n                        },\n                    },\n                    mousedown: function (event) {\n                        var\n                            $target   = $(event.target),\n                            isRtl = module.is.rtl()\n                        ;\n                        initialMouseDownInModal = $target.closest(selector.modal).length > 0;\n                        if (initialMouseDownInModal) {\n                            module.verbose('Mouse down event registered inside the modal');\n                        }\n                        initialMouseDownInScrollbar = module.is.scrolling() && ((!isRtl && $window.outerWidth() - settings.scrollbarWidth <= event.clientX) || (isRtl && settings.scrollbarWidth >= event.clientX));\n                        if (initialMouseDownInScrollbar) {\n                            module.verbose('Mouse down event registered inside the scrollbar');\n                        }\n                    },\n                    mouseup: function (event) {\n                        if (!settings.closable) {\n                            module.verbose('Dimmer clicked but closable setting is disabled');\n\n                            return;\n                        }\n                        if (initialMouseDownInModal) {\n                            module.debug('Dimmer clicked but mouse down was initially registered inside the modal');\n\n                            return;\n                        }\n                        if (initialMouseDownInScrollbar) {\n                            module.debug('Dimmer clicked but mouse down was initially registered inside the scrollbar');\n\n                            return;\n                        }\n                        var\n                            $target   = $(event.target),\n                            isInModal = $target.closest(selector.modal).length > 0,\n                            isInDOM   = $.contains(document.documentElement, event.target)\n                        ;\n                        if (!isInModal && isInDOM && module.is.active() && $module.hasClass(className.front)) {\n                            module.debug('Dimmer clicked, hiding all modals');\n                            if (settings.allowMultiple) {\n                                if (!module.hideAll()) {\n                                    return;\n                                }\n                            } else if (!module.hide()) {\n                                return;\n                            }\n                            module.remove.clickaway();\n                        }\n                    },\n                    debounce: function (method, delay) {\n                        clearTimeout(module.timer);\n                        module.timer = setTimeout(function () {\n                            method();\n                        }, delay);\n                    },\n                    keyboard: function (event) {\n                        var\n                            keyCode   = event.which\n                        ;\n                        if (keyCode === settings.keys.escape) {\n                            if (settings.closable) {\n                                module.debug('Escape key pressed hiding modal');\n                                if ($module.hasClass(className.front)) {\n                                    module.hide();\n                                }\n                            } else {\n                                module.debug('Escape key pressed, but closable is set to false');\n                            }\n                            event.preventDefault();\n                        }\n                    },\n                    resize: function () {\n                        if ($dimmable.dimmer('is active') && (module.is.animating() || module.is.active())) {\n                            requestAnimationFrame(module.refresh);\n                        }\n                    },\n                    focus: function () {\n                        windowRefocused = true;\n                    },\n                    click: function (event) {\n                        if (windowRefocused && document.activeElement !== event.target && $dimmable.dimmer('is active') && module.is.active() && settings.autofocus && $(document.activeElement).closest(selector.modal).length === 0) {\n                            requestAnimationFrame(module.set.autofocus);\n                        }\n                        windowRefocused = false;\n                    },\n                },\n\n                toggle: function () {\n                    if (module.is.active() || module.is.animating()) {\n                        module.hide();\n                    } else {\n                        module.show();\n                    }\n                },\n\n                show: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    module.refreshModals();\n                    module.set.dimmerSettings();\n                    module.set.dimmerStyles();\n\n                    module.showModal(callback);\n                },\n\n                hide: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    module.refreshModals();\n\n                    return module.hideModal(callback);\n                },\n\n                showModal: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if (module.is.animating() || !module.is.active()) {\n                        if (settings.onShow.call(element) === false) {\n                            module.verbose('Show callback returned false cancelling show');\n\n                            return;\n                        }\n                        hadScrollbar = module.has.scrollbar();\n                        module.showDimmer();\n                        module.cacheSizes();\n                        if (hadScrollbar) {\n                            module.set.bodyMargin();\n                        }\n                        if (module.can.useFlex()) {\n                            module.remove.legacy();\n                        } else {\n                            module.set.legacy();\n                            module.set.modalOffset();\n                            module.debug('Using non-flex legacy modal positioning.');\n                        }\n                        module.set.screenHeight();\n                        module.set.type();\n                        module.set.clickaway();\n\n                        if (!settings.allowMultiple && module.others.active()) {\n                            module.hideOthers(module.showModal);\n                        } else {\n                            ignoreRepeatedEvents = false;\n                            if (settings.allowMultiple) {\n                                if (module.others.active()) {\n                                    $otherModals.filter('.' + className.active).find(selector.dimmer).removeClass('out').addClass('transition fade in active');\n                                }\n\n                                if (settings.detachable) {\n                                    $module.detach().appendTo($dimmer);\n                                }\n                            }\n                            if (settings.transition && $.fn.transition !== undefined) {\n                                module.debug('Showing modal with css animations');\n                                module.set.observeAttributes(false);\n                                $module\n                                    .transition({\n                                        debug: settings.debug,\n                                        verbose: settings.verbose,\n                                        silent: settings.silent,\n                                        animation: (settings.transition.showMethod || settings.transition) + ' in',\n                                        queue: settings.queue,\n                                        duration: settings.transition.showDuration || settings.duration,\n                                        useFailSafe: true,\n                                        onComplete: function () {\n                                            settings.onVisible.apply(element);\n                                            if (settings.keyboardShortcuts) {\n                                                module.add.keyboardShortcuts();\n                                            }\n                                            module.save.focus();\n                                            module.set.active();\n                                            module.refreshInputs();\n                                            requestAnimationFrame(module.set.observeAttributes);\n                                            callback();\n                                        },\n                                    })\n                                ;\n                            } else {\n                                module.error(error.noTransition);\n                            }\n                        }\n                    } else {\n                        module.debug('Modal is already visible');\n                    }\n                },\n\n                hideModal: function (callback, keepDimmed, hideOthersToo) {\n                    var\n                        $previousModal = $otherModals.filter('.' + className.active).last()\n                    ;\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if (settings.onHide.call(element, $(this)) === false) {\n                        module.verbose('Hide callback returned false cancelling hide');\n                        ignoreRepeatedEvents = false;\n\n                        return false;\n                    }\n\n                    if (module.is.animating() || module.is.active()) {\n                        module.debug('Hiding modal');\n                        if (settings.transition && $.fn.transition !== undefined) {\n                            module.remove.active();\n                            module.set.observeAttributes(false);\n                            $module\n                                .transition({\n                                    debug: settings.debug,\n                                    verbose: settings.verbose,\n                                    silent: settings.silent,\n                                    animation: (settings.transition.hideMethod || settings.transition) + ' out',\n                                    queue: settings.queue,\n                                    duration: settings.transition.hideDuration || settings.duration,\n                                    useFailSafe: true,\n                                    onStart: function () {\n                                        if (!module.others.active() && !module.others.animating() && !keepDimmed) {\n                                            module.hideDimmer();\n                                        } else if (settings.allowMultiple) {\n                                            (hideOthersToo ? $allModals : $previousModal).find(selector.dimmer).removeClass('in').addClass('out');\n                                        }\n                                        if (settings.keyboardShortcuts && !module.others.active()) {\n                                            module.remove.keyboardShortcuts();\n                                        }\n                                    },\n                                    onComplete: function () {\n                                        module.unbind.scrollLock();\n                                        module.remove.active();\n                                        if (settings.allowMultiple) {\n                                            $previousModal.addClass(className.front);\n                                            $module.removeClass(className.front);\n\n                                            (hideOthersToo ? $allModals : $previousModal).find(selector.dimmer).removeClass('active');\n                                        }\n                                        if (isFunction(settings.onHidden)) {\n                                            settings.onHidden.call(element);\n                                        }\n                                        module.remove.dimmerStyles();\n                                        module.restore.focus();\n                                        callback();\n                                    },\n                                })\n                            ;\n                        } else {\n                            module.error(error.noTransition);\n                        }\n                    }\n                },\n\n                showDimmer: function () {\n                    if ($dimmable.dimmer('is animating') || !$dimmable.dimmer('is active')) {\n                        if (hadScrollbar) {\n                            if (!isBody) {\n                                $dimmer.css('top', $dimmable.scrollTop());\n                            }\n                            module.save.bodyMargin();\n                        }\n                        module.debug('Showing dimmer');\n                        $dimmable.dimmer('show');\n                    } else {\n                        module.debug('Dimmer already visible');\n                    }\n                },\n\n                hideDimmer: function () {\n                    if ($dimmable.dimmer('is animating') || $dimmable.dimmer('is active')) {\n                        module.unbind.scrollLock();\n                        $dimmable.dimmer('hide', function () {\n                            if (hadScrollbar) {\n                                module.restore.bodyMargin();\n                            }\n                            module.remove.clickaway();\n                            module.remove.screenHeight();\n                        });\n                    } else {\n                        module.debug('Dimmer is not visible cannot hide');\n                    }\n                },\n\n                hideAll: function (callback) {\n                    var\n                        $visibleModals = $allModals.filter('.' + className.active + ', .' + className.animating)\n                    ;\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if ($visibleModals.length > 0) {\n                        module.debug('Hiding all visible modals');\n                        var hideOk = true;\n                        // check in reverse order trying to hide most top displayed modal first\n                        $($visibleModals.get().reverse()).each(function (index, element) {\n                            if (hideOk) {\n                                hideOk = $(element).modal('hide modal', callback, false, true);\n                            }\n                        });\n                        if (hideOk) {\n                            module.hideDimmer();\n                        }\n\n                        return hideOk;\n                    }\n                },\n\n                hideOthers: function (callback) {\n                    var\n                        $visibleModals = $otherModals.filter('.' + className.active + ', .' + className.animating)\n                    ;\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if ($visibleModals.length > 0) {\n                        module.debug('Hiding other modals', $otherModals);\n                        $visibleModals\n                            .modal('hide modal', callback, true)\n                        ;\n                    }\n                },\n\n                others: {\n                    active: function () {\n                        return $otherModals.filter('.' + className.active).length > 0;\n                    },\n                    animating: function () {\n                        return $otherModals.filter('.' + className.animating).length > 0;\n                    },\n                },\n\n                add: {\n                    keyboardShortcuts: function () {\n                        module.verbose('Adding keyboard shortcuts');\n                        $document\n                            .on('keydown' + eventNamespace, module.event.keyboard)\n                        ;\n                    },\n                },\n\n                save: {\n                    focus: function () {\n                        var\n                            $activeElement = $(document.activeElement),\n                            inCurrentModal = $activeElement.closest($module).length > 0\n                        ;\n                        if (!inCurrentModal) {\n                            $focusedElement = $(document.activeElement).trigger('blur');\n                        }\n                    },\n                    bodyMargin: function () {\n                        initialBodyMargin = $context.css((isBody ? 'margin-' : 'padding-') + (module.can.leftBodyScrollbar() ? 'left' : 'right'));\n                        var\n                            bodyMarginRightPixel = parseInt(initialBodyMargin.replace(/[^\\d.]/g, ''), 10),\n                            bodyScrollbarWidth = isBody ? window.innerWidth - document.documentElement.clientWidth : $context[0].offsetWidth - $context[0].clientWidth\n                        ;\n                        tempBodyMargin = bodyMarginRightPixel + bodyScrollbarWidth;\n                    },\n                },\n\n                restore: {\n                    focus: function () {\n                        if ($focusedElement && $focusedElement.length > 0 && settings.restoreFocus) {\n                            $focusedElement.trigger('focus');\n                        }\n                    },\n                    bodyMargin: function () {\n                        var position = module.can.leftBodyScrollbar() ? 'left' : 'right';\n                        $context.css((isBody ? 'margin-' : 'padding-') + position, initialBodyMargin);\n                        $context.find(selector.bodyFixed.replace('right', position)).each(function () {\n                            var\n                                el = $(this),\n                                attribute = el.css('position') === 'fixed' ? 'padding-' + position : position\n                            ;\n                            el.css(attribute, '');\n                        });\n                    },\n                },\n\n                remove: {\n                    active: function () {\n                        $module.removeClass(className.active);\n                    },\n                    legacy: function () {\n                        $module.removeClass(className.legacy);\n                    },\n                    clickaway: function () {\n                        if (!settings.detachable) {\n                            $module\n                                .off('mousedown' + elementEventNamespace)\n                            ;\n                        }\n                        $dimmer\n                            .off('mousedown' + elementEventNamespace)\n                        ;\n                        $dimmer\n                            .off('mouseup' + elementEventNamespace)\n                        ;\n                    },\n                    dimmerStyles: function () {\n                        $dimmer.removeClass(className.inverted);\n                        $dimmable.removeClass(className.blurring);\n                    },\n                    bodyStyle: function () {\n                        if ($context.attr('style') === '') {\n                            module.verbose('Removing style attribute');\n                            $context.removeAttr('style');\n                        }\n                    },\n                    screenHeight: function () {\n                        module.debug('Removing page height');\n                        $context\n                            .css('height', '')\n                        ;\n                        module.remove.bodyStyle();\n                    },\n                    keyboardShortcuts: function () {\n                        module.verbose('Removing keyboard shortcuts');\n                        $document\n                            .off('keydown' + eventNamespace)\n                        ;\n                    },\n                    scrolling: function () {\n                        if (!keepScrollingClass) {\n                            $dimmable.removeClass(className.scrolling);\n                        }\n                        $module.removeClass(className.scrolling);\n                    },\n                },\n\n                cacheSizes: function () {\n                    $module.addClass(className.loading);\n                    var\n                        scrollHeight = $module.prop('scrollHeight'),\n                        modalWidth   = $module.outerWidth(),\n                        modalHeight  = $module.outerHeight()\n                    ;\n                    if (module.cache.pageHeight === undefined || modalHeight !== 0) {\n                        $.extend(module.cache, {\n                            pageHeight: $document.outerHeight(),\n                            width: modalWidth,\n                            height: modalHeight + settings.offset,\n                            scrollHeight: scrollHeight + settings.offset,\n                            contextHeight: isBody\n                                ? $window.height()\n                                : $dimmable.height(),\n                        });\n                        module.cache.topOffset = -(module.cache.height / 2);\n                    }\n                    $module.removeClass(className.loading);\n                    module.debug('Caching modal and container sizes', module.cache);\n                },\n                helpers: {\n                    deQuote: function (string) {\n                        return String(string).replace(/\"/g, '');\n                    },\n                    escape: function (string, preserveHTML) {\n                        if (preserveHTML) {\n                            return string;\n                        }\n                        var\n                            badChars     = /[\"'<>`]/g,\n                            shouldEscape = /[\"&'<>`]/,\n                            escape       = {\n                                '<': '&lt;',\n                                '>': '&gt;',\n                                '\"': '&quot;',\n                                \"'\": '&#x27;',\n                                '`': '&#x60;',\n                            },\n                            escapedChar  = function (chr) {\n                                return escape[chr];\n                            }\n                        ;\n                        if (shouldEscape.test(string)) {\n                            string = string.replace(/&(?![\\d#a-z]{1,12};)/gi, '&amp;');\n\n                            return string.replace(badChars, escapedChar);\n                        }\n\n                        return string;\n                    },\n                },\n                can: {\n                    leftBodyScrollbar: function () {\n                        if (module.cache.leftBodyScrollbar === undefined) {\n                            module.cache.leftBodyScrollbar = module.is.rtl() && ((module.is.iframe && !module.is.firefox()) || module.is.safari() || module.is.edge() || module.is.ie());\n                        }\n\n                        return module.cache.leftBodyScrollbar;\n                    },\n                    useFlex: function () {\n                        if (settings.useFlex === 'auto') {\n                            return settings.detachable && !module.is.ie();\n                        }\n                        if (settings.useFlex && module.is.ie()) {\n                            module.debug('useFlex true is not supported in IE');\n                        } else if (settings.useFlex && !settings.detachable) {\n                            module.debug('useFlex true in combination with detachable false is not supported');\n                        }\n\n                        return settings.useFlex;\n                    },\n                    fit: function () {\n                        var\n                            contextHeight  = module.cache.contextHeight,\n                            verticalCenter = module.cache.contextHeight / 2,\n                            topOffset      = module.cache.topOffset,\n                            scrollHeight   = module.cache.scrollHeight,\n                            height         = module.cache.height,\n                            paddingHeight  = settings.padding,\n                            startPosition  = verticalCenter + topOffset\n                        ;\n\n                        return scrollHeight > height\n                            ? startPosition + scrollHeight + paddingHeight < contextHeight\n                            : height + (paddingHeight * 2) < contextHeight;\n                    },\n                },\n                has: {\n                    configActions: function () {\n                        return Array.isArray(settings.actions) && settings.actions.length > 0;\n                    },\n                    scrollbar: function () {\n                        return isBody || $context.css('overflow-y') !== 'hidden';\n                    },\n                },\n                is: {\n                    active: function () {\n                        return $module.hasClass(className.active);\n                    },\n                    ie: function () {\n                        if (module.cache.isIE === undefined) {\n                            var\n                                isIE11 = !window.ActiveXObject && 'ActiveXObject' in window,\n                                isIE = 'ActiveXObject' in window\n                            ;\n                            module.cache.isIE = isIE11 || isIE;\n                        }\n\n                        return module.cache.isIE;\n                    },\n                    animating: function () {\n                        return $module.transition('is animating');\n                    },\n                    scrolling: function () {\n                        return $dimmable.hasClass(className.scrolling);\n                    },\n                    modernBrowser: function () {\n                        // appName for IE11 reports 'Netscape' can no longer use\n                        return !(window.ActiveXObject || 'ActiveXObject' in window);\n                    },\n                    rtl: function () {\n                        if (module.cache.isRTL === undefined) {\n                            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';\n                        }\n\n                        return module.cache.isRTL;\n                    },\n                    safari: function () {\n                        if (module.cache.isSafari === undefined) {\n                            module.cache.isSafari = /constructor/i.test(window.HTMLElement) || !!window.ApplePaySession;\n                        }\n\n                        return module.cache.isSafari;\n                    },\n                    edge: function () {\n                        if (module.cache.isEdge === undefined) {\n                            module.cache.isEdge = !!window.setImmediate && !module.is.ie();\n                        }\n\n                        return module.cache.isEdge;\n                    },\n                    firefox: function () {\n                        if (module.cache.isFirefox === undefined) {\n                            module.cache.isFirefox = !!window.InstallTrigger;\n                        }\n\n                        return module.cache.isFirefox;\n                    },\n                    iframe: function () {\n                        return !(self === top);\n                    },\n                },\n\n                set: {\n                    observeAttributes: function (state) {\n                        observeAttributes = state !== false;\n                    },\n                    autofocus: function () {\n                        var\n                            $autofocus = $inputs.filter('[autofocus]'),\n                            $rawInputs = $inputs.filter(':input'),\n                            $input     = ($autofocus.length > 0\n                                ? $autofocus\n                                : ($rawInputs.length > 0\n                                    ? $rawInputs\n                                    : $module)\n                            ).first()\n                        ;\n                        $input.trigger('focus');\n                    },\n                    bodyMargin: function () {\n                        var position = module.can.leftBodyScrollbar() ? 'left' : 'right';\n                        if (settings.detachable || module.can.fit()) {\n                            $context.css((isBody ? 'margin-' : 'padding-') + position, tempBodyMargin + 'px');\n                        }\n                        $context.find(selector.bodyFixed.replace('right', position)).each(function () {\n                            var\n                                el = $(this),\n                                attribute = el.css('position') === 'fixed' ? 'padding-' + position : position\n                            ;\n                            el.css(attribute, 'calc(' + el.css(attribute) + ' + ' + tempBodyMargin + 'px)');\n                        });\n                    },\n                    clickaway: function () {\n                        if (!settings.detachable) {\n                            $module\n                                .on('mousedown' + elementEventNamespace, module.event.mousedown)\n                            ;\n                        }\n                        $dimmer\n                            .on('mousedown' + elementEventNamespace, module.event.mousedown)\n                        ;\n                        $dimmer\n                            .on('mouseup' + elementEventNamespace, module.event.mouseup)\n                        ;\n                    },\n                    dimmerSettings: function () {\n                        if ($.fn.dimmer === undefined) {\n                            module.error(error.dimmer);\n\n                            return;\n                        }\n                        var\n                            defaultSettings = {\n                                debug: settings.debug,\n                                dimmerName: 'modals',\n                                closable: 'auto',\n                                useFlex: module.can.useFlex(),\n                                duration: {\n                                    show: settings.transition.showDuration || settings.duration,\n                                    hide: settings.transition.hideDuration || settings.duration,\n                                },\n                            },\n                            dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)\n                        ;\n                        if (settings.inverted) {\n                            dimmerSettings.variation = dimmerSettings.variation !== undefined\n                                ? dimmerSettings.variation + ' inverted'\n                                : 'inverted';\n                        }\n                        $context.dimmer('setting', dimmerSettings);\n                    },\n                    dimmerStyles: function () {\n                        if (settings.inverted) {\n                            $dimmer.addClass(className.inverted);\n                        } else {\n                            $dimmer.removeClass(className.inverted);\n                        }\n                        if (settings.blurring) {\n                            $dimmable.addClass(className.blurring);\n                        } else {\n                            $dimmable.removeClass(className.blurring);\n                        }\n                    },\n                    modalOffset: function () {\n                        if (!settings.detachable) {\n                            var canFit = module.can.fit();\n                            $module\n                                .css({\n                                    top: !$module.hasClass('aligned') && canFit\n                                        ? $document.scrollTop() + (module.cache.contextHeight - module.cache.height) / 2\n                                        : (!canFit || $module.hasClass('top')\n                                            ? $document.scrollTop() + settings.padding\n                                            : $document.scrollTop() + (module.cache.contextHeight - module.cache.height - settings.padding)),\n                                    marginLeft: -(module.cache.width / 2),\n                                })\n                            ;\n                        } else {\n                            $module\n                                .css({\n                                    marginTop: !$module.hasClass('aligned') && module.can.fit()\n                                        ? -(module.cache.height / 2)\n                                        : settings.padding / 2,\n                                    marginLeft: -(module.cache.width / 2),\n                                })\n                            ;\n                        }\n                        module.verbose('Setting modal offset for legacy mode');\n                    },\n                    screenHeight: function () {\n                        if (module.can.fit()) {\n                            $context.css('height', '');\n                        } else if (!$module.hasClass('bottom')) {\n                            module.debug('Modal is taller than page content, resizing page height');\n                            $context\n                                .css('height', module.cache.height + (settings.padding * 2) + 'px')\n                            ;\n                        }\n                    },\n                    active: function () {\n                        $module.addClass(className.active + ' ' + className.front);\n                        $otherModals.filter('.' + className.active).removeClass(className.front);\n                    },\n                    scrolling: function () {\n                        $dimmable.addClass(className.scrolling);\n                        $module.addClass(className.scrolling);\n                        module.unbind.scrollLock();\n                    },\n                    legacy: function () {\n                        $module.addClass(className.legacy);\n                    },\n                    type: function () {\n                        if (module.can.fit()) {\n                            module.verbose('Modal fits on screen');\n                            if (!module.others.active() && !module.others.animating()) {\n                                module.remove.scrolling();\n                                module.bind.scrollLock();\n                            }\n                        } else if (!$module.hasClass('bottom')) {\n                            module.verbose('Modal cannot fit on screen setting to scrolling');\n                            module.set.scrolling();\n                        } else {\n                            module.verbose('Bottom aligned modal not fitting on screen is unsupported for scrolling');\n                        }\n                    },\n                    undetached: function () {\n                        $dimmable.addClass(className.undetached);\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    if (isFunction(settings.templates[query])) {\n                        settings.autoShow = true;\n                        settings.className.modal = settings.className.template;\n                        settings = $.extend(true, {}, settings, settings.templates[query].apply(module, queryArguments));\n\n                        // reassign shortcuts\n                        className = settings.className;\n                        namespace = settings.namespace;\n                        fields = settings.fields;\n                        error = settings.error;\n                    }\n                    module.initialize();\n                }\n                if (!isFunction(settings.templates[query])) {\n                    module.invoke(query);\n                }\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n                returnedValue = $module;\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n    $.modal = $.fn.modal;\n\n    $.fn.modal.settings = {\n\n        name: 'Modal',\n        namespace: 'modal',\n\n        useFlex: 'auto',\n        offset: 0,\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        observeChanges: false,\n\n        allowMultiple: false,\n        detachable: true,\n        closable: true,\n        autofocus: true,\n        restoreFocus: true,\n        autoShow: false,\n\n        inverted: false,\n        blurring: false,\n\n        centered: true,\n\n        dimmerSettings: {\n            closable: false,\n            useCSS: true,\n        },\n\n        // whether to use keyboard shortcuts\n        keyboardShortcuts: true,\n\n        context: 'body',\n\n        queue: false,\n        duration: 500,\n        transition: 'scale',\n\n        // padding with edge of page\n        padding: 50,\n        scrollbarWidth: 10,\n\n        // dynamic content\n        title: '',\n        content: '',\n        class: '',\n        classTitle: '',\n        classContent: '',\n        classActions: '',\n        closeIcon: false,\n        actions: false,\n        preserveHTML: true,\n\n        fields: {\n            class: 'class',\n            text: 'text',\n            icon: 'icon',\n            click: 'click',\n        },\n\n        // called before show animation\n        onShow: function () {},\n\n        // called after show animation\n        onVisible: function () {},\n\n        // called before hide animation\n        onHide: function () {\n            return true;\n        },\n\n        // called after hide animation\n        onHidden: false,\n\n        // called after approve selector match\n        onApprove: function () {\n            return true;\n        },\n\n        // called after deny selector match\n        onDeny: function () {\n            return true;\n        },\n\n        keys: {\n            space: 32,\n            enter: 13,\n            escape: 27,\n            tab: 9,\n        },\n\n        selector: {\n            title: '> .header',\n            content: '> .content',\n            actions: '> .actions',\n            close: '> .close',\n            closeIcon: '> .close',\n            approve: '.actions .positive, .actions .approve, .actions .ok',\n            deny: '.actions .negative, .actions .deny, .actions .cancel',\n            modal: '.ui.modal',\n            dimmer: '> .ui.dimmer',\n            bodyFixed: '> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.fixed.nag, > .ui.fixed.nag > .close',\n            prompt: '.ui.input > input',\n        },\n        error: {\n            dimmer: 'UI Dimmer, a required component is not included in this page',\n            method: 'The method you called is not defined.',\n            notFound: 'The element you specified could not be found',\n        },\n        className: {\n            active: 'active',\n            animating: 'animating',\n            blurring: 'blurring',\n            inverted: 'inverted',\n            legacy: 'legacy',\n            loading: 'loading',\n            scrolling: 'scrolling',\n            undetached: 'undetached',\n            front: 'front',\n            close: 'close icon',\n            button: 'ui button',\n            modal: 'ui modal',\n            title: 'header',\n            content: 'content',\n            actions: 'actions',\n            template: 'ui tiny modal',\n            ok: 'positive',\n            cancel: 'negative',\n            prompt: 'ui fluid input',\n            innerDimmer: 'ui inverted dimmer',\n        },\n        text: {\n            ok: 'Ok',\n            cancel: 'Cancel',\n            close: 'Close',\n        },\n    };\n\n    $.fn.modal.settings.templates = {\n        getArguments: function (args) {\n            var queryArguments = [].slice.call(args);\n            if ($.isPlainObject(queryArguments[0])) {\n                return $.extend({\n                    handler: function () {},\n                    content: '',\n                    title: '',\n                }, queryArguments[0]);\n            }\n            if (!isFunction(queryArguments[queryArguments.length - 1])) {\n                queryArguments.push(function () {});\n            }\n\n            return {\n                handler: queryArguments.pop(),\n                content: queryArguments.pop() || '',\n                title: queryArguments.pop() || '',\n            };\n        },\n        alert: function () {\n            var\n                settings = this.get.settings(),\n                args     = settings.templates.getArguments(arguments),\n                approveFn = args.handler\n            ;\n\n            return {\n                title: args.title,\n                content: args.content,\n                onApprove: approveFn,\n                actions: [{\n                    text: settings.text.ok,\n                    class: settings.className.ok,\n                    click: approveFn,\n                }],\n            };\n        },\n        confirm: function () {\n            var\n                settings = this.get.settings(),\n                args     = settings.templates.getArguments(arguments),\n                approveFn = function () {\n                    args.handler(true);\n                },\n                denyFn = function () {\n                    args.handler(false);\n                }\n            ;\n\n            return {\n                title: args.title,\n                content: args.content,\n                onApprove: approveFn,\n                onDeny: denyFn,\n                actions: [{\n                    text: settings.text.ok,\n                    class: settings.className.ok,\n                    click: approveFn,\n                }, {\n                    text: settings.text.cancel,\n                    class: settings.className.cancel,\n                    click: denyFn,\n                }],\n            };\n        },\n        prompt: function () {\n            var\n                $this    = this,\n                settings = this.get.settings(),\n                args     = settings.templates.getArguments(arguments),\n                input    = $($.parseHTML(args.content)).filter('.ui.input'),\n                approveFn = function () {\n                    var\n                        settings = $this.get.settings(),\n                        inputField = $this.get.element().find(settings.selector.prompt)[0]\n                    ;\n                    args.handler($(inputField).val());\n                },\n                denyFn = function () {\n                    args.handler(null);\n                }\n            ;\n            if (input.length === 0) {\n                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>';\n            }\n\n            return {\n                title: args.title,\n                content: args.content,\n                onApprove: approveFn,\n                onDeny: denyFn,\n                actions: [{\n                    text: settings.text.ok,\n                    class: settings.className.ok,\n                    click: approveFn,\n                }, {\n                    text: settings.text.cancel,\n                    class: settings.className.cancel,\n                    click: denyFn,\n                }],\n            };\n        },\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/nag.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Nag\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Nag\n*******************************/\n\n.ui.nag {\n  display: none;\n  opacity: 0.95;\n  position: relative;\n  top: 0;\n  left: 0;\n  z-index: 999;\n  min-height: 0;\n  width: 100%;\n  margin: 0;\n  padding: 0.75em 1em;\n  background: #909090;\n  box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2);\n  font-size: 1rem;\n  text-align: center;\n  color: rgba(0, 0, 0, 0.87);\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n  transition: 0.2s background ease;\n}\na.ui.nag {\n  cursor: pointer;\n}\n.ui.nag > .title {\n  display: inline-block;\n  margin: 0 0.5em;\n  color: #fff;\n}\n.ui.nag > .close.icon {\n  cursor: pointer;\n  opacity: 0.4;\n  position: absolute;\n  top: 50%;\n  right: 1em;\n  font-size: 1em;\n  margin: -0.5em 0 0;\n  color: #fff;\n  transition: opacity 0.2s ease;\n}\n.ui.nag:not(.overlay):not(.fixed) {\n  border-radius: 0.28571429rem;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n\n/* Hover */\n.ui.nag:hover {\n  background: #909090;\n  opacity: 1;\n}\n.ui.nag > .close:hover {\n  opacity: 1;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n         Static\n    --------------- */\n.ui.overlay.nags,\n.ui.overlay.nag {\n  position: absolute;\n}\n\n/* --------------\n         Fixed\n    --------------- */\n.ui.fixed.nags,\n.ui.fixed.nag {\n  position: fixed;\n}\n\n/* --------------\n         Bottom\n    --------------- */\n.ui.bottom.nags,\n.ui.bottom.nag {\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n  top: auto;\n  bottom: 0;\n}\n\n/* --------------\n         Inverted\n    --------------- */\n.ui.inverted.nags .nag,\n.ui.inverted.nag {\n  background-color: #f3f4f5;\n  color: rgba(0, 0, 0, 0.85);\n}\n.ui.inverted.nags .nag > .close,\n.ui.inverted.nag > .close {\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.inverted.nags .nag > .title,\n.ui.inverted.nag > .title {\n  color: rgba(0, 0, 0, 0.6);\n}\n\n/* -------------------\n            Sizes\n    -------------------- */\n.ui.mini.nag,\n.ui.mini.nags .nag {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.nag,\n.ui.tiny.nags .nag {\n  font-size: 0.85714286rem;\n}\n.ui.small.nag,\n.ui.small.nags .nag {\n  font-size: 0.92857143rem;\n}\n.ui.large.nag,\n.ui.large.nags .nag {\n  font-size: 1.14285714rem;\n}\n.ui.big.nag,\n.ui.big.nags .nag {\n  font-size: 1.28571429rem;\n}\n.ui.huge.nag,\n.ui.huge.nags .nag {\n  font-size: 1.42857143rem;\n  line-height: 1;\n}\n.ui.massive.nag,\n.ui.massive.nags .nag {\n  font-size: 1.71428571rem;\n  line-height: 1;\n}\n\n/* --------------\n     Colors\n-------------- */\n.ui.primary.nag {\n  background-color: #2185d0;\n}\n.ui.inverted.primary.nag {\n  background-color: #54c8ff;\n}\n.ui.secondary.nag {\n  background-color: #1b1c1d;\n}\n.ui.inverted.secondary.nag {\n  background-color: #545454;\n}\n.ui.red.nag {\n  background-color: #db2828;\n}\n.ui.inverted.red.nag {\n  background-color: #ff695e;\n}\n.ui.orange.nag {\n  background-color: #f2711c;\n}\n.ui.inverted.orange.nag {\n  background-color: #ff851b;\n}\n.ui.yellow.nag {\n  background-color: #fbbd08;\n}\n.ui.inverted.yellow.nag {\n  background-color: #ffe21f;\n}\n.ui.olive.nag {\n  background-color: #b5cc18;\n}\n.ui.inverted.olive.nag {\n  background-color: #d9e778;\n}\n.ui.green.nag {\n  background-color: #21ba45;\n}\n.ui.inverted.green.nag {\n  background-color: #2ecc40;\n}\n.ui.teal.nag {\n  background-color: #00b5ad;\n}\n.ui.inverted.teal.nag {\n  background-color: #6dffff;\n}\n.ui.blue.nag {\n  background-color: #2185d0;\n}\n.ui.inverted.blue.nag {\n  background-color: #54c8ff;\n}\n.ui.violet.nag {\n  background-color: #6435c9;\n}\n.ui.inverted.violet.nag {\n  background-color: #a291fb;\n}\n.ui.purple.nag {\n  background-color: #a333c8;\n}\n.ui.inverted.purple.nag {\n  background-color: #dc73ff;\n}\n.ui.pink.nag {\n  background-color: #e03997;\n}\n.ui.inverted.pink.nag {\n  background-color: #ff8edf;\n}\n.ui.brown.nag {\n  background-color: #a5673f;\n}\n.ui.inverted.brown.nag {\n  background-color: #d67c1c;\n}\n.ui.grey.nag {\n  background-color: #767676;\n}\n.ui.inverted.grey.nag {\n  background-color: #dcddde;\n}\n.ui.black.nag {\n  background-color: #1b1c1d;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.black.nag {\n  background-color: #545454;\n}\n.ui.inverted.black.nag .title {\n  color: #fff;\n}\n\n\n/*******************************\n               Groups\n    *******************************/\n\n.ui.nags {\n  top: 0;\n  left: 0;\n  width: 100%;\n}\n.ui.ui.nags .nag {\n  border-radius: 0;\n}\n.ui.nags:not(.bottom) .nag:last-child {\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui.bottom.nags .nag:first-child {\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.nags:not(.fixed):not(.overlay) .nag:first-child {\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.nags:not(.fixed):not(.overlay) .nag:only-child {\n  border-radius: 0.28571429rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n        User Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/nag.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Nag\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.nag = function (parameters) {\n        var\n            $allModules    = $(this),\n            $body          = $('body'),\n\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n            contextCheck   = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $(context);\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : $body;\n                    }\n                }\n\n                return $context;\n            },\n            returnedValue\n        ;\n        $allModules.each(function () {\n            var\n                settings          = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.nag.settings, parameters)\n                    : $.extend({}, $.fn.nag.settings),\n\n                selector        = settings.selector,\n                error           = settings.error,\n                namespace       = settings.namespace,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = namespace + '-module',\n\n                $module         = $(this),\n\n                $context        = settings.context ? contextCheck(settings.context, window) : $body,\n\n                element         = this,\n                instance        = $module.data(moduleNamespace),\n                storage,\n                module\n            ;\n            module = {\n\n                initialize: function () {\n                    module.verbose('Initializing element');\n                    if (typeof settings.value !== 'string') {\n                        settings.value = JSON.stringify(settings.value);\n                    }\n                    storage = module.get.storage();\n                    $module\n                        .on('click' + eventNamespace, selector.close, module.dismiss)\n                        .data(moduleNamespace, module)\n                    ;\n\n                    if (settings.detachable && $module.parent()[0] !== $context[0]) {\n                        $module\n                            .detach()\n                            .prependTo($context)\n                        ;\n                    }\n\n                    if (settings.displayTime > 0) {\n                        setTimeout(function () {\n                            module.hide();\n                        }, settings.displayTime);\n                    }\n                    module.show();\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying instance');\n                    $module\n                        .removeData(moduleNamespace)\n                        .off(eventNamespace)\n                    ;\n                },\n\n                show: function () {\n                    if (module.should.show() && !$module.is(':visible')) {\n                        if (settings.onShow.call(element) === false) {\n                            module.debug('onShow callback returned false, cancelling nag animation');\n\n                            return false;\n                        }\n                        module.debug('Showing nag', settings.animation.show);\n                        if (settings.animation.show === 'fade') {\n                            $module\n                                .fadeIn(settings.duration, settings.easing, settings.onVisible)\n                            ;\n                        } else {\n                            $module\n                                .slideDown(settings.duration, settings.easing, settings.onVisible)\n                            ;\n                        }\n                    }\n                },\n\n                hide: function () {\n                    if (settings.onHide.call(element) === false) {\n                        module.debug('onHide callback returned false, cancelling nag animation');\n\n                        return false;\n                    }\n                    module.debug('Hiding nag', settings.animation.hide);\n                    if (settings.animation.hide === 'fade') {\n                        $module\n                            .fadeOut(settings.duration, settings.easing, settings.onHidden)\n                        ;\n                    } else {\n                        $module\n                            .slideUp(settings.duration, settings.easing, settings.onHidden)\n                        ;\n                    }\n                },\n\n                dismiss: function (event) {\n                    if (module.hide() !== false && settings.storageMethod) {\n                        module.debug('Dismissing nag', settings.storageMethod, settings.key, settings.value, settings.expires);\n                        module.storage.set(settings.key, settings.value);\n                    }\n                    if (event) {\n                        event.stopImmediatePropagation();\n                        event.preventDefault();\n                    }\n                },\n\n                should: {\n                    show: function () {\n                        if (settings.persist) {\n                            module.debug('Persistent nag is set, can show nag');\n\n                            return true;\n                        }\n                        if (module.storage.get(settings.key) != settings.value.toString()) {\n                            module.debug('Stored value is not set, can show nag', module.storage.get(settings.key));\n\n                            return true;\n                        }\n                        module.debug('Stored value is set, cannot show nag', module.storage.get(settings.key));\n\n                        return false;\n                    },\n                },\n\n                get: {\n                    expirationDate: function (expires) {\n                        if (typeof expires === 'number') {\n                            expires = new Date(Date.now() + expires * 864e5);\n                        }\n                        if (expires instanceof Date && expires.getTime()) {\n                            return expires.toUTCString();\n                        }\n\n                        module.error(error.expiresFormat);\n                    },\n                    storage: function () {\n                        if (settings.storageMethod === 'localstorage' && window.localStorage !== undefined) {\n                            module.debug('Using local storage');\n\n                            return window.localStorage;\n                        }\n                        if (settings.storageMethod === 'sessionstorage' && window.sessionStorage !== undefined) {\n                            module.debug('Using session storage');\n\n                            return window.sessionStorage;\n                        }\n                        if ('cookie' in document) {\n                            module.debug('Using cookie');\n\n                            return {\n                                setItem: function (key, value, options) {\n                                    // RFC6265 compliant encoding\n                                    key = encodeURIComponent(key)\n                                        .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n                                        .replace(/[()]/g, escape)\n                                    ;\n                                    value = encodeURIComponent(value)\n                                        .replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[B-D])/g, decodeURIComponent)\n                                    ;\n\n                                    var cookieOptions = '';\n                                    for (var option in options) {\n                                        if (Object.prototype.hasOwnProperty.call(options, option)) {\n                                            cookieOptions += '; ' + option;\n                                            if (typeof options[option] === 'string') {\n                                                cookieOptions += '=' + options[option].split(';')[0];\n                                            }\n                                        }\n                                    }\n                                    document.cookie = key + '=' + value + cookieOptions;\n                                },\n                                getItem: function (key) {\n                                    var cookies = document.cookie.split('; ');\n                                    for (var i = 0, il = cookies.length; i < il; i++) {\n                                        var\n                                            parts    = cookies[i].split('='),\n                                            foundKey = parts[0].replace(/(%[\\da-f]{2})+/gi, decodeURIComponent)\n                                        ;\n                                        if (key === foundKey) {\n                                            return parts[1] || '';\n                                        }\n                                    }\n                                },\n                                removeItem: function (key, options) {\n                                    storage.setItem(key, '', options);\n                                },\n                            };\n                        }\n\n                        module.error(error.noStorage);\n                    },\n                    storageOptions: function () {\n                        var\n                            options = {}\n                        ;\n                        if (settings.expires) {\n                            options.expires = module.get.expirationDate(settings.expires);\n                        }\n                        if (settings.domain) {\n                            options.domain = settings.domain;\n                        }\n                        if (settings.path) {\n                            options.path = settings.path;\n                        }\n                        if (settings.secure) {\n                            options.secure = settings.secure;\n                        }\n                        if (settings.samesite) {\n                            options.samesite = settings.samesite;\n                        }\n\n                        return options;\n                    },\n                },\n\n                clear: function () {\n                    module.storage.remove(settings.key);\n                },\n\n                storage: {\n                    set: function (key, value) {\n                        var\n                            options = module.get.storageOptions()\n                        ;\n                        if (storage === window.localStorage && options.expires) {\n                            module.debug('Storing expiration value in localStorage', key, options.expires);\n                            storage.setItem(key + settings.expirationKey, options.expires);\n                        }\n                        module.debug('Value stored', key, value);\n                        try {\n                            storage.setItem(key, value, options);\n                        } catch (e) {\n                            module.error(error.setItem, e);\n                        }\n                    },\n                    get: function (key) {\n                        var\n                            storedValue\n                        ;\n                        storedValue = storage.getItem(key);\n                        if (storage === window.localStorage) {\n                            var expiration = storage.getItem(key + settings.expirationKey);\n                            if (expiration !== null && expiration !== undefined && new Date(expiration) < new Date()) {\n                                module.debug('Value in localStorage has expired. Deleting key', key);\n                                module.storage.remove(key);\n                                storedValue = null;\n                            }\n                        }\n                        if (storedValue === 'undefined' || storedValue === 'null' || storedValue === undefined || storedValue === null) {\n                            storedValue = undefined;\n                        }\n\n                        return storedValue;\n                    },\n                    remove: function (key) {\n                        var\n                            options = module.get.storageOptions()\n                        ;\n                        options.expires = module.get.expirationDate(-1);\n                        if (storage === window.localStorage) {\n                            storage.removeItem(key + settings.expirationKey);\n                        }\n                        storage.removeItem(key, options);\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.nag.settings = {\n\n        name: 'Nag',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        namespace: 'Nag',\n\n        // allows cookie to be overridden\n        persist: false,\n\n        // set to zero to require manually dismissal, otherwise hides on its own\n        displayTime: 0,\n\n        animation: {\n            show: 'slide',\n            hide: 'slide',\n        },\n\n        context: false,\n        detachable: false,\n\n        expires: 30,\n\n        // cookie storage only options\n        domain: false,\n        path: '/',\n        secure: false,\n        samesite: false,\n\n        // type of storage to use\n        storageMethod: 'cookie',\n\n        // value to store in dismissed localstorage/cookie\n        key: 'nag',\n        value: 'dismiss',\n\n        // Key suffix to support expiration in localstorage\n        expirationKey: 'ExpirationDate',\n\n        error: {\n            noStorage: 'Unsupported storage method',\n            method: 'The method you called is not defined.',\n            setItem: 'Unexpected error while setting value',\n            expiresFormat: '\"expires\" must be a number of days or a Date Object',\n        },\n\n        className: {\n            bottom: 'bottom',\n            fixed: 'fixed',\n        },\n\n        selector: {\n            close: '> .close.icon',\n        },\n\n        duration: 500,\n        easing: 'easeOutQuad',\n\n        // callback before show animation, return false to prevent show\n        onShow: function () {},\n\n        // called after show animation\n        onVisible: function () {},\n\n        // callback before hide animation, return false to prevent hide\n        onHide: function () {},\n\n        // callback after hide animation\n        onHidden: function () {},\n\n    };\n\n    // Adds easing\n    $.extend($.easing, {\n        easeOutQuad: function (x) {\n            return 1 - (1 - x) * (1 - x);\n        },\n    });\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/placeholder.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Placeholder\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n/* -------------------\n      Content\n-------------------- */\n.ui.placeholder {\n  position: static;\n  overflow: hidden;\n  animation: placeholderShimmer 2s linear;\n  animation-iteration-count: infinite;\n  background-color: #fff;\n  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%);\n  background-size: 1200px 100%;\n  max-width: 30rem;\n}\n@keyframes placeholderShimmer {\n  0% {\n    background-position: -1200px 0;\n  }\n  100% {\n    background-position: 1200px 0;\n  }\n}\n.ui.placeholder + .ui.placeholder {\n  margin-top: 2rem;\n}\n.ui.placeholder + .ui.placeholder {\n  animation-delay: 0.15s;\n}\n.ui.placeholder + .ui.placeholder + .ui.placeholder {\n  animation-delay: 0.3s;\n}\n.ui.placeholder + .ui.placeholder + .ui.placeholder + .ui.placeholder {\n  animation-delay: 0.45s;\n}\n.ui.placeholder + .ui.placeholder + .ui.placeholder + .ui.placeholder + .ui.placeholder {\n  animation-delay: 0.6s;\n}\n.ui.placeholder,\n.ui.placeholder > ::before,\n.ui.placeholder .image.header::after,\n.ui.placeholder .line,\n.ui.placeholder .line::after {\n  background-color: #fff;\n}\n.ui.placeholder.hidden {\n  display: none;\n}\n\n/* Image */\n.ui.placeholder .image:not(.header):not(.ui):not(.icon) {\n  height: 100px;\n}\n.ui.placeholder .square.image:not(.header) {\n  height: 0;\n  overflow: hidden;\n  \n/* 1/1 aspect ratio */\n  padding-top: 100%;\n}\n.ui.placeholder .rectangular.image:not(.header) {\n  height: 0;\n  overflow: hidden;\n  \n/* 4/3 aspect ratio */\n  padding-top: 75%;\n}\n\n/* Lines */\n.ui.placeholder .line {\n  position: relative;\n  height: 0.85714286em;\n}\n.ui.placeholder .line::before,\n.ui.placeholder .line::after {\n  top: 100%;\n  position: absolute;\n  content: \"\";\n  background-color: inherit;\n}\n.ui.placeholder .line::before {\n  left: 0;\n}\n.ui.placeholder .line::after {\n  right: 0;\n}\n\n/* Any Lines */\n.ui.placeholder .line {\n  margin-bottom: 0.5em;\n}\n.ui.placeholder .line::before,\n.ui.placeholder .line::after {\n  height: 0.5em;\n}\n.ui.placeholder .line:not(:first-child) {\n  margin-top: 0.5em;\n}\n\n/* Line Outdent */\n.ui.placeholder .line:nth-child(1)::after {\n  width: 0;\n}\n.ui.placeholder .line:nth-child(2)::after {\n  width: 50%;\n}\n.ui.placeholder .line:nth-child(3)::after {\n  width: 10%;\n}\n.ui.placeholder .line:nth-child(4)::after {\n  width: 35%;\n}\n.ui.placeholder .line:nth-child(5)::after {\n  width: 65%;\n}\n\n/* Header Image + 2 Lines */\n.ui.placeholder .header {\n  position: relative;\n  overflow: hidden;\n}\n\n/* Header Line 1 & 2 */\n.ui.placeholder .header .line {\n  margin-bottom: 0.64285714em;\n}\n.ui.placeholder .header .line::before,\n.ui.placeholder .header .line::after {\n  height: 0.64285714em;\n}\n.ui.placeholder .header .line:not(:first-child) {\n  margin-top: 0.64285714em;\n}\n.ui.placeholder .header .line::after {\n  width: 20%;\n}\n.ui.placeholder .header .line:nth-child(2)::after {\n  width: 60%;\n}\n\n/* Image Header */\n.ui.placeholder .image.header .line {\n  margin-left: 3em;\n}\n.ui.placeholder .image.header .line::before {\n  width: 0.71428571rem;\n}\n.ui.placeholder .image.header::after {\n  display: block;\n  height: 0.85714286em;\n  content: \"\";\n  margin-left: 3em;\n}\n\n/* Spacing */\n.ui.placeholder .image .line:first-child,\n.ui.placeholder .paragraph .line:first-child,\n.ui.placeholder .header .line:first-child {\n  height: 0.01px;\n}\n.ui.placeholder .image:not(:first-child)::before,\n.ui.placeholder .paragraph:not(:first-child)::before,\n.ui.placeholder .header:not(:first-child)::before {\n  height: 1.42857143em;\n  content: \"\";\n  display: block;\n}\n\n/* Inverted Content Loader */\n.ui.inverted.placeholder {\n  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%);\n}\n.ui.inverted.placeholder,\n.ui.inverted.placeholder > ::before,\n.ui.inverted.placeholder .image.header::after,\n.ui.inverted.placeholder .line,\n.ui.inverted.placeholder .line::after {\n  background-color: #1b1c1d;\n}\n\n\n/*******************************\n            Variations\n*******************************/\n\n\n/* -------------------\n        Sizes\n-------------------- */\n.ui.placeholder .full.line.line.line::after {\n  width: 0;\n}\n.ui.placeholder .very.long.line.line.line::after {\n  width: 10%;\n}\n.ui.placeholder .long.line.line.line::after {\n  width: 35%;\n}\n.ui.placeholder .medium.line.line.line::after {\n  width: 50%;\n}\n.ui.placeholder .short.line.line.line::after {\n  width: 65%;\n}\n.ui.placeholder .very.short.line.line.line::after {\n  width: 80%;\n}\n\n/* -------------------\n            Fluid\n    -------------------- */\n.ui.fluid.placeholder {\n  max-width: none;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/popup.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Popup\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Popup\n*******************************/\n\n.ui.popup {\n  display: none;\n  position: absolute;\n  top: 0;\n  right: 0;\n  \n/* Fixes content being squished when inline (moz only) */\n  min-width: min-content;\n  z-index: 1900;\n  border: 1px solid #d4d4d5;\n  line-height: 1.4285em;\n  max-width: 250px;\n  background: #fff;\n  padding: 0.833em 1em;\n  font-weight: normal;\n  font-style: normal;\n  color: rgba(0, 0, 0, 0.87);\n  border-radius: 0.28571429rem;\n  box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);\n}\n.ui.popup > .header {\n  padding: 0;\n  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\";\n  font-size: 1.14285714em;\n  line-height: 1.2;\n  font-weight: bold;\n}\n.ui.popup > .header + .content {\n  padding-top: 0.5em;\n}\n.ui.popup::before {\n  position: absolute;\n  content: \"\";\n  width: 0.71428571em;\n  height: 0.71428571em;\n  background: #fff;\n  transform: rotate(45deg);\n  z-index: 1901;\n  box-shadow: 1px 1px 0 0 #bababc;\n}\n\n\n/*******************************\n            Types\n*******************************/\n\n\n/* --------------\n        Tooltip\n    --------------- */\n\n/* Content */\n[data-tooltip] {\n  position: relative;\n}\n\n/* Arrow */\n[data-tooltip]::before {\n  pointer-events: none;\n  position: absolute;\n  content: \"\";\n  font-size: 1rem;\n  width: 0.71428571em;\n  height: 0.71428571em;\n  background: #fff;\n  z-index: 1901;\n  box-shadow: 1px 1px 0 0 #bababc;\n}\n\n/* Popup */\n[data-tooltip]::after {\n  pointer-events: none;\n  content: attr(data-tooltip);\n  position: absolute;\n  text-transform: none;\n  text-align: left;\n  text-shadow: none;\n  white-space: nowrap;\n  font-size: 1rem;\n  border: 1px solid #d4d4d5;\n  line-height: 1.4285em;\n  max-width: none;\n  background: #fff;\n  padding: 0.833em 1em;\n  font-weight: normal;\n  font-style: normal;\n  color: rgba(0, 0, 0, 0.87);\n  border-radius: 0.28571429rem;\n  box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);\n  z-index: 1900;\n}\n\n/* Animation */\n[data-tooltip]::before,\n[data-tooltip]::after {\n  pointer-events: none;\n  opacity: 0;\n  transition: transform 0.2s ease, opacity 0.2s ease;\n}\n[data-tooltip]::after,\n[data-tooltip]:hover::before {\n  transition-delay: 0.04s;\n}\n[data-tooltip]::before,\n[data-tooltip]:hover::after {\n  transition-delay: 0s;\n}\n[data-tooltip]::before {\n  transform: rotate(45deg) scale(0.8);\n  transform-origin: center top;\n}\n[data-tooltip]::after {\n  transform-origin: center bottom;\n}\n[data-tooltip][data-variation~=\"visible\"]::before,\n[data-tooltip][data-variation~=\"visible\"]::after,\n[data-tooltip]:hover::before,\n[data-tooltip]:hover::after {\n  pointer-events: auto;\n  opacity: 1;\n}\n[data-tooltip]:hover::before {\n  transform: rotate(45deg) scale(1);\n}\n\n/* Animation Position */\n[data-tooltip]:not([data-position])::after,\n[data-tooltip][data-position=\"top center\"]::after,\n[data-tooltip][data-position=\"bottom center\"]::after {\n  transform: translateX(-50%) scale(0.8);\n}\n[data-tooltip]:not([data-position]):hover::after,\n[data-tooltip][data-position=\"top center\"]:hover::after,\n[data-tooltip][data-position=\"bottom center\"]:hover::after {\n  transform: translateX(-50%) scale(1);\n}\n[data-tooltip][data-position=\"left center\"]::after,\n[data-tooltip][data-position=\"right center\"]::after {\n  transform: translateY(-50%) scale(0.8);\n}\n[data-tooltip][data-position=\"left center\"]:hover::after,\n[data-tooltip][data-position=\"right center\"]:hover::after {\n  transform: translateY(-50%) scale(1);\n  -moz-transform: translateY(-50%) scale(1.0001) !important;\n}\n[data-tooltip][data-position=\"top left\"]::after,\n[data-tooltip][data-position=\"top right\"]::after,\n[data-tooltip][data-position=\"bottom left\"]::after,\n[data-tooltip][data-position=\"bottom right\"]::after {\n  transform: scale(0.8);\n}\n[data-tooltip][data-position=\"top left\"]:hover::after,\n[data-tooltip][data-position=\"top right\"]:hover::after,\n[data-tooltip][data-position=\"bottom left\"]:hover::after,\n[data-tooltip][data-position=\"bottom right\"]:hover::after {\n  transform: scale(1);\n}\n[data-tooltip][data-variation~=\"fixed\"]::after {\n  white-space: normal;\n  width: 250px;\n}\n[data-tooltip][data-variation*=\"wide fixed\"]::after {\n  width: 350px;\n}\n[data-tooltip][data-variation*=\"very wide fixed\"]::after {\n  width: 550px;\n}\n@media only screen and (max-width: 767.98px) {\n  [data-tooltip][data-variation~=\"fixed\"]::after {\n    width: 250px;\n  }\n}\n\n/* --------------\n            Inverted\n        --------------- */\n\n/* Arrow */\n[data-tooltip][data-inverted]::before {\n  box-shadow: none;\n}\n\n/* Arrow Position */\n[data-tooltip]:not([data-position])[data-inverted]::before {\n  background: #1b1c1d;\n}\n\n/* Popup */\n[data-tooltip][data-inverted]::after {\n  background: #1b1c1d;\n  color: #fff;\n  border: none;\n  box-shadow: none;\n}\n\n/* --------------\n            Position\n        --------------- */\n[data-position~=\"top\"][data-tooltip]::before {\n  background: #fff;\n}\n\n/* Top Center (default) */\n[data-tooltip]:not([data-position])::after,\n[data-position=\"top center\"][data-tooltip]::after {\n  top: auto;\n  right: auto;\n  left: 50%;\n  bottom: 100%;\n  margin-bottom: 0.5em;\n}\n[data-tooltip]:not([data-position])::before,\n[data-position=\"top center\"][data-tooltip]::before {\n  top: auto;\n  right: auto;\n  bottom: 100%;\n  left: 50%;\n  background: #fff;\n  margin-left: -0.07142857rem;\n  margin-bottom: 0.14285714rem;\n}\n\n/* Top Left */\n[data-position=\"top left\"][data-tooltip]::after {\n  top: auto;\n  right: auto;\n  left: 0;\n  bottom: 100%;\n  margin-bottom: 0.5em;\n}\n[data-position=\"top left\"][data-tooltip]::before {\n  top: auto;\n  right: auto;\n  bottom: 100%;\n  left: 1em;\n  margin-left: -0.07142857rem;\n  margin-bottom: 0.14285714rem;\n}\n\n/* Top Right */\n[data-position=\"top right\"][data-tooltip]::after {\n  top: auto;\n  left: auto;\n  right: 0;\n  bottom: 100%;\n  margin-bottom: 0.5em;\n}\n[data-position=\"top right\"][data-tooltip]::before {\n  top: auto;\n  left: auto;\n  bottom: 100%;\n  right: 1em;\n  margin-left: -0.07142857rem;\n  margin-bottom: 0.14285714rem;\n}\n[data-position~=\"bottom\"][data-tooltip]::before {\n  background: #fff;\n  box-shadow: -1px -1px 0 0 #bababc;\n}\n\n/* Bottom Center */\n[data-position=\"bottom center\"][data-tooltip]::after {\n  bottom: auto;\n  right: auto;\n  left: 50%;\n  top: 100%;\n  margin-top: 0.5em;\n}\n[data-position=\"bottom center\"][data-tooltip]::before {\n  bottom: auto;\n  right: auto;\n  top: 100%;\n  left: 50%;\n  margin-left: -0.07142857rem;\n  margin-top: 0.30714286em;\n}\n\n/* Bottom Left */\n[data-position=\"bottom left\"][data-tooltip]::after {\n  left: 0;\n  top: 100%;\n  margin-top: 0.5em;\n}\n[data-position=\"bottom left\"][data-tooltip]::before {\n  bottom: auto;\n  right: auto;\n  top: 100%;\n  left: 1em;\n  margin-left: -0.07142857rem;\n  margin-top: 0.14285714rem;\n}\n\n/* Bottom Right */\n[data-position=\"bottom right\"][data-tooltip]::after {\n  right: 0;\n  top: 100%;\n  margin-top: 0.5em;\n}\n[data-position=\"bottom right\"][data-tooltip]::before {\n  bottom: auto;\n  left: auto;\n  top: 100%;\n  right: 1em;\n  margin-left: -0.14285714rem;\n  margin-top: 0.07142857rem;\n}\n\n/* Left Center */\n[data-position=\"left center\"][data-tooltip]::after {\n  right: 100%;\n  top: 50%;\n  margin-right: 0.5em;\n}\n[data-position=\"left center\"][data-tooltip]::before {\n  right: 100%;\n  top: 50%;\n  margin-top: -0.14285714rem;\n  margin-right: -0.07142857rem;\n  background: #fff;\n  box-shadow: 1px -1px 0 0 #bababc;\n}\n\n/* Right Center */\n[data-position=\"right center\"][data-tooltip]::after {\n  left: 100%;\n  top: 50%;\n  margin-left: 0.5em;\n}\n[data-position=\"right center\"][data-tooltip]::before {\n  left: 100%;\n  top: 50%;\n  margin-top: -0.07142857rem;\n  margin-left: 0.14285714rem;\n  background: #fff;\n  box-shadow: -1px 1px 0 0 #bababc;\n}\n\n/* Inverted Arrow Color */\n[data-inverted][data-position~=\"bottom\"][data-tooltip]::before {\n  background: #1b1c1d;\n  box-shadow: -1px -1px 0 0 #bababc;\n}\n[data-inverted][data-position=\"left center\"][data-tooltip]::before {\n  background: #1b1c1d;\n  box-shadow: 1px -1px 0 0 #bababc;\n}\n[data-inverted][data-position=\"right center\"][data-tooltip]::before {\n  background: #1b1c1d;\n  box-shadow: -1px 1px 0 0 #bababc;\n}\n[data-inverted][data-position~=\"top\"][data-tooltip]::before {\n  background: #1b1c1d;\n}\n[data-position~=\"bottom\"][data-tooltip]::before {\n  transform-origin: center bottom;\n}\n[data-position~=\"bottom\"][data-tooltip]::after {\n  transform-origin: center top;\n}\n[data-position=\"bottom center\"][data-tooltip]::before {\n  transform-origin: center top;\n}\n[data-position=\"left center\"][data-tooltip]::before {\n  transform-origin: top center;\n}\n[data-position=\"left center\"][data-tooltip]::after {\n  transform-origin: right center;\n}\n[data-position=\"right center\"][data-tooltip]::before {\n  transform-origin: right center;\n}\n[data-position=\"right center\"][data-tooltip]::after {\n  transform-origin: left center;\n}\n[data-position=\"top left\"][data-tooltip]::after {\n  transform-origin: bottom left;\n}\n[data-position=\"top right\"][data-tooltip]::after {\n  transform-origin: bottom right;\n}\n[data-position=\"bottom left\"][data-tooltip]::after {\n  transform-origin: top left;\n}\n[data-position=\"bottom right\"][data-tooltip]::after {\n  transform-origin: top right;\n}\n\n/* --------------\n            Basic\n        --------------- */\n[data-tooltip][data-variation~=\"basic\"]::before {\n  display: none;\n}\n[data-tooltip][data-variation~=\"multiline\"]::after {\n  white-space: pre-line;\n}\n\n/* --------------\n     Spacing\n--------------- */\n.ui.popup {\n  margin: 0;\n}\n\n/* Extending from Top */\n.ui.top.popup {\n  margin: 0 0 0.71428571em;\n}\n.ui.top.left.popup {\n  transform-origin: left bottom;\n}\n.ui.top.center.popup {\n  transform-origin: center bottom;\n}\n.ui.top.right.popup {\n  transform-origin: right bottom;\n}\n\n/* Extending from Vertical Center */\n.ui.left.center.popup {\n  margin: 0 0.71428571em 0 0;\n  transform-origin: right 50%;\n}\n.ui.right.center.popup {\n  margin: 0 0 0 0.71428571em;\n  transform-origin: left 50%;\n}\n\n/* Extending from Bottom */\n.ui.bottom.popup {\n  margin: 0.71428571em 0 0;\n}\n.ui.bottom.left.popup {\n  transform-origin: left top;\n}\n.ui.bottom.center.popup {\n  transform-origin: center top;\n}\n.ui.bottom.right.popup {\n  transform-origin: right top;\n}\n\n/* --------------\n         Pointer\n    --------------- */\n\n/* --- Below --- */\n.ui.bottom.center.popup::before {\n  margin-left: -0.30714286em;\n  top: -0.30714286em;\n  left: 50%;\n  right: auto;\n  bottom: auto;\n  box-shadow: -1px -1px 0 0 #bababc;\n}\n.ui.bottom.left.popup {\n  margin-left: 0;\n}\n\n/* rtl:rename */\n.ui.bottom.left.popup::before {\n  top: -0.30714286em;\n  left: 1em;\n  right: auto;\n  bottom: auto;\n  margin-left: 0;\n  box-shadow: -1px -1px 0 0 #bababc;\n}\n.ui.bottom.right.popup {\n  margin-right: 0;\n}\n\n/* rtl:rename */\n.ui.bottom.right.popup::before {\n  top: -0.30714286em;\n  right: 1em;\n  bottom: auto;\n  left: auto;\n  margin-left: 0;\n  box-shadow: -1px -1px 0 0 #bababc;\n}\n\n/* --- Above --- */\n.ui.top.center.popup::before {\n  top: auto;\n  right: auto;\n  bottom: -0.30714286em;\n  left: 50%;\n  margin-left: -0.30714286em;\n}\n.ui.top.left.popup {\n  margin-left: 0;\n}\n\n/* rtl:rename */\n.ui.top.left.popup::before {\n  bottom: -0.30714286em;\n  left: 1em;\n  top: auto;\n  right: auto;\n  margin-left: 0;\n}\n.ui.top.right.popup {\n  margin-right: 0;\n}\n\n/* rtl:rename */\n.ui.top.right.popup::before {\n  bottom: -0.30714286em;\n  right: 1em;\n  top: auto;\n  left: auto;\n  margin-left: 0;\n}\n\n/* --- Left Center --- */\n\n/* rtl:rename */\n.ui.left.center.popup::before {\n  top: 50%;\n  right: -0.30714286em;\n  bottom: auto;\n  left: auto;\n  margin-top: -0.30714286em;\n  box-shadow: 1px -1px 0 0 #bababc;\n}\n\n/* --- Right Center --- */\n\n/* rtl:rename */\n.ui.right.center.popup::before {\n  top: 50%;\n  left: -0.30714286em;\n  bottom: auto;\n  right: auto;\n  margin-top: -0.30714286em;\n  box-shadow: -1px 1px 0 0 #bababc;\n}\n.ui.right.center.popup::before,\n.ui.left.center.popup::before {\n  background: #fff;\n}\n\n/* Arrow Color By Location */\n.ui.bottom.popup::before {\n  background: #fff;\n}\n.ui.top.popup::before {\n  background: #fff;\n}\n\n/* Inverted Arrow Color */\n.ui.inverted.bottom.popup::before {\n  background: #1b1c1d;\n}\n.ui.inverted.right.center.popup::before,\n.ui.inverted.left.center.popup::before {\n  background: #1b1c1d;\n}\n.ui.inverted.top.popup::before {\n  background: #1b1c1d;\n}\n\n\n/*******************************\n            Coupling\n*******************************/\n\n\n/* Immediate Nested Grid */\n.ui.ui.ui.popup > .ui.grid:not(.padded) {\n  width: calc(100% + 1.75rem);\n  margin: -0.7rem -0.875rem;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n.ui.loading.popup {\n  cursor: default;\n  pointer-events: none;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n.ui.loading.popup * {\n  opacity: 0.3;\n}\n.ui.loading.popup::after {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -1em 0 0 -1em;\n  width: 2em;\n  height: 2em;\n  animation: loader 0.6s infinite linear;\n  border: 0.2em solid #767676;\n  border-radius: 500rem;\n  box-shadow: 0 0 0 1px transparent;\n  visibility: visible;\n  z-index: 101;\n}\n.ui.invisible.popup {\n  display: block;\n  visibility: hidden !important;\n  z-index: -1;\n}\n.ui.animating.popup,\n.ui.visible.popup {\n  display: block;\n}\n.ui.visible.popup {\n  transform: translateZ(0);\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\n\n\n/*******************************\n            Variations\n*******************************/\n\n\n/* --------------\n         Basic\n    --------------- */\n.ui.basic.popup::before {\n  display: none;\n}\n.ui.fixed.popup {\n  width: 250px;\n}\n\n/* --------------\n         Wide\n    --------------- */\n.ui.wide.popup {\n  max-width: 350px;\n}\n.ui.wide.popup.fixed {\n  width: 350px;\n}\n.ui[class*=\"very wide\"].popup {\n  max-width: 550px;\n}\n.ui[class*=\"very wide\"].popup.fixed {\n  width: 550px;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.wide.popup,\n  .ui[class*=\"very wide\"].popup {\n    max-width: 250px;\n  }\n  .ui.wide.popup.fixed,\n  .ui[class*=\"very wide\"].popup.fixed {\n    width: 250px;\n  }\n}\n\n/* --------------\n         Fluid\n    --------------- */\n.ui.fluid.popup {\n  width: 100%;\n  max-width: none;\n}\n\n/* --------------\n         Colors\n    --------------- */\n\n/* Inverted colors */\n.ui.inverted.popup {\n  background: #1b1c1d;\n  color: #fff;\n  border: none;\n  box-shadow: none;\n}\n.ui.inverted.popup .header {\n  background: none;\n  color: #fff;\n}\n.ui.inverted.popup::before {\n  background-color: #1b1c1d;\n  box-shadow: none;\n}\n.ui.ui.ui.primary.popup::before,\n.ui.primary.popup,\n[data-tooltip][data-variation~=\"primary\"]::after,\n[data-tooltip][data-variation~=\"primary\"]::before {\n  background: #2185d0;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.primary.loading.popup::before,\n.ui.primary.loading.popup {\n  background: #9bcbef;\n}\n.ui.ui.ui.primary.popup::before,\n[data-tooltip][data-variation~=\"primary\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.primary.popup::before,\n.ui.inverted.primary.popup,\n[data-tooltip][data-inverted][data-variation~=\"primary\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"primary\"]::before {\n  background: #54c8ff;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.primary.loading.popup::before,\n.ui.inverted.primary.loading.popup {\n  background: #007eba;\n}\n.ui.ui.ui.secondary.popup::before,\n.ui.secondary.popup,\n[data-tooltip][data-variation~=\"secondary\"]::after,\n[data-tooltip][data-variation~=\"secondary\"]::before {\n  background: #1b1c1d;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.secondary.loading.popup::before,\n.ui.secondary.loading.popup {\n  background: #65696c;\n}\n.ui.ui.ui.secondary.popup::before,\n[data-tooltip][data-variation~=\"secondary\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.secondary.popup::before,\n.ui.inverted.secondary.popup,\n[data-tooltip][data-inverted][data-variation~=\"secondary\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"secondary\"]::before {\n  background: #545454;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.secondary.loading.popup::before,\n.ui.inverted.secondary.loading.popup {\n  background: #080808;\n}\n.ui.ui.ui.red.popup::before,\n.ui.red.popup,\n[data-tooltip][data-variation~=\"red\"]::after,\n[data-tooltip][data-variation~=\"red\"]::before {\n  background: #db2828;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.red.loading.popup::before,\n.ui.red.loading.popup {\n  background: #f1abab;\n}\n.ui.ui.ui.red.popup::before,\n[data-tooltip][data-variation~=\"red\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.red.popup::before,\n.ui.inverted.red.popup,\n[data-tooltip][data-inverted][data-variation~=\"red\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"red\"]::before {\n  background: #ff695e;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.red.loading.popup::before,\n.ui.inverted.red.loading.popup {\n  background: #c40d00;\n}\n.ui.ui.ui.orange.popup::before,\n.ui.orange.popup,\n[data-tooltip][data-variation~=\"orange\"]::after,\n[data-tooltip][data-variation~=\"orange\"]::before {\n  background: #f2711c;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.orange.loading.popup::before,\n.ui.orange.loading.popup {\n  background: #faccad;\n}\n.ui.ui.ui.orange.popup::before,\n[data-tooltip][data-variation~=\"orange\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.orange.popup::before,\n.ui.inverted.orange.popup,\n[data-tooltip][data-inverted][data-variation~=\"orange\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"orange\"]::before {\n  background: #ff851b;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.orange.loading.popup::before,\n.ui.inverted.orange.loading.popup {\n  background: #813c00;\n}\n.ui.ui.ui.yellow.popup::before,\n.ui.yellow.popup,\n[data-tooltip][data-variation~=\"yellow\"]::after,\n[data-tooltip][data-variation~=\"yellow\"]::before {\n  background: #fbbd08;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.yellow.loading.popup::before,\n.ui.yellow.loading.popup {\n  background: #fde59f;\n}\n.ui.ui.ui.yellow.popup::before,\n[data-tooltip][data-variation~=\"yellow\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.yellow.popup::before,\n.ui.inverted.yellow.popup,\n[data-tooltip][data-inverted][data-variation~=\"yellow\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"yellow\"]::before {\n  background: #ffe21f;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.yellow.loading.popup::before,\n.ui.inverted.yellow.loading.popup {\n  background: #857400;\n}\n.ui.ui.ui.olive.popup::before,\n.ui.olive.popup,\n[data-tooltip][data-variation~=\"olive\"]::after,\n[data-tooltip][data-variation~=\"olive\"]::before {\n  background: #b5cc18;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.olive.loading.popup::before,\n.ui.olive.loading.popup {\n  background: #e4f18c;\n}\n.ui.ui.ui.olive.popup::before,\n[data-tooltip][data-variation~=\"olive\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.olive.popup::before,\n.ui.inverted.olive.popup,\n[data-tooltip][data-inverted][data-variation~=\"olive\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"olive\"]::before {\n  background: #d9e778;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.olive.loading.popup::before,\n.ui.inverted.olive.loading.popup {\n  background: #97a81e;\n}\n.ui.ui.ui.green.popup::before,\n.ui.green.popup,\n[data-tooltip][data-variation~=\"green\"]::after,\n[data-tooltip][data-variation~=\"green\"]::before {\n  background: #21ba45;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.green.loading.popup::before,\n.ui.green.loading.popup {\n  background: #8aeaa0;\n}\n.ui.ui.ui.green.popup::before,\n[data-tooltip][data-variation~=\"green\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.green.popup::before,\n.ui.inverted.green.popup,\n[data-tooltip][data-inverted][data-variation~=\"green\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"green\"]::before {\n  background: #2ecc40;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.green.loading.popup::before,\n.ui.inverted.green.loading.popup {\n  background: #124f19;\n}\n.ui.ui.ui.teal.popup::before,\n.ui.teal.popup,\n[data-tooltip][data-variation~=\"teal\"]::after,\n[data-tooltip][data-variation~=\"teal\"]::before {\n  background: #00b5ad;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.teal.loading.popup::before,\n.ui.teal.loading.popup {\n  background: #4ffff7;\n}\n.ui.ui.ui.teal.popup::before,\n[data-tooltip][data-variation~=\"teal\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.teal.popup::before,\n.ui.inverted.teal.popup,\n[data-tooltip][data-inverted][data-variation~=\"teal\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"teal\"]::before {\n  background: #6dffff;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.teal.loading.popup::before,\n.ui.inverted.teal.loading.popup {\n  background: #00d3d3;\n}\n.ui.ui.ui.blue.popup::before,\n.ui.blue.popup,\n[data-tooltip][data-variation~=\"blue\"]::after,\n[data-tooltip][data-variation~=\"blue\"]::before {\n  background: #2185d0;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.blue.loading.popup::before,\n.ui.blue.loading.popup {\n  background: #9bcbef;\n}\n.ui.ui.ui.blue.popup::before,\n[data-tooltip][data-variation~=\"blue\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.blue.popup::before,\n.ui.inverted.blue.popup,\n[data-tooltip][data-inverted][data-variation~=\"blue\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"blue\"]::before {\n  background: #54c8ff;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.blue.loading.popup::before,\n.ui.inverted.blue.loading.popup {\n  background: #007eba;\n}\n.ui.ui.ui.violet.popup::before,\n.ui.violet.popup,\n[data-tooltip][data-variation~=\"violet\"]::after,\n[data-tooltip][data-variation~=\"violet\"]::before {\n  background: #6435c9;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.violet.loading.popup::before,\n.ui.violet.loading.popup {\n  background: #c1adea;\n}\n.ui.ui.ui.violet.popup::before,\n[data-tooltip][data-variation~=\"violet\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.violet.popup::before,\n.ui.inverted.violet.popup,\n[data-tooltip][data-inverted][data-variation~=\"violet\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"violet\"]::before {\n  background: #a291fb;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.violet.loading.popup::before,\n.ui.inverted.violet.loading.popup {\n  background: #2d09ea;\n}\n.ui.ui.ui.purple.popup::before,\n.ui.purple.popup,\n[data-tooltip][data-variation~=\"purple\"]::after,\n[data-tooltip][data-variation~=\"purple\"]::before {\n  background: #a333c8;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.purple.loading.popup::before,\n.ui.purple.loading.popup {\n  background: #daabe9;\n}\n.ui.ui.ui.purple.popup::before,\n[data-tooltip][data-variation~=\"purple\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.purple.popup::before,\n.ui.inverted.purple.popup,\n[data-tooltip][data-inverted][data-variation~=\"purple\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"purple\"]::before {\n  background: #dc73ff;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.purple.loading.popup::before,\n.ui.inverted.purple.loading.popup {\n  background: #a300d9;\n}\n.ui.ui.ui.pink.popup::before,\n.ui.pink.popup,\n[data-tooltip][data-variation~=\"pink\"]::after,\n[data-tooltip][data-variation~=\"pink\"]::before {\n  background: #e03997;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.pink.loading.popup::before,\n.ui.pink.loading.popup {\n  background: #f5bddc;\n}\n.ui.ui.ui.pink.popup::before,\n[data-tooltip][data-variation~=\"pink\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.pink.popup::before,\n.ui.inverted.pink.popup,\n[data-tooltip][data-inverted][data-variation~=\"pink\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"pink\"]::before {\n  background: #ff8edf;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.pink.loading.popup::before,\n.ui.inverted.pink.loading.popup {\n  background: #f400af;\n}\n.ui.ui.ui.brown.popup::before,\n.ui.brown.popup,\n[data-tooltip][data-variation~=\"brown\"]::after,\n[data-tooltip][data-variation~=\"brown\"]::before {\n  background: #a5673f;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.brown.loading.popup::before,\n.ui.brown.loading.popup {\n  background: #dbb8a2;\n}\n.ui.ui.ui.brown.popup::before,\n[data-tooltip][data-variation~=\"brown\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.brown.popup::before,\n.ui.inverted.brown.popup,\n[data-tooltip][data-inverted][data-variation~=\"brown\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"brown\"]::before {\n  background: #d67c1c;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.brown.loading.popup::before,\n.ui.inverted.brown.loading.popup {\n  background: #4f2e0a;\n}\n.ui.ui.ui.grey.popup::before,\n.ui.grey.popup,\n[data-tooltip][data-variation~=\"grey\"]::after,\n[data-tooltip][data-variation~=\"grey\"]::before {\n  background: #767676;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.grey.loading.popup::before,\n.ui.grey.loading.popup {\n  background: #c3c3c3;\n}\n.ui.ui.ui.grey.popup::before,\n[data-tooltip][data-variation~=\"grey\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.grey.popup::before,\n.ui.inverted.grey.popup,\n[data-tooltip][data-inverted][data-variation~=\"grey\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"grey\"]::before {\n  background: #dcddde;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.grey.loading.popup::before,\n.ui.inverted.grey.loading.popup {\n  background: #8d9194;\n}\n.ui.ui.ui.black.popup::before,\n.ui.black.popup,\n[data-tooltip][data-variation~=\"black\"]::after,\n[data-tooltip][data-variation~=\"black\"]::before {\n  background: #1b1c1d;\n  color: #fff;\n  border: none;\n}\n.ui.ui.ui.black.loading.popup::before,\n.ui.black.loading.popup {\n  background: #65696c;\n}\n.ui.ui.ui.black.popup::before,\n[data-tooltip][data-variation~=\"black\"]::before {\n  box-shadow: none;\n}\n.ui.ui.ui.inverted.black.popup::before,\n.ui.inverted.black.popup,\n[data-tooltip][data-inverted][data-variation~=\"black\"]::after,\n[data-tooltip][data-inverted][data-variation~=\"black\"]::before {\n  background: #545454;\n  color: #1b1c1d;\n}\n.ui.ui.ui.inverted.black.loading.popup::before,\n.ui.inverted.black.loading.popup {\n  background: #080808;\n}\n\n/* --------------\n         Flowing\n    --------------- */\n.ui.flowing.popup {\n  max-width: none;\n}\n\n/* --------------\n     Sizes\n--------------- */\n.ui.popup {\n  font-size: 1rem;\n}\n.ui.mini.popup {\n  font-size: 0.78571429rem;\n}\n[data-tooltip][data-variation~=\"mini\"]::before,\n[data-tooltip][data-variation~=\"mini\"]::after {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.popup {\n  font-size: 0.85714286rem;\n}\n[data-tooltip][data-variation~=\"tiny\"]::before,\n[data-tooltip][data-variation~=\"tiny\"]::after {\n  font-size: 0.85714286rem;\n}\n.ui.small.popup {\n  font-size: 0.92857143rem;\n}\n[data-tooltip][data-variation~=\"small\"]::before,\n[data-tooltip][data-variation~=\"small\"]::after {\n  font-size: 0.92857143rem;\n}\n.ui.large.popup {\n  font-size: 1.14285714rem;\n}\n[data-tooltip][data-variation~=\"large\"]::before,\n[data-tooltip][data-variation~=\"large\"]::after {\n  font-size: 1.14285714rem;\n}\n.ui.big.popup {\n  font-size: 1.28571429rem;\n}\n[data-tooltip][data-variation~=\"big\"]::before,\n[data-tooltip][data-variation~=\"big\"]::after {\n  font-size: 1.28571429rem;\n}\n.ui.huge.popup {\n  font-size: 1.42857143rem;\n}\n[data-tooltip][data-variation~=\"huge\"]::before,\n[data-tooltip][data-variation~=\"huge\"]::after {\n  font-size: 1.42857143rem;\n}\n.ui.massive.popup {\n  font-size: 1.71428571rem;\n}\n[data-tooltip][data-variation~=\"massive\"]::before,\n[data-tooltip][data-variation~=\"massive\"]::after {\n  font-size: 1.71428571rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n        User Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/popup.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Popup\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.popup = function (parameters) {\n        var\n            $allModules    = $(this),\n            $document      = $(document),\n            $window        = $(window),\n            $body          = $('body'),\n\n            clickEvent      = 'ontouchstart' in document.documentElement\n                ? 'touchstart'\n                : 'click',\n\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n            contextCheck   = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $(context);\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : $body;\n                    }\n                }\n\n                return $context;\n            },\n\n            returnedValue\n        ;\n        $allModules.each(function () {\n            var\n                settings        = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.popup.settings, parameters)\n                    : $.extend({}, $.fn.popup.settings),\n\n                selector           = settings.selector,\n                className          = settings.className,\n                error              = settings.error,\n                metadata           = settings.metadata,\n                namespace          = settings.namespace,\n\n                eventNamespace     = '.' + settings.namespace,\n                moduleNamespace    = 'module-' + namespace,\n\n                $module            = $(this),\n                $context           = contextCheck(settings.context, window),\n                $scrollContext     = contextCheck(settings.scrollContext, window),\n                $boundary          = contextCheck(settings.boundary, window),\n                $target            = settings.target ? contextCheck(settings.target, window) : $module,\n\n                $popup,\n                $offsetParent,\n\n                searchDepth        = 0,\n                triedPositions     = false,\n                openedWithTouch    = false,\n\n                element            = this,\n                instance           = $module.data(moduleNamespace),\n\n                documentObserver,\n                elementNamespace,\n                id,\n                module\n            ;\n\n            module = {\n\n                // binds events\n                initialize: function () {\n                    module.debug('Initializing', $module);\n                    module.createID();\n                    module.bind.events();\n                    if (!module.exists() && settings.preserve) {\n                        module.create();\n                    }\n                    if (settings.observeChanges) {\n                        module.observeChanges();\n                    }\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, instance)\n                    ;\n                },\n\n                observeChanges: function () {\n                    if ('MutationObserver' in window) {\n                        documentObserver = new MutationObserver(module.event.documentChanged);\n                        documentObserver.observe(document, {\n                            childList: true,\n                            subtree: true,\n                        });\n                        module.debug('Setting up mutation observer', documentObserver);\n                    }\n                },\n\n                refresh: function () {\n                    if (settings.popup) {\n                        $popup = $document.find(settings.popup).eq(0);\n                    } else {\n                        if (settings.inline) {\n                            $popup = $target.nextAll(selector.popup).eq(0);\n                            settings.popup = $popup;\n                        }\n                    }\n                    if (settings.popup) {\n                        module.set.invisible();\n                        $offsetParent = module.get.offsetParent();\n                        module.remove.invisible();\n                        if (settings.movePopup && module.has.popup() && module.get.offsetParent($popup)[0] !== $offsetParent[0]) {\n                            module.debug('Moving popup to the same offset parent as target');\n                            $popup\n                                .detach()\n                                .appendTo($offsetParent)\n                            ;\n                        }\n                    } else {\n                        $offsetParent = settings.inline\n                            ? module.get.offsetParent($target)\n                            : (module.has.popup()\n                                ? module.get.offsetParent($popup)\n                                : $body);\n                    }\n                    if ($offsetParent.is('html') && $offsetParent[0] !== $body[0]) {\n                        module.debug('Setting page as offset parent');\n                        $offsetParent = $body;\n                    }\n                    if (module.get.variation()) {\n                        module.set.variation();\n                    }\n                },\n\n                reposition: function () {\n                    module.refresh();\n                    module.set.position();\n                },\n\n                destroy: function () {\n                    module.debug('Destroying previous module');\n                    if (documentObserver) {\n                        documentObserver.disconnect();\n                    }\n                    // remove element only if was created dynamically\n                    if ($popup && !settings.preserve) {\n                        module.removePopup();\n                    }\n                    // clear all timeouts\n                    clearTimeout(module.hideTimer);\n                    clearTimeout(module.showTimer);\n                    // remove events\n                    module.unbind.close();\n                    module.unbind.events();\n                    $module\n                        .removeData(moduleNamespace)\n                    ;\n                },\n\n                event: {\n                    start: function (event) {\n                        var\n                            delay = $.isPlainObject(settings.delay)\n                                ? settings.delay.show\n                                : settings.delay\n                        ;\n                        clearTimeout(module.hideTimer);\n                        if (!openedWithTouch || (openedWithTouch && settings.addTouchEvents)) {\n                            module.showTimer = setTimeout(function () {\n                                module.show();\n                            }, delay);\n                        }\n                    },\n                    end: function () {\n                        var\n                            delay = $.isPlainObject(settings.delay)\n                                ? settings.delay.hide\n                                : settings.delay\n                        ;\n                        clearTimeout(module.showTimer);\n                        module.hideTimer = setTimeout(function () {\n                            module.hide();\n                        }, delay);\n                    },\n                    touchstart: function (event) {\n                        openedWithTouch = true;\n                        if (settings.addTouchEvents) {\n                            module.show();\n                        }\n                    },\n                    resize: function () {\n                        if (module.is.visible()) {\n                            module.set.position();\n                        }\n                    },\n                    documentChanged: function (mutations) {\n                        [].forEach.call(mutations, function (mutation) {\n                            if (mutation.removedNodes) {\n                                [].forEach.call(mutation.removedNodes, function (node) {\n                                    if (node === element || $(node).find(element).length > 0) {\n                                        module.debug('Element removed from DOM, tearing down events');\n                                        module.destroy();\n                                    }\n                                });\n                            }\n                        });\n                    },\n                    hideGracefully: function (event) {\n                        var\n                            $target = $(event.target),\n                            isInDOM = $.contains(document.documentElement, event.target),\n                            inPopup = $target.closest(selector.popup).length > 0\n                        ;\n                        // don't close on clicks inside popup\n                        if (event && !inPopup && isInDOM) {\n                            module.debug('Click occurred outside popup hiding popup');\n                            module.hide();\n                        } else {\n                            module.debug('Click was inside popup, keeping popup open');\n                        }\n                    },\n                },\n\n                // generates popup html from metadata\n                create: function () {\n                    var\n                        targetSibling = $target.next(selector.popup),\n                        contentFallback = !settings.popup && targetSibling.length === 0 ? $module.attr('title') : false,\n                        html      = module.get.html(),\n                        title     = module.get.title(),\n                        content   = module.get.content(contentFallback)\n                    ;\n\n                    if (html || content || title) {\n                        module.debug('Creating pop-up html');\n                        if (!html) {\n                            html = settings.templates.popup({\n                                title: title,\n                                content: content,\n                            });\n                        }\n                        $popup = $('<div/>')\n                            .addClass(className.popup)\n                            .data(metadata.activator, $module)\n                            .html(html)\n                        ;\n                        if (settings.inline) {\n                            module.verbose('Inserting popup element inline', $popup);\n                            $popup\n                                .insertAfter($module)\n                            ;\n                        } else {\n                            module.verbose('Appending popup element to body', $popup);\n                            $popup\n                                .appendTo($context)\n                            ;\n                        }\n                        module.refresh();\n                        module.set.variation();\n\n                        if (settings.hoverable) {\n                            module.bind.popup();\n                        }\n                        settings.onCreate.call($popup, element);\n                    } else if (settings.popup) {\n                        $document.find(settings.popup).data(metadata.activator, $module);\n                        module.verbose('Used popup specified in settings');\n                        module.refresh();\n                        if (settings.hoverable) {\n                            module.bind.popup();\n                        }\n                    } else if (targetSibling.length > 0) {\n                        module.verbose('Pre-existing popup found');\n                        settings.inline = true;\n                        settings.popup = targetSibling.data(metadata.activator, $module);\n                        module.refresh();\n                        if (settings.hoverable) {\n                            module.bind.popup();\n                        }\n                    } else {\n                        module.debug('No content specified skipping display', element);\n                    }\n                },\n\n                createID: function () {\n                    id = (Math.random().toString(16) + '000000000').slice(2, 10);\n                    elementNamespace = '.' + id;\n                    module.verbose('Creating unique id for element', id);\n                },\n\n                // determines popup state\n                toggle: function () {\n                    module.debug('Toggling pop-up');\n                    if (module.is.hidden()) {\n                        module.debug('Popup is hidden, showing pop-up');\n                        module.unbind.close();\n                        module.show();\n                    } else {\n                        module.debug('Popup is visible, hiding pop-up');\n                        module.hide();\n                    }\n                },\n\n                show: function (callback) {\n                    callback = callback || function () {};\n                    module.debug('Showing pop-up', settings.transition);\n                    if (module.is.hidden() && !(module.is.active() && module.is.dropdown())) {\n                        if (!module.exists()) {\n                            module.create();\n                        }\n                        if (settings.onShow.call($popup, element) === false) {\n                            module.debug('onShow callback returned false, cancelling popup animation');\n\n                            return;\n                        }\n                        if (!settings.preserve && !settings.popup) {\n                            module.refresh();\n                        }\n                        if ($popup && module.set.position()) {\n                            module.save.conditions();\n                            if (settings.exclusive) {\n                                module.hideAll();\n                            }\n                            module.animate.show(callback);\n                        }\n                    }\n                },\n\n                hide: function (callback) {\n                    callback = callback || function () {};\n                    if (module.is.visible() || module.is.animating()) {\n                        if (settings.onHide.call($popup, element) === false) {\n                            module.debug('onHide callback returned false, cancelling popup animation');\n\n                            return;\n                        }\n                        module.remove.visible();\n                        module.unbind.close();\n                        module.restore.conditions();\n                        module.animate.hide(callback);\n                    }\n                },\n\n                hideAll: function () {\n                    $document.find(selector.popup)\n                        .filter('.' + className.popupVisible)\n                        .each(function () {\n                            $(this)\n                                .data(metadata.activator)\n                                .popup('hide')\n                            ;\n                        })\n                    ;\n                },\n                exists: function () {\n                    if (!$popup) {\n                        return false;\n                    }\n                    if (settings.inline || settings.popup) {\n                        return module.has.popup();\n                    }\n\n                    return $popup.closest($context).length > 0;\n                },\n\n                removePopup: function () {\n                    if (module.has.popup() && !settings.popup) {\n                        module.debug('Removing popup', $popup);\n                        $popup.remove();\n                        $popup = undefined;\n                        settings.onRemove.call($popup, element);\n                    }\n                },\n\n                save: {\n                    conditions: function () {\n                        module.cache = {\n                            title: $module.attr('title'),\n                        };\n                        if (module.cache.title) {\n                            $module.removeAttr('title');\n                        }\n                        module.verbose('Saving original attributes', module.cache.title);\n                    },\n                },\n                restore: {\n                    conditions: function () {\n                        if (module.cache && module.cache.title) {\n                            $module.attr('title', module.cache.title);\n                            module.verbose('Restoring original attributes', module.cache.title);\n                        }\n\n                        return true;\n                    },\n                },\n                supports: {\n                    svg: function () {\n                        return typeof SVGGraphicsElement !== 'undefined';\n                    },\n                },\n                animate: {\n                    show: function (callback) {\n                        callback = isFunction(callback) ? callback : function () {};\n                        if (settings.transition && module.can.useElement('transition')) {\n                            module.set.visible();\n                            $popup\n                                .transition({\n                                    animation: (settings.transition.showMethod || settings.transition) + ' in',\n                                    queue: false,\n                                    debug: settings.debug,\n                                    verbose: settings.verbose,\n                                    silent: settings.silent,\n                                    duration: settings.transition.showDuration || settings.duration,\n                                    onComplete: function () {\n                                        module.bind.close();\n                                        callback.call($popup, element);\n                                        settings.onVisible.call($popup, element);\n                                    },\n                                })\n                            ;\n                        }\n                    },\n                    hide: function (callback) {\n                        callback = isFunction(callback) ? callback : function () {};\n                        module.debug('Hiding pop-up');\n                        if (settings.transition && $.fn.transition !== undefined) {\n                            $popup\n                                .transition({\n                                    animation: (settings.transition.hideMethod || settings.transition) + ' out',\n                                    queue: false,\n                                    duration: settings.transition.hideDuration || settings.duration,\n                                    debug: settings.debug,\n                                    verbose: settings.verbose,\n                                    silent: settings.silent,\n                                    onComplete: function () {\n                                        module.reset();\n                                        callback.call($popup, element);\n                                        settings.onHidden.call($popup, element);\n                                    },\n                                })\n                            ;\n                        } else {\n                            module.error(error.noTransition);\n                        }\n                    },\n                },\n\n                change: {\n                    content: function (html) {\n                        $popup.html(html);\n                    },\n                },\n\n                get: {\n                    html: function () {\n                        $module.removeData(metadata.html);\n\n                        return $module.data(metadata.html) || settings.html;\n                    },\n                    title: function () {\n                        $module.removeData(metadata.title);\n\n                        return $module.data(metadata.title) || settings.title;\n                    },\n                    content: function (fallback) {\n                        $module.removeData(metadata.content);\n\n                        return $module.data(metadata.content) || settings.content || fallback;\n                    },\n                    variation: function () {\n                        $module.removeData(metadata.variation);\n\n                        return $module.data(metadata.variation) || settings.variation;\n                    },\n                    popup: function () {\n                        return $popup;\n                    },\n                    popupOffset: function () {\n                        return $popup.offset();\n                    },\n                    calculations: function () {\n                        var\n                            $popupOffsetParent = module.get.offsetParent($popup),\n                            targetElement      = $target[0],\n                            isWindowEl         = $boundary[0] === window,\n                            targetOffset       = $target.offset(),\n                            parentOffset       = settings.inline || (settings.popup && settings.movePopup)\n                                ? $target.offsetParent().offset()\n                                : { top: 0, left: 0 },\n                            screenPosition = isWindowEl\n                                ? { top: 0, left: 0 }\n                                : $boundary.offset(),\n                            calculations   = {},\n                            scroll = isWindowEl\n                                ? { top: $window.scrollTop(), left: $window.scrollLeft() }\n                                : { top: 0, left: 0 },\n                            screen\n                        ;\n                        calculations = {\n                            // element which is launching popup\n                            target: {\n                                element: $target[0],\n                                width: $target.outerWidth(),\n                                height: $target.outerHeight(),\n                                top: targetOffset.top - parentOffset.top,\n                                left: targetOffset.left - parentOffset.left,\n                                margin: {},\n                            },\n                            // popup itself\n                            popup: {\n                                width: $popup.outerWidth(),\n                                height: $popup.outerHeight(),\n                            },\n                            // offset container (or 3d context)\n                            parent: {\n                                width: $offsetParent.outerWidth(),\n                                height: $offsetParent.outerHeight(),\n                            },\n                            // screen boundaries\n                            screen: {\n                                top: screenPosition.top,\n                                left: screenPosition.left,\n                                scroll: {\n                                    top: scroll.top,\n                                    left: scroll.left,\n                                },\n                                width: $boundary.width(),\n                                height: $boundary.height(),\n                            },\n                        };\n\n                        // if popup offset context is not same as target, then adjust calculations\n                        if ($popupOffsetParent[0] !== $offsetParent[0]) {\n                            var\n                                popupOffset        = $popupOffsetParent.offset()\n                            ;\n                            calculations.target.top -= popupOffset.top;\n                            calculations.target.left -= popupOffset.left;\n                            calculations.parent.width = $popupOffsetParent.outerWidth();\n                            calculations.parent.height = $popupOffsetParent.outerHeight();\n                        }\n\n                        // add in container calcs if fluid\n                        if (settings.setFluidWidth && module.is.fluid()) {\n                            calculations.container = {\n                                width: $popup.parent().outerWidth(),\n                            };\n                            calculations.popup.width = calculations.container.width;\n                        }\n\n                        // add in margins if inline\n                        calculations.target.margin.top = settings.inline\n                            ? parseInt(window.getComputedStyle(targetElement).getPropertyValue('margin-top'), 10)\n                            : 0;\n                        calculations.target.margin.left = settings.inline\n                            ? (module.is.rtl()\n                                ? parseInt(window.getComputedStyle(targetElement).getPropertyValue('margin-right'), 10)\n                                : parseInt(window.getComputedStyle(targetElement).getPropertyValue('margin-left'), 10))\n                            : 0;\n                        // calculate screen boundaries\n                        screen = calculations.screen;\n                        calculations.boundary = {\n                            top: screen.top + screen.scroll.top,\n                            bottom: screen.top + screen.scroll.top + screen.height,\n                            left: screen.left + screen.scroll.left,\n                            right: screen.left + screen.scroll.left + screen.width,\n                        };\n\n                        return calculations;\n                    },\n                    id: function () {\n                        return id;\n                    },\n                    startEvent: function () {\n                        if (settings.on === 'hover') {\n                            return 'mouseenter';\n                        }\n                        if (settings.on === 'focus') {\n                            return 'focus';\n                        }\n\n                        return false;\n                    },\n                    scrollEvent: function () {\n                        return 'scroll';\n                    },\n                    endEvent: function () {\n                        if (settings.on === 'hover') {\n                            return 'mouseleave';\n                        }\n                        if (settings.on === 'focus') {\n                            return 'blur';\n                        }\n\n                        return false;\n                    },\n                    distanceFromBoundary: function (offset, calculations) {\n                        var\n                            distanceFromBoundary = {},\n                            popup,\n                            boundary\n                        ;\n                        calculations = calculations || module.get.calculations();\n\n                        // shorthand\n                        popup = calculations.popup;\n                        boundary = calculations.boundary;\n\n                        if (offset) {\n                            distanceFromBoundary = {\n                                top: offset.top - boundary.top,\n                                left: offset.left - boundary.left,\n                                right: boundary.right - (offset.left + popup.width),\n                                bottom: boundary.bottom - (offset.top + popup.height),\n                            };\n                            module.verbose('Distance from boundaries determined', offset, distanceFromBoundary);\n                        }\n\n                        return distanceFromBoundary;\n                    },\n                    offsetParent: function ($element) {\n                        var\n                            element = $element !== undefined\n                                ? $element[0]\n                                : $target[0],\n                            parentNode = element.parentNode,\n                            $node    = $(parentNode)\n                        ;\n                        if (parentNode) {\n                            var\n                                is2D     = $node.css('transform') === 'none',\n                                isStatic = $node.css('position') === 'static',\n                                isBody   = $node.is('body')\n                            ;\n                            while (parentNode && !isBody && isStatic && is2D) {\n                                parentNode = parentNode.parentNode;\n                                $node = $(parentNode);\n                                is2D = $node.css('transform') === 'none';\n                                isStatic = $node.css('position') === 'static';\n                                isBody = $node.is('body');\n                            }\n                        }\n\n                        return $node && $node.length > 0\n                            ? $node\n                            : $();\n                    },\n                    positions: function () {\n                        return {\n                            'top left': false,\n                            'top center': false,\n                            'top right': false,\n                            'bottom left': false,\n                            'bottom center': false,\n                            'bottom right': false,\n                            'left center': false,\n                            'right center': false,\n                        };\n                    },\n                    nextPosition: function (position) {\n                        var\n                            positions          = position.split(' '),\n                            verticalPosition   = positions[0],\n                            horizontalPosition = positions[1],\n                            opposite = {\n                                top: 'bottom',\n                                bottom: 'top',\n                                left: 'right',\n                                right: 'left',\n                            },\n                            adjacent = {\n                                left: 'center',\n                                center: 'right',\n                                right: 'left',\n                            },\n                            backup = {\n                                'top left': 'top center',\n                                'top center': 'top right',\n                                'top right': 'right center',\n                                'right center': 'bottom right',\n                                'bottom right': 'bottom center',\n                                'bottom center': 'bottom left',\n                                'bottom left': 'left center',\n                                'left center': 'top left',\n                            },\n                            adjacentsAvailable = verticalPosition === 'top' || verticalPosition === 'bottom',\n                            oppositeTried = false,\n                            adjacentTried = false,\n                            nextPosition  = false\n                        ;\n                        if (!triedPositions) {\n                            module.verbose('All available positions available');\n                            triedPositions = module.get.positions();\n                        }\n\n                        module.debug('Recording last position tried', position);\n                        triedPositions[position] = true;\n\n                        if (settings.prefer === 'opposite') {\n                            nextPosition = [opposite[verticalPosition], horizontalPosition];\n                            nextPosition = nextPosition.join(' ');\n                            oppositeTried = triedPositions[nextPosition] === true;\n                            module.debug('Trying opposite strategy', nextPosition);\n                        }\n                        if ((settings.prefer === 'adjacent') && adjacentsAvailable) {\n                            nextPosition = [verticalPosition, adjacent[horizontalPosition]];\n                            nextPosition = nextPosition.join(' ');\n                            adjacentTried = triedPositions[nextPosition] === true;\n                            module.debug('Trying adjacent strategy', nextPosition);\n                        }\n                        if (adjacentTried || oppositeTried) {\n                            module.debug('Using backup position', nextPosition);\n                            nextPosition = backup[position];\n                        }\n\n                        return nextPosition;\n                    },\n                },\n\n                set: {\n                    position: function (position, calculations) {\n                        // exit conditions\n                        if ($target.length === 0 || $popup.length === 0) {\n                            module.error(error.notFound);\n\n                            return;\n                        }\n                        var\n                            offset,\n                            distanceAway,\n                            target,\n                            popup,\n                            parent,\n                            positioning,\n                            popupOffset,\n                            distanceFromBoundary\n                        ;\n\n                        calculations = calculations || module.get.calculations();\n                        position = position || $module.data(metadata.position) || settings.position;\n\n                        offset = $module.data(metadata.offset) || settings.offset;\n                        distanceAway = settings.distanceAway;\n\n                        // shorthand\n                        target = calculations.target;\n                        popup = calculations.popup;\n                        parent = calculations.parent;\n\n                        if (module.should.centerArrow(calculations)) {\n                            module.verbose('Adjusting offset to center arrow on small target element');\n                            if (position === 'top left' || position === 'bottom left') {\n                                offset += target.width / 2;\n                                offset -= settings.arrowPixelsFromEdge;\n                            }\n                            if (position === 'top right' || position === 'bottom right') {\n                                offset -= target.width / 2;\n                                offset += settings.arrowPixelsFromEdge;\n                            }\n                        }\n\n                        if (target.width === 0 && target.height === 0 && !module.is.svg(target.element)) {\n                            module.debug('Popup target is hidden, no action taken');\n\n                            return false;\n                        }\n\n                        if (settings.inline) {\n                            module.debug('Adding margin to calculation', target.margin);\n                            if (position === 'left center' || position === 'right center') {\n                                offset += target.margin.top;\n                                distanceAway += -target.margin.left;\n                            } else if (position === 'top left' || position === 'top center' || position === 'top right') {\n                                offset += target.margin.left;\n                                distanceAway -= target.margin.top;\n                            } else {\n                                offset += target.margin.left;\n                                distanceAway += target.margin.top;\n                            }\n                        }\n\n                        module.debug('Determining popup position from calculations', position, calculations);\n\n                        if (module.is.rtl()) {\n                            position = position.replace(/left|right/g, function (match) {\n                                return match === 'left'\n                                    ? 'right'\n                                    : 'left';\n                            });\n                            module.debug('RTL: Popup position updated', position);\n                        }\n\n                        // if last attempt use specified last resort position\n                        if (searchDepth === settings.maxSearchDepth && typeof settings.lastResort === 'string') {\n                            position = settings.lastResort;\n                        }\n\n                        switch (position) {\n                            case 'top left': {\n                                positioning = {\n                                    top: 'auto',\n                                    bottom: parent.height - target.top + distanceAway,\n                                    left: target.left + offset,\n                                    right: 'auto',\n                                };\n\n                                break;\n                            }\n                            case 'top center': {\n                                positioning = {\n                                    bottom: parent.height - target.top + distanceAway,\n                                    left: target.left + (target.width / 2) - (popup.width / 2) + offset,\n                                    top: 'auto',\n                                    right: 'auto',\n                                };\n\n                                break;\n                            }\n                            case 'top right': {\n                                positioning = {\n                                    bottom: parent.height - target.top + distanceAway,\n                                    right: parent.width - target.left - target.width - offset,\n                                    top: 'auto',\n                                    left: 'auto',\n                                };\n\n                                break;\n                            }\n                            case 'left center': {\n                                positioning = {\n                                    top: target.top + (target.height / 2) - (popup.height / 2) + offset,\n                                    right: parent.width - target.left + distanceAway,\n                                    left: 'auto',\n                                    bottom: 'auto',\n                                };\n\n                                break;\n                            }\n                            case 'right center': {\n                                positioning = {\n                                    top: target.top + (target.height / 2) - (popup.height / 2) + offset,\n                                    left: target.left + target.width + distanceAway,\n                                    bottom: 'auto',\n                                    right: 'auto',\n                                };\n\n                                break;\n                            }\n                            case 'bottom left': {\n                                positioning = {\n                                    top: target.top + target.height + distanceAway,\n                                    left: target.left + offset,\n                                    bottom: 'auto',\n                                    right: 'auto',\n                                };\n\n                                break;\n                            }\n                            case 'bottom center': {\n                                positioning = {\n                                    top: target.top + target.height + distanceAway,\n                                    left: target.left + (target.width / 2) - (popup.width / 2) + offset,\n                                    bottom: 'auto',\n                                    right: 'auto',\n                                };\n\n                                break;\n                            }\n                            case 'bottom right': {\n                                positioning = {\n                                    top: target.top + target.height + distanceAway,\n                                    right: parent.width - target.left - target.width - offset,\n                                    left: 'auto',\n                                    bottom: 'auto',\n                                };\n\n                                break;\n                            }\n                        }\n                        if (positioning === undefined) {\n                            module.error(error.invalidPosition, position);\n                        }\n\n                        module.debug('Calculated popup positioning values', positioning);\n\n                        // tentatively place on stage\n                        $popup\n                            .css(positioning)\n                            .removeClass(className.position)\n                            .addClass(position)\n                        ;\n                        module.set.invisible();\n\n                        popupOffset = module.get.popupOffset();\n\n                        // see if any boundaries are surpassed with this tentative position\n                        distanceFromBoundary = module.get.distanceFromBoundary(popupOffset, calculations);\n\n                        if (!settings.forcePosition && module.is.offstage(distanceFromBoundary, position)) {\n                            module.debug('Position is outside viewport', position);\n                            if (searchDepth < settings.maxSearchDepth) {\n                                searchDepth++;\n                                position = module.get.nextPosition(position);\n                                module.debug('Trying new position', position);\n\n                                return $popup\n                                    ? module.set.position(position, calculations)\n                                    : false;\n                            }\n                            if (settings.lastResort) {\n                                module.debug('No position found, showing with last position');\n                            } else {\n                                module.debug('Popup could not find a position to display', $popup);\n                                module.error(error.cannotPlace, element);\n                                module.remove.attempts();\n                                module.remove.invisible();\n                                module.reset();\n                                settings.onUnplaceable.call($popup, element);\n\n                                return false;\n                            }\n                        }\n                        module.debug('Position is on stage', position);\n                        module.remove.attempts();\n                        module.remove.invisible();\n                        if (settings.setFluidWidth && module.is.fluid()) {\n                            module.set.fluidWidth(calculations);\n                        }\n\n                        return true;\n                    },\n\n                    fluidWidth: function (calculations) {\n                        calculations = calculations || module.get.calculations();\n                        module.debug('Automatically setting element width to parent width', calculations.parent.width);\n                        $popup.css('width', calculations.container.width);\n                    },\n\n                    loading: function () {\n                        $popup.addClass(className.loading);\n                    },\n\n                    invisible: function () {\n                        $popup.addClass(className.invisible);\n                    },\n\n                    variation: function (variation) {\n                        variation = variation || module.get.variation();\n                        if (variation && module.has.popup()) {\n                            module.verbose('Adding variation to popup', variation);\n                            $popup.addClass(variation);\n                        }\n                    },\n\n                    visible: function () {\n                        $module.addClass(className.visible);\n                    },\n                },\n\n                remove: {\n                    loading: function () {\n                        $popup.removeClass(className.loading);\n                    },\n                    invisible: function () {\n                        $popup.removeClass(className.invisible);\n                    },\n                    variation: function (variation) {\n                        variation = variation || module.get.variation();\n                        if (variation) {\n                            module.verbose('Removing variation', variation);\n                            $popup.removeClass(variation);\n                        }\n                    },\n                    visible: function () {\n                        $module.removeClass(className.visible);\n                    },\n                    attempts: function () {\n                        module.verbose('Resetting all searched positions');\n                        searchDepth = 0;\n                        triedPositions = false;\n                    },\n                },\n\n                bind: {\n                    events: function () {\n                        module.debug('Binding popup events to module');\n                        if (settings.on === 'click') {\n                            $module\n                                .on(clickEvent + eventNamespace, module.toggle)\n                            ;\n                        }\n                        if (settings.on === 'hover') {\n                            $module\n                                .on('touchstart' + eventNamespace, module.event.touchstart)\n                            ;\n                        }\n                        if (module.get.startEvent()) {\n                            $module\n                                .on(module.get.startEvent() + eventNamespace, module.event.start)\n                                .on(module.get.endEvent() + eventNamespace, module.event.end)\n                            ;\n                        }\n                        if (settings.target) {\n                            module.debug('Target set to element', $target);\n                        }\n                        $window.on('resize' + elementNamespace, module.event.resize);\n                    },\n                    popup: function () {\n                        module.verbose('Allowing hover events on popup to prevent closing');\n                        if ($popup && module.has.popup()) {\n                            $popup\n                                .on('mouseenter' + eventNamespace, module.event.start)\n                                .on('mouseleave' + eventNamespace, module.event.end)\n                            ;\n                        }\n                    },\n                    close: function () {\n                        if (settings.hideOnScroll === true || (settings.hideOnScroll === 'auto' && settings.on !== 'click')) {\n                            module.bind.closeOnScroll();\n                        }\n                        if (module.is.closable()) {\n                            module.bind.clickaway();\n                        } else if (settings.on === 'hover' && openedWithTouch) {\n                            module.bind.touchClose();\n                        }\n                    },\n                    closeOnScroll: function () {\n                        module.verbose('Binding scroll close event to document');\n                        $scrollContext\n                            .one(module.get.scrollEvent() + elementNamespace, module.event.hideGracefully)\n                        ;\n                    },\n                    touchClose: function () {\n                        module.verbose('Binding popup touchclose event to document');\n                        $document\n                            .on('touchstart' + elementNamespace, function (event) {\n                                module.verbose('Touched away from popup');\n                                module.event.hideGracefully.call(element, event);\n                            })\n                        ;\n                    },\n                    clickaway: function () {\n                        module.verbose('Binding popup close event to document');\n                        $document\n                            .on(clickEvent + elementNamespace, function (event) {\n                                module.verbose('Clicked away from popup');\n                                module.event.hideGracefully.call(element, event);\n                            })\n                        ;\n                    },\n                },\n\n                unbind: {\n                    events: function () {\n                        $window\n                            .off(elementNamespace)\n                        ;\n                        $module\n                            .off(eventNamespace)\n                        ;\n                    },\n                    close: function () {\n                        $document\n                            .off(elementNamespace)\n                        ;\n                        $scrollContext\n                            .off(elementNamespace)\n                        ;\n                    },\n                },\n\n                can: {\n                    useElement: function (element) {\n                        if ($.fn[element] !== undefined) {\n                            return true;\n                        }\n                        module.error(error.noElement.replace('{element}', element));\n\n                        return false;\n                    },\n                },\n\n                has: {\n                    popup: function () {\n                        return $popup && $popup.length > 0;\n                    },\n                },\n\n                should: {\n                    centerArrow: function (calculations) {\n                        return !module.is.basic() && calculations.target.width <= (settings.arrowPixelsFromEdge * 2);\n                    },\n                },\n\n                is: {\n                    closable: function () {\n                        if (settings.closable === 'auto') {\n                            return settings.on !== 'hover';\n                        }\n\n                        return settings.closable;\n                    },\n                    offstage: function (distanceFromBoundary, position) {\n                        var\n                            offstage = []\n                        ;\n                        // return boundaries that have been surpassed\n                        $.each(distanceFromBoundary, function (direction, distance) {\n                            if (distance < -settings.jitter) {\n                                module.debug('Position exceeds allowable distance from edge', direction, distance, position);\n                                offstage.push(direction);\n                            }\n                        });\n\n                        return offstage.length > 0;\n                    },\n                    svg: function (element) {\n                        return module.supports.svg() && (element instanceof SVGGraphicsElement);\n                    },\n                    basic: function () {\n                        return $module.hasClass(className.basic);\n                    },\n                    active: function () {\n                        return $module.hasClass(className.active);\n                    },\n                    animating: function () {\n                        return $popup !== undefined && $popup.hasClass(className.animating);\n                    },\n                    fluid: function () {\n                        return $popup !== undefined && $popup.hasClass(className.fluid);\n                    },\n                    visible: function () {\n                        return $popup !== undefined && $popup.hasClass(className.popupVisible);\n                    },\n                    dropdown: function () {\n                        return $module.hasClass(className.dropdown);\n                    },\n                    hidden: function () {\n                        return !module.is.visible();\n                    },\n                    rtl: function () {\n                        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';\n                    },\n                },\n\n                reset: function () {\n                    module.remove.visible();\n                    if (settings.preserve) {\n                        if ($.fn.transition !== undefined) {\n                            $popup\n                                .transition('remove transition')\n                            ;\n                        }\n                    } else {\n                        module.removePopup();\n                    }\n                },\n\n                setting: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        settings[name] = value;\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.popup.settings = {\n\n        name: 'Popup',\n\n        // module settings\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n        namespace: 'popup',\n\n        // whether it should use dom mutation observers\n        observeChanges: true,\n\n        // callback only when element added to dom\n        onCreate: function () {},\n\n        // callback before element removed from dom\n        onRemove: function () {},\n\n        // callback before show animation\n        onShow: function () {},\n\n        // callback after show animation\n        onVisible: function () {},\n\n        // callback before hide animation\n        onHide: function () {},\n\n        // callback when popup cannot be positioned in visible screen\n        onUnplaceable: function () {},\n\n        // callback after hide animation\n        onHidden: function () {},\n\n        // when to show popup\n        on: 'hover',\n\n        // element to use to determine if popup is out of boundary\n        boundary: window,\n\n        // whether to add touchstart events when using hover\n        addTouchEvents: true,\n\n        // default position relative to element\n        position: 'top left',\n\n        // if given position should be used regardless if popup fits\n        forcePosition: false,\n\n        // name of variation to use\n        variation: '',\n\n        // whether popup should be moved to context\n        movePopup: true,\n\n        // element which popup should be relative to\n        target: false,\n\n        // jq selector or element that should be used as popup\n        popup: false,\n\n        // popup should remain inline next to activator\n        inline: false,\n\n        // popup should be removed from page on hide\n        preserve: false,\n\n        // popup should not close when being hovered on\n        hoverable: false,\n\n        // explicitly set content\n        content: false,\n\n        // explicitly set html\n        html: false,\n\n        // explicitly set title\n        title: false,\n\n        // whether automatically close on clickaway when on click\n        closable: true,\n\n        // automatically hide on scroll\n        hideOnScroll: 'auto',\n\n        // hide other popups on show\n        exclusive: false,\n\n        // context to attach popups\n        context: 'body',\n\n        // context for binding scroll events\n        scrollContext: window,\n\n        // position to prefer when calculating new position\n        prefer: 'opposite',\n\n        // specify position to appear even if it doesn't fit\n        lastResort: false,\n\n        // number of pixels from edge of popup to pointing arrow center (used from centering)\n        arrowPixelsFromEdge: 20,\n\n        // delay used to prevent accidental refiring of animations due to user error\n        delay: {\n            show: 50,\n            hide: 70,\n        },\n\n        // whether fluid variation should assign width explicitly\n        setFluidWidth: true,\n\n        // transition settings\n        duration: 200,\n        transition: 'scale',\n\n        // distance away from activating element in px\n        distanceAway: 0,\n\n        // number of pixels an element is allowed to be \"offstage\" for a position to be chosen (allows for rounding)\n        jitter: 2,\n\n        // offset on aligning axis from calculated position\n        offset: 0,\n\n        // maximum times to look for a position before failing (9 positions total)\n        maxSearchDepth: 15,\n\n        error: {\n            invalidPosition: 'The position you specified is not a valid position',\n            cannotPlace: 'Popup does not fit within the boundaries of the viewport',\n            method: 'The method you called is not defined.',\n            noElement: 'This module requires ui {element}',\n            notFound: 'The target or popup you specified does not exist on the page',\n        },\n\n        metadata: {\n            activator: 'activator',\n            content: 'content',\n            html: 'html',\n            offset: 'offset',\n            position: 'position',\n            title: 'title',\n            variation: 'variation',\n        },\n\n        className: {\n            active: 'active',\n            basic: 'basic',\n            animating: 'animating',\n            dropdown: 'dropdown',\n            invisible: 'invisible',\n            fluid: 'fluid',\n            loading: 'loading',\n            popup: 'ui popup',\n            position: 'top left center bottom right',\n            visible: 'visible',\n            popupVisible: 'visible',\n        },\n\n        selector: {\n            popup: '.ui.popup',\n        },\n\n        templates: {\n            escape: function (string) {\n                var\n                    badChars     = /[\"'<>`]/g,\n                    shouldEscape = /[\"&'<>`]/,\n                    escape       = {\n                        '<': '&lt;',\n                        '>': '&gt;',\n                        '\"': '&quot;',\n                        \"'\": '&#x27;',\n                        '`': '&#x60;',\n                    },\n                    escapedChar  = function (chr) {\n                        return escape[chr];\n                    }\n                ;\n                if (shouldEscape.test(string)) {\n                    string = string.replace(/&(?![\\d#a-z]{1,12};)/gi, '&amp;');\n\n                    return string.replace(badChars, escapedChar);\n                }\n\n                return string;\n            },\n            popup: function (text) {\n                var\n                    html   = '',\n                    escape = $.fn.popup.settings.templates.escape\n                ;\n                if (text !== undefined) {\n                    if (text.title) {\n                        text.title = escape(text.title);\n                        html += '<div class=\"header\">' + text.title + '</div>';\n                    }\n                    if (text.content) {\n                        text.content = escape(text.content);\n                        html += '<div class=\"content\">' + text.content + '</div>';\n                    }\n                }\n\n                return html;\n            },\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/progress.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Progress\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Progress\n*******************************/\n\n.ui.progress {\n  position: relative;\n  display: flex;\n  max-width: 100%;\n  border: none;\n  margin: 1em 0 2.5em;\n  box-shadow: none;\n  background: rgba(0, 0, 0, 0.1);\n  padding: 0;\n  border-radius: 0.28571429rem;\n}\n.ui.basic.progress {\n  background: transparent;\n  border: none;\n  box-shadow: none;\n}\n.ui.progress:first-child {\n  margin: 0 0 2.5em;\n}\n.ui.progress:last-child {\n  margin: 0 0 1.5em;\n}\n\n\n/*******************************\n            Content\n*******************************/\n\n\n/* Activity Bar */\n.ui.progress .bar {\n  display: block;\n  line-height: 1;\n  position: relative;\n  width: 0;\n  background: #888;\n  border-radius: 0.28571429rem;\n  transition: width 0.1s ease, background-color 0.1s ease;\n  overflow: hidden;\n}\n.ui.progress .bar:not(:empty) {\n  min-width: 2.5em;\n}\n.ui.ui.ui.progress:not([data-percent]):not(.indeterminate) .bar:not(:empty),\n.ui.ui.ui.progress[data-percent=\"0\"]:not(.indeterminate) .bar:not(:empty) {\n  background: transparent;\n}\n.ui.progress[data-percent=\"0\"] .bar .progress {\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.inverted.progress[data-percent=\"0\"] .bar .progress {\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* Percent Complete */\n.ui.progress .bar > .progress {\n  white-space: nowrap;\n  position: absolute;\n  width: auto;\n  font-size: 0.92857143em;\n  top: 50%;\n  right: 0.5em;\n  left: auto;\n  bottom: auto;\n  color: rgba(255, 255, 255, 0.7);\n  text-shadow: none;\n  margin-top: -0.5em;\n  font-weight: bold;\n  text-align: left;\n}\n.ui.right.aligned.progress {\n  justify-content: flex-end;\n}\n.ui.right.aligned.progress .bar > .progress {\n  left: 0.5em;\n  right: auto;\n}\n\n/* Label */\n.ui.progress > .label {\n  position: absolute;\n  width: 100%;\n  font-size: 1em;\n  top: 100%;\n  right: auto;\n  left: 0;\n  bottom: auto;\n  color: rgba(0, 0, 0, 0.87);\n  font-weight: bold;\n  text-shadow: none;\n  margin-top: 0.2em;\n  text-align: center;\n  transition: color 0.4s ease;\n}\n\n\n/*******************************\n            Types\n*******************************/\n\n\n/* Indicating */\n.ui.indicating.progress[data-percent^=\"1\"] .bar,\n.ui.indicating.progress[data-percent^=\"2\"] .bar {\n  background-color: #d95c5c;\n}\n.ui.indicating.progress[data-percent^=\"3\"] .bar {\n  background-color: #efbc72;\n}\n.ui.indicating.progress[data-percent^=\"4\"] .bar,\n.ui.indicating.progress[data-percent^=\"5\"] .bar {\n  background-color: #e6bb48;\n}\n.ui.indicating.progress[data-percent^=\"6\"] .bar {\n  background-color: #ddc928;\n}\n.ui.indicating.progress[data-percent^=\"7\"] .bar,\n.ui.indicating.progress[data-percent^=\"8\"] .bar {\n  background-color: #b4d95c;\n}\n.ui.indicating.progress[data-percent^=\"9\"] .bar,\n.ui.indicating.progress[data-percent^=\"100\"] .bar {\n  background-color: #66da81;\n}\n\n/* Indicating Label */\n.ui.indicating.progress[data-percent^=\"1\"] .label,\n.ui.indicating.progress[data-percent^=\"2\"] .label {\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.indicating.progress[data-percent^=\"3\"] .label {\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.indicating.progress[data-percent^=\"4\"] .label,\n.ui.indicating.progress[data-percent^=\"5\"] .label {\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.indicating.progress[data-percent^=\"6\"] .label {\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.indicating.progress[data-percent^=\"7\"] .label,\n.ui.indicating.progress[data-percent^=\"8\"] .label {\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.indicating.progress[data-percent^=\"9\"] .label,\n.ui.indicating.progress[data-percent^=\"100\"] .label {\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* Inverted Indicating Label */\n.ui.inverted.indicating.progress[data-percent^=\"1\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"2\"] .label {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.indicating.progress[data-percent^=\"3\"] .label {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.indicating.progress[data-percent^=\"4\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"5\"] .label {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.indicating.progress[data-percent^=\"6\"] .label {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.indicating.progress[data-percent^=\"7\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"8\"] .label {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.indicating.progress[data-percent^=\"9\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"100\"] .label {\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* Single Digits */\n.ui.indicating.progress[data-percent=\"1\"] .bar,\n.ui.indicating.progress[data-percent^=\"1.\"] .bar,\n.ui.indicating.progress[data-percent=\"2\"] .bar,\n.ui.indicating.progress[data-percent^=\"2.\"] .bar,\n.ui.indicating.progress[data-percent=\"3\"] .bar,\n.ui.indicating.progress[data-percent^=\"3.\"] .bar,\n.ui.indicating.progress[data-percent=\"4\"] .bar,\n.ui.indicating.progress[data-percent^=\"4.\"] .bar,\n.ui.indicating.progress[data-percent=\"5\"] .bar,\n.ui.indicating.progress[data-percent^=\"5.\"] .bar,\n.ui.indicating.progress[data-percent=\"6\"] .bar,\n.ui.indicating.progress[data-percent^=\"6.\"] .bar,\n.ui.indicating.progress[data-percent=\"7\"] .bar,\n.ui.indicating.progress[data-percent^=\"7.\"] .bar,\n.ui.indicating.progress[data-percent=\"8\"] .bar,\n.ui.indicating.progress[data-percent^=\"8.\"] .bar,\n.ui.indicating.progress[data-percent=\"9\"] .bar,\n.ui.indicating.progress[data-percent^=\"9.\"] .bar {\n  background-color: #d95c5c;\n}\n.ui.indicating.progress[data-percent=\"0\"] .label,\n.ui.indicating.progress[data-percent^=\"0.\"] .label,\n.ui.indicating.progress[data-percent=\"1\"] .label,\n.ui.indicating.progress[data-percent^=\"1.\"] .label,\n.ui.indicating.progress[data-percent=\"2\"] .label,\n.ui.indicating.progress[data-percent^=\"2.\"] .label,\n.ui.indicating.progress[data-percent=\"3\"] .label,\n.ui.indicating.progress[data-percent^=\"3.\"] .label,\n.ui.indicating.progress[data-percent=\"4\"] .label,\n.ui.indicating.progress[data-percent^=\"4.\"] .label,\n.ui.indicating.progress[data-percent=\"5\"] .label,\n.ui.indicating.progress[data-percent^=\"5.\"] .label,\n.ui.indicating.progress[data-percent=\"6\"] .label,\n.ui.indicating.progress[data-percent^=\"6.\"] .label,\n.ui.indicating.progress[data-percent=\"7\"] .label,\n.ui.indicating.progress[data-percent^=\"7.\"] .label,\n.ui.indicating.progress[data-percent=\"8\"] .label,\n.ui.indicating.progress[data-percent^=\"8.\"] .label,\n.ui.indicating.progress[data-percent=\"9\"] .label,\n.ui.indicating.progress[data-percent^=\"9.\"] .label {\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.inverted.indicating.progress[data-percent=\"0\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"0.\"] .label,\n.ui.inverted.indicating.progress[data-percent=\"1\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"1.\"] .label,\n.ui.inverted.indicating.progress[data-percent=\"2\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"2.\"] .label,\n.ui.inverted.indicating.progress[data-percent=\"3\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"3.\"] .label,\n.ui.inverted.indicating.progress[data-percent=\"4\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"4.\"] .label,\n.ui.inverted.indicating.progress[data-percent=\"5\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"5.\"] .label,\n.ui.inverted.indicating.progress[data-percent=\"6\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"6.\"] .label,\n.ui.inverted.indicating.progress[data-percent=\"7\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"7.\"] .label,\n.ui.inverted.indicating.progress[data-percent=\"8\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"8.\"] .label,\n.ui.inverted.indicating.progress[data-percent=\"9\"] .label,\n.ui.inverted.indicating.progress[data-percent^=\"9.\"] .label {\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* Indicating Success */\n.ui.ui.indicating.progress.success .label {\n  color: #1a531b;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n\n/* --------------\n         Success\n    --------------- */\n.ui.ui.progress.success .bar {\n  background-color: #21ba45;\n}\n.ui.ui.progress.success .bar,\n.ui.ui.progress.success .bar::after {\n  animation: none;\n}\n.ui.progress.success > .label {\n  color: #1a531b;\n}\n\n/* --------------\n         Warning\n    --------------- */\n.ui.ui.progress.warning .bar {\n  background-color: #f2c037;\n}\n.ui.ui.progress.warning .bar,\n.ui.ui.progress.warning .bar::after {\n  animation: none;\n}\n.ui.progress.warning > .label {\n  color: #794b02;\n}\n\n/* --------------\n         Error\n    --------------- */\n.ui.ui.progress.error .bar {\n  background-color: #db2828;\n}\n.ui.ui.progress.error .bar,\n.ui.ui.progress.error .bar::after {\n  animation: none;\n}\n.ui.progress.error > .label {\n  color: #912d2b;\n}\n\n/* --------------\n         Active\n    --------------- */\n.ui.active.progress .bar {\n  position: relative;\n}\n.ui.active.progress .bar:not(:empty) {\n  min-width: 2.5em;\n}\n.ui.active.progress .bar::after {\n  content: \"\";\n  opacity: 0;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: #fff;\n  border-radius: 0.28571429rem;\n  animation: progress-active 2s ease infinite;\n  transform-origin: left;\n}\n.ui.active.right.aligned.progress .bar::after {\n  transform-origin: right;\n}\n@keyframes progress-active {\n  0% {\n    opacity: 0.3;\n    transform: scale(0, 1);\n  }\n  100% {\n    opacity: 0;\n    transform: scale(1);\n  }\n}\n\n/* --------------\n        Disabled\n    --------------- */\n.ui.disabled.progress {\n  opacity: 0.35;\n}\n.ui.ui.disabled.progress .bar,\n.ui.ui.disabled.progress .bar::after {\n  animation: none;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n        Inverted\n    --------------- */\n.ui.inverted.progress:not(.basic) {\n  background: rgba(255, 255, 255, 0.08);\n  border: none;\n}\n.ui.inverted.progress .bar {\n  background: #888;\n}\n.ui.inverted.progress .bar > .progress {\n  color: #1b1c1d;\n}\n.ui.inverted.progress > .label {\n  color: #fff;\n}\n.ui.inverted.progress.success > .label {\n  color: #21ba45;\n}\n.ui.inverted.progress.warning > .label {\n  color: #f2c037;\n}\n.ui.inverted.progress.error > .label {\n  color: #db2828;\n}\n\n/* --------------\n        Attached\n    --------------- */\n\n/* bottom attached */\n.ui.progress.attached {\n  background: transparent;\n  position: relative;\n  border: none;\n  margin: 0;\n}\n.ui.progress.attached,\n.ui.progress.attached .bar {\n  height: 0.2rem;\n  padding: 0;\n  overflow: hidden;\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui.progress.attached .bar {\n  border-radius: 0;\n}\n\n/* top attached */\n.ui.progress.top.attached,\n.ui.progress.top.attached .bar {\n  top: 0;\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.progress.top.attached .bar {\n  border-radius: 0;\n}\n\n/* Coupling */\n.ui.segment > .ui.attached.progress,\n.ui.card > .ui.attached.progress {\n  position: absolute;\n  top: auto;\n  left: 0;\n  bottom: 100%;\n  width: 100%;\n}\n.ui.segment > .ui.bottom.attached.progress,\n.ui.card > .ui.bottom.attached.progress {\n  top: 100%;\n  bottom: auto;\n}\n\n/* --------------\n     Colors\n--------------- */\n.ui.indeterminate.primary.progress .bar::before,\n.ui.primary.progress .bar,\n.ui.progress .primary.bar {\n  background-color: #2185d0;\n}\n.ui.inverted.indeterminate.primary.progress .bar::before,\n.ui.primary.inverted.progress .bar,\n.ui.inverted.progress .primary.bar {\n  background-color: #54c8ff;\n}\n.ui.indeterminate.secondary.progress .bar::before,\n.ui.secondary.progress .bar,\n.ui.progress .secondary.bar {\n  background-color: #1b1c1d;\n}\n.ui.inverted.indeterminate.secondary.progress .bar::before,\n.ui.secondary.inverted.progress .bar,\n.ui.inverted.progress .secondary.bar {\n  background-color: #545454;\n}\n.ui.indeterminate.red.progress .bar::before,\n.ui.red.progress .bar,\n.ui.progress .red.bar {\n  background-color: #db2828;\n}\n.ui.inverted.indeterminate.red.progress .bar::before,\n.ui.red.inverted.progress .bar,\n.ui.inverted.progress .red.bar {\n  background-color: #ff695e;\n}\n.ui.indeterminate.orange.progress .bar::before,\n.ui.orange.progress .bar,\n.ui.progress .orange.bar {\n  background-color: #f2711c;\n}\n.ui.inverted.indeterminate.orange.progress .bar::before,\n.ui.orange.inverted.progress .bar,\n.ui.inverted.progress .orange.bar {\n  background-color: #ff851b;\n}\n.ui.indeterminate.yellow.progress .bar::before,\n.ui.yellow.progress .bar,\n.ui.progress .yellow.bar {\n  background-color: #fbbd08;\n}\n.ui.inverted.indeterminate.yellow.progress .bar::before,\n.ui.yellow.inverted.progress .bar,\n.ui.inverted.progress .yellow.bar {\n  background-color: #ffe21f;\n}\n.ui.indeterminate.olive.progress .bar::before,\n.ui.olive.progress .bar,\n.ui.progress .olive.bar {\n  background-color: #b5cc18;\n}\n.ui.inverted.indeterminate.olive.progress .bar::before,\n.ui.olive.inverted.progress .bar,\n.ui.inverted.progress .olive.bar {\n  background-color: #d9e778;\n}\n.ui.indeterminate.green.progress .bar::before,\n.ui.green.progress .bar,\n.ui.progress .green.bar {\n  background-color: #21ba45;\n}\n.ui.inverted.indeterminate.green.progress .bar::before,\n.ui.green.inverted.progress .bar,\n.ui.inverted.progress .green.bar {\n  background-color: #2ecc40;\n}\n.ui.indeterminate.teal.progress .bar::before,\n.ui.teal.progress .bar,\n.ui.progress .teal.bar {\n  background-color: #00b5ad;\n}\n.ui.inverted.indeterminate.teal.progress .bar::before,\n.ui.teal.inverted.progress .bar,\n.ui.inverted.progress .teal.bar {\n  background-color: #6dffff;\n}\n.ui.indeterminate.blue.progress .bar::before,\n.ui.blue.progress .bar,\n.ui.progress .blue.bar {\n  background-color: #2185d0;\n}\n.ui.inverted.indeterminate.blue.progress .bar::before,\n.ui.blue.inverted.progress .bar,\n.ui.inverted.progress .blue.bar {\n  background-color: #54c8ff;\n}\n.ui.indeterminate.violet.progress .bar::before,\n.ui.violet.progress .bar,\n.ui.progress .violet.bar {\n  background-color: #6435c9;\n}\n.ui.inverted.indeterminate.violet.progress .bar::before,\n.ui.violet.inverted.progress .bar,\n.ui.inverted.progress .violet.bar {\n  background-color: #a291fb;\n}\n.ui.indeterminate.purple.progress .bar::before,\n.ui.purple.progress .bar,\n.ui.progress .purple.bar {\n  background-color: #a333c8;\n}\n.ui.inverted.indeterminate.purple.progress .bar::before,\n.ui.purple.inverted.progress .bar,\n.ui.inverted.progress .purple.bar {\n  background-color: #dc73ff;\n}\n.ui.indeterminate.pink.progress .bar::before,\n.ui.pink.progress .bar,\n.ui.progress .pink.bar {\n  background-color: #e03997;\n}\n.ui.inverted.indeterminate.pink.progress .bar::before,\n.ui.pink.inverted.progress .bar,\n.ui.inverted.progress .pink.bar {\n  background-color: #ff8edf;\n}\n.ui.indeterminate.brown.progress .bar::before,\n.ui.brown.progress .bar,\n.ui.progress .brown.bar {\n  background-color: #a5673f;\n}\n.ui.inverted.indeterminate.brown.progress .bar::before,\n.ui.brown.inverted.progress .bar,\n.ui.inverted.progress .brown.bar {\n  background-color: #d67c1c;\n}\n.ui.indeterminate.grey.progress .bar::before,\n.ui.grey.progress .bar,\n.ui.progress .grey.bar {\n  background-color: #767676;\n}\n.ui.inverted.indeterminate.grey.progress .bar::before,\n.ui.grey.inverted.progress .bar,\n.ui.inverted.progress .grey.bar {\n  background-color: #dcddde;\n}\n.ui.indeterminate.black.progress .bar::before,\n.ui.black.progress .bar,\n.ui.progress .black.bar {\n  background-color: #1b1c1d;\n}\n.ui.inverted.indeterminate.black.progress .bar::before,\n.ui.black.inverted.progress .bar,\n.ui.inverted.progress .black.bar {\n  background-color: #545454;\n}\n\n/* --------------\n     Sizes\n--------------- */\n.ui.progress {\n  font-size: 1rem;\n}\n.ui.progress .bar {\n  height: 1.75em;\n}\n.ui.mini.progress {\n  font-size: 0.78571429rem;\n}\n.ui.mini.progress .bar {\n  height: 0.3em;\n}\n.ui.tiny.progress {\n  font-size: 0.85714286rem;\n}\n.ui.tiny.progress .bar {\n  height: 0.5em;\n}\n.ui.small.progress {\n  font-size: 0.92857143rem;\n}\n.ui.small.progress .bar {\n  height: 1em;\n}\n.ui.large.progress {\n  font-size: 1.14285714rem;\n}\n.ui.large.progress .bar {\n  height: 2.5em;\n}\n.ui.big.progress {\n  font-size: 1.28571429rem;\n}\n.ui.big.progress .bar {\n  height: 3.5em;\n}\n.ui.huge.progress {\n  font-size: 1.42857143rem;\n}\n.ui.huge.progress .bar {\n  height: 4em;\n}\n.ui.massive.progress {\n  font-size: 1.71428571rem;\n}\n.ui.massive.progress .bar {\n  height: 5em;\n}\n\n/* ---------------\n      Indeterminate\n    ---------------- */\n.ui.indeterminate.progress .bar {\n  width: 100%;\n}\n.ui.indeterminate.progress .bar .progress,\n.ui.progress .bar .centered.progress {\n  text-align: center;\n  position: relative;\n  right: 0;\n}\n.ui.indeterminate.progress .bar::before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  border-radius: 0.28571429rem;\n  animation: progress-pulsating 2s ease infinite;\n  transform-origin: center;\n  width: 100%;\n}\n.ui.slow.indeterminate.progress .bar::before {\n  animation-duration: 4s;\n}\n.ui.fast.indeterminate.progress .bar::before {\n  animation-duration: 1s;\n}\n.ui.swinging.indeterminate.progress .bar::before {\n  transform-origin: left;\n  animation-name: progress-swinging;\n}\n.ui.sliding.indeterminate.progress .bar::before {\n  transform-origin: left;\n  animation-name: progress-sliding;\n}\n.ui.filling.indeterminate.progress .bar::before {\n  animation-name: progress-filling;\n}\n.ui.indeterminate.progress:not(.sliding):not(.filling):not(.swinging) .bar::before {\n  background: #fff;\n}\n.ui.sliding.indeterminate.progress .bar,\n.ui.swinging.indeterminate.progress .bar,\n.ui.filling.indeterminate.progress .bar {\n  background: rgba(0, 0, 0, 0.1);\n}\n.ui.sliding.indeterminate.progress .bar .progress,\n.ui.swinging.indeterminate.progress .bar .progress {\n  color: #1b1c1d;\n}\n.ui.inverted.sliding.indeterminate.progress .bar,\n.ui.inverted.swinging.indeterminate.progress .bar,\n.ui.inverted.filling.indeterminate.progress .bar {\n  background: rgba(255, 255, 255, 0.08);\n}\n.ui.inverted.sliding.indeterminate.progress .bar .progress,\n.ui.inverted.swinging.indeterminate.progress .bar .progress {\n  color: rgba(255, 255, 255, 0.7);\n}\n@keyframes progress-swinging {\n  0%,\n  100% {\n    width: 10%;\n    left: -25%;\n  }\n  25%,\n  65% {\n    width: 70%;\n  }\n  50% {\n    width: 10%;\n    left: 100%;\n  }\n}\n@keyframes progress-sliding {\n  0% {\n    width: 10%;\n    left: -25%;\n  }\n  50% {\n    width: 70%;\n  }\n  100% {\n    width: 10%;\n    left: 100%;\n  }\n}\n@keyframes progress-filling {\n  0% {\n    transform: scale(0, 1);\n  }\n  80% {\n    transform: scale(1);\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes progress-pulsating {\n  0% {\n    transform: scale(0, 1);\n    opacity: 0.7;\n  }\n  100% {\n    transform: scale(1);\n    opacity: 0;\n  }\n}\n\n\n/*******************************\n            Progress\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/progress.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Progress\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.progress = function (parameters) {\n        var\n            $allModules    = $(this),\n\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n\n            returnedValue\n        ;\n\n        $allModules.each(function () {\n            var\n                settings          = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.progress.settings, parameters)\n                    : $.extend({}, $.fn.progress.settings),\n\n                className       = settings.className,\n                metadata        = settings.metadata,\n                namespace       = settings.namespace,\n                selector        = settings.selector,\n                error           = settings.error,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                $module         = $(this),\n                $bars           = $(this).find(selector.bar),\n                $progresses     = $(this).find(selector.progress),\n                $label          = $(this).find(selector.label),\n\n                element         = this,\n                instance        = $module.data(moduleNamespace),\n\n                animating = false,\n                module\n            ;\n            module = {\n                helper: {\n                    sum: function (nums) {\n                        return Array.isArray(nums) ? nums.reduce(function (left, right) {\n                            return left + Number(right);\n                        }, 0) : 0;\n                    },\n                    /**\n       * Derive precision for multiple progress with total and values.\n       *\n       * This helper dervices a precision that is sufficiently large to show minimum value of multiple progress.\n       *\n       * Example1\n       * - total: 1122\n       * - values: [325, 111, 74, 612]\n       * - min ratio: 74/1122 = 0.0659...\n       * - required precision:  100\n       *\n       * Example2\n       * - total: 10541\n       * - values: [3235, 1111, 74, 6121]\n       * - min ratio: 74/10541 = 0.0070...\n       * - required precision:   1000\n       *\n       * @param min A minimum value within multiple values\n       * @param total A total amount of multiple values\n       * @returns {number} A precision. Could be 1, 10, 100, ... 1e+10.\n       */\n                    derivePrecision: function (min, total) {\n                        var precisionPower = 0;\n                        var precision = 1;\n                        var ratio = min / total;\n                        while (precisionPower < 10) {\n                            ratio *= precision;\n                            if (ratio > 1) {\n                                break;\n                            }\n                            precision = Math.pow(10, precisionPower++);\n                        }\n\n                        return precision;\n                    },\n                    forceArray: function (element) {\n                        return Array.isArray(element)\n                            ? element\n                            : (!isNaN(element)\n                                ? [element]\n                                : (typeof element === 'string' ? element.split(',') : [])); // eslint-disable-line unicorn/no-nested-ternary\n                    },\n                },\n\n                initialize: function () {\n                    module.set.duration();\n                    module.debug(element);\n\n                    module.read.metadata();\n                    module.read.settings();\n\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of progress', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n                destroy: function () {\n                    module.verbose('Destroying previous progress for', $module);\n                    clearInterval(instance.interval);\n                    module.remove.state();\n                    $module.removeData(moduleNamespace);\n                    instance = undefined;\n                },\n\n                reset: function () {\n                    module.remove.nextValue();\n                    module.update.progress(0);\n                },\n\n                complete: function (keepState) {\n                    if (module.percent === undefined || module.percent < 100) {\n                        module.remove.progressPoll();\n                        if (keepState !== true) {\n                            module.set.percent(100);\n                        }\n                    }\n                },\n\n                read: {\n                    metadata: function () {\n                        var\n                            data = {\n                                percent: module.helper.forceArray($module.data(metadata.percent)),\n                                total: $module.data(metadata.total),\n                                value: module.helper.forceArray($module.data(metadata.value)),\n                            }\n                        ;\n                        if (data.total !== undefined) {\n                            module.debug('Total value set from metadata', data.total);\n                            module.set.total(data.total);\n                        }\n                        if (data.value.length > 0) {\n                            module.debug('Current value set from metadata', data.value);\n                            module.set.value(data.value);\n                            module.set.progress(data.value);\n                        }\n                        if (data.percent.length > 0) {\n                            module.debug('Current percent value set from metadata', data.percent);\n                            module.set.percent(data.percent);\n                        }\n                    },\n                    settings: function () {\n                        if (settings.total !== false) {\n                            module.debug('Current total set in settings', settings.total);\n                            module.set.total(settings.total);\n                        }\n                        if (settings.value !== false) {\n                            module.debug('Current value set in settings', settings.value);\n                            module.set.value(settings.value);\n                            module.set.progress(module.value);\n                        }\n                        if (settings.percent !== false) {\n                            module.debug('Current percent set in settings', settings.percent);\n                            module.set.percent(settings.percent);\n                        }\n                    },\n                },\n\n                bind: {\n                    transitionEnd: function (callback) {\n                        $bars\n                            .one('transitionend' + eventNamespace, function (event) {\n                                clearTimeout(module.failSafeTimer);\n                                callback.call(this, event);\n                            })\n                        ;\n                        module.failSafeTimer = setTimeout(function () {\n                            $bars.triggerHandler('transitionend');\n                        }, settings.duration + settings.failSafeDelay);\n                        module.verbose('Adding fail safe timer', module.timer);\n                    },\n                },\n\n                increment: function (incrementValue) {\n                    var\n                        startValue,\n                        newValue\n                    ;\n                    if (module.has.total()) {\n                        startValue = module.get.value();\n                        incrementValue = incrementValue || 1;\n                    } else {\n                        startValue = module.get.percent();\n                        incrementValue = incrementValue || module.get.randomValue();\n                    }\n                    newValue = startValue + incrementValue;\n                    module.debug('Incrementing percentage by', startValue, newValue, incrementValue);\n                    newValue = module.get.normalizedValue(newValue);\n                    module.set.progress(newValue);\n                },\n                decrement: function (decrementValue) {\n                    var\n                        total     = module.get.total(),\n                        startValue,\n                        newValue\n                    ;\n                    if (total) {\n                        startValue = module.get.value();\n                        decrementValue = decrementValue || 1;\n                        newValue = startValue - decrementValue;\n                        module.debug('Decrementing value by', decrementValue, startValue);\n                    } else {\n                        startValue = module.get.percent();\n                        decrementValue = decrementValue || module.get.randomValue();\n                        newValue = startValue - decrementValue;\n                        module.debug('Decrementing percentage by', decrementValue, startValue);\n                    }\n                    newValue = module.get.normalizedValue(newValue);\n                    module.set.progress(newValue);\n                },\n\n                has: {\n                    progressPoll: function () {\n                        return module.progressPoll;\n                    },\n                    total: function () {\n                        return module.get.total() !== false;\n                    },\n                },\n\n                get: {\n                    text: function (templateText, index) {\n                        if (!index) {\n                            index = 0;\n                        }\n\n                        var\n                            value   = module.get.value(index),\n                            total   = module.get.total(),\n                            percent = animating\n                                ? module.get.displayPercent(index)\n                                : module.get.percent(index),\n                            left = total !== false\n                                ? Math.max(0, total - value)\n                                : 100 - percent\n                        ;\n                        templateText = templateText || '';\n                        templateText = templateText\n                            .replace('{value}', value)\n                            .replace('{total}', total || 0)\n                            .replace('{left}', left)\n                            .replace('{percent}', percent)\n                            .replace('{bar}', settings.text.bars[index] || '')\n                        ;\n                        module.verbose('Adding variables to progress bar text', templateText);\n\n                        return templateText;\n                    },\n\n                    normalizedValue: function (value) {\n                        if (value < 0) {\n                            module.debug('Value cannot decrement below 0');\n\n                            return 0;\n                        }\n                        if (module.has.total()) {\n                            if (value > module.total) {\n                                module.debug('Value cannot increment above total', module.total);\n\n                                return module.total;\n                            }\n                        } else if (value > 100) {\n                            module.debug('Value cannot increment above 100 percent');\n\n                            return 100;\n                        }\n\n                        return value;\n                    },\n\n                    updateInterval: function () {\n                        if (settings.updateInterval === 'auto') {\n                            return settings.duration;\n                        }\n\n                        return settings.updateInterval;\n                    },\n\n                    randomValue: function () {\n                        module.debug('Generating random increment percentage');\n\n                        return Math.floor((Math.random() * settings.random.max) + settings.random.min);\n                    },\n\n                    numericValue: function (value) {\n                        return typeof value === 'string'\n                            ? (value.replace(/[^\\d.]/g, '') !== ''\n                                ? +value.replace(/[^\\d.]/g, '')\n                                : false)\n                            : value;\n                    },\n\n                    // gets current displayed percentage (if animating values this is the intermediary value)\n                    displayPercent: function (index) {\n                        var\n                            $bar           = $($bars[index]),\n                            barWidth       = $bar.width(),\n                            totalWidth     = $module.width(),\n                            minDisplay     = parseInt($bar.css('min-width'), 10),\n                            displayPercent = barWidth > minDisplay\n                                ? (barWidth / totalWidth) * 100\n                                : module.percent\n                        ;\n\n                        return settings.precision > 0\n                            ? Math.round(displayPercent * (10 * settings.precision)) / (10 * settings.precision)\n                            : Math.round(displayPercent);\n                    },\n\n                    percent: function (index) {\n                        return (module.percent && module.percent[index || 0]) || 0;\n                    },\n                    value: function (index) {\n                        return module.nextValue || (module.value && module.value[index || 0]) || 0;\n                    },\n                    total: function () {\n                        return module.total !== undefined ? module.total : false;\n                    },\n                },\n\n                create: {\n                    progressPoll: function () {\n                        module.progressPoll = setTimeout(function () {\n                            module.update.toNextValue();\n                            module.remove.progressPoll();\n                        }, module.get.updateInterval());\n                    },\n                },\n\n                is: {\n                    complete: function () {\n                        return module.is.success() || module.is.warning() || module.is.error();\n                    },\n                    success: function () {\n                        return $module.hasClass(className.success);\n                    },\n                    warning: function () {\n                        return $module.hasClass(className.warning);\n                    },\n                    error: function () {\n                        return $module.hasClass(className.error);\n                    },\n                    active: function () {\n                        return $module.hasClass(className.active);\n                    },\n                    visible: function () {\n                        return $module.is(':visible');\n                    },\n                },\n\n                remove: {\n                    progressPoll: function () {\n                        module.verbose('Removing progress poll timer');\n                        if (module.progressPoll) {\n                            clearTimeout(module.progressPoll);\n                            delete module.progressPoll;\n                        }\n                    },\n                    nextValue: function () {\n                        module.verbose('Removing progress value stored for next update');\n                        delete module.nextValue;\n                    },\n                    state: function () {\n                        module.verbose('Removing stored state');\n                        delete module.total;\n                        delete module.percent;\n                        delete module.value;\n                    },\n                    active: function () {\n                        module.verbose('Removing active state');\n                        $module.removeClass(className.active);\n                    },\n                    success: function () {\n                        module.verbose('Removing success state');\n                        $module.removeClass(className.success);\n                    },\n                    warning: function () {\n                        module.verbose('Removing warning state');\n                        $module.removeClass(className.warning);\n                    },\n                    error: function () {\n                        module.verbose('Removing error state');\n                        $module.removeClass(className.error);\n                    },\n                },\n\n                set: {\n                    barWidth: function (values) {\n                        module.debug('set bar width with ', values);\n                        values = module.helper.forceArray(values);\n                        var firstNonZeroIndex = -1;\n                        var lastNonZeroIndex = -1;\n                        var valuesSum = module.helper.sum(values);\n                        var barCounts = $bars.length;\n                        var isMultiple = barCounts > 1;\n                        var percents = values.map(function (value, index) {\n                            var allZero = index === barCounts - 1 && valuesSum === 0;\n                            var $bar = $($bars[index]);\n                            if (value === 0 && isMultiple && !allZero) {\n                                $bar.css('display', 'none');\n                            } else {\n                                if (isMultiple && allZero) {\n                                    $bar.css('background', 'transparent');\n                                }\n                                if (firstNonZeroIndex === -1) {\n                                    firstNonZeroIndex = index;\n                                }\n                                lastNonZeroIndex = index;\n                                $bar.css({\n                                    display: 'block',\n                                    width: value + '%',\n                                });\n                            }\n\n                            return parseFloat(value);\n                        });\n                        values.forEach(function (_, index) {\n                            var $bar = $($bars[index]);\n                            $bar.css({\n                                borderTopLeftRadius: index === firstNonZeroIndex ? '' : '0',\n                                borderBottomLeftRadius: index === firstNonZeroIndex ? '' : '0',\n                                borderTopRightRadius: index === lastNonZeroIndex ? '' : '0',\n                                borderBottomRightRadius: index === lastNonZeroIndex ? '' : '0',\n                            });\n                        });\n                        $module\n                            .attr('data-percent', percents)\n                        ;\n                    },\n                    duration: function (duration) {\n                        duration = duration || settings.duration;\n                        duration = typeof duration === 'number'\n                            ? duration + 'ms'\n                            : duration;\n                        module.verbose('Setting progress bar transition duration', duration);\n                        $bars\n                            .css({\n                                'transition-duration': duration,\n                            })\n                        ;\n                    },\n                    percent: function (percents) {\n                        percents = module.helper.forceArray(percents).map(function (percent) {\n                            percent = typeof percent === 'string'\n                                ? +percent.replace('%', '')\n                                : percent;\n\n                            return settings.limitValues\n                                ? Math.max(0, Math.min(100, percent))\n                                : percent;\n                        });\n                        var hasTotal = module.has.total();\n                        var totalPercent = module.helper.sum(percents);\n                        var isMultipleValues = percents.length > 1 && hasTotal;\n                        var sumTotal = module.helper.sum(module.helper.forceArray(module.value));\n                        if (isMultipleValues && sumTotal > module.total) {\n                            // Sum values instead of pecents to avoid precision issues when summing floats\n                            module.error(error.sumExceedsTotal, sumTotal, module.total);\n                        } else if (!isMultipleValues && totalPercent > 100) {\n                            // Sum before rounding since sum of rounded may have error though sum of actual is fine\n                            module.error(error.tooHigh, totalPercent);\n                        } else if (totalPercent < 0) {\n                            module.error(error.tooLow, totalPercent);\n                        } else {\n                            var autoPrecision = settings.precision > 0\n                                ? settings.precision\n                                : (isMultipleValues\n                                    ? module.helper.derivePrecision(Math.min.apply(null, module.value), module.total)\n                                    : 0);\n\n                            // round display percentage\n                            var roundedPercents = percents.map(function (percent) {\n                                return autoPrecision > 0\n                                    ? Math.round(percent * (10 * autoPrecision)) / (10 * autoPrecision)\n                                    : Math.round(percent)\n                                ;\n                            });\n                            module.percent = roundedPercents;\n                            if (hasTotal) {\n                                module.value = percents.map(function (percent) {\n                                    return autoPrecision > 0\n                                        ? Math.round((percent / 100) * module.total * (10 * autoPrecision)) / (10 * autoPrecision)\n                                        : Math.round((percent / 100) * module.total * 10) / 10;\n                                });\n                            }\n                            module.set.barWidth(percents);\n                            module.set.labelInterval();\n                        }\n                        settings.onChange.call(element, percents, module.value, module.total);\n                    },\n                    labelInterval: function () {\n                        var\n                            animationCallback = function () {\n                                module.verbose('Bar finished animating, removing continuous label updates');\n                                clearInterval(module.interval);\n                                animating = false;\n                                module.set.labels();\n                            }\n                        ;\n                        clearInterval(module.interval);\n                        module.bind.transitionEnd(animationCallback);\n                        animating = true;\n                        module.interval = setInterval(function () {\n                            var\n                                isInDOM = $.contains(document.documentElement, element)\n                            ;\n                            if (!isInDOM) {\n                                clearInterval(module.interval);\n                                animating = false;\n                            }\n                            module.set.labels();\n                        }, settings.framerate);\n                    },\n                    labels: function () {\n                        module.verbose('Setting both bar progress and outer label text');\n                        module.set.barLabel();\n                        module.set.state();\n                    },\n                    label: function (text) {\n                        if (text) {\n                            text = module.get.text(text);\n                            module.verbose('Setting label to text', text);\n                            $label.text(text);\n                        }\n                    },\n                    state: function (percent) {\n                        percent = percent !== undefined\n                            ? percent\n                            : module.helper.sum(module.percent);\n                        if (percent === 100) {\n                            if (settings.autoSuccess && $bars.length === 1 && !(module.is.warning() || module.is.error() || module.is.success())) {\n                                module.set.success();\n                                module.debug('Automatically triggering success at 100%');\n                            } else {\n                                module.verbose('Reached 100% removing active state');\n                                module.remove.active();\n                                module.remove.progressPoll();\n                            }\n                        } else if (percent > 0) {\n                            module.verbose('Adjusting active progress bar label', percent);\n                            module.set.active();\n                        } else {\n                            module.remove.active();\n                            module.remove.warning();\n                            module.remove.error();\n                            module.remove.success();\n                            module.set.label(settings.text.active);\n                        }\n                    },\n                    barLabel: function (text) {\n                        $progresses.each(function (index, element) {\n                            var $progress = $(element);\n                            if (text !== undefined) {\n                                $progress.text(module.get.text(text, index));\n                            } else if (settings.label === 'ratio' && module.has.total()) {\n                                module.verbose('Adding ratio to bar label');\n                                $progress.text(module.get.text(settings.text.ratio, index));\n                            } else if (settings.label === 'percent') {\n                                module.verbose('Adding percentage to bar label');\n                                $progress.text(module.get.text(settings.text.percent, index));\n                            }\n                        });\n                    },\n                    active: function (text) {\n                        text = text || settings.text.active;\n                        module.debug('Setting active state');\n                        if (settings.showActivity && !module.is.active()) {\n                            $module.addClass(className.active);\n                        }\n                        module.remove.warning();\n                        module.remove.error();\n                        module.remove.success();\n                        text = settings.onLabelUpdate('active', text, module.value, module.total);\n                        if (text) {\n                            module.set.label(text);\n                        }\n                        module.bind.transitionEnd(function () {\n                            settings.onActive.call(element, module.value, module.total);\n                        });\n                    },\n                    success: function (text, keepState) {\n                        text = text || settings.text.success || settings.text.active;\n                        module.debug('Setting success state');\n                        $module.addClass(className.success);\n                        module.remove.active();\n                        module.remove.warning();\n                        module.remove.error();\n                        module.complete(keepState);\n                        if (settings.text.success) {\n                            text = settings.onLabelUpdate('success', text, module.value, module.total);\n                            module.set.label(text);\n                        } else {\n                            text = settings.onLabelUpdate('active', text, module.value, module.total);\n                            module.set.label(text);\n                        }\n                        module.bind.transitionEnd(function () {\n                            settings.onSuccess.call(element, module.total);\n                        });\n                    },\n                    warning: function (text, keepState) {\n                        text = text || settings.text.warning;\n                        module.debug('Setting warning state');\n                        $module.addClass(className.warning);\n                        module.remove.active();\n                        module.remove.success();\n                        module.remove.error();\n                        module.complete(keepState);\n                        text = settings.onLabelUpdate('warning', text, module.value, module.total);\n                        if (text) {\n                            module.set.label(text);\n                        }\n                        module.bind.transitionEnd(function () {\n                            settings.onWarning.call(element, module.value, module.total);\n                        });\n                    },\n                    error: function (text, keepState) {\n                        text = text || settings.text.error;\n                        module.debug('Setting error state');\n                        $module.addClass(className.error);\n                        module.remove.active();\n                        module.remove.success();\n                        module.remove.warning();\n                        module.complete(keepState);\n                        text = settings.onLabelUpdate('error', text, module.value, module.total);\n                        if (text) {\n                            module.set.label(text);\n                        }\n                        module.bind.transitionEnd(function () {\n                            settings.onError.call(element, module.value, module.total);\n                        });\n                    },\n                    total: function (totalValue) {\n                        module.total = totalValue;\n                    },\n                    value: function (value) {\n                        module.value = module.helper.forceArray(value);\n                    },\n                    progress: function (value) {\n                        if (!module.has.progressPoll()) {\n                            module.debug('First update in progress update interval, immediately updating', value);\n                            module.update.progress(value);\n                            module.create.progressPoll();\n                        } else {\n                            module.debug('Updated within interval, setting next update to use new value', value);\n                            module.set.nextValue(value);\n                        }\n                    },\n                    nextValue: function (value) {\n                        module.nextValue = value;\n                    },\n                },\n\n                update: {\n                    toNextValue: function () {\n                        var\n                            nextValue = module.nextValue\n                        ;\n                        if (nextValue) {\n                            module.debug('Update interval complete using last updated value', nextValue);\n                            module.update.progress(nextValue);\n                            module.remove.nextValue();\n                        }\n                    },\n                    progress: function (values) {\n                        var hasTotal = module.has.total();\n                        if (hasTotal) {\n                            module.set.value(values);\n                        }\n                        var percentCompletes = module.helper.forceArray(values).map(function (value) {\n                            var\n                                percentComplete\n                            ;\n                            value = module.get.numericValue(value);\n                            if (value === false) {\n                                module.error(error.nonNumeric, value);\n                            }\n                            value = module.get.normalizedValue(value);\n                            if (hasTotal) {\n                                percentComplete = module.total > 0 ? (value / module.total) * 100 : 100;\n                                module.debug('Calculating percent complete from total', percentComplete);\n                            } else {\n                                percentComplete = value;\n                                module.debug('Setting value to exact percentage value', percentComplete);\n                            }\n\n                            return percentComplete;\n                        });\n                        module.set.percent(percentCompletes);\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.progress.settings = {\n\n        name: 'Progress',\n        namespace: 'progress',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        random: {\n            min: 2,\n            max: 5,\n        },\n\n        duration: 300,\n\n        updateInterval: 'auto',\n\n        autoSuccess: true,\n        showActivity: true,\n        limitValues: true,\n\n        label: 'percent',\n        precision: 0,\n        framerate: 1000 / 30, /// 30 fps\n\n        percent: false,\n        total: false,\n        value: false,\n\n        // delay in ms for fail safe animation callback\n        failSafeDelay: 100,\n\n        onLabelUpdate: function (state, text, value, total) {\n            return text;\n        },\n        onChange: function (percent, value, total) {},\n        onSuccess: function (total) {},\n        onActive: function (value, total) {},\n        onError: function (value, total) {},\n        onWarning: function (value, total) {},\n\n        error: {\n            method: 'The method you called is not defined.',\n            nonNumeric: 'Progress value is non numeric',\n            tooHigh: 'Value specified is above 100%',\n            tooLow: 'Value specified is below 0%',\n            sumExceedsTotal: 'Sum of multiple values exceed total',\n        },\n\n        regExp: {\n            variable: /{\\$*[\\da-z]+}/gi,\n        },\n\n        metadata: {\n            percent: 'percent',\n            total: 'total',\n            value: 'value',\n        },\n\n        selector: {\n            bar: '> .bar',\n            label: '> .label',\n            progress: '.bar > .progress',\n        },\n\n        text: {\n            active: false,\n            error: false,\n            success: false,\n            warning: false,\n            percent: '{percent}%',\n            ratio: '{value} of {total}',\n            bars: [''],\n        },\n\n        className: {\n            active: 'active',\n            error: 'error',\n            success: 'success',\n            warning: 'warning',\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/rail.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Rail\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Rails\n*******************************/\n\n.ui.rail {\n  position: absolute;\n  top: 0;\n  width: 300px;\n  height: 100%;\n}\n.ui.left.rail {\n  left: auto;\n  right: 100%;\n  padding: 0 2rem 0 0;\n  margin: 0 2rem 0 0;\n}\n.ui.right.rail {\n  left: 100%;\n  right: auto;\n  padding: 0 0 0 2rem;\n  margin: 0 0 0 2rem;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n         Internal\n    --------------- */\n.ui.left.internal.rail {\n  left: 0;\n  right: auto;\n  padding: 0 0 0 2rem;\n  margin: 0 0 0 2rem;\n}\n.ui.right.internal.rail {\n  left: auto;\n  right: 0;\n  padding: 0 2rem 0 0;\n  margin: 0 2rem 0 0;\n}\n\n/* --------------\n        Dividing\n    --------------- */\n.ui.dividing.rail {\n  width: 302.5px;\n}\n.ui.left.dividing.rail {\n  padding: 0 2.5rem 0 0;\n  margin: 0 2.5rem 0 0;\n  border-right: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.right.dividing.rail {\n  border-left: 1px solid rgba(34, 36, 38, 0.15);\n  padding: 0 0 0 2.5rem;\n  margin: 0 0 0 2.5rem;\n}\n\n/* --------------\n        Distance\n    --------------- */\n.ui.close.rail {\n  width: calc(300px + 1em);\n}\n.ui.close.left.rail {\n  padding: 0 1em 0 0;\n  margin: 0 1em 0 0;\n}\n.ui.close.right.rail {\n  padding: 0 0 0 1em;\n  margin: 0 0 0 1em;\n}\n.ui.very.close.rail {\n  width: calc(300px + 0.5em);\n}\n.ui.very.close.left.rail {\n  padding: 0 0.5em 0 0;\n  margin: 0 0.5em 0 0;\n}\n.ui.very.close.right.rail {\n  padding: 0 0 0 0.5em;\n  margin: 0 0 0 0.5em;\n}\n\n/* --------------\n        Attached\n    --------------- */\n.ui.attached.left.rail,\n.ui.attached.right.rail {\n  padding: 0;\n  margin: 0;\n}\n\n/* --------------\n     Sizing\n--------------- */\n.ui.rail {\n  font-size: 1rem;\n}\n.ui.mini.rail {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.rail {\n  font-size: 0.85714286rem;\n}\n.ui.small.rail {\n  font-size: 0.92857143rem;\n}\n.ui.large.rail {\n  font-size: 1.14285714rem;\n}\n.ui.big.rail {\n  font-size: 1.28571429rem;\n}\n.ui.huge.rail {\n  font-size: 1.42857143rem;\n}\n.ui.massive.rail {\n  font-size: 1.71428571rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/rating.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Rating\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n           Rating\n*******************************/\n\n.ui.rating {\n  display: inline-flex;\n  white-space: nowrap;\n  vertical-align: baseline;\n}\n.ui.rating:last-child {\n  margin-right: 0;\n}\n\n/* Icon */\n.ui.rating .icon {\n  padding: 0;\n  margin: 0;\n  text-align: center;\n  font-weight: normal;\n  font-style: normal;\n  flex: 1 0 auto;\n  cursor: pointer;\n  width: 1.25em;\n  height: auto;\n  transition: opacity 0.1s ease, background 0.1s ease, text-shadow 0.1s ease, color 0.1s ease;\n  line-height: 1;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/* -------------------\n      Standard\n-------------------- */\n\n/* Inactive Icon */\n.ui.rating .icon {\n  background: transparent;\n  color: rgba(0, 0, 0, 0.15);\n}\n\n/* Active Icon */\n.ui.rating .active.icon {\n  background: transparent;\n  color: rgba(0, 0, 0, 0.85);\n}\n\n/* Partially Active Icon */\n.ui.rating .icon.partial.active {\n  background: linear-gradient(to right, rgba(0, 0, 0, 0.85) 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n}\n\n/* central override for colors */\n.ui.ui.ui.rating .icon.partial.active {\n  -webkit-background-clip: text;\n  background-clip: text;\n  color: transparent;\n  text-shadow: none;\n}\n\n/* Selected Icon */\n.ui.rating .icon.selected,\n.ui.rating .icon.selected.active,\n.ui.rating .icon.selected.partial.active {\n  background: transparent;\n  color: rgba(0, 0, 0, 0.87);\n  background-clip: unset;\n}\n\n/* --------------\n     Colors\n-------------- */\n.ui.primary.rating .active.icon {\n  color: #54c8ff;\n  text-shadow: 0 -1px 0 #2185d0, -1px 0 0 #2185d0, 0 1px 0 #2185d0, 1px 0 0 #2185d0;\n}\n.ui.primary.rating .icon.selected,\n.ui.primary.rating .icon.selected.active,\n.ui.primary.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #21b8ff;\n  text-shadow: 0 -1px 0 #1678c2, -1px 0 0 #1678c2, 0 1px 0 #1678c2, 1px 0 0 #1678c2;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.primary.rating .icon.partial.active {\n  background: linear-gradient(to right, #54c8ff 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #2185d0 0.78px;\n}\n.ui.secondary.rating .active.icon {\n  color: #545454;\n  text-shadow: 0 -1px 0 #1b1c1d, -1px 0 0 #1b1c1d, 0 1px 0 #1b1c1d, 1px 0 0 #1b1c1d;\n}\n.ui.secondary.rating .icon.selected,\n.ui.secondary.rating .icon.selected.active,\n.ui.secondary.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #6e6e6e;\n  text-shadow: 0 -1px 0 #27292a, -1px 0 0 #27292a, 0 1px 0 #27292a, 1px 0 0 #27292a;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.secondary.rating .icon.partial.active {\n  background: linear-gradient(to right, #545454 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #1b1c1d 0.78px;\n}\n.ui.red.rating .active.icon {\n  color: #ff695e;\n  text-shadow: 0 -1px 0 #db2828, -1px 0 0 #db2828, 0 1px 0 #db2828, 1px 0 0 #db2828;\n}\n.ui.red.rating .icon.selected,\n.ui.red.rating .icon.selected.active,\n.ui.red.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #ff392b;\n  text-shadow: 0 -1px 0 #d01919, -1px 0 0 #d01919, 0 1px 0 #d01919, 1px 0 0 #d01919;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.red.rating .icon.partial.active {\n  background: linear-gradient(to right, #ff695e 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #db2828 0.78px;\n}\n.ui.orange.rating .active.icon {\n  color: #ff851b;\n  text-shadow: 0 -1px 0 #f2711c, -1px 0 0 #f2711c, 0 1px 0 #f2711c, 1px 0 0 #f2711c;\n}\n.ui.orange.rating .icon.selected,\n.ui.orange.rating .icon.selected.active,\n.ui.orange.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #e76b00;\n  text-shadow: 0 -1px 0 #f26202, -1px 0 0 #f26202, 0 1px 0 #f26202, 1px 0 0 #f26202;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.orange.rating .icon.partial.active {\n  background: linear-gradient(to right, #ff851b 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #f2711c 0.78px;\n}\n.ui.yellow.rating .active.icon {\n  color: #ffe21f;\n  text-shadow: 0 -1px 0 #fbbd08, -1px 0 0 #fbbd08, 0 1px 0 #fbbd08, 1px 0 0 #fbbd08;\n}\n.ui.yellow.rating .icon.selected,\n.ui.yellow.rating .icon.selected.active,\n.ui.yellow.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #ebcd00;\n  text-shadow: 0 -1px 0 #eaae00, -1px 0 0 #eaae00, 0 1px 0 #eaae00, 1px 0 0 #eaae00;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.yellow.rating .icon.partial.active {\n  background: linear-gradient(to right, #ffe21f 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #fbbd08 0.78px;\n}\n.ui.olive.rating .active.icon {\n  color: #d9e778;\n  text-shadow: 0 -1px 0 #b5cc18, -1px 0 0 #b5cc18, 0 1px 0 #b5cc18, 1px 0 0 #b5cc18;\n}\n.ui.olive.rating .icon.selected,\n.ui.olive.rating .icon.selected.active,\n.ui.olive.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #d2e745;\n  text-shadow: 0 -1px 0 #a7bd0d, -1px 0 0 #a7bd0d, 0 1px 0 #a7bd0d, 1px 0 0 #a7bd0d;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.olive.rating .icon.partial.active {\n  background: linear-gradient(to right, #d9e778 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #b5cc18 0.78px;\n}\n.ui.green.rating .active.icon {\n  color: #2ecc40;\n  text-shadow: 0 -1px 0 #21ba45, -1px 0 0 #21ba45, 0 1px 0 #21ba45, 1px 0 0 #21ba45;\n}\n.ui.green.rating .icon.selected,\n.ui.green.rating .icon.selected.active,\n.ui.green.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #1ea92e;\n  text-shadow: 0 -1px 0 #16ab39, -1px 0 0 #16ab39, 0 1px 0 #16ab39, 1px 0 0 #16ab39;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.green.rating .icon.partial.active {\n  background: linear-gradient(to right, #2ecc40 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #21ba45 0.78px;\n}\n.ui.teal.rating .active.icon {\n  color: #6dffff;\n  text-shadow: 0 -1px 0 #00b5ad, -1px 0 0 #00b5ad, 0 1px 0 #00b5ad, 1px 0 0 #00b5ad;\n}\n.ui.teal.rating .icon.selected,\n.ui.teal.rating .icon.selected.active,\n.ui.teal.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #3affff;\n  text-shadow: 0 -1px 0 #009c95, -1px 0 0 #009c95, 0 1px 0 #009c95, 1px 0 0 #009c95;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.teal.rating .icon.partial.active {\n  background: linear-gradient(to right, #6dffff 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #00b5ad 0.78px;\n}\n.ui.blue.rating .active.icon {\n  color: #54c8ff;\n  text-shadow: 0 -1px 0 #2185d0, -1px 0 0 #2185d0, 0 1px 0 #2185d0, 1px 0 0 #2185d0;\n}\n.ui.blue.rating .icon.selected,\n.ui.blue.rating .icon.selected.active,\n.ui.blue.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #21b8ff;\n  text-shadow: 0 -1px 0 #1678c2, -1px 0 0 #1678c2, 0 1px 0 #1678c2, 1px 0 0 #1678c2;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.blue.rating .icon.partial.active {\n  background: linear-gradient(to right, #54c8ff 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #2185d0 0.78px;\n}\n.ui.violet.rating .active.icon {\n  color: #a291fb;\n  text-shadow: 0 -1px 0 #6435c9, -1px 0 0 #6435c9, 0 1px 0 #6435c9, 1px 0 0 #6435c9;\n}\n.ui.violet.rating .icon.selected,\n.ui.violet.rating .icon.selected.active,\n.ui.violet.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #745aff;\n  text-shadow: 0 -1px 0 #5829bb, -1px 0 0 #5829bb, 0 1px 0 #5829bb, 1px 0 0 #5829bb;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.violet.rating .icon.partial.active {\n  background: linear-gradient(to right, #a291fb 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #6435c9 0.78px;\n}\n.ui.purple.rating .active.icon {\n  color: #dc73ff;\n  text-shadow: 0 -1px 0 #a333c8, -1px 0 0 #a333c8, 0 1px 0 #a333c8, 1px 0 0 #a333c8;\n}\n.ui.purple.rating .icon.selected,\n.ui.purple.rating .icon.selected.active,\n.ui.purple.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #cf40ff;\n  text-shadow: 0 -1px 0 #9627ba, -1px 0 0 #9627ba, 0 1px 0 #9627ba, 1px 0 0 #9627ba;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.purple.rating .icon.partial.active {\n  background: linear-gradient(to right, #dc73ff 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #a333c8 0.78px;\n}\n.ui.pink.rating .active.icon {\n  color: #ff8edf;\n  text-shadow: 0 -1px 0 #e03997, -1px 0 0 #e03997, 0 1px 0 #e03997, 1px 0 0 #e03997;\n}\n.ui.pink.rating .icon.selected,\n.ui.pink.rating .icon.selected.active,\n.ui.pink.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #ff5bd1;\n  text-shadow: 0 -1px 0 #e61a8d, -1px 0 0 #e61a8d, 0 1px 0 #e61a8d, 1px 0 0 #e61a8d;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.pink.rating .icon.partial.active {\n  background: linear-gradient(to right, #ff8edf 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #e03997 0.78px;\n}\n.ui.brown.rating .active.icon {\n  color: #d67c1c;\n  text-shadow: 0 -1px 0 #a5673f, -1px 0 0 #a5673f, 0 1px 0 #a5673f, 1px 0 0 #a5673f;\n}\n.ui.brown.rating .icon.selected,\n.ui.brown.rating .icon.selected.active,\n.ui.brown.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #b0620f;\n  text-shadow: 0 -1px 0 #975b33, -1px 0 0 #975b33, 0 1px 0 #975b33, 1px 0 0 #975b33;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.brown.rating .icon.partial.active {\n  background: linear-gradient(to right, #d67c1c 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #a5673f 0.78px;\n}\n.ui.grey.rating .active.icon {\n  color: #dcddde;\n  text-shadow: 0 -1px 0 #767676, -1px 0 0 #767676, 0 1px 0 #767676, 1px 0 0 #767676;\n}\n.ui.grey.rating .icon.selected,\n.ui.grey.rating .icon.selected.active,\n.ui.grey.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #c2c4c5;\n  text-shadow: 0 -1px 0 #838383, -1px 0 0 #838383, 0 1px 0 #838383, 1px 0 0 #838383;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.grey.rating .icon.partial.active {\n  background: linear-gradient(to right, #dcddde 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #767676 0.78px;\n}\n.ui.black.rating .active.icon {\n  color: #545454;\n  text-shadow: 0 -1px 0 #1b1c1d, -1px 0 0 #1b1c1d, 0 1px 0 #1b1c1d, 1px 0 0 #1b1c1d;\n}\n.ui.black.rating .icon.selected,\n.ui.black.rating .icon.selected.active,\n.ui.black.rating .icon.selected.partial.active {\n  background: inherit;\n  color: #000000;\n  text-shadow: 0 -1px 0 #27292a, -1px 0 0 #27292a, 0 1px 0 #27292a, 1px 0 0 #27292a;\n  -webkit-text-stroke: unset;\n  background-clip: unset;\n}\n.ui.black.rating .icon.partial.active {\n  background: linear-gradient(to right, #545454 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);\n  -webkit-text-stroke: #1b1c1d 0.78px;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n\n/* -------------------\n           Disabled\n    -------------------- */\n\n/* disabled rating */\n.ui.disabled.rating .icon {\n  cursor: default;\n  pointer-events: none;\n}\n\n/* -------------------\n   User Interactive\n-------------------- */\n\n/* Selected Rating */\n.ui.rating.selected .active.icon {\n  opacity: 1;\n}\n.ui.rating.selected .icon.selected,\n.ui.rating .icon.selected {\n  opacity: 1;\n}\n\n\n/*******************************\n          Variations\n*******************************/\n\n.ui.rating {\n  font-size: 1rem;\n}\n.ui.mini.rating {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.rating {\n  font-size: 0.85714286rem;\n}\n.ui.small.rating {\n  font-size: 0.92857143rem;\n}\n.ui.large.rating {\n  font-size: 1.14285714rem;\n}\n.ui.big.rating {\n  font-size: 1.28571429rem;\n}\n.ui.huge.rating {\n  font-size: 1.42857143rem;\n}\n.ui.massive.rating {\n  font-size: 2rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/rating.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Rating\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.rating = function (parameters) {\n        var\n            $allModules     = $(this),\n\n            time            = Date.now(),\n            performance     = [],\n\n            query           = arguments[0],\n            methodInvoked   = typeof query === 'string',\n            queryArguments  = [].slice.call(arguments, 1),\n            returnedValue\n        ;\n        $allModules.each(function () {\n            var\n                settings        = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.rating.settings, parameters)\n                    : $.extend({}, $.fn.rating.settings),\n\n                namespace       = settings.namespace,\n                className       = settings.className,\n                error           = settings.error,\n                metadata        = settings.metadata,\n                selector        = settings.selector,\n                cssVars         = settings.cssVars,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                element         = this,\n                instance        = $(this).data(moduleNamespace),\n\n                $module         = $(this),\n                $icon           = $module.find(selector.icon),\n\n                initialLoad,\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.verbose('Initializing rating module', settings);\n\n                    if ($icon.length === 0) {\n                        module.setup.layout();\n                    }\n\n                    if (settings.interactive && !module.is.disabled()) {\n                        module.enable();\n                    } else {\n                        module.disable();\n                    }\n                    module.set.initialLoad();\n                    module.set.rating(module.get.initialRating());\n                    module.remove.initialLoad();\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Instantiating module', settings);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous instance', instance);\n                    module.remove.events();\n                    $module\n                        .removeData(moduleNamespace)\n                    ;\n                },\n\n                refresh: function () {\n                    $icon = $module.find(selector.icon);\n                },\n\n                setup: {\n                    layout: function () {\n                        var\n                            maxRating = module.get.maxRating(),\n                            icon      = module.get.icon(),\n                            html      = $.fn.rating.settings.templates.icon(maxRating, icon)\n                        ;\n                        module.debug('Generating icon html dynamically');\n                        $module\n                            .html(html)\n                        ;\n                        module.refresh();\n                    },\n                },\n\n                event: {\n                    mouseenter: function () {\n                        var\n                            $activeIcon = $(this)\n                        ;\n                        $activeIcon\n                            .nextAll()\n                            .removeClass(className.selected)\n                        ;\n                        $module\n                            .addClass(className.selected)\n                        ;\n                        $activeIcon\n                            .addClass(className.selected)\n                            .prevAll()\n                            .addClass(className.selected)\n                        ;\n                    },\n                    mouseleave: function () {\n                        $module\n                            .removeClass(className.selected)\n                        ;\n                        $icon\n                            .removeClass(className.selected)\n                        ;\n                    },\n                    click: function () {\n                        var\n                            $activeIcon   = $(this),\n                            currentRating = module.get.rating(),\n                            rating        = $icon.index($activeIcon) + 1,\n                            canClear      = settings.clearable === 'auto'\n                                ? $icon.length === 1\n                                : settings.clearable\n                        ;\n                        if (canClear && currentRating === rating) {\n                            module.clearRating();\n                        } else {\n                            module.set.rating(rating);\n                        }\n                    },\n                },\n\n                clearRating: function () {\n                    module.debug('Clearing current rating');\n                    module.set.rating(0);\n                },\n\n                bind: {\n                    events: function () {\n                        module.verbose('Binding events');\n                        $module\n                            .on('mouseenter' + eventNamespace, selector.icon, module.event.mouseenter)\n                            .on('mouseleave' + eventNamespace, selector.icon, module.event.mouseleave)\n                            .on('click' + eventNamespace, selector.icon, module.event.click)\n                        ;\n                    },\n                },\n\n                remove: {\n                    events: function () {\n                        module.verbose('Removing events');\n                        $module\n                            .off(eventNamespace)\n                        ;\n                    },\n                    initialLoad: function () {\n                        initialLoad = false;\n                    },\n                },\n\n                enable: function () {\n                    module.debug('Setting rating to interactive mode');\n                    module.bind.events();\n                    $module\n                        .removeClass(className.disabled)\n                    ;\n                },\n\n                disable: function () {\n                    module.debug('Setting rating to read-only mode');\n                    module.remove.events();\n                    $module\n                        .addClass(className.disabled)\n                    ;\n                },\n\n                is: {\n                    initialLoad: function () {\n                        return initialLoad;\n                    },\n                    disabled: function () {\n                        return $module.hasClass(className.disabled);\n                    },\n                },\n\n                get: {\n                    icon: function () {\n                        var icon = $module.data(metadata.icon);\n                        if (icon) {\n                            $module.removeData(metadata.icon);\n                        }\n\n                        return icon || settings.icon;\n                    },\n                    initialRating: function () {\n                        if ($module.data(metadata.rating) !== undefined) {\n                            $module.removeData(metadata.rating);\n\n                            return $module.data(metadata.rating);\n                        }\n\n                        return settings.initialRating;\n                    },\n                    maxRating: function () {\n                        if ($module.data(metadata.maxRating) !== undefined) {\n                            $module.removeData(metadata.maxRating);\n\n                            return $module.data(metadata.maxRating);\n                        }\n\n                        return settings.maxRating;\n                    },\n                    rating: function () {\n                        var\n                            currentRating = $icon.filter('.' + className.active).length\n                        ;\n                        module.verbose('Current rating retrieved', currentRating);\n\n                        return currentRating;\n                    },\n                },\n\n                set: {\n                    rating: function (rating) {\n                        var\n                            ratingIndex = Math.floor(\n                                rating - 1 >= 0\n                                    ? rating - 1\n                                    : 0\n                            ),\n                            $activeIcon = $icon.eq(ratingIndex),\n                            $partialActiveIcon = rating <= 1\n                                ? $activeIcon\n                                : $activeIcon.next(),\n                            filledPercentage = (rating % 1) * 100\n                        ;\n                        $module\n                            .removeClass(className.selected)\n                        ;\n                        $icon\n                            .removeClass(className.selected)\n                            .removeClass(className.active)\n                            .removeClass(className.partiallyActive)\n                        ;\n                        if (rating > 0) {\n                            module.verbose('Setting current rating to', rating);\n                            $activeIcon\n                                .prevAll()\n                                .addBack()\n                                .addClass(className.active)\n                            ;\n                            if ($activeIcon.next() && rating % 1 !== 0) {\n                                $partialActiveIcon\n                                    .addClass(className.partiallyActive)\n                                    .addClass(className.active)\n                                ;\n                                $partialActiveIcon\n                                    .css(cssVars.filledCustomPropName, filledPercentage + '%')\n                                ;\n                                if ($partialActiveIcon.css('backgroundColor') === 'transparent') {\n                                    $partialActiveIcon\n                                        .removeClass(className.partiallyActive)\n                                        .removeClass(className.active)\n                                    ;\n                                }\n                            }\n                        }\n                        if (!module.is.initialLoad()) {\n                            settings.onRate.call(element, rating);\n                        }\n                    },\n                    initialLoad: function () {\n                        initialLoad = true;\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if ($allModules.length > 1) {\n                            title += ' (' + $allModules.length + ')';\n                        }\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.rating.settings = {\n\n        name: 'Rating',\n        namespace: 'rating',\n\n        icon: 'star',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        initialRating: 0,\n        interactive: true,\n        maxRating: 4,\n        clearable: 'auto',\n\n        fireOnInit: false,\n\n        onRate: function (rating) {},\n\n        error: {\n            method: 'The method you called is not defined',\n        },\n\n        metadata: {\n            rating: 'rating',\n            maxRating: 'maxRating',\n            icon: 'icon',\n        },\n\n        className: {\n            active: 'active',\n            disabled: 'disabled',\n            selected: 'selected',\n            loading: 'loading',\n            partiallyActive: 'partial',\n        },\n\n        cssVars: {\n            filledCustomPropName: '--full',\n        },\n\n        selector: {\n            icon: '.icon',\n        },\n\n        templates: {\n            deQuote: function (string, encode) {\n                return String(string).replace(/\"/g, encode ? '&quot;' : '');\n            },\n            icon: function (maxRating, iconClass) {\n                var\n                    icon = 1,\n                    html = '',\n                    deQuote = $.fn.rating.settings.templates.deQuote\n                ;\n                while (icon <= maxRating) {\n                    html += '<i class=\"' + deQuote(iconClass) + ' icon\"></i>';\n                    icon++;\n                }\n\n                return html;\n            },\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/reset.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Reset\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Reset\n*******************************/\n\n\n/* Border-Box */\n*,\n*::before,\n*::after {\n  box-sizing: inherit;\n}\nhtml {\n  box-sizing: border-box;\n}\n\n/* iPad Input Shadows */\ninput[type=\"text\"],\ninput[type=\"email\"],\ninput[type=\"search\"],\ninput[type=\"password\"] {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  \n/* mobile firefox too! */\n}\n/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n   ========================================================================== */\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\nhtml {\n  line-height: 1.15;\n  \n/* 1 */\n  -webkit-text-size-adjust: 100%;\n  \n/* 2 */\n}\n\n/* Sections\n   ========================================================================== */\n/**\n * Remove the margin in all browsers.\n */\nbody {\n  margin: 0;\n}\n/**\n * Render the `main` element consistently in IE.\n */\nmain {\n  display: block;\n}\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/* Grouping content\n   ========================================================================== */\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\nhr {\n  box-sizing: content-box;\n  \n/* 1 */\n  height: 0;\n  \n/* 1 */\n  overflow: visible;\n  \n/* 2 */\n}\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\npre {\n  font-family: monospace, monospace;\n  \n/* 1 */\n  font-size: 1em;\n  \n/* 2 */\n}\n\n/* Text-level semantics\n   ========================================================================== */\n/**\n * Remove the gray background on active links in IE 10.\n */\na {\n  background-color: transparent;\n}\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\nabbr[title] {\n  border-bottom: none;\n  \n/* 1 */\n  text-decoration: underline;\n  \n/* 2 */\n  -webkit-text-decoration: underline dotted;\n          text-decoration: underline dotted;\n  \n/* 2 */\n}\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\nb,\nstrong {\n  font-weight: bolder;\n}\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\ncode,\nkbd,\nsamp {\n  font-family: monospace, monospace;\n  \n/* 1 */\n  font-size: 1em;\n  \n/* 2 */\n}\n/**\n * Add the correct font size in all browsers.\n */\nsmall {\n  font-size: 80%;\n}\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsub {\n  bottom: -0.25em;\n}\nsup {\n  top: -0.5em;\n}\n\n/* Embedded content\n   ========================================================================== */\n/**\n * Remove the border on images inside links in IE 10.\n */\nimg {\n  border-style: none;\n}\n\n/* Forms\n   ========================================================================== */\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  font-family: inherit;\n  \n/* 1 */\n  font-size: 100%;\n  \n/* 1 */\n  line-height: 1.15;\n  \n/* 1 */\n  margin: 0;\n  \n/* 2 */\n}\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\nbutton,\ninput {\n  overflow: visible;\n  \n/* 1 */\n}\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\nbutton,\nselect {\n  text-transform: none;\n  \n/* 1 */\n}\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n/**\n * Remove the inner border and padding in Firefox.\n */\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  border-style: none;\n  padding: 0;\n}\n/**\n * Restore the focus styles unset by the previous rule.\n */\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n  outline: 1px dotted ButtonText;\n}\n/**\n * Correct the padding in Firefox.\n */\nfieldset {\n  padding: 0.35em 0.75em 0.625em;\n}\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n *    `fieldset` elements in all browsers.\n */\nlegend {\n  box-sizing: border-box;\n  \n/* 1 */\n  color: inherit;\n  \n/* 2 */\n  display: table;\n  \n/* 1 */\n  max-width: 100%;\n  \n/* 1 */\n  padding: 0;\n  \n/* 3 */\n  white-space: normal;\n  \n/* 1 */\n}\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\nprogress {\n  vertical-align: baseline;\n}\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\ntextarea {\n  overflow: auto;\n}\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n[type=\"checkbox\"],\n[type=\"radio\"] {\n  box-sizing: border-box;\n  \n/* 1 */\n  padding: 0;\n  \n/* 2 */\n}\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n[type=\"search\"] {\n  -webkit-appearance: textfield;\n  \n/* 1 */\n  outline-offset: -2px;\n  \n/* 2 */\n}\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n::-webkit-file-upload-button {\n  -webkit-appearance: button;\n  \n/* 1 */\n  font: inherit;\n  \n/* 2 */\n}\n\n/* Interactive\n   ========================================================================== */\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\ndetails {\n  display: block;\n}\n/*\n * Add the correct display in all browsers.\n */\nsummary {\n  display: list-item;\n}\n\n/* Misc\n   ========================================================================== */\n/**\n * Add the correct display in IE 10+.\n */\ntemplate {\n  display: none;\n}\n/**\n * Add the correct display in IE 10.\n */\n[hidden] {\n  display: none;\n}\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/reveal.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Reveal\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Reveal\n*******************************/\n\n.ui.reveal {\n  display: inherit;\n  position: relative !important;\n  font-size: 0;\n}\n.ui.reveal > .visible.content {\n  position: absolute !important;\n  top: 0 !important;\n  left: 0 !important;\n  z-index: 3 !important;\n  transition: all 0.5s ease 0.1s;\n}\n.ui.reveal > .hidden.content {\n  position: relative !important;\n  z-index: 2 !important;\n}\n\n/* Make sure hovered element is on top of other reveal */\n.ui.active.reveal .visible.content,\n.ui.reveal:hover .visible.content {\n  z-index: 4 !important;\n}\n\n\n/*******************************\n              Types\n*******************************/\n\n\n/* --------------\n          Slide\n    --------------- */\n.ui.slide.reveal {\n  position: relative !important;\n  overflow: hidden !important;\n  white-space: nowrap;\n}\n.ui.slide.reveal > .content {\n  display: block;\n  width: 100%;\n  white-space: normal;\n  float: left;\n  margin: 0;\n  transition: transform 0.5s ease 0.1s;\n}\n.ui.slide.reveal > .visible.content {\n  position: relative !important;\n}\n.ui.slide.reveal > .hidden.content {\n  position: absolute !important;\n  left: 0 !important;\n  width: 100% !important;\n  transform: translateX(100%) !important;\n}\n.ui.slide.active.reveal > .visible.content,\n.ui.slide.reveal:hover > .visible.content {\n  transform: translateX(-100%) !important;\n}\n.ui.slide.active.reveal > .hidden.content,\n.ui.slide.reveal:hover > .hidden.content {\n  transform: translateX(0) !important;\n}\n.ui.slide.right.reveal > .visible.content {\n  transform: translateX(0) !important;\n}\n.ui.slide.right.reveal > .hidden.content {\n  transform: translateX(-100%) !important;\n}\n.ui.slide.right.active.reveal > .visible.content,\n.ui.slide.right.reveal:hover > .visible.content {\n  transform: translateX(100%) !important;\n}\n.ui.slide.right.active.reveal > .hidden.content,\n.ui.slide.right.reveal:hover > .hidden.content {\n  transform: translateX(0) !important;\n}\n.ui.slide.up.reveal > .hidden.content {\n  transform: translateY(100%) !important;\n}\n.ui.slide.up.active.reveal > .visible.content,\n.ui.slide.up.reveal:hover > .visible.content {\n  transform: translateY(-100%) !important;\n}\n.ui.slide.up.active.reveal > .hidden.content,\n.ui.slide.up.reveal:hover > .hidden.content {\n  transform: translateY(0) !important;\n}\n.ui.slide.down.reveal > .hidden.content {\n  transform: translateY(-100%) !important;\n}\n.ui.slide.down.active.reveal > .visible.content,\n.ui.slide.down.reveal:hover > .visible.content {\n  transform: translateY(100%) !important;\n}\n.ui.slide.down.active.reveal > .hidden.content,\n.ui.slide.down.reveal:hover > .hidden.content {\n  transform: translateY(0) !important;\n}\n\n/* --------------\n          Fade\n    --------------- */\n.ui.fade.reveal > .visible.content {\n  opacity: 1;\n}\n.ui.fade.active.reveal > .visible.content,\n.ui.fade.reveal:hover > .visible.content {\n  opacity: 0;\n}\n\n/* --------------\n          Move\n    --------------- */\n.ui.move.reveal {\n  position: relative !important;\n  overflow: hidden !important;\n  white-space: nowrap;\n}\n.ui.move.reveal > .content {\n  display: block;\n  float: left;\n  white-space: normal;\n  margin: 0;\n  transition: transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1) 0.1s;\n}\n.ui.move.reveal > .visible.content {\n  position: relative !important;\n}\n.ui.move.reveal > .hidden.content {\n  position: absolute !important;\n  left: 0 !important;\n  width: 100% !important;\n}\n.ui.move.active.reveal > .visible.content,\n.ui.move.reveal:hover > .visible.content {\n  transform: translateX(-100%) !important;\n}\n.ui.move.right.active.reveal > .visible.content,\n.ui.move.right.reveal:hover > .visible.content {\n  transform: translateX(100%) !important;\n}\n.ui.move.up.active.reveal > .visible.content,\n.ui.move.up.reveal:hover > .visible.content {\n  transform: translateY(-100%) !important;\n}\n.ui.move.down.active.reveal > .visible.content,\n.ui.move.down.reveal:hover > .visible.content {\n  transform: translateY(100%) !important;\n}\n\n/* --------------\n         Rotate\n    --------------- */\n.ui.rotate.reveal > .visible.content {\n  transition-duration: 0.5s;\n  transform: rotate(0);\n}\n.ui.rotate.reveal > .visible.content,\n.ui.rotate.right.reveal > .visible.content {\n  transform-origin: bottom right;\n}\n.ui.rotate.active.reveal > .visible.content,\n.ui.rotate.reveal:hover > .visible.content,\n.ui.rotate.right.active.reveal > .visible.content,\n.ui.rotate.right.reveal:hover > .visible.content {\n  transform: rotate(110deg);\n}\n.ui.rotate.left.reveal > .visible.content {\n  transform-origin: bottom left;\n}\n.ui.rotate.left.active.reveal > .visible.content,\n.ui.rotate.left.reveal:hover > .visible.content {\n  transform: rotate(-110deg);\n}\n\n\n/*******************************\n              States\n*******************************/\n\n.ui.disabled.reveal:hover > .visible.visible.content {\n  position: static !important;\n  display: block !important;\n  opacity: 1 !important;\n  top: 0 !important;\n  left: 0 !important;\n  right: auto !important;\n  bottom: auto !important;\n  transform: none !important;\n}\n.ui.disabled.reveal:hover > .hidden.hidden.content {\n  display: none !important;\n}\n\n\n/*******************************\n           Coupling\n*******************************/\n\n.ui.reveal > .ui.ribbon.label {\n  z-index: 5;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n     Visible\n--------------- */\n.ui.visible.reveal {\n  overflow: visible;\n}\n\n/* --------------\n     Instant\n--------------- */\n.ui.instant.reveal > .content {\n  transition-delay: 0s !important;\n}\n\n/* --------------\n     Sizing\n--------------- */\n.ui.reveal > .content {\n  font-size: 1rem;\n}\n.ui.mini.reveal > .content {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.reveal > .content {\n  font-size: 0.85714286rem;\n}\n.ui.small.reveal > .content {\n  font-size: 0.92857143rem;\n}\n.ui.large.reveal > .content {\n  font-size: 1.14285714rem;\n}\n.ui.big.reveal > .content {\n  font-size: 1.28571429rem;\n}\n.ui.huge.reveal > .content {\n  font-size: 1.42857143rem;\n}\n.ui.massive.reveal > .content {\n  font-size: 1.71428571rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/search.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Search\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Search\n*******************************/\n\n.ui.search {\n  position: relative;\n}\n.ui.search > .prompt {\n  margin: 0;\n  outline: none;\n  -webkit-appearance: none;\n  -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n  text-shadow: none;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.21428571em;\n  padding: 0.67857143em 1em;\n  font-size: 1em;\n  background: #fff;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  color: rgba(0, 0, 0, 0.87);\n  box-shadow: 0 0 0 0 transparent inset;\n  transition: background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, border-color 0.1s ease;\n}\n.ui.search .prompt {\n  border-radius: 500rem;\n}\n\n/* --------------\n     Icon\n--------------- */\n.ui.search .prompt ~ .search.icon {\n  cursor: pointer;\n}\n\n/* --------------\n    Results\n--------------- */\n.ui.search > .results {\n  display: none;\n  position: absolute;\n  top: 100%;\n  left: 0;\n  transform-origin: center top;\n  white-space: normal;\n  text-align: left;\n  text-transform: none;\n  background: #fff;\n  margin-top: 0.5em;\n  width: 18em;\n  border-radius: 0.28571429rem;\n  box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);\n  border: 1px solid #d4d4d5;\n  z-index: 998;\n}\n.ui.search > .results > :first-child {\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.search > .results > :last-child {\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n\n/* --------------\n    Result\n--------------- */\n.ui.search > .results .result {\n  cursor: pointer;\n  display: block;\n  overflow: hidden;\n  font-size: 1em;\n  padding: 0.85714286em 1.14285714em;\n  color: rgba(0, 0, 0, 0.87);\n  line-height: 1.33;\n  border-bottom: 1px solid rgba(34, 36, 38, 0.1);\n}\n.ui.search > .results .result:last-child {\n  border-bottom: none !important;\n}\n\n/* Image */\n.ui.search > .results .result .image {\n  float: right;\n  overflow: hidden;\n  background: none;\n  width: 5em;\n  height: 3em;\n  border-radius: 0.25em;\n}\n.ui.search > .results .result .image img {\n  display: block;\n  width: auto;\n  height: 100%;\n}\n\n/* --------------\n      Info\n--------------- */\n.ui.search > .results .result .image + .content {\n  margin: 0 6em 0 0;\n}\n.ui.search > .results .result .title {\n  margin: -0.14285714em 0 0;\n  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\";\n  font-weight: bold;\n  font-size: 1em;\n  color: rgba(0, 0, 0, 0.85);\n}\n.ui.search > .results .result .description {\n  margin-top: 0;\n  font-size: 0.92857143em;\n  color: rgba(0, 0, 0, 0.4);\n}\n.ui.search > .results .result .price {\n  float: right;\n  color: #21ba45;\n}\n\n/* --------------\n    Message\n--------------- */\n.ui.search > .results > .message {\n  padding: 1em 1em;\n}\n.ui.search > .results > .message .header {\n  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\";\n  font-size: 1rem;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.search > .results > .message .description {\n  margin-top: 0.25rem;\n  font-size: 1em;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* View All Results */\n.ui.search > .results > .action {\n  display: block;\n  border-top: none;\n  background: #f3f4f5;\n  padding: 0.92857143em 1em;\n  color: rgba(0, 0, 0, 0.87);\n  font-weight: bold;\n  text-align: center;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------------\n       Focus\n--------------------- */\n.ui.search > .prompt:focus {\n  border-color: rgba(34, 36, 38, 0.35);\n  background: #fff;\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------------\n           Loading\n    --------------------- */\n.ui.loading.search .input > i.icon::before {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -0.64285714em 0 0 -0.64285714em;\n  width: 1.28571429em;\n  height: 1.28571429em;\n  border-radius: 500rem;\n  border: 0.2em solid rgba(0, 0, 0, 0.1);\n}\n.ui.loading.search .input > i.icon::after {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -0.64285714em 0 0 -0.64285714em;\n  width: 1.28571429em;\n  height: 1.28571429em;\n  animation: loader 0.6s infinite linear;\n  border: 0.2em solid #767676;\n  border-radius: 500rem;\n  box-shadow: 0 0 0 1px transparent;\n}\n\n/* --------------\n      Hover\n--------------- */\n.ui.search > .results .result:hover,\n.ui.category.search > .results .category .result:hover {\n  background: #f9fafb;\n}\n.ui.search .action:hover:not(div) {\n  background: #e0e0e0;\n}\n\n/* --------------\n      Active\n--------------- */\n.ui.category.search > .results .category.active {\n  background: #f3f4f5;\n}\n.ui.category.search > .results .category.active > .name {\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.search > .results .result.active,\n.ui.category.search > .results .category .result.active {\n  position: relative;\n  border-left-color: rgba(34, 36, 38, 0.1);\n  background: #f3f4f5;\n  box-shadow: none;\n}\n.ui.search > .results .result.active .title {\n  color: rgba(0, 0, 0, 0.85);\n}\n.ui.search > .results .result.active .description {\n  color: rgba(0, 0, 0, 0.85);\n}\n\n/* --------------------\n            Disabled\n    ---------------------- */\n\n/* Disabled */\n.ui.disabled.search {\n  cursor: default;\n  pointer-events: none;\n  opacity: 0.45;\n}\n\n\n/*******************************\n           Types\n*******************************/\n\n\n/* --------------\n        Clear Icon\n    --------------- */\n.ui.search > .icon.input > .remove.icon {\n  pointer-events: all;\n  transition: opacity 0.1s ease;\n  cursor: pointer;\n  opacity: 0.6;\n}\n.ui.search > .icon.input > .remove.icon:hover {\n  opacity: 1;\n}\n.ui.search > .icon.input:not([class*=\"left icon\"]) > .icon ~ .remove.icon {\n  right: 1.85714em;\n}\n.ui.search input[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n  cursor: pointer;\n  -webkit-transition: opacity 0.1s ease;\n  transition: opacity 0.1s ease;\n  opacity: 0.6;\n  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;\n  height: 1em;\n  width: 1em;\n}\n.ui.search input[type=\"search\"]::-webkit-search-cancel-button:hover {\n  opacity: 1;\n}\n.ui.loading.search input[type=\"search\"]::-webkit-search-cancel-button {\n  display: none;\n}\n.ui.search > .icon.input > input:-ms-input-placeholder ~ .remove.icon {\n  display: none;\n}\n.ui.search > .icon.input > input:placeholder-shown ~ .remove.icon,\n.ui.search.loading > .icon.input > .remove.icon {\n  display: none;\n}\n.ui.search > .icon.input > input:-ms-input-placeholder ~ .remove.icon {\n  display: none;\n}\n\n/* --------------\n        Category\n    --------------- */\n.ui.category.search .results {\n  width: 28em;\n}\n.ui.category.search .results.animating,\n.ui.category.search .results.visible {\n  display: table;\n}\n\n/* Category */\n.ui.category.search > .results .category {\n  display: table-row;\n  background: #f3f4f5;\n  box-shadow: none;\n  transition: background 0.1s ease, border-color 0.1s ease;\n}\n\n/* Last Category */\n.ui.category.search > .results .category:last-child {\n  border-bottom: none;\n}\n\n/* First / Last */\n.ui.category.search > .results .category:first-child .name + .result {\n  border-radius: 0 0.28571429rem 0 0;\n}\n.ui.category.search > .results .category:last-child .result:last-child {\n  border-radius: 0 0 0.28571429rem 0;\n}\n\n/* Category Result Name */\n.ui.category.search > .results .category > .name {\n  display: table-cell;\n  text-overflow: ellipsis;\n  width: 100px;\n  white-space: nowrap;\n  background: transparent;\n  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\";\n  font-size: 1em;\n  padding: 0.4em 1em;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.4);\n  border-bottom: 1px solid rgba(34, 36, 38, 0.1);\n}\n\n/* Category Result */\n.ui.category.search > .results .category .results {\n  display: table-cell;\n  background: #fff;\n  border-left: 1px solid rgba(34, 36, 38, 0.15);\n  border-bottom: 1px solid rgba(34, 36, 38, 0.1);\n}\n.ui.category.search > .results .category .result {\n  border-bottom: 1px solid rgba(34, 36, 38, 0.1);\n  transition: background 0.1s ease, border-color 0.1s ease;\n  padding: 0.85714286em 1.14285714em;\n}\n.ui.horizontal.category.search > .results .category,\n.ui.horizontal.category.search > .results .category > .name,\n.ui.horizontal.category.search > .results .category > .results {\n  display: block;\n}\n.ui.horizontal.category.search > .results .category > .results {\n  width: 100%;\n  border-left: 0;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* -------------------\n         Scrolling\n    -------------------- */\n.ui.scrolling.search > .results,\n.ui.search.long > .results,\n.ui.search.short > .results {\n  overflow-x: hidden;\n  overflow-y: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.scrolling.search > .results {\n    max-height: 12.17714286em;\n  }\n  .resizable.ui.scrolling.search > .results {\n    height: 12.17714286em;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.scrolling.search > .results {\n    max-height: 18.26571429em;\n  }\n  .resizable.ui.scrolling.search > .results {\n    height: 18.26571429em;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.scrolling.search > .results {\n    max-height: 24.35428571em;\n  }\n  .resizable.ui.scrolling.search > .results {\n    height: 24.35428571em;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.scrolling.search > .results {\n    max-height: 36.53142857em;\n  }\n  .resizable.ui.scrolling.search > .results {\n    height: 36.53142857em;\n  }\n}\n.ui.scrolling.resizable.search > .results {\n  resize: vertical;\n  max-height: none;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.search.short > .results {\n    max-height: 12.17714286em;\n  }\n  .ui.search[class*=\"very short\"] > .results {\n    max-height: 9.13285714em;\n  }\n  .ui.search.long > .results {\n    max-height: 24.35428571em;\n  }\n  .ui.search[class*=\"very long\"] > .results {\n    max-height: 36.53142857em;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.search.short > .results {\n    max-height: 18.26571429em;\n  }\n  .ui.search[class*=\"very short\"] > .results {\n    max-height: 13.69928571em;\n  }\n  .ui.search.long > .results {\n    max-height: 36.53142857em;\n  }\n  .ui.search[class*=\"very long\"] > .results {\n    max-height: 54.79714286em;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.search.short > .results {\n    max-height: 24.35428571em;\n  }\n  .ui.search[class*=\"very short\"] > .results {\n    max-height: 18.26571429em;\n  }\n  .ui.search.long > .results {\n    max-height: 48.70857143em;\n  }\n  .ui.search[class*=\"very long\"] > .results {\n    max-height: 73.06285714em;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.search.short > .results {\n    max-height: 36.53142857em;\n  }\n  .ui.search[class*=\"very short\"] > .results {\n    max-height: 27.39857143em;\n  }\n  .ui.search.long > .results {\n    max-height: 73.06285714em;\n  }\n  .ui.search[class*=\"very long\"] > .results {\n    max-height: 109.59428571em;\n  }\n}\n\n/* -------------------\n         Left / Right\n    -------------------- */\n.ui[class*=\"left aligned\"].search > .results {\n  right: auto;\n  left: 0;\n}\n.ui[class*=\"right aligned\"].search > .results {\n  right: 0;\n  left: auto;\n}\n\n/* --------------\n    Fluid\n--------------- */\n.ui.fluid.search .results {\n  width: 100%;\n}\n\n/* --------------\n      Sizes\n--------------- */\n.ui.search {\n  font-size: 1em;\n}\n.ui.mini.search {\n  font-size: 0.78571429em;\n}\n.ui.tiny.search {\n  font-size: 0.85714286em;\n}\n.ui.small.search {\n  font-size: 0.92857143em;\n}\n.ui.large.search {\n  font-size: 1.14285714em;\n}\n.ui.big.search {\n  font-size: 1.28571429em;\n}\n.ui.huge.search {\n  font-size: 1.42857143em;\n}\n.ui.massive.search {\n  font-size: 1.71428571em;\n}\n\n/* --------------\n      Mobile\n--------------- */\n@media only screen and (max-width: 767.98px) {\n  .ui.search .results {\n    max-width: calc(100vw - 2rem);\n  }\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/search.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Search\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.search = function (parameters) {\n        var\n            $allModules     = $(this),\n\n            time            = Date.now(),\n            performance     = [],\n\n            query           = arguments[0],\n            methodInvoked   = typeof query === 'string',\n            queryArguments  = [].slice.call(arguments, 1),\n            returnedValue\n        ;\n        $allModules.each(function () {\n            var\n                settings          = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.search.settings, parameters)\n                    : $.extend({}, $.fn.search.settings),\n\n                className        = settings.className,\n                metadata         = settings.metadata,\n                regExp           = settings.regExp,\n                fields           = settings.fields,\n                selector         = settings.selector,\n                error            = settings.error,\n                namespace        = settings.namespace,\n\n                eventNamespace   = '.' + namespace,\n                moduleNamespace  = namespace + '-module',\n\n                $module          = $(this),\n                $prompt          = $module.find(selector.prompt),\n                $searchButton    = $module.find(selector.searchButton),\n                $results         = $module.find(selector.results),\n                $result          = $module.find(selector.result),\n                $category        = $module.find(selector.category),\n\n                element          = this,\n                instance         = $module.data(moduleNamespace),\n\n                disabledBubbled  = false,\n                resultsDismissed = false,\n\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.verbose('Initializing module');\n                    module.get.settings();\n                    module.determine.searchFields();\n                    module.bind.events();\n                    module.set.type();\n                    module.create.results();\n                    module.instantiate();\n                },\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n                destroy: function () {\n                    module.verbose('Destroying instance');\n                    $module\n                        .off(eventNamespace)\n                        .removeData(moduleNamespace)\n                    ;\n                },\n\n                refresh: function () {\n                    module.debug('Refreshing selector cache');\n                    $prompt = $module.find(selector.prompt);\n                    $searchButton = $module.find(selector.searchButton);\n                    $category = $module.find(selector.category);\n                    $results = $module.find(selector.results);\n                    $result = $module.find(selector.result);\n                },\n\n                refreshResults: function () {\n                    $results = $module.find(selector.results);\n                    $result = $module.find(selector.result);\n                },\n\n                bind: {\n                    events: function () {\n                        module.verbose('Binding events to search');\n                        if (settings.automatic) {\n                            $module\n                                .on(module.get.inputEvent() + eventNamespace, selector.prompt, module.event.input)\n                            ;\n                            $prompt\n                                .attr('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')\n                            ;\n                        }\n                        $module\n                            // prompt\n                            .on('focus' + eventNamespace, selector.prompt, module.event.focus)\n                            .on('blur' + eventNamespace, selector.prompt, module.event.blur)\n                            .on('keydown' + eventNamespace, selector.prompt, module.handleKeyboard)\n                            // search button\n                            .on('click' + eventNamespace, selector.searchButton, module.query)\n                            // results\n                            .on('mousedown' + eventNamespace, selector.results, module.event.result.mousedown)\n                            .on('mouseup' + eventNamespace, selector.results, module.event.result.mouseup)\n                            .on('click' + eventNamespace, selector.result, module.event.result.click)\n                            .on('click' + eventNamespace, selector.remove, module.event.remove.click)\n                        ;\n                    },\n                },\n\n                determine: {\n                    searchFields: function () {\n                        // this makes sure $.extend does not add specified search fields to default fields\n                        // this is the only setting which should not extend defaults\n                        if (parameters && parameters.searchFields !== undefined) {\n                            settings.searchFields = Array.isArray(parameters.searchFields)\n                                ? parameters.searchFields\n                                : [parameters.searchFields]\n                            ;\n                        }\n                    },\n                },\n\n                event: {\n                    input: function () {\n                        if (settings.searchDelay) {\n                            clearTimeout(module.timer);\n                            module.timer = setTimeout(function () {\n                                if (module.is.focused()) {\n                                    module.query();\n                                }\n                            }, settings.searchDelay);\n                        } else {\n                            module.query();\n                        }\n                    },\n                    focus: function () {\n                        module.set.focus();\n                        if (settings.searchOnFocus && module.has.minimumCharacters()) {\n                            module.query(function () {\n                                if (module.can.show()) {\n                                    module.showResults();\n                                }\n                            });\n                        }\n                    },\n                    blur: function (event) {\n                        var\n                            pageLostFocus = document.activeElement === this,\n                            callback      = function () {\n                                module.cancel.query();\n                                module.remove.focus();\n                                module.timer = setTimeout(function () {\n                                    module.hideResults();\n                                }, settings.hideDelay);\n                            }\n                        ;\n                        if (pageLostFocus) {\n                            return;\n                        }\n                        resultsDismissed = false;\n                        if (module.resultsClicked) {\n                            module.debug('Determining if user action caused search to close');\n                            $module\n                                .one('click.close' + eventNamespace, selector.results, function (event) {\n                                    if (module.is.inMessage(event) || disabledBubbled) {\n                                        $prompt.trigger('focus');\n\n                                        return;\n                                    }\n                                    disabledBubbled = false;\n                                    if (!module.is.animating() && !module.is.hidden()) {\n                                        callback();\n                                    }\n                                })\n                            ;\n                        } else {\n                            module.debug('Input blurred without user action, closing results');\n                            callback();\n                        }\n                    },\n                    remove: {\n                        click: function () {\n                            module.clear.value();\n                            $prompt.trigger('focus');\n                        },\n                    },\n                    result: {\n                        mousedown: function () {\n                            module.resultsClicked = true;\n                        },\n                        mouseup: function () {\n                            module.resultsClicked = false;\n                        },\n                        click: function (event) {\n                            module.debug('Search result selected');\n                            var\n                                $result = $(this),\n                                $title  = $result.find(selector.title).eq(0),\n                                $link   = $result.is('a[href]')\n                                    ? $result\n                                    : $result.find('a[href]').eq(0),\n                                href    = $link.attr('href') || false,\n                                target  = $link.attr('target') || false,\n                                // title is used for result lookup\n                                value   = $title.length > 0\n                                    ? $title.text()\n                                    : false,\n                                results = module.get.results(),\n                                result  = $result.data(metadata.result) || module.get.result(value, results)\n                            ;\n                            var oldValue = module.get.value();\n                            if (isFunction(settings.onSelect)) {\n                                if (settings.onSelect.call(element, result, results) === false) {\n                                    module.debug('Custom onSelect callback cancelled default select action');\n                                    disabledBubbled = true;\n\n                                    return;\n                                }\n                            }\n                            module.hideResults();\n                            if (value && module.get.value() === oldValue) {\n                                module.set.value(value);\n                            }\n                            if (href) {\n                                event.preventDefault();\n                                module.verbose('Opening search link found in result', $link);\n                                if (target === '_blank' || event.ctrlKey) {\n                                    window.open(href);\n                                } else {\n                                    window.location.href = href;\n                                }\n                            }\n                        },\n                    },\n                },\n                ensureVisible: function ($el) {\n                    var\n                        elTop,\n                        elBottom,\n                        resultsScrollTop,\n                        resultsHeight\n                    ;\n                    if ($el.length === 0) {\n                        return;\n                    }\n                    elTop = $el.position().top;\n                    elBottom = elTop + $el.outerHeight(true);\n\n                    resultsScrollTop = $results.scrollTop();\n                    resultsHeight = $results.height();\n\n                    if (elTop < 0) {\n                        $results.scrollTop(resultsScrollTop + elTop);\n                    } else if (resultsHeight < elBottom) {\n                        $results.scrollTop(resultsScrollTop + (elBottom - resultsHeight));\n                    }\n                },\n                handleKeyboard: function (event) {\n                    var\n                        // force selector refresh\n                        $result         = $module.find(selector.result),\n                        $category       = $module.find(selector.category),\n                        $activeResult   = $result.filter('.' + className.active),\n                        currentIndex    = $result.index($activeResult),\n                        resultSize      = $result.length,\n                        hasActiveResult = $activeResult.length > 0,\n\n                        keyCode         = event.which,\n                        keys            = {\n                            backspace: 8,\n                            enter: 13,\n                            escape: 27,\n                            upArrow: 38,\n                            downArrow: 40,\n                        },\n                        newIndex\n                    ;\n                    // search shortcuts\n                    if (keyCode === keys.escape) {\n                        if (!module.is.visible()) {\n                            module.verbose('Escape key pressed, blurring search field');\n                            $prompt.trigger('blur');\n                        } else {\n                            module.hideResults();\n                        }\n                        event.stopPropagation();\n                        resultsDismissed = true;\n                    }\n                    if (module.is.visible()) {\n                        if (keyCode === keys.enter) {\n                            module.verbose('Enter key pressed, selecting active result');\n                            if ($result.filter('.' + className.active).length > 0) {\n                                module.event.result.click.call($result.filter('.' + className.active), event);\n                                event.preventDefault();\n\n                                return false;\n                            }\n                        } else if (keyCode === keys.upArrow && hasActiveResult) {\n                            module.verbose('Up key pressed, changing active result');\n                            newIndex = currentIndex - 1 < 0\n                                ? currentIndex\n                                : currentIndex - 1;\n                            $category\n                                .removeClass(className.active)\n                            ;\n                            $result\n                                .removeClass(className.active)\n                                .eq(newIndex)\n                                .addClass(className.active)\n                                .closest($category)\n                                .addClass(className.active)\n                            ;\n                            module.ensureVisible($result.eq(newIndex));\n                            event.preventDefault();\n                        } else if (keyCode === keys.downArrow) {\n                            module.verbose('Down key pressed, changing active result');\n                            newIndex = currentIndex + 1 >= resultSize\n                                ? currentIndex\n                                : currentIndex + 1;\n                            $category\n                                .removeClass(className.active)\n                            ;\n                            $result\n                                .removeClass(className.active)\n                                .eq(newIndex)\n                                .addClass(className.active)\n                                .closest($category)\n                                .addClass(className.active)\n                            ;\n                            module.ensureVisible($result.eq(newIndex));\n                            event.preventDefault();\n                        }\n                    } else {\n                        // query shortcuts\n                        if (keyCode === keys.enter) {\n                            module.verbose('Enter key pressed, executing query');\n                            module.query();\n                            module.set.buttonPressed();\n                            $prompt.one('keyup', module.remove.buttonFocus);\n                        }\n                    }\n                },\n\n                setup: {\n                    api: function (searchTerm, callback) {\n                        var\n                            apiSettings = {\n                                debug: settings.debug,\n                                on: false,\n                                cache: settings.cache,\n                                action: 'search',\n                                urlData: {\n                                    query: searchTerm,\n                                },\n                            },\n                            apiCallbacks = {\n                                onSuccess: function (response, $module, xhr) {\n                                    module.parse.response.call(element, response, searchTerm);\n                                    callback();\n                                    if (settings.apiSettings && typeof settings.apiSettings.onSuccess === 'function') {\n                                        settings.apiSettings.onSuccess.call(this, response, $module, xhr);\n                                    }\n                                },\n                                onFailure: function (response, $module, xhr) {\n                                    module.displayMessage(error.serverError);\n                                    callback();\n                                    if (settings.apiSettings && typeof settings.apiSettings.onFailure === 'function') {\n                                        settings.apiSettings.onFailure.call(this, response, $module, xhr);\n                                    }\n                                },\n                                onAbort: function (status, $module, xhr) {\n                                    if (settings.apiSettings && typeof settings.apiSettings.onAbort === 'function') {\n                                        settings.apiSettings.onAbort.call(this, status, $module, xhr);\n                                    }\n                                },\n                                onError: function (errorMessage, $module, xhr) {\n                                    module.error();\n                                    if (settings.apiSettings && typeof settings.apiSettings.onError === 'function') {\n                                        settings.apiSettings.onError.call(this, errorMessage, $module, xhr);\n                                    }\n                                },\n                            }\n                        ;\n                        $.extend(true, apiSettings, settings.apiSettings, apiCallbacks);\n                        module.verbose('Setting up API request', apiSettings);\n                        $module.api(apiSettings);\n                    },\n                },\n\n                can: {\n                    useAPI: function () {\n                        return $.fn.api !== undefined;\n                    },\n                    show: function () {\n                        return module.is.focused() && !module.is.visible() && !module.is.empty();\n                    },\n                    transition: function () {\n                        return settings.transition && $.fn.transition !== undefined;\n                    },\n                },\n\n                is: {\n                    animating: function () {\n                        return $results.hasClass(className.animating);\n                    },\n                    chrome: function () {\n                        return !!window.chrome && !window.StyleMedia;\n                    },\n                    hidden: function () {\n                        return $results.hasClass(className.hidden);\n                    },\n                    inMessage: function (event) {\n                        if (!event.target) {\n                            return;\n                        }\n                        var\n                            $target = $(event.target),\n                            isInDOM = $.contains(document.documentElement, event.target)\n                        ;\n\n                        return isInDOM && $target.closest(selector.message).length > 0;\n                    },\n                    empty: function () {\n                        return $results.html() === '';\n                    },\n                    visible: function () {\n                        return $results.filter(':visible').length > 0;\n                    },\n                    focused: function () {\n                        return $prompt.filter(':focus').length > 0;\n                    },\n                },\n\n                get: {\n                    settings: function () {\n                        if ($.isPlainObject(parameters) && parameters.searchFullText) {\n                            settings.fullTextSearch = parameters.searchFullText;\n                            module.error(settings.error.oldSearchSyntax, element);\n                        }\n                        if (settings.ignoreDiacritics && !String.prototype.normalize) {\n                            settings.ignoreDiacritics = false;\n                            module.error(error.noNormalize, element);\n                        }\n                    },\n                    inputEvent: function () {\n                        var\n                            prompt = $prompt[0],\n                            inputEvent   = prompt !== undefined && prompt.oninput !== undefined\n                                ? 'input'\n                                : (prompt !== undefined && prompt.onpropertychange !== undefined\n                                    ? 'propertychange'\n                                    : 'keyup')\n                        ;\n\n                        return inputEvent;\n                    },\n                    value: function () {\n                        return $prompt.val();\n                    },\n                    results: function () {\n                        return $module.data(metadata.results);\n                    },\n                    result: function (value, results) {\n                        var\n                            result       = false\n                        ;\n                        value = value !== undefined\n                            ? value\n                            : module.get.value();\n                        results = results !== undefined\n                            ? results\n                            : module.get.results();\n                        if (settings.type === 'category') {\n                            module.debug('Finding result that matches', value);\n                            $.each(results, function (index, category) {\n                                if (Array.isArray(category.results)) {\n                                    result = module.search.object(value, category.results)[0];\n                                    // don't continue searching if a result is found\n                                    if (result) {\n                                        return false;\n                                    }\n                                }\n                            });\n                        } else {\n                            module.debug('Finding result in results object', value);\n                            result = module.search.object(value, results)[0];\n                        }\n\n                        return result || false;\n                    },\n                },\n\n                select: {\n                    firstResult: function () {\n                        module.verbose('Selecting first result');\n                        $result.first().addClass(className.active);\n                    },\n                },\n\n                set: {\n                    focus: function () {\n                        $module.addClass(className.focus);\n                    },\n                    loading: function () {\n                        $module.addClass(className.loading);\n                    },\n                    value: function (value) {\n                        module.verbose('Setting search input value', value);\n                        $prompt\n                            .val(value)\n                        ;\n                    },\n                    type: function (type) {\n                        type = type || settings.type;\n                        if (className[type]) {\n                            $module.addClass(className[type]);\n                        }\n                    },\n                    buttonPressed: function () {\n                        $searchButton.addClass(className.pressed);\n                    },\n                },\n\n                remove: {\n                    loading: function () {\n                        $module.removeClass(className.loading);\n                    },\n                    focus: function () {\n                        $module.removeClass(className.focus);\n                    },\n                    buttonPressed: function () {\n                        $searchButton.removeClass(className.pressed);\n                    },\n                    diacritics: function (text) {\n                        return settings.ignoreDiacritics ? text.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '') : text;\n                    },\n                },\n\n                query: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    var\n                        searchTerm = module.get.value(),\n                        cache = module.read.cache(searchTerm)\n                    ;\n                    callback = callback || function () {};\n                    if (module.has.minimumCharacters()) {\n                        if (cache) {\n                            module.debug('Reading result from cache', searchTerm);\n                            module.save.results(cache.results);\n                            settings.onResults.call(element, cache.results, true);\n                            module.addResults(cache.html);\n                            module.inject.id(cache.results);\n                            callback();\n                        } else {\n                            module.debug('Querying for', searchTerm);\n                            if ($.isPlainObject(settings.source) || Array.isArray(settings.source)) {\n                                module.search.local(searchTerm);\n                                callback();\n                            } else if (module.can.useAPI()) {\n                                module.search.remote(searchTerm, callback);\n                            } else {\n                                module.error(error.source);\n                                callback();\n                            }\n                        }\n                        settings.onSearchQuery.call(element, searchTerm);\n                    } else {\n                        module.hideResults();\n                    }\n                },\n\n                search: {\n                    local: function (searchTerm) {\n                        var\n                            results = module.search.object(searchTerm, settings.source),\n                            searchHTML\n                        ;\n                        module.set.loading();\n                        module.save.results(results);\n                        module.debug('Returned full local search results', results);\n                        if (settings.maxResults > 0) {\n                            module.debug('Using specified max results', results);\n                            results = results.slice(0, settings.maxResults);\n                        }\n                        if (settings.type === 'category') {\n                            results = module.create.categoryResults(results);\n                        }\n                        searchHTML = module.generateResults({\n                            results: results,\n                        });\n                        module.remove.loading();\n                        module.addResults(searchHTML);\n                        module.inject.id(results);\n                        module.write.cache(searchTerm, {\n                            html: searchHTML,\n                            results: results,\n                        });\n                    },\n                    remote: function (searchTerm, callback) {\n                        callback = isFunction(callback)\n                            ? callback\n                            : function () {};\n                        if ($module.api('is loading')) {\n                            $module.api('abort');\n                        }\n                        module.setup.api(searchTerm, callback);\n                        $module\n                            .api('query')\n                        ;\n                    },\n                    object: function (searchTerm, source, searchFields) {\n                        searchTerm = module.remove.diacritics(String(searchTerm));\n                        var\n                            results      = [],\n                            exactResults = [],\n                            fuzzyResults = [],\n                            searchExp    = searchTerm.replace(regExp.escape, '\\\\$&'),\n                            matchRegExp = new RegExp(regExp.beginsWith + searchExp, settings.ignoreSearchCase ? 'i' : ''),\n\n                            // avoid duplicates when pushing results\n                            addResult = function (array, result) {\n                                var\n                                    notResult      = $.inArray(result, results) === -1,\n                                    notFuzzyResult = $.inArray(result, fuzzyResults) === -1,\n                                    notExactResults = $.inArray(result, exactResults) === -1\n                                ;\n                                if (notResult && notFuzzyResult && notExactResults) {\n                                    array.push(result);\n                                }\n                            }\n                        ;\n                        source = source || settings.source;\n                        searchFields = searchFields !== undefined\n                            ? searchFields\n                            : settings.searchFields;\n\n                        // search fields should be array to loop correctly\n                        if (!Array.isArray(searchFields)) {\n                            searchFields = [searchFields];\n                        }\n\n                        // exit conditions if no source\n                        if (source === undefined || source === false) {\n                            module.error(error.source);\n\n                            return [];\n                        }\n                        // iterate through search fields looking for matches\n                        var lastSearchFieldIndex = searchFields.length - 1;\n                        $.each(source, function (label, content) {\n                            var concatenatedContent = [];\n                            $.each(searchFields, function (index, field) {\n                                var\n                                    fieldExists = typeof content[field] === 'string' || typeof content[field] === 'number'\n                                ;\n                                if (fieldExists) {\n                                    var text;\n                                    text = typeof content[field] === 'string'\n                                        ? module.remove.diacritics(content[field])\n                                        : content[field].toString();\n                                    text = $('<div/>', { html: text }).text().trim();\n                                    if (settings.fullTextSearch === 'all') {\n                                        concatenatedContent.push(text);\n                                        if (index < lastSearchFieldIndex) {\n                                            return true;\n                                        }\n                                        text = concatenatedContent.join(' ');\n                                    }\n                                    if (settings.fullTextSearch !== 'all' && text.search(matchRegExp) !== -1) {\n                                        // content starts with value (first in results)\n                                        addResult(results, content);\n                                    } else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) {\n                                        addResult(exactResults, content);\n                                    } else if (settings.fullTextSearch === 'some' && module.wordSearch(searchTerm, text)) {\n                                        addResult(exactResults, content);\n                                    } else if (settings.fullTextSearch === 'all' && module.wordSearch(searchTerm, text, true)) {\n                                        addResult(exactResults, content);\n                                    } else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text)) {\n                                        // content fuzzy matches (last in results)\n                                        addResult(fuzzyResults, content);\n                                    }\n                                }\n                            });\n                        });\n                        $.merge(exactResults, fuzzyResults);\n                        $.merge(results, exactResults);\n\n                        return results;\n                    },\n                },\n                exactSearch: function (query, term) {\n                    if (settings.ignoreSearchCase) {\n                        query = query.toLowerCase();\n                        term = term.toLowerCase();\n                    }\n\n                    return term.indexOf(query) > -1;\n                },\n                wordSearch: function (query, term, matchAll) {\n                    var allWords = query.split(/\\s+/),\n                        w,\n                        wL = allWords.length,\n                        found = false\n                    ;\n                    for (w = 0; w < wL; w++) {\n                        found = module.exactSearch(allWords[w], term);\n                        if ((!found && matchAll) || (found && !matchAll)) {\n                            break;\n                        }\n                    }\n\n                    return found;\n                },\n                fuzzySearch: function (query, term) {\n                    var\n                        termLength  = term.length,\n                        queryLength = query.length\n                    ;\n                    if (typeof query !== 'string') {\n                        return false;\n                    }\n                    if (settings.ignoreSearchCase) {\n                        query = query.toLowerCase();\n                        term = term.toLowerCase();\n                    }\n                    if (queryLength > termLength) {\n                        return false;\n                    }\n                    if (queryLength === termLength) {\n                        return query === term;\n                    }\n                    for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {\n                        var\n                            continueSearch = false,\n                            queryCharacter = query.charCodeAt(characterIndex)\n                        ;\n                        while (nextCharacterIndex < termLength) {\n                            if (term.charCodeAt(nextCharacterIndex++) === queryCharacter) {\n                                continueSearch = true;\n\n                                break;\n                            }\n                        }\n\n                        if (!continueSearch) {\n                            return false;\n                        }\n                    }\n\n                    return true;\n                },\n\n                parse: {\n                    response: function (response, searchTerm) {\n                        if (Array.isArray(response)) {\n                            var o = {};\n                            o[fields.results] = response;\n                            response = o;\n                        }\n                        var\n                            searchHTML = module.generateResults(response)\n                        ;\n                        module.verbose('Parsing server response', response);\n                        if (response !== undefined) {\n                            if (searchTerm !== undefined && response[fields.results] !== undefined) {\n                                module.addResults(searchHTML);\n                                module.inject.id(response[fields.results]);\n                                module.write.cache(searchTerm, {\n                                    html: searchHTML,\n                                    results: response[fields.results],\n                                });\n                                module.save.results(response[fields.results]);\n                            }\n                        }\n                    },\n                },\n\n                cancel: {\n                    query: function () {\n                        if (module.can.useAPI()) {\n                            $module.api('abort');\n                        }\n                    },\n                },\n\n                has: {\n                    minimumCharacters: function () {\n                        var\n                            searchTerm    = module.get.value(),\n                            numCharacters = searchTerm.length\n                        ;\n\n                        return numCharacters >= settings.minCharacters;\n                    },\n                    results: function () {\n                        if ($results.length === 0) {\n                            return false;\n                        }\n                        var\n                            html = $results.html()\n                        ;\n\n                        return html !== '';\n                    },\n                },\n\n                clear: {\n                    cache: function (value) {\n                        var\n                            cache = $module.data(metadata.cache)\n                        ;\n                        if (!value) {\n                            module.debug('Clearing cache', value);\n                            $module.removeData(metadata.cache);\n                        } else if (value && cache && cache[value]) {\n                            module.debug('Removing value from cache', value);\n                            delete cache[value];\n                            $module.data(metadata.cache, cache);\n                        }\n                    },\n                    value: function () {\n                        module.set.value('');\n                    },\n                },\n\n                read: {\n                    cache: function (name) {\n                        var\n                            cache = $module.data(metadata.cache)\n                        ;\n                        if (settings.cache) {\n                            module.verbose('Checking cache for generated html for query', name);\n\n                            return (typeof cache === 'object') && (cache[name] !== undefined)\n                                ? cache[name]\n                                : false;\n                        }\n\n                        return false;\n                    },\n                },\n\n                create: {\n                    categoryResults: function (results) {\n                        var\n                            categoryResults = {}\n                        ;\n                        $.each(results, function (index, result) {\n                            if (!result.category) {\n                                return;\n                            }\n                            if (categoryResults[result.category] === undefined) {\n                                module.verbose('Creating new category of results', result.category);\n                                categoryResults[result.category] = {\n                                    name: result.category,\n                                    results: [result],\n                                };\n                            } else {\n                                categoryResults[result.category].results.push(result);\n                            }\n                        });\n\n                        return categoryResults;\n                    },\n                    id: function (resultIndex, categoryIndex) {\n                        var\n                            resultID      = resultIndex + 1, // not zero indexed\n                            letterID,\n                            id\n                        ;\n                        if (categoryIndex !== undefined) {\n                            // start char code for \"A\"\n                            letterID = String.fromCharCode(97 + categoryIndex);\n                            id = letterID + resultID;\n                            module.verbose('Creating category result id', id);\n                        } else {\n                            id = resultID;\n                            module.verbose('Creating result id', id);\n                        }\n\n                        return id;\n                    },\n                    results: function () {\n                        if ($results.length === 0) {\n                            $results = $('<div />')\n                                .addClass(className.results)\n                                .appendTo($module)\n                            ;\n                        }\n                    },\n                },\n\n                inject: {\n                    result: function (result, resultIndex, categoryIndex) {\n                        module.verbose('Injecting result into results');\n                        var\n                            $selectedResult = categoryIndex !== undefined\n                                ? $results\n                                    .children().eq(categoryIndex)\n                                    .children(selector.results)\n                                    .first()\n                                    .children(selector.result)\n                                    .eq(resultIndex)\n                                : $results\n                                    .children(selector.result).eq(resultIndex)\n                        ;\n                        module.verbose('Injecting results metadata', $selectedResult);\n                        $selectedResult\n                            .data(metadata.result, result)\n                        ;\n                    },\n                    id: function (results) {\n                        module.debug('Injecting unique ids into results');\n                        var\n                            // since results may be object, we must use counters\n                            categoryIndex = 0,\n                            resultIndex   = 0\n                        ;\n                        if (settings.type === 'category') {\n                            // iterate through each category result\n                            $.each(results, function (index, category) {\n                                if (category.results.length > 0) {\n                                    resultIndex = 0;\n                                    $.each(category.results, function (index, result) {\n                                        if (result.id === undefined) {\n                                            result.id = module.create.id(resultIndex, categoryIndex);\n                                        }\n                                        module.inject.result(result, resultIndex, categoryIndex);\n                                        resultIndex++;\n                                    });\n                                    categoryIndex++;\n                                }\n                            });\n                        } else {\n                            // top level\n                            $.each(results, function (index, result) {\n                                if (result.id === undefined) {\n                                    result.id = module.create.id(resultIndex);\n                                }\n                                module.inject.result(result, resultIndex);\n                                resultIndex++;\n                            });\n                        }\n\n                        return results;\n                    },\n                },\n\n                save: {\n                    results: function (results) {\n                        module.verbose('Saving current search results to metadata', results);\n                        $module.data(metadata.results, results);\n                    },\n                },\n\n                write: {\n                    cache: function (name, value) {\n                        var\n                            cache = $module.data(metadata.cache) !== undefined\n                                ? $module.data(metadata.cache)\n                                : {}\n                        ;\n                        if (settings.cache) {\n                            module.verbose('Writing generated html to cache', name, value);\n                            cache[name] = value;\n                            $module\n                                .data(metadata.cache, cache)\n                            ;\n                        }\n                    },\n                },\n\n                addResults: function (html) {\n                    if (isFunction(settings.onResultsAdd)) {\n                        if (settings.onResultsAdd.call($results, html) === false) {\n                            module.debug('onResultsAdd callback cancelled default action');\n\n                            return false;\n                        }\n                    }\n                    if (html) {\n                        $results\n                            .html(html)\n                        ;\n                        module.refreshResults();\n                        if (settings.selectFirstResult) {\n                            module.select.firstResult();\n                        }\n                        module.showResults();\n                    } else {\n                        module.hideResults(function () {\n                            $results.empty();\n                        });\n                    }\n                },\n\n                showResults: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if (resultsDismissed) {\n                        return;\n                    }\n                    if (!module.is.visible() && module.has.results()) {\n                        if (module.can.transition()) {\n                            module.debug('Showing results with css animations');\n                            $results\n                                .transition({\n                                    animation: settings.transition + ' in',\n                                    debug: settings.debug,\n                                    verbose: settings.verbose,\n                                    silent: settings.silent,\n                                    duration: settings.duration,\n                                    onShow: function () {\n                                        var $firstResult = $module.find(selector.result).eq(0);\n                                        module.ensureVisible($firstResult);\n                                    },\n                                    onComplete: function () {\n                                        callback();\n                                    },\n                                    queue: true,\n                                })\n                            ;\n                        } else {\n                            module.debug('Showing results with javascript');\n                            $results\n                                .stop()\n                                .fadeIn(settings.duration, settings.easing)\n                            ;\n                        }\n                        settings.onResultsOpen.call($results);\n                    }\n                },\n                hideResults: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if (module.is.visible()) {\n                        if (module.can.transition()) {\n                            module.debug('Hiding results with css animations');\n                            $results\n                                .transition({\n                                    animation: settings.transition + ' out',\n                                    debug: settings.debug,\n                                    verbose: settings.verbose,\n                                    silent: settings.silent,\n                                    duration: settings.duration,\n                                    onComplete: function () {\n                                        callback();\n                                    },\n                                    queue: true,\n                                })\n                            ;\n                        } else {\n                            module.debug('Hiding results with javascript');\n                            $results\n                                .stop()\n                                .fadeOut(settings.duration, settings.easing)\n                            ;\n                        }\n                        settings.onResultsClose.call($results);\n                    }\n                },\n\n                generateResults: function (response) {\n                    module.debug('Generating html from response', response);\n                    var\n                        template       = settings.templates[settings.type],\n                        isProperObject = $.isPlainObject(response[fields.results]) && !$.isEmptyObject(response[fields.results]),\n                        isProperArray  = Array.isArray(response[fields.results]) && response[fields.results].length > 0,\n                        html           = ''\n                    ;\n                    if (isProperObject || isProperArray) {\n                        if (settings.maxResults > 0) {\n                            if (isProperObject) {\n                                if (settings.type === 'standard') {\n                                    module.error(error.maxResults);\n                                }\n                            } else {\n                                response[fields.results] = response[fields.results].slice(0, settings.maxResults);\n                            }\n                        }\n                        if (settings.highlightMatches) {\n                            var results = response[fields.results],\n                                regExpIgnore = settings.ignoreSearchCase ? 'i' : '',\n                                querySplit = module.get.value().split(''),\n                                diacriticReg = settings.ignoreDiacritics ? '[\\u0300-\\u036F]?' : '',\n                                htmlReg = '(?![^<]*>)',\n                                markedRegExp = new RegExp(htmlReg + '(' + querySplit.join(diacriticReg + ')(.*?)' + htmlReg + '(') + diacriticReg + ')', regExpIgnore),\n                                markedReplacer = function () {\n                                    var args = [].slice.call(arguments, 1, querySplit.length * 2).map(function (x, i) {\n                                        return i & 1 ? x : '<mark>' + x + '</mark>'; // eslint-disable-line no-bitwise\n                                    });\n\n                                    return args.join('');\n                                }\n                            ;\n                            $.each(results, function (label, content) {\n                                $.each(settings.searchFields, function (index, field) {\n                                    var\n                                        fieldExists = typeof content[field] === 'string' || typeof content[field] === 'number'\n                                    ;\n                                    if (fieldExists) {\n                                        var markedHTML = typeof content[field] === 'string'\n                                            ? content[field]\n                                            : content[field].toString();\n                                        if (settings.ignoreDiacritics) {\n                                            markedHTML = markedHTML.normalize('NFD');\n                                        }\n                                        markedHTML = markedHTML.replace(/<\\/?mark>/g, '');\n                                        response[fields.results][label][field] = markedHTML.replace(markedRegExp, markedReplacer);\n                                    }\n                                });\n                            });\n                        }\n                        if (isFunction(template)) {\n                            html = template(response, fields, settings.preserveHTML);\n                        } else {\n                            module.error(error.noTemplate, false);\n                        }\n                    } else if (settings.showNoResults) {\n                        html = module.displayMessage(error.noResults, 'empty', error.noResultsHeader);\n                    }\n                    settings.onResults.call(element, response);\n\n                    return html;\n                },\n\n                displayMessage: function (text, type, header) {\n                    type = type || 'standard';\n                    module.debug('Displaying message', text, type, header);\n                    module.addResults(settings.templates.message(text, type, header));\n\n                    return settings.templates.message(text, type, header);\n                },\n\n                setting: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        settings[name] = value;\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if ($allModules.length > 1) {\n                            title += ' (' + $allModules.length + ')';\n                        }\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.search.settings = {\n\n        name: 'Search',\n        namespace: 'search',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        // template to use (specified in settings.templates)\n        type: 'standard',\n\n        // minimum characters required to search\n        minCharacters: 1,\n\n        // whether to select first result after searching automatically\n        selectFirstResult: false,\n\n        // API config\n        apiSettings: false,\n\n        // object to search\n        source: false,\n\n        // Whether search should query current term on focus\n        searchOnFocus: true,\n\n        // fields to search\n        searchFields: [\n            'id',\n            'title',\n            'description',\n        ],\n\n        // field to display in standard results template\n        displayField: '',\n\n        // search anywhere in value (set to 'exact' to require exact matches\n        fullTextSearch: 'exact',\n\n        // Whether search result should highlight matching strings\n        highlightMatches: false,\n\n        // match results also if they contain diacritics of the same base character (for example searching for \"a\" will also match \"á\" or \"â\" or \"à\", etc...)\n        ignoreDiacritics: false,\n\n        // whether to consider case sensitivity on local searching\n        ignoreSearchCase: true,\n\n        // whether to add events to prompt automatically\n        automatic: true,\n\n        // delay before hiding menu after blur\n        hideDelay: 0,\n\n        // delay before searching\n        searchDelay: 200,\n\n        // maximum results returned from search\n        maxResults: 7,\n\n        // whether to store lookups in local cache\n        cache: true,\n\n        // whether no results errors should be shown\n        showNoResults: true,\n\n        // preserve possible html of resultset values\n        preserveHTML: true,\n\n        // transition settings\n        transition: 'scale',\n        duration: 200,\n        easing: 'easeOutExpo',\n\n        // callbacks\n        onSelect: false,\n        onResultsAdd: false,\n\n        onSearchQuery: function (query) {},\n        onResults: function (response, fromCache) {},\n\n        onResultsOpen: function () {},\n        onResultsClose: function () {},\n\n        className: {\n            animating: 'animating',\n            active: 'active',\n            category: 'category',\n            empty: 'empty',\n            focus: 'focus',\n            hidden: 'hidden',\n            loading: 'loading',\n            results: 'results',\n            pressed: 'down',\n        },\n\n        error: {\n            source: 'Cannot search. No source used, and Fomantic API module was not included',\n            noResultsHeader: 'No Results',\n            noResults: 'Your search returned no results',\n            noTemplate: 'A valid template name was not specified.',\n            oldSearchSyntax: 'searchFullText setting has been renamed fullTextSearch for consistency, please adjust your settings.',\n            serverError: 'There was an issue querying the server.',\n            maxResults: 'Results must be an array to use maxResults setting',\n            method: 'The method you called is not defined.',\n            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.',\n        },\n\n        metadata: {\n            cache: 'cache',\n            results: 'results',\n            result: 'result',\n        },\n\n        regExp: {\n            escape: /[$()*+./?[\\\\\\]^{|}-]/g,\n            beginsWith: '(?:\\\\s|^)',\n        },\n\n        // maps api response attributes to internal representation\n        fields: {\n            categories: 'results', // array of categories (category view)\n            categoryName: 'name', // name of category (category view)\n            categoryResults: 'results', // array of results (category view)\n            description: 'description', // result description\n            image: 'image', // result image\n            alt: 'alt', // result alt text for image\n            price: 'price', // result price\n            results: 'results', // array of results (standard)\n            title: 'title', // result title\n            url: 'url', // result url\n            action: 'action', // \"view more\" object name\n            actionText: 'text', // \"view more\" text\n            actionURL: 'url', // \"view more\" url\n        },\n\n        selector: {\n            prompt: '.prompt',\n            remove: '> .icon.input > .remove.icon',\n            searchButton: '.search.button',\n            results: '.results',\n            message: '.results > .message',\n            category: '.category',\n            result: '.result',\n            title: '.title, .name',\n        },\n\n        templates: {\n            escape: function (string, preserveHTML) {\n                if (preserveHTML) {\n                    return string;\n                }\n                var\n                    badChars     = /[\"'<>`]/g,\n                    shouldEscape = /[\"&'<>`]/,\n                    escape       = {\n                        '<': '&lt;',\n                        '>': '&gt;',\n                        '\"': '&quot;',\n                        \"'\": '&#x27;',\n                        '`': '&#x60;',\n                    },\n                    escapedChar  = function (chr) {\n                        return escape[chr];\n                    };\n                if (shouldEscape.test(string)) {\n                    string = string.replace(/&(?![\\d#a-z]{1,12};)/gi, '&amp;');\n                    string = string.replace(badChars, escapedChar);\n                    // FUI controlled HTML is still allowed\n                    string = string.replace(/&lt;(\\/)*mark&gt;/g, '<$1mark>');\n                }\n\n                return string;\n            },\n            message: function (message, type, header) {\n                var\n                    html = ''\n                ;\n                if (message !== undefined && type !== undefined) {\n                    html += ''\n                        + '<div class=\"message ' + type + '\">';\n                    if (header) {\n                        html += ''\n                            + '<div class=\"header\">' + header + '</div>';\n                    }\n                    html += ' <div class=\"description\">' + message + '</div>';\n                    html += '</div>';\n                }\n\n                return html;\n            },\n            category: function (response, fields, preserveHTML) {\n                var\n                    html = '',\n                    escape = $.fn.search.settings.templates.escape\n                ;\n                if (response[fields.categoryResults] !== undefined) {\n                    // each category\n                    $.each(response[fields.categoryResults], function (index, category) {\n                        if (category[fields.results] !== undefined && category.results.length > 0) {\n                            html += '<div class=\"category\">';\n\n                            if (category[fields.categoryName] !== undefined) {\n                                html += '<div class=\"name\">' + escape(category[fields.categoryName], preserveHTML) + '</div>';\n                            }\n\n                            // each item inside category\n                            html += '<div class=\"results\">';\n                            $.each(category.results, function (index, result) {\n                                html += result[fields.url]\n                                    ? '<a class=\"result\" href=\"' + result[fields.url].replace(/\"/g, '') + '\">'\n                                    : '<a class=\"result\">';\n                                if (result[fields.image] !== undefined) {\n                                    html += ''\n                                        + '<div class=\"image\">'\n                                        + ' <img src=\"' + result[fields.image].replace(/\"/g, '') + (result[fields.alt] ? '\" alt=\"' + result[fields.alt].replace(/\"/g, '') : '') + '\">'\n                                        + '</div>';\n                                }\n                                html += '<div class=\"content\">';\n                                if (result[fields.price] !== undefined) {\n                                    html += '<div class=\"price\">' + escape(result[fields.price], preserveHTML) + '</div>';\n                                }\n                                if (result[fields.title] !== undefined) {\n                                    html += '<div class=\"title\">' + escape(result[fields.title], preserveHTML) + '</div>';\n                                }\n                                if (result[fields.description] !== undefined) {\n                                    html += '<div class=\"description\">' + escape(result[fields.description], preserveHTML) + '</div>';\n                                }\n                                html += ''\n                                    + '</div>';\n                                html += '</a>';\n                            });\n                            html += '</div>';\n                            html += ''\n                                + '</div>';\n                        }\n                    });\n                    if (response[fields.action]) {\n                        html += fields.actionURL === false\n                            ? ''\n                                + '<div class=\"action\">'\n                                + escape(response[fields.action][fields.actionText], preserveHTML)\n                                + '</div>'\n                            : ''\n                                + '<a href=\"' + response[fields.action][fields.actionURL].replace(/\"/g, '') + '\" class=\"action\">'\n                                + escape(response[fields.action][fields.actionText], preserveHTML)\n                                + '</a>';\n                    }\n\n                    return html;\n                }\n\n                return false;\n            },\n            standard: function (response, fields, preserveHTML) {\n                var\n                    html = '',\n                    escape = $.fn.search.settings.templates.escape\n                ;\n                if (response[fields.results] !== undefined) {\n                    // each result\n                    $.each(response[fields.results], function (index, result) {\n                        html += result[fields.url]\n                            ? '<a class=\"result\" href=\"' + result[fields.url].replace(/\"/g, '') + '\">'\n                            : '<a class=\"result\">';\n                        if (result[fields.image] !== undefined) {\n                            html += ''\n                                + '<div class=\"image\">'\n                                + ' <img src=\"' + result[fields.image].replace(/\"/g, '') + (result[fields.alt] ? '\" alt=\"' + result[fields.alt].replace(/\"/g, '') : '') + '\">'\n                                + '</div>';\n                        }\n                        html += '<div class=\"content\">';\n                        if (result[fields.price] !== undefined) {\n                            html += '<div class=\"price\">' + escape(result[fields.price], preserveHTML) + '</div>';\n                        }\n                        if (result[fields.title] !== undefined) {\n                            html += '<div class=\"title\">' + escape(result[fields.title], preserveHTML) + '</div>';\n                        }\n                        if (result[fields.description] !== undefined) {\n                            html += '<div class=\"description\">' + escape(result[fields.description], preserveHTML) + '</div>';\n                        }\n                        html += ''\n                            + '</div>';\n                        html += '</a>';\n                    });\n                    if (response[fields.action]) {\n                        html += fields.actionURL === false\n                            ? ''\n                                + '<div class=\"action\">'\n                                + escape(response[fields.action][fields.actionText], preserveHTML)\n                                + '</div>'\n                            : ''\n                                + '<a href=\"' + response[fields.action][fields.actionURL].replace(/\"/g, '') + '\" class=\"action\">'\n                                + escape(response[fields.action][fields.actionText], preserveHTML)\n                                + '</a>';\n                    }\n\n                    return html;\n                }\n\n                return false;\n            },\n        },\n    };\n\n    $.extend($.easing, {\n        easeOutExpo: function (x) {\n            return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n        },\n    });\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/segment.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Segment\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Segment\n*******************************/\n\n.ui.segment {\n  position: relative;\n  background: #fff;\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);\n  margin: 1rem 0;\n  padding: 1em 1em;\n  border-radius: 0.28571429rem;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.segment:first-child {\n  margin-top: 0;\n}\n.ui.segment:last-child {\n  margin-bottom: 0;\n}\n\n/* Vertical */\n.ui.vertical.segment {\n  margin: 0;\n  padding-left: 0;\n  padding-right: 0;\n  background: none transparent;\n  border-radius: 0;\n  box-shadow: none;\n  border: none;\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.vertical.segment:first-child {\n  border-top: none;\n}\n\n/* -------------------\n    Loose Coupling\n-------------------- */\n\n/* Header */\n.ui.inverted.segments .segment > .ui.header .sub.header,\n.ui.inverted.segments .segment > .ui.header,\n.ui.inverted.segment > .ui.header .sub.header,\n.ui.inverted.segment > .ui.header {\n  color: #fff;\n}\n\n/* Label */\n.ui[class*=\"bottom attached\"].segment > [class*=\"top attached\"].label {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.ui[class*=\"top attached\"].segment > [class*=\"bottom attached\"].label {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.attached.segment:not(.top):not(.bottom) > [class*=\"top attached\"].label {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.ui.attached.segment:not(.top):not(.bottom) > [class*=\"bottom attached\"].label {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n/* Grid */\n.ui.page.grid.segment,\n.ui.grid > .row > .ui.segment.column,\n.ui.grid > .ui.segment.column {\n  padding-top: 2em;\n  padding-bottom: 2em;\n}\n.ui.grid.segment {\n  margin: 1rem 0;\n  border-radius: 0.28571429rem;\n}\n\n/* Table */\n.ui.basic.table.segment {\n  background: #fff;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);\n}\n.ui[class*=\"very basic\"].table.segment {\n  padding: 1em 1em;\n}\n\n/* Tab */\n.ui.segment.tab:last-child {\n  margin-bottom: 1rem;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/* -------------------\n         Placeholder\n    -------------------- */\n.ui.placeholder.segment {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: stretch;\n  max-width: initial;\n  animation: none;\n  overflow: visible;\n  padding: 1em 1em;\n  min-height: 18rem;\n  background: #f9fafb;\n  border-color: rgba(34, 36, 38, 0.15);\n  box-shadow: 0 2px 25px 0 rgba(34, 36, 38, 0.05) inset;\n}\n.ui.placeholder.segment.tab {\n  display: none;\n}\n.ui.placeholder.segment.tab.active {\n  display: flex;\n}\n.ui.placeholder.segment .button,\n.ui.placeholder.segment textarea {\n  display: block;\n}\n.ui.placeholder.segment .field,\n.ui.placeholder.segment textarea,\n.ui.placeholder.segment > .ui.input,\n.ui.placeholder.segment .button {\n  max-width: 15rem;\n  margin-left: auto;\n  margin-right: auto;\n}\n.ui.placeholder.segment .column .button,\n.ui.placeholder.segment .column .field,\n.ui.placeholder.segment .column textarea,\n.ui.placeholder.segment .column > .ui.input {\n  max-width: 15rem;\n  margin-left: auto;\n  margin-right: auto;\n}\n.ui.placeholder.segment > .inline {\n  align-self: center;\n}\n.ui.placeholder.segment > .inline > .button {\n  display: inline-block;\n  width: auto;\n  margin: 0 0.35714286rem 0 0;\n}\n.ui.placeholder.segment > .inline > .button:last-child {\n  margin-right: 0;\n}\n\n/* -------------------\n            Piled\n    -------------------- */\n.ui.piled.segments,\n.ui.piled.segment {\n  margin: 3em 0;\n  box-shadow: \"\";\n  z-index: auto;\n  background-color: #fff;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.piled.segment:first-child {\n  margin-top: 0;\n}\n.ui.piled.segment:last-child {\n  margin-bottom: 0;\n}\n.ui.piled.segments::after,\n.ui.piled.segments::before,\n.ui.piled.segment::after,\n.ui.piled.segment::before {\n  background-color: inherit;\n  visibility: visible;\n  content: \"\";\n  display: block;\n  height: 100%;\n  left: 0;\n  position: absolute;\n  width: 100%;\n  border: inherit;\n  box-shadow: \"\";\n}\n.ui.inverted.piled.segment {\n  background-color: #1b1c1d;\n  border: 1px solid #555;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.piled.segments::before,\n.ui.piled.segment::before {\n  transform: rotate(-1.2deg);\n  top: 0;\n  z-index: -2;\n}\n.ui.piled.segments::after,\n.ui.piled.segment::after {\n  transform: rotate(1.2deg);\n  top: 0;\n  z-index: -1;\n}\n\n/* Piled Attached */\n.ui[class*=\"top attached\"].piled.segment {\n  margin-top: 3em;\n  margin-bottom: 0;\n}\n.ui.piled.segment[class*=\"top attached\"]:first-child {\n  margin-top: 0;\n}\n.ui.piled.segment[class*=\"bottom attached\"] {\n  margin-top: 0;\n  margin-bottom: 3em;\n}\n.ui.piled.segment[class*=\"bottom attached\"]:last-child {\n  margin-bottom: 0;\n}\n@supports selector(:has(.f)) {\n  *:has(> .ui.piled.segment) {\n    z-index: 0;\n    position: relative;\n  }\n}\n\n/* -------------------\n           Stacked\n    -------------------- */\n.ui.stacked.segment {\n  padding-bottom: 1.4em;\n}\n.ui.stacked.segments::before,\n.ui.stacked.segments::after,\n.ui.stacked.segment::before,\n.ui.stacked.segment::after {\n  content: \"\";\n  position: absolute;\n  bottom: -3px;\n  left: 0;\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n  background: rgba(0, 0, 0, 0.03);\n  width: 100%;\n  height: 6px;\n  visibility: visible;\n}\n.ui.stacked.segments::before,\n.ui.stacked.segment::before {\n  display: none;\n}\n\n/* Add additional page */\n.ui.tall.stacked.segments::before,\n.ui.tall.stacked.segment::before {\n  display: block;\n  bottom: 0;\n}\n\n/* Inverted */\n.ui.stacked.inverted.segments,\n.ui.stacked.inverted.segment {\n  border: 1px solid rgba(225, 225, 225, 0.5);\n}\n.ui.stacked.inverted.segments::before,\n.ui.stacked.inverted.segment::before,\n.ui.stacked.inverted.segments::after,\n.ui.stacked.inverted.segment::after {\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 1px solid rgba(225, 225, 225, 0.5);\n}\n\n/* -------------------\n           Padded\n    -------------------- */\n.ui.padded.segment {\n  padding: 1.5em;\n}\n.ui[class*=\"very padded\"].segment {\n  padding: 3em;\n}\n\n/* Padded vertical */\n.ui.padded.segment.vertical.segment,\n.ui[class*=\"very padded\"].vertical.segment {\n  padding-left: 0;\n  padding-right: 0;\n}\n\n/* -------------------\n           Compact\n    -------------------- */\n.ui.compact.segment {\n  display: table;\n}\n\n/* Compact Group */\n.ui.compact.segments {\n  display: inline-flex;\n}\n.ui.compact.segments .segment,\n.ui.segments .compact.segment {\n  display: block;\n  flex: 0 1 auto;\n}\n\n/* -------------------\n           Circular\n    -------------------- */\n.ui.circular.segment {\n  display: table-cell;\n  padding: 2em;\n  text-align: center;\n  vertical-align: middle;\n  border-radius: 500em;\n}\n\n/* -------------------\n           Raised\n    -------------------- */\n.ui.ui.raised.segments,\n.ui.ui.raised.segment {\n  box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);\n}\n.ui.ui.inverted.raised.segments,\n.ui.ui.inverted.raised.segment {\n  box-shadow: 0 2px 4px 0 rgba(225, 225, 225, 0.1), 0 2px 10px 0 rgba(225, 225, 225, 0.5);\n}\n\n\n/*******************************\n                Groups\n    *******************************/\n\n\n/* Group */\n.ui.segments {\n  flex-direction: column;\n  position: relative;\n  margin: 1rem 0;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);\n  border-radius: 0.28571429rem;\n}\n.ui.segments:first-child {\n  margin-top: 0;\n}\n.ui.segments:last-child {\n  margin-bottom: 0;\n}\n\n/* Nested Segment */\n.ui.segments > .segment {\n  top: 0;\n  bottom: 0;\n  border-radius: 0;\n  margin: 0;\n  width: auto;\n  box-shadow: none;\n  border: none;\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.segments:not(.horizontal) > .segment:first-child {\n  top: 0;\n  bottom: 0;\n  border-top: none;\n  margin-top: 0;\n  margin-bottom: 0;\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n\n/* Bottom */\n.ui.segments:not(.horizontal) > .segment:last-child {\n  top: 0;\n  bottom: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n  box-shadow: 0 2px 1px -1px rgba(34, 36, 38, 0.15);\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n\n/* Only */\n.ui.segments:not(.horizontal) > .segment:only-child {\n  border-radius: 0.28571429rem;\n}\n\n/* Nested Group */\n.ui.segments > .ui.segments {\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n  margin: 1rem;\n}\n.ui.segments > .segments:first-child {\n  border-top: none;\n}\n.ui.segments > .segment + .segments:not(.horizontal) {\n  margin-top: 0;\n}\n\n/* Horizontal Group */\n.ui.horizontal.segments {\n  display: flex;\n  flex-direction: row;\n  background-color: transparent;\n  padding: 0;\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);\n  margin: 1rem 0;\n  border-radius: 0.28571429rem;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.wrapping.horizontal.segments,\n.ui.stackable.horizontal.segments {\n  flex-wrap: wrap;\n}\n\n/* Nested Horizontal Group */\n.ui.segments > .horizontal.segments {\n  margin: 0;\n  background-color: transparent;\n  border-radius: 0;\n  border: none;\n  box-shadow: none;\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n}\n\n/* Horizontal Segment */\n.ui.horizontal.segments:not(.compact) > .segment:not(.compact) {\n  flex: 1 1 auto;\n  -ms-flex: 1 1 0;\n}\n.ui.horizontal.segments > .segment {\n  margin: 0;\n  min-width: 0;\n  border-radius: 0;\n  border: none;\n  box-shadow: none;\n  border-left: 1px solid rgba(34, 36, 38, 0.15);\n}\n\n/* Border Fixes */\n.ui.segments > .horizontal.segments:first-child {\n  border-top: none;\n}\n.ui.horizontal.segments:not(.stackable):not(.wrapping) > .segment:first-child {\n  border-left: none;\n}\n.ui.horizontal.segments > .segment:first-child {\n  border-radius: 0.28571429rem 0 0 0.28571429rem;\n}\n.ui.horizontal.segments > .segment:last-child {\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n}\n\n/* Equal Width */\n.ui[class*=\"equal width\"].horizontal.segments > .segment {\n  width: 100%;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------\n        Disabled\n    --------------- */\n.ui.disabled.segments,\n.ui.disabled.segment {\n  opacity: 0.45;\n  color: rgba(40, 40, 40, 0.3);\n  pointer-events: none;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n\n/* --------------\n        Loading\n    --------------- */\n.ui.loading.segments,\n.ui.loading.segment {\n  position: relative;\n  cursor: default;\n  pointer-events: none;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  transition: all 0s linear;\n  min-height: 4.5em;\n}\n.ui.loading.segments::before,\n.ui.loading.segment::before {\n  position: absolute;\n  content: \"\";\n  top: 0;\n  left: 0;\n  background: rgba(255, 255, 255, 0.8);\n  width: 100%;\n  height: 100%;\n  border-radius: 0.28571429rem;\n  z-index: 100;\n}\n.ui.loading.segments::after,\n.ui.loading.segment::after {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -1.5em 0 0 -1.5em;\n  width: 3em;\n  height: 3em;\n  animation: loader 0.6s infinite linear;\n  border: 0.2em solid #767676;\n  border-radius: 500rem;\n  box-shadow: 0 0 0 1px transparent;\n  visibility: visible;\n  z-index: 101;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* -------------------\n           Basic\n    -------------------- */\n.ui.basic.segment,\n.ui.segments .ui.basic.segment,\n.ui.basic.segments {\n  background: none transparent;\n  box-shadow: none;\n  border: none;\n  border-radius: 0;\n}\n\n/* -------------------\n           Clearing\n    -------------------- */\n.ui.clearing.segment::after {\n  content: \"\";\n  display: block;\n  clear: both;\n}\n\n/* -------------------\n       Colors\n-------------------- */\n.ui.ui.ui.ui.ui.red.segment:not(.inverted) {\n  border-top: 2px solid #db2828;\n}\n.ui.ui.ui.ui.ui.inverted.red.segment {\n  background-color: #db2828;\n  color: #fff;\n}\n.ui.ui.inverted.red.segment:not(.piled) {\n  border-color: #db2828;\n}\n.ui.ui.ui.ui.ui.orange.segment:not(.inverted) {\n  border-top: 2px solid #f2711c;\n}\n.ui.ui.ui.ui.ui.inverted.orange.segment {\n  background-color: #f2711c;\n  color: #fff;\n}\n.ui.ui.inverted.orange.segment:not(.piled) {\n  border-color: #f2711c;\n}\n.ui.ui.ui.ui.ui.yellow.segment:not(.inverted) {\n  border-top: 2px solid #fbbd08;\n}\n.ui.ui.ui.ui.ui.inverted.yellow.segment {\n  background-color: #fbbd08;\n  color: #fff;\n}\n.ui.ui.inverted.yellow.segment:not(.piled) {\n  border-color: #fbbd08;\n}\n.ui.ui.ui.ui.ui.olive.segment:not(.inverted) {\n  border-top: 2px solid #b5cc18;\n}\n.ui.ui.ui.ui.ui.inverted.olive.segment {\n  background-color: #b5cc18;\n  color: #fff;\n}\n.ui.ui.inverted.olive.segment:not(.piled) {\n  border-color: #b5cc18;\n}\n.ui.ui.ui.ui.ui.green.segment:not(.inverted) {\n  border-top: 2px solid #21ba45;\n}\n.ui.ui.ui.ui.ui.inverted.green.segment {\n  background-color: #21ba45;\n  color: #fff;\n}\n.ui.ui.inverted.green.segment:not(.piled) {\n  border-color: #21ba45;\n}\n.ui.ui.ui.ui.ui.teal.segment:not(.inverted) {\n  border-top: 2px solid #00b5ad;\n}\n.ui.ui.ui.ui.ui.inverted.teal.segment {\n  background-color: #00b5ad;\n  color: #fff;\n}\n.ui.ui.inverted.teal.segment:not(.piled) {\n  border-color: #00b5ad;\n}\n.ui.ui.ui.ui.ui.blue.segment:not(.inverted) {\n  border-top: 2px solid #2185d0;\n}\n.ui.ui.ui.ui.ui.inverted.blue.segment {\n  background-color: #2185d0;\n  color: #fff;\n}\n.ui.ui.inverted.blue.segment:not(.piled) {\n  border-color: #2185d0;\n}\n.ui.ui.ui.ui.ui.violet.segment:not(.inverted) {\n  border-top: 2px solid #6435c9;\n}\n.ui.ui.ui.ui.ui.inverted.violet.segment {\n  background-color: #6435c9;\n  color: #fff;\n}\n.ui.ui.inverted.violet.segment:not(.piled) {\n  border-color: #6435c9;\n}\n.ui.ui.ui.ui.ui.purple.segment:not(.inverted) {\n  border-top: 2px solid #a333c8;\n}\n.ui.ui.ui.ui.ui.inverted.purple.segment {\n  background-color: #a333c8;\n  color: #fff;\n}\n.ui.ui.inverted.purple.segment:not(.piled) {\n  border-color: #a333c8;\n}\n.ui.ui.ui.ui.ui.pink.segment:not(.inverted) {\n  border-top: 2px solid #e03997;\n}\n.ui.ui.ui.ui.ui.inverted.pink.segment {\n  background-color: #e03997;\n  color: #fff;\n}\n.ui.ui.inverted.pink.segment:not(.piled) {\n  border-color: #e03997;\n}\n.ui.ui.ui.ui.ui.brown.segment:not(.inverted) {\n  border-top: 2px solid #a5673f;\n}\n.ui.ui.ui.ui.ui.inverted.brown.segment {\n  background-color: #a5673f;\n  color: #fff;\n}\n.ui.ui.inverted.brown.segment:not(.piled) {\n  border-color: #a5673f;\n}\n.ui.ui.ui.ui.ui.grey.segment:not(.inverted) {\n  border-top: 2px solid #767676;\n}\n.ui.ui.ui.ui.ui.inverted.grey.segment {\n  background-color: #767676;\n  color: #fff;\n}\n.ui.ui.inverted.grey.segment:not(.piled) {\n  border-color: #767676;\n}\n.ui.ui.ui.ui.ui.black.segment:not(.inverted) {\n  border-top: 2px solid #1b1c1d;\n}\n.ui.ui.ui.ui.ui.inverted.black.segment {\n  background-color: #1b1c1d;\n  color: #fff;\n}\n.ui.ui.inverted.black.segment:not(.piled) {\n  border-color: #1b1c1d;\n}\n\n/* -------------------\n           Aligned\n    -------------------- */\n.ui[class*=\"left aligned\"].segment {\n  text-align: left;\n}\n.ui[class*=\"right aligned\"].segment {\n  text-align: right;\n}\n.ui[class*=\"center aligned\"].segment {\n  text-align: center;\n}\n\n/* -------------------\n           Floated\n    -------------------- */\n.ui.floated.segment,\n.ui[class*=\"left floated\"].segment {\n  float: left;\n  margin-right: 1em;\n}\n.ui[class*=\"right floated\"].segment {\n  float: right;\n  margin-left: 1em;\n}\n\n/* -------------------\n          Inverted\n    -------------------- */\n.ui.inverted.segments,\n.ui.inverted.segments .segment,\n.ui.inverted.segment {\n  border: none;\n  box-shadow: none;\n}\n.ui.inverted.segments .segment,\n.ui.inverted.segment,\n.ui.primary.inverted.segment {\n  background: #1b1c1d;\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* Nested */\n.ui.inverted.segment .segment {\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.inverted.segment .inverted.segment {\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* Attached */\n.ui.ui.inverted.attached.segment {\n  border-color: #555;\n}\n\n/* Loading */\n.ui.inverted.loading.segments,\n.ui.inverted.loading.segment {\n  color: #fff;\n}\n.ui.inverted.loading.segments::before,\n.ui.inverted.loading.segment::before {\n  background: rgba(0, 0, 0, 0.85);\n}\n\n/* -------------------\n     Emphasis\n-------------------- */\n\n/* Secondary */\n.ui.secondary.segment {\n  background: #f3f4f5;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.secondary.inverted.segment {\n  background: #4c4f52 linear-gradient(rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.2) 100%);\n  color: rgba(255, 255, 255, 0.8);\n}\n\n/* Tertiary */\n.ui.tertiary.segment {\n  background: #dcddde;\n  color: rgba(0, 0, 0, 0.6);\n}\n.ui.tertiary.inverted.segment {\n  background: #717579 linear-gradient(rgba(255, 255, 255, 0.35) 0, rgba(255, 255, 255, 0.35) 100%);\n  color: rgba(255, 255, 255, 0.8);\n}\n\n/* -------------------\n          Attached\n    -------------------- */\n\n/* Middle */\n.ui.attached.segment {\n  top: 0;\n  bottom: 0;\n  border-radius: 0;\n  margin: 0 -1px;\n  width: calc(100% + 2px);\n  max-width: calc(100% + 2px);\n  box-shadow: none;\n}\n.ui.attached.segment:not(.basic) {\n  border: 1px solid #d4d4d5;\n}\n.ui.attached:not(.message):not(.text) + .ui.attached.segment:not(.top):not([class*=\"left attached\"]):not([class*=\"right attached\"]) {\n  border-top: none;\n}\n\n/* Top */\n.ui.segment[class*=\"top attached\"] {\n  bottom: 0;\n  margin-bottom: 0;\n  top: 0;\n  margin-top: 1rem;\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.segment[class*=\"top attached\"]:first-child {\n  margin-top: 0;\n}\n.ui.tab.segment[class*=\"top attached\"]:first-child {\n  margin-top: 1rem;\n}\n\n/* Bottom */\n.ui.segment[class*=\"bottom attached\"] {\n  bottom: 0;\n  margin-top: 0;\n  top: 0;\n  margin-bottom: 1rem;\n  box-shadow: 0 2px 1px -1px rgba(34, 36, 38, 0.15);\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui.segment[class*=\"bottom attached\"]:last-child {\n  margin-bottom: 0;\n}\n.ui.tab.segment[class*=\"bottom attached\"]:last-child {\n  margin-bottom: 1rem;\n}\n.ui[class*=\"left attached\"].segment {\n  margin-right: 0;\n}\n.ui[class*=\"right attached\"].segment {\n  margin-left: 0;\n}\n.ui.seamless.attached.segment:not(.top):not(.bottom):not([class*=\"right attached\"]):not([class*=\"left attached\"]) {\n  border-top: none;\n  border-bottom: none;\n}\n.ui.seamless.attached.segment.top {\n  border-bottom: none;\n}\n.ui.seamless.attached.segment.bottom {\n  border-top: none;\n}\n.ui.seamless.attached.segment[class*=\"left attached\"] {\n  border-right: none;\n}\n.ui.seamless.attached.segment[class*=\"right attached\"] {\n  border-left: none;\n}\n\n/* --------------\n         Fitted\n    --------------- */\n.ui.fitted.segment:not(.horizontally) {\n  padding-top: 0;\n  padding-bottom: 0;\n}\n.ui.fitted.segment:not(.vertically) {\n  padding-left: 0;\n  padding-right: 0;\n}\n\n/* --------------\n      Scrolling\n    --------------- */\n.ui.scrolling.segment {\n  overflow: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n}\n@media only screen and (max-width: 767.98px) {\n  .ui.scrolling.segment.short {\n    max-height: 11.25em;\n  }\n  .ui.scrolling.segment.short.resizable {\n    height: 11.25em;\n  }\n  .ui.scrolling.segment[class*=\"very short\"] {\n    max-height: 7.5em;\n  }\n  .ui.scrolling.segment[class*=\"very short\"].resizable {\n    height: 7.5em;\n  }\n  .ui.scrolling.segment {\n    max-height: 15em;\n  }\n  .ui.scrolling.segment.resizable {\n    height: 15em;\n  }\n  .ui.scrolling.segment.long {\n    max-height: 30em;\n  }\n  .ui.scrolling.segment.long.resizable {\n    height: 30em;\n  }\n  .ui.scrolling.segment[class*=\"very long\"] {\n    max-height: 45em;\n  }\n  .ui.scrolling.segment[class*=\"very long\"].resizable {\n    height: 45em;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .ui.scrolling.segment.short {\n    max-height: 13.5em;\n  }\n  .ui.scrolling.segment.short.resizable {\n    height: 13.5em;\n  }\n  .ui.scrolling.segment[class*=\"very short\"] {\n    max-height: 9em;\n  }\n  .ui.scrolling.segment[class*=\"very short\"].resizable {\n    height: 9em;\n  }\n  .ui.scrolling.segment {\n    max-height: 18em;\n  }\n  .ui.scrolling.segment.resizable {\n    height: 18em;\n  }\n  .ui.scrolling.segment.long {\n    max-height: 36em;\n  }\n  .ui.scrolling.segment.long.resizable {\n    height: 36em;\n  }\n  .ui.scrolling.segment[class*=\"very long\"] {\n    max-height: 54em;\n  }\n  .ui.scrolling.segment[class*=\"very long\"].resizable {\n    height: 54em;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.scrolling.segment.short {\n    max-height: 18em;\n  }\n  .ui.scrolling.segment.short.resizable {\n    height: 18em;\n  }\n  .ui.scrolling.segment[class*=\"very short\"] {\n    max-height: 12em;\n  }\n  .ui.scrolling.segment[class*=\"very short\"].resizable {\n    height: 12em;\n  }\n  .ui.scrolling.segment {\n    max-height: 24em;\n  }\n  .ui.scrolling.segment.resizable {\n    height: 24em;\n  }\n  .ui.scrolling.segment.long {\n    max-height: 48em;\n  }\n  .ui.scrolling.segment.long.resizable {\n    height: 48em;\n  }\n  .ui.scrolling.segment[class*=\"very long\"] {\n    max-height: 72em;\n  }\n  .ui.scrolling.segment[class*=\"very long\"].resizable {\n    height: 72em;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.scrolling.segment.short {\n    max-height: 22.5em;\n  }\n  .ui.scrolling.segment.short.resizable {\n    height: 22.5em;\n  }\n  .ui.scrolling.segment[class*=\"very short\"] {\n    max-height: 15em;\n  }\n  .ui.scrolling.segment[class*=\"very short\"].resizable {\n    height: 15em;\n  }\n  .ui.scrolling.segment {\n    max-height: 30em;\n  }\n  .ui.scrolling.segment.resizable {\n    height: 30em;\n  }\n  .ui.scrolling.segment.long {\n    max-height: 60em;\n  }\n  .ui.scrolling.segment.long.resizable {\n    height: 60em;\n  }\n  .ui.scrolling.segment[class*=\"very long\"] {\n    max-height: 90em;\n  }\n  .ui.scrolling.segment[class*=\"very long\"].resizable {\n    height: 90em;\n  }\n}\n.ui.resizable.scrolling.segment {\n  resize: vertical;\n  max-height: none;\n}\n\n/* -------------------\n        Size\n-------------------- */\n.ui.segments .segment,\n.ui.segment {\n  font-size: 1rem;\n}\n.ui.mini.segments .segment,\n.ui.mini.segment {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.segments .segment,\n.ui.tiny.segment {\n  font-size: 0.85714286rem;\n}\n.ui.small.segments .segment,\n.ui.small.segment {\n  font-size: 0.92857143rem;\n}\n.ui.large.segments .segment,\n.ui.large.segment {\n  font-size: 1.14285714rem;\n}\n.ui.big.segments .segment,\n.ui.big.segment {\n  font-size: 1.28571429rem;\n}\n.ui.huge.segments .segment,\n.ui.huge.segment {\n  font-size: 1.42857143rem;\n}\n.ui.massive.segments .segment,\n.ui.massive.segment {\n  font-size: 1.71428571rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/shape.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Shape\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n              Shape\n*******************************/\n\n.ui.shape {\n  position: relative;\n  vertical-align: top;\n  display: inline-block;\n  perspective: 2000px;\n  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;\n}\n.ui.shape .side,\n.ui.shape .sides {\n  transform-style: preserve-3d;\n}\n.ui.shape .side {\n  display: none;\n  opacity: 1;\n  width: 100%;\n  margin: 0 !important;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\n.ui.shape .side * {\n  -webkit-backface-visibility: visible !important;\n          backface-visibility: visible !important;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n.ui.cube.shape .side {\n  min-width: 15em;\n  height: 15em;\n  padding: 2em;\n  background-color: #e6e6e6;\n  color: rgba(0, 0, 0, 0.87);\n  box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n}\n.ui.cube.shape .side > .content {\n  width: 100%;\n  height: 100%;\n  display: table;\n  text-align: center;\n  -webkit-user-select: text;\n      -ms-user-select: text;\n          user-select: text;\n}\n.ui.cube.shape .side > .content > div {\n  display: table-cell;\n  vertical-align: middle;\n  font-size: 2em;\n}\n\n\n/*******************************\n          Variations\n*******************************/\n\n.ui.text.shape.animating .sides {\n  position: static;\n}\n.ui.text.shape .side {\n  white-space: nowrap;\n}\n.ui.text.shape .side > * {\n  white-space: normal;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n\n/* --------------\n        Loading\n    --------------- */\n.ui.loading.shape {\n  position: absolute;\n  top: -9999px;\n  left: -9999px;\n}\n\n/* --------------\n    Animating\n--------------- */\n.ui.shape .animating.side {\n  position: absolute;\n  top: 0;\n  left: 0;\n  display: block;\n  z-index: 100;\n}\n.ui.shape .hidden.side {\n  opacity: 0.6;\n}\n\n/* --------------\n      CSS\n--------------- */\n.ui.shape.animating .sides {\n  position: absolute;\n  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;\n}\n.ui.shape.animating .side {\n  transition: opacity 0.6s ease-in-out;\n}\n.ui.shape .animating.side *,\n.ui.shape.animating .side * {\n  transition: none;\n}\n\n/* --------------\n     Active\n--------------- */\n.ui.shape .active.side {\n  display: block;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n        User Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/shape.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Shape\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.shape = function (parameters) {\n        var\n            $allModules     = $(this),\n\n            time            = Date.now(),\n            performance     = [],\n\n            query           = arguments[0],\n            methodInvoked   = typeof query === 'string',\n            queryArguments  = [].slice.call(arguments, 1),\n\n            returnedValue\n        ;\n\n        $allModules.each(function () {\n            var\n                settings       = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.shape.settings, parameters)\n                    : $.extend({}, $.fn.shape.settings),\n\n                // internal aliases\n                namespace     = settings.namespace,\n                selector      = settings.selector,\n                error         = settings.error,\n                className     = settings.className,\n\n                // define namespaces for modules\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                // selector cache\n                $module       = $(this),\n                $sides        = $module.find('>' + selector.sides),\n                $side         = $sides.find('>' + selector.side),\n\n                // private variables\n                nextIndex = false,\n                $activeSide,\n                $nextSide,\n\n                // standard module\n                element       = this,\n                instance      = $module.data(moduleNamespace),\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.verbose('Initializing module for', element);\n                    module.set.defaultSide();\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, instance)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous module for', element);\n                    $module\n                        .removeData(moduleNamespace)\n                        .off(eventNamespace)\n                    ;\n                },\n\n                refresh: function () {\n                    module.verbose('Refreshing selector cache for', element);\n                    $module = $(element);\n                    $sides = $(this).find(selector.sides);\n                    $side = $(this).find(selector.side);\n                },\n\n                repaint: function () {\n                    module.verbose('Forcing repaint event');\n                    var\n                        shape          = $sides[0] || document.createElement('div'),\n                        fakeAssignment = shape.offsetWidth\n                    ;\n                },\n\n                animate: function (propertyObject, callback) {\n                    module.verbose('Animating box with properties', propertyObject);\n                    callback = callback || function (event) {\n                        module.verbose('Executing animation callback');\n                        if (event !== undefined) {\n                            event.stopPropagation();\n                        }\n                        module.reset();\n                        module.set.active();\n                    };\n                    settings.onBeforeChange.call($nextSide[0]);\n                    module.verbose('Starting CSS animation');\n                    $module\n                        .addClass(className.animating)\n                    ;\n                    $sides\n                        .css(propertyObject)\n                        .one('transitionend', callback)\n                    ;\n                    module.set.duration(settings.duration);\n                    requestAnimationFrame(function () {\n                        $module\n                            .addClass(className.animating)\n                        ;\n                        $activeSide\n                            .addClass(className.hidden)\n                        ;\n                    });\n                },\n\n                queue: function (method) {\n                    module.debug('Queueing animation of', method);\n                    $sides\n                        .one('transitionend', function () {\n                            module.debug('Executing queued animation');\n                            setTimeout(function () {\n                                $module.shape(method);\n                            }, 0);\n                        })\n                    ;\n                },\n\n                reset: function () {\n                    module.verbose('Animating states reset');\n                    $module\n                        .removeClass(className.animating)\n                        .attr('style', '')\n                        .removeAttr('style')\n                    ;\n                    // removeAttr style does not consistently work in safari\n                    $sides\n                        .attr('style', '')\n                        .removeAttr('style')\n                    ;\n                    $side\n                        .attr('style', '')\n                        .removeAttr('style')\n                        .removeClass(className.hidden)\n                    ;\n                    $nextSide\n                        .removeClass(className.animating)\n                        .attr('style', '')\n                        .removeAttr('style')\n                    ;\n                },\n\n                is: {\n                    complete: function () {\n                        return $side.filter('.' + className.active)[0] === $nextSide[0];\n                    },\n                    animating: function () {\n                        return $module.hasClass(className.animating);\n                    },\n                    hidden: function () {\n                        return $module.closest(':hidden').length > 0;\n                    },\n                },\n\n                set: {\n\n                    defaultSide: function () {\n                        $activeSide = $side.filter('.' + className.active);\n                        $nextSide = $activeSide.next(selector.side).length > 0\n                            ? $activeSide.next(selector.side)\n                            : $side.first();\n                        nextIndex = false;\n                        module.verbose('Active side set to', $activeSide);\n                        module.verbose('Next side set to', $nextSide);\n                    },\n\n                    duration: function (duration) {\n                        duration = duration || settings.duration;\n                        duration = typeof duration === 'number'\n                            ? duration + 'ms'\n                            : duration;\n                        module.verbose('Setting animation duration', duration);\n                        if (settings.duration || settings.duration === 0) {\n                            $sides.add($side)\n                                .css({\n                                    'transition-duration': duration,\n                                })\n                            ;\n                        }\n                    },\n\n                    currentStageSize: function () {\n                        var\n                            $activeSide = $side.filter('.' + className.active),\n                            width       = $activeSide.outerWidth(true),\n                            height      = $activeSide.outerHeight(true)\n                        ;\n                        $module\n                            .css({\n                                width: width,\n                                height: height,\n                            })\n                        ;\n                    },\n\n                    stageSize: function () {\n                        var\n                            $clone      = $module.clone().addClass(className.loading),\n                            $side       = $clone.find('>' + selector.sides + '>' + selector.side),\n                            $activeSide = $side.filter('.' + className.active),\n                            $nextSide   = nextIndex\n                                ? $side.eq(nextIndex)\n                                : ($activeSide.next(selector.side).length > 0\n                                    ? $activeSide.next(selector.side)\n                                    : $side.first()),\n                            newWidth    = settings.width === 'next'\n                                ? $nextSide.outerWidth(true)\n                                : (settings.width === 'initial'\n                                    ? $module.width()\n                                    : settings.width),\n                            newHeight    = settings.height === 'next'\n                                ? $nextSide.outerHeight(true)\n                                : (settings.height === 'initial'\n                                    ? $module.height()\n                                    : settings.height)\n                        ;\n                        $activeSide.removeClass(className.active);\n                        $nextSide.addClass(className.active);\n                        $clone.insertAfter($module);\n                        $clone.remove();\n                        if (settings.width !== 'auto') {\n                            $module.css('width', newWidth + settings.jitter);\n                            module.verbose('Specifying width during animation', newWidth);\n                        }\n                        if (settings.height !== 'auto') {\n                            $module.css('height', newHeight + settings.jitter);\n                            module.verbose('Specifying height during animation', newHeight);\n                        }\n                    },\n\n                    nextSide: function (selector) {\n                        nextIndex = selector;\n                        $nextSide = $side.filter(selector);\n                        nextIndex = $side.index($nextSide);\n                        if ($nextSide.length === 0) {\n                            module.set.defaultSide();\n                            module.error(error.side);\n                        }\n                        module.verbose('Next side manually set to', $nextSide);\n                    },\n\n                    active: function () {\n                        module.verbose('Setting new side to active', $nextSide);\n                        $side\n                            .removeClass(className.active)\n                        ;\n                        $nextSide\n                            .addClass(className.active)\n                        ;\n                        settings.onChange.call($nextSide[0]);\n                        module.set.defaultSide();\n                    },\n                },\n\n                flip: {\n                    to: function (type, stage) {\n                        if (module.is.hidden()) {\n                            module.debug('Module not visible', $nextSide);\n\n                            return;\n                        }\n                        if (module.is.complete() && !module.is.animating() && !settings.allowRepeats) {\n                            module.debug('Side already visible', $nextSide);\n\n                            return;\n                        }\n                        var\n                            transform = module.get.transform[type]()\n                        ;\n                        if (!module.is.animating()) {\n                            module.debug('Flipping ' + type, $nextSide);\n                            module.set.stageSize();\n                            module.stage[stage]();\n                            module.animate(transform);\n                        } else {\n                            module.queue('flip ' + type);\n                        }\n                    },\n\n                    up: function () {\n                        module.flip.to('up', 'above');\n                    },\n\n                    down: function () {\n                        module.flip.to('down', 'below');\n                    },\n\n                    left: function () {\n                        module.flip.to('left', 'left');\n                    },\n\n                    right: function () {\n                        module.flip.to('right', 'right');\n                    },\n\n                    over: function () {\n                        module.flip.to('over', 'behind');\n                    },\n\n                    back: function () {\n                        module.flip.to('back', 'behind');\n                    },\n\n                },\n\n                get: {\n\n                    transform: {\n                        up: function () {\n                            var\n                                translateZ = $activeSide.outerHeight(true) / 2,\n                                translateY = $nextSide.outerHeight(true) - translateZ\n                            ;\n\n                            return {\n                                transform: 'translateY(' + translateY + 'px) translateZ(-' + translateZ + 'px) rotateX(-90deg)',\n                            };\n                        },\n\n                        down: function () {\n                            var\n                                translate = {\n                                    z: $activeSide.outerHeight(true) / 2,\n                                }\n                            ;\n\n                            return {\n                                transform: 'translateY(-' + translate.z + 'px) translateZ(-' + translate.z + 'px) rotateX(90deg)',\n                            };\n                        },\n\n                        left: function () {\n                            var\n                                translateZ = $activeSide.outerWidth(true) / 2,\n                                translateX = $nextSide.outerWidth(true) - translateZ\n                            ;\n\n                            return {\n                                transform: 'translateX(' + translateX + 'px) translateZ(-' + translateZ + 'px) rotateY(90deg)',\n                            };\n                        },\n\n                        right: function () {\n                            var\n                                translate = {\n                                    z: $activeSide.outerWidth(true) / 2,\n                                }\n                            ;\n\n                            return {\n                                transform: 'translateX(-' + translate.z + 'px) translateZ(-' + translate.z + 'px) rotateY(-90deg)',\n                            };\n                        },\n\n                        over: function () {\n                            var\n                                translate = {\n                                    x: -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2),\n                                }\n                            ;\n\n                            return {\n                                transform: 'translateX(' + translate.x + 'px) rotateY(180deg)',\n                            };\n                        },\n\n                        back: function () {\n                            var\n                                translate = {\n                                    x: -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2),\n                                }\n                            ;\n\n                            return {\n                                transform: 'translateX(' + translate.x + 'px) rotateY(-180deg)',\n                            };\n                        },\n                    },\n\n                    nextSide: function () {\n                        return $activeSide.next(selector.side).length > 0\n                            ? $activeSide.next(selector.side)\n                            : $side.first();\n                    },\n\n                },\n\n                stage: {\n\n                    above: function () {\n                        var\n                            box = {\n                                origin: ($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2,\n                                depth: {\n                                    active: $nextSide.outerHeight(true) / 2,\n                                    next: $activeSide.outerHeight(true) / 2,\n                                },\n                            }\n                        ;\n                        module.verbose('Setting the initial animation position as above', $nextSide, box);\n                        $activeSide\n                            .css({\n                                transform: 'rotateX(0deg)',\n                            })\n                        ;\n                        $nextSide\n                            .addClass(className.animating)\n                            .css({\n                                top: box.origin + 'px',\n                                transform: 'rotateX(90deg) translateZ(' + box.depth.next + 'px) translateY(-' + box.depth.active + 'px)',\n                            })\n                        ;\n                    },\n\n                    below: function () {\n                        var\n                            box = {\n                                origin: ($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2,\n                                depth: {\n                                    active: $nextSide.outerHeight(true) / 2,\n                                    next: $activeSide.outerHeight(true) / 2,\n                                },\n                            }\n                        ;\n                        module.verbose('Setting the initial animation position as below', $nextSide, box);\n                        $activeSide\n                            .css({\n                                transform: 'rotateX(0deg)',\n                            })\n                        ;\n                        $nextSide\n                            .addClass(className.animating)\n                            .css({\n                                top: box.origin + 'px',\n                                transform: 'rotateX(-90deg) translateZ(' + box.depth.next + 'px) translateY(' + box.depth.active + 'px)',\n                            })\n                        ;\n                    },\n\n                    left: function () {\n                        var\n                            height = {\n                                active: $activeSide.outerWidth(true),\n                                next: $nextSide.outerWidth(true),\n                            },\n                            box = {\n                                origin: (height.active - height.next) / 2,\n                                depth: {\n                                    active: height.next / 2,\n                                    next: height.active / 2,\n                                },\n                            }\n                        ;\n                        module.verbose('Setting the initial animation position as left', $nextSide, box);\n                        $activeSide\n                            .css({\n                                transform: 'rotateY(0deg)',\n                            })\n                        ;\n                        $nextSide\n                            .addClass(className.animating)\n                            .css({\n                                left: box.origin + 'px',\n                                transform: 'rotateY(-90deg) translateZ(' + box.depth.next + 'px) translateX(-' + box.depth.active + 'px)',\n                            })\n                        ;\n                    },\n\n                    right: function () {\n                        var\n                            height = {\n                                active: $activeSide.outerWidth(true),\n                                next: $nextSide.outerWidth(true),\n                            },\n                            box = {\n                                origin: (height.active - height.next) / 2,\n                                depth: {\n                                    active: height.next / 2,\n                                    next: height.active / 2,\n                                },\n                            }\n                        ;\n                        module.verbose('Setting the initial animation position as right', $nextSide, box);\n                        $activeSide\n                            .css({\n                                transform: 'rotateY(0deg)',\n                            })\n                        ;\n                        $nextSide\n                            .addClass(className.animating)\n                            .css({\n                                left: box.origin + 'px',\n                                transform: 'rotateY(90deg) translateZ(' + box.depth.next + 'px) translateX(' + box.depth.active + 'px)',\n                            })\n                        ;\n                    },\n\n                    behind: function () {\n                        var\n                            height = {\n                                active: $activeSide.outerWidth(true),\n                                next: $nextSide.outerWidth(true),\n                            },\n                            box = {\n                                origin: (height.active - height.next) / 2,\n                                depth: {\n                                    active: height.next / 2,\n                                    next: height.active / 2,\n                                },\n                            }\n                        ;\n                        module.verbose('Setting the initial animation position as behind', $nextSide, box);\n                        $activeSide\n                            .css({\n                                transform: 'rotateY(0deg)',\n                            })\n                        ;\n                        $nextSide\n                            .addClass(className.animating)\n                            .css({\n                                left: box.origin + 'px',\n                                transform: 'rotateY(-180deg)',\n                            })\n                        ;\n                    },\n                },\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if ($allModules.length > 1) {\n                            title += ' (' + $allModules.length + ')';\n                        }\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                var $inputs = $module.find('input');\n                if ($inputs.length > 0) {\n                    $inputs.trigger('blur');\n                    setTimeout(function () {\n                        module.invoke(query);\n                    }, 150);\n                } else {\n                    module.invoke(query);\n                }\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.shape.settings = {\n\n        // module info\n        name: 'Shape',\n\n        // hide all debug content\n        silent: false,\n\n        // debug content outputted to console\n        debug: false,\n\n        // verbose debug output\n        verbose: false,\n\n        // fudge factor in pixels when swapping from 2d to 3d (can be useful to correct rounding errors)\n        jitter: 0,\n\n        // performance data output\n        performance: true,\n\n        // event namespace\n        namespace: 'shape',\n\n        // width during animation, can be set to 'auto', initial', 'next' or pixel amount\n        width: 'initial',\n\n        // height during animation, can be set to 'auto', 'initial', 'next' or pixel amount\n        height: 'initial',\n\n        // callback occurs on side change\n        onBeforeChange: function () {},\n        onChange: function () {},\n\n        // allow animation to same side\n        allowRepeats: false,\n\n        // animation duration\n        duration: false,\n\n        // possible errors\n        error: {\n            side: 'You tried to switch to a side that does not exist.',\n            method: 'The method you called is not defined',\n        },\n\n        // classnames used\n        className: {\n            animating: 'animating',\n            hidden: 'hidden',\n            loading: 'loading',\n            active: 'active',\n        },\n\n        // selectors used\n        selector: {\n            sides: '.sides',\n            side: '.side',\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/sidebar.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Sidebar\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Sidebar\n*******************************/\n\n\n/* Sidebar Menu */\n.ui.sidebar {\n  position: fixed;\n  top: 0;\n  left: 0;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  transition: none;\n  will-change: transform;\n  transform: translate3d(0, 0, 0);\n  visibility: hidden;\n  height: 100% !important;\n  max-height: 100%;\n  border-radius: 0 !important;\n  margin: 0 !important;\n  overflow-y: auto !important;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n  z-index: 102;\n}\n\n/* GPU Layers for Child Elements */\n.ui.sidebar > * {\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\n\n/* --------------\n   Direction\n--------------- */\n.ui.left.sidebar {\n  right: auto;\n  left: 0;\n  transform: translate3d(-100%, 0, 0);\n}\n.ui.right.sidebar {\n  right: 0 !important;\n  left: auto !important;\n  transform: translate3d(100%, 0, 0);\n}\n.ui.top.sidebar,\n.ui.bottom.sidebar {\n  width: 100% !important;\n  height: auto !important;\n}\n.ui.top.sidebar {\n  top: 0 !important;\n  bottom: auto !important;\n  transform: translate3d(0, -100%, 0);\n}\n.ui.bottom.sidebar {\n  top: auto !important;\n  bottom: 0 !important;\n  transform: translate3d(0, 100%, 0);\n}\n\n/* --------------\n     Pushable\n--------------- */\n.pushable.pushable.pushable {\n  height: 100%;\n  overflow-x: hidden;\n  padding: 0;\n}\n.pushable.pushable.pushable.locked {\n  overflow-y: hidden;\n  background: inherit;\n}\n\n/* Whole Page */\nbody.pushable {\n  background: #545454;\n}\nbody.pushable.dimmed {\n  background: inherit;\n}\n\n/* Page Context */\n.pushable:not(body) {\n  transform: translate3d(0, 0, 0);\n  overflow-y: hidden;\n}\n.pushable:not(body) > .ui.sidebar,\n.pushable:not(body) > .fixed,\n.pushable:not(body) > .pusher::after {\n  position: absolute;\n}\n\n/* --------------\n     Fixed\n--------------- */\n.pushable > .fixed {\n  position: fixed;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  transition: transform 500ms ease;\n  will-change: transform;\n  z-index: 101;\n}\n\n/* --------------\n     Page\n--------------- */\n.pushable > .pusher {\n  position: relative;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  min-height: 100%;\n  transition: transform 500ms ease;\n  z-index: 2;\n  \n/* Pusher should inherit background from context */\n  background: inherit;\n}\n.pushable > .pusher:not(.overflowing) {\n  overflow: hidden;\n}\nbody.pushable > .pusher {\n  background: #fff;\n}\n\n/* --------------\n     Dimmer\n--------------- */\n.pushable > .pusher::after {\n  position: fixed;\n  top: 0;\n  right: 0;\n  content: \"\";\n  background: rgba(0, 0, 0, 0.4);\n  overflow: hidden;\n  opacity: 0;\n  transition: all 500ms;\n  will-change: opacity;\n  z-index: 1000;\n}\n\n/* --------------\n    Coupling\n--------------- */\n.ui.sidebar.menu .item {\n  border-radius: 0 !important;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------\n     Dimmed\n--------------- */\n.pushable > .pusher.dimmed::after {\n  width: 100% !important;\n  height: 100% !important;\n  opacity: 1 !important;\n}\n.pushable > .pusher.dimmed.blurring:not(.closing)::after {\n  background: rgba(0, 0, 0, 0.6);\n  -webkit-backdrop-filter: blur(5px) grayscale(0.7);\n  backdrop-filter: blur(5px) grayscale(0.7);\n}\n.pushable > .pusher.closing.dimmed::after {\n  opacity: 0 !important;\n}\n\n/* --------------\n    Animating\n--------------- */\n.ui.animating.sidebar {\n  visibility: visible;\n}\n\n/* --------------\n     Visible\n--------------- */\n.ui.visible.sidebar {\n  visibility: visible;\n  transform: translate3d(0, 0, 0);\n}\n\n/* Shadow Direction */\n.ui.left.visible.sidebar,\n.ui.right.visible.sidebar {\n  box-shadow: 0 0 20px rgba(34, 36, 38, 0.15);\n}\n.ui.top.visible.sidebar,\n.ui.bottom.visible.sidebar {\n  box-shadow: 0 0 20px rgba(34, 36, 38, 0.15);\n}\n\n/* Visible On Load */\n.ui.visible.left.sidebar ~ .fixed,\n.ui.visible.left.sidebar ~ .pusher {\n  transform: translate3d(260px, 0, 0);\n}\n.ui.visible.right.sidebar ~ .fixed,\n.ui.visible.right.sidebar ~ .pusher {\n  transform: translate3d(-260px, 0, 0);\n}\n.ui.visible.top.sidebar ~ .fixed,\n.ui.visible.top.sidebar ~ .pusher {\n  transform: translate3d(0, 36px, 0);\n}\n.ui.visible.bottom.sidebar ~ .fixed,\n.ui.visible.bottom.sidebar ~ .pusher {\n  transform: translate3d(0, -36px, 0);\n}\n\n/* opposite sides visible forces content overlay */\n.ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .fixed,\n.ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher,\n.ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .fixed,\n.ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher {\n  transform: translate3d(0, 0, 0);\n}\n\n/* --------------\n       iOS\n--------------- */\n\n\n/*******************************\n          Variations\n*******************************/\n\n\n/* --------------\n     Width\n--------------- */\n\n/* Left / Right */\n.ui.thin.left.sidebar,\n.ui.thin.right.sidebar {\n  width: 150px;\n}\n.ui[class*=\"very thin\"].left.sidebar,\n.ui[class*=\"very thin\"].right.sidebar {\n  width: 60px;\n}\n.ui.left.sidebar,\n.ui.right.sidebar {\n  width: 260px;\n}\n.ui.wide.left.sidebar,\n.ui.wide.right.sidebar {\n  width: 350px;\n}\n.ui[class*=\"very wide\"].left.sidebar,\n.ui[class*=\"very wide\"].right.sidebar {\n  width: 475px;\n}\n\n/* Left Visible */\n.ui.visible.thin.left.sidebar ~ .fixed,\n.ui.visible.thin.left.sidebar ~ .pusher {\n  transform: translate3d(150px, 0, 0);\n}\n.ui.visible[class*=\"very thin\"].left.sidebar ~ .fixed,\n.ui.visible[class*=\"very thin\"].left.sidebar ~ .pusher {\n  transform: translate3d(60px, 0, 0);\n}\n.ui.visible.wide.left.sidebar ~ .fixed,\n.ui.visible.wide.left.sidebar ~ .pusher {\n  transform: translate3d(350px, 0, 0);\n}\n.ui.visible[class*=\"very wide\"].left.sidebar ~ .fixed,\n.ui.visible[class*=\"very wide\"].left.sidebar ~ .pusher {\n  transform: translate3d(475px, 0, 0);\n}\n\n/* Right Visible */\n.ui.visible.thin.right.sidebar ~ .fixed,\n.ui.visible.thin.right.sidebar ~ .pusher {\n  transform: translate3d(-150px, 0, 0);\n}\n.ui.visible[class*=\"very thin\"].right.sidebar ~ .fixed,\n.ui.visible[class*=\"very thin\"].right.sidebar ~ .pusher {\n  transform: translate3d(-60px, 0, 0);\n}\n.ui.visible.wide.right.sidebar ~ .fixed,\n.ui.visible.wide.right.sidebar ~ .pusher {\n  transform: translate3d(-350px, 0, 0);\n}\n.ui.visible[class*=\"very wide\"].right.sidebar ~ .fixed,\n.ui.visible[class*=\"very wide\"].right.sidebar ~ .pusher {\n  transform: translate3d(-475px, 0, 0);\n}\n\n\n/*******************************\n          Animations\n*******************************/\n\n\n/* --------------\n        Overlay\n    --------------- */\n\n/* Set-up */\n.ui.overlay.sidebar {\n  z-index: 102;\n}\n\n/* Initial */\n.ui.left.overlay.sidebar {\n  transform: translate3d(-100%, 0, 0);\n}\n.ui.right.overlay.sidebar {\n  transform: translate3d(100%, 0, 0);\n}\n.ui.top.overlay.sidebar {\n  transform: translate3d(0, -100%, 0);\n}\n.ui.bottom.overlay.sidebar {\n  transform: translate3d(0, 100%, 0);\n}\n\n/* Animation */\n.animating.ui.overlay.sidebar,\n.ui.visible.overlay.sidebar {\n  transition: transform 500ms ease;\n}\n\n/* End - Sidebar */\n.ui.visible.left.overlay.sidebar {\n  transform: translate3d(0, 0, 0);\n}\n.ui.visible.right.overlay.sidebar {\n  transform: translate3d(0, 0, 0);\n}\n.ui.visible.top.overlay.sidebar {\n  transform: translate3d(0, 0, 0);\n}\n.ui.visible.bottom.overlay.sidebar {\n  transform: translate3d(0, 0, 0);\n}\n\n/* End - Pusher */\n.ui.visible.overlay.sidebar ~ .fixed,\n.ui.visible.overlay.sidebar ~ .pusher {\n  transform: none !important;\n}\n\n/* --------------\n          Push\n    --------------- */\n\n/* Initial */\n.ui.push.sidebar {\n  transition: transform 500ms ease;\n  z-index: 102;\n}\n\n/* Sidebar - Initial */\n.ui.left.push.sidebar {\n  transform: translate3d(-100%, 0, 0);\n}\n.ui.right.push.sidebar {\n  transform: translate3d(100%, 0, 0);\n}\n.ui.top.push.sidebar {\n  transform: translate3d(0, -100%, 0);\n}\n.ui.bottom.push.sidebar {\n  transform: translate3d(0, 100%, 0);\n}\n\n/* End */\n.ui.visible.push.sidebar {\n  transform: translate3d(0, 0, 0);\n}\n\n/* --------------\n        Uncover\n    --------------- */\n\n/* Initial */\n.ui.uncover.sidebar {\n  transform: translate3d(0, 0, 0);\n  z-index: 1;\n}\n\n/* End */\n.ui.visible.uncover.sidebar {\n  transform: translate3d(0, 0, 0);\n  transition: transform 500ms ease;\n}\n\n/* --------------\n       Slide Along\n    --------------- */\n\n/* Initial */\n.ui.slide.along.sidebar {\n  z-index: 1;\n}\n\n/* Sidebar - Initial */\n.ui.left.slide.along.sidebar {\n  transform: translate3d(-50%, 0, 0);\n}\n.ui.right.slide.along.sidebar {\n  transform: translate3d(50%, 0, 0);\n}\n.ui.top.slide.along.sidebar {\n  transform: translate3d(0, -50%, 0);\n}\n.ui.bottom.slide.along.sidebar {\n  transform: translate3d(0, 50%, 0);\n}\n\n/* Animation */\n.ui.animating.slide.along.sidebar {\n  transition: transform 500ms ease;\n}\n\n/* End */\n.ui.visible.slide.along.sidebar {\n  transform: translate3d(0, 0, 0);\n}\n\n/* --------------\n       Slide Out\n    --------------- */\n\n/* Initial */\n.ui.slide.out.sidebar {\n  z-index: 1;\n}\n\n/* Sidebar - Initial */\n.ui.left.slide.out.sidebar {\n  transform: translate3d(50%, 0, 0);\n}\n.ui.right.slide.out.sidebar {\n  transform: translate3d(-50%, 0, 0);\n}\n.ui.top.slide.out.sidebar {\n  transform: translate3d(0, 50%, 0);\n}\n.ui.bottom.slide.out.sidebar {\n  transform: translate3d(0, -50%, 0);\n}\n\n/* Animation */\n.ui.animating.slide.out.sidebar {\n  transition: transform 500ms ease;\n}\n\n/* End */\n.ui.visible.slide.out.sidebar {\n  transform: translate3d(0, 0, 0);\n}\n\n/* --------------\n       Scale Down\n    --------------- */\n\n/* Initial */\n.ui.scale.down.sidebar {\n  transition: transform 500ms ease;\n  z-index: 102;\n}\n.ui.left.scale.down.sidebar {\n  transform: translate3d(-100%, 0, 0);\n}\n.ui.right.scale.down.sidebar {\n  transform: translate3d(100%, 0, 0);\n}\n.ui.top.scale.down.sidebar {\n  transform: translate3d(0, -100%, 0);\n}\n.ui.bottom.scale.down.sidebar {\n  transform: translate3d(0, 100%, 0);\n}\n\n/* Pusher - Initial */\n.ui.scale.down.left.sidebar ~ .pusher {\n  transform-origin: 75% 50%;\n}\n.ui.scale.down.right.sidebar ~ .pusher {\n  transform-origin: 25% 50%;\n}\n.ui.scale.down.top.sidebar ~ .pusher {\n  transform-origin: 50% 75%;\n}\n.ui.scale.down.bottom.sidebar ~ .pusher {\n  transform-origin: 50% 25%;\n}\n\n/* Animation */\n.ui.animating.scale.down > .visible.ui.sidebar {\n  transition: transform 500ms ease;\n}\n.ui.visible.scale.down.sidebar ~ .pusher,\n.ui.animating.scale.down.sidebar ~ .pusher {\n  display: block !important;\n  width: 100%;\n  height: 100%;\n  overflow: hidden !important;\n}\n\n/* End */\n.ui.visible.scale.down.sidebar {\n  transform: translate3d(0, 0, 0);\n}\n.ui.visible.scale.down.sidebar ~ .pusher {\n  transform: scale(0.75);\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/sidebar.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Sidebar\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.sidebar = function (parameters) {\n        var\n            $allModules     = $(this),\n            $window         = $(window),\n            $document       = $(document),\n            $body           = $('body'),\n            $html           = $('html'),\n            $head           = $('head'),\n\n            time            = Date.now(),\n            performance     = [],\n\n            query           = arguments[0],\n            methodInvoked   = typeof query === 'string',\n            queryArguments  = [].slice.call(arguments, 1),\n            contextCheck    = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $body;\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : $body;\n                    }\n                }\n\n                return $context;\n            },\n            returnedValue;\n\n        $allModules.each(function () {\n            var\n                settings        = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.sidebar.settings, parameters)\n                    : $.extend({}, $.fn.sidebar.settings),\n\n                selector        = settings.selector,\n                className       = settings.className,\n                namespace       = settings.namespace,\n                regExp          = settings.regExp,\n                error           = settings.error,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                $module         = $(this),\n                $context        = contextCheck(settings.context, window),\n                isBody          = $context[0] === $body[0],\n\n                $sidebars       = $module.children(selector.sidebar),\n                $fixed          = $context.children(selector.fixed),\n                $pusher         = $context.children(selector.pusher),\n                $style,\n\n                element         = this,\n                instance        = $module.data(moduleNamespace),\n\n                elementNamespace,\n                id,\n                currentScroll,\n                initialBodyMargin = '',\n                tempBodyMargin = '',\n                hadScrollbar = false,\n\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.debug('Initializing sidebar', parameters);\n\n                    module.create.id();\n\n                    // avoids locking rendering if initialized in onReady\n                    if (settings.delaySetup) {\n                        requestAnimationFrame(module.setup.layout);\n                    } else {\n                        module.setup.layout();\n                    }\n\n                    requestAnimationFrame(function () {\n                        module.setup.cache();\n                    });\n\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n\n                create: {\n                    id: function () {\n                        id = (Math.random().toString(16) + '000000000').slice(2, 10);\n                        elementNamespace = '.' + id;\n                        module.verbose('Creating unique id for element', id);\n                    },\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous module for', $module);\n                    $module\n                        .off(eventNamespace)\n                        .removeData(moduleNamespace)\n                    ;\n                    // bound by uuid\n                    $context.off(elementNamespace);\n                    $window.off(elementNamespace);\n                    $document.off(elementNamespace);\n                },\n\n                event: {\n                    clickaway: function (event) {\n                        if (settings.closable) {\n                            var\n                                clickedInPusher = $pusher.find(event.target).length > 0 || $pusher.is(event.target),\n                                clickedContext  = $context.is(event.target)\n                            ;\n                            if (clickedInPusher) {\n                                module.verbose('User clicked on dimmed page');\n                                module.hide();\n                            }\n                            if (clickedContext) {\n                                module.verbose('User clicked on dimmable context (scaled out page)');\n                                module.hide();\n                            }\n                        }\n                    },\n                    touch: function (event) {\n                        // event.stopPropagation();\n                    },\n                    containScroll: function (event) {\n                        if (element.scrollTop <= 0) {\n                            element.scrollTop = 1;\n                        }\n                        if ((element.scrollTop + element.offsetHeight) >= element.scrollHeight) {\n                            element.scrollTop = element.scrollHeight - element.offsetHeight - 1;\n                        }\n                    },\n                    scroll: function (event) {\n                        if ($(event.target).closest(selector.sidebar).length === 0) {\n                            event.preventDefault();\n                        }\n                    },\n                },\n\n                bind: {\n                    clickaway: function () {\n                        module.verbose('Adding clickaway events to context', $context);\n                        $context\n                            .on('click' + elementNamespace, module.event.clickaway)\n                            .on('touchend' + elementNamespace, module.event.clickaway)\n                        ;\n                    },\n                    scrollLock: function () {\n                        if (settings.scrollLock) {\n                            module.debug('Disabling page scroll');\n                            hadScrollbar = module.has.scrollbar();\n                            if (hadScrollbar) {\n                                module.save.bodyMargin();\n                                module.set.bodyMargin();\n                            }\n                            $context.addClass(className.locked);\n                        }\n                        module.verbose('Adding events to contain sidebar scroll');\n                        $document\n                            .on('touchmove' + elementNamespace, module.event.touch)\n                        ;\n                        $module\n                            .on('scroll' + eventNamespace, module.event.containScroll)\n                        ;\n                    },\n                },\n                unbind: {\n                    clickaway: function () {\n                        module.verbose('Removing clickaway events from context', $context);\n                        $context.off(elementNamespace);\n                    },\n                    scrollLock: function () {\n                        module.verbose('Removing scroll lock from page');\n                        if (hadScrollbar) {\n                            module.restore.bodyMargin();\n                        }\n                        $context.removeClass(className.locked);\n                        $document.off(elementNamespace);\n                        $module.off('scroll' + eventNamespace);\n                    },\n                },\n\n                add: {\n                    inlineCSS: function () {\n                        var\n                            width     = module.cache.width || $module.outerWidth(),\n                            height    = module.cache.height || $module.outerHeight(),\n                            isRTL     = module.is.rtl(),\n                            direction = module.get.direction(),\n                            distance  = {\n                                left: width,\n                                right: -width,\n                                top: height,\n                                bottom: -height,\n                            },\n                            style\n                        ;\n\n                        if (isRTL) {\n                            module.verbose('RTL detected, flipping widths');\n                            distance.left = -width;\n                            distance.right = width;\n                        }\n\n                        style = '<style>';\n\n                        if (direction === 'left' || direction === 'right') {\n                            module.debug('Adding CSS rules for animation distance', width);\n                            style += ''\n                                + ' .ui.visible.' + direction + '.sidebar ~ .fixed,'\n                                + ' .ui.visible.' + direction + '.sidebar ~ .pusher {'\n                                + '           transform: translate3d(' + distance[direction] + 'px, 0, 0);'\n                                + ' }';\n                        } else if (direction === 'top' || direction === 'bottom') {\n                            style += ''\n                                + ' .ui.visible.' + direction + '.sidebar ~ .fixed,'\n                                + ' .ui.visible.' + direction + '.sidebar ~ .pusher {'\n                                + '           transform: translate3d(0, ' + distance[direction] + 'px, 0);'\n                                + ' }';\n                        }\n\n                        /* IE is only browser not to create context with transforms */\n                        /* https://www.w3.org/Bugs/Public/show_bug.cgi?id=16328 */\n                        if (module.is.ie()) {\n                            if (direction === 'left' || direction === 'right') {\n                                module.debug('Adding CSS rules for animation distance', width);\n                                style += ''\n                                    + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher::after {'\n                                    + '           transform: translate3d(' + distance[direction] + 'px, 0, 0);'\n                                    + ' }';\n                            } else if (direction === 'top' || direction === 'bottom') {\n                                style += ''\n                                    + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher::after {'\n                                    + '           transform: translate3d(0, ' + distance[direction] + 'px, 0);'\n                                    + ' }';\n                            }\n                            /* opposite sides visible forces content overlay */\n                            style += ''\n                                + ' body.pushable > .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher::after,'\n                                + ' body.pushable > .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher::after {'\n                                + '           transform: translate3d(0, 0, 0);'\n                                + ' }';\n                        }\n                        style += '</style>';\n                        $style = $(style)\n                            .appendTo($head)\n                        ;\n                        module.debug('Adding sizing css to head', $style);\n                    },\n                },\n\n                refresh: function () {\n                    module.verbose('Refreshing selector cache');\n                    $context = contextCheck(settings.context, window);\n                    module.refreshSidebars();\n                    $pusher = $context.children(selector.pusher);\n                    $fixed = $context.children(selector.fixed);\n                    module.clear.cache();\n                },\n\n                refreshSidebars: function () {\n                    module.verbose('Refreshing other sidebars');\n                    $sidebars = $context.children(selector.sidebar);\n                },\n\n                repaint: function () {\n                    module.verbose('Forcing repaint event');\n                    element.style.display = 'none';\n                    var ignored = element.offsetHeight;\n                    element.scrollTop = element.scrollTop; // eslint-disable-line no-self-assign\n                    element.style.display = '';\n                },\n\n                setup: {\n                    cache: function () {\n                        module.cache = {\n                            width: $module.outerWidth(),\n                            height: $module.outerHeight(),\n                        };\n                    },\n                    layout: function () {\n                        if ($context.children(selector.pusher).length === 0) {\n                            module.debug('Adding wrapper element for sidebar');\n                            module.error(error.pusher);\n                            $pusher = $('<div class=\"pusher\" />');\n                            $context\n                                .children()\n                                .not(selector.omitted)\n                                .not($sidebars)\n                                .wrapAll($pusher)\n                            ;\n                            module.refresh();\n                        }\n                        if ($module.nextAll(selector.pusher).length === 0 || $module.nextAll(selector.pusher)[0] !== $pusher[0]) {\n                            module.debug('Moved sidebar to correct parent element');\n                            module.error(error.movedSidebar, element);\n                            $module.detach().prependTo($context);\n                            module.refresh();\n                        }\n                        module.clear.cache();\n                        module.set.pushable();\n                        module.set.direction();\n                    },\n                },\n\n                attachEvents: function (selector, event) {\n                    var\n                        $toggle = $(selector)\n                    ;\n                    event = isFunction(module[event])\n                        ? module[event]\n                        : module.toggle;\n                    if ($toggle.length > 0) {\n                        module.debug('Attaching sidebar events to element', selector, event);\n                        $toggle\n                            .on('click' + eventNamespace, event)\n                        ;\n                    } else {\n                        module.error(error.notFound, selector);\n                    }\n                },\n                can: {\n                    leftBodyScrollbar: function () {\n                        if (module.cache.leftBodyScrollbar === undefined) {\n                            module.cache.leftBodyScrollbar = module.is.rtl() && ((module.is.iframe && !module.is.firefox()) || module.is.safari() || module.is.edge() || module.is.ie());\n                        }\n\n                        return module.cache.leftBodyScrollbar;\n                    },\n                },\n                save: {\n                    bodyMargin: function () {\n                        initialBodyMargin = $context.css((isBody ? 'margin-' : 'padding-') + (module.can.leftBodyScrollbar() ? 'left' : 'right'));\n                        var\n                            bodyMarginRightPixel = parseInt(initialBodyMargin.replace(/[^\\d.]/g, ''), 10),\n                            bodyScrollbarWidth = isBody ? window.innerWidth - document.documentElement.clientWidth : $context[0].offsetWidth - $context[0].clientWidth\n                        ;\n                        tempBodyMargin = bodyMarginRightPixel + bodyScrollbarWidth;\n                    },\n                },\n                show: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if (module.is.hidden()) {\n                        if (settings.onShow.call(element) === false) {\n                            module.verbose('Show callback returned false cancelling show');\n\n                            return;\n                        }\n                        if (settings.overlay) {\n                            module.error(error.overlay);\n                            settings.transition = 'overlay';\n                        }\n                        module.refresh();\n                        if (module.othersActive()) {\n                            module.debug('Other sidebars currently visible');\n                            if (settings.exclusive) {\n                                // if not overlay queue animation after hide\n                                if (settings.transition !== 'overlay') {\n                                    module.hideOthers(module.show);\n\n                                    return;\n                                }\n\n                                module.hideOthers();\n                            } else {\n                                settings.transition = 'overlay';\n                            }\n                        }\n                        module.set.dimmerStyles();\n                        module.pushPage(function () {\n                            callback.call(element);\n                            settings.onVisible.call(element);\n                        });\n                        settings.onChange.call(element);\n                    } else {\n                        module.debug('Sidebar is already visible');\n                    }\n                },\n\n                hide: function (callback) {\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if ((module.is.visible() || module.is.animating()) && settings.onHide.call(element) !== false) {\n                        module.debug('Hiding sidebar', callback);\n                        module.refreshSidebars();\n                        module.pullPage(function () {\n                            callback.call(element);\n                            settings.onHidden.call(element);\n                        });\n                        settings.onChange.call(element);\n                    }\n                },\n\n                othersAnimating: function () {\n                    return $sidebars.not($module).filter('.' + className.animating).length > 0;\n                },\n                othersVisible: function () {\n                    return $sidebars.not($module).filter('.' + className.visible).length > 0;\n                },\n                othersActive: function () {\n                    return module.othersVisible() || module.othersAnimating();\n                },\n\n                hideOthers: function (callback) {\n                    var\n                        $otherSidebars = $sidebars.not($module).filter('.' + className.visible),\n                        sidebarCount   = $otherSidebars.length,\n                        callbackCount  = 0\n                    ;\n                    callback = callback || function () {};\n                    $otherSidebars\n                        .sidebar('hide', function () {\n                            callbackCount++;\n                            if (callbackCount === sidebarCount) {\n                                callback();\n                            }\n                        })\n                    ;\n                },\n\n                toggle: function () {\n                    module.verbose('Determining toggled direction');\n                    if (module.is.hidden()) {\n                        module.show();\n                    } else {\n                        module.hide();\n                    }\n                },\n\n                pushPage: function (callback) {\n                    var\n                        transition = module.get.transition(),\n                        $transition = transition === 'overlay' || module.othersActive()\n                            ? $module\n                            : $pusher,\n                        animate,\n                        dim,\n                        transitionEnd\n                    ;\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    if (settings.returnScroll) {\n                        currentScroll = (isBody ? $window : $context).scrollTop();\n                    }\n                    if (settings.transition === 'scale down') {\n                        module.scrollToTop();\n                    }\n                    module.bind.scrollLock();\n                    module.set.transition(transition);\n                    module.repaint();\n                    animate = function () {\n                        module.bind.clickaway();\n                        module.add.inlineCSS();\n                        module.set.animating();\n                        module.set.visible();\n                    };\n                    dim = function () {\n                        module.set.dimmed();\n                    };\n                    transitionEnd = function (event) {\n                        if (event.target === $transition[0]) {\n                            $transition.off('transitionend' + elementNamespace, transitionEnd);\n                            module.remove.animating();\n                            callback.call(element);\n                        }\n                    };\n                    $transition.off('transitionend' + elementNamespace);\n                    $transition.on('transitionend' + elementNamespace, transitionEnd);\n                    requestAnimationFrame(animate);\n                    if (settings.dimPage && !module.othersVisible()) {\n                        requestAnimationFrame(dim);\n                    }\n                },\n\n                pullPage: function (callback) {\n                    var\n                        transition = module.get.transition(),\n                        $transition = transition === 'overlay' || module.othersActive()\n                            ? $module\n                            : $pusher,\n                        animate,\n                        transitionEnd\n                    ;\n                    callback = isFunction(callback)\n                        ? callback\n                        : function () {};\n                    module.verbose('Removing context push state', module.get.direction());\n\n                    module.unbind.clickaway();\n                    module.unbind.scrollLock();\n\n                    animate = function () {\n                        module.set.transition(transition);\n                        module.set.animating();\n                        if (settings.dimPage && !module.othersVisible()) {\n                            module.set.closing();\n                        }\n                        module.remove.visible();\n                    };\n                    transitionEnd = function (event) {\n                        if (event.target === $transition[0]) {\n                            $transition.off('transitionend' + elementNamespace, transitionEnd);\n                            module.remove.animating();\n                            module.remove.closing();\n                            module.remove.transition();\n                            module.remove.inlineCSS();\n                            if (transition === 'scale down' || settings.returnScroll) {\n                                module.scrollBack();\n                            }\n                            if (settings.dimPage && !module.othersVisible()) {\n                                $pusher.removeClass(className.dimmed);\n                            }\n                            callback.call(element);\n                        }\n                    };\n                    $transition.off('transitionend' + elementNamespace);\n                    $transition.on('transitionend' + elementNamespace, transitionEnd);\n                    requestAnimationFrame(animate);\n                },\n\n                scrollToTop: function () {\n                    module.verbose('Scrolling to top of page to avoid animation issues');\n                    $module.scrollTop(0);\n                    (isBody ? $window : $context)[0].scrollTo(0, 0);\n                },\n\n                scrollBack: function () {\n                    module.verbose('Scrolling back to original page position');\n                    (isBody ? $window : $context)[0].scrollTo(0, currentScroll);\n                },\n\n                clear: {\n                    cache: function () {\n                        module.verbose('Clearing cached dimensions');\n                        module.cache = {};\n                    },\n                },\n\n                set: {\n                    bodyMargin: function () {\n                        var position = module.can.leftBodyScrollbar() ? 'left' : 'right';\n                        $context.css((isBody ? 'margin-' : 'padding-') + position, tempBodyMargin + 'px');\n                        $context.find(selector.bodyFixed.replace('right', position)).each(function () {\n                            var\n                                el = $(this),\n                                attribute = el.css('position') === 'fixed' ? 'padding-' + position : position\n                            ;\n                            el.css(attribute, 'calc(' + el.css(attribute) + ' + ' + tempBodyMargin + 'px)');\n                        });\n                    },\n                    dimmerStyles: function () {\n                        if (settings.blurring) {\n                            $pusher.addClass(className.blurring);\n                        } else {\n                            $pusher.removeClass(className.blurring);\n                        }\n                    },\n\n                    // container\n                    pushed: function () {\n                        $context.addClass(className.pushed);\n                    },\n                    pushable: function () {\n                        $context.addClass(className.pushable);\n                    },\n\n                    // pusher\n                    dimmed: function () {\n                        $pusher.addClass(className.dimmed);\n                    },\n\n                    // sidebar\n                    active: function () {\n                        $module.addClass(className.active);\n                    },\n                    animating: function () {\n                        $module.addClass(className.animating);\n                    },\n                    closing: function () {\n                        $pusher.addClass(className.closing);\n                    },\n                    transition: function (transition) {\n                        transition = transition || module.get.transition();\n                        $module.addClass(transition);\n                    },\n                    direction: function (direction) {\n                        direction = direction || module.get.direction();\n                        $module.addClass(className[direction]);\n                    },\n                    visible: function () {\n                        $module.addClass(className.visible);\n                    },\n                    overlay: function () {\n                        $module.addClass(className.overlay);\n                    },\n                },\n                remove: {\n\n                    inlineCSS: function () {\n                        module.debug('Removing inline css styles', $style);\n                        if ($style && $style.length > 0) {\n                            $style.remove();\n                        }\n                    },\n\n                    // context\n                    pushed: function () {\n                        $context.removeClass(className.pushed);\n                    },\n                    pushable: function () {\n                        $context.removeClass(className.pushable);\n                    },\n\n                    // sidebar\n                    active: function () {\n                        $module.removeClass(className.active);\n                    },\n                    animating: function () {\n                        $module.removeClass(className.animating);\n                    },\n                    closing: function () {\n                        $pusher.removeClass(className.closing);\n                    },\n                    transition: function (transition) {\n                        transition = transition || module.get.transition();\n                        $module.removeClass(transition);\n                    },\n                    direction: function (direction) {\n                        direction = direction || module.get.direction();\n                        $module.removeClass(className[direction]);\n                    },\n                    visible: function () {\n                        $module.removeClass(className.visible);\n                    },\n                    overlay: function () {\n                        $module.removeClass(className.overlay);\n                    },\n                },\n                restore: {\n                    bodyMargin: function () {\n                        var position = module.can.leftBodyScrollbar() ? 'left' : 'right';\n                        $context.css((isBody ? 'margin-' : 'padding-') + position, initialBodyMargin);\n                        $context.find(selector.bodyFixed.replace('right', position)).each(function () {\n                            var\n                                el = $(this),\n                                attribute = el.css('position') === 'fixed' ? 'padding-' + position : position\n                            ;\n                            el.css(attribute, '');\n                        });\n                    },\n                },\n                get: {\n                    direction: function () {\n                        if ($module.hasClass(className.top)) {\n                            return className.top;\n                        }\n                        if ($module.hasClass(className.right)) {\n                            return className.right;\n                        }\n                        if ($module.hasClass(className.bottom)) {\n                            return className.bottom;\n                        }\n\n                        return className.left;\n                    },\n                    transition: function () {\n                        var\n                            direction = module.get.direction(),\n                            transition\n                        ;\n                        transition = module.is.mobile()\n                            ? (settings.mobileTransition === 'auto'\n                                ? settings.defaultTransition.mobile[direction]\n                                : settings.mobileTransition)\n                            : (settings.transition === 'auto'\n                                ? settings.defaultTransition.computer[direction]\n                                : settings.transition);\n                        module.verbose('Determined transition', transition);\n\n                        return transition;\n                    },\n                },\n                has: {\n                    scrollbar: function () {\n                        return isBody || $context.css('overflow-y') !== 'hidden';\n                    },\n                },\n                is: {\n                    safari: function () {\n                        if (module.cache.isSafari === undefined) {\n                            module.cache.isSafari = /constructor/i.test(window.HTMLElement) || !!window.ApplePaySession;\n                        }\n\n                        return module.cache.isSafari;\n                    },\n                    edge: function () {\n                        if (module.cache.isEdge === undefined) {\n                            module.cache.isEdge = !!window.setImmediate && !module.is.ie();\n                        }\n\n                        return module.cache.isEdge;\n                    },\n                    firefox: function () {\n                        if (module.cache.isFirefox === undefined) {\n                            module.cache.isFirefox = !!window.InstallTrigger;\n                        }\n\n                        return module.cache.isFirefox;\n                    },\n                    iframe: function () {\n                        return !(self === top);\n                    },\n                    ie: function () {\n                        if (module.cache.isIE === undefined) {\n                            var\n                                isIE11 = !window.ActiveXObject && 'ActiveXObject' in window,\n                                isIE = 'ActiveXObject' in window\n                            ;\n                            module.cache.isIE = isIE11 || isIE;\n                        }\n\n                        return module.cache.isIE;\n                    },\n\n                    mobile: function () {\n                        var\n                            userAgent    = navigator.userAgent,\n                            isMobile     = userAgent.match(regExp.mobile)\n                        ;\n                        if (isMobile) {\n                            module.verbose('Browser was found to be mobile', userAgent);\n\n                            return true;\n                        }\n\n                        module.verbose('Browser is not mobile, using regular transition', userAgent);\n\n                        return false;\n                    },\n                    hidden: function () {\n                        return !module.is.visible();\n                    },\n                    visible: function () {\n                        return $module.hasClass(className.visible);\n                    },\n                    // alias\n                    open: function () {\n                        return module.is.visible();\n                    },\n                    closed: function () {\n                        return module.is.hidden();\n                    },\n                    vertical: function () {\n                        return $module.hasClass(className.top);\n                    },\n                    animating: function () {\n                        return $context.hasClass(className.animating);\n                    },\n                    rtl: function () {\n                        if (module.cache.isRTL === undefined) {\n                            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';\n                        }\n\n                        return module.cache.isRTL;\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    module.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.sidebar.settings = {\n\n        name: 'Sidebar',\n        namespace: 'sidebar',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        transition: 'auto',\n        mobileTransition: 'auto',\n\n        defaultTransition: {\n            computer: {\n                left: 'uncover',\n                right: 'uncover',\n                top: 'overlay',\n                bottom: 'overlay',\n            },\n            mobile: {\n                left: 'uncover',\n                right: 'uncover',\n                top: 'overlay',\n                bottom: 'overlay',\n            },\n        },\n\n        context: 'body',\n        exclusive: false,\n        closable: true,\n        dimPage: true,\n        scrollLock: false,\n        returnScroll: false,\n        delaySetup: false,\n\n        onChange: function () {},\n        onShow: function () {},\n        onHide: function () {},\n\n        onHidden: function () {},\n        onVisible: function () {},\n\n        className: {\n            active: 'active',\n            animating: 'animating',\n            blurring: 'blurring',\n            closing: 'closing',\n            dimmed: 'dimmed',\n            locked: 'locked',\n            pushable: 'pushable',\n            pushed: 'pushed',\n            right: 'right',\n            top: 'top',\n            left: 'left',\n            bottom: 'bottom',\n            visible: 'visible',\n        },\n\n        selector: {\n            bodyFixed: '> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.fixed.nag, > .ui.fixed.nag > .close',\n            fixed: '.fixed',\n            omitted: 'script, link, style, .ui.modal, .ui.dimmer, .ui.nag, .ui.fixed',\n            pusher: '.pusher',\n            sidebar: '.ui.sidebar',\n        },\n\n        regExp: {\n            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,\n        },\n\n        error: {\n            method: 'The method you called is not defined.',\n            pusher: 'Had to add pusher element. For optimal performance make sure body content is inside a pusher element',\n            movedSidebar: 'Had to move sidebar. For optimal performance make sure sidebar and pusher are direct children of your body tag',\n            overlay: 'The overlay setting is no longer supported, use animation: overlay',\n            notFound: 'There were no elements that matched the specified selector',\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/site.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Site\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Page\n*******************************/\n\n@font-face {\n  font-family: \"Lato\";\n  src: url(\"./../themes/default/assets/fonts/LatoLatin-Regular.woff2\") format(\"woff2\") , url(\"./../themes/default/assets/fonts/LatoLatin-Regular.woff\") format(\"woff\");\n  font-style: normal;\n  font-weight: normal;\n  font-display: swap;\n  text-rendering: optimizeLegibility;\n  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;\n}\n@font-face {\n  font-family: \"Lato\";\n  src: url(\"./../themes/default/assets/fonts/LatoLatin-Bold.woff2\") format(\"woff2\") , url(\"./../themes/default/assets/fonts/LatoLatin-Bold.woff\") format(\"woff\");\n  font-style: normal;\n  font-weight: bold;\n  font-display: swap;\n  text-rendering: optimizeLegibility;\n  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;\n}\n@font-face {\n  font-family: \"Lato\";\n  src: url(\"./../themes/default/assets/fonts/LatoLatin-Italic.woff2\") format(\"woff2\") , url(\"./../themes/default/assets/fonts/LatoLatin-Italic.woff\") format(\"woff\");\n  font-style: italic;\n  font-weight: normal;\n  font-display: swap;\n  text-rendering: optimizeLegibility;\n  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;\n}\n@font-face {\n  font-family: \"Lato\";\n  src: url(\"./../themes/default/assets/fonts/LatoLatin-BoldItalic.woff2\") format(\"woff2\") , url(\"./../themes/default/assets/fonts/LatoLatin-BoldItalic.woff\") format(\"woff\");\n  font-style: italic;\n  font-weight: bold;\n  font-display: swap;\n  text-rendering: optimizeLegibility;\n  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;\n}\n@font-face {\n  font-family: \"Lato\";\n  src: url(\"./../themes/default/assets/fonts/Lato-Regular.woff2\") format(\"woff2\") , url(\"./../themes/default/assets/fonts/Lato-Regular.woff\") format(\"woff\");\n  font-style: normal;\n  font-weight: normal;\n  font-display: swap;\n  text-rendering: optimizeLegibility;\n  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;\n}\n@font-face {\n  font-family: \"Lato\";\n  src: url(\"./../themes/default/assets/fonts/Lato-Bold.woff2\") format(\"woff2\") , url(\"./../themes/default/assets/fonts/Lato-Bold.woff\") format(\"woff\");\n  font-style: normal;\n  font-weight: bold;\n  font-display: swap;\n  text-rendering: optimizeLegibility;\n  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;\n}\n@font-face {\n  font-family: \"Lato\";\n  src: url(\"./../themes/default/assets/fonts/Lato-Italic.woff2\") format(\"woff2\") , url(\"./../themes/default/assets/fonts/Lato-Italic.woff\") format(\"woff\");\n  font-style: italic;\n  font-weight: normal;\n  font-display: swap;\n  text-rendering: optimizeLegibility;\n  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;\n}\n@font-face {\n  font-family: \"Lato\";\n  src: url(\"./../themes/default/assets/fonts/Lato-BoldItalic.woff2\") format(\"woff2\") , url(\"./../themes/default/assets/fonts/Lato-BoldItalic.woff\") format(\"woff\");\n  font-style: italic;\n  font-weight: bold;\n  font-display: swap;\n  text-rendering: optimizeLegibility;\n  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;\n}\nhtml,\nbody {\n  height: 100%;\n}\nhtml {\n  font-size: 14px;\n}\nbody {\n  margin: 0;\n  padding: 0;\n  overflow-x: hidden;\n  min-width: 320px;\n  background: #fff;\n  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\";\n  font-size: 14px;\n  line-height: 1.4285em;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n\n/*******************************\n             Headers\n*******************************/\n\nh1,\nh2,\nh3,\nh4,\nh5 {\n  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\";\n  line-height: 1.28571429em;\n  margin: calc(2rem - 0.1428571428571429em) 0 1rem;\n  font-weight: bold;\n  padding: 0;\n}\nh1 {\n  min-height: 1rem;\n  font-size: 2rem;\n}\nh2 {\n  font-size: 1.71428571rem;\n}\nh3 {\n  font-size: 1.28571429rem;\n}\nh4 {\n  font-size: 1.07142857rem;\n}\nh5 {\n  font-size: 1rem;\n}\nh1:first-child,\nh2:first-child,\nh3:first-child,\nh4:first-child,\nh5:first-child {\n  margin-top: 0;\n}\nh1:last-child,\nh2:last-child,\nh3:last-child,\nh4:last-child,\nh5:last-child {\n  margin-bottom: 0;\n}\n\n\n/*******************************\n             Text\n*******************************/\n\np {\n  margin: 0 0 1em;\n  line-height: 1.4285em;\n}\np:first-child {\n  margin-top: 0;\n}\np:last-child {\n  margin-bottom: 0;\n}\n\n/* -------------------\n        Links\n-------------------- */\na {\n  color: #4183c4;\n  text-decoration: none;\n}\na:hover {\n  color: #1e70bf;\n  text-decoration: none;\n}\n\n\n/*******************************\n         Scrollbars\n*******************************/\n\n\n/* Force Simple Scrollbars */\nbody ::-webkit-scrollbar {\n  -webkit-appearance: none;\n  width: 10px;\n  height: 10px;\n}\nbody ::-webkit-scrollbar-track {\n  background: rgba(0, 0, 0, 0.1);\n  border-radius: 0;\n}\nbody ::-webkit-scrollbar-thumb {\n  cursor: pointer;\n  border-radius: 5px;\n  background: rgba(0, 0, 0, 0.25);\n  -webkit-transition: color 0.2s ease;\n  transition: color 0.2s ease;\n}\nbody ::-webkit-scrollbar-thumb:window-inactive {\n  background: rgba(0, 0, 0, 0.15);\n}\nbody ::-webkit-scrollbar-thumb:hover {\n  background: rgba(128, 135, 139, 0.8);\n}\nbody .ui {\n  \n/* IE11 */\n  scrollbar-face-color: #bfbfbf;\n  scrollbar-shadow-color: #bfbfbf;\n  scrollbar-track-color: #e6e6e6;\n  scrollbar-arrow-color: #e6e6e6;\n}\n@supports (-moz-appearance: none) {\n  body .ui {\n    \n/* firefox: first color thumb, second track */\n    scrollbar-color: rgba(0, 0, 0, 0.25) rgba(0, 0, 0, 0.1);\n    scrollbar-width: thin;\n  }\n}\n\n/* Inverted UI */\nbody .ui.inverted:not(.dimmer)::-webkit-scrollbar-track {\n  background: rgba(255, 255, 255, 0.1);\n}\nbody .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb {\n  background: rgba(255, 255, 255, 0.25);\n}\nbody .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb:window-inactive {\n  background: rgba(255, 255, 255, 0.15);\n}\nbody .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb:hover {\n  background: rgba(255, 255, 255, 0.35);\n}\nbody .ui.inverted:not(.dimmer) {\n  \n/* IE11 */\n  scrollbar-face-color: #656565;\n  scrollbar-shadow-color: #656565;\n  scrollbar-track-color: #323232;\n  scrollbar-arrow-color: #323232;\n}\n@supports (-moz-appearance: none) {\n  body .ui.inverted:not(.dimmer) {\n    \n/* firefox: first color thumb, second track */\n    scrollbar-color: rgba(255, 255, 255, 0.25) rgba(255, 255, 255, 0.1);\n  }\n}\n\n\n/*******************************\n          Highlighting\n*******************************/\n\n\n/* Site */\n::selection {\n  background-color: #cce2ff;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* Form */\ntextarea::selection,\ninput::selection {\n  background-color: rgba(100, 100, 100, 0.4);\n  color: rgba(0, 0, 0, 0.87);\n}\n\n\n/*******************************\n        Global Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/site.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Site\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.site = function (parameters) {\n        var\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n\n            settings        = $.isPlainObject(parameters)\n                ? $.extend(true, {}, $.site.settings, parameters)\n                : $.extend({}, $.site.settings),\n\n            namespace       = settings.namespace,\n            error           = settings.error,\n\n            moduleNamespace = 'module-' + namespace,\n\n            $document       = $(document),\n            $module         = $document,\n            element         = this,\n            instance        = $module.data(moduleNamespace),\n\n            module,\n            returnedValue\n        ;\n        module = {\n\n            initialize: function () {\n                module.instantiate();\n            },\n\n            instantiate: function () {\n                module.verbose('Storing instance of site', module);\n                instance = module;\n                $module\n                    .data(moduleNamespace, module)\n                ;\n            },\n\n            normalize: function () {\n                // keep the function for backward compatibility\n                // eslint-disable-next-line no-useless-return\n                return;\n            },\n\n            fix: {\n                consoleClear: function () {\n                    module.debug('Disabling programmatic console clearing');\n                    window.console.clear = function () {};\n                },\n            },\n\n            moduleExists: function (name) {\n                return $.fn[name] !== undefined && $.fn[name].settings !== undefined;\n            },\n\n            enabled: {\n                modules: function (modules) {\n                    var\n                        enabledModules = []\n                    ;\n                    modules = modules || settings.modules;\n                    $.each(modules, function (index, name) {\n                        if (module.moduleExists(name)) {\n                            enabledModules.push(name);\n                        }\n                    });\n\n                    return enabledModules;\n                },\n            },\n\n            disabled: {\n                modules: function (modules) {\n                    var\n                        disabledModules = []\n                    ;\n                    modules = modules || settings.modules;\n                    $.each(modules, function (index, name) {\n                        if (!module.moduleExists(name)) {\n                            disabledModules.push(name);\n                        }\n                    });\n\n                    return disabledModules;\n                },\n            },\n\n            change: {\n                setting: function (setting, value, modules, modifyExisting) {\n                    modules = typeof modules === 'string'\n                        ? (modules === 'all'\n                            ? settings.modules\n                            : [modules])\n                        : modules || settings.modules;\n                    modifyExisting = modifyExisting !== undefined\n                        ? modifyExisting\n                        : true;\n                    $.each(modules, function (index, name) {\n                        var\n                            namespace = module.moduleExists(name)\n                                ? $.fn[name].settings.namespace || false\n                                : true,\n                            $existingModules\n                        ;\n                        if (module.moduleExists(name)) {\n                            module.verbose('Changing default setting', setting, value, name);\n                            $.fn[name].settings[setting] = value;\n                            if (modifyExisting && namespace) {\n                                $existingModules = $(':data(module-' + namespace + ')');\n                                if ($existingModules.length > 0) {\n                                    module.verbose('Modifying existing settings', $existingModules);\n                                    $existingModules[name]('setting', setting, value);\n                                }\n                            }\n                        }\n                    });\n                },\n                settings: function (newSettings, modules, modifyExisting) {\n                    modules = typeof modules === 'string'\n                        ? [modules]\n                        : modules || settings.modules;\n                    modifyExisting = modifyExisting !== undefined\n                        ? modifyExisting\n                        : true;\n                    $.each(modules, function (index, name) {\n                        var\n                            $existingModules\n                        ;\n                        if (module.moduleExists(name)) {\n                            module.verbose('Changing default setting', newSettings, name);\n                            $.extend(true, $.fn[name].settings, newSettings);\n                            if (modifyExisting && namespace) {\n                                $existingModules = $(':data(module-' + namespace + ')');\n                                if ($existingModules.length > 0) {\n                                    module.verbose('Modifying existing settings', $existingModules);\n                                    $existingModules[name]('setting', newSettings);\n                                }\n                            }\n                        }\n                    });\n                },\n            },\n\n            enable: {\n                console: function () {\n                    module.console(true);\n                },\n                debug: function (modules, modifyExisting) {\n                    modules = modules || settings.modules;\n                    module.debug('Enabling debug for modules', modules);\n                    module.change.setting('debug', true, modules, modifyExisting);\n                },\n                verbose: function (modules, modifyExisting) {\n                    modules = modules || settings.modules;\n                    module.debug('Enabling verbose debug for modules', modules);\n                    module.change.setting('verbose', true, modules, modifyExisting);\n                },\n            },\n            disable: {\n                console: function () {\n                    module.console(false);\n                },\n                debug: function (modules, modifyExisting) {\n                    modules = modules || settings.modules;\n                    module.debug('Disabling debug for modules', modules);\n                    module.change.setting('debug', false, modules, modifyExisting);\n                },\n                verbose: function (modules, modifyExisting) {\n                    modules = modules || settings.modules;\n                    module.debug('Disabling verbose debug for modules', modules);\n                    module.change.setting('verbose', false, modules, modifyExisting);\n                },\n            },\n\n            console: function (enable) {\n                if (enable) {\n                    if (instance.cache.console === undefined) {\n                        module.error(error.console);\n\n                        return;\n                    }\n                    module.debug('Restoring console function');\n                    window.console = instance.cache.console;\n                } else {\n                    module.debug('Disabling console function');\n                    instance.cache.console = window.console;\n                    window.console = {\n                        clear: function () {},\n                        error: function () {},\n                        group: function () {},\n                        groupCollapsed: function () {},\n                        groupEnd: function () {},\n                        info: function () {},\n                        log: function () {},\n                        table: function () {},\n                        warn: function () {},\n                    };\n                }\n            },\n\n            destroy: function () {\n                module.verbose('Destroying previous site for', $module);\n                $module\n                    .removeData(moduleNamespace)\n                ;\n            },\n\n            cache: {},\n\n            setting: function (name, value) {\n                if ($.isPlainObject(name)) {\n                    $.extend(true, settings, name);\n                } else if (value !== undefined) {\n                    settings[name] = value;\n                } else {\n                    return settings[name];\n                }\n            },\n            internal: function (name, value) {\n                if ($.isPlainObject(name)) {\n                    $.extend(true, module, name);\n                } else if (value !== undefined) {\n                    module[name] = value;\n                } else {\n                    return module[name];\n                }\n            },\n            debug: function () {\n                if (settings.debug) {\n                    if (settings.performance) {\n                        module.performance.log(arguments);\n                    } else {\n                        module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                        module.debug.apply(console, arguments);\n                    }\n                }\n            },\n            verbose: function () {\n                if (settings.verbose && settings.debug) {\n                    if (settings.performance) {\n                        module.performance.log(arguments);\n                    } else {\n                        module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                        module.verbose.apply(console, arguments);\n                    }\n                }\n            },\n            error: function () {\n                module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                module.error.apply(console, arguments);\n            },\n            performance: {\n                log: function (message) {\n                    var\n                        currentTime,\n                        executionTime,\n                        previousTime\n                    ;\n                    if (settings.performance) {\n                        currentTime = Date.now();\n                        previousTime = time || currentTime;\n                        executionTime = currentTime - previousTime;\n                        time = currentTime;\n                        performance.push({\n                            Element: element,\n                            Name: message[0],\n                            Arguments: [].slice.call(message, 1) || '',\n                            'Execution Time': executionTime,\n                        });\n                    }\n                    clearTimeout(module.performance.timer);\n                    module.performance.timer = setTimeout(function () {\n                        module.performance.display();\n                    }, 500);\n                },\n                display: function () {\n                    var\n                        title = settings.name + ':',\n                        totalTime = 0\n                    ;\n                    time = false;\n                    clearTimeout(module.performance.timer);\n                    $.each(performance, function (index, data) {\n                        totalTime += data['Execution Time'];\n                    });\n                    title += ' ' + totalTime + 'ms';\n                    if (performance.length > 0) {\n                        console.groupCollapsed(title);\n                        if (console.table) {\n                            console.table(performance);\n                        } else {\n                            $.each(performance, function (index, data) {\n                                console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                            });\n                        }\n                        console.groupEnd();\n                    }\n                    performance = [];\n                },\n            },\n            invoke: function (query, passedArguments, context) {\n                var\n                    object = instance,\n                    maxDepth,\n                    found,\n                    response\n                ;\n                passedArguments = passedArguments || queryArguments;\n                context = context || element;\n                if (typeof query === 'string' && object !== undefined) {\n                    query = query.split(/[ .]/);\n                    maxDepth = query.length - 1;\n                    $.each(query, function (depth, value) {\n                        var camelCaseValue = depth !== maxDepth\n                            ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                            : query\n                        ;\n                        if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                            object = object[camelCaseValue];\n                        } else if (object[camelCaseValue] !== undefined) {\n                            found = object[camelCaseValue];\n\n                            return false;\n                        } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                            object = object[value];\n                        } else if (object[value] !== undefined) {\n                            found = object[value];\n\n                            return false;\n                        } else {\n                            module.error(error.method, query);\n\n                            return false;\n                        }\n                    });\n                }\n                if (isFunction(found)) {\n                    response = found.apply(context, passedArguments);\n                } else if (found !== undefined) {\n                    response = found;\n                }\n                if (Array.isArray(returnedValue)) {\n                    returnedValue.push(response);\n                } else if (returnedValue !== undefined) {\n                    returnedValue = [returnedValue, response];\n                } else if (response !== undefined) {\n                    returnedValue = response;\n                }\n\n                return found;\n            },\n        };\n\n        if (methodInvoked) {\n            if (instance === undefined) {\n                module.initialize();\n            }\n            module.invoke(query);\n        } else {\n            if (instance !== undefined) {\n                module.destroy();\n            }\n            module.initialize();\n        }\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n    $.site = $.fn.site;\n\n    $.site.settings = {\n\n        name: 'Site',\n        namespace: 'site',\n\n        error: {\n            console: 'Console cannot be restored, most likely it was overwritten outside of module',\n            method: 'The method you called is not defined.',\n        },\n\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        modules: [\n            'accordion',\n            'api',\n            'calendar',\n            'checkbox',\n            'dimmer',\n            'dropdown',\n            'embed',\n            'flyout',\n            'form',\n            'modal',\n            'nag',\n            'popup',\n            'progress',\n            'rating',\n            'search',\n            'shape',\n            'sidebar',\n            'slider',\n            'state',\n            'sticky',\n            'tab',\n            'toast',\n            'transition',\n            'visibility',\n        ],\n\n        siteNamespace: 'site',\n        namespaceStub: {\n            cache: {},\n            config: {},\n            sections: {},\n            section: {},\n            utilities: {},\n        },\n\n    };\n\n    // allows for selection of elements with data attributes\n    $.extend($.expr.pseudos, {\n        data: $.expr.createPseudo(function (dataName) {\n            return function (elem) {\n                return !!$.data(elem, dataName);\n            };\n        }),\n    });\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/slider.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Slider\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n.ui.slider:not(.vertical):not(.checkbox) {\n  width: 100%;\n  padding: 1em 0.5em;\n}\n.ui.slider:not(.checkbox) {\n  position: relative;\n}\n.ui.slider:not(.checkbox):focus {\n  outline: 0;\n}\n.ui.slider .inner {\n  position: relative;\n  z-index: 2;\n}\n.ui.slider:not(.vertical) .inner {\n  height: 1.5em;\n}\n.ui.slider .inner:hover {\n  cursor: auto;\n}\n.ui.slider .inner .track {\n  position: absolute;\n  border-radius: 4px;\n  background-color: rgba(0, 0, 0, 0.05);\n}\n.ui.slider:not(.vertical) .inner .track {\n  width: 100%;\n  height: 0.4em;\n  top: 0.55em;\n  left: 0;\n}\n.ui.slider .inner .track-fill {\n  position: absolute;\n  border-radius: 4px;\n  background-color: #1b1c1d;\n}\n.ui.slider:not(.vertical) .inner .track-fill {\n  height: 0.4em;\n  top: 0.55em;\n  left: 0;\n}\n.ui.slider .inner .thumb {\n  position: absolute;\n  left: 0;\n  top: 0;\n  height: 1.5em;\n  width: 1.5em;\n  background: #fff linear-gradient(transparent, rgba(0, 0, 0, 0.05));\n  border-radius: 100%;\n  box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15) inset;\n  transition: background 0.3s ease;\n}\n.ui.slider:not(.disabled) .inner .thumb:hover {\n  cursor: pointer;\n  background: #f2f2f2 linear-gradient(transparent, rgba(0, 0, 0, 0.05));\n}\n.ui.slider:not(.disabled):focus .inner .thumb {\n  background: #f2f2f2 linear-gradient(transparent, rgba(0, 0, 0, 0.05));\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* --------------\n         Disabled\n    --------------- */\n.ui.disabled.slider:not(.checkbox) {\n  opacity: 0.5;\n}\n.ui.disabled.slider .inner:hover {\n  cursor: auto;\n}\n.ui.disabled.slider .inner .track-fill {\n  background: #ccc;\n}\n\n/* --------------\n        Reversed\n    --------------- */\n.ui.reversed.slider .inner .track-fill {\n  left: auto;\n  right: 0;\n}\n.ui.reversed.slider:not(.vertical) .inner .thumb {\n  left: auto;\n  right: 0;\n}\n.ui.reversed.vertical.slider .inner .thumb {\n  left: 0.03em;\n}\n.ui.labeled.reversed.slider > .labels .label {\n  transform: translate(-100%, -100%);\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n        Vertical\n    --------------- */\n.ui.vertical.slider {\n  height: 100%;\n  width: 1.5em;\n  padding: 0.5em 1em;\n}\n.ui.vertical.slider .inner {\n  height: 100%;\n}\n.ui.vertical.slider .inner .track {\n  height: 100%;\n  width: 0.4em;\n  left: 0.55em;\n  top: 0;\n}\n.ui.vertical.slider .inner .track-fill {\n  width: 0.4em;\n  left: 0.55em;\n  top: 0;\n}\n\n/* Vertical Reversed */\n.ui.vertical.reversed.slider .inner .thumb {\n  top: auto;\n  bottom: 0;\n}\n.ui.vertical.reversed.slider .inner .track-fill {\n  top: auto;\n  bottom: 0;\n}\n\n/* --------------\n        Labeled\n    --------------- */\n.ui.labeled.slider > .labels {\n  height: 1.5em;\n  width: auto;\n  margin: 0;\n  padding: 0;\n  position: absolute;\n  top: 50%;\n  left: 0;\n  right: 0;\n}\n.ui.labeled.slider:not(.vertical) > .labels {\n  transform: translateY(-50%);\n}\n.ui.labeled.slider > .labels .label {\n  display: inline-flex;\n  position: absolute;\n  transform: translate(-50%, -100%);\n  white-space: nowrap;\n}\n.ui.labeled.slider > .labels .label:not(.ui) {\n  padding: 0.2em 0;\n}\n.ui.bottom.aligned.labeled.slider > .labels .label {\n  bottom: 0;\n  transform: translate(-50%, 100%);\n}\n.ui.labeled.ticked.slider > .labels .label::after {\n  content: \" \";\n  height: 1.5em;\n  width: 1px;\n  background: #ccc;\n  position: absolute;\n  top: 100%;\n  left: 50%;\n}\n.ui.bottom.aligned.labeled.ticked.slider > .labels .label::after {\n  top: auto;\n  bottom: 100%;\n}\n.ui.labeled.slider.bottom.aligned .labels .ui.label {\n  margin-bottom: -0.5em;\n}\n.ui.labeled.ticked.slider.bottom.aligned .labels .ui.label::after {\n  margin-bottom: 0.5em;\n}\n.ui.labeled.ticked.slider > .labels .halftick.label::after {\n  height: 0.75em;\n}\n.ui.inverted.labeled.ticked.slider > .labels .label::after {\n  background: #333;\n}\n.ui.labeled.slider:not(.vertical):not(.bottom) .labels .ui.label {\n  margin-top: -0.5em;\n}\n.ui.labeled.ticked.slider:not(.vertical):not(.bottom) .labels .ui.label::after {\n  margin-top: 0.5em;\n}\n.ui.labeled.ticked.slider:not(.vertical) > .labels .ui.label::after {\n  height: 2em;\n}\n\n/* Vertical Labels */\n.ui.labeled.vertical.slider > .labels {\n  width: 1.5em;\n  height: auto;\n  left: 50%;\n  top: 0;\n  bottom: 0;\n  transform: translateX(-50%);\n}\n.ui.labeled.vertical.slider > .labels .label {\n  transform: translate(-100%, -50%);\n}\n.ui.labeled.vertical.slider > .labels .label::after {\n  width: 1.5em;\n  height: 1px;\n  left: 100%;\n  top: 50%;\n}\n.ui.labeled.vertical.slider > .labels .halftick.label::after {\n  width: 0.75em;\n  height: 1px;\n}\n.ui.labeled.vertical.slider:not(.right) > .labels .halftick.label::after {\n  margin-left: 0.6em;\n}\n\n/* Vertical Reversed Labels */\n.ui.labeled.vertical.reversed.slider > .labels .label {\n  transform: translate(-100%, 50%);\n}\n.ui.labeled.ticked.vertical.slider:not(.right) > .labels .ui.label::after {\n  margin-left: 0.3em;\n}\n.ui.labeled.vertical.right.aligned.slider > .labels {\n  transform: translateX(50%);\n  left: calc(100% + 0.6em);\n}\n.ui.labeled.vertical.right.aligned.slider > .labels .label {\n  transform: translate(100%, -50%);\n  right: 100%;\n}\n.ui.labeled.vertical.right.aligned.slider > .labels .label::after {\n  right: 100%;\n  left: auto;\n}\n.ui.labeled.vertical.right.aligned.slider > .labels .halftick.label::after {\n  margin-right: 0.6em;\n}\n.ui.labeled.vertical.reversed.right.aligned.slider > .labels .label {\n  transform: translate(100%, 50%);\n}\n.ui.labeled.ticked.vertical.right.aligned.slider > .labels .ui.label::after {\n  margin-right: 0.3em;\n}\n\n/* --------------\n    Hover\n--------------- */\n.ui.hover.slider .inner .thumb {\n  opacity: 0;\n  transition: opacity 0.2s linear;\n}\n.ui.hover.slider:not(.disabled):hover .inner .thumb,\n.ui.hover.slider:not(.disabled):focus .inner .thumb {\n  opacity: 1;\n}\n\n/* --------------\n        Inverted\n    --------------- */\n.ui.inverted.slider .inner .track-fill {\n  background-color: #545454;\n}\n.ui.inverted.slider .inner .track {\n  background-color: rgba(255, 255, 255, 0.08);\n}\n.ui.labeled.slider > .active.labels .label {\n  transition: all 0.2s ease;\n}\n.ui.labeled.ticked.slider > .active.labels .active.label::after {\n  background: #1b1c1d;\n}\n.ui.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background: #545454;\n}\n.ui.labeled.ticked.slider > .active.labels .active.label::after,\n.ui.labeled.slider > .active.labels .label:not(.active) {\n  opacity: 0.6;\n}\n\n/* --------------\n     Colors\n--------------- */\n\n/* Standard */\n.ui.primary.slider .inner .track-fill {\n  background-color: #2185d0;\n}\n.ui.primary.inverted.slider .inner .track-fill {\n  background-color: #54c8ff;\n}\n\n/* Basic */\n.ui.primary.slider.basic .inner .thumb {\n  background-color: #2185d0;\n}\n.ui.primary.slider.basic .inner .thumb:hover,\n.ui.primary.slider.basic:focus .inner .thumb {\n  background-color: #1678c2;\n}\n\n/* Basic Inverted */\n.ui.primary.inverted.slider.basic .inner .thumb {\n  background-color: #54c8ff;\n}\n.ui.primary.inverted.slider.basic .inner .thumb:hover,\n.ui.primary.inverted.slider.basic:focus .inner .thumb {\n  background-color: #21b8ff;\n}\n.ui.primary.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #2185d0;\n}\n.ui.primary.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #54c8ff;\n}\n\n/* Standard */\n.ui.secondary.slider .inner .track-fill {\n  background-color: #1b1c1d;\n}\n.ui.secondary.inverted.slider .inner .track-fill {\n  background-color: #545454;\n}\n\n/* Basic */\n.ui.secondary.slider.basic .inner .thumb {\n  background-color: #1b1c1d;\n}\n.ui.secondary.slider.basic .inner .thumb:hover,\n.ui.secondary.slider.basic:focus .inner .thumb {\n  background-color: #27292a;\n}\n\n/* Basic Inverted */\n.ui.secondary.inverted.slider.basic .inner .thumb {\n  background-color: #545454;\n}\n.ui.secondary.inverted.slider.basic .inner .thumb:hover,\n.ui.secondary.inverted.slider.basic:focus .inner .thumb {\n  background-color: #6e6e6e;\n}\n.ui.secondary.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #1b1c1d;\n}\n.ui.secondary.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #545454;\n}\n\n/* Standard */\n.ui.red.slider .inner .track-fill {\n  background-color: #db2828;\n}\n.ui.red.inverted.slider .inner .track-fill {\n  background-color: #ff695e;\n}\n\n/* Basic */\n.ui.red.slider.basic .inner .thumb {\n  background-color: #db2828;\n}\n.ui.red.slider.basic .inner .thumb:hover,\n.ui.red.slider.basic:focus .inner .thumb {\n  background-color: #d01919;\n}\n\n/* Basic Inverted */\n.ui.red.inverted.slider.basic .inner .thumb {\n  background-color: #ff695e;\n}\n.ui.red.inverted.slider.basic .inner .thumb:hover,\n.ui.red.inverted.slider.basic:focus .inner .thumb {\n  background-color: #ff392b;\n}\n.ui.red.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #db2828;\n}\n.ui.red.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #ff695e;\n}\n\n/* Standard */\n.ui.orange.slider .inner .track-fill {\n  background-color: #f2711c;\n}\n.ui.orange.inverted.slider .inner .track-fill {\n  background-color: #ff851b;\n}\n\n/* Basic */\n.ui.orange.slider.basic .inner .thumb {\n  background-color: #f2711c;\n}\n.ui.orange.slider.basic .inner .thumb:hover,\n.ui.orange.slider.basic:focus .inner .thumb {\n  background-color: #f26202;\n}\n\n/* Basic Inverted */\n.ui.orange.inverted.slider.basic .inner .thumb {\n  background-color: #ff851b;\n}\n.ui.orange.inverted.slider.basic .inner .thumb:hover,\n.ui.orange.inverted.slider.basic:focus .inner .thumb {\n  background-color: #e76b00;\n}\n.ui.orange.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #f2711c;\n}\n.ui.orange.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #ff851b;\n}\n\n/* Standard */\n.ui.yellow.slider .inner .track-fill {\n  background-color: #fbbd08;\n}\n.ui.yellow.inverted.slider .inner .track-fill {\n  background-color: #ffe21f;\n}\n\n/* Basic */\n.ui.yellow.slider.basic .inner .thumb {\n  background-color: #fbbd08;\n}\n.ui.yellow.slider.basic .inner .thumb:hover,\n.ui.yellow.slider.basic:focus .inner .thumb {\n  background-color: #eaae00;\n}\n\n/* Basic Inverted */\n.ui.yellow.inverted.slider.basic .inner .thumb {\n  background-color: #ffe21f;\n}\n.ui.yellow.inverted.slider.basic .inner .thumb:hover,\n.ui.yellow.inverted.slider.basic:focus .inner .thumb {\n  background-color: #ebcd00;\n}\n.ui.yellow.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #fbbd08;\n}\n.ui.yellow.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #ffe21f;\n}\n\n/* Standard */\n.ui.olive.slider .inner .track-fill {\n  background-color: #b5cc18;\n}\n.ui.olive.inverted.slider .inner .track-fill {\n  background-color: #d9e778;\n}\n\n/* Basic */\n.ui.olive.slider.basic .inner .thumb {\n  background-color: #b5cc18;\n}\n.ui.olive.slider.basic .inner .thumb:hover,\n.ui.olive.slider.basic:focus .inner .thumb {\n  background-color: #a7bd0d;\n}\n\n/* Basic Inverted */\n.ui.olive.inverted.slider.basic .inner .thumb {\n  background-color: #d9e778;\n}\n.ui.olive.inverted.slider.basic .inner .thumb:hover,\n.ui.olive.inverted.slider.basic:focus .inner .thumb {\n  background-color: #d2e745;\n}\n.ui.olive.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #b5cc18;\n}\n.ui.olive.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #d9e778;\n}\n\n/* Standard */\n.ui.green.slider .inner .track-fill {\n  background-color: #21ba45;\n}\n.ui.green.inverted.slider .inner .track-fill {\n  background-color: #2ecc40;\n}\n\n/* Basic */\n.ui.green.slider.basic .inner .thumb {\n  background-color: #21ba45;\n}\n.ui.green.slider.basic .inner .thumb:hover,\n.ui.green.slider.basic:focus .inner .thumb {\n  background-color: #16ab39;\n}\n\n/* Basic Inverted */\n.ui.green.inverted.slider.basic .inner .thumb {\n  background-color: #2ecc40;\n}\n.ui.green.inverted.slider.basic .inner .thumb:hover,\n.ui.green.inverted.slider.basic:focus .inner .thumb {\n  background-color: #1ea92e;\n}\n.ui.green.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #21ba45;\n}\n.ui.green.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #2ecc40;\n}\n\n/* Standard */\n.ui.teal.slider .inner .track-fill {\n  background-color: #00b5ad;\n}\n.ui.teal.inverted.slider .inner .track-fill {\n  background-color: #6dffff;\n}\n\n/* Basic */\n.ui.teal.slider.basic .inner .thumb {\n  background-color: #00b5ad;\n}\n.ui.teal.slider.basic .inner .thumb:hover,\n.ui.teal.slider.basic:focus .inner .thumb {\n  background-color: #009c95;\n}\n\n/* Basic Inverted */\n.ui.teal.inverted.slider.basic .inner .thumb {\n  background-color: #6dffff;\n}\n.ui.teal.inverted.slider.basic .inner .thumb:hover,\n.ui.teal.inverted.slider.basic:focus .inner .thumb {\n  background-color: #3affff;\n}\n.ui.teal.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #00b5ad;\n}\n.ui.teal.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #6dffff;\n}\n\n/* Standard */\n.ui.blue.slider .inner .track-fill {\n  background-color: #2185d0;\n}\n.ui.blue.inverted.slider .inner .track-fill {\n  background-color: #54c8ff;\n}\n\n/* Basic */\n.ui.blue.slider.basic .inner .thumb {\n  background-color: #2185d0;\n}\n.ui.blue.slider.basic .inner .thumb:hover,\n.ui.blue.slider.basic:focus .inner .thumb {\n  background-color: #1678c2;\n}\n\n/* Basic Inverted */\n.ui.blue.inverted.slider.basic .inner .thumb {\n  background-color: #54c8ff;\n}\n.ui.blue.inverted.slider.basic .inner .thumb:hover,\n.ui.blue.inverted.slider.basic:focus .inner .thumb {\n  background-color: #21b8ff;\n}\n.ui.blue.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #2185d0;\n}\n.ui.blue.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #54c8ff;\n}\n\n/* Standard */\n.ui.violet.slider .inner .track-fill {\n  background-color: #6435c9;\n}\n.ui.violet.inverted.slider .inner .track-fill {\n  background-color: #a291fb;\n}\n\n/* Basic */\n.ui.violet.slider.basic .inner .thumb {\n  background-color: #6435c9;\n}\n.ui.violet.slider.basic .inner .thumb:hover,\n.ui.violet.slider.basic:focus .inner .thumb {\n  background-color: #5829bb;\n}\n\n/* Basic Inverted */\n.ui.violet.inverted.slider.basic .inner .thumb {\n  background-color: #a291fb;\n}\n.ui.violet.inverted.slider.basic .inner .thumb:hover,\n.ui.violet.inverted.slider.basic:focus .inner .thumb {\n  background-color: #745aff;\n}\n.ui.violet.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #6435c9;\n}\n.ui.violet.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #a291fb;\n}\n\n/* Standard */\n.ui.purple.slider .inner .track-fill {\n  background-color: #a333c8;\n}\n.ui.purple.inverted.slider .inner .track-fill {\n  background-color: #dc73ff;\n}\n\n/* Basic */\n.ui.purple.slider.basic .inner .thumb {\n  background-color: #a333c8;\n}\n.ui.purple.slider.basic .inner .thumb:hover,\n.ui.purple.slider.basic:focus .inner .thumb {\n  background-color: #9627ba;\n}\n\n/* Basic Inverted */\n.ui.purple.inverted.slider.basic .inner .thumb {\n  background-color: #dc73ff;\n}\n.ui.purple.inverted.slider.basic .inner .thumb:hover,\n.ui.purple.inverted.slider.basic:focus .inner .thumb {\n  background-color: #cf40ff;\n}\n.ui.purple.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #a333c8;\n}\n.ui.purple.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #dc73ff;\n}\n\n/* Standard */\n.ui.pink.slider .inner .track-fill {\n  background-color: #e03997;\n}\n.ui.pink.inverted.slider .inner .track-fill {\n  background-color: #ff8edf;\n}\n\n/* Basic */\n.ui.pink.slider.basic .inner .thumb {\n  background-color: #e03997;\n}\n.ui.pink.slider.basic .inner .thumb:hover,\n.ui.pink.slider.basic:focus .inner .thumb {\n  background-color: #e61a8d;\n}\n\n/* Basic Inverted */\n.ui.pink.inverted.slider.basic .inner .thumb {\n  background-color: #ff8edf;\n}\n.ui.pink.inverted.slider.basic .inner .thumb:hover,\n.ui.pink.inverted.slider.basic:focus .inner .thumb {\n  background-color: #ff5bd1;\n}\n.ui.pink.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #e03997;\n}\n.ui.pink.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #ff8edf;\n}\n\n/* Standard */\n.ui.brown.slider .inner .track-fill {\n  background-color: #a5673f;\n}\n.ui.brown.inverted.slider .inner .track-fill {\n  background-color: #d67c1c;\n}\n\n/* Basic */\n.ui.brown.slider.basic .inner .thumb {\n  background-color: #a5673f;\n}\n.ui.brown.slider.basic .inner .thumb:hover,\n.ui.brown.slider.basic:focus .inner .thumb {\n  background-color: #975b33;\n}\n\n/* Basic Inverted */\n.ui.brown.inverted.slider.basic .inner .thumb {\n  background-color: #d67c1c;\n}\n.ui.brown.inverted.slider.basic .inner .thumb:hover,\n.ui.brown.inverted.slider.basic:focus .inner .thumb {\n  background-color: #b0620f;\n}\n.ui.brown.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #a5673f;\n}\n.ui.brown.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #d67c1c;\n}\n\n/* Standard */\n.ui.grey.slider .inner .track-fill {\n  background-color: #767676;\n}\n.ui.grey.inverted.slider .inner .track-fill {\n  background-color: #dcddde;\n}\n\n/* Basic */\n.ui.grey.slider.basic .inner .thumb {\n  background-color: #767676;\n}\n.ui.grey.slider.basic .inner .thumb:hover,\n.ui.grey.slider.basic:focus .inner .thumb {\n  background-color: #838383;\n}\n\n/* Basic Inverted */\n.ui.grey.inverted.slider.basic .inner .thumb {\n  background-color: #dcddde;\n}\n.ui.grey.inverted.slider.basic .inner .thumb:hover,\n.ui.grey.inverted.slider.basic:focus .inner .thumb {\n  background-color: #c2c4c5;\n}\n.ui.grey.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #767676;\n}\n.ui.grey.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #dcddde;\n}\n\n/* Standard */\n.ui.black.slider .inner .track-fill {\n  background-color: #1b1c1d;\n}\n.ui.black.inverted.slider .inner .track-fill {\n  background-color: #545454;\n}\n\n/* Basic */\n.ui.black.slider.basic .inner .thumb {\n  background-color: #1b1c1d;\n}\n.ui.black.slider.basic .inner .thumb:hover,\n.ui.black.slider.basic:focus .inner .thumb {\n  background-color: #27292a;\n}\n\n/* Basic Inverted */\n.ui.black.inverted.slider.basic .inner .thumb {\n  background-color: #545454;\n}\n.ui.black.inverted.slider.basic .inner .thumb:hover,\n.ui.black.inverted.slider.basic:focus .inner .thumb {\n  background-color: #000000;\n}\n.ui.black.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #1b1c1d;\n}\n.ui.black.inverted.labeled.ticked.slider > .active.labels .active.label::after {\n  background-color: #545454;\n}\n\n/* --------------\n         Basic\n    --------------- */\n\n/* Standard */\n.ui.slider.basic .inner .thumb {\n  background-color: #1b1c1d;\n}\n.ui.slider.basic .inner .thumb:hover,\n.ui.slider.basic:focus .inner .thumb {\n  background-color: #27292a;\n}\n\n/* --------------\n          Basic Inverted\n        --------------- */\n\n/* Standard */\n.ui.inverted.slider.basic .inner .thumb {\n  background-color: #545454;\n}\n.ui.inverted.slider.basic .inner .thumb:hover,\n.ui.inverted.slider.basic:focus .inner .thumb {\n  background-color: #000000;\n}\n\n/* --------------\n     Sizing\n--------------- */\n.ui.slider.small .inner .thumb {\n  height: 1em;\n  width: 1em;\n}\n.ui.slider.small:not(.vertical) .inner {\n  height: 1em;\n}\n.ui.slider.small:not(.vertical) .inner .track,\n.ui.slider.small:not(.vertical) .inner .track-fill {\n  height: 0.3em;\n  top: 0.35em;\n}\n.ui.small.labeled.slider:not(.vertical) > .labels,\n.ui.small.labeled.slider:not(.vertical) > .labels .label::after {\n  height: 1em;\n}\n.ui.small.labeled.slider:not(.vertical) > .labels .halftick.label::after {\n  height: 0.5em;\n}\n\n/* Small Vertical */\n.ui.slider.small.vertical .inner {\n  width: 1em;\n}\n.ui.slider.small.vertical .inner .track,\n.ui.slider.small.vertical .inner .track-fill {\n  width: 0.3em;\n  left: 0.35em;\n}\n.ui.small.labeled.vertical.slider > .labels,\n.ui.small.labeled.vertical.slider > .labels .label::after {\n  width: 1em;\n}\n.ui.small.labeled.vertical.slider > .labels .halftick.label::after {\n  width: 0.5em;\n}\n.ui.slider.large .inner .thumb {\n  height: 2em;\n  width: 2em;\n}\n.ui.slider.large:not(.vertical) .inner {\n  height: 2em;\n}\n.ui.slider.large:not(.vertical) .inner .track,\n.ui.slider.large:not(.vertical) .inner .track-fill {\n  height: 0.5em;\n  top: 0.75em;\n}\n.ui.large.labeled.slider:not(.vertical) > .labels,\n.ui.large.labeled.slider:not(.vertical) > .labels .label::after {\n  height: 2em;\n}\n.ui.large.labeled.slider:not(.vertical) > .labels .halftick.label::after {\n  height: 1em;\n}\n\n/* Small Vertical */\n.ui.slider.large.vertical .inner {\n  width: 2em;\n}\n.ui.slider.large.vertical .inner .track,\n.ui.slider.large.vertical .inner .track-fill {\n  width: 0.5em;\n  left: 0.75em;\n}\n.ui.large.labeled.vertical.slider > .labels,\n.ui.large.labeled.vertical.slider > .labels .label::after {\n  width: 2em;\n}\n.ui.large.labeled.vertical.slider > .labels .halftick.label::after {\n  width: 1em;\n}\n.ui.slider.big .inner .thumb {\n  height: 2.5em;\n  width: 2.5em;\n}\n.ui.slider.big:not(.vertical) .inner {\n  height: 2.5em;\n}\n.ui.slider.big:not(.vertical) .inner .track,\n.ui.slider.big:not(.vertical) .inner .track-fill {\n  height: 0.6em;\n  top: 0.95em;\n}\n.ui.big.labeled.slider:not(.vertical) > .labels,\n.ui.big.labeled.slider:not(.vertical) > .labels .label::after {\n  height: 2.5em;\n}\n.ui.big.labeled.slider:not(.vertical) > .labels .halftick.label::after {\n  height: 1.25em;\n}\n\n/* Small Vertical */\n.ui.slider.big.vertical .inner {\n  width: 2.5em;\n}\n.ui.slider.big.vertical .inner .track,\n.ui.slider.big.vertical .inner .track-fill {\n  width: 0.6em;\n  left: 0.95em;\n}\n.ui.big.labeled.vertical.slider > .labels,\n.ui.big.labeled.vertical.slider > .labels .label::after {\n  width: 2.5em;\n}\n.ui.big.labeled.vertical.slider > .labels .halftick.label::after {\n  width: 1.25em;\n}\n\n\n/*******************************\n        Slider Overrides\n*******************************/\n\n\n\n/*******************************\n        User Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/slider.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Slider\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.slider = function (parameters) {\n        var\n            $allModules    = $(this),\n            $document      = $(document),\n            $window        = $(window),\n\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n\n            SINGLE_STEP     = 1,\n            BIG_STEP        = 2,\n            NO_STEP         = 0,\n            SINGLE_BACKSTEP = -1,\n            BIG_BACKSTEP    = -2,\n\n            // Used to manage document bound events.\n            // Use this so that we can distinguish between which document events are bound to which range.\n            currentRange    = 0,\n\n            returnedValue\n        ;\n\n        $allModules.each(function () {\n            var\n                settings        = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.slider.settings, parameters)\n                    : $.extend({}, $.fn.slider.settings),\n\n                className       = settings.className,\n                metadata        = settings.metadata,\n                namespace       = settings.namespace,\n                error           = settings.error,\n                keys            = settings.keys,\n                interpretLabel  = settings.interpretLabel,\n\n                isHover         = false,\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                $module         = $(this),\n                $currThumb,\n                touchIdentifier,\n                $thumb,\n                $secondThumb,\n                $track,\n                $trackFill,\n                $labels,\n\n                element         = this,\n                instance        = $module.data(moduleNamespace),\n\n                documentEventID,\n\n                value,\n                position,\n                secondPos,\n                offset,\n                gapRatio = 1,\n                previousValue,\n\n                initialPosition,\n                initialLoad,\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.debug('Initializing slider', settings);\n                    initialLoad = true;\n\n                    currentRange += 1;\n                    documentEventID = currentRange;\n\n                    module.setup.layout();\n                    module.setup.labels();\n\n                    module.bind.events();\n\n                    module.read.metadata();\n                    module.read.settings();\n\n                    initialLoad = false;\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of slider', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous slider for', $module);\n                    clearInterval(instance.interval);\n                    module.unbind.events();\n                    module.unbind.slidingEvents();\n                    delete module.cache;\n                    $module.removeData(moduleNamespace);\n                    instance = undefined;\n                },\n\n                setup: {\n                    layout: function () {\n                        if ($module.attr('tabindex') === undefined) {\n                            $module.attr('tabindex', 0);\n                        }\n                        if ($module.find('.inner').length === 0) {\n                            $module.append('<div class=\"inner\">'\n                                + '<div class=\"track\"></div>'\n                                + '<div class=\"track-fill\"></div>'\n                                + '<div class=\"thumb\"></div>'\n                                + '</div>');\n                        }\n                        module.clear.cache();\n                        $thumb = $module.find('.thumb:not(.second)');\n                        if (settings.showThumbTooltip) {\n                            $thumb\n                                .attr('data-position', settings.tooltipConfig.position)\n                                .attr('data-variation', settings.tooltipConfig.variation)\n                            ;\n                        }\n                        $currThumb = $thumb;\n                        if (module.is.range()) {\n                            if ($module.find('.thumb.second').length === 0) {\n                                $module.find('.inner').append('<div class=\"thumb second\"></div>');\n                            }\n                            $secondThumb = $module.find('.thumb.second');\n                            if (settings.showThumbTooltip) {\n                                $secondThumb\n                                    .attr('data-position', settings.tooltipConfig.position)\n                                    .attr('data-variation', settings.tooltipConfig.variation)\n                                ;\n                            }\n                        }\n                        $track = $module.find('.track');\n                        $trackFill = $module.find('.track-fill');\n                        offset = $thumb.width() / 2;\n                    },\n                    labels: function () {\n                        if (module.is.labeled()) {\n                            $labels = $module.find('.labels:not(.auto)');\n                            if ($labels.length > 0) {\n                                module.setup.customLabel();\n                            } else {\n                                module.setup.autoLabel();\n                            }\n\n                            if (settings.highlightRange) {\n                                $labels.addClass(className.active);\n                            }\n\n                            if (settings.showLabelTicks) {\n                                $module.addClass(className.ticked);\n                            } else if ($module.hasClass(className.ticked)) {\n                                settings.showLabelTicks = 'always';\n                            }\n                        }\n                    },\n                    customLabel: function () {\n                        var\n                            $children   = $labels.find('.label'),\n                            numChildren = $children.length,\n                            min         = module.get.min(),\n                            max         = module.get.max(),\n                            ratio\n                        ;\n                        $children.each(function (index) {\n                            var\n                                $child = $(this),\n                                attrValue = $child.attr('data-value')\n                            ;\n                            if (attrValue) {\n                                attrValue = attrValue > max\n                                    ? max\n                                    : (attrValue < min ? min : attrValue);\n                                ratio = (attrValue - min) / (max - min);\n                            } else {\n                                ratio = (index + 1) / (numChildren + 1);\n                            }\n                            module.update.labelPosition(ratio, $(this));\n                        });\n                    },\n                    autoLabel: function () {\n                        $labels = $module.find('.labels');\n                        if ($labels.length > 0) {\n                            $labels.empty();\n                        } else {\n                            $labels = $module.append('<ul class=\"auto labels\"></ul>').find('.labels');\n                        }\n                        var step = module.get.step(),\n                            precision = module.get.precision(),\n                            len = module.get.numLabels(),\n                            ignoreLabels = len - (settings.autoAdjustLabels !== 'fixed' ? 0 : module.get.max().toString().length + 4)\n                        ;\n                        for (var i = 0; i <= len; i++) {\n                            var\n                                stepValue =  Math.round(((i * (step === 0 ? 1 : step)) + module.get.min()) * precision) / precision,\n                                labelText = module.get.label(i, stepValue),\n                                showLabel = settings.restrictedLabels.length === 0 || settings.restrictedLabels.indexOf(labelText) >= 0,\n                                $label = labelText !== '' && (showLabel || settings.showLabelTicks === 'always')\n                                    ? ((!(i % module.get.gapRatio()) && i < ignoreLabels) || i === len\n                                        ? $('<li/>', { class: className.label, 'data-value': stepValue, html: showLabel ? labelText : '' })\n                                        : $('<li/>', { class: 'halftick label', 'data-value': stepValue }))\n                                    : null,\n                                ratio  = i / len\n                            ;\n                            if ($label) {\n                                module.update.labelPosition(ratio, $label);\n                                $labels.append($label);\n                            }\n                        }\n                    },\n                },\n\n                bind: {\n                    events: function () {\n                        module.bind.globalKeyboardEvents();\n                        module.bind.keyboardEvents();\n                        module.bind.mouseEvents();\n                        if (settings.autoAdjustLabels) {\n                            module.bind.windowEvents();\n                        }\n                    },\n                    keyboardEvents: function () {\n                        module.verbose('Binding keyboard events');\n                        $module.on('keydown' + eventNamespace, module.event.keydown);\n                    },\n                    globalKeyboardEvents: function () {\n                        $document.on('keydown' + eventNamespace + documentEventID, module.event.activateFocus);\n                    },\n                    mouseEvents: function () {\n                        module.verbose('Binding mouse and touch events');\n                        $module.find('.track, .thumb, .inner').on('mousedown' + eventNamespace, function (event) {\n                            event.stopImmediatePropagation();\n                            event.preventDefault();\n                            module.event.down(event);\n                        });\n                        $module.on('mousedown' + eventNamespace, module.event.down);\n                        $module.on('mouseenter' + eventNamespace, function (event) {\n                            isHover = true;\n                        });\n                        $module.on('mouseleave' + eventNamespace, function (event) {\n                            isHover = false;\n                        });\n                        // All touch events are invoked on the element where the touch *started*. Thus, we can bind them all\n                        // on the thumb(s) and don't need to worry about interference with other components, i.e. no dynamic binding\n                        // and unbinding required.\n                        $module.find('.thumb')\n                            .on('touchstart' + eventNamespace, module.event.touchDown)\n                            .on('touchmove' + eventNamespace, module.event.move)\n                            .on('touchend' + eventNamespace, module.event.up)\n                            .on('touchcancel' + eventNamespace, module.event.touchCancel)\n                        ;\n                    },\n                    slidingEvents: function () {\n                        // these don't need the identifier because we only ever want one of them to be registered with document\n                        module.verbose('Binding page wide events while handle is being draged');\n                        $document.on('mousemove' + eventNamespace, module.event.move);\n                        $document.on('mouseup' + eventNamespace, module.event.up);\n                    },\n                    windowEvents: function () {\n                        $window.on('resize' + eventNamespace, module.event.resize);\n                    },\n                },\n\n                unbind: {\n                    events: function () {\n                        $module.find('.track, .thumb, .inner').off('mousedown' + eventNamespace);\n                        $module.off('mousedown' + eventNamespace);\n                        $module.off('mouseenter' + eventNamespace);\n                        $module.off('mouseleave' + eventNamespace);\n                        $module.find('.thumb')\n                            .off('touchstart' + eventNamespace)\n                            .off('touchmove' + eventNamespace)\n                            .off('touchend' + eventNamespace)\n                            .off('touchcancel' + eventNamespace)\n                        ;\n                        $module.off('keydown' + eventNamespace);\n                        $module.off('focusout' + eventNamespace);\n                        $document.off('keydown' + eventNamespace + documentEventID, module.event.activateFocus);\n                        $window.off('resize' + eventNamespace);\n                    },\n                    slidingEvents: function () {\n                        $document.off('mousemove' + eventNamespace);\n                        $document.off('mouseup' + eventNamespace);\n                    },\n                },\n\n                event: {\n                    down: function (event) {\n                        event.preventDefault();\n                        if (module.is.range()) {\n                            var\n                                eventPos = module.determine.eventPos(event),\n                                newPos = module.determine.pos(eventPos)\n                            ;\n                            // Special handling if range mode and both thumbs have the same value\n                            if (settings.preventCrossover && module.is.range() && module.thumbVal === module.secondThumbVal) {\n                                initialPosition = newPos;\n                                $currThumb = undefined;\n                            } else {\n                                $currThumb = module.determine.closestThumb(newPos);\n                            }\n                            if (previousValue === undefined) {\n                                previousValue = module.get.currentThumbValue();\n                            }\n                        } else if (previousValue === undefined) {\n                            previousValue = module.get.value();\n                        }\n\n                        if (!module.is.disabled()) {\n                            module.bind.slidingEvents();\n                        }\n                    },\n                    touchDown: function (event) {\n                        event.preventDefault(); // disable mouse emulation and touch-scrolling\n                        event.stopImmediatePropagation();\n                        if (touchIdentifier !== undefined) {\n                            // ignore multiple touches on the same slider --\n                            // we cannot handle changing both thumbs at once due to shared state\n                            return;\n                        }\n                        $currThumb = $(event.target);\n                        var touchEvent = event.touches ? event : event.originalEvent;\n                        touchIdentifier = touchEvent.targetTouches[0].identifier;\n                        if (previousValue === undefined) {\n                            previousValue = module.get.currentThumbValue();\n                        }\n                    },\n                    move: function (event) {\n                        if (event.type === 'mousemove') {\n                            event.preventDefault(); // prevent text selection etc.\n                        }\n                        if (module.is.disabled()) {\n                            // touch events are always bound, so we need to prevent touch-sliding on disabled sliders here\n                            return;\n                        }\n                        var value = module.determine.valueFromEvent(event);\n                        if (event.type === 'mousemove' && $currThumb === undefined) {\n                            var\n                                eventPos = module.determine.eventPos(event),\n                                newPos = module.determine.pos(eventPos)\n                            ;\n                            $currThumb = initialPosition > newPos ? $thumb : $secondThumb;\n                        }\n                        if (module.is.range() && (settings.minRange || settings.maxRange)) {\n                            var currentRangeDiff = module.get.currentRangeDiff(value),\n                                isSecondThumb = $currThumb.hasClass('second')\n                            ;\n                            if ((settings.minRange && currentRangeDiff < settings.minRange)\n                                || (settings.maxRange && currentRangeDiff > settings.maxRange)\n                                || (settings.preventCrossover && !isSecondThumb && value > module.secondThumbVal)\n                                || (settings.preventCrossover && isSecondThumb && value < module.thumbVal)\n                            ) {\n                                return;\n                            }\n                        }\n                        if (module.get.step() === 0 || module.is.smooth()) {\n                            var\n                                thumbVal = module.thumbVal,\n                                secondThumbVal = module.secondThumbVal,\n                                thumbSmoothVal = module.determine.smoothValueFromEvent(event)\n                            ;\n                            if (!$currThumb.hasClass('second')) {\n                                if (settings.preventCrossover && module.is.range()) {\n                                    value = Math.min(secondThumbVal, value);\n                                    thumbSmoothVal = Math.min(secondThumbVal, thumbSmoothVal);\n                                }\n                                thumbVal = value;\n                            } else {\n                                if (settings.preventCrossover && module.is.range()) {\n                                    value = Math.max(thumbVal, value);\n                                    thumbSmoothVal = Math.max(thumbVal, thumbSmoothVal);\n                                }\n                                secondThumbVal = value;\n                            }\n                            value = Math.abs(thumbVal - (secondThumbVal || 0));\n                            module.update.position(thumbSmoothVal);\n                            settings.onMove.call(element, value, thumbVal, secondThumbVal);\n                        } else {\n                            module.update.value(value, function (value, thumbVal, secondThumbVal) {\n                                settings.onMove.call(element, value, thumbVal, secondThumbVal);\n                            });\n                        }\n                    },\n                    up: function (event) {\n                        event.preventDefault();\n                        if (module.is.disabled()) {\n                            // touch events are always bound, so we need to prevent touch-sliding on disabled sliders here\n                            return;\n                        }\n                        var value = module.determine.valueFromEvent(event);\n                        if (module.is.range() && (settings.minRange || settings.maxRange)) {\n                            if ($currThumb === undefined) {\n                                $currThumb = value <= module.get.currentThumbValue() ? $thumb : $secondThumb;\n                            }\n                            var currentRangeDiff = module.get.currentRangeDiff(value);\n                            if (settings.minRange && currentRangeDiff < settings.minRange) {\n                                value = module.get.edgeValue(value, settings.minRange);\n                            } else if (settings.maxRange && currentRangeDiff > settings.maxRange) {\n                                value = module.get.edgeValue(value, settings.maxRange);\n                            }\n                        }\n                        module.set.value(value);\n                        module.unbind.slidingEvents();\n                        touchIdentifier = undefined;\n                        if (previousValue !== undefined) {\n                            previousValue = undefined;\n                        }\n                    },\n                    touchCancel: function (event) {\n                        event.preventDefault();\n                        touchIdentifier = undefined;\n                        if (previousValue !== undefined) {\n                            module.update.value(previousValue);\n                            previousValue = undefined;\n                        }\n                    },\n                    keydown: function (event, first) {\n                        if (module.is.disabled()) {\n                            return;\n                        }\n                        if (settings.preventCrossover && module.is.range() && module.thumbVal === module.secondThumbVal) {\n                            $currThumb = undefined;\n                        }\n                        if (module.is.focused()) {\n                            $document.trigger(event);\n                        }\n                        if (first || module.is.focused()) {\n                            var step = module.determine.keyMovement(event);\n                            if (step !== NO_STEP) {\n                                event.preventDefault();\n                                switch (step) {\n                                    case SINGLE_STEP: {\n                                        module.takeStep();\n\n                                        break;\n                                    }\n                                    case BIG_STEP: {\n                                        module.takeStep(module.get.multiplier());\n\n                                        break;\n                                    }\n                                    case SINGLE_BACKSTEP: {\n                                        module.backStep();\n\n                                        break;\n                                    }\n                                    case BIG_BACKSTEP: {\n                                        module.backStep(module.get.multiplier());\n\n                                        break;\n                                    }\n                                }\n                            }\n                        }\n                    },\n                    activateFocus: function (event) {\n                        if (!module.is.disabled() && !module.is.focused() && module.is.hover() && module.determine.keyMovement(event) !== NO_STEP) {\n                            event.preventDefault();\n                            module.event.keydown(event, true);\n                            $module.trigger('focus');\n                        }\n                    },\n                    resize: function (_event) {\n                        // To avoid a useless performance cost, we only call the label refresh when its necessary\n                        if (gapRatio !== module.get.gapRatio()) {\n                            module.resync();\n                            gapRatio = module.get.gapRatio();\n                        }\n                    },\n                },\n\n                clear: {\n                    cache: function () {\n                        module.cache = {};\n                    },\n                },\n\n                resync: function () {\n                    module.verbose('Resyncing thumb position based on value');\n                    module.setup.labels();\n                    if (module.is.range()) {\n                        module.update.position(module.secondThumbVal, $secondThumb);\n                    }\n                    module.update.position(module.thumbVal, $thumb);\n                },\n                takeStep: function (multiplier) {\n                    if (!multiplier) {\n                        multiplier = 1;\n                    }\n                    var\n                        step = module.get.step(),\n                        currValue = module.get.currentThumbValue()\n                    ;\n                    module.verbose('Taking a step');\n                    if (step > 0) {\n                        module.set.value(currValue + step * multiplier);\n                    } else if (step === 0) {\n                        var\n                            precision = module.get.precision(),\n                            newValue = currValue + (multiplier / precision)\n                        ;\n                        module.set.value(Math.round(newValue * precision) / precision);\n                    }\n                },\n\n                backStep: function (multiplier) {\n                    if (!multiplier) {\n                        multiplier = 1;\n                    }\n                    var\n                        step = module.get.step(),\n                        currValue = module.get.currentThumbValue()\n                    ;\n                    module.verbose('Going back a step');\n                    if (step > 0) {\n                        module.set.value(currValue - step * multiplier);\n                    } else if (step === 0) {\n                        var\n                            precision = module.get.precision(),\n                            newValue = currValue - (multiplier / precision)\n                        ;\n                        module.set.value(Math.round(newValue * precision) / precision);\n                    }\n                },\n\n                is: {\n                    prime: function (n) {\n                        if (module.cache['prime' + n] === undefined) {\n                            var p = true;\n                            for (var i = 2, s = Math.sqrt(n); i <= s; i++) {\n                                if (n % i === 0) {\n                                    p = false;\n\n                                    break;\n                                }\n                            }\n                            if (p) {\n                                p = n > 1;\n                            }\n\n                            module.cache['prime' + n] = p;\n                        }\n\n                        return module.cache['prime' + n];\n                    },\n                    range: function () {\n                        var isRange = $module.hasClass(className.range);\n                        if (!isRange && (settings.minRange || settings.maxRange)) {\n                            $module.addClass(className.range);\n                            isRange = true;\n                        }\n\n                        return isRange;\n                    },\n                    hover: function () {\n                        return isHover;\n                    },\n                    focused: function () {\n                        return $module.is(':focus');\n                    },\n                    disabled: function () {\n                        return $module.hasClass(className.disabled);\n                    },\n                    labeled: function () {\n                        var isLabeled = $module.hasClass(className.labeled);\n                        if (!isLabeled && (settings.restrictedLabels.length > 0 || settings.showLabelTicks !== false)) {\n                            $module.addClass(className.labeled);\n                            isLabeled = true;\n                        }\n\n                        return isLabeled;\n                    },\n                    reversed: function () {\n                        return $module.hasClass(className.reversed);\n                    },\n                    vertical: function () {\n                        return $module.hasClass(className.vertical);\n                    },\n                    smooth: function () {\n                        return settings.smooth || $module.hasClass(className.smooth);\n                    },\n                },\n\n                get: {\n                    currentRangeDiff: function (value) {\n                        var currentRangeDiff;\n                        if ($currThumb.hasClass('second')) {\n                            currentRangeDiff = module.thumbVal < value\n                                ? value - module.thumbVal\n                                : module.thumbVal - value;\n                        } else {\n                            currentRangeDiff = module.secondThumbVal > value\n                                ? module.secondThumbVal - value\n                                : value - module.secondThumbVal;\n                        }\n\n                        return currentRangeDiff;\n                    },\n                    edgeValue: function (value, edgeValue) {\n                        if ($currThumb.hasClass('second')) {\n                            value = module.thumbVal < value\n                                ? module.thumbVal + edgeValue\n                                : module.thumbVal - edgeValue;\n                        } else {\n                            value = module.secondThumbVal < value\n                                ? module.secondThumbVal + edgeValue\n                                : module.secondThumbVal - edgeValue;\n                        }\n\n                        return value;\n                    },\n                    trackOffset: function () {\n                        if (module.is.vertical()) {\n                            return $track.offset().top;\n                        }\n\n                        return $track.offset().left;\n                    },\n                    trackLength: function () {\n                        if (module.is.vertical()) {\n                            return $track.height();\n                        }\n\n                        return $track.width();\n                    },\n                    trackLeft: function () {\n                        if (module.is.vertical()) {\n                            return $track.position().top;\n                        }\n\n                        return $track.position().left;\n                    },\n                    trackStartPos: function () {\n                        return module.is.reversed() ? module.get.trackLeft() + module.get.trackLength() : module.get.trackLeft();\n                    },\n                    trackEndPos: function () {\n                        return module.is.reversed() ? module.get.trackLeft() : module.get.trackLeft() + module.get.trackLength();\n                    },\n                    trackStartMargin: function () {\n                        var margin;\n                        if (module.is.vertical()) {\n                            margin = module.is.reversed() ? $module.css('padding-bottom') : $module.css('padding-top');\n                        } else {\n                            margin = module.is.reversed() ? $module.css('padding-right') : $module.css('padding-left');\n                        }\n\n                        return margin || '0px';\n                    },\n                    trackEndMargin: function () {\n                        var margin;\n                        if (module.is.vertical()) {\n                            margin = module.is.reversed() ? $module.css('padding-top') : $module.css('padding-bottom');\n                        } else {\n                            margin = module.is.reversed() ? $module.css('padding-left') : $module.css('padding-right');\n                        }\n\n                        return margin || '0px';\n                    },\n                    precision: function () {\n                        if (module.cache.precision === undefined) {\n                            var\n                                decimalPlaces,\n                                step = module.get.step()\n                            ;\n                            if (step !== 0) {\n                                var split = String(step).split('.');\n                                decimalPlaces = split.length === 2 ? split[1].length : 0;\n                            } else {\n                                decimalPlaces = settings.decimalPlaces;\n                            }\n                            var precision = Math.pow(10, decimalPlaces);\n                            module.debug('Precision determined', precision);\n                            module.cache.precision = precision;\n                        }\n\n                        return module.cache.precision;\n                    },\n                    min: function () {\n                        return settings.min;\n                    },\n                    max: function () {\n                        if (module.cache.max === undefined) {\n                            var\n                                step = module.get.step(),\n                                min = module.get.min(),\n                                precision = module.get.precision(),\n                                quotient = step === 0 ? 0 : Math.floor(Math.round(((settings.max - min) / step) * precision) / precision),\n                                remainder = step === 0 ? 0 : (settings.max - min) % step\n                            ;\n                            if (remainder > 0) {\n                                module.debug('Max value not divisible by given step. Increasing max value.', settings.max, step);\n                            }\n                            module.cache.max = remainder === 0 ? settings.max : min + quotient * step;\n                        }\n\n                        return module.cache.max;\n                    },\n                    step: function () {\n                        return settings.step;\n                    },\n                    numLabels: function () {\n                        if (module.cache.numLabels === undefined) {\n                            var step = module.get.step(),\n                                precision = module.get.precision(),\n                                value = Math.round(((module.get.max() - module.get.min()) / (step === 0 ? 1 : step)) * precision) / precision;\n                            module.debug('Determined that there should be ' + value + ' labels');\n                            module.cache.numLabels = value;\n                        }\n\n                        return module.cache.numLabels;\n                    },\n                    labelType: function () {\n                        return settings.labelType;\n                    },\n                    label: function (value, stepValue) {\n                        if (isFunction(interpretLabel)) {\n                            return interpretLabel(value, stepValue, module);\n                        }\n\n                        switch (settings.labelType) {\n                            case settings.labelTypes.number: {\n                                return stepValue;\n                            }\n                            case settings.labelTypes.letter: {\n                                if (value < 0 || module.get.precision() > 1) {\n                                    module.error(error.invalidLetterNumber, value);\n\n                                    return value;\n                                }\n                                var letterLabel = '',\n                                    letters = Array.isArray(settings.letters) ? settings.letters : String(settings.letters).split(''),\n                                    lettersLen = letters.length\n                                ;\n\n                                while (stepValue >= 0) {\n                                    letterLabel = letters[stepValue % lettersLen] + letterLabel;\n                                    stepValue = Math.floor(stepValue / lettersLen) - 1;\n                                }\n\n                                return letterLabel;\n                            }\n                            default: {\n                                return value;\n                            }\n                        }\n                    },\n                    value: function () {\n                        return value;\n                    },\n                    settings: function () {\n                        return settings;\n                    },\n                    currentThumbValue: function () {\n                        return $currThumb !== undefined && $currThumb.hasClass('second') ? module.secondThumbVal : module.thumbVal;\n                    },\n                    thumbValue: function (which) {\n                        switch (which) {\n                            case 'second': {\n                                if (module.is.range()) {\n                                    return module.secondThumbVal;\n                                }\n\n                                module.error(error.notrange);\n\n                                break;\n                            }\n                            default: {\n                                return module.thumbVal;\n                            }\n                        }\n                    },\n                    multiplier: function () {\n                        return settings.pageMultiplier;\n                    },\n                    thumbPosition: function (which) {\n                        switch (which) {\n                            case 'second': {\n                                if (module.is.range()) {\n                                    return secondPos;\n                                }\n\n                                module.error(error.notrange);\n\n                                break;\n                            }\n                            default: {\n                                return position;\n                            }\n                        }\n                    },\n                    gapRatio: function () {\n                        var gapRatio = 1;\n\n                        if (settings.autoAdjustLabels) {\n                            var\n                                numLabels = module.get.numLabels(),\n                                primePlus = module.is.prime(numLabels) ? 1 : 0,\n                                trackLength = module.get.trackLength(),\n                                gapCounter = 1\n                            ;\n\n                            // While the distance between two labels is too short,\n                            // we divide the number of labels at each iteration\n                            // and apply only if the modulo of the operation is an odd number.\n                            if (trackLength > 0) {\n                                while ((trackLength / numLabels) * gapCounter < settings.labelDistance) {\n                                    if (!((numLabels + primePlus) % gapCounter) || settings.autoAdjustLabels === 'fixed') {\n                                        gapRatio = gapCounter;\n                                    }\n                                    gapCounter += 1;\n                                }\n                            }\n                        }\n\n                        return gapRatio;\n                    },\n                },\n\n                determine: {\n                    pos: function (pagePos) {\n                        return module.is.reversed()\n                            ? module.get.trackStartPos() - pagePos + module.get.trackOffset()\n                            : pagePos - module.get.trackOffset() - module.get.trackStartPos();\n                    },\n                    closestThumb: function (eventPos) {\n                        var\n                            thumbPos = parseFloat(module.determine.thumbPos($thumb)),\n                            thumbDelta = Math.abs(eventPos - thumbPos),\n                            secondThumbPos = parseFloat(module.determine.thumbPos($secondThumb)),\n                            secondThumbDelta = Math.abs(eventPos - secondThumbPos)\n                        ;\n                        if (thumbDelta === secondThumbDelta && module.get.thumbValue() === module.get.min()) {\n                            return $secondThumb;\n                        }\n\n                        return thumbDelta <= secondThumbDelta ? $thumb : $secondThumb;\n                    },\n                    closestThumbPos: function (eventPos) {\n                        var\n                            thumbPos = parseFloat(module.determine.thumbPos($thumb)),\n                            thumbDelta = Math.abs(eventPos - thumbPos),\n                            secondThumbPos = parseFloat(module.determine.thumbPos($secondThumb)),\n                            secondThumbDelta = Math.abs(eventPos - secondThumbPos)\n                        ;\n\n                        return thumbDelta <= secondThumbDelta ? thumbPos : secondThumbPos;\n                    },\n                    thumbPos: function ($element) {\n                        return module.is.vertical()\n                            ? (module.is.reversed() ? $element.css('bottom') : $element.css('top'))\n                            : (module.is.reversed() ? $element.css('right') : $element.css('left'))\n                        ;\n                    },\n                    positionFromValue: function (val) {\n                        var\n                            min = module.get.min(),\n                            max = module.get.max(),\n                            value = val > max\n                                ? max\n                                : (val < min ? min : val),\n                            trackLength = module.get.trackLength(),\n                            ratio = (value - min) / (max - min),\n                            position = Math.round(ratio * trackLength)\n                        ;\n                        module.verbose('Determined position: ' + position + ' from value: ' + value);\n\n                        return position;\n                    },\n                    positionFromRatio: function (ratio) {\n                        var\n                            trackLength = module.get.trackLength(),\n                            step = module.get.step(),\n                            position = Math.round(ratio * trackLength),\n                            adjustedPos = step === 0 ? position : Math.round(position / step) * step\n                        ;\n                        module.verbose('Determined position: ' + position + ' from ratio: ' + ratio);\n\n                        return adjustedPos;\n                    },\n                    valueFromEvent: function (event) {\n                        var\n                            eventPos = module.determine.eventPos(event),\n                            newPos = module.determine.pos(eventPos),\n                            value\n                        ;\n                        if (eventPos < module.get.trackOffset()) {\n                            value = module.is.reversed() ? module.get.max() : module.get.min();\n                        } else if (eventPos > module.get.trackOffset() + module.get.trackLength()) {\n                            value = module.is.reversed() ? module.get.min() : module.get.max();\n                        } else {\n                            value = module.determine.value(newPos);\n                        }\n\n                        return value;\n                    },\n                    smoothValueFromEvent: function (event) {\n                        var\n                            min = module.get.min(),\n                            max = module.get.max(),\n                            trackLength = module.get.trackLength(),\n                            eventPos = module.determine.eventPos(event),\n                            newPos = eventPos - module.get.trackOffset(),\n                            ratio,\n                            value\n                        ;\n                        newPos = newPos < 0\n                            ? 0\n                            : (newPos > trackLength ? trackLength : newPos);\n                        ratio = newPos / trackLength;\n                        if (module.is.reversed()) {\n                            ratio = 1 - ratio;\n                        }\n                        value = ratio * (max - min) + min;\n\n                        return value;\n                    },\n                    eventPos: function (event) {\n                        if (event.type === 'touchmove' || event.type === 'touchend') {\n                            var\n                                touchEvent = event.touches ? event : event.originalEvent,\n                                touch = touchEvent.changedTouches[0]; // fall back to first touch if correct touch not found\n                            for (var i = 0; i < touchEvent.touches.length; i++) {\n                                if (touchEvent.touches[i].identifier === touchIdentifier) {\n                                    touch = touchEvent.touches[i];\n\n                                    break;\n                                }\n                            }\n                            var\n                                touchY = touch.pageY,\n                                touchX = touch.pageX\n                            ;\n\n                            return module.is.vertical() ? touchY : touchX;\n                        }\n                        var\n                            clickY = event.pageY || event.originalEvent.pageY,\n                            clickX = event.pageX || event.originalEvent.pageX\n                        ;\n\n                        return module.is.vertical() ? clickY : clickX;\n                    },\n                    value: function (position) {\n                        var\n                            precision = module.get.precision(),\n                            startPos = module.is.reversed() ? module.get.trackEndPos() : module.get.trackStartPos(),\n                            endPos = module.is.reversed() ? module.get.trackStartPos() : module.get.trackEndPos(),\n                            ratio = (position - startPos) / (endPos - startPos),\n                            range = module.get.max() - module.get.min(),\n                            step = module.get.step(),\n                            value = ratio * range,\n                            difference = step === 0 ? value : Math.round(value / step) * step\n                        ;\n                        module.verbose('Determined value based upon position: ' + position + ' as: ' + value);\n                        if (value !== difference) {\n                            module.verbose('Rounding value to closest step: ' + difference);\n                        }\n                        // Use precision to avoid ugly Javascript floating point rounding issues\n                        // (like 35 * .01 = 0.35000000000000003)\n                        module.verbose('Cutting off additional decimal places');\n\n                        return Math.round((difference + module.get.min()) * precision) / precision;\n                    },\n                    keyMovement: function (event) {\n                        var\n                            key = event.which,\n                            downArrow = module.is.vertical()\n                                ? (module.is.reversed() ? keys.downArrow : keys.upArrow)\n                                : keys.downArrow,\n                            upArrow = module.is.vertical()\n                                ? (module.is.reversed() ? keys.upArrow : keys.downArrow)\n                                : keys.upArrow,\n                            leftArrow = !module.is.vertical()\n                                ? (module.is.reversed() ? keys.rightArrow : keys.leftArrow)\n                                : keys.leftArrow,\n                            rightArrow = !module.is.vertical()\n                                ? (module.is.reversed() ? keys.leftArrow : keys.rightArrow)\n                                : keys.rightArrow\n                        ;\n                        if (key === downArrow || key === leftArrow) {\n                            return SINGLE_BACKSTEP;\n                        }\n                        if (key === upArrow || key === rightArrow) {\n                            return SINGLE_STEP;\n                        }\n                        if (key === keys.pageDown) {\n                            return BIG_BACKSTEP;\n                        }\n                        if (key === keys.pageUp) {\n                            return BIG_STEP;\n                        }\n\n                        return NO_STEP;\n                    },\n                },\n\n                handleNewValuePosition: function (val) {\n                    var\n                        min = module.get.min(),\n                        max = module.get.max(),\n                        newPos\n                    ;\n                    if (val <= min) {\n                        val = min;\n                    } else if (val >= max) {\n                        val = max;\n                    }\n                    newPos = module.determine.positionFromValue(val);\n\n                    return newPos;\n                },\n\n                set: {\n                    active: function (thumbVal, secondThumbVal) {\n                        if (settings.highlightRange) {\n                            if (secondThumbVal < thumbVal) {\n                                var tempVal = secondThumbVal;\n                                secondThumbVal = thumbVal;\n                                thumbVal = tempVal;\n                            }\n                            var $children = $labels.find('.label');\n                            $children.each(function (index) {\n                                var\n                                    $child = $(this),\n                                    attrValue = $child.attr('data-value')\n                                ;\n                                if (attrValue) {\n                                    attrValue = parseInt(attrValue, 10);\n                                    if (attrValue >= thumbVal && attrValue <= secondThumbVal) {\n                                        $child.addClass(className.active);\n                                    } else {\n                                        $child.removeClass(className.active);\n                                    }\n                                }\n                            });\n                        }\n                    },\n                    value: function (newValue, fireChange) {\n                        fireChange = fireChange !== false;\n                        var toReset = previousValue === undefined;\n                        previousValue = previousValue === undefined ? module.get.value() : previousValue;\n                        module.update.value(newValue, function (value, thumbVal, secondThumbVal) {\n                            if ((!initialLoad || settings.fireOnInit) && fireChange) {\n                                if (newValue !== previousValue) {\n                                    settings.onChange.call(element, value, thumbVal, secondThumbVal);\n                                }\n                                settings.onMove.call(element, value, thumbVal, secondThumbVal);\n                            }\n                            if (toReset) {\n                                previousValue = undefined;\n                            }\n                        });\n                    },\n                    rangeValue: function (first, second, fireChange) {\n                        fireChange = fireChange !== false;\n                        if (module.is.range()) {\n                            var\n                                min = module.get.min(),\n                                max = module.get.max(),\n                                toReset = previousValue === undefined\n                            ;\n                            previousValue = previousValue === undefined ? module.get.value() : previousValue;\n                            if (first <= min) {\n                                first = min;\n                            } else if (first >= max) {\n                                first = max;\n                            }\n                            if (second <= min) {\n                                second = min;\n                            } else if (second >= max) {\n                                second = max;\n                            }\n                            module.thumbVal = first;\n                            module.secondThumbVal = second;\n                            value = Math.abs(module.thumbVal - module.secondThumbVal);\n                            module.update.position(module.thumbVal, $thumb);\n                            module.update.position(module.secondThumbVal, $secondThumb);\n                            if ((!initialLoad || settings.fireOnInit) && fireChange) {\n                                if (value !== previousValue) {\n                                    settings.onChange.call(element, value, module.thumbVal, module.secondThumbVal);\n                                }\n                                settings.onMove.call(element, value, module.thumbVal, module.secondThumbVal);\n                            }\n                            if (toReset) {\n                                previousValue = undefined;\n                            }\n                        } else {\n                            module.error(error.notrange);\n                        }\n                    },\n                    position: function (position, which) {\n                        var thumbVal = module.determine.value(position);\n                        if (which === 'second') {\n                            module.secondThumbVal = thumbVal;\n                            module.update.position(thumbVal, $secondThumb);\n                        } else {\n                            module.thumbVal = thumbVal;\n                            module.update.position(thumbVal, $thumb);\n                        }\n                        value = Math.abs(module.thumbVal - (module.secondThumbVal || 0));\n                        module.set.value(value);\n                    },\n                },\n\n                update: {\n                    value: function (newValue, callback) {\n                        var\n                            min = module.get.min(),\n                            max = module.get.max()\n                        ;\n                        if (newValue <= min) {\n                            newValue = min;\n                        } else if (newValue >= max) {\n                            newValue = max;\n                        }\n                        if (!module.is.range()) {\n                            value = newValue;\n                            module.thumbVal = value;\n                        } else {\n                            if ($currThumb === undefined) {\n                                $currThumb = newValue <= module.get.currentThumbValue() ? $thumb : $secondThumb;\n                            }\n                            if (!$currThumb.hasClass('second')) {\n                                if (settings.preventCrossover && module.is.range()) {\n                                    newValue = Math.min(module.secondThumbVal - (settings.minRange || 0), newValue);\n                                }\n                                module.thumbVal = newValue;\n                            } else {\n                                if (settings.preventCrossover && module.is.range()) {\n                                    newValue = Math.max(module.thumbVal + (settings.minRange || 0), newValue);\n                                }\n                                module.secondThumbVal = newValue;\n                            }\n                            value = Math.abs(module.thumbVal - module.secondThumbVal);\n                        }\n                        module.update.position(newValue);\n                        module.debug('Setting slider value to ' + value);\n                        if (typeof callback === 'function') {\n                            callback(value, module.thumbVal, module.secondThumbVal);\n                        }\n                    },\n                    position: function (newValue, $element) {\n                        var\n                            newPos = module.handleNewValuePosition(newValue),\n                            $targetThumb = $element || $currThumb,\n                            thumbVal = module.thumbVal || module.get.min(),\n                            secondThumbVal = module.secondThumbVal || module.get.min()\n                        ;\n                        if (settings.showThumbTooltip) {\n                            var precision = module.get.precision();\n                            $targetThumb.attr('data-tooltip', Math.round(newValue * precision) / precision);\n                        }\n                        if (module.is.range()) {\n                            if (!$targetThumb.hasClass('second')) {\n                                position = newPos;\n                                thumbVal = newValue;\n                            } else {\n                                secondPos = newPos;\n                                secondThumbVal = newValue;\n                            }\n                        } else {\n                            position = newPos;\n                            thumbVal = newValue;\n                        }\n                        module.set.active(thumbVal, secondThumbVal);\n                        var\n                            trackPosValue,\n                            thumbPosValue,\n                            min = module.get.min(),\n                            max = module.get.max(),\n                            thumbPosPercent = 100 * ((newValue - min) / (max - min)),\n                            trackStartPosPercent = 100 * ((Math.min(thumbVal, secondThumbVal) - min) / (max - min)),\n                            trackEndPosPercent = 100 * (1 - (Math.max(thumbVal, secondThumbVal) - min) / (max - min))\n                        ;\n                        if (module.is.vertical()) {\n                            if (module.is.reversed()) {\n                                thumbPosValue = { bottom: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', top: 'auto' };\n                                trackPosValue = { bottom: trackStartPosPercent + '%', top: trackEndPosPercent + '%' };\n                            } else {\n                                thumbPosValue = { top: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', bottom: 'auto' };\n                                trackPosValue = { top: trackStartPosPercent + '%', bottom: trackEndPosPercent + '%' };\n                            }\n                        } else {\n                            if (module.is.reversed()) {\n                                thumbPosValue = { right: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', left: 'auto' };\n                                trackPosValue = { right: trackStartPosPercent + '%', left: trackEndPosPercent + '%' };\n                            } else {\n                                thumbPosValue = { left: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', right: 'auto' };\n                                trackPosValue = { left: trackStartPosPercent + '%', right: trackEndPosPercent + '%' };\n                            }\n                        }\n                        $targetThumb.css(thumbPosValue);\n                        $trackFill.css(trackPosValue);\n                        module.debug('Setting slider position to ' + newPos);\n                    },\n                    labelPosition: function (ratio, $label) {\n                        var\n                            startMargin = module.get.trackStartMargin(),\n                            endMargin   = module.get.trackEndMargin(),\n                            posDir = module.is.vertical()\n                                ? (module.is.reversed() ? 'bottom' : 'top')\n                                : (module.is.reversed() ? 'right' : 'left'),\n                            startMarginMod = module.is.reversed() && !module.is.vertical()\n                                ? ' - '\n                                : ' + '\n                        ;\n                        var position = '(100% - ' + startMargin + ' - ' + endMargin + ') * ' + ratio;\n                        $label.css(posDir, 'calc(' + position + startMarginMod + startMargin + ')');\n                    },\n                },\n\n                goto: {\n                    max: function () {\n                        module.set.value(module.get.max());\n                    },\n                    min: function () {\n                        module.set.value(module.get.min());\n                    },\n                },\n\n                read: {\n                    metadata: function () {\n                        var\n                            data = {\n                                thumbVal: $module.data(metadata.thumbVal),\n                                secondThumbVal: $module.data(metadata.secondThumbVal),\n                            }\n                        ;\n                        if (data.thumbVal) {\n                            if (module.is.range() && data.secondThumbVal) {\n                                module.debug('Current value set from metadata', data.thumbVal, data.secondThumbVal);\n                                module.set.rangeValue(data.thumbVal, data.secondThumbVal);\n                            } else {\n                                module.debug('Current value set from metadata', data.thumbVal);\n                                module.set.value(data.thumbVal);\n                            }\n                        }\n                    },\n                    settings: function () {\n                        if (settings.start !== false) {\n                            if (module.is.range()) {\n                                var rangeDiff = settings.end - settings.start;\n                                if (rangeDiff < 0\n                                    || (settings.minRange && rangeDiff < settings.minRange)\n                                    || (settings.maxRange && rangeDiff > settings.maxRange)\n                                    || (settings.minRange && settings.maxRange && settings.minRange > settings.maxRange)\n                                ) {\n                                    module.error(error.invalidRanges, settings.start, settings.end, settings.minRange, settings.maxRange);\n                                }\n                                module.debug('Start position set from settings', settings.start, settings.end);\n                                module.set.rangeValue(settings.start, settings.end);\n                            } else {\n                                module.debug('Start position set from settings', settings.start);\n                                module.set.value(settings.start);\n                            }\n                        }\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                    module.clear.cache();\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.slider.settings = {\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        name: 'Slider',\n        namespace: 'slider',\n\n        error: {\n            method: 'The method you called is not defined.',\n            notrange: 'This slider is not a range slider',\n            invalidRanges: 'Invalid range settings (start/end/minRange/maxRange)',\n            invalidLetterNumber: 'Negative values or decimal places for labelType: \"letter\" are not supported',\n        },\n\n        metadata: {\n            thumbVal: 'thumbVal',\n            secondThumbVal: 'secondThumbVal',\n        },\n\n        min: 0,\n        max: 20,\n        step: 1,\n        start: 0,\n        end: 20,\n        minRange: false,\n        maxRange: false,\n        labelType: 'number',\n        showLabelTicks: false,\n        smooth: false,\n        autoAdjustLabels: true,\n        labelDistance: 100,\n        preventCrossover: true,\n        fireOnInit: false,\n        interpretLabel: false,\n        letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\n        // the decimal place to round to if step is undefined\n        decimalPlaces: 2,\n\n        // page up/down multiplier. How many more times the steps to take on page up/down press\n        pageMultiplier: 2,\n\n        selector: {},\n\n        className: {\n            reversed: 'reversed',\n            disabled: 'disabled',\n            labeled: 'labeled',\n            ticked: 'ticked',\n            vertical: 'vertical',\n            range: 'range',\n            smooth: 'smooth',\n            label: 'label',\n            active: 'active',\n        },\n\n        keys: {\n            pageUp: 33,\n            pageDown: 34,\n            leftArrow: 37,\n            upArrow: 38,\n            rightArrow: 39,\n            downArrow: 40,\n        },\n\n        restrictedLabels: [],\n        highlightRange: false,\n        showThumbTooltip: false,\n        tooltipConfig: {\n            position: 'top center',\n            variation: 'tiny black',\n        },\n\n        labelTypes: {\n            number: 'number',\n            letter: 'letter',\n        },\n\n        onChange: function (value, thumbVal, secondThumbVal) {},\n        onMove: function (value, thumbVal, secondThumbVal) {},\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/state.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - State\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.state = function (parameters) {\n        var\n            $allModules     = $(this),\n\n            time            = Date.now(),\n            performance     = [],\n\n            query           = arguments[0],\n            methodInvoked   = typeof query === 'string',\n            queryArguments  = [].slice.call(arguments, 1),\n            contextCheck    = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $(context);\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : window;\n                    }\n                }\n\n                return $context;\n            },\n            returnedValue\n        ;\n        $allModules.each(function () {\n            var\n                settings          = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.state.settings, parameters)\n                    : $.extend({}, $.fn.state.settings),\n\n                error           = settings.error,\n                metadata        = settings.metadata,\n                className       = settings.className,\n                namespace       = settings.namespace,\n                states          = settings.states,\n                text            = settings.text,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = namespace + '-module',\n\n                $module         = $(this),\n                $context        = settings.context ? contextCheck(settings.context, window) : $module,\n\n                element         = this,\n                instance        = $module.data(moduleNamespace),\n\n                module\n            ;\n            module = {\n\n                initialize: function () {\n                    module.verbose('Initializing module');\n\n                    // allow module to guess desired state based on element\n                    if (settings.automatic) {\n                        module.add.defaults();\n                    }\n\n                    // bind events with delegated events\n                    $context\n                        .on('mouseenter' + eventNamespace, module.change.text)\n                        .on('mouseleave' + eventNamespace, module.reset.text)\n                        .on('click' + eventNamespace, module.toggle.state)\n                    ;\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous module', instance);\n                    $context\n                        .off(eventNamespace)\n                    ;\n                    $module\n                        .removeData(metadata.storedText)\n                        .removeData(moduleNamespace)\n                    ;\n                },\n\n                refresh: function () {\n                    module.verbose('Refreshing selector cache');\n                    $module = $(element);\n                },\n\n                add: {\n                    defaults: function () {\n                        var\n                            userStates = parameters && $.isPlainObject(parameters.states)\n                                ? parameters.states\n                                : {}\n                        ;\n                        $.each(settings.defaults, function (type, typeStates) {\n                            if (module.is[type] !== undefined && module.is[type]()) {\n                                module.verbose('Adding default states', type, element);\n                                $.extend(settings.states, typeStates, userStates);\n                            }\n                        });\n                    },\n                },\n\n                is: {\n\n                    active: function () {\n                        return $module.hasClass(className.active);\n                    },\n                    loading: function () {\n                        return $module.hasClass(className.loading);\n                    },\n                    inactive: function () {\n                        return !$module.hasClass(className.active);\n                    },\n                    state: function (state) {\n                        if (className[state] === undefined) {\n                            return false;\n                        }\n\n                        return $module.hasClass(className[state]);\n                    },\n\n                    enabled: function () {\n                        return !$module.is(settings.filter.active);\n                    },\n                    disabled: function () {\n                        return $module.is(settings.filter.active);\n                    },\n                    textEnabled: function () {\n                        return !$module.is(settings.filter.text);\n                    },\n\n                    // definitions for automatic type detection\n                    button: function () {\n                        return $module.is('.button:not(a, .submit)');\n                    },\n                    input: function () {\n                        return $module.is('input');\n                    },\n                    progress: function () {\n                        return $module.is('.ui.progress');\n                    },\n                },\n\n                allow: function (state) {\n                    module.debug('Now allowing state', state);\n                    states[state] = true;\n                },\n                disallow: function (state) {\n                    module.debug('No longer allowing', state);\n                    states[state] = false;\n                },\n\n                allows: function (state) {\n                    return states[state] || false;\n                },\n\n                enable: function () {\n                    $module.removeClass(className.disabled);\n                },\n\n                disable: function () {\n                    $module.addClass(className.disabled);\n                },\n\n                setState: function (state) {\n                    if (module.allows(state)) {\n                        $module.addClass(className[state]);\n                    }\n                },\n\n                removeState: function (state) {\n                    if (module.allows(state)) {\n                        $module.removeClass(className[state]);\n                    }\n                },\n\n                toggle: {\n                    state: function () {\n                        var\n                            apiRequest,\n                            requestCancelled\n                        ;\n                        if (module.allows('active') && module.is.enabled()) {\n                            module.refresh();\n                            if ($.fn.api !== undefined) {\n                                apiRequest = $module.api('get request');\n                                requestCancelled = $module.api('was cancelled');\n                                if (requestCancelled) {\n                                    module.debug('API Request cancelled by beforesend');\n                                    settings.activateTest = function () {\n                                        return false;\n                                    };\n                                    settings.deactivateTest = function () {\n                                        return false;\n                                    };\n                                } else if (apiRequest) {\n                                    module.listenTo(apiRequest);\n\n                                    return;\n                                }\n                            }\n                            module.change.state();\n                        }\n                    },\n                },\n\n                listenTo: function (apiRequest) {\n                    module.debug('API request detected, waiting for state signal', apiRequest);\n                    if (apiRequest) {\n                        if (text.loading) {\n                            module.update.text(text.loading);\n                        }\n                        $.when(apiRequest)\n                            .then(function () {\n                                if (apiRequest.state() === 'resolved') {\n                                    module.debug('API request succeeded');\n                                    settings.activateTest = function () {\n                                        return true;\n                                    };\n                                    settings.deactivateTest = function () {\n                                        return true;\n                                    };\n                                } else {\n                                    module.debug('API request failed');\n                                    settings.activateTest = function () {\n                                        return false;\n                                    };\n                                    settings.deactivateTest = function () {\n                                        return false;\n                                    };\n                                }\n                                module.change.state();\n                            })\n                        ;\n                    }\n                },\n\n                // checks whether active/inactive state can be given\n                change: {\n\n                    state: function () {\n                        module.debug('Determining state change direction');\n                        // inactive to active change\n                        if (module.is.inactive()) {\n                            module.activate();\n                        } else {\n                            module.deactivate();\n                        }\n                        if (settings.sync) {\n                            module.sync();\n                        }\n                        settings.onChange.call(element);\n                    },\n\n                    text: function () {\n                        if (module.is.textEnabled()) {\n                            if (module.is.disabled()) {\n                                module.verbose('Changing text to disabled text', text.hover);\n                                module.update.text(text.disabled);\n                            } else if (module.is.active()) {\n                                if (text.hover) {\n                                    module.verbose('Changing text to hover text', text.hover);\n                                    module.update.text(text.hover);\n                                } else if (text.deactivate) {\n                                    module.verbose('Changing text to deactivating text', text.deactivate);\n                                    module.update.text(text.deactivate);\n                                }\n                            } else {\n                                if (text.hover) {\n                                    module.verbose('Changing text to hover text', text.hover);\n                                    module.update.text(text.hover);\n                                } else if (text.activate) {\n                                    module.verbose('Changing text to activating text', text.activate);\n                                    module.update.text(text.activate);\n                                }\n                            }\n                        }\n                    },\n\n                },\n\n                activate: function () {\n                    if (settings.activateTest.call(element)) {\n                        module.debug('Setting state to active');\n                        $module\n                            .addClass(className.active)\n                        ;\n                        module.update.text(text.active);\n                        settings.onActivate.call(element);\n                    }\n                },\n\n                deactivate: function () {\n                    if (settings.deactivateTest.call(element)) {\n                        module.debug('Setting state to inactive');\n                        $module\n                            .removeClass(className.active)\n                        ;\n                        module.update.text(text.inactive);\n                        settings.onDeactivate.call(element);\n                    }\n                },\n\n                sync: function () {\n                    module.verbose('Syncing other buttons to current state');\n                    if (module.is.active()) {\n                        $allModules\n                            .not($module)\n                            .state('activate')\n                        ;\n                    } else {\n                        $allModules\n                            .not($module)\n                            .state('deactivate')\n                        ;\n                    }\n                },\n\n                get: {\n                    text: function () {\n                        return settings.selector.text\n                            ? $module.find(settings.selector.text).text()\n                            : $module.html();\n                    },\n                    textFor: function (state) {\n                        return text[state] || false;\n                    },\n                },\n\n                flash: {\n                    text: function (text, duration, callback) {\n                        var\n                            previousText = module.get.text();\n                        module.debug('Flashing text message', text, duration);\n                        text = text || settings.text.flash;\n                        duration = duration || settings.flashDuration;\n                        callback = callback || function () {};\n                        module.update.text(text);\n                        setTimeout(function () {\n                            module.update.text(previousText);\n                            callback.call(element);\n                        }, duration);\n                    },\n                },\n\n                reset: {\n                    // on mouseout sets text to previous value\n                    text: function () {\n                        var\n                            activeText   = text.active || $module.data(metadata.storedText),\n                            inactiveText = text.inactive || $module.data(metadata.storedText)\n                        ;\n                        if (module.is.textEnabled()) {\n                            if (module.is.active() && activeText) {\n                                module.verbose('Resetting active text', activeText);\n                                module.update.text(activeText);\n                            } else if (inactiveText) {\n                                module.verbose('Resetting inactive text', activeText);\n                                module.update.text(inactiveText);\n                            }\n                        }\n                    },\n                },\n\n                update: {\n                    text: function (text) {\n                        var\n                            currentText = module.get.text();\n                        if (text && text !== currentText) {\n                            module.debug('Updating text', text);\n                            if (settings.selector.text) {\n                                $module\n                                    .data(metadata.storedText, text)\n                                    .find(settings.selector.text)\n                                    .text(text)\n                                ;\n                            } else {\n                                $module\n                                    .data(metadata.storedText, text)\n                                    .html(text)\n                                ;\n                            }\n                        } else {\n                            module.debug('Text is already set, ignoring update', text);\n                        }\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.state.settings = {\n\n        // module info\n        name: 'State',\n\n        // debug output\n        debug: false,\n\n        // verbose debug output\n        verbose: false,\n\n        // namespace for events\n        namespace: 'state',\n\n        // debug data includes performance\n        performance: true,\n\n        // callback occurs on state change\n        onActivate: function () {},\n        onDeactivate: function () {},\n        onChange: function () {},\n\n        // state test functions\n        activateTest: function () {\n            return true;\n        },\n        deactivateTest: function () {\n            return true;\n        },\n\n        // whether to automatically map default states\n        automatic: true,\n\n        // activate / deactivate changes all elements instantiated at same time\n        sync: false,\n\n        // default flash text duration, used for temporarily changing text of an element\n        flashDuration: 1000,\n\n        // selector filter\n        filter: {\n            text: '.loading, .disabled',\n            active: '.disabled',\n        },\n\n        context: false,\n\n        // error\n        error: {\n            method: 'The method you called is not defined.',\n        },\n\n        // metadata\n        metadata: {\n            promise: 'promise',\n            storedText: 'stored-text',\n        },\n\n        // change class on state\n        className: {\n            active: 'active',\n            disabled: 'disabled',\n            error: 'error',\n            loading: 'loading',\n            success: 'success',\n            warning: 'warning',\n        },\n\n        selector: {\n            // selector for text node\n            text: false,\n        },\n\n        defaults: {\n            input: {\n                disabled: true,\n                loading: true,\n                active: true,\n            },\n            button: {\n                disabled: true,\n                loading: true,\n                active: true,\n            },\n            progress: {\n                active: true,\n                success: true,\n                warning: true,\n                error: true,\n            },\n        },\n\n        states: {\n            active: true,\n            disabled: true,\n            error: true,\n            loading: true,\n            success: true,\n            warning: true,\n        },\n\n        text: {\n            disabled: false,\n            flash: false,\n            hover: false,\n            active: false,\n            inactive: false,\n            activate: false,\n            deactivate: false,\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/statistic.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Statistic\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n           Statistic\n*******************************/\n\n\n/* Standalone */\n.ui.statistic {\n  display: inline-flex;\n  flex-direction: column;\n  margin: 1em 0;\n  max-width: none;\n}\n.ui.statistic + .ui.statistic {\n  margin: 0 0 0 1.5em;\n}\n.ui.statistic:first-child {\n  margin-top: 0;\n}\n.ui.statistic:last-child {\n  margin-bottom: 0;\n}\n\n\n/*******************************\n            Group\n*******************************/\n\n\n/* Grouped */\n.ui.statistics {\n  display: flex;\n  align-items: flex-start;\n  flex-wrap: wrap;\n}\n.ui.statistics > .statistic {\n  display: inline-flex;\n  flex: 0 1 auto;\n  flex-direction: column;\n  margin: 0 1.5em 1em;\n  max-width: none;\n}\n.ui.statistics {\n  display: flex;\n  margin: 1em -1.5em -1em;\n}\n\n/* Clearing */\n.ui.statistics::after {\n  display: block;\n  content: \" \";\n  height: 0;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n.ui.statistics:first-child {\n  margin-top: 0;\n}\n\n\n/*******************************\n            Content\n*******************************/\n\n\n/* --------------\n      Value\n--------------- */\n.ui.statistics .statistic > .value,\n.ui.statistic > .value {\n  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\";\n  font-size: 4rem;\n  font-weight: normal;\n  line-height: 1em;\n  color: #1b1c1d;\n  text-transform: uppercase;\n  text-align: center;\n}\n\n/* --------------\n     Label\n--------------- */\n.ui.statistics .statistic > .label,\n.ui.statistic > .label {\n  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\";\n  font-size: 1em;\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.87);\n  text-transform: uppercase;\n  text-align: center;\n}\n\n/* Top Label */\n.ui.statistics .statistic > .label ~ .value,\n.ui.statistic > .label ~ .value {\n  margin-top: 0;\n}\n\n/* Bottom Label */\n.ui.statistics .statistic > .value ~ .label,\n.ui.statistic > .value ~ .label {\n  margin-top: 0;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/* --------------\n   Icon Value\n--------------- */\n.ui.statistics .statistic > .value > i.icon,\n.ui.statistic > .value > i.icon {\n  opacity: 1;\n  width: auto;\n  margin: 0;\n}\n\n/* --------------\n   Text Value\n--------------- */\n.ui.statistics .statistic > .text.value,\n.ui.statistic > .text.value {\n  line-height: 1em;\n  min-height: 2em;\n  font-weight: bold;\n  text-align: center;\n}\n.ui.statistics .statistic > .text.value + .label,\n.ui.statistic > .text.value + .label {\n  text-align: center;\n}\n\n/* --------------\n   Image Value\n--------------- */\n.ui.statistics .statistic > .value img,\n.ui.statistic > .value img {\n  max-height: 3rem;\n  vertical-align: baseline;\n}\n\n\n/*******************************\n            Variations\n*******************************/\n\n\n/* --------------\n      Count\n--------------- */\n.ui.ten.statistics {\n  margin: 0 0 -1em;\n}\n.ui.ten.statistics .statistic {\n  min-width: 10%;\n  margin: 0 0 1em;\n}\n.ui.nine.statistics {\n  margin: 0 0 -1em;\n}\n.ui.nine.statistics .statistic {\n  min-width: 11.11111111%;\n  margin: 0 0 1em;\n}\n.ui.eight.statistics {\n  margin: 0 0 -1em;\n}\n.ui.eight.statistics .statistic {\n  min-width: 12.5%;\n  margin: 0 0 1em;\n}\n.ui.seven.statistics {\n  margin: 0 0 -1em;\n}\n.ui.seven.statistics .statistic {\n  min-width: 14.28571429%;\n  margin: 0 0 1em;\n}\n.ui.six.statistics {\n  margin: 0 0 -1em;\n}\n.ui.six.statistics .statistic {\n  min-width: 16.66666667%;\n  margin: 0 0 1em;\n}\n.ui.five.statistics {\n  margin: 0 0 -1em;\n}\n.ui.five.statistics .statistic {\n  min-width: 20%;\n  margin: 0 0 1em;\n}\n.ui.four.statistics {\n  margin: 0 0 -1em;\n}\n.ui.four.statistics .statistic {\n  min-width: 25%;\n  margin: 0 0 1em;\n}\n.ui.three.statistics {\n  margin: 0 0 -1em;\n}\n.ui.three.statistics .statistic {\n  min-width: 33.33333333%;\n  margin: 0 0 1em;\n}\n.ui.two.statistics {\n  margin: 0 0 -1em;\n}\n.ui.two.statistics .statistic {\n  min-width: 50%;\n  margin: 0 0 1em;\n}\n.ui.one.statistics {\n  margin: 0 0 -1em;\n}\n.ui.one.statistics .statistic {\n  min-width: 100%;\n  margin: 0 0 1em;\n}\n.ui.fluid.statistic {\n  width: 100%;\n}\n\n/* --------------\n       Horizontal\n    --------------- */\n.ui.horizontal.statistic {\n  flex-direction: row;\n  align-items: center;\n}\n.ui.horizontal.statistics {\n  flex-direction: column;\n  margin: 0;\n  max-width: none;\n}\n.ui.horizontal.statistics .statistic {\n  flex-direction: row;\n  align-items: center;\n  max-width: none;\n  margin: 1em 0;\n}\n.ui.horizontal.statistic > .text.value,\n.ui.horizontal.statistics > .statistic > .text.value {\n  min-height: 0 !important;\n}\n.ui.horizontal.statistics .statistic > .value > i.icon,\n.ui.horizontal.statistic > .value > i.icon {\n  width: 1.18em;\n}\n.ui.horizontal.statistics .statistic > .value,\n.ui.horizontal.statistic > .value {\n  display: inline-block;\n  vertical-align: middle;\n}\n.ui.horizontal.statistics .statistic > .label,\n.ui.horizontal.statistic > .label {\n  display: inline-block;\n  vertical-align: middle;\n  margin: 0 0 0 0.75em;\n}\n\n/* --------------\n        Inverted\n    --------------- */\n.ui.inverted.statistics .statistic > .value,\n.ui.inverted.statistic .value {\n  color: #fff;\n}\n.ui.inverted.statistics .statistic > .label,\n.ui.inverted.statistic .label {\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* --------------\n     Colors\n--------------- */\n.ui.primary.statistics .statistic > .value,\n.ui.statistics .primary.statistic > .value,\n.ui.primary.statistic > .value {\n  color: #2185d0;\n}\n.ui.inverted.primary.statistics .statistic > .value,\n.ui.statistics .inverted.primary.statistic > .value,\n.ui.inverted.primary.statistic > .value {\n  color: #54c8ff;\n}\n.ui.secondary.statistics .statistic > .value,\n.ui.statistics .secondary.statistic > .value,\n.ui.secondary.statistic > .value {\n  color: #1b1c1d;\n}\n.ui.inverted.secondary.statistics .statistic > .value,\n.ui.statistics .inverted.secondary.statistic > .value,\n.ui.inverted.secondary.statistic > .value {\n  color: #545454;\n}\n.ui.red.statistics .statistic > .value,\n.ui.statistics .red.statistic > .value,\n.ui.red.statistic > .value {\n  color: #db2828;\n}\n.ui.inverted.red.statistics .statistic > .value,\n.ui.statistics .inverted.red.statistic > .value,\n.ui.inverted.red.statistic > .value {\n  color: #ff695e;\n}\n.ui.orange.statistics .statistic > .value,\n.ui.statistics .orange.statistic > .value,\n.ui.orange.statistic > .value {\n  color: #f2711c;\n}\n.ui.inverted.orange.statistics .statistic > .value,\n.ui.statistics .inverted.orange.statistic > .value,\n.ui.inverted.orange.statistic > .value {\n  color: #ff851b;\n}\n.ui.yellow.statistics .statistic > .value,\n.ui.statistics .yellow.statistic > .value,\n.ui.yellow.statistic > .value {\n  color: #fbbd08;\n}\n.ui.inverted.yellow.statistics .statistic > .value,\n.ui.statistics .inverted.yellow.statistic > .value,\n.ui.inverted.yellow.statistic > .value {\n  color: #ffe21f;\n}\n.ui.olive.statistics .statistic > .value,\n.ui.statistics .olive.statistic > .value,\n.ui.olive.statistic > .value {\n  color: #b5cc18;\n}\n.ui.inverted.olive.statistics .statistic > .value,\n.ui.statistics .inverted.olive.statistic > .value,\n.ui.inverted.olive.statistic > .value {\n  color: #d9e778;\n}\n.ui.green.statistics .statistic > .value,\n.ui.statistics .green.statistic > .value,\n.ui.green.statistic > .value {\n  color: #21ba45;\n}\n.ui.inverted.green.statistics .statistic > .value,\n.ui.statistics .inverted.green.statistic > .value,\n.ui.inverted.green.statistic > .value {\n  color: #2ecc40;\n}\n.ui.teal.statistics .statistic > .value,\n.ui.statistics .teal.statistic > .value,\n.ui.teal.statistic > .value {\n  color: #00b5ad;\n}\n.ui.inverted.teal.statistics .statistic > .value,\n.ui.statistics .inverted.teal.statistic > .value,\n.ui.inverted.teal.statistic > .value {\n  color: #6dffff;\n}\n.ui.blue.statistics .statistic > .value,\n.ui.statistics .blue.statistic > .value,\n.ui.blue.statistic > .value {\n  color: #2185d0;\n}\n.ui.inverted.blue.statistics .statistic > .value,\n.ui.statistics .inverted.blue.statistic > .value,\n.ui.inverted.blue.statistic > .value {\n  color: #54c8ff;\n}\n.ui.violet.statistics .statistic > .value,\n.ui.statistics .violet.statistic > .value,\n.ui.violet.statistic > .value {\n  color: #6435c9;\n}\n.ui.inverted.violet.statistics .statistic > .value,\n.ui.statistics .inverted.violet.statistic > .value,\n.ui.inverted.violet.statistic > .value {\n  color: #a291fb;\n}\n.ui.purple.statistics .statistic > .value,\n.ui.statistics .purple.statistic > .value,\n.ui.purple.statistic > .value {\n  color: #a333c8;\n}\n.ui.inverted.purple.statistics .statistic > .value,\n.ui.statistics .inverted.purple.statistic > .value,\n.ui.inverted.purple.statistic > .value {\n  color: #dc73ff;\n}\n.ui.pink.statistics .statistic > .value,\n.ui.statistics .pink.statistic > .value,\n.ui.pink.statistic > .value {\n  color: #e03997;\n}\n.ui.inverted.pink.statistics .statistic > .value,\n.ui.statistics .inverted.pink.statistic > .value,\n.ui.inverted.pink.statistic > .value {\n  color: #ff8edf;\n}\n.ui.brown.statistics .statistic > .value,\n.ui.statistics .brown.statistic > .value,\n.ui.brown.statistic > .value {\n  color: #a5673f;\n}\n.ui.inverted.brown.statistics .statistic > .value,\n.ui.statistics .inverted.brown.statistic > .value,\n.ui.inverted.brown.statistic > .value {\n  color: #d67c1c;\n}\n.ui.grey.statistics .statistic > .value,\n.ui.statistics .grey.statistic > .value,\n.ui.grey.statistic > .value {\n  color: #767676;\n}\n.ui.inverted.grey.statistics .statistic > .value,\n.ui.statistics .inverted.grey.statistic > .value,\n.ui.inverted.grey.statistic > .value {\n  color: #dcddde;\n}\n.ui.black.statistics .statistic > .value,\n.ui.statistics .black.statistic > .value,\n.ui.black.statistic > .value {\n  color: #1b1c1d;\n}\n.ui.inverted.black.statistics .statistic > .value,\n.ui.statistics .inverted.black.statistic > .value,\n.ui.inverted.black.statistic > .value {\n  color: #545454;\n}\n\n/* --------------\n        Floated\n    --------------- */\n.ui[class*=\"left floated\"].statistic {\n  float: left;\n  margin: 0 2em 1em 0;\n}\n.ui[class*=\"right floated\"].statistic {\n  float: right;\n  margin: 0 0 1em 2em;\n}\n.ui.floated.statistic:last-child {\n  margin-bottom: 0;\n}\n\n/* --------------\n        Stackable\n    --------------- */\n@media only screen and (max-width: 767.98px) {\n  .ui.stackable.statistics {\n    width: auto;\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .ui.stackable.statistics > .statistic {\n    width: 100% !important;\n    margin: 0 !important;\n    padding: 1rem 1rem !important;\n  }\n}\n\n/* --------------\n     Sizes\n--------------- */\n\n/* Medium */\n.ui.statistics .statistic > .value,\n.ui.statistic > .value {\n  font-size: 4rem;\n}\n.ui.horizontal.statistics .statistic > .value,\n.ui.horizontal.statistic > .value {\n  font-size: 3rem;\n}\n.ui.statistics .statistic > .text.value,\n.ui.statistic > .text.value {\n  font-size: 2rem;\n}\n.ui.mini.statistics .statistic > .value,\n.ui.mini.statistic > .value {\n  font-size: 1.5rem;\n}\n.ui.mini.horizontal.statistics .statistic > .value,\n.ui.mini.horizontal.statistic > .value {\n  font-size: 1.5rem;\n}\n.ui.mini.statistics .statistic > .text.value,\n.ui.mini.statistic > .text.value {\n  font-size: 1rem;\n}\n.ui.tiny.statistics .statistic > .value,\n.ui.tiny.statistic > .value {\n  font-size: 2rem;\n}\n.ui.tiny.horizontal.statistics .statistic > .value,\n.ui.tiny.horizontal.statistic > .value {\n  font-size: 2rem;\n}\n.ui.tiny.statistics .statistic > .text.value,\n.ui.tiny.statistic > .text.value {\n  font-size: 1rem;\n}\n.ui.small.statistics .statistic > .value,\n.ui.small.statistic > .value {\n  font-size: 3rem;\n}\n.ui.small.horizontal.statistics .statistic > .value,\n.ui.small.horizontal.statistic > .value {\n  font-size: 2rem;\n}\n.ui.small.statistics .statistic > .text.value,\n.ui.small.statistic > .text.value {\n  font-size: 1rem;\n}\n.ui.large.statistics .statistic > .value,\n.ui.large.statistic > .value {\n  font-size: 5rem;\n}\n.ui.large.horizontal.statistics .statistic > .value,\n.ui.large.horizontal.statistic > .value {\n  font-size: 4rem;\n}\n.ui.large.statistics .statistic > .text.value,\n.ui.large.statistic > .text.value {\n  font-size: 2.5rem;\n}\n.ui.big.statistics .statistic > .value,\n.ui.big.statistic > .value {\n  font-size: 5.5rem;\n}\n.ui.big.horizontal.statistics .statistic > .value,\n.ui.big.horizontal.statistic > .value {\n  font-size: 4.5rem;\n}\n.ui.big.statistics .statistic > .text.value,\n.ui.big.statistic > .text.value {\n  font-size: 2.5rem;\n}\n.ui.huge.statistics .statistic > .value,\n.ui.huge.statistic > .value {\n  font-size: 6rem;\n}\n.ui.huge.horizontal.statistics .statistic > .value,\n.ui.huge.horizontal.statistic > .value {\n  font-size: 5rem;\n}\n.ui.huge.statistics .statistic > .text.value,\n.ui.huge.statistic > .text.value {\n  font-size: 2.5rem;\n}\n.ui.massive.statistics .statistic > .value,\n.ui.massive.statistic > .value {\n  font-size: 7rem;\n}\n.ui.massive.horizontal.statistics .statistic > .value,\n.ui.massive.horizontal.statistic > .value {\n  font-size: 6rem;\n}\n.ui.massive.statistics .statistic > .text.value,\n.ui.massive.statistic > .text.value {\n  font-size: 3rem;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/step.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Step\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Plural\n*******************************/\n\n.ui.steps:not(.circular) {\n  display: inline-flex;\n  flex-direction: row;\n  align-items: stretch;\n  margin: 1em 0;\n  background: \"\";\n  box-shadow: none;\n  line-height: 1.14285714em;\n  border-radius: 0.28571429rem;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.steps:not(.unstackable) {\n  flex-wrap: wrap;\n}\n\n/* First Steps */\n.ui.steps:first-child {\n  margin-top: 0;\n}\n\n/* Last Steps */\n.ui.steps:last-child {\n  margin-bottom: 0;\n}\n\n\n/*******************************\n           Singular\n*******************************/\n\n.ui.steps:not(.circular) .step {\n  position: relative;\n  display: flex;\n  flex: 1 0 auto;\n  flex-flow: row wrap;\n  vertical-align: middle;\n  align-items: center;\n  justify-content: center;\n  margin: 0 0;\n  padding: 1.14285714em 2em;\n  background: #fff;\n  color: rgba(0, 0, 0, 0.87);\n  box-shadow: none;\n  border-radius: 0;\n  border: none;\n  border-right: 1px solid rgba(34, 36, 38, 0.15);\n  transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, box-shadow 0.1s ease;\n}\n\n/* Arrow */\n.ui.steps:not(.circular) .step::after {\n  display: none;\n  position: absolute;\n  z-index: 2;\n  content: \"\";\n  top: 50%;\n  right: 0;\n  background-color: #fff;\n  width: 1.14285714em;\n  height: 1.14285714em;\n  border-style: solid;\n  border-color: rgba(34, 36, 38, 0.15);\n  border-width: 0 1px 1px 0;\n  transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, box-shadow 0.1s ease;\n  transform: translateY(-50%) translateX(50%) rotate(-45deg);\n}\n\n/* First Step */\n.ui.steps:not(.circular) .step:first-child {\n  padding-left: 2em;\n  border-radius: 0.28571429rem 0 0 0.28571429rem;\n}\n\n/* Last Step */\n.ui.steps:not(.circular) .step:last-child {\n  border-radius: 0 0.28571429rem 0.28571429rem 0;\n  border-right: none;\n  margin-right: 0;\n}\n\n/* Only Step */\n.ui.steps:not(.circular) .step:only-child {\n  border-radius: 0.28571429rem;\n}\n\n\n/*******************************\n            Content\n*******************************/\n\n\n/* Title */\n.ui.steps .step .title {\n  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\";\n  font-size: 1.14285714em;\n  font-weight: bold;\n  line-height: 1.14285714em;\n}\n.ui.steps .step > .title {\n  width: 100%;\n}\n\n/* Description */\n.ui.steps .step .description {\n  font-weight: normal;\n  font-size: 0.92857143em;\n  color: rgba(0, 0, 0, 0.87);\n  line-height: 1.14285714em;\n}\n.ui.steps .step > .description {\n  width: 100%;\n}\n.ui.steps .step .title ~ .description {\n  margin-top: 0.25em;\n}\n\n/* Icon */\n.ui.steps .step > i.icon {\n  line-height: 1;\n  font-size: 2.5em;\n  margin: 0 1rem 0 0;\n}\n.ui.steps .step > i.icon,\n.ui.steps .step > i.icon ~ .content {\n  display: block;\n  flex: 0 1 auto;\n  align-self: center;\n}\n\n/* Horizontal Icon */\n.ui.steps:not(.vertical) .step > i.icon {\n  width: auto;\n}\n\n/* Link */\n.ui.steps .link.step,\n.ui.steps a.step {\n  cursor: pointer;\n}\n\n\n/*******************************\n            Types\n*******************************/\n\n.ui.circular.steps {\n  border: 0;\n  border-radius: 0;\n  box-shadow: none;\n}\n.ui.circular.steps:not(.vertical) {\n  background: transparent;\n  border: 0;\n  border-radius: 0;\n  box-shadow: none;\n  position: relative;\n  display: flex;\n  padding: 1em 0;\n  margin: 1em 0;\n}\n.ui.circular.steps:not(.vertical) .step {\n  background: rgba(34, 36, 38, 0.15);\n  cursor: default;\n  height: 2px;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  flex: 1;\n  position: relative;\n  margin-left: 2.2em;\n}\n.ui.circular.steps:not(.vertical) .step::before {\n  left: -2.2em;\n}\n.ui.circular.steps:not(.vertical) .step::after {\n  left: calc((-2.2em + 0.95em) - 0.3em);\n}\n.ui.circular.steps:not(.vertical) .step.completed {\n  background: #21ba45;\n}\n.ui.circular.steps:not(.vertical) .step.completed::after {\n  left: calc(-2.2em + ((2.2em / 2) / 2) + (2px / 2));\n}\n.ui.circular.steps:not(.vertical) .step:last-child {\n  flex: 0;\n}\n.ui.circular.steps:not(.vertical) .step .content {\n  margin-top: -1.5em;\n  padding: 0 0.5em;\n}\n.ui.circular.steps:not(.vertical) .step .content.center.aligned {\n  margin-top: -0.65em;\n}\n.ui.circular.steps:not(.vertical) .step .content.center.aligned .title {\n  padding: 0 0.5em;\n  margin-left: -0.5em;\n  background: #fff;\n}\n.ui.circular.steps:not(.vertical) .step .content.bottom.aligned {\n  margin-top: 0.5em;\n}\n.ui.circular.steps:not(.vertical) .step .content:not(.aligned) .title + .description {\n  margin-top: 0.5em;\n}\n.ui.circular.steps:not(.vertical) a.step::before,\n.ui.circular.steps:not(.vertical) a.step::after,\n.ui.circular.steps:not(.vertical) a.step .content,\n.ui.circular.steps:not(.vertical) .step.link .content,\n.ui.circular.steps:not(.vertical) .step.link::before,\n.ui.circular.steps:not(.vertical) .step.link::after {\n  cursor: pointer;\n}\n.ui.circular.steps .step {\n  color: inherit;\n}\n.ui.circular.steps .step::before {\n  content: \"\";\n  border-radius: 50%;\n  border: 2px solid rgba(34, 36, 38, 0.15);\n  height: 2.2em;\n  width: 2.2em;\n  line-height: 2.2em;\n  position: absolute;\n}\n.ui.circular.steps .step::after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  border-radius: 50%;\n  background: rgba(34, 36, 38, 0.15);\n  height: 0.95em;\n  width: 0.95em;\n}\n.ui.circular.steps .step.active::before {\n  border-color: #21ba45;\n}\n.ui.circular.steps .step.active::after {\n  background: #21ba45;\n}\n.ui.circular.steps .step.active .title {\n  color: #21ba45;\n}\n.ui.circular.steps .step.completed::before {\n  background: #21ba45;\n  border-color: #21ba45;\n}\n.ui.circular.steps .step.completed::after {\n  background: transparent;\n  content: \"\\e800\";\n  font-family: Step;\n  color: #fff;\n  height: auto;\n  line-height: 1em;\n}\n@supports selector(:has(.f)) {\n  .ui.circular.steps:not(.vertical) .step:last-child:has(.content) {\n    flex: 1;\n  }\n  .ui.circular.steps:not(.vertical) .step:last-child:has(.center.aligned.content) {\n    background: none;\n  }\n}\n\n/* --------------\n         Ordered\n    --------------- */\n.ui.ordered.steps {\n  counter-reset: ordered;\n}\n.ui.ordered.steps .step::before {\n  text-align: center;\n  content: counter(ordered);\n  align-self: center;\n  counter-increment: ordered;\n  font-family: inherit;\n  font-weight: bold;\n}\n.ui.ordered.steps:not(.circular) .step::before {\n  display: block;\n  position: static;\n  font-size: 2.5em;\n  margin-right: 1rem;\n}\n.ui.circular.ordered.steps .step::before {\n  line-height: calc(2.2em - 2px);\n}\n.ui.circular.ordered.steps .step.completed::before {\n  content: \"\";\n}\n.ui.circular.ordered.steps .step::after {\n  background: transparent;\n}\n.ui.circular.ordered.steps .step.active::before {\n  color: #21ba45;\n}\n.ui.ordered.steps .step > * {\n  display: block;\n  align-self: center;\n}\n\n/* --------------\n        Vertical\n    --------------- */\n.ui.vertical.steps:not(.circular) {\n  display: inline-flex;\n  flex-direction: column;\n  overflow: visible;\n}\n.ui.vertical.steps:not(.circular) .step {\n  justify-content: flex-start;\n  border-radius: 0;\n  padding: 1.14285714em 2em;\n  border-right: none;\n  border-bottom: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.vertical.steps:not(.circular) .step:first-child {\n  padding: 1.14285714em 2em;\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.vertical.steps:not(.circular) .step:last-child {\n  border-bottom: none;\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui.vertical.steps:not(.circular) .step:only-child {\n  border-radius: 0.28571429rem;\n}\n\n/* Arrow */\n.ui.vertical.steps:not(.circular) .step::after {\n  top: 50%;\n  right: 0;\n  border-width: 0 1px 1px 0;\n  display: none;\n}\n.ui.right.vertical.steps:not(.circular) .step::after {\n  border-width: 1px 0 0 1px;\n  left: 0;\n  right: 100%;\n  transform: translateY(-50%) translateX(-50%) rotate(-45deg);\n}\n.ui.vertical.steps:not(.circular) .active.step::after {\n  display: block;\n}\n.ui.vertical.steps:not(.circular) .step:last-child::after {\n  display: none;\n}\n.ui.vertical.steps:not(.circular) .active.step:last-child::after {\n  display: block;\n}\n\n/* Circular Step */\n.ui.circular.vertical.steps {\n  display: inline-flex;\n  flex-flow: column wrap;\n  align-items: flex-start;\n}\n.ui.circular.vertical.steps .step {\n  position: relative;\n  width: 100%;\n}\n.ui.circular.vertical.steps .step::before {\n  left: 0;\n  top: 0;\n}\n.ui.circular.vertical.steps .step::after {\n  left: calc((2.2em / (2.2 * 2)) + 2px);\n  top: calc((2.2em / (2.2 * 2)) + 2px);\n}\n.ui.circular.vertical.steps .step .content {\n  padding-left: 3.5em;\n}\n.ui.circular.vertical.steps .step:not(:last-child) {\n  padding-bottom: 3em;\n}\n.ui.circular.vertical.steps .step:not(:last-child) .content::before {\n  content: \"\";\n  position: absolute;\n  border-left: 2px solid rgba(34, 36, 38, 0.15);\n  top: 2.2em;\n  bottom: 0;\n  left: calc(2.2em / 2);\n}\n.ui.circular.vertical.steps .step.completed .content::before {\n  border-color: #21ba45;\n}\n.ui.circular.vertical.steps .step.completed::before {\n  background: #21ba45;\n  border-color: #21ba45;\n}\n.ui.circular.vertical.steps .step.completed::after {\n  top: calc((2.2em / (2.2 * 2)) + (2px - (2px / 2)));\n}\n\n/* ---------------\n    Responsive\n---------------- */\n\n/* Mobile (Default) */\n@media only screen and (max-width: 767.98px) {\n  .ui.steps:not(.unstackable):not(.circular) {\n    display: inline-flex;\n    overflow: visible;\n    flex-direction: column;\n  }\n  .ui.steps:not(.unstackable):not(.circular) .step {\n    width: 100% !important;\n    flex-direction: column;\n    border-radius: 0;\n    padding: 1.14285714em 2em;\n    border-right: none;\n    border-bottom: 1px solid rgba(34, 36, 38, 0.15);\n  }\n  .ui.steps:not(.unstackable):not(.circular) .step:first-child {\n    padding: 1.14285714em 2em;\n    border-radius: 0.28571429rem 0.28571429rem 0 0;\n  }\n  .ui.steps:not(.unstackable):not(.circular) .step:last-child {\n    border-radius: 0 0 0.28571429rem 0.28571429rem;\n    border-bottom: none;\n  }\n  \n/* Arrow */\n  .ui.steps:not(.unstackable):not(.circular) .step::after {\n    top: unset;\n    bottom: -1.14285714em;\n    right: 50%;\n    transform: translateY(-50%) translateX(50%) rotate(45deg);\n  }\n  .ui.vertical.steps:not(.circular) .active.step:last-child::after {\n    display: none;\n  }\n  \n/* Content */\n  .ui.steps:not(.unstackable):not(.circular) .step .content {\n    text-align: center;\n  }\n  \n/* Icon */\n  .ui.steps:not(.unstackable):not(.circular) .step > i.icon,\n  .ui.ordered.steps:not(.unstackable):not(.circular) .step::before {\n    margin: 0 0 1rem 0;\n  }\n}\n\n\n/*******************************\n             States\n*******************************/\n\n\n/* Link Hover */\n.ui.steps:not(.circular) .link.step:hover::after,\n.ui.steps:not(.circular) .link.step:hover,\n.ui.steps:not(.circular) a.step:hover::after,\n.ui.steps:not(.circular) a.step:hover {\n  background: #f9fafb;\n  color: rgba(0, 0, 0, 0.8);\n}\n\n/* Link Down */\n.ui.steps:not(.circular) .link.step:active::after,\n.ui.steps:not(.circular) .link.step:active,\n.ui.steps:not(.circular) a.step:active::after,\n.ui.steps:not(.circular) a.step:active {\n  background: #f3f4f5;\n  color: rgba(0, 0, 0, 0.9);\n}\n\n/* Active */\n.ui.steps:not(.circular) .step.active {\n  cursor: auto;\n  background: #f3f4f5;\n}\n.ui.steps:not(.circular) .step.active::after {\n  background: #f3f4f5;\n}\n.ui.steps:not(.circular) .step.active .title {\n  color: #4183c4;\n}\n.ui.ordered.steps .step.active::before,\n.ui.steps .active.step i.icon {\n  color: rgba(0, 0, 0, 0.85);\n}\n\n/* Active Arrow */\n.ui.steps:not(.circular) .step::after {\n  display: block;\n}\n.ui.steps:not(.circular) .active.step::after {\n  display: block;\n}\n.ui.steps:not(.circular) .step:last-child::after {\n  display: none;\n}\n.ui.steps:not(.circular) .active.step:last-child::after {\n  display: none;\n}\n\n/* Active Hover */\n.ui.steps:not(.circular) .link.active.step:hover::after,\n.ui.steps:not(.circular) .link.active.step:hover,\n.ui.steps:not(.circular) a.active.step:hover::after,\n.ui.steps:not(.circular) a.active.step:hover {\n  cursor: pointer;\n  background: #dcddde;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* Completed */\n.ui.steps .step.completed > i.icon::before,\n.ui.ordered.steps .step.completed::before {\n  color: #21ba45;\n}\n\n/* Disabled */\n.ui.steps:not(.circular) .disabled.step {\n  cursor: auto;\n  background: #fff;\n  pointer-events: none;\n}\n.ui.steps:not(.circular) .disabled.step,\n.ui.steps:not(.circular) .disabled.step .title,\n.ui.steps:not(.circular) .disabled.step .description {\n  color: rgba(40, 40, 40, 0.3);\n}\n.ui.steps:not(.circular) .disabled.step::after {\n  background: #fff;\n}\n.ui.circular.steps .disabled.step {\n  cursor: auto;\n  opacity: 0.5;\n  pointer-events: none;\n}\n.ui.circular.steps .disabled.step::before,\n.ui.circular.steps .disabled.step::after {\n  cursor: auto;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/* --------------\n       Stackable\n    --------------- */\n\n/* Tablet Or Below */\n@media only screen and (max-width: 991.98px) {\n  .ui[class*=\"tablet stackable\"].steps:not(.circular) {\n    display: inline-flex;\n    overflow: visible;\n    flex-direction: column;\n  }\n  \n/* Steps */\n  .ui[class*=\"tablet stackable\"].steps:not(.circular) .step {\n    flex-direction: column;\n    border-radius: 0;\n    padding: 1.14285714em 2em;\n    border-right: none;\n    border-bottom: 1px solid rgba(34, 36, 38, 0.15);\n  }\n  .ui[class*=\"tablet stackable\"].steps:not(.circular) .step:first-child {\n    padding: 1.14285714em 2em;\n    border-radius: 0.28571429rem 0.28571429rem 0 0;\n  }\n  .ui[class*=\"tablet stackable\"].steps:not(.circular) .step:last-child {\n    border-radius: 0 0 0.28571429rem 0.28571429rem;\n    border-bottom: none;\n  }\n  \n/* Arrow */\n  .ui[class*=\"tablet stackable\"].steps:not(.circular) .step::after {\n    top: unset;\n    bottom: -1.14285714em;\n    right: 50%;\n    transform: translateY(-50%) translateX(50%) rotate(45deg);\n  }\n  \n/* Content */\n  .ui[class*=\"tablet stackable\"].steps:not(.circular) .step .content {\n    text-align: center;\n  }\n  \n/* Icon */\n  .ui[class*=\"tablet stackable\"].steps .step > i.icon,\n  .ui[class*=\"tablet stackable\"].ordered.steps .step::before {\n    margin: 0 0 1rem 0;\n  }\n}\n\n/* --------------\n          Fluid\n    --------------- */\n\n/* Fluid */\n.ui.fluid.steps {\n  display: flex;\n  width: 100%;\n}\n\n/* --------------\n        Attached\n    --------------- */\n\n/* Top */\n.ui.attached.steps:not(.circular) {\n  width: calc(100% + 2px) !important;\n  margin: 0 -1px 0;\n  max-width: calc(100% + 2px);\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.attached.steps:not(.circular) .step:first-child {\n  border-radius: 0.28571429rem 0 0 0;\n}\n.ui.attached.steps:not(.circular) .step:last-child {\n  border-radius: 0 0.28571429rem 0 0;\n}\n\n/* Bottom */\n.ui.bottom.attached.steps:not(.circular) {\n  margin: 0 -1px 0;\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui.bottom.attached.steps:not(.circular) .step:first-child {\n  border-radius: 0 0 0 0.28571429rem;\n}\n.ui.bottom.attached.steps:not(.circular) .step:last-child {\n  border-radius: 0 0 0.28571429rem 0;\n}\n\n/* -------------------\n        Evenly Divided\n    -------------------- */\n.ui.one.steps,\n.ui.two.steps,\n.ui.three.steps,\n.ui.four.steps,\n.ui.five.steps,\n.ui.six.steps,\n.ui.seven.steps,\n.ui.eight.steps {\n  width: 100%;\n}\n.ui.one.steps > .step,\n.ui.two.steps > .step,\n.ui.three.steps > .step,\n.ui.four.steps > .step,\n.ui.five.steps > .step,\n.ui.six.steps > .step,\n.ui.seven.steps > .step,\n.ui.eight.steps > .step {\n  flex-wrap: nowrap;\n}\n.ui.one.steps > .step {\n  width: 100%;\n}\n.ui.two.steps > .step {\n  width: 50%;\n}\n.ui.three.steps > .step {\n  width: 33.333%;\n}\n.ui.four.steps > .step {\n  width: 25%;\n}\n.ui.five.steps > .step {\n  width: 20%;\n}\n.ui.six.steps > .step {\n  width: 16.666%;\n}\n.ui.seven.steps > .step {\n  width: 14.285%;\n}\n.ui.eight.steps > .step {\n  width: 12.5%;\n}\n\n/* -------------------\n       Sizes\n-------------------- */\n.ui.steps .step,\n.ui.step {\n  font-size: 1rem;\n}\n.ui.mini.steps .step,\n.ui.mini.step {\n  font-size: 0.78571429rem;\n}\n.ui.mini.circular.steps:not(.vertical) {\n  margin: 0.78571429rem 0;\n  padding: 0.78571429rem 0;\n}\n.ui.tiny.steps .step,\n.ui.tiny.step {\n  font-size: 0.85714286rem;\n}\n.ui.tiny.circular.steps:not(.vertical) {\n  margin: 0.85714286rem 0;\n  padding: 0.85714286rem 0;\n}\n.ui.small.steps .step,\n.ui.small.step {\n  font-size: 0.92857143rem;\n}\n.ui.small.circular.steps:not(.vertical) {\n  margin: 0.92857143rem 0;\n  padding: 0.92857143rem 0;\n}\n.ui.large.steps .step,\n.ui.large.step {\n  font-size: 1.14285714rem;\n}\n.ui.large.circular.steps:not(.vertical) {\n  margin: 1.14285714rem 0;\n  padding: 1.14285714rem 0;\n}\n.ui.big.steps .step,\n.ui.big.step {\n  font-size: 1.28571429rem;\n}\n.ui.big.circular.steps:not(.vertical) {\n  margin: 1.28571429rem 0;\n  padding: 1.28571429rem 0;\n}\n.ui.huge.steps .step,\n.ui.huge.step {\n  font-size: 1.42857143rem;\n}\n.ui.huge.circular.steps:not(.vertical) {\n  margin: 1.42857143rem 0;\n  padding: 1.42857143rem 0;\n}\n.ui.massive.steps .step,\n.ui.massive.step {\n  font-size: 1.71428571rem;\n}\n.ui.massive.circular.steps:not(.vertical) {\n  margin: 1.71428571rem 0;\n  padding: 1.71428571rem 0;\n}\n\n/* --------------\n        Inverted\n    --------------- */\n.ui.inverted.steps:not(.circular) {\n  border: 1px solid #555;\n}\n.ui.inverted.steps:not(.circular) .step {\n  color: rgba(255, 255, 255, 0.9);\n  background: #1b1c1d;\n  border-color: #555;\n}\n.ui.inverted.steps:not(.circular) .step::after {\n  background-color: #1b1c1d;\n  border-color: #555;\n}\n.ui.inverted.steps .step .description {\n  color: rgba(255, 255, 255, 0.9);\n}\n\n/* Active */\n.ui.inverted.steps:not(.circular) .step.active,\n.ui.inverted.steps:not(.circular) .step.active::after {\n  background: #333;\n}\n.ui.inverted.ordered.steps:not(.circular) .step.active::before,\n.ui.inverted.steps:not(.circular) .active.step i.icon {\n  color: #ffffff;\n}\n\n/* Disabled */\n.ui.inverted.steps:not(.circular) .disabled.step,\n.ui.inverted.steps:not(.circular) .disabled.step::after {\n  background: #222;\n}\n.ui.inverted.steps:not(.circular) .disabled.step,\n.ui.inverted.steps:not(.circular) .disabled.step .title,\n.ui.inverted.steps:not(.circular) .disabled.step .description {\n  color: rgba(225, 225, 225, 0.3);\n}\n\n/* Link Hover */\n.ui.inverted.steps:not(.circular) .link.step:hover::after,\n.ui.inverted.steps:not(.circular) .link.step:hover,\n.ui.inverted.steps:not(.circular) a.step:hover::after,\n.ui.inverted.steps:not(.circular) a.step:hover {\n  background: #3f3f3f;\n  color: #ffffff;\n}\n\n/* Link Down */\n.ui.inverted.steps:not(.circular) .link.step:active::after,\n.ui.inverted.steps:not(.circular) .link.step:active,\n.ui.inverted.steps:not(.circular) a.step:active::after,\n.ui.inverted.steps:not(.circular) a.step:active {\n  background: #444;\n  color: #ffffff;\n}\n\n/* Circular Step */\n.ui.inverted.circular.steps .step .content {\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.circular.steps:not(.vertical) .step:not(.completed) {\n  background: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.circular.steps:not(.vertical) .step:not(.active):not(.completed)::before {\n  border-color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.circular.steps:not(.vertical) .step .center.aligned.content .title {\n  background: #1b1c1d;\n}\n.ui.inverted.circular.steps:not(.ordered) .step:not(.active):not(.completed)::after {\n  background: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.circular.steps.vertical .step:not(.active):not(.completed)::before {\n  border-color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.circular.steps.vertical .step:not(.completed) .content::before {\n  background: rgba(255, 255, 255, 0.9);\n}\n.ui.ui.circular.steps .step.primary::before {\n  border-color: #2185d0;\n}\n.ui.ui.circular.steps .step.primary::after {\n  background: #2185d0;\n}\n.ui.ui.primary.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.primary.active::before {\n  border-color: #2185d0;\n}\n.ui.ui.primary.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.primary.active::after {\n  background: #2185d0;\n}\n.ui.ui.primary.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.primary.completed::before {\n  background: #2185d0;\n  border-color: #2185d0;\n}\n.ui.ui.primary.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.primary.completed {\n  background: #2185d0;\n}\n.ui.ui.circular.steps:not(.vertical) .step.primary {\n  background: #2185d0;\n}\n.ui.ui.primary.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.primary.active .content .title {\n  color: #2185d0;\n}\n.ui.ui.vertical.circular.steps .step.completed.primary .content::before {\n  border-color: #2185d0;\n}\n.ui.ui.primary.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.primary.completed .content::before {\n  border-color: #2185d0;\n}\n.ui.ui.primary.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.primary::after {\n  background: transparent;\n}\n.ui.ui.primary.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.primary.active::before {\n  color: #2185d0;\n}\n.ui.ui.circular.steps .step.secondary::before {\n  border-color: #1b1c1d;\n}\n.ui.ui.circular.steps .step.secondary::after {\n  background: #1b1c1d;\n}\n.ui.ui.secondary.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.secondary.active::before {\n  border-color: #1b1c1d;\n}\n.ui.ui.secondary.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.secondary.active::after {\n  background: #1b1c1d;\n}\n.ui.ui.secondary.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.secondary.completed::before {\n  background: #1b1c1d;\n  border-color: #1b1c1d;\n}\n.ui.ui.secondary.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.secondary.completed {\n  background: #1b1c1d;\n}\n.ui.ui.circular.steps:not(.vertical) .step.secondary {\n  background: #1b1c1d;\n}\n.ui.ui.secondary.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.secondary.active .content .title {\n  color: #1b1c1d;\n}\n.ui.ui.vertical.circular.steps .step.completed.secondary .content::before {\n  border-color: #1b1c1d;\n}\n.ui.ui.secondary.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.secondary.completed .content::before {\n  border-color: #1b1c1d;\n}\n.ui.ui.secondary.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.secondary::after {\n  background: transparent;\n}\n.ui.ui.secondary.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.secondary.active::before {\n  color: #1b1c1d;\n}\n.ui.ui.circular.steps .step.red::before {\n  border-color: #db2828;\n}\n.ui.ui.circular.steps .step.red::after {\n  background: #db2828;\n}\n.ui.ui.red.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.red.active::before {\n  border-color: #db2828;\n}\n.ui.ui.red.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.red.active::after {\n  background: #db2828;\n}\n.ui.ui.red.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.red.completed::before {\n  background: #db2828;\n  border-color: #db2828;\n}\n.ui.ui.red.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.red.completed {\n  background: #db2828;\n}\n.ui.ui.circular.steps:not(.vertical) .step.red {\n  background: #db2828;\n}\n.ui.ui.red.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.red.active .content .title {\n  color: #db2828;\n}\n.ui.ui.vertical.circular.steps .step.completed.red .content::before {\n  border-color: #db2828;\n}\n.ui.ui.red.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.red.completed .content::before {\n  border-color: #db2828;\n}\n.ui.ui.red.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.red::after {\n  background: transparent;\n}\n.ui.ui.red.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.red.active::before {\n  color: #db2828;\n}\n.ui.ui.circular.steps .step.orange::before {\n  border-color: #f2711c;\n}\n.ui.ui.circular.steps .step.orange::after {\n  background: #f2711c;\n}\n.ui.ui.orange.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.orange.active::before {\n  border-color: #f2711c;\n}\n.ui.ui.orange.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.orange.active::after {\n  background: #f2711c;\n}\n.ui.ui.orange.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.orange.completed::before {\n  background: #f2711c;\n  border-color: #f2711c;\n}\n.ui.ui.orange.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.orange.completed {\n  background: #f2711c;\n}\n.ui.ui.circular.steps:not(.vertical) .step.orange {\n  background: #f2711c;\n}\n.ui.ui.orange.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.orange.active .content .title {\n  color: #f2711c;\n}\n.ui.ui.vertical.circular.steps .step.completed.orange .content::before {\n  border-color: #f2711c;\n}\n.ui.ui.orange.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.orange.completed .content::before {\n  border-color: #f2711c;\n}\n.ui.ui.orange.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.orange::after {\n  background: transparent;\n}\n.ui.ui.orange.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.orange.active::before {\n  color: #f2711c;\n}\n.ui.ui.circular.steps .step.yellow::before {\n  border-color: #fbbd08;\n}\n.ui.ui.circular.steps .step.yellow::after {\n  background: #fbbd08;\n}\n.ui.ui.yellow.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.yellow.active::before {\n  border-color: #fbbd08;\n}\n.ui.ui.yellow.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.yellow.active::after {\n  background: #fbbd08;\n}\n.ui.ui.yellow.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.yellow.completed::before {\n  background: #fbbd08;\n  border-color: #fbbd08;\n}\n.ui.ui.yellow.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.yellow.completed {\n  background: #fbbd08;\n}\n.ui.ui.circular.steps:not(.vertical) .step.yellow {\n  background: #fbbd08;\n}\n.ui.ui.yellow.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.yellow.active .content .title {\n  color: #fbbd08;\n}\n.ui.ui.vertical.circular.steps .step.completed.yellow .content::before {\n  border-color: #fbbd08;\n}\n.ui.ui.yellow.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.yellow.completed .content::before {\n  border-color: #fbbd08;\n}\n.ui.ui.yellow.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.yellow::after {\n  background: transparent;\n}\n.ui.ui.yellow.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.yellow.active::before {\n  color: #fbbd08;\n}\n.ui.ui.circular.steps .step.olive::before {\n  border-color: #b5cc18;\n}\n.ui.ui.circular.steps .step.olive::after {\n  background: #b5cc18;\n}\n.ui.ui.olive.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.olive.active::before {\n  border-color: #b5cc18;\n}\n.ui.ui.olive.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.olive.active::after {\n  background: #b5cc18;\n}\n.ui.ui.olive.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.olive.completed::before {\n  background: #b5cc18;\n  border-color: #b5cc18;\n}\n.ui.ui.olive.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.olive.completed {\n  background: #b5cc18;\n}\n.ui.ui.circular.steps:not(.vertical) .step.olive {\n  background: #b5cc18;\n}\n.ui.ui.olive.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.olive.active .content .title {\n  color: #b5cc18;\n}\n.ui.ui.vertical.circular.steps .step.completed.olive .content::before {\n  border-color: #b5cc18;\n}\n.ui.ui.olive.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.olive.completed .content::before {\n  border-color: #b5cc18;\n}\n.ui.ui.olive.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.olive::after {\n  background: transparent;\n}\n.ui.ui.olive.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.olive.active::before {\n  color: #b5cc18;\n}\n.ui.ui.circular.steps .step.green::before {\n  border-color: #21ba45;\n}\n.ui.ui.circular.steps .step.green::after {\n  background: #21ba45;\n}\n.ui.ui.green.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.green.active::before {\n  border-color: #21ba45;\n}\n.ui.ui.green.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.green.active::after {\n  background: #21ba45;\n}\n.ui.ui.green.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.green.completed::before {\n  background: #21ba45;\n  border-color: #21ba45;\n}\n.ui.ui.green.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.green.completed {\n  background: #21ba45;\n}\n.ui.ui.circular.steps:not(.vertical) .step.green {\n  background: #21ba45;\n}\n.ui.ui.green.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.green.active .content .title {\n  color: #21ba45;\n}\n.ui.ui.vertical.circular.steps .step.completed.green .content::before {\n  border-color: #21ba45;\n}\n.ui.ui.green.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.green.completed .content::before {\n  border-color: #21ba45;\n}\n.ui.ui.green.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.green::after {\n  background: transparent;\n}\n.ui.ui.green.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.green.active::before {\n  color: #21ba45;\n}\n.ui.ui.circular.steps .step.teal::before {\n  border-color: #00b5ad;\n}\n.ui.ui.circular.steps .step.teal::after {\n  background: #00b5ad;\n}\n.ui.ui.teal.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.teal.active::before {\n  border-color: #00b5ad;\n}\n.ui.ui.teal.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.teal.active::after {\n  background: #00b5ad;\n}\n.ui.ui.teal.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.teal.completed::before {\n  background: #00b5ad;\n  border-color: #00b5ad;\n}\n.ui.ui.teal.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.teal.completed {\n  background: #00b5ad;\n}\n.ui.ui.circular.steps:not(.vertical) .step.teal {\n  background: #00b5ad;\n}\n.ui.ui.teal.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.teal.active .content .title {\n  color: #00b5ad;\n}\n.ui.ui.vertical.circular.steps .step.completed.teal .content::before {\n  border-color: #00b5ad;\n}\n.ui.ui.teal.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.teal.completed .content::before {\n  border-color: #00b5ad;\n}\n.ui.ui.teal.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.teal::after {\n  background: transparent;\n}\n.ui.ui.teal.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.teal.active::before {\n  color: #00b5ad;\n}\n.ui.ui.circular.steps .step.blue::before {\n  border-color: #2185d0;\n}\n.ui.ui.circular.steps .step.blue::after {\n  background: #2185d0;\n}\n.ui.ui.blue.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.blue.active::before {\n  border-color: #2185d0;\n}\n.ui.ui.blue.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.blue.active::after {\n  background: #2185d0;\n}\n.ui.ui.blue.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.blue.completed::before {\n  background: #2185d0;\n  border-color: #2185d0;\n}\n.ui.ui.blue.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.blue.completed {\n  background: #2185d0;\n}\n.ui.ui.circular.steps:not(.vertical) .step.blue {\n  background: #2185d0;\n}\n.ui.ui.blue.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.blue.active .content .title {\n  color: #2185d0;\n}\n.ui.ui.vertical.circular.steps .step.completed.blue .content::before {\n  border-color: #2185d0;\n}\n.ui.ui.blue.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.blue.completed .content::before {\n  border-color: #2185d0;\n}\n.ui.ui.blue.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.blue::after {\n  background: transparent;\n}\n.ui.ui.blue.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.blue.active::before {\n  color: #2185d0;\n}\n.ui.ui.circular.steps .step.violet::before {\n  border-color: #6435c9;\n}\n.ui.ui.circular.steps .step.violet::after {\n  background: #6435c9;\n}\n.ui.ui.violet.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.violet.active::before {\n  border-color: #6435c9;\n}\n.ui.ui.violet.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.violet.active::after {\n  background: #6435c9;\n}\n.ui.ui.violet.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.violet.completed::before {\n  background: #6435c9;\n  border-color: #6435c9;\n}\n.ui.ui.violet.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.violet.completed {\n  background: #6435c9;\n}\n.ui.ui.circular.steps:not(.vertical) .step.violet {\n  background: #6435c9;\n}\n.ui.ui.violet.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.violet.active .content .title {\n  color: #6435c9;\n}\n.ui.ui.vertical.circular.steps .step.completed.violet .content::before {\n  border-color: #6435c9;\n}\n.ui.ui.violet.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.violet.completed .content::before {\n  border-color: #6435c9;\n}\n.ui.ui.violet.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.violet::after {\n  background: transparent;\n}\n.ui.ui.violet.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.violet.active::before {\n  color: #6435c9;\n}\n.ui.ui.circular.steps .step.purple::before {\n  border-color: #a333c8;\n}\n.ui.ui.circular.steps .step.purple::after {\n  background: #a333c8;\n}\n.ui.ui.purple.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.purple.active::before {\n  border-color: #a333c8;\n}\n.ui.ui.purple.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.purple.active::after {\n  background: #a333c8;\n}\n.ui.ui.purple.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.purple.completed::before {\n  background: #a333c8;\n  border-color: #a333c8;\n}\n.ui.ui.purple.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.purple.completed {\n  background: #a333c8;\n}\n.ui.ui.circular.steps:not(.vertical) .step.purple {\n  background: #a333c8;\n}\n.ui.ui.purple.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.purple.active .content .title {\n  color: #a333c8;\n}\n.ui.ui.vertical.circular.steps .step.completed.purple .content::before {\n  border-color: #a333c8;\n}\n.ui.ui.purple.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.purple.completed .content::before {\n  border-color: #a333c8;\n}\n.ui.ui.purple.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.purple::after {\n  background: transparent;\n}\n.ui.ui.purple.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.purple.active::before {\n  color: #a333c8;\n}\n.ui.ui.circular.steps .step.pink::before {\n  border-color: #e03997;\n}\n.ui.ui.circular.steps .step.pink::after {\n  background: #e03997;\n}\n.ui.ui.pink.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.pink.active::before {\n  border-color: #e03997;\n}\n.ui.ui.pink.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.pink.active::after {\n  background: #e03997;\n}\n.ui.ui.pink.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.pink.completed::before {\n  background: #e03997;\n  border-color: #e03997;\n}\n.ui.ui.pink.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.pink.completed {\n  background: #e03997;\n}\n.ui.ui.circular.steps:not(.vertical) .step.pink {\n  background: #e03997;\n}\n.ui.ui.pink.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.pink.active .content .title {\n  color: #e03997;\n}\n.ui.ui.vertical.circular.steps .step.completed.pink .content::before {\n  border-color: #e03997;\n}\n.ui.ui.pink.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.pink.completed .content::before {\n  border-color: #e03997;\n}\n.ui.ui.pink.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.pink::after {\n  background: transparent;\n}\n.ui.ui.pink.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.pink.active::before {\n  color: #e03997;\n}\n.ui.ui.circular.steps .step.brown::before {\n  border-color: #a5673f;\n}\n.ui.ui.circular.steps .step.brown::after {\n  background: #a5673f;\n}\n.ui.ui.brown.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.brown.active::before {\n  border-color: #a5673f;\n}\n.ui.ui.brown.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.brown.active::after {\n  background: #a5673f;\n}\n.ui.ui.brown.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.brown.completed::before {\n  background: #a5673f;\n  border-color: #a5673f;\n}\n.ui.ui.brown.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.brown.completed {\n  background: #a5673f;\n}\n.ui.ui.circular.steps:not(.vertical) .step.brown {\n  background: #a5673f;\n}\n.ui.ui.brown.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.brown.active .content .title {\n  color: #a5673f;\n}\n.ui.ui.vertical.circular.steps .step.completed.brown .content::before {\n  border-color: #a5673f;\n}\n.ui.ui.brown.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.brown.completed .content::before {\n  border-color: #a5673f;\n}\n.ui.ui.brown.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.brown::after {\n  background: transparent;\n}\n.ui.ui.brown.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.brown.active::before {\n  color: #a5673f;\n}\n.ui.ui.circular.steps .step.grey::before {\n  border-color: #767676;\n}\n.ui.ui.circular.steps .step.grey::after {\n  background: #767676;\n}\n.ui.ui.grey.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.grey.active::before {\n  border-color: #767676;\n}\n.ui.ui.grey.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.grey.active::after {\n  background: #767676;\n}\n.ui.ui.grey.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.grey.completed::before {\n  background: #767676;\n  border-color: #767676;\n}\n.ui.ui.grey.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.grey.completed {\n  background: #767676;\n}\n.ui.ui.circular.steps:not(.vertical) .step.grey {\n  background: #767676;\n}\n.ui.ui.grey.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.grey.active .content .title {\n  color: #767676;\n}\n.ui.ui.vertical.circular.steps .step.completed.grey .content::before {\n  border-color: #767676;\n}\n.ui.ui.grey.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.grey.completed .content::before {\n  border-color: #767676;\n}\n.ui.ui.grey.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.grey::after {\n  background: transparent;\n}\n.ui.ui.grey.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.grey.active::before {\n  color: #767676;\n}\n.ui.ui.circular.steps .step.black::before {\n  border-color: #1b1c1d;\n}\n.ui.ui.circular.steps .step.black::after {\n  background: #1b1c1d;\n}\n.ui.ui.black.circular.steps .step.active::before,\n.ui.ui.ui.circular.steps .step.black.active::before {\n  border-color: #1b1c1d;\n}\n.ui.ui.black.circular.steps .step.active::after,\n.ui.ui.ui.circular.steps .step.black.active::after {\n  background: #1b1c1d;\n}\n.ui.ui.black.circular.steps .step.completed::before,\n.ui.ui.ui.circular.steps .step.black.completed::before {\n  background: #1b1c1d;\n  border-color: #1b1c1d;\n}\n.ui.ui.black.circular.steps:not(.vertical) .step.completed,\n.ui.ui.ui.circular.steps:not(.vertical) .step.black.completed {\n  background: #1b1c1d;\n}\n.ui.ui.circular.steps:not(.vertical) .step.black {\n  background: #1b1c1d;\n}\n.ui.ui.black.circular.steps .step.active .content .title,\n.ui.ui.ui.circular.steps .step.black.active .content .title {\n  color: #1b1c1d;\n}\n.ui.ui.vertical.circular.steps .step.completed.black .content::before {\n  border-color: #1b1c1d;\n}\n.ui.ui.black.vertical.circular.steps .step.completed .content::before,\n.ui.ui.vertical.circular.steps .step.black.completed .content::before {\n  border-color: #1b1c1d;\n}\n.ui.ui.black.circular.ordered.steps .step::after,\n.ui.ui.circular.ordered.steps .step.black::after {\n  background: transparent;\n}\n.ui.ui.black.circular.ordered.steps .step.active::before,\n.ui.ui.circular.ordered.steps .step.black.active::before {\n  color: #1b1c1d;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n@font-face {\n  font-family: Step;\n  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\");\n}\n.ui.steps .step.completed > .icon::before,\n.ui.ordered.steps .step.completed::before {\n  font-family: Step;\n  content: \"\\e800\";\n  \n/* '' */\n}\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/sticky.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Sticky\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Sticky\n*******************************/\n\n.ui.sticky {\n  position: static;\n  transition: none;\n  z-index: 800;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* Bound */\n.ui.sticky.bound {\n  position: absolute;\n  left: auto;\n  right: auto;\n}\n\n/* Fixed */\n.ui.sticky.fixed {\n  position: fixed;\n  left: auto;\n  right: auto;\n}\n\n/* Bound/Fixed Position */\n.ui.sticky.bound.top,\n.ui.sticky.fixed.top {\n  top: 0;\n  bottom: auto;\n}\n.ui.sticky.bound.bottom,\n.ui.sticky.fixed.bottom {\n  top: auto;\n  bottom: 0;\n}\n\n\n/*******************************\n            Types\n*******************************/\n\n.ui.native.sticky {\n  position: sticky;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/sticky.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Sticky\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.sticky = function (parameters) {\n        var\n            $allModules    = $(this),\n            $document      = $(document),\n\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n            contextCheck   = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $(context);\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : window;\n                    }\n                }\n\n                return $context;\n            },\n            returnedValue\n        ;\n\n        $allModules.each(function () {\n            var\n                settings              = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.sticky.settings, parameters)\n                    : $.extend({}, $.fn.sticky.settings),\n\n                className             = settings.className,\n                namespace             = settings.namespace,\n                error                 = settings.error,\n\n                eventNamespace        = '.' + namespace,\n                moduleNamespace       = 'module-' + namespace,\n\n                $module               = $(this),\n                $window               = $(window),\n                $scroll               = contextCheck(settings.scrollContext, window),\n                $container,\n                $context,\n\n                instance              = $module.data(moduleNamespace),\n\n                element         = this,\n\n                documentObserver,\n                observer,\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.determineContainer();\n                    module.determineContext();\n                    module.verbose('Initializing sticky', settings, $container);\n\n                    module.save.positions();\n                    module.checkErrors();\n                    module.bind.events();\n\n                    if (settings.observeChanges) {\n                        module.observeChanges();\n                    }\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous instance');\n                    module.reset();\n                    if (documentObserver) {\n                        documentObserver.disconnect();\n                    }\n                    if (observer) {\n                        observer.disconnect();\n                    }\n                    $window\n                        .off('load' + eventNamespace, module.event.load)\n                        .off('resize' + eventNamespace, module.event.resize)\n                    ;\n                    $scroll\n                        .off('scrollchange' + eventNamespace, module.event.scrollchange)\n                    ;\n                    $module.removeData(moduleNamespace);\n                },\n\n                observeChanges: function () {\n                    if ('MutationObserver' in window) {\n                        documentObserver = new MutationObserver(module.event.documentChanged);\n                        observer = new MutationObserver(module.event.changed);\n                        documentObserver.observe(document, {\n                            childList: true,\n                            subtree: true,\n                        });\n                        observer.observe(element, {\n                            childList: true,\n                            subtree: true,\n                        });\n                        observer.observe($context[0], {\n                            childList: true,\n                            subtree: true,\n                        });\n                        module.debug('Setting up mutation observer', observer);\n                    }\n                },\n\n                determineContainer: function () {\n                    $container = settings.container ? contextCheck(settings.container, window) : $module.offsetParent();\n                },\n\n                determineContext: function () {\n                    $context = settings.context ? contextCheck(settings.context, window) : $container;\n                    if ($context.length === 0) {\n                        module.error(error.invalidContext, settings.context, $module);\n                    }\n                },\n\n                checkErrors: function () {\n                    if (module.is.hidden()) {\n                        module.error(error.visible, $module);\n                    }\n                    if (module.cache.element.height > module.cache.context.height) {\n                        module.reset();\n                        module.error(error.elementSize, $module);\n                    }\n                },\n\n                bind: {\n                    events: function () {\n                        $window\n                            .on('load' + eventNamespace, module.event.load)\n                            .on('resize' + eventNamespace, module.event.resize)\n                        ;\n                        // pub/sub pattern\n                        $scroll\n                            .off('scroll' + eventNamespace)\n                            .on('scroll' + eventNamespace, module.event.scroll)\n                            .on('scrollchange' + eventNamespace, module.event.scrollchange)\n                        ;\n                    },\n                },\n\n                event: {\n                    changed: function (mutations) {\n                        clearTimeout(module.timer);\n                        module.timer = setTimeout(function () {\n                            module.verbose('DOM tree modified, updating sticky menu', mutations);\n                            module.refresh();\n                        }, 100);\n                    },\n                    documentChanged: function (mutations) {\n                        [].forEach.call(mutations, function (mutation) {\n                            if (mutation.removedNodes) {\n                                [].forEach.call(mutation.removedNodes, function (node) {\n                                    if (node === element || $(node).find(element).length > 0) {\n                                        module.debug('Element removed from DOM, tearing down events');\n                                        module.destroy();\n                                    }\n                                });\n                            }\n                        });\n                    },\n                    load: function () {\n                        module.verbose('Page contents finished loading');\n                        requestAnimationFrame(module.refresh);\n                    },\n                    resize: function () {\n                        module.verbose('Window resized');\n                        requestAnimationFrame(module.refresh);\n                    },\n                    scroll: function () {\n                        requestAnimationFrame(function () {\n                            $scroll.triggerHandler('scrollchange' + eventNamespace, $scroll.scrollTop());\n                        });\n                    },\n                    scrollchange: function (event, scrollPosition) {\n                        module.stick(scrollPosition);\n                        settings.onScroll.call(element);\n                    },\n                },\n\n                refresh: function (hardRefresh) {\n                    module.reset();\n                    if (!settings.context) {\n                        module.determineContext();\n                    }\n                    if (hardRefresh) {\n                        module.determineContainer();\n                    }\n                    module.save.positions();\n                    module.stick();\n                    settings.onReposition.call(element);\n                },\n\n                supports: {\n                    sticky: function () {\n                        var\n                            $element = $('<div/>')\n                        ;\n                        $element.addClass(className.supported);\n\n                        return $element.css('position').match('sticky');\n                    },\n                },\n\n                save: {\n                    lastScroll: function (scroll) {\n                        module.lastScroll = scroll;\n                    },\n                    elementScroll: function (scroll) {\n                        module.elementScroll = scroll;\n                    },\n                    positions: function () {\n                        var\n                            scrollContext = {\n                                height: $scroll.height(),\n                            },\n                            element = {\n                                margin: {\n                                    top: parseInt($module.css('margin-top'), 10),\n                                    bottom: parseInt($module.css('margin-bottom'), 10),\n                                },\n                                offset: $module.offset(),\n                                width: $module.outerWidth(),\n                                height: $module.outerHeight(),\n                            },\n                            context = {\n                                offset: $context.offset(),\n                                height: $context.outerHeight(),\n                            }\n                        ;\n                        if (!module.is.standardScroll()) {\n                            module.debug('Non-standard scroll. Removing scroll offset from element offset');\n\n                            scrollContext.top = $scroll.scrollTop();\n                            scrollContext.left = $scroll.scrollLeft();\n\n                            element.offset.top += scrollContext.top;\n                            context.offset.top += scrollContext.top;\n                            element.offset.left += scrollContext.left;\n                            context.offset.left += scrollContext.left;\n                        }\n                        module.cache = {\n                            fits: (element.height + settings.offset) <= scrollContext.height,\n                            sameHeight: element.height === context.height,\n                            scrollContext: {\n                                height: scrollContext.height,\n                            },\n                            element: {\n                                margin: element.margin,\n                                top: element.offset.top - element.margin.top,\n                                left: element.offset.left,\n                                width: element.width,\n                                height: element.height,\n                                bottom: element.offset.top + element.height,\n                            },\n                            context: {\n                                top: context.offset.top,\n                                height: context.height,\n                                bottom: context.offset.top + context.height,\n                            },\n                        };\n                        module.set.containerSize();\n\n                        module.stick();\n                        module.debug('Caching element positions', module.cache);\n                    },\n                },\n\n                get: {\n                    direction: function (scroll) {\n                        var\n                            direction = 'down'\n                        ;\n                        scroll = scroll || $scroll.scrollTop();\n                        if (module.lastScroll && module.lastScroll > scroll) {\n                            direction = 'up';\n                        }\n\n                        return direction;\n                    },\n                    scrollChange: function (scroll) {\n                        scroll = scroll || $scroll.scrollTop();\n\n                        return module.lastScroll\n                            ? scroll - module.lastScroll\n                            : 0;\n                    },\n                    currentElementScroll: function () {\n                        if (module.elementScroll) {\n                            return module.elementScroll;\n                        }\n\n                        return module.is.top()\n                            ? Math.abs(parseInt($module.css('top'), 10)) || 0\n                            : Math.abs(parseInt($module.css('bottom'), 10)) || 0;\n                    },\n\n                    elementScroll: function (scroll) {\n                        scroll = scroll || $scroll.scrollTop();\n                        var\n                            element        = module.cache.element,\n                            scrollContext  = module.cache.scrollContext,\n                            delta          = module.get.scrollChange(scroll),\n                            maxScroll      = element.height - scrollContext.height + settings.offset,\n                            elementScroll  = module.get.currentElementScroll(),\n                            possibleScroll = elementScroll + delta\n                        ;\n                        if (module.cache.fits || possibleScroll < 0) {\n                            elementScroll = 0;\n                        } else if (possibleScroll > maxScroll) {\n                            elementScroll = maxScroll;\n                        } else {\n                            elementScroll = possibleScroll;\n                        }\n\n                        return elementScroll;\n                    },\n                },\n\n                remove: {\n                    lastScroll: function () {\n                        delete module.lastScroll;\n                    },\n                    elementScroll: function () {\n                        delete module.elementScroll;\n                    },\n                    minimumSize: function () {\n                        $container\n                            .css('min-height', '')\n                        ;\n                    },\n                    offset: function () {\n                        $module.css('margin-top', '');\n                    },\n                },\n\n                set: {\n                    offset: function () {\n                        module.verbose('Setting offset on element', settings.offset);\n                        $module\n                            .css('margin-top', settings.offset)\n                        ;\n                    },\n                    containerSize: function () {\n                        var\n                            tagName = $container[0].tagName\n                        ;\n                        if (tagName === 'HTML' || tagName === 'body') {\n                            module.determineContainer();\n                        } else {\n                            var tallestHeight = Math.max(module.cache.context.height, module.cache.element.height);\n                            if (tallestHeight - $container.outerHeight() > settings.jitter) {\n                                module.debug('Context is taller than container. Specifying exact height for container', module.cache.context.height);\n                                $container.css({\n                                    height: tallestHeight,\n                                });\n                            } else {\n                                $container.css({\n                                    height: '',\n                                });\n                            }\n                            if (Math.abs($container.outerHeight() - module.cache.context.height) > settings.jitter) {\n                                module.debug('Context has padding, specifying exact height for container', module.cache.context.height);\n                                $container.css({\n                                    height: module.cache.context.height,\n                                });\n                            }\n                        }\n                    },\n                    minimumSize: function () {\n                        var\n                            element   = module.cache.element\n                        ;\n                        $container\n                            .css('min-height', element.height)\n                        ;\n                    },\n                    scroll: function (scroll) {\n                        module.debug('Setting scroll on element', scroll);\n                        if (module.elementScroll === scroll) {\n                            return;\n                        }\n                        if (module.is.top()) {\n                            $module\n                                .css('bottom', '')\n                                .css('top', -scroll + 'px')\n                            ;\n                        }\n                        if (module.is.bottom()) {\n                            $module\n                                .css('top', '')\n                                .css('bottom', scroll + 'px')\n                            ;\n                        }\n                    },\n                    size: function () {\n                        if (module.cache.element.height !== 0 && module.cache.element.width !== 0) {\n                            element.style.setProperty('width', module.cache.element.width + 'px', 'important');\n                            element.style.setProperty('height', module.cache.element.height + 'px', 'important');\n                        }\n                    },\n                },\n\n                is: {\n                    standardScroll: function () {\n                        return $scroll[0] === window;\n                    },\n                    top: function () {\n                        return $module.hasClass(className.top);\n                    },\n                    bottom: function () {\n                        return $module.hasClass(className.bottom);\n                    },\n                    initialPosition: function () {\n                        return !module.is.fixed() && !module.is.bound();\n                    },\n                    hidden: function () {\n                        return !$module.is(':visible');\n                    },\n                    bound: function () {\n                        return $module.hasClass(className.bound);\n                    },\n                    fixed: function () {\n                        return $module.hasClass(className.fixed);\n                    },\n                },\n\n                stick: function (scrollPosition) {\n                    var\n                        cachedPosition = scrollPosition || $scroll.scrollTop(),\n                        cache          = module.cache,\n                        fits           = cache.fits,\n                        sameHeight     = cache.sameHeight,\n                        element        = cache.element,\n                        scrollContext  = cache.scrollContext,\n                        context        = cache.context,\n                        offset         = module.is.bottom() && settings.pushing\n                            ? settings.bottomOffset\n                            : settings.offset,\n                        scroll         = {\n                            top: cachedPosition + offset,\n                            bottom: cachedPosition + offset + scrollContext.height,\n                        },\n                        elementScroll  = fits\n                            ? 0\n                            : module.get.elementScroll(scroll.top),\n\n                        // shorthand\n                        doesntFit      = !fits,\n                        elementVisible = element.height !== 0\n                    ;\n                    if (elementVisible && !sameHeight) {\n                        if (module.is.initialPosition()) {\n                            if (scroll.top >= context.bottom) {\n                                module.debug('Initial element position is bottom of container');\n                                module.bindBottom();\n                            } else if (scroll.top > element.top) {\n                                if ((element.height + scroll.top - elementScroll) >= context.bottom && element.height < context.height) {\n                                    module.debug('Initial element position is bottom of container');\n                                    module.bindBottom();\n                                } else {\n                                    module.debug('Initial element position is fixed');\n                                    module.fixTop();\n                                }\n                            }\n                        } else if (module.is.fixed()) {\n                            if (module.is.top()) {\n                                if (scroll.top <= element.top) {\n                                    module.debug('Fixed element reached top of container');\n                                    module.setInitialPosition();\n                                } else if ((element.height + scroll.top - elementScroll) >= context.bottom) {\n                                    module.debug('Fixed element reached bottom of container');\n                                    module.bindBottom();\n                                } else if (doesntFit) { // scroll element if larger than screen\n                                    module.set.scroll(elementScroll);\n                                    module.save.lastScroll(scroll.top);\n                                    module.save.elementScroll(elementScroll);\n                                }\n                            } else if (module.is.bottom()) {\n                                if ((scroll.bottom - element.height) <= element.top) { // top edge\n                                    module.debug('Bottom fixed rail has reached top of container');\n                                    module.setInitialPosition();\n                                } else if (scroll.bottom >= context.bottom) { // bottom edge\n                                    module.debug('Bottom fixed rail has reached bottom of container');\n                                    module.bindBottom();\n                                } else if (doesntFit) { // scroll element if larger than screen\n                                    module.set.scroll(elementScroll);\n                                    module.save.lastScroll(scroll.top);\n                                    module.save.elementScroll(elementScroll);\n                                }\n                            }\n                        } else if (module.is.bottom()) {\n                            if (scroll.top <= element.top) {\n                                module.debug('Jumped from bottom fixed to top fixed, most likely used home/end button');\n                                module.setInitialPosition();\n                            } else {\n                                if (settings.pushing) {\n                                    if (module.is.bound() && scroll.bottom <= context.bottom) {\n                                        module.debug('Fixing bottom attached element to bottom of browser.');\n                                        module.fixBottom();\n                                    }\n                                } else {\n                                    if (module.is.bound() && (scroll.top <= context.bottom - element.height)) {\n                                        module.debug('Fixing bottom attached element to top of browser.');\n                                        module.fixTop();\n                                    }\n                                }\n                            }\n                        }\n                    }\n                },\n\n                bindTop: function () {\n                    module.debug('Binding element to top of parent container');\n                    module.remove.offset();\n                    if (settings.setSize) {\n                        module.set.size();\n                    }\n                    $module\n                        .css({\n                            left: '',\n                            top: '',\n                            marginBottom: '',\n                        })\n                        .removeClass(className.fixed)\n                        .removeClass(className.bottom)\n                        .addClass(className.bound)\n                        .addClass(className.top)\n                    ;\n                    settings.onTop.call(element);\n                    settings.onUnstick.call(element);\n                },\n                bindBottom: function () {\n                    module.debug('Binding element to bottom of parent container');\n                    module.remove.offset();\n                    if (settings.setSize) {\n                        module.set.size();\n                    }\n                    $module\n                        .css({\n                            left: '',\n                            top: '',\n                        })\n                        .removeClass(className.fixed)\n                        .removeClass(className.top)\n                        .addClass(className.bound)\n                        .addClass(className.bottom)\n                    ;\n                    settings.onBottom.call(element);\n                    settings.onUnstick.call(element);\n                },\n\n                setInitialPosition: function () {\n                    module.debug('Returning to initial position');\n                    module.unfix();\n                    module.unbind();\n                },\n\n                fixTop: function () {\n                    module.debug('Fixing element to top of page');\n                    if (settings.setSize) {\n                        module.set.size();\n                    }\n                    module.set.minimumSize();\n                    module.set.offset();\n                    $module\n                        .css({\n                            left: module.cache.element.left,\n                            bottom: '',\n                            marginBottom: '',\n                        })\n                        .removeClass(className.bound)\n                        .removeClass(className.bottom)\n                        .addClass(className.fixed)\n                        .addClass(className.top)\n                    ;\n                    settings.onStick.call(element);\n                },\n\n                fixBottom: function () {\n                    module.debug('Sticking element to bottom of page');\n                    if (settings.setSize) {\n                        module.set.size();\n                    }\n                    module.set.minimumSize();\n                    module.set.offset();\n                    $module\n                        .css({\n                            left: module.cache.element.left,\n                            bottom: '',\n                            marginBottom: '',\n                        })\n                        .removeClass(className.bound)\n                        .removeClass(className.top)\n                        .addClass(className.fixed)\n                        .addClass(className.bottom)\n                    ;\n                    settings.onStick.call(element);\n                },\n\n                unbind: function () {\n                    if (module.is.bound()) {\n                        module.debug('Removing container bound position on element');\n                        module.remove.offset();\n                        $module\n                            .removeClass(className.bound)\n                            .removeClass(className.top)\n                            .removeClass(className.bottom)\n                        ;\n                    }\n                },\n\n                unfix: function () {\n                    if (module.is.fixed()) {\n                        module.debug('Removing fixed position on element');\n                        module.remove.minimumSize();\n                        module.remove.offset();\n                        $module\n                            .removeClass(className.fixed)\n                            .removeClass(className.top)\n                            .removeClass(className.bottom)\n                        ;\n                        settings.onUnstick.call(element);\n                    }\n                },\n\n                reset: function () {\n                    module.debug('Resetting elements position');\n                    module.unbind();\n                    module.unfix();\n                    module.resetCSS();\n                    module.remove.offset();\n                    module.remove.lastScroll();\n                },\n\n                resetCSS: function () {\n                    $module\n                        .css({\n                            width: '',\n                            height: '',\n                        })\n                    ;\n                    $container\n                        .css({\n                            height: '',\n                        })\n                    ;\n                },\n\n                setting: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        settings[name] = value;\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 0);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.sticky.settings = {\n\n        name: 'Sticky',\n        namespace: 'sticky',\n\n        silent: false,\n        debug: false,\n        verbose: true,\n        performance: true,\n\n        // whether to stick in the opposite direction on scroll up\n        pushing: false,\n\n        context: false,\n        container: false,\n\n        // Context to watch scroll events\n        scrollContext: window,\n\n        // Offset to adjust scroll\n        offset: 0,\n\n        // Offset to adjust scroll when attached to bottom of screen\n        bottomOffset: 0,\n\n        // will only set container height if difference between context and container is larger than this number\n        jitter: 5,\n\n        // set width of sticky element when it is fixed to page (used to make sure 100% width is maintained if no fixed size set)\n        setSize: true,\n\n        // Whether to automatically observe changes with Mutation Observers\n        observeChanges: false,\n\n        // Called when position is recalculated\n        onReposition: function () {},\n\n        // Called on each scroll\n        onScroll: function () {},\n\n        // Called when element is stuck to viewport\n        onStick: function () {},\n\n        // Called when element is unstuck from viewport\n        onUnstick: function () {},\n\n        // Called when element reaches top of context\n        onTop: function () {},\n\n        // Called when element reaches bottom of context\n        onBottom: function () {},\n\n        error: {\n            visible: 'Element is hidden, you must call refresh after element becomes visible. Use silent setting to suppress this warning in production.',\n            method: 'The method you called is not defined.',\n            invalidContext: 'Context specified does not exist',\n            elementSize: 'Sticky element is larger than its container, cannot create sticky.',\n        },\n\n        className: {\n            bound: 'bound',\n            fixed: 'fixed',\n            supported: 'native',\n            top: 'top',\n            bottom: 'bottom',\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/tab.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Tab\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n           UI Tabs\n*******************************/\n\n.ui.tab {\n  display: none;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n\n/* --------------------\n       Active\n--------------------- */\n.ui.tab.active,\n.ui.tab.open {\n  display: block;\n}\n\n/* --------------------\n           Loading\n    --------------------- */\n.ui.tab.loading {\n  position: relative;\n  overflow: hidden;\n  display: block;\n  min-height: 250px;\n}\n.ui.tab.loading * {\n  position: relative !important;\n  left: -10000px !important;\n}\n.ui.tab.loading::before,\n.ui.tab.loading.segment::before {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -1.25em 0 0 -1.25em;\n  width: 2.5em;\n  height: 2.5em;\n  border-radius: 500rem;\n  border: 0.2em solid rgba(0, 0, 0, 0.1);\n}\n.ui.tab.loading::after,\n.ui.tab.loading.segment::after {\n  position: absolute;\n  content: \"\";\n  top: 50%;\n  left: 50%;\n  margin: -1.25em 0 0 -1.25em;\n  width: 2.5em;\n  height: 2.5em;\n  animation: loader 0.6s infinite linear;\n  border: 0.2em solid #767676;\n  border-radius: 500rem;\n  box-shadow: 0 0 0 1px transparent;\n}\n\n\n/*******************************\n         Tab Overrides\n*******************************/\n\n\n\n/*******************************\n        User Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/tab.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Tab\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isWindow(obj) {\n        return obj !== null && obj === obj.window;\n    }\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.tab = function (parameters) {\n        var\n            // use window context if none specified\n            $allModules     = isFunction(this)\n                ? $(window)\n                : $(this),\n            $document      = $(document),\n            time            = Date.now(),\n            performance     = [],\n\n            query           = arguments[0],\n            methodInvoked   = typeof query === 'string',\n            queryArguments  = [].slice.call(arguments, 1),\n            contextCheck   = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $(context);\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : window;\n                    }\n                }\n\n                return $context;\n            },\n            initializedHistory = false,\n            returnedValue\n        ;\n\n        $allModules.each(function () {\n            var\n                settings        = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.tab.settings, parameters)\n                    : $.extend({}, $.fn.tab.settings),\n\n                className       = settings.className,\n                metadata        = settings.metadata,\n                selector        = settings.selector,\n                error           = settings.error,\n                regExp          = settings.regExp,\n\n                eventNamespace  = '.' + settings.namespace,\n                moduleNamespace = 'module-' + settings.namespace,\n\n                $module         = $(this),\n                $context,\n                $tabs,\n\n                cache           = {},\n                firstLoad       = true,\n                recursionDepth  = 0,\n                element         = this,\n                instance        = $module.data(moduleNamespace),\n\n                activeTabPath,\n                parameterArray,\n                module,\n\n                historyEvent\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.debug('Initializing tab menu item', $module);\n                    module.determineTabs();\n\n                    module.debug('Determining tabs', settings.context, $tabs);\n                    // set up automatic routing\n                    if (settings.auto) {\n                        module.set.auto();\n                    }\n                    module.bind.events();\n\n                    if (settings.history && !initializedHistory) {\n                        settings.history = module.initializeHistory();\n                        initializedHistory = true;\n                    }\n\n                    var activeTab = module.determine.activeTab();\n                    if (settings.autoTabActivation && instance === undefined && activeTab === null) {\n                        activeTab = settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation;\n                        module.debug('No active tab detected, setting tab active', activeTab);\n                        module.changeTab(activeTab);\n                    }\n                    if (activeTab !== null && settings.history && settings.historyType === 'state') {\n                        var autoUpdate = $.address.autoUpdate();\n                        $.address.autoUpdate(false);\n                        $.address.value(activeTab);\n                        $.address.autoUpdate(autoUpdate);\n                    }\n\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                },\n\n                destroy: function () {\n                    module.debug('Destroying tabs', $module);\n                    $module\n                        .removeData(moduleNamespace)\n                        .off(eventNamespace)\n                    ;\n                },\n\n                bind: {\n                    events: function () {\n                        // if using $.tab don't add events\n                        if (!isWindow(element)) {\n                            module.debug('Attaching tab activation events to element', $module);\n                            $module\n                                .on('click' + eventNamespace, module.event.click)\n                            ;\n                        }\n                    },\n                },\n\n                determineTabs: function () {\n                    var\n                        $reference\n                    ;\n\n                    // determine tab context\n                    if (settings.context === 'parent') {\n                        if ($module.closest(selector.ui).length > 0) {\n                            $reference = $module.closest(selector.ui);\n                            module.verbose('Using closest UI element as parent', $reference);\n                        } else {\n                            $reference = $module;\n                        }\n                        $context = $reference.parent();\n                        module.verbose('Determined parent element for creating context', $context);\n                    } else if (settings.context) {\n                        $context = contextCheck(settings.context, window);\n                        module.verbose('Using selector for tab context', settings.context, $context);\n                    } else {\n                        $context = $('body');\n                    }\n                    // find tabs\n                    if (settings.childrenOnly) {\n                        $tabs = $context.children(selector.tabs);\n                        module.debug('Searching tab context children for tabs', $context, $tabs);\n                    } else {\n                        $tabs = $context.find(selector.tabs);\n                        module.debug('Searching tab context for tabs', $context, $tabs);\n                    }\n                },\n\n                initializeHistory: function () {\n                    module.debug('Initializing page state');\n                    if ($.address === undefined) {\n                        module.error(error.state);\n\n                        return false;\n                    }\n                    if (settings.historyType === 'state') {\n                        module.debug('Using HTML5 to manage state');\n                        if (settings.path !== false) {\n                            $.address\n                                .history(true)\n                                .state(settings.path)\n                            ;\n                            $(window).trigger('popstate');\n                        } else {\n                            module.error(error.path);\n\n                            return false;\n                        }\n                    }\n                    $.address\n                        .bind('change', module.event.history.change)\n                    ;\n\n                    return true;\n                },\n\n                event: {\n                    click: function (event) {\n                        var\n                            tabPath = $(this).data(metadata.tab)\n                        ;\n                        if (tabPath !== undefined) {\n                            if (settings.history) {\n                                module.verbose('Updating page state', event);\n                                $.address.value(tabPath);\n                            } else {\n                                module.verbose('Changing tab', event);\n                                module.changeTab(tabPath);\n                            }\n                            event.preventDefault();\n                        } else {\n                            module.debug('No tab specified');\n                        }\n                    },\n                    history: {\n                        change: function (event) {\n                            var\n                                tabPath   = event.pathNames.join('/') || module.get.initialPath(),\n                                pageTitle = settings.templates.determineTitle(tabPath) || false\n                            ;\n                            module.performance.display();\n                            module.debug('History change event', tabPath, event);\n                            historyEvent = event;\n                            if (tabPath !== undefined) {\n                                module.changeTab(tabPath);\n                            }\n                            if (pageTitle) {\n                                $.address.title(pageTitle);\n                            }\n                        },\n                    },\n                },\n\n                refresh: function () {\n                    if (activeTabPath) {\n                        module.debug('Refreshing tab', activeTabPath);\n                        module.changeTab(activeTabPath);\n                    }\n                },\n\n                cache: {\n\n                    read: function (cacheKey) {\n                        return cacheKey !== undefined\n                            ? cache[cacheKey]\n                            : false;\n                    },\n                    add: function (cacheKey, content) {\n                        cacheKey = cacheKey || activeTabPath;\n                        module.debug('Adding cached content for', cacheKey);\n                        cache[cacheKey] = content;\n                    },\n                    remove: function (cacheKey) {\n                        cacheKey = cacheKey || activeTabPath;\n                        module.debug('Removing cached content for', cacheKey);\n                        delete cache[cacheKey];\n                    },\n                },\n\n                escape: {\n                    string: function (text) {\n                        text = String(text);\n\n                        return text.replace(regExp.escape, '\\\\$&');\n                    },\n                },\n\n                set: {\n                    auto: function () {\n                        var\n                            url = typeof settings.path === 'string'\n                                ? settings.path.replace(/\\/$/, '') + '/{$tab}'\n                                : '/{$tab}'\n                        ;\n                        module.verbose('Setting up automatic tab retrieval from server', url);\n                        if ($.isPlainObject(settings.apiSettings)) {\n                            settings.apiSettings.url = url;\n                        } else {\n                            settings.apiSettings = {\n                                url: url,\n                            };\n                        }\n                    },\n                    loading: function (tabPath) {\n                        var\n                            $tab      = module.get.tabElement(tabPath),\n                            isLoading = $tab.hasClass(className.loading)\n                        ;\n                        if (!isLoading) {\n                            module.verbose('Setting loading state for', $tab);\n                            $tab\n                                .addClass(className.loading)\n                                .siblings($tabs)\n                                .removeClass(className.active + ' ' + className.loading)\n                            ;\n                            if ($tab.length > 0) {\n                                settings.onRequest.call($tab[0], tabPath);\n                            }\n                        }\n                    },\n                    state: function (state) {\n                        $.address.value(state);\n                    },\n                },\n\n                changeTab: function (tabPath) {\n                    var\n                        pushStateAvailable = window.history && window.history.pushState,\n                        shouldIgnoreLoad   = pushStateAvailable && settings.ignoreFirstLoad && firstLoad,\n                        remoteContent      = settings.auto || $.isPlainObject(settings.apiSettings),\n                        // only add default path if not remote content\n                        pathArray = remoteContent && !shouldIgnoreLoad\n                            ? module.utilities.pathToArray(tabPath)\n                            : module.get.defaultPathArray(tabPath)\n                    ;\n                    tabPath = module.utilities.arrayToPath(pathArray);\n                    $.each(pathArray, function (index, tab) {\n                        var\n                            currentPathArray   = pathArray.slice(0, index + 1),\n                            currentPath        = module.utilities.arrayToPath(currentPathArray),\n\n                            isTab              = module.is.tab(currentPath),\n                            isLastIndex        = index + 1 === pathArray.length,\n\n                            $tab               = module.get.tabElement(currentPath),\n                            $anchor,\n                            nextPathArray,\n                            nextPath,\n                            isLastTab\n                        ;\n                        module.verbose('Looking for tab', tab);\n                        if (isTab) {\n                            module.verbose('Tab was found', tab);\n                            // scope up\n                            activeTabPath = currentPath;\n                            parameterArray = module.utilities.filterArray(pathArray, currentPathArray);\n\n                            if (isLastIndex) {\n                                isLastTab = true;\n                            } else {\n                                nextPathArray = pathArray.slice(0, index + 2);\n                                nextPath = module.utilities.arrayToPath(nextPathArray);\n                                isLastTab = !module.is.tab(nextPath);\n                                if (isLastTab) {\n                                    module.verbose('Tab parameters found', nextPathArray);\n                                }\n                            }\n                            if (settings.onBeforeChange.call(element, currentPath) === false) {\n                                module.debug('onBeforeChange returned false, cancelling tab change', $tab);\n\n                                return false;\n                            }\n                            if (isLastTab && remoteContent) {\n                                if (!shouldIgnoreLoad) {\n                                    module.activate.navigation(currentPath);\n                                    module.fetch.content(currentPath, tabPath);\n                                } else {\n                                    module.debug('Ignoring remote content on first tab load', currentPath);\n                                    firstLoad = false;\n                                    module.cache.add(tabPath, $tab.html());\n                                    module.activate.all(currentPath);\n                                    settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n                                    settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n                                }\n\n                                return false;\n                            }\n\n                            module.debug('Opened local tab', currentPath);\n                            module.activate.all(currentPath);\n                            if (!module.cache.read(currentPath)) {\n                                module.cache.add(currentPath, true);\n                                module.debug('First time tab loaded calling tab init');\n                                settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n                            }\n                            settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n                        } else if (tabPath.search('/') === -1 && tabPath !== '') {\n                            // look for in page anchor\n                            tabPath = module.escape.string(tabPath);\n                            $anchor = $('#' + tabPath + ', a[name=\"' + tabPath + '\"]');\n                            currentPath = $anchor.closest('[data-tab]').data(metadata.tab);\n                            $tab = module.get.tabElement(currentPath);\n                            // if anchor exists use parent tab\n                            if ($anchor && $anchor.length > 0 && currentPath) {\n                                module.debug('Anchor link used, opening parent tab', $tab, $anchor);\n                                if (settings.onBeforeChange.call(element, currentPath) === false) {\n                                    module.debug('onBeforeChange returned false, cancelling tab change', $tab);\n\n                                    return false;\n                                }\n                                if (!$tab.hasClass(className.active)) {\n                                    setTimeout(function () {\n                                        module.scrollTo($anchor);\n                                    }, 0);\n                                }\n                                module.activate.all(currentPath);\n                                if (!module.cache.read(currentPath)) {\n                                    module.cache.add(currentPath, true);\n                                    module.debug('First time tab loaded calling tab init');\n                                    settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n                                }\n                                settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n\n                                return false;\n                            }\n                        } else {\n                            module.error(error.missingTab, $module, $context, currentPath);\n\n                            return false;\n                        }\n                    });\n                },\n\n                scrollTo: function ($element) {\n                    var\n                        scrollOffset = $element && $element.length > 0\n                            ? $element.offset().top\n                            : false\n                    ;\n                    if (scrollOffset !== false) {\n                        module.debug('Forcing scroll to an in-page link in a hidden tab', scrollOffset, $element);\n                        $document.scrollTop(scrollOffset);\n                    }\n                },\n\n                update: {\n                    content: function (tabPath, html, evaluateScripts) {\n                        var\n                            $tab = module.get.tabElement(tabPath),\n                            tab  = $tab[0]\n                        ;\n                        evaluateScripts = evaluateScripts !== undefined\n                            ? evaluateScripts\n                            : settings.evaluateScripts;\n                        if (typeof settings.cacheType === 'string' && settings.cacheType.toLowerCase() === 'dom' && typeof html !== 'string') {\n                            $tab\n                                .empty()\n                                .append($(html).clone(true))\n                            ;\n                        } else {\n                            if (evaluateScripts) {\n                                module.debug('Updating HTML and evaluating inline scripts', tabPath, html);\n                                $tab.html(html);\n                            } else {\n                                module.debug('Updating HTML', tabPath, html);\n                                tab.innerHTML = html;\n                            }\n                        }\n                    },\n                },\n\n                fetch: {\n\n                    content: function (tabPath, fullTabPath) {\n                        var\n                            $tab        = module.get.tabElement(tabPath),\n                            apiSettings = {\n                                dataType: 'html',\n                                encodeParameters: false,\n                                on: 'now',\n                                cache: settings.alwaysRefresh,\n                                headers: {\n                                    'X-Remote': true,\n                                },\n                                onSuccess: function (response) {\n                                    if (settings.cacheType === 'response') {\n                                        module.cache.add(fullTabPath, response);\n                                    }\n                                    module.update.content(tabPath, response);\n                                    if (tabPath == activeTabPath) {\n                                        module.debug('Content loaded', tabPath);\n                                        module.activate.tab(tabPath);\n                                    } else {\n                                        module.debug('Content loaded in background', tabPath);\n                                    }\n                                    settings.onFirstLoad.call($tab[0], tabPath, parameterArray, historyEvent);\n                                    settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);\n\n                                    if (settings.loadOnce) {\n                                        module.cache.add(fullTabPath, true);\n                                    } else if (typeof settings.cacheType === 'string' && settings.cacheType.toLowerCase() === 'dom' && $tab.children().length > 0) {\n                                        setTimeout(function () {\n                                            var\n                                                $clone = $tab.children().clone(true)\n                                            ;\n                                            $clone = $clone.not('script');\n                                            module.cache.add(fullTabPath, $clone);\n                                        }, 0);\n                                    } else {\n                                        module.cache.add(fullTabPath, $tab.html());\n                                    }\n                                },\n                                urlData: {\n                                    tab: fullTabPath,\n                                },\n                            },\n                            request         = $tab.api('get request') || false,\n                            existingRequest = request && request.state() === 'pending',\n                            requestSettings,\n                            cachedContent\n                        ;\n\n                        fullTabPath = fullTabPath || tabPath;\n                        cachedContent = module.cache.read(fullTabPath);\n\n                        if (settings.cache && cachedContent) {\n                            module.activate.tab(tabPath);\n                            module.debug('Adding cached content', fullTabPath);\n                            if (!settings.loadOnce) {\n                                if (settings.evaluateScripts === 'once') {\n                                    module.update.content(tabPath, cachedContent, false);\n                                } else {\n                                    module.update.content(tabPath, cachedContent);\n                                }\n                            }\n                            settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);\n                        } else if (existingRequest) {\n                            module.set.loading(tabPath);\n                            module.debug('Content is already loading', fullTabPath);\n                        } else if ($.api !== undefined) {\n                            requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings);\n                            module.debug('Retrieving remote content', fullTabPath, requestSettings);\n                            module.set.loading(tabPath);\n                            $tab.api(requestSettings);\n                        } else {\n                            module.error(error.api);\n                        }\n                    },\n                },\n\n                activate: {\n                    all: function (tabPath) {\n                        module.activate.tab(tabPath);\n                        module.activate.navigation(tabPath);\n                    },\n                    tab: function (tabPath) {\n                        var\n                            $tab          = module.get.tabElement(tabPath),\n                            $deactiveTabs = settings.deactivate === 'siblings'\n                                ? $tab.siblings($tabs)\n                                : $tabs.not($tab),\n                            isActive      = $tab.hasClass(className.active)\n                        ;\n                        module.verbose('Showing tab content for', $tab);\n                        if (!isActive) {\n                            $tab\n                                .addClass(className.active)\n                            ;\n                            $deactiveTabs\n                                .removeClass(className.active + ' ' + className.loading)\n                            ;\n                            if ($tab.length > 0) {\n                                settings.onVisible.call($tab[0], tabPath);\n                            }\n                        }\n                    },\n                    navigation: function (tabPath) {\n                        var\n                            $navigation         = module.get.navElement(tabPath),\n                            $deactiveNavigation = settings.deactivate === 'siblings'\n                                ? $navigation.siblings($allModules)\n                                : $allModules.not($navigation),\n                            isActive    = $navigation.hasClass(className.active)\n                        ;\n                        module.verbose('Activating tab navigation for', $navigation, tabPath);\n                        if (!isActive) {\n                            $navigation\n                                .addClass(className.active)\n                            ;\n                            $deactiveNavigation\n                                .removeClass(className.active + ' ' + className.loading)\n                            ;\n                        }\n                    },\n                },\n\n                deactivate: {\n                    all: function () {\n                        module.deactivate.navigation();\n                        module.deactivate.tabs();\n                    },\n                    navigation: function () {\n                        $allModules\n                            .removeClass(className.active)\n                        ;\n                    },\n                    tabs: function () {\n                        $tabs\n                            .removeClass(className.active + ' ' + className.loading)\n                        ;\n                    },\n                },\n\n                is: {\n                    tab: function (tabName) {\n                        return tabName !== undefined\n                            ? module.get.tabElement(tabName).length > 0\n                            : false;\n                    },\n                },\n\n                get: {\n                    initialPath: function () {\n                        return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab);\n                    },\n                    path: function () {\n                        return $.address.value();\n                    },\n                    // adds default tabs to tab path\n                    defaultPathArray: function (tabPath) {\n                        return module.utilities.pathToArray(module.get.defaultPath(tabPath));\n                    },\n                    defaultPath: function (tabPath) {\n                        var\n                            $defaultNav = $allModules.filter('[data-' + metadata.tab + '^=\"' + module.escape.string(tabPath) + '/\"]').eq(0),\n                            defaultTab  = $defaultNav.data(metadata.tab) || false\n                        ;\n                        if (defaultTab) {\n                            module.debug('Found default tab', defaultTab);\n                            if (recursionDepth < settings.maxDepth) {\n                                recursionDepth++;\n\n                                return module.get.defaultPath(defaultTab);\n                            }\n                            module.error(error.recursion);\n                        } else {\n                            module.debug('No default tabs found for', tabPath, $tabs);\n                        }\n                        recursionDepth = 0;\n\n                        return tabPath;\n                    },\n                    navElement: function (tabPath) {\n                        tabPath = tabPath || activeTabPath;\n\n                        return $allModules.filter('[data-' + metadata.tab + '=\"' + module.escape.string(tabPath) + '\"]');\n                    },\n                    tabElement: function (tabPath) {\n                        var\n                            $fullPathTab,\n                            $simplePathTab,\n                            tabPathArray,\n                            lastTab\n                        ;\n                        tabPath = tabPath || activeTabPath;\n                        tabPathArray = module.utilities.pathToArray(tabPath);\n                        lastTab = module.utilities.last(tabPathArray);\n                        $fullPathTab = $tabs.filter('[data-' + metadata.tab + '=\"' + module.escape.string(tabPath) + '\"]');\n                        $simplePathTab = $tabs.filter('[data-' + metadata.tab + '=\"' + module.escape.string(lastTab) + '\"]');\n\n                        return $fullPathTab.length > 0\n                            ? $fullPathTab\n                            : $simplePathTab;\n                    },\n                    tab: function () {\n                        return activeTabPath;\n                    },\n                },\n\n                determine: {\n                    activeTab: function () {\n                        var activeTab = null;\n\n                        $tabs.each(function (_index, tab) {\n                            var $tab = $(tab);\n\n                            if ($tab.hasClass(className.active)) {\n                                var\n                                    tabPath = $(this).data(metadata.tab),\n                                    $anchor = $allModules.filter('[data-' + metadata.tab + '=\"' + module.escape.string(tabPath) + '\"]')\n                                ;\n\n                                if ($anchor.hasClass(className.active)) {\n                                    activeTab = tabPath;\n                                }\n                            }\n                        });\n\n                        return activeTab;\n                    },\n                },\n\n                utilities: {\n                    filterArray: function (keepArray, removeArray) {\n                        return $.grep(keepArray, function (keepValue) {\n                            return $.inArray(keepValue, removeArray) === -1;\n                        });\n                    },\n                    last: function (array) {\n                        return Array.isArray(array)\n                            ? array[array.length - 1]\n                            : false;\n                    },\n                    pathToArray: function (pathName) {\n                        if (pathName === undefined) {\n                            pathName = activeTabPath;\n                        }\n\n                        return typeof pathName === 'string'\n                            ? pathName.split('/')\n                            : [pathName];\n                    },\n                    arrayToPath: function (pathArray) {\n                        return Array.isArray(pathArray)\n                            ? pathArray.join('/')\n                            : false;\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    // shortcut for tabbed content with no defined navigation\n    $.tab = function () {\n        $(window).tab.apply(this, arguments);\n    };\n\n    $.fn.tab.settings = {\n\n        name: 'Tab',\n        namespace: 'tab',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        auto: false, // uses pjax style endpoints fetching content from same url with remote-content headers\n        history: false, // use browser history\n        historyType: 'hash', // #/ or html5 state\n        path: false, // base path of url\n\n        context: false, // specify a context that tabs must appear inside\n        childrenOnly: false, // use only tabs that are children of context\n        maxDepth: 25, // max depth a tab can be nested\n\n        deactivate: 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together\n\n        alwaysRefresh: false, // load tab content new every tab click\n        cache: true, // cache the content requests to pull locally\n        loadOnce: false, // Whether tab data should only be loaded once when using remote content\n        cacheType: 'response', // Whether to cache exact response, or to html cache contents after scripts execute\n        ignoreFirstLoad: false, // don't load remote content on first load\n\n        apiSettings: false, // settings for api call\n        evaluateScripts: 'once', // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content\n        autoTabActivation: true, // whether a non existing active tab will auto activate the first available tab\n\n        onFirstLoad: function (tabPath, parameterArray, historyEvent) {}, // called first time loaded\n        onLoad: function (tabPath, parameterArray, historyEvent) {}, // called on every load\n        onVisible: function (tabPath, parameterArray, historyEvent) {}, // called every time tab visible\n        onRequest: function (tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content\n        onBeforeChange: function (tabPath) {}, // called before a tab is about to be changed. Returning false will cancel the tab change\n\n        templates: {\n            determineTitle: function (tabArray) {}, // returns page title for path\n        },\n\n        error: {\n            api: 'You attempted to load content without API module',\n            method: 'The method you called is not defined',\n            missingTab: 'Activated tab cannot be found. Tabs are case-sensitive.',\n            noContent: 'The tab you specified is missing a content url.',\n            path: 'History enabled, but no path was specified',\n            recursion: 'Max recursive depth reached',\n            state: 'History requires Asual\\'s Address library <https://github.com/asual/jquery-address>',\n        },\n\n        regExp: {\n            escape: /[\\s#$()*+,.:=?@[\\\\\\]^{|}-]/g,\n        },\n\n        metadata: {\n            tab: 'tab',\n            loaded: 'loaded',\n            promise: 'promise',\n        },\n\n        className: {\n            loading: 'loading',\n            active: 'active',\n        },\n\n        selector: {\n            tabs: '.ui.tab',\n            ui: '.ui',\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/table.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Table\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Table\n*******************************/\n\n\n/* Prototype */\n.ui.table {\n  width: 100%;\n  background: #fff;\n  margin: 1em 0;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  box-shadow: none;\n  border-radius: 0.28571429rem;\n  text-align: left;\n  vertical-align: middle;\n  color: rgba(0, 0, 0, 0.87);\n  border-collapse: separate;\n  border-spacing: 0;\n}\n.ui.table:first-child {\n  margin-top: 0;\n}\n.ui.table:last-child {\n  margin-bottom: 0;\n}\n.ui.table > thead,\n.ui.table > tbody {\n  text-align: inherit;\n  vertical-align: inherit;\n}\n\n\n/*******************************\n             Parts\n*******************************/\n\n\n/* Table Content */\n.ui.table th,\n.ui.table td {\n  transition: background 0.1s ease, color 0.1s ease;\n}\n\n/* Rowspan helper class */\n.ui.table th.rowspanned,\n.ui.table td.rowspanned {\n  display: none;\n}\n\n/* Headers */\n.ui.table > thead {\n  box-shadow: none;\n}\n.ui.table > thead > tr > th {\n  cursor: auto;\n  background: #f9fafb;\n  text-align: inherit;\n  color: rgba(0, 0, 0, 0.87);\n  padding: 0.92857143em 0.78571429em;\n  vertical-align: inherit;\n  font-style: none;\n  font-weight: bold;\n  text-transform: none;\n  border-bottom: 1px solid rgba(34, 36, 38, 0.1);\n  border-left: none;\n}\n.ui.table > thead > tr > th:first-child {\n  border-left: none;\n}\n.ui.table > thead > tr:first-child > th:first-child {\n  border-radius: 0.28571429rem 0 0 0;\n}\n.ui.table > thead > tr:first-child > th:last-child {\n  border-radius: 0 0.28571429rem 0 0;\n}\n.ui.table > thead > tr:first-child > th:only-child {\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n\n/* Footer */\n.ui.table > tfoot {\n  box-shadow: none;\n}\n.ui.table > tfoot > tr > th,\n.ui.table > tfoot > tr > td {\n  cursor: auto;\n  border-top: 1px solid rgba(34, 36, 38, 0.15);\n  background: #f9fafb;\n  text-align: inherit;\n  color: rgba(0, 0, 0, 0.87);\n  padding: 0.78571429em 0.78571429em;\n  vertical-align: inherit;\n  font-style: normal;\n  font-weight: normal;\n  text-transform: none;\n}\n.ui.table > tfoot > tr > th:first-child,\n.ui.table > tfoot > tr > td:first-child {\n  border-left: none;\n}\n.ui.table > tfoot > tr:last-child > th:first-child,\n.ui.table > tfoot > tr:last-child > td:first-child {\n  border-radius: 0 0 0 0.28571429rem;\n}\n.ui.table > tfoot > tr:last-child > th:last-child,\n.ui.table > tfoot > tr:last-child > td:last-child {\n  border-radius: 0 0 0.28571429rem 0;\n}\n.ui.table > tfoot > tr:last-child > th:only-child,\n.ui.table > tfoot > tr:last-child > td:only-child {\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n\n/* Table Row */\n.ui.table > tr > td,\n.ui.table > tbody > tr > td {\n  border-top: 1px solid rgba(34, 36, 38, 0.1);\n}\n.ui.table > tr:first-child > td,\n.ui.table > tbody > tr:first-child > td {\n  border-top: none;\n}\n\n/* Repeated tbody */\n.ui.table > tbody + tbody tr:first-child > td {\n  border-top: 1px solid rgba(34, 36, 38, 0.1);\n}\n\n/* Table Cells */\n.ui.table > tbody > tr > td,\n.ui.table > tr > td {\n  padding: 0.78571429em 0.78571429em;\n  text-align: inherit;\n}\n\n/* Icons */\n.ui.table > i.icon {\n  vertical-align: baseline;\n}\n.ui.table > i.icon:only-child {\n  margin: 0;\n}\n\n/* Table Segment */\n.ui.table.segment {\n  padding: 0;\n}\n.ui.table.segment::after {\n  display: none;\n}\n.ui.table.segment.stacked::after {\n  display: block;\n}\n\n/* Responsive */\n@media only screen and (max-width: 767.98px) {\n  .ui.table:not(.unstackable) {\n    width: 100%;\n    padding: 0;\n  }\n  .ui.table:not(.unstackable) > thead,\n  .ui.table:not(.unstackable) > thead > tr,\n  .ui.table:not(.unstackable) > tfoot,\n  .ui.table:not(.unstackable) > tfoot > tr,\n  .ui.table:not(.unstackable) > tbody,\n  .ui.table:not(.unstackable) > tr,\n  .ui.table:not(.unstackable) > tbody > tr,\n  .ui.table:not(.unstackable) > tr > th:not(.rowspanned),\n  .ui.table:not(.unstackable) > thead > tr > th:not(.rowspanned),\n  .ui.table:not(.unstackable) > tbody > tr > th:not(.rowspanned),\n  .ui.table:not(.unstackable) > tfoot > tr > th:not(.rowspanned),\n  .ui.table:not(.unstackable) > tr > td:not(.rowspanned),\n  .ui.table:not(.unstackable) > tbody > tr > td:not(.rowspanned),\n  .ui.table:not(.unstackable) > tfoot > tr > td:not(.rowspanned) {\n    display: block !important;\n    width: auto !important;\n  }\n  .ui.table:not(.unstackable) > thead {\n    display: block;\n  }\n  .ui.table:not(.unstackable) > tfoot {\n    display: block;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) > tr,\n  .ui.ui.ui.ui.table:not(.unstackable) > thead > tr,\n  .ui.ui.ui.ui.table:not(.unstackable) > tbody > tr,\n  .ui.ui.ui.ui.table:not(.unstackable) > tfoot > tr {\n    padding-top: 1em;\n    padding-bottom: 1em;\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) > tr > th,\n  .ui.ui.ui.ui.table:not(.unstackable) > thead > tr > th,\n  .ui.ui.ui.ui.table:not(.unstackable) > tbody > tr > th,\n  .ui.ui.ui.ui.table:not(.unstackable) > tfoot > tr > th,\n  .ui.ui.ui.ui.table:not(.unstackable) > tr > td,\n  .ui.ui.ui.ui.table:not(.unstackable) > tbody > tr > td,\n  .ui.ui.ui.ui.table:not(.unstackable) > tfoot > tr > td {\n    background: none;\n    border: none;\n    padding: 0.25em 0.75em;\n    box-shadow: none;\n  }\n  .ui.table:not(.unstackable) > tr > th:first-child,\n  .ui.table:not(.unstackable) > thead > tr > th:first-child,\n  .ui.table:not(.unstackable) > tbody > tr > th:first-child,\n  .ui.table:not(.unstackable) > tfoot > tr > th:first-child,\n  .ui.table:not(.unstackable) > tr > td:first-child,\n  .ui.table:not(.unstackable) > tbody > tr > td:first-child,\n  .ui.table:not(.unstackable) > tfoot > tr > td:first-child {\n    font-weight: bold;\n  }\n  \n/* Definition Table */\n  .ui.definition.table:not(.unstackable) > thead > tr > th:first-child {\n    box-shadow: none !important;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"primary marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185d0 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"primary marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185d0 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"primary marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54c8ff inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"primary marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54c8ff inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"secondary marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1b1c1d inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"secondary marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1b1c1d inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"secondary marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"secondary marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"red marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #db2828 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"red marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #db2828 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"red marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff695e inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"red marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff695e inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"orange marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #f2711c inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"orange marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #f2711c inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"orange marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff851b inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"orange marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff851b inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"yellow marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #fbbd08 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"yellow marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #fbbd08 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"yellow marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ffe21f inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"yellow marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ffe21f inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"olive marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #b5cc18 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"olive marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #b5cc18 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"olive marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #d9e778 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"olive marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #d9e778 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"green marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #21ba45 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"green marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #21ba45 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"green marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2ecc40 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"green marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2ecc40 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"teal marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #00b5ad inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"teal marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #00b5ad inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"teal marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6dffff inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"teal marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6dffff inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"blue marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185d0 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"blue marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185d0 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"blue marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54c8ff inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"blue marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54c8ff inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"violet marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6435c9 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"violet marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6435c9 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"violet marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a291fb inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"violet marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a291fb inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"purple marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a333c8 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"purple marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a333c8 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"purple marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #dc73ff inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"purple marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #dc73ff inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"pink marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #e03997 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"pink marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #e03997 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"pink marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff8edf inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"pink marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff8edf inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"brown marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a5673f inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"brown marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a5673f inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"brown marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #d67c1c inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"brown marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #d67c1c inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"grey marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #767676 inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"grey marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #767676 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"grey marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #dcddde inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"grey marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #dcddde inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"black marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1b1c1d inset;\n  }\n  .ui.ui.ui.ui.table:not(.unstackable) tr[class*=\"black marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1b1c1d inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"black marked\"].left {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;\n  }\n  .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*=\"black marked\"].right {\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;\n  }\n  .ui.scrolling.table.short > tbody {\n    max-height: 6.74983929em;\n  }\n  .resizable.ui.scrolling.table.short > tbody {\n    height: 6.74983929em;\n  }\n  .ui.scrolling.table[class*=\"very short\"] > tbody {\n    max-height: 4.49989286em;\n  }\n  .resizable.ui.scrolling.table[class*=\"very short\"] > tbody {\n    height: 4.49989286em;\n  }\n  .ui.scrolling.table > tbody {\n    max-height: 8.99978571em;\n  }\n  .resizable.ui.scrolling.table > tbody {\n    height: 8.99978571em;\n  }\n  .ui.scrolling.table.long > tbody {\n    max-height: 17.99957143em;\n  }\n  .resizable.ui.scrolling.table.long > tbody {\n    height: 17.99957143em;\n  }\n  .ui.scrolling.table[class*=\"very long\"] > tbody {\n    max-height: 26.99935714em;\n  }\n  .resizable.ui.scrolling.table[class*=\"very long\"] > tbody {\n    height: 26.99935714em;\n  }\n  .ui.overflowing.table.short {\n    max-height: 11.24973214em;\n  }\n  .ui.overflowing.table[class*=\"very short\"] {\n    max-height: 7.49982143em;\n  }\n  .ui.overflowing.table {\n    max-height: 14.99964286em;\n  }\n  .ui.overflowing.table.long {\n    max-height: 29.99928571em;\n  }\n  .ui.overflowing.table[class*=\"very long\"] {\n    max-height: 44.99892857em;\n  }\n}\n\n/* --------------\n      Scrolling\n    --------------- */\n@media only screen and (min-width: 768px) {\n  .ui.scrolling.table.short > tbody {\n    max-height: 8.99978571em;\n  }\n  .resizable.ui.scrolling.table.short > tbody {\n    height: 8.99978571em;\n  }\n  .ui.scrolling.table[class*=\"very short\"] > tbody {\n    max-height: 5.99985714em;\n  }\n  .resizable.ui.scrolling.table[class*=\"very short\"] > tbody {\n    height: 5.99985714em;\n  }\n  .ui.scrolling.table > tbody {\n    max-height: 11.99971429em;\n  }\n  .resizable.ui.scrolling.table > tbody {\n    height: 11.99971429em;\n  }\n  .ui.scrolling.table.long > tbody {\n    max-height: 23.99942857em;\n  }\n  .resizable.ui.scrolling.table.long > tbody {\n    height: 23.99942857em;\n  }\n  .ui.scrolling.table[class*=\"very long\"] > tbody {\n    max-height: 35.99914286em;\n  }\n  .resizable.ui.scrolling.table[class*=\"very long\"] > tbody {\n    height: 35.99914286em;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.scrolling.table.short > tbody {\n    max-height: 13.49967857em;\n  }\n  .resizable.ui.scrolling.table.short > tbody {\n    height: 13.49967857em;\n  }\n  .ui.scrolling.table[class*=\"very short\"] > tbody {\n    max-height: 8.99978571em;\n  }\n  .resizable.ui.scrolling.table[class*=\"very short\"] > tbody {\n    height: 8.99978571em;\n  }\n  .ui.scrolling.table > tbody {\n    max-height: 17.99957143em;\n  }\n  .resizable.ui.scrolling.table > tbody {\n    height: 17.99957143em;\n  }\n  .ui.scrolling.table.long > tbody {\n    max-height: 35.99914286em;\n  }\n  .resizable.ui.scrolling.table.long > tbody {\n    height: 35.99914286em;\n  }\n  .ui.scrolling.table[class*=\"very long\"] > tbody {\n    max-height: 53.99871429em;\n  }\n  .resizable.ui.scrolling.table[class*=\"very long\"] > tbody {\n    height: 53.99871429em;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.scrolling.table.short > tbody {\n    max-height: 17.99957143em;\n  }\n  .resizable.ui.scrolling.table.short > tbody {\n    height: 17.99957143em;\n  }\n  .ui.scrolling.table[class*=\"very short\"] > tbody {\n    max-height: 11.99971429em;\n  }\n  .resizable.ui.scrolling.table[class*=\"very short\"] > tbody {\n    height: 11.99971429em;\n  }\n  .ui.scrolling.table > tbody {\n    max-height: 23.99942857em;\n  }\n  .resizable.ui.scrolling.table > tbody {\n    height: 23.99942857em;\n  }\n  .ui.scrolling.table.long > tbody {\n    max-height: 47.99885714em;\n  }\n  .resizable.ui.scrolling.table.long > tbody {\n    height: 47.99885714em;\n  }\n  .ui.scrolling.table[class*=\"very long\"] > tbody {\n    max-height: 71.99828571em;\n  }\n  .resizable.ui.scrolling.table[class*=\"very long\"] > tbody {\n    height: 71.99828571em;\n  }\n}\n.ui.scrolling.table > thead,\n.ui.scrolling.table > tfoot,\n.ui.scrolling.table > tbody {\n  display: block;\n  overflow-y: scroll;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n}\n.ui.scrolling.table > thead > tr,\n.ui.scrolling.table > tfoot > tr,\n.ui.scrolling.table > tbody > tr {\n  display: table;\n  table-layout: fixed;\n  width: 100%;\n}\n@supports (-moz-appearance: none) {\n  .ui.scrolling.table > thead,\n  .ui.scrolling.table > tfoot,\n  .ui.scrolling.table > tbody {\n    scrollbar-width: thin;\n  }\n}\n\n/* Camouflage scrollbars, we need them only to gain the same width as tbody */\n.ui.scrolling.table > thead {\n  background: #f9fafb;\n  color: #f9fafb;\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.scrolling.table > tfoot {\n  background: #f9fafb;\n  color: #f9fafb;\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui.inverted.scrolling.table > thead {\n  background: rgba(0, 0, 0, 0.15);\n  color: rgba(0, 0, 0, 0.15);\n}\n.ui.inverted.scrolling.table > tfoot {\n  background: rgba(0, 0, 0, 0.15);\n  color: rgba(0, 0, 0, 0.15);\n}\n.ui.scrolling.table > thead::-webkit-scrollbar-track,\n.ui.scrolling.table > tfoot::-webkit-scrollbar-track {\n  background: inherit;\n  border-radius: 0.28571429rem;\n}\n@supports (-moz-appearance: none) {\n  .ui.scrolling.table > thead,\n  .ui.scrolling.table > tfoot {\n    scrollbar-color: currentColor currentColor;\n  }\n}\n\n/* IE scrollbar color needs hex values */\n@media all and (-ms-high-contrast: none) {\n  .ui.scrolling.table > thead,\n  .ui.scrolling.table > tfoot {\n    scrollbar-face-color: currentColor;\n    scrollbar-shadow-color: currentColor;\n    scrollbar-track-color: currentColor;\n    scrollbar-arrow-color: currentColor;\n  }\n  .ui.scrolling.table > thead {\n    color: #f9fafb;\n  }\n  .ui.scrolling.table > tfoot {\n    color: #f9fafb;\n  }\n  .ui.inverted.scrolling.table > thead {\n    color: #252525;\n  }\n  .ui.inverted.scrolling.table > tfoot {\n    color: #252525;\n  }\n}\n.ui.inverted.scrolling.table > tbody::-webkit-scrollbar-track {\n  background: rgba(255, 255, 255, 0.1);\n}\n.ui.inverted.scrolling.table > tbody::-webkit-scrollbar-thumb {\n  background: rgba(255, 255, 255, 0.25);\n}\n.ui.inverted.scrolling.table > tbody::-webkit-scrollbar-thumb:window-inactive {\n  background: rgba(255, 255, 255, 0.15);\n}\n.ui.inverted.scrolling.table > tbody::-webkit-scrollbar-thumb:hover {\n  background: rgba(255, 255, 255, 0.35);\n}\n.ui.inverted.scrolling.table > tbody {\n  \n/* IE11 */\n  scrollbar-face-color: #656565;\n  scrollbar-shadow-color: #656565;\n  scrollbar-track-color: #323232;\n  scrollbar-arrow-color: #323232;\n}\n@supports (-moz-appearance: none) {\n  .ui.inverted.scrolling.table > tbody {\n    \n/* firefox: first color thumb, second track */\n    scrollbar-color: rgba(255, 255, 255, 0.25) rgba(255, 255, 255, 0.1);\n  }\n}\n.ui.resizable.scrolling.table > tbody {\n  resize: vertical;\n  max-height: none;\n}\n\n/* --------------\n      Overflowing\n    --------------- */\n.ui.overflowing.table {\n  display: block;\n  overflow: auto;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n}\n@media only screen and (min-width: 768px) {\n  .ui.overflowing.table.short {\n    max-height: 13.49967857em;\n  }\n  .ui.overflowing.table[class*=\"very short\"] {\n    max-height: 8.99978571em;\n  }\n  .ui.overflowing.table {\n    max-height: 17.99957143em;\n  }\n  .ui.overflowing.table.long {\n    max-height: 35.99914286em;\n  }\n  .ui.overflowing.table[class*=\"very long\"] {\n    max-height: 53.99871429em;\n  }\n}\n@media only screen and (min-width: 992px) {\n  .ui.overflowing.table.short {\n    max-height: 17.99957143em;\n  }\n  .ui.overflowing.table[class*=\"very short\"] {\n    max-height: 11.99971429em;\n  }\n  .ui.overflowing.table {\n    max-height: 23.99942857em;\n  }\n  .ui.overflowing.table.long {\n    max-height: 47.99885714em;\n  }\n  .ui.overflowing.table[class*=\"very long\"] {\n    max-height: 71.99828571em;\n  }\n}\n@media only screen and (min-width: 1920px) {\n  .ui.overflowing.table.short {\n    max-height: 22.49946429em;\n  }\n  .ui.overflowing.table[class*=\"very short\"] {\n    max-height: 14.99964286em;\n  }\n  .ui.overflowing.table {\n    max-height: 29.99928571em;\n  }\n  .ui.overflowing.table.long {\n    max-height: 59.99857143em;\n  }\n  .ui.overflowing.table[class*=\"very long\"] {\n    max-height: 89.99785714em;\n  }\n}\n\n\n/*******************************\n            Coupling\n*******************************/\n\n\n/* UI Image */\n.ui.table .collapsing .image,\n.ui.table .collapsing .image img {\n  max-width: none;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/* --------------\n    Complex\n--------------- */\n.ui.structured.table {\n  border-collapse: collapse;\n}\n.ui.structured.table > thead > tr > th {\n  border-left: none;\n  border-right: none;\n}\n.ui.structured.sortable.table > thead > tr > th {\n  border-left: 1px solid rgba(34, 36, 38, 0.15);\n  border-right: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.structured.basic.table > tr > th,\n.ui.structured.basic.table > thead > tr > th,\n.ui.structured.basic.table > tbody > tr > th,\n.ui.structured.basic.table > tfoot > tr > th {\n  border-left: none;\n  border-right: none;\n}\n.ui.structured.celled.table > tr > th,\n.ui.structured.celled.table > thead > tr > th,\n.ui.structured.celled.table > tbody > tr > th,\n.ui.structured.celled.table > tfoot > tr > th,\n.ui.structured.celled.table > tr > td,\n.ui.structured.celled.table > tbody > tr > td,\n.ui.structured.celled.table > tfoot > tr > td {\n  border-left: 1px solid rgba(34, 36, 38, 0.1);\n  border-right: 1px solid rgba(34, 36, 38, 0.1);\n}\n\n/* --------------\n       Definition\n    --------------- */\n.ui.definition.table > thead:not(.full-width) > tr > th:first-child {\n  pointer-events: none;\n  background: #fff;\n  font-weight: normal;\n  color: rgba(0, 0, 0, 0.4);\n  box-shadow: -0.1em -0.2em 0 0.1em #fff;\n  -moz-transform: scale(1);\n}\n.ui.definition.table > thead:not(.full-width) > tr > th:first-child:not(:empty) {\n  pointer-events: auto;\n}\n.ui.definition.table > tfoot:not(.full-width) > tr > th:first-child {\n  pointer-events: none;\n  background: #fff;\n  font-weight: normal;\n  color: rgba(0, 0, 0, 0.4);\n  box-shadow: -0.1em 0.2em 0 0.1em #fff;\n  -moz-transform: scale(1);\n}\n\n/* Highlight Defining Column */\n.ui.definition.table > tr > td:first-child:not(.ignored),\n.ui.definition.table > tbody > tr > td:first-child:not(.ignored),\n.ui.definition.table > tfoot > tr > td:first-child:not(.ignored),\n.ui.definition.table tr td.definition {\n  background: rgba(0, 0, 0, 0.03);\n  font-weight: bold;\n  color: rgba(0, 0, 0, 0.95);\n  text-transform: \"\";\n  box-shadow: \"\";\n  text-align: \"\";\n  font-size: 1em;\n  padding-left: \"\";\n  padding-right: \"\";\n}\n\n/* Fix 2nd Column */\n.ui.definition.table > thead:not(.full-width) > tr > th:nth-child(2) {\n  border-left: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.definition.table > tfoot:not(.full-width) > tr > th:nth-child(2),\n.ui.definition.table > tfoot:not(.full-width) > tr > td:nth-child(2) {\n  border-left: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.definition.table > tr > td:nth-child(2),\n.ui.definition.table > tbody > tr > td:nth-child(2) {\n  border-left: 1px solid rgba(34, 36, 38, 0.15);\n}\n\n\n/*******************************\n             States\n*******************************/\n\n\n/* --------------\n        Positive\n    --------------- */\n.ui.ui.ui.ui.table tr.positive,\n.ui.ui.table td.positive {\n  box-shadow: 0 0 0 #a3c293 inset;\n  background: #fcfff5;\n  color: #2c662d;\n}\n.ui.ui.ui.ui.inverted.table tr.positive,\n.ui.ui.inverted.table td.positive {\n  background: #a3c293;\n  color: #2c662d;\n}\n\n/* --------------\n         Negative\n    --------------- */\n.ui.ui.ui.ui.table tr.negative,\n.ui.ui.table td.negative {\n  box-shadow: 0 0 0 #e0b4b4 inset;\n  background: #fff6f6;\n  color: #9f3a38;\n}\n.ui.ui.ui.ui.inverted.table tr.negative,\n.ui.ui.inverted.table td.negative {\n  background: #e0b4b4;\n  color: #9f3a38;\n}\n\n/* --------------\n          Error\n    --------------- */\n.ui.ui.ui.ui.table tr.error,\n.ui.ui.table td.error {\n  box-shadow: 0 0 0 #e0b4b4 inset;\n  background: #fff6f6;\n  color: #9f3a38;\n}\n.ui.ui.ui.ui.inverted.table tr.error,\n.ui.ui.inverted.table td.error {\n  background: #e0b4b4;\n  color: #9f3a38;\n}\n\n/* --------------\n         Warning\n    --------------- */\n.ui.ui.ui.ui.table tr.warning,\n.ui.ui.table td.warning {\n  box-shadow: 0 0 0 #c9ba9b inset;\n  background: #fffaf3;\n  color: #573a08;\n}\n.ui.ui.ui.ui.inverted.table tr.warning,\n.ui.ui.inverted.table td.warning {\n  background: #eec97e;\n  color: #573a08;\n}\n\n/* --------------\n         Active\n    --------------- */\n.ui.ui.ui.ui.table tr.active,\n.ui.ui.table td.active {\n  box-shadow: 0 0 0 rgba(0, 0, 0, 0.87) inset;\n  background: #e0e0e0;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.ui.ui.ui.inverted.table tr.active,\n.ui.ui.inverted.table td.active {\n  background: #a0a0a0;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n/* --------------\n         Disabled\n    --------------- */\n.ui.ui.ui.table tr.disabled td,\n.ui.ui.ui.table tr td.disabled,\n.ui.table tr.disabled:hover,\n.ui.table tr:hover td.disabled {\n  pointer-events: none;\n  color: rgba(40, 40, 40, 0.3);\n}\n\n\n/*******************************\n          Variations\n*******************************/\n\n\n/* --------------\n        Stackable\n    --------------- */\n@media only screen and (max-width: 991.98px) {\n  .ui[class*=\"tablet stackable\"].table,\n  .ui[class*=\"tablet stackable\"].table > thead,\n  .ui[class*=\"tablet stackable\"].table > thead > tr,\n  .ui[class*=\"tablet stackable\"].table > tfoot,\n  .ui[class*=\"tablet stackable\"].table > tfoot > tr,\n  .ui[class*=\"tablet stackable\"].table > tbody,\n  .ui[class*=\"tablet stackable\"].table > tbody > tr,\n  .ui[class*=\"tablet stackable\"].table > tr,\n  .ui[class*=\"tablet stackable\"].table > thead > tr > th:not(.rowspanned),\n  .ui[class*=\"tablet stackable\"].table > tbody > tr > th:not(.rowspanned),\n  .ui[class*=\"tablet stackable\"].table > tfoot > tr > th:not(.rowspanned),\n  .ui[class*=\"tablet stackable\"].table > tr > th:not(.rowspanned),\n  .ui[class*=\"tablet stackable\"].table > tbody > tr > td:not(.rowspanned),\n  .ui[class*=\"tablet stackable\"].table > tfoot > tr > td:not(.rowspanned),\n  .ui[class*=\"tablet stackable\"].table > tr > td:not(.rowspanned) {\n    display: block !important;\n    width: 100% !important;\n  }\n  .ui[class*=\"tablet stackable\"].table {\n    padding: 0;\n  }\n  .ui[class*=\"tablet stackable\"].table > thead {\n    display: block;\n  }\n  .ui[class*=\"tablet stackable\"].table > tfoot {\n    display: block;\n  }\n  .ui.ui.ui.ui[class*=\"tablet stackable\"].table > thead > tr,\n  .ui.ui.ui.ui[class*=\"tablet stackable\"].table > tbody > tr,\n  .ui.ui.ui.ui[class*=\"tablet stackable\"].table > tfoot > tr,\n  .ui.ui.ui.ui[class*=\"tablet stackable\"].table > tr {\n    padding-top: 1em;\n    padding-bottom: 1em;\n    box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset;\n  }\n  .ui[class*=\"tablet stackable\"].table > thead > tr > th,\n  .ui[class*=\"tablet stackable\"].table > tbody > tr > th,\n  .ui[class*=\"tablet stackable\"].table > tfoot > tr > th,\n  .ui[class*=\"tablet stackable\"].table > tr > th,\n  .ui[class*=\"tablet stackable\"].table > tbody > tr > td,\n  .ui[class*=\"tablet stackable\"].table > tfoot > tr > td,\n  .ui[class*=\"tablet stackable\"].table > tr > td {\n    background: none;\n    border: none !important;\n    padding: 0.25em 0.75em;\n    box-shadow: none;\n  }\n  \n/* Definition Table */\n  .ui.definition[class*=\"tablet stackable\"].table > thead > tr > th:first-child {\n    box-shadow: none !important;\n  }\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"primary marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185d0 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"primary marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185d0 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"primary marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54c8ff inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"primary marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54c8ff inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"secondary marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1b1c1d inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"secondary marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1b1c1d inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"secondary marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"secondary marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"red marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #db2828 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"red marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #db2828 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"red marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff695e inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"red marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff695e inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"orange marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #f2711c inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"orange marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #f2711c inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"orange marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff851b inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"orange marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff851b inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"yellow marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #fbbd08 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"yellow marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #fbbd08 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"yellow marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ffe21f inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"yellow marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ffe21f inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"olive marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #b5cc18 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"olive marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #b5cc18 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"olive marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #d9e778 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"olive marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #d9e778 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"green marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #21ba45 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"green marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #21ba45 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"green marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2ecc40 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"green marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2ecc40 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"teal marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #00b5ad inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"teal marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #00b5ad inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"teal marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6dffff inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"teal marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6dffff inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"blue marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185d0 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"blue marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185d0 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"blue marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54c8ff inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"blue marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54c8ff inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"violet marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6435c9 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"violet marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6435c9 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"violet marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a291fb inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"violet marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a291fb inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"purple marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a333c8 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"purple marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a333c8 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"purple marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #dc73ff inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"purple marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #dc73ff inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"pink marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #e03997 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"pink marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #e03997 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"pink marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff8edf inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"pink marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff8edf inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"brown marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a5673f inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"brown marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a5673f inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"brown marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #d67c1c inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"brown marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #d67c1c inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"grey marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #767676 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"grey marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #767676 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"grey marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #dcddde inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"grey marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #dcddde inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"black marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1b1c1d inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].table tr[class*=\"black marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1b1c1d inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"black marked\"].left {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;\n}\n.ui.ui.ui.ui[class*=\"tablet stackable\"].inverted.table tr[class*=\"black marked\"].right {\n  box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;\n}\n\n/* --------------\n     Text Alignment\n    --------------- */\n.ui.table[class*=\"left aligned\"],\n.ui.table [class*=\"left aligned\"] {\n  text-align: left;\n}\n.ui.table[class*=\"center aligned\"],\n.ui.table [class*=\"center aligned\"] {\n  text-align: center;\n}\n.ui.table[class*=\"right aligned\"],\n.ui.table [class*=\"right aligned\"] {\n  text-align: right;\n}\n\n/* ------------------\n     Vertical Alignment\n    ------------------ */\n.ui.table[class*=\"top aligned\"],\n.ui.table [class*=\"top aligned\"] {\n  vertical-align: top;\n}\n.ui.table[class*=\"middle aligned\"],\n.ui.table [class*=\"middle aligned\"] {\n  vertical-align: middle;\n}\n.ui.table[class*=\"bottom aligned\"],\n.ui.table [class*=\"bottom aligned\"] {\n  vertical-align: bottom;\n}\n\n/* --------------\n        Collapsing\n    --------------- */\n.ui.table th.collapsing,\n.ui.table td.collapsing {\n  width: 1px;\n  white-space: nowrap;\n}\n\n/* --------------\n         Fixed\n    --------------- */\n.ui.fixed.table {\n  table-layout: fixed;\n}\n.ui.fixed.table th,\n.ui.fixed.table td {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n/* --------------\n       Selectable\n    --------------- */\n.ui.ui.selectable.table > tbody > tr:hover,\n.ui.table tbody tr td.selectable:hover {\n  background: rgba(0, 0, 0, 0.05);\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.ui.selectable.inverted.table > tbody > tr:hover,\n.ui.inverted.table tbody tr td.selectable:hover {\n  background: rgba(255, 255, 255, 0.08);\n  color: #ffffff;\n}\n\n/* Selectable Cell Link */\n.ui.table tbody tr td.selectable {\n  padding: 0;\n}\n.ui.table tbody tr td.selectable > a:not(.ui) {\n  display: block;\n  color: inherit;\n}\n.ui.table:not(.compact) tbody tr td.selectable > a:not(.ui) {\n  padding: 0.78571429em 0.78571429em;\n}\n.ui.table > tr > td.selectable,\n.ui.table > tbody > tr > td.selectable,\n.ui.selectable.table > tbody > tr,\n.ui.selectable.table > tr {\n  cursor: pointer;\n}\n\n/* Other States */\n.ui.ui.selectable.table tr.error:hover,\n.ui.table tr td.selectable.error:hover,\n.ui.selectable.table tr:hover td.error {\n  background: #ffe7e7;\n  color: #943634;\n}\n.ui.ui.selectable.table tr.warning:hover,\n.ui.table tr td.selectable.warning:hover,\n.ui.selectable.table tr:hover td.warning {\n  background: #fff4e4;\n  color: #493107;\n}\n.ui.ui.selectable.table tr.active:hover,\n.ui.table tr td.selectable.active:hover,\n.ui.selectable.table tr:hover td.active {\n  background: #e0e0e0;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.ui.selectable.table tr.positive:hover,\n.ui.table tr td.selectable.positive:hover,\n.ui.selectable.table tr:hover td.positive {\n  background: #f7ffe6;\n  color: #275b28;\n}\n.ui.ui.selectable.table tr.negative:hover,\n.ui.table tr td.selectable.negative:hover,\n.ui.selectable.table tr:hover td.negative {\n  background: #ffe7e7;\n  color: #943634;\n}\n\n/* -------------------\n          Attached\n    -------------------- */\n\n/* Middle */\n.ui.attached.table {\n  top: 0;\n  bottom: 0;\n  border-radius: 0;\n  margin: 0 -1px;\n  width: calc(100% + 2px);\n  max-width: calc(100% + 2px);\n  box-shadow: none;\n  border: 1px solid #d4d4d5;\n}\n.ui.attached + .ui.attached.table:not(.top) {\n  border-top: none;\n}\n\n/* Top */\n.ui[class*=\"top attached\"].table {\n  bottom: 0;\n  margin-bottom: 0;\n  top: 0;\n  margin-top: 1em;\n  border-radius: 0.28571429rem 0.28571429rem 0 0;\n}\n.ui.table[class*=\"top attached\"]:first-child {\n  margin-top: 0;\n}\n\n/* Bottom */\n.ui[class*=\"bottom attached\"].table {\n  bottom: 0;\n  margin-top: 0;\n  top: 0;\n  margin-bottom: 1em;\n  box-shadow: none;\n  border-radius: 0 0 0.28571429rem 0.28571429rem;\n}\n.ui[class*=\"bottom attached\"].table:last-child {\n  margin-bottom: 0;\n}\n\n/* --------------\n         Striped\n    --------------- */\n\n/* Table Striping */\n.ui.striped.table > tr:nth-child(2n),\n.ui.striped.table > tbody > tr:nth-child(2n) {\n  background-color: rgba(0, 0, 50, 0.02);\n}\n\n/* Stripes */\n.ui.inverted.striped.table > tr:nth-child(2n),\n.ui.inverted.striped.table > tbody > tr:nth-child(2n) {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n\n/* Allow striped active hover */\n.ui.striped.selectable.selectable.selectable.table tbody tr.active:hover {\n  background: #efefef;\n  color: rgba(0, 0, 0, 0.95);\n}\n\n/* --------------\n   Single Line\n--------------- */\n.ui.table[class*=\"single line\"],\n.ui.table [class*=\"single line\"] {\n  white-space: nowrap;\n}\n\n/* -------------------\n       Colors\n-------------------- */\n.ui.primary.table {\n  border-top: 0.2em solid #2185d0;\n}\n.ui.inverted.primary.table {\n  background: #2185d0;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.primary,\n.ui.scrolling.table > tfoot.primary {\n  background: #ddf4ff;\n  color: #ddf4ff;\n}\n.ui.scrolling.table > thead.primary > tr > th,\n.ui.scrolling.table > tfoot.primary > tr > th,\n.ui.scrolling.table > thead.primary > tr > td,\n.ui.scrolling.table > tfoot.primary > tr > td {\n  background: inherit;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.scrolling.table > thead.primary,\n.ui.inverted.scrolling.table > tfoot.primary {\n  background: #2185d0;\n  color: #2185d0;\n}\n.ui.inverted.scrolling.table > thead.primary > tr > th,\n.ui.inverted.scrolling.table > tfoot.primary > tr > th,\n.ui.inverted.scrolling.table > thead.primary > tr > td,\n.ui.inverted.scrolling.table > tfoot.primary > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"primary colored\"],\n.ui.ui.table th[class*=\"primary colored\"],\n.ui.ui.table td[class*=\"primary colored\"],\n.ui.ui.ui.ui.table tr.primary:not(.marked),\n.ui.ui.table th.primary:not(.marked),\n.ui.ui.table td.primary:not(.marked) {\n  background: #ddf4ff;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.table > thead > tr[class*=\"primary colored\"] > th,\n.ui.table > tfoot > tr[class*=\"primary colored\"] > th,\n.ui.table > tfoot > tr[class*=\"primary colored\"] > td,\n.ui.table > thead > tr.primary:not(.marked) > th,\n.ui.table > tfoot > tr.primary:not(.marked) > th,\n.ui.table > tfoot > tr.primary:not(.marked) > td {\n  background: inherit;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"primary colored\"],\n.ui.ui.inverted.table th[class*=\"primary colored\"],\n.ui.ui.inverted.table td[class*=\"primary colored\"],\n.ui.ui.ui.ui.inverted.table tr.primary:not(.marked),\n.ui.ui.inverted.table th.primary:not(.marked),\n.ui.ui.inverted.table td.primary:not(.marked) {\n  background: #2185d0;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"primary colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"primary colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"primary colored\"] > td,\n.ui.inverted.table > thead > tr.primary:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.primary:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.primary:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"primary colored\"]:hover,\n.ui.table tr td.selectable[class*=\"primary colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"primary colored\"],\n.ui.ui.selectable.table tr.primary:not(.marked):hover,\n.ui.table tr td.selectable.primary:not(.marked):hover,\n.ui.selectable.table tr:hover td.primary:not(.marked) {\n  background: #d3f1ff;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.ui.inverted.selectable.table tr[class*=\"primary colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"primary colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"primary colored\"],\n.ui.ui.inverted.selectable.table tr.primary:not(.marked):hover,\n.ui.inverted.table tr td.selectable.primary:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.primary:not(.marked) {\n  background: #21b8ff;\n  color: #fff;\n}\n.ui.table td[class*=\"primary marked\"].left,\n.ui.table tr[class*=\"primary marked\"].left {\n  box-shadow: 0.2em 0 0 0 #2185d0 inset;\n}\n.ui.table td[class*=\"primary marked\"].right,\n.ui.table tr[class*=\"primary marked\"].right {\n  box-shadow: -0.2em 0 0 0 #2185d0 inset;\n}\n.ui.inverted.table td[class*=\"primary marked\"].left,\n.ui.inverted.table tr[class*=\"primary marked\"].left {\n  box-shadow: 0.2em 0 0 0 #54c8ff inset;\n}\n.ui.inverted.table td[class*=\"primary marked\"].right,\n.ui.inverted.table tr[class*=\"primary marked\"].right {\n  box-shadow: -0.2em 0 0 0 #54c8ff inset;\n}\n.ui.secondary.table {\n  border-top: 0.2em solid #1b1c1d;\n}\n.ui.inverted.secondary.table {\n  background: #1b1c1d;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.secondary,\n.ui.scrolling.table > tfoot.secondary {\n  background: #dddddd;\n  color: #dddddd;\n}\n.ui.scrolling.table > thead.secondary > tr > th,\n.ui.scrolling.table > tfoot.secondary > tr > th,\n.ui.scrolling.table > thead.secondary > tr > td,\n.ui.scrolling.table > tfoot.secondary > tr > td {\n  background: inherit;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.scrolling.table > thead.secondary,\n.ui.inverted.scrolling.table > tfoot.secondary {\n  background: #1b1c1d;\n  color: #1b1c1d;\n}\n.ui.inverted.scrolling.table > thead.secondary > tr > th,\n.ui.inverted.scrolling.table > tfoot.secondary > tr > th,\n.ui.inverted.scrolling.table > thead.secondary > tr > td,\n.ui.inverted.scrolling.table > tfoot.secondary > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"secondary colored\"],\n.ui.ui.table th[class*=\"secondary colored\"],\n.ui.ui.table td[class*=\"secondary colored\"],\n.ui.ui.ui.ui.table tr.secondary:not(.marked),\n.ui.ui.table th.secondary:not(.marked),\n.ui.ui.table td.secondary:not(.marked) {\n  background: #dddddd;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.table > thead > tr[class*=\"secondary colored\"] > th,\n.ui.table > tfoot > tr[class*=\"secondary colored\"] > th,\n.ui.table > tfoot > tr[class*=\"secondary colored\"] > td,\n.ui.table > thead > tr.secondary:not(.marked) > th,\n.ui.table > tfoot > tr.secondary:not(.marked) > th,\n.ui.table > tfoot > tr.secondary:not(.marked) > td {\n  background: inherit;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"secondary colored\"],\n.ui.ui.inverted.table th[class*=\"secondary colored\"],\n.ui.ui.inverted.table td[class*=\"secondary colored\"],\n.ui.ui.ui.ui.inverted.table tr.secondary:not(.marked),\n.ui.ui.inverted.table th.secondary:not(.marked),\n.ui.ui.inverted.table td.secondary:not(.marked) {\n  background: #1b1c1d;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"secondary colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"secondary colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"secondary colored\"] > td,\n.ui.inverted.table > thead > tr.secondary:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.secondary:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.secondary:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"secondary colored\"]:hover,\n.ui.table tr td.selectable[class*=\"secondary colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"secondary colored\"],\n.ui.ui.selectable.table tr.secondary:not(.marked):hover,\n.ui.table tr td.selectable.secondary:not(.marked):hover,\n.ui.selectable.table tr:hover td.secondary:not(.marked) {\n  background: #e2e2e2;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.ui.inverted.selectable.table tr[class*=\"secondary colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"secondary colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"secondary colored\"],\n.ui.ui.inverted.selectable.table tr.secondary:not(.marked):hover,\n.ui.inverted.table tr td.selectable.secondary:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.secondary:not(.marked) {\n  background: #6e6e6e;\n  color: #fff;\n}\n.ui.table td[class*=\"secondary marked\"].left,\n.ui.table tr[class*=\"secondary marked\"].left {\n  box-shadow: 0.2em 0 0 0 #1b1c1d inset;\n}\n.ui.table td[class*=\"secondary marked\"].right,\n.ui.table tr[class*=\"secondary marked\"].right {\n  box-shadow: -0.2em 0 0 0 #1b1c1d inset;\n}\n.ui.inverted.table td[class*=\"secondary marked\"].left,\n.ui.inverted.table tr[class*=\"secondary marked\"].left {\n  box-shadow: 0.2em 0 0 0 #545454 inset;\n}\n.ui.inverted.table td[class*=\"secondary marked\"].right,\n.ui.inverted.table tr[class*=\"secondary marked\"].right {\n  box-shadow: -0.2em 0 0 0 #545454 inset;\n}\n.ui.red.table {\n  border-top: 0.2em solid #db2828;\n}\n.ui.inverted.red.table {\n  background: #db2828;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.red,\n.ui.scrolling.table > tfoot.red {\n  background: #ffe1df;\n  color: #ffe1df;\n}\n.ui.scrolling.table > thead.red > tr > th,\n.ui.scrolling.table > tfoot.red > tr > th,\n.ui.scrolling.table > thead.red > tr > td,\n.ui.scrolling.table > tfoot.red > tr > td {\n  background: inherit;\n  color: #db2828;\n}\n.ui.inverted.scrolling.table > thead.red,\n.ui.inverted.scrolling.table > tfoot.red {\n  background: #db2828;\n  color: #db2828;\n}\n.ui.inverted.scrolling.table > thead.red > tr > th,\n.ui.inverted.scrolling.table > tfoot.red > tr > th,\n.ui.inverted.scrolling.table > thead.red > tr > td,\n.ui.inverted.scrolling.table > tfoot.red > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"red colored\"],\n.ui.ui.table th[class*=\"red colored\"],\n.ui.ui.table td[class*=\"red colored\"],\n.ui.ui.ui.ui.table tr.red:not(.marked),\n.ui.ui.table th.red:not(.marked),\n.ui.ui.table td.red:not(.marked) {\n  background: #ffe1df;\n  color: #db2828;\n}\n.ui.table > thead > tr[class*=\"red colored\"] > th,\n.ui.table > tfoot > tr[class*=\"red colored\"] > th,\n.ui.table > tfoot > tr[class*=\"red colored\"] > td,\n.ui.table > thead > tr.red:not(.marked) > th,\n.ui.table > tfoot > tr.red:not(.marked) > th,\n.ui.table > tfoot > tr.red:not(.marked) > td {\n  background: inherit;\n  color: #db2828;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"red colored\"],\n.ui.ui.inverted.table th[class*=\"red colored\"],\n.ui.ui.inverted.table td[class*=\"red colored\"],\n.ui.ui.ui.ui.inverted.table tr.red:not(.marked),\n.ui.ui.inverted.table th.red:not(.marked),\n.ui.ui.inverted.table td.red:not(.marked) {\n  background: #db2828;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"red colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"red colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"red colored\"] > td,\n.ui.inverted.table > thead > tr.red:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.red:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.red:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"red colored\"]:hover,\n.ui.table tr td.selectable[class*=\"red colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"red colored\"],\n.ui.ui.selectable.table tr.red:not(.marked):hover,\n.ui.table tr td.selectable.red:not(.marked):hover,\n.ui.selectable.table tr:hover td.red:not(.marked) {\n  background: #ffd7d5;\n  color: #db2828;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"red colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"red colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"red colored\"],\n.ui.ui.inverted.selectable.table tr.red:not(.marked):hover,\n.ui.inverted.table tr td.selectable.red:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.red:not(.marked) {\n  background: #ff392b;\n  color: #fff;\n}\n.ui.table td[class*=\"red marked\"].left,\n.ui.table tr[class*=\"red marked\"].left {\n  box-shadow: 0.2em 0 0 0 #db2828 inset;\n}\n.ui.table td[class*=\"red marked\"].right,\n.ui.table tr[class*=\"red marked\"].right {\n  box-shadow: -0.2em 0 0 0 #db2828 inset;\n}\n.ui.inverted.table td[class*=\"red marked\"].left,\n.ui.inverted.table tr[class*=\"red marked\"].left {\n  box-shadow: 0.2em 0 0 0 #ff695e inset;\n}\n.ui.inverted.table td[class*=\"red marked\"].right,\n.ui.inverted.table tr[class*=\"red marked\"].right {\n  box-shadow: -0.2em 0 0 0 #ff695e inset;\n}\n.ui.orange.table {\n  border-top: 0.2em solid #f2711c;\n}\n.ui.inverted.orange.table {\n  background: #f2711c;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.orange,\n.ui.scrolling.table > tfoot.orange {\n  background: #ffe7d1;\n  color: #ffe7d1;\n}\n.ui.scrolling.table > thead.orange > tr > th,\n.ui.scrolling.table > tfoot.orange > tr > th,\n.ui.scrolling.table > thead.orange > tr > td,\n.ui.scrolling.table > tfoot.orange > tr > td {\n  background: inherit;\n  color: #f2711c;\n}\n.ui.inverted.scrolling.table > thead.orange,\n.ui.inverted.scrolling.table > tfoot.orange {\n  background: #f2711c;\n  color: #f2711c;\n}\n.ui.inverted.scrolling.table > thead.orange > tr > th,\n.ui.inverted.scrolling.table > tfoot.orange > tr > th,\n.ui.inverted.scrolling.table > thead.orange > tr > td,\n.ui.inverted.scrolling.table > tfoot.orange > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"orange colored\"],\n.ui.ui.table th[class*=\"orange colored\"],\n.ui.ui.table td[class*=\"orange colored\"],\n.ui.ui.ui.ui.table tr.orange:not(.marked),\n.ui.ui.table th.orange:not(.marked),\n.ui.ui.table td.orange:not(.marked) {\n  background: #ffe7d1;\n  color: #f2711c;\n}\n.ui.table > thead > tr[class*=\"orange colored\"] > th,\n.ui.table > tfoot > tr[class*=\"orange colored\"] > th,\n.ui.table > tfoot > tr[class*=\"orange colored\"] > td,\n.ui.table > thead > tr.orange:not(.marked) > th,\n.ui.table > tfoot > tr.orange:not(.marked) > th,\n.ui.table > tfoot > tr.orange:not(.marked) > td {\n  background: inherit;\n  color: #f2711c;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"orange colored\"],\n.ui.ui.inverted.table th[class*=\"orange colored\"],\n.ui.ui.inverted.table td[class*=\"orange colored\"],\n.ui.ui.ui.ui.inverted.table tr.orange:not(.marked),\n.ui.ui.inverted.table th.orange:not(.marked),\n.ui.ui.inverted.table td.orange:not(.marked) {\n  background: #f2711c;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"orange colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"orange colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"orange colored\"] > td,\n.ui.inverted.table > thead > tr.orange:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.orange:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.orange:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"orange colored\"]:hover,\n.ui.table tr td.selectable[class*=\"orange colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"orange colored\"],\n.ui.ui.selectable.table tr.orange:not(.marked):hover,\n.ui.table tr td.selectable.orange:not(.marked):hover,\n.ui.selectable.table tr:hover td.orange:not(.marked) {\n  background: #fae1cc;\n  color: #f2711c;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"orange colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"orange colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"orange colored\"],\n.ui.ui.inverted.selectable.table tr.orange:not(.marked):hover,\n.ui.inverted.table tr td.selectable.orange:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.orange:not(.marked) {\n  background: #e76b00;\n  color: #fff;\n}\n.ui.table td[class*=\"orange marked\"].left,\n.ui.table tr[class*=\"orange marked\"].left {\n  box-shadow: 0.2em 0 0 0 #f2711c inset;\n}\n.ui.table td[class*=\"orange marked\"].right,\n.ui.table tr[class*=\"orange marked\"].right {\n  box-shadow: -0.2em 0 0 0 #f2711c inset;\n}\n.ui.inverted.table td[class*=\"orange marked\"].left,\n.ui.inverted.table tr[class*=\"orange marked\"].left {\n  box-shadow: 0.2em 0 0 0 #ff851b inset;\n}\n.ui.inverted.table td[class*=\"orange marked\"].right,\n.ui.inverted.table tr[class*=\"orange marked\"].right {\n  box-shadow: -0.2em 0 0 0 #ff851b inset;\n}\n.ui.yellow.table {\n  border-top: 0.2em solid #fbbd08;\n}\n.ui.inverted.yellow.table {\n  background: #fbbd08;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.yellow,\n.ui.scrolling.table > tfoot.yellow {\n  background: #fff9d2;\n  color: #fff9d2;\n}\n.ui.scrolling.table > thead.yellow > tr > th,\n.ui.scrolling.table > tfoot.yellow > tr > th,\n.ui.scrolling.table > thead.yellow > tr > td,\n.ui.scrolling.table > tfoot.yellow > tr > td {\n  background: inherit;\n  color: #b58105;\n}\n.ui.inverted.scrolling.table > thead.yellow,\n.ui.inverted.scrolling.table > tfoot.yellow {\n  background: #fbbd08;\n  color: #fbbd08;\n}\n.ui.inverted.scrolling.table > thead.yellow > tr > th,\n.ui.inverted.scrolling.table > tfoot.yellow > tr > th,\n.ui.inverted.scrolling.table > thead.yellow > tr > td,\n.ui.inverted.scrolling.table > tfoot.yellow > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"yellow colored\"],\n.ui.ui.table th[class*=\"yellow colored\"],\n.ui.ui.table td[class*=\"yellow colored\"],\n.ui.ui.ui.ui.table tr.yellow:not(.marked),\n.ui.ui.table th.yellow:not(.marked),\n.ui.ui.table td.yellow:not(.marked) {\n  background: #fff9d2;\n  color: #b58105;\n}\n.ui.table > thead > tr[class*=\"yellow colored\"] > th,\n.ui.table > tfoot > tr[class*=\"yellow colored\"] > th,\n.ui.table > tfoot > tr[class*=\"yellow colored\"] > td,\n.ui.table > thead > tr.yellow:not(.marked) > th,\n.ui.table > tfoot > tr.yellow:not(.marked) > th,\n.ui.table > tfoot > tr.yellow:not(.marked) > td {\n  background: inherit;\n  color: #b58105;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"yellow colored\"],\n.ui.ui.inverted.table th[class*=\"yellow colored\"],\n.ui.ui.inverted.table td[class*=\"yellow colored\"],\n.ui.ui.ui.ui.inverted.table tr.yellow:not(.marked),\n.ui.ui.inverted.table th.yellow:not(.marked),\n.ui.ui.inverted.table td.yellow:not(.marked) {\n  background: #fbbd08;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"yellow colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"yellow colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"yellow colored\"] > td,\n.ui.inverted.table > thead > tr.yellow:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.yellow:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.yellow:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"yellow colored\"]:hover,\n.ui.table tr td.selectable[class*=\"yellow colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"yellow colored\"],\n.ui.ui.selectable.table tr.yellow:not(.marked):hover,\n.ui.table tr td.selectable.yellow:not(.marked):hover,\n.ui.selectable.table tr:hover td.yellow:not(.marked) {\n  background: #fbf5cc;\n  color: #b58105;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"yellow colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"yellow colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"yellow colored\"],\n.ui.ui.inverted.selectable.table tr.yellow:not(.marked):hover,\n.ui.inverted.table tr td.selectable.yellow:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.yellow:not(.marked) {\n  background: #ebcd00;\n  color: #fff;\n}\n.ui.table td[class*=\"yellow marked\"].left,\n.ui.table tr[class*=\"yellow marked\"].left {\n  box-shadow: 0.2em 0 0 0 #fbbd08 inset;\n}\n.ui.table td[class*=\"yellow marked\"].right,\n.ui.table tr[class*=\"yellow marked\"].right {\n  box-shadow: -0.2em 0 0 0 #fbbd08 inset;\n}\n.ui.inverted.table td[class*=\"yellow marked\"].left,\n.ui.inverted.table tr[class*=\"yellow marked\"].left {\n  box-shadow: 0.2em 0 0 0 #ffe21f inset;\n}\n.ui.inverted.table td[class*=\"yellow marked\"].right,\n.ui.inverted.table tr[class*=\"yellow marked\"].right {\n  box-shadow: -0.2em 0 0 0 #ffe21f inset;\n}\n.ui.olive.table {\n  border-top: 0.2em solid #b5cc18;\n}\n.ui.inverted.olive.table {\n  background: #b5cc18;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.olive,\n.ui.scrolling.table > tfoot.olive {\n  background: #f7fae4;\n  color: #f7fae4;\n}\n.ui.scrolling.table > thead.olive > tr > th,\n.ui.scrolling.table > tfoot.olive > tr > th,\n.ui.scrolling.table > thead.olive > tr > td,\n.ui.scrolling.table > tfoot.olive > tr > td {\n  background: inherit;\n  color: #8abc1e;\n}\n.ui.inverted.scrolling.table > thead.olive,\n.ui.inverted.scrolling.table > tfoot.olive {\n  background: #b5cc18;\n  color: #b5cc18;\n}\n.ui.inverted.scrolling.table > thead.olive > tr > th,\n.ui.inverted.scrolling.table > tfoot.olive > tr > th,\n.ui.inverted.scrolling.table > thead.olive > tr > td,\n.ui.inverted.scrolling.table > tfoot.olive > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"olive colored\"],\n.ui.ui.table th[class*=\"olive colored\"],\n.ui.ui.table td[class*=\"olive colored\"],\n.ui.ui.ui.ui.table tr.olive:not(.marked),\n.ui.ui.table th.olive:not(.marked),\n.ui.ui.table td.olive:not(.marked) {\n  background: #f7fae4;\n  color: #8abc1e;\n}\n.ui.table > thead > tr[class*=\"olive colored\"] > th,\n.ui.table > tfoot > tr[class*=\"olive colored\"] > th,\n.ui.table > tfoot > tr[class*=\"olive colored\"] > td,\n.ui.table > thead > tr.olive:not(.marked) > th,\n.ui.table > tfoot > tr.olive:not(.marked) > th,\n.ui.table > tfoot > tr.olive:not(.marked) > td {\n  background: inherit;\n  color: #8abc1e;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"olive colored\"],\n.ui.ui.inverted.table th[class*=\"olive colored\"],\n.ui.ui.inverted.table td[class*=\"olive colored\"],\n.ui.ui.ui.ui.inverted.table tr.olive:not(.marked),\n.ui.ui.inverted.table th.olive:not(.marked),\n.ui.ui.inverted.table td.olive:not(.marked) {\n  background: #b5cc18;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"olive colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"olive colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"olive colored\"] > td,\n.ui.inverted.table > thead > tr.olive:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.olive:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.olive:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"olive colored\"]:hover,\n.ui.table tr td.selectable[class*=\"olive colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"olive colored\"],\n.ui.ui.selectable.table tr.olive:not(.marked):hover,\n.ui.table tr td.selectable.olive:not(.marked):hover,\n.ui.selectable.table tr:hover td.olive:not(.marked) {\n  background: #f6fada;\n  color: #8abc1e;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"olive colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"olive colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"olive colored\"],\n.ui.ui.inverted.selectable.table tr.olive:not(.marked):hover,\n.ui.inverted.table tr td.selectable.olive:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.olive:not(.marked) {\n  background: #d2e745;\n  color: #fff;\n}\n.ui.table td[class*=\"olive marked\"].left,\n.ui.table tr[class*=\"olive marked\"].left {\n  box-shadow: 0.2em 0 0 0 #b5cc18 inset;\n}\n.ui.table td[class*=\"olive marked\"].right,\n.ui.table tr[class*=\"olive marked\"].right {\n  box-shadow: -0.2em 0 0 0 #b5cc18 inset;\n}\n.ui.inverted.table td[class*=\"olive marked\"].left,\n.ui.inverted.table tr[class*=\"olive marked\"].left {\n  box-shadow: 0.2em 0 0 0 #d9e778 inset;\n}\n.ui.inverted.table td[class*=\"olive marked\"].right,\n.ui.inverted.table tr[class*=\"olive marked\"].right {\n  box-shadow: -0.2em 0 0 0 #d9e778 inset;\n}\n.ui.green.table {\n  border-top: 0.2em solid #21ba45;\n}\n.ui.inverted.green.table {\n  background: #21ba45;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.green,\n.ui.scrolling.table > tfoot.green {\n  background: #d5f5d9;\n  color: #d5f5d9;\n}\n.ui.scrolling.table > thead.green > tr > th,\n.ui.scrolling.table > tfoot.green > tr > th,\n.ui.scrolling.table > thead.green > tr > td,\n.ui.scrolling.table > tfoot.green > tr > td {\n  background: inherit;\n  color: #1ebc30;\n}\n.ui.inverted.scrolling.table > thead.green,\n.ui.inverted.scrolling.table > tfoot.green {\n  background: #21ba45;\n  color: #21ba45;\n}\n.ui.inverted.scrolling.table > thead.green > tr > th,\n.ui.inverted.scrolling.table > tfoot.green > tr > th,\n.ui.inverted.scrolling.table > thead.green > tr > td,\n.ui.inverted.scrolling.table > tfoot.green > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"green colored\"],\n.ui.ui.table th[class*=\"green colored\"],\n.ui.ui.table td[class*=\"green colored\"],\n.ui.ui.ui.ui.table tr.green:not(.marked),\n.ui.ui.table th.green:not(.marked),\n.ui.ui.table td.green:not(.marked) {\n  background: #d5f5d9;\n  color: #1ebc30;\n}\n.ui.table > thead > tr[class*=\"green colored\"] > th,\n.ui.table > tfoot > tr[class*=\"green colored\"] > th,\n.ui.table > tfoot > tr[class*=\"green colored\"] > td,\n.ui.table > thead > tr.green:not(.marked) > th,\n.ui.table > tfoot > tr.green:not(.marked) > th,\n.ui.table > tfoot > tr.green:not(.marked) > td {\n  background: inherit;\n  color: #1ebc30;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"green colored\"],\n.ui.ui.inverted.table th[class*=\"green colored\"],\n.ui.ui.inverted.table td[class*=\"green colored\"],\n.ui.ui.ui.ui.inverted.table tr.green:not(.marked),\n.ui.ui.inverted.table th.green:not(.marked),\n.ui.ui.inverted.table td.green:not(.marked) {\n  background: #21ba45;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"green colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"green colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"green colored\"] > td,\n.ui.inverted.table > thead > tr.green:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.green:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.green:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"green colored\"]:hover,\n.ui.table tr td.selectable[class*=\"green colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"green colored\"],\n.ui.ui.selectable.table tr.green:not(.marked):hover,\n.ui.table tr td.selectable.green:not(.marked):hover,\n.ui.selectable.table tr:hover td.green:not(.marked) {\n  background: #d2eed5;\n  color: #1ebc30;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"green colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"green colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"green colored\"],\n.ui.ui.inverted.selectable.table tr.green:not(.marked):hover,\n.ui.inverted.table tr td.selectable.green:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.green:not(.marked) {\n  background: #1ea92e;\n  color: #fff;\n}\n.ui.table td[class*=\"green marked\"].left,\n.ui.table tr[class*=\"green marked\"].left {\n  box-shadow: 0.2em 0 0 0 #21ba45 inset;\n}\n.ui.table td[class*=\"green marked\"].right,\n.ui.table tr[class*=\"green marked\"].right {\n  box-shadow: -0.2em 0 0 0 #21ba45 inset;\n}\n.ui.inverted.table td[class*=\"green marked\"].left,\n.ui.inverted.table tr[class*=\"green marked\"].left {\n  box-shadow: 0.2em 0 0 0 #2ecc40 inset;\n}\n.ui.inverted.table td[class*=\"green marked\"].right,\n.ui.inverted.table tr[class*=\"green marked\"].right {\n  box-shadow: -0.2em 0 0 0 #2ecc40 inset;\n}\n.ui.teal.table {\n  border-top: 0.2em solid #00b5ad;\n}\n.ui.inverted.teal.table {\n  background: #00b5ad;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.teal,\n.ui.scrolling.table > tfoot.teal {\n  background: #e2ffff;\n  color: #e2ffff;\n}\n.ui.scrolling.table > thead.teal > tr > th,\n.ui.scrolling.table > tfoot.teal > tr > th,\n.ui.scrolling.table > thead.teal > tr > td,\n.ui.scrolling.table > tfoot.teal > tr > td {\n  background: inherit;\n  color: #10a3a3;\n}\n.ui.inverted.scrolling.table > thead.teal,\n.ui.inverted.scrolling.table > tfoot.teal {\n  background: #00b5ad;\n  color: #00b5ad;\n}\n.ui.inverted.scrolling.table > thead.teal > tr > th,\n.ui.inverted.scrolling.table > tfoot.teal > tr > th,\n.ui.inverted.scrolling.table > thead.teal > tr > td,\n.ui.inverted.scrolling.table > tfoot.teal > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"teal colored\"],\n.ui.ui.table th[class*=\"teal colored\"],\n.ui.ui.table td[class*=\"teal colored\"],\n.ui.ui.ui.ui.table tr.teal:not(.marked),\n.ui.ui.table th.teal:not(.marked),\n.ui.ui.table td.teal:not(.marked) {\n  background: #e2ffff;\n  color: #10a3a3;\n}\n.ui.table > thead > tr[class*=\"teal colored\"] > th,\n.ui.table > tfoot > tr[class*=\"teal colored\"] > th,\n.ui.table > tfoot > tr[class*=\"teal colored\"] > td,\n.ui.table > thead > tr.teal:not(.marked) > th,\n.ui.table > tfoot > tr.teal:not(.marked) > th,\n.ui.table > tfoot > tr.teal:not(.marked) > td {\n  background: inherit;\n  color: #10a3a3;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"teal colored\"],\n.ui.ui.inverted.table th[class*=\"teal colored\"],\n.ui.ui.inverted.table td[class*=\"teal colored\"],\n.ui.ui.ui.ui.inverted.table tr.teal:not(.marked),\n.ui.ui.inverted.table th.teal:not(.marked),\n.ui.ui.inverted.table td.teal:not(.marked) {\n  background: #00b5ad;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"teal colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"teal colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"teal colored\"] > td,\n.ui.inverted.table > thead > tr.teal:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.teal:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.teal:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"teal colored\"]:hover,\n.ui.table tr td.selectable[class*=\"teal colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"teal colored\"],\n.ui.ui.selectable.table tr.teal:not(.marked):hover,\n.ui.table tr td.selectable.teal:not(.marked):hover,\n.ui.selectable.table tr:hover td.teal:not(.marked) {\n  background: #d8ffff;\n  color: #10a3a3;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"teal colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"teal colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"teal colored\"],\n.ui.ui.inverted.selectable.table tr.teal:not(.marked):hover,\n.ui.inverted.table tr td.selectable.teal:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.teal:not(.marked) {\n  background: #3affff;\n  color: #fff;\n}\n.ui.table td[class*=\"teal marked\"].left,\n.ui.table tr[class*=\"teal marked\"].left {\n  box-shadow: 0.2em 0 0 0 #00b5ad inset;\n}\n.ui.table td[class*=\"teal marked\"].right,\n.ui.table tr[class*=\"teal marked\"].right {\n  box-shadow: -0.2em 0 0 0 #00b5ad inset;\n}\n.ui.inverted.table td[class*=\"teal marked\"].left,\n.ui.inverted.table tr[class*=\"teal marked\"].left {\n  box-shadow: 0.2em 0 0 0 #6dffff inset;\n}\n.ui.inverted.table td[class*=\"teal marked\"].right,\n.ui.inverted.table tr[class*=\"teal marked\"].right {\n  box-shadow: -0.2em 0 0 0 #6dffff inset;\n}\n.ui.blue.table {\n  border-top: 0.2em solid #2185d0;\n}\n.ui.inverted.blue.table {\n  background: #2185d0;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.blue,\n.ui.scrolling.table > tfoot.blue {\n  background: #ddf4ff;\n  color: #ddf4ff;\n}\n.ui.scrolling.table > thead.blue > tr > th,\n.ui.scrolling.table > tfoot.blue > tr > th,\n.ui.scrolling.table > thead.blue > tr > td,\n.ui.scrolling.table > tfoot.blue > tr > td {\n  background: inherit;\n  color: #2185d0;\n}\n.ui.inverted.scrolling.table > thead.blue,\n.ui.inverted.scrolling.table > tfoot.blue {\n  background: #2185d0;\n  color: #2185d0;\n}\n.ui.inverted.scrolling.table > thead.blue > tr > th,\n.ui.inverted.scrolling.table > tfoot.blue > tr > th,\n.ui.inverted.scrolling.table > thead.blue > tr > td,\n.ui.inverted.scrolling.table > tfoot.blue > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"blue colored\"],\n.ui.ui.table th[class*=\"blue colored\"],\n.ui.ui.table td[class*=\"blue colored\"],\n.ui.ui.ui.ui.table tr.blue:not(.marked),\n.ui.ui.table th.blue:not(.marked),\n.ui.ui.table td.blue:not(.marked) {\n  background: #ddf4ff;\n  color: #2185d0;\n}\n.ui.table > thead > tr[class*=\"blue colored\"] > th,\n.ui.table > tfoot > tr[class*=\"blue colored\"] > th,\n.ui.table > tfoot > tr[class*=\"blue colored\"] > td,\n.ui.table > thead > tr.blue:not(.marked) > th,\n.ui.table > tfoot > tr.blue:not(.marked) > th,\n.ui.table > tfoot > tr.blue:not(.marked) > td {\n  background: inherit;\n  color: #2185d0;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"blue colored\"],\n.ui.ui.inverted.table th[class*=\"blue colored\"],\n.ui.ui.inverted.table td[class*=\"blue colored\"],\n.ui.ui.ui.ui.inverted.table tr.blue:not(.marked),\n.ui.ui.inverted.table th.blue:not(.marked),\n.ui.ui.inverted.table td.blue:not(.marked) {\n  background: #2185d0;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"blue colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"blue colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"blue colored\"] > td,\n.ui.inverted.table > thead > tr.blue:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.blue:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.blue:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"blue colored\"]:hover,\n.ui.table tr td.selectable[class*=\"blue colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"blue colored\"],\n.ui.ui.selectable.table tr.blue:not(.marked):hover,\n.ui.table tr td.selectable.blue:not(.marked):hover,\n.ui.selectable.table tr:hover td.blue:not(.marked) {\n  background: #d3f1ff;\n  color: #2185d0;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"blue colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"blue colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"blue colored\"],\n.ui.ui.inverted.selectable.table tr.blue:not(.marked):hover,\n.ui.inverted.table tr td.selectable.blue:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.blue:not(.marked) {\n  background: #21b8ff;\n  color: #fff;\n}\n.ui.table td[class*=\"blue marked\"].left,\n.ui.table tr[class*=\"blue marked\"].left {\n  box-shadow: 0.2em 0 0 0 #2185d0 inset;\n}\n.ui.table td[class*=\"blue marked\"].right,\n.ui.table tr[class*=\"blue marked\"].right {\n  box-shadow: -0.2em 0 0 0 #2185d0 inset;\n}\n.ui.inverted.table td[class*=\"blue marked\"].left,\n.ui.inverted.table tr[class*=\"blue marked\"].left {\n  box-shadow: 0.2em 0 0 0 #54c8ff inset;\n}\n.ui.inverted.table td[class*=\"blue marked\"].right,\n.ui.inverted.table tr[class*=\"blue marked\"].right {\n  box-shadow: -0.2em 0 0 0 #54c8ff inset;\n}\n.ui.violet.table {\n  border-top: 0.2em solid #6435c9;\n}\n.ui.inverted.violet.table {\n  background: #6435c9;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.violet,\n.ui.scrolling.table > tfoot.violet {\n  background: #ece9fe;\n  color: #ece9fe;\n}\n.ui.scrolling.table > thead.violet > tr > th,\n.ui.scrolling.table > tfoot.violet > tr > th,\n.ui.scrolling.table > thead.violet > tr > td,\n.ui.scrolling.table > tfoot.violet > tr > td {\n  background: inherit;\n  color: #6435c9;\n}\n.ui.inverted.scrolling.table > thead.violet,\n.ui.inverted.scrolling.table > tfoot.violet {\n  background: #6435c9;\n  color: #6435c9;\n}\n.ui.inverted.scrolling.table > thead.violet > tr > th,\n.ui.inverted.scrolling.table > tfoot.violet > tr > th,\n.ui.inverted.scrolling.table > thead.violet > tr > td,\n.ui.inverted.scrolling.table > tfoot.violet > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"violet colored\"],\n.ui.ui.table th[class*=\"violet colored\"],\n.ui.ui.table td[class*=\"violet colored\"],\n.ui.ui.ui.ui.table tr.violet:not(.marked),\n.ui.ui.table th.violet:not(.marked),\n.ui.ui.table td.violet:not(.marked) {\n  background: #ece9fe;\n  color: #6435c9;\n}\n.ui.table > thead > tr[class*=\"violet colored\"] > th,\n.ui.table > tfoot > tr[class*=\"violet colored\"] > th,\n.ui.table > tfoot > tr[class*=\"violet colored\"] > td,\n.ui.table > thead > tr.violet:not(.marked) > th,\n.ui.table > tfoot > tr.violet:not(.marked) > th,\n.ui.table > tfoot > tr.violet:not(.marked) > td {\n  background: inherit;\n  color: #6435c9;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"violet colored\"],\n.ui.ui.inverted.table th[class*=\"violet colored\"],\n.ui.ui.inverted.table td[class*=\"violet colored\"],\n.ui.ui.ui.ui.inverted.table tr.violet:not(.marked),\n.ui.ui.inverted.table th.violet:not(.marked),\n.ui.ui.inverted.table td.violet:not(.marked) {\n  background: #6435c9;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"violet colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"violet colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"violet colored\"] > td,\n.ui.inverted.table > thead > tr.violet:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.violet:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.violet:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"violet colored\"]:hover,\n.ui.table tr td.selectable[class*=\"violet colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"violet colored\"],\n.ui.ui.selectable.table tr.violet:not(.marked):hover,\n.ui.table tr td.selectable.violet:not(.marked):hover,\n.ui.selectable.table tr:hover td.violet:not(.marked) {\n  background: #e3deff;\n  color: #6435c9;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"violet colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"violet colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"violet colored\"],\n.ui.ui.inverted.selectable.table tr.violet:not(.marked):hover,\n.ui.inverted.table tr td.selectable.violet:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.violet:not(.marked) {\n  background: #745aff;\n  color: #fff;\n}\n.ui.table td[class*=\"violet marked\"].left,\n.ui.table tr[class*=\"violet marked\"].left {\n  box-shadow: 0.2em 0 0 0 #6435c9 inset;\n}\n.ui.table td[class*=\"violet marked\"].right,\n.ui.table tr[class*=\"violet marked\"].right {\n  box-shadow: -0.2em 0 0 0 #6435c9 inset;\n}\n.ui.inverted.table td[class*=\"violet marked\"].left,\n.ui.inverted.table tr[class*=\"violet marked\"].left {\n  box-shadow: 0.2em 0 0 0 #a291fb inset;\n}\n.ui.inverted.table td[class*=\"violet marked\"].right,\n.ui.inverted.table tr[class*=\"violet marked\"].right {\n  box-shadow: -0.2em 0 0 0 #a291fb inset;\n}\n.ui.purple.table {\n  border-top: 0.2em solid #a333c8;\n}\n.ui.inverted.purple.table {\n  background: #a333c8;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.purple,\n.ui.scrolling.table > tfoot.purple {\n  background: #f8e3ff;\n  color: #f8e3ff;\n}\n.ui.scrolling.table > thead.purple > tr > th,\n.ui.scrolling.table > tfoot.purple > tr > th,\n.ui.scrolling.table > thead.purple > tr > td,\n.ui.scrolling.table > tfoot.purple > tr > td {\n  background: inherit;\n  color: #a333c8;\n}\n.ui.inverted.scrolling.table > thead.purple,\n.ui.inverted.scrolling.table > tfoot.purple {\n  background: #a333c8;\n  color: #a333c8;\n}\n.ui.inverted.scrolling.table > thead.purple > tr > th,\n.ui.inverted.scrolling.table > tfoot.purple > tr > th,\n.ui.inverted.scrolling.table > thead.purple > tr > td,\n.ui.inverted.scrolling.table > tfoot.purple > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"purple colored\"],\n.ui.ui.table th[class*=\"purple colored\"],\n.ui.ui.table td[class*=\"purple colored\"],\n.ui.ui.ui.ui.table tr.purple:not(.marked),\n.ui.ui.table th.purple:not(.marked),\n.ui.ui.table td.purple:not(.marked) {\n  background: #f8e3ff;\n  color: #a333c8;\n}\n.ui.table > thead > tr[class*=\"purple colored\"] > th,\n.ui.table > tfoot > tr[class*=\"purple colored\"] > th,\n.ui.table > tfoot > tr[class*=\"purple colored\"] > td,\n.ui.table > thead > tr.purple:not(.marked) > th,\n.ui.table > tfoot > tr.purple:not(.marked) > th,\n.ui.table > tfoot > tr.purple:not(.marked) > td {\n  background: inherit;\n  color: #a333c8;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"purple colored\"],\n.ui.ui.inverted.table th[class*=\"purple colored\"],\n.ui.ui.inverted.table td[class*=\"purple colored\"],\n.ui.ui.ui.ui.inverted.table tr.purple:not(.marked),\n.ui.ui.inverted.table th.purple:not(.marked),\n.ui.ui.inverted.table td.purple:not(.marked) {\n  background: #a333c8;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"purple colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"purple colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"purple colored\"] > td,\n.ui.inverted.table > thead > tr.purple:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.purple:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.purple:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"purple colored\"]:hover,\n.ui.table tr td.selectable[class*=\"purple colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"purple colored\"],\n.ui.ui.selectable.table tr.purple:not(.marked):hover,\n.ui.table tr td.selectable.purple:not(.marked):hover,\n.ui.selectable.table tr:hover td.purple:not(.marked) {\n  background: #f5d9ff;\n  color: #a333c8;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"purple colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"purple colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"purple colored\"],\n.ui.ui.inverted.selectable.table tr.purple:not(.marked):hover,\n.ui.inverted.table tr td.selectable.purple:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.purple:not(.marked) {\n  background: #cf40ff;\n  color: #fff;\n}\n.ui.table td[class*=\"purple marked\"].left,\n.ui.table tr[class*=\"purple marked\"].left {\n  box-shadow: 0.2em 0 0 0 #a333c8 inset;\n}\n.ui.table td[class*=\"purple marked\"].right,\n.ui.table tr[class*=\"purple marked\"].right {\n  box-shadow: -0.2em 0 0 0 #a333c8 inset;\n}\n.ui.inverted.table td[class*=\"purple marked\"].left,\n.ui.inverted.table tr[class*=\"purple marked\"].left {\n  box-shadow: 0.2em 0 0 0 #dc73ff inset;\n}\n.ui.inverted.table td[class*=\"purple marked\"].right,\n.ui.inverted.table tr[class*=\"purple marked\"].right {\n  box-shadow: -0.2em 0 0 0 #dc73ff inset;\n}\n.ui.pink.table {\n  border-top: 0.2em solid #e03997;\n}\n.ui.inverted.pink.table {\n  background: #e03997;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.pink,\n.ui.scrolling.table > tfoot.pink {\n  background: #ffe8f9;\n  color: #ffe8f9;\n}\n.ui.scrolling.table > thead.pink > tr > th,\n.ui.scrolling.table > tfoot.pink > tr > th,\n.ui.scrolling.table > thead.pink > tr > td,\n.ui.scrolling.table > tfoot.pink > tr > td {\n  background: inherit;\n  color: #e03997;\n}\n.ui.inverted.scrolling.table > thead.pink,\n.ui.inverted.scrolling.table > tfoot.pink {\n  background: #e03997;\n  color: #e03997;\n}\n.ui.inverted.scrolling.table > thead.pink > tr > th,\n.ui.inverted.scrolling.table > tfoot.pink > tr > th,\n.ui.inverted.scrolling.table > thead.pink > tr > td,\n.ui.inverted.scrolling.table > tfoot.pink > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"pink colored\"],\n.ui.ui.table th[class*=\"pink colored\"],\n.ui.ui.table td[class*=\"pink colored\"],\n.ui.ui.ui.ui.table tr.pink:not(.marked),\n.ui.ui.table th.pink:not(.marked),\n.ui.ui.table td.pink:not(.marked) {\n  background: #ffe8f9;\n  color: #e03997;\n}\n.ui.table > thead > tr[class*=\"pink colored\"] > th,\n.ui.table > tfoot > tr[class*=\"pink colored\"] > th,\n.ui.table > tfoot > tr[class*=\"pink colored\"] > td,\n.ui.table > thead > tr.pink:not(.marked) > th,\n.ui.table > tfoot > tr.pink:not(.marked) > th,\n.ui.table > tfoot > tr.pink:not(.marked) > td {\n  background: inherit;\n  color: #e03997;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"pink colored\"],\n.ui.ui.inverted.table th[class*=\"pink colored\"],\n.ui.ui.inverted.table td[class*=\"pink colored\"],\n.ui.ui.ui.ui.inverted.table tr.pink:not(.marked),\n.ui.ui.inverted.table th.pink:not(.marked),\n.ui.ui.inverted.table td.pink:not(.marked) {\n  background: #e03997;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"pink colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"pink colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"pink colored\"] > td,\n.ui.inverted.table > thead > tr.pink:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.pink:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.pink:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"pink colored\"]:hover,\n.ui.table tr td.selectable[class*=\"pink colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"pink colored\"],\n.ui.ui.selectable.table tr.pink:not(.marked):hover,\n.ui.table tr td.selectable.pink:not(.marked):hover,\n.ui.selectable.table tr:hover td.pink:not(.marked) {\n  background: #ffdef6;\n  color: #e03997;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"pink colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"pink colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"pink colored\"],\n.ui.ui.inverted.selectable.table tr.pink:not(.marked):hover,\n.ui.inverted.table tr td.selectable.pink:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.pink:not(.marked) {\n  background: #ff5bd1;\n  color: #fff;\n}\n.ui.table td[class*=\"pink marked\"].left,\n.ui.table tr[class*=\"pink marked\"].left {\n  box-shadow: 0.2em 0 0 0 #e03997 inset;\n}\n.ui.table td[class*=\"pink marked\"].right,\n.ui.table tr[class*=\"pink marked\"].right {\n  box-shadow: -0.2em 0 0 0 #e03997 inset;\n}\n.ui.inverted.table td[class*=\"pink marked\"].left,\n.ui.inverted.table tr[class*=\"pink marked\"].left {\n  box-shadow: 0.2em 0 0 0 #ff8edf inset;\n}\n.ui.inverted.table td[class*=\"pink marked\"].right,\n.ui.inverted.table tr[class*=\"pink marked\"].right {\n  box-shadow: -0.2em 0 0 0 #ff8edf inset;\n}\n.ui.brown.table {\n  border-top: 0.2em solid #a5673f;\n}\n.ui.inverted.brown.table {\n  background: #a5673f;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.brown,\n.ui.scrolling.table > tfoot.brown {\n  background: #f7e5d2;\n  color: #f7e5d2;\n}\n.ui.scrolling.table > thead.brown > tr > th,\n.ui.scrolling.table > tfoot.brown > tr > th,\n.ui.scrolling.table > thead.brown > tr > td,\n.ui.scrolling.table > tfoot.brown > tr > td {\n  background: inherit;\n  color: #a5673f;\n}\n.ui.inverted.scrolling.table > thead.brown,\n.ui.inverted.scrolling.table > tfoot.brown {\n  background: #a5673f;\n  color: #a5673f;\n}\n.ui.inverted.scrolling.table > thead.brown > tr > th,\n.ui.inverted.scrolling.table > tfoot.brown > tr > th,\n.ui.inverted.scrolling.table > thead.brown > tr > td,\n.ui.inverted.scrolling.table > tfoot.brown > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"brown colored\"],\n.ui.ui.table th[class*=\"brown colored\"],\n.ui.ui.table td[class*=\"brown colored\"],\n.ui.ui.ui.ui.table tr.brown:not(.marked),\n.ui.ui.table th.brown:not(.marked),\n.ui.ui.table td.brown:not(.marked) {\n  background: #f7e5d2;\n  color: #a5673f;\n}\n.ui.table > thead > tr[class*=\"brown colored\"] > th,\n.ui.table > tfoot > tr[class*=\"brown colored\"] > th,\n.ui.table > tfoot > tr[class*=\"brown colored\"] > td,\n.ui.table > thead > tr.brown:not(.marked) > th,\n.ui.table > tfoot > tr.brown:not(.marked) > th,\n.ui.table > tfoot > tr.brown:not(.marked) > td {\n  background: inherit;\n  color: #a5673f;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"brown colored\"],\n.ui.ui.inverted.table th[class*=\"brown colored\"],\n.ui.ui.inverted.table td[class*=\"brown colored\"],\n.ui.ui.ui.ui.inverted.table tr.brown:not(.marked),\n.ui.ui.inverted.table th.brown:not(.marked),\n.ui.ui.inverted.table td.brown:not(.marked) {\n  background: #a5673f;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"brown colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"brown colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"brown colored\"] > td,\n.ui.inverted.table > thead > tr.brown:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.brown:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.brown:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"brown colored\"]:hover,\n.ui.table tr td.selectable[class*=\"brown colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"brown colored\"],\n.ui.ui.selectable.table tr.brown:not(.marked):hover,\n.ui.table tr td.selectable.brown:not(.marked):hover,\n.ui.selectable.table tr:hover td.brown:not(.marked) {\n  background: #efe0cf;\n  color: #a5673f;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"brown colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"brown colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"brown colored\"],\n.ui.ui.inverted.selectable.table tr.brown:not(.marked):hover,\n.ui.inverted.table tr td.selectable.brown:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.brown:not(.marked) {\n  background: #b0620f;\n  color: #fff;\n}\n.ui.table td[class*=\"brown marked\"].left,\n.ui.table tr[class*=\"brown marked\"].left {\n  box-shadow: 0.2em 0 0 0 #a5673f inset;\n}\n.ui.table td[class*=\"brown marked\"].right,\n.ui.table tr[class*=\"brown marked\"].right {\n  box-shadow: -0.2em 0 0 0 #a5673f inset;\n}\n.ui.inverted.table td[class*=\"brown marked\"].left,\n.ui.inverted.table tr[class*=\"brown marked\"].left {\n  box-shadow: 0.2em 0 0 0 #d67c1c inset;\n}\n.ui.inverted.table td[class*=\"brown marked\"].right,\n.ui.inverted.table tr[class*=\"brown marked\"].right {\n  box-shadow: -0.2em 0 0 0 #d67c1c inset;\n}\n.ui.grey.table {\n  border-top: 0.2em solid #767676;\n}\n.ui.inverted.grey.table {\n  background: #767676;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.grey,\n.ui.scrolling.table > tfoot.grey {\n  background: #dcddde;\n  color: #dcddde;\n}\n.ui.scrolling.table > thead.grey > tr > th,\n.ui.scrolling.table > tfoot.grey > tr > th,\n.ui.scrolling.table > thead.grey > tr > td,\n.ui.scrolling.table > tfoot.grey > tr > td {\n  background: inherit;\n  color: #767676;\n}\n.ui.inverted.scrolling.table > thead.grey,\n.ui.inverted.scrolling.table > tfoot.grey {\n  background: #767676;\n  color: #767676;\n}\n.ui.inverted.scrolling.table > thead.grey > tr > th,\n.ui.inverted.scrolling.table > tfoot.grey > tr > th,\n.ui.inverted.scrolling.table > thead.grey > tr > td,\n.ui.inverted.scrolling.table > tfoot.grey > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"grey colored\"],\n.ui.ui.table th[class*=\"grey colored\"],\n.ui.ui.table td[class*=\"grey colored\"],\n.ui.ui.ui.ui.table tr.grey:not(.marked),\n.ui.ui.table th.grey:not(.marked),\n.ui.ui.table td.grey:not(.marked) {\n  background: #dcddde;\n  color: #767676;\n}\n.ui.table > thead > tr[class*=\"grey colored\"] > th,\n.ui.table > tfoot > tr[class*=\"grey colored\"] > th,\n.ui.table > tfoot > tr[class*=\"grey colored\"] > td,\n.ui.table > thead > tr.grey:not(.marked) > th,\n.ui.table > tfoot > tr.grey:not(.marked) > th,\n.ui.table > tfoot > tr.grey:not(.marked) > td {\n  background: inherit;\n  color: #767676;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"grey colored\"],\n.ui.ui.inverted.table th[class*=\"grey colored\"],\n.ui.ui.inverted.table td[class*=\"grey colored\"],\n.ui.ui.ui.ui.inverted.table tr.grey:not(.marked),\n.ui.ui.inverted.table th.grey:not(.marked),\n.ui.ui.inverted.table td.grey:not(.marked) {\n  background: #767676;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"grey colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"grey colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"grey colored\"] > td,\n.ui.inverted.table > thead > tr.grey:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.grey:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.grey:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"grey colored\"]:hover,\n.ui.table tr td.selectable[class*=\"grey colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"grey colored\"],\n.ui.ui.selectable.table tr.grey:not(.marked):hover,\n.ui.table tr td.selectable.grey:not(.marked):hover,\n.ui.selectable.table tr:hover td.grey:not(.marked) {\n  background: #c2c4c5;\n  color: #767676;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"grey colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"grey colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"grey colored\"],\n.ui.ui.inverted.selectable.table tr.grey:not(.marked):hover,\n.ui.inverted.table tr td.selectable.grey:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.grey:not(.marked) {\n  background: #c2c4c5;\n  color: #fff;\n}\n.ui.table td[class*=\"grey marked\"].left,\n.ui.table tr[class*=\"grey marked\"].left {\n  box-shadow: 0.2em 0 0 0 #767676 inset;\n}\n.ui.table td[class*=\"grey marked\"].right,\n.ui.table tr[class*=\"grey marked\"].right {\n  box-shadow: -0.2em 0 0 0 #767676 inset;\n}\n.ui.inverted.table td[class*=\"grey marked\"].left,\n.ui.inverted.table tr[class*=\"grey marked\"].left {\n  box-shadow: 0.2em 0 0 0 #dcddde inset;\n}\n.ui.inverted.table td[class*=\"grey marked\"].right,\n.ui.inverted.table tr[class*=\"grey marked\"].right {\n  box-shadow: -0.2em 0 0 0 #dcddde inset;\n}\n.ui.black.table {\n  border-top: 0.2em solid #1b1c1d;\n}\n.ui.inverted.black.table {\n  background: #1b1c1d;\n  color: #fff;\n}\n\n/* Same color for background and color to camouflage the scrollbar */\n.ui.scrolling.table > thead.black,\n.ui.scrolling.table > tfoot.black {\n  background: #545454;\n  color: #545454;\n}\n.ui.scrolling.table > thead.black > tr > th,\n.ui.scrolling.table > tfoot.black > tr > th,\n.ui.scrolling.table > thead.black > tr > td,\n.ui.scrolling.table > tfoot.black > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.inverted.scrolling.table > thead.black,\n.ui.inverted.scrolling.table > tfoot.black {\n  background: #1b1c1d;\n  color: #1b1c1d;\n}\n.ui.inverted.scrolling.table > thead.black > tr > th,\n.ui.inverted.scrolling.table > tfoot.black > tr > th,\n.ui.inverted.scrolling.table > thead.black > tr > td,\n.ui.inverted.scrolling.table > tfoot.black > tr > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.table tr[class*=\"black colored\"],\n.ui.ui.table th[class*=\"black colored\"],\n.ui.ui.table td[class*=\"black colored\"],\n.ui.ui.ui.ui.table tr.black:not(.marked),\n.ui.ui.table th.black:not(.marked),\n.ui.ui.table td.black:not(.marked) {\n  background: #545454;\n  color: #fff;\n}\n.ui.table > thead > tr[class*=\"black colored\"] > th,\n.ui.table > tfoot > tr[class*=\"black colored\"] > th,\n.ui.table > tfoot > tr[class*=\"black colored\"] > td,\n.ui.table > thead > tr.black:not(.marked) > th,\n.ui.table > tfoot > tr.black:not(.marked) > th,\n.ui.table > tfoot > tr.black:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.ui.ui.inverted.table tr[class*=\"black colored\"],\n.ui.ui.inverted.table th[class*=\"black colored\"],\n.ui.ui.inverted.table td[class*=\"black colored\"],\n.ui.ui.ui.ui.inverted.table tr.black:not(.marked),\n.ui.ui.inverted.table th.black:not(.marked),\n.ui.ui.inverted.table td.black:not(.marked) {\n  background: #1b1c1d;\n  color: #fff;\n}\n.ui.inverted.table > thead > tr[class*=\"black colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"black colored\"] > th,\n.ui.inverted.table > tfoot > tr[class*=\"black colored\"] > td,\n.ui.inverted.table > thead > tr.black:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.black:not(.marked) > th,\n.ui.inverted.table > tfoot > tr.black:not(.marked) > td {\n  background: inherit;\n  color: #fff;\n}\n.ui.ui.selectable.table tr[class*=\"black colored\"]:hover,\n.ui.table tr td.selectable[class*=\"black colored\"]:hover,\n.ui.selectable.table tr:hover td[class*=\"black colored\"],\n.ui.ui.selectable.table tr.black:not(.marked):hover,\n.ui.table tr td.selectable.black:not(.marked):hover,\n.ui.selectable.table tr:hover td.black:not(.marked) {\n  background: #000000;\n  color: #fff;\n}\n.ui.ui.inverted.selectable.table tr[class*=\"black colored\"]:hover,\n.ui.inverted.table tr td.selectable[class*=\"black colored\"]:hover,\n.ui.inverted.selectable.table tr:hover td[class*=\"black colored\"],\n.ui.ui.inverted.selectable.table tr.black:not(.marked):hover,\n.ui.inverted.table tr td.selectable.black:not(.marked):hover,\n.ui.inverted.selectable.table tr:hover td.black:not(.marked) {\n  background: #000000;\n  color: #1b1c1d;\n}\n.ui.table td[class*=\"black marked\"].left,\n.ui.table tr[class*=\"black marked\"].left {\n  box-shadow: 0.2em 0 0 0 #1b1c1d inset;\n}\n.ui.table td[class*=\"black marked\"].right,\n.ui.table tr[class*=\"black marked\"].right {\n  box-shadow: -0.2em 0 0 0 #1b1c1d inset;\n}\n.ui.inverted.table td[class*=\"black marked\"].left,\n.ui.inverted.table tr[class*=\"black marked\"].left {\n  box-shadow: 0.2em 0 0 0 #545454 inset;\n}\n.ui.inverted.table td[class*=\"black marked\"].right,\n.ui.inverted.table tr[class*=\"black marked\"].right {\n  box-shadow: -0.2em 0 0 0 #545454 inset;\n}\n\n/* --------------\n      Column Count\n    --------------- */\n\n/* Grid Based */\n.ui.one.column.table td {\n  width: 100%;\n}\n.ui.two.column.table td {\n  width: 50%;\n}\n.ui.three.column.table td {\n  width: 33.33333333%;\n}\n.ui.four.column.table td {\n  width: 25%;\n}\n.ui.five.column.table td {\n  width: 20%;\n}\n.ui.six.column.table td {\n  width: 16.66666667%;\n}\n.ui.seven.column.table td {\n  width: 14.28571429%;\n}\n.ui.eight.column.table td {\n  width: 12.5%;\n}\n.ui.nine.column.table td {\n  width: 11.11111111%;\n}\n.ui.ten.column.table td {\n  width: 10%;\n}\n.ui.eleven.column.table td {\n  width: 9.09090909%;\n}\n.ui.twelve.column.table td {\n  width: 8.33333333%;\n}\n.ui.thirteen.column.table td {\n  width: 7.69230769%;\n}\n.ui.fourteen.column.table td {\n  width: 7.14285714%;\n}\n.ui.fifteen.column.table td {\n  width: 6.66666667%;\n}\n.ui.sixteen.column.table td {\n  width: 6.25%;\n}\n\n/* Column Width */\n.ui.table th.one.wide,\n.ui.table td.one.wide {\n  width: 6.25%;\n}\n.ui.table th.two.wide,\n.ui.table td.two.wide {\n  width: 12.5%;\n}\n.ui.table th.three.wide,\n.ui.table td.three.wide {\n  width: 18.75%;\n}\n.ui.table th.four.wide,\n.ui.table td.four.wide {\n  width: 25%;\n}\n.ui.table th.five.wide,\n.ui.table td.five.wide {\n  width: 31.25%;\n}\n.ui.table th.six.wide,\n.ui.table td.six.wide {\n  width: 37.5%;\n}\n.ui.table th.seven.wide,\n.ui.table td.seven.wide {\n  width: 43.75%;\n}\n.ui.table th.eight.wide,\n.ui.table td.eight.wide {\n  width: 50%;\n}\n.ui.table th.nine.wide,\n.ui.table td.nine.wide {\n  width: 56.25%;\n}\n.ui.table th.ten.wide,\n.ui.table td.ten.wide {\n  width: 62.5%;\n}\n.ui.table th.eleven.wide,\n.ui.table td.eleven.wide {\n  width: 68.75%;\n}\n.ui.table th.twelve.wide,\n.ui.table td.twelve.wide {\n  width: 75%;\n}\n.ui.table th.thirteen.wide,\n.ui.table td.thirteen.wide {\n  width: 81.25%;\n}\n.ui.table th.fourteen.wide,\n.ui.table td.fourteen.wide {\n  width: 87.5%;\n}\n.ui.table th.fifteen.wide,\n.ui.table td.fifteen.wide {\n  width: 93.75%;\n}\n.ui.table th.sixteen.wide,\n.ui.table td.sixteen.wide {\n  width: 100%;\n}\n\n/* --------------\n        Sortable\n    --------------- */\n.ui.sortable.table > thead > tr > th {\n  cursor: pointer;\n  white-space: nowrap;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.celled.sortable.table > thead > tr > th:not(:first-child) {\n  border-left: 1px solid rgba(34, 36, 38, 0.15);\n}\n.ui.sortable.table thead th.sorted,\n.ui.sortable.table thead th.sorted:hover {\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n.ui.sortable.table > thead > tr > th::after {\n  display: none;\n  font-style: normal;\n  font-weight: normal;\n  text-decoration: inherit;\n  content: \"\";\n  height: 1em;\n  width: auto;\n  opacity: 0.8;\n  margin: 0 0 0 0.5em;\n  font-family: \"Icons\";\n}\n.ui.sortable.table thead th.ascending::after {\n  content: \"\\f0d8\";\n}\n.ui.sortable.table thead th.descending::after {\n  content: \"\\f0d7\";\n}\n\n/* Hover */\n.ui.sortable.table th.disabled:hover {\n  cursor: auto;\n  color: rgba(40, 40, 40, 0.3);\n}\n.ui.sortable.table > thead > tr > th:hover {\n  color: rgba(0, 0, 0, 0.8);\n}\n.ui.sortable.table:not(.basic) > thead > tr > th:hover {\n  background: rgba(0, 0, 0, 0.05);\n}\n\n/* Sorted */\n.ui.sortable.table thead th.sorted {\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.sortable.table:not(.basic) thead th.sorted {\n  background: rgba(0, 0, 0, 0.05);\n}\n.ui.sortable.table thead th.sorted::after {\n  display: inline-block;\n}\n\n/* Sorted Hover */\n.ui.sortable.table thead th.sorted:hover {\n  color: rgba(0, 0, 0, 0.95);\n}\n.ui.sortable.table:not(.basic) thead th.sorted:hover {\n  background: rgba(0, 0, 0, 0.05);\n}\n\n/* Inverted */\n.ui.inverted.sortable.table thead th.sorted {\n  color: #ffffff;\n}\n.ui.inverted.sortable.table:not(.basic) thead th.sorted {\n  background: rgba(255, 255, 255, 0.15) linear-gradient(transparent, rgba(0, 0, 0, 0.05));\n}\n.ui.inverted.sortable.table > thead > tr > th:hover {\n  color: #ffffff;\n}\n.ui.inverted.sortable.table:not(.basic) > thead > tr > th:hover {\n  background: rgba(255, 255, 255, 0.08) linear-gradient(transparent, rgba(0, 0, 0, 0.05));\n}\n.ui.inverted.sortable.table:not(.basic) > thead > tr > th {\n  border-left-color: transparent;\n  border-right-color: transparent;\n}\n\n/* --------------\n        Inverted\n    --------------- */\n\n/* Text Color */\n.ui.inverted.table {\n  background: #333;\n  color: rgba(255, 255, 255, 0.9);\n  border: none;\n}\n.ui.ui.inverted.table > thead > tr > th,\n.ui.ui.inverted.table > tbody > tr > th,\n.ui.ui.inverted.table > tr > th {\n  background-color: rgba(0, 0, 0, 0.15);\n  border-color: rgba(255, 255, 255, 0.1);\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.ui.inverted.table > tfoot > tr > th,\n.ui.ui.inverted.table > tfoot > tr > td {\n  background-color: rgba(0, 0, 0, 0.15);\n  border-color: rgba(255, 255, 255, 0.1);\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.table > tbody > tr > td,\n.ui.inverted.table > tfoot > tr > td,\n.ui.inverted.table > tr > td {\n  border-color: rgba(255, 255, 255, 0.1);\n}\n.ui.ui.ui.inverted.table tr.disabled td,\n.ui.ui.ui.inverted.table tr td.disabled,\n.ui.inverted.table tr.disabled:hover td,\n.ui.inverted.table tr:hover td.disabled {\n  pointer-events: none;\n  color: rgba(225, 225, 225, 0.3);\n}\n.ui.ui.ui.inverted.table tr td.disabled:not([class=\"disabled\"]),\n.ui.inverted.table tr.disabled:not([class=\"disabled\"]) td,\n.ui.inverted.table tr.disabled td[class]:not(.disabled),\n.ui.inverted.table tr:hover td.disabled:not([class=\"disabled\"]) {\n  color: rgba(40, 40, 40, 0.3);\n}\n\n/* Definition */\n.ui.inverted.definition.table > tfoot:not(.full-width) > tr > th:first-child,\n.ui.inverted.definition.table > thead:not(.full-width) > tr > th:first-child {\n  background: #fff;\n}\n.ui.inverted.definition.table > tbody > tr > td:first-child,\n.ui.inverted.definition.table > tfoot > tr > td:first-child,\n.ui.inverted.definition.table > tr > td:first-child {\n  background: rgba(255, 255, 255, 0.02);\n  color: #ffffff;\n}\n\n/* --------------\n       Collapsing\n    --------------- */\n.ui.collapsing.table {\n  width: auto;\n}\n\n/* --------------\n          Basic\n    --------------- */\n.ui.basic.table {\n  background: transparent;\n  border: 1px solid rgba(34, 36, 38, 0.15);\n  box-shadow: none;\n}\n.ui.basic.table > thead,\n.ui.basic.table > tfoot {\n  box-shadow: none;\n}\n.ui.basic.table > thead > tr > th,\n.ui.basic.table > tbody > tr > th,\n.ui.basic.table > tfoot > tr > th,\n.ui.basic.table > tr > th {\n  background: transparent;\n  border-left: none;\n}\n.ui.basic.table > tbody > tr {\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n}\n.ui.basic.table > tbody > tr > td,\n.ui.basic.table > tfoot > tr > td,\n.ui.basic.table > tr > td {\n  background: transparent;\n}\n.ui.basic.striped.table > tbody > tr:nth-child(2n) {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n/* Very Basic */\n.ui[class*=\"very basic\"].table {\n  border: none;\n}\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tr > th,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > thead > tr > th,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tbody > tr > th,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tfoot > tr > th,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tr > td,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tbody > tr > td {\n  padding: \"\";\n}\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tr > th:first-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > thead > tr > th:first-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tbody > tr > th:first-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tfoot > tr > th:first-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tr > td:first-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tbody > tr > td:first-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tfoot > tr > td:first-child {\n  padding-left: 0;\n}\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tr > th:last-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > thead > tr > th:last-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tbody > tr > th:last-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tfoot > tr > th:last-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tr > td:last-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tbody > tr > td:last-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > tfoot > tr > td:last-child {\n  padding-right: 0;\n}\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) > thead > tr:first-child > th {\n  padding-top: 0;\n}\n\n/* --------------\n         Celled\n    --------------- */\n.ui.celled.table > tr > th,\n.ui.celled.table > thead > tr > th,\n.ui.celled.table > tbody > tr > th,\n.ui.celled.table > tfoot > tr > th,\n.ui.celled.table > tr > td,\n.ui.celled.table > tbody > tr > td,\n.ui.celled.table > tfoot > tr > td {\n  border-left: 1px solid rgba(34, 36, 38, 0.1);\n}\n.ui.inverted.celled.table > tbody > tr > td,\n.ui.inverted.celled.table > tr > td {\n  border-left: 1px solid rgba(255, 255, 255, 0.1);\n}\n.ui.celled.table > tr > th:first-child,\n.ui.celled.table > thead > tr > th:first-child,\n.ui.celled.table > tbody > tr > th:first-child,\n.ui.celled.table > tfoot > tr > th:first-child,\n.ui.celled.table > tr > td:first-child,\n.ui.celled.table > tbody > tr > td:first-child,\n.ui.celled.table > tfoot > tr > td:first-child {\n  border-left: none;\n}\n\n/* --------------\n         Padded\n    --------------- */\n.ui.padded.table > tr > th,\n.ui.padded.table > thead > tr > th,\n.ui.padded.table > tbody > tr > th,\n.ui.padded.table > tfoot > tr > th {\n  padding-left: 1em;\n  padding-right: 1em;\n}\n.ui.padded.table > tr > th,\n.ui.padded.table > thead > tr > th,\n.ui.padded.table > tbody > tr > th,\n.ui.padded.table > tfoot > tr > th,\n.ui.padded.table > tr > td,\n.ui.padded.table > tbody > tr > td,\n.ui.padded.table > tfoot > tr > td {\n  padding: 1em 1em;\n}\n\n/* Very */\n.ui[class*=\"very padded\"].table > tr > th,\n.ui[class*=\"very padded\"].table > thead > tr > th,\n.ui[class*=\"very padded\"].table > tbody > tr > th,\n.ui[class*=\"very padded\"].table > tfoot > tr > th {\n  padding-left: 1.5em;\n  padding-right: 1.5em;\n}\n.ui[class*=\"very padded\"].table > tr > td,\n.ui[class*=\"very padded\"].table > tbody > tr > td,\n.ui[class*=\"very padded\"].table > tfoot > tr > td {\n  padding: 1.5em 1.5em;\n}\n\n/* --------------\n         Compact\n    --------------- */\n.ui.compact.table > tr > th,\n.ui.compact.table > thead > tr > th,\n.ui.compact.table > tbody > tr > th,\n.ui.compact.table > tfoot > tr > th {\n  padding-left: 0.7em;\n  padding-right: 0.7em;\n}\n.ui.compact.table > tr > td,\n.ui.compact.table > tbody > tr > td,\n.ui.compact.table > tfoot > tr > td {\n  padding: 0.5em 0.7em;\n}\n\n/* Very */\n.ui[class*=\"very compact\"].table > tr > th,\n.ui[class*=\"very compact\"].table > thead > tr > th,\n.ui[class*=\"very compact\"].table > tbody > tr > th,\n.ui[class*=\"very compact\"].table > tfoot > tr > th {\n  padding-left: 0.6em;\n  padding-right: 0.6em;\n}\n.ui[class*=\"very compact\"].table > tr > td,\n.ui[class*=\"very compact\"].table > tbody > tr > td,\n.ui[class*=\"very compact\"].table > tfoot > tr > td {\n  padding: 0.4em 0.6em;\n}\n\n/* --------------\n         Stuck\n    --------------- */\n.ui.stuck.table:not(.inverted) {\n  background: #fff;\n}\n.ui.stuck.table:not(.inverted) > thead > tr {\n  background: #f9fafb;\n}\n.ui.stuck.table:not(.inverted) > tbody > tr {\n  background: #fff;\n}\n.ui.stuck.table:not(.inverted) > tfoot > tr {\n  background: #f9fafb;\n}\n.ui.stuck.table:not(.inverted).basic > thead > tr,\n.ui.stuck.table:not(.inverted).basic > tfoot > tr {\n  background: #fff;\n}\n.ui.inverted.stuck.table > thead > tr {\n  background: #252525;\n}\n.ui.inverted.stuck.table > tbody > tr {\n  background: #333;\n}\n.ui.inverted.stuck.table > tfoot > tr {\n  background: #252525;\n}\n.ui.inverted.stuck.table.basic > thead > tr,\n.ui.inverted.stuck.table.basic > tfoot > tr {\n  background: #333;\n}\n.ui.head.stuck.table > thead,\n.ui.foot.stuck.table > tfoot {\n  position: sticky;\n  z-index: 800;\n}\n.ui.head.stuck.table {\n  border-top: 0;\n}\n.ui.head.stuck.table > thead {\n  top: 0;\n  bottom: auto;\n}\n.ui.head.stuck.table > thead > tr:first-child > th {\n  border-top: 1px solid rgba(34, 36, 38, 0.1);\n}\n.ui.head.stuck.table.inverted > thead > tr:first-child > th {\n  border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n.ui.foot.stuck.table {\n  border-bottom: 0;\n}\n.ui.foot.stuck.table > tfoot {\n  top: auto;\n  bottom: 0;\n}\n.ui.foot.stuck.table > tfoot > tr:last-child > td,\n.ui.foot.stuck.table > tfoot > tr:last-child > th {\n  border-bottom: 1px solid rgba(34, 36, 38, 0.1);\n}\n.ui.foot.stuck.table.inverted > tfoot > tr:first-child > td,\n.ui.foot.stuck.table.inverted > tfoot > tr:first-child > th {\n  border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n.ui.first.stuck.table {\n  border-left: 0;\n}\n.ui.first.stuck.table th:first-child,\n.ui.first.stuck.table td:first-child {\n  position: sticky;\n  left: 0;\n  border-left: 1px solid rgba(34, 36, 38, 0.1);\n  background: inherit;\n}\n.ui.first.stuck.table.inverted th:first-child,\n.ui.first.stuck.table.inverted td:first-child {\n  border-left: 1px solid rgba(255, 255, 255, 0.1);\n}\n.ui.last.stuck.table {\n  border-right: 0;\n}\n.ui.last.stuck.table th:last-child,\n.ui.last.stuck.table td:last-child {\n  position: sticky;\n  right: 0;\n  border-right: 1px solid rgba(34, 36, 38, 0.1);\n  background: inherit;\n}\n.ui.last.stuck.table.inverted th:last-child,\n.ui.last.stuck.table.inverted td:last-child {\n  border-right: 1px solid rgba(255, 255, 255, 0.1);\n}\n.ui.celled.first.stuck.table th:first-child,\n.ui.celled.first.stuck.table td:first-child {\n  border-right: 1px solid rgba(34, 36, 38, 0.1);\n}\n.ui.celled.last.stuck.table th:last-child,\n.ui.celled.last.stuck.table td:last-child {\n  border-left: 1px solid rgba(34, 36, 38, 0.1);\n}\n.ui.inverted.celled.first.stuck.table th:first-child,\n.ui.inverted.celled.first.stuck.table td:first-child {\n  border-right: 1px solid rgba(255, 255, 255, 0.1);\n}\n.ui.inverted.celled.last.stuck.table th:last-child,\n.ui.inverted.celled.last.stuck.table td:last-child {\n  border-left: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n/* --------------\n      Sizes\n--------------- */\n\n/* Standard */\n.ui.table {\n  font-size: 1em;\n}\n.ui.mini.table {\n  font-size: 0.78571429rem;\n}\n.ui.tiny.table {\n  font-size: 0.85714286rem;\n}\n.ui.small.table {\n  font-size: 0.9em;\n}\n.ui.large.table {\n  font-size: 1.1em;\n}\n.ui.big.table {\n  font-size: 1.28571429rem;\n}\n.ui.huge.table {\n  font-size: 1.42857143rem;\n}\n.ui.massive.table {\n  font-size: 1.71428571rem;\n}\n\n\n/*******************************\n           Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/text.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Text\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Text\n*******************************/\n\nspan.ui.text {\n  line-height: 1;\n}\nspan.ui.primary.text {\n  color: #2185d0;\n}\nspan.ui.inverted.primary.text {\n  color: #54c8ff;\n}\nspan.ui.secondary.text {\n  color: #1b1c1d;\n}\nspan.ui.inverted.secondary.text {\n  color: #545454;\n}\nspan.ui.red.text {\n  color: #db2828;\n}\nspan.ui.inverted.red.text {\n  color: #ff695e;\n}\nspan.ui.orange.text {\n  color: #f2711c;\n}\nspan.ui.inverted.orange.text {\n  color: #ff851b;\n}\nspan.ui.yellow.text {\n  color: #fbbd08;\n}\nspan.ui.inverted.yellow.text {\n  color: #ffe21f;\n}\nspan.ui.olive.text {\n  color: #b5cc18;\n}\nspan.ui.inverted.olive.text {\n  color: #d9e778;\n}\nspan.ui.green.text {\n  color: #21ba45;\n}\nspan.ui.inverted.green.text {\n  color: #2ecc40;\n}\nspan.ui.teal.text {\n  color: #00b5ad;\n}\nspan.ui.inverted.teal.text {\n  color: #6dffff;\n}\nspan.ui.blue.text {\n  color: #2185d0;\n}\nspan.ui.inverted.blue.text {\n  color: #54c8ff;\n}\nspan.ui.violet.text {\n  color: #6435c9;\n}\nspan.ui.inverted.violet.text {\n  color: #a291fb;\n}\nspan.ui.purple.text {\n  color: #a333c8;\n}\nspan.ui.inverted.purple.text {\n  color: #dc73ff;\n}\nspan.ui.pink.text {\n  color: #e03997;\n}\nspan.ui.inverted.pink.text {\n  color: #ff8edf;\n}\nspan.ui.brown.text {\n  color: #a5673f;\n}\nspan.ui.inverted.brown.text {\n  color: #d67c1c;\n}\nspan.ui.grey.text {\n  color: #767676;\n}\nspan.ui.inverted.grey.text {\n  color: #dcddde;\n}\nspan.ui.black.text {\n  color: #1b1c1d;\n}\nspan.ui.inverted.black.text {\n  color: #545454;\n}\nspan.ui.error.text {\n  color: #db2828;\n}\nspan.ui.info.text {\n  color: #31ccec;\n}\nspan.ui.success.text {\n  color: #21ba45;\n}\nspan.ui.warning.text {\n  color: #f2c037;\n}\nspan.ui.disabled.text {\n  opacity: 0.45;\n}\n\n/* Sizes */\nspan.ui.medium.text {\n  font-size: 1em;\n}\nspan.ui.mini.text {\n  font-size: 0.4em;\n}\nspan.ui.tiny.text {\n  font-size: 0.5em;\n}\nspan.ui.small.text {\n  font-size: 0.75em;\n}\nspan.ui.large.text {\n  font-size: 1.5em;\n}\nspan.ui.big.text {\n  font-size: 2em;\n}\nspan.ui.huge.text {\n  font-size: 4em;\n}\nspan.ui.massive.text {\n  font-size: 8em;\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/toast.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Toast\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n        Toast container\n*******************************/\n\n.ui.toast-container {\n  position: fixed;\n  z-index: 9999;\n}\n.ui.toast-container.absolute {\n  position: absolute;\n}\n.ui.toast-container.ui.attached {\n  width: 100%;\n  left: 0;\n}\n.ui.toast-container.ui.attached .vertical.attached {\n  border-radius: 0;\n}\n.ui.toast-container.ui.attached.ui.ui .attached.actions .button {\n  border-radius: 0;\n}\n.ui.toast-container.ui.attached .toast-box {\n  margin: 0;\n  width: 100%;\n  border-radius: 0;\n}\n.ui.toast-container.ui.attached .toast-box > .ui.toast,\n.ui.toast-container.ui.attached .toast-box > .ui.message {\n  margin-left: 0;\n}\n.ui.toast-container.ui.attached .toast-box.floating,\n.ui.toast-container.ui.attached .toast-box.hoverfloating:hover {\n  border: none;\n}\n.ui.toast-container.ui.attached .toast-box > .vertical > .content {\n  flex: 1;\n}\n.ui.toast-container.ui.attached .toast-box > * {\n  width: 100%;\n  border-radius: 0;\n}\n.ui.toast-container.ui.attached .toast-box > * > .vertical:not(.actions) {\n  flex: 1;\n}\n.ui.toast-container.ui.attached .toast-box > .attached.actions {\n  margin-right: 1px;\n}\n.ui.toast-container.ui.attached.top {\n  top: 0;\n}\n.ui.toast-container.ui.attached.bottom {\n  bottom: 0;\n}\n.ui.toast-container.top.right {\n  top: 0.85714286em;\n  right: 0.85714286em;\n  margin-left: 0.85714286em;\n}\n.ui.toast-container.top.left {\n  top: 0.85714286em;\n  left: 0.85714286em;\n  margin-right: 0.85714286em;\n}\n.ui.toast-container.top.center {\n  left: 50%;\n  transform: translate(-50%, 0);\n  top: 0.85714286em;\n}\n.ui.toast-container.bottom.right {\n  bottom: 0.85714286em;\n  right: 0.85714286em;\n  margin-left: 0.85714286em;\n}\n.ui.toast-container.bottom.left {\n  bottom: 0.85714286em;\n  left: 0.85714286em;\n  margin-right: 0.85714286em;\n}\n.ui.toast-container.bottom.center {\n  left: 50%;\n  transform: translate(-50%, 0);\n  bottom: 0.85714286em;\n}\n.ui.toast-container.centered {\n  transform: translate(-50%, -50%);\n  top: 50%;\n  left: 50%;\n}\n.ui.toast-container .visible.toast-box,\n.ui.toast-container .animating.toast-box,\n.ui.toast-container .toast-box {\n  display: table !important;\n}\n.ui.toast-container.horizontal {\n  display: flex;\n  flex-direction: row;\n}\n.ui.toast-container.horizontal .toast-box {\n  margin-right: 0.5em;\n}\n.ui.toast-container .toast-box {\n  margin-bottom: 0.5em;\n  border-radius: 0.28571429rem;\n  cursor: default;\n  will-change: transform, opacity;\n}\n.ui.toast-container .toast-box:hover {\n  opacity: 1;\n}\n.ui.toast-container .toast-box:not(.unclickable):hover {\n  cursor: pointer;\n}\n.ui.toast-container .toast-box.floating,\n.ui.toast-container .toast-box.hoverfloating:hover {\n  box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);\n  border: 1px solid rgba(34, 36, 38, 0.12);\n}\n.ui.toast-container .toast-box.inverted.floating,\n.ui.toast-container .toast-box.inverted.hoverfloating:hover {\n  box-shadow: 0 2px 4px 0 rgba(225, 225, 225, 0.1), 0 2px 10px 0 rgba(225, 225, 225, 0.5);\n  border: 1px solid rgba(225, 225, 225, 0.5);\n}\n.ui.toast-container .toast-box.compact,\n.ui.toast-container .toast-box > .compact {\n  width: 350px;\n}\n.ui.toast-container .toast-box > .ui.toast,\n.ui.toast-container .toast-box > .ui.message {\n  margin: 0 -1px -0.01em;\n  position: relative;\n}\n.ui.toast-container .toast-box > .attached.progress {\n  z-index: 1;\n}\n.ui.toast-container .toast-box > .attached.progress.bottom {\n  margin: -0.2em -1px -0.01em;\n}\n.ui.toast-container .toast-box > .attached.progress.top {\n  margin: -0.01em -1px -0.2em;\n}\n.ui.toast-container .toast-box > .attached.progress .bar {\n  min-width: 0;\n}\n.ui.toast-container .toast-box > .attached.progress.info .bar.bar.bar {\n  background: #12a1bf;\n}\n.ui.toast-container .toast-box > .attached.progress.warning .bar.bar.bar {\n  background: #cf9b0d;\n}\n.ui.toast-container .toast-box > .attached.progress.success .bar.bar.bar {\n  background: #15792d;\n}\n.ui.toast-container .toast-box > .attached.progress.error .bar.bar.bar {\n  background: #9c1a1a;\n}\n.ui.toast-container .toast-box > .attached.progress.neutral .bar.bar.bar {\n  background: #d9d9d9;\n}\n.ui.toast-container .toast-box > .ui.message > .close.icon {\n  top: 0.3em;\n  right: 0.3em;\n}\n.ui.toast-container .toast-box > .ui.message > .actions:last-child {\n  margin-bottom: -1em;\n}\n.ui.toast-container .toast-box > .ui.message.icon {\n  align-items: inherit;\n}\n.ui.toast-container .toast-box > .ui.message.icon > :not(.icon):not(.actions) {\n  padding-left: 5rem;\n}\n.ui.toast-container .toast-box > .ui.message.icon > i.icon:not(.close) {\n  display: inline-block;\n  position: absolute;\n  width: 4rem;\n  top: 50%;\n  transform: translateY(-50%);\n}\n.ui.toast-container .toast-box > .ui.message.icon:not(.vertical).actions > i.icon:not(.close) {\n  top: calc(50% - 1.2em);\n  transform: none;\n}\n.ui.toast-container .toast-box > .ui.message.icon:not(.vertical).icon.icon.icon {\n  display: block;\n}\n.ui.toast-container .toast-box .ui.toast > .close.icon {\n  cursor: pointer;\n  margin: 0;\n  opacity: 0.7;\n  transition: opacity 0.1s ease;\n}\n.ui.toast-container .toast-box .ui.toast > .close.icon:hover {\n  opacity: 1;\n}\n.ui.toast-container .toast-box .ui.toast.vertical > .close.icon {\n  margin-top: -0.3em;\n  margin-right: -0.3em;\n}\n.ui.toast-container .toast-box .ui.toast:not(.vertical) > .close.icon {\n  position: absolute;\n  top: 0.3em;\n}\n.ui.toast-container .toast-box .ui.toast:not(.vertical) > .close.icon:not(.left) {\n  right: 0.3em;\n}\n.ui.toast-container .toast-box .ui.toast:not(.vertical) > .close.icon.left {\n  margin-left: -0.3em;\n}\n.ui.toast-container .toast-box .ui.card {\n  margin: 0;\n}\n.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom.horizontal > .image > img {\n  border-top-left-radius: 0;\n}\n.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom.horizontal > .image:last-child > img {\n  border-top-right-radius: 0;\n}\n.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top.horizontal > .image > img {\n  border-bottom-left-radius: 0;\n}\n.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top.horizontal > .image:last-child > img {\n  border-bottom-right-radius: 0;\n}\n.ui.toast-container .toast-box .ui.card.horizontal.actions > .image > img {\n  border-bottom-left-radius: 0;\n}\n.ui.toast-container .toast-box .ui.card.horizontal.actions > .image:last-child > img {\n  border-bottom-right-radius: 0;\n}\n.ui.toast-container .toast-box .progressing {\n  animation-iteration-count: 1;\n  animation-timing-function: linear;\n}\n.ui.toast-container .toast-box .progressing.up {\n  animation-name: progressUp;\n}\n.ui.toast-container .toast-box .progressing.down {\n  animation-name: progressDown;\n}\n.ui.toast-container .toast-box .progressing.wait {\n  animation-name: progressWait;\n}\n.ui.toast-container .toast-box:hover .pausable.progressing {\n  animation-play-state: paused;\n}\n.ui.toast-container .toast-box .ui.toast:not(.vertical) {\n  display: block;\n}\n.ui.toast-container .toast-box :not(.comment):not(.card) .actions {\n  margin: 0.5em -1em -1em -1em;\n}\n.ui.toast-container .toast-box :not(.comment) .actions {\n  padding: 0.5em 0.5em 0.75em 0.5em;\n  text-align: right;\n}\n.ui.toast-container .toast-box :not(.comment) .actions.attached:not(.vertical) {\n  margin-right: 1px;\n}\n.ui.toast-container .toast-box :not(.comment) .actions:not(.basic):not(.attached) {\n  background: rgba(255, 255, 255, 0.25);\n  border-top: 1px solid rgba(0, 0, 0, 0.2);\n}\n.ui.toast-container .toast-box :not(.comment) .actions.left {\n  text-align: left;\n}\n.ui.toast-container .toast-box .vertical.actions > .button,\n.ui.toast-container .toast-box > .vertical > .vertical.vertical,\n.ui.toast-container .toast-box > .vertical.vertical.vertical {\n  display: flex;\n}\n.ui.toast-container .toast-box :not(.comment) .vertical.actions {\n  flex-direction: column;\n}\n.ui.toast-container .toast-box :not(.comment) .vertical.actions > .button {\n  justify-content: center;\n}\n.ui.toast-container .toast-box :not(.comment) .vertical.actions.attached > .button {\n  align-items: center;\n}\n.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached) {\n  border-top: 0;\n  margin-top: -0.75em;\n  margin-bottom: -0.75em;\n  margin-left: 1em;\n  justify-content: space-around;\n}\n.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached):not(.basic) {\n  border-left: 1px solid rgba(0, 0, 0, 0.2);\n}\n.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached) > .button:not(:last-child) {\n  margin-bottom: 0.3em;\n}\n.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached).top {\n  justify-content: flex-start;\n}\n.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached).bottom {\n  justify-content: flex-end;\n}\n.ui.vertical.attached:not(.left).card > .image > img {\n  border-top-right-radius: 0;\n}\n.ui.vertical.attached:not(.left).card.horizontal > .image:last-child > img {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.vertical.attached:not(.left).card,\n.ui.vertical.attached:not(.left).toast {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.vertical.attached:not(.left).actions {\n  border-top-right-radius: 0.28571429rem;\n  border-bottom-right-radius: 0.28571429rem;\n}\n.ui.vertical.attached:not(.left).actions .button:first-child,\n.ui.vertical.attached:not(.left).actions .button:last-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ui.vertical.attached:not(.left).message {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 0.28571429rem;\n}\n.ui.vertical.attached.left.card > .image > img {\n  border-top-left-radius: 0;\n}\n.ui.vertical.attached.left.card.horizontal > .image > img {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ui.vertical.attached.left.card,\n.ui.vertical.attached.left.toast {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.ui.vertical.attached.left.actions {\n  border-top-left-radius: 0.28571429rem;\n  border-bottom-left-radius: 0.28571429rem;\n}\n.ui.vertical.attached.left.actions .button:first-child,\n.ui.vertical.attached.left.actions .button:last-child {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.vertical.attached.left.message.message.message {\n  border-top-right-radius: 0.28571429rem;\n  border-bottom-right-radius: 0.28571429rem;\n}\n.ui.attached:not(.vertical):not(.top).actions {\n  border-bottom-left-radius: 0.28571429rem;\n  border-bottom-right-radius: 0.28571429rem;\n}\n.ui.attached:not(.vertical):not(.top).actions .button:first-child {\n  border-bottom-left-radius: 0.28571429rem;\n}\n.ui.attached:not(.vertical):not(.top).actions .button:last-child {\n  border-bottom-right-radius: 0.28571429rem;\n}\n.ui.attached:not(.vertical).top.actions {\n  border-top-left-radius: 0.28571429rem;\n  border-top-right-radius: 0.28571429rem;\n}\n.ui.attached:not(.vertical).top.actions .button:first-child {\n  border-top-left-radius: 0.28571429rem;\n}\n.ui.attached:not(.vertical).top.actions .button:last-child {\n  border-top-right-radius: 0.28571429rem;\n}\n\n\n/*******************************\n            Toast\n*******************************/\n\n.ui.toast {\n  display: none;\n  border-radius: 0.28571429rem;\n  padding: 0.78571429em 1em;\n  margin: 0 -1px -0.01em;\n  color: rgba(0, 0, 0, 0.87);\n  background-color: #fff;\n}\n.ui.toast > .content > .header {\n  font-weight: bold;\n  color: inherit;\n  margin: 0;\n}\n.ui.toast.info {\n  background-color: #31ccec;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.toast.warning {\n  background-color: #f2c037;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.toast.success {\n  background-color: #21ba45;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.toast.error {\n  background-color: #db2828;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.toast.neutral {\n  background-color: #fff;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.toast > i.icon:not(.close) {\n  font-size: 1.5em;\n}\n.ui.toast:not(.vertical):not(.centered):not(.center) > i.icon:not(.close) {\n  position: absolute;\n}\n.ui.toast:not(.vertical):not(.centered):not(.center) > .ui.image {\n  position: absolute;\n}\n.ui.toast:not(.vertical) > i.icon:not(.close) + .content {\n  padding-left: 3em;\n}\n.ui.toast:not(.vertical) > .close.icon + .content {\n  padding-left: 1.5em;\n}\n.ui.toast:not(.vertical) > .ui.image.avatar + .content {\n  padding-left: 3em;\n  min-height: 2em;\n}\n.ui.toast:not(.vertical) > .ui.image.mini + .content {\n  padding-left: 3.4em;\n  min-height: 35px;\n}\n.ui.toast:not(.vertical) > .ui.image.tiny + .content {\n  padding-left: 7em;\n  min-height: 80px;\n}\n.ui.toast:not(.vertical) > .ui.image.small + .content {\n  padding-left: 12em;\n  min-height: 150px;\n}\n.ui.toast:not(.vertical):not(.centered):not(.center) > .centered.image,\n.ui.toast:not(.vertical):not(.centered):not(.center) > .centered.icon {\n  transform: translateY(-50%);\n  top: 50%;\n}\n.ui.toast:not(.vertical).actions > .centered.image {\n  top: calc(50% - 2em);\n}\n.ui.toast:not(.vertical).actions > .centered.icon {\n  top: calc(50% - 1.2em);\n}\n.ui.toast.vertical > .content {\n  flex-grow: 1;\n}\n.ui.toast.vertical.attached {\n  flex-grow: 1;\n}\n.ui.toast.vertical > .close.icon + .content {\n  padding-left: 1em;\n}\n.ui.toast.vertical > .ui.image + .content,\n.ui.toast.vertical > i.icon:not(.close) + .content {\n  padding-left: 1em;\n}\n.ui.toast.vertical > .ui.image {\n  align-self: flex-start;\n  flex-shrink: 0;\n  \n/* IE11 fix */\n}\n.ui.toast.vertical > .centered.image,\n.ui.toast.vertical > .centered.icon {\n  align-self: center;\n}\n.ui.toast.attached.bottom {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.ui.toast.attached.top {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ui.toast.ui.ui.ui.image {\n  padding: 0;\n}\n.ui.toast.ui.ui.ui.image > .content {\n  padding-top: 0.78571429em;\n  padding-bottom: 0.78571429em;\n  padding-right: 1em;\n}\n.ui.toast.ui.ui.ui.image > .actions {\n  margin: 0;\n}\n.ui.toast.ui.ui.ui.image > .ui.image {\n  border-top-left-radius: 0.28571429rem;\n  border-bottom-left-radius: 0.28571429rem;\n}\n.ui.toast.ui.ui.ui.image > .ui.image.mini {\n  min-width: calc(0.7857142857142857em + 35px);\n}\n.ui.toast.ui.ui.ui.image > .ui.image.mini + .content {\n  min-height: calc(0.7857142857142857em + 35px);\n  padding-left: 4.4em;\n}\n.ui.hoverfloating.message:hover {\n  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);\n}\n.ui.center.toast-container .toast-box,\n.ui.right.toast-container .toast-box {\n  margin-left: auto;\n}\n.ui.center.toast-container .toast-box {\n  margin-right: auto;\n}\n.ui.ui.toast-container .toast-box .centered.toast,\n.ui.ui.toast-container .toast-box .center.aligned.toast {\n  text-align: center;\n  display: flex;\n  justify-content: center;\n}\n.ui.ui.toast-container .toast-box .centered.toast > .content,\n.ui.ui.toast-container .toast-box .center.aligned.toast > .content,\n.ui.ui.toast-container .toast-box .centered.toast > .ui.image,\n.ui.ui.toast-container .toast-box .center.aligned.toast > .ui.image,\n.ui.ui.toast-container .toast-box .centered.toast > i.icon:not(.close),\n.ui.ui.toast-container .toast-box .center.aligned.toast > i.icon:not(.close) {\n  align-self: center;\n}\n.ui.toast-container .toast-box .toast .centered.content,\n.ui.toast-container .toast-box .toast .center.aligned.content {\n  text-align: center;\n}\n.ui.toast-container .toast-box .centered.actions,\n.ui.toast-container .toast-box .center.aligned.actions {\n  text-align: center;\n}\n.ui.toast-container .toast-box .centered.actions:not(.attached) > .button:not(.fluid),\n.ui.toast-container .toast-box .center.aligned.actions:not(.attached) > .button:not(.fluid) {\n  margin-left: 0.25em;\n  margin-right: 0.25em;\n}\n\n/* --------------\n     Colors\n-------------- */\n.ui.primary.toast {\n  background-color: #2185d0;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.primary.toast,\n.ui.toast-container .toast-box > .inverted.primary.attached.progress .bar {\n  background-color: #54c8ff;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.secondary.toast {\n  background-color: #1b1c1d;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.secondary.toast,\n.ui.toast-container .toast-box > .inverted.secondary.attached.progress .bar {\n  background-color: #545454;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.red.toast {\n  background-color: #db2828;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.red.toast,\n.ui.toast-container .toast-box > .inverted.red.attached.progress .bar {\n  background-color: #ff695e;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.orange.toast {\n  background-color: #f2711c;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.orange.toast,\n.ui.toast-container .toast-box > .inverted.orange.attached.progress .bar {\n  background-color: #ff851b;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.yellow.toast {\n  background-color: #fbbd08;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.yellow.toast,\n.ui.toast-container .toast-box > .inverted.yellow.attached.progress .bar {\n  background-color: #ffe21f;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.olive.toast {\n  background-color: #b5cc18;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.olive.toast,\n.ui.toast-container .toast-box > .inverted.olive.attached.progress .bar {\n  background-color: #d9e778;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.green.toast {\n  background-color: #21ba45;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.green.toast,\n.ui.toast-container .toast-box > .inverted.green.attached.progress .bar {\n  background-color: #2ecc40;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.teal.toast {\n  background-color: #00b5ad;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.teal.toast,\n.ui.toast-container .toast-box > .inverted.teal.attached.progress .bar {\n  background-color: #6dffff;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.blue.toast {\n  background-color: #2185d0;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.blue.toast,\n.ui.toast-container .toast-box > .inverted.blue.attached.progress .bar {\n  background-color: #54c8ff;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.violet.toast {\n  background-color: #6435c9;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.violet.toast,\n.ui.toast-container .toast-box > .inverted.violet.attached.progress .bar {\n  background-color: #a291fb;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.purple.toast {\n  background-color: #a333c8;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.purple.toast,\n.ui.toast-container .toast-box > .inverted.purple.attached.progress .bar {\n  background-color: #dc73ff;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.pink.toast {\n  background-color: #e03997;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.pink.toast,\n.ui.toast-container .toast-box > .inverted.pink.attached.progress .bar {\n  background-color: #ff8edf;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.brown.toast {\n  background-color: #a5673f;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.brown.toast,\n.ui.toast-container .toast-box > .inverted.brown.attached.progress .bar {\n  background-color: #d67c1c;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.grey.toast {\n  background-color: #767676;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.grey.toast,\n.ui.toast-container .toast-box > .inverted.grey.attached.progress .bar {\n  background-color: #dcddde;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.black.toast {\n  background-color: #1b1c1d;\n  color: rgba(255, 255, 255, 0.9);\n}\n.ui.inverted.black.toast,\n.ui.toast-container .toast-box > .inverted.black.attached.progress .bar {\n  background-color: #545454;\n  color: rgba(0, 0, 0, 0.87);\n}\n.ui.inverted.toast {\n  color: rgba(255, 255, 255, 0.9);\n  background-color: #1b1c1d;\n}\n@media only screen and (max-width: 420px) {\n  .ui.toast-container .toast-box.toast-box,\n  .ui.toast-container .toast-box > .compact,\n  .ui.toast-container .toast-box > .vertical > *,\n  .ui.toast-container .toast-box > * {\n    width: auto;\n    max-width: 100%;\n  }\n  .ui.toast-container .toast-box > *:not(.vertical) {\n    min-width: 280px;\n  }\n  .ui.toast-container .toast-box > .ui.card.horizontal,\n  .ui.toast-container .toast-box > .vertical > .ui.horizontal.card {\n    min-width: initial;\n  }\n}\n\n/* ---------------\n   Progress Bar\n ---------------- */\n@keyframes progressDown {\n  0% {\n    width: 100%;\n  }\n  100% {\n    width: 0;\n  }\n}\n@keyframes progressUp {\n  0% {\n    width: 0;\n  }\n  100% {\n    width: 100%;\n  }\n}\n@keyframes progressWait {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n\n/*******************************\n         Theme Overrides\n*******************************/\n\n\n\n/*******************************\n        User Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/toast.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Toast\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.toast = function (parameters) {\n        var\n            $allModules    = $(this),\n            $body          = $('body'),\n\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n            contextCheck   = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $(context);\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : $body;\n                    }\n                }\n\n                return $context;\n            },\n            returnedValue\n        ;\n        $allModules.each(function () {\n            var\n                settings          = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.toast.settings, parameters)\n                    : $.extend({}, $.fn.toast.settings),\n\n                className        = settings.className,\n                selector         = settings.selector,\n                error            = settings.error,\n                namespace        = settings.namespace,\n                fields           = settings.fields,\n\n                eventNamespace   = '.' + namespace,\n                moduleNamespace  = namespace + '-module',\n\n                $module          = $(this),\n                $toastBox,\n                $toast,\n                $actions,\n                $progress,\n                $progressBar,\n                $animationObject,\n                $close,\n                $context         = settings.context ? contextCheck(settings.context, window) : $body,\n\n                isToastComponent = $module.hasClass('toast') || $module.hasClass('message') || $module.hasClass('card'),\n\n                element          = this,\n                instance         = isToastComponent ? $module.data(moduleNamespace) : undefined,\n\n                id,\n                module\n            ;\n            module = {\n\n                initialize: function () {\n                    module.verbose('Initializing element');\n                    module.create.id();\n                    if (!module.has.container()) {\n                        module.create.container();\n                    }\n                    if (isToastComponent || settings.message !== '' || settings.title !== '' || module.get.iconClass() !== '' || settings.showImage || module.has.configActions()) {\n                        if (typeof settings.showProgress !== 'string' || [className.top, className.bottom].indexOf(settings.showProgress) === -1) {\n                            settings.showProgress = false;\n                        }\n                        module.create.toast();\n                        if (settings.closeOnClick && (settings.closeIcon || $($toast).find(selector.input).length > 0 || module.has.configActions())) {\n                            settings.closeOnClick = false;\n                        }\n                        if (!settings.closeOnClick) {\n                            $toastBox.addClass(className.unclickable);\n                        }\n                        module.bind.events();\n                    }\n                    module.instantiate();\n                    if ($toastBox) {\n                        module.show();\n                    }\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of toast');\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, instance)\n                    ;\n                },\n\n                destroy: function () {\n                    if ($toastBox) {\n                        module.debug('Removing toast', $toastBox);\n                        module.unbind.events();\n                        settings.onRemove.call($toastBox, element);\n                        $toastBox.remove();\n                        $toastBox = undefined;\n                        $toast = undefined;\n                        $animationObject = undefined;\n                        $progress = undefined;\n                        $progressBar = undefined;\n                        $close = undefined;\n                    }\n                    $module\n                        .removeData(moduleNamespace)\n                    ;\n                },\n\n                show: function (callback) {\n                    if (settings.onShow.call($toastBox, element) === false) {\n                        module.debug('onShow callback returned false, cancelling toast animation');\n\n                        return;\n                    }\n                    callback = callback || function () {};\n                    module.debug('Showing toast');\n                    module.animate.show(callback);\n                },\n\n                close: function (callback) {\n                    if (settings.onHide.call($toastBox, element) === false) {\n                        module.debug('onHide callback returned false, cancelling toast animation');\n\n                        return;\n                    }\n                    callback = callback || function () {};\n                    module.debug('Closing toast');\n                    module.remove.visible();\n                    module.unbind.events();\n                    module.animate.close(callback);\n                },\n\n                create: {\n                    container: function () {\n                        module.verbose('Creating container');\n                        $context.append($('<div/>', {\n                            class: settings.position + ' ' + className.container + ' '\n                            + (settings.horizontal ? className.horizontal : '') + ' '\n                            + (settings.context && settings.context !== 'body' ? className.absolute : ''),\n                        }));\n                    },\n                    id: function () {\n                        id = (Math.random().toString(16) + '000000000').slice(2, 10);\n                        module.verbose('Creating unique id for element', id);\n                    },\n                    toast: function () {\n                        $toastBox = $('<div/>', { class: className.box });\n                        var iconClass = module.get.iconClass();\n                        if (!isToastComponent) {\n                            module.verbose('Creating toast');\n                            $toast = $('<div/>', { role: 'alert' });\n                            var $content = $('<div/>', { class: className.content });\n                            if (iconClass !== '') {\n                                $toast.append($('<i/>', { class: iconClass + ' ' + className.icon }));\n                            }\n\n                            if (settings.showImage) {\n                                $toast.append($('<img>', {\n                                    class: className.image + ' ' + settings.classImage,\n                                    src: settings.showImage,\n                                    alt: settings.alt || '',\n                                }));\n                            }\n                            if (settings.title !== '') {\n                                var titleId = '_' + module.get.id() + 'title';\n                                $toast.attr('aria-labelledby', titleId);\n                                $content.append($('<div/>', {\n                                    class: className.title,\n                                    id: titleId,\n                                    html: module.helpers.escape(settings.title, settings.preserveHTML),\n                                }));\n                            }\n                            var descId = '_' + module.get.id() + 'desc';\n                            $toast.attr('aria-describedby', descId);\n                            $content.append($('<div/>', {\n                                class: className.message,\n                                id: descId,\n                                html: module.helpers.escape(settings.message, settings.preserveHTML),\n                            }));\n\n                            $toast\n                                .addClass(settings.class + ' ' + className.toast)\n                                .append($content)\n                            ;\n                            $toast.css('opacity', String(settings.opacity));\n                            if (settings.closeIcon) {\n                                $close = $('<i/>', {\n                                    class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : ''),\n                                    role: 'button',\n                                    tabindex: 0,\n                                    'aria-label': settings.text.close,\n                                });\n                                if ($close.hasClass(className.left)) {\n                                    $toast.prepend($close);\n                                } else {\n                                    $toast.append($close);\n                                }\n                            }\n                        } else {\n                            $toast = settings.cloneModule ? $module.clone().removeAttr('id') : $module;\n                            $close = $toast.find('> i' + module.helpers.toClass(className.close));\n                            settings.closeIcon = $close.length > 0;\n                            if (iconClass !== '') {\n                                $toast.find(selector.icon).attr('class', iconClass + ' ' + className.icon);\n                            }\n                            if (settings.showImage) {\n                                $toast.find(selector.image).attr('src', settings.showImage).attr('alt', settings.alt || '');\n                            }\n                            if (settings.title !== '') {\n                                $toast.find(selector.title).html(module.helpers.escape(settings.title, settings.preserveHTML));\n                            }\n                            if (settings.message !== '') {\n                                $toast.find(selector.message).html(module.helpers.escape(settings.message, settings.preserveHTML));\n                            }\n                        }\n                        if ($toast.hasClass(className.compact)) {\n                            settings.compact = true;\n                        }\n                        if ($toast.hasClass('card')) {\n                            settings.compact = false;\n                        }\n                        $actions = $toast.find('.actions');\n                        if (module.has.configActions()) {\n                            if ($actions.length === 0) {\n                                $actions = $('<div/>', { class: className.actions + ' ' + (settings.classActions || '') }).appendTo($toast);\n                            }\n                            if ($toast.hasClass('card') && !$actions.hasClass(className.attached)) {\n                                $actions.addClass(className.extraContent);\n                                if ($actions.hasClass(className.vertical)) {\n                                    $actions.removeClass(className.vertical);\n                                    module.error(error.verticalCard);\n                                }\n                            }\n                            settings.actions.forEach(function (el) {\n                                var\n                                    icon = el[fields.icon]\n                                        ? '<i ' + (el[fields.text] ? 'aria-hidden=\"true\"' : '')\n                                            + ' class=\"' + module.helpers.deQuote(el[fields.icon]) + ' icon\"></i>'\n                                        : '',\n                                    text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),\n                                    cls = module.helpers.deQuote(el[fields.class] || ''),\n                                    click = el[fields.click] && isFunction(el[fields.click])\n                                        ? el[fields.click]\n                                        : function () {}\n                                ;\n                                $actions.append($('<button/>', {\n                                    html: icon + text,\n                                    'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g, ''),\n                                    class: className.button + ' ' + cls,\n                                    on: {\n                                        click: function () {\n                                            var $button = $(this);\n                                            if ($button.is(selector.approve) || $button.is(selector.deny) || click.call(element, $module) === false) {\n                                                return;\n                                            }\n                                            module.close();\n                                        },\n                                    },\n                                }));\n                            });\n                        }\n                        if ($actions && $actions.hasClass(className.vertical)) {\n                            $toast.addClass(className.vertical);\n                        }\n                        if ($actions.length > 0 && !$actions.hasClass(className.attached)) {\n                            if ($actions && (!$actions.hasClass(className.basic) || $actions.hasClass(className.left))) {\n                                $toast.addClass(className.actions);\n                            }\n                        }\n                        if (settings.displayTime === 'auto') {\n                            settings.displayTime = Math.max(settings.minDisplayTime, ($toast.text().split(' ').length / settings.wordsPerMinute) * 60000);\n                        }\n                        $toastBox.append($toast);\n\n                        if ($actions.length > 0 && $actions.hasClass(className.attached)) {\n                            $actions.addClass(className.buttons);\n                            $actions.detach();\n                            $toast.addClass(className.attached);\n                            if (!$actions.hasClass(className.vertical)) {\n                                if ($actions.hasClass(className.top)) {\n                                    $toastBox.prepend($actions);\n                                    $toast.addClass(className.bottom);\n                                } else {\n                                    $toastBox.append($actions);\n                                    $toast.addClass(className.top);\n                                }\n                            } else {\n                                $toast.wrap(\n                                    $('<div/>', {\n                                        class: className.vertical + ' '\n                                            + className.attached + ' '\n                                            + (settings.compact ? className.compact : ''),\n                                    })\n                                );\n                                if ($actions.hasClass(className.left)) {\n                                    $toast.addClass(className.left).parent().addClass(className.left).prepend($actions);\n                                } else {\n                                    $toast.parent().append($actions);\n                                }\n                            }\n                        }\n                        if ($module !== $toast) {\n                            $module = $toast;\n                            element = $toast[0];\n                        }\n                        if (settings.displayTime > 0) {\n                            var progressingClass = className.progressing + ' ' + (settings.pauseOnHover ? className.pausable : '');\n                            if (settings.showProgress) {\n                                $progress = $('<div/>', {\n                                    class: className.progress + ' ' + (settings.classProgress || settings.class),\n                                    'data-percent': '',\n                                });\n                                if (!settings.classProgress) {\n                                    if ($toast.hasClass('toast') && !$toast.hasClass(className.inverted)) {\n                                        $progress.addClass(className.inverted);\n                                    } else {\n                                        $progress.removeClass(className.inverted);\n                                    }\n                                }\n                                $progressBar = $('<div/>', { class: 'bar ' + (settings.progressUp ? 'up ' : 'down ') + progressingClass });\n                                $progress\n                                    .addClass(settings.showProgress)\n                                    .append($progressBar)\n                                ;\n                                if ($progress.hasClass(className.top)) {\n                                    $toastBox.prepend($progress);\n                                } else {\n                                    $toastBox.append($progress);\n                                }\n                                $progressBar.css('animation-duration', settings.displayTime / 1000 + 's');\n                            }\n                            $animationObject = $('<span/>', { class: 'wait ' + progressingClass });\n                            $animationObject.css('animation-duration', settings.displayTime / 1000 + 's');\n                            $animationObject.appendTo($toast);\n                        }\n                        if (settings.compact) {\n                            $toastBox.addClass(className.compact);\n                            $toast.addClass(className.compact);\n                            if ($progress) {\n                                $progress.addClass(className.compact);\n                            }\n                        }\n                        if (settings.newestOnTop) {\n                            $toastBox.prependTo(module.get.container());\n                        } else {\n                            $toastBox.appendTo(module.get.container());\n                        }\n                    },\n                },\n\n                bind: {\n                    events: function () {\n                        module.debug('Binding events to toast');\n                        if (settings.closeIcon) {\n                            $close.on('click' + eventNamespace, module.event.close);\n                        }\n                        $toast.on('click' + eventNamespace, module.event.click);\n                        if ($animationObject) {\n                            $animationObject.on('animationend' + eventNamespace, module.event.close);\n                        }\n                        $toastBox\n                            .on('click' + eventNamespace, selector.approve, module.event.approve)\n                            .on('click' + eventNamespace, selector.deny, module.event.deny)\n                        ;\n                    },\n                },\n\n                unbind: {\n                    events: function () {\n                        module.debug('Unbinding events to toast');\n                        if (settings.closeIcon) {\n                            $close.off('click' + eventNamespace);\n                        }\n                        $toast.off('click' + eventNamespace);\n                        if ($animationObject) {\n                            $animationObject.off('animationend' + eventNamespace);\n                        }\n                        $toastBox\n                            .off('click' + eventNamespace)\n                        ;\n                    },\n                },\n\n                animate: {\n                    show: function (callback) {\n                        callback = isFunction(callback) ? callback : function () {};\n                        if (settings.transition && module.can.useElement('transition')) {\n                            module.set.visible();\n                            $toastBox\n                                .transition({\n                                    animation: settings.transition.showMethod + ' in',\n                                    queue: false,\n                                    debug: settings.debug,\n                                    verbose: settings.verbose,\n                                    silent: settings.silent,\n                                    duration: settings.transition.showDuration,\n                                    onComplete: function () {\n                                        callback.call($toastBox, element);\n                                        settings.onVisible.call($toastBox, element);\n                                    },\n                                })\n                            ;\n                        }\n                    },\n                    close: function (callback) {\n                        callback = isFunction(callback) ? callback : function () {};\n                        if (settings.transition && $.fn.transition !== undefined) {\n                            $toastBox\n                                .transition({\n                                    animation: settings.transition.hideMethod + ' out',\n                                    queue: false,\n                                    duration: settings.transition.hideDuration,\n                                    debug: settings.debug,\n                                    verbose: settings.verbose,\n                                    silent: settings.silent,\n                                    interval: 50,\n\n                                    onBeforeHide: function (callback) {\n                                        callback = isFunction(callback) ? callback : function () {};\n                                        if (settings.transition.closeEasing !== '') {\n                                            if ($toastBox) {\n                                                $toastBox.css('opacity', '0');\n                                                $toastBox.wrap('<div/>').parent().hide(settings.transition.closeDuration, settings.transition.closeEasing, function () {\n                                                    if ($toastBox) {\n                                                        $toastBox.parent().remove();\n                                                        callback.call($toastBox);\n                                                    }\n                                                });\n                                            }\n                                        } else {\n                                            callback.call($toastBox);\n                                        }\n                                    },\n                                    onComplete: function () {\n                                        callback.call($toastBox, element);\n                                        settings.onHidden.call($toastBox, element);\n                                        module.destroy();\n                                    },\n                                })\n                            ;\n                        } else {\n                            module.error(error.noTransition);\n                        }\n                    },\n                    pause: function () {\n                        $animationObject.css('animationPlayState', 'paused');\n                        if ($progressBar) {\n                            $progressBar.css('animationPlayState', 'paused');\n                        }\n                    },\n                    continue: function () {\n                        $animationObject.css('animationPlayState', 'running');\n                        if ($progressBar) {\n                            $progressBar.css('animationPlayState', 'running');\n                        }\n                    },\n                },\n\n                has: {\n                    container: function () {\n                        module.verbose('Determining if there is already a container');\n\n                        return module.get.containers().length > 0;\n                    },\n                    toast: function () {\n                        return !!module.get.toast();\n                    },\n                    toasts: function () {\n                        return module.get.toasts().length > 0;\n                    },\n                    configActions: function () {\n                        return Array.isArray(settings.actions) && settings.actions.length > 0;\n                    },\n                },\n\n                get: {\n                    id: function () {\n                        return id;\n                    },\n                    containers: function () {\n                        return $context.children(module.helpers.toClass(settings.position) + selector.container\n                            + (settings.horizontal\n                                ? module.helpers.toClass(className.horizontal)\n                                : ':not(' + module.helpers.toClass(className.horizontal) + ')')\n                            + (settings.context && settings.context !== 'body'\n                                ? module.helpers.toClass(className.absolute)\n                                : ':not(' + module.helpers.toClass(className.absolute) + ')'));\n                    },\n                    container: function () {\n                        return module.get.containers()[0];\n                    },\n                    toastBox: function () {\n                        return $toastBox || null;\n                    },\n                    toast: function () {\n                        return $toast || null;\n                    },\n                    toasts: function () {\n                        return $(module.get.container()).find(selector.box);\n                    },\n                    iconClass: function () {\n                        return typeof settings.showIcon === 'string'\n                            ? settings.showIcon\n                            : (settings.showIcon && settings.icons[settings.class]\n                                ? settings.icons[settings.class]\n                                : '');\n                    },\n                    remainingTime: function () {\n                        return $animationObject ? $animationObject.css('opacity') * settings.displayTime : 0;\n                    },\n                },\n\n                set: {\n                    visible: function () {\n                        $toast.addClass(className.visible);\n                    },\n                },\n\n                remove: {\n                    visible: function () {\n                        $toast.removeClass(className.visible);\n                    },\n                },\n\n                event: {\n                    close: function () {\n                        module.close();\n                    },\n                    click: function (event) {\n                        if ($(event.target).closest(selector.clickable).length === 0) {\n                            if (settings.onClick.call($toastBox, element) === false || !settings.closeOnClick) {\n                                module.verbose('Click callback returned false or close denied by setting cancelling close');\n\n                                return;\n                            }\n                            module.close();\n                        }\n                    },\n                    approve: function () {\n                        if (settings.onApprove.call(element, $module) === false) {\n                            module.verbose('Approve callback returned false cancelling close');\n\n                            return;\n                        }\n                        module.close();\n                    },\n                    deny: function () {\n                        if (settings.onDeny.call(element, $module) === false) {\n                            module.verbose('Deny callback returned false cancelling close');\n\n                            return;\n                        }\n                        module.close();\n                    },\n                },\n\n                helpers: {\n                    toClass: function (selector) {\n                        var\n                            classes = selector.trim().split(/\\s+/),\n                            result = ''\n                        ;\n\n                        classes.forEach(function (element) {\n                            result += '.' + element;\n                        });\n\n                        return result;\n                    },\n                    deQuote: function (string) {\n                        return String(string).replace(/\"/g, '');\n                    },\n                    escape: function (string, preserveHTML) {\n                        if (preserveHTML) {\n                            return string;\n                        }\n                        var\n                            badChars     = /[\"'<>`]/g,\n                            shouldEscape = /[\"&'<>`]/,\n                            escape       = {\n                                '<': '&lt;',\n                                '>': '&gt;',\n                                '\"': '&quot;',\n                                \"'\": '&#x27;',\n                                '`': '&#x60;',\n                            },\n                            escapedChar  = function (chr) {\n                                return escape[chr];\n                            }\n                        ;\n                        if (shouldEscape.test(string)) {\n                            string = string.replace(/&(?![\\d#a-z]{1,12};)/gi, '&amp;');\n\n                            return string.replace(badChars, escapedChar);\n                        }\n\n                        return string;\n                    },\n                },\n\n                can: {\n                    useElement: function (element) {\n                        if ($.fn[element] !== undefined) {\n                            return true;\n                        }\n                        module.error(error.noElement.replace('{element}', element));\n\n                        return false;\n                    },\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n                returnedValue = $module;\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n    $.toast = $.fn.toast;\n\n    $.fn.toast.settings = {\n\n        name: 'Toast',\n        namespace: 'toast',\n\n        silent: false,\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        context: 'body',\n\n        position: 'top right',\n        horizontal: false,\n        class: 'neutral',\n        classProgress: false,\n        classActions: false,\n        classImage: 'mini',\n\n        title: '',\n        message: '',\n        displayTime: 3000, // set to zero to require manually dismissal, otherwise hides on its own\n        minDisplayTime: 1000, // minimum displaytime in case displayTime is set to 'auto'\n        wordsPerMinute: 120,\n        showIcon: false,\n        newestOnTop: false,\n        showProgress: false,\n        pauseOnHover: true,\n        progressUp: false, // if true, the bar will start at 0% and increase to 100%\n        opacity: 1,\n        compact: true,\n        closeIcon: false,\n        closeOnClick: true,\n        cloneModule: true,\n        actions: false,\n        preserveHTML: true,\n        showImage: false,\n        alt: false,\n\n        // transition settings\n        transition: {\n            showMethod: 'scale',\n            showDuration: 500,\n            hideMethod: 'scale',\n            hideDuration: 500,\n            closeEasing: 'easeOutCubic', // Set to empty string to stack the closed toast area immediately (old behaviour)\n            closeDuration: 500,\n        },\n\n        error: {\n            method: 'The method you called is not defined.',\n            noElement: 'This module requires ui {element}',\n            verticalCard: 'Vertical but not attached actions are not supported for card layout',\n        },\n\n        className: {\n            container: 'ui toast-container',\n            absolute: 'absolute',\n            box: 'floating toast-box',\n            progress: 'ui attached active progress',\n            toast: 'ui toast',\n            icon: 'centered icon',\n            visible: 'visible',\n            content: 'content',\n            title: 'ui header',\n            message: 'message',\n            actions: 'actions',\n            extraContent: 'extra content',\n            button: 'ui button',\n            buttons: 'ui buttons',\n            close: 'close icon',\n            image: 'ui image',\n            vertical: 'vertical',\n            horizontal: 'horizontal',\n            attached: 'attached',\n            inverted: 'inverted',\n            compact: 'compact',\n            pausable: 'pausable',\n            progressing: 'progressing',\n            top: 'top',\n            bottom: 'bottom',\n            left: 'left',\n            basic: 'basic',\n            unclickable: 'unclickable',\n        },\n\n        text: {\n            close: 'Close',\n        },\n\n        icons: {\n            info: 'info',\n            success: 'checkmark',\n            warning: 'warning',\n            error: 'times',\n        },\n\n        selector: {\n            container: '.ui.toast-container',\n            box: '.toast-box',\n            toast: '.ui.toast',\n            title: '.header',\n            message: '.message:not(.ui)',\n            image: '> img.image, > .image > img',\n            icon: '> i.icon',\n            input: 'input:not([type=\"hidden\"]), textarea, select, button, .ui.button, ui.dropdown',\n            clickable: 'a, details, .ui.accordion',\n            approve: '.actions .positive, .actions .approve, .actions .ok',\n            deny: '.actions .negative, .actions .deny, .actions .cancel',\n        },\n\n        fields: {\n            class: 'class',\n            text: 'text',\n            icon: 'icon',\n            click: 'click',\n        },\n\n        // callbacks\n        onShow: function () {},\n        onVisible: function () {},\n        onClick: function () {},\n        onHide: function () {},\n        onHidden: function () {},\n        onRemove: function () {},\n        onApprove: function () {},\n        onDeny: function () {},\n    };\n\n    $.extend($.easing, {\n        easeOutBounce: function (x) {\n            var\n                n1 = 7.5625,\n                d1 = 2.75\n            ;\n            if (x < 1 / d1) {\n                return n1 * x * x;\n            }\n            if (x < 2 / d1) {\n                x -= 1.5 / d1;\n\n                return n1 * x * x + 0.75;\n            }\n            if (x < 2.5 / d1) {\n                x -= 2.25 / d1;\n\n                return n1 * x * x + 0.9375;\n            }\n            x -= 2.625 / d1;\n\n            return n1 * x * x + 0.984375;\n        },\n        easeOutCubic: function (t) {\n            return --t * t * t + 1;\n        },\n    });\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/transition.css",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Transition\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n          Transitions\n*******************************/\n\n.transition {\n  animation-iteration-count: 1;\n  animation-duration: 300ms;\n  animation-timing-function: ease;\n  animation-fill-mode: both;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/* Animating */\n.animating.transition {\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  visibility: visible !important;\n}\n\n/* Loading */\n.loading.transition {\n  position: absolute;\n  top: -99999px;\n  left: -99999px;\n}\n\n/* Hidden */\n.hidden.transition {\n  display: none;\n  visibility: hidden;\n}\n\n/* Visible */\n.visible.transition {\n  display: block !important;\n  visibility: visible !important;\n  \n/* backface-visibility: @backfaceVisibility;\n      transform: @use3DAcceleration; */\n}\n\n/* Disabled */\n.disabled.transition {\n  animation-play-state: paused;\n}\n\n\n/*******************************\n          Variations\n*******************************/\n\n.looping.transition {\n  animation-iteration-count: infinite;\n}\n\n/* Pulsating */\n.pulsating.transition {\n  animation-name: pulsating;\n  animation-duration: 2000ms;\n  box-shadow: 0 0 0 0 rgba(128, 128, 128, 0.5);\n}\n.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.7);\n}\n@keyframes pulsating {\n  100% {\n    box-shadow: 0 0 0 0.8rem rgba(255, 255, 255, 0);\n  }\n}\n.primary.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(33, 133, 208, 0.5);\n}\n.primary.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(84, 200, 255, 0.7);\n}\n.secondary.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(27, 28, 29, 0.5);\n}\n.secondary.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(84, 84, 84, 0.7);\n}\n.red.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(219, 40, 40, 0.5);\n}\n.red.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(255, 105, 94, 0.7);\n}\n.orange.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(242, 113, 28, 0.5);\n}\n.orange.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(255, 133, 27, 0.7);\n}\n.yellow.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(251, 189, 8, 0.5);\n}\n.yellow.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(255, 226, 31, 0.7);\n}\n.olive.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(181, 204, 24, 0.5);\n}\n.olive.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(217, 231, 120, 0.7);\n}\n.green.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(33, 186, 69, 0.5);\n}\n.green.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(46, 204, 64, 0.7);\n}\n.teal.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(0, 181, 173, 0.5);\n}\n.teal.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(109, 255, 255, 0.7);\n}\n.blue.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(33, 133, 208, 0.5);\n}\n.blue.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(84, 200, 255, 0.7);\n}\n.violet.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(100, 53, 201, 0.5);\n}\n.violet.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(162, 145, 251, 0.7);\n}\n.purple.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(163, 51, 200, 0.5);\n}\n.purple.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(220, 115, 255, 0.7);\n}\n.pink.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(224, 57, 151, 0.5);\n}\n.pink.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(255, 142, 223, 0.7);\n}\n.brown.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(165, 103, 63, 0.5);\n}\n.brown.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(214, 124, 28, 0.7);\n}\n.grey.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(118, 118, 118, 0.5);\n}\n.grey.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(220, 221, 222, 0.7);\n}\n.black.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(27, 28, 29, 0.5);\n}\n.black.inverted.pulsating.transition {\n  box-shadow: 0 0 0 0 rgba(84, 84, 84, 0.7);\n}\n\n\n/*******************************\n          Transitions\n*******************************/\n\n/*\n  Some transitions adapted from Animate CSS\n  https://github.com/daneden/animate.css\n\n  Additional transitions adapted from Glide\n  by Nick Pettit - https://github.com/nickpettit/glide\n*/\n\n/* --------------\n         Browse\n    --------------- */\n.transition.browse {\n  animation-duration: 500ms;\n}\n.transition.browse.in {\n  animation-name: browseIn;\n}\n.transition.browse.out,\n.transition.browse.left.out {\n  animation-name: browseOutLeft;\n}\n.transition.browse.right.out {\n  animation-name: browseOutRight;\n}\n\n/* In */\n@keyframes browseIn {\n  0% {\n    transform: scale(0.8) translateZ(0);\n    z-index: -1;\n  }\n  10% {\n    transform: scale(0.8) translateZ(0);\n    z-index: -1;\n    opacity: 0.7;\n  }\n  80% {\n    transform: scale(1.05) translateZ(0);\n    opacity: 1;\n    z-index: 999;\n  }\n  100% {\n    transform: scale(1) translateZ(0);\n    z-index: 999;\n  }\n}\n\n/* Out */\n@keyframes browseOutLeft {\n  0% {\n    z-index: 999;\n    transform: translateX(0) rotateY(0) rotateX(0);\n  }\n  50% {\n    z-index: -1;\n    transform: translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);\n  }\n  80% {\n    opacity: 1;\n  }\n  100% {\n    z-index: -1;\n    transform: translateX(0) rotateY(0) rotateX(0) translateZ(-10px);\n    opacity: 0;\n  }\n}\n@keyframes browseOutRight {\n  0% {\n    z-index: 999;\n    transform: translateX(0) rotateY(0) rotateX(0);\n  }\n  50% {\n    z-index: 1;\n    transform: translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);\n  }\n  80% {\n    opacity: 1;\n  }\n  100% {\n    z-index: 1;\n    transform: translateX(0) rotateY(0) rotateX(0) translateZ(-10px);\n    opacity: 0;\n  }\n}\n\n/* --------------\n         Drop\n    --------------- */\n.drop.transition {\n  transform-origin: top center;\n  animation-duration: 400ms;\n  animation-timing-function: cubic-bezier(0.34, 1.61, 0.7, 1);\n}\n.drop.transition.in {\n  animation-name: dropIn;\n}\n.drop.transition.out {\n  animation-name: dropOut;\n}\n\n/* Drop */\n@keyframes dropIn {\n  0% {\n    opacity: 0;\n    transform: scale(0);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n@keyframes dropOut {\n  0% {\n    opacity: 1;\n    transform: scale(1);\n  }\n  100% {\n    opacity: 0;\n    transform: scale(0);\n  }\n}\n\n/* --------------\n          Fade\n    --------------- */\n.transition.fade.in {\n  animation-name: fadeIn;\n}\n.transition[class*=\"fade up\"].in {\n  animation-name: fadeInUp;\n}\n.transition[class*=\"fade down\"].in {\n  animation-name: fadeInDown;\n}\n.transition[class*=\"fade left\"].in {\n  animation-name: fadeInLeft;\n}\n.transition[class*=\"fade right\"].in {\n  animation-name: fadeInRight;\n}\n.transition.fade.out {\n  animation-name: fadeOut;\n}\n.transition[class*=\"fade up\"].out {\n  animation-name: fadeOutUp;\n}\n.transition[class*=\"fade down\"].out {\n  animation-name: fadeOutDown;\n}\n.transition[class*=\"fade left\"].out {\n  animation-name: fadeOutLeft;\n}\n.transition[class*=\"fade right\"].out {\n  animation-name: fadeOutRight;\n}\n\n/* In */\n@keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n@keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    transform: translateY(10%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    transform: translateY(-10%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n@keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    transform: translateX(10%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateX(0);\n  }\n}\n@keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    transform: translateX(-10%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateX(0);\n  }\n}\n\n/* Out */\n@keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n  100% {\n    opacity: 0;\n    transform: translateY(5%);\n  }\n}\n@keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n  100% {\n    opacity: 0;\n    transform: translateY(-5%);\n  }\n}\n@keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n    transform: translateX(0);\n  }\n  100% {\n    opacity: 0;\n    transform: translateX(5%);\n  }\n}\n@keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n    transform: translateX(0);\n  }\n  100% {\n    opacity: 0;\n    transform: translateX(-5%);\n  }\n}\n\n/* --------------\n         Flips\n    --------------- */\n.flip.transition.in,\n.flip.transition.out {\n  animation-duration: 600ms;\n}\n.horizontal.flip.transition.in {\n  animation-name: horizontalFlipIn;\n}\n.horizontal.flip.transition.out {\n  animation-name: horizontalFlipOut;\n}\n.vertical.flip.transition.in {\n  animation-name: verticalFlipIn;\n}\n.vertical.flip.transition.out {\n  animation-name: verticalFlipOut;\n}\n\n/* In */\n@keyframes horizontalFlipIn {\n  0% {\n    transform: perspective(2000px) rotateY(-90deg);\n    opacity: 0;\n  }\n  100% {\n    transform: perspective(2000px) rotateY(0);\n    opacity: 1;\n  }\n}\n@keyframes verticalFlipIn {\n  0% {\n    transform: perspective(2000px) rotateX(-90deg);\n    opacity: 0;\n  }\n  100% {\n    transform: perspective(2000px) rotateX(0);\n    opacity: 1;\n  }\n}\n\n/* Out */\n@keyframes horizontalFlipOut {\n  0% {\n    transform: perspective(2000px) rotateY(0);\n    opacity: 1;\n  }\n  100% {\n    transform: perspective(2000px) rotateY(90deg);\n    opacity: 0;\n  }\n}\n@keyframes verticalFlipOut {\n  0% {\n    transform: perspective(2000px) rotateX(0);\n    opacity: 1;\n  }\n  100% {\n    transform: perspective(2000px) rotateX(-90deg);\n    opacity: 0;\n  }\n}\n\n/* --------------\n          Scale\n    --------------- */\n.scale.transition.in {\n  animation-name: scaleIn;\n}\n.scale.transition.out {\n  animation-name: scaleOut;\n}\n@keyframes scaleIn {\n  0% {\n    opacity: 0;\n    transform: scale(0.8);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n\n/* Out */\n@keyframes scaleOut {\n  0% {\n    opacity: 1;\n    transform: scale(1);\n  }\n  100% {\n    opacity: 0;\n    transform: scale(0.9);\n  }\n}\n\n/* --------------\n          Fly\n    --------------- */\n\n/* Inward */\n.transition.fly {\n  animation-duration: 0.6s;\n  transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n.transition.fly.in {\n  animation-name: flyIn;\n}\n.transition[class*=\"fly up\"].in {\n  animation-name: flyInUp;\n}\n.transition[class*=\"fly down\"].in {\n  animation-name: flyInDown;\n}\n.transition[class*=\"fly left\"].in {\n  animation-name: flyInLeft;\n}\n.transition[class*=\"fly right\"].in {\n  animation-name: flyInRight;\n}\n\n/* Outward */\n.transition.fly.out {\n  animation-name: flyOut;\n}\n.transition[class*=\"fly up\"].out {\n  animation-name: flyOutUp;\n}\n.transition[class*=\"fly down\"].out {\n  animation-name: flyOutDown;\n}\n.transition[class*=\"fly left\"].out {\n  animation-name: flyOutLeft;\n}\n.transition[class*=\"fly right\"].out {\n  animation-name: flyOutRight;\n}\n\n/* In */\n@keyframes flyIn {\n  0% {\n    opacity: 0;\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  20% {\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  60% {\n    opacity: 1;\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    transform: scale3d(0.97, 0.97, 0.97);\n  }\n  100% {\n    opacity: 1;\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes flyInUp {\n  0% {\n    opacity: 0;\n    transform: translate3d(0, 1500px, 0);\n  }\n  60% {\n    opacity: 1;\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    transform: translate3d(0, 0, 0);\n  }\n}\n@keyframes flyInDown {\n  0% {\n    opacity: 0;\n    transform: translate3d(0, -1500px, 0);\n  }\n  60% {\n    opacity: 1;\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    transform: none;\n  }\n}\n@keyframes flyInLeft {\n  0% {\n    opacity: 0;\n    transform: translate3d(1500px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    transform: none;\n  }\n}\n@keyframes flyInRight {\n  0% {\n    opacity: 0;\n    transform: translate3d(-1500px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    transform: none;\n  }\n}\n\n/* Out */\n@keyframes flyOut {\n  20% {\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  50%,\n  55% {\n    opacity: 1;\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n}\n@keyframes flyOutUp {\n  20% {\n    transform: translate3d(0, 10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes flyOutDown {\n  20% {\n    transform: translate3d(0, -10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes flyOutRight {\n  20% {\n    opacity: 1;\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes flyOutLeft {\n  20% {\n    opacity: 1;\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n\n/* --------------\n         Slide\n    --------------- */\n.transition.slide.in,\n.transition[class*=\"slide down\"].in {\n  animation-name: slideInY;\n  transform-origin: top center;\n}\n.transition[class*=\"slide up\"].in {\n  animation-name: slideInY;\n  transform-origin: bottom center;\n}\n.transition[class*=\"slide left\"].in {\n  animation-name: slideInX;\n  transform-origin: right center;\n}\n.transition[class*=\"slide right\"].in {\n  animation-name: slideInX;\n  transform-origin: left center;\n}\n.transition.slide.out,\n.transition[class*=\"slide down\"].out {\n  animation-name: slideOutY;\n  transform-origin: top center;\n}\n.transition[class*=\"slide up\"].out {\n  animation-name: slideOutY;\n  transform-origin: bottom center;\n}\n.transition[class*=\"slide left\"].out {\n  animation-name: slideOutX;\n  transform-origin: right center;\n}\n.transition[class*=\"slide right\"].out {\n  animation-name: slideOutX;\n  transform-origin: left center;\n}\n\n/* In */\n@keyframes slideInY {\n  0% {\n    opacity: 0;\n    transform: scaleY(0);\n  }\n  100% {\n    opacity: 1;\n    transform: scaleY(1);\n  }\n}\n@keyframes slideInX {\n  0% {\n    opacity: 0;\n    transform: scaleX(0);\n  }\n  100% {\n    opacity: 1;\n    transform: scaleX(1);\n  }\n}\n\n/* Out */\n@keyframes slideOutY {\n  0% {\n    opacity: 1;\n    transform: scaleY(1);\n  }\n  100% {\n    opacity: 0;\n    transform: scaleY(0);\n  }\n}\n@keyframes slideOutX {\n  0% {\n    opacity: 1;\n    transform: scaleX(1);\n  }\n  100% {\n    opacity: 0;\n    transform: scaleX(0);\n  }\n}\n\n/* --------------\n         Swing\n    --------------- */\n.transition.swing {\n  animation-duration: 800ms;\n}\n.transition[class*=\"swing down\"].in {\n  animation-name: swingInX;\n  transform-origin: top center;\n}\n.transition[class*=\"swing up\"].in {\n  animation-name: swingInX;\n  transform-origin: bottom center;\n}\n.transition[class*=\"swing left\"].in {\n  animation-name: swingInY;\n  transform-origin: right center;\n}\n.transition[class*=\"swing right\"].in {\n  animation-name: swingInY;\n  transform-origin: left center;\n}\n.transition.swing.out,\n.transition[class*=\"swing down\"].out {\n  animation-name: swingOutX;\n  transform-origin: top center;\n}\n.transition[class*=\"swing up\"].out {\n  animation-name: swingOutX;\n  transform-origin: bottom center;\n}\n.transition[class*=\"swing left\"].out {\n  animation-name: swingOutY;\n  transform-origin: right center;\n}\n.transition[class*=\"swing right\"].out {\n  animation-name: swingOutY;\n  transform-origin: left center;\n}\n\n/* In */\n@keyframes swingInX {\n  0% {\n    transform: perspective(1000px) rotateX(90deg);\n    opacity: 0;\n  }\n  40% {\n    transform: perspective(1000px) rotateX(-30deg);\n    opacity: 1;\n  }\n  60% {\n    transform: perspective(1000px) rotateX(15deg);\n  }\n  80% {\n    transform: perspective(1000px) rotateX(-7.5deg);\n  }\n  100% {\n    transform: perspective(1000px) rotateX(0);\n  }\n}\n@keyframes swingInY {\n  0% {\n    transform: perspective(1000px) rotateY(-90deg);\n    opacity: 0;\n  }\n  40% {\n    transform: perspective(1000px) rotateY(30deg);\n    opacity: 1;\n  }\n  60% {\n    transform: perspective(1000px) rotateY(-17.5deg);\n  }\n  80% {\n    transform: perspective(1000px) rotateY(7.5deg);\n  }\n  100% {\n    transform: perspective(1000px) rotateY(0);\n  }\n}\n\n/* Out */\n@keyframes swingOutX {\n  0% {\n    transform: perspective(1000px) rotateX(0);\n  }\n  40% {\n    transform: perspective(1000px) rotateX(-7.5deg);\n  }\n  60% {\n    transform: perspective(1000px) rotateX(17.5deg);\n  }\n  80% {\n    transform: perspective(1000px) rotateX(-30deg);\n    opacity: 1;\n  }\n  100% {\n    transform: perspective(1000px) rotateX(90deg);\n    opacity: 0;\n  }\n}\n@keyframes swingOutY {\n  0% {\n    transform: perspective(1000px) rotateY(0);\n  }\n  40% {\n    transform: perspective(1000px) rotateY(7.5deg);\n  }\n  60% {\n    transform: perspective(1000px) rotateY(-10deg);\n  }\n  80% {\n    transform: perspective(1000px) rotateY(30deg);\n    opacity: 1;\n  }\n  100% {\n    transform: perspective(1000px) rotateY(-90deg);\n    opacity: 0;\n  }\n}\n\n/* --------------\n          Zoom\n    --------------- */\n.transition.zoom.in {\n  animation-name: zoomIn;\n}\n.transition.zoom.out {\n  animation-name: zoomOut;\n}\n@keyframes zoomIn {\n  0% {\n    opacity: 1;\n    transform: scale(0);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n@keyframes zoomOut {\n  0% {\n    opacity: 1;\n    transform: scale(1);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(0);\n  }\n}\n\n\n/*******************************\n       Static Animations\n*******************************/\n\n\n/* --------------\n    Emphasis\n--------------- */\n.flash.transition {\n  animation-duration: 750ms;\n  animation-name: flash;\n}\n.shake.transition {\n  animation-duration: 750ms;\n  animation-name: shake;\n}\n.bounce.transition {\n  animation-duration: 750ms;\n  animation-name: bounce;\n}\n.tada.transition {\n  animation-duration: 750ms;\n  animation-name: tada;\n}\n.pulse.transition {\n  animation-duration: 500ms;\n  animation-name: pulse;\n}\n.jiggle.transition {\n  animation-duration: 750ms;\n  animation-name: jiggle;\n}\n.transition.glow {\n  animation-duration: 2000ms;\n  animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1);\n}\n.transition.glow {\n  animation-name: glow;\n}\n\n/* Flash */\n@keyframes flash {\n  0%,\n  50%,\n  100% {\n    opacity: 1;\n  }\n  25%,\n  75% {\n    opacity: 0;\n  }\n}\n\n/* Shake */\n@keyframes shake {\n  0%,\n  100% {\n    transform: translateX(0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    transform: translateX(-10px);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    transform: translateX(10px);\n  }\n}\n\n/* Bounce */\n@keyframes bounce {\n  0%,\n  20%,\n  50%,\n  80%,\n  100% {\n    transform: translateY(0);\n  }\n  40% {\n    transform: translateY(-30px);\n  }\n  60% {\n    transform: translateY(-15px);\n  }\n}\n\n/* Tada */\n@keyframes tada {\n  0% {\n    transform: scale(1);\n  }\n  10%,\n  20% {\n    transform: scale(0.9) rotate(-3deg);\n  }\n  30%,\n  50%,\n  70%,\n  90% {\n    transform: scale(1.1) rotate(3deg);\n  }\n  40%,\n  60%,\n  80% {\n    transform: scale(1.1) rotate(-3deg);\n  }\n  100% {\n    transform: scale(1) rotate(0);\n  }\n}\n\n/* Pulse */\n@keyframes pulse {\n  0% {\n    transform: scale(1);\n    opacity: 1;\n  }\n  50% {\n    transform: scale(0.9);\n    opacity: 0.7;\n  }\n  100% {\n    transform: scale(1);\n    opacity: 1;\n  }\n}\n\n/* Jiggle */\n@keyframes jiggle {\n  0% {\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    transform: scale3d(0.95, 1.05, 1);\n  }\n  75% {\n    transform: scale3d(1.05, 0.95, 1);\n  }\n  100% {\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n/* Glow */\n@keyframes glow {\n  0% {\n    background-color: #fcfcfd;\n  }\n  30% {\n    background-color: #fff6cd;\n  }\n  100% {\n    background-color: #fcfcfd;\n  }\n}\n\n\n/*******************************\n         Site Overrides\n*******************************/\n\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/transition.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Transition\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.transition = function () {\n        var\n            $allModules     = $(this),\n\n            time            = Date.now(),\n            performance     = [],\n\n            moduleArguments = arguments,\n            query           = moduleArguments[0],\n            queryArguments  = [].slice.call(arguments, 1),\n            methodInvoked   = typeof query === 'string',\n\n            returnedValue\n        ;\n        $allModules.each(function (index) {\n            var\n                $module  = $(this),\n                element  = this,\n\n                // set at run time\n                settings,\n                instance,\n\n                error,\n                className,\n                metadata,\n\n                moduleNamespace,\n                eventNamespace,\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    // get full settings\n                    settings = module.get.settings.apply(element, moduleArguments);\n\n                    // shorthand\n                    className = settings.className;\n                    error = settings.error;\n                    metadata = settings.metadata;\n\n                    // define namespace\n                    eventNamespace = '.' + settings.namespace;\n                    moduleNamespace = 'module-' + settings.namespace;\n                    instance = $module.data(moduleNamespace) || module;\n\n                    if (methodInvoked) {\n                        methodInvoked = module.invoke(query);\n                    }\n\n                    // method not invoked, lets run an animation\n                    if (methodInvoked === false) {\n                        module.verbose('Converted arguments into settings object', settings);\n                        if (settings.interval) {\n                            module.delay(settings.interval);\n                        } else {\n                            module.animate();\n                        }\n                        module.instantiate();\n                    }\n                },\n\n                instantiate: function () {\n                    module.verbose('Storing instance of module', module);\n                    instance = module;\n                    $module\n                        .data(moduleNamespace, instance)\n                    ;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous module for', element);\n                    $module\n                        .removeData(moduleNamespace)\n                    ;\n                },\n\n                refresh: function () {\n                    module.verbose('Refreshing display type on next animation');\n                    delete module.displayType;\n                },\n\n                forceRepaint: function () {\n                    module.verbose('Forcing element repaint');\n                    var\n                        $parentElement = $module.parent(),\n                        $nextElement = $module.next()\n                    ;\n                    if ($nextElement.length === 0) {\n                        $module.detach().appendTo($parentElement);\n                    } else {\n                        $module.detach().insertBefore($nextElement);\n                    }\n                },\n\n                repaint: function () {\n                    module.verbose('Repainting element');\n                    var\n                        fakeAssignment = element.offsetWidth\n                    ;\n                },\n\n                delay: function (interval) {\n                    var\n                        direction = module.get.animationDirection(),\n                        shouldReverse,\n                        delay\n                    ;\n                    if (!direction) {\n                        direction = module.can.transition()\n                            ? module.get.direction()\n                            : 'static';\n                    }\n                    interval = interval !== undefined\n                        ? interval\n                        : settings.interval;\n                    shouldReverse = settings.reverse === 'auto' && direction === className.outward;\n                    delay = shouldReverse || settings.reverse === true\n                        ? ($allModules.length - index) * interval\n                        : index * interval;\n                    module.debug('Delaying animation by', delay);\n                    setTimeout(function () {\n                        module.animate();\n                    }, delay);\n                },\n\n                animate: function (overrideSettings) {\n                    settings = overrideSettings || settings;\n\n                    module.debug('Preparing animation', settings.animation);\n                    if (module.is.animating()) {\n                        if (settings.queue) {\n                            if (!settings.allowRepeats && module.has.direction() && module.is.occurring() && module.queuing !== true) {\n                                module.debug('Animation is currently occurring, preventing queueing same animation', settings.animation);\n                            } else {\n                                module.queue(settings.animation);\n                            }\n\n                            return false;\n                        }\n                        if (!settings.allowRepeats && module.is.occurring()) {\n                            module.debug('Animation is already occurring, will not execute repeated animation', settings.animation);\n\n                            return false;\n                        }\n\n                        module.debug('New animation started, completing previous early', settings.animation);\n                        instance.complete();\n                    }\n                    if (module.can.animate()) {\n                        module.set.animating(settings.animation);\n                    } else {\n                        module.error(error.noAnimation, settings.animation, element);\n                    }\n                },\n\n                reset: function () {\n                    module.debug('Resetting animation to beginning conditions');\n                    module.remove.animationCallbacks();\n                    module.restore.conditions();\n                    module.remove.animating();\n                },\n\n                queue: function (animation) {\n                    module.debug('Queueing animation of', animation);\n                    module.queuing = true;\n                    $module\n                        .one('animationend.queue' + eventNamespace, function () {\n                            module.queuing = false;\n                            module.repaint();\n                            module.animate.apply(this, settings);\n                        })\n                    ;\n                },\n\n                complete: function (event) {\n                    if (event && event.target === element) {\n                        event.stopPropagation();\n                    }\n                    module.debug('Animation complete', settings.animation);\n                    module.remove.completeCallback();\n                    module.remove.failSafe();\n                    if (!module.is.looping()) {\n                        if (module.is.outward()) {\n                            module.verbose('Animation is outward, hiding element');\n                            module.restore.conditions();\n                            module.hide();\n                        } else if (module.is.inward()) {\n                            module.verbose('Animation is inward, showing element');\n                            module.restore.conditions();\n                            module.show();\n                        } else {\n                            module.verbose('Static animation completed');\n                            module.restore.conditions();\n                            settings.onComplete.call(element);\n                        }\n                    }\n                },\n\n                force: {\n                    visible: function () {\n                        var\n                            style          = $module.attr('style'),\n                            userStyle      = module.get.userStyle(style),\n                            displayType    = module.get.displayType(),\n                            overrideStyle  = userStyle + 'display: ' + displayType + ' !important;',\n                            inlineDisplay  = $module[0].style.display,\n                            mustStayHidden = !displayType || (inlineDisplay === 'none' && settings.skipInlineHidden) || $module[0].tagName.match(/(script|link|style)/i)\n                        ;\n                        if (mustStayHidden) {\n                            module.remove.transition();\n\n                            return false;\n                        }\n                        module.verbose('Overriding default display to show element', displayType);\n                        $module\n                            .attr('style', overrideStyle)\n                        ;\n\n                        return true;\n                    },\n                    hidden: function () {\n                        var\n                            style          = $module.attr('style'),\n                            currentDisplay = $module.css('display'),\n                            emptyStyle     = style === undefined || style === ''\n                        ;\n                        if (currentDisplay !== 'none' && !module.is.hidden()) {\n                            module.verbose('Overriding default display to hide element');\n                            $module\n                                .css('display', 'none')\n                            ;\n                        } else if (emptyStyle) {\n                            $module\n                                .removeAttr('style')\n                            ;\n                        }\n                    },\n                },\n\n                has: {\n                    direction: function (animation) {\n                        var\n                            hasDirection = false\n                        ;\n                        animation = animation || settings.animation;\n                        if (typeof animation === 'string') {\n                            animation = animation.split(' ');\n                            $.each(animation, function (index, word) {\n                                if (word === className.inward || word === className.outward) {\n                                    hasDirection = true;\n                                }\n                            });\n                        }\n\n                        return hasDirection;\n                    },\n                    inlineDisplay: function () {\n                        var\n                            style = $module.attr('style') || ''\n                        ;\n\n                        return Array.isArray(style.match(/display.*?;/, ''));\n                    },\n                },\n\n                set: {\n                    animating: function (animation) {\n                        // remove previous callbacks\n                        module.remove.completeCallback();\n\n                        // determine exact animation\n                        animation = animation || settings.animation;\n                        var animationClass = module.get.animationClass(animation);\n\n                        // save animation class in cache to restore class names\n                        module.save.animation(animationClass);\n\n                        if (module.force.visible()) {\n                            module.remove.hidden();\n                            module.remove.direction();\n\n                            module.start.animation(animationClass);\n                        }\n                    },\n                    duration: function (animationName, duration) {\n                        duration = duration || settings.duration;\n                        duration = typeof duration === 'number'\n                            ? duration + 'ms'\n                            : duration;\n                        if (duration || duration === 0) {\n                            module.verbose('Setting animation duration', duration);\n                            $module\n                                .css({\n                                    'animation-duration': duration,\n                                })\n                            ;\n                        }\n                    },\n                    direction: function (direction) {\n                        direction = direction || module.get.direction();\n                        if (direction === className.inward) {\n                            module.set.inward();\n                        } else {\n                            module.set.outward();\n                        }\n                    },\n                    looping: function () {\n                        module.debug('Transition set to loop');\n                        $module\n                            .addClass(className.looping)\n                        ;\n                    },\n                    hidden: function () {\n                        $module\n                            .addClass(className.transition)\n                            .addClass(className.hidden)\n                        ;\n                    },\n                    inward: function () {\n                        module.debug('Setting direction to inward');\n                        $module\n                            .removeClass(className.outward)\n                            .addClass(className.inward)\n                        ;\n                    },\n                    outward: function () {\n                        module.debug('Setting direction to outward');\n                        $module\n                            .removeClass(className.inward)\n                            .addClass(className.outward)\n                        ;\n                    },\n                    visible: function () {\n                        $module\n                            .addClass(className.transition)\n                            .addClass(className.visible)\n                        ;\n                    },\n                },\n\n                start: {\n                    animation: function (animationClass) {\n                        animationClass = animationClass || module.get.animationClass();\n                        module.debug('Starting tween', animationClass);\n                        $module\n                            .addClass(animationClass)\n                            .one('animationend.complete' + eventNamespace, module.complete)\n                        ;\n                        if (settings.useFailSafe) {\n                            module.add.failSafe();\n                        }\n                        module.set.duration(settings.duration);\n                        settings.onStart.call(element);\n                    },\n                },\n\n                save: {\n                    animation: function (animation) {\n                        if (!module.cache) {\n                            module.cache = {};\n                        }\n                        module.cache.animation = animation;\n                    },\n                    displayType: function (displayType) {\n                        if (displayType !== 'none') {\n                            $module.data(metadata.displayType, displayType);\n                        }\n                    },\n                    transitionExists: function (animation, exists) {\n                        $.fn.transition.exists[animation] = exists;\n                        module.verbose('Saving existence of transition', animation, exists);\n                    },\n                },\n\n                restore: {\n                    conditions: function () {\n                        var\n                            animation = module.get.currentAnimation()\n                        ;\n                        if (animation) {\n                            $module\n                                .removeClass(animation)\n                            ;\n                            module.verbose('Removing animation class', module.cache);\n                        }\n                        module.remove.duration();\n                    },\n                },\n\n                add: {\n                    failSafe: function () {\n                        var\n                            duration = module.get.duration()\n                        ;\n                        module.timer = setTimeout(function () {\n                            $module.triggerHandler('animationend');\n                        }, duration + settings.failSafeDelay);\n                        module.verbose('Adding fail safe timer', module.timer);\n                    },\n                },\n\n                remove: {\n                    animating: function () {\n                        $module.removeClass(className.animating);\n                    },\n                    animationCallbacks: function () {\n                        module.remove.queueCallback();\n                        module.remove.completeCallback();\n                    },\n                    queueCallback: function () {\n                        $module.off('.queue' + eventNamespace);\n                    },\n                    completeCallback: function () {\n                        $module.off('.complete' + eventNamespace);\n                    },\n                    display: function () {\n                        $module.css('display', '');\n                    },\n                    direction: function () {\n                        $module\n                            .removeClass(className.inward)\n                            .removeClass(className.outward)\n                        ;\n                    },\n                    duration: function () {\n                        $module\n                            .css('animation-duration', '')\n                        ;\n                    },\n                    failSafe: function () {\n                        module.verbose('Removing fail safe timer', module.timer);\n                        if (module.timer) {\n                            clearTimeout(module.timer);\n                        }\n                    },\n                    hidden: function () {\n                        $module.removeClass(className.hidden);\n                    },\n                    visible: function () {\n                        $module.removeClass(className.visible);\n                    },\n                    looping: function () {\n                        module.debug('Transitions are no longer looping');\n                        if (module.is.looping()) {\n                            module.reset();\n                            $module\n                                .removeClass(className.looping)\n                            ;\n                        }\n                    },\n                    transition: function () {\n                        $module\n                            .removeClass(className.transition)\n                            .removeClass(className.visible)\n                            .removeClass(className.hidden)\n                        ;\n                    },\n                },\n                get: {\n                    settings: function (animation, duration, onComplete) {\n                        if (typeof animation === 'object') { // single settings object\n                            return $.extend(true, {}, $.fn.transition.settings, animation);\n                        }\n                        if (typeof onComplete === 'function') { // all arguments provided\n                            return $.extend({}, $.fn.transition.settings, {\n                                animation: animation,\n                                onComplete: onComplete,\n                                duration: duration,\n                            });\n                        }\n                        if (typeof duration === 'string' || typeof duration === 'number') { // only duration provided\n                            return $.extend({}, $.fn.transition.settings, {\n                                animation: animation,\n                                duration: duration,\n                            });\n                        }\n                        if (typeof duration === 'object') { // duration is actually settings object\n                            return $.extend({}, $.fn.transition.settings, duration, {\n                                animation: animation,\n                            });\n                        }\n                        if (typeof duration === 'function') { // duration is actually callback\n                            return $.extend({}, $.fn.transition.settings, {\n                                animation: animation,\n                                onComplete: duration,\n                            });\n                        }\n\n                        // only animation provided\n                        return $.extend({}, $.fn.transition.settings, {\n                            animation: animation,\n                        });\n                    },\n                    animationClass: function (animation) {\n                        var\n                            animationClass = animation || settings.animation,\n                            directionClass = module.can.transition() && !module.has.direction()\n                                ? module.get.direction() + ' '\n                                : ''\n                        ;\n\n                        return className.animating + ' '\n                            + className.transition + ' '\n                            + directionClass\n                            + animationClass;\n                    },\n                    currentAnimation: function () {\n                        return module.cache && module.cache.animation !== undefined\n                            ? module.cache.animation\n                            : false;\n                    },\n                    currentDirection: function () {\n                        return module.is.inward()\n                            ? className.inward\n                            : className.outward;\n                    },\n                    direction: function () {\n                        return module.is.hidden() || !module.is.visible()\n                            ? className.inward\n                            : className.outward;\n                    },\n                    animationDirection: function (animation) {\n                        var\n                            direction\n                        ;\n                        animation = animation || settings.animation;\n                        if (typeof animation === 'string') {\n                            animation = animation.split(' ');\n                            // search animation name for out/in class\n                            $.each(animation, function (index, word) {\n                                if (word === className.inward) {\n                                    direction = className.inward;\n                                } else if (word === className.outward) {\n                                    direction = className.outward;\n                                }\n                            });\n                        }\n                        // return found direction\n                        if (direction) {\n                            return direction;\n                        }\n\n                        return false;\n                    },\n                    duration: function (duration) {\n                        duration = duration || settings.duration;\n                        if (duration === false) {\n                            duration = $module.css('animation-duration') || 0;\n                        }\n\n                        return typeof duration === 'string'\n                            ? (duration.indexOf('ms') > -1\n                                ? parseFloat(duration)\n                                : parseFloat(duration) * 1000)\n                            : duration;\n                    },\n                    displayType: function (shouldDetermine) {\n                        shouldDetermine = shouldDetermine !== undefined\n                            ? shouldDetermine\n                            : true;\n                        if (settings.displayType) {\n                            return settings.displayType;\n                        }\n                        if (shouldDetermine && $module.data(metadata.displayType) === undefined) {\n                            var currentDisplay = $module.css('display');\n                            if (currentDisplay === '' || currentDisplay === 'none') {\n                                // create fake element to determine display state\n                                module.can.transition(true);\n                            } else {\n                                module.save.displayType(currentDisplay);\n                            }\n                        }\n\n                        return $module.data(metadata.displayType);\n                    },\n                    userStyle: function (style) {\n                        style = style || $module.attr('style') || '';\n\n                        return style.replace(/display.*?;/, '');\n                    },\n                    transitionExists: function (animation) {\n                        return $.fn.transition.exists[animation];\n                    },\n                },\n\n                can: {\n                    transition: function (forced) {\n                        var\n                            animation         = settings.animation,\n                            transitionExists  = module.get.transitionExists(animation),\n                            displayType       = module.get.displayType(false),\n                            elementClass,\n                            tagName,\n                            $clone,\n                            currentAnimation,\n                            inAnimation,\n                            directionExists\n                        ;\n                        if (transitionExists === undefined || forced) {\n                            module.verbose('Determining whether animation exists');\n                            elementClass = $module.attr('class');\n                            tagName = $module.prop('tagName');\n\n                            $clone = $('<' + tagName + ' />').addClass(elementClass).insertAfter($module);\n                            currentAnimation = $clone\n                                .addClass(animation)\n                                .removeClass(className.inward)\n                                .removeClass(className.outward)\n                                .addClass(className.animating)\n                                .addClass(className.transition)\n                                .css('animationName')\n                            ;\n                            $clone.detach().insertAfter($module);\n                            inAnimation = $clone\n                                .addClass(className.inward)\n                                .css('animationName')\n                            ;\n                            if (!displayType) {\n                                $clone.detach().insertAfter($module);\n                                displayType = $clone\n                                    .attr('class', elementClass)\n                                    .removeAttr('style')\n                                    .removeClass(className.hidden)\n                                    .removeClass(className.visible)\n                                    .show()\n                                    .css('display')\n                                ;\n                                module.verbose('Determining final display state', displayType);\n                                module.save.displayType(displayType);\n                            }\n\n                            $clone.remove();\n                            if (currentAnimation !== inAnimation) {\n                                module.debug('Direction exists for animation', animation);\n                                directionExists = true;\n                            } else if (currentAnimation === 'none' || !currentAnimation) {\n                                module.debug('No animation defined in css', animation);\n\n                                return;\n                            } else {\n                                module.debug('Static animation found', animation, displayType);\n                                directionExists = false;\n                            }\n                            module.save.transitionExists(animation, directionExists);\n                        }\n\n                        return transitionExists !== undefined\n                            ? transitionExists\n                            : directionExists;\n                    },\n                    animate: function () {\n                        // can transition does not return a value if animation does not exist\n                        return module.can.transition() !== undefined;\n                    },\n                },\n\n                is: {\n                    animating: function () {\n                        return $module.hasClass(className.animating);\n                    },\n                    inward: function () {\n                        return $module.hasClass(className.inward);\n                    },\n                    outward: function () {\n                        return $module.hasClass(className.outward);\n                    },\n                    looping: function () {\n                        return $module.hasClass(className.looping);\n                    },\n                    occurring: function (animation) {\n                        animation = animation || settings.animation;\n                        animation = '.' + animation.replace(' ', '.');\n\n                        return $module.filter(animation).length > 0;\n                    },\n                    visible: function () {\n                        return $module.is(':visible');\n                    },\n                    hidden: function () {\n                        return $module.css('visibility') === 'hidden';\n                    },\n                    supported: function () {\n                        // keep method for backward compatibility until 2.10.0\n                        return true;\n                    },\n                },\n\n                hide: function () {\n                    if (settings.onHide.call(element) === false) {\n                        module.verbose('Hide callback returned false cancelling hide');\n\n                        return false;\n                    }\n                    module.verbose('Hiding element');\n                    if (module.is.animating()) {\n                        module.reset();\n                    }\n                    element.blur(); // IE will trigger focus change if element is not blurred before hiding\n                    module.remove.display();\n                    module.remove.visible();\n                    settings.onBeforeHide.call(element, module.hideNow);\n                },\n\n                hideNow: function () {\n                    module.set.hidden();\n                    module.force.hidden();\n                    settings.onHidden.call(element);\n                    settings.onComplete.call(element);\n                },\n\n                show: function (display) {\n                    if (module.force.visible() && settings.onShow.call(element) !== false) {\n                        module.verbose('Showing element', display);\n                        module.remove.hidden();\n                        settings.onBeforeShow.call(element, module.showNow);\n                    }\n                },\n\n                showNow: function () {\n                    module.set.visible();\n                    settings.onVisible.call(element);\n                    settings.onComplete.call(element);\n                },\n\n                toggle: function () {\n                    if (module.is.visible()) {\n                        module.hide();\n                    } else {\n                        module.show();\n                    }\n                },\n\n                stop: function () {\n                    module.debug('Stopping current animation');\n                    $module.triggerHandler('animationend');\n                },\n\n                stopAll: function () {\n                    module.debug('Stopping all animation');\n                    module.remove.queueCallback();\n                    $module.triggerHandler('animationend');\n                },\n\n                clear: {\n                    queue: function () {\n                        module.debug('Clearing animation queue');\n                        module.remove.queueCallback();\n                    },\n                },\n\n                enable: function () {\n                    module.verbose('Starting animation');\n                    $module.removeClass(className.disabled);\n                },\n\n                disable: function () {\n                    module.debug('Stopping animation');\n                    $module.addClass(className.disabled);\n                },\n\n                setting: function (name, value) {\n                    module.debug('Changing setting', name, value);\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        if ($.isPlainObject(settings[name])) {\n                            $.extend(true, settings[name], value);\n                        } else {\n                            settings[name] = value;\n                        }\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if ($allModules.length > 1) {\n                            title += ' (' + $allModules.length + ')';\n                        }\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                // modified for transition to return invoke success\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found !== undefined\n                        ? found\n                        : false;\n                },\n            };\n            module.initialize();\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    // Records if CSS transition is available\n    $.fn.transition.exists = {};\n\n    $.fn.transition.settings = {\n\n        // module info\n        name: 'Transition',\n\n        // hide all output from this component regardless of other settings\n        silent: false,\n\n        // debug content outputted to console\n        debug: false,\n\n        // verbose debug output\n        verbose: false,\n\n        // performance data output\n        performance: true,\n\n        // event namespace\n        namespace: 'transition',\n\n        // delay between animations in group\n        interval: 0,\n\n        // whether group animations should be reversed\n        reverse: 'auto',\n\n        // animation callback event\n        onStart: function () {},\n        onComplete: function () {},\n        onShow: function () {},\n        onBeforeShow: function (callback) {\n            callback.call(this);\n        },\n        onVisible: function () {},\n        onHide: function () {},\n        onHidden: function () {},\n        onBeforeHide: function (callback) {\n            callback.call(this);\n        },\n\n        // whether timeout should be used to ensure callback fires in cases animationend does not\n        useFailSafe: true,\n\n        // delay in ms for fail safe\n        failSafeDelay: 100,\n\n        // whether EXACT animation can occur twice in a row\n        allowRepeats: false,\n\n        // Override final display type on visible\n        displayType: false,\n\n        // animation duration\n        animation: 'fade',\n        duration: false,\n\n        // new animations will occur after previous ones\n        queue: true,\n\n        // whether initially inline hidden objects should be skipped for transition\n        skipInlineHidden: false,\n\n        metadata: {\n            displayType: 'display',\n        },\n\n        className: {\n            animating: 'animating',\n            disabled: 'disabled',\n            hidden: 'hidden',\n            inward: 'in',\n            loading: 'loading',\n            looping: 'looping',\n            outward: 'out',\n            transition: 'transition',\n            visible: 'visible',\n        },\n\n        // possible errors\n        error: {\n            noAnimation: 'Element is no longer attached to DOM. Unable to animate.  Use silent setting to suppress this warning in production.',\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/components/visibility.js",
    "content": "/*!\n * # Fomantic-UI 2.9.4 - Visibility\n * https://github.com/fomantic/Fomantic-UI/\n *\n *\n * Released under the MIT license\n * https://opensource.org/licenses/MIT\n *\n */\n\n(function ($, window, document) {\n    'use strict';\n\n    function isFunction(obj) {\n        return typeof obj === 'function' && typeof obj.nodeType !== 'number';\n    }\n\n    window = window !== undefined && window.Math === Math\n        ? window\n        : globalThis;\n\n    $.fn.visibility = function (parameters) {\n        var\n            $allModules    = $(this),\n\n            time           = Date.now(),\n            performance    = [],\n\n            query          = arguments[0],\n            methodInvoked  = typeof query === 'string',\n            queryArguments = [].slice.call(arguments, 1),\n            contextCheck   = function (context, win) {\n                var $context;\n                if ([window, document].indexOf(context) >= 0) {\n                    $context = $(context);\n                } else {\n                    $context = $(win.document).find(context);\n                    if ($context.length === 0) {\n                        $context = win.frameElement ? contextCheck(context, win.parent) : window;\n                    }\n                }\n\n                return $context;\n            },\n            returnedValue,\n\n            moduleCount    = $allModules.length,\n            loadedCount    = 0\n        ;\n\n        $allModules.each(function () {\n            var\n                settings        = $.isPlainObject(parameters)\n                    ? $.extend(true, {}, $.fn.visibility.settings, parameters)\n                    : $.extend({}, $.fn.visibility.settings),\n\n                className       = settings.className,\n                namespace       = settings.namespace,\n                error           = settings.error,\n                metadata        = settings.metadata,\n\n                eventNamespace  = '.' + namespace,\n                moduleNamespace = 'module-' + namespace,\n\n                $window         = $(window),\n\n                $module         = $(this),\n                $context        = contextCheck(settings.context, window),\n\n                $placeholder,\n\n                instance        = $module.data(moduleNamespace),\n\n                element         = this,\n                disabled        = false,\n\n                contextObserver,\n                observer,\n                module\n            ;\n\n            module = {\n\n                initialize: function () {\n                    module.debug('Initializing', settings);\n\n                    module.setup.cache();\n\n                    if (module.should.trackChanges()) {\n                        if (settings.type === 'image') {\n                            module.setup.image();\n                        }\n                        if (settings.type === 'fixed') {\n                            module.setup.fixed();\n                        }\n\n                        if (settings.observeChanges) {\n                            module.observeChanges();\n                        }\n                        module.bind.events();\n                    }\n\n                    module.save.position();\n                    if (!module.is.visible()) {\n                        module.error(error.visible, $module);\n                    }\n\n                    if (settings.initialCheck) {\n                        module.checkVisibility();\n                    }\n                    module.instantiate();\n                },\n\n                instantiate: function () {\n                    module.debug('Storing instance', module);\n                    $module\n                        .data(moduleNamespace, module)\n                    ;\n                    instance = module;\n                },\n\n                destroy: function () {\n                    module.verbose('Destroying previous module');\n                    if (observer) {\n                        observer.disconnect();\n                    }\n                    if (contextObserver) {\n                        contextObserver.disconnect();\n                    }\n                    $window\n                        .off('load' + eventNamespace, module.event.load)\n                        .off('resize' + eventNamespace, module.event.resize)\n                    ;\n                    $context\n                        .off('scroll' + eventNamespace, module.event.scroll)\n                        .off('scrollchange' + eventNamespace, module.event.scrollchange)\n                    ;\n                    if (settings.type === 'fixed') {\n                        module.resetFixed();\n                        module.remove.placeholder();\n                    }\n                    $module\n                        .off(eventNamespace)\n                        .removeData(moduleNamespace)\n                    ;\n                },\n\n                observeChanges: function () {\n                    if ('MutationObserver' in window) {\n                        contextObserver = new MutationObserver(module.event.contextChanged);\n                        observer = new MutationObserver(module.event.changed);\n                        contextObserver.observe(document, {\n                            childList: true,\n                            subtree: true,\n                        });\n                        observer.observe(element, {\n                            childList: true,\n                            subtree: true,\n                        });\n                        module.debug('Setting up mutation observer', observer);\n                    }\n                },\n\n                bind: {\n                    events: function () {\n                        module.verbose('Binding visibility events to scroll and resize');\n                        if (settings.refreshOnLoad) {\n                            $window\n                                .on('load' + eventNamespace, module.event.load)\n                            ;\n                        }\n                        $window\n                            .on('resize' + eventNamespace, module.event.resize)\n                        ;\n                        // pub/sub pattern\n                        $context\n                            .off('scroll' + eventNamespace)\n                            .on('scroll' + eventNamespace, module.event.scroll)\n                            .on('scrollchange' + eventNamespace, module.event.scrollchange)\n                        ;\n                    },\n                },\n\n                event: {\n                    changed: function (mutations) {\n                        module.verbose('DOM tree modified, updating visibility calculations');\n                        module.timer = setTimeout(function () {\n                            module.verbose('DOM tree modified, updating sticky menu');\n                            module.refresh();\n                        }, 100);\n                    },\n                    contextChanged: function (mutations) {\n                        [].forEach.call(mutations, function (mutation) {\n                            if (mutation.removedNodes) {\n                                [].forEach.call(mutation.removedNodes, function (node) {\n                                    if (node === element || $(node).find(element).length > 0) {\n                                        module.debug('Element removed from DOM, tearing down events');\n                                        module.destroy();\n                                    }\n                                });\n                            }\n                        });\n                    },\n                    resize: function () {\n                        module.debug('Window resized');\n                        if (settings.refreshOnResize) {\n                            requestAnimationFrame(module.refresh);\n                        }\n                    },\n                    load: function () {\n                        module.debug('Page finished loading');\n                        requestAnimationFrame(module.refresh);\n                    },\n                    // publishes scrollchange event on one scroll\n                    scroll: function () {\n                        if (settings.throttle) {\n                            clearTimeout(module.timer);\n                            module.timer = setTimeout(function () {\n                                $context.triggerHandler('scrollchange' + eventNamespace, [$context.scrollTop()]);\n                            }, settings.throttle);\n                        } else {\n                            requestAnimationFrame(function () {\n                                $context.triggerHandler('scrollchange' + eventNamespace, [$context.scrollTop()]);\n                            });\n                        }\n                    },\n                    // subscribes to scrollchange\n                    scrollchange: function (event, scrollPosition) {\n                        module.checkVisibility(scrollPosition);\n                    },\n                },\n\n                precache: function (images, callback) {\n                    if (!Array.isArray(images)) {\n                        images = [images];\n                    }\n                    var\n                        imagesLength  = images.length,\n                        loadedCounter = 0,\n                        cache         = [],\n                        cacheImage    = document.createElement('img'),\n                        handleLoad    = function () {\n                            loadedCounter++;\n                            if (loadedCounter >= images.length) {\n                                if (isFunction(callback)) {\n                                    callback();\n                                }\n                            }\n                        }\n                    ;\n                    while (imagesLength--) {\n                        cacheImage = document.createElement('img');\n                        cacheImage.addEventListener('load', handleLoad);\n                        cacheImage.addEventListener('error', handleLoad);\n                        cacheImage.src = images[imagesLength];\n                        cache.push(cacheImage);\n                    }\n                },\n\n                enableCallbacks: function () {\n                    module.debug('Allowing callbacks to occur');\n                    disabled = false;\n                },\n\n                disableCallbacks: function () {\n                    module.debug('Disabling all callbacks temporarily');\n                    disabled = true;\n                },\n\n                should: {\n                    trackChanges: function () {\n                        if (methodInvoked) {\n                            module.debug('One time query, no need to bind events');\n\n                            return false;\n                        }\n                        module.debug('Callbacks being attached');\n\n                        return true;\n                    },\n                },\n\n                setup: {\n                    cache: function () {\n                        module.cache = {\n                            occurred: {},\n                            screen: {},\n                            element: {},\n                        };\n                    },\n                    image: function () {\n                        var\n                            src = $module.data(metadata.src)\n                        ;\n                        if (src) {\n                            module.verbose('Lazy loading image', src);\n                            settings.once = true;\n                            settings.observeChanges = false;\n\n                            // show when top visible\n                            settings.onOnScreen = function () {\n                                module.debug('Image on screen', element);\n                                module.precache(src, function () {\n                                    module.set.image(src, function () {\n                                        loadedCount++;\n                                        if (loadedCount === moduleCount) {\n                                            settings.onAllLoaded.call(this);\n                                        }\n                                        settings.onLoad.call(this);\n                                    });\n                                });\n                            };\n                        }\n                    },\n                    fixed: function () {\n                        module.debug('Setting up fixed');\n                        settings.once = false;\n                        settings.observeChanges = false;\n                        settings.initialCheck = true;\n                        settings.refreshOnLoad = true;\n                        if (!parameters.transition) {\n                            settings.transition = false;\n                        }\n                        module.create.placeholder();\n                        module.debug('Added placeholder', $placeholder);\n                        settings.onTopPassed = function () {\n                            module.debug('Element passed, adding fixed position', $module);\n                            module.show.placeholder();\n                            module.set.fixed();\n                            if (settings.transition) {\n                                if ($.fn.transition !== undefined) {\n                                    $module.transition(settings.transition, settings.duration);\n                                }\n                            }\n                        };\n                        settings.onTopPassedReverse = function () {\n                            module.debug('Element returned to position, removing fixed', $module);\n                            module.hide.placeholder();\n                            module.remove.fixed();\n                        };\n                    },\n                },\n\n                create: {\n                    placeholder: function () {\n                        module.verbose('Creating fixed position placeholder');\n                        $placeholder = $module\n                            .clone(false)\n                            .css('display', 'none')\n                            .addClass(className.placeholder)\n                            .insertAfter($module)\n                        ;\n                    },\n                },\n\n                show: {\n                    placeholder: function () {\n                        module.verbose('Showing placeholder');\n                        $placeholder\n                            .css('display', 'block')\n                            .css('visibility', 'hidden')\n                        ;\n                    },\n                },\n                hide: {\n                    placeholder: function () {\n                        module.verbose('Hiding placeholder');\n                        $placeholder\n                            .css('display', 'none')\n                            .css('visibility', '')\n                        ;\n                    },\n                },\n\n                set: {\n                    fixed: function () {\n                        module.verbose('Setting element to fixed position');\n                        $module\n                            .addClass(className.fixed)\n                            .css({\n                                position: 'fixed',\n                                top: settings.offset + 'px',\n                                left: 'auto',\n                                zIndex: settings.zIndex,\n                            })\n                        ;\n                        settings.onFixed.call(element);\n                    },\n                    image: function (src, callback) {\n                        $module\n                            .attr('src', src)\n                        ;\n                        if (settings.transition) {\n                            if ($.fn.transition !== undefined) {\n                                if ($module.hasClass(className.visible)) {\n                                    module.debug('Transition already occurred on this image, skipping animation');\n\n                                    return;\n                                }\n                                $module.transition(settings.transition, settings.duration, callback);\n                            } else {\n                                $module.fadeIn(settings.duration, callback);\n                            }\n                        } else {\n                            $module.show();\n                        }\n                    },\n                },\n\n                is: {\n                    onScreen: function () {\n                        var\n                            calculations   = module.get.elementCalculations()\n                        ;\n\n                        return calculations.onScreen;\n                    },\n                    offScreen: function () {\n                        var\n                            calculations   = module.get.elementCalculations()\n                        ;\n\n                        return calculations.offScreen;\n                    },\n                    visible: function () {\n                        if (module.cache && module.cache.element) {\n                            return !(module.cache.element.width === 0 && module.cache.element.offset.top === 0);\n                        }\n\n                        return false;\n                    },\n                    verticallyScrollableContext: function () {\n                        var\n                            overflowY = $context[0] !== window\n                                ? $context.css('overflow-y')\n                                : false\n                        ;\n\n                        return overflowY === 'auto' || overflowY === 'scroll';\n                    },\n                    horizontallyScrollableContext: function () {\n                        var\n                            overflowX = $context[0] !== window\n                                ? $context.css('overflow-x')\n                                : false\n                        ;\n\n                        return overflowX === 'auto' || overflowX === 'scroll';\n                    },\n                },\n\n                refresh: function () {\n                    module.debug('Refreshing constants (width/height)');\n                    if (settings.type === 'fixed') {\n                        module.resetFixed();\n                    }\n                    module.reset();\n                    module.save.position();\n                    if (settings.checkOnRefresh) {\n                        module.checkVisibility();\n                    }\n                    settings.onRefresh.call(element);\n                },\n\n                resetFixed: function () {\n                    module.remove.fixed();\n                    module.remove.occurred();\n                },\n\n                reset: function () {\n                    module.verbose('Resetting all cached values');\n                    if ($.isPlainObject(module.cache)) {\n                        module.cache.screen = {};\n                        module.cache.element = {};\n                    }\n                },\n\n                checkVisibility: function (scroll) {\n                    module.verbose('Checking visibility of element', module.cache.element);\n\n                    if (!disabled && module.is.visible()) {\n                        // save scroll position\n                        module.save.scroll(scroll);\n\n                        // update calculations derived from scroll\n                        module.save.calculations();\n\n                        // percentage\n                        module.passed();\n\n                        // reverse (must be first)\n                        module.passingReverse();\n                        module.topVisibleReverse();\n                        module.bottomVisibleReverse();\n                        module.topPassedReverse();\n                        module.bottomPassedReverse();\n\n                        // one time\n                        module.onScreen();\n                        module.offScreen();\n                        module.passing();\n                        module.topVisible();\n                        module.bottomVisible();\n                        module.topPassed();\n                        module.bottomPassed();\n\n                        // on update callback\n                        if (settings.onUpdate) {\n                            settings.onUpdate.call(element, module.get.elementCalculations());\n                        }\n                    }\n                },\n\n                passed: function (amount, newCallback) {\n                    var\n                        calculations   = module.get.elementCalculations()\n                    ;\n                    // assign callback\n                    if (amount && newCallback) {\n                        settings.onPassed[amount] = newCallback;\n                    } else if (amount !== undefined) {\n                        return module.get.pixelsPassed(amount) > calculations.pixelsPassed;\n                    } else if (calculations.passing) {\n                        $.each(settings.onPassed, function (amount, callback) {\n                            if (calculations.bottomVisible || calculations.pixelsPassed > module.get.pixelsPassed(amount)) {\n                                module.execute(callback, amount);\n                            } else if (!settings.once) {\n                                module.remove.occurred(callback);\n                            }\n                        });\n                    }\n                },\n\n                onScreen: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onOnScreen,\n                        callbackName = 'onScreen'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for onScreen', newCallback);\n                        settings.onOnScreen = newCallback;\n                    }\n                    if (calculations.onScreen) {\n                        module.execute(callback, callbackName);\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback !== undefined) {\n                        return calculations.onOnScreen;\n                    }\n                },\n\n                offScreen: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onOffScreen,\n                        callbackName = 'offScreen'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for offScreen', newCallback);\n                        settings.onOffScreen = newCallback;\n                    }\n                    if (calculations.offScreen) {\n                        module.execute(callback, callbackName);\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback !== undefined) {\n                        return calculations.onOffScreen;\n                    }\n                },\n\n                passing: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onPassing,\n                        callbackName = 'passing'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for passing', newCallback);\n                        settings.onPassing = newCallback;\n                    }\n                    if (calculations.passing) {\n                        module.execute(callback, callbackName);\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback !== undefined) {\n                        return calculations.passing;\n                    }\n                },\n\n                topVisible: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onTopVisible,\n                        callbackName = 'topVisible'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for top visible', newCallback);\n                        settings.onTopVisible = newCallback;\n                    }\n                    if (calculations.topVisible) {\n                        module.execute(callback, callbackName);\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback === undefined) {\n                        return calculations.topVisible;\n                    }\n                },\n\n                bottomVisible: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onBottomVisible,\n                        callbackName = 'bottomVisible'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for bottom visible', newCallback);\n                        settings.onBottomVisible = newCallback;\n                    }\n                    if (calculations.bottomVisible) {\n                        module.execute(callback, callbackName);\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback === undefined) {\n                        return calculations.bottomVisible;\n                    }\n                },\n\n                topPassed: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onTopPassed,\n                        callbackName = 'topPassed'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for top passed', newCallback);\n                        settings.onTopPassed = newCallback;\n                    }\n                    if (calculations.topPassed) {\n                        module.execute(callback, callbackName);\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback === undefined) {\n                        return calculations.topPassed;\n                    }\n                },\n\n                bottomPassed: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onBottomPassed,\n                        callbackName = 'bottomPassed'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for bottom passed', newCallback);\n                        settings.onBottomPassed = newCallback;\n                    }\n                    if (calculations.bottomPassed) {\n                        module.execute(callback, callbackName);\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback === undefined) {\n                        return calculations.bottomPassed;\n                    }\n                },\n\n                passingReverse: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onPassingReverse,\n                        callbackName = 'passingReverse'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for passing reverse', newCallback);\n                        settings.onPassingReverse = newCallback;\n                    }\n                    if (!calculations.passing) {\n                        if (module.get.occurred('passing')) {\n                            module.execute(callback, callbackName);\n                        }\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback !== undefined) {\n                        return !calculations.passing;\n                    }\n                },\n\n                topVisibleReverse: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onTopVisibleReverse,\n                        callbackName = 'topVisibleReverse'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for top visible reverse', newCallback);\n                        settings.onTopVisibleReverse = newCallback;\n                    }\n                    if (!calculations.topVisible) {\n                        if (module.get.occurred('topVisible')) {\n                            module.execute(callback, callbackName);\n                        }\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback === undefined) {\n                        return !calculations.topVisible;\n                    }\n                },\n\n                bottomVisibleReverse: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onBottomVisibleReverse,\n                        callbackName = 'bottomVisibleReverse'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for bottom visible reverse', newCallback);\n                        settings.onBottomVisibleReverse = newCallback;\n                    }\n                    if (!calculations.bottomVisible) {\n                        if (module.get.occurred('bottomVisible')) {\n                            module.execute(callback, callbackName);\n                        }\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback === undefined) {\n                        return !calculations.bottomVisible;\n                    }\n                },\n\n                topPassedReverse: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onTopPassedReverse,\n                        callbackName = 'topPassedReverse'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for top passed reverse', newCallback);\n                        settings.onTopPassedReverse = newCallback;\n                    }\n                    if (!calculations.topPassed) {\n                        if (module.get.occurred('topPassed')) {\n                            module.execute(callback, callbackName);\n                        }\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback === undefined) {\n                        return !calculations.onTopPassed;\n                    }\n                },\n\n                bottomPassedReverse: function (newCallback) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        callback     = newCallback || settings.onBottomPassedReverse,\n                        callbackName = 'bottomPassedReverse'\n                    ;\n                    if (newCallback) {\n                        module.debug('Adding callback for bottom passed reverse', newCallback);\n                        settings.onBottomPassedReverse = newCallback;\n                    }\n                    if (!calculations.bottomPassed) {\n                        if (module.get.occurred('bottomPassed')) {\n                            module.execute(callback, callbackName);\n                        }\n                    } else if (!settings.once) {\n                        module.remove.occurred(callbackName);\n                    }\n                    if (newCallback === undefined) {\n                        return !calculations.bottomPassed;\n                    }\n                },\n\n                execute: function (callback, callbackName) {\n                    var\n                        calculations = module.get.elementCalculations(),\n                        screen       = module.get.screenCalculations()\n                    ;\n                    callback = callback || false;\n                    if (callback) {\n                        if (settings.continuous) {\n                            module.debug('Callback being called continuously', callbackName, calculations);\n                            callback.call(element, calculations, screen);\n                        } else if (!module.get.occurred(callbackName)) {\n                            module.debug('Conditions met', callbackName, calculations);\n                            callback.call(element, calculations, screen);\n                        }\n                    }\n                    module.save.occurred(callbackName);\n                },\n\n                remove: {\n                    fixed: function () {\n                        module.debug('Removing fixed position');\n                        $module\n                            .removeClass(className.fixed)\n                            .css({\n                                position: '',\n                                top: '',\n                                left: '',\n                                zIndex: '',\n                            })\n                        ;\n                        settings.onUnfixed.call(element);\n                    },\n                    placeholder: function () {\n                        module.debug('Removing placeholder content');\n                        if ($placeholder) {\n                            $placeholder.remove();\n                        }\n                    },\n                    occurred: function (callback) {\n                        if (callback) {\n                            var\n                                occurred = module.cache.occurred\n                            ;\n                            if (occurred[callback] !== undefined && occurred[callback] === true) {\n                                module.debug('Callback can now be called again', callback);\n                                module.cache.occurred[callback] = false;\n                            }\n                        } else {\n                            module.cache.occurred = {};\n                        }\n                    },\n                },\n\n                save: {\n                    calculations: function () {\n                        module.verbose('Saving all calculations necessary to determine positioning');\n                        module.save.direction();\n                        module.save.screenCalculations();\n                        module.save.elementCalculations();\n                    },\n                    occurred: function (callback) {\n                        if (callback) {\n                            if (module.cache.occurred[callback] === undefined || (module.cache.occurred[callback] !== true)) {\n                                module.verbose('Saving callback occurred', callback);\n                                module.cache.occurred[callback] = true;\n                            }\n                        }\n                    },\n                    scroll: function (scrollPosition) {\n                        scrollPosition = scrollPosition + settings.offset || $context.scrollTop() + settings.offset;\n                        module.cache.scroll = scrollPosition;\n                    },\n                    direction: function () {\n                        var\n                            scroll     = module.get.scroll(),\n                            lastScroll = module.get.lastScroll(),\n                            direction\n                        ;\n                        if (scroll > lastScroll && lastScroll) {\n                            direction = 'down';\n                        } else if (scroll < lastScroll && lastScroll) {\n                            direction = 'up';\n                        } else {\n                            direction = 'static';\n                        }\n                        module.cache.direction = direction;\n\n                        return module.cache.direction;\n                    },\n                    elementPosition: function () {\n                        var\n                            element = module.cache.element,\n                            screen  = module.get.screenSize()\n                        ;\n                        module.verbose('Saving element position');\n                        // (quicker than $.extend)\n                        element.fits = element.height < screen.height;\n                        element.offset = $module.offset();\n                        element.width = $module.outerWidth();\n                        element.height = $module.outerHeight();\n                        // compensate for scroll in context\n                        if (module.is.verticallyScrollableContext()) {\n                            element.offset.top += $context.scrollTop() - $context.offset().top;\n                        }\n                        if (module.is.horizontallyScrollableContext()) {\n                            element.offset.left += $context.scrollLeft() - $context.offset().left;\n                        }\n                        // store\n                        module.cache.element = element;\n\n                        return element;\n                    },\n                    elementCalculations: function () {\n                        var\n                            screen     = module.get.screenCalculations(),\n                            element    = module.get.elementPosition()\n                        ;\n                        // offset\n                        if (settings.includeMargin) {\n                            element.margin = {};\n                            element.margin.top = parseInt($module.css('margin-top'), 10);\n                            element.margin.bottom = parseInt($module.css('margin-bottom'), 10);\n                            element.top = element.offset.top - element.margin.top;\n                            element.bottom = element.offset.top + element.height + element.margin.bottom;\n                        } else {\n                            element.top = element.offset.top;\n                            element.bottom = element.offset.top + element.height;\n                        }\n\n                        // visibility\n                        element.topPassed = screen.top >= element.top;\n                        element.bottomPassed = screen.top >= element.bottom;\n                        element.topVisible = (screen.bottom >= element.top) && !element.topPassed;\n                        element.bottomVisible = (screen.bottom >= element.bottom) && !element.bottomPassed;\n                        element.pixelsPassed = 0;\n                        element.percentagePassed = 0;\n\n                        // meta calculations\n                        element.onScreen = (element.topVisible || element.passing) && !element.bottomPassed;\n                        element.passing = element.topPassed && !element.bottomPassed;\n                        element.offScreen = !element.onScreen;\n\n                        // passing calculations\n                        if (element.passing) {\n                            element.pixelsPassed = screen.top - element.top;\n                            element.percentagePassed = (screen.top - element.top) / element.height;\n                        }\n                        module.cache.element = element;\n                        module.verbose('Updated element calculations', element);\n\n                        return element;\n                    },\n                    screenCalculations: function () {\n                        var\n                            scroll = module.get.scroll()\n                        ;\n                        module.save.direction();\n                        module.cache.screen.top = scroll;\n                        module.cache.screen.bottom = scroll + module.cache.screen.height;\n\n                        return module.cache.screen;\n                    },\n                    screenSize: function () {\n                        module.verbose('Saving window position');\n                        module.cache.screen = {\n                            height: $context.height(),\n                        };\n                    },\n                    position: function () {\n                        module.save.screenSize();\n                        module.save.elementPosition();\n                    },\n                },\n\n                get: {\n                    pixelsPassed: function (amount) {\n                        var\n                            element = module.get.elementCalculations()\n                        ;\n                        if (amount.search('%') > -1) {\n                            return element.height * (parseInt(amount, 10) / 100);\n                        }\n\n                        return parseInt(amount, 10);\n                    },\n                    occurred: function (callback) {\n                        return module.cache.occurred !== undefined\n                            ? module.cache.occurred[callback] || false\n                            : false;\n                    },\n                    direction: function () {\n                        if (module.cache.direction === undefined) {\n                            module.save.direction();\n                        }\n\n                        return module.cache.direction;\n                    },\n                    elementPosition: function () {\n                        if (module.cache.element === undefined) {\n                            module.save.elementPosition();\n                        }\n\n                        return module.cache.element;\n                    },\n                    elementCalculations: function () {\n                        if (module.cache.element === undefined) {\n                            module.save.elementCalculations();\n                        }\n\n                        return module.cache.element;\n                    },\n                    screenCalculations: function () {\n                        if (module.cache.screen === undefined) {\n                            module.save.screenCalculations();\n                        }\n\n                        return module.cache.screen;\n                    },\n                    screenSize: function () {\n                        if (module.cache.screen === undefined) {\n                            module.save.screenSize();\n                        }\n\n                        return module.cache.screen;\n                    },\n                    scroll: function () {\n                        if (module.cache.scroll === undefined) {\n                            module.save.scroll();\n                        }\n\n                        return module.cache.scroll;\n                    },\n                    lastScroll: function () {\n                        if (module.cache.screen === undefined) {\n                            module.debug('First scroll event, no last scroll could be found');\n\n                            return false;\n                        }\n\n                        return module.cache.screen.top;\n                    },\n                },\n\n                setting: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, settings, name);\n                    } else if (value !== undefined) {\n                        settings[name] = value;\n                    } else {\n                        return settings[name];\n                    }\n                },\n                internal: function (name, value) {\n                    if ($.isPlainObject(name)) {\n                        $.extend(true, module, name);\n                    } else if (value !== undefined) {\n                        module[name] = value;\n                    } else {\n                        return module[name];\n                    }\n                },\n                debug: function () {\n                    if (!settings.silent && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.debug.apply(console, arguments);\n                        }\n                    }\n                },\n                verbose: function () {\n                    if (!settings.silent && settings.verbose && settings.debug) {\n                        if (settings.performance) {\n                            module.performance.log(arguments);\n                        } else {\n                            module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n                            module.verbose.apply(console, arguments);\n                        }\n                    }\n                },\n                error: function () {\n                    if (!settings.silent) {\n                        module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n                        module.error.apply(console, arguments);\n                    }\n                },\n                performance: {\n                    log: function (message) {\n                        var\n                            currentTime,\n                            executionTime,\n                            previousTime\n                        ;\n                        if (settings.performance) {\n                            currentTime = Date.now();\n                            previousTime = time || currentTime;\n                            executionTime = currentTime - previousTime;\n                            time = currentTime;\n                            performance.push({\n                                Name: message[0],\n                                Arguments: [].slice.call(message, 1) || '',\n                                Element: element,\n                                'Execution Time': executionTime,\n                            });\n                        }\n                        clearTimeout(module.performance.timer);\n                        module.performance.timer = setTimeout(function () {\n                            module.performance.display();\n                        }, 500);\n                    },\n                    display: function () {\n                        var\n                            title = settings.name + ':',\n                            totalTime = 0\n                        ;\n                        time = false;\n                        clearTimeout(module.performance.timer);\n                        $.each(performance, function (index, data) {\n                            totalTime += data['Execution Time'];\n                        });\n                        title += ' ' + totalTime + 'ms';\n                        if (performance.length > 0) {\n                            console.groupCollapsed(title);\n                            if (console.table) {\n                                console.table(performance);\n                            } else {\n                                $.each(performance, function (index, data) {\n                                    console.log(data.Name + ': ' + data['Execution Time'] + 'ms');\n                                });\n                            }\n                            console.groupEnd();\n                        }\n                        performance = [];\n                    },\n                },\n                invoke: function (query, passedArguments, context) {\n                    var\n                        object = instance,\n                        maxDepth,\n                        found,\n                        response\n                    ;\n                    passedArguments = passedArguments || queryArguments;\n                    context = context || element;\n                    if (typeof query === 'string' && object !== undefined) {\n                        query = query.split(/[ .]/);\n                        maxDepth = query.length - 1;\n                        $.each(query, function (depth, value) {\n                            var camelCaseValue = depth !== maxDepth\n                                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                                : query\n                            ;\n                            if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {\n                                object = object[camelCaseValue];\n                            } else if (object[camelCaseValue] !== undefined) {\n                                found = object[camelCaseValue];\n\n                                return false;\n                            } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {\n                                object = object[value];\n                            } else if (object[value] !== undefined) {\n                                found = object[value];\n\n                                return false;\n                            } else {\n                                module.error(error.method, query);\n\n                                return false;\n                            }\n                        });\n                    }\n                    if (isFunction(found)) {\n                        response = found.apply(context, passedArguments);\n                    } else if (found !== undefined) {\n                        response = found;\n                    }\n                    if (Array.isArray(returnedValue)) {\n                        returnedValue.push(response);\n                    } else if (returnedValue !== undefined) {\n                        returnedValue = [returnedValue, response];\n                    } else if (response !== undefined) {\n                        returnedValue = response;\n                    }\n\n                    return found;\n                },\n            };\n\n            if (methodInvoked) {\n                if (instance === undefined) {\n                    module.initialize();\n                }\n                instance.save.scroll();\n                instance.save.calculations();\n                module.invoke(query);\n            } else {\n                if (instance !== undefined) {\n                    instance.invoke('destroy');\n                }\n                module.initialize();\n            }\n        });\n\n        return returnedValue !== undefined\n            ? returnedValue\n            : this;\n    };\n\n    $.fn.visibility.settings = {\n\n        name: 'Visibility',\n        namespace: 'visibility',\n\n        debug: false,\n        verbose: false,\n        performance: true,\n\n        // whether to use mutation observers to follow changes\n        observeChanges: true,\n\n        // check position immediately on init\n        initialCheck: true,\n\n        // whether to refresh calculations after all page images load\n        refreshOnLoad: true,\n\n        // whether to refresh calculations after page resize event\n        refreshOnResize: true,\n\n        // should call callbacks on refresh event (resize, etc)\n        checkOnRefresh: true,\n\n        // callback should only occur one time\n        once: true,\n\n        // callback should fire continuously when evaluates to true\n        continuous: false,\n\n        // offset to use with scroll top\n        offset: 0,\n\n        // whether to include margin in elements position\n        includeMargin: false,\n\n        // scroll context for visibility checks\n        context: window,\n\n        // visibility check delay in ms (defaults to animationFrame)\n        throttle: false,\n\n        // special visibility type (image, fixed)\n        type: false,\n\n        // z-index to use with visibility 'fixed'\n        zIndex: '10',\n\n        // image only animation settings\n        transition: 'fade in',\n        duration: 1000,\n\n        // array of callbacks for percentage\n        onPassed: {},\n\n        // standard callbacks\n        onOnScreen: false,\n        onOffScreen: false,\n        onPassing: false,\n        onTopVisible: false,\n        onBottomVisible: false,\n        onTopPassed: false,\n        onBottomPassed: false,\n\n        // reverse callbacks\n        onPassingReverse: false,\n        onTopVisibleReverse: false,\n        onBottomVisibleReverse: false,\n        onTopPassedReverse: false,\n        onBottomPassedReverse: false,\n\n        // special callbacks for image\n        onLoad: function () {},\n        onAllLoaded: function () {},\n\n        // special callbacks for fixed position\n        onFixed: function () {},\n        onUnfixed: function () {},\n\n        // utility callbacks\n        onUpdate: false, // disabled by default for performance\n        onRefresh: function () {},\n\n        metadata: {\n            src: 'src',\n        },\n\n        className: {\n            fixed: 'fixed',\n            placeholder: 'constraint',\n            visible: 'visible',\n        },\n\n        error: {\n            method: 'The method you called is not defined.',\n            visible: 'Element is hidden, you must call refresh after element becomes visible',\n        },\n\n    };\n})(jQuery, window, document);\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/themes/basic/assets/fonts/LICENSE.txt",
    "content": "This Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/themes/default/assets/fonts/LICENSE_Lato.txt",
    "content": "Copyright (c) 2010-2015, Łukasz Dziedzic (dziedzic@typoland.com),\nwith Reserved Font Name Lato.\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/themes/default/assets/fonts/LICENSE_icons.txt",
    "content": "Fonticons, Inc. (https://fontawesome.com)\n\n--------------------------------------------------------------------------------\n\nFont Awesome Free License\n\nFont Awesome Free is free, open source, and GPL friendly. You can use it for\ncommercial projects, open source projects, or really almost whatever you want.\nFull Font Awesome Free license: https://fontawesome.com/license/free.\n\n--------------------------------------------------------------------------------\n\n# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)\n\nThe Font Awesome Free download is licensed under a Creative Commons\nAttribution 4.0 International License and applies to all icons packaged\nas SVG and JS file types.\n\n--------------------------------------------------------------------------------\n\n# Fonts: SIL OFL 1.1 License\n\nIn the Font Awesome Free download, the SIL OFL license applies to all icons\npackaged as web and desktop font files.\n\nCopyright (c) 2023 Fonticons, Inc. (https://fontawesome.com)\nwith Reserved Font Name: \"Font Awesome\".\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\nSIL OPEN FONT LICENSE\nVersion 1.1 - 26 February 2007\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting — in part or in whole — any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n\n--------------------------------------------------------------------------------\n\n# Code: MIT License (https://opensource.org/licenses/MIT)\n\nIn the Font Awesome Free download, the MIT license applies to all non-font and\nnon-icon files.\n\nCopyright 2023 Fonticons, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in the\nSoftware without restriction, including without limitation the rights to use, copy,\nmodify, merge, publish, distribute, sublicense, and/or sell copies of the Software,\nand to permit persons to whom the Software is furnished to do so, subject to the\nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\n\n# Attribution\n\nAttribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font\nAwesome Free files already contain embedded comments with sufficient\nattribution, so you shouldn't need to do anything additional when using these\nfiles normally.\n\nWe've kept attribution comments terse, so we ask that you do not actively work\nto remove them from files, especially code. They're a great way for folks to\nlearn about Font Awesome.\n\n--------------------------------------------------------------------------------\n\n# Brand Icons\n\nAll brand icons are trademarks of their respective owners. The use of these\ntrademarks does not indicate endorsement of the trademark holder by Font\nAwesome, nor vice versa. **Please do not use brand logos for any purpose except\nto represent the company, product, or service to which they refer.**\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/themes/github/assets/fonts/LICENSE.txt",
    "content": "(c) 2012-2015 GitHub\nwith Reserved Font Name Opticons.\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "assets/vendors/fomantic-ui/themes/material/assets/fonts/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "assets/vendors/friendcircle/amrParse.js",
    "content": "(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.BenzAMRRecorder = factory());\n})(this, (function () {\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n  var recorder_build = {exports: {}};\n\n  (function (module, exports) {\n  \t(function (global, factory) {\r\n  \t    module.exports = factory() ;\r\n  \t}(commonjsGlobal, (function () {\r\n  \t    var recorderWorker = function () {\r\n\r\n  \t        var recLength = 0,\r\n  \t            recBuffersL = [],\r\n  \t            recBuffersR = [],\r\n  \t            sampleRate;\r\n\r\n\r\n  \t        self.onmessage = function (e) {\r\n  \t            switch (e.data.command) {\r\n  \t                case 'init':\r\n  \t                    init(e.data.config);\r\n  \t                    break;\r\n  \t                case 'record':\r\n  \t                    record(e.data.buffer);\r\n  \t                    break;\r\n  \t                case 'exportWAV':\r\n  \t                    exportWAV(e.data.type);\r\n  \t                    break;\r\n  \t                case 'getBuffer':\r\n  \t                    getBuffer();\r\n  \t                    break;\r\n  \t                case 'clear':\r\n  \t                    clear();\r\n  \t                    break;\r\n  \t            }\r\n  \t        };\r\n\r\n  \t        function init(config) {\r\n  \t            sampleRate = config.sampleRate;\r\n  \t        }\r\n\r\n  \t        function record(inputBuffer) {\r\n  \t            recBuffersL.push(inputBuffer[0]);\r\n  \t            recBuffersR.push(inputBuffer[1]);\r\n  \t            recLength += inputBuffer[0].length;\r\n  \t        }\r\n\r\n  \t        function exportWAV(type) {\r\n  \t            var bufferL = mergeBuffers(recBuffersL, recLength);\r\n  \t            var bufferR = mergeBuffers(recBuffersR, recLength);\r\n  \t            var interleaved = interleave(bufferL, bufferR);\r\n  \t            var dataview = encodeWAV(interleaved);\r\n  \t            var audioBlob = new Blob([dataview], {type: type});\r\n\r\n  \t            self.postMessage({\r\n  \t                type: 'blob',\r\n  \t                data: audioBlob\r\n  \t            });\r\n  \t        }\r\n\r\n  \t        function getBuffer() {\r\n  \t            var buffers = [];\r\n  \t            buffers.push(mergeBuffers(recBuffersL, recLength));\r\n  \t            buffers.push(mergeBuffers(recBuffersR, recLength));\r\n  \t            self.postMessage({\r\n  \t                type: 'buffer',\r\n  \t                data: buffers\r\n  \t            });\r\n  \t        }\r\n\r\n  \t        function clear() {\r\n  \t            recLength = 0;\r\n  \t            recBuffersL = [];\r\n  \t            recBuffersR = [];\r\n  \t        }\r\n\r\n  \t        function mergeBuffers(recBuffers, recLength) {\r\n  \t            var result = new Float32Array(recLength);\r\n  \t            var offset = 0;\r\n  \t            for (var i = 0; i < recBuffers.length; i++) {\r\n  \t                result.set(recBuffers[i], offset);\r\n  \t                offset += recBuffers[i].length;\r\n  \t            }\r\n  \t            return result;\r\n  \t        }\r\n\r\n  \t        function interleave(inputL, inputR) {\r\n  \t            var length = inputL.length + inputR.length;\r\n  \t            var result = new Float32Array(length);\r\n\r\n  \t            var index = 0,\r\n  \t                inputIndex = 0;\r\n\r\n  \t            while (index < length) {\r\n  \t                result[index++] = inputL[inputIndex];\r\n  \t                result[index++] = inputR[inputIndex];\r\n  \t                inputIndex++;\r\n  \t            }\r\n  \t            return result;\r\n  \t        }\r\n\r\n  \t        function floatTo16BitPCM(output, offset, input) {\r\n  \t            for (var i = 0; i < input.length; i++, offset += 2) {\r\n  \t                var s = Math.max(-1, Math.min(1, input[i]));\r\n  \t                output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);\r\n  \t            }\r\n  \t        }\r\n\r\n  \t        function writeString(view, offset, string) {\r\n  \t            for (var i = 0; i < string.length; i++) {\r\n  \t                view.setUint8(offset + i, string.charCodeAt(i));\r\n  \t            }\r\n  \t        }\r\n\r\n  \t        function encodeWAV(samples) {\r\n  \t            var buffer = new ArrayBuffer(44 + samples.length * 2);\r\n  \t            var view = new DataView(buffer);\r\n\r\n  \t            /* RIFF identifier */\r\n  \t            writeString(view, 0, 'RIFF');\r\n  \t            /* RIFF chunk length */\r\n  \t            view.setUint32(4, 36 + samples.length * 2, true);\r\n  \t            /* RIFF type */\r\n  \t            writeString(view, 8, 'WAVE');\r\n  \t            /* format chunk identifier */\r\n  \t            writeString(view, 12, 'fmt ');\r\n  \t            /* format chunk length */\r\n  \t            view.setUint32(16, 16, true);\r\n  \t            /* sample format (raw) */\r\n  \t            view.setUint16(20, 1, true);\r\n  \t            /* channel count */\r\n  \t            view.setUint16(22, 2, true);\r\n  \t            /* sample rate */\r\n  \t            view.setUint32(24, sampleRate, true);\r\n  \t            /* byte rate (sample rate * block align) */\r\n  \t            view.setUint32(28, sampleRate * 4, true);\r\n  \t            /* block align (channel count * bytes per sample) */\r\n  \t            view.setUint16(32, 4, true);\r\n  \t            /* bits per sample */\r\n  \t            view.setUint16(34, 16, true);\r\n  \t            /* data chunk identifier */\r\n  \t            writeString(view, 36, 'data');\r\n  \t            /* data chunk length */\r\n  \t            view.setUint32(40, samples.length * 2, true);\r\n\r\n  \t            floatTo16BitPCM(view, 44, samples);\r\n\r\n  \t            return view;\r\n  \t        }\r\n\r\n  \t    };\r\n\r\n  \t    var recorderWorkerStr = recorderWorker.toString()\r\n  \t        .replace(/^\\s*function.*?\\(\\)\\s*{/, '')\r\n  \t        .replace(/}\\s*$/, '');\r\n\r\n  \t    // var WORKER_PATH = './recorderWorker.js';\r\n\r\n  \t    var Recorder = function(source, cfg){\r\n  \t      var config = cfg || {};\r\n  \t      var bufferLen = config.bufferLen || 4096;\r\n  \t      this.context = source.context;\r\n  \t      this.node = (this.context.createScriptProcessor ||\r\n  \t                   this.context.createJavaScriptNode).call(this.context,\r\n  \t                                                           bufferLen, 2, 2);\r\n  \t      var worker = new Worker((window.URL || window.webkitURL).createObjectURL(new Blob([recorderWorkerStr], {type:\"text/javascript\"})));\r\n  \t      worker.onmessage = function(e){\r\n  \t        if (e.data.type === 'blob') {\r\n  \t            currCallbackWithBlob(e.data.data);\r\n  \t        } else {\r\n  \t            currCallbackWithBuffer(e.data.data);\r\n  \t        }\r\n  \t      };\r\n\r\n  \t      worker.postMessage({\r\n  \t        command: 'init',\r\n  \t        config: {\r\n  \t          sampleRate: this.context.sampleRate\r\n  \t        }\r\n  \t      });\r\n  \t      var recording = false,\r\n  \t        currCallbackWithBuffer,\r\n  \t        currCallbackWithBlob;\r\n\r\n  \t      this.node.onaudioprocess = function(e){\r\n  \t        if (!recording) return;\r\n  \t        worker.postMessage({\r\n  \t          command: 'record',\r\n  \t          buffer: [\r\n  \t            e.inputBuffer.getChannelData(0),\r\n  \t            e.inputBuffer.getChannelData(1)\r\n  \t          ]\r\n  \t        });\r\n  \t      };\r\n\r\n  \t      this.configure = function(cfg){\r\n  \t        for (var prop in cfg){\r\n  \t          if (cfg.hasOwnProperty(prop)){\r\n  \t            config[prop] = cfg[prop];\r\n  \t          }\r\n  \t        }\r\n  \t      };\r\n\r\n  \t      this.record = function(){\r\n  \t        recording = true;\r\n  \t      };\r\n\r\n  \t      this.stop = function(){\r\n  \t        recording = false;\r\n  \t      };\r\n\r\n  \t      this.clear = function(){\r\n  \t        worker.postMessage({ command: 'clear' });\r\n  \t      };\r\n\r\n  \t      this.getBuffer = function(cb) {\r\n  \t        currCallbackWithBuffer = cb || config.callback;\r\n  \t        worker.postMessage({ command: 'getBuffer' });\r\n  \t      };\r\n\r\n  \t      this.exportWAV = function(cb, type){\r\n  \t        currCallbackWithBlob = cb || config.callback;\r\n  \t        type = type || config.type || 'audio/wav';\r\n  \t        if (!currCallbackWithBlob) throw new Error('Callback not set');\r\n  \t        worker.postMessage({\r\n  \t          command: 'exportWAV',\r\n  \t          type: type\r\n  \t        });\r\n  \t      };\r\n\r\n  \t      this.release = function() {\r\n  \t        this.stop();\r\n  \t        this.clear();\r\n  \t        this.configure = this.record = this.stop = this.clear = this.getBuffer = this.exportWAV = function () {};\r\n  \t        source.disconnect(this.node);\r\n  \t        this.node.onaudioprocess = null;\r\n  \t        this.node.disconnect();\r\n  \t        worker.terminate();\r\n  \t      };\r\n\r\n  \t      source.connect(this.node);\r\n  \t      this.node.connect(this.context.destination);    //this should not be necessary\r\n  \t    };\r\n\r\n  \t    Recorder.forceDownload = function(blob, filename){\r\n  \t      var url = (window.URL || window.webkitURL).createObjectURL(blob);\r\n  \t      var link = window.document.createElement('a');\r\n  \t      link.href = url;\r\n  \t      link.download = filename || 'output.wav';\r\n  \t      var click = document.createEvent(\"Event\");\r\n  \t      click.initEvent(\"click\", true, true);\r\n  \t      link.dispatchEvent(click);\r\n  \t    };\r\n\r\n  \t    var recorder = Recorder;\r\n\r\n  \t    return recorder;\r\n\r\n  \t})));\n  } (recorder_build));\n\n  var Recorder = recorder_build.exports;\n\n  var AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext;\n  var ctx = null;\n  var isSupport = true;\n\n  if (!AudioContext) {\n    isSupport = false;\n    console.warn('Web Audio API is Unsupported.');\n  }\n\n  var RecorderControl =\n  /*#__PURE__*/\n  function () {\n    function RecorderControl() {\n      _classCallCheck(this, RecorderControl);\n\n      this._recorderStream = null;\n      this._recorderStreamSourceNode = null;\n      this._recorder = null;\n      this._isRecording = false;\n      this._curSourceNode = null;\n    }\n\n    _createClass(RecorderControl, [{\n      key: \"playPcm\",\n      value: function playPcm(samples, sampleRate, onEnded, startPos) {\n        if (!ctx || ctx.state === 'closed') {\n          ctx = new AudioContext();\n        }\n\n        if (ctx.state === 'interrupted' || ctx.state === 'suspended') {\n          ctx.resume();\n        }\n\n        sampleRate = sampleRate || 8000;\n        this.stopPcm();\n\n        var _samples = startPos && startPos > 0.001 ? // 根据开始位置（秒数）截取播放采样\n        samples.slice(sampleRate * startPos) : samples;\n\n        if (!_samples.length) {\n          return onEnded();\n        }\n\n        var buffer, channelBuffer;\n        this._curSourceNode = ctx['createBufferSource']();\n\n        try {\n          buffer = ctx['createBuffer'](1, _samples.length, sampleRate);\n        } catch (e) {\n          // iOS 不支持 22050 以下的采样率，于是先提升采样率，然后用慢速播放\n          if (sampleRate < 11025) {\n            /*buffer = ctx['createBuffer'](1, _samples.length * 3, sampleRate * 3);\r\n            _samples = this._increaseSampleRate(_samples, 3);*/\n            buffer = ctx['createBuffer'](1, _samples.length, sampleRate * 4);\n            this._curSourceNode['playbackRate'].value = 0.25;\n          } else {\n            /*buffer = ctx['createBuffer'](1, _samples.length * 2, sampleRate * 2);\r\n            _samples = this._increaseSampleRate(_samples, 2);*/\n            buffer = ctx['createBuffer'](1, _samples.length, sampleRate * 2);\n            this._curSourceNode['playbackRate'].value = 0.5;\n          }\n        }\n\n        if (buffer['copyToChannel']) {\n          buffer['copyToChannel'](_samples, 0, 0);\n        } else {\n          channelBuffer = buffer['getChannelData'](0);\n          channelBuffer.set(_samples);\n        }\n\n        this._curSourceNode['buffer'] = buffer;\n        this._curSourceNode['loop'] = false;\n\n        this._curSourceNode['connect'](ctx['destination']);\n\n        this._curSourceNode.onended = onEnded;\n\n        this._curSourceNode.start();\n      }\n    }, {\n      key: \"stopPcm\",\n      value: function stopPcm() {\n        if (this._curSourceNode) {\n          this._curSourceNode.stop();\n\n          this._curSourceNode = null;\n        }\n      }\n    }, {\n      key: \"stopPcmSilently\",\n      value: function stopPcmSilently() {\n        this._curSourceNode.onended = null;\n        this.stopPcm();\n      }\n    }, {\n      key: \"initRecorder\",\n      value: function initRecorder() {\n        var _this = this;\n\n        return new Promise(function (resolve, reject) {\n          var s = function s(stream) {\n            _this._recorderStream = stream;\n            _this._recorderStreamSourceNode = ctx.createMediaStreamSource(stream);\n            _this._recorder = new Recorder(_this._recorderStreamSourceNode);\n            _this._isRecording = false;\n            resolve();\n          };\n\n          var j = function j(e) {\n            reject(e);\n          };\n\n          if (!_this._recorder) {\n            if (window.navigator.mediaDevices && window.navigator.mediaDevices.getUserMedia) {\n              window.navigator.mediaDevices.getUserMedia({\n                audio: true\n              }).then(s).catch(j);\n            } else if (window.navigator.getUserMedia) {\n              window.navigator.getUserMedia({\n                audio: true\n              }, s, j);\n            } else {\n              j();\n            }\n          } else {\n            resolve();\n          }\n        });\n      }\n    }, {\n      key: \"isRecording\",\n      value: function isRecording() {\n        return this._recorder && this._isRecording;\n      }\n    }, {\n      key: \"startRecord\",\n      value: function startRecord() {\n        if (this._recorder) {\n          this._recorder.clear();\n\n          this._recorder.record();\n\n          this._isRecording = true;\n        }\n      }\n    }, {\n      key: \"stopRecord\",\n      value: function stopRecord() {\n        if (this._recorder) {\n          this._recorder.stop();\n\n          this._isRecording = false;\n        }\n      }\n    }, {\n      key: \"generateRecordSamples\",\n      value: function generateRecordSamples() {\n        var _this2 = this;\n\n        return new Promise(function (resolve) {\n          if (_this2._recorder) {\n            _this2._recorder.getBuffer(function (buffers) {\n              resolve(buffers[0]);\n            });\n          }\n        });\n      }\n    }, {\n      key: \"releaseRecord\",\n      value: function releaseRecord() {\n        if (this._recorderStream && this._recorderStream.getTracks) {\n          this._recorderStream.getTracks().forEach(function (track) {\n            track.stop();\n          });\n\n          this._recorderStream = null;\n        }\n\n        if (this._recorder) {\n          this._recorder.release();\n\n          this._recorder = null;\n        }\n      }\n    }], [{\n      key: \"isPlaySupported\",\n      value: function isPlaySupported() {\n        return isSupport;\n      }\n    }, {\n      key: \"isRecordSupported\",\n      value: function isRecordSupported() {\n        return !!(window.navigator.mediaDevices && window.navigator.mediaDevices.getUserMedia || window.navigator.getUserMedia);\n      }\n    }, {\n      key: \"getCtxSampleRate\",\n      value: function getCtxSampleRate() {\n        return ctx && ctx.sampleRate || 0;\n      }\n    }, {\n      key: \"getCtxTime\",\n      value: function getCtxTime() {\n        return ctx && ctx.currentTime || 0;\n      }\n    }, {\n      key: \"decodeAudioArrayBufferByContext\",\n      value: function decodeAudioArrayBufferByContext(array) {\n        return new Promise(function (resolve, reject) {\n          ctx['decodeAudioData'](array, function (audioBuf) {\n            // 把多声道音频 mix 成单声道\n            var numberOfChannels = audioBuf.numberOfChannels;\n            var dest = new Float32Array(audioBuf.length);\n\n            switch (numberOfChannels) {\n              default:\n              case 1:\n                {\n                  dest = audioBuf.getChannelData(0);\n                  break;\n                }\n\n              case 2:\n                {\n                  var left = audioBuf.getChannelData(0);\n                  var right = audioBuf.getChannelData(1);\n\n                  for (var i = 0, l = dest.length; i < l; i++) {\n                    dest[i] = .5 * (left[i] + right[i]);\n                  }\n\n                  break;\n                }\n\n              case 4:\n                {\n                  var _left = audioBuf.getChannelData(0);\n\n                  var _right = audioBuf.getChannelData(1);\n\n                  var sLeft = audioBuf.getChannelData(2);\n                  var sRight = audioBuf.getChannelData(3);\n\n                  for (var _i = 0, _l = dest.length; _i < _l; _i++) {\n                    dest[_i] = .25 * (_left[_i] + _right[_i] + sLeft[_i] + sRight[_i]);\n                  }\n\n                  break;\n                }\n\n              case 6:\n                {\n                  var _left2 = audioBuf.getChannelData(0);\n\n                  var _right2 = audioBuf.getChannelData(1);\n\n                  var center = audioBuf.getChannelData(2);\n\n                  var _sLeft = audioBuf.getChannelData(4);\n\n                  var _sRight = audioBuf.getChannelData(5);\n\n                  for (var _i2 = 0, _l2 = dest.length; _i2 < _l2; _i2++) {\n                    dest[_i2] = 0.7071 * (_left2[_i2] + _right2[_i2]) + center[_i2] + 0.5 * (_sLeft[_i2] + _sRight[_i2]);\n                  }\n\n                  break;\n                }\n            }\n\n            resolve(dest);\n          }, reject);\n        });\n      }\n      /*\r\n      static _increaseSampleRate(samples, multiple) {\r\n          let sampleLen = samples.length;\r\n          let newSamples = new Float32Array(sampleLen * multiple);\r\n          for (let i = 0; i < sampleLen; i ++) {\r\n              for (let j = 0; j < multiple; j ++) {\r\n                  newSamples[i * multiple + j] = samples[i];\r\n              }\r\n          }\r\n          return newSamples;\r\n      };\r\n      */\n\n    }]);\n\n    return RecorderControl;\n  }();\n\n  var amrnb = function() {\r\n\r\n\r\n  var AMR = (function () {\r\n      var AMR = {\r\n          toWAV: (function (amr) {\r\n              var decoded = this._decode(amr);\r\n              if (!decoded) {\r\n                  return null\r\n              }\r\n              var raw = new Uint8Array(decoded.buffer, decoded.byteOffset, decoded.byteLength);\r\n              var out = new Uint8Array(raw.length + this.WAV_HEADER_SIZE);\r\n              var offset = 0;\r\n              var write_int16 = (function (value) {\r\n                  var a = new Uint8Array(2);\r\n                  (new Int16Array(a.buffer))[0] = value;\r\n                  out.set(a, offset);\r\n                  offset += 2;\r\n              });\r\n              var write_int32 = (function (value) {\r\n                  var a = new Uint8Array(4);\r\n                  (new Int32Array(a.buffer))[0] = value;\r\n                  out.set(a, offset);\r\n                  offset += 4;\r\n              });\r\n              var write_string = (function (value) {\r\n                  var d = (new TextEncoder(\"utf-8\")).encode(value);\r\n                  out.set(d, offset);\r\n                  offset += d.length;\r\n              });\r\n              write_string(\"RIFF\");\r\n              write_int32(4 + 8 + 16 + 8 + raw.length);\r\n              write_string(\"WAVEfmt \");\r\n              write_int32(16);\r\n              var bits_per_sample = 16;\r\n              var sample_rate = 8e3;\r\n              var channels = 1;\r\n              var bytes_per_frame = bits_per_sample / 8 * channels;\r\n              var bytes_per_sec = bytes_per_frame * sample_rate;\r\n              write_int16(1);\r\n              write_int16(1);\r\n              write_int32(sample_rate);\r\n              write_int32(bytes_per_sec);\r\n              write_int16(bytes_per_frame);\r\n              write_int16(bits_per_sample);\r\n              write_string(\"data\");\r\n              write_int32(raw.length);\r\n              out.set(raw, offset);\r\n              return out\r\n          }),\r\n          decode: (function (amr) {\r\n              var raw = this._decode(amr);\r\n              if (!raw) {\r\n                  return null\r\n              }\r\n              var out = new Float32Array(raw.length);\r\n              for (var i = 0; i < out.length; i++) {\r\n                  out[i] = raw[i] / 32768;\r\n              }\r\n              return out\r\n          }),\r\n          _decode: (function (amr) {\r\n              if (String.fromCharCode.apply(null, amr.subarray(0, this.AMR_HEADER.length)) !== this.AMR_HEADER) {\r\n                  return null\r\n              }\r\n              var decoder = this.Decoder_Interface_init();\r\n              if (!decoder) {\r\n                  return null\r\n              }\r\n              var out = new Int16Array(Math.floor(amr.length / 6 * this.PCM_BUFFER_COUNT));\r\n              var buf = Module._malloc(this.AMR_BUFFER_COUNT);\r\n              var decodeInBuffer = new Uint8Array(Module.HEAPU8.buffer, buf, this.AMR_BUFFER_COUNT);\r\n              buf = Module._malloc(this.PCM_BUFFER_COUNT * 2);\r\n              var decodeOutBuffer = new Int16Array(Module.HEAPU8.buffer, buf, this.PCM_BUFFER_COUNT);\r\n              var inOffset = 6;\r\n              var outOffset = 0;\r\n              while (inOffset + 1 < amr.length && outOffset + 1 < out.length) {\r\n                  var size = this.SIZES[amr[inOffset] >> 3 & 15];\r\n                  if (inOffset + size + 1 > amr.length) {\r\n                      break\r\n                  }\r\n                  decodeInBuffer.set(amr.subarray(inOffset, inOffset + size + 1));\r\n                  this.Decoder_Interface_Decode(decoder, decodeInBuffer.byteOffset, decodeOutBuffer.byteOffset, 0);\r\n                  if (outOffset + this.PCM_BUFFER_COUNT > out.length) {\r\n                      var newOut = new Int16Array(out.length * 2);\r\n                      newOut.set(out.subarray(0, outOffset));\r\n                      out = newOut;\r\n                  }\r\n                  out.set(decodeOutBuffer, outOffset);\r\n                  outOffset += this.PCM_BUFFER_COUNT;\r\n                  inOffset += size + 1;\r\n              }\r\n              Module._free(decodeInBuffer.byteOffset);\r\n              Module._free(decodeOutBuffer.byteOffset);\r\n              this.Decoder_Interface_exit(decoder);\r\n              return out.subarray(0, outOffset)\r\n          }),\r\n          encode: (function (pcm, pcmSampleRate, mode) {\r\n              if (pcmSampleRate < 8e3) {\r\n                  console.error(\"pcmSampleRate should not be less than 8000.\");\r\n                  return null\r\n              }\r\n              if (typeof mode === \"undefined\") {\r\n                  mode = this.Mode.MR795;\r\n              }\r\n              var encoder = this.Encoder_Interface_init();\r\n              if (!encoder) {\r\n                  return null\r\n              }\r\n              var buf = Module._malloc(this.PCM_BUFFER_COUNT * 2);\r\n              var encodeInBuffer = new Int16Array(Module.HEAPU8.buffer, buf, this.PCM_BUFFER_COUNT);\r\n              buf = Module._malloc(this.AMR_BUFFER_COUNT);\r\n              var encodeOutBuffer = new Uint8Array(Module.HEAPU8.buffer, buf, this.AMR_BUFFER_COUNT);\r\n              var ratio = pcmSampleRate / 8e3;\r\n              var inLength = Math.floor(pcm.length / ratio);\r\n              var inData = new Int16Array(inLength);\r\n              for (var i = 0; i < inLength; i++) {\r\n                  inData[i] = pcm[Math.floor(i * ratio)] * (32768 - 1);\r\n              }\r\n              var blockSize = this.SIZES[mode] + 1;\r\n              var out = new Uint8Array(Math.ceil(inLength / this.PCM_BUFFER_COUNT * blockSize) + this.AMR_HEADER.length);\r\n              out.set((new TextEncoder(\"utf-8\")).encode(this.AMR_HEADER));\r\n              var inOffset = 0;\r\n              var outOffset = this.AMR_HEADER.length;\r\n              while (inOffset + this.PCM_BUFFER_COUNT < inData.length && outOffset + blockSize < out.length) {\r\n                  encodeInBuffer.set(inData.subarray(inOffset, inOffset + this.PCM_BUFFER_COUNT));\r\n                  var n = this.Encoder_Interface_Encode(encoder, mode, encodeInBuffer.byteOffset, encodeOutBuffer.byteOffset, 0);\r\n                  if (n != blockSize) {\r\n                      console.error([n, blockSize]);\r\n                      break\r\n                  }\r\n                  out.set(encodeOutBuffer.subarray(0, n), outOffset);\r\n                  inOffset += this.PCM_BUFFER_COUNT;\r\n                  outOffset += n;\r\n              }\r\n              Module._free(encodeInBuffer.byteOffset);\r\n              Module._free(encodeOutBuffer.byteOffset);\r\n              this.Encoder_Interface_exit(encoder);\r\n              return out.subarray(0, outOffset)\r\n          }),\r\n          Decoder_Interface_init: (function () {\r\n              console.warn(\"Decoder_Interface_init not initialized.\");\r\n              return 0\r\n          }),\r\n          Decoder_Interface_exit: (function (state) {\r\n              console.warn(\"Decoder_Interface_exit not initialized.\");\r\n          }),\r\n          Decoder_Interface_Decode: (function (state, inBuffer, outBuffer, bfi) {\r\n              console.warn(\"Decoder_Interface_Decode not initialized.\");\r\n          }),\r\n          Encoder_Interface_init: (function (dtx) {\r\n              console.warn(\"Encoder_Interface_init not initialized.\");\r\n              return 0\r\n          }),\r\n          Encoder_Interface_exit: (function (state) {\r\n              console.warn(\"Encoder_Interface_exit not initialized.\");\r\n          }),\r\n          Encoder_Interface_Encode: (function (state, mode, speech, out, forceSpeech) {\r\n              console.warn(\"Encoder_Interface_Encode not initialized.\");\r\n          }),\r\n          Mode: {MR475: 0, MR515: 1, MR59: 2, MR67: 3, MR74: 4, MR795: 5, MR102: 6, MR122: 7, MRDTX: 8},\r\n          SIZES: [12, 13, 15, 17, 19, 20, 26, 31, 5, 6, 5, 5, 0, 0, 0, 0],\r\n          AMR_BUFFER_COUNT: 32,\r\n          PCM_BUFFER_COUNT: 160,\r\n          AMR_HEADER: \"#!AMR\\n\",\r\n          WAV_HEADER_SIZE: 44\r\n      };\r\n      var Module = {\r\n          canvas: {}, print: (function (text) {\r\n              console.log(text);\r\n          }), _main: (function () {\r\n              AMR.Decoder_Interface_init = Module._Decoder_Interface_init;\r\n              AMR.Decoder_Interface_exit = Module._Decoder_Interface_exit;\r\n              AMR.Decoder_Interface_Decode = Module._Decoder_Interface_Decode;\r\n              AMR.Encoder_Interface_init = Module._Encoder_Interface_init;\r\n              AMR.Encoder_Interface_exit = Module._Encoder_Interface_exit;\r\n              AMR.Encoder_Interface_Encode = Module._Encoder_Interface_Encode;\r\n              return 0\r\n          })\r\n      };\r\n      var Module;\r\n      if (!Module) Module = (typeof Module !== \"undefined\" ? Module : null) || {};\r\n      var moduleOverrides = {};\r\n      for (var key in Module) {\r\n          if (Module.hasOwnProperty(key)) {\r\n              moduleOverrides[key] = Module[key];\r\n          }\r\n      }\r\n      var ENVIRONMENT_IS_WEB = typeof window === \"object\";\r\n      var ENVIRONMENT_IS_WORKER = typeof importScripts === \"function\";\r\n      var ENVIRONMENT_IS_NODE = false;/*typeof process === \"object\" && typeof require === \"function\" && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER;*/\r\n      var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\r\n      if (ENVIRONMENT_IS_SHELL) {\r\n          if (!Module[\"print\"]) Module[\"print\"] = print;\r\n          if (typeof printErr != \"undefined\") Module[\"printErr\"] = printErr;\r\n          if (typeof read != \"undefined\") {\r\n              Module[\"read\"] = read;\r\n          } else {\r\n              Module[\"read\"] = function read() {\r\n                  throw \"no read() available (jsc?)\"\r\n              };\r\n          }\r\n          Module[\"readBinary\"] = function readBinary(f) {\r\n              if (typeof readbuffer === \"function\") {\r\n                  return new Uint8Array(readbuffer(f))\r\n              }\r\n              var data = read(f, \"binary\");\r\n              assert(typeof data === \"object\");\r\n              return data\r\n          };\r\n          if (typeof scriptArgs != \"undefined\") {\r\n              Module[\"arguments\"] = scriptArgs;\r\n          } else if (typeof arguments != \"undefined\") {\r\n              Module[\"arguments\"] = arguments;\r\n          }\r\n      } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\r\n          Module[\"read\"] = function read(url) {\r\n              var xhr = new XMLHttpRequest;\r\n              xhr.open(\"GET\", url, false);\r\n              xhr.send(null);\r\n              return xhr.responseText\r\n          };\r\n          if (typeof arguments != \"undefined\") {\r\n              Module[\"arguments\"] = arguments;\r\n          }\r\n          if (typeof console !== \"undefined\") {\r\n              if (!Module[\"print\"]) Module[\"print\"] = function print(x) {\r\n                  console.log(x);\r\n              };\r\n              if (!Module[\"printErr\"]) Module[\"printErr\"] = function printErr(x) {\r\n                  console.log(x);\r\n              };\r\n          } else {\r\n              var TRY_USE_DUMP = false;\r\n              if (!Module[\"print\"]) Module[\"print\"] = TRY_USE_DUMP && typeof dump !== \"undefined\" ? (function (x) {\r\n                  dump(x);\r\n              }) : (function (x) {\r\n              });\r\n          }\r\n          if (ENVIRONMENT_IS_WORKER) {\r\n              Module[\"load\"] = importScripts;\r\n          }\r\n          if (typeof Module[\"setWindowTitle\"] === \"undefined\") {\r\n              Module[\"setWindowTitle\"] = (function (title) {\r\n                  document.title = title;\r\n              });\r\n          }\r\n      } else {\r\n          throw \"Unknown runtime environment. Where are we?\"\r\n      }\r\n\r\n      function globalEval(x) {\r\n          eval.call(null, x);\r\n      }\r\n\r\n      if (!Module[\"load\"] && Module[\"read\"]) {\r\n          Module[\"load\"] = function load(f) {\r\n              globalEval(Module[\"read\"](f));\r\n          };\r\n      }\r\n      if (!Module[\"print\"]) {\r\n          Module[\"print\"] = (function () {\r\n          });\r\n      }\r\n      if (!Module[\"printErr\"]) {\r\n          Module[\"printErr\"] = Module[\"print\"];\r\n      }\r\n      if (!Module[\"arguments\"]) {\r\n          Module[\"arguments\"] = [];\r\n      }\r\n      if (!Module[\"thisProgram\"]) {\r\n          Module[\"thisProgram\"] = \"./this.program\";\r\n      }\r\n      Module.print = Module[\"print\"];\r\n      Module.printErr = Module[\"printErr\"];\r\n      Module[\"preRun\"] = [];\r\n      Module[\"postRun\"] = [];\r\n      for (var key in moduleOverrides) {\r\n          if (moduleOverrides.hasOwnProperty(key)) {\r\n              Module[key] = moduleOverrides[key];\r\n          }\r\n      }\r\n      var Runtime = {\r\n          setTempRet0: (function (value) {\r\n              tempRet0 = value;\r\n          }), getTempRet0: (function () {\r\n              return tempRet0\r\n          }), stackSave: (function () {\r\n              return STACKTOP\r\n          }), stackRestore: (function (stackTop) {\r\n              STACKTOP = stackTop;\r\n          }), getNativeTypeSize: (function (type) {\r\n              switch (type) {\r\n                  case\"i1\":\r\n                  case\"i8\":\r\n                      return 1;\r\n                  case\"i16\":\r\n                      return 2;\r\n                  case\"i32\":\r\n                      return 4;\r\n                  case\"i64\":\r\n                      return 8;\r\n                  case\"float\":\r\n                      return 4;\r\n                  case\"double\":\r\n                      return 8;\r\n                  default: {\r\n                      if (type[type.length - 1] === \"*\") {\r\n                          return Runtime.QUANTUM_SIZE\r\n                      } else if (type[0] === \"i\") {\r\n                          var bits = parseInt(type.substr(1));\r\n                          assert(bits % 8 === 0);\r\n                          return bits / 8\r\n                      } else {\r\n                          return 0\r\n                      }\r\n                  }\r\n              }\r\n          }), getNativeFieldSize: (function (type) {\r\n              return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE)\r\n          }), STACK_ALIGN: 16, prepVararg: (function (ptr, type) {\r\n              if (type === \"double\" || type === \"i64\") {\r\n                  if (ptr & 7) {\r\n                      assert((ptr & 7) === 4);\r\n                      ptr += 4;\r\n                  }\r\n              } else {\r\n                  assert((ptr & 3) === 0);\r\n              }\r\n              return ptr\r\n          }), getAlignSize: (function (type, size, vararg) {\r\n              if (!vararg && (type == \"i64\" || type == \"double\")) return 8;\r\n              if (!type) return Math.min(size, 8);\r\n              return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE)\r\n          }), dynCall: (function (sig, ptr, args) {\r\n              if (args && args.length) {\r\n                  if (!args.splice) args = Array.prototype.slice.call(args);\r\n                  args.splice(0, 0, ptr);\r\n                  return Module[\"dynCall_\" + sig].apply(null, args)\r\n              } else {\r\n                  return Module[\"dynCall_\" + sig].call(null, ptr)\r\n              }\r\n          }), functionPointers: [], addFunction: (function (func) {\r\n              for (var i = 0; i < Runtime.functionPointers.length; i++) {\r\n                  if (!Runtime.functionPointers[i]) {\r\n                      Runtime.functionPointers[i] = func;\r\n                      return 2 * (1 + i)\r\n                  }\r\n              }\r\n              throw \"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"\r\n          }), removeFunction: (function (index) {\r\n              Runtime.functionPointers[(index - 2) / 2] = null;\r\n          }), warnOnce: (function (text) {\r\n              if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};\r\n              if (!Runtime.warnOnce.shown[text]) {\r\n                  Runtime.warnOnce.shown[text] = 1;\r\n                  Module.printErr(text);\r\n              }\r\n          }), funcWrappers: {}, getFuncWrapper: (function (func, sig) {\r\n              assert(sig);\r\n              if (!Runtime.funcWrappers[sig]) {\r\n                  Runtime.funcWrappers[sig] = {};\r\n              }\r\n              var sigCache = Runtime.funcWrappers[sig];\r\n              if (!sigCache[func]) {\r\n                  sigCache[func] = function dynCall_wrapper() {\r\n                      return Runtime.dynCall(sig, func, arguments)\r\n                  };\r\n              }\r\n              return sigCache[func]\r\n          }), getCompilerSetting: (function (name) {\r\n              throw \"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"\r\n          }), stackAlloc: (function (size) {\r\n              var ret = STACKTOP;\r\n              STACKTOP = STACKTOP + size | 0;\r\n              STACKTOP = STACKTOP + 15 & -16;\r\n              return ret\r\n          }), staticAlloc: (function (size) {\r\n              var ret = STATICTOP;\r\n              STATICTOP = STATICTOP + size | 0;\r\n              STATICTOP = STATICTOP + 15 & -16;\r\n              return ret\r\n          }), dynamicAlloc: (function (size) {\r\n              var ret = DYNAMICTOP;\r\n              DYNAMICTOP = DYNAMICTOP + size | 0;\r\n              DYNAMICTOP = DYNAMICTOP + 15 & -16;\r\n              if (DYNAMICTOP >= TOTAL_MEMORY) {\r\n                  var success = enlargeMemory();\r\n                  if (!success) {\r\n                      DYNAMICTOP = ret;\r\n                      return 0\r\n                  }\r\n              }\r\n              return ret\r\n          }), alignMemory: (function (size, quantum) {\r\n              var ret = size = Math.ceil(size / (quantum ? quantum : 16)) * (quantum ? quantum : 16);\r\n              return ret\r\n          }), makeBigInt: (function (low, high, unsigned) {\r\n              var ret = unsigned ? +(low >>> 0) + +(high >>> 0) * +4294967296 : +(low >>> 0) + +(high | 0) * +4294967296;\r\n              return ret\r\n          }), GLOBAL_BASE: 8, QUANTUM_SIZE: 4, __dummy__: 0\r\n      };\r\n      Module[\"Runtime\"] = Runtime;\r\n      var ABORT = false;\r\n      var tempDouble;\r\n      var tempI64;\r\n      var tempRet0;\r\n\r\n      function assert(condition, text) {\r\n          if (!condition) {\r\n              abort(\"Assertion failed: \" + text);\r\n          }\r\n      }\r\n\r\n      function getCFunc(ident) {\r\n          var func = Module[\"_\" + ident];\r\n          if (!func) {\r\n              try {\r\n                  func = [eval][0](\"_\" + ident);\r\n              } catch (e) {\r\n              }\r\n          }\r\n          assert(func, \"Cannot call unknown function \" + ident + \" (perhaps LLVM optimizations or closure removed it?)\");\r\n          return func\r\n      }\r\n\r\n      var cwrap, ccall;\r\n      ((function () {\r\n          var JSfuncs = {\r\n              \"stackSave\": (function () {\r\n                  Runtime.stackSave();\r\n              }), \"stackRestore\": (function () {\r\n                  Runtime.stackRestore();\r\n              }), \"arrayToC\": (function (arr) {\r\n                  var ret = Runtime.stackAlloc(arr.length);\r\n                  writeArrayToMemory(arr, ret);\r\n                  return ret\r\n              }), \"stringToC\": (function (str) {\r\n                  var ret = 0;\r\n                  if (str !== null && str !== undefined && str !== 0) {\r\n                      ret = Runtime.stackAlloc((str.length << 2) + 1);\r\n                      writeStringToMemory(str, ret);\r\n                  }\r\n                  return ret\r\n              })\r\n          };\r\n          var toC = {\"string\": JSfuncs[\"stringToC\"], \"array\": JSfuncs[\"arrayToC\"]};\r\n          ccall = function ccallFunc(ident, returnType, argTypes, args, opts) {\r\n              var func = getCFunc(ident);\r\n              var cArgs = [];\r\n              var stack = 0;\r\n              if (args) {\r\n                  for (var i = 0; i < args.length; i++) {\r\n                      var converter = toC[argTypes[i]];\r\n                      if (converter) {\r\n                          if (stack === 0) stack = Runtime.stackSave();\r\n                          cArgs[i] = converter(args[i]);\r\n                      } else {\r\n                          cArgs[i] = args[i];\r\n                      }\r\n                  }\r\n              }\r\n              var ret = func.apply(null, cArgs);\r\n              if (returnType === \"string\") ret = Pointer_stringify(ret);\r\n              if (stack !== 0) {\r\n                  if (opts && opts.async) {\r\n                      EmterpreterAsync.asyncFinalizers.push((function () {\r\n                          Runtime.stackRestore(stack);\r\n                      }));\r\n                      return\r\n                  }\r\n                  Runtime.stackRestore(stack);\r\n              }\r\n              return ret\r\n          };\r\n          var sourceRegex = /^function\\s\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;\r\n\r\n          function parseJSFunc(jsfunc) {\r\n              // Match the body and the return value of a javascript function source\r\n              var parsed = jsfunc.toString().match(sourceRegex);\r\n              if (!parsed) { return {}; }\r\n              parsed = parsed.slice(1);\r\n              return {arguments: parsed[0], body: parsed[1], returnValue: parsed[2]}\r\n          }\r\n\r\n          var JSsource = {};\r\n          for (var fun in JSfuncs) {\r\n              if (JSfuncs.hasOwnProperty(fun)) {\r\n                  JSsource[fun] = parseJSFunc(JSfuncs[fun]);\r\n              }\r\n          }\r\n          cwrap = function cwrap(ident, returnType, argTypes) {\r\n              argTypes = argTypes || [];\r\n              var cfunc = getCFunc(ident);\r\n              var numericArgs = argTypes.every((function (type) {\r\n                  return type === \"number\"\r\n              }));\r\n              var numericRet = returnType !== \"string\";\r\n              if (numericRet && numericArgs) {\r\n                  return cfunc\r\n              }\r\n              var argNames = argTypes.map((function (x, i) {\r\n                  return \"$\" + i\r\n              }));\r\n              var funcstr = \"(function(\" + argNames.join(\",\") + \") {\";\r\n              var nargs = argTypes.length;\r\n              if (!numericArgs) {\r\n                  funcstr += \"var stack = \" + JSsource[\"stackSave\"].body + \";\";\r\n                  for (var i = 0; i < nargs; i++) {\r\n                      var arg = argNames[i], type = argTypes[i];\r\n                      if (type === \"number\") continue;\r\n                      var convertCode = JSsource[type + \"ToC\"];\r\n                      funcstr += \"var \" + convertCode.arguments + \" = \" + arg + \";\";\r\n                      funcstr += convertCode.body + \";\";\r\n                      funcstr += arg + \"=\" + convertCode.returnValue + \";\";\r\n                  }\r\n              }\r\n              var cfuncname = parseJSFunc((function () {\r\n                  return cfunc\r\n              })).returnValue;\r\n              funcstr += \"var ret = \" + cfuncname + \"(\" + argNames.join(\",\") + \");\";\r\n              if (!numericRet) {\r\n                  var strgfy = parseJSFunc((function () {\r\n                      return Pointer_stringify\r\n                  })).returnValue;\r\n                  funcstr += \"ret = \" + strgfy + \"(ret);\";\r\n              }\r\n              if (!numericArgs) {\r\n                  funcstr += JSsource[\"stackRestore\"].body.replace(\"()\", \"(stack)\") + \";\";\r\n              }\r\n              funcstr += \"return ret})\";\r\n              return [eval][0](funcstr)\r\n          };\r\n      }))();\r\n      Module[\"ccall\"] = ccall;\r\n      Module[\"cwrap\"] = cwrap;\r\n\r\n      function setValue(ptr, value, type, noSafe) {\r\n          type = type || \"i8\";\r\n          if (type.charAt(type.length - 1) === \"*\") type = \"i32\";\r\n          switch (type) {\r\n              case\"i1\":\r\n                  HEAP8[ptr >> 0] = value;\r\n                  break;\r\n              case\"i8\":\r\n                  HEAP8[ptr >> 0] = value;\r\n                  break;\r\n              case\"i16\":\r\n                  HEAP16[ptr >> 1] = value;\r\n                  break;\r\n              case\"i32\":\r\n                  HEAP32[ptr >> 2] = value;\r\n                  break;\r\n              case\"i64\":\r\n                  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];\r\n                  break;\r\n              case\"float\":\r\n                  HEAPF32[ptr >> 2] = value;\r\n                  break;\r\n              case\"double\":\r\n                  HEAPF64[ptr >> 3] = value;\r\n                  break;\r\n              default:\r\n                  abort(\"invalid type for setValue: \" + type);\r\n          }\r\n      }\r\n\r\n      Module[\"setValue\"] = setValue;\r\n\r\n      function getValue(ptr, type, noSafe) {\r\n          type = type || \"i8\";\r\n          if (type.charAt(type.length - 1) === \"*\") type = \"i32\";\r\n          switch (type) {\r\n              case\"i1\":\r\n                  return HEAP8[ptr >> 0];\r\n              case\"i8\":\r\n                  return HEAP8[ptr >> 0];\r\n              case\"i16\":\r\n                  return HEAP16[ptr >> 1];\r\n              case\"i32\":\r\n                  return HEAP32[ptr >> 2];\r\n              case\"i64\":\r\n                  return HEAP32[ptr >> 2];\r\n              case\"float\":\r\n                  return HEAPF32[ptr >> 2];\r\n              case\"double\":\r\n                  return HEAPF64[ptr >> 3];\r\n              default:\r\n                  abort(\"invalid type for setValue: \" + type);\r\n          }\r\n          return null\r\n      }\r\n\r\n      Module[\"getValue\"] = getValue;\r\n      var ALLOC_NORMAL = 0;\r\n      var ALLOC_STACK = 1;\r\n      var ALLOC_STATIC = 2;\r\n      var ALLOC_DYNAMIC = 3;\r\n      var ALLOC_NONE = 4;\r\n      Module[\"ALLOC_NORMAL\"] = ALLOC_NORMAL;\r\n      Module[\"ALLOC_STACK\"] = ALLOC_STACK;\r\n      Module[\"ALLOC_STATIC\"] = ALLOC_STATIC;\r\n      Module[\"ALLOC_DYNAMIC\"] = ALLOC_DYNAMIC;\r\n      Module[\"ALLOC_NONE\"] = ALLOC_NONE;\r\n\r\n      function allocate(slab, types, allocator, ptr) {\r\n          var zeroinit, size;\r\n          if (typeof slab === \"number\") {\r\n              zeroinit = true;\r\n              size = slab;\r\n          } else {\r\n              zeroinit = false;\r\n              size = slab.length;\r\n          }\r\n          var singleType = typeof types === \"string\" ? types : null;\r\n          var ret;\r\n          if (allocator == ALLOC_NONE) {\r\n              ret = ptr;\r\n          } else {\r\n              ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));\r\n          }\r\n          if (zeroinit) {\r\n              var ptr = ret, stop;\r\n              assert((ret & 3) == 0);\r\n              stop = ret + (size & ~3);\r\n              for (; ptr < stop; ptr += 4) {\r\n                  HEAP32[ptr >> 2] = 0;\r\n              }\r\n              stop = ret + size;\r\n              while (ptr < stop) {\r\n                  HEAP8[ptr++ >> 0] = 0;\r\n              }\r\n              return ret\r\n          }\r\n          if (singleType === \"i8\") {\r\n              if (slab.subarray || slab.slice) {\r\n                  HEAPU8.set(slab, ret);\r\n              } else {\r\n                  HEAPU8.set(new Uint8Array(slab), ret);\r\n              }\r\n              return ret\r\n          }\r\n          var i = 0, type, typeSize, previousType;\r\n          while (i < size) {\r\n              var curr = slab[i];\r\n              if (typeof curr === \"function\") {\r\n                  curr = Runtime.getFunctionIndex(curr);\r\n              }\r\n              type = singleType || types[i];\r\n              if (type === 0) {\r\n                  i++;\r\n                  continue\r\n              }\r\n              if (type == \"i64\") type = \"i32\";\r\n              setValue(ret + i, curr, type);\r\n              if (previousType !== type) {\r\n                  typeSize = Runtime.getNativeTypeSize(type);\r\n                  previousType = type;\r\n              }\r\n              i += typeSize;\r\n          }\r\n          return ret\r\n      }\r\n\r\n      Module[\"allocate\"] = allocate;\r\n\r\n      function getMemory(size) {\r\n          if (!staticSealed) return Runtime.staticAlloc(size);\r\n          if (typeof _sbrk !== \"undefined\" && !_sbrk.called || !runtimeInitialized) return Runtime.dynamicAlloc(size);\r\n          return _malloc(size)\r\n      }\r\n\r\n      Module[\"getMemory\"] = getMemory;\r\n\r\n      function Pointer_stringify(ptr, length) {\r\n          if (length === 0 || !ptr) return \"\";\r\n          var hasUtf = 0;\r\n          var t;\r\n          var i = 0;\r\n          while (1) {\r\n              t = HEAPU8[ptr + i >> 0];\r\n              hasUtf |= t;\r\n              if (t == 0 && !length) break;\r\n              i++;\r\n              if (length && i == length) break\r\n          }\r\n          if (!length) length = i;\r\n          var ret = \"\";\r\n          if (hasUtf < 128) {\r\n              var MAX_CHUNK = 1024;\r\n              var curr;\r\n              while (length > 0) {\r\n                  curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));\r\n                  ret = ret ? ret + curr : curr;\r\n                  ptr += MAX_CHUNK;\r\n                  length -= MAX_CHUNK;\r\n              }\r\n              return ret\r\n          }\r\n          return Module[\"UTF8ToString\"](ptr)\r\n      }\r\n\r\n      Module[\"Pointer_stringify\"] = Pointer_stringify;\r\n\r\n      function AsciiToString(ptr) {\r\n          var str = \"\";\r\n          while (1) {\r\n              var ch = HEAP8[ptr++ >> 0];\r\n              if (!ch) return str;\r\n              str += String.fromCharCode(ch);\r\n          }\r\n      }\r\n\r\n      Module[\"AsciiToString\"] = AsciiToString;\r\n\r\n      function stringToAscii(str, outPtr) {\r\n          return writeAsciiToMemory(str, outPtr, false)\r\n      }\r\n\r\n      Module[\"stringToAscii\"] = stringToAscii;\r\n\r\n      function UTF8ArrayToString(u8Array, idx) {\r\n          var u0, u1, u2, u3, u4, u5;\r\n          var str = \"\";\r\n          while (1) {\r\n              u0 = u8Array[idx++];\r\n              if (!u0) return str;\r\n              if (!(u0 & 128)) {\r\n                  str += String.fromCharCode(u0);\r\n                  continue\r\n              }\r\n              u1 = u8Array[idx++] & 63;\r\n              if ((u0 & 224) == 192) {\r\n                  str += String.fromCharCode((u0 & 31) << 6 | u1);\r\n                  continue\r\n              }\r\n              u2 = u8Array[idx++] & 63;\r\n              if ((u0 & 240) == 224) {\r\n                  u0 = (u0 & 15) << 12 | u1 << 6 | u2;\r\n              } else {\r\n                  u3 = u8Array[idx++] & 63;\r\n                  if ((u0 & 248) == 240) {\r\n                      u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | u3;\r\n                  } else {\r\n                      u4 = u8Array[idx++] & 63;\r\n                      if ((u0 & 252) == 248) {\r\n                          u0 = (u0 & 3) << 24 | u1 << 18 | u2 << 12 | u3 << 6 | u4;\r\n                      } else {\r\n                          u5 = u8Array[idx++] & 63;\r\n                          u0 = (u0 & 1) << 30 | u1 << 24 | u2 << 18 | u3 << 12 | u4 << 6 | u5;\r\n                      }\r\n                  }\r\n              }\r\n              if (u0 < 65536) {\r\n                  str += String.fromCharCode(u0);\r\n              } else {\r\n                  var ch = u0 - 65536;\r\n                  str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);\r\n              }\r\n          }\r\n      }\r\n\r\n      Module[\"UTF8ArrayToString\"] = UTF8ArrayToString;\r\n\r\n      function UTF8ToString(ptr) {\r\n          return UTF8ArrayToString(HEAPU8, ptr)\r\n      }\r\n\r\n      Module[\"UTF8ToString\"] = UTF8ToString;\r\n\r\n      function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {\r\n          if (!(maxBytesToWrite > 0)) return 0;\r\n          var startIdx = outIdx;\r\n          var endIdx = outIdx + maxBytesToWrite - 1;\r\n          for (var i = 0; i < str.length; ++i) {\r\n              var u = str.charCodeAt(i);\r\n              if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;\r\n              if (u <= 127) {\r\n                  if (outIdx >= endIdx) break;\r\n                  outU8Array[outIdx++] = u;\r\n              } else if (u <= 2047) {\r\n                  if (outIdx + 1 >= endIdx) break;\r\n                  outU8Array[outIdx++] = 192 | u >> 6;\r\n                  outU8Array[outIdx++] = 128 | u & 63;\r\n              } else if (u <= 65535) {\r\n                  if (outIdx + 2 >= endIdx) break;\r\n                  outU8Array[outIdx++] = 224 | u >> 12;\r\n                  outU8Array[outIdx++] = 128 | u >> 6 & 63;\r\n                  outU8Array[outIdx++] = 128 | u & 63;\r\n              } else if (u <= 2097151) {\r\n                  if (outIdx + 3 >= endIdx) break;\r\n                  outU8Array[outIdx++] = 240 | u >> 18;\r\n                  outU8Array[outIdx++] = 128 | u >> 12 & 63;\r\n                  outU8Array[outIdx++] = 128 | u >> 6 & 63;\r\n                  outU8Array[outIdx++] = 128 | u & 63;\r\n              } else if (u <= 67108863) {\r\n                  if (outIdx + 4 >= endIdx) break;\r\n                  outU8Array[outIdx++] = 248 | u >> 24;\r\n                  outU8Array[outIdx++] = 128 | u >> 18 & 63;\r\n                  outU8Array[outIdx++] = 128 | u >> 12 & 63;\r\n                  outU8Array[outIdx++] = 128 | u >> 6 & 63;\r\n                  outU8Array[outIdx++] = 128 | u & 63;\r\n              } else {\r\n                  if (outIdx + 5 >= endIdx) break;\r\n                  outU8Array[outIdx++] = 252 | u >> 30;\r\n                  outU8Array[outIdx++] = 128 | u >> 24 & 63;\r\n                  outU8Array[outIdx++] = 128 | u >> 18 & 63;\r\n                  outU8Array[outIdx++] = 128 | u >> 12 & 63;\r\n                  outU8Array[outIdx++] = 128 | u >> 6 & 63;\r\n                  outU8Array[outIdx++] = 128 | u & 63;\r\n              }\r\n          }\r\n          outU8Array[outIdx] = 0;\r\n          return outIdx - startIdx\r\n      }\r\n\r\n      Module[\"stringToUTF8Array\"] = stringToUTF8Array;\r\n\r\n      function stringToUTF8(str, outPtr, maxBytesToWrite) {\r\n          return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite)\r\n      }\r\n\r\n      Module[\"stringToUTF8\"] = stringToUTF8;\r\n\r\n      function lengthBytesUTF8(str) {\r\n          var len = 0;\r\n          for (var i = 0; i < str.length; ++i) {\r\n              var u = str.charCodeAt(i);\r\n              if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;\r\n              if (u <= 127) {\r\n                  ++len;\r\n              } else if (u <= 2047) {\r\n                  len += 2;\r\n              } else if (u <= 65535) {\r\n                  len += 3;\r\n              } else if (u <= 2097151) {\r\n                  len += 4;\r\n              } else if (u <= 67108863) {\r\n                  len += 5;\r\n              } else {\r\n                  len += 6;\r\n              }\r\n          }\r\n          return len\r\n      }\r\n\r\n      Module[\"lengthBytesUTF8\"] = lengthBytesUTF8;\r\n\r\n      function UTF16ToString(ptr) {\r\n          var i = 0;\r\n          var str = \"\";\r\n          while (1) {\r\n              var codeUnit = HEAP16[ptr + i * 2 >> 1];\r\n              if (codeUnit == 0) return str;\r\n              ++i;\r\n              str += String.fromCharCode(codeUnit);\r\n          }\r\n      }\r\n\r\n      Module[\"UTF16ToString\"] = UTF16ToString;\r\n\r\n      function stringToUTF16(str, outPtr, maxBytesToWrite) {\r\n          if (maxBytesToWrite === undefined) {\r\n              maxBytesToWrite = 2147483647;\r\n          }\r\n          if (maxBytesToWrite < 2) return 0;\r\n          maxBytesToWrite -= 2;\r\n          var startPtr = outPtr;\r\n          var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length;\r\n          for (var i = 0; i < numCharsToWrite; ++i) {\r\n              var codeUnit = str.charCodeAt(i);\r\n              HEAP16[outPtr >> 1] = codeUnit;\r\n              outPtr += 2;\r\n          }\r\n          HEAP16[outPtr >> 1] = 0;\r\n          return outPtr - startPtr\r\n      }\r\n\r\n      Module[\"stringToUTF16\"] = stringToUTF16;\r\n\r\n      function lengthBytesUTF16(str) {\r\n          return str.length * 2\r\n      }\r\n\r\n      Module[\"lengthBytesUTF16\"] = lengthBytesUTF16;\r\n\r\n      function UTF32ToString(ptr) {\r\n          var i = 0;\r\n          var str = \"\";\r\n          while (1) {\r\n              var utf32 = HEAP32[ptr + i * 4 >> 2];\r\n              if (utf32 == 0) return str;\r\n              ++i;\r\n              if (utf32 >= 65536) {\r\n                  var ch = utf32 - 65536;\r\n                  str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);\r\n              } else {\r\n                  str += String.fromCharCode(utf32);\r\n              }\r\n          }\r\n      }\r\n\r\n      Module[\"UTF32ToString\"] = UTF32ToString;\r\n\r\n      function stringToUTF32(str, outPtr, maxBytesToWrite) {\r\n          if (maxBytesToWrite === undefined) {\r\n              maxBytesToWrite = 2147483647;\r\n          }\r\n          if (maxBytesToWrite < 4) return 0;\r\n          var startPtr = outPtr;\r\n          var endPtr = startPtr + maxBytesToWrite - 4;\r\n          for (var i = 0; i < str.length; ++i) {\r\n              var codeUnit = str.charCodeAt(i);\r\n              if (codeUnit >= 55296 && codeUnit <= 57343) {\r\n                  var trailSurrogate = str.charCodeAt(++i);\r\n                  codeUnit = 65536 + ((codeUnit & 1023) << 10) | trailSurrogate & 1023;\r\n              }\r\n              HEAP32[outPtr >> 2] = codeUnit;\r\n              outPtr += 4;\r\n              if (outPtr + 4 > endPtr) break\r\n          }\r\n          HEAP32[outPtr >> 2] = 0;\r\n          return outPtr - startPtr\r\n      }\r\n\r\n      Module[\"stringToUTF32\"] = stringToUTF32;\r\n\r\n      function lengthBytesUTF32(str) {\r\n          var len = 0;\r\n          for (var i = 0; i < str.length; ++i) {\r\n              var codeUnit = str.charCodeAt(i);\r\n              if (codeUnit >= 55296 && codeUnit <= 57343) ++i;\r\n              len += 4;\r\n          }\r\n          return len\r\n      }\r\n\r\n      Module[\"lengthBytesUTF32\"] = lengthBytesUTF32;\r\n\r\n      function demangle(func) {\r\n          var hasLibcxxabi = !!Module[\"___cxa_demangle\"];\r\n          if (hasLibcxxabi) {\r\n              try {\r\n                  var buf = _malloc(func.length);\r\n                  writeStringToMemory(func.substr(1), buf);\r\n                  var status = _malloc(4);\r\n                  var ret = Module[\"___cxa_demangle\"](buf, 0, 0, status);\r\n                  if (getValue(status, \"i32\") === 0 && ret) {\r\n                      return Pointer_stringify(ret)\r\n                  }\r\n              } catch (e) {\r\n              } finally {\r\n                  if (buf) _free(buf);\r\n                  if (status) _free(status);\r\n                  if (ret) _free(ret);\r\n              }\r\n          }\r\n          var i = 3;\r\n          var basicTypes = {\r\n              \"v\": \"void\",\r\n              \"b\": \"bool\",\r\n              \"c\": \"char\",\r\n              \"s\": \"short\",\r\n              \"i\": \"int\",\r\n              \"l\": \"long\",\r\n              \"f\": \"float\",\r\n              \"d\": \"double\",\r\n              \"w\": \"wchar_t\",\r\n              \"a\": \"signed char\",\r\n              \"h\": \"unsigned char\",\r\n              \"t\": \"unsigned short\",\r\n              \"j\": \"unsigned int\",\r\n              \"m\": \"unsigned long\",\r\n              \"x\": \"long long\",\r\n              \"y\": \"unsigned long long\",\r\n              \"z\": \"...\"\r\n          };\r\n          var subs = [];\r\n          var first = true;\r\n\r\n          function parseNested() {\r\n              i++;\r\n              if (func[i] === \"K\") i++;\r\n              var parts = [];\r\n              while (func[i] !== \"E\") {\r\n                  if (func[i] === \"S\") {\r\n                      i++;\r\n                      var next = func.indexOf(\"_\", i);\r\n                      var num = func.substring(i, next) || 0;\r\n                      parts.push(subs[num] || \"?\");\r\n                      i = next + 1;\r\n                      continue\r\n                  }\r\n                  if (func[i] === \"C\") {\r\n                      parts.push(parts[parts.length - 1]);\r\n                      i += 2;\r\n                      continue\r\n                  }\r\n                  var size = parseInt(func.substr(i));\r\n                  var pre = size.toString().length;\r\n                  if (!size || !pre) {\r\n                      i--;\r\n                      break\r\n                  }\r\n                  var curr = func.substr(i + pre, size);\r\n                  parts.push(curr);\r\n                  subs.push(curr);\r\n                  i += pre + size;\r\n              }\r\n              i++;\r\n              return parts\r\n          }\r\n\r\n          function parse(rawList, limit, allowVoid) {\r\n              limit = limit || Infinity;\r\n              var ret = \"\", list = [];\r\n\r\n              function flushList() {\r\n                  return \"(\" + list.join(\", \") + \")\"\r\n              }\r\n\r\n              var name;\r\n              if (func[i] === \"N\") {\r\n                  name = parseNested().join(\"::\");\r\n                  limit--;\r\n                  if (limit === 0) return rawList ? [name] : name\r\n              } else {\r\n                  if (func[i] === \"K\" || first && func[i] === \"L\") i++;\r\n                  var size = parseInt(func.substr(i));\r\n                  if (size) {\r\n                      var pre = size.toString().length;\r\n                      name = func.substr(i + pre, size);\r\n                      i += pre + size;\r\n                  }\r\n              }\r\n              first = false;\r\n              if (func[i] === \"I\") {\r\n                  i++;\r\n                  var iList = parse(true);\r\n                  var iRet = parse(true, 1, true);\r\n                  ret += iRet[0] + \" \" + name + \"<\" + iList.join(\", \") + \">\";\r\n              } else {\r\n                  ret = name;\r\n              }\r\n              paramLoop:while (i < func.length && limit-- > 0) {\r\n                  var c = func[i++];\r\n                  if (c in basicTypes) {\r\n                      list.push(basicTypes[c]);\r\n                  } else {\r\n                      switch (c) {\r\n                          case\"P\":\r\n                              list.push(parse(true, 1, true)[0] + \"*\");\r\n                              break;\r\n                          case\"R\":\r\n                              list.push(parse(true, 1, true)[0] + \"&\");\r\n                              break;\r\n                          case\"L\": {\r\n                              i++;\r\n                              var end = func.indexOf(\"E\", i);\r\n                              var size = end - i;\r\n                              list.push(func.substr(i, size));\r\n                              i += size + 2;\r\n                              break\r\n                          }\r\n                          case\"A\": {\r\n                              var size = parseInt(func.substr(i));\r\n                              i += size.toString().length;\r\n                              if (func[i] !== \"_\") throw \"?\";\r\n                              i++;\r\n                              list.push(parse(true, 1, true)[0] + \" [\" + size + \"]\");\r\n                              break\r\n                          }\r\n                          case\"E\":\r\n                              break paramLoop;\r\n                          default:\r\n                              ret += \"?\" + c;\r\n                              break paramLoop\r\n                      }\r\n                  }\r\n              }\r\n              if (!allowVoid && list.length === 1 && list[0] === \"void\") list = [];\r\n              if (rawList) {\r\n                  if (ret) {\r\n                      list.push(ret + \"?\");\r\n                  }\r\n                  return list\r\n              } else {\r\n                  return ret + flushList()\r\n              }\r\n          }\r\n\r\n          var parsed = func;\r\n          try {\r\n              if (func == \"Object._main\" || func == \"_main\") {\r\n                  return \"main()\"\r\n              }\r\n              if (typeof func === \"number\") func = Pointer_stringify(func);\r\n              if (func[0] !== \"_\") return func;\r\n              if (func[1] !== \"_\") return func;\r\n              if (func[2] !== \"Z\") return func;\r\n              switch (func[3]) {\r\n                  case\"n\":\r\n                      return \"operator new()\";\r\n                  case\"d\":\r\n                      return \"operator delete()\"\r\n              }\r\n              parsed = parse();\r\n          } catch (e) {\r\n              parsed += \"?\";\r\n          }\r\n          if (parsed.indexOf(\"?\") >= 0 && !hasLibcxxabi) {\r\n              Runtime.warnOnce(\"warning: a problem occurred in builtin C++ name demangling; build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\");\r\n          }\r\n          return parsed\r\n      }\r\n\r\n      function demangleAll(text) {\r\n          return text.replace(/__Z[\\w\\d_]+/g, (function (x) {\r\n              var y = demangle(x);\r\n              return x === y ? x : x + \" [\" + y + \"]\"\r\n          }))\r\n      }\r\n\r\n      function jsStackTrace() {\r\n          var err = new Error;\r\n          if (!err.stack) {\r\n              try {\r\n                  throw new Error(0)\r\n              } catch (e) {\r\n                  err = e;\r\n              }\r\n              if (!err.stack) {\r\n                  return \"(no stack trace available)\"\r\n              }\r\n          }\r\n          return err.stack.toString()\r\n      }\r\n\r\n      function stackTrace() {\r\n          return demangleAll(jsStackTrace())\r\n      }\r\n\r\n      Module[\"stackTrace\"] = stackTrace;\r\n      var PAGE_SIZE = 4096;\r\n\r\n      function alignMemoryPage(x) {\r\n          if (x % 4096 > 0) {\r\n              x += 4096 - x % 4096;\r\n          }\r\n          return x\r\n      }\r\n\r\n      var HEAP;\r\n      var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\r\n      var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false;\r\n      var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0;\r\n      var DYNAMIC_BASE = 0, DYNAMICTOP = 0;\r\n\r\n      function enlargeMemory() {\r\n          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.\");\r\n      }\r\n\r\n      var TOTAL_STACK = Module[\"TOTAL_STACK\"] || 65536;\r\n      var TOTAL_MEMORY = Module[\"TOTAL_MEMORY\"] || 524288;\r\n      var totalMemory = 64 * 1024;\r\n      while (totalMemory < TOTAL_MEMORY || totalMemory < 2 * TOTAL_STACK) {\r\n          if (totalMemory < 16 * 1024 * 1024) {\r\n              totalMemory *= 2;\r\n          } else {\r\n              totalMemory += 16 * 1024 * 1024;\r\n          }\r\n      }\r\n      if (totalMemory !== TOTAL_MEMORY) {\r\n          Module.printErr(\"increasing TOTAL_MEMORY to \" + totalMemory + \" to be compliant with the asm.js spec (and given that TOTAL_STACK=\" + TOTAL_STACK + \")\");\r\n          TOTAL_MEMORY = totalMemory;\r\n      }\r\n      assert(typeof Int32Array !== \"undefined\" && typeof Float64Array !== \"undefined\" && !!(new Int32Array(1))[\"subarray\"] && !!(new Int32Array(1))[\"set\"], \"JS engine does not provide full typed array support\");\r\n      var buffer;\r\n      buffer = new ArrayBuffer(TOTAL_MEMORY);\r\n      HEAP8 = new Int8Array(buffer);\r\n      HEAP16 = new Int16Array(buffer);\r\n      HEAP32 = new Int32Array(buffer);\r\n      HEAPU8 = new Uint8Array(buffer);\r\n      HEAPU16 = new Uint16Array(buffer);\r\n      HEAPU32 = new Uint32Array(buffer);\r\n      HEAPF32 = new Float32Array(buffer);\r\n      HEAPF64 = new Float64Array(buffer);\r\n      HEAP32[0] = 255;\r\n      assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, \"Typed arrays 2 must be run on a little-endian system\");\r\n      Module[\"HEAP\"] = HEAP;\r\n      Module[\"buffer\"] = buffer;\r\n      Module[\"HEAP8\"] = HEAP8;\r\n      Module[\"HEAP16\"] = HEAP16;\r\n      Module[\"HEAP32\"] = HEAP32;\r\n      Module[\"HEAPU8\"] = HEAPU8;\r\n      Module[\"HEAPU16\"] = HEAPU16;\r\n      Module[\"HEAPU32\"] = HEAPU32;\r\n      Module[\"HEAPF32\"] = HEAPF32;\r\n      Module[\"HEAPF64\"] = HEAPF64;\r\n\r\n      function callRuntimeCallbacks(callbacks) {\r\n          while (callbacks.length > 0) {\r\n              var callback = callbacks.shift();\r\n              if (typeof callback == \"function\") {\r\n                  callback();\r\n                  continue\r\n              }\r\n              var func = callback.func;\r\n              if (typeof func === \"number\") {\r\n                  if (callback.arg === undefined) {\r\n                      Runtime.dynCall(\"v\", func);\r\n                  } else {\r\n                      Runtime.dynCall(\"vi\", func, [callback.arg]);\r\n                  }\r\n              } else {\r\n                  func(callback.arg === undefined ? null : callback.arg);\r\n              }\r\n          }\r\n      }\r\n\r\n      var __ATPRERUN__ = [];\r\n      var __ATINIT__ = [];\r\n      var __ATMAIN__ = [];\r\n      var __ATEXIT__ = [];\r\n      var __ATPOSTRUN__ = [];\r\n      var runtimeInitialized = false;\r\n\r\n      function preRun() {\r\n          if (Module[\"preRun\"]) {\r\n              if (typeof Module[\"preRun\"] == \"function\") Module[\"preRun\"] = [Module[\"preRun\"]];\r\n              while (Module[\"preRun\"].length) {\r\n                  addOnPreRun(Module[\"preRun\"].shift());\r\n              }\r\n          }\r\n          callRuntimeCallbacks(__ATPRERUN__);\r\n      }\r\n\r\n      function ensureInitRuntime() {\r\n          if (runtimeInitialized) return;\r\n          runtimeInitialized = true;\r\n          callRuntimeCallbacks(__ATINIT__);\r\n      }\r\n\r\n      function preMain() {\r\n          callRuntimeCallbacks(__ATMAIN__);\r\n      }\r\n\r\n      function exitRuntime() {\r\n          callRuntimeCallbacks(__ATEXIT__);\r\n      }\r\n\r\n      function postRun() {\r\n          if (Module[\"postRun\"]) {\r\n              if (typeof Module[\"postRun\"] == \"function\") Module[\"postRun\"] = [Module[\"postRun\"]];\r\n              while (Module[\"postRun\"].length) {\r\n                  addOnPostRun(Module[\"postRun\"].shift());\r\n              }\r\n          }\r\n          callRuntimeCallbacks(__ATPOSTRUN__);\r\n      }\r\n\r\n      function addOnPreRun(cb) {\r\n          __ATPRERUN__.unshift(cb);\r\n      }\r\n\r\n      Module[\"addOnPreRun\"] = addOnPreRun;\r\n\r\n      function addOnInit(cb) {\r\n          __ATINIT__.unshift(cb);\r\n      }\r\n\r\n      Module[\"addOnInit\"] = addOnInit;\r\n\r\n      function addOnPreMain(cb) {\r\n          __ATMAIN__.unshift(cb);\r\n      }\r\n\r\n      Module[\"addOnPreMain\"] = addOnPreMain;\r\n\r\n      function addOnExit(cb) {\r\n          __ATEXIT__.unshift(cb);\r\n      }\r\n\r\n      Module[\"addOnExit\"] = addOnExit;\r\n\r\n      function addOnPostRun(cb) {\r\n          __ATPOSTRUN__.unshift(cb);\r\n      }\r\n\r\n      Module[\"addOnPostRun\"] = addOnPostRun;\r\n\r\n      function intArrayFromString(stringy, dontAddNull, length) {\r\n          var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;\r\n          var u8array = new Array(len);\r\n          var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);\r\n          if (dontAddNull) u8array.length = numBytesWritten;\r\n          return u8array\r\n      }\r\n\r\n      Module[\"intArrayFromString\"] = intArrayFromString;\r\n\r\n      function intArrayToString(array) {\r\n          var ret = [];\r\n          for (var i = 0; i < array.length; i++) {\r\n              var chr = array[i];\r\n              if (chr > 255) {\r\n                  chr &= 255;\r\n              }\r\n              ret.push(String.fromCharCode(chr));\r\n          }\r\n          return ret.join(\"\")\r\n      }\r\n\r\n      Module[\"intArrayToString\"] = intArrayToString;\r\n\r\n      function writeStringToMemory(string, buffer, dontAddNull) {\r\n          var array = intArrayFromString(string, dontAddNull);\r\n          var i = 0;\r\n          while (i < array.length) {\r\n              var chr = array[i];\r\n              HEAP8[buffer + i >> 0] = chr;\r\n              i = i + 1;\r\n          }\r\n      }\r\n\r\n      Module[\"writeStringToMemory\"] = writeStringToMemory;\r\n\r\n      function writeArrayToMemory(array, buffer) {\r\n          for (var i = 0; i < array.length; i++) {\r\n              HEAP8[buffer++ >> 0] = array[i];\r\n          }\r\n      }\r\n\r\n      Module[\"writeArrayToMemory\"] = writeArrayToMemory;\r\n\r\n      function writeAsciiToMemory(str, buffer, dontAddNull) {\r\n          for (var i = 0; i < str.length; ++i) {\r\n              HEAP8[buffer++ >> 0] = str.charCodeAt(i);\r\n          }\r\n          if (!dontAddNull) HEAP8[buffer >> 0] = 0;\r\n      }\r\n\r\n      Module[\"writeAsciiToMemory\"] = writeAsciiToMemory;\r\n\r\n      if (!Math[\"imul\"] || Math[\"imul\"](4294967295, 5) !== -5) Math[\"imul\"] = function imul(a, b) {\r\n          var ah = a >>> 16;\r\n          var al = a & 65535;\r\n          var bh = b >>> 16;\r\n          var bl = b & 65535;\r\n          return al * bl + (ah * bl + al * bh << 16) | 0\r\n      };\r\n      Math.imul = Math[\"imul\"];\r\n      if (!Math[\"clz32\"]) Math[\"clz32\"] = (function (x) {\r\n          x = x >>> 0;\r\n          for (var i = 0; i < 32; i++) {\r\n              if (x & 1 << 31 - i) return i\r\n          }\r\n          return 32\r\n      });\r\n      Math.clz32 = Math[\"clz32\"];\r\n      var Math_abs = Math.abs;\r\n      var Math_ceil = Math.ceil;\r\n      var Math_floor = Math.floor;\r\n      var Math_min = Math.min;\r\n      var runDependencies = 0;\r\n      var dependenciesFulfilled = null;\r\n\r\n      function addRunDependency(id) {\r\n          runDependencies++;\r\n          if (Module[\"monitorRunDependencies\"]) {\r\n              Module[\"monitorRunDependencies\"](runDependencies);\r\n          }\r\n      }\r\n\r\n      Module[\"addRunDependency\"] = addRunDependency;\r\n\r\n      function removeRunDependency(id) {\r\n          runDependencies--;\r\n          if (Module[\"monitorRunDependencies\"]) {\r\n              Module[\"monitorRunDependencies\"](runDependencies);\r\n          }\r\n          if (runDependencies == 0) {\r\n              if (dependenciesFulfilled) {\r\n                  var callback = dependenciesFulfilled;\r\n                  dependenciesFulfilled = null;\r\n                  callback();\r\n              }\r\n          }\r\n      }\r\n\r\n      Module[\"removeRunDependency\"] = removeRunDependency;\r\n      Module[\"preloadedImages\"] = {};\r\n      Module[\"preloadedAudios\"] = {};\r\n      STATIC_BASE = 8;\r\n      STATICTOP = STATIC_BASE + 31776;\r\n      __ATINIT__.push();\r\n      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);\r\n      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);\r\n      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);\r\n      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);\r\n      var tempDoublePtr = Runtime.alignMemory(allocate(12, \"i8\", ALLOC_STATIC), 8);\r\n      assert(tempDoublePtr % 8 == 0);\r\n\r\n      function _sbrk(bytes) {\r\n          var self = _sbrk;\r\n          if (!self.called) {\r\n              DYNAMICTOP = alignMemoryPage(DYNAMICTOP);\r\n              self.called = true;\r\n              assert(Runtime.dynamicAlloc);\r\n              self.alloc = Runtime.dynamicAlloc;\r\n              Runtime.dynamicAlloc = (function () {\r\n                  abort(\"cannot dynamically allocate, sbrk now has control\");\r\n              });\r\n          }\r\n          var ret = DYNAMICTOP;\r\n          if (bytes != 0) {\r\n              var success = self.alloc(bytes);\r\n              if (!success) return -1 >>> 0\r\n          }\r\n          return ret\r\n      }\r\n\r\n      function ___setErrNo(value) {\r\n          if (Module[\"___errno_location\"]) HEAP32[Module[\"___errno_location\"]() >> 2] = value;\r\n          return value\r\n      }\r\n\r\n      var ERRNO_CODES = {\r\n          EPERM: 1,\r\n          ENOENT: 2,\r\n          ESRCH: 3,\r\n          EINTR: 4,\r\n          EIO: 5,\r\n          ENXIO: 6,\r\n          E2BIG: 7,\r\n          ENOEXEC: 8,\r\n          EBADF: 9,\r\n          ECHILD: 10,\r\n          EAGAIN: 11,\r\n          EWOULDBLOCK: 11,\r\n          ENOMEM: 12,\r\n          EACCES: 13,\r\n          EFAULT: 14,\r\n          ENOTBLK: 15,\r\n          EBUSY: 16,\r\n          EEXIST: 17,\r\n          EXDEV: 18,\r\n          ENODEV: 19,\r\n          ENOTDIR: 20,\r\n          EISDIR: 21,\r\n          EINVAL: 22,\r\n          ENFILE: 23,\r\n          EMFILE: 24,\r\n          ENOTTY: 25,\r\n          ETXTBSY: 26,\r\n          EFBIG: 27,\r\n          ENOSPC: 28,\r\n          ESPIPE: 29,\r\n          EROFS: 30,\r\n          EMLINK: 31,\r\n          EPIPE: 32,\r\n          EDOM: 33,\r\n          ERANGE: 34,\r\n          ENOMSG: 42,\r\n          EIDRM: 43,\r\n          ECHRNG: 44,\r\n          EL2NSYNC: 45,\r\n          EL3HLT: 46,\r\n          EL3RST: 47,\r\n          ELNRNG: 48,\r\n          EUNATCH: 49,\r\n          ENOCSI: 50,\r\n          EL2HLT: 51,\r\n          EDEADLK: 35,\r\n          ENOLCK: 37,\r\n          EBADE: 52,\r\n          EBADR: 53,\r\n          EXFULL: 54,\r\n          ENOANO: 55,\r\n          EBADRQC: 56,\r\n          EBADSLT: 57,\r\n          EDEADLOCK: 35,\r\n          EBFONT: 59,\r\n          ENOSTR: 60,\r\n          ENODATA: 61,\r\n          ETIME: 62,\r\n          ENOSR: 63,\r\n          ENONET: 64,\r\n          ENOPKG: 65,\r\n          EREMOTE: 66,\r\n          ENOLINK: 67,\r\n          EADV: 68,\r\n          ESRMNT: 69,\r\n          ECOMM: 70,\r\n          EPROTO: 71,\r\n          EMULTIHOP: 72,\r\n          EDOTDOT: 73,\r\n          EBADMSG: 74,\r\n          ENOTUNIQ: 76,\r\n          EBADFD: 77,\r\n          EREMCHG: 78,\r\n          ELIBACC: 79,\r\n          ELIBBAD: 80,\r\n          ELIBSCN: 81,\r\n          ELIBMAX: 82,\r\n          ELIBEXEC: 83,\r\n          ENOSYS: 38,\r\n          ENOTEMPTY: 39,\r\n          ENAMETOOLONG: 36,\r\n          ELOOP: 40,\r\n          EOPNOTSUPP: 95,\r\n          EPFNOSUPPORT: 96,\r\n          ECONNRESET: 104,\r\n          ENOBUFS: 105,\r\n          EAFNOSUPPORT: 97,\r\n          EPROTOTYPE: 91,\r\n          ENOTSOCK: 88,\r\n          ENOPROTOOPT: 92,\r\n          ESHUTDOWN: 108,\r\n          ECONNREFUSED: 111,\r\n          EADDRINUSE: 98,\r\n          ECONNABORTED: 103,\r\n          ENETUNREACH: 101,\r\n          ENETDOWN: 100,\r\n          ETIMEDOUT: 110,\r\n          EHOSTDOWN: 112,\r\n          EHOSTUNREACH: 113,\r\n          EINPROGRESS: 115,\r\n          EALREADY: 114,\r\n          EDESTADDRREQ: 89,\r\n          EMSGSIZE: 90,\r\n          EPROTONOSUPPORT: 93,\r\n          ESOCKTNOSUPPORT: 94,\r\n          EADDRNOTAVAIL: 99,\r\n          ENETRESET: 102,\r\n          EISCONN: 106,\r\n          ENOTCONN: 107,\r\n          ETOOMANYREFS: 109,\r\n          EUSERS: 87,\r\n          EDQUOT: 122,\r\n          ESTALE: 116,\r\n          ENOTSUP: 95,\r\n          ENOMEDIUM: 123,\r\n          EILSEQ: 84,\r\n          EOVERFLOW: 75,\r\n          ECANCELED: 125,\r\n          ENOTRECOVERABLE: 131,\r\n          EOWNERDEAD: 130,\r\n          ESTRPIPE: 86\r\n      };\r\n\r\n      function _sysconf(name) {\r\n          switch (name) {\r\n              case 30:\r\n                  return PAGE_SIZE;\r\n              case 85:\r\n                  return totalMemory / PAGE_SIZE;\r\n              case 132:\r\n              case 133:\r\n              case 12:\r\n              case 137:\r\n              case 138:\r\n              case 15:\r\n              case 235:\r\n              case 16:\r\n              case 17:\r\n              case 18:\r\n              case 19:\r\n              case 20:\r\n              case 149:\r\n              case 13:\r\n              case 10:\r\n              case 236:\r\n              case 153:\r\n              case 9:\r\n              case 21:\r\n              case 22:\r\n              case 159:\r\n              case 154:\r\n              case 14:\r\n              case 77:\r\n              case 78:\r\n              case 139:\r\n              case 80:\r\n              case 81:\r\n              case 82:\r\n              case 68:\r\n              case 67:\r\n              case 164:\r\n              case 11:\r\n              case 29:\r\n              case 47:\r\n              case 48:\r\n              case 95:\r\n              case 52:\r\n              case 51:\r\n              case 46:\r\n                  return 200809;\r\n              case 79:\r\n                  return 0;\r\n              case 27:\r\n              case 246:\r\n              case 127:\r\n              case 128:\r\n              case 23:\r\n              case 24:\r\n              case 160:\r\n              case 161:\r\n              case 181:\r\n              case 182:\r\n              case 242:\r\n              case 183:\r\n              case 184:\r\n              case 243:\r\n              case 244:\r\n              case 245:\r\n              case 165:\r\n              case 178:\r\n              case 179:\r\n              case 49:\r\n              case 50:\r\n              case 168:\r\n              case 169:\r\n              case 175:\r\n              case 170:\r\n              case 171:\r\n              case 172:\r\n              case 97:\r\n              case 76:\r\n              case 32:\r\n              case 173:\r\n              case 35:\r\n                  return -1;\r\n              case 176:\r\n              case 177:\r\n              case 7:\r\n              case 155:\r\n              case 8:\r\n              case 157:\r\n              case 125:\r\n              case 126:\r\n              case 92:\r\n              case 93:\r\n              case 129:\r\n              case 130:\r\n              case 131:\r\n              case 94:\r\n              case 91:\r\n                  return 1;\r\n              case 74:\r\n              case 60:\r\n              case 69:\r\n              case 70:\r\n              case 4:\r\n                  return 1024;\r\n              case 31:\r\n              case 42:\r\n              case 72:\r\n                  return 32;\r\n              case 87:\r\n              case 26:\r\n              case 33:\r\n                  return 2147483647;\r\n              case 34:\r\n              case 1:\r\n                  return 47839;\r\n              case 38:\r\n              case 36:\r\n                  return 99;\r\n              case 43:\r\n              case 37:\r\n                  return 2048;\r\n              case 0:\r\n                  return 2097152;\r\n              case 3:\r\n                  return 65536;\r\n              case 28:\r\n                  return 32768;\r\n              case 44:\r\n                  return 32767;\r\n              case 75:\r\n                  return 16384;\r\n              case 39:\r\n                  return 1e3;\r\n              case 89:\r\n                  return 700;\r\n              case 71:\r\n                  return 256;\r\n              case 40:\r\n                  return 255;\r\n              case 2:\r\n                  return 100;\r\n              case 180:\r\n                  return 64;\r\n              case 25:\r\n                  return 20;\r\n              case 5:\r\n                  return 16;\r\n              case 6:\r\n                  return 6;\r\n              case 73:\r\n                  return 4;\r\n              case 84: {\r\n                  if (typeof navigator === \"object\") return navigator[\"hardwareConcurrency\"] || 1;\r\n                  return 1\r\n              }\r\n          }\r\n          ___setErrNo(ERRNO_CODES.EINVAL);\r\n          return -1\r\n      }\r\n\r\n      function _emscripten_memcpy_big(dest, src, num) {\r\n          HEAPU8.set(HEAPU8.subarray(src, src + num), dest);\r\n          return dest\r\n      }\r\n\r\n      Module[\"_memcpy\"] = _memcpy;\r\n      Module[\"_memmove\"] = _memmove;\r\n      Module[\"_memset\"] = _memset;\r\n\r\n      function _abort() {\r\n          Module[\"abort\"]();\r\n      }\r\n\r\n      var ERRNO_MESSAGES = {\r\n          0: \"Success\",\r\n          1: \"Not super-user\",\r\n          2: \"No such file or directory\",\r\n          3: \"No such process\",\r\n          4: \"Interrupted system call\",\r\n          5: \"I/O error\",\r\n          6: \"No such device or address\",\r\n          7: \"Arg list too long\",\r\n          8: \"Exec format error\",\r\n          9: \"Bad file number\",\r\n          10: \"No children\",\r\n          11: \"No more processes\",\r\n          12: \"Not enough core\",\r\n          13: \"Permission denied\",\r\n          14: \"Bad address\",\r\n          15: \"Block device required\",\r\n          16: \"Mount device busy\",\r\n          17: \"File exists\",\r\n          18: \"Cross-device link\",\r\n          19: \"No such device\",\r\n          20: \"Not a directory\",\r\n          21: \"Is a directory\",\r\n          22: \"Invalid argument\",\r\n          23: \"Too many open files in system\",\r\n          24: \"Too many open files\",\r\n          25: \"Not a typewriter\",\r\n          26: \"Text file busy\",\r\n          27: \"File too large\",\r\n          28: \"No space left on device\",\r\n          29: \"Illegal seek\",\r\n          30: \"Read only file system\",\r\n          31: \"Too many links\",\r\n          32: \"Broken pipe\",\r\n          33: \"Math arg out of domain of func\",\r\n          34: \"Math result not representable\",\r\n          35: \"File locking deadlock error\",\r\n          36: \"File or path name too long\",\r\n          37: \"No record locks available\",\r\n          38: \"Function not implemented\",\r\n          39: \"Directory not empty\",\r\n          40: \"Too many symbolic links\",\r\n          42: \"No message of desired type\",\r\n          43: \"Identifier removed\",\r\n          44: \"Channel number out of range\",\r\n          45: \"Level 2 not synchronized\",\r\n          46: \"Level 3 halted\",\r\n          47: \"Level 3 reset\",\r\n          48: \"Link number out of range\",\r\n          49: \"Protocol driver not attached\",\r\n          50: \"No CSI structure available\",\r\n          51: \"Level 2 halted\",\r\n          52: \"Invalid exchange\",\r\n          53: \"Invalid request descriptor\",\r\n          54: \"Exchange full\",\r\n          55: \"No anode\",\r\n          56: \"Invalid request code\",\r\n          57: \"Invalid slot\",\r\n          59: \"Bad font file fmt\",\r\n          60: \"Device not a stream\",\r\n          61: \"No data (for no delay io)\",\r\n          62: \"Timer expired\",\r\n          63: \"Out of streams resources\",\r\n          64: \"Machine is not on the network\",\r\n          65: \"Package not installed\",\r\n          66: \"The object is remote\",\r\n          67: \"The link has been severed\",\r\n          68: \"Advertise error\",\r\n          69: \"Srmount error\",\r\n          70: \"Communication error on send\",\r\n          71: \"Protocol error\",\r\n          72: \"Multihop attempted\",\r\n          73: \"Cross mount point (not really error)\",\r\n          74: \"Trying to read unreadable message\",\r\n          75: \"Value too large for defined data type\",\r\n          76: \"Given log. name not unique\",\r\n          77: \"f.d. invalid for this operation\",\r\n          78: \"Remote address changed\",\r\n          79: \"Can   access a needed shared lib\",\r\n          80: \"Accessing a corrupted shared lib\",\r\n          81: \".lib section in a.out corrupted\",\r\n          82: \"Attempting to link in too many libs\",\r\n          83: \"Attempting to exec a shared library\",\r\n          84: \"Illegal byte sequence\",\r\n          86: \"Streams pipe error\",\r\n          87: \"Too many users\",\r\n          88: \"Socket operation on non-socket\",\r\n          89: \"Destination address required\",\r\n          90: \"Message too long\",\r\n          91: \"Protocol wrong type for socket\",\r\n          92: \"Protocol not available\",\r\n          93: \"Unknown protocol\",\r\n          94: \"Socket type not supported\",\r\n          95: \"Not supported\",\r\n          96: \"Protocol family not supported\",\r\n          97: \"Address family not supported by protocol family\",\r\n          98: \"Address already in use\",\r\n          99: \"Address not available\",\r\n          100: \"Network interface is not configured\",\r\n          101: \"Network is unreachable\",\r\n          102: \"Connection reset by network\",\r\n          103: \"Connection aborted\",\r\n          104: \"Connection reset by peer\",\r\n          105: \"No buffer space available\",\r\n          106: \"Socket is already connected\",\r\n          107: \"Socket is not connected\",\r\n          108: \"Can't send after socket shutdown\",\r\n          109: \"Too many references\",\r\n          110: \"Connection timed out\",\r\n          111: \"Connection refused\",\r\n          112: \"Host is down\",\r\n          113: \"Host is unreachable\",\r\n          114: \"Socket already connected\",\r\n          115: \"Connection already in progress\",\r\n          116: \"Stale file handle\",\r\n          122: \"Quota exceeded\",\r\n          123: \"No medium (in tape drive)\",\r\n          125: \"Operation canceled\",\r\n          130: \"Previous owner died\",\r\n          131: \"State not recoverable\"\r\n      };\r\n      var TTY = {\r\n          ttys: [], init: (function () {\r\n          }), shutdown: (function () {\r\n          }), register: (function (dev, ops) {\r\n              TTY.ttys[dev] = {input: [], output: [], ops: ops};\r\n              FS.registerDevice(dev, TTY.stream_ops);\r\n          }), stream_ops: {\r\n              open: (function (stream) {\r\n                  var tty = TTY.ttys[stream.node.rdev];\r\n                  if (!tty) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.ENODEV)\r\n                  }\r\n                  stream.tty = tty;\r\n                  stream.seekable = false;\r\n              }), close: (function (stream) {\r\n                  stream.tty.ops.flush(stream.tty);\r\n              }), flush: (function (stream) {\r\n                  stream.tty.ops.flush(stream.tty);\r\n              }), read: (function (stream, buffer, offset, length, pos) {\r\n                  if (!stream.tty || !stream.tty.ops.get_char) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.ENXIO)\r\n                  }\r\n                  var bytesRead = 0;\r\n                  for (var i = 0; i < length; i++) {\r\n                      var result;\r\n                      try {\r\n                          result = stream.tty.ops.get_char(stream.tty);\r\n                      } catch (e) {\r\n                          throw new FS.ErrnoError(ERRNO_CODES.EIO)\r\n                      }\r\n                      if (result === undefined && bytesRead === 0) {\r\n                          throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)\r\n                      }\r\n                      if (result === null || result === undefined) break;\r\n                      bytesRead++;\r\n                      buffer[offset + i] = result;\r\n                  }\r\n                  if (bytesRead) {\r\n                      stream.node.timestamp = Date.now();\r\n                  }\r\n                  return bytesRead\r\n              }), write: (function (stream, buffer, offset, length, pos) {\r\n                  if (!stream.tty || !stream.tty.ops.put_char) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.ENXIO)\r\n                  }\r\n                  for (var i = 0; i < length; i++) {\r\n                      try {\r\n                          stream.tty.ops.put_char(stream.tty, buffer[offset + i]);\r\n                      } catch (e) {\r\n                          throw new FS.ErrnoError(ERRNO_CODES.EIO)\r\n                      }\r\n                  }\r\n                  if (length) {\r\n                      stream.node.timestamp = Date.now();\r\n                  }\r\n                  return i\r\n              })\r\n          }, default_tty_ops: {\r\n              get_char: (function (tty) {\r\n                  if (!tty.input.length) {\r\n                      var result = null;\r\n                      if (typeof window != \"undefined\" && typeof window.prompt == \"function\") {\r\n                          result = window.prompt(\"Input: \");\r\n                          if (result !== null) {\r\n                              result += \"\\n\";\r\n                          }\r\n                      } else if (typeof readline == \"function\") {\r\n                          result = readline();\r\n                          if (result !== null) {\r\n                              result += \"\\n\";\r\n                          }\r\n                      }\r\n                      if (!result) {\r\n                          return null\r\n                      }\r\n                      tty.input = intArrayFromString(result, true);\r\n                  }\r\n                  return tty.input.shift()\r\n              }), put_char: (function (tty, val) {\r\n                  if (val === null || val === 10) {\r\n                      Module[\"print\"](UTF8ArrayToString(tty.output, 0));\r\n                      tty.output = [];\r\n                  } else {\r\n                      if (val != 0) tty.output.push(val);\r\n                  }\r\n              }), flush: (function (tty) {\r\n                  if (tty.output && tty.output.length > 0) {\r\n                      Module[\"print\"](UTF8ArrayToString(tty.output, 0));\r\n                      tty.output = [];\r\n                  }\r\n              })\r\n          }, default_tty1_ops: {\r\n              put_char: (function (tty, val) {\r\n                  if (val === null || val === 10) {\r\n                      Module[\"printErr\"](UTF8ArrayToString(tty.output, 0));\r\n                      tty.output = [];\r\n                  } else {\r\n                      if (val != 0) tty.output.push(val);\r\n                  }\r\n              }), flush: (function (tty) {\r\n                  if (tty.output && tty.output.length > 0) {\r\n                      Module[\"printErr\"](UTF8ArrayToString(tty.output, 0));\r\n                      tty.output = [];\r\n                  }\r\n              })\r\n          }\r\n      };\r\n      var MEMFS = {\r\n          ops_table: null, mount: (function (mount) {\r\n              return MEMFS.createNode(null, \"/\", 16384 | 511, 0)\r\n          }), createNode: (function (parent, name, mode, dev) {\r\n              if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }\r\n              if (!MEMFS.ops_table) {\r\n                  MEMFS.ops_table = {\r\n                      dir: {\r\n                          node: {\r\n                              getattr: MEMFS.node_ops.getattr,\r\n                              setattr: MEMFS.node_ops.setattr,\r\n                              lookup: MEMFS.node_ops.lookup,\r\n                              mknod: MEMFS.node_ops.mknod,\r\n                              rename: MEMFS.node_ops.rename,\r\n                              unlink: MEMFS.node_ops.unlink,\r\n                              rmdir: MEMFS.node_ops.rmdir,\r\n                              readdir: MEMFS.node_ops.readdir,\r\n                              symlink: MEMFS.node_ops.symlink\r\n                          }, stream: {llseek: MEMFS.stream_ops.llseek}\r\n                      },\r\n                      file: {\r\n                          node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr},\r\n                          stream: {\r\n                              llseek: MEMFS.stream_ops.llseek,\r\n                              read: MEMFS.stream_ops.read,\r\n                              write: MEMFS.stream_ops.write,\r\n                              allocate: MEMFS.stream_ops.allocate,\r\n                              mmap: MEMFS.stream_ops.mmap,\r\n                              msync: MEMFS.stream_ops.msync\r\n                          }\r\n                      },\r\n                      link: {\r\n                          node: {\r\n                              getattr: MEMFS.node_ops.getattr,\r\n                              setattr: MEMFS.node_ops.setattr,\r\n                              readlink: MEMFS.node_ops.readlink\r\n                          }, stream: {}\r\n                      },\r\n                      chrdev: {\r\n                          node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr},\r\n                          stream: FS.chrdev_stream_ops\r\n                      }\r\n                  };\r\n              }\r\n              var node = FS.createNode(parent, name, mode, dev);\r\n              if (FS.isDir(node.mode)) {\r\n                  node.node_ops = MEMFS.ops_table.dir.node;\r\n                  node.stream_ops = MEMFS.ops_table.dir.stream;\r\n                  node.contents = {};\r\n              } else if (FS.isFile(node.mode)) {\r\n                  node.node_ops = MEMFS.ops_table.file.node;\r\n                  node.stream_ops = MEMFS.ops_table.file.stream;\r\n                  node.usedBytes = 0;\r\n                  node.contents = null;\r\n              } else if (FS.isLink(node.mode)) {\r\n                  node.node_ops = MEMFS.ops_table.link.node;\r\n                  node.stream_ops = MEMFS.ops_table.link.stream;\r\n              } else if (FS.isChrdev(node.mode)) {\r\n                  node.node_ops = MEMFS.ops_table.chrdev.node;\r\n                  node.stream_ops = MEMFS.ops_table.chrdev.stream;\r\n              }\r\n              node.timestamp = Date.now();\r\n              if (parent) {\r\n                  parent.contents[name] = node;\r\n              }\r\n              return node\r\n          }), getFileDataAsRegularArray: (function (node) {\r\n              if (node.contents && node.contents.subarray) {\r\n                  var arr = [];\r\n                  for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]);\r\n                  return arr\r\n              }\r\n              return node.contents\r\n          }), getFileDataAsTypedArray: (function (node) {\r\n              if (!node.contents) return new Uint8Array;\r\n              if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes);\r\n              return new Uint8Array(node.contents)\r\n          }), expandFileStorage: (function (node, newCapacity) {\r\n              if (node.contents && node.contents.subarray && newCapacity > node.contents.length) {\r\n                  node.contents = MEMFS.getFileDataAsRegularArray(node);\r\n                  node.usedBytes = node.contents.length;\r\n              }\r\n              if (!node.contents || node.contents.subarray) {\r\n                  var prevCapacity = node.contents ? node.contents.buffer.byteLength : 0;\r\n                  if (prevCapacity >= newCapacity) return;\r\n                  var CAPACITY_DOUBLING_MAX = 1024 * 1024;\r\n                  newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) | 0);\r\n                  if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256);\r\n                  var oldContents = node.contents;\r\n                  node.contents = new Uint8Array(newCapacity);\r\n                  if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0);\r\n                  return\r\n              }\r\n              if (!node.contents && newCapacity > 0) node.contents = [];\r\n              while (node.contents.length < newCapacity) node.contents.push(0);\r\n          }), resizeFileStorage: (function (node, newSize) {\r\n              if (node.usedBytes == newSize) return;\r\n              if (newSize == 0) {\r\n                  node.contents = null;\r\n                  node.usedBytes = 0;\r\n                  return\r\n              }\r\n              if (!node.contents || node.contents.subarray) {\r\n                  var oldContents = node.contents;\r\n                  node.contents = new Uint8Array(new ArrayBuffer(newSize));\r\n                  if (oldContents) {\r\n                      node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)));\r\n                  }\r\n                  node.usedBytes = newSize;\r\n                  return\r\n              }\r\n              if (!node.contents) node.contents = [];\r\n              if (node.contents.length > newSize) node.contents.length = newSize; else while (node.contents.length < newSize) node.contents.push(0);\r\n              node.usedBytes = newSize;\r\n          }), node_ops: {\r\n              getattr: (function (node) {\r\n                  var attr = {};\r\n                  attr.dev = FS.isChrdev(node.mode) ? node.id : 1;\r\n                  attr.ino = node.id;\r\n                  attr.mode = node.mode;\r\n                  attr.nlink = 1;\r\n                  attr.uid = 0;\r\n                  attr.gid = 0;\r\n                  attr.rdev = node.rdev;\r\n                  if (FS.isDir(node.mode)) {\r\n                      attr.size = 4096;\r\n                  } else if (FS.isFile(node.mode)) {\r\n                      attr.size = node.usedBytes;\r\n                  } else if (FS.isLink(node.mode)) {\r\n                      attr.size = node.link.length;\r\n                  } else {\r\n                      attr.size = 0;\r\n                  }\r\n                  attr.atime = new Date(node.timestamp);\r\n                  attr.mtime = new Date(node.timestamp);\r\n                  attr.ctime = new Date(node.timestamp);\r\n                  attr.blksize = 4096;\r\n                  attr.blocks = Math.ceil(attr.size / attr.blksize);\r\n                  return attr\r\n              }), setattr: (function (node, attr) {\r\n                  if (attr.mode !== undefined) {\r\n                      node.mode = attr.mode;\r\n                  }\r\n                  if (attr.timestamp !== undefined) {\r\n                      node.timestamp = attr.timestamp;\r\n                  }\r\n                  if (attr.size !== undefined) {\r\n                      MEMFS.resizeFileStorage(node, attr.size);\r\n                  }\r\n              }), lookup: (function (parent, name) {\r\n                  throw FS.genericErrors[ERRNO_CODES.ENOENT]\r\n              }), mknod: (function (parent, name, mode, dev) {\r\n                  return MEMFS.createNode(parent, name, mode, dev)\r\n              }), rename: (function (old_node, new_dir, new_name) {\r\n                  if (FS.isDir(old_node.mode)) {\r\n                      var new_node;\r\n                      try {\r\n                          new_node = FS.lookupNode(new_dir, new_name);\r\n                      } catch (e) {\r\n                      }\r\n                      if (new_node) {\r\n                          for (var i in new_node.contents) {\r\n                              throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)\r\n                          }\r\n                      }\r\n                  }\r\n                  delete old_node.parent.contents[old_node.name];\r\n                  old_node.name = new_name;\r\n                  new_dir.contents[new_name] = old_node;\r\n                  old_node.parent = new_dir;\r\n              }), unlink: (function (parent, name) {\r\n                  delete parent.contents[name];\r\n              }), rmdir: (function (parent, name) {\r\n                  var node = FS.lookupNode(parent, name);\r\n                  for (var i in node.contents) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)\r\n                  }\r\n                  delete parent.contents[name];\r\n              }), readdir: (function (node) {\r\n                  var entries = [\".\", \"..\"];\r\n                  for (var key in node.contents) {\r\n                      if (!node.contents.hasOwnProperty(key)) {\r\n                          continue\r\n                      }\r\n                      entries.push(key);\r\n                  }\r\n                  return entries\r\n              }), symlink: (function (parent, newname, oldpath) {\r\n                  var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);\r\n                  node.link = oldpath;\r\n                  return node\r\n              }), readlink: (function (node) {\r\n                  if (!FS.isLink(node.mode)) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n                  }\r\n                  return node.link\r\n              })\r\n          }, stream_ops: {\r\n              read: (function (stream, buffer, offset, length, position) {\r\n                  var contents = stream.node.contents;\r\n                  if (position >= stream.node.usedBytes) return 0;\r\n                  var size = Math.min(stream.node.usedBytes - position, length);\r\n                  assert(size >= 0);\r\n                  if (size > 8 && contents.subarray) {\r\n                      buffer.set(contents.subarray(position, position + size), offset);\r\n                  } else {\r\n                      for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i];\r\n                  }\r\n                  return size\r\n              }), write: (function (stream, buffer, offset, length, position, canOwn) {\r\n                  if (!length) return 0;\r\n                  var node = stream.node;\r\n                  node.timestamp = Date.now();\r\n                  if (buffer.subarray && (!node.contents || node.contents.subarray)) {\r\n                      if (canOwn) {\r\n                          node.contents = buffer.subarray(offset, offset + length);\r\n                          node.usedBytes = length;\r\n                          return length\r\n                      } else if (node.usedBytes === 0 && position === 0) {\r\n                          node.contents = new Uint8Array(buffer.subarray(offset, offset + length));\r\n                          node.usedBytes = length;\r\n                          return length\r\n                      } else if (position + length <= node.usedBytes) {\r\n                          node.contents.set(buffer.subarray(offset, offset + length), position);\r\n                          return length\r\n                      }\r\n                  }\r\n                  MEMFS.expandFileStorage(node, position + length);\r\n                  if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); else {\r\n                      for (var i = 0; i < length; i++) {\r\n                          node.contents[position + i] = buffer[offset + i];\r\n                      }\r\n                  }\r\n                  node.usedBytes = Math.max(node.usedBytes, position + length);\r\n                  return length\r\n              }), llseek: (function (stream, offset, whence) {\r\n                  var position = offset;\r\n                  if (whence === 1) {\r\n                      position += stream.position;\r\n                  } else if (whence === 2) {\r\n                      if (FS.isFile(stream.node.mode)) {\r\n                          position += stream.node.usedBytes;\r\n                      }\r\n                  }\r\n                  if (position < 0) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n                  }\r\n                  return position\r\n              }), allocate: (function (stream, offset, length) {\r\n                  MEMFS.expandFileStorage(stream.node, offset + length);\r\n                  stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length);\r\n              }), mmap: (function (stream, buffer, offset, length, position, prot, flags) {\r\n                  if (!FS.isFile(stream.node.mode)) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.ENODEV)\r\n                  }\r\n                  var ptr;\r\n                  var allocated;\r\n                  var contents = stream.node.contents;\r\n                  if (!(flags & 2) && (contents.buffer === buffer || contents.buffer === buffer.buffer)) {\r\n                      allocated = false;\r\n                      ptr = contents.byteOffset;\r\n                  } else {\r\n                      if (position > 0 || position + length < stream.node.usedBytes) {\r\n                          if (contents.subarray) {\r\n                              contents = contents.subarray(position, position + length);\r\n                          } else {\r\n                              contents = Array.prototype.slice.call(contents, position, position + length);\r\n                          }\r\n                      }\r\n                      allocated = true;\r\n                      ptr = _malloc(length);\r\n                      if (!ptr) {\r\n                          throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)\r\n                      }\r\n                      buffer.set(contents, ptr);\r\n                  }\r\n                  return {ptr: ptr, allocated: allocated}\r\n              }), msync: (function (stream, buffer, offset, length, mmapFlags) {\r\n                  if (!FS.isFile(stream.node.mode)) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.ENODEV)\r\n                  }\r\n                  if (mmapFlags & 2) {\r\n                      return 0\r\n                  }\r\n                  MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);\r\n                  return 0\r\n              })\r\n          }\r\n      };\r\n      var IDBFS = {\r\n          dbs: {}, indexedDB: (function () {\r\n              if (typeof indexedDB !== \"undefined\") return indexedDB;\r\n              var ret = null;\r\n              if (typeof window === \"object\") ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\r\n              assert(ret, \"IDBFS used, but indexedDB not supported\");\r\n              return ret\r\n          }), DB_VERSION: 21, DB_STORE_NAME: \"FILE_DATA\", mount: (function (mount) {\r\n              return MEMFS.mount.apply(null, arguments)\r\n          }), syncfs: (function (mount, populate, callback) {\r\n              IDBFS.getLocalSet(mount, (function (err, local) {\r\n                  if (err) return callback(err);\r\n                  IDBFS.getRemoteSet(mount, (function (err, remote) {\r\n                      if (err) return callback(err);\r\n                      var src = populate ? remote : local;\r\n                      var dst = populate ? local : remote;\r\n                      IDBFS.reconcile(src, dst, callback);\r\n                  }));\r\n              }));\r\n          }), getDB: (function (name, callback) {\r\n              var db = IDBFS.dbs[name];\r\n              if (db) {\r\n                  return callback(null, db)\r\n              }\r\n              var req;\r\n              try {\r\n                  req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);\r\n              } catch (e) {\r\n                  return callback(e)\r\n              }\r\n              req.onupgradeneeded = (function (e) {\r\n                  var db = e.target.result;\r\n                  var transaction = e.target.transaction;\r\n                  var fileStore;\r\n                  if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {\r\n                      fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);\r\n                  } else {\r\n                      fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);\r\n                  }\r\n                  if (!fileStore.indexNames.contains(\"timestamp\")) {\r\n                      fileStore.createIndex(\"timestamp\", \"timestamp\", {unique: false});\r\n                  }\r\n              });\r\n              req.onsuccess = (function () {\r\n                  db = req.result;\r\n                  IDBFS.dbs[name] = db;\r\n                  callback(null, db);\r\n              });\r\n              req.onerror = (function (e) {\r\n                  callback(this.error);\r\n                  e.preventDefault();\r\n              });\r\n          }), getLocalSet: (function (mount, callback) {\r\n              var entries = {};\r\n\r\n              function isRealDir(p) {\r\n                  return p !== \".\" && p !== \"..\"\r\n              }\r\n\r\n              function toAbsolute(root) {\r\n                  return (function (p) {\r\n                      return PATH.join2(root, p)\r\n                  })\r\n              }\r\n\r\n              var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));\r\n              while (check.length) {\r\n                  var path = check.pop();\r\n                  var stat;\r\n                  try {\r\n                      stat = FS.stat(path);\r\n                  } catch (e) {\r\n                      return callback(e)\r\n                  }\r\n                  if (FS.isDir(stat.mode)) {\r\n                      check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));\r\n                  }\r\n                  entries[path] = {timestamp: stat.mtime};\r\n              }\r\n              return callback(null, {type: \"local\", entries: entries})\r\n          }), getRemoteSet: (function (mount, callback) {\r\n              var entries = {};\r\n              IDBFS.getDB(mount.mountpoint, (function (err, db) {\r\n                  if (err) return callback(err);\r\n                  var transaction = db.transaction([IDBFS.DB_STORE_NAME], \"readonly\");\r\n                  transaction.onerror = (function (e) {\r\n                      callback(this.error);\r\n                      e.preventDefault();\r\n                  });\r\n                  var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\r\n                  var index = store.index(\"timestamp\");\r\n                  index.openKeyCursor().onsuccess = (function (event) {\r\n                      var cursor = event.target.result;\r\n                      if (!cursor) {\r\n                          return callback(null, {type: \"remote\", db: db, entries: entries})\r\n                      }\r\n                      entries[cursor.primaryKey] = {timestamp: cursor.key};\r\n                      cursor.continue();\r\n                  });\r\n              }));\r\n          }), loadLocalEntry: (function (path, callback) {\r\n              var stat, node;\r\n              try {\r\n                  var lookup = FS.lookupPath(path);\r\n                  node = lookup.node;\r\n                  stat = FS.stat(path);\r\n              } catch (e) {\r\n                  return callback(e)\r\n              }\r\n              if (FS.isDir(stat.mode)) {\r\n                  return callback(null, {timestamp: stat.mtime, mode: stat.mode})\r\n              } else if (FS.isFile(stat.mode)) {\r\n                  node.contents = MEMFS.getFileDataAsTypedArray(node);\r\n                  return callback(null, {timestamp: stat.mtime, mode: stat.mode, contents: node.contents})\r\n              } else {\r\n                  return callback(new Error(\"node type not supported\"))\r\n              }\r\n          }), storeLocalEntry: (function (path, entry, callback) {\r\n              try {\r\n                  if (FS.isDir(entry.mode)) {\r\n                      FS.mkdir(path, entry.mode);\r\n                  } else if (FS.isFile(entry.mode)) {\r\n                      FS.writeFile(path, entry.contents, {encoding: \"binary\", canOwn: true});\r\n                  } else {\r\n                      return callback(new Error(\"node type not supported\"))\r\n                  }\r\n                  FS.chmod(path, entry.mode);\r\n                  FS.utime(path, entry.timestamp, entry.timestamp);\r\n              } catch (e) {\r\n                  return callback(e)\r\n              }\r\n              callback(null);\r\n          }), removeLocalEntry: (function (path, callback) {\r\n              try {\r\n                  var lookup = FS.lookupPath(path);\r\n                  var stat = FS.stat(path);\r\n                  if (FS.isDir(stat.mode)) {\r\n                      FS.rmdir(path);\r\n                  } else if (FS.isFile(stat.mode)) {\r\n                      FS.unlink(path);\r\n                  }\r\n              } catch (e) {\r\n                  return callback(e)\r\n              }\r\n              callback(null);\r\n          }), loadRemoteEntry: (function (store, path, callback) {\r\n              var req = store.get(path);\r\n              req.onsuccess = (function (event) {\r\n                  callback(null, event.target.result);\r\n              });\r\n              req.onerror = (function (e) {\r\n                  callback(this.error);\r\n                  e.preventDefault();\r\n              });\r\n          }), storeRemoteEntry: (function (store, path, entry, callback) {\r\n              var req = store.put(entry, path);\r\n              req.onsuccess = (function () {\r\n                  callback(null);\r\n              });\r\n              req.onerror = (function (e) {\r\n                  callback(this.error);\r\n                  e.preventDefault();\r\n              });\r\n          }), removeRemoteEntry: (function (store, path, callback) {\r\n              var req = store.delete(path);\r\n              req.onsuccess = (function () {\r\n                  callback(null);\r\n              });\r\n              req.onerror = (function (e) {\r\n                  callback(this.error);\r\n                  e.preventDefault();\r\n              });\r\n          }), reconcile: (function (src, dst, callback) {\r\n              var total = 0;\r\n              var create = [];\r\n              Object.keys(src.entries).forEach((function (key) {\r\n                  var e = src.entries[key];\r\n                  var e2 = dst.entries[key];\r\n                  if (!e2 || e.timestamp > e2.timestamp) {\r\n                      create.push(key);\r\n                      total++;\r\n                  }\r\n              }));\r\n              var remove = [];\r\n              Object.keys(dst.entries).forEach((function (key) {\r\n                  dst.entries[key];\r\n                  var e2 = src.entries[key];\r\n                  if (!e2) {\r\n                      remove.push(key);\r\n                      total++;\r\n                  }\r\n              }));\r\n              if (!total) {\r\n                  return callback(null)\r\n              }\r\n              var completed = 0;\r\n              var db = src.type === \"remote\" ? src.db : dst.db;\r\n              var transaction = db.transaction([IDBFS.DB_STORE_NAME], \"readwrite\");\r\n              var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\r\n\r\n              function done(err) {\r\n                  if (err) {\r\n                      if (!done.errored) {\r\n                          done.errored = true;\r\n                          return callback(err)\r\n                      }\r\n                      return\r\n                  }\r\n                  if (++completed >= total) {\r\n                      return callback(null)\r\n                  }\r\n              }\r\n\r\n              transaction.onerror = (function (e) {\r\n                  done(this.error);\r\n                  e.preventDefault();\r\n              });\r\n              create.sort().forEach((function (path) {\r\n                  if (dst.type === \"local\") {\r\n                      IDBFS.loadRemoteEntry(store, path, (function (err, entry) {\r\n                          if (err) return done(err);\r\n                          IDBFS.storeLocalEntry(path, entry, done);\r\n                      }));\r\n                  } else {\r\n                      IDBFS.loadLocalEntry(path, (function (err, entry) {\r\n                          if (err) return done(err);\r\n                          IDBFS.storeRemoteEntry(store, path, entry, done);\r\n                      }));\r\n                  }\r\n              }));\r\n              remove.sort().reverse().forEach((function (path) {\r\n                  if (dst.type === \"local\") {\r\n                      IDBFS.removeLocalEntry(path, done);\r\n                  } else {\r\n                      IDBFS.removeRemoteEntry(store, path, done);\r\n                  }\r\n              }));\r\n          })\r\n      };\r\n      \r\n      var WORKERFS = {\r\n          DIR_MODE: 16895, FILE_MODE: 33279, reader: null, mount: (function (mount) {\r\n              assert(ENVIRONMENT_IS_WORKER);\r\n              if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync;\r\n              var root = WORKERFS.createNode(null, \"/\", WORKERFS.DIR_MODE, 0);\r\n              var createdParents = {};\r\n\r\n              function ensureParent(path) {\r\n                  var parts = path.split(\"/\");\r\n                  var parent = root;\r\n                  for (var i = 0; i < parts.length - 1; i++) {\r\n                      var curr = parts.slice(0, i + 1).join(\"/\");\r\n                      if (!createdParents[curr]) {\r\n                          createdParents[curr] = WORKERFS.createNode(parent, curr, WORKERFS.DIR_MODE, 0);\r\n                      }\r\n                      parent = createdParents[curr];\r\n                  }\r\n                  return parent\r\n              }\r\n\r\n              function base(path) {\r\n                  var parts = path.split(\"/\");\r\n                  return parts[parts.length - 1]\r\n              }\r\n\r\n              Array.prototype.forEach.call(mount.opts[\"files\"] || [], (function (file) {\r\n                  WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate);\r\n              }));\r\n              (mount.opts[\"blobs\"] || []).forEach((function (obj) {\r\n                  WORKERFS.createNode(ensureParent(obj[\"name\"]), base(obj[\"name\"]), WORKERFS.FILE_MODE, 0, obj[\"data\"]);\r\n              }));\r\n              (mount.opts[\"packages\"] || []).forEach((function (pack) {\r\n                  pack[\"metadata\"].files.forEach((function (file) {\r\n                      var name = file.filename.substr(1);\r\n                      WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack[\"blob\"].slice(file.start, file.end));\r\n                  }));\r\n              }));\r\n              return root\r\n          }), createNode: (function (parent, name, mode, dev, contents, mtime) {\r\n              var node = FS.createNode(parent, name, mode);\r\n              node.mode = mode;\r\n              node.node_ops = WORKERFS.node_ops;\r\n              node.stream_ops = WORKERFS.stream_ops;\r\n              node.timestamp = (mtime || new Date).getTime();\r\n              assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE);\r\n              if (mode === WORKERFS.FILE_MODE) {\r\n                  node.size = contents.size;\r\n                  node.contents = contents;\r\n              } else {\r\n                  node.size = 4096;\r\n                  node.contents = {};\r\n              }\r\n              if (parent) {\r\n                  parent.contents[name] = node;\r\n              }\r\n              return node\r\n          }), node_ops: {\r\n              getattr: (function (node) {\r\n                  return {\r\n                      dev: 1,\r\n                      ino: undefined,\r\n                      mode: node.mode,\r\n                      nlink: 1,\r\n                      uid: 0,\r\n                      gid: 0,\r\n                      rdev: undefined,\r\n                      size: node.size,\r\n                      atime: new Date(node.timestamp),\r\n                      mtime: new Date(node.timestamp),\r\n                      ctime: new Date(node.timestamp),\r\n                      blksize: 4096,\r\n                      blocks: Math.ceil(node.size / 4096)\r\n                  }\r\n              }), setattr: (function (node, attr) {\r\n                  if (attr.mode !== undefined) {\r\n                      node.mode = attr.mode;\r\n                  }\r\n                  if (attr.timestamp !== undefined) {\r\n                      node.timestamp = attr.timestamp;\r\n                  }\r\n              }), lookup: (function (parent, name) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOENT)\r\n              }), mknod: (function (parent, name, mode, dev) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }), rename: (function (oldNode, newDir, newName) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }), unlink: (function (parent, name) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }), rmdir: (function (parent, name) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }), readdir: (function (node) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }), symlink: (function (parent, newName, oldPath) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }), readlink: (function (node) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              })\r\n          }, stream_ops: {\r\n              read: (function (stream, buffer, offset, length, position) {\r\n                  if (position >= stream.node.size) return 0;\r\n                  var chunk = stream.node.contents.slice(position, position + length);\r\n                  var ab = WORKERFS.reader.readAsArrayBuffer(chunk);\r\n                  buffer.set(new Uint8Array(ab), offset);\r\n                  return chunk.size\r\n              }), write: (function (stream, buffer, offset, length, position) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EIO)\r\n              }), llseek: (function (stream, offset, whence) {\r\n                  var position = offset;\r\n                  if (whence === 1) {\r\n                      position += stream.position;\r\n                  } else if (whence === 2) {\r\n                      if (FS.isFile(stream.node.mode)) {\r\n                          position += stream.node.size;\r\n                      }\r\n                  }\r\n                  if (position < 0) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n                  }\r\n                  return position\r\n              })\r\n          }\r\n      };\r\n      allocate(1, \"i32*\", ALLOC_STATIC);\r\n      allocate(1, \"i32*\", ALLOC_STATIC);\r\n      allocate(1, \"i32*\", ALLOC_STATIC);\r\n      var FS = {\r\n          root: null,\r\n          mounts: [],\r\n          devices: [null],\r\n          streams: [],\r\n          nextInode: 1,\r\n          nameTable: null,\r\n          currentPath: \"/\",\r\n          initialized: false,\r\n          ignorePermissions: true,\r\n          trackingDelegate: {},\r\n          tracking: {openFlags: {READ: 1, WRITE: 2}},\r\n          ErrnoError: null,\r\n          genericErrors: {},\r\n          filesystems: null,\r\n          handleFSError: (function (e) {\r\n              if (!(e instanceof FS.ErrnoError)) throw e + \" : \" + stackTrace();\r\n              return ___setErrNo(e.errno)\r\n          }),\r\n          lookupPath: (function (path, opts) {\r\n              path = PATH.resolve(FS.cwd(), path);\r\n              opts = opts || {};\r\n              if (!path) return {path: \"\", node: null};\r\n              var defaults = {follow_mount: true, recurse_count: 0};\r\n              for (var key in defaults) {\r\n                  if (opts[key] === undefined) {\r\n                      opts[key] = defaults[key];\r\n                  }\r\n              }\r\n              if (opts.recurse_count > 8) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ELOOP)\r\n              }\r\n              var parts = PATH.normalizeArray(path.split(\"/\").filter((function (p) {\r\n                  return !!p\r\n              })), false);\r\n              var current = FS.root;\r\n              var current_path = \"/\";\r\n              for (var i = 0; i < parts.length; i++) {\r\n                  var islast = i === parts.length - 1;\r\n                  if (islast && opts.parent) {\r\n                      break\r\n                  }\r\n                  current = FS.lookupNode(current, parts[i]);\r\n                  current_path = PATH.join2(current_path, parts[i]);\r\n                  if (FS.isMountpoint(current)) {\r\n                      if (!islast || islast && opts.follow_mount) {\r\n                          current = current.mounted.root;\r\n                      }\r\n                  }\r\n                  if (!islast || opts.follow) {\r\n                      var count = 0;\r\n                      while (FS.isLink(current.mode)) {\r\n                          var link = FS.readlink(current_path);\r\n                          current_path = PATH.resolve(PATH.dirname(current_path), link);\r\n                          var lookup = FS.lookupPath(current_path, {recurse_count: opts.recurse_count});\r\n                          current = lookup.node;\r\n                          if (count++ > 40) {\r\n                              throw new FS.ErrnoError(ERRNO_CODES.ELOOP)\r\n                          }\r\n                      }\r\n                  }\r\n              }\r\n              return {path: current_path, node: current}\r\n          }),\r\n          getPath: (function (node) {\r\n              var path;\r\n              while (true) {\r\n                  if (FS.isRoot(node)) {\r\n                      var mount = node.mount.mountpoint;\r\n                      if (!path) return mount;\r\n                      return mount[mount.length - 1] !== \"/\" ? mount + \"/\" + path : mount + path\r\n                  }\r\n                  path = path ? node.name + \"/\" + path : node.name;\r\n                  node = node.parent;\r\n              }\r\n          }),\r\n          hashName: (function (parentid, name) {\r\n              var hash = 0;\r\n              for (var i = 0; i < name.length; i++) {\r\n                  hash = (hash << 5) - hash + name.charCodeAt(i) | 0;\r\n              }\r\n              return (parentid + hash >>> 0) % FS.nameTable.length\r\n          }),\r\n          hashAddNode: (function (node) {\r\n              var hash = FS.hashName(node.parent.id, node.name);\r\n              node.name_next = FS.nameTable[hash];\r\n              FS.nameTable[hash] = node;\r\n          }),\r\n          hashRemoveNode: (function (node) {\r\n              var hash = FS.hashName(node.parent.id, node.name);\r\n              if (FS.nameTable[hash] === node) {\r\n                  FS.nameTable[hash] = node.name_next;\r\n              } else {\r\n                  var current = FS.nameTable[hash];\r\n                  while (current) {\r\n                      if (current.name_next === node) {\r\n                          current.name_next = node.name_next;\r\n                          break\r\n                      }\r\n                      current = current.name_next;\r\n                  }\r\n              }\r\n          }),\r\n          lookupNode: (function (parent, name) {\r\n              var err = FS.mayLookup(parent);\r\n              if (err) {\r\n                  throw new FS.ErrnoError(err, parent)\r\n              }\r\n              var hash = FS.hashName(parent.id, name);\r\n              for (var node = FS.nameTable[hash]; node; node = node.name_next) {\r\n                  var nodeName = node.name;\r\n                  if (node.parent.id === parent.id && nodeName === name) {\r\n                      return node\r\n                  }\r\n              }\r\n              return FS.lookup(parent, name)\r\n          }),\r\n          createNode: (function (parent, name, mode, rdev) {\r\n              if (!FS.FSNode) {\r\n                  FS.FSNode = (function (parent, name, mode, rdev) {\r\n                      if (!parent) {\r\n                          parent = this;\r\n                      }\r\n                      this.parent = parent;\r\n                      this.mount = parent.mount;\r\n                      this.mounted = null;\r\n                      this.id = FS.nextInode++;\r\n                      this.name = name;\r\n                      this.mode = mode;\r\n                      this.node_ops = {};\r\n                      this.stream_ops = {};\r\n                      this.rdev = rdev;\r\n                  });\r\n                  FS.FSNode.prototype = {};\r\n                  var readMode = 292 | 73;\r\n                  var writeMode = 146;\r\n                  Object.defineProperties(FS.FSNode.prototype, {\r\n                      read: {\r\n                          get: (function () {\r\n                              return (this.mode & readMode) === readMode\r\n                          }), set: (function (val) {\r\n                              val ? this.mode |= readMode : this.mode &= ~readMode;\r\n                          })\r\n                      }, write: {\r\n                          get: (function () {\r\n                              return (this.mode & writeMode) === writeMode\r\n                          }), set: (function (val) {\r\n                              val ? this.mode |= writeMode : this.mode &= ~writeMode;\r\n                          })\r\n                      }, isFolder: {\r\n                          get: (function () {\r\n                              return FS.isDir(this.mode)\r\n                          })\r\n                      }, isDevice: {\r\n                          get: (function () {\r\n                              return FS.isChrdev(this.mode)\r\n                          })\r\n                      }\r\n                  });\r\n              }\r\n              var node = new FS.FSNode(parent, name, mode, rdev);\r\n              FS.hashAddNode(node);\r\n              return node\r\n          }),\r\n          destroyNode: (function (node) {\r\n              FS.hashRemoveNode(node);\r\n          }),\r\n          isRoot: (function (node) {\r\n              return node === node.parent\r\n          }),\r\n          isMountpoint: (function (node) {\r\n              return !!node.mounted\r\n          }),\r\n          isFile: (function (mode) {\r\n              return (mode & 61440) === 32768\r\n          }),\r\n          isDir: (function (mode) {\r\n              return (mode & 61440) === 16384\r\n          }),\r\n          isLink: (function (mode) {\r\n              return (mode & 61440) === 40960\r\n          }),\r\n          isChrdev: (function (mode) {\r\n              return (mode & 61440) === 8192\r\n          }),\r\n          isBlkdev: (function (mode) {\r\n              return (mode & 61440) === 24576\r\n          }),\r\n          isFIFO: (function (mode) {\r\n              return (mode & 61440) === 4096\r\n          }),\r\n          isSocket: (function (mode) {\r\n              return (mode & 49152) === 49152\r\n          }),\r\n          flagModes: {\r\n              \"r\": 0,\r\n              \"rs\": 1052672,\r\n              \"r+\": 2,\r\n              \"w\": 577,\r\n              \"wx\": 705,\r\n              \"xw\": 705,\r\n              \"w+\": 578,\r\n              \"wx+\": 706,\r\n              \"xw+\": 706,\r\n              \"a\": 1089,\r\n              \"ax\": 1217,\r\n              \"xa\": 1217,\r\n              \"a+\": 1090,\r\n              \"ax+\": 1218,\r\n              \"xa+\": 1218\r\n          },\r\n          modeStringToFlags: (function (str) {\r\n              var flags = FS.flagModes[str];\r\n              if (typeof flags === \"undefined\") {\r\n                  throw new Error(\"Unknown file open mode: \" + str)\r\n              }\r\n              return flags\r\n          }),\r\n          flagsToPermissionString: (function (flag) {\r\n              var perms = [\"r\", \"w\", \"rw\"][flag & 3];\r\n              if (flag & 512) {\r\n                  perms += \"w\";\r\n              }\r\n              return perms\r\n          }),\r\n          nodePermissions: (function (node, perms) {\r\n              if (FS.ignorePermissions) {\r\n                  return 0\r\n              }\r\n              if (perms.indexOf(\"r\") !== -1 && !(node.mode & 292)) {\r\n                  return ERRNO_CODES.EACCES\r\n              } else if (perms.indexOf(\"w\") !== -1 && !(node.mode & 146)) {\r\n                  return ERRNO_CODES.EACCES\r\n              } else if (perms.indexOf(\"x\") !== -1 && !(node.mode & 73)) {\r\n                  return ERRNO_CODES.EACCES\r\n              }\r\n              return 0\r\n          }),\r\n          mayLookup: (function (dir) {\r\n              var err = FS.nodePermissions(dir, \"x\");\r\n              if (err) return err;\r\n              if (!dir.node_ops.lookup) return ERRNO_CODES.EACCES;\r\n              return 0\r\n          }),\r\n          mayCreate: (function (dir, name) {\r\n              try {\r\n                  var node = FS.lookupNode(dir, name);\r\n                  return ERRNO_CODES.EEXIST\r\n              } catch (e) {\r\n              }\r\n              return FS.nodePermissions(dir, \"wx\")\r\n          }),\r\n          mayDelete: (function (dir, name, isdir) {\r\n              var node;\r\n              try {\r\n                  node = FS.lookupNode(dir, name);\r\n              } catch (e) {\r\n                  return e.errno\r\n              }\r\n              var err = FS.nodePermissions(dir, \"wx\");\r\n              if (err) {\r\n                  return err\r\n              }\r\n              if (isdir) {\r\n                  if (!FS.isDir(node.mode)) {\r\n                      return ERRNO_CODES.ENOTDIR\r\n                  }\r\n                  if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {\r\n                      return ERRNO_CODES.EBUSY\r\n                  }\r\n              } else {\r\n                  if (FS.isDir(node.mode)) {\r\n                      return ERRNO_CODES.EISDIR\r\n                  }\r\n              }\r\n              return 0\r\n          }),\r\n          mayOpen: (function (node, flags) {\r\n              if (!node) {\r\n                  return ERRNO_CODES.ENOENT\r\n              }\r\n              if (FS.isLink(node.mode)) {\r\n                  return ERRNO_CODES.ELOOP\r\n              } else if (FS.isDir(node.mode)) {\r\n                  if ((flags & 2097155) !== 0 || flags & 512) {\r\n                      return ERRNO_CODES.EISDIR\r\n                  }\r\n              }\r\n              return FS.nodePermissions(node, FS.flagsToPermissionString(flags))\r\n          }),\r\n          MAX_OPEN_FDS: 4096,\r\n          nextfd: (function (fd_start, fd_end) {\r\n              fd_start = fd_start || 0;\r\n              fd_end = fd_end || FS.MAX_OPEN_FDS;\r\n              for (var fd = fd_start; fd <= fd_end; fd++) {\r\n                  if (!FS.streams[fd]) {\r\n                      return fd\r\n                  }\r\n              }\r\n              throw new FS.ErrnoError(ERRNO_CODES.EMFILE)\r\n          }),\r\n          getStream: (function (fd) {\r\n              return FS.streams[fd]\r\n          }),\r\n          createStream: (function (stream, fd_start, fd_end) {\r\n              if (!FS.FSStream) {\r\n                  FS.FSStream = (function () {\r\n                  });\r\n                  FS.FSStream.prototype = {};\r\n                  Object.defineProperties(FS.FSStream.prototype, {\r\n                      object: {\r\n                          get: (function () {\r\n                              return this.node\r\n                          }), set: (function (val) {\r\n                              this.node = val;\r\n                          })\r\n                      }, isRead: {\r\n                          get: (function () {\r\n                              return (this.flags & 2097155) !== 1\r\n                          })\r\n                      }, isWrite: {\r\n                          get: (function () {\r\n                              return (this.flags & 2097155) !== 0\r\n                          })\r\n                      }, isAppend: {\r\n                          get: (function () {\r\n                              return this.flags & 1024\r\n                          })\r\n                      }\r\n                  });\r\n              }\r\n              var newStream = new FS.FSStream;\r\n              for (var p in stream) {\r\n                  newStream[p] = stream[p];\r\n              }\r\n              stream = newStream;\r\n              var fd = FS.nextfd(fd_start, fd_end);\r\n              stream.fd = fd;\r\n              FS.streams[fd] = stream;\r\n              return stream\r\n          }),\r\n          closeStream: (function (fd) {\r\n              FS.streams[fd] = null;\r\n          }),\r\n          chrdev_stream_ops: {\r\n              open: (function (stream) {\r\n                  var device = FS.getDevice(stream.node.rdev);\r\n                  stream.stream_ops = device.stream_ops;\r\n                  if (stream.stream_ops.open) {\r\n                      stream.stream_ops.open(stream);\r\n                  }\r\n              }), llseek: (function () {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)\r\n              })\r\n          },\r\n          major: (function (dev) {\r\n              return dev >> 8\r\n          }),\r\n          minor: (function (dev) {\r\n              return dev & 255\r\n          }),\r\n          makedev: (function (ma, mi) {\r\n              return ma << 8 | mi\r\n          }),\r\n          registerDevice: (function (dev, ops) {\r\n              FS.devices[dev] = {stream_ops: ops};\r\n          }),\r\n          getDevice: (function (dev) {\r\n              return FS.devices[dev]\r\n          }),\r\n          getMounts: (function (mount) {\r\n              var mounts = [];\r\n              var check = [mount];\r\n              while (check.length) {\r\n                  var m = check.pop();\r\n                  mounts.push(m);\r\n                  check.push.apply(check, m.mounts);\r\n              }\r\n              return mounts\r\n          }),\r\n          syncfs: (function (populate, callback) {\r\n              if (typeof populate === \"function\") {\r\n                  callback = populate;\r\n                  populate = false;\r\n              }\r\n              var mounts = FS.getMounts(FS.root.mount);\r\n              var completed = 0;\r\n\r\n              function done(err) {\r\n                  if (err) {\r\n                      if (!done.errored) {\r\n                          done.errored = true;\r\n                          return callback(err)\r\n                      }\r\n                      return\r\n                  }\r\n                  if (++completed >= mounts.length) {\r\n                      callback(null);\r\n                  }\r\n              }\r\n\r\n              mounts.forEach((function (mount) {\r\n                  if (!mount.type.syncfs) {\r\n                      return done(null)\r\n                  }\r\n                  mount.type.syncfs(mount, populate, done);\r\n              }));\r\n          }),\r\n          mount: (function (type, opts, mountpoint) {\r\n              var root = mountpoint === \"/\";\r\n              var pseudo = !mountpoint;\r\n              var node;\r\n              if (root && FS.root) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EBUSY)\r\n              } else if (!root && !pseudo) {\r\n                  var lookup = FS.lookupPath(mountpoint, {follow_mount: false});\r\n                  mountpoint = lookup.path;\r\n                  node = lookup.node;\r\n                  if (FS.isMountpoint(node)) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.EBUSY)\r\n                  }\r\n                  if (!FS.isDir(node.mode)) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)\r\n                  }\r\n              }\r\n              var mount = {type: type, opts: opts, mountpoint: mountpoint, mounts: []};\r\n              var mountRoot = type.mount(mount);\r\n              mountRoot.mount = mount;\r\n              mount.root = mountRoot;\r\n              if (root) {\r\n                  FS.root = mountRoot;\r\n              } else if (node) {\r\n                  node.mounted = mount;\r\n                  if (node.mount) {\r\n                      node.mount.mounts.push(mount);\r\n                  }\r\n              }\r\n              return mountRoot\r\n          }),\r\n          unmount: (function (mountpoint) {\r\n              var lookup = FS.lookupPath(mountpoint, {follow_mount: false});\r\n              if (!FS.isMountpoint(lookup.node)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              var node = lookup.node;\r\n              var mount = node.mounted;\r\n              var mounts = FS.getMounts(mount);\r\n              Object.keys(FS.nameTable).forEach((function (hash) {\r\n                  var current = FS.nameTable[hash];\r\n                  while (current) {\r\n                      var next = current.name_next;\r\n                      if (mounts.indexOf(current.mount) !== -1) {\r\n                          FS.destroyNode(current);\r\n                      }\r\n                      current = next;\r\n                  }\r\n              }));\r\n              node.mounted = null;\r\n              var idx = node.mount.mounts.indexOf(mount);\r\n              assert(idx !== -1);\r\n              node.mount.mounts.splice(idx, 1);\r\n          }),\r\n          lookup: (function (parent, name) {\r\n              return parent.node_ops.lookup(parent, name)\r\n          }),\r\n          mknod: (function (path, mode, dev) {\r\n              var lookup = FS.lookupPath(path, {parent: true});\r\n              var parent = lookup.node;\r\n              var name = PATH.basename(path);\r\n              if (!name || name === \".\" || name === \"..\") {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              var err = FS.mayCreate(parent, name);\r\n              if (err) {\r\n                  throw new FS.ErrnoError(err)\r\n              }\r\n              if (!parent.node_ops.mknod) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }\r\n              return parent.node_ops.mknod(parent, name, mode, dev)\r\n          }),\r\n          create: (function (path, mode) {\r\n              mode = mode !== undefined ? mode : 438;\r\n              mode &= 4095;\r\n              mode |= 32768;\r\n              return FS.mknod(path, mode, 0)\r\n          }),\r\n          mkdir: (function (path, mode) {\r\n              mode = mode !== undefined ? mode : 511;\r\n              mode &= 511 | 512;\r\n              mode |= 16384;\r\n              return FS.mknod(path, mode, 0)\r\n          }),\r\n          mkdev: (function (path, mode, dev) {\r\n              if (typeof dev === \"undefined\") {\r\n                  dev = mode;\r\n                  mode = 438;\r\n              }\r\n              mode |= 8192;\r\n              return FS.mknod(path, mode, dev)\r\n          }),\r\n          symlink: (function (oldpath, newpath) {\r\n              if (!PATH.resolve(oldpath)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOENT)\r\n              }\r\n              var lookup = FS.lookupPath(newpath, {parent: true});\r\n              var parent = lookup.node;\r\n              if (!parent) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOENT)\r\n              }\r\n              var newname = PATH.basename(newpath);\r\n              var err = FS.mayCreate(parent, newname);\r\n              if (err) {\r\n                  throw new FS.ErrnoError(err)\r\n              }\r\n              if (!parent.node_ops.symlink) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }\r\n              return parent.node_ops.symlink(parent, newname, oldpath)\r\n          }),\r\n          rename: (function (old_path, new_path) {\r\n              var old_dirname = PATH.dirname(old_path);\r\n              var new_dirname = PATH.dirname(new_path);\r\n              var old_name = PATH.basename(old_path);\r\n              var new_name = PATH.basename(new_path);\r\n              var lookup, old_dir, new_dir;\r\n              try {\r\n                  lookup = FS.lookupPath(old_path, {parent: true});\r\n                  old_dir = lookup.node;\r\n                  lookup = FS.lookupPath(new_path, {parent: true});\r\n                  new_dir = lookup.node;\r\n              } catch (e) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EBUSY)\r\n              }\r\n              if (!old_dir || !new_dir) throw new FS.ErrnoError(ERRNO_CODES.ENOENT);\r\n              if (old_dir.mount !== new_dir.mount) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EXDEV)\r\n              }\r\n              var old_node = FS.lookupNode(old_dir, old_name);\r\n              var relative = PATH.relative(old_path, new_dirname);\r\n              if (relative.charAt(0) !== \".\") {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              relative = PATH.relative(new_path, old_dirname);\r\n              if (relative.charAt(0) !== \".\") {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)\r\n              }\r\n              var new_node;\r\n              try {\r\n                  new_node = FS.lookupNode(new_dir, new_name);\r\n              } catch (e) {\r\n              }\r\n              if (old_node === new_node) {\r\n                  return\r\n              }\r\n              var isdir = FS.isDir(old_node.mode);\r\n              var err = FS.mayDelete(old_dir, old_name, isdir);\r\n              if (err) {\r\n                  throw new FS.ErrnoError(err)\r\n              }\r\n              err = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name);\r\n              if (err) {\r\n                  throw new FS.ErrnoError(err)\r\n              }\r\n              if (!old_dir.node_ops.rename) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }\r\n              if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EBUSY)\r\n              }\r\n              if (new_dir !== old_dir) {\r\n                  err = FS.nodePermissions(old_dir, \"w\");\r\n                  if (err) {\r\n                      throw new FS.ErrnoError(err)\r\n                  }\r\n              }\r\n              try {\r\n                  if (FS.trackingDelegate[\"willMovePath\"]) {\r\n                      FS.trackingDelegate[\"willMovePath\"](old_path, new_path);\r\n                  }\r\n              } catch (e) {\r\n                  console.log(\"FS.trackingDelegate['willMovePath']('\" + old_path + \"', '\" + new_path + \"') threw an exception: \" + e.message);\r\n              }\r\n              FS.hashRemoveNode(old_node);\r\n              try {\r\n                  old_dir.node_ops.rename(old_node, new_dir, new_name);\r\n              } catch (e) {\r\n                  throw e\r\n              } finally {\r\n                  FS.hashAddNode(old_node);\r\n              }\r\n              try {\r\n                  if (FS.trackingDelegate[\"onMovePath\"]) FS.trackingDelegate[\"onMovePath\"](old_path, new_path);\r\n              } catch (e) {\r\n                  console.log(\"FS.trackingDelegate['onMovePath']('\" + old_path + \"', '\" + new_path + \"') threw an exception: \" + e.message);\r\n              }\r\n          }),\r\n          rmdir: (function (path) {\r\n              var lookup = FS.lookupPath(path, {parent: true});\r\n              var parent = lookup.node;\r\n              var name = PATH.basename(path);\r\n              var node = FS.lookupNode(parent, name);\r\n              var err = FS.mayDelete(parent, name, true);\r\n              if (err) {\r\n                  throw new FS.ErrnoError(err)\r\n              }\r\n              if (!parent.node_ops.rmdir) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }\r\n              if (FS.isMountpoint(node)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EBUSY)\r\n              }\r\n              try {\r\n                  if (FS.trackingDelegate[\"willDeletePath\"]) {\r\n                      FS.trackingDelegate[\"willDeletePath\"](path);\r\n                  }\r\n              } catch (e) {\r\n                  console.log(\"FS.trackingDelegate['willDeletePath']('\" + path + \"') threw an exception: \" + e.message);\r\n              }\r\n              parent.node_ops.rmdir(parent, name);\r\n              FS.destroyNode(node);\r\n              try {\r\n                  if (FS.trackingDelegate[\"onDeletePath\"]) FS.trackingDelegate[\"onDeletePath\"](path);\r\n              } catch (e) {\r\n                  console.log(\"FS.trackingDelegate['onDeletePath']('\" + path + \"') threw an exception: \" + e.message);\r\n              }\r\n          }),\r\n          readdir: (function (path) {\r\n              var lookup = FS.lookupPath(path, {follow: true});\r\n              var node = lookup.node;\r\n              if (!node.node_ops.readdir) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)\r\n              }\r\n              return node.node_ops.readdir(node)\r\n          }),\r\n          unlink: (function (path) {\r\n              var lookup = FS.lookupPath(path, {parent: true});\r\n              var parent = lookup.node;\r\n              var name = PATH.basename(path);\r\n              var node = FS.lookupNode(parent, name);\r\n              var err = FS.mayDelete(parent, name, false);\r\n              if (err) {\r\n                  if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;\r\n                  throw new FS.ErrnoError(err)\r\n              }\r\n              if (!parent.node_ops.unlink) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }\r\n              if (FS.isMountpoint(node)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EBUSY)\r\n              }\r\n              try {\r\n                  if (FS.trackingDelegate[\"willDeletePath\"]) {\r\n                      FS.trackingDelegate[\"willDeletePath\"](path);\r\n                  }\r\n              } catch (e) {\r\n                  console.log(\"FS.trackingDelegate['willDeletePath']('\" + path + \"') threw an exception: \" + e.message);\r\n              }\r\n              parent.node_ops.unlink(parent, name);\r\n              FS.destroyNode(node);\r\n              try {\r\n                  if (FS.trackingDelegate[\"onDeletePath\"]) FS.trackingDelegate[\"onDeletePath\"](path);\r\n              } catch (e) {\r\n                  console.log(\"FS.trackingDelegate['onDeletePath']('\" + path + \"') threw an exception: \" + e.message);\r\n              }\r\n          }),\r\n          readlink: (function (path) {\r\n              var lookup = FS.lookupPath(path);\r\n              var link = lookup.node;\r\n              if (!link) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOENT)\r\n              }\r\n              if (!link.node_ops.readlink) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link))\r\n          }),\r\n          stat: (function (path, dontFollow) {\r\n              var lookup = FS.lookupPath(path, {follow: !dontFollow});\r\n              var node = lookup.node;\r\n              if (!node) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOENT)\r\n              }\r\n              if (!node.node_ops.getattr) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }\r\n              return node.node_ops.getattr(node)\r\n          }),\r\n          lstat: (function (path) {\r\n              return FS.stat(path, true)\r\n          }),\r\n          chmod: (function (path, mode, dontFollow) {\r\n              var node;\r\n              if (typeof path === \"string\") {\r\n                  var lookup = FS.lookupPath(path, {follow: !dontFollow});\r\n                  node = lookup.node;\r\n              } else {\r\n                  node = path;\r\n              }\r\n              if (!node.node_ops.setattr) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }\r\n              node.node_ops.setattr(node, {mode: mode & 4095 | node.mode & ~4095, timestamp: Date.now()});\r\n          }),\r\n          lchmod: (function (path, mode) {\r\n              FS.chmod(path, mode, true);\r\n          }),\r\n          fchmod: (function (fd, mode) {\r\n              var stream = FS.getStream(fd);\r\n              if (!stream) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EBADF)\r\n              }\r\n              FS.chmod(stream.node, mode);\r\n          }),\r\n          chown: (function (path, uid, gid, dontFollow) {\r\n              var node;\r\n              if (typeof path === \"string\") {\r\n                  var lookup = FS.lookupPath(path, {follow: !dontFollow});\r\n                  node = lookup.node;\r\n              } else {\r\n                  node = path;\r\n              }\r\n              if (!node.node_ops.setattr) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }\r\n              node.node_ops.setattr(node, {timestamp: Date.now()});\r\n          }),\r\n          lchown: (function (path, uid, gid) {\r\n              FS.chown(path, uid, gid, true);\r\n          }),\r\n          fchown: (function (fd, uid, gid) {\r\n              var stream = FS.getStream(fd);\r\n              if (!stream) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EBADF)\r\n              }\r\n              FS.chown(stream.node, uid, gid);\r\n          }),\r\n          truncate: (function (path, len) {\r\n              if (len < 0) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              var node;\r\n              if (typeof path === \"string\") {\r\n                  var lookup = FS.lookupPath(path, {follow: true});\r\n                  node = lookup.node;\r\n              } else {\r\n                  node = path;\r\n              }\r\n              if (!node.node_ops.setattr) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EPERM)\r\n              }\r\n              if (FS.isDir(node.mode)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EISDIR)\r\n              }\r\n              if (!FS.isFile(node.mode)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              var err = FS.nodePermissions(node, \"w\");\r\n              if (err) {\r\n                  throw new FS.ErrnoError(err)\r\n              }\r\n              node.node_ops.setattr(node, {size: len, timestamp: Date.now()});\r\n          }),\r\n          ftruncate: (function (fd, len) {\r\n              var stream = FS.getStream(fd);\r\n              if (!stream) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EBADF)\r\n              }\r\n              if ((stream.flags & 2097155) === 0) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              FS.truncate(stream.node, len);\r\n          }),\r\n          utime: (function (path, atime, mtime) {\r\n              var lookup = FS.lookupPath(path, {follow: true});\r\n              var node = lookup.node;\r\n              node.node_ops.setattr(node, {timestamp: Math.max(atime, mtime)});\r\n          }),\r\n          open: (function (path, flags, mode, fd_start, fd_end) {\r\n              if (path === \"\") {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOENT)\r\n              }\r\n              flags = typeof flags === \"string\" ? FS.modeStringToFlags(flags) : flags;\r\n              mode = typeof mode === \"undefined\" ? 438 : mode;\r\n              if (flags & 64) {\r\n                  mode = mode & 4095 | 32768;\r\n              } else {\r\n                  mode = 0;\r\n              }\r\n              var node;\r\n              if (typeof path === \"object\") {\r\n                  node = path;\r\n              } else {\r\n                  path = PATH.normalize(path);\r\n                  try {\r\n                      var lookup = FS.lookupPath(path, {follow: !(flags & 131072)});\r\n                      node = lookup.node;\r\n                  } catch (e) {\r\n                  }\r\n              }\r\n              var created = false;\r\n              if (flags & 64) {\r\n                  if (node) {\r\n                      if (flags & 128) {\r\n                          throw new FS.ErrnoError(ERRNO_CODES.EEXIST)\r\n                      }\r\n                  } else {\r\n                      node = FS.mknod(path, mode, 0);\r\n                      created = true;\r\n                  }\r\n              }\r\n              if (!node) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOENT)\r\n              }\r\n              if (FS.isChrdev(node.mode)) {\r\n                  flags &= ~512;\r\n              }\r\n              if (flags & 65536 && !FS.isDir(node.mode)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)\r\n              }\r\n              if (!created) {\r\n                  var err = FS.mayOpen(node, flags);\r\n                  if (err) {\r\n                      throw new FS.ErrnoError(err)\r\n                  }\r\n              }\r\n              if (flags & 512) {\r\n                  FS.truncate(node, 0);\r\n              }\r\n              flags &= ~(128 | 512);\r\n              var stream = FS.createStream({\r\n                  node: node,\r\n                  path: FS.getPath(node),\r\n                  flags: flags,\r\n                  seekable: true,\r\n                  position: 0,\r\n                  stream_ops: node.stream_ops,\r\n                  ungotten: [],\r\n                  error: false\r\n              }, fd_start, fd_end);\r\n              if (stream.stream_ops.open) {\r\n                  stream.stream_ops.open(stream);\r\n              }\r\n              if (Module[\"logReadFiles\"] && !(flags & 1)) {\r\n                  if (!FS.readFiles) FS.readFiles = {};\r\n                  if (!(path in FS.readFiles)) {\r\n                      FS.readFiles[path] = 1;\r\n                      Module[\"printErr\"](\"read file: \" + path);\r\n                  }\r\n              }\r\n              try {\r\n                  if (FS.trackingDelegate[\"onOpenFile\"]) {\r\n                      var trackingFlags = 0;\r\n                      if ((flags & 2097155) !== 1) {\r\n                          trackingFlags |= FS.tracking.openFlags.READ;\r\n                      }\r\n                      if ((flags & 2097155) !== 0) {\r\n                          trackingFlags |= FS.tracking.openFlags.WRITE;\r\n                      }\r\n                      FS.trackingDelegate[\"onOpenFile\"](path, trackingFlags);\r\n                  }\r\n              } catch (e) {\r\n                  console.log(\"FS.trackingDelegate['onOpenFile']('\" + path + \"', flags) threw an exception: \" + e.message);\r\n              }\r\n              return stream\r\n          }),\r\n          close: (function (stream) {\r\n              if (stream.getdents) stream.getdents = null;\r\n              try {\r\n                  if (stream.stream_ops.close) {\r\n                      stream.stream_ops.close(stream);\r\n                  }\r\n              } catch (e) {\r\n                  throw e\r\n              } finally {\r\n                  FS.closeStream(stream.fd);\r\n              }\r\n          }),\r\n          llseek: (function (stream, offset, whence) {\r\n              if (!stream.seekable || !stream.stream_ops.llseek) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)\r\n              }\r\n              stream.position = stream.stream_ops.llseek(stream, offset, whence);\r\n              stream.ungotten = [];\r\n              return stream.position\r\n          }),\r\n          read: (function (stream, buffer, offset, length, position) {\r\n              if (length < 0 || position < 0) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              if ((stream.flags & 2097155) === 1) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EBADF)\r\n              }\r\n              if (FS.isDir(stream.node.mode)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EISDIR)\r\n              }\r\n              if (!stream.stream_ops.read) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              var seeking = true;\r\n              if (typeof position === \"undefined\") {\r\n                  position = stream.position;\r\n                  seeking = false;\r\n              } else if (!stream.seekable) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)\r\n              }\r\n              var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);\r\n              if (!seeking) stream.position += bytesRead;\r\n              return bytesRead\r\n          }),\r\n          write: (function (stream, buffer, offset, length, position, canOwn) {\r\n              if (length < 0 || position < 0) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              if ((stream.flags & 2097155) === 0) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EBADF)\r\n              }\r\n              if (FS.isDir(stream.node.mode)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EISDIR)\r\n              }\r\n              if (!stream.stream_ops.write) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              if (stream.flags & 1024) {\r\n                  FS.llseek(stream, 0, 2);\r\n              }\r\n              var seeking = true;\r\n              if (typeof position === \"undefined\") {\r\n                  position = stream.position;\r\n                  seeking = false;\r\n              } else if (!stream.seekable) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)\r\n              }\r\n              var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);\r\n              if (!seeking) stream.position += bytesWritten;\r\n              try {\r\n                  if (stream.path && FS.trackingDelegate[\"onWriteToFile\"]) FS.trackingDelegate[\"onWriteToFile\"](stream.path);\r\n              } catch (e) {\r\n                  console.log(\"FS.trackingDelegate['onWriteToFile']('\" + path + \"') threw an exception: \" + e.message);\r\n              }\r\n              return bytesWritten\r\n          }),\r\n          allocate: (function (stream, offset, length) {\r\n              if (offset < 0 || length <= 0) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EINVAL)\r\n              }\r\n              if ((stream.flags & 2097155) === 0) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EBADF)\r\n              }\r\n              if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENODEV)\r\n              }\r\n              if (!stream.stream_ops.allocate) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)\r\n              }\r\n              stream.stream_ops.allocate(stream, offset, length);\r\n          }),\r\n          mmap: (function (stream, buffer, offset, length, position, prot, flags) {\r\n              if ((stream.flags & 2097155) === 1) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.EACCES)\r\n              }\r\n              if (!stream.stream_ops.mmap) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENODEV)\r\n              }\r\n              return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags)\r\n          }),\r\n          msync: (function (stream, buffer, offset, length, mmapFlags) {\r\n              if (!stream || !stream.stream_ops.msync) {\r\n                  return 0\r\n              }\r\n              return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags)\r\n          }),\r\n          munmap: (function (stream) {\r\n              return 0\r\n          }),\r\n          ioctl: (function (stream, cmd, arg) {\r\n              if (!stream.stream_ops.ioctl) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)\r\n              }\r\n              return stream.stream_ops.ioctl(stream, cmd, arg)\r\n          }),\r\n          readFile: (function (path, opts) {\r\n              opts = opts || {};\r\n              opts.flags = opts.flags || \"r\";\r\n              opts.encoding = opts.encoding || \"binary\";\r\n              if (opts.encoding !== \"utf8\" && opts.encoding !== \"binary\") {\r\n                  throw new Error('Invalid encoding type \"' + opts.encoding + '\"')\r\n              }\r\n              var ret;\r\n              var stream = FS.open(path, opts.flags);\r\n              var stat = FS.stat(path);\r\n              var length = stat.size;\r\n              var buf = new Uint8Array(length);\r\n              FS.read(stream, buf, 0, length, 0);\r\n              if (opts.encoding === \"utf8\") {\r\n                  ret = UTF8ArrayToString(buf, 0);\r\n              } else if (opts.encoding === \"binary\") {\r\n                  ret = buf;\r\n              }\r\n              FS.close(stream);\r\n              return ret\r\n          }),\r\n          writeFile: (function (path, data, opts) {\r\n              opts = opts || {};\r\n              opts.flags = opts.flags || \"w\";\r\n              opts.encoding = opts.encoding || \"utf8\";\r\n              if (opts.encoding !== \"utf8\" && opts.encoding !== \"binary\") {\r\n                  throw new Error('Invalid encoding type \"' + opts.encoding + '\"')\r\n              }\r\n              var stream = FS.open(path, opts.flags, opts.mode);\r\n              if (opts.encoding === \"utf8\") {\r\n                  var buf = new Uint8Array(lengthBytesUTF8(data) + 1);\r\n                  var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);\r\n                  FS.write(stream, buf, 0, actualNumBytes, 0, opts.canOwn);\r\n              } else if (opts.encoding === \"binary\") {\r\n                  FS.write(stream, data, 0, data.length, 0, opts.canOwn);\r\n              }\r\n              FS.close(stream);\r\n          }),\r\n          cwd: (function () {\r\n              return FS.currentPath\r\n          }),\r\n          chdir: (function (path) {\r\n              var lookup = FS.lookupPath(path, {follow: true});\r\n              if (!FS.isDir(lookup.node.mode)) {\r\n                  throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)\r\n              }\r\n              var err = FS.nodePermissions(lookup.node, \"x\");\r\n              if (err) {\r\n                  throw new FS.ErrnoError(err)\r\n              }\r\n              FS.currentPath = lookup.path;\r\n          }),\r\n          createDefaultDirectories: (function () {\r\n              FS.mkdir(\"/tmp\");\r\n              FS.mkdir(\"/home\");\r\n              FS.mkdir(\"/home/web_user\");\r\n          }),\r\n          createDefaultDevices: (function () {\r\n              FS.mkdir(\"/dev\");\r\n              FS.registerDevice(FS.makedev(1, 3), {\r\n                  read: (function () {\r\n                      return 0\r\n                  }), write: (function (stream, buffer, offset, length, pos) {\r\n                      return length\r\n                  })\r\n              });\r\n              FS.mkdev(\"/dev/null\", FS.makedev(1, 3));\r\n              TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);\r\n              TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);\r\n              FS.mkdev(\"/dev/tty\", FS.makedev(5, 0));\r\n              FS.mkdev(\"/dev/tty1\", FS.makedev(6, 0));\r\n              var random_device;\r\n              if (typeof crypto !== \"undefined\") {\r\n                  var randomBuffer = new Uint8Array(1);\r\n                  random_device = (function () {\r\n                      crypto.getRandomValues(randomBuffer);\r\n                      return randomBuffer[0]\r\n                  });\r\n              } else {\r\n                  random_device = (function () {\r\n                      return Math.random() * 256 | 0\r\n                  });\r\n              }\r\n              FS.createDevice(\"/dev\", \"random\", random_device);\r\n              FS.createDevice(\"/dev\", \"urandom\", random_device);\r\n              FS.mkdir(\"/dev/shm\");\r\n              FS.mkdir(\"/dev/shm/tmp\");\r\n          }),\r\n          createSpecialDirectories: (function () {\r\n              FS.mkdir(\"/proc\");\r\n              FS.mkdir(\"/proc/self\");\r\n              FS.mkdir(\"/proc/self/fd\");\r\n              FS.mount({\r\n                  mount: (function () {\r\n                      var node = FS.createNode(\"/proc/self\", \"fd\", 16384 | 511, 73);\r\n                      node.node_ops = {\r\n                          lookup: (function (parent, name) {\r\n                              var fd = +name;\r\n                              var stream = FS.getStream(fd);\r\n                              if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);\r\n                              var ret = {\r\n                                  parent: null, mount: {mountpoint: \"fake\"}, node_ops: {\r\n                                      readlink: (function () {\r\n                                          return stream.path\r\n                                      })\r\n                                  }\r\n                              };\r\n                              ret.parent = ret;\r\n                              return ret\r\n                          })\r\n                      };\r\n                      return node\r\n                  })\r\n              }, {}, \"/proc/self/fd\");\r\n          }),\r\n          createStandardStreams: (function () {\r\n              if (Module[\"stdin\"]) {\r\n                  FS.createDevice(\"/dev\", \"stdin\", Module[\"stdin\"]);\r\n              } else {\r\n                  FS.symlink(\"/dev/tty\", \"/dev/stdin\");\r\n              }\r\n              if (Module[\"stdout\"]) {\r\n                  FS.createDevice(\"/dev\", \"stdout\", null, Module[\"stdout\"]);\r\n              } else {\r\n                  FS.symlink(\"/dev/tty\", \"/dev/stdout\");\r\n              }\r\n              if (Module[\"stderr\"]) {\r\n                  FS.createDevice(\"/dev\", \"stderr\", null, Module[\"stderr\"]);\r\n              } else {\r\n                  FS.symlink(\"/dev/tty1\", \"/dev/stderr\");\r\n              }\r\n              var stdin = FS.open(\"/dev/stdin\", \"r\");\r\n              assert(stdin.fd === 0, \"invalid handle for stdin (\" + stdin.fd + \")\");\r\n              var stdout = FS.open(\"/dev/stdout\", \"w\");\r\n              assert(stdout.fd === 1, \"invalid handle for stdout (\" + stdout.fd + \")\");\r\n              var stderr = FS.open(\"/dev/stderr\", \"w\");\r\n              assert(stderr.fd === 2, \"invalid handle for stderr (\" + stderr.fd + \")\");\r\n          }),\r\n          ensureErrnoError: (function () {\r\n              if (FS.ErrnoError) return;\r\n              FS.ErrnoError = function ErrnoError(errno, node) {\r\n                  this.node = node;\r\n                  this.setErrno = (function (errno) {\r\n                      this.errno = errno;\r\n                      for (var key in ERRNO_CODES) {\r\n                          if (ERRNO_CODES[key] === errno) {\r\n                              this.code = key;\r\n                              break\r\n                          }\r\n                      }\r\n                  });\r\n                  this.setErrno(errno);\r\n                  this.message = ERRNO_MESSAGES[errno];\r\n              };\r\n              FS.ErrnoError.prototype = new Error;\r\n              FS.ErrnoError.prototype.constructor = FS.ErrnoError;\r\n              [ERRNO_CODES.ENOENT].forEach((function (code) {\r\n                  FS.genericErrors[code] = new FS.ErrnoError(code);\r\n                  FS.genericErrors[code].stack = \"<generic error, no stack>\";\r\n              }));\r\n          }),\r\n          staticInit: (function () {\r\n              FS.ensureErrnoError();\r\n              FS.nameTable = new Array(4096);\r\n              FS.mount(MEMFS, {}, \"/\");\r\n              FS.createDefaultDirectories();\r\n              FS.createDefaultDevices();\r\n              FS.createSpecialDirectories();\r\n              FS.filesystems = {\"MEMFS\": MEMFS, \"IDBFS\": IDBFS, \"NODEFS\": {}, \"WORKERFS\": WORKERFS};\r\n          }),\r\n          init: (function (input, output, error) {\r\n              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)\");\r\n              FS.init.initialized = true;\r\n              FS.ensureErrnoError();\r\n              Module[\"stdin\"] = input || Module[\"stdin\"];\r\n              Module[\"stdout\"] = output || Module[\"stdout\"];\r\n              Module[\"stderr\"] = error || Module[\"stderr\"];\r\n              FS.createStandardStreams();\r\n          }),\r\n          quit: (function () {\r\n              FS.init.initialized = false;\r\n              var fflush = Module[\"_fflush\"];\r\n              if (fflush) fflush(0);\r\n              for (var i = 0; i < FS.streams.length; i++) {\r\n                  var stream = FS.streams[i];\r\n                  if (!stream) {\r\n                      continue\r\n                  }\r\n                  FS.close(stream);\r\n              }\r\n          }),\r\n          getMode: (function (canRead, canWrite) {\r\n              var mode = 0;\r\n              if (canRead) mode |= 292 | 73;\r\n              if (canWrite) mode |= 146;\r\n              return mode\r\n          }),\r\n          joinPath: (function (parts, forceRelative) {\r\n              var path = PATH.join.apply(null, parts);\r\n              if (forceRelative && path[0] == \"/\") path = path.substr(1);\r\n              return path\r\n          }),\r\n          absolutePath: (function (relative, base) {\r\n              return PATH.resolve(base, relative)\r\n          }),\r\n          standardizePath: (function (path) {\r\n              return PATH.normalize(path)\r\n          }),\r\n          findObject: (function (path, dontResolveLastLink) {\r\n              var ret = FS.analyzePath(path, dontResolveLastLink);\r\n              if (ret.exists) {\r\n                  return ret.object\r\n              } else {\r\n                  ___setErrNo(ret.error);\r\n                  return null\r\n              }\r\n          }),\r\n          analyzePath: (function (path, dontResolveLastLink) {\r\n              try {\r\n                  var lookup = FS.lookupPath(path, {follow: !dontResolveLastLink});\r\n                  path = lookup.path;\r\n              } catch (e) {\r\n              }\r\n              var ret = {\r\n                  isRoot: false,\r\n                  exists: false,\r\n                  error: 0,\r\n                  name: null,\r\n                  path: null,\r\n                  object: null,\r\n                  parentExists: false,\r\n                  parentPath: null,\r\n                  parentObject: null\r\n              };\r\n              try {\r\n                  var lookup = FS.lookupPath(path, {parent: true});\r\n                  ret.parentExists = true;\r\n                  ret.parentPath = lookup.path;\r\n                  ret.parentObject = lookup.node;\r\n                  ret.name = PATH.basename(path);\r\n                  lookup = FS.lookupPath(path, {follow: !dontResolveLastLink});\r\n                  ret.exists = true;\r\n                  ret.path = lookup.path;\r\n                  ret.object = lookup.node;\r\n                  ret.name = lookup.node.name;\r\n                  ret.isRoot = lookup.path === \"/\";\r\n              } catch (e) {\r\n                  ret.error = e.errno;\r\n              }\r\n              return ret\r\n          }),\r\n          createFolder: (function (parent, name, canRead, canWrite) {\r\n              var path = PATH.join2(typeof parent === \"string\" ? parent : FS.getPath(parent), name);\r\n              var mode = FS.getMode(canRead, canWrite);\r\n              return FS.mkdir(path, mode)\r\n          }),\r\n          createPath: (function (parent, path, canRead, canWrite) {\r\n              parent = typeof parent === \"string\" ? parent : FS.getPath(parent);\r\n              var parts = path.split(\"/\").reverse();\r\n              while (parts.length) {\r\n                  var part = parts.pop();\r\n                  if (!part) continue;\r\n                  var current = PATH.join2(parent, part);\r\n                  try {\r\n                      FS.mkdir(current);\r\n                  } catch (e) {\r\n                  }\r\n                  parent = current;\r\n              }\r\n              return current\r\n          }),\r\n          createFile: (function (parent, name, properties, canRead, canWrite) {\r\n              var path = PATH.join2(typeof parent === \"string\" ? parent : FS.getPath(parent), name);\r\n              var mode = FS.getMode(canRead, canWrite);\r\n              return FS.create(path, mode)\r\n          }),\r\n          createDataFile: (function (parent, name, data, canRead, canWrite, canOwn) {\r\n              var path = name ? PATH.join2(typeof parent === \"string\" ? parent : FS.getPath(parent), name) : parent;\r\n              var mode = FS.getMode(canRead, canWrite);\r\n              var node = FS.create(path, mode);\r\n              if (data) {\r\n                  if (typeof data === \"string\") {\r\n                      var arr = new Array(data.length);\r\n                      for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);\r\n                      data = arr;\r\n                  }\r\n                  FS.chmod(node, mode | 146);\r\n                  var stream = FS.open(node, \"w\");\r\n                  FS.write(stream, data, 0, data.length, 0, canOwn);\r\n                  FS.close(stream);\r\n                  FS.chmod(node, mode);\r\n              }\r\n              return node\r\n          }),\r\n          createDevice: (function (parent, name, input, output) {\r\n              var path = PATH.join2(typeof parent === \"string\" ? parent : FS.getPath(parent), name);\r\n              var mode = FS.getMode(!!input, !!output);\r\n              if (!FS.createDevice.major) FS.createDevice.major = 64;\r\n              var dev = FS.makedev(FS.createDevice.major++, 0);\r\n              FS.registerDevice(dev, {\r\n                  open: (function (stream) {\r\n                      stream.seekable = false;\r\n                  }), close: (function (stream) {\r\n                      if (output && output.buffer && output.buffer.length) {\r\n                          output(10);\r\n                      }\r\n                  }), read: (function (stream, buffer, offset, length, pos) {\r\n                      var bytesRead = 0;\r\n                      for (var i = 0; i < length; i++) {\r\n                          var result;\r\n                          try {\r\n                              result = input();\r\n                          } catch (e) {\r\n                              throw new FS.ErrnoError(ERRNO_CODES.EIO)\r\n                          }\r\n                          if (result === undefined && bytesRead === 0) {\r\n                              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)\r\n                          }\r\n                          if (result === null || result === undefined) break;\r\n                          bytesRead++;\r\n                          buffer[offset + i] = result;\r\n                      }\r\n                      if (bytesRead) {\r\n                          stream.node.timestamp = Date.now();\r\n                      }\r\n                      return bytesRead\r\n                  }), write: (function (stream, buffer, offset, length, pos) {\r\n                      for (var i = 0; i < length; i++) {\r\n                          try {\r\n                              output(buffer[offset + i]);\r\n                          } catch (e) {\r\n                              throw new FS.ErrnoError(ERRNO_CODES.EIO)\r\n                          }\r\n                      }\r\n                      if (length) {\r\n                          stream.node.timestamp = Date.now();\r\n                      }\r\n                      return i\r\n                  })\r\n              });\r\n              return FS.mkdev(path, mode, dev)\r\n          }),\r\n          createLink: (function (parent, name, target, canRead, canWrite) {\r\n              var path = PATH.join2(typeof parent === \"string\" ? parent : FS.getPath(parent), name);\r\n              return FS.symlink(target, path)\r\n          }),\r\n          forceLoadFile: (function (obj) {\r\n              if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;\r\n              var success = true;\r\n              if (typeof XMLHttpRequest !== \"undefined\") {\r\n                  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.\")\r\n              } else if (Module[\"read\"]) {\r\n                  try {\r\n                      obj.contents = intArrayFromString(Module[\"read\"](obj.url), true);\r\n                      obj.usedBytes = obj.contents.length;\r\n                  } catch (e) {\r\n                      success = false;\r\n                  }\r\n              } else {\r\n                  throw new Error(\"Cannot load without read() or XMLHttpRequest.\")\r\n              }\r\n              if (!success) ___setErrNo(ERRNO_CODES.EIO);\r\n              return success\r\n          }),\r\n          createLazyFile: (function (parent, name, url, canRead, canWrite) {\r\n              function LazyUint8Array() {\r\n                  this.lengthKnown = false;\r\n                  this.chunks = [];\r\n              }\r\n\r\n              LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {\r\n                  if (idx > this.length - 1 || idx < 0) {\r\n                      return undefined\r\n                  }\r\n                  var chunkOffset = idx % this.chunkSize;\r\n                  var chunkNum = idx / this.chunkSize | 0;\r\n                  return this.getter(chunkNum)[chunkOffset]\r\n              };\r\n              LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {\r\n                  this.getter = getter;\r\n              };\r\n              LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {\r\n                  var xhr = new XMLHttpRequest;\r\n                  xhr.open(\"HEAD\", url, false);\r\n                  xhr.send(null);\r\n                  if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\r\n                  var datalength = Number(xhr.getResponseHeader(\"Content-length\"));\r\n                  var header;\r\n                  var hasByteServing = (header = xhr.getResponseHeader(\"Accept-Ranges\")) && header === \"bytes\";\r\n                  var chunkSize = 1024 * 1024;\r\n                  if (!hasByteServing) chunkSize = datalength;\r\n                  var doXHR = (function (from, to) {\r\n                      if (from > to) throw new Error(\"invalid range (\" + from + \", \" + to + \") or no bytes requested!\");\r\n                      if (to > datalength - 1) throw new Error(\"only \" + datalength + \" bytes available! programmer error!\");\r\n                      var xhr = new XMLHttpRequest;\r\n                      xhr.open(\"GET\", url, false);\r\n                      if (datalength !== chunkSize) xhr.setRequestHeader(\"Range\", \"bytes=\" + from + \"-\" + to);\r\n                      if (typeof Uint8Array != \"undefined\") xhr.responseType = \"arraybuffer\";\r\n                      if (xhr.overrideMimeType) {\r\n                          xhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\r\n                      }\r\n                      xhr.send(null);\r\n                      if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\r\n                      if (xhr.response !== undefined) {\r\n                          return new Uint8Array(xhr.response || [])\r\n                      } else {\r\n                          return intArrayFromString(xhr.responseText || \"\", true)\r\n                      }\r\n                  });\r\n                  var lazyArray = this;\r\n                  lazyArray.setDataGetter((function (chunkNum) {\r\n                      var start = chunkNum * chunkSize;\r\n                      var end = (chunkNum + 1) * chunkSize - 1;\r\n                      end = Math.min(end, datalength - 1);\r\n                      if (typeof lazyArray.chunks[chunkNum] === \"undefined\") {\r\n                          lazyArray.chunks[chunkNum] = doXHR(start, end);\r\n                      }\r\n                      if (typeof lazyArray.chunks[chunkNum] === \"undefined\") throw new Error(\"doXHR failed!\");\r\n                      return lazyArray.chunks[chunkNum]\r\n                  }));\r\n                  this._length = datalength;\r\n                  this._chunkSize = chunkSize;\r\n                  this.lengthKnown = true;\r\n              };\r\n              if (typeof XMLHttpRequest !== \"undefined\") {\r\n                  if (!ENVIRONMENT_IS_WORKER) throw \"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc\";\r\n                  var lazyArray = new LazyUint8Array;\r\n                  Object.defineProperty(lazyArray, \"length\", {\r\n                      get: (function () {\r\n                          if (!this.lengthKnown) {\r\n                              this.cacheLength();\r\n                          }\r\n                          return this._length\r\n                      })\r\n                  });\r\n                  Object.defineProperty(lazyArray, \"chunkSize\", {\r\n                      get: (function () {\r\n                          if (!this.lengthKnown) {\r\n                              this.cacheLength();\r\n                          }\r\n                          return this._chunkSize\r\n                      })\r\n                  });\r\n                  var properties = {isDevice: false, contents: lazyArray};\r\n              } else {\r\n                  var properties = {isDevice: false, url: url};\r\n              }\r\n              var node = FS.createFile(parent, name, properties, canRead, canWrite);\r\n              if (properties.contents) {\r\n                  node.contents = properties.contents;\r\n              } else if (properties.url) {\r\n                  node.contents = null;\r\n                  node.url = properties.url;\r\n              }\r\n              Object.defineProperty(node, \"usedBytes\", {\r\n                  get: (function () {\r\n                      return this.contents.length\r\n                  })\r\n              });\r\n              var stream_ops = {};\r\n              var keys = Object.keys(node.stream_ops);\r\n              keys.forEach((function (key) {\r\n                  var fn = node.stream_ops[key];\r\n                  stream_ops[key] = function forceLoadLazyFile() {\r\n                      if (!FS.forceLoadFile(node)) {\r\n                          throw new FS.ErrnoError(ERRNO_CODES.EIO)\r\n                      }\r\n                      return fn.apply(null, arguments)\r\n                  };\r\n              }));\r\n              stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {\r\n                  if (!FS.forceLoadFile(node)) {\r\n                      throw new FS.ErrnoError(ERRNO_CODES.EIO)\r\n                  }\r\n                  var contents = stream.node.contents;\r\n                  if (position >= contents.length) return 0;\r\n                  var size = Math.min(contents.length - position, length);\r\n                  assert(size >= 0);\r\n                  if (contents.slice) {\r\n                      for (var i = 0; i < size; i++) {\r\n                          buffer[offset + i] = contents[position + i];\r\n                      }\r\n                  } else {\r\n                      for (var i = 0; i < size; i++) {\r\n                          buffer[offset + i] = contents.get(position + i);\r\n                      }\r\n                  }\r\n                  return size\r\n              };\r\n              node.stream_ops = stream_ops;\r\n              return node\r\n          }),\r\n          createPreloadedFile: (function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {\r\n              Browser.init();\r\n              var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;\r\n\r\n              function processData(byteArray) {\r\n                  function finish(byteArray) {\r\n                      if (preFinish) preFinish();\r\n                      if (!dontCreateFile) {\r\n                          FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);\r\n                      }\r\n                      if (onload) onload();\r\n                      removeRunDependency();\r\n                  }\r\n\r\n                  var handled = false;\r\n                  Module[\"preloadPlugins\"].forEach((function (plugin) {\r\n                      if (handled) return;\r\n                      if (plugin[\"canHandle\"](fullname)) {\r\n                          plugin[\"handle\"](byteArray, fullname, finish, (function () {\r\n                              if (onerror) onerror();\r\n                              removeRunDependency();\r\n                          }));\r\n                          handled = true;\r\n                      }\r\n                  }));\r\n                  if (!handled) finish(byteArray);\r\n              }\r\n\r\n              addRunDependency();\r\n              if (typeof url == \"string\") {\r\n                  Browser.asyncLoad(url, (function (byteArray) {\r\n                      processData(byteArray);\r\n                  }), onerror);\r\n              } else {\r\n                  processData(url);\r\n              }\r\n          }),\r\n          indexedDB: (function () {\r\n              return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB\r\n          }),\r\n          DB_NAME: (function () {\r\n              return \"EM_FS_\" + window.location.pathname\r\n          }),\r\n          DB_VERSION: 20,\r\n          DB_STORE_NAME: \"FILE_DATA\",\r\n          saveFilesToDB: (function (paths, onload, onerror) {\r\n              onload = onload || (function () {\r\n              });\r\n              onerror = onerror || (function () {\r\n              });\r\n              var indexedDB = FS.indexedDB();\r\n              try {\r\n                  var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\r\n              } catch (e) {\r\n                  return onerror(e)\r\n              }\r\n              openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {\r\n                  console.log(\"creating db\");\r\n                  var db = openRequest.result;\r\n                  db.createObjectStore(FS.DB_STORE_NAME);\r\n              };\r\n              openRequest.onsuccess = function openRequest_onsuccess() {\r\n                  var db = openRequest.result;\r\n                  var transaction = db.transaction([FS.DB_STORE_NAME], \"readwrite\");\r\n                  var files = transaction.objectStore(FS.DB_STORE_NAME);\r\n                  var ok = 0, fail = 0, total = paths.length;\r\n\r\n                  function finish() {\r\n                      if (fail == 0) onload(); else onerror();\r\n                  }\r\n\r\n                  paths.forEach((function (path) {\r\n                      var putRequest = files.put(FS.analyzePath(path).object.contents, path);\r\n                      putRequest.onsuccess = function putRequest_onsuccess() {\r\n                          ok++;\r\n                          if (ok + fail == total) finish();\r\n                      };\r\n                      putRequest.onerror = function putRequest_onerror() {\r\n                          fail++;\r\n                          if (ok + fail == total) finish();\r\n                      };\r\n                  }));\r\n                  transaction.onerror = onerror;\r\n              };\r\n              openRequest.onerror = onerror;\r\n          }),\r\n          loadFilesFromDB: (function (paths, onload, onerror) {\r\n              onload = onload || (function () {\r\n              });\r\n              onerror = onerror || (function () {\r\n              });\r\n              var indexedDB = FS.indexedDB();\r\n              try {\r\n                  var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\r\n              } catch (e) {\r\n                  return onerror(e)\r\n              }\r\n              openRequest.onupgradeneeded = onerror;\r\n              openRequest.onsuccess = function openRequest_onsuccess() {\r\n                  var db = openRequest.result;\r\n                  try {\r\n                      var transaction = db.transaction([FS.DB_STORE_NAME], \"readonly\");\r\n                  } catch (e) {\r\n                      onerror(e);\r\n                      return\r\n                  }\r\n                  var files = transaction.objectStore(FS.DB_STORE_NAME);\r\n                  var ok = 0, fail = 0, total = paths.length;\r\n\r\n                  function finish() {\r\n                      if (fail == 0) onload(); else onerror();\r\n                  }\r\n\r\n                  paths.forEach((function (path) {\r\n                      var getRequest = files.get(path);\r\n                      getRequest.onsuccess = function getRequest_onsuccess() {\r\n                          if (FS.analyzePath(path).exists) {\r\n                              FS.unlink(path);\r\n                          }\r\n                          FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);\r\n                          ok++;\r\n                          if (ok + fail == total) finish();\r\n                      };\r\n                      getRequest.onerror = function getRequest_onerror() {\r\n                          fail++;\r\n                          if (ok + fail == total) finish();\r\n                      };\r\n                  }));\r\n                  transaction.onerror = onerror;\r\n              };\r\n              openRequest.onerror = onerror;\r\n          })\r\n      };\r\n      var PATH = {\r\n          splitPath: (function (filename) {\r\n              var splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\r\n              return splitPathRe.exec(filename).slice(1)\r\n          }), normalizeArray: (function (parts, allowAboveRoot) {\r\n              var up = 0;\r\n              for (var i = parts.length - 1; i >= 0; i--) {\r\n                  var last = parts[i];\r\n                  if (last === \".\") {\r\n                      parts.splice(i, 1);\r\n                  } else if (last === \"..\") {\r\n                      parts.splice(i, 1);\r\n                      up++;\r\n                  } else if (up) {\r\n                      parts.splice(i, 1);\r\n                      up--;\r\n                  }\r\n              }\r\n              if (allowAboveRoot) {\r\n                  for (; up--; up) {\r\n                      parts.unshift(\"..\");\r\n                  }\r\n              }\r\n              return parts\r\n          }), normalize: (function (path) {\r\n              var isAbsolute = path.charAt(0) === \"/\", trailingSlash = path.substr(-1) === \"/\";\r\n              path = PATH.normalizeArray(path.split(\"/\").filter((function (p) {\r\n                  return !!p\r\n              })), !isAbsolute).join(\"/\");\r\n              if (!path && !isAbsolute) {\r\n                  path = \".\";\r\n              }\r\n              if (path && trailingSlash) {\r\n                  path += \"/\";\r\n              }\r\n              return (isAbsolute ? \"/\" : \"\") + path\r\n          }), dirname: (function (path) {\r\n              var result = PATH.splitPath(path), root = result[0], dir = result[1];\r\n              if (!root && !dir) {\r\n                  return \".\"\r\n              }\r\n              if (dir) {\r\n                  dir = dir.substr(0, dir.length - 1);\r\n              }\r\n              return root + dir\r\n          }), basename: (function (path) {\r\n              if (path === \"/\") return \"/\";\r\n              var lastSlash = path.lastIndexOf(\"/\");\r\n              if (lastSlash === -1) return path;\r\n              return path.substr(lastSlash + 1)\r\n          }), extname: (function (path) {\r\n              return PATH.splitPath(path)[3]\r\n          }), join: (function () {\r\n              var paths = Array.prototype.slice.call(arguments, 0);\r\n              return PATH.normalize(paths.join(\"/\"))\r\n          }), join2: (function (l, r) {\r\n              return PATH.normalize(l + \"/\" + r)\r\n          }), resolve: (function () {\r\n              var resolvedPath = \"\", resolvedAbsolute = false;\r\n              for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\r\n                  var path = i >= 0 ? arguments[i] : FS.cwd();\r\n                  if (typeof path !== \"string\") {\r\n                      throw new TypeError(\"Arguments to path.resolve must be strings\")\r\n                  } else if (!path) {\r\n                      return \"\"\r\n                  }\r\n                  resolvedPath = path + \"/\" + resolvedPath;\r\n                  resolvedAbsolute = path.charAt(0) === \"/\";\r\n              }\r\n              resolvedPath = PATH.normalizeArray(resolvedPath.split(\"/\").filter((function (p) {\r\n                  return !!p\r\n              })), !resolvedAbsolute).join(\"/\");\r\n              return (resolvedAbsolute ? \"/\" : \"\") + resolvedPath || \".\"\r\n          }), relative: (function (from, to) {\r\n              from = PATH.resolve(from).substr(1);\r\n              to = PATH.resolve(to).substr(1);\r\n\r\n              function trim(arr) {\r\n                  var start = 0;\r\n                  for (; start < arr.length; start++) {\r\n                      if (arr[start] !== \"\") break\r\n                  }\r\n                  var end = arr.length - 1;\r\n                  for (; end >= 0; end--) {\r\n                      if (arr[end] !== \"\") break\r\n                  }\r\n                  if (start > end) return [];\r\n                  return arr.slice(start, end - start + 1)\r\n              }\r\n\r\n              var fromParts = trim(from.split(\"/\"));\r\n              var toParts = trim(to.split(\"/\"));\r\n              var length = Math.min(fromParts.length, toParts.length);\r\n              var samePartsLength = length;\r\n              for (var i = 0; i < length; i++) {\r\n                  if (fromParts[i] !== toParts[i]) {\r\n                      samePartsLength = i;\r\n                      break\r\n                  }\r\n              }\r\n              var outputParts = [];\r\n              for (var i = samePartsLength; i < fromParts.length; i++) {\r\n                  outputParts.push(\"..\");\r\n              }\r\n              outputParts = outputParts.concat(toParts.slice(samePartsLength));\r\n              return outputParts.join(\"/\")\r\n          })\r\n      };\r\n\r\n      function _emscripten_set_main_loop_timing(mode, value) {\r\n          Browser.mainLoop.timingMode = mode;\r\n          Browser.mainLoop.timingValue = value;\r\n          if (!Browser.mainLoop.func) {\r\n              return 1\r\n          }\r\n          if (mode == 0) {\r\n              Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setTimeout() {\r\n                  setTimeout(Browser.mainLoop.runner, value);\r\n              };\r\n              Browser.mainLoop.method = \"timeout\";\r\n          } else if (mode == 1) {\r\n              Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_rAF() {\r\n                  Browser.requestAnimationFrame(Browser.mainLoop.runner);\r\n              };\r\n              Browser.mainLoop.method = \"rAF\";\r\n          } else if (mode == 2) {\r\n              if (!window[\"setImmediate\"]) {\r\n                  var setImmediates = [];\r\n                  var emscriptenMainLoopMessageId = \"__emcc\";\r\n\r\n                  function Browser_setImmediate_messageHandler(event) {\r\n                      if (event.source === window && event.data === emscriptenMainLoopMessageId) {\r\n                          event.stopPropagation();\r\n                          setImmediates.shift()();\r\n                      }\r\n                  }\r\n\r\n                  window.addEventListener(\"message\", Browser_setImmediate_messageHandler, true);\r\n                  window[\"setImmediate\"] = function Browser_emulated_setImmediate(func) {\r\n                      setImmediates.push(func);\r\n                      window.postMessage(emscriptenMainLoopMessageId, \"*\");\r\n                  };\r\n              }\r\n              Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setImmediate() {\r\n                  window[\"setImmediate\"](Browser.mainLoop.runner);\r\n              };\r\n              Browser.mainLoop.method = \"immediate\";\r\n          }\r\n          return 0\r\n      }\r\n\r\n      function _emscripten_set_main_loop(func, fps, simulateInfiniteLoop, arg, noSetTiming) {\r\n          Module[\"noExitRuntime\"] = true;\r\n          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.\");\r\n          Browser.mainLoop.func = func;\r\n          Browser.mainLoop.arg = arg;\r\n          var thisMainLoopId = Browser.mainLoop.currentlyRunningMainloop;\r\n          Browser.mainLoop.runner = function Browser_mainLoop_runner() {\r\n              if (ABORT) return;\r\n              if (Browser.mainLoop.queue.length > 0) {\r\n                  var start = Date.now();\r\n                  var blocker = Browser.mainLoop.queue.shift();\r\n                  blocker.func(blocker.arg);\r\n                  if (Browser.mainLoop.remainingBlockers) {\r\n                      var remaining = Browser.mainLoop.remainingBlockers;\r\n                      var next = remaining % 1 == 0 ? remaining - 1 : Math.floor(remaining);\r\n                      if (blocker.counted) {\r\n                          Browser.mainLoop.remainingBlockers = next;\r\n                      } else {\r\n                          next = next + .5;\r\n                          Browser.mainLoop.remainingBlockers = (8 * remaining + next) / 9;\r\n                      }\r\n                  }\r\n                  console.log('main loop blocker \"' + blocker.name + '\" took ' + (Date.now() - start) + \" ms\");\r\n                  Browser.mainLoop.updateStatus();\r\n                  setTimeout(Browser.mainLoop.runner, 0);\r\n                  return\r\n              }\r\n              if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return;\r\n              Browser.mainLoop.currentFrameNumber = Browser.mainLoop.currentFrameNumber + 1 | 0;\r\n              if (Browser.mainLoop.timingMode == 1 && Browser.mainLoop.timingValue > 1 && Browser.mainLoop.currentFrameNumber % Browser.mainLoop.timingValue != 0) {\r\n                  Browser.mainLoop.scheduler();\r\n                  return\r\n              }\r\n              if (Browser.mainLoop.method === \"timeout\" && Module.ctx) {\r\n                  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!\");\r\n                  Browser.mainLoop.method = \"\";\r\n              }\r\n              Browser.mainLoop.runIter((function () {\r\n                  if (typeof arg !== \"undefined\") {\r\n                      Runtime.dynCall(\"vi\", func, [arg]);\r\n                  } else {\r\n                      Runtime.dynCall(\"v\", func);\r\n                  }\r\n              }));\r\n              if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return;\r\n              if (typeof SDL === \"object\" && SDL.audio && SDL.audio.queueNewAudioData) SDL.audio.queueNewAudioData();\r\n              Browser.mainLoop.scheduler();\r\n          };\r\n          if (!noSetTiming) {\r\n              if (fps && fps > 0) _emscripten_set_main_loop_timing(0, 1e3 / fps); else _emscripten_set_main_loop_timing(1, 1);\r\n              Browser.mainLoop.scheduler();\r\n          }\r\n          if (simulateInfiniteLoop) {\r\n              throw \"SimulateInfiniteLoop\"\r\n          }\r\n      }\r\n\r\n      var Browser = {\r\n          mainLoop: {\r\n              scheduler: null,\r\n              method: \"\",\r\n              currentlyRunningMainloop: 0,\r\n              func: null,\r\n              arg: 0,\r\n              timingMode: 0,\r\n              timingValue: 0,\r\n              currentFrameNumber: 0,\r\n              queue: [],\r\n              pause: (function () {\r\n                  Browser.mainLoop.scheduler = null;\r\n                  Browser.mainLoop.currentlyRunningMainloop++;\r\n              }),\r\n              resume: (function () {\r\n                  Browser.mainLoop.currentlyRunningMainloop++;\r\n                  var timingMode = Browser.mainLoop.timingMode;\r\n                  var timingValue = Browser.mainLoop.timingValue;\r\n                  var func = Browser.mainLoop.func;\r\n                  Browser.mainLoop.func = null;\r\n                  _emscripten_set_main_loop(func, 0, false, Browser.mainLoop.arg, true);\r\n                  _emscripten_set_main_loop_timing(timingMode, timingValue);\r\n                  Browser.mainLoop.scheduler();\r\n              }),\r\n              updateStatus: (function () {\r\n                  if (Module[\"setStatus\"]) {\r\n                      var message = Module[\"statusMessage\"] || \"Please wait...\";\r\n                      var remaining = Browser.mainLoop.remainingBlockers;\r\n                      var expected = Browser.mainLoop.expectedBlockers;\r\n                      if (remaining) {\r\n                          if (remaining < expected) {\r\n                              Module[\"setStatus\"](message + \" (\" + (expected - remaining) + \"/\" + expected + \")\");\r\n                          } else {\r\n                              Module[\"setStatus\"](message);\r\n                          }\r\n                      } else {\r\n                          Module[\"setStatus\"](\"\");\r\n                      }\r\n                  }\r\n              }),\r\n              runIter: (function (func) {\r\n                  if (ABORT) return;\r\n                  if (Module[\"preMainLoop\"]) {\r\n                      var preRet = Module[\"preMainLoop\"]();\r\n                      if (preRet === false) {\r\n                          return\r\n                      }\r\n                  }\r\n                  try {\r\n                      func();\r\n                  } catch (e) {\r\n                      if (e instanceof ExitStatus) {\r\n                          return\r\n                      } else {\r\n                          if (e && typeof e === \"object\" && e.stack) Module.printErr(\"exception thrown: \" + [e, e.stack]);\r\n                          throw e\r\n                      }\r\n                  }\r\n                  if (Module[\"postMainLoop\"]) Module[\"postMainLoop\"]();\r\n              })\r\n          },\r\n          isFullScreen: false,\r\n          pointerLock: false,\r\n          moduleContextCreatedCallbacks: [],\r\n          workers: [],\r\n          init: (function () {\r\n              if (!Module[\"preloadPlugins\"]) Module[\"preloadPlugins\"] = [];\r\n              if (Browser.initted) return;\r\n              Browser.initted = true;\r\n              try {\r\n                  new Blob;\r\n                  Browser.hasBlobConstructor = true;\r\n              } catch (e) {\r\n                  Browser.hasBlobConstructor = false;\r\n                  console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\");\r\n              }\r\n              Browser.BlobBuilder = typeof MozBlobBuilder != \"undefined\" ? MozBlobBuilder : typeof WebKitBlobBuilder != \"undefined\" ? WebKitBlobBuilder : !Browser.hasBlobConstructor ? console.log(\"warning: no BlobBuilder\") : null;\r\n              Browser.URLObject = typeof window != \"undefined\" ? window.URL ? window.URL : window.webkitURL : undefined;\r\n              if (!Module.noImageDecoding && typeof Browser.URLObject === \"undefined\") {\r\n                  console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\");\r\n                  Module.noImageDecoding = true;\r\n              }\r\n              var imagePlugin = {};\r\n              imagePlugin[\"canHandle\"] = function imagePlugin_canHandle(name) {\r\n                  return !Module.noImageDecoding && /\\.(jpg|jpeg|png|bmp)$/i.test(name)\r\n              };\r\n              imagePlugin[\"handle\"] = function imagePlugin_handle(byteArray, name, onload, onerror) {\r\n                  var b = null;\r\n                  if (Browser.hasBlobConstructor) {\r\n                      try {\r\n                          b = new Blob([byteArray], {type: Browser.getMimetype(name)});\r\n                          if (b.size !== byteArray.length) {\r\n                              b = new Blob([(new Uint8Array(byteArray)).buffer], {type: Browser.getMimetype(name)});\r\n                          }\r\n                      } catch (e) {\r\n                          Runtime.warnOnce(\"Blob constructor present but fails: \" + e + \"; falling back to blob builder\");\r\n                      }\r\n                  }\r\n                  if (!b) {\r\n                      var bb = new Browser.BlobBuilder;\r\n                      bb.append((new Uint8Array(byteArray)).buffer);\r\n                      b = bb.getBlob();\r\n                  }\r\n                  var url = Browser.URLObject.createObjectURL(b);\r\n                  var img = new Image;\r\n                  img.onload = function img_onload() {\r\n                      assert(img.complete, \"Image \" + name + \" could not be decoded\");\r\n                      var canvas = document.createElement(\"canvas\");\r\n                      canvas.width = img.width;\r\n                      canvas.height = img.height;\r\n                      var ctx = canvas.getContext(\"2d\");\r\n                      ctx.drawImage(img, 0, 0);\r\n                      Module[\"preloadedImages\"][name] = canvas;\r\n                      Browser.URLObject.revokeObjectURL(url);\r\n                      if (onload) onload(byteArray);\r\n                  };\r\n                  img.onerror = function img_onerror(event) {\r\n                      console.log(\"Image \" + url + \" could not be decoded\");\r\n                      if (onerror) onerror();\r\n                  };\r\n                  img.src = url;\r\n              };\r\n              Module[\"preloadPlugins\"].push(imagePlugin);\r\n              var audioPlugin = {};\r\n              audioPlugin[\"canHandle\"] = function audioPlugin_canHandle(name) {\r\n                  return !Module.noAudioDecoding && name.substr(-4) in {\".ogg\": 1, \".wav\": 1, \".mp3\": 1}\r\n              };\r\n              audioPlugin[\"handle\"] = function audioPlugin_handle(byteArray, name, onload, onerror) {\r\n                  var done = false;\r\n\r\n                  function finish(audio) {\r\n                      if (done) return;\r\n                      done = true;\r\n                      Module[\"preloadedAudios\"][name] = audio;\r\n                      if (onload) onload(byteArray);\r\n                  }\r\n\r\n                  function fail() {\r\n                      if (done) return;\r\n                      done = true;\r\n                      Module[\"preloadedAudios\"][name] = new Audio;\r\n                      if (onerror) onerror();\r\n                  }\r\n\r\n                  if (Browser.hasBlobConstructor) {\r\n                      try {\r\n                          var b = new Blob([byteArray], {type: Browser.getMimetype(name)});\r\n                      } catch (e) {\r\n                          return fail()\r\n                      }\r\n                      var url = Browser.URLObject.createObjectURL(b);\r\n                      var audio = new Audio;\r\n                      audio.addEventListener(\"canplaythrough\", (function () {\r\n                          finish(audio);\r\n                      }), false);\r\n                      audio.onerror = function audio_onerror(event) {\r\n                          if (done) return;\r\n                          console.log(\"warning: browser could not fully decode audio \" + name + \", trying slower base64 approach\");\r\n\r\n                          function encode64(data) {\r\n                              var BASE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\r\n                              var PAD = \"=\";\r\n                              var ret = \"\";\r\n                              var leftchar = 0;\r\n                              var leftbits = 0;\r\n                              for (var i = 0; i < data.length; i++) {\r\n                                  leftchar = leftchar << 8 | data[i];\r\n                                  leftbits += 8;\r\n                                  while (leftbits >= 6) {\r\n                                      var curr = leftchar >> leftbits - 6 & 63;\r\n                                      leftbits -= 6;\r\n                                      ret += BASE[curr];\r\n                                  }\r\n                              }\r\n                              if (leftbits == 2) {\r\n                                  ret += BASE[(leftchar & 3) << 4];\r\n                                  ret += PAD + PAD;\r\n                              } else if (leftbits == 4) {\r\n                                  ret += BASE[(leftchar & 15) << 2];\r\n                                  ret += PAD;\r\n                              }\r\n                              return ret\r\n                          }\r\n\r\n                          audio.src = \"data:audio/x-\" + name.substr(-3) + \";base64,\" + encode64(byteArray);\r\n                          finish(audio);\r\n                      };\r\n                      audio.src = url;\r\n                      Browser.safeSetTimeout((function () {\r\n                          finish(audio);\r\n                      }), 1e4);\r\n                  } else {\r\n                      return fail()\r\n                  }\r\n              };\r\n              Module[\"preloadPlugins\"].push(audioPlugin);\r\n              var canvas = Module[\"canvas\"];\r\n\r\n              function pointerLockChange() {\r\n                  Browser.pointerLock = document[\"pointerLockElement\"] === canvas || document[\"mozPointerLockElement\"] === canvas || document[\"webkitPointerLockElement\"] === canvas || document[\"msPointerLockElement\"] === canvas;\r\n              }\r\n\r\n              if (canvas) {\r\n                  canvas.requestPointerLock = canvas[\"requestPointerLock\"] || canvas[\"mozRequestPointerLock\"] || canvas[\"webkitRequestPointerLock\"] || canvas[\"msRequestPointerLock\"] || (function () {\r\n                  });\r\n                  canvas.exitPointerLock = document[\"exitPointerLock\"] || document[\"mozExitPointerLock\"] || document[\"webkitExitPointerLock\"] || document[\"msExitPointerLock\"] || (function () {\r\n                  });\r\n                  canvas.exitPointerLock = canvas.exitPointerLock.bind(document);\r\n                  document.addEventListener(\"pointerlockchange\", pointerLockChange, false);\r\n                  document.addEventListener(\"mozpointerlockchange\", pointerLockChange, false);\r\n                  document.addEventListener(\"webkitpointerlockchange\", pointerLockChange, false);\r\n                  document.addEventListener(\"mspointerlockchange\", pointerLockChange, false);\r\n                  if (Module[\"elementPointerLock\"]) {\r\n                      canvas.addEventListener(\"click\", (function (ev) {\r\n                          if (!Browser.pointerLock && canvas.requestPointerLock) {\r\n                              canvas.requestPointerLock();\r\n                              ev.preventDefault();\r\n                          }\r\n                      }), false);\r\n                  }\r\n              }\r\n          }),\r\n          createContext: (function (canvas, useWebGL, setInModule, webGLContextAttributes) {\r\n              if (useWebGL && Module.ctx && canvas == Module.canvas) return Module.ctx;\r\n              var ctx;\r\n              var contextHandle;\r\n              if (useWebGL) {\r\n                  var contextAttributes = {antialias: false, alpha: false};\r\n                  if (webGLContextAttributes) {\r\n                      for (var attribute in webGLContextAttributes) {\r\n                          contextAttributes[attribute] = webGLContextAttributes[attribute];\r\n                      }\r\n                  }\r\n                  contextHandle = GL.createContext(canvas, contextAttributes);\r\n                  if (contextHandle) {\r\n                      ctx = GL.getContext(contextHandle).GLctx;\r\n                  }\r\n                  canvas.style.backgroundColor = \"black\";\r\n              } else {\r\n                  ctx = canvas.getContext(\"2d\");\r\n              }\r\n              if (!ctx) return null;\r\n              if (setInModule) {\r\n                  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\");\r\n                  Module.ctx = ctx;\r\n                  if (useWebGL) GL.makeContextCurrent(contextHandle);\r\n                  Module.useWebGL = useWebGL;\r\n                  Browser.moduleContextCreatedCallbacks.forEach((function (callback) {\r\n                      callback();\r\n                  }));\r\n                  Browser.init();\r\n              }\r\n              return ctx\r\n          }),\r\n          destroyContext: (function (canvas, useWebGL, setInModule) {\r\n          }),\r\n          fullScreenHandlersInstalled: false,\r\n          lockPointer: undefined,\r\n          resizeCanvas: undefined,\r\n          requestFullScreen: (function (lockPointer, resizeCanvas, vrDevice) {\r\n              Browser.lockPointer = lockPointer;\r\n              Browser.resizeCanvas = resizeCanvas;\r\n              Browser.vrDevice = vrDevice;\r\n              if (typeof Browser.lockPointer === \"undefined\") Browser.lockPointer = true;\r\n              if (typeof Browser.resizeCanvas === \"undefined\") Browser.resizeCanvas = false;\r\n              if (typeof Browser.vrDevice === \"undefined\") Browser.vrDevice = null;\r\n              var canvas = Module[\"canvas\"];\r\n\r\n              function fullScreenChange() {\r\n                  Browser.isFullScreen = false;\r\n                  var canvasContainer = canvas.parentNode;\r\n                  if ((document[\"webkitFullScreenElement\"] || document[\"webkitFullscreenElement\"] || document[\"mozFullScreenElement\"] || document[\"mozFullscreenElement\"] || document[\"fullScreenElement\"] || document[\"fullscreenElement\"] || document[\"msFullScreenElement\"] || document[\"msFullscreenElement\"] || document[\"webkitCurrentFullScreenElement\"]) === canvasContainer) {\r\n                      canvas.cancelFullScreen = document[\"cancelFullScreen\"] || document[\"mozCancelFullScreen\"] || document[\"webkitCancelFullScreen\"] || document[\"msExitFullscreen\"] || document[\"exitFullscreen\"] || (function () {\r\n                      });\r\n                      canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);\r\n                      if (Browser.lockPointer) canvas.requestPointerLock();\r\n                      Browser.isFullScreen = true;\r\n                      if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();\r\n                  } else {\r\n                      canvasContainer.parentNode.insertBefore(canvas, canvasContainer);\r\n                      canvasContainer.parentNode.removeChild(canvasContainer);\r\n                      if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();\r\n                  }\r\n                  if (Module[\"onFullScreen\"]) Module[\"onFullScreen\"](Browser.isFullScreen);\r\n                  Browser.updateCanvasDimensions(canvas);\r\n              }\r\n\r\n              if (!Browser.fullScreenHandlersInstalled) {\r\n                  Browser.fullScreenHandlersInstalled = true;\r\n                  document.addEventListener(\"fullscreenchange\", fullScreenChange, false);\r\n                  document.addEventListener(\"mozfullscreenchange\", fullScreenChange, false);\r\n                  document.addEventListener(\"webkitfullscreenchange\", fullScreenChange, false);\r\n                  document.addEventListener(\"MSFullscreenChange\", fullScreenChange, false);\r\n              }\r\n              var canvasContainer = document.createElement(\"div\");\r\n              canvas.parentNode.insertBefore(canvasContainer, canvas);\r\n              canvasContainer.appendChild(canvas);\r\n              canvasContainer.requestFullScreen = canvasContainer[\"requestFullScreen\"] || canvasContainer[\"mozRequestFullScreen\"] || canvasContainer[\"msRequestFullscreen\"] || (canvasContainer[\"webkitRequestFullScreen\"] ? (function () {\r\n                  canvasContainer[\"webkitRequestFullScreen\"](Element[\"ALLOW_KEYBOARD_INPUT\"]);\r\n              }) : null);\r\n              if (vrDevice) {\r\n                  canvasContainer.requestFullScreen({vrDisplay: vrDevice});\r\n              } else {\r\n                  canvasContainer.requestFullScreen();\r\n              }\r\n          }),\r\n          nextRAF: 0,\r\n          fakeRequestAnimationFrame: (function (func) {\r\n              var now = Date.now();\r\n              if (Browser.nextRAF === 0) {\r\n                  Browser.nextRAF = now + 1e3 / 60;\r\n              } else {\r\n                  while (now + 2 >= Browser.nextRAF) {\r\n                      Browser.nextRAF += 1e3 / 60;\r\n                  }\r\n              }\r\n              var delay = Math.max(Browser.nextRAF - now, 0);\r\n              setTimeout(func, delay);\r\n          }),\r\n          requestAnimationFrame: function requestAnimationFrame(func) {\r\n              if (typeof window === \"undefined\") {\r\n                  Browser.fakeRequestAnimationFrame(func);\r\n              } else {\r\n                  if (!window.requestAnimationFrame) {\r\n                      window.requestAnimationFrame = window[\"requestAnimationFrame\"] || window[\"mozRequestAnimationFrame\"] || window[\"webkitRequestAnimationFrame\"] || window[\"msRequestAnimationFrame\"] || window[\"oRequestAnimationFrame\"] || Browser.fakeRequestAnimationFrame;\r\n                  }\r\n                  window.requestAnimationFrame(func);\r\n              }\r\n          },\r\n          safeCallback: (function (func) {\r\n              return (function () {\r\n                  if (!ABORT) return func.apply(null, arguments)\r\n              })\r\n          }),\r\n          allowAsyncCallbacks: true,\r\n          queuedAsyncCallbacks: [],\r\n          pauseAsyncCallbacks: (function () {\r\n              Browser.allowAsyncCallbacks = false;\r\n          }),\r\n          resumeAsyncCallbacks: (function () {\r\n              Browser.allowAsyncCallbacks = true;\r\n              if (Browser.queuedAsyncCallbacks.length > 0) {\r\n                  var callbacks = Browser.queuedAsyncCallbacks;\r\n                  Browser.queuedAsyncCallbacks = [];\r\n                  callbacks.forEach((function (func) {\r\n                      func();\r\n                  }));\r\n              }\r\n          }),\r\n          safeRequestAnimationFrame: (function (func) {\r\n              return Browser.requestAnimationFrame((function () {\r\n                  if (ABORT) return;\r\n                  if (Browser.allowAsyncCallbacks) {\r\n                      func();\r\n                  } else {\r\n                      Browser.queuedAsyncCallbacks.push(func);\r\n                  }\r\n              }))\r\n          }),\r\n          safeSetTimeout: (function (func, timeout) {\r\n              Module[\"noExitRuntime\"] = true;\r\n              return setTimeout((function () {\r\n                  if (ABORT) return;\r\n                  if (Browser.allowAsyncCallbacks) {\r\n                      func();\r\n                  } else {\r\n                      Browser.queuedAsyncCallbacks.push(func);\r\n                  }\r\n              }), timeout)\r\n          }),\r\n          safeSetInterval: (function (func, timeout) {\r\n              Module[\"noExitRuntime\"] = true;\r\n              return setInterval((function () {\r\n                  if (ABORT) return;\r\n                  if (Browser.allowAsyncCallbacks) {\r\n                      func();\r\n                  }\r\n              }), timeout)\r\n          }),\r\n          getMimetype: (function (name) {\r\n              return {\r\n                  \"jpg\": \"image/jpeg\",\r\n                  \"jpeg\": \"image/jpeg\",\r\n                  \"png\": \"image/png\",\r\n                  \"bmp\": \"image/bmp\",\r\n                  \"ogg\": \"audio/ogg\",\r\n                  \"wav\": \"audio/wav\",\r\n                  \"mp3\": \"audio/mpeg\"\r\n              }[name.substr(name.lastIndexOf(\".\") + 1)]\r\n          }),\r\n          getUserMedia: (function (func) {\r\n              if (!window.getUserMedia) {\r\n                  window.getUserMedia = navigator[\"getUserMedia\"] || navigator[\"mozGetUserMedia\"];\r\n              }\r\n              window.getUserMedia(func);\r\n          }),\r\n          getMovementX: (function (event) {\r\n              return event[\"movementX\"] || event[\"mozMovementX\"] || event[\"webkitMovementX\"] || 0\r\n          }),\r\n          getMovementY: (function (event) {\r\n              return event[\"movementY\"] || event[\"mozMovementY\"] || event[\"webkitMovementY\"] || 0\r\n          }),\r\n          getMouseWheelDelta: (function (event) {\r\n              var delta = 0;\r\n              switch (event.type) {\r\n                  case\"DOMMouseScroll\":\r\n                      delta = event.detail;\r\n                      break;\r\n                  case\"mousewheel\":\r\n                      delta = event.wheelDelta;\r\n                      break;\r\n                  case\"wheel\":\r\n                      delta = event[\"deltaY\"];\r\n                      break;\r\n                  default:\r\n                      throw \"unrecognized mouse wheel event: \" + event.type\r\n              }\r\n              return delta\r\n          }),\r\n          mouseX: 0,\r\n          mouseY: 0,\r\n          mouseMovementX: 0,\r\n          mouseMovementY: 0,\r\n          touches: {},\r\n          lastTouches: {},\r\n          calculateMouseEvent: (function (event) {\r\n              if (Browser.pointerLock) {\r\n                  if (event.type != \"mousemove\" && \"mozMovementX\" in event) {\r\n                      Browser.mouseMovementX = Browser.mouseMovementY = 0;\r\n                  } else {\r\n                      Browser.mouseMovementX = Browser.getMovementX(event);\r\n                      Browser.mouseMovementY = Browser.getMovementY(event);\r\n                  }\r\n                  if (typeof SDL != \"undefined\") {\r\n                      Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;\r\n                      Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;\r\n                  } else {\r\n                      Browser.mouseX += Browser.mouseMovementX;\r\n                      Browser.mouseY += Browser.mouseMovementY;\r\n                  }\r\n              } else {\r\n                  var rect = Module[\"canvas\"].getBoundingClientRect();\r\n                  var cw = Module[\"canvas\"].width;\r\n                  var ch = Module[\"canvas\"].height;\r\n                  var scrollX = typeof window.scrollX !== \"undefined\" ? window.scrollX : window.pageXOffset;\r\n                  var scrollY = typeof window.scrollY !== \"undefined\" ? window.scrollY : window.pageYOffset;\r\n                  if (event.type === \"touchstart\" || event.type === \"touchend\" || event.type === \"touchmove\") {\r\n                      var touch = event.touch;\r\n                      if (touch === undefined) {\r\n                          return\r\n                      }\r\n                      var adjustedX = touch.pageX - (scrollX + rect.left);\r\n                      var adjustedY = touch.pageY - (scrollY + rect.top);\r\n                      adjustedX = adjustedX * (cw / rect.width);\r\n                      adjustedY = adjustedY * (ch / rect.height);\r\n                      var coords = {x: adjustedX, y: adjustedY};\r\n                      if (event.type === \"touchstart\") {\r\n                          Browser.lastTouches[touch.identifier] = coords;\r\n                          Browser.touches[touch.identifier] = coords;\r\n                      } else if (event.type === \"touchend\" || event.type === \"touchmove\") {\r\n                          var last = Browser.touches[touch.identifier];\r\n                          if (!last) last = coords;\r\n                          Browser.lastTouches[touch.identifier] = last;\r\n                          Browser.touches[touch.identifier] = coords;\r\n                      }\r\n                      return\r\n                  }\r\n                  var x = event.pageX - (scrollX + rect.left);\r\n                  var y = event.pageY - (scrollY + rect.top);\r\n                  x = x * (cw / rect.width);\r\n                  y = y * (ch / rect.height);\r\n                  Browser.mouseMovementX = x - Browser.mouseX;\r\n                  Browser.mouseMovementY = y - Browser.mouseY;\r\n                  Browser.mouseX = x;\r\n                  Browser.mouseY = y;\r\n              }\r\n          }),\r\n          xhrLoad: (function (url, onload, onerror) {\r\n              var xhr = new XMLHttpRequest;\r\n              xhr.open(\"GET\", url, true);\r\n              xhr.responseType = \"arraybuffer\";\r\n              xhr.onload = function xhr_onload() {\r\n                  if (xhr.status == 200 || xhr.status == 0 && xhr.response) {\r\n                      onload(xhr.response);\r\n                  } else {\r\n                      onerror();\r\n                  }\r\n              };\r\n              xhr.onerror = onerror;\r\n              xhr.send(null);\r\n          }),\r\n          asyncLoad: (function (url, onload, onerror, noRunDep) {\r\n              Browser.xhrLoad(url, (function (arrayBuffer) {\r\n                  assert(arrayBuffer, 'Loading data file \"' + url + '\" failed (no arrayBuffer).');\r\n                  onload(new Uint8Array(arrayBuffer));\r\n                  if (!noRunDep) removeRunDependency();\r\n              }), (function (event) {\r\n                  if (onerror) {\r\n                      onerror();\r\n                  } else {\r\n                      throw 'Loading data file \"' + url + '\" failed.'\r\n                  }\r\n              }));\r\n              if (!noRunDep) addRunDependency();\r\n          }),\r\n          resizeListeners: [],\r\n          updateResizeListeners: (function () {\r\n              var canvas = Module[\"canvas\"];\r\n              Browser.resizeListeners.forEach((function (listener) {\r\n                  listener(canvas.width, canvas.height);\r\n              }));\r\n          }),\r\n          setCanvasSize: (function (width, height, noUpdates) {\r\n              var canvas = Module[\"canvas\"];\r\n              Browser.updateCanvasDimensions(canvas, width, height);\r\n              if (!noUpdates) Browser.updateResizeListeners();\r\n          }),\r\n          windowedWidth: 0,\r\n          windowedHeight: 0,\r\n          setFullScreenCanvasSize: (function () {\r\n              if (typeof SDL != \"undefined\") {\r\n                  var flags = HEAPU32[SDL.screen + Runtime.QUANTUM_SIZE * 0 >> 2];\r\n                  flags = flags | 8388608;\r\n                  HEAP32[SDL.screen + Runtime.QUANTUM_SIZE * 0 >> 2] = flags;\r\n              }\r\n              Browser.updateResizeListeners();\r\n          }),\r\n          setWindowedCanvasSize: (function () {\r\n              if (typeof SDL != \"undefined\") {\r\n                  var flags = HEAPU32[SDL.screen + Runtime.QUANTUM_SIZE * 0 >> 2];\r\n                  flags = flags & ~8388608;\r\n                  HEAP32[SDL.screen + Runtime.QUANTUM_SIZE * 0 >> 2] = flags;\r\n              }\r\n              Browser.updateResizeListeners();\r\n          }),\r\n          updateCanvasDimensions: (function (canvas, wNative, hNative) {\r\n              if (wNative && hNative) {\r\n                  canvas.widthNative = wNative;\r\n                  canvas.heightNative = hNative;\r\n              } else {\r\n                  wNative = canvas.widthNative;\r\n                  hNative = canvas.heightNative;\r\n              }\r\n              var w = wNative;\r\n              var h = hNative;\r\n              if (Module[\"forcedAspectRatio\"] && Module[\"forcedAspectRatio\"] > 0) {\r\n                  if (w / h < Module[\"forcedAspectRatio\"]) {\r\n                      w = Math.round(h * Module[\"forcedAspectRatio\"]);\r\n                  } else {\r\n                      h = Math.round(w / Module[\"forcedAspectRatio\"]);\r\n                  }\r\n              }\r\n              if ((document[\"webkitFullScreenElement\"] || document[\"webkitFullscreenElement\"] || document[\"mozFullScreenElement\"] || document[\"mozFullscreenElement\"] || document[\"fullScreenElement\"] || document[\"fullscreenElement\"] || document[\"msFullScreenElement\"] || document[\"msFullscreenElement\"] || document[\"webkitCurrentFullScreenElement\"]) === canvas.parentNode && typeof screen != \"undefined\") {\r\n                  var factor = Math.min(screen.width / w, screen.height / h);\r\n                  w = Math.round(w * factor);\r\n                  h = Math.round(h * factor);\r\n              }\r\n              if (Browser.resizeCanvas) {\r\n                  if (canvas.width != w) canvas.width = w;\r\n                  if (canvas.height != h) canvas.height = h;\r\n                  if (typeof canvas.style != \"undefined\") {\r\n                      canvas.style.removeProperty(\"width\");\r\n                      canvas.style.removeProperty(\"height\");\r\n                  }\r\n              } else {\r\n                  if (canvas.width != wNative) canvas.width = wNative;\r\n                  if (canvas.height != hNative) canvas.height = hNative;\r\n                  if (typeof canvas.style != \"undefined\") {\r\n                      if (w != wNative || h != hNative) {\r\n                          canvas.style.setProperty(\"width\", w + \"px\", \"important\");\r\n                          canvas.style.setProperty(\"height\", h + \"px\", \"important\");\r\n                      } else {\r\n                          canvas.style.removeProperty(\"width\");\r\n                          canvas.style.removeProperty(\"height\");\r\n                      }\r\n                  }\r\n              }\r\n          }),\r\n          wgetRequests: {},\r\n          nextWgetRequestHandle: 0,\r\n          getNextWgetRequestHandle: (function () {\r\n              var handle = Browser.nextWgetRequestHandle;\r\n              Browser.nextWgetRequestHandle++;\r\n              return handle\r\n          })\r\n      };\r\n\r\n      function _time(ptr) {\r\n          var ret = Date.now() / 1e3 | 0;\r\n          if (ptr) {\r\n              HEAP32[ptr >> 2] = ret;\r\n          }\r\n          return ret\r\n      }\r\n\r\n      function _pthread_self() {\r\n          return 0\r\n      }\r\n\r\n      Module[\"requestFullScreen\"] = function Module_requestFullScreen(lockPointer, resizeCanvas, vrDevice) {\r\n          Browser.requestFullScreen(lockPointer, resizeCanvas, vrDevice);\r\n      };\r\n      Module[\"requestAnimationFrame\"] = function Module_requestAnimationFrame(func) {\r\n          Browser.requestAnimationFrame(func);\r\n      };\r\n      Module[\"setCanvasSize\"] = function Module_setCanvasSize(width, height, noUpdates) {\r\n          Browser.setCanvasSize(width, height, noUpdates);\r\n      };\r\n      Module[\"pauseMainLoop\"] = function Module_pauseMainLoop() {\r\n          Browser.mainLoop.pause();\r\n      };\r\n      Module[\"resumeMainLoop\"] = function Module_resumeMainLoop() {\r\n          Browser.mainLoop.resume();\r\n      };\r\n      Module[\"getUserMedia\"] = function Module_getUserMedia() {\r\n          Browser.getUserMedia();\r\n      };\r\n      Module[\"createContext\"] = function Module_createContext(canvas, useWebGL, setInModule, webGLContextAttributes) {\r\n          return Browser.createContext(canvas, useWebGL, setInModule, webGLContextAttributes)\r\n      };\r\n      FS.staticInit();\r\n      __ATINIT__.unshift((function () {\r\n          if (!Module[\"noFSInit\"] && !FS.init.initialized) FS.init();\r\n      }));\r\n      __ATMAIN__.push((function () {\r\n          FS.ignorePermissions = false;\r\n      }));\r\n      __ATEXIT__.push((function () {\r\n          FS.quit();\r\n      }));\r\n      Module[\"FS_createFolder\"] = FS.createFolder;\r\n      Module[\"FS_createPath\"] = FS.createPath;\r\n      Module[\"FS_createDataFile\"] = FS.createDataFile;\r\n      Module[\"FS_createPreloadedFile\"] = FS.createPreloadedFile;\r\n      Module[\"FS_createLazyFile\"] = FS.createLazyFile;\r\n      Module[\"FS_createLink\"] = FS.createLink;\r\n      Module[\"FS_createDevice\"] = FS.createDevice;\r\n      Module[\"FS_unlink\"] = FS.unlink;\r\n      __ATINIT__.unshift((function () {\r\n      }));\r\n      __ATEXIT__.push((function () {\r\n      }));\r\n      STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);\r\n      staticSealed = true;\r\n      STACK_MAX = STACK_BASE + TOTAL_STACK;\r\n      DYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);\r\n      assert(DYNAMIC_BASE < TOTAL_MEMORY, \"TOTAL_MEMORY not big enough for stack\");\r\n      Module.asmGlobalArg = {\r\n          \"Math\": Math,\r\n          \"Int8Array\": Int8Array,\r\n          \"Int16Array\": Int16Array,\r\n          \"Int32Array\": Int32Array,\r\n          \"Uint8Array\": Uint8Array,\r\n          \"Uint16Array\": Uint16Array,\r\n          \"Uint32Array\": Uint32Array,\r\n          \"Float32Array\": Float32Array,\r\n          \"Float64Array\": Float64Array,\r\n          \"NaN\": NaN,\r\n          \"Infinity\": Infinity\r\n      };\r\n      Module.asmLibraryArg = {\r\n          \"abort\": abort,\r\n          \"assert\": assert,\r\n          \"_sysconf\": _sysconf,\r\n          \"_pthread_self\": _pthread_self,\r\n          \"_abort\": _abort,\r\n          \"___setErrNo\": ___setErrNo,\r\n          \"_sbrk\": _sbrk,\r\n          \"_time\": _time,\r\n          \"_emscripten_set_main_loop_timing\": _emscripten_set_main_loop_timing,\r\n          \"_emscripten_memcpy_big\": _emscripten_memcpy_big,\r\n          \"_emscripten_set_main_loop\": _emscripten_set_main_loop,\r\n          \"STACKTOP\": STACKTOP,\r\n          \"STACK_MAX\": STACK_MAX,\r\n          \"tempDoublePtr\": tempDoublePtr,\r\n          \"ABORT\": ABORT\r\n      };// EMSCRIPTEN_START_ASM\r\n      var asm = (function (global, env, buffer) {\r\n          \"use asm\";\r\n          var a = new global.Int8Array(buffer);\r\n          var b = new global.Int16Array(buffer);\r\n          var c = new global.Int32Array(buffer);\r\n          var d = new global.Uint8Array(buffer);\r\n          var e = new global.Uint16Array(buffer);\r\n          var f = new global.Uint32Array(buffer);\r\n          var g = new global.Float32Array(buffer);\r\n          var h = new global.Float64Array(buffer);\r\n          var i = env.STACKTOP | 0;\r\n          var j = env.STACK_MAX | 0;\r\n          var k = env.tempDoublePtr | 0;\r\n          var l = env.ABORT | 0;\r\n          var m = 0;\r\n          var n = 0;\r\n          var o = 0;\r\n          var p = 0;\r\n          var q = global.NaN, r = global.Infinity;\r\n          var s = 0, t = 0, u = 0, v = 0, w = 0.0, x = 0, y = 0, z = 0, A = 0.0;\r\n          var B = 0;\r\n          var C = 0;\r\n          var D = 0;\r\n          var E = 0;\r\n          var F = 0;\r\n          var G = 0;\r\n          var H = 0;\r\n          var I = 0;\r\n          var J = 0;\r\n          var K = 0;\r\n          var L = global.Math.floor;\r\n          var M = global.Math.abs;\r\n          var N = global.Math.sqrt;\r\n          var O = global.Math.pow;\r\n          var P = global.Math.cos;\r\n          var Q = global.Math.sin;\r\n          var R = global.Math.tan;\r\n          var S = global.Math.acos;\r\n          var T = global.Math.asin;\r\n          var U = global.Math.atan;\r\n          var V = global.Math.atan2;\r\n          var W = global.Math.exp;\r\n          var X = global.Math.log;\r\n          var Y = global.Math.ceil;\r\n          var Z = global.Math.imul;\r\n          var _ = global.Math.min;\r\n          var $ = global.Math.clz32;\r\n          var aa = env.abort;\r\n          var ba = env.assert;\r\n          var ca = env._sysconf;\r\n          var da = env._pthread_self;\r\n          var ea = env._abort;\r\n          var fa = env.___setErrNo;\r\n          var ga = env._sbrk;\r\n          var ha = env._time;\r\n          var ia = env._emscripten_set_main_loop_timing;\r\n          var ja = env._emscripten_memcpy_big;\r\n          var ka = env._emscripten_set_main_loop;\r\n          var la = 0.0;\r\n\r\n  // EMSCRIPTEN_START_FUNCS\r\n          function ma(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              b = i;\r\n              i = i + a | 0;\r\n              i = i + 15 & -16;\r\n              return b | 0\r\n          }\r\n\r\n          function na() {\r\n              return i | 0\r\n          }\r\n\r\n          function oa(a) {\r\n              a = a | 0;\r\n              i = a;\r\n          }\r\n\r\n          function pa(a, b) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              i = a;\r\n              j = b;\r\n          }\r\n\r\n          function qa(a, b) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              if (!m) {\r\n                  m = a;\r\n                  n = b;\r\n              }\r\n          }\r\n\r\n          function ra(b) {\r\n              b = b | 0;\r\n              a[k >> 0] = a[b >> 0];\r\n              a[k + 1 >> 0] = a[b + 1 >> 0];\r\n              a[k + 2 >> 0] = a[b + 2 >> 0];\r\n              a[k + 3 >> 0] = a[b + 3 >> 0];\r\n          }\r\n\r\n          function sa(b) {\r\n              b = b | 0;\r\n              a[k >> 0] = a[b >> 0];\r\n              a[k + 1 >> 0] = a[b + 1 >> 0];\r\n              a[k + 2 >> 0] = a[b + 2 >> 0];\r\n              a[k + 3 >> 0] = a[b + 3 >> 0];\r\n              a[k + 4 >> 0] = a[b + 4 >> 0];\r\n              a[k + 5 >> 0] = a[b + 5 >> 0];\r\n              a[k + 6 >> 0] = a[b + 6 >> 0];\r\n              a[k + 7 >> 0] = a[b + 7 >> 0];\r\n          }\r\n\r\n          function ta(a) {\r\n              a = a | 0;\r\n              B = a;\r\n          }\r\n\r\n          function ua() {\r\n              return B | 0\r\n          }\r\n\r\n          function va() {\r\n              var a = 0, b = 0;\r\n              b = i;\r\n              i = i + 16 | 0;\r\n              a = b;\r\n              c[a >> 2] = 0;\r\n              Db(a, 31756) | 0;\r\n              i = b;\r\n              return c[a >> 2] | 0\r\n          }\r\n\r\n          function wa(a) {\r\n              a = a | 0;\r\n              var b = 0, d = 0;\r\n              b = i;\r\n              i = i + 16 | 0;\r\n              d = b;\r\n              c[d >> 2] = a;\r\n              Eb(d);\r\n              i = b;\r\n              return\r\n          }\r\n\r\n          function xa(a, b, c, e) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              c = c | 0;\r\n              e = e | 0;\r\n              Ea(a, (e | 0) == 0 ? (d[b >> 0] | 0) >>> 3 & 15 : 15, b + 1 | 0, c, 2) | 0;\r\n              return\r\n          }\r\n\r\n          function ya(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              b = Je(8) | 0;\r\n              Hb(b, b + 4 | 0, a) | 0;\r\n              return b | 0\r\n          }\r\n\r\n          function za(a) {\r\n              a = a | 0;\r\n              Ib(a, a + 4 | 0);\r\n              Ke(a);\r\n              return\r\n          }\r\n\r\n          function Aa(b, e, f, g, h) {\r\n              b = b | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var j = 0;\r\n              h = i;\r\n              i = i + 16 | 0;\r\n              j = h;\r\n              c[j >> 2] = e;\r\n              f = (Jb(c[b >> 2] | 0, c[b + 4 >> 2] | 0, e, f, g, j, 3) | 0) << 16 >> 16;\r\n              a[g >> 0] = d[g >> 0] | 0 | 4;\r\n              i = h;\r\n              return f | 0\r\n          }\r\n\r\n          function Ba(a) {\r\n              a = a | 0;\r\n              if (!a) a = -1; else {\r\n                  b[a >> 1] = 4096;\r\n                  a = 0;\r\n              }\r\n              return a | 0\r\n          }\r\n\r\n          function Ca(a, d, e, f, g, h) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0;\r\n              m = c[h >> 2] | 0;\r\n              q = g << 16 >> 16 > 0;\r\n              if (q) {\r\n                  i = 0;\r\n                  j = 0;\r\n                  do {\r\n                      l = b[e + (i << 1) >> 1] | 0;\r\n                      l = Z(l, l) | 0;\r\n                      if ((l | 0) != 1073741824) {\r\n                          k = (l << 1) + j | 0;\r\n                          if ((l ^ j | 0) > 0 & (k ^ j | 0) < 0) {\r\n                              c[h >> 2] = 1;\r\n                              j = (j >>> 31) + 2147483647 | 0;\r\n                          } else j = k;\r\n                      } else {\r\n                          c[h >> 2] = 1;\r\n                          j = 2147483647;\r\n                      }\r\n                      i = i + 1 | 0;\r\n                  } while ((i & 65535) << 16 >> 16 != g << 16 >> 16);\r\n                  if ((j | 0) == 2147483647) {\r\n                      c[h >> 2] = m;\r\n                      l = 0;\r\n                      k = 0;\r\n                      do {\r\n                          j = b[e + (l << 1) >> 1] >> 2;\r\n                          j = Z(j, j) | 0;\r\n                          if ((j | 0) != 1073741824) {\r\n                              i = (j << 1) + k | 0;\r\n                              if ((j ^ k | 0) > 0 & (i ^ k | 0) < 0) {\r\n                                  c[h >> 2] = 1;\r\n                                  k = (k >>> 31) + 2147483647 | 0;\r\n                              } else k = i;\r\n                          } else {\r\n                              c[h >> 2] = 1;\r\n                              k = 2147483647;\r\n                          }\r\n                          l = l + 1 | 0;\r\n                      } while ((l & 65535) << 16 >> 16 != g << 16 >> 16)\r\n                  } else p = 8;\r\n              } else {\r\n                  j = 0;\r\n                  p = 8;\r\n              }\r\n              if ((p | 0) == 8) k = j >> 4;\r\n              if (!k) {\r\n                  b[a >> 1] = 0;\r\n                  return\r\n              }\r\n              o = ((pe(k) | 0) & 65535) + 65535 | 0;\r\n              j = o << 16 >> 16;\r\n              if ((o & 65535) << 16 >> 16 > 0) {\r\n                  i = k << j;\r\n                  if ((i >> j | 0) == (k | 0)) k = i; else k = k >> 31 ^ 2147483647;\r\n              } else {\r\n                  j = 0 - j << 16;\r\n                  if ((j | 0) < 2031616) k = k >> (j >> 16); else k = 0;\r\n              }\r\n              n = Ce(k, h) | 0;\r\n              i = c[h >> 2] | 0;\r\n              if (q) {\r\n                  j = 0;\r\n                  k = 0;\r\n                  do {\r\n                      m = b[d + (j << 1) >> 1] | 0;\r\n                      m = Z(m, m) | 0;\r\n                      if ((m | 0) != 1073741824) {\r\n                          l = (m << 1) + k | 0;\r\n                          if ((m ^ k | 0) > 0 & (l ^ k | 0) < 0) {\r\n                              c[h >> 2] = 1;\r\n                              k = (k >>> 31) + 2147483647 | 0;\r\n                          } else k = l;\r\n                      } else {\r\n                          c[h >> 2] = 1;\r\n                          k = 2147483647;\r\n                      }\r\n                      j = j + 1 | 0;\r\n                  } while ((j & 65535) << 16 >> 16 != g << 16 >> 16);\r\n                  if ((k | 0) == 2147483647) {\r\n                      c[h >> 2] = i;\r\n                      m = 0;\r\n                      k = 0;\r\n                      do {\r\n                          l = b[d + (m << 1) >> 1] >> 2;\r\n                          l = Z(l, l) | 0;\r\n                          if ((l | 0) != 1073741824) {\r\n                              j = (l << 1) + k | 0;\r\n                              if ((l ^ k | 0) > 0 & (j ^ k | 0) < 0) {\r\n                                  c[h >> 2] = 1;\r\n                                  k = (k >>> 31) + 2147483647 | 0;\r\n                              } else k = j;\r\n                          } else {\r\n                              c[h >> 2] = 1;\r\n                              k = 2147483647;\r\n                          }\r\n                          m = m + 1 | 0;\r\n                      } while ((m & 65535) << 16 >> 16 != g << 16 >> 16)\r\n                  } else p = 29;\r\n              } else {\r\n                  k = 0;\r\n                  p = 29;\r\n              }\r\n              if ((p | 0) == 29) k = k >> 4;\r\n              if (!k) l = 0; else {\r\n                  j = (pe(k) | 0) << 16 >> 16;\r\n                  i = o - j | 0;\r\n                  l = i & 65535;\r\n                  k = (Td(n, Ce(k << j, h) | 0) | 0) << 16 >> 16;\r\n                  j = k << 7;\r\n                  i = i << 16 >> 16;\r\n                  if (l << 16 >> 16 > 0) i = l << 16 >> 16 < 31 ? j >> i : 0; else {\r\n                      p = 0 - i << 16 >> 16;\r\n                      i = j << p;\r\n                      i = (i >> p | 0) == (j | 0) ? i : k >> 24 ^ 2147483647;\r\n                  }\r\n                  l = (Z(((ce(i, h) | 0) << 9) + 32768 >> 16, 32767 - (f & 65535) << 16 >> 16) | 0) >>> 15 << 16 >> 16;\r\n              }\r\n              i = b[a >> 1] | 0;\r\n              if (q) {\r\n                  k = f << 16 >> 16;\r\n                  j = 0;\r\n                  while (1) {\r\n                      f = ((Z(i << 16 >> 16, k) | 0) >>> 15 & 65535) + l | 0;\r\n                      i = f & 65535;\r\n                      b[e >> 1] = (Z(b[e >> 1] | 0, f << 16 >> 16) | 0) >>> 12;\r\n                      j = j + 1 << 16 >> 16;\r\n                      if (j << 16 >> 16 >= g << 16 >> 16) break; else e = e + 2 | 0;\r\n                  }\r\n              }\r\n              b[a >> 1] = i;\r\n              return\r\n          }\r\n\r\n          function Da(a, d, e, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              var g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0;\r\n              i = c[f >> 2] | 0;\r\n              g = e << 16 >> 16 > 0;\r\n              if (g) {\r\n                  j = 0;\r\n                  h = 0;\r\n                  do {\r\n                      l = b[d + (j << 1) >> 1] | 0;\r\n                      l = Z(l, l) | 0;\r\n                      if ((l | 0) != 1073741824) {\r\n                          k = (l << 1) + h | 0;\r\n                          if ((l ^ h | 0) > 0 & (k ^ h | 0) < 0) {\r\n                              c[f >> 2] = 1;\r\n                              h = (h >>> 31) + 2147483647 | 0;\r\n                          } else h = k;\r\n                      } else {\r\n                          c[f >> 2] = 1;\r\n                          h = 2147483647;\r\n                      }\r\n                      j = j + 1 | 0;\r\n                  } while ((j & 65535) << 16 >> 16 != e << 16 >> 16);\r\n                  if ((h | 0) == 2147483647) {\r\n                      c[f >> 2] = i;\r\n                      l = 0;\r\n                      i = 0;\r\n                      do {\r\n                          k = b[d + (l << 1) >> 1] >> 2;\r\n                          k = Z(k, k) | 0;\r\n                          if ((k | 0) != 1073741824) {\r\n                              j = (k << 1) + i | 0;\r\n                              if ((k ^ i | 0) > 0 & (j ^ i | 0) < 0) {\r\n                                  c[f >> 2] = 1;\r\n                                  i = (i >>> 31) + 2147483647 | 0;\r\n                              } else i = j;\r\n                          } else {\r\n                              c[f >> 2] = 1;\r\n                              i = 2147483647;\r\n                          }\r\n                          l = l + 1 | 0;\r\n                      } while ((l & 65535) << 16 >> 16 != e << 16 >> 16)\r\n                  } else o = 8;\r\n              } else {\r\n                  h = 0;\r\n                  o = 8;\r\n              }\r\n              if ((o | 0) == 8) i = h >> 4;\r\n              if (!i) return;\r\n              n = ((pe(i) | 0) & 65535) + 65535 | 0;\r\n              k = n << 16 >> 16;\r\n              if ((n & 65535) << 16 >> 16 > 0) {\r\n                  j = i << k;\r\n                  if ((j >> k | 0) == (i | 0)) i = j; else i = i >> 31 ^ 2147483647;\r\n              } else {\r\n                  k = 0 - k << 16;\r\n                  if ((k | 0) < 2031616) i = i >> (k >> 16); else i = 0;\r\n              }\r\n              m = Ce(i, f) | 0;\r\n              i = c[f >> 2] | 0;\r\n              if (g) {\r\n                  j = 0;\r\n                  h = 0;\r\n                  do {\r\n                      l = b[a + (j << 1) >> 1] | 0;\r\n                      l = Z(l, l) | 0;\r\n                      if ((l | 0) != 1073741824) {\r\n                          k = (l << 1) + h | 0;\r\n                          if ((l ^ h | 0) > 0 & (k ^ h | 0) < 0) {\r\n                              c[f >> 2] = 1;\r\n                              h = (h >>> 31) + 2147483647 | 0;\r\n                          } else h = k;\r\n                      } else {\r\n                          c[f >> 2] = 1;\r\n                          h = 2147483647;\r\n                      }\r\n                      j = j + 1 | 0;\r\n                  } while ((j & 65535) << 16 >> 16 != e << 16 >> 16);\r\n                  if ((h | 0) == 2147483647) {\r\n                      c[f >> 2] = i;\r\n                      i = 0;\r\n                      j = 0;\r\n                      do {\r\n                          l = b[a + (i << 1) >> 1] >> 2;\r\n                          l = Z(l, l) | 0;\r\n                          if ((l | 0) != 1073741824) {\r\n                              k = (l << 1) + j | 0;\r\n                              if ((l ^ j | 0) > 0 & (k ^ j | 0) < 0) {\r\n                                  c[f >> 2] = 1;\r\n                                  j = (j >>> 31) + 2147483647 | 0;\r\n                              } else j = k;\r\n                          } else {\r\n                              c[f >> 2] = 1;\r\n                              j = 2147483647;\r\n                          }\r\n                          i = i + 1 | 0;\r\n                      } while ((i & 65535) << 16 >> 16 != e << 16 >> 16)\r\n                  } else o = 28;\r\n              } else {\r\n                  h = 0;\r\n                  o = 28;\r\n              }\r\n              if ((o | 0) == 28) j = h >> 4;\r\n              if (!j) g = 0; else {\r\n                  l = pe(j) | 0;\r\n                  k = l << 16 >> 16;\r\n                  if (l << 16 >> 16 > 0) {\r\n                      i = j << k;\r\n                      if ((i >> k | 0) == (j | 0)) j = i; else j = j >> 31 ^ 2147483647;\r\n                  } else {\r\n                      k = 0 - k << 16;\r\n                      if ((k | 0) < 2031616) j = j >> (k >> 16); else j = 0;\r\n                  }\r\n                  i = n - (l & 65535) | 0;\r\n                  k = i & 65535;\r\n                  h = (Td(m, Ce(j, f) | 0) | 0) << 16 >> 16;\r\n                  g = h << 7;\r\n                  i = i << 16 >> 16;\r\n                  if (k << 16 >> 16 > 0) g = k << 16 >> 16 < 31 ? g >> i : 0; else {\r\n                      n = 0 - i << 16 >> 16;\r\n                      a = g << n;\r\n                      g = (a >> n | 0) == (g | 0) ? a : h >> 24 ^ 2147483647;\r\n                  }\r\n                  g = ce(g, f) | 0;\r\n                  if ((g | 0) > 4194303) g = 2147483647; else g = (g | 0) < -4194304 ? -2147483648 : g << 9;\r\n                  g = Ce(g, f) | 0;\r\n              }\r\n              h = (e & 65535) + 65535 & 65535;\r\n              if (h << 16 >> 16 <= -1) return;\r\n              l = g << 16 >> 16;\r\n              k = e + -1 << 16 >> 16 << 16 >> 16;\r\n              while (1) {\r\n                  i = d + (k << 1) | 0;\r\n                  g = Z(b[i >> 1] | 0, l) | 0;\r\n                  do if ((g | 0) != 1073741824) {\r\n                      j = g << 1;\r\n                      if ((j | 0) <= 268435455) if ((j | 0) < -268435456) {\r\n                          b[i >> 1] = -32768;\r\n                          break\r\n                      } else {\r\n                          b[i >> 1] = g >>> 12;\r\n                          break\r\n                      } else o = 52;\r\n                  } else {\r\n                      c[f >> 2] = 1;\r\n                      o = 52;\r\n                  } while (0);\r\n                  if ((o | 0) == 52) {\r\n                      o = 0;\r\n                      b[i >> 1] = 32767;\r\n                  }\r\n                  h = h + -1 << 16 >> 16;\r\n                  if (h << 16 >> 16 <= -1) break; else k = k + -1 | 0;\r\n              }\r\n              return\r\n          }\r\n\r\n          function Ea(a, d, e, f, g) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              var h = 0, j = 0, k = 0, l = 0;\r\n              l = i;\r\n              i = i + 496 | 0;\r\n              k = l;\r\n              j = (g | 0) == 2;\r\n              do if (!(j & 1 | (g | 0) == 4)) {\r\n                  if (g) {\r\n                      a = -1;\r\n                      i = l;\r\n                      return a | 0\r\n                  }\r\n                  j = b[e >> 1] | 0;\r\n                  d = e + 490 | 0;\r\n                  g = e + 2 | 0;\r\n                  h = 0;\r\n                  while (1) {\r\n                      b[k + (h << 1) >> 1] = b[g >> 1] | 0;\r\n                      h = h + 1 | 0;\r\n                      if ((h | 0) == 244) break; else g = g + 2 | 0;\r\n                  }\r\n                  h = j << 16 >> 16;\r\n                  if (j << 16 >> 16 == 7) {\r\n                      g = 492;\r\n                      d = c[a + 1760 >> 2] | 0;\r\n                      break\r\n                  } else {\r\n                      g = 492;\r\n                      d = b[d >> 1] | 0;\r\n                      break\r\n                  }\r\n              } else {\r\n                  h = a + 1168 | 0;\r\n                  if (j) {\r\n                      Gb(d, e, k, h);\r\n                      h = 604;\r\n                  } else {\r\n                      pb(d, e, k, h);\r\n                      h = 3436;\r\n                  }\r\n                  g = b[h + (d << 1) >> 1] | 0;\r\n                  do if (d >>> 0 >= 8) {\r\n                      if ((d | 0) == 8) {\r\n                          d = b[k + 76 >> 1] << 2 | (b[k + 74 >> 1] << 1 | b[k + 72 >> 1]);\r\n                          h = (b[k + 70 >> 1] | 0) == 0 ? 4 : 5;\r\n                          break\r\n                      }\r\n                      if (d >>> 0 < 15) {\r\n                          a = -1;\r\n                          i = l;\r\n                          return a | 0\r\n                      } else {\r\n                          d = c[a + 1760 >> 2] | 0;\r\n                          h = 7;\r\n                          break\r\n                      }\r\n                  } else h = 0; while (0);\r\n                  if (g << 16 >> 16 == -1) {\r\n                      a = -1;\r\n                      i = l;\r\n                      return a | 0\r\n                  }\r\n              } while (0);\r\n              Fb(a, d, k, h, f);\r\n              c[a + 1760 >> 2] = d;\r\n              a = g;\r\n              i = l;\r\n              return a | 0\r\n          }\r\n\r\n          function Fa(a, d, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              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;\r\n              t = i;\r\n              i = i + 48 | 0;\r\n              r = t + 20 | 0;\r\n              s = t;\r\n              h = r;\r\n              g = h + 20 | 0;\r\n              do {\r\n                  b[h >> 1] = b[a >> 1] | 0;\r\n                  h = h + 2 | 0;\r\n                  a = a + 2 | 0;\r\n              } while ((h | 0) < (g | 0));\r\n              a = b[r + 18 >> 1] | 0;\r\n              q = (a & 65535) - ((a & 65535) >>> 15 & 65535) | 0;\r\n              a:do if (((q << 16 >> 31 ^ q) & 65535) << 16 >> 16 <= 4095) {\r\n                  g = 9;\r\n                  q = 9;\r\n                  while (1) {\r\n                      a = a << 16 >> 16;\r\n                      a = (a << 19 >> 19 | 0) == (a | 0) ? a << 3 : a >>> 15 ^ 32767;\r\n                      p = d + (g << 1) | 0;\r\n                      b[p >> 1] = a;\r\n                      a = a << 16 >> 16;\r\n                      a = Z(a, a) | 0;\r\n                      if ((a | 0) == 1073741824) {\r\n                          c[f >> 2] = 1;\r\n                          h = 2147483647;\r\n                      } else h = a << 1;\r\n                      a = 2147483647 - h | 0;\r\n                      if ((a & h | 0) < 0) {\r\n                          c[f >> 2] = 1;\r\n                          a = 2147483647;\r\n                      }\r\n                      n = pe(a) | 0;\r\n                      o = 15 - (n & 65535) & 65535;\r\n                      j = n << 16 >> 16;\r\n                      if (n << 16 >> 16 > 0) {\r\n                          h = a << j;\r\n                          if ((h >> j | 0) != (a | 0)) h = a >> 31 ^ 2147483647;\r\n                      } else {\r\n                          h = 0 - j << 16;\r\n                          if ((h | 0) < 2031616) h = a >> (h >> 16); else h = 0;\r\n                      }\r\n                      h = Td(16384, Ce(h, f) | 0) | 0;\r\n                      do if (q << 16 >> 16 > 0) {\r\n                          n = g + -1 | 0;\r\n                          k = h << 16 >> 16;\r\n                          l = q << 16 >> 16;\r\n                          m = 0;\r\n                          while (1) {\r\n                              g = e[r + (m << 1) >> 1] | 0;\r\n                              a = g << 16;\r\n                              j = Z(b[r + (n - m << 1) >> 1] | 0, b[p >> 1] | 0) | 0;\r\n                              if ((j | 0) == 1073741824) {\r\n                                  c[f >> 2] = 1;\r\n                                  h = 2147483647;\r\n                              } else h = j << 1;\r\n                              j = a - h | 0;\r\n                              if (((j ^ a) & (h ^ a) | 0) < 0) {\r\n                                  c[f >> 2] = 1;\r\n                                  j = (g >>> 15) + 2147483647 | 0;\r\n                              }\r\n                              j = Z((Ce(j, f) | 0) << 16 >> 16, k) | 0;\r\n                              if ((j | 0) == 1073741824) {\r\n                                  c[f >> 2] = 1;\r\n                                  j = 2147483647;\r\n                              } else j = j << 1;\r\n                              j = ge(j, o, f) | 0;\r\n                              h = j - (j >>> 31) | 0;\r\n                              if ((h >> 31 ^ h | 0) > 32767) {\r\n                                  j = 24;\r\n                                  break\r\n                              }\r\n                              b[s + (m << 1) >> 1] = j;\r\n                              m = m + 1 | 0;\r\n                              if ((l | 0) <= (m | 0)) {\r\n                                  j = 26;\r\n                                  break\r\n                              }\r\n                          }\r\n                          if ((j | 0) == 24) {\r\n                              j = 0;\r\n                              h = d;\r\n                              g = h + 20 | 0;\r\n                              do {\r\n                                  b[h >> 1] = 0;\r\n                                  h = h + 2 | 0;\r\n                              } while ((h | 0) < (g | 0));\r\n                              a = 10;\r\n                          } else if ((j | 0) == 26) {\r\n                              j = 0;\r\n                              if (q << 16 >> 16 > 0) a = q; else {\r\n                                  j = 28;\r\n                                  break\r\n                              }\r\n                          }\r\n                          h = a + -1 << 16 >> 16;\r\n                          Oe(r | 0, s | 0, ((h & 65535) << 1) + 2 | 0) | 0;\r\n                          g = h << 16 >> 16;\r\n                      } else j = 28; while (0);\r\n                      if ((j | 0) == 28) {\r\n                          a = q + -1 << 16 >> 16;\r\n                          if (a << 16 >> 16 > -1) {\r\n                              g = a << 16 >> 16;\r\n                              h = 32767;\r\n                          } else break\r\n                      }\r\n                      a = b[r + (g << 1) >> 1] | 0;\r\n                      q = (a & 65535) - ((a & 65535) >>> 15 & 65535) | 0;\r\n                      if (((q << 16 >> 31 ^ q) & 65535) << 16 >> 16 > 4095) break a; else q = h;\r\n                  }\r\n                  i = t;\r\n                  return\r\n              } while (0);\r\n              h = d;\r\n              g = h + 20 | 0;\r\n              do {\r\n                  b[h >> 1] = 0;\r\n                  h = h + 2 | 0;\r\n              } while ((h | 0) < (g | 0));\r\n              i = t;\r\n              return\r\n          }\r\n\r\n          function Ga(a, b) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              var d = 0, e = 0, f = 0, g = 0, h = 0;\r\n              if (b << 16 >> 16 <= 0) {\r\n                  a = 0;\r\n                  return a | 0\r\n              }\r\n              e = c[a >> 2] | 0;\r\n              f = 0;\r\n              d = 0;\r\n              do {\r\n                  h = e & 1;\r\n                  d = h | d << 1 & 131070;\r\n                  g = e >> 1;\r\n                  e = (h | 0) == (e >>> 28 & 1 | 0) ? g : g | 1073741824;\r\n                  f = f + 1 << 16 >> 16;\r\n              } while (f << 16 >> 16 < b << 16 >> 16);\r\n              c[a >> 2] = e;\r\n              h = d & 65535;\r\n              return h | 0\r\n          }\r\n\r\n          function Ha(a, d, e) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0, h = 0, i = 0, j = 0, k = 0;\r\n              g = d;\r\n              f = g + 80 | 0;\r\n              do {\r\n                  b[g >> 1] = 0;\r\n                  g = g + 2 | 0;\r\n              } while ((g | 0) < (f | 0));\r\n              f = 0;\r\n              g = c[a >> 2] | 0;\r\n              do {\r\n                  k = g & 1;\r\n                  j = g >> 1;\r\n                  j = (k | 0) == (g >>> 28 & 1 | 0) ? j : j | 1073741824;\r\n                  h = j & 1;\r\n                  i = j >> 1;\r\n                  c[a >> 2] = (h | 0) == (j >>> 28 & 1 | 0) ? i : i | 1073741824;\r\n                  h = Rd((Z(k << 1 | h, 1310720) | 0) >>> 17 & 65535, f, e) | 0;\r\n                  k = c[a >> 2] | 0;\r\n                  i = k & 1;\r\n                  j = k >> 1;\r\n                  g = (i | 0) == (k >>> 28 & 1 | 0) ? j : j | 1073741824;\r\n                  c[a >> 2] = g;\r\n                  b[d + (h << 16 >> 16 << 1) >> 1] = ((i & 65535) << 13 & 65535) + -4096 << 16 >> 16;\r\n                  f = f + 1 << 16 >> 16;\r\n              } while (f << 16 >> 16 < 10);\r\n              return\r\n          }\r\n\r\n          function Ia(a, d, f, g, h, i) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              var j = 0, k = 0;\r\n              j = b[a >> 1] | 0;\r\n              if ((j * 31821 | 0) == 1073741824) {\r\n                  c[i >> 2] = 1;\r\n                  k = 1073741823;\r\n              } else k = j * 63642 >> 1;\r\n              j = k + 13849 | 0;\r\n              if ((k | 0) > -1 & (j ^ k | 0) < 0) {\r\n                  c[i >> 2] = 1;\r\n                  j = (k >>> 31) + 2147483647 | 0;\r\n              }\r\n              b[a >> 1] = j;\r\n              if (d << 16 >> 16 <= 0) return;\r\n              k = 0;\r\n              j = h + ((j & 127) << 1) | 0;\r\n              while (1) {\r\n                  b[g + (k << 1) >> 1] = (-65536 << b[f + (k << 1) >> 1] >>> 16 ^ 65535) & e[j >> 1];\r\n                  k = k + 1 | 0;\r\n                  if ((k & 65535) << 16 >> 16 == d << 16 >> 16) break; else j = j + 2 | 0;\r\n              }\r\n              return\r\n          }\r\n\r\n          function Ja(a) {\r\n              a = a | 0;\r\n              var c = 0;\r\n              if (!a) {\r\n                  c = -1;\r\n                  return c | 0\r\n              }\r\n              c = a + 122 | 0;\r\n              do {\r\n                  b[a >> 1] = 0;\r\n                  a = a + 2 | 0;\r\n              } while ((a | 0) < (c | 0));\r\n              c = 0;\r\n              return c | 0\r\n          }\r\n\r\n          function Ka(a, d, f, g, h) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0;\r\n              k = 159;\r\n              j = 0;\r\n              while (1) {\r\n                  m = b[f + (k << 1) >> 1] | 0;\r\n                  m = Z(m, m) | 0;\r\n                  m = (m | 0) == 1073741824 ? 2147483647 : m << 1;\r\n                  i = m + j | 0;\r\n                  if ((m ^ j | 0) > -1 & (i ^ j | 0) < 0) {\r\n                      c[h >> 2] = 1;\r\n                      j = (j >>> 31) + 2147483647 | 0;\r\n                  } else j = i;\r\n                  if ((k | 0) > 0) k = k + -1 | 0; else {\r\n                      k = j;\r\n                      break\r\n                  }\r\n              }\r\n              h = k >>> 14 & 65535;\r\n              j = 32767;\r\n              i = 59;\r\n              while (1) {\r\n                  m = b[a + (i << 1) >> 1] | 0;\r\n                  j = m << 16 >> 16 < j << 16 >> 16 ? m : j;\r\n                  if ((i | 0) > 0) i = i + -1 | 0; else break\r\n              }\r\n              m = (k | 0) > 536870911 ? 32767 : h;\r\n              h = j << 16 >> 16;\r\n              i = h << 20 >> 16;\r\n              k = j << 16 >> 16 > 0 ? 32767 : -32768;\r\n              f = 55;\r\n              j = b[a >> 1] | 0;\r\n              while (1) {\r\n                  l = b[a + (f << 1) >> 1] | 0;\r\n                  j = j << 16 >> 16 < l << 16 >> 16 ? l : j;\r\n                  if ((f | 0) > 1) f = f + -1 | 0; else break\r\n              }\r\n              f = b[a + 80 >> 1] | 0;\r\n              l = b[a + 82 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 84 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 86 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 88 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 90 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 92 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 94 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 96 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 98 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 100 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 102 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 104 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 106 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 108 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 110 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 112 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 114 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = b[a + 116 >> 1] | 0;\r\n              f = f << 16 >> 16 < l << 16 >> 16 ? l : f;\r\n              l = a + 118 | 0;\r\n              o = b[l >> 1] | 0;\r\n              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) {\r\n                  j = a + 120 | 0;\r\n                  i = b[j >> 1] | 0;\r\n                  if (i << 16 >> 16 > 29) {\r\n                      b[j >> 1] = 30;\r\n                      f = j;\r\n                      k = 1;\r\n                      break\r\n                  } else {\r\n                      k = (i & 65535) + 1 & 65535;\r\n                      b[j >> 1] = k;\r\n                      f = j;\r\n                      k = k << 16 >> 16 > 1 & 1;\r\n                      break\r\n                  }\r\n              } else n = 14; while (0);\r\n              if ((n | 0) == 14) {\r\n                  f = a + 120 | 0;\r\n                  b[f >> 1] = 0;\r\n                  k = 0;\r\n              }\r\n              j = 0;\r\n              do {\r\n                  o = j;\r\n                  j = j + 1 | 0;\r\n                  b[a + (o << 1) >> 1] = b[a + (j << 1) >> 1] | 0;\r\n              } while ((j | 0) != 59);\r\n              b[l >> 1] = m;\r\n              j = b[f >> 1] | 0;\r\n              j = j << 16 >> 16 > 15 ? 16383 : j << 16 >> 16 > 8 ? 15565 : 13926;\r\n              i = Zd(d + 8 | 0, 5) | 0;\r\n              if ((b[f >> 1] | 0) > 20) {\r\n                  if (((Zd(d, 9) | 0) << 16 >> 16 | 0) > (j | 0)) n = 20;\r\n              } else if ((i << 16 >> 16 | 0) > (j | 0)) n = 20;\r\n              if ((n | 0) == 20) {\r\n                  b[g >> 1] = 0;\r\n                  return k | 0\r\n              }\r\n              i = (e[g >> 1] | 0) + 1 & 65535;\r\n              if (i << 16 >> 16 > 10) {\r\n                  b[g >> 1] = 10;\r\n                  return k | 0\r\n              } else {\r\n                  b[g >> 1] = i;\r\n                  return k | 0\r\n              }\r\n              return 0\r\n          }\r\n\r\n          function La(a) {\r\n              a = a | 0;\r\n              var c = 0;\r\n              if (!a) {\r\n                  c = -1;\r\n                  return c | 0\r\n              }\r\n              c = a + 18 | 0;\r\n              do {\r\n                  b[a >> 1] = 0;\r\n                  a = a + 2 | 0;\r\n              } while ((a | 0) < (c | 0));\r\n              c = 0;\r\n              return c | 0\r\n          }\r\n\r\n          function Ma(a, d, f, g, h, i, j, k, l, m, n, o) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              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;\r\n              y = a + 2 | 0;\r\n              b[a >> 1] = b[y >> 1] | 0;\r\n              z = a + 4 | 0;\r\n              b[y >> 1] = b[z >> 1] | 0;\r\n              A = a + 6 | 0;\r\n              b[z >> 1] = b[A >> 1] | 0;\r\n              B = a + 8 | 0;\r\n              b[A >> 1] = b[B >> 1] | 0;\r\n              C = a + 10 | 0;\r\n              b[B >> 1] = b[C >> 1] | 0;\r\n              D = a + 12 | 0;\r\n              b[C >> 1] = b[D >> 1] | 0;\r\n              b[D >> 1] = f;\r\n              t = 0;\r\n              x = 0;\r\n              do {\r\n                  p = h + (x << 1) | 0;\r\n                  r = Ge(b[p >> 1] | 0, b[g + (x << 1) >> 1] | 0, o) | 0;\r\n                  r = (r & 65535) - ((r & 65535) >>> 15 & 65535) | 0;\r\n                  r = r << 16 >> 31 ^ r;\r\n                  w = ((qe(r & 65535) | 0) & 65535) + 65535 | 0;\r\n                  q = w << 16 >> 16;\r\n                  if ((w & 65535) << 16 >> 16 < 0) {\r\n                      s = 0 - q << 16;\r\n                      if ((s | 0) < 983040) u = r << 16 >> 16 >> (s >> 16) & 65535; else u = 0;\r\n                  } else {\r\n                      s = r << 16 >> 16;\r\n                      r = s << q;\r\n                      if ((r << 16 >> 16 >> q | 0) == (s | 0)) u = r & 65535; else u = (s >>> 15 ^ 32767) & 65535;\r\n                  }\r\n                  v = qe(b[p >> 1] | 0) | 0;\r\n                  r = b[p >> 1] | 0;\r\n                  q = v << 16 >> 16;\r\n                  if (v << 16 >> 16 < 0) {\r\n                      s = 0 - q << 16;\r\n                      if ((s | 0) < 983040) s = r << 16 >> 16 >> (s >> 16) & 65535; else s = 0;\r\n                  } else {\r\n                      s = r << 16 >> 16;\r\n                      r = s << q;\r\n                      if ((r << 16 >> 16 >> q | 0) == (s | 0)) s = r & 65535; else s = (s >>> 15 ^ 32767) & 65535;\r\n                  }\r\n                  q = Td(u, s) | 0;\r\n                  s = (w & 65535) + 2 - (v & 65535) | 0;\r\n                  r = s & 65535;\r\n                  do if (s & 32768) {\r\n                      if (r << 16 >> 16 != -32768) {\r\n                          w = 0 - s | 0;\r\n                          s = w << 16 >> 16;\r\n                          if ((w & 65535) << 16 >> 16 < 0) {\r\n                              s = 0 - s << 16;\r\n                              if ((s | 0) >= 983040) {\r\n                                  s = 0;\r\n                                  break\r\n                              }\r\n                              s = q << 16 >> 16 >> (s >> 16) & 65535;\r\n                              break\r\n                          }\r\n                      } else s = 32767;\r\n                      r = q << 16 >> 16;\r\n                      q = r << s;\r\n                      if ((q << 16 >> 16 >> s | 0) == (r | 0)) s = q & 65535; else s = (r >>> 15 ^ 32767) & 65535;\r\n                  } else s = De(q, r, o) | 0; while (0);\r\n                  t = Rd(t, s, o) | 0;\r\n                  x = x + 1 | 0;\r\n              } while ((x | 0) != 10);\r\n              s = t & 65535;\r\n              r = t << 16 >> 16 > 5325;\r\n              t = a + 14 | 0;\r\n              if (r) {\r\n                  h = (e[t >> 1] | 0) + 1 & 65535;\r\n                  b[t >> 1] = h;\r\n                  if (h << 16 >> 16 > 10) b[a + 16 >> 1] = 0;\r\n              } else b[t >> 1] = 0;\r\n              switch (d | 0) {\r\n                  case 0:\r\n                  case 1:\r\n                  case 2:\r\n                  case 3:\r\n                  case 6:\r\n                      break;\r\n                  default: {\r\n                      D = a + 16 | 0;\r\n                      o = f;\r\n                      f = b[D >> 1] | 0;\r\n                      f = f & 65535;\r\n                      f = f + 1 | 0;\r\n                      f = f & 65535;\r\n                      b[D >> 1] = f;\r\n                      return o | 0\r\n                  }\r\n              }\r\n              u = (j | i) << 16 >> 16 == 0;\r\n              v = m << 16 >> 16 == 0;\r\n              w = d >>> 0 < 3;\r\n              t = s + (w & ((v | (u & (k << 16 >> 16 == 0 | l << 16 >> 16 == 0) | n << 16 >> 16 < 2)) ^ 1) ? 61030 : 62259) & 65535;\r\n              t = t << 16 >> 16 > 0 ? t : 0;\r\n              if (t << 16 >> 16 <= 2048) {\r\n                  t = t << 16 >> 16;\r\n                  if ((t << 18 >> 18 | 0) == (t | 0)) l = t << 2; else l = t >>> 15 ^ 32767;\r\n              } else l = 8192;\r\n              k = a + 16 | 0;\r\n              n = r | (b[k >> 1] | 0) < 40;\r\n              t = b[z >> 1] | 0;\r\n              if ((t * 6554 | 0) == 1073741824) {\r\n                  c[o >> 2] = 1;\r\n                  r = 2147483647;\r\n              } else r = t * 13108 | 0;\r\n              t = b[A >> 1] | 0;\r\n              s = t * 6554 | 0;\r\n              if ((s | 0) != 1073741824) {\r\n                  t = (t * 13108 | 0) + r | 0;\r\n                  if ((s ^ r | 0) > 0 & (t ^ r | 0) < 0) {\r\n                      c[o >> 2] = 1;\r\n                      t = (r >>> 31) + 2147483647 | 0;\r\n                  }\r\n              } else {\r\n                  c[o >> 2] = 1;\r\n                  t = 2147483647;\r\n              }\r\n              s = b[B >> 1] | 0;\r\n              r = s * 6554 | 0;\r\n              if ((r | 0) != 1073741824) {\r\n                  s = (s * 13108 | 0) + t | 0;\r\n                  if ((r ^ t | 0) > 0 & (s ^ t | 0) < 0) {\r\n                      c[o >> 2] = 1;\r\n                      s = (t >>> 31) + 2147483647 | 0;\r\n                  }\r\n              } else {\r\n                  c[o >> 2] = 1;\r\n                  s = 2147483647;\r\n              }\r\n              t = b[C >> 1] | 0;\r\n              r = t * 6554 | 0;\r\n              if ((r | 0) != 1073741824) {\r\n                  t = (t * 13108 | 0) + s | 0;\r\n                  if ((r ^ s | 0) > 0 & (t ^ s | 0) < 0) {\r\n                      c[o >> 2] = 1;\r\n                      r = (s >>> 31) + 2147483647 | 0;\r\n                  } else r = t;\r\n              } else {\r\n                  c[o >> 2] = 1;\r\n                  r = 2147483647;\r\n              }\r\n              t = b[D >> 1] | 0;\r\n              s = t * 6554 | 0;\r\n              if ((s | 0) != 1073741824) {\r\n                  t = (t * 13108 | 0) + r | 0;\r\n                  if ((s ^ r | 0) > 0 & (t ^ r | 0) < 0) {\r\n                      c[o >> 2] = 1;\r\n                      t = (r >>> 31) + 2147483647 | 0;\r\n                  }\r\n              } else {\r\n                  c[o >> 2] = 1;\r\n                  t = 2147483647;\r\n              }\r\n              r = Ce(t, o) | 0;\r\n              if (w & ((u | v) ^ 1)) {\r\n                  t = b[a >> 1] | 0;\r\n                  if ((t * 4681 | 0) == 1073741824) {\r\n                      c[o >> 2] = 1;\r\n                      r = 2147483647;\r\n                  } else r = t * 9362 | 0;\r\n                  t = b[y >> 1] | 0;\r\n                  s = t * 4681 | 0;\r\n                  if ((s | 0) != 1073741824) {\r\n                      t = (t * 9362 | 0) + r | 0;\r\n                      if ((s ^ r | 0) > 0 & (t ^ r | 0) < 0) {\r\n                          c[o >> 2] = 1;\r\n                          r = (r >>> 31) + 2147483647 | 0;\r\n                      } else r = t;\r\n                  } else {\r\n                      c[o >> 2] = 1;\r\n                      r = 2147483647;\r\n                  }\r\n                  t = b[z >> 1] | 0;\r\n                  s = t * 4681 | 0;\r\n                  if ((s | 0) != 1073741824) {\r\n                      t = (t * 9362 | 0) + r | 0;\r\n                      if ((s ^ r | 0) > 0 & (t ^ r | 0) < 0) {\r\n                          c[o >> 2] = 1;\r\n                          r = (r >>> 31) + 2147483647 | 0;\r\n                      } else r = t;\r\n                  } else {\r\n                      c[o >> 2] = 1;\r\n                      r = 2147483647;\r\n                  }\r\n                  t = b[A >> 1] | 0;\r\n                  s = t * 4681 | 0;\r\n                  if ((s | 0) != 1073741824) {\r\n                      t = (t * 9362 | 0) + r | 0;\r\n                      if ((s ^ r | 0) > 0 & (t ^ r | 0) < 0) {\r\n                          c[o >> 2] = 1;\r\n                          t = (r >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[o >> 2] = 1;\r\n                      t = 2147483647;\r\n                  }\r\n                  s = b[B >> 1] | 0;\r\n                  r = s * 4681 | 0;\r\n                  if ((r | 0) != 1073741824) {\r\n                      s = (s * 9362 | 0) + t | 0;\r\n                      if ((r ^ t | 0) > 0 & (s ^ t | 0) < 0) {\r\n                          c[o >> 2] = 1;\r\n                          t = (t >>> 31) + 2147483647 | 0;\r\n                      } else t = s;\r\n                  } else {\r\n                      c[o >> 2] = 1;\r\n                      t = 2147483647;\r\n                  }\r\n                  s = b[C >> 1] | 0;\r\n                  r = s * 4681 | 0;\r\n                  if ((r | 0) != 1073741824) {\r\n                      s = (s * 9362 | 0) + t | 0;\r\n                      if ((r ^ t | 0) > 0 & (s ^ t | 0) < 0) {\r\n                          c[o >> 2] = 1;\r\n                          s = (t >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[o >> 2] = 1;\r\n                      s = 2147483647;\r\n                  }\r\n                  r = b[D >> 1] | 0;\r\n                  p = r * 4681 | 0;\r\n                  if ((p | 0) != 1073741824) {\r\n                      q = (r * 9362 | 0) + s | 0;\r\n                      if ((p ^ s | 0) > 0 & (q ^ s | 0) < 0) {\r\n                          c[o >> 2] = 1;\r\n                          q = (s >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[o >> 2] = 1;\r\n                      q = 2147483647;\r\n                  }\r\n                  r = Ce(q, o) | 0;\r\n              }\r\n              t = n ? 8192 : l << 16 >> 16;\r\n              p = Z(t, f << 16 >> 16) | 0;\r\n              if ((p | 0) == 1073741824) {\r\n                  c[o >> 2] = 1;\r\n                  s = 2147483647;\r\n              } else s = p << 1;\r\n              r = r << 16 >> 16;\r\n              q = r << 13;\r\n              if ((q | 0) != 1073741824) {\r\n                  p = s + (r << 14) | 0;\r\n                  if ((s ^ q | 0) > 0 & (p ^ s | 0) < 0) {\r\n                      c[o >> 2] = 1;\r\n                      s = (s >>> 31) + 2147483647 | 0;\r\n                  } else s = p;\r\n              } else {\r\n                  c[o >> 2] = 1;\r\n                  s = 2147483647;\r\n              }\r\n              p = Z(r, t) | 0;\r\n              if ((p | 0) == 1073741824) {\r\n                  c[o >> 2] = 1;\r\n                  q = 2147483647;\r\n              } else q = p << 1;\r\n              p = s - q | 0;\r\n              if (((p ^ s) & (q ^ s) | 0) < 0) {\r\n                  c[o >> 2] = 1;\r\n                  p = (s >>> 31) + 2147483647 | 0;\r\n              }\r\n              D = p << 2;\r\n              f = k;\r\n              o = Ce((D >> 2 | 0) == (p | 0) ? D : p >> 31 ^ 2147483647, o) | 0;\r\n              D = b[f >> 1] | 0;\r\n              D = D & 65535;\r\n              D = D + 1 | 0;\r\n              D = D & 65535;\r\n              b[f >> 1] = D;\r\n              return o | 0\r\n          }\r\n\r\n          function Na(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var f = 0, g = 0, h = 0, i = 0;\r\n              f = c;\r\n              g = f + 80 | 0;\r\n              do {\r\n                  b[f >> 1] = 0;\r\n                  f = f + 2 | 0;\r\n              } while ((f | 0) < (g | 0));\r\n              f = 0;\r\n              do {\r\n                  i = b[a + (f << 1) >> 1] | 0;\r\n                  g = ((i & 8) << 10 & 65535 ^ 8192) + -4096 << 16 >> 16;\r\n                  h = f << 16;\r\n                  i = ((b[d + ((i & 7) << 1) >> 1] | 0) * 327680 | 0) + h >> 16;\r\n                  b[c + (i << 1) >> 1] = g;\r\n                  h = ((b[d + ((e[a + (f + 5 << 1) >> 1] & 7) << 1) >> 1] | 0) * 327680 | 0) + h >> 16;\r\n                  if ((h | 0) < (i | 0)) g = 0 - (g & 65535) & 65535;\r\n                  i = c + (h << 1) | 0;\r\n                  b[i >> 1] = (e[i >> 1] | 0) + (g & 65535);\r\n                  f = f + 1 | 0;\r\n              } while ((f | 0) != 5);\r\n              return\r\n          }\r\n\r\n          function Oa(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var e = 0, f = 0, g = 0;\r\n              f = c << 16 >> 16;\r\n              e = (f << 1 & 2 | 1) + ((f >>> 1 & 7) * 5 | 0) | 0;\r\n              c = f >>> 4 & 3;\r\n              c = ((f >>> 6 & 7) * 5 | 0) + ((c | 0) == 3 ? 4 : c) | 0;\r\n              f = d;\r\n              g = f + 80 | 0;\r\n              do {\r\n                  b[f >> 1] = 0;\r\n                  f = f + 2 | 0;\r\n              } while ((f | 0) < (g | 0));\r\n              a = a << 16 >> 16;\r\n              b[d + (e << 1) >> 1] = (0 - (a & 1) & 16383) + 57344;\r\n              b[d + (c << 1) >> 1] = (0 - (a >>> 1 & 1) & 16383) + 57344;\r\n              return\r\n          }\r\n\r\n          function Pa(a, c, d, f, g, h) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var i = 0, j = 0;\r\n              h = d << 16 >> 16;\r\n              j = h >>> 3;\r\n              a = a << 16 >> 16;\r\n              a = ((a << 17 >> 17 | 0) == (a | 0) ? a << 1 : a >>> 15 ^ 32767) + (j & 8) << 16;\r\n              j = (e[f + (a + 65536 >> 16 << 1) >> 1] | 0) + ((j & 7) * 5 | 0) | 0;\r\n              d = c << 16 >> 16;\r\n              i = (0 - (d & 1) & 16383) + 57344 & 65535;\r\n              a = g + ((e[f + (a >> 16 << 1) >> 1] | 0) + ((h & 7) * 5 | 0) << 16 >> 16 << 1) | 0;\r\n              c = g;\r\n              h = c + 80 | 0;\r\n              do {\r\n                  b[c >> 1] = 0;\r\n                  c = c + 2 | 0;\r\n              } while ((c | 0) < (h | 0));\r\n              b[a >> 1] = i;\r\n              b[g + (j << 16 >> 16 << 1) >> 1] = (0 - (d >>> 1 & 1) & 16383) + 57344;\r\n              return\r\n          }\r\n\r\n          function Qa(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var e = 0, f = 0, g = 0, h = 0;\r\n              c = c << 16 >> 16;\r\n              e = (c & 7) * 5 | 0;\r\n              f = (c >>> 2 & 2 | 1) + ((c >>> 4 & 7) * 5 | 0) | 0;\r\n              c = (c >>> 6 & 2) + 2 + ((c >>> 8 & 7) * 5 | 0) | 0;\r\n              g = d;\r\n              h = g + 80 | 0;\r\n              do {\r\n                  b[g >> 1] = 0;\r\n                  g = g + 2 | 0;\r\n              } while ((g | 0) < (h | 0));\r\n              a = a << 16 >> 16;\r\n              b[d + (e << 1) >> 1] = (0 - (a & 1) & 16383) + 57344;\r\n              b[d + (f << 1) >> 1] = (0 - (a >>> 1 & 1) & 16383) + 57344;\r\n              b[d + (c << 1) >> 1] = (0 - (a >>> 2 & 1) & 16383) + 57344;\r\n              return\r\n          }\r\n\r\n          function Ra(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0, h = 0, i = 0;\r\n              c = c << 16 >> 16;\r\n              h = b[d + ((c & 7) << 1) >> 1] | 0;\r\n              i = b[d + ((c >>> 3 & 7) << 1) >> 1] | 0;\r\n              g = b[d + ((c >>> 6 & 7) << 1) >> 1] | 0;\r\n              d = (c >>> 9 & 1) + 3 + ((b[d + ((c >>> 10 & 7) << 1) >> 1] | 0) * 5 | 0) | 0;\r\n              c = e;\r\n              f = c + 80 | 0;\r\n              do {\r\n                  b[c >> 1] = 0;\r\n                  c = c + 2 | 0;\r\n              } while ((c | 0) < (f | 0));\r\n              a = a << 16 >> 16;\r\n              b[e + (h * 327680 >> 16 << 1) >> 1] = (0 - (a & 1) & 16383) + 57344;\r\n              b[e + ((i * 327680 | 0) + 65536 >> 16 << 1) >> 1] = (0 - (a >>> 1 & 1) & 16383) + 57344;\r\n              b[e + ((g * 327680 | 0) + 131072 >> 16 << 1) >> 1] = (0 - (a >>> 2 & 1) & 16383) + 57344;\r\n              b[e + (d << 16 >> 16 << 1) >> 1] = (0 - (a >>> 3 & 1) & 16383) + 57344;\r\n              return\r\n          }\r\n\r\n          function Sa(a, d, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              var g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0;\r\n              q = i;\r\n              i = i + 32 | 0;\r\n              p = q + 16 | 0;\r\n              o = q;\r\n              j = d;\r\n              h = j + 80 | 0;\r\n              do {\r\n                  b[j >> 1] = 0;\r\n                  j = j + 2 | 0;\r\n              } while ((j | 0) < (h | 0));\r\n              h = b[a >> 1] | 0;\r\n              b[p >> 1] = h;\r\n              b[p + 2 >> 1] = b[a + 2 >> 1] | 0;\r\n              b[p + 4 >> 1] = b[a + 4 >> 1] | 0;\r\n              b[p + 6 >> 1] = b[a + 6 >> 1] | 0;\r\n              m = b[a + 8 >> 1] | 0;\r\n              Ta(m >>> 3 & 65535, m & 7, 0, 4, 1, o, f);\r\n              m = b[a + 10 >> 1] | 0;\r\n              Ta(m >>> 3 & 65535, m & 7, 2, 6, 5, o, f);\r\n              m = b[a + 12 >> 1] | 0;\r\n              g = m >> 2;\r\n              do if ((g * 25 | 0) != 1073741824) {\r\n                  j = (Z(g, 1638400) | 0) + 786432 >> 21;\r\n                  g = j * 6554 >> 15;\r\n                  if ((g | 0) > 32767) {\r\n                      c[f >> 2] = 1;\r\n                      k = 1;\r\n                      l = 1;\r\n                      a = 163835;\r\n                      n = 6;\r\n                      break\r\n                  }\r\n                  a = (g << 16 >> 16) * 5 | 0;\r\n                  k = g & 1;\r\n                  if ((a | 0) == 1073741824) {\r\n                      c[f >> 2] = 1;\r\n                      l = 0;\r\n                      a = 65535;\r\n                  } else {\r\n                      l = 0;\r\n                      n = 6;\r\n                  }\r\n              } else {\r\n                  c[f >> 2] = 1;\r\n                  k = 0;\r\n                  g = 0;\r\n                  l = 0;\r\n                  j = 0;\r\n                  a = 0;\r\n                  n = 6;\r\n              } while (0);\r\n              if ((n | 0) == 6) a = a & 65535;\r\n              n = j - a | 0;\r\n              k = k << 16 >> 16 == 0 ? n : 4 - n | 0;\r\n              n = k << 16 >> 16;\r\n              b[o + 6 >> 1] = Rd(((k << 17 >> 17 | 0) == (n | 0) ? k << 1 : n >>> 15 ^ 32767) & 65535, m & 1, f) | 0;\r\n              if (l) {\r\n                  c[f >> 2] = 1;\r\n                  g = 32767;\r\n              }\r\n              n = g << 16 >> 16;\r\n              b[o + 14 >> 1] = ((g << 17 >> 17 | 0) == (n | 0) ? g << 1 : n >>> 15 ^ 32767) + (m >>> 1 & 1);\r\n              g = 0;\r\n              while (1) {\r\n                  h = h << 16 >> 16 == 0 ? 8191 : -8191;\r\n                  n = (b[o + (g << 1) >> 1] << 2) + g << 16;\r\n                  j = n >> 16;\r\n                  if ((n | 0) < 2621440) b[d + (j << 1) >> 1] = h;\r\n                  k = (b[o + (g + 4 << 1) >> 1] << 2) + g << 16;\r\n                  a = k >> 16;\r\n                  if ((a | 0) < (j | 0)) h = 0 - (h & 65535) & 65535;\r\n                  if ((k | 0) < 2621440) {\r\n                      n = d + (a << 1) | 0;\r\n                      b[n >> 1] = (e[n >> 1] | 0) + (h & 65535);\r\n                  }\r\n                  g = g + 1 | 0;\r\n                  if ((g | 0) == 4) break;\r\n                  h = b[p + (g << 1) >> 1] | 0;\r\n              }\r\n              i = q;\r\n              return\r\n          }\r\n\r\n          function Ta(a, d, e, f, g, h, i) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              var j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0;\r\n              k = a << 16 >> 16 > 124 ? 124 : a;\r\n              a = (k << 16 >> 16) * 1311 >> 15;\r\n              p = (a | 0) > 32767;\r\n              if (!p) {\r\n                  j = a << 16 >> 16;\r\n                  if ((j * 25 | 0) == 1073741824) {\r\n                      c[i >> 2] = 1;\r\n                      j = 1073741823;\r\n                  } else o = 4;\r\n              } else {\r\n                  c[i >> 2] = 1;\r\n                  j = 32767;\r\n                  o = 4;\r\n              }\r\n              if ((o | 0) == 4) j = (j * 50 | 0) >>> 1;\r\n              m = (k & 65535) - j | 0;\r\n              j = (m << 16 >> 16) * 6554 >> 15;\r\n              n = (j | 0) > 32767;\r\n              if (!n) {\r\n                  k = j << 16 >> 16;\r\n                  if ((k * 5 | 0) == 1073741824) {\r\n                      c[i >> 2] = 1;\r\n                      l = 1073741823;\r\n                  } else o = 9;\r\n              } else {\r\n                  c[i >> 2] = 1;\r\n                  k = 32767;\r\n                  o = 9;\r\n              }\r\n              if ((o | 0) == 9) l = (k * 10 | 0) >>> 1;\r\n              m = m - l | 0;\r\n              o = m << 16 >> 16;\r\n              k = d << 16 >> 16;\r\n              l = k >> 2;\r\n              k = k - (l << 2) | 0;\r\n              b[h + (e << 16 >> 16 << 1) >> 1] = ((m << 17 >> 17 | 0) == (o | 0) ? m << 1 : o >>> 15 ^ 32767) + (k & 1);\r\n              if (n) {\r\n                  c[i >> 2] = 1;\r\n                  j = 32767;\r\n              }\r\n              e = j << 16 >> 16;\r\n              b[h + (f << 16 >> 16 << 1) >> 1] = ((j << 17 >> 17 | 0) == (e | 0) ? j << 1 : e >>> 15 ^ 32767) + (k << 16 >> 17);\r\n              if (p) {\r\n                  c[i >> 2] = 1;\r\n                  a = 32767;\r\n              }\r\n              f = a << 16 >> 16;\r\n              b[h + (g << 16 >> 16 << 1) >> 1] = Rd(l & 65535, ((a << 17 >> 17 | 0) == (f | 0) ? a << 1 : f >>> 15 ^ 32767) & 65535, i) | 0;\r\n              return\r\n          }\r\n\r\n          function Ua(a) {\r\n              a = a | 0;\r\n              var d = 0, e = 0, f = 0, g = 0;\r\n              if (!a) {\r\n                  g = -1;\r\n                  return g | 0\r\n              }\r\n              Yd(a + 1168 | 0);\r\n              b[a + 460 >> 1] = 40;\r\n              c[a + 1164 >> 2] = 0;\r\n              d = a + 646 | 0;\r\n              e = a + 1216 | 0;\r\n              f = a + 462 | 0;\r\n              g = f + 22 | 0;\r\n              do {\r\n                  b[f >> 1] = 0;\r\n                  f = f + 2 | 0;\r\n              } while ((f | 0) < (g | 0));\r\n              db(d, c[e >> 2] | 0) | 0;\r\n              mb(a + 686 | 0) | 0;\r\n              ib(a + 700 | 0) | 0;\r\n              La(a + 608 | 0) | 0;\r\n              rb(a + 626 | 0, c[e >> 2] | 0) | 0;\r\n              Ja(a + 484 | 0) | 0;\r\n              tb(a + 730 | 0) | 0;\r\n              eb(a + 748 | 0) | 0;\r\n              Ud(a + 714 | 0) | 0;\r\n              Va(a, 0) | 0;\r\n              g = 0;\r\n              return g | 0\r\n          }\r\n\r\n          function Va(a, d) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              var e = 0, f = 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[a + 388 >> 2] = a + 308;\r\n              Qe(a | 0, 0, 308) | 0;\r\n              d = (d | 0) != 8;\r\n              if (d) {\r\n                  e = a + 412 | 0;\r\n                  f = e + 20 | 0;\r\n                  do {\r\n                      b[e >> 1] = 0;\r\n                      e = e + 2 | 0;\r\n                  } while ((e | 0) < (f | 0));\r\n                  b[a + 392 >> 1] = 3e4;\r\n                  b[a + 394 >> 1] = 26e3;\r\n                  b[a + 396 >> 1] = 21e3;\r\n                  b[a + 398 >> 1] = 15e3;\r\n                  b[a + 400 >> 1] = 8e3;\r\n                  b[a + 402 >> 1] = 0;\r\n                  b[a + 404 >> 1] = -8e3;\r\n                  b[a + 406 >> 1] = -15e3;\r\n                  b[a + 408 >> 1] = -21e3;\r\n                  b[a + 410 >> 1] = -26e3;\r\n              }\r\n              b[a + 432 >> 1] = 0;\r\n              b[a + 434 >> 1] = 40;\r\n              c[a + 1164 >> 2] = 0;\r\n              b[a + 436 >> 1] = 0;\r\n              b[a + 438 >> 1] = 0;\r\n              b[a + 440 >> 1] = 0;\r\n              b[a + 460 >> 1] = 40;\r\n              b[a + 462 >> 1] = 0;\r\n              b[a + 464 >> 1] = 0;\r\n              if (d) {\r\n                  e = a + 442 | 0;\r\n                  f = e + 18 | 0;\r\n                  do {\r\n                      b[e >> 1] = 0;\r\n                      e = e + 2 | 0;\r\n                  } while ((e | 0) < (f | 0));\r\n                  e = a + 466 | 0;\r\n                  f = e + 18 | 0;\r\n                  do {\r\n                      b[e >> 1] = 0;\r\n                      e = e + 2 | 0;\r\n                  } while ((e | 0) < (f | 0));\r\n                  La(a + 608 | 0) | 0;\r\n                  f = a + 1216 | 0;\r\n                  rb(a + 626 | 0, c[f >> 2] | 0) | 0;\r\n                  db(a + 646 | 0, c[f >> 2] | 0) | 0;\r\n                  mb(a + 686 | 0) | 0;\r\n                  ib(a + 700 | 0) | 0;\r\n                  Ud(a + 714 | 0) | 0;\r\n              } else {\r\n                  e = a + 466 | 0;\r\n                  f = e + 18 | 0;\r\n                  do {\r\n                      b[e >> 1] = 0;\r\n                      e = e + 2 | 0;\r\n                  } while ((e | 0) < (f | 0));\r\n                  La(a + 608 | 0) | 0;\r\n                  db(a + 646 | 0, c[a + 1216 >> 2] | 0) | 0;\r\n                  mb(a + 686 | 0) | 0;\r\n                  ib(a + 700 | 0) | 0;\r\n              }\r\n              Ja(a + 484 | 0) | 0;\r\n              b[a + 606 >> 1] = 21845;\r\n              tb(a + 730 | 0) | 0;\r\n              if (!d) {\r\n                  a = 0;\r\n                  return a | 0\r\n              }\r\n              eb(a + 748 | 0) | 0;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function Wa(d, f, g, h, j, k) {\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              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,\r\n                  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,\r\n                  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,\r\n                  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,\r\n                  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,\r\n                  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,\r\n                  ib = 0, mb = 0, pb = 0, rb = 0, tb = 0, xb = 0, yb = 0, zb = 0, Ab = 0, Bb = 0;\r\n              Bb = i;\r\n              i = i + 336 | 0;\r\n              r = Bb + 236 | 0;\r\n              q = Bb + 216 | 0;\r\n              zb = Bb + 112 | 0;\r\n              yb = Bb + 12 | 0;\r\n              mb = Bb + 256 | 0;\r\n              rb = Bb + 136 | 0;\r\n              pb = Bb + 32 | 0;\r\n              eb = Bb + 8 | 0;\r\n              ib = Bb + 6 | 0;\r\n              xb = Bb + 4 | 0;\r\n              tb = Bb + 2 | 0;\r\n              Ab = Bb;\r\n              Ta = d + 1164 | 0;\r\n              Ua = d + 748 | 0;\r\n              Wa = hb(Ua, h, Ta) | 0;\r\n              if (Wa) {\r\n                  Va(d, 8) | 0;\r\n                  fb(Ua, d + 412 | 0, d + 646 | 0, d + 714 | 0, d + 608 | 0, Wa, f, g, d + 1168 | 0, j, k, Ta);\r\n                  Ab = d + 666 | 0;\r\n                  me(Ab, d + 392 | 0, 10, Ta);\r\n                  sb(d + 626 | 0, Ab, Ta);\r\n                  Ab = d + 1156 | 0;\r\n                  c[Ab >> 2] = Wa;\r\n                  i = Bb;\r\n                  return\r\n              }\r\n              switch (h | 0) {\r\n                  case 1: {\r\n                      l = 1;\r\n                      x = 6;\r\n                      break\r\n                  }\r\n                  case 2:\r\n                  case 7: {\r\n                      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);\r\n                      x = 9;\r\n                      break\r\n                  }\r\n                  case 3: {\r\n                      x = 9;\r\n                      break\r\n                  }\r\n                  default: {\r\n                      l = 0;\r\n                      x = 6;\r\n                  }\r\n              }\r\n              do if ((x | 0) == 6) {\r\n                  h = d + 440 | 0;\r\n                  if ((b[h >> 1] | 0) == 6) {\r\n                      b[h >> 1] = 5;\r\n                      Ja = 0;\r\n                      La = 0;\r\n                      break\r\n                  } else {\r\n                      b[h >> 1] = 0;\r\n                      Ja = 0;\r\n                      La = 0;\r\n                      break\r\n                  }\r\n              } else if ((x | 0) == 9) {\r\n                  h = d + 440 | 0;\r\n                  Ja = (e[h >> 1] | 0) + 1 & 65535;\r\n                  b[h >> 1] = Ja << 16 >> 16 > 6 ? 6 : Ja;\r\n                  Ja = 1;\r\n                  La = 1;\r\n                  l = 0;\r\n              } while (0);\r\n              Ea = d + 1156 | 0;\r\n              switch (c[Ea >> 2] | 0) {\r\n                  case 1: {\r\n                      b[h >> 1] = 5;\r\n                      b[d + 436 >> 1] = 0;\r\n                      break\r\n                  }\r\n                  case 2: {\r\n                      b[h >> 1] = 5;\r\n                      b[d + 436 >> 1] = 1;\r\n                      break\r\n                  }\r\n                  default: {\r\n                  }\r\n              }\r\n              n = d + 646 | 0;\r\n              Fa = d + 666 | 0;\r\n              m = zb;\r\n              o = Fa;\r\n              p = m + 20 | 0;\r\n              do {\r\n                  a[m >> 0] = a[o >> 0] | 0;\r\n                  m = m + 1 | 0;\r\n                  o = o + 1 | 0;\r\n              } while ((m | 0) < (p | 0));\r\n              Ga = (f | 0) != 7;\r\n              Ha = d + 1168 | 0;\r\n              if (Ga) {\r\n                  ab(n, f, La, g, Ha, r, Ta);\r\n                  m = d + 392 | 0;\r\n                  ae(m, r, k, Ta);\r\n                  g = g + 6 | 0;\r\n              } else {\r\n                  cb(n, La, g, Ha, q, r, Ta);\r\n                  m = d + 392 | 0;\r\n                  _d(m, q, r, k, Ta);\r\n                  g = g + 10 | 0;\r\n              }\r\n              o = r;\r\n              p = m + 20 | 0;\r\n              do {\r\n                  b[m >> 1] = b[o >> 1] | 0;\r\n                  m = m + 2 | 0;\r\n                  o = o + 2 | 0;\r\n              } while ((m | 0) < (p | 0));\r\n              Ca = f >>> 0 > 1;\r\n              B = f >>> 0 < 4 & 1;\r\n              Ba = (f | 0) == 5;\r\n              Aa = Ba ? 10 : 5;\r\n              Ba = Ba ? 19 : 9;\r\n              E = d + 434 | 0;\r\n              F = 143 - Ba & 65535;\r\n              G = d + 460 | 0;\r\n              H = d + 462 | 0;\r\n              I = d + 464 | 0;\r\n              C = f >>> 0 > 2;\r\n              J = d + 388 | 0;\r\n              K = (f | 0) == 0;\r\n              L = f >>> 0 < 2;\r\n              M = d + 1244 | 0;\r\n              N = d + 432 | 0;\r\n              O = f >>> 0 < 6;\r\n              P = d + 1168 | 0;\r\n              Q = (f | 0) == 6;\r\n              R = La << 16 >> 16 == 0;\r\n              S = d + 714 | 0;\r\n              T = d + 686 | 0;\r\n              U = d + 436 | 0;\r\n              V = d + 700 | 0;\r\n              W = (f | 0) == 7;\r\n              X = d + 482 | 0;\r\n              Y = f >>> 0 < 3;\r\n              _ = d + 608 | 0;\r\n              $ = d + 626 | 0;\r\n              aa = d + 438 | 0;\r\n              ba = f >>> 0 < 7;\r\n              ca = d + 730 | 0;\r\n              D = Ja ^ 1;\r\n              da = l << 16 >> 16 != 0;\r\n              za = da ? La ^ 1 : 0;\r\n              ea = d + 442 | 0;\r\n              fa = d + 458 | 0;\r\n              ga = d + 412 | 0;\r\n              ha = d + 80 | 0;\r\n              ia = d + 1236 | 0;\r\n              ja = d + 1240 | 0;\r\n              ka = d + 468 | 0;\r\n              la = d + 466 | 0;\r\n              ma = d + 470 | 0;\r\n              na = d + 472 | 0;\r\n              oa = d + 474 | 0;\r\n              pa = d + 476 | 0;\r\n              qa = d + 478 | 0;\r\n              ra = d + 480 | 0;\r\n              sa = d + 444 | 0;\r\n              ta = d + 446 | 0;\r\n              ua = d + 448 | 0;\r\n              va = d + 450 | 0;\r\n              wa = d + 452 | 0;\r\n              xa = d + 454 | 0;\r\n              ya = d + 456 | 0;\r\n              y = 0;\r\n              z = 0;\r\n              s = 0;\r\n              t = 0;\r\n              A = -1;\r\n              while (1) {\r\n                  A = (A << 16 >> 16) + 1 | 0;\r\n                  p = A & 65535;\r\n                  z = 1 - (z << 16 >> 16) | 0;\r\n                  v = z & 65535;\r\n                  q = Ca & s << 16 >> 16 == 80 ? 0 : s;\r\n                  u = g + 2 | 0;\r\n                  r = b[g >> 1] | 0;\r\n                  a:do if (Ga) {\r\n                      w = b[E >> 1] | 0;\r\n                      m = (w & 65535) - Aa & 65535;\r\n                      m = m << 16 >> 16 < 20 ? 20 : m;\r\n                      o = (m & 65535) + Ba & 65535;\r\n                      n = o << 16 >> 16 > 143;\r\n                      Ya(r, n ? F : m, n ? 143 : o, q, w, eb, ib, B, Ta);\r\n                      q = b[eb >> 1] | 0;\r\n                      b[G >> 1] = q;\r\n                      if (Ja) {\r\n                          r = b[E >> 1] | 0;\r\n                          if (r << 16 >> 16 < 143) {\r\n                              r = (r & 65535) + 1 & 65535;\r\n                              b[E >> 1] = r;\r\n                          }\r\n                          b[eb >> 1] = r;\r\n                          b[ib >> 1] = 0;\r\n                          if ((b[H >> 1] | 0) != 0 ? !(C | (b[I >> 1] | 0) < 5) : 0) {\r\n                              b[eb >> 1] = q;\r\n                              r = q;\r\n                              q = 0;\r\n                          } else q = 0;\r\n                      } else {\r\n                          r = q;\r\n                          q = b[ib >> 1] | 0;\r\n                      }\r\n                      se(c[J >> 2] | 0, r, q, 40, 1, Ta);\r\n                      if (L) {\r\n                          q = g + 6 | 0;\r\n                          Pa(p, b[g + 4 >> 1] | 0, b[u >> 1] | 0, c[M >> 2] | 0, mb, Ta);\r\n                          g = b[N >> 1] | 0;\r\n                          w = g << 16 >> 16;\r\n                          r = w << 1;\r\n                          if ((r | 0) == (w << 17 >> 16 | 0)) {\r\n                              o = K;\r\n                              break\r\n                          }\r\n                          o = K;\r\n                          r = g << 16 >> 16 > 0 ? 32767 : -32768;\r\n                          break\r\n                      }\r\n                      switch (f | 0) {\r\n                          case 2: {\r\n                              q = g + 6 | 0;\r\n                              Oa(b[g + 4 >> 1] | 0, b[u >> 1] | 0, mb);\r\n                              g = b[N >> 1] | 0;\r\n                              w = g << 16 >> 16;\r\n                              r = w << 1;\r\n                              if ((r | 0) == (w << 17 >> 16 | 0)) {\r\n                                  o = K;\r\n                                  break a\r\n                              }\r\n                              o = K;\r\n                              r = g << 16 >> 16 > 0 ? 32767 : -32768;\r\n                              break a\r\n                          }\r\n                          case 3: {\r\n                              q = g + 6 | 0;\r\n                              Qa(b[g + 4 >> 1] | 0, b[u >> 1] | 0, mb);\r\n                              g = b[N >> 1] | 0;\r\n                              w = g << 16 >> 16;\r\n                              r = w << 1;\r\n                              if ((r | 0) == (w << 17 >> 16 | 0)) {\r\n                                  o = K;\r\n                                  break a\r\n                              }\r\n                              o = K;\r\n                              r = g << 16 >> 16 > 0 ? 32767 : -32768;\r\n                              break a\r\n                          }\r\n                          default: {\r\n                              if (O) {\r\n                                  q = g + 6 | 0;\r\n                                  Ra(b[g + 4 >> 1] | 0, b[u >> 1] | 0, c[P >> 2] | 0, mb);\r\n                                  g = b[N >> 1] | 0;\r\n                                  w = g << 16 >> 16;\r\n                                  r = w << 1;\r\n                                  if ((r | 0) == (w << 17 >> 16 | 0)) {\r\n                                      o = K;\r\n                                      break a\r\n                                  }\r\n                                  o = K;\r\n                                  r = g << 16 >> 16 > 0 ? 32767 : -32768;\r\n                                  break a\r\n                              }\r\n                              if (!Q) {\r\n                                  o = K;\r\n                                  x = 44;\r\n                                  break a\r\n                              }\r\n                              Sa(u, mb, Ta);\r\n                              r = g + 16 | 0;\r\n                              g = b[N >> 1] | 0;\r\n                              w = g << 16 >> 16;\r\n                              p = w << 1;\r\n                              if ((p | 0) == (w << 17 >> 16 | 0)) {\r\n                                  q = r;\r\n                                  o = K;\r\n                                  r = p;\r\n                                  break a\r\n                              }\r\n                              q = r;\r\n                              o = K;\r\n                              r = g << 16 >> 16 > 0 ? 32767 : -32768;\r\n                              break a\r\n                          }\r\n                      }\r\n                  } else {\r\n                      Za(r, 18, 143, q, eb, ib, Ta);\r\n                      if (R ? q << 16 >> 16 == 0 | r << 16 >> 16 < 61 : 0) {\r\n                          r = b[eb >> 1] | 0;\r\n                          q = b[ib >> 1] | 0;\r\n                      } else {\r\n                          b[G >> 1] = b[eb >> 1] | 0;\r\n                          r = b[E >> 1] | 0;\r\n                          b[eb >> 1] = r;\r\n                          b[ib >> 1] = 0;\r\n                          q = 0;\r\n                      }\r\n                      se(c[J >> 2] | 0, r, q, 40, 0, Ta);\r\n                      o = 0;\r\n                      x = 44;\r\n                  } while (0);\r\n                  if ((x | 0) == 44) {\r\n                      x = 0;\r\n                      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;\r\n                      nb(T, La, b[U >> 1] | 0, xb, Ta);\r\n                      Na(g + 4 | 0, mb, c[P >> 2] | 0);\r\n                      r = g + 24 | 0;\r\n                      g = b[xb >> 1] | 0;\r\n                      w = g << 16 >> 16;\r\n                      p = w << 1;\r\n                      if ((p | 0) == (w << 17 >> 16 | 0)) {\r\n                          q = r;\r\n                          r = p;\r\n                      } else {\r\n                          q = r;\r\n                          r = g << 16 >> 16 > 0 ? 32767 : -32768;\r\n                      }\r\n                  }\r\n                  g = b[eb >> 1] | 0;\r\n                  b:do if (g << 16 >> 16 < 40) {\r\n                      m = r << 16 >> 16;\r\n                      n = g;\r\n                      r = g << 16 >> 16;\r\n                      while (1) {\r\n                          p = mb + (r << 1) | 0;\r\n                          g = (Z(b[mb + (r - (n << 16 >> 16) << 1) >> 1] | 0, m) | 0) >> 15;\r\n                          if ((g | 0) > 32767) {\r\n                              c[Ta >> 2] = 1;\r\n                              g = 32767;\r\n                          }\r\n                          w = g & 65535;\r\n                          b[Ab >> 1] = w;\r\n                          b[p >> 1] = Rd(b[p >> 1] | 0, w, Ta) | 0;\r\n                          r = r + 1 | 0;\r\n                          if ((r & 65535) << 16 >> 16 == 40) break b;\r\n                          n = b[eb >> 1] | 0;\r\n                      }\r\n                  } while (0);\r\n                  c:do if (o) {\r\n                      o = (z & 65535 | 0) == 0;\r\n                      if (o) {\r\n                          g = q;\r\n                          p = t;\r\n                      } else {\r\n                          g = q + 2 | 0;\r\n                          p = b[q >> 1] | 0;\r\n                      }\r\n                      if (R) Xa(S, f, p, mb, v, xb, tb, Ha, Ta); else {\r\n                          lb(T, b[h >> 1] | 0, xb, Ta);\r\n                          jb(V, S, b[h >> 1] | 0, tb, Ta);\r\n                      }\r\n                      nb(T, La, b[U >> 1] | 0, xb, Ta);\r\n                      kb(V, La, b[U >> 1] | 0, tb, Ta);\r\n                      q = b[xb >> 1] | 0;\r\n                      r = q << 16 >> 16 > 13017 ? 13017 : q;\r\n                      if (o) x = 80; else w = p;\r\n                  } else {\r\n                      g = q + 2 | 0;\r\n                      r = b[q >> 1] | 0;\r\n                      switch (f | 0) {\r\n                          case 1:\r\n                          case 2:\r\n                          case 3:\r\n                          case 4:\r\n                          case 6: {\r\n                              if (R) Xa(S, f, r, mb, v, xb, tb, Ha, Ta); else {\r\n                                  lb(T, b[h >> 1] | 0, xb, Ta);\r\n                                  jb(V, S, b[h >> 1] | 0, tb, Ta);\r\n                              }\r\n                              nb(T, La, b[U >> 1] | 0, xb, Ta);\r\n                              kb(V, La, b[U >> 1] | 0, tb, Ta);\r\n                              q = b[xb >> 1] | 0;\r\n                              r = q << 16 >> 16 > 13017 ? 13017 : q;\r\n                              if (!Q) {\r\n                                  p = t;\r\n                                  x = 80;\r\n                                  break c\r\n                              }\r\n                              if ((b[E >> 1] | 0) <= 45) {\r\n                                  p = t;\r\n                                  x = 80;\r\n                                  break c\r\n                              }\r\n                              p = t;\r\n                              r = r << 16 >> 16 >>> 2 & 65535;\r\n                              x = 80;\r\n                              break c\r\n                          }\r\n                          case 5: {\r\n                              if (Ja) lb(T, b[h >> 1] | 0, xb, Ta); else b[xb >> 1] = $a(5, r, c[ja >> 2] | 0) | 0;\r\n                              nb(T, La, b[U >> 1] | 0, xb, Ta);\r\n                              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);\r\n                              kb(V, La, b[U >> 1] | 0, tb, Ta);\r\n                              r = b[xb >> 1] | 0;\r\n                              g = q + 4 | 0;\r\n                              q = r;\r\n                              p = t;\r\n                              r = r << 16 >> 16 > 13017 ? 13017 : r;\r\n                              x = 80;\r\n                              break c\r\n                          }\r\n                          default: {\r\n                              if (R) _a(S, f, r, mb, c[ia >> 2] | 0, tb, Ta); else jb(V, S, b[h >> 1] | 0, tb, Ta);\r\n                              kb(V, La, b[U >> 1] | 0, tb, Ta);\r\n                              r = b[xb >> 1] | 0;\r\n                              q = r;\r\n                              p = t;\r\n                              x = 80;\r\n                              break c\r\n                          }\r\n                      }\r\n                  } while (0);\r\n                  if ((x | 0) == 80) {\r\n                      x = 0;\r\n                      b[N >> 1] = q << 16 >> 16 > 13017 ? 13017 : q;\r\n                      w = p;\r\n                  }\r\n                  r = r << 16 >> 16;\r\n                  r = (r << 17 >> 17 | 0) == (r | 0) ? r << 1 : r >>> 15 ^ 32767;\r\n                  v = (r & 65535) << 16 >> 16 > 16384;\r\n                  d:do if (v) {\r\n                      u = r << 16 >> 16;\r\n                      if (W) q = 0; else {\r\n                          q = 0;\r\n                          while (1) {\r\n                              r = (Z(b[(c[J >> 2] | 0) + (q << 1) >> 1] | 0, u) | 0) >> 15;\r\n                              if ((r | 0) > 32767) {\r\n                                  c[Ta >> 2] = 1;\r\n                                  r = 32767;\r\n                              }\r\n                              b[Ab >> 1] = r;\r\n                              r = Z(b[xb >> 1] | 0, r << 16 >> 16) | 0;\r\n                              if ((r | 0) == 1073741824) {\r\n                                  c[Ta >> 2] = 1;\r\n                                  r = 2147483647;\r\n                              } else r = r << 1;\r\n                              b[rb + (q << 1) >> 1] = Ce(r, Ta) | 0;\r\n                              q = q + 1 | 0;\r\n                              if ((q | 0) == 40) break d\r\n                          }\r\n                      }\r\n                      do {\r\n                          r = (Z(b[(c[J >> 2] | 0) + (q << 1) >> 1] | 0, u) | 0) >> 15;\r\n                          if ((r | 0) > 32767) {\r\n                              c[Ta >> 2] = 1;\r\n                              r = 32767;\r\n                          }\r\n                          b[Ab >> 1] = r;\r\n                          r = Z(b[xb >> 1] | 0, r << 16 >> 16) | 0;\r\n                          if ((r | 0) != 1073741824) {\r\n                              r = r << 1;\r\n                              if ((r | 0) < 0) r = ~((r ^ -2) >> 1); else x = 88;\r\n                          } else {\r\n                              c[Ta >> 2] = 1;\r\n                              r = 2147483647;\r\n                              x = 88;\r\n                          }\r\n                          if ((x | 0) == 88) {\r\n                              x = 0;\r\n                              r = r >> 1;\r\n                          }\r\n                          b[rb + (q << 1) >> 1] = Ce(r, Ta) | 0;\r\n                          q = q + 1 | 0;\r\n                      } while ((q | 0) != 40)\r\n                  } while (0);\r\n                  if (R) {\r\n                      b[la >> 1] = b[ka >> 1] | 0;\r\n                      b[ka >> 1] = b[ma >> 1] | 0;\r\n                      b[ma >> 1] = b[na >> 1] | 0;\r\n                      b[na >> 1] = b[oa >> 1] | 0;\r\n                      b[oa >> 1] = b[pa >> 1] | 0;\r\n                      b[pa >> 1] = b[qa >> 1] | 0;\r\n                      b[qa >> 1] = b[ra >> 1] | 0;\r\n                      b[ra >> 1] = b[X >> 1] | 0;\r\n                      b[X >> 1] = b[xb >> 1] | 0;\r\n                  }\r\n                  if ((Ja | (b[U >> 1] | 0) != 0 ? Y & (b[H >> 1] | 0) != 0 : 0) ? (bb = b[xb >> 1] | 0, bb << 16 >> 16 > 12288) : 0) {\r\n                      x = (((bb << 16 >> 16) + 118784 | 0) >>> 1) + 12288 & 65535;\r\n                      b[xb >> 1] = x << 16 >> 16 > 14745 ? 14745 : x;\r\n                  }\r\n                  qb(zb, Fa, s, yb, Ta);\r\n                  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;\r\n                  switch (f | 0) {\r\n                      case 0:\r\n                      case 1:\r\n                      case 2:\r\n                      case 3:\r\n                      case 6: {\r\n                          p = b[xb >> 1] | 0;\r\n                          u = 1;\r\n                          break\r\n                      }\r\n                      default: {\r\n                          r = b[tb >> 1] | 0;\r\n                          p = b[xb >> 1] | 0;\r\n                          if (ba) u = 1; else {\r\n                              q = p << 16 >> 16;\r\n                              if (p << 16 >> 16 < 0) q = ~((q ^ -2) >> 1); else q = q >>> 1;\r\n                              p = q & 65535;\r\n                              u = 2;\r\n                          }\r\n                      }\r\n                  }\r\n                  m = p << 16 >> 16;\r\n                  s = u & 65535;\r\n                  q = c[J >> 2] | 0;\r\n                  t = 0;\r\n                  do {\r\n                      q = q + (t << 1) | 0;\r\n                      b[pb + (t << 1) >> 1] = b[q >> 1] | 0;\r\n                      q = Z(b[q >> 1] | 0, m) | 0;\r\n                      if ((q | 0) == 1073741824) {\r\n                          c[Ta >> 2] = 1;\r\n                          n = 2147483647;\r\n                      } else n = q << 1;\r\n                      o = Z(b[tb >> 1] | 0, b[mb + (t << 1) >> 1] | 0) | 0;\r\n                      if ((o | 0) != 1073741824) {\r\n                          q = (o << 1) + n | 0;\r\n                          if ((o ^ n | 0) > 0 & (q ^ n | 0) < 0) {\r\n                              c[Ta >> 2] = 1;\r\n                              q = (n >>> 31) + 2147483647 | 0;\r\n                          }\r\n                      } else {\r\n                          c[Ta >> 2] = 1;\r\n                          q = 2147483647;\r\n                      }\r\n                      x = q << s;\r\n                      x = Ce((x >> s | 0) == (q | 0) ? x : q >> 31 ^ 2147483647, Ta) | 0;\r\n                      q = c[J >> 2] | 0;\r\n                      b[q + (t << 1) >> 1] = x;\r\n                      t = t + 1 | 0;\r\n                  } while ((t | 0) != 40);\r\n                  vb(ca);\r\n                  if ((Y ? (b[I >> 1] | 0) > 3 : 0) ? !((b[H >> 1] | 0) == 0 | D) : 0) ub(ca);\r\n                  wb(ca, f, pb, r, b[xb >> 1] | 0, mb, p, u, Ha, Ta);\r\n                  r = 0;\r\n                  o = 0;\r\n                  do {\r\n                      q = b[pb + (o << 1) >> 1] | 0;\r\n                      q = Z(q, q) | 0;\r\n                      if ((q | 0) != 1073741824) {\r\n                          p = (q << 1) + r | 0;\r\n                          if ((q ^ r | 0) > 0 & (p ^ r | 0) < 0) {\r\n                              c[Ta >> 2] = 1;\r\n                              r = (r >>> 31) + 2147483647 | 0;\r\n                          } else r = p;\r\n                      } else {\r\n                          c[Ta >> 2] = 1;\r\n                          r = 2147483647;\r\n                      }\r\n                      o = o + 1 | 0;\r\n                  } while ((o | 0) != 40);\r\n                  if ((r | 0) < 0) r = ~((r ^ -2) >> 1); else r = r >> 1;\r\n                  r = Fe(r, Ab, Ta) | 0;\r\n                  p = ((b[Ab >> 1] | 0) >>> 1) + 15 | 0;\r\n                  q = p & 65535;\r\n                  p = p << 16 >> 16;\r\n                  if (q << 16 >> 16 > 0) if (q << 16 >> 16 < 31) {\r\n                      r = r >> p;\r\n                      x = 135;\r\n                  } else {\r\n                      r = 0;\r\n                      x = 137;\r\n                  } else {\r\n                      u = 0 - p << 16 >> 16;\r\n                      x = r << u;\r\n                      r = (x >> u | 0) == (r | 0) ? x : r >> 31 ^ 2147483647;\r\n                      x = 135;\r\n                  }\r\n                  if ((x | 0) == 135) {\r\n                      x = 0;\r\n                      if ((r | 0) < 0) r = ~((r ^ -4) >> 2); else x = 137;\r\n                  }\r\n                  if ((x | 0) == 137) {\r\n                      x = 0;\r\n                      r = r >>> 2;\r\n                  }\r\n                  r = r & 65535;\r\n                  do if (Y ? (db = b[I >> 1] | 0, db << 16 >> 16 > 5) : 0) if (b[H >> 1] | 0) if ((b[h >> 1] | 0) < 4) {\r\n                      if (da) {\r\n                          if (!(Ja | (b[aa >> 1] | 0) != 0)) x = 145;\r\n                      } else if (!Ja) x = 145;\r\n                      if ((x | 0) == 145 ? (0, (b[U >> 1] | 0) == 0) : 0) {\r\n                          x = 147;\r\n                          break\r\n                      }\r\n                      ob(pb, r, ea, db, b[U >> 1] | 0, za, Ta) | 0;\r\n                      x = 147;\r\n                  } else x = 147; else x = 151; else x = 147; while (0);\r\n                  do if ((x | 0) == 147) {\r\n                      x = 0;\r\n                      if (b[H >> 1] | 0) {\r\n                          if (!Ja ? (b[U >> 1] | 0) == 0 : 0) {\r\n                              x = 151;\r\n                              break\r\n                          }\r\n                          if ((b[h >> 1] | 0) >= 4) x = 151;\r\n                      } else x = 151;\r\n                  } while (0);\r\n                  if ((x | 0) == 151) {\r\n                      x = 0;\r\n                      b[ea >> 1] = b[sa >> 1] | 0;\r\n                      b[sa >> 1] = b[ta >> 1] | 0;\r\n                      b[ta >> 1] = b[ua >> 1] | 0;\r\n                      b[ua >> 1] = b[va >> 1] | 0;\r\n                      b[va >> 1] = b[wa >> 1] | 0;\r\n                      b[wa >> 1] = b[xa >> 1] | 0;\r\n                      b[xa >> 1] = b[ya >> 1] | 0;\r\n                      b[ya >> 1] = b[fa >> 1] | 0;\r\n                      b[fa >> 1] = r;\r\n                  }\r\n                  if (v) {\r\n                      r = 0;\r\n                      do {\r\n                          v = rb + (r << 1) | 0;\r\n                          b[v >> 1] = Rd(b[v >> 1] | 0, b[pb + (r << 1) >> 1] | 0, Ta) | 0;\r\n                          r = r + 1 | 0;\r\n                      } while ((r | 0) != 40);\r\n                      Da(pb, rb, 40, Ta);\r\n                      c[Ta >> 2] = 0;\r\n                      He(k, rb, j + (y << 1) | 0, 40, ga, 0);\r\n                  } else {\r\n                      c[Ta >> 2] = 0;\r\n                      He(k, pb, j + (y << 1) | 0, 40, ga, 0);\r\n                  }\r\n                  if (!(c[Ta >> 2] | 0)) Pe(ga | 0, j + (y + 30 << 1) | 0, 20) | 0; else {\r\n                      p = 193;\r\n                      while (1) {\r\n                          q = d + (p << 1) | 0;\r\n                          v = b[q >> 1] | 0;\r\n                          r = v << 16 >> 16;\r\n                          if (v << 16 >> 16 < 0) r = ~((r ^ -4) >> 2); else r = r >>> 2;\r\n                          b[q >> 1] = r;\r\n                          if ((p | 0) > 0) p = p + -1 | 0; else {\r\n                              p = 39;\r\n                              break\r\n                          }\r\n                      }\r\n                      while (1) {\r\n                          q = pb + (p << 1) | 0;\r\n                          v = b[q >> 1] | 0;\r\n                          r = v << 16 >> 16;\r\n                          if (v << 16 >> 16 < 0) r = ~((r ^ -4) >> 2); else r = r >>> 2;\r\n                          b[q >> 1] = r;\r\n                          if ((p | 0) > 0) p = p + -1 | 0; else break\r\n                      }\r\n                      He(k, pb, j + (y << 1) | 0, 40, ga, 1);\r\n                  }\r\n                  Pe(d | 0, ha | 0, 308) | 0;\r\n                  b[E >> 1] = b[eb >> 1] | 0;\r\n                  r = y + 40 | 0;\r\n                  s = r & 65535;\r\n                  if (s << 16 >> 16 >= 160) break; else {\r\n                      y = r << 16 >> 16;\r\n                      k = k + 22 | 0;\r\n                      t = w;\r\n                  }\r\n              }\r\n              b[H >> 1] = Ka(d + 484 | 0, d + 466 | 0, j, I, Ta) | 0;\r\n              gb(Ua, Fa, j, Ta);\r\n              b[U >> 1] = La;\r\n              b[aa >> 1] = l;\r\n              sb(d + 626 | 0, Fa, Ta);\r\n              Ab = Ea;\r\n              c[Ab >> 2] = Wa;\r\n              i = Bb;\r\n              return\r\n          }\r\n\r\n          function Xa(a, d, f, g, h, j, k, l, m) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              var n = 0, o = 0, p = 0, q = 0, r = 0;\r\n              r = i;\r\n              i = i + 16 | 0;\r\n              p = r + 2 | 0;\r\n              q = r;\r\n              f = f << 16 >> 16;\r\n              f = (f << 18 >> 18 | 0) == (f | 0) ? f << 2 : f >>> 15 ^ 32767;\r\n              switch (d | 0) {\r\n                  case 3:\r\n                  case 4:\r\n                  case 6: {\r\n                      o = f << 16 >> 16;\r\n                      f = c[l + 84 >> 2] | 0;\r\n                      b[j >> 1] = b[f + (o << 1) >> 1] | 0;\r\n                      l = b[f + (o + 1 << 1) >> 1] | 0;\r\n                      n = b[f + (o + 3 << 1) >> 1] | 0;\r\n                      j = b[f + (o + 2 << 1) >> 1] | 0;\r\n                      break\r\n                  }\r\n                  case 0: {\r\n                      l = (f & 65535) + (h << 16 >> 16 << 1 ^ 2) | 0;\r\n                      l = (l & 65535) << 16 >> 16 > 1022 ? 1022 : l << 16 >> 16;\r\n                      b[j >> 1] = b[782 + (l << 1) >> 1] | 0;\r\n                      j = b[782 + (l + 1 << 1) >> 1] | 0;\r\n                      de(j << 16 >> 16, q, p, m);\r\n                      b[q >> 1] = (e[q >> 1] | 0) + 65524;\r\n                      l = Ee(b[p >> 1] | 0, 5, m) | 0;\r\n                      o = b[q >> 1] | 0;\r\n                      o = Rd(l, ((o << 26 >> 26 | 0) == (o | 0) ? o << 10 : o >>> 15 ^ 32767) & 65535, m) | 0;\r\n                      l = b[p >> 1] | 0;\r\n                      f = b[q >> 1] | 0;\r\n                      if ((f * 24660 | 0) == 1073741824) {\r\n                          c[m >> 2] = 1;\r\n                          h = 2147483647;\r\n                      } else h = f * 49320 | 0;\r\n                      n = (l << 16 >> 16) * 24660 >> 15;\r\n                      f = h + (n << 1) | 0;\r\n                      if ((h ^ n | 0) > 0 & (f ^ h | 0) < 0) {\r\n                          c[m >> 2] = 1;\r\n                          f = (h >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      n = f << 13;\r\n                      l = j;\r\n                      n = Ce((n >> 13 | 0) == (f | 0) ? n : f >> 31 ^ 2147483647, m) | 0;\r\n                      j = o;\r\n                      break\r\n                  }\r\n                  default: {\r\n                      o = f << 16 >> 16;\r\n                      f = c[l + 80 >> 2] | 0;\r\n                      b[j >> 1] = b[f + (o << 1) >> 1] | 0;\r\n                      l = b[f + (o + 1 << 1) >> 1] | 0;\r\n                      n = b[f + (o + 3 << 1) >> 1] | 0;\r\n                      j = b[f + (o + 2 << 1) >> 1] | 0;\r\n                  }\r\n              }\r\n              Vd(a, d, g, q, p, 0, 0, m);\r\n              h = Z((re(14, b[p >> 1] | 0, m) | 0) << 16 >> 16, l << 16 >> 16) | 0;\r\n              if ((h | 0) == 1073741824) {\r\n                  c[m >> 2] = 1;\r\n                  f = 2147483647;\r\n              } else f = h << 1;\r\n              l = 10 - (e[q >> 1] | 0) | 0;\r\n              h = l & 65535;\r\n              l = l << 16 >> 16;\r\n              if (h << 16 >> 16 > 0) {\r\n                  q = h << 16 >> 16 < 31 ? f >> l : 0;\r\n                  q = q >>> 16;\r\n                  q = q & 65535;\r\n                  b[k >> 1] = q;\r\n                  Wd(a, j, n);\r\n                  i = r;\r\n                  return\r\n              } else {\r\n                  m = 0 - l << 16 >> 16;\r\n                  q = f << m;\r\n                  q = (q >> m | 0) == (f | 0) ? q : f >> 31 ^ 2147483647;\r\n                  q = q >>> 16;\r\n                  q = q & 65535;\r\n                  b[k >> 1] = q;\r\n                  Wd(a, j, n);\r\n                  i = r;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function Ya(a, d, e, f, g, h, i, j, k) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              if (!(f << 16 >> 16)) {\r\n                  j = a << 16 >> 16;\r\n                  if (a << 16 >> 16 >= 197) {\r\n                      b[h >> 1] = j + 65424;\r\n                      b[i >> 1] = 0;\r\n                      return\r\n                  }\r\n                  g = ((j << 16) + 131072 >> 16) * 10923 >> 15;\r\n                  if ((g | 0) > 32767) {\r\n                      c[k >> 2] = 1;\r\n                      g = 32767;\r\n                  }\r\n                  a = (g & 65535) + 19 | 0;\r\n                  b[h >> 1] = a;\r\n                  b[i >> 1] = j + 58 - ((a * 196608 | 0) >>> 16);\r\n                  return\r\n              }\r\n              if (!(j << 16 >> 16)) {\r\n                  k = a << 16 >> 16 << 16;\r\n                  a = ((k + 131072 >> 16) * 21846 | 0) + -65536 >> 16;\r\n                  b[h >> 1] = a + (d & 65535);\r\n                  b[i >> 1] = ((k + -131072 | 0) >>> 16) - ((a * 196608 | 0) >>> 16);\r\n                  return\r\n              }\r\n              if ((Ge(g, d, k) | 0) << 16 >> 16 > 5) g = (d & 65535) + 5 & 65535;\r\n              j = e << 16 >> 16;\r\n              j = (j - (g & 65535) & 65535) << 16 >> 16 > 4 ? j + 65532 & 65535 : g;\r\n              g = a << 16 >> 16;\r\n              if (a << 16 >> 16 < 4) {\r\n                  b[h >> 1] = ((((j & 65535) << 16) + -327680 | 0) >>> 16) + g;\r\n                  b[i >> 1] = 0;\r\n                  return\r\n              }\r\n              g = g << 16;\r\n              if (a << 16 >> 16 < 12) {\r\n                  k = (((g + -327680 >> 16) * 10923 | 0) >>> 15 << 16) + -65536 | 0;\r\n                  a = k >> 16;\r\n                  b[h >> 1] = (j & 65535) + a;\r\n                  b[i >> 1] = ((g + -589824 | 0) >>> 16) - (k >>> 15) - a;\r\n                  return\r\n              } else {\r\n                  b[h >> 1] = ((g + -786432 + ((j & 65535) << 16) | 0) >>> 16) + 1;\r\n                  b[i >> 1] = 0;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function Za(a, c, d, f, g, h, i) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              if (f << 16 >> 16) {\r\n                  i = (e[g >> 1] | 0) + 65531 | 0;\r\n                  i = (i << 16 >> 16 | 0) < (c << 16 >> 16 | 0) ? c : i & 65535;\r\n                  d = d << 16 >> 16;\r\n                  c = a << 16 >> 16 << 16;\r\n                  a = ((c + 327680 >> 16) * 10924 | 0) + -65536 >> 16;\r\n                  b[g >> 1] = (((((i & 65535) << 16) + 589824 >> 16 | 0) > (d | 0) ? d + 65527 & 65535 : i) & 65535) + a;\r\n                  b[h >> 1] = ((c + -196608 | 0) >>> 16) - ((a * 393216 | 0) >>> 16);\r\n                  return\r\n              }\r\n              f = a << 16 >> 16;\r\n              if (a << 16 >> 16 < 463) {\r\n                  a = ((((f << 16) + 327680 >> 16) * 10924 | 0) >>> 16) + 17 | 0;\r\n                  b[g >> 1] = a;\r\n                  b[h >> 1] = f + 105 - ((a * 393216 | 0) >>> 16);\r\n                  return\r\n              } else {\r\n                  b[g >> 1] = f + 65168;\r\n                  b[h >> 1] = 0;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function _a(a, d, e, f, g, h, j) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              var k = 0, l = 0, m = 0, n = 0;\r\n              n = i;\r\n              i = i + 16 | 0;\r\n              l = n + 6 | 0;\r\n              k = n + 4 | 0;\r\n              Vd(a, d, f, l, k, n + 2 | 0, n, j);\r\n              m = (e & 31) * 3 | 0;\r\n              f = g + (m << 1) | 0;\r\n              if (!((Ge(d & 65535, 7, j) | 0) << 16 >> 16)) {\r\n                  l = re(b[l >> 1] | 0, b[k >> 1] | 0, j) | 0;\r\n                  k = l << 16 >> 16;\r\n                  k = (Z(((l << 20 >> 20 | 0) == (k | 0) ? l << 4 : k >>> 15 ^ 32767) << 16 >> 16, b[f >> 1] | 0) | 0) >> 15;\r\n                  if ((k | 0) > 32767) {\r\n                      c[j >> 2] = 1;\r\n                      k = 32767;\r\n                  }\r\n                  f = k << 16;\r\n                  e = f >> 16;\r\n                  if ((k << 17 >> 17 | 0) == (e | 0)) k = f >> 15; else k = e >>> 15 ^ 32767;\r\n              } else {\r\n                  e = re(14, b[k >> 1] | 0, j) | 0;\r\n                  e = Z(e << 16 >> 16, b[f >> 1] | 0) | 0;\r\n                  if ((e | 0) == 1073741824) {\r\n                      c[j >> 2] = 1;\r\n                      f = 2147483647;\r\n                  } else f = e << 1;\r\n                  e = Ge(9, b[l >> 1] | 0, j) | 0;\r\n                  k = e << 16 >> 16;\r\n                  if (e << 16 >> 16 > 0) k = e << 16 >> 16 < 31 ? f >> k : 0; else {\r\n                      j = 0 - k << 16 >> 16;\r\n                      k = f << j;\r\n                      k = (k >> j | 0) == (f | 0) ? k : f >> 31 ^ 2147483647;\r\n                  }\r\n                  k = k >>> 16;\r\n              }\r\n              b[h >> 1] = k;\r\n              Wd(a, b[g + (m + 1 << 1) >> 1] | 0, b[g + (m + 2 << 1) >> 1] | 0);\r\n              i = n;\r\n              return\r\n          }\r\n\r\n          function $a(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              c = b[d + (c << 16 >> 16 << 1) >> 1] | 0;\r\n              if ((a | 0) != 7) {\r\n                  a = c;\r\n                  return a | 0\r\n              }\r\n              a = c & 65532;\r\n              return a | 0\r\n          }\r\n\r\n          function ab(d, e, f, g, h, j, k) {\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              var l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0;\r\n              v = i;\r\n              i = i + 48 | 0;\r\n              r = v + 20 | 0;\r\n              u = v;\r\n              t = c[h + 44 >> 2] | 0;\r\n              s = c[h + 64 >> 2] | 0;\r\n              l = c[h + 4 >> 2] | 0;\r\n              q = c[h + 12 >> 2] | 0;\r\n              n = c[h + 20 >> 2] | 0;\r\n              m = c[h + 56 >> 2] | 0;\r\n              if (!(f << 16 >> 16)) {\r\n                  o = e >>> 0 < 2;\r\n                  if (o) {\r\n                      f = 765;\r\n                      p = 508;\r\n                      n = c[h + 52 >> 2] | 0;\r\n                  } else {\r\n                      h = (e | 0) == 5;\r\n                      f = h ? 1533 : 765;\r\n                      p = 2044;\r\n                      l = h ? m : l;\r\n                  }\r\n                  m = b[g >> 1] | 0;\r\n                  f = ((m * 196608 >> 16 | 0) > (f & 65535 | 0) ? f : m * 3 & 65535) << 16 >> 16;\r\n                  m = b[l + (f << 1) >> 1] | 0;\r\n                  b[r >> 1] = m;\r\n                  b[r + 2 >> 1] = b[l + (f + 1 << 1) >> 1] | 0;\r\n                  b[r + 4 >> 1] = b[l + (f + 2 << 1) >> 1] | 0;\r\n                  f = b[g + 2 >> 1] | 0;\r\n                  if (o) f = f << 16 >> 16 << 1 & 65535;\r\n                  o = (f << 16 >> 16) * 196608 | 0;\r\n                  o = (o | 0) > 100466688 ? 1533 : o >> 16;\r\n                  b[r + 6 >> 1] = b[q + (o << 1) >> 1] | 0;\r\n                  b[r + 8 >> 1] = b[q + (o + 1 << 1) >> 1] | 0;\r\n                  b[r + 10 >> 1] = b[q + (o + 2 << 1) >> 1] | 0;\r\n                  g = b[g + 4 >> 1] | 0;\r\n                  g = ((g << 18 >> 16 | 0) > (p & 65535 | 0) ? p : g << 2 & 65535) << 16 >> 16;\r\n                  b[r + 12 >> 1] = b[n + (g << 1) >> 1] | 0;\r\n                  b[r + 14 >> 1] = b[n + ((g | 1) << 1) >> 1] | 0;\r\n                  b[r + 16 >> 1] = b[n + ((g | 2) << 1) >> 1] | 0;\r\n                  b[r + 18 >> 1] = b[n + ((g | 3) << 1) >> 1] | 0;\r\n                  if ((e | 0) == 8) {\r\n                      f = 0;\r\n                      while (1) {\r\n                          s = d + (f << 1) | 0;\r\n                          b[u + (f << 1) >> 1] = Rd(m, Rd(b[t + (f << 1) >> 1] | 0, b[s >> 1] | 0, k) | 0, k) | 0;\r\n                          b[s >> 1] = m;\r\n                          f = f + 1 | 0;\r\n                          if ((f | 0) == 10) break;\r\n                          m = b[r + (f << 1) >> 1] | 0;\r\n                      }\r\n                      Ae(u, 205, 10, k);\r\n                      l = d + 20 | 0;\r\n                      m = u;\r\n                      f = l + 20 | 0;\r\n                      do {\r\n                          a[l >> 0] = a[m >> 0] | 0;\r\n                          l = l + 1 | 0;\r\n                          m = m + 1 | 0;\r\n                      } while ((l | 0) < (f | 0));\r\n                      me(u, j, 10, k);\r\n                      i = v;\r\n                      return\r\n                  } else l = 0;\r\n                  do {\r\n                      m = d + (l << 1) | 0;\r\n                      f = (Z(b[s + (l << 1) >> 1] | 0, b[m >> 1] | 0) | 0) >> 15;\r\n                      if ((f | 0) > 32767) {\r\n                          c[k >> 2] = 1;\r\n                          f = 32767;\r\n                      }\r\n                      g = Rd(b[t + (l << 1) >> 1] | 0, f & 65535, k) | 0;\r\n                      e = b[r + (l << 1) >> 1] | 0;\r\n                      b[u + (l << 1) >> 1] = Rd(e, g, k) | 0;\r\n                      b[m >> 1] = e;\r\n                      l = l + 1 | 0;\r\n                  } while ((l | 0) != 10);\r\n                  Ae(u, 205, 10, k);\r\n                  l = d + 20 | 0;\r\n                  m = u;\r\n                  f = l + 20 | 0;\r\n                  do {\r\n                      a[l >> 0] = a[m >> 0] | 0;\r\n                      l = l + 1 | 0;\r\n                      m = m + 1 | 0;\r\n                  } while ((l | 0) < (f | 0));\r\n                  me(u, j, 10, k);\r\n                  i = v;\r\n                  return\r\n              } else {\r\n                  l = 0;\r\n                  do {\r\n                      f = (b[d + 20 + (l << 1) >> 1] | 0) * 29491 >> 15;\r\n                      if ((f | 0) > 32767) {\r\n                          c[k >> 2] = 1;\r\n                          f = 32767;\r\n                      }\r\n                      m = (b[t + (l << 1) >> 1] | 0) * 3277 >> 15;\r\n                      if ((m | 0) > 32767) {\r\n                          c[k >> 2] = 1;\r\n                          m = 32767;\r\n                      }\r\n                      b[u + (l << 1) >> 1] = Rd(m & 65535, f & 65535, k) | 0;\r\n                      l = l + 1 | 0;\r\n                  } while ((l | 0) != 10);\r\n                  if ((e | 0) == 8) {\r\n                      l = 0;\r\n                      do {\r\n                          s = d + (l << 1) | 0;\r\n                          r = Rd(b[t + (l << 1) >> 1] | 0, b[s >> 1] | 0, k) | 0;\r\n                          b[s >> 1] = Ge(b[u + (l << 1) >> 1] | 0, r, k) | 0;\r\n                          l = l + 1 | 0;\r\n                      } while ((l | 0) != 10);\r\n                      Ae(u, 205, 10, k);\r\n                      l = d + 20 | 0;\r\n                      m = u;\r\n                      f = l + 20 | 0;\r\n                      do {\r\n                          a[l >> 0] = a[m >> 0] | 0;\r\n                          l = l + 1 | 0;\r\n                          m = m + 1 | 0;\r\n                      } while ((l | 0) < (f | 0));\r\n                      me(u, j, 10, k);\r\n                      i = v;\r\n                      return\r\n                  } else l = 0;\r\n                  do {\r\n                      m = d + (l << 1) | 0;\r\n                      f = (Z(b[s + (l << 1) >> 1] | 0, b[m >> 1] | 0) | 0) >> 15;\r\n                      if ((f | 0) > 32767) {\r\n                          c[k >> 2] = 1;\r\n                          f = 32767;\r\n                      }\r\n                      r = Rd(b[t + (l << 1) >> 1] | 0, f & 65535, k) | 0;\r\n                      b[m >> 1] = Ge(b[u + (l << 1) >> 1] | 0, r, k) | 0;\r\n                      l = l + 1 | 0;\r\n                  } while ((l | 0) != 10);\r\n                  Ae(u, 205, 10, k);\r\n                  l = d + 20 | 0;\r\n                  m = u;\r\n                  f = l + 20 | 0;\r\n                  do {\r\n                      a[l >> 0] = a[m >> 0] | 0;\r\n                      l = l + 1 | 0;\r\n                      m = m + 1 | 0;\r\n                  } while ((l | 0) < (f | 0));\r\n                  me(u, j, 10, k);\r\n                  i = v;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function bb(a, b, c) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              c = c | 0;\r\n              Pe(a | 0, c + ((b << 16 >> 16) * 10 << 1) | 0, 20) | 0;\r\n              return\r\n          }\r\n\r\n          function cb(d, e, f, g, h, j, k) {\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              var l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0;\r\n              v = i;\r\n              i = i + 80 | 0;\r\n              q = v + 60 | 0;\r\n              r = v + 40 | 0;\r\n              t = v + 20 | 0;\r\n              u = v;\r\n              s = c[g + 48 >> 2] | 0;\r\n              n = c[g + 24 >> 2] | 0;\r\n              o = c[g + 28 >> 2] | 0;\r\n              p = c[g + 32 >> 2] | 0;\r\n              if (e << 16 >> 16) {\r\n                  l = 0;\r\n                  do {\r\n                      q = s + (l << 1) | 0;\r\n                      f = Rd(((b[q >> 1] | 0) * 1639 | 0) >>> 15 & 65535, ((b[d + 20 + (l << 1) >> 1] | 0) * 31128 | 0) >>> 15 & 65535, k) | 0;\r\n                      b[t + (l << 1) >> 1] = f;\r\n                      b[u + (l << 1) >> 1] = f;\r\n                      r = d + (l << 1) | 0;\r\n                      b[r >> 1] = Ge(f, Rd(b[q >> 1] | 0, ((b[r >> 1] | 0) * 21299 | 0) >>> 15 & 65535, k) | 0, k) | 0;\r\n                      l = l + 1 | 0;\r\n                  } while ((l | 0) != 10);\r\n                  Ae(t, 205, 10, k);\r\n                  Ae(u, 205, 10, k);\r\n                  l = d + 20 | 0;\r\n                  g = u;\r\n                  e = l + 20 | 0;\r\n                  do {\r\n                      a[l >> 0] = a[g >> 0] | 0;\r\n                      l = l + 1 | 0;\r\n                      g = g + 1 | 0;\r\n                  } while ((l | 0) < (e | 0));\r\n                  me(t, h, 10, k);\r\n                  me(u, j, 10, k);\r\n                  i = v;\r\n                  return\r\n              }\r\n              e = c[g + 16 >> 2] | 0;\r\n              g = c[g + 8 >> 2] | 0;\r\n              m = b[f >> 1] | 0;\r\n              m = ((m << 18 >> 18 | 0) == (m | 0) ? m << 2 : m >>> 15 ^ 32767) << 16 >> 16;\r\n              b[q >> 1] = b[g + (m << 1) >> 1] | 0;\r\n              b[q + 2 >> 1] = b[g + (m + 1 << 1) >> 1] | 0;\r\n              b[r >> 1] = b[g + (m + 2 << 1) >> 1] | 0;\r\n              b[r + 2 >> 1] = b[g + (m + 3 << 1) >> 1] | 0;\r\n              m = b[f + 2 >> 1] | 0;\r\n              m = ((m << 18 >> 18 | 0) == (m | 0) ? m << 2 : m >>> 15 ^ 32767) << 16 >> 16;\r\n              b[q + 4 >> 1] = b[e + (m << 1) >> 1] | 0;\r\n              b[q + 6 >> 1] = b[e + (m + 1 << 1) >> 1] | 0;\r\n              b[r + 4 >> 1] = b[e + (m + 2 << 1) >> 1] | 0;\r\n              b[r + 6 >> 1] = b[e + (m + 3 << 1) >> 1] | 0;\r\n              m = b[f + 4 >> 1] | 0;\r\n              g = m << 16 >> 16;\r\n              if (m << 16 >> 16 < 0) e = ~((g ^ -2) >> 1); else e = g >>> 1;\r\n              m = e << 16 >> 16;\r\n              m = ((e << 18 >> 18 | 0) == (m | 0) ? e << 2 : m >>> 15 ^ 32767) << 16 >> 16;\r\n              l = n + (m + 1 << 1) | 0;\r\n              e = b[n + (m << 1) >> 1] | 0;\r\n              if (!(g & 1)) {\r\n                  b[q + 8 >> 1] = e;\r\n                  b[q + 10 >> 1] = b[l >> 1] | 0;\r\n                  b[r + 8 >> 1] = b[n + (m + 2 << 1) >> 1] | 0;\r\n                  b[r + 10 >> 1] = b[n + (m + 3 << 1) >> 1] | 0;\r\n              } else {\r\n                  if (e << 16 >> 16 == -32768) e = 32767; else e = 0 - (e & 65535) & 65535;\r\n                  b[q + 8 >> 1] = e;\r\n                  e = b[l >> 1] | 0;\r\n                  if (e << 16 >> 16 == -32768) e = 32767; else e = 0 - (e & 65535) & 65535;\r\n                  b[q + 10 >> 1] = e;\r\n                  e = b[n + (m + 2 << 1) >> 1] | 0;\r\n                  if (e << 16 >> 16 == -32768) e = 32767; else e = 0 - (e & 65535) & 65535;\r\n                  b[r + 8 >> 1] = e;\r\n                  e = b[n + (m + 3 << 1) >> 1] | 0;\r\n                  if (e << 16 >> 16 == -32768) e = 32767; else e = 0 - (e & 65535) & 65535;\r\n                  b[r + 10 >> 1] = e;\r\n              }\r\n              l = b[f + 6 >> 1] | 0;\r\n              l = ((l << 18 >> 18 | 0) == (l | 0) ? l << 2 : l >>> 15 ^ 32767) << 16 >> 16;\r\n              b[q + 12 >> 1] = b[o + (l << 1) >> 1] | 0;\r\n              b[q + 14 >> 1] = b[o + (l + 1 << 1) >> 1] | 0;\r\n              b[r + 12 >> 1] = b[o + (l + 2 << 1) >> 1] | 0;\r\n              b[r + 14 >> 1] = b[o + (l + 3 << 1) >> 1] | 0;\r\n              l = b[f + 8 >> 1] | 0;\r\n              l = ((l << 18 >> 18 | 0) == (l | 0) ? l << 2 : l >>> 15 ^ 32767) << 16 >> 16;\r\n              b[q + 16 >> 1] = b[p + (l << 1) >> 1] | 0;\r\n              b[q + 18 >> 1] = b[p + (l + 1 << 1) >> 1] | 0;\r\n              b[r + 16 >> 1] = b[p + (l + 2 << 1) >> 1] | 0;\r\n              b[r + 18 >> 1] = b[p + (l + 3 << 1) >> 1] | 0;\r\n              l = 0;\r\n              do {\r\n                  g = d + (l << 1) | 0;\r\n                  e = (b[g >> 1] | 0) * 21299 >> 15;\r\n                  if ((e | 0) > 32767) {\r\n                      c[k >> 2] = 1;\r\n                      e = 32767;\r\n                  }\r\n                  p = Rd(b[s + (l << 1) >> 1] | 0, e & 65535, k) | 0;\r\n                  b[t + (l << 1) >> 1] = Rd(b[q + (l << 1) >> 1] | 0, p, k) | 0;\r\n                  f = b[r + (l << 1) >> 1] | 0;\r\n                  b[u + (l << 1) >> 1] = Rd(f, p, k) | 0;\r\n                  b[g >> 1] = f;\r\n                  l = l + 1 | 0;\r\n              } while ((l | 0) != 10);\r\n              Ae(t, 205, 10, k);\r\n              Ae(u, 205, 10, k);\r\n              l = d + 20 | 0;\r\n              g = u;\r\n              e = l + 20 | 0;\r\n              do {\r\n                  a[l >> 0] = a[g >> 0] | 0;\r\n                  l = l + 1 | 0;\r\n                  g = g + 1 | 0;\r\n              } while ((l | 0) < (e | 0));\r\n              me(t, h, 10, k);\r\n              me(u, j, 10, k);\r\n              i = v;\r\n              return\r\n          }\r\n\r\n          function db(a, c) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              var d = 0, e = 0;\r\n              if (!a) {\r\n                  e = -1;\r\n                  return e | 0\r\n              }\r\n              d = a;\r\n              e = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = 0;\r\n                  d = d + 2 | 0;\r\n              } while ((d | 0) < (e | 0));\r\n              Pe(a + 20 | 0, c | 0, 20) | 0;\r\n              e = 0;\r\n              return e | 0\r\n          }\r\n\r\n          function eb(d) {\r\n              d = d | 0;\r\n              var e = 0, f = 0, g = 0, h = 0, i = 0;\r\n              if (!d) {\r\n                  i = -1;\r\n                  return i | 0\r\n              }\r\n              b[d >> 1] = 0;\r\n              b[d + 2 >> 1] = 8192;\r\n              e = d + 4 | 0;\r\n              b[e >> 1] = 3500;\r\n              b[d + 6 >> 1] = 3500;\r\n              c[d + 8 >> 2] = 1887529304;\r\n              b[d + 12 >> 1] = 3e4;\r\n              b[d + 14 >> 1] = 26e3;\r\n              b[d + 16 >> 1] = 21e3;\r\n              b[d + 18 >> 1] = 15e3;\r\n              b[d + 20 >> 1] = 8e3;\r\n              b[d + 22 >> 1] = 0;\r\n              b[d + 24 >> 1] = -8e3;\r\n              b[d + 26 >> 1] = -15e3;\r\n              b[d + 28 >> 1] = -21e3;\r\n              b[d + 30 >> 1] = -26e3;\r\n              b[d + 32 >> 1] = 3e4;\r\n              b[d + 34 >> 1] = 26e3;\r\n              b[d + 36 >> 1] = 21e3;\r\n              b[d + 38 >> 1] = 15e3;\r\n              b[d + 40 >> 1] = 8e3;\r\n              b[d + 42 >> 1] = 0;\r\n              b[d + 44 >> 1] = -8e3;\r\n              b[d + 46 >> 1] = -15e3;\r\n              b[d + 48 >> 1] = -21e3;\r\n              b[d + 50 >> 1] = -26e3;\r\n              b[d + 212 >> 1] = 0;\r\n              b[d + 374 >> 1] = 0;\r\n              b[d + 392 >> 1] = 0;\r\n              f = d + 52 | 0;\r\n              b[f >> 1] = 1384;\r\n              b[d + 54 >> 1] = 2077;\r\n              b[d + 56 >> 1] = 3420;\r\n              b[d + 58 >> 1] = 5108;\r\n              b[d + 60 >> 1] = 6742;\r\n              b[d + 62 >> 1] = 8122;\r\n              b[d + 64 >> 1] = 9863;\r\n              b[d + 66 >> 1] = 11092;\r\n              b[d + 68 >> 1] = 12714;\r\n              b[d + 70 >> 1] = 13701;\r\n              g = d + 72 | 0;\r\n              h = f;\r\n              i = g + 20 | 0;\r\n              do {\r\n                  a[g >> 0] = a[h >> 0] | 0;\r\n                  g = g + 1 | 0;\r\n                  h = h + 1 | 0;\r\n              } while ((g | 0) < (i | 0));\r\n              g = d + 92 | 0;\r\n              h = f;\r\n              i = g + 20 | 0;\r\n              do {\r\n                  a[g >> 0] = a[h >> 0] | 0;\r\n                  g = g + 1 | 0;\r\n                  h = h + 1 | 0;\r\n              } while ((g | 0) < (i | 0));\r\n              g = d + 112 | 0;\r\n              h = f;\r\n              i = g + 20 | 0;\r\n              do {\r\n                  a[g >> 0] = a[h >> 0] | 0;\r\n                  g = g + 1 | 0;\r\n                  h = h + 1 | 0;\r\n              } while ((g | 0) < (i | 0));\r\n              g = d + 132 | 0;\r\n              h = f;\r\n              i = g + 20 | 0;\r\n              do {\r\n                  a[g >> 0] = a[h >> 0] | 0;\r\n                  g = g + 1 | 0;\r\n                  h = h + 1 | 0;\r\n              } while ((g | 0) < (i | 0));\r\n              g = d + 152 | 0;\r\n              h = f;\r\n              i = g + 20 | 0;\r\n              do {\r\n                  a[g >> 0] = a[h >> 0] | 0;\r\n                  g = g + 1 | 0;\r\n                  h = h + 1 | 0;\r\n              } while ((g | 0) < (i | 0));\r\n              g = d + 172 | 0;\r\n              h = f;\r\n              i = g + 20 | 0;\r\n              do {\r\n                  a[g >> 0] = a[h >> 0] | 0;\r\n                  g = g + 1 | 0;\r\n                  h = h + 1 | 0;\r\n              } while ((g | 0) < (i | 0));\r\n              g = d + 192 | 0;\r\n              h = f;\r\n              i = g + 20 | 0;\r\n              do {\r\n                  a[g >> 0] = a[h >> 0] | 0;\r\n                  g = g + 1 | 0;\r\n                  h = h + 1 | 0;\r\n              } while ((g | 0) < (i | 0));\r\n              Qe(d + 214 | 0, 0, 160) | 0;\r\n              b[d + 376 >> 1] = 3500;\r\n              b[d + 378 >> 1] = 3500;\r\n              i = b[e >> 1] | 0;\r\n              b[d + 380 >> 1] = i;\r\n              b[d + 382 >> 1] = i;\r\n              b[d + 384 >> 1] = i;\r\n              b[d + 386 >> 1] = i;\r\n              b[d + 388 >> 1] = i;\r\n              b[d + 390 >> 1] = i;\r\n              b[d + 394 >> 1] = 0;\r\n              b[d + 396 >> 1] = 7;\r\n              b[d + 398 >> 1] = 32767;\r\n              b[d + 400 >> 1] = 0;\r\n              b[d + 402 >> 1] = 0;\r\n              b[d + 404 >> 1] = 0;\r\n              c[d + 408 >> 2] = 1;\r\n              b[d + 412 >> 1] = 0;\r\n              i = 0;\r\n              return i | 0\r\n          }\r\n\r\n          function fb(d, f, g, h, j, k, l, m, n, o, p, q) {\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              p = p | 0;\r\n              q = q | 0;\r\n              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,\r\n                  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,\r\n                  V = 0, W = 0, X = 0, Y = 0, _ = 0;\r\n              _ = i;\r\n              i = i + 304 | 0;\r\n              Q = _ + 192 | 0;\r\n              N = _ + 168 | 0;\r\n              S = _ + 148 | 0;\r\n              W = _ + 216 | 0;\r\n              T = _ + 146 | 0;\r\n              U = _ + 144 | 0;\r\n              O = _ + 124 | 0;\r\n              P = _ + 104 | 0;\r\n              R = _ + 84 | 0;\r\n              V = _ + 60 | 0;\r\n              L = _ + 40 | 0;\r\n              K = _;\r\n              Y = d + 404 | 0;\r\n              X = d + 400 | 0;\r\n              if ((b[Y >> 1] | 0) != 0 ? (b[X >> 1] | 0) != 0 : 0) {\r\n                  J = d + 394 | 0;\r\n                  b[J >> 1] = b[636 + (l << 1) >> 1] | 0;\r\n                  z = b[d + 212 >> 1] | 0;\r\n                  y = z + 10 | 0;\r\n                  Pe(d + 52 + (((y & 65535 | 0) == 80 ? 0 : y << 16 >> 16) << 1) | 0, d + 52 + (z << 1) | 0, 20) | 0;\r\n                  z = b[d + 392 >> 1] | 0;\r\n                  y = z + 1 | 0;\r\n                  b[d + 376 + (((y & 65535 | 0) == 8 ? 0 : y << 16 >> 16) << 1) >> 1] = b[d + 376 + (z << 1) >> 1] | 0;\r\n                  y = d + 4 | 0;\r\n                  b[y >> 1] = 0;\r\n                  z = K + 36 | 0;\r\n                  A = K + 32 | 0;\r\n                  B = K + 28 | 0;\r\n                  C = K + 24 | 0;\r\n                  D = K + 20 | 0;\r\n                  E = K + 16 | 0;\r\n                  F = K + 12 | 0;\r\n                  G = K + 8 | 0;\r\n                  H = K + 4 | 0;\r\n                  I = d + 52 | 0;\r\n                  t = K;\r\n                  M = t + 40 | 0;\r\n                  do {\r\n                      c[t >> 2] = 0;\r\n                      t = t + 4 | 0;\r\n                  } while ((t | 0) < (M | 0));\r\n                  s = 0;\r\n                  r = 7;\r\n                  while (1) {\r\n                      M = b[d + 376 + (r << 1) >> 1] | 0;\r\n                      x = M << 16 >> 16;\r\n                      if (M << 16 >> 16 < 0) x = ~((x ^ -8) >> 3); else x = x >>> 3;\r\n                      s = Rd(s, x & 65535, q) | 0;\r\n                      b[y >> 1] = s;\r\n                      v = r * 10 | 0;\r\n                      t = 9;\r\n                      while (1) {\r\n                          u = K + (t << 2) | 0;\r\n                          w = c[u >> 2] | 0;\r\n                          M = b[d + 52 + (t + v << 1) >> 1] | 0;\r\n                          x = M + w | 0;\r\n                          if ((M ^ w | 0) > -1 & (x ^ w | 0) < 0) {\r\n                              c[q >> 2] = 1;\r\n                              x = (w >>> 31) + 2147483647 | 0;\r\n                          }\r\n                          c[u >> 2] = x;\r\n                          if ((t | 0) > 0) t = t + -1 | 0; else break\r\n                      }\r\n                      if ((r | 0) <= 0) break; else r = r + -1 | 0;\r\n                  }\r\n                  b[L + 18 >> 1] = (c[z >> 2] | 0) >>> 3;\r\n                  b[L + 16 >> 1] = (c[A >> 2] | 0) >>> 3;\r\n                  b[L + 14 >> 1] = (c[B >> 2] | 0) >>> 3;\r\n                  b[L + 12 >> 1] = (c[C >> 2] | 0) >>> 3;\r\n                  b[L + 10 >> 1] = (c[D >> 2] | 0) >>> 3;\r\n                  b[L + 8 >> 1] = (c[E >> 2] | 0) >>> 3;\r\n                  b[L + 6 >> 1] = (c[F >> 2] | 0) >>> 3;\r\n                  b[L + 4 >> 1] = (c[G >> 2] | 0) >>> 3;\r\n                  b[L + 2 >> 1] = (c[H >> 2] | 0) >>> 3;\r\n                  b[L >> 1] = (c[K >> 2] | 0) >>> 3;\r\n                  me(L, d + 12 | 0, 10, q);\r\n                  b[y >> 1] = Ge(b[y >> 1] | 0, b[J >> 1] | 0, q) | 0;\r\n                  Oe(d + 214 | 0, I | 0, 160) | 0;\r\n                  L = 9;\r\n                  while (1) {\r\n                      M = b[d + 214 + (L + 70 << 1) >> 1] | 0;\r\n                      u = M << 16 >> 16;\r\n                      K = b[d + 214 + (L + 60 << 1) >> 1] | 0;\r\n                      t = (K << 16 >> 16) + u | 0;\r\n                      if ((K ^ M) << 16 >> 16 > -1 & (t ^ u | 0) < 0) {\r\n                          c[q >> 2] = 1;\r\n                          t = (u >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      M = b[d + 214 + (L + 50 << 1) >> 1] | 0;\r\n                      u = M + t | 0;\r\n                      if ((M ^ t | 0) > -1 & (u ^ t | 0) < 0) {\r\n                          c[q >> 2] = 1;\r\n                          u = (t >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      M = b[d + 214 + (L + 40 << 1) >> 1] | 0;\r\n                      t = M + u | 0;\r\n                      if ((M ^ u | 0) > -1 & (t ^ u | 0) < 0) {\r\n                          c[q >> 2] = 1;\r\n                          t = (u >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      M = b[d + 214 + (L + 30 << 1) >> 1] | 0;\r\n                      u = M + t | 0;\r\n                      if ((M ^ t | 0) > -1 & (u ^ t | 0) < 0) {\r\n                          c[q >> 2] = 1;\r\n                          u = (t >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      M = b[d + 214 + (L + 20 << 1) >> 1] | 0;\r\n                      t = M + u | 0;\r\n                      if ((M ^ u | 0) > -1 & (t ^ u | 0) < 0) {\r\n                          c[q >> 2] = 1;\r\n                          t = (u >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      M = b[d + 214 + (L + 10 << 1) >> 1] | 0;\r\n                      u = M + t | 0;\r\n                      if ((M ^ t | 0) > -1 & (u ^ t | 0) < 0) {\r\n                          c[q >> 2] = 1;\r\n                          t = (t >>> 31) + 2147483647 | 0;\r\n                      } else t = u;\r\n                      M = b[d + 214 + (L << 1) >> 1] | 0;\r\n                      u = M + t | 0;\r\n                      if ((M ^ t | 0) > -1 & (u ^ t | 0) < 0) {\r\n                          c[q >> 2] = 1;\r\n                          u = (t >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      if ((u | 0) < 0) u = ~((u ^ -8) >> 3); else u = u >>> 3;\r\n                      x = u & 65535;\r\n                      v = b[654 + (L << 1) >> 1] | 0;\r\n                      w = 7;\r\n                      while (1) {\r\n                          r = d + 214 + ((w * 10 | 0) + L << 1) | 0;\r\n                          u = Ge(b[r >> 1] | 0, x, q) | 0;\r\n                          b[r >> 1] = u;\r\n                          u = (Z(v, u << 16 >> 16) | 0) >> 15;\r\n                          if ((u | 0) > 32767) {\r\n                              c[q >> 2] = 1;\r\n                              u = 32767;\r\n                          }\r\n                          b[r >> 1] = u;\r\n                          s = (u & 65535) - (u >>> 15 & 1) | 0;\r\n                          s = s << 16 >> 31 ^ s;\r\n                          t = s & 65535;\r\n                          if (t << 16 >> 16 > 655) t = (((s << 16 >> 16) + 261489 | 0) >>> 2) + 655 & 65535;\r\n                          t = t << 16 >> 16 > 1310 ? 1310 : t;\r\n                          if (!(u & 32768)) u = t; else u = 0 - (t & 65535) & 65535;\r\n                          b[r >> 1] = u;\r\n                          if ((w | 0) > 0) w = w + -1 | 0; else break\r\n                      }\r\n                      if ((L | 0) > 0) L = L + -1 | 0; else break\r\n                  }\r\n              }\r\n              if (b[X >> 1] | 0) {\r\n                  x = d + 32 | 0;\r\n                  w = d + 12 | 0;\r\n                  t = x;\r\n                  v = w;\r\n                  M = t + 20 | 0;\r\n                  do {\r\n                      a[t >> 0] = a[v >> 0] | 0;\r\n                      t = t + 1 | 0;\r\n                      v = v + 1 | 0;\r\n                  } while ((t | 0) < (M | 0));\r\n                  v = d + 4 | 0;\r\n                  s = b[v >> 1] | 0;\r\n                  r = d + 6 | 0;\r\n                  b[r >> 1] = s;\r\n                  do if (b[d + 402 >> 1] | 0) {\r\n                      t = b[d >> 1] | 0;\r\n                      b[d >> 1] = 0;\r\n                      t = t << 16 >> 16 < 32 ? t : 32;\r\n                      M = t << 16 >> 16;\r\n                      u = M << 10;\r\n                      if ((u | 0) != (M << 26 >> 16 | 0)) {\r\n                          c[q >> 2] = 1;\r\n                          u = t << 16 >> 16 > 0 ? 32767 : -32768;\r\n                      }\r\n                      if (t << 16 >> 16 > 1) u = Td(1024, u & 65535) | 0; else u = 16384;\r\n                      b[d + 2 >> 1] = u;\r\n                      bb(g, b[m >> 1] | 0, c[n + 60 >> 2] | 0);\r\n                      ab(g, 8, 0, m + 2 | 0, n, w, q);\r\n                      t = g;\r\n                      M = t + 20 | 0;\r\n                      do {\r\n                          a[t >> 0] = 0;\r\n                          t = t + 1 | 0;\r\n                      } while ((t | 0) < (M | 0));\r\n                      s = b[m + 8 >> 1] | 0;\r\n                      s = s << 16 >> 16 == 0 ? -32768 : ((s + 64 & 65535) > 127 ? (s << 16 >> 16 > 0 ? 32767 : 32768) : s << 16 >> 16 << 9) + 60416 & 65535;\r\n                      b[v >> 1] = s;\r\n                      if ((b[d + 412 >> 1] | 0) != 0 ? (c[d + 408 >> 2] | 0) != 0 : 0) break;\r\n                      t = x;\r\n                      v = w;\r\n                      M = t + 20 | 0;\r\n                      do {\r\n                          a[t >> 0] = a[v >> 0] | 0;\r\n                          t = t + 1 | 0;\r\n                          v = v + 1 | 0;\r\n                      } while ((t | 0) < (M | 0));\r\n                      b[r >> 1] = s;\r\n                  } while (0);\r\n                  t = s << 16 >> 16;\r\n                  if (s << 16 >> 16 < 0) t = ~((t ^ -2) >> 1); else t = t >>> 1;\r\n                  t = t + 56536 | 0;\r\n                  u = t << 16;\r\n                  if ((u | 0) > 0) t = 0; else t = (u | 0) < -946077696 ? -14436 : t & 65535;\r\n                  b[h >> 1] = t;\r\n                  b[h + 2 >> 1] = t;\r\n                  b[h + 4 >> 1] = t;\r\n                  b[h + 6 >> 1] = t;\r\n                  m = ((t << 16 >> 16) * 5443 | 0) >>> 15 & 65535;\r\n                  b[h + 8 >> 1] = m;\r\n                  b[h + 10 >> 1] = m;\r\n                  b[h + 12 >> 1] = m;\r\n                  b[h + 14 >> 1] = m;\r\n              }\r\n              t = ((b[636 + (l << 1) >> 1] | 0) * 104864 | 0) >>> 15 << 16;\r\n              if ((t | 0) < 0) t = ~((t >> 16 ^ -32) >> 5); else t = t >> 21;\r\n              l = d + 394 | 0;\r\n              b[l >> 1] = Rd(((b[l >> 1] | 0) * 29491 | 0) >>> 15 & 65535, t & 65535, q) | 0;\r\n              h = (e[d >> 1] << 16) + 65536 | 0;\r\n              t = h >> 16;\r\n              n = d + 2 | 0;\r\n              t = (Z(((h << 10 >> 26 | 0) == (t | 0) ? h >>> 6 : t >>> 15 ^ 32767) << 16 >> 16, b[n >> 1] | 0) | 0) >> 15;\r\n              if ((t | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  t = 32767;\r\n              }\r\n              s = t & 65535;\r\n              if (s << 16 >> 16 <= 1024) if (s << 16 >> 16 < -2048) w = -32768; else w = t << 4 & 65535; else w = 16384;\r\n              m = d + 4 | 0;\r\n              x = w << 16 >> 16;\r\n              u = Z(b[m >> 1] | 0, x) | 0;\r\n              if ((u | 0) == 1073741824) {\r\n                  c[q >> 2] = 1;\r\n                  L = 2147483647;\r\n              } else L = u << 1;\r\n              u = (Z(b[d + 30 >> 1] | 0, x) | 0) >> 15;\r\n              if ((u | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  u = 32767;\r\n              }\r\n              y = u & 65535;\r\n              b[Q + 18 >> 1] = y;\r\n              u = (Z(b[d + 28 >> 1] | 0, x) | 0) >> 15;\r\n              if ((u | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  u = 32767;\r\n              }\r\n              b[Q + 16 >> 1] = u;\r\n              u = (Z(b[d + 26 >> 1] | 0, x) | 0) >> 15;\r\n              if ((u | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  u = 32767;\r\n              }\r\n              b[Q + 14 >> 1] = u;\r\n              u = (Z(b[d + 24 >> 1] | 0, x) | 0) >> 15;\r\n              if ((u | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  u = 32767;\r\n              }\r\n              b[Q + 12 >> 1] = u;\r\n              u = (Z(b[d + 22 >> 1] | 0, x) | 0) >> 15;\r\n              if ((u | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  u = 32767;\r\n              }\r\n              b[Q + 10 >> 1] = u;\r\n              u = (Z(b[d + 20 >> 1] | 0, x) | 0) >> 15;\r\n              if ((u | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  u = 32767;\r\n              }\r\n              b[Q + 8 >> 1] = u;\r\n              u = (Z(b[d + 18 >> 1] | 0, x) | 0) >> 15;\r\n              if ((u | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  u = 32767;\r\n              }\r\n              b[Q + 6 >> 1] = u;\r\n              u = (Z(b[d + 16 >> 1] | 0, x) | 0) >> 15;\r\n              if ((u | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  u = 32767;\r\n              }\r\n              b[Q + 4 >> 1] = u;\r\n              u = (Z(b[d + 14 >> 1] | 0, x) | 0) >> 15;\r\n              if ((u | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  u = 32767;\r\n              }\r\n              b[Q + 2 >> 1] = u;\r\n              u = (Z(b[d + 12 >> 1] | 0, x) | 0) >> 15;\r\n              if ((u | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  u = 32767;\r\n              }\r\n              b[Q >> 1] = u;\r\n              h = d + 6 | 0;\r\n              x = 16384 - (w & 65535) << 16 >> 16;\r\n              u = Z(b[h >> 1] | 0, x) | 0;\r\n              if ((u | 0) != 1073741824) {\r\n                  t = (u << 1) + L | 0;\r\n                  if ((u ^ L | 0) > 0 & (t ^ L | 0) < 0) {\r\n                      c[q >> 2] = 1;\r\n                      K = (L >>> 31) + 2147483647 | 0;\r\n                  } else K = t;\r\n              } else {\r\n                  c[q >> 2] = 1;\r\n                  K = 2147483647;\r\n              }\r\n              t = y;\r\n              v = 9;\r\n              while (1) {\r\n                  s = Q + (v << 1) | 0;\r\n                  u = (Z(b[d + 32 + (v << 1) >> 1] | 0, x) | 0) >> 15;\r\n                  if ((u | 0) > 32767) {\r\n                      c[q >> 2] = 1;\r\n                      u = 32767;\r\n                  }\r\n                  t = Rd(t, u & 65535, q) | 0;\r\n                  b[s >> 1] = t;\r\n                  M = t << 16 >> 16;\r\n                  u = M << 1;\r\n                  if ((u | 0) != (M << 17 >> 16 | 0)) {\r\n                      c[q >> 2] = 1;\r\n                      u = t << 16 >> 16 > 0 ? 32767 : -32768;\r\n                  }\r\n                  b[s >> 1] = u;\r\n                  u = v + -1 | 0;\r\n                  if ((v | 0) <= 0) break;\r\n                  t = b[Q + (u << 1) >> 1] | 0;\r\n                  v = u;\r\n              }\r\n              L = d + 374 | 0;\r\n              u = ((e[L >> 1] << 16) + -161021952 >> 16) * 9830 >> 15;\r\n              if ((u | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  u = 32767;\r\n              }\r\n              u = 4096 - (u & 65535) | 0;\r\n              t = u << 16;\r\n              if ((t | 0) > 268369920) x = 32767; else x = (t | 0) < 0 ? 0 : u << 19 >> 16;\r\n              J = d + 8 | 0;\r\n              u = Ga(J, 3) | 0;\r\n              ne(Q, O, 10, q);\r\n              t = P;\r\n              v = O;\r\n              M = t + 20 | 0;\r\n              do {\r\n                  b[t >> 1] = b[v >> 1] | 0;\r\n                  t = t + 2 | 0;\r\n                  v = v + 2 | 0;\r\n              } while ((t | 0) < (M | 0));\r\n              t = (u << 16 >> 16) * 10 | 0;\r\n              v = 9;\r\n              while (1) {\r\n                  s = P + (v << 1) | 0;\r\n                  r = b[s >> 1] | 0;\r\n                  u = (Z(b[d + 214 + (v + t << 1) >> 1] | 0, x) | 0) >> 15;\r\n                  if ((u | 0) > 32767) {\r\n                      c[q >> 2] = 1;\r\n                      u = 32767;\r\n                  }\r\n                  b[s >> 1] = Rd(r, u & 65535, q) | 0;\r\n                  if ((v | 0) > 0) v = v + -1 | 0; else break\r\n              }\r\n              Ae(O, 205, 10, q);\r\n              Ae(P, 205, 10, q);\r\n              t = g + 20 | 0;\r\n              v = O;\r\n              M = t + 20 | 0;\r\n              do {\r\n                  a[t >> 0] = a[v >> 0] | 0;\r\n                  t = t + 1 | 0;\r\n                  v = v + 1 | 0;\r\n              } while ((t | 0) < (M | 0));\r\n              me(O, Q, 10, q);\r\n              me(P, R, 10, q);\r\n              he(Q, N, q);\r\n              he(R, V, q);\r\n              t = p;\r\n              v = N;\r\n              M = t + 22 | 0;\r\n              do {\r\n                  a[t >> 0] = a[v >> 0] | 0;\r\n                  t = t + 1 | 0;\r\n                  v = v + 1 | 0;\r\n              } while ((t | 0) < (M | 0));\r\n              t = p + 22 | 0;\r\n              v = N;\r\n              M = t + 22 | 0;\r\n              do {\r\n                  a[t >> 0] = a[v >> 0] | 0;\r\n                  t = t + 1 | 0;\r\n                  v = v + 1 | 0;\r\n              } while ((t | 0) < (M | 0));\r\n              t = p + 44 | 0;\r\n              v = N;\r\n              M = t + 22 | 0;\r\n              do {\r\n                  a[t >> 0] = a[v >> 0] | 0;\r\n                  t = t + 1 | 0;\r\n                  v = v + 1 | 0;\r\n              } while ((t | 0) < (M | 0));\r\n              t = p + 66 | 0;\r\n              v = N;\r\n              M = t + 22 | 0;\r\n              do {\r\n                  a[t >> 0] = a[v >> 0] | 0;\r\n                  t = t + 1 | 0;\r\n                  v = v + 1 | 0;\r\n              } while ((t | 0) < (M | 0));\r\n              Fa(N + 2 | 0, S, q);\r\n              u = 0;\r\n              t = 32767;\r\n              do {\r\n                  s = b[S + (u << 1) >> 1] | 0;\r\n                  s = Z(s, s) | 0;\r\n                  if (s >>> 0 < 1073741824) s = 32767 - (s >>> 15) | 0; else {\r\n                      c[q >> 2] = 1;\r\n                      s = 0;\r\n                  }\r\n                  t = (Z(s << 16 >> 16, t << 16 >> 16) | 0) >> 15;\r\n                  if ((t | 0) > 32767) {\r\n                      c[q >> 2] = 1;\r\n                      t = 32767;\r\n                  }\r\n                  u = u + 1 | 0;\r\n              } while ((u | 0) != 10);\r\n              de(t << 16 >> 16, T, U, q);\r\n              t = (e[T >> 1] << 16) + -983040 | 0;\r\n              s = t >> 16;\r\n              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;\r\n              t = (b[L >> 1] | 0) * 29491 >> 15;\r\n              if ((t | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  t = 32767;\r\n              }\r\n              u = s << 16 >> 16;\r\n              s = u * 3277 >> 15;\r\n              if ((s | 0) > 32767) {\r\n                  c[q >> 2] = 1;\r\n                  s = 32767;\r\n              }\r\n              b[L >> 1] = Rd(t & 65535, s & 65535, q) | 0;\r\n              s = K >> 10;\r\n              r = s + 262144 | 0;\r\n              if ((s | 0) > -1 & (r ^ s | 0) < 0) {\r\n                  c[q >> 2] = 1;\r\n                  r = (s >>> 31) + 2147483647 | 0;\r\n              }\r\n              U = u << 4;\r\n              s = r - U | 0;\r\n              if (((s ^ r) & (r ^ U) | 0) < 0) {\r\n                  c[q >> 2] = 1;\r\n                  r = (r >>> 31) + 2147483647 | 0;\r\n              } else r = s;\r\n              U = b[l >> 1] << 5;\r\n              s = U + r | 0;\r\n              if ((U ^ r | 0) > -1 & (s ^ r | 0) < 0) {\r\n                  c[q >> 2] = 1;\r\n                  s = (r >>> 31) + 2147483647 | 0;\r\n              }\r\n              u = (re(s >>> 16 & 65535, s >>> 1 & 32767, q) | 0) << 16 >> 16;\r\n              Ha(J, W, q);\r\n              r = 39;\r\n              while (1) {\r\n                  t = W + (r << 1) | 0;\r\n                  s = (Z(b[t >> 1] | 0, u) | 0) >> 15;\r\n                  if ((s | 0) > 32767) {\r\n                      c[q >> 2] = 1;\r\n                      s = 32767;\r\n                  }\r\n                  b[t >> 1] = s;\r\n                  if ((r | 0) > 0) r = r + -1 | 0; else break\r\n              }\r\n              He(V, W, o, 40, f, 1);\r\n              Ha(J, W, q);\r\n              r = 39;\r\n              while (1) {\r\n                  t = W + (r << 1) | 0;\r\n                  s = (Z(b[t >> 1] | 0, u) | 0) >> 15;\r\n                  if ((s | 0) > 32767) {\r\n                      c[q >> 2] = 1;\r\n                      s = 32767;\r\n                  }\r\n                  b[t >> 1] = s;\r\n                  if ((r | 0) > 0) r = r + -1 | 0; else break\r\n              }\r\n              He(V, W, o + 80 | 0, 40, f, 1);\r\n              Ha(J, W, q);\r\n              r = 39;\r\n              while (1) {\r\n                  t = W + (r << 1) | 0;\r\n                  s = (Z(b[t >> 1] | 0, u) | 0) >> 15;\r\n                  if ((s | 0) > 32767) {\r\n                      c[q >> 2] = 1;\r\n                      s = 32767;\r\n                  }\r\n                  b[t >> 1] = s;\r\n                  if ((r | 0) > 0) r = r + -1 | 0; else break\r\n              }\r\n              He(V, W, o + 160 | 0, 40, f, 1);\r\n              Ha(J, W, q);\r\n              t = 39;\r\n              while (1) {\r\n                  r = W + (t << 1) | 0;\r\n                  s = (Z(b[r >> 1] | 0, u) | 0) >> 15;\r\n                  if ((s | 0) > 32767) {\r\n                      c[q >> 2] = 1;\r\n                      s = 32767;\r\n                  }\r\n                  b[r >> 1] = s;\r\n                  if ((t | 0) > 0) t = t + -1 | 0; else break\r\n              }\r\n              He(V, W, o + 240 | 0, 40, f, 1);\r\n              b[j + 14 >> 1] = 20;\r\n              b[j + 16 >> 1] = 0;\r\n              if ((k | 0) == 2) {\r\n                  s = b[d >> 1] | 0;\r\n                  s = s << 16 >> 16 > 32 ? 32 : s << 16 >> 16 < 1 ? 8 : s;\r\n                  o = s << 16 >> 16;\r\n                  r = o << 10;\r\n                  if ((r | 0) != (o << 26 >> 16 | 0)) {\r\n                      c[q >> 2] = 1;\r\n                      r = s << 16 >> 16 > 0 ? 32767 : -32768;\r\n                  }\r\n                  b[n >> 1] = Td(1024, r & 65535) | 0;\r\n                  b[d >> 1] = 0;\r\n                  t = d + 32 | 0;\r\n                  v = d + 12 | 0;\r\n                  M = t + 20 | 0;\r\n                  do {\r\n                      a[t >> 0] = a[v >> 0] | 0;\r\n                      t = t + 1 | 0;\r\n                      v = v + 1 | 0;\r\n                  } while ((t | 0) < (M | 0));\r\n                  q = b[m >> 1] | 0;\r\n                  b[h >> 1] = q;\r\n                  b[m >> 1] = (q & 65535) + 65280;\r\n              }\r\n              if (!(b[X >> 1] | 0)) {\r\n                  i = _;\r\n                  return\r\n              }\r\n              do if (!(b[d + 402 >> 1] | 0)) {\r\n                  if (b[Y >> 1] | 0) break;\r\n                  i = _;\r\n                  return\r\n              } while (0);\r\n              b[d >> 1] = 0;\r\n              b[d + 412 >> 1] = 1;\r\n              i = _;\r\n              return\r\n          }\r\n\r\n          function gb(a, d, f, g) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              var h = 0, j = 0, k = 0, l = 0, m = 0, n = 0;\r\n              m = i;\r\n              i = i + 16 | 0;\r\n              k = m + 2 | 0;\r\n              l = m;\r\n              b[l >> 1] = 0;\r\n              j = a + 212 | 0;\r\n              h = (e[j >> 1] | 0) + 10 | 0;\r\n              h = (h & 65535 | 0) == 80 ? 0 : h & 65535;\r\n              b[j >> 1] = h;\r\n              Pe(a + 52 + (h << 16 >> 16 << 1) | 0, d | 0, 20) | 0;\r\n              h = 0;\r\n              j = 159;\r\n              while (1) {\r\n                  n = b[f + (j << 1) >> 1] | 0;\r\n                  n = Z(n, n) | 0;\r\n                  n = (n | 0) == 1073741824 ? 2147483647 : n << 1;\r\n                  d = n + h | 0;\r\n                  if ((n ^ h | 0) > -1 & (d ^ h | 0) < 0) {\r\n                      c[g >> 2] = 1;\r\n                      h = (h >>> 31) + 2147483647 | 0;\r\n                  } else h = d;\r\n                  if ((j | 0) > 0) j = j + -1 | 0; else break\r\n              }\r\n              de(h, k, l, g);\r\n              h = b[k >> 1] | 0;\r\n              n = h << 16 >> 16;\r\n              d = n << 10;\r\n              if ((d | 0) != (n << 26 >> 16 | 0)) {\r\n                  c[g >> 2] = 1;\r\n                  d = h << 16 >> 16 > 0 ? 32767 : -32768;\r\n              }\r\n              b[k >> 1] = d;\r\n              n = b[l >> 1] | 0;\r\n              h = n << 16 >> 16;\r\n              if (n << 16 >> 16 < 0) h = ~((h ^ -32) >> 5); else h = h >>> 5;\r\n              l = a + 392 | 0;\r\n              n = (e[l >> 1] | 0) + 1 | 0;\r\n              n = (n & 65535 | 0) == 8 ? 0 : n & 65535;\r\n              b[l >> 1] = n;\r\n              b[a + 376 + (n << 16 >> 16 << 1) >> 1] = h + 57015 + d;\r\n              i = m;\r\n              return\r\n          }\r\n\r\n          function hb(a, d, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              var g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0;\r\n              l = (d | 0) == 4;\r\n              m = (d | 0) == 5;\r\n              n = (d | 0) == 6;\r\n              g = c[a + 408 >> 2] | 0;\r\n              a:do if ((d + -4 | 0) >>> 0 < 3) k = 4; else {\r\n                  if ((g + -1 | 0) >>> 0 < 2) switch (d | 0) {\r\n                      case 2:\r\n                      case 3:\r\n                      case 7: {\r\n                          k = 4;\r\n                          break a\r\n                      }\r\n                      default: {\r\n                      }\r\n                  }\r\n                  b[a >> 1] = 0;\r\n                  j = 0;\r\n              } while (0);\r\n              if ((k | 0) == 4) {\r\n                  b:do if ((g | 0) == 2) {\r\n                      switch (d | 0) {\r\n                          case 2:\r\n                          case 4:\r\n                          case 6:\r\n                          case 7:\r\n                              break;\r\n                          default: {\r\n                              h = 1;\r\n                              break b\r\n                          }\r\n                      }\r\n                      h = 2;\r\n                  } else h = 1; while (0);\r\n                  j = (e[a >> 1] | 0) + 1 & 65535;\r\n                  b[a >> 1] = j;\r\n                  j = (d | 0) != 5 & j << 16 >> 16 > 50 ? 2 : h;\r\n              }\r\n              i = a + 398 | 0;\r\n              if (m & (b[a + 412 >> 1] | 0) == 0) {\r\n                  b[i >> 1] = 0;\r\n                  h = 0;\r\n              } else h = b[i >> 1] | 0;\r\n              h = Rd(h, 1, f) | 0;\r\n              b[i >> 1] = h;\r\n              f = a + 404 | 0;\r\n              b[f >> 1] = 0;\r\n              c:do switch (d | 0) {\r\n                  case 2:\r\n                  case 4:\r\n                  case 5:\r\n                  case 6:\r\n                  case 7: {\r\n                      if (!((d | 0) == 7 & (j | 0) == 0)) {\r\n                          if (h << 16 >> 16 > 30) {\r\n                              b[f >> 1] = 1;\r\n                              b[i >> 1] = 0;\r\n                              b[a + 396 >> 1] = 0;\r\n                              break c\r\n                          }\r\n                          h = a + 396 | 0;\r\n                          g = b[h >> 1] | 0;\r\n                          if (!(g << 16 >> 16)) {\r\n                              b[i >> 1] = 0;\r\n                              break c\r\n                          } else {\r\n                              b[h >> 1] = (g & 65535) + 65535;\r\n                              break c\r\n                          }\r\n                      } else k = 14;\r\n                      break\r\n                  }\r\n                  default:\r\n                      k = 14;\r\n              } while (0);\r\n              if ((k | 0) == 14) b[a + 396 >> 1] = 7;\r\n              if (!j) return j | 0;\r\n              h = a + 400 | 0;\r\n              b[h >> 1] = 0;\r\n              g = a + 402 | 0;\r\n              b[g >> 1] = 0;\r\n              if (l) {\r\n                  b[h >> 1] = 1;\r\n                  return j | 0\r\n              }\r\n              if (m) {\r\n                  b[h >> 1] = 1;\r\n                  b[g >> 1] = 1;\r\n                  return j | 0\r\n              }\r\n              if (!n) return j | 0;\r\n              b[h >> 1] = 1;\r\n              b[f >> 1] = 0;\r\n              return j | 0\r\n          }\r\n\r\n          function ib(a) {\r\n              a = a | 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              b[a >> 1] = 1;\r\n              b[a + 2 >> 1] = 1;\r\n              b[a + 4 >> 1] = 1;\r\n              b[a + 6 >> 1] = 1;\r\n              b[a + 8 >> 1] = 1;\r\n              b[a + 10 >> 1] = 0;\r\n              b[a + 12 >> 1] = 1;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function jb(a, d, e, f, g) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              var h = 0, j = 0, k = 0, l = 0;\r\n              l = i;\r\n              i = i + 16 | 0;\r\n              k = l + 2 | 0;\r\n              j = l;\r\n              h = Zd(a, 5) | 0;\r\n              a = a + 10 | 0;\r\n              if ((Ge(h, b[a >> 1] | 0, g) | 0) << 16 >> 16 > 0) h = b[a >> 1] | 0;\r\n              h = (Z(b[674 + (e << 16 >> 16 << 1) >> 1] | 0, h << 16 >> 16) | 0) >> 15;\r\n              if ((h | 0) > 32767) {\r\n                  c[g >> 2] = 1;\r\n                  h = 32767;\r\n              }\r\n              b[f >> 1] = h;\r\n              Xd(d, k, j, g);\r\n              Wd(d, b[k >> 1] | 0, b[j >> 1] | 0);\r\n              i = l;\r\n              return\r\n          }\r\n\r\n          function kb(a, c, d, e, f) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              if (!(c << 16 >> 16)) {\r\n                  if (d << 16 >> 16) {\r\n                      c = a + 12 | 0;\r\n                      if ((Ge(b[e >> 1] | 0, b[c >> 1] | 0, f) | 0) << 16 >> 16 > 0) b[e >> 1] = b[c >> 1] | 0;\r\n                  } else c = a + 12 | 0;\r\n                  b[c >> 1] = b[e >> 1] | 0;\r\n              }\r\n              b[a + 10 >> 1] = b[e >> 1] | 0;\r\n              f = a + 2 | 0;\r\n              b[a >> 1] = b[f >> 1] | 0;\r\n              d = a + 4 | 0;\r\n              b[f >> 1] = b[d >> 1] | 0;\r\n              f = a + 6 | 0;\r\n              b[d >> 1] = b[f >> 1] | 0;\r\n              a = a + 8 | 0;\r\n              b[f >> 1] = b[a >> 1] | 0;\r\n              b[a >> 1] = b[e >> 1] | 0;\r\n              return\r\n          }\r\n\r\n          function lb(a, d, e, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              var g = 0;\r\n              g = Zd(a, 5) | 0;\r\n              a = a + 10 | 0;\r\n              if ((Ge(g, b[a >> 1] | 0, f) | 0) << 16 >> 16 > 0) g = b[a >> 1] | 0;\r\n              g = (Z(b[688 + (d << 16 >> 16 << 1) >> 1] | 0, g << 16 >> 16) | 0) >> 15;\r\n              if ((g | 0) <= 32767) {\r\n                  f = g;\r\n                  f = f & 65535;\r\n                  b[e >> 1] = f;\r\n                  return\r\n              }\r\n              c[f >> 2] = 1;\r\n              f = 32767;\r\n              f = f & 65535;\r\n              b[e >> 1] = f;\r\n              return\r\n          }\r\n\r\n          function mb(a) {\r\n              a = a | 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              b[a >> 1] = 1640;\r\n              b[a + 2 >> 1] = 1640;\r\n              b[a + 4 >> 1] = 1640;\r\n              b[a + 6 >> 1] = 1640;\r\n              b[a + 8 >> 1] = 1640;\r\n              b[a + 10 >> 1] = 0;\r\n              b[a + 12 >> 1] = 16384;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function nb(a, c, d, e, f) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              if (!(c << 16 >> 16)) {\r\n                  if (d << 16 >> 16) {\r\n                      c = a + 12 | 0;\r\n                      if ((Ge(b[e >> 1] | 0, b[c >> 1] | 0, f) | 0) << 16 >> 16 > 0) b[e >> 1] = b[c >> 1] | 0;\r\n                  } else c = a + 12 | 0;\r\n                  b[c >> 1] = b[e >> 1] | 0;\r\n              }\r\n              e = b[e >> 1] | 0;\r\n              c = a + 10 | 0;\r\n              b[c >> 1] = e;\r\n              if ((Ge(e, 16384, f) | 0) << 16 >> 16 > 0) {\r\n                  b[c >> 1] = 16384;\r\n                  c = 16384;\r\n              } else c = b[c >> 1] | 0;\r\n              f = a + 2 | 0;\r\n              b[a >> 1] = b[f >> 1] | 0;\r\n              e = a + 4 | 0;\r\n              b[f >> 1] = b[e >> 1] | 0;\r\n              f = a + 6 | 0;\r\n              b[e >> 1] = b[f >> 1] | 0;\r\n              a = a + 8 | 0;\r\n              b[f >> 1] = b[a >> 1] | 0;\r\n              b[a >> 1] = c;\r\n              return\r\n          }\r\n\r\n          function ob(a, d, e, f, g, h, i) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              var j = 0, k = 0, l = 0;\r\n              k = Zd(e, 9) | 0;\r\n              l = b[e + 16 >> 1] | 0;\r\n              j = l << 16 >> 16;\r\n              e = (j + (b[e + 14 >> 1] | 0) | 0) >>> 1;\r\n              e = (j | 0) < (e << 16 >> 16 | 0) ? l : e & 65535;\r\n              if (!(d << 16 >> 16 > 5 ? k << 16 >> 16 > d << 16 >> 16 : 0)) return 0;\r\n              j = e << 16 >> 16;\r\n              j = ((j << 18 >> 18 | 0) == (j | 0) ? j << 2 : j >>> 15 ^ 32767) & 65535;\r\n              if (!(f << 16 >> 16 > 6 & g << 16 >> 16 == 0)) j = Ge(j, e, i) | 0;\r\n              k = k << 16 >> 16 > j << 16 >> 16 ? j : k;\r\n              l = qe(d) | 0;\r\n              j = l << 16 >> 16;\r\n              if (l << 16 >> 16 < 0) {\r\n                  e = 0 - j << 16;\r\n                  if ((e | 0) < 983040) j = d << 16 >> 16 >> (e >> 16) & 65535; else j = 0;\r\n              } else {\r\n                  e = d << 16 >> 16;\r\n                  g = e << j;\r\n                  if ((g << 16 >> 16 >> j | 0) == (e | 0)) j = g & 65535; else j = (e >>> 15 ^ 32767) & 65535;\r\n              }\r\n              f = Z((Td(16383, j) | 0) << 16 >> 16, k << 16 >> 16) | 0;\r\n              if ((f | 0) == 1073741824) {\r\n                  c[i >> 2] = 1;\r\n                  g = 2147483647;\r\n              } else g = f << 1;\r\n              f = Ge(20, l, i) | 0;\r\n              j = f << 16 >> 16;\r\n              if (f << 16 >> 16 > 0) f = f << 16 >> 16 < 31 ? g >> j : 0; else {\r\n                  d = 0 - j << 16 >> 16;\r\n                  f = g << d;\r\n                  f = (f >> d | 0) == (g | 0) ? f : g >> 31 ^ 2147483647;\r\n              }\r\n              f = (f | 0) > 32767 ? 32767 : f & 65535;\r\n              f = h << 16 >> 16 != 0 & f << 16 >> 16 > 3072 ? 3072 : f << 16 >> 16;\r\n              e = 0;\r\n              do {\r\n                  g = a + (e << 1) | 0;\r\n                  j = Z(b[g >> 1] | 0, f) | 0;\r\n                  if ((j | 0) == 1073741824) {\r\n                      c[i >> 2] = 1;\r\n                      j = 2147483647;\r\n                  } else j = j << 1;\r\n                  b[g >> 1] = j >>> 11;\r\n                  e = e + 1 | 0;\r\n              } while ((e | 0) != 40);\r\n              return 0\r\n          }\r\n\r\n          function pb(a, e, f, g) {\r\n              a = a | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              var h = 0, i = 0, j = 0, k = 0;\r\n              h = c[g + 104 >> 2] | 0;\r\n              i = c[g + 96 >> 2] | 0;\r\n              if (a >>> 0 >= 8) {\r\n                  b[f >> 1] = (d[e >> 0] | 0) >>> 4 & 1;\r\n                  b[f + 2 >> 1] = (d[e >> 0] | 0) >>> 5 & 1;\r\n                  b[f + 4 >> 1] = (d[e >> 0] | 0) >>> 6 & 1;\r\n                  b[f + 6 >> 1] = (d[e >> 0] | 0) >>> 7 & 255;\r\n                  h = h + (a << 1) | 0;\r\n                  if ((b[h >> 1] | 0) > 1) {\r\n                      a = 1;\r\n                      g = 1;\r\n                      i = 4;\r\n                  } else return;\r\n                  while (1) {\r\n                      j = e + a | 0;\r\n                      a = i | 1;\r\n                      b[f + (i << 16 >> 16 << 1) >> 1] = d[j >> 0] & 1;\r\n                      b[f + (a << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 1 & 1;\r\n                      k = i | 3;\r\n                      b[f + (a + 1 << 16 >> 16 << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 2 & 1;\r\n                      b[f + (k << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 3 & 1;\r\n                      b[f + (k + 1 << 16 >> 16 << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 4 & 1;\r\n                      b[f + (k + 2 << 16 >> 16 << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 5 & 1;\r\n                      b[f + (k + 3 << 16 >> 16 << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 6 & 1;\r\n                      b[f + (k + 4 << 16 >> 16 << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 7 & 255;\r\n                      g = g + 1 << 16 >> 16;\r\n                      if (g << 16 >> 16 < (b[h >> 1] | 0)) {\r\n                          a = g << 16 >> 16;\r\n                          i = i + 8 << 16 >> 16;\r\n                      } else break\r\n                  }\r\n                  return\r\n              }\r\n              k = c[(c[g + 100 >> 2] | 0) + (a << 2) >> 2] | 0;\r\n              b[f + (b[k >> 1] << 1) >> 1] = (d[e >> 0] | 0) >>> 4 & 1;\r\n              b[f + (b[k + 2 >> 1] << 1) >> 1] = (d[e >> 0] | 0) >>> 5 & 1;\r\n              b[f + (b[k + 4 >> 1] << 1) >> 1] = (d[e >> 0] | 0) >>> 6 & 1;\r\n              b[f + (b[k + 6 >> 1] << 1) >> 1] = (d[e >> 0] | 0) >>> 7 & 255;\r\n              j = h + (a << 1) | 0;\r\n              if ((b[j >> 1] | 0) <= 1) return;\r\n              g = i + (a << 1) | 0;\r\n              h = 1;\r\n              a = 1;\r\n              i = 4;\r\n              while (1) {\r\n                  h = e + h | 0;\r\n                  i = i << 16 >> 16;\r\n                  if ((i | 0) < (b[g >> 1] | 0)) {\r\n                      b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = d[h >> 0] & 1;\r\n                      i = i + 1 | 0;\r\n                      if ((i | 0) < (b[g >> 1] | 0)) {\r\n                          b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 1 & 1;\r\n                          i = i + 1 | 0;\r\n                          if ((i | 0) < (b[g >> 1] | 0)) {\r\n                              b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 2 & 1;\r\n                              i = i + 1 | 0;\r\n                              if ((i | 0) < (b[g >> 1] | 0)) {\r\n                                  b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 3 & 1;\r\n                                  i = i + 1 | 0;\r\n                                  if ((i | 0) < (b[g >> 1] | 0)) {\r\n                                      b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 4 & 1;\r\n                                      i = i + 1 | 0;\r\n                                      if ((i | 0) < (b[g >> 1] | 0)) {\r\n                                          b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 5 & 1;\r\n                                          i = i + 1 | 0;\r\n                                          if ((i | 0) < (b[g >> 1] | 0)) {\r\n                                              b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 6 & 1;\r\n                                              i = i + 1 | 0;\r\n                                              if ((i | 0) < (b[g >> 1] | 0)) {\r\n                                                  b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 7 & 1;\r\n                                                  i = i + 1 | 0;\r\n                                              }\r\n                                          }\r\n                                      }\r\n                                  }\r\n                              }\r\n                          }\r\n                      }\r\n                  }\r\n                  a = a + 1 << 16 >> 16;\r\n                  if (a << 16 >> 16 < (b[j >> 1] | 0)) h = a << 16 >> 16; else break\r\n              }\r\n              return\r\n          }\r\n\r\n          function qb(a, c, d, e, f) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              var g = 0, h = 0, i = 0, j = 0;\r\n              switch (d << 16 >> 16) {\r\n                  case 0: {\r\n                      j = 9;\r\n                      while (1) {\r\n                          i = b[a + (j << 1) >> 1] | 0;\r\n                          d = i << 16 >> 16;\r\n                          if (i << 16 >> 16 < 0) d = ~((d ^ -4) >> 2); else d = d >>> 2;\r\n                          h = b[c + (j << 1) >> 1] | 0;\r\n                          g = h << 16 >> 16;\r\n                          if (h << 16 >> 16 < 0) h = ~((g ^ -4) >> 2); else h = g >>> 2;\r\n                          b[e + (j << 1) >> 1] = Rd((i & 65535) - d & 65535, h & 65535, f) | 0;\r\n                          if ((j | 0) > 0) j = j + -1 | 0; else break\r\n                      }\r\n                      return\r\n                  }\r\n                  case 40: {\r\n                      h = 9;\r\n                      while (1) {\r\n                          f = b[a + (h << 1) >> 1] | 0;\r\n                          d = f << 16 >> 16;\r\n                          if (f << 16 >> 16 < 0) g = ~((d ^ -2) >> 1); else g = d >>> 1;\r\n                          f = b[c + (h << 1) >> 1] | 0;\r\n                          d = f << 16 >> 16;\r\n                          if (f << 16 >> 16 < 0) d = ~((d ^ -2) >> 1); else d = d >>> 1;\r\n                          b[e + (h << 1) >> 1] = d + g;\r\n                          if ((h | 0) > 0) h = h + -1 | 0; else break\r\n                      }\r\n                      return\r\n                  }\r\n                  case 80: {\r\n                      j = 9;\r\n                      while (1) {\r\n                          i = b[a + (j << 1) >> 1] | 0;\r\n                          d = i << 16 >> 16;\r\n                          if (i << 16 >> 16 < 0) i = ~((d ^ -4) >> 2); else i = d >>> 2;\r\n                          d = b[c + (j << 1) >> 1] | 0;\r\n                          g = d << 16 >> 16;\r\n                          if (d << 16 >> 16 < 0) h = ~((g ^ -4) >> 2); else h = g >>> 2;\r\n                          b[e + (j << 1) >> 1] = Rd(i & 65535, (d & 65535) - h & 65535, f) | 0;\r\n                          if ((j | 0) > 0) j = j + -1 | 0; else break\r\n                      }\r\n                      return\r\n                  }\r\n                  case 120: {\r\n                      b[e + 18 >> 1] = b[c + 18 >> 1] | 0;\r\n                      b[e + 16 >> 1] = b[c + 16 >> 1] | 0;\r\n                      b[e + 14 >> 1] = b[c + 14 >> 1] | 0;\r\n                      b[e + 12 >> 1] = b[c + 12 >> 1] | 0;\r\n                      b[e + 10 >> 1] = b[c + 10 >> 1] | 0;\r\n                      b[e + 8 >> 1] = b[c + 8 >> 1] | 0;\r\n                      b[e + 6 >> 1] = b[c + 6 >> 1] | 0;\r\n                      b[e + 4 >> 1] = b[c + 4 >> 1] | 0;\r\n                      b[e + 2 >> 1] = b[c + 2 >> 1] | 0;\r\n                      b[e >> 1] = b[c >> 1] | 0;\r\n                      return\r\n                  }\r\n                  default:\r\n                      return\r\n              }\r\n          }\r\n\r\n          function rb(a, b) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              Pe(a | 0, b | 0, 20) | 0;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function sb(a, d, e) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0, h = 0, i = 0, j = 0, k = 0, l = 0;\r\n              l = 0;\r\n              do {\r\n                  k = a + (l << 1) | 0;\r\n                  f = b[k >> 1] | 0;\r\n                  i = f & 65535;\r\n                  j = i << 16;\r\n                  f = f << 16 >> 16;\r\n                  if ((f * 5243 | 0) == 1073741824) {\r\n                      c[e >> 2] = 1;\r\n                      h = 2147483647;\r\n                  } else h = f * 10486 | 0;\r\n                  g = j - h | 0;\r\n                  if (((g ^ j) & (h ^ j) | 0) < 0) {\r\n                      c[e >> 2] = 1;\r\n                      h = (i >>> 15) + 2147483647 | 0;\r\n                  } else h = g;\r\n                  f = b[d + (l << 1) >> 1] | 0;\r\n                  g = f * 5243 | 0;\r\n                  if ((g | 0) != 1073741824) {\r\n                      f = (f * 10486 | 0) + h | 0;\r\n                      if ((g ^ h | 0) > 0 & (f ^ h | 0) < 0) {\r\n                          c[e >> 2] = 1;\r\n                          f = (h >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[e >> 2] = 1;\r\n                      f = 2147483647;\r\n                  }\r\n                  b[k >> 1] = Ce(f, e) | 0;\r\n                  l = l + 1 | 0;\r\n              } while ((l | 0) != 10);\r\n              return\r\n          }\r\n\r\n          function tb(a) {\r\n              a = a | 0;\r\n              var c = 0;\r\n              if (!a) {\r\n                  c = -1;\r\n                  return c | 0\r\n              }\r\n              c = a + 18 | 0;\r\n              do {\r\n                  b[a >> 1] = 0;\r\n                  a = a + 2 | 0;\r\n              } while ((a | 0) < (c | 0));\r\n              c = 0;\r\n              return c | 0\r\n          }\r\n\r\n          function ub(a) {\r\n              a = a | 0;\r\n              b[a + 14 >> 1] = 1;\r\n              return\r\n          }\r\n\r\n          function vb(a) {\r\n              a = a | 0;\r\n              b[a + 14 >> 1] = 0;\r\n              return\r\n          }\r\n\r\n          function wb(a, d, e, f, g, h, j, k, l, m) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              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,\r\n                  C = 0;\r\n              C = i;\r\n              i = i + 160 | 0;\r\n              z = C + 80 | 0;\r\n              A = C;\r\n              v = c[l + 120 >> 2] | 0;\r\n              w = c[l + 124 >> 2] | 0;\r\n              x = c[l + 128 >> 2] | 0;\r\n              u = c[l + 132 >> 2] | 0;\r\n              o = a + 6 | 0;\r\n              t = a + 8 | 0;\r\n              b[t >> 1] = b[o >> 1] | 0;\r\n              r = a + 4 | 0;\r\n              b[o >> 1] = b[r >> 1] | 0;\r\n              s = a + 2 | 0;\r\n              b[r >> 1] = b[s >> 1] | 0;\r\n              b[s >> 1] = b[a >> 1] | 0;\r\n              b[a >> 1] = g;\r\n              l = g << 16 >> 16 < 14746 ? g << 16 >> 16 > 9830 & 1 : 2;\r\n              n = a + 12 | 0;\r\n              g = b[n >> 1] | 0;\r\n              p = g << 15;\r\n              do if ((p | 0) <= 536870911) if ((p | 0) < -536870912) {\r\n                  c[m >> 2] = 1;\r\n                  g = -2147483648;\r\n                  break\r\n              } else {\r\n                  g = g << 17;\r\n                  break\r\n              } else {\r\n                  c[m >> 2] = 1;\r\n                  g = 2147483647;\r\n              } while (0);\r\n              y = f << 16 >> 16;\r\n              q = a + 16 | 0;\r\n              if ((Ce(g, m) | 0) << 16 >> 16 >= f << 16 >> 16) {\r\n                  p = b[q >> 1] | 0;\r\n                  if (p << 16 >> 16 > 0) {\r\n                      p = (p & 65535) + 65535 & 65535;\r\n                      b[q >> 1] = p;\r\n                  }\r\n                  if (!(p << 16 >> 16)) {\r\n                      g = (b[a >> 1] | 0) < 9830;\r\n                      g = (b[s >> 1] | 0) < 9830 ? (g ? 2 : 1) : g & 1;\r\n                      if ((b[r >> 1] | 0) < 9830) g = (g & 65535) + 1 & 65535;\r\n                      if ((b[o >> 1] | 0) < 9830) g = (g & 65535) + 1 & 65535;\r\n                      if ((b[t >> 1] | 0) < 9830) g = (g & 65535) + 1 & 65535;\r\n                      p = 0;\r\n                      l = g << 16 >> 16 > 2 ? 0 : l;\r\n                  }\r\n              } else {\r\n                  b[q >> 1] = 2;\r\n                  p = 2;\r\n              }\r\n              s = l << 16 >> 16;\r\n              t = a + 10 | 0;\r\n              s = (p << 16 >> 16 == 0 ? (s | 0) > ((b[t >> 1] | 0) + 1 | 0) : 0) ? s + 65535 & 65535 : l;\r\n              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;\r\n              b[t >> 1] = a;\r\n              b[n >> 1] = f;\r\n              switch (d | 0) {\r\n                  case 4:\r\n                  case 6:\r\n                  case 7:\r\n                      break;\r\n                  default:\r\n                      if (a << 16 >> 16 < 2) {\r\n                          p = 0;\r\n                          l = 0;\r\n                          o = h;\r\n                          n = z;\r\n                          while (1) {\r\n                              if (!(b[o >> 1] | 0)) g = 0; else {\r\n                                  l = l << 16 >> 16;\r\n                                  b[A + (l << 1) >> 1] = p;\r\n                                  g = b[o >> 1] | 0;\r\n                                  l = l + 1 & 65535;\r\n                              }\r\n                              b[n >> 1] = g;\r\n                              b[o >> 1] = 0;\r\n                              p = p + 1 << 16 >> 16;\r\n                              if (p << 16 >> 16 >= 40) {\r\n                                  t = l;\r\n                                  break\r\n                              } else {\r\n                                  o = o + 2 | 0;\r\n                                  n = n + 2 | 0;\r\n                              }\r\n                          }\r\n                          s = a << 16 >> 16 == 0;\r\n                          s = (d | 0) == 5 ? (s ? v : w) : s ? x : u;\r\n                          if (t << 16 >> 16 > 0) {\r\n                              r = 0;\r\n                              do {\r\n                                  q = b[A + (r << 1) >> 1] | 0;\r\n                                  l = q << 16 >> 16;\r\n                                  a = b[z + (l << 1) >> 1] | 0;\r\n                                  if (q << 16 >> 16 < 40) {\r\n                                      p = a << 16 >> 16;\r\n                                      o = 39 - q & 65535;\r\n                                      n = q;\r\n                                      l = h + (l << 1) | 0;\r\n                                      g = s;\r\n                                      while (1) {\r\n                                          d = (Z(b[g >> 1] | 0, p) | 0) >>> 15 & 65535;\r\n                                          b[l >> 1] = Rd(b[l >> 1] | 0, d, m) | 0;\r\n                                          n = n + 1 << 16 >> 16;\r\n                                          if (n << 16 >> 16 >= 40) break; else {\r\n                                              l = l + 2 | 0;\r\n                                              g = g + 2 | 0;\r\n                                          }\r\n                                      }\r\n                                      if (q << 16 >> 16 > 0) {\r\n                                          l = s + (o + 1 << 1) | 0;\r\n                                          B = 36;\r\n                                      }\r\n                                  } else {\r\n                                      l = s;\r\n                                      B = 36;\r\n                                  }\r\n                                  if ((B | 0) == 36) {\r\n                                      B = 0;\r\n                                      g = a << 16 >> 16;\r\n                                      p = 0;\r\n                                      o = h;\r\n                                      while (1) {\r\n                                          d = (Z(b[l >> 1] | 0, g) | 0) >>> 15 & 65535;\r\n                                          b[o >> 1] = Rd(b[o >> 1] | 0, d, m) | 0;\r\n                                          p = p + 1 << 16 >> 16;\r\n                                          if (p << 16 >> 16 >= q << 16 >> 16) break; else {\r\n                                              o = o + 2 | 0;\r\n                                              l = l + 2 | 0;\r\n                                          }\r\n                                      }\r\n                                  }\r\n                                  r = r + 1 | 0;\r\n                              } while ((r & 65535) << 16 >> 16 != t << 16 >> 16)\r\n                          }\r\n                      }\r\n              }\r\n              r = j << 16 >> 16;\r\n              s = y << 1;\r\n              g = k << 16 >> 16;\r\n              n = 0 - g << 16;\r\n              l = n >> 16;\r\n              if (k << 16 >> 16 > 0) {\r\n                  p = 0;\r\n                  o = e;\r\n                  while (1) {\r\n                      a = Z(b[e + (p << 1) >> 1] | 0, r) | 0;\r\n                      if ((a | 0) == 1073741824) {\r\n                          c[m >> 2] = 1;\r\n                          n = 2147483647;\r\n                      } else n = a << 1;\r\n                      k = Z(s, b[h >> 1] | 0) | 0;\r\n                      a = k + n | 0;\r\n                      if ((k ^ n | 0) > -1 & (a ^ n | 0) < 0) {\r\n                          c[m >> 2] = 1;\r\n                          a = (n >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      k = a << g;\r\n                      b[o >> 1] = Ce((k >> g | 0) == (a | 0) ? k : a >> 31 ^ 2147483647, m) | 0;\r\n                      p = p + 1 | 0;\r\n                      if ((p | 0) == 40) break; else {\r\n                          h = h + 2 | 0;\r\n                          o = o + 2 | 0;\r\n                      }\r\n                  }\r\n                  i = C;\r\n                  return\r\n              }\r\n              if ((n | 0) < 2031616) {\r\n                  p = 0;\r\n                  o = e;\r\n                  while (1) {\r\n                      a = Z(b[e + (p << 1) >> 1] | 0, r) | 0;\r\n                      if ((a | 0) == 1073741824) {\r\n                          c[m >> 2] = 1;\r\n                          n = 2147483647;\r\n                      } else n = a << 1;\r\n                      k = Z(s, b[h >> 1] | 0) | 0;\r\n                      a = k + n | 0;\r\n                      if ((k ^ n | 0) > -1 & (a ^ n | 0) < 0) {\r\n                          c[m >> 2] = 1;\r\n                          a = (n >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      b[o >> 1] = Ce(a >> l, m) | 0;\r\n                      p = p + 1 | 0;\r\n                      if ((p | 0) == 40) break; else {\r\n                          h = h + 2 | 0;\r\n                          o = o + 2 | 0;\r\n                      }\r\n                  }\r\n                  i = C;\r\n                  return\r\n              } else {\r\n                  o = 0;\r\n                  n = e;\r\n                  while (1) {\r\n                      a = Z(b[e + (o << 1) >> 1] | 0, r) | 0;\r\n                      if ((a | 0) == 1073741824) {\r\n                          c[m >> 2] = 1;\r\n                          a = 2147483647;\r\n                      } else a = a << 1;\r\n                      k = Z(s, b[h >> 1] | 0) | 0;\r\n                      if ((k ^ a | 0) > -1 & (k + a ^ a | 0) < 0) c[m >> 2] = 1;\r\n                      b[n >> 1] = Ce(0, m) | 0;\r\n                      o = o + 1 | 0;\r\n                      if ((o | 0) == 40) break; else {\r\n                          h = h + 2 | 0;\r\n                          n = n + 2 | 0;\r\n                      }\r\n                  }\r\n                  i = C;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function xb(a) {\r\n              a = a | 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              ;b[a >> 1] = 0;\r\n              b[a + 2 >> 1] = 0;\r\n              b[a + 4 >> 1] = 0;\r\n              b[a + 6 >> 1] = 0;\r\n              b[a + 8 >> 1] = 0;\r\n              b[a + 10 >> 1] = 0;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function yb(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              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;\r\n              if (d << 16 >> 16 <= 0) return;\r\n              f = a + 10 | 0;\r\n              j = a + 8 | 0;\r\n              l = a + 4 | 0;\r\n              m = a + 6 | 0;\r\n              n = a + 2 | 0;\r\n              g = b[l >> 1] | 0;\r\n              h = b[m >> 1] | 0;\r\n              i = b[a >> 1] | 0;\r\n              k = b[n >> 1] | 0;\r\n              o = 0;\r\n              while (1) {\r\n                  p = b[f >> 1] | 0;\r\n                  q = b[j >> 1] | 0;\r\n                  b[f >> 1] = q;\r\n                  r = b[c >> 1] | 0;\r\n                  b[j >> 1] = r;\r\n                  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;\r\n                  q = p << 3;\r\n                  p = (q >> 3 | 0) == (p | 0) ? q : p >> 31 ^ 2147483647;\r\n                  q = p << 1;\r\n                  b[c >> 1] = Ce((q >> 1 | 0) == (p | 0) ? q : p >> 31 ^ 2147483647, e) | 0;\r\n                  i = b[l >> 1] | 0;\r\n                  b[a >> 1] = i;\r\n                  k = b[m >> 1] | 0;\r\n                  b[n >> 1] = k;\r\n                  g = p >>> 16 & 65535;\r\n                  b[l >> 1] = g;\r\n                  h = (p >>> 1) - (p >> 16 << 15) & 65535;\r\n                  b[m >> 1] = h;\r\n                  o = o + 1 << 16 >> 16;\r\n                  if (o << 16 >> 16 >= d << 16 >> 16) break; else c = c + 2 | 0;\r\n              }\r\n              return\r\n          }\r\n\r\n          function zb(a) {\r\n              a = a | 0;\r\n              if (!a) a = -1; else {\r\n                  b[a >> 1] = 0;\r\n                  a = 0;\r\n              }\r\n              return a | 0\r\n          }\r\n\r\n          function Ab(a, d, e, f, g) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              var h = 0, i = 0, j = 0, k = 0;\r\n              j = f << 16 >> 16;\r\n              h = d + (j + -1 << 1) | 0;\r\n              j = j + -2 | 0;\r\n              k = b[h >> 1] | 0;\r\n              if (f << 16 >> 16 < 2) f = e << 16 >> 16; else {\r\n                  f = e << 16 >> 16;\r\n                  i = 0;\r\n                  d = d + (j << 1) | 0;\r\n                  while (1) {\r\n                      e = (Z(b[d >> 1] | 0, f) | 0) >> 15;\r\n                      if ((e | 0) > 32767) {\r\n                          c[g >> 2] = 1;\r\n                          e = 32767;\r\n                      }\r\n                      b[h >> 1] = Ge(b[h >> 1] | 0, e & 65535, g) | 0;\r\n                      h = h + -2 | 0;\r\n                      i = i + 1 << 16 >> 16;\r\n                      if ((i << 16 >> 16 | 0) > (j | 0)) break; else d = d + -2 | 0;\r\n                  }\r\n              }\r\n              f = (Z(b[a >> 1] | 0, f) | 0) >> 15;\r\n              if ((f | 0) <= 32767) {\r\n                  j = f;\r\n                  j = j & 65535;\r\n                  i = b[h >> 1] | 0;\r\n                  g = Ge(i, j, g) | 0;\r\n                  b[h >> 1] = g;\r\n                  b[a >> 1] = k;\r\n                  return\r\n              }\r\n              c[g >> 2] = 1;\r\n              j = 32767;\r\n              j = j & 65535;\r\n              i = b[h >> 1] | 0;\r\n              g = Ge(i, j, g) | 0;\r\n              b[h >> 1] = g;\r\n              b[a >> 1] = k;\r\n              return\r\n          }\r\n\r\n          function Bb(a) {\r\n              a = a | 0;\r\n              var c = 0, d = 0, e = 0;\r\n              if (!a) {\r\n                  e = -1;\r\n                  return e | 0\r\n              }\r\n              Qe(a + 104 | 0, 0, 340) | 0;\r\n              c = a + 102 | 0;\r\n              d = a;\r\n              e = d + 100 | 0;\r\n              do {\r\n                  b[d >> 1] = 0;\r\n                  d = d + 2 | 0;\r\n              } while ((d | 0) < (e | 0));\r\n              Ba(c) | 0;\r\n              zb(a + 100 | 0) | 0;\r\n              e = 0;\r\n              return e | 0\r\n          }\r\n\r\n          function Cb(d, e, f, g, h) {\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              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;\r\n              w = i;\r\n              i = i + 96 | 0;\r\n              s = w + 22 | 0;\r\n              t = w;\r\n              u = w + 44 | 0;\r\n              Pe(d + 124 | 0, f | 0, 320) | 0;\r\n              o = u + 22 | 0;\r\n              p = d + 100 | 0;\r\n              q = d + 80 | 0;\r\n              r = d + 102 | 0;\r\n              if ((e & -2 | 0) == 6) {\r\n                  n = 0;\r\n                  while (1) {\r\n                      Ie(g, 702, s);\r\n                      Ie(g, 722, t);\r\n                      m = d + 104 + (n + 10 << 1) | 0;\r\n                      Be(s, m, d, 40);\r\n                      k = u;\r\n                      j = s;\r\n                      e = k + 22 | 0;\r\n                      do {\r\n                          b[k >> 1] = b[j >> 1] | 0;\r\n                          k = k + 2 | 0;\r\n                          j = j + 2 | 0;\r\n                      } while ((k | 0) < (e | 0));\r\n                      k = o;\r\n                      e = k + 22 | 0;\r\n                      do {\r\n                          b[k >> 1] = 0;\r\n                          k = k + 2 | 0;\r\n                      } while ((k | 0) < (e | 0));\r\n                      He(t, u, u, 22, o, 0);\r\n                      e = 0;\r\n                      k = 21;\r\n                      do {\r\n                          j = b[u + (k << 16 >> 16 << 1) >> 1] | 0;\r\n                          j = Z(j, j) | 0;\r\n                          if ((j | 0) == 1073741824) {\r\n                              v = 7;\r\n                              break\r\n                          }\r\n                          l = j << 1;\r\n                          j = l + e | 0;\r\n                          if ((l ^ e | 0) > -1 & (j ^ e | 0) < 0) {\r\n                              c[h >> 2] = 1;\r\n                              e = (e >>> 31) + 2147483647 | 0;\r\n                          } else e = j;\r\n                          k = k + -1 << 16 >> 16;\r\n                      } while (k << 16 >> 16 > -1);\r\n                      if ((v | 0) == 7) {\r\n                          v = 0;\r\n                          c[h >> 2] = 1;\r\n                      }\r\n                      l = e >>> 16 & 65535;\r\n                      j = 20;\r\n                      e = 0;\r\n                      k = 20;\r\n                      while (1) {\r\n                          j = Z(b[u + (j + 1 << 1) >> 1] | 0, b[u + (j << 1) >> 1] | 0) | 0;\r\n                          if ((j | 0) == 1073741824) {\r\n                              v = 13;\r\n                              break\r\n                          }\r\n                          x = j << 1;\r\n                          j = x + e | 0;\r\n                          if ((x ^ e | 0) > -1 & (j ^ e | 0) < 0) {\r\n                              c[h >> 2] = 1;\r\n                              e = (e >>> 31) + 2147483647 | 0;\r\n                          } else e = j;\r\n                          j = (k & 65535) + -1 << 16 >> 16;\r\n                          if (j << 16 >> 16 > -1) {\r\n                              j = j << 16 >> 16;\r\n                              k = k + -1 | 0;\r\n                          } else break\r\n                      }\r\n                      if ((v | 0) == 13) {\r\n                          v = 0;\r\n                          c[h >> 2] = 1;\r\n                      }\r\n                      e = e >> 16;\r\n                      if ((e | 0) < 1) e = 0; else e = Td((e * 26214 | 0) >>> 15 & 65535, l) | 0;\r\n                      Ab(p, d, e, 40, h);\r\n                      e = f + (n << 1) | 0;\r\n                      He(t, d, e, 40, q, 1);\r\n                      Ca(r, m, e, 29491, 40, h);\r\n                      e = (n << 16) + 2621440 | 0;\r\n                      if ((e | 0) < 10485760) {\r\n                          n = e >> 16;\r\n                          g = g + 22 | 0;\r\n                      } else break\r\n                  }\r\n                  k = d + 104 | 0;\r\n                  j = d + 424 | 0;\r\n                  e = k + 20 | 0;\r\n                  do {\r\n                      a[k >> 0] = a[j >> 0] | 0;\r\n                      k = k + 1 | 0;\r\n                      j = j + 1 | 0;\r\n                  } while ((k | 0) < (e | 0));\r\n                  i = w;\r\n                  return\r\n              } else {\r\n                  n = 0;\r\n                  while (1) {\r\n                      Ie(g, 742, s);\r\n                      Ie(g, 762, t);\r\n                      m = d + 104 + (n + 10 << 1) | 0;\r\n                      Be(s, m, d, 40);\r\n                      k = u;\r\n                      j = s;\r\n                      e = k + 22 | 0;\r\n                      do {\r\n                          b[k >> 1] = b[j >> 1] | 0;\r\n                          k = k + 2 | 0;\r\n                          j = j + 2 | 0;\r\n                      } while ((k | 0) < (e | 0));\r\n                      k = o;\r\n                      e = k + 22 | 0;\r\n                      do {\r\n                          b[k >> 1] = 0;\r\n                          k = k + 2 | 0;\r\n                      } while ((k | 0) < (e | 0));\r\n                      He(t, u, u, 22, o, 0);\r\n                      e = 0;\r\n                      k = 21;\r\n                      do {\r\n                          j = b[u + (k << 16 >> 16 << 1) >> 1] | 0;\r\n                          j = Z(j, j) | 0;\r\n                          if ((j | 0) == 1073741824) {\r\n                              v = 22;\r\n                              break\r\n                          }\r\n                          x = j << 1;\r\n                          j = x + e | 0;\r\n                          if ((x ^ e | 0) > -1 & (j ^ e | 0) < 0) {\r\n                              c[h >> 2] = 1;\r\n                              e = (e >>> 31) + 2147483647 | 0;\r\n                          } else e = j;\r\n                          k = k + -1 << 16 >> 16;\r\n                      } while (k << 16 >> 16 > -1);\r\n                      if ((v | 0) == 22) {\r\n                          v = 0;\r\n                          c[h >> 2] = 1;\r\n                      }\r\n                      l = e >>> 16 & 65535;\r\n                      j = 20;\r\n                      e = 0;\r\n                      k = 20;\r\n                      while (1) {\r\n                          j = Z(b[u + (j + 1 << 1) >> 1] | 0, b[u + (j << 1) >> 1] | 0) | 0;\r\n                          if ((j | 0) == 1073741824) {\r\n                              v = 28;\r\n                              break\r\n                          }\r\n                          x = j << 1;\r\n                          j = x + e | 0;\r\n                          if ((x ^ e | 0) > -1 & (j ^ e | 0) < 0) {\r\n                              c[h >> 2] = 1;\r\n                              e = (e >>> 31) + 2147483647 | 0;\r\n                          } else e = j;\r\n                          j = (k & 65535) + -1 << 16 >> 16;\r\n                          if (j << 16 >> 16 > -1) {\r\n                              j = j << 16 >> 16;\r\n                              k = k + -1 | 0;\r\n                          } else break\r\n                      }\r\n                      if ((v | 0) == 28) {\r\n                          v = 0;\r\n                          c[h >> 2] = 1;\r\n                      }\r\n                      e = e >> 16;\r\n                      if ((e | 0) < 1) e = 0; else e = Td((e * 26214 | 0) >>> 15 & 65535, l) | 0;\r\n                      Ab(p, d, e, 40, h);\r\n                      e = f + (n << 1) | 0;\r\n                      He(t, d, e, 40, q, 1);\r\n                      Ca(r, m, e, 29491, 40, h);\r\n                      e = (n << 16) + 2621440 | 0;\r\n                      if ((e | 0) < 10485760) {\r\n                          n = e >> 16;\r\n                          g = g + 22 | 0;\r\n                      } else break\r\n                  }\r\n                  k = d + 104 | 0;\r\n                  j = d + 424 | 0;\r\n                  e = k + 20 | 0;\r\n                  do {\r\n                      a[k >> 0] = a[j >> 0] | 0;\r\n                      k = k + 1 | 0;\r\n                      j = j + 1 | 0;\r\n                  } while ((k | 0) < (e | 0));\r\n                  i = w;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function Db(a, b) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              var d = 0, e = 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(1764) | 0;\r\n              if (!d) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              if ((Ua(d) | 0) << 16 >> 16 == 0 ? (e = d + 1748 | 0, (xb(e) | 0) << 16 >> 16 == 0) : 0) {\r\n                  Va(d, 0) | 0;\r\n                  Bb(d + 1304 | 0) | 0;\r\n                  xb(e) | 0;\r\n                  c[d + 1760 >> 2] = 0;\r\n                  c[a >> 2] = d;\r\n                  a = 0;\r\n                  return a | 0\r\n              }\r\n              b = c[d >> 2] | 0;\r\n              if (!b) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              Ke(b);\r\n              c[d >> 2] = 0;\r\n              a = -1;\r\n              return a | 0\r\n          }\r\n\r\n          function Eb(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Ke(b);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function Fb(a, d, f, g, h) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              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;\r\n              v = i;\r\n              i = i + 208 | 0;\r\n              u = v + 88 | 0;\r\n              t = v;\r\n              s = a + 1164 | 0;\r\n              j = c[a + 1256 >> 2] | 0;\r\n              if ((g + -5 | 0) >>> 0 < 2) {\r\n                  r = j + 16 | 0;\r\n                  if ((b[r >> 1] | 0) > 0) {\r\n                      q = c[(c[a + 1260 >> 2] | 0) + 32 >> 2] | 0;\r\n                      p = 0;\r\n                      j = 0;\r\n                      while (1) {\r\n                          o = q + (p << 1) | 0;\r\n                          m = b[o >> 1] | 0;\r\n                          if (m << 16 >> 16 > 0) {\r\n                              l = f;\r\n                              n = 0;\r\n                              k = 0;\r\n                              while (1) {\r\n                                  k = e[l >> 1] | k << 1 & 131070;\r\n                                  n = n + 1 << 16 >> 16;\r\n                                  if (n << 16 >> 16 >= m << 16 >> 16) break; else l = l + 2 | 0;\r\n                              }\r\n                              k = k & 65535;\r\n                          } else k = 0;\r\n                          b[u + (p << 1) >> 1] = k;\r\n                          j = j + 1 << 16 >> 16;\r\n                          if (j << 16 >> 16 < (b[r >> 1] | 0)) {\r\n                              f = f + (b[o >> 1] << 1) | 0;\r\n                              p = j << 16 >> 16;\r\n                          } else break\r\n                      }\r\n                  }\r\n              } else {\r\n                  q = j + (d << 1) | 0;\r\n                  if ((b[q >> 1] | 0) > 0) {\r\n                      r = c[(c[a + 1260 >> 2] | 0) + (d << 2) >> 2] | 0;\r\n                      o = 0;\r\n                      j = 0;\r\n                      while (1) {\r\n                          p = r + (o << 1) | 0;\r\n                          m = b[p >> 1] | 0;\r\n                          if (m << 16 >> 16 > 0) {\r\n                              l = f;\r\n                              n = 0;\r\n                              k = 0;\r\n                              while (1) {\r\n                                  k = e[l >> 1] | k << 1 & 131070;\r\n                                  n = n + 1 << 16 >> 16;\r\n                                  if (n << 16 >> 16 >= m << 16 >> 16) break; else l = l + 2 | 0;\r\n                              }\r\n                              k = k & 65535;\r\n                          } else k = 0;\r\n                          b[u + (o << 1) >> 1] = k;\r\n                          j = j + 1 << 16 >> 16;\r\n                          if (j << 16 >> 16 < (b[q >> 1] | 0)) {\r\n                              f = f + (b[p >> 1] << 1) | 0;\r\n                              o = j << 16 >> 16;\r\n                          } else break\r\n                      }\r\n                  }\r\n              }\r\n              Wa(a, d, u, g, h, t);\r\n              Cb(a + 1304 | 0, d, h, t, s);\r\n              yb(a + 1748 | 0, h, 160, s);\r\n              j = 0;\r\n              do {\r\n                  a = h + (j << 1) | 0;\r\n                  b[a >> 1] = e[a >> 1] & 65528;\r\n                  j = j + 1 | 0;\r\n              } while ((j | 0) != 160);\r\n              i = v;\r\n              return\r\n          }\r\n\r\n          function Gb(a, f, g, h) {\r\n              a = a | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var i = 0, j = 0, k = 0;\r\n              j = c[h + 100 >> 2] | 0;\r\n              k = (e[(c[h + 96 >> 2] | 0) + (a << 1) >> 1] | 0) + 65535 | 0;\r\n              h = k & 65535;\r\n              i = h << 16 >> 16 > -1;\r\n              if (a >>> 0 < 8) {\r\n                  if (!i) return;\r\n                  j = c[j + (a << 2) >> 2] | 0;\r\n                  i = k << 16 >> 16;\r\n                  while (1) {\r\n                      b[g + (b[j + (i << 1) >> 1] << 1) >> 1] = (d[f + (i >> 3) >> 0] | 0) >>> (i & 7 ^ 7) & 1;\r\n                      h = h + -1 << 16 >> 16;\r\n                      if (h << 16 >> 16 > -1) i = h << 16 >> 16; else break\r\n                  }\r\n                  return\r\n              } else {\r\n                  if (!i) return;\r\n                  i = k << 16 >> 16;\r\n                  while (1) {\r\n                      b[g + (i << 1) >> 1] = (d[f + (i >> 3) >> 0] | 0) >>> (i & 7 ^ 7) & 1;\r\n                      h = h + -1 << 16 >> 16;\r\n                      if (h << 16 >> 16 > -1) i = h << 16 >> 16; else break\r\n                  }\r\n                  return\r\n              }\r\n          }\r\n\r\n          function Hb(a, b, c) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              c = c | 0;\r\n              a = vd(a, c, 31764) | 0;\r\n              return ((sd(b) | 0 | a) << 16 >> 16 != 0) << 31 >> 31 | 0\r\n          }\r\n\r\n          function Ib(a, b) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              wd(a);\r\n              td(b);\r\n              return\r\n          }\r\n\r\n          function Jb(d, f, g, h, j, k, l) {\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              var m = 0, n = 0, o = 0, p = 0, q = 0;\r\n              q = i;\r\n              i = i + 512 | 0;\r\n              m = q + 8 | 0;\r\n              n = q + 4 | 0;\r\n              o = q;\r\n              c[o >> 2] = 0;\r\n              p = l << 16 >> 16 == 3;\r\n              if (!((l & 65535) < 2 | p & 1)) {\r\n                  if (l << 16 >> 16 != 2) {\r\n                      j = -1;\r\n                      i = q;\r\n                      return j | 0\r\n                  }\r\n                  xd(d, g, h, m + 2 | 0, o);\r\n                  d = c[o >> 2] | 0;\r\n                  c[k >> 2] = d;\r\n                  ud(f, d, n);\r\n                  f = c[n >> 2] | 0;\r\n                  b[m >> 1] = f;\r\n                  b[m + 490 >> 1] = (f | 0) == 3 ? -1 : g & 65535;\r\n                  a[j >> 0] = f;\r\n                  f = 1;\r\n                  do {\r\n                      m = m + 1 | 0;\r\n                      a[j + f >> 0] = a[m >> 0] | 0;\r\n                      f = f + 1 | 0;\r\n                  } while ((f | 0) != 492);\r\n                  m = 492;\r\n                  i = q;\r\n                  return m | 0\r\n              }\r\n              xd(d, g, h, m, o);\r\n              ud(f, c[o >> 2] | 0, n);\r\n              h = c[n >> 2] | 0;\r\n              if ((h | 0) != 3) {\r\n                  f = c[o >> 2] | 0;\r\n                  c[k >> 2] = f;\r\n                  if ((f | 0) == 8) {\r\n                      switch (h | 0) {\r\n                          case 1: {\r\n                              b[m + 70 >> 1] = 0;\r\n                              break\r\n                          }\r\n                          case 2: {\r\n                              o = m + 70 | 0;\r\n                              b[o >> 1] = e[o >> 1] | 0 | 1;\r\n                              break\r\n                          }\r\n                          default: {\r\n                          }\r\n                      }\r\n                      b[m + 72 >> 1] = g & 1;\r\n                      b[m + 74 >> 1] = g >>> 1 & 1;\r\n                      b[m + 76 >> 1] = g >>> 2 & 1;\r\n                      f = 8;\r\n                  }\r\n              } else {\r\n                  c[k >> 2] = 15;\r\n                  f = 15;\r\n              }\r\n              if (p) {\r\n                  tc(f, m, j, (c[d + 4 >> 2] | 0) + 2392 | 0);\r\n                  j = b[3404 + (c[k >> 2] << 16 >> 16 << 1) >> 1] | 0;\r\n                  i = q;\r\n                  return j | 0\r\n              }\r\n              switch (l << 16 >> 16) {\r\n                  case 0: {\r\n                      sc(f, m, j, (c[d + 4 >> 2] | 0) + 2392 | 0);\r\n                      j = b[3404 + (c[k >> 2] << 16 >> 16 << 1) >> 1] | 0;\r\n                      i = q;\r\n                      return j | 0\r\n                  }\r\n                  case 1: {\r\n                      rc(f, m, j, (c[d + 4 >> 2] | 0) + 2392 | 0);\r\n                      j = b[3436 + (c[k >> 2] << 16 >> 16 << 1) >> 1] | 0;\r\n                      i = q;\r\n                      return j | 0\r\n                  }\r\n                  default: {\r\n                      j = -1;\r\n                      i = q;\r\n                      return j | 0\r\n                  }\r\n              }\r\n              return 0\r\n          }\r\n\r\n          function Kb(a, c, d, e, f, g) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              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,\r\n                  x = 0, y = 0;\r\n              y = i;\r\n              i = i + 480 | 0;\r\n              x = y;\r\n              g = 240;\r\n              l = f;\r\n              k = a;\r\n              j = x;\r\n              h = 0;\r\n              while (1) {\r\n                  w = ((Z(b[l >> 1] | 0, b[k >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n                  b[j >> 1] = w;\r\n                  w = w << 16;\r\n                  h = (Z(w >> 15, w >> 16) | 0) + h | 0;\r\n                  if ((h | 0) < 0) {\r\n                      m = 4;\r\n                      break\r\n                  }\r\n                  g = g + -1 | 0;\r\n                  if (!((g & 65535) << 16 >> 16)) {\r\n                      g = 0;\r\n                      break\r\n                  } else {\r\n                      l = l + 2 | 0;\r\n                      k = k + 2 | 0;\r\n                      j = j + 2 | 0;\r\n                  }\r\n              }\r\n              if ((m | 0) == 4) {\r\n                  h = g & 65535;\r\n                  j = 240 - g | 0;\r\n                  if (!(h << 16 >> 16)) g = 0; else {\r\n                      l = h;\r\n                      k = f + (j << 1) | 0;\r\n                      g = a + (j << 1) | 0;\r\n                      h = x + (j << 1) | 0;\r\n                      while (1) {\r\n                          b[h >> 1] = ((Z(b[k >> 1] | 0, b[g >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n                          l = l + -1 << 16 >> 16;\r\n                          if (!(l << 16 >> 16)) {\r\n                              g = 0;\r\n                              break\r\n                          } else {\r\n                              k = k + 2 | 0;\r\n                              g = g + 2 | 0;\r\n                              h = h + 2 | 0;\r\n                          }\r\n                      }\r\n                  }\r\n                  do {\r\n                      k = g & 65535;\r\n                      g = 120;\r\n                      j = x;\r\n                      h = 0;\r\n                      while (1) {\r\n                          w = (b[j >> 1] | 0) >>> 2;\r\n                          u = j + 2 | 0;\r\n                          b[j >> 1] = w;\r\n                          w = w << 16 >> 16;\r\n                          w = Z(w, w) | 0;\r\n                          v = (b[u >> 1] | 0) >>> 2;\r\n                          b[u >> 1] = v;\r\n                          v = v << 16 >> 16;\r\n                          h = ((Z(v, v) | 0) + w << 1) + h | 0;\r\n                          g = g + -1 << 16 >> 16;\r\n                          if (!(g << 16 >> 16)) break; else j = j + 4 | 0;\r\n                      }\r\n                      g = k + 4 | 0;\r\n                  } while ((h | 0) < 1)\r\n              }\r\n              w = h + 1 | 0;\r\n              v = (pe(w) | 0) << 16 >> 16;\r\n              w = w << v;\r\n              b[d >> 1] = w >>> 16;\r\n              b[e >> 1] = (w >>> 1) - (w >> 16 << 15);\r\n              w = x + 478 | 0;\r\n              l = c << 16 >> 16;\r\n              if (c << 16 >> 16 <= 0) {\r\n                  x = v - g | 0;\r\n                  x = x & 65535;\r\n                  i = y;\r\n                  return x | 0\r\n              }\r\n              r = x + 476 | 0;\r\n              s = v + 1 | 0;\r\n              t = 239 - l | 0;\r\n              u = x + (236 - l << 1) | 0;\r\n              c = l;\r\n              d = d + (l << 1) | 0;\r\n              e = e + (l << 1) | 0;\r\n              while (1) {\r\n                  m = Z((t >>> 1) + 65535 & 65535, -2) | 0;\r\n                  k = x + (m + 236 << 1) | 0;\r\n                  m = u + (m << 1) | 0;\r\n                  f = 240 - c | 0;\r\n                  q = f + -1 | 0;\r\n                  j = x + (q << 1) | 0;\r\n                  a = q >>> 1 & 65535;\r\n                  f = x + (f + -2 << 1) | 0;\r\n                  l = Z(b[w >> 1] | 0, b[j >> 1] | 0) | 0;\r\n                  if (!(a << 16 >> 16)) {\r\n                      m = f;\r\n                      k = r;\r\n                  } else {\r\n                      p = r;\r\n                      o = w;\r\n                      while (1) {\r\n                          h = j + -4 | 0;\r\n                          n = o + -4 | 0;\r\n                          l = (Z(b[p >> 1] | 0, b[f >> 1] | 0) | 0) + l | 0;\r\n                          a = a + -1 << 16 >> 16;\r\n                          l = (Z(b[n >> 1] | 0, b[h >> 1] | 0) | 0) + l | 0;\r\n                          if (!(a << 16 >> 16)) break; else {\r\n                              f = j + -6 | 0;\r\n                              p = o + -6 | 0;\r\n                              j = h;\r\n                              o = n;\r\n                          }\r\n                      }\r\n                  }\r\n                  if (q & 1) l = (Z(b[k >> 1] | 0, b[m >> 1] | 0) | 0) + l | 0;\r\n                  q = l << s;\r\n                  b[d >> 1] = q >>> 16;\r\n                  b[e >> 1] = (q >>> 1) - (q >> 16 << 15);\r\n                  if ((c & 65535) + -1 << 16 >> 16 << 16 >> 16 > 0) {\r\n                      t = t + 1 | 0;\r\n                      u = u + 2 | 0;\r\n                      c = c + -1 | 0;\r\n                      d = d + -2 | 0;\r\n                      e = e + -2 | 0;\r\n                  } else break\r\n              }\r\n              x = v - g | 0;\r\n              x = x & 65535;\r\n              i = y;\r\n              return x | 0\r\n          }\r\n\r\n          function Lb(a, c, d, f, g, h, j, k) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              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,\r\n                  A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0;\r\n              E = i;\r\n              i = i + 3440 | 0;\r\n              D = E + 3420 | 0;\r\n              z = E + 3400 | 0;\r\n              A = E + 3224 | 0;\r\n              C = E;\r\n              x = E + 3320 | 0;\r\n              B = E + 3240 | 0;\r\n              y = E + 24 | 0;\r\n              hc(d, a, x, 2, k);\r\n              rd(x, c, B, A, 5, z, 5, k);\r\n              fc(d, B, y, k);\r\n              pd(10, 5, 5, x, y, z, A, C, k);\r\n              c = f;\r\n              k = c + 80 | 0;\r\n              do {\r\n                  b[c >> 1] = 0;\r\n                  c = c + 2 | 0;\r\n              } while ((c | 0) < (k | 0));\r\n              b[h >> 1] = 65535;\r\n              b[h + 2 >> 1] = 65535;\r\n              b[h + 4 >> 1] = 65535;\r\n              b[h + 6 >> 1] = 65535;\r\n              b[h + 8 >> 1] = 65535;\r\n              p = 0;\r\n              q = C;\r\n              r = D;\r\n              do {\r\n                  a = b[q >> 1] | 0;\r\n                  q = q + 2 | 0;\r\n                  l = (a * 6554 | 0) >>> 15;\r\n                  m = l << 16 >> 16;\r\n                  c = f + (a << 1) | 0;\r\n                  k = b[c >> 1] | 0;\r\n                  if ((b[B + (a << 1) >> 1] | 0) > 0) {\r\n                      b[c >> 1] = k + 4096;\r\n                      b[r >> 1] = 8192;\r\n                      n = l;\r\n                  } else {\r\n                      b[c >> 1] = k + 61440;\r\n                      b[r >> 1] = -8192;\r\n                      n = m + 8 | 0;\r\n                  }\r\n                  r = r + 2 | 0;\r\n                  o = n & 65535;\r\n                  c = a - (l << 2) - m << 16 >> 16;\r\n                  l = h + (c << 1) | 0;\r\n                  k = b[l >> 1] | 0;\r\n                  a = k << 16 >> 16;\r\n                  do if (k << 16 >> 16 >= 0) {\r\n                      m = n << 16 >> 16;\r\n                      if (!((m ^ a) & 8)) {\r\n                          c = h + (c + 5 << 1) | 0;\r\n                          if ((a | 0) > (m | 0)) {\r\n                              b[c >> 1] = k;\r\n                              b[l >> 1] = o;\r\n                              break\r\n                          } else {\r\n                              b[c >> 1] = o;\r\n                              break\r\n                          }\r\n                      } else {\r\n                          c = h + (c + 5 << 1) | 0;\r\n                          if ((a & 7) >>> 0 > (m & 7) >>> 0) {\r\n                              b[c >> 1] = o;\r\n                              break\r\n                          } else {\r\n                              b[c >> 1] = k;\r\n                              b[l >> 1] = o;\r\n                              break\r\n                          }\r\n                      }\r\n                  } else b[l >> 1] = o; while (0);\r\n                  p = p + 1 << 16 >> 16;\r\n              } while (p << 16 >> 16 < 10);\r\n              r = D + 2 | 0;\r\n              p = D + 4 | 0;\r\n              n = D + 6 | 0;\r\n              m = D + 8 | 0;\r\n              l = D + 10 | 0;\r\n              c = D + 12 | 0;\r\n              k = D + 14 | 0;\r\n              a = D + 16 | 0;\r\n              s = D + 18 | 0;\r\n              t = 40;\r\n              u = d + (0 - (b[C >> 1] | 0) << 1) | 0;\r\n              v = d + (0 - (b[C + 2 >> 1] | 0) << 1) | 0;\r\n              w = d + (0 - (b[C + 4 >> 1] | 0) << 1) | 0;\r\n              x = d + (0 - (b[C + 6 >> 1] | 0) << 1) | 0;\r\n              y = d + (0 - (b[C + 8 >> 1] | 0) << 1) | 0;\r\n              z = d + (0 - (b[C + 10 >> 1] | 0) << 1) | 0;\r\n              A = d + (0 - (b[C + 12 >> 1] | 0) << 1) | 0;\r\n              B = d + (0 - (b[C + 14 >> 1] | 0) << 1) | 0;\r\n              f = d + (0 - (b[C + 16 >> 1] | 0) << 1) | 0;\r\n              q = d + (0 - (b[C + 18 >> 1] | 0) << 1) | 0;\r\n              o = g;\r\n              while (1) {\r\n                  K = (Z(b[D >> 1] | 0, b[u >> 1] | 0) | 0) >> 7;\r\n                  J = (Z(b[r >> 1] | 0, b[v >> 1] | 0) | 0) >> 7;\r\n                  I = (Z(b[p >> 1] | 0, b[w >> 1] | 0) | 0) >> 7;\r\n                  H = (Z(b[n >> 1] | 0, b[x >> 1] | 0) | 0) >> 7;\r\n                  G = (Z(b[m >> 1] | 0, b[y >> 1] | 0) | 0) >> 7;\r\n                  F = (Z(b[l >> 1] | 0, b[z >> 1] | 0) | 0) >> 7;\r\n                  C = (Z(b[c >> 1] | 0, b[A >> 1] | 0) | 0) >> 7;\r\n                  d = (Z(b[k >> 1] | 0, b[B >> 1] | 0) | 0) >>> 7;\r\n                  g = (Z(b[a >> 1] | 0, b[f >> 1] | 0) | 0) >>> 7;\r\n                  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;\r\n                  t = t + -1 << 16 >> 16;\r\n                  if (!(t << 16 >> 16)) break; else {\r\n                      u = u + 2 | 0;\r\n                      v = v + 2 | 0;\r\n                      w = w + 2 | 0;\r\n                      x = x + 2 | 0;\r\n                      y = y + 2 | 0;\r\n                      z = z + 2 | 0;\r\n                      A = A + 2 | 0;\r\n                      B = B + 2 | 0;\r\n                      f = f + 2 | 0;\r\n                      q = q + 2 | 0;\r\n                      o = o + 2 | 0;\r\n                  }\r\n              }\r\n              c = 0;\r\n              do {\r\n                  k = h + (c << 1) | 0;\r\n                  a = b[k >> 1] | 0;\r\n                  if ((c | 0) < 5) a = (e[j + ((a & 7) << 1) >> 1] | a & 8) & 65535; else a = b[j + ((a & 7) << 1) >> 1] | 0;\r\n                  b[k >> 1] = a;\r\n                  c = c + 1 | 0;\r\n              } while ((c | 0) != 10);\r\n              i = E;\r\n              return\r\n          }\r\n\r\n          function Mb(a, d, e, f, g, h, j, k) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              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,\r\n                  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;\r\n              N = i;\r\n              i = i + 3456 | 0;\r\n              I = N + 3448 | 0;\r\n              G = N + 3360 | 0;\r\n              E = N + 3368 | 0;\r\n              p = N + 3280 | 0;\r\n              H = N + 3200 | 0;\r\n              F = N;\r\n              K = (f & 65535) << 17;\r\n              M = e << 16 >> 16;\r\n              J = e << 16 >> 16 < 40;\r\n              if (J) {\r\n                  f = K >> 16;\r\n                  e = M;\r\n                  do {\r\n                      m = (Z(b[d + (e - M << 1) >> 1] | 0, f) | 0) >> 15;\r\n                      if ((m | 0) > 32767) {\r\n                          c[k >> 2] = 1;\r\n                          m = 32767;\r\n                      }\r\n                      D = d + (e << 1) | 0;\r\n                      b[D >> 1] = Rd(b[D >> 1] | 0, m & 65535, k) | 0;\r\n                      e = e + 1 | 0;\r\n                  } while ((e & 65535) << 16 >> 16 != 40)\r\n              }\r\n              hc(d, a, E, 1, k);\r\n              qd(E, H, p, 8);\r\n              fc(d, H, F, k);\r\n              D = G + 2 | 0;\r\n              b[G >> 1] = 0;\r\n              b[D >> 1] = 1;\r\n              a = 1;\r\n              m = 0;\r\n              o = 1;\r\n              p = 0;\r\n              n = -1;\r\n              do {\r\n                  B = b[2830 + (p << 1) >> 1] | 0;\r\n                  C = B << 16 >> 16;\r\n                  A = 0;\r\n                  do {\r\n                      y = b[2834 + (A << 1) >> 1] | 0;\r\n                      z = y << 16 >> 16;\r\n                      x = a;\r\n                      v = C;\r\n                      u = o;\r\n                      w = B;\r\n                      t = n;\r\n                      while (1) {\r\n                          l = b[E + (v << 1) >> 1] | 0;\r\n                          r = b[F + (v * 80 | 0) + (v << 1) >> 1] | 0;\r\n                          e = z;\r\n                          o = 1;\r\n                          s = y;\r\n                          a = y;\r\n                          n = -1;\r\n                          while (1) {\r\n                              f = Rd(l, b[E + (e << 1) >> 1] | 0, k) | 0;\r\n                              f = f << 16 >> 16;\r\n                              f = (Z(f, f) | 0) >>> 15;\r\n                              q = (b[F + (v * 80 | 0) + (e << 1) >> 1] << 15) + 32768 + ((b[F + (e * 80 | 0) + (e << 1) >> 1] | 0) + r << 14) | 0;\r\n                              if (((Z(f << 16 >> 16, o << 16 >> 16) | 0) - (Z(q >> 16, n << 16 >> 16) | 0) << 1 | 0) > 0) {\r\n                                  o = q >>> 16 & 65535;\r\n                                  a = s;\r\n                                  n = f & 65535;\r\n                              }\r\n                              q = e + 5 | 0;\r\n                              s = q & 65535;\r\n                              if (s << 16 >> 16 >= 40) break; else e = q << 16 >> 16;\r\n                          }\r\n                          if (((Z(n << 16 >> 16, u << 16 >> 16) | 0) - (Z(o << 16 >> 16, t << 16 >> 16) | 0) << 1 | 0) > 0) {\r\n                              b[G >> 1] = w;\r\n                              b[D >> 1] = a;\r\n                              m = w;\r\n                          } else {\r\n                              a = x;\r\n                              o = u;\r\n                              n = t;\r\n                          }\r\n                          q = v + 5 | 0;\r\n                          w = q & 65535;\r\n                          if (w << 16 >> 16 >= 40) break; else {\r\n                              x = a;\r\n                              v = q << 16 >> 16;\r\n                              u = o;\r\n                              t = n;\r\n                          }\r\n                      }\r\n                      A = A + 1 | 0;\r\n                  } while ((A | 0) != 4);\r\n                  p = p + 1 | 0;\r\n              } while ((p | 0) != 2);\r\n              r = a;\r\n              s = m;\r\n              f = g;\r\n              e = f + 80 | 0;\r\n              do {\r\n                  b[f >> 1] = 0;\r\n                  f = f + 2 | 0;\r\n              } while ((f | 0) < (e | 0));\r\n              o = s;\r\n              e = 0;\r\n              q = 0;\r\n              f = 0;\r\n              while (1) {\r\n                  m = o << 16 >> 16;\r\n                  l = b[H + (m << 1) >> 1] | 0;\r\n                  a = (m * 6554 | 0) >>> 15;\r\n                  o = a << 16;\r\n                  p = o >> 15;\r\n                  n = m - (p + (a << 3) << 16 >> 17) | 0;\r\n                  switch (n << 16 >> 16 | 0) {\r\n                      case 0: {\r\n                          p = o >> 10;\r\n                          a = 1;\r\n                          break\r\n                      }\r\n                      case 1: {\r\n                          if (!((e & 65535) << 16 >> 16)) a = 0; else {\r\n                              p = a << 22 >> 16 | 16;\r\n                              a = 1;\r\n                          }\r\n                          break\r\n                      }\r\n                      case 2: {\r\n                          p = a << 22 >> 16 | 32;\r\n                          a = 1;\r\n                          break\r\n                      }\r\n                      case 3: {\r\n                          p = a << 17 >> 16 | 1;\r\n                          a = 0;\r\n                          break\r\n                      }\r\n                      case 4: {\r\n                          p = a << 22 >> 16 | 48;\r\n                          a = 1;\r\n                          break\r\n                      }\r\n                      default: {\r\n                          p = a;\r\n                          a = n & 65535;\r\n                      }\r\n                  }\r\n                  p = p & 65535;\r\n                  n = g + (m << 1) | 0;\r\n                  if (l << 16 >> 16 > 0) {\r\n                      b[n >> 1] = 8191;\r\n                      b[I + (e << 1) >> 1] = 32767;\r\n                      m = a << 16 >> 16;\r\n                      if (a << 16 >> 16 < 0) {\r\n                          m = 0 - m << 16;\r\n                          if ((m | 0) < 983040) m = 1 >>> (m >> 16) & 65535; else m = 0;\r\n                      } else {\r\n                          F = 1 << m;\r\n                          m = (F << 16 >> 16 >> m | 0) == 1 ? F & 65535 : 32767;\r\n                      }\r\n                      f = Rd(f, m, k) | 0;\r\n                  } else {\r\n                      b[n >> 1] = -8192;\r\n                      b[I + (e << 1) >> 1] = -32768;\r\n                  }\r\n                  m = Rd(q, p, k) | 0;\r\n                  e = e + 1 | 0;\r\n                  if ((e | 0) == 2) {\r\n                      q = m;\r\n                      break\r\n                  }\r\n                  o = b[G + (e << 1) >> 1] | 0;\r\n                  q = m;\r\n              }\r\n              b[j >> 1] = f;\r\n              p = I + 2 | 0;\r\n              o = b[I >> 1] | 0;\r\n              a = 0;\r\n              n = d + (0 - (s << 16 >> 16) << 1) | 0;\r\n              m = d + (0 - (r << 16 >> 16) << 1) | 0;\r\n              do {\r\n                  f = Z(b[n >> 1] | 0, o) | 0;\r\n                  n = n + 2 | 0;\r\n                  if ((f | 0) != 1073741824 ? (L = f << 1, !((f | 0) > 0 & (L | 0) < 0)) : 0) l = L; else {\r\n                      c[k >> 2] = 1;\r\n                      l = 2147483647;\r\n                  }\r\n                  e = Z(b[p >> 1] | 0, b[m >> 1] | 0) | 0;\r\n                  m = m + 2 | 0;\r\n                  if ((e | 0) != 1073741824) {\r\n                      f = (e << 1) + l | 0;\r\n                      if ((e ^ l | 0) > 0 & (f ^ l | 0) < 0) {\r\n                          c[k >> 2] = 1;\r\n                          f = (l >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[k >> 2] = 1;\r\n                      f = 2147483647;\r\n                  }\r\n                  b[h + (a << 1) >> 1] = Ce(f, k) | 0;\r\n                  a = a + 1 | 0;\r\n              } while ((a | 0) != 40);\r\n              if (!J) {\r\n                  i = N;\r\n                  return q | 0\r\n              }\r\n              e = K >> 16;\r\n              f = M;\r\n              do {\r\n                  l = (Z(b[g + (f - M << 1) >> 1] | 0, e) | 0) >> 15;\r\n                  if ((l | 0) > 32767) {\r\n                      c[k >> 2] = 1;\r\n                      l = 32767;\r\n                  }\r\n                  h = g + (f << 1) | 0;\r\n                  b[h >> 1] = Rd(b[h >> 1] | 0, l & 65535, k) | 0;\r\n                  f = f + 1 | 0;\r\n              } while ((f & 65535) << 16 >> 16 != 40);\r\n              i = N;\r\n              return q | 0\r\n          }\r\n\r\n          function Nb(a, d, e, f, g, h, j, k, l, m) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              var n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0;\r\n              x = i;\r\n              i = i + 3456 | 0;\r\n              r = x + 3360 | 0;\r\n              s = x + 3368 | 0;\r\n              t = x + 3280 | 0;\r\n              u = x + 3200 | 0;\r\n              v = x;\r\n              w = g << 16 >> 16;\r\n              p = w << 1;\r\n              if ((p | 0) == (w << 17 >> 16 | 0)) q = p; else {\r\n                  c[m >> 2] = 1;\r\n                  q = g << 16 >> 16 > 0 ? 32767 : -32768;\r\n              }\r\n              w = f << 16 >> 16;\r\n              n = f << 16 >> 16 < 40;\r\n              if (n) {\r\n                  g = q << 16 >> 16;\r\n                  o = w;\r\n                  do {\r\n                      f = e + (o << 1) | 0;\r\n                      p = (Z(b[e + (o - w << 1) >> 1] | 0, g) | 0) >> 15;\r\n                      if ((p | 0) > 32767) {\r\n                          c[m >> 2] = 1;\r\n                          p = 32767;\r\n                      }\r\n                      b[f >> 1] = Rd(b[f >> 1] | 0, p & 65535, m) | 0;\r\n                      o = o + 1 | 0;\r\n                  } while ((o & 65535) << 16 >> 16 != 40)\r\n              }\r\n              hc(e, d, s, 1, m);\r\n              qd(s, u, t, 8);\r\n              fc(e, u, v, m);\r\n              Ob(a, s, v, l, r);\r\n              p = Pb(a, r, u, h, e, j, k, m) | 0;\r\n              if (!n) {\r\n                  i = x;\r\n                  return p | 0\r\n              }\r\n              o = q << 16 >> 16;\r\n              g = w;\r\n              do {\r\n                  f = h + (g << 1) | 0;\r\n                  n = (Z(b[h + (g - w << 1) >> 1] | 0, o) | 0) >> 15;\r\n                  if ((n | 0) > 32767) {\r\n                      c[m >> 2] = 1;\r\n                      n = 32767;\r\n                  }\r\n                  b[f >> 1] = Rd(b[f >> 1] | 0, n & 65535, m) | 0;\r\n                  g = g + 1 | 0;\r\n              } while ((g & 65535) << 16 >> 16 != 40);\r\n              i = x;\r\n              return p | 0\r\n          }\r\n\r\n          function Ob(a, c, d, f, g) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              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,\r\n                  w = 0, x = 0;\r\n              x = g + 2 | 0;\r\n              b[g >> 1] = 0;\r\n              b[x >> 1] = 1;\r\n              v = a << 16 >> 16 << 1;\r\n              h = 1;\r\n              w = 0;\r\n              a = -1;\r\n              do {\r\n                  u = (w << 3) + v << 16 >> 16;\r\n                  k = b[f + (u << 1) >> 1] | 0;\r\n                  u = b[f + ((u | 1) << 1) >> 1] | 0;\r\n                  i = k << 16 >> 16;\r\n                  a:do if (k << 16 >> 16 < 40) {\r\n                      t = u << 16 >> 16;\r\n                      if (u << 16 >> 16 < 40) s = h; else while (1) {\r\n                          if ((a << 16 >> 16 | 0) < (0 - (h << 16 >> 16) | 0)) {\r\n                              b[g >> 1] = k;\r\n                              b[x >> 1] = u;\r\n                              j = 1;\r\n                              a = -1;\r\n                          } else j = h;\r\n                          h = i + 5 | 0;\r\n                          k = h & 65535;\r\n                          if (k << 16 >> 16 >= 40) {\r\n                              h = j;\r\n                              break a\r\n                          } else {\r\n                              i = h << 16 >> 16;\r\n                              h = j;\r\n                          }\r\n                      }\r\n                      while (1) {\r\n                          q = b[d + (i * 80 | 0) + (i << 1) >> 1] | 0;\r\n                          p = e[c + (i << 1) >> 1] | 0;\r\n                          o = t;\r\n                          h = 1;\r\n                          r = u;\r\n                          j = u;\r\n                          l = -1;\r\n                          while (1) {\r\n                              n = (e[c + (o << 1) >> 1] | 0) + p << 16 >> 16;\r\n                              n = (Z(n, n) | 0) >>> 15;\r\n                              m = (b[d + (i * 80 | 0) + (o << 1) >> 1] << 15) + 32768 + ((b[d + (o * 80 | 0) + (o << 1) >> 1] | 0) + q << 14) | 0;\r\n                              if (((Z(n << 16 >> 16, h << 16 >> 16) | 0) - (Z(m >> 16, l << 16 >> 16) | 0) << 1 | 0) > 0) {\r\n                                  h = m >>> 16 & 65535;\r\n                                  j = r;\r\n                                  l = n & 65535;\r\n                              }\r\n                              m = o + 5 | 0;\r\n                              r = m & 65535;\r\n                              if (r << 16 >> 16 >= 40) break; else o = m << 16 >> 16;\r\n                          }\r\n                          if (((Z(l << 16 >> 16, s << 16 >> 16) | 0) - (Z(h << 16 >> 16, a << 16 >> 16) | 0) << 1 | 0) > 0) {\r\n                              b[g >> 1] = k;\r\n                              b[x >> 1] = j;\r\n                              a = l;\r\n                          } else h = s;\r\n                          i = i + 5 | 0;\r\n                          k = i & 65535;\r\n                          if (k << 16 >> 16 >= 40) break; else {\r\n                              i = i << 16 >> 16;\r\n                              s = h;\r\n                          }\r\n                      }\r\n                  } while (0);\r\n                  w = w + 1 | 0;\r\n              } while ((w | 0) != 2);\r\n              return\r\n          }\r\n\r\n          function Pb(a, d, e, f, g, h, i, j) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              j = j | 0;\r\n              var k = 0, l = 0, m = 0, n = 0, o = 0, p = 0;\r\n              k = f;\r\n              l = k + 80 | 0;\r\n              do {\r\n                  b[k >> 1] = 0;\r\n                  k = k + 2 | 0;\r\n              } while ((k | 0) < (l | 0));\r\n              k = b[d >> 1] | 0;\r\n              o = (k * 6554 | 0) >>> 15;\r\n              l = o << 16 >> 16;\r\n              n = (748250 >>> ((k + (Z(l, -5) | 0) << 16 >> 16) + ((a << 16 >> 16) * 5 | 0) | 0) & 1 | 0) == 0;\r\n              m = (b[e + (k << 1) >> 1] | 0) > 0;\r\n              p = m ? 32767 : -32768;\r\n              b[f + (k << 1) >> 1] = m ? 8191 : -8192;\r\n              k = d + 2 | 0;\r\n              a = b[k >> 1] | 0;\r\n              f = f + (a << 1) | 0;\r\n              if ((b[e + (a << 1) >> 1] | 0) > 0) {\r\n                  b[f >> 1] = 8191;\r\n                  e = 32767;\r\n                  f = (m & 1 | 2) & 65535;\r\n              } else {\r\n                  b[f >> 1] = -8192;\r\n                  e = -32768;\r\n                  f = m & 1;\r\n              }\r\n              o = ((a * 6554 | 0) >>> 15 << 3) + (n ? o : l + 64 | 0) & 65535;\r\n              b[i >> 1] = f;\r\n              n = 0;\r\n              m = g + (0 - (b[d >> 1] | 0) << 1) | 0;\r\n              f = g + (0 - (b[k >> 1] | 0) << 1) | 0;\r\n              do {\r\n                  k = Z(p, b[m >> 1] | 0) | 0;\r\n                  m = m + 2 | 0;\r\n                  if ((k | 0) == 1073741824) {\r\n                      c[j >> 2] = 1;\r\n                      a = 2147483647;\r\n                  } else a = k << 1;\r\n                  l = Z(e, b[f >> 1] | 0) | 0;\r\n                  f = f + 2 | 0;\r\n                  if ((l | 0) != 1073741824) {\r\n                      k = (l << 1) + a | 0;\r\n                      if ((l ^ a | 0) > 0 & (k ^ a | 0) < 0) {\r\n                          c[j >> 2] = 1;\r\n                          k = (a >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[j >> 2] = 1;\r\n                      k = 2147483647;\r\n                  }\r\n                  b[h + (n << 1) >> 1] = Ce(k, j) | 0;\r\n                  n = n + 1 | 0;\r\n              } while ((n | 0) != 40);\r\n              return o | 0\r\n          }\r\n\r\n          function Qb(a, d, f, g, h, j, k, l) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              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,\r\n                  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,\r\n                  Q = 0, R = 0, S = 0, T = 0, U = 0;\r\n              U = i;\r\n              i = i + 3440 | 0;\r\n              M = U + 3360 | 0;\r\n              N = U + 3280 | 0;\r\n              P = U + 3200 | 0;\r\n              O = U;\r\n              R = (g & 65535) << 17;\r\n              T = f << 16 >> 16;\r\n              Q = f << 16 >> 16 < 40;\r\n              if (Q) {\r\n                  f = R >> 16;\r\n                  m = T;\r\n                  do {\r\n                      g = (Z(b[d + (m - T << 1) >> 1] | 0, f) | 0) >> 15;\r\n                      if ((g | 0) > 32767) {\r\n                          c[l >> 2] = 1;\r\n                          g = 32767;\r\n                      }\r\n                      L = d + (m << 1) | 0;\r\n                      b[L >> 1] = Rd(b[L >> 1] | 0, g & 65535, l) | 0;\r\n                      m = m + 1 | 0;\r\n                  } while ((m & 65535) << 16 >> 16 != 40)\r\n              }\r\n              hc(d, a, M, 1, l);\r\n              qd(M, P, N, 6);\r\n              fc(d, P, O, l);\r\n              L = 1;\r\n              n = 2;\r\n              o = 1;\r\n              g = 0;\r\n              m = 1;\r\n              a = -1;\r\n              p = 1;\r\n              while (1) {\r\n                  K = 2;\r\n                  s = 2;\r\n                  while (1) {\r\n                      H = 0;\r\n                      I = 0;\r\n                      J = p;\r\n                      G = s;\r\n                      while (1) {\r\n                          if (I << 16 >> 16 < 40) {\r\n                              C = J << 16 >> 16;\r\n                              D = J << 16 >> 16 < 40;\r\n                              E = G << 16 >> 16;\r\n                              F = G << 16 >> 16 < 40;\r\n                              A = I << 16 >> 16;\r\n                              B = I;\r\n                              while (1) {\r\n                                  if ((b[N + (A << 1) >> 1] | 0) > -1) {\r\n                                      x = b[O + (A * 80 | 0) + (A << 1) >> 1] | 0;\r\n                                      if (D) {\r\n                                          y = e[M + (A << 1) >> 1] | 0;\r\n                                          w = C;\r\n                                          r = 1;\r\n                                          z = J;\r\n                                          f = J;\r\n                                          s = 0;\r\n                                          q = -1;\r\n                                          while (1) {\r\n                                              u = (e[M + (w << 1) >> 1] | 0) + y | 0;\r\n                                              v = u << 16 >> 16;\r\n                                              v = (Z(v, v) | 0) >>> 15;\r\n                                              t = (b[O + (A * 80 | 0) + (w << 1) >> 1] << 15) + 32768 + ((b[O + (w * 80 | 0) + (w << 1) >> 1] | 0) + x << 14) | 0;\r\n                                              if (((Z(v << 16 >> 16, r << 16 >> 16) | 0) - (Z(t >> 16, q << 16 >> 16) | 0) << 1 | 0) > 0) {\r\n                                                  r = t >>> 16 & 65535;\r\n                                                  f = z;\r\n                                                  s = u & 65535;\r\n                                                  q = v & 65535;\r\n                                              }\r\n                                              t = w + 5 | 0;\r\n                                              z = t & 65535;\r\n                                              if (z << 16 >> 16 >= 40) break; else w = t << 16 >> 16;\r\n                                          }\r\n                                      } else {\r\n                                          r = 1;\r\n                                          f = J;\r\n                                          s = 0;\r\n                                      }\r\n                                      if (F) {\r\n                                          y = s & 65535;\r\n                                          z = f << 16 >> 16;\r\n                                          w = (r << 16 >> 16 << 14) + 32768 | 0;\r\n                                          v = E;\r\n                                          s = 1;\r\n                                          x = G;\r\n                                          q = G;\r\n                                          r = -1;\r\n                                          while (1) {\r\n                                              u = (e[M + (v << 1) >> 1] | 0) + y << 16 >> 16;\r\n                                              u = (Z(u, u) | 0) >>> 15;\r\n                                              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;\r\n                                              if (((Z(u << 16 >> 16, s << 16 >> 16) | 0) - (Z(t >> 16, r << 16 >> 16) | 0) << 1 | 0) > 0) {\r\n                                                  s = t >>> 16 & 65535;\r\n                                                  q = x;\r\n                                                  r = u & 65535;\r\n                                              }\r\n                                              t = v + 5 | 0;\r\n                                              x = t & 65535;\r\n                                              if (x << 16 >> 16 >= 40) {\r\n                                                  w = s;\r\n                                                  v = r;\r\n                                                  break\r\n                                              } else v = t << 16 >> 16;\r\n                                          }\r\n                                      } else {\r\n                                          w = 1;\r\n                                          q = G;\r\n                                          v = -1;\r\n                                      }\r\n                                      s = Z(v << 16 >> 16, m << 16 >> 16) | 0;\r\n                                      if ((s | 0) == 1073741824) {\r\n                                          c[l >> 2] = 1;\r\n                                          t = 2147483647;\r\n                                      } else t = s << 1;\r\n                                      s = Z(w << 16 >> 16, a << 16 >> 16) | 0;\r\n                                      if ((s | 0) == 1073741824) {\r\n                                          c[l >> 2] = 1;\r\n                                          r = 2147483647;\r\n                                      } else r = s << 1;\r\n                                      s = t - r | 0;\r\n                                      if (((s ^ t) & (r ^ t) | 0) < 0) {\r\n                                          c[l >> 2] = 1;\r\n                                          s = (t >>> 31) + 2147483647 | 0;\r\n                                      }\r\n                                      z = (s | 0) > 0;\r\n                                      n = z ? q : n;\r\n                                      o = z ? f : o;\r\n                                      g = z ? B : g;\r\n                                      m = z ? w : m;\r\n                                      a = z ? v : a;\r\n                                  }\r\n                                  s = A + 5 | 0;\r\n                                  B = s & 65535;\r\n                                  if (B << 16 >> 16 >= 40) break; else A = s << 16 >> 16;\r\n                              }\r\n                          }\r\n                          H = H + 1 << 16 >> 16;\r\n                          if (H << 16 >> 16 >= 3) break; else {\r\n                              F = G;\r\n                              G = J;\r\n                              J = I;\r\n                              I = F;\r\n                          }\r\n                      }\r\n                      f = K + 2 | 0;\r\n                      s = f & 65535;\r\n                      if (s << 16 >> 16 >= 5) break; else K = f & 65535;\r\n                  }\r\n                  f = L + 2 | 0;\r\n                  p = f & 65535;\r\n                  if (p << 16 >> 16 < 4) L = f & 65535; else {\r\n                      s = n;\r\n                      n = o;\r\n                      break\r\n                  }\r\n              }\r\n              f = h;\r\n              m = f + 80 | 0;\r\n              do {\r\n                  b[f >> 1] = 0;\r\n                  f = f + 2 | 0;\r\n              } while ((f | 0) < (m | 0));\r\n              v = g << 16 >> 16;\r\n              a = b[P + (v << 1) >> 1] | 0;\r\n              g = (v * 6554 | 0) >>> 15;\r\n              f = g << 16;\r\n              m = v - (((f >> 16) * 327680 | 0) >>> 16) | 0;\r\n              switch (m << 16 >> 16 | 0) {\r\n                  case 1: {\r\n                      g = f >> 12;\r\n                      break\r\n                  }\r\n                  case 2: {\r\n                      g = f >> 8;\r\n                      m = 2;\r\n                      break\r\n                  }\r\n                  case 3: {\r\n                      g = g << 20 >> 16 | 8;\r\n                      m = 1;\r\n                      break\r\n                  }\r\n                  case 4: {\r\n                      g = g << 24 >> 16 | 128;\r\n                      m = 2;\r\n                      break\r\n                  }\r\n                  default: {\r\n                  }\r\n              }\r\n              f = h + (v << 1) | 0;\r\n              if (a << 16 >> 16 > 0) {\r\n                  b[f >> 1] = 8191;\r\n                  z = 32767;\r\n                  o = 65536 << (m << 16 >> 16) >>> 16 & 65535;\r\n              } else {\r\n                  b[f >> 1] = -8192;\r\n                  z = -32768;\r\n                  o = 0;\r\n              }\r\n              t = n << 16 >> 16;\r\n              n = b[P + (t << 1) >> 1] | 0;\r\n              f = (t * 6554 | 0) >>> 15;\r\n              m = f << 16;\r\n              a = t - (((m >> 16) * 327680 | 0) >>> 16) | 0;\r\n              switch (a << 16 >> 16 | 0) {\r\n                  case 1: {\r\n                      f = m >> 12;\r\n                      break\r\n                  }\r\n                  case 2: {\r\n                      f = m >> 8;\r\n                      a = 2;\r\n                      break\r\n                  }\r\n                  case 3: {\r\n                      f = f << 20 >> 16 | 8;\r\n                      a = 1;\r\n                      break\r\n                  }\r\n                  case 4: {\r\n                      f = f << 24 >> 16 | 128;\r\n                      a = 2;\r\n                      break\r\n                  }\r\n                  default: {\r\n                  }\r\n              }\r\n              m = h + (t << 1) | 0;\r\n              if (n << 16 >> 16 > 0) {\r\n                  b[m >> 1] = 8191;\r\n                  u = 32767;\r\n                  o = (65536 << (a << 16 >> 16) >>> 16) + (o & 65535) & 65535;\r\n              } else {\r\n                  b[m >> 1] = -8192;\r\n                  u = -32768;\r\n              }\r\n              p = f + g | 0;\r\n              r = s << 16 >> 16;\r\n              n = b[P + (r << 1) >> 1] | 0;\r\n              g = (r * 6554 | 0) >>> 15;\r\n              f = g << 16;\r\n              m = r - (((f >> 16) * 327680 | 0) >>> 16) | 0;\r\n              switch (m << 16 >> 16 | 0) {\r\n                  case 1: {\r\n                      f = f >> 12;\r\n                      break\r\n                  }\r\n                  case 2: {\r\n                      f = f >> 8;\r\n                      m = 2;\r\n                      break\r\n                  }\r\n                  case 3: {\r\n                      f = g << 20 >> 16 | 8;\r\n                      m = 1;\r\n                      break\r\n                  }\r\n                  case 4: {\r\n                      f = g << 24 >> 16 | 128;\r\n                      m = 2;\r\n                      break\r\n                  }\r\n                  default:\r\n                      f = g;\r\n              }\r\n              g = h + (r << 1) | 0;\r\n              if (n << 16 >> 16 > 0) {\r\n                  b[g >> 1] = 8191;\r\n                  s = 32767;\r\n                  g = (65536 << (m << 16 >> 16) >>> 16) + (o & 65535) & 65535;\r\n              } else {\r\n                  b[g >> 1] = -8192;\r\n                  s = -32768;\r\n                  g = o;\r\n              }\r\n              q = p + f | 0;\r\n              b[k >> 1] = g;\r\n              o = 0;\r\n              p = d + (0 - v << 1) | 0;\r\n              a = d + (0 - t << 1) | 0;\r\n              n = d + (0 - r << 1) | 0;\r\n              do {\r\n                  g = Z(b[p >> 1] | 0, z) | 0;\r\n                  p = p + 2 | 0;\r\n                  if ((g | 0) != 1073741824 ? (S = g << 1, !((g | 0) > 0 & (S | 0) < 0)) : 0) m = S; else {\r\n                      c[l >> 2] = 1;\r\n                      m = 2147483647;\r\n                  }\r\n                  g = Z(b[a >> 1] | 0, u) | 0;\r\n                  a = a + 2 | 0;\r\n                  if ((g | 0) != 1073741824) {\r\n                      f = (g << 1) + m | 0;\r\n                      if ((g ^ m | 0) > 0 & (f ^ m | 0) < 0) {\r\n                          c[l >> 2] = 1;\r\n                          f = (m >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[l >> 2] = 1;\r\n                      f = 2147483647;\r\n                  }\r\n                  m = Z(b[n >> 1] | 0, s) | 0;\r\n                  n = n + 2 | 0;\r\n                  if ((m | 0) != 1073741824) {\r\n                      g = (m << 1) + f | 0;\r\n                      if ((m ^ f | 0) > 0 & (g ^ f | 0) < 0) {\r\n                          c[l >> 2] = 1;\r\n                          g = (f >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[l >> 2] = 1;\r\n                      g = 2147483647;\r\n                  }\r\n                  b[j + (o << 1) >> 1] = Ce(g, l) | 0;\r\n                  o = o + 1 | 0;\r\n              } while ((o | 0) != 40);\r\n              g = q & 65535;\r\n              if (!Q) {\r\n                  i = U;\r\n                  return g | 0\r\n              }\r\n              m = R >> 16;\r\n              f = T;\r\n              do {\r\n                  a = (Z(b[h + (f - T << 1) >> 1] | 0, m) | 0) >> 15;\r\n                  if ((a | 0) > 32767) {\r\n                      c[l >> 2] = 1;\r\n                      a = 32767;\r\n                  }\r\n                  j = h + (f << 1) | 0;\r\n                  b[j >> 1] = Rd(b[j >> 1] | 0, a & 65535, l) | 0;\r\n                  f = f + 1 | 0;\r\n              } while ((f & 65535) << 16 >> 16 != 40);\r\n              i = U;\r\n              return g | 0\r\n          }\r\n\r\n          function Rb(a, d, f, g, h, j, k, l, m) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              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,\r\n                  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\n                  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;\r\n              da = i;\r\n              i = i + 3456 | 0;\r\n              _ = da + 3448 | 0;\r\n              X = da + 3360 | 0;\r\n              U = da + 3368 | 0;\r\n              V = da + 3280 | 0;\r\n              Y = da + 3200 | 0;\r\n              W = da;\r\n              aa = (g & 65535) << 17;\r\n              ca = f << 16 >> 16;\r\n              $ = f << 16 >> 16 < 40;\r\n              if ($) {\r\n                  f = aa >> 16;\r\n                  n = ca;\r\n                  do {\r\n                      g = (Z(b[d + (n - ca << 1) >> 1] | 0, f) | 0) >> 15;\r\n                      if ((g | 0) > 32767) {\r\n                          c[m >> 2] = 1;\r\n                          g = 32767;\r\n                      }\r\n                      T = d + (n << 1) | 0;\r\n                      b[T >> 1] = Rd(b[T >> 1] | 0, g & 65535, m) | 0;\r\n                      n = n + 1 | 0;\r\n                  } while ((n & 65535) << 16 >> 16 != 40)\r\n              }\r\n              hc(d, a, U, 1, m);\r\n              qd(U, Y, V, 4);\r\n              fc(d, Y, W, m);\r\n              R = X + 2 | 0;\r\n              b[X >> 1] = 0;\r\n              S = X + 4 | 0;\r\n              b[R >> 1] = 1;\r\n              T = X + 6 | 0;\r\n              b[S >> 1] = 2;\r\n              b[T >> 1] = 3;\r\n              r = 3;\r\n              p = 2;\r\n              o = 1;\r\n              g = 0;\r\n              f = 1;\r\n              n = -1;\r\n              q = 3;\r\n              do {\r\n                  M = 0;\r\n                  N = 0;\r\n                  O = q;\r\n                  P = 1;\r\n                  Q = 2;\r\n                  while (1) {\r\n                      if (N << 16 >> 16 < 40) {\r\n                          G = P << 16 >> 16;\r\n                          H = P << 16 >> 16 < 40;\r\n                          I = Q << 16 >> 16;\r\n                          J = Q << 16 >> 16 < 40;\r\n                          K = O << 16 >> 16;\r\n                          L = O << 16 >> 16 < 40;\r\n                          F = N << 16 >> 16;\r\n                          E = p;\r\n                          C = o;\r\n                          B = f;\r\n                          D = N;\r\n                          while (1) {\r\n                              if ((b[V + (F << 1) >> 1] | 0) > -1) {\r\n                                  t = b[W + (F * 80 | 0) + (F << 1) >> 1] | 0;\r\n                                  if (H) {\r\n                                      s = e[U + (F << 1) >> 1] | 0;\r\n                                      u = G;\r\n                                      z = 1;\r\n                                      p = P;\r\n                                      o = P;\r\n                                      x = 0;\r\n                                      y = -1;\r\n                                      while (1) {\r\n                                          w = (e[U + (u << 1) >> 1] | 0) + s | 0;\r\n                                          v = w << 16 >> 16;\r\n                                          v = (Z(v, v) | 0) >>> 15;\r\n                                          A = (b[W + (F * 80 | 0) + (u << 1) >> 1] << 15) + 32768 + ((b[W + (u * 80 | 0) + (u << 1) >> 1] | 0) + t << 14) | 0;\r\n                                          if (((Z(v << 16 >> 16, z << 16 >> 16) | 0) - (Z(A >> 16, y << 16 >> 16) | 0) << 1 | 0) > 0) {\r\n                                              z = A >>> 16 & 65535;\r\n                                              o = p;\r\n                                              x = w & 65535;\r\n                                              y = v & 65535;\r\n                                          }\r\n                                          A = u + 5 | 0;\r\n                                          p = A & 65535;\r\n                                          if (p << 16 >> 16 >= 40) break; else u = A << 16 >> 16;\r\n                                      }\r\n                                  } else {\r\n                                      z = 1;\r\n                                      o = P;\r\n                                      x = 0;\r\n                                  }\r\n                                  if (J) {\r\n                                      f = x & 65535;\r\n                                      a = o << 16 >> 16;\r\n                                      t = (z << 16 >> 16 << 14) + 32768 | 0;\r\n                                      u = I;\r\n                                      A = 1;\r\n                                      s = Q;\r\n                                      p = Q;\r\n                                      y = 0;\r\n                                      x = -1;\r\n                                      while (1) {\r\n                                          w = (e[U + (u << 1) >> 1] | 0) + f | 0;\r\n                                          v = w << 16 >> 16;\r\n                                          v = (Z(v, v) | 0) >>> 15;\r\n                                          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;\r\n                                          if (((Z(v << 16 >> 16, A << 16 >> 16) | 0) - (Z(z >> 16, x << 16 >> 16) | 0) << 1 | 0) > 0) {\r\n                                              A = z >>> 16 & 65535;\r\n                                              p = s;\r\n                                              y = w & 65535;\r\n                                              x = v & 65535;\r\n                                          }\r\n                                          z = u + 5 | 0;\r\n                                          s = z & 65535;\r\n                                          if (s << 16 >> 16 >= 40) break; else u = z << 16 >> 16;\r\n                                      }\r\n                                  } else {\r\n                                      A = 1;\r\n                                      p = Q;\r\n                                      y = 0;\r\n                                  }\r\n                                  if (L) {\r\n                                      t = y & 65535;\r\n                                      s = p << 16 >> 16;\r\n                                      a = o << 16 >> 16;\r\n                                      v = (A & 65535) << 16 | 32768;\r\n                                      w = K;\r\n                                      f = 1;\r\n                                      u = O;\r\n                                      z = O;\r\n                                      A = -1;\r\n                                      while (1) {\r\n                                          x = (e[U + (w << 1) >> 1] | 0) + t << 16 >> 16;\r\n                                          x = (Z(x, x) | 0) >>> 15;\r\n                                          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;\r\n                                          if (((Z(x << 16 >> 16, f << 16 >> 16) | 0) - (Z(y >> 16, A << 16 >> 16) | 0) << 1 | 0) > 0) {\r\n                                              f = y >>> 16 & 65535;\r\n                                              z = u;\r\n                                              A = x & 65535;\r\n                                          }\r\n                                          y = w + 5 | 0;\r\n                                          u = y & 65535;\r\n                                          if (u << 16 >> 16 >= 40) break; else w = y << 16 >> 16;\r\n                                      }\r\n                                  } else {\r\n                                      f = 1;\r\n                                      z = O;\r\n                                      A = -1;\r\n                                  }\r\n                                  if (((Z(A << 16 >> 16, B << 16 >> 16) | 0) - (Z(f << 16 >> 16, n << 16 >> 16) | 0) << 1 | 0) > 0) {\r\n                                      b[X >> 1] = D;\r\n                                      b[R >> 1] = o;\r\n                                      b[S >> 1] = p;\r\n                                      b[T >> 1] = z;\r\n                                      r = z;\r\n                                      g = D;\r\n                                      n = A;\r\n                                  } else {\r\n                                      p = E;\r\n                                      o = C;\r\n                                      f = B;\r\n                                  }\r\n                              } else {\r\n                                  p = E;\r\n                                  o = C;\r\n                                  f = B;\r\n                              }\r\n                              w = F + 5 | 0;\r\n                              D = w & 65535;\r\n                              if (D << 16 >> 16 >= 40) break; else {\r\n                                  F = w << 16 >> 16;\r\n                                  E = p;\r\n                                  C = o;\r\n                                  B = f;\r\n                              }\r\n                          }\r\n                      }\r\n                      M = M + 1 << 16 >> 16;\r\n                      if (M << 16 >> 16 >= 4) break; else {\r\n                          K = Q;\r\n                          L = O;\r\n                          Q = P;\r\n                          P = N;\r\n                          O = K;\r\n                          N = L;\r\n                      }\r\n                  }\r\n                  q = q + 1 << 16 >> 16;\r\n              } while (q << 16 >> 16 < 5);\r\n              A = r;\r\n              z = p;\r\n              y = o;\r\n              x = g;\r\n              g = h;\r\n              f = g + 80 | 0;\r\n              do {\r\n                  b[g >> 1] = 0;\r\n                  g = g + 2 | 0;\r\n              } while ((g | 0) < (f | 0));\r\n              a = x;\r\n              f = 0;\r\n              n = 0;\r\n              g = 0;\r\n              while (1) {\r\n                  p = a << 16 >> 16;\r\n                  q = b[Y + (p << 1) >> 1] | 0;\r\n                  a = p * 13108 >> 16;\r\n                  o = p - ((a * 327680 | 0) >>> 16) | 0;\r\n                  a = b[l + (a << 1) >> 1] | 0;\r\n                  switch (o << 16 >> 16 | 0) {\r\n                      case 1: {\r\n                          r = a << 16 >> 16 << 3 & 65535;\r\n                          break\r\n                      }\r\n                      case 2: {\r\n                          r = a << 16 >> 16 << 6 & 65535;\r\n                          break\r\n                      }\r\n                      case 3: {\r\n                          r = a << 16 >> 16 << 10 & 65535;\r\n                          break\r\n                      }\r\n                      case 4: {\r\n                          r = ((a & 65535) << 10 | 512) & 65535;\r\n                          o = 3;\r\n                          break\r\n                      }\r\n                      default:\r\n                          r = a;\r\n                  }\r\n                  a = h + (p << 1) | 0;\r\n                  if (q << 16 >> 16 > 0) {\r\n                      b[a >> 1] = 8191;\r\n                      a = 32767;\r\n                      g = (65536 << (o << 16 >> 16) >>> 16) + (g & 65535) & 65535;\r\n                  } else {\r\n                      b[a >> 1] = -8192;\r\n                      a = -32768;\r\n                  }\r\n                  b[_ + (f << 1) >> 1] = a;\r\n                  n = (r & 65535) + (n & 65535) | 0;\r\n                  f = f + 1 | 0;\r\n                  if ((f | 0) == 4) {\r\n                      w = n;\r\n                      break\r\n                  }\r\n                  a = b[X + (f << 1) >> 1] | 0;\r\n              }\r\n              b[k >> 1] = g;\r\n              t = _ + 2 | 0;\r\n              u = _ + 4 | 0;\r\n              v = _ + 6 | 0;\r\n              a = b[_ >> 1] | 0;\r\n              s = 0;\r\n              o = d + (0 - (x << 16 >> 16) << 1) | 0;\r\n              p = d + (0 - (y << 16 >> 16) << 1) | 0;\r\n              q = d + (0 - (z << 16 >> 16) << 1) | 0;\r\n              r = d + (0 - (A << 16 >> 16) << 1) | 0;\r\n              do {\r\n                  g = Z(b[o >> 1] | 0, a) | 0;\r\n                  o = o + 2 | 0;\r\n                  if ((g | 0) != 1073741824 ? (ba = g << 1, !((g | 0) > 0 & (ba | 0) < 0)) : 0) n = ba; else {\r\n                      c[m >> 2] = 1;\r\n                      n = 2147483647;\r\n                  }\r\n                  g = Z(b[t >> 1] | 0, b[p >> 1] | 0) | 0;\r\n                  p = p + 2 | 0;\r\n                  if ((g | 0) != 1073741824) {\r\n                      f = (g << 1) + n | 0;\r\n                      if ((g ^ n | 0) > 0 & (f ^ n | 0) < 0) {\r\n                          c[m >> 2] = 1;\r\n                          f = (n >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[m >> 2] = 1;\r\n                      f = 2147483647;\r\n                  }\r\n                  g = Z(b[u >> 1] | 0, b[q >> 1] | 0) | 0;\r\n                  q = q + 2 | 0;\r\n                  if ((g | 0) != 1073741824) {\r\n                      n = (g << 1) + f | 0;\r\n                      if ((g ^ f | 0) > 0 & (n ^ f | 0) < 0) {\r\n                          c[m >> 2] = 1;\r\n                          n = (f >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[m >> 2] = 1;\r\n                      n = 2147483647;\r\n                  }\r\n                  f = Z(b[v >> 1] | 0, b[r >> 1] | 0) | 0;\r\n                  r = r + 2 | 0;\r\n                  if ((f | 0) != 1073741824) {\r\n                      g = (f << 1) + n | 0;\r\n                      if ((f ^ n | 0) > 0 & (g ^ n | 0) < 0) {\r\n                          c[m >> 2] = 1;\r\n                          g = (n >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[m >> 2] = 1;\r\n                      g = 2147483647;\r\n                  }\r\n                  b[j + (s << 1) >> 1] = Ce(g, m) | 0;\r\n                  s = s + 1 | 0;\r\n              } while ((s | 0) != 40);\r\n              g = w & 65535;\r\n              if (((ca << 16) + -2621440 | 0) > -1 | $ ^ 1) {\r\n                  i = da;\r\n                  return g | 0\r\n              }\r\n              n = aa >> 16;\r\n              f = ca;\r\n              do {\r\n                  a = (Z(b[h + (f - ca << 1) >> 1] | 0, n) | 0) >> 15;\r\n                  if ((a | 0) > 32767) {\r\n                      c[m >> 2] = 1;\r\n                      a = 32767;\r\n                  }\r\n                  j = h + (f << 1) | 0;\r\n                  b[j >> 1] = Rd(b[j >> 1] | 0, a & 65535, m) | 0;\r\n                  f = f + 1 | 0;\r\n              } while ((f & 65535) << 16 >> 16 != 40);\r\n              i = da;\r\n              return g | 0\r\n          }\r\n\r\n          function Sb(a, d, f, g, h, j, k) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              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,\r\n                  A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0;\r\n              L = i;\r\n              i = i + 3440 | 0;\r\n              t = L + 3424 | 0;\r\n              G = L + 3408 | 0;\r\n              H = L + 3240 | 0;\r\n              u = L + 3224 | 0;\r\n              E = L + 3328 | 0;\r\n              s = L + 3248 | 0;\r\n              F = L + 24 | 0;\r\n              K = L + 16 | 0;\r\n              J = L;\r\n              gc(f, a, E, 2, 4, 4, k);\r\n              rd(E, d, s, H, 4, G, 4, k);\r\n              fc(f, s, F, k);\r\n              pd(8, 4, 4, E, F, G, H, u, k);\r\n              d = g;\r\n              a = d + 80 | 0;\r\n              do {\r\n                  b[d >> 1] = 0;\r\n                  d = d + 2 | 0;\r\n              } while ((d | 0) < (a | 0));\r\n              b[J >> 1] = -1;\r\n              b[K >> 1] = -1;\r\n              C = J + 2 | 0;\r\n              b[C >> 1] = -1;\r\n              D = K + 2 | 0;\r\n              b[D >> 1] = -1;\r\n              E = J + 4 | 0;\r\n              b[E >> 1] = -1;\r\n              F = K + 4 | 0;\r\n              b[F >> 1] = -1;\r\n              H = J + 6 | 0;\r\n              b[H >> 1] = -1;\r\n              G = K + 6 | 0;\r\n              b[G >> 1] = -1;\r\n              q = 0;\r\n              do {\r\n                  o = b[u + (q << 1) >> 1] | 0;\r\n                  d = o >>> 2;\r\n                  m = d & 65535;\r\n                  a = o & 3;\r\n                  n = (b[s + (o << 1) >> 1] | 0) > 0;\r\n                  o = g + (o << 1) | 0;\r\n                  r = n & 1 ^ 1;\r\n                  b[o >> 1] = (e[o >> 1] | 0) + (n ? 8191 : 57345);\r\n                  b[t + (q << 1) >> 1] = n ? 32767 : -32768;\r\n                  n = J + (a << 1) | 0;\r\n                  o = b[n >> 1] | 0;\r\n                  do if (o << 16 >> 16 >= 0) {\r\n                      p = K + (a << 1) | 0;\r\n                      l = (o << 16 >> 16 | 0) <= (d << 16 >> 16 | 0);\r\n                      d = J + ((a | 4) << 1) | 0;\r\n                      if ((r & 65535 | 0) == (e[p >> 1] & 1 | 0)) if (l) {\r\n                          b[d >> 1] = m;\r\n                          break\r\n                      } else {\r\n                          b[d >> 1] = o;\r\n                          b[n >> 1] = m;\r\n                          b[p >> 1] = r;\r\n                          break\r\n                      } else if (l) {\r\n                          b[d >> 1] = o;\r\n                          b[n >> 1] = m;\r\n                          b[p >> 1] = r;\r\n                          break\r\n                      } else {\r\n                          b[d >> 1] = m;\r\n                          break\r\n                      }\r\n                  } else {\r\n                      b[n >> 1] = m;\r\n                      b[K + (a << 1) >> 1] = r;\r\n                  } while (0);\r\n                  q = q + 1 | 0;\r\n              } while ((q | 0) != 8);\r\n              v = t + 2 | 0;\r\n              w = t + 4 | 0;\r\n              x = t + 6 | 0;\r\n              y = t + 8 | 0;\r\n              z = t + 10 | 0;\r\n              A = t + 12 | 0;\r\n              B = t + 14 | 0;\r\n              t = b[t >> 1] | 0;\r\n              q = 0;\r\n              p = f + (0 - (b[u >> 1] | 0) << 1) | 0;\r\n              o = f + (0 - (b[u + 2 >> 1] | 0) << 1) | 0;\r\n              n = f + (0 - (b[u + 4 >> 1] | 0) << 1) | 0;\r\n              m = f + (0 - (b[u + 6 >> 1] | 0) << 1) | 0;\r\n              d = f + (0 - (b[u + 8 >> 1] | 0) << 1) | 0;\r\n              a = f + (0 - (b[u + 10 >> 1] | 0) << 1) | 0;\r\n              l = f + (0 - (b[u + 12 >> 1] | 0) << 1) | 0;\r\n              f = f + (0 - (b[u + 14 >> 1] | 0) << 1) | 0;\r\n              do {\r\n                  r = Z(b[p >> 1] | 0, t) | 0;\r\n                  p = p + 2 | 0;\r\n                  if ((r | 0) != 1073741824 ? (I = r << 1, !((r | 0) > 0 & (I | 0) < 0)) : 0) r = I; else {\r\n                      c[k >> 2] = 1;\r\n                      r = 2147483647;\r\n                  }\r\n                  s = Z(b[v >> 1] | 0, b[o >> 1] | 0) | 0;\r\n                  o = o + 2 | 0;\r\n                  if ((s | 0) != 1073741824) {\r\n                      g = (s << 1) + r | 0;\r\n                      if ((s ^ r | 0) > 0 & (g ^ r | 0) < 0) {\r\n                          c[k >> 2] = 1;\r\n                          r = (r >>> 31) + 2147483647 | 0;\r\n                      } else r = g;\r\n                  } else {\r\n                      c[k >> 2] = 1;\r\n                      r = 2147483647;\r\n                  }\r\n                  s = Z(b[w >> 1] | 0, b[n >> 1] | 0) | 0;\r\n                  n = n + 2 | 0;\r\n                  if ((s | 0) != 1073741824) {\r\n                      g = (s << 1) + r | 0;\r\n                      if ((s ^ r | 0) > 0 & (g ^ r | 0) < 0) {\r\n                          c[k >> 2] = 1;\r\n                          g = (r >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[k >> 2] = 1;\r\n                      g = 2147483647;\r\n                  }\r\n                  s = Z(b[x >> 1] | 0, b[m >> 1] | 0) | 0;\r\n                  m = m + 2 | 0;\r\n                  if ((s | 0) != 1073741824) {\r\n                      r = (s << 1) + g | 0;\r\n                      if ((s ^ g | 0) > 0 & (r ^ g | 0) < 0) {\r\n                          c[k >> 2] = 1;\r\n                          r = (g >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[k >> 2] = 1;\r\n                      r = 2147483647;\r\n                  }\r\n                  s = Z(b[y >> 1] | 0, b[d >> 1] | 0) | 0;\r\n                  d = d + 2 | 0;\r\n                  if ((s | 0) != 1073741824) {\r\n                      g = (s << 1) + r | 0;\r\n                      if ((s ^ r | 0) > 0 & (g ^ r | 0) < 0) {\r\n                          c[k >> 2] = 1;\r\n                          g = (r >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[k >> 2] = 1;\r\n                      g = 2147483647;\r\n                  }\r\n                  s = Z(b[z >> 1] | 0, b[a >> 1] | 0) | 0;\r\n                  a = a + 2 | 0;\r\n                  if ((s | 0) != 1073741824) {\r\n                      r = (s << 1) + g | 0;\r\n                      if ((s ^ g | 0) > 0 & (r ^ g | 0) < 0) {\r\n                          c[k >> 2] = 1;\r\n                          r = (g >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[k >> 2] = 1;\r\n                      r = 2147483647;\r\n                  }\r\n                  s = Z(b[A >> 1] | 0, b[l >> 1] | 0) | 0;\r\n                  l = l + 2 | 0;\r\n                  if ((s | 0) != 1073741824) {\r\n                      g = (s << 1) + r | 0;\r\n                      if ((s ^ r | 0) > 0 & (g ^ r | 0) < 0) {\r\n                          c[k >> 2] = 1;\r\n                          g = (r >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[k >> 2] = 1;\r\n                      g = 2147483647;\r\n                  }\r\n                  s = Z(b[B >> 1] | 0, b[f >> 1] | 0) | 0;\r\n                  f = f + 2 | 0;\r\n                  if ((s | 0) != 1073741824) {\r\n                      r = (s << 1) + g | 0;\r\n                      if ((s ^ g | 0) > 0 & (r ^ g | 0) < 0) {\r\n                          c[k >> 2] = 1;\r\n                          r = (g >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[k >> 2] = 1;\r\n                      r = 2147483647;\r\n                  }\r\n                  b[h + (q << 1) >> 1] = Ce(r, k) | 0;\r\n                  q = q + 1 | 0;\r\n              } while ((q | 0) != 40);\r\n              b[j >> 1] = b[K >> 1] | 0;\r\n              b[j + 2 >> 1] = b[D >> 1] | 0;\r\n              b[j + 4 >> 1] = b[F >> 1] | 0;\r\n              b[j + 6 >> 1] = b[G >> 1] | 0;\r\n              a = b[J >> 1] | 0;\r\n              d = b[J + 8 >> 1] | 0;\r\n              l = b[C >> 1] | 0;\r\n              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;\r\n              l = b[E >> 1] | 0;\r\n              a = b[J + 12 >> 1] | 0;\r\n              d = b[J + 10 >> 1] | 0;\r\n              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;\r\n              d = b[J + 14 >> 1] | 0;\r\n              l = b[H >> 1] | 0;\r\n              a = l << 16 >> 16 >>> 1;\r\n              if (!(d & 2)) {\r\n                  h = a;\r\n                  k = d << 16 >> 16;\r\n                  K = k >> 1;\r\n                  K = K * 327680 | 0;\r\n                  h = h << 16;\r\n                  K = h + K | 0;\r\n                  K = K << 5;\r\n                  K = K >> 16;\r\n                  K = K | 12;\r\n                  K = K * 2622 | 0;\r\n                  K = K >>> 16;\r\n                  h = l & 65535;\r\n                  h = h & 1;\r\n                  k = k << 17;\r\n                  k = k & 131072;\r\n                  K = K << 18;\r\n                  k = K | k;\r\n                  k = k >>> 16;\r\n                  h = k | h;\r\n                  h = h & 65535;\r\n                  j = j + 12 | 0;\r\n                  b[j >> 1] = h;\r\n                  i = L;\r\n                  return\r\n              }\r\n              h = 4 - (a << 16 >> 16) | 0;\r\n              k = d << 16 >> 16;\r\n              K = k >> 1;\r\n              K = K * 327680 | 0;\r\n              h = h << 16;\r\n              K = h + K | 0;\r\n              K = K << 5;\r\n              K = K >> 16;\r\n              K = K | 12;\r\n              K = K * 2622 | 0;\r\n              K = K >>> 16;\r\n              h = l & 65535;\r\n              h = h & 1;\r\n              k = k << 17;\r\n              k = k & 131072;\r\n              K = K << 18;\r\n              k = K | k;\r\n              k = k >>> 16;\r\n              h = k | h;\r\n              h = h & 65535;\r\n              j = j + 12 | 0;\r\n              b[j >> 1] = h;\r\n              i = L;\r\n              return\r\n          }\r\n\r\n          function Tb(a, d, e, f, g) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              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\n              r = e << 16 >> 16;\r\n              h = 0 - r | 0;\r\n              e = g + (h << 2) | 0;\r\n              g = ((r - (f << 16 >> 16) | 0) >>> 2) + 1 & 65535;\r\n              if (g << 16 >> 16 <= 0) return;\r\n              r = d << 16 >> 16 >>> 1 & 65535;\r\n              if (!(r << 16 >> 16)) {\r\n                  while (1) {\r\n                      c[e >> 2] = 0;\r\n                      c[e + 4 >> 2] = 0;\r\n                      c[e + 8 >> 2] = 0;\r\n                      c[e + 12 >> 2] = 0;\r\n                      if (g << 16 >> 16 > 1) {\r\n                          e = e + 16 | 0;\r\n                          g = g + -1 << 16 >> 16;\r\n                      } else break\r\n                  }\r\n                  return\r\n              }\r\n              q = a + (h << 1) | 0;\r\n              while (1) {\r\n                  l = q + 4 | 0;\r\n                  n = b[l >> 1] | 0;\r\n                  j = b[q >> 1] | 0;\r\n                  m = n;\r\n                  k = r;\r\n                  o = a;\r\n                  p = q;\r\n                  q = q + 8 | 0;\r\n                  i = 0;\r\n                  h = 0;\r\n                  f = 0;\r\n                  d = 0;\r\n                  while (1) {\r\n                      t = b[o >> 1] | 0;\r\n                      s = (Z(j << 16 >> 16, t) | 0) + i | 0;\r\n                      i = b[p + 2 >> 1] | 0;\r\n                      h = (Z(i, t) | 0) + h | 0;\r\n                      j = (Z(m << 16 >> 16, t) | 0) + f | 0;\r\n                      f = b[p + 6 >> 1] | 0;\r\n                      m = (Z(f, t) | 0) + d | 0;\r\n                      d = b[o + 2 >> 1] | 0;\r\n                      i = s + (Z(d, i) | 0) | 0;\r\n                      h = h + (Z(n << 16 >> 16, d) | 0) | 0;\r\n                      l = l + 4 | 0;\r\n                      f = j + (Z(d, f) | 0) | 0;\r\n                      j = b[l >> 1] | 0;\r\n                      d = m + (Z(j << 16 >> 16, d) | 0) | 0;\r\n                      k = k + -1 << 16 >> 16;\r\n                      if (!(k << 16 >> 16)) break;\r\n                      t = n;\r\n                      m = j;\r\n                      n = b[p + 8 >> 1] | 0;\r\n                      o = o + 4 | 0;\r\n                      p = p + 4 | 0;\r\n                      j = t;\r\n                  }\r\n                  c[e >> 2] = i << 1;\r\n                  c[e + 4 >> 2] = h << 1;\r\n                  c[e + 8 >> 2] = f << 1;\r\n                  c[e + 12 >> 2] = d << 1;\r\n                  if (g << 16 >> 16 <= 1) break; else {\r\n                      e = e + 16 | 0;\r\n                      g = g + -1 << 16 >> 16;\r\n                  }\r\n              }\r\n              return\r\n          }\r\n\r\n          function Ub(a, d, f, g, h, j, k, l, m) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              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;\r\n              y = i;\r\n              i = i + 16 | 0;\r\n              w = y + 2 | 0;\r\n              x = y;\r\n              do if (h << 16 >> 16 > 0) {\r\n                  s = g << 16 >> 16;\r\n                  u = 0;\r\n                  p = 0;\r\n                  g = 0;\r\n                  o = 0;\r\n                  t = 0;\r\n                  while (1) {\r\n                      n = b[a + (u << 1) >> 1] | 0;\r\n                      q = n << 16 >> 16;\r\n                      p = (Z(q, q) | 0) + p | 0;\r\n                      q = b[d + (u << 1) >> 1] | 0;\r\n                      g = (Z(q, q) | 0) + g | 0;\r\n                      o = (Z(b[f + (u << 1) >> 1] | 0, q) | 0) + o | 0;\r\n                      q = Z(q, s) | 0;\r\n                      if ((q | 0) == 1073741824) {\r\n                          c[m >> 2] = 1;\r\n                          r = 2147483647;\r\n                      } else r = q << 1;\r\n                      q = r << 1;\r\n                      q = (Ge(n, Ce((q >> 1 | 0) == (r | 0) ? q : r >> 31 ^ 2147483647, m) | 0, m) | 0) << 16 >> 16;\r\n                      q = Z(q, q) | 0;\r\n                      if ((q | 0) != 1073741824) {\r\n                          n = (q << 1) + t | 0;\r\n                          if ((q ^ t | 0) > 0 & (n ^ t | 0) < 0) {\r\n                              c[m >> 2] = 1;\r\n                              n = (t >>> 31) + 2147483647 | 0;\r\n                          }\r\n                      } else {\r\n                          c[m >> 2] = 1;\r\n                          n = 2147483647;\r\n                      }\r\n                      u = u + 1 | 0;\r\n                      if ((u & 65535) << 16 >> 16 == h << 16 >> 16) {\r\n                          t = n;\r\n                          break\r\n                      } else t = n;\r\n                  }\r\n                  p = p << 1;\r\n                  g = g << 1;\r\n                  o = o << 1;\r\n                  if ((p | 0) >= 0) {\r\n                      if ((p | 0) < 400) {\r\n                          n = t;\r\n                          v = 14;\r\n                          break\r\n                      }\r\n                  } else {\r\n                      c[m >> 2] = 1;\r\n                      p = 2147483647;\r\n                  }\r\n                  r = pe(p) | 0;\r\n                  q = r << 16 >> 16;\r\n                  if (r << 16 >> 16 > 0) {\r\n                      n = p << q;\r\n                      if ((n >> q | 0) != (p | 0)) n = p >> 31 ^ 2147483647;\r\n                  } else {\r\n                      n = 0 - q << 16;\r\n                      if ((n | 0) < 2031616) n = p >> (n >> 16); else n = 0;\r\n                  }\r\n                  b[j >> 1] = n >>> 16;\r\n                  p = g;\r\n                  s = o;\r\n                  n = t;\r\n                  g = 15 - (r & 65535) & 65535;\r\n              } else {\r\n                  g = 0;\r\n                  o = 0;\r\n                  n = 0;\r\n                  v = 14;\r\n              } while (0);\r\n              if ((v | 0) == 14) {\r\n                  b[j >> 1] = 0;\r\n                  p = g;\r\n                  s = o;\r\n                  g = -15;\r\n              }\r\n              b[k >> 1] = g;\r\n              if ((p | 0) < 0) {\r\n                  c[m >> 2] = 1;\r\n                  p = 2147483647;\r\n              }\r\n              q = pe(p) | 0;\r\n              o = q << 16 >> 16;\r\n              if (q << 16 >> 16 > 0) {\r\n                  g = p << o;\r\n                  if ((g >> o | 0) != (p | 0)) g = p >> 31 ^ 2147483647;\r\n              } else {\r\n                  g = 0 - o << 16;\r\n                  if ((g | 0) < 2031616) g = p >> (g >> 16); else g = 0;\r\n              }\r\n              b[j + 2 >> 1] = g >>> 16;\r\n              b[k + 2 >> 1] = 15 - (q & 65535);\r\n              p = pe(s) | 0;\r\n              o = p << 16 >> 16;\r\n              if (p << 16 >> 16 > 0) {\r\n                  g = s << o;\r\n                  if ((g >> o | 0) != (s | 0)) g = s >> 31 ^ 2147483647;\r\n              } else {\r\n                  g = 0 - o << 16;\r\n                  if ((g | 0) < 2031616) g = s >> (g >> 16); else g = 0;\r\n              }\r\n              b[j + 4 >> 1] = g >>> 16;\r\n              b[k + 4 >> 1] = 2 - (p & 65535);\r\n              p = pe(n) | 0;\r\n              g = p << 16 >> 16;\r\n              if (p << 16 >> 16 > 0) {\r\n                  o = n << g;\r\n                  if ((o >> g | 0) != (n | 0)) o = n >> 31 ^ 2147483647;\r\n              } else {\r\n                  g = 0 - g << 16;\r\n                  if ((g | 0) < 2031616) o = n >> (g >> 16); else o = 0;\r\n              }\r\n              g = o >>> 16 & 65535;\r\n              n = 15 - (p & 65535) & 65535;\r\n              b[j + 6 >> 1] = g;\r\n              b[k + 6 >> 1] = n;\r\n              if ((o >> 16 | 0) <= 0) {\r\n                  m = 0;\r\n                  b[l >> 1] = m;\r\n                  i = y;\r\n                  return\r\n              }\r\n              o = b[j >> 1] | 0;\r\n              if (!(o << 16 >> 16)) {\r\n                  m = 0;\r\n                  b[l >> 1] = m;\r\n                  i = y;\r\n                  return\r\n              }\r\n              g = Td(De(o, 1, m) | 0, g) | 0;\r\n              g = (g & 65535) << 16;\r\n              o = ((Ge(n, b[k >> 1] | 0, m) | 0) & 65535) + 3 | 0;\r\n              n = o & 65535;\r\n              o = o << 16 >> 16;\r\n              if (n << 16 >> 16 > 0) n = n << 16 >> 16 < 31 ? g >> o : 0; else {\r\n                  k = 0 - o << 16 >> 16;\r\n                  n = g << k;\r\n                  n = (n >> k | 0) == (g | 0) ? n : g >> 31 ^ 2147483647;\r\n              }\r\n              de(n, w, x, m);\r\n              x = Ic((e[w >> 1] | 0) + 65509 & 65535, b[x >> 1] | 0, m) | 0;\r\n              w = x << 13;\r\n              m = Ce((w >> 13 | 0) == (x | 0) ? w : x >> 31 ^ 2147483647, m) | 0;\r\n              b[l >> 1] = m;\r\n              i = y;\r\n              return\r\n          }\r\n\r\n          function Vb(a, d, f, g, h, j, k, l, m, n, o) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              var p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0;\r\n              y = i;\r\n              i = i + 80 | 0;\r\n              v = y;\r\n              b[k >> 1] = b[j >> 1] | 0;\r\n              b[l >> 1] = b[j + 2 >> 1] | 0;\r\n              r = b[j + 4 >> 1] | 0;\r\n              if (r << 16 >> 16 == -32768) r = 32767; else r = 0 - (r & 65535) & 65535;\r\n              b[k + 2 >> 1] = r;\r\n              b[l + 2 >> 1] = (e[j + 6 >> 1] | 0) + 1;\r\n              switch (a | 0) {\r\n                  case 0:\r\n                  case 5: {\r\n                      u = 0;\r\n                      q = 0;\r\n                      p = 0;\r\n                      t = 0;\r\n                      break\r\n                  }\r\n                  default: {\r\n                      u = 0;\r\n                      q = 1;\r\n                      p = 1;\r\n                      t = 1;\r\n                  }\r\n              }\r\n              while (1) {\r\n                  s = (b[h + (u << 1) >> 1] | 0) >>> 3;\r\n                  b[v + (u << 1) >> 1] = s;\r\n                  s = s << 16 >> 16;\r\n                  r = Z(s, s) | 0;\r\n                  if ((r | 0) != 1073741824) {\r\n                      j = (r << 1) + q | 0;\r\n                      if ((r ^ q | 0) > 0 & (j ^ q | 0) < 0) {\r\n                          c[o >> 2] = 1;\r\n                          q = (q >>> 31) + 2147483647 | 0;\r\n                      } else q = j;\r\n                  } else {\r\n                      c[o >> 2] = 1;\r\n                      q = 2147483647;\r\n                  }\r\n                  r = Z(b[d + (u << 1) >> 1] | 0, s) | 0;\r\n                  if ((r | 0) != 1073741824) {\r\n                      j = (r << 1) + p | 0;\r\n                      if ((r ^ p | 0) > 0 & (j ^ p | 0) < 0) {\r\n                          c[o >> 2] = 1;\r\n                          p = (p >>> 31) + 2147483647 | 0;\r\n                      } else p = j;\r\n                  } else {\r\n                      c[o >> 2] = 1;\r\n                      p = 2147483647;\r\n                  }\r\n                  r = Z(b[g + (u << 1) >> 1] | 0, s) | 0;\r\n                  if ((r | 0) != 1073741824) {\r\n                      j = (r << 1) + t | 0;\r\n                      if ((r ^ t | 0) > 0 & (j ^ t | 0) < 0) {\r\n                          c[o >> 2] = 1;\r\n                          j = (t >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[o >> 2] = 1;\r\n                      j = 2147483647;\r\n                  }\r\n                  u = u + 1 | 0;\r\n                  if ((u | 0) == 40) {\r\n                      g = j;\r\n                      s = p;\r\n                      break\r\n                  } else t = j;\r\n              }\r\n              p = pe(q) | 0;\r\n              j = p << 16 >> 16;\r\n              if (p << 16 >> 16 > 0) {\r\n                  r = q << j;\r\n                  if ((r >> j | 0) != (q | 0)) r = q >> 31 ^ 2147483647;\r\n              } else {\r\n                  r = 0 - j << 16;\r\n                  if ((r | 0) < 2031616) r = q >> (r >> 16); else r = 0;\r\n              }\r\n              h = k + 4 | 0;\r\n              b[h >> 1] = r >>> 16;\r\n              d = l + 4 | 0;\r\n              b[d >> 1] = -3 - (p & 65535);\r\n              q = pe(s) | 0;\r\n              j = q << 16 >> 16;\r\n              if (q << 16 >> 16 > 0) {\r\n                  r = s << j;\r\n                  if ((r >> j | 0) != (s | 0)) r = s >> 31 ^ 2147483647;\r\n              } else {\r\n                  r = 0 - j << 16;\r\n                  if ((r | 0) < 2031616) r = s >> (r >> 16); else r = 0;\r\n              }\r\n              j = r >>> 16;\r\n              b[k + 6 >> 1] = (j | 0) == 32768 ? 32767 : 0 - j & 65535;\r\n              b[l + 6 >> 1] = 7 - (q & 65535);\r\n              q = pe(g) | 0;\r\n              j = q << 16 >> 16;\r\n              if (q << 16 >> 16 > 0) {\r\n                  r = g << j;\r\n                  if ((r >> j | 0) != (g | 0)) r = g >> 31 ^ 2147483647;\r\n              } else {\r\n                  r = 0 - j << 16;\r\n                  if ((r | 0) < 2031616) r = g >> (r >> 16); else r = 0;\r\n              }\r\n              b[k + 8 >> 1] = r >>> 16;\r\n              b[l + 8 >> 1] = 7 - (q & 65535);\r\n              switch (a | 0) {\r\n                  case 0:\r\n                  case 5: {\r\n                      r = 0;\r\n                      p = 0;\r\n                      break\r\n                  }\r\n                  default: {\r\n                      i = y;\r\n                      return\r\n                  }\r\n              }\r\n              do {\r\n                  p = (Z(b[v + (r << 1) >> 1] | 0, b[f + (r << 1) >> 1] | 0) | 0) + p | 0;\r\n                  r = r + 1 | 0;\r\n              } while ((r | 0) != 40);\r\n              j = p << 1;\r\n              r = pe(j) | 0;\r\n              q = r << 16 >> 16;\r\n              if (r << 16 >> 16 > 0) {\r\n                  p = j << q;\r\n                  if ((p >> q | 0) == (j | 0)) {\r\n                      w = p;\r\n                      x = 40;\r\n                  } else {\r\n                      w = j >> 31 ^ 2147483647;\r\n                      x = 40;\r\n                  }\r\n              } else {\r\n                  p = 0 - q << 16;\r\n                  if ((p | 0) < 2031616) {\r\n                      w = j >> (p >> 16);\r\n                      x = 40;\r\n                  }\r\n              }\r\n              if ((x | 0) == 40 ? (w >> 16 | 0) >= 1 : 0) {\r\n                  o = De(w >>> 16 & 65535, 1, o) | 0;\r\n                  b[m >> 1] = Td(o, b[h >> 1] | 0) | 0;\r\n                  b[n >> 1] = 65528 - (r & 65535) - (e[d >> 1] | 0);\r\n                  i = y;\r\n                  return\r\n              }\r\n              b[m >> 1] = 0;\r\n              b[n >> 1] = 0;\r\n              i = y;\r\n              return\r\n          }\r\n\r\n          function Wb(a, d, e, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              var g = 0, h = 0, i = 0;\r\n              h = 0;\r\n              g = 0;\r\n              do {\r\n                  i = b[a + (h << 1) >> 1] | 0;\r\n                  g = (Z(i, i) | 0) + g | 0;\r\n                  h = h + 1 | 0;\r\n              } while ((h | 0) != 40);\r\n              if ((g | 0) < 0) {\r\n                  c[f >> 2] = 1;\r\n                  g = 2147483647;\r\n              }\r\n              f = pe(g) | 0;\r\n              a = f << 16 >> 16;\r\n              if (f << 16 >> 16 > 0) {\r\n                  h = g << a;\r\n                  if ((h >> a | 0) == (g | 0)) g = h; else g = g >> 31 ^ 2147483647;\r\n              } else {\r\n                  a = 0 - a << 16;\r\n                  if ((a | 0) < 2031616) g = g >> (a >> 16); else g = 0;\r\n              }\r\n              b[e >> 1] = g >>> 16;\r\n              b[d >> 1] = 16 - (f & 65535);\r\n              return\r\n          }\r\n\r\n          function Xb(a, d, e, f, g, h, j, k, l, m, n, o, p) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              p = p | 0;\r\n              var q = 0, r = 0, s = 0, t = 0;\r\n              r = i;\r\n              i = i + 16 | 0;\r\n              q = r;\r\n              if (m >>> 0 < 2) {\r\n                  j = Nb(n, a, d, e, f, j, k, q, c[o + 76 >> 2] | 0, p) | 0;\r\n                  p = c[l >> 2] | 0;\r\n                  b[p >> 1] = j;\r\n                  j = b[q >> 1] | 0;\r\n                  c[l >> 2] = p + 4;\r\n                  b[p + 2 >> 1] = j;\r\n                  i = r;\r\n                  return\r\n              }\r\n              switch (m | 0) {\r\n                  case 2: {\r\n                      j = Mb(a, d, e, f, j, k, q, p) | 0;\r\n                      p = c[l >> 2] | 0;\r\n                      b[p >> 1] = j;\r\n                      j = b[q >> 1] | 0;\r\n                      c[l >> 2] = p + 4;\r\n                      b[p + 2 >> 1] = j;\r\n                      i = r;\r\n                      return\r\n                  }\r\n                  case 3: {\r\n                      j = Qb(a, d, e, f, j, k, q, p) | 0;\r\n                      p = c[l >> 2] | 0;\r\n                      b[p >> 1] = j;\r\n                      j = b[q >> 1] | 0;\r\n                      c[l >> 2] = p + 4;\r\n                      b[p + 2 >> 1] = j;\r\n                      i = r;\r\n                      return\r\n                  }\r\n                  default: {\r\n                      if ((m & -2 | 0) == 4) {\r\n                          j = Rb(a, d, e, f, j, k, q, c[o + 36 >> 2] | 0, p) | 0;\r\n                          p = c[l >> 2] | 0;\r\n                          b[p >> 1] = j;\r\n                          j = b[q >> 1] | 0;\r\n                          c[l >> 2] = p + 4;\r\n                          b[p + 2 >> 1] = j;\r\n                          i = r;\r\n                          return\r\n                      }\r\n                      if ((m | 0) != 6) {\r\n                          n = g << 16 >> 16;\r\n                          n = (n << 17 >> 17 | 0) == (n | 0) ? n << 1 : n >>> 15 ^ 32767;\r\n                          g = e << 16 >> 16 < 40;\r\n                          if (!g) {\r\n                              Lb(a, h, d, j, k, c[l >> 2] | 0, c[o + 36 >> 2] | 0, p);\r\n                              c[l >> 2] = (c[l >> 2] | 0) + 20;\r\n                              i = r;\r\n                              return\r\n                          }\r\n                          q = e << 16 >> 16;\r\n                          m = n << 16 >> 16;\r\n                          f = q;\r\n                          do {\r\n                              t = (Z(b[d + (f - q << 1) >> 1] | 0, m) | 0) >>> 15 & 65535;\r\n                              s = d + (f << 1) | 0;\r\n                              b[s >> 1] = Rd(b[s >> 1] | 0, t, p) | 0;\r\n                              f = f + 1 | 0;\r\n                          } while ((f & 65535) << 16 >> 16 != 40);\r\n                          Lb(a, h, d, j, k, c[l >> 2] | 0, c[o + 36 >> 2] | 0, p);\r\n                          c[l >> 2] = (c[l >> 2] | 0) + 20;\r\n                          if (!g) {\r\n                              i = r;\r\n                              return\r\n                          }\r\n                          g = e << 16 >> 16;\r\n                          m = n << 16 >> 16;\r\n                          q = g;\r\n                          do {\r\n                              f = (Z(b[j + (q - g << 1) >> 1] | 0, m) | 0) >> 15;\r\n                              if ((f | 0) > 32767) {\r\n                                  c[p >> 2] = 1;\r\n                                  f = 32767;\r\n                              }\r\n                              t = j + (q << 1) | 0;\r\n                              b[t >> 1] = Rd(b[t >> 1] | 0, f & 65535, p) | 0;\r\n                              q = q + 1 | 0;\r\n                          } while ((q & 65535) << 16 >> 16 != 40);\r\n                          i = r;\r\n                          return\r\n                      }\r\n                      o = f << 16 >> 16;\r\n                      o = (o << 17 >> 17 | 0) == (o | 0) ? o << 1 : o >>> 15 ^ 32767;\r\n                      n = e << 16 >> 16 < 40;\r\n                      if (!n) {\r\n                          Sb(a, h, d, j, k, c[l >> 2] | 0, p);\r\n                          c[l >> 2] = (c[l >> 2] | 0) + 14;\r\n                          i = r;\r\n                          return\r\n                      }\r\n                      q = e << 16 >> 16;\r\n                      m = o << 16 >> 16;\r\n                      f = q;\r\n                      do {\r\n                          g = (Z(b[d + (f - q << 1) >> 1] | 0, m) | 0) >> 15;\r\n                          if ((g | 0) > 32767) {\r\n                              c[p >> 2] = 1;\r\n                              g = 32767;\r\n                          }\r\n                          t = d + (f << 1) | 0;\r\n                          b[t >> 1] = Rd(b[t >> 1] | 0, g & 65535, p) | 0;\r\n                          f = f + 1 | 0;\r\n                      } while ((f & 65535) << 16 >> 16 != 40);\r\n                      Sb(a, h, d, j, k, c[l >> 2] | 0, p);\r\n                      c[l >> 2] = (c[l >> 2] | 0) + 14;\r\n                      if (!n) {\r\n                          i = r;\r\n                          return\r\n                      }\r\n                      g = e << 16 >> 16;\r\n                      m = o << 16 >> 16;\r\n                      q = g;\r\n                      do {\r\n                          f = (Z(b[j + (q - g << 1) >> 1] | 0, m) | 0) >> 15;\r\n                          if ((f | 0) > 32767) {\r\n                              c[p >> 2] = 1;\r\n                              f = 32767;\r\n                          }\r\n                          t = j + (q << 1) | 0;\r\n                          b[t >> 1] = Rd(b[t >> 1] | 0, f & 65535, p) | 0;\r\n                          q = q + 1 | 0;\r\n                      } while ((q & 65535) << 16 >> 16 != 40);\r\n                      i = r;\r\n                      return\r\n                  }\r\n              }\r\n          }\r\n\r\n          function Yb(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              b = Je(4) | 0;\r\n              if (!b) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              if (!((Uc(b) | 0) << 16 >> 16)) {\r\n                  Vc(c[b >> 2] | 0) | 0;\r\n                  c[a >> 2] = b;\r\n                  a = 0;\r\n                  return a | 0\r\n              } else {\r\n                  Wc(b);\r\n                  Ke(b);\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              return 0\r\n          }\r\n\r\n          function Zb(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Wc(b);\r\n              Ke(c[a >> 2] | 0);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function _b(a) {\r\n              a = a | 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              Vc(c[a >> 2] | 0) | 0;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function $b(a, d, f, g, h, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              p = p | 0;\r\n              q = q | 0;\r\n              r = r | 0;\r\n              s = s | 0;\r\n              t = t | 0;\r\n              u = u | 0;\r\n              v = v | 0;\r\n              w = w | 0;\r\n              x = x | 0;\r\n              var y = 0, z = 0, A = 0, B = 0;\r\n              z = i;\r\n              i = i + 16 | 0;\r\n              B = z + 2 | 0;\r\n              A = z;\r\n              b[q >> 1] = Xc(c[a >> 2] | 0, f, h, k, m, j, 40, g, r, A, B, x) | 0;\r\n              a = b[B >> 1] | 0;\r\n              g = c[u >> 2] | 0;\r\n              c[u >> 2] = g + 2;\r\n              b[g >> 1] = a;\r\n              se(k, b[q >> 1] | 0, b[r >> 1] | 0, 40, b[A >> 1] | 0, x);\r\n              ec(k, j, p, 40);\r\n              b[s >> 1] = Dc(f, m, p, t, 40, x) | 0;\r\n              b[v >> 1] = 32767;\r\n              if (n << 16 >> 16 != 0 ? (y = b[s >> 1] | 0, y << 16 >> 16 > 15565) : 0) y = Ed(d, y, x) | 0; else y = 0;\r\n              if (f >>> 0 < 2) {\r\n                  B = b[s >> 1] | 0;\r\n                  b[s >> 1] = B << 16 >> 16 > 13926 ? 13926 : B;\r\n                  if (y << 16 >> 16) b[v >> 1] = 15565;\r\n              } else {\r\n                  if (y << 16 >> 16) {\r\n                      b[v >> 1] = 15565;\r\n                      b[s >> 1] = 15565;\r\n                  }\r\n                  if ((f | 0) == 7) {\r\n                      A = nd(7, b[v >> 1] | 0, s, 0, 0, w, x) | 0;\r\n                      B = c[u >> 2] | 0;\r\n                      c[u >> 2] = B + 2;\r\n                      b[B >> 1] = A;\r\n                  }\r\n              }\r\n              q = b[s >> 1] | 0;\r\n              y = 0;\r\n              while (1) {\r\n                  A = Z(b[p >> 1] | 0, q) | 0;\r\n                  b[o >> 1] = (e[m >> 1] | 0) - (A >>> 14);\r\n                  A = (Z(b[k >> 1] | 0, q) | 0) >>> 14;\r\n                  B = l + (y << 1) | 0;\r\n                  b[B >> 1] = (e[B >> 1] | 0) - A;\r\n                  y = y + 1 | 0;\r\n                  if ((y | 0) == 40) break; else {\r\n                      k = k + 2 | 0;\r\n                      m = m + 2 | 0;\r\n                      o = o + 2 | 0;\r\n                      p = p + 2 | 0;\r\n                  }\r\n              }\r\n              i = z;\r\n              return\r\n          }\r\n\r\n          function ac(a, b) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              var d = 0, e = 0, f = 0, g = 0;\r\n              g = i;\r\n              i = i + 16 | 0;\r\n              f = g;\r\n              if (!a) {\r\n                  a = -1;\r\n                  i = g;\r\n                  return a | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(2532) | 0;\r\n              c[f >> 2] = d;\r\n              if (!d) {\r\n                  a = -1;\r\n                  i = g;\r\n                  return a | 0\r\n              }\r\n              Yd(d + 2392 | 0);\r\n              c[d + 2188 >> 2] = 0;\r\n              c[(c[f >> 2] | 0) + 2192 >> 2] = 0;\r\n              c[(c[f >> 2] | 0) + 2196 >> 2] = 0;\r\n              c[(c[f >> 2] | 0) + 2200 >> 2] = 0;\r\n              c[(c[f >> 2] | 0) + 2204 >> 2] = 0;\r\n              c[(c[f >> 2] | 0) + 2208 >> 2] = 0;\r\n              c[(c[f >> 2] | 0) + 2212 >> 2] = 0;\r\n              c[(c[f >> 2] | 0) + 2220 >> 2] = 0;\r\n              e = c[f >> 2] | 0;\r\n              c[e + 2216 >> 2] = b;\r\n              c[e + 2528 >> 2] = 0;\r\n              d = e;\r\n              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) {\r\n                  cc(e) | 0;\r\n                  c[a >> 2] = d;\r\n                  a = 0;\r\n                  i = g;\r\n                  return a | 0\r\n              }\r\n              bc(f);\r\n              a = -1;\r\n              i = g;\r\n              return a | 0\r\n          }\r\n\r\n          function bc(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Qc(b + 2188 | 0);\r\n              ke((c[a >> 2] | 0) + 2192 | 0);\r\n              zc((c[a >> 2] | 0) + 2200 | 0);\r\n              Zb((c[a >> 2] | 0) + 2196 | 0);\r\n              ad((c[a >> 2] | 0) + 2204 | 0);\r\n              Cd((c[a >> 2] | 0) + 2208 | 0);\r\n              Id((c[a >> 2] | 0) + 2212 | 0);\r\n              lc((c[a >> 2] | 0) + 2220 | 0);\r\n              Ke(c[a >> 2] | 0);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function cc(a) {\r\n              a = a | 0;\r\n              var d = 0, e = 0, f = 0, g = 0;\r\n              if (!a) {\r\n                  g = -1;\r\n                  return g | 0\r\n              }\r\n              c[a + 652 >> 2] = a + 320;\r\n              c[a + 640 >> 2] = a + 240;\r\n              c[a + 644 >> 2] = a + 160;\r\n              c[a + 648 >> 2] = a + 80;\r\n              c[a + 1264 >> 2] = a + 942;\r\n              c[a + 1912 >> 2] = a + 1590;\r\n              f = a + 1938 | 0;\r\n              c[a + 2020 >> 2] = f;\r\n              c[a + 2384 >> 2] = a + 2304;\r\n              d = a + 2028 | 0;\r\n              c[a + 2024 >> 2] = a + 2108;\r\n              c[a + 2528 >> 2] = 0;\r\n              Qe(a | 0, 0, 640) | 0;\r\n              Qe(a + 1282 | 0, 0, 308) | 0;\r\n              Qe(a + 656 | 0, 0, 286) | 0;\r\n              e = a + 2224 | 0;\r\n              g = f + 80 | 0;\r\n              do {\r\n                  b[f >> 1] = 0;\r\n                  f = f + 2 | 0;\r\n              } while ((f | 0) < (g | 0));\r\n              f = d;\r\n              g = f + 80 | 0;\r\n              do {\r\n                  b[f >> 1] = 0;\r\n                  f = f + 2 | 0;\r\n              } while ((f | 0) < (g | 0));\r\n              d = a + 1268 | 0;\r\n              f = e;\r\n              g = f + 80 | 0;\r\n              do {\r\n                  b[f >> 1] = 0;\r\n                  f = f + 2 | 0;\r\n              } while ((f | 0) < (g | 0));\r\n              b[d >> 1] = 40;\r\n              b[a + 1270 >> 1] = 40;\r\n              b[a + 1272 >> 1] = 40;\r\n              b[a + 1274 >> 1] = 40;\r\n              b[a + 1276 >> 1] = 40;\r\n              Rc(c[a + 2188 >> 2] | 0) | 0;\r\n              je(c[a + 2192 >> 2] | 0) | 0;\r\n              _b(c[a + 2196 >> 2] | 0) | 0;\r\n              Ac(c[a + 2200 >> 2] | 0) | 0;\r\n              $c(c[a + 2204 >> 2] | 0) | 0;\r\n              Bd(c[a + 2208 >> 2] | 0) | 0;\r\n              Hd(c[a + 2212 >> 2] | 0) | 0;\r\n              kc(c[a + 2220 >> 2] | 0, c[a + 2432 >> 2] | 0) | 0;\r\n              b[a + 2388 >> 1] = 0;\r\n              g = 0;\r\n              return g | 0\r\n          }\r\n\r\n          function dc(a, d, e, f, g, h) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              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,\r\n                  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,\r\n                  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,\r\n                  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,\r\n                  na = 0, oa = 0, pa = 0, qa = 0;\r\n              qa = i;\r\n              i = i + 1184 | 0;\r\n              T = qa;\r\n              n = qa + 1096 | 0;\r\n              o = qa + 1008 | 0;\r\n              l = qa + 904 | 0;\r\n              ka = qa + 928 | 0;\r\n              la = qa + 824 | 0;\r\n              X = qa + 744 | 0;\r\n              na = qa + 664 | 0;\r\n              oa = qa + 584 | 0;\r\n              Z = qa + 328 | 0;\r\n              ha = qa + 504 | 0;\r\n              ia = qa + 424 | 0;\r\n              ma = qa + 344 | 0;\r\n              pa = qa + 248 | 0;\r\n              Y = qa + 168 | 0;\r\n              da = qa + 88 | 0;\r\n              fa = qa + 68 | 0;\r\n              ga = qa + 48 | 0;\r\n              ea = qa + 28 | 0;\r\n              ja = qa + 24 | 0;\r\n              ba = qa + 22 | 0;\r\n              $ = qa + 20 | 0;\r\n              W = qa + 16 | 0;\r\n              U = qa + 12 | 0;\r\n              V = qa + 10 | 0;\r\n              aa = qa + 8 | 0;\r\n              _ = qa + 6 | 0;\r\n              ca = qa + 4 | 0;\r\n              c[T >> 2] = f;\r\n              S = a + 2528 | 0;\r\n              j = a + 652 | 0;\r\n              Oe(c[j >> 2] | 0, e | 0, 320) | 0;\r\n              c[g >> 2] = d;\r\n              m = a + 2216 | 0;\r\n              if (!(c[m >> 2] | 0)) {\r\n                  e = a + 2220 | 0;\r\n                  f = 0;\r\n              } else {\r\n                  f = Nd(c[a + 2212 >> 2] | 0, c[j >> 2] | 0, S) | 0;\r\n                  R = a + 2220 | 0;\r\n                  e = R;\r\n                  f = oc(c[R >> 2] | 0, f, g, S) | 0;\r\n              }\r\n              R = a + 2392 | 0;\r\n              Sc(c[a + 2188 >> 2] | 0, d, c[a + 644 >> 2] | 0, c[a + 648 >> 2] | 0, n, R, S);\r\n              k = a + 2192 | 0;\r\n              le(c[k >> 2] | 0, d, c[g >> 2] | 0, n, o, l, T, S);\r\n              nc(c[e >> 2] | 0, l, c[j >> 2] | 0, S);\r\n              if ((c[g >> 2] | 0) == 8) {\r\n                  mc(c[e >> 2] | 0, f, c[(c[k >> 2] | 0) + 40 >> 2] | 0, (c[a + 2200 >> 2] | 0) + 32 | 0, T, S);\r\n                  Qe(a + 1282 | 0, 0, 308) | 0;\r\n                  j = a + 2244 | 0;\r\n                  q = j + 20 | 0;\r\n                  do {\r\n                      b[j >> 1] = 0;\r\n                      j = j + 2 | 0;\r\n                  } while ((j | 0) < (q | 0));\r\n                  j = a + 2284 | 0;\r\n                  q = j + 20 | 0;\r\n                  do {\r\n                      b[j >> 1] = 0;\r\n                      j = j + 2 | 0;\r\n                  } while ((j | 0) < (q | 0));\r\n                  j = c[a + 2020 >> 2] | 0;\r\n                  q = j + 80 | 0;\r\n                  do {\r\n                      b[j >> 1] = 0;\r\n                      j = j + 2 | 0;\r\n                  } while ((j | 0) < (q | 0));\r\n                  j = a + 2028 | 0;\r\n                  q = j + 80 | 0;\r\n                  do {\r\n                      b[j >> 1] = 0;\r\n                      j = j + 2 | 0;\r\n                  } while ((j | 0) < (q | 0));\r\n                  je(c[k >> 2] | 0) | 0;\r\n                  j = c[k >> 2] | 0;\r\n                  e = l;\r\n                  q = j + 20 | 0;\r\n                  do {\r\n                      b[j >> 1] = b[e >> 1] | 0;\r\n                      j = j + 2 | 0;\r\n                      e = e + 2 | 0;\r\n                  } while ((j | 0) < (q | 0));\r\n                  j = (c[k >> 2] | 0) + 20 | 0;\r\n                  e = l;\r\n                  q = j + 20 | 0;\r\n                  do {\r\n                      b[j >> 1] = b[e >> 1] | 0;\r\n                      j = j + 2 | 0;\r\n                      e = e + 2 | 0;\r\n                  } while ((j | 0) < (q | 0));\r\n                  _b(c[a + 2196 >> 2] | 0) | 0;\r\n                  b[a + 2388 >> 1] = 0;\r\n                  Q = 0;\r\n              } else Q = Dd(c[a + 2208 >> 2] | 0, c[k >> 2] | 0, S) | 0;\r\n              N = a + 640 | 0;\r\n              k = a + 2264 | 0;\r\n              j = a + 1264 | 0;\r\n              e = a + 2204 | 0;\r\n              f = a + 2212 | 0;\r\n              O = a + 1268 | 0;\r\n              P = a + 1278 | 0;\r\n              cd(d, 2842, 2862, 2882, n, 0, c[N >> 2] | 0, k, c[j >> 2] | 0, S);\r\n              if (d >>> 0 > 1) {\r\n                  Tc(c[e >> 2] | 0, c[f >> 2] | 0, d, c[j >> 2] | 0, W, O, P, 0, c[m >> 2] | 0, S);\r\n                  cd(d, 2842, 2862, 2882, n, 80, c[N >> 2] | 0, k, c[j >> 2] | 0, S);\r\n                  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);\r\n              } else {\r\n                  cd(d, 2842, 2862, 2882, n, 80, c[N >> 2] | 0, k, c[j >> 2] | 0, S);\r\n                  Tc(c[e >> 2] | 0, c[f >> 2] | 0, d, c[j >> 2] | 0, W, O, P, 1, c[m >> 2] | 0, S);\r\n                  b[W + 2 >> 1] = b[W >> 1] | 0;\r\n              }\r\n              if (c[m >> 2] | 0) Md(c[f >> 2] | 0, W, S);\r\n              if ((c[g >> 2] | 0) == 8) {\r\n                  oa = a + 656 | 0;\r\n                  pa = a + 976 | 0;\r\n                  Oe(oa | 0, pa | 0, 286) | 0;\r\n                  pa = a + 320 | 0;\r\n                  Oe(a | 0, pa | 0, 320) | 0;\r\n                  i = qa;\r\n                  return 0\r\n              }\r\n              z = a + 2224 | 0;\r\n              A = a + 2244 | 0;\r\n              B = a + 2284 | 0;\r\n              C = a + 2388 | 0;\r\n              D = a + 2020 | 0;\r\n              E = a + 1916 | 0;\r\n              F = a + 1912 | 0;\r\n              G = a + 2024 | 0;\r\n              H = a + 2384 | 0;\r\n              I = a + 2196 | 0;\r\n              J = a + 2208 | 0;\r\n              K = a + 2464 | 0;\r\n              L = a + 2200 | 0;\r\n              M = a + 2224 | 0;\r\n              w = a + 2244 | 0;\r\n              x = a + 1270 | 0;\r\n              y = a + 1280 | 0;\r\n              v = 0;\r\n              m = 0;\r\n              l = 0;\r\n              s = 0;\r\n              t = 0;\r\n              k = 0;\r\n              u = -1;\r\n              while (1) {\r\n                  p = u;\r\n                  u = u + 1 << 16 >> 16;\r\n                  s = 1 - (s << 16 >> 16) | 0;\r\n                  f = s & 65535;\r\n                  r = (s & 65535 | 0) != 0;\r\n                  e = c[g >> 2] | 0;\r\n                  j = (e | 0) == 0;\r\n                  do if (r) if (j) {\r\n                      j = fa;\r\n                      e = z;\r\n                      q = j + 20 | 0;\r\n                      do {\r\n                          b[j >> 1] = b[e >> 1] | 0;\r\n                          j = j + 2 | 0;\r\n                          e = e + 2 | 0;\r\n                      } while ((j | 0) < (q | 0));\r\n                      j = ga;\r\n                      e = A;\r\n                      q = j + 20 | 0;\r\n                      do {\r\n                          b[j >> 1] = b[e >> 1] | 0;\r\n                          j = j + 2 | 0;\r\n                          e = e + 2 | 0;\r\n                      } while ((j | 0) < (q | 0));\r\n                      j = ea;\r\n                      e = B;\r\n                      q = j + 20 | 0;\r\n                      do {\r\n                          b[j >> 1] = b[e >> 1] | 0;\r\n                          j = j + 2 | 0;\r\n                          e = e + 2 | 0;\r\n                      } while ((j | 0) < (q | 0));\r\n                      b[ja >> 1] = b[C >> 1] | 0;\r\n                      d = (c[N >> 2] | 0) + (v << 1) | 0;\r\n                      j = 20;\r\n                      break\r\n                  } else {\r\n                      d = (c[N >> 2] | 0) + (v << 1) | 0;\r\n                      j = 19;\r\n                      break\r\n                  } else {\r\n                      d = (c[N >> 2] | 0) + (v << 1) | 0;\r\n                      if (j) j = 20; else j = 19;\r\n                  } while (0);\r\n                  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) {\r\n                      j = da;\r\n                      e = c[G >> 2] | 0;\r\n                      q = j + 80 | 0;\r\n                      do {\r\n                          b[j >> 1] = b[e >> 1] | 0;\r\n                          j = j + 2 | 0;\r\n                          e = e + 2 | 0;\r\n                      } while ((j | 0) < (q | 0))\r\n                  }\r\n                  j = ia;\r\n                  e = ha;\r\n                  q = j + 80 | 0;\r\n                  do {\r\n                      b[j >> 1] = b[e >> 1] | 0;\r\n                      j = j + 2 | 0;\r\n                      e = e + 2 | 0;\r\n                  } while ((j | 0) < (q | 0));\r\n                  $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);\r\n                  switch (p << 16 >> 16) {\r\n                      case -1: {\r\n                          if ((b[P >> 1] | 0) > 0) b[x >> 1] = b[U >> 1] | 0;\r\n                          break\r\n                      }\r\n                      case 2: {\r\n                          if ((b[y >> 1] | 0) > 0) b[O >> 1] = b[U >> 1] | 0;\r\n                          break\r\n                      }\r\n                      default: {\r\n                      }\r\n                  }\r\n                  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);\r\n                  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);\r\n                  Fd(c[J >> 2] | 0, b[aa >> 1] | 0, S);\r\n                  d = c[g >> 2] | 0;\r\n                  do if (!d) if (r) {\r\n                      j = ma;\r\n                      e = ka;\r\n                      q = j + 80 | 0;\r\n                      do {\r\n                          b[j >> 1] = b[e >> 1] | 0;\r\n                          j = j + 2 | 0;\r\n                          e = e + 2 | 0;\r\n                      } while ((j | 0) < (q | 0));\r\n                      j = pa;\r\n                      e = oa;\r\n                      q = j + 80 | 0;\r\n                      do {\r\n                          b[j >> 1] = b[e >> 1] | 0;\r\n                          j = j + 2 | 0;\r\n                          e = e + 2 | 0;\r\n                      } while ((j | 0) < (q | 0));\r\n                      j = Y;\r\n                      e = X;\r\n                      q = j + 80 | 0;\r\n                      do {\r\n                          b[j >> 1] = b[e >> 1] | 0;\r\n                          j = j + 2 | 0;\r\n                          e = e + 2 | 0;\r\n                      } while ((j | 0) < (q | 0));\r\n                      l = b[U >> 1] | 0;\r\n                      m = b[V >> 1] | 0;\r\n                      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);\r\n                      b[C >> 1] = b[ja >> 1] | 0;\r\n                      k = t;\r\n                      break\r\n                  } else {\r\n                      j = B;\r\n                      e = ea;\r\n                      q = j + 20 | 0;\r\n                      do {\r\n                          b[j >> 1] = b[e >> 1] | 0;\r\n                          j = j + 2 | 0;\r\n                          e = e + 2 | 0;\r\n                      } while ((j | 0) < (q | 0));\r\n                      r = k << 16 >> 16;\r\n                      se((c[F >> 2] | 0) + (r << 1) | 0, l, m, 40, 1, S);\r\n                      ec((c[F >> 2] | 0) + (r << 1) | 0, da, na, 40);\r\n                      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);\r\n                      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);\r\n                      se((c[F >> 2] | 0) + (v << 1) | 0, b[U >> 1] | 0, b[V >> 1] | 0, 40, 1, S);\r\n                      ec((c[F >> 2] | 0) + (v << 1) | 0, c[G >> 2] | 0, na, 40);\r\n                      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);\r\n                      break\r\n                  } 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);\r\n                  d = v + 40 | 0;\r\n                  t = d & 65535;\r\n                  if (t << 16 >> 16 >= 160) break; else {\r\n                      v = d << 16 >> 16;\r\n                      n = n + 22 | 0;\r\n                      o = o + 22 | 0;\r\n                  }\r\n              }\r\n              Oe(a + 1282 | 0, a + 1602 | 0, 308) | 0;\r\n              oa = a + 656 | 0;\r\n              pa = a + 976 | 0;\r\n              Oe(oa | 0, pa | 0, 286) | 0;\r\n              pa = a + 320 | 0;\r\n              Oe(a | 0, pa | 0, 320) | 0;\r\n              i = qa;\r\n              return 0\r\n          }\r\n\r\n          function ec(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              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\n              o = e << 16 >> 16;\r\n              if (e << 16 >> 16 > 1) n = 1; else return;\r\n              while (1) {\r\n                  f = b[a >> 1] | 0;\r\n                  i = c + (n + -1 << 1) | 0;\r\n                  e = Z(b[c + (n << 1) >> 1] | 0, f) | 0;\r\n                  k = b[i >> 1] | 0;\r\n                  f = Z(k << 16 >> 16, f) | 0;\r\n                  h = (n + 131071 | 0) >>> 1;\r\n                  j = h & 65535;\r\n                  g = b[a + 2 >> 1] | 0;\r\n                  if (!(j << 16 >> 16)) {\r\n                      c = i;\r\n                      h = k;\r\n                  } else {\r\n                      l = (h << 1) + 131070 & 131070;\r\n                      m = n - l | 0;\r\n                      h = a;\r\n                      do {\r\n                          q = (Z(k << 16 >> 16, g) | 0) + e | 0;\r\n                          p = h;\r\n                          h = h + 4 | 0;\r\n                          e = b[i + -2 >> 1] | 0;\r\n                          g = (Z(e, g) | 0) + f | 0;\r\n                          f = b[h >> 1] | 0;\r\n                          i = i + -4 | 0;\r\n                          e = q + (Z(f, e) | 0) | 0;\r\n                          k = b[i >> 1] | 0;\r\n                          f = g + (Z(k << 16 >> 16, f) | 0) | 0;\r\n                          j = j + -1 << 16 >> 16;\r\n                          g = b[p + 6 >> 1] | 0;\r\n                      } while (j << 16 >> 16 != 0);\r\n                      h = c + (m + -3 << 1) | 0;\r\n                      a = a + (l + 2 << 1) | 0;\r\n                      c = h;\r\n                      h = b[h >> 1] | 0;\r\n                  }\r\n                  e = (Z(h << 16 >> 16, g) | 0) + e | 0;\r\n                  b[d >> 1] = f >>> 12;\r\n                  b[d + 2 >> 1] = e >>> 12;\r\n                  e = (n << 16) + 131072 >> 16;\r\n                  if ((e | 0) < (o | 0)) {\r\n                      d = d + 4 | 0;\r\n                      a = a + (1 - n << 1) | 0;\r\n                      n = e;\r\n                  } else break\r\n              }\r\n              return\r\n          }\r\n\r\n          function fc(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              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,\r\n                  v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0;\r\n              z = i;\r\n              i = i + 80 | 0;\r\n              y = z;\r\n              h = 20;\r\n              g = a;\r\n              f = 1;\r\n              while (1) {\r\n                  x = b[g >> 1] | 0;\r\n                  x = (Z(x, x) | 0) + f | 0;\r\n                  f = b[g + 2 >> 1] | 0;\r\n                  f = x + (Z(f, f) | 0) | 0;\r\n                  h = h + -1 << 16 >> 16;\r\n                  if (!(h << 16 >> 16)) break; else g = g + 4 | 0;\r\n              }\r\n              f = f << 1;\r\n              if ((f | 0) < 0) {\r\n                  g = 20;\r\n                  f = a;\r\n                  e = y;\r\n                  while (1) {\r\n                      b[e >> 1] = (b[f >> 1] | 0) >>> 1;\r\n                      b[e + 2 >> 1] = (b[f + 2 >> 1] | 0) >>> 1;\r\n                      g = g + -1 << 16 >> 16;\r\n                      if (!(g << 16 >> 16)) {\r\n                          x = y;\r\n                          break\r\n                      } else {\r\n                          f = f + 4 | 0;\r\n                          e = e + 4 | 0;\r\n                      }\r\n                  }\r\n              } else {\r\n                  f = ce(f >> 1, e) | 0;\r\n                  if ((f | 0) < 16777215) f = ((f >> 9) * 32440 | 0) >>> 15 << 16 >> 16; else f = 32440;\r\n                  h = 20;\r\n                  g = a;\r\n                  e = y;\r\n                  while (1) {\r\n                      b[e >> 1] = ((Z(b[g >> 1] | 0, f) | 0) + 32 | 0) >>> 6;\r\n                      b[e + 2 >> 1] = ((Z(b[g + 2 >> 1] | 0, f) | 0) + 32 | 0) >>> 6;\r\n                      h = h + -1 << 16 >> 16;\r\n                      if (!(h << 16 >> 16)) {\r\n                          x = y;\r\n                          break\r\n                      } else {\r\n                          g = g + 4 | 0;\r\n                          e = e + 4 | 0;\r\n                      }\r\n                  }\r\n              }\r\n              h = 20;\r\n              g = x;\r\n              e = d + 3198 | 0;\r\n              f = 0;\r\n              while (1) {\r\n                  w = b[g >> 1] | 0;\r\n                  w = (Z(w, w) | 0) + f | 0;\r\n                  b[e >> 1] = (w + 16384 | 0) >>> 15;\r\n                  v = b[g + 2 >> 1] | 0;\r\n                  f = (Z(v, v) | 0) + w | 0;\r\n                  b[e + -82 >> 1] = (f + 16384 | 0) >>> 15;\r\n                  h = h + -1 << 16 >> 16;\r\n                  if (!(h << 16 >> 16)) break; else {\r\n                      g = g + 4 | 0;\r\n                      e = e + -164 | 0;\r\n                  }\r\n              }\r\n              w = c + 78 | 0;\r\n              v = 1;\r\n              while (1) {\r\n                  f = 39 - v | 0;\r\n                  a = d + 3120 + (f << 1) | 0;\r\n                  e = d + (f * 80 | 0) + 78 | 0;\r\n                  f = c + (f << 1) | 0;\r\n                  k = y + (v << 1) | 0;\r\n                  g = 65575 - v | 0;\r\n                  j = g & 65535;\r\n                  h = b[x >> 1] | 0;\r\n                  if (!(j << 16 >> 16)) {\r\n                      j = w;\r\n                      g = 0;\r\n                  } else {\r\n                      r = g + 65535 & 65535;\r\n                      t = r * 41 | 0;\r\n                      u = (Z(v, -40) | 0) - t | 0;\r\n                      s = 0 - v | 0;\r\n                      t = s - t | 0;\r\n                      s = s - r | 0;\r\n                      q = v + r | 0;\r\n                      p = b[k >> 1] | 0;\r\n                      n = x;\r\n                      o = w;\r\n                      l = d + ((38 - v | 0) * 80 | 0) + 78 | 0;\r\n                      g = 0;\r\n                      m = 0;\r\n                      while (1) {\r\n                          k = k + 2 | 0;\r\n                          g = (Z(p << 16 >> 16, h) | 0) + g | 0;\r\n                          n = n + 2 | 0;\r\n                          p = b[k >> 1] | 0;\r\n                          m = (Z(p << 16 >> 16, h) | 0) + m | 0;\r\n                          B = f;\r\n                          f = f + -2 | 0;\r\n                          h = b[f >> 1] | 0;\r\n                          A = b[o >> 1] << 1;\r\n                          B = (Z((Z(A, b[B >> 1] | 0) | 0) >> 16, (g << 1) + 32768 >> 16) | 0) >>> 15 & 65535;\r\n                          b[e >> 1] = B;\r\n                          b[a >> 1] = B;\r\n                          h = (Z((Z(A, h) | 0) >> 16, (m << 1) + 32768 >> 16) | 0) >>> 15 & 65535;\r\n                          b[a + -2 >> 1] = h;\r\n                          b[l >> 1] = h;\r\n                          j = j + -1 << 16 >> 16;\r\n                          h = b[n >> 1] | 0;\r\n                          if (!(j << 16 >> 16)) break; else {\r\n                              o = o + -2 | 0;\r\n                              a = a + -82 | 0;\r\n                              e = e + -82 | 0;\r\n                              l = l + -82 | 0;\r\n                          }\r\n                      }\r\n                      k = y + (q + 1 << 1) | 0;\r\n                      j = c + (38 - r << 1) | 0;\r\n                      f = c + (s + 38 << 1) | 0;\r\n                      a = d + 3040 + (t + 38 << 1) | 0;\r\n                      e = d + 3040 + (u + 38 << 1) | 0;\r\n                  }\r\n                  B = (Z(b[k >> 1] | 0, h) | 0) + g | 0;\r\n                  B = (Z((B << 1) + 32768 >> 16, (Z(b[j >> 1] << 1, b[f >> 1] | 0) | 0) >> 16) | 0) >>> 15 & 65535;\r\n                  b[a >> 1] = B;\r\n                  b[e >> 1] = B;\r\n                  e = (v << 16) + 131072 | 0;\r\n                  if ((e | 0) < 2621440) v = e >> 16; else break\r\n              }\r\n              i = z;\r\n              return\r\n          }\r\n\r\n          function gc(a, d, e, f, g, h, j) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              var k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0;\r\n              r = i;\r\n              i = i + 160 | 0;\r\n              q = r;\r\n              if (g << 16 >> 16 > 0) {\r\n                  o = h & 65535;\r\n                  p = 0;\r\n                  k = 5;\r\n                  do {\r\n                      if ((p | 0) < 40) {\r\n                          n = p;\r\n                          m = p & 65535;\r\n                          h = 0;\r\n                          while (1) {\r\n                              if (m << 16 >> 16 < 40) {\r\n                                  m = m << 16 >> 16;\r\n                                  l = 0;\r\n                                  do {\r\n                                      l = (Z(b[a + (m - n << 1) >> 1] | 0, b[d + (m << 1) >> 1] | 0) | 0) + l | 0;\r\n                                      m = m + 1 | 0;\r\n                                  } while ((m & 65535) << 16 >> 16 != 40)\r\n                              } else l = 0;\r\n                              l = l << 1;\r\n                              c[q + (n << 2) >> 2] = l;\r\n                              l = Gc(l) | 0;\r\n                              h = (l | 0) > (h | 0) ? l : h;\r\n                              l = n + o | 0;\r\n                              m = l & 65535;\r\n                              if (m << 16 >> 16 >= 40) break; else n = l << 16 >> 16;\r\n                          }\r\n                      } else h = 0;\r\n                      k = (h >> 1) + k | 0;\r\n                      p = p + 1 | 0;\r\n                  } while ((p & 65535) << 16 >> 16 != g << 16 >> 16)\r\n              } else k = 5;\r\n              f = ((pe(k) | 0) & 65535) - (f & 65535) | 0;\r\n              h = f << 16 >> 16;\r\n              l = 0 - h << 16;\r\n              k = (l | 0) < 2031616;\r\n              l = l >> 16;\r\n              if ((f & 65535) << 16 >> 16 > 0) if (k) {\r\n                  k = 0;\r\n                  do {\r\n                      f = c[q + (k << 2) >> 2] | 0;\r\n                      d = f << h;\r\n                      b[e + (k << 1) >> 1] = Ce((d >> h | 0) == (f | 0) ? d : f >> 31 ^ 2147483647, j) | 0;\r\n                      k = k + 1 | 0;\r\n                  } while ((k | 0) != 40);\r\n                  i = r;\r\n                  return\r\n              } else {\r\n                  k = 0;\r\n                  do {\r\n                      f = c[q + (k << 2) >> 2] | 0;\r\n                      d = f << h;\r\n                      b[e + (k << 1) >> 1] = Ce((d >> h | 0) == (f | 0) ? d : f >> 31 ^ 2147483647, j) | 0;\r\n                      k = k + 1 | 0;\r\n                  } while ((k | 0) != 40);\r\n                  i = r;\r\n                  return\r\n              } else if (k) {\r\n                  k = 0;\r\n                  do {\r\n                      b[e + (k << 1) >> 1] = Ce(c[q + (k << 2) >> 2] >> l, j) | 0;\r\n                      k = k + 1 | 0;\r\n                  } while ((k | 0) != 40);\r\n                  i = r;\r\n                  return\r\n              } else {\r\n                  k = 0;\r\n                  do {\r\n                      b[e + (k << 1) >> 1] = Ce(0, j) | 0;\r\n                      k = k + 1 | 0;\r\n                  } while ((k | 0) != 40);\r\n                  i = r;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function hc(a, d, e, f, g) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              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,\r\n                  x = 0, y = 0, z = 0;\r\n              z = i;\r\n              i = i + 160 | 0;\r\n              y = z;\r\n              v = a + 2 | 0;\r\n              w = b[a >> 1] | 0;\r\n              x = 0;\r\n              g = 5;\r\n              do {\r\n                  u = x;\r\n                  k = 0;\r\n                  while (1) {\r\n                      n = d + (u << 1) | 0;\r\n                      t = 40 - u | 0;\r\n                      h = (t + 131071 | 0) >>> 1 & 65535;\r\n                      l = d + (u + 1 << 1) | 0;\r\n                      j = Z(b[n >> 1] << 1, w) | 0;\r\n                      if (!(h << 16 >> 16)) h = v; else {\r\n                          s = 131111 - u + 131070 & 131070;\r\n                          r = u + s | 0;\r\n                          q = v;\r\n                          p = a;\r\n                          o = n;\r\n                          while (1) {\r\n                              m = o + 4 | 0;\r\n                              n = p + 4 | 0;\r\n                              j = (Z(b[l >> 1] << 1, b[q >> 1] | 0) | 0) + j | 0;\r\n                              h = h + -1 << 16 >> 16;\r\n                              j = (Z(b[m >> 1] << 1, b[n >> 1] | 0) | 0) + j | 0;\r\n                              if (!(h << 16 >> 16)) break; else {\r\n                                  l = o + 6 | 0;\r\n                                  q = p + 6 | 0;\r\n                                  p = n;\r\n                                  o = m;\r\n                              }\r\n                          }\r\n                          l = d + (r + 3 << 1) | 0;\r\n                          h = a + (s + 3 << 1) | 0;\r\n                      }\r\n                      if (!(t & 1)) j = (Z(b[l >> 1] << 1, b[h >> 1] | 0) | 0) + j | 0;\r\n                      c[y + (u << 2) >> 2] = j;\r\n                      j = (j | 0) < 0 ? 0 - j | 0 : j;\r\n                      k = (j | 0) > (k | 0) ? j : k;\r\n                      j = u + 5 | 0;\r\n                      if ((j & 65535) << 16 >> 16 < 40) u = j << 16 >> 16; else break\r\n                  }\r\n                  g = (k >> 1) + g | 0;\r\n                  x = x + 1 | 0;\r\n              } while ((x | 0) != 5);\r\n              f = ((pe(g) | 0) & 65535) - (f & 65535) | 0;\r\n              j = f << 16 >> 16;\r\n              g = 0 - j << 16;\r\n              k = g >> 16;\r\n              if ((f & 65535) << 16 >> 16 > 0) {\r\n                  h = 20;\r\n                  g = y;\r\n                  while (1) {\r\n                      y = c[g >> 2] | 0;\r\n                      f = y << j;\r\n                      b[e >> 1] = (((f >> j | 0) == (y | 0) ? f : y >> 31 ^ 2147483647) + 32768 | 0) >>> 16;\r\n                      y = c[g + 4 >> 2] | 0;\r\n                      f = y << j;\r\n                      b[e + 2 >> 1] = (((f >> j | 0) == (y | 0) ? f : y >> 31 ^ 2147483647) + 32768 | 0) >>> 16;\r\n                      h = h + -1 << 16 >> 16;\r\n                      if (!(h << 16 >> 16)) break; else {\r\n                          e = e + 4 | 0;\r\n                          g = g + 8 | 0;\r\n                      }\r\n                  }\r\n                  i = z;\r\n                  return\r\n              }\r\n              if ((g | 0) < 2031616) {\r\n                  h = 20;\r\n                  g = y;\r\n                  while (1) {\r\n                      b[e >> 1] = ((c[g >> 2] >> k) + 32768 | 0) >>> 16;\r\n                      b[e + 2 >> 1] = ((c[g + 4 >> 2] >> k) + 32768 | 0) >>> 16;\r\n                      h = h + -1 << 16 >> 16;\r\n                      if (!(h << 16 >> 16)) break; else {\r\n                          e = e + 4 | 0;\r\n                          g = g + 8 | 0;\r\n                      }\r\n                  }\r\n                  i = z;\r\n                  return\r\n              } else {\r\n                  b[e >> 1] = 0;\r\n                  y = e + 4 | 0;\r\n                  b[e + 2 >> 1] = 0;\r\n                  b[y >> 1] = 0;\r\n                  f = y + 4 | 0;\r\n                  b[y + 2 >> 1] = 0;\r\n                  b[f >> 1] = 0;\r\n                  y = f + 4 | 0;\r\n                  b[f + 2 >> 1] = 0;\r\n                  b[y >> 1] = 0;\r\n                  f = y + 4 | 0;\r\n                  b[y + 2 >> 1] = 0;\r\n                  b[f >> 1] = 0;\r\n                  y = f + 4 | 0;\r\n                  b[f + 2 >> 1] = 0;\r\n                  b[y >> 1] = 0;\r\n                  f = y + 4 | 0;\r\n                  b[y + 2 >> 1] = 0;\r\n                  b[f >> 1] = 0;\r\n                  y = f + 4 | 0;\r\n                  b[f + 2 >> 1] = 0;\r\n                  b[y >> 1] = 0;\r\n                  f = y + 4 | 0;\r\n                  b[y + 2 >> 1] = 0;\r\n                  b[f >> 1] = 0;\r\n                  y = f + 4 | 0;\r\n                  b[f + 2 >> 1] = 0;\r\n                  b[y >> 1] = 0;\r\n                  f = y + 4 | 0;\r\n                  b[y + 2 >> 1] = 0;\r\n                  b[f >> 1] = 0;\r\n                  y = f + 4 | 0;\r\n                  b[f + 2 >> 1] = 0;\r\n                  b[y >> 1] = 0;\r\n                  f = y + 4 | 0;\r\n                  b[y + 2 >> 1] = 0;\r\n                  b[f >> 1] = 0;\r\n                  y = f + 4 | 0;\r\n                  b[f + 2 >> 1] = 0;\r\n                  b[y >> 1] = 0;\r\n                  f = y + 4 | 0;\r\n                  b[y + 2 >> 1] = 0;\r\n                  b[f >> 1] = 0;\r\n                  y = f + 4 | 0;\r\n                  b[f + 2 >> 1] = 0;\r\n                  b[y >> 1] = 0;\r\n                  f = y + 4 | 0;\r\n                  b[y + 2 >> 1] = 0;\r\n                  b[f >> 1] = 0;\r\n                  y = f + 4 | 0;\r\n                  b[f + 2 >> 1] = 0;\r\n                  b[y >> 1] = 0;\r\n                  f = y + 4 | 0;\r\n                  b[y + 2 >> 1] = 0;\r\n                  b[f >> 1] = 0;\r\n                  y = f + 4 | 0;\r\n                  b[f + 2 >> 1] = 0;\r\n                  b[y >> 1] = 0;\r\n                  b[y + 2 >> 1] = 0;\r\n                  i = z;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function ic(a, b, d, e) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0, h = 0;\r\n              h = (Td(16383, b) | 0) << 16 >> 16;\r\n              b = Z(h, b << 16 >> 16) | 0;\r\n              if ((b | 0) == 1073741824) {\r\n                  c[e >> 2] = 1;\r\n                  f = 2147483647;\r\n              } else f = b << 1;\r\n              g = (Z(h, d << 16 >> 16) | 0) >> 15;\r\n              b = f + (g << 1) | 0;\r\n              if ((f ^ g | 0) > 0 & (b ^ f | 0) < 0) {\r\n                  c[e >> 2] = 1;\r\n                  b = (f >>> 31) + 2147483647 | 0;\r\n              }\r\n              f = 2147483647 - b | 0;\r\n              d = f >> 16;\r\n              b = Z(d, h) | 0;\r\n              if ((b | 0) == 1073741824) {\r\n                  c[e >> 2] = 1;\r\n                  g = 2147483647;\r\n              } else g = b << 1;\r\n              h = (Z((f >>> 1) - (d << 15) << 16 >> 16, h) | 0) >> 15;\r\n              b = g + (h << 1) | 0;\r\n              if ((g ^ h | 0) > 0 & (b ^ g | 0) < 0) {\r\n                  c[e >> 2] = 1;\r\n                  b = (g >>> 31) + 2147483647 | 0;\r\n              }\r\n              g = b >> 16;\r\n              h = a >> 16;\r\n              d = Z(g, h) | 0;\r\n              d = (d | 0) == 1073741824 ? 2147483647 : d << 1;\r\n              f = (Z((b >>> 1) - (g << 15) << 16 >> 16, h) | 0) >> 15;\r\n              e = (f << 1) + d | 0;\r\n              e = (f ^ d | 0) > 0 & (e ^ d | 0) < 0 ? (d >>> 31) + 2147483647 | 0 : e;\r\n              h = (Z(g, (a >>> 1) - (h << 15) << 16 >> 16) | 0) >> 15;\r\n              a = e + (h << 1) | 0;\r\n              a = (e ^ h | 0) > 0 & (a ^ e | 0) < 0 ? (e >>> 31) + 2147483647 | 0 : a;\r\n              e = a << 2;\r\n              return ((e >> 2 | 0) == (a | 0) ? e : a >> 31 ^ 2147483647) | 0\r\n          }\r\n\r\n          function jc(a, d) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              var e = 0, f = 0, g = 0, h = 0;\r\n              if (!a) {\r\n                  h = -1;\r\n                  return h | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              e = Je(192) | 0;\r\n              if (!e) {\r\n                  h = -1;\r\n                  return h | 0\r\n              }\r\n              f = e + 176 | 0;\r\n              b[f >> 1] = 0;\r\n              b[f + 2 >> 1] = 0;\r\n              b[f + 4 >> 1] = 0;\r\n              b[f + 6 >> 1] = 0;\r\n              b[f + 8 >> 1] = 0;\r\n              b[f + 10 >> 1] = 0;\r\n              f = e;\r\n              g = d;\r\n              h = f + 20 | 0;\r\n              do {\r\n                  b[f >> 1] = b[g >> 1] | 0;\r\n                  f = f + 2 | 0;\r\n                  g = g + 2 | 0;\r\n              } while ((f | 0) < (h | 0));\r\n              f = e + 20 | 0;\r\n              g = d;\r\n              h = f + 20 | 0;\r\n              do {\r\n                  b[f >> 1] = b[g >> 1] | 0;\r\n                  f = f + 2 | 0;\r\n                  g = g + 2 | 0;\r\n              } while ((f | 0) < (h | 0));\r\n              f = e + 40 | 0;\r\n              g = d;\r\n              h = f + 20 | 0;\r\n              do {\r\n                  b[f >> 1] = b[g >> 1] | 0;\r\n                  f = f + 2 | 0;\r\n                  g = g + 2 | 0;\r\n              } while ((f | 0) < (h | 0));\r\n              f = e + 60 | 0;\r\n              g = d;\r\n              h = f + 20 | 0;\r\n              do {\r\n                  b[f >> 1] = b[g >> 1] | 0;\r\n                  f = f + 2 | 0;\r\n                  g = g + 2 | 0;\r\n              } while ((f | 0) < (h | 0));\r\n              f = e + 80 | 0;\r\n              g = d;\r\n              h = f + 20 | 0;\r\n              do {\r\n                  b[f >> 1] = b[g >> 1] | 0;\r\n                  f = f + 2 | 0;\r\n                  g = g + 2 | 0;\r\n              } while ((f | 0) < (h | 0));\r\n              f = e + 100 | 0;\r\n              g = d;\r\n              h = f + 20 | 0;\r\n              do {\r\n                  b[f >> 1] = b[g >> 1] | 0;\r\n                  f = f + 2 | 0;\r\n                  g = g + 2 | 0;\r\n              } while ((f | 0) < (h | 0));\r\n              f = e + 120 | 0;\r\n              g = d;\r\n              h = f + 20 | 0;\r\n              do {\r\n                  b[f >> 1] = b[g >> 1] | 0;\r\n                  f = f + 2 | 0;\r\n                  g = g + 2 | 0;\r\n              } while ((f | 0) < (h | 0));\r\n              f = e + 140 | 0;\r\n              g = d;\r\n              h = f + 20 | 0;\r\n              do {\r\n                  b[f >> 1] = b[g >> 1] | 0;\r\n                  f = f + 2 | 0;\r\n                  g = g + 2 | 0;\r\n              } while ((f | 0) < (h | 0));\r\n              f = e + 160 | 0;\r\n              h = f + 20 | 0;\r\n              do {\r\n                  b[f >> 1] = 0;\r\n                  f = f + 2 | 0;\r\n              } while ((f | 0) < (h | 0));\r\n              b[e + 188 >> 1] = 7;\r\n              b[e + 190 >> 1] = 32767;\r\n              c[a >> 2] = e;\r\n              h = 0;\r\n              return h | 0\r\n          }\r\n\r\n          function kc(a, c) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              var d = 0, e = 0, f = 0;\r\n              if (!a) {\r\n                  f = -1;\r\n                  return f | 0\r\n              }\r\n              d = a + 176 | 0;\r\n              b[d >> 1] = 0;\r\n              b[d + 2 >> 1] = 0;\r\n              b[d + 4 >> 1] = 0;\r\n              b[d + 6 >> 1] = 0;\r\n              b[d + 8 >> 1] = 0;\r\n              b[d + 10 >> 1] = 0;\r\n              d = a;\r\n              e = c;\r\n              f = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = b[e >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  e = e + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              d = a + 20 | 0;\r\n              e = c;\r\n              f = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = b[e >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  e = e + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              d = a + 40 | 0;\r\n              e = c;\r\n              f = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = b[e >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  e = e + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              d = a + 60 | 0;\r\n              e = c;\r\n              f = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = b[e >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  e = e + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              d = a + 80 | 0;\r\n              e = c;\r\n              f = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = b[e >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  e = e + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              d = a + 100 | 0;\r\n              e = c;\r\n              f = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = b[e >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  e = e + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              d = a + 120 | 0;\r\n              e = c;\r\n              f = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = b[e >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  e = e + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              d = a + 140 | 0;\r\n              e = c;\r\n              f = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = b[e >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  e = e + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              d = a + 160 | 0;\r\n              f = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = 0;\r\n                  d = d + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              b[a + 188 >> 1] = 7;\r\n              b[a + 190 >> 1] = 32767;\r\n              f = 1;\r\n              return f | 0\r\n          }\r\n\r\n          function lc(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Ke(b);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function mc(a, d, e, f, g, h) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              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,\r\n                  y = 0, z = 0, A = 0, B = 0, C = 0, D = 0;\r\n              C = i;\r\n              i = i + 112 | 0;\r\n              z = C + 80 | 0;\r\n              A = C + 60 | 0;\r\n              B = C + 40 | 0;\r\n              y = C;\r\n              if (d << 16 >> 16 == 0 ? (j = a + 178 | 0, (b[j >> 1] | 0) != 0) : 0) {\r\n                  B = a + 180 | 0;\r\n                  h = a + 182 | 0;\r\n                  e = j;\r\n                  B = b[B >> 1] | 0;\r\n                  f = c[g >> 2] | 0;\r\n                  A = f + 2 | 0;\r\n                  b[f >> 1] = B;\r\n                  h = b[h >> 1] | 0;\r\n                  B = f + 4 | 0;\r\n                  b[A >> 1] = h;\r\n                  A = a + 184 | 0;\r\n                  A = b[A >> 1] | 0;\r\n                  h = f + 6 | 0;\r\n                  b[B >> 1] = A;\r\n                  B = a + 186 | 0;\r\n                  B = b[B >> 1] | 0;\r\n                  a = f + 8 | 0;\r\n                  b[h >> 1] = B;\r\n                  e = b[e >> 1] | 0;\r\n                  f = f + 10 | 0;\r\n                  c[g >> 2] = f;\r\n                  b[a >> 1] = e;\r\n                  i = C;\r\n                  return\r\n              }\r\n              s = y + 36 | 0;\r\n              t = y + 32 | 0;\r\n              u = y + 28 | 0;\r\n              v = y + 24 | 0;\r\n              w = y + 20 | 0;\r\n              x = y + 16 | 0;\r\n              p = y + 12 | 0;\r\n              q = y + 8 | 0;\r\n              r = y + 4 | 0;\r\n              d = y;\r\n              j = d + 40 | 0;\r\n              do {\r\n                  c[d >> 2] = 0;\r\n                  d = d + 4 | 0;\r\n              } while ((d | 0) < (j | 0));\r\n              o = 7;\r\n              d = 0;\r\n              while (1) {\r\n                  n = b[a + 160 + (o << 1) >> 1] | 0;\r\n                  j = n << 16 >> 16;\r\n                  if (n << 16 >> 16 < 0) j = ~((j ^ -4) >> 2); else j = j >>> 2;\r\n                  d = Rd(d, j & 65535, h) | 0;\r\n                  l = o * 10 | 0;\r\n                  n = 9;\r\n                  while (1) {\r\n                      m = y + (n << 2) | 0;\r\n                      k = c[m >> 2] | 0;\r\n                      D = b[a + (n + l << 1) >> 1] | 0;\r\n                      j = D + k | 0;\r\n                      if ((D ^ k | 0) > -1 & (j ^ k | 0) < 0) {\r\n                          c[h >> 2] = 1;\r\n                          j = (k >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      c[m >> 2] = j;\r\n                      if ((n | 0) > 0) n = n + -1 | 0; else break\r\n                  }\r\n                  if ((o | 0) > 0) o = o + -1 | 0; else break\r\n              }\r\n              j = d << 16 >> 16;\r\n              if (d << 16 >> 16 < 0) j = ~((j ^ -2) >> 1); else j = j >>> 1;\r\n              b[A + 18 >> 1] = (c[s >> 2] | 0) >>> 3;\r\n              b[A + 16 >> 1] = (c[t >> 2] | 0) >>> 3;\r\n              b[A + 14 >> 1] = (c[u >> 2] | 0) >>> 3;\r\n              b[A + 12 >> 1] = (c[v >> 2] | 0) >>> 3;\r\n              b[A + 10 >> 1] = (c[w >> 2] | 0) >>> 3;\r\n              b[A + 8 >> 1] = (c[x >> 2] | 0) >>> 3;\r\n              b[A + 6 >> 1] = (c[p >> 2] | 0) >>> 3;\r\n              b[A + 4 >> 1] = (c[q >> 2] | 0) >>> 3;\r\n              b[A + 2 >> 1] = (c[r >> 2] | 0) >>> 3;\r\n              b[A >> 1] = (c[y >> 2] | 0) >>> 3;\r\n              d = a + 178 | 0;\r\n              j = (((j << 16) + 167772160 | 0) >>> 16) + 128 | 0;\r\n              b[d >> 1] = j;\r\n              j = j << 16;\r\n              if ((j | 0) < 0) j = ~((j >> 16 ^ -256) >> 8); else j = j >> 24;\r\n              b[d >> 1] = j;\r\n              if ((j | 0) <= 63) {\r\n                  if ((j | 0) < 0) {\r\n                      b[d >> 1] = 0;\r\n                      j = 0;\r\n                  }\r\n              } else {\r\n                  b[d >> 1] = 63;\r\n                  j = 63;\r\n              }\r\n              D = Ge(j << 8 & 65535, 11560, h) | 0;\r\n              D = D << 16 >> 16 > 0 ? 0 : D << 16 >> 16 < -14436 ? -14436 : D;\r\n              b[f >> 1] = D;\r\n              b[f + 2 >> 1] = D;\r\n              b[f + 4 >> 1] = D;\r\n              b[f + 6 >> 1] = D;\r\n              D = ((D << 16 >> 16) * 5443 | 0) >>> 15 & 65535;\r\n              b[f + 8 >> 1] = D;\r\n              b[f + 10 >> 1] = D;\r\n              b[f + 12 >> 1] = D;\r\n              b[f + 14 >> 1] = D;\r\n              ne(A, z, 10, h);\r\n              Ae(z, 205, 10, h);\r\n              me(z, A, 10, h);\r\n              f = a + 182 | 0;\r\n              D = a + 180 | 0;\r\n              te(e, 8, A, B, f, D, h);\r\n              h = f;\r\n              f = d;\r\n              D = b[D >> 1] | 0;\r\n              e = c[g >> 2] | 0;\r\n              B = e + 2 | 0;\r\n              b[e >> 1] = D;\r\n              h = b[h >> 1] | 0;\r\n              D = e + 4 | 0;\r\n              b[B >> 1] = h;\r\n              B = a + 184 | 0;\r\n              B = b[B >> 1] | 0;\r\n              h = e + 6 | 0;\r\n              b[D >> 1] = B;\r\n              a = a + 186 | 0;\r\n              a = b[a >> 1] | 0;\r\n              D = e + 8 | 0;\r\n              b[h >> 1] = a;\r\n              a = b[f >> 1] | 0;\r\n              e = e + 10 | 0;\r\n              c[g >> 2] = e;\r\n              b[D >> 1] = a;\r\n              i = C;\r\n              return\r\n          }\r\n\r\n          function nc(a, d, f, g) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              var h = 0, j = 0, k = 0, l = 0, m = 0, n = 0;\r\n              n = i;\r\n              i = i + 16 | 0;\r\n              k = n + 2 | 0;\r\n              m = n;\r\n              l = a + 176 | 0;\r\n              j = (e[l >> 1] | 0) + 1 | 0;\r\n              j = (j & 65535 | 0) == 8 ? 0 : j & 65535;\r\n              b[l >> 1] = j;\r\n              j = a + ((j << 16 >> 16) * 10 << 1) | 0;\r\n              h = j + 20 | 0;\r\n              do {\r\n                  b[j >> 1] = b[d >> 1] | 0;\r\n                  j = j + 2 | 0;\r\n                  d = d + 2 | 0;\r\n              } while ((j | 0) < (h | 0));\r\n              d = 0;\r\n              h = 160;\r\n              while (1) {\r\n                  j = b[f >> 1] | 0;\r\n                  d = (Z(j << 1, j) | 0) + d | 0;\r\n                  if ((d | 0) < 0) {\r\n                      d = 2147483647;\r\n                      break\r\n                  }\r\n                  h = h + -1 << 16 >> 16;\r\n                  if (!(h << 16 >> 16)) break; else f = f + 2 | 0;\r\n              }\r\n              de(d, k, m, g);\r\n              d = b[k >> 1] | 0;\r\n              k = d << 16 >> 16;\r\n              f = k << 10;\r\n              if ((f | 0) != (k << 26 >> 16 | 0)) {\r\n                  c[g >> 2] = 1;\r\n                  f = d << 16 >> 16 > 0 ? 32767 : -32768;\r\n              }\r\n              b[a + 160 + (b[l >> 1] << 1) >> 1] = (((b[m >> 1] | 0) >>> 5) + f << 16) + -558432256 >> 17;\r\n              i = n;\r\n              return\r\n          }\r\n\r\n          function oc(a, d, e, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              var g = 0, h = 0, i = 0;\r\n              h = a + 190 | 0;\r\n              i = Rd(b[h >> 1] | 0, 1, f) | 0;\r\n              b[h >> 1] = i;\r\n              g = a + 188 | 0;\r\n              do if (!(d << 16 >> 16)) {\r\n                  a = b[g >> 1] | 0;\r\n                  if (!(a << 16 >> 16)) {\r\n                      b[h >> 1] = 0;\r\n                      c[e >> 2] = 8;\r\n                      a = 1;\r\n                      break\r\n                  }\r\n                  h = (a & 65535) + 65535 & 65535;\r\n                  b[g >> 1] = h;\r\n                  if ((Rd(i, h, f) | 0) << 16 >> 16 < 30) {\r\n                      c[e >> 2] = 8;\r\n                      a = 0;\r\n                  } else a = 0;\r\n              } else {\r\n                  b[g >> 1] = 7;\r\n                  a = 0;\r\n              } while (0);\r\n              return a | 0\r\n          }\r\n\r\n          function pc(a, b, c, d, e, f, g, h) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              if (!(f << 16 >> 16)) {\r\n                  f = a << 16 >> 16;\r\n                  if (((f << 16) + -5570560 | 0) < 65536) {\r\n                      b = (f * 3 | 0) + -58 + (b << 16 >> 16) | 0;\r\n                      b = b & 65535;\r\n                      return b | 0\r\n                  } else {\r\n                      b = f + 112 | 0;\r\n                      b = b & 65535;\r\n                      return b | 0\r\n                  }\r\n              }\r\n              if (!(g << 16 >> 16)) {\r\n                  h = (a & 65535) - (d & 65535) << 16;\r\n                  b = (b << 16 >> 16) + 2 + (h >> 15) + (h >> 16) | 0;\r\n                  b = b & 65535;\r\n                  return b | 0\r\n              }\r\n              d = d << 16 >> 16;\r\n              d = (((c & 65535) - d << 16) + -327680 | 0) > 0 ? d + 5 & 65535 : c;\r\n              e = e << 16 >> 16;\r\n              c = a << 16 >> 16;\r\n              d = (((e - (d & 65535) << 16) + -262144 | 0) > 0 ? e + 65532 & 65535 : d) << 16 >> 16;\r\n              e = d * 196608 | 0;\r\n              a = e + -393216 >> 16;\r\n              f = ((b & 65535) << 16) + (c * 196608 | 0) >> 16;\r\n              if (!(a - f & 32768)) {\r\n                  b = c + 5 - d | 0;\r\n                  b = b & 65535;\r\n                  return b | 0\r\n              }\r\n              if ((e + 196608 >> 16 | 0) > (f | 0)) {\r\n                  b = f + 3 - a | 0;\r\n                  b = b & 65535;\r\n                  return b | 0\r\n              } else {\r\n                  b = c + 11 - d | 0;\r\n                  b = b & 65535;\r\n                  return b | 0\r\n              }\r\n              return 0\r\n          }\r\n\r\n          function qc(a, b, c, d, e) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              e = a << 16 >> 16;\r\n              do if (!(d << 16 >> 16)) if (a << 16 >> 16 < 95) {\r\n                  e = ((e * 393216 | 0) + -6881280 >> 16) + (b << 16 >> 16) | 0;\r\n                  break\r\n              } else {\r\n                  e = e + 368 | 0;\r\n                  break\r\n              } else e = ((((e - (c & 65535) | 0) * 393216 | 0) + 196608 | 0) >>> 16) + (b & 65535) | 0; while (0);\r\n              return e & 65535 | 0\r\n          }\r\n\r\n          function rc(d, f, g, h) {\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0;\r\n              i = c[h + 96 >> 2] | 0;\r\n              if (d >>> 0 < 8) {\r\n                  m = (c[h + 100 >> 2] | 0) + (d << 2) | 0;\r\n                  l = c[m >> 2] | 0;\r\n                  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;\r\n                  l = i + (d << 1) | 0;\r\n                  h = b[l >> 1] | 0;\r\n                  if ((h + -7 | 0) > 4) {\r\n                      i = 4;\r\n                      k = 4;\r\n                      d = 1;\r\n                      while (1) {\r\n                          n = b[f + (b[(c[m >> 2] | 0) + (i << 1) >> 1] << 1) >> 1] | 0;\r\n                          h = g + (d << 16 >> 16) | 0;\r\n                          a[h >> 0] = n;\r\n                          n = e[f + (b[(c[m >> 2] | 0) + ((k | 1) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 1 | n & 65535;\r\n                          a[h >> 0] = n;\r\n                          n = e[f + (b[(c[m >> 2] | 0) + ((k | 2) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 2 | n;\r\n                          a[h >> 0] = n;\r\n                          n = e[f + (b[(c[m >> 2] | 0) + ((k | 3) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 3 | n;\r\n                          a[h >> 0] = n;\r\n                          n = e[f + (b[(c[m >> 2] | 0) + (k + 4 << 16 >> 16 << 16 >> 16 << 1) >> 1] << 1) >> 1] << 4 | n;\r\n                          a[h >> 0] = n;\r\n                          n = e[f + (b[(c[m >> 2] | 0) + (k + 5 << 16 >> 16 << 16 >> 16 << 1) >> 1] << 1) >> 1] << 5 | n;\r\n                          a[h >> 0] = n;\r\n                          n = e[f + (b[(c[m >> 2] | 0) + (k + 6 << 16 >> 16 << 16 >> 16 << 1) >> 1] << 1) >> 1] << 6 | n;\r\n                          a[h >> 0] = n;\r\n                          j = k + 8 << 16 >> 16;\r\n                          d = d + 1 << 16 >> 16;\r\n                          a[h >> 0] = e[f + (b[(c[m >> 2] | 0) + (k + 7 << 16 >> 16 << 16 >> 16 << 1) >> 1] << 1) >> 1] << 7 | n;\r\n                          i = j << 16 >> 16;\r\n                          h = b[l >> 1] | 0;\r\n                          if ((i | 0) >= (h + -7 | 0)) break; else k = j;\r\n                      }\r\n                  } else {\r\n                      j = 4;\r\n                      d = 1;\r\n                  }\r\n                  l = h + 4 & 7;\r\n                  if (!l) return;\r\n                  i = g + (d << 16 >> 16) | 0;\r\n                  a[i >> 0] = 0;\r\n                  h = 0;\r\n                  k = 0;\r\n                  d = 0;\r\n                  while (1) {\r\n                      k = (e[f + (b[(c[m >> 2] | 0) + (j << 16 >> 16 << 1) >> 1] << 1) >> 1] & 255) << h | k & 255;\r\n                      a[i >> 0] = k;\r\n                      d = d + 1 << 16 >> 16;\r\n                      h = d << 16 >> 16;\r\n                      if ((h | 0) >= (l | 0)) break; else j = j + 1 << 16 >> 16;\r\n                  }\r\n                  return\r\n              }\r\n              if ((d | 0) == 15) {\r\n                  a[g >> 0] = 15;\r\n                  return\r\n              }\r\n              a[g >> 0] = b[f >> 1] << 4 | d | b[f + 2 >> 1] << 5 | b[f + 4 >> 1] << 6 | b[f + 6 >> 1] << 7;\r\n              h = i + (d << 1) | 0;\r\n              d = b[h >> 1] | 0;\r\n              i = ((d & 65535) << 16) + 262144 >> 16;\r\n              m = i & -8;\r\n              k = (m + 524281 | 0) >>> 3 & 65535;\r\n              if (k << 16 >> 16 > 0) {\r\n                  i = ((i & -8) + 524281 | 0) >>> 3;\r\n                  l = ((i << 3) + 524280 & 524280) + 12 | 0;\r\n                  j = 1;\r\n                  d = f + 8 | 0;\r\n                  while (1) {\r\n                      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;\r\n                      if (k << 16 >> 16 > 1) {\r\n                          k = k + -1 << 16 >> 16;\r\n                          j = j + 1 << 16 >> 16;\r\n                          d = d + 16 | 0;\r\n                      } else break\r\n                  }\r\n                  d = b[h >> 1] | 0;\r\n                  j = (i << 16) + 65536 >> 16;\r\n              } else {\r\n                  l = 4;\r\n                  j = 1;\r\n              }\r\n              d = (0 - m | 4) + (d & 65535) << 16;\r\n              k = d >> 16;\r\n              if (!k) return;\r\n              j = g + j | 0;\r\n              a[j >> 0] = 0;\r\n              if ((d | 0) > 0) {\r\n                  d = 0;\r\n                  i = 0;\r\n                  h = 0;\r\n              } else return;\r\n              do {\r\n                  i = i & 255 | b[f + (l + d << 1) >> 1] << d;\r\n                  a[j >> 0] = i;\r\n                  h = h + 1 << 16 >> 16;\r\n                  d = h << 16 >> 16;\r\n              } while ((d | 0) < (k | 0));\r\n              return\r\n          }\r\n\r\n          function sc(d, f, g, h) {\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0;\r\n              o = c[h + 100 >> 2] | 0;\r\n              n = c[h + 96 >> 2] | 0;\r\n              a[g >> 0] = d & 15;\r\n              n = n + (d << 1) | 0;\r\n              i = b[n >> 1] | 0;\r\n              if (d >>> 0 >= 8) {\r\n                  l = ((i & 65535) << 16) + -458752 | 0;\r\n                  if ((l | 0) > 0) {\r\n                      m = 1;\r\n                      k = f;\r\n                      while (1) {\r\n                          f = k + 16 | 0;\r\n                          h = m + 1 << 16 >> 16;\r\n                          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;\r\n                          l = l + -524288 & -65536;\r\n                          if ((l | 0) <= 0) break; else {\r\n                              m = h;\r\n                              k = f;\r\n                          }\r\n                      }\r\n                      i = b[n >> 1] | 0;\r\n                  } else h = 1;\r\n                  m = i & 7;\r\n                  i = g + (h << 16 >> 16) | 0;\r\n                  a[i >> 0] = 0;\r\n                  if (!m) return; else {\r\n                      j = 0;\r\n                      k = 0;\r\n                      l = 0;\r\n                      h = f;\r\n                  }\r\n                  while (1) {\r\n                      k = k & 255 | b[h >> 1] << 7 - j;\r\n                      a[i >> 0] = k;\r\n                      l = l + 1 << 16 >> 16;\r\n                      j = l << 16 >> 16;\r\n                      if ((j | 0) >= (m | 0)) break; else h = h + 2 | 0;\r\n                  }\r\n                  return\r\n              }\r\n              k = i << 16 >> 16;\r\n              if (i << 16 >> 16 > 7) {\r\n                  i = o + (d << 2) | 0;\r\n                  h = 0;\r\n                  m = 0;\r\n                  j = 1;\r\n                  while (1) {\r\n                      p = e[f + (b[(c[i >> 2] | 0) + (h << 1) >> 1] << 1) >> 1] << 7;\r\n                      k = g + (j << 16 >> 16) | 0;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 1) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 6 | p;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 2) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 5 | p;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 3) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 4 | p;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 4) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 3 | p & 240;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 5) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 2 | p;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 6) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 1 | p;\r\n                      a[k >> 0] = p;\r\n                      l = m + 8 << 16 >> 16;\r\n                      j = j + 1 << 16 >> 16;\r\n                      a[k >> 0] = p & 254 | e[f + (b[(c[i >> 2] | 0) + ((m | 7) << 16 >> 16 << 1) >> 1] << 1) >> 1];\r\n                      h = l << 16 >> 16;\r\n                      k = b[n >> 1] | 0;\r\n                      if ((h | 0) >= (k + -7 | 0)) break; else m = l;\r\n                  }\r\n              } else {\r\n                  l = 0;\r\n                  j = 1;\r\n              }\r\n              n = k & 7;\r\n              m = g + (j << 16 >> 16) | 0;\r\n              a[m >> 0] = 0;\r\n              if (!n) return;\r\n              j = o + (d << 2) | 0;\r\n              i = 0;\r\n              h = 0;\r\n              k = 0;\r\n              while (1) {\r\n                  h = (e[f + (b[(c[j >> 2] | 0) + (l << 16 >> 16 << 1) >> 1] << 1) >> 1] & 255) << 7 - i | h & 255;\r\n                  a[m >> 0] = h;\r\n                  k = k + 1 << 16 >> 16;\r\n                  i = k << 16 >> 16;\r\n                  if ((i | 0) >= (n | 0)) break; else l = l + 1 << 16 >> 16;\r\n              }\r\n              return\r\n          }\r\n\r\n          function tc(d, f, g, h) {\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0;\r\n              o = c[h + 100 >> 2] | 0;\r\n              n = c[h + 96 >> 2] | 0;\r\n              a[g >> 0] = d << 3;\r\n              n = n + (d << 1) | 0;\r\n              i = b[n >> 1] | 0;\r\n              if (d >>> 0 >= 8) {\r\n                  l = ((i & 65535) << 16) + -458752 | 0;\r\n                  if ((l | 0) > 0) {\r\n                      m = 1;\r\n                      k = f;\r\n                      while (1) {\r\n                          f = k + 16 | 0;\r\n                          h = m + 1 << 16 >> 16;\r\n                          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;\r\n                          l = l + -524288 & -65536;\r\n                          if ((l | 0) <= 0) break; else {\r\n                              m = h;\r\n                              k = f;\r\n                          }\r\n                      }\r\n                      i = b[n >> 1] | 0;\r\n                  } else h = 1;\r\n                  m = i & 7;\r\n                  i = g + (h << 16 >> 16) | 0;\r\n                  a[i >> 0] = 0;\r\n                  if (!m) return; else {\r\n                      j = 0;\r\n                      k = 0;\r\n                      l = 0;\r\n                      h = f;\r\n                  }\r\n                  while (1) {\r\n                      k = k & 255 | b[h >> 1] << 7 - j;\r\n                      a[i >> 0] = k;\r\n                      l = l + 1 << 16 >> 16;\r\n                      j = l << 16 >> 16;\r\n                      if ((j | 0) >= (m | 0)) break; else h = h + 2 | 0;\r\n                  }\r\n                  return\r\n              }\r\n              k = i << 16 >> 16;\r\n              if (i << 16 >> 16 > 7) {\r\n                  i = o + (d << 2) | 0;\r\n                  h = 0;\r\n                  m = 0;\r\n                  j = 1;\r\n                  while (1) {\r\n                      p = e[f + (b[(c[i >> 2] | 0) + (h << 1) >> 1] << 1) >> 1] << 7;\r\n                      k = g + (j << 16 >> 16) | 0;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 1) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 6 | p;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 2) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 5 | p;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 3) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 4 | p;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 4) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 3 | p & 240;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 5) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 2 | p;\r\n                      a[k >> 0] = p;\r\n                      p = e[f + (b[(c[i >> 2] | 0) + ((m | 6) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 1 | p;\r\n                      a[k >> 0] = p;\r\n                      l = m + 8 << 16 >> 16;\r\n                      j = j + 1 << 16 >> 16;\r\n                      a[k >> 0] = p & 254 | e[f + (b[(c[i >> 2] | 0) + ((m | 7) << 16 >> 16 << 1) >> 1] << 1) >> 1];\r\n                      h = l << 16 >> 16;\r\n                      k = b[n >> 1] | 0;\r\n                      if ((h | 0) >= (k + -7 | 0)) break; else m = l;\r\n                  }\r\n              } else {\r\n                  l = 0;\r\n                  j = 1;\r\n              }\r\n              n = k & 7;\r\n              m = g + (j << 16 >> 16) | 0;\r\n              a[m >> 0] = 0;\r\n              if (!n) return;\r\n              j = o + (d << 2) | 0;\r\n              i = 0;\r\n              h = 0;\r\n              k = 0;\r\n              while (1) {\r\n                  h = (e[f + (b[(c[j >> 2] | 0) + (l << 16 >> 16 << 1) >> 1] << 1) >> 1] & 255) << 7 - i | h & 255;\r\n                  a[m >> 0] = h;\r\n                  k = k + 1 << 16 >> 16;\r\n                  i = k << 16 >> 16;\r\n                  if ((i | 0) >= (n | 0)) break; else l = l + 1 << 16 >> 16;\r\n              }\r\n              return\r\n          }\r\n\r\n          function uc(a) {\r\n              a = a | 0;\r\n              var d = 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(16) | 0;\r\n              if (!d) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              ;b[d >> 1] = 0;\r\n              b[d + 2 >> 1] = 0;\r\n              b[d + 4 >> 1] = 0;\r\n              b[d + 6 >> 1] = 0;\r\n              b[d + 8 >> 1] = 0;\r\n              b[d + 10 >> 1] = 0;\r\n              b[d + 12 >> 1] = 0;\r\n              b[d + 14 >> 1] = 0;\r\n              c[a >> 2] = d;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function vc(a) {\r\n              a = a | 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              ;b[a >> 1] = 0;\r\n              b[a + 2 >> 1] = 0;\r\n              b[a + 4 >> 1] = 0;\r\n              b[a + 6 >> 1] = 0;\r\n              b[a + 8 >> 1] = 0;\r\n              b[a + 10 >> 1] = 0;\r\n              b[a + 12 >> 1] = 0;\r\n              b[a + 14 >> 1] = 0;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function wc(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Ke(b);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function xc(a, d, e, f, g) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              var h = 0, i = 0, j = 0, k = 0, l = 0;\r\n              j = d << 16 >> 16 < 2722 ? 0 : d << 16 >> 16 < 5444 ? 1 : 2;\r\n              i = Ee(e, 1, g) | 0;\r\n              l = a + 4 | 0;\r\n              if (!(e << 16 >> 16 > 200 ? i << 16 >> 16 > (b[l >> 1] | 0) : 0)) {\r\n                  i = b[a >> 1] | 0;\r\n                  if (i << 16 >> 16) {\r\n                      h = i + -1 << 16 >> 16;\r\n                      b[a >> 1] = h;\r\n                      h = h << 16 >> 16 != 0;\r\n                      k = 5;\r\n                  }\r\n              } else {\r\n                  b[a >> 1] = 8;\r\n                  h = 1;\r\n                  k = 5;\r\n              }\r\n              if ((k | 0) == 5) if ((j & 65535) < 2 & h) j = (j & 65535) + 1 & 65535;\r\n              k = a + 6 | 0;\r\n              b[k >> 1] = d;\r\n              h = Zd(k, 5) | 0;\r\n              if (!(j << 16 >> 16 != 0 | h << 16 >> 16 > 5443)) if (h << 16 >> 16 < 0) h = 16384; else {\r\n                  h = h << 16 >> 16;\r\n                  h = (((h << 18 >> 18 | 0) == (h | 0) ? h << 2 : h >>> 15 ^ 32767) << 16 >> 16) * 24660 >> 15;\r\n                  if ((h | 0) > 32767) {\r\n                      c[g >> 2] = 1;\r\n                      h = 32767;\r\n                  }\r\n                  h = 16384 - h & 65535;\r\n              } else h = 0;\r\n              i = a + 2 | 0;\r\n              if (!(b[i >> 1] | 0)) h = De(h, 1, g) | 0;\r\n              b[f >> 1] = h;\r\n              b[i >> 1] = h;\r\n              b[l >> 1] = e;\r\n              f = a + 12 | 0;\r\n              b[a + 14 >> 1] = b[f >> 1] | 0;\r\n              e = a + 10 | 0;\r\n              b[f >> 1] = b[e >> 1] | 0;\r\n              a = a + 8 | 0;\r\n              b[e >> 1] = b[a >> 1] | 0;\r\n              b[a >> 1] = b[k >> 1] | 0;\r\n              return\r\n          }\r\n\r\n          function yc(a) {\r\n              a = a | 0;\r\n              var d = 0, e = 0, f = 0, g = 0, h = 0, i = 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(68) | 0;\r\n              f = d;\r\n              if (!d) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[d + 28 >> 2] = 0;\r\n              g = d + 64 | 0;\r\n              c[g >> 2] = 0;\r\n              h = d + 32 | 0;\r\n              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) {\r\n                  e = d + 32 | 0;\r\n                  do {\r\n                      b[d >> 1] = 0;\r\n                      d = d + 2 | 0;\r\n                  } while ((d | 0) < (e | 0));\r\n                  Ud(h) | 0;\r\n                  Ud(i) | 0;\r\n                  vc(c[g >> 2] | 0) | 0;\r\n                  c[a >> 2] = f;\r\n                  a = 0;\r\n                  return a | 0\r\n              }\r\n              wc(g);\r\n              Ke(d);\r\n              a = -1;\r\n              return a | 0\r\n          }\r\n\r\n          function zc(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              wc(b + 64 | 0);\r\n              Ke(c[a >> 2] | 0);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function Ac(a) {\r\n              a = a | 0;\r\n              var d = 0, e = 0, f = 0;\r\n              if (!a) {\r\n                  f = -1;\r\n                  return f | 0\r\n              }\r\n              d = a + 32 | 0;\r\n              e = a;\r\n              f = e + 32 | 0;\r\n              do {\r\n                  b[e >> 1] = 0;\r\n                  e = e + 2 | 0;\r\n              } while ((e | 0) < (f | 0));\r\n              Ud(d) | 0;\r\n              Ud(a + 48 | 0) | 0;\r\n              vc(c[a + 64 >> 2] | 0) | 0;\r\n              f = 0;\r\n              return f | 0\r\n          }\r\n\r\n          function Bc(a, d, f, g, h, j, k, l, m, n, o, p, q, r, s, t, u, v, w) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              p = p | 0;\r\n              q = q | 0;\r\n              r = r | 0;\r\n              s = s | 0;\r\n              t = t | 0;\r\n              u = u | 0;\r\n              v = v | 0;\r\n              w = w | 0;\r\n              var x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0;\r\n              H = i;\r\n              i = i + 48 | 0;\r\n              y = H + 34 | 0;\r\n              A = H + 32 | 0;\r\n              C = H + 30 | 0;\r\n              B = H + 28 | 0;\r\n              z = H + 18 | 0;\r\n              x = H + 8 | 0;\r\n              D = H + 6 | 0;\r\n              E = H + 4 | 0;\r\n              F = H + 2 | 0;\r\n              G = H;\r\n              if (d) {\r\n                  o = a + 32 | 0;\r\n                  Vd(o, d, h, y, A, D, E, w);\r\n                  do if ((d | 0) != 7) {\r\n                      Vb(d, j, k, l, m, n, z, x, G, F, w);\r\n                      if ((d | 0) == 5) {\r\n                          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);\r\n                          break\r\n                      } else {\r\n                          a = od(d, b[y >> 1] | 0, b[A >> 1] | 0, z, x, p, s, t, C, B, v, w) | 0;\r\n                          j = c[u >> 2] | 0;\r\n                          c[u >> 2] = j + 2;\r\n                          b[j >> 1] = a;\r\n                          break\r\n                      }\r\n                  } else {\r\n                      b[t >> 1] = Cc(k, m, w) | 0;\r\n                      a = md(7, b[y >> 1] | 0, b[A >> 1] | 0, t, C, B, c[v + 68 >> 2] | 0, w) | 0;\r\n                      j = c[u >> 2] | 0;\r\n                      c[u >> 2] = j + 2;\r\n                      b[j >> 1] = a;\r\n                  } while (0);\r\n                  Wd(o, b[C >> 1] | 0, b[B >> 1] | 0);\r\n                  i = H;\r\n                  return\r\n              }\r\n              if (!(o << 16 >> 16)) {\r\n                  Vd(a + 48 | 0, 0, h, y, A, D, E, w);\r\n                  Vb(0, j, k, l, m, n, z, x, G, F, w);\r\n                  Wb(j, D, E, w);\r\n                  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;\r\n                  b[c[a + 28 >> 2] >> 1] = j;\r\n                  i = H;\r\n                  return\r\n              }\r\n              o = c[u >> 2] | 0;\r\n              c[u >> 2] = o + 2;\r\n              c[a + 28 >> 2] = o;\r\n              o = a + 48 | 0;\r\n              f = a + 32 | 0;\r\n              q = f;\r\n              q = e[q >> 1] | e[q + 2 >> 1] << 16;\r\n              f = f + 4 | 0;\r\n              f = e[f >> 1] | e[f + 2 >> 1] << 16;\r\n              u = o;\r\n              r = u;\r\n              b[r >> 1] = q;\r\n              b[r + 2 >> 1] = q >>> 16;\r\n              u = u + 4 | 0;\r\n              b[u >> 1] = f;\r\n              b[u + 2 >> 1] = f >>> 16;\r\n              u = a + 40 | 0;\r\n              f = u;\r\n              f = e[f >> 1] | e[f + 2 >> 1] << 16;\r\n              u = u + 4 | 0;\r\n              u = e[u >> 1] | e[u + 2 >> 1] << 16;\r\n              r = a + 56 | 0;\r\n              q = r;\r\n              b[q >> 1] = f;\r\n              b[q + 2 >> 1] = f >>> 16;\r\n              r = r + 4 | 0;\r\n              b[r >> 1] = u;\r\n              b[r + 2 >> 1] = u >>> 16;\r\n              r = a + 2 | 0;\r\n              Vd(o, 0, h, a, r, D, E, w);\r\n              Vb(0, j, k, l, m, n, a + 18 | 0, a + 8 | 0, G, F, w);\r\n              l = (e[F >> 1] | 0) + 1 | 0;\r\n              u = b[G >> 1] | 0;\r\n              q = l << 16 >> 16;\r\n              if ((l & 65535) << 16 >> 16 < 0) {\r\n                  v = 0 - q << 16;\r\n                  if ((v | 0) < 983040) v = u << 16 >> 16 >> (v >> 16) & 65535; else v = 0;\r\n              } else {\r\n                  u = u << 16 >> 16;\r\n                  v = u << q;\r\n                  if ((v << 16 >> 16 >> q | 0) == (u | 0)) v = v & 65535; else v = (u >>> 15 ^ 32767) & 65535;\r\n              }\r\n              b[t >> 1] = v;\r\n              Wb(j, a + 4 | 0, a + 6 | 0, w);\r\n              id(o, b[a >> 1] | 0, b[r >> 1] | 0, b[F >> 1] | 0, b[G >> 1] | 0, w);\r\n              i = H;\r\n              return\r\n          }\r\n\r\n          function Cc(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var e = 0, f = 0, g = 0;\r\n              f = 10;\r\n              d = a;\r\n              e = c;\r\n              a = 0;\r\n              while (1) {\r\n                  a = (Z(b[e >> 1] >> 1, b[d >> 1] | 0) | 0) + a | 0;\r\n                  a = a + (Z(b[e + 2 >> 1] >> 1, b[d + 2 >> 1] | 0) | 0) | 0;\r\n                  a = a + (Z(b[e + 4 >> 1] >> 1, b[d + 4 >> 1] | 0) | 0) | 0;\r\n                  a = a + (Z(b[e + 6 >> 1] >> 1, b[d + 6 >> 1] | 0) | 0) | 0;\r\n                  f = f + -1 << 16 >> 16;\r\n                  if (!(f << 16 >> 16)) break; else {\r\n                      d = d + 8 | 0;\r\n                      e = e + 8 | 0;\r\n                  }\r\n              }\r\n              d = a << 1;\r\n              f = pe(d | 1) | 0;\r\n              g = f << 16 >> 16;\r\n              d = (f << 16 >> 16 < 17 ? d >> 17 - g : d << g + -17) & 65535;\r\n              if (d << 16 >> 16 < 1) {\r\n                  c = 0;\r\n                  return c | 0\r\n              } else {\r\n                  f = 20;\r\n                  e = c;\r\n                  a = 0;\r\n              }\r\n              while (1) {\r\n                  c = b[e >> 1] >> 1;\r\n                  c = ((Z(c, c) | 0) >>> 2) + a | 0;\r\n                  a = b[e + 2 >> 1] >> 1;\r\n                  a = c + ((Z(a, a) | 0) >>> 2) | 0;\r\n                  f = f + -1 << 16 >> 16;\r\n                  if (!(f << 16 >> 16)) break; else e = e + 4 | 0;\r\n              }\r\n              a = a << 3;\r\n              f = pe(a) | 0;\r\n              c = f << 16 >> 16;\r\n              d = Td(d, (f << 16 >> 16 < 16 ? a >> 16 - c : a << c + -16) & 65535) | 0;\r\n              c = (g << 16) + 327680 - (c << 16) | 0;\r\n              a = c >> 16;\r\n              if ((c | 0) > 65536) a = d << 16 >> 16 >> a + -1; else a = d << 16 >> 16 << 1 - a;\r\n              c = a & 65535;\r\n              return c | 0\r\n          }\r\n\r\n          function Dc(a, d, e, f, g, h) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0;\r\n              c[h >> 2] = 0;\r\n              m = g << 16 >> 16;\r\n              k = m >>> 2 & 65535;\r\n              o = k << 16 >> 16 == 0;\r\n              if (o) j = 0; else {\r\n                  l = k;\r\n                  i = e;\r\n                  j = 0;\r\n                  while (1) {\r\n                      p = b[i >> 1] | 0;\r\n                      p = (Z(p, p) | 0) + j | 0;\r\n                      j = b[i + 2 >> 1] | 0;\r\n                      j = p + (Z(j, j) | 0) | 0;\r\n                      p = b[i + 4 >> 1] | 0;\r\n                      p = j + (Z(p, p) | 0) | 0;\r\n                      j = b[i + 6 >> 1] | 0;\r\n                      j = p + (Z(j, j) | 0) | 0;\r\n                      l = l + -1 << 16 >> 16;\r\n                      if (!(l << 16 >> 16)) break; else i = i + 8 | 0;\r\n                  }\r\n              }\r\n              if (!((j >>> 31 ^ 1) & (j | 0) < 1073741824)) {\r\n                  j = m >>> 1 & 65535;\r\n                  if (!(j << 16 >> 16)) j = 1; else {\r\n                      i = j;\r\n                      l = e;\r\n                      j = 0;\r\n                      while (1) {\r\n                          p = b[l >> 1] >> 2;\r\n                          p = (Z(p, p) | 0) + j | 0;\r\n                          j = b[l + 2 >> 1] >> 2;\r\n                          j = p + (Z(j, j) | 0) | 0;\r\n                          i = i + -1 << 16 >> 16;\r\n                          if (!(i << 16 >> 16)) break; else l = l + 4 | 0;\r\n                      }\r\n                      j = j << 1 | 1;\r\n                  }\r\n                  p = (pe(j) | 0) << 16 >> 16;\r\n                  n = p + 65532 & 65535;\r\n                  p = Ce(j << p, h) | 0;\r\n              } else {\r\n                  m = j << 1 | 1;\r\n                  p = pe(m) | 0;\r\n                  n = p;\r\n                  p = Ce(m << (p << 16 >> 16), h) | 0;\r\n              }\r\n              c[h >> 2] = 0;\r\n              do if (!(g << 16 >> 16)) {\r\n                  j = 1;\r\n                  q = 14;\r\n              } else {\r\n                  m = g;\r\n                  l = d;\r\n                  j = e;\r\n                  g = 0;\r\n                  while (1) {\r\n                      r = Z(b[j >> 1] | 0, b[l >> 1] | 0) | 0;\r\n                      i = r + g | 0;\r\n                      if ((r ^ g | 0) > 0 & (i ^ g | 0) < 0) break;\r\n                      m = m + -1 << 16 >> 16;\r\n                      if (!(m << 16 >> 16)) {\r\n                          q = 13;\r\n                          break\r\n                      } else {\r\n                          l = l + 2 | 0;\r\n                          j = j + 2 | 0;\r\n                          g = i;\r\n                      }\r\n                  }\r\n                  if ((q | 0) == 13) {\r\n                      j = i << 1 | 1;\r\n                      q = 14;\r\n                      break\r\n                  }\r\n                  c[h >> 2] = 1;\r\n                  if (o) j = 1; else {\r\n                      j = d;\r\n                      i = 0;\r\n                      while (1) {\r\n                          i = (Z(b[e >> 1] >> 2, b[j >> 1] | 0) | 0) + i | 0;\r\n                          i = i + (Z(b[e + 2 >> 1] >> 2, b[j + 2 >> 1] | 0) | 0) | 0;\r\n                          i = i + (Z(b[e + 4 >> 1] >> 2, b[j + 4 >> 1] | 0) | 0) | 0;\r\n                          i = i + (Z(b[e + 6 >> 1] >> 2, b[j + 6 >> 1] | 0) | 0) | 0;\r\n                          k = k + -1 << 16 >> 16;\r\n                          if (!(k << 16 >> 16)) break; else {\r\n                              j = j + 8 | 0;\r\n                              e = e + 8 | 0;\r\n                          }\r\n                      }\r\n                      j = i << 1 | 1;\r\n                  }\r\n                  e = (pe(j) | 0) << 16 >> 16;\r\n                  i = e + 65532 & 65535;\r\n                  e = Ce(j << e, h) | 0;\r\n              } while (0);\r\n              if ((q | 0) == 14) {\r\n                  e = pe(j) | 0;\r\n                  i = e;\r\n                  e = Ce(j << (e << 16 >> 16), h) | 0;\r\n              }\r\n              b[f >> 1] = p;\r\n              j = n << 16 >> 16;\r\n              b[f + 2 >> 1] = 15 - j;\r\n              b[f + 4 >> 1] = e;\r\n              i = i << 16 >> 16;\r\n              b[f + 6 >> 1] = 15 - i;\r\n              if (e << 16 >> 16 < 4) {\r\n                  r = 0;\r\n                  return r | 0\r\n              }\r\n              i = De(Td(e << 16 >> 16 >>> 1 & 65535, p) | 0, i - j & 65535, h) | 0;\r\n              i = i << 16 >> 16 > 19661 ? 19661 : i;\r\n              if ((a | 0) != 7) {\r\n                  r = i;\r\n                  return r | 0\r\n              }\r\n              r = i & 65532;\r\n              return r | 0\r\n          }\r\n\r\n          function Ec(a, d, e, f, g, h, i) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              var j = 0, k = 0, l = 0, m = 0, n = 0, o = 0;\r\n              k = (f & 65535) + 65535 & 65535;\r\n              if (k << 16 >> 16 > g << 16 >> 16) {\r\n                  n = f + -1 << 16 >> 16 << 16 >> 16;\r\n                  f = -2147483648;\r\n                  while (1) {\r\n                      l = c[a + (0 - n << 2) >> 2] | 0;\r\n                      j = l << 1;\r\n                      l = (j >> 1 | 0) == (l | 0) ? j : l >> 31 ^ 2147483647;\r\n                      j = c[a + (~n << 2) >> 2] | 0;\r\n                      m = l - j | 0;\r\n                      if (((m ^ l) & (l ^ j) | 0) < 0) {\r\n                          c[i >> 2] = 1;\r\n                          m = (l >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      l = c[a + (1 - n << 2) >> 2] | 0;\r\n                      j = m - l | 0;\r\n                      if (((j ^ m) & (l ^ m) | 0) < 0) {\r\n                          c[i >> 2] = 1;\r\n                          j = (m >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      m = Gc(j) | 0;\r\n                      f = (m | 0) < (f | 0) ? f : m;\r\n                      k = k + -1 << 16 >> 16;\r\n                      if (k << 16 >> 16 <= g << 16 >> 16) {\r\n                          g = f;\r\n                          break\r\n                      } else n = n + -1 | 0;\r\n                  }\r\n              } else g = -2147483648;\r\n              a = e << 16 >> 16 > 0;\r\n              if (a) {\r\n                  f = 0;\r\n                  j = d;\r\n                  k = 0;\r\n                  while (1) {\r\n                      m = b[j >> 1] | 0;\r\n                      m = Z(m, m) | 0;\r\n                      if ((m | 0) != 1073741824) {\r\n                          l = (m << 1) + k | 0;\r\n                          if ((m ^ k | 0) > 0 & (l ^ k | 0) < 0) {\r\n                              c[i >> 2] = 1;\r\n                              k = (k >>> 31) + 2147483647 | 0;\r\n                          } else k = l;\r\n                      } else {\r\n                          c[i >> 2] = 1;\r\n                          k = 2147483647;\r\n                      }\r\n                      f = f + 1 << 16 >> 16;\r\n                      if (f << 16 >> 16 >= e << 16 >> 16) break; else j = j + 2 | 0;\r\n                  }\r\n                  if (a) {\r\n                      a = 0;\r\n                      n = d;\r\n                      f = d + -2 | 0;\r\n                      j = 0;\r\n                      while (1) {\r\n                          m = Z(b[f >> 1] | 0, b[n >> 1] | 0) | 0;\r\n                          if ((m | 0) != 1073741824) {\r\n                              l = (m << 1) + j | 0;\r\n                              if ((m ^ j | 0) > 0 & (l ^ j | 0) < 0) {\r\n                                  c[i >> 2] = 1;\r\n                                  j = (j >>> 31) + 2147483647 | 0;\r\n                              } else j = l;\r\n                          } else {\r\n                              c[i >> 2] = 1;\r\n                              j = 2147483647;\r\n                          }\r\n                          a = a + 1 << 16 >> 16;\r\n                          if (a << 16 >> 16 >= e << 16 >> 16) break; else {\r\n                              n = n + 2 | 0;\r\n                              f = f + 2 | 0;\r\n                          }\r\n                      }\r\n                  } else j = 0;\r\n              } else {\r\n                  k = 0;\r\n                  j = 0;\r\n              }\r\n              f = k << 1;\r\n              f = (f >> 1 | 0) == (k | 0) ? f : k >> 31 ^ 2147483647;\r\n              e = j << 1;\r\n              e = (e >> 1 | 0) == (j | 0) ? e : j >> 31 ^ 2147483647;\r\n              k = f - e | 0;\r\n              if (((k ^ f) & (e ^ f) | 0) < 0) {\r\n                  c[i >> 2] = 1;\r\n                  k = (f >>> 31) + 2147483647 | 0;\r\n              }\r\n              a = Gc(k) | 0;\r\n              n = ((pe(g) | 0) & 65535) + 65535 | 0;\r\n              k = n << 16 >> 16;\r\n              if ((n & 65535) << 16 >> 16 > 0) {\r\n                  f = g << k;\r\n                  if ((f >> k | 0) != (g | 0)) f = g >> 31 ^ 2147483647;\r\n              } else {\r\n                  k = 0 - k << 16;\r\n                  if ((k | 0) < 2031616) f = g >> (k >> 16); else f = 0;\r\n              }\r\n              m = pe(a) | 0;\r\n              j = m << 16 >> 16;\r\n              if (m << 16 >> 16 > 0) {\r\n                  k = a << j;\r\n                  if ((k >> j | 0) == (a | 0)) o = 33; else {\r\n                      k = a >> 31 ^ 2147483647;\r\n                      o = 33;\r\n                  }\r\n              } else {\r\n                  k = 0 - j << 16;\r\n                  if ((k | 0) < 2031616) {\r\n                      k = a >> (k >> 16);\r\n                      o = 33;\r\n                  } else l = 0;\r\n              }\r\n              if ((o | 0) == 33) if (k >>> 0 > 65535) l = Td(f >>> 16 & 65535, k >>> 16 & 65535) | 0; else l = 0;\r\n              k = m & 65535;\r\n              o = (n & 65535) - k | 0;\r\n              f = o & 65535;\r\n              if (!(o & 32768)) {\r\n                  i = De(l, f, i) | 0;\r\n                  b[h >> 1] = i;\r\n                  return 0\r\n              }\r\n              if (f << 16 >> 16 != -32768) {\r\n                  i = k - n | 0;\r\n                  j = i << 16 >> 16;\r\n                  if ((i & 65535) << 16 >> 16 < 0) {\r\n                      j = 0 - j << 16;\r\n                      if ((j | 0) >= 983040) {\r\n                          i = 0;\r\n                          b[h >> 1] = i;\r\n                          return 0\r\n                      }\r\n                      i = l << 16 >> 16 >> (j >> 16) & 65535;\r\n                      b[h >> 1] = i;\r\n                      return 0\r\n                  }\r\n              } else j = 32767;\r\n              f = l << 16 >> 16;\r\n              k = f << j;\r\n              if ((k << 16 >> 16 >> j | 0) == (f | 0)) {\r\n                  i = k & 65535;\r\n                  b[h >> 1] = i;\r\n                  return 0\r\n              }\r\n              i = (f >>> 15 ^ 32767) & 65535;\r\n              b[h >> 1] = i;\r\n              return 0\r\n          }\r\n\r\n          function Fc(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              if (d << 16 >> 16) c = c << 16 >> 16 << 1 & 65535;\r\n              if (c << 16 >> 16 < 0) {\r\n                  a = a + -2 | 0;\r\n                  c = (c & 65535) + 6 & 65535;\r\n              }\r\n              d = c << 16 >> 16;\r\n              e = 6 - d << 16 >> 16;\r\n              c = (Z(b[3468 + (d << 1) >> 1] | 0, b[a >> 1] | 0) | 0) + 16384 | 0;\r\n              c = c + (Z(b[3468 + (e << 1) >> 1] | 0, b[a + 2 >> 1] | 0) | 0) | 0;\r\n              c = c + (Z(b[3468 + (d + 6 << 1) >> 1] | 0, b[a + -2 >> 1] | 0) | 0) | 0;\r\n              c = c + (Z(b[3468 + (e + 6 << 1) >> 1] | 0, b[a + 4 >> 1] | 0) | 0) | 0;\r\n              c = (Z(b[3468 + (d + 12 << 1) >> 1] | 0, b[a + -4 >> 1] | 0) | 0) + c | 0;\r\n              c = c + (Z(b[3468 + (e + 12 << 1) >> 1] | 0, b[a + 6 >> 1] | 0) | 0) | 0;\r\n              d = c + (Z(b[3468 + (d + 18 << 1) >> 1] | 0, b[a + -6 >> 1] | 0) | 0) | 0;\r\n              return (d + (Z(b[3468 + (e + 18 << 1) >> 1] | 0, b[a + 8 >> 1] | 0) | 0) | 0) >>> 15 & 65535 | 0\r\n          }\r\n\r\n          function Gc(a) {\r\n              a = a | 0;\r\n              a = a - (a >>> 31) | 0;\r\n              return a >> 31 ^ a | 0\r\n          }\r\n\r\n          function Hc(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0, h = 0, i = 0, j = 0;\r\n              if (!(a << 16 >> 16)) return; else {\r\n                  f = 3518;\r\n                  g = 3538;\r\n                  e = d;\r\n              }\r\n              while (1) {\r\n                  e = e + 2 | 0;\r\n                  c = c + 2 | 0;\r\n                  j = b[c >> 1] | 0;\r\n                  i = b[f >> 1] | 0;\r\n                  d = Z(i, j) | 0;\r\n                  d = (d | 0) == 1073741824 ? 2147483647 : d << 1;\r\n                  j = (Z(b[g >> 1] | 0, j) | 0) >> 15;\r\n                  h = (j << 1) + d | 0;\r\n                  h = (d ^ j | 0) > 0 & (h ^ d | 0) < 0 ? (d >>> 31) + 2147483647 | 0 : h;\r\n                  i = (Z(i, b[e >> 1] | 0) | 0) >> 15;\r\n                  d = h + (i << 1) | 0;\r\n                  d = (h ^ i | 0) > 0 & (d ^ h | 0) < 0 ? (h >>> 31) + 2147483647 | 0 : d;\r\n                  b[c >> 1] = d >>> 16;\r\n                  b[e >> 1] = (d >>> 1) - (d >> 16 << 15);\r\n                  a = a + -1 << 16 >> 16;\r\n                  if (!(a << 16 >> 16)) break; else {\r\n                      f = f + 2 | 0;\r\n                      g = g + 2 | 0;\r\n                  }\r\n              }\r\n              return\r\n          }\r\n\r\n          function Ic(a, b, d) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              d = d | 0;\r\n              var e = 0, f = 0;\r\n              e = a & 65535;\r\n              f = e << 16;\r\n              b = b << 16 >> 16;\r\n              a = (b << 1) + f | 0;\r\n              if (!((b ^ f | 0) > 0 & (a ^ f | 0) < 0)) {\r\n                  f = a;\r\n                  return f | 0\r\n              }\r\n              c[d >> 2] = 1;\r\n              f = (e >>> 15) + 2147483647 | 0;\r\n              return f | 0\r\n          }\r\n\r\n          function Jc(a) {\r\n              a = a | 0;\r\n              var d = 0, e = 0, f = 0;\r\n              if (!a) {\r\n                  f = -1;\r\n                  return f | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(22) | 0;\r\n              if (!d) {\r\n                  f = -1;\r\n                  return f | 0\r\n              }\r\n              b[d >> 1] = 4096;\r\n              e = d + 2 | 0;\r\n              f = e + 20 | 0;\r\n              do {\r\n                  b[e >> 1] = 0;\r\n                  e = e + 2 | 0;\r\n              } while ((e | 0) < (f | 0));\r\n              c[a >> 2] = d;\r\n              f = 0;\r\n              return f | 0\r\n          }\r\n\r\n          function Kc(a) {\r\n              a = a | 0;\r\n              var c = 0;\r\n              if (!a) {\r\n                  c = -1;\r\n                  return c | 0\r\n              }\r\n              b[a >> 1] = 4096;\r\n              a = a + 2 | 0;\r\n              c = a + 20 | 0;\r\n              do {\r\n                  b[a >> 1] = 0;\r\n                  a = a + 2 | 0;\r\n              } while ((a | 0) < (c | 0));\r\n              c = 0;\r\n              return c | 0\r\n          }\r\n\r\n          function Lc(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Ke(b);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function Mc(a, c, d, f, g, h) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              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,\r\n                  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;\r\n              K = i;\r\n              i = i + 96 | 0;\r\n              I = K + 66 | 0;\r\n              J = K + 44 | 0;\r\n              H = K + 22 | 0;\r\n              k = K;\r\n              D = c + 2 | 0;\r\n              G = d + 2 | 0;\r\n              F = (b[G >> 1] << 1) + (e[D >> 1] << 16) | 0;\r\n              j = Gc(F) | 0;\r\n              j = ic(j, b[c >> 1] | 0, b[d >> 1] | 0, h) | 0;\r\n              if ((F | 0) > 0) j = Oc(j) | 0;\r\n              B = j >> 16;\r\n              b[g >> 1] = Ce(j, h) | 0;\r\n              v = j >> 20;\r\n              E = I + 2 | 0;\r\n              b[E >> 1] = v;\r\n              F = J + 2 | 0;\r\n              b[F >> 1] = (j >>> 5) - (v << 15);\r\n              v = Z(B, B) | 0;\r\n              v = (v | 0) == 1073741824 ? 2147483647 : v << 1;\r\n              B = (Z((j >>> 1) - (B << 15) << 16 >> 16, B) | 0) >> 15;\r\n              C = B << 1;\r\n              A = C + v | 0;\r\n              A = (B ^ v | 0) > 0 & (A ^ v | 0) < 0 ? (v >>> 31) + 2147483647 | 0 : A;\r\n              C = A + C | 0;\r\n              C = 2147483647 - (Gc((A ^ B | 0) > 0 & (C ^ A | 0) < 0 ? (A >>> 31) + 2147483647 | 0 : C) | 0) | 0;\r\n              A = C >> 16;\r\n              B = b[c >> 1] | 0;\r\n              v = Z(A, B) | 0;\r\n              v = (v | 0) == 1073741824 ? 2147483647 : v << 1;\r\n              B = (Z((C >>> 1) - (A << 15) << 16 >> 16, B) | 0) >> 15;\r\n              C = (B << 1) + v | 0;\r\n              C = (B ^ v | 0) > 0 & (C ^ v | 0) < 0 ? (v >>> 31) + 2147483647 | 0 : C;\r\n              A = (Z(b[d >> 1] | 0, A) | 0) >> 15;\r\n              v = C + (A << 1) | 0;\r\n              v = (C ^ A | 0) > 0 & (v ^ C | 0) < 0 ? (C >>> 31) + 2147483647 | 0 : v;\r\n              C = pe(v) | 0;\r\n              v = v << (C << 16 >> 16);\r\n              A = H + 2 | 0;\r\n              B = k + 2 | 0;\r\n              l = v;\r\n              v = (v >>> 1) - (v >> 16 << 15) | 0;\r\n              w = k + 4 | 0;\r\n              x = H + 4 | 0;\r\n              y = 2;\r\n              z = 2;\r\n              while (1) {\r\n                  u = l >>> 16;\r\n                  j = u & 65535;\r\n                  r = v & 65535;\r\n                  s = z + -1 | 0;\r\n                  n = I + (s << 1) | 0;\r\n                  t = J + (s << 1) | 0;\r\n                  q = 1;\r\n                  p = n;\r\n                  o = t;\r\n                  m = D;\r\n                  k = G;\r\n                  l = 0;\r\n                  while (1) {\r\n                      L = b[m >> 1] | 0;\r\n                      M = ((Z(b[o >> 1] | 0, L) | 0) >> 15) + l | 0;\r\n                      l = b[p >> 1] | 0;\r\n                      l = M + (Z(l, L) | 0) + ((Z(l, b[k >> 1] | 0) | 0) >> 15) | 0;\r\n                      q = q + 1 << 16 >> 16;\r\n                      if ((q << 16 >> 16 | 0) >= (z | 0)) break; else {\r\n                          p = p + -2 | 0;\r\n                          o = o + -2 | 0;\r\n                          m = m + 2 | 0;\r\n                          k = k + 2 | 0;\r\n                      }\r\n                  }\r\n                  M = (e[c + (z << 1) >> 1] << 16) + (l << 5) + (b[d + (z << 1) >> 1] << 1) | 0;\r\n                  l = ic(Gc(M) | 0, j, r, h) | 0;\r\n                  if ((M | 0) > 0) l = Oc(l) | 0;\r\n                  k = C << 16 >> 16;\r\n                  if (C << 16 >> 16 > 0) {\r\n                      j = l << k;\r\n                      if ((j >> k | 0) != (l | 0)) j = l >> 31 ^ 2147483647;\r\n                  } else {\r\n                      k = 0 - k << 16;\r\n                      if ((k | 0) < 2031616) j = l >> (k >> 16); else j = 0;\r\n                  }\r\n                  q = j >> 16;\r\n                  if ((z | 0) < 5) b[g + (s << 1) >> 1] = (j + 32768 | 0) >>> 16;\r\n                  M = (j >>> 16) - (j >>> 31) | 0;\r\n                  if (((M << 16 >> 31 ^ M) & 65535) << 16 >> 16 > 32750) {\r\n                      j = 16;\r\n                      break\r\n                  }\r\n                  o = (j >>> 1) - (q << 15) << 16 >> 16;\r\n                  p = 1;\r\n                  l = t;\r\n                  k = A;\r\n                  m = B;\r\n                  while (1) {\r\n                      L = (Z(b[l >> 1] | 0, q) | 0) >> 15;\r\n                      t = b[n >> 1] | 0;\r\n                      M = (Z(t, o) | 0) >> 15;\r\n                      t = Z(t, q) | 0;\r\n                      M = t + L + (b[J + (p << 1) >> 1] | 0) + (b[I + (p << 1) >> 1] << 15) + M | 0;\r\n                      b[k >> 1] = M >>> 15;\r\n                      b[m >> 1] = M & 32767;\r\n                      p = p + 1 | 0;\r\n                      if ((p & 65535) << 16 >> 16 == y << 16 >> 16) break; else {\r\n                          n = n + -2 | 0;\r\n                          l = l + -2 | 0;\r\n                          k = k + 2 | 0;\r\n                          m = m + 2 | 0;\r\n                      }\r\n                  }\r\n                  b[x >> 1] = j >> 20;\r\n                  b[w >> 1] = (j >>> 5) - (b[H + (z << 1) >> 1] << 15);\r\n                  L = Z(q, q) | 0;\r\n                  L = (L | 0) == 1073741824 ? 2147483647 : L << 1;\r\n                  j = (Z(o, q) | 0) >> 15;\r\n                  M = j << 1;\r\n                  k = M + L | 0;\r\n                  k = (j ^ L | 0) > 0 & (k ^ L | 0) < 0 ? (L >>> 31) + 2147483647 | 0 : k;\r\n                  M = k + M | 0;\r\n                  M = 2147483647 - (Gc((k ^ j | 0) > 0 & (M ^ k | 0) < 0 ? (k >>> 31) + 2147483647 | 0 : M) | 0) | 0;\r\n                  k = M >> 16;\r\n                  j = u << 16 >> 16;\r\n                  j = ((Z(k, v << 16 >> 16) | 0) >> 15) + (Z(k, j) | 0) + ((Z((M >>> 1) - (k << 15) << 16 >> 16, j) | 0) >> 15) << 1;\r\n                  k = (pe(j) | 0) << 16 >> 16;\r\n                  j = j << k;\r\n                  M = z << 1;\r\n                  Oe(E | 0, A | 0, M | 0) | 0;\r\n                  Oe(F | 0, B | 0, M | 0) | 0;\r\n                  z = z + 1 | 0;\r\n                  if ((z | 0) >= 11) {\r\n                      j = 20;\r\n                      break\r\n                  } else {\r\n                      C = k + (C & 65535) & 65535;\r\n                      l = j;\r\n                      v = (j >> 1) - (j >> 16 << 15) | 0;\r\n                      w = w + 2 | 0;\r\n                      x = x + 2 | 0;\r\n                      y = y + 1 << 16 >> 16;\r\n                  }\r\n              }\r\n              if ((j | 0) == 16) {\r\n                  j = f + 22 | 0;\r\n                  do {\r\n                      b[f >> 1] = b[a >> 1] | 0;\r\n                      f = f + 2 | 0;\r\n                      a = a + 2 | 0;\r\n                  } while ((f | 0) < (j | 0));\r\n                  M = g;\r\n                  L = M;\r\n                  b[L >> 1] = 0;\r\n                  b[L + 2 >> 1] = 0 >>> 16;\r\n                  M = M + 4 | 0;\r\n                  b[M >> 1] = 0;\r\n                  b[M + 2 >> 1] = 0 >>> 16;\r\n                  i = K;\r\n                  return 0\r\n              } else if ((j | 0) == 20) {\r\n                  b[f >> 1] = 4096;\r\n                  M = ((b[F >> 1] | 0) + 8192 + (b[E >> 1] << 15) | 0) >>> 14 & 65535;\r\n                  b[f + 2 >> 1] = M;\r\n                  b[a + 2 >> 1] = M;\r\n                  M = ((b[J + 4 >> 1] | 0) + 8192 + (b[I + 4 >> 1] << 15) | 0) >>> 14 & 65535;\r\n                  b[f + 4 >> 1] = M;\r\n                  b[a + 4 >> 1] = M;\r\n                  M = ((b[J + 6 >> 1] | 0) + 8192 + (b[I + 6 >> 1] << 15) | 0) >>> 14 & 65535;\r\n                  b[f + 6 >> 1] = M;\r\n                  b[a + 6 >> 1] = M;\r\n                  M = ((b[J + 8 >> 1] | 0) + 8192 + (b[I + 8 >> 1] << 15) | 0) >>> 14 & 65535;\r\n                  b[f + 8 >> 1] = M;\r\n                  b[a + 8 >> 1] = M;\r\n                  M = ((b[J + 10 >> 1] | 0) + 8192 + (b[I + 10 >> 1] << 15) | 0) >>> 14 & 65535;\r\n                  b[f + 10 >> 1] = M;\r\n                  b[a + 10 >> 1] = M;\r\n                  M = ((b[J + 12 >> 1] | 0) + 8192 + (b[I + 12 >> 1] << 15) | 0) >>> 14 & 65535;\r\n                  b[f + 12 >> 1] = M;\r\n                  b[a + 12 >> 1] = M;\r\n                  M = ((b[J + 14 >> 1] | 0) + 8192 + (b[I + 14 >> 1] << 15) | 0) >>> 14 & 65535;\r\n                  b[f + 14 >> 1] = M;\r\n                  b[a + 14 >> 1] = M;\r\n                  M = ((b[J + 16 >> 1] | 0) + 8192 + (b[I + 16 >> 1] << 15) | 0) >>> 14 & 65535;\r\n                  b[f + 16 >> 1] = M;\r\n                  b[a + 16 >> 1] = M;\r\n                  M = ((b[J + 18 >> 1] | 0) + 8192 + (b[I + 18 >> 1] << 15) | 0) >>> 14 & 65535;\r\n                  b[f + 18 >> 1] = M;\r\n                  b[a + 18 >> 1] = M;\r\n                  M = ((b[J + 20 >> 1] | 0) + 8192 + (b[I + 20 >> 1] << 15) | 0) >>> 14 & 65535;\r\n                  b[f + 20 >> 1] = M;\r\n                  b[a + 20 >> 1] = M;\r\n                  i = K;\r\n                  return 0\r\n              }\r\n              return 0\r\n          }\r\n\r\n          function Nc(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              e = a >> 16;\r\n              b[c >> 1] = e;\r\n              b[d >> 1] = (a >>> 1) - (e << 15);\r\n              return\r\n          }\r\n\r\n          function Oc(a) {\r\n              a = a | 0;\r\n              return ((a | 0) == -2147483648 ? 2147483647 : 0 - a | 0) | 0\r\n          }\r\n\r\n          function Pc(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              b = Je(4) | 0;\r\n              if (!b) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[b >> 2] = 0;\r\n              if (!((Jc(b) | 0) << 16 >> 16)) {\r\n                  Kc(c[b >> 2] | 0) | 0;\r\n                  c[a >> 2] = b;\r\n                  a = 0;\r\n                  return a | 0\r\n              } else {\r\n                  Lc(b);\r\n                  Ke(b);\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              return 0\r\n          }\r\n\r\n          function Qc(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Lc(b);\r\n              Ke(c[a >> 2] | 0);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function Rc(a) {\r\n              a = a | 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              Kc(c[a >> 2] | 0) | 0;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function Sc(a, b, d, e, f, g, h) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var j = 0, k = 0, l = 0, m = 0;\r\n              m = i;\r\n              i = i + 64 | 0;\r\n              l = m + 48 | 0;\r\n              k = m + 22 | 0;\r\n              j = m;\r\n              if ((b | 0) == 7) {\r\n                  d = c[g + 116 >> 2] | 0;\r\n                  Kb(e, 10, j, k, c[g + 112 >> 2] | 0, h) | 0;\r\n                  Hc(10, j, k, h);\r\n                  Mc(c[a >> 2] | 0, j, k, f + 22 | 0, l, h) | 0;\r\n                  Kb(e, 10, j, k, d, h) | 0;\r\n                  Hc(10, j, k, h);\r\n                  Mc(c[a >> 2] | 0, j, k, f + 66 | 0, l, h) | 0;\r\n                  i = m;\r\n                  return\r\n              } else {\r\n                  Kb(d, 10, j, k, c[g + 108 >> 2] | 0, h) | 0;\r\n                  Hc(10, j, k, h);\r\n                  Mc(c[a >> 2] | 0, j, k, f + 66 | 0, l, h) | 0;\r\n                  i = m;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function Tc(a, c, d, e, f, g, h, i, j, k) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              if ((d | 0) == 6) {\r\n                  b[f >> 1] = bd(a, c, e, 20, 143, 80, g, h, i, j, k) | 0;\r\n                  return\r\n              }\r\n              b[h >> 1] = 0;\r\n              b[h + 2 >> 1] = 0;\r\n              if (d >>> 0 < 2) {\r\n                  b[f >> 1] = Yc(c, d, e, 20, 143, 160, i, j, k) | 0;\r\n                  return\r\n              }\r\n              if (d >>> 0 < 6) {\r\n                  b[f >> 1] = Yc(c, d, e, 20, 143, 80, i, j, k) | 0;\r\n                  return\r\n              } else {\r\n                  b[f >> 1] = Yc(c, d, e, 18, 143, 80, i, j, k) | 0;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function Uc(a) {\r\n              a = a | 0;\r\n              var d = 0;\r\n              if ((a | 0) != 0 ? (c[a >> 2] = 0, d = Je(2) | 0, (d | 0) != 0) : 0) {\r\n                  b[d >> 1] = 0;\r\n                  c[a >> 2] = d;\r\n                  d = 0;\r\n              } else d = -1;\r\n              return d | 0\r\n          }\r\n\r\n          function Vc(a) {\r\n              a = a | 0;\r\n              if (!a) a = -1; else {\r\n                  b[a >> 1] = 0;\r\n                  a = 0;\r\n              }\r\n              return a | 0\r\n          }\r\n\r\n          function Wc(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Ke(b);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function Xc(a, c, d, f, g, h, j, k, l, m, n, o) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              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,\r\n                  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,\r\n                  T = 0, U = 0;\r\n              U = i;\r\n              i = i + 240 | 0;\r\n              u = U + 160 | 0;\r\n              v = U + 80 | 0;\r\n              O = U;\r\n              N = b[3558 + (c * 18 | 0) >> 1] | 0;\r\n              T = b[3558 + (c * 18 | 0) + 2 >> 1] | 0;\r\n              p = b[3558 + (c * 18 | 0) + 4 >> 1] | 0;\r\n              P = b[3558 + (c * 18 | 0) + 6 >> 1] | 0;\r\n              s = b[3558 + (c * 18 | 0) + 12 >> 1] | 0;\r\n              r = b[3558 + (c * 18 | 0) + 14 >> 1] | 0;\r\n              q = b[3558 + (c * 18 | 0) + 16 >> 1] | 0;\r\n              a:do switch (k << 16 >> 16) {\r\n                  case 0:\r\n                  case 80:\r\n                      if (c >>> 0 < 2 & k << 16 >> 16 == 80) {\r\n                          Q = (e[a >> 1] | 0) - (s & 65535) | 0;\r\n                          Q = (Q << 16 >> 16 | 0) < (q << 16 >> 16 | 0) ? q : Q & 65535;\r\n                          M = r << 16 >> 16;\r\n                          R = (Q & 65535) + M & 65535;\r\n                          S = R << 16 >> 16 > 143;\r\n                          Q = S ? 143 - M & 65535 : Q;\r\n                          R = S ? 143 : R;\r\n                          S = 1;\r\n                          break a\r\n                      } else {\r\n                          Q = (e[d + ((k << 16 >> 16 != 0 & 1) << 1) >> 1] | 0) - (e[3558 + (c * 18 | 0) + 8 >> 1] | 0) | 0;\r\n                          Q = (Q << 16 >> 16 | 0) < (q << 16 >> 16 | 0) ? q : Q & 65535;\r\n                          M = b[3558 + (c * 18 | 0) + 10 >> 1] | 0;\r\n                          R = (Q & 65535) + M & 65535;\r\n                          S = R << 16 >> 16 > 143;\r\n                          Q = S ? 143 - M & 65535 : Q;\r\n                          R = S ? 143 : R;\r\n                          S = 0;\r\n                          break a\r\n                      }\r\n                  default: {\r\n                      Q = (e[a >> 1] | 0) - (s & 65535) | 0;\r\n                      Q = (Q << 16 >> 16 | 0) < (q << 16 >> 16 | 0) ? q : Q & 65535;\r\n                      M = r << 16 >> 16;\r\n                      R = (Q & 65535) + M & 65535;\r\n                      S = R << 16 >> 16 > 143;\r\n                      Q = S ? 143 - M & 65535 : Q;\r\n                      R = S ? 143 : R;\r\n                      S = 1;\r\n                  }\r\n              } while (0);\r\n              L = Q & 65535;\r\n              k = L + 65532 | 0;\r\n              t = k & 65535;\r\n              K = (R & 65535) + 4 & 65535;\r\n              M = k << 16 >> 16;\r\n              k = 0 - (k & 65535) | 0;\r\n              s = k & 65535;\r\n              ec(f + (k << 16 >> 16 << 1) | 0, h, u, j);\r\n              k = j << 16 >> 16;\r\n              B = k >>> 1 & 65535;\r\n              w = B << 16 >> 16 == 0;\r\n              if (w) j = 1; else {\r\n                  j = B;\r\n                  q = u;\r\n                  d = v;\r\n                  r = 0;\r\n                  while (1) {\r\n                      J = b[q >> 1] | 0;\r\n                      b[d >> 1] = J >>> 2;\r\n                      J = (Z(J, J) | 0) + r | 0;\r\n                      r = b[q + 2 >> 1] | 0;\r\n                      b[d + 2 >> 1] = r >>> 2;\r\n                      r = J + (Z(r, r) | 0) | 0;\r\n                      j = j + -1 << 16 >> 16;\r\n                      if (!(j << 16 >> 16)) break; else {\r\n                          q = q + 4 | 0;\r\n                          d = d + 4 | 0;\r\n                      }\r\n                  }\r\n                  j = (r | 0) < 33554433;\r\n              }\r\n              J = j ? 0 : 2;\r\n              A = j ? u : v;\r\n              x = j ? u : v;\r\n              b:do if (t << 16 >> 16 <= K << 16 >> 16) {\r\n                  y = k + -1 | 0;\r\n                  G = A + (y << 1) | 0;\r\n                  H = h + (y << 1) | 0;\r\n                  I = A + (k + -2 << 1) | 0;\r\n                  D = y >>> 1;\r\n                  E = D & 65535;\r\n                  z = E << 16 >> 16 == 0;\r\n                  F = j ? 12 : 14;\r\n                  D = (D << 1) + 131070 & 131070;\r\n                  d = k + -3 - D | 0;\r\n                  C = A + (d << 1) | 0;\r\n                  D = A + (k + -4 - D << 1) | 0;\r\n                  h = h + (d << 1) | 0;\r\n                  if (!w) {\r\n                      w = M;\r\n                      while (1) {\r\n                          v = B;\r\n                          u = x;\r\n                          q = g;\r\n                          r = 0;\r\n                          j = 0;\r\n                          while (1) {\r\n                              v = v + -1 << 16 >> 16;\r\n                              k = b[u >> 1] | 0;\r\n                              r = (Z(k, b[q >> 1] | 0) | 0) + r | 0;\r\n                              k = (Z(k, k) | 0) + j | 0;\r\n                              j = b[u + 2 >> 1] | 0;\r\n                              r = r + (Z(j, b[q + 2 >> 1] | 0) | 0) | 0;\r\n                              j = k + (Z(j, j) | 0) | 0;\r\n                              if (!(v << 16 >> 16)) break; else {\r\n                                  u = u + 4 | 0;\r\n                                  q = q + 4 | 0;\r\n                              }\r\n                          }\r\n                          u = ce(j << 1, o) | 0;\r\n                          j = u >> 16;\r\n                          q = r << 1 >> 16;\r\n                          v = Z(j, q) | 0;\r\n                          v = (v | 0) == 1073741824 ? 2147483647 : v << 1;\r\n                          q = (Z((u >>> 1) - (j << 15) << 16 >> 16, q) | 0) >> 15;\r\n                          u = (q << 1) + v | 0;\r\n                          u = (q ^ v | 0) > 0 & (u ^ v | 0) < 0 ? (v >>> 31) + 2147483647 | 0 : u;\r\n                          j = (Z(j, r & 32767) | 0) >> 15;\r\n                          v = u + (j << 1) | 0;\r\n                          b[O + (w - M << 1) >> 1] = (u ^ j | 0) > 0 & (v ^ u | 0) < 0 ? (u >>> 31) + 65535 | 0 : v;\r\n                          if (t << 16 >> 16 != K << 16 >> 16) {\r\n                              s = s + -1 << 16 >> 16;\r\n                              v = b[f + (s << 16 >> 16 << 1) >> 1] | 0;\r\n                              if (z) {\r\n                                  u = y;\r\n                                  j = I;\r\n                                  r = H;\r\n                                  q = G;\r\n                              } else {\r\n                                  u = E;\r\n                                  j = I;\r\n                                  r = H;\r\n                                  q = G;\r\n                                  while (1) {\r\n                                      w = (Z(b[r >> 1] | 0, v) | 0) >> F;\r\n                                      b[q >> 1] = w + (e[j >> 1] | 0);\r\n                                      w = (Z(b[r + -2 >> 1] | 0, v) | 0) >> F;\r\n                                      b[q + -2 >> 1] = w + (e[j + -2 >> 1] | 0);\r\n                                      u = u + -1 << 16 >> 16;\r\n                                      if (!(u << 16 >> 16)) {\r\n                                          u = d;\r\n                                          j = D;\r\n                                          r = h;\r\n                                          q = C;\r\n                                          break\r\n                                      } else {\r\n                                          j = j + -4 | 0;\r\n                                          r = r + -4 | 0;\r\n                                          q = q + -4 | 0;\r\n                                      }\r\n                                  }\r\n                              }\r\n                              w = (Z(b[r >> 1] | 0, v) | 0) >> F;\r\n                              b[q >> 1] = w + (e[j >> 1] | 0);\r\n                              b[A + (u + -1 << 1) >> 1] = v >> J;\r\n                          }\r\n                          t = t + 1 << 16 >> 16;\r\n                          if (t << 16 >> 16 > K << 16 >> 16) break b; else w = t << 16 >> 16;\r\n                      }\r\n                  }\r\n                  if (z) {\r\n                      j = A + (k + -2 << 1) | 0;\r\n                      r = M;\r\n                      while (1) {\r\n                          ce(0, o) | 0;\r\n                          b[O + (r - M << 1) >> 1] = 0;\r\n                          if (t << 16 >> 16 != K << 16 >> 16) {\r\n                              s = s + -1 << 16 >> 16;\r\n                              g = b[f + (s << 16 >> 16 << 1) >> 1] | 0;\r\n                              E = (Z(b[H >> 1] | 0, g) | 0) >> F;\r\n                              b[G >> 1] = E + (e[I >> 1] | 0);\r\n                              b[j >> 1] = g >> J;\r\n                          }\r\n                          t = t + 1 << 16 >> 16;\r\n                          if (t << 16 >> 16 > K << 16 >> 16) break b; else r = t << 16 >> 16;\r\n                      }\r\n                  }\r\n                  u = A + (d + -1 << 1) | 0;\r\n                  j = M;\r\n                  while (1) {\r\n                      ce(0, o) | 0;\r\n                      b[O + (j - M << 1) >> 1] = 0;\r\n                      if (t << 16 >> 16 != K << 16 >> 16) {\r\n                          s = s + -1 << 16 >> 16;\r\n                          j = b[f + (s << 16 >> 16 << 1) >> 1] | 0;\r\n                          r = E;\r\n                          q = I;\r\n                          d = H;\r\n                          k = G;\r\n                          while (1) {\r\n                              g = (Z(b[d >> 1] | 0, j) | 0) >> F;\r\n                              b[k >> 1] = g + (e[q >> 1] | 0);\r\n                              g = (Z(b[d + -2 >> 1] | 0, j) | 0) >> F;\r\n                              b[k + -2 >> 1] = g + (e[q + -2 >> 1] | 0);\r\n                              r = r + -1 << 16 >> 16;\r\n                              if (!(r << 16 >> 16)) break; else {\r\n                                  q = q + -4 | 0;\r\n                                  d = d + -4 | 0;\r\n                                  k = k + -4 | 0;\r\n                              }\r\n                          }\r\n                          g = (Z(b[h >> 1] | 0, j) | 0) >> F;\r\n                          b[C >> 1] = g + (e[D >> 1] | 0);\r\n                          b[u >> 1] = j >> J;\r\n                      }\r\n                      t = t + 1 << 16 >> 16;\r\n                      if (t << 16 >> 16 > K << 16 >> 16) break; else j = t << 16 >> 16;\r\n                  }\r\n              } while (0);\r\n              t = Q << 16 >> 16;\r\n              d = L + 1 & 65535;\r\n              if (d << 16 >> 16 > R << 16 >> 16) h = Q; else {\r\n                  s = Q;\r\n                  k = b[O + (t - M << 1) >> 1] | 0;\r\n                  while (1) {\r\n                      r = b[O + ((d << 16 >> 16) - M << 1) >> 1] | 0;\r\n                      q = r << 16 >> 16 < k << 16 >> 16;\r\n                      s = q ? s : d;\r\n                      d = d + 1 << 16 >> 16;\r\n                      if (d << 16 >> 16 > R << 16 >> 16) {\r\n                          h = s;\r\n                          break\r\n                      } else k = q ? k : r;\r\n                  }\r\n              }\r\n              c:do if (!(S << 16 >> 16 == 0 ? h << 16 >> 16 > N << 16 >> 16 : 0)) {\r\n                  if (!(c >>> 0 < 4 & S << 16 >> 16 != 0)) {\r\n                      s = O + ((h << 16 >> 16) - M << 1) | 0;\r\n                      r = Fc(s, p, T, o) | 0;\r\n                      d = (p & 65535) + 1 & 65535;\r\n                      if (d << 16 >> 16 <= P << 16 >> 16) while (1) {\r\n                          q = Fc(s, d, T, o) | 0;\r\n                          k = q << 16 >> 16 > r << 16 >> 16;\r\n                          p = k ? d : p;\r\n                          d = d + 1 << 16 >> 16;\r\n                          if (d << 16 >> 16 > P << 16 >> 16) break; else r = k ? q : r;\r\n                      }\r\n                      if ((c + -7 | 0) >>> 0 < 2) {\r\n                          P = p << 16 >> 16 == -3;\r\n                          d = (P << 31 >> 31) + h << 16 >> 16;\r\n                          p = P ? 3 : p;\r\n                          break\r\n                      }\r\n                      switch (p << 16 >> 16) {\r\n                          case -2: {\r\n                              d = h + -1 << 16 >> 16;\r\n                              p = 1;\r\n                              break c\r\n                          }\r\n                          case 2: {\r\n                              d = h + 1 << 16 >> 16;\r\n                              p = -1;\r\n                              break c\r\n                          }\r\n                          default: {\r\n                              d = h;\r\n                              break c\r\n                          }\r\n                      }\r\n                  }\r\n                  N = b[a >> 1] | 0;\r\n                  N = ((N << 16 >> 16) - t | 0) > 5 ? t + 5 & 65535 : N;\r\n                  k = R << 16 >> 16;\r\n                  N = (k - (N << 16 >> 16) | 0) > 4 ? k + 65532 & 65535 : N;\r\n                  k = h << 16 >> 16;\r\n                  d = N << 16 >> 16;\r\n                  if ((k | 0) == (d + -1 | 0) ? 1 : h << 16 >> 16 == N << 16 >> 16) {\r\n                      s = O + (k - M << 1) | 0;\r\n                      k = Fc(s, p, T, o) | 0;\r\n                      d = (p & 65535) + 1 & 65535;\r\n                      if (d << 16 >> 16 <= P << 16 >> 16) while (1) {\r\n                          r = Fc(s, d, T, o) | 0;\r\n                          q = r << 16 >> 16 > k << 16 >> 16;\r\n                          p = q ? d : p;\r\n                          d = d + 1 << 16 >> 16;\r\n                          if (d << 16 >> 16 > P << 16 >> 16) break; else k = q ? r : k;\r\n                      }\r\n                      if ((c + -7 | 0) >>> 0 < 2) {\r\n                          P = p << 16 >> 16 == -3;\r\n                          d = (P << 31 >> 31) + h << 16 >> 16;\r\n                          p = P ? 3 : p;\r\n                          break\r\n                      }\r\n                      switch (p << 16 >> 16) {\r\n                          case -2: {\r\n                              d = h + -1 << 16 >> 16;\r\n                              p = 1;\r\n                              break c\r\n                          }\r\n                          case 2: {\r\n                              d = h + 1 << 16 >> 16;\r\n                              p = -1;\r\n                              break c\r\n                          }\r\n                          default: {\r\n                              d = h;\r\n                              break c\r\n                          }\r\n                      }\r\n                  }\r\n                  if ((k | 0) == (d + -2 | 0)) {\r\n                      d = O + (k - M << 1) | 0;\r\n                      k = Fc(d, 0, T, o) | 0;\r\n                      if ((c | 0) != 8) {\r\n                          p = 0;\r\n                          s = 1;\r\n                          while (1) {\r\n                              r = Fc(d, s, T, o) | 0;\r\n                              q = r << 16 >> 16 > k << 16 >> 16;\r\n                              p = q ? s : p;\r\n                              s = s + 1 << 16 >> 16;\r\n                              if (s << 16 >> 16 > P << 16 >> 16) break; else k = q ? r : k;\r\n                          }\r\n                          if ((c + -7 | 0) >>> 0 >= 2) switch (p << 16 >> 16) {\r\n                              case -2: {\r\n                                  d = h + -1 << 16 >> 16;\r\n                                  p = 1;\r\n                                  break c\r\n                              }\r\n                              case 2: {\r\n                                  d = h + 1 << 16 >> 16;\r\n                                  p = -1;\r\n                                  break c\r\n                              }\r\n                              default: {\r\n                                  d = h;\r\n                                  break c\r\n                              }\r\n                          }\r\n                      } else p = 0;\r\n                      P = p << 16 >> 16 == -3;\r\n                      d = (P << 31 >> 31) + h << 16 >> 16;\r\n                      p = P ? 3 : p;\r\n                      break\r\n                  }\r\n                  if ((k | 0) == (d + 1 | 0)) {\r\n                      s = O + (k - M << 1) | 0;\r\n                      d = Fc(s, p, T, o) | 0;\r\n                      k = (p & 65535) + 1 & 65535;\r\n                      if (k << 16 >> 16 <= 0) while (1) {\r\n                          q = Fc(s, k, T, o) | 0;\r\n                          r = q << 16 >> 16 > d << 16 >> 16;\r\n                          p = r ? k : p;\r\n                          k = k + 1 << 16 >> 16;\r\n                          if (k << 16 >> 16 > 0) break; else d = r ? q : d;\r\n                      }\r\n                      if ((c + -7 | 0) >>> 0 < 2) {\r\n                          P = p << 16 >> 16 == -3;\r\n                          d = (P << 31 >> 31) + h << 16 >> 16;\r\n                          p = P ? 3 : p;\r\n                          break\r\n                      }\r\n                      switch (p << 16 >> 16) {\r\n                          case -2: {\r\n                              d = h + -1 << 16 >> 16;\r\n                              p = 1;\r\n                              break c\r\n                          }\r\n                          case 2: {\r\n                              d = h + 1 << 16 >> 16;\r\n                              p = -1;\r\n                              break c\r\n                          }\r\n                          default: {\r\n                              d = h;\r\n                              break c\r\n                          }\r\n                      }\r\n                  } else {\r\n                      d = h;\r\n                      p = 0;\r\n                  }\r\n              } else {\r\n                  d = h;\r\n                  p = 0;\r\n              } while (0);\r\n              if ((c + -7 | 0) >>> 0 > 1) {\r\n                  P = a;\r\n                  a = pc(d, p, b[a >> 1] | 0, Q, R, S, c >>> 0 < 4 & 1, o) | 0;\r\n                  b[n >> 1] = a;\r\n                  b[P >> 1] = d;\r\n                  b[m >> 1] = T;\r\n                  b[l >> 1] = p;\r\n                  i = U;\r\n                  return d | 0\r\n              } else {\r\n                  o = qc(d, p, Q, S, o) | 0;\r\n                  b[n >> 1] = o;\r\n                  b[a >> 1] = d;\r\n                  b[m >> 1] = T;\r\n                  b[l >> 1] = p;\r\n                  i = U;\r\n                  return d | 0\r\n              }\r\n              return 0\r\n          }\r\n\r\n          function Yc(a, d, e, f, g, h, j, k, l) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              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,\r\n                  B = 0, C = 0, D = 0;\r\n              D = i;\r\n              i = i + 1200 | 0;\r\n              B = D + 1188 | 0;\r\n              A = D + 580 | 0;\r\n              C = D + 578 | 0;\r\n              z = D + 576 | 0;\r\n              v = D;\r\n              x = D + 582 | 0;\r\n              y = (k | 0) != 0;\r\n              do if (y) if (d >>> 0 < 2) {\r\n                  Ld(a, 1, l);\r\n                  break\r\n              } else {\r\n                  Ld(a, 0, l);\r\n                  break\r\n              } while (0);\r\n              w = g << 16 >> 16;\r\n              o = 0 - w | 0;\r\n              n = e + (o << 1) | 0;\r\n              o = o & 65535;\r\n              s = h << 16 >> 16;\r\n              do if (o << 16 >> 16 < h << 16 >> 16) {\r\n                  r = o;\r\n                  q = n;\r\n                  o = 0;\r\n                  while (1) {\r\n                      t = b[q >> 1] | 0;\r\n                      o = (Z(t << 1, t) | 0) + o | 0;\r\n                      if ((o | 0) < 0) break;\r\n                      r = r + 1 << 16 >> 16;\r\n                      if (r << 16 >> 16 >= h << 16 >> 16) {\r\n                          u = 14;\r\n                          break\r\n                      } else q = q + 2 | 0;\r\n                  }\r\n                  if ((u | 0) == 14) {\r\n                      if ((o | 0) < 1048576) {\r\n                          u = 15;\r\n                          break\r\n                      }\r\n                      Oe(x | 0, n | 0, s + w << 1 | 0) | 0;\r\n                      t = 0;\r\n                      break\r\n                  }\r\n                  m = s + w | 0;\r\n                  p = m >>> 1;\r\n                  r = p & 65535;\r\n                  if (!(r << 16 >> 16)) o = x; else {\r\n                      t = ((p << 1) + 131070 & 131070) + 2 | 0;\r\n                      s = t - w | 0;\r\n                      q = x;\r\n                      while (1) {\r\n                          b[q >> 1] = (b[n >> 1] | 0) >>> 3;\r\n                          b[q + 2 >> 1] = (b[n + 2 >> 1] | 0) >>> 3;\r\n                          r = r + -1 << 16 >> 16;\r\n                          if (!(r << 16 >> 16)) break; else {\r\n                              n = n + 4 | 0;\r\n                              q = q + 4 | 0;\r\n                          }\r\n                      }\r\n                      n = e + (s << 1) | 0;\r\n                      o = x + (t << 1) | 0;\r\n                  }\r\n                  if (!(m & 1)) t = 3; else {\r\n                      b[o >> 1] = (b[n >> 1] | 0) >>> 3;\r\n                      t = 3;\r\n                  }\r\n              } else u = 15; while (0);\r\n              if ((u | 0) == 15) {\r\n                  t = s + w | 0;\r\n                  o = t >>> 1;\r\n                  p = o & 65535;\r\n                  if (!(p << 16 >> 16)) o = x; else {\r\n                      s = ((o << 1) + 131070 & 131070) + 2 | 0;\r\n                      q = s - w | 0;\r\n                      r = x;\r\n                      while (1) {\r\n                          b[r >> 1] = b[n >> 1] << 3;\r\n                          b[r + 2 >> 1] = b[n + 2 >> 1] << 3;\r\n                          p = p + -1 << 16 >> 16;\r\n                          if (!(p << 16 >> 16)) break; else {\r\n                              n = n + 4 | 0;\r\n                              r = r + 4 | 0;\r\n                          }\r\n                      }\r\n                      n = e + (q << 1) | 0;\r\n                      o = x + (s << 1) | 0;\r\n                  }\r\n                  if (!(t & 1)) t = -3; else {\r\n                      b[o >> 1] = b[n >> 1] << 3;\r\n                      t = -3;\r\n                  }\r\n              }\r\n              s = v + (w << 2) | 0;\r\n              q = x + (w << 1) | 0;\r\n              Tb(q, h, g, f, s);\r\n              m = (d | 0) == 7 & 1;\r\n              o = f << 16 >> 16;\r\n              n = o << 2;\r\n              if ((n | 0) != (o << 18 >> 16 | 0)) {\r\n                  c[l >> 2] = 1;\r\n                  n = f << 16 >> 16 > 0 ? 32767 : -32768;\r\n              }\r\n              r = Zc(a, s, q, t, m, h, g, n & 65535, B, k, l) | 0;\r\n              o = o << 1;\r\n              p = Zc(a, s, q, t, m, h, n + 65535 & 65535, o & 65535, A, k, l) | 0;\r\n              o = Zc(a, s, q, t, m, h, o + 65535 & 65535, f, C, k, l) | 0;\r\n              if (j << 16 >> 16 == 1 & y) {\r\n                  Ec(s, q, h, g, f, z, l) | 0;\r\n                  Jd(a, b[z >> 1] | 0);\r\n              }\r\n              n = b[B >> 1] | 0;\r\n              m = b[A >> 1] | 0;\r\n              if (((n << 16 >> 16) * 55706 >> 16 | 0) >= (m << 16 >> 16 | 0)) {\r\n                  A = n;\r\n                  B = r;\r\n                  A = A << 16 >> 16;\r\n                  A = A * 55706 | 0;\r\n                  A = A >> 16;\r\n                  C = b[C >> 1] | 0;\r\n                  C = C << 16 >> 16;\r\n                  C = (A | 0) < (C | 0);\r\n                  C = C ? o : B;\r\n                  i = D;\r\n                  return C | 0\r\n              }\r\n              b[B >> 1] = m;\r\n              A = m;\r\n              B = p;\r\n              A = A << 16 >> 16;\r\n              A = A * 55706 | 0;\r\n              A = A >> 16;\r\n              C = b[C >> 1] | 0;\r\n              C = C << 16 >> 16;\r\n              C = (A | 0) < (C | 0);\r\n              C = C ? o : B;\r\n              i = D;\r\n              return C | 0\r\n          }\r\n\r\n          function Zc(a, d, e, f, g, h, i, j, k, l, m) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              var n = 0, o = 0, p = 0, q = 0, r = 0;\r\n              if (i << 16 >> 16 < j << 16 >> 16) {\r\n                  j = -2147483648;\r\n                  p = i;\r\n              } else {\r\n                  p = i;\r\n                  n = -2147483648;\r\n                  o = d + (0 - (i << 16 >> 16) << 2) | 0;\r\n                  d = i;\r\n                  while (1) {\r\n                      i = c[o >> 2] | 0;\r\n                      r = (i | 0) < (n | 0);\r\n                      d = r ? d : p;\r\n                      n = r ? n : i;\r\n                      p = p + -1 << 16 >> 16;\r\n                      if (p << 16 >> 16 < j << 16 >> 16) {\r\n                          j = n;\r\n                          p = d;\r\n                          break\r\n                      } else o = o + 4 | 0;\r\n                  }\r\n              }\r\n              d = h << 16 >> 16 >>> 2 & 65535;\r\n              if (!(d << 16 >> 16)) d = 0; else {\r\n                  n = d;\r\n                  i = e + (0 - (p << 16 >> 16) << 1) | 0;\r\n                  d = 0;\r\n                  while (1) {\r\n                      r = b[i >> 1] | 0;\r\n                      r = (Z(r, r) | 0) + d | 0;\r\n                      d = b[i + 2 >> 1] | 0;\r\n                      d = r + (Z(d, d) | 0) | 0;\r\n                      r = b[i + 4 >> 1] | 0;\r\n                      r = d + (Z(r, r) | 0) | 0;\r\n                      d = b[i + 6 >> 1] | 0;\r\n                      d = r + (Z(d, d) | 0) | 0;\r\n                      n = n + -1 << 16 >> 16;\r\n                      if (!(n << 16 >> 16)) break; else i = i + 8 | 0;\r\n                  }\r\n                  d = d << 1;\r\n              }\r\n              if (l) Kd(a, j, d, m);\r\n              d = ce(d, m) | 0;\r\n              i = g << 16 >> 16 != 0;\r\n              if (i) d = (d | 0) > 1073741823 ? 2147483647 : d << 1;\r\n              g = j >> 16;\r\n              a = d >> 16;\r\n              m = Z(a, g) | 0;\r\n              m = (m | 0) == 1073741824 ? 2147483647 : m << 1;\r\n              d = (Z((d >>> 1) - (a << 15) << 16 >> 16, g) | 0) >> 15;\r\n              r = (d << 1) + m | 0;\r\n              r = (d ^ m | 0) > 0 & (r ^ m | 0) < 0 ? (m >>> 31) + 2147483647 | 0 : r;\r\n              g = (Z(a, (j >>> 1) - (g << 15) << 16 >> 16) | 0) >> 15;\r\n              d = r + (g << 1) | 0;\r\n              d = (r ^ g | 0) > 0 & (d ^ r | 0) < 0 ? (r >>> 31) + 2147483647 | 0 : d;\r\n              if (!i) {\r\n                  b[k >> 1] = d;\r\n                  return p | 0\r\n              }\r\n              i = f << 16 >> 16;\r\n              if (f << 16 >> 16 > 0) if (f << 16 >> 16 < 31) {\r\n                  i = d >> i;\r\n                  q = 16;\r\n              } else i = 0; else {\r\n                  q = 0 - i << 16 >> 16;\r\n                  i = d << q;\r\n                  i = (i >> q | 0) == (d | 0) ? i : d >> 31 ^ 2147483647;\r\n                  q = 16;\r\n              }\r\n              if ((q | 0) == 16) {\r\n                  if ((i | 0) > 65535) {\r\n                      b[k >> 1] = 32767;\r\n                      return p | 0\r\n                  }\r\n                  if ((i | 0) < -65536) {\r\n                      b[k >> 1] = -32768;\r\n                      return p | 0\r\n                  }\r\n              }\r\n              b[k >> 1] = i >>> 1;\r\n              return p | 0\r\n          }\r\n\r\n          function _c(a) {\r\n              a = a | 0;\r\n              var d = 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(6) | 0;\r\n              if (!d) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              b[d >> 1] = 40;\r\n              b[d + 2 >> 1] = 0;\r\n              b[d + 4 >> 1] = 0;\r\n              c[a >> 2] = d;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function $c(a) {\r\n              a = a | 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              b[a >> 1] = 40;\r\n              b[a + 2 >> 1] = 0;\r\n              b[a + 4 >> 1] = 0;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function ad(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Ke(b);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function bd(a, d, e, f, g, h, j, k, l, m, n) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              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,\r\n                  D = 0, E = 0, F = 0;\r\n              F = i;\r\n              i = i + 1200 | 0;\r\n              w = F + 1186 | 0;\r\n              x = F + 1184 | 0;\r\n              E = F + 1182 | 0;\r\n              v = F;\r\n              z = F + 576 | 0;\r\n              y = g << 16 >> 16;\r\n              D = z + (y << 1) | 0;\r\n              o = (0 - y & 65535) << 16 >> 16 < h << 16 >> 16;\r\n              if (o) {\r\n                  s = 0 - g << 16 >> 16 << 16 >> 16;\r\n                  p = 0;\r\n                  do {\r\n                      r = b[e + (s << 1) >> 1] | 0;\r\n                      r = Z(r, r) | 0;\r\n                      if ((r | 0) != 1073741824) {\r\n                          q = (r << 1) + p | 0;\r\n                          if ((r ^ p | 0) > 0 & (q ^ p | 0) < 0) {\r\n                              c[n >> 2] = 1;\r\n                              p = (p >>> 31) + 2147483647 | 0;\r\n                          } else p = q;\r\n                      } else {\r\n                          c[n >> 2] = 1;\r\n                          p = 2147483647;\r\n                      }\r\n                      s = s + 1 | 0;\r\n                  } while ((s & 65535) << 16 >> 16 != h << 16 >> 16)\r\n              } else p = 0;\r\n              if ((2147483646 - p & p | 0) >= 0) if ((p | 0) == 2147483647) {\r\n                  if (o) {\r\n                      p = 0 - g << 16 >> 16 << 16 >> 16;\r\n                      do {\r\n                          b[z + (p + y << 1) >> 1] = De(b[e + (p << 1) >> 1] | 0, 3, n) | 0;\r\n                          p = p + 1 | 0;\r\n                      } while ((p & 65535) << 16 >> 16 != h << 16 >> 16)\r\n                  }\r\n              } else t = 14; else {\r\n                  c[n >> 2] = 1;\r\n                  t = 14;\r\n              }\r\n              do if ((t | 0) == 14) {\r\n                  if ((1048575 - p & p | 0) < 0) {\r\n                      c[n >> 2] = 1;\r\n                      p = (p >>> 31) + 2147483647 | 0;\r\n                  } else p = p + -1048576 | 0;\r\n                  if ((p | 0) >= 0) {\r\n                      if (!o) break;\r\n                      C = 0 - g << 16 >> 16 << 16 >> 16;\r\n                      Oe(z + (y + C << 1) | 0, e + (C << 1) | 0, (((h + g << 16 >> 16) + -1 & 65535) << 1) + 2 | 0) | 0;\r\n                      break\r\n                  }\r\n                  if (o) {\r\n                      p = 0 - g << 16 >> 16 << 16 >> 16;\r\n                      do {\r\n                          C = b[e + (p << 1) >> 1] | 0;\r\n                          b[z + (p + y << 1) >> 1] = (C << 19 >> 19 | 0) == (C | 0) ? C << 3 : C >>> 15 ^ 32767;\r\n                          p = p + 1 | 0;\r\n                      } while ((p & 65535) << 16 >> 16 != h << 16 >> 16)\r\n                  }\r\n              } while (0);\r\n              B = v + (y << 2) | 0;\r\n              Tb(D, h, g, f, B);\r\n              s = b[a >> 1] | 0;\r\n              C = a + 4 | 0;\r\n              A = k + (l << 16 >> 16 << 1) | 0;\r\n              a:do if (g << 16 >> 16 < f << 16 >> 16) u = g; else {\r\n                  if ((b[C >> 1] | 0) <= 0) {\r\n                      e = g;\r\n                      k = -2147483648;\r\n                      r = g;\r\n                      t = 3402;\r\n                      while (1) {\r\n                          Nc(c[v + (y - (e << 16 >> 16) << 2) >> 2] | 0, w, x, n);\r\n                          q = b[x >> 1] | 0;\r\n                          p = b[t >> 1] | 0;\r\n                          s = Z(p, b[w >> 1] | 0) | 0;\r\n                          if ((s | 0) == 1073741824) {\r\n                              c[n >> 2] = 1;\r\n                              o = 2147483647;\r\n                          } else o = s << 1;\r\n                          u = (Z(p, q << 16 >> 16) | 0) >> 15;\r\n                          s = o + (u << 1) | 0;\r\n                          if ((o ^ u | 0) > 0 & (s ^ o | 0) < 0) {\r\n                              c[n >> 2] = 1;\r\n                              s = (o >>> 31) + 2147483647 | 0;\r\n                          }\r\n                          q = (s | 0) < (k | 0);\r\n                          r = q ? r : e;\r\n                          e = e + -1 << 16 >> 16;\r\n                          if (e << 16 >> 16 < f << 16 >> 16) {\r\n                              u = r;\r\n                              break a\r\n                          } else {\r\n                              k = q ? k : s;\r\n                              t = t + -2 | 0;\r\n                          }\r\n                      }\r\n                  }\r\n                  k = g;\r\n                  o = -2147483648;\r\n                  r = g;\r\n                  u = 2902 + (y + 123 - (s << 16 >> 16) << 1) | 0;\r\n                  e = 3402;\r\n                  while (1) {\r\n                      Nc(c[v + (y - (k << 16 >> 16) << 2) >> 2] | 0, w, x, n);\r\n                      t = b[x >> 1] | 0;\r\n                      q = b[e >> 1] | 0;\r\n                      s = Z(q, b[w >> 1] | 0) | 0;\r\n                      if ((s | 0) == 1073741824) {\r\n                          c[n >> 2] = 1;\r\n                          p = 2147483647;\r\n                      } else p = s << 1;\r\n                      t = (Z(q, t << 16 >> 16) | 0) >> 15;\r\n                      s = p + (t << 1) | 0;\r\n                      if ((p ^ t | 0) > 0 & (s ^ p | 0) < 0) {\r\n                          c[n >> 2] = 1;\r\n                          s = (p >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      Nc(s, w, x, n);\r\n                      t = b[x >> 1] | 0;\r\n                      q = b[u >> 1] | 0;\r\n                      s = Z(q, b[w >> 1] | 0) | 0;\r\n                      if ((s | 0) == 1073741824) {\r\n                          c[n >> 2] = 1;\r\n                          p = 2147483647;\r\n                      } else p = s << 1;\r\n                      t = (Z(q, t << 16 >> 16) | 0) >> 15;\r\n                      s = p + (t << 1) | 0;\r\n                      if ((p ^ t | 0) > 0 & (s ^ p | 0) < 0) {\r\n                          c[n >> 2] = 1;\r\n                          s = (p >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      q = (s | 0) < (o | 0);\r\n                      r = q ? r : k;\r\n                      k = k + -1 << 16 >> 16;\r\n                      if (k << 16 >> 16 < f << 16 >> 16) {\r\n                          u = r;\r\n                          break\r\n                      } else {\r\n                          o = q ? o : s;\r\n                          u = u + -2 | 0;\r\n                          e = e + -2 | 0;\r\n                      }\r\n                  }\r\n              } while (0);\r\n              if (h << 16 >> 16 > 0) {\r\n                  k = 0;\r\n                  e = D;\r\n                  t = z + (y - (u << 16 >> 16) << 1) | 0;\r\n                  r = 0;\r\n                  p = 0;\r\n                  while (1) {\r\n                      s = b[t >> 1] | 0;\r\n                      q = Z(s, b[e >> 1] | 0) | 0;\r\n                      if ((q | 0) != 1073741824) {\r\n                          o = (q << 1) + r | 0;\r\n                          if ((q ^ r | 0) > 0 & (o ^ r | 0) < 0) {\r\n                              c[n >> 2] = 1;\r\n                              r = (r >>> 31) + 2147483647 | 0;\r\n                          } else r = o;\r\n                      } else {\r\n                          c[n >> 2] = 1;\r\n                          r = 2147483647;\r\n                      }\r\n                      o = Z(s, s) | 0;\r\n                      if ((o | 0) != 1073741824) {\r\n                          q = (o << 1) + p | 0;\r\n                          if ((o ^ p | 0) > 0 & (q ^ p | 0) < 0) {\r\n                              c[n >> 2] = 1;\r\n                              p = (p >>> 31) + 2147483647 | 0;\r\n                          } else p = q;\r\n                      } else {\r\n                          c[n >> 2] = 1;\r\n                          p = 2147483647;\r\n                      }\r\n                      k = k + 1 << 16 >> 16;\r\n                      if (k << 16 >> 16 >= h << 16 >> 16) break; else {\r\n                          e = e + 2 | 0;\r\n                          t = t + 2 | 0;\r\n                      }\r\n                  }\r\n              } else {\r\n                  r = 0;\r\n                  p = 0;\r\n              }\r\n              q = (m | 0) == 0;\r\n              if (!q) {\r\n                  Ld(d, 0, n);\r\n                  Kd(d, r, p, n);\r\n              }\r\n              o = (Ce(p, n) | 0) << 16 >> 16;\r\n              if ((o * 13107 | 0) == 1073741824) {\r\n                  c[n >> 2] = 1;\r\n                  p = 2147483647;\r\n              } else p = o * 26214 | 0;\r\n              o = r - p | 0;\r\n              if (((o ^ r) & (p ^ r) | 0) < 0) {\r\n                  c[n >> 2] = 1;\r\n                  o = (r >>> 31) + 2147483647 | 0;\r\n              }\r\n              m = Ce(o, n) | 0;\r\n              b[A >> 1] = m;\r\n              if (m << 16 >> 16 > 0) {\r\n                  o = j + 6 | 0;\r\n                  b[j + 8 >> 1] = b[o >> 1] | 0;\r\n                  m = j + 4 | 0;\r\n                  b[o >> 1] = b[m >> 1] | 0;\r\n                  o = j + 2 | 0;\r\n                  b[m >> 1] = b[o >> 1] | 0;\r\n                  b[o >> 1] = b[j >> 1] | 0;\r\n                  b[j >> 1] = u;\r\n                  b[a >> 1] = Zd(j, 5) | 0;\r\n                  b[a + 2 >> 1] = 32767;\r\n                  o = 32767;\r\n              } else {\r\n                  b[a >> 1] = u;\r\n                  a = a + 2 | 0;\r\n                  o = ((b[a >> 1] | 0) * 29491 | 0) >>> 15 & 65535;\r\n                  b[a >> 1] = o;\r\n              }\r\n              b[C >> 1] = ((Ge(o, 9830, n) | 0) & 65535) >>> 15 ^ 1;\r\n              if (q) {\r\n                  i = F;\r\n                  return u | 0\r\n              }\r\n              if ((Ge(l, 1, n) | 0) << 16 >> 16) {\r\n                  i = F;\r\n                  return u | 0\r\n              }\r\n              Ec(B, D, h, g, f, E, n) | 0;\r\n              Jd(d, b[E >> 1] | 0);\r\n              i = F;\r\n              return u | 0\r\n          }\r\n\r\n          function cd(a, b, c, d, e, f, g, h, j, k) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              var l = 0, m = 0;\r\n              k = i;\r\n              i = i + 48 | 0;\r\n              m = k + 22 | 0;\r\n              l = k;\r\n              b = a >>> 0 < 6 ? b : c;\r\n              c = f << 16 >> 16 > 0 ? 22 : 0;\r\n              a = e + (c << 1) | 0;\r\n              Ie(a, b, m);\r\n              Ie(a, d, l);\r\n              a = f << 16 >> 16;\r\n              f = j + (a << 1) | 0;\r\n              Be(m, g + (a << 1) | 0, f, 40);\r\n              He(l, f, f, 40, h, 1);\r\n              c = e + (((c << 16) + 720896 | 0) >>> 16 << 1) | 0;\r\n              Ie(c, b, m);\r\n              Ie(c, d, l);\r\n              a = (a << 16) + 2621440 >> 16;\r\n              j = j + (a << 1) | 0;\r\n              Be(m, g + (a << 1) | 0, j, 40);\r\n              He(l, j, j, 40, h, 1);\r\n              i = k;\r\n              return\r\n          }\r\n\r\n          function dd(a) {\r\n              a = a | 0;\r\n              var d = 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(12) | 0;\r\n              if (!d) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              ;b[d >> 1] = 0;\r\n              b[d + 2 >> 1] = 0;\r\n              b[d + 4 >> 1] = 0;\r\n              b[d + 6 >> 1] = 0;\r\n              b[d + 8 >> 1] = 0;\r\n              b[d + 10 >> 1] = 0;\r\n              c[a >> 2] = d;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function ed(a) {\r\n              a = a | 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              ;b[a >> 1] = 0;\r\n              b[a + 2 >> 1] = 0;\r\n              b[a + 4 >> 1] = 0;\r\n              b[a + 6 >> 1] = 0;\r\n              b[a + 8 >> 1] = 0;\r\n              b[a + 10 >> 1] = 0;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function fd(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Ke(b);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function gd(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var e = 0, f = 0, g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0;\r\n              m = a + 10 | 0;\r\n              f = b[m >> 1] | 0;\r\n              n = a + 8 | 0;\r\n              e = b[n >> 1] | 0;\r\n              if (!(d << 16 >> 16)) {\r\n                  a = e;\r\n                  l = f;\r\n                  b[m >> 1] = l;\r\n                  b[n >> 1] = a;\r\n                  return\r\n              }\r\n              i = a + 4 | 0;\r\n              j = a + 6 | 0;\r\n              k = a + 2 | 0;\r\n              h = b[j >> 1] | 0;\r\n              l = b[i >> 1] | 0;\r\n              g = d;\r\n              d = f;\r\n              while (1) {\r\n                  o = (Z(b[a >> 1] | 0, -3733) | 0) + (((l << 16 >> 16) * 7807 | 0) + ((h << 16 >> 16) * 7807 >> 15)) | 0;\r\n                  b[a >> 1] = l;\r\n                  o = o + ((Z(b[k >> 1] | 0, -3733) | 0) >> 15) | 0;\r\n                  b[k >> 1] = h;\r\n                  o = ((d << 16 >> 16) * 1899 | 0) + o + (Z(e << 16 >> 16, -3798) | 0) | 0;\r\n                  d = b[c >> 1] | 0;\r\n                  o = o + ((d << 16 >> 16) * 1899 | 0) | 0;\r\n                  b[c >> 1] = (o + 2048 | 0) >>> 12;\r\n                  f = o >>> 12;\r\n                  l = f & 65535;\r\n                  b[i >> 1] = l;\r\n                  h = (o << 3) - (f << 15) & 65535;\r\n                  b[j >> 1] = h;\r\n                  g = g + -1 << 16 >> 16;\r\n                  if (!(g << 16 >> 16)) break; else {\r\n                      o = e;\r\n                      c = c + 2 | 0;\r\n                      e = d;\r\n                      d = o;\r\n                  }\r\n              }\r\n              b[m >> 1] = e;\r\n              b[n >> 1] = d;\r\n              return\r\n          }\r\n\r\n          function hd(a, d, e, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              var g = 0, h = 0, i = 0, j = 0;\r\n              g = b[(c[f + 88 >> 2] | 0) + (a << 1) >> 1] | 0;\r\n              if (!(g << 16 >> 16)) return;\r\n              j = e;\r\n              i = c[(c[f + 92 >> 2] | 0) + (a << 2) >> 2] | 0;\r\n              while (1) {\r\n                  e = b[i >> 1] | 0;\r\n                  if (!(e << 16 >> 16)) e = 0; else {\r\n                      a = b[d >> 1] | 0;\r\n                      h = e;\r\n                      f = j + ((e << 16 >> 16) + -1 << 1) | 0;\r\n                      while (1) {\r\n                          e = a << 16 >> 16;\r\n                          b[f >> 1] = e & 1;\r\n                          h = h + -1 << 16 >> 16;\r\n                          if (!(h << 16 >> 16)) break; else {\r\n                              a = e >>> 1 & 65535;\r\n                              f = f + -2 | 0;\r\n                          }\r\n                      }\r\n                      e = b[i >> 1] | 0;\r\n                  }\r\n                  d = d + 2 | 0;\r\n                  g = g + -1 << 16 >> 16;\r\n                  if (!(g << 16 >> 16)) break; else {\r\n                      j = j + (e << 16 >> 16 << 1) | 0;\r\n                      i = i + 2 | 0;\r\n                  }\r\n              }\r\n              return\r\n          }\r\n\r\n          function id(a, d, f, g, h, j) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              var k = 0, l = 0, m = 0, n = 0, o = 0;\r\n              o = i;\r\n              i = i + 16 | 0;\r\n              m = o + 2 | 0;\r\n              n = o;\r\n              k = h << 16 >> 16;\r\n              if (h << 16 >> 16 < 1) {\r\n                  j = -5443;\r\n                  n = -32768;\r\n                  Wd(a, n, j);\r\n                  i = o;\r\n                  return\r\n              }\r\n              l = re(14, f, j) | 0;\r\n              if ((k | 0) < (l << 16 >> 16 | 0)) f = g; else {\r\n                  f = (g & 65535) + 1 & 65535;\r\n                  h = k >>> 1 & 65535;\r\n              }\r\n              g = Td(h, l & 65535) | 0;\r\n              b[n >> 1] = g;\r\n              de(g << 16 >> 16, m, n, j);\r\n              b[m >> 1] = ((((f & 65535) - (d & 65535) << 16) + -65536 | 0) >>> 16) + (e[m >> 1] | 0);\r\n              g = Ee(b[n >> 1] | 0, 5, j) | 0;\r\n              k = b[m >> 1] | 0;\r\n              g = ((k & 65535) << 10) + (g & 65535) & 65535;\r\n              if (g << 16 >> 16 > 18284) {\r\n                  j = 3037;\r\n                  n = 18284;\r\n                  Wd(a, n, j);\r\n                  i = o;\r\n                  return\r\n              }\r\n              h = b[n >> 1] | 0;\r\n              k = k << 16 >> 16;\r\n              if ((k * 24660 | 0) == 1073741824) {\r\n                  c[j >> 2] = 1;\r\n                  f = 2147483647;\r\n              } else f = k * 49320 | 0;\r\n              n = (h << 16 >> 16) * 24660 >> 15;\r\n              k = f + (n << 1) | 0;\r\n              if ((f ^ n | 0) > 0 & (k ^ f | 0) < 0) {\r\n                  c[j >> 2] = 1;\r\n                  k = (f >>> 31) + 2147483647 | 0;\r\n              }\r\n              n = k << 13;\r\n              j = Ce((n >> 13 | 0) == (k | 0) ? n : k >> 31 ^ 2147483647, j) | 0;\r\n              n = g;\r\n              Wd(a, n, j);\r\n              i = o;\r\n              return\r\n          }\r\n\r\n          function jd(a, d, f, g, h, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              p = p | 0;\r\n              q = q | 0;\r\n              r = r | 0;\r\n              s = s | 0;\r\n              t = t | 0;\r\n              u = u | 0;\r\n              v = v | 0;\r\n              w = w | 0;\r\n              x = x | 0;\r\n              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,\r\n                  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,\r\n                  aa = 0, ba = 0, ca = 0, da = 0, ea = 0, fa = 0, ga = 0, ha = 0;\r\n              ha = i;\r\n              i = i + 80 | 0;\r\n              da = ha + 66 | 0;\r\n              ea = ha + 64 | 0;\r\n              fa = ha + 62 | 0;\r\n              ga = ha + 60 | 0;\r\n              O = ha + 40 | 0;\r\n              P = ha + 20 | 0;\r\n              M = ha;\r\n              b[da >> 1] = d;\r\n              b[ea >> 1] = m;\r\n              b[fa >> 1] = n;\r\n              L = re(14, f, x) | 0;\r\n              ca = L & 65535;\r\n              b[ga >> 1] = ca;\r\n              N = re(14, n, x) | 0;\r\n              K = (e[g >> 1] | 0) + 65523 | 0;\r\n              b[M >> 1] = K;\r\n              E = (e[g + 2 >> 1] | 0) + 65522 | 0;\r\n              F = M + 2 | 0;\r\n              b[F >> 1] = E;\r\n              G = ((d & 65535) << 16) + -720896 | 0;\r\n              B = G >> 16;\r\n              G = (G >>> 15) + 15 + (e[g + 4 >> 1] | 0) | 0;\r\n              H = M + 4 | 0;\r\n              b[H >> 1] = G;\r\n              I = (e[g + 6 >> 1] | 0) + B | 0;\r\n              J = M + 6 | 0;\r\n              b[J >> 1] = I;\r\n              B = B + 1 + (e[g + 8 >> 1] | 0) | 0;\r\n              C = M + 8 | 0;\r\n              b[C >> 1] = B;\r\n              y = (e[o >> 1] | 0) + 65523 & 65535;\r\n              b[M + 10 >> 1] = y;\r\n              D = (e[o + 2 >> 1] | 0) + 65522 & 65535;\r\n              b[M + 12 >> 1] = D;\r\n              z = ((m & 65535) << 16) + -720896 | 0;\r\n              g = z >> 16;\r\n              z = (z >>> 15) + 15 + (e[o + 4 >> 1] | 0) & 65535;\r\n              b[M + 14 >> 1] = z;\r\n              A = (e[o + 6 >> 1] | 0) + g & 65535;\r\n              b[M + 16 >> 1] = A;\r\n              g = g + 1 + (e[o + 8 >> 1] | 0) & 65535;\r\n              b[M + 18 >> 1] = g;\r\n              aa = (j & 65535) - (q & 65535) << 16;\r\n              m = aa >> 16;\r\n              if ((aa | 0) > 0) {\r\n                  n = k;\r\n                  f = r << 16 >> 16 >> m & 65535;\r\n              } else {\r\n                  n = k << 16 >> 16 >> 0 - m & 65535;\r\n                  f = r;\r\n              }\r\n              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;\r\n              o = K + f & 65535;\r\n              b[M >> 1] = o;\r\n              aa = E + f & 65535;\r\n              b[F >> 1] = aa;\r\n              $ = G + f & 65535;\r\n              b[H >> 1] = $;\r\n              _ = I + f & 65535;\r\n              b[J >> 1] = _;\r\n              Y = B + f & 65535;\r\n              b[C >> 1] = Y;\r\n              m = g << 16 >> 16 > o << 16 >> 16 ? g : o;\r\n              m = A << 16 >> 16 > m << 16 >> 16 ? A : m;\r\n              m = z << 16 >> 16 > m << 16 >> 16 ? z : m;\r\n              m = D << 16 >> 16 > m << 16 >> 16 ? D : m;\r\n              m = y << 16 >> 16 > m << 16 >> 16 ? y : m;\r\n              m = Y << 16 >> 16 > m << 16 >> 16 ? Y : m;\r\n              m = _ << 16 >> 16 > m << 16 >> 16 ? _ : m;\r\n              m = $ << 16 >> 16 > m << 16 >> 16 ? $ : m;\r\n              m = (aa << 16 >> 16 > m << 16 >> 16 ? aa : m) + 1 & 65535;\r\n              g = 0;\r\n              while (1) {\r\n                  f = m - (o & 65535) | 0;\r\n                  o = f & 65535;\r\n                  n = e[h >> 1] << 16;\r\n                  f = f << 16 >> 16;\r\n                  if (o << 16 >> 16 > 0) o = o << 16 >> 16 < 31 ? n >> f : 0; else {\r\n                      aa = 0 - f << 16 >> 16;\r\n                      o = n << aa;\r\n                      o = (o >> aa | 0) == (n | 0) ? o : n >> 31 ^ 2147483647;\r\n                  }\r\n                  aa = o >> 16;\r\n                  b[O + (g << 1) >> 1] = aa;\r\n                  b[P + (g << 1) >> 1] = (o >>> 1) - (aa << 15);\r\n                  g = g + 1 | 0;\r\n                  if ((g | 0) == 5) {\r\n                      f = 5;\r\n                      n = p;\r\n                      break\r\n                  }\r\n                  o = b[M + (g << 1) >> 1] | 0;\r\n                  h = h + 2 | 0;\r\n              }\r\n              while (1) {\r\n                  g = m - (y & 65535) | 0;\r\n                  y = g & 65535;\r\n                  o = e[n >> 1] << 16;\r\n                  g = g << 16 >> 16;\r\n                  if (y << 16 >> 16 > 0) o = y << 16 >> 16 < 31 ? o >> g : 0; else {\r\n                      $ = 0 - g << 16 >> 16;\r\n                      aa = o << $;\r\n                      o = (aa >> $ | 0) == (o | 0) ? aa : o >> 31 ^ 2147483647;\r\n                  }\r\n                  aa = o >> 16;\r\n                  b[O + (f << 1) >> 1] = aa;\r\n                  b[P + (f << 1) >> 1] = (o >>> 1) - (aa << 15);\r\n                  o = f + 1 | 0;\r\n                  if ((o & 65535) << 16 >> 16 == 10) break;\r\n                  y = b[M + (o << 1) >> 1] | 0;\r\n                  f = o;\r\n                  n = n + 2 | 0;\r\n              }\r\n              Q = L << 16 >> 16;\r\n              R = b[O >> 1] | 0;\r\n              S = b[P >> 1] | 0;\r\n              T = b[O + 2 >> 1] | 0;\r\n              U = b[P + 2 >> 1] | 0;\r\n              V = b[O + 4 >> 1] | 0;\r\n              W = b[P + 4 >> 1] | 0;\r\n              X = b[O + 6 >> 1] | 0;\r\n              Y = b[P + 6 >> 1] | 0;\r\n              _ = b[O + 8 >> 1] | 0;\r\n              $ = b[P + 8 >> 1] | 0;\r\n              aa = s & 65535;\r\n              q = N << 16 >> 16;\r\n              j = b[O + 10 >> 1] | 0;\r\n              A = b[P + 10 >> 1] | 0;\r\n              z = b[O + 12 >> 1] | 0;\r\n              h = b[P + 12 >> 1] | 0;\r\n              f = b[O + 14 >> 1] | 0;\r\n              n = b[P + 14 >> 1] | 0;\r\n              g = b[O + 16 >> 1] | 0;\r\n              y = b[P + 16 >> 1] | 0;\r\n              B = b[O + 18 >> 1] | 0;\r\n              P = b[P + 18 >> 1] | 0;\r\n              m = 2147483647;\r\n              O = 0;\r\n              o = 0;\r\n              C = 782;\r\n              do {\r\n                  M = b[C >> 1] | 0;\r\n                  I = (Z(Q, b[C + 2 >> 1] | 0) | 0) >>> 15 << 16;\r\n                  p = I >> 16;\r\n                  G = M << 1;\r\n                  K = (Z(G, M) | 0) >> 16;\r\n                  r = Z(K, R) | 0;\r\n                  if ((r | 0) == 1073741824) {\r\n                      c[x >> 2] = 1;\r\n                      J = 2147483647;\r\n                  } else J = r << 1;\r\n                  N = (Z(S, K) | 0) >> 15;\r\n                  r = J + (N << 1) | 0;\r\n                  if ((J ^ N | 0) > 0 & (r ^ J | 0) < 0) {\r\n                      c[x >> 2] = 1;\r\n                      r = (J >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  K = Z(T, M) | 0;\r\n                  if ((K | 0) == 1073741824) {\r\n                      c[x >> 2] = 1;\r\n                      J = 2147483647;\r\n                  } else J = K << 1;\r\n                  N = (Z(U, M) | 0) >> 15;\r\n                  K = J + (N << 1) | 0;\r\n                  if ((J ^ N | 0) > 0 & (K ^ J | 0) < 0) {\r\n                      c[x >> 2] = 1;\r\n                      K = (J >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  I = (Z(I >> 15, p) | 0) >> 16;\r\n                  J = Z(V, I) | 0;\r\n                  if ((J | 0) == 1073741824) {\r\n                      c[x >> 2] = 1;\r\n                      H = 2147483647;\r\n                  } else H = J << 1;\r\n                  N = (Z(W, I) | 0) >> 15;\r\n                  J = H + (N << 1) | 0;\r\n                  if ((H ^ N | 0) > 0 & (J ^ H | 0) < 0) {\r\n                      c[x >> 2] = 1;\r\n                      J = (H >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  I = Z(X, p) | 0;\r\n                  if ((I | 0) == 1073741824) {\r\n                      c[x >> 2] = 1;\r\n                      H = 2147483647;\r\n                  } else H = I << 1;\r\n                  N = (Z(Y, p) | 0) >> 15;\r\n                  I = H + (N << 1) | 0;\r\n                  if ((H ^ N | 0) > 0 & (I ^ H | 0) < 0) {\r\n                      c[x >> 2] = 1;\r\n                      N = (H >>> 31) + 2147483647 | 0;\r\n                  } else N = I;\r\n                  H = (Z(G, p) | 0) >> 16;\r\n                  I = Z(_, H) | 0;\r\n                  if ((I | 0) == 1073741824) {\r\n                      c[x >> 2] = 1;\r\n                      G = 2147483647;\r\n                  } else G = I << 1;\r\n                  L = (Z($, H) | 0) >> 15;\r\n                  I = G + (L << 1) | 0;\r\n                  if ((G ^ L | 0) > 0 & (I ^ G | 0) < 0) {\r\n                      c[x >> 2] = 1;\r\n                      I = (G >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  H = b[C + 4 >> 1] | 0;\r\n                  G = b[C + 6 >> 1] | 0;\r\n                  C = C + 8 | 0;\r\n                  if ((M - aa & 65535) << 16 >> 16 < 1 ? (ba = H << 16 >> 16, H << 16 >> 16 <= s << 16 >> 16) : 0) {\r\n                      E = (Z(G << 16 >> 16, q) | 0) >>> 15 << 16;\r\n                      M = E >> 16;\r\n                      D = ba << 1;\r\n                      G = (Z(D, ba) | 0) >> 16;\r\n                      H = Z(j, G) | 0;\r\n                      if ((H | 0) == 1073741824) {\r\n                          c[x >> 2] = 1;\r\n                          F = 2147483647;\r\n                      } else F = H << 1;\r\n                      L = (Z(A, G) | 0) >> 15;\r\n                      H = F + (L << 1) | 0;\r\n                      if ((F ^ L | 0) > 0 & (H ^ F | 0) < 0) {\r\n                          c[x >> 2] = 1;\r\n                          H = (F >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      G = Z(z, ba) | 0;\r\n                      if ((G | 0) == 1073741824) {\r\n                          c[x >> 2] = 1;\r\n                          F = 2147483647;\r\n                      } else F = G << 1;\r\n                      L = (Z(h, ba) | 0) >> 15;\r\n                      G = F + (L << 1) | 0;\r\n                      if ((F ^ L | 0) > 0 & (G ^ F | 0) < 0) {\r\n                          c[x >> 2] = 1;\r\n                          L = (F >>> 31) + 2147483647 | 0;\r\n                      } else L = G;\r\n                      F = (Z(E >> 15, M) | 0) >> 16;\r\n                      G = Z(f, F) | 0;\r\n                      if ((G | 0) == 1073741824) {\r\n                          c[x >> 2] = 1;\r\n                          E = 2147483647;\r\n                      } else E = G << 1;\r\n                      p = (Z(n, F) | 0) >> 15;\r\n                      G = E + (p << 1) | 0;\r\n                      if ((E ^ p | 0) > 0 & (G ^ E | 0) < 0) {\r\n                          c[x >> 2] = 1;\r\n                          p = (E >>> 31) + 2147483647 | 0;\r\n                      } else p = G;\r\n                      G = Z(g, M) | 0;\r\n                      if ((G | 0) == 1073741824) {\r\n                          c[x >> 2] = 1;\r\n                          F = 2147483647;\r\n                      } else F = G << 1;\r\n                      E = (Z(y, M) | 0) >> 15;\r\n                      G = F + (E << 1) | 0;\r\n                      if ((F ^ E | 0) > 0 & (G ^ F | 0) < 0) {\r\n                          c[x >> 2] = 1;\r\n                          k = (F >>> 31) + 2147483647 | 0;\r\n                      } else k = G;\r\n                      F = (Z(D, M) | 0) >> 16;\r\n                      G = Z(B, F) | 0;\r\n                      if ((G | 0) == 1073741824) {\r\n                          c[x >> 2] = 1;\r\n                          E = 2147483647;\r\n                      } else E = G << 1;\r\n                      M = (Z(P, F) | 0) >> 15;\r\n                      G = E + (M << 1) | 0;\r\n                      if ((E ^ M | 0) > 0 & (G ^ E | 0) < 0) {\r\n                          c[x >> 2] = 1;\r\n                          G = (E >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      M = K + r + J + N + I + H + L + p + k + G | 0;\r\n                      N = (M | 0) < (m | 0);\r\n                      m = N ? M : m;\r\n                      o = N ? O : o;\r\n                  }\r\n                  O = O + 1 << 16 >> 16;\r\n              } while (O << 16 >> 16 < 256);\r\n              s = (o & 65535) << 18 >> 16;\r\n              kd(a, 782 + (s << 1) | 0, ca, d, t, u, x);\r\n              Vd(a, 0, l, ea, fa, da, ga, x);\r\n              l = (re(14, b[fa >> 1] | 0, x) | 0) & 65535;\r\n              kd(a, 782 + ((s | 2) << 1) | 0, l, b[ea >> 1] | 0, v, w, x);\r\n              i = ha;\r\n              return o | 0\r\n          }\r\n\r\n          function kd(a, d, f, g, h, j, k) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              var l = 0, m = 0, n = 0, o = 0;\r\n              o = i;\r\n              i = i + 16 | 0;\r\n              m = o + 2 | 0;\r\n              n = o;\r\n              b[h >> 1] = b[d >> 1] | 0;\r\n              l = b[d + 2 >> 1] | 0;\r\n              f = Z(f << 16 >> 16 << 1, l) | 0;\r\n              h = 10 - (g & 65535) | 0;\r\n              d = h & 65535;\r\n              h = h << 16 >> 16;\r\n              if (d << 16 >> 16 > 0) d = d << 16 >> 16 < 31 ? f >> h : 0; else {\r\n                  h = 0 - h << 16 >> 16;\r\n                  d = f << h;\r\n                  d = (d >> h | 0) == (f | 0) ? d : f >> 31 ^ 2147483647;\r\n              }\r\n              b[j >> 1] = d >>> 16;\r\n              de(l, m, n, k);\r\n              b[m >> 1] = (e[m >> 1] | 0) + 65524;\r\n              h = Ee(b[n >> 1] | 0, 5, k) | 0;\r\n              g = b[m >> 1] | 0;\r\n              h = ((g & 65535) << 10) + (h & 65535) & 65535;\r\n              f = b[n >> 1] | 0;\r\n              g = g << 16 >> 16;\r\n              if ((g * 24660 | 0) == 1073741824) {\r\n                  c[k >> 2] = 1;\r\n                  d = 2147483647;\r\n              } else d = g * 49320 | 0;\r\n              n = (f << 16 >> 16) * 24660 >> 15;\r\n              g = d + (n << 1) | 0;\r\n              if (!((d ^ n | 0) > 0 & (g ^ d | 0) < 0)) {\r\n                  k = g;\r\n                  k = k << 13;\r\n                  k = k + 32768 | 0;\r\n                  k = k >>> 16;\r\n                  k = k & 65535;\r\n                  Wd(a, h, k);\r\n                  i = o;\r\n                  return\r\n              }\r\n              c[k >> 2] = 1;\r\n              k = (d >>> 31) + 2147483647 | 0;\r\n              k = k << 13;\r\n              k = k + 32768 | 0;\r\n              k = k >>> 16;\r\n              k = k & 65535;\r\n              Wd(a, h, k);\r\n              i = o;\r\n              return\r\n          }\r\n\r\n          function ld(a, d, f, g, h, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              p = p | 0;\r\n              q = q | 0;\r\n              r = r | 0;\r\n              s = s | 0;\r\n              t = t | 0;\r\n              u = u | 0;\r\n              v = v | 0;\r\n              w = w | 0;\r\n              x = x | 0;\r\n              y = y | 0;\r\n              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,\r\n                  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,\r\n                  ba = 0, ca = 0, da = 0, ea = 0, fa = 0, ga = 0, ha = 0, ia = 0, ja = 0, ka = 0, la = 0;\r\n              la = i;\r\n              i = i + 80 | 0;\r\n              ia = la + 72 | 0;\r\n              ja = la + 70 | 0;\r\n              ka = la + 68 | 0;\r\n              ga = la + 66 | 0;\r\n              ha = la + 56 | 0;\r\n              _ = la + 24 | 0;\r\n              Y = la + 12 | 0;\r\n              W = la + 48 | 0;\r\n              X = la + 40 | 0;\r\n              R = la + 34 | 0;\r\n              T = la + 22 | 0;\r\n              P = la + 6 | 0;\r\n              Q = la;\r\n              nd(5, r, s, P, Q, c[x + 72 >> 2] | 0, y) | 0;\r\n              B = re(14, n, y) | 0;\r\n              S = x + 68 | 0;\r\n              O = c[S >> 2] | 0;\r\n              V = m << 16 >> 16;\r\n              U = V + 65526 | 0;\r\n              r = (e[j >> 1] | 0) + 65523 & 65535;\r\n              b[ha >> 1] = r;\r\n              x = (e[j + 2 >> 1] | 0) + 65522 & 65535;\r\n              b[ha + 2 >> 1] = x;\r\n              da = U << 16 >> 16;\r\n              ea = ((U << 17 >> 17 | 0) == (da | 0) ? U << 1 : da >>> 15 ^ 32767) + 15 + (e[j + 4 >> 1] | 0) & 65535;\r\n              b[ha + 4 >> 1] = ea;\r\n              fa = (e[j + 6 >> 1] | 0) + da & 65535;\r\n              b[ha + 6 >> 1] = fa;\r\n              j = da + 1 + (e[j + 8 >> 1] | 0) & 65535;\r\n              b[ha + 8 >> 1] = j;\r\n              x = x << 16 >> 16 > r << 16 >> 16 ? x : r;\r\n              x = ea << 16 >> 16 > x << 16 >> 16 ? ea : x;\r\n              x = fa << 16 >> 16 > x << 16 >> 16 ? fa : x;\r\n              x = (Rd(j << 16 >> 16 > x << 16 >> 16 ? j : x, 1, y) | 0) & 65535;\r\n              j = r;\r\n              r = 0;\r\n              while (1) {\r\n                  n = x - (j & 65535) | 0;\r\n                  j = n & 65535;\r\n                  A = e[h + (r << 1) >> 1] << 16;\r\n                  n = n << 16 >> 16;\r\n                  if (j << 16 >> 16 > 0) n = j << 16 >> 16 < 31 ? A >> n : 0; else {\r\n                      fa = 0 - n << 16 >> 16;\r\n                      n = A << fa;\r\n                      n = (n >> fa | 0) == (A | 0) ? n : A >> 31 ^ 2147483647;\r\n                  }\r\n                  Nc(n, _ + (r << 1) | 0, Y + (r << 1) | 0, y);\r\n                  n = r + 1 | 0;\r\n                  if ((n | 0) == 5) break;\r\n                  j = b[ha + (n << 1) >> 1] | 0;\r\n                  r = n;\r\n              }\r\n              M = _ + 2 | 0;\r\n              N = Y + 2 | 0;\r\n              fa = B << 16 >> 16;\r\n              $ = _ + 4 | 0;\r\n              aa = Y + 4 | 0;\r\n              ba = _ + 6 | 0;\r\n              ca = Y + 6 | 0;\r\n              da = _ + 8 | 0;\r\n              ea = Y + 8 | 0;\r\n              E = 0;\r\n              j = 2147483647;\r\n              h = 0;\r\n              n = 0;\r\n              while (1) {\r\n                  L = b[P + (h << 1) >> 1] | 0;\r\n                  B = Z(L, L) | 0;\r\n                  if (B >>> 0 > 1073741823) {\r\n                      c[y >> 2] = 1;\r\n                      B = 32767;\r\n                  } else B = B >>> 15;\r\n                  x = b[Y >> 1] | 0;\r\n                  A = B << 16 >> 16;\r\n                  B = Z(A, b[_ >> 1] | 0) | 0;\r\n                  if ((B | 0) == 1073741824) {\r\n                      c[y >> 2] = 1;\r\n                      r = 2147483647;\r\n                  } else r = B << 1;\r\n                  K = (Z(x << 16 >> 16, A) | 0) >> 15;\r\n                  B = r + (K << 1) | 0;\r\n                  if ((r ^ K | 0) > 0 & (B ^ r | 0) < 0) {\r\n                      c[y >> 2] = 1;\r\n                      B = (r >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  x = b[N >> 1] | 0;\r\n                  A = Z(b[M >> 1] | 0, L) | 0;\r\n                  if ((A | 0) != 1073741824) {\r\n                      r = (A << 1) + B | 0;\r\n                      if ((A ^ B | 0) > 0 & (r ^ B | 0) < 0) {\r\n                          c[y >> 2] = 1;\r\n                          r = (B >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[y >> 2] = 1;\r\n                      r = 2147483647;\r\n                  }\r\n                  B = (Z(x << 16 >> 16, L) | 0) >> 15;\r\n                  if ((B | 0) > 32767) {\r\n                      c[y >> 2] = 1;\r\n                      B = 32767;\r\n                  }\r\n                  K = B << 16;\r\n                  B = (K >> 15) + r | 0;\r\n                  if ((K >> 16 ^ r | 0) > 0 & (B ^ r | 0) < 0) {\r\n                      c[y >> 2] = 1;\r\n                      K = (r >>> 31) + 2147483647 | 0;\r\n                  } else K = B;\r\n                  I = (K >>> 31) + 2147483647 | 0;\r\n                  J = h & 65535;\r\n                  B = E;\r\n                  G = 0;\r\n                  H = O;\r\n                  do {\r\n                      A = (Z(b[H >> 1] | 0, fa) | 0) >> 15;\r\n                      H = H + 6 | 0;\r\n                      if ((A | 0) > 32767) {\r\n                          c[y >> 2] = 1;\r\n                          A = 32767;\r\n                      }\r\n                      F = A << 16 >> 16;\r\n                      A = Z(F, F) | 0;\r\n                      if ((A | 0) == 1073741824) {\r\n                          c[y >> 2] = 1;\r\n                          D = 2147483647;\r\n                      } else D = A << 1;\r\n                      Nc(D, ia, ja, y);\r\n                      A = Z(F, L) | 0;\r\n                      if ((A | 0) == 1073741824) {\r\n                          c[y >> 2] = 1;\r\n                          D = 2147483647;\r\n                      } else D = A << 1;\r\n                      Nc(D, ka, ga, y);\r\n                      r = b[aa >> 1] | 0;\r\n                      C = b[ja >> 1] | 0;\r\n                      A = b[$ >> 1] | 0;\r\n                      x = b[ia >> 1] | 0;\r\n                      E = Z(x, A) | 0;\r\n                      if ((E | 0) != 1073741824) {\r\n                          D = (E << 1) + K | 0;\r\n                          if ((E ^ K | 0) > 0 & (D ^ K | 0) < 0) {\r\n                              c[y >> 2] = 1;\r\n                              D = I;\r\n                          }\r\n                      } else {\r\n                          c[y >> 2] = 1;\r\n                          D = 2147483647;\r\n                      }\r\n                      E = (Z(C << 16 >> 16, A) | 0) >> 15;\r\n                      if ((E | 0) > 32767) {\r\n                          c[y >> 2] = 1;\r\n                          E = 32767;\r\n                      }\r\n                      C = E << 16;\r\n                      E = (C >> 15) + D | 0;\r\n                      if ((C >> 16 ^ D | 0) > 0 & (E ^ D | 0) < 0) {\r\n                          c[y >> 2] = 1;\r\n                          E = (D >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      D = (Z(x, r << 16 >> 16) | 0) >> 15;\r\n                      if ((D | 0) > 32767) {\r\n                          c[y >> 2] = 1;\r\n                          D = 32767;\r\n                      }\r\n                      C = D << 16;\r\n                      D = (C >> 15) + E | 0;\r\n                      if ((C >> 16 ^ E | 0) > 0 & (D ^ E | 0) < 0) {\r\n                          c[y >> 2] = 1;\r\n                          D = (E >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      A = b[ca >> 1] | 0;\r\n                      E = Z(b[ba >> 1] | 0, F) | 0;\r\n                      if ((E | 0) != 1073741824) {\r\n                          C = (E << 1) + D | 0;\r\n                          if ((E ^ D | 0) > 0 & (C ^ D | 0) < 0) {\r\n                              c[y >> 2] = 1;\r\n                              C = (D >>> 31) + 2147483647 | 0;\r\n                          }\r\n                      } else {\r\n                          c[y >> 2] = 1;\r\n                          C = 2147483647;\r\n                      }\r\n                      A = (Z(A << 16 >> 16, F) | 0) >> 15;\r\n                      if ((A | 0) > 32767) {\r\n                          c[y >> 2] = 1;\r\n                          A = 32767;\r\n                      }\r\n                      F = A << 16;\r\n                      A = (F >> 15) + C | 0;\r\n                      if ((F >> 16 ^ C | 0) > 0 & (A ^ C | 0) < 0) {\r\n                          c[y >> 2] = 1;\r\n                          A = (C >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      x = b[ea >> 1] | 0;\r\n                      C = b[ga >> 1] | 0;\r\n                      r = b[da >> 1] | 0;\r\n                      z = b[ka >> 1] | 0;\r\n                      E = Z(z, r) | 0;\r\n                      do if ((E | 0) == 1073741824) {\r\n                          c[y >> 2] = 1;\r\n                          E = 2147483647;\r\n                      } else {\r\n                          D = (E << 1) + A | 0;\r\n                          if (!((E ^ A | 0) > 0 & (D ^ A | 0) < 0)) {\r\n                              E = D;\r\n                              break\r\n                          }\r\n                          c[y >> 2] = 1;\r\n                          E = (A >>> 31) + 2147483647 | 0;\r\n                      } while (0);\r\n                      D = (Z(C << 16 >> 16, r) | 0) >> 15;\r\n                      if ((D | 0) > 32767) {\r\n                          c[y >> 2] = 1;\r\n                          D = 32767;\r\n                      }\r\n                      F = D << 16;\r\n                      D = (F >> 15) + E | 0;\r\n                      if ((F >> 16 ^ E | 0) > 0 & (D ^ E | 0) < 0) {\r\n                          c[y >> 2] = 1;\r\n                          D = (E >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      A = (Z(z, x << 16 >> 16) | 0) >> 15;\r\n                      if ((A | 0) > 32767) {\r\n                          c[y >> 2] = 1;\r\n                          A = 32767;\r\n                      }\r\n                      F = A << 16;\r\n                      A = (F >> 15) + D | 0;\r\n                      if ((F >> 16 ^ D | 0) > 0 & (A ^ D | 0) < 0) {\r\n                          c[y >> 2] = 1;\r\n                          A = (D >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      F = (A | 0) < (j | 0);\r\n                      B = F ? G : B;\r\n                      n = F ? J : n;\r\n                      j = F ? A : j;\r\n                      G = G + 1 << 16 >> 16;\r\n                  } while (G << 16 >> 16 < 32);\r\n                  h = h + 1 | 0;\r\n                  if ((h | 0) == 3) {\r\n                      A = B;\r\n                      h = n;\r\n                      break\r\n                  } else E = B;\r\n              }\r\n              N = (A << 16 >> 16) * 3 | 0;\r\n              j = b[O + (N << 1) >> 1] | 0;\r\n              b[u >> 1] = b[O + (N + 1 << 1) >> 1] | 0;\r\n              b[v >> 1] = b[O + (N + 2 << 1) >> 1] | 0;\r\n              j = Z(j << 16 >> 16, fa) | 0;\r\n              if ((j | 0) == 1073741824) {\r\n                  c[y >> 2] = 1;\r\n                  B = 2147483647;\r\n              } else B = j << 1;\r\n              N = 9 - V | 0;\r\n              O = N & 65535;\r\n              N = N << 16 >> 16;\r\n              M = O << 16 >> 16 > 0;\r\n              if (M) B = O << 16 >> 16 < 31 ? B >> N : 0; else {\r\n                  K = 0 - N << 16 >> 16;\r\n                  L = B << K;\r\n                  B = (L >> K | 0) == (B | 0) ? L : B >> 31 ^ 2147483647;\r\n              }\r\n              b[t >> 1] = B >>> 16;\r\n              L = h << 16 >> 16;\r\n              P = b[P + (L << 1) >> 1] | 0;\r\n              b[s >> 1] = P;\r\n              Q = b[Q + (L << 1) >> 1] | 0;\r\n              Ub(d, f, g, P, o, W, X, R, y);\r\n              xc(a, b[R >> 1] | 0, b[t >> 1] | 0, T, y);\r\n              if (!((b[W >> 1] | 0) != 0 & (b[T >> 1] | 0) > 0)) {\r\n                  y = A;\r\n                  u = c[w >> 2] | 0;\r\n                  t = u + 2 | 0;\r\n                  b[u >> 1] = Q;\r\n                  u = u + 4 | 0;\r\n                  c[w >> 2] = u;\r\n                  b[t >> 1] = y;\r\n                  i = la;\r\n                  return\r\n              }\r\n              F = W + 6 | 0;\r\n              b[F >> 1] = l;\r\n              D = X + 6 | 0;\r\n              b[D >> 1] = k;\r\n              m = ((Ge(q, m, y) | 0) & 65535) + 10 | 0;\r\n              x = m << 16 >> 16;\r\n              if ((m & 65535) << 16 >> 16 < 0) {\r\n                  n = 0 - x << 16;\r\n                  if ((n | 0) < 983040) p = p << 16 >> 16 >> (n >> 16) & 65535; else p = 0;\r\n              } else {\r\n                  n = p << 16 >> 16;\r\n                  r = n << x;\r\n                  if ((r << 16 >> 16 >> x | 0) == (n | 0)) p = r & 65535; else p = (n >>> 15 ^ 32767) & 65535;\r\n              }\r\n              j = b[s >> 1] | 0;\r\n              B = b[T >> 1] | 0;\r\n              S = c[S >> 2] | 0;\r\n              r = b[t >> 1] | 0;\r\n              T = 10 - V | 0;\r\n              x = T << 16 >> 16;\r\n              if ((T & 65535) << 16 >> 16 < 0) {\r\n                  n = 0 - x << 16;\r\n                  if ((n | 0) < 983040) l = r << 16 >> 16 >> (n >> 16) & 65535; else l = 0;\r\n              } else {\r\n                  n = r << 16 >> 16;\r\n                  r = n << x;\r\n                  if ((r << 16 >> 16 >> x | 0) == (n | 0)) l = r & 65535; else l = (n >>> 15 ^ 32767) & 65535;\r\n              }\r\n              h = j << 16 >> 16;\r\n              n = Z(h, h) | 0;\r\n              if (n >>> 0 > 1073741823) {\r\n                  c[y >> 2] = 1;\r\n                  j = 32767;\r\n              } else j = n >>> 15;\r\n              A = Rd(32767 - (B & 65535) & 65535, 1, y) | 0;\r\n              B = B << 16 >> 16;\r\n              n = Z(b[W + 2 >> 1] | 0, B) | 0;\r\n              if ((n | 0) == 1073741824) {\r\n                  c[y >> 2] = 1;\r\n                  n = 2147483647;\r\n              } else n = n << 1;\r\n              T = n << 1;\r\n              n = Z(((T >> 1 | 0) == (n | 0) ? T : n >> 31 ^ 2147418112) >> 16, j << 16 >> 16) | 0;\r\n              if ((n | 0) == 1073741824) {\r\n                  c[y >> 2] = 1;\r\n                  E = 2147483647;\r\n              } else E = n << 1;\r\n              C = (e[X + 2 >> 1] | 0) + 65521 | 0;\r\n              x = C & 65535;\r\n              n = Z(b[W + 4 >> 1] | 0, B) | 0;\r\n              if ((n | 0) == 1073741824) {\r\n                  c[y >> 2] = 1;\r\n                  j = 2147483647;\r\n              } else j = n << 1;\r\n              n = j << 1;\r\n              n = (Z(((n >> 1 | 0) == (j | 0) ? n : j >> 31 ^ 2147418112) >> 16, h) | 0) >> 15;\r\n              if ((n | 0) > 32767) {\r\n                  c[y >> 2] = 1;\r\n                  n = 32767;\r\n              }\r\n              b[$ >> 1] = n;\r\n              j = U & 65535;\r\n              b[ia >> 1] = j;\r\n              j = Rd(b[X + 4 >> 1] | 0, j, y) | 0;\r\n              n = Z(b[F >> 1] | 0, B) | 0;\r\n              if ((n | 0) == 1073741824) {\r\n                  c[y >> 2] = 1;\r\n                  n = 2147483647;\r\n              } else n = n << 1;\r\n              z = n << 1;\r\n              b[ba >> 1] = ((z >> 1 | 0) == (n | 0) ? z : n >> 31 ^ 2147418112) >>> 16;\r\n              z = ((V << 17 >> 17 | 0) == (V | 0) ? V << 1 : V >>> 15 ^ 32767) + 65529 & 65535;\r\n              b[ia >> 1] = z;\r\n              z = Rd(b[D >> 1] | 0, z, y) | 0;\r\n              n = (Z(b[F >> 1] | 0, A << 16 >> 16) | 0) >> 15;\r\n              if ((n | 0) > 32767) {\r\n                  c[y >> 2] = 1;\r\n                  n = 32767;\r\n              }\r\n              b[da >> 1] = n;\r\n              A = Rd(z, 1, y) | 0;\r\n              r = Z(b[W >> 1] | 0, B) | 0;\r\n              if ((r | 0) == 1073741824) {\r\n                  c[y >> 2] = 1;\r\n                  n = 2147483647;\r\n              } else n = r << 1;\r\n              D = Fe(n, ia, y) | 0;\r\n              h = (e[ia >> 1] | 0) + 47 | 0;\r\n              b[ia >> 1] = h;\r\n              h = (e[X >> 1] | 0) - (h & 65535) | 0;\r\n              B = h + 31 & 65535;\r\n              B = x << 16 >> 16 > B << 16 >> 16 ? x : B;\r\n              B = j << 16 >> 16 > B << 16 >> 16 ? j : B;\r\n              B = z << 16 >> 16 > B << 16 >> 16 ? z : B;\r\n              B = (A << 16 >> 16 > B << 16 >> 16 ? A : B) << 16 >> 16;\r\n              r = B - (C & 65535) | 0;\r\n              n = r & 65535;\r\n              r = r << 16 >> 16;\r\n              if (n << 16 >> 16 > 0) K = n << 16 >> 16 < 31 ? E >> r : 0; else {\r\n                  X = 0 - r << 16 >> 16;\r\n                  K = E << X;\r\n                  K = (K >> X | 0) == (E | 0) ? K : E >> 31 ^ 2147483647;\r\n              }\r\n              x = B - (j & 65535) | 0;\r\n              n = x & 65535;\r\n              r = e[$ >> 1] << 16;\r\n              x = x << 16 >> 16;\r\n              if (n << 16 >> 16 > 0) r = n << 16 >> 16 < 31 ? r >> x : 0; else {\r\n                  W = 0 - x << 16 >> 16;\r\n                  X = r << W;\r\n                  r = (X >> W | 0) == (r | 0) ? X : r >> 31 ^ 2147483647;\r\n              }\r\n              Nc(r, $, aa, y);\r\n              z = B - (z & 65535) | 0;\r\n              r = z & 65535;\r\n              x = e[ba >> 1] << 16;\r\n              z = z << 16 >> 16;\r\n              if (r << 16 >> 16 > 0) r = r << 16 >> 16 < 31 ? x >> z : 0; else {\r\n                  X = 0 - z << 16 >> 16;\r\n                  r = x << X;\r\n                  r = (r >> X | 0) == (x | 0) ? r : x >> 31 ^ 2147483647;\r\n              }\r\n              Nc(r, ba, ca, y);\r\n              z = B - (A & 65535) | 0;\r\n              r = z & 65535;\r\n              x = e[da >> 1] << 16;\r\n              z = z << 16 >> 16;\r\n              if (r << 16 >> 16 > 0) r = r << 16 >> 16 < 31 ? x >> z : 0; else {\r\n                  X = 0 - z << 16 >> 16;\r\n                  r = x << X;\r\n                  r = (r >> X | 0) == (x | 0) ? r : x >> 31 ^ 2147483647;\r\n              }\r\n              Nc(r, da, ea, y);\r\n              z = B + 65505 | 0;\r\n              b[ia >> 1] = z;\r\n              z = z - (h & 65535) | 0;\r\n              r = De(z & 65535, 1, y) | 0;\r\n              x = r << 16 >> 16;\r\n              if (r << 16 >> 16 > 0) x = r << 16 >> 16 < 31 ? D >> x : 0; else {\r\n                  X = 0 - x << 16 >> 16;\r\n                  x = D << X;\r\n                  x = (x >> X | 0) == (D | 0) ? x : D >> 31 ^ 2147483647;\r\n              }\r\n              do if (!(z & 1)) E = x; else {\r\n                  Nc(x, _, Y, y);\r\n                  r = b[Y >> 1] | 0;\r\n                  x = b[_ >> 1] | 0;\r\n                  if ((x * 23170 | 0) == 1073741824) {\r\n                      c[y >> 2] = 1;\r\n                      z = 2147483647;\r\n                  } else z = x * 46340 | 0;\r\n                  _ = (r << 16 >> 16) * 23170 >> 15;\r\n                  x = z + (_ << 1) | 0;\r\n                  if (!((z ^ _ | 0) > 0 & (x ^ z | 0) < 0)) {\r\n                      E = x;\r\n                      break\r\n                  }\r\n                  c[y >> 2] = 1;\r\n                  E = (z >>> 31) + 2147483647 | 0;\r\n              } while (0);\r\n              F = (K >>> 31) + 2147483647 | 0;\r\n              D = 2147483647;\r\n              C = 0;\r\n              x = 0;\r\n              G = S;\r\n              while (1) {\r\n                  r = (Z(b[G >> 1] | 0, fa) | 0) >> 15;\r\n                  G = G + 6 | 0;\r\n                  if ((r | 0) > 32767) {\r\n                      c[y >> 2] = 1;\r\n                      r = 32767;\r\n                  }\r\n                  z = r & 65535;\r\n                  if (z << 16 >> 16 >= l << 16 >> 16) break;\r\n                  j = r << 16 >> 16;\r\n                  r = Z(j, j) | 0;\r\n                  if ((r | 0) == 1073741824) {\r\n                      c[y >> 2] = 1;\r\n                      n = 2147483647;\r\n                  } else n = r << 1;\r\n                  Nc(n, ja, ka, y);\r\n                  r = (Ge(z, p, y) | 0) << 16 >> 16;\r\n                  r = Z(r, r) | 0;\r\n                  if ((r | 0) == 1073741824) {\r\n                      c[y >> 2] = 1;\r\n                      r = 2147483647;\r\n                  } else r = r << 1;\r\n                  Nc(r, ga, ha, y);\r\n                  z = b[aa >> 1] | 0;\r\n                  n = Z(b[$ >> 1] | 0, j) | 0;\r\n                  do if ((n | 0) == 1073741824) {\r\n                      c[y >> 2] = 1;\r\n                      n = 2147483647;\r\n                  } else {\r\n                      r = (n << 1) + K | 0;\r\n                      if (!((n ^ K | 0) > 0 & (r ^ K | 0) < 0)) {\r\n                          n = r;\r\n                          break\r\n                      }\r\n                      c[y >> 2] = 1;\r\n                      n = F;\r\n                  } while (0);\r\n                  r = (Z(z << 16 >> 16, j) | 0) >> 15;\r\n                  if ((r | 0) > 32767) {\r\n                      c[y >> 2] = 1;\r\n                      r = 32767;\r\n                  }\r\n                  _ = r << 16;\r\n                  r = (_ >> 15) + n | 0;\r\n                  if ((_ >> 16 ^ n | 0) > 0 & (r ^ n | 0) < 0) {\r\n                      c[y >> 2] = 1;\r\n                      r = (n >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  h = b[ca >> 1] | 0;\r\n                  A = b[ka >> 1] | 0;\r\n                  j = b[ba >> 1] | 0;\r\n                  B = b[ja >> 1] | 0;\r\n                  n = Z(B, j) | 0;\r\n                  do if ((n | 0) == 1073741824) {\r\n                      c[y >> 2] = 1;\r\n                      z = 2147483647;\r\n                  } else {\r\n                      z = (n << 1) + r | 0;\r\n                      if (!((n ^ r | 0) > 0 & (z ^ r | 0) < 0)) break;\r\n                      c[y >> 2] = 1;\r\n                      z = (r >>> 31) + 2147483647 | 0;\r\n                  } while (0);\r\n                  n = (Z(A << 16 >> 16, j) | 0) >> 15;\r\n                  if ((n | 0) > 32767) {\r\n                      c[y >> 2] = 1;\r\n                      n = 32767;\r\n                  }\r\n                  _ = n << 16;\r\n                  n = (_ >> 15) + z | 0;\r\n                  if ((_ >> 16 ^ z | 0) > 0 & (n ^ z | 0) < 0) {\r\n                      c[y >> 2] = 1;\r\n                      n = (z >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  r = (Z(B, h << 16 >> 16) | 0) >> 15;\r\n                  if ((r | 0) > 32767) {\r\n                      c[y >> 2] = 1;\r\n                      r = 32767;\r\n                  }\r\n                  _ = r << 16;\r\n                  r = (_ >> 15) + n | 0;\r\n                  if ((_ >> 16 ^ n | 0) > 0 & (r ^ n | 0) < 0) {\r\n                      c[y >> 2] = 1;\r\n                      r = (n >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  r = Fe(r, ia, y) | 0;\r\n                  z = De(b[ia >> 1] | 0, 1, y) | 0;\r\n                  n = z << 16 >> 16;\r\n                  if (z << 16 >> 16 > 0) z = z << 16 >> 16 < 31 ? r >> n : 0; else {\r\n                      _ = 0 - n << 16 >> 16;\r\n                      z = r << _;\r\n                      z = (z >> _ | 0) == (r | 0) ? z : r >> 31 ^ 2147483647;\r\n                  }\r\n                  r = z - E | 0;\r\n                  if (((r ^ z) & (z ^ E) | 0) < 0) {\r\n                      c[y >> 2] = 1;\r\n                      r = (z >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  r = (Ce(r, y) | 0) << 16 >> 16;\r\n                  r = Z(r, r) | 0;\r\n                  if ((r | 0) == 1073741824) {\r\n                      c[y >> 2] = 1;\r\n                      z = 2147483647;\r\n                  } else z = r << 1;\r\n                  B = b[ea >> 1] | 0;\r\n                  j = b[ha >> 1] | 0;\r\n                  A = b[da >> 1] | 0;\r\n                  h = b[ga >> 1] | 0;\r\n                  n = Z(h, A) | 0;\r\n                  do if ((n | 0) == 1073741824) {\r\n                      c[y >> 2] = 1;\r\n                      r = 2147483647;\r\n                  } else {\r\n                      r = (n << 1) + z | 0;\r\n                      if (!((n ^ z | 0) > 0 & (r ^ z | 0) < 0)) break;\r\n                      c[y >> 2] = 1;\r\n                      r = (z >>> 31) + 2147483647 | 0;\r\n                  } while (0);\r\n                  n = (Z(j << 16 >> 16, A) | 0) >> 15;\r\n                  if ((n | 0) > 32767) {\r\n                      c[y >> 2] = 1;\r\n                      n = 32767;\r\n                  }\r\n                  _ = n << 16;\r\n                  n = (_ >> 15) + r | 0;\r\n                  if ((_ >> 16 ^ r | 0) > 0 & (n ^ r | 0) < 0) {\r\n                      c[y >> 2] = 1;\r\n                      n = (r >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  r = (Z(h, B << 16 >> 16) | 0) >> 15;\r\n                  if ((r | 0) > 32767) {\r\n                      c[y >> 2] = 1;\r\n                      r = 32767;\r\n                  }\r\n                  _ = r << 16;\r\n                  r = (_ >> 15) + n | 0;\r\n                  if ((_ >> 16 ^ n | 0) > 0 & (r ^ n | 0) < 0) {\r\n                      c[y >> 2] = 1;\r\n                      r = (n >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  n = (r | 0) < (D | 0);\r\n                  x = n ? C : x;\r\n                  C = C + 1 << 16 >> 16;\r\n                  if (C << 16 >> 16 >= 32) break; else D = n ? r : D;\r\n              }\r\n              ka = (x << 16 >> 16) * 3 | 0;\r\n              z = b[S + (ka << 1) >> 1] | 0;\r\n              b[u >> 1] = b[S + (ka + 1 << 1) >> 1] | 0;\r\n              b[v >> 1] = b[S + (ka + 2 << 1) >> 1] | 0;\r\n              z = Z(z << 16 >> 16, fa) | 0;\r\n              if ((z | 0) == 1073741824) {\r\n                  c[y >> 2] = 1;\r\n                  z = 2147483647;\r\n              } else z = z << 1;\r\n              if (M) z = O << 16 >> 16 < 31 ? z >> N : 0; else {\r\n                  u = 0 - N << 16 >> 16;\r\n                  y = z << u;\r\n                  z = (y >> u | 0) == (z | 0) ? y : z >> 31 ^ 2147483647;\r\n              }\r\n              b[t >> 1] = z >>> 16;\r\n              y = x;\r\n              u = c[w >> 2] | 0;\r\n              t = u + 2 | 0;\r\n              b[u >> 1] = Q;\r\n              u = u + 4 | 0;\r\n              c[w >> 2] = u;\r\n              b[t >> 1] = y;\r\n              i = la;\r\n              return\r\n          }\r\n\r\n          function md(a, c, d, e, f, g, h, i) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              var j = 0, k = 0, l = 0, m = 0, n = 0;\r\n              n = (a | 0) == 7;\r\n              j = b[e >> 1] | 0;\r\n              if (n) {\r\n                  j = j << 16 >> 16 >>> 1 & 65535;\r\n                  m = re(c, d, i) | 0;\r\n                  c = m << 16;\r\n                  a = c >> 16;\r\n                  if ((m << 20 >> 20 | 0) == (a | 0)) a = c >> 12; else a = a >>> 15 ^ 32767;\r\n              } else {\r\n                  m = re(c, d, i) | 0;\r\n                  c = m << 16;\r\n                  a = c >> 16;\r\n                  if ((m << 21 >> 21 | 0) == (a | 0)) a = c >> 11; else a = a >>> 15 ^ 32767;\r\n              }\r\n              m = a << 16 >> 16;\r\n              i = j << 16 >> 16;\r\n              c = i - ((Z(m, b[h >> 1] | 0) | 0) >>> 15 & 65535) | 0;\r\n              c = ((c & 32768 | 0) != 0 ? 0 - c | 0 : c) & 65535;\r\n              k = 1;\r\n              a = 0;\r\n              l = h;\r\n              while (1) {\r\n                  l = l + 6 | 0;\r\n                  j = i - ((Z(b[l >> 1] | 0, m) | 0) >>> 15 & 65535) | 0;\r\n                  d = j << 16;\r\n                  j = (d | 0) < 0 ? 0 - (d >> 16) | 0 : j;\r\n                  d = (j << 16 >> 16 | 0) < (c << 16 >> 16 | 0);\r\n                  a = d ? k : a;\r\n                  k = k + 1 << 16 >> 16;\r\n                  if (k << 16 >> 16 >= 32) break; else c = d ? j & 65535 : c;\r\n              }\r\n              l = (a << 16 >> 16) * 196608 >> 16;\r\n              b[e >> 1] = (Z(b[h + (l << 1) >> 1] | 0, m) | 0) >>> 15 << (n & 1);\r\n              b[f >> 1] = b[h + (l + 1 << 1) >> 1] | 0;\r\n              b[g >> 1] = b[h + (l + 2 << 1) >> 1] | 0;\r\n              return a | 0\r\n          }\r\n\r\n          function nd(a, c, d, e, f, g, h) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0;\r\n              i = Ge(b[d >> 1] | 0, b[g >> 1] | 0, h) | 0;\r\n              i = (i & 65535) - ((i & 65535) >>> 15 & 65535) | 0;\r\n              i = (i << 16 >> 31 ^ i) & 65535;\r\n              k = 0;\r\n              l = 1;\r\n              while (1) {\r\n                  j = b[g + (l << 1) >> 1] | 0;\r\n                  if (j << 16 >> 16 > c << 16 >> 16) j = i; else {\r\n                      j = Ge(b[d >> 1] | 0, j, h) | 0;\r\n                      j = (j & 65535) - ((j & 65535) >>> 15 & 65535) | 0;\r\n                      j = (j << 16 >> 31 ^ j) & 65535;\r\n                      n = j << 16 >> 16 < i << 16 >> 16;\r\n                      j = n ? j : i;\r\n                      k = n ? l & 65535 : k;\r\n                  }\r\n                  l = l + 1 | 0;\r\n                  if ((l | 0) == 16) break; else i = j;\r\n              }\r\n              if ((a | 0) != 5) {\r\n                  i = b[g + (k << 16 >> 16 << 1) >> 1] | 0;\r\n                  if ((a | 0) == 7) {\r\n                      b[d >> 1] = i & 65532;\r\n                      return k | 0\r\n                  } else {\r\n                      b[d >> 1] = i;\r\n                      return k | 0\r\n                  }\r\n              }\r\n              j = k << 16 >> 16;\r\n              switch (k << 16 >> 16) {\r\n                  case 0: {\r\n                      i = 0;\r\n                      break\r\n                  }\r\n                  case 15: {\r\n                      m = 8;\r\n                      break\r\n                  }\r\n                  default:\r\n                      if ((b[g + (j + 1 << 1) >> 1] | 0) > c << 16 >> 16) m = 8; else i = j + 65535 & 65535;\r\n              }\r\n              if ((m | 0) == 8) i = j + 65534 & 65535;\r\n              b[f >> 1] = i;\r\n              n = i << 16 >> 16;\r\n              b[e >> 1] = b[g + (n << 1) >> 1] | 0;\r\n              n = n + 1 | 0;\r\n              b[f + 2 >> 1] = n;\r\n              n = n << 16 >> 16;\r\n              b[e + 2 >> 1] = b[g + (n << 1) >> 1] | 0;\r\n              n = n + 1 | 0;\r\n              b[f + 4 >> 1] = n;\r\n              b[e + 4 >> 1] = b[g + (n << 16 >> 16 << 1) >> 1] | 0;\r\n              b[d >> 1] = b[g + (j << 1) >> 1] | 0;\r\n              return k | 0\r\n          }\r\n\r\n          function od(a, d, f, g, h, j, k, l, m, n, o, p) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              p = p | 0;\r\n              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,\r\n                  F = 0, G = 0, H = 0, I = 0, J = 0, K = 0;\r\n              K = i;\r\n              i = i + 32 | 0;\r\n              s = K + 20 | 0;\r\n              t = K + 10 | 0;\r\n              r = K;\r\n              switch (a | 0) {\r\n                  case 3:\r\n                  case 4:\r\n                  case 6: {\r\n                      o = o + 84 | 0;\r\n                      J = 128;\r\n                      break\r\n                  }\r\n                  default: {\r\n                      o = o + 80 | 0;\r\n                      J = 64;\r\n                  }\r\n              }\r\n              I = c[o >> 2] | 0;\r\n              q = re(14, f, p) | 0;\r\n              H = d << 16 >> 16;\r\n              G = H + 65525 | 0;\r\n              a = (e[h >> 1] | 0) + 65523 & 65535;\r\n              b[r >> 1] = a;\r\n              d = (e[h + 2 >> 1] | 0) + 65522 & 65535;\r\n              b[r + 2 >> 1] = d;\r\n              F = G << 16 >> 16;\r\n              F = Rd(b[h + 4 >> 1] | 0, ((G << 17 >> 17 | 0) == (F | 0) ? G << 1 : F >>> 15 ^ 32767) + 15 & 65535, p) | 0;\r\n              b[r + 4 >> 1] = F;\r\n              G = Rd(b[h + 6 >> 1] | 0, G & 65535, p) | 0;\r\n              b[r + 6 >> 1] = G;\r\n              h = Rd(b[h + 8 >> 1] | 0, H + 65526 & 65535, p) | 0;\r\n              b[r + 8 >> 1] = h;\r\n              d = d << 16 >> 16 > a << 16 >> 16 ? d : a;\r\n              d = F << 16 >> 16 > d << 16 >> 16 ? F : d;\r\n              d = G << 16 >> 16 > d << 16 >> 16 ? G : d;\r\n              d = (h << 16 >> 16 > d << 16 >> 16 ? h : d) + 1 & 65535;\r\n              h = 0;\r\n              while (1) {\r\n                  f = d - (a & 65535) | 0;\r\n                  o = f & 65535;\r\n                  a = e[g + (h << 1) >> 1] << 16;\r\n                  f = f << 16 >> 16;\r\n                  if (o << 16 >> 16 > 0) o = o << 16 >> 16 < 31 ? a >> f : 0; else {\r\n                      G = 0 - f << 16 >> 16;\r\n                      o = a << G;\r\n                      o = (o >> G | 0) == (a | 0) ? o : a >> 31 ^ 2147483647;\r\n                  }\r\n                  Nc(o, s + (h << 1) | 0, t + (h << 1) | 0, p);\r\n                  o = h + 1 | 0;\r\n                  if ((o | 0) == 5) break;\r\n                  a = b[r + (o << 1) >> 1] | 0;\r\n                  h = o;\r\n              }\r\n              G = q << 16 >> 16;\r\n              y = b[s >> 1] | 0;\r\n              z = b[t >> 1] | 0;\r\n              A = b[s + 2 >> 1] | 0;\r\n              B = b[t + 2 >> 1] | 0;\r\n              C = b[s + 4 >> 1] | 0;\r\n              D = b[t + 4 >> 1] | 0;\r\n              E = b[s + 6 >> 1] | 0;\r\n              F = b[t + 6 >> 1] | 0;\r\n              x = b[s + 8 >> 1] | 0;\r\n              u = b[t + 8 >> 1] | 0;\r\n              d = 2147483647;\r\n              v = 0;\r\n              o = 0;\r\n              w = I;\r\n              while (1) {\r\n                  h = b[w >> 1] | 0;\r\n                  if (h << 16 >> 16 > j << 16 >> 16) q = d; else {\r\n                      q = (Z(b[w + 2 >> 1] | 0, G) | 0) >> 15;\r\n                      if ((q | 0) > 32767) {\r\n                          c[p >> 2] = 1;\r\n                          q = 32767;\r\n                      }\r\n                      t = h << 16 >> 16;\r\n                      h = Z(t, t) | 0;\r\n                      if (h >>> 0 > 1073741823) {\r\n                          c[p >> 2] = 1;\r\n                          r = 32767;\r\n                      } else r = h >>> 15;\r\n                      f = q << 16 >> 16;\r\n                      q = Z(f, f) | 0;\r\n                      if (q >>> 0 > 1073741823) {\r\n                          c[p >> 2] = 1;\r\n                          s = 32767;\r\n                      } else s = q >>> 15;\r\n                      g = (Z(f, t) | 0) >> 15;\r\n                      if ((g | 0) > 32767) {\r\n                          c[p >> 2] = 1;\r\n                          g = 32767;\r\n                      }\r\n                      q = r << 16 >> 16;\r\n                      r = Z(y, q) | 0;\r\n                      if ((r | 0) == 1073741824) {\r\n                          c[p >> 2] = 1;\r\n                          h = 2147483647;\r\n                      } else h = r << 1;\r\n                      q = (Z(z, q) | 0) >> 15;\r\n                      r = h + (q << 1) | 0;\r\n                      if ((h ^ q | 0) > 0 & (r ^ h | 0) < 0) {\r\n                          c[p >> 2] = 1;\r\n                          r = (h >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      q = Z(A, t) | 0;\r\n                      if ((q | 0) == 1073741824) {\r\n                          c[p >> 2] = 1;\r\n                          h = 2147483647;\r\n                      } else h = q << 1;\r\n                      t = (Z(B, t) | 0) >> 15;\r\n                      q = h + (t << 1) | 0;\r\n                      if ((h ^ t | 0) > 0 & (q ^ h | 0) < 0) {\r\n                          c[p >> 2] = 1;\r\n                          q = (h >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      h = q + r | 0;\r\n                      if ((q ^ r | 0) > -1 & (h ^ r | 0) < 0) {\r\n                          c[p >> 2] = 1;\r\n                          h = (r >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      q = s << 16 >> 16;\r\n                      r = Z(C, q) | 0;\r\n                      if ((r | 0) == 1073741824) {\r\n                          c[p >> 2] = 1;\r\n                          a = 2147483647;\r\n                      } else a = r << 1;\r\n                      t = (Z(D, q) | 0) >> 15;\r\n                      r = a + (t << 1) | 0;\r\n                      if ((a ^ t | 0) > 0 & (r ^ a | 0) < 0) {\r\n                          c[p >> 2] = 1;\r\n                          r = (a >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      q = r + h | 0;\r\n                      if ((r ^ h | 0) > -1 & (q ^ h | 0) < 0) {\r\n                          c[p >> 2] = 1;\r\n                          a = (h >>> 31) + 2147483647 | 0;\r\n                      } else a = q;\r\n                      q = Z(E, f) | 0;\r\n                      if ((q | 0) == 1073741824) {\r\n                          c[p >> 2] = 1;\r\n                          r = 2147483647;\r\n                      } else r = q << 1;\r\n                      t = (Z(F, f) | 0) >> 15;\r\n                      q = r + (t << 1) | 0;\r\n                      if ((r ^ t | 0) > 0 & (q ^ r | 0) < 0) {\r\n                          c[p >> 2] = 1;\r\n                          q = (r >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      h = q + a | 0;\r\n                      if ((q ^ a | 0) > -1 & (h ^ a | 0) < 0) {\r\n                          c[p >> 2] = 1;\r\n                          r = (a >>> 31) + 2147483647 | 0;\r\n                      } else r = h;\r\n                      h = g << 16 >> 16;\r\n                      q = Z(x, h) | 0;\r\n                      if ((q | 0) == 1073741824) {\r\n                          c[p >> 2] = 1;\r\n                          a = 2147483647;\r\n                      } else a = q << 1;\r\n                      t = (Z(u, h) | 0) >> 15;\r\n                      q = a + (t << 1) | 0;\r\n                      if ((a ^ t | 0) > 0 & (q ^ a | 0) < 0) {\r\n                          c[p >> 2] = 1;\r\n                          h = (a >>> 31) + 2147483647 | 0;\r\n                      } else h = q;\r\n                      q = h + r | 0;\r\n                      if ((h ^ r | 0) > -1 & (q ^ r | 0) < 0) {\r\n                          c[p >> 2] = 1;\r\n                          q = (r >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      t = (q | 0) < (d | 0);\r\n                      q = t ? q : d;\r\n                      o = t ? v : o;\r\n                  }\r\n                  w = w + 8 | 0;\r\n                  v = v + 1 << 16 >> 16;\r\n                  if ((v << 16 >> 16 | 0) >= (J | 0)) break; else d = q;\r\n              }\r\n              j = o << 16 >> 16;\r\n              j = ((j << 18 >> 18 | 0) == (j | 0) ? j << 2 : j >>> 15 ^ 32767) << 16 >> 16;\r\n              b[k >> 1] = b[I + (j << 1) >> 1] | 0;\r\n              d = b[I + (j + 1 << 1) >> 1] | 0;\r\n              b[m >> 1] = b[I + (j + 2 << 1) >> 1] | 0;\r\n              b[n >> 1] = b[I + (j + 3 << 1) >> 1] | 0;\r\n              d = Z(d << 16 >> 16, G) | 0;\r\n              if ((d | 0) == 1073741824) {\r\n                  c[p >> 2] = 1;\r\n                  a = 2147483647;\r\n              } else a = d << 1;\r\n              f = 10 - H | 0;\r\n              d = f & 65535;\r\n              f = f << 16 >> 16;\r\n              if (d << 16 >> 16 > 0) {\r\n                  p = d << 16 >> 16 < 31 ? a >> f : 0;\r\n                  p = p >>> 16;\r\n                  p = p & 65535;\r\n                  b[l >> 1] = p;\r\n                  i = K;\r\n                  return o | 0\r\n              } else {\r\n                  m = 0 - f << 16 >> 16;\r\n                  p = a << m;\r\n                  p = (p >> m | 0) == (a | 0) ? p : a >> 31 ^ 2147483647;\r\n                  p = p >>> 16;\r\n                  p = p & 65535;\r\n                  b[l >> 1] = p;\r\n                  i = K;\r\n                  return o | 0\r\n              }\r\n              return 0\r\n          }\r\n\r\n          function pd(a, c, d, f, g, h, j, k, l) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              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,\r\n                  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,\r\n                  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,\r\n                  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,\r\n                  qa = 0, ra = 0, sa = 0, ta = 0, ua = 0, va = 0, wa = 0;\r\n              wa = i;\r\n              i = i + 160 | 0;\r\n              va = wa;\r\n              n = a << 16 >> 16;\r\n              ta = a << 16 >> 16 == 10;\r\n              ua = b[j + (b[h >> 1] << 1) >> 1] | 0;\r\n              if (a << 16 >> 16 > 0) {\r\n                  l = 0;\r\n                  m = k;\r\n                  while (1) {\r\n                      b[m >> 1] = l;\r\n                      l = l + 1 << 16 >> 16;\r\n                      if (l << 16 >> 16 >= a << 16 >> 16) break; else m = m + 2 | 0;\r\n                  }\r\n              }\r\n              if (d << 16 >> 16 <= 1) {\r\n                  i = wa;\r\n                  return\r\n              }\r\n              ra = h + 2 | 0;\r\n              sa = ua << 16 >> 16;\r\n              oa = f + (sa << 1) | 0;\r\n              pa = g + (sa * 80 | 0) + (sa << 1) | 0;\r\n              qa = h + 6 | 0;\r\n              X = c & 65535;\r\n              Y = h + 4 | 0;\r\n              _ = h + 10 | 0;\r\n              $ = h + 8 | 0;\r\n              aa = h + 14 | 0;\r\n              ba = h + 12 | 0;\r\n              ca = h + 18 | 0;\r\n              da = h + 16 | 0;\r\n              ea = k + 2 | 0;\r\n              fa = k + 4 | 0;\r\n              ga = k + 6 | 0;\r\n              ha = k + 8 | 0;\r\n              ia = k + 10 | 0;\r\n              ja = k + 12 | 0;\r\n              ka = k + 14 | 0;\r\n              la = k + 16 | 0;\r\n              ma = k + 18 | 0;\r\n              na = a << 16 >> 16 > 2;\r\n              V = h + (n + -1 << 1) | 0;\r\n              T = 1;\r\n              W = 1;\r\n              N = 0;\r\n              O = 0;\r\n              U = -1;\r\n              while (1) {\r\n                  S = b[j + (b[ra >> 1] << 1) >> 1] | 0;\r\n                  R = S << 16 >> 16;\r\n                  c = (e[f + (R << 1) >> 1] | 0) + (e[oa >> 1] | 0) | 0;\r\n                  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;\r\n                  n = b[qa >> 1] | 0;\r\n                  if (n << 16 >> 16 < 40) {\r\n                      n = n << 16 >> 16;\r\n                      o = va;\r\n                      while (1) {\r\n                          P = (b[g + (n * 80 | 0) + (n << 1) >> 1] | 0) >>> 1;\r\n                          M = b[g + (n * 80 | 0) + (sa << 1) >> 1] | 0;\r\n                          Q = b[g + (n * 80 | 0) + (R << 1) >> 1] | 0;\r\n                          b[o >> 1] = c + (e[f + (n << 1) >> 1] | 0);\r\n                          b[o + 2 >> 1] = (M + 2 + P + Q | 0) >>> 2;\r\n                          n = n + X | 0;\r\n                          if ((n & 65535) << 16 >> 16 < 40) {\r\n                              n = n << 16 >> 16;\r\n                              o = o + 4 | 0;\r\n                          } else break\r\n                      }\r\n                      B = b[qa >> 1] | 0;\r\n                  } else B = n;\r\n                  c = b[Y >> 1] | 0;\r\n                  A = m >> 12;\r\n                  n = c << 16 >> 16;\r\n                  a:do if (c << 16 >> 16 < 40) {\r\n                      z = B << 16 >> 16;\r\n                      if (B << 16 >> 16 < 40) {\r\n                          o = 1;\r\n                          q = c;\r\n                          s = B;\r\n                          r = 0;\r\n                          p = -1;\r\n                      } else while (1) {\r\n                          n = n + X | 0;\r\n                          if ((n & 65535) << 16 >> 16 < 40) n = n << 16 >> 16; else {\r\n                              o = 1;\r\n                              Q = c;\r\n                              P = B;\r\n                              n = 0;\r\n                              break a\r\n                          }\r\n                      }\r\n                      while (1) {\r\n                          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;\r\n                          x = e[f + (n << 1) >> 1] | 0;\r\n                          v = z;\r\n                          w = B;\r\n                          u = va;\r\n                          t = r;\r\n                          while (1) {\r\n                              m = (e[u >> 1] | 0) + x | 0;\r\n                              l = m << 16 >> 16;\r\n                              l = (Z(l, l) | 0) >>> 15;\r\n                              r = (y + (b[g + (n * 80 | 0) + (v << 1) >> 1] | 0) >> 2) + (b[u + 2 >> 1] | 0) >> 1;\r\n                              if ((Z(l << 16 >> 16, o << 16 >> 16) | 0) > (Z(r, p << 16 >> 16) | 0)) {\r\n                                  o = r & 65535;\r\n                                  q = c;\r\n                                  s = w;\r\n                                  r = m & 65535;\r\n                                  p = l & 65535;\r\n                              } else r = t;\r\n                              m = v + X | 0;\r\n                              w = m & 65535;\r\n                              if (w << 16 >> 16 >= 40) break; else {\r\n                                  v = m << 16 >> 16;\r\n                                  u = u + 4 | 0;\r\n                                  t = r;\r\n                              }\r\n                          }\r\n                          n = n + X | 0;\r\n                          c = n & 65535;\r\n                          if (c << 16 >> 16 < 40) n = n << 16 >> 16; else {\r\n                              Q = q;\r\n                              P = s;\r\n                              n = r;\r\n                              break\r\n                          }\r\n                      }\r\n                  } else {\r\n                      o = 1;\r\n                      Q = c;\r\n                      P = B;\r\n                      n = 0;\r\n                  } while (0);\r\n                  q = o << 16 >> 16 << 15;\r\n                  o = b[_ >> 1] | 0;\r\n                  if (o << 16 >> 16 < 40) {\r\n                      m = Q << 16 >> 16;\r\n                      l = P << 16 >> 16;\r\n                      c = n & 65535;\r\n                      o = o << 16 >> 16;\r\n                      n = va;\r\n                      while (1) {\r\n                          J = b[g + (o * 80 | 0) + (o << 1) >> 1] >> 1;\r\n                          I = b[g + (o * 80 | 0) + (sa << 1) >> 1] | 0;\r\n                          K = b[g + (o * 80 | 0) + (R << 1) >> 1] | 0;\r\n                          L = b[g + (o * 80 | 0) + (m << 1) >> 1] | 0;\r\n                          M = b[g + (o * 80 | 0) + (l << 1) >> 1] | 0;\r\n                          b[n >> 1] = (e[f + (o << 1) >> 1] | 0) + c;\r\n                          b[n + 2 >> 1] = (I + 2 + J + K + L + M | 0) >>> 2;\r\n                          o = o + X | 0;\r\n                          if ((o & 65535) << 16 >> 16 < 40) {\r\n                              o = o << 16 >> 16;\r\n                              n = n + 4 | 0;\r\n                          } else break\r\n                      }\r\n                      J = b[_ >> 1] | 0;\r\n                  } else J = o;\r\n                  p = b[$ >> 1] | 0;\r\n                  o = p << 16 >> 16;\r\n                  b:do if (p << 16 >> 16 < 40) {\r\n                      C = Q << 16 >> 16;\r\n                      D = P << 16 >> 16;\r\n                      E = J << 16 >> 16;\r\n                      B = q + 32768 | 0;\r\n                      if (J << 16 >> 16 < 40) {\r\n                          r = 1;\r\n                          q = p;\r\n                          c = J;\r\n                          s = p;\r\n                          n = 0;\r\n                          p = -1;\r\n                      } else while (1) {\r\n                          o = o + X | 0;\r\n                          if ((o & 65535) << 16 >> 16 < 40) o = o << 16 >> 16; else {\r\n                              o = 1;\r\n                              M = p;\r\n                              L = J;\r\n                              n = 0;\r\n                              break b\r\n                          }\r\n                      }\r\n                      while (1) {\r\n                          l = e[f + (o << 1) >> 1] | 0;\r\n                          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;\r\n                          z = B + (b[g + (o * 80 | 0) + (o << 1) >> 1] << 11) | 0;\r\n                          x = E;\r\n                          v = J;\r\n                          y = va;\r\n                          while (1) {\r\n                              t = (e[y >> 1] | 0) + l | 0;\r\n                              m = z + (b[y + 2 >> 1] << 14) + (A + (b[g + (o * 80 | 0) + (x << 1) >> 1] | 0) << 12) | 0;\r\n                              u = t << 16 >> 16;\r\n                              u = (Z(u, u) | 0) >>> 15;\r\n                              if ((Z(u << 16 >> 16, r << 16 >> 16) | 0) > (Z(m >> 16, p << 16 >> 16) | 0)) {\r\n                                  r = m >>> 16 & 65535;\r\n                                  w = s;\r\n                                  c = v;\r\n                                  n = t & 65535;\r\n                                  p = u & 65535;\r\n                              } else w = q;\r\n                              q = x + X | 0;\r\n                              v = q & 65535;\r\n                              if (v << 16 >> 16 >= 40) {\r\n                                  q = w;\r\n                                  break\r\n                              } else {\r\n                                  x = q << 16 >> 16;\r\n                                  q = w;\r\n                                  y = y + 4 | 0;\r\n                              }\r\n                          }\r\n                          o = o + X | 0;\r\n                          s = o & 65535;\r\n                          if (s << 16 >> 16 < 40) o = o << 16 >> 16; else {\r\n                              o = r;\r\n                              M = q;\r\n                              L = c;\r\n                              break\r\n                          }\r\n                      }\r\n                  } else {\r\n                      o = 1;\r\n                      M = p;\r\n                      L = J;\r\n                      n = 0;\r\n                  } while (0);\r\n                  r = o << 16 >> 16 << 15;\r\n                  o = b[aa >> 1] | 0;\r\n                  if (o << 16 >> 16 < 40) {\r\n                      m = Q << 16 >> 16;\r\n                      l = P << 16 >> 16;\r\n                      p = M << 16 >> 16;\r\n                      q = L << 16 >> 16;\r\n                      c = n & 65535;\r\n                      o = o << 16 >> 16;\r\n                      n = va;\r\n                      while (1) {\r\n                          F = b[g + (o * 80 | 0) + (o << 1) >> 1] >> 1;\r\n                          E = b[g + (sa * 80 | 0) + (o << 1) >> 1] | 0;\r\n                          G = b[g + (R * 80 | 0) + (o << 1) >> 1] | 0;\r\n                          H = b[g + (m * 80 | 0) + (o << 1) >> 1] | 0;\r\n                          I = b[g + (l * 80 | 0) + (o << 1) >> 1] | 0;\r\n                          J = b[g + (p * 80 | 0) + (o << 1) >> 1] | 0;\r\n                          K = b[g + (q * 80 | 0) + (o << 1) >> 1] | 0;\r\n                          b[n >> 1] = (e[f + (o << 1) >> 1] | 0) + c;\r\n                          b[n + 2 >> 1] = (E + 4 + F + G + H + I + J + K | 0) >>> 3;\r\n                          o = o + X | 0;\r\n                          if ((o & 65535) << 16 >> 16 < 40) {\r\n                              o = o << 16 >> 16;\r\n                              n = n + 4 | 0;\r\n                          } else break\r\n                      }\r\n                      c = b[aa >> 1] | 0;\r\n                  } else c = o;\r\n                  s = b[ba >> 1] | 0;\r\n                  if (s << 16 >> 16 < 40) {\r\n                      J = Q << 16 >> 16;\r\n                      F = P << 16 >> 16;\r\n                      E = M << 16 >> 16;\r\n                      D = L << 16 >> 16;\r\n                      C = c << 16 >> 16;\r\n                      B = c << 16 >> 16 < 40;\r\n                      G = r + 32768 | 0;\r\n                      I = s << 16 >> 16;\r\n                      l = 1;\r\n                      w = s;\r\n                      v = c;\r\n                      H = s;\r\n                      q = 0;\r\n                      o = -1;\r\n                      while (1) {\r\n                          if (B) {\r\n                              r = e[f + (I << 1) >> 1] | 0;\r\n                              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;\r\n                              p = G + (b[g + (I * 80 | 0) + (I << 1) >> 1] << 10) | 0;\r\n                              u = C;\r\n                              s = c;\r\n                              z = v;\r\n                              A = va;\r\n                              while (1) {\r\n                                  y = (e[A >> 1] | 0) + r | 0;\r\n                                  v = p + (b[A + 2 >> 1] << 14) + (n + (b[g + (I * 80 | 0) + (u << 1) >> 1] | 0) << 11) | 0;\r\n                                  x = y << 16 >> 16;\r\n                                  x = (Z(x, x) | 0) >>> 15;\r\n                                  if ((Z(x << 16 >> 16, l << 16 >> 16) | 0) > (Z(v >> 16, o << 16 >> 16) | 0)) {\r\n                                      l = v >>> 16 & 65535;\r\n                                      w = H;\r\n                                      v = s;\r\n                                      q = y & 65535;\r\n                                      o = x & 65535;\r\n                                  } else v = z;\r\n                                  t = u + X | 0;\r\n                                  s = t & 65535;\r\n                                  if (s << 16 >> 16 >= 40) break; else {\r\n                                      u = t << 16 >> 16;\r\n                                      z = v;\r\n                                      A = A + 4 | 0;\r\n                                  }\r\n                              }\r\n                          }\r\n                          s = I + X | 0;\r\n                          H = s & 65535;\r\n                          if (H << 16 >> 16 >= 40) {\r\n                              K = v;\r\n                              break\r\n                          } else I = s << 16 >> 16;\r\n                      }\r\n                  } else {\r\n                      l = 1;\r\n                      w = s;\r\n                      K = c;\r\n                      q = 0;\r\n                      o = -1;\r\n                  }\r\n                  if (ta) {\r\n                      u = l << 16 >> 16 << 15;\r\n                      o = b[ca >> 1] | 0;\r\n                      if (o << 16 >> 16 < 40) {\r\n                          n = Q << 16 >> 16;\r\n                          c = P << 16 >> 16;\r\n                          m = M << 16 >> 16;\r\n                          l = L << 16 >> 16;\r\n                          r = w << 16 >> 16;\r\n                          s = K << 16 >> 16;\r\n                          p = q & 65535;\r\n                          o = o << 16 >> 16;\r\n                          q = va;\r\n                          while (1) {\r\n                              E = b[g + (o * 80 | 0) + (o << 1) >> 1] >> 1;\r\n                              D = b[g + (sa * 80 | 0) + (o << 1) >> 1] | 0;\r\n                              F = b[g + (R * 80 | 0) + (o << 1) >> 1] | 0;\r\n                              G = b[g + (n * 80 | 0) + (o << 1) >> 1] | 0;\r\n                              H = b[g + (c * 80 | 0) + (o << 1) >> 1] | 0;\r\n                              I = b[g + (m * 80 | 0) + (o << 1) >> 1] | 0;\r\n                              J = b[g + (l * 80 | 0) + (o << 1) >> 1] | 0;\r\n                              N = b[g + (r * 80 | 0) + (o << 1) >> 1] | 0;\r\n                              O = b[g + (s * 80 | 0) + (o << 1) >> 1] | 0;\r\n                              b[q >> 1] = (e[f + (o << 1) >> 1] | 0) + p;\r\n                              b[q + 2 >> 1] = (D + 4 + E + F + G + H + I + J + N + O | 0) >>> 3;\r\n                              o = o + X | 0;\r\n                              if ((o & 65535) << 16 >> 16 < 40) {\r\n                                  o = o << 16 >> 16;\r\n                                  q = q + 4 | 0;\r\n                              } else break\r\n                          }\r\n                          J = b[ca >> 1] | 0;\r\n                      } else J = o;\r\n                      r = b[da >> 1] | 0;\r\n                      if (r << 16 >> 16 < 40) {\r\n                          E = Q << 16 >> 16;\r\n                          D = P << 16 >> 16;\r\n                          C = M << 16 >> 16;\r\n                          m = L << 16 >> 16;\r\n                          F = w << 16 >> 16;\r\n                          G = K << 16 >> 16;\r\n                          H = J << 16 >> 16;\r\n                          I = J << 16 >> 16 < 40;\r\n                          B = u + 32768 | 0;\r\n                          n = r << 16 >> 16;\r\n                          l = 1;\r\n                          s = r;\r\n                          q = J;\r\n                          c = r;\r\n                          o = -1;\r\n                          while (1) {\r\n                              if (I) {\r\n                                  u = e[f + (n << 1) >> 1] | 0;\r\n                                  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\n                                  r = B + (b[g + (n * 80 | 0) + (n << 1) >> 1] << 9) | 0;\r\n                                  A = H;\r\n                                  x = J;\r\n                                  z = va;\r\n                                  while (1) {\r\n                                      y = (e[z >> 1] | 0) + u << 16 >> 16;\r\n                                      y = (Z(y, y) | 0) >>> 15;\r\n                                      v = r + (b[z + 2 >> 1] << 13) + (p + (b[g + (n * 80 | 0) + (A << 1) >> 1] | 0) << 10) | 0;\r\n                                      if ((Z(y << 16 >> 16, l << 16 >> 16) | 0) > (Z(v >> 16, o << 16 >> 16) | 0)) {\r\n                                          l = v >>> 16 & 65535;\r\n                                          s = c;\r\n                                          q = x;\r\n                                          o = y & 65535;\r\n                                      }\r\n                                      t = A + X | 0;\r\n                                      x = t & 65535;\r\n                                      if (x << 16 >> 16 >= 40) break; else {\r\n                                          A = t << 16 >> 16;\r\n                                          z = z + 4 | 0;\r\n                                      }\r\n                                  }\r\n                              }\r\n                              r = n + X | 0;\r\n                              c = r & 65535;\r\n                              if (c << 16 >> 16 >= 40) break; else n = r << 16 >> 16;\r\n                          }\r\n                      } else {\r\n                          l = 1;\r\n                          s = r;\r\n                          q = J;\r\n                          o = -1;\r\n                      }\r\n                  } else {\r\n                      s = N;\r\n                      q = O;\r\n                  }\r\n                  if ((Z(o << 16 >> 16, T << 16 >> 16) | 0) > (Z(l << 16 >> 16, U << 16 >> 16) | 0)) {\r\n                      b[k >> 1] = ua;\r\n                      b[ea >> 1] = S;\r\n                      b[fa >> 1] = Q;\r\n                      b[ga >> 1] = P;\r\n                      b[ha >> 1] = M;\r\n                      b[ia >> 1] = L;\r\n                      b[ja >> 1] = w;\r\n                      b[ka >> 1] = K;\r\n                      if (ta) {\r\n                          b[la >> 1] = s;\r\n                          b[ma >> 1] = q;\r\n                      }\r\n                  } else {\r\n                      l = T;\r\n                      o = U;\r\n                  }\r\n                  n = b[ra >> 1] | 0;\r\n                  if (na) {\r\n                      c = 1;\r\n                      m = 2;\r\n                      while (1) {\r\n                          b[h + (c << 1) >> 1] = b[h + (m << 1) >> 1] | 0;\r\n                          m = m + 1 | 0;\r\n                          if ((m & 65535) << 16 >> 16 == a << 16 >> 16) break; else c = c + 1 | 0;\r\n                      }\r\n                  }\r\n                  b[V >> 1] = n;\r\n                  W = W + 1 << 16 >> 16;\r\n                  if (W << 16 >> 16 >= d << 16 >> 16) break; else {\r\n                      T = l;\r\n                      N = s;\r\n                      O = q;\r\n                      U = o;\r\n                  }\r\n              }\r\n              i = wa;\r\n              return\r\n          }\r\n\r\n          function qd(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0, h = 0, i = 0, j = 0, k = 0;\r\n              i = 39;\r\n              while (1) {\r\n                  h = a + (i << 1) | 0;\r\n                  g = b[h >> 1] | 0;\r\n                  f = c + (i << 1) | 0;\r\n                  if (g << 16 >> 16 > -1) b[f >> 1] = 32767; else {\r\n                      b[f >> 1] = -32767;\r\n                      if (g << 16 >> 16 == -32768) g = 32767; else g = 0 - (g & 65535) & 65535;\r\n                      b[h >> 1] = g;\r\n                  }\r\n                  b[d + (i << 1) >> 1] = g;\r\n                  if ((i | 0) > 0) i = i + -1 | 0; else break\r\n              }\r\n              k = 8 - (e << 16 >> 16) | 0;\r\n              if ((k | 0) > 0) {\r\n                  j = 0;\r\n                  f = 0;\r\n              } else return;\r\n              do {\r\n                  e = 0;\r\n                  a = 0;\r\n                  h = 32767;\r\n                  while (1) {\r\n                      c = b[d + (e << 1) >> 1] | 0;\r\n                      i = c << 16 >> 16 > -1 ? c << 16 >> 16 < h << 16 >> 16 : 0;\r\n                      f = i ? a : f;\r\n                      g = e + 5 | 0;\r\n                      a = g & 65535;\r\n                      if (a << 16 >> 16 >= 40) break; else {\r\n                          e = g << 16 >> 16;\r\n                          h = i ? c : h;\r\n                      }\r\n                  }\r\n                  b[d + (f << 16 >> 16 << 1) >> 1] = -1;\r\n                  j = j + 1 << 16 >> 16;\r\n              } while ((j << 16 >> 16 | 0) < (k | 0));\r\n              j = 0;\r\n              do {\r\n                  c = 1;\r\n                  a = 1;\r\n                  g = 32767;\r\n                  while (1) {\r\n                      e = b[d + (c << 1) >> 1] | 0;\r\n                      i = e << 16 >> 16 > -1 ? e << 16 >> 16 < g << 16 >> 16 : 0;\r\n                      f = i ? a : f;\r\n                      h = c + 5 | 0;\r\n                      a = h & 65535;\r\n                      if (a << 16 >> 16 >= 40) break; else {\r\n                          c = h << 16 >> 16;\r\n                          g = i ? e : g;\r\n                      }\r\n                  }\r\n                  b[d + (f << 16 >> 16 << 1) >> 1] = -1;\r\n                  j = j + 1 << 16 >> 16;\r\n              } while ((j << 16 >> 16 | 0) < (k | 0));\r\n              j = 0;\r\n              do {\r\n                  c = 2;\r\n                  a = 2;\r\n                  g = 32767;\r\n                  while (1) {\r\n                      e = b[d + (c << 1) >> 1] | 0;\r\n                      i = e << 16 >> 16 > -1 ? e << 16 >> 16 < g << 16 >> 16 : 0;\r\n                      f = i ? a : f;\r\n                      h = c + 5 | 0;\r\n                      a = h & 65535;\r\n                      if (a << 16 >> 16 >= 40) break; else {\r\n                          c = h << 16 >> 16;\r\n                          g = i ? e : g;\r\n                      }\r\n                  }\r\n                  b[d + (f << 16 >> 16 << 1) >> 1] = -1;\r\n                  j = j + 1 << 16 >> 16;\r\n              } while ((j << 16 >> 16 | 0) < (k | 0));\r\n              j = 0;\r\n              while (1) {\r\n                  c = 3;\r\n                  a = 3;\r\n                  g = 32767;\r\n                  while (1) {\r\n                      e = b[d + (c << 1) >> 1] | 0;\r\n                      i = e << 16 >> 16 > -1 ? e << 16 >> 16 < g << 16 >> 16 : 0;\r\n                      f = i ? a : f;\r\n                      h = c + 5 | 0;\r\n                      a = h & 65535;\r\n                      if (a << 16 >> 16 >= 40) {\r\n                          g = f;\r\n                          break\r\n                      } else {\r\n                          c = h << 16 >> 16;\r\n                          g = i ? e : g;\r\n                      }\r\n                  }\r\n                  b[d + (g << 16 >> 16 << 1) >> 1] = -1;\r\n                  j = j + 1 << 16 >> 16;\r\n                  if ((j << 16 >> 16 | 0) >= (k | 0)) {\r\n                      f = 0;\r\n                      break\r\n                  } else f = g;\r\n              }\r\n              do {\r\n                  c = 4;\r\n                  a = 4;\r\n                  j = 32767;\r\n                  while (1) {\r\n                      e = b[d + (c << 1) >> 1] | 0;\r\n                      i = e << 16 >> 16 > -1 ? e << 16 >> 16 < j << 16 >> 16 : 0;\r\n                      g = i ? a : g;\r\n                      h = c + 5 | 0;\r\n                      a = h & 65535;\r\n                      if (a << 16 >> 16 >= 40) break; else {\r\n                          c = h << 16 >> 16;\r\n                          j = i ? e : j;\r\n                      }\r\n                  }\r\n                  b[d + (g << 16 >> 16 << 1) >> 1] = -1;\r\n                  f = f + 1 << 16 >> 16;\r\n              } while ((f << 16 >> 16 | 0) < (k | 0));\r\n              return\r\n          }\r\n\r\n          function rd(a, d, e, f, g, h, j, k) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              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;\r\n              y = i;\r\n              i = i + 80 | 0;\r\n              x = y;\r\n              p = 40;\r\n              q = d;\r\n              r = a;\r\n              m = 256;\r\n              n = 256;\r\n              while (1) {\r\n                  l = b[q >> 1] | 0;\r\n                  q = q + 2 | 0;\r\n                  l = Z(l, l) | 0;\r\n                  if ((l | 0) != 1073741824) {\r\n                      o = (l << 1) + m | 0;\r\n                      if ((l ^ m | 0) > 0 & (o ^ m | 0) < 0) {\r\n                          c[k >> 2] = 1;\r\n                          m = (m >>> 31) + 2147483647 | 0;\r\n                      } else m = o;\r\n                  } else {\r\n                      c[k >> 2] = 1;\r\n                      m = 2147483647;\r\n                  }\r\n                  w = b[r >> 1] | 0;\r\n                  n = (Z(w << 1, w) | 0) + n | 0;\r\n                  p = p + -1 << 16 >> 16;\r\n                  if (!(p << 16 >> 16)) break; else r = r + 2 | 0;\r\n              }\r\n              w = ce(m, k) | 0;\r\n              u = w << 5;\r\n              w = ((u >> 5 | 0) == (w | 0) ? u : w >> 31 ^ 2147418112) >> 16;\r\n              u = (ce(n, k) | 0) << 5 >> 16;\r\n              v = 39;\r\n              s = d + 78 | 0;\r\n              t = x + 78 | 0;\r\n              l = e + 78 | 0;\r\n              while (1) {\r\n                  r = Z(b[s >> 1] | 0, w) | 0;\r\n                  s = s + -2 | 0;\r\n                  q = r << 1;\r\n                  d = a + (v << 1) | 0;\r\n                  m = b[d >> 1] | 0;\r\n                  p = Z(m << 16 >> 16, u) | 0;\r\n                  if ((p | 0) != 1073741824) {\r\n                      o = (p << 1) + q | 0;\r\n                      if ((p ^ q | 0) > 0 & (o ^ q | 0) < 0) {\r\n                          c[k >> 2] = 1;\r\n                          o = (r >>> 30 & 1) + 2147483647 | 0;\r\n                      }\r\n                  } else {\r\n                      c[k >> 2] = 1;\r\n                      o = 2147483647;\r\n                  }\r\n                  n = o << 10;\r\n                  n = Ce((n >> 10 | 0) == (o | 0) ? n : o >> 31 ^ 2147483647, k) | 0;\r\n                  if (n << 16 >> 16 > -1) b[l >> 1] = 32767; else {\r\n                      b[l >> 1] = -32767;\r\n                      if (n << 16 >> 16 == -32768) n = 32767; else n = 0 - (n & 65535) & 65535;\r\n                      if (m << 16 >> 16 == -32768) o = 32767; else o = 0 - (m & 65535) & 65535;\r\n                      b[d >> 1] = o;\r\n                  }\r\n                  l = l + -2 | 0;\r\n                  b[t >> 1] = n;\r\n                  if ((v | 0) <= 0) break; else {\r\n                      v = v + -1 | 0;\r\n                      t = t + -2 | 0;\r\n                  }\r\n              }\r\n              d = g << 16 >> 16;\r\n              if (g << 16 >> 16 <= 0) {\r\n                  b[h + (d << 1) >> 1] = b[h >> 1] | 0;\r\n                  i = y;\r\n                  return\r\n              }\r\n              r = j & 65535;\r\n              q = 0;\r\n              p = -1;\r\n              l = 0;\r\n              while (1) {\r\n                  if ((q | 0) < 40) {\r\n                      n = q;\r\n                      o = q & 65535;\r\n                      m = -1;\r\n                      while (1) {\r\n                          k = b[x + (n << 1) >> 1] | 0;\r\n                          j = k << 16 >> 16 > m << 16 >> 16;\r\n                          m = j ? k : m;\r\n                          l = j ? o : l;\r\n                          n = n + r | 0;\r\n                          o = n & 65535;\r\n                          if (o << 16 >> 16 >= 40) break; else n = n << 16 >> 16;\r\n                      }\r\n                  } else m = -1;\r\n                  b[f + (q << 1) >> 1] = l;\r\n                  if (m << 16 >> 16 > p << 16 >> 16) b[h >> 1] = q; else m = p;\r\n                  q = q + 1 | 0;\r\n                  if ((q & 65535) << 16 >> 16 == g << 16 >> 16) break; else p = m;\r\n              }\r\n              l = b[h >> 1] | 0;\r\n              b[h + (d << 1) >> 1] = l;\r\n              if (g << 16 >> 16 > 1) m = 1; else {\r\n                  i = y;\r\n                  return\r\n              }\r\n              do {\r\n                  f = l + 1 << 16 >> 16;\r\n                  l = f << 16 >> 16 >= g << 16 >> 16 ? 0 : f;\r\n                  b[h + (m << 1) >> 1] = l;\r\n                  b[h + (m + d << 1) >> 1] = l;\r\n                  m = m + 1 | 0;\r\n              } while ((m & 65535) << 16 >> 16 != g << 16 >> 16);\r\n              i = y;\r\n              return\r\n          }\r\n\r\n          function sd(a) {\r\n              a = a | 0;\r\n              var d = 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(12) | 0;\r\n              if (!d) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              b[d >> 1] = 8;\r\n              c[a >> 2] = d;\r\n              b[d + 2 >> 1] = 3;\r\n              b[d + 4 >> 1] = 0;\r\n              c[d + 8 >> 2] = 0;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function td(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Ke(b);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function ud(a, d, e) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0, h = 0;\r\n              do if ((d | 0) == 8) {\r\n                  f = a + 2 | 0;\r\n                  g = (b[f >> 1] | 0) + -1 << 16 >> 16;\r\n                  b[f >> 1] = g;\r\n                  d = a + 8 | 0;\r\n                  if (!(c[d >> 2] | 0)) {\r\n                      c[e >> 2] = 1;\r\n                      b[f >> 1] = 3;\r\n                      break\r\n                  }\r\n                  h = a + 4 | 0;\r\n                  if (g << 16 >> 16 > 2 & (b[h >> 1] | 0) > 0) {\r\n                      c[e >> 2] = 2;\r\n                      b[h >> 1] = (b[h >> 1] | 0) + -1 << 16 >> 16;\r\n                      break\r\n                  }\r\n                  if (!(g << 16 >> 16)) {\r\n                      c[e >> 2] = 2;\r\n                      b[f >> 1] = b[a >> 1] | 0;\r\n                      break\r\n                  } else {\r\n                      c[e >> 2] = 3;\r\n                      break\r\n                  }\r\n              } else {\r\n                  b[a + 2 >> 1] = b[a >> 1] | 0;\r\n                  c[e >> 2] = 0;\r\n                  d = a + 8 | 0;\r\n              } while (0);\r\n              c[d >> 2] = c[e >> 2];\r\n              return\r\n          }\r\n\r\n          function vd(a, b, d) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              d = d | 0;\r\n              var e = 0, f = 0, g = 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(12) | 0;\r\n              e = d;\r\n              if (!d) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[d >> 2] = 0;\r\n              f = d + 4 | 0;\r\n              c[f >> 2] = 0;\r\n              g = d + 8 | 0;\r\n              c[g >> 2] = b;\r\n              if ((dd(d) | 0) << 16 >> 16 == 0 ? (ac(f, c[g >> 2] | 0) | 0) << 16 >> 16 == 0 : 0) {\r\n                  ed(c[d >> 2] | 0) | 0;\r\n                  cc(c[f >> 2] | 0) | 0;\r\n                  c[a >> 2] = e;\r\n                  a = 0;\r\n                  return a | 0\r\n              }\r\n              fd(d);\r\n              bc(f);\r\n              Ke(d);\r\n              a = -1;\r\n              return a | 0\r\n          }\r\n\r\n          function wd(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              fd(b);\r\n              bc((c[a >> 2] | 0) + 4 | 0);\r\n              Ke(c[a >> 2] | 0);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function xd(a, d, f, g, h) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              var j = 0, k = 0, l = 0, m = 0, n = 0;\r\n              m = i;\r\n              i = i + 448 | 0;\r\n              k = m + 320 | 0;\r\n              l = m;\r\n              Qe(g | 0, 0, 488) | 0;\r\n              j = 0;\r\n              do {\r\n                  n = f + (j << 1) | 0;\r\n                  b[n >> 1] = (e[n >> 1] | 0) & 65528;\r\n                  j = j + 1 | 0;\r\n              } while ((j | 0) != 160);\r\n              gd(c[a >> 2] | 0, f, 160);\r\n              n = a + 4 | 0;\r\n              dc(c[n >> 2] | 0, d, f, k, h, l) | 0;\r\n              hd(c[h >> 2] | 0, k, g, (c[n >> 2] | 0) + 2392 | 0);\r\n              i = m;\r\n              return\r\n          }\r\n\r\n          function yd(a, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              p = p | 0;\r\n              q = q | 0;\r\n              r = r | 0;\r\n              var s = 0, t = 0, u = 0;\r\n              u = i;\r\n              i = i + 48 | 0;\r\n              s = u + 22 | 0;\r\n              t = u;\r\n              Ie(f, (a & -2 | 0) == 6 ? d : c, s);\r\n              Ie(f, e, t);\r\n              d = m;\r\n              c = s;\r\n              f = d + 22 | 0;\r\n              do {\r\n                  b[d >> 1] = b[c >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  c = c + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              He(g, m, o, 40, l, 0);\r\n              He(t, o, o, 40, l, 0);\r\n              Be(g, h, q, 40);\r\n              d = n;\r\n              c = q;\r\n              f = d + 80 | 0;\r\n              do {\r\n                  b[d >> 1] = b[c >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  c = c + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              He(g, n, r, 40, j, 0);\r\n              Be(s, r, p, 40);\r\n              He(t, p, p, 40, k, 0);\r\n              i = u;\r\n              return\r\n          }\r\n\r\n          function zd(a, c, d, f, g, h, i, j, k, l, m, n, o, p, q, r, s) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              m = m | 0;\r\n              n = n | 0;\r\n              o = o | 0;\r\n              p = p | 0;\r\n              q = q | 0;\r\n              r = r | 0;\r\n              s = s | 0;\r\n              var t = 0, u = 0, v = 0, w = 0, x = 0;\r\n              if ((c | 0) == 7) {\r\n                  v = 11;\r\n                  c = f << 16 >> 16 >>> 1 & 65535;\r\n                  t = 2;\r\n              } else {\r\n                  v = 13;\r\n                  c = f;\r\n                  t = 1;\r\n              }\r\n              b[r >> 1] = f << 16 >> 16 < 13017 ? f : 13017;\r\n              u = d << 16 >> 16;\r\n              q = q + (u << 1) | 0;\r\n              r = c << 16 >> 16;\r\n              g = g << 16 >> 16;\r\n              d = 20;\r\n              c = k;\r\n              s = q;\r\n              while (1) {\r\n                  k = s + 2 | 0;\r\n                  x = Z(b[s >> 1] | 0, r) | 0;\r\n                  w = Z(b[k >> 1] | 0, r) | 0;\r\n                  x = (Z(b[c >> 1] | 0, g) | 0) + x << 1;\r\n                  w = (Z(b[c + 2 >> 1] | 0, g) | 0) + w << 1 << t;\r\n                  b[s >> 1] = ((x << t) + 32768 | 0) >>> 16;\r\n                  b[k >> 1] = (w + 32768 | 0) >>> 16;\r\n                  d = d + -1 << 16 >> 16;\r\n                  if (!(d << 16 >> 16)) break; else {\r\n                      c = c + 4 | 0;\r\n                      s = s + 4 | 0;\r\n                  }\r\n              }\r\n              c = f << 16 >> 16;\r\n              He(h, q, i + (u << 1) | 0, 40, n, 1);\r\n              d = 30;\r\n              s = 0;\r\n              while (1) {\r\n                  w = d + u | 0;\r\n                  b[o + (s << 1) >> 1] = (e[a + (w << 1) >> 1] | 0) - (e[i + (w << 1) >> 1] | 0);\r\n                  w = Z(b[l + (d << 1) >> 1] | 0, c) | 0;\r\n                  x = (Z(b[m + (d << 1) >> 1] | 0, g) | 0) >> v;\r\n                  b[p + (s << 1) >> 1] = (e[j + (d << 1) >> 1] | 0) - (w >>> 14) - x;\r\n                  s = s + 1 | 0;\r\n                  if ((s | 0) == 10) break; else d = d + 1 | 0;\r\n              }\r\n              return\r\n          }\r\n\r\n          function Ad(a) {\r\n              a = a | 0;\r\n              var d = 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(16) | 0;\r\n              if (!d) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              ;b[d >> 1] = 0;\r\n              b[d + 2 >> 1] = 0;\r\n              b[d + 4 >> 1] = 0;\r\n              b[d + 6 >> 1] = 0;\r\n              b[d + 8 >> 1] = 0;\r\n              b[d + 10 >> 1] = 0;\r\n              b[d + 12 >> 1] = 0;\r\n              b[d + 14 >> 1] = 0;\r\n              c[a >> 2] = d;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function Bd(a) {\r\n              a = a | 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              ;b[a >> 1] = 0;\r\n              b[a + 2 >> 1] = 0;\r\n              b[a + 4 >> 1] = 0;\r\n              b[a + 6 >> 1] = 0;\r\n              b[a + 8 >> 1] = 0;\r\n              b[a + 10 >> 1] = 0;\r\n              b[a + 12 >> 1] = 0;\r\n              b[a + 14 >> 1] = 0;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function Cd(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Ke(b);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function Dd(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var f = 0, g = 0, h = 0, i = 0;\r\n              f = e[c + 6 >> 1] | 0;\r\n              d = e[c + 8 >> 1] | 0;\r\n              g = f - d | 0;\r\n              g = (g & 65535 | 0) != 32767 ? g & 65535 : 32767;\r\n              h = e[c + 10 >> 1] | 0;\r\n              d = d - h | 0;\r\n              g = (d << 16 >> 16 | 0) < (g << 16 >> 16 | 0) ? d & 65535 : g;\r\n              d = e[c + 12 >> 1] | 0;\r\n              h = h - d | 0;\r\n              g = (h << 16 >> 16 | 0) < (g << 16 >> 16 | 0) ? h & 65535 : g;\r\n              h = e[c + 14 >> 1] | 0;\r\n              d = d - h | 0;\r\n              g = (d << 16 >> 16 | 0) < (g << 16 >> 16 | 0) ? d & 65535 : g;\r\n              h = h - (e[c + 16 >> 1] | 0) | 0;\r\n              d = b[c + 2 >> 1] | 0;\r\n              i = e[c + 4 >> 1] | 0;\r\n              c = (d & 65535) - i | 0;\r\n              c = (c & 65535 | 0) != 32767 ? c & 65535 : 32767;\r\n              f = i - f | 0;\r\n              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)) {\r\n                  h = (b[a >> 1] | 0) + 1 << 16 >> 16;\r\n                  i = h << 16 >> 16 > 11;\r\n                  b[a >> 1] = i ? 12 : h;\r\n                  return i & 1 | 0\r\n              } else {\r\n                  b[a >> 1] = 0;\r\n                  return 0\r\n              }\r\n              return 0\r\n          }\r\n\r\n          function Ed(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              c = De(c, 3, d) | 0;\r\n              c = Rd(c, b[a + 2 >> 1] | 0, d) | 0;\r\n              c = Rd(c, b[a + 4 >> 1] | 0, d) | 0;\r\n              c = Rd(c, b[a + 6 >> 1] | 0, d) | 0;\r\n              c = Rd(c, b[a + 8 >> 1] | 0, d) | 0;\r\n              c = Rd(c, b[a + 10 >> 1] | 0, d) | 0;\r\n              c = Rd(c, b[a + 12 >> 1] | 0, d) | 0;\r\n              return (Rd(c, b[a + 14 >> 1] | 0, d) | 0) << 16 >> 16 > 15565 | 0\r\n          }\r\n\r\n          function Fd(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var e = 0;\r\n              d = a + 4 | 0;\r\n              b[a + 2 >> 1] = b[d >> 1] | 0;\r\n              e = a + 6 | 0;\r\n              b[d >> 1] = b[e >> 1] | 0;\r\n              d = a + 8 | 0;\r\n              b[e >> 1] = b[d >> 1] | 0;\r\n              e = a + 10 | 0;\r\n              b[d >> 1] = b[e >> 1] | 0;\r\n              d = a + 12 | 0;\r\n              b[e >> 1] = b[d >> 1] | 0;\r\n              a = a + 14 | 0;\r\n              b[d >> 1] = b[a >> 1] | 0;\r\n              b[a >> 1] = c << 16 >> 16 >>> 3;\r\n              return\r\n          }\r\n\r\n          function Gd(a) {\r\n              a = a | 0;\r\n              var d = 0, e = 0, f = 0;\r\n              if (!a) {\r\n                  f = -1;\r\n                  return f | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(128) | 0;\r\n              if (!d) {\r\n                  f = -1;\r\n                  return f | 0\r\n              }\r\n              e = d + 72 | 0;\r\n              f = e + 46 | 0;\r\n              do {\r\n                  b[e >> 1] = 0;\r\n                  e = e + 2 | 0;\r\n              } while ((e | 0) < (f | 0));\r\n              b[d >> 1] = 150;\r\n              b[d + 36 >> 1] = 150;\r\n              b[d + 18 >> 1] = 150;\r\n              b[d + 54 >> 1] = 0;\r\n              b[d + 2 >> 1] = 150;\r\n              b[d + 38 >> 1] = 150;\r\n              b[d + 20 >> 1] = 150;\r\n              b[d + 56 >> 1] = 0;\r\n              b[d + 4 >> 1] = 150;\r\n              b[d + 40 >> 1] = 150;\r\n              b[d + 22 >> 1] = 150;\r\n              b[d + 58 >> 1] = 0;\r\n              b[d + 6 >> 1] = 150;\r\n              b[d + 42 >> 1] = 150;\r\n              b[d + 24 >> 1] = 150;\r\n              b[d + 60 >> 1] = 0;\r\n              b[d + 8 >> 1] = 150;\r\n              b[d + 44 >> 1] = 150;\r\n              b[d + 26 >> 1] = 150;\r\n              b[d + 62 >> 1] = 0;\r\n              b[d + 10 >> 1] = 150;\r\n              b[d + 46 >> 1] = 150;\r\n              b[d + 28 >> 1] = 150;\r\n              b[d + 64 >> 1] = 0;\r\n              b[d + 12 >> 1] = 150;\r\n              b[d + 48 >> 1] = 150;\r\n              b[d + 30 >> 1] = 150;\r\n              b[d + 66 >> 1] = 0;\r\n              b[d + 14 >> 1] = 150;\r\n              b[d + 50 >> 1] = 150;\r\n              b[d + 32 >> 1] = 150;\r\n              b[d + 68 >> 1] = 0;\r\n              b[d + 16 >> 1] = 150;\r\n              b[d + 52 >> 1] = 150;\r\n              b[d + 34 >> 1] = 150;\r\n              b[d + 70 >> 1] = 0;\r\n              b[d + 118 >> 1] = 13106;\r\n              b[d + 120 >> 1] = 0;\r\n              b[d + 122 >> 1] = 0;\r\n              b[d + 124 >> 1] = 0;\r\n              b[d + 126 >> 1] = 13106;\r\n              c[a >> 2] = d;\r\n              f = 0;\r\n              return f | 0\r\n          }\r\n\r\n          function Hd(a) {\r\n              a = a | 0;\r\n              var c = 0, d = 0;\r\n              if (!a) {\r\n                  d = -1;\r\n                  return d | 0\r\n              }\r\n              c = a + 72 | 0;\r\n              d = c + 46 | 0;\r\n              do {\r\n                  b[c >> 1] = 0;\r\n                  c = c + 2 | 0;\r\n              } while ((c | 0) < (d | 0));\r\n              b[a >> 1] = 150;\r\n              b[a + 36 >> 1] = 150;\r\n              b[a + 18 >> 1] = 150;\r\n              b[a + 54 >> 1] = 0;\r\n              b[a + 2 >> 1] = 150;\r\n              b[a + 38 >> 1] = 150;\r\n              b[a + 20 >> 1] = 150;\r\n              b[a + 56 >> 1] = 0;\r\n              b[a + 4 >> 1] = 150;\r\n              b[a + 40 >> 1] = 150;\r\n              b[a + 22 >> 1] = 150;\r\n              b[a + 58 >> 1] = 0;\r\n              b[a + 6 >> 1] = 150;\r\n              b[a + 42 >> 1] = 150;\r\n              b[a + 24 >> 1] = 150;\r\n              b[a + 60 >> 1] = 0;\r\n              b[a + 8 >> 1] = 150;\r\n              b[a + 44 >> 1] = 150;\r\n              b[a + 26 >> 1] = 150;\r\n              b[a + 62 >> 1] = 0;\r\n              b[a + 10 >> 1] = 150;\r\n              b[a + 46 >> 1] = 150;\r\n              b[a + 28 >> 1] = 150;\r\n              b[a + 64 >> 1] = 0;\r\n              b[a + 12 >> 1] = 150;\r\n              b[a + 48 >> 1] = 150;\r\n              b[a + 30 >> 1] = 150;\r\n              b[a + 66 >> 1] = 0;\r\n              b[a + 14 >> 1] = 150;\r\n              b[a + 50 >> 1] = 150;\r\n              b[a + 32 >> 1] = 150;\r\n              b[a + 68 >> 1] = 0;\r\n              b[a + 16 >> 1] = 150;\r\n              b[a + 52 >> 1] = 150;\r\n              b[a + 34 >> 1] = 150;\r\n              b[a + 70 >> 1] = 0;\r\n              b[a + 118 >> 1] = 13106;\r\n              b[a + 120 >> 1] = 0;\r\n              b[a + 122 >> 1] = 0;\r\n              b[a + 124 >> 1] = 0;\r\n              b[a + 126 >> 1] = 13106;\r\n              d = 0;\r\n              return d | 0\r\n          }\r\n\r\n          function Id(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Ke(b);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function Jd(a, c) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              b[a + 118 >> 1] = c;\r\n              return\r\n          }\r\n\r\n          function Kd(a, d, f, g) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              var h = 0;\r\n              f = Ce(f, g) | 0;\r\n              if (f << 16 >> 16 <= 0) return;\r\n              f = f << 16 >> 16;\r\n              if ((f * 21298 | 0) == 1073741824) {\r\n                  c[g >> 2] = 1;\r\n                  h = 2147483647;\r\n              } else h = f * 42596 | 0;\r\n              f = d - h | 0;\r\n              if (((f ^ d) & (h ^ d) | 0) < 0) {\r\n                  c[g >> 2] = 1;\r\n                  f = (d >>> 31) + 2147483647 | 0;\r\n              }\r\n              if ((f | 0) <= 0) return;\r\n              a = a + 104 | 0;\r\n              b[a >> 1] = e[a >> 1] | 0 | 16384;\r\n              return\r\n          }\r\n\r\n          function Ld(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var e = 0;\r\n              a = a + 104 | 0;\r\n              e = De(b[a >> 1] | 0, 1, d) | 0;\r\n              b[a >> 1] = e;\r\n              if (!(c << 16 >> 16)) return;\r\n              b[a >> 1] = (De(e, 1, d) | 0) & 65535 | 8192;\r\n              return\r\n          }\r\n\r\n          function Md(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var f = 0, g = 0, h = 0;\r\n              g = a + 112 | 0;\r\n              f = Ge(b[g >> 1] | 0, b[c >> 1] | 0, d) | 0;\r\n              f = (f & 65535) - ((f & 65535) >>> 15 & 65535) | 0;\r\n              f = ((f << 16 >> 31 ^ f) & 65535) << 16 >> 16 < 4;\r\n              h = b[c >> 1] | 0;\r\n              b[g >> 1] = h;\r\n              c = c + 2 | 0;\r\n              h = Ge(h, b[c >> 1] | 0, d) | 0;\r\n              h = (h & 65535) - ((h & 65535) >>> 15 & 65535) | 0;\r\n              f = ((h << 16 >> 31 ^ h) & 65535) << 16 >> 16 < 4 ? (f ? 2 : 1) : f & 1;\r\n              b[g >> 1] = b[c >> 1] | 0;\r\n              g = a + 102 | 0;\r\n              b[g >> 1] = De(b[g >> 1] | 0, 1, d) | 0;\r\n              c = a + 110 | 0;\r\n              if ((Rd(b[c >> 1] | 0, f, d) | 0) << 16 >> 16 <= 3) {\r\n                  b[c >> 1] = f;\r\n                  return\r\n              }\r\n              b[g >> 1] = e[g >> 1] | 0 | 16384;\r\n              b[c >> 1] = f;\r\n              return\r\n          }\r\n\r\n          function Nd(a, d, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              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,\r\n                  w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0;\r\n              D = i;\r\n              i = i + 352 | 0;\r\n              n = D + 24 | 0;\r\n              B = D;\r\n              k = 0;\r\n              h = 0;\r\n              do {\r\n                  g = b[d + (k + -40 << 1) >> 1] | 0;\r\n                  g = Z(g, g) | 0;\r\n                  if ((g | 0) != 1073741824) {\r\n                      j = (g << 1) + h | 0;\r\n                      if ((g ^ h | 0) > 0 & (j ^ h | 0) < 0) {\r\n                          c[f >> 2] = 1;\r\n                          h = (h >>> 31) + 2147483647 | 0;\r\n                      } else h = j;\r\n                  } else {\r\n                      c[f >> 2] = 1;\r\n                      h = 2147483647;\r\n                  }\r\n                  k = k + 1 | 0;\r\n              } while ((k | 0) != 160);\r\n              o = h;\r\n              if ((343039 - o & o | 0) < 0) {\r\n                  c[f >> 2] = 1;\r\n                  h = (o >>> 31) + 2147483647 | 0;\r\n              } else h = o + -343040 | 0;\r\n              if ((h | 0) < 0) {\r\n                  A = a + 102 | 0;\r\n                  b[A >> 1] = e[A >> 1] & 16383;\r\n              }\r\n              m = o + -15e3 | 0;\r\n              p = (14999 - o & o | 0) < 0;\r\n              if (p) {\r\n                  c[f >> 2] = 1;\r\n                  j = (o >>> 31) + 2147483647 | 0;\r\n              } else j = m;\r\n              if ((j | 0) < 0) {\r\n                  A = a + 108 | 0;\r\n                  b[A >> 1] = e[A >> 1] & 16383;\r\n              }\r\n              g = a + 72 | 0;\r\n              l = a + 74 | 0;\r\n              j = b[g >> 1] | 0;\r\n              k = b[l >> 1] | 0;\r\n              h = 0;\r\n              do {\r\n                  A = h << 2;\r\n                  y = Ge((b[d + (A << 1) >> 1] | 0) >>> 2 & 65535, ((j << 16 >> 16) * 21955 | 0) >>> 15 & 65535, f) | 0;\r\n                  v = ((y << 16 >> 16) * 21955 | 0) >>> 15 & 65535;\r\n                  u = Rd(j, v, f) | 0;\r\n                  x = A | 1;\r\n                  z = Ge((b[d + (x << 1) >> 1] | 0) >>> 2 & 65535, ((k << 16 >> 16) * 6390 | 0) >>> 15 & 65535, f) | 0;\r\n                  w = ((z << 16 >> 16) * 6390 | 0) >>> 15 & 65535;\r\n                  j = Rd(k, w, f) | 0;\r\n                  b[n + (A << 1) >> 1] = Rd(u, j, f) | 0;\r\n                  b[n + (x << 1) >> 1] = Ge(u, j, f) | 0;\r\n                  x = A | 2;\r\n                  j = Ge((b[d + (x << 1) >> 1] | 0) >>> 2 & 65535, v, f) | 0;\r\n                  y = Rd(y, ((j << 16 >> 16) * 21955 | 0) >>> 15 & 65535, f) | 0;\r\n                  A = A | 3;\r\n                  k = Ge((b[d + (A << 1) >> 1] | 0) >>> 2 & 65535, w, f) | 0;\r\n                  z = Rd(z, ((k << 16 >> 16) * 6390 | 0) >>> 15 & 65535, f) | 0;\r\n                  b[n + (x << 1) >> 1] = Rd(y, z, f) | 0;\r\n                  b[n + (A << 1) >> 1] = Ge(y, z, f) | 0;\r\n                  h = h + 1 | 0;\r\n              } while ((h | 0) != 40);\r\n              b[g >> 1] = j;\r\n              b[l >> 1] = k;\r\n              k = a + 76 | 0;\r\n              j = a + 80 | 0;\r\n              h = 0;\r\n              do {\r\n                  A = h << 2;\r\n                  Od(n + (A << 1) | 0, n + ((A | 2) << 1) | 0, k, f);\r\n                  Od(n + ((A | 1) << 1) | 0, n + ((A | 3) << 1) | 0, j, f);\r\n                  h = h + 1 | 0;\r\n              } while ((h | 0) != 40);\r\n              k = a + 84 | 0;\r\n              j = a + 86 | 0;\r\n              h = a + 92 | 0;\r\n              g = 0;\r\n              do {\r\n                  A = g << 3;\r\n                  Pd(n + (A << 1) | 0, n + ((A | 4) << 1) | 0, k, f);\r\n                  Pd(n + ((A | 2) << 1) | 0, n + ((A | 6) << 1) | 0, j, f);\r\n                  Pd(n + ((A | 3) << 1) | 0, n + ((A | 7) << 1) | 0, h, f);\r\n                  g = g + 1 | 0;\r\n              } while ((g | 0) != 20);\r\n              k = a + 88 | 0;\r\n              j = a + 90 | 0;\r\n              h = 0;\r\n              do {\r\n                  A = h << 4;\r\n                  Pd(n + (A << 1) | 0, n + ((A | 8) << 1) | 0, k, f);\r\n                  Pd(n + ((A | 4) << 1) | 0, n + ((A | 12) << 1) | 0, j, f);\r\n                  h = h + 1 | 0;\r\n              } while ((h | 0) != 10);\r\n              t = Qd(n, a + 70 | 0, 32, 40, 4, 1, 15, f) | 0;\r\n              b[B + 16 >> 1] = t;\r\n              u = Qd(n, a + 68 | 0, 16, 20, 8, 7, 16, f) | 0;\r\n              b[B + 14 >> 1] = u;\r\n              v = Qd(n, a + 66 | 0, 16, 20, 8, 3, 16, f) | 0;\r\n              b[B + 12 >> 1] = v;\r\n              w = Qd(n, a + 64 | 0, 16, 20, 8, 2, 16, f) | 0;\r\n              b[B + 10 >> 1] = w;\r\n              x = Qd(n, a + 62 | 0, 16, 20, 8, 6, 16, f) | 0;\r\n              b[B + 8 >> 1] = x;\r\n              y = Qd(n, a + 60 | 0, 8, 10, 16, 4, 16, f) | 0;\r\n              b[B + 6 >> 1] = y;\r\n              z = Qd(n, a + 58 | 0, 8, 10, 16, 12, 16, f) | 0;\r\n              b[B + 4 >> 1] = z;\r\n              A = Qd(n, a + 56 | 0, 8, 10, 16, 8, 16, f) | 0;\r\n              b[B + 2 >> 1] = A;\r\n              s = Qd(n, a + 54 | 0, 8, 10, 16, 0, 16, f) | 0;\r\n              b[B >> 1] = s;\r\n              k = 0;\r\n              g = 0;\r\n              do {\r\n                  j = a + (g << 1) | 0;\r\n                  d = qe(b[j >> 1] | 0) | 0;\r\n                  j = b[j >> 1] | 0;\r\n                  h = d << 16 >> 16;\r\n                  if (d << 16 >> 16 < 0) {\r\n                      l = 0 - h << 16;\r\n                      if ((l | 0) < 983040) l = j << 16 >> 16 >> (l >> 16) & 65535; else l = 0;\r\n                  } else {\r\n                      l = j << 16 >> 16;\r\n                      j = l << h;\r\n                      if ((j << 16 >> 16 >> h | 0) == (l | 0)) l = j & 65535; else l = (l >>> 15 ^ 32767) & 65535;\r\n                  }\r\n                  j = Td(De(b[B + (g << 1) >> 1] | 0, 1, f) | 0, l) | 0;\r\n                  r = Ge(d, 5, f) | 0;\r\n                  h = r << 16 >> 16;\r\n                  if (r << 16 >> 16 < 0) {\r\n                      l = 0 - h << 16;\r\n                      if ((l | 0) < 983040) l = j << 16 >> 16 >> (l >> 16); else l = 0;\r\n                  } else {\r\n                      j = j << 16 >> 16;\r\n                      l = j << h;\r\n                      if ((l << 16 >> 16 >> h | 0) != (j | 0)) l = j >>> 15 ^ 32767;\r\n                  }\r\n                  l = l << 16 >> 16;\r\n                  l = Z(l, l) | 0;\r\n                  if ((l | 0) != 1073741824) {\r\n                      j = (l << 1) + k | 0;\r\n                      if ((l ^ k | 0) > 0 & (j ^ k | 0) < 0) {\r\n                          c[f >> 2] = 1;\r\n                          k = (k >>> 31) + 2147483647 | 0;\r\n                      } else k = j;\r\n                  } else {\r\n                      c[f >> 2] = 1;\r\n                      k = 2147483647;\r\n                  }\r\n                  g = g + 1 | 0;\r\n              } while ((g | 0) != 9);\r\n              r = k << 6;\r\n              k = (((r >> 6 | 0) == (k | 0) ? r : k >> 31 ^ 2147418112) >> 16) * 3641 >> 15;\r\n              if ((k | 0) > 32767) {\r\n                  c[f >> 2] = 1;\r\n                  k = 32767;\r\n              }\r\n              r = b[a >> 1] | 0;\r\n              l = r << 16 >> 16;\r\n              q = b[a + 2 >> 1] | 0;\r\n              j = (q << 16 >> 16) + l | 0;\r\n              if ((q ^ r) << 16 >> 16 > -1 & (j ^ l | 0) < 0) {\r\n                  c[f >> 2] = 1;\r\n                  j = (l >>> 31) + 2147483647 | 0;\r\n              }\r\n              r = b[a + 4 >> 1] | 0;\r\n              l = r + j | 0;\r\n              if ((r ^ j | 0) > -1 & (l ^ j | 0) < 0) {\r\n                  c[f >> 2] = 1;\r\n                  l = (j >>> 31) + 2147483647 | 0;\r\n              }\r\n              r = b[a + 6 >> 1] | 0;\r\n              j = r + l | 0;\r\n              if ((r ^ l | 0) > -1 & (j ^ l | 0) < 0) {\r\n                  c[f >> 2] = 1;\r\n                  j = (l >>> 31) + 2147483647 | 0;\r\n              }\r\n              r = b[a + 8 >> 1] | 0;\r\n              l = r + j | 0;\r\n              if ((r ^ j | 0) > -1 & (l ^ j | 0) < 0) {\r\n                  c[f >> 2] = 1;\r\n                  l = (j >>> 31) + 2147483647 | 0;\r\n              }\r\n              r = b[a + 10 >> 1] | 0;\r\n              j = r + l | 0;\r\n              if ((r ^ l | 0) > -1 & (j ^ l | 0) < 0) {\r\n                  c[f >> 2] = 1;\r\n                  j = (l >>> 31) + 2147483647 | 0;\r\n              }\r\n              r = b[a + 12 >> 1] | 0;\r\n              l = r + j | 0;\r\n              if ((r ^ j | 0) > -1 & (l ^ j | 0) < 0) {\r\n                  c[f >> 2] = 1;\r\n                  l = (j >>> 31) + 2147483647 | 0;\r\n              }\r\n              r = b[a + 14 >> 1] | 0;\r\n              j = r + l | 0;\r\n              if ((r ^ l | 0) > -1 & (j ^ l | 0) < 0) {\r\n                  c[f >> 2] = 1;\r\n                  j = (l >>> 31) + 2147483647 | 0;\r\n              }\r\n              r = b[a + 16 >> 1] | 0;\r\n              l = r + j | 0;\r\n              if ((r ^ j | 0) > -1 & (l ^ j | 0) < 0) {\r\n                  c[f >> 2] = 1;\r\n                  l = (j >>> 31) + 2147483647 | 0;\r\n              }\r\n              q = l << 13;\r\n              q = ((q >> 13 | 0) == (l | 0) ? q : l >> 31 ^ 2147418112) >>> 16 & 65535;\r\n              l = (Z((Ge(q, 0, f) | 0) << 16 >> 16, -2808) | 0) >> 15;\r\n              if ((l | 0) > 32767) {\r\n                  c[f >> 2] = 1;\r\n                  l = 32767;\r\n              }\r\n              n = Rd(l & 65535, 1260, f) | 0;\r\n              r = a + 100 | 0;\r\n              l = De(b[r >> 1] | 0, 1, f) | 0;\r\n              if ((k << 16 >> 16 | 0) > ((n << 16 >> 16 < 720 ? 720 : n << 16 >> 16) | 0)) l = (l & 65535 | 16384) & 65535;\r\n              b[r >> 1] = l;\r\n              if (p) {\r\n                  c[f >> 2] = 1;\r\n                  m = (o >>> 31) + 2147483647 | 0;\r\n              }\r\n              h = b[a + 118 >> 1] | 0;\r\n              p = a + 126 | 0;\r\n              l = b[p >> 1] | 0;\r\n              g = l << 16 >> 16 < 19660;\r\n              g = h << 16 >> 16 < l << 16 >> 16 ? (g ? 2621 : 6553) : g ? 2621 : 655;\r\n              d = l & 65535;\r\n              k = d << 16;\r\n              l = Z(g, l << 16 >> 16) | 0;\r\n              if ((l | 0) == 1073741824) {\r\n                  c[f >> 2] = 1;\r\n                  l = 2147483647;\r\n              } else l = l << 1;\r\n              j = k - l | 0;\r\n              if (((j ^ k) & (l ^ k) | 0) < 0) {\r\n                  c[f >> 2] = 1;\r\n                  j = (d >>> 15) + 2147483647 | 0;\r\n              }\r\n              k = Z(g, h << 16 >> 16) | 0;\r\n              do if ((k | 0) == 1073741824) {\r\n                  c[f >> 2] = 1;\r\n                  l = 2147483647;\r\n              } else {\r\n                  l = j + (k << 1) | 0;\r\n                  if (!((j ^ k | 0) > 0 & (l ^ j | 0) < 0)) break;\r\n                  c[f >> 2] = 1;\r\n                  l = (j >>> 31) + 2147483647 | 0;\r\n              } while (0);\r\n              d = Ce(l, f) | 0;\r\n              o = (m | 0) > -1;\r\n              b[p >> 1] = o ? (d << 16 >> 16 < 13106 ? 13106 : d) : 13106;\r\n              d = a + 106 | 0;\r\n              b[d >> 1] = De(b[d >> 1] | 0, 1, f) | 0;\r\n              j = a + 108 | 0;\r\n              l = De(b[j >> 1] | 0, 1, f) | 0;\r\n              b[j >> 1] = l;\r\n              k = b[p >> 1] | 0;\r\n              a:do if (o) {\r\n                  do if (k << 16 >> 16 > 19660) b[d >> 1] = e[d >> 1] | 16384; else {\r\n                      if (k << 16 >> 16 > 16383) break;\r\n                      k = a + 116 | 0;\r\n                      l = 0;\r\n                      break a\r\n                  } while (0);\r\n                  b[j >> 1] = l & 65535 | 16384;\r\n                  C = 62;\r\n              } else C = 62; while (0);\r\n              do if ((C | 0) == 62) {\r\n                  l = a + 116 | 0;\r\n                  if (k << 16 >> 16 <= 22936) {\r\n                      k = l;\r\n                      l = 0;\r\n                      break\r\n                  }\r\n                  k = l;\r\n                  l = Rd(b[l >> 1] | 0, 1, f) | 0;\r\n              } while (0);\r\n              b[k >> 1] = l;\r\n              if ((b[d >> 1] & 32640) != 32640) {\r\n                  n = (b[j >> 1] & 32767) == 32767;\r\n                  b[a + 122 >> 1] = n & 1;\r\n                  if (n) C = 67;\r\n              } else {\r\n                  b[a + 122 >> 1] = 1;\r\n                  C = 67;\r\n              }\r\n              do if ((C | 0) == 67) {\r\n                  k = a + 98 | 0;\r\n                  if ((b[k >> 1] | 0) >= 5) break;\r\n                  b[k >> 1] = 5;\r\n              } while (0);\r\n              n = a + 102 | 0;\r\n              do if ((b[n >> 1] & 24576) == 24576) C = 71; else {\r\n                  if ((b[a + 104 >> 1] & 31744) == 31744) {\r\n                      C = 71;\r\n                      break\r\n                  }\r\n                  if (!(b[r >> 1] & 32640)) {\r\n                      b[a + 98 >> 1] = 20;\r\n                      j = 32767;\r\n                      break\r\n                  } else {\r\n                      j = s;\r\n                      k = 0;\r\n                      l = 0;\r\n                  }\r\n                  while (1) {\r\n                      g = b[a + 18 + (k << 1) >> 1] | 0;\r\n                      h = j << 16 >> 16 > g << 16 >> 16;\r\n                      m = h ? j : g;\r\n                      j = h ? g : j;\r\n                      m = m << 16 >> 16 < 184 ? 184 : m;\r\n                      j = j << 16 >> 16 < 184 ? 184 : j;\r\n                      g = qe(j) | 0;\r\n                      h = g << 16 >> 16;\r\n                      do if (g << 16 >> 16 < 0) {\r\n                          d = 0 - h << 16;\r\n                          if ((d | 0) >= 983040) {\r\n                              d = 0;\r\n                              break\r\n                          }\r\n                          d = j << 16 >> 16 >> (d >> 16) & 65535;\r\n                      } else {\r\n                          d = j << 16 >> 16;\r\n                          j = d << h;\r\n                          if ((j << 16 >> 16 >> h | 0) == (d | 0)) {\r\n                              d = j & 65535;\r\n                              break\r\n                          }\r\n                          d = (d >>> 15 ^ 32767) & 65535;\r\n                      } while (0);\r\n                      m = Td(De(m, 1, f) | 0, d) | 0;\r\n                      l = Rd(l, De(m, Ge(8, g, f) | 0, f) | 0, f) | 0;\r\n                      k = k + 1 | 0;\r\n                      if ((k | 0) == 9) break;\r\n                      j = b[B + (k << 1) >> 1] | 0;\r\n                  }\r\n                  if (l << 16 >> 16 > 1e3) {\r\n                      b[a + 98 >> 1] = 20;\r\n                      j = 32767;\r\n                      break\r\n                  }\r\n                  j = b[r >> 1] | 0;\r\n                  k = a + 98 | 0;\r\n                  l = b[k >> 1] | 0;\r\n                  do if (!(j & 16384)) C = 86; else {\r\n                      if (!(l << 16 >> 16)) {\r\n                          l = j;\r\n                          break\r\n                      }\r\n                      l = Ge(l, 1, f) | 0;\r\n                      b[k >> 1] = l;\r\n                      C = 86;\r\n                  } while (0);\r\n                  if ((C | 0) == 86) {\r\n                      if (l << 16 >> 16 == 20) {\r\n                          j = 32767;\r\n                          break\r\n                      }\r\n                      l = b[r >> 1] | 0;\r\n                  }\r\n                  j = (l & 16384) == 0 ? 16383 : 3276;\r\n              } while (0);\r\n              if ((C | 0) == 71) {\r\n                  b[a + 98 >> 1] = 20;\r\n                  j = 32767;\r\n              }\r\n              k = s;\r\n              l = 0;\r\n              while (1) {\r\n                  m = a + 18 + (l << 1) | 0;\r\n                  d = oe(j, Ge(k, b[m >> 1] | 0, f) | 0, f) | 0;\r\n                  b[m >> 1] = Rd(b[m >> 1] | 0, d, f) | 0;\r\n                  l = l + 1 | 0;\r\n                  if ((l | 0) == 9) break;\r\n                  k = b[B + (l << 1) >> 1] | 0;\r\n              }\r\n              do if (!(b[r >> 1] & 30720)) {\r\n                  if (b[n >> 1] & 30720) {\r\n                      C = 95;\r\n                      break\r\n                  }\r\n                  if (!(b[a + 114 >> 1] | 0)) {\r\n                      h = 2097;\r\n                      g = 1638;\r\n                      d = 2;\r\n                  } else C = 95;\r\n              } else C = 95; while (0);\r\n              do if ((C | 0) == 95) {\r\n                  if ((b[a + 98 >> 1] | 0) == 0 ? (b[a + 114 >> 1] | 0) == 0 : 0) {\r\n                      h = 1867;\r\n                      g = 491;\r\n                      d = 2;\r\n                      break\r\n                  }\r\n                  h = 1638;\r\n                  g = 0;\r\n                  d = 0;\r\n              } while (0);\r\n              j = 0;\r\n              do {\r\n                  k = a + (j << 1) | 0;\r\n                  l = Ge(b[a + 36 + (j << 1) >> 1] | 0, b[k >> 1] | 0, f) | 0;\r\n                  if (l << 16 >> 16 < 0) {\r\n                      l = oe(h, l, f) | 0;\r\n                      l = Rd(-2, Rd(b[k >> 1] | 0, l, f) | 0, f) | 0;\r\n                      l = l << 16 >> 16 < 40 ? 40 : l;\r\n                  } else {\r\n                      l = oe(g, l, f) | 0;\r\n                      l = Rd(d, Rd(b[k >> 1] | 0, l, f) | 0, f) | 0;\r\n                      l = l << 16 >> 16 > 16e3 ? 16e3 : l;\r\n                  }\r\n                  b[k >> 1] = l;\r\n                  j = j + 1 | 0;\r\n              } while ((j | 0) != 9);\r\n              b[a + 36 >> 1] = s;\r\n              b[a + 38 >> 1] = A;\r\n              b[a + 40 >> 1] = z;\r\n              b[a + 42 >> 1] = y;\r\n              b[a + 44 >> 1] = x;\r\n              b[a + 46 >> 1] = w;\r\n              b[a + 48 >> 1] = v;\r\n              b[a + 50 >> 1] = u;\r\n              b[a + 52 >> 1] = t;\r\n              k = q << 16 >> 16 > 100;\r\n              j = k ? 7 : 4;\r\n              k = k ? 4 : 5;\r\n              if (!o) {\r\n                  b[a + 94 >> 1] = 0;\r\n                  b[a + 96 >> 1] = 0;\r\n                  b[a + 114 >> 1] = 0;\r\n                  b[a + 116 >> 1] = 0;\r\n                  f = 0;\r\n                  a = a + 120 | 0;\r\n                  b[a >> 1] = f;\r\n                  i = D;\r\n                  return f | 0\r\n              }\r\n              h = a + 114 | 0;\r\n              g = b[h >> 1] | 0;\r\n              do if ((b[a + 116 >> 1] | 0) <= 100) {\r\n                  if (g << 16 >> 16) break;\r\n                  g = b[r >> 1] | 0;\r\n                  do if (!(g & 16368)) {\r\n                      if ((b[p >> 1] | 0) > 21298) g = 1; else break;\r\n                      a = a + 120 | 0;\r\n                      b[a >> 1] = g;\r\n                      i = D;\r\n                      return g | 0\r\n                  } while (0);\r\n                  h = a + 94 | 0;\r\n                  if (!(g & 16384)) {\r\n                      b[h >> 1] = 0;\r\n                      g = a + 96 | 0;\r\n                      h = b[g >> 1] | 0;\r\n                      if (h << 16 >> 16 <= 0) {\r\n                          f = 0;\r\n                          a = a + 120 | 0;\r\n                          b[a >> 1] = f;\r\n                          i = D;\r\n                          return f | 0\r\n                      }\r\n                      b[g >> 1] = Ge(h, 1, f) | 0;\r\n                      f = 1;\r\n                      a = a + 120 | 0;\r\n                      b[a >> 1] = f;\r\n                      i = D;\r\n                      return f | 0\r\n                  } else {\r\n                      f = Rd(b[h >> 1] | 0, 1, f) | 0;\r\n                      b[h >> 1] = f;\r\n                      if ((f << 16 >> 16 | 0) < (k | 0)) {\r\n                          f = 1;\r\n                          a = a + 120 | 0;\r\n                          b[a >> 1] = f;\r\n                          i = D;\r\n                          return f | 0\r\n                      }\r\n                      b[a + 96 >> 1] = j;\r\n                      f = 1;\r\n                      a = a + 120 | 0;\r\n                      b[a >> 1] = f;\r\n                      i = D;\r\n                      return f | 0\r\n                  }\r\n              } else {\r\n                  if (g << 16 >> 16 >= 250) break;\r\n                  b[h >> 1] = 250;\r\n                  g = 250;\r\n              } while (0);\r\n              b[a + 94 >> 1] = 4;\r\n              b[h >> 1] = Ge(g, 1, f) | 0;\r\n              f = 1;\r\n              a = a + 120 | 0;\r\n              b[a >> 1] = f;\r\n              i = D;\r\n              return f | 0\r\n          }\r\n\r\n          function Od(a, d, e, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              var g = 0, h = 0, i = 0;\r\n              g = (b[e >> 1] | 0) * 21955 >> 15;\r\n              if ((g | 0) > 32767) {\r\n                  c[f >> 2] = 1;\r\n                  g = 32767;\r\n              }\r\n              h = Ge(b[a >> 1] | 0, g & 65535, f) | 0;\r\n              g = (h << 16 >> 16) * 21955 >> 15;\r\n              if ((g | 0) > 32767) {\r\n                  c[f >> 2] = 1;\r\n                  g = 32767;\r\n              }\r\n              i = Rd(b[e >> 1] | 0, g & 65535, f) | 0;\r\n              b[e >> 1] = h;\r\n              e = e + 2 | 0;\r\n              g = (b[e >> 1] | 0) * 6390 >> 15;\r\n              if ((g | 0) > 32767) {\r\n                  c[f >> 2] = 1;\r\n                  g = 32767;\r\n              }\r\n              h = Ge(b[d >> 1] | 0, g & 65535, f) | 0;\r\n              g = (h << 16 >> 16) * 6390 >> 15;\r\n              if ((g | 0) > 32767) {\r\n                  c[f >> 2] = 1;\r\n                  g = 32767;\r\n              }\r\n              g = Rd(b[e >> 1] | 0, g & 65535, f) | 0;\r\n              b[e >> 1] = h;\r\n              b[a >> 1] = De(Rd(i, g, f) | 0, 1, f) | 0;\r\n              b[d >> 1] = De(Ge(i, g, f) | 0, 1, f) | 0;\r\n              return\r\n          }\r\n\r\n          function Pd(a, d, e, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              var g = 0, h = 0;\r\n              g = (b[e >> 1] | 0) * 13363 >> 15;\r\n              if ((g | 0) > 32767) {\r\n                  c[f >> 2] = 1;\r\n                  g = 32767;\r\n              }\r\n              h = Ge(b[d >> 1] | 0, g & 65535, f) | 0;\r\n              g = (h << 16 >> 16) * 13363 >> 15;\r\n              if ((g | 0) > 32767) {\r\n                  c[f >> 2] = 1;\r\n                  g = 32767;\r\n              }\r\n              g = Rd(b[e >> 1] | 0, g & 65535, f) | 0;\r\n              b[e >> 1] = h;\r\n              b[d >> 1] = De(Ge(b[a >> 1] | 0, g, f) | 0, 1, f) | 0;\r\n              b[a >> 1] = De(Rd(b[a >> 1] | 0, g, f) | 0, 1, f) | 0;\r\n              return\r\n          }\r\n\r\n          function Qd(a, d, e, f, g, h, i, j) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              j = j | 0;\r\n              var k = 0, l = 0, m = 0, n = 0, o = 0, p = 0;\r\n              if (e << 16 >> 16 < f << 16 >> 16) {\r\n                  n = g << 16 >> 16;\r\n                  k = h << 16 >> 16;\r\n                  o = e << 16 >> 16;\r\n                  l = 0;\r\n                  do {\r\n                      p = b[a + ((Z(o, n) | 0) + k << 1) >> 1] | 0;\r\n                      p = (p & 65535) - ((p & 65535) >>> 15 & 65535) | 0;\r\n                      p = (p << 16 >> 31 ^ p) << 16;\r\n                      m = (p >> 15) + l | 0;\r\n                      if ((p >> 16 ^ l | 0) > 0 & (m ^ l | 0) < 0) {\r\n                          c[j >> 2] = 1;\r\n                          l = (l >>> 31) + 2147483647 | 0;\r\n                      } else l = m;\r\n                      o = o + 1 | 0;\r\n                  } while ((o & 65535) << 16 >> 16 != f << 16 >> 16);\r\n                  o = l;\r\n              } else o = 0;\r\n              l = b[d >> 1] | 0;\r\n              p = Ge(16, i, j) | 0;\r\n              k = p << 16 >> 16;\r\n              if (p << 16 >> 16 > 0) {\r\n                  f = l << k;\r\n                  if ((f >> k | 0) != (l | 0)) f = l >> 31 ^ 2147483647;\r\n              } else {\r\n                  k = 0 - k << 16;\r\n                  if ((k | 0) < 2031616) f = l >> (k >> 16); else f = 0;\r\n              }\r\n              k = f + o | 0;\r\n              if ((f ^ o | 0) > -1 & (k ^ o | 0) < 0) {\r\n                  c[j >> 2] = 1;\r\n                  k = (o >>> 31) + 2147483647 | 0;\r\n              }\r\n              p = i << 16 >> 16;\r\n              i = i << 16 >> 16 > 0;\r\n              if (i) {\r\n                  f = o << p;\r\n                  if ((f >> p | 0) != (o | 0)) f = o >> 31 ^ 2147483647;\r\n              } else {\r\n                  f = 0 - p << 16;\r\n                  if ((f | 0) < 2031616) f = o >> (f >> 16); else f = 0;\r\n              }\r\n              b[d >> 1] = f >>> 16;\r\n              if (e << 16 >> 16 > 0) {\r\n                  n = g << 16 >> 16;\r\n                  l = h << 16 >> 16;\r\n                  m = 0;\r\n                  do {\r\n                      h = b[a + ((Z(m, n) | 0) + l << 1) >> 1] | 0;\r\n                      h = (h & 65535) - ((h & 65535) >>> 15 & 65535) | 0;\r\n                      h = (h << 16 >> 31 ^ h) << 16;\r\n                      f = (h >> 15) + k | 0;\r\n                      if ((h >> 16 ^ k | 0) > 0 & (f ^ k | 0) < 0) {\r\n                          c[j >> 2] = 1;\r\n                          k = (k >>> 31) + 2147483647 | 0;\r\n                      } else k = f;\r\n                      m = m + 1 | 0;\r\n                  } while ((m & 65535) << 16 >> 16 != e << 16 >> 16)\r\n              }\r\n              if (i) {\r\n                  f = k << p;\r\n                  if ((f >> p | 0) == (k | 0)) {\r\n                      j = f;\r\n                      j = j >>> 16;\r\n                      j = j & 65535;\r\n                      return j | 0\r\n                  }\r\n                  j = k >> 31 ^ 2147483647;\r\n                  j = j >>> 16;\r\n                  j = j & 65535;\r\n                  return j | 0\r\n              } else {\r\n                  f = 0 - p << 16;\r\n                  if ((f | 0) >= 2031616) {\r\n                      j = 0;\r\n                      j = j >>> 16;\r\n                      j = j & 65535;\r\n                      return j | 0\r\n                  }\r\n                  j = k >> (f >> 16);\r\n                  j = j >>> 16;\r\n                  j = j & 65535;\r\n                  return j | 0\r\n              }\r\n              return 0\r\n          }\r\n\r\n          function Rd(a, b, d) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              d = d | 0;\r\n              a = (b << 16 >> 16) + (a << 16 >> 16) | 0;\r\n              if ((a | 0) <= 32767) {\r\n                  if ((a | 0) < -32768) {\r\n                      c[d >> 2] = 1;\r\n                      a = -32768;\r\n                  }\r\n              } else {\r\n                  c[d >> 2] = 1;\r\n                  a = 32767;\r\n              }\r\n              return a & 65535 | 0\r\n          }\r\n\r\n          function Sd(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              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,\r\n                  v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0;\r\n              y = i;\r\n              i = i + 32 | 0;\r\n              w = y + 12 | 0;\r\n              x = y;\r\n              b[w >> 1] = 1024;\r\n              b[x >> 1] = 1024;\r\n              k = b[a + 2 >> 1] | 0;\r\n              h = b[a + 20 >> 1] | 0;\r\n              e = ((h + k | 0) >>> 2) + 64512 | 0;\r\n              b[w + 2 >> 1] = e;\r\n              h = ((k - h | 0) >>> 2) + 1024 | 0;\r\n              b[x + 2 >> 1] = h;\r\n              k = b[a + 4 >> 1] | 0;\r\n              f = b[a + 18 >> 1] | 0;\r\n              e = ((f + k | 0) >>> 2) - e | 0;\r\n              b[w + 4 >> 1] = e;\r\n              h = ((k - f | 0) >>> 2) + h | 0;\r\n              b[x + 4 >> 1] = h;\r\n              f = b[a + 6 >> 1] | 0;\r\n              k = b[a + 16 >> 1] | 0;\r\n              e = ((k + f | 0) >>> 2) - e | 0;\r\n              b[w + 6 >> 1] = e;\r\n              h = ((f - k | 0) >>> 2) + h | 0;\r\n              b[x + 6 >> 1] = h;\r\n              k = b[a + 8 >> 1] | 0;\r\n              f = b[a + 14 >> 1] | 0;\r\n              e = ((f + k | 0) >>> 2) - e | 0;\r\n              b[w + 8 >> 1] = e;\r\n              h = ((k - f | 0) >>> 2) + h | 0;\r\n              b[x + 8 >> 1] = h;\r\n              f = b[a + 10 >> 1] | 0;\r\n              k = b[a + 12 >> 1] | 0;\r\n              e = ((k + f | 0) >>> 2) - e | 0;\r\n              b[w + 10 >> 1] = e;\r\n              b[x + 10 >> 1] = ((f - k | 0) >>> 2) + h;\r\n              h = b[3454] | 0;\r\n              k = h << 16 >> 16;\r\n              a = b[w + 2 >> 1] | 0;\r\n              f = (a << 16 >> 16 << 14) + (k << 10) | 0;\r\n              s = f & -65536;\r\n              f = (f >>> 1) - (f >> 16 << 15) << 16;\r\n              v = (((Z(f >> 16, k) | 0) >> 15) + (Z(s >> 16, k) | 0) << 2) + -16777216 | 0;\r\n              v = (b[w + 4 >> 1] << 14) + v | 0;\r\n              j = v >> 16;\r\n              v = (v >>> 1) - (j << 15) << 16;\r\n              s = (((Z(v >> 16, k) | 0) >> 15) + (Z(j, k) | 0) << 2) - ((f >> 15) + s) | 0;\r\n              s = (b[w + 6 >> 1] << 14) + s | 0;\r\n              f = s >> 16;\r\n              s = (s >>> 1) - (f << 15) << 16;\r\n              j = (((Z(s >> 16, k) | 0) >> 15) + (Z(f, k) | 0) << 2) - ((v >> 15) + (j << 16)) | 0;\r\n              j = (b[w + 8 >> 1] << 14) + j | 0;\r\n              v = j >> 16;\r\n              f = (e << 16 >> 3) + ((((Z((j >>> 1) - (v << 15) << 16 >> 16, k) | 0) >> 15) + (Z(v, k) | 0) << 1) - ((s >> 15) + (f << 16))) | 0;\r\n              s = w + 4 | 0;\r\n              k = w;\r\n              v = 0;\r\n              j = 0;\r\n              e = 0;\r\n              r = w + 10 | 0;\r\n              f = (f + 33554432 | 0) >>> 0 < 67108863 ? f >>> 10 & 65535 : (f | 0) > 33554431 ? 32767 : -32768;\r\n              a:while (1) {\r\n                  t = a << 16 >> 16 << 14;\r\n                  q = k + 6 | 0;\r\n                  p = k + 8 | 0;\r\n                  o = j << 16 >> 16;\r\n                  while (1) {\r\n                      if ((o | 0) >= 60) break a;\r\n                      k = (o & 65535) + 1 << 16 >> 16;\r\n                      l = b[6908 + (k << 16 >> 16 << 1) >> 1] | 0;\r\n                      u = l << 16 >> 16;\r\n                      j = t + (u << 10) | 0;\r\n                      g = j & -65536;\r\n                      j = (j >>> 1) - (j >> 16 << 15) << 16;\r\n                      m = (((Z(j >> 16, u) | 0) >> 15) + (Z(g >> 16, u) | 0) << 2) + -16777216 | 0;\r\n                      n = b[s >> 1] | 0;\r\n                      m = (n << 16 >> 16 << 14) + m | 0;\r\n                      B = m >> 16;\r\n                      m = (m >>> 1) - (B << 15) << 16;\r\n                      g = (((Z(m >> 16, u) | 0) >> 15) + (Z(B, u) | 0) << 2) - ((j >> 15) + g) | 0;\r\n                      j = b[q >> 1] | 0;\r\n                      g = (j << 16 >> 16 << 14) + g | 0;\r\n                      a = g >> 16;\r\n                      g = (g >>> 1) - (a << 15) << 16;\r\n                      B = (((Z(g >> 16, u) | 0) >> 15) + (Z(a, u) | 0) << 2) - ((m >> 15) + (B << 16)) | 0;\r\n                      m = b[p >> 1] | 0;\r\n                      B = (m << 16 >> 16 << 14) + B | 0;\r\n                      A = B >> 16;\r\n                      a = (((Z((B >>> 1) - (A << 15) << 16 >> 16, u) | 0) >> 15) + (Z(A, u) | 0) << 1) - ((g >> 15) + (a << 16)) | 0;\r\n                      g = b[r >> 1] | 0;\r\n                      a = (g << 16 >> 16 << 13) + a | 0;\r\n                      a = (a + 33554432 | 0) >>> 0 < 67108863 ? a >>> 10 & 65535 : (a | 0) > 33554431 ? 32767 : -32768;\r\n                      if ((Z(a << 16 >> 16, f << 16 >> 16) | 0) < 1) {\r\n                          u = k;\r\n                          k = n;\r\n                          break\r\n                      } else {\r\n                          o = o + 1 | 0;\r\n                          h = l;\r\n                          f = a;\r\n                      }\r\n                  }\r\n                  s = g << 16 >> 16 << 13;\r\n                  r = k << 16 >> 16 << 14;\r\n                  n = j << 16 >> 16 << 14;\r\n                  p = m << 16 >> 16 << 14;\r\n                  g = l << 16 >> 16;\r\n                  o = 4;\r\n                  while (1) {\r\n                      A = (h << 16 >> 16 >>> 1) + (g >>> 1) | 0;\r\n                      g = A << 16;\r\n                      q = g >> 16;\r\n                      g = t + (g >> 6) | 0;\r\n                      B = g & -65536;\r\n                      g = (g >>> 1) - (g >> 16 << 15) << 16;\r\n                      m = r + ((((Z(g >> 16, q) | 0) >> 15) + (Z(B >> 16, q) | 0) << 2) + -16777216) | 0;\r\n                      k = m >> 16;\r\n                      m = (m >>> 1) - (k << 15) << 16;\r\n                      B = n + ((((Z(m >> 16, q) | 0) >> 15) + (Z(k, q) | 0) << 2) - ((g >> 15) + B)) | 0;\r\n                      g = B >> 16;\r\n                      B = (B >>> 1) - (g << 15) << 16;\r\n                      k = p + ((((Z(B >> 16, q) | 0) >> 15) + (Z(g, q) | 0) << 2) - ((m >> 15) + (k << 16))) | 0;\r\n                      m = k >> 16;\r\n                      A = A & 65535;\r\n                      g = s + ((((Z((k >>> 1) - (m << 15) << 16 >> 16, q) | 0) >> 15) + (Z(m, q) | 0) << 1) - ((B >> 15) + (g << 16))) | 0;\r\n                      g = (g + 33554432 | 0) >>> 0 < 67108863 ? g >>> 10 & 65535 : (g | 0) > 33554431 ? 32767 : -32768;\r\n                      B = (Z(g << 16 >> 16, a << 16 >> 16) | 0) < 1;\r\n                      q = B ? l : A;\r\n                      a = B ? a : g;\r\n                      h = B ? A : h;\r\n                      f = B ? g : f;\r\n                      o = o + -1 << 16 >> 16;\r\n                      g = q << 16 >> 16;\r\n                      if (!(o << 16 >> 16)) {\r\n                          l = g;\r\n                          j = h;\r\n                          h = q;\r\n                          break\r\n                      } else l = q;\r\n                  }\r\n                  k = e << 16 >> 16;\r\n                  g = a << 16 >> 16;\r\n                  a = (f & 65535) - g | 0;\r\n                  f = a << 16;\r\n                  if (f) {\r\n                      B = (a & 65535) - (a >>> 15 & 1) | 0;\r\n                      B = B << 16 >> 31 ^ B;\r\n                      a = (qe(B & 65535) | 0) << 16 >> 16;\r\n                      a = (Z((Td(16383, B << 16 >> 16 << a & 65535) | 0) << 16 >> 16, (j & 65535) - l << 16 >> 16) | 0) >> 19 - a;\r\n                      if ((f | 0) < 0) a = 0 - (a << 16 >> 16) | 0;\r\n                      h = l - ((Z(a << 16 >> 16, g) | 0) >>> 10) & 65535;\r\n                  }\r\n                  b[c + (k << 1) >> 1] = h;\r\n                  f = v << 16 >> 16 == 0 ? x : w;\r\n                  A = h << 16 >> 16;\r\n                  a = b[f + 2 >> 1] | 0;\r\n                  g = (a << 16 >> 16 << 14) + (A << 10) | 0;\r\n                  B = g & -65536;\r\n                  g = (g >>> 1) - (g >> 16 << 15) << 16;\r\n                  t = (((Z(g >> 16, A) | 0) >> 15) + (Z(B >> 16, A) | 0) << 2) + -16777216 | 0;\r\n                  t = (b[f + 4 >> 1] << 14) + t | 0;\r\n                  s = t >> 16;\r\n                  t = (t >>> 1) - (s << 15) << 16;\r\n                  B = (((Z(t >> 16, A) | 0) >> 15) + (Z(s, A) | 0) << 2) - ((g >> 15) + B) | 0;\r\n                  B = (b[f + 6 >> 1] << 14) + B | 0;\r\n                  g = B >> 16;\r\n                  B = (B >>> 1) - (g << 15) << 16;\r\n                  s = (((Z(B >> 16, A) | 0) >> 15) + (Z(g, A) | 0) << 2) - ((t >> 15) + (s << 16)) | 0;\r\n                  s = (b[f + 8 >> 1] << 14) + s | 0;\r\n                  t = s >> 16;\r\n                  e = e + 1 << 16 >> 16;\r\n                  g = (((Z((s >>> 1) - (t << 15) << 16 >> 16, A) | 0) >> 15) + (Z(t, A) | 0) << 1) - ((B >> 15) + (g << 16)) | 0;\r\n                  g = (b[f + 10 >> 1] << 13) + g | 0;\r\n                  if (e << 16 >> 16 < 10) {\r\n                      s = f + 4 | 0;\r\n                      k = f;\r\n                      v = v ^ 1;\r\n                      j = u;\r\n                      r = f + 10 | 0;\r\n                      f = (g + 33554432 | 0) >>> 0 < 67108863 ? g >>> 10 & 65535 : (g | 0) > 33554431 ? 32767 : -32768;\r\n                  } else {\r\n                      z = 13;\r\n                      break\r\n                  }\r\n              }\r\n              if ((z | 0) == 13) {\r\n                  i = y;\r\n                  return\r\n              }\r\n              b[c >> 1] = b[d >> 1] | 0;\r\n              b[c + 2 >> 1] = b[d + 2 >> 1] | 0;\r\n              b[c + 4 >> 1] = b[d + 4 >> 1] | 0;\r\n              b[c + 6 >> 1] = b[d + 6 >> 1] | 0;\r\n              b[c + 8 >> 1] = b[d + 8 >> 1] | 0;\r\n              b[c + 10 >> 1] = b[d + 10 >> 1] | 0;\r\n              b[c + 12 >> 1] = b[d + 12 >> 1] | 0;\r\n              b[c + 14 >> 1] = b[d + 14 >> 1] | 0;\r\n              b[c + 16 >> 1] = b[d + 16 >> 1] | 0;\r\n              b[c + 18 >> 1] = b[d + 18 >> 1] | 0;\r\n              i = y;\r\n              return\r\n          }\r\n\r\n          function Td(a, b) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              var c = 0, d = 0, e = 0, f = 0, g = 0, h = 0;\r\n              e = b << 16 >> 16;\r\n              if (a << 16 >> 16 < 1 ? 1 : a << 16 >> 16 > b << 16 >> 16) {\r\n                  e = 0;\r\n                  return e | 0\r\n              }\r\n              if (a << 16 >> 16 == b << 16 >> 16) {\r\n                  e = 32767;\r\n                  return e | 0\r\n              }\r\n              d = e << 1;\r\n              c = e << 2;\r\n              f = a << 16 >> 16 << 3;\r\n              a = (f | 0) < (c | 0);\r\n              f = f - (a ? 0 : c) | 0;\r\n              a = a ? 0 : 4;\r\n              g = (f | 0) < (d | 0);\r\n              f = f - (g ? 0 : d) | 0;\r\n              b = (f | 0) < (e | 0);\r\n              a = (b & 1 | (g ? a : a | 2)) << 3 ^ 8;\r\n              b = f - (b ? 0 : e) << 3;\r\n              if ((b | 0) >= (c | 0)) {\r\n                  b = b - c | 0;\r\n                  a = a & 65528 | 4;\r\n              }\r\n              f = (b | 0) < (d | 0);\r\n              g = b - (f ? 0 : d) | 0;\r\n              b = (g | 0) < (e | 0);\r\n              a = (b & 1 ^ 1 | (f ? a : a | 2)) << 16 >> 13;\r\n              b = g - (b ? 0 : e) << 3;\r\n              if ((b | 0) >= (c | 0)) {\r\n                  b = b - c | 0;\r\n                  a = a & 65528 | 4;\r\n              }\r\n              f = (b | 0) < (d | 0);\r\n              g = b - (f ? 0 : d) | 0;\r\n              b = (g | 0) < (e | 0);\r\n              a = (b & 1 ^ 1 | (f ? a : a | 2)) << 16 >> 13;\r\n              b = g - (b ? 0 : e) << 3;\r\n              if ((b | 0) >= (c | 0)) {\r\n                  b = b - c | 0;\r\n                  a = a & 65528 | 4;\r\n              }\r\n              h = (b | 0) < (d | 0);\r\n              f = b - (h ? 0 : d) | 0;\r\n              g = (f | 0) < (e | 0);\r\n              b = (g & 1 ^ 1 | (h ? a : a | 2)) << 16 >> 13;\r\n              a = f - (g ? 0 : e) << 3;\r\n              if ((a | 0) >= (c | 0)) {\r\n                  a = a - c | 0;\r\n                  b = b & 65528 | 4;\r\n              }\r\n              h = (a | 0) < (d | 0);\r\n              h = ((a - (h ? 0 : d) | 0) >= (e | 0) | (h ? b : b | 2)) & 65535;\r\n              return h | 0\r\n          }\r\n\r\n          function Ud(a) {\r\n              a = a | 0;\r\n              if (!a) {\r\n                  a = -1;\r\n                  return a | 0\r\n              }\r\n              b[a >> 1] = -14336;\r\n              b[a + 8 >> 1] = -2381;\r\n              b[a + 2 >> 1] = -14336;\r\n              b[a + 10 >> 1] = -2381;\r\n              b[a + 4 >> 1] = -14336;\r\n              b[a + 12 >> 1] = -2381;\r\n              b[a + 6 >> 1] = -14336;\r\n              b[a + 14 >> 1] = -2381;\r\n              a = 0;\r\n              return a | 0\r\n          }\r\n\r\n          function Vd(a, d, f, g, h, j, k, l) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              l = l | 0;\r\n              var m = 0, n = 0, o = 0, p = 0, q = 0, r = 0;\r\n              r = i;\r\n              i = i + 16 | 0;\r\n              p = r + 2 | 0;\r\n              q = r;\r\n              m = 0;\r\n              n = 10;\r\n              while (1) {\r\n                  o = b[f >> 1] | 0;\r\n                  o = ((Z(o, o) | 0) >>> 3) + m | 0;\r\n                  m = b[f + 2 >> 1] | 0;\r\n                  m = o + ((Z(m, m) | 0) >>> 3) | 0;\r\n                  o = b[f + 4 >> 1] | 0;\r\n                  o = m + ((Z(o, o) | 0) >>> 3) | 0;\r\n                  m = b[f + 6 >> 1] | 0;\r\n                  m = o + ((Z(m, m) | 0) >>> 3) | 0;\r\n                  n = n + -1 << 16 >> 16;\r\n                  if (!(n << 16 >> 16)) break; else f = f + 8 | 0;\r\n              }\r\n              n = m << 4;\r\n              n = (n | 0) < 0 ? 2147483647 : n;\r\n              if ((d | 0) == 7) {\r\n                  de(((Ce(n, l) | 0) << 16 >> 16) * 52428 | 0, p, q, l);\r\n                  o = e[p >> 1] << 16;\r\n                  n = b[q >> 1] << 1;\r\n                  d = b[a + 8 >> 1] | 0;\r\n                  m = (d << 16 >> 16) * 88 | 0;\r\n                  if (d << 16 >> 16 > -1 & (m | 0) < -783741) {\r\n                      c[l >> 2] = 1;\r\n                      f = 2147483647;\r\n                  } else f = m + 783741 | 0;\r\n                  d = (b[a + 10 >> 1] | 0) * 74 | 0;\r\n                  m = d + f | 0;\r\n                  if ((d ^ f | 0) > -1 & (m ^ f | 0) < 0) {\r\n                      c[l >> 2] = 1;\r\n                      f = (f >>> 31) + 2147483647 | 0;\r\n                  } else f = m;\r\n                  d = (b[a + 12 >> 1] | 0) * 44 | 0;\r\n                  m = d + f | 0;\r\n                  if ((d ^ f | 0) > -1 & (m ^ f | 0) < 0) {\r\n                      c[l >> 2] = 1;\r\n                      f = (f >>> 31) + 2147483647 | 0;\r\n                  } else f = m;\r\n                  a = (b[a + 14 >> 1] | 0) * 24 | 0;\r\n                  m = a + f | 0;\r\n                  if ((a ^ f | 0) > -1 & (m ^ f | 0) < 0) {\r\n                      c[l >> 2] = 1;\r\n                      m = (f >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  a = o + -1966080 + n | 0;\r\n                  f = m - a | 0;\r\n                  if (((f ^ m) & (m ^ a) | 0) < 0) {\r\n                      c[l >> 2] = 1;\r\n                      f = (m >>> 31) + 2147483647 | 0;\r\n                  }\r\n                  l = f >> 17;\r\n                  b[g >> 1] = l;\r\n                  l = (f >> 2) - (l << 15) | 0;\r\n                  l = l & 65535;\r\n                  b[h >> 1] = l;\r\n                  i = r;\r\n                  return\r\n              }\r\n              o = pe(n) | 0;\r\n              m = o << 16 >> 16;\r\n              if (o << 16 >> 16 > 0) {\r\n                  f = n << m;\r\n                  if ((f >> m | 0) == (n | 0)) n = f; else n = n >> 31 ^ 2147483647;\r\n              } else {\r\n                  m = 0 - m << 16;\r\n                  if ((m | 0) < 2031616) n = n >> (m >> 16); else n = 0;\r\n              }\r\n              ee(n, o, p, q);\r\n              p = Z(b[p >> 1] | 0, -49320) | 0;\r\n              m = (Z(b[q >> 1] | 0, -24660) | 0) >> 15;\r\n              m = (m & 65536 | 0) == 0 ? m : m | -65536;\r\n              q = m << 1;\r\n              f = q + p | 0;\r\n              if ((q ^ p | 0) > -1 & (f ^ q | 0) < 0) {\r\n                  c[l >> 2] = 1;\r\n                  f = (m >>> 30 & 1) + 2147483647 | 0;\r\n              }\r\n              switch (d | 0) {\r\n                  case 6: {\r\n                      m = f + 2134784 | 0;\r\n                      if ((f | 0) > -1 & (m ^ f | 0) < 0) {\r\n                          c[l >> 2] = 1;\r\n                          m = (f >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      break\r\n                  }\r\n                  case 5: {\r\n                      b[k >> 1] = n >>> 16;\r\n                      b[j >> 1] = -11 - (o & 65535);\r\n                      m = f + 2183936 | 0;\r\n                      if ((f | 0) > -1 & (m ^ f | 0) < 0) {\r\n                          c[l >> 2] = 1;\r\n                          m = (f >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      break\r\n                  }\r\n                  case 4: {\r\n                      m = f + 2085632 | 0;\r\n                      if ((f | 0) > -1 & (m ^ f | 0) < 0) {\r\n                          c[l >> 2] = 1;\r\n                          m = (f >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      break\r\n                  }\r\n                  case 3: {\r\n                      m = f + 2065152 | 0;\r\n                      if ((f | 0) > -1 & (m ^ f | 0) < 0) {\r\n                          c[l >> 2] = 1;\r\n                          m = (f >>> 31) + 2147483647 | 0;\r\n                      }\r\n                      break\r\n                  }\r\n                  default: {\r\n                      m = f + 2134784 | 0;\r\n                      if ((f | 0) > -1 & (m ^ f | 0) < 0) {\r\n                          c[l >> 2] = 1;\r\n                          m = (f >>> 31) + 2147483647 | 0;\r\n                      }\r\n                  }\r\n              }\r\n              do if ((m | 0) <= 2097151) if ((m | 0) < -2097152) {\r\n                  c[l >> 2] = 1;\r\n                  f = -2147483648;\r\n                  break\r\n              } else {\r\n                  f = m << 10;\r\n                  break\r\n              } else {\r\n                  c[l >> 2] = 1;\r\n                  f = 2147483647;\r\n              } while (0);\r\n              k = (b[a >> 1] | 0) * 11142 | 0;\r\n              m = k + f | 0;\r\n              if ((k ^ f | 0) > -1 & (m ^ f | 0) < 0) {\r\n                  c[l >> 2] = 1;\r\n                  m = (f >>> 31) + 2147483647 | 0;\r\n              }\r\n              k = (b[a + 2 >> 1] | 0) * 9502 | 0;\r\n              f = k + m | 0;\r\n              if ((k ^ m | 0) > -1 & (f ^ m | 0) < 0) {\r\n                  c[l >> 2] = 1;\r\n                  f = (m >>> 31) + 2147483647 | 0;\r\n              }\r\n              k = (b[a + 4 >> 1] | 0) * 5570 | 0;\r\n              m = k + f | 0;\r\n              if ((k ^ f | 0) > -1 & (m ^ f | 0) < 0) {\r\n                  c[l >> 2] = 1;\r\n                  m = (f >>> 31) + 2147483647 | 0;\r\n              }\r\n              a = (b[a + 6 >> 1] | 0) * 3112 | 0;\r\n              f = a + m | 0;\r\n              if ((a ^ m | 0) > -1 & (f ^ m | 0) < 0) {\r\n                  c[l >> 2] = 1;\r\n                  f = (m >>> 31) + 2147483647 | 0;\r\n              }\r\n              f = Z(f >> 16, (d | 0) == 4 ? 10878 : 10886) | 0;\r\n              if ((f | 0) < 0) f = ~((f ^ -256) >> 8); else f = f >> 8;\r\n              b[g >> 1] = f >>> 16;\r\n              if ((f | 0) < 0) m = ~((f ^ -2) >> 1); else m = f >> 1;\r\n              g = f >> 16 << 15;\r\n              f = m - g | 0;\r\n              if (((f ^ m) & (g ^ m) | 0) >= 0) {\r\n                  l = f;\r\n                  l = l & 65535;\r\n                  b[h >> 1] = l;\r\n                  i = r;\r\n                  return\r\n              }\r\n              c[l >> 2] = 1;\r\n              l = (m >>> 31) + 2147483647 | 0;\r\n              l = l & 65535;\r\n              b[h >> 1] = l;\r\n              i = r;\r\n              return\r\n          }\r\n\r\n          function Wd(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var e = 0, f = 0, g = 0;\r\n              f = a + 4 | 0;\r\n              b[a + 6 >> 1] = b[f >> 1] | 0;\r\n              g = a + 12 | 0;\r\n              b[a + 14 >> 1] = b[g >> 1] | 0;\r\n              e = a + 2 | 0;\r\n              b[f >> 1] = b[e >> 1] | 0;\r\n              f = a + 10 | 0;\r\n              b[g >> 1] = b[f >> 1] | 0;\r\n              b[e >> 1] = b[a >> 1] | 0;\r\n              e = a + 8 | 0;\r\n              b[f >> 1] = b[e >> 1] | 0;\r\n              b[e >> 1] = c;\r\n              b[a >> 1] = d;\r\n              return\r\n          }\r\n\r\n          function Xd(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0;\r\n              g = Rd(0, b[a + 8 >> 1] | 0, e) | 0;\r\n              g = Rd(g, b[a + 10 >> 1] | 0, e) | 0;\r\n              g = Rd(g, b[a + 12 >> 1] | 0, e) | 0;\r\n              g = Rd(g, b[a + 14 >> 1] | 0, e) | 0;\r\n              f = g << 16 >> 16 >> 2;\r\n              f = (g << 16 >> 16 < 0 ? f | 49152 : f) & 65535;\r\n              b[c >> 1] = f << 16 >> 16 < -2381 ? -2381 : f;\r\n              c = Rd(0, b[a >> 1] | 0, e) | 0;\r\n              c = Rd(c, b[a + 2 >> 1] | 0, e) | 0;\r\n              c = Rd(c, b[a + 4 >> 1] | 0, e) | 0;\r\n              e = Rd(c, b[a + 6 >> 1] | 0, e) | 0;\r\n              a = e << 16 >> 16 >> 2;\r\n              a = (e << 16 >> 16 < 0 ? a | 49152 : a) & 65535;\r\n              b[d >> 1] = a << 16 >> 16 < -14336 ? -14336 : a;\r\n              return\r\n          }\r\n\r\n          function Yd(a) {\r\n              a = a | 0;\r\n              c[a >> 2] = 6892;\r\n              c[a + 4 >> 2] = 8180;\r\n              c[a + 8 >> 2] = 21e3;\r\n              c[a + 12 >> 2] = 9716;\r\n              c[a + 16 >> 2] = 22024;\r\n              c[a + 20 >> 2] = 12788;\r\n              c[a + 24 >> 2] = 24072;\r\n              c[a + 28 >> 2] = 26120;\r\n              c[a + 32 >> 2] = 28168;\r\n              c[a + 36 >> 2] = 6876;\r\n              c[a + 40 >> 2] = 7452;\r\n              c[a + 44 >> 2] = 8140;\r\n              c[a + 48 >> 2] = 20980;\r\n              c[a + 52 >> 2] = 16884;\r\n              c[a + 56 >> 2] = 17908;\r\n              c[a + 60 >> 2] = 7980;\r\n              c[a + 64 >> 2] = 8160;\r\n              c[a + 68 >> 2] = 6678;\r\n              c[a + 72 >> 2] = 6646;\r\n              c[a + 76 >> 2] = 6614;\r\n              c[a + 80 >> 2] = 29704;\r\n              c[a + 84 >> 2] = 28680;\r\n              c[a + 88 >> 2] = 3720;\r\n              c[a + 92 >> 2] = 8;\r\n              c[a + 96 >> 2] = 4172;\r\n              c[a + 100 >> 2] = 44;\r\n              c[a + 104 >> 2] = 3436;\r\n              c[a + 108 >> 2] = 30316;\r\n              c[a + 112 >> 2] = 30796;\r\n              c[a + 116 >> 2] = 31276;\r\n              c[a + 120 >> 2] = 7472;\r\n              c[a + 124 >> 2] = 7552;\r\n              c[a + 128 >> 2] = 7632;\r\n              c[a + 132 >> 2] = 7712;\r\n              return\r\n          }\r\n\r\n          function Zd(a, c) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              var d = 0, e = 0, f = 0, g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0;\r\n              n = i;\r\n              i = i + 48 | 0;\r\n              l = n + 18 | 0;\r\n              m = n;\r\n              k = c << 16 >> 16;\r\n              Oe(m | 0, a | 0, k << 1 | 0) | 0;\r\n              if (c << 16 >> 16 > 0) {\r\n                  d = 0;\r\n                  e = 0;\r\n              } else {\r\n                  m = k >> 1;\r\n                  m = l + (m << 1) | 0;\r\n                  m = b[m >> 1] | 0;\r\n                  m = m << 16 >> 16;\r\n                  m = a + (m << 1) | 0;\r\n                  m = b[m >> 1] | 0;\r\n                  i = n;\r\n                  return m | 0\r\n              }\r\n              do {\r\n                  j = 0;\r\n                  h = -32767;\r\n                  while (1) {\r\n                      f = b[m + (j << 1) >> 1] | 0;\r\n                      g = f << 16 >> 16 < h << 16 >> 16;\r\n                      e = g ? e : j & 65535;\r\n                      j = j + 1 | 0;\r\n                      if ((j & 65535) << 16 >> 16 == c << 16 >> 16) break; else h = g ? h : f;\r\n                  }\r\n                  b[m + (e << 16 >> 16 << 1) >> 1] = -32768;\r\n                  b[l + (d << 1) >> 1] = e;\r\n                  d = d + 1 | 0;\r\n              } while ((d & 65535) << 16 >> 16 != c << 16 >> 16);\r\n              m = k >> 1;\r\n              m = l + (m << 1) | 0;\r\n              m = b[m >> 1] | 0;\r\n              m = m << 16 >> 16;\r\n              m = a + (m << 1) | 0;\r\n              m = b[m >> 1] | 0;\r\n              i = n;\r\n              return m | 0\r\n          }\r\n\r\n          function _d(a, c, d, e, f) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              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,\r\n                  w = 0, x = 0, y = 0, z = 0, A = 0;\r\n              g = i;\r\n              i = i + 32 | 0;\r\n              h = g;\r\n              A = c + 2 | 0;\r\n              z = h + 2 | 0;\r\n              b[h >> 1] = ((b[c >> 1] | 0) >>> 1) + ((b[a >> 1] | 0) >>> 1);\r\n              y = c + 4 | 0;\r\n              x = h + 4 | 0;\r\n              b[z >> 1] = ((b[A >> 1] | 0) >>> 1) + ((b[a + 2 >> 1] | 0) >>> 1);\r\n              w = c + 6 | 0;\r\n              v = h + 6 | 0;\r\n              b[x >> 1] = ((b[y >> 1] | 0) >>> 1) + ((b[a + 4 >> 1] | 0) >>> 1);\r\n              u = c + 8 | 0;\r\n              t = h + 8 | 0;\r\n              b[v >> 1] = ((b[w >> 1] | 0) >>> 1) + ((b[a + 6 >> 1] | 0) >>> 1);\r\n              s = c + 10 | 0;\r\n              r = h + 10 | 0;\r\n              b[t >> 1] = ((b[u >> 1] | 0) >>> 1) + ((b[a + 8 >> 1] | 0) >>> 1);\r\n              q = c + 12 | 0;\r\n              p = h + 12 | 0;\r\n              b[r >> 1] = ((b[s >> 1] | 0) >>> 1) + ((b[a + 10 >> 1] | 0) >>> 1);\r\n              o = c + 14 | 0;\r\n              n = h + 14 | 0;\r\n              b[p >> 1] = ((b[q >> 1] | 0) >>> 1) + ((b[a + 12 >> 1] | 0) >>> 1);\r\n              m = c + 16 | 0;\r\n              l = h + 16 | 0;\r\n              b[n >> 1] = ((b[o >> 1] | 0) >>> 1) + ((b[a + 14 >> 1] | 0) >>> 1);\r\n              k = c + 18 | 0;\r\n              j = h + 18 | 0;\r\n              b[l >> 1] = ((b[m >> 1] | 0) >>> 1) + ((b[a + 16 >> 1] | 0) >>> 1);\r\n              b[j >> 1] = ((b[k >> 1] | 0) >>> 1) + ((b[a + 18 >> 1] | 0) >>> 1);\r\n              he(h, e, f);\r\n              he(c, e + 22 | 0, f);\r\n              b[h >> 1] = ((b[d >> 1] | 0) >>> 1) + ((b[c >> 1] | 0) >>> 1);\r\n              b[z >> 1] = ((b[d + 2 >> 1] | 0) >>> 1) + ((b[A >> 1] | 0) >>> 1);\r\n              b[x >> 1] = ((b[d + 4 >> 1] | 0) >>> 1) + ((b[y >> 1] | 0) >>> 1);\r\n              b[v >> 1] = ((b[d + 6 >> 1] | 0) >>> 1) + ((b[w >> 1] | 0) >>> 1);\r\n              b[t >> 1] = ((b[d + 8 >> 1] | 0) >>> 1) + ((b[u >> 1] | 0) >>> 1);\r\n              b[r >> 1] = ((b[d + 10 >> 1] | 0) >>> 1) + ((b[s >> 1] | 0) >>> 1);\r\n              b[p >> 1] = ((b[d + 12 >> 1] | 0) >>> 1) + ((b[q >> 1] | 0) >>> 1);\r\n              b[n >> 1] = ((b[d + 14 >> 1] | 0) >>> 1) + ((b[o >> 1] | 0) >>> 1);\r\n              b[l >> 1] = ((b[d + 16 >> 1] | 0) >>> 1) + ((b[m >> 1] | 0) >>> 1);\r\n              b[j >> 1] = ((b[d + 18 >> 1] | 0) >>> 1) + ((b[k >> 1] | 0) >>> 1);\r\n              he(h, e + 44 | 0, f);\r\n              he(d, e + 66 | 0, f);\r\n              i = g;\r\n              return\r\n          }\r\n\r\n          function $d(a, c, d, e, f) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              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,\r\n                  w = 0, x = 0, y = 0, z = 0, A = 0;\r\n              g = i;\r\n              i = i + 32 | 0;\r\n              h = g;\r\n              A = c + 2 | 0;\r\n              z = h + 2 | 0;\r\n              b[h >> 1] = ((b[c >> 1] | 0) >>> 1) + ((b[a >> 1] | 0) >>> 1);\r\n              y = c + 4 | 0;\r\n              x = h + 4 | 0;\r\n              b[z >> 1] = ((b[A >> 1] | 0) >>> 1) + ((b[a + 2 >> 1] | 0) >>> 1);\r\n              w = c + 6 | 0;\r\n              v = h + 6 | 0;\r\n              b[x >> 1] = ((b[y >> 1] | 0) >>> 1) + ((b[a + 4 >> 1] | 0) >>> 1);\r\n              u = c + 8 | 0;\r\n              t = h + 8 | 0;\r\n              b[v >> 1] = ((b[w >> 1] | 0) >>> 1) + ((b[a + 6 >> 1] | 0) >>> 1);\r\n              s = c + 10 | 0;\r\n              r = h + 10 | 0;\r\n              b[t >> 1] = ((b[u >> 1] | 0) >>> 1) + ((b[a + 8 >> 1] | 0) >>> 1);\r\n              q = c + 12 | 0;\r\n              p = h + 12 | 0;\r\n              b[r >> 1] = ((b[s >> 1] | 0) >>> 1) + ((b[a + 10 >> 1] | 0) >>> 1);\r\n              o = c + 14 | 0;\r\n              n = h + 14 | 0;\r\n              b[p >> 1] = ((b[q >> 1] | 0) >>> 1) + ((b[a + 12 >> 1] | 0) >>> 1);\r\n              m = c + 16 | 0;\r\n              l = h + 16 | 0;\r\n              b[n >> 1] = ((b[o >> 1] | 0) >>> 1) + ((b[a + 14 >> 1] | 0) >>> 1);\r\n              k = c + 18 | 0;\r\n              j = h + 18 | 0;\r\n              b[l >> 1] = ((b[m >> 1] | 0) >>> 1) + ((b[a + 16 >> 1] | 0) >>> 1);\r\n              b[j >> 1] = ((b[k >> 1] | 0) >>> 1) + ((b[a + 18 >> 1] | 0) >>> 1);\r\n              he(h, e, f);\r\n              b[h >> 1] = ((b[d >> 1] | 0) >>> 1) + ((b[c >> 1] | 0) >>> 1);\r\n              b[z >> 1] = ((b[d + 2 >> 1] | 0) >>> 1) + ((b[A >> 1] | 0) >>> 1);\r\n              b[x >> 1] = ((b[d + 4 >> 1] | 0) >>> 1) + ((b[y >> 1] | 0) >>> 1);\r\n              b[v >> 1] = ((b[d + 6 >> 1] | 0) >>> 1) + ((b[w >> 1] | 0) >>> 1);\r\n              b[t >> 1] = ((b[d + 8 >> 1] | 0) >>> 1) + ((b[u >> 1] | 0) >>> 1);\r\n              b[r >> 1] = ((b[d + 10 >> 1] | 0) >>> 1) + ((b[s >> 1] | 0) >>> 1);\r\n              b[p >> 1] = ((b[d + 12 >> 1] | 0) >>> 1) + ((b[q >> 1] | 0) >>> 1);\r\n              b[n >> 1] = ((b[d + 14 >> 1] | 0) >>> 1) + ((b[o >> 1] | 0) >>> 1);\r\n              b[l >> 1] = ((b[d + 16 >> 1] | 0) >>> 1) + ((b[m >> 1] | 0) >>> 1);\r\n              b[j >> 1] = ((b[d + 18 >> 1] | 0) >>> 1) + ((b[k >> 1] | 0) >>> 1);\r\n              he(h, e + 44 | 0, f);\r\n              i = g;\r\n              return\r\n          }\r\n\r\n          function ae(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              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,\r\n                  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;\r\n              f = i;\r\n              i = i + 32 | 0;\r\n              g = f;\r\n              H = b[a >> 1] | 0;\r\n              b[g >> 1] = H - (H >>> 2) + ((b[c >> 1] | 0) >>> 2);\r\n              H = a + 2 | 0;\r\n              E = b[H >> 1] | 0;\r\n              I = c + 2 | 0;\r\n              G = g + 2 | 0;\r\n              b[G >> 1] = E - (E >>> 2) + ((b[I >> 1] | 0) >>> 2);\r\n              E = a + 4 | 0;\r\n              B = b[E >> 1] | 0;\r\n              F = c + 4 | 0;\r\n              D = g + 4 | 0;\r\n              b[D >> 1] = B - (B >>> 2) + ((b[F >> 1] | 0) >>> 2);\r\n              B = a + 6 | 0;\r\n              y = b[B >> 1] | 0;\r\n              C = c + 6 | 0;\r\n              A = g + 6 | 0;\r\n              b[A >> 1] = y - (y >>> 2) + ((b[C >> 1] | 0) >>> 2);\r\n              y = a + 8 | 0;\r\n              v = b[y >> 1] | 0;\r\n              z = c + 8 | 0;\r\n              x = g + 8 | 0;\r\n              b[x >> 1] = v - (v >>> 2) + ((b[z >> 1] | 0) >>> 2);\r\n              v = a + 10 | 0;\r\n              s = b[v >> 1] | 0;\r\n              w = c + 10 | 0;\r\n              u = g + 10 | 0;\r\n              b[u >> 1] = s - (s >>> 2) + ((b[w >> 1] | 0) >>> 2);\r\n              s = a + 12 | 0;\r\n              p = b[s >> 1] | 0;\r\n              t = c + 12 | 0;\r\n              r = g + 12 | 0;\r\n              b[r >> 1] = p - (p >>> 2) + ((b[t >> 1] | 0) >>> 2);\r\n              p = a + 14 | 0;\r\n              m = b[p >> 1] | 0;\r\n              q = c + 14 | 0;\r\n              o = g + 14 | 0;\r\n              b[o >> 1] = m - (m >>> 2) + ((b[q >> 1] | 0) >>> 2);\r\n              m = a + 16 | 0;\r\n              j = b[m >> 1] | 0;\r\n              n = c + 16 | 0;\r\n              l = g + 16 | 0;\r\n              b[l >> 1] = j - (j >>> 2) + ((b[n >> 1] | 0) >>> 2);\r\n              j = a + 18 | 0;\r\n              J = b[j >> 1] | 0;\r\n              k = c + 18 | 0;\r\n              h = g + 18 | 0;\r\n              b[h >> 1] = J - (J >>> 2) + ((b[k >> 1] | 0) >>> 2);\r\n              he(g, d, e);\r\n              b[g >> 1] = ((b[a >> 1] | 0) >>> 1) + ((b[c >> 1] | 0) >>> 1);\r\n              b[G >> 1] = ((b[H >> 1] | 0) >>> 1) + ((b[I >> 1] | 0) >>> 1);\r\n              b[D >> 1] = ((b[E >> 1] | 0) >>> 1) + ((b[F >> 1] | 0) >>> 1);\r\n              b[A >> 1] = ((b[B >> 1] | 0) >>> 1) + ((b[C >> 1] | 0) >>> 1);\r\n              b[x >> 1] = ((b[y >> 1] | 0) >>> 1) + ((b[z >> 1] | 0) >>> 1);\r\n              b[u >> 1] = ((b[v >> 1] | 0) >>> 1) + ((b[w >> 1] | 0) >>> 1);\r\n              b[r >> 1] = ((b[s >> 1] | 0) >>> 1) + ((b[t >> 1] | 0) >>> 1);\r\n              b[o >> 1] = ((b[p >> 1] | 0) >>> 1) + ((b[q >> 1] | 0) >>> 1);\r\n              b[l >> 1] = ((b[m >> 1] | 0) >>> 1) + ((b[n >> 1] | 0) >>> 1);\r\n              b[h >> 1] = ((b[j >> 1] | 0) >>> 1) + ((b[k >> 1] | 0) >>> 1);\r\n              he(g, d + 22 | 0, e);\r\n              J = b[c >> 1] | 0;\r\n              b[g >> 1] = J - (J >>> 2) + ((b[a >> 1] | 0) >>> 2);\r\n              a = b[I >> 1] | 0;\r\n              b[G >> 1] = a - (a >>> 2) + ((b[H >> 1] | 0) >>> 2);\r\n              a = b[F >> 1] | 0;\r\n              b[D >> 1] = a - (a >>> 2) + ((b[E >> 1] | 0) >>> 2);\r\n              a = b[C >> 1] | 0;\r\n              b[A >> 1] = a - (a >>> 2) + ((b[B >> 1] | 0) >>> 2);\r\n              a = b[z >> 1] | 0;\r\n              b[x >> 1] = a - (a >>> 2) + ((b[y >> 1] | 0) >>> 2);\r\n              a = b[w >> 1] | 0;\r\n              b[u >> 1] = a - (a >>> 2) + ((b[v >> 1] | 0) >>> 2);\r\n              a = b[t >> 1] | 0;\r\n              b[r >> 1] = a - (a >>> 2) + ((b[s >> 1] | 0) >>> 2);\r\n              a = b[q >> 1] | 0;\r\n              b[o >> 1] = a - (a >>> 2) + ((b[p >> 1] | 0) >>> 2);\r\n              a = b[n >> 1] | 0;\r\n              b[l >> 1] = a - (a >>> 2) + ((b[m >> 1] | 0) >>> 2);\r\n              a = b[k >> 1] | 0;\r\n              b[h >> 1] = a - (a >>> 2) + ((b[j >> 1] | 0) >>> 2);\r\n              he(g, d + 44 | 0, e);\r\n              he(c, d + 66 | 0, e);\r\n              i = f;\r\n              return\r\n          }\r\n\r\n          function be(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              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,\r\n                  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;\r\n              f = i;\r\n              i = i + 32 | 0;\r\n              g = f;\r\n              H = b[a >> 1] | 0;\r\n              b[g >> 1] = H - (H >>> 2) + ((b[c >> 1] | 0) >>> 2);\r\n              H = a + 2 | 0;\r\n              E = b[H >> 1] | 0;\r\n              I = c + 2 | 0;\r\n              G = g + 2 | 0;\r\n              b[G >> 1] = E - (E >>> 2) + ((b[I >> 1] | 0) >>> 2);\r\n              E = a + 4 | 0;\r\n              B = b[E >> 1] | 0;\r\n              F = c + 4 | 0;\r\n              D = g + 4 | 0;\r\n              b[D >> 1] = B - (B >>> 2) + ((b[F >> 1] | 0) >>> 2);\r\n              B = a + 6 | 0;\r\n              y = b[B >> 1] | 0;\r\n              C = c + 6 | 0;\r\n              A = g + 6 | 0;\r\n              b[A >> 1] = y - (y >>> 2) + ((b[C >> 1] | 0) >>> 2);\r\n              y = a + 8 | 0;\r\n              v = b[y >> 1] | 0;\r\n              z = c + 8 | 0;\r\n              x = g + 8 | 0;\r\n              b[x >> 1] = v - (v >>> 2) + ((b[z >> 1] | 0) >>> 2);\r\n              v = a + 10 | 0;\r\n              s = b[v >> 1] | 0;\r\n              w = c + 10 | 0;\r\n              u = g + 10 | 0;\r\n              b[u >> 1] = s - (s >>> 2) + ((b[w >> 1] | 0) >>> 2);\r\n              s = a + 12 | 0;\r\n              p = b[s >> 1] | 0;\r\n              t = c + 12 | 0;\r\n              r = g + 12 | 0;\r\n              b[r >> 1] = p - (p >>> 2) + ((b[t >> 1] | 0) >>> 2);\r\n              p = a + 14 | 0;\r\n              m = b[p >> 1] | 0;\r\n              q = c + 14 | 0;\r\n              o = g + 14 | 0;\r\n              b[o >> 1] = m - (m >>> 2) + ((b[q >> 1] | 0) >>> 2);\r\n              m = a + 16 | 0;\r\n              j = b[m >> 1] | 0;\r\n              n = c + 16 | 0;\r\n              l = g + 16 | 0;\r\n              b[l >> 1] = j - (j >>> 2) + ((b[n >> 1] | 0) >>> 2);\r\n              j = a + 18 | 0;\r\n              J = b[j >> 1] | 0;\r\n              k = c + 18 | 0;\r\n              h = g + 18 | 0;\r\n              b[h >> 1] = J - (J >>> 2) + ((b[k >> 1] | 0) >>> 2);\r\n              he(g, d, e);\r\n              b[g >> 1] = ((b[a >> 1] | 0) >>> 1) + ((b[c >> 1] | 0) >>> 1);\r\n              b[G >> 1] = ((b[H >> 1] | 0) >>> 1) + ((b[I >> 1] | 0) >>> 1);\r\n              b[D >> 1] = ((b[E >> 1] | 0) >>> 1) + ((b[F >> 1] | 0) >>> 1);\r\n              b[A >> 1] = ((b[B >> 1] | 0) >>> 1) + ((b[C >> 1] | 0) >>> 1);\r\n              b[x >> 1] = ((b[y >> 1] | 0) >>> 1) + ((b[z >> 1] | 0) >>> 1);\r\n              b[u >> 1] = ((b[v >> 1] | 0) >>> 1) + ((b[w >> 1] | 0) >>> 1);\r\n              b[r >> 1] = ((b[s >> 1] | 0) >>> 1) + ((b[t >> 1] | 0) >>> 1);\r\n              b[o >> 1] = ((b[p >> 1] | 0) >>> 1) + ((b[q >> 1] | 0) >>> 1);\r\n              b[l >> 1] = ((b[m >> 1] | 0) >>> 1) + ((b[n >> 1] | 0) >>> 1);\r\n              b[h >> 1] = ((b[j >> 1] | 0) >>> 1) + ((b[k >> 1] | 0) >>> 1);\r\n              he(g, d + 22 | 0, e);\r\n              c = b[c >> 1] | 0;\r\n              b[g >> 1] = c - (c >>> 2) + ((b[a >> 1] | 0) >>> 2);\r\n              a = b[I >> 1] | 0;\r\n              b[G >> 1] = a - (a >>> 2) + ((b[H >> 1] | 0) >>> 2);\r\n              a = b[F >> 1] | 0;\r\n              b[D >> 1] = a - (a >>> 2) + ((b[E >> 1] | 0) >>> 2);\r\n              a = b[C >> 1] | 0;\r\n              b[A >> 1] = a - (a >>> 2) + ((b[B >> 1] | 0) >>> 2);\r\n              a = b[z >> 1] | 0;\r\n              b[x >> 1] = a - (a >>> 2) + ((b[y >> 1] | 0) >>> 2);\r\n              a = b[w >> 1] | 0;\r\n              b[u >> 1] = a - (a >>> 2) + ((b[v >> 1] | 0) >>> 2);\r\n              a = b[t >> 1] | 0;\r\n              b[r >> 1] = a - (a >>> 2) + ((b[s >> 1] | 0) >>> 2);\r\n              a = b[q >> 1] | 0;\r\n              b[o >> 1] = a - (a >>> 2) + ((b[p >> 1] | 0) >>> 2);\r\n              a = b[n >> 1] | 0;\r\n              b[l >> 1] = a - (a >>> 2) + ((b[m >> 1] | 0) >>> 2);\r\n              a = b[k >> 1] | 0;\r\n              b[h >> 1] = a - (a >>> 2) + ((b[j >> 1] | 0) >>> 2);\r\n              he(g, d + 44 | 0, e);\r\n              i = f;\r\n              return\r\n          }\r\n\r\n          function ce(a, c) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              var d = 0, f = 0;\r\n              if ((a | 0) < 1) {\r\n                  c = 1073741823;\r\n                  return c | 0\r\n              }\r\n              d = (pe(a) | 0) << 16 >> 16;\r\n              c = 30 - d | 0;\r\n              a = a << d >> (c & 1 ^ 1);\r\n              d = (a >> 25 << 16) + -1048576 >> 16;\r\n              f = b[7030 + (d << 1) >> 1] | 0;\r\n              c = (f << 16) - (Z(f - (e[7030 + (d + 1 << 1) >> 1] | 0) << 16 >> 15, a >>> 10 & 32767) | 0) >> (c << 16 >> 17) + 1;\r\n              return c | 0\r\n          }\r\n\r\n          function de(a, b, c, d) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              d = pe(a) | 0;\r\n              ee(a << (d << 16 >> 16), d, b, c);\r\n              return\r\n          }\r\n\r\n          function ee(a, c, d, f) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              if ((a | 0) < 1) {\r\n                  b[d >> 1] = 0;\r\n                  d = 0;\r\n                  b[f >> 1] = d;\r\n                  return\r\n              } else {\r\n                  b[d >> 1] = 30 - (c & 65535);\r\n                  d = (a >> 25 << 16) + -2097152 >> 16;\r\n                  c = b[7128 + (d << 1) >> 1] | 0;\r\n                  d = ((c << 16) - (Z(a >>> 9 & 65534, c - (e[7128 + (d + 1 << 1) >> 1] | 0) << 16 >> 16) | 0) | 0) >>> 16 & 65535;\r\n                  b[f >> 1] = d;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function fe(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var f = 0, g = 0;\r\n              f = a + 2 | 0;\r\n              d = b[f >> 1] | 0;\r\n              b[c >> 1] = d;\r\n              g = a + 4 | 0;\r\n              b[c + 2 >> 1] = (e[g >> 1] | 0) - (e[a >> 1] | 0);\r\n              b[c + 4 >> 1] = (e[a + 6 >> 1] | 0) - (e[f >> 1] | 0);\r\n              f = a + 8 | 0;\r\n              b[c + 6 >> 1] = (e[f >> 1] | 0) - (e[g >> 1] | 0);\r\n              b[c + 8 >> 1] = (e[a + 10 >> 1] | 0) - (e[a + 6 >> 1] | 0);\r\n              g = a + 12 | 0;\r\n              b[c + 10 >> 1] = (e[g >> 1] | 0) - (e[f >> 1] | 0);\r\n              b[c + 12 >> 1] = (e[a + 14 >> 1] | 0) - (e[a + 10 >> 1] | 0);\r\n              b[c + 14 >> 1] = (e[a + 16 >> 1] | 0) - (e[g >> 1] | 0);\r\n              b[c + 16 >> 1] = (e[a + 18 >> 1] | 0) - (e[a + 14 >> 1] | 0);\r\n              b[c + 18 >> 1] = 16384 - (e[a + 16 >> 1] | 0);\r\n              a = 10;\r\n              g = c;\r\n              while (1) {\r\n                  d = d << 16 >> 16;\r\n                  c = (d << 16) + -120782848 | 0;\r\n                  if ((c | 0) > 0) c = 1843 - ((c >> 16) * 12484 >> 16) | 0; else c = 3427 - ((d * 56320 | 0) >>> 16) | 0;\r\n                  f = g + 2 | 0;\r\n                  b[g >> 1] = c << 3;\r\n                  a = a + -1 << 16 >> 16;\r\n                  if (!(a << 16 >> 16)) break;\r\n                  d = b[f >> 1] | 0;\r\n                  g = f;\r\n              }\r\n              return\r\n          }\r\n\r\n          function ge(a, b, c) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              c = c | 0;\r\n              c = b << 16 >> 16;\r\n              if (b << 16 >> 16 > 31) {\r\n                  b = 0;\r\n                  return b | 0\r\n              }\r\n              if (b << 16 >> 16 > 0) return ((1 << c + -1 & a | 0) != 0 & 1) + (b << 16 >> 16 < 31 ? a >> c : 0) | 0;\r\n              c = 0 - c << 16 >> 16;\r\n              b = a << c;\r\n              b = (b >> c | 0) == (a | 0) ? b : a >> 31 ^ 2147483647;\r\n              return b | 0\r\n          }\r\n\r\n          function he(a, d, e) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              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;\r\n              s = i;\r\n              i = i + 48 | 0;\r\n              q = s + 24 | 0;\r\n              r = s;\r\n              o = q + 4 | 0;\r\n              c[q >> 2] = 16777216;\r\n              f = 0 - (b[a >> 1] | 0) | 0;\r\n              p = q + 8 | 0;\r\n              c[o >> 2] = f << 10;\r\n              g = b[a + 4 >> 1] | 0;\r\n              l = f >> 6;\r\n              c[p >> 2] = 33554432 - (((Z((f << 9) - (l << 15) << 16 >> 16, g) | 0) >> 15) + (Z(l, g) | 0) << 2);\r\n              l = q + 4 | 0;\r\n              g = (c[l >> 2] | 0) - (g << 10) | 0;\r\n              c[l >> 2] = g;\r\n              l = q + 12 | 0;\r\n              f = q + 4 | 0;\r\n              c[l >> 2] = g;\r\n              e = b[a + 8 >> 1] | 0;\r\n              h = g;\r\n              m = 1;\r\n              while (1) {\r\n                  k = l + -4 | 0;\r\n                  j = c[k >> 2] | 0;\r\n                  n = j >> 16;\r\n                  c[l >> 2] = h + g - (((Z((j >>> 1) - (n << 15) << 16 >> 16, e) | 0) >> 15) + (Z(n, e) | 0) << 2);\r\n                  if ((m | 0) == 2) break;\r\n                  h = c[l + -12 >> 2] | 0;\r\n                  l = k;\r\n                  g = j;\r\n                  m = m + 1 | 0;\r\n              }\r\n              c[f >> 2] = (c[f >> 2] | 0) - (e << 10);\r\n              e = q + 16 | 0;\r\n              f = c[q + 8 >> 2] | 0;\r\n              c[e >> 2] = f;\r\n              k = b[a + 12 >> 1] | 0;\r\n              g = f;\r\n              l = 1;\r\n              while (1) {\r\n                  j = e + -4 | 0;\r\n                  h = c[j >> 2] | 0;\r\n                  n = h >> 16;\r\n                  c[e >> 2] = g + f - (((Z((h >>> 1) - (n << 15) << 16 >> 16, k) | 0) >> 15) + (Z(n, k) | 0) << 2);\r\n                  if ((l | 0) == 3) break;\r\n                  g = c[e + -12 >> 2] | 0;\r\n                  e = j;\r\n                  f = h;\r\n                  l = l + 1 | 0;\r\n              }\r\n              e = q + 4 | 0;\r\n              c[e >> 2] = (c[e >> 2] | 0) - (k << 10);\r\n              e = q + 20 | 0;\r\n              g = c[q + 12 >> 2] | 0;\r\n              c[e >> 2] = g;\r\n              f = b[a + 16 >> 1] | 0;\r\n              h = g;\r\n              l = 1;\r\n              while (1) {\r\n                  k = e + -4 | 0;\r\n                  j = c[k >> 2] | 0;\r\n                  n = j >> 16;\r\n                  c[e >> 2] = h + g - (((Z((j >>> 1) - (n << 15) << 16 >> 16, f) | 0) >> 15) + (Z(n, f) | 0) << 2);\r\n                  if ((l | 0) == 4) break;\r\n                  h = c[e + -12 >> 2] | 0;\r\n                  e = k;\r\n                  g = j;\r\n                  l = l + 1 | 0;\r\n              }\r\n              l = q + 4 | 0;\r\n              c[l >> 2] = (c[l >> 2] | 0) - (f << 10);\r\n              c[r >> 2] = 16777216;\r\n              l = 0 - (b[a + 2 >> 1] | 0) | 0;\r\n              n = r + 8 | 0;\r\n              c[r + 4 >> 2] = l << 10;\r\n              f = b[a + 6 >> 1] | 0;\r\n              m = l >> 6;\r\n              c[n >> 2] = 33554432 - (((Z((l << 9) - (m << 15) << 16 >> 16, f) | 0) >> 15) + (Z(m, f) | 0) << 2);\r\n              m = r + 4 | 0;\r\n              f = (c[m >> 2] | 0) - (f << 10) | 0;\r\n              c[m >> 2] = f;\r\n              m = r + 12 | 0;\r\n              l = r + 4 | 0;\r\n              c[m >> 2] = f;\r\n              k = b[a + 10 >> 1] | 0;\r\n              g = f;\r\n              e = 1;\r\n              while (1) {\r\n                  j = m + -4 | 0;\r\n                  h = c[j >> 2] | 0;\r\n                  t = h >> 16;\r\n                  c[m >> 2] = g + f - (((Z((h >>> 1) - (t << 15) << 16 >> 16, k) | 0) >> 15) + (Z(t, k) | 0) << 2);\r\n                  if ((e | 0) == 2) break;\r\n                  g = c[m + -12 >> 2] | 0;\r\n                  m = j;\r\n                  f = h;\r\n                  e = e + 1 | 0;\r\n              }\r\n              c[l >> 2] = (c[l >> 2] | 0) - (k << 10);\r\n              l = r + 16 | 0;\r\n              f = c[r + 8 >> 2] | 0;\r\n              c[l >> 2] = f;\r\n              k = b[a + 14 >> 1] | 0;\r\n              g = f;\r\n              e = 1;\r\n              while (1) {\r\n                  j = l + -4 | 0;\r\n                  h = c[j >> 2] | 0;\r\n                  t = h >> 16;\r\n                  c[l >> 2] = g + f - (((Z((h >>> 1) - (t << 15) << 16 >> 16, k) | 0) >> 15) + (Z(t, k) | 0) << 2);\r\n                  if ((e | 0) == 3) break;\r\n                  g = c[l + -12 >> 2] | 0;\r\n                  l = j;\r\n                  f = h;\r\n                  e = e + 1 | 0;\r\n              }\r\n              e = r + 4 | 0;\r\n              c[e >> 2] = (c[e >> 2] | 0) - (k << 10);\r\n              e = r + 20 | 0;\r\n              k = c[r + 12 >> 2] | 0;\r\n              c[e >> 2] = k;\r\n              f = b[a + 18 >> 1] | 0;\r\n              j = k;\r\n              l = 1;\r\n              while (1) {\r\n                  g = e + -4 | 0;\r\n                  h = c[g >> 2] | 0;\r\n                  t = h >> 16;\r\n                  c[e >> 2] = j + k - (((Z((h >>> 1) - (t << 15) << 16 >> 16, f) | 0) >> 15) + (Z(t, f) | 0) << 2);\r\n                  if ((l | 0) == 4) break;\r\n                  j = c[e + -12 >> 2] | 0;\r\n                  e = g;\r\n                  k = h;\r\n                  l = l + 1 | 0;\r\n              }\r\n              j = (c[r + 4 >> 2] | 0) - (f << 10) | 0;\r\n              m = q + 20 | 0;\r\n              k = r + 20 | 0;\r\n              l = c[q + 16 >> 2] | 0;\r\n              a = (c[m >> 2] | 0) + l | 0;\r\n              c[m >> 2] = a;\r\n              m = c[r + 16 >> 2] | 0;\r\n              t = (c[k >> 2] | 0) - m | 0;\r\n              c[k >> 2] = t;\r\n              k = c[q + 12 >> 2] | 0;\r\n              l = l + k | 0;\r\n              c[q + 16 >> 2] = l;\r\n              h = c[r + 12 >> 2] | 0;\r\n              m = m - h | 0;\r\n              c[r + 16 >> 2] = m;\r\n              f = c[p >> 2] | 0;\r\n              k = k + f | 0;\r\n              c[q + 12 >> 2] = k;\r\n              g = c[n >> 2] | 0;\r\n              p = h - g | 0;\r\n              c[r + 12 >> 2] = p;\r\n              h = c[o >> 2] | 0;\r\n              n = f + h | 0;\r\n              c[q + 8 >> 2] = n;\r\n              o = g - j | 0;\r\n              c[r + 8 >> 2] = o;\r\n              q = h + (c[q >> 2] | 0) | 0;\r\n              r = j - (c[r >> 2] | 0) | 0;\r\n              b[d >> 1] = 4096;\r\n              q = q + 4096 | 0;\r\n              b[d + 2 >> 1] = (q + r | 0) >>> 13;\r\n              b[d + 20 >> 1] = (q - r | 0) >>> 13;\r\n              r = n + 4096 | 0;\r\n              b[d + 4 >> 1] = (r + o | 0) >>> 13;\r\n              b[d + 18 >> 1] = (r - o | 0) >>> 13;\r\n              r = k + 4096 | 0;\r\n              b[d + 6 >> 1] = (r + p | 0) >>> 13;\r\n              b[d + 16 >> 1] = (r - p | 0) >>> 13;\r\n              r = l + 4096 | 0;\r\n              b[d + 8 >> 1] = (r + m | 0) >>> 13;\r\n              b[d + 14 >> 1] = (r - m | 0) >>> 13;\r\n              r = a + 4096 | 0;\r\n              b[d + 10 >> 1] = (r + t | 0) >>> 13;\r\n              b[d + 12 >> 1] = (r - t | 0) >>> 13;\r\n              i = s;\r\n              return\r\n          }\r\n\r\n          function ie(a) {\r\n              a = a | 0;\r\n              var d = 0, e = 0, f = 0, g = 0, h = 0;\r\n              if (!a) {\r\n                  h = -1;\r\n                  return h | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(44) | 0;\r\n              if (!d) {\r\n                  h = -1;\r\n                  return h | 0\r\n              }\r\n              e = d + 40 | 0;\r\n              if ((xe(e) | 0) << 16 >> 16) {\r\n                  h = -1;\r\n                  return h | 0\r\n              }\r\n              f = d;\r\n              g = 7452;\r\n              h = f + 20 | 0;\r\n              do {\r\n                  b[f >> 1] = b[g >> 1] | 0;\r\n                  f = f + 2 | 0;\r\n                  g = g + 2 | 0;\r\n              } while ((f | 0) < (h | 0));\r\n              f = d + 20 | 0;\r\n              g = 7452;\r\n              h = f + 20 | 0;\r\n              do {\r\n                  b[f >> 1] = b[g >> 1] | 0;\r\n                  f = f + 2 | 0;\r\n                  g = g + 2 | 0;\r\n              } while ((f | 0) < (h | 0));\r\n              ye(c[e >> 2] | 0) | 0;\r\n              c[a >> 2] = d;\r\n              h = 0;\r\n              return h | 0\r\n          }\r\n\r\n          function je(a) {\r\n              a = a | 0;\r\n              var d = 0, e = 0, f = 0;\r\n              if (!a) {\r\n                  f = -1;\r\n                  return f | 0\r\n              }\r\n              d = a;\r\n              e = 7452;\r\n              f = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = b[e >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  e = e + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              d = a + 20 | 0;\r\n              e = 7452;\r\n              f = d + 20 | 0;\r\n              do {\r\n                  b[d >> 1] = b[e >> 1] | 0;\r\n                  d = d + 2 | 0;\r\n                  e = e + 2 | 0;\r\n              } while ((d | 0) < (f | 0));\r\n              ye(c[a + 40 >> 2] | 0) | 0;\r\n              f = 0;\r\n              return f | 0\r\n          }\r\n\r\n          function ke(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              ze(b + 40 | 0);\r\n              Ke(c[a >> 2] | 0);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function le(a, d, e, f, g, h, j, k) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              k = k | 0;\r\n              var l = 0, m = 0, n = 0, o = 0, p = 0;\r\n              p = i;\r\n              i = i + 64 | 0;\r\n              o = p + 44 | 0;\r\n              l = p + 24 | 0;\r\n              m = p + 4 | 0;\r\n              n = p;\r\n              if ((d | 0) == 7) {\r\n                  Sd(f + 22 | 0, l, a, k);\r\n                  Sd(f + 66 | 0, h, l, k);\r\n                  $d(a, l, h, f, k);\r\n                  if ((e | 0) == 8) f = 6; else {\r\n                      ve(c[a + 40 >> 2] | 0, l, h, m, o, c[j >> 2] | 0, k);\r\n                      _d(a + 20 | 0, m, o, g, k);\r\n                      g = (c[j >> 2] | 0) + 10 | 0;\r\n                      f = 7;\r\n                  }\r\n              } else {\r\n                  Sd(f + 66 | 0, h, a, k);\r\n                  be(a, h, f, k);\r\n                  if ((e | 0) == 8) f = 6; else {\r\n                      te(c[a + 40 >> 2] | 0, d, h, o, c[j >> 2] | 0, n, k);\r\n                      ae(a + 20 | 0, o, g, k);\r\n                      g = (c[j >> 2] | 0) + 6 | 0;\r\n                      f = 7;\r\n                  }\r\n              }\r\n              if ((f | 0) == 6) {\r\n                  f = a;\r\n                  g = f + 20 | 0;\r\n                  do {\r\n                      b[f >> 1] = b[h >> 1] | 0;\r\n                      f = f + 2 | 0;\r\n                      h = h + 2 | 0;\r\n                  } while ((f | 0) < (g | 0));\r\n                  i = p;\r\n                  return\r\n              } else if ((f | 0) == 7) {\r\n                  c[j >> 2] = g;\r\n                  f = a;\r\n                  g = f + 20 | 0;\r\n                  do {\r\n                      b[f >> 1] = b[h >> 1] | 0;\r\n                      f = f + 2 | 0;\r\n                      h = h + 2 | 0;\r\n                  } while ((f | 0) < (g | 0));\r\n                  f = a + 20 | 0;\r\n                  h = o;\r\n                  g = f + 20 | 0;\r\n                  do {\r\n                      b[f >> 1] = b[h >> 1] | 0;\r\n                      f = f + 2 | 0;\r\n                      h = h + 2 | 0;\r\n                  } while ((f | 0) < (g | 0));\r\n                  i = p;\r\n                  return\r\n              }\r\n          }\r\n\r\n          function me(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0, h = 0;\r\n              if (d << 16 >> 16 > 0) e = 0; else return;\r\n              do {\r\n                  g = b[a + (e << 1) >> 1] | 0;\r\n                  h = g >> 8;\r\n                  f = b[7194 + (h << 1) >> 1] | 0;\r\n                  b[c + (e << 1) >> 1] = ((Z((b[7194 + (h + 1 << 1) >> 1] | 0) - f | 0, g & 255) | 0) >>> 8) + f;\r\n                  e = e + 1 | 0;\r\n              } while ((e & 65535) << 16 >> 16 != d << 16 >> 16);\r\n              return\r\n          }\r\n\r\n          function ne(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0, h = 0;\r\n              e = (d << 16 >> 16) + -1 | 0;\r\n              d = e & 65535;\r\n              if (d << 16 >> 16 <= -1) return;\r\n              f = 63;\r\n              h = c + (e << 1) | 0;\r\n              g = a + (e << 1) | 0;\r\n              while (1) {\r\n                  a = b[g >> 1] | 0;\r\n                  c = f;\r\n                  while (1) {\r\n                      e = c << 16 >> 16;\r\n                      f = b[7194 + (e << 1) >> 1] | 0;\r\n                      if (a << 16 >> 16 > f << 16 >> 16) c = c + -1 << 16 >> 16; else break\r\n                  }\r\n                  b[h >> 1] = (((Z(b[7324 + (e << 1) >> 1] | 0, (a << 16 >> 16) - (f << 16 >> 16) | 0) | 0) + 2048 | 0) >>> 12) + (e << 8);\r\n                  d = d + -1 << 16 >> 16;\r\n                  if (d << 16 >> 16 > -1) {\r\n                      f = c;\r\n                      h = h + -2 | 0;\r\n                      g = g + -2 | 0;\r\n                  } else break\r\n              }\r\n              return\r\n          }\r\n\r\n          function oe(a, b, d) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              d = d | 0;\r\n              a = (Z(b << 16 >> 16, a << 16 >> 16) | 0) + 16384 >> 15;\r\n              a = a | 0 - (a & 65536);\r\n              if ((a | 0) <= 32767) {\r\n                  if ((a | 0) < -32768) {\r\n                      c[d >> 2] = 1;\r\n                      a = -32768;\r\n                  }\r\n              } else {\r\n                  c[d >> 2] = 1;\r\n                  a = 32767;\r\n              }\r\n              return a & 65535 | 0\r\n          }\r\n\r\n          function pe(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              a:do if ((a | 0) != 0 ? (b = a - (a >>> 31) | 0, b = b >> 31 ^ b, (b & 1073741824 | 0) == 0) : 0) {\r\n                  a = b;\r\n                  b = 0;\r\n                  while (1) {\r\n                      if (a & 536870912) {\r\n                          a = 7;\r\n                          break\r\n                      }\r\n                      if (a & 268435456) {\r\n                          a = 8;\r\n                          break\r\n                      }\r\n                      if (a & 134217728) {\r\n                          a = 9;\r\n                          break\r\n                      }\r\n                      b = b + 4 << 16 >> 16;\r\n                      a = a << 4;\r\n                      if (a & 1073741824) break a\r\n                  }\r\n                  if ((a | 0) == 7) {\r\n                      b = b | 1;\r\n                      break\r\n                  } else if ((a | 0) == 8) {\r\n                      b = b | 2;\r\n                      break\r\n                  } else if ((a | 0) == 9) {\r\n                      b = b | 3;\r\n                      break\r\n                  }\r\n              } else b = 0; while (0);\r\n              return b | 0\r\n          }\r\n\r\n          function qe(a) {\r\n              a = a | 0;\r\n              var b = 0, c = 0;\r\n              if (!(a << 16 >> 16)) {\r\n                  c = 0;\r\n                  return c | 0\r\n              }\r\n              b = (a & 65535) - ((a & 65535) >>> 15 & 65535) | 0;\r\n              b = (b << 16 >> 31 ^ b) << 16;\r\n              a = b >> 16;\r\n              if (!(a & 16384)) {\r\n                  c = b;\r\n                  b = 0;\r\n              } else {\r\n                  c = 0;\r\n                  return c | 0\r\n              }\r\n              while (1) {\r\n                  if (a & 8192) {\r\n                      a = b;\r\n                      c = 7;\r\n                      break\r\n                  }\r\n                  if (a & 4096) {\r\n                      a = b;\r\n                      c = 8;\r\n                      break\r\n                  }\r\n                  if (a & 2048) {\r\n                      a = b;\r\n                      c = 9;\r\n                      break\r\n                  }\r\n                  b = b + 4 << 16 >> 16;\r\n                  c = c << 4;\r\n                  a = c >> 16;\r\n                  if (a & 16384) {\r\n                      a = b;\r\n                      c = 10;\r\n                      break\r\n                  }\r\n              }\r\n              if ((c | 0) == 7) {\r\n                  c = a | 1;\r\n                  return c | 0\r\n              } else if ((c | 0) == 8) {\r\n                  c = a | 2;\r\n                  return c | 0\r\n              } else if ((c | 0) == 9) {\r\n                  c = a | 3;\r\n                  return c | 0\r\n              } else if ((c | 0) == 10) return a | 0;\r\n              return 0\r\n          }\r\n\r\n          function re(a, d, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              var g = 0, h = 0, i = 0;\r\n              d = d << 16 >> 16;\r\n              if ((d & 134217727 | 0) == 33554432) {\r\n                  c[f >> 2] = 1;\r\n                  d = 2147483647;\r\n              } else d = d << 6;\r\n              g = d >>> 16 & 31;\r\n              i = b[7792 + (g << 1) >> 1] | 0;\r\n              h = i << 16;\r\n              d = Z(i - (e[7792 + (g + 1 << 1) >> 1] | 0) << 16 >> 16, d >>> 1 & 32767) | 0;\r\n              if ((d | 0) == 1073741824) {\r\n                  c[f >> 2] = 1;\r\n                  g = 2147483647;\r\n              } else g = d << 1;\r\n              d = h - g | 0;\r\n              if (((d ^ h) & (g ^ h) | 0) >= 0) {\r\n                  i = d;\r\n                  a = a & 65535;\r\n                  a = 30 - a | 0;\r\n                  a = a & 65535;\r\n                  f = ge(i, a, f) | 0;\r\n                  return f | 0\r\n              }\r\n              c[f >> 2] = 1;\r\n              i = (i >>> 15 & 1) + 2147483647 | 0;\r\n              a = a & 65535;\r\n              a = 30 - a | 0;\r\n              a = a & 65535;\r\n              f = ge(i, a, f) | 0;\r\n              return f | 0\r\n          }\r\n\r\n          function se(a, c, d, e, f, g) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              var h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0;\r\n              o = i;\r\n              i = i + 48 | 0;\r\n              n = o;\r\n              m = 0 - (d & 65535) | 0;\r\n              m = f << 16 >> 16 == 0 ? m : m << 1 & 131070;\r\n              d = m & 65535;\r\n              m = (d << 16 >> 16 < 0 ? m + 6 | 0 : m) << 16 >> 16;\r\n              g = 6 - m | 0;\r\n              b[n >> 1] = b[7858 + (m << 1) >> 1] | 0;\r\n              b[n + 2 >> 1] = b[7858 + (g << 1) >> 1] | 0;\r\n              b[n + 4 >> 1] = b[7858 + (m + 6 << 1) >> 1] | 0;\r\n              b[n + 6 >> 1] = b[7858 + (g + 6 << 1) >> 1] | 0;\r\n              b[n + 8 >> 1] = b[7858 + (m + 12 << 1) >> 1] | 0;\r\n              b[n + 10 >> 1] = b[7858 + (g + 12 << 1) >> 1] | 0;\r\n              b[n + 12 >> 1] = b[7858 + (m + 18 << 1) >> 1] | 0;\r\n              b[n + 14 >> 1] = b[7858 + (g + 18 << 1) >> 1] | 0;\r\n              b[n + 16 >> 1] = b[7858 + (m + 24 << 1) >> 1] | 0;\r\n              b[n + 18 >> 1] = b[7858 + (g + 24 << 1) >> 1] | 0;\r\n              b[n + 20 >> 1] = b[7858 + (m + 30 << 1) >> 1] | 0;\r\n              b[n + 22 >> 1] = b[7858 + (g + 30 << 1) >> 1] | 0;\r\n              b[n + 24 >> 1] = b[7858 + (m + 36 << 1) >> 1] | 0;\r\n              b[n + 26 >> 1] = b[7858 + (g + 36 << 1) >> 1] | 0;\r\n              b[n + 28 >> 1] = b[7858 + (m + 42 << 1) >> 1] | 0;\r\n              b[n + 30 >> 1] = b[7858 + (g + 42 << 1) >> 1] | 0;\r\n              b[n + 32 >> 1] = b[7858 + (m + 48 << 1) >> 1] | 0;\r\n              b[n + 34 >> 1] = b[7858 + (g + 48 << 1) >> 1] | 0;\r\n              b[n + 36 >> 1] = b[7858 + (m + 54 << 1) >> 1] | 0;\r\n              b[n + 38 >> 1] = b[7858 + (g + 54 << 1) >> 1] | 0;\r\n              g = e << 16 >> 16 >>> 1 & 65535;\r\n              if (!(g << 16 >> 16)) {\r\n                  i = o;\r\n                  return\r\n              }\r\n              m = a + ((d << 16 >> 16 >> 15 << 16 >> 16) - (c << 16 >> 16) << 1) | 0;\r\n              while (1) {\r\n                  l = m + 2 | 0;\r\n                  h = b[l >> 1] | 0;\r\n                  c = h;\r\n                  e = m;\r\n                  j = 5;\r\n                  k = n;\r\n                  f = 16384;\r\n                  d = 16384;\r\n                  while (1) {\r\n                      q = b[k >> 1] | 0;\r\n                      r = (Z(q, c << 16 >> 16) | 0) + d | 0;\r\n                      p = b[l + -2 >> 1] | 0;\r\n                      d = (Z(p, q) | 0) + f | 0;\r\n                      q = e;\r\n                      e = e + 4 | 0;\r\n                      s = b[k + 2 >> 1] | 0;\r\n                      d = d + (Z(s, h << 16 >> 16) | 0) | 0;\r\n                      f = b[e >> 1] | 0;\r\n                      s = r + (Z(f, s) | 0) | 0;\r\n                      l = l + -4 | 0;\r\n                      r = b[k + 4 >> 1] | 0;\r\n                      p = s + (Z(r, p) | 0) | 0;\r\n                      c = b[l >> 1] | 0;\r\n                      r = d + (Z(c << 16 >> 16, r) | 0) | 0;\r\n                      d = b[k + 6 >> 1] | 0;\r\n                      f = r + (Z(d, f) | 0) | 0;\r\n                      h = b[q + 6 >> 1] | 0;\r\n                      d = p + (Z(h << 16 >> 16, d) | 0) | 0;\r\n                      if (j << 16 >> 16 <= 1) break; else {\r\n                          j = j + -1 << 16 >> 16;\r\n                          k = k + 8 | 0;\r\n                      }\r\n                  }\r\n                  b[a >> 1] = f >>> 15;\r\n                  b[a + 2 >> 1] = d >>> 15;\r\n                  g = g + -1 << 16 >> 16;\r\n                  if (!(g << 16 >> 16)) break; else {\r\n                      m = m + 4 | 0;\r\n                      a = a + 4 | 0;\r\n                  }\r\n              }\r\n              i = o;\r\n              return\r\n          }\r\n\r\n          function te(a, c, d, f, g, h, j) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              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,\r\n                  z = 0, A = 0, B = 0, C = 0;\r\n              C = i;\r\n              i = i + 144 | 0;\r\n              t = C + 120 | 0;\r\n              y = C + 100 | 0;\r\n              A = C + 80 | 0;\r\n              B = C + 60 | 0;\r\n              z = C + 40 | 0;\r\n              q = C + 20 | 0;\r\n              r = C;\r\n              ne(d, t, 10, j);\r\n              fe(t, y, j);\r\n              if ((c | 0) == 8) {\r\n                  b[h >> 1] = 0;\r\n                  l = 2147483647;\r\n                  s = 0;\r\n                  while (1) {\r\n                      n = s * 10 | 0;\r\n                      d = 0;\r\n                      m = 0;\r\n                      do {\r\n                          x = (e[7980 + (m + n << 1) >> 1] | 0) + (e[8140 + (m << 1) >> 1] | 0) | 0;\r\n                          b[r + (m << 1) >> 1] = x;\r\n                          x = (e[t + (m << 1) >> 1] | 0) - (x & 65535) | 0;\r\n                          b[q + (m << 1) >> 1] = x;\r\n                          x = x << 16;\r\n                          d = (Z(x >> 15, x >> 16) | 0) + d | 0;\r\n                          m = m + 1 | 0;\r\n                      } while ((m | 0) != 10);\r\n                      if ((d | 0) < (l | 0)) {\r\n                          u = B;\r\n                          p = q;\r\n                          o = u + 20 | 0;\r\n                          do {\r\n                              b[u >> 1] = b[p >> 1] | 0;\r\n                              u = u + 2 | 0;\r\n                              p = p + 2 | 0;\r\n                          } while ((u | 0) < (o | 0));\r\n                          u = A;\r\n                          p = r;\r\n                          o = u + 20 | 0;\r\n                          do {\r\n                              b[u >> 1] = b[p >> 1] | 0;\r\n                              u = u + 2 | 0;\r\n                              p = p + 2 | 0;\r\n                          } while ((u | 0) < (o | 0));\r\n                          u = a;\r\n                          p = 7980 + (n << 1) | 0;\r\n                          o = u + 20 | 0;\r\n                          do {\r\n                              b[u >> 1] = b[p >> 1] | 0;\r\n                              u = u + 2 | 0;\r\n                              p = p + 2 | 0;\r\n                          } while ((u | 0) < (o | 0));\r\n                          b[h >> 1] = s;\r\n                      } else d = l;\r\n                      s = s + 1 | 0;\r\n                      if ((s | 0) == 8) break; else l = d;\r\n                  }\r\n              } else {\r\n                  d = 0;\r\n                  do {\r\n                      x = Z(b[8160 + (d << 1) >> 1] | 0, b[a + (d << 1) >> 1] | 0) | 0;\r\n                      x = (x >>> 15) + (e[8140 + (d << 1) >> 1] | 0) | 0;\r\n                      b[A + (d << 1) >> 1] = x;\r\n                      b[B + (d << 1) >> 1] = (e[t + (d << 1) >> 1] | 0) - x;\r\n                      d = d + 1 | 0;\r\n                  } while ((d | 0) != 10)\r\n              }\r\n              do if (c >>> 0 >= 2) {\r\n                  x = B + 2 | 0;\r\n                  w = B + 4 | 0;\r\n                  v = e[B >> 1] | 0;\r\n                  u = b[y >> 1] << 1;\r\n                  t = e[x >> 1] | 0;\r\n                  q = b[y + 2 >> 1] << 1;\r\n                  p = e[w >> 1] | 0;\r\n                  o = b[y + 4 >> 1] << 1;\r\n                  if ((c | 0) == 5) {\r\n                      r = 2147483647;\r\n                      h = 0;\r\n                      d = 0;\r\n                      s = 17908;\r\n                      while (1) {\r\n                          m = (Z(v - (e[s >> 1] | 0) << 16 >> 16, u) | 0) >> 16;\r\n                          m = Z(m, m) | 0;\r\n                          n = (Z(t - (e[s + 2 >> 1] | 0) << 16 >> 16, q) | 0) >> 16;\r\n                          m = (Z(n, n) | 0) + m | 0;\r\n                          n = (Z(p - (e[s + 4 >> 1] | 0) << 16 >> 16, o) | 0) >> 16;\r\n                          n = m + (Z(n, n) | 0) | 0;\r\n                          m = (n | 0) < (r | 0);\r\n                          d = m ? h : d;\r\n                          h = h + 1 << 16 >> 16;\r\n                          if (h << 16 >> 16 >= 512) break; else {\r\n                              r = m ? n : r;\r\n                              s = s + 6 | 0;\r\n                          }\r\n                      }\r\n                      n = (d << 16 >> 16) * 3 | 0;\r\n                      b[B >> 1] = b[17908 + (n << 1) >> 1] | 0;\r\n                      b[x >> 1] = b[17908 + (n + 1 << 1) >> 1] | 0;\r\n                      b[w >> 1] = b[17908 + (n + 2 << 1) >> 1] | 0;\r\n                      b[g >> 1] = d;\r\n                      n = B + 6 | 0;\r\n                      m = B + 8 | 0;\r\n                      v = B + 10 | 0;\r\n                      s = e[n >> 1] | 0;\r\n                      h = b[y + 6 >> 1] << 1;\r\n                      r = e[m >> 1] | 0;\r\n                      q = b[y + 8 >> 1] << 1;\r\n                      p = e[v >> 1] | 0;\r\n                      o = b[y + 10 >> 1] << 1;\r\n                      k = 2147483647;\r\n                      t = 0;\r\n                      d = 0;\r\n                      u = 9716;\r\n                      while (1) {\r\n                          l = (Z(h, s - (e[u >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                          l = Z(l, l) | 0;\r\n                          c = (Z(q, r - (e[u + 2 >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                          l = (Z(c, c) | 0) + l | 0;\r\n                          c = (Z(o, p - (e[u + 4 >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                          c = l + (Z(c, c) | 0) | 0;\r\n                          l = (c | 0) < (k | 0);\r\n                          d = l ? t : d;\r\n                          t = t + 1 << 16 >> 16;\r\n                          if (t << 16 >> 16 >= 512) break; else {\r\n                              k = l ? c : k;\r\n                              u = u + 6 | 0;\r\n                          }\r\n                      }\r\n                      k = (d << 16 >> 16) * 3 | 0;\r\n                      b[n >> 1] = b[9716 + (k << 1) >> 1] | 0;\r\n                      b[m >> 1] = b[9716 + (k + 1 << 1) >> 1] | 0;\r\n                      b[v >> 1] = b[9716 + (k + 2 << 1) >> 1] | 0;\r\n                      b[g + 2 >> 1] = d;\r\n                      k = B + 12 | 0;\r\n                      b[g + 4 >> 1] = ue(k, 12788, y + 12 | 0, 512) | 0;\r\n                      t = x;\r\n                      s = w;\r\n                      d = v;\r\n                      l = B;\r\n                      break\r\n                  } else {\r\n                      r = 2147483647;\r\n                      h = 0;\r\n                      d = 0;\r\n                      s = 8180;\r\n                      while (1) {\r\n                          m = (Z(v - (e[s >> 1] | 0) << 16 >> 16, u) | 0) >> 16;\r\n                          m = Z(m, m) | 0;\r\n                          n = (Z(t - (e[s + 2 >> 1] | 0) << 16 >> 16, q) | 0) >> 16;\r\n                          m = (Z(n, n) | 0) + m | 0;\r\n                          n = (Z(p - (e[s + 4 >> 1] | 0) << 16 >> 16, o) | 0) >> 16;\r\n                          n = m + (Z(n, n) | 0) | 0;\r\n                          m = (n | 0) < (r | 0);\r\n                          d = m ? h : d;\r\n                          h = h + 1 << 16 >> 16;\r\n                          if (h << 16 >> 16 >= 256) break; else {\r\n                              r = m ? n : r;\r\n                              s = s + 6 | 0;\r\n                          }\r\n                      }\r\n                      n = (d << 16 >> 16) * 3 | 0;\r\n                      b[B >> 1] = b[8180 + (n << 1) >> 1] | 0;\r\n                      b[x >> 1] = b[8180 + (n + 1 << 1) >> 1] | 0;\r\n                      b[w >> 1] = b[8180 + (n + 2 << 1) >> 1] | 0;\r\n                      b[g >> 1] = d;\r\n                      n = B + 6 | 0;\r\n                      m = B + 8 | 0;\r\n                      v = B + 10 | 0;\r\n                      s = e[n >> 1] | 0;\r\n                      h = b[y + 6 >> 1] << 1;\r\n                      r = e[m >> 1] | 0;\r\n                      q = b[y + 8 >> 1] << 1;\r\n                      p = e[v >> 1] | 0;\r\n                      o = b[y + 10 >> 1] << 1;\r\n                      k = 2147483647;\r\n                      t = 0;\r\n                      d = 0;\r\n                      u = 9716;\r\n                      while (1) {\r\n                          l = (Z(h, s - (e[u >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                          l = Z(l, l) | 0;\r\n                          c = (Z(q, r - (e[u + 2 >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                          l = (Z(c, c) | 0) + l | 0;\r\n                          c = (Z(o, p - (e[u + 4 >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                          c = l + (Z(c, c) | 0) | 0;\r\n                          l = (c | 0) < (k | 0);\r\n                          d = l ? t : d;\r\n                          t = t + 1 << 16 >> 16;\r\n                          if (t << 16 >> 16 >= 512) break; else {\r\n                              k = l ? c : k;\r\n                              u = u + 6 | 0;\r\n                          }\r\n                      }\r\n                      k = (d << 16 >> 16) * 3 | 0;\r\n                      b[n >> 1] = b[9716 + (k << 1) >> 1] | 0;\r\n                      b[m >> 1] = b[9716 + (k + 1 << 1) >> 1] | 0;\r\n                      b[v >> 1] = b[9716 + (k + 2 << 1) >> 1] | 0;\r\n                      b[g + 2 >> 1] = d;\r\n                      k = B + 12 | 0;\r\n                      b[g + 4 >> 1] = ue(k, 12788, y + 12 | 0, 512) | 0;\r\n                      t = x;\r\n                      s = w;\r\n                      d = v;\r\n                      l = B;\r\n                      break\r\n                  }\r\n              } else {\r\n                  w = B + 2 | 0;\r\n                  x = B + 4 | 0;\r\n                  n = e[B >> 1] | 0;\r\n                  m = b[y >> 1] << 1;\r\n                  l = e[w >> 1] | 0;\r\n                  k = b[y + 2 >> 1] << 1;\r\n                  c = e[x >> 1] | 0;\r\n                  o = b[y + 4 >> 1] << 1;\r\n                  r = 2147483647;\r\n                  h = 0;\r\n                  d = 0;\r\n                  s = 8180;\r\n                  while (1) {\r\n                      q = (Z(m, n - (e[s >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                      q = Z(q, q) | 0;\r\n                      p = (Z(k, l - (e[s + 2 >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                      q = (Z(p, p) | 0) + q | 0;\r\n                      p = (Z(o, c - (e[s + 4 >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                      p = q + (Z(p, p) | 0) | 0;\r\n                      q = (p | 0) < (r | 0);\r\n                      d = q ? h : d;\r\n                      h = h + 1 << 16 >> 16;\r\n                      if (h << 16 >> 16 >= 256) break; else {\r\n                          r = q ? p : r;\r\n                          s = s + 6 | 0;\r\n                      }\r\n                  }\r\n                  n = (d << 16 >> 16) * 3 | 0;\r\n                  b[B >> 1] = b[8180 + (n << 1) >> 1] | 0;\r\n                  b[w >> 1] = b[8180 + (n + 1 << 1) >> 1] | 0;\r\n                  b[x >> 1] = b[8180 + (n + 2 << 1) >> 1] | 0;\r\n                  b[g >> 1] = d;\r\n                  n = B + 6 | 0;\r\n                  m = B + 8 | 0;\r\n                  v = B + 10 | 0;\r\n                  s = e[n >> 1] | 0;\r\n                  h = b[y + 6 >> 1] << 1;\r\n                  r = e[m >> 1] | 0;\r\n                  q = b[y + 8 >> 1] << 1;\r\n                  p = e[v >> 1] | 0;\r\n                  o = b[y + 10 >> 1] << 1;\r\n                  k = 2147483647;\r\n                  t = 0;\r\n                  d = 0;\r\n                  u = 9716;\r\n                  while (1) {\r\n                      l = (Z(h, s - (e[u >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                      l = Z(l, l) | 0;\r\n                      c = (Z(q, r - (e[u + 2 >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                      l = (Z(c, c) | 0) + l | 0;\r\n                      c = (Z(o, p - (e[u + 4 >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                      c = l + (Z(c, c) | 0) | 0;\r\n                      l = (c | 0) < (k | 0);\r\n                      d = l ? t : d;\r\n                      t = t + 1 << 16 >> 16;\r\n                      if (t << 16 >> 16 >= 256) break; else {\r\n                          k = l ? c : k;\r\n                          u = u + 12 | 0;\r\n                      }\r\n                  }\r\n                  k = (d << 16 >> 16) * 6 | 0;\r\n                  b[n >> 1] = b[9716 + (k << 1) >> 1] | 0;\r\n                  b[m >> 1] = b[9716 + ((k | 1) << 1) >> 1] | 0;\r\n                  b[v >> 1] = b[9716 + (k + 2 << 1) >> 1] | 0;\r\n                  b[g + 2 >> 1] = d;\r\n                  k = B + 12 | 0;\r\n                  b[g + 4 >> 1] = ue(k, 16884, y + 12 | 0, 128) | 0;\r\n                  t = w;\r\n                  s = x;\r\n                  d = v;\r\n                  l = B;\r\n              } while (0);\r\n              u = a;\r\n              p = B;\r\n              o = u + 20 | 0;\r\n              do {\r\n                  b[u >> 1] = b[p >> 1] | 0;\r\n                  u = u + 2 | 0;\r\n                  p = p + 2 | 0;\r\n              } while ((u | 0) < (o | 0));\r\n              b[z >> 1] = (e[A >> 1] | 0) + (e[l >> 1] | 0);\r\n              b[z + 2 >> 1] = (e[A + 2 >> 1] | 0) + (e[t >> 1] | 0);\r\n              b[z + 4 >> 1] = (e[A + 4 >> 1] | 0) + (e[s >> 1] | 0);\r\n              b[z + 6 >> 1] = (e[A + 6 >> 1] | 0) + (e[n >> 1] | 0);\r\n              b[z + 8 >> 1] = (e[A + 8 >> 1] | 0) + (e[m >> 1] | 0);\r\n              b[z + 10 >> 1] = (e[A + 10 >> 1] | 0) + (e[d >> 1] | 0);\r\n              b[z + 12 >> 1] = (e[A + 12 >> 1] | 0) + (e[k >> 1] | 0);\r\n              b[z + 14 >> 1] = (e[A + 14 >> 1] | 0) + (e[B + 14 >> 1] | 0);\r\n              b[z + 16 >> 1] = (e[A + 16 >> 1] | 0) + (e[B + 16 >> 1] | 0);\r\n              b[z + 18 >> 1] = (e[A + 18 >> 1] | 0) + (e[B + 18 >> 1] | 0);\r\n              Ae(z, 205, 10, j);\r\n              me(z, f, 10, j);\r\n              i = C;\r\n              return\r\n          }\r\n\r\n          function ue(a, c, d, f) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              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,\r\n                  v = 0;\r\n              t = a + 2 | 0;\r\n              u = a + 4 | 0;\r\n              v = a + 6 | 0;\r\n              if (f << 16 >> 16 > 0) {\r\n                  m = e[a >> 1] | 0;\r\n                  n = b[d >> 1] << 1;\r\n                  o = e[t >> 1] | 0;\r\n                  p = b[d + 2 >> 1] << 1;\r\n                  q = e[u >> 1] | 0;\r\n                  r = b[d + 4 >> 1] << 1;\r\n                  s = e[v >> 1] | 0;\r\n                  g = b[d + 6 >> 1] << 1;\r\n                  j = 2147483647;\r\n                  k = 0;\r\n                  d = 0;\r\n                  l = c;\r\n                  while (1) {\r\n                      h = (Z(n, m - (e[l >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                      h = Z(h, h) | 0;\r\n                      i = (Z(p, o - (e[l + 2 >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                      h = (Z(i, i) | 0) + h | 0;\r\n                      i = (Z(r, q - (e[l + 4 >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                      i = h + (Z(i, i) | 0) | 0;\r\n                      h = (Z(g, s - (e[l + 6 >> 1] | 0) << 16 >> 16) | 0) >> 16;\r\n                      h = i + (Z(h, h) | 0) | 0;\r\n                      i = (h | 0) < (j | 0);\r\n                      d = i ? k : d;\r\n                      k = k + 1 << 16 >> 16;\r\n                      if (k << 16 >> 16 >= f << 16 >> 16) break; else {\r\n                          j = i ? h : j;\r\n                          l = l + 8 | 0;\r\n                      }\r\n                  }\r\n              } else d = 0;\r\n              f = d << 16 >> 16 << 2;\r\n              s = f | 1;\r\n              b[a >> 1] = b[c + (f << 1) >> 1] | 0;\r\n              b[t >> 1] = b[c + (s << 1) >> 1] | 0;\r\n              b[u >> 1] = b[c + (s + 1 << 1) >> 1] | 0;\r\n              b[v >> 1] = b[c + ((f | 3) << 1) >> 1] | 0;\r\n              return d | 0\r\n          }\r\n\r\n          function ve(a, c, d, f, g, h, j) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              j = j | 0;\r\n              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,\r\n                  z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0;\r\n              I = i;\r\n              i = i + 192 | 0;\r\n              m = I + 160 | 0;\r\n              l = I + 140 | 0;\r\n              C = I + 120 | 0;\r\n              D = I + 100 | 0;\r\n              E = I + 80 | 0;\r\n              F = I + 60 | 0;\r\n              k = I + 40 | 0;\r\n              G = I + 20 | 0;\r\n              H = I;\r\n              ne(c, m, 10, j);\r\n              ne(d, l, 10, j);\r\n              fe(m, C, j);\r\n              fe(l, D, j);\r\n              n = 0;\r\n              d = E;\r\n              c = F;\r\n              o = k;\r\n              while (1) {\r\n                  B = (((b[a + (n << 1) >> 1] | 0) * 21299 | 0) >>> 15) + (e[20980 + (n << 1) >> 1] | 0) | 0;\r\n                  b[d >> 1] = B;\r\n                  b[c >> 1] = (e[m >> 1] | 0) - B;\r\n                  b[o >> 1] = (e[l >> 1] | 0) - B;\r\n                  n = n + 1 | 0;\r\n                  if ((n | 0) == 10) break; else {\r\n                      m = m + 2 | 0;\r\n                      l = l + 2 | 0;\r\n                      d = d + 2 | 0;\r\n                      c = c + 2 | 0;\r\n                      o = o + 2 | 0;\r\n                  }\r\n              }\r\n              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;\r\n              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;\r\n              y = F + 8 | 0;\r\n              z = k + 8 | 0;\r\n              A = F + 10 | 0;\r\n              B = k + 10 | 0;\r\n              d = b[y >> 1] | 0;\r\n              p = b[C + 8 >> 1] << 1;\r\n              q = b[A >> 1] | 0;\r\n              r = b[C + 10 >> 1] << 1;\r\n              s = b[z >> 1] | 0;\r\n              t = b[D + 8 >> 1] << 1;\r\n              u = b[B >> 1] | 0;\r\n              v = b[D + 10 >> 1] << 1;\r\n              l = 2147483647;\r\n              w = 0;\r\n              o = 0;\r\n              x = 24072;\r\n              c = 0;\r\n              while (1) {\r\n                  m = b[x >> 1] | 0;\r\n                  n = (Z(d - m << 16 >> 16, p) | 0) >> 16;\r\n                  n = Z(n, n) | 0;\r\n                  m = (Z(m + d << 16 >> 16, p) | 0) >> 16;\r\n                  m = Z(m, m) | 0;\r\n                  J = b[x + 2 >> 1] | 0;\r\n                  K = (Z(q - J << 16 >> 16, r) | 0) >> 16;\r\n                  n = (Z(K, K) | 0) + n | 0;\r\n                  J = (Z(J + q << 16 >> 16, r) | 0) >> 16;\r\n                  m = (Z(J, J) | 0) + m | 0;\r\n                  if ((n | 0) < (l | 0) | (m | 0) < (l | 0)) {\r\n                      K = b[x + 4 >> 1] | 0;\r\n                      J = (Z(s - K << 16 >> 16, t) | 0) >> 16;\r\n                      J = (Z(J, J) | 0) + n | 0;\r\n                      K = (Z(K + s << 16 >> 16, t) | 0) >> 16;\r\n                      K = (Z(K, K) | 0) + m | 0;\r\n                      m = b[x + 6 >> 1] | 0;\r\n                      n = (Z(u - m << 16 >> 16, v) | 0) >> 16;\r\n                      n = J + (Z(n, n) | 0) | 0;\r\n                      m = (Z(m + u << 16 >> 16, v) | 0) >> 16;\r\n                      m = K + (Z(m, m) | 0) | 0;\r\n                      K = (n | 0) < (l | 0);\r\n                      n = K ? n : l;\r\n                      J = (m | 0) < (n | 0);\r\n                      n = J ? m : n;\r\n                      o = K | J ? w : o;\r\n                      c = J ? 1 : K ? 0 : c;\r\n                  } else n = l;\r\n                  w = w + 1 << 16 >> 16;\r\n                  if (w << 16 >> 16 >= 256) break; else {\r\n                      l = n;\r\n                      x = x + 8 | 0;\r\n                  }\r\n              }\r\n              n = o << 16 >> 16;\r\n              m = n << 2;\r\n              o = m | 1;\r\n              l = 24072 + (o << 1) | 0;\r\n              d = b[24072 + (m << 1) >> 1] | 0;\r\n              if (!(c << 16 >> 16)) {\r\n                  b[y >> 1] = d;\r\n                  b[A >> 1] = b[l >> 1] | 0;\r\n                  b[z >> 1] = b[24072 + (o + 1 << 1) >> 1] | 0;\r\n                  b[B >> 1] = b[24072 + ((m | 3) << 1) >> 1] | 0;\r\n                  c = n << 1;\r\n              } else {\r\n                  b[y >> 1] = 0 - (d & 65535);\r\n                  b[A >> 1] = 0 - (e[l >> 1] | 0);\r\n                  b[z >> 1] = 0 - (e[24072 + (o + 1 << 1) >> 1] | 0);\r\n                  b[B >> 1] = 0 - (e[24072 + ((m | 3) << 1) >> 1] | 0);\r\n                  c = n << 1 & 65534 | 1;\r\n              }\r\n              b[h + 4 >> 1] = c;\r\n              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;\r\n              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;\r\n              l = 0;\r\n              m = G;\r\n              n = H;\r\n              d = E;\r\n              c = F;\r\n              while (1) {\r\n                  J = e[d >> 1] | 0;\r\n                  b[m >> 1] = J + (e[c >> 1] | 0);\r\n                  K = b[k >> 1] | 0;\r\n                  b[n >> 1] = J + (K & 65535);\r\n                  b[a + (l << 1) >> 1] = K;\r\n                  l = l + 1 | 0;\r\n                  if ((l | 0) == 10) break; else {\r\n                      m = m + 2 | 0;\r\n                      n = n + 2 | 0;\r\n                      d = d + 2 | 0;\r\n                      c = c + 2 | 0;\r\n                      k = k + 2 | 0;\r\n                  }\r\n              }\r\n              Ae(G, 205, 10, j);\r\n              Ae(H, 205, 10, j);\r\n              me(G, f, 10, j);\r\n              me(H, g, 10, j);\r\n              i = I;\r\n              return\r\n          }\r\n\r\n          function we(a, c, d, e, f, g, h, i) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              h = h | 0;\r\n              i = i | 0;\r\n              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;\r\n              o = b[a >> 1] | 0;\r\n              u = a + 2 | 0;\r\n              q = b[u >> 1] | 0;\r\n              s = b[c >> 1] | 0;\r\n              v = c + 2 | 0;\r\n              t = b[v >> 1] | 0;\r\n              if (i << 16 >> 16 > 0) {\r\n                  n = e << 16 >> 16 << 1;\r\n                  m = f << 16 >> 16 << 1;\r\n                  l = g << 16 >> 16 << 1;\r\n                  f = h << 16 >> 16 << 1;\r\n                  g = 2147483647;\r\n                  j = 0;\r\n                  e = 0;\r\n                  k = d;\r\n                  while (1) {\r\n                      h = (Z(n, o - (b[k >> 1] | 0) | 0) | 0) >> 16;\r\n                      h = Z(h, h) | 0;\r\n                      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) {\r\n                          h = (Z(f, t - (b[k + 6 >> 1] | 0) | 0) | 0) >> 16;\r\n                          h = (Z(h, h) | 0) + r | 0;\r\n                          w = (h | 0) < (g | 0);\r\n                          h = w ? h : g;\r\n                          e = w ? j : e;\r\n                      } else h = g;\r\n                      j = j + 1 << 16 >> 16;\r\n                      if (j << 16 >> 16 >= i << 16 >> 16) break; else {\r\n                          g = h;\r\n                          k = k + 8 | 0;\r\n                      }\r\n                  }\r\n              } else e = 0;\r\n              w = e << 16 >> 16 << 2;\r\n              i = w | 1;\r\n              b[a >> 1] = b[d + (w << 1) >> 1] | 0;\r\n              b[u >> 1] = b[d + (i << 1) >> 1] | 0;\r\n              b[c >> 1] = b[d + (i + 1 << 1) >> 1] | 0;\r\n              b[v >> 1] = b[d + ((w | 3) << 1) >> 1] | 0;\r\n              return e | 0\r\n          }\r\n\r\n          function xe(a) {\r\n              a = a | 0;\r\n              var d = 0, e = 0, f = 0;\r\n              if (!a) {\r\n                  f = -1;\r\n                  return f | 0\r\n              }\r\n              c[a >> 2] = 0;\r\n              d = Je(20) | 0;\r\n              if (!d) {\r\n                  f = -1;\r\n                  return f | 0\r\n              }\r\n              e = d;\r\n              f = e + 20 | 0;\r\n              do {\r\n                  b[e >> 1] = 0;\r\n                  e = e + 2 | 0;\r\n              } while ((e | 0) < (f | 0));\r\n              c[a >> 2] = d;\r\n              f = 0;\r\n              return f | 0\r\n          }\r\n\r\n          function ye(a) {\r\n              a = a | 0;\r\n              var c = 0;\r\n              if (!a) {\r\n                  c = -1;\r\n                  return c | 0\r\n              }\r\n              c = a + 20 | 0;\r\n              do {\r\n                  b[a >> 1] = 0;\r\n                  a = a + 2 | 0;\r\n              } while ((a | 0) < (c | 0));\r\n              c = 0;\r\n              return c | 0\r\n          }\r\n\r\n          function ze(a) {\r\n              a = a | 0;\r\n              var b = 0;\r\n              if (!a) return;\r\n              b = c[a >> 2] | 0;\r\n              if (!b) return;\r\n              Ke(b);\r\n              c[a >> 2] = 0;\r\n              return\r\n          }\r\n\r\n          function Ae(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0, h = 0;\r\n              if (d << 16 >> 16 <= 0) return;\r\n              f = c << 16 >> 16;\r\n              g = c & 65535;\r\n              h = 0;\r\n              while (1) {\r\n                  e = b[a >> 1] | 0;\r\n                  if (e << 16 >> 16 < c << 16 >> 16) {\r\n                      b[a >> 1] = c;\r\n                      e = (c << 16 >> 16) + f | 0;\r\n                  } else e = (e & 65535) + g | 0;\r\n                  h = h + 1 << 16 >> 16;\r\n                  if (h << 16 >> 16 >= d << 16 >> 16) break; else {\r\n                      c = e & 65535;\r\n                      a = a + 2 | 0;\r\n                  }\r\n              }\r\n              return\r\n          }\r\n\r\n          function Be(a, c, d, e) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              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;\r\n              f = e << 16 >> 16;\r\n              e = f >>> 2 & 65535;\r\n              if (!(e << 16 >> 16)) return;\r\n              n = f + -1 | 0;\r\n              t = a + 20 | 0;\r\n              p = c + (f + -4 << 1) | 0;\r\n              q = c + (f + -3 << 1) | 0;\r\n              r = c + (f + -2 << 1) | 0;\r\n              s = c + (n << 1) | 0;\r\n              o = c + (f + -11 << 1) | 0;\r\n              n = d + (n << 1) | 0;\r\n              while (1) {\r\n                  c = b[t >> 1] | 0;\r\n                  h = 5;\r\n                  i = t;\r\n                  j = o;\r\n                  k = o + -2 | 0;\r\n                  l = o + -4 | 0;\r\n                  m = o + -6 | 0;\r\n                  g = 2048;\r\n                  a = 2048;\r\n                  f = 2048;\r\n                  d = 2048;\r\n                  while (1) {\r\n                      g = (Z(b[j >> 1] | 0, c) | 0) + g | 0;\r\n                      a = (Z(b[k >> 1] | 0, c) | 0) + a | 0;\r\n                      f = (Z(b[l >> 1] | 0, c) | 0) + f | 0;\r\n                      c = (Z(b[m >> 1] | 0, c) | 0) + d | 0;\r\n                      d = b[i + -2 >> 1] | 0;\r\n                      g = g + (Z(b[j + 2 >> 1] | 0, d) | 0) | 0;\r\n                      a = a + (Z(b[k + 2 >> 1] | 0, d) | 0) | 0;\r\n                      f = f + (Z(b[l + 2 >> 1] | 0, d) | 0) | 0;\r\n                      i = i + -4 | 0;\r\n                      d = c + (Z(b[m + 2 >> 1] | 0, d) | 0) | 0;\r\n                      h = h + -1 << 16 >> 16;\r\n                      c = b[i >> 1] | 0;\r\n                      if (!(h << 16 >> 16)) break; else {\r\n                          j = j + 4 | 0;\r\n                          k = k + 4 | 0;\r\n                          l = l + 4 | 0;\r\n                          m = m + 4 | 0;\r\n                      }\r\n                  }\r\n                  j = (Z(b[s >> 1] | 0, c) | 0) + g | 0;\r\n                  k = (Z(b[r >> 1] | 0, c) | 0) + a | 0;\r\n                  l = (Z(b[q >> 1] | 0, c) | 0) + f | 0;\r\n                  m = (Z(b[p >> 1] | 0, c) | 0) + d | 0;\r\n                  b[n >> 1] = j >>> 12;\r\n                  b[n + -2 >> 1] = k >>> 12;\r\n                  b[n + -4 >> 1] = l >>> 12;\r\n                  b[n + -6 >> 1] = m >>> 12;\r\n                  e = e + -1 << 16 >> 16;\r\n                  if (!(e << 16 >> 16)) break; else {\r\n                      p = p + -8 | 0;\r\n                      q = q + -8 | 0;\r\n                      r = r + -8 | 0;\r\n                      s = s + -8 | 0;\r\n                      o = o + -8 | 0;\r\n                      n = n + -8 | 0;\r\n                  }\r\n              }\r\n              return\r\n          }\r\n\r\n          function Ce(a, b) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              var d = 0;\r\n              d = a + 32768 | 0;\r\n              if ((a | 0) > -1 & (d ^ a | 0) < 0) {\r\n                  c[b >> 2] = 1;\r\n                  d = (a >>> 31) + 2147483647 | 0;\r\n              }\r\n              return d >>> 16 & 65535 | 0\r\n          }\r\n\r\n          function De(a, b, d) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              d = d | 0;\r\n              var e = 0, f = 0;\r\n              e = b << 16 >> 16;\r\n              if (!(b << 16 >> 16)) return a | 0;\r\n              if (b << 16 >> 16 > 0) {\r\n                  a = a << 16 >> 16 >> (b << 16 >> 16 > 15 ? 15 : e) & 65535;\r\n                  return a | 0\r\n              }\r\n              f = 0 - e | 0;\r\n              b = a << 16 >> 16;\r\n              f = (f & 65535) << 16 >> 16 > 15 ? 15 : f << 16 >> 16;\r\n              e = b << f;\r\n              if ((e << 16 >> 16 >> f | 0) == (b | 0)) {\r\n                  f = e & 65535;\r\n                  return f | 0\r\n              }\r\n              c[d >> 2] = 1;\r\n              f = a << 16 >> 16 > 0 ? 32767 : -32768;\r\n              return f | 0\r\n          }\r\n\r\n          function Ee(a, b, c) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              c = c | 0;\r\n              if (b << 16 >> 16 > 15) {\r\n                  b = 0;\r\n                  return b | 0\r\n              }\r\n              c = De(a, b, c) | 0;\r\n              if (b << 16 >> 16 > 0) return c + ((1 << (b << 16 >> 16) + -1 & a << 16 >> 16 | 0) != 0 & 1) << 16 >> 16 | 0; else {\r\n                  b = c;\r\n                  return b | 0\r\n              }\r\n              return 0\r\n          }\r\n\r\n          function Fe(a, d, f) {\r\n              a = a | 0;\r\n              d = d | 0;\r\n              f = f | 0;\r\n              var g = 0, h = 0, i = 0;\r\n              if ((a | 0) < 1) {\r\n                  b[d >> 1] = 0;\r\n                  f = 0;\r\n                  return f | 0\r\n              }\r\n              h = (pe(a) | 0) & 65534;\r\n              i = h & 65535;\r\n              h = h << 16 >> 16;\r\n              if (i << 16 >> 16 > 0) {\r\n                  g = a << h;\r\n                  if ((g >> h | 0) != (a | 0)) g = a >> 31 ^ 2147483647;\r\n              } else {\r\n                  h = 0 - h << 16;\r\n                  if ((h | 0) < 2031616) g = a >> (h >> 16); else g = 0;\r\n              }\r\n              b[d >> 1] = i;\r\n              d = g >>> 25 & 63;\r\n              d = d >>> 0 > 15 ? d + -16 | 0 : d;\r\n              i = b[30216 + (d << 1) >> 1] | 0;\r\n              a = i << 16;\r\n              g = Z(i - (e[30216 + (d + 1 << 1) >> 1] | 0) << 16 >> 16, g >>> 10 & 32767) | 0;\r\n              if ((g | 0) == 1073741824) {\r\n                  c[f >> 2] = 1;\r\n                  h = 2147483647;\r\n              } else h = g << 1;\r\n              g = a - h | 0;\r\n              if (((g ^ a) & (h ^ a) | 0) >= 0) {\r\n                  f = g;\r\n                  return f | 0\r\n              }\r\n              c[f >> 2] = 1;\r\n              f = (i >>> 15 & 1) + 2147483647 | 0;\r\n              return f | 0\r\n          }\r\n\r\n          function Ge(a, b, d) {\r\n              a = a | 0;\r\n              b = b | 0;\r\n              d = d | 0;\r\n              a = (a << 16 >> 16) - (b << 16 >> 16) | 0;\r\n              if ((a + 32768 | 0) >>> 0 <= 65535) {\r\n                  d = a;\r\n                  d = d & 65535;\r\n                  return d | 0\r\n              }\r\n              c[d >> 2] = 1;\r\n              d = (a | 0) > 32767 ? 32767 : -32768;\r\n              d = d & 65535;\r\n              return d | 0\r\n          }\r\n\r\n          function He(a, c, d, e, f, g) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              f = f | 0;\r\n              g = g | 0;\r\n              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,\r\n                  x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0;\r\n              A = i;\r\n              i = i + 48 | 0;\r\n              o = A;\r\n              k = o;\r\n              h = f;\r\n              j = k + 20 | 0;\r\n              do {\r\n                  b[k >> 1] = b[h >> 1] | 0;\r\n                  k = k + 2 | 0;\r\n                  h = h + 2 | 0;\r\n              } while ((k | 0) < (j | 0));\r\n              n = o + 18 | 0;\r\n              s = a + 2 | 0;\r\n              t = a + 4 | 0;\r\n              p = c + 20 | 0;\r\n              u = a + 6 | 0;\r\n              v = a + 8 | 0;\r\n              w = a + 10 | 0;\r\n              x = a + 12 | 0;\r\n              y = a + 14 | 0;\r\n              z = a + 16 | 0;\r\n              q = a + 18 | 0;\r\n              r = a + 20 | 0;\r\n              j = b[n >> 1] | 0;\r\n              h = 5;\r\n              l = c;\r\n              m = d;\r\n              k = o + 20 | 0;\r\n              while (1) {\r\n                  D = b[a >> 1] | 0;\r\n                  C = (Z(D, b[l >> 1] | 0) | 0) + 2048 | 0;\r\n                  D = (Z(b[l + 2 >> 1] | 0, D) | 0) + 2048 | 0;\r\n                  o = j << 16 >> 16;\r\n                  C = C - (Z(o, b[s >> 1] | 0) | 0) | 0;\r\n                  B = b[t >> 1] | 0;\r\n                  o = D - (Z(o, B) | 0) | 0;\r\n                  D = b[n + -2 >> 1] | 0;\r\n                  B = C - (Z(D, B) | 0) | 0;\r\n                  C = b[u >> 1] | 0;\r\n                  D = o - (Z(C, D) | 0) | 0;\r\n                  o = b[n + -4 >> 1] | 0;\r\n                  C = B - (Z(o, C) | 0) | 0;\r\n                  B = b[v >> 1] | 0;\r\n                  o = D - (Z(B, o) | 0) | 0;\r\n                  D = b[n + -6 >> 1] | 0;\r\n                  B = C - (Z(D, B) | 0) | 0;\r\n                  C = b[w >> 1] | 0;\r\n                  D = o - (Z(D, C) | 0) | 0;\r\n                  o = b[n + -8 >> 1] | 0;\r\n                  C = B - (Z(o, C) | 0) | 0;\r\n                  B = b[x >> 1] | 0;\r\n                  o = D - (Z(B, o) | 0) | 0;\r\n                  D = b[n + -10 >> 1] | 0;\r\n                  B = C - (Z(D, B) | 0) | 0;\r\n                  C = b[y >> 1] | 0;\r\n                  D = o - (Z(C, D) | 0) | 0;\r\n                  o = b[n + -12 >> 1] | 0;\r\n                  C = B - (Z(o, C) | 0) | 0;\r\n                  B = b[z >> 1] | 0;\r\n                  o = D - (Z(o, B) | 0) | 0;\r\n                  D = b[n + -14 >> 1] | 0;\r\n                  B = C - (Z(D, B) | 0) | 0;\r\n                  C = b[q >> 1] | 0;\r\n                  D = o - (Z(C, D) | 0) | 0;\r\n                  o = b[n + -16 >> 1] | 0;\r\n                  C = B - (Z(o, C) | 0) | 0;\r\n                  B = b[r >> 1] | 0;\r\n                  o = D - (Z(B, o) | 0) | 0;\r\n                  B = C - (Z(b[n + -18 >> 1] | 0, B) | 0) | 0;\r\n                  B = (B + 134217728 | 0) >>> 0 < 268435455 ? B >>> 12 & 65535 : (B | 0) > 134217727 ? 32767 : -32768;\r\n                  o = o - (Z(b[s >> 1] | 0, B << 16 >> 16) | 0) | 0;\r\n                  n = k + 2 | 0;\r\n                  b[k >> 1] = B;\r\n                  b[m >> 1] = B;\r\n                  j = (o + 134217728 | 0) >>> 0 < 268435455 ? o >>> 12 & 65535 : (o | 0) > 134217727 ? 32767 : -32768;\r\n                  b[n >> 1] = j;\r\n                  b[m + 2 >> 1] = j;\r\n                  h = h + -1 << 16 >> 16;\r\n                  if (!(h << 16 >> 16)) break; else {\r\n                      l = l + 4 | 0;\r\n                      m = m + 4 | 0;\r\n                      k = k + 4 | 0;\r\n                  }\r\n              }\r\n              e = (e << 16 >> 16) + -10 | 0;\r\n              k = e >>> 1 & 65535;\r\n              if (k << 16 >> 16) {\r\n                  o = d + 18 | 0;\r\n                  j = c + 16 | 0;\r\n                  n = b[o >> 1] | 0;\r\n                  l = p;\r\n                  h = d + 20 | 0;\r\n                  while (1) {\r\n                      B = b[a >> 1] | 0;\r\n                      m = (Z(B, b[l >> 1] | 0) | 0) + 2048 | 0;\r\n                      B = (Z(b[j + 6 >> 1] | 0, B) | 0) + 2048 | 0;\r\n                      j = b[s >> 1] | 0;\r\n                      C = n << 16 >> 16;\r\n                      m = m - (Z(C, j) | 0) | 0;\r\n                      D = b[t >> 1] | 0;\r\n                      C = B - (Z(C, D) | 0) | 0;\r\n                      B = b[o + -2 >> 1] | 0;\r\n                      D = m - (Z(B, D) | 0) | 0;\r\n                      m = b[u >> 1] | 0;\r\n                      B = C - (Z(m, B) | 0) | 0;\r\n                      C = b[o + -4 >> 1] | 0;\r\n                      m = D - (Z(C, m) | 0) | 0;\r\n                      D = b[v >> 1] | 0;\r\n                      C = B - (Z(D, C) | 0) | 0;\r\n                      B = b[o + -6 >> 1] | 0;\r\n                      D = m - (Z(B, D) | 0) | 0;\r\n                      m = b[w >> 1] | 0;\r\n                      B = C - (Z(B, m) | 0) | 0;\r\n                      C = b[o + -8 >> 1] | 0;\r\n                      m = D - (Z(C, m) | 0) | 0;\r\n                      D = b[x >> 1] | 0;\r\n                      C = B - (Z(D, C) | 0) | 0;\r\n                      B = b[o + -10 >> 1] | 0;\r\n                      D = m - (Z(B, D) | 0) | 0;\r\n                      m = b[y >> 1] | 0;\r\n                      B = C - (Z(m, B) | 0) | 0;\r\n                      C = b[o + -12 >> 1] | 0;\r\n                      m = D - (Z(C, m) | 0) | 0;\r\n                      D = b[z >> 1] | 0;\r\n                      C = B - (Z(C, D) | 0) | 0;\r\n                      B = b[o + -14 >> 1] | 0;\r\n                      D = m - (Z(B, D) | 0) | 0;\r\n                      m = b[q >> 1] | 0;\r\n                      B = C - (Z(m, B) | 0) | 0;\r\n                      C = b[o + -16 >> 1] | 0;\r\n                      m = D - (Z(C, m) | 0) | 0;\r\n                      D = b[r >> 1] | 0;\r\n                      C = B - (Z(D, C) | 0) | 0;\r\n                      D = m - (Z(b[o + -18 >> 1] | 0, D) | 0) | 0;\r\n                      m = l + 4 | 0;\r\n                      D = (D + 134217728 | 0) >>> 0 < 268435455 ? D >>> 12 & 65535 : (D | 0) > 134217727 ? 32767 : -32768;\r\n                      j = C - (Z(j, D << 16 >> 16) | 0) | 0;\r\n                      o = h + 2 | 0;\r\n                      b[h >> 1] = D;\r\n                      do if ((j + 134217728 | 0) >>> 0 >= 268435455) {\r\n                          h = h + 4 | 0;\r\n                          if ((j | 0) > 134217727) {\r\n                              b[o >> 1] = 32767;\r\n                              j = 32767;\r\n                              break\r\n                          } else {\r\n                              b[o >> 1] = -32768;\r\n                              j = -32768;\r\n                              break\r\n                          }\r\n                      } else {\r\n                          j = j >>> 12 & 65535;\r\n                          b[o >> 1] = j;\r\n                          h = h + 4 | 0;\r\n                      } while (0);\r\n                      k = k + -1 << 16 >> 16;\r\n                      if (!(k << 16 >> 16)) break; else {\r\n                          D = l;\r\n                          n = j;\r\n                          l = m;\r\n                          j = D;\r\n                      }\r\n                  }\r\n              }\r\n              if (!(g << 16 >> 16)) {\r\n                  i = A;\r\n                  return\r\n              }\r\n              k = f;\r\n              h = d + (e << 1) | 0;\r\n              j = k + 20 | 0;\r\n              do {\r\n                  b[k >> 1] = b[h >> 1] | 0;\r\n                  k = k + 2 | 0;\r\n                  h = h + 2 | 0;\r\n              } while ((k | 0) < (j | 0));\r\n              i = A;\r\n              return\r\n          }\r\n\r\n          function Ie(a, c, d) {\r\n              a = a | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              b[d >> 1] = b[a >> 1] | 0;\r\n              b[d + 2 >> 1] = ((Z(b[c >> 1] | 0, b[a + 2 >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n              b[d + 4 >> 1] = ((Z(b[c + 2 >> 1] | 0, b[a + 4 >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n              b[d + 6 >> 1] = ((Z(b[c + 4 >> 1] | 0, b[a + 6 >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n              b[d + 8 >> 1] = ((Z(b[c + 6 >> 1] | 0, b[a + 8 >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n              b[d + 10 >> 1] = ((Z(b[c + 8 >> 1] | 0, b[a + 10 >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n              b[d + 12 >> 1] = ((Z(b[c + 10 >> 1] | 0, b[a + 12 >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n              b[d + 14 >> 1] = ((Z(b[c + 12 >> 1] | 0, b[a + 14 >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n              b[d + 16 >> 1] = ((Z(b[c + 14 >> 1] | 0, b[a + 16 >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n              b[d + 18 >> 1] = ((Z(b[c + 16 >> 1] | 0, b[a + 18 >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n              b[d + 20 >> 1] = ((Z(b[c + 18 >> 1] | 0, b[a + 20 >> 1] | 0) | 0) + 16384 | 0) >>> 15;\r\n              return\r\n          }\r\n\r\n          function Je(a) {\r\n              a = a | 0;\r\n              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\n                  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,\r\n                  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,\r\n                  V = 0;\r\n              do if (a >>> 0 < 245) {\r\n                  s = a >>> 0 < 11 ? 16 : a + 11 & -8;\r\n                  a = s >>> 3;\r\n                  m = c[26] | 0;\r\n                  j = m >>> a;\r\n                  if (j & 3) {\r\n                      e = (j & 1 ^ 1) + a | 0;\r\n                      b = e << 1;\r\n                      d = 144 + (b << 2) | 0;\r\n                      b = 144 + (b + 2 << 2) | 0;\r\n                      f = c[b >> 2] | 0;\r\n                      g = f + 8 | 0;\r\n                      h = c[g >> 2] | 0;\r\n                      do if ((d | 0) == (h | 0)) c[26] = m & ~(1 << e); else {\r\n                          if (h >>> 0 >= (c[30] | 0) >>> 0 ? (l = h + 12 | 0, (c[l >> 2] | 0) == (f | 0)) : 0) {\r\n                              c[l >> 2] = d;\r\n                              c[b >> 2] = h;\r\n                              break\r\n                          }\r\n                          ea();\r\n                      } while (0);\r\n                      U = e << 3;\r\n                      c[f + 4 >> 2] = U | 3;\r\n                      U = f + (U | 4) | 0;\r\n                      c[U >> 2] = c[U >> 2] | 1;\r\n                      break\r\n                  }\r\n                  b = c[28] | 0;\r\n                  if (s >>> 0 > b >>> 0) {\r\n                      if (j) {\r\n                          f = 2 << a;\r\n                          f = j << a & (f | 0 - f);\r\n                          f = (f & 0 - f) + -1 | 0;\r\n                          g = f >>> 12 & 16;\r\n                          f = f >>> g;\r\n                          e = f >>> 5 & 8;\r\n                          f = f >>> e;\r\n                          d = f >>> 2 & 4;\r\n                          f = f >>> d;\r\n                          h = f >>> 1 & 2;\r\n                          f = f >>> h;\r\n                          i = f >>> 1 & 1;\r\n                          i = (e | g | d | h | i) + (f >>> i) | 0;\r\n                          f = i << 1;\r\n                          h = 144 + (f << 2) | 0;\r\n                          f = 144 + (f + 2 << 2) | 0;\r\n                          d = c[f >> 2] | 0;\r\n                          g = d + 8 | 0;\r\n                          e = c[g >> 2] | 0;\r\n                          do if ((h | 0) == (e | 0)) {\r\n                              c[26] = m & ~(1 << i);\r\n                              n = b;\r\n                          } else {\r\n                              if (e >>> 0 >= (c[30] | 0) >>> 0 ? (k = e + 12 | 0, (c[k >> 2] | 0) == (d | 0)) : 0) {\r\n                                  c[k >> 2] = h;\r\n                                  c[f >> 2] = e;\r\n                                  n = c[28] | 0;\r\n                                  break\r\n                              }\r\n                              ea();\r\n                          } while (0);\r\n                          U = i << 3;\r\n                          b = U - s | 0;\r\n                          c[d + 4 >> 2] = s | 3;\r\n                          j = d + s | 0;\r\n                          c[d + (s | 4) >> 2] = b | 1;\r\n                          c[d + U >> 2] = b;\r\n                          if (n) {\r\n                              d = c[31] | 0;\r\n                              e = n >>> 3;\r\n                              h = e << 1;\r\n                              i = 144 + (h << 2) | 0;\r\n                              f = c[26] | 0;\r\n                              e = 1 << e;\r\n                              if (f & e) {\r\n                                  f = 144 + (h + 2 << 2) | 0;\r\n                                  h = c[f >> 2] | 0;\r\n                                  if (h >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                      p = f;\r\n                                      q = h;\r\n                                  }\r\n                              } else {\r\n                                  c[26] = f | e;\r\n                                  p = 144 + (h + 2 << 2) | 0;\r\n                                  q = i;\r\n                              }\r\n                              c[p >> 2] = d;\r\n                              c[q + 12 >> 2] = d;\r\n                              c[d + 8 >> 2] = q;\r\n                              c[d + 12 >> 2] = i;\r\n                          }\r\n                          c[28] = b;\r\n                          c[31] = j;\r\n                          break\r\n                      }\r\n                      a = c[27] | 0;\r\n                      if (a) {\r\n                          f = (a & 0 - a) + -1 | 0;\r\n                          T = f >>> 12 & 16;\r\n                          f = f >>> T;\r\n                          S = f >>> 5 & 8;\r\n                          f = f >>> S;\r\n                          U = f >>> 2 & 4;\r\n                          f = f >>> U;\r\n                          h = f >>> 1 & 2;\r\n                          f = f >>> h;\r\n                          j = f >>> 1 & 1;\r\n                          j = c[408 + ((S | T | U | h | j) + (f >>> j) << 2) >> 2] | 0;\r\n                          f = (c[j + 4 >> 2] & -8) - s | 0;\r\n                          h = j;\r\n                          while (1) {\r\n                              i = c[h + 16 >> 2] | 0;\r\n                              if (!i) {\r\n                                  i = c[h + 20 >> 2] | 0;\r\n                                  if (!i) {\r\n                                      b = f;\r\n                                      break\r\n                                  }\r\n                              }\r\n                              h = (c[i + 4 >> 2] & -8) - s | 0;\r\n                              U = h >>> 0 < f >>> 0;\r\n                              f = U ? h : f;\r\n                              h = i;\r\n                              j = U ? i : j;\r\n                          }\r\n                          a = c[30] | 0;\r\n                          if (j >>> 0 >= a >>> 0 ? (v = j + s | 0, j >>> 0 < v >>> 0) : 0) {\r\n                              e = c[j + 24 >> 2] | 0;\r\n                              i = c[j + 12 >> 2] | 0;\r\n                              do if ((i | 0) == (j | 0)) {\r\n                                  h = j + 20 | 0;\r\n                                  i = c[h >> 2] | 0;\r\n                                  if (!i) {\r\n                                      h = j + 16 | 0;\r\n                                      i = c[h >> 2] | 0;\r\n                                      if (!i) {\r\n                                          t = 0;\r\n                                          break\r\n                                      }\r\n                                  }\r\n                                  while (1) {\r\n                                      g = i + 20 | 0;\r\n                                      f = c[g >> 2] | 0;\r\n                                      if (f) {\r\n                                          i = f;\r\n                                          h = g;\r\n                                          continue\r\n                                      }\r\n                                      g = i + 16 | 0;\r\n                                      f = c[g >> 2] | 0;\r\n                                      if (!f) break; else {\r\n                                          i = f;\r\n                                          h = g;\r\n                                      }\r\n                                  }\r\n                                  if (h >>> 0 < a >>> 0) ea(); else {\r\n                                      c[h >> 2] = 0;\r\n                                      t = i;\r\n                                      break\r\n                                  }\r\n                              } else {\r\n                                  h = c[j + 8 >> 2] | 0;\r\n                                  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) {\r\n                                      c[d >> 2] = i;\r\n                                      c[o >> 2] = h;\r\n                                      t = i;\r\n                                      break\r\n                                  }\r\n                                  ea();\r\n                              } while (0);\r\n                              do if (e) {\r\n                                  h = c[j + 28 >> 2] | 0;\r\n                                  g = 408 + (h << 2) | 0;\r\n                                  if ((j | 0) == (c[g >> 2] | 0)) {\r\n                                      c[g >> 2] = t;\r\n                                      if (!t) {\r\n                                          c[27] = c[27] & ~(1 << h);\r\n                                          break\r\n                                      }\r\n                                  } else {\r\n                                      if (e >>> 0 < (c[30] | 0) >>> 0) ea();\r\n                                      h = e + 16 | 0;\r\n                                      if ((c[h >> 2] | 0) == (j | 0)) c[h >> 2] = t; else c[e + 20 >> 2] = t;\r\n                                      if (!t) break\r\n                                  }\r\n                                  g = c[30] | 0;\r\n                                  if (t >>> 0 < g >>> 0) ea();\r\n                                  c[t + 24 >> 2] = e;\r\n                                  h = c[j + 16 >> 2] | 0;\r\n                                  do if (h) if (h >>> 0 < g >>> 0) ea(); else {\r\n                                      c[t + 16 >> 2] = h;\r\n                                      c[h + 24 >> 2] = t;\r\n                                      break\r\n                                  } while (0);\r\n                                  h = c[j + 20 >> 2] | 0;\r\n                                  if (h) if (h >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                      c[t + 20 >> 2] = h;\r\n                                      c[h + 24 >> 2] = t;\r\n                                      break\r\n                                  }\r\n                              } while (0);\r\n                              if (b >>> 0 < 16) {\r\n                                  U = b + s | 0;\r\n                                  c[j + 4 >> 2] = U | 3;\r\n                                  U = j + (U + 4) | 0;\r\n                                  c[U >> 2] = c[U >> 2] | 1;\r\n                              } else {\r\n                                  c[j + 4 >> 2] = s | 3;\r\n                                  c[j + (s | 4) >> 2] = b | 1;\r\n                                  c[j + (b + s) >> 2] = b;\r\n                                  e = c[28] | 0;\r\n                                  if (e) {\r\n                                      d = c[31] | 0;\r\n                                      f = e >>> 3;\r\n                                      h = f << 1;\r\n                                      i = 144 + (h << 2) | 0;\r\n                                      g = c[26] | 0;\r\n                                      f = 1 << f;\r\n                                      if (g & f) {\r\n                                          h = 144 + (h + 2 << 2) | 0;\r\n                                          g = c[h >> 2] | 0;\r\n                                          if (g >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                              u = h;\r\n                                              w = g;\r\n                                          }\r\n                                      } else {\r\n                                          c[26] = g | f;\r\n                                          u = 144 + (h + 2 << 2) | 0;\r\n                                          w = i;\r\n                                      }\r\n                                      c[u >> 2] = d;\r\n                                      c[w + 12 >> 2] = d;\r\n                                      c[d + 8 >> 2] = w;\r\n                                      c[d + 12 >> 2] = i;\r\n                                  }\r\n                                  c[28] = b;\r\n                                  c[31] = v;\r\n                              }\r\n                              g = j + 8 | 0;\r\n                              break\r\n                          }\r\n                          ea();\r\n                      } else V = 154;\r\n                  } else V = 154;\r\n              } else if (a >>> 0 <= 4294967231) {\r\n                  a = a + 11 | 0;\r\n                  w = a & -8;\r\n                  m = c[27] | 0;\r\n                  if (m) {\r\n                      j = 0 - w | 0;\r\n                      a = a >>> 8;\r\n                      if (a) if (w >>> 0 > 16777215) l = 31; else {\r\n                          v = (a + 1048320 | 0) >>> 16 & 8;\r\n                          V = a << v;\r\n                          u = (V + 520192 | 0) >>> 16 & 4;\r\n                          V = V << u;\r\n                          l = (V + 245760 | 0) >>> 16 & 2;\r\n                          l = 14 - (u | v | l) + (V << l >>> 15) | 0;\r\n                          l = w >>> (l + 7 | 0) & 1 | l << 1;\r\n                      } else l = 0;\r\n                      a = c[408 + (l << 2) >> 2] | 0;\r\n                      a:do if (!a) {\r\n                          i = 0;\r\n                          a = 0;\r\n                          V = 86;\r\n                      } else {\r\n                          d = j;\r\n                          i = 0;\r\n                          b = w << ((l | 0) == 31 ? 0 : 25 - (l >>> 1) | 0);\r\n                          k = a;\r\n                          a = 0;\r\n                          while (1) {\r\n                              e = c[k + 4 >> 2] & -8;\r\n                              j = e - w | 0;\r\n                              if (j >>> 0 < d >>> 0) if ((e | 0) == (w | 0)) {\r\n                                  e = k;\r\n                                  a = k;\r\n                                  V = 90;\r\n                                  break a\r\n                              } else a = k; else j = d;\r\n                              V = c[k + 20 >> 2] | 0;\r\n                              k = c[k + 16 + (b >>> 31 << 2) >> 2] | 0;\r\n                              i = (V | 0) == 0 | (V | 0) == (k | 0) ? i : V;\r\n                              if (!k) {\r\n                                  V = 86;\r\n                                  break\r\n                              } else {\r\n                                  d = j;\r\n                                  b = b << 1;\r\n                              }\r\n                          }\r\n                      } while (0);\r\n                      if ((V | 0) == 86) {\r\n                          if ((i | 0) == 0 & (a | 0) == 0) {\r\n                              a = 2 << l;\r\n                              a = m & (a | 0 - a);\r\n                              if (!a) {\r\n                                  s = w;\r\n                                  V = 154;\r\n                                  break\r\n                              }\r\n                              a = (a & 0 - a) + -1 | 0;\r\n                              t = a >>> 12 & 16;\r\n                              a = a >>> t;\r\n                              q = a >>> 5 & 8;\r\n                              a = a >>> q;\r\n                              u = a >>> 2 & 4;\r\n                              a = a >>> u;\r\n                              v = a >>> 1 & 2;\r\n                              a = a >>> v;\r\n                              i = a >>> 1 & 1;\r\n                              i = c[408 + ((q | t | u | v | i) + (a >>> i) << 2) >> 2] | 0;\r\n                              a = 0;\r\n                          }\r\n                          if (!i) {\r\n                              q = j;\r\n                              p = a;\r\n                          } else {\r\n                              e = i;\r\n                              V = 90;\r\n                          }\r\n                      }\r\n                      if ((V | 0) == 90) while (1) {\r\n                          V = 0;\r\n                          v = (c[e + 4 >> 2] & -8) - w | 0;\r\n                          i = v >>> 0 < j >>> 0;\r\n                          j = i ? v : j;\r\n                          a = i ? e : a;\r\n                          i = c[e + 16 >> 2] | 0;\r\n                          if (i) {\r\n                              e = i;\r\n                              V = 90;\r\n                              continue\r\n                          }\r\n                          e = c[e + 20 >> 2] | 0;\r\n                          if (!e) {\r\n                              q = j;\r\n                              p = a;\r\n                              break\r\n                          } else V = 90;\r\n                      }\r\n                      if ((p | 0) != 0 ? q >>> 0 < ((c[28] | 0) - w | 0) >>> 0 : 0) {\r\n                          a = c[30] | 0;\r\n                          if (p >>> 0 >= a >>> 0 ? (H = p + w | 0, p >>> 0 < H >>> 0) : 0) {\r\n                              j = c[p + 24 >> 2] | 0;\r\n                              i = c[p + 12 >> 2] | 0;\r\n                              do if ((i | 0) == (p | 0)) {\r\n                                  h = p + 20 | 0;\r\n                                  i = c[h >> 2] | 0;\r\n                                  if (!i) {\r\n                                      h = p + 16 | 0;\r\n                                      i = c[h >> 2] | 0;\r\n                                      if (!i) {\r\n                                          y = 0;\r\n                                          break\r\n                                      }\r\n                                  }\r\n                                  while (1) {\r\n                                      g = i + 20 | 0;\r\n                                      f = c[g >> 2] | 0;\r\n                                      if (f) {\r\n                                          i = f;\r\n                                          h = g;\r\n                                          continue\r\n                                      }\r\n                                      g = i + 16 | 0;\r\n                                      f = c[g >> 2] | 0;\r\n                                      if (!f) break; else {\r\n                                          i = f;\r\n                                          h = g;\r\n                                      }\r\n                                  }\r\n                                  if (h >>> 0 < a >>> 0) ea(); else {\r\n                                      c[h >> 2] = 0;\r\n                                      y = i;\r\n                                      break\r\n                                  }\r\n                              } else {\r\n                                  h = c[p + 8 >> 2] | 0;\r\n                                  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) {\r\n                                      c[r >> 2] = i;\r\n                                      c[s >> 2] = h;\r\n                                      y = i;\r\n                                      break\r\n                                  }\r\n                                  ea();\r\n                              } while (0);\r\n                              do if (j) {\r\n                                  i = c[p + 28 >> 2] | 0;\r\n                                  h = 408 + (i << 2) | 0;\r\n                                  if ((p | 0) == (c[h >> 2] | 0)) {\r\n                                      c[h >> 2] = y;\r\n                                      if (!y) {\r\n                                          c[27] = c[27] & ~(1 << i);\r\n                                          break\r\n                                      }\r\n                                  } else {\r\n                                      if (j >>> 0 < (c[30] | 0) >>> 0) ea();\r\n                                      h = j + 16 | 0;\r\n                                      if ((c[h >> 2] | 0) == (p | 0)) c[h >> 2] = y; else c[j + 20 >> 2] = y;\r\n                                      if (!y) break\r\n                                  }\r\n                                  i = c[30] | 0;\r\n                                  if (y >>> 0 < i >>> 0) ea();\r\n                                  c[y + 24 >> 2] = j;\r\n                                  h = c[p + 16 >> 2] | 0;\r\n                                  do if (h) if (h >>> 0 < i >>> 0) ea(); else {\r\n                                      c[y + 16 >> 2] = h;\r\n                                      c[h + 24 >> 2] = y;\r\n                                      break\r\n                                  } while (0);\r\n                                  h = c[p + 20 >> 2] | 0;\r\n                                  if (h) if (h >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                      c[y + 20 >> 2] = h;\r\n                                      c[h + 24 >> 2] = y;\r\n                                      break\r\n                                  }\r\n                              } while (0);\r\n                              b:do if (q >>> 0 >= 16) {\r\n                                  c[p + 4 >> 2] = w | 3;\r\n                                  c[p + (w | 4) >> 2] = q | 1;\r\n                                  c[p + (q + w) >> 2] = q;\r\n                                  i = q >>> 3;\r\n                                  if (q >>> 0 < 256) {\r\n                                      g = i << 1;\r\n                                      e = 144 + (g << 2) | 0;\r\n                                      f = c[26] | 0;\r\n                                      h = 1 << i;\r\n                                      if (f & h) {\r\n                                          h = 144 + (g + 2 << 2) | 0;\r\n                                          g = c[h >> 2] | 0;\r\n                                          if (g >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                              z = h;\r\n                                              A = g;\r\n                                          }\r\n                                      } else {\r\n                                          c[26] = f | h;\r\n                                          z = 144 + (g + 2 << 2) | 0;\r\n                                          A = e;\r\n                                      }\r\n                                      c[z >> 2] = H;\r\n                                      c[A + 12 >> 2] = H;\r\n                                      c[p + (w + 8) >> 2] = A;\r\n                                      c[p + (w + 12) >> 2] = e;\r\n                                      break\r\n                                  }\r\n                                  d = q >>> 8;\r\n                                  if (d) if (q >>> 0 > 16777215) i = 31; else {\r\n                                      T = (d + 1048320 | 0) >>> 16 & 8;\r\n                                      U = d << T;\r\n                                      S = (U + 520192 | 0) >>> 16 & 4;\r\n                                      U = U << S;\r\n                                      i = (U + 245760 | 0) >>> 16 & 2;\r\n                                      i = 14 - (S | T | i) + (U << i >>> 15) | 0;\r\n                                      i = q >>> (i + 7 | 0) & 1 | i << 1;\r\n                                  } else i = 0;\r\n                                  h = 408 + (i << 2) | 0;\r\n                                  c[p + (w + 28) >> 2] = i;\r\n                                  c[p + (w + 20) >> 2] = 0;\r\n                                  c[p + (w + 16) >> 2] = 0;\r\n                                  g = c[27] | 0;\r\n                                  f = 1 << i;\r\n                                  if (!(g & f)) {\r\n                                      c[27] = g | f;\r\n                                      c[h >> 2] = H;\r\n                                      c[p + (w + 24) >> 2] = h;\r\n                                      c[p + (w + 12) >> 2] = H;\r\n                                      c[p + (w + 8) >> 2] = H;\r\n                                      break\r\n                                  }\r\n                                  d = c[h >> 2] | 0;\r\n                                  c:do if ((c[d + 4 >> 2] & -8 | 0) != (q | 0)) {\r\n                                      i = q << ((i | 0) == 31 ? 0 : 25 - (i >>> 1) | 0);\r\n                                      while (1) {\r\n                                          b = d + 16 + (i >>> 31 << 2) | 0;\r\n                                          h = c[b >> 2] | 0;\r\n                                          if (!h) break;\r\n                                          if ((c[h + 4 >> 2] & -8 | 0) == (q | 0)) {\r\n                                              C = h;\r\n                                              break c\r\n                                          } else {\r\n                                              i = i << 1;\r\n                                              d = h;\r\n                                          }\r\n                                      }\r\n                                      if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                          c[b >> 2] = H;\r\n                                          c[p + (w + 24) >> 2] = d;\r\n                                          c[p + (w + 12) >> 2] = H;\r\n                                          c[p + (w + 8) >> 2] = H;\r\n                                          break b\r\n                                      }\r\n                                  } else C = d; while (0);\r\n                                  d = C + 8 | 0;\r\n                                  b = c[d >> 2] | 0;\r\n                                  U = c[30] | 0;\r\n                                  if (b >>> 0 >= U >>> 0 & C >>> 0 >= U >>> 0) {\r\n                                      c[b + 12 >> 2] = H;\r\n                                      c[d >> 2] = H;\r\n                                      c[p + (w + 8) >> 2] = b;\r\n                                      c[p + (w + 12) >> 2] = C;\r\n                                      c[p + (w + 24) >> 2] = 0;\r\n                                      break\r\n                                  } else ea();\r\n                              } else {\r\n                                  U = q + w | 0;\r\n                                  c[p + 4 >> 2] = U | 3;\r\n                                  U = p + (U + 4) | 0;\r\n                                  c[U >> 2] = c[U >> 2] | 1;\r\n                              } while (0);\r\n                              g = p + 8 | 0;\r\n                              break\r\n                          }\r\n                          ea();\r\n                      } else {\r\n                          s = w;\r\n                          V = 154;\r\n                      }\r\n                  } else {\r\n                      s = w;\r\n                      V = 154;\r\n                  }\r\n              } else {\r\n                  s = -1;\r\n                  V = 154;\r\n              } while (0);\r\n              d:do if ((V | 0) == 154) {\r\n                  a = c[28] | 0;\r\n                  if (a >>> 0 >= s >>> 0) {\r\n                      b = a - s | 0;\r\n                      d = c[31] | 0;\r\n                      if (b >>> 0 > 15) {\r\n                          c[31] = d + s;\r\n                          c[28] = b;\r\n                          c[d + (s + 4) >> 2] = b | 1;\r\n                          c[d + a >> 2] = b;\r\n                          c[d + 4 >> 2] = s | 3;\r\n                      } else {\r\n                          c[28] = 0;\r\n                          c[31] = 0;\r\n                          c[d + 4 >> 2] = a | 3;\r\n                          V = d + (a + 4) | 0;\r\n                          c[V >> 2] = c[V >> 2] | 1;\r\n                      }\r\n                      g = d + 8 | 0;\r\n                      break\r\n                  }\r\n                  a = c[29] | 0;\r\n                  if (a >>> 0 > s >>> 0) {\r\n                      V = a - s | 0;\r\n                      c[29] = V;\r\n                      g = c[32] | 0;\r\n                      c[32] = g + s;\r\n                      c[g + (s + 4) >> 2] = V | 1;\r\n                      c[g + 4 >> 2] = s | 3;\r\n                      g = g + 8 | 0;\r\n                      break\r\n                  }\r\n                  if (!(c[144] | 0)) Me();\r\n                  m = s + 48 | 0;\r\n                  d = c[146] | 0;\r\n                  l = s + 47 | 0;\r\n                  e = d + l | 0;\r\n                  d = 0 - d | 0;\r\n                  k = e & d;\r\n                  if (k >>> 0 > s >>> 0) {\r\n                      a = c[136] | 0;\r\n                      if ((a | 0) != 0 ? (C = c[134] | 0, H = C + k | 0, H >>> 0 <= C >>> 0 | H >>> 0 > a >>> 0) : 0) {\r\n                          g = 0;\r\n                          break\r\n                      }\r\n                      e:do if (!(c[137] & 4)) {\r\n                          a = c[32] | 0;\r\n                          f:do if (a) {\r\n                              i = 552;\r\n                              while (1) {\r\n                                  j = c[i >> 2] | 0;\r\n                                  if (j >>> 0 <= a >>> 0 ? (x = i + 4 | 0, (j + (c[x >> 2] | 0) | 0) >>> 0 > a >>> 0) : 0) {\r\n                                      g = i;\r\n                                      a = x;\r\n                                      break\r\n                                  }\r\n                                  i = c[i + 8 >> 2] | 0;\r\n                                  if (!i) {\r\n                                      V = 172;\r\n                                      break f\r\n                                  }\r\n                              }\r\n                              j = e - (c[29] | 0) & d;\r\n                              if (j >>> 0 < 2147483647) {\r\n                                  i = ga(j | 0) | 0;\r\n                                  H = (i | 0) == ((c[g >> 2] | 0) + (c[a >> 2] | 0) | 0);\r\n                                  a = H ? j : 0;\r\n                                  if (H) {\r\n                                      if ((i | 0) != (-1 | 0)) {\r\n                                          A = i;\r\n                                          t = a;\r\n                                          V = 192;\r\n                                          break e\r\n                                      }\r\n                                  } else V = 182;\r\n                              } else a = 0;\r\n                          } else V = 172; while (0);\r\n                          do if ((V | 0) == 172) {\r\n                              g = ga(0) | 0;\r\n                              if ((g | 0) != (-1 | 0)) {\r\n                                  a = g;\r\n                                  j = c[145] | 0;\r\n                                  i = j + -1 | 0;\r\n                                  if (!(i & a)) j = k; else j = k - a + (i + a & 0 - j) | 0;\r\n                                  a = c[134] | 0;\r\n                                  i = a + j | 0;\r\n                                  if (j >>> 0 > s >>> 0 & j >>> 0 < 2147483647) {\r\n                                      H = c[136] | 0;\r\n                                      if ((H | 0) != 0 ? i >>> 0 <= a >>> 0 | i >>> 0 > H >>> 0 : 0) {\r\n                                          a = 0;\r\n                                          break\r\n                                      }\r\n                                      i = ga(j | 0) | 0;\r\n                                      V = (i | 0) == (g | 0);\r\n                                      a = V ? j : 0;\r\n                                      if (V) {\r\n                                          A = g;\r\n                                          t = a;\r\n                                          V = 192;\r\n                                          break e\r\n                                      } else V = 182;\r\n                                  } else a = 0;\r\n                              } else a = 0;\r\n                          } while (0);\r\n                          g:do if ((V | 0) == 182) {\r\n                              g = 0 - j | 0;\r\n                              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)) {\r\n                                  ga(g | 0) | 0;\r\n                                  break g\r\n                              } else {\r\n                                  j = B + j | 0;\r\n                                  break\r\n                              } while (0);\r\n                              if ((i | 0) != (-1 | 0)) {\r\n                                  A = i;\r\n                                  t = j;\r\n                                  V = 192;\r\n                                  break e\r\n                              }\r\n                          } while (0);\r\n                          c[137] = c[137] | 4;\r\n                          V = 189;\r\n                      } else {\r\n                          a = 0;\r\n                          V = 189;\r\n                      } while (0);\r\n                      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) {\r\n                          A = D;\r\n                          t = G ? F : a;\r\n                          V = 192;\r\n                      }\r\n                      if ((V | 0) == 192) {\r\n                          j = (c[134] | 0) + t | 0;\r\n                          c[134] = j;\r\n                          if (j >>> 0 > (c[135] | 0) >>> 0) c[135] = j;\r\n                          q = c[32] | 0;\r\n                          h:do if (q) {\r\n                              g = 552;\r\n                              do {\r\n                                  a = c[g >> 2] | 0;\r\n                                  j = g + 4 | 0;\r\n                                  i = c[j >> 2] | 0;\r\n                                  if ((A | 0) == (a + i | 0)) {\r\n                                      I = a;\r\n                                      J = j;\r\n                                      K = i;\r\n                                      L = g;\r\n                                      V = 202;\r\n                                      break\r\n                                  }\r\n                                  g = c[g + 8 >> 2] | 0;\r\n                              } while ((g | 0) != 0);\r\n                              if (((V | 0) == 202 ? (c[L + 12 >> 2] & 8 | 0) == 0 : 0) ? q >>> 0 < A >>> 0 & q >>> 0 >= I >>> 0 : 0) {\r\n                                  c[J >> 2] = K + t;\r\n                                  V = (c[29] | 0) + t | 0;\r\n                                  U = q + 8 | 0;\r\n                                  U = (U & 7 | 0) == 0 ? 0 : 0 - U & 7;\r\n                                  T = V - U | 0;\r\n                                  c[32] = q + U;\r\n                                  c[29] = T;\r\n                                  c[q + (U + 4) >> 2] = T | 1;\r\n                                  c[q + (V + 4) >> 2] = 40;\r\n                                  c[33] = c[148];\r\n                                  break\r\n                              }\r\n                              j = c[30] | 0;\r\n                              if (A >>> 0 < j >>> 0) {\r\n                                  c[30] = A;\r\n                                  j = A;\r\n                              }\r\n                              i = A + t | 0;\r\n                              a = 552;\r\n                              while (1) {\r\n                                  if ((c[a >> 2] | 0) == (i | 0)) {\r\n                                      g = a;\r\n                                      i = a;\r\n                                      V = 210;\r\n                                      break\r\n                                  }\r\n                                  a = c[a + 8 >> 2] | 0;\r\n                                  if (!a) {\r\n                                      i = 552;\r\n                                      break\r\n                                  }\r\n                              }\r\n                              if ((V | 0) == 210) if (!(c[i + 12 >> 2] & 8)) {\r\n                                  c[g >> 2] = A;\r\n                                  o = i + 4 | 0;\r\n                                  c[o >> 2] = (c[o >> 2] | 0) + t;\r\n                                  o = A + 8 | 0;\r\n                                  o = (o & 7 | 0) == 0 ? 0 : 0 - o & 7;\r\n                                  l = A + (t + 8) | 0;\r\n                                  l = (l & 7 | 0) == 0 ? 0 : 0 - l & 7;\r\n                                  i = A + (l + t) | 0;\r\n                                  p = o + s | 0;\r\n                                  n = A + p | 0;\r\n                                  a = i - (A + o) - s | 0;\r\n                                  c[A + (o + 4) >> 2] = s | 3;\r\n                                  i:do if ((i | 0) != (q | 0)) {\r\n                                      if ((i | 0) == (c[31] | 0)) {\r\n                                          V = (c[28] | 0) + a | 0;\r\n                                          c[28] = V;\r\n                                          c[31] = n;\r\n                                          c[A + (p + 4) >> 2] = V | 1;\r\n                                          c[A + (V + p) >> 2] = V;\r\n                                          break\r\n                                      }\r\n                                      b = t + 4 | 0;\r\n                                      h = c[A + (b + l) >> 2] | 0;\r\n                                      if ((h & 3 | 0) == 1) {\r\n                                          k = h & -8;\r\n                                          e = h >>> 3;\r\n                                          j:do if (h >>> 0 >= 256) {\r\n                                              d = c[A + ((l | 24) + t) >> 2] | 0;\r\n                                              g = c[A + (t + 12 + l) >> 2] | 0;\r\n                                              k:do if ((g | 0) == (i | 0)) {\r\n                                                  f = l | 16;\r\n                                                  g = A + (b + f) | 0;\r\n                                                  h = c[g >> 2] | 0;\r\n                                                  if (!h) {\r\n                                                      g = A + (f + t) | 0;\r\n                                                      h = c[g >> 2] | 0;\r\n                                                      if (!h) {\r\n                                                          R = 0;\r\n                                                          break\r\n                                                      }\r\n                                                  }\r\n                                                  while (1) {\r\n                                                      f = h + 20 | 0;\r\n                                                      e = c[f >> 2] | 0;\r\n                                                      if (e) {\r\n                                                          h = e;\r\n                                                          g = f;\r\n                                                          continue\r\n                                                      }\r\n                                                      f = h + 16 | 0;\r\n                                                      e = c[f >> 2] | 0;\r\n                                                      if (!e) break; else {\r\n                                                          h = e;\r\n                                                          g = f;\r\n                                                      }\r\n                                                  }\r\n                                                  if (g >>> 0 < j >>> 0) ea(); else {\r\n                                                      c[g >> 2] = 0;\r\n                                                      R = h;\r\n                                                      break\r\n                                                  }\r\n                                              } else {\r\n                                                  f = c[A + ((l | 8) + t) >> 2] | 0;\r\n                                                  do if (f >>> 0 >= j >>> 0) {\r\n                                                      j = f + 12 | 0;\r\n                                                      if ((c[j >> 2] | 0) != (i | 0)) break;\r\n                                                      h = g + 8 | 0;\r\n                                                      if ((c[h >> 2] | 0) != (i | 0)) break;\r\n                                                      c[j >> 2] = g;\r\n                                                      c[h >> 2] = f;\r\n                                                      R = g;\r\n                                                      break k\r\n                                                  } while (0);\r\n                                                  ea();\r\n                                              } while (0);\r\n                                              if (!d) break;\r\n                                              j = c[A + (t + 28 + l) >> 2] | 0;\r\n                                              h = 408 + (j << 2) | 0;\r\n                                              do if ((i | 0) != (c[h >> 2] | 0)) {\r\n                                                  if (d >>> 0 < (c[30] | 0) >>> 0) ea();\r\n                                                  h = d + 16 | 0;\r\n                                                  if ((c[h >> 2] | 0) == (i | 0)) c[h >> 2] = R; else c[d + 20 >> 2] = R;\r\n                                                  if (!R) break j\r\n                                              } else {\r\n                                                  c[h >> 2] = R;\r\n                                                  if (R) break;\r\n                                                  c[27] = c[27] & ~(1 << j);\r\n                                                  break j\r\n                                              } while (0);\r\n                                              j = c[30] | 0;\r\n                                              if (R >>> 0 < j >>> 0) ea();\r\n                                              c[R + 24 >> 2] = d;\r\n                                              i = l | 16;\r\n                                              h = c[A + (i + t) >> 2] | 0;\r\n                                              do if (h) if (h >>> 0 < j >>> 0) ea(); else {\r\n                                                  c[R + 16 >> 2] = h;\r\n                                                  c[h + 24 >> 2] = R;\r\n                                                  break\r\n                                              } while (0);\r\n                                              i = c[A + (b + i) >> 2] | 0;\r\n                                              if (!i) break;\r\n                                              if (i >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                                  c[R + 20 >> 2] = i;\r\n                                                  c[i + 24 >> 2] = R;\r\n                                                  break\r\n                                              }\r\n                                          } else {\r\n                                              h = c[A + ((l | 8) + t) >> 2] | 0;\r\n                                              g = c[A + (t + 12 + l) >> 2] | 0;\r\n                                              f = 144 + (e << 1 << 2) | 0;\r\n                                              do if ((h | 0) != (f | 0)) {\r\n                                                  if (h >>> 0 >= j >>> 0 ? (c[h + 12 >> 2] | 0) == (i | 0) : 0) break;\r\n                                                  ea();\r\n                                              } while (0);\r\n                                              if ((g | 0) == (h | 0)) {\r\n                                                  c[26] = c[26] & ~(1 << e);\r\n                                                  break\r\n                                              }\r\n                                              do if ((g | 0) == (f | 0)) M = g + 8 | 0; else {\r\n                                                  if (g >>> 0 >= j >>> 0 ? (N = g + 8 | 0, (c[N >> 2] | 0) == (i | 0)) : 0) {\r\n                                                      M = N;\r\n                                                      break\r\n                                                  }\r\n                                                  ea();\r\n                                              } while (0);\r\n                                              c[h + 12 >> 2] = g;\r\n                                              c[M >> 2] = h;\r\n                                          } while (0);\r\n                                          i = A + ((k | l) + t) | 0;\r\n                                          a = k + a | 0;\r\n                                      }\r\n                                      i = i + 4 | 0;\r\n                                      c[i >> 2] = c[i >> 2] & -2;\r\n                                      c[A + (p + 4) >> 2] = a | 1;\r\n                                      c[A + (a + p) >> 2] = a;\r\n                                      i = a >>> 3;\r\n                                      if (a >>> 0 < 256) {\r\n                                          g = i << 1;\r\n                                          e = 144 + (g << 2) | 0;\r\n                                          f = c[26] | 0;\r\n                                          h = 1 << i;\r\n                                          do if (!(f & h)) {\r\n                                              c[26] = f | h;\r\n                                              S = 144 + (g + 2 << 2) | 0;\r\n                                              T = e;\r\n                                          } else {\r\n                                              h = 144 + (g + 2 << 2) | 0;\r\n                                              g = c[h >> 2] | 0;\r\n                                              if (g >>> 0 >= (c[30] | 0) >>> 0) {\r\n                                                  S = h;\r\n                                                  T = g;\r\n                                                  break\r\n                                              }\r\n                                              ea();\r\n                                          } while (0);\r\n                                          c[S >> 2] = n;\r\n                                          c[T + 12 >> 2] = n;\r\n                                          c[A + (p + 8) >> 2] = T;\r\n                                          c[A + (p + 12) >> 2] = e;\r\n                                          break\r\n                                      }\r\n                                      d = a >>> 8;\r\n                                      do if (!d) i = 0; else {\r\n                                          if (a >>> 0 > 16777215) {\r\n                                              i = 31;\r\n                                              break\r\n                                          }\r\n                                          T = (d + 1048320 | 0) >>> 16 & 8;\r\n                                          V = d << T;\r\n                                          S = (V + 520192 | 0) >>> 16 & 4;\r\n                                          V = V << S;\r\n                                          i = (V + 245760 | 0) >>> 16 & 2;\r\n                                          i = 14 - (S | T | i) + (V << i >>> 15) | 0;\r\n                                          i = a >>> (i + 7 | 0) & 1 | i << 1;\r\n                                      } while (0);\r\n                                      h = 408 + (i << 2) | 0;\r\n                                      c[A + (p + 28) >> 2] = i;\r\n                                      c[A + (p + 20) >> 2] = 0;\r\n                                      c[A + (p + 16) >> 2] = 0;\r\n                                      g = c[27] | 0;\r\n                                      f = 1 << i;\r\n                                      if (!(g & f)) {\r\n                                          c[27] = g | f;\r\n                                          c[h >> 2] = n;\r\n                                          c[A + (p + 24) >> 2] = h;\r\n                                          c[A + (p + 12) >> 2] = n;\r\n                                          c[A + (p + 8) >> 2] = n;\r\n                                          break\r\n                                      }\r\n                                      d = c[h >> 2] | 0;\r\n                                      l:do if ((c[d + 4 >> 2] & -8 | 0) != (a | 0)) {\r\n                                          i = a << ((i | 0) == 31 ? 0 : 25 - (i >>> 1) | 0);\r\n                                          while (1) {\r\n                                              b = d + 16 + (i >>> 31 << 2) | 0;\r\n                                              h = c[b >> 2] | 0;\r\n                                              if (!h) break;\r\n                                              if ((c[h + 4 >> 2] & -8 | 0) == (a | 0)) {\r\n                                                  U = h;\r\n                                                  break l\r\n                                              } else {\r\n                                                  i = i << 1;\r\n                                                  d = h;\r\n                                              }\r\n                                          }\r\n                                          if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                              c[b >> 2] = n;\r\n                                              c[A + (p + 24) >> 2] = d;\r\n                                              c[A + (p + 12) >> 2] = n;\r\n                                              c[A + (p + 8) >> 2] = n;\r\n                                              break i\r\n                                          }\r\n                                      } else U = d; while (0);\r\n                                      d = U + 8 | 0;\r\n                                      b = c[d >> 2] | 0;\r\n                                      V = c[30] | 0;\r\n                                      if (b >>> 0 >= V >>> 0 & U >>> 0 >= V >>> 0) {\r\n                                          c[b + 12 >> 2] = n;\r\n                                          c[d >> 2] = n;\r\n                                          c[A + (p + 8) >> 2] = b;\r\n                                          c[A + (p + 12) >> 2] = U;\r\n                                          c[A + (p + 24) >> 2] = 0;\r\n                                          break\r\n                                      } else ea();\r\n                                  } else {\r\n                                      V = (c[29] | 0) + a | 0;\r\n                                      c[29] = V;\r\n                                      c[32] = n;\r\n                                      c[A + (p + 4) >> 2] = V | 1;\r\n                                  } while (0);\r\n                                  g = A + (o | 8) | 0;\r\n                                  break d\r\n                              } else i = 552;\r\n                              while (1) {\r\n                                  g = c[i >> 2] | 0;\r\n                                  if (g >>> 0 <= q >>> 0 ? (h = c[i + 4 >> 2] | 0, f = g + h | 0, f >>> 0 > q >>> 0) : 0) break;\r\n                                  i = c[i + 8 >> 2] | 0;\r\n                              }\r\n                              i = g + (h + -39) | 0;\r\n                              i = g + (h + -47 + ((i & 7 | 0) == 0 ? 0 : 0 - i & 7)) | 0;\r\n                              j = q + 16 | 0;\r\n                              i = i >>> 0 < j >>> 0 ? q : i;\r\n                              h = i + 8 | 0;\r\n                              g = A + 8 | 0;\r\n                              g = (g & 7 | 0) == 0 ? 0 : 0 - g & 7;\r\n                              V = t + -40 - g | 0;\r\n                              c[32] = A + g;\r\n                              c[29] = V;\r\n                              c[A + (g + 4) >> 2] = V | 1;\r\n                              c[A + (t + -36) >> 2] = 40;\r\n                              c[33] = c[148];\r\n                              g = i + 4 | 0;\r\n                              c[g >> 2] = 27;\r\n                              c[h >> 2] = c[138];\r\n                              c[h + 4 >> 2] = c[139];\r\n                              c[h + 8 >> 2] = c[140];\r\n                              c[h + 12 >> 2] = c[141];\r\n                              c[138] = A;\r\n                              c[139] = t;\r\n                              c[141] = 0;\r\n                              c[140] = h;\r\n                              h = i + 28 | 0;\r\n                              c[h >> 2] = 7;\r\n                              if ((i + 32 | 0) >>> 0 < f >>> 0) do {\r\n                                  V = h;\r\n                                  h = h + 4 | 0;\r\n                                  c[h >> 2] = 7;\r\n                              } while ((V + 8 | 0) >>> 0 < f >>> 0);\r\n                              if ((i | 0) != (q | 0)) {\r\n                                  a = i - q | 0;\r\n                                  c[g >> 2] = c[g >> 2] & -2;\r\n                                  c[q + 4 >> 2] = a | 1;\r\n                                  c[i >> 2] = a;\r\n                                  f = a >>> 3;\r\n                                  if (a >>> 0 < 256) {\r\n                                      h = f << 1;\r\n                                      i = 144 + (h << 2) | 0;\r\n                                      g = c[26] | 0;\r\n                                      e = 1 << f;\r\n                                      if (g & e) {\r\n                                          d = 144 + (h + 2 << 2) | 0;\r\n                                          b = c[d >> 2] | 0;\r\n                                          if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                              O = d;\r\n                                              P = b;\r\n                                          }\r\n                                      } else {\r\n                                          c[26] = g | e;\r\n                                          O = 144 + (h + 2 << 2) | 0;\r\n                                          P = i;\r\n                                      }\r\n                                      c[O >> 2] = q;\r\n                                      c[P + 12 >> 2] = q;\r\n                                      c[q + 8 >> 2] = P;\r\n                                      c[q + 12 >> 2] = i;\r\n                                      break\r\n                                  }\r\n                                  d = a >>> 8;\r\n                                  if (d) if (a >>> 0 > 16777215) h = 31; else {\r\n                                      U = (d + 1048320 | 0) >>> 16 & 8;\r\n                                      V = d << U;\r\n                                      T = (V + 520192 | 0) >>> 16 & 4;\r\n                                      V = V << T;\r\n                                      h = (V + 245760 | 0) >>> 16 & 2;\r\n                                      h = 14 - (T | U | h) + (V << h >>> 15) | 0;\r\n                                      h = a >>> (h + 7 | 0) & 1 | h << 1;\r\n                                  } else h = 0;\r\n                                  e = 408 + (h << 2) | 0;\r\n                                  c[q + 28 >> 2] = h;\r\n                                  c[q + 20 >> 2] = 0;\r\n                                  c[j >> 2] = 0;\r\n                                  d = c[27] | 0;\r\n                                  b = 1 << h;\r\n                                  if (!(d & b)) {\r\n                                      c[27] = d | b;\r\n                                      c[e >> 2] = q;\r\n                                      c[q + 24 >> 2] = e;\r\n                                      c[q + 12 >> 2] = q;\r\n                                      c[q + 8 >> 2] = q;\r\n                                      break\r\n                                  }\r\n                                  d = c[e >> 2] | 0;\r\n                                  m:do if ((c[d + 4 >> 2] & -8 | 0) != (a | 0)) {\r\n                                      h = a << ((h | 0) == 31 ? 0 : 25 - (h >>> 1) | 0);\r\n                                      while (1) {\r\n                                          b = d + 16 + (h >>> 31 << 2) | 0;\r\n                                          e = c[b >> 2] | 0;\r\n                                          if (!e) break;\r\n                                          if ((c[e + 4 >> 2] & -8 | 0) == (a | 0)) {\r\n                                              Q = e;\r\n                                              break m\r\n                                          } else {\r\n                                              h = h << 1;\r\n                                              d = e;\r\n                                          }\r\n                                      }\r\n                                      if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                          c[b >> 2] = q;\r\n                                          c[q + 24 >> 2] = d;\r\n                                          c[q + 12 >> 2] = q;\r\n                                          c[q + 8 >> 2] = q;\r\n                                          break h\r\n                                      }\r\n                                  } else Q = d; while (0);\r\n                                  d = Q + 8 | 0;\r\n                                  b = c[d >> 2] | 0;\r\n                                  V = c[30] | 0;\r\n                                  if (b >>> 0 >= V >>> 0 & Q >>> 0 >= V >>> 0) {\r\n                                      c[b + 12 >> 2] = q;\r\n                                      c[d >> 2] = q;\r\n                                      c[q + 8 >> 2] = b;\r\n                                      c[q + 12 >> 2] = Q;\r\n                                      c[q + 24 >> 2] = 0;\r\n                                      break\r\n                                  } else ea();\r\n                              }\r\n                          } else {\r\n                              V = c[30] | 0;\r\n                              if ((V | 0) == 0 | A >>> 0 < V >>> 0) c[30] = A;\r\n                              c[138] = A;\r\n                              c[139] = t;\r\n                              c[141] = 0;\r\n                              c[35] = c[144];\r\n                              c[34] = -1;\r\n                              d = 0;\r\n                              do {\r\n                                  V = d << 1;\r\n                                  U = 144 + (V << 2) | 0;\r\n                                  c[144 + (V + 3 << 2) >> 2] = U;\r\n                                  c[144 + (V + 2 << 2) >> 2] = U;\r\n                                  d = d + 1 | 0;\r\n                              } while ((d | 0) != 32);\r\n                              V = A + 8 | 0;\r\n                              V = (V & 7 | 0) == 0 ? 0 : 0 - V & 7;\r\n                              U = t + -40 - V | 0;\r\n                              c[32] = A + V;\r\n                              c[29] = U;\r\n                              c[A + (V + 4) >> 2] = U | 1;\r\n                              c[A + (t + -36) >> 2] = 40;\r\n                              c[33] = c[148];\r\n                          } while (0);\r\n                          b = c[29] | 0;\r\n                          if (b >>> 0 > s >>> 0) {\r\n                              V = b - s | 0;\r\n                              c[29] = V;\r\n                              g = c[32] | 0;\r\n                              c[32] = g + s;\r\n                              c[g + (s + 4) >> 2] = V | 1;\r\n                              c[g + 4 >> 2] = s | 3;\r\n                              g = g + 8 | 0;\r\n                              break\r\n                          }\r\n                      }\r\n                      c[(Le() | 0) >> 2] = 12;\r\n                      g = 0;\r\n                  } else g = 0;\r\n              } while (0);\r\n              return g | 0\r\n          }\r\n\r\n          function Ke(a) {\r\n              a = a | 0;\r\n              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\n                  r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0;\r\n              a:do if (a) {\r\n                  f = a + -8 | 0;\r\n                  k = c[30] | 0;\r\n                  b:do if (f >>> 0 >= k >>> 0 ? (e = c[a + -4 >> 2] | 0, d = e & 3, (d | 0) != 1) : 0) {\r\n                      v = e & -8;\r\n                      w = a + (v + -8) | 0;\r\n                      do if (!(e & 1)) {\r\n                          f = c[f >> 2] | 0;\r\n                          if (!d) break a;\r\n                          l = -8 - f | 0;\r\n                          n = a + l | 0;\r\n                          o = f + v | 0;\r\n                          if (n >>> 0 < k >>> 0) break b;\r\n                          if ((n | 0) == (c[31] | 0)) {\r\n                              g = a + (v + -4) | 0;\r\n                              f = c[g >> 2] | 0;\r\n                              if ((f & 3 | 0) != 3) {\r\n                                  B = n;\r\n                                  g = o;\r\n                                  break\r\n                              }\r\n                              c[28] = o;\r\n                              c[g >> 2] = f & -2;\r\n                              c[a + (l + 4) >> 2] = o | 1;\r\n                              c[w >> 2] = o;\r\n                              break a\r\n                          }\r\n                          d = f >>> 3;\r\n                          if (f >>> 0 < 256) {\r\n                              e = c[a + (l + 8) >> 2] | 0;\r\n                              g = c[a + (l + 12) >> 2] | 0;\r\n                              f = 144 + (d << 1 << 2) | 0;\r\n                              do if ((e | 0) != (f | 0)) {\r\n                                  if (e >>> 0 >= k >>> 0 ? (c[e + 12 >> 2] | 0) == (n | 0) : 0) break;\r\n                                  ea();\r\n                              } while (0);\r\n                              if ((g | 0) == (e | 0)) {\r\n                                  c[26] = c[26] & ~(1 << d);\r\n                                  B = n;\r\n                                  g = o;\r\n                                  break\r\n                              }\r\n                              do if ((g | 0) == (f | 0)) b = g + 8 | 0; else {\r\n                                  if (g >>> 0 >= k >>> 0 ? (h = g + 8 | 0, (c[h >> 2] | 0) == (n | 0)) : 0) {\r\n                                      b = h;\r\n                                      break\r\n                                  }\r\n                                  ea();\r\n                              } while (0);\r\n                              c[e + 12 >> 2] = g;\r\n                              c[b >> 2] = e;\r\n                              B = n;\r\n                              g = o;\r\n                              break\r\n                          }\r\n                          h = c[a + (l + 24) >> 2] | 0;\r\n                          f = c[a + (l + 12) >> 2] | 0;\r\n                          do if ((f | 0) == (n | 0)) {\r\n                              e = a + (l + 20) | 0;\r\n                              f = c[e >> 2] | 0;\r\n                              if (!f) {\r\n                                  e = a + (l + 16) | 0;\r\n                                  f = c[e >> 2] | 0;\r\n                                  if (!f) {\r\n                                      m = 0;\r\n                                      break\r\n                                  }\r\n                              }\r\n                              while (1) {\r\n                                  d = f + 20 | 0;\r\n                                  b = c[d >> 2] | 0;\r\n                                  if (b) {\r\n                                      f = b;\r\n                                      e = d;\r\n                                      continue\r\n                                  }\r\n                                  d = f + 16 | 0;\r\n                                  b = c[d >> 2] | 0;\r\n                                  if (!b) break; else {\r\n                                      f = b;\r\n                                      e = d;\r\n                                  }\r\n                              }\r\n                              if (e >>> 0 < k >>> 0) ea(); else {\r\n                                  c[e >> 2] = 0;\r\n                                  m = f;\r\n                                  break\r\n                              }\r\n                          } else {\r\n                              e = c[a + (l + 8) >> 2] | 0;\r\n                              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) {\r\n                                  c[i >> 2] = f;\r\n                                  c[j >> 2] = e;\r\n                                  m = f;\r\n                                  break\r\n                              }\r\n                              ea();\r\n                          } while (0);\r\n                          if (h) {\r\n                              f = c[a + (l + 28) >> 2] | 0;\r\n                              e = 408 + (f << 2) | 0;\r\n                              if ((n | 0) == (c[e >> 2] | 0)) {\r\n                                  c[e >> 2] = m;\r\n                                  if (!m) {\r\n                                      c[27] = c[27] & ~(1 << f);\r\n                                      B = n;\r\n                                      g = o;\r\n                                      break\r\n                                  }\r\n                              } else {\r\n                                  if (h >>> 0 < (c[30] | 0) >>> 0) ea();\r\n                                  f = h + 16 | 0;\r\n                                  if ((c[f >> 2] | 0) == (n | 0)) c[f >> 2] = m; else c[h + 20 >> 2] = m;\r\n                                  if (!m) {\r\n                                      B = n;\r\n                                      g = o;\r\n                                      break\r\n                                  }\r\n                              }\r\n                              e = c[30] | 0;\r\n                              if (m >>> 0 < e >>> 0) ea();\r\n                              c[m + 24 >> 2] = h;\r\n                              f = c[a + (l + 16) >> 2] | 0;\r\n                              do if (f) if (f >>> 0 < e >>> 0) ea(); else {\r\n                                  c[m + 16 >> 2] = f;\r\n                                  c[f + 24 >> 2] = m;\r\n                                  break\r\n                              } while (0);\r\n                              f = c[a + (l + 20) >> 2] | 0;\r\n                              if (f) if (f >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                  c[m + 20 >> 2] = f;\r\n                                  c[f + 24 >> 2] = m;\r\n                                  B = n;\r\n                                  g = o;\r\n                                  break\r\n                              } else {\r\n                                  B = n;\r\n                                  g = o;\r\n                              }\r\n                          } else {\r\n                              B = n;\r\n                              g = o;\r\n                          }\r\n                      } else {\r\n                          B = f;\r\n                          g = v;\r\n                      } while (0);\r\n                      if (B >>> 0 < w >>> 0 ? (p = a + (v + -4) | 0, q = c[p >> 2] | 0, (q & 1 | 0) != 0) : 0) {\r\n                          if (!(q & 2)) {\r\n                              if ((w | 0) == (c[32] | 0)) {\r\n                                  A = (c[29] | 0) + g | 0;\r\n                                  c[29] = A;\r\n                                  c[32] = B;\r\n                                  c[B + 4 >> 2] = A | 1;\r\n                                  if ((B | 0) != (c[31] | 0)) break a;\r\n                                  c[31] = 0;\r\n                                  c[28] = 0;\r\n                                  break a\r\n                              }\r\n                              if ((w | 0) == (c[31] | 0)) {\r\n                                  A = (c[28] | 0) + g | 0;\r\n                                  c[28] = A;\r\n                                  c[31] = B;\r\n                                  c[B + 4 >> 2] = A | 1;\r\n                                  c[B + A >> 2] = A;\r\n                                  break a\r\n                              }\r\n                              j = (q & -8) + g | 0;\r\n                              d = q >>> 3;\r\n                              do if (q >>> 0 >= 256) {\r\n                                  b = c[a + (v + 16) >> 2] | 0;\r\n                                  g = c[a + (v | 4) >> 2] | 0;\r\n                                  do if ((g | 0) == (w | 0)) {\r\n                                      f = a + (v + 12) | 0;\r\n                                      g = c[f >> 2] | 0;\r\n                                      if (!g) {\r\n                                          f = a + (v + 8) | 0;\r\n                                          g = c[f >> 2] | 0;\r\n                                          if (!g) {\r\n                                              x = 0;\r\n                                              break\r\n                                          }\r\n                                      }\r\n                                      while (1) {\r\n                                          e = g + 20 | 0;\r\n                                          d = c[e >> 2] | 0;\r\n                                          if (d) {\r\n                                              g = d;\r\n                                              f = e;\r\n                                              continue\r\n                                          }\r\n                                          e = g + 16 | 0;\r\n                                          d = c[e >> 2] | 0;\r\n                                          if (!d) break; else {\r\n                                              g = d;\r\n                                              f = e;\r\n                                          }\r\n                                      }\r\n                                      if (f >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                          c[f >> 2] = 0;\r\n                                          x = g;\r\n                                          break\r\n                                      }\r\n                                  } else {\r\n                                      f = c[a + v >> 2] | 0;\r\n                                      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) {\r\n                                          c[t >> 2] = g;\r\n                                          c[u >> 2] = f;\r\n                                          x = g;\r\n                                          break\r\n                                      }\r\n                                      ea();\r\n                                  } while (0);\r\n                                  if (b) {\r\n                                      g = c[a + (v + 20) >> 2] | 0;\r\n                                      f = 408 + (g << 2) | 0;\r\n                                      if ((w | 0) == (c[f >> 2] | 0)) {\r\n                                          c[f >> 2] = x;\r\n                                          if (!x) {\r\n                                              c[27] = c[27] & ~(1 << g);\r\n                                              break\r\n                                          }\r\n                                      } else {\r\n                                          if (b >>> 0 < (c[30] | 0) >>> 0) ea();\r\n                                          g = b + 16 | 0;\r\n                                          if ((c[g >> 2] | 0) == (w | 0)) c[g >> 2] = x; else c[b + 20 >> 2] = x;\r\n                                          if (!x) break\r\n                                      }\r\n                                      g = c[30] | 0;\r\n                                      if (x >>> 0 < g >>> 0) ea();\r\n                                      c[x + 24 >> 2] = b;\r\n                                      f = c[a + (v + 8) >> 2] | 0;\r\n                                      do if (f) if (f >>> 0 < g >>> 0) ea(); else {\r\n                                          c[x + 16 >> 2] = f;\r\n                                          c[f + 24 >> 2] = x;\r\n                                          break\r\n                                      } while (0);\r\n                                      d = c[a + (v + 12) >> 2] | 0;\r\n                                      if (d) if (d >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                          c[x + 20 >> 2] = d;\r\n                                          c[d + 24 >> 2] = x;\r\n                                          break\r\n                                      }\r\n                                  }\r\n                              } else {\r\n                                  e = c[a + v >> 2] | 0;\r\n                                  g = c[a + (v | 4) >> 2] | 0;\r\n                                  f = 144 + (d << 1 << 2) | 0;\r\n                                  do if ((e | 0) != (f | 0)) {\r\n                                      if (e >>> 0 >= (c[30] | 0) >>> 0 ? (c[e + 12 >> 2] | 0) == (w | 0) : 0) break;\r\n                                      ea();\r\n                                  } while (0);\r\n                                  if ((g | 0) == (e | 0)) {\r\n                                      c[26] = c[26] & ~(1 << d);\r\n                                      break\r\n                                  }\r\n                                  do if ((g | 0) == (f | 0)) r = g + 8 | 0; else {\r\n                                      if (g >>> 0 >= (c[30] | 0) >>> 0 ? (s = g + 8 | 0, (c[s >> 2] | 0) == (w | 0)) : 0) {\r\n                                          r = s;\r\n                                          break\r\n                                      }\r\n                                      ea();\r\n                                  } while (0);\r\n                                  c[e + 12 >> 2] = g;\r\n                                  c[r >> 2] = e;\r\n                              } while (0);\r\n                              c[B + 4 >> 2] = j | 1;\r\n                              c[B + j >> 2] = j;\r\n                              if ((B | 0) == (c[31] | 0)) {\r\n                                  c[28] = j;\r\n                                  break a\r\n                              } else g = j;\r\n                          } else {\r\n                              c[p >> 2] = q & -2;\r\n                              c[B + 4 >> 2] = g | 1;\r\n                              c[B + g >> 2] = g;\r\n                          }\r\n                          f = g >>> 3;\r\n                          if (g >>> 0 < 256) {\r\n                              e = f << 1;\r\n                              g = 144 + (e << 2) | 0;\r\n                              b = c[26] | 0;\r\n                              d = 1 << f;\r\n                              if (b & d) {\r\n                                  d = 144 + (e + 2 << 2) | 0;\r\n                                  b = c[d >> 2] | 0;\r\n                                  if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                      y = d;\r\n                                      z = b;\r\n                                  }\r\n                              } else {\r\n                                  c[26] = b | d;\r\n                                  y = 144 + (e + 2 << 2) | 0;\r\n                                  z = g;\r\n                              }\r\n                              c[y >> 2] = B;\r\n                              c[z + 12 >> 2] = B;\r\n                              c[B + 8 >> 2] = z;\r\n                              c[B + 12 >> 2] = g;\r\n                              break a\r\n                          }\r\n                          b = g >>> 8;\r\n                          if (b) if (g >>> 0 > 16777215) f = 31; else {\r\n                              y = (b + 1048320 | 0) >>> 16 & 8;\r\n                              z = b << y;\r\n                              a = (z + 520192 | 0) >>> 16 & 4;\r\n                              z = z << a;\r\n                              f = (z + 245760 | 0) >>> 16 & 2;\r\n                              f = 14 - (a | y | f) + (z << f >>> 15) | 0;\r\n                              f = g >>> (f + 7 | 0) & 1 | f << 1;\r\n                          } else f = 0;\r\n                          d = 408 + (f << 2) | 0;\r\n                          c[B + 28 >> 2] = f;\r\n                          c[B + 20 >> 2] = 0;\r\n                          c[B + 16 >> 2] = 0;\r\n                          b = c[27] | 0;\r\n                          e = 1 << f;\r\n                          c:do if (b & e) {\r\n                              d = c[d >> 2] | 0;\r\n                              d:do if ((c[d + 4 >> 2] & -8 | 0) != (g | 0)) {\r\n                                  f = g << ((f | 0) == 31 ? 0 : 25 - (f >>> 1) | 0);\r\n                                  while (1) {\r\n                                      b = d + 16 + (f >>> 31 << 2) | 0;\r\n                                      e = c[b >> 2] | 0;\r\n                                      if (!e) break;\r\n                                      if ((c[e + 4 >> 2] & -8 | 0) == (g | 0)) {\r\n                                          A = e;\r\n                                          break d\r\n                                      } else {\r\n                                          f = f << 1;\r\n                                          d = e;\r\n                                      }\r\n                                  }\r\n                                  if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else {\r\n                                      c[b >> 2] = B;\r\n                                      c[B + 24 >> 2] = d;\r\n                                      c[B + 12 >> 2] = B;\r\n                                      c[B + 8 >> 2] = B;\r\n                                      break c\r\n                                  }\r\n                              } else A = d; while (0);\r\n                              b = A + 8 | 0;\r\n                              d = c[b >> 2] | 0;\r\n                              z = c[30] | 0;\r\n                              if (d >>> 0 >= z >>> 0 & A >>> 0 >= z >>> 0) {\r\n                                  c[d + 12 >> 2] = B;\r\n                                  c[b >> 2] = B;\r\n                                  c[B + 8 >> 2] = d;\r\n                                  c[B + 12 >> 2] = A;\r\n                                  c[B + 24 >> 2] = 0;\r\n                                  break\r\n                              } else ea();\r\n                          } else {\r\n                              c[27] = b | e;\r\n                              c[d >> 2] = B;\r\n                              c[B + 24 >> 2] = d;\r\n                              c[B + 12 >> 2] = B;\r\n                              c[B + 8 >> 2] = B;\r\n                          } while (0);\r\n                          B = (c[34] | 0) + -1 | 0;\r\n                          c[34] = B;\r\n                          if (!B) b = 560; else break a;\r\n                          while (1) {\r\n                              b = c[b >> 2] | 0;\r\n                              if (!b) break; else b = b + 8 | 0;\r\n                          }\r\n                          c[34] = -1;\r\n                          break a\r\n                      }\r\n                  } while (0);\r\n                  ea();\r\n              } while (0);\r\n              return\r\n          }\r\n\r\n          function Le() {\r\n              var a = 0;\r\n              if (!0) a = 600;\r\n              return a | 0\r\n          }\r\n\r\n          function Me() {\r\n              var a = 0;\r\n              do if (!(c[144] | 0)) {\r\n                  a = ca(30) | 0;\r\n                  if (!(a + -1 & a)) {\r\n                      c[146] = a;\r\n                      c[145] = a;\r\n                      c[147] = -1;\r\n                      c[148] = -1;\r\n                      c[149] = 0;\r\n                      c[137] = 0;\r\n                      c[144] = (ha(0) | 0) & -16 ^ 1431655768;\r\n                      break\r\n                  } else ea();\r\n              } while (0);\r\n              return\r\n          }\r\n\r\n          function Ne() {\r\n          }\r\n\r\n          function Oe(b, d, e) {\r\n              b = b | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0;\r\n              if ((e | 0) >= 4096) return ja(b | 0, d | 0, e | 0) | 0;\r\n              f = b | 0;\r\n              if ((b & 3) == (d & 3)) {\r\n                  while (b & 3) {\r\n                      if (!e) return f | 0;\r\n                      a[b >> 0] = a[d >> 0] | 0;\r\n                      b = b + 1 | 0;\r\n                      d = d + 1 | 0;\r\n                      e = e - 1 | 0;\r\n                  }\r\n                  while ((e | 0) >= 4) {\r\n                      c[b >> 2] = c[d >> 2];\r\n                      b = b + 4 | 0;\r\n                      d = d + 4 | 0;\r\n                      e = e - 4 | 0;\r\n                  }\r\n              }\r\n              while ((e | 0) > 0) {\r\n                  a[b >> 0] = a[d >> 0] | 0;\r\n                  b = b + 1 | 0;\r\n                  d = d + 1 | 0;\r\n                  e = e - 1 | 0;\r\n              }\r\n              return f | 0\r\n          }\r\n\r\n          function Pe(b, c, d) {\r\n              b = b | 0;\r\n              c = c | 0;\r\n              d = d | 0;\r\n              var e = 0;\r\n              if ((c | 0) < (b | 0) & (b | 0) < (c + d | 0)) {\r\n                  e = b;\r\n                  c = c + d | 0;\r\n                  b = b + d | 0;\r\n                  while ((d | 0) > 0) {\r\n                      b = b - 1 | 0;\r\n                      c = c - 1 | 0;\r\n                      d = d - 1 | 0;\r\n                      a[b >> 0] = a[c >> 0] | 0;\r\n                  }\r\n                  b = e;\r\n              } else Oe(b, c, d) | 0;\r\n              return b | 0\r\n          }\r\n\r\n          function Qe(b, d, e) {\r\n              b = b | 0;\r\n              d = d | 0;\r\n              e = e | 0;\r\n              var f = 0, g = 0, h = 0, i = 0;\r\n              f = b + e | 0;\r\n              if ((e | 0) >= 20) {\r\n                  d = d & 255;\r\n                  h = b & 3;\r\n                  i = d | d << 8 | d << 16 | d << 24;\r\n                  g = f & ~3;\r\n                  if (h) {\r\n                      h = b + 4 - h | 0;\r\n                      while ((b | 0) < (h | 0)) {\r\n                          a[b >> 0] = d;\r\n                          b = b + 1 | 0;\r\n                      }\r\n                  }\r\n                  while ((b | 0) < (g | 0)) {\r\n                      c[b >> 2] = i;\r\n                      b = b + 4 | 0;\r\n                  }\r\n              }\r\n              while ((b | 0) < (f | 0)) {\r\n                  a[b >> 0] = d;\r\n                  b = b + 1 | 0;\r\n              }\r\n              return b - e | 0\r\n          }\r\n\r\n  // EMSCRIPTEN_END_FUNCS\r\n          return {\r\n              _free: Ke,\r\n              ___errno_location: Le,\r\n              _memmove: Pe,\r\n              _Decoder_Interface_Decode: xa,\r\n              _Decoder_Interface_exit: wa,\r\n              _Encoder_Interface_init: ya,\r\n              _memset: Qe,\r\n              _malloc: Je,\r\n              _memcpy: Oe,\r\n              _Encoder_Interface_exit: za,\r\n              _Decoder_Interface_init: va,\r\n              _Encoder_Interface_Encode: Aa,\r\n              runPostSets: Ne,\r\n              stackAlloc: ma,\r\n              stackSave: na,\r\n              stackRestore: oa,\r\n              establishStackSpace: pa,\r\n              setThrew: qa,\r\n              setTempRet0: ta,\r\n              getTempRet0: ua\r\n          }\r\n      })\r\n\r\n\r\n      // EMSCRIPTEN_END_ASM\r\n      (Module.asmGlobalArg, Module.asmLibraryArg, buffer);\r\n      Module[\"_Encoder_Interface_Encode\"] = asm[\"_Encoder_Interface_Encode\"];\r\n      var _free = Module[\"_free\"] = asm[\"_free\"];\r\n      Module[\"runPostSets\"] = asm[\"runPostSets\"];\r\n      var _memmove = Module[\"_memmove\"] = asm[\"_memmove\"];\r\n      Module[\"_Decoder_Interface_exit\"] = asm[\"_Decoder_Interface_exit\"];\r\n      Module[\"_Encoder_Interface_init\"] = asm[\"_Encoder_Interface_init\"];\r\n      var _memset = Module[\"_memset\"] = asm[\"_memset\"];\r\n      var _malloc = Module[\"_malloc\"] = asm[\"_malloc\"];\r\n      var _memcpy = Module[\"_memcpy\"] = asm[\"_memcpy\"];\r\n      Module[\"_Decoder_Interface_Decode\"] = asm[\"_Decoder_Interface_Decode\"];\r\n      Module[\"_Decoder_Interface_init\"] = asm[\"_Decoder_Interface_init\"];\r\n      Module[\"_Encoder_Interface_exit\"] = asm[\"_Encoder_Interface_exit\"];\r\n      Module[\"___errno_location\"] = asm[\"___errno_location\"];\r\n      Runtime.stackAlloc = asm[\"stackAlloc\"];\r\n      Runtime.stackSave = asm[\"stackSave\"];\r\n      Runtime.stackRestore = asm[\"stackRestore\"];\r\n      Runtime.establishStackSpace = asm[\"establishStackSpace\"];\r\n      Runtime.setTempRet0 = asm[\"setTempRet0\"];\r\n      Runtime.getTempRet0 = asm[\"getTempRet0\"];\r\n\r\n      function ExitStatus(status) {\r\n          this.name = \"ExitStatus\";\r\n          this.message = \"Program terminated with exit(\" + status + \")\";\r\n          this.status = status;\r\n      }\r\n\r\n      ExitStatus.prototype = new Error;\r\n      ExitStatus.prototype.constructor = ExitStatus;\r\n      var initialStackTop;\r\n      dependenciesFulfilled = function runCaller() {\r\n          if (!Module[\"calledRun\"]) run();\r\n          if (!Module[\"calledRun\"]) dependenciesFulfilled = runCaller;\r\n      };\r\n      Module[\"callMain\"] = Module.callMain = function callMain(args) {\r\n          assert(runDependencies == 0, \"cannot call main when async dependencies remain! (listen on __ATMAIN__)\");\r\n          assert(__ATPRERUN__.length == 0, \"cannot call main when preRun functions remain to be called\");\r\n          args = args || [];\r\n          ensureInitRuntime();\r\n          var argc = args.length + 1;\r\n\r\n          function pad() {\r\n              for (var i = 0; i < 4 - 1; i++) {\r\n                  argv.push(0);\r\n              }\r\n          }\r\n\r\n          var argv = [allocate(intArrayFromString(Module[\"thisProgram\"]), \"i8\", ALLOC_NORMAL)];\r\n          pad();\r\n          for (var i = 0; i < argc - 1; i = i + 1) {\r\n              argv.push(allocate(intArrayFromString(args[i]), \"i8\", ALLOC_NORMAL));\r\n              pad();\r\n          }\r\n          argv.push(0);\r\n          argv = allocate(argv, \"i32\", ALLOC_NORMAL);\r\n          initialStackTop = Runtime.stackSave();\r\n          try {\r\n              var ret = Module[\"_main\"](argc, argv, 0);\r\n              exit(ret, true);\r\n          } catch (e) {\r\n              if (e instanceof ExitStatus) {\r\n                  return\r\n              } else if (e == \"SimulateInfiniteLoop\") {\r\n                  Module[\"noExitRuntime\"] = true;\r\n                  Runtime.stackRestore(initialStackTop);\r\n                  return\r\n              } else {\r\n                  if (e && typeof e === \"object\" && e.stack) Module.printErr(\"exception thrown: \" + [e, e.stack]);\r\n                  throw e\r\n              }\r\n          } finally {\r\n          }\r\n      };\r\n\r\n      function run(args) {\r\n          args = args || Module[\"arguments\"];\r\n          if (runDependencies > 0) {\r\n              return\r\n          }\r\n          preRun();\r\n          if (runDependencies > 0) return;\r\n          if (Module[\"calledRun\"]) return;\r\n\r\n          function doRun() {\r\n              if (Module[\"calledRun\"]) return;\r\n              Module[\"calledRun\"] = true;\r\n              if (ABORT) return;\r\n              ensureInitRuntime();\r\n              preMain();\r\n              if (Module[\"onRuntimeInitialized\"]) Module[\"onRuntimeInitialized\"]();\r\n              if (Module[\"_main\"] && shouldRunNow) Module[\"callMain\"](args);\r\n              postRun();\r\n          }\r\n\r\n          if (Module[\"setStatus\"]) {\r\n              Module[\"setStatus\"](\"Running...\");\r\n              setTimeout((function () {\r\n                  setTimeout((function () {\r\n                      Module[\"setStatus\"](\"\");\r\n                  }), 1);\r\n                  doRun();\r\n              }), 1);\r\n          } else {\r\n              doRun();\r\n          }\r\n      }\r\n\r\n      Module[\"run\"] = Module.run = run;\r\n\r\n      function exit(status, implicit) {\r\n          if (implicit && Module[\"noExitRuntime\"]) {\r\n              return\r\n          }\r\n          if (Module[\"noExitRuntime\"]) ; else {\r\n              ABORT = true;\r\n              STACKTOP = initialStackTop;\r\n              exitRuntime();\r\n              if (Module[\"onExit\"]) Module[\"onExit\"](status);\r\n          }\r\n          if (ENVIRONMENT_IS_SHELL && typeof quit === \"function\") {\r\n              quit(status);\r\n          }\r\n          throw new ExitStatus(status)\r\n      }\r\n\r\n      Module[\"exit\"] = Module.exit = exit;\r\n      var abortDecorators = [];\r\n\r\n      function abort(what) {\r\n          if (what !== undefined) {\r\n              Module.print(what);\r\n              Module.printErr(what);\r\n              what = JSON.stringify(what);\r\n          } else {\r\n              what = \"\";\r\n          }\r\n          ABORT = true;\r\n          var extra = \"\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\";\r\n          var output = \"abort(\" + what + \") at \" + stackTrace() + extra;\r\n          if (abortDecorators) {\r\n              abortDecorators.forEach((function (decorator) {\r\n                  output = decorator(output, what);\r\n              }));\r\n          }\r\n          throw output\r\n      }\r\n\r\n      Module[\"abort\"] = Module.abort = abort;\r\n      if (Module[\"preInit\"]) {\r\n          if (typeof Module[\"preInit\"] == \"function\") Module[\"preInit\"] = [Module[\"preInit\"]];\r\n          while (Module[\"preInit\"].length > 0) {\r\n              Module[\"preInit\"].pop()();\r\n          }\r\n      }\r\n      var shouldRunNow = true;\r\n      if (Module[\"noInitialRun\"]) {\r\n          shouldRunNow = false;\r\n      }\r\n      Module[\"noExitRuntime\"] = true;\r\n      run();\r\n\r\n      return AMR;\r\n  })();\r\n\r\n\r\n\r\n\r\n  self.onmessage = function (e) {\r\n      switch(e.data.command){\r\n          case 'encode':\r\n              encode(e.data.samples, e.data.sampleRate);\r\n              break;\r\n          case 'decode':\r\n              decode(e.data.buffer);\r\n              break;\r\n      }\r\n  };\r\n\r\n  function encode(samples, sampleRate) {\r\n      sampleRate = sampleRate || 8000;\r\n      self.postMessage({\r\n          command: 'encode',\r\n          amr: AMR.encode(samples, sampleRate, 7)\r\n      });\r\n  }\r\n\r\n  function decode(u8Array) {\r\n      self.postMessage({\r\n          command: 'decode',\r\n          amr: AMR.decode(u8Array)\r\n      });\r\n  }\r\n  };\n\n  var amrWorkerStr = amrnb.toString().replace(/^\\s*function.*?\\(\\)\\s*{/, '').replace(/}\\s*$/, '');\n  var amrWorkerURLObj = (window.URL || window.webkitURL).createObjectURL(new Blob([amrWorkerStr], {\n    type: \"text/javascript\"\n  }));\n\n  var BenzAMRRecorder =\n  /*#__PURE__*/\n  function () {\n    /**\r\n     * @type {boolean}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {boolean}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {RecorderControl | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Float32Array | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Uint8Array | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Blob | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Function | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Function | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Function | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Function | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Function | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Function | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Function | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Function | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {Function | null}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {boolean}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {boolean}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {number}\r\n     * @private\r\n     */\n\n    /**\r\n     * @type {number}\r\n     * @private\r\n     */\n    function BenzAMRRecorder() {\n      var _this = this;\n\n      _classCallCheck(this, BenzAMRRecorder);\n\n      this._isInit = false;\n      this._isInitRecorder = false;\n      this._recorderControl = new RecorderControl();\n      this._samples = new Float32Array(0);\n      this._rawData = new Uint8Array(0);\n      this._blob = null;\n      this._onEnded = null;\n      this._onAutoEnded = null;\n      this._onPlay = null;\n      this._onPause = null;\n      this._onResume = null;\n      this._onStop = null;\n      this._onStartRecord = null;\n      this._onCancelRecord = null;\n      this._onFinishRecord = null;\n      this._isPlaying = false;\n      this._isPaused = false;\n      this._startCtxTime = 0.0;\n      this._pauseTime = 0.0;\n\n      this._playEmpty = function () {\n        _this._recorderControl.playPcm(new Float32Array(10), 24000);\n      };\n\n      this._onEndCallback = function () {\n        if (_this._isPlaying) {\n          _this._isPlaying = false;\n\n          if (_this._onStop) {\n            _this._onStop();\n          }\n\n          if (_this._onAutoEnded) {\n            _this._onAutoEnded();\n          }\n        }\n\n        if (!_this._isPaused) {\n          if (_this._onEnded) {\n            _this._onEnded();\n          }\n        }\n      };\n\n      this._runAMRWorker = function (msg, resolve) {\n        var amrWorker = new Worker(amrWorkerURLObj);\n        amrWorker.postMessage(msg);\n\n        amrWorker.onmessage = function (e) {\n          resolve(e.data.amr);\n          amrWorker.terminate();\n        };\n      };\n    }\n    /**\r\n     * 是否已经初始化\r\n     * @return {boolean}\r\n     */\n\n\n    _createClass(BenzAMRRecorder, [{\n      key: \"isInit\",\n      value: function isInit() {\n        return this._isInit;\n      }\n      /**\r\n       * 使用浮点数据初始化\r\n       * @param {Float32Array} array\r\n       * @return {Promise}\r\n       */\n\n    }, {\n      key: \"initWithArrayBuffer\",\n      value: function initWithArrayBuffer(array) {\n        var _this2 = this;\n\n        if (this._isInit || this._isInitRecorder) {\n          BenzAMRRecorder.throwAlreadyInitialized();\n        }\n\n        this._playEmpty();\n\n        return new Promise(function (resolve, reject) {\n          var u8Array = new Uint8Array(array);\n\n          _this2.decodeAMRAsync(u8Array).then(function (samples) {\n            _this2._samples = samples;\n            _this2._isInit = true;\n\n            if (!_this2._samples) {\n              RecorderControl.decodeAudioArrayBufferByContext(array).then(function (data) {\n                _this2._isInit = true;\n                return _this2.encodeAMRAsync(data, RecorderControl.getCtxSampleRate());\n              }).then(function (rawData) {\n                _this2._rawData = rawData;\n                _this2._blob = BenzAMRRecorder.rawAMRData2Blob(rawData);\n                return _this2.decodeAMRAsync(rawData);\n              }).then(function (sample) {\n                _this2._samples = sample;\n                resolve();\n              }).catch(function () {\n                reject(new Error('Failed to decode.'));\n              });\n            } else {\n              _this2._rawData = u8Array;\n              resolve();\n            }\n          });\n        });\n      }\n      /**\r\n       * 使用 Blob 对象初始化（ <input type=\"file\">）\r\n       * @param {Blob} blob\r\n       * @return {Promise}\r\n       */\n\n    }, {\n      key: \"initWithBlob\",\n      value: function initWithBlob(blob) {\n        var _this3 = this;\n\n        if (this._isInit || this._isInitRecorder) {\n          BenzAMRRecorder.throwAlreadyInitialized();\n        }\n\n        this._playEmpty();\n\n        this._blob = blob;\n        var p = new Promise(function (resolve) {\n          var reader = new FileReader();\n\n          reader.onload = function (e) {\n            resolve(e.target.result);\n          };\n\n          reader.readAsArrayBuffer(blob);\n        });\n        return p.then(function (data) {\n          return _this3.initWithArrayBuffer(data);\n        });\n      }\n      /**\r\n       * 使用 url 初始化\r\n       * @param {string} url\r\n       * @return {Promise}\r\n       */\n\n    }, {\n      key: \"initWithUrl\",\n      value: function initWithUrl(url) {\n        var _this4 = this;\n\n        if (this._isInit || this._isInitRecorder) {\n          BenzAMRRecorder.throwAlreadyInitialized();\n        }\n\n        this._playEmpty();\n\n        var p = new Promise(function (resolve, reject) {\n          var xhr = new XMLHttpRequest();\n          xhr.open('GET', url, true);\n          xhr.responseType = 'arraybuffer';\n\n          xhr.onload = function () {\n            resolve(this.response);\n          };\n\n          xhr.onerror = function () {\n            reject(new Error('Failed to fetch ' + url));\n          };\n\n          xhr.send();\n        });\n        return p.then(function (array) {\n          return _this4.initWithArrayBuffer(array);\n        });\n      }\n      /**\r\n       * 初始化录音\r\n       * @return {Promise}\r\n       */\n\n    }, {\n      key: \"initWithRecord\",\n      value: function initWithRecord() {\n        var _this5 = this;\n\n        if (this._isInit || this._isInitRecorder) {\n          BenzAMRRecorder.throwAlreadyInitialized();\n        }\n\n        this._playEmpty();\n\n        return new Promise(function (resolve, reject) {\n          _this5._recorderControl.initRecorder().then(function () {\n            _this5._isInitRecorder = true;\n            resolve();\n          }).catch(function (e) {\n            reject(e);\n          });\n        });\n      }\n      /**\r\n       * init 之前先播放一个空音频。\r\n       * 因为有些环境（如iOS）播放首个音频时禁止自动、异步播放，\r\n       * 播放空音频防止加载后立即播放的功能失效。\r\n       * 但即使如此，initWith* 仍然须放入一个用户事件中\r\n       * @private\r\n       */\n\n    }, {\n      key: \"on\",\n      value: function on(action, fn) {\n        if (typeof fn === 'function' || fn === null) {\n          switch (action) {\n            case 'play':\n              this._onPlay = fn;\n              break;\n\n            case 'stop':\n              this._onStop = fn;\n              break;\n\n            case 'pause':\n              this._onPause = fn;\n              break;\n\n            case 'resume':\n              this._onResume = fn;\n              break;\n\n            case 'ended':\n              this._onEnded = fn;\n              break;\n\n            case 'autoEnded':\n              this._onAutoEnded = fn;\n              break;\n\n            case 'startRecord':\n              this._onStartRecord = fn;\n              break;\n\n            case 'cancelRecord':\n              this._onCancelRecord = fn;\n              break;\n\n            case 'finishRecord':\n              this._onFinishRecord = fn;\n              break;\n\n            case '*':\n            case 'all':\n              this._onEnded = fn;\n              this._onAutoEnded = fn;\n              this._onPlay = fn;\n              this._onPause = fn;\n              this._onResume = fn;\n              this._onStop = fn;\n              this._onStartRecord = fn;\n              this._onCancelRecord = fn;\n              this._onFinishRecord = fn;\n              break;\n          }\n        }\n      }\n    }, {\n      key: \"off\",\n      value: function off(action) {\n        this.on(action, null);\n      }\n      /**\r\n       * 播放事件\r\n       * @param {Function | null} fn\r\n       */\n\n    }, {\n      key: \"onPlay\",\n      value: function onPlay(fn) {\n        this.on('play', fn);\n      }\n      /**\r\n       * 停止事件（包括播放结束）\r\n       * @param {Function | null} fn\r\n       */\n\n    }, {\n      key: \"onStop\",\n      value: function onStop(fn) {\n        this.on('stop', fn);\n      }\n      /**\r\n       * 暂停事件\r\n       * @param {Function | null} fn\r\n       */\n\n    }, {\n      key: \"onPause\",\n      value: function onPause(fn) {\n        this.on('pause', fn);\n      }\n      /**\r\n       * 继续播放事件\r\n       * @param {Function | null} fn\r\n       */\n\n    }, {\n      key: \"onResume\",\n      value: function onResume(fn) {\n        this.on('resume', fn);\n      }\n      /**\r\n       * 播放结束事件\r\n       * @param {Function | null} fn\r\n       */\n\n    }, {\n      key: \"onEnded\",\n      value: function onEnded(fn) {\n        this.on('ended', fn);\n      }\n      /**\r\n       * 播放完毕自动结束事件\r\n       * @param {Function | null} fn\r\n       */\n\n    }, {\n      key: \"onAutoEnded\",\n      value: function onAutoEnded(fn) {\n        this.on('autoEnded', fn);\n      }\n      /**\r\n       * 开始录音事件\r\n       * @param {Function | null} fn\r\n       */\n\n    }, {\n      key: \"onStartRecord\",\n      value: function onStartRecord(fn) {\n        this.on('startRecord', fn);\n      }\n      /**\r\n       * 结束录音事件\r\n       * @param {Function | null} fn\r\n       */\n\n    }, {\n      key: \"onFinishRecord\",\n      value: function onFinishRecord(fn) {\n        this.on('finishRecord', fn);\n      }\n      /**\r\n       * 放弃录音事件\r\n       * @param {Function | null} fn\r\n       */\n\n    }, {\n      key: \"onCancelRecord\",\n      value: function onCancelRecord(fn) {\n        this.on('cancelRecord', fn);\n      }\n    }, {\n      key: \"play\",\n\n      /**\r\n       * 播放（重新开始，无视暂停状态）\r\n       * @param {number|string?} startTime 可指定开始位置\r\n       */\n      value: function play(startTime) {\n        var _startTime = startTime && startTime < this.getDuration() ? parseFloat(startTime) : 0;\n\n        if (!this._isInit) {\n          throw new Error('Please init AMR first.');\n        }\n\n        if (this._onPlay) {\n          this._onPlay();\n        }\n\n        this._isPlaying = true;\n        this._isPaused = false;\n        this._startCtxTime = RecorderControl.getCtxTime() - _startTime;\n\n        this._recorderControl.playPcm(this._samples, this._isInitRecorder ? RecorderControl.getCtxSampleRate() : 8000, this._onEndCallback.bind(this), _startTime);\n      }\n      /**\r\n       * 停止\r\n       */\n\n    }, {\n      key: \"stop\",\n      value: function stop() {\n        this._recorderControl.stopPcm();\n\n        this._isPlaying = false;\n        this._isPaused = false;\n\n        if (this._onStop) {\n          this._onStop();\n        }\n      }\n      /**\r\n       * 暂停\r\n       */\n\n    }, {\n      key: \"pause\",\n      value: function pause() {\n        if (!this._isPlaying) {\n          return;\n        }\n\n        this._isPlaying = false;\n        this._isPaused = true;\n        this._pauseTime = RecorderControl.getCtxTime() - this._startCtxTime;\n\n        this._recorderControl.stopPcm();\n\n        if (this._onPause) {\n          this._onPause();\n        }\n      }\n      /**\r\n       * 从暂停处继续\r\n       */\n\n    }, {\n      key: \"resume\",\n      value: function resume() {\n        if (!this._isPaused) {\n          return;\n        }\n\n        this._isPlaying = true;\n        this._isPaused = false;\n        this._startCtxTime = RecorderControl.getCtxTime() - this._pauseTime;\n\n        this._recorderControl.playPcm(this._samples, this._isInitRecorder ? RecorderControl.getCtxSampleRate() : 8000, this._onEndCallback.bind(this), this._pauseTime);\n\n        if (this._onResume) {\n          this._onResume();\n        }\n      }\n      /**\r\n       * 整合 play() 和 resume()，若在暂停状态则继续，否则从头播放\r\n       */\n\n    }, {\n      key: \"playOrResume\",\n      value: function playOrResume() {\n        if (this._isPaused) {\n          this.resume();\n        } else {\n          this.play();\n        }\n      }\n      /**\r\n       * 整合 resume() 和 pause()\r\n       */\n\n    }, {\n      key: \"pauseOrResume\",\n      value: function pauseOrResume() {\n        if (this._isPaused) {\n          this.resume();\n        } else {\n          this.pause();\n        }\n      }\n      /**\r\n       * 整合 play() 和 resume() 和 pause()\r\n       */\n\n    }, {\n      key: \"playOrPauseOrResume\",\n      value: function playOrPauseOrResume() {\n        if (this._isPaused) {\n          this.resume();\n        } else if (this._isPlaying) {\n          this.pause();\n        } else {\n          this.play();\n        }\n      }\n      /**\r\n       * 跳转到音频指定位置，不改变播放状态\r\n       * @param {number|string} time 指定位置（秒，浮点数）\r\n       */\n\n    }, {\n      key: \"setPosition\",\n      value: function setPosition(time) {\n        var _time = parseFloat(time);\n\n        if (_time > this.getDuration()) {\n          this.stop();\n        } else if (this._isPaused) {\n          this._pauseTime = _time;\n        } else if (this._isPlaying) {\n          this._recorderControl.stopPcmSilently();\n\n          this._startCtxTime = RecorderControl.getCtxTime() - _time;\n\n          this._recorderControl.playPcm(this._samples, this._isInitRecorder ? RecorderControl.getCtxSampleRate() : 8000, this._onEndCallback.bind(this), _time);\n        } else {\n          this.play(_time);\n        }\n      }\n      /**\r\n       * 获取当前播放位置（秒）\r\n       * @return {Number} 位置，秒，浮点数\r\n       */\n\n    }, {\n      key: \"getCurrentPosition\",\n      value: function getCurrentPosition() {\n        if (this._isPaused) {\n          return this._pauseTime;\n        } else if (this._isPlaying) {\n          return RecorderControl.getCtxTime() - this._startCtxTime;\n        }\n\n        return 0;\n      }\n      /**\r\n       * 是否正在播放\r\n       * @return {boolean}\r\n       */\n\n    }, {\n      key: \"isPlaying\",\n      value: function isPlaying() {\n        return this._isPlaying;\n      }\n      /**\r\n       * 是否暂停中\r\n       * @return {boolean}\r\n       */\n\n    }, {\n      key: \"isPaused\",\n      value: function isPaused() {\n        return this._isPaused;\n      }\n      /**\r\n       * 开始录音\r\n       */\n\n    }, {\n      key: \"startRecord\",\n      value: function startRecord() {\n        this._recorderControl.startRecord();\n\n        if (this._onStartRecord) {\n          this._onStartRecord();\n        }\n      }\n      /**\r\n       * 结束录音，并把录制的音频转换成 AMR\r\n       * @return {Promise}\r\n       */\n\n    }, {\n      key: \"finishRecord\",\n      value: function finishRecord() {\n        var _this6 = this;\n\n        return new Promise(function (resolve) {\n          _this6._recorderControl.stopRecord();\n\n          _this6._recorderControl.generateRecordSamples().then(function (samples) {\n            _this6._samples = samples;\n            return _this6.encodeAMRAsync(samples, RecorderControl.getCtxSampleRate());\n          }).then(function (rawData) {\n            _this6._rawData = rawData;\n            _this6._blob = BenzAMRRecorder.rawAMRData2Blob(_this6._rawData);\n            _this6._isInit = true;\n\n            if (_this6._onFinishRecord) {\n              _this6._onFinishRecord();\n            }\n\n            _this6._recorderControl.releaseRecord();\n\n            resolve();\n          });\n        });\n      }\n      /**\r\n       * 放弃录音\r\n       */\n\n    }, {\n      key: \"cancelRecord\",\n      value: function cancelRecord() {\n        this._recorderControl.stopRecord();\n\n        this._recorderControl.releaseRecord();\n\n        if (this._onCancelRecord) {\n          this._onCancelRecord();\n        }\n      }\n      /**\r\n       * 是否正在录音\r\n       * @return {boolean}\r\n       */\n\n    }, {\n      key: \"isRecording\",\n      value: function isRecording() {\n        return this._recorderControl.isRecording();\n      }\n      /**\r\n       * 获取音频的时间长度（单位：秒）\r\n       * @return {number}\r\n       */\n\n    }, {\n      key: \"getDuration\",\n      value: function getDuration() {\n        var rate = this._isInitRecorder ? RecorderControl.getCtxSampleRate() : 8000;\n        return this._samples.length / rate;\n      }\n      /**\r\n       * 获取 AMR 文件的 Blob 对象\r\n       * @returns {Blob|null}\r\n       */\n\n    }, {\n      key: \"getBlob\",\n      value: function getBlob() {\n        return this._blob;\n      }\n      /**\r\n       * 注销，清理内部存储\r\n       */\n\n    }, {\n      key: \"destroy\",\n      value: function destroy() {\n        this._recorderControl.stopPcmSilently();\n\n        this._recorderControl.stopRecord();\n\n        this._recorderControl.releaseRecord();\n\n        this.off('*');\n        this._recorderControl = null;\n        this._samples = null;\n        this._rawData = null;\n        this._blob = null;\n      }\n      /*\r\n      static encodeAMR(samples, sampleRate) {\r\n          sampleRate = sampleRate || 8000;\r\n          return AMR.encode(samples, sampleRate, 7);\r\n      }\r\n      */\n\n    }, {\n      key: \"encodeAMRAsync\",\n      value: function encodeAMRAsync(samples, sampleRate) {\n        var _this7 = this;\n\n        return new Promise(function (resolve) {\n          _this7._runAMRWorker({\n            command: 'encode',\n            samples: samples,\n            sampleRate: sampleRate\n          }, resolve);\n        });\n      }\n    }, {\n      key: \"decodeAMRAsync\",\n      value: function decodeAMRAsync(u8Array) {\n        var _this8 = this;\n\n        return new Promise(function (resolve) {\n          _this8._runAMRWorker({\n            command: 'decode',\n            buffer: u8Array\n          }, resolve);\n        });\n      }\n    }], [{\n      key: \"rawAMRData2Blob\",\n      value: function rawAMRData2Blob(data) {\n        return new Blob([data.buffer], {\n          type: 'audio/amr'\n        });\n      }\n    }, {\n      key: \"throwAlreadyInitialized\",\n      value: function throwAlreadyInitialized() {\n        throw new Error('AMR has been initialized. For a new AMR, please generate a new BenzAMRRecorder().');\n      }\n      /**\r\n       * 判断浏览器是否支持播放\r\n       * @return {boolean}\r\n       */\n\n    }, {\n      key: \"isPlaySupported\",\n      value: function isPlaySupported() {\n        return RecorderControl.isPlaySupported();\n      }\n      /**\r\n       * 判断浏览器是否支持录音\r\n       * @return {boolean}\r\n       */\n\n    }, {\n      key: \"isRecordSupported\",\n      value: function isRecordSupported() {\n        return RecorderControl.isRecordSupported();\n      }\n    }]);\n\n    return BenzAMRRecorder;\n  }();\n\n  return BenzAMRRecorder;\n\n}));\n//# sourceMappingURL=BenzAMRRecorder.js.map\n"
  },
  {
    "path": "assets/vendors/friendcircle/friendcircle.css",
    "content": " .friendcircle-container * {\n     margin: 0;\n     padding: 0;\n     -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n     box-sizing: border-box;\n }\n\n .friendcircle-container ul {\n     list-style-type: none;\n }\n\n .friendcircle-container {\n     margin: 0 auto;\n     max-width: 100%;\n }\n\n .friendcircle-container h1 {\n     font-size: 36px;\n     color: #283035;\n     font-weight: 400;\n }\n\n .friendcircle-container h1 a {\n     font-size: 18px;\n     font-weight: 700;\n }\n\n .friendcircle-list {\n     margin-top: 70px;\n     position: relative;\n }\n\n\n\n \n\n .friendcircle-list li {\n     margin-bottom: 15px;\n     display: block;\n     position: relative;\n }\n.friendcircle-list li:not(:last-child) {\n     border-bottom:1px dotted #D7D7D7;\n     padding-bottom: 15px;\n }\n .friendcircle-list li:after {\n     content: '';\n     display: block;\n     clear: both;\n     height: 0;\n     width: 0;\n     \n }\n\n .reply-list {\n     padding-left: 88px;\n     clear: both;\n     margin-top: 15px;\n }\n\n .friendcircle-list .friendcircle-avatar {\n     width: 65px;\n     height: 65px;\n     position: relative;\n     z-index: 99;\n     float: left;\n     border: 3px solid #FFF;\n     -webkit-border-radius: 10px;\n     -moz-border-radius: 10px;\n     border-radius: 10px;\n    \n     overflow: hidden;\n }\n\n .friendcircle-list .friendcircle-avatar img {\n     width: 100%;\n     height: 100%;\n }\n\n .reply-list .friendcircle-avatar {\n     width: 50px;\n     height: 50px;\n }\n\n .friendcircle-main-level:after {\n     content: '';\n     width: 0;\n     height: 0;\n     display: block;\n     clear: both;\n }\n\n .friendcircle-list .friendcircle-box {\n     max-width: 100%;\n     margin-left: 60px;\n     position: relative;\n     top:-8px;\n     word-break: break-all;\n }\n.friendcircle-list .circle-comment-tain{\n    padding:3px;\n    pointer-events: auto;\n}\n\n\n\n .reply-list .friendcircle-box {\n     width: 610px;\n }\n\n .friendcircle-box .friendcircle-head {\n\n     padding: 10px 12px;\n\n     overflow: hidden;\n\n }\n\n .friendcircle-box .friendcircle-head i {\n     margin-left: 30px;\n     position: relative;\n     top: 2px;\n     color: #FF5252;\n }\n\n .friendcircle-box .friendcircle-head .clikenum {\n     color: #999;\n     margin-right: 20px;\n     font-size: 13px;\n     vertical-align: middle;\n }\n\n .friendcircle-box .friendcircle-name {\n     color: #586B95;\n     font-size: 16px;\n     font-weight: 700;\n\n     margin-left: -5px;\n }\n\n .friendcircle-box .friendcircle-name a {\n     color: #586B95;\n }\n\n .friendcircle-box .friendcircle-head span {\n     float: left;\n     color: #999;\n     font-size: 13px;\n     position: relative;\n     top: 5px;\n }\n\n .friendcircle-box .friendcircle-content {\n     padding: 0 0 12px 12px;\n     margin-top:-5px;\n     font-size: 15px;\n     color: #595959;\n\n }\n\n.circle-pictures {\n   width: 85%;\n    display: grid;\n    grid-template-columns: 1fr 1fr 1fr;\n    gap: 5px;\n    margin-top: 8px;\n}\n.circle-picture {\nposition:relative;\n    width:100%;\n    padding-top:100%;\n    overflow: hidden;\n    border-radius: 4px;\n  \n}\n.circle-picture img {\n position:absolute;\n    top:0;\n    left:0;\n    width: fit-content;\n    width:100%;\n    max-width: 100%;\n    height:100%;\n    object-fit: cover;\n    object-position: center;\n    cursor: zoom-in;\n}\n\n\n\n\n\n  .friendcircle-box .friendcircle-time{\n    padding:12px 0 0 12px;\n    color:#B2B2B2; \nposition: relative;\ntop:5px;\n }\n .friendcircle-box .friendcircle-map{\n     display:block;\n     color: #586B95;\n     margin-top:-10px;\n     padding:12px 0 8px 12px;\n     width: fit-content;\n }\n  .friendcircle-box .friendcircle-action{\n      float:right;\n  }\n  .friendcircle-container .friendcircle-bg{\n      width:100%;\n      height:300px;\n      position: relative;\n  }\n  .friendcircle-container .friendcircle-bg .friendcircle-bg-img{\n     border-radius:10px;\n     width:100%;\n     height:300px;\n     object-fit:cover;\n  }\n  .friendcircle-container .friendcircle-bg .friendcircle-bg-author{\n     border-radius:10px;\n     width:80px;\n     height:80px;\n     max-width:80px;\n     max-height:80px;\n     object-fit:cover;\n     position: absolute;\n    bottom: -30px;\n    right: 12px;\n  }\n   .friendcircle-container .friendcircle-bg .friendcircle-bg-author-name{\n       position: absolute;\n    bottom: 10px;\n    right: 100px;\n    color:#fff;\n    font-size:20px;\n    font-weight:bold;\n    letter-spacing: 1px;\n   }\n   .friendcircle-container .friendcircle-bg .friendcircle-bg-author-sign{\n    position: absolute;\n    max-width:90%;\n    bottom: -60px;\n    right: 10px;\n    color:#737373;\n    font-size:14px;\n    letter-spacing: 1px;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis\n   }\n    .friendcircle-box .friendcircle-comments{\n        font-weight:bold;\n        letter-spacing: 0.5px;\n       border-radius:5px;\n       padding:12px;\n   margin-top:12px;\n      background-color:#F7F7F7;\n      color:#5A6C94;\n  }\n.friendcircle-box .friendcircle-comments hr{\n        margin:5px 0 5px 0;\n      border: 0.5px solid #DEDEDE;\n  }\n\n.friendcircle-container .friendcircle-add{\n    background-color:#07c160;\n    padding:10px;\n    color:#fff;\n    border:none;\n    border-radius:5px;\n    position: relative;\n    margin-top:30px;\n    top:40px;\n    cursor:pointer;\n}\n\n\n\n.friendcircle-popup {\n  position: fixed;\n  left: 0;\n  top: 0;\n  height: 100%;\n  width: 100%;\n  max-width:100%;\n  max-height:100%;\n  display:none;\n  background: #00000026;\n    backdrop-filter: saturate(100%) blur(2px);\n    -webkit-backdrop-filter: saturate(100%) blur(2px);\n  overflow-y: auto;\n  z-index: 108;\n  \n}\n\n.friendcircle-popup.is-visible {\n  display:block;\n  animation: showIndex 0.3s;\n\t\t-moz-animation: showIndex  0.3s; /* Firefox */\n\t\t-webkit-animation: showIndex  0.3s; /* Safari and Chrome */\n\t\t-o-animation: showIndex  0.3s; /* Opera */\n\n}\n\n@keyframes showIndex{\n\t0%{ opacity: 0;  }\n\t100%{opacity: 1;  }\n}\n\n.friendcircle-popup-container {\n    border-radius: 10px;\n  height:100%;\n  max-height:100%;\n  border: none;\n  position: relative;\n  width: 90% !important;\n  max-width: 90% !important;\n  min-width:90%!important;\n  margin-left:auto;\n  margin-right:auto;\n  background: #fff;\n  box-shadow: none;\n  -webkit-transform: translateY(-40px);\n  -moz-transform: translateY(-40px);\n  -ms-transform: translateY(-40px);\n  -o-transform: translateY(-40px);\n  transform: translateY(-40px);\n  /* Force Hardware Acceleration in WebKit */\n  -webkit-backface-visibility: hidden;\n  -webkit-transition-property: -webkit-transform;\n  -moz-transition-property: -moz-transform;\n  transition-property: transform;\n  -webkit-transition-duration: 0.3s;\n  -moz-transition-duration: 0.3s;\n  transition-duration: 0.3s;\n}\n\n.friendcircle-popup-container p {\n  margin: 0;\n  padding: 3em 1em;\n  padding-top: 1em;\n}\n\n.friendcircle-popup-container .friendcircle-popup-close {\n  position: absolute;\n  top: 20px;\n  left: 8px;\n  cursor:pointer;\n  font-size:25px;\n}\n\n.friendcircle-close-button {\n  color: #545454;\n  border-bottom: none;\n}\n\n.friendcircle-popup-container .friendcircle-popup-close::before {\n  -webkit-transform: rotate(45deg);\n  -moz-transform: rotate(45deg);\n  -ms-transform: rotate(45deg);\n  -o-transform: rotate(45deg);\n  transform: rotate(45deg);\n  left: 8px;\n}\n\n.friendcircle-popup-container .friendcircle-popup-close::after {\n  -webkit-transform: rotate(-45deg);\n  -moz-transform: rotate(-45deg);\n  -ms-transform: rotate(-45deg);\n  -o-transform: rotate(-45deg);\n  transform: rotate(-45deg);\n  left: 8px;\n}\n\n.is-visible .friendcircle-popup-container {\n  -webkit-transform: translateY(0);\n  -moz-transform: translateY(0);\n  -ms-transform: translateY(0);\n  -o-transform: translateY(0);\n  transform: translateY(0);\n}\n\n\n\n\n.friendcircle-form {\n  background: #ffffff !important;\n  height: auto;\n  margin: 100px auto;\n  max-width: 82%;\n  overflow: hidden !important;\n  width: 100%;\n  -moz-border-radius: 5px;\n  -webkit-border-radius: 5px;\n  border-radius: 5px;\n  -moz-box-shadow: rgba(26, 26, 26, 0.1) 0 1px 3px 0;\n  -webkit-box-shadow: rgba(26, 26, 26, 0.1) 0 1px 3px 0;\n  box-shadow: rgba(26, 26, 26, 0.1) 0 1px 3px 0;\n}\n\n@media (max-width: 500px) {\n  .friendcircle-form {\n    margin: 0;\n    padding-top: 1em;\n    width: 100% !important;\n    max-width: 100% !important;\n    -moz-border-radius: 0px;\n    -webkit-border-radius: 0px;\n    border-radius: 0px;\n    -moz-box-shadow: rgba(26, 26, 26, 0.1) 0 0px 0px 0;\n    -webkit-box-shadow: rgba(26, 26, 26, 0.1) 0 0px 0px 0;\n    box-shadow: rgba(26, 26, 26, 0.1) 0 0px 0px 0;\n  }\n}\n\n\n.friendcircle-form .message{\n  overflow-x: hidden;\n  position: relative !important;\n  -moz-border-radius: none !important;\n  -webkit-border-radius: none !important;\n  border-radius: none !important;\n}\n\n\n.friendcircle-form .message {\n  border-bottom: 1px #e6e6e6 solid !important;\n  border-top: 1px #e6e6e6 solid !important;\n  clear: both !important;\n  overflow: hidden;\n}\n\n.friendcircle-form .message textarea {\n  height: 200px !important;\n  padding:20px 20px 0 20px;\n  border: none !important;\n  outline: none !important;\n  resize: none !important;\n  width: 100% !important;\n  -moz-appearance: none !important;\n  -webkit-appearance: none !important;\n  -o-appearance: none;\n  -ms-appearance: none;\n  appearance: none;\n}\n\n\n\n.friendcircle-form .submit button{\n  background-color:#07c160;\n    position: absolute;\n  top: 12px;\n  right: 8px;\n cursor:pointer;\n  color:#fff;\n  padding:10px;\n  border-radius:6px;\n  display: block !important;\n  overflow: hidden !important;\n  border:none;\n\n  \n}\n\n\n\n.friendcircle-popup-container .message_action .getMap{\n  position: relative;\n  padding:15px 15px 15px 10px;\n  margin:10px;\n  left:-25px;\n  margin-top:-10px;\nborder-bottom: 1px #e6e6e6 solid !important;\n  border-top: 1px #e6e6e6 solid !important;\n  clear: both !important;\n  overflow: hidden;\n}\n.friendcircle-popup-container .message_action .canRead{\n  position: relative;\npadding:15px 15px 15px 10px;\nmargin:10px;\nleft:-25px;\nmargin-top:-10px;\n}\n.friendcircle-popup-container #getUpload{\n    position: relative;\n\n}\n\n.ul_pics li {\n\t\n\twidth: 100px;\n\theight: 100px;\n\tmargin: 10px;\n\tdisplay: inline-block!important;\n}\n\n.ul_pics li .img {\n\twidth: 100px;\n\theight: 100px;\n\tdisplay: inline-block!important;\n}\n\n.ul_pics li img {\n\tmax-width: 100px;\n\tmax-height: 100px;\n\tborder: 1px solid #ddd;\n\tpadding: 5px;\n\tobject-fit:cover;\n\tdisplay: inline-block!important;\n}\n\n.fprogress {\n\tposition: relative;\n\tpadding: 1px;\n\tborder-radius: 3px;\n\tmargin: 60px 0 0 0;\n}\n\n.fbar {\n\tbackground-color: green;\n\tdisplay: block;\n\twidth: 0%;\n\theight: 20px;\n\tborder-radius: 3px;\n}\n\n.fpercent {\n\tposition: absolute;\n\theight: 20px;\n\tdisplay: inline-block;\n\ttop: 0;\n\tleft: 2%;\n\tcolor: #fff\n}\n\n\n#friendcircle-comment-container{\n        width:100%;\n        max-width:100%;\n        background-color:#F5F5F5;\n        padding:2px;\n        border-radius:5px;\n        margin-top:3px;\n    }\n    #friendcircle-comment-container .friendcircle-comment-types{\n width:100%;\nmax-width:100%;\ntext-align:center;\n   background-color:#fff;\n   padding:10px 10px 40px 10px;\n   border-radius:5px;\n    }\n#friendcircle-comment-container .friendcircle-comment-types input{\n        padding-left: 10px;\n        width:32%;\n        display:inline;\n        border-radius:5px;\n        height:30px;\n        border:none;\n        outline: none;\n        background-color:#F5F5F5;\n       \n    }\n\n#friendcircle-comment-container .friendcircle-comment-types textarea{\n    margin-top:10px;\n    width:97%;\n    border:none;\n    outline: none;\n    resize: none;\n}\n#friendcircle-comment-container .friendcircle-comment-types textarea::-webkit-scrollbar{\n    width:0;\n    height:0;\n    display:none;\n}\n#friendcircle-comment-container .friendcircle-comment-types button{\n    float:right;\n    margin-right:8px;\n    padding:8px 12px 8px 12px;\n    border-radius:5px;\n    border:none;\n    background-color:#F5F5F5;\n    color:#586B95;\n    pointer-events: none;\n}\n\n#friendcircle-comment-container .friendcircle-comment-types #friendcircle-comment-cancelsubmit{\n    pointer-events: auto;\n}\n#friendcircle-comment-container .friendcircle-comment-types .friendcircle-comment-emoji{\n    float:right;\n    margin-right:8px;\n    padding:9px 12px 9px 12px;\n    border-radius:5px;\n    border:none;\n    background-color:#F5F5F5;\n    color:#586B95;\n}\n#friendcircle-comment-container .friendcircle-comment-types .friendcircle-comment-readySubmit{\n    background-color:#07c160;\n    color:#fff;\n    animation: fadeIn 0.2s ease-in forwards;\n    pointer-events: auto;\n}\n#friendcircle-comment-container  .emoemo{\n    position: relative;\n   \n    width:100%;\n    left:0;\n    top:-2px;\n}\n#friendcircle-comment-container  .emoemo .emotions{\n    width:100%!important;\n    max-width:100%!important;\n    border:none;\n    border-radius:0 0 5px 5px;\n}\n    .friendcircle_video .plyr--video{\n    margin-top:10px;\n    width:20%!important;\n    max-width:20%!important;\n    border-radius:5px!important;\n    height:20%!important;\n    max-height:20%!important;\n}\n\n        .friendcircle_video .plyr--audio{\n        margin-top:10px;\n        width:100%!important;\n        max-width:100%!important;\n        border-radius:5px!important;\n        \n    }\n    .plyr--video .plyr__controls{\n        background:none!important;\n    }\n    .plyr--video .plyr__controls .plyr__controls__item{\n      display:none;  \n    }\n    video,audio{\n       width:100%!important;\n        max-width:100%!important;\n        display:none;\n    }\n    \n    .tool-item{\n        padding:10px 0 10px 0;\n    }\n    /**\n.friendcircle-action:hover .tool-container {\n  display: block;\n}\n**/\n.tool-container {\n  display: none;\n  margin-left: -90px;\n  margin-top:-50px;\n}\n\ninput[type=\"range\"] {\n            -webkit-appearance: none;\n            margin:5px;\n            height: 4px;\n            background: transparent;\n            outline: none;\n        }\n        input[type=\"range\"]::-webkit-slider-thumb {\n            -webkit-appearance: none;\n            appearance: none;\n            width: 20px;\n            height: 20px;\n            background: #1AAD19;\n            cursor: pointer;\n            border-radius: 50%;\n            margin-top: -8px;\n        }\n\n        input[type=\"top\"]::-moz-range-thumb {\n            width: 20px;\n            height: 20px;\n            background: #1AAD19;\n            cursor: pointer;\n            border-radius: 50%;\n        }\n\n        input[type=\"range\"]::-webkit-slider-runnable-track {\n            width: 100%;\n            height: 4px;\n            background: #ddd;\n            border-radius: 2px;\n        }\n\n        input[type=\"range\"]:focus::-webkit-slider-runnable-track {\n            background: #ddd;\n        }\n\n        input[type=\"range\"]::-moz-range-track {\n            width: 100%;\n            height: 4px;\n            background: #ddd;\n            border-radius: 2px;\n        }\n\n        input[type=\"range\"]::-webkit-slider-runnable-track::before,\n        input[type=\"range\"]::-webkit-slider-runnable-track::after {\n            content: \"\";\n            position: absolute;\n            top: 50%;\n            transform: translateY(-50%);\n            height: 4px;\n            border-radius: 2px;\n        }\n\n        input[type=\"range\"]::-webkit-slider-runnable-track::before {\n            left: 0;\n            width: var(--value);\n            background: #1AAD19;\n        }\n\n        input[type=\"range\"]::-webkit-slider-runnable-track::after {\n            right: 0;\n            width: calc(100% - var(--value));\n            background: #ddd;\n        }"
  },
  {
    "path": "assets/vendors/friendcircle/moxie.js",
    "content": "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:&quot;&quot;\" 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);"
  },
  {
    "path": "assets/vendors/friendcircle/plupload.js",
    "content": "!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);"
  },
  {
    "path": "assets/vendors/layer/theme/default/layer.css",
    "content": ".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}}"
  },
  {
    "path": "assets/vendors/layer/theme/moon/style.css",
    "content": "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}"
  },
  {
    "path": "assets/vendors/mathjax-v3/output/chtml/fonts/tex.js",
    "content": "!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)})}}()}();"
  },
  {
    "path": "assets/vendors/mathjax-v3/output/chtml.js",
    "content": "!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\"))}();"
  },
  {
    "path": "assets/vendors/mathjax-v3/output/svg/fonts/tex.js",
    "content": "!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)})}}()}();"
  },
  {
    "path": "assets/vendors/mathjax-v3/output/svg.js",
    "content": "!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\"))}();"
  },
  {
    "path": "assets/vendors/mathjax-v3/tex-chtml.js",
    "content": "(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,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\\\"/g,\"&quot;\").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&thinsp;lim\"],projlim:[\"NamedOp\",\"proj&thinsp;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&thinsp;inf\"],limsup:[\"NamedOp\",\"lim&thinsp;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(/&thinsp;/,\"\\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,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")},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(/&nbsp;/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={\"&lt;\":!0,\"&gt;\":!0,\"&amp;\":!0,\"&quot;\":!0,\"&apos;\":!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)}))}()})();"
  },
  {
    "path": "assets/vendors/mp3/load-mp3.js",
    "content": "var loadAPlayer = function () {\n    var len = APlayerOptions.length;\nfor(var i=0;i<len;i++){\n    APlayers[i] = new APlayer({\n        element: document.getElementById('player' + APlayerOptions[i]['id']),\n        narrow: false,\n        preload: APlayerOptions[i]['preload'],\n        mutex: APlayerOptions[i]['mutex'],\n        autoplay: APlayerOptions[i]['autoplay'],\n        showlrc: APlayerOptions[i]['showlrc'],\n        music: APlayerOptions[i]['music'],\n        theme: APlayerOptions[i]['theme']\n        });\n    APlayers[i].init();\n}\n};\ndocument.addEventListener('DOMContentLoaded', loadAPlayer, !1);"
  },
  {
    "path": "assets/vendors/player/load-player.js",
    "content": "var dPlayers = [];\nvar loadDPlayer = function () {\n    var load = function (d, conf) {\n        conf.container = d;\n        dPlayers.push(new DPlayer(conf));\n    };\n    for (var i = 0; i < dPlayers.length; i++) {\n        dPlayers[i].destroy();\n    }\n    dPlayers = [];\n    for (var j = 0, k = document.querySelectorAll('.dplayer'); j < k.length; j++) {\n        load(k[j], JSON.parse(k[j].dataset.config));\n    }\n};\n\ndocument.addEventListener('DOMContentLoaded', loadDPlayer, !1);"
  },
  {
    "path": "assets/vendors/translate/translate.js",
    "content": "/*：致谢原作者：管雷鸣 */\nvar 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)}"
  },
  {
    "path": "assets/vendors/watermark/watermark.js",
    "content": "class Watermark {\n  // 默认配置\n  static DEFAULTS = {\n    type: 'text',          // text/image\n    container: 'body',     // 作用区域选择器\n    content: 'Watermark',  // 文字内容或图片URL\n    width: 160,            // 水印宽度\n    fontSize: 14,          // 文字尺寸\n    color: '#000000',      // 文字颜色\n    bgColor: '#FFFFFF80',  // 文字背景色\n    position: 'center',    // 位置: top-left, top-center...\n    opacity: 0.5,          // 透明度 0-1\n    margin: 20,            // 边距(px)\n    format: 'original',    // jpg/png/webp/original\n    quality: 0.92,         // 图片质量 0-1\n    observeDOM: true,      // 自动检测DOM变化\n    pjax: false,           // Pjax兼容模式\n    onSuccess: null,       // 成功回调\n    onError: null          // 错误回调\n  };\n\n  constructor(options = {}) {\n    this.config = { ...Watermark.DEFAULTS, ...options };\n    this.observer = null;\n    this.init();\n  }\n\n  // 初始化\n  init() {\n    this.processExistingImages();\n    if (this.config.observeDOM) this.setupObserver();\n    if (this.config.pjax) this.setupPjax();\n  }\n\n  // 处理现有图片\n  processExistingImages() {\n    document.querySelectorAll(`${this.config.container} img:not([data-watermarked])`)\n      .forEach(img => {\n        if (this.isLazyImage(img)) return;\n        this.applyWatermark(img);\n      });\n  }\n\n  // 创建观察者\n  setupObserver() {\n    this.observer = new MutationObserver(mutations => {\n      mutations.forEach(mutation => {\n        if (mutation.type === 'childList') {\n          this.processExistingImages();\n        }\n      });\n    });\n\n    this.observer.observe(document.querySelector(this.config.container), {\n      childList: true,\n      subtree: true\n    });\n  }\n\n  // Pjax支持\n  setupPjax() {\n    document.addEventListener('pjax:complete', () => {\n      this.processExistingImages();\n    });\n  }\n\n  // 应用水印\n  async applyWatermark(img) {\n    try {\n      // 跳过已处理图片\n      if (img.dataset.watermarked) return;\n      img.dataset.watermarked = 'processing';\n\n      // 创建画布\n      const canvas = document.createElement('canvas');\n      const ctx = canvas.getContext('2d');\n      \n      // 等待图片加载\n      await this.loadImage(img);\n      \n      // 设置画布尺寸\n      [canvas.width, canvas.height] = [img.naturalWidth, img.naturalHeight];\n      \n      // 绘制原图\n      ctx.drawImage(img, 0, 0);\n      \n      // 应用水印\n      if (this.config.type === 'text') {\n        this.applyTextWatermark(ctx);\n      } else {\n        await this.applyImageWatermark(ctx);\n      }\n\n      // 转换格式\n      const mimeType = this.getMimeType(img.src);\n      const newSrc = canvas.toDataURL(mimeType, this.config.quality);\n      \n      // 更新图片\n      img.src = newSrc;\n      img.dataset.watermarked = 'true';\n      \n      // 回调\n      this.config.onSuccess?.(img);\n    } catch (error) {\n      this.handleError(error, img);\n    }\n  }\n\n  // 应用文字水印\n  applyTextWatermark(ctx) {\n    ctx.save();\n    ctx.globalAlpha = this.config.opacity;\n    \n    // 计算位置\n    const { x, y } = this.calculatePosition(ctx);\n    \n    // 绘制背景\n    ctx.fillStyle = this.config.bgColor;\n    const textMetrics = ctx.measureText(this.config.content);\n    ctx.fillRect(\n      x - 5, \n      y - parseInt(this.config.fontSize) - 2,\n      textMetrics.width + 10,\n      parseInt(this.config.fontSize) + 4\n    );\n    \n    // 绘制文字\n    ctx.fillStyle = this.config.color;\n    ctx.font = `${this.config.fontSize}px Arial`;\n    ctx.fillText(this.config.content, x, y);\n    ctx.restore();\n  }\n\n  // 应用图片水印\n  async applyImageWatermark(ctx) {\n    const watermarkImg = await this.loadImage(this.config.content);\n    \n    // 计算缩放比例\n    const scale = Math.min(\n      this.config.width / watermarkImg.width,\n      this.config.width / watermarkImg.height\n    );\n    \n    // 计算位置\n    const { x, y } = this.calculatePosition(ctx, \n      watermarkImg.width * scale,\n      watermarkImg.height * scale\n    );\n    \n    // 绘制水印\n    ctx.save();\n    ctx.globalAlpha = this.config.opacity;\n    ctx.drawImage(\n      watermarkImg,\n      x, y,\n      watermarkImg.width * scale,\n      watermarkImg.height * scale\n    );\n    ctx.restore();\n  }\n\n  // 计算水印位置\n  calculatePosition(ctx, wmWidth = 0, wmHeight = 0) {\n    const { width: imgWidth, height: imgHeight } = ctx.canvas;\n    const margin = this.config.margin;\n    \n    const positions = {\n      'top-left': [margin, margin],\n      'top-center': [(imgWidth - wmWidth)/2, margin],\n      'top-right': [imgWidth - wmWidth - margin, margin],\n      'center-left': [margin, (imgHeight - wmHeight)/2],\n      'center': [(imgWidth - wmWidth)/2, (imgHeight - wmHeight)/2],\n      'center-right': [imgWidth - wmWidth - margin, (imgHeight - wmHeight)/2],\n      'bottom-left': [margin, imgHeight - wmHeight - margin],\n      'bottom-center': [(imgWidth - wmWidth)/2, imgHeight - wmHeight - margin],\n      'bottom-right': [imgWidth - wmWidth - margin, imgHeight - wmHeight - margin]\n    };\n\n    return {\n      x: positions[this.config.position][0],\n      y: positions[this.config.position][1] + (this.config.type === 'text' ? 0 : wmHeight)\n    };\n  }\n\n  // 辅助方法\n  getMimeType(originalSrc) {\n    if (this.config.format !== 'original') {\n      return `image/${this.config.format}`;\n    }\n    return originalSrc.match(/data:([^;]+);/)?.[1] || 'image/png';\n  }\n\n  loadImage(img) {\n    return new Promise((resolve, reject) => {\n      if (img.complete && img.naturalWidth !== 0) {\n        resolve(img);\n        return;\n      }\n\n      img.onload = () => resolve(img);\n      img.onerror = (e) => reject(new Error('图片加载失败'));\n    });\n  }\n\n  isLazyImage(img) {\n    return img.loading === 'lazy' || \n           img.getAttribute('loading') === 'lazy' ||\n           img.dataset.lazy;\n  }\n\n  handleError(error, img) {\n    console.error('水印处理失败:', error);\n    img.dataset.watermarked = 'error';\n    this.config.onError?.(error, img);\n  }\n\n  // 销毁实例\n  destroy() {\n    this.observer?.disconnect();\n    document.removeEventListener('pjax:complete', this.processExistingImages);\n  }\n}"
  },
  {
    "path": "comments.php",
    "content": "<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; \n$parameter= array(\n   'parentId'      => $this->hidden ? 0 : $this->cid,\n   'parentContent' => $this->row,\n   'respondId'     => $this->respondId,\n   'commentPage'   => $this->request->filter('int')->commentPage,\n   'allowComment'  => $this->allow('comment')\n);\n$this->widget('Bearsimple_Widget_Comments_Archive',$parameter)->to($comments);\n?>\n\n<div class=\"comment-card\">\n<h3 class=\"ui header\">\n\n  <i class=\"comment alternate outline icon\"></i>评论区(<?php $this->commentsNum(_t('暂无评论'), _t('1条评论'), _t('%d条评论')); ?>)\n</h3>\n\n  \n<div id=\"comments-con\">\n  <div id=\"comments\">\n\n<?php if(Bsoptions('CommentDesc')== true):?>\n <div id=\"bscommen\"> \n     <?php if ($comments->have()): ?>    \n    \n     <?php\n      ob_start();\n   $comments->listComments();\n   $comments_content = ob_get_contents();\n      ob_end_clean();\n   $comments_content = preg_replace(\"/<ol class=\\\"comment-list\\\">/sm\", '', $comments_content);\n   $comments_content = preg_replace(\"/<\\/ol>/sm\", '', $comments_content);\n   echo $comments_content;\n   ?>\n\n\n    <?php\n\n      ob_start(); \n\n      $comments->pageNav('&laquo;','&raquo;', 1, '');\n      $content = ob_get_contents();\n      ob_end_clean();\n      if(Bsoptions('pagination_style')== '2'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<nav class=\"page-navigator\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<span class=\"page-number\">...</span>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n       $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);\n      $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);\n      //适配旧版本\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n      $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);\n      $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);\n      ///--->\n      $content = preg_replace(\"/<\\/ol>/sm\", '</nav>', $content);\n      }\n      if(empty(Bsoptions('pagination_style ')) || Bsoptions('pagination_style') == '1'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<div class=\"ui  labels\" style=\"margin-top:30px\"><div style=\"text-align:center\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<a class=\"ui large label\">...</a>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      //旧版本兼容\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      \n      $content = preg_replace(\"/<\\/ol>/sm\", '</div></div>', $content);\n      }\n      echo $content;\n     ?>\n\n    <?php endif; ?>\n\n\n    </div>\n    <?php endif; ?>\n<?php if ($this->allow('comment') && Bsoptions('CommentClose') == true): ?>\n\n \n        <div id=\"<?php $this->respondId(); ?>\" class=\"respond\">\n            \n                <?php $comments->cancelReply(); ?>\n            \n\n            <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>\n            <form method=\"post\" action=\"<?php editurl($this->commentUrl) ?>\" id=\"commentform\" role=\"form\"  class=\"ui form\">\n<div id=\"forminput\">\n                <!-- 已登录 -->\n                <?php if(Bsoptions('Comment_islogin') == true || Bsoptions('Comment_islogin') == ''):?>\n                <div id=\"loginshowlabel\" style=\"display:none\">\n                <div class=\"ui image label\">\n  <img src=\"<?php echo imgravatarq($this->user->mail); ?>\">\n  <name id=\"authorname\"></name>\n</div>\n                   </div>\n                    <?php endif; ?>\n                <!-- 未登录 -->\n  <div class=\"<?php if(Helper::options()->commentsRequireURL == true || Bsoptions('Comment_showmail') == true):?>three<?php else: ?>two<?php endif; ?> fields\" id=\"nologinshow\" style=\"display:none\">\n    <div class=\"field\">\n      <label class=\"required\">您的昵称</label>\n      <div class=\"ui icon input\">\n      <input type=\"text\" name=\"author\" id=\"author\" placeholder=\"填写您的昵称\" required>\n      <i id=\"randname\"  class=\"circular dice link icon\"></i>\n</div>\n    </div>\n    <?php if(Helper::options()->commentsRequireMail == true || Bsoptions('Comment_showmail') == false):?>\n    <div class=\"field\">\n      <label <?php if(Helper::options()->commentsRequireMail == true):?>class=\"required\"<?php endif; ?>>您的邮箱</label>\n      <input type=\"email\" name=\"mail\" id=\"mail\"   placeholder=\"填写您的电邮地址\" <?php if(Helper::options()->commentsRequireMail == true):?>required<?php endif; ?>>\n    </div>\n    <?php endif; ?>\n    <?php if(Helper::options()->commentsRequireMail == false && Bsoptions('Comment_showmail') == true):?>\n    <div class=\"field\" style=\"display:none;\">\n      <label class=\"required\">您的邮箱</label>\n      <input type=\"email\" name=\"mail\" id=\"mail\"  placeholder=\"填写您的电邮地址\" disabled=\"\">\n    </div>\n    <?php endif; ?>\n    <?php if(Helper::options()->commentsRequireURL == true || Bsoptions('Comment_showurl') == false):?>\n    <div class=\"field\">\n      <label <?php if(Helper::options()->commentsRequireURL == true):?>class=\"required\"<?php endif; ?>>您的博客网址</label>\n      <input type=\"text\" name=\"url\" id=\"url\" placeholder=\"填写您的博客网站网址\" <?php if(Helper::options()->commentsRequireURL == true):?>required<?php endif; ?>>\n    </div>\n    <?php endif; ?>\n    <?php if(Helper::options()->commentsRequireURL == false && Bsoptions('Comment_showurl') == true):?>\n    <div class=\"field\" style=\"display:none;\">\n      <label <?php if(Helper::options()->commentsRequireURL == true):?>class=\"required\"<?php endif; ?>>您的博客网址</label>\n      <input type=\"text\" name=\"url\" id=\"url\" placeholder=\"填写您的博客网站网址\" <?php if(Helper::options()->commentsRequireURL == true):?>required<?php endif; ?>>\n    </div>\n    <?php endif; ?>\n  </div>\n   <!-- end -->\n   \n  <div class=\"field\">\n      <label class=\"required\">评论内容</label>\n      \n      <?php if(Bsoptions('Comment_private') == true):?>\n      <div class=\"ui slider checkbox\" style=\"margin:5px 0 7px 0\">\n  <input type=\"checkbox\" name=\"privatecomment\" id=\"privatecomment\">\n  <label>私密评论</label>\n\n</div>\n<?php endif; ?>\n      <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>\n    </div>\n    <?php if(Bsoptions('Emoji') == true) :?>\n    <div class=\"circular ui icon button\" id=\"face\">\n  <i class=\"smile beam outline icon\"></i>\n </div>\n <div class=\"ignore emoemo\" style=\"margin-top:-7px;margin-bottom:6px\" translate=\"no\"></div>\n <?php endif; ?>\n <?php if(Bsoptions('CommentNotify__Open') == true) :?>\n <div class=\"ui checkbox\" style=\"margin:-7px 0 5px 0\">\n  <input type=\"checkbox\" name=\"accept\">\n  <label>不接收来自本博客的回复邮件</label>\n</div>\n<?php endif; ?>\n<?php switch(Bsoptions('VerifyChoose')) :?>\n<?php case '1' :?>\n             <?php \\BsCore\\Plugin::spam_protection_mathjia();?>\n             </div>\n             <button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;\">\n  提交评论\n</button>\n             <?php break; ?>\n             <?php case '11' :?>\n             <?php \\BsCore\\Plugin::spam_protection_mathjian();?>\n             </div>\n             <button  type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;\">\n  提交评论\n</button>\n             <?php break; ?>\n              <?php case '22-2' :?>\n             <?php \\BsCore\\Plugin::spam_protection_question();?>\n             </div>\n             <button  type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;\">\n  提交评论\n</button>\n             <?php break; ?>\n             <?php case '2' :?>\n             </div>\n             \n             <?php $this->need('modules/Verify/BearCaptcha/Vaptcha/Vaptcha.php'); ?>\n<button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;margin-top:5px\" disabled=\"\">\n  提交评论\n</button>\n             <?php break; ?>\n             <?php case '2-1' :?>\n             </div>\n             <?php $this->need('modules/Verify/BearCaptcha/Dingxiang/DX_Captcha.php'); ?>\n<button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;margin-top:5px\" disabled=\"\">\n  提交评论\n</button>\n             <?php break; ?>\n             <?php case '2-2' :?>\n             </div>\n             <?php $this->need('modules/Verify/BearCaptcha/Turnstile/Turnstile.php'); ?>\n<button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;margin-top:5px\" disabled=\"\">\n  提交评论\n</button>\n             <?php break; ?>\n              <?php case '2-3' :?>\n             </div>\n             <?php $this->need('modules/Verify/BearCaptcha/Geetest/Geetest.php'); ?>\n<button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;margin-top:5px\" disabled=\"\">\n  提交评论\n</button>\n             <?php break; ?>\n             <?php case '22' :?>\n             </div>\n             <p>\n             <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{\n\t\t\techo Bsoptions('Verify22_Buttontext');}\n\t\t\t  ?></span>\n\t<button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;\" disabled=\"\">\n  提交评论\n</button>\n</p>\n<?php $this->need('modules/Verify/BearCaptcha/Captcha/Captcha.php'); ?>\n             <?php break; ?>\n     <?php case '3' || '' :?>\n     </div><p>\n             <button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;\">\n  提交评论\n</button>\n</p>\n             <?php break; ?>\n <?php endswitch; ?>\n            </form>\n            <div style=\"height:30px\"></div>\n        </div>\n\n\n    <?php if($this->commentsNum == 0) :?>\n<h3 class=\"ui icon header\" style=\"display: grid;place-items: center;\" id=\"nocomment\">\n<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>\n  <div class=\"content\">\n    这里空空如也，快来评论吧~\n  </div>\n</h3>\n<?php endif; ?>\n\n    <?php else: ?>\n   <center>\n<h3 class=\"ui icon header\">\n<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>\n  <div class=\"content\">\n    啊哦，评论功能已关闭～\n  </div>\n</h3>\n    </center>\n    <?php endif; ?>\n    \n   <?php if(Bsoptions('CommentDesc')== '' || Bsoptions('CommentDesc') == false):?>\n   <br>\n <div id=\"bscommen\"> \n     <?php if ($comments->have()): ?>    \n    \n     <?php\n      ob_start();\n   $comments->listComments();\n   $comments_content = ob_get_contents();\n      ob_end_clean();\n   $comments_content = preg_replace(\"/<ol class=\\\"comment-list\\\">/sm\", '', $comments_content);\n   $comments_content = preg_replace(\"/<\\/ol>/sm\", '', $comments_content);\n   echo $comments_content;\n   ?>\n\n\n    <?php\n\n      ob_start(); \n\n      $comments->pageNav('&laquo;','&raquo;', 1, '');\n      $content = ob_get_contents();\n      ob_end_clean();\n      if(Bsoptions('pagination_style')== '2'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<nav class=\"page-navigator\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<span class=\"page-number\">...</span>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n       $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);\n      $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);\n      //适配旧版本\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n      $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);\n      $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);\n      ///--->\n      $content = preg_replace(\"/<\\/ol>/sm\", '</nav>', $content);\n      }\n      if(empty(Bsoptions('pagination_style ')) || Bsoptions('pagination_style') == '1'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<div class=\"ui  labels\" style=\"margin-top:30px\"><div style=\"text-align:center\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<a class=\"ui large label\">...</a>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      //旧版本兼容\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      \n      $content = preg_replace(\"/<\\/ol>/sm\", '</div></div>', $content);\n      }\n      echo $content;\n     ?>\n\n    <?php endif; ?>\n\n\n    </div>\n    <?php endif; ?>    \n    \n</div>\n</div></div>\n\n</div>\n<script>\n$(function(){\n    getCommentInfo();\n});\nfunction getCookie(name){\n    const strcookie = document.cookie;\n    const arrcookie = strcookie.split(\"; \");\n    for (let i = 0; i < arrcookie.length; i++) {\n        const arr = arrcookie[i].split(\"=\");\n        if (arr[0] === name){\n            return arr[1];\n        }\n    }\n    return \"\";\n}\nfunction getCommentInfo(){\n    let nick = document.getElementById('author');\n    let mail = document.getElementById('mail');\n    let url = document.getElementById('url');\n    let nick_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_author'));\n    let mail_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_mail'));\n    let url_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_url'));\n    if (nick && nick_value!== 'null') nick.value = nick_value;\n    if (mail && mail_value!== 'null') mail.value = mail_value;\n    if (url && url_value!== 'null') url.value = url_value;\n    $.post('<?php getIsLogin(); ?>',{action:'find'},function (res) {\n        res = JSON.parse(res);\n        switch(res.code){\n            case 0 :\n        $('#loginshowlabel').hide();\n    $('#nologinshow').show();\n    break;\n    case 1 :\n        $('#loginshowlabel').show();\n    $('#nologinshow').hide();\n    $('#authorname').html(res.name);\n    break;\n        }\n    });\n     $.post('<?php getCommentAction(); ?>',{action:'getCommentToken'},function (res) {\n         res = JSON.parse(res);\n         if(res.code == 1){\n             $(\"#SecurityToken\").remove();\n        var tokenInput=$(\"<input type=\\\"hidden\\\" name=\\\"SecurityToken\\\"  id=\\\"SecurityToken\\\">\");\ntokenInput.attr(\"value\", res.token);\n$(\"#commentform\").append(tokenInput);\n         }\n    })\n}\n</script>\n\n</div>"
  },
  {
    "path": "compoment/foot.php",
    "content": "<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n        </div>\n\n<?php if(Bsoptions('Popup') == true) :?>\n<script src=\"<?php AssetsDir();?>assets/vendors/bs-announcement/bs-announcement.min.js?v=1\" type=\"text/javascript\"></script>\n<div id=\"announcement-root\" \n     data-announcements='<?= \n         htmlspecialchars(json_encode(Bsoptions('Popup_Value')), ENT_QUOTES, 'UTF-8') \n     ?>'\n     data-settings='<?= \n         json_encode([\n             'storageKey' => Bsoptions('PopupKey') ?: 'announcement',\n             'popupTitle' => Bsoptions('PopupTitle') ?: '最新公告'\n         ]) \n     ?>'>\n</div>\n<?php endif; ?>\n\n</div>\n<?php if(Bsoptions('RewardOpen') == true):?>\n<?php\n$payment_config = [\n    'alipay' => [\n        'enabled' => !empty(Bsoptions('RewardOpenAlipay')),\n        'label' => '支付宝',\n        'type' => 'qrcode',\n        'src' => Bsoptions('RewardOpenAlipayText')\n    ],\n    'wechat' => [\n        'enabled' => !empty(Bsoptions('RewardOpenWechat')),\n        'label' => '微信',\n        'type' => 'qrcode',\n        'src' => Bsoptions('RewardOpenWechatText')\n    ],\n    'qq' => [\n        'enabled' => !empty(Bsoptions('RewardOpenQQ')),\n        'label' => 'QQ',\n        'type' => 'qrcode',\n        'src' => Bsoptions('RewardOpenQQText')\n    ],\n    'afdian' => [\n        'enabled' => !empty(Bsoptions('RewardOpenAfdian')),\n        'label' => '爱发电',\n        'type' => 'link',\n        'href' => Bsoptions('RewardOpenAfdianText')\n    ],\n    'paypal' => [\n        'enabled' => !empty(Bsoptions('RewardOpenPaypal')),\n        'label' => 'PayPal',\n        'type' => 'link',\n        'href' => Bsoptions('RewardOpenPaypalText')\n    ]\n];\n\n$active_methods = array_filter($payment_config, function($item) {\n    return $item['enabled'] === true;\n});\n\n$first_key = null;\nif (!empty($active_methods)) {\n    $first_key = array_key_first($active_methods);\n}\n?>\n<div class=\"donate-modal__mask\">\n  <div class=\"donate-modal__container\">\n    <div class=\"donate-modal__header\">\n      <h3>赞赏支持作者</h3>\n      <span class=\"donate-modal__close\">&times;</span>\n    </div>\n    \n    <?php if (!empty($active_methods)) : ?>\n    <div class=\"donate-modal__nav\">\n      <?php foreach ($active_methods as $key => $method) : ?>\n        <div class=\"donate-tab <?= $key === $first_key ? 'active' : '' ?>\" \n             data-target=\"<?= $key ?>\">\n          <?= htmlspecialchars($method['label']) ?>\n        </div>\n      <?php endforeach; ?>\n    </div>\n\n    <div class=\"donate-content\">\n      <?php foreach ($active_methods as $key => $method) : ?>\n        <div class=\"donate-pane <?= $key === $first_key ? 'active' : '' ?>\" id=\"<?= $key ?>\">\n          <?php if($method['type'] === 'qrcode') : ?>\n            <img src=\"<?= htmlspecialchars($method['src']) ?>\" \n                 alt=\"<?= htmlspecialchars($method['label']) ?>二维码\" style=\"max-width:200px;max-height:200px;\">\n          <?php elseif($method['type'] === 'link') : ?>\n            <a href=\"<?= htmlspecialchars($method['href']) ?>\" \n               target=\"_blank\" \n               rel=\"noopener noreferrer\"\n               class=\"donate-paypal-link\">\n              前往<?= htmlspecialchars($method['label']) ?>\n            </a>\n          <?php endif; ?>\n        </div>\n      <?php endforeach; ?>\n    </div>\n    <?php else : ?>\n    <div class=\"donate-empty\">\n      当前暂无可用支付方式\n    </div>\n    <?php endif; ?>\n  </div>\n</div>\n<?php endif; ?>\n\n<?php if(Bsoptions('Top') == true) :?>\n  <button id=\"back-to-top\" class=\"fixed-button\">\n    <i class=\"<?php if(empty(Bsoptions('TopSrc'))){echo 'fas fa-chevron-up';}else{echo Bsoptions('TopSrc');}; ?>\"></i>\n  </button>\n<?php endif;?>\n<?php if(Bsoptions('Control_Panel') == true) :?>\n  <!-- 设置按钮 -->\n  <button id=\"foot-settings-button\" class=\"fixed-button\">\n    <i class=\"fas fa-cogs\"></i>\n  </button>\n\n<!-- 设置面板 -->\n<div id=\"foot-settings-panel\" class=\"foot-settings-panel ignore\">\n  <div class=\"foot-panel-header\">\n    <h3>设置</h3>\n    <button id=\"foot-close-panel\" class=\"foot-close-button\">\n      <i class=\"fas fa-times\"></i>\n    </button>\n  </div>\n  <div class=\"foot-panel-content\">\n    <!-- 黑暗模式切换 -->\n    <div class=\"foot-setting-item\">\n      <div class=\"foot-setting-label\">\n        <i class=\"fas fa-moon\"></i>\n        <span>黑暗模式</span>\n      </div>\n      <div class=\"bstheme-control-dark\">\n        <div class=\"switch-check\">\n          <input type=\"checkbox\" id=\"darkmode\" value=\"true\" name=\"darkmode\">\n          <label class=\"label\" for=\"darkmode\">\n            <span class=\"slider-check\"></span>\n          </label>\n        </div>\n      </div>\n    </div>\n <?php if (Bsoptions('Translate') == \"1\"): ?>\n    <!-- 简繁体切换 -->\n    <div class=\"foot-setting-item\">\n      <div class=\"foot-setting-label\">\n        <i class=\"fas fa-language\"></i>\n        <span>简繁体切换</span>\n      </div>\n      <div class=\"language-buttons\">\n        <button id=\"translateLink\" class=\"language-btn active\" onclick=\"translatePage(); return false;\">简体</button>\n      </div>\n    </div>\n    <?php endif; ?>\n <?php if (Bsoptions('Translate') == \"11\"): ?><?php $this->need('modules/translate.php'); ?>\n <?php endif; ?>\n\n   \n  </div>\n</div>\n<?php endif;?>\n\n  <script>\n$(document).ready(function () {\n  const backToTopButton = $('#back-to-top');\n\n  backToTopButton.on('click', function () {\n    $('html, body').animate({ scrollTop: 0 }, 'smooth');\n  });\n\n  $(window).on('scroll', function () {\n    if ($(window).scrollTop() > 100) {\n      backToTopButton.css('display', 'flex');\n    } else {\n      backToTopButton.css('display', 'none');\n    }\n  });\n\n  const settingsButton = $('#foot-settings-button');\n  const settingsPanel = $('#foot-settings-panel');\n  const closePanelButton = $('#foot-close-panel');\n\n  settingsButton.on('click', function () {\n    settingsPanel.css('display', 'block');\n  });\n\n  closePanelButton.on('click', function () {\n    settingsPanel.css('display', 'none');\n  });\n\n      $(window).on('click', function (event) {\n        if (\n          !$(event.target).closest('#foot-settings-button').length &&\n          !settingsPanel.has(event.target).length\n        ) {\n          settingsPanel.css('display', 'none');\n        }\n      });\n});\n\n  </script>\n\n\n\n\n\n<footer id=\"footer\" role=\"contentinfo\" class=\"break\">\n    \n    <?php if(Bsoptions('FriendLinkChoose') == true && Bsoptions('FriendLinkFoot') == true) :?>\n<?php if((Bsoptions('FriendLink_place') == '1') || (Bsoptions('FriendLink_place') == '2' && $this->is('index'))) :?>\n    <?php if(!empty(Bsoptions('FriendLink'))) :?>\n    \n    <div class=\"ui small horizontal divided list\">\n    友情链接：\n    <?php foreach (getFriendLink() as $FriendLinks): ?>\n  <div class=\"item\">\n    <div class=\"content\">\n      <div><a href=\"<?php echo $FriendLinks[2]; ?>\" title=\"<?php echo $FriendLinks[1]; ?>\"<?php echo parselink($FriendLinks[2]); ?>><?php echo $FriendLinks[0]; ?></a></div>\n    </div>\n  </div>\n <?php endforeach;?>\n</div>\n<br>\n<?php endif;?>\n<?php endif;?><?php endif;?>\n\n <?php if(Bsoptions('CustomizationFooterCode')): ?><?php echo Bsoptions('CustomizationFooterCode'); ?><br><?php endif; ?>\n    &copy; <?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; ?>\n\n<br>\n    <?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>  '); ?>\n    <?php if (Bsoptions('IcpBa') || Bsoptions('PoliceBa')): ?><br><?php endif; ?>\n     <?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; ?>\n     <?php if(Bsoptions('load_Time') == '1'): ?><br><?php echo loadtime();?><?php endif; ?>\n     <?php if(Bsoptions('blogsclub_shuttle') == true): ?>\n     <br><a href=\"https://www.blogsclub.org/go\"> <img src=\"<?php AssetsDir();?>assets/images/blogsclub-shuttle.svg\" loading=\"lazy\"></a>\n     <?php endif;?>\n</footer>    \n\n</div>\n\n</div>\n</div>\n\n<?php if(Bsoptions('Pjax') == true) :?>\n<div class=\"bs-pjax bs-pjax-mask\"></div>\n<div class=\"bs-pjax bs-pjax-anim\">\n    <div>\n        <span class=\"bs-pjax-1\"></span>\n        <span class=\"bs-pjax-2\"></span>\n        <span class=\"bs-pjax-3\"></span>\n        <span class=\"bs-pjax-4\"></span>\n        <span class=\"bs-pjax-5\"></span>\n        <span class=\"bs-pjax-6\"></span>\n        <span class=\"bs-pjax-7\"></span>\n    </div>\n</div>\n<?php endif; ?>\n\n<?php if(!empty(Bsoptions('ServiceWorker')) && ishttps() == true): ?>\n        <script>\n            var serviceWorkerUri = '/<?php echo Bsoptions('ServiceWorker'); ?>';\n            if ('serviceWorker' in navigator) {  \n                navigator.serviceWorker.register(serviceWorkerUri).then(function() {\n                    if (navigator.serviceWorker.controller) {\n                        console.log('Service worker 已经成功运行。');\n                    } else {\n                    console.log('Service worker 当前存在缓存需要更新。');\n                    }\n                }).catch(function(error) {\n                    console.log('错误: ' + error);\n                });\n            } else {\n                console.log('Service worker 无法支持当前浏览器.');\n            }\n        </script>\n        <?php else: ?>\n        <script>\n        if ('serviceWorker' in navigator) {\n            navigator.serviceWorker.getRegistrations().then(function(registrations) {\n            for(let registration of registrations) {\n                registration.unregister()\n            }}).catch(function(err) {\n                console.log('Service worker 注册失败: ', err);\n            });\n        }\n        </script>\n        <?php endif; ?>\n\n\n<script>\nfunction checkAuth() {\n    $.ajax({\n        type: \"POST\",\n        url: \"<?php getIsLogin(); ?>\",\n        data: { action: 'find' },\n        dataType: \"json\",\n        success: function(res) {\n            $('.need-login').toggle(res.code === 1);\n            <?php if(Bsoptions('Login_hidden') == true): ?>\n            if(res.code === 1) {\n                if(res.group === 'administrator' || res.group === 'editor') {\n                    $('#bs-islogin').html(\n                        `<a href=\"${res.url}\" class=\"sm-nav-link\" pjax=\"no\">\n                            <?php _e('进入管理中心'); ?>\n                        </a>`\n                    ).fadeIn();\n                }\n                <?php if(Bsoptions('UserCenterOpen')): ?>\n                    $('#bs-islogin2').html(\n                        `<a href=\"<?= $this->options->siteUrl() ?>usercenter\" \n                           class=\"sm-nav-link\" \n                           pjax=\"no\">\n                            <?php _e('进入用户中心'); ?>\n                        </a>`\n                    ).fadeIn();\n                <?php endif; ?>\n                \n                $('#bs-login').hide();\n            } else {\n                $('#bs-islogin, #bs-islogin2').hide();\n                $('#bs-login').fadeIn();\n            }\n            <?php endif;?>\n        },\n        error: function() {\n            toastr.warning('状态检测失败');\n        }\n    });\n}\n\n$(document).on('pjax:complete', checkAuth);\n$(function() {\n    checkAuth();\n    const interval = 300000;\n    let timer = setInterval(checkAuth, interval);\n    $(window).blur(() => clearInterval(timer));\n    $(window).focus(() => {\n        checkAuth();\n        timer = setInterval(checkAuth, interval);\n    });\n});\n\nwindow.article_element = '<?php switch(Bsoptions('Article_forma')){\n    case '1':\n    default:\n        echo '.pic-article-card';\n    break;\n       case '2':\n         echo   '.simple-article-item';\n           break;\n                       \n}?>\n';\n</script>\n\n<?php if((Bsoptions('menu_style') !== \"3\") && Bsoptions('menu_tem') == \"2\" || Bsoptions('menu_tem') == \"\"):?>\n<script src=\"<?php AssetsDir();?>assets/vendors/menu/menu.min.js\"></script>\n<script>\n    const bearnavbar = new SmartMenus(document.querySelector('#bearnavbar'), {\n  dropdownsShowTrigger: 'mouseover',\n  dropdownsHideTrigger: 'mouseout',\n  dropdownsHideTimeout: '200'\n});\n<?php if(Bsoptions('menu_NewtemSticky') == true):?>\nwindow.addEventListener('scroll', function() {\n  var navbar = document.getElementById('bearnavbar');\n  var scroll = window.scrollY;\n  if (scroll > 0) {\n    navbar.classList.add('fixed-top');\n  } else {\n    navbar.classList.remove('fixed-top');\n  }\n});\n<?php endif; ?>\n</script>\n<?php endif; ?>\n\n<?php if(Bsoptions('Scroll') == true): ?>\n<!--目录树TOC-->\n<script src=\"<?php AssetsDir();?>assets/vendors/bs-toc/bs-toc.min.js\" type=\"text/javascript\"></script>\n<?php if(Bsoptions('Readmode') == true): ?> \n<script src=\"<?php AssetsDir();?>assets/vendors/bs-toc/bs-toc2.min.js\" type=\"text/javascript\"></script>\n<?php endif; ?>\n<script>\n  window.tocManager.displayDisableTocTips = false;\n window.tocManager.generateToc();  \n <?php if(Bsoptions('Readmode') == true): ?> \n window.tocManagerRead.displayDisableTocTips2 = true;\n window.tocManagerRead.generateToc2();  \n \t<?php endif; ?>\n</script>\n<!-- end -->\n\t<?php endif; ?>\n\t<?php if(Bsoptions('Lightbox') == true) :?>\n<script src=\"<?php AssetsDir();?>assets/vendors/fancybox/fancybox.umd.min.js\"></script>\n<?php endif; ?>\n\n<?php if(Bsoptions('MathJax') == true):?>\n<script src=\"<?php AssetsDir();?>assets/vendors/mathjax-v3/tex-chtml.js\" defer></script>\n<script>\nMathJax = {\n  tex: {\n    inlineMath: [['$', '$'], ['\\$', '\\$']]\n  },\n  options: {\n    enableFontLoading: true,\n    enableMenu: false,\n    skipHtmlTags: ['script', 'noscript', 'style', 'textarea', 'pre'],\n    ignoreHtmlClass: 'tex2jax_ignore'\n  },\n  startup: {\n    pageReady: () => MathJax.startup.defaultPageReady()\n  }\n}; \n</script>\n<?php endif; ?>\n<?php if (Bsoptions('Mermaid') == true): ?>\n<style id=\"mermaid-loading-style\">\n.mermaid-loading {\n    position: relative;\n    min-height: 100px;\n    background: #f8f9fa;\n    border-radius: 4px;\n    margin: 1rem 0;\n}\n.mermaid-loading::before {\n    content: \"图表加载中...\";\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n    color: 6c757d;\n    font-size: 0.9em;\n}\n@keyframes ripplePulse {\n    0% {\n        transform: translate(-50%, -50%) scale(0.8);\n        opacity: 0.6;\n    }\n    50% {\n        transform: translate(-50%, -50%) scale(1.2);\n        opacity: 1;\n    }\n    100% {\n        transform: translate(-50%, -50%) scale(0.8);\n        opacity: 0.6;\n    }\n}\n</style>\n\n<script>\n(function() {\n    var mermaidAsset = '<?php AssetsDir(); ?>assets/vendors/mermaid/mermaid.min.js';\n    var isLoaded = false;\n    var styleAdded = false;\n    function addLoadingState() {\n        if (!styleAdded) {\n            document.getElementById('mermaid-loading-style').disabled = false;\n            styleAdded = true;\n        }\n        document.querySelectorAll('.mermaid').forEach(el => {\n            if (!el.classList.contains('processing')) {\n                el.classList.add('mermaid-loading', 'processing');\n            }\n        });\n    }\n\n    function removeLoadingState() {\n        document.querySelectorAll('.mermaid.processing').forEach(el => {\n            el.classList.remove('mermaid-loading', 'processing');\n            el.removeAttribute('aria-live');\n            el.removeAttribute('aria-label');\n        });\n    }\n    function initMermaid() {\n        try {\n            mermaid.init(undefined, document.querySelectorAll('.mermaid'));\n            document.dispatchEvent(new CustomEvent('mermaidRendered'));\n        } catch(e) {\n            console.error('Mermaid initialization failed:', e);\n            document.querySelectorAll('.mermaid.processing').forEach(el => {\n                el.innerHTML = '<div class=\"mermaid-error\">图表渲染失败，请刷新页面</div>';\n            });\n        }\n    }\n\n    function loadMermaid() {\n        if (isLoaded) {\n            initMermaid();\n            return;\n        }\n        addLoadingState();\n        \n        var script = document.createElement('script');\n        script.src = mermaidAsset;\n        script.onload = function() {\n            mermaid.initialize({ \n                startOnLoad: false,\n                securityLevel: 'loose'\n            });\n            initMermaid();\n            removeLoadingState();\n            isLoaded = true;\n        };\n        script.onerror = function() {\n            removeLoadingState();\n            document.querySelectorAll('.mermaid').forEach(el => {\n                el.innerHTML = '<div class=\"mermaid-error\">图表库加载失败，请检查网络</div>';\n            });\n        };\n        document.head.appendChild(script);\n    }\n\n    function checkMermaid() {\n        if (document.querySelector('.mermaid')) {\n            loadMermaid();\n        } else {\n            document.getElementById('mermaid-loading-style').disabled = true;\n        }\n    }\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', checkMermaid);\n    } else {\n        setTimeout(checkMermaid, 100);\n    }\n    <?php if (Bsoptions('Pjax') == true) : ?>\n    $(document)\n        .on('pjax:send', function() {\n            removeLoadingState();\n        })\n        .on('pjax:complete', function() {\n            setTimeout(() => {\n                checkMermaid();\n                document.addEventListener('mermaidRendered', () => {\n                    window.scrollBy(0, 1); \n                });\n            }, 200);\n        });\n    <?php endif; ?>\n})();\n</script>\n<?php endif; ?>\n\n<!-- 引入Pjax -->\n<?php if(Bsoptions('Pjax') == true) :?>\n<script src=\"<?php AssetsDir();?>assets/js/jquery.pjax.js\"></script>\n<?php endif;?>\n<script src=\"<?php AssetsDir();?>assets/js/qrcode.min.js\"></script>\n<!-- 引入全局控制 -->\n<script type=\"text/javascript\" src=\"<?php AssetsDir();?>assets/vendors/fomantic-ui/semantic.min.js?v=4\" defer></script>\n<script src=\"<?php AssetsDir();?>assets/js/funlazy.min.js?v=1\"></script>\n<script type=\"text/javascript\" src=\"<?php AssetsDir();?>assets/js/app.bundle.min.js?v=<?php echo themeVersion(); ?>\" defer></script>\n <?php if(Bsoptions('AIService') == true && Bsoptions('AIService_Key') !== ''): ?> \n<script src=\"<?php AssetsDir();?>assets/vendors/aiTool/ai.min.js\" defer></script>\n<?php endif;?>\n<script type=\"module\" src=\"<?php AssetsDir();?>assets/js/emaction.js?v=1\" defer></script>\n \n<?php if(Bsoptions('Codehightlight') == 1) : ?>\n<script type=\"text/javascript\">\nif (!window.prismLoaded) {\n    window.prismLoaded = true;\n    var script = document.createElement('script');\n    script.src = '<?= $this->options->themeUrl ?>/modules/codehightlight/static/prism.js?v=3';\n    script.onload = initPrism;\n    document.head.appendChild(script);\n} else if (window.Prism) {\n    initPrism();\n}\n\nfunction initPrism() {\n    const showLineNumber = <?= Bsoptions('showLineNumber') == 1 ? 'true' : 'false' ?>;\n    const preElements = document.querySelectorAll('pre');\n    \n    preElements.forEach(pre => {\n        let code = pre.querySelector('code');\n        if (!code) return;\n        const hasLanguageClass = \n            pre.className.match(/\\blanguage-\\w+\\b/) || \n            code.className.match(/\\blanguage-\\w+\\b/);\n            \n        if (!hasLanguageClass) {\n            pre.classList.add('language-plaintext');\n        }\n\n        pre.className = pre.className.replace(/\\b(line-numbers)\\b/g, '').trim();\n        if (showLineNumber) {\n            pre.classList.add('line-numbers');\n        }\n        pre.classList.add('prism');\n        code.classList.add('prism');\n    });\n    \n    if (typeof Prism !== 'undefined') {\n        Prism.highlightAll();\n    }\n}\n$(document).on('pjax:complete', initPrism);\n</script>\n<?php endif; ?>\n\n\n<?php if(Bsoptions('Pjax') == true) :?>\n<script>\n$(document).on('pjax:complete', function () {\n    <?php if(Bsoptions('AIService') == true && Bsoptions('AIService_Key') !== '' && (Bsoptions('AIService_Blacklist') == '' || Bsoptions('AIService_Blacklist_Page') == '')): ?> \nif ($('#post-content').length) {\n    tianliGPT(!0);\n}\n<?php endif;?>\n    <?php if((Bsoptions('menu_style') !== \"3\") && Bsoptions('menu_tem') == \"2\" || Bsoptions('menu_tem') == \"\"):?>\n    const bearnavbar = new SmartMenus(document.querySelector('#bearnavbar'), {\n  dropdownsShowTrigger: 'mouseover',\n  dropdownsHideTrigger: 'mouseout',\n  dropdownsHideTimeout: '200'\n});\n<?php if(Bsoptions('AIService') == true && Bsoptions('AIService_Key') !== '' && (Bsoptions('AIService_Blacklist') == '' || Bsoptions('AIService_Blacklist_Page') == '')): ?> \nif ($('#post-content').length) {\n$(document).on('pjax:success', function () {\n    tianliGPTIsRunning=!1;\n});\n}\nwindow.history.onpushstate=function(t){tianliGPT(!0)};\n<?php endif;?>\n    <?php endif;?>\nif (document.getElementById('echarts_pie')) EchartsInit();\n<?php if(Bsoptions('CustomizationFooterJsPjaxCode')): ?><?php echo Bsoptions('CustomizationFooterJsPjaxCode'); ?><?php endif; ?>\n    <?php if(Bsoptions('Scroll') == true): ?>\nwindow.tocManager.displayDisableTocTips = false;\n            window.tocManager.generateToc();\n             <?php if(Bsoptions('Readmode') == true): ?> \n            window.tocManagerRead.displayDisableTocTips2 = true;\n window.tocManagerRead.generateToc2(); \n  <?php endif; ?>\n            <?php endif; ?>\n\n});\n</script>\n<?php endif; ?>\n<?php if(Bsoptions('CommentTyping') == true) :?>\n<script type=\"text/javascript\" src=\"<?php AssetsDir();?>assets/js/commentTyping.js\"></script>\n<?php endif; ?>\n<?php $this->footer(); ?>\n\n<?php if(Bsoptions('CustomizationFooterJsCode')): ?><?php echo Bsoptions('CustomizationFooterJsCode'); ?><?php endif; ?>\n<script src=\"<?php AssetsDir();?>assets/js/instantPage.js\" type=\"module\"></script>\n</body>\n<!-- 微信二维码弹窗 -->\n<div id=\"wechat-popup\" class=\"popup-overlay\">\n  <div class=\"popup-card\">\n    <span class=\"popup-close\">&times;</span>\n    <img src=\"<?php echo Bsoptions('Wechat_QRCODE') ?>\" alt=\"微信二维码\" class=\"popup-qr\">\n    <p>微信扫码联系我</p>\n  </div>\n</div>\n\n<!-- QQ二维码弹窗 -->\n<div id=\"qq-popup\" class=\"popup-overlay\">\n  <div class=\"popup-card\">\n    <span class=\"popup-close\">&times;</span>\n    <img src=\"<?php echo Bsoptions('QQ_QRCODE') ?>\" alt=\"QQ二维码\" class=\"popup-qr\">\n    <p>QQ扫码联系我</p>\n  </div>\n</div>\n</html>\n<?php if(Bsoptions('Compress') == true) :?>\n<?php $html_source = ob_get_contents();\nob_clean();\nprint compressHtml($html_source);\nob_end_flush(); ?>\n<?php endif; ?>"
  },
  {
    "path": "compoment/head.php",
    "content": "<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit;?>\n<?php\nob_clean();\n$seo_description = '';\n$keywords = '';\n$seo_description = Helper::options()->description;\n  if($this->is('single') && $this->fields->seo_dec !== ''){\n            $seo_description = $this->fields->seo_dec;\n    } \n  if($this->is('category') && $this->getDescription() !== NULL){\n            $seo_description = $this->getDescription();\n    } \nif(Bsoptions('keywords_hide') == true){\n$keywords = '&keywords=0';    \n}\nif(empty(Bsoptions('IframeProtect')) || Bsoptions('IframeProtect') !== '1'){\nswitch(Bsoptions('IframeProtect')){\n    case '2':\n    header('X-Frame-Options:SAMEORIGIN');\n    break;\n    case '3':\n    header('X-Frame-Options:DENY');  \n    break;\n}\n}\nsession_start();\n?>\n<!DOCTYPE html>\n<html lang=\"zh-CN\" data-theme=\"light\"<?php if (Bsoptions('Mournmode') == true): ?> class=\"gray\"<?php endif; ?>>\n    <head>\n    <meta name=\"referrer\" content=\"unsafe-url\">\n    <meta charset=\"UTF-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge, chrome=1\">\n    <?php if(is_https()):?>\n    <meta http-equiv=\"Content-Security-Policy\" content=\"upgrade-insecure-requests\">\n    <?php endif; ?>\n    <meta name=\"renderer\" content=\"webkit\">\n <?php if (Bsoptions('DNSYJX') == true): ?>\n    <meta http-equiv=\"x-dns-prefetch-control\" content=\"on\">\n    <?php foreach(Bsoptions('DNSYJX_AR') as $dnsyjx): ?>\n    <?php if($dnsyjx['DNSADDRESS_Preconnect'] == true):?>\n    <link rel=\"preconnect\" href=\"<?php echo $dnsyjx['DNSADDRESS'] ?>\" <?php if($dnsyjx['DNSADDRESS_Crossorign'] == true):?>crossorign<?php endif; ?>>\n    <?php endif; ?>\n<link rel=\"dns-prefetch\" href=\"<?php echo $dnsyjx['DNSADDRESS'] ?>\">\n    <?php endforeach; ?>\n<?php endif; ?>\n<?php if (Bsoptions('DNSYJX') == '' || Bsoptions('DNSYJX') == false): ?>\n<meta http-equiv=\"x-dns-prefetch-control\" content=\"off\">\n<?php endif; ?>\n <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\" />\n <?php if(Bsoptions('favicon') !== ''): ?>\n <link rel=\"shortcut icon\" href=\"<?php echo Bsoptions('favicon') ?>\" />\n <?php endif; ?>\n\n <title><?php getTitle($this); ?></title>\n        <meta name=\"author\" content=\"<?php $this->author(); ?>\" />\n    <meta name=\"description\" content=\"<?php if($seo_description !== '') echo $seo_description; else getDescription($this); ?>\" />\n    <meta property=\"og:title\" content=\"<?php getTitle($this); ?>\" />\n    <meta property=\"og:description\" content=\"<?php if($seo_description !== '') echo $seo_description; else getDescription($this);  ?>\" />\n    <meta property=\"og:site_name\" content=\"<?php $this->options->title(); ?>\" />\n    <meta property=\"og:type\" content=\"<?php if($this->is('post') || $this->is('page')) echo 'article'; else echo 'website'; ?>\" />\n    <?php if ($this->is('post') || $this->is('page')): ?>\n    <meta property=\"og:url\" content=\"<?php $this->permalink(); ?>\" />\n    <link rel=\"canonical\" href=\"<?php $this->permalink(); ?>\" />\n<?php elseif ($this->is('index')): ?>\n<meta property=\"og:url\" content=\"<?php $this->options->siteUrl(); ?>\" />\n    <link rel=\"canonical\" href=\"<?php $this->options->siteUrl(); ?>\" />\n<?php else: ?>\n    <?php\n    $currentUrl = $this->options->siteUrl . ltrim($_SERVER['REQUEST_URI'], '/');\n    $currentUrl = preg_replace('/([^:])\\/\\//', '$1/', $currentUrl);\n    ?>\n    <meta property=\"og:url\" content=\"<?php echo $currentUrl; ?>\" />\n    <link rel=\"canonical\" href=\"<?php echo $currentUrl; ?>\" />\n<?php endif; ?>\n    \n    <meta property=\"article:published_time\" content=\"<?php echo date('c', $this->created); ?>\" />\n    <meta property=\"article:modified_time\" content=\"<?php echo date('c', $this->modified); ?>\" />\n   \n    <?php $this->header('commentReply=1&description='.$keywords.'&pingback=0&xmlrpc=0&wlw=0&generator=&template=&atom='); ?>\n<script src=\"<?php AssetsDir();?>assets/js/jquery.min.js\" type=\"application/javascript\"></script>\n<link href=\"<?php AssetsDir();?>assets/css/bearsimple.min.css?v=<?php echo themeVersion(); ?>\" rel=\"stylesheet\">\n<link href=\"<?php AssetsDir();?>assets/vendors/fomantic-ui/semantic.min.css?v=2\" rel=\"stylesheet\">\n<link href=\"<?php AssetsDir();?>assets/css/modules/global_custom.min.css?v=<?php echo themeVersion(); ?>\" rel=\"stylesheet\">\n<link rel=\"preload\" href=\"<?php AssetsDir();?>assets/vendors/fontawesome/all.min.css?ver=5.15.4\" as=\"style\" onload=\"this.rel='stylesheet'\" crossorigin>\n<link rel=\"preload\" href=\"<?php AssetsDir();?>assets/vendors/fontawesome/v4-shims.min.css?ver=5.15.4\" as=\"style\" onload=\"this.rel='stylesheet'\" crossorigin>\n<link rel=\"preload\" href=\"https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@200;300;400;500;600;700;900&display=swap\" as=\"style\" onload=\"this.rel='stylesheet'\" crossorigin>\n<link rel=\"preload\" href=\"<?php AssetsDir();?>assets/css/lxgw/style.css\" as=\"style\" onload=\"this.rel='stylesheet'\" crossorigin>\n<script src=\"<?php AssetsDir();?>assets/js/toastr.min.js\"></script>\n<?php bs_style(); ?>\n<?php echo Bsoptions('CustomizationCode'); ?>\n<?php if((Bsoptions('menu_style') !== \"3\") && Bsoptions('menu_tem') == \"2\" || Bsoptions('menu_tem') == \"\"):?>\n<link href=\"<?php AssetsDir();?>assets/vendors/menu/menu.min.css?v=2\" rel=\"stylesheet\" />\n<?php endif;?>\n<?php if(Bsoptions('Lightbox') == true) :?>\n<link href=\"<?php AssetsDir();?>assets/vendors/fancybox/fancybox.min.css?v=3\" rel=\"stylesheet\">\n<?php endif;?>\n<?php if(Bsoptions('Popup') == true) :?>\n<link href=\"<?php AssetsDir();?>assets/vendors/bs-announcement/bs-announcement.min.css?v=1\" rel=\"stylesheet\" type=\"text/css\">\n<?php endif; ?>\n<?php if(Bsoptions('Slidersss') == true) :?>\n<link href=\"<?php AssetsDir();?>assets/vendors/slider/bearslider.min.css?v=2\" rel=\"stylesheet\" type=\"text/css\">\n<?php endif; ?>\n<link href=\"<?php AssetsDir2();?>assets/vendors/bs-toc/bs-toc.min.css\" rel=\"stylesheet\" type=\"text/css\">\n<link href=\"<?php AssetsDir2();?>assets/vendors/bs-toc/bs-toc2.min.css\" rel=\"stylesheet\" type=\"text/css\">\n  <?php if (Bsoptions('Translate') == \"11\"): ?>\n  <script src=\"<?php AssetsDir();?>assets/vendors/translate/translate.js\"></script>\n  <?php endif; ?>\n<link href=\"<?php AssetsDir();?>assets/vendors/sweetalert2/sweetalert2.min.css\" type=\"text/css\" rel=\"stylesheet\" />\n\n<link rel=\"stylesheet\" href=\"<?php AssetsDir();?>assets/vendors/bs-audio/audio.css\">\n<link href=\"<?php AssetsDir();?>assets/vendors/bs-emoji/bs-emoji.css?v=<?php echo themeVersion(); ?>\" rel=\"stylesheet\" type=\"text/css\">\n <?php if(Bsoptions('AIService') == true && Bsoptions('AIService_Key') !== ''): ?> \n<link rel=\"stylesheet\" href=\"<?php AssetsDir();?>assets/vendors/aiTool/ai.min.css\">\n<?php endif;?>\n\n<script>\n<?php if(Bsoptions('MathJax') == true):?>\n    window.Mathjaxv3 = \"open\";\n    <?php else:?>\n    window.Mathjaxv3 = \"close\";\n    <?php endif; ?>\n    <?php if(Bsoptions('Cache') == true && (Bsoptions('Cache_choose') == 'memcached' || Bsoptions('Cache_choose') == 'redis') && Bsoptions('enable_gcache') == true):?>\n    window.GlobalCache = \"on\";\n    <?php endif; ?>\n    window.Defaultfont = \"<?php echo Bsoptions('articleFontDefault') ?>\";\n    window['setting'] = {\n        import: \"<?php AssetsDir();?>\",\n    \timport2 : \"<?php AssetsDir2();?>\",\n    \tsiteUrl : \"<?php $this->options ->siteUrl(); ?>\",\n    \t<?php if(Bsoptions('Darkmode') == true) :?>\n\t\tdarkmode: \"true\",\n\t\tdarkmodetype: \"<?php if(Bsoptions('Darkmode_type') !== '') :?><?php echo implode(',',Bsoptions('Darkmode_type'));?><?php else:?>null<?php endif;?>\",\n\t\tlogo_type:\"<?php echo Bsoptions('header_choose') ?>\",\n\t\tdarkmode_logo:\"<?php echo Bsoptions('imagelogo_dark') ?>\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Lazyload') == true) :?>\n\t\tLazyload: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Mermaid') == true) :?>\n\t\tMermaid: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Mournmode') == true) :?>\n\t\tMournmode: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('ClockModule') == true) :?>\n\t\tClockModule: \"true\",\n\t\t<?php endif; ?>\n<?php if(Bsoptions('Read_Process') == true) :?>\n\t\treadprocess: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Readmode') == true) :?>\n\t\treadmode: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Pjax') == '1') :?>\n\t\tpjax:\"<?php echo Bsoptions('Pjax'); ?>\",\n\t\t<?php else:?>\n\t\tpjax:\"2\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Emoji') == true) :?>\n        owo: \"true\",\n\t<?php endif; ?>\n\t    islogin:\"<?php echo $this->user->hasLogin(); ?>\",\n        commentsRequireMail: \"<?php echo Helper::options()->commentsRequireMail; ?>\",\n        commentsRequireURL: \"<?php echo Helper::options()->commentsRequireURL; ?>\",\n\t    verify_type:\"<?php echo Bsoptions('VerifyChoose'); ?>\",\n\t<?php if(Bsoptions('VerifyChoose') == '2') :?>\n        vid: \"<?php echo Bsoptions('vid'); ?>\",\n\t<?php endif; ?>\n\t<?php if(Bsoptions('VerifyChoose') == '2-1') :?>\n        dx_appid: \"<?php echo Bsoptions('dx_appId'); ?>\",\n        dx_apiserver: \"<?php echo Bsoptions('dx_domain'); ?>\",\n\t<?php endif; ?>\n\t<?php if(Bsoptions('VerifyChoose') == '2-2') :?>\n        turnstile_sitekey: \"<?php echo Bsoptions('turnstile_key'); ?>\",\n        turnstile_theme: \"<?php echo Bsoptions('turnstile_theme'); ?>\",\n\t<?php endif; ?>\n\t\t<?php if(Bsoptions('VerifyChoose') == '2-3') :?>\n        geetest_id: \"<?php echo Bsoptions('geeid'); ?>\",\n\t<?php endif; ?>\n\t\tsearch:\"<?php if(!empty(Bsoptions('Search')[0]&& is_array(Bsoptions('Search')))){echo count(Bsoptions('Search'));}else{echo 0;}; ?>\",\n\t\t<?php if(!empty(Bsoptions('Search')[0]) && @in_array('header',Bsoptions('Search'))) :?>\n\t\theader_search: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(!empty(Bsoptions('Search')[0]) && @in_array('phone',Bsoptions('Search'))) :?>\n\t\tphone_search: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(!empty(Bsoptions('Search')[0]) && @in_array('sidebar',Bsoptions('Search'))) :?>\n\t\tsidebar_search: \"true\",\n\t\t<?php endif; ?>\n<?php if(Bsoptions('Slidersss') == '1' && Bsoptions('SliderIndexs') == '1' || Bsoptions('SliderOthers') == '1') :?>\n\t\tslider: \"true\",\n\t\t<?php endif; ?>\n\t\tmenu_style: \"2\",\n\t\t<?php if(Bsoptions('Like') == true): ?>\n\t\tLike: \"true\",\n\t\tLikenum: \"<?php echo agreeNum($this->cid)['recording']; ?>\",\n\t\tgetPostLikeFile:\"<?php echo getPostLikeFile();?>\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Comment_like') == true): ?>\n\t\tCommentLike: \"true\",\n\t\tgetCommentLikeFile:\"<?php echo getCommentLikeFile();?>\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('hcsticky') == '1') :?>\n\t\tsticky: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Lightbox') == true) :?>\n\t\timagebox: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Watermark') == true) :?>\n\t\tWatermark: \"true\",\n\t\tWatermarkType:\"<?php echo Bsoptions('WatermarkType');?>\",\n\t\t<?php if(Bsoptions('WatermarkType') == '1'||empty(Bsoptions('WatermarkType'))) :?>\n        Watermark_textBg:\"<?php echo Bsoptions('waterMarkTextBackground');?>\",\n        Watermark_textColor:\"<?php if(empty(Bsoptions('waterMarkTextColor'))) :?>white<?php else:?><?php echo Bsoptions('waterMarkTextColor');?><?php endif; ?>\",\n        Watermark_text: \"<?php if(empty(Bsoptions('waterMarkName'))) :?><?php $this->options->title();?><?php else:?><?php echo Bsoptions('waterMarkName');?><?php endif; ?>\",\n        Watermark_textWidth: <?php if(empty(Bsoptions('waterMarkKd'))) :?>130<?php else:?><?php echo Bsoptions('waterMarkKd');?><?php endif; ?>,\n        Watermark_textSize: <?php if(empty(Bsoptions('waterMarkTextSize'))) :?>12<?php else:?><?php echo Bsoptions('waterMarkTextSize');?><?php endif; ?>,\n    <?php endif; ?>\n    <?php if(Bsoptions('WatermarkType') == '2') :?>\n        Watermark_path:\"<?php echo Bsoptions('waterMarkName');?>\",\n    <?php endif; ?>\n        Watermark_gravity: \"<?php if(empty(Bsoptions('waterMarkLocation'))) :?>c<?php else:?><?php echo Bsoptions('waterMarkLocation');?><?php endif; ?>\",\n        Watermark_opacity: <?php if(empty(Bsoptions('waterMarkOpacity'))) :?>1<?php else:?><?php echo Bsoptions('waterMarkOpacity');?><?php endif; ?>,\n        Watermark_margin: <?php if(empty(Bsoptions('waterMarkMargin'))) :?>12<?php else:?><?php echo Bsoptions('waterMarkMargin');?><?php endif; ?>,\n        waterMarkOutput: \"<?php echo Bsoptions('waterMarkOutput');?>\",\n    <?php if(!empty(Bsoptions('waterMarkOutput')) && Bsoptions('waterMarkOutput') !== 'null') :?>\n        Watermark_outputType: \"<?php echo Bsoptions('waterMarkOutput');?>\",\n    <?php endif; ?>\n\t<?php endif; ?>\n\t<?php if(Bsoptions('Popup') == true) :?>\n\t    Popup: \"true\",\n\t    PopupTitle: \"<?php if(empty(Bsoptions('PopupTitle'))){ echo '公告栏';}else{echo Bsoptions('PopupTitle');}; ?>\",\n        PopupTitleClose: <?php if(Bsoptions('PopupTitleClose') == 1){ echo 'true';}else{echo 'false';}; ?>,\n        PopupClose: <?php if(Bsoptions('PopupClose') == 1){ echo 'true';}else{echo 'false';}; ?>,\n        PopupAutoHide: <?php if(Bsoptions('PopupAutoHide') == '0'){ echo 0;}elseif(Bsoptions('PopupAutoHide') == '1'){echo \"'\".'auto'.\"'\";}else{if(empty(Bsoptions('PopupAutoHideSecond'))){echo 10;}else{echo Bsoptions('PopupAutoHideSecond');}}; ?>,\n        PopupAutoClose: <?php if(Bsoptions('PopupAutoClose') == '0'){ echo 0;}elseif(Bsoptions('PopupAutoClose') == '1'){echo \"'\".'auto'.\"'\";}else{if(empty(Bsoptions('PopupAutoCloseSecond'))){echo 10;}else{echo Bsoptions('PopupAutoCloseSecond');}}; ?>,\n        PopupWidth: <?php if(empty(Bsoptions('PopupWidth'))){ echo 300;}elseif(Bsoptions('PopupWidth') == '0'){echo \"'\".'auto'.\"'\";}else{echo Bsoptions('PopupWidth');}; ?>, \n        PopupHeight: <?php if(Bsoptions('PopupHeight') == null || Bsoptions('PopupHeight') == '0'){ echo \"'\".'auto'.\"'\";}else{echo Bsoptions('PopupHeight');}; ?>,\n        PopupSpeed: <?php if(empty(Bsoptions('PopupSpeed'))){ echo 10;}else{echo Bsoptions('PopupSpeed');}; ?>,\n        PopupEffect: '<?php if(empty(Bsoptions('PopupEffect'))){ echo 'fading';}else{echo Bsoptions('PopupEffect');}; ?>',\n\t<?php endif; ?>\n\t<?php if(Bsoptions('Top') == true) :?>\n\t    Top : \"true\",\n\t<?php endif; ?>\n\t<?php if(Bsoptions('infinite_scroll') == true): ?>\n\t    infinite_scroll:'true',\n\t<?php else: ?>\n\t    infinite_scroll:'false',\n\t<?php endif; ?>\n<?php if(Bsoptions('Login_hidden') == true): ?> \n        Login_hidden:'true',\n        loginAction:'<?php $this->options->loginAction();?>',\n        registerOpen:'<?php $this->options->allowRegister(); ?>',\n        registerAction:'<?php $this->options->registerAction(); ?>',\n        registerAllow:'<?php echo Bsoptions('UserCenterRegister'); ?>',\n        login_other:\"<?php if(Bsoptions('Login_Other') !== '') :?><?php echo implode(',',Bsoptions('Login_Other'));?><?php else:?>null<?php endif; ?>\",\n    <?php endif; ?>\n    <?php if(Bsoptions('Share') == true): ?>\n        Share:'true',\n    <?php if(!empty(Bsoptions('Shares')[0]) && @in_array('wechat',Bsoptions('Shares'))) :?>\n        Sharewechat:'true',\n    <?php endif; ?>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('Translate'))): ?>\n        Translate:'<?php echo Bsoptions('Translate');?>',\n        TranslateLanguage:'<?php if(Bsoptions('TranslateLanguage') == '1') :?>2<?php else: ?>1<?php endif; ?>',\n    <?php endif; ?>\n    AIService: '<?php echo Bsoptions('AIService');?>',\n    <?php if(Bsoptions('AIService') == true && Bsoptions('AIService_Key') !== ''): ?>\n       ai : {\n        AIService_Key: '<?php echo Bsoptions('AIService_Key');?>',\n        AIService_Name: '<?php if(Bsoptions('AIService_Name') !== '') echo Bsoptions('AIService_Name'); else echo \"BearAI\";?>',\n        AIService_Introduce: '<?php if(Bsoptions('AIService_Introduce') !== '') echo Bsoptions('AIService_Introduce'); else echo \"我是文章辅助AI，点击下方的按钮，让我生成本文摘要。\";?>',\n        AIService_Version: '<?php if(Bsoptions('AIService_Version') !== '') echo Bsoptions('AIService_Version'); else echo \"BearAI\";?>',\n        AIService_Auto: '<?php if(Bsoptions('AIService_Auto') == true) echo 1; else echo 0;?>',\n        AIService_Selector: '#post-content #bearsimple-images',\n        <?php if(Bsoptions('AIService_Blacklist') !== '' || Bsoptions('AIService_Blacklist_Page') !== ''): ?>\n        AIService_Blacklist:'<?php echo getAiTools();?>'\n        <?php endif;?>\n       },\n    <?php endif;?>\n        tips : {\n          articlePwdAfterEnterSuccess_Tip : '<?php echo empty(Bsoptions('globalTips')['articlePwdAfterEnterSuccess_Tip'])? '您已成功验证文章密码，页面将在3秒后刷新~' : Bsoptions('globalTips')['articlePwdAfterEnterSuccess_Tip'];?>',\n          articlePwdAfterEnterFail_Tip : '<?php echo empty(Bsoptions('globalTips')['articlePwdAfterEnterFail_Tip'])? '您输入的文章密码有误，请重新输入~' : Bsoptions('globalTips')['articlePwdAfterEnterFail_Tip'];?>',\n          articleAgreeSuccess_Tip : '<?php echo empty(Bsoptions('globalTips')['articleAgreeSuccess_Tip'])? 'Yeah~您已成功点赞本文章!' : Bsoptions('globalTips')['articleAgreeSuccess_Tip'];?>',\n          articleAgreeFail1_Tip : '<?php echo empty(Bsoptions('globalTips')['articleAgreeFail1_Tip'])? '啊哦，您已经点赞过惹~' : Bsoptions('globalTips')['articleAgreeFail1_Tip'];?>',\n          articleAgreeFail2_Tip : '<?php echo empty(Bsoptions('globalTips')['articleAgreeFail2_Tip'])? '网络出现堵塞，请稍后重试~' : Bsoptions('globalTips')['articleAgreeFail2_Tip'];?>',\n          commentSuccess_Tip : '<?php echo empty(Bsoptions('globalTips')['commentSuccess_Tip'])? '您已评论成功，将自动刷新~' : Bsoptions('globalTips')['commentSuccess_Tip'];?>',\n          commentFail_Tip : '<?php echo empty(Bsoptions('globalTips')['commentFail_Tip'])? '请手动刷新页面后再尝试操作~' : Bsoptions('globalTips')['commentFail_Tip'];?>',\n          commentAgreeSuccess_Tip : '<?php echo empty(Bsoptions('globalTips')['commentAgreeSuccess_Tip'])? 'Yeah~您已成功点赞!' : Bsoptions('globalTips')['commentAgreeSuccess_Tip'];?>',\n          commentAgreeFail1_Tip : '<?php echo empty(Bsoptions('globalTips')['commentAgreeFail1_Tip'])? '啊哦，您已经点赞过惹~' : Bsoptions('globalTips')['commentAgreeFail1_Tip'];?>',\n          commentAgreeFail2_Tip : '<?php echo empty(Bsoptions('globalTips')['commentAgreeFail2_Tip'])? '网络出现堵塞，请稍后重试~' : Bsoptions('globalTips')['commentAgreeFail2_Tip'];?>',\n        }\n     };\n\n</script>\n<script src=\"<?php AssetsDir();?>assets/js/modules/darkmode.js\"></script>\n </head>\n <body <?php if(Bsoptions('CopyProtect') == true) :?>oncontextmenu='return false' ondragstart='return false' onselectstart ='return false' onselect='document.selection.empty()' oncopy='document.selection.empty()' onbeforecopy='return false'<?php endif; ?> <?php if (Bsoptions('DNSYJX') == true): ?>data-instant-allow-external-links<?php endif;?>>\n     <?php if(Bsoptions('Read_Process') == true) :?>\n \n<div class=\"read_progress\">\n    <div class=\"read_progress_inner\"></div>\n</div>\n\n<?php endif; ?>\n\n     <div id=\"pjax\">\n<?php if(Bsoptions('Pjax') == true) :?>\n<?php $this->header('commentReply=1&description=0&keywords=0&generator=0&template=0&pingback=0&xmlrpc=0&wlw=0&rss2=0&rss1=0&antiSpam=0&atom'); ?>\n     <?php endif; ?>\n     <div class=\"body_container\" id=\"body_container\">\n         \n         <div id=\"header\">\n             <div class=\"site-name\">\n<?php if(!empty(Bsoptions('Search')[0]) && @in_array('header',Bsoptions('Search'))) :?>   \n        <form name=\"pcsearch\" role=\"search\" method=\"get\" id=\"searchform1\">\n <div class=\"bearmargin\" style=\"float:right;\"><div class=\"ui category search\"><div class=\"ui large icon input pc\">\n      <input class=\"prompt\" id=\"pcsearch\" type=\"text\" name=\"s\" placeholder=\"输入关键词实时搜索\">\n      <i class=\"search link icon\"></i>\n</div></div></div>\n</form> \n<?php endif; ?>\n                 <?php if(Bsoptions('header_choose') == 'image') :?>\n    <a id=\"logo\" href=\"<?php $this->options->siteUrl(); ?>\"><img id=\"sitelogo\" width=\"250\" height=\"70\" src=\"<?php echo Bsoptions('imagelogo') ?>\"></a>\n        \t    <p class=\"description\"></p>\n        \t    <?php else :?>\n        \t     <a id=\"logo\" href=\"<?php $this->options->siteUrl(); ?>\"><?php echo Bsoptions('textlogo_text') ?>\t     </a>\n        \t     <?php if(!empty(Bsoptions('textlogo_dec'))) :?>\n        \t    <p class=\"description\"><?php echo Bsoptions('textlogo_dec'); ?></p>\n        \t     <?php endif; ?>\n        \t     \n      <?php endif; ?>\n        \n        \t     \n        \t    </div>\n        \t    <?php if(!empty(Bsoptions('Search')[0]) && @in_array('phone',Bsoptions('Search'))) :?> \n<form name=\"phonesearch\" role=\"search\" method=\"get\" id=\"searchformbyphone\">\n <div style=\"text-align:center\">\n<div class=\"ui category search\">\n<div class=\"ui icon input phone\">\n      <input class=\"prompt\" id=\"phonesearch\" type=\"text\" name=\"s\" placeholder=\"输入关键词实时搜索\">\n      <i class=\"search link icon\"></i>\n</div>\n</div></div>\n</form>\n<?php endif; ?>\n\n\n  </div>\n\n    \n    <?php if(Bsoptions('menu_style') !== \"3\"): ?>\n<div class=\"navbar_e\">\n<?php if(Bsoptions('menu_tem') == \"1\"):?>\n<ul class=\"menu\">\n    <li><a href=\"<?php $this->options->siteUrl(); ?>\"<?php if($this->is('index')): ?> class=\"current\"<?php endif; ?>>首页</a></li>\n      <?php if(Bsoptions('CategoryMenu') == null || Bsoptions('CategoryMenu') == true): ?>\n    <li>\n      <a  <?php if($this->is('category')): ?> class=\"current\"<?php endif; ?>>分类 <i class=\"angle double right icon\"></i></a>\n      <ul>\n          <?php $this->widget('Widget_Metas_Category_List')->to($categorys); ?>\n          <?php while($categorys->next()): ?>\n\n<?php if ($categorys->levels === 0): ?>\n\n<?php $children = $categorys->getAllChildren($categorys->mid); ?>\n\n<?php if (empty($children)) { ?>\n        <li><a href=\"<?php $categorys->permalink(); ?>\" title=\"<?php $categorys->name(); ?>\" <?php if($this->is('category',$categorys->slug)): ?> class=\"current\"<?php endif; ?>><?php $categorys->name(); ?></a></li>\n      <?php }  else { ?>\n         <li><a href=\"<?php $categorys->permalink(); ?>\" <?php if($this->is('category',$categorys->slug)): ?> class=\"current\"<?php endif; ?>><?php $categorys->name(); ?> <i class=\"angle double right icon\"></i></a>\n\n          <ul>\n               <?php foreach ($children as $mid) { ?>\n           <?php $child = $categorys->getCategory($mid); ?>\n\n                <li><a href=\"<?php echo $child['permalink'] ?>\" title=\"<?php echo $child['name']; ?>\" <?php if($this->is('category',$child['slug'])): ?> class=\"current\"<?php endif; ?>><?php echo $child['name']; ?></a></li>\n                <?php } ?>\n          </ul>\n        </li>\n          <?php } ?>\n            <?php endif; ?><?php endwhile; ?>\n      </ul>\n    </li>\n    <?php endif; ?>\n    \n   \n\n\n<?php if(Bsoptions('PageMenu') !== \"3\"): ?>\n<?php $this->widget('Widget_Contents_Page_List')->to($pages); ?>\n<?php if($pages->have()): ?>\n<?php if(Bsoptions('PageMenu') == null || Bsoptions('PageMenu') == \"1\"): ?>\n        <li><a<?php if($this->is('page')): ?> class=\"current\"<?php endif; ?>>页面 <i class=\"angle double right icon\"></i></a>\n          <ul>\n                    <?php while($pages->next()): ?>\n            <li><a href=\"<?php $pages->permalink(); ?>\" <?php if($this->is('page',$pages->slug)): ?> class=\"current\"<?php endif; ?> title=\"<?php $pages->name(); ?>\"><?php $pages->title(); ?></a></li>\n            <?php endwhile; ?>\n            </ul>\n        </li>\n        <?php else : ?>\n                    <?php while($pages->next()): ?>\n            <li><a href=\"<?php $pages->permalink(); ?>\"<?php if($this->is('page',$pages->slug)): ?> class=\"current\"<?php endif; ?> title=\"<?php $pages->name(); ?>\"><?php $pages->title(); ?></a></li>\n         <?php endwhile; ?>\n         <?php endif; ?>\n<?php endif; ?>\n<?php endif; ?>\n        <?php if(is_array(Bsoptions('Menu'))):?>\n  <?php foreach (Bsoptions('Menu') as $item): \n    $menuText = $item['Menu_Text'];\n    $needLogin = !empty($item['Menu_LoginShow']);\n    if (empty(trim($menuText['url'])) && empty(trim($menuText['text']))) {\n        continue;\n    }\n    $url = !empty(trim($menuText['url'])) ? htmlspecialchars(trim($menuText['url'])) : 'javascript:;';\n    $text = !empty(trim($menuText['text'])) ? htmlspecialchars(trim($menuText['text'])) : '未命名导航';\n?>\n<li class=\"<?= $needLogin ? 'need-login' : '' ?>\" \n    <?= $needLogin ? 'style=\"display:none\"' : '' ?>>\n    <a href=\"<?= $url ?>\" \n       title=\"<?= $text ?>\"\n       <?= ($menuText['target'] === '_blank') ? 'target=\"_blank\"' : '' ?>>\n       <?= $text ?>\n    </a>\n</li>\n<?php endforeach; ?>\n<?php endif;?>\n        \n<?php if(Bsoptions('Login_hidden') == true): ?>\n<li id=\"bs-login\" style=\"display:none\"><a><?php _e('登录'); ?></a></li>\n<li id=\"bs-islogin\" style=\"display:none\"></li>\n<li id=\"bs-islogin2\" style=\"display:none\"></li>\n<?php endif; ?>\n  </ul>\n  <?php endif; ?>\n \n <?php if(Bsoptions('menu_tem') == \"2\" || Bsoptions('menu_tem') == \"\"):?>\n    <nav id=\"bearnavbar\" class=\"sm-navbar <?php if(Bsoptions('menu_NewtemSticky') == true):?>sm-navbar--sticky-top <?php endif;?>sm-navbar--offcanvas-<?php if(Bsoptions('menu_NewtemToggle') == ''):?>left<?php else:?><?php echo Bsoptions('menu_NewtemToggle');?><?php endif;?>\">\n\n<span></span>\n  <span class=\"sm-toggler-state\" id=\"sm-toggler-state-1\"></span>\n  <div class=\"sm-toggler\">\n    <a class=\"sm-toggler-anchor sm-toggler-anchor--show\" href=\"#sm-toggler-state-1\" role=\"button\" aria-label=\"Open\">\n      <span class=\"sm-toggler-icon sm-toggler-icon--show\"></span>\n    </a>\n    <a class=\"sm-toggler-anchor sm-toggler-anchor--hide\" href=\"#\" role=\"button\" aria-label=\"Close\">\n      <span class=\"sm-toggler-icon sm-toggler-icon--hide\"></span>\n    </a>\n  </div>\n\n  <a class=\"sm-offcanvas-overlay\" href=\"#\" aria-hidden=\"true\" tabindex=\"-1\"></a>\n\n  <div class=\"sm-offcanvas\">\n\n    <div class=\"sm-hide-large\" style=\"display: flex; align-items: center; justify-content: space-between\" aria-hidden=\"true\">\n      <h1 class=\"sm-brand\">导航</h1>\n      <div class=\"sm-toggler\">\n        <a class=\"sm-toggler-anchor sm-toggler-anchor--hide\" href=\"#\" role=\"button\" tabindex=\"-1\">\n          <span class=\"sm-toggler-icon sm-toggler-icon--hide\"></span>\n        </a>\n      </div>\n    </div>\n\n    <ul class=\"sm-nav\">\n      <li class=\"sm-nav-item\"><a class=\"sm-nav-link<?php if($this->is('index')):?> current<?php endif;?>\" href=\"<?php $this->options->siteUrl(); ?>\">首页</a></li>\n      <?php if(Bsoptions('CategoryMenu') == null || Bsoptions('CategoryMenu') == true): ?>\n      <?php $this->widget('Widget_Metas_Category_List')->to($categorys); ?>\n      <li class=\"sm-nav-item\">\n          <a class=\"sm-nav-link sm-sub-toggler<?php if($this->is('category')): ?> current<?php endif;?>\">分类</a>\n    \n        <ul class=\"sm-sub\">\n                  <?php while($categorys->next()): ?>\n\n<?php if ($categorys->levels === 0): ?>\n\n<?php $children = $categorys->getAllChildren($categorys->mid); ?>\n\n<?php if (empty($children)) { ?>\n          <li class=\"sm-sub-item\"><a class=\"sm-sub-link<?php if($this->is('category',$categorys->slug)): ?> current<?php endif;?>\" href=\"<?php $categorys->permalink(); ?>\"><?php $categorys->name(); ?></a></li>\n          <?php }  else { ?>\n          <li class=\"sm-sub-item\">\n            <a class=\"sm-sub-link sm-sub-link--split<?php if($this->is('category',$categorys->slug)): ?> current<?php endif;?>\" href=\"<?php $categorys->permalink(); ?>\"><?php $categorys->name(); ?></a\n            ><button class=\"sm-sub-link sm-sub-link--split sm-sub-toggler\" aria-label=\"Toggle\"></button>\n            <ul class=\"sm-sub\">\n                <?php foreach ($children as $mid) { ?>\n           <?php $child = $categorys->getCategory($mid); ?>\n              <li class=\"sm-sub-item\"><a class=\"sm-sub-link<?php if($this->is('category',$child['slug'])): ?> current<?php endif;?>\" href=\"<?php echo $child['permalink'] ?>\"><?php echo $child['name']; ?></a></li>\n              <?php } ?>\n              \n              \n            </ul>\n          </li>\n          <?php } ?>\n          <?php endif; ?><?php endwhile; ?>\n         \n                      \n         \n         \n        </ul>\n      </li>\n <?php endif; ?>\n        \n        <?php if(Bsoptions('PageMenu') !== \"3\"): ?>\n        <?php $this->widget('Widget_Contents_Page_List')->to($pages); ?>\n        <?php if($pages->have()): ?>\n<?php if(Bsoptions('PageMenu') == null || Bsoptions('PageMenu') == \"1\"): ?>\n<li class=\"sm-nav-item\">\n        <a class=\"sm-nav-link sm-sub-toggler<?php if($this->is('page')): ?> current<?php endif; ?>\">页面</a>\n        <ul class=\"sm-sub\">\n            <?php while($pages->next()): ?>\n          <li class=\"sm-sub-item\"><a class=\"sm-sub-link<?php if($this->is('page',$pages->slug)): ?> current<?php endif; ?>\" href=\"<?php $pages->permalink(); ?>\"><?php $pages->title(); ?></a></li>\n          <?php endwhile;?>\n          </ul>\n</li>\n\n<?php else:?>\n<?php while($pages->next()): ?>\n<li class=\"sm-nav-item\"><a class=\"sm-nav-link<?php if($this->is('page',$pages->slug)): ?> current<?php endif; ?>\" href=\"<?php $pages->permalink(); ?>\"><?php $pages->title(); ?></a></li>\n<?php endwhile;?>\n<?php endif;?>\n  <?php endif;?> \n  <?php endif;?> \n  \n  <?php if(is_array(Bsoptions('Menu'))):?>\n  <?php foreach (Bsoptions('Menu') as $item): \n    $menuText = $item['Menu_Text'];\n    $needLogin = !empty($item['Menu_LoginShow']);\n    if (empty(trim($menuText['url'])) && empty(trim($menuText['text']))) {\n        continue;\n    }\n    $url = !empty(trim($menuText['url'])) ? htmlspecialchars(trim($menuText['url'])) : 'javascript:;';\n    $text = !empty(trim($menuText['text'])) ? htmlspecialchars(trim($menuText['text'])) : '未命名导航';\n?>\n<li class=\"sm-nav-item<?= $needLogin ? ' need-login' : '' ?>\" \n    <?= $needLogin ? 'style=\"display:none\"' : '' ?>>\n    <a class=\"sm-nav-link\" href=\"<?= $url ?>\" \n       title=\"<?= $text ?>\"\n       <?= ($menuText['target'] === '_blank') ? 'target=\"_blank\"' : '' ?>>\n       <?= $text ?>\n    </a>\n</li>\n<?php endforeach; ?>\n<?php endif;?>\n\n<?php if(Bsoptions('Login_hidden') == true): ?>\n<li class=\"sm-nav-item\" id=\"bs-login\" style=\"display:none\"><a class=\"sm-nav-link\"><?php _e('登录'); ?></a></li>\n<li class=\"sm-nav-item\" id=\"bs-islogin\" style=\"display:none\"></li>\n<li class=\"sm-nav-item\" id=\"bs-islogin2\" style=\"display:none\"></li>\n<?php endif; ?>\n\n\n    </ul>\n  </div>\n</nav>\n<?php endif; ?>\n\n</div>\n<?php endif; ?>\n<div class=\"sticky\" id=\"sticky\">"
  },
  {
    "path": "compoment/sidebar.php",
    "content": "<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n<?php if(Bsoptions('Scroll') == true && Bsoptions('Scroll_Sidebar') == true): ?>\n<link href=\"<?php AssetsDir();?>assets/vendors/menutree/menutree.min.css?v=4\" rel=\"stylesheet\" />\n<?php endif; ?>\n\n<?php $this->need('pages/sidebar.php'); ?>\n\n  <?php if(Bsoptions('Scroll') == true && Bsoptions('Scroll_Sidebar') == true && $this->is('single')): ?>\n  <script src=\"<?php AssetsDir();?>assets/vendors/menutree/menutree.min.js?v=5\"></script>\n<script>\n       (function(){\n           if($('.post-content').length && $('.post-content').has('h1,h2,h3,h4,h5,h6').length){\n               $('.bsmenutree').show();\n    const defaults = Menutree.DEFAULTS;\n    let menutree;\n    defaults.title =  false, \n    defaults.selector = \"h1,h2,h3,h4,h5,h6\",\n    defaults.position = \"sticky\",\n    defaults.showCode = false,\n    defaults.stickyHeight = 0,\n    defaults.hasToolbar = false,\n    defaults.parentElement = \"#menutree\",\n    defaults.articleElement = \"#bs_toc_body\",\n    \n    menutree = new Menutree(Menutree.DEFAULTS);\n  }}) ();\n      \n  </script>\n  <?php endif; ?>"
  },
  {
    "path": "core/assetsdir.php",
    "content": "<?php\r\nfunction AssetsDir(){\r\n    $options1 = bsOptions::getInstance()::get_option( 'bearsimple' );\r\n    $options = Helper::options();\r\n    if($options1['Assets'] == '1' || $options1['Assets'] == null){\r\n        $dir = $options->themeUrl.'/';\r\n    }\r\n    else if($options1['Assets'] == '2'){\r\n        $dir = 'https://deliver.application.pub/gh/whitebearcode/typecho-bearsimple@v'.themeVersionOnly().'/';\r\n    }\r\n    else{\r\n        $dir = $options1['Assets_Custom'];\r\n    }\r\n    echo $dir;\r\n}\r\n\r\nfunction AssetsDir2(){\r\n   $options = Helper::options();\r\n        $dir = $options->themeUrl.'/';\r\n   \r\n    echo $dir;\r\n}\r\n\r\nfunction AssetsDir_Backend(){\r\n    $options1 = bsOptions::getInstance()::get_option( 'bearsimple' );\r\n    $options = Helper::options();\r\n    if($options1['Assets'] == '1' || $options1['Assets'] == null){\r\n        $dir = $options->themeUrl.'/';\r\n    }\r\n    else if($options1['Assets'] == '2'){\r\n        $dir = 'https://deliver.application.pub/gh/whitebearcode/typecho-bearsimple@v'.themeVersionOnly().'/';\r\n    }\r\n    else{\r\n        $dir = $options1['Assets_Custom'];\r\n    }\r\n    return $dir;\r\n}"
  },
  {
    "path": "core/compresshtml.php",
    "content": "<?php\nfunction ob_gzip($buffer, $level) {\n        if (ini_get('zlib.output_compression')) {\n            if (ini_get('zlib.output_compression_level') != $level) {\n                ini_set('zlib.output_compression_level', $level);\n            }\n            return $buffer;\n        }\n        if (headers_sent() || !extension_loaded('zlib') || !strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) {\n            return $buffer;\n        }\n\n        $out_buffer = gzencode($buffer, $level);\n        if (strlen($out_buffer) < strlen($buffer)) {\n            header('Content-Encoding: gzip');\n            header('Vary: Accept-Encoding');\n            header('Content-Length: ' . strlen($out_buffer));\n        } else {\n            $out_buffer = $buffer;\n        }\n        return $out_buffer;\n    }\n    \n\nfunction compressHtml($html_source) {\n    $chunks = preg_split('/(<!--<nocompress>-->.*?<!--<\\/nocompress>-->|<nocompress>.*?<\\/nocompress>|<pre.*?\\/pre>|<textarea.*?\\/textarea>|<script.*?\\/script>|<div class=\"mermaid\">.*?<\\/div>)/msi', $html_source, -1, PREG_SPLIT_DELIM_CAPTURE);\n    $compress = '';\n    foreach ($chunks as $c) {\n        if (strtolower(substr($c, 0, 19)) == '<!--<nocompress>-->') {\n            $c = substr($c, 19, strlen($c) - 19 - 20);\n            $compress .= $c;\n            continue;\n        } else if (strtolower(substr($c, 0, 12)) == '<nocompress>') {\n            $c = substr($c, 12, strlen($c) - 12 - 13);\n            $compress .= $c;\n            continue;\n        } else if (strtolower(substr($c, 0, 4)) == '<pre' || strtolower(substr($c, 0, 9)) == '<textarea'|| strtolower(substr($c, 0, 20)) == '<div class=\"mermaid\"') {\n            $compress .= $c;\n            continue;\n        } else if (strtolower(substr($c, 0, 7)) == '<script' && strpos($c, '//') != false && (strpos($c, \"\\r\") !== false || strpos($c, \"\\n\") !== false)) {\n            $tmps = preg_split('/(\\r|\\n)/ms', $c, -1, PREG_SPLIT_NO_EMPTY);\n            $c = '';\n            foreach ($tmps as $tmp) {\n                if (strpos($tmp, '//') !== false) {\n                    if (substr(trim($tmp), 0, 2) == '//') {\n                        continue;\n                    }\n                    $chars = preg_split('//', $tmp, -1, PREG_SPLIT_NO_EMPTY);\n                    $is_quot = $is_apos = false;\n                    foreach ($chars as $key => $char) {\n                        if ($char == '\"' && $chars[$key - 1] != '\\\\' && !$is_apos) {\n                            $is_quot = !$is_quot;\n                        } else if ($char == '\\'' && $chars[$key - 1] != '\\\\' && !$is_quot) {\n                            $is_apos = !$is_apos;\n                        } else if ($char == '/' && $chars[$key + 1] == '/' && !$is_quot && !$is_apos) {\n                            $tmp = substr($tmp, 0, $key);\n                            break;\n                        }\n                    }\n                }\n                $c .= $tmp;\n            }\n        }\n        $c = preg_replace('/[\\\\n\\\\r\\\\t]+/', ' ', $c);\n        $c = preg_replace('/\\\\s{2,}/', ' ', $c);\n        $c = preg_replace('/>\\\\s</', '> <', $c);\n        $c = preg_replace('/\\\\/\\\\*.*?\\\\*\\\\//i', '', $c);\n        $c = preg_replace('/<!--[^!]*-->/', '', $c);\n        $compress .= $c;\n    }\n    return $compress;\n}\n"
  },
  {
    "path": "core/curl.php",
    "content": "<?php\nnamespace Btools;\n/**\n * Curl封装类\n */\nclass Curl {\n\tprivate static $instance = null;\n\tprivate $cookie_jar;\n\tprivate $options;\n\tconst ua_android = 'Mozilla/5.0 (Linux; Android 10.0; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.134 Mobile Safari/537.36';\n\tconst ua_pc= 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.54';\n\tfunction __construct () {\n\t\t$this->cookie_jar = mb_convert_encoding(__DIR__, \"GBK\", \"UTF-8\") . DIRECTORY_SEPARATOR . 'cookie.txt';\n\t\t$this->options= [\n\t\tCURLOPT_HEADER => true, // 输出响应头\n\t\tCURLOPT_TIMEOUT=> 5,// 超时 秒\n\t\tCURLOPT_RETURNTRANSFER => true, // 输出数据流\n\t\tCURLOPT_FOLLOWLOCATION => true, // 自动跳转追踪\n\t\tCURLOPT_AUTOREFERER=> true, // 自动设置来路信息\n\t\tCURLOPT_SSL_VERIFYPEER => false,// 认证证书检查\n\t\tCURLOPT_SSL_VERIFYHOST => false,// 检查SSL加密算法\n\t\tCURLOPT_NOSIGNAL => true, // 忽略所有传递的信号\n\t\tCURLOPT_HTTPHEADER => [], // 请求头\n\t\tCURLINFO_HEADER_OUT=> true, // 获取请求头\n\t\tCURLOPT_ENCODING => 'gzip'\n\t\t];\n\t}\n\tpublic static function __callStatic ($method, $args) {\n\t\tif (self::$instance === null)\n\t\tself::$instance = new self();\n\t\treturn self::$instance->$method(...$args);\n\t}\n\tpublic function __call ($method, $args) {\n\t\tswitch ($method) {\n\t\t\tcase 'autoCookie': // Cookie自动化，默认关闭\n\t\t\tif (@$args[0]) {\n\t\t\t\t$this->options[CURLOPT_COOKIEFILE] = $this->cookie_jar;\n\t\t\t\t$this->options[CURLOPT_COOKIEJAR]= $this->cookie_jar;\n\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'timeout':\n\t\t\tif (isset($args[0]))\n\t\t\t$this->options[CURLOPT_TIMEOUT] = $args[0];\n\t\t\tbreak;\n\t\t\tcase 'location': // 自动重定向，默认开启\n\t\t\tif (isset($args[0]))\n\t\t\t$this->options[CURLOPT_FOLLOWLOCATION] = $args[0];\n\t\t\tbreak;\n\t\t\tcase 'get':\n\t\t\tif (isset($args[0])) {\n\t\t\t\t$data = isset($args[1]) ? is_array($args[1]) ? http_build_query($args[1], '', '&', PHP_QUERY_RFC3986) : $args[1] : false;\n\t\t\t\t$this->options[CURLOPT_URL] = $data !== false ? $args[0] . (preg_match('/\\?/', $args[0]) ? '&' : '?') . $data : $args[0];\n\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'upload':\n\t\t\tif (isset($args[0])) {\n\t\t\t\t$this->options[CURLOPT_URL]= $args[0];\n\t\t\t\t$this->options[CURLOPT_POST] = true;\n\t\t\t\tif (isset($args[1]))\n\t\t\t\t$this->options[CURLOPT_POSTFIELDS] = $args[1];\n\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'post':\n\t\t\tif (isset($args[0])) {\n\t\t\t\t$this->options[CURLOPT_URL]= $args[0];\n\t\t\t\t$this->options[CURLOPT_POST] = true;\n\t\t\t\tif (isset($args[1]))\n\t\t\t\t$this->options[CURLOPT_POSTFIELDS] = is_array($args[1]) ? http_build_query($args[1], '', '&', PHP_QUERY_RFC3986) : $args[1];\n\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'json':\n\t\t\tif (isset($args[0])) {\n\t\t\t\t$this->options[CURLOPT_URL]= $args[0];\n\t\t\t\t$this->options[CURLOPT_POST] = true;\n\t\t\t\t$this->options[CURLOPT_HTTPHEADER][] = 'Content-Type: application/json; charset=utf-8';\n\t\t\t\tif (!empty(@$args[1]))\n\t\t\t\t$this->options[CURLOPT_POSTFIELDS] = is_array($args[1]) ? json_encode($args[1], 256) : $args[1];\n\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'ua':\n\t\t\tif (isset($args[0])) {\n\t\t\t\tif (in_array(strtolower($args[0]), ['m', 'wap', 'android']))\n\t\t\t\t$args[0] = self::ua_android; else if (strtolower($args[0]) === 'pc')\n\t\t\t\t$args[0] = self::ua_pc; else if (strtolower($args[0]) === 'audo')\n\t\t\t\t$args[0] = @$_SERVER['HTTP_USER_AGENT'];\n\t\t\t\t$this->options[CURLOPT_USERAGENT] = $args[0];\n\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'referer':\n\t\t\tif (isset($args[0]))\n\t\t\t$this->options[CURLOPT_REFERER] = $args[0] === true && !empty(@$this->options[CURLOPT_URL]) ? $this->options[CURLOPT_URL] : $args[0];\n\t\t\tbreak;\n\t\t\tcase 'header': // 来路\n\t\t\tif (isset($args[0])) {\n\t\t\t\tif (is_array($args[0])) {\n\t\t\t\t\t// 数组键值对形式\n\t\t\t\t\tforeach ($args[0] as $k => $v)\n\t\t\t\t\t$this->options[CURLOPT_HTTPHEADER][] = $k . ': ' . $v;\n\t\t\t\t} else if (isset($args[1])) {\n\t\t\t\t\t// 双参数键值形式\n\t\t\t\t\t$this->options[CURLOPT_HTTPHEADER][] = $args[0] . ': ' . $args[1];\n\t\t\t\t} else {\n\t\t\t\t\t// 单参数形式\n\t\t\t\t\t$arr = preg_match_all('/([^:]*?)\\s*:\\s*(.*)\\s*/', $args[0], $m) > 0 ? array_combine($m[1], $m[2]) : [];\n\t\t\t\t\tforeach ($arr as $k => $v)\n\t\t\t\t\t$this->options[CURLOPT_HTTPHEADER][] = $k . ': ' . $v;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'cookie':\n\t\t\tif (isset($args[0])) {\n\t\t\t\tif (is_array($args[0])) {\n\t\t\t\t\t// 数组键值对形式\n\t\t\t\t\t$arr = [];\n\t\t\t\t\tforeach ($args[0] as $k => $v)\n\t\t\t\t\t$arr[] = $k . '=' . $v;\n\t\t\t\t\t$cookie = implode('; ', $arr);\n\t\t\t\t} else if (isset($args[1])) // 双参数键值形式\n\t\t\t\t$cookie = $args[0] . '=' . $args[1] . ';'; else // 单参数形式\n\t\t\t\t$cookie = $args[0];\n\t\t\t\t$this->options[CURLOPT_COOKIE] = !empty(@$this->options[CURLOPT_COOKIE]) ? $this->options[CURLOPT_COOKIE]\n\t\t\t\t. (preg_match('/;\\s*$/', $this->options[CURLOPT_COOKIE]) ? '' : '; ') . $cookie : $cookie;\n\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'ajax':\n\t\t\tif (isset($args[0]) && $args[0] === true)\n\t\t\t$this->options[CURLOPT_HTTPHEADER][] = 'X-Requested-With: XMLHttpRequest';\n\t\t\tbreak;\n\t\t\tcase 'getCookie': // 读取Cookie文件中的cookie\n\t\t\t$url= isset($args[0]) && filter_var($args[0], FILTER_VALIDATE_URL) ? $args[0] : $this->options[CURLOPT_URL];\n\t\t\t$cookie = @file_get_contents($this->cookie_jar);\n\t\t\t$arr= parse_url($url);\n\t\t\t$host = preg_replace('/.*?\\.(?=.+\\..+$)/', '', $arr['host']);\n\t\t\t$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);\n\t\t\treturn $p > 0 ? array_combine($m[5], $m[6]) : [];\n\t\t\tcase 'head': // 获取响应头，默认不需要响应体，false表示需要\n\t\t\t$this->options[CURLOPT_HEADER] = true;\n\t\t\t$this->options[CURLOPT_NOBODY] = true;\n\t\t\treturn $this->request($method, $args);\n\t\t\tcase 'html':\n\t\t\tcase 'obj':\n\t\t\tcase 'xml':\n\t\t\tcase 'text':\n\t\t\tcase 'body':\n\t\t\tcase 'arrayobject':\n\t\t\tcase 'jsonobject':\n\t\t\tcase 'response':\n\t\t\tcase 'all':\n\t\t\treturn $this->request($method, $args);\n\t\t\tcase 'down':\n\t\t\t$this->options[CURLOPT_HEADER] = false;\n\t\t\t$this->options[CURLOPT_NOBODY] = false;\n\t\t\t$this->options[CURLOPT_FOLLOWLOCATION] = true;\n\t\t\treturn $this->request($method, $args);\n\t\t\tdefault:\n\t\t\texit(\"错误：不支持{$method}方法！\");\n\t\t}\n\t\treturn $this;\n\t}\n\t//执行请求(get, post)并返回数据\n\tprivate function request ($method, $args) {\n\t\t$ch = curl_init();\n\t\tcurl_setopt_array($ch, $this->options);\n\t\t$data = curl_exec($ch);\n\t\t$info = curl_getinfo($ch);\n\t\tcurl_close($ch);\n\t\tif ($method === 'down') {\n\t\t\tif (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);\n\t\t\ttry {\n\t\t\t\t$fo = fopen($file, 'a');\n\t\t\t\tfwrite($fo, $data);\n\t\t\t\tfclose($fo);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcatch (\\Exception $e) {\n\t\t\t\treturn $e->getMessage();\n\t\t\t}\n\t\t}\n\t\t$info['header'] = trim(substr($data, 0, $info['header_size']));\n\t\t$info['response'] = substr($data, $info['header_size']);\n\t\t$headers = [$info['http_code']];\n\t\t$p = preg_match_all('/(?<=^|[\\r\\n])\\s*([^:]+)\\s*:\\s*(.+?)\\s*(?=[\\r\\n]|$)/', $info['header'], $n);\n\t\t$info['headers'] = $p > 0 ? array_merge_recursive($headers, $this->array_combine_recursive($n[1], $n[2])) : [];\n\t\t$cookies = isset($info['headers']['Set-Cookie']) ? $info['headers']['Set-Cookie'] : @$info['headers']['set-cookie'];\n\t\t$info['cookies'] = !empty($cookies) ? $this->parse_cookie(is_array($cookies) ? $cookies : [$cookies]) : [];\n\t\t$info['cookie']= !empty($info['cookies']) ? array_column($info['cookies'], 'value', 'key') : [];\n\t\t$info['obj'] = ($obj = json_decode($info['response'])) && is_object($obj) ? $obj : null;\n\t\t$result = $info['response'];\n\t\tswitch ($method) {\n\t\t\tcase 'head':\n\t\t\t$result = $info[@$args[0] ? 'header' : 'headers'];\n\t\t\tbreak;\n\t\t\tcase 'getCookie':\n\t\t\t$result = $info['cookie'];\n\t\t\tbreak;\n\t\t\tcase 'text':\n\t\t\tcase 'body':\n\t\t\tcase 'response':\n\t\t\tcase 'html':\n\t\t\t$result = $info['response'];\n\t\t\tif (isset($args[0]))\n\t\t\t$result = mb_convert_encoding($result, 'UTF-8', $args[0]);\n\t\t\tif ($method === 'html')\n\t\t\t$result = html_entity_decode($result);\n\t\t\tbreak;\n\t\t\tcase 'obj':\n\t\t\t$result = json_decode($info['response'], @$args[0] === true);\n\t\t\tbreak;\n\t\t\tcase 'jsonobject':\n\t\t\tcase 'arrayobject':\n\t\t\t$result = json_decode($info['response'],true);\n\t\t\tbreak;\n\t\t\tcase 'xml':\n\t\t\t$result = simplexml_load_string($info['response'], 'SimpleXMLElement', LIBXML_NOCDATA);\n\t\t\tbreak;\n\t\t\tcase 'all':\n\t\t\t$result = isset($args[0]) ? @$info[$args[0]] : $info;\n\t\t\tbreak;\n\t\t}\n\t\tself::$instance = null;\n\t\treturn $result;\n\t}\n\tprivate function array_combine_recursive ($keys, $values) {\n\t\t$arr = [];\n\t\tforeach ($keys as $i => $key) {\n\t\t\t$value = isset($values[$i]) ? $values[$i] : null;\n\t\t\tif (!isset($arr[$key]))\n\t\t\t$arr[$key] = $value; else if (is_array($arr[$key]))\n\t\t\t$arr[$key][] = $value; else\n\t\t\t$arr[$key] = [$arr[$key], $value];\n\t\t}\n\t\treturn $arr;\n\t}\n\tprivate function parse_cookie ($header) {\n\t\t$parse_cookie_str = function ($str) {\n\t\t\t$p= preg_match_all('/(?<=^|;)\\s*([^=]+?)\\s*=\\s*(.*?)\\s*(?=;|$)/', $str, $m);\n\t\t\t$i= 0;\n\t\t\t$cookie = [];\n\t\t\twhile ($i < $p) {\n\t\t\t\tif ($i === 0) {\n\t\t\t\t\t$cookie['key'] = $m[1][$i];\n\t\t\t\t\t$cookie['value'] = $m[2][$i];\n\t\t\t\t} else if ($m[1][$i] === 'expires') {\n\t\t\t\t\t$d = date_create($m[2][$i], timezone_open(\"Asia/Shanghai\"));\n\t\t\t\t\t$timestamp = $d->getTimestamp();\n\t\t\t\t\t$cookie[$m[1][$i]] = $timestamp;\n\t\t\t\t} else\n\t\t\t\t$cookie[$m[1][$i]] = $m[2][$i];\n\t\t\t\t$i++;\n\t\t\t}\n\t\t\treturn $cookie;\n\t\t};\n\t\t$cookies = [];\n\t\tif (is_array($header)) {\n\t\t\tforeach ($header as $cookie) {\n\t\t\t\t$cookie = $parse_cookie_str($cookie);\n\t\t\t\tif (!empty($cookie))\n\t\t\t\t$cookies[$cookie['key']] = $cookie;\n\t\t\t}\n\t\t} else if (is_string($header)) {\n\t\t\t$p = preg_match_all('/(?<=^|[\\r\\n])\\s*Set-Cookie\\s*:\\s*(.+?)(?=[\\r\\n]|$)/i', $header, $m);\n\t\t\t$i = 0;\n\t\t\twhile ($i < $p) {\n\t\t\t\t$cookie = $parse_cookie_str($m[1][$i]);\n\t\t\t\tif (!empty($cookie))\n\t\t\t\t$cookies[$cookie['key']] = $cookie;\n\t\t\t\t$i++;\n\t\t\t}\n\t\t}\n\t\treturn $cookies;\n\t}\n}"
  },
  {
    "path": "core/extend/ChinesePinyin.class.php",
    "content": "<?php\r\n/*\r\n**\r\n*\r\n* 汉字转拼音带声调封装类\r\n* Date: 27/12/2021\r\n*\r\n**\r\n*/\r\nclass ChinesePinyin{\r\n\tprivate $ChineseCharacters;\r\n\tprivate $charset = 'utf-8';\r\n\tpublic function __construct(){\r\n\t\t  $this->ChineseCharacters = file_get_contents(dirname(__FILE__).'/pinyin.lang');\t\r\n\t}\r\n\tpublic function TransformWithTone($input_char,$delimiter=' ',$outside_ignore=false){\r\n\t\t$input_len = mb_strlen($input_char,$this->charset);\r\n\t\t$output_char = '';\r\n\t\tfor($i=0;$i<$input_len;$i++){\r\n\t\t\t$word = mb_substr($input_char,$i,1,$this->charset);\r\n\t\t\tif(preg_match('/^[\\x{4e00}-\\x{9fa5}]$/u',$word) && preg_match('/\\,'.preg_quote($word).'(.*?)\\,/',$this->ChineseCharacters,$matches) ){\r\n\t\t\t\t$output_char.=$matches[1].$delimiter;\r\n\t\t\t}else if(!$outside_ignore){\r\n\t\t\t\t$output_char.=$word;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn $output_char;\r\n\t}\r\n}"
  },
  {
    "path": "core/extend/Comments.php",
    "content": "<?php\nif (!defined('__TYPECHO_ROOT_DIR__')) exit;\nrequire 'vendor/autoload_538.php';\nuse MaxMind\\Db\\Reader;\nuse Widget\\Base\\Comments;\nuse Widget\\Base\\Contents;\nclass Bearsimple_Widget_Comments_Archive extends Widget_Abstract_Comments\n{\n     /**\n     * 当前页\n     *\n     * @access private\n     * @var integer\n     */\n    private $_currentPage;\n    /**\n     * 所有文章个数\n     *\n     * @access private\n     * @var integer\n     */\n    private $_total = false;\n\n    /**\n     * 子父级评论关系\n     *\n     * @access private\n     * @var array\n     */\n    private $_threadedComments = array();\n\n    /**\n     * 多级评论回调函数\n     * \n     * @access private\n     * @var mixed\n     */\n    private $_customThreadedCommentsCallback = false;\n\n    /**\n     * _singleCommentOptions  \n     * \n     * @var mixed\n     * @access private\n     */\n    private $_singleCommentOptions = NULL;\n\n\n    private $_commentAuthors = array();\n\n    /**\n     * 安全组件\n     */\n    private $_security = NULL;\n\n    /**\n     * 构造函数,初始化组件\n     *\n     * @access public\n     * @param mixed $request request对象\n     * @param mixed $response response对象\n     * @param mixed $params 参数列表\n     * @return void\n     */\n    public function __construct($request, $response, $params = NULL)\n    {\n        \n        parent::__construct($request, $response, $params);\n        $this->parameter->setDefault('parentId=0&commentPage=0&commentsNum=0&allowComment=1');\n        \n        Typecho_Widget::widget('Widget_Security')->to($this->_security);\n\n        /** 初始化回调函数 */\n        if (function_exists('threadedComments')) {\n            $this->_customThreadedCommentsCallback = true;\n        }\n    }\n    public static function formatProvince(string $province) : string\n    {\n        if(empty($province)) {\n            return '';\n        }\n \n        $checkArr = [\"省\",\"市\",\"自治区\",\"特别行政区\"];\n \n        for($i = 0; $i < count($checkArr); $i++) {\n            if(strpos($province, $checkArr[$i]) === false) {\n                continue;\n            } else {\n                $province = mb_strcut($province, 0, strrpos($province, $checkArr[$i]));\n            }\n        }\n \n        return $province;\n    }\n     public static function GetAddress($ip){\n         $IPlo = new IpLocation;\n         if(empty($IPlo::getLocation($ip)['province'])){\n             return $IPlo::getLocation($ip)['country'];\n         }\n         else{\n             return self::formatProvince($IPlo::getLocation($ip)['province']);\n         }\n     }\n     public static function getIpInfo($ip){\n$url = 'https://ip.zxinc.org/api.php?type=json&ip='.$ip;\n$headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0';\nforeach( $headers as $n => $v )\n{ $headerArr[] = $n .':' . $v; }\n    $ch = curl_init();  \n    curl_setopt($ch,CURLOPT_URL,$url);\n    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);  \n    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,3);  \n    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n    curl_setopt ($ch, CURLOPT_HTTPHEADER , $headerArr );\n    $handles = curl_exec($ch);  \n    curl_close($ch);  \n    $info = json_decode($handles,true)['data']['country'];\n  \n    return $info;\n     }\n     \n public static function getLocation($comments)\n    {\n        $databaseFile = __DIR__.'/vendor/maxmind-db/GeoLite2-City.mmdb';\n        $db = \\Typecho\\Db::get();\n        $prefix = $db->getPrefix();\n        $coid = $comments->coid;\n        $data = $db->fetchRow($db->select()->from('table.bscore_iplocation_data')->where('coid = ?', $coid));\n        if(!$data['location']){\n            if (!filter_var($comments->ip, FILTER_VALIDATE_IP)) {\n                $location = \"外星来客\";\n            }\n            else{\n           $reader = new Reader($databaseFile);\n    $ipAddress = $comments->ip;\n    $record = $reader->get($ipAddress);\n    $location = ($record['country']['names']['zh-CN'] ?? '未知').($record['subdivisions'][0]['names']['zh-CN'] ?? '').($record['city']['names']['zh-CN'] ?? ''); \n    $reader->close();\n        }\n        }\n        else{\n          $location = $data['location']; \n        }\n        echo $location;\n    }\n\n    public static function updateLocation(int $coid, $location,$type)\n    {\n        $db = \\Typecho\\Db::get();\n        $location = is_array($location) ? serialize($location) : $location;\n        $result = $db->fetchAll($db->select('coid')->from('table.comments')->where('table.comments.coid = ?', $coid));\n        if (is_array($result) && count($result) && $type== 'ipv6') {\n            $updateQuery = $db->update('table.comments')->rows(array('ipv6_location' => $location))->where('coid = ?', $coid);\n            return $db->query($updateQuery) > 0;\n        }\n         if (is_array($result) && count($result) && $type== 'ipv4') {\n\n            $updateQuery = $db->update('table.comments')->rows(array('ipv4_location' => $location))->where('coid = ?', $coid);\n\n            return $db->query($updateQuery) > 0;\n        }\n        return false;\n    }\n    \n     public function commentRank($i){\n          $db=\\Typecho\\Db::get();\n    $mail=$db->fetchAll($db->select(array('COUNT(cid)'=>'all'))->from('table.comments')->where('mail = ?', $i->mail)->where('authorId = ?','0'));\n    foreach ($mail as $sl){\n    $all=$sl['all'];}\n    if($i->authorId == $i->ownerId){\n    echo '<div class=\"ui circular mini black label bstooltip bstooltip--top\" data-bstooltip=\"博主\" style=\"vertical-align: middle;\"><i class=\"user tie icon\"></i>博主</div>';\n    }\n    else if($all<10 && $all>0) {\n    echo '<div class=\"ui circular mini label bstooltip bstooltip--top\" data-bstooltip=\"等级LV1，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV1</div>';\n    }elseif ($all<20 && $all>=10) {\n    echo '<div class=\"ui circular mini green label bstooltip bstooltip--top\" data-bstooltip=\"等级LV2，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV2</div>';\n    }elseif ($all<40 && $all>=20) {\n    echo '<div class=\"ui circular mini olive label bstooltip bstooltip--top\" data-bstooltip=\"等级LV3，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV3</div>';\n    }elseif ($all<80 && $all>=40) {\n    echo '<div class=\"ui circular mini yellow label bstooltip bstooltip--top\" data-bstooltip=\"等级LV4，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV4</div>';\n    }elseif ($all<100 && $all>=80) {\n    echo '<div class=\"ui circular mini orange label bstooltip bstooltip--top\" data-bstooltip=\"等级LV5，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV5</div>';\n    }elseif ($all>=100) {\n    echo '<div class=\"ui circular mini red label bstooltip bstooltip--top\" data-bstooltip=\"等级LV6，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV6</div>';\n    }\n     }\n     \n    \n    /**\n     * 评论回调函数\n     * \n     * @access private\n     * @return void\n     */\n    private function threadedCommentsCallback()\n    {\n\n        $singleCommentOptions = $this->_singleCommentOptions;\n        if (function_exists('threadedComments')) {\n            return threadedComments($this, $singleCommentOptions);\n        }\n     if(Bsoptions('emaction_Openplace') && in_array('2',Bsoptions('emaction_Openplace'))&& Bsoptions('emaction_Closelike') == true){\n       $emaction = true;\n   }\n   else{\n       $emaction = false;\n   }\n        \n?>\n\n<div class=\"ui comments\" style=\"max-width:100%;\">\n<div id=\"<?php $this->theId(); ?>\" class=\"<?php\n    if ($this->levels <= 0) {?>ui grey segment<?php }?> comment-body<?php\n    if ($this->levels > 0) {\n        echo ' comment-child';\n        $this->levelsAlt(' comment-level-odd', ' comment-level-even');\n    } else {\n        echo ' comment-parent';\n    }\n    $this->alt(' comment-odd', ' comment-even');\n    echo $commentClass;\n\n?>\">\n    <?php if ($this->user->hasLogin() && $this->status == 'waiting') {\n    echo '<div class=\"floating ui yellow label\">待审核</div>';\n    }?>\n    <div class=\"comment\"<?php if(Bsoptions('avatar__choose') == 'closeavatar'):?> style=\"margin-left:10px\"<?php endif; ?>>\n        <?php if(Bsoptions('avatar__choose') !== 'closeavatar'):?>\n<a class=\"avatar\" style=\"margin-top:0.5px\">\n      <img src=\"<?php echo imgravatarq($this->mail); ?>\" loading=\"lazy\">\n    </a>\n<?php endif; ?>\n\n    <div class=\"content\">\n      <span class=\"author\"><?php CommentAuthor($this); ?></span> <?php $this->commentRank($this); ?>                 <?php if(Bsoptions('Comment_useragent') == true): ?> <?php BearsimpleUserAgent::render($this->agent,'comment'); ?><?php endif; ?> <span><?php echo $this->getParent(); ?></span><br>\n      <div class=\"metadata\" style=\"margin-top:5px;margin-left:auto\">\n        <span class=\"date\"><?php $singleCommentOptions->beforeDate();\n                echo date('Y-m-d', $this->created);\n                $singleCommentOptions->afterDate(); ?></span>\n                <?php if(Bsoptions('Comment_ipget') == true): ?><span class=\"date\">IP属地：<?php self::getLocation($this); ?></span><?php endif; ?>\n\n      </div>\n      <div class=\"text\">\n          <?php if(Bsoptions('Comment_private') == true):?>\n          <?php echo reEmo($this->content,'comment'); ?>\n          <?php else:?>\n          <div class=\"<?php if(Bsoptions('avatar__choose') !== 'closeavatar'):?>comment-excerpta<?php else:?>comment-excerptb<?php endif; ?> break\"><?php echo reEmo($this->content,'comment'); ?> </div>\n          <?php endif; ?>\n       \n       <?php if(Bsoptions('emaction_Openplace') && in_array('1',Bsoptions('emaction_Openplace'))):?>  \n       <emoji-reaction theme=\"light\" endpoint=\"<?php getEmactionAction();?>\" reacttargetid=\"comment-<?php echo $this->coid;?>\" style=\"flex-wrap: nowrap; max-width: 100%; display: flex; gap: 0.375rem;height: 1.5rem;<?php if(Bsoptions('avatar__choose') !== 'closeavatar'):?>margin-left:-40px;<?php else:?>margin-top:10px;<?php endif;?>margin-bottom:10px\"></emoji-reaction> \n       <?php endif;?>\n       </div> \n      \n      \n      <div class=\"actions\"<?php if(Bsoptions('avatar__choose') !== 'closeavatar'):?> style=\"margin-left:-40px\"<?php endif; ?>>\n          \n                    <?php if(Bsoptions('CommentClose') == true):?>\n        <?php $this->reply($singleCommentOptions->replyWord); ?>\n                  <?php endif; ?>\n        <?php if ($this->children) { ?><a class=\"slickcomment\" id=\"bs<?php $this->theId(); ?>\" data-count=\"<?php echo count($this->children);?>\">展开子评论(<?php echo count($this->children);?>条)</a><?php } ?>\n         <?php if(Bsoptions('Comment_like') == true && $emaction == false): ?>\n           <?php $agree = $this->hidden?array('agree' => 0, 'recording' => true):agreeNumforcomment($this->coid);?>\n           <i id=\"commentlike\" class=\"like thumbs up red link icon\" data-coid=\"<?php echo $this->coid; ?>\"></i><font color=gray class=\"agreenumcomment<?php echo $this->coid; ?>\"><?php echo $agree['agree']; ?></font>\n           <?php endif; ?>\n          \n      </div>\n    </div>\n    <?php if ($this->children) { ?>\n    \n    <div class=\"ui segment comment-children bs<?php $this->theId(); ?>\" style=\"display:none\">\n        <?php $this->threadedComments(); ?>\n    </div>\n    <?php } ?>\n</div>  </div></div>\n\n<?php\n    }\n  \n    private function getParent(){\n        $db = \\Typecho\\Db::get();\n        $parentID = $db->fetchRow($db->select('parent')->from('table.comments')->where('coid = ?', $this->coid));\n        $parentID=$parentID['parent'];\n        if($parentID=='0'){ return '';}\n        else {\n            $author=$db->fetchRow($db->select()->from('table.comments')->where('coid = ?', $parentID));\n            if (empty($author['author']) ||!array_key_exists('author', $author) )\n                $author['author'] = '已删除的评论';\n            return '  <i class=\"at icon\" style=\"margin:auto\"></i><a href=\"#comment-'.$parentID.'\"> '.$author['author'].'</a> ';\n        }\n    }  \n\n    \n    \n    /**\n     * 获取当前评论链接\n     *\n     * @access protected\n     * @return string\n     */\n    protected function ___permalink() : string\n    {\n\n        if ($this->options->commentsPageBreak) {            \n            $pageRow = array('permalink' => $this->parentContent['pathinfo'], 'commentPage' => $this->_currentPage);\n            return Typecho_Router::url('comment_page',\n                        $pageRow, $this->options->index) . '#' . $this->theId;\n        }\n        \n        return $this->parentContent['permalink'] . '#' . $this->theId;\n    }\n\n    /**\n     * 子评论\n     *\n     * @access protected\n     * @return array\n     */\n    protected function ___children()\n    {\n        return $this->options->commentsThreaded && !$this->isTopLevel && isset($this->_threadedComments[$this->coid]) \n            ? $this->_threadedComments[$this->coid] : array();\n    }\n\n    /**\n     * 是否到达顶层\n     *\n     * @access protected\n     * @return boolean\n     */\n    protected function ___isTopLevel()\n    {\n        return $this->levels > 0;\n    }\n\n    /**\n     * 重载内容获取\n     *\n     * @access protected\n     * @return void\n     */\n    protected function ___parentContent(): Array\n    {\n        return $this->parameter->parentContent;\n    }\n\n    /**\n     * 输出文章评论数\n     *\n     * @access public\n     * @param string $string 评论数格式化数据\n     * @return void\n     */\n    public function num()\n    {\n        $args = func_get_args();\n        if (!$args) {\n            $args[] = '%d';\n        }\n\n        $num = intval($this->_total);\n\n        echo sprintf(isset($args[$num]) ? $args[$num] : array_pop($args), $num);\n    }\n  \n  \n    \n    \n    \n    /**\n     * 执行函数\n     *\n     * @access public\n     * @return void\n     */\n    public function execute()\n    {\n        if (!$this->parameter->parentId) {\n            return;\n        }\n$commentsAuthor = Typecho_Cookie::get('__typecho_remember_author');\n        $commentsMail = Typecho_Cookie::get('__typecho_remember_mail');\n\n        // 对已登录用户显示待审核评论，方便前台管理\n        if ($this->user->hasLogin()) {\n            $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId)\n                ->where('table.comments.status = ? OR table.comments.status = ?', 'approved', 'waiting');\n        } else {\n            $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId)\n                ->where('table.comments.status = ? OR (table.comments.author = ? AND table.comments.mail = ? AND table.comments.status = ?)', 'approved', $commentsAuthor, $commentsMail, 'waiting');\n        }\n        \n\n        $threadedSelect = NULL;\n        \n        if ($this->options->commentsShowCommentOnly) {\n            $select->where('table.comments.type = ?', 'comment');\n        }\n        \n        $select->order('table.comments.coid', 'ASC');\n        $this->db->fetchAll($select, array($this, 'push'));\n        \n        /** 需要输出的评论列表 */\n        $outputComments = array();\n        \n        /** 如果开启评论回复 */\n        if ($this->options->commentsThreaded) {\n        \n            foreach ($this->stack as $coid => &$comment) {\n                \n                /** 取出父节点 */\n                $parent = $comment['parent'];\n            \n                /** 如果存在父节点 */\n                if (0 != $parent && isset($this->stack[$parent])) {\n                \n                    /** 如果当前节点深度大于最大深度, 则将其挂接在父节点上 */\n                    if ($comment['levels'] >= 2) {\n                        $comment['levels'] = $this->stack[$parent]['levels'];\n                        $parent = $this->stack[$parent]['parent'];     // 上上层节点\n                        $comment['parent'] = $parent;\n                    }\n                \n                    /** 计算子节点顺序 */\n                    $comment['order'] = isset($this->_threadedComments[$parent]) \n                        ? count($this->_threadedComments[$parent]) + 1 : 1;\n                \n                    /** 如果是子节点 */\n                    $this->_threadedComments[$parent][$coid] = $comment;\n                } else {\n                    $outputComments[$coid] = $comment;\n                }\n                \n            }\n        \n            $this->stack = $outputComments;\n        }\n        \n        /** 评论排序 */\n        if ('DESC' == $this->options->commentsOrder) {\n            $this->stack = array_reverse($this->stack, true);\n        }\n        \n        /** 评论总数 */\n        $this->_total = count($this->stack);\n        \n        /** 对评论进行分页 */\n        if ($this->options->commentsPageBreak) {\n            if ('last' == $this->options->commentsPageDisplay && !$this->parameter->commentPage) {\n                $this->_currentPage = ceil($this->_total / $this->options->commentsPageSize);\n            } else {\n                $this->_currentPage = $this->parameter->commentPage ? $this->parameter->commentPage : 1;\n            }\n            \n            /** 截取评论 */\n            $this->stack = array_slice($this->stack,\n                ($this->_currentPage - 1) * $this->options->commentsPageSize, $this->options->commentsPageSize);\n            \n            /** 评论置位 */\n            $this->row = current($this->stack);\n            $this->length = count($this->stack);\n        }\n        \n        reset($this->stack);\n    }\n\n    /**\n     * 将每行的值压入堆栈\n     *\n     * @access public\n     * @param array $value 每行的值\n     * @return array\n     */\n    public function push(array $value) : array\n    {\n        $value = $this->filter($value);\n        \n        /** 计算深度 */\n        if (0 != $value['parent'] && isset($this->stack[$value['parent']]['levels'])) {\n            $value['levels'] = $this->stack[$value['parent']]['levels'] + 1;\n        } else {\n            $value['levels'] = 0;\n        }\n\n        $value['realParent'] = $value['parent'];\n\n        /** 重载push函数,使用coid作为数组键值,便于索引 */\n        $this->stack[$value['coid']] = $value;\n        $this->_commentAuthors[$value['coid']] = $value['author'];\n        $this->length ++;\n        \n        return $value;\n    }\n\n    /**\n     * 输出分页\n     *\n     * @access public\n     * @param string $prev 上一页文字\n     * @param string $next 下一页文字\n     * @param int $splitPage 分割范围\n     * @param string $splitWord 分割字符\n     * @param string $template 展现配置信息\n     * @return void\n     */\n    public function pageNav($prev = '&laquo;', $next = '&raquo;', $splitPage = 3, $splitWord = '...', $template = '')\n    {\n        if ($this->options->commentsPageBreak && $this->_total > $this->options->commentsPageSize) {\n            $default = array(\n                'wrapTag'       =>  'ol',\n                'wrapClass'     =>  'page-navigator'\n            );\n\n            if (is_string($template)) {\n                parse_str($template, $config);\n            } else {\n                $config = $template;\n            }\n\n            $template = array_merge($default, $config);\n\n            $pageRow = $this->parameter->parentContent;\n            $pageRow['permalink'] = $pageRow['pathinfo'];\n\n            $query = Typecho_Router::url('comment_page', $pageRow, $this->options->index);\n\n            /** 使用盒状分页 */\n            $nav = new Typecho_Widget_Helper_PageNavigator_Box($this->_total,\n                $this->_currentPage, $this->options->commentsPageSize, $query);\n            $nav->setPageHolder('commentPage');\n            $nav->setAnchor('comments');\n            \n            echo '<' . $template['wrapTag'] . (empty($template['wrapClass']) \n                    ? '' : ' class=\"' . $template['wrapClass'] . '\"') . '>';\n            $nav->render($prev, $next, $splitPage, $splitWord, $template);\n            echo '</' . $template['wrapTag'] . '>';\n        }\n    }\n\n    /**\n     * 递归输出评论\n     *\n     * @access protected\n     * @return void\n     */\n    public function threadedComments()\n    {\n        $children = $this->children;\n        if ($children) {\n            //缓存变量便于还原\n            $tmp = $this->row;\n            $this->sequence ++;\n\n            //在子评论之前输出\n            echo $this->_singleCommentOptions->before;\n\n            foreach ($children as $child) {\n                $this->row = $child;\n                $this->threadedCommentsCallback();\n                $this->row = $tmp;\n            }\n\n            //在子评论之后输出\n            echo $this->_singleCommentOptions->after;\n\n            $this->sequence --;\n        }\n    }\n    \n    /**\n     * 列出评论\n     * \n     * @access private\n     * @param mixed $singleCommentOptions 单个评论自定义选项\n     * @return void\n     */\n    public function listComments($singleCommentOptions = NULL)\n    {\n        //初始化一些变量\n        $this->_singleCommentOptions = Typecho_Config::factory($singleCommentOptions);\n        $this->_singleCommentOptions->setDefault(array(\n            'before'        =>  '<ol class=\"comment-list\">',\n            'after'         =>  '</ol>',\n            'beforeAuthor'  =>  '',\n            'afterAuthor'   =>  '',\n            'beforeDate'    =>  '',\n            'afterDate'     =>  '',\n            'dateFormat'    =>  $this->options->commentDateFormat,\n            'replyWord'     =>  '回复',\n            'commentStatus' =>  '评论正等待审核!',\n            'avatarSize'    =>  32,\n            'defaultAvatar' =>  NULL\n        ));\n        $this->pluginHandle()->trigger($plugged)->listComments($this->_singleCommentOptions, $this);\n\n        if (!$plugged) {\n            if ($this->have()) { \n                echo $this->_singleCommentOptions->before;\n            \n                while ($this->next()) {\n                    $this->threadedCommentsCallback();\n                }\n            \n                echo $this->_singleCommentOptions->after;\n            }\n        }\n    }\n    \n    /**\n     * 重载alt函数,以适应多级评论\n     * \n     * @access public\n     * @return void\n     */\n    public function alt(...$args)\n    {\n        $args = func_get_args();\n        $num = func_num_args();\n        \n        $sequence = $this->levels <= 0 ? $this->sequence : $this->order;\n        \n        $split = $sequence % $num;\n        echo $args[(0 == $split ? $num : $split) -1];\n    }\n\n    /**\n     * 根据深度余数输出\n     *\n     * @access public\n     * @param string $param 需要输出的值\n     * @return void\n     */\n    public function levelsAlt()\n    {\n        $args = func_get_args();\n        $num = func_num_args();\n        $split = $this->levels % $num;\n        echo $args[(0 == $split ? $num : $split) -1];\n    }\n    \n    /**\n     * 评论回复链接\n     * \n     * @access public\n     * @param string $word 回复链接文字\n     * @return void\n     */\n    public function reply($word = '')\n    {\n        if ($this->options->commentsThreaded && $this->parameter->allowComment) {\n            $word = empty($word) ? '回复' : $word;\n            $this->pluginHandle()->trigger($plugged)->reply($word, $this);\n            \n            if (!$plugged) {\n                echo '<a no-pjax  href=\"' . substr($this->permalink, 0, - strlen($this->theId) - 1) . '?replyTo=' . $this->coid .\n                    '#' . $this->parameter->respondId . '\" rel=\"nofollow\" onclick=\"return TypechoComment.reply(\\'' .\n                    $this->theId . '\\', ' . $this->coid . ');\">' . $word . '</a>';\n            }\n        }\n    }\n    \n    /**\n     * 取消评论回复链接\n     * \n     * @access public\n     * @param string $word 取消回复链接文字\n     * @return void\n     */\n    public function cancelReply($word = '')\n    {\n        if ($this->options->commentsThreaded) {\n            $word = empty($word) ? ' 取消回复' : $word;\n            $this->pluginHandle()->trigger($plugged)->cancelReply($word, $this);\n            \n            if (!$plugged) {\n                $replyId = $this->request->filter('int')->replyTo;\n                echo '<div class=\"cancel-comment-reply\" style=\"margin-top:18px;\"><a style=\"display:none;\" class=\"ui mini icon button\" id=\"cancel-comment-reply-link\" href=\"' . $this->parameter->parentContent['permalink'] . '#' . $this->parameter->respondId .\n                '\" rel=\"nofollow\"' . ($replyId ? '' : ' style=\"display:none;\"') . ' onclick=\"return TypechoComment.cancelReply();\"><i class=\"reply icon\"></i>' . $word . '</a></div>';\n            }\n        }\n    }\n}"
  },
  {
    "path": "core/extend/Comments_n.php",
    "content": "<?php\nif (!defined('__TYPECHO_ROOT_DIR__')) exit;\nrequire 'vendor/autoload_538.php';\nuse MaxMind\\Db\\Reader;\nuse Widget\\Base\\Comments;\nuse Widget\\Base\\Contents;\nuse Widget\\Contents\\From;\nclass Bearsimple_Widget_Comments_Archive extends Widget_Abstract_Comments\n{\n     /**\n     * 当前页\n     *\n     * @access private\n     * @var integer\n     */\n    private $_currentPage;\n\n    /**\n     * 所有文章个数\n     *\n     * @access private\n     * @var integer\n     */\n    private $_total = false;\n\n    /**\n     * 子父级评论关系\n     *\n     * @access private\n     * @var array\n     */\n    private $_threadedComments = array();\n\n    /**\n     * 多级评论回调函数\n     * \n     * @access private\n     * @var mixed\n     */\n    private $_customThreadedCommentsCallback = false;\n\n    /**\n     * _singleCommentOptions  \n     * \n     * @var mixed\n     * @access private\n     */\n    private $_singleCommentOptions = NULL;\n\n\n    private $_commentAuthors = array();\n\n    /**\n     * 安全组件\n     */\n    private $_security = NULL;\n\n    /**\n     * 构造函数,初始化组件\n     *\n     * @access public\n     * @param mixed $request request对象\n     * @param mixed $response response对象\n     * @param mixed $params 参数列表\n     * @return void\n     */\n    public function __construct($request, $response, $params = NULL)\n    {\n        \n        parent::__construct($request, $response, $params);\n        $this->parameter->setDefault('parentId=0&commentPage=0&commentsNum=0&allowComment=1');\n        \n        Typecho_Widget::widget('Widget_Security')->to($this->_security);\n\n        /** 初始化回调函数 */\n        if (function_exists('threadedComments')) {\n            $this->_customThreadedCommentsCallback = true;\n        }\n    }\n    public static function formatProvince(string $province) : string\n    {\n        if(empty($province)) {\n            return '';\n        }\n \n        $checkArr = [\"省\",\"市\",\"自治区\",\"特别行政区\"];\n \n        for($i = 0; $i < count($checkArr); $i++) {\n            if(strpos($province, $checkArr[$i]) === false) {\n                continue;\n            } else {\n                $province = mb_strcut($province, 0, strrpos($province, $checkArr[$i]));\n            }\n        }\n \n        return $province;\n    }\n     public static function GetAddress($ip){\n         $IPlo = new IpLocation;\n         if(empty($IPlo::getLocation($ip)['province'])){\n             return $IPlo::getLocation($ip)['country'];\n         }\n         else{\n             return self::formatProvince($IPlo::getLocation($ip)['province']);\n         }\n     }\n     public function getIpInfo($ip){\n$url = 'https://ip.zxinc.org/api.php?type=json&ip='.$ip;\n    $ch = curl_init();  \n    curl_setopt($ch,CURLOPT_URL,$url);\n    curl_setopt($ch,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);\n    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);  \n    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,3);  \n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n    $handles = curl_exec($ch);  \n    curl_close($ch);  \n    $info = explode(\"\\t\",json_decode($handles,true)['data']['country']);\n    $total = count($info);\n    switch($total){\n     case 1:\n         $info = self::formatProvince($info[0]);\n         break;\n     case 2:\n         $info = self::formatProvince($info[1]);\n         break;\n     case 3:\n         $info = self::formatProvince($info[1]);\n         break;\n     case 4:\n         $info = self::formatProvince($info[1]);\n         break;\n     default:$info = self::formatProvince($info[0]);\n    }\n    return $info;\n     }\n     \n public static function getLocation($comments)\n    {\n        $databaseFile = __DIR__.'/vendor/maxmind-db/GeoLite2-City.mmdb';\n        $db = \\Typecho\\Db::get();\n        $prefix = $db->getPrefix();\n        $coid = $comments->coid;\n        $data = $db->fetchRow($db->select()->from('table.bscore_iplocation_data')->where('coid = ?', $coid));\n        if(!$data['location']){\n            if (!filter_var($comments->ip, FILTER_VALIDATE_IP)) {\n                $location = \"外星来客\";\n            }\n            else{\n           $reader = new Reader($databaseFile);\n    $ipAddress = $comments->ip;\n    $record = $reader->get($ipAddress);\n    $location = ($record['country']['names']['zh-CN'] ?? '未知').($record['subdivisions'][0]['names']['zh-CN'] ?? '').($record['city']['names']['zh-CN'] ?? ''); \n    $reader->close();\n        }\n        }\n        else{\n          $location = $data['location']; \n        }\n        echo $location;\n    }\n\n    public static function updateLocation(int $coid, $location,$type)\n    {\n        $db = \\Typecho\\Db::get();\n        $location = is_array($location) ? serialize($location) : $location;\n        $result = $db->fetchAll($db->select('coid')->from('table.comments')->where('table.comments.coid = ?', $coid));\n        if (is_array($result) && count($result) && $type== 'ipv6') {\n            $updateQuery = $db->update('table.comments')->rows(array('ipv6_location' => $location))->where('coid = ?', $coid);\n            return $db->query($updateQuery) > 0;\n        }\n         if (is_array($result) && count($result) && $type== 'ipv4') {\n\n            $updateQuery = $db->update('table.comments')->rows(array('ipv4_location' => $location))->where('coid = ?', $coid);\n\n            return $db->query($updateQuery) > 0;\n        }\n        return false;\n    }\n    \n     public function commentRank($i){\n          $db=\\Typecho\\Db::get();\n    $mail=$db->fetchAll($db->select(array('COUNT(cid)'=>'all'))->from('table.comments')->where('mail = ?', $i->mail)->where('authorId = ?','0'));\n    foreach ($mail as $sl){\n    $all=$sl['all'];}\n    if($i->authorId == $i->ownerId){\n    echo '<div class=\"ui circular mini black label bstooltip bstooltip--top\" data-bstooltip=\"博主\" style=\"vertical-align: middle;\"><i class=\"user tie icon\"></i>博主</div>';\n    }\n    else if($all<10 && $all>0) {\n    echo '<div class=\"ui circular mini label bstooltip bstooltip--top\" data-bstooltip=\"等级LV1，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV1</div>';\n    }elseif ($all<20 && $all>=10) {\n    echo '<div class=\"ui circular mini green label bstooltip bstooltip--top\" data-bstooltip=\"等级LV2，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV2</div>';\n    }elseif ($all<40 && $all>=20) {\n    echo '<div class=\"ui circular mini olive label bstooltip bstooltip--top\" data-bstooltip=\"等级LV3，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV3</div>';\n    }elseif ($all<80 && $all>=40) {\n    echo '<div class=\"ui circular mini yellow label bstooltip bstooltip--top\" data-bstooltip=\"等级LV4，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV4</div>';\n    }elseif ($all<100 && $all>=80) {\n    echo '<div class=\"ui circular mini orange label bstooltip bstooltip--top\" data-bstooltip=\"等级LV5，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV5</div>';\n    }elseif ($all>=100) {\n    echo '<div class=\"ui circular mini red label bstooltip bstooltip--top\" data-bstooltip=\"等级LV6，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV6</div>';\n    }\n     }\n     \n    \n    /**\n     * 评论回调函数\n     * \n     * @access private\n     * @return void\n     */\n     private function threadedCommentsCallback()\n    {\n\n        $singleCommentOptions = $this->_singleCommentOptions;\n        if (function_exists('threadedComments')) {\n            return threadedComments($this, $singleCommentOptions);\n        }\n     if(Bsoptions('emaction_Openplace') && in_array('2',Bsoptions('emaction_Openplace'))&& Bsoptions('emaction_Closelike') == true){\n       $emaction = true;\n   }\n   else{\n       $emaction = false;\n   }\n        \n?>\n\n<div class=\"ui comments\" style=\"max-width:100%;\">\n<div id=\"<?php $this->theId(); ?>\" class=\"<?php\n    if ($this->levels <= 0) {?>ui grey segment<?php }?> comment-body<?php\n    if ($this->levels > 0) {\n        echo ' comment-child';\n        $this->levelsAlt(' comment-level-odd', ' comment-level-even');\n    } else {\n        echo ' comment-parent';\n    }\n    $this->alt(' comment-odd', ' comment-even');\n    echo $commentClass;\n\n?>\">\n    <?php if ($this->user->hasLogin() && $this->status == 'waiting') {\n    echo '<div class=\"floating ui yellow label\">待审核</div>';\n    }?>\n    <div class=\"comment\"<?php if(Bsoptions('avatar__choose') == 'closeavatar'):?> style=\"margin-left:10px\"<?php endif; ?>>\n        <?php if(Bsoptions('avatar__choose') !== 'closeavatar'):?>\n<a class=\"avatar\" style=\"margin-top:0.5px\">\n      <img src=\"<?php echo imgravatarq($this->mail); ?>\" loading=\"lazy\">\n    </a>\n<?php endif; ?>\n\n    <div class=\"content\">\n      <span class=\"author\"><?php CommentAuthor($this); ?></span> <?php $this->commentRank($this); ?>                 <?php if(Bsoptions('Comment_useragent') == true): ?> <?php BearsimpleUserAgent::render($this->agent,'comment'); ?><?php endif; ?> <span><?php echo $this->getParent(); ?></span><br>\n      <div class=\"metadata\" style=\"margin:auto\">\n        <span class=\"date\"><?php $singleCommentOptions->beforeDate();\n                echo date('Y-m-d H:i', $this->created);\n                $singleCommentOptions->afterDate(); ?></span>\n                <?php if(Bsoptions('Comment_ipget') == true): ?><span class=\"date\">IP属地：<?php self::getLocation($this); ?></span><?php endif; ?>\n\n      </div>\n      <div class=\"text\">\n          <?php if(Bsoptions('Comment_private') == true):?>\n          <?php echo reEmo($this->content,'comment'); ?>\n          <?php else:?>\n          <div class=\"<?php if(Bsoptions('avatar__choose') !== 'closeavatar'):?>comment-excerpta<?php else:?>comment-excerptb<?php endif; ?> break\"><?php echo reEmo($this->content,'comment'); ?> </div>\n          <?php endif; ?>\n       \n       <?php if(Bsoptions('emaction_Openplace') && in_array('1',Bsoptions('emaction_Openplace'))):?>  \n       <emoji-reaction theme=\"light\" endpoint=\"<?php getEmactionAction();?>\" reacttargetid=\"comment-<?php echo $this->coid;?>\" style=\"flex-wrap: nowrap; max-width: 100%; display: flex; gap: 0.375rem;height: 1.5rem;<?php if(Bsoptions('avatar__choose') !== 'closeavatar'):?>margin-left:-40px;<?php else:?>margin-top:10px;<?php endif;?>margin-bottom:10px\"></emoji-reaction> \n       <?php endif;?>\n       </div> \n      \n      \n      <div class=\"actions\"<?php if(Bsoptions('avatar__choose') !== 'closeavatar'):?> style=\"margin-left:-40px\"<?php endif; ?>>\n          \n                    <?php if(Bsoptions('CommentClose') == true):?>\n        <?php $this->reply($singleCommentOptions->replyWord); ?>\n                  <?php endif; ?>\n        <?php if ($this->children) { ?><a class=\"slickcomment\" id=\"bs<?php $this->theId(); ?>\">收起子评论</a><?php } ?>\n         <?php if(Bsoptions('Comment_like') == true && $emaction == false): ?>\n           <?php $agree = $this->hidden?array('agree' => 0, 'recording' => true):agreeNumforcomment($this->coid);?>\n           <i id=\"commentlike\" class=\"like thumbs up red link icon\" data-coid=\"<?php echo $this->coid; ?>\"></i><font color=gray class=\"agreenumcomment<?php echo $this->coid; ?>\"><?php echo $agree['agree']; ?></font>\n           <?php endif; ?>\n          \n      </div>\n    </div>\n    <?php if ($this->children) { ?>\n    \n    <div class=\"ui segment comment-children bs<?php $this->theId(); ?>\">\n        <?php $this->threadedComments(); ?>\n    </div>\n    <?php } ?>\n</div>  </div></div>\n\n<?php\n    }\n  \n    private function getParent(){\n        $db = \\Typecho\\Db::get();\n        $parentID = $db->fetchRow($db->select('parent')->from('table.comments')->where('coid = ?', $this->coid));\n        $parentID=$parentID['parent'];\n        if($parentID=='0'){ return '';}\n        else {\n            $author=$db->fetchRow($db->select()->from('table.comments')->where('coid = ?', $parentID));\n            if (empty($author['author']) ||!array_key_exists('author', $author) )\n                $author['author'] = '已删除的评论';\n            return '  <i class=\"at icon\" style=\"margin:auto\"></i><a href=\"#comment-'.$parentID.'\"> '.$author['author'].'</a> ';\n        }\n    }  \n\n    \n    \n    /**\n     * 获取当前评论链接\n     *\n     * @access protected\n     * @return string\n     */\n    protected function ___permalink(): string\n    {\n        if ($this->options->commentsPageBreak) {\n            return Router::url(\n                'comment_page',\n                $this,\n                $this->options->index\n            ) . '#' . $this->theId;\n        }\n\n        return $this->parentContent->permalink . '#' . $this->theId;\n    }\n\n    /**\n     * 子评论\n     *\n     * @access protected\n     * @return array\n     */\n    protected function ___children()\n    {\n        return $this->options->commentsThreaded && !$this->isTopLevel && isset($this->_threadedComments[$this->coid]) \n            ? $this->_threadedComments[$this->coid] : array();\n    }\n\n    /**\n     * 是否到达顶层\n     *\n     * @access protected\n     * @return boolean\n     */\n    protected function ___isTopLevel()\n    {\n        return $this->levels > 0;\n    }\n\n    /**\n     * 重载内容获取\n     *\n     * @access protected\n     * @return void\n     */\n    protected function ___parentContent(): Contents\n    {\n        return From::allocWithAlias($this->cid, ['cid' => $this->cid]);\n    }\n\n    /**\n     * 输出文章评论数\n     *\n     * @access public\n     * @param string $string 评论数格式化数据\n     * @return void\n     */\n    public function num()\n    {\n        $args = func_get_args();\n        if (!$args) {\n            $args[] = '%d';\n        }\n\n        $num = intval($this->_total);\n\n        echo sprintf(isset($args[$num]) ? $args[$num] : array_pop($args), $num);\n    }\n  \n  \n    \n    \n    \n    /**\n     * 执行函数\n     *\n     * @access public\n     * @return void\n     */\n    public function execute()\n    {\n        if (!$this->parameter->parentId) {\n            return;\n        }\n$commentsAuthor = Typecho_Cookie::get('__typecho_remember_author');\n        $commentsMail = Typecho_Cookie::get('__typecho_remember_mail');\n\n        // 对已登录用户显示待审核评论，方便前台管理\n        if ($this->user->hasLogin()) {\n            $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId)\n                ->where('table.comments.status = ? OR table.comments.status = ?', 'approved', 'waiting');\n        } else {\n            $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId)\n                ->where('table.comments.status = ? OR (table.comments.author = ? AND table.comments.mail = ? AND table.comments.status = ?)', 'approved', $commentsAuthor, $commentsMail, 'waiting');\n        }\n        \n\n        $threadedSelect = NULL;\n        \n        if ($this->options->commentsShowCommentOnly) {\n            $select->where('table.comments.type = ?', 'comment');\n        }\n        \n        $select->order('table.comments.coid', 'ASC');\n        $this->db->fetchAll($select, array($this, 'push'));\n        \n        /** 需要输出的评论列表 */\n        $outputComments = array();\n        \n        /** 如果开启评论回复 */\n        if ($this->options->commentsThreaded) {\n        \n            foreach ($this->stack as $coid => &$comment) {\n                \n                /** 取出父节点 */\n                $parent = $comment['parent'];\n            \n                /** 如果存在父节点 */\n                if (0 != $parent && isset($this->stack[$parent])) {\n                \n                    /** 如果当前节点深度大于最大深度, 则将其挂接在父节点上 */\n                    if ($comment['levels'] >= 2) {\n                        $comment['levels'] = $this->stack[$parent]['levels'];\n                        $parent = $this->stack[$parent]['parent'];     // 上上层节点\n                        $comment['parent'] = $parent;\n                    }\n                \n                    /** 计算子节点顺序 */\n                    $comment['order'] = isset($this->_threadedComments[$parent]) \n                        ? count($this->_threadedComments[$parent]) + 1 : 1;\n                \n                    /** 如果是子节点 */\n                    $this->_threadedComments[$parent][$coid] = $comment;\n                } else {\n                    $outputComments[$coid] = $comment;\n                }\n                \n            }\n        \n            $this->stack = $outputComments;\n        }\n        \n        /** 评论排序 */\n        if ('DESC' == $this->options->commentsOrder) {\n            $this->stack = array_reverse($this->stack, true);\n        }\n        \n        /** 评论总数 */\n        $this->_total = count($this->stack);\n        \n        /** 对评论进行分页 */\n        if ($this->options->commentsPageBreak) {\n            if ('last' == $this->options->commentsPageDisplay && !$this->parameter->commentPage) {\n                $this->_currentPage = ceil($this->_total / $this->options->commentsPageSize);\n            } else {\n                $this->_currentPage = $this->parameter->commentPage ? $this->parameter->commentPage : 1;\n            }\n            \n            /** 截取评论 */\n            $this->stack = array_slice($this->stack,\n                ($this->_currentPage - 1) * $this->options->commentsPageSize, $this->options->commentsPageSize);\n            \n            /** 评论置位 */\n            $this->row = current($this->stack);\n            $this->length = count($this->stack);\n        }\n        \n        reset($this->stack);\n    }\n\n    /**\n     * 将每行的值压入堆栈\n     *\n     * @access public\n     * @param array $value 每行的值\n     * @return array\n     */\n    public function push(array $value) : array\n    {\n        $value = $this->filter($value);\n        \n        /** 计算深度 */\n        if (0 != $value['parent'] && isset($this->stack[$value['parent']]['levels'])) {\n            $value['levels'] = $this->stack[$value['parent']]['levels'] + 1;\n        } else {\n            $value['levels'] = 0;\n        }\n\n        $value['realParent'] = $value['parent'];\n\n        /** 重载push函数,使用coid作为数组键值,便于索引 */\n        $this->stack[$value['coid']] = $value;\n        $this->_commentAuthors[$value['coid']] = $value['author'];\n        $this->length ++;\n        \n        return $value;\n    }\n\n    /**\n     * 输出分页\n     *\n     * @access public\n     * @param string $prev 上一页文字\n     * @param string $next 下一页文字\n     * @param int $splitPage 分割范围\n     * @param string $splitWord 分割字符\n     * @param string $template 展现配置信息\n     * @return void\n     */\n    public function pageNav($prev = '&laquo;', $next = '&raquo;', $splitPage = 3, $splitWord = '...', $template = '')\n    {\n        if ($this->options->commentsPageBreak && $this->_total > $this->options->commentsPageSize) {\n            $default = array(\n                'wrapTag'       =>  'ol',\n                'wrapClass'     =>  'page-navigator'\n            );\n\n            if (is_string($template)) {\n                parse_str($template, $config);\n            } else {\n                $config = $template;\n            }\n\n            $template = array_merge($default, $config);\n\n            $pageRow = $this->parameter->parentContent;\n            $pageRow['permalink'] = $pageRow['pathinfo'];\n\n            $query = Typecho_Router::url('comment_page', $pageRow, $this->options->index);\n\n            /** 使用盒状分页 */\n            $nav = new Typecho_Widget_Helper_PageNavigator_Box($this->_total,\n                $this->_currentPage, $this->options->commentsPageSize, $query);\n            $nav->setPageHolder('commentPage');\n            $nav->setAnchor('comments');\n            \n            echo '<' . $template['wrapTag'] . (empty($template['wrapClass']) \n                    ? '' : ' class=\"' . $template['wrapClass'] . '\"') . '>';\n            $nav->render($prev, $next, $splitPage, $splitWord, $template);\n            echo '</' . $template['wrapTag'] . '>';\n        }\n    }\n\n    /**\n     * 递归输出评论\n     *\n     * @access protected\n     * @return void\n     */\n    public function threadedComments()\n    {\n        $children = $this->children;\n        if ($children) {\n            //缓存变量便于还原\n            $tmp = $this->row;\n            $this->sequence ++;\n\n            //在子评论之前输出\n            echo $this->_singleCommentOptions->before;\n\n            foreach ($children as $child) {\n                $this->row = $child;\n                $this->threadedCommentsCallback();\n                $this->row = $tmp;\n            }\n\n            //在子评论之后输出\n            echo $this->_singleCommentOptions->after;\n\n            $this->sequence --;\n        }\n    }\n    \n    /**\n     * 列出评论\n     * \n     * @access private\n     * @param mixed $singleCommentOptions 单个评论自定义选项\n     * @return void\n     */\n    public function listComments($singleCommentOptions = NULL)\n    {\n        //初始化一些变量\n        $this->_singleCommentOptions = Typecho_Config::factory($singleCommentOptions);\n        $this->_singleCommentOptions->setDefault(array(\n            'before'        =>  '<ol class=\"comment-list\">',\n            'after'         =>  '</ol>',\n            'beforeAuthor'  =>  '',\n            'afterAuthor'   =>  '',\n            'beforeDate'    =>  '',\n            'afterDate'     =>  '',\n            'dateFormat'    =>  $this->options->commentDateFormat,\n            'replyWord'     =>  '回复',\n            'commentStatus' =>  '评论正等待审核!',\n            'avatarSize'    =>  32,\n            'defaultAvatar' =>  NULL\n        ));\n        $this->pluginHandle()->trigger($plugged)->listComments($this->_singleCommentOptions, $this);\n\n        if (!$plugged) {\n            if ($this->have()) { \n                echo $this->_singleCommentOptions->before;\n            \n                while ($this->next()) {\n                    $this->threadedCommentsCallback();\n                }\n            \n                echo $this->_singleCommentOptions->after;\n            }\n        }\n    }\n    \n    /**\n     * 重载alt函数,以适应多级评论\n     * \n     * @access public\n     * @return void\n     */\n    public function alt(...$args)\n    {\n        $args = func_get_args();\n        $num = func_num_args();\n        \n        $sequence = $this->levels <= 0 ? $this->sequence : $this->order;\n        \n        $split = $sequence % $num;\n        echo $args[(0 == $split ? $num : $split) -1];\n    }\n\n    /**\n     * 根据深度余数输出\n     *\n     * @access public\n     * @param string $param 需要输出的值\n     * @return void\n     */\n    public function levelsAlt()\n    {\n        $args = func_get_args();\n        $num = func_num_args();\n        $split = $this->levels % $num;\n        echo $args[(0 == $split ? $num : $split) -1];\n    }\n    \n    /**\n     * 评论回复链接\n     * \n     * @access public\n     * @param string $word 回复链接文字\n     * @return void\n     */\n    public function reply(string $word = '')\n    {\n        if ($this->options->commentsThreaded && $this->parameter->allowComment) {\n            $word = empty($word) ? _t('回复') : $word;\n            self::pluginHandle()->trigger($plugged)->call('reply', $word, $this);\n\n            if (!$plugged) {\n                echo '<a no-pjax href=\"' . substr($this->permalink, 0, - strlen($this->theId) - 1) . '?replyTo=' . $this->coid .\n                    '#' . $this->parameter->respondId . '\" rel=\"nofollow\" onclick=\"return TypechoComment.reply(\\'' .\n                    $this->theId . '\\', ' . $this->coid . ', this);\">' . $word . '</a>';\n            }\n        }\n    }\n    \n    /**\n     * 取消评论回复链接\n     * \n     * @access public\n     * @param string $word 取消回复链接文字\n     * @return void\n     */\n    public function cancelReply($word = '')\n    {\n        if ($this->options->commentsThreaded) {\n            $word = empty($word) ? ' 取消回复' : $word;\n            $this->pluginHandle()->trigger($plugged)->cancelReply($word, $this);\n            \n            if (!$plugged) {\n                $replyId = $this->request->filter('int')->replyTo;\n                echo '<div class=\"cancel-comment-reply\" style=\"margin-top:18px;\"><a style=\"display:none;\" class=\"ui mini icon button\" id=\"cancel-comment-reply-link\" href=\"' . $this->parameter->parentContent['permalink'] . '#' . $this->parameter->respondId .\n                '\" rel=\"nofollow\"' . ($replyId ? '' : ' style=\"display:none;\"') . ' onclick=\"return TypechoComment.cancelReply();\"><i class=\"reply icon\"></i>' . $word . '</a></div>';\n            }\n        }\n    }\n}"
  },
  {
    "path": "core/extend/FriendCircle.php",
    "content": "<?php\nif (!defined('__TYPECHO_ROOT_DIR__')) exit;\nclass BearSimple_Widget_Friendcircle_Archive extends Widget_Abstract_Comments\n{\n     /**\n     * 当前页\n     *\n     * @access private\n     * @var integer\n     */\n    private $_currentPage;\n\n    /**\n     * 所有文章个数\n     *\n     * @access private\n     * @var integer\n     */\n    private $_total = false;\n\n    /**\n     * 子父级评论关系\n     *\n     * @access private\n     * @var array\n     */\n    private $_threadedComments = array();\n\n    /**\n     * 多级评论回调函数\n     * \n     * @access private\n     * @var mixed\n     */\n    private $_customThreadedCommentsCallback = false;\n\n    /**\n     * _singleCommentOptions  \n     * \n     * @var mixed\n     * @access private\n     */\n    private $_singleCommentOptions = NULL;\n\n\n    private $_commentAuthors = array();\n\n    /**\n     * 安全组件\n     */\n    private $_security = NULL;\n\n    /**\n     * 构造函数,初始化组件\n     *\n     * @access public\n     * @param mixed $request request对象\n     * @param mixed $response response对象\n     * @param mixed $params 参数列表\n     * @return void\n     */\n    public function __construct($request, $response, $params = NULL)\n    {\n        \n        parent::__construct($request, $response, $params);\n        $this->parameter->setDefault('parentId=0&commentPage=0&commentsNum=0&allowComment=1');\n        \n        Typecho_Widget::widget('Widget_Security')->to($this->_security);\n\n        /** 初始化回调函数 */\n        if (function_exists('threadedComments')) {\n            $this->_customThreadedCommentsCallback = true;\n        }\n    }\n    public static function updateLocation(int $coid, $location,$type)\n    {\n        $db = \\Typecho\\Db::get();\n        $location = is_array($location) ? serialize($location) : $location;\n        $result = $db->fetchAll($db->select('coid')->from('table.comments')->where('table.comments.coid = ?', $coid));\n        if (is_array($result) && count($result) && $type== 'ipv6') {\n            $updateQuery = $db->update('table.comments')->rows(array('ipv6_location' => $location))->where('coid = ?', $coid);\n            return $db->query($updateQuery) > 0;\n        }\n         if (is_array($result) && count($result) && $type== 'ipv4') {\n\n            $updateQuery = $db->update('table.comments')->rows(array('ipv4_location' => $location))->where('coid = ?', $coid);\n\n            return $db->query($updateQuery) > 0;\n        }\n        return false;\n    }\n    \n     public static function commentRank($i){\n          $db=\\Typecho\\Db::get();\n    $mail=$db->fetchAll($db->select(array('COUNT(cid)'=>'all'))->from('table.comments')->where('mail = ?', $i->mail)->where('authorId = ?','0'));\n    foreach ($mail as $sl){\n    $all=$sl['all'];}\n    if($i->authorId == $i->ownerId){\n    echo '<div class=\"ui circular mini black label bstooltip bstooltip--top\" data-bstooltip=\"博主\" style=\"vertical-align: middle;\"><i class=\"user tie icon\"></i>博主</div>';\n    }\n    else if($all<10 && $all>0) {\n    echo '<div class=\"ui circular mini label bstooltip bstooltip--top\" data-bstooltip=\"等级LV1，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV1</div>';\n    }elseif ($all<20 && $all>=10) {\n    echo '<div class=\"ui circular mini green label bstooltip bstooltip--top\" data-bstooltip=\"等级LV2，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV2</div>';\n    }elseif ($all<40 && $all>=20) {\n    echo '<div class=\"ui circular mini olive label bstooltip bstooltip--top\" data-bstooltip=\"等级LV3，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV3</div>';\n    }elseif ($all<80 && $all>=40) {\n    echo '<div class=\"ui circular mini yellow label bstooltip bstooltip--top\" data-bstooltip=\"等级LV4，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV4</div>';\n    }elseif ($all<100 && $all>=80) {\n    echo '<div class=\"ui circular mini orange label bstooltip bstooltip--top\" data-bstooltip=\"等级LV5，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV5</div>';\n    }elseif ($all>=100) {\n    echo '<div class=\"ui circular mini red label bstooltip bstooltip--top\" data-bstooltip=\"等级LV6，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV6</div>';\n    }\n     }\n      public static function circle_getInfo($obj){\n        $db=\\Typecho\\Db::get();\n    $info=$db->fetchRow($db->select()->from('table.bscore_friendcircle_data')->where('coid = ?', $obj->coid));  \n    return $info;\n      }\n    public static function circle_getTime($time)\n    {\n        $rtime = date(\"Y年m月d日 H:i\", $time);\n        $htime = date(\"H:i\", $time);\n        $time = time() - $time;\n        if ($time < 60) {\n            $str = '刚刚';\n        } elseif ($time < 60 * 60) {\n            $min = floor($time / 60);\n            $str = $min . '分钟前';\n        } elseif ($time < 60 * 60 * 24) {\n            $h = floor($time / (60 * 60));\n            $str = $h . '小时前 ' . $htime;\n        } elseif ($time < 60 * 60 * 24 * 3) {\n            $d = floor($time / (60 * 60 * 24));\n            if ($d == 1){\n                $ztime = time() - $time;\n       $zztime = date(\"H:i\", $ztime);\n                $str = '昨天 ' . $zztime;\n            }else{\n                $qtime = time() - $time;\n       $qqtime = date(\"H:i\", $qtime);\n                $str = '前天 ' . $qqtime;\n        }} else {\n            $str = $rtime;\n        }\n         return $str;\n}\n\n\n    /**\n     * 评论回调函数\n     * \n     * @access private\n     * @return void\n     */\n    private function threadedCommentsCallback()\n    {\n\n        $singleCommentOptions = $this->_singleCommentOptions;\n        if (function_exists('threadedComments')) {\n            return threadedComments($this, $singleCommentOptions);\n        }\n\n       if(Bsoptions('Lazyload') == true){\n$lazyload = 'class=\"lazy\" data-';\n} \n$db = \\Typecho\\Db::get();\nTypecho_Widget::widget('Widget_User')->to($user);\n$circle_data = $db->fetchRow($db->select()->from('table.bscore_friendcircle_data')->where('coid = ?', $this->coid));\nif(($circle_data['private'] == 1 && (!$this->user->hasLogin() && $this->user->uid !== $this->authorId))){\n    $hidden = 'style=\"display:none;\"';\n}\nif($circle_data['likeVisitor']){\n$likeVisitor = $circle_data['likeVisitor'].'位访客';\n}\nif($circle_data['likeUser'] && $circle_data['likeVisitor']){\n$likeVisitor = '，'.$likeVisitor;    \n}\nif(Bsoptions('fcircle_Avatar') == null){\n$avatar = Helper::options()->themeUrl.'/assets/images/circle_defaultAvatar.jpg';\n}\nelse{\n$avatar = Bsoptions('fcircle_Avatar');\n}\n?>\n        \n        <li class=\"scrollFriend\" id=\"<?php $this->theId(); ?>\" <?php echo $hidden;?>><div class=\"friendcircle-main-level\"><div class=\"friendcircle-avatar\"><img data-funlazy=\"<?php echo $avatar; ?>\"></div><div class=\"friendcircle-box\"><div class=\"friendcircle-head\"><h3 class=\"friendcircle-name by-author\"><?php echo $this->author; ?></h3> </div>\n        <div class=\"friendcircle-content\">\n\n            <?php echo reEmo($this->content,\"circle\"); ?>\n        <?php if(!empty(self::circle_getInfo($this)['resources'])):\n        \n        ?>\n        \n        <?php \n        $keys = array(\"mp3\",\"mp4\",\"mov\",\"wmv\",\"wma\",\"rmvb\",\"rm\",\"avi\",\"flv\",\"ogg\",\"oga\",\"ogv\",\"flac\",'amr','speex');\n        $resources = json_decode(self::circle_getInfo($this)['resources'],true);\n        $keyword = parse_url(pathinfo($resources[0], PATHINFO_EXTENSION))['path'];\n        $searchIfVideo = false;\n        $type = 'video';\n        foreach($keys as $key){\n           if ($keyword == $key) { \n         $searchIfVideo = true;\n         if ($key == \"mp4\"){\n         $type = 'video';\n         }\n         elseif ($key == \"amr\" || $key == \"speex\"){\n          $type = 'wechat';   \n         }\n         else{\n          $type = 'audio';      \n         }\n           }\n        }\nif($searchIfVideo == true){\n?>\n    <?php if($type == 'video'):?>\n    <div class=\"friendcircle_video\">\n    <video class=\"circle_player\" controls crossorigin playsinline>\n\n<source src=\"<?php echo $resources[0];?>\">\n\n</video>  \n</div>\n<?php elseif($type == 'wechat'):?>\n<div class=\"circle_player\" style=\"margin-top:10px;display: flex;align-items: center;justify-content: flex-start;flex-wrap: nowrap;\">\n <button id=\"amr-begin-<?php echo $this->coid; ?>\" class=\"ui small label amr-begin\" data-circleid=\"<?php echo $this->coid; ?>\" data-amrfile=\"<?php echo $resources[0];?>\">加载</button>\n        <button id=\"amr-play-<?php echo $this->coid; ?>\" class=\"ui small green icon label\" style=\"display:none\" disabled><i class=\"play icon\"></i></button>\n        <button id=\"amr-stop-<?php echo $this->coid; ?>\" class=\"ui small red icon label\" style=\"display:none\" disabled><i class=\"stop icon\"></i></button>\n        <input id=\"amr-progress-<?php echo $this->coid; ?>\" type=\"range\" min=\"0\" max=\"1\" step=\"any\" value=\"0\"  class=\"ui range\" disabled>\n        <label for=\"amr-progress-<?php echo $this->coid; ?>\" style=\"vertical-align:middle\">\n            <span id=\"amr-cur-<?php echo $this->coid; ?>\"> 0'</span>\n            <span>/</span>\n            <span id=\"amr-duration-<?php echo $this->coid; ?>\">0'</span>\n        </label>\n        </div>\n\n<?php elseif($type == 'audio'):?>\n<div class=\"friendcircle_video\">\n<audio class=\"circle_player\" controls>\n  <source src=\"<?php echo $resources[0];?>\">\n</audio>\n</div>\n        \n\n<?php endif;?>\n\n        <?php\n}\nelse{\n    ?>\n\n<div class=\"circle-pictures\"  style=\"grid-template-columns:1fr 1fr 1fr;\">\n        <?php\n        foreach(json_decode(self::circle_getInfo($this)['resources'],true) as $resource):?>\n      <a href=\"<?php echo $resource;?>\" class=\"circle-picture\">\n            <img data-fancybox=\"circle-<?php echo $this->coid; ?>\" data-funlazy=\"<?php echo $resource;?>\"> \n   </a>\n        \n       <?php endforeach;?>\n         </div>\n        <?php }?>\n        <?php endif;?>\n    \n        </div><?php if(!empty(self::circle_getInfo($this)['location'])):?><a class=\"friendcircle-map\" href='https://map.baidu.com/search/<?php echo self::circle_getInfo($this)['location'];?>/@13211813,2842867.25,12z?querytype=s&da_src=shareurl&wd=<?php echo self::circle_getInfo($this)['location'];?>&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\"><?php echo self::circle_getInfo($this)['location'];?></a><?php endif;?><span class=\"friendcircle-time\">\n       <?php $singleCommentOptions->beforeDate();\n                echo self::circle_getTime($this->created);\n                $singleCommentOptions->afterDate(); ?> <a class=\"circle-delete\" style=\"display:none;cursor: default;color:#586B95;margin-left:3px\" data-coid=\"<?php echo $this->coid;?>\"> <i class=\"trash alternate icon\"></i></a></span>\n       <section class=\"friendcircle-action\" id=\"friendcircle-action-<?php echo $this->coid;?>\">\n          <div class=\"ui icon mini label circle-action\" data-toolbar=\"friendcircle-actions\" data-toolbar-style=\"dark\">\n  <i class=\"ellipsis horizontal icon\" style=\"color:#586B95\"></i>\n</div>\n\n<div class=\"tool-container tool-left toolbar-dark animate-standard\" style=\"width:80px;\"><div class=\"tool-items\">\n    <a class=\"circle-like tool-item\" style=\"cursor: default;\" data-coid=\"<?php echo $this->coid;?>\"><i class=\"heart outline icon\"></i> 赞</a>\n    <a class=\"circle-comment tool-item\" style=\"cursor: default;\" data-coid=\"<?php echo $this->coid;?>\"><i class=\"comment alternate outline icon\"></i> 评论</a>\n    </div>\n    <div class=\"arrow\"></div>\n    </div>\n           \n       </section>\n       <?php if ($this->children || $circle_data['likeUser'] || $circle_data['likeVisitor']) { ?>\n       <div class=\"friendcircle-comments\" id=\"friendcircle-comments-<?php echo $this->coid;?>\">\n           <?php if ($circle_data['likeUser'] || $circle_data['likeVisitor']) { ?>\n           <span id=\"friendcircle-comments-like-<?php echo $this->coid;?>\">\n           <i class=\"heart outline icon\"></i> <?php echo $circle_data['likeUser'];?><?php echo $likeVisitor;?>\n           </span>\n           <?php };?>\n           <?php if (($circle_data['likeUser'] || $circle_data['likeVisitor']) && $this->children):?>\n           <hr>\n           <?php endif;?>\n           <?php $this->threadedComments(); ?>\n       </div>\n       <?php };?>\n       </div></div></li>\n      \n       \n\n\n<?php\n    }\n  \n    private function getParent(){\n        $db = \\Typecho\\Db::get();\n        $parentID = $db->fetchRow($db->select('parent')->from('table.comments')->where('coid = ?', $this->coid));\n        $parentID=$parentID['parent'];\n        \n        if($parentID=='0'){ return '';}\n        else {\n            $author=$db->fetchRow($db->select()->from('table.comments')->where('coid = ?', $parentID));\n            \n            if (empty($author['author']) ||!array_key_exists('author', $author) )\n            \n                $author['author'] = '已删除的评论';\n                \n            return '  <span style=\"color:black;font-weight:400\">回复</span> <span> '.$author['author'].'</span> ';\n        }\n    }  \n\n    \n    \n    /**\n     * 获取当前评论链接\n     *\n     * @access protected\n     * @return string\n     */\n    protected function ___permalink() : string\n    {\n\n        if ($this->options->commentsPageBreak) {            \n            $pageRow = array('permalink' => $this->parentContent['pathinfo'], 'commentPage' => $this->_currentPage);\n            return Typecho_Router::url('comment_page',\n                        $pageRow, $this->options->index) . '#' . $this->theId;\n        }\n        \n        return $this->parentContent['permalink'] . '#' . $this->theId;\n    }\n\n    /**\n     * 子评论\n     *\n     * @access protected\n     * @return array\n     */\n    protected function ___children()\n    {\n        return $this->options->commentsThreaded && !$this->isTopLevel && isset($this->_threadedComments[$this->coid]) \n            ? $this->_threadedComments[$this->coid] : array();\n    }\n\n    /**\n     * 是否到达顶层\n     *\n     * @access protected\n     * @return boolean\n     */\n    protected function ___isTopLevel()\n    {\n        return $this->levels > 0;\n    }\n\n    /**\n     * 重载内容获取\n     *\n     * @access protected\n     * @return void\n     */\n    protected function ___parentContent(): Array\n    {\n        return $this->parameter->parentContent;\n    }\n\n    /**\n     * 输出文章评论数\n     *\n     * @access public\n     * @param string $string 评论数格式化数据\n     * @return void\n     */\n    public function num()\n    {\n        $args = func_get_args();\n        if (!$args) {\n            $args[] = '%d';\n        }\n\n        $num = intval($this->_total);\n\n        echo sprintf(isset($args[$num]) ? $args[$num] : array_pop($args), $num);\n    }\n  \n  \n    \n    \n    \n    /**\n     * 执行函数\n     *\n     * @access public\n     * @return void\n     */\n    public function execute()\n    {\n        if (!$this->parameter->parentId) {\n            return;\n        }\n$commentsAuthor = Typecho_Cookie::get('__typecho_remember_author');\n        $commentsMail = Typecho_Cookie::get('__typecho_remember_mail');\n\n\n        // 对已登录用户显示待审核评论，方便前台管理\n        if ($this->user->hasLogin()) {\n            $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId)\n                ->where('table.comments.status = ? OR table.comments.status = ?', 'approved', 'waiting');\n        } else {\n            $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId)\n                ->where('table.comments.status = ? OR (table.comments.author = ? AND table.comments.mail = ? AND table.comments.status = ?)', 'approved', $commentsAuthor, $commentsMail, 'waiting');\n        }\n        \n\n        $threadedSelect = NULL;\n        \n        if ($this->options->commentsShowCommentOnly) {\n            $select->where('table.comments.type = ?', 'comment');\n        }\n        \n        $select->order('table.comments.coid', 'ASC');\n        $this->db->fetchAll($select, array($this, 'push'));\n        \n        /** 需要输出的评论列表 */\n        $outputComments = array();\n        \n        /** 如果开启评论回复 */\n        if ($this->options->commentsThreaded) {\n        \n            foreach ($this->stack as $coid => &$comment) {\n            \n                /** 取出父节点 */\n                $parent = $comment['parent'];\n            \n                /** 如果存在父节点 */\n                if (0 != $parent && isset($this->stack[$parent])) {\n             \n                    /** 如果当前节点深度大于最大深度, 则将其挂接在父节点上 */\n                    if ($comment['levels'] >= 2) {\n                        $comment['levels'] = $this->stack[$parent]['levels'];\n                        $parent = $this->stack[$parent]['parent'];     // 上上层节点\n                        $comment['parent'] = $parent;\n                    }\n                \n                    /** 计算子节点顺序 */\n                    $comment['order'] = isset($this->_threadedComments[$parent]) \n                        ? count($this->_threadedComments[$parent]) + 1 : 1;\n                \n                    /** 如果是子节点 */\n                    $this->_threadedComments[$parent][$coid] = $comment;\n                } else {\n                    $outputComments[$coid] = $comment;\n                }\n                \n            }\n        \n            $this->stack = $outputComments;\n        }\n        \n        /** 评论排序 */\n        if ('DESC' == $this->options->commentsOrder) {\n            $this->stack = array_reverse($this->stack, true);\n        }\n        \n        /** 评论总数 */\n        $this->_total = count($this->stack);\n        \n        /** 对评论进行分页 */\n        if ($this->options->commentsPageBreak) {\n            if ('last' == $this->options->commentsPageDisplay && !$this->parameter->commentPage) {\n                $this->_currentPage = ceil($this->_total / $this->options->commentsPageSize);\n            } else {\n                $this->_currentPage = $this->parameter->commentPage ? $this->parameter->commentPage : 1;\n            }\n            \n            /** 截取评论 */\n            $this->stack = array_slice($this->stack,\n                ($this->_currentPage - 1) * $this->options->commentsPageSize, $this->options->commentsPageSize);\n            \n            /** 评论置位 */\n            $this->row = current($this->stack);\n            $this->length = count($this->stack);\n        }\n        \n        reset($this->stack);\n    }\n\n    /**\n     * 将每行的值压入堆栈\n     *\n     * @access public\n     * @param array $value 每行的值\n     * @return array\n     */\n    public function push(array $value) : array\n    {\n        $value = $this->filter($value);\n        \n        /** 计算深度 */\n        if (0 != $value['parent'] && isset($this->stack[$value['parent']]['levels'])) {\n            $value['levels'] = $this->stack[$value['parent']]['levels'] + 1;\n        } else {\n            $value['levels'] = 0;\n        }\n\n        $value['realParent'] = $value['parent'];\n\n        /** 重载push函数,使用coid作为数组键值,便于索引 */\n        $this->stack[$value['coid']] = $value;\n        $this->_commentAuthors[$value['coid']] = $value['author'];\n        $this->length ++;\n        \n        return $value;\n    }\n\n    /**\n     * 输出分页\n     *\n     * @access public\n     * @param string $prev 上一页文字\n     * @param string $next 下一页文字\n     * @param int $splitPage 分割范围\n     * @param string $splitWord 分割字符\n     * @param string $template 展现配置信息\n     * @return void\n     */\n    public function pageNav($prev = '&laquo;', $next = '&raquo;', $splitPage = 3, $splitWord = '...', $template = '')\n    {\n        if ($this->options->commentsPageBreak && $this->_total > $this->options->commentsPageSize) {\n            $default = array(\n                'wrapTag'       =>  'ol',\n                'wrapClass'     =>  'page-navigator'\n            );\n\n            if (is_string($template)) {\n                parse_str($template, $config);\n            } else {\n                $config = $template;\n            }\n\n            $template = array_merge($default, $config);\n\n            $pageRow = $this->parameter->parentContent;\n            $pageRow['permalink'] = $pageRow['pathinfo'];\n\n            $query = Typecho_Router::url('comment_page', $pageRow, $this->options->index);\n\n            /** 使用盒状分页 */\n            $nav = new Typecho_Widget_Helper_PageNavigator_Box($this->_total,\n                $this->_currentPage, $this->options->commentsPageSize, $query);\n            $nav->setPageHolder('commentPage');\n            $nav->setAnchor('comments');\n            \n            echo '<' . $template['wrapTag'] . (empty($template['wrapClass']) \n                    ? '' : ' class=\"' . $template['wrapClass'] . '\"') . '>';\n            $nav->render($prev, $next, $splitPage, $splitWord, $template);\n            echo '</' . $template['wrapTag'] . '>';\n        }\n    }\n\n    /**\n     * 递归输出评论\n     *\n     * @access protected\n     * @return void\n     */\n    public function threadedComments()\n    {\n\n        $children = $this->children;\n        \n        \n        if ($children) {\n            //缓存变量便于还原\n            $tmp = $this->row;\n            $this->sequence ++;\n\n            //在子评论之前输出\n            //echo $this->_singleCommentOptions->before;\n\n            foreach ($children as $child) {\n                $this->row = $child;\n                echo '<div class=\"circle-comment-children\" data-coid=\"'.$this->coid.'\" data-parentName=\"'.$this->author.'\"><div id=\"circle-children-'.$this->coid.'\" class=\"circle-comment-tain\">'.$this->author.$this->getParent().'<span style=\"color:black;font-weight:400\"> : '.reEmo($this->text,\"circle\").'</span></div></div>';\n                $this->row = $tmp;\n            }\n\n            //在子评论之后输出\n            //echo $this->_singleCommentOptions->after;\n\n            $this->sequence --;\n        }\n    }\n    \n    /**\n     * 列出评论\n     * \n     * @access private\n     * @param mixed $singleCommentOptions 单个评论自定义选项\n     * @return void\n     */\n    public function listComments($singleCommentOptions = NULL)\n    {\n        //初始化一些变量\n        $this->_singleCommentOptions = Typecho_Config::factory($singleCommentOptions);\n        $this->_singleCommentOptions->setDefault(array(\n            'before'        =>  '<ol class=\"comment-list\">',\n            'after'         =>  '</ol>',\n            'beforeAuthor'  =>  '',\n            'afterAuthor'   =>  '',\n            'beforeDate'    =>  '',\n            'afterDate'     =>  '',\n            'dateFormat'    =>  $this->options->commentDateFormat,\n            'replyWord'     =>  '回复',\n            'commentStatus' =>  '评论正等待审核!',\n            'avatarSize'    =>  32,\n            'defaultAvatar' =>  NULL\n        ));\n        $this->pluginHandle()->trigger($plugged)->listComments($this->_singleCommentOptions, $this);\n\n        if (!$plugged) {\n            if ($this->have()) { \n                echo $this->_singleCommentOptions->before;\n            \n                while ($this->next()) {\n                    $this->threadedCommentsCallback();\n                }\n            \n                echo $this->_singleCommentOptions->after;\n            }\n        }\n    }\n    \n    /**\n     * 重载alt函数,以适应多级评论\n     * \n     * @access public\n     * @return void\n     */\n    public function alt(...$args)\n    {\n        $args = func_get_args();\n        $num = func_num_args();\n        \n        $sequence = $this->levels <= 0 ? $this->sequence : $this->order;\n        \n        $split = $sequence % $num;\n        echo $args[(0 == $split ? $num : $split) -1];\n    }\n\n    /**\n     * 根据深度余数输出\n     *\n     * @access public\n     * @param string $param 需要输出的值\n     * @return void\n     */\n    public function levelsAlt()\n    {\n        $args = func_get_args();\n        $num = func_num_args();\n        $split = $this->levels % $num;\n        echo $args[(0 == $split ? $num : $split) -1];\n    }\n    \n    /**\n     * 评论回复链接\n     * \n     * @access public\n     * @param string $word 回复链接文字\n     * @return void\n     */\n    public function reply($word = '')\n    {\n        if ($this->options->commentsThreaded && $this->parameter->allowComment) {\n            $word = empty($word) ? '回复' : $word;\n            $this->pluginHandle()->trigger($plugged)->reply($word, $this);\n            \n            if (!$plugged) {\n                echo '<a no-pjax  href=\"' . substr($this->permalink, 0, - strlen($this->theId) - 1) . '?replyTo=' . $this->coid .\n                    '#' . $this->parameter->respondId . '\" rel=\"nofollow\" onclick=\"return TypechoComment.reply(\\'' .\n                    $this->theId . '\\', ' . $this->coid . ');\">' . $word . '</a>';\n            }\n        }\n    }\n    \n    /**\n     * 取消评论回复链接\n     * \n     * @access public\n     * @param string $word 取消回复链接文字\n     * @return void\n     */\n    public function cancelReply($word = '')\n    {\n        if ($this->options->commentsThreaded) {\n            $word = empty($word) ? ' 取消回复' : $word;\n            $this->pluginHandle()->trigger($plugged)->cancelReply($word, $this);\n            \n            if (!$plugged) {\n                $replyId = $this->request->filter('int')->replyTo;\n                echo '<div class=\"cancel-comment-reply\" style=\"margin-top:18px;\"><a style=\"display:none;\" class=\"ui mini icon button\" id=\"cancel-comment-reply-link\" href=\"' . $this->parameter->parentContent['permalink'] . '#' . $this->parameter->respondId .\n                '\" rel=\"nofollow\"' . ($replyId ? '' : ' style=\"display:none;\"') . ' onclick=\"return TypechoComment.cancelReply();\"><i class=\"reply icon\"></i>' . $word . '</a></div>';\n            }\n        }\n    }\n}"
  },
  {
    "path": "core/extend/FriendCircle_n.php",
    "content": "<?php\nif (!defined('__TYPECHO_ROOT_DIR__')) exit;\nuse Widget\\Base\\Comments;\nuse Widget\\Base\\Contents;\nuse Widget\\Contents\\From;\nclass BearSimple_Widget_Friendcircle_Archive extends Widget_Abstract_Comments\n{\n     /**\n     * 当前页\n     *\n     * @access private\n     * @var integer\n     */\n    private $_currentPage;\n\n    /**\n     * 所有文章个数\n     *\n     * @access private\n     * @var integer\n     */\n    private $_total = false;\n\n    /**\n     * 子父级评论关系\n     *\n     * @access private\n     * @var array\n     */\n    private $_threadedComments = array();\n\n    /**\n     * 多级评论回调函数\n     * \n     * @access private\n     * @var mixed\n     */\n    private $_customThreadedCommentsCallback = false;\n\n    /**\n     * _singleCommentOptions  \n     * \n     * @var mixed\n     * @access private\n     */\n    private $_singleCommentOptions = NULL;\n\n\n    private $_commentAuthors = array();\n\n    /**\n     * 安全组件\n     */\n    private $_security = NULL;\n\n    /**\n     * 构造函数,初始化组件\n     *\n     * @access public\n     * @param mixed $request request对象\n     * @param mixed $response response对象\n     * @param mixed $params 参数列表\n     * @return void\n     */\n    public function __construct($request, $response, $params = NULL)\n    {\n        \n        parent::__construct($request, $response, $params);\n        $this->parameter->setDefault('parentId=0&commentPage=0&commentsNum=0&allowComment=1');\n        \n        Typecho_Widget::widget('Widget_Security')->to($this->_security);\n\n        /** 初始化回调函数 */\n        if (function_exists('threadedComments')) {\n            $this->_customThreadedCommentsCallback = true;\n        }\n    }\n\n\n    public static function updateLocation(int $coid, $location,$type)\n    {\n        $db = \\Typecho\\Db::get();\n        $location = is_array($location) ? serialize($location) : $location;\n        $result = $db->fetchAll($db->select('coid')->from('table.comments')->where('table.comments.coid = ?', $coid));\n        if (is_array($result) && count($result) && $type== 'ipv6') {\n            $updateQuery = $db->update('table.comments')->rows(array('ipv6_location' => $location))->where('coid = ?', $coid);\n            return $db->query($updateQuery) > 0;\n        }\n         if (is_array($result) && count($result) && $type== 'ipv4') {\n\n            $updateQuery = $db->update('table.comments')->rows(array('ipv4_location' => $location))->where('coid = ?', $coid);\n\n            return $db->query($updateQuery) > 0;\n        }\n        return false;\n    }\n    \n     public static function commentRank($i){\n          $db=\\Typecho\\Db::get();\n    $mail=$db->fetchAll($db->select(array('COUNT(cid)'=>'all'))->from('table.comments')->where('mail = ?', $i->mail)->where('authorId = ?','0'));\n    foreach ($mail as $sl){\n    $all=$sl['all'];}\n    if($i->authorId == $i->ownerId){\n    echo '<div class=\"ui circular mini black label bstooltip bstooltip--top\" data-bstooltip=\"博主\" style=\"vertical-align: middle;\"><i class=\"user tie icon\"></i>博主</div>';\n    }\n    else if($all<10 && $all>0) {\n    echo '<div class=\"ui circular mini label bstooltip bstooltip--top\" data-bstooltip=\"等级LV1，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV1</div>';\n    }elseif ($all<20 && $all>=10) {\n    echo '<div class=\"ui circular mini green label bstooltip bstooltip--top\" data-bstooltip=\"等级LV2，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV2</div>';\n    }elseif ($all<40 && $all>=20) {\n    echo '<div class=\"ui circular mini olive label bstooltip bstooltip--top\" data-bstooltip=\"等级LV3，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV3</div>';\n    }elseif ($all<80 && $all>=40) {\n    echo '<div class=\"ui circular mini yellow label bstooltip bstooltip--top\" data-bstooltip=\"等级LV4，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV4</div>';\n    }elseif ($all<100 && $all>=80) {\n    echo '<div class=\"ui circular mini orange label bstooltip bstooltip--top\" data-bstooltip=\"等级LV5，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV5</div>';\n    }elseif ($all>=100) {\n    echo '<div class=\"ui circular mini red label bstooltip bstooltip--top\" data-bstooltip=\"等级LV6，发言数:'.$all.'\" style=\"vertical-align: middle;\"><i class=\"book reader icon\"></i>LV6</div>';\n    }\n     }\n      public static function circle_getInfo($obj){\n        $db=\\Typecho\\Db::get();\n    $info=$db->fetchRow($db->select()->from('table.bscore_friendcircle_data')->where('coid = ?', $obj->coid));  \n    return $info;\n      }\n    public static function circle_getTime($time)\n    {\n        $rtime = date(\"Y年m月d日 H:i\", $time);\n        $htime = date(\"H:i\", $time);\n        $time = time() - $time;\n        if ($time < 60) {\n            $str = '刚刚';\n        } elseif ($time < 60 * 60) {\n            $min = floor($time / 60);\n            $str = $min . '分钟前';\n        } elseif ($time < 60 * 60 * 24) {\n            $h = floor($time / (60 * 60));\n            $str = $h . '小时前 ' . $htime;\n        } elseif ($time < 60 * 60 * 24 * 3) {\n            $d = floor($time / (60 * 60 * 24));\n            if ($d == 1){\n                $ztime = time() - $time;\n       $zztime = date(\"H:i\", $ztime);\n                $str = '昨天 ' . $zztime;\n            }else{\n                $qtime = time() - $time;\n       $qqtime = date(\"H:i\", $qtime);\n                $str = '前天 ' . $qqtime;\n        }} else {\n            $str = $rtime;\n        }\n         return $str;\n}\n\n\n    /**\n     * 评论回调函数\n     * \n     * @access private\n     * @return void\n     */\n    private function threadedCommentsCallback()\n    {\n\n        $singleCommentOptions = $this->_singleCommentOptions;\n        if (function_exists('threadedComments')) {\n            return threadedComments($this, $singleCommentOptions);\n        }\n\n       if(Bsoptions('Lazyload') == true){\n$lazyload = 'class=\"lazy\" data-';\n} \n$db = \\Typecho\\Db::get();\nTypecho_Widget::widget('Widget_User')->to($user);\n$circle_data = $db->fetchRow($db->select()->from('table.bscore_friendcircle_data')->where('coid = ?', $this->coid));\nif(($circle_data['private'] == 1 && (!$this->user->hasLogin() && $this->user->uid !== $this->authorId))){\n    $hidden = 'style=\"display:none;\"';\n}\nif($circle_data['likeVisitor']){\n$likeVisitor = $circle_data['likeVisitor'].'位访客';\n}\nif($circle_data['likeUser'] && $circle_data['likeVisitor']){\n$likeVisitor = '，'.$likeVisitor;    \n}\nif(Bsoptions('fcircle_Avatar') == null){\n$avatar = Helper::options()->themeUrl.'/assets/images/circle_defaultAvatar.jpg';\n}\nelse{\n$avatar = Bsoptions('fcircle_Avatar');\n}\n?>\n        \n        <li id=\"<?php $this->theId(); ?>\" <?php echo $hidden;?>><div class=\"friendcircle-main-level\"><div class=\"friendcircle-avatar\"><img src=\"<?php AssetsDir();?>assets/images/load.gif\" data-src=\"<?php echo $avatar; ?>\"></div><div class=\"friendcircle-box\"><div class=\"friendcircle-head\"><h3 class=\"friendcircle-name by-author\"><?php echo $this->author; ?></h3> </div>\n        <div class=\"friendcircle-content\">\n            \n            \n            <?php echo reEmo($this->content,\"circle\"); ?>\n        <?php if(!empty(self::circle_getInfo($this)['resources'])):\n        \n        ?>\n        \n        <?php \n        $keys = array(\"mp3\",\"mp4\",\"mov\",\"wmv\",\"wma\",\"rmvb\",\"rm\",\"avi\",\"flv\",\"ogg\",\"oga\",\"ogv\",\"flac\",'amr','speex');\n        $resources = json_decode(self::circle_getInfo($this)['resources'],true);\n        $keyword = parse_url(pathinfo($resources[0], PATHINFO_EXTENSION))['path'];\n        $searchIfVideo = false;\n        $type = 'video';\n        foreach($keys as $key){\n           if ($keyword == $key) { \n         $searchIfVideo = true;\n         if ($key == \"mp4\"){\n         $type = 'video';\n         }\n         elseif ($key == \"amr\" || $key == \"speex\"){\n          $type = 'wechat';   \n         }\n         else{\n          $type = 'audio';      \n         }\n           }\n        }\nif($searchIfVideo == true){\n?>\n    <?php if($type == 'video'):?>\n    <div class=\"friendcircle_video\">\n    <video class=\"circle_player\" controls crossorigin playsinline>\n\n<source src=\"<?php echo $resources[0];?>\">\n\n</video>  \n</div>\n<?php elseif($type == 'wechat'):?>\n<div class=\"circle_player\" style=\"margin-top:10px\">\n <button id=\"amr-begin-<?php echo $this->coid; ?>\" class=\"ui small label amr-begin\" data-circleid=\"<?php echo $this->coid; ?>\" data-amrfile=\"<?php echo $resources[0];?>\">加载</button>\n        <button id=\"amr-play-<?php echo $this->coid; ?>\" class=\"ui small green icon label\" style=\"display:none\" disabled><i class=\"play icon\"></i></button>\n        <button id=\"amr-stop-<?php echo $this->coid; ?>\" class=\"ui small red icon label\" style=\"display:none\" disabled><i class=\"stop icon\"></i></button>\n        <input id=\"amr-progress-<?php echo $this->coid; ?>\" type=\"range\" min=\"0\" max=\"1\" step=\"any\" value=\"0\"  class=\"ui range\" disabled>\n        <label for=\"amr-progress-<?php echo $this->coid; ?>\" style=\"vertical-align:middle\">\n            <span id=\"amr-cur-<?php echo $this->coid; ?>\">0'</span>\n            <span>/</span>\n            <span id=\"amr-duration-<?php echo $this->coid; ?>\">0'</span>\n        </label>\n        </div>\n\n<?php elseif($type == 'audio'):?>\n<div class=\"friendcircle_video\">\n<audio class=\"circle_player\" controls>\n  <source src=\"<?php echo $resources[0];?>\">\n</audio>\n</div>\n        \n\n<?php endif;?>\n\n        <?php\n}\nelse{\n    ?>\n\n<div class=\"circle-pictures\"  style=\"grid-template-columns:1fr 1fr 1fr;\">\n        <?php\n        foreach(json_decode(self::circle_getInfo($this)['resources'],true) as $resource):?>\n      <a href=\"<?php echo $resource;?>\" class=\"circle-picture\">\n            <img data-fancybox=\"circle-<?php echo $this->coid; ?>\" src=\"<?php AssetsDir();?>assets/images/load.gif\" data-src=\"<?php echo $resource;?>\"> \n   </a>\n        \n       <?php endforeach;?>\n         </div>\n        <?php }?>\n        <?php endif;?>\n    \n        </div><?php if(!empty(self::circle_getInfo($this)['location'])):?><a class=\"friendcircle-map\" href='https://map.baidu.com/search/<?php echo self::circle_getInfo($this)['location'];?>/@13211813,2842867.25,12z?querytype=s&da_src=shareurl&wd=<?php echo self::circle_getInfo($this)['location'];?>&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\"><?php echo self::circle_getInfo($this)['location'];?></a><?php endif;?><span class=\"friendcircle-time\">\n       <?php $singleCommentOptions->beforeDate();\n                echo self::circle_getTime($this->created);\n                $singleCommentOptions->afterDate(); ?> <a class=\"circle-delete\" style=\"display:none;cursor: default;color:#586B95;margin-left:3px\" data-coid=\"<?php echo $this->coid;?>\"> <i class=\"trash alternate icon\"></i></a></span>\n       <section class=\"friendcircle-action\" id=\"friendcircle-action-<?php echo $this->coid;?>\">\n          <div class=\"ui icon mini label circle-action\" data-toolbar=\"friendcircle-actions\" data-toolbar-style=\"dark\">\n  <i class=\"ellipsis horizontal icon\" style=\"color:#586B95\"></i>\n</div>\n\n<div class=\"tool-container tool-left toolbar-dark animate-standard\" style=\"width:80px;\"><div class=\"tool-items\">\n    <a class=\"circle-like tool-item\" style=\"cursor: default;\" data-coid=\"<?php echo $this->coid;?>\"><i class=\"heart outline icon\"></i> 赞</a>\n    <a class=\"circle-comment tool-item\" style=\"cursor: default;\" data-coid=\"<?php echo $this->coid;?>\"><i class=\"comment alternate outline icon\"></i> 评论</a>\n    </div>\n    <div class=\"arrow\"></div>\n    </div>\n           \n       </section>\n       <?php if ($this->children || $circle_data['likeUser'] || $circle_data['likeVisitor']) { ?>\n       <div class=\"friendcircle-comments\" id=\"friendcircle-comments-<?php echo $this->coid;?>\">\n           <?php if ($circle_data['likeUser'] || $circle_data['likeVisitor']) { ?>\n           <span id=\"friendcircle-comments-like-<?php echo $this->coid;?>\">\n           <i class=\"heart outline icon\"></i> <?php echo $circle_data['likeUser'];?><?php echo $likeVisitor;?>\n           </span>\n           <?php };?>\n           <?php if (($circle_data['likeUser'] || $circle_data['likeVisitor']) && $this->children):?>\n           <hr>\n           <?php endif;?>\n           <?php $this->threadedComments(); ?>\n       </div>\n       <?php };?>\n       </div></div></li>\n      \n       \n\n\n<?php\n    }\n  \n    private function getParent(){\n        $db = \\Typecho\\Db::get();\n        $parentID = $db->fetchRow($db->select('parent')->from('table.comments')->where('coid = ?', $this->coid));\n        $parentID=$parentID['parent'];\n        \n        if($parentID=='0'){ return '';}\n        else {\n            $author=$db->fetchRow($db->select()->from('table.comments')->where('coid = ?', $parentID));\n            \n            if (empty($author['author']) ||!array_key_exists('author', $author) )\n            \n                $author['author'] = '已删除的评论';\n                \n            return '  <span style=\"color:black;font-weight:400\">回复</span> <span> '.$author['author'].'</span> ';\n        }\n    }  \n\n    \n    \n    /**\n     * 获取当前评论链接\n     *\n     * @access protected\n     * @return string\n     */\n    protected function ___permalink() : string\n    {\n\n        if ($this->options->commentsPageBreak) {            \n            $pageRow = array('permalink' => $this->parentContent['pathinfo'], 'commentPage' => $this->_currentPage);\n            return Typecho_Router::url('comment_page',\n                        $pageRow, $this->options->index) . '#' . $this->theId;\n        }\n        \n        return $this->parentContent['permalink'] . '#' . $this->theId;\n    }\n\n    /**\n     * 子评论\n     *\n     * @access protected\n     * @return array\n     */\n    protected function ___children()\n    {\n        return $this->options->commentsThreaded && !$this->isTopLevel && isset($this->_threadedComments[$this->coid]) \n            ? $this->_threadedComments[$this->coid] : array();\n    }\n\n    /**\n     * 是否到达顶层\n     *\n     * @access protected\n     * @return boolean\n     */\n    protected function ___isTopLevel()\n    {\n        return $this->levels > 0;\n    }\n\n    /**\n     * 重载内容获取\n     *\n     * @access protected\n     * @return void\n     */\n    protected function ___parentContent(): Contents\n    {\n        return From::allocWithAlias($this->cid, ['cid' => $this->cid]);\n    }\n\n    /**\n     * 输出文章评论数\n     *\n     * @access public\n     * @param string $string 评论数格式化数据\n     * @return void\n     */\n    public function num()\n    {\n        $args = func_get_args();\n        if (!$args) {\n            $args[] = '%d';\n        }\n\n        $num = intval($this->_total);\n\n        echo sprintf(isset($args[$num]) ? $args[$num] : array_pop($args), $num);\n    }\n  \n  \n    \n    \n    \n    /**\n     * 执行函数\n     *\n     * @access public\n     * @return void\n     */\n    public function execute()\n    {\n        if (!$this->parameter->parentId) {\n            return;\n        }\n$commentsAuthor = Typecho_Cookie::get('__typecho_remember_author');\n        $commentsMail = Typecho_Cookie::get('__typecho_remember_mail');\n\n\n        // 对已登录用户显示待审核评论，方便前台管理\n        if ($this->user->hasLogin()) {\n            $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId)\n                ->where('table.comments.status = ? OR table.comments.status = ?', 'approved', 'waiting');\n        } else {\n            $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId)\n                ->where('table.comments.status = ? OR (table.comments.author = ? AND table.comments.mail = ? AND table.comments.status = ?)', 'approved', $commentsAuthor, $commentsMail, 'waiting');\n        }\n        \n\n        $threadedSelect = NULL;\n        \n        if ($this->options->commentsShowCommentOnly) {\n            $select->where('table.comments.type = ?', 'comment');\n        }\n        \n        $select->order('table.comments.coid', 'ASC');\n        $this->db->fetchAll($select, array($this, 'push'));\n        \n        /** 需要输出的评论列表 */\n        $outputComments = array();\n        \n        /** 如果开启评论回复 */\n        if ($this->options->commentsThreaded) {\n        \n            foreach ($this->stack as $coid => &$comment) {\n            \n                /** 取出父节点 */\n                $parent = $comment['parent'];\n            \n                /** 如果存在父节点 */\n                if (0 != $parent && isset($this->stack[$parent])) {\n             \n                    /** 如果当前节点深度大于最大深度, 则将其挂接在父节点上 */\n                    if ($comment['levels'] >= 2) {\n                        $comment['levels'] = $this->stack[$parent]['levels'];\n                        $parent = $this->stack[$parent]['parent'];     // 上上层节点\n                        $comment['parent'] = $parent;\n                    }\n                \n                    /** 计算子节点顺序 */\n                    $comment['order'] = isset($this->_threadedComments[$parent]) \n                        ? count($this->_threadedComments[$parent]) + 1 : 1;\n                \n                    /** 如果是子节点 */\n                    $this->_threadedComments[$parent][$coid] = $comment;\n                } else {\n                    $outputComments[$coid] = $comment;\n                }\n                \n            }\n        \n            $this->stack = $outputComments;\n        }\n        \n        /** 评论排序 */\n        if ('DESC' == $this->options->commentsOrder) {\n            $this->stack = array_reverse($this->stack, true);\n        }\n        \n        /** 评论总数 */\n        $this->_total = count($this->stack);\n        \n        /** 对评论进行分页 */\n        if ($this->options->commentsPageBreak) {\n            if ('last' == $this->options->commentsPageDisplay && !$this->parameter->commentPage) {\n                $this->_currentPage = ceil($this->_total / $this->options->commentsPageSize);\n            } else {\n                $this->_currentPage = $this->parameter->commentPage ? $this->parameter->commentPage : 1;\n            }\n            \n            /** 截取评论 */\n            $this->stack = array_slice($this->stack,\n                ($this->_currentPage - 1) * $this->options->commentsPageSize, $this->options->commentsPageSize);\n            \n            /** 评论置位 */\n            $this->row = current($this->stack);\n            $this->length = count($this->stack);\n        }\n        \n        reset($this->stack);\n    }\n\n    /**\n     * 将每行的值压入堆栈\n     *\n     * @access public\n     * @param array $value 每行的值\n     * @return array\n     */\n    public function push(array $value) : array\n    {\n        $value = $this->filter($value);\n        \n        /** 计算深度 */\n        if (0 != $value['parent'] && isset($this->stack[$value['parent']]['levels'])) {\n            $value['levels'] = $this->stack[$value['parent']]['levels'] + 1;\n        } else {\n            $value['levels'] = 0;\n        }\n\n        $value['realParent'] = $value['parent'];\n\n        /** 重载push函数,使用coid作为数组键值,便于索引 */\n        $this->stack[$value['coid']] = $value;\n        $this->_commentAuthors[$value['coid']] = $value['author'];\n        $this->length ++;\n        \n        return $value;\n    }\n\n    /**\n     * 输出分页\n     *\n     * @access public\n     * @param string $prev 上一页文字\n     * @param string $next 下一页文字\n     * @param int $splitPage 分割范围\n     * @param string $splitWord 分割字符\n     * @param string $template 展现配置信息\n     * @return void\n     */\n    public function pageNav($prev = '&laquo;', $next = '&raquo;', $splitPage = 3, $splitWord = '...', $template = '')\n    {\n        if ($this->options->commentsPageBreak && $this->_total > $this->options->commentsPageSize) {\n            $default = array(\n                'wrapTag'       =>  'ol',\n                'wrapClass'     =>  'page-navigator'\n            );\n\n            if (is_string($template)) {\n                parse_str($template, $config);\n            } else {\n                $config = $template;\n            }\n\n            $template = array_merge($default, $config);\n\n            $pageRow = $this->parameter->parentContent;\n            $pageRow['permalink'] = $pageRow['pathinfo'];\n\n            $query = Typecho_Router::url('comment_page', $pageRow, $this->options->index);\n\n            /** 使用盒状分页 */\n            $nav = new Typecho_Widget_Helper_PageNavigator_Box($this->_total,\n                $this->_currentPage, $this->options->commentsPageSize, $query);\n            $nav->setPageHolder('commentPage');\n            $nav->setAnchor('comments');\n            \n            echo '<' . $template['wrapTag'] . (empty($template['wrapClass']) \n                    ? '' : ' class=\"' . $template['wrapClass'] . '\"') . '>';\n            $nav->render($prev, $next, $splitPage, $splitWord, $template);\n            echo '</' . $template['wrapTag'] . '>';\n        }\n    }\n\n    /**\n     * 递归输出评论\n     *\n     * @access protected\n     * @return void\n     */\n    public function threadedComments()\n    {\n\n        $children = $this->children;\n        \n        \n        if ($children) {\n            //缓存变量便于还原\n            $tmp = $this->row;\n            $this->sequence ++;\n\n            //在子评论之前输出\n            //echo $this->_singleCommentOptions->before;\n\n            foreach ($children as $child) {\n                $this->row = $child;\n                echo '<div id=\"circle-children-'.$this->coid.'\" class=\"circle-comment-tain\">'.$this->author.$this->getParent().'<span style=\"color:black;font-weight:400\" class=\"circle-comment-children\" data-coid=\"'.$this->coid.'\" data-parentName=\"'.$this->author.'\"> : '.reEmo($this->text,\"circle\").'</span></div>';\n                $this->row = $tmp;\n            }\n\n            //在子评论之后输出\n            //echo $this->_singleCommentOptions->after;\n\n            $this->sequence --;\n        }\n    }\n    \n    /**\n     * 列出评论\n     * \n     * @access private\n     * @param mixed $singleCommentOptions 单个评论自定义选项\n     * @return void\n     */\n    public function listComments($singleCommentOptions = NULL)\n    {\n        //初始化一些变量\n        $this->_singleCommentOptions = Typecho_Config::factory($singleCommentOptions);\n        $this->_singleCommentOptions->setDefault(array(\n            'before'        =>  '<ol class=\"comment-list\">',\n            'after'         =>  '</ol>',\n            'beforeAuthor'  =>  '',\n            'afterAuthor'   =>  '',\n            'beforeDate'    =>  '',\n            'afterDate'     =>  '',\n            'dateFormat'    =>  $this->options->commentDateFormat,\n            'replyWord'     =>  '回复',\n            'commentStatus' =>  '评论正等待审核!',\n            'avatarSize'    =>  32,\n            'defaultAvatar' =>  NULL\n        ));\n        $this->pluginHandle()->trigger($plugged)->listComments($this->_singleCommentOptions, $this);\n\n        if (!$plugged) {\n            if ($this->have()) { \n                echo $this->_singleCommentOptions->before;\n            \n                while ($this->next()) {\n                    $this->threadedCommentsCallback();\n                }\n            \n                echo $this->_singleCommentOptions->after;\n            }\n        }\n    }\n    \n    /**\n     * 重载alt函数,以适应多级评论\n     * \n     * @access public\n     * @return void\n     */\n    public function alt(...$args)\n    {\n        $args = func_get_args();\n        $num = func_num_args();\n        \n        $sequence = $this->levels <= 0 ? $this->sequence : $this->order;\n        \n        $split = $sequence % $num;\n        echo $args[(0 == $split ? $num : $split) -1];\n    }\n\n    /**\n     * 根据深度余数输出\n     *\n     * @access public\n     * @param string $param 需要输出的值\n     * @return void\n     */\n    public function levelsAlt()\n    {\n        $args = func_get_args();\n        $num = func_num_args();\n        $split = $this->levels % $num;\n        echo $args[(0 == $split ? $num : $split) -1];\n    }\n    \n    /**\n     * 评论回复链接\n     * \n     * @access public\n     * @param string $word 回复链接文字\n     * @return void\n     */\n    public function reply(string $word = '')\n    {\n        if ($this->options->commentsThreaded && $this->parameter->allowComment) {\n            $word = empty($word) ? _t('回复') : $word;\n            self::pluginHandle()->trigger($plugged)->call('reply', $word, $this);\n\n            if (!$plugged) {\n                echo '<a no-pjax href=\"' . substr($this->permalink, 0, - strlen($this->theId) - 1) . '?replyTo=' . $this->coid .\n                    '#' . $this->parameter->respondId . '\" rel=\"nofollow\" onclick=\"return TypechoComment.reply(\\'' .\n                    $this->theId . '\\', ' . $this->coid . ', this);\">' . $word . '</a>';\n            }\n        }\n    }\n    \n    /**\n     * 取消评论回复链接\n     * \n     * @access public\n     * @param string $word 取消回复链接文字\n     * @return void\n     */\n    public function cancelReply($word = '')\n    {\n        if ($this->options->commentsThreaded) {\n            $word = empty($word) ? ' 取消回复' : $word;\n            $this->pluginHandle()->trigger($plugged)->cancelReply($word, $this);\n            \n            if (!$plugged) {\n                $replyId = $this->request->filter('int')->replyTo;\n                echo '<div class=\"cancel-comment-reply\" style=\"margin-top:18px;\"><a style=\"display:none;\" class=\"ui mini icon button\" id=\"cancel-comment-reply-link\" href=\"' . $this->parameter->parentContent['permalink'] . '#' . $this->parameter->respondId .\n                '\" rel=\"nofollow\"' . ($replyId ? '' : ' style=\"display:none;\"') . ' onclick=\"return TypechoComment.cancelReply();\"><i class=\"reply icon\"></i>' . $word . '</a></div>';\n            }\n        }\n    }\n}"
  },
  {
    "path": "core/extend/UserAgent.class.php",
    "content": "<?php\n\nclass BearsimpleUserAgent\n{\n   \n    public static function render($agent,$ctype = 'time')\n    {\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    global $imgurl;\n    global $agents;\n    $agents = $agent;\n    $imgurl = Helper::options()->themeUrl.'/assets/images/UserAgent';\n         \n    require_once dirname(__FILE__).'/get_os.php';\n    $ua_os = get_os($agent);\n    $ua_os_img = self::img(\"/os/\", $ua_os['code'], $ua_os['title'],$ctype);\n    require_once dirname(__FILE__).'/get_browser.php';\n    $ua_browser = get_browser_name($agent);\n    $ua_browser_img = self::img(\"/browser/\", $ua_browser['code'], $ua_browser['title'],$ctype);\nif($agents == 'weixin'){\n    $ua =  $ua_os_img;\n}\nelse{\n    $ua =  \"&nbsp;\" . $ua_os_img . \"&nbsp;\" . $ua_browser_img;\n}\n        echo $ua;\n    }\n public static function img($code, $type, $title,$ctype)\n    {\n        global $imgurl;\n        global $agents;\n        if(empty($code)){\n            $code = 'android';\n        }\n        if($code == 'U'){\n            $code = 'chrome';\n        }\n       if($ctype == 'comment'){\n           if($agents == 'weixin'){\n          $img = '<i class=\"weixin green icon\"></i>';     \n           }\n           else{\n        $img = \"<img style='vertical-align: middle;' src='\" . $imgurl.$code.$type .  \".svg' height='15' width='15' />\";\n           }\n}\nelse{\n    if($agents == 'weixin'){\n        $img = '<i class=\"weixin green icon\"></i> <small>发自微信公众号</small>';      \n           }\n           else{\n    $img = \"<img style='vertical-align: middle;' src='\" . $imgurl.$code.$type .  \".svg'  alt='\" . $title . \"' height='15' width='15' />\";\n           }\n}\n        return $img;\n    }\n    \n}"
  },
  {
    "path": "core/extend/get_browser.php",
    "content": "<?php\n\n/**\n * Copyright 2008-2016 Kyle Baker (Email: kyleabaker@gmail.com)\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * any later version.\n * \n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n * \n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/* Partly modified by Hakula */\n\n/* Detect Web Browser Version */\nfunction get_browser_version($ua, $title) {\n    // Grab the browser version if it's present\n    preg_match('/' . $title . '[\\ |\\/|\\:]?([.0-9a-zA-Z]+)/i', $ua, $regmatch);\n    $version = (is_null($regmatch[1])) ? '' : $regmatch[1];\n    return $version;\n}\n\n/* Detect Web Browsers */\nfunction get_browser_name($ua) {\n    $version = '';\n    $code = null;\n\n    if (preg_match('/360se/i', $ua)) {\n        $title = '360 安全浏览器';\n        $code = '360';\n    } elseif (preg_match('/baidubrowser/i', $ua) || preg_match('/\\ Spark/i', $ua)) {\n        $title = '百度浏览器';\n        $version = get_browser_version($ua, 'Browser');\n        $code = 'BaiduBrowser';\n    } elseif (preg_match('/SE\\ /i', $ua) && preg_match('/MetaSr/i', $ua)) {\n        $title = '搜狗高速浏览器';\n        $code = 'Sogou-Explorer';\n    } elseif (preg_match('/QQBrowser/i', $ua) || preg_match('/MQQBrowser/i', $ua)) {\n        $title = 'QQ 浏览器';\n        $version = get_browser_version($ua, 'QQBrowser');\n        $code = 'QQBrowser';\n    } elseif (preg_match('/chromeframe/i', $ua)) {\n        $title = 'Google Chrome Frame';\n        $version = get_browser_version($ua, 'chromeframe');\n        $code = 'Chrome';\n    } elseif (preg_match('/Chromium/i', $ua)) {\n        $title = 'Chromium';\n        $version = get_browser_version($ua, 'Chromium');\n    } elseif (preg_match('/CrMo/i', $ua)) {\n        $title = 'Google Chrome Mobile';\n        $version = get_browser_version($ua, 'CrMo');\n        $code = 'Chrome';\n    } elseif (preg_match('/CriOS/i', $ua)) {\n        $title = 'Google Chrome for iOS';\n        $version = get_browser_version($ua, 'CriOS');\n        $code = 'Chrome';\n    } elseif (preg_match('/Maxthon/i', $ua)) {\n        $title = '傲游浏览器';\n        $version = get_browser_version($ua, 'Maxthon');\n        $code = 'Maxthon';\n    } elseif (preg_match('/MiuiBrowser/i', $ua)) {\n        $title = 'MIUI Browser';\n        $version = get_browser_version($ua, 'MiuiBrowser');\n        $code = 'MIUI-Browser';\n    } elseif (preg_match('/TheWorld/i', $ua)) {\n        $title = '世界之窗浏览器';\n        $code = 'TheWorld';\n    } elseif (preg_match('/UBrowser/i', $ua)) {\n        $title = 'UC 浏览器';\n        $version = get_browser_version($ua, 'UBrowser');\n        $code = 'UC';\n    } elseif (preg_match('/UCBrowser/i', $ua)) {\n        $title = 'UC 浏览器';\n        $version = get_browser_version($ua, 'UCBrowser');\n        $code = 'UC';\n    } elseif (preg_match('/UC\\ Browser/i', $ua)) {\n        $title = 'UC 浏览器';\n        $version = get_browser_version($ua, 'UC Browser');\n        $code = 'UC';\n    } elseif (preg_match('/UCWEB/i', $ua)) {\n        $title = 'UC 浏览器';\n        $version = get_browser_version($ua, 'UCWEB');\n        $code = 'UC';\n    } elseif (preg_match('/BlackBerry/i', $ua)) {\n        $title = 'BlackBerry';\n    } elseif (preg_match('/Coast/i', $ua)) {\n        $title = 'Coast';\n        $version = get_browser_version($ua, 'Coast');\n        $code = 'Opera';\n    } elseif (preg_match('/IEMobile/i', $ua)) {\n        $title = 'IE Mobile';\n        $code = 'IE';\n    } elseif (preg_match('/LG Browser/i', $ua)) {\n        $title = 'LG Web Browser';\n        $version = get_browser_version($ua, 'Browser');\n        $code = 'LG';\n    } elseif (preg_match('/Navigator/i', $ua)) {\n        $title = 'Netscape Navigator';\n        $code = 'Netscape';\n    } elseif (preg_match('/Netscape/i', $ua)) {\n        $title = 'Netscape';\n    } elseif (preg_match('/Nintendo 3DS/i', $ua)) {\n        $title = 'Nintendo 3DS';\n        $code = 'Nintendo';\n    } elseif (preg_match('/NintendoBrowser/i', $ua)) {\n        $title = 'Nintendo Browser';\n        $version = get_browser_version($ua, 'Browser');\n        $code = 'Nintendo';\n    } elseif (preg_match('/NokiaBrowser/i', $ua)) {\n        $title = 'Nokia Browser';\n        $version = get_browser_version($ua, 'Browser');\n        $code = 'Nokia';\n    } elseif (preg_match('/Opera Mini/i', $ua)) {\n        $title = 'Opera Mini';\n        $code = 'Opera';\n    } elseif (preg_match('/Opera Mobi/i', $ua)) {\n        if (preg_match('/Version/i', $ua)) {\n            $version = get_browser_version($ua, 'Version');\n        } else {\n            $version = get_browser_version($ua, 'Opera Mobi');\n        }\n        $title = 'Opera Mobile';\n        $code = 'Opera';\n    } elseif (preg_match('/Opera/i', $ua) || preg_match('/OPR/i', $ua)) {\n        $title = 'Opera';\n        $code = 'Opera';\n        // How is version stored on this Opera ua?\n        if (preg_match('/Version/i', $ua)) {\n            $version = get_browser_version($ua, 'Version');\n        } elseif (preg_match('/OPR/i', $ua)) {\n            $version = get_browser_version($ua, 'OPR');\n        } else {\n            // Use Opera as fallback since full title may change (Next, Developer, etc.)\n            $version = get_browser_version($ua, 'Opera');\n        }\n        // Parse full edition name, ex: Opera/9.80 (X11; Linux x86_64; U; Edition Labs Camera and Pages; Ubuntu/11.10; en) Presto/2.9.220 Version/12.00\n        if (preg_match('/Edition ([\\ ._0-9a-zA-Z]+)/i', $ua, $regmatch)) {\n            $title .= ' ' . $regmatch[1];\n        } elseif (preg_match('/Opera ([\\ ._0-9a-zA-Z]+)/i', $ua, $regmatch)) {\n            $title .= ' ' . $regmatch[1];\n        }\n    } elseif (preg_match('/PlayStation\\ 4/i', $ua)) {\n        $title = 'PS4 Web Browser';\n        $code = 'PS4';\n    } elseif (preg_match('/SEMC-Browser/i', $ua)) {\n        $title = 'SEMC Browser';\n        $version = get_browser_version($ua, 'SEMC-Browser');\n        $code = 'Sony';\n    } elseif (preg_match('/SEMC-java/i', $ua)) {\n        $title = 'SEMC Java';\n        $code = 'Sony';\n    } elseif (preg_match('/Series60/i', $ua) && !preg_match('/Symbian/i', $ua)) {\n        $title = 'Nokia S60';\n        $version = get_browser_version($ua, 'Series60');\n        $code = 'Nokia';\n    } elseif (preg_match('/S60/i', $ua) && !preg_match('/Symbian/i', $ua)) {\n        $title = 'Nokia S60';\n        $version = get_browser_version($ua, 'S60');\n        $code = 'Nokia';\n    } elseif (preg_match('/TencentTraveler/i', $ua)) {\n        $title = 'TT 浏览器';\n        $version = get_browser_version($ua, 'TencentTraveler');\n        $code = 'QQBrowser';\n    } elseif ((preg_match('/Ubuntu\\;\\ Mobile/i', $ua) || preg_match('/Ubuntu\\;\\ Tablet/i', $ua) && preg_match('/WebKit/i', $ua))) {\n        $title = 'Ubuntu Web Browser';\n        $code = 'Ubuntu';\n    } elseif (preg_match('/AppleWebkit/i', $ua) && preg_match('/Android/i', $ua) && !preg_match('/Chrome/i', $ua)) {\n        $title = 'Android Webkit';\n        $version = get_browser_version($ua, 'Version');\n        $code = 'Android-Webkit';\n    } elseif (preg_match('/Chrome/i', $ua) && preg_match('/Mobile/i', $ua) && (preg_match('/Version/i', $ua) || preg_match('/wv/i', $ua))) {\n        $title = 'WebView';\n        $version = get_browser_version($ua, 'Version');\n        $code = 'Android-Webkit';\n    }\n    // Pulled out of order to help ensure better detection for above browsers\n    elseif (preg_match('/Edge/i', $ua) && preg_match('/Chrome/i', $ua) && preg_match('/Safari/i', $ua)) {\n        $title = 'Microsoft Edge';\n        $version = get_browser_version($ua, 'Edge');\n        $code = 'Edge';\n    } elseif (preg_match('/Chrome/i', $ua)) {\n        $title = 'Google Chrome';\n        $version = get_browser_version($ua, 'Chrome');\n        $code = 'Chrome';\n    } elseif (preg_match('/Safari/i', $ua) && !preg_match('/Nokia/i', $ua)) {\n        $title = 'Safari';\n        $code = 'Safari';\n        if (preg_match('/Version/i', $ua)) {\n            $version = get_browser_version($ua, 'Version');\n        }\n        if (preg_match('/Mobile Safari/i', $ua)) {\n            $title = 'Mobile ' . $title;\n        }\n    } elseif (preg_match('/Nokia/i', $ua)) {\n        $title = 'Nokia Web Browser';\n        $code = 'Nokia';\n    } elseif (preg_match('/Firefox/i', $ua)) {\n        $title = 'Firefox';\n        $version = get_browser_version($ua, 'Firefox');\n    } elseif (preg_match('/MSIE/i', $ua) || preg_match('/Trident/i', $ua)) {\n        $title = 'Internet Explorer';\n        $code = 'IE';\n        if (preg_match('/\\ rv:([.0-9a-zA-Z]+)/i', $ua)) {\n            // IE11 or newer\n            $version = get_browser_version($ua, ' rv');\n        } else {\n            // IE10 or older, regex: '/MSIE[\\ |\\/]?([.0-9a-zA-Z]+)/i'\n            $version = get_browser_version($ua, 'MSIE');\n        }\n        // Detect compatibility mode for IE\n        if ($version === '7.0' && preg_match('/Trident\\/4.0/i', $ua)) {\n            $version = '8.0 (Compatibility Mode)';\n        }\n    } elseif (preg_match('/Mozilla/i', $ua)) {\n        $title = 'Mozilla';\n        $version = get_browser_version($ua, ' rv');\n        if (empty($version)) {\n            $title .= ' Compatible';\n            $code = 'Mozilla';\n        }\n    }\n    // No Web browser match\n    else {\n        $title = 'Other Browser';\n        $code = 'Others';\n    }\n    if (is_null($code)) {\n        $code = $title;\n    }\n    if ($version != '') {\n        $title .= \" $version\";\n    }\n\n    $result['code'] = $code;\n    $result['title'] = $title;\n    return $result;\n}\n"
  },
  {
    "path": "core/extend/get_os.php",
    "content": "<?php\n\n/**\n * Copyright 2008-2016 Kyle Baker (Email: kyleabaker@gmail.com)\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * any later version.\n * \n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n * \n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/* Partly modified by Hakula */\n\n/* Detect Operating System */\nfunction get_os($ua) {\n    $version = null;\n    $code = null;\n\n    if (preg_match('/Windows/i', $ua) || preg_match('/WinNT/i', $ua) || preg_match('/Win32/i', $ua)) {\n        $title = 'Windows';\n        if (preg_match('/Windows NT 10.0/i', $ua) || preg_match('/Windows NT 6.4/i', $ua)) {\n            $version = '10';\n            $code = 'Windows-10';\n        } elseif (preg_match('/Windows NT 6.3/i', $ua)) {\n            $version = '8.1';\n            $code = 'Windows-8';\n        } elseif (preg_match('/Windows NT 6.2/i', $ua)) {\n            $version = '8';\n            $code = 'Windows-8';\n        } elseif (preg_match('/Windows NT 6.1/i', $ua)) {\n            $version = '7';\n        } elseif (preg_match('/Windows NT 6.0/i', $ua)) {\n            $version = 'Vista';\n        } elseif (preg_match('/Windows NT 5.2 x64/i', $ua)) {\n            $version = 'XP'; // x64 Edition very similar to Win 2003\n        } elseif (preg_match('/Windows NT 5.2/i', $ua)) {\n            $version = 'Server 2003';\n        } elseif (preg_match('/Windows NT 5.1/i', $ua) || preg_match('/Windows XP/i', $ua)) {\n            $version = 'XP';\n        } elseif (preg_match('/Windows NT 5.01/i', $ua)) {\n            $version = '2000 (SP1)';\n        } elseif (preg_match('/Windows NT 5.0/i', $ua) || preg_match('/Windows NT5/i', $ua) || preg_match('/Windows 2000/i', $ua)) {\n            $version = '2000';\n        } elseif (preg_match('/Windows NT 4.0/i', $ua) || preg_match('/WinNT4.0/i', $ua)) {\n            $version = 'NT 4.0';\n        } elseif (preg_match('/Windows NT 3.51/i', $ua) || preg_match('/WinNT3.51/i', $ua)) {\n            $version = 'NT 3.11';\n        } elseif (preg_match('/Windows NT/i', $ua) || preg_match('/WinNT/i', $ua)) {\n            $version = 'NT';\n        } elseif (preg_match('/Windows 3.11/i', $ua) || preg_match('/Win3.11/i', $ua) || preg_match('/Win16/i', $ua)) {\n            $version = '3.11';\n        } elseif (preg_match('/Windows 3.1/i', $ua)) {\n            $version = '3.1';\n        } elseif (preg_match('/Windows 98; Win 9x 4.90/i', $ua) || preg_match('/Win 9x 4.90/i', $ua) || preg_match('/Windows ME/i', $ua)) {\n            $version = 'ME';\n        } elseif (preg_match('/Win98/i', $ua)) {\n            $version = '98 SE';\n        } elseif (preg_match('/Windows 98/i', $ua) || preg_match('/Windows\\ 4.10/i', $ua)) {\n            $version = '98';\n        } elseif (preg_match('/Windows 95/i', $ua) || preg_match('/Win95/i', $ua)) {\n            $version = '95';\n        } elseif (preg_match('/Windows CE/i', $ua)) {\n            $version = 'CE';\n        } elseif (preg_match('/WM5/i', $ua)) {\n            $version = 'Mobile 5';\n        } elseif (preg_match('/WindowsMobile/i', $ua)) {\n            $version = 'Mobile';\n        }\n    } elseif (preg_match('/Android/i', $ua)) {\n        $title = 'Android';\n        if (preg_match('/Android[\\ |\\/]?([.0-9a-zA-Z]+)/i', $ua, $regmatch)) {\n            $version = $regmatch[1];\n        }\n    } elseif (preg_match('/Mac/i', $ua) || preg_match('/Darwin/i', $ua)) {\n        $title = 'Mac OS X';\n        $code = 'Apple';\n        if (preg_match('/Mac OS X/i', $ua) || preg_match('/Mac OSX/i', $ua)) {\n            if (preg_match('/iPhone/i', $ua)) {\n                $title = 'iOS';\n                $version = substr($ua, strpos(strtolower($ua), strtolower('iPhone OS')) + 10);\n                // Parse iOS version number\n                $version = substr($version, 0, strpos($version, 'l') - 1);\n            } elseif (preg_match('/iPad/i', $ua)) {\n                $title = 'iOS';\n                $version = substr($ua, strpos(strtolower($ua), strtolower('CPU OS')) + 7);\n                $version = substr($version, 0, strpos($version, 'l') - 1);\n            } elseif (preg_match('/Mac OS X/i', $ua)) {\n                $version = substr($ua, strpos(strtolower($ua), strtolower('OS X')) + 5);\n                // Parse OS X version number\n                $version = substr($version, 0, strpos($version, ')'));\n            } else {\n                $version = substr($ua, strpos(strtolower($ua), strtolower('OSX')) + 4);\n                $version = substr($version, 0, strpos($version, ')'));\n            }\n            // Parse OS X version number\n            if (strpos($version, ';') > -1) {\n                $version = substr($version, 0, strpos($version, ';'));\n            }\n            // Beautify version format\n            $version = str_replace('_', '.', $version);\n        } elseif (preg_match('/Darwin/i', $ua)) {\n            $title = 'Mac OS Darwin';\n        } else {\n            $title = 'Macintosh';\n        }\n    } elseif (preg_match('/[^A-Za-z]Arch/i', $ua)) {\n        $title = 'Arch Linux';\n        $code = 'Arch-Linux';\n    } elseif (preg_match('/BlackBerry/i', $ua)) {\n        $title = 'BlackBerryOS';\n    } elseif (preg_match('/CentOS/i', $ua)) {\n        $title = 'CentOS';\n        if (preg_match('/.el([.0-9a-zA-Z]+).centos/i', $ua, $regmatch)) {\n            $version = $regmatch[1];\n        }\n    } elseif (preg_match('/CrOS/i', $ua)) {\n        $title = 'Google Chrome OS';\n        $code = 'Chrome-OS';\n    } elseif (preg_match('/Debian/i', $ua)) {\n        $title = 'Debian GNU/Linux';\n        $code = 'Debian';\n    } elseif (preg_match('/Fedora/i', $ua)) {\n        $title = 'Fedora';\n        if (preg_match('/.fc([.0-9a-zA-Z]+)/i', $ua, $regmatch)) {\n            $version = $regmatch[1];\n        }\n    } elseif (preg_match('/FreeBSD/i', $ua)) {\n        $title = 'FreeBSD';\n    } elseif (preg_match('/OpenBSD/i', $ua)) {\n        $title = 'OpenBSD';\n    } elseif (preg_match('/Oracle/i', $ua)) {\n        $title = 'Oracle';\n        $code = 'Oracle-Linux';\n        if (preg_match('/.el([._0-9a-zA-Z]+)/i', $ua, $regmatch)) {\n            $title .= ' Enterprise Linux';\n            $version = str_replace('_', '.', $regmatch[1]);\n        } else {\n            $title .= ' Linux';\n        }\n    } elseif (preg_match('/Red\\ Hat/i', $ua) || preg_match('/RedHat/i', $ua)) {\n        $title = 'Red Hat';\n        $code = 'Red-Hat';\n        if (preg_match('/.el([._0-9a-zA-Z]+)/i', $ua, $regmatch)) {\n            $title .= ' Enterprise Linux';\n            $version = str_replace('_', '.', $regmatch[1]);\n        }\n    } elseif (preg_match('/Solaris/i', $ua) || preg_match('/SunOS/i', $ua)) {\n        $title = 'Solaris';\n    } elseif (preg_match('/Symb[ian]?[OS]?/i', $ua)) {\n        $title = 'SymbianOS';\n        if (preg_match('/Symb[ian]?[OS]?\\/([.0-9a-zA-Z]+)/i', $ua, $regmatch)) {\n            $version = $regmatch[1];\n        }\n    } elseif (preg_match('/Ubuntu/i', $ua)) {\n        $title = 'Ubuntu';\n        if (preg_match('/Ubuntu[\\/|\\ ]([.0-9]+[.0-9a-zA-Z]+)/i', $ua, $regmatch)) {\n            $version = $regmatch[1];\n        }\n    } elseif (preg_match('/Linux/i', $ua)) {\n        $title = 'GNU/Linux';\n        $code = 'Linux';\n    } elseif (preg_match('/J2ME\\/MIDP/i', $ua)) {\n        $title = 'J2ME/MIDP Device';\n        $code = 'Java';\n    }\n    // No OS match\n    else {\n        $title = 'Other System';\n        $code = 'Others';\n    }\n    // Check x64 architecture\n    if (preg_match('/x86_64/i', $ua)) {\n        // If version isn't null append 64 bit, otherwise set it to x64\n        $version = (is_null($version)) ? 'x64' : \"$version x64\";\n    } elseif ((preg_match('/Windows/i', $ua) || preg_match('/WinNT/i', $ua) || preg_match('/Win32/i', $ua))\n        && (preg_match('/Win64/i', $ua) || preg_match('/x64/i', $ua) || preg_match('/WOW64/i', $ua))\n    ) {\n        $version .= ' x64 Edition';\n    }\n\n    if (is_null($code)) {\n        $code = $title;\n    }\n    // Append version to title\n    if (isset($version)) {\n        $title .= \" $version\";\n    }\n    $result['code'] = $code;\n    $result['title'] = $title;\n    return $result;\n}\n"
  },
  {
    "path": "core/extend/otherFunc.php",
    "content": "<?php\nfunction chunkSplit($string,$length,$end,$once=false) {\n\t$array = array();\n\t$strlen = mb_strlen($string);\n\twhile($strlen) {\n\t\t$array[] = mb_substr($string, 0, $length, \"utf-8\");\n\t\tif($once)\n\t\treturn $array[0] . $end;\n\t\t$string = mb_substr($string, $length, $strlen, \"utf-8\");\n\t\t$strlen = mb_strlen($string);\n\t}\n\treturn implode($end, $array);\n}\nfunction ServerInfo() {\n\t$systemInfo = array();\n\t$systemInfo['系统'] = PHP_OS;\n\t$systemInfo['PHP版本'] = PHP_VERSION;\n\t$systemInfo['软件'] = $_SERVER['SERVER_SOFTWARE'];\n\t$systemInfo['ZEND版本'] = zend_version();\n\tif(function_exists('gd_info')) {\n\t\t$gdInfo = gd_info();\n\t\t$systemInfo['GD库是否支持'] = \"是\";\n\t\t$systemInfo['GD库版本'] = $gdInfo['GD Version'];\n\t} else {\n\t\t$systemInfo['GD库是否支持'] = \"否\";\n\t\t$systemInfo['GD库版本'] = '';\n\t}\n\t$systemInfo['安全模式'] = ini_get('safe_mode');\n\t$systemInfo['注册全局变量'] = ini_get('register_globals');\n\t$systemInfo['开启魔术引用'] = (function_exists(\"get_magic_quotes_gpc\") && get_magic_quotes_gpc());\n\t$systemInfo['最大上传文件大小'] = ini_get('upload_max_filesize');\n\t$systemInfo['脚本运行占用最大内存'] = get_cfg_var(\"memory_limit\") ? get_cfg_var(\"memory_limit\") : '-';\n\treturn $systemInfo;\n}\nfunction Get_BKN($skey) {\n\t$len=strlen($skey);\n\t$hash=5381;\n\tfor ($i=0;$i<$len;$i++) {\n\t\t$hash+=((($hash<<5) & 0x7fffffff)+ord($skey[$i])) & 0x7fffffff;\n\t\t$hash&=0x7fffffff;\n\t}\n\treturn $hash & 0x7fffffff;\n}\nfunction GetBkn($skey) {\n\t$hash = 5381;\n\tfor ($i = 0, $len = strlen($skey); $i < $len; ++$i) {\n\t\t$hash +=($hash << 5) + charCodeAt($skey, $i);\n\t}\n\treturn $hash & 2147483647;\n}\nfunction charset($str,$charset='UTF-8') {\n\t$encode=mb_detect_encoding($str,[\"ASCII\",'UTF-8',\"GB2312\",\"GBK\",'BIG5']);\n\tif($encode!==strtoupper($charset))\n\t$str=mb_convert_encoding($str,$charset,$encode);\n\treturn $str;\n}\nfunction GetGTK($skey) {\n\t$len = strlen($skey);\n\t$hash = 5381;\n\tfor ($i = 0; $i < $len; $i++) {\n\t\t$hash += ($hash << 5 & 2147483647) + ord($skey[$i]) & 2147483647;\n\t\t$hash &= 2147483647;\n\t}\n\treturn $hash & 2147483647;\n}\nfunction RanText($pat) {\n\t$file=file($pat);\n\t$arr=mt_rand(0,count($file)-1);\n\t$content=trim($file[$arr]);\n\treturn $content;\n}\nfunction getip_user() {\n\tif(empty($_SERVER[\"HTTP_CLIENT_IP\"]) == false) {\n\t\t$cip = $_SERVER[\"HTTP_CLIENT_IP\"];\n\t} else if(empty($_SERVER[\"HTTP_X_FORWARDED_FOR\"]) == false) {\n\t\t$cip = $_SERVER[\"HTTP_X_FORWARDED_FOR\"];\n\t} else if(empty($_SERVER[\"REMOTE_ADDR\"]) == false) {\n\t\t$cip = $_SERVER[\"REMOTE_ADDR\"];\n\t} else {\n\t\t$cip = \"\";\n\t}\n\tpreg_match(\"/[\\d\\.]{7,15}/\", $cip, $cips);\n\t$cip = isset($cips[0]) ? $cips[0] : \"\";\n\tunset($cips);\n\treturn $cip;\n}\nfunction text($array,$two=false) {\n\tif(!is_array($array)) {\n\t\treturn $array;\n\t}\n\tif($two) {\n\t\t$array_data=\"[\\n\";\n\t} else {\n\t\t$array_data=\"/\\n\";\n\t}\n\tforeach($array as $k=>$v) {\n\t\tif(is_array($v)) {\n\t\t\t$array_data.=\"[\".$k.\"]:\".text($v,true).\"\\n\";\n\t\t} else {\n\t\t\tif($two) {\n\t\t\t\t$array_data.=\"[\".$k.\"]:\".$v.\"\\n\";\n\t\t\t} else {\n\t\t\t\t$array_data.=\"[\".$k.\"]:\".$v.\"\\n\";\n\t\t\t}\n\t\t}\n\t}\n\tif($two) {\n\t\t$array_data.=\"]\";\n\t} else {\n\t\t$array_data.=\"/\";\n\t}\n\treturn $array_data;\n}\nfunction xml($data, $root = true) {\n\t$str=\"\";\n\tif($root)$str .= \"<xml>\";\n\tforeach($data as $key => $val) {\n\t\tif(is_array($val)) {\n\t\t\t$child = xml($val, false);\n\t\t\t$str .= \"<$key>$child</$key>\";\n\t\t} else {\n\t\t\t$str.= \"<$key>$val</$key>\";\n\t\t}\n\t}\n\tif($root)$str .= \"</xml>\";\n\treturn $str;\n}\nfunction Back($array=array(),$types=false) {\n\tif($types==\"print\") {\n\t\tprint_r($array);\n\t} else if($types==\"die\") {\n\t\tdie($array);\n\t} else if($types==\"echo\") {\n\t\techo($array);\n\t} else {\n\t\t$type=$_REQUEST[\"format\"]?:\"json\";\n\t\tswitch($type) {\n\t\t\tcase \"text\":\n\t\t\theader('Content-Type: text/html; charset=utf-8');\n\t\t\techo text($array);\n\t\t\tbreak;\n\t\t\tcase \"xml\":\n\t\t\theader(\"Content-type: text/xml\");\n\t\t\t$xml = new Array_to_Xml();\n\t\t\t//实例化类\n\t\t\techo $xml->toXml($array);\n\t\t\t//转为数组\n\t\t\tbreak;\n\t\t\tdefault:\n\t\t\theader('Content-type: application/json');\n\t\t\techo json_encode($array,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);\n\t\t\tbreak;\n\t\t}\n\t}\n}\nfunction curl($url,$data=0,$header_array=0,$referer=0,$time=30,$code=0) {\n\tif($header_array==0) {\n\t\t$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');\n\t} else {\n\t\t$header=array(\"CLIENT-IP: \".getip_user(),\"X-FORWARDED-FOR: \".getip_user());\n\t\t$header=array_merge($header_array,$header);\n\t}\n\t//print_r($header);\n\t$curl=curl_init();\n\tcurl_setopt($curl,CURLOPT_URL,$url);\n\tcurl_setopt($curl,CURLOPT_HTTPHEADER,$header);\n\tif($data) {\n\t\tcurl_setopt($curl,CURLOPT_POST,1);\n\t\tcurl_setopt($curl,CURLOPT_POSTFIELDS,$data);\n\t}\n\tif($referer) {\n\t\tcurl_setopt($curl,CURLOPT_REFERER,$referer);\n\t}\n\tcurl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 3);\n\t//设置等待时间\n\tcurl_setopt($curl,CURLOPT_TIMEOUT,$time);\n\tcurl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);\n\tcurl_setopt($curl,CURLOPT_RETURNTRANSFER,1);\n\tcurl_setopt($curl,CURLOPT_SSL_VERIFYPEER, FALSE);\n\tcurl_setopt($curl,CURLOPT_SSL_VERIFYHOST, FALSE);\n\tcurl_setopt($curl,CURLOPT_ENCODING,'gzip,deflate');\n\tif($code) {\n\t\tcurl_setopt($curl, CURLOPT_HEADER, 1);\n\t\t$return=curl_exec($curl);\n\t\t$code_code=curl_getinfo($curl);\n\t\tcurl_close($curl);\n\t\t$code_int['exec']=substr($return,$code_code[\"header_size\"]);\n\t\t$code_int['code']=$code_code[\"http_code\"];\n\t\t$code_int['content_type']=$code_code[\"content_type\"];\n\t\t$code_int['header']=substr($return,0,$code_code[\"header_size\"]);\n\t\treturn $code_int;\n\t} else {\n\t\t$return=curl_exec($curl);\n\t\tcurl_close($curl);\n\t\treturn $return;\n\t}\n}\nfunction str_Intercept($txt1,$q1,$h1) {\n\t$txt1=strstr($txt1,$q1);\n\t$cd=strlen($q1);\n\t$txt1=substr($txt1,$cd);\n\t$txt1=strstr($txt1,$h1,\"TRUE\");\n\treturn $txt1;\n}\nclass Array_to_Xml {\n\tprivate $version  = '1.0';\n\tprivate $encoding  = 'UTF-8';\n\tprivate $root    = 'xml';\n\tprivate $xml    = null;\n\tfunction __construct() {\n\t\t$this->xml = new XmlWriter();\n\t}\n\tfunction toXml($data, $eIsArray=FALSE) {\n\t\tif(!$eIsArray) {\n\t\t\t$this->xml->openMemory();\n\t\t\t$this->xml->startDocument($this->version, $this->encoding);\n\t\t\t$this->xml->startElement($this->root);\n\t\t}\n\t\tforeach($data as $key => $value) {\n\t\t\tif(is_array($value)) {\n\t\t\t\t$this->xml->startElement($key);\n\t\t\t\t$this->toXml($value, TRUE);\n\t\t\t\t$this->xml->endElement();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t$this->xml->writeElement($key, $value);\n\t\t}\n\t\tif(!$eIsArray) {\n\t\t\t$this->xml->endElement();\n\t\t\treturn $this->xml->outputMemory(true);\n\t\t}\n\t}\n}\nfunction charCodeAt($str, $index) {\n\t$char = mb_substr($str, $index, 1, 'UTF-8');\n\t$value = null;\n\tif (mb_check_encoding($char, 'UTF-8')) {\n\t\t$ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8');\n\t\t$value = hexdec(bin2hex($ret));\n\t}\n\treturn $value;\n}\nfunction cache_get_contents($list, $name, $type = \"text\") {\n\tclearstatcache();\n\t$fp_name = ApiRun.\"cache/\". $list . \".txt\";\n\t$fp = fopen($fp_name, \"r\");\n\tflock($fp, LOCK_EX);\n\t$fp_open = fread($fp, filesize($fp_name));\n\tif ($type != \"text\") {\n\t\treturn $fp_open;\n\t} else {\n\t\t$encode = base64_encode($name);\n\t\t$json = json_decode($fp_open, true);\n\t\treturn $json[$encode];\n\t}\n\tflock($fp, LOCK_UN);\n\tfclose($fp);\n}\nfunction cache_put_contents($list,$name,$msg) {\n\tclearstatcache();\n\t$encode = base64_encode($name);\n\t$fp_name = ApiRun.\"cache/\". $list . \".txt\";\n\t$dir = dirname($fp_name);\n\tif(!is_dir($dir)) {\n\t\tmkdir($dir, 0777, true);\n\t}\n\t$read = cache_get_contents($list,$name,\"json\");\n\tif(!$read) {\n\t\t$json = array();\n\t} else {\n\t\t$json = json_decode($read, true);\n\t}\n\t$now_array = array($encode => $msg);\n\t$new_array = array_merge($json, $now_array);\n\t$new_json = json_encode($new_array);\n\t$fp = fopen($fp_name, \"w\");\n\tflock($fp, LOCK_EX);\n\tfwrite($fp, $new_json);\n\tflock($fp, LOCK_UN);\n\tfclose($fp);\n}\nfunction GetCookie() {\n\t$skey=$_REQUEST[\"skey\"]?:$_COOKIE[\"skey\"];\n\t$pskey=$_REQUEST[\"pskey\"]?:$_REQUEST[\"p_skey\"]?:$_COOKIE[\"pskey\"];\n\t$uin=$_REQUEST[\"uin\"];\n\tif(!empty($_COOKIE[\"skey\"])) {\n\t\t$cookie=\"\";\n\t\tforeach($_COOKIE as $key=>$value) {\n\t\t\t$cookie.=$key.\"=\".$value.\";\";\n\t\t}\n\t} else {\n\t\tif(!$skey|!$uin) {\n\t\t\treturn false;\n\t\t}\n\t\t$cookie=\"skey=\".$skey.\"; uin=o\".$uin.\"; p_skey=\".$pskey.\"; p_uin=o\".$uin.\"\";\n\t}\n\treturn $cookie;\n}"
  },
  {
    "path": "core/extend/pinyin.lang",
    "content": "吖ā,阿ā,啊ā,锕ā,錒ā,嗄á,厑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"
  },
  {
    "path": "core/extend/vendor/autoload_538.php",
    "content": "<?php\n\n// autoload.php @generated by Composer\n\nrequire_once __DIR__ . '/composer/autoload_real_538.php';\n\nreturn ComposerAutoloaderInit02c6cf0724d02c2d58870d6c38bf7129::getLoader();\n"
  },
  {
    "path": "core/extend/vendor/composer/ClassLoader.php",
    "content": "<?php\n\n/*\n * This file is part of Composer.\n *\n * (c) Nils Adermann <naderman@naderman.de>\n *     Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Composer\\Autoload;\n\n/**\n * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.\n *\n *     $loader = new \\Composer\\Autoload\\ClassLoader();\n *\n *     // register classes with namespaces\n *     $loader->add('Symfony\\Component', __DIR__.'/component');\n *     $loader->add('Symfony',           __DIR__.'/framework');\n *\n *     // activate the autoloader\n *     $loader->register();\n *\n *     // to enable searching the include path (eg. for PEAR packages)\n *     $loader->setUseIncludePath(true);\n *\n * In this example, if you try to use a class in the Symfony\\Component\n * namespace or one of its children (Symfony\\Component\\Console for instance),\n * the autoloader will first look for the class under the component/\n * directory, and it will then fallback to the framework/ directory if not\n * found before giving up.\n *\n * This class is loosely based on the Symfony UniversalClassLoader.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @see    https://www.php-fig.org/psr/psr-0/\n * @see    https://www.php-fig.org/psr/psr-4/\n */\nclass ClassLoader\n{\n    private $vendorDir;\n\n    // PSR-4\n    private $prefixLengthsPsr4 = array();\n    private $prefixDirsPsr4 = array();\n    private $fallbackDirsPsr4 = array();\n\n    // PSR-0\n    private $prefixesPsr0 = array();\n    private $fallbackDirsPsr0 = array();\n\n    private $useIncludePath = false;\n    private $classMap = array();\n    private $classMapAuthoritative = false;\n    private $missingClasses = array();\n    private $apcuPrefix;\n\n    private static $registeredLoaders = array();\n\n    public function __construct($vendorDir = null)\n    {\n        $this->vendorDir = $vendorDir;\n    }\n\n    public function getPrefixes()\n    {\n        if (!empty($this->prefixesPsr0)) {\n            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));\n        }\n\n        return array();\n    }\n\n    public function getPrefixesPsr4()\n    {\n        return $this->prefixDirsPsr4;\n    }\n\n    public function getFallbackDirs()\n    {\n        return $this->fallbackDirsPsr0;\n    }\n\n    public function getFallbackDirsPsr4()\n    {\n        return $this->fallbackDirsPsr4;\n    }\n\n    public function getClassMap()\n    {\n        return $this->classMap;\n    }\n\n    /**\n     * @param array $classMap Class to filename map\n     */\n    public function addClassMap(array $classMap)\n    {\n        if ($this->classMap) {\n            $this->classMap = array_merge($this->classMap, $classMap);\n        } else {\n            $this->classMap = $classMap;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix, either\n     * appending or prepending to the ones previously set for this prefix.\n     *\n     * @param string       $prefix  The prefix\n     * @param array|string $paths   The PSR-0 root directories\n     * @param bool         $prepend Whether to prepend the directories\n     */\n    public function add($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            if ($prepend) {\n                $this->fallbackDirsPsr0 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr0\n                );\n            } else {\n                $this->fallbackDirsPsr0 = array_merge(\n                    $this->fallbackDirsPsr0,\n                    (array) $paths\n                );\n            }\n\n            return;\n        }\n\n        $first = $prefix[0];\n        if (!isset($this->prefixesPsr0[$first][$prefix])) {\n            $this->prefixesPsr0[$first][$prefix] = (array) $paths;\n\n            return;\n        }\n        if ($prepend) {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixesPsr0[$first][$prefix]\n            );\n        } else {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                $this->prefixesPsr0[$first][$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace, either\n     * appending or prepending to the ones previously set for this namespace.\n     *\n     * @param string       $prefix  The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths   The PSR-4 base directories\n     * @param bool         $prepend Whether to prepend the directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function addPsr4($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            // Register directories for the root namespace.\n            if ($prepend) {\n                $this->fallbackDirsPsr4 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr4\n                );\n            } else {\n                $this->fallbackDirsPsr4 = array_merge(\n                    $this->fallbackDirsPsr4,\n                    (array) $paths\n                );\n            }\n        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {\n            // Register directories for a new namespace.\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        } elseif ($prepend) {\n            // Prepend directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixDirsPsr4[$prefix]\n            );\n        } else {\n            // Append directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                $this->prefixDirsPsr4[$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix,\n     * replacing any others previously set for this prefix.\n     *\n     * @param string       $prefix The prefix\n     * @param array|string $paths  The PSR-0 base directories\n     */\n    public function set($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr0 = (array) $paths;\n        } else {\n            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace,\n     * replacing any others previously set for this namespace.\n     *\n     * @param string       $prefix The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths  The PSR-4 base directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function setPsr4($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr4 = (array) $paths;\n        } else {\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Turns on searching the include path for class files.\n     *\n     * @param bool $useIncludePath\n     */\n    public function setUseIncludePath($useIncludePath)\n    {\n        $this->useIncludePath = $useIncludePath;\n    }\n\n    /**\n     * Can be used to check if the autoloader uses the include path to check\n     * for classes.\n     *\n     * @return bool\n     */\n    public function getUseIncludePath()\n    {\n        return $this->useIncludePath;\n    }\n\n    /**\n     * Turns off searching the prefix and fallback directories for classes\n     * that have not been registered with the class map.\n     *\n     * @param bool $classMapAuthoritative\n     */\n    public function setClassMapAuthoritative($classMapAuthoritative)\n    {\n        $this->classMapAuthoritative = $classMapAuthoritative;\n    }\n\n    /**\n     * Should class lookup fail if not found in the current class map?\n     *\n     * @return bool\n     */\n    public function isClassMapAuthoritative()\n    {\n        return $this->classMapAuthoritative;\n    }\n\n    /**\n     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.\n     *\n     * @param string|null $apcuPrefix\n     */\n    public function setApcuPrefix($apcuPrefix)\n    {\n        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;\n    }\n\n    /**\n     * The APCu prefix in use, or null if APCu caching is not enabled.\n     *\n     * @return string|null\n     */\n    public function getApcuPrefix()\n    {\n        return $this->apcuPrefix;\n    }\n\n    /**\n     * Registers this instance as an autoloader.\n     *\n     * @param bool $prepend Whether to prepend the autoloader or not\n     */\n    public function register($prepend = false)\n    {\n        spl_autoload_register(array($this, 'loadClass'), true, $prepend);\n\n        if (null === $this->vendorDir) {\n            return;\n        }\n\n        if ($prepend) {\n            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;\n        } else {\n            unset(self::$registeredLoaders[$this->vendorDir]);\n            self::$registeredLoaders[$this->vendorDir] = $this;\n        }\n    }\n\n    /**\n     * Unregisters this instance as an autoloader.\n     */\n    public function unregister()\n    {\n        spl_autoload_unregister(array($this, 'loadClass'));\n\n        if (null !== $this->vendorDir) {\n            unset(self::$registeredLoaders[$this->vendorDir]);\n        }\n    }\n\n    /**\n     * Loads the given class or interface.\n     *\n     * @param  string    $class The name of the class\n     * @return bool|null True if loaded, null otherwise\n     */\n    public function loadClass($class)\n    {\n        if ($file = $this->findFile($class)) {\n            includeFile($file);\n\n            return true;\n        }\n    }\n\n    /**\n     * Finds the path to the file where the class is defined.\n     *\n     * @param string $class The name of the class\n     *\n     * @return string|false The path if found, false otherwise\n     */\n    public function findFile($class)\n    {\n        // class map lookup\n        if (isset($this->classMap[$class])) {\n            return $this->classMap[$class];\n        }\n        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {\n            return false;\n        }\n        if (null !== $this->apcuPrefix) {\n            $file = apcu_fetch($this->apcuPrefix.$class, $hit);\n            if ($hit) {\n                return $file;\n            }\n        }\n\n        $file = $this->findFileWithExtension($class, '.php');\n\n        // Search for Hack files if we are running on HHVM\n        if (false === $file && defined('HHVM_VERSION')) {\n            $file = $this->findFileWithExtension($class, '.hh');\n        }\n\n        if (null !== $this->apcuPrefix) {\n            apcu_add($this->apcuPrefix.$class, $file);\n        }\n\n        if (false === $file) {\n            // Remember that this class does not exist.\n            $this->missingClasses[$class] = true;\n        }\n\n        return $file;\n    }\n\n    /**\n     * Returns the currently registered loaders indexed by their corresponding vendor directories.\n     *\n     * @return self[]\n     */\n    public static function getRegisteredLoaders()\n    {\n        return self::$registeredLoaders;\n    }\n\n    private function findFileWithExtension($class, $ext)\n    {\n        // PSR-4 lookup\n        $logicalPathPsr4 = strtr($class, '\\\\', DIRECTORY_SEPARATOR) . $ext;\n\n        $first = $class[0];\n        if (isset($this->prefixLengthsPsr4[$first])) {\n            $subPath = $class;\n            while (false !== $lastPos = strrpos($subPath, '\\\\')) {\n                $subPath = substr($subPath, 0, $lastPos);\n                $search = $subPath . '\\\\';\n                if (isset($this->prefixDirsPsr4[$search])) {\n                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);\n                    foreach ($this->prefixDirsPsr4[$search] as $dir) {\n                        if (file_exists($file = $dir . $pathEnd)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-4 fallback dirs\n        foreach ($this->fallbackDirsPsr4 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 lookup\n        if (false !== $pos = strrpos($class, '\\\\')) {\n            // namespaced class name\n            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)\n                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);\n        } else {\n            // PEAR-like class name\n            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;\n        }\n\n        if (isset($this->prefixesPsr0[$first])) {\n            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {\n                if (0 === strpos($class, $prefix)) {\n                    foreach ($dirs as $dir) {\n                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-0 fallback dirs\n        foreach ($this->fallbackDirsPsr0 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 include paths.\n        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {\n            return $file;\n        }\n\n        return false;\n    }\n}\n\n/**\n * Scope isolated include.\n *\n * Prevents access to $this/self from included files.\n */\nfunction includeFile($file)\n{\n    include $file;\n}\n"
  },
  {
    "path": "core/extend/vendor/composer/InstalledVersions.php",
    "content": "<?php\n\n\n\n\n\n\n\n\n\n\n\nnamespace Composer;\n\nuse Composer\\Autoload\\ClassLoader;\nuse Composer\\Semver\\VersionParser;\n\n\n\n\n\n\n\n\nclass InstalledVersions\n{\nprivate static $installed = array (\n  'root' => \n  array (\n    'pretty_version' => '1.0.0+no-version-set',\n    'version' => '1.0.0.0',\n    'aliases' => \n    array (\n    ),\n    'reference' => NULL,\n    'name' => '__root__',\n  ),\n  'versions' => \n  array (\n    '__root__' => \n    array (\n      'pretty_version' => '1.0.0+no-version-set',\n      'version' => '1.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => NULL,\n    ),\n    'maxmind-db/reader' => \n    array (\n      'pretty_version' => 'v1.12.0',\n      'version' => '1.12.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90',\n    ),\n  ),\n);\nprivate static $canGetVendors;\nprivate static $installedByVendor = array();\n\n\n\n\n\n\n\npublic static function getInstalledPackages()\n{\n$packages = array();\nforeach (self::getInstalled() as $installed) {\n$packages[] = array_keys($installed['versions']);\n}\n\nif (1 === \\count($packages)) {\nreturn $packages[0];\n}\n\nreturn array_keys(array_flip(\\call_user_func_array('array_merge', $packages)));\n}\n\n\n\n\n\n\n\n\n\npublic static function isInstalled($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (isset($installed['versions'][$packageName])) {\nreturn true;\n}\n}\n\nreturn false;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\npublic static function satisfies(VersionParser $parser, $packageName, $constraint)\n{\n$constraint = $parser->parseConstraints($constraint);\n$provided = $parser->parseConstraints(self::getVersionRanges($packageName));\n\nreturn $provided->matches($constraint);\n}\n\n\n\n\n\n\n\n\n\n\npublic static function getVersionRanges($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\n$ranges = array();\nif (isset($installed['versions'][$packageName]['pretty_version'])) {\n$ranges[] = $installed['versions'][$packageName]['pretty_version'];\n}\nif (array_key_exists('aliases', $installed['versions'][$packageName])) {\n$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);\n}\nif (array_key_exists('replaced', $installed['versions'][$packageName])) {\n$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);\n}\nif (array_key_exists('provided', $installed['versions'][$packageName])) {\n$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);\n}\n\nreturn implode(' || ', $ranges);\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getVersion($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\nif (!isset($installed['versions'][$packageName]['version'])) {\nreturn null;\n}\n\nreturn $installed['versions'][$packageName]['version'];\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getPrettyVersion($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\nif (!isset($installed['versions'][$packageName]['pretty_version'])) {\nreturn null;\n}\n\nreturn $installed['versions'][$packageName]['pretty_version'];\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getReference($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\nif (!isset($installed['versions'][$packageName]['reference'])) {\nreturn null;\n}\n\nreturn $installed['versions'][$packageName]['reference'];\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getRootPackage()\n{\n$installed = self::getInstalled();\n\nreturn $installed[0]['root'];\n}\n\n\n\n\n\n\n\n\npublic static function getRawData()\n{\n@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);\n\nreturn self::$installed;\n}\n\n\n\n\n\n\n\npublic static function getAllRawData()\n{\nreturn self::getInstalled();\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\npublic static function reload($data)\n{\nself::$installed = $data;\nself::$installedByVendor = array();\n}\n\n\n\n\n\nprivate static function getInstalled()\n{\nif (null === self::$canGetVendors) {\nself::$canGetVendors = method_exists('Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders');\n}\n\n$installed = array();\n\nif (self::$canGetVendors) {\nforeach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {\nif (isset(self::$installedByVendor[$vendorDir])) {\n$installed[] = self::$installedByVendor[$vendorDir];\n} elseif (is_file($vendorDir.'/composer/installed.php')) {\n$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';\n}\n}\n}\n\n$installed[] = self::$installed;\n\nreturn $installed;\n}\n}\n"
  },
  {
    "path": "core/extend/vendor/composer/LICENSE",
    "content": "\nCopyright (c) Nils Adermann, Jordi Boggiano\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n"
  },
  {
    "path": "core/extend/vendor/composer/autoload_classmap.php",
    "content": "<?php\n\n// autoload_classmap.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'Composer\\\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',\n);\n"
  },
  {
    "path": "core/extend/vendor/composer/autoload_namespaces.php",
    "content": "<?php\n\n// autoload_namespaces.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n);\n"
  },
  {
    "path": "core/extend/vendor/composer/autoload_psr4.php",
    "content": "<?php\n\n// autoload_psr4.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'MaxMind\\\\Db\\\\' => array($vendorDir . '/maxmind-db/reader/src/MaxMind/Db'),\n);\n"
  },
  {
    "path": "core/extend/vendor/composer/autoload_real_538.php",
    "content": "<?php\n\n// autoload_real.php @generated by Composer\n\nclass ComposerAutoloaderInit02c6cf0724d02c2d58870d6c38bf7129\n{\n    private static $loader;\n\n    public static function loadClassLoader($class)\n    {\n        if ('Composer\\Autoload\\ClassLoader' === $class) {\n            require __DIR__ . '/ClassLoader.php';\n        }\n    }\n\n    /**\n     * @return \\Composer\\Autoload\\ClassLoader\n     */\n    public static function getLoader()\n    {\n        if (null !== self::$loader) {\n            return self::$loader;\n        }\n\n        require __DIR__ . '/platform_check.php';\n\n        spl_autoload_register(array('ComposerAutoloaderInit02c6cf0724d02c2d58870d6c38bf7129', 'loadClassLoader'), true, true);\n        self::$loader = $loader = new \\Composer\\Autoload\\ClassLoader(\\dirname(\\dirname(__FILE__)));\n        spl_autoload_unregister(array('ComposerAutoloaderInit02c6cf0724d02c2d58870d6c38bf7129', 'loadClassLoader'));\n\n        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());\n        if ($useStaticLoader) {\n            require __DIR__ . '/autoload_static.php';\n\n            call_user_func(\\Composer\\Autoload\\ComposerStaticInit02c6cf0724d02c2d58870d6c38bf7129::getInitializer($loader));\n        } else {\n            $map = require __DIR__ . '/autoload_namespaces.php';\n            foreach ($map as $namespace => $path) {\n                $loader->set($namespace, $path);\n            }\n\n            $map = require __DIR__ . '/autoload_psr4.php';\n            foreach ($map as $namespace => $path) {\n                $loader->setPsr4($namespace, $path);\n            }\n\n            $classMap = require __DIR__ . '/autoload_classmap.php';\n            if ($classMap) {\n                $loader->addClassMap($classMap);\n            }\n        }\n\n        $loader->register(true);\n\n        return $loader;\n    }\n}\n"
  },
  {
    "path": "core/extend/vendor/composer/autoload_static.php",
    "content": "<?php\n\n// autoload_static.php @generated by Composer\n\nnamespace Composer\\Autoload;\n\nclass ComposerStaticInit02c6cf0724d02c2d58870d6c38bf7129\n{\n    public static $prefixLengthsPsr4 = array (\n        'M' => \n        array (\n            'MaxMind\\\\Db\\\\' => 11,\n        ),\n    );\n\n    public static $prefixDirsPsr4 = array (\n        'MaxMind\\\\Db\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/maxmind-db/reader/src/MaxMind/Db',\n        ),\n    );\n\n    public static $classMap = array (\n        'Composer\\\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',\n    );\n\n    public static function getInitializer(ClassLoader $loader)\n    {\n        return \\Closure::bind(function () use ($loader) {\n            $loader->prefixLengthsPsr4 = ComposerStaticInit02c6cf0724d02c2d58870d6c38bf7129::$prefixLengthsPsr4;\n            $loader->prefixDirsPsr4 = ComposerStaticInit02c6cf0724d02c2d58870d6c38bf7129::$prefixDirsPsr4;\n            $loader->classMap = ComposerStaticInit02c6cf0724d02c2d58870d6c38bf7129::$classMap;\n\n        }, null, ClassLoader::class);\n    }\n}\n"
  },
  {
    "path": "core/extend/vendor/composer/installed.json",
    "content": "{\n    \"packages\": [\n        {\n            \"name\": \"maxmind-db/reader\",\n            \"version\": \"v1.12.0\",\n            \"version_normalized\": \"1.12.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/maxmind/MaxMind-DB-Reader-php.git\",\n                \"reference\": \"5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90\",\n                \"reference\": \"5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"conflict\": {\n                \"ext-maxminddb\": \"<1.11.1 || >=2.0.0\"\n            },\n            \"require-dev\": {\n                \"friendsofphp/php-cs-fixer\": \"3.*\",\n                \"phpstan/phpstan\": \"*\",\n                \"phpunit/phpunit\": \">=8.0.0,<10.0.0\",\n                \"squizlabs/php_codesniffer\": \"3.*\"\n            },\n            \"suggest\": {\n                \"ext-bcmath\": \"bcmath or gmp is required for decoding larger integers with the pure PHP decoder\",\n                \"ext-gmp\": \"bcmath or gmp is required for decoding larger integers with the pure PHP decoder\",\n                \"ext-maxminddb\": \"A C-based database decoder that provides significantly faster lookups\"\n            },\n            \"time\": \"2024-11-14T22:43:47+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"MaxMind\\\\Db\\\\\": \"src/MaxMind/Db\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"Apache-2.0\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Gregory J. Oschwald\",\n                    \"email\": \"goschwald@maxmind.com\",\n                    \"homepage\": \"https://www.maxmind.com/\"\n                }\n            ],\n            \"description\": \"MaxMind DB Reader API\",\n            \"homepage\": \"https://github.com/maxmind/MaxMind-DB-Reader-php\",\n            \"keywords\": [\n                \"database\",\n                \"geoip\",\n                \"geoip2\",\n                \"geolocation\",\n                \"maxmind\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/maxmind/MaxMind-DB-Reader-php/issues\",\n                \"source\": \"https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.12.0\"\n            },\n            \"install-path\": \"../maxmind-db/reader\"\n        }\n    ],\n    \"dev\": true,\n    \"dev-package-names\": []\n}\n"
  },
  {
    "path": "core/extend/vendor/composer/installed.php",
    "content": "<?php return array (\n  'root' => \n  array (\n    'pretty_version' => '1.0.0+no-version-set',\n    'version' => '1.0.0.0',\n    'aliases' => \n    array (\n    ),\n    'reference' => NULL,\n    'name' => '__root__',\n  ),\n  'versions' => \n  array (\n    '__root__' => \n    array (\n      'pretty_version' => '1.0.0+no-version-set',\n      'version' => '1.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => NULL,\n    ),\n    'maxmind-db/reader' => \n    array (\n      'pretty_version' => 'v1.12.0',\n      'version' => '1.12.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90',\n    ),\n  ),\n);\n"
  },
  {
    "path": "core/extend/vendor/composer/platform_check.php",
    "content": "<?php\n\n// platform_check.php @generated by Composer\n\n$issues = array();\n\nif (!(PHP_VERSION_ID >= 70200)) {\n    $issues[] = 'Your Composer dependencies require a PHP version \">= 7.2.0\". You are running ' . PHP_VERSION . '.';\n}\n\nif ($issues) {\n    if (!headers_sent()) {\n        header('HTTP/1.1 500 Internal Server Error');\n    }\n    if (!ini_get('display_errors')) {\n        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {\n            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);\n        } elseif (!headers_sent()) {\n            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;\n        }\n    }\n    trigger_error(\n        'Composer detected issues in your platform: ' . implode(' ', $issues),\n        E_USER_ERROR\n    );\n}\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/CHANGELOG.md",
    "content": "CHANGELOG\n=========\n\n1.12.0 (2024-11-14)\n-------------------\n\n* Improve the error handling when the user tries to open a directory\n  with the pure PHP reader.\n* Improve the typehints on arrays in the PHPDocs.\n\n1.11.1 (2023-12-01)\n-------------------\n\n* Resolve warnings when compiling the C extension.\n* Fix various type issues detected by PHPStan level. Pull request by\n  LauraTaylorUK. GitHub #160.\n\n1.11.0 (2021-10-18)\n-------------------\n\n* Replace runtime define of a constant to facilitate opcache preloading.\n  Reported by vedadkajtaz. GitHub #134.\n* Resolve minor issue found by the Clang static analyzer in the C\n  extension.\n\n1.10.1 (2021-04-14)\n-------------------\n\n* Fix a `TypeError` exception in the pure PHP reader when using large\n  databases on 32-bit PHP builds with the `bcmath` extension. Reported\n  by dodo1708. GitHub #124.\n\n1.10.0 (2021-02-09)\n-------------------\n\n* When using the pure PHP reader, unsigned integers up to PHP_MAX_INT\n  will now be integers in PHP rather than strings. Previously integers\n  greater than 2^24 on 32-bit platforms and 2^56 on 64-bit platforms\n  would be strings due to the use of `gmp` or `bcmath` to decode them.\n  Reported by Alejandro Celaya. GitHub #119.\n\n1.9.0 (2021-01-07)\n------------------\n\n* The `maxminddb` extension is now buildable on Windows. Pull request\n  by Jan Ehrhardt. GitHub #115.\n\n1.8.0 (2020-10-01)\n------------------\n\n* Fixes for PHP 8.0. Pull Request by Remi Collet. GitHub #108.\n\n1.7.0 (2020-08-07)\n------------------\n\n* IMPORTANT: PHP 7.2 or greater is now required.\n* The extension no longer depends on the pure PHP classes in\n  `maxmind-db/reader`. You can use it independently.\n* Type hints have been added to both the pure PHP implementation\n  and the extension.\n* The `metadata` method on the reader now returns a new copy of the\n  metadata object rather than the actual object used by the reader.\n* Work around PHP `is_readable()` bug. Reported by Ben Roberts. GitHub\n  #92.\n* This is the first release of the extension as a PECL package.\n  GitHub #34.\n\n1.6.0 (2019-12-19)\n------------------\n\n* 1.5.0 and 1.5.1 contained a possible memory corruptions when using\n  `getWithPrefixLen`. This has been fixed. Reported by proton-ab.\n  GitHub #96.\n* The `composer.json` file now conflicts with all versions of the\n  `maxminddb` C extension less than the Composer version. This is to\n  reduce the chance of having an older, conflicting version of the\n  extension installed. You will need to upgrade the extension before\n  running `composer update`. Pull request by Benoît Burnichon. GitHub\n  #97.\n\n1.5.1 (2019-12-12)\n------------------\n\n* Minor performance improvements.\n* Make tests pass with older versions of libmaxminddb. PR by Remi\n  Collet. GitHub #90.\n* Test enhancements. PR by Chun-Sheng, Li. GitHub #91.\n\n1.5.0 (2019-09-30)\n------------------\n\n* PHP 5.6 or greater is now required.\n* The C extension now supports PHP 8. Pull request by John Boehr.\n  GitHub #87.\n* A new method, `getWithPrefixLen`, was added to the `Reader` class.\n  This method returns an array containing the record and the prefix\n  length for that record. GitHub #89.\n\n1.4.1 (2019-01-04)\n------------------\n\n* The `maxminddb` extension now returns a string when a `uint32`\n  value is greater than `LONG_MAX`. Previously, the value would\n  overflow. This generally only affects 32-bit machines.  Reported\n  by Remi Collet. GitHub #79.\n* For `uint64` values, the `maxminddb` extension now returns an\n  integer rather than a string when the value is less than or equal\n  to `LONG_MAX`. This more closely matches the behavior of the pure\n  PHP reader.\n\n1.4.0 (2018-11-20)\n------------------\n\n* The `maxminddb` extension now has the arginfo when using reflection.\n  PR by Remi Collet. GitHub #75.\n* The `maxminddb` extension now provides `MINFO()` function that\n  displays the extension version and the libmaxminddb version. PR by\n  Remi Collet. GitHub #74.\n* The `maxminddb` `configure` script now uses `pkg-config` when\n  available to get libmaxmindb build info. PR by Remi Collet.\n  GitHub #73.\n* The pure PHP reader now correctly decodes integers on 32-bit platforms.\n  Previously, large integers would overflow. Reported by Remi Collet.\n  GitHub #77.\n* There are small performance improvements for the pure PHP reader.\n\n1.3.0 (2018-02-21)\n------------------\n\n* IMPORTANT: The `maxminddb` extension now obeys `open_basedir`. If\n  `open_basedir` is set, you _must_ store the database within the\n  specified directory. Placing the file outside of this directory\n  will result in an exception. Please test your integration before\n  upgrading the extension. This does not affect the pure PHP\n  implementation, which has always had this restriction. Reported\n  by Benoît Burnichon. GitHub #61.\n* A custom `autoload.php` file is provided for installations without\n  Composer. GitHub #56.\n\n1.2.0 (2017-10-27)\n------------------\n\n* PHP 5.4 or greater is now required.\n* The `Reader` class for the `maxminddb` extension is no longer final.\n  This was change to match the behavior of the pure PHP class.\n  Reported and fixed by venyii. GitHub #52 & #54.\n\n1.1.3 (2017-01-19)\n------------------\n\n* Fix incorrect version in `ext/php_maxminddb.h`. GitHub #48.\n\n1.1.2 (2016-11-22)\n------------------\n\n* Searching for database metadata only occurs within the last 128KB\n  (128 * 1024 bytes) of the file, speeding detection of corrupt\n  datafiles. Reported by Eric Teubert. GitHub #42.\n* Suggest relevant extensions when installing with Composer. GitHub #37.\n\n1.1.1 (2016-09-15)\n------------------\n\n* Development files were added to the `.gitattributes` as `export-ignore` so\n  that they are not part of the Composer release. Pull request by Michele\n  Locati. GitHub #39.\n\n1.1.0 (2016-01-04)\n------------------\n\n* The MaxMind DB extension now supports PHP 7. Pull request by John Boehr.\n  GitHub #27.\n\n1.0.3 (2015-03-13)\n------------------\n\n* All uses of `strlen` were removed. This should prevent issues in situations\n  where the function is overloaded or otherwise broken.\n\n1.0.2 (2015-01-19)\n------------------\n\n* Previously the MaxMind DB extension would cause a segfault if the Reader\n  object's destructor was called without first having called the constructor.\n  (Reported by Matthias Saou & Juan Peri. GitHub #20.)\n\n1.0.1 (2015-01-12)\n------------------\n\n* In the last several releases, the version number in the extension was\n  incorrect. This release is being done to correct it. No other code changes\n  are included.\n\n1.0.0 (2014-09-22)\n------------------\n\n* First production release.\n* In the pure PHP reader, a string length test after `fread()` was replaced\n  with the difference between the start pointer and the end pointer. This\n  provided a 15% speed increase.\n\n0.3.3 (2014-09-15)\n------------------\n\n* Clarified behavior of 128-bit type in documentation.\n* Updated phpunit and fixed some test breakage from the newer version.\n\n0.3.2 (2014-09-10)\n------------------\n\n* Fixed invalid reference to global class RuntimeException from namespaced\n  code. Fixed by Steven Don. GitHub issue #15.\n* Additional documentation of `Metadata` class as well as misc. documentation\n  cleanup.\n\n0.3.1 (2014-05-01)\n------------------\n\n* The API now works when `mbstring.func_overload` is set.\n* BCMath is no longer required. If the decoder encounters a big integer,\n  it will try to use GMP and then BCMath. If both of those fail, it will\n  throw an exception. No databases released by MaxMind currently use big\n  integers.\n* The API now officially supports HHVM when using the pure PHP reader.\n\n0.3.0 (2014-02-19)\n------------------\n\n* This API is now licensed under the Apache License, Version 2.0.\n* The code for the C extension was cleaned up, fixing several potential\n  issues.\n\n0.2.0 (2013-10-21)\n------------------\n\n* Added optional C extension for using libmaxminddb in place of the pure PHP\n  reader.\n* Significantly improved error handling in pure PHP reader.\n* Improved performance for IPv4 lookups in an IPv6 database.\n\n0.1.0 (2013-07-16)\n------------------\n\n* Initial release\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/README.md",
    "content": "# MaxMind DB Reader PHP API #\n\n## Description ##\n\nThis is the PHP API for reading MaxMind DB files. MaxMind DB is a binary file\nformat that stores data indexed by IP address subnets (IPv4 or IPv6).\n\n## Installation (Composer) ##\n\nWe recommend installing this package with [Composer](https://getcomposer.org/).\n\n### Download Composer ###\n\nTo download Composer, run in the root directory of your project:\n\n```bash\ncurl -sS https://getcomposer.org/installer | php\n```\n\nYou should now have the file `composer.phar` in your project directory.\n\n### Install Dependencies ###\n\nRun in your project root:\n\n```\nphp composer.phar require maxmind-db/reader:~1.0\n```\n\nYou should now have the files `composer.json` and `composer.lock` as well as\nthe directory `vendor` in your project directory. If you use a version control\nsystem, `composer.json` should be added to it.\n\n### Require Autoloader ###\n\nAfter installing the dependencies, you need to require the Composer autoloader\nfrom your code:\n\n```php\nrequire 'vendor/autoload.php';\n```\n\n## Installation (Standalone) ##\n\nIf you don't want to use Composer for some reason, a custom\n`autoload.php` is provided for you in the project root. To use the\nlibrary, simply include that file,\n\n```php\nrequire('/path/to/MaxMind-DB-Reader-php/autoload.php');\n```\n\nand then instantiate the reader class normally:\n\n```php\nuse MaxMind\\Db\\Reader;\n$reader = new Reader('example.mmdb');\n```\n\n## Installation (RPM)\n\nRPMs are available in the [official Fedora repository](https://apps.fedoraproject.org/packages/php-maxminddb).\n\nTo install on Fedora, run:\n\n```bash\ndnf install php-maxminddb\n```\n\nTo install on CentOS or RHEL 7, first [enable the EPEL repository](https://fedoraproject.org/wiki/EPEL)\nand then run:\n\n```bash\nyum install php-maxminddb\n```\n\nPlease note that these packages are *not* maintained by MaxMind.\n\n## Usage ##\n\n## Example ##\n\n```php\n<?php\nrequire_once 'vendor/autoload.php';\n\nuse MaxMind\\Db\\Reader;\n\n$ipAddress = '24.24.24.24';\n$databaseFile = 'GeoIP2-City.mmdb';\n\n$reader = new Reader($databaseFile);\n\n// get returns just the record for the IP address\nprint_r($reader->get($ipAddress));\n\n// getWithPrefixLen returns an array containing the record and the\n// associated prefix length for that record.\nprint_r($reader->getWithPrefixLen($ipAddress));\n\n$reader->close();\n```\n\n## Optional PHP C Extension ##\n\nMaxMind provides an optional C extension that is a drop-in replacement for\n`MaxMind\\Db\\Reader`. In order to use this extension, you must install the\nReader API as described above and install the extension as described below. If\nyou are using an autoloader, no changes to your code should be necessary.\n\n### Installing Extension ###\n\nFirst install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as\ndescribed in its [README.md\nfile](https://github.com/maxmind/libmaxminddb/blob/main/README.md#installing-from-a-tarball).\nAfter successfully installing libmaxmindb, you may install the extension\nfrom [pecl](https://pecl.php.net/package/maxminddb):\n\n```\npecl install maxminddb\n```\n\nAlternatively, you may install it from the source. To do so, run the following\ncommands from the top-level directory of this distribution:\n\n```\ncd ext\nphpize\n./configure\nmake\nmake test\nsudo make install\n```\n\nYou then must load your extension. The recommended method is to add the\nfollowing to your `php.ini` file:\n\n```\nextension=maxminddb.so\n```\n\nNote: You may need to install the PHP development package on your OS such as\nphp5-dev for Debian-based systems or php-devel for RedHat/Fedora-based ones.\n\n## 128-bit Integer Support ##\n\nThe MaxMind DB format includes 128-bit unsigned integer as a type. Although\nno MaxMind-distributed database currently makes use of this type, both the\npure PHP reader and the C extension support this type. The pure PHP reader\nrequires gmp or bcmath to read databases with 128-bit unsigned integers.\n\nThe integer is currently returned as a hexadecimal string (prefixed with \"0x\")\nby the C extension and a decimal string (no prefix) by the pure PHP reader.\nAny change to make the reader implementations always return either a\nhexadecimal or decimal representation of the integer will NOT be considered a\nbreaking change.\n\n## Support ##\n\nPlease report all issues with this code using the [GitHub issue tracker](https://github.com/maxmind/MaxMind-DB-Reader-php/issues).\n\nIf you are having an issue with a MaxMind service that is not specific to the\nclient API, please see [our support page](https://www.maxmind.com/en/support).\n\n## Requirements  ##\n\nThis library requires PHP 7.2 or greater.\n\nThe GMP or BCMath extension may be required to read some databases\nusing the pure PHP API.\n\n## Contributing ##\n\nPatches and pull requests are encouraged. All code should follow the PSR-1 and\nPSR-2 style guidelines. Please include unit tests whenever possible.\n\n## Versioning ##\n\nThe MaxMind DB Reader PHP API uses [Semantic Versioning](https://semver.org/).\n\n## Copyright and License ##\n\nThis software is Copyright (c) 2014-2024 by MaxMind, Inc.\n\nThis is free software, licensed under the Apache License, Version 2.0.\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/autoload.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/**\n * PSR-4 autoloader implementation for the MaxMind\\DB namespace.\n * First we define the 'mmdb_autoload' function, and then we register\n * it with 'spl_autoload_register' so that PHP knows to use it.\n *\n * @param mixed $class\n */\n\n/**\n * Automatically include the file that defines <code>class</code>.\n *\n * @param string $class\n *                      the name of the class to load\n */\nfunction mmdb_autoload($class): void\n{\n    /*\n    * A project-specific mapping between the namespaces and where\n    * they're located. By convention, we include the trailing\n    * slashes. The one-element array here simply makes things easy\n    * to extend in the future if (for example) the test classes\n    * begin to use one another.\n    */\n    $namespace_map = ['MaxMind\\Db\\\\' => __DIR__ . '/src/MaxMind/Db/'];\n\n    foreach ($namespace_map as $prefix => $dir) {\n        // First swap out the namespace prefix with a directory...\n        $path = str_replace($prefix, $dir, $class);\n\n        // replace the namespace separator with a directory separator...\n        $path = str_replace('\\\\', '/', $path);\n\n        // and finally, add the PHP file extension to the result.\n        $path .= '.php';\n\n        // $path should now contain the path to a PHP file defining $class\n        if (file_exists($path)) {\n            include $path;\n        }\n    }\n}\n\nspl_autoload_register('mmdb_autoload');\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/composer.json",
    "content": "{\n    \"name\": \"maxmind-db/reader\",\n    \"description\": \"MaxMind DB Reader API\",\n    \"keywords\": [\"database\", \"geoip\", \"geoip2\", \"geolocation\", \"maxmind\"],\n    \"homepage\": \"https://github.com/maxmind/MaxMind-DB-Reader-php\",\n    \"type\": \"library\",\n    \"license\": \"Apache-2.0\",\n    \"authors\": [\n        {\n            \"name\": \"Gregory J. Oschwald\",\n            \"email\": \"goschwald@maxmind.com\",\n            \"homepage\": \"https://www.maxmind.com/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.2\"\n    },\n    \"suggest\": {\n        \"ext-bcmath\": \"bcmath or gmp is required for decoding larger integers with the pure PHP decoder\",\n        \"ext-gmp\": \"bcmath or gmp is required for decoding larger integers with the pure PHP decoder\",\n        \"ext-maxminddb\": \"A C-based database decoder that provides significantly faster lookups\"\n    },\n    \"conflict\": {\n        \"ext-maxminddb\": \"<1.11.1 || >=2.0.0\"\n    },\n    \"require-dev\": {\n        \"friendsofphp/php-cs-fixer\": \"3.*\",\n        \"phpunit/phpunit\": \">=8.0.0,<10.0.0\",\n        \"squizlabs/php_codesniffer\": \"3.*\",\n        \"phpstan/phpstan\": \"*\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"MaxMind\\\\Db\\\\\": \"src/MaxMind/Db\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"MaxMind\\\\Db\\\\Test\\\\Reader\\\\\": \"tests/MaxMind/Db/Test/Reader\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/ext/config.m4",
    "content": "PHP_ARG_WITH(maxminddb,\n    [Whether to enable the MaxMind DB Reader extension],\n    [  --with-maxminddb      Enable MaxMind DB Reader extension support])\n\nPHP_ARG_ENABLE(maxminddb-debug, for MaxMind DB debug support,\n    [ --enable-maxminddb-debug    Enable MaxMind DB debug support], no, no)\n\nif test $PHP_MAXMINDDB != \"no\"; then\n\n    AC_PATH_PROG(PKG_CONFIG, pkg-config, no)\n\n    AC_MSG_CHECKING(for libmaxminddb)\n    if test -x \"$PKG_CONFIG\" && $PKG_CONFIG --exists libmaxminddb; then\n        dnl retrieve build options from pkg-config\n        if $PKG_CONFIG libmaxminddb --atleast-version 1.0.0; then\n            LIBMAXMINDDB_INC=`$PKG_CONFIG libmaxminddb --cflags`\n            LIBMAXMINDDB_LIB=`$PKG_CONFIG libmaxminddb --libs`\n            LIBMAXMINDDB_VER=`$PKG_CONFIG libmaxminddb --modversion`\n            AC_MSG_RESULT(found version $LIBMAXMINDDB_VER)\n        else\n            AC_MSG_ERROR(system libmaxminddb must be upgraded to version >= 1.0.0)\n        fi\n        PHP_EVAL_LIBLINE($LIBMAXMINDDB_LIB, MAXMINDDB_SHARED_LIBADD)\n        PHP_EVAL_INCLINE($LIBMAXMINDDB_INC)\n    else\n        AC_MSG_RESULT(pkg-config information missing)\n        AC_MSG_WARN(will use libmaxmxinddb from compiler default path)\n\n        PHP_CHECK_LIBRARY(maxminddb, MMDB_open)\n        PHP_ADD_LIBRARY(maxminddb, 1, MAXMINDDB_SHARED_LIBADD)\n    fi\n\n    if test $PHP_MAXMINDDB_DEBUG != \"no\"; then\n        CFLAGS=\"$CFLAGS -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror\"\n    fi\n\n    PHP_SUBST(MAXMINDDB_SHARED_LIBADD)\n\n    PHP_NEW_EXTENSION(maxminddb, maxminddb.c, $ext_shared)\nfi\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/ext/config.w32",
    "content": "ARG_WITH(\"maxminddb\", \"Enable MaxMind DB Reader extension support\", \"no\");\n\nif (PHP_MAXMINDDB == \"yes\") {\n\tif (CHECK_HEADER_ADD_INCLUDE(\"maxminddb.h\", \"CFLAGS_MAXMINDDB\", PHP_MAXMINDDB +  \";\" + PHP_PHP_BUILD + \"\\\\include\\\\maxminddb\") &&\n\t\tCHECK_LIB(\"libmaxminddb.lib\", \"maxminddb\", PHP_MAXMINDDB)) {\n\t\tEXTENSION(\"maxminddb\", \"maxminddb.c\");\n\t} else {\n\t\tWARNING('Could not find maxminddb.h or libmaxminddb.lib; skipping');\n\t}\n}\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/ext/maxminddb.c",
    "content": "/* MaxMind, Inc., licenses this file to you under the Apache License, Version\n * 2.0 (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include \"php_maxminddb.h\"\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <php.h>\n#include <zend.h>\n\n#include \"Zend/zend_exceptions.h\"\n#include \"Zend/zend_types.h\"\n#include \"ext/spl/spl_exceptions.h\"\n#include \"ext/standard/info.h\"\n#include <maxminddb.h>\n\n#ifdef ZTS\n#include <TSRM.h>\n#endif\n\n#define __STDC_FORMAT_MACROS\n#include <inttypes.h>\n\n#define PHP_MAXMINDDB_NS ZEND_NS_NAME(\"MaxMind\", \"Db\")\n#define PHP_MAXMINDDB_READER_NS ZEND_NS_NAME(PHP_MAXMINDDB_NS, \"Reader\")\n#define PHP_MAXMINDDB_METADATA_NS                                              \\\n    ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, \"Metadata\")\n#define PHP_MAXMINDDB_READER_EX_NS                                             \\\n    ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, \"InvalidDatabaseException\")\n\n#define Z_MAXMINDDB_P(zv) php_maxminddb_fetch_object(Z_OBJ_P(zv))\ntypedef size_t strsize_t;\ntypedef zend_object free_obj_t;\n\n/* For PHP 8 compatibility */\n#if PHP_VERSION_ID < 80000\n\n#define PROP_OBJ(zv) (zv)\n\n#else\n\n#define PROP_OBJ(zv) Z_OBJ_P(zv)\n\n#define TSRMLS_C\n#define TSRMLS_CC\n#define TSRMLS_DC\n\n/* End PHP 8 compatibility */\n#endif\n\n#ifndef ZEND_ACC_CTOR\n#define ZEND_ACC_CTOR 0\n#endif\n\n/* IS_MIXED was added in 2020 */\n#ifndef IS_MIXED\n#define IS_MIXED IS_UNDEF\n#endif\n\n/* ZEND_THIS was added in 7.4 */\n#ifndef ZEND_THIS\n#define ZEND_THIS (&EX(This))\n#endif\n\ntypedef struct _maxminddb_obj {\n    MMDB_s *mmdb;\n    zend_object std;\n} maxminddb_obj;\n\nPHP_FUNCTION(maxminddb);\n\nstatic int\nget_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len);\nstatic const MMDB_entry_data_list_s *\nhandle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list,\n                       zval *z_value TSRMLS_DC);\nstatic const MMDB_entry_data_list_s *\nhandle_array(const MMDB_entry_data_list_s *entry_data_list,\n             zval *z_value TSRMLS_DC);\nstatic const MMDB_entry_data_list_s *\nhandle_map(const MMDB_entry_data_list_s *entry_data_list,\n           zval *z_value TSRMLS_DC);\nstatic void handle_uint128(const MMDB_entry_data_list_s *entry_data_list,\n                           zval *z_value TSRMLS_DC);\nstatic void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,\n                          zval *z_value TSRMLS_DC);\nstatic void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,\n                          zval *z_value TSRMLS_DC);\n\n#define CHECK_ALLOCATED(val)                                                   \\\n    if (!val) {                                                                \\\n        zend_error(E_ERROR, \"Out of memory\");                                  \\\n        return;                                                                \\\n    }\n\nstatic zend_object_handlers maxminddb_obj_handlers;\nstatic zend_class_entry *maxminddb_ce, *maxminddb_exception_ce, *metadata_ce;\n\nstatic inline maxminddb_obj *\nphp_maxminddb_fetch_object(zend_object *obj TSRMLS_DC) {\n    return (maxminddb_obj *)((char *)(obj)-XtOffsetOf(maxminddb_obj, std));\n}\n\nZEND_BEGIN_ARG_INFO_EX(arginfo_maxminddbreader_construct, 0, 0, 1)\nZEND_ARG_TYPE_INFO(0, db_file, IS_STRING, 0)\nZEND_END_ARG_INFO()\n\nPHP_METHOD(MaxMind_Db_Reader, __construct) {\n    char *db_file = NULL;\n    strsize_t name_len;\n    zval *_this_zval = NULL;\n\n    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\n                                     getThis(),\n                                     \"Os\",\n                                     &_this_zval,\n                                     maxminddb_ce,\n                                     &db_file,\n                                     &name_len) == FAILURE) {\n        return;\n    }\n\n    if (0 != php_check_open_basedir(db_file TSRMLS_CC) ||\n        0 != access(db_file, R_OK)) {\n        zend_throw_exception_ex(\n            spl_ce_InvalidArgumentException,\n            0 TSRMLS_CC,\n            \"The file \\\"%s\\\" does not exist or is not readable.\",\n            db_file);\n        return;\n    }\n\n    MMDB_s *mmdb = (MMDB_s *)ecalloc(1, sizeof(MMDB_s));\n    int const status = MMDB_open(db_file, MMDB_MODE_MMAP, mmdb);\n\n    if (MMDB_SUCCESS != status) {\n        zend_throw_exception_ex(\n            maxminddb_exception_ce,\n            0 TSRMLS_CC,\n            \"Error opening database file (%s). Is this a valid \"\n            \"MaxMind DB file?\",\n            db_file);\n        efree(mmdb);\n        return;\n    }\n\n    maxminddb_obj *mmdb_obj = Z_MAXMINDDB_P(ZEND_THIS);\n    mmdb_obj->mmdb = mmdb;\n}\n\nZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(\n    arginfo_maxminddbreader_get, 0, 1, IS_MIXED, 1)\nZEND_ARG_TYPE_INFO(0, ip_address, IS_STRING, 0)\nZEND_END_ARG_INFO()\n\nPHP_METHOD(MaxMind_Db_Reader, get) {\n    int prefix_len = 0;\n    get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, return_value, &prefix_len);\n}\n\nZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(\n    arginfo_maxminddbreader_getWithPrefixLen, 0, 1, IS_ARRAY, 1)\nZEND_ARG_TYPE_INFO(0, ip_address, IS_STRING, 0)\nZEND_END_ARG_INFO()\n\nPHP_METHOD(MaxMind_Db_Reader, getWithPrefixLen) {\n    zval record, z_prefix_len;\n\n    int prefix_len = 0;\n    if (get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, &record, &prefix_len) ==\n        FAILURE) {\n        return;\n    }\n\n    array_init(return_value);\n    add_next_index_zval(return_value, &record);\n\n    ZVAL_LONG(&z_prefix_len, prefix_len);\n    add_next_index_zval(return_value, &z_prefix_len);\n}\n\nstatic int\nget_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {\n    char *ip_address = NULL;\n    strsize_t name_len;\n    zval *this_zval = NULL;\n\n    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\n                                     getThis(),\n                                     \"Os\",\n                                     &this_zval,\n                                     maxminddb_ce,\n                                     &ip_address,\n                                     &name_len) == FAILURE) {\n        return FAILURE;\n    }\n\n    const maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(ZEND_THIS);\n\n    MMDB_s *mmdb = mmdb_obj->mmdb;\n\n    if (NULL == mmdb) {\n        zend_throw_exception_ex(spl_ce_BadMethodCallException,\n                                0 TSRMLS_CC,\n                                \"Attempt to read from a closed MaxMind DB.\");\n        return FAILURE;\n    }\n\n    struct addrinfo hints = {\n        .ai_family = AF_UNSPEC,\n        .ai_flags = AI_NUMERICHOST,\n        /* We set ai_socktype so that we only get one result back */\n        .ai_socktype = SOCK_STREAM};\n\n    struct addrinfo *addresses = NULL;\n    int gai_status = getaddrinfo(ip_address, NULL, &hints, &addresses);\n    if (gai_status) {\n        zend_throw_exception_ex(spl_ce_InvalidArgumentException,\n                                0 TSRMLS_CC,\n                                \"The value \\\"%s\\\" is not a valid IP address.\",\n                                ip_address);\n        return FAILURE;\n    }\n    if (!addresses || !addresses->ai_addr) {\n        zend_throw_exception_ex(\n            spl_ce_InvalidArgumentException,\n            0 TSRMLS_CC,\n            \"getaddrinfo was successful but failed to set the addrinfo\");\n        return FAILURE;\n    }\n\n    int sa_family = addresses->ai_addr->sa_family;\n\n    int mmdb_error = MMDB_SUCCESS;\n    MMDB_lookup_result_s result =\n        MMDB_lookup_sockaddr(mmdb, addresses->ai_addr, &mmdb_error);\n\n    freeaddrinfo(addresses);\n\n    if (MMDB_SUCCESS != mmdb_error) {\n        zend_class_entry *ex;\n        if (MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR == mmdb_error) {\n            ex = spl_ce_InvalidArgumentException;\n        } else {\n            ex = maxminddb_exception_ce;\n        }\n        zend_throw_exception_ex(ex,\n                                0 TSRMLS_CC,\n                                \"Error looking up %s. %s\",\n                                ip_address,\n                                MMDB_strerror(mmdb_error));\n        return FAILURE;\n    }\n\n    *prefix_len = result.netmask;\n\n    if (sa_family == AF_INET && mmdb->metadata.ip_version == 6) {\n        /* We return the prefix length given the IPv4 address. If there is\n           no IPv4 subtree, we return a prefix length of 0. */\n        *prefix_len = *prefix_len >= 96 ? *prefix_len - 96 : 0;\n    }\n\n    if (!result.found_entry) {\n        ZVAL_NULL(record);\n        return SUCCESS;\n    }\n\n    MMDB_entry_data_list_s *entry_data_list = NULL;\n    int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list);\n\n    if (MMDB_SUCCESS != status) {\n        zend_throw_exception_ex(maxminddb_exception_ce,\n                                0 TSRMLS_CC,\n                                \"Error while looking up data for %s. %s\",\n                                ip_address,\n                                MMDB_strerror(status));\n        MMDB_free_entry_data_list(entry_data_list);\n        return FAILURE;\n    } else if (NULL == entry_data_list) {\n        zend_throw_exception_ex(\n            maxminddb_exception_ce,\n            0 TSRMLS_CC,\n            \"Error while looking up data for %s. Your database may \"\n            \"be corrupt or you have found a bug in libmaxminddb.\",\n            ip_address);\n        return FAILURE;\n    }\n\n    const MMDB_entry_data_list_s *rv =\n        handle_entry_data_list(entry_data_list, record TSRMLS_CC);\n    if (rv == NULL) {\n        /* We should have already thrown the exception in handle_entry_data_list\n         */\n        return FAILURE;\n    }\n    MMDB_free_entry_data_list(entry_data_list);\n    return SUCCESS;\n}\n\nZEND_BEGIN_ARG_INFO_EX(arginfo_maxminddbreader_void, 0, 0, 0)\nZEND_END_ARG_INFO()\n\nPHP_METHOD(MaxMind_Db_Reader, metadata) {\n    zval *this_zval = NULL;\n\n    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\n                                     getThis(),\n                                     \"O\",\n                                     &this_zval,\n                                     maxminddb_ce) == FAILURE) {\n        return;\n    }\n\n    const maxminddb_obj *const mmdb_obj =\n        (maxminddb_obj *)Z_MAXMINDDB_P(this_zval);\n\n    if (NULL == mmdb_obj->mmdb) {\n        zend_throw_exception_ex(spl_ce_BadMethodCallException,\n                                0 TSRMLS_CC,\n                                \"Attempt to read from a closed MaxMind DB.\");\n        return;\n    }\n\n    object_init_ex(return_value, metadata_ce);\n\n    MMDB_entry_data_list_s *entry_data_list;\n    MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list);\n\n    zval metadata_array;\n    const MMDB_entry_data_list_s *rv =\n        handle_entry_data_list(entry_data_list, &metadata_array TSRMLS_CC);\n    if (rv == NULL) {\n        return;\n    }\n    MMDB_free_entry_data_list(entry_data_list);\n    zend_call_method_with_1_params(PROP_OBJ(return_value),\n                                   metadata_ce,\n                                   &metadata_ce->constructor,\n                                   ZEND_CONSTRUCTOR_FUNC_NAME,\n                                   NULL,\n                                   &metadata_array);\n    zval_ptr_dtor(&metadata_array);\n}\n\nPHP_METHOD(MaxMind_Db_Reader, close) {\n    zval *this_zval = NULL;\n\n    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\n                                     getThis(),\n                                     \"O\",\n                                     &this_zval,\n                                     maxminddb_ce) == FAILURE) {\n        return;\n    }\n\n    maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(this_zval);\n\n    if (NULL == mmdb_obj->mmdb) {\n        zend_throw_exception_ex(spl_ce_BadMethodCallException,\n                                0 TSRMLS_CC,\n                                \"Attempt to close a closed MaxMind DB.\");\n        return;\n    }\n    MMDB_close(mmdb_obj->mmdb);\n    efree(mmdb_obj->mmdb);\n    mmdb_obj->mmdb = NULL;\n}\n\nstatic const MMDB_entry_data_list_s *\nhandle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list,\n                       zval *z_value TSRMLS_DC) {\n    switch (entry_data_list->entry_data.type) {\n        case MMDB_DATA_TYPE_MAP:\n            return handle_map(entry_data_list, z_value TSRMLS_CC);\n        case MMDB_DATA_TYPE_ARRAY:\n            return handle_array(entry_data_list, z_value TSRMLS_CC);\n        case MMDB_DATA_TYPE_UTF8_STRING:\n            ZVAL_STRINGL(z_value,\n                         entry_data_list->entry_data.utf8_string,\n                         entry_data_list->entry_data.data_size);\n            break;\n        case MMDB_DATA_TYPE_BYTES:\n            ZVAL_STRINGL(z_value,\n                         (char const *)entry_data_list->entry_data.bytes,\n                         entry_data_list->entry_data.data_size);\n            break;\n        case MMDB_DATA_TYPE_DOUBLE:\n            ZVAL_DOUBLE(z_value, entry_data_list->entry_data.double_value);\n            break;\n        case MMDB_DATA_TYPE_FLOAT:\n            ZVAL_DOUBLE(z_value, entry_data_list->entry_data.float_value);\n            break;\n        case MMDB_DATA_TYPE_UINT16:\n            ZVAL_LONG(z_value, entry_data_list->entry_data.uint16);\n            break;\n        case MMDB_DATA_TYPE_UINT32:\n            handle_uint32(entry_data_list, z_value TSRMLS_CC);\n            break;\n        case MMDB_DATA_TYPE_BOOLEAN:\n            ZVAL_BOOL(z_value, entry_data_list->entry_data.boolean);\n            break;\n        case MMDB_DATA_TYPE_UINT64:\n            handle_uint64(entry_data_list, z_value TSRMLS_CC);\n            break;\n        case MMDB_DATA_TYPE_UINT128:\n            handle_uint128(entry_data_list, z_value TSRMLS_CC);\n            break;\n        case MMDB_DATA_TYPE_INT32:\n            ZVAL_LONG(z_value, entry_data_list->entry_data.int32);\n            break;\n        default:\n            zend_throw_exception_ex(maxminddb_exception_ce,\n                                    0 TSRMLS_CC,\n                                    \"Invalid data type arguments: %d\",\n                                    entry_data_list->entry_data.type);\n            return NULL;\n    }\n    return entry_data_list;\n}\n\nstatic const MMDB_entry_data_list_s *\nhandle_map(const MMDB_entry_data_list_s *entry_data_list,\n           zval *z_value TSRMLS_DC) {\n    array_init(z_value);\n    const uint32_t map_size = entry_data_list->entry_data.data_size;\n\n    uint32_t i;\n    for (i = 0; i < map_size && entry_data_list; i++) {\n        entry_data_list = entry_data_list->next;\n\n        char *key = estrndup(entry_data_list->entry_data.utf8_string,\n                             entry_data_list->entry_data.data_size);\n        if (NULL == key) {\n            zend_throw_exception_ex(maxminddb_exception_ce,\n                                    0 TSRMLS_CC,\n                                    \"Invalid data type arguments\");\n            return NULL;\n        }\n\n        entry_data_list = entry_data_list->next;\n        zval new_value;\n        entry_data_list =\n            handle_entry_data_list(entry_data_list, &new_value TSRMLS_CC);\n        if (entry_data_list != NULL) {\n            add_assoc_zval(z_value, key, &new_value);\n        }\n        efree(key);\n    }\n    return entry_data_list;\n}\n\nstatic const MMDB_entry_data_list_s *\nhandle_array(const MMDB_entry_data_list_s *entry_data_list,\n             zval *z_value TSRMLS_DC) {\n    const uint32_t size = entry_data_list->entry_data.data_size;\n\n    array_init(z_value);\n\n    uint32_t i;\n    for (i = 0; i < size && entry_data_list; i++) {\n        entry_data_list = entry_data_list->next;\n        zval new_value;\n        entry_data_list =\n            handle_entry_data_list(entry_data_list, &new_value TSRMLS_CC);\n        if (entry_data_list != NULL) {\n            add_next_index_zval(z_value, &new_value);\n        }\n    }\n    return entry_data_list;\n}\n\nstatic void handle_uint128(const MMDB_entry_data_list_s *entry_data_list,\n                           zval *z_value TSRMLS_DC) {\n    uint64_t high = 0;\n    uint64_t low = 0;\n#if MMDB_UINT128_IS_BYTE_ARRAY\n    int i;\n    for (i = 0; i < 8; i++) {\n        high = (high << 8) | entry_data_list->entry_data.uint128[i];\n    }\n\n    for (i = 8; i < 16; i++) {\n        low = (low << 8) | entry_data_list->entry_data.uint128[i];\n    }\n#else\n    high = entry_data_list->entry_data.uint128 >> 64;\n    low = (uint64_t)entry_data_list->entry_data.uint128;\n#endif\n\n    char *num_str;\n    spprintf(&num_str, 0, \"0x%016\" PRIX64 \"%016\" PRIX64, high, low);\n    CHECK_ALLOCATED(num_str);\n\n    ZVAL_STRING(z_value, num_str);\n    efree(num_str);\n}\n\nstatic void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,\n                          zval *z_value TSRMLS_DC) {\n    uint32_t val = entry_data_list->entry_data.uint32;\n\n#if LONG_MAX >= UINT32_MAX\n    ZVAL_LONG(z_value, val);\n    return;\n#else\n    if (val <= LONG_MAX) {\n        ZVAL_LONG(z_value, val);\n        return;\n    }\n\n    char *int_str;\n    spprintf(&int_str, 0, \"%\" PRIu32, val);\n    CHECK_ALLOCATED(int_str);\n\n    ZVAL_STRING(z_value, int_str);\n    efree(int_str);\n#endif\n}\n\nstatic void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,\n                          zval *z_value TSRMLS_DC) {\n    uint64_t val = entry_data_list->entry_data.uint64;\n\n#if LONG_MAX >= UINT64_MAX\n    ZVAL_LONG(z_value, val);\n    return;\n#else\n    if (val <= LONG_MAX) {\n        ZVAL_LONG(z_value, val);\n        return;\n    }\n\n    char *int_str;\n    spprintf(&int_str, 0, \"%\" PRIu64, val);\n    CHECK_ALLOCATED(int_str);\n\n    ZVAL_STRING(z_value, int_str);\n    efree(int_str);\n#endif\n}\n\nstatic void maxminddb_free_storage(free_obj_t *object TSRMLS_DC) {\n    maxminddb_obj *obj =\n        php_maxminddb_fetch_object((zend_object *)object TSRMLS_CC);\n    if (obj->mmdb != NULL) {\n        MMDB_close(obj->mmdb);\n        efree(obj->mmdb);\n    }\n\n    zend_object_std_dtor(&obj->std TSRMLS_CC);\n}\n\nstatic zend_object *maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {\n    maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));\n    zend_object_std_init(&obj->std, type TSRMLS_CC);\n    object_properties_init(&(obj->std), type);\n\n    obj->std.handlers = &maxminddb_obj_handlers;\n\n    return &obj->std;\n}\n\n/* clang-format off */\nstatic zend_function_entry maxminddb_methods[] = {\n    PHP_ME(MaxMind_Db_Reader, __construct, arginfo_maxminddbreader_construct,\n           ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)\n    PHP_ME(MaxMind_Db_Reader, close, arginfo_maxminddbreader_void, ZEND_ACC_PUBLIC)\n    PHP_ME(MaxMind_Db_Reader, get, arginfo_maxminddbreader_get,  ZEND_ACC_PUBLIC)\n    PHP_ME(MaxMind_Db_Reader, getWithPrefixLen, arginfo_maxminddbreader_getWithPrefixLen,  ZEND_ACC_PUBLIC)\n    PHP_ME(MaxMind_Db_Reader, metadata, arginfo_maxminddbreader_void, ZEND_ACC_PUBLIC)\n    { NULL, NULL, NULL }\n};\n/* clang-format on */\n\nZEND_BEGIN_ARG_INFO_EX(arginfo_metadata_construct, 0, 0, 1)\nZEND_ARG_TYPE_INFO(0, metadata, IS_ARRAY, 0)\nZEND_END_ARG_INFO()\n\nPHP_METHOD(MaxMind_Db_Reader_Metadata, __construct) {\n    zval *object = NULL;\n    zval *metadata_array = NULL;\n    zend_long node_count = 0;\n    zend_long record_size = 0;\n\n    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\n                                     getThis(),\n                                     \"Oa\",\n                                     &object,\n                                     metadata_ce,\n                                     &metadata_array) == FAILURE) {\n        return;\n    }\n\n    zval *tmp = NULL;\n    if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),\n                                  \"binary_format_major_version\",\n                                  sizeof(\"binary_format_major_version\") - 1))) {\n        zend_update_property(metadata_ce,\n                             PROP_OBJ(object),\n                             \"binaryFormatMajorVersion\",\n                             sizeof(\"binaryFormatMajorVersion\") - 1,\n                             tmp);\n    }\n\n    if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),\n                                  \"binary_format_minor_version\",\n                                  sizeof(\"binary_format_minor_version\") - 1))) {\n        zend_update_property(metadata_ce,\n                             PROP_OBJ(object),\n                             \"binaryFormatMinorVersion\",\n                             sizeof(\"binaryFormatMinorVersion\") - 1,\n                             tmp);\n    }\n\n    if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),\n                                  \"build_epoch\",\n                                  sizeof(\"build_epoch\") - 1))) {\n        zend_update_property(metadata_ce,\n                             PROP_OBJ(object),\n                             \"buildEpoch\",\n                             sizeof(\"buildEpoch\") - 1,\n                             tmp);\n    }\n\n    if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),\n                                  \"database_type\",\n                                  sizeof(\"database_type\") - 1))) {\n        zend_update_property(metadata_ce,\n                             PROP_OBJ(object),\n                             \"databaseType\",\n                             sizeof(\"databaseType\") - 1,\n                             tmp);\n    }\n\n    if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),\n                                  \"description\",\n                                  sizeof(\"description\") - 1))) {\n        zend_update_property(metadata_ce,\n                             PROP_OBJ(object),\n                             \"description\",\n                             sizeof(\"description\") - 1,\n                             tmp);\n    }\n\n    if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),\n                                  \"ip_version\",\n                                  sizeof(\"ip_version\") - 1))) {\n        zend_update_property(metadata_ce,\n                             PROP_OBJ(object),\n                             \"ipVersion\",\n                             sizeof(\"ipVersion\") - 1,\n                             tmp);\n    }\n\n    if ((tmp = zend_hash_str_find(\n             HASH_OF(metadata_array), \"languages\", sizeof(\"languages\") - 1))) {\n        zend_update_property(metadata_ce,\n                             PROP_OBJ(object),\n                             \"languages\",\n                             sizeof(\"languages\") - 1,\n                             tmp);\n    }\n\n    if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),\n                                  \"record_size\",\n                                  sizeof(\"record_size\") - 1))) {\n        zend_update_property(metadata_ce,\n                             PROP_OBJ(object),\n                             \"recordSize\",\n                             sizeof(\"recordSize\") - 1,\n                             tmp);\n        if (Z_TYPE_P(tmp) == IS_LONG) {\n            record_size = Z_LVAL_P(tmp);\n        }\n    }\n\n    if (record_size != 0) {\n        zend_update_property_long(metadata_ce,\n                                  PROP_OBJ(object),\n                                  \"nodeByteSize\",\n                                  sizeof(\"nodeByteSize\") - 1,\n                                  record_size / 4);\n    }\n\n    if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),\n                                  \"node_count\",\n                                  sizeof(\"node_count\") - 1))) {\n        zend_update_property(metadata_ce,\n                             PROP_OBJ(object),\n                             \"nodeCount\",\n                             sizeof(\"nodeCount\") - 1,\n                             tmp);\n        if (Z_TYPE_P(tmp) == IS_LONG) {\n            node_count = Z_LVAL_P(tmp);\n        }\n    }\n\n    if (record_size != 0) {\n        zend_update_property_long(metadata_ce,\n                                  PROP_OBJ(object),\n                                  \"searchTreeSize\",\n                                  sizeof(\"searchTreeSize\") - 1,\n                                  record_size * node_count / 4);\n    }\n}\n\n// clang-format off\nstatic zend_function_entry metadata_methods[] = {\n    PHP_ME(MaxMind_Db_Reader_Metadata, __construct, arginfo_metadata_construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)\n    {NULL, NULL, NULL}\n};\n// clang-format on\n\nPHP_MINIT_FUNCTION(maxminddb) {\n    zend_class_entry ce;\n\n    INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_EX_NS, NULL);\n    maxminddb_exception_ce =\n        zend_register_internal_class_ex(&ce, zend_ce_exception);\n\n    INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_NS, maxminddb_methods);\n    maxminddb_ce = zend_register_internal_class(&ce TSRMLS_CC);\n    maxminddb_ce->create_object = maxminddb_create_handler;\n\n    INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_METADATA_NS, metadata_methods);\n    metadata_ce = zend_register_internal_class(&ce TSRMLS_CC);\n    zend_declare_property_null(metadata_ce,\n                               \"binaryFormatMajorVersion\",\n                               sizeof(\"binaryFormatMajorVersion\") - 1,\n                               ZEND_ACC_PUBLIC);\n    zend_declare_property_null(metadata_ce,\n                               \"binaryFormatMinorVersion\",\n                               sizeof(\"binaryFormatMinorVersion\") - 1,\n                               ZEND_ACC_PUBLIC);\n    zend_declare_property_null(\n        metadata_ce, \"buildEpoch\", sizeof(\"buildEpoch\") - 1, ZEND_ACC_PUBLIC);\n    zend_declare_property_null(metadata_ce,\n                               \"databaseType\",\n                               sizeof(\"databaseType\") - 1,\n                               ZEND_ACC_PUBLIC);\n    zend_declare_property_null(\n        metadata_ce, \"description\", sizeof(\"description\") - 1, ZEND_ACC_PUBLIC);\n    zend_declare_property_null(\n        metadata_ce, \"ipVersion\", sizeof(\"ipVersion\") - 1, ZEND_ACC_PUBLIC);\n    zend_declare_property_null(\n        metadata_ce, \"languages\", sizeof(\"languages\") - 1, ZEND_ACC_PUBLIC);\n    zend_declare_property_null(metadata_ce,\n                               \"nodeByteSize\",\n                               sizeof(\"nodeByteSize\") - 1,\n                               ZEND_ACC_PUBLIC);\n    zend_declare_property_null(\n        metadata_ce, \"nodeCount\", sizeof(\"nodeCount\") - 1, ZEND_ACC_PUBLIC);\n    zend_declare_property_null(\n        metadata_ce, \"recordSize\", sizeof(\"recordSize\") - 1, ZEND_ACC_PUBLIC);\n    zend_declare_property_null(metadata_ce,\n                               \"searchTreeSize\",\n                               sizeof(\"searchTreeSize\") - 1,\n                               ZEND_ACC_PUBLIC);\n\n    memcpy(&maxminddb_obj_handlers,\n           zend_get_std_object_handlers(),\n           sizeof(zend_object_handlers));\n    maxminddb_obj_handlers.clone_obj = NULL;\n    maxminddb_obj_handlers.offset = XtOffsetOf(maxminddb_obj, std);\n    maxminddb_obj_handlers.free_obj = maxminddb_free_storage;\n    zend_declare_class_constant_string(maxminddb_ce,\n                                       \"MMDB_LIB_VERSION\",\n                                       sizeof(\"MMDB_LIB_VERSION\") - 1,\n                                       MMDB_lib_version() TSRMLS_CC);\n\n    return SUCCESS;\n}\n\nstatic PHP_MINFO_FUNCTION(maxminddb) {\n    php_info_print_table_start();\n\n    php_info_print_table_row(2, \"MaxMind DB Reader\", \"enabled\");\n    php_info_print_table_row(\n        2, \"maxminddb extension version\", PHP_MAXMINDDB_VERSION);\n    php_info_print_table_row(\n        2, \"libmaxminddb library version\", MMDB_lib_version());\n\n    php_info_print_table_end();\n}\n\nzend_module_entry maxminddb_module_entry = {STANDARD_MODULE_HEADER,\n                                            PHP_MAXMINDDB_EXTNAME,\n                                            NULL,\n                                            PHP_MINIT(maxminddb),\n                                            NULL,\n                                            NULL,\n                                            NULL,\n                                            PHP_MINFO(maxminddb),\n                                            PHP_MAXMINDDB_VERSION,\n                                            STANDARD_MODULE_PROPERTIES};\n\n#ifdef COMPILE_DL_MAXMINDDB\nZEND_GET_MODULE(maxminddb)\n#endif\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/ext/php_maxminddb.h",
    "content": "/* MaxMind, Inc., licenses this file to you under the Apache License, Version\n * 2.0 (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n#include <zend_interfaces.h>\n\n#ifndef PHP_MAXMINDDB_H\n#define PHP_MAXMINDDB_H 1\n#define PHP_MAXMINDDB_VERSION \"1.12.0\"\n#define PHP_MAXMINDDB_EXTNAME \"maxminddb\"\n\nextern zend_module_entry maxminddb_module_entry;\n#define phpext_maxminddb_ptr &maxminddb_module_entry\n\n#endif\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/ext/tests/001-load.phpt",
    "content": "--TEST--\nCheck for maxminddb presence\n--SKIPIF--\n<?php if (!extension_loaded('maxminddb')) {\n    echo 'skip';\n} ?>\n--FILE--\n<?php\necho 'maxminddb extension is available';\n?>\n--EXPECT--\nmaxminddb extension is available\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/ext/tests/002-final.phpt",
    "content": "--TEST--\nCheck that Reader class is not final\n--SKIPIF--\n<?php if (!extension_loaded('maxminddb')) {\n    echo 'skip';\n} ?>\n--FILE--\n<?php\n$reflectionClass = new \\ReflectionClass('MaxMind\\Db\\Reader');\nvar_dump($reflectionClass->isFinal());\n?>\n--EXPECT--\nbool(false)\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/ext/tests/003-open-basedir.phpt",
    "content": "--TEST--\nopenbase_dir is followed\n--INI--\nopen_basedir=/--dne--\n--FILE--\n<?php\nuse MaxMind\\Db\\Reader;\n\n$reader = new Reader('/usr/local/share/GeoIP/GeoIP2-City.mmdb');\n?>\n--EXPECTREGEX--\n.*open_basedir restriction in effect.*\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/package.xml",
    "content": "<?xml version=\"1.0\"?>\n<package version=\"2.0\" xmlns=\"http://pear.php.net/dtd/package-2.0\"\n    xmlns:tasks=\"http://pear.php.net/dtd/tasks-1.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd\">\n\n    <name>maxminddb</name>\n    <channel>pecl.php.net</channel>\n    <summary>Reader for the MaxMind DB file format</summary>\n    <description>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).</description>\n    <lead>\n        <name>Greg Oschwald</name>\n        <user>oschwald</user>\n        <email>goschwald@maxmind.com</email>\n        <active>yes</active>\n    </lead>\n    <date>2024-11-14</date>\n    <version>\n        <release>1.12.0</release>\n        <api>1.12.0</api>\n    </version>\n    <stability>\n        <release>stable</release>\n        <api>stable</api>\n    </stability>\n    <license uri=\"https://github.com/maxmind/MaxMind-DB-Reader-php/blob/main/LICENSE\">Apache License 2.0</license>\n    <notes>* Improve the error handling when the user tries to open a directory\n  with the pure PHP reader.\n* Improve the typehints on arrays in the PHPDocs.</notes>\n    <contents>\n        <dir name=\"/\">\n            <file role=\"doc\" name=\"LICENSE\"/>\n            <file role=\"doc\" name=\"CHANGELOG.md\"/>\n            <file role=\"doc\" name=\"README.md\"/>\n\n            <dir name=\"ext\">\n                <file role=\"src\" name=\"config.m4\"/>\n                <file role=\"src\" name=\"config.w32\"/>\n\n                <file role=\"src\" name=\"maxminddb.c\"/>\n                <file role=\"src\" name=\"php_maxminddb.h\"/>\n\n                <dir name=\"tests\">\n                    <file role=\"test\" name=\"001-load.phpt\"/>\n                    <file role=\"test\" name=\"002-final.phpt\"/>\n                    <file role=\"test\" name=\"003-open-basedir.phpt\"/>\n                </dir>\n            </dir>\n        </dir>\n    </contents>\n    <dependencies>\n        <required>\n            <php>\n                <min>7.2.0</min>\n            </php>\n            <pearinstaller>\n                <min>1.10.0</min>\n            </pearinstaller>\n        </required>\n    </dependencies>\n    <providesextension>maxminddb</providesextension>\n    <extsrcrelease />\n</package>\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MaxMind\\Db\\Reader;\n\n// @codingStandardsIgnoreLine\n\nclass Decoder\n{\n    /**\n     * @var resource\n     */\n    private $fileStream;\n\n    /**\n     * @var int\n     */\n    private $pointerBase;\n\n    /**\n     * This is only used for unit testing.\n     *\n     * @var bool\n     */\n    private $pointerTestHack;\n\n    /**\n     * @var bool\n     */\n    private $switchByteOrder;\n\n    private const _EXTENDED = 0;\n    private const _POINTER = 1;\n    private const _UTF8_STRING = 2;\n    private const _DOUBLE = 3;\n    private const _BYTES = 4;\n    private const _UINT16 = 5;\n    private const _UINT32 = 6;\n    private const _MAP = 7;\n    private const _INT32 = 8;\n    private const _UINT64 = 9;\n    private const _UINT128 = 10;\n    private const _ARRAY = 11;\n    // 12 is the container type\n    // 13 is the end marker type\n    private const _BOOLEAN = 14;\n    private const _FLOAT = 15;\n\n    /**\n     * @param resource $fileStream\n     */\n    public function __construct(\n        $fileStream,\n        int $pointerBase = 0,\n        bool $pointerTestHack = false\n    ) {\n        $this->fileStream = $fileStream;\n        $this->pointerBase = $pointerBase;\n\n        $this->pointerTestHack = $pointerTestHack;\n\n        $this->switchByteOrder = $this->isPlatformLittleEndian();\n    }\n\n    /**\n     * @return array<mixed>\n     */\n    public function decode(int $offset): array\n    {\n        $ctrlByte = \\ord(Util::read($this->fileStream, $offset, 1));\n        ++$offset;\n\n        $type = $ctrlByte >> 5;\n\n        // Pointers are a special case, we don't read the next $size bytes, we\n        // use the size to determine the length of the pointer and then follow\n        // it.\n        if ($type === self::_POINTER) {\n            [$pointer, $offset] = $this->decodePointer($ctrlByte, $offset);\n\n            // for unit testing\n            if ($this->pointerTestHack) {\n                return [$pointer];\n            }\n\n            [$result] = $this->decode($pointer);\n\n            return [$result, $offset];\n        }\n\n        if ($type === self::_EXTENDED) {\n            $nextByte = \\ord(Util::read($this->fileStream, $offset, 1));\n\n            $type = $nextByte + 7;\n\n            if ($type < 8) {\n                throw new InvalidDatabaseException(\n                    'Something went horribly wrong in the decoder. An extended type '\n                    . 'resolved to a type number < 8 ('\n                    . $type\n                    . ')'\n                );\n            }\n\n            ++$offset;\n        }\n\n        [$size, $offset] = $this->sizeFromCtrlByte($ctrlByte, $offset);\n\n        return $this->decodeByType($type, $offset, $size);\n    }\n\n    /**\n     * @param int<0, max> $size\n     *\n     * @return array{0:mixed, 1:int}\n     */\n    private function decodeByType(int $type, int $offset, int $size): array\n    {\n        switch ($type) {\n            case self::_MAP:\n                return $this->decodeMap($size, $offset);\n\n            case self::_ARRAY:\n                return $this->decodeArray($size, $offset);\n\n            case self::_BOOLEAN:\n                return [$this->decodeBoolean($size), $offset];\n        }\n\n        $newOffset = $offset + $size;\n        $bytes = Util::read($this->fileStream, $offset, $size);\n\n        switch ($type) {\n            case self::_BYTES:\n            case self::_UTF8_STRING:\n                return [$bytes, $newOffset];\n\n            case self::_DOUBLE:\n                $this->verifySize(8, $size);\n\n                return [$this->decodeDouble($bytes), $newOffset];\n\n            case self::_FLOAT:\n                $this->verifySize(4, $size);\n\n                return [$this->decodeFloat($bytes), $newOffset];\n\n            case self::_INT32:\n                return [$this->decodeInt32($bytes, $size), $newOffset];\n\n            case self::_UINT16:\n            case self::_UINT32:\n            case self::_UINT64:\n            case self::_UINT128:\n                return [$this->decodeUint($bytes, $size), $newOffset];\n\n            default:\n                throw new InvalidDatabaseException(\n                    'Unknown or unexpected type: ' . $type\n                );\n        }\n    }\n\n    private function verifySize(int $expected, int $actual): void\n    {\n        if ($expected !== $actual) {\n            throw new InvalidDatabaseException(\n                \"The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)\"\n            );\n        }\n    }\n\n    /**\n     * @return array{0:array<mixed>, 1:int}\n     */\n    private function decodeArray(int $size, int $offset): array\n    {\n        $array = [];\n\n        for ($i = 0; $i < $size; ++$i) {\n            [$value, $offset] = $this->decode($offset);\n            $array[] = $value;\n        }\n\n        return [$array, $offset];\n    }\n\n    private function decodeBoolean(int $size): bool\n    {\n        return $size !== 0;\n    }\n\n    private function decodeDouble(string $bytes): float\n    {\n        // This assumes IEEE 754 doubles, but most (all?) modern platforms\n        // use them.\n        $rc = unpack('E', $bytes);\n        if ($rc === false) {\n            throw new InvalidDatabaseException(\n                'Could not unpack a double value from the given bytes.'\n            );\n        }\n        [, $double] = $rc;\n\n        return $double;\n    }\n\n    private function decodeFloat(string $bytes): float\n    {\n        // This assumes IEEE 754 floats, but most (all?) modern platforms\n        // use them.\n        $rc = unpack('G', $bytes);\n        if ($rc === false) {\n            throw new InvalidDatabaseException(\n                'Could not unpack a float value from the given bytes.'\n            );\n        }\n        [, $float] = $rc;\n\n        return $float;\n    }\n\n    private function decodeInt32(string $bytes, int $size): int\n    {\n        switch ($size) {\n            case 0:\n                return 0;\n\n            case 1:\n            case 2:\n            case 3:\n                $bytes = str_pad($bytes, 4, \"\\x00\", \\STR_PAD_LEFT);\n\n                break;\n\n            case 4:\n                break;\n\n            default:\n                throw new InvalidDatabaseException(\n                    \"The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)\"\n                );\n        }\n\n        $rc = unpack('l', $this->maybeSwitchByteOrder($bytes));\n        if ($rc === false) {\n            throw new InvalidDatabaseException(\n                'Could not unpack a 32bit integer value from the given bytes.'\n            );\n        }\n        [, $int] = $rc;\n\n        return $int;\n    }\n\n    /**\n     * @return array{0:array<string, mixed>, 1:int}\n     */\n    private function decodeMap(int $size, int $offset): array\n    {\n        $map = [];\n\n        for ($i = 0; $i < $size; ++$i) {\n            [$key, $offset] = $this->decode($offset);\n            [$value, $offset] = $this->decode($offset);\n            $map[$key] = $value;\n        }\n\n        return [$map, $offset];\n    }\n\n    /**\n     * @return array{0:int, 1:int}\n     */\n    private function decodePointer(int $ctrlByte, int $offset): array\n    {\n        $pointerSize = (($ctrlByte >> 3) & 0x3) + 1;\n\n        $buffer = Util::read($this->fileStream, $offset, $pointerSize);\n        $offset += $pointerSize;\n\n        switch ($pointerSize) {\n            case 1:\n                $packed = \\chr($ctrlByte & 0x7) . $buffer;\n                $rc = unpack('n', $packed);\n                if ($rc === false) {\n                    throw new InvalidDatabaseException(\n                        'Could not unpack an unsigned short value from the given bytes (pointerSize is 1).'\n                    );\n                }\n                [, $pointer] = $rc;\n                $pointer += $this->pointerBase;\n\n                break;\n\n            case 2:\n                $packed = \"\\x00\" . \\chr($ctrlByte & 0x7) . $buffer;\n                $rc = unpack('N', $packed);\n                if ($rc === false) {\n                    throw new InvalidDatabaseException(\n                        'Could not unpack an unsigned long value from the given bytes (pointerSize is 2).'\n                    );\n                }\n                [, $pointer] = $rc;\n                $pointer += $this->pointerBase + 2048;\n\n                break;\n\n            case 3:\n                $packed = \\chr($ctrlByte & 0x7) . $buffer;\n\n                // It is safe to use 'N' here, even on 32 bit machines as the\n                // first bit is 0.\n                $rc = unpack('N', $packed);\n                if ($rc === false) {\n                    throw new InvalidDatabaseException(\n                        'Could not unpack an unsigned long value from the given bytes (pointerSize is 3).'\n                    );\n                }\n                [, $pointer] = $rc;\n                $pointer += $this->pointerBase + 526336;\n\n                break;\n\n            case 4:\n                // We cannot use unpack here as we might overflow on 32 bit\n                // machines\n                $pointerOffset = $this->decodeUint($buffer, $pointerSize);\n\n                $pointerBase = $this->pointerBase;\n\n                if (\\PHP_INT_MAX - $pointerBase >= $pointerOffset) {\n                    $pointer = $pointerOffset + $pointerBase;\n                } else {\n                    throw new \\RuntimeException(\n                        'The database offset is too large to be represented on your platform.'\n                    );\n                }\n\n                break;\n\n            default:\n                throw new InvalidDatabaseException(\n                    'Unexpected pointer size ' . $pointerSize\n                );\n        }\n\n        return [$pointer, $offset];\n    }\n\n    // @phpstan-ignore-next-line\n    private function decodeUint(string $bytes, int $byteLength)\n    {\n        if ($byteLength === 0) {\n            return 0;\n        }\n\n        // PHP integers are signed. PHP_INT_SIZE - 1 is the number of\n        // complete bytes that can be converted to an integer. However,\n        // we can convert another byte if the leading bit is zero.\n        $useRealInts = $byteLength <= \\PHP_INT_SIZE - 1\n            || ($byteLength === \\PHP_INT_SIZE && (\\ord($bytes[0]) & 0x80) === 0);\n\n        if ($useRealInts) {\n            $integer = 0;\n            for ($i = 0; $i < $byteLength; ++$i) {\n                $part = \\ord($bytes[$i]);\n                $integer = ($integer << 8) + $part;\n            }\n\n            return $integer;\n        }\n\n        // We only use gmp or bcmath if the final value is too big\n        $integerAsString = '0';\n        for ($i = 0; $i < $byteLength; ++$i) {\n            $part = \\ord($bytes[$i]);\n\n            if (\\extension_loaded('gmp')) {\n                $integerAsString = gmp_strval(gmp_add(gmp_mul($integerAsString, '256'), $part));\n            } elseif (\\extension_loaded('bcmath')) {\n                $integerAsString = bcadd(bcmul($integerAsString, '256'), (string) $part);\n            } else {\n                throw new \\RuntimeException(\n                    'The gmp or bcmath extension must be installed to read this database.'\n                );\n            }\n        }\n\n        return $integerAsString;\n    }\n\n    /**\n     * @return array{0:int, 1:int}\n     */\n    private function sizeFromCtrlByte(int $ctrlByte, int $offset): array\n    {\n        $size = $ctrlByte & 0x1F;\n\n        if ($size < 29) {\n            return [$size, $offset];\n        }\n\n        $bytesToRead = $size - 28;\n        $bytes = Util::read($this->fileStream, $offset, $bytesToRead);\n\n        if ($size === 29) {\n            $size = 29 + \\ord($bytes);\n        } elseif ($size === 30) {\n            $rc = unpack('n', $bytes);\n            if ($rc === false) {\n                throw new InvalidDatabaseException(\n                    'Could not unpack an unsigned short value from the given bytes.'\n                );\n            }\n            [, $adjust] = $rc;\n            $size = 285 + $adjust;\n        } else {\n            $rc = unpack('N', \"\\x00\" . $bytes);\n            if ($rc === false) {\n                throw new InvalidDatabaseException(\n                    'Could not unpack an unsigned long value from the given bytes.'\n                );\n            }\n            [, $adjust] = $rc;\n            $size = $adjust + 65821;\n        }\n\n        return [$size, $offset + $bytesToRead];\n    }\n\n    private function maybeSwitchByteOrder(string $bytes): string\n    {\n        return $this->switchByteOrder ? strrev($bytes) : $bytes;\n    }\n\n    private function isPlatformLittleEndian(): bool\n    {\n        $testint = 0x00FF;\n        $packed = pack('S', $testint);\n        $rc = unpack('v', $packed);\n        if ($rc === false) {\n            throw new InvalidDatabaseException(\n                'Could not unpack an unsigned short value from the given bytes.'\n            );\n        }\n\n        return $testint === current($rc);\n    }\n}\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MaxMind\\Db\\Reader;\n\n/**\n * This class should be thrown when unexpected data is found in the database.\n */\n// phpcs:disable\nclass InvalidDatabaseException extends \\Exception {}\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MaxMind\\Db\\Reader;\n\n/**\n * This class provides the metadata for the MaxMind DB file.\n */\nclass Metadata\n{\n    /**\n     * This is an unsigned 16-bit integer indicating the major version number\n     * for the database's binary format.\n     *\n     * @var int\n     */\n    public $binaryFormatMajorVersion;\n\n    /**\n     * This is an unsigned 16-bit integer indicating the minor version number\n     * for the database's binary format.\n     *\n     * @var int\n     */\n    public $binaryFormatMinorVersion;\n\n    /**\n     * This is an unsigned 64-bit integer that contains the database build\n     * timestamp as a Unix epoch value.\n     *\n     * @var int\n     */\n    public $buildEpoch;\n\n    /**\n     * This is a string that indicates the structure of each data record\n     * associated with an IP address.  The actual definition of these\n     * structures is left up to the database creator.\n     *\n     * @var string\n     */\n    public $databaseType;\n\n    /**\n     * This key will always point to a map (associative array). The keys of\n     * that map will be language codes, and the values will be a description\n     * in that language as a UTF-8 string. May be undefined for some\n     * databases.\n     *\n     * @var array<string, string>\n     */\n    public $description;\n\n    /**\n     * This is an unsigned 16-bit integer which is always 4 or 6. It indicates\n     * whether the database contains IPv4 or IPv6 address data.\n     *\n     * @var int\n     */\n    public $ipVersion;\n\n    /**\n     * An array of strings, each of which is a language code. A given record\n     * may contain data items that have been localized to some or all of\n     * these languages. This may be undefined.\n     *\n     * @var array<string>\n     */\n    public $languages;\n\n    /**\n     * @var int\n     */\n    public $nodeByteSize;\n\n    /**\n     * This is an unsigned 32-bit integer indicating the number of nodes in\n     * the search tree.\n     *\n     * @var int\n     */\n    public $nodeCount;\n\n    /**\n     * This is an unsigned 16-bit integer. It indicates the number of bits in a\n     * record in the search tree. Note that each node consists of two records.\n     *\n     * @var int\n     */\n    public $recordSize;\n\n    /**\n     * @var int\n     */\n    public $searchTreeSize;\n\n    /**\n     * @param array<string, mixed> $metadata\n     */\n    public function __construct(array $metadata)\n    {\n        if (\\func_num_args() !== 1) {\n            throw new \\ArgumentCountError(\n                \\sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \\func_num_args())\n            );\n        }\n\n        $this->binaryFormatMajorVersion =\n            $metadata['binary_format_major_version'];\n        $this->binaryFormatMinorVersion =\n            $metadata['binary_format_minor_version'];\n        $this->buildEpoch = $metadata['build_epoch'];\n        $this->databaseType = $metadata['database_type'];\n        $this->languages = $metadata['languages'];\n        $this->description = $metadata['description'];\n        $this->ipVersion = $metadata['ip_version'];\n        $this->nodeCount = $metadata['node_count'];\n        $this->recordSize = $metadata['record_size'];\n        $this->nodeByteSize = $this->recordSize / 4;\n        $this->searchTreeSize = $this->nodeCount * $this->nodeByteSize;\n    }\n}\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MaxMind\\Db\\Reader;\n\nclass Util\n{\n    /**\n     * @param resource    $stream\n     * @param int<0, max> $numberOfBytes\n     */\n    public static function read($stream, int $offset, int $numberOfBytes): string\n    {\n        if ($numberOfBytes === 0) {\n            return '';\n        }\n        if (fseek($stream, $offset) === 0) {\n            $value = fread($stream, $numberOfBytes);\n\n            // We check that the number of bytes read is equal to the number\n            // asked for. We use ftell as getting the length of $value is\n            // much slower.\n            if ($value !== false && ftell($stream) - $offset === $numberOfBytes) {\n                return $value;\n            }\n        }\n\n        throw new InvalidDatabaseException(\n            'The MaxMind DB file contains bad data'\n        );\n    }\n}\n"
  },
  {
    "path": "core/extend/vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MaxMind\\Db;\n\nuse MaxMind\\Db\\Reader\\Decoder;\nuse MaxMind\\Db\\Reader\\InvalidDatabaseException;\nuse MaxMind\\Db\\Reader\\Metadata;\nuse MaxMind\\Db\\Reader\\Util;\n\n/**\n * Instances of this class provide a reader for the MaxMind DB format. IP\n * addresses can be looked up using the get method.\n */\nclass Reader\n{\n    /**\n     * @var int\n     */\n    private static $DATA_SECTION_SEPARATOR_SIZE = 16;\n\n    /**\n     * @var string\n     */\n    private static $METADATA_START_MARKER = \"\\xAB\\xCD\\xEFMaxMind.com\";\n\n    /**\n     * @var int<0, max>\n     */\n    private static $METADATA_START_MARKER_LENGTH = 14;\n\n    /**\n     * @var int\n     */\n    private static $METADATA_MAX_SIZE = 131072; // 128 * 1024 = 128KiB\n\n    /**\n     * @var Decoder\n     */\n    private $decoder;\n\n    /**\n     * @var resource\n     */\n    private $fileHandle;\n\n    /**\n     * @var int\n     */\n    private $fileSize;\n\n    /**\n     * @var int\n     */\n    private $ipV4Start;\n\n    /**\n     * @var Metadata\n     */\n    private $metadata;\n\n    /**\n     * Constructs a Reader for the MaxMind DB format. The file passed to it must\n     * be a valid MaxMind DB file such as a GeoIp2 database file.\n     *\n     * @param string $database the MaxMind DB file to use\n     *\n     * @throws \\InvalidArgumentException for invalid database path or unknown arguments\n     * @throws InvalidDatabaseException\n     *                                   if the database is invalid or there is an error reading\n     *                                   from it\n     */\n    public function __construct(string $database)\n    {\n        if (\\func_num_args() !== 1) {\n            throw new \\ArgumentCountError(\n                \\sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \\func_num_args())\n            );\n        }\n\n        if (is_dir($database)) {\n            // This matches the error that the C extension throws.\n            throw new InvalidDatabaseException(\n                \"Error opening database file ($database). Is this a valid MaxMind DB file?\"\n            );\n        }\n\n        $fileHandle = @fopen($database, 'rb');\n        if ($fileHandle === false) {\n            throw new \\InvalidArgumentException(\n                \"The file \\\"$database\\\" does not exist or is not readable.\"\n            );\n        }\n        $this->fileHandle = $fileHandle;\n\n        $fileSize = @filesize($database);\n        if ($fileSize === false) {\n            throw new \\UnexpectedValueException(\n                \"Error determining the size of \\\"$database\\\".\"\n            );\n        }\n        $this->fileSize = $fileSize;\n\n        $start = $this->findMetadataStart($database);\n        $metadataDecoder = new Decoder($this->fileHandle, $start);\n        [$metadataArray] = $metadataDecoder->decode($start);\n        $this->metadata = new Metadata($metadataArray);\n        $this->decoder = new Decoder(\n            $this->fileHandle,\n            $this->metadata->searchTreeSize + self::$DATA_SECTION_SEPARATOR_SIZE\n        );\n        $this->ipV4Start = $this->ipV4StartNode();\n    }\n\n    /**\n     * Retrieves the record for the IP address.\n     *\n     * @param string $ipAddress the IP address to look up\n     *\n     * @throws \\BadMethodCallException   if this method is called on a closed database\n     * @throws \\InvalidArgumentException if something other than a single IP address is passed to the method\n     * @throws InvalidDatabaseException\n     *                                   if the database is invalid or there is an error reading\n     *                                   from it\n     *\n     * @return mixed the record for the IP address\n     */\n    public function get(string $ipAddress)\n    {\n        if (\\func_num_args() !== 1) {\n            throw new \\ArgumentCountError(\n                \\sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \\func_num_args())\n            );\n        }\n        [$record] = $this->getWithPrefixLen($ipAddress);\n\n        return $record;\n    }\n\n    /**\n     * Retrieves the record for the IP address and its associated network prefix length.\n     *\n     * @param string $ipAddress the IP address to look up\n     *\n     * @throws \\BadMethodCallException   if this method is called on a closed database\n     * @throws \\InvalidArgumentException if something other than a single IP address is passed to the method\n     * @throws InvalidDatabaseException\n     *                                   if the database is invalid or there is an error reading\n     *                                   from it\n     *\n     * @return array{0:mixed, 1:int} an array where the first element is the record and the\n     *                               second the network prefix length for the record\n     */\n    public function getWithPrefixLen(string $ipAddress): array\n    {\n        if (\\func_num_args() !== 1) {\n            throw new \\ArgumentCountError(\n                \\sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \\func_num_args())\n            );\n        }\n\n        if (!\\is_resource($this->fileHandle)) {\n            throw new \\BadMethodCallException(\n                'Attempt to read from a closed MaxMind DB.'\n            );\n        }\n\n        [$pointer, $prefixLen] = $this->findAddressInTree($ipAddress);\n        if ($pointer === 0) {\n            return [null, $prefixLen];\n        }\n\n        return [$this->resolveDataPointer($pointer), $prefixLen];\n    }\n\n    /**\n     * @return array{0:int, 1:int}\n     */\n    private function findAddressInTree(string $ipAddress): array\n    {\n        $packedAddr = @inet_pton($ipAddress);\n        if ($packedAddr === false) {\n            throw new \\InvalidArgumentException(\n                \"The value \\\"$ipAddress\\\" is not a valid IP address.\"\n            );\n        }\n\n        $rawAddress = unpack('C*', $packedAddr);\n        if ($rawAddress === false) {\n            throw new InvalidDatabaseException(\n                'Could not unpack the unsigned char of the packed in_addr representation.'\n            );\n        }\n\n        $bitCount = \\count($rawAddress) * 8;\n\n        // The first node of the tree is always node 0, at the beginning of the\n        // value\n        $node = 0;\n\n        $metadata = $this->metadata;\n\n        // Check if we are looking up an IPv4 address in an IPv6 tree. If this\n        // is the case, we can skip over the first 96 nodes.\n        if ($metadata->ipVersion === 6) {\n            if ($bitCount === 32) {\n                $node = $this->ipV4Start;\n            }\n        } elseif ($metadata->ipVersion === 4 && $bitCount === 128) {\n            throw new \\InvalidArgumentException(\n                \"Error looking up $ipAddress. You attempted to look up an\"\n                . ' IPv6 address in an IPv4-only database.'\n            );\n        }\n\n        $nodeCount = $metadata->nodeCount;\n\n        for ($i = 0; $i < $bitCount && $node < $nodeCount; ++$i) {\n            $tempBit = 0xFF & $rawAddress[($i >> 3) + 1];\n            $bit = 1 & ($tempBit >> 7 - ($i % 8));\n\n            $node = $this->readNode($node, $bit);\n        }\n        if ($node === $nodeCount) {\n            // Record is empty\n            return [0, $i];\n        }\n        if ($node > $nodeCount) {\n            // Record is a data pointer\n            return [$node, $i];\n        }\n\n        throw new InvalidDatabaseException(\n            'Invalid or corrupt database. Maximum search depth reached without finding a leaf node'\n        );\n    }\n\n    private function ipV4StartNode(): int\n    {\n        // If we have an IPv4 database, the start node is the first node\n        if ($this->metadata->ipVersion === 4) {\n            return 0;\n        }\n\n        $node = 0;\n\n        for ($i = 0; $i < 96 && $node < $this->metadata->nodeCount; ++$i) {\n            $node = $this->readNode($node, 0);\n        }\n\n        return $node;\n    }\n\n    private function readNode(int $nodeNumber, int $index): int\n    {\n        $baseOffset = $nodeNumber * $this->metadata->nodeByteSize;\n\n        switch ($this->metadata->recordSize) {\n            case 24:\n                $bytes = Util::read($this->fileHandle, $baseOffset + $index * 3, 3);\n                $rc = unpack('N', \"\\x00\" . $bytes);\n                if ($rc === false) {\n                    throw new InvalidDatabaseException(\n                        'Could not unpack the unsigned long of the node.'\n                    );\n                }\n                [, $node] = $rc;\n\n                return $node;\n\n            case 28:\n                $bytes = Util::read($this->fileHandle, $baseOffset + 3 * $index, 4);\n                if ($index === 0) {\n                    $middle = (0xF0 & \\ord($bytes[3])) >> 4;\n                } else {\n                    $middle = 0x0F & \\ord($bytes[0]);\n                }\n                $rc = unpack('N', \\chr($middle) . substr($bytes, $index, 3));\n                if ($rc === false) {\n                    throw new InvalidDatabaseException(\n                        'Could not unpack the unsigned long of the node.'\n                    );\n                }\n                [, $node] = $rc;\n\n                return $node;\n\n            case 32:\n                $bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 4);\n                $rc = unpack('N', $bytes);\n                if ($rc === false) {\n                    throw new InvalidDatabaseException(\n                        'Could not unpack the unsigned long of the node.'\n                    );\n                }\n                [, $node] = $rc;\n\n                return $node;\n\n            default:\n                throw new InvalidDatabaseException(\n                    'Unknown record size: '\n                    . $this->metadata->recordSize\n                );\n        }\n    }\n\n    /**\n     * @return mixed\n     */\n    private function resolveDataPointer(int $pointer)\n    {\n        $resolved = $pointer - $this->metadata->nodeCount\n            + $this->metadata->searchTreeSize;\n        if ($resolved >= $this->fileSize) {\n            throw new InvalidDatabaseException(\n                \"The MaxMind DB file's search tree is corrupt\"\n            );\n        }\n\n        [$data] = $this->decoder->decode($resolved);\n\n        return $data;\n    }\n\n    /*\n     * This is an extremely naive but reasonably readable implementation. There\n     * are much faster algorithms (e.g., Boyer-Moore) for this if speed is ever\n     * an issue, but I suspect it won't be.\n     */\n    private function findMetadataStart(string $filename): int\n    {\n        $handle = $this->fileHandle;\n        $fstat = fstat($handle);\n        if ($fstat === false) {\n            throw new InvalidDatabaseException(\n                \"Error getting file information ($filename).\"\n            );\n        }\n        $fileSize = $fstat['size'];\n        $marker = self::$METADATA_START_MARKER;\n        $markerLength = self::$METADATA_START_MARKER_LENGTH;\n\n        $minStart = $fileSize - min(self::$METADATA_MAX_SIZE, $fileSize);\n\n        for ($offset = $fileSize - $markerLength; $offset >= $minStart; --$offset) {\n            if (fseek($handle, $offset) !== 0) {\n                break;\n            }\n\n            $value = fread($handle, $markerLength);\n            if ($value === $marker) {\n                return $offset + $markerLength;\n            }\n        }\n\n        throw new InvalidDatabaseException(\n            \"Error opening database file ($filename). \" .\n            'Is this a valid MaxMind DB file?'\n        );\n    }\n\n    /**\n     * @throws \\InvalidArgumentException if arguments are passed to the method\n     * @throws \\BadMethodCallException   if the database has been closed\n     *\n     * @return Metadata object for the database\n     */\n    public function metadata(): Metadata\n    {\n        if (\\func_num_args()) {\n            throw new \\ArgumentCountError(\n                \\sprintf('%s() expects exactly 0 parameters, %d given', __METHOD__, \\func_num_args())\n            );\n        }\n\n        // Not technically required, but this makes it consistent with\n        // C extension and it allows us to change our implementation later.\n        if (!\\is_resource($this->fileHandle)) {\n            throw new \\BadMethodCallException(\n                'Attempt to read from a closed MaxMind DB.'\n            );\n        }\n\n        return clone $this->metadata;\n    }\n\n    /**\n     * Closes the MaxMind DB and returns resources to the system.\n     *\n     * @throws \\Exception\n     *                    if an I/O error occurs\n     */\n    public function close(): void\n    {\n        if (\\func_num_args()) {\n            throw new \\ArgumentCountError(\n                \\sprintf('%s() expects exactly 0 parameters, %d given', __METHOD__, \\func_num_args())\n            );\n        }\n\n        if (!\\is_resource($this->fileHandle)) {\n            throw new \\BadMethodCallException(\n                'Attempt to close a closed MaxMind DB.'\n            );\n        }\n        fclose($this->fileHandle);\n    }\n}\n"
  },
  {
    "path": "core/func.php",
    "content": "<?php\n$options = bsOptions::getInstance()::get_option( 'bearsimple' );\n\\Widget\\Security::alloc()->to($security);\nrequire_once('general.php');\nrequire_once('assetsdir.php');\nrequire_once('compresshtml.php');\nrequire_once('getcheck.php');\nrequire_once('gravatar.php');\nrequire_once('replyview.php');\nrequire_once('tongji.php');\nrequire_once('parse.php');\nrequire_once('extend/UserAgent.class.php');\nif(Helper::options()->version >= '1.3.0'){\nrequire_once('extend/Comments_n.php');\n}\nelse{\nrequire_once('extend/Comments.php');    \n}\nif(Helper::options()->version >= '1.3.0'){\nrequire_once('extend/FriendCircle_n.php');\n}\nelse{\nrequire_once('extend/FriendCircle.php');    \n}\nrequire_once('usercenter.php');\n\nfunction syncDb(){\n    $db = \\Typecho\\Db::get();\n    $prefix = $db->getPrefix();\n    $table = $db->getPrefix() . 'bscore_cron_data';\n    $table1 = $db->getPrefix() . 'bscore_iplocation_data';\n    $table2 = $db->getPrefix() . 'bscore_friendcircle_data';\n    $table3 = $db->getPrefix() . 'bscore_emaction_data';\n    $table4 = $db->getPrefix() . 'bscore_wechat_data';\n    $table5 = $db->getPrefix() . 'bscore_wechat_msgids';\n    $adapter = $db->getAdapterName();\n        if (\"Pdo_SQLite\" === $adapter || \"SQLite\" === $adapter) {\n            //cron表初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   type  TEXT,\n\t\t\t   checktotal TEXT,\n\t\t\t   checksuccess TEXT,\n\t\t\t   checkfailed TEXT,\n\t\t\t   checktime TEXT)\");\n\t\t\t//IP地理位置表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table1 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   coid  TEXT,\n\t\t\t   location TEXT)\");\n\t\t\t//朋友圈表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table2 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   coid  TEXT,\n\t\t\t   private TEXT,\n\t\t\t   resources TEXT,\n\t\t\t   location TEXT)\");\n\t\t\t//Emaction表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table3 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   target_id  TEXT,\n\t\t\t   reaction_name TEXT,\n\t\t\t   diff TEXT)\");\n        \n        //Wechat表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table4 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   openid TEXT,\n\t\t\t   msg_type  TEXT,\n\t\t\t   content TEXT)\");\n\t\t\t   \n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table5 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   msgid TEXT)\");\n        }\n        if (\"pgsql\" === $adapter || \"Pdo_Pgsql\" === $adapter) {\n            //cron表初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table . \" (\n\t\t\t   id SERIAL PRIMARY KEY,\n\t\t\t   type  TEXT,\n\t\t\t   checktotal TEXT,\n\t\t\t   checksuccess TEXT,\n\t\t\t   checkfailed TEXT,\n\t\t\t   checktime TEXT)\");\n\t\t\t//IP地理位置表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table1 . \" (\n\t\t\t   id SERIAL PRIMARY KEY,\n\t\t\t   coid  TEXT,\n\t\t\t   location TEXT)\");\n\t\t\t//朋友圈表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table2 . \" (\n\t\t\t   id SERIAL PRIMARY KEY,\n\t\t\t   coid  TEXT,\n\t\t\t   private TEXT,\n\t\t\t   resources TEXT,\n\t\t\t   location TEXT)\");\n\t\t\t//Emaction表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table3 . \" (\n\t\t\t   id SERIAL PRIMARY KEY,\n\t\t\t   target_id  TEXT,\n\t\t\t   reaction_name TEXT,\n\t\t\t   diff TEXT)\");\n        \n        //Wechat表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table4 . \" (\n\t\t\t   id SERIAL PRIMARY KEY,\n\t\t\t   openid TEXT,\n\t\t\t   msg_type  TEXT,\n\t\t\t   content TEXT)\");\n\t\t\t   \n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table5 . \" (\n\t\t\t   id SERIAL PRIMARY KEY,\n\t\t\t   msgid TEXT)\");\n        }\n       if (\"Pdo_Mysql\" === $adapter || \"Mysql\" === $adapter || \"Mysqli\" === $adapter) {\n            $dbConfig = null;\n            if (class_exists('\\Typecho\\Db')) {\n                $dbConfig = $db->getConfig($db::READ);\n            } else {\n                $dbConfig = $db->getConfig()[0];\n            }\n            $charset = $dbConfig->charset;\n            \n           //cron表初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table . \" (\n\t\t\t   `id` int(10) NOT NULL AUTO_INCREMENT,\n\t\t\t   `type`  varchar(150) NOT NULL,\n\t\t\t   `checktotal`  varchar(1000) NOT NULL,\n\t\t\t   `checksuccess`  varchar(1000) NOT NULL,\n\t\t\t   `checkfailed`  varchar(1000) NOT NULL,\n\t\t\t   `checktime`  varchar(1000) NOT NULL,\n\t\t\t  PRIMARY KEY (`id`)\n\t\t\t\t) DEFAULT CHARSET=$charset AUTO_INCREMENT=1\"); \n\t\t\t//IP地理位置表初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table1 . \" (\n\t\t\t   `id` int(10) NOT NULL AUTO_INCREMENT,\n\t\t\t   `coid`  varchar(150) NOT NULL,\n\t\t\t   `location`  varchar(1000) NOT NULL,\n\t\t\t  PRIMARY KEY (`id`)\n\t\t\t\t) DEFAULT CHARSET=$charset AUTO_INCREMENT=1\"); \n       \t//朋友圈表初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table2 . \" (\n\t\t\t   `id` int(10) NOT NULL AUTO_INCREMENT,\n\t\t\t   `coid`  varchar(150) NOT NULL,\n\t\t\t   `private`  varchar(1000) NULL DEFAULT NULL,\n\t\t\t   `resources`  LONGTEXT NULL DEFAULT NULL,\n\t\t\t   `location`  varchar(1000) NULL DEFAULT NULL,\n\t\t\t   `likeUser`  LONGTEXT NULL DEFAULT NULL,\n\t\t\t   `likeVisitor`  LONGTEXT NULL DEFAULT NULL,\n\t\t\t  PRIMARY KEY (`id`)\n\t\t\t\t) DEFAULT CHARSET=$charset AUTO_INCREMENT=1\"); \n\t\t//Emaction表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table3 . \" (\n\t\t\t   `id` int(11) NOT NULL AUTO_INCREMENT,\n               `target_id` varchar(255) NOT NULL,\n               `reaction_name` varchar(255) NOT NULL,\n               `diff` int(11) NOT NULL DEFAULT '1',\n                PRIMARY KEY (`id`)\n\t\t\t\t) DEFAULT CHARSET=$charset AUTO_INCREMENT=1\"); \n\t\t//Wechat表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table4 . \" (\n\t\t\t   `id` int(11) NOT NULL AUTO_INCREMENT,\n\t\t\t   `openid` varchar(255) NOT NULL,\n               `msg_type` varchar(255) NOT NULL,\n               `content` LONGTEXT NOT NULL,\n                PRIMARY KEY (`id`)\n\t\t\t\t) DEFAULT CHARSET=$charset AUTO_INCREMENT=1\"); \n\t\t\t\t\n\t\t\t\t$db->query(\" CREATE TABLE IF NOT EXISTS \" . $table5 . \" (\n\t\t\t   `id` int(11) NOT NULL AUTO_INCREMENT,\n\t\t\t   `msgid` LONGTEXT NOT NULL,\n                PRIMARY KEY (`id`)\n\t\t\t\t) DEFAULT CHARSET=$charset AUTO_INCREMENT=1\"); \n\n       }\n       $select = $db->fetchRow($db->select()->from('table.options')\n            ->where('name = ?', 'cronKey'));\n       if (empty($select)) {\n            $db->query($db->insert('table.options')\n                ->rows([\n                    'name' => 'cronKey',\n                    'value' => md5(uniqid()),\n                    'user' => 0\n                ]));\n        }\n        $select2 = $db->fetchRow($db->select()->from('table.options')\n            ->where('name = ?', 'openId'));\n       if (empty($select2)) {\n            $db->query($db->insert('table.options')\n                ->rows([\n                    'name' => 'openId',\n                    'value' => null,\n                    'user' => 0\n                ]));\n        }\n}\nfunction get_hito(){\n $curl = curl_init();\n    curl_setopt($curl, CURLOPT_URL, 'https://v1.hitokoto.cn/');\n    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);\n    curl_setopt($curl, CURLOPT_TIMEOUT, 500);\n    curl_setopt($curl, CURLOPT_POST, false);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);\n    $data = curl_exec($curl);\n    curl_close($curl);\n    $datas = json_decode($data,true);\n    return $datas['hitokoto'];\n}\nfunction get_friendlink($type = NULL){\n     $db = \\Typecho\\Db::get();\n     $options = bsOptions::getInstance()::get_option('bearsimple');\n     if($type == NULL){\n         $adapter = $db->getAdapterName();\nif (\"Pdo_SQLite\" === $adapter || \"SQLite\" === $adapter || \"pgsql\" === $adapter || \"Pdo_Pgsql\" === $adapter) {\n    $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'approved')->order('RANDOM()'));\n}\nelse{\n         $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'approved')->order('RAND()'));\n}\n     }\n         else{\n             \n             if($options['FriendLinkRejectShowAll'] == false){\n         $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'reject')->where('rejectreason != ?','NULL'));   \n             }\n             else{\n         $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'reject'));           \n             }\n             \n             \n         }\n         if(empty($links)){\n             $links = NULL ;\n         }\n return $links;\n}\nfunction billboard($ads,$type){\n    $options = bsOptions::getInstance()::get_option('bearsimple');\n    if($type == 'sidebar1'){\n    switch($ads){\n        case '1':\n     $str = explode(\"|\",$options['AdControl1Src']);\n    $target = parselink($str[1]);     \n    echo '\n    <div class=\"ui cards\"><a class=\"gray card\" '.$target.' href=\"'.$str[1].'\">\n    <div class=\"image\">\n      <img src=\"';if(empty($str[0])){ echo AssetsDir().'assets/image/white-image.png'; }else{ echo $str[0];} echo'\">\n       \n    </div>\n  </a>\n  </div>\n    ';     \n            break;\n            case '2':\n                echo  '<div class=\"google_ad\">'.$options['AdControl1Code'].'</div>';\n                break;\n            default:\n         $str = explode(\"|\",$options['AdControl1Src']);\n    $target = parselink($str[1]);     \n    echo '\n    <div class=\"ui cards\"><a class=\"gray card\" '.$target.' href=\"'.$str[1].'\">\n    <div class=\"image\">\n      <img src=\"';if(empty($str[0])){ echo AssetsDir().'assets/image/white-image.png'; }else{ echo $str[0];} echo'\">\n       \n    </div>\n  </a>\n  </div>\n    ';            \n    }    \n    }\nelseif($type == 'sidebar2'){\n    switch($ads){\n        case '1':\n     $str = explode(\"|\",$options['AdControl2Src']);\n    $target = parselink($str[1]);     \n    echo '\n    <div class=\"ui cards\"><a class=\"gray card\" '.$target.' href=\"'.$str[1].'\">\n    <div class=\"image\">\n      <img src=\"';if(empty($str[0])){ echo AssetsDir().'assets/image/white-image.png'; }else{ echo $str[0];} echo'\">\n       \n    </div>\n  </a>\n  </div>\n    ';     \n            break;\n            case '2':\n                echo  '<div class=\"google_ad\">'.$options['AdControl2Code'].'</div>';\n                break;\n            default:\n         $str = explode(\"|\",$options['AdControl2Src']);\n    $target = parselink($str[1]);     \n    echo '\n    <div class=\"ui cards\"><a class=\"gray card\" '.$target.' href=\"'.$str[1].'\">\n    <div class=\"image\">\n      <img src=\"';if(empty($str[0])){ echo AssetsDir().'assets/image/white-image.png'; }else{ echo $str[0];} echo'\">\n       \n    </div>\n  </a>\n  </div>\n    ';            \n    }    \n    }\nelseif($type == 'index'){\n     \n    \n    switch($ads){\n        case '1':\n     $str = explode(\"|\",$options['AdControl3Src']);\n    $target = parselink($str[1]);     \n    echo '\n     <div class=\"bs_ads_cont\">\n    <a  href=\"'.$str[1].'\" '.$target.'>\n      <img class=\"bs_ads_img ui fluid image\" src=\"'.$str[0].'\">\n  </a>\n  </div>\n    ';\n            break;\n            case '2':\n                echo  '<div class=\"google_ad\">'.$options['AdControl3Code'].'</div>';\n                break;\n            default:\n         $str = explode(\"|\",$options['AdControl3Src']);\n    $target = parselink($str[1]);     \n    echo '\n     <div class=\"bs_ads_cont\">\n    <a  href=\"'.$str[1].'\" '.$target.'>\n      <img class=\"bs_ads_img ui fluid image\" src=\"'.$str[0].'\">\n  </a>\n  </div>\n    ';            \n    }    \n    \n    \n    \n}\n\nelseif($type == 'other'){\n     \n    \n    switch($ads){\n        case '1':\n     $str = explode(\"|\",$options['AdControl4Src']);\n    $target = parselink($str[1]);     \n    echo '\n     <div class=\"bs_ads_cont\">\n    <a  href=\"'.$str[1].'\" '.$target.'>\n      <img class=\"bs_ads_img ui fluid image\" src=\"'.$str[0].'\">\n  </a>\n  </div>\n    ';\n            break;\n            case '2':\n                echo  '<div class=\"google_ad\">'.$options['AdControl4Code'].'</div>';\n                break;\n            default:\n         $str = explode(\"|\",$options['AdControl4Src']);\n    $target = parselink($str[1]);     \n    echo '\n     <div class=\"bs_ads_cont\">\n    <a  href=\"'.$str[1].'\" '.$target.'>\n      <img class=\"bs_ads_img ui fluid image\" src=\"'.$str[0].'\">\n  </a>\n  </div>\n    ';            \n    }    \n    \n    \n    \n}\n}\nfunction parseMultilineData($str, $columnCount)\n    {\n        $result = array();\n        if (!empty($str)) {\n            $data = explode(\"\\n\", $str);\n            foreach ($data as $item) {\n                $item = trim($item);\n                if (!empty($item)) {\n                    $itemData = explode('|', $item, $columnCount);\n                    if (count($itemData) == $columnCount) {\n                        foreach ($itemData as $k => $v) {\n                            $itemData[$k] = trim($v);\n                        }\n                        $result[] = $itemData;\n                    }\n                }\n            }\n        }\n        return $result;\n    }\n\nfunction getMenu()\n    {\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n        return parseMultilineData($options['Menu'], 2);\n    }\n\nfunction getLink()\n    {\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n        return parseMultilineData($options['WebLink'], 2);\n    }\n\nfunction announmentget(){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $announment = explode('|',$options['PopupText']);\n    return $announment;\n}\n\nfunction sliderget(){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    return parseMultilineData($options['SliderPics'], 3);\n}\n\nfunction getFriendLink()\n    {\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n        return parseMultilineData($options['FriendLink'], 3);\n    }\n    \nfunction getDoubanId($id)\n    {\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $DoubanId = explode(',',$id);\n        return $DoubanId;\n    }\n    \nfunction getBookTag()\n    {\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $DoubanTag = explode(',',$options['douban_tag']);\n        return $DoubanTag;\n    }\n\nfunction getMovieTag()\n    {\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $DoubanTag = explode(',',$options['douban_movie_tag']);\n        return $DoubanTag;\n    }\n\nfunction getMusicTag()\n    {\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $DoubanTag = explode(',',$options['douban_music_tag']);\n        return $DoubanTag;\n    }\n    \nfunction curl_func($url){\n$ch = curl_init ();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_TIMEOUT, 200);\ncurl_setopt($ch, CURLOPT_HEADER, FALSE);\ncurl_setopt($ch, CURLOPT_NOBODY, FALSE);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);\ncurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);\ncurl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);\ncurl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');\ncurl_exec($ch);\n$httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);\nreturn $httpCode;\n    }\n//主题开启后的设定\n\nfunction themeInit($self){\n     if (strpos($_SERVER['REQUEST_URI'], '/attachment/') !== false) {\n   $self->response->setStatus(404);\n}\n    if ($self->hidden){\n    $self->response->setStatus(200);\nheader('HTTP/1.1 200 OK');\n    }\n    $options1 = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    $nonList = \\BsCore\\Plugin::textareaToArrs($options1['safeRedirectionNonList']);\n    \n    if ($options1['safeRedirection'] == '1') {\nif (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) {\n   $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/safeRedirection.php\"); \n}\n}\nif($options1['infinite_scroll'] == true){\n$self->parameter->pageSize = $options1['infinite_pageSize'];\nif($self->is('category') && !empty(CategoryAlbum(categeid($self->getArchiveSlug())))){ \n$self->parameter->pageSize = CategoryAlbum(categeid($self->getArchiveSlug()))['Cate_Album_Number'];\n}\n}\n\n$options->commentsOrder = 'DESC';\n$options->commentsAntiSpam = false;\nif($options1['Pjax'] == true){\n$options->commentsCheckReferer = false;\n}\n//bsOptions::getInstance()::get_option( 'bearsimple' )->commentsMaxNestingLevels = 999;\n\\Typecho\\Widget::widget('Widget_User')->to($user);\n            \n    //Sitemap\n         if (bsOptions::getInstance()::get_option( 'bearsimple' )['SiteMap'] && bsOptions::getInstance()::get_option( 'bearsimple' )['SiteMap'] !== 'close') {\n        if (strpos($_SERVER['REQUEST_URI'], 'sitemap.xml') !== false) {\n\n    $self->response->setStatus(200);\n        $self->setThemeFile(\"modules/SiteMap/sitemap.php\");\n    }\n}\n       \nif (strpos($_SERVER['REQUEST_URI'], 'searchcross') !== false) {\n\n    $self->response->setStatus(200);\n        $self->setThemeFile(\"core/widget/searchcross.php\");\n    }\n         //用户中心\n if (strpos($_SERVER['REQUEST_URI'], 'usercenter') !== false && $user->hasLogin() && $options1['UserCenterOpen'] == true) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"modules/UserCenter/user.php\");\n        }\n\n        //追番获取\n        if (strpos($_SERVER['REQUEST_URI'], 'getacg') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"vendors/Bilibili/getData.php\");\n        }\n         //追番获取\n        if (strpos($_SERVER['REQUEST_URI'], 'bs-pagecontent') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/pageContent.php\");\n        }\n       \n        //豆瓣获取\n        if (strpos($_SERVER['REQUEST_URI'], 'getdouban') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"vendors/Douban/getData.php\");\n        }\n        //编辑器附件插入\n        if (strpos($_SERVER['REQUEST_URI'], 'write') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/write.php\");\n}\n//签到\nif (strpos($_SERVER['REQUEST_URI'], 'bgetSign') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getsign.php\");\n}\n//获取豆瓣\n        if (strpos($_SERVER['REQUEST_URI'], 'getDouban') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getDouban.php\");\n        }\n//获取Bangumi\n        if (strpos($_SERVER['REQUEST_URI'], 'getBangumi') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getBangumi.php\");\n        }\n//获取标签\n        if (strpos($_SERVER['REQUEST_URI'], 'getTags') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getTags.php\");\n        }\n\nif($_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){\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getLoginAction.php\");\n}\n //同步\n        if (strpos($_SERVER['REQUEST_URI'], 'syncData') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/syncData.php\");\n        }\n //发送通知\n        if (strpos($_SERVER['REQUEST_URI'], 'bs-usernotify') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/usernotify.php\");\n        }\n \n        //memos\n        if (strpos($_SERVER['REQUEST_URI'], 'getMemosAction') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getMemosAction.php\");\n        }\n        //aitools\n        if (strpos($_SERVER['REQUEST_URI'], 'getAiTools') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/aiTools.php\");\n        }\n         //评论动作\n         if (strpos($_SERVER['REQUEST_URI'], 'getCommentAction') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getCommentAction.php\");\n        }\n        //用户动作\n        if (strpos($_SERVER['REQUEST_URI'], 'bUserAction') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/UserAction.php\");\n        }\n        if (strpos($_SERVER['REQUEST_URI'], 'bsBackendAction') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/bsBackendAction.php\");\n        }\n        \n                //上传图片API\n        if (strpos($_SERVER['REQUEST_URI'], 'uploadimages') !== false) {\n           $self->response->setStatus(200);\n            $self->setThemeFile(\"upload/upload_img.php\");\n        }\n        //升级API\n        if (strpos($_SERVER['REQUEST_URI'], 'bs-upgrade') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"modules/Upgrade/Upgrade.php\");\n        }\n      \n//获取友链数据\n        if (strpos($_SERVER['REQUEST_URI'], 'bsfrienddata') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/friendlinkData.php\");\n        }\n//友链数据操作\n        if (strpos($_SERVER['REQUEST_URI'], 'bsfriendaction') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/friendlinkAction.php\");\n        }\n//全站&分类加密提交操作\n        if (strpos($_SERVER['REQUEST_URI'], 'getencrypt') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/encrypt.php\");\n        }        \n//获取文章数据\n        if (strpos($_SERVER['REQUEST_URI'], 'jsonapi/getarticle') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getarticle.php\");\n        }\n//评论点赞\n        if (strpos($_SERVER['REQUEST_URI'], 'commentlike') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/commentlike.php\");\n        }\n//文章点赞\n        if (strpos($_SERVER['REQUEST_URI'], 'postlike') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/postlike.php\");\n        }\n\n\n        \n//获取Github仓库\n        if (strpos($_SERVER['REQUEST_URI'], 'getgithub') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getgithub.php\");\n        }\n\n//获取用户\n        if (strpos($_SERVER['REQUEST_URI'], 'getUsers') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getUsers.php\");\n        }\n        //提交友链\n        if (strpos($_SERVER['REQUEST_URI'], 'friendajax') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/friendlink.php\");\n        }\n\n//判断登录\n        if (strpos($_SERVER['REQUEST_URI'], 'getIsLogin') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getLogin.php\");\n        }\n         \n//cron\nif (strpos($_SERVER['REQUEST_URI'], 'bearCron') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/cron.php\");\n        }\n//Emoji\nif (strpos($_SERVER['REQUEST_URI'], 'bearEmoji') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getEmoji.php\");\n        }   \n        \n//Circle\nif (strpos($_SERVER['REQUEST_URI'], 'getCircleAction') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/circleAction.php\");\n        }   \n//emaction\nif (strpos($_SERVER['REQUEST_URI'], 'getEmaction') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/getEmaction.php\");\n        }  \n        \n//emaction\nif (strpos($_SERVER['REQUEST_URI'], 'wechatServer') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/wechatServer/wechatServer.php\");\n        } \n        \n        \n    //feed\nif (strpos($_SERVER['REQUEST_URI'], 'feed') !== false) {\n            $self->response->setStatus(200);\n        ob_clean();\n        header('Content-Type: text/xml;charset=UTF-8');\n        }\n        \n   //获取文章数据\n        if (strpos($_SERVER['REQUEST_URI'], 'bsoptions/ajax') !== false) {\n            $self->response->setStatus(200);\n            $self->setThemeFile(\"core/widget/bsajax.php\");\n        }     \n                if ($self->request->isPost()){\n    if ($self->request->postview){\n        addPostView($self,$self->request->postview,$self->request->postType);\n        exit;\n    }\n}\n\n\n    \n}\nfunction getCustom($cid, $key){\n$field=Typecho_Widget::widget('Widget_Archive@'.$cid,'pageSize=1&type=post', 'cid='.$cid);\nreturn $field->fields->$key;\n}\n\nfunction setFields(string $name, string $type, string $value, int $cid)\n    {\n        $db = \\Typecho\\Db::get();\n        if (\n            empty($name)\n            || !in_array($type, ['str', 'int', 'float'])\n        ) {\n            return false;\n        }\n\n        $exist = $db->fetchRow($db->select('cid')->from('table.fields')\n            ->where('cid = ? AND name = ?', $cid, $name));\n\n        if (empty($exist)) {\n            return $db->query($db->insert('table.fields')\n                ->rows([\n                    'cid'         => $cid,\n                    'name'        => $name,\n                    'type'        => $type,\n                    'str_value'   => 'str' == $type ? $value : null,\n                    'int_value'   => 'int' == $type ? intval($value) : 0,\n                    'float_value' => 'float' == $type ? floatval($value) : 0\n                ]));\n        } else {\n            return $db->query($db->update('table.fields')\n                ->rows([\n                    'type'        => $type,\n                    'str_value'   => 'str' == $type ? $value : null,\n                    'int_value'   => 'int' == $type ? intval($value) : 0,\n                    'float_value' => 'float' == $type ? floatval($value) : 0\n                ])\n                ->where('cid = ? AND name = ?', $cid, $name));\n        }\n    }\n    \nfunction addPostView($widget,$post_id,$post_type){\n    $db = Typecho_Db::get();\n    if (!$post_id) $widget->response->throwJson([\n            'code'=> 0,\n            'msg' => '缺少参数',\n    ]);\n\n   $views=Typecho_Widget::widget('Widget_Archive@'.$post_id,'pageSize=1&type='.$post_type, 'cid='.$post_id);\n        $views = (!empty(getCustom($post_id, 'views'))) ? intval(getCustom($post_id, 'views')) : 0;\n   \n    \n    //增加浏览次数\n        $vieweds = Typecho_Cookie::get('contents_viewed');\n        if (empty($vieweds))\n            $vieweds = array();\n        else\n            $vieweds = explode(',', $vieweds);\n        if (!in_array($post_id, $vieweds)) {\n            $views = $views + 1;\n            setFields('views', 'str', strval($views), $post_id);\n            $vieweds[] = $post_id;\n            $vieweds = implode(',', $vieweds);\n            Typecho_Cookie::set(\"contents_viewed\",$vieweds);\n        }    \n    \n    $widget->response->throwJson([\n        'code'=> 1,\n        'msg' => '获取成功',\n        'data' => number_format($views)\n    ]);\n}\n\n\nfunction page_fetch(String $type, Array $ids,String $cachetype, Int $page = 1, Int $limit = 6){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $cache_name = '';\n   if($type=='movie'){\n        $cache_name = 'movie_';\n        $cache_name2 = 'movie_';\n    }\n    elseif($type=='book'){\n       $cache_name = 'book_'; \n       $cache_name2 = 'book_'; \n    }\n    elseif($type=='music'){\n       $cache_name = 'music_'; \n       $cache_name2 = 'music_'; \n    }\n    $cache_dir = __TYPECHO_ROOT_DIR__.__TYPECHO_THEME_DIR__.'/bearsimple/vendors/Douban/';\n    if(!is_dir($cache_dir)) @mkdir($cache_dir);\n    $cache_dir .= 'cache/';\n    if(!is_dir($cache_dir)) @mkdir($cache_dir);\n    $neelde = [];\n    $offset = ($page - 1) * $limit;\n    $end = $offset + $limit;\n    $total = count($ids);\n    $end > $total && $end = $total;\n    $stars = [];\n        switch($type){\n     case 'movie':\n         $rating_ch = $options['douban_movie_rating'];\n       switch($cachetype){\n          case '1':\n              $cachetypenr = $options['douban_movie1'];\n              break;\n          case '2':\n              $cachetypenr = $options['douban_movie2'];\n              break;\n          case '3':\n              $cachetypenr = $options['douban_movie3'];\n              break;\n       }\n         break;\n     case 'book':\n         $rating_ch = $options['douban_rating'];\n                switch($cachetype){\n          case '1':\n              $cachetypenr = $options['douban_book1'];\n              break;\n          case '2':\n              $cachetypenr = $options['douban_book2'];\n              break;\n          case '3':\n              $cachetypenr = $options['douban_book3'];\n              break;\n       }\n         break;\n     case 'music':\n         $rating_ch = $options['douban_music_rating'];\n                switch($cachetype){\n          case '1':\n              $cachetypenr = $options['douban_music1'];\n              break;\n          case '2':\n              $cachetypenr = $options['douban_music2'];\n              break;\n          case '3':\n              $cachetypenr = $options['douban_music3'];\n              break;\n       }\n         break;\n         default:;\n    }\n    for($i = $offset; $i < $end; $i++){\n        $id = explode('*', $ids[$i]);\n        $neelde[] = $id[0];\n        if(!empty($id[1])){\n            $stars[$id[0]] = $id[1];\n        }else{\n            $stars[$id[0]] = 0;\n        }\n    }\n    $cache_name .= md5(implode(',', $neelde)) . '.json';\n    $cache_name2 .= $cachetype.'.config';\n    $cache_file = $cache_dir . $cache_name;\n    $cache_file2 = $cache_dir . $cache_name2;\n    if(file_exists($cache_file) && filectime($cache_file) + (5 * 24 * 3600) >= time() && $cachetypenr == @file_get_contents($cache_file2)){\n        // 5天时间\n        $result = json_decode(@file_get_contents($cache_file), true);\n    }else{\n        unlink($cache_file2);\n        switch($type){\n            case 'movie':\n        foreach($neelde as $k => $v){\n            $Getdata = douban_getdata($v, 'movie');\n            $result[$v] = [\n        \t    'url' => $Getdata[\"url\"],\n        \t    'cover' => $Getdata['cover'],\n        \t    'title' => $Getdata['moviename'],\n        \t    'summary' => $Getdata['summary'],\n        \t    'episode' => $Getdata['episode'],\n        \t    'duration' => $Getdata['movie_duration'],\n        \t];\n        }\n        break;\n        case 'book':\n         foreach($neelde as $k => $v){\n            $Getdata = douban_getdata($v, 'book');\n            $result[$v] = [\n        \t 'url' => $Getdata[\"url\"],\n        \t 'cover' => $Getdata['cover'],\n        \t 'title' => $Getdata['bookname'],\n        \t 'author' => $Getdata['author'],\n        \t];\n        }  \n        break;\n        case 'music':\n         foreach($neelde as $k => $v){\n            $Getdata = douban_getdata($v, 'music');\n            $result[$v] = [\n        \t 'url' => $Getdata[\"url\"],\n        \t 'cover' => $Getdata['cover'],\n        \t 'title' => $Getdata['musicname'],\n        \t 'singer' => $Getdata['singer'],\n        \t];\n        }   \n        break;\n        default:;\n        }\n        file_put_contents($cache_file, json_encode($result));\n        file_put_contents($cache_file2, $cachetypenr);\n    }\n    $results = [];\n    foreach ($result as $k=>$v){\n        if(!empty($stars[$k])){\n            $result[$k]['rating'] = $stars[$k];\n        }else{\n            $result[$k]['rating'] = 0;\n        }\n        $results[] = $result[$k];\n    }\n    return $results;\n}\nfunction douban_getdata($id,$type){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $Apikey = array('apikey'=>'0df993c66c0c636e29ecbb5344252a4a');\n    $curl = curl_init();\n    curl_setopt($curl, CURLOPT_URL, 'https://api.douban.com/v2/'.$type.'/'.$id);\n    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);\n    curl_setopt($curl, CURLOPT_TIMEOUT, 500);\n    curl_setopt($curl, CURLOPT_POST, TRUE);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);\n    curl_setopt($curl, CURLOPT_POSTFIELDS, $Apikey);\n    $data = curl_exec($curl);\n    curl_close($curl);\n    $datas = json_decode($data,true);\n    $result = [];\n    switch($type){\n    case 'book':\n$result['url'] = $datas['alt'];\n    $result['cover'] = $datas['image'];\n    $result['bookname'] = $datas['title'];\n    $result['author'] = $datas['author'][0];\n    break;\n    case 'movie':\n    $result['url'] = str_replace('/movie/', '/subject/', $datas['alt']);\n    $result['cover'] = $datas['image'];\n    $result['moviename'] = $datas['title'];\n    $result['summary'] = $datas['alt_title'];\n    $result['episode'] = !empty($datas['attrs']['episodes'])?(is_array($datas['attrs']['episodes'])?$datas['attrs']['episodes'][0]:$datas['attrs']['episodes']):1;\n    // var_dump($datas);exit;\n    $result['movie_duration'] = !empty($datas['attrs']['movie_duration'])?$datas['attrs']['movie_duration'][0]:'120';\n    break;\n    case 'music':\n$result['url'] = $datas['alt'];\n    $result['cover'] = $datas['image'];\n    $result['musicname'] = $datas['title'];\n    if(count($datas['attrs']['singer'])>1){\n    $result['singer'] = $datas['attrs']['singer'][0].'...等'.count($datas['attrs']['singer']).'位';\n    }\n    else{\n       $result['singer'] = $datas['attrs']['singer'][0];    \n    }\n    break;\n    }\n    return $result;\n}\n\nfunction bilibili_getpage(){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $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);\n    return $status['data']['total'];\n}\n\nfunction bilibili_getlist(){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $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);\n    return $status['data']['list'];\n}\n\nfunction bilibili_getdata($i){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $curl = curl_init();\n    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');\n    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);\n    curl_setopt($curl, CURLOPT_TIMEOUT, 500);\n    curl_setopt($curl, CURLOPT_POST, false);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);\n    $data = curl_exec($curl);\n    curl_close($curl);\n    $datas = json_decode($data,true);\n    return $datas;\n}\n\n\nfunction cut_str($sourcestr,$cutlength){\n$returnstr='';\n$i=0;\n$n=0;\n$str_length=strlen($sourcestr);\nwhile (($n<$cutlength) and ($i<=$str_length))\n{\n$temp_str=substr($sourcestr,$i,1);\n$ascnum=Ord($temp_str);\nif ($ascnum>=224)\n{\n$returnstr=$returnstr.substr($sourcestr,$i,3);\n$i=$i+3;\n$n++;\n}\nelseif ($ascnum>=192)\n{\n$returnstr=$returnstr.substr($sourcestr,$i,2);\n$i=$i+2;\n$n++;\n}\nelseif ($ascnum>=65 && $ascnum<=90)\n{\n$returnstr=$returnstr.substr($sourcestr,$i,1);\n$i=$i+1;\n$n++;\n}\nelse\n{\n$returnstr=$returnstr.substr($sourcestr,$i,1);\n$i=$i+1;\n$n=$n+0.5;\n}\n}\nif ($str_length>$cutlength){\n$returnstr = $returnstr.\"...\";\n}\nreturn $returnstr;\n}\n\nfunction getCommentHF($coid){\n    $parser = new HyperDown();\n    $db   = Typecho_Db::get();\n    $prow = $db->fetchRow($db->select('parent')\n        ->from('table.comments')\n        ->where('coid = ? AND status = ?', $coid, 'approved'));\n    if (isset($prow['parent'])){\n        $parent = $prow['parent'];\n        if ($parent != \"0\") {\n            $arow = $db->fetchRow($db->select('text','author','status')\n                ->from('table.comments')\n                ->where('coid = ?', $parent));\n            $text = '回复'.$arow['author'].'：'.$arow['text'];\n            $author = $arow['author'];\n            $status = $arow['status'];\n            if($author){\n                if($status=='approved'){\n                    $href   = '<div class=\"ui list\"><div class=\"item\"><i class=\"quote left icon\"></i><div class=\"content\"><div class=\"description\">'.reEmo($parser->makeHtml(cut_str($text, 30)),'reply').'</div></div> </div></div>';\n                }else if($status=='waiting'){\n                    $href   = '<div class=\"ui list\"><div class=\"item\"><i class=\"quote left icon\"></i><div class=\"content\"><div class=\"description\">评论正在审核中...</div></div> </div></div>';\n                }\n            }\n            echo $href;\n        } else {\n            echo \"\";\n        }\n    }\n}\n/**\n * 文章自定义字段\n */\n\nfunction themeFields(Typecho_Widget_Helper_Layout $layout)\n{\n    \n    $excerpt = new Typecho_Widget_Helper_Form_Element_Textarea('excerpt', null, null, '文章摘要', '输入自定义摘要。留空自动从文章截取。');\n    $layout->addItem($excerpt);\n    $seo_dec = new Typecho_Widget_Helper_Form_Element_Textarea('seo_dec', null, null, '文章SEO描述', '输入文章SEO描述。留空自动从文章截取。');\n    $layout->addItem($seo_dec);\n    $Bsoptions = new Typecho_Widget_Helper_Form_Element_Select('ArticleType', array('common_Mode' => '普通文章模式',  'pic_Mode' => '图片模式'),' common_Mode', '选择文章内容展现模式', '普通文章模式会显示所有内容，而图片模式则不显示除图片以外的其他内容。');\n    $layout->addItem($Bsoptions->multiMode());\n    \n    $cover = new Typecho_Widget_Helper_Form_Element_Text('cover', null, null, '文章封面', '输入文章封面图片直链');\n    $layout->addItem($cover);\n    if(Bsoptions('article_hotopen') == true || Bsoptions('article_hotopen') == ''){\n        $article_hotopen = '1';\n    }\n    else{\n        $article_hotopen = '2';\n    }\n     $Hot = new Typecho_Widget_Helper_Form_Element_Select('Hot', array('1' => '开启文章热度',  '2' => '关闭文章热度'), $article_hotopen, '是否开启文章热度', '若选择开启,则文章页面将显示文章热度值。');\n    $layout->addItem($Hot->multiMode());\n    if(Bsoptions('article_copyrightopen') == true){\n        $article_copyrightopen = '1';\n    }\n    else{\n        $article_copyrightopen = '2';\n    }\n    \n    $copyright = new Typecho_Widget_Helper_Form_Element_Select('copyright', array('1' => '开启版权声明',  '2' => '关闭版权声明'), $article_copyrightopen, '本文是否开启版权声明', '开启后在文章页面会显示版权声明。');\n    $layout->addItem($copyright->multiMode());\n    \n    if(Bsoptions('article_copyrightopen_type') !== ''){\n        $article_copyrightname = Bsoptions('article_copyrightopen_type');\n    }\n    else{\n        $article_copyrightname = 'one';\n    }\n    \n    $copyright_cc = new Typecho_Widget_Helper_Form_Element_Select('copyright_cc', array(\n                        'zero' => '不指定',\n                        'one' => '知识共享署名协议',\n                        'two' => '非商业性使用协议',\n                        'three' => '禁止演绎协议',\n                        'four' => '非商业性使用-禁止演绎协议',\n                        'five' => '相同方式共享协议',\n                        'six' => '非商业性使用-相同方式共享协议',\n                    ), $article_copyrightname, '知识共享协议', '当版权声明为开启状态时本项有效，请指定本文内容适用的知识共享协议');\n    $layout->addItem($copyright_cc->multiMode());\n    \n    if(Bsoptions('article_tagopen') == true){\n        $article_tagopen = '1';\n    }\n    else{\n        $article_tagopen = '2';\n    }\n    \n    $tags = new Typecho_Widget_Helper_Form_Element_Select('tags', array('1' => '开启文章标签',  '2' => '关闭文章标签'), $article_tagopen, '本文是否开启标签', '开启后在文章末尾会显示文章标签，若文章不添加标签的情况下建议关闭。');\n    $layout->addItem($tags->multiMode());\n    \n    \n    $articleplo = new Typecho_Widget_Helper_Form_Element_Select('articleplo', array('1' => '关闭文章提示',  '2' => '展现文章提示'), '1', '是否展现文章提示', '开启后阅读本篇文章时会展现文章提示');\n    $layout->addItem($articleplo->multiMode());\n    $articleplonr = new Typecho_Widget_Helper_Form_Element_Textarea('articleplonr', null, null, '文章提示内容', '文章提示功能非关闭状态时本栏有效，输入文章提示内容。留空则不显示');\n    $layout->addItem($articleplonr);\n    \n    $Overdue = new Typecho_Widget_Helper_Form_Element_Select(\n        'Overdue',\n        array(\n            'close' => '关闭',\n            '30' => '大于30天',\n            '60' => '大于60天',\n            '90' => '大于90天',\n            '120' => '大于120天',\n            '180' => '大于180天'\n        ),\n        'off',\n        '是否开启文章时效性提示',\n        '开启后如果文章在多少天内无任何修改，则显示文章时效性提示'\n    );\n    $layout->addItem($Overdue->multiMode());\n    \n}\n\n\n"
  },
  {
    "path": "core/general.php",
    "content": "<?php\nfunction posterPic($cid) {\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $db = Typecho_Db::get();\n    $md = new Markdown();\n   $post = $db->fetchRow($db->select()\n       ->from('table.contents')\n       ->where('table.contents.cid=?', $cid)\n       ->limit(1));\n                    $content = $md::convert($post['text']);\n   preg_match_all(\"/\\<img.*?src\\=\\\"(.*?)\\\"[^>]*>/i\", $content, $pic);  //通过正则式获取图片地址\n   $img_src = $pic[1][0];\n\t// 获取文章封面\n\t$cover = getCustomx($cid, 'cover');\nif($cover){\n\t    $thumb = $cover[0];\n\t}else if($img_src){\n\t\t$thumb = $img_src;\n\t}\n\telse{\n\t   $thumb = $options['Poster__AttUrl']; \n\t}\n\t\nif(!$cover && $options['Poster__AttChoose'] == true){\n\t  $thumb = $options['Poster__AttUrl'];   \n\t}\t \n\treturn $thumb;\n}\nfunction getCustomx($cid, $key){\n    $db = Typecho_Db::get();\n    $rows = $db->fetchAll($db->select('table.fields.str_value')->from('table.fields')\n        ->where('table.fields.cid = ?', $cid)\n        ->where('table.fields.name = ?', $key)\n    );\n    // 如果有多个值则存入数组\n    foreach ($rows as $row) {\n        $img = $row['str_value'];\n        if (!empty($img)) {\n            $values[] = $img;\n        }\n    }\n    return $values;\n}\n//获取Bangumi信息\nfunction getBangumi(){\n    $headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0';\nforeach( $headers as $n => $v )\n{ $headerArr[] = $n .':' . $v; }\n$curl = curl_init();\n        curl_setopt($curl, CURLOPT_URL, 'https://api.bgm.tv/v0/users/'.BsOptions('bangumi_accountid').'/collections?limit=99&offset=0');\n        curl_setopt($curl, CURLOPT_USERAGENT, $headerArr);\n        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);\n        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);\n        curl_setopt($curl, CURLOPT_HEADER, false);\n        $content = curl_exec($curl);\n        curl_close($curl);\n        return json_decode($content,true)['data'];\n}\nfunction getTitle(\\Widget\\Archive $var)\n    {\n        $var->archiveTitle(array(\n            'category'  =>  _t('分类「%s」下的文章'),\n            'search'    =>  _t('包含关键字「%s」的文章'),\n            'tag'       =>  _t('标签「%s」下的文章'),\n            'author'    =>  _t('作者「%s」的个人主页')\n        ), '', ' - ');\n        Helper::options()->title();\n    }\n\nfunction getDescription($var)\n    {\n          if($var->is('post')){\n              \n              if($var->fields->excerpt){\n              echo $var->fields->excerpt;    \n              }\n              else{\n                  \n             if(excerpt($var->excerpt,50) == ''){\n                  echo getTitle($var);    \n                  }\n                  else{\n           echo excerpt($var->excerpt,50);\n                  }\n                  \n              }\n              \n        }\nelse{\n           echo getTitle($var);\n        }\n        \n    }\n\n//获取读者墙信息\nfunction getReaders(){\n$result = Typecho_Cookie::get('readerdata');\nif($result){\n $result = json_decode($result,true);   \n}\nelse{\n\n    $db = Typecho_Db::get();      \n    $sql = $db->select('COUNT(author) AS num', 'author', 'url', 'mail')      \n              ->from('table.comments')      \n              ->where('status = ?', 'approved')      \n              ->where('type = ?', 'comment')      \n              ->where('authorId = ?', '0') \n              ->group('author')      \n              ->order('num', Typecho_Db::SORT_DESC);\n    $result = $db->fetchAll($sql);\n    Typecho_Cookie::set('readerdata',json_encode($result));\n}\n\n    return $result;\n}\n\n\n//获取标签\nfunction getTags(){\n$db = Typecho_Db::get();\n$select = $db->fetchAll($db->select()->from('table.metas')->where('type = ?', 'tag')->order('mid', Typecho_Db::SORT_DESC));\n$arr = array();\nforeach($select as $value){\n    $val = \\Typecho\\Widget::widget('Widget\\Base\\Metas')->push($value);\n$arr[] = $val;\n}\n return $arr; \n}\n\n\n//获取作者指定字段\nfunction getAuthorInfo($uid,$value){\n$db = Typecho_Db::get();\n$result = $db->fetchAll($db->select()->from('table.users')\n->where('uid = ?',$uid)\n);\nreturn $result[0][$value];\n}\n\n\nif (!function_exists('is_https')) {\n    function is_https() {\n        if(!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {\n            return true;\n        } elseif(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) {\n            return true;\n        } elseif(!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') {\n            return true;\n        }\n        return false;\n    }\n}\n\n\n//修改网址\nfunction editurl($url){\n$options = Helper::options();\nif (strpos($options->siteUrl, \"https://\") !== false) {\n    echo str_replace('http://','https://',$url);\n} else {\n    echo $url;\n}\n}\n//通过分类mid获取到分类名字\nfunction getCategoryName($category) {\n$db = Typecho_Db::get();\n$prefix = $db->getPrefix();\n$rs = $db->fetchRow($db->select()->from($prefix.'metas')->where('mid = ?', $category)->limit(1));\nreturn $rs['name'];\n}\n//输出日期和周几\nfunction monweek(){\n    $arr = array(\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\");\n     echo date(' Y年m月d日',time()). \" 星期\".$arr[date(\"w\")];   \n}\n// 获取所有分类和分类文章数量\nfunction getPostAndNum(){\n    $db = Typecho_Db::get();     \n    $a = array();\n    $result = $db->fetchAll($db->select()\n    ->from('table.metas')\n            ->where('table.metas.type = ?', 'category'));\n            foreach($result as $post){\n                $a[] = array(\n                    'value'=>$post['count'],\n                    'name'=>$post['name'],\n                    );\n            }\nreturn json_encode($a);\n\n}\n\n// 获取所有标签和标签文章数量\nfunction getTagAndNum($type){\n    $db = Typecho_Db::get();     \n    $arr = array();\n    $result = $db->fetchAll($db->select()\n    ->from('table.metas')\n            ->where('table.metas.type = ?', 'tag')\n            ->where('table.metas.count != ?', 0)\n            ->limit(5)\n            );\n            if($type == 'name'){\n            foreach($result as $tag){\n                $arr[] = $tag['name'];\n            }\n            }\n             elseif($type == 'num'){\n            foreach($result as $tag){\n                $arr[] = $tag['count'];\n            }\n            }\nreturn json_encode($arr);\n\n}\n\n//获取随机文章\nfunction getArchived(){\n    $db = Typecho_Db::get();      \n    $result = $db->fetchAll($db->select()\n    ->from('table.contents')\n            ->where('table.contents.status = ?', 'publish')\n            ->where('table.contents.created < ?', Helper::options()->time)\n            ->where('table.contents.type = ?', 'post')\n            ->order('table.contents.created', Typecho_Db::SORT_DESC));\nreturn $result;\n}\n//获取随机文章\nfunction getRandomPosts($cid = 0){\n$db = \\Typecho\\Db::get();\n$adapter = $db->getAdapterName();\nif (\"Pdo_SQLite\" === $adapter || \"SQLite\" === $adapter || \"pgsql\" === $adapter || \"Pdo_Pgsql\" === $adapter) {\n $result = $db->fetchAll($db->select()->from('table.contents')\n->where('status = ?','publish')\n->where('type = ?', 'post')\n->where('cid != ?', $cid)\n->where('created < ?', Helper::options()->time)\n->limit(6)\n->order('RANDOM()')\n);   \n}\nelse{\n$result = $db->fetchAll($db->select()->from('table.contents')\n->where('status = ?','publish')\n->where('type = ?', 'post')\n->where('cid != ?', $cid)\n->where('created < ?', Helper::options()->time)\n->limit(6)\n->order('RAND()')\n);\n}\n\nif($result){\n   $i = 1;\nforeach($result as $val){\n\n$val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);\nif(!$val['hidden']){\n$post_title = htmlspecialchars($val['title']);\n$permalink = $val['permalink'];\n$date = date('Y年m月d日',$val['created']);\n$md = new Markdown();\n$targetSummary = excerpt($md::convert($val['text']), 10);\n$expert = getCustomFields($val['cid'], 'excerpt');\n                if($expert){\n                    $targetSummary = $expert[0];\n                }\n$targetSummary = trim( strip_tags($targetSummary));\n\t\t$targetSummary = preg_replace('/\\\\s+/',' ',$targetSummary);\n\t\t\tif(!$targetSummary){\n\t\t\t    $targetSummary = '本篇文章暂无摘要~';\n\t\t\t}\nif(strpos($targetSummary, '{bs-hide') !== false || strpos($targetSummary, '[bs-hide') !== false || strpos($targetSummary, '[bshide') !== false || strpos($targetSummary, '[bslogin') !== false){\n      $targetSummary = '文章包含隐藏内容，请进入文章内页查看~';\n      }\n    \necho '\n<div class=\"barticle-item\">\n      <a href=\"'.$permalink.'\" class=\"barticle-link\">\n        <h4 class=\"barticle-title\">'.$post_title.'</h4>\n      </a>\n      <div class=\"barticle-excerpt\">\n        '.$targetSummary.'\n      </div>\n      <div class=\"barticle-meta\">\n        <span class=\"bmeta-item\"><i class=\"fas fa-calendar-alt\"></i> '.$date.'</span>\n      </div>\n    </div>';\n}\n$i++;\n}\n\n}\n}\n\n//获取文章标签\nfunction tags($widget, $split = '', $default = NULL)\n{\n\n    if ($widget->tags) {\n \n        $result = array();\n        $result[] = '<div class=\"ui labels\">';\n        foreach ($widget->tags as $tag) {\n        $result[] .= '<a class=\"ui label\" href=\"'.$tag['permalink'].'\">#'.$tag['name'].'</a>';\n        }\n $result[] .= '</div>';\n        echo implode($split,$result);\n    } else {\n        echo $default;\n    }\n}\n\n\n//获取分类ID\nfunction categeid($slug){\n   $db = Typecho_Db::get();\n   $postnum=$db->fetchRow($db->select()->from ('table.metas')->where ('slug=?',$slug)->where('type=?', 'category'));\n   return $postnum['mid']; \n}\n//Md5加密\nfunction md5Encode($data){\n    return md5(\"bearsimplev2!@#$%^&*()-=+@#$%$\".$data.\"bearsimplev2!@#$%^&*()-=+@#$%$\");\n}\n\nfunction seacharr_by_value($array, $index, $value){\n    $newarray = array();\n    if(is_array($array) && count($array)>0) {\n        foreach(array_keys($array) as $key){\n            $temp[$key] = $array[$key][$index];\n            if ($temp[$key] == $value){\n                $newarray[$key] = $array[$key];\n            }\n        }\n    }\n    return $newarray;\n}\n function getDiyLinkToArray($data){\n    $res = array();\nforeach($data as $k=>$v){\n    $res[]= array(\n        'url' => $v[1],\n        'key'=>$v[0]\n        );\n        \n}\nreturn $res;\n }\n//获取自定义内链\nfunction getDiyLink($key){\n    $options = bsOptions::getInstance()::get_option('bearsimple');\n    $data = parseMultilineData(BsOptions('goLinkList'),2);\n    $result = seacharr_by_value(getDiyLinkToArray($data),'key',$key);\n    $res = array();\nforeach($result as $k=>$v){\n   foreach ($v as $key=>$value) {\n      $res[$key] = $value;\n   }\n}\n    return $res;\n}\n\n//分类密码\nfunction CategoryEncrypt($id){\n    $options = bsOptions::getInstance()::get_option('bearsimple');\n    $data = BsOptions('Cate_Encrypt');\n    $result = seacharr_by_value($data,'Cate_Encrypt_Id',$id);\n    $res = array();\nif($result){\nforeach($result as $k=>$v){\n   foreach ($v as $key=>$value) {\n      $res[$key] = $value;\n   }\n}\n}\n    return $res;\n}\n\n\n//分类相册\nfunction CategoryAlbum($id){\n    $options = bsOptions::getInstance()::get_option('bearsimple');\n    $data = BsOptions('Cate_Album');\n    $result = seacharr_by_value($data,'Cate_Album_Id',$id);\n    $res = array();\nforeach($result as $k=>$v){\n   foreach ($v as $key=>$value) {\n      $res[$key] = $value;\n   }\n}\n    return $res;\n}\n\n\n//统计全站字数\nfunction allOfCharacters() {\n    $Characters = Typecho_Cookie::get('site_Characters');\n    if(!$Characters){\n    $chars = 0;\n    $db = Typecho_Db::get();\n    $select = $db ->select('text')->from('table.contents');\n    $rows = $db->fetchAll($select);\n    foreach ($rows as $row) { $chars += mb_strlen(trim($row['text']), 'UTF-8'); }\n    $unit = '';\n    if($chars >= 10000)     { $chars /= 10000; $unit = '万'; } \n    else if($chars >= 1000) { $chars /= 1000;  $unit = '千'; }\n    $out = sprintf('%.2lf %s',$chars, $unit);\n    Typecho_Cookie::set('site_Characters',$out);\n    $Characters = $out;\n    }\n \n    return $Characters;\n}\n\nfunction historyToday($created)\n{\n    $date = date('m/d', $created);\n    $date_m = date('m月', $created);\n    $date_d = date('d日', $created);\n    $time = time();\n    $db = Typecho_Db::get();\n    $prefix = $db->getPrefix();\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    if(empty($options['history_Today_Limit'])){\n        $limit = 5;\n    }\n    else{\n        $limit = $options['history_Today_Limit'];\n    }\n    \n     $adapter = $db->getAdapterName();\n     if (\"Pdo_SQLite\" === $adapter || \"SQLite\" === $adapter) {\n    $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;\n     }\n     if (\"pgsql\" === $adapter || \"Pdo_Pgsql\" === $adapter) {\n    $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;\n     }\n     if (\"Pdo_Mysql\" === $adapter || \"Mysql\" === $adapter || \"Mysqli\" === $adapter) {\n          $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;\n     }\n    $result = $db->query($sql);\n    $historyTodaylist = [];\n    if ($result instanceof Traversable) {\n            foreach ($result as $item) {\n                $item = Typecho_Widget::widget('Widget_Abstract_Contents')->push($item);\n                $title = htmlspecialchars($item['title']);\n            $permalink = $item['permalink'];\n            $date = date('Y年m月d日',$created);\n            $historydate = date('Y年m月d日',$item['created']);\n                $historyTodaylist[] = array(\n                    \"title\" => $title,\n                    \"permalink\" => $permalink,\n                    \"date\" => $historydate\n                );\n    }\n    }\n  if (count($historyTodaylist) > 0){\n      echo \"<div class='bs-today'>\n    <fieldset>\n        <legend><h5>那年今日</h5></legend>\n        <div class='today-date'><div class='today-m'>{$date_m}</div><div class='today-d'>{$date_d}</div></div><ul>\n        \";\n        foreach ($historyTodaylist as $item){\n            echo \"<li><span>{$item['date']}</span><a href='{$item['permalink']}' title='{$item['title']}' target='_blank'>{$item['title']}</a></li>\";\n        }\n        echo \"</ul></fieldset></div>\";\n  }\n}\n\n\n\n\nfunction ishttps()\n{\n    if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {\n        return true;\n    } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {\n        return true;\n    } elseif (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') {\n        return true;\n    }\n    return false;\n}\n\n\nfunction imgtobase64($img='', $imgHtmlCode=true){\n    $imageInfo = getimagesize($img);\n    $base64 = \"\" . chunk_split(base64_encode(file_get_contents($img)));\n    return 'data:' . $imageInfo['mime'] . ';base64,' . chunk_split(base64_encode(file_get_contents($img)));\n}\n\nfunction CommentAuthor($obj, $autoLink = NULL, $noFollow = NULL) {\n    $options = Helper::options();\n    $autoLink = $autoLink ? $autoLink : $options->commentsShowUrl;\n    $noFollow = $noFollow ? $noFollow : $options->commentsUrlNofollow;\n    if ($obj->url && $autoLink) {\n        echo '<a href=\"'.$obj->url.'\"'.($noFollow ? ' rel=\"external nofollow\"' : NULL).(strstr($obj->url, $options->index) == $obj->url ? NULL : ' target=\"_blank\"').'>'.$obj->author.'</a>';\n    } else {\n        echo $obj->author;\n    }\n}\n\nfunction categorynum($id){\n$db = Typecho_Db::get();\n$num=$db->fetchRow($db->select()->from('table.metas')\n        ->where('mid = ?',$id));\nreturn $num['count'];\n}\n\nfunction categoryid($slug){  //获取栏目id\n   $db = Typecho_Db::get();\n   $postnum=$db->fetchRow($db->select()->from ('table.metas')->where ('slug=?',$slug)->where('type=?', 'category'));\n   return  $postnum['mid']; \n}\n\n//截断文字\nfunction cutexpert($string, $length='20', $dot = '…') {\n    $_lenth = mb_strlen($string, \"utf-8\");\n    $text_str = preg_replace(array(\"/<pre><code.*?>/si\",\"/<img.*?>/si\"),\"\",$string);\n    $text_lenth = mb_strlen($text_str, \"utf-8\") - 1;\n    if($text_lenth <= $length) {\n        return strip_tags(stripcslashes($text_str));\n    }\n    else{\n        $res = mb_substr($text_str, 0, $length, 'UTF-8');\n        return strip_tags(stripcslashes($res)).$dot;\n    }\n}\n\n//截断文本，主要用于侧边栏最新评论，保留img标签\nfunction bearcutword($string, $length='20', $dot = '…') {\n    $_lenth = mb_strlen($string, \"utf-8\");\n    $text_str = preg_replace(\"/<img.*?>/si\",\"\",$string);\n    $text_lenth = mb_strlen($text_str, \"utf-8\") - 1;\n     \n    if($text_lenth <= $length) {\n        return stripcslashes($string);\n    }\n     \n    if(strpos($string, '<img') === false){\n        $res = mb_substr($string, 0, $length, 'UTF-8');\n        return stripcslashes($res).$dot;\n    }\n \n    $html_start = ceil(strpos($string, '<img') / 3);\n    $html_end = ceil(strpos($string, '/>') / 3);\n     \n    if($length < $html_start) {\n        $res = mb_substr($string, 0, $length, 'UTF-8');\n        return stripcslashes($res).$dot;\n    }\n     \n    if($length > $html_start) {\n         \n        $res_html = mb_substr($text_str, 0, $length-1, 'UTF-8');\n         \n        preg_match('/<img[^>]*\\>/',$string,$result_html);\n        $before = mb_substr($res_html, 0, $html_start, 'UTF-8');\n        $after = mb_substr($res_html, $html_start, mb_strlen($res_html, \"utf-8\"), 'UTF-8');\n        $res = $before.$result_html[0].$after;\n        return stripcslashes($res).$dot;\n    }\n     \n}\n\nfunction strFilter($str){\n    $str = str_replace('`', '', $str);\n    $str = str_replace('·', '', $str);\n    $str = str_replace('~', '', $str);\n    $str = str_replace('!', '', $str);\n    $str = str_replace('！', '', $str);\n    $str = str_replace('@', '', $str);\n    $str = str_replace('#', '', $str);\n    $str = str_replace('$', '', $str);\n    $str = str_replace('￥', '', $str);\n    $str = str_replace('%', '', $str);\n    $str = str_replace('^', '', $str);\n    $str = str_replace('……', '', $str);\n    $str = str_replace('&', '', $str);\n    $str = str_replace('*', '', $str);\n    $str = str_replace('(', '', $str);\n    $str = str_replace(')', '', $str);\n    $str = str_replace('（', '', $str);\n    $str = str_replace('）', '', $str);\n    $str = str_replace('-', '', $str);\n    $str = str_replace('_', '', $str);\n    $str = str_replace('——', '', $str);\n    $str = str_replace('+', '', $str);\n    $str = str_replace('=', '', $str);\n    $str = str_replace('|', '', $str);\n    $str = str_replace('\\\\', '', $str);\n    $str = str_replace('[', '', $str);\n    $str = str_replace(']', '', $str);\n    $str = str_replace('【', '', $str);\n    $str = str_replace('】', '', $str);\n    $str = str_replace('{', '', $str);\n    $str = str_replace('}', '', $str);\n    $str = str_replace(';', '', $str);\n    $str = str_replace('；', '', $str);\n    $str = str_replace(':', '', $str);\n    $str = str_replace('：', '', $str);\n    $str = str_replace('\\'', '', $str);\n    $str = str_replace('\"', '', $str);\n    $str = str_replace('“', '', $str);\n    $str = str_replace('”', '', $str);\n    $str = str_replace(',', '', $str);\n    $str = str_replace('，', '', $str);\n    $str = str_replace('<', '', $str);\n    $str = str_replace('>', '', $str);\n    $str = str_replace('《', '', $str);\n    $str = str_replace('》', '', $str);\n    $str = str_replace('.', '', $str);\n    $str = str_replace('。', '', $str);\n    $str = str_replace('/', '', $str);\n    $str = str_replace('、', '', $str);\n    $str = str_replace('?', '', $str);\n    $str = str_replace('？', '', $str);\n    return trim($str);\n}\n\nfunction strtitle(){\n    $title = bsOptions::getInstance()::get_option( 'bearsimple' )->title;\n    $title = strFilter($title);\n    return $title;\n}\n\nfunction readModeContent($th,$content){\n $author = $th->author->screenName;\n$date = date(\"Y年 m月 d 日\",$th->date->timeStamp);\n$title = $th->title;\n$avatar = imgravatarq($th->author->mail);\n            return <<<EOF\n<div class=\"reading-mode-overlay bg-light\" id=\"reading-mode-overlay\">\n  <div class=\"reading-mode-content\">\n    <!-- 关闭阅读模式按钮 -->\n    <button class=\"action-btn exit-reading-mode-btn\" id=\"exit-reading-mode\">\n      <i class=\"fas fa-times\"></i> 关闭阅读模式\n    </button>\n\n    <!-- 文章标题 -->\n    <h1 class=\"reading-article-title\">{$title}</h1>\n\n    <!-- 文章元信息 -->\n    <div class=\"article-meta\">\n      <span class=\"meta-item\"><i class=\"fas fa-user\"></i> {$author}</span>\n      <span class=\"meta-item\"><i class=\"fas fa-calendar-alt\"></i> {$date}</span>\n    </div>\n\n    <!-- 阅读设置按钮 -->\n    <button class=\"action-btn reading-settings-btn\" id=\"toggle-settings-panel\">\n      <i class=\"fas fa-cog\"></i> 阅读选项\n    </button>\n\n    <!-- 阅读模式设置面板 -->\n    <div class=\"reading-mode-panel\" id=\"settings-panel\">\n      <h3>阅读选项</h3>\n      <div class=\"options\">\n        <button id=\"bg-light\"><i class=\"fas fa-sun\"></i> 浅色背景</button>\n        <button id=\"bg-sepia\"><i class=\"fas fa-book\"></i> 护眼模式</button>\n        <button id=\"bg-dark\"><i class=\"fas fa-moon\"></i> 深色模式</button>\n        <div style=\"height: 10px;\"></div>\n        <button id=\"text-small\"><i class=\"fas fa-text-height\"></i> 小字体</button>\n        <button id=\"text-medium\"><i class=\"fas fa-text-height\"></i> 中字体</button>\n        <button id=\"text-large\"><i class=\"fas fa-text-height\"></i> 大字体</button>\n      </div>\n    </div>\n\n    <!-- 文章内容 -->\n    <div class=\"reading-mode\" id=\"reading-mode\">\n      <a id=\"bs_toc_begin2\"></a>   \n                <div id=\"bs_toc_body2\">\n{$content}\n</div>\n    </div>\n  </div>\n</div>\n\nEOF;\n}\nfunction agreeNum($cid) {\n    $db = Typecho_Db::get();\n    $prefix = $db->getPrefix();\n    $adapter = $db->getAdapterName();\n    if (!array_key_exists('agree', $db->fetchRow($db->select()->from('table.contents')))) {\n         if(\"pgsql\" === $adapter || \"Pdo_Pgsql\" === $adapter){\n        $db->query('ALTER TABLE ' . $prefix . 'contents ADD agree TEXT NOT NULL DEFAULT 0;');\n         }\n         else{\n        $db->query('ALTER TABLE `' . $prefix . 'contents` ADD `agree` INT(10) NOT NULL DEFAULT 0;');     \n         }\n    }\n    $agree = $db->fetchRow($db->select('table.contents.agree')->from('table.contents')->where('cid = ?', $cid));\n    \n    return array(\n        'agree' => $agree['agree'],\n        );\n}\n\nfunction agree($cid) {\n    $db = Typecho_Db::get();\n    $agree = $db->fetchRow($db->select('table.contents.agree')->from('table.contents')->where('cid = ?', $cid));\n    \n    $db->query($db->update('table.contents')->rows(array('agree' => (int)$agree['agree'] + 1))->where('cid = ?', $cid));\n    $agree = $db->fetchRow($db->select('table.contents.agree')->from('table.contents')->where('cid = ?', $cid));\n    return $agree['agree'];\n}\n\nfunction agreeNumforcomment($coid) {\n    $db = Typecho_Db::get();\n    $prefix = $db->getPrefix();\n    $adapter = $db->getAdapterName();\n    if (!array_key_exists('agree', $db->fetchRow($db->select()->from('table.comments')))) {\n        if(\"pgsql\" === $adapter || \"Pdo_Pgsql\" === $adapter){\n        $db->query('ALTER TABLE ' . $prefix . 'comments ADD agree INT(10) NOT NULL DEFAULT 0;');\n         }\n         else{\n        $db->query('ALTER TABLE `' . $prefix . 'comments` ADD `agree` INT(10) NOT NULL DEFAULT 0;');     \n         }\n    }\n    $agree = $db->fetchRow($db->select('table.comments.agree')->from('table.comments')->where('coid = ?', $coid));\n    \n    return array(\n        'agree' => $agree['agree'],\n        );\n}\n\nfunction agreeforcomment($coid) {\n    $db = Typecho_Db::get();\n    $agree = $db->fetchRow($db->select('table.comments.agree')->from('table.comments')->where('coid = ?', $coid));\n    \n    $db->query($db->update('table.comments')->rows(array('agree' => (int)$agree['agree'] + 1))->where('coid = ?', $coid));\n    $agree = $db->fetchRow($db->select('table.comments.agree')->from('table.comments')->where('coid = ?', $coid));\n    return $agree['agree'];\n}\n\nfunction theAllViews()\n        {\n            $db = Typecho_Db::get();\n            $prefix = $db->getPrefix();\n            $row = $db->fetchAll('SELECT SUM(VIEWS) FROM `' . $prefix . 'contents`');\n                echo number_format($row[0]['SUM(VIEWS)']);\n        }\n\n\n//输出样式\nfunction bs_style(){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    echo '\n    <style>\n    #bearnavbar {\n    margin-top:15px;\n  --sm-navbar-z-index: 100;\n  border-radius:8px;\n  \n  --sm-navbar-sticky-top-offset: 0;\n}\n.sm-nav-link,\n      .sm-sub-link{\n          background:none!important;\n      }\n      .sm-nav-link:hover,\n      .sm-nav-link:active,\n      .sm-nav-link.sm-expanded,\n      .sm-sub-link:hover,\n      .sm-sub-link:active,\n      .sm-sub-link.sm-expanded{\n          color:#EF711D!important;\n      }\n      .sm-nav-link--split.sm-sub-toggler::after,.sm-sub-link--split.sm-sub-toggler::after{\n          color:gray;\n      }\n    a{color:#000000;}';\n    if($options['width_Selection'] == '2'){\n      echo '\n@media only screen and (min-width: 1500px) {\n          .body_container {\n\tmax-width:100%;\n}';\n\nif($options['Article_forma'] == \"5\"){\n    echo '\n.blog-card{\n    max-width:100%;\n}\n';\n}\necho '\n}\n';\n    \n    }\n    if($options['article_textindent'] == true){\n    echo '.post-content p,\n.reading-mode p{\n  text-indent: 2em;\n}\n.post-content p a,\n.reading-mode p a{\n  text-indent: 0;\n}';\n    }\n  if($options['Popup'] == 1){\n     if($options['PopupColor']){ \n      echo '.announcement-wrap{\n          background:'.$options['PopupColor'].'!important;\n      }';\n     }\n     if($options['PopupBorderColor']){ \n      echo '.announcement-wrap{\n          border:1px solid '.$options['PopupBorderColor'].'!important;\n      }';\n     }\n     if($options['PopupContentColor']){ \n      echo '.announcement-content{color:'.$options['PopupContentColor'].'!important}';\n     }\n     if($options['PopupTitleColor']){ \n      echo '.announcement-title{color:'.$options['PopupTitleColor'].'!important;}';\n     }\n     if($options['PopupButtonColor']){ \n      echo '.announcement-button>div{background:center center no-repeat '.$options['PopupButtonColor'].'!important}';\n     }\n     if($options['PopupZdHoverColor']){ \n      echo '.announcement-button>div.announcement-toggle:hover{background-color:'.$options['PopupZdHoverColor'].'!important}';\n     }\n     if($options['PopupCloseHoverColor']){ \n      echo '.announcement-button>div.announcement-close:hover{background-color:'.$options['PopupCloseHoverColor'].'!important}';\n     }\n  }\n    echo '\n    .swal2-container{\n        z-index:1000000;\n    }\n    .bearmargin{\n        margin:auto!important;\n    }\n    .bearslider-wrapper{\n          border-radius:8px;\n      }\n      .bearslider-wrapper img{\n          border-radius:8px;\n      }\n      .bearslider-caption{\n         border-radius:8px; \n      }\n.mjx-chtml{\n        white-space: normal!important;\n    }\n    .button > .hidden{\n        display:block !important;\n    }\n  \n    .body_container{\n     background-color:rgba(255,255,255,0.9);   \n    ';\n    if($options['global_transparent'] == '1'){\n     echo 'opacity: 0.9;\n     transition: opacity .5s;';   \n    }\n    if($options['global_shadow'] == '1'){\n     echo 'box-shadow: 0 0 20px 6px rgba(0,0,0,.12),0 0 20px 6px rgba(0,0,0,.12)';   \n    }\n    echo '}\n    \n    ';\n    if ($options['Mournmode'] == \"1\"){\n        echo '\n        .gray {\n  filter: grayscale(1);\n}\n.gray {\n  -webkit-filter: grayscale(1);\n  filter: grayscale(1);\n  filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);\n}\n        ';\n    }\n  \n    if(Bsoptions('Top') == true){\n        echo'\n        .goTop >svg{\n            width: 50px;\n            height: 50px;\n            cursor: pointer;\n        }\n        .goTop >img{\n            width: 50px;\n            height: 50px;\n            cursor: pointer;\n        }\n        .goTop{\n            position: fixed;\n            right : 20px;\n            ';if(Bsoptions('Darkmode') == true){echo'bottom : 70px;';}else{echo'bottom : 20px;';}\n            echo'\n            z-index:50;\n        }\n        ';\n    }\n\n     if(!empty($options['BackGround'])){\n        echo'\n        body::before{\n        content: \"\";\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: -999;\n            background-image: url('.$options['BackGround'].')!important;\n            background-position: center center;\n            background-repeat: no-repeat;\n            background-attachment:fixed;\n            background-size:100% 100%;\n            -webkit-background-size: cover;\n            -o-background-size: cover;\n        }\n        [data-theme=dark] body::before{\n          filter:invert(1) hue-rotate(180deg);\n        }\n        ';\n    }\n    if(!empty($options['Diyfont'])){\n        echo'\n@font-face {\n          font-family: CustomFont;\n          src: url(\"'.$options['Diyfont'].'\");\n        }\n     *:not(i){\n          font-family: CustomFont !important;\n        }\n        ';\n    }\n \n\necho '\n    </style>';\n}\n\n//黑暗模式\nfunction darkmode(){\n    echo '\n    <div class=\"darkmode\">\n    <img class=\"sun hide\" src=\"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUxMiA1MTI7IiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTEycHgiIGhlaWdodD0iNTEycHgiPgo8cGF0aCBzdHlsZT0iZmlsbDojRkZBNjAwOyIgZD0iTTUwNy44MzQsMzAxLjYwOGwtNTQuNzY5LTQ4LjMxMmw1Mi44MzItNTAuMzk5YzEuOTQxLTEuODUyLDIuNzQtNC41OTEsMi4wOTktNy4xODkgIGMtMC42NDItMi41OTctMi42MjktNC42NTUtNS4yMTEtNS40MDFsLTcwLjMxNi0yMC4yOTJsMjUuOTg4LTY4LjA1NmMwLjk1NS0yLjUsMC40OTUtNS4zMTYtMS4yMDQtNy4zODkgIGMtMS43LTIuMDcyLTQuMzgzLTMuMDg1LTcuMDM4LTIuNjU3bC03Mi4yNzQsMTEuNjUybC01Ljg3OC03Mi41NjFjLTAuMjE2LTIuNjY2LTEuODQ2LTUuMDE1LTQuMjc1LTYuMTYxICBjLTIuNDI5LTEuMTQ2LTUuMjkxLTAuOTE3LTcuNTA0LDAuNjAxbC02MC4yNjYsNDEuMzQyTDI2My40MDksMy43NDJDMjYyLjA2NCwxLjQyNiwyNTkuNTc5LDAsMjU2Ljg4OSwwICBjLTIuNjksMC01LjE3NCwxLjQyNi02LjUxOSwzLjc0MkwyMDguMzQ3LDc2LjExbC03Mi42OS00MS45NTNjLTIuMzI3LTEuMzQzLTUuMTk3LTEuMzQ5LTcuNTI4LTAuMDE4ICBjLTIuMzMzLDEuMzMxLTMuNzczLDMuNzk5LTMuNzgsNi40NzNsLTAuMTc2LDcyLjc5NWwtNzIuOTY1LTYuMDE0Yy0yLjY3NS0wLjIyLTUuMjc1LDAuOTk3LTYuODA3LDMuMTk0ICBjLTEuNTMzLDIuMTk3LTEuNzcxLDUuMDQxLTAuNjIyLDcuNDU5bDMxLjI0Miw2NS44MzVMNi41MDgsMjA5LjU2MmMtMi41MTYsMC45NDMtNC4zMzUsMy4xNS00Ljc3Myw1Ljc4OSAgYy0wLjQzOCwyLjYzOCwwLjU3NSw1LjMwOCwyLjY1Niw3LjAwM2w1Ni42MTksNDYuMTUybC01MC44MTMsNTIuNDFjLTEuODY2LDEuOTI1LTIuNTU5LDQuNjk0LTEuODE2LDcuMjY0ICBjMC43NDQsMi41NywyLjgxLDQuNTUsNS40MTksNS4xOTRsNzEuMDU1LDE3LjU1MUw2MS41Niw0MTkuOTM2Yy0wLjg1NiwyLjUzNS0wLjI4Niw1LjMzMSwxLjQ5NCw3LjMzNiAgYzEuNzgxLDIuMDA1LDQuNTAyLDIuOTEzLDcuMTM3LDIuMzgybDcxLjc2LTE0LjQ0M2w4LjcyMSw3Mi4yNzhjMC4zMTksMi42NTUsMi4wNDEsNC45MzgsNC41MTMsNS45OSAgYzIuNDc0LDEuMDUyLDUuMzIzLDAuNzEyLDcuNDc1LTAuODkxbDU4LjU5Ni00My42NDdsMzkuMDU1LDU5LjU2NmMxLjM4MiwyLjE3OSwzLjc4OSwzLjQ5Miw2LjM2NywzLjQ5MiAgYzAuMDk4LDAsMC4xOTYtMC4wMDIsMC4yOTUtMC4wMDZjMi42ODctMC4xMDQsNS4xMTUtMS42MjYsNi4zNjgtMy45OTJsMzQuMTA3LTYyLjQwNWw2MS44MzksMzguOTc0ICBjMi4yNzMsMS40MzIsNS4xMzcsMS41NSw3LjUyMiwwLjMxYzIuMzgyLTEuMjQsMy45MTktMy42NSw0LjAzLTYuMzIybDMuMDMxLTcyLjczNGw3Mi42NzQsOC44NGMyLjY2NCwwLjMyNCw1LjMxLTAuNzkxLDYuOTI4LTIuOTI3ICBjMS42MTgtMi4xMzcsMS45NjYtNC45NjksMC45MTQtNy40M2wtMjguNjM2LTY2Ljk5N2w2OS40NjUtMjMuMDAzYzIuNTUyLTAuODQ1LDQuNDU2LTIuOTc5LDQuOTk3LTUuNTk5ICBDNTEwLjc1MiwzMDYuMDksNTA5Ljg0NSwzMDMuMzgzLDUwNy44MzQsMzAxLjYwOHoiLz4KPGVsbGlwc2Ugc3R5bGU9ImZpbGw6I0ZGREIyRDsiIGN4PSIyNTQuMzUiIGN5PSIyNTQuNjkxIiByeD0iMTU1LjA2OSIgcnk9IjE1NC45NDkiLz4KPHBhdGggc3R5bGU9ImZpbGw6I0ZGQ0EwMDsiIGQ9Ik0yNTQuMzU0LDk5Ljc0M2MtMy44ODQsMC03LjczMiwwLjE0Ny0xMS41NDMsMC40MjhjODAuMjUsNS45MDEsMTQzLjUyNSw3Mi44MjUsMTQzLjUyNSwxNTQuNTIxICBjMCw4MS42OTUtNjMuMjc1LDE0OC42MTktMTQzLjUyNSwxNTQuNTIxYzMuODExLDAuMjgsNy42NiwwLjQyOCwxMS41NDMsMC40MjhjODUuNjQxLDAsMTU1LjA2OC02OS4zNzMsMTU1LjA2OC0xNTQuOTQ4ICBDNDA5LjQyMiwxNjkuMTE2LDMzOS45OTUsOTkuNzQzLDI1NC4zNTQsOTkuNzQzeiIvPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K\" />\n    <img class=\"moon\" src=\"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ5OS43MTIgNDk5LjcxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDk5LjcxMiA0OTkuNzEyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjUxMnB4IiBoZWlnaHQ9IjUxMnB4Ij4KPHBhdGggc3R5bGU9ImZpbGw6I0ZGRDkzQjsiIGQ9Ik0xNDYuODgsMzc1LjUyOGMxMjYuMjcyLDAsMjI4LjYyNC0xMDIuMzY4LDIyOC42MjQtMjI4LjY0YzAtNTUuOTUyLTIwLjE2LTEwNy4xMzYtNTMuNTItMTQ2Ljg4ICBDNDI1LjA1NiwzMy4wOTYsNDk5LjY5NiwxMjkuNjQsNDk5LjY5NiwyNDMuNzA0YzAsMTQxLjM5Mi0xMTQuNjA4LDI1Ni0yNTYsMjU2Yy0xMTQuMDY0LDAtMjEwLjYwOC03NC42NC0yNDMuNjk2LTE3Ny43MTIgIEMzOS43NDQsMzU1LjM2OCw5MC45NDQsMzc1LjUyOCwxNDYuODgsMzc1LjUyOHoiLz4KPHBhdGggc3R5bGU9ImZpbGw6I0Y0QzUzNDsiIGQ9Ik00MDEuOTIsNDIuNzc2YzM0LjI0LDQzLjUwNCw1NC44MTYsOTguMjcyLDU0LjgxNiwxNTcuOTUyYzAsMTQxLjM5Mi0xMTQuNjA4LDI1Ni0yNTYsMjU2ICBjLTU5LjY4LDAtMTE0LjQ0OC0yMC41NzYtMTU3Ljk1Mi01NC44MTZjNDYuODQ4LDU5LjQ3MiwxMTkuMzQ0LDk3Ljc5MiwyMDAuOTI4LDk3Ljc5MmMxNDEuMzkyLDAsMjU2LTExNC42MDgsMjU2LTI1NiAgQzQ5OS43MTIsMTYyLjEyLDQ2MS4zOTIsODkuNjQsNDAxLjkyLDQyLjc3NnoiLz4KPGc+Cgk8cG9seWdvbiBzdHlsZT0iZmlsbDojRkZEODNCOyIgcG9pbnRzPSIxMjguMTI4LDk5Ljk0NCAxNTQuNDk2LDE1My40IDIxMy40NzIsMTYxLjk2IDE3MC44LDIwMy41NiAxODAuODY0LDI2Mi4yOTYgICAgMTI4LjEyOCwyMzQuNTY4IDc1LjM3NiwyNjIuMjk2IDg1LjQ0LDIwMy41NiA0Mi43NjgsMTYxLjk2IDEwMS43NDQsMTUzLjQgICIvPgoJPHBvbHlnb24gc3R5bGU9ImZpbGw6I0ZGRDgzQjsiIHBvaW50cz0iMjc2Ljg2NCw4Mi44NCAyOTAuNTI4LDExMC41NTIgMzIxLjEwNCwxMTQuOTg0IDI5OC45NzYsMTM2LjU1MiAzMDQuMjA4LDE2Ni45ODQgICAgMjc2Ljg2NCwxNTIuNjE2IDI0OS41MiwxNjYuOTg0IDI1NC43NTIsMTM2LjU1MiAyMzIuNjI0LDExNC45ODQgMjYzLjIsMTEwLjU1MiAgIi8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg==\" />\n  </div>\n    ';\n}\n//文章组件输出\nfunction article_module_output($thi) {\n    $options = bsOptions::getInstance()::get_option('bearsimple');\n    $agree = $thi->hidden ? array('agree' => 0, 'recording' => true) : agreeNum($thi->cid);\n    \n    if ($options['Share'] || $options['RewardOpen'] || $options['Like']) {\n        echo '\n        <div id=\"dialog-content\" style=\"display:none;max-width:500px;\">\n            <h2 class=\"text-center\" style=\"color:#000\">微信分享二维码</h2>\n            <p>\n                <canvas id=\"wechatQrcode\"></canvas>\n            </p>\n        </div>';\n        \n        echo '<div class=\"bstbutton_container\">';\n        if ($options['Like'] == true) {\n            echo '\n            <div class=\"bstbutton_button bstbutton_thumbsup\" id=\"agree-btn\" data-cid=\"'.$thi->cid.'\">\n                <i class=\"fas fa-thumbs-up\"></i> 赞 (<b class=\"agreenum\">'.$agree['agree'].'</b>)\n            </div>';\n        }\n        if ($options['Share'] == true) {\n            echo '\n            <div class=\"bstbutton_button bstbutton_dropdown bstbutton_share\" id=\"share-btn\">\n                <i class=\"fas fa-share-square\"></i> 分享\n                <div class=\"bstbutton_dropdown-content\">';\n            if (!empty($options['Shares'][0]) && @in_array('qq', $options['Shares'])) {\n                echo '<div class=\"bstbutton_dropdown-item bstbutton_qqshare\" id=\"qqshare\"><i class=\"fab fa-qq\"></i> QQ</div>';\n            }\n            if (!empty($options['Shares'][0]) && @in_array('qzone', $options['Shares'])) {\n                echo '<div class=\"bstbutton_dropdown-item bstbutton_qzoneshare\" id=\"qzoneshare\"><i class=\"fab fa-qq\"></i> QQ空间</div>';\n            }\n            if (!empty($options['Shares'][0]) && @in_array('wechat', $options['Shares'])) {\n                echo '<div class=\"bstbutton_dropdown-item bstbutton_wechatshare\" id=\"wechatshare\"><i class=\"fab fa-weixin\"></i> 微信</div>';\n            }\n            if (!empty($options['Shares'][0]) && @in_array('weibo', $options['Shares'])) {\n                echo '<div class=\"bstbutton_dropdown-item bstbutton_weiboshare\" id=\"weiboshare\"><i class=\"fab fa-weibo\"></i> 微博</div>';\n            }\n            if (!empty($options['Shares'][0]) && @in_array('facebook', $options['Shares'])) {\n                echo '<div class=\"bstbutton_dropdown-item bstbutton_facebookshare\" id=\"facebookshare\"><i class=\"fab fa-facebook\"></i> Facebook</div>';\n            }\n            if (!empty($options['Shares'][0]) && @in_array('twitter', $options['Shares'])) {\n                echo '<div class=\"bstbutton_dropdown-item bstbutton_twittershare\" id=\"twittershare\"><i class=\"fab fa-twitter\"></i> Twitter</div>';\n            }\n            if (!empty($options['Shares'][0]) && @in_array('google', $options['Shares'])) {\n                echo '<div class=\"bstbutton_dropdown-item bstbutton_googleshare\" id=\"googleshare\"><i class=\"fab fa-google\"></i> Google</div>';\n            }\n            if (!empty($options['Shares'][0]) && @in_array('linkedin', $options['Shares'])) {\n                echo '<div class=\"bstbutton_dropdown-item bstbutton_linkedinshare\" id=\"linkedinshare\"><i class=\"fab fa-linkedin\"></i> Linkedin</div>';\n            }\n            \n            echo '\n                </div>\n            </div>';\n        }\n        \n        // 赞赏按钮\n        if ($options['RewardOpen'] == true) {\n            if ($options['RewardOpen_tepass'] == true) {\n                echo '\n                <div class=\"bstbutton_button bstbutton_donate\" onclick=\"isHidden(\\'div_reward\\')\">\n                    <i class=\"fas fa-gift\"></i> 赞赏\n                </div>';\n            } else {\n                echo '\n                <div class=\"bstbutton_button bstbutton_donate\" onclick=\"window.__DONATE_INSTANCE?.show()\">\n                    <i class=\"fas fa-gift\"></i> 赞赏\n                </div>';\n            }\n        }\n        \n        echo '</div>'; \n        echo '\n        <script>\n    $(document).ready(function() {\n  const $shareButton = $(\\'#share-btn\\');\n  const $shareMenu = $(\\'.bstbutton_dropdown-content\\');\n\n  function toggleShareMenu() {\n    $shareMenu.toggleClass(\\'show\\');\n  }\n\n  $shareButton.on(\\'click\\', function(e) {\n    e.stopPropagation();\n    toggleShareMenu();\n  });\n\n  $(document).on(\\'click\\', function(e) {\n    if (!$shareMenu.is(e.target) && !$shareButton.is(e.target) && $shareMenu.has(e.target).length === 0) {\n      $shareMenu.removeClass(\\'show\\');\n    }\n  });\n});\n\n    </script>\n        ';\n    }\n}\n\n\nfunction poster_inx($cid,$content,$excerpt,$type,$excerpt_length=240){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $agent = strtolower($_SERVER['HTTP_USER_AGENT']);\n$is_iphone = (strpos($agent, 'iphone')) ? true : false;   \n  $is_ipad = (strpos($agent, 'ipad')) ? true : false;   \n  //判断苹果设备访问，经测试苹果设备在某些情况下可能无法下载海报\n  if($is_iphone || $is_ipad){\n      $download = '长按图片保存海报';\n  }\n  else{\n      $download = '下载海报';\n  }\n  $post_excerpt = $excerpt;\n  if($excerpt == ''){\n      $post_content = $content;\n      if (strpos($post_content, '[bspost') !== false) {\n                    $post_content = preg_replace('/\\[bspost (.*?)\\]/sm', '', $post_content);\n}\nif (strpos($post_content, '[bshide') !== false) {\n            $pattern = get_shortcode_regex(array('bshide'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\nif (strpos($post_content, '[bslogin') !== false) {\n            $pattern = get_shortcode_regex(array('bslogin'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\nif (strpos($post_content, '[bsprog') !== false) {\n            $pattern = get_shortcode_regex(array('bsprog'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '[bsgallery') !== false) {\n            $pattern = get_shortcode_regex(array('bsgallery'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n                if (strpos($post_content, '[todo-t') !== false) {\n            $pattern = get_shortcode_regex(array('todo-t'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n                if (strpos($post_content, '[todo-f') !== false) {\n            $pattern = get_shortcode_regex(array('todo-f'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n          if (strpos($post_content, '[bsgit') !== false) {\n            $pattern = get_shortcode_regex(array('bsgit'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '[bseva') !== false) {\n            $pattern = get_shortcode_regex(array('bseva'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '[bsaudio') !== false) {\n            $pattern = get_shortcode_regex(array('bsaudio'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '[bspost') !== false) {\n            $pattern = get_shortcode_regex(array('bspost'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '[bsplayer') !== false) {\n            $pattern = get_shortcode_regex(array('bsplayer'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '[bsmp3') !== false) {\n            $pattern = get_shortcode_regex(array('bsplayer'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '[bsruby') !== false) {\n            $pattern = get_shortcode_regex(array('bsruby'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '[bsmark') !== false) {\n            $pattern = get_shortcode_regex(array('bsmark'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '[bsbtn') !== false) {\n            $pattern = get_shortcode_regex(array('bsbtn'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '[bsmessage') !== false) {\n            $pattern = get_shortcode_regex(array('bsmessage'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '{bs-todo') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-todo'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '{bs-accord') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-accord'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '{bs-font') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-font'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '{bs-iframe') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-iframe'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '{bs-card') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-card'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '{bs-audio') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-audio'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        if (strpos($post_content, '[bspaper') !== false) {\n            $pattern = get_shortcode_regex2(array('bspaper'));\n            $post_content = preg_replace(\"/$pattern/\", '', $post_content);\n        }\n        $post_content = strip_tags( $post_content );\n\n        $post_excerpt = mb_strimwidth($post_content,0,$excerpt_length,'…','utf-8');\n  }\n  $post_excerpt = strip_tags( $post_excerpt );\n    $post_excerpt = trim( preg_replace( \"/[\\n\\r\\t ]+/\", ' ', $post_excerpt ), ' ' );\n    switch($type){\n    case '1':\n    echo '<div id=\"post-poster\" class=\"post-poster action action-poster\">\n\t\t\t<div class=\"poster-qrcode\" style=\"display:none;\"></div>\n\t\t\t<div class=\"poster-popover-mask\" data-event=\"poster-close\"></div>\n\t\t\t<div class=\"poster-popover-box\">\n\t\t\t\t<a class=\"poster-download btn btn-default\" download=\"'.$cid.'.jpg\">\n\t\t\t\t\t<span>'.$download.'</span>\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t</div>';\n\tcase '2':\n\t\treturn $post_excerpt;\n    }\n}\n//输出文章标题字数\nfunction articletitlenum(){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    if(empty($options['articletitlenum'])){\n        return '20';\n    }\n    else{\n     return $options['articletitlenum'];\n    }\n    \n}\n\n//输出文章描述字数\nfunction articledecnum(){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    if(empty($options['articleexcerptnum'])){\n        return '40';\n    }\n    else{\n     return $options['articleexcerptnum'];\n    }\n    \n}\n\n//自动分页方法\nfunction autoPage($array,$pagesize,$current){\n    if(!$array){\n        return;\n    }\n  $_return = array();\n  $total=ceil(count($array)/$pagesize);\n  $prev=(($current-1)<=0 ? \"1\":($current-1));\n  $next=(($current+1)>=$total ?   $total:$current+1);\n  $current=($current>($total)?($total):$current);\n  $start=($current-1)*$pagesize;\n  $end=($start+$pagesize)<count($array) ? ($start+$pagesize) : count($array);\n  for($i=$start;$i<$end;$i++){\n    @array_push($_return,$array[$i]);\n  }\n  $pagearray[\"ret\"]=$_return;\n  $page = '<div class=\"ui labels\" style=\"margin-top:20px\"><div style=\"text-align:center\"><a class=\"ui large label\" href=\"?page=1\">首页</a>';\n  $page .= '<a class=\"ui large label\" href=\"?page='.$prev.'\">上一页</a>';\n  for($i=1;$i<=$total;$i++){\n   \n    if($i==$current){\n      $page .= '<a href=\"?page='.$i.'\" class=\"ui black large label\">'.$i.'</a>';\n    }\n    else{\n         $page .= '<a href=\"?page='.$i.'\" class=\"ui large label\">'.$i.'</a>';\n    }\n  }\n  $page .= '<a class=\"ui large label\" href=\"?page='.$next.'\">下一页</a>';\n  $page .= '<a class=\"ui large label\" href=\"?page='.$total.'\">尾页</a></div></div>';\n  $pagearray[\"page\"] = $page;\n  if($total == 1){\n  $pagearray[\"page\"] = '';    \n  }\n  return $pagearray;\n}\n\n\n\n//输出标签云个数\nfunction tagcloudnum(){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    if(empty($options['tagcloudnum'])){\n        return '20';\n    }\n    else{\n     return $options['tagcloudnum'];\n    }\n    \n}\n\n// 简洁图文获取图片\nfunction thumb($obj) {\n    //获取附件首张图片\n\t$attach = $obj->attachments(1)->attachment;\n\t//获取文章首张图片\n\tpreg_match_all(\"/\\<img.*?src\\=\\\"(.*?)\\\"[^>]*>/i\", $obj->content, $thumbUrl);\n\t$img_src = $thumbUrl[1][0];\n\t// 获取自定义随机图片\n\t$options = bsOptions::getInstance()::get_option( 'bearsimple' );\n\t$thumbs = explode(\"|\",$options['Article_forma_pic']);\n\t// 获取文章封面\n\t$cover = $obj->fields->cover;\n\t//--------------->\n\tif($options['Article_forma_randapi'] == 1){\n\t        $rand = '?'.mt_rand(1,1000);\n\t    }\n\tif($options['Article_forma_randchoose'] == false || $options['Article_forma_randchoose'] == ''){\n\tif($cover){\n\t    $thumb = $cover;\n\t}elseif(isset($attach->isImage) && $attach->isImage == 1){\n\t\t$thumb = $attach->url;\n\t}else if($img_src){\n\t\t$thumb = $img_src;\n\t}else if(!empty($options['Article_forma_pic']) && count($thumbs)>0){\n\t\t$thumb = $thumbs[rand(0,count($thumbs)-1)].$rand;\n\t}\n\telse{\n\t    $thumb = '';\n\t}\n\t\n\t}\n\telse{\n\t    \n\t   if(!empty($options['Article_forma_pic']) && count($thumbs)>0){\n\t\t$thumb = $thumbs[rand(0,count($thumbs)-1)].$rand;\n\t}\n\t   elseif($cover){\n\t    $thumb = $cover;\n\t}elseif(isset($attach->isImage) && $attach->isImage == 1){\n\t\t$thumb = $attach->url;\n\t}else if($img_src){\n\t\t$thumb = $img_src;\n\t}\n\telse{\n\t    $thumb = '';\n\t}\n\t   \n\t    \n\t}\n\t\n\treturn $thumb;\n}\n\n// 图底文字获取图片\nfunction thumb2($obj,$type = 'default') {\n    //获取附件首张图片\n\t$attach = $obj->attachments(1)->attachment;\n\t//获取文章首张图片\n\tpreg_match_all(\"/\\<img.*?src\\=\\\"(.*?)\\\"[^>]*>/i\", $obj->content, $thumbUrl);\n\t$img_src = $thumbUrl[1][0];\n\t// 获取自定义随机图片\n\t$options = bsOptions::getInstance()::get_option( 'bearsimple' );\n\t$thumbs = explode(\"|\",$options['Article_forma_pic']);\n\t// 获取文章封面\n\t$cover = $obj->fields->cover;\n\t//--------------->\n\tif($options['Article_forma_randapi'] == 1){\n\t        $rand = '?'.mt_rand(1,1000);\n\t    }\n\tif($options['Article_forma_randchoose'] == false || $options['Article_forma_randchoose'] == ''){\n\tif($cover){\n\t    $thumb = $cover;\n\t}elseif(isset($attach->isImage) && $attach->isImage == 1){\n\t\t$thumb = $attach->url;\n\t}else if($img_src){\n\t\t$thumb = $img_src;\n\t}else if(!empty($options['Article_forma_pic']) && count($thumbs)>0){\n\t\t$thumb = $thumbs[rand(0,count($thumbs)-1)].$rand;\n\t}\n\telse if($type == 'album'){\n\t    $thumb = Helper::options()->themeUrl.'/assets/images/mountain.webp';\n\t}\n\telse{\n\t    $thumb = '';\n\t}\n\t\n\t}\n\telse{\n\t    \n\t   if(!empty($options['Article_forma_pic']) && count($thumbs)>0){\n\t\t$thumb = $thumbs[rand(0,count($thumbs)-1)].$rand;\n\t}\n\t   elseif($cover){\n\t    $thumb = $cover;\n\t}elseif(isset($attach->isImage) && $attach->isImage == 1){\n\t\t$thumb = $attach->url;\n\t}else if($img_src){\n\t\t$thumb = $img_src;\n\t}\n\telse{\n\t    $thumb = '';\n\t}\n\t   \n\t    \n\t}\n\treturn $thumb;\n}\n\nfunction thumb3($obj) {\n    //获取附件首张图片\n\t$attach = $obj->attachments(1)->attachment;\n\t//获取文章首张图片\n\tpreg_match_all(\"/\\<img.*?src\\=\\\"(.*?)\\\"[^>]*>/i\", $obj->content, $thumbUrl);\n\t$img_src = $thumbUrl[1][0];\n\t// 获取自定义随机图片\n\t$options = bsOptions::getInstance()::get_option( 'bearsimple' );\n\t$thumbs = explode(\"|\",$options['Article_forma_pic']);\n\t// 获取文章封面\n\t$cover = $obj->fields->cover;\n\t//--------------->\n\tif($options['Article_forma_randapi'] == 1){\n\t        $rand = '?'.mt_rand(1,1000);\n\t    }\n\tif($options['Article_forma_randchoose'] == false || $options['Article_forma_randchoose'] == ''){\n\tif($cover){\n\t    $thumb = $cover;\n\t}elseif(isset($attach->isImage) && $attach->isImage == 1){\n\t\t$thumb = $attach->url;\n\t}else if($img_src){\n\t\t$thumb = $img_src;\n\t}else if(!empty($options['Article_forma_pic']) && count($thumbs)>0){\n\t\t$thumb = $thumbs[rand(0,count($thumbs)-1)].$rand;\n\t}\n\telse{\n\t    $thumb = '';\n\t}\n\t\n\t}\n\telse{\n\t    \n\t   if(!empty($options['Article_forma_pic']) && count($thumbs)>0){\n\t\t$thumb = $thumbs[rand(0,count($thumbs)-1)].$rand;\n\t}\n\t   elseif($cover){\n\t    $thumb = $cover;\n\t}elseif(isset($attach->isImage) && $attach->isImage == 1){\n\t\t$thumb = $attach->url;\n\t}else if($img_src){\n\t\t$thumb = $img_src;\n\t}\n\telse{\n\t    $thumb = '';\n\t}\n\t   \n\t    \n\t}\n\treturn $thumb;\n}\n\n\n/**简单的标签转换**/\nfunction BearSimpleChange($article){\n    $article = str_replace('[bs-style=', '<div class=\"', $article);\n    $article = str_replace('[/bs-style]', '</div>', $article);\n    $article = str_replace(']', '\">', $article);\n    return $article;\n}\n\nfunction BearSimpleFriendLinkBr($friendlink){\n    $friendlink = str_replace('<friendlink>', '<ul></ul>', $friendlink);\n    $friendlink = str_replace(',', '<ul></ul>', $friendlink);\n    return $friendlink;\n}\n\n\n/** 获取操作系统信息 */\nfunction getOs($agent)\n{\n    $os = false;\n\n    if (preg_match('/win/i', $agent)) {\n        if (preg_match('/nt 6.0/i', $agent)) {\n            $os = 'Windows Vista';\n        } else if (preg_match('/nt 6.1/i', $agent)) {\n            $os = 'Windows 7';\n        } else if (preg_match('/nt 5.1/i', $agent)) {\n            $os = 'Windows XP';\n        } else if (preg_match('/nt 5/i', $agent)) {\n            $os = 'Windows 2000';\n        } else {\n            $os = 'Windows';\n        }\n    } else if (preg_match('/android/i', $agent)) {\n        $os = 'Android';\n    } else if (preg_match('/ubuntu/i', $agent)) {\n        $os = 'Ubuntu';\n    } else if (preg_match('/linux/i', $agent)) {\n        $os = 'Linux';\n    } else if (preg_match('/mac/i', $agent)) {\n        $os = 'Mac OS X';\n    } else if (preg_match('/unix/i', $agent)) {\n        $os = 'Unix';\n    } else if (preg_match('/symbian/i', $agent)) {\n        $os = 'Nokia SymbianOS';\n    } else {\n        $os = '其它操作系统';\n    }\n\n    echo $os;\n}\n\n//**字数统计**/\nfunction art_count ($cid){ \n    $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']); \n    \n    echo mb_strlen($text,'UTF-8'); }\n\n// 统计阅读数\nfunction get_post_view($archive){\n\t$cid    = $archive->cid;\n\t$db     = Typecho_Db::get();\n\t$prefix = $db->getPrefix();\n\tif (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) {\n\t\t$db->query('ALTER TABLE `' . $prefix . 'contents` ADD `views` INT(10) DEFAULT 0;');\n\t\techo 0;\n\t\treturn;\n\t}\n\t$row = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid));\n\tif ($archive->is('single')) {\n        $views = Typecho_Cookie::get('extend_contents_views');\n\t\tif(empty($views)){\n\t\t\t$views = array();\n\t\t}else{\n\t\t\t$views = explode(',', $views);\n\t\t}\n        if(!in_array($cid,$views)){\n\t        $db->query($db->update('table.contents')->rows(array('views' => (int) $row['views'] + 1))->where('cid = ?', $cid));\n            array_push($views, $cid);\n\t\t\t$views = implode(',', $views);\n\t\t\tTypecho_Cookie::set('extend_contents_views', $views); //记录查看cookie\n\t\t}\n\t}\n\techo $row['views'];\n}\n\n\n// 留言加@\nfunction getPermalinkFromCoid($coid) {\n\t$db = Typecho_Db::get();\n\t$row = $db->fetchRow($db->select('author')->from('table.comments')->where('coid = ? AND status = ?', $coid, 'approved'));\n\tif (empty($row)) return '';\n\treturn '<a href=\"#comment-'.$coid.'\">@'.$row['author'].'</a>';\n}\n\n//获取文章标题\nfunction get_article_title($cid){\n $db = Typecho_Db::get();\n\t$row = $db->fetchRow($db->select('title')->from('table.contents')->where('cid = ?', $cid));\n return $row['title'];\n}\n\n//获取文章URL\nfunction get_article_link($cid){    \n    $db = Typecho_Db::get();\n\n    $result = $db->fetchAll($db->select()->from('table.contents')\n        ->where('status = ?','publish')\n        ->where('type = ?', 'post')\n        ->where('created <= unix_timestamp(now())', 'post')\n        ->where('cid = ?', $cid));\n    if($result){\n        foreach($result as $val){\n            $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);\n            $post_title = htmlspecialchars($val['title']);\n            $permalink = $val['permalink'];\n            return $permalink;\n        }\n    }\n}\n\n//懒加载输出\nfunction lazyload($haveClass = 0,$url = ''){\n    $themeurl = Helper::options()->themeUrl;\n    $loader_open = bsOptions::getInstance()::get_option('bearsimple')['Lazyload'];\n    $loader = bsOptions::getInstance()::get_option('bearsimple')['Lazyload_style'];\n    if($loader_open == 1){\n         if($haveClass == 1){\n        return ' src=\"data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\" data-';\n    }\n    elseif($haveClass == 'auto' && !empty($url)){\n        return ' class=\"lazyload lazyload-style-'.$loader.'\" src=\"data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\" data-';\n    }\n    elseif($haveClass == 'auto' && empty($url)){\n        return ' class=\"lazyload lazyload-style-'.$loader.'\" src=\"data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\" data-';\n    }\n    elseif($haveClass == 'auto-other' && !empty($url)){\n        return ' src=\"'.$url.'\" data-';\n    }\n    else{\n    return ' class=\"lazyload lazyload-style-'.$loader.'\" src=\"data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\" data-';\n    }\n    }\n}\n//侧边栏最新回复\nfunction lastComments(){\n    $db = Typecho_Db::get();\n    $options = Helper::options();\n    $search_Crosspage = $db->fetchAll($db->select('cid')->from('table.contents')\n        ->where('status = ?','publish')\n        ->where('type = ?', 'page')\n        ->where('template = ?','cross.php')\n        ->orwhere('template = ?','friendcircle.php')\n        );\n        $ids = array_column($search_Crosspage, 'cid'); \n        if($search_Crosspage[0]['cid']){\n            $result = $db->select()->from('table.comments');\n    $result = $result->where('status = ?','approved')\n        ->where('type = ?', 'comment');\n        foreach ($ids as $k => $v) {\n        $result = $result->where('cid != '.intval($ids[$k]));\n        }\n        $result = $db->fetchAll($result->order('created', Typecho_Db::SORT_DESC)\n        ->limit(5));\n        \n        }\n        else{\n            $result = $db->fetchAll($db->select()->from('table.comments')\n        ->where('status = ?','approved')\n        ->where('type = ?', 'comment')\n        ->order('created', Typecho_Db::SORT_DESC)\n        ->limit(5)\n        );\n        }\n      echo '\n            <div class=\"card-body\">\n    <ul class=\"recent-comments-list\">';\n    foreach($result as $comment){\n        $post = $db->fetchAll($db->select()->from('table.contents')\n            ->where('status = ?','publish')\n            ->where('type = ?', 'post')\n            ->where('cid  = ?',$comment['cid'])\n            ->order('cid', Typecho_Db::SORT_DESC)        \n        );\nif($post){\n            $i=1;\n            foreach($post as $val){                \n                $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);\n                $post_title = htmlspecialchars($val['title']);\n                $permalink = $val['permalink'];\n                $post_url = '<div class=\"recent-comments-meta-article\">评论于：<a href=\"'.$permalink.'#comment-'.$comment['coid'].'\" title=\"评论于：'.$post_title.'\" target=\"_blank\">'.$post_title.'</a></div>';\n            }\n        }\n\n        \n        if(strip_tags(excerpt_content(bearcutword(reEmo($comment['text'],'reply')))) == ''){\n            $comment_text = '该内容无法显示';\n        }\n        else{\n            $comment_text = strip_tags(excerpt_content(bearcutword(reEmo($comment['text'],'reply'))));\n        }\n        echo '<li><div class=\"recent-comments-author\">'.$comment['author'].'</div>\n                      ';\n      if(!Typecho_Widget::widget('Widget_User')->hasLogin()){\n      if(Bsoptions('Comment_private') == true && strpos($comment['text'],'@私密@') !== false ){\n      echo '<div class=\"recent-comments-text\">此评论为私密评论</p></div>';\n      }\n      else{\n      echo '<div class=\"recent-comments-text\">'.$comment_text.'</p>\n                        </div>\n                       ';    \n      }\n      }\n      else{\n         echo '<div class=\"recent-comments-text\">'.$comment_text.'</p>\n                        </div>\n                        ';     \n      }\n     echo $post_url.'<div class=\"recent-comments-meta\">'.date('Y-m-d',$comment['created']).'</div></li>';\n    }\n    echo '</ul></div>';\n}\n\n//获取动态数目\nfunction crossnum(){\n    $db = Typecho_Db::get();\n    $crossnum = $db->fetchAll($db->select('commentsNum')->from('table.contents')\n        ->where('status = ?','publish')\n        ->where('type = ?', 'page')\n        ->where('template = ?','cross.php')\n        ->limit(1)\n        );\n       return $crossnum[0]['commentsNum'];\n}\n\n//版权声明\nfunction copyright_cc($field){\n    if($field == 'one'){\n        $output = '<a class=\"bearcopyright-license\" href=\"http://creativecommons.org/licenses/by/4.0/\">知识共享署名许可协议</a>';\n    }\n    else if($field == 'two'){\n        $output = '<a class=\"bearcopyright-license\" href=\"http://creativecommons.org/licenses/by-nc/4.0/\">知识署名-非商业性使用许可协议</a>';\n    }\n    else if($field == 'three'){\n        $output = '<a class=\"bearcopyright-license\" href=\"http://creativecommons.org/licenses/by-nd/4.0/\">知识共享署名-禁止演绎许可协议</a>';\n    }\n    else if($field == 'four'){\n        $output = '<a class=\"bearcopyright-license\" href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\">知识共享署名-非商业性使用-禁止演绎许可协议</a>';\n    }\n    else if($field == 'five'){\n        $output = '<a class=\"bearcopyright-license\" href=\"http://creativecommons.org/licenses/by-sa/4.0/\">知识共享署名-相同方式共享许可协议</a>';\n    }\n    else if($field == 'six'){\n        $output = '<a class=\"bearcopyright-license\" href=\"http://creativecommons.org/licenses/by-nc-sa/4.0/\">知识共享署名-非商业性使用-相同方式共享许可协议</a>';\n    }\n    return $output;\n}\n\nfunction msec_to_sec($timestamp,$type='msec'){\n    if($type=='msec'){\n        return sprintf('%.0f', $timestamp*1000);\n    }else{\n        return sprintf('%.0f', $timestamp/1000);\n    }\n\n}\n\nfunction time_start() {\n\tglobal $timestart;\n\t$mtime     = explode( ' ', microtime() );\n\t$timestart = $mtime[1] + $mtime[0];\n\treturn true;\n}\ntime_start();\nfunction loadtime( $display = 0, $precision = 3 ) {\n\tglobal $timestart, $timeend;\n\t$mtime     = explode( ' ', microtime() );\n\t$timeend   = $mtime[1] + $mtime[0];\n\t$timetotal = number_format( $timeend - $timestart, $precision );\n\t$r         = $timetotal < 1 ? $timetotal . \" millisecond(s)\" : $timetotal . \" second(s)\";\n\tif ( $display ) {\n\t\techo $r;\n\t}\n\treturn 'Processed in '.$r;\n}\n\n\nclass Widget_Post_hot extends Widget_Abstract_Contents\n{\n    public function __construct($request, $response, $params = NULL)\n    {\n        parent::__construct($request, $response, $params);\n        $this->parameter->setDefault(array('pageSize' => $this->options->commentsListSize, 'parentId' => 0, 'ignoreAuthor' => false));\n}\n\n    public function execute()\n    {\n        $ret = array();\n        $options = bsOptions::getInstance()::get_option('bearsimple');\n    $data = $options['Cate_Encrypt'];\n    $arr = $data;\n    $col = 'Cate_Encrypt_Id';\n        foreach ($arr as $row)\n        {\n            if (isset($row[$col])) {\n                $ret[] = $row[$col];\n            }\n        }\n        $db = \\Typecho\\Db::get();\n        $adapter = $db->getAdapterName();\n        if (\"Pdo_SQLite\" === $adapter || \"SQLite\" === $adapter || \"pgsql\" === $adapter || \"Pdo_Pgsql\" === $adapter) {\n            $db_query = 'left';\n        }\n        if (\"Pdo_Mysql\" === $adapter || \"Mysql\" === $adapter) {\n            $db_query = 'right';\n        }\n        $mid = array_unique($ret);\n        Typecho_Widget::widget('Widget_User')->to($user);\n        if(empty($mid) || ($user->hasLogin())){\n$select  = $this->select()->from('table.contents')\n          ->where(\"table.contents.password IS NULL OR table.contents.password = ''\")\n          ->where('table.contents.status = ?','publish')\n          ->where('table.contents.created <= ?', time())\n          ->where('table.contents.type = ?', 'post')\n          ->limit($this->parameter->pageSize)\n          ->order('table.contents.created', Typecho_Db::SORT_DESC);\n        }\n        else{\n$select  = $this->select()->from('table.contents')\n->join('table.relationships','table.relationships.cid = table.contents.cid',''.$db_query.'')\n->join('table.metas','table.relationships.mid = table.metas.mid',''.$db_query.'')\n->where('table.metas.type=?','category')\n          ->where(\"table.contents.password IS NULL OR table.contents.password = ''\")\n          ->where('table.contents.status = ?','publish')\n          ->where('table.contents.created <= ?', time())\n          ->where('table.contents.type = ?', 'post')\n          ->limit($this->parameter->pageSize)\n          ->order('table.contents.created', Typecho_Db::SORT_DESC)\n          ->group('table.contents.cid');\n         foreach ($mid as  $k=>$v) {\n            $select->where('table.relationships.mid != '.intval($mid[$k]));//确保每个值都是数字\n        }    \n         \n        }\n\n     $this->db->fetchAll($select, array($this, 'push'));\n    }\n}"
  },
  {
    "path": "core/getcheck.php",
    "content": "<?php\nfunction GetCheck()\n{\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $curl = curl_init();\n    curl_setopt($curl, CURLOPT_URL, $options['Assets_Custom'].'/assets/check.json');\n    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);\n    curl_setopt($curl, CURLOPT_POST, false);\n    curl_setopt($curl, CURLOPT_TIMEOUT, 500);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);\n    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);\n    $data = curl_exec($curl);\n    curl_close($curl);\n    $output = json_decode($data,true);\n    if ($output && $output['message'] == 'success'){\n    return '<a style=\"color:green\">连接成功,该自定义储存库可用!</a>';\n    }\n    else{\n        return '<a style=\"color:red\">连接失败,该自定义储存库不可用!若已更改为正确的地址，请刷新页面后查看检测结果</a>';\n    }\n}"
  },
  {
    "path": "core/gravatar.php",
    "content": "<?php\nfunction getrealurl($url){\n\n$header = get_headers($url, 1);\n\nprint_r($header);\n\nif (strpos($header[0],'301') || strpos($header[0],'302')) {\n\nif(is_array($header['Location'])) {\n\nreturn $header['Location'][count($header['Location'])-1];\n\n}else{\n\nreturn $header['Location'];\n\n}\n\n}else {\n\nreturn $url;\n\n}\n\n}\n\nfunction imgravatarq($email)\n\n{\n\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    switch($options['avatar__choose']){\n        case 'cravatar':\n            $email = md5($email);\n            $default_avatar = ''; \n            if(!empty($options['Cravatar_default'])){\n                $default_avatar = 'default='.urlencode($options['Cravatar_default']);\n            }\n            return \"//cravatar.cn/avatar/\" . $email . \"?\".$default_avatar;\n            break;\n        case 'weavatar':\n            $email = md5($email);\n            if(!empty($options['Weavatar_default'])){\n                $default_avatar = 'd='.urlencode($options['Weavatar_default']);\n            }\n            return \"//weavatar.com/avatar/\" . $email . \"?\".$default_avatar;\n            break;\n            case 'diyavatar':\n                $email = md5($email);\n            if($options['DiyAvatar']){\n               $avatar = explode(\",\",$options['DiyAvatar']);\n    $Avatar = $avatar[rand(0,count($avatar)-1)];\n    return $Avatar;\n            }\n            else{\n              return \"//weavatar.com/avatar/\" . $email . \"?\";\n            }\n            break;\n            case 'gravatar':\n              $b=str_replace('@qq.com','',$email);\n             if(stristr($email,'@qq.com')&&is_numeric($b)&&strlen($b)<11&&strlen($b)>4){\n                 $email = md5($email);\n    return \"//weavatar.com/avatar/\" . $email . \"?\";\n             }\n             else{\n                 $email = md5($email);\n                if($options['Gravatar'] == '1'){\n                return \"//cn.gravatar.com/gravatar/\" . $email . \"?\";\n              \n            }\n           \n            else if($options['Gravatar'] == '3'){\n                return \"//cdn.v2ex.com/gravatar/\" . $email . \"?\";\n                \n            }\n            else if($options['Gravatar'] == '4'){\n                return \"//gravatar.loli.net/avatar/\" . $email . \"?\";\n               \n            }\n            else if($options['Gravatar'] == '7'){\n                return \"//\".$options['GravatarUrl'] . $email . \"?\";\n            }\n             }\n             break;\n            default:\n                $email = md5($email);\n            return \"//weavatar.com/avatar/\" . $email . \"?\";\n}\n}"
  },
  {
    "path": "core/parse.php",
    "content": "<?php\nrequire_once('extend/ChinesePinyin.class.php');\nrequire_once('curl.php');\nrequire_once('extend/otherFunc.php');\nuse Btools\\Curl;\n$playerID = 0;\nfunction excerpt_content($content)\n    {\n        if (strpos($content, '[bsgallery') !== false) {\n            $pattern = get_shortcode_regex(array('bsgallery'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bstimes') !== false) {\n            $pattern = get_shortcode_regex(array('bstimes'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsgit') !== false) {\n            $pattern = get_shortcode_regex(array('bsgit'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bscopy') !== false) {\n            $pattern = get_shortcode_regex(array('bscopy'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsmusic') !== false) {\n            $pattern = get_shortcode_regex(array('bsmusic'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[todo-t') !== false) {\n            $pattern = get_shortcode_regex(array('todo-t'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[todo-f') !== false) {\n            $pattern = get_shortcode_regex(array('todo-f'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bseva') !== false) {\n            $pattern = get_shortcode_regex(array('bseva'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsaudio') !== false) {\n            $pattern = get_shortcode_regex(array('bsaudio'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bspost') !== false) {\n            $pattern = get_shortcode_regex(array('bspost'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsruby') !== false) {\n            $pattern = get_shortcode_regex(array('bsruby'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsprog') !== false) {\n            $pattern = get_shortcode_regex(array('bsprog'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsmark') !== false) {\n            $pattern = get_shortcode_regex(array('bsmark'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsbtn') !== false) {\n            $pattern = get_shortcode_regex(array('bsbtn'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsdate') !== false) {\n            $pattern = get_shortcode_regex(array('bsdate'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n          if (strpos($content, '[bspaper') !== false) {\n            $pattern = get_shortcode_regex(array('bspaper'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsmessage') !== false) {\n            $pattern = get_shortcode_regex(array('bsmessage'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsplayer') !== false) {\n            $pattern = get_shortcode_regex(array('bsplayer'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsmp3') !== false) {\n            $pattern = get_shortcode_regex(array('bsmp3'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-hide') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-hide'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-todo') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-todo'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-accord') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-accord'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-font') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-font'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bstag') !== false || strpos($content, '[tag') !== false) {\n            $pattern = get_shortcode_regex(array('bstag','tag'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-iframe') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-iframe'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsfra') !== false) {\n            $pattern = get_shortcode_regex(array('bsfra'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-card') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-card'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-audio') !== false) {\n            $pattern = get_shortcode_regex2(array('bs-audio'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\nif (strpos($content, '[bstabs') !== false) {\n            $pattern = get_shortcode_regex(array('bstabs'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsopc') !== false) {\n            $pattern = get_shortcode_regex(array('bsopc'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bstip') !== false) {\n            $pattern = get_shortcode_regex(array('bstip'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bskbd') !== false) {\n            $pattern = get_shortcode_regex(array('bskbd'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[e') !== false) {\n            $pattern = get_shortcode_regex(array('e'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        return $content;\n    }\nfunction parseNumber($str){\n    return preg_replace(\"/[^0-9]/\", \"\", $str);\n}\nfunction excerpt($content, $limit)\n    {\n        if($limit == 0) {\n            return \"\";\n        } else {\n            $content = excerpt_content($content);\n            if (trim($content) == \"\") {\n                return \"暂时没有可提供的摘要\";\n            } else {\n                return Typecho_Common::subStr(strip_tags($content), 0, $limit, \"...\");\n            }\n        }\n    }\n \n \n    \nfunction get_shortcode_atts_regex()\n    {\n        return '/([\\w-]+)\\s*=\\s*\"([^\"]*)\"(?:\\s|$)|([\\w-]+)\\s*=\\s*\\'([^\\']*)\\'(?:\\s|$)|([\\w-]+)\\s*=\\s*([^\\s\\'\"]+)(?:\\s|$)|\"([^\"]*)\"(?:\\s|$)|\\'([^\\']*)\\'(?:\\s|$)|(\\S+)(?:\\s|$)/';\n    }\n    \nfunction shortcode_parse_atts($text)\n    {\n        $atts = array();\n        $pattern = get_shortcode_atts_regex();\n        $text = preg_replace(\"/[\\x{00a0}\\x{200b}]+/u\", ' ', $text);\n        if (preg_match_all($pattern, $text, $match, PREG_SET_ORDER)) {\n            foreach ($match as $m) {\n                if (!empty($m[1])) {\n                    $atts[strtolower($m[1])] = stripcslashes($m[2]);\n                } elseif (!empty($m[3])) {\n                    $atts[strtolower($m[3])] = stripcslashes($m[4]);\n                } elseif (!empty($m[5])) {\n                    $atts[strtolower($m[5])] = stripcslashes($m[6]);\n                } elseif (isset($m[7]) && strlen($m[7])) {\n                    $atts[] = stripcslashes($m[7]);\n                } elseif (isset($m[8]) && strlen($m[8])) {\n                    $atts[] = stripcslashes($m[8]);\n                } elseif (isset($m[9])) {\n                    $atts[] = stripcslashes($m[9]);\n                }\n            }\n            foreach ($atts as &$value) {\n                if (false !== strpos($value, '<')) {\n                    if (1 !== preg_match('/^[^<]*+(?:<[^>]*+>[^<]*+)*+$/', $value)) {\n                        $value = '';\n                    }\n                }\n            }\n        } else {\n            $atts = ltrim($text);\n        }\n        return $atts;\n    }\n    \n\n\nfunction get_shortcode_regex($tagnames = null)\n    {\n        global $shortcode_tags;\n        if (empty($tagnames)) {\n            $tagnames = array_keys($shortcode_tags);\n        }\n        $tagregexp = join('|', array_map('preg_quote', $tagnames));\n        return\n            '\\\\['                           \n            . '(\\\\[?)'                        \n            . \"($tagregexp)\"       \n            . '(?![\\\\w-])'                    \n            . '('                         \n            . '[^\\\\]\\\\/]*'               \n            . '(?:'\n            . '\\\\/(?!\\\\])'     \n            . '[^\\\\]\\\\/]*'          \n            . ')*?'\n            . ')'\n            . '(?:'\n            . '(\\\\/)'                    \n            . '\\\\]'           \n            . '|'\n            . '\\\\]'              \n            . '(?:'\n            . '('       \n            . '[^\\\\[]*+'  \n            . '(?:'\n            . '\\\\[(?!\\\\/\\\\2\\\\])'\n            . '[^\\\\[]*+'\n            . ')*+'\n            . ')'\n            . '\\\\[\\\\/\\\\2\\\\]'    \n            . ')?'\n            . ')'\n            . '(\\\\]?)'; \n    }\n\nfunction get_shortcode_regex2($tagnames = null)\n    {\n        global $shortcode_tags;\n        if (empty($tagnames)) {\n            $tagnames = array_keys($shortcode_tags);\n        }\n        $tagregexp = join('|', array_map('preg_quote', $tagnames));\n        return\n            '\\\\{'                           \n            . '(\\\\[?)'                        \n            . \"($tagregexp)\"       \n            . '(?![\\\\w-])'                    \n            . '('                         \n            . '[^\\\\]\\\\/]*'               \n            . '(?:'\n            . '\\\\/(?!\\\\])'     \n            . '[^\\\\]\\\\/]*'          \n            . ')*?'\n            . ')'\n            . '(?:'\n            . '(\\\\/)'                    \n            . '\\\\}'           \n            . '|'\n            . '\\\\}'              \n            . '(?:'\n            . '('       \n            . '[^\\\\[]*+'  \n            . '(?:'\n            . '\\\\[(?!\\\\/\\\\2\\\\])'\n            . '[^\\\\[]*+'\n            . ')*+'\n            . ')'\n            . '\\\\[\\\\/\\\\2\\\\}'    \n            . ')?'\n            . ')'\n            . '(\\\\]?)'; \n    }\n//60S\nfunction quotebspaperCallback($matches){\n    \n    if($matches[3]){\n    $attr = htmlspecialchars_decode($matches[3]);\n    $attrs = shortcode_parse_atts($attr);\n    }\n    $date=strtotime(date(\"Y-m-d\",time()));\n    $arr = array(\"7\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\");\n    $week = $arr[date(\"w\")];\n   $news = '';\n$data = Curl::ua('android')->get('https://top.baidu.com/board')->html();\n$data = json_decode(str_Intercept($data, '<!--s-data:', '-->'), true);\nfor($i=0;$i!=10;$i++)\n{\n$new = ($i+1).\"、\".$data['cards'][0]['content'][$i]['query'] . '  ' . str_replace(' ','',$data['cards'][0]['content'][$i]['desc']);\n$news.= '<p>'.chunkSplit($new,27,\"\").\"</p>\";\n}\n$content = $news;\nif(Typecho_Cookie::get('yiyan') == ''){\nTypecho_Cookie::set('yiyan', json_decode(file_get_contents('https://v1.hitokoto.cn/'),true)['hitokoto']);\n}\n$yiyan = Typecho_Cookie::get('yiyan');\nif($attrs['image'] == 'true'){\n$img = '<img '.lazyload().'src=\"'.Helper::options()->themeUrl.'/assets/images/60s/'.$week.'.webp'.'\">';\n}\n\n   return <<<EOF\n  {$img}\n  {$content}\n 【微语】{$yiyan}\nEOF;\n}\n\nfunction getCustomFields($cid, $key){\n    $db = Typecho_Db::get();\n    $rows = $db->fetchAll($db->select('table.fields.str_value')->from('table.fields')\n        ->where('table.fields.cid = ?', $cid)\n        ->where('table.fields.name = ?', $key)\n    );\n    foreach ($rows as $row) {\n        $value = $row['str_value'];\n        if (!empty($value)) {\n            $values[] = $value;\n        }\n    }\n    return $values;\n}\n\n//引用文章回调\nfunction quotePostCallback($matches){\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        $cid = @$attrs[\"cid\"];\n        $url = @$attrs['url'];\n        $targetTitle = \"\";\n        $targetUrl = \"\";\n        $targetSummary = \"\";\n        $targetDate = \"\";\n        $expert = getCustomFields($cid, 'excerpt');\n        if (!empty($cid)){\n            $db = Typecho_Db::get();\n            $prefix = $db->getPrefix();\n            $posts = $db->fetchAll($db\n                ->select()->from('table.contents')\n                ->orWhere('table.contents.cid = ?', $cid)\n                ->where('table.contents.type = ? AND table.contents.status = ? AND table.contents.password IS NULL', 'post', 'publish'));\n            if (count($posts) == 0) {\n                $targetTitle = \"文章不存在或文章存在密码\";\n                $targetUrl = '#';\n                $targetDate = '';\n            }else{\n                $result = Typecho_Widget::widget('Widget_Abstract_Contents')->push($posts[0]);\n                 $targetSummary = preg_replace(['/#+/', '/-+/', '/\\n(>|\\\\>)/', '/^>{1}/'], '', excerpt($result['text'], 60));\n                $targetTitle = $result['title'];\n                $targetUrl = $result['permalink'];\n                $targetDate = date('Y-m-d H:m:s',$result['created']);\n                if($expert){\n                    $targetSummary = $expert[0];\n                }\n            }\n        }else {\n            $targetTitle = \"文章不存在\";\n            $targetUrl = '#';\n            $targetDate ='';\n        }\n        return <<<EOF\n<div class=\"ui fluid link card\" hrefs=\"{$targetUrl}\" style=\"margin:auto\">\n<div class=\"content\">\n<div class=\"header\">{$targetTitle}</div>\n<div class=\"meta\">{$targetDate}</div>\n<div class=\"description\">\n {$targetSummary}\n</div>\n</div>\n</div>\nEOF;\n    }\n\n//按钮回调\nfunction parseButtonCallback($matches)\n    {\n        $matches[3] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[3]);\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        $type = \"\";\n        $color = \"primary\";\n        $icon = \"\";\n        $linkUrl = \"\";\n        if (@$attrs['type'] == \"common\") {\n            $type = \"button\";\n        }\n        elseif (@$attrs['type'] == \"basic\") {\n            $type = \"basic button\";\n        }\n        elseif (@$attrs['type'] == \"animated\") {\n            $type = \"animated fade button\";\n            $name = explode('|',$matches[5]);\n            $name1 = $name[0];\n            $name2 = $name[1];\n        }\n        if (@$attrs['url'] != \"\") {\n            $linkUrl = 'window.open(\"' . $attrs['url'] . '\",\"_blank\")';\n        }\n        if (@$attrs['color'] != \"\") {\n            $color = $attrs['color'];\n        }\n        if (@$attrs['icon'] != \"\") {\n            $icon = '<i class=\"' . $attrs['icon'] .' icon'. '\"></i>';\n        }\n if (@$attrs['type'] == \"animated\") {\n return <<<EOF\n<button class=\"ui {$color} {$type}\" style=\"margin-top:5px\" onclick='{$linkUrl}' tabindex=\"0\">\n  <div class=\"visible content\">{$icon}{$name1}</div>\n  <div class=\"hidden content\">\n   {$name2}\n  </div>\n</button>\nEOF;\n }\n else{\n        return <<<EOF\n<button class=\"ui {$color} {$type}\" style=\"margin-top:5px\" onclick='{$linkUrl}'>{$icon}{$matches[5]}</button>\nEOF;\n}\n    }\n\nfunction parseTabsCallback($matches)\n    {\n        if ($matches[1] == '[' && $matches[6] == ']') {\n            return substr($matches[0], 1, -1);\n        }\n\n        $content = $matches[5];\n\n        $pattern = get_shortcode_regex(array('bstab'));\n        preg_match_all(\"/$pattern/\", $content, $matches);\n        $tabs = \"\";\n        $tabContents = \"\";\n        for ($i = 0; $i < count($matches[3]); $i++) {\n            $item = $matches[3][$i];\n            $text = $matches[5][$i];\n            $id = \"bstabs-\" . md5(uniqid()) . rand(0, 100) . $i;\n            $attr = htmlspecialchars_decode($item);\n            $attrs = shortcode_parse_atts($attr);\n            $name = @$attrs['name'];\n            $active = @$attrs['active'];\n           \n\n            if ($active == \"true\") {\n                $active = \"active\";\n                $in = \"in\";\n            } else {\n                $active = \"\";\n            }\n             if (strpos($text, '<img') !== false) {\n            $text = preg_replace_callback('/<img([^>]+)>/i', function($imgMatches) {\n                $attrs = $imgMatches[1];\n                \n                $specificSrc = 'src=\"data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"';\n                \n                $attrs = str_replace($specificSrc, '', $attrs);\n                \n                if (preg_match('/\\bdata-src\\s*=\\s*[\"\\'][^\"\\']*[\"\\']/i', $attrs)) {\n                    $attrs = preg_replace('/(?<!data-)src\\s*=\\s*[\"\\'][^\"\\']*[\"\\']\\s*/i', '', $attrs);\n                    $attrs = preg_replace('/\\bdata-src\\s*=\\s*([\"\\'][^\"\\']*[\"\\'])/i', 'src=$1', $attrs);\n                }\n                \n                return \"<img{$attrs}>\";\n            }, $text);\n            $text = preg_replace('/<div class=\"imgalt\">.*?<\\/div>/s', '', $text);\n        }\n        \n            $tabs .= \"<a class='item $active' data-tab='$id'>$name</a>\";\n            $tabContents .= \"<div class='ui tab $active' data-tab='$id'>\n            $text</div>\";\n        }\n\n\n        return <<<EOF\n        <div class=\"ui segment\">\n<div class=\"ui pointing secondary menu wrapped\">\n       $tabs\n    </div>\n   \n        $tabContents\n        </div>\nEOF;\n    }\n    \n//信息提示框回调\nfunction parseMessageCallback($matches)\n    {\n$matches[3] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[3]);\n$attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        $type = \"\";\n        $color = \"\";\n        $icon = \"\";\n        \n        if (@$attrs['type'] == \"commonclose\" || @$attrs['type'] == 'basicclose') {\n            $close = '<i class=\"close icon\"></i>';\n        }\n        \n        if (@$attrs['type'] == \"basic\" || @$attrs['type'] == \"basicclose\") {\n            $type = 'floating';\n        }\n        \n        if (@$attrs['icon'] != \"\") {\n            $types = 'icon';\n            $att = '<div class=\"content\">';\n            $atts = '</div>';\n        }\n        if (@$attrs['title'] != \"\") {\n            $title = '<div class=\"header\">'.$attrs['title'].'</div>';\n        }\n        \n        if (@$attrs['color'] != \"\") {\n            $color = $attrs['color'];\n        }\n        if (@$attrs['color'] == \"primary\") {\n            $color = 'blue';\n        }\n        if (@$attrs['icon'] != \"\") {\n            $icon = '<i class=\"' . $attrs['icon'] .' icon'. '\"></i>';\n        }\n\n        return <<<EOF\n<div class=\"ui {$color} {$type} {$types} message\">\n{$icon}\n  {$close}\n  {$att}\n    {$title}\n  <div>\n{$matches[5]}\n  </div>\n</div>\n{$atts}\nEOF;\n    }\n    \nfunction parseRubyCallback($matches){\n    $Pinyin = new ChinesePinyin();\n    $arr = preg_split(\"//u\", $matches[5], -1,PREG_SPLIT_NO_EMPTY);\n    $results = '<ruby>';\n    foreach($arr as $po){\n$results .= $po.'<rp>(</rp><rt>'.$Pinyin->TransformWithTone($po).'</rt><rp>)</rp>';\n}\n$results .= '</ruby>';\n return $results;\n}\n\n\nfunction Rand_IP(){\n\n$ip2id= round(rand(600000, 2550000) / 10000); //第一种方法，直接生成\n\n$ip3id= round(rand(600000, 2550000) / 10000);\n\n$ip4id= round(rand(600000, 2550000) / 10000);\n\n//下面是第二种方法，在以下数据中随机抽取\n\n$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\");\n\n$randarr= mt_rand(0,count($arr_1)-1);\n\n$ip1id = $arr_1[$randarr];\n\nreturn $ip1id.\".\".$ip2id.\".\".$ip3id.\".\".$ip4id;\n\n}\n\nfunction curl_get($url){\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_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');\ncurl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);\ncurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);\ncurl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);\ncurl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');\n$result = curl_exec($ch);\nreturn $result;\n    }\n    \n//Github仓库回调\nfunction parseGithubCallback($matches)\n    {\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        $gh_result_cookie_name = '__gh_result_cookie_'.$attrs['user'].'_'.$matches[5];\n        $gh_result_cookie = Typecho_Cookie::get($gh_result_cookie_name);\n        if(!$gh_result_cookie){\n            $result = json_decode(curl_get('https://api.github.com/repos/'.$attrs['user'].'/'.$matches[5]),true);\n            $result['pushed_at'] = date('Y-m-d H:m:s',strtotime($result['pushed_at']));\n            $result_arr = array($result['full_name'],$attrs['user'],$matches[5],$result['pushed_at'],$result['stargazers_count'],$result['forks_count'],$result['html_url'],$result['description'],\n            );\n        Typecho_Cookie::set($gh_result_cookie_name, implode(\",\",$result_arr));\n        }\n       else{\n        $result = explode(\",\",$gh_result_cookie);\n        $result['full_name'] = $result[0];\n        $result['pushed_at'] = $result[3];\n        $result['stargazers_count'] = $result[4];\n        $result['description'] = $result[7];\n        $result['html_url'] = $result[6];\n}\n        if(@$result['full_name'] == ''){\n            $result['full_name'] = '未获取到Github信息';\n        }\n        if($result['pushed_at'] == ''){\n        $result['pushed_at'] = '未获取到Github项目更新日期';    \n            }\n        else{\n        $result['pushed_at'] = '更新于'.$result['pushed_at'];\n        }\n        if($result['stargazers_count']){\n        $star = '<i class=\"star yellow icon\"></i>'.$result['stargazers_count'];\n        }\n        $fork = '<i class=\"fork green icon\"></i>'.$result['forks_count'];\n        return <<<EOF\n        <div class=\"ui relaxed divided list\" style=\"margin:auto\"><div class=\"item\"><i class=\"big github middle aligned icon\"></i><div class=\"content\"><a class=\"header\" href=\"{$result['html_url']}\" title=\"{$result['description']}\" target=\"_blank\">{$result['full_name']}</a><div class=\"description\">{$star} {$result['pushed_at']}</div></div></div></div>\nEOF;\n    }\n\n//点击复制内容回调\nfunction parseCopyCallback($matches)\n    {\n        $matches[3] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[3]);\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($matches[3]);\n       $content = $attrs['text'];\n        return <<<EOF\n        <span class=\"bscopy\" data-clipboard-text=\"{$content}\">{$matches[5]}</span>\nEOF;\n    }\n\n//Tag回调\nfunction parseTagCallback($matches)\n    {\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        $db = Typecho_Db::get();\n   $tag=$db->fetchRow($db->select()->from ('table.metas')->where('type=?', 'tag')->where ('name=?',$matches[5]));\n        $url = Helper::options()->siteUrl.'index.php/tag/';\n        if($tag){\n        return <<<EOF\n        <a href=\"{$url}{$tag['slug']}\">{$matches[5]}</a>\nEOF;\n}\nelse{\n    return <<<EOF\n        {$matches[5]}\nEOF;\n}\n    }\n    \n//Bsfra回调\nfunction parseBsfraCallback($matches)\n    {\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        if(@$attrs['image'] == ''){\n            $image = Helper::options()->themeUrl.'/assets/images/placeholder.png';\n        }\n        else{\n            $image = $attrs['image'];\n        }\n        if(@$attrs['url'] == ''){\n            $url = Helper::options()->siteUrl;\n        }\n        else{\n            $url = $attrs['url'];\n        }\n        return <<<EOF\n        <div class=\"ui embed\" data-url=\"{$url}\" data-placeholder=\"{$image}\" data-icon=\"right circle arrow\"></div>\nEOF;\n    }\n \n//Bsplayer回调\nfunction parsePlayerCallback($matches)\n    {\n        $matches[3] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[3]);\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n\n        $config = [\n            'live' => false,\n            'autoplay' => false,\n            'theme' => '#FADFA3',\n            'loop' => 'true',\n            'screenshot' => false,\n            'hotkey' => true,\n            'preload' => 'metadata',\n            'lang' => 'zh-cn',\n            'logo' => null,\n            'volume' => 0.7,\n            'mutex' => true,\n            'video' => [\n                'url' => isset($attrs['url']) ? $attrs['url'] : null,\n                'pic' => isset($attrs['image']) ? $attrs['image'] : Helper::options()->themeUrl.'/assets/images/placeholder.png',\n                'type' => 'auto',\n                'thumbnails' => null,\n            ],\n        ];\n        $json = json_encode($config,JSON_UNESCAPED_SLASHES);\n        return <<<EOF\n        <div class=\"dplayer\" data-config='{$json}'></div>\nEOF;\n    }\n\n//Bsmp3回调\nfunction parseMp3Callback($matches)\n    {\n        $playerID = 0;\n        $matches[3] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[3]);\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        $id = getUniqueId();\n        $result = array();\n        if ($matches[4] != '/' && $matches[5]){\n            $regex = get_shortcode_regex(array('mp3'));\n            $content = htmlspecialchars_decode(strip_tags($matches[5]));\n            if ( ( false !== strpos( $content, '[' ) ) && preg_match_all(\"/$regex/\", $content , $all)){\n                foreach ($all[0] as $k=>$v){\n                    $a = shortcode_parse_atts($all[3][$k]);\n                    $r = parsebsMp3MultiFunc(trim($all[5][$k]), $a);\n                    if ($r) $result = array_merge($result, $r);\n                }\n                $config = [\n            'id' => $id,\n            \"autoplay\"=>false,\n            \"theme\"=>\"#e6d0b2\",\n            \"mutex\"=>true,\n            \"preload\"=>'auto',\n            \"loop\"=>'all',\n            \"order\"=> 'list',\n            \"url\"=>isset($attrs['url']) ? $attrs['url'] : null,\n            \"artist\"=>isset($attrs['singer']) ? $attrs['singer'] : '佚名',\n            \"title\"=>isset($attrs['name']) ? $attrs['name'] : '未知歌曲',\n            \"showlrc\"=>0,\n            \"cover\"=>isset($attrs['image']) ? $attrs['image'] : null,\n            'music' => $result,\n            ];\n            \n            }\n            \n        }\n        else{\n            $config = [\n            'id' => $id,\n            \"autoplay\"=>false,\n            \"theme\"=>\"#e6d0b2\",\n            \"mutex\"=>true,\n            \"preload\"=>\"auto\",\n            \"url\"=>isset($attrs['url']) ? $attrs['url'] : null,\n            \"artist\"=>isset($attrs['singer']) ? $attrs['singer'] : '佚名',\n            \"title\"=>isset($attrs['name']) ? $attrs['name'] : '未知歌曲',\n            \"showlrc\"=>0,\n            \"cover\"=>isset($attrs['image']) ? $attrs['image'] : null,\n            'music' => [\n                \"url\"=>isset($attrs['url']) ? $attrs['url'] : null,\n                \"title\"=>isset($attrs['name']) ? $attrs['name'] : '未知歌曲',\n                \"showlrc\"=>\"false\",\n                \"author\"=>isset($attrs['singer']) ? $attrs['singer'] : '佚名',\n                \"pic\"=>isset($attrs['image']) ? $attrs['image'] : null,\n                \"lrc\"=>\"[00:00.00]\\u627e\\u4e0d\\u5230\\u6b4c\\u8bcd\\n[99:00.00] \"\n            ],\n        ];\n        \n        }\n        $playerCode =  '<div id=\"player'.$id.'\" class=\"aplayer\"></div>';\n        \n        $js = json_encode($config,JSON_UNESCAPED_SLASHES);\n        \n        $playerCode .= <<<EOF\n<script>APlayerOptions.push({$js});</script>\nEOF;\n\n        return $playerCode;\n    }\n    \n    \n    function parsebsMp3MultiFunc($content = '',$atts = array())\n    {\n        $content = strip_tags($content);\n        $return = array();\n     \n        $atts['lyric'] = \"false\";\n            if (isset($atts['singer'])) {\n                $atts['singer'] = $atts['singer'];\n            }elseif ( ! isset($atts['id']) && isset($atts['url'])) {\n                $atts['singer'] = 'Unknown';\n            }\n            if (! isset($atts['name']) && ! isset($atts['id']) && isset($atts['url'])) {\n                $atts['name'] = 'Unknown';\n            }\n                $atts['pic'] = $atts['image'];\n            \n            $atts['title'] = $atts['name'];\n            $atts['author'] = $atts['singer'];\n            $atts['lrc'] = \"[00:00.00]\\u627e\\u4e0d\\u5230\\u6b4c\\u8bcd\\n[99:00.00] \";\n      unset($atts['singer']);\n      unset($atts['name']);\n      unset($atts['image']);\n                $return[] = $atts;\n           \n        \n        return $return;\n    }\n    \n//日期倒计时回调\nfunction parseDateProgressCallback($matches)\n{\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n       \n        if(@$attrs['color'] == ''){\n            $color = 'blue';\n        }\n        else{\n           $color = $attrs['color'];\n        }\n        if(@$attrs['end'] == ''){\n            $end = '2099-01-03 21:23:23';\n        }\n        else{\n            $end = $attrs['end'];\n        }\n        return <<<EOF\n        <h2 class=\"progressdate-title\">{$matches[5]}</h2>\n<time class=\"progressdate-number\" date-time=\"{$end}\" style=\"--accent: {$color}\"></time>\nEOF;\n}\n\n\n//进度条回调\nfunction parseProgressCallback($matches)\n{\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        $progress = '';\n        if(@$attrs['number'] !== ''){\n            $progress = $attrs['number'];\n        }\n        if(@$attrs['color'] !== ''){\n            $color = 'bsprogress-bar-'.$attrs['color'];\n        }\n        \n        return <<<EOF\n        <div class=\"bstools\" bstitle=\"{$matches[5]}\"></div>\n       <div class=\"bsprogress bsprogress-striped active\">\n      <div role=\"bsprogressbar\" style=\"width: {$progress}%;\" class=\"bsprogress-bar {$color}\"><span>{$progress}%</span></div>\n    </div>\nEOF;\n}\n//Audio回调\nfunction parseAudioCallback($matches)\n{\n        $matches[5] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[5]);\n    return <<<EOF\n    <audio src=\"{$matches[5]}\" controls=\"controls\">您的浏览器不支持播放此音频</audio>\nEOF;\n\n}\n\n//KBD回调\nfunction parseKbdCallback($matches)\n{\n    $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        $style = 'ui label';\n        if($attrs){\n            if(@$attrs['style'] == 'dark'){\n            $style = 'ui inverted label';\n        }\n        elseif(@$attrs['style'] == 'white'){\n            $style = 'ui basic label';\n        }\n       \n        }\n       \n        $matches[5] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[5]);\n    return <<<EOF\n    <kbd class=\"{$style}\">{$matches[5]}</kbd> \nEOF;\n\n}\n\n\n//文字显隐回调\nfunction parseOpcCallback($matches)\n{\n    $matches[5] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[5]);\n    return <<<EOF\n    <span class=\"bhide\">{$matches[5]}</span>\nEOF;\n\n}\n\n//文字提示回调\nfunction parseTipCallback($matches)\n{\n    $attr = htmlspecialchars_decode($matches[3]);\n    $attrs = shortcode_parse_atts($attr);\n    $text = $attrs['text'];\n    $matches[5] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[5]);\n    return <<<EOF\n    <btip data-tippy-content=\"{$text}\n    \">{$matches[5]}</btip>\nEOF;\n\n}\n\n\n//音乐歌单回调\nfunction parseMusicCallback($matches)\n{\n    return <<<EOF\n    <div class=\"BAudio\" id=\"b{$matches[5]}\"></div>\n    <script>\n    fetch(\"https://api.injahow.cn/meting/?server=netease&type=playlist&id={$matches[5]}\").then(async response => {\n      const audio = await response.json();\n      new BAudio({\n        element: document.querySelector(\"#b{$matches[5]}\"),\n        audio: audio\n      })\n    });\n    </script>\nEOF;\n\n}\n\n//音乐歌单回调\nfunction parseMusicRdCallback($matches)\n{\n    return <<<EOF\n    <div class=\"BAudio\" id=\"brd{$matches[5]}\"></div>\n    <script>\n    fetch(\"https://api.injahow.cn/meting/?server=netease&type=playlist&id={$matches[5]}\").then(async response => {\n      const audio = await response.json();\n      new BAudio({\n        element: document.querySelector(\"#brd{$matches[5]}\"),\n        audio: audio\n      })\n    });\n    </script>\nEOF;\n\n}\n\n//评星回调\nfunction parseEvaluationCallback($matches)\n{\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        if($matches[5] > 5){\n            $matches[5] = '5';\n        }\n        else{\n           $matches[5] =  $matches[5];\n        }\n    return <<<EOF\n    <div class=\"ui {$attrs['type']} rating\" style=\"pointer-events: none;\" data-rating=\"$matches[5]\" data-max-rating=\"5\"></div>\nEOF;\n\n}\n//时间计划\nfunction parseTimePlanCallback($matches){\n    $matches[5] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[5]);\n    $matches[3] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[3]);\n    $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        if(empty($attrs['title'])){\n            $attrs['title'] = '我的时间计划表';\n        }\n       \n        $matches[5] = preg_replace(\"/\\[bstime time=\\\"(.*?)\\\"\\](.*?)\\[\\/bstime\\]/sm\",'<tr><td data-label=\"时间\">$1</td><td data-label=\"内容\">$2</td></tr>',$matches[5]);\n        $matches[5] = str_replace(\"<br />\",'',$matches[5]);\n        $matches[5] = preg_replace(\"/\\<br>/sm\",'',$matches[5]);\n    return <<<EOF\n    <div class=\"schedule-container\">\n        <div class=\"schedule-title\">{$attrs['title']}</div>\n        <table class=\"time-table\">\n            <thead>\n                <tr>\n                    <th class=\"time-column\">时间</th>\n                    <th>安排内容</th>\n                </tr>\n            </thead>\n            <tbody>\n      {$matches[5]}\n   </tbody>\n        </table>\n    </div>\nEOF;\n\n}\n\n//相册回调\nfunction parseGalleryCallback($matches)\n{\n    $matches[5] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[5]);\n    $matches[3] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[3]);\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        if(@$attrs['title'] == ''){\n            $attrs['title'] = '新建相册';\n        }\n        else{\n           $attrs['title'] = $attrs['title']; \n        }\n        $matches[5] = preg_replace(\"/\\[bsimg title=\\\"(.*?)\\\"\\](.*?)\\[\\/bsimg\\]/sm\",'<div class=\"slider__item\"><img class=\"slider__image lazyload lazyload-style-'.$options['Lazyload_style'].'\" '.lazyload(1).'src=\"$2\" alt=\"$1\"><div class=\"slider__info\"><font class=\"slider-raw\">$1</font></div></div>',$matches[5]);\n        $matches[5] = preg_replace(\"/\\<br>/sm\",'',$matches[5]);\n    return <<<EOF\n        <h1 class=\"bsn-title\">{$attrs['title']}</h1>\n\n<div class=\"slider\" x-data=\"{start: true, end: false}\">\n\n  <div class=\"slider__content\" x-ref=\"slider\" x-on:scroll.debounce=\"\\$refs.slider.scrollLeft == 0 ? start = true : start = false; Math.abs((\\$refs.slider.scrollWidth - \\$refs.slider.offsetWidth) - \\$refs.slider.scrollLeft) < 5 ? end = true : end = false;\">\n    {$matches[5]}\n  </div>\n  <div class=\"slider__nav\">\n    <button class=\"slider__nav__button\" x-on:click=\"\\$refs.slider.scrollBy({left: \\$refs.slider.offsetWidth * -1, behavior: 'smooth'});\" x-bind:class=\"start ? '' : 'slider__nav__button--active'\">后退</button>\n    <button class=\"slider__nav__button\" x-on:click=\"\\$refs.slider.scrollBy({left: \\$refs.slider.offsetWidth, behavior: 'smooth'});\" x-bind:class=\"end ? '' : 'slider__nav__button--active'\">前进</button>\n  </div>\n</div>\n\nEOF;\n\n}\n\n//相册回调2\nfunction parseGallery2Callback($matches)\n{\n    $matches[5] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[5]);\n    $matches[3] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[3]);\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        if(@$attrs['title'] == ''){\n            $attrs['title'] = '新建相册';\n        }\n        else{\n           $attrs['title'] = $attrs['title']; \n        }\n        $matches[5] = preg_replace(\"/\\[bsimg title=\\\"(.*?)\\\"\\](.*?)\\[\\/bsimg\\]/sm\",'<div href=\"$2\" class=\"slider__item\" data-fancybox=\"gallery\" data-caption=\"$1\"><img class=\"slider__image lazyload lazyload-style-'.$options['Lazyload_style'].'\" '.lazyload(1).'src=\"$2\" alt=\"$1\"><div class=\"slider__info\"></div></div>',$matches[5]);\n$matches[5] = preg_replace(\"/\\<br>/sm\",'',$matches[5]);\n    return <<<EOF\n    <h1 class=\"bsn-title\">{$attrs['title']}</h1>\n\n<div class=\"slider\" x-data=\"{start: true, end: false}\">\n\n  <div class=\"slider__content\" x-ref=\"slider\" x-on:scroll.debounce=\"\\$refs.slider.scrollLeft == 0 ? start = true : start = false; Math.abs((\\$refs.slider.scrollWidth - \\$refs.slider.offsetWidth) - \\$refs.slider.scrollLeft) < 5 ? end = true : end = false;\">\n    {$matches[5]}\n  </div>\n  <div class=\"slider__nav\">\n    <button class=\"slider__nav__button\" x-on:click=\"\\$refs.slider.scrollBy({left: \\$refs.slider.offsetWidth * -1, behavior: 'smooth'});\" x-bind:class=\"start ? '' : 'slider__nav__button--active'\">后退</button>\n    <button class=\"slider__nav__button\" x-on:click=\"\\$refs.slider.scrollBy({left: \\$refs.slider.offsetWidth, behavior: 'smooth'});\" x-bind:class=\"end ? '' : 'slider__nav__button--active'\">前进</button>\n  </div>\n</div>\n\nEOF;\n\n}\n\n//关于我历程解析标题\nfunction parseTimelineCallbackTitle($matches)\n{\n   return <<<EOF\n   {$matches[5]}\nEOF;\n}\n//关于我历程解析内容\nfunction parseTimelineCallbackDesc($matches)\n{\n   return <<<EOF\n            {$matches[5]}\nEOF;\n}\n//关于我历程解析\nfunction parseTimelineCallback($matches)\n{\n    $matches[5] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[5]);\n    $matches[3] = preg_replace(\"/<a href=.*?>(.*?)<\\/a>/\",'$1',$matches[3]);\n        $attr = htmlspecialchars_decode($matches[3]);\n        $attrs = shortcode_parse_atts($attr);\n        if(@$attrs['year'] == ''){\n            $attrs['year'] = '2023';\n        }\n        else{\n           $attrs['year'] = $attrs['year']; \n        }\n        if (strpos($matches[5], '[title') !== false) {\n            $pattern = get_shortcode_regex(array('title'));\n            $matches1 = preg_replace_callback(\"/$pattern/\", 'parseTimelineCallbackTitle', $matches[5]);\n            $pattern = get_shortcode_regex(array('desc'));\n            $matches1 = preg_replace(\"/$pattern/\", '', $matches1);\n    } \n    if (strpos($matches[5], '[desc') !== false) {\n            $pattern = get_shortcode_regex(array('desc'));\n            $matches2 = preg_replace_callback(\"/$pattern/\", 'parseTimelineCallbackDesc', $matches[5]);\n            $pattern = get_shortcode_regex(array('title'));\n            $matches2 = preg_replace(\"/$pattern/\", '', $matches2);\n    } \n    return <<<EOF\n    <div class=\"timeline-item\" date-is='{$attrs['year']}'>\n\t\t<h3>{$matches1}</h3>\n\t\t<p>\n\t\t\t{$matches2}\n\t\t</p>\n\t</div>\n\nEOF;\n\n}\n\nfunction ParseAboutMe($type = null){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    if($type == 'plan'){\n     $content = $options['aboutme_gh'];   \n    }\n    else{\n    $content = $options['aboutme_lc'];\n    }\n   if (strpos($content, '[timeline') !== false) {\n            $pattern = get_shortcode_regex(array('timeline'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseTimelineCallback', $content);\n    } \n    return $content;\n}\nfunction ParseCross($content){\n    $content = preg_replace('/\\<div class=\"comment-excerpta break\"\\>(.*?)\\<\\/div\\>/sm', '$1', $content);\n    $content = preg_replace('/\\<div class=\"comment-excerptb break\"\\>(.*?)\\<\\/div\\>/sm', '$1', $content);\n   if (strpos($content, '[bsimg') !== false) {\n        $content = preg_replace('/\\[bsimg\\](.*?)\\[\\/bsimg\\]/sm', '<a href=\"$1\" data-fancybox=\"single\"><img src=\"$1\" loading=\"lazy\" style=\"width:100%;max-width:100%\"></a>', $content);\n   }\n       //标注\n   if (strpos($content, '[bsmark') !== false) {\n        $content = preg_replace('/\\[bsmark\\](.*?)\\[\\/bsmark\\]/sm', '<mark class=\"text-highlight\">$1</mark>', $content);\n   }\n\n       //拼音\n    if (strpos($content, '[bsruby') !== false) {\n            $pattern = get_shortcode_regex(array('bsruby'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseRubyCallback', $content);\n        }\n        //相册\n    if (strpos($content, '[bsgallery') !== false) {\n            $pattern = get_shortcode_regex(array('bsgallery'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseGallery2Callback', $content);\n    }\n//时间计划表\n    if (strpos($content, '[bstimes') !== false) {\n            $pattern = get_shortcode_regex(array('bstimes'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseTimePlanCallback', $content);\n    }\n   return $content;\n}\n\nfunction ShortCodePage($post,$title,$remember,$cid,$login,$articletype,$modetype='noreadmode'){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $requireModeration = Helper::options()->commentsRequireModeration;\n    $content = $post;\n    $alt = '';\n    if($options['article_imgalt'] == '1'){\n        $alt = '<div class=\"imgalt\">$2</div>';\n    }\n    if($articletype == 'common_Mode' || empty($articletype)){\n    //相册\n    if (strpos($content, '[bsgallery') !== false) {\n            $pattern = get_shortcode_regex(array('bsgallery'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseGalleryCallback', $content);\n    }\n    else{\n           \n    if ($options['Lightbox'] == '1' || $options['Watermark'] == '1'){\n    $pattern = '/\\<img.*?src\\=\\\"(.*?)\\\"[^>]*>/i';\n   \n $replacement = '\n<img data-fancybox=\"image\" data-caption=\"$2\" class=\"bearmark lazyload lazyload-style-'.$options['Lazyload_style'].'\" '.lazyload(1).'src=\"$1\"   alt=\"'.$title.'\" title=\"点击放大图片\">'.$alt; \n    $content = preg_replace($pattern, $replacement, $content);\n   \n\n    }\n    \n        \n    }\n    \n    if (strpos($content, '[e') !== false) {\n        $content = str_replace('[e]', \"\", $content);\n   }\n    //进度条\n    if (strpos($content, '[bsprog') !== false) {\n            $pattern = get_shortcode_regex(array('bsprog'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseProgressCallback', $content);\n    }\n    //日期倒计时进度条\n    if (strpos($content, '[bsdate') !== false) {\n            $pattern = get_shortcode_regex(array('bsdate'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseDateProgressCallback', $content);\n    }\n     //Audio\n    if (strpos($content, '[bsaudio') !== false) {\n            $pattern = get_shortcode_regex(array('bsaudio'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseAudioCallback', $content);\n    }\n    //tag\n    if (strpos($content, '[bstag') !== false || strpos($content, '[tag') !== false) {\n            $pattern = get_shortcode_regex(array('bstag','tag'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseTagCallback', $content);\n    }\n     //音乐歌单\n    if (strpos($content, '[bsmusic') !== false) {\n        if($modetype == 'noreadmode'){\n            $pattern = get_shortcode_regex(array('bsmusic'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseMusicCallback', $content);\n        }\n        else{\n            $pattern = get_shortcode_regex(array('bsmusic'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseMusicRdCallback', $content);\n        }\n    }\n    //opc\n    \n    if (strpos($content, '[bsopc') !== false) {\n            $pattern = get_shortcode_regex(array('bsopc'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseOpcCallback', $content);\n    }\n    //kbd\n    \n    if (strpos($content, '[bskbd') !== false) {\n            $pattern = get_shortcode_regex(array('bskbd'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseKbdCallback', $content);\n    }\n    //tabs\n    \n    if (strpos($content, '[bstabs') !== false) {\n            $pattern = get_shortcode_regex(array('bstabs'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseTabsCallback', $content);\n    }\n    //评星\n    if (strpos($content, '[bseva') !== false) {\n            $pattern = get_shortcode_regex(array('bseva'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseEvaluationCallback', $content);\n    }\n    //文字提示\n    if (strpos($content, '[bstip') !== false) {\n            $pattern = get_shortcode_regex(array('bstip'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseTipCallback', $content);\n    }\n    //Bframe\n    if (strpos($content, '[bsfra') !== false) {\n            $pattern = get_shortcode_regex(array('bsfra'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseBsfraCallback', $content);\n    }\n    //Bplayer\n    if (strpos($content, '[bsplayer') !== false) {\n            $pattern = get_shortcode_regex(array('bsplayer'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parsePlayerCallback', $content);\n    }\n     //Bmp3\n    if (strpos($content, '[bsplayer') !== false) {\n            $pattern = get_shortcode_regex(array('bsmp3'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseMp3Callback', $content);\n    }\n    //Github库\n    if (strpos($content, '[bsgit') !== false) {\n            $pattern = get_shortcode_regex(array('bsgit'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseGithubCallback', $content);\n        }\n    //拼音\n    if (strpos($content, '[bsruby') !== false) {\n            $pattern = get_shortcode_regex(array('bsruby'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseRubyCallback', $content);\n        }\n        \n\n    //标注\n   if (strpos($content, '[bsmark') !== false) {\n        $content = preg_replace('/\\[bsmark\\](.*?)\\[\\/bsmark\\]/sm', '<mark class=\"text-highlight\">$1</mark>', $content);\n   }\n   //TOC\n   if ($options['Scroll'] == true){\n         $pattern = \"/^<h1>(.*?)<\\/h1>$/\";\n $replacement = '<h1 id=\"$1\">$1</h1>'; \n $pattern = \"/^<h2>(.*?)<\\/h2>$/\";\n $replacement = '<h2 id=\"$1\">$1</h2>'; \n $pattern = \"/^<h3>(.*?)<\\/h3>$/\";\n $replacement = '<h3 id=\"$1\">$1</h3>'; \n $pattern = \"/^<h4>(.*?)<\\/h4>$/\";\n $replacement = '<h4 id=\"$1\">$1</h4>';\n $pattern = \"/^<h5>(.*?)<\\/h5>$/\";\n $replacement = '<h5 id=\"$1\">$1</h5>';\n $pattern = \"/^<h6>(.*?)<\\/h6>$/\";\n $replacement = '<h6 id=\"$1\">$1</h6>';\n    $content = preg_replace($pattern, $replacement, $content);\n   }\n    //解析显示按钮短代码\n    if (strpos($content, '[bsbtn') !== false) {\n            $pattern = get_shortcode_regex(array('bsbtn'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseButtonCallback', $content);\n        }\n    \n    //解析显示信息提示框短代码\n    if (strpos($content, '[bsmessage') !== false) {\n            $pattern = get_shortcode_regex(array('bsmessage'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseMessageCallback', $content);\n        }\n        \n    //引用文章\n    if (strpos($content, '[bspost') !== false) {\n            $pattern = get_shortcode_regex(array('bspost'));\n            $content = preg_replace_callback(\"/$pattern/\", 'quotePostCallback', $content);\n        }\n     //点击复制内容\n    if (strpos($content, '[bscopy') !== false) {\n            $pattern = get_shortcode_regex(array('bscopy'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseCopyCallback', $content);\n        }\n    //60s\n    if (strpos($content, '[bspaper') !== false) {\n            $pattern = get_shortcode_regex(array('bspaper'));\n            $content = preg_replace_callback(\"/$pattern/\", 'quotebspaperCallback', $content);\n        }\n        \n    //登录可见\n            if (strpos($content, '[bslogin') !== false) {\n                $pattern = get_shortcode_regex(array('bslogin'));\n                \n                $content = preg_replace_callback(\"/$pattern/\", function ($matches) use ($login,$options) {\n                    if ($matches[1] == '[' && $matches[6] == ']') {\n                        return substr($matches[0], 1, -1);\n                    }\n                    if ($login) {\n                         return '<div class=\"ui floating message\">'.$matches[5].'</div>';\n                    } else {\n                        $r = empty($options['globalTips']['articleHideAfterLogin_Tip'])? '<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>此处内容需要登录后方可阅读。</div>' : '<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>'.$options['globalTips']['articleHideAfterLogin_Tip'].'</div>';\n                      return $r;\n                    }\n                }, $content);\n            }\n    //登录或回复后可见\n            if (strpos($content, '[bshide') !== false) {\n                $pattern = get_shortcode_regex(array('bshide'));\n                $db = Typecho_Db::get();\n        $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $cid)->where('status = ?', 'approved')->where('mail = ?', $remember)->limit(1));\n        if(count($hasComment) !== 0){\n            $hasComments = count($hasComment);\n        }\n        else{\n            $hasComments = 0;\n        }\n                $content = preg_replace_callback(\"/$pattern/\", function ($matches) use ($login,$hasComments,$options,$requireModeration) {\n                    if ($matches[1] == '[' && $matches[6] == ']') {\n                        return substr($matches[0], 1, -1);\n                    }\n                    if ($login || $hasComments !== 0) {\n                         return '<div class=\"ui floating message\">'.$matches[5].'</div>';\n                    } \n                    if(!$options['globalTips']['articleHideAfterComment_Tip'] && $requireModeration == true){\n                    return '<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>此处内容需要登录或评论(审核通过)后方可阅读。</div>';    \n                    }\n                    if(!$options['globalTips']['articleHideAfterComment_Tip'] && $requireModeration == false){\n                    return '<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>此处内容需要登录或评论后方可阅读。</div>';    \n                    }\n                    if(!empty($options['globalTips']['articleHideAfterComment_Tip'])){ \n                        return '<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>'.$options['globalTips']['articleHideAfterComment_Tip'].'</div>';\n                    }\n                }, $content);\n            }\n    //回复可见\n    if (strpos($content, '{bs-hide') !== false) {\n        $db = Typecho_Db::get();\n        $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $cid)->where('mail = ?', $remember)->limit(1));\n\n        if ($hasComment||$login) {\n           $content = preg_replace(\"/\\{bs-hide\\}(.*?)\\{\\/bs-hide\\}/sm\",'<div class=\"ui floating message\">$1</div>',$post);\n        } else {\n            $content = preg_replace(\"/\\{bs-hide\\}(.*?)\\{\\/bs-hide\\}/sm\",'<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>此处内容需要登录或评论后方可阅读。</div>',$post);\n        }\n    }\n    //兼容1.6.3版本前的回复可见短代码\n    if (strpos($content, '[bs-hide') !== false) {\n        $db = Typecho_Db::get();\n        $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $cid)->where('mail = ?', $remember)->limit(1));\n\n        if ($hasComment||$login) {\n           $content = preg_replace(\"/\\[bs-hide\\](.*?)\\[\\/bs-hide\\]/sm\",'<div class=\"ui floating message\">$1</div>',$post);\n        } else {\n            $content = preg_replace(\"/\\[bs-hide\\](.*?)\\[\\/bs-hide\\]/sm\",'<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>此处内容需要登录或评论后方可阅读。</div>',$post);\n        }\n    }\n    //Todolist\n    if (strpos($content, '{bs-todo') !== false) {\n        if (strpos($content, '{bs-todo type=true') !== false) {\n        $content = preg_replace('/\\{bs-todo type=true\\}(.*?)\\{\\/bs-todo\\}/sm', '<div class=\"ui checked checkbox\"><input type=\"checkbox\" checked=\"\" disabled><label>$1</label></div>', $content);\n        }\n        if (strpos($content, '{bs-todo type=false') !== false) {\n        $content = preg_replace('/\\{bs-todo type=false\\}(.*?)\\{\\/bs-todo\\}/sm', '<div class=\"ui  checkbox\"><input type=\"checkbox\" disabled><label>$1</label></div>', $content);\n        }\n    }\n       //Todolist New\n    if (strpos($content, '[todo') !== false) {\n        if (strpos($content, '[todo-t') !== false) {\n        $content = preg_replace('/\\[todo-t\\](.*?)\\[\\/todo-t\\]/sm', '<div class=\"ui checked checkbox\"><input type=\"checkbox\" checked=\"\" disabled><label>$1</label></div>', $content);\n        }\n        if (strpos($content, '[todo-f') !== false) {\n        $content = preg_replace('/\\[todo-f\\](.*?)\\[\\/todo-f\\]/sm', '<div class=\"ui  checkbox\"><input type=\"checkbox\" disabled><label>$1</label></div>', $content);\n        }\n    }\n    \n    \n    //手风琴\n    if (strpos($content, '{bs-accord') !== false) {\n        if (strpos($content, '{bs-accord style=line') !== false) {\n        $content = preg_replace('/\\{bs-accord style=line title=(.*?)\\}(.*?)\\{\\/bs-accord\\}/sm', '<div class=\"ui accordion\"><div class=\"title\"><i class=\"dropdown icon\"></i>$1</div><div class=\"content\"><p class=\"transition hidden\">$2</p></div></div>', $content);\n        }\n        if (strpos($content, '{bs-accord style=common') !== false) {\n                $content = preg_replace('/\\{bs-accord style=common title=(.*?)\\}(.*?)\\{\\/bs-accord\\}/sm', '<div class=\"ui styled fluid accordion\"><div class=\"title\"><i class=\"dropdown icon\"></i>$1</div><div class=\"content\"><p class=\"transition hidden\">$2</p></div></div>', $content);\n        }\n    }\n    \n    //Github卡片\n    if (strpos($content, '{bs-card') !== false) {\n        if (strpos($content, '{bs-card type=github') !== false) {\n            $url = preg_replace('/\\{bs-card type=github projectname=(.*?) projectdec=(.*?) projecturl=(.*?)\\}{\\/bs-card\\}/sm', '$3', $content);\n        $content = preg_replace('/\\{bs-card type=github projectname=(.*?) projectdec=(.*?) projecturl=(.*?)\\}{\\/bs-card\\}/sm', '<div class=\"ui relaxed divided list\"><div class=\"item\"><i class=\"large github middle aligned icon\"></i><div class=\"content\"><a class=\"header\" href=\"https://$3\">$1</a><div class=\"description\">$2</div></div></div></div>', $content);\n        }\n    }\n   \n\n   \n   //字体颜色\n   if (strpos($content, '{bs-font') !== false) {\n        $content = preg_replace('/\\{bs-font color=(.*?)\\}(.*?)\\{\\/bs-font\\}/sm', '<font color=$1>$2</font>', $content);\n   }\n    //iframe\n   if (strpos($content, '{bs-iframe') !== false) {\n        $content = preg_replace('/\\{bs-iframe\\}(.*?)\\{\\/bs-iframe\\}/sm', '<div class=\"iframe\"><iframe class=\"iframe_video\" src=\"$1\" scrolling=\"yes\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"></iframe></div>', $content);\n        $content = preg_replace('/\\<iframe class=\"iframe_video\" src=\"<a href=\"(.*?)\">(.*?)<\\/a>\" scrolling=\"yes\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"><\\/iframe>/sm', '<iframe class=\"iframe_video\" src=\"$1\" scrolling=\"yes\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"></iframe>', $content);\n   }\n   \n\n    if(strpos($content,'- [x]')!==false||strpos($content,'- [ ]')!==false){\n            $attributes = array(\"style\"=>\"list-style: none;\");\n            $content = str_replace(array('- [x]','- [ ]'), array(\n                '<input type=\"checkbox\" checked=\"true\" disabled=\"true\">',\n                '<input type=\"checkbox\" disabled=\"true\">',\n            ), $content);\n        }\n    if(strpos($content,'-[x]')!==false||strpos($content,'-[ ]')!==false){\n            $attributes = array(\"style\"=>\"list-style: none;\");\n            $content = str_replace(array('-[x]','-[ ]'), array(\n                '<input type=\"checkbox\" checked=\"true\" disabled=\"true\">',\n                '<input type=\"checkbox\" disabled=\"true\">',\n            ), $content);\n        }\n        if(strpos($content,'[x]')!==false||strpos($content,'[ ]')!==false){\n            $attributes = array(\"style\"=>\"list-style: none;\");\n            $content = str_replace(array('[x]','[ ]'), array(\n                '<input type=\"checkbox\" checked=\"true\" disabled=\"true\">',\n                '<input type=\"checkbox\" disabled=\"true\">',\n            ), $content);\n        }\n        \n        //判断是否为外链并判断是否新窗口打开\n        $content = preg_replace_callback(\"/<a href=\\\"(.*?)\\\">(.*?)<\\/a>/is\", function ($matches){\n           $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n           $optionss = Helper::options();\n            if (strpos($matches[1],$optionss->siteUrl) !== false || strpos(substr($matches[1],0,6),\"http\") === false){\n                return '<a class=\"link-post\"  href=\"'.$matches[1].'\"><i class=\"fas fa-external-link-alt\"></i>'.$matches[2].'</a>';\n            }else{\n                if ($options['Link_blank']== '2'){\n                return '<a class=\"link-post\"  href=\"'.$matches[1].'\" target=\"_blank\"><i class=\"fas fa-external-link-alt\"></i>'.$matches[2].\"</a>\";\n                }\n                else{\n                return '<a class=\"link-post\" href=\"'.$matches[1].'\"><i class=\"fas fa-external-link-alt\"></i>'.$matches[2].\"</a>\";     \n                }\n            }\n        }, $content);\n        \n    }\n    else{\n        if ($options['Lightbox'] == '1' || $options['Watermark'] == '1'){\n        $pattern = '/<\\s*img[\\s\\S]+?(?:src=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|alt=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|[a-z]+=[\\'\"][\\S\\s]*?[\\'\"]\\s*)+[\\s\\S]*?>/i';\n   \n  $replacement = '\n <div class=\"masonry-brick\">\n      <img data-fancybox=\"image\" data-caption=\"$2\" '.lazyload(1).'src=\"$1\" class=\"'.$mark.' lazyload lazyload-style-'.$options['Lazyload_style'].'\"   alt=\"$2\" title=\"点击放大图片\"></div>\n   '; \n    $content = preg_replace($pattern, $replacement, $content);\n   \n\n    }\n    else{\n        $pattern = '/<\\s*img[\\s\\S]+?(?:src=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|alt=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|[a-z]+=[\\'\"][\\S\\s]*?[\\'\"]\\s*)+[\\s\\S]*?>/i';\n   \n $replacement = '\n <div class=\"masonry-brick\">\n      <img '.lazyload().'src=\"$1\"   alt=\"$2\" title=\"点击放大图片\">\n    </div>'; \n    $content = preg_replace($pattern, $replacement, $content);\n    }\n    \n    }\n\n   \n   if($articletype == 'pic_Mode'){\n    $content = \"<div class=\\\"masonry-container\\\"><div class=\\\"masonry-columns\\\">\".preg_replace(\"/<p.*?>|<\\/p>|<br.*?>/is\",\"\", $content).\"</div></div>\";\n   }\n   if($modetype == 'noreadmode'){\n       \n    $content = \"<div id=\\\"bearsimple-images\\\">\".$content.\"</div>\";\n   }\n   else{\n\n       $content = \"<div id=\\\"bearsimple-images-readmode\\\">\".$content.\"</div>\";\n   }\n   /**添加目录树识别(弃用)\n   if(preg_match('/<h([1-6])(.*?)>(.*?)<\\/h\\1>/i',$content)){\n       \n   }\n   **/\n    return $content;\n}\n\nfunction ShortCode($post,$t,$login,$articletype,$modetype='noreadmode'){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n     $requireModeration = Helper::options()->commentsRequireModeration;\n    $content = $post;\n    $alt = '';\n    if($options['article_imgalt'] == '1'){\n        $alt = '<div class=\"imgalt\">$2</div>';\n    }\n     if($modetype == 'noreadmode'){\n            $mark = 'bearmark';\n            \n   $content = preg_replace_callback('/\\bfn(ref|)-(\\d+)\\b/', function($matches) {\n    return 'bs' . ($matches[1] ? 'fnref' : 'fn') . '-' . $matches[2];\n}, $content);\n\n$content = preg_replace(\n    ['/href=\"#fn(ref|)-(\\d+)\"/', '/href=\"\\/?[^\"]*#fn(ref|)-(\\d+)\"/'],\n    'href=\"#bsfn${1}-${2}\"',\n    $content\n);\n        }\n        else{\n    $content = preg_replace_callback('/\\bfn(ref|)-(\\d+)\\b/', function($matches) {\n    return 'bsread' . ($matches[1] ? 'fnref' : 'fn') . '-' . $matches[2];\n}, $content);\n\n$content = preg_replace(\n    ['/href=\"#fn(ref|)-(\\d+)\"/', '/href=\"\\/?[^\"]*#fn(ref|)-(\\d+)\"/'],\n    'href=\"#bsreadfn${1}-${2}\"',\n    $content\n);\n           $mark = 'bearmarkread';\n        }\n    if($articletype == 'common_Mode' || empty($articletype)){\n   \n    //相册\n    if (strpos($content, '[bsgallery') !== false) {\n            $pattern = get_shortcode_regex(array('bsgallery'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseGalleryCallback', $content);\n    }\n    else{\n           \n    if ($options['Lightbox'] == '1' || $options['Watermark'] == '1'){\n    $pattern = '/<\\s*img[\\s\\S]+?(?:src=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|alt=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|[a-z]+=[\\'\"][\\S\\s]*?[\\'\"]\\s*)+[\\s\\S]*?>/i';\n   \n $replacement = '\n<img data-fancybox=\"image\" data-caption=\"$2\" class=\"pure-img '.$mark.' lazyload lazyload-style-'.$options['Lazyload_style'].'\" '.lazyload(1).'src=\"$1\"  alt=\"$2\" title=\"点击放大图片\">'.$alt; \n    $content = preg_replace($pattern, $replacement, $content);\n   \n\n    }\n    else{\n        $pattern = '/<\\s*img[\\s\\S]+?(?:src=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|alt=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|[a-z]+=[\\'\"][\\S\\s]*?[\\'\"]\\s*)+[\\s\\S]*?>/i';\n   \n $replacement = '\n<img class=\"pure-img lazyload lazyload-style-'.$options['Lazyload_style'].'\" '.lazyload(1).'src=\"$1\"   alt=\"$2\" title=\"$2\">'.$alt; \n    $content = preg_replace($pattern, $replacement, $content);\n    }\n        \n    }\n    \n        //TOC 正则H标签替换，有点懒直接这样写快一点\n   if ($options['Scroll'] == true){\n   $pattern = \"/^<h1>(.*?)<\\/h1>$/\";\n $replacement = '<h1 id=\"$1\">$1</h1>'; \n $pattern = \"/^<h2>(.*?)<\\/h2>$/\";\n $replacement = '<h2 id=\"$1\">$1</h2>'; \n $pattern = \"/^<h3>(.*?)<\\/h3>$/\";\n $replacement = '<h3 id=\"$1\">$1</h3>'; \n $pattern = \"/^<h4>(.*?)<\\/h4>$/\";\n $replacement = '<h4 id=\"$1\">$1</h4>';\n $pattern = \"/^<h5>(.*?)<\\/h5>$/\";\n $replacement = '<h5 id=\"$1\">$1</h5>';\n $pattern = \"/^<h6>(.*?)<\\/h6>$/\";\n $replacement = '<h6 id=\"$1\">$1</h6>';\n    $content = preg_replace($pattern, $replacement, $content);\n   }\n    if (strpos($content, '[e') !== false) {\n        $content = str_replace('[e]', \"\", $content);\n   }\n   //时间计划表\n    if (strpos($content, '[bstimes') !== false) {\n            $pattern = get_shortcode_regex(array('bstimes'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseTimePlanCallback', $content);\n    }\n   \n    //进度条\n    if (strpos($content, '[bsprog') !== false) {\n            $pattern = get_shortcode_regex(array('bsprog'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseProgressCallback', $content);\n    }\n    //日期倒计时进度条\n    if (strpos($content, '[bsdate') !== false) {\n            $pattern = get_shortcode_regex(array('bsdate'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseDateProgressCallback', $content);\n    }\n\n     //Audio\n    if (strpos($content, '[bsaudio') !== false) {\n            $pattern = get_shortcode_regex(array('bsaudio'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseAudioCallback', $content);\n    }\n    //tag\n    if (strpos($content, '[bstag') !== false || strpos($content, '[tag') !== false) {\n            $pattern = get_shortcode_regex(array('bstag','tag'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseTagCallback', $content);\n    }\n\n    //音乐歌单\n    if (strpos($content, '[bsmusic') !== false) {\n        if($modetype == 'noreadmode'){\n            $pattern = get_shortcode_regex(array('bsmusic'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseMusicCallback', $content);\n        }\n        else{\n            $pattern = get_shortcode_regex(array('bsmusic'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseMusicRdCallback', $content);\n        }\n    }\n    //opc\n    \n    if (strpos($content, '[bsopc') !== false) {\n            $pattern = get_shortcode_regex(array('bsopc'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseOpcCallback', $content);\n    }\n    \n    //kbd\n    if (strpos($content, '[bskbd') !== false) {\n            $pattern = get_shortcode_regex(array('bskbd'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseKbdCallback', $content);\n    }\n    //文字提示\n    if (strpos($content, '[bstip') !== false) {\n            $pattern = get_shortcode_regex(array('bstip'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseTipCallback', $content);\n    }\n    //tabs\n    \n    if (strpos($content, '[bstabs') !== false) {\n            $pattern = get_shortcode_regex(array('bstabs'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseTabsCallback', $content);\n    }\n    //评星\n    if (strpos($content, '[bseva') !== false) {\n            $pattern = get_shortcode_regex(array('bseva'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseEvaluationCallback', $content);\n    }\n    //Bframe\n    if (strpos($content, '[bsfra') !== false) {\n            $pattern = get_shortcode_regex(array('bsfra'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseBsfraCallback', $content);\n    }\n    //Bplayer\n    if (strpos($content, '[bsplayer') !== false) {\n            $pattern = get_shortcode_regex(array('bsplayer'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parsePlayerCallback', $content);\n    }\n    //Bmp3\n    if (strpos($content, '[bsmp3') !== false) {\n            $pattern = get_shortcode_regex(array('bsmp3'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseMp3Callback', $content);\n    }\n    //Github库\n    if (strpos($content, '[bsgit') !== false) {\n            $pattern = get_shortcode_regex(array('bsgit'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseGithubCallback', $content);\n        }\n    //拼音\n    if (strpos($content, '[bsruby') !== false) {\n            $pattern = get_shortcode_regex(array('bsruby'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseRubyCallback', $content);\n        }\n        //60s\n    if (strpos($content, '[bspaper') !== false) {\n            $pattern = get_shortcode_regex(array('bspaper'));\n            $content = preg_replace_callback(\"/$pattern/\", 'quotebspaperCallback', $content);\n        }\n\n    //标注\n   if (strpos($content, '[bsmark') !== false) {\n        $content = preg_replace('/\\[bsmark\\](.*?)\\[\\/bsmark\\]/sm', '<mark class=\"text-highlight\">$1</mark>', $content);\n   }\n   \n   //点击复制内容\n    if (strpos($content, '[bscopy') !== false) {\n            $pattern = get_shortcode_regex(array('bscopy'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseCopyCallback', $content);\n        }\n        \n\n  \n    //解析显示按钮短代码\n    if (strpos($content, '[bsbtn') !== false) {\n           $pattern = get_shortcode_regex(array('bsbtn'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseButtonCallback', $content);\n        }\n    \n    //解析显示信息提示框短代码\n    if (strpos($content, '[bsmessage') !== false) {\n            $pattern = get_shortcode_regex(array('bsmessage'));\n            $content = preg_replace_callback(\"/$pattern/\", 'parseMessageCallback', $content);\n        }\n        \n    //引用文章\n    if (strpos($content, '[bspost') !== false) {\n            $pattern = get_shortcode_regex(array('bspost'));\n            $content = preg_replace_callback(\"/$pattern/\", 'quotePostCallback', $content);\n        }\n    \n    //登录可见\n    if (strpos($content, '[bslogin') !== false) {\n                $pattern = get_shortcode_regex(array('bslogin'));\n                $content = preg_replace_callback(\"/$pattern/\", function ($matches) use ($login,$options) {\n                    if ($matches[1] == '[' && $matches[6] == ']') {\n                        return substr($matches[0], 1, -1);\n                    }\n                    if ($login) {\n                         return '<div class=\"ui floating message\">'.$matches[5].'</div>';\n                    } else {\n                        $r = empty($options['globalTips']['articleHideAfterLogin_Tip'])? '<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>此处内容需要登录后方可阅读。</div>' : '<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>'.$options['globalTips']['articleHideAfterLogin_Tip'].'</div>';\n                      return $r;\n                    }\n                }, $content);\n            }\n           \n    //登录或回复后可见\n            if (strpos($content, '[bshide') !== false) {\n                $pattern = get_shortcode_regex(array('bshide'));\n                $db = Typecho_Db::get();\n        $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $t->cid)->where('status = ?', 'approved')->where('mail = ?', $t->remember('mail', true))->limit(1));\n        if(count($hasComment) !== 0){\n            $hasComments = count($hasComment);\n        }\n        else{\n            $hasComments = 0;\n        }\n                $content = preg_replace_callback(\"/$pattern/\", function ($matches) use ($login,$hasComments,$options,$requireModeration) {\n                    if ($matches[1] == '[' && $matches[6] == ']') {\n                        return substr($matches[0], 1, -1);\n                    }\n                    if ($login || $hasComments !== 0) {\n                         return '<div class=\"ui floating message\">'.$matches[5].'</div>';\n                    } \n                    if(!$options['globalTips']['articleHideAfterComment_Tip'] && $requireModeration == true){\n                    return '<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>此处内容需要登录或评论(审核通过)后方可阅读。</div>';    \n                    }\n                    if(!$options['globalTips']['articleHideAfterComment_Tip'] && $requireModeration == false){\n                    return '<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>此处内容需要登录或评论后方可阅读。</div>';    \n                    }\n                    if(!empty($options['globalTips']['articleHideAfterComment_Tip'])){ \n                        return '<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>'.$options['globalTips']['articleHideAfterComment_Tip'].'</div>';\n                    }\n                }, $content);\n            }\n    //回复可见\n    if (strpos($content, '{bs-hide') !== false) {\n        $db = Typecho_Db::get();\n        $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $t->cid)->where('mail = ?', $t->remember('mail', true))->limit(1));\n\n        if ($hasComment||$login) {\n           $content = preg_replace(\"/\\{bs-hide\\}(.*?)\\{\\/bs-hide\\}/sm\",'<div class=\"ui floating message\">$1</div>',$post);\n        } else {\n            $content = preg_replace(\"/\\{bs-hide\\}(.*?)\\{\\/bs-hide\\}/sm\",'<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>此处内容需要登录或评论后方可阅读。</div>',$post);\n        }\n    }\n    //兼容1.6.3版本前的回复可见短代码\n    if (strpos($content, '[bs-hide') !== false) {\n        $db = Typecho_Db::get();\n        $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $t->cid)->where('mail = ?', $t->remember('mail', true))->limit(1));\n\n        if ($hasComment||$login) {\n           $content = preg_replace(\"/\\[bs-hide\\](.*?)\\[\\/bs-hide\\]/sm\",'<div class=\"ui floating message\">$1</div>',$post);\n        } else {\n            $content = preg_replace(\"/\\[bs-hide\\](.*?)\\[\\/bs-hide\\]/sm\",'<div class=\"ui floating message\"><i class=\"thumbtack icon\"></i>此处内容需要登录或评论后方可阅读。</div>',$post);\n        }\n    }\n    //Todolist\n    if (strpos($content, '{bs-todo') !== false) {\n        if (strpos($content, '{bs-todo type=true') !== false) {\n        $content = preg_replace('/\\{bs-todo type=true\\}(.*?)\\{\\/bs-todo\\}/sm', '<div class=\"ui checked checkbox\"><input type=\"checkbox\" checked=\"\" disabled><label>$1</label></div>', $content);\n        }\n        if (strpos($content, '{bs-todo type=false') !== false) {\n        $content = preg_replace('/\\{bs-todo type=false\\}(.*?)\\{\\/bs-todo\\}/sm', '<div class=\"ui  checkbox\"><input type=\"checkbox\" disabled><label>$1</label></div>', $content);\n        }\n    }\n       //Todolist New\n    if (strpos($content, '[todo') !== false) {\n        if (strpos($content, '[todo-t') !== false) {\n        $content = preg_replace('/\\[todo-t\\](.*?)\\[\\/todo-t\\]/sm', '<div class=\"ui checked checkbox\"><input type=\"checkbox\" checked=\"\" disabled><label>$1</label></div>', $content);\n        }\n        if (strpos($content, '[todo-f') !== false) {\n        $content = preg_replace('/\\[todo-f\\](.*?)\\[\\/todo-f\\]/sm', '<div class=\"ui  checkbox\"><input type=\"checkbox\" disabled><label>$1</label></div>', $content);\n        }\n    }\n    \n    \n    //手风琴\n    if (strpos($content, '{bs-accord') !== false) {\n        if (strpos($content, '{bs-accord style=line') !== false) {\n        $content = preg_replace('/\\{bs-accord style=line title=(.*?)\\}(.*?)\\{\\/bs-accord\\}/sm', '<div class=\"ui accordion\"><div class=\"title\"><i class=\"dropdown icon\"></i>$1</div><div class=\"content\"><p class=\"transition hidden\">$2</p></div></div>', $content);\n        }\n        if (strpos($content, '{bs-accord style=common') !== false) {\n                $content = preg_replace('/\\{bs-accord style=common title=(.*?)\\}(.*?)\\{\\/bs-accord\\}/sm', '<div class=\"ui styled fluid accordion\"><div class=\"title\"><i class=\"dropdown icon\"></i>$1</div><div class=\"content\"><p class=\"transition hidden\">$2</p></div></div>', $content);\n        }\n    }\n    \n    //Github卡片\n    if (strpos($content, '{bs-card') !== false) {\n        if (strpos($content, '{bs-card type=github') !== false) {\n            $url = preg_replace('/\\{bs-card type=github projectname=(.*?) projectdec=(.*?) projecturl=(.*?)\\}{\\/bs-card\\}/sm', '$3', $content);\n        $content = preg_replace('/\\{bs-card type=github projectname=(.*?) projectdec=(.*?) projecturl=(.*?)\\}{\\/bs-card\\}/sm', '<div class=\"ui relaxed divided list\"><div class=\"item\"><i class=\"large github middle aligned icon\"></i><div class=\"content\"><a class=\"header\" href=\"https://$3\">$1</a><div class=\"description\">$2</div></div></div></div>', $content);\n        }\n    }\n   \n\n   \n   //字体颜色\n   if (strpos($content, '{bs-font') !== false) {\n        $content = preg_replace('/\\{bs-font color=(.*?)\\}(.*?)\\{\\/bs-font\\}/sm', '<font color=$1>$2</font>', $content);\n   }\n    //iframe\n   if (strpos($content, '{bs-iframe') !== false) {\n        $content = preg_replace('/\\{bs-iframe\\}(.*?)\\{\\/bs-iframe\\}/sm', '<div class=\"iframe\"><iframe class=\"iframe_video\" src=\"$1\" scrolling=\"yes\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"></iframe></div>', $content);\n        $content = preg_replace('/\\<iframe class=\"iframe_video\" src=\"<a href=\"(.*?)\">(.*?)<\\/a>\" scrolling=\"yes\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"><\\/iframe>/sm', '<iframe class=\"iframe_video\" src=\"$1\" scrolling=\"yes\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"></iframe>', $content);\n   }\n   \n\n    if(strpos($content,'- [x]')!==false||strpos($content,'- [ ]')!==false){\n            $attributes = array(\"style\"=>\"list-style: none;\");\n            $content = str_replace(array('- [x]','- [ ]'), array(\n                '<input type=\"checkbox\" checked=\"true\" disabled=\"true\">',\n                '<input type=\"checkbox\" disabled=\"true\">',\n            ), $content);\n        }\n    if(strpos($content,'-[x]')!==false||strpos($content,'-[ ]')!==false){\n            $attributes = array(\"style\"=>\"list-style: none;\");\n            $content = str_replace(array('-[x]','-[ ]'), array(\n                '<input type=\"checkbox\" checked=\"true\" disabled=\"true\">',\n                '<input type=\"checkbox\" disabled=\"true\">',\n            ), $content);\n        }\n        if(strpos($content,'[x]')!==false||strpos($content,'[ ]')!==false){\n            $attributes = array(\"style\"=>\"list-style: none;\");\n            $content = str_replace(array('[x]','[ ]'), array(\n                '<input type=\"checkbox\" checked=\"true\" disabled=\"true\">',\n                '<input type=\"checkbox\" disabled=\"true\">',\n            ), $content);\n        }\n        \n        //判断是否为外链并判断是否新窗口打开\n        $content = preg_replace_callback(\"/<a href=\\\"(.*?)\\\">(.*?)<\\/a>/is\", function ($matches){\n           $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n           $optionss = Helper::options();\n            if (strpos($matches[1],$optionss->siteUrl) !== false || strpos(substr($matches[1],0,6),\"http\") === false){\n                return '<a class=\"link-post\"  href=\"'.$matches[1].'\"><i class=\"fas fa-external-link-alt\"></i>'.$matches[2].'</a>';\n            }else{\n                if ($options['Link_blank']== '2'){\n                return '<a class=\"link-post\"  href=\"'.$matches[1].'\" target=\"_blank\"><i class=\"fas fa-external-link-alt\"></i>'.$matches[2].\"</a>\";\n                }\n                else{\n                return '<a class=\"link-post\" href=\"'.$matches[1].'\"><i class=\"fas fa-external-link-alt\"></i>'.$matches[2].\"</a>\";     \n                }\n            }\n        }, $content);\n        \n    }\n    else{\n        \n        if ($options['Lightbox'] == '1' || $options['Watermark'] == '1'){\n    $pattern = '/<\\s*img[\\s\\S]+?(?:src=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|alt=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|[a-z]+=[\\'\"][\\S\\s]*?[\\'\"]\\s*)+[\\s\\S]*?>/i';\n   if($modetype == 'noreadmode'){\n            $mark = 'bearmark';\n        }\n        else{\n           $mark = 'bearmarkread';\n        }\n $replacement = '\n <div class=\"masonry-brick\">\n      <img data-fancybox=\"image\" data-caption=\"$2\" '.lazyload(1).'src=\"$1\" class=\"'.$mark.' lazyload lazyload-style-'.$options['Lazyload_style'].'\"   alt=\"$2\" title=\"点击放大图片\"></div>\n   '; \n    $content = preg_replace($pattern, $replacement, $content);\n   \n\n    }\n    else{\n        $pattern = '/<\\s*img[\\s\\S]+?(?:src=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|alt=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|[a-z]+=[\\'\"][\\S\\s]*?[\\'\"]\\s*)+[\\s\\S]*?>/i';\n   \n $replacement = '\n <div class=\"masonry-brick\">\n      <img '.lazyload().'src=\"$1\"   alt=\"$2\" title=\"点击放大图片\">\n    </div>'; \n    $content = preg_replace($pattern, $replacement, $content);\n    }\n    \n    }\n\n   \n   if($articletype == 'pic_Mode'){\n    $content = \"<div class=\\\"masonry-container\\\"><div class=\\\"masonry-columns\\\">\".preg_replace(\"/<p.*?>|<\\/p>|<br.*?>/is\",\"\", $content).\"</div></div>\";\n   }\n   if($modetype == 'noreadmode'){\n\n    $content = \"<div id=\\\"bearsimple-images\\\">\".$content.\"</div>\";\n   }\n   else{\n       \n       $content = \"<div id=\\\"bearsimple-images-readmode\\\">\".$content.\"</div>\";\n   }\n  /**添加目录树识别(弃用)\n   if(preg_match('/<h([1-6])(.*?)>(.*?)<\\/h\\1>/i',$content)){\n       \n   }\n   **/\n    return $content;\n}\n\nfunction parselink($link){\n    //判断是否为外链并判断是否新窗口打开\n            $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n            $optionss = Helper::options();\n            if (strpos($link,$optionss->siteUrl) !== false || strpos(substr($link,0,6),\"http\") === false){\n                $link =  '';\n            }else{\n                if ($options['Link_blank'] == '2'){\n                $link =  ' target=\"_blank\"';\n                }\n                else{\n                $link =  '';  \n                }\n            }\n        return $link;\n}\nfunction getUniqueId()\n    {\n        global $playerID;\n        $playerID++;\n        return $playerID;\n    } \n    \nfunction getAcgFile(){\n    $getAcgFile = Helper::options()->siteUrl.'index.php/getacg';\n    echo $getAcgFile;\n}\n\nfunction getGhFile(){\n    $getGhFile =Helper::options()->siteUrl.'index.php/getgithub';\n    echo $getGhFile;\n}\n\nfunction getCrossFile(){\n    $getGhFile =Helper::options()->siteUrl.'index.php/searchcross';\n    echo $getGhFile;\n}\n\nfunction getDoubanFile(){\n    $getDoubanFile = Helper::options()->siteUrl.'index.php/getdouban';\n    echo $getDoubanFile;\n}\n\nfunction getAttachFile(){\n    $getAttachFile = Helper::options()->siteUrl.'index.php/write';\n    echo $getAttachFile;\n}\n\nfunction getCommentLikeFile(){\n    $getCommentLikeFile = Helper::options()->siteUrl.'index.php/commentlike';\n    echo $getCommentLikeFile;\n}\n\nfunction getPostLikeFile(){\n    $getPostLikeFile = Helper::options()->siteUrl.'index.php/postlike';\n    echo $getPostLikeFile;\n}\nfunction getFriendFile(){\n    $getFriendFile = Helper::options()->siteUrl.'index.php/friendajax';\n    echo $getFriendFile;\n}\nfunction getEncrypt(){\n    $getEncrypt = Helper::options()->siteUrl.'index.php/getencrypt';\n    echo $getEncrypt;\n}\nfunction getPoster(){\n    $getPoster = Helper::options()->siteUrl.'index.php/getPosterInfo';\n    echo $getPoster;\n}\nfunction getIsLogin(){\n    $getIsLogin = Helper::options()->siteUrl.'index.php/getIsLogin';\n    echo $getIsLogin;\n}\nfunction getSign(){\n    $getSign = Helper::options()->siteUrl.'index.php/bgetSign';\n    echo $getSign;\n}\nfunction getUserAction(){\n    $getUserAction = Helper::options()->siteUrl.'index.php/bUserAction';\n    echo $getUserAction;\n}\nfunction getCommentAction(){\n    $getCommentAction = Helper::options()->siteUrl.'index.php/getCommentAction';\n    echo $getCommentAction;\n}\nfunction getMemosAction(){\n    $getMemosAction = Helper::options()->siteUrl.'index.php/getMemosAction';\n    echo $getMemosAction;\n}\nfunction getCircleAction(){\n    $getCircleAction = Helper::options()->siteUrl.'index.php/getCircleAction';\n    echo $getCircleAction;\n}\nfunction getEmactionAction(){\n    $getEmactionAction = Helper::options()->siteUrl.'index.php/getEmaction';\n    echo $getEmactionAction;\n}\nfunction getAiTools(){\n    $getAiTools = Helper::options()->siteUrl.'index.php/getAiTools';\n    echo $getAiTools;\n}\nfunction getTagsApi(){\n    $getTags = Helper::options()->siteUrl.'index.php/getTags';\n    echo $getTags;\n}"
  },
  {
    "path": "core/replyview.php",
    "content": "<?php\n//回复可见处理\nTypecho_Plugin::factory('Widget_Abstract_Contents')->excerptEx = array('BearToolOne','one');\nTypecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = array('BearToolOne','one');\nclass BearToolOne {\n    public static function get_shortcode_regex($tagnames = null)\n    {\n        global $shortcode_tags;\n        if (empty($tagnames)) {\n            $tagnames = array_keys($shortcode_tags);\n        }\n        $tagregexp = join('|', array_map('preg_quote', $tagnames));\n        return\n            '\\\\['                           \n            . '(\\\\[?)'                        \n            . \"($tagregexp)\"       \n            . '(?![\\\\w-])'                    \n            . '('                         \n            . '[^\\\\]\\\\/]*'               \n            . '(?:'\n            . '\\\\/(?!\\\\])'     \n            . '[^\\\\]\\\\/]*'          \n            . ')*?'\n            . ')'\n            . '(?:'\n            . '(\\\\/)'                    \n            . '\\\\]'           \n            . '|'\n            . '\\\\]'              \n            . '(?:'\n            . '('       \n            . '[^\\\\[]*+'  \n            . '(?:'\n            . '\\\\[(?!\\\\/\\\\2\\\\])'\n            . '[^\\\\[]*+'\n            . ')*+'\n            . ')'\n            . '\\\\[\\\\/\\\\2\\\\]'    \n            . ')?'\n            . ')'\n            . '(\\\\]?)'; \n    }\n\npublic static function get_shortcode_regex2($tagnames = null)\n    {\n        global $shortcode_tags;\n        if (empty($tagnames)) {\n            $tagnames = array_keys($shortcode_tags);\n        }\n        $tagregexp = join('|', array_map('preg_quote', $tagnames));\n        return\n            '\\\\{'                           \n            . '(\\\\[?)'                        \n            . \"($tagregexp)\"       \n            . '(?![\\\\w-])'                    \n            . '('                         \n            . '[^\\\\]\\\\/]*'               \n            . '(?:'\n            . '\\\\/(?!\\\\])'     \n            . '[^\\\\]\\\\/]*'          \n            . ')*?'\n            . ')'\n            . '(?:'\n            . '(\\\\/)'                    \n            . '\\\\}'           \n            . '|'\n            . '\\\\}'              \n            . '(?:'\n            . '('       \n            . '[^\\\\[]*+'  \n            . '(?:'\n            . '\\\\[(?!\\\\/\\\\2\\\\])'\n            . '[^\\\\[]*+'\n            . ')*+'\n            . ')'\n            . '\\\\[\\\\/\\\\2\\\\}'    \n            . ')?'\n            . ')'\n            . '(\\\\]?)'; \n    }\npublic static function excerpt_text($content)\n    {\n        if (strpos($content, '[bsgallery') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsgallery'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bstimes') !== false) {\n            $pattern = self::get_shortcode_regex(array('bstimes'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsgit') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsgit'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bscopy') !== false) {\n            $pattern = self::get_shortcode_regex(array('bscopy'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsmusic') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsmusic'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[todo-t') !== false) {\n            $pattern = self::get_shortcode_regex(array('todo-t'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[todo-f') !== false) {\n            $pattern = self::get_shortcode_regex(array('todo-f'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bstabs') !== false) {\n            $pattern = self::get_shortcode_regex(array('bstabs'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bseva') !== false) {\n            $pattern = self::get_shortcode_regex(array('bseva'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsaudio') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsaudio'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bspost') !== false) {\n            $pattern = self::get_shortcode_regex(array('bspost'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsplayer') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsplayer'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsmp3') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsmp3'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsruby') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsruby'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsprog') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsprog'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n          if (strpos($content, '[bsdate') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsdate'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n          if (strpos($content, '[bspaper') !== false) {\n            $pattern = self::get_shortcode_regex(array('bspaper'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsmark') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsmark'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsmermaid') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsmermaid'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsbtn') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsbtn'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsmessage') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsmessage'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-hide') !== false) {\n            $pattern = self::get_shortcode_regex2(array('bs-hide'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-todo') !== false) {\n            $pattern = self::get_shortcode_regex2(array('bs-todo'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-accord') !== false) {\n            $pattern = self::get_shortcode_regex2(array('bs-accord'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-font') !== false) {\n            $pattern = self::get_shortcode_regex2(array('bs-font'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-iframe') !== false) {\n            $pattern = self::get_shortcode_regex2(array('bs-iframe'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsfra') !== false) {\n            $pattern = self::get_shortcode_regex2(array('bsfra'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-card') !== false) {\n            $pattern = self::get_shortcode_regex2(array('bs-card'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '{bs-audio') !== false) {\n            $pattern = self::get_shortcode_regex2(array('bs-audio'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\nif (strpos($content, '[bstag') !== false || strpos($content, '[tag') !== false) {\n            $pattern = self::get_shortcode_regex(array('bstag','tag'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bsopc') !== false) {\n            $pattern = self::get_shortcode_regex(array('bsopc'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bstip') !== false) {\n            $pattern = self::get_shortcode_regex(array('bstip'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[bskbd') !== false) {\n            $pattern = self::get_shortcode_regex(array('bskbd'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (strpos($content, '[e') !== false) {\n            $pattern = self::get_shortcode_regex(array('e'));\n            $content = preg_replace(\"/$pattern/\", '', $content);\n        }\n        if (Bsoptions('article_textindent') == true) {\n        $content = str_replace('&#8195;', '', $content);\n   }\n        return $content;\n    }\n    public static function one($con,$obj,$text)\n    {\n      $text = empty($text)?$con:$text;\n      if(!$obj->is('single') && strpos($text, '{bs-hide') !== false){\n      $text = '文章包含隐藏内容，请进入文章内页查看~';\n      }\n      if(!$obj->is('single') && strpos($text, '[bs-hide') !== false){\n      $text = '文章包含隐藏内容，请进入文章内页查看~';\n      }\n      if(!$obj->is('single') && strpos($text, '[bshide') !== false){\n      $text = '文章包含隐藏内容，请进入文章内页查看~';\n      }\n      if(!$obj->is('single') && strpos($text, '[bslogin') !== false){\n      $text = '文章包含隐藏内容，请进入文章内页查看~';\n      }\n      if(!$obj->is('single')){\n       $text = self::excerpt_text($text);\n      }\n\n               return $text;\n}\n}\n"
  },
  {
    "path": "core/tongji.php",
    "content": "<?php\r\n/*\r\n * 获取浏览次数\r\n */\r\nfunction getViewsStr($widget) {\r\n    $fields = unserialize($widget->fields);\r\n    if (array_key_exists('views', $fields))\r\n        $views = (!empty($fields['views'])) ? intval($fields['views']) : 0;\r\n    else\r\n        $views = 0;\r\n    \r\n    //增加浏览次数\r\n    if ($widget->is('single')) {\r\n        $vieweds = Typecho_Cookie::get('contents_viewed');\r\n        if (empty($vieweds))\r\n            $vieweds = array();\r\n        else\r\n            $vieweds = explode(',', $vieweds);\r\n        if (!in_array($widget->cid, $vieweds)) {\r\n            $views = $views + 1;\r\n            $widget->setField('views', 'str', strval($views), $widget->cid);\r\n            $vieweds[] = $widget->cid;\r\n            $vieweds = implode(',', $vieweds);\r\n            Typecho_Cookie::set(\"contents_viewed\",$vieweds);\r\n        }\r\n    }\r\n    return $views;\r\n}\r\n"
  },
  {
    "path": "core/usercenter.php",
    "content": "<?php\n\n//签到\nfunction user_sign($uid){\n    $today = date('Y-m-d',time());\n    $db = Typecho_Db::get();\n    $result = $db->fetchAll($db->select()->from('table.bscore_sign_data')\n            ->where('signuid = ?',$uid)\n            ->where('signtime = ?', $today)\n            ->limit(1)\n        );\n        if(!$result){\n            echo '<div class=\"ui mini blue icon button\" id=\"b-sign\"><i class=\"grin outline icon\"></i> 今日尚未签到，点击这里签到</div>';\n        }\n        else{\n            echo '<div class=\"ui mini icon green button\" id=\"b-sign\" style=\"pointer-events:none\"><i class=\"grin beam outline icon\"></i> 今日已签到</div>';\n        }\n}\n//输出用户文章总数\nfunction allpostnum($id){\n    $db = Typecho_Db::get();\n    $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));\n    $postnum = $postnum['allpostnum'];\n    return $postnum;\n}\n\n//输出用户所投稿的文章\nfunction authorPosts($id){\n    if($id){ \n        $limit = 6;\n        $db = Typecho_Db::get();\n        $result = $db->fetchAll($db->select()->from('table.contents')\n            ->where('authorId = ?',$id)\n            ->where('type = ?', 'post')\n            ->limit($limit)\n            ->order('cid', Typecho_Db::SORT_DESC)  \n            \n        );\n        if($result){\n            foreach($result as $val){                \n                $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);\n                $post_title = htmlspecialchars($val['title']);\n                $permalink = $val['permalink'];\n                if($val['status'] == 'publish'){\n                    $post_title = '<a href=\"'.$permalink.'\" target=\"_blank\">'.$post_title.'</a>';\n                }\n                switch($val['status']){\n                    case 'publish':\n                        $val['status'] = '<i class=\"check green icon\"></i>审核通过';\n                        break;\n                    case 'hidden':\n                        $val['status'] = '<i class=\"eye slash outline icon\"></i>已被隐藏';\n                        break;\n                    case 'password':\n                        $val['status'] = '<i class=\"user lock icon\"></i>密码保护';\n                        break;\n                    case 'private':\n                        $val['status'] = '<i class=\"user shield icon\"></i>私密不公开';\n                        break;\n                    case 'waiting':\n                        $val['status'] = '<i class=\"hourglass half icon\"></i>等待审核';\n                        break;\n                }\n                \n                echo '<tr>\n      <td>'.$post_title.'</td>\n      <td>'.date('Y年m月d日',$val['created']).'</td>\n      <td>'.getCategoryName(categeid($val['category'])).'</td>\n      <td>'.$val['status'].'</td>\n    </tr>';\n            }\n        }\n    }else{\n        echo '';\n    }\n}\n//用户等级判断\nfunction user_tier($coin){\n    $options = bsOptions::getInstance()::get_option('bearsimple');\n    if($options['UserCenter_tab']['UserCenter_rank'][0] !== ''){\n        foreach(Bsoptions('UserCenter_tab')['UserCenter_rank'] as $rank){\n            if($coin >= $rank['UserCenter_rank_min'] && $rank['UserCenter_rank_max'] >= $coin){\n                $res = $rank['UserCenter_rank_Name'];\n                if($rank['UserCenter_rank_Pic']){\n                $res .=  '<img src=\"'.$rank['UserCenter_rank_Pic'].'\" style=\"display:inline;max-width:100%;height:30px;vertical-align: middle;\">';  \n                }\n                return $res;\n            }\n        }\n         if($res == ''){\n                        $res = '暂未定义等级';    \nreturn $res;\n            }\n    }\n\n}\n\n//用户通知\nfunction userNotify($id){\n    if($id){ \n        $db = Typecho_Db::get();\n        $result = $db->fetchAll($db->select()->from('table.bscore_notify_data')\n            ->where('notifyuid = ?',$id)\n            ->order('notifytime', Typecho_Db::SORT_DESC)\n        );\n        return $result;\n    }\n}"
  },
  {
    "path": "core/widget/Dom.php",
    "content": "<?php\n/**\n * Website: http://sourceforge.net/projects/simplehtmldom/\n * Additional projects: http://sourceforge.net/projects/debugobject/\n * Acknowledge: Jose Solorzano (https://sourceforge.net/projects/php-html/)\n *\n * Licensed under The MIT License\n * See the LICENSE file in the project root for more information.\n *\n * Authors:\n *   S.C. Chen\n *   John Schlick\n *   Rus Carroll\n *   logmanoriginal\n *\n * Contributors:\n *   Yousuke Kumakura\n *   Vadim Voituk\n *   Antcs\n *\n * Version Rev. 1.9 (290)\n */\n\ndefine('HDOM_TYPE_ELEMENT', 1);\ndefine('HDOM_TYPE_COMMENT', 2);\ndefine('HDOM_TYPE_TEXT', 3);\ndefine('HDOM_TYPE_ENDTAG', 4);\ndefine('HDOM_TYPE_ROOT', 5);\ndefine('HDOM_TYPE_UNKNOWN', 6);\ndefine('HDOM_QUOTE_DOUBLE', 0);\ndefine('HDOM_QUOTE_SINGLE', 1);\ndefine('HDOM_QUOTE_NO', 3);\ndefine('HDOM_INFO_BEGIN', 0);\ndefine('HDOM_INFO_END', 1);\ndefine('HDOM_INFO_QUOTE', 2);\ndefine('HDOM_INFO_SPACE', 3);\ndefine('HDOM_INFO_TEXT', 4);\ndefine('HDOM_INFO_INNER', 5);\ndefine('HDOM_INFO_OUTER', 6);\ndefine('HDOM_INFO_ENDSPACE', 7);\n\ndefined('DEFAULT_TARGET_CHARSET') || define('DEFAULT_TARGET_CHARSET', 'UTF-8');\ndefined('DEFAULT_BR_TEXT') || define('DEFAULT_BR_TEXT', \"\\r\\n\");\ndefined('DEFAULT_SPAN_TEXT') || define('DEFAULT_SPAN_TEXT', ' ');\ndefined('MAX_FILE_SIZE') || define('MAX_FILE_SIZE', 600000);\ndefine('HDOM_SMARTY_AS_TEXT', 1);\n\nfunction file_get_html(\n\t$url,\n\t$use_include_path = false,\n\t$context = null,\n\t$offset = 0,\n\t$maxLen = -1,\n\t$lowercase = true,\n\t$forceTagsClosed = true,\n\t$target_charset = DEFAULT_TARGET_CHARSET,\n\t$stripRN = true,\n\t$defaultBRText = DEFAULT_BR_TEXT,\n\t$defaultSpanText = DEFAULT_SPAN_TEXT)\n{\n\tif($maxLen <= 0) { $maxLen = MAX_FILE_SIZE; }\n\n\t$dom = new simple_html_dom(\n\t\tnull,\n\t\t$lowercase,\n\t\t$forceTagsClosed,\n\t\t$target_charset,\n\t\t$stripRN,\n\t\t$defaultBRText,\n\t\t$defaultSpanText\n\t);\n\n\t/**\n\t * For sourceforge users: uncomment the next line and comment the\n\t * retrieve_url_contents line 2 lines down if it is not already done.\n\t */\n\t$contents = file_get_contents(\n\t\t$url,\n\t\t$use_include_path,\n\t\t$context,\n\t\t$offset,\n\t\t$maxLen\n\t);\n\t// $contents = retrieve_url_contents($url);\n\n\tif (empty($contents) || strlen($contents) > $maxLen) {\n\t\t$dom->clear();\n\t\treturn false;\n\t}\n\n\treturn $dom->load($contents, $lowercase, $stripRN);\n}\n\nfunction str_get_html(\n\t$str,\n\t$lowercase = true,\n\t$forceTagsClosed = true,\n\t$target_charset = DEFAULT_TARGET_CHARSET,\n\t$stripRN = true,\n\t$defaultBRText = DEFAULT_BR_TEXT,\n\t$defaultSpanText = DEFAULT_SPAN_TEXT)\n{\n\t$dom = new simple_html_dom(\n\t\tnull,\n\t\t$lowercase,\n\t\t$forceTagsClosed,\n\t\t$target_charset,\n\t\t$stripRN,\n\t\t$defaultBRText,\n\t\t$defaultSpanText\n\t);\n\n\tif (empty($str) || strlen($str) > MAX_FILE_SIZE) {\n\t\t$dom->clear();\n\t\treturn false;\n\t}\n\n\treturn $dom->load($str, $lowercase, $stripRN);\n}\n\nfunction dump_html_tree($node, $show_attr = true, $deep = 0)\n{\n\t$node->dump($node);\n}\n\nclass simple_html_dom_node\n{\n\tpublic $nodetype = HDOM_TYPE_TEXT;\n\tpublic $tag = 'text';\n\tpublic $attr = array();\n\tpublic $children = array();\n\tpublic $nodes = array();\n\tpublic $parent = null;\n\tpublic $_ = array();\n\tpublic $tag_start = 0;\n\tprivate $dom = null;\n\n\tfunction __construct($dom)\n\t{\n\t\t$this->dom = $dom;\n\t\t$dom->nodes[] = $this;\n\t}\n\n\tfunction __destruct()\n\t{\n\t\t$this->clear();\n\t}\n\n\tfunction __toString()\n\t{\n\t\treturn $this->outertext();\n\t}\n\n\tfunction clear()\n\t{\n\t\t$this->dom = null;\n\t\t$this->nodes = null;\n\t\t$this->parent = null;\n\t\t$this->children = null;\n\t}\n\n\tfunction dump($show_attr = true, $depth = 0)\n\t{\n\t\techo str_repeat(\"\\t\", $depth) . $this->tag;\n\n\t\tif ($show_attr && count($this->attr) > 0) {\n\t\t\techo '(';\n\t\t\tforeach ($this->attr as $k => $v) {\n\t\t\t\techo \"[$k]=>\\\"$v\\\", \";\n\t\t\t}\n\t\t\techo ')';\n\t\t}\n\n\t\techo \"\\n\";\n\n\t\tif ($this->nodes) {\n\t\t\tforeach ($this->nodes as $node) {\n\t\t\t\t$node->dump($show_attr, $depth + 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction dump_node($echo = true)\n\t{\n\t\t$string = $this->tag;\n\n\t\tif (count($this->attr) > 0) {\n\t\t\t$string .= '(';\n\t\t\tforeach ($this->attr as $k => $v) {\n\t\t\t\t$string .= \"[$k]=>\\\"$v\\\", \";\n\t\t\t}\n\t\t\t$string .= ')';\n\t\t}\n\n\t\tif (count($this->_) > 0) {\n\t\t\t$string .= ' $_ (';\n\t\t\tforeach ($this->_ as $k => $v) {\n\t\t\t\tif (is_array($v)) {\n\t\t\t\t\t$string .= \"[$k]=>(\";\n\t\t\t\t\tforeach ($v as $k2 => $v2) {\n\t\t\t\t\t\t$string .= \"[$k2]=>\\\"$v2\\\", \";\n\t\t\t\t\t}\n\t\t\t\t\t$string .= ')';\n\t\t\t\t} else {\n\t\t\t\t\t$string .= \"[$k]=>\\\"$v\\\", \";\n\t\t\t\t}\n\t\t\t}\n\t\t\t$string .= ')';\n\t\t}\n\n\t\tif (isset($this->text)) {\n\t\t\t$string .= \" text: ({$this->text})\";\n\t\t}\n\n\t\t$string .= ' HDOM_INNER_INFO: ';\n\n\t\tif (isset($node->_[HDOM_INFO_INNER])) {\n\t\t\t$string .= \"'\" . $node->_[HDOM_INFO_INNER] . \"'\";\n\t\t} else {\n\t\t\t$string .= ' NULL ';\n\t\t}\n\n\t\t$string .= ' children: ' . count($this->children);\n\t\t$string .= ' nodes: ' . count($this->nodes);\n\t\t$string .= ' tag_start: ' . $this->tag_start;\n\t\t$string .= \"\\n\";\n\n\t\tif ($echo) {\n\t\t\techo $string;\n\t\t\treturn;\n\t\t} else {\n\t\t\treturn $string;\n\t\t}\n\t}\n\n\tfunction parent($parent = null)\n\t{\n\t\t// I am SURE that this doesn't work properly.\n\t\t// It fails to unset the current node from it's current parents nodes or\n\t\t// children list first.\n\t\tif ($parent !== null) {\n\t\t\t$this->parent = $parent;\n\t\t\t$this->parent->nodes[] = $this;\n\t\t\t$this->parent->children[] = $this;\n\t\t}\n\n\t\treturn $this->parent;\n\t}\n\n\tfunction has_child()\n\t{\n\t\treturn !empty($this->children);\n\t}\n\n\tfunction children($idx = -1)\n\t{\n\t\tif ($idx === -1) {\n\t\t\treturn $this->children;\n\t\t}\n\n\t\tif (isset($this->children[$idx])) {\n\t\t\treturn $this->children[$idx];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction first_child()\n\t{\n\t\tif (count($this->children) > 0) {\n\t\t\treturn $this->children[0];\n\t\t}\n\t\treturn null;\n\t}\n\n\tfunction last_child()\n\t{\n\t\tif (count($this->children) > 0) {\n\t\t\treturn end($this->children);\n\t\t}\n\t\treturn null;\n\t}\n\n\tfunction next_sibling()\n\t{\n\t\tif ($this->parent === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\t$idx = array_search($this, $this->parent->children, true);\n\n\t\tif ($idx !== false && isset($this->parent->children[$idx + 1])) {\n\t\t\treturn $this->parent->children[$idx + 1];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction prev_sibling()\n\t{\n\t\tif ($this->parent === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\t$idx = array_search($this, $this->parent->children, true);\n\n\t\tif ($idx !== false && $idx > 0) {\n\t\t\treturn $this->parent->children[$idx - 1];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction find_ancestor_tag($tag)\n\t{\n\t\tglobal $debug_object;\n\t\tif (is_object($debug_object)) { $debug_object->debug_log_entry(1); }\n\n\t\tif ($this->parent === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\t$ancestor = $this->parent;\n\n\t\twhile (!is_null($ancestor)) {\n\t\t\tif (is_object($debug_object)) {\n\t\t\t\t$debug_object->debug_log(2, 'Current tag is: ' . $ancestor->tag);\n\t\t\t}\n\n\t\t\tif ($ancestor->tag === $tag) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t$ancestor = $ancestor->parent;\n\t\t}\n\n\t\treturn $ancestor;\n\t}\n\n\tfunction innertext()\n\t{\n\t\tif (isset($this->_[HDOM_INFO_INNER])) {\n\t\t\treturn $this->_[HDOM_INFO_INNER];\n\t\t}\n\n\t\tif (isset($this->_[HDOM_INFO_TEXT])) {\n\t\t\treturn $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);\n\t\t}\n\n\t\t$ret = '';\n\n\t\tforeach ($this->nodes as $n) {\n\t\t\t$ret .= $n->outertext();\n\t\t}\n\n\t\treturn $ret;\n\t}\n\n\tfunction outertext()\n\t{\n\t\tglobal $debug_object;\n\n\t\tif (is_object($debug_object)) {\n\t\t\t$text = '';\n\n\t\t\tif ($this->tag === 'text') {\n\t\t\t\tif (!empty($this->text)) {\n\t\t\t\t\t$text = ' with text: ' . $this->text;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$debug_object->debug_log(1, 'Innertext of tag: ' . $this->tag . $text);\n\t\t}\n\n\t\tif ($this->tag === 'root') {\n\t\t\treturn $this->innertext();\n\t\t}\n\n\t\t// todo: What is the use of this callback? Remove?\n\t\tif ($this->dom && $this->dom->callback !== null) {\n\t\t\tcall_user_func_array($this->dom->callback, array($this));\n\t\t}\n\n\t\tif (isset($this->_[HDOM_INFO_OUTER])) {\n\t\t\treturn $this->_[HDOM_INFO_OUTER];\n\t\t}\n\n\t\tif (isset($this->_[HDOM_INFO_TEXT])) {\n\t\t\treturn $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);\n\t\t}\n\n\t\t$ret = '';\n\n\t\tif ($this->dom && $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]) {\n\t\t\t$ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup();\n\t\t}\n\n\t\tif (isset($this->_[HDOM_INFO_INNER])) {\n\t\t\t// todo: <br> should either never have HDOM_INFO_INNER or always\n\t\t\tif ($this->tag !== 'br') {\n\t\t\t\t$ret .= $this->_[HDOM_INFO_INNER];\n\t\t\t}\n\t\t} elseif ($this->nodes) {\n\t\t\tforeach ($this->nodes as $n) {\n\t\t\t\t$ret .= $this->convert_text($n->outertext());\n\t\t\t}\n\t\t}\n\n\t\tif (isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END] != 0) {\n\t\t\t$ret .= '</' . $this->tag . '>';\n\t\t}\n\n\t\treturn $ret;\n\t}\n\n\tfunction text()\n\t{\n\t\tif (isset($this->_[HDOM_INFO_INNER])) {\n\t\t\treturn $this->_[HDOM_INFO_INNER];\n\t\t}\n\n\t\tswitch ($this->nodetype) {\n\t\t\tcase HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);\n\t\t\tcase HDOM_TYPE_COMMENT: return '';\n\t\t\tcase HDOM_TYPE_UNKNOWN: return '';\n\t\t}\n\n\t\tif (strcasecmp($this->tag, 'script') === 0) { return ''; }\n\t\tif (strcasecmp($this->tag, 'style') === 0) { return ''; }\n\n\t\t$ret = '';\n\n\t\t// In rare cases, (always node type 1 or HDOM_TYPE_ELEMENT - observed\n\t\t// for some span tags, and some p tags) $this->nodes is set to NULL.\n\t\t// NOTE: This indicates that there is a problem where it's set to NULL\n\t\t// without a clear happening.\n\t\t// WHY is this happening?\n\t\tif (!is_null($this->nodes)) {\n\t\t\tforeach ($this->nodes as $n) {\n\t\t\t\t// Start paragraph after a blank line\n\t\t\t\tif ($n->tag === 'p') {\n\t\t\t\t\t$ret = trim($ret) . \"\\n\\n\";\n\t\t\t\t}\n\n\t\t\t\t$ret .= $this->convert_text($n->text());\n\n\t\t\t\t// If this node is a span... add a space at the end of it so\n\t\t\t\t// multiple spans don't run into each other.  This is plaintext\n\t\t\t\t// after all.\n\t\t\t\tif ($n->tag === 'span') {\n\t\t\t\t\t$ret .= $this->dom->default_span_text;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn $ret;\n\t}\n\n\tfunction xmltext()\n\t{\n\t\t$ret = $this->innertext();\n\t\t$ret = str_ireplace('<![CDATA[', '', $ret);\n\t\t$ret = str_replace(']]>', '', $ret);\n\t\treturn $ret;\n\t}\n\n\tfunction makeup()\n\t{\n\t\t// text, comment, unknown\n\t\tif (isset($this->_[HDOM_INFO_TEXT])) {\n\t\t\treturn $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);\n\t\t}\n\n\t\t$ret = '<' . $this->tag;\n\t\t$i = -1;\n\n\t\tforeach ($this->attr as $key => $val) {\n\t\t\t++$i;\n\n\t\t\t// skip removed attribute\n\t\t\tif ($val === null || $val === false) { continue; }\n\n\t\t\t$ret .= $this->_[HDOM_INFO_SPACE][$i][0];\n\n\t\t\t//no value attr: nowrap, checked selected...\n\t\t\tif ($val === true) {\n\t\t\t\t$ret .= $key;\n\t\t\t} else {\n\t\t\t\tswitch ($this->_[HDOM_INFO_QUOTE][$i])\n\t\t\t\t{\n\t\t\t\t\tcase HDOM_QUOTE_DOUBLE: $quote = '\"'; break;\n\t\t\t\t\tcase HDOM_QUOTE_SINGLE: $quote = '\\''; break;\n\t\t\t\t\tdefault: $quote = '';\n\t\t\t\t}\n\n\t\t\t\t$ret .= $key\n\t\t\t\t. $this->_[HDOM_INFO_SPACE][$i][1]\n\t\t\t\t. '='\n\t\t\t\t. $this->_[HDOM_INFO_SPACE][$i][2]\n\t\t\t\t. $quote\n\t\t\t\t. $val\n\t\t\t\t. $quote;\n\t\t\t}\n\t\t}\n\n\t\t$ret = $this->dom->restore_noise($ret);\n\t\treturn $ret . $this->_[HDOM_INFO_ENDSPACE] . '>';\n\t}\n\n\tfunction find($selector, $idx = null, $lowercase = false)\n\t{\n\t\t$selectors = $this->parse_selector($selector);\n\t\tif (($count = count($selectors)) === 0) { return array(); }\n\t\t$found_keys = array();\n\n\t\t// find each selector\n\t\tfor ($c = 0; $c < $count; ++$c) {\n\t\t\t// The change on the below line was documented on the sourceforge\n\t\t\t// code tracker id 2788009\n\t\t\t// used to be: if (($levle=count($selectors[0]))===0) return array();\n\t\t\tif (($levle = count($selectors[$c])) === 0) { return array(); }\n\t\t\tif (!isset($this->_[HDOM_INFO_BEGIN])) { return array(); }\n\n\t\t\t$head = array($this->_[HDOM_INFO_BEGIN] => 1);\n\t\t\t$cmd = ' '; // Combinator\n\n\t\t\t// handle descendant selectors, no recursive!\n\t\t\tfor ($l = 0; $l < $levle; ++$l) {\n\t\t\t\t$ret = array();\n\n\t\t\t\tforeach ($head as $k => $v) {\n\t\t\t\t\t$n = ($k === -1) ? $this->dom->root : $this->dom->nodes[$k];\n\t\t\t\t\t//PaperG - Pass this optional parameter on to the seek function.\n\t\t\t\t\t$n->seek($selectors[$c][$l], $ret, $cmd, $lowercase);\n\t\t\t\t}\n\n\t\t\t\t$head = $ret;\n\t\t\t\t$cmd = $selectors[$c][$l][4]; // Next Combinator\n\t\t\t}\n\n\t\t\tforeach ($head as $k => $v) {\n\t\t\t\tif (!isset($found_keys[$k])) {\n\t\t\t\t\t$found_keys[$k] = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// sort keys\n\t\tksort($found_keys);\n\n\t\t$found = array();\n\t\tforeach ($found_keys as $k => $v) {\n\t\t\t$found[] = $this->dom->nodes[$k];\n\t\t}\n\n\t\t// return nth-element or array\n\t\tif (is_null($idx)) { return $found; }\n\t\telseif ($idx < 0) { $idx = count($found) + $idx; }\n\t\treturn (isset($found[$idx])) ? $found[$idx] : null;\n\t}\n\n\tprotected function seek($selector, &$ret, $parent_cmd, $lowercase = false)\n\t{\n\t\tglobal $debug_object;\n\t\tif (is_object($debug_object)) { $debug_object->debug_log_entry(1); }\n\n\t\tlist($tag, $id, $class, $attributes, $cmb) = $selector;\n\t\t$nodes = array();\n\n\t\tif ($parent_cmd === ' ') { // Descendant Combinator\n\t\t\t// Find parent closing tag if the current element doesn't have a closing\n\t\t\t// tag (i.e. void element)\n\t\t\t$end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0;\n\t\t\tif ($end == 0) {\n\t\t\t\t$parent = $this->parent;\n\t\t\t\twhile (!isset($parent->_[HDOM_INFO_END]) && $parent !== null) {\n\t\t\t\t\t$end -= 1;\n\t\t\t\t\t$parent = $parent->parent;\n\t\t\t\t}\n\t\t\t\t$end += $parent->_[HDOM_INFO_END];\n\t\t\t}\n\n\t\t\t// Get list of target nodes\n\t\t\t$nodes_start = $this->_[HDOM_INFO_BEGIN] + 1;\n\t\t\t$nodes_count = $end - $nodes_start;\n\t\t\t$nodes = array_slice($this->dom->nodes, $nodes_start, $nodes_count, true);\n\t\t} elseif ($parent_cmd === '>') { // Child Combinator\n\t\t\t$nodes = $this->children;\n\t\t} elseif ($parent_cmd === '+'\n\t\t\t&& $this->parent\n\t\t\t&& in_array($this, $this->parent->children)) { // Next-Sibling Combinator\n\t\t\t\t$index = array_search($this, $this->parent->children, true) + 1;\n\t\t\t\tif ($index < count($this->parent->children))\n\t\t\t\t\t$nodes[] = $this->parent->children[$index];\n\t\t} elseif ($parent_cmd === '~'\n\t\t\t&& $this->parent\n\t\t\t&& in_array($this, $this->parent->children)) { // Subsequent Sibling Combinator\n\t\t\t\t$index = array_search($this, $this->parent->children, true);\n\t\t\t\t$nodes = array_slice($this->parent->children, $index);\n\t\t}\n\n\t\t// Go throgh each element starting at this element until the end tag\n\t\t// Note: If this element is a void tag, any previous void element is\n\t\t// skipped.\n\t\tforeach($nodes as $node) {\n\t\t\t$pass = true;\n\n\t\t\t// Skip root nodes\n\t\t\tif(!$node->parent) {\n\t\t\t\t$pass = false;\n\t\t\t}\n\n\t\t\t// Skip if node isn't a child node (i.e. text nodes)\n\t\t\tif($pass && !in_array($node, $node->parent->children, true)) {\n\t\t\t\t$pass = false;\n\t\t\t}\n\n\t\t\t// Skip if tag doesn't match\n\t\t\tif ($pass && $tag !== '' && $tag !== $node->tag && $tag !== '*') {\n\t\t\t\t$pass = false;\n\t\t\t}\n\n\t\t\t// Skip if ID doesn't exist\n\t\t\tif ($pass && $id !== '' && !isset($node->attr['id'])) {\n\t\t\t\t$pass = false;\n\t\t\t}\n\n\t\t\t// Check if ID matches\n\t\t\tif ($pass && $id !== '' && isset($node->attr['id'])) {\n\t\t\t\t// Note: Only consider the first ID (as browsers do)\n\t\t\t\t$node_id = explode(' ', trim($node->attr['id']))[0];\n\n\t\t\t\tif($id !== $node_id) { $pass = false; }\n\t\t\t}\n\n\t\t\t// Check if all class(es) exist\n\t\t\tif ($pass && $class !== '' && is_array($class) && !empty($class)) {\n\t\t\t\tif (isset($node->attr['class'])) {\n\t\t\t\t\t$node_classes = explode(' ', $node->attr['class']);\n\n\t\t\t\t\tif ($lowercase) {\n\t\t\t\t\t\t$node_classes = array_map('strtolower', $node_classes);\n\t\t\t\t\t}\n\n\t\t\t\t\tforeach($class as $c) {\n\t\t\t\t\t\tif(!in_array($c, $node_classes)) {\n\t\t\t\t\t\t\t$pass = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$pass = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check attributes\n\t\t\tif ($pass\n\t\t\t\t&& $attributes !== ''\n\t\t\t\t&& is_array($attributes)\n\t\t\t\t&& !empty($attributes)) {\n\t\t\t\t\tforeach($attributes as $a) {\n\t\t\t\t\t\tlist (\n\t\t\t\t\t\t\t$att_name,\n\t\t\t\t\t\t\t$att_expr,\n\t\t\t\t\t\t\t$att_val,\n\t\t\t\t\t\t\t$att_inv,\n\t\t\t\t\t\t\t$att_case_sensitivity\n\t\t\t\t\t\t) = $a;\n\n\t\t\t\t\t\t// Handle indexing attributes (i.e. \"[2]\")\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Note: This is not supported by the CSS Standard but adds\n\t\t\t\t\t\t * the ability to select items compatible to XPath (i.e.\n\t\t\t\t\t\t * the 3rd element within it's parent).\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * Note: This doesn't conflict with the CSS Standard which\n\t\t\t\t\t\t * doesn't work on numeric attributes anyway.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (is_numeric($att_name)\n\t\t\t\t\t\t\t&& $att_expr === ''\n\t\t\t\t\t\t\t&& $att_val === '') {\n\t\t\t\t\t\t\t\t$count = 0;\n\n\t\t\t\t\t\t\t\t// Find index of current element in parent\n\t\t\t\t\t\t\t\tforeach ($node->parent->children as $c) {\n\t\t\t\t\t\t\t\t\tif ($c->tag === $node->tag) ++$count;\n\t\t\t\t\t\t\t\t\tif ($c === $node) break;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If this is the correct node, continue with next\n\t\t\t\t\t\t\t\t// attribute\n\t\t\t\t\t\t\t\tif ($count === (int)$att_name) continue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check attribute availability\n\t\t\t\t\t\tif ($att_inv) { // Attribute should NOT be set\n\t\t\t\t\t\t\tif (isset($node->attr[$att_name])) {\n\t\t\t\t\t\t\t\t$pass = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else { // Attribute should be set\n\t\t\t\t\t\t\t// todo: \"plaintext\" is not a valid CSS selector!\n\t\t\t\t\t\t\tif ($att_name !== 'plaintext'\n\t\t\t\t\t\t\t\t&& !isset($node->attr[$att_name])) {\n\t\t\t\t\t\t\t\t\t$pass = false;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Continue with next attribute if expression isn't defined\n\t\t\t\t\t\tif ($att_expr === '') continue;\n\n\t\t\t\t\t\t// If they have told us that this is a \"plaintext\"\n\t\t\t\t\t\t// search then we want the plaintext of the node - right?\n\t\t\t\t\t\t// todo \"plaintext\" is not a valid CSS selector!\n\t\t\t\t\t\tif ($att_name === 'plaintext') {\n\t\t\t\t\t\t\t$nodeKeyValue = $node->text();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$nodeKeyValue = $node->attr[$att_name];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (is_object($debug_object)) {\n\t\t\t\t\t\t\t$debug_object->debug_log(2,\n\t\t\t\t\t\t\t\t'testing node: '\n\t\t\t\t\t\t\t\t. $node->tag\n\t\t\t\t\t\t\t\t. ' for attribute: '\n\t\t\t\t\t\t\t\t. $att_name\n\t\t\t\t\t\t\t\t. $att_expr\n\t\t\t\t\t\t\t\t. $att_val\n\t\t\t\t\t\t\t\t. ' where nodes value is: '\n\t\t\t\t\t\t\t\t. $nodeKeyValue\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If lowercase is set, do a case insensitive test of\n\t\t\t\t\t\t// the value of the selector.\n\t\t\t\t\t\tif ($lowercase) {\n\t\t\t\t\t\t\t$check = $this->match(\n\t\t\t\t\t\t\t\t$att_expr,\n\t\t\t\t\t\t\t\tstrtolower($att_val),\n\t\t\t\t\t\t\t\tstrtolower($nodeKeyValue),\n\t\t\t\t\t\t\t\t$att_case_sensitivity\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$check = $this->match(\n\t\t\t\t\t\t\t\t$att_expr,\n\t\t\t\t\t\t\t\t$att_val,\n\t\t\t\t\t\t\t\t$nodeKeyValue,\n\t\t\t\t\t\t\t\t$att_case_sensitivity\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (is_object($debug_object)) {\n\t\t\t\t\t\t\t$debug_object->debug_log(2,\n\t\t\t\t\t\t\t\t'after match: '\n\t\t\t\t\t\t\t\t. ($check ? 'true' : 'false')\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!$check) {\n\t\t\t\t\t\t\t$pass = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Found a match. Add to list and clear node\n\t\t\tif ($pass) $ret[$node->_[HDOM_INFO_BEGIN]] = 1;\n\t\t\tunset($node);\n\t\t}\n\t\t// It's passed by reference so this is actually what this function returns.\n\t\tif (is_object($debug_object)) {\n\t\t\t$debug_object->debug_log(1, 'EXIT - ret: ', $ret);\n\t\t}\n\t}\n\n\tprotected function match($exp, $pattern, $value, $case_sensitivity)\n\t{\n\t\tglobal $debug_object;\n\t\tif (is_object($debug_object)) {$debug_object->debug_log_entry(1);}\n\n\t\tif ($case_sensitivity === 'i') {\n\t\t\t$pattern = strtolower($pattern);\n\t\t\t$value = strtolower($value);\n\t\t}\n\n\t\tswitch ($exp) {\n\t\t\tcase '=':\n\t\t\t\treturn ($value === $pattern);\n\t\t\tcase '!=':\n\t\t\t\treturn ($value !== $pattern);\n\t\t\tcase '^=':\n\t\t\t\treturn preg_match('/^' . preg_quote($pattern, '/') . '/', $value);\n\t\t\tcase '$=':\n\t\t\t\treturn preg_match('/' . preg_quote($pattern, '/') . '$/', $value);\n\t\t\tcase '*=':\n\t\t\t\treturn preg_match('/' . preg_quote($pattern, '/') . '/', $value);\n\t\t\tcase '|=':\n\t\t\t\t/**\n\t\t\t\t * [att|=val]\n\t\t\t\t *\n\t\t\t\t * Represents an element with the att attribute, its value\n\t\t\t\t * either being exactly \"val\" or beginning with \"val\"\n\t\t\t\t * immediately followed by \"-\" (U+002D).\n\t\t\t\t */\n\t\t\t\treturn strpos($value, $pattern) === 0;\n\t\t\tcase '~=':\n\t\t\t\t/**\n\t\t\t\t * [att~=val]\n\t\t\t\t *\n\t\t\t\t * Represents an element with the att attribute whose value is a\n\t\t\t\t * whitespace-separated list of words, one of which is exactly\n\t\t\t\t * \"val\". If \"val\" contains whitespace, it will never represent\n\t\t\t\t * anything (since the words are separated by spaces). Also if\n\t\t\t\t * \"val\" is the empty string, it will never represent anything.\n\t\t\t\t */\n\t\t\t\treturn in_array($pattern, explode(' ', trim($value)), true);\n\t\t}\n\t\treturn false;\n\t}\n\n\tprotected function parse_selector($selector_string)\n\t{\n\t\tglobal $debug_object;\n\t\tif (is_object($debug_object)) { $debug_object->debug_log_entry(1); }\n\n\t\t/**\n\t\t * Pattern of CSS selectors, modified from mootools (https://mootools.net/)\n\t\t *\n\t\t * Paperg: Add the colon to the attribute, so that it properly finds\n\t\t * <tag attr:ibute=\"something\" > like google does.\n\t\t *\n\t\t * Note: if you try to look at this attribute, you MUST use getAttribute\n\t\t * since $dom->x:y will fail the php syntax check.\n\t\t *\n\t\t * Notice the \\[ starting the attribute? and the @? following? This\n\t\t * implies that an attribute can begin with an @ sign that is not\n\t\t * captured. This implies that an html attribute specifier may start\n\t\t * with an @ sign that is NOT captured by the expression. Farther study\n\t\t * is required to determine of this should be documented or removed.\n\t\t *\n\t\t * Matches selectors in this order:\n\t\t *\n\t\t * [0] - full match\n\t\t *\n\t\t * [1] - tag name\n\t\t *     ([\\w:\\*-]*)\n\t\t *     Matches the tag name consisting of zero or more words, colons,\n\t\t *     asterisks and hyphens.\n\t\t *\n\t\t * [2] - id name\n\t\t *     (?:\\#([\\w-]+))\n\t\t *     Optionally matches a id name, consisting of an \"#\" followed by\n\t\t *     the id name (one or more words and hyphens).\n\t\t *\n\t\t * [3] - class names (including dots)\n\t\t *     (?:\\.([\\w\\.-]+))?\n\t\t *     Optionally matches a list of classs, consisting of an \".\"\n\t\t *     followed by the class name (one or more words and hyphens)\n\t\t *     where multiple classes can be chained (i.e. \".foo.bar.baz\")\n\t\t *\n\t\t * [4] - attributes\n\t\t *     ((?:\\[@?(?:!?[\\w:-]+)(?:(?:[!*^$|~]?=)[\\\"']?(?:.*?)[\\\"']?)?(?:\\s*?(?:[iIsS])?)?\\])+)?\n\t\t *     Optionally matches the attributes list\n\t\t *\n\t\t * [5] - separator\n\t\t *     ([\\/, >+~]+)\n\t\t *     Matches the selector list separator\n\t\t */\n\t\t// phpcs:ignore Generic.Files.LineLength\n\t\t$pattern = \"/([\\w:\\*-]*)(?:\\#([\\w-]+))?(?:|\\.([\\w\\.-]+))?((?:\\[@?(?:!?[\\w:-]+)(?:(?:[!*^$|~]?=)[\\\"']?(?:.*?)[\\\"']?)?(?:\\s*?(?:[iIsS])?)?\\])+)?([\\/, >+~]+)/is\";\n\n\t\tpreg_match_all(\n\t\t\t$pattern,\n\t\t\ttrim($selector_string) . ' ', // Add final ' ' as pseudo separator\n\t\t\t$matches,\n\t\t\tPREG_SET_ORDER\n\t\t);\n\n\t\tif (is_object($debug_object)) {\n\t\t\t$debug_object->debug_log(2, 'Matches Array: ', $matches);\n\t\t}\n\n\t\t$selectors = array();\n\t\t$result = array();\n\n\t\tforeach ($matches as $m) {\n\t\t\t$m[0] = trim($m[0]);\n\n\t\t\t// Skip NoOps\n\t\t\tif ($m[0] === '' || $m[0] === '/' || $m[0] === '//') { continue; }\n\n\t\t\t// Convert to lowercase\n\t\t\tif ($this->dom->lowercase) {\n\t\t\t\t$m[1] = strtolower($m[1]);\n\t\t\t}\n\n\t\t\t// Extract classes\n\t\t\tif ($m[3] !== '') { $m[3] = explode('.', $m[3]); }\n\n\t\t\t/* Extract attributes (pattern based on the pattern above!)\n\n\t\t\t * [0] - full match\n\t\t\t * [1] - attribute name\n\t\t\t * [2] - attribute expression\n\t\t\t * [3] - attribute value\n\t\t\t * [4] - case sensitivity\n\t\t\t *\n\t\t\t * Note: Attributes can be negated with a \"!\" prefix to their name\n\t\t\t */\n\t\t\tif($m[4] !== '') {\n\t\t\t\tpreg_match_all(\n\t\t\t\t\t\"/\\[@?(!?[\\w:-]+)(?:([!*^$|~]?=)[\\\"']?(.*?)[\\\"']?)?(?:\\s+?([iIsS])?)?\\]/is\",\n\t\t\t\t\ttrim($m[4]),\n\t\t\t\t\t$attributes,\n\t\t\t\t\tPREG_SET_ORDER\n\t\t\t\t);\n\n\t\t\t\t// Replace element by array\n\t\t\t\t$m[4] = array();\n\n\t\t\t\tforeach($attributes as $att) {\n\t\t\t\t\t// Skip empty matches\n\t\t\t\t\tif(trim($att[0]) === '') { continue; }\n\n\t\t\t\t\t$inverted = (isset($att[1][0]) && $att[1][0] === '!');\n\t\t\t\t\t$m[4][] = array(\n\t\t\t\t\t\t$inverted ? substr($att[1], 1) : $att[1], // Name\n\t\t\t\t\t\t(isset($att[2])) ? $att[2] : '', // Expression\n\t\t\t\t\t\t(isset($att[3])) ? $att[3] : '', // Value\n\t\t\t\t\t\t$inverted, // Inverted Flag\n\t\t\t\t\t\t(isset($att[4])) ? strtolower($att[4]) : '', // Case-Sensitivity\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Sanitize Separator\n\t\t\tif ($m[5] !== '' && trim($m[5]) === '') { // Descendant Separator\n\t\t\t\t$m[5] = ' ';\n\t\t\t} else { // Other Separator\n\t\t\t\t$m[5] = trim($m[5]);\n\t\t\t}\n\n\t\t\t// Clear Separator if it's a Selector List\n\t\t\tif ($is_list = ($m[5] === ',')) { $m[5] = ''; }\n\n\t\t\t// Remove full match before adding to results\n\t\t\tarray_shift($m);\n\t\t\t$result[] = $m;\n\n\t\t\tif ($is_list) { // Selector List\n\t\t\t\t$selectors[] = $result;\n\t\t\t\t$result = array();\n\t\t\t}\n\t\t}\n\n\t\tif (count($result) > 0) { $selectors[] = $result; }\n\t\treturn $selectors;\n\t}\n\n\tfunction __get($name)\n\t{\n\t\tif (isset($this->attr[$name])) {\n\t\t\treturn $this->convert_text($this->attr[$name]);\n\t\t}\n\t\tswitch ($name) {\n\t\t\tcase 'outertext': return $this->outertext();\n\t\t\tcase 'innertext': return $this->innertext();\n\t\t\tcase 'plaintext': return $this->text();\n\t\t\tcase 'xmltext': return $this->xmltext();\n\t\t\tdefault: return array_key_exists($name, $this->attr);\n\t\t}\n\t}\n\n\tfunction __set($name, $value)\n\t{\n\t\tglobal $debug_object;\n\t\tif (is_object($debug_object)) { $debug_object->debug_log_entry(1); }\n\n\t\tswitch ($name) {\n\t\t\tcase 'outertext': return $this->_[HDOM_INFO_OUTER] = $value;\n\t\t\tcase 'innertext':\n\t\t\t\tif (isset($this->_[HDOM_INFO_TEXT])) {\n\t\t\t\t\treturn $this->_[HDOM_INFO_TEXT] = $value;\n\t\t\t\t}\n\t\t\t\treturn $this->_[HDOM_INFO_INNER] = $value;\n\t\t}\n\n\t\tif (!isset($this->attr[$name])) {\n\t\t\t$this->_[HDOM_INFO_SPACE][] = array(' ', '', '');\n\t\t\t$this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;\n\t\t}\n\n\t\t$this->attr[$name] = $value;\n\t}\n\n\tfunction __isset($name)\n\t{\n\t\tswitch ($name) {\n\t\t\tcase 'outertext': return true;\n\t\t\tcase 'innertext': return true;\n\t\t\tcase 'plaintext': return true;\n\t\t}\n\t\t//no value attr: nowrap, checked selected...\n\t\treturn (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]);\n\t}\n\n\tfunction __unset($name)\n\t{\n\t\tif (isset($this->attr[$name])) { unset($this->attr[$name]); }\n\t}\n\n\tfunction convert_text($text)\n\t{\n\t\tglobal $debug_object;\n\t\tif (is_object($debug_object)) { $debug_object->debug_log_entry(1); }\n\n\t\t$converted_text = $text;\n\n\t\t$sourceCharset = '';\n\t\t$targetCharset = '';\n\n\t\tif ($this->dom) {\n\t\t\t$sourceCharset = strtoupper($this->dom->_charset);\n\t\t\t$targetCharset = strtoupper($this->dom->_target_charset);\n\t\t}\n\n\t\tif (is_object($debug_object)) {\n\t\t\t$debug_object->debug_log(3,\n\t\t\t\t'source charset: '\n\t\t\t\t. $sourceCharset\n\t\t\t\t. ' target charaset: '\n\t\t\t\t. $targetCharset\n\t\t\t);\n\t\t}\n\n\t\tif (!empty($sourceCharset)\n\t\t\t&& !empty($targetCharset)\n\t\t\t&& (strcasecmp($sourceCharset, $targetCharset) != 0)) {\n\t\t\t// Check if the reported encoding could have been incorrect and the text is actually already UTF-8\n\t\t\tif ((strcasecmp($targetCharset, 'UTF-8') == 0)\n\t\t\t\t&& ($this->is_utf8($text))) {\n\t\t\t\t$converted_text = $text;\n\t\t\t} else {\n\t\t\t\t$converted_text = iconv($sourceCharset, $targetCharset, $text);\n\t\t\t}\n\t\t}\n\n\t\t// Lets make sure that we don't have that silly BOM issue with any of the utf-8 text we output.\n\t\tif ($targetCharset === 'UTF-8') {\n\t\t\tif (substr($converted_text, 0, 3) === \"\\xef\\xbb\\xbf\") {\n\t\t\t\t$converted_text = substr($converted_text, 3);\n\t\t\t}\n\n\t\t\tif (substr($converted_text, -3) === \"\\xef\\xbb\\xbf\") {\n\t\t\t\t$converted_text = substr($converted_text, 0, -3);\n\t\t\t}\n\t\t}\n\n\t\treturn $converted_text;\n\t}\n\n\tstatic function is_utf8($str)\n\t{\n\t\t$c = 0; $b = 0;\n\t\t$bits = 0;\n\t\t$len = strlen($str);\n\t\tfor($i = 0; $i < $len; $i++) {\n\t\t\t$c = ord($str[$i]);\n\t\t\tif($c > 128) {\n\t\t\t\tif(($c >= 254)) { return false; }\n\t\t\t\telseif($c >= 252) { $bits = 6; }\n\t\t\t\telseif($c >= 248) { $bits = 5; }\n\t\t\t\telseif($c >= 240) { $bits = 4; }\n\t\t\t\telseif($c >= 224) { $bits = 3; }\n\t\t\t\telseif($c >= 192) { $bits = 2; }\n\t\t\t\telse { return false; }\n\t\t\t\tif(($i + $bits) > $len) { return false; }\n\t\t\t\twhile($bits > 1) {\n\t\t\t\t\t$i++;\n\t\t\t\t\t$b = ord($str[$i]);\n\t\t\t\t\tif($b < 128 || $b > 191) { return false; }\n\t\t\t\t\t$bits--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction get_display_size()\n\t{\n\t\tglobal $debug_object;\n\n\t\t$width = -1;\n\t\t$height = -1;\n\n\t\tif ($this->tag !== 'img') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// See if there is aheight or width attribute in the tag itself.\n\t\tif (isset($this->attr['width'])) {\n\t\t\t$width = $this->attr['width'];\n\t\t}\n\n\t\tif (isset($this->attr['height'])) {\n\t\t\t$height = $this->attr['height'];\n\t\t}\n\n\t\t// Now look for an inline style.\n\t\tif (isset($this->attr['style'])) {\n\t\t\t// Thanks to user gnarf from stackoverflow for this regular expression.\n\t\t\t$attributes = array();\n\n\t\t\tpreg_match_all(\n\t\t\t\t'/([\\w-]+)\\s*:\\s*([^;]+)\\s*;?/',\n\t\t\t\t$this->attr['style'],\n\t\t\t\t$matches,\n\t\t\t\tPREG_SET_ORDER\n\t\t\t);\n\n\t\t\tforeach ($matches as $match) {\n\t\t\t\t$attributes[$match[1]] = $match[2];\n\t\t\t}\n\n\t\t\t// If there is a width in the style attributes:\n\t\t\tif (isset($attributes['width']) && $width == -1) {\n\t\t\t\t// check that the last two characters are px (pixels)\n\t\t\t\tif (strtolower(substr($attributes['width'], -2)) === 'px') {\n\t\t\t\t\t$proposed_width = substr($attributes['width'], 0, -2);\n\t\t\t\t\t// Now make sure that it's an integer and not something stupid.\n\t\t\t\t\tif (filter_var($proposed_width, FILTER_VALIDATE_INT)) {\n\t\t\t\t\t\t$width = $proposed_width;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If there is a width in the style attributes:\n\t\t\tif (isset($attributes['height']) && $height == -1) {\n\t\t\t\t// check that the last two characters are px (pixels)\n\t\t\t\tif (strtolower(substr($attributes['height'], -2)) == 'px') {\n\t\t\t\t\t$proposed_height = substr($attributes['height'], 0, -2);\n\t\t\t\t\t// Now make sure that it's an integer and not something stupid.\n\t\t\t\t\tif (filter_var($proposed_height, FILTER_VALIDATE_INT)) {\n\t\t\t\t\t\t$height = $proposed_height;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// Future enhancement:\n\t\t// Look in the tag to see if there is a class or id specified that has\n\t\t// a height or width attribute to it.\n\n\t\t// Far future enhancement\n\t\t// Look at all the parent tags of this image to see if they specify a\n\t\t// class or id that has an img selector that specifies a height or width\n\t\t// Note that in this case, the class or id will have the img subselector\n\t\t// for it to apply to the image.\n\n\t\t// ridiculously far future development\n\t\t// If the class or id is specified in a SEPARATE css file thats not on\n\t\t// the page, go get it and do what we were just doing for the ones on\n\t\t// the page.\n\n\t\t$result = array(\n\t\t\t'height' => $height,\n\t\t\t'width' => $width\n\t\t);\n\n\t\treturn $result;\n\t}\n\n\tfunction save($filepath = '')\n\t{\n\t\t$ret = $this->outertext();\n\n\t\tif ($filepath !== '') {\n\t\t\tfile_put_contents($filepath, $ret, LOCK_EX);\n\t\t}\n\n\t\treturn $ret;\n\t}\n\n\tfunction addClass($class)\n\t{\n\t\tif (is_string($class)) {\n\t\t\t$class = explode(' ', $class);\n\t\t}\n\n\t\tif (is_array($class)) {\n\t\t\tforeach($class as $c) {\n\t\t\t\tif (isset($this->class)) {\n\t\t\t\t\tif ($this->hasClass($c)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this->class .= ' ' . $c;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$this->class = $c;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (is_object($debug_object)) {\n\t\t\t\t$debug_object->debug_log(2, 'Invalid type: ', gettype($class));\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction hasClass($class)\n\t{\n\t\tif (is_string($class)) {\n\t\t\tif (isset($this->class)) {\n\t\t\t\treturn in_array($class, explode(' ', $this->class), true);\n\t\t\t}\n\t\t} else {\n\t\t\tif (is_object($debug_object)) {\n\t\t\t\t$debug_object->debug_log(2, 'Invalid type: ', gettype($class));\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction removeClass($class = null)\n\t{\n\t\tif (!isset($this->class)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (is_null($class)) {\n\t\t\t$this->removeAttribute('class');\n\t\t\treturn;\n\t\t}\n\n\t\tif (is_string($class)) {\n\t\t\t$class = explode(' ', $class);\n\t\t}\n\n\t\tif (is_array($class)) {\n\t\t\t$class = array_diff(explode(' ', $this->class), $class);\n\t\t\tif (empty($class)) {\n\t\t\t\t$this->removeAttribute('class');\n\t\t\t} else {\n\t\t\t\t$this->class = implode(' ', $class);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getAllAttributes()\n\t{\n\t\treturn $this->attr;\n\t}\n\n\tfunction getAttribute($name)\n\t{\n\t\treturn $this->__get($name);\n\t}\n\n\tfunction setAttribute($name, $value)\n\t{\n\t\t$this->__set($name, $value);\n\t}\n\n\tfunction hasAttribute($name)\n\t{\n\t\treturn $this->__isset($name);\n\t}\n\n\tfunction removeAttribute($name)\n\t{\n\t\t$this->__set($name, null);\n\t}\n\n\tfunction remove()\n\t{\n\t\tif ($this->parent) {\n\t\t\t$this->parent->removeChild($this);\n\t\t}\n\t}\n\n\tfunction removeChild($node)\n\t{\n\t\t$nidx = array_search($node, $this->nodes, true);\n\t\t$cidx = array_search($node, $this->children, true);\n\t\t$didx = array_search($node, $this->dom->nodes, true);\n\n\t\tif ($nidx !== false && $cidx !== false && $didx !== false) {\n\n\t\t\tforeach($node->children as $child) {\n\t\t\t\t$node->removeChild($child);\n\t\t\t}\n\n\t\t\tforeach($node->nodes as $entity) {\n\t\t\t\t$enidx = array_search($entity, $node->nodes, true);\n\t\t\t\t$edidx = array_search($entity, $node->dom->nodes, true);\n\n\t\t\t\tif ($enidx !== false && $edidx !== false) {\n\t\t\t\t\tunset($node->nodes[$enidx]);\n\t\t\t\t\tunset($node->dom->nodes[$edidx]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tunset($this->nodes[$nidx]);\n\t\t\tunset($this->children[$cidx]);\n\t\t\tunset($this->dom->nodes[$didx]);\n\n\t\t\t$node->clear();\n\n\t\t}\n\t}\n\n\tfunction getElementById($id)\n\t{\n\t\treturn $this->find(\"#$id\", 0);\n\t}\n\n\tfunction getElementsById($id, $idx = null)\n\t{\n\t\treturn $this->find(\"#$id\", $idx);\n\t}\n\n\tfunction getElementByTagName($name)\n\t{\n\t\treturn $this->find($name, 0);\n\t}\n\n\tfunction getElementsByTagName($name, $idx = null)\n\t{\n\t\treturn $this->find($name, $idx);\n\t}\n\n\tfunction parentNode()\n\t{\n\t\treturn $this->parent();\n\t}\n\n\tfunction childNodes($idx = -1)\n\t{\n\t\treturn $this->children($idx);\n\t}\n\n\tfunction firstChild()\n\t{\n\t\treturn $this->first_child();\n\t}\n\n\tfunction lastChild()\n\t{\n\t\treturn $this->last_child();\n\t}\n\n\tfunction nextSibling()\n\t{\n\t\treturn $this->next_sibling();\n\t}\n\n\tfunction previousSibling()\n\t{\n\t\treturn $this->prev_sibling();\n\t}\n\n\tfunction hasChildNodes()\n\t{\n\t\treturn $this->has_child();\n\t}\n\n\tfunction nodeName()\n\t{\n\t\treturn $this->tag;\n\t}\n\n\tfunction appendChild($node)\n\t{\n\t\t$node->parent($this);\n\t\treturn $node;\n\t}\n\n}\n\nclass simple_html_dom\n{\n\tpublic $root = null;\n\tpublic $nodes = array();\n\tpublic $callback = null;\n\tpublic $lowercase = false;\n\tpublic $original_size;\n\tpublic $size;\n\n\tprotected $pos;\n\tprotected $doc;\n\tprotected $char;\n\n\tprotected $cursor;\n\tprotected $parent;\n\tprotected $noise = array();\n\tprotected $token_blank = \" \\t\\r\\n\";\n\tprotected $token_equal = ' =/>';\n\tprotected $token_slash = \" />\\r\\n\\t\";\n\tprotected $token_attr = ' >';\n\n\tpublic $_charset = '';\n\tpublic $_target_charset = '';\n\n\tprotected $default_br_text = '';\n\n\tpublic $default_span_text = '';\n\n\tprotected $self_closing_tags = array(\n\t\t'area' => 1,\n\t\t'base' => 1,\n\t\t'br' => 1,\n\t\t'col' => 1,\n\t\t'embed' => 1,\n\t\t'hr' => 1,\n\t\t'img' => 1,\n\t\t'input' => 1,\n\t\t'link' => 1,\n\t\t'meta' => 1,\n\t\t'param' => 1,\n\t\t'source' => 1,\n\t\t'track' => 1,\n\t\t'wbr' => 1\n\t);\n\tprotected $block_tags = array(\n\t\t'body' => 1,\n\t\t'div' => 1,\n\t\t'form' => 1,\n\t\t'root' => 1,\n\t\t'span' => 1,\n\t\t'table' => 1\n\t);\n\tprotected $optional_closing_tags = array(\n\t\t// Not optional, see\n\t\t// https://www.w3.org/TR/html/textlevel-semantics.html#the-b-element\n\t\t'b' => array('b' => 1),\n\t\t'dd' => array('dd' => 1, 'dt' => 1),\n\t\t// Not optional, see\n\t\t// https://www.w3.org/TR/html/grouping-content.html#the-dl-element\n\t\t'dl' => array('dd' => 1, 'dt' => 1),\n\t\t'dt' => array('dd' => 1, 'dt' => 1),\n\t\t'li' => array('li' => 1),\n\t\t'optgroup' => array('optgroup' => 1, 'option' => 1),\n\t\t'option' => array('optgroup' => 1, 'option' => 1),\n\t\t'p' => array('p' => 1),\n\t\t'rp' => array('rp' => 1, 'rt' => 1),\n\t\t'rt' => array('rp' => 1, 'rt' => 1),\n\t\t'td' => array('td' => 1, 'th' => 1),\n\t\t'th' => array('td' => 1, 'th' => 1),\n\t\t'tr' => array('td' => 1, 'th' => 1, 'tr' => 1),\n\t);\n\n\tfunction __construct(\n\t\t$str = null,\n\t\t$lowercase = true,\n\t\t$forceTagsClosed = true,\n\t\t$target_charset = DEFAULT_TARGET_CHARSET,\n\t\t$stripRN = true,\n\t\t$defaultBRText = DEFAULT_BR_TEXT,\n\t\t$defaultSpanText = DEFAULT_SPAN_TEXT,\n\t\t$options = 0)\n\t{\n\t\tif ($str) {\n\t\t\tif (preg_match('/^http:\\/\\//i', $str) || is_file($str)) {\n\t\t\t\t$this->load_file($str);\n\t\t\t} else {\n\t\t\t\t$this->load(\n\t\t\t\t\t$str,\n\t\t\t\t\t$lowercase,\n\t\t\t\t\t$stripRN,\n\t\t\t\t\t$defaultBRText,\n\t\t\t\t\t$defaultSpanText,\n\t\t\t\t\t$options\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// Forcing tags to be closed implies that we don't trust the html, but\n\t\t// it can lead to parsing errors if we SHOULD trust the html.\n\t\tif (!$forceTagsClosed) {\n\t\t\t$this->optional_closing_array = array();\n\t\t}\n\n\t\t$this->_target_charset = $target_charset;\n\t}\n\n\tfunction __destruct()\n\t{\n\t\t$this->clear();\n\t}\n\n\tfunction load(\n\t\t$str,\n\t\t$lowercase = true,\n\t\t$stripRN = true,\n\t\t$defaultBRText = DEFAULT_BR_TEXT,\n\t\t$defaultSpanText = DEFAULT_SPAN_TEXT,\n\t\t$options = 0)\n\t{\n\t\tglobal $debug_object;\n\n\t\t// prepare\n\t\t$this->prepare($str, $lowercase, $defaultBRText, $defaultSpanText);\n\n\t\t// Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037\n\t\t// Script tags removal now preceeds style tag removal.\n\t\t// strip out <script> tags\n\t\t$this->remove_noise(\"'<\\s*script[^>]*[^/]>(.*?)<\\s*/\\s*script\\s*>'is\");\n\t\t$this->remove_noise(\"'<\\s*script\\s*>(.*?)<\\s*/\\s*script\\s*>'is\");\n\n\t\t// strip out the \\r \\n's if we are told to.\n\t\tif ($stripRN) {\n\t\t\t$this->doc = str_replace(\"\\r\", ' ', $this->doc);\n\t\t\t$this->doc = str_replace(\"\\n\", ' ', $this->doc);\n\n\t\t\t// set the length of content since we have changed it.\n\t\t\t$this->size = strlen($this->doc);\n\t\t}\n\n\t\t// strip out cdata\n\t\t$this->remove_noise(\"'<!\\[CDATA\\[(.*?)\\]\\]>'is\", true);\n\t\t// strip out comments\n\t\t$this->remove_noise(\"'<!--(.*?)-->'is\");\n\t\t// strip out <style> tags\n\t\t$this->remove_noise(\"'<\\s*style[^>]*[^/]>(.*?)<\\s*/\\s*style\\s*>'is\");\n\t\t$this->remove_noise(\"'<\\s*style\\s*>(.*?)<\\s*/\\s*style\\s*>'is\");\n\t\t// strip out preformatted tags\n\t\t$this->remove_noise(\"'<\\s*(?:code)[^>]*>(.*?)<\\s*/\\s*(?:code)\\s*>'is\");\n\t\t// strip out server side scripts\n\t\t$this->remove_noise(\"'(<\\?)(.*?)(\\?>)'s\", true);\n\n\t\tif($options & HDOM_SMARTY_AS_TEXT) { // Strip Smarty scripts\n\t\t\t$this->remove_noise(\"'(\\{\\w)(.*?)(\\})'s\", true);\n\t\t}\n\n\t\t// parsing\n\t\t$this->parse();\n\t\t// end\n\t\t$this->root->_[HDOM_INFO_END] = $this->cursor;\n\t\t$this->parse_charset();\n\n\t\t// make load function chainable\n\t\treturn $this;\n\t}\n\n\tfunction load_file()\n\t{\n\t\t$args = func_get_args();\n\n\t\tif(($doc = call_user_func_array('file_get_contents', $args)) !== false) {\n\t\t\t$this->load($doc, true);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction set_callback($function_name)\n\t{\n\t\t$this->callback = $function_name;\n\t}\n\n\tfunction remove_callback()\n\t{\n\t\t$this->callback = null;\n\t}\n\n\tfunction save($filepath = '')\n\t{\n\t\t$ret = $this->root->innertext();\n\t\tif ($filepath !== '') { file_put_contents($filepath, $ret, LOCK_EX); }\n\t\treturn $ret;\n\t}\n\n\tfunction find($selector, $idx = null, $lowercase = false)\n\t{\n\t\treturn $this->root->find($selector, $idx, $lowercase);\n\t}\n\n\tfunction clear()\n\t{\n\t\tif (isset($this->nodes)) {\n\t\t\tforeach ($this->nodes as $n) {\n\t\t\t\t$n->clear();\n\t\t\t\t$n = null;\n\t\t\t}\n\t\t}\n\n\t\t// This add next line is documented in the sourceforge repository.\n\t\t// 2977248 as a fix for ongoing memory leaks that occur even with the\n\t\t// use of clear.\n\t\tif (isset($this->children)) {\n\t\t\tforeach ($this->children as $n) {\n\t\t\t\t$n->clear();\n\t\t\t\t$n = null;\n\t\t\t}\n\t\t}\n\n\t\tif (isset($this->parent)) {\n\t\t\t$this->parent->clear();\n\t\t\tunset($this->parent);\n\t\t}\n\n\t\tif (isset($this->root)) {\n\t\t\t$this->root->clear();\n\t\t\tunset($this->root);\n\t\t}\n\n\t\tunset($this->doc);\n\t\tunset($this->noise);\n\t}\n\n\tfunction dump($show_attr = true)\n\t{\n\t\t$this->root->dump($show_attr);\n\t}\n\n\tprotected function prepare(\n\t\t$str, $lowercase = true,\n\t\t$defaultBRText = DEFAULT_BR_TEXT,\n\t\t$defaultSpanText = DEFAULT_SPAN_TEXT)\n\t{\n\t\t$this->clear();\n\n\t\t$this->doc = trim($str);\n\t\t$this->size = strlen($this->doc);\n\t\t$this->original_size = $this->size; // original size of the html\n\t\t$this->pos = 0;\n\t\t$this->cursor = 1;\n\t\t$this->noise = array();\n\t\t$this->nodes = array();\n\t\t$this->lowercase = $lowercase;\n\t\t$this->default_br_text = $defaultBRText;\n\t\t$this->default_span_text = $defaultSpanText;\n\t\t$this->root = new simple_html_dom_node($this);\n\t\t$this->root->tag = 'root';\n\t\t$this->root->_[HDOM_INFO_BEGIN] = -1;\n\t\t$this->root->nodetype = HDOM_TYPE_ROOT;\n\t\t$this->parent = $this->root;\n\t\tif ($this->size > 0) { $this->char = $this->doc[0]; }\n\t}\n\n\tprotected function parse()\n\t{\n\t\twhile (true) {\n\t\t\t// Read next tag if there is no text between current position and the\n\t\t\t// next opening tag.\n\t\t\tif (($s = $this->copy_until_char('<')) === '') {\n\t\t\t\tif($this->read_tag()) {\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add a text node for text between tags\n\t\t\t$node = new simple_html_dom_node($this);\n\t\t\t++$this->cursor;\n\t\t\t$node->_[HDOM_INFO_TEXT] = $s;\n\t\t\t$this->link_nodes($node, false);\n\t\t}\n\t}\n\n\tprotected function parse_charset()\n\t{\n\t\tglobal $debug_object;\n\n\t\t$charset = null;\n\n\t\tif (function_exists('get_last_retrieve_url_contents_content_type')) {\n\t\t\t$contentTypeHeader = get_last_retrieve_url_contents_content_type();\n\t\t\t$success = preg_match('/charset=(.+)/', $contentTypeHeader, $matches);\n\t\t\tif ($success) {\n\t\t\t\t$charset = $matches[1];\n\t\t\t\tif (is_object($debug_object)) {\n\t\t\t\t\t$debug_object->debug_log(2,\n\t\t\t\t\t\t'header content-type found charset of: '\n\t\t\t\t\t\t. $charset\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (empty($charset)) {\n\t\t\t// https://www.w3.org/TR/html/document-metadata.html#statedef-http-equiv-content-type\n\t\t\t$el = $this->root->find('meta[http-equiv=Content-Type]', 0, true);\n\n\t\t\tif (!empty($el)) {\n\t\t\t\t$fullvalue = $el->content;\n\t\t\t\tif (is_object($debug_object)) {\n\t\t\t\t\t$debug_object->debug_log(2,\n\t\t\t\t\t\t'meta content-type tag found'\n\t\t\t\t\t\t. $fullvalue\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!empty($fullvalue)) {\n\t\t\t\t\t$success = preg_match(\n\t\t\t\t\t\t'/charset=(.+)/i',\n\t\t\t\t\t\t$fullvalue,\n\t\t\t\t\t\t$matches\n\t\t\t\t\t);\n\n\t\t\t\t\tif ($success) {\n\t\t\t\t\t\t$charset = $matches[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If there is a meta tag, and they don't specify the\n\t\t\t\t\t\t// character set, research says that it's typically\n\t\t\t\t\t\t// ISO-8859-1\n\t\t\t\t\t\tif (is_object($debug_object)) {\n\t\t\t\t\t\t\t$debug_object->debug_log(2,\n\t\t\t\t\t\t\t\t'meta content-type tag couldn\\'t be parsed. using iso-8859 default.'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$charset = 'ISO-8859-1';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (empty($charset)) {\n\t\t\t// https://www.w3.org/TR/html/document-metadata.html#character-encoding-declaration\n\t\t\tif ($meta = $this->root->find('meta[charset]', 0)) {\n\t\t\t\t$charset = $meta->charset;\n\t\t\t\tif (is_object($debug_object)) {\n\t\t\t\t\t$debug_object->debug_log(2, 'meta charset: ' . $charset);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (empty($charset)) {\n\t\t\t// Try to guess the charset based on the content\n\t\t\t// Requires Multibyte String (mbstring) support (optional)\n\t\t\tif (function_exists('mb_detect_encoding')) {\n\t\t\t\t/**\n\t\t\t\t * mb_detect_encoding() is not intended to distinguish between\n\t\t\t\t * charsets, especially single-byte charsets. Its primary\n\t\t\t\t * purpose is to detect which multibyte encoding is in use,\n\t\t\t\t * i.e. UTF-8, UTF-16, shift-JIS, etc.\n\t\t\t\t *\n\t\t\t\t * -- https://bugs.php.net/bug.php?id=38138\n\t\t\t\t *\n\t\t\t\t * Adding both CP1251/ISO-8859-5 and CP1252/ISO-8859-1 will\n\t\t\t\t * always result in CP1251/ISO-8859-5 and vice versa.\n\t\t\t\t *\n\t\t\t\t * Thus, only detect if it's either UTF-8 or CP1252/ISO-8859-1\n\t\t\t\t * to stay compatible.\n\t\t\t\t */\n\t\t\t\t$encoding = mb_detect_encoding(\n\t\t\t\t\t$this->doc,\n\t\t\t\t\tarray( 'UTF-8', 'CP1252', 'ISO-8859-1' )\n\t\t\t\t);\n\n\t\t\t\tif ($encoding === 'CP1252' || $encoding === 'ISO-8859-1') {\n\t\t\t\t\t// Due to a limitation of mb_detect_encoding\n\t\t\t\t\t// 'CP1251'/'ISO-8859-5' will be detected as\n\t\t\t\t\t// 'CP1252'/'ISO-8859-1'. This will cause iconv to fail, in\n\t\t\t\t\t// which case we can simply assume it is the other charset.\n\t\t\t\t\tif (!@iconv('CP1252', 'UTF-8', $this->doc)) {\n\t\t\t\t\t\t$encoding = 'CP1251';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ($encoding !== false) {\n\t\t\t\t\t$charset = $encoding;\n\t\t\t\t\tif (is_object($debug_object)) {\n\t\t\t\t\t\t$debug_object->debug_log(2, 'mb_detect: ' . $charset);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (empty($charset)) {\n\t\t\t// Assume it's UTF-8 as it is the most likely charset to be used\n\t\t\t$charset = 'UTF-8';\n\t\t\tif (is_object($debug_object)) {\n\t\t\t\t$debug_object->debug_log(2, 'No match found, assume ' . $charset);\n\t\t\t}\n\t\t}\n\n\t\t// Since CP1252 is a superset, if we get one of it's subsets, we want\n\t\t// it instead.\n\t\tif ((strtolower($charset) == 'iso-8859-1')\n\t\t\t|| (strtolower($charset) == 'latin1')\n\t\t\t|| (strtolower($charset) == 'latin-1')) {\n\t\t\t$charset = 'CP1252';\n\t\t\tif (is_object($debug_object)) {\n\t\t\t\t$debug_object->debug_log(2,\n\t\t\t\t\t'replacing ' . $charset . ' with CP1252 as its a superset'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (is_object($debug_object)) {\n\t\t\t$debug_object->debug_log(1, 'EXIT - ' . $charset);\n\t\t}\n\n\t\treturn $this->_charset = $charset;\n\t}\n\n\tprotected function read_tag()\n\t{\n\t\t// Set end position if no further tags found\n\t\tif ($this->char !== '<') {\n\t\t\t$this->root->_[HDOM_INFO_END] = $this->cursor;\n\t\t\treturn false;\n\t\t}\n\n\t\t$begin_tag_pos = $this->pos;\n\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\n\t\t// end tag\n\t\tif ($this->char === '/') {\n\t\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\n\t\t\t// Skip whitespace in end tags (i.e. in \"</   html>\")\n\t\t\t$this->skip($this->token_blank);\n\t\t\t$tag = $this->copy_until_char('>');\n\n\t\t\t// Skip attributes in end tags\n\t\t\tif (($pos = strpos($tag, ' ')) !== false) {\n\t\t\t\t$tag = substr($tag, 0, $pos);\n\t\t\t}\n\n\t\t\t$parent_lower = strtolower($this->parent->tag);\n\t\t\t$tag_lower = strtolower($tag);\n\n\t\t\t// The end tag is supposed to close the parent tag. Handle situations\n\t\t\t// when it doesn't\n\t\t\tif ($parent_lower !== $tag_lower) {\n\t\t\t\t// Parent tag does not have to be closed necessarily (optional closing tag)\n\t\t\t\t// Current tag is a block tag, so it may close an ancestor\n\t\t\t\tif (isset($this->optional_closing_tags[$parent_lower])\n\t\t\t\t\t&& isset($this->block_tags[$tag_lower])) {\n\n\t\t\t\t\t$this->parent->_[HDOM_INFO_END] = 0;\n\t\t\t\t\t$org_parent = $this->parent;\n\n\t\t\t\t\t// Traverse ancestors to find a matching opening tag\n\t\t\t\t\t// Stop at root node\n\t\t\t\t\twhile (($this->parent->parent)\n\t\t\t\t\t\t&& strtolower($this->parent->tag) !== $tag_lower\n\t\t\t\t\t){\n\t\t\t\t\t\t$this->parent = $this->parent->parent;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we don't have a match add current tag as text node\n\t\t\t\t\tif (strtolower($this->parent->tag) !== $tag_lower) {\n\t\t\t\t\t\t$this->parent = $org_parent; // restore origonal parent\n\n\t\t\t\t\t\tif ($this->parent->parent) {\n\t\t\t\t\t\t\t$this->parent = $this->parent->parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$this->parent->_[HDOM_INFO_END] = $this->cursor;\n\t\t\t\t\t\treturn $this->as_text_node($tag);\n\t\t\t\t\t}\n\t\t\t\t} elseif (($this->parent->parent)\n\t\t\t\t\t&& isset($this->block_tags[$tag_lower])\n\t\t\t\t) {\n\t\t\t\t\t// Grandparent exists and current tag is a block tag, so our\n\t\t\t\t\t// parent doesn't have an end tag\n\t\t\t\t\t$this->parent->_[HDOM_INFO_END] = 0; // No end tag\n\t\t\t\t\t$org_parent = $this->parent;\n\n\t\t\t\t\t// Traverse ancestors to find a matching opening tag\n\t\t\t\t\t// Stop at root node\n\t\t\t\t\twhile (($this->parent->parent)\n\t\t\t\t\t\t&& strtolower($this->parent->tag) !== $tag_lower\n\t\t\t\t\t) {\n\t\t\t\t\t\t$this->parent = $this->parent->parent;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we don't have a match add current tag as text node\n\t\t\t\t\tif (strtolower($this->parent->tag) !== $tag_lower) {\n\t\t\t\t\t\t$this->parent = $org_parent; // restore origonal parent\n\t\t\t\t\t\t$this->parent->_[HDOM_INFO_END] = $this->cursor;\n\t\t\t\t\t\treturn $this->as_text_node($tag);\n\t\t\t\t\t}\n\t\t\t\t} elseif (($this->parent->parent)\n\t\t\t\t\t&& strtolower($this->parent->parent->tag) === $tag_lower\n\t\t\t\t) { // Grandparent exists and current tag closes it\n\t\t\t\t\t$this->parent->_[HDOM_INFO_END] = 0;\n\t\t\t\t\t$this->parent = $this->parent->parent;\n\t\t\t\t} else { // Random tag, add as text node\n\t\t\t\t\treturn $this->as_text_node($tag);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set end position of parent tag to current cursor position\n\t\t\t$this->parent->_[HDOM_INFO_END] = $this->cursor;\n\n\t\t\tif ($this->parent->parent) {\n\t\t\t\t$this->parent = $this->parent->parent;\n\t\t\t}\n\n\t\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\t\treturn true;\n\t\t}\n\n\t\t// start tag\n\t\t$node = new simple_html_dom_node($this);\n\t\t$node->_[HDOM_INFO_BEGIN] = $this->cursor;\n\t\t++$this->cursor;\n\t\t$tag = $this->copy_until($this->token_slash); // Get tag name\n\t\t$node->tag_start = $begin_tag_pos;\n\n\t\t// doctype, cdata & comments...\n\t\t// <!DOCTYPE html>\n\t\t// <![CDATA[ ... ]]>\n\t\t// <!-- Comment -->\n\t\tif (isset($tag[0]) && $tag[0] === '!') {\n\t\t\t$node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until_char('>');\n\n\t\t\tif (isset($tag[2]) && $tag[1] === '-' && $tag[2] === '-') { // Comment (\"<!--\")\n\t\t\t\t$node->nodetype = HDOM_TYPE_COMMENT;\n\t\t\t\t$node->tag = 'comment';\n\t\t\t} else { // Could be doctype or CDATA but we don't care\n\t\t\t\t$node->nodetype = HDOM_TYPE_UNKNOWN;\n\t\t\t\t$node->tag = 'unknown';\n\t\t\t}\n\n\t\t\tif ($this->char === '>') { $node->_[HDOM_INFO_TEXT] .= '>'; }\n\n\t\t\t$this->link_nodes($node, true);\n\t\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\t\treturn true;\n\t\t}\n\n\t\t// The start tag cannot contain another start tag, if so add as text\n\t\t// i.e. \"<<html>\"\n\t\tif ($pos = strpos($tag, '<') !== false) {\n\t\t\t$tag = '<' . substr($tag, 0, -1);\n\t\t\t$node->_[HDOM_INFO_TEXT] = $tag;\n\t\t\t$this->link_nodes($node, false);\n\t\t\t$this->char = $this->doc[--$this->pos]; // prev\n\t\t\treturn true;\n\t\t}\n\n\t\t// Handle invalid tag names (i.e. \"<html#doc>\")\n\t\tif (!preg_match('/^\\w[\\w:-]*$/', $tag)) {\n\t\t\t$node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until('<>');\n\n\t\t\t// Next char is the beginning of a new tag, don't touch it.\n\t\t\tif ($this->char === '<') {\n\t\t\t\t$this->link_nodes($node, false);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Next char closes current tag, add and be done with it.\n\t\t\tif ($this->char === '>') { $node->_[HDOM_INFO_TEXT] .= '>'; }\n\t\t\t$this->link_nodes($node, false);\n\t\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\t\treturn true;\n\t\t}\n\n\t\t// begin tag, add new node\n\t\t$node->nodetype = HDOM_TYPE_ELEMENT;\n\t\t$tag_lower = strtolower($tag);\n\t\t$node->tag = ($this->lowercase) ? $tag_lower : $tag;\n\n\t\t// handle optional closing tags\n\t\tif (isset($this->optional_closing_tags[$tag_lower])) {\n\t\t\t// Traverse ancestors to close all optional closing tags\n\t\t\twhile (isset($this->optional_closing_tags[$tag_lower][strtolower($this->parent->tag)])) {\n\t\t\t\t$this->parent->_[HDOM_INFO_END] = 0;\n\t\t\t\t$this->parent = $this->parent->parent;\n\t\t\t}\n\t\t\t$node->parent = $this->parent;\n\t\t}\n\n\t\t$guard = 0; // prevent infinity loop\n\n\t\t// [0] Space between tag and first attribute\n\t\t$space = array($this->copy_skip($this->token_blank), '', '');\n\n\t\t// attributes\n\t\tdo {\n\t\t\t// Everything until the first equal sign should be the attribute name\n\t\t\t$name = $this->copy_until($this->token_equal);\n\n\t\t\tif ($name === '' && $this->char !== null && $space[0] === '') {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif ($guard === $this->pos) { // Escape infinite loop\n\t\t\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$guard = $this->pos;\n\n\t\t\t// handle endless '<'\n\t\t\t// Out of bounds before the tag ended\n\t\t\tif ($this->pos >= $this->size - 1 && $this->char !== '>') {\n\t\t\t\t$node->nodetype = HDOM_TYPE_TEXT;\n\t\t\t\t$node->_[HDOM_INFO_END] = 0;\n\t\t\t\t$node->_[HDOM_INFO_TEXT] = '<' . $tag . $space[0] . $name;\n\t\t\t\t$node->tag = 'text';\n\t\t\t\t$this->link_nodes($node, false);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// handle mismatch '<'\n\t\t\t// Attributes cannot start after opening tag\n\t\t\tif ($this->doc[$this->pos - 1] == '<') {\n\t\t\t\t$node->nodetype = HDOM_TYPE_TEXT;\n\t\t\t\t$node->tag = 'text';\n\t\t\t\t$node->attr = array();\n\t\t\t\t$node->_[HDOM_INFO_END] = 0;\n\t\t\t\t$node->_[HDOM_INFO_TEXT] = substr(\n\t\t\t\t\t$this->doc,\n\t\t\t\t\t$begin_tag_pos,\n\t\t\t\t\t$this->pos - $begin_tag_pos - 1\n\t\t\t\t);\n\t\t\t\t$this->pos -= 2;\n\t\t\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\t\t\t$this->link_nodes($node, false);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif ($name !== '/' && $name !== '') { // this is a attribute name\n\t\t\t\t// [1] Whitespace after attribute name\n\t\t\t\t$space[1] = $this->copy_skip($this->token_blank);\n\n\t\t\t\t$name = $this->restore_noise($name); // might be a noisy name\n\n\t\t\t\tif ($this->lowercase) { $name = strtolower($name); }\n\n\t\t\t\tif ($this->char === '=') { // attribute with value\n\t\t\t\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\t\t\t\t$this->parse_attr($node, $name, $space); // get attribute value\n\t\t\t\t} else {\n\t\t\t\t\t//no value attr: nowrap, checked selected...\n\t\t\t\t\t$node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;\n\t\t\t\t\t$node->attr[$name] = true;\n\t\t\t\t\tif ($this->char != '>') { $this->char = $this->doc[--$this->pos]; } // prev\n\t\t\t\t}\n\n\t\t\t\t$node->_[HDOM_INFO_SPACE][] = $space;\n\n\t\t\t\t// prepare for next attribute\n\t\t\t\t$space = array(\n\t\t\t\t\t$this->copy_skip($this->token_blank),\n\t\t\t\t\t'',\n\t\t\t\t\t''\n\t\t\t\t);\n\t\t\t} else { // no more attributes\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while ($this->char !== '>' && $this->char !== '/'); // go until the tag ended\n\n\t\t$this->link_nodes($node, true);\n\t\t$node->_[HDOM_INFO_ENDSPACE] = $space[0];\n\n\t\t// handle empty tags (i.e. \"<div/>\")\n\t\tif ($this->copy_until_char('>') === '/') {\n\t\t\t$node->_[HDOM_INFO_ENDSPACE] .= '/';\n\t\t\t$node->_[HDOM_INFO_END] = 0;\n\t\t} else {\n\t\t\t// reset parent\n\t\t\tif (!isset($this->self_closing_tags[strtolower($node->tag)])) {\n\t\t\t\t$this->parent = $node;\n\t\t\t}\n\t\t}\n\n\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\n\t\t// If it's a BR tag, we need to set it's text to the default text.\n\t\t// This way when we see it in plaintext, we can generate formatting that the user wants.\n\t\t// since a br tag never has sub nodes, this works well.\n\t\tif ($node->tag === 'br') {\n\t\t\t$node->_[HDOM_INFO_INNER] = $this->default_br_text;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected function parse_attr($node, $name, &$space)\n\t{\n\t\t$is_duplicate = isset($node->attr[$name]);\n\n\t\tif (!$is_duplicate) // Copy whitespace between \"=\" and value\n\t\t\t$space[2] = $this->copy_skip($this->token_blank);\n\n\t\tswitch ($this->char) {\n\t\t\tcase '\"':\n\t\t\t\t$quote_type = HDOM_QUOTE_DOUBLE;\n\t\t\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\t\t\t$value = $this->copy_until_char('\"');\n\t\t\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\t\t\tbreak;\n\t\t\tcase '\\'':\n\t\t\t\t$quote_type = HDOM_QUOTE_SINGLE;\n\t\t\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\t\t\t$value = $this->copy_until_char('\\'');\n\t\t\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t$quote_type = HDOM_QUOTE_NO;\n\t\t\t\t$value = $this->copy_until($this->token_attr);\n\t\t}\n\n\t\t$value = $this->restore_noise($value);\n\n\t\t// PaperG: Attributes should not have \\r or \\n in them, that counts as\n\t\t// html whitespace.\n\t\t$value = str_replace(\"\\r\", '', $value);\n\t\t$value = str_replace(\"\\n\", '', $value);\n\n\t\t// PaperG: If this is a \"class\" selector, lets get rid of the preceeding\n\t\t// and trailing space since some people leave it in the multi class case.\n\t\tif ($name === 'class') {\n\t\t\t$value = trim($value);\n\t\t}\n\n\t\tif (!$is_duplicate) {\n\t\t\t$node->_[HDOM_INFO_QUOTE][] = $quote_type;\n\t\t\t$node->attr[$name] = $value;\n\t\t}\n\t}\n\n\tprotected function link_nodes(&$node, $is_child)\n\t{\n\t\t$node->parent = $this->parent;\n\t\t$this->parent->nodes[] = $node;\n\t\tif ($is_child) {\n\t\t\t$this->parent->children[] = $node;\n\t\t}\n\t}\n\n\tprotected function as_text_node($tag)\n\t{\n\t\t$node = new simple_html_dom_node($this);\n\t\t++$this->cursor;\n\t\t$node->_[HDOM_INFO_TEXT] = '</' . $tag . '>';\n\t\t$this->link_nodes($node, false);\n\t\t$this->char = (++$this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\treturn true;\n\t}\n\n\tprotected function skip($chars)\n\t{\n\t\t$this->pos += strspn($this->doc, $chars, $this->pos);\n\t\t$this->char = ($this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t}\n\n\tprotected function copy_skip($chars)\n\t{\n\t\t$pos = $this->pos;\n\t\t$len = strspn($this->doc, $chars, $pos);\n\t\t$this->pos += $len;\n\t\t$this->char = ($this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\tif ($len === 0) { return ''; }\n\t\treturn substr($this->doc, $pos, $len);\n\t}\n\n\tprotected function copy_until($chars)\n\t{\n\t\t$pos = $this->pos;\n\t\t$len = strcspn($this->doc, $chars, $pos);\n\t\t$this->pos += $len;\n\t\t$this->char = ($this->pos < $this->size) ? $this->doc[$this->pos] : null; // next\n\t\treturn substr($this->doc, $pos, $len);\n\t}\n\n\tprotected function copy_until_char($char)\n\t{\n\t\tif ($this->char === null) { return ''; }\n\n\t\tif (($pos = strpos($this->doc, $char, $this->pos)) === false) {\n\t\t\t$ret = substr($this->doc, $this->pos, $this->size - $this->pos);\n\t\t\t$this->char = null;\n\t\t\t$this->pos = $this->size;\n\t\t\treturn $ret;\n\t\t}\n\n\t\tif ($pos === $this->pos) { return ''; }\n\n\t\t$pos_old = $this->pos;\n\t\t$this->char = $this->doc[$pos];\n\t\t$this->pos = $pos;\n\t\treturn substr($this->doc, $pos_old, $pos - $pos_old);\n\t}\n\n\tprotected function remove_noise($pattern, $remove_tag = false)\n\t{\n\t\tglobal $debug_object;\n\t\tif (is_object($debug_object)) { $debug_object->debug_log_entry(1); }\n\n\t\t$count = preg_match_all(\n\t\t\t$pattern,\n\t\t\t$this->doc,\n\t\t\t$matches,\n\t\t\tPREG_SET_ORDER | PREG_OFFSET_CAPTURE\n\t\t);\n\n\t\tfor ($i = $count - 1; $i > -1; --$i) {\n\t\t\t$key = '___noise___' . sprintf('% 5d', count($this->noise) + 1000);\n\n\t\t\tif (is_object($debug_object)) {\n\t\t\t\t$debug_object->debug_log(2, 'key is: ' . $key);\n\t\t\t}\n\n\t\t\t$idx = ($remove_tag) ? 0 : 1; // 0 = entire match, 1 = submatch\n\t\t\t$this->noise[$key] = $matches[$i][$idx][0];\n\t\t\t$this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0]));\n\t\t}\n\n\t\t// reset the length of content\n\t\t$this->size = strlen($this->doc);\n\n\t\tif ($this->size > 0) {\n\t\t\t$this->char = $this->doc[0];\n\t\t}\n\t}\n\n\tfunction restore_noise($text)\n\t{\n\t\tglobal $debug_object;\n\t\tif (is_object($debug_object)) { $debug_object->debug_log_entry(1); }\n\n\t\twhile (($pos = strpos($text, '___noise___')) !== false) {\n\t\t\t// Sometimes there is a broken piece of markup, and we don't GET the\n\t\t\t// pos+11 etc... token which indicates a problem outside of us...\n\n\t\t\t// todo: \"___noise___1000\" (or any number with four or more digits)\n\t\t\t// in the DOM causes an infinite loop which could be utilized by\n\t\t\t// malicious software\n\t\t\tif (strlen($text) > $pos + 15) {\n\t\t\t\t$key = '___noise___'\n\t\t\t\t. $text[$pos + 11]\n\t\t\t\t. $text[$pos + 12]\n\t\t\t\t. $text[$pos + 13]\n\t\t\t\t. $text[$pos + 14]\n\t\t\t\t. $text[$pos + 15];\n\n\t\t\t\tif (is_object($debug_object)) {\n\t\t\t\t\t$debug_object->debug_log(2, 'located key of: ' . $key);\n\t\t\t\t}\n\n\t\t\t\tif (isset($this->noise[$key])) {\n\t\t\t\t\t$text = substr($text, 0, $pos)\n\t\t\t\t\t. $this->noise[$key]\n\t\t\t\t\t. substr($text, $pos + 16);\n\t\t\t\t} else {\n\t\t\t\t\t// do this to prevent an infinite loop.\n\t\t\t\t\t$text = substr($text, 0, $pos)\n\t\t\t\t\t. 'UNDEFINED NOISE FOR KEY: '\n\t\t\t\t\t. $key\n\t\t\t\t\t. substr($text, $pos + 16);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// There is no valid key being given back to us... We must get\n\t\t\t\t// rid of the ___noise___ or we will have a problem.\n\t\t\t\t$text = substr($text, 0, $pos)\n\t\t\t\t. 'NO NUMERIC NOISE KEY'\n\t\t\t\t. substr($text, $pos + 11);\n\t\t\t}\n\t\t}\n\t\treturn $text;\n\t}\n\n\tfunction search_noise($text)\n\t{\n\t\tglobal $debug_object;\n\t\tif (is_object($debug_object)) { $debug_object->debug_log_entry(1); }\n\n\t\tforeach($this->noise as $noiseElement) {\n\t\t\tif (strpos($noiseElement, $text) !== false) {\n\t\t\t\treturn $noiseElement;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction __toString()\n\t{\n\t\treturn $this->root->innertext();\n\t}\n\n\tfunction __get($name)\n\t{\n\t\tswitch ($name) {\n\t\t\tcase 'outertext':\n\t\t\t\treturn $this->root->innertext();\n\t\t\tcase 'innertext':\n\t\t\t\treturn $this->root->innertext();\n\t\t\tcase 'plaintext':\n\t\t\t\treturn $this->root->text();\n\t\t\tcase 'charset':\n\t\t\t\treturn $this->_charset;\n\t\t\tcase 'target_charset':\n\t\t\t\treturn $this->_target_charset;\n\t\t}\n\t}\n\n\tfunction childNodes($idx = -1)\n\t{\n\t\treturn $this->root->childNodes($idx);\n\t}\n\n\tfunction firstChild()\n\t{\n\t\treturn $this->root->first_child();\n\t}\n\n\tfunction lastChild()\n\t{\n\t\treturn $this->root->last_child();\n\t}\n\n\tfunction createElement($name, $value = null)\n\t{\n\t\treturn @str_get_html(\"<$name>$value</$name>\")->firstChild();\n\t}\n\n\tfunction createTextNode($value)\n\t{\n\t\treturn @end(str_get_html($value)->nodes);\n\t}\n\n\tfunction getElementById($id)\n\t{\n\t\treturn $this->find(\"#$id\", 0);\n\t}\n\n\tfunction getElementsById($id, $idx = null)\n\t{\n\t\treturn $this->find(\"#$id\", $idx);\n\t}\n\n\tfunction getElementByTagName($name)\n\t{\n\t\treturn $this->find($name, 0);\n\t}\n\n\tfunction getElementsByTagName($name, $idx = -1)\n\t{\n\t\treturn $this->find($name, $idx);\n\t}\n\n\tfunction loadFile()\n\t{\n\t\t$args = func_get_args();\n\t\t$this->load_file($args);\n\t}\n}\n"
  },
  {
    "path": "core/widget/UserAction.php",
    "content": "<?php\nuse Typecho\\Db;\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    Typecho_Widget::widget('Widget_User')->to($user);\n    $db = \\Typecho\\Db::get();\n$id = $this->user->uid;\n\nfunction curl_getToken($url, $email = '', $password = '')\n{\n    $ch = curl_init();\n    $postData = [\n        'email' => $email,\n        'password' => $password\n    ];\n    \n    curl_setopt($ch, CURLOPT_URL, $url.'/api/v1/tokens');\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n    curl_setopt($ch, CURLOPT_POST, 1);\n    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);\n    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');\n\n    $output = curl_exec($ch);\n    curl_close($ch);\n    \n    $response = json_decode($output, true);\n    \n    if ($response && isset($response['status'])) {\n        if ($response['status'] === true && isset($response['data']['token'])) {\n             exit(json_encode([\n            'code'=> 1,\n            'msg' => $response['data']['token'],\n    ]));\n        } elseif (isset($response['message'])) {\n             exit(json_encode([\n            'code'=> 0,\n            'msg' => $response['message']\n    ]));\n        }\n    }\n    \n    return false; // or return an appropriate default value\n}\n\n\n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false  && $user->hasLogin()) {   \n        if($_POST['type'] == 'getLskyProToken'){\n            if(get_option('bearsimple')[\"lskypro_api\"] == null || get_option('bearsimple')[\"lskypro_api\"] == ''){\n                exit(json_encode([\n            'code'=> 0,\n            'msg' => '您需要先填写LskyPro Api地址并保存选项后再进行获取Token操作！'\n    ]));\n            }\n            if($_POST['lskypro_username'] == null || $_POST['lskypro_username'] == ''){\n                exit(json_encode([\n            'code'=> 0,\n            'msg' => '账号为空，请重新填写'\n    ]));\n            }\n            if($_POST['lskypro_password'] == null || $_POST['lskypro_password'] == ''){\n                exit(json_encode([\n            'code'=> 0,\n            'msg' => '密码为空，请重新填写'\n    ]));\n            }\n            curl_getToken(get_option('bearsimple')[\"lskypro_api\"], $_POST['lskypro_username'], $_POST['lskypro_password']);\n        }\n        elseif($_POST['type'] == 'getallpost'){\n            if(empty($_POST['page'])){\n    $i = 1;\n}\nelse{\n    $i = $_POST['page']; \n}\n$total = count($db->fetchAll($db->select()->from('table.contents')\n            ->where('authorId = ?',$id)\n            ->where('type = ?', 'post')));\n\n        $post = $db->fetchAll($db->select()->from('table.contents')\n            ->where('authorId = ?',$id)\n            ->where('type = ?', 'post')\n            ->order('cid', Typecho_Db::SORT_DESC)\n            ->page($i,6));\n        $max = ceil($total / 6);\n        $result = array(\n            'total' => $total,\n    'max' => $max,\n    'list' => array()\n);\n    if($post){\n            foreach($post as $val){                \n                $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);\n                $post_title = htmlspecialchars($val['title']);\n                $permalink = $val['permalink'];\n                if($val['status'] == 'publish'){\n                    $post_title = '<a href=\"'.$permalink.'\" target=\"_blank\">'.$post_title.'</a>';\n                }\n                switch($val['status']){\n                    case 'publish':\n                        $val['status'] = '<i class=\"check green icon\"></i>审核通过';\n                        break;\n                    case 'hidden':\n                        $val['status'] = '<i class=\"eye slash outline icon\"></i>已被隐藏';\n                        break;\n                    case 'password':\n                        $val['status'] = '<i class=\"user lock icon\"></i>密码保护';\n                        break;\n                    case 'private':\n                        $val['status'] = '<i class=\"user shield icon\"></i>私密不公开';\n                        break;\n                    case 'waiting':\n                        $val['status'] = '<i class=\"hourglass half icon\"></i>等待审核';\n                        break;\n                }\n                $result['list'][] = array(\n                    'post_title'=> $post_title,\n                    'post_time' =>date('Y年m月d日',$val['created']),\n                    'post_category' =>getCategoryName(categeid($val['category'])),\n                    'post_status'=>$val['status']\n                    );\n                    \n            }\n           \n    }\n\n echo json_encode($result);\n        }\n        elseif($_POST['type'] == 'searchuser' && $user->pass('administrator', true)){\n            if(empty($_POST['page'])){\n    $i = 1;\n}\nelse{\n    $i = $_POST['page']; \n}\nif($_POST['searchval']){\n             $searchQuery = '%' . str_replace(' ', '%', $_POST['searchval']) . '%';\n       $total = count($db->fetchAll($db->select()->from('table.users')->where('name LIKE ? ', $searchQuery)));\n       $userlist = $db->fetchAll($db->select()->from('table.users')->where('name LIKE ? ', $searchQuery)->page($i,6));\n       $max = ceil($total / 6);\n       \n        $result = array(\n           'total' => $total,\n    'max' => $max,\n    'list' => array()\n);\nif($userlist){\n            foreach($userlist as $val){ \n                if($val['submission'] == 1){\n                    $val['submission'] = '开启';\n                }\n                else{\n                    $val['submission'] = '关闭';\n                }\n                switch($val['group']){\n                    case 'administrator':\n                      $val['group'] = '管理员';\n                      break;\n                      case 'editor':\n                       $val['group'] = '编辑';\n                       break;\n                       case 'subscriber':\n                       $val['group'] = '关注者';\n                       break;\n                       case 'contributor':\n                       $val['group'] = '贡献者';\n                       break;\n                       default:$val['group'] = '访问者';\n                       \n                }\n                if(Bsoptions('UserCenter_coin_name') !== ''):$coin_name = Bsoptions('UserCenter_coin_name');else:$coin_name = '积分';endif;\n$result['list'][] = array(\n                    'uid'=> $val['uid'],\n                    'name' =>$val['name'],\n                    'screenName' =>$val['screenName'],\n                    'mail'=>$val['mail'],\n                    'group'=>$val['group'],\n                    'coins'=>$val['coins'],\n                    'submission'=>$val['submission'],\n                    'post_num'=>allpostnum($val['uid']),\n                    'coin_name'=>$coin_name\n                    );\n}\n}\n}\nelse{\n    $total = 0;\n    $max = ceil($total / 6);\n    $userlist = array();\n     $result = array(\n           'total' => $total,\n    'max' => $max,\n    'list' => array()\n);\n$result['list'] = $userlist;\n}\n      \n         echo json_encode($result);\n        }\n       \n      elseif($_POST['type'] == 'edituser' && $user->pass('administrator', true)){\n          if($_POST['submission_type'] == 'open'){\n              $submission = 1;\n          }\n          else{\n              $submission = 0;\n          }\n         \n          $user_data = array(\n                'coins' =>  preg_replace(\"/[^0-9]/\", \"\", htmlspecialchars($_POST['coins'],ENT_QUOTES,'UTF-8')),\n                'submission' => $submission,\n            );\n            $db->query($db->update('table.users')->rows($user_data)->where('uid = ?', $_POST['uid']));\n            echo 1;\n      }\n\t elseif($_POST['type'] == 'editUserSignature'){\n          $user_data = array('signature' =>  htmlspecialchars($_POST['person_Signature'],ENT_QUOTES,'UTF-8'));\n            $db->query($db->update('table.users')->rows($user_data)->where('uid = ?', $this->user->uid));\n            echo 1;\n      }\n      elseif($_POST['type'] == 'submitsays'){\n          if($_POST['saysprivate'] == 'on'){\n              $saysprivate = 'on';\n          }\n          else{\n              $saysprivate = 'off';\n          }\n          if($_POST['sid']){\n           $user_data = array(\n                'saystext' => htmlspecialchars($_POST['saystext'],ENT_QUOTES,'UTF-8'),\n                'saysprivate' => $saysprivate,\n                );\n            $db->query($db->update('table.bscore_says_data')->where('id = ?',$_POST['sid'])->rows($user_data));   \n            $result = array(\n    'code' => 1,\n    'sid' => $_POST['sid'],\n    'message' => 'success'\n);\nexit(json_encode($result));  \n          }\n          else{\n          $user_data = array(\n                'saysuid' =>  $this->user->uid,\n                'saystime' => time(),\n                'saystext' => htmlspecialchars($_POST['saystext'],ENT_QUOTES,'UTF-8'),\n                'saysprivate' => $saysprivate,\n                );\n            $db->query($db->insert('table.bscore_says_data')->rows($user_data));\n            $result = array(\n    'code' => 1,\n    'sid' => '',\n    'message' => 'success'\n);\nexit(json_encode($result));  \n          }\n            \n          \n      }\n      elseif($_POST['type'] == 'getsays'){\n          \n                      if(empty($_POST['page'])){\n    $i = 1;\n}\nelse{\n    $i = $_POST['page']; \n}\nif($_POST['index'] == '2'){\n$total = count($db->fetchAll($db->select()->from('table.bscore_says_data')\n            ->where('saysuid = ?',$this->user->uid)));\n\n        $says = $db->fetchAll($db->select()->from('table.bscore_says_data')\n            ->where('saysuid = ?',$this->user->uid)\n            ->order('id', Typecho_Db::SORT_DESC)\n            ->page($i,6));\n}\nelse{\n$total = count($db->fetchAll($db->select()->from('table.bscore_says_data')\n            ->where('saysuid = ?',$this->user->uid)->where('saysprivate != ?','on')));\n\n        $says = $db->fetchAll($db->select()->from('table.bscore_says_data')\n            ->where('saysuid = ?',$this->user->uid)\n            ->where('saysprivate != ?','on')\n            ->order('id', Typecho_Db::SORT_DESC)\n            ->page($i,6));    \n}\n        $max = ceil($total / 6);\n        $result = array(\n            'total' => $total,\n    'max' => $max,\n    'list' => array()\n);\n    if($says){\n            foreach($says as $val){                \n          if($_POST['index'] == '2'){\n                $result['list'][] = array(\n                    'saysid'=> $val['id'],\n                    'saystime' =>date('Y年m月d日',$val['saystime']),\n                    'saysprivate' =>$val['saysprivate'],\n                    'sayslike' =>$val['sayslike'],\n                    'saystext'=>ParseCross(reEmo($val['saystext'],'comment')),\n                    'saystext_sim'=>$val['saystext']\n                    );\n          }\n          else{\n             $result['list'][] = array(\n                    'saysid'=> $val['id'],\n                    'saystime' =>date('Y年m月d日',$val['saystime']),\n                    'sayslike' =>$val['sayslike'],\n                    'saystext'=>ParseCross(reEmo($val['saystext'],'comment'))\n                    ); \n          }\n            }\n           \n    }\n\n echo json_encode($result);\n          \n          \n          \n      }\nelseif($_POST['type'] == 'deletesays'){\n    if(is_numeric($_POST['saysid'])){\n    $db->query($db->delete('table.bscore_says_data')->where('id = ?', $_POST['saysid']));\n    echo 1;\n}\nelse{\n   echo 0; \n}\n}\n    }\n if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) {   \nif($_POST['type'] == 'getsays_index'){\n          \n                      if(empty($_POST['page'])){\n    $i = 1;\n}\nelse{\n    $i = $_POST['page']; \n}\n\n$total = count($db->fetchAll($db->select()->from('table.bscore_says_data')\n            ->where('saysuid = ?',$_POST['authorId'])->where('saysprivate != ?','on')));\n\n        $says = $db->fetchAll($db->select()->from('table.bscore_says_data')\n            ->where('saysuid = ?',$_POST['authorId'])\n            ->where('saysprivate != ?','on')\n            ->order('id', Typecho_Db::SORT_DESC)\n            ->page($i,6));    \n\n        $max = ceil($total / 6);\n        $result = array(\n            'total' => $total,\n    'max' => $max,\n    'list' => array()\n);\n    if($says){\n            foreach($says as $val){                \n          \n             $result['list'][] = array(\n                    'saysid'=> $val['id'],\n                    'saystime' =>date('Y年m月d日',$val['saystime']),\n                    'sayslike' =>$val['sayslike'],\n                    'saystext'=>ParseCross(reEmo($val['saystext'],'comment')),\n                    ); \n          \n            }\n           \n    }\n\n echo json_encode($result);\n          \n          \n          \n      }\n      \n      elseif($_POST['type'] == 'like'){\n    if(!is_numeric($_POST['sid'])){\n                $result = array(\n    'code' => 0,\n    'message' => 'error'\n);\nexit(json_encode($result));  \n    }\n    $oldlikenum = $db->fetchRow($db->select('table.bscore_says_data.sayslike')->from('table.bscore_says_data')->where('saysuid = ?', $_POST['authorId'])->where('id = ?', $_POST['sid']));\n             $db->query($db->update('table.bscore_says_data')->rows(array('sayslike' => (int)$oldlikenum['sayslike'] + 1))->where('saysuid = ?', $_POST['authorId'])->where('id = ?', $_POST['sid']));\n $result = array(\n    'code' => 1,\n    'sid' => $_POST['sid'],\n    'msg' => 'success',\n);\n        exit(json_encode($result));\n}\n\n}"
  },
  {
    "path": "core/widget/aiTools.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    use Typecho\\Db;\nuse Typecho\\Common;\nuse Widget\\Options;\n\n    $options = Helper::options();\n    $temoptions = bsOptions::getInstance()::get_option('bearsimple');\n    $removeChar = [\"https://\", \"http://\"]; \n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) { \n$data = [];\n\n$i = 0;\nif($temoptions['AIService_Blacklist'] !== '' && @is_array($temoptions['AIService_Blacklist'])){\nforeach($temoptions['AIService_Blacklist'] as $val){\n$this->widget('Widget_Archive@aitools'.$i.'post', 'pageSize=1&type=post', 'cid='.$val)->to($arr);\n$data['blackurls'][] = $arr->permalink;\n$i++;\n}\n}\nif($temoptions['AIService_Blacklist_Page'] !== '' && @is_array($temoptions['AIService_Blacklist_Page'])){\nforeach($temoptions['AIService_Blacklist_Page'] as $val){\n$this->widget('Widget_Archive@aitools'.$i.'page', 'pageSize=1&type=page', 'cid='.$val)->to($arrs);\n$data['blackurls'][] = $arrs->permalink;\n$i++;\n}\n}\necho json_encode($data);\n}"
  },
  {
    "path": "core/widget/bsBackendAction.php",
    "content": "<?php\nuse Typecho\\Db;\nuse Typecho\\Common;\nuse Widget\\Options;\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    $temoptions = bsOptions::getInstance()::get_option('bearsimple');\n    Typecho_Widget::widget('Widget_User')->to($user);\n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false && $user->hasLogin() && $user->pass('administrator', true)) {   \n        $db = \\Typecho\\Db::get();\n    switch($_POST['type']){\n        case 'editmedia':\n            $db->query($db->update('table.contents')->rows(array(\n                'parent' => '999999999'))\n                ->where('cid = ?', $_POST['media-cid']));\n                        echo 1;\n            break;\n        case 'rebuildCron':\n            $table = $db->getPrefix() . 'bscore_cron_data';\n                 $sql = \"DROP TABLE IF EXISTS $table\";\n    $db->query($sql);\n $result = array(\n    'code' => 1,\n    'message' => '计划任务表重建成功~'\n    \n);\nexit(json_encode($result));\n            break;\n            case 'fixTable':\n            $option_val_type = $db->fetchObject($db->query('SELECT DATA_TYPE as dt FROM INFORMATION_SCHEMA.COLUMNS  WHERE table_name = \\''.$db->getPrefix().'bscore_wechat_data\\' and column_name=\\'content\\''))->dt;\n    if($option_val_type !== 'longtext'){\n    $db->query('alter table `'.$db->getPrefix().'bscore_wechat_data` modify column `content` longtext');\n    }\n $result = array(\n    'code' => 1,\n    'message' => '修复成功~'\n    \n);\nexit(json_encode($result));\n            break;\n    }    \n    }"
  },
  {
    "path": "core/widget/bsajax.php",
    "content": "<?php\nif(!class_exists('CSF')){\n    require_once Helper::options()->pluginDir('BsCore').'/functions/defines.php';\n    require_once Helper::options()->pluginDir('BsCore').'/bsoptions-framework.php';\n}\nuse Typecho\\Db;\nuse Utils\\Helper;\nuse CSF;\nob_clean();\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    header('Content-type: application/json');\n    date_default_timezone_set('PRC');\n$user = \\Typecho\\Widget::widget('Widget_User');\n        if (!$user->hasLogin()) {\n            $data = [\n                'data' => [\n                    'notice' => '未登录',\n                    'errors' => []\n                ],\n                'success' => false\n            ];\n            $this->response->throwJson($data);\n        }\n\n        $action = $this->request->get('action', null);\n        if (!$action) {\n            $data = [\n                'data' => [\n                    'notice' => '参数错误',\n                    'errors' => []\n                ],\n                'success' => false\n            ];\n            $this->response->throwJson($data);\n        }\n        if (preg_match('/csf_(.*)_ajax_save/i', $action)) {\n            $data = json_decode($_POST['data'], true);\n            $plugin = $data['plugin'];\n\n\n            $obj = get_bs_key_params($plugin);\n            $ret = $obj->set_options(true);\n\n            if ($ret and empty($obj->errors)) {\n                $data = [\n                    'data' => [\n                        'notice' => $obj->notice,\n                        'errors' => $obj->errors\n                    ],\n                    'success' => true\n                ];\n                $this->response->throwJson($data);\n            } else {\n                $data = [\n                    'data' => [\n                        'notice' => $obj->notice,\n                        'errors' => $obj->errors\n                    ],\n                    'success' => true\n                ];\n                $this->response->throwJson($data);\n            }\n\n        } else {\n            $action = str_replace('-', '_', $action);\n            CSF::include_plugin_file('functions/actions.php');\n            $action($this->response);\n        }"
  },
  {
    "path": "core/widget/circleAction.php",
    "content": "<?php\nob_clean();\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    header('Content-type: application/json');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    Typecho_Widget::widget('Widget_User')->to($user);\n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) {   \n   $db = \\Typecho\\Db::get();\n    switch($_POST['action']){\n       case 'like':\n           $like = $db->fetchRow($db->select()->from('table.bscore_friendcircle_data')->where('coid = ?', $_POST['coid']));\n           if($user->hasLogin()){\n               if($like['likeUser'] !== null && strpos($like['likeUser'],$user->screenName)!== false){\n                 exit(json_encode(array(\n        \"code\" => 500,\n        \"msg\" => '您已点过赞，请勿重复点赞！',\n        )));  \n               }\n          \n           if($like['likeUser'] == null){\n               $userName = $user->screenName;\n           }\n           else{\n              $userName = $like['likeUser'] .'，'.$user->screenName; \n           }\n            $db->query($db->update('table.bscore_friendcircle_data')->rows(array('likeUser' => $userName))->where('coid = ?', $_POST['coid']));\n            \n            $like = $db->fetchRow($db->select()->from('table.bscore_friendcircle_data')->where('coid = ?', $_POST['coid']));\n          if(!empty($like['likeVisitor'])){\n             $like['likeVisitor'] = $like['likeVisitor'].'位访客'; \n          }\n          if(!$like['likeVisitor']){\n              $like['likeVisitor'] = '';\n          }\n          if(!$like['likeUser']){\n              $like['likeUser'] = '';\n          }\n          exit(json_encode(array(\n        \"code\" => 200,\n        \"msg\" => '点赞成功',\n        \"likeVisitor\" => $like['likeVisitor'],\n        \"likeUser\" => $like['likeUser'],\n        )));\n        \n        \n           }\n           else{\n            if(Typecho_Cookie::get('like_circle_'.$_POST['coid']) == '1'){\n                exit(json_encode(array(\n        \"code\" => 500,\n        \"msg\" => '您已点过赞，请勿重复点赞！',\n        )));  \n            }\n               if($like['likeVisitor'] == null){\n                   $visitorNum = 1;\n               }\n               else{\n                   $visitorNum = (int)$like['likeVisitor'] + 1;\n               }\n                $db->query($db->update('table.bscore_friendcircle_data')->rows(array('likeVisitor' => (int)$visitorNum))->where('coid = ?', $_POST['coid']));\n                \n                $like = $db->fetchRow($db->select()->from('table.bscore_friendcircle_data')->where('coid = ?', $_POST['coid']));\n          if(!empty($like['likeVisitor'])){\n             $like['likeVisitor'] = $like['likeVisitor'].'位访客'; \n          }\n          if(!$like['likeVisitor']){\n              $like['likeVisitor'] = '';\n          }\n          if(!$like['likeUser']){\n              $like['likeUser'] = '';\n          }\n          Typecho_Cookie::set('like_circle_'.$_POST['coid'],'1');\n          exit(json_encode(array(\n        \"code\" => 200,\n        \"msg\" => '点赞成功',\n        \"likeVisitor\" => $like['likeVisitor'],\n        \"likeUser\" => $like['likeUser'],\n        )));\n        \n        \n           }\n          \n           break;\n           case 'delete':\n               if($user->hasLogin() && $user->pass('administrator', true)){\n               $coid = $_POST['coid'];\n               $db->query($db->delete('table.bscore_friendcircle_data')->where('coid = ?', $coid));\n               $db->query($db->delete('table.comments')->where('parent = ?', $coid));\n               \n               exit(json_encode(array(\n        \"code\" => 200,\n        \"msg\" => '删除成功',\n        )));\n               }\n               break;\n   }\n  \n   \n   \n   \n   \n        \n    }"
  },
  {
    "path": "core/widget/commentlike.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    \n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) {   \nif (isset($_POST['agree'])) {\n    $result = array(\n    'code' => 1,\n    'agree' => agreeforcomment($_POST['agree']),\n    'coid' => $_POST['agree']\n);\n      exit(json_encode($result));\n}\n    }\n    else{\n        $result = array(\n    'code' => 2,\n    'message' => 'error'\n);\n      exit(json_encode($result));  \n    }"
  },
  {
    "path": "core/widget/cron.php",
    "content": "<?php\nrequire_once str_replace(\"/usr/themes/bearsimple/core\",\"\",dirname(__DIR__)).'/config.inc.php';\nerror_reporting(0);\nuse \\Utils\\Helper;\nif(!class_exists('CSF')){\n    require_once Helper::options()->pluginDir('BsCore').'/bsoptions-framework.php';\n}\n\nif (!class_exists('bsOptions')){\n    require_once \\Utils\\Helper::options()->pluginDir('BsCore').'/bsOptions.php';\n}\nuse Typecho\\Db;\nob_clean();\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\nignore_user_abort(true);\nset_time_limit(0);\nini_set('memory_limit',-1);\nini_set('mysql.connect_timeout', 900);\nini_set('default_socket_timeout', 900);\nsession_start();\n    $removeChar = [\"https://\", \"http://\"]; \n    Typecho_Widget::widget('Widget_User')->to($user);\n    $db = \\Typecho\\Db::get();\n$temoptions = bsOptions::getInstance()::get_option( 'bearsimple' );\n   \nfunction checkLinks($url) {\n    try {\n        $options = Helper::options();\n        $headers = [\n            'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0'\n        ];\n\n        // 使用 cURL 检查 URL\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, $url);\n        curl_setopt($ch, CURLOPT_USERAGENT, $headers['User-Agent']);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n        $response = curl_exec($ch);\n        $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n        curl_close($ch);\n\n        // 检查域名是否匹配\n        $removeChar = [\"https://\", \"http://\",\"/\"];\n        $url2 = str_replace($removeChar, \"\", $options->siteUrl);\n        $appUrlPreg = \"/$url2/i\";\n        preg_match($appUrlPreg, $response, $match);\n\n        // 返回结果\n        if ($statusCode === 200 && $match) {\n            return true;\n        }\n        return false;\n    } catch (Exception $e) {\n        // 记录日志或处理异常\n        echo \"检查出现异常: \" . $e->getMessage();\n        return false;\n    }\n}\nif ($argc > 1 && $argv[1] === Helper::options()->cronKey) {\n$links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status != ?', 'waiting')->where('checkurl != ?', '0')->orWhere('checkurl != ?', '暂无')->orWhere('checkurl != ?', '')->order('id',Typecho\\Db::SORT_DESC));\nif($links){\n$total = count($links);\n}\nelse{\n$total = 0;    \n}\nif($temoptions['friendtab']['checkFailedAction'] == true){\n$failedLinks = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'approved')->where('checkurl != ?', '0')->orWhere('checkurl != ?', '暂无')->orWhere('checkurl != ?', '')->order('id',Typecho\\Db::SORT_DESC));\n$failedNumber = 0;\nif($failedLinks){\n    foreach($failedLinks as $f){\n        \n       if(checkLinks($f['checkurl']) == false){\n         $db->query($db->update('table.bscore_friendlinks')->rows(array('status' => 'reject','rejectreason'=> !$temoptions['friendtab']['checkFailedActionText']? '友链检查未通过自动移动至失效友链列表' : $temoptions['friendtab']['checkFailedActionText']))\n                        ->where('id = ?', $f['id']));  \n                        $failedNumber++;\n       }\n    }\n    \n}\n\n}\nif($temoptions['friendtab']['checkSuccessAction'] == true){\n$successLinks = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'reject')->where('checkurl != ?', '0')->orWhere('checkurl != ?', '暂无')->orWhere('checkurl != ?', '')->order('id',Typecho\\Db::SORT_DESC));\n$successNumber = 0;\nif($successLinks){\n    foreach($successLinks as $s){\n        \n       if(checkLinks($s['checkurl']) == true){\n         $db->query($db->update('table.bscore_friendlinks')->rows(array('status' => 'approved'))\n                        ->where('id = ?', $s['id']));  \n                        $successNumber++;\n       }\n       \n    }\n}\n}\n        $cron = array(\n                'type' => 'checkLinks',\n                'checktotal' => $total,\n                'checksuccess' => $successNumber,\n                'checkfailed' => $failedNumber,\n                'checktime' => time(),\n            );\n            $db->query($db->insert('table.bscore_cron_data')->rows($cron));\n            exit(\"Cron任务执行成功:)\\n\");\n}\n        else{\n          exit(\"Cron error:(\\n\");  \n        }\n"
  },
  {
    "path": "core/widget/encrypt.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\nheader(\"Access-Control-Allow-Origin: *\");\ndate_default_timezone_set('PRC');\n\nif (@$_POST['action'] == 'open_lock') {\n\t\t\t\t\t\tif (!empty($_POST['password'])) {\n\t\t\t\t\t\t\t$password = $_POST['password'];\n\t\t\t\t\t\t\t$md5 = $_POST['encryptpassword'];\n\t\t\t\t\t\t\t$type = $_POST['type'];\n\t\t\t\t\t\t\t$options = bsOptions::getInstance()::get_option('bearsimple');\n\t\t\t\t\t\t\tif (md5Encode($password) == $md5) {\n\t\t\t\t\t\t\t\t$result = array('code' => '1');\n\t\t\t\t\t\t\t\tif ($type == 'category') {\n\t\t\t\t\t\t\t\t\t$category = $_POST['category'];\n\t\t\t\t\t\t\t\t\tTypecho_Cookie::set('category_' . $category, md5Encode($password));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$result = array('code' => '-1');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$result = array('code' => '-2');\n\t\t\t\t\t\t}\n\t\t\t\t\t\texit(json_encode($result,JSON_UNESCAPED_UNICODE));\n\t\t\t\t\t}"
  },
  {
    "path": "core/widget/friendlink.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\nheader(\"Access-Control-Allow-Origin: *\");\ndate_default_timezone_set('PRC');\nsession_start();\n    use Typecho\\Db;\nuse Typecho\\Common;\nuse Widget\\Options;\n\n    $options = Helper::options();\n    $temoptions = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $removeChar = [\"https://\", \"http://\"]; \n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) {   \n        if(!$_POST['SecurityToken']){\n $this->response->throwJson([\n            'code'=> 0,\n            'msg' => '鉴权失败',\n    ]);         \n        }\n        if($_POST['SecurityToken'] !== $_SESSION['token']){\n    $this->response->throwJson([\n            'code'=> 0,\n            'msg' => '鉴权失败',\n    ]);\n}\n\nif ($temoptions['VerifyChoose']== '2-3' && !empty($temoptions['geeid']) && !empty($temoptions['geekey']) && $temoptions['backendVerify_Geetest'] == true) {\n      $captcha_id = $temoptions['geeid'];\n$captcha_key = $temoptions['geekey'];\n$api_server = \"https://gcaptcha4.geetest.com\";\n$lot_number = $_POST['lot_number'];\n$captcha_output = $_POST['captcha_output'];\n$pass_token = $_POST['pass_token'];\n$gen_time = $_POST['gen_time'];\n$sign_token = hash_hmac('sha256', $lot_number, $captcha_key);\n$query = array(\n    \"lot_number\" => $lot_number,\n    \"captcha_output\" => $captcha_output,\n    \"pass_token\" => $pass_token,\n    \"gen_time\" => $gen_time,\n    \"sign_token\" => $sign_token\n);\n$url = sprintf($api_server . \"/validate\" . \"?captcha_id=%s\", $captcha_id);\n$res = \\BsCore\\Plugin::post_request($url,$query);\n$obj = json_decode($res,true);\n\nif($obj['status'] == 'success' && $obj['result'] == 'fail'){\n   $this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"抱歉，您未通过人机验证，原因:\".$obj['reason'],\n    ]);\n}\nif($obj['status'] == 'error' && $obj['code']){\n    $this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"抱歉，您未通过人机验证，错误码:\".$obj['code'].\"，原因:\".$obj['msg'],\n    ]);\n}\n\n  }\nif ($temoptions['VerifyChoose'] == '22-2'){\n            $answer = $_POST['answer'];\n            $ganswer = \\BsCore\\Plugin::getSecurity('get','__typecho_comment_question_answer');\n             switch($answer){\n        case $ganswer:\n        break;\n        case null:\n            $this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"对不起，请输入验证码。\",\n    ]);\n        break;\n        default:\n           $this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"对不起，验证码错误，请重试。\",\n    ]);\n         }\n         }\n       if ($temoptions['VerifyChoose'] == '1' || $temoptions['VerifyChoose'] == '11'){\n    \n           $sum = $_POST['sum'];\n\n           switch($_POST['spam_protection_mathstyle']){\n               case 'addition':\n                   switch($sum){\n        case $_POST['num1'] + $_POST['num2']:\n                  \n        break;\n        case null:\n        $this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"对不起，请输入验证码。\",\n    ]);\n        break;\n        default:\n       $this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"对不起，验证码错误，请重试。\",\n    ]);\n    }\n                   break;\n               case 'subtraction':\n                    switch($sum){\n        case $_POST['num1'] - $_POST['num2']:\n        break;\n        case null:\n        $this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"对不起，请输入验证码。\",\n    ]);\n        break;\n        default:\n        $this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"对不起，验证码错误，请重试。\",\n    ]);\n    }\n                   break;\n           }\n       } \n      if ($temoptions['VerifyChoose']== '2-2' && !empty($temoptions['turnstile_key']) && !empty($temoptions['turnstile_secretkey']) && $temoptions['backendVerify_Turnstile'] == true) {\n     if(empty($_POST['cf-turnstile-response'])){\n\t\t\t$this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"抱歉，系统检测到您的验证密钥已失效，需重新验证！\",\n    ]);\n     }\n     elseif (isset($_POST['cf-turnstile-response'])) {\n$response_data =  \\BsCore\\Plugin::getTurnstileResult($_POST['cf-turnstile-response'], $temoptions['turnstile_secretkey']);\nif (!$response_data['success']){\n                //throw new Typecho_Widget_Exception(_t(self::getTurnstileResultMsg($response_data)),200);\n                $this->response->throwJson([\n            'code'=> 0,\n            'msg' =>  \\BsCore\\Plugin::getTurnstileResultMsg($response_data),\n    ]);\n            }\n        } else {\n            //throw new Typecho_Widget_Exception(_t('加载验证码失败, 请检查你的网络'),200);\n            $this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"加载验证码失败, 请检查你的网络\",\n    ]);\n        }\n\n }\n \n \n        if ($temoptions['VerifyChoose']== '2' && !empty($temoptions['vid']) && !empty($temoptions['vkey']) && $temoptions['backendVerify_Vaptcha'] == true) {\n     if(empty($_POST['vaptcha_server']) || empty($_POST['vaptcha_token'])){\n\t\t\t//throw new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的验证密钥已失效，需重新验证！\",200); \n\t\t\t$this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"抱歉，系统检测到您的验证密钥已失效，需重新验证！\",\n    ]);\n     }\n $url = $_POST['vaptcha_server'];\n $data = array(\n     'id'=> $temoptions['vid'],\n     'secretkey' => $temoptions['vkey'],\n     'scene'=> '1',\n     'token'=> $_POST['vaptcha_token'],\n     'ip'=> $comment['ip']\n     );\n    $ch = curl_init();  \n    curl_setopt($ch,CURLOPT_URL,$url);\n    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);  \n    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,3);  \n    curl_setopt($ch, CURLOPT_POST, 1);\n    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type'=>'application/json'));\n    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n    $handles = curl_exec($ch);  \n    curl_close($ch);  \n    $result = json_decode($handles,true);\n    if($result['success'] == 0){\n\t\t\t//throw new \\Typecho\\Widget\\Exception(\"抱歉，您未通过人机验证，原因:\".$result['msg'],200);\n\t\t\t$this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"抱歉，您未通过人机验证，原因:\".$result['msg'],\n    ]);\n    }\n }\n\n if ($temoptions['VerifyChoose']== '2-1' && !empty($temoptions['dx_domain']) && !empty($temoptions['dx_appId']) && !empty($temoptions['dx_appSecret']) && $temoptions['backendVerify_Dingxiang'] == true) {\n     \n     if(empty($_POST['dx_token'])){\n\t\t\t//throw new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的验证密钥已失效，需重新验证！\",200); \n\t\t\t$this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"抱歉，系统检测到您的验证密钥已失效，需重新验证！\",\n    ]);\n     }\n   $appId = $temoptions['dx_appId'];\n$appSecret = $temoptions['dx_appSecret'];\n$client = new CaptchaClient($appId,$appSecret);\n$client->setTimeOut(2);\n$client->setCaptchaUrl(\"https://\".$temoptions['dx_domain'].\"/api/tokenVerify\");\n$response = $client->verifyToken($_POST['dx_token']);\nif(!$response->result){\n\t\t\t$this->response->throwJson([\n            'code'=> 0,\n            'msg' => \"抱歉，您未通过人机验证，请返回重试。\",\n    ]);\n}\n }  \n  \n    if(empty($_POST['contactmail'])){\n        $_POST['contactmail'] = '无';\n    }\n    if(empty($_POST['friendpic'])){\n    if(empty(Bsoptions('FriendLinkLogoDefault'))){\n    $_POST['friendpic'] = $options->siteUrl.'/usr/themes/bearsimple/assets/images/default-logo.png';\n    }\n    else{\n    $_POST['friendpic'] = Bsoptions('FriendLinkLogoDefault');\n    }\n    }\n    $opts = array(\n  'http'=>array(\n   'method' => 'GET',\n          'header' => 'Content-type: application/json',\n          'timeout' => 60 * 10,\n       'Connection'=>\"close\"\n  )\n);\n$context = stream_context_create($opts);\n    $db= \\Typecho\\Db::get();\n        $link = array(\n                'friendname' => htmlspecialchars($_POST['friendname'],ENT_QUOTES,'UTF-8'),\n                'friendurl' => htmlspecialchars($_POST['friendurl'],ENT_QUOTES,'UTF-8'),\n                'friendpic' => htmlspecialchars($_POST['friendpic'],ENT_QUOTES,'UTF-8'),\n                'frienddec' => htmlspecialchars($_POST['frienddec'],ENT_QUOTES,'UTF-8'),\n                'contactmail' => htmlspecialchars($_POST['contactmail'],ENT_QUOTES,'UTF-8'),\n                'checkurl' => htmlspecialchars($_POST['checkurl'],ENT_QUOTES,'UTF-8'),\n                'status' => 'waiting'\n            );\n            $db->query($db->insert('table.bscore_friendlinks')->rows($link));\n            if($temoptions['FriendLinkSubmitSendMail'] == true && $temoptions['Smtp_open'] == true){\n                \n             file_get_contents(Common::url('/action/' . BsCore_Plugin::$action, Options::alloc()->index).'?do=linkMail&type=notifyaccept'.'&friendname='.urlencode($_POST['friendname']),false,$context);   \n            }\n            $this->response->throwJson([\n            'code'=> 1,\n            'msg' => 'success',\n    ]);\n    }\n    else{\n        $this->response->throwJson([\n            'code'=> 0,\n            'msg' => '鉴权失败',\n    ]);\n}"
  },
  {
    "path": "core/widget/friendlinkAction.php",
    "content": "<?php\nuse Typecho\\Db;\nuse Typecho\\Common;\nuse Widget\\Options;\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    $temoptions = bsOptions::getInstance()::get_option( 'bearsimple' );\n    Typecho_Widget::widget('Widget_User')->to($user);\n    function buildResult($code, $data, $message) {\n    return [\n        'code' => $code,\n        'data' => $data,\n        'message' => $message\n    ];\n}\n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false && $user->hasLogin() && $user->pass('administrator', true)) {   \n        $db = \\Typecho\\Db::get();\n        if($_POST['type'] == 'approved'){\n        $db->query($db->update('table.bscore_friendlinks')->rows(array('status' => 'approved'))\n                        ->where('id = ?', $_POST['linkid']));\n        if($temoptions['FriendLinkAcceptSendMail'] == true && $temoptions['Smtp_open'] == true && $_POST['linkmail'] !== '' && $_POST['linkmail'] !== '无'){\n            //审核通过发送邮件\n            file_get_contents(Common::url('/action/' . BsCore_Plugin::$action, Options::alloc()->index).'?do=linkMail&type=notifysuccess&mail='.trim($_POST['linkmail']).'&friendname='.urlencode($_POST['linkname']));   \n        }\n         $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'waiting')->order('id',Typecho\\Db::SORT_DESC));\n        $result = array(\n    'list' => array()\n);\n$result['list'] = $links;       \n        }\n        if($_POST['type'] == 'reject'){\n        $db->query($db->update('table.bscore_friendlinks')->rows(array('status' => 'reject'))\n                        ->where('id = ?', $_POST['linkid']));\n        if($temoptions['FriendLinkAcceptSendMail'] == true && $temoptions['Smtp_open'] == true && $_POST['linkmail'] !== '' && $_POST['linkmail'] !== '无'){\n         //审核不通过发送邮件   \n         file_get_contents(Common::url('/action/' . BsCore_Plugin::$action, Options::alloc()->index).'?do=linkMail&type=notifyfail&mail='.trim($_POST['linkmail']).'&friendname='.urlencode($_POST['linkname'])); \n        }\n        $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'waiting')->order('id',Typecho\\Db::SORT_DESC));\n        $result = array(\n    'list' => array()\n);\n$result['list'] = $links;\n        }\n        \n        if($_POST['type'] == 'delete'){\n        $db->query($db->delete('table.bscore_friendlinks')->where('id = ?', $_POST['linkid']));\n        }\n        if($_POST['type'] == 'edit'){\n        $db->query($db->update('table.bscore_friendlinks')->rows(array(\n                'friendname' => htmlspecialchars($_POST['friendname'],ENT_QUOTES,'UTF-8'),\n                'friendurl' => htmlspecialchars($_POST['friendurl'],ENT_QUOTES,'UTF-8'),\n                'friendpic' => htmlspecialchars($_POST['friendpic'],ENT_QUOTES,'UTF-8'),\n                'frienddec' => htmlspecialchars($_POST['frienddec'],ENT_QUOTES,'UTF-8'),\n                'contactmail' => htmlspecialchars($_POST['contactmail'],ENT_QUOTES,'UTF-8'),\n                'checkurl' => htmlspecialchars($_POST['checkurl'],ENT_QUOTES,'UTF-8'),\n                'rejectreason' => htmlspecialchars($_POST['rejectreason'],ENT_QUOTES,'UTF-8')))\n                        ->where('id = ?', $_POST['id']));\n                        $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'waiting')->order('id',Typecho\\Db::SORT_DESC));\n        $result = array(\n    'list' => array()\n);\n$result['list'] = $links;\n        }\n        if($_POST['type'] == 'add'){\n            if(empty($_POST['contactmail'])){\n        $_POST['contactmail'] = '无';\n    }\n    $link = array(\n                'friendname' => htmlspecialchars($_POST['friendname'],ENT_QUOTES,'UTF-8'),\n                'friendurl' => htmlspecialchars($_POST['friendurl'],ENT_QUOTES,'UTF-8'),\n                'friendpic' => htmlspecialchars($_POST['friendpic'],ENT_QUOTES,'UTF-8'),\n                'frienddec' => htmlspecialchars($_POST['frienddec'],ENT_QUOTES,'UTF-8'),\n                'contactmail' => htmlspecialchars($_POST['contactmail'],ENT_QUOTES,'UTF-8'),\n                'checkurl' => htmlspecialchars($_POST['checkurl'],ENT_QUOTES,'UTF-8'),\n                'status' => htmlspecialchars($_POST['addtype'],ENT_QUOTES,'UTF-8')\n            );\n            $db->query($db->insert('table.bscore_friendlinks')->rows($link));\n            $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'waiting')->order('id',Typecho\\Db::SORT_DESC));\n        $result = array(\n    'list' => array()\n);\n$result['list'] = $links;\n        }\n      if ($_POST['type'] == 'check') {\n    $url = $_POST['checkurl'];\n    $options = Helper::options();\n\n    // 移除协议和斜杠\n    $removeChar = [\"https://\", \"http://\", \"/\"];\n    $url2 = str_replace($removeChar, \"\", $options->siteUrl);\n\n    // 设置请求头\n    $headers = [\n        'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0'\n    ];\n    $headerArr = [];\n    foreach ($headers as $n => $v) {\n        $headerArr[] = $n . ':' . $v;\n    }\n\n    // 使用 cURL 检查 URL\n    $ch = curl_init();\n    curl_setopt($ch, CURLOPT_URL, $url);\n    curl_setopt($ch, CURLOPT_USERAGENT, $headers['User-Agent']);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n    $response = curl_exec($ch);\n    $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n    curl_close($ch);\n\n    // 检查域名是否匹配\n    $appUrlPreg = \"/$url2/i\";\n    preg_match($appUrlPreg, $response, $match);\n\n    // 返回结果\n    if (filter_var($url, FILTER_VALIDATE_URL)) {\n        if ($statusCode === 200) {\n            if ($match) {\n                $result = buildResult(1, [\n                    'friendname' => $_POST['friendname'],\n                    'friendid' => $_POST['id'],\n                    'friendmail' => $_POST['mail']\n                ], '友链正常');\n            } else {\n                $result = buildResult(1, [\n                    'friendname' => $_POST['friendname'],\n                    'friendid' => $_POST['id'],\n                    'friendmail' => $_POST['mail']\n                ], '对方未进行反链');\n            }\n        } else {\n            $result = buildResult(1, [\n                'friendname' => $_POST['friendname'],\n                'friendid' => $_POST['id'],\n                'friendmail' => $_POST['mail']\n            ], '对方站点访问异常');\n        }\n    } else {\n        $result = buildResult(1, [\n            'friendid' => $_POST['id'],\n            'friendmail' => $_POST['mail']\n        ], '该站点的友链放置页面网址识别错误，请重新修改');\n    }\n}\n    // 输出结果\n    echo json_encode($result);\n}"
  },
  {
    "path": "core/widget/friendlinkData.php",
    "content": "<?php\nuse Typecho\\Db;\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    Typecho_Widget::widget('Widget_User')->to($user);\n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false  && $user->hasLogin() && $user->pass('administrator', true)) {   \n        $db = \\Typecho\\Db::get();\n        \n        //待审核\n        if($_POST['type'] == 'waiting'){\n            if(empty($_POST['page'])){\n    $i = 1;\n}\nelse{\n    $i = $_POST['page']; \n}\n$total = count($db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'waiting')->order('id',Typecho\\Db::SORT_DESC)));\n\n        $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'waiting')->order('id',Typecho\\Db::SORT_DESC)->page($i,6));\n        $max = ceil($total / 6);\n        $result = array(\n            'total' => $total,\n    'max' => $max,\n    'list' => array()\n);\n    \n$result['list'] = $links;\n        }\n        \n        //通过\n        if($_POST['type'] == 'approved'){\n                         if(empty($_POST['page'])){\n    $i = 1;\n}\nelse{\n    $i = $_POST['page']; \n}\n$total = count($db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'approved')->order('id',Typecho\\Db::SORT_DESC)));\n        $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'approved')->order('id',Typecho\\Db::SORT_DESC)->page($i,6));\n             $max = ceil($total / 6);\n        $result = array(\n            'total' => $total,\n    'max' => $max,\n    'list' => array()\n);\n\n$result['list'] = $links;\n        }\n        \n        \n        //拒绝\n        if($_POST['type'] == 'reject'){\n            if(empty($_POST['page'])){\n    $i = 1;\n}\nelse{\n    $i = $_POST['page']; \n}\n$total = count($db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'reject')->order('id',Typecho\\Db::SORT_DESC)));\n        $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'reject')->order('id',Typecho\\Db::SORT_DESC)->page($i,6));\n        $max = ceil($total / 6);\n              $result = array(\n            'total' => $total,\n    'max' => $max,\n    'list' => array()\n);\n$result['list'] = $links;\n        }\n        \n        \n        //搜索\n        if($_POST['type'] == 'search'){\n            if(empty($_POST['page'])){\n    $i = 1;\n}\nelse{\n    $i = $_POST['page']; \n}\nif($_POST['searchval']){\n             $searchQuery = '%' . str_replace(' ', '%', $_POST['searchval']) . '%';\n       $total = count($db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('friendname LIKE ? ', $searchQuery)->order('id',Typecho\\Db::SORT_DESC)));\n       $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('friendname LIKE ? ', $searchQuery)->order('id',Typecho\\Db::SORT_DESC)->page($i,6));\n       $max = ceil($total / 6);\n}\nelse{\n    $total = 0;\n    $max = ceil($total / 6);\n    $links = array();\n}\n       $result = array(\n           'total' => $total,\n    'max' => $max,\n    'list' => array()\n);\n$result['list'] = $links;\n        }\n        \n\techo json_encode($result); \n    }"
  },
  {
    "path": "core/widget/getBangumi.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\nerror_reporting(0);\n\nfunction curl_file_get_contents_a($_url)\n{\n    $ch = curl_init();\n    curl_setopt($ch, CURLOPT_URL, $_url);\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);\n    curl_setopt($ch, CURLOPT_REFERER, 'https://bangumi.tv/');\n    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');\n\n    $output = curl_exec($ch);\n    curl_close($ch);\n    return $output;\n}\n\nfunction curl_file_get_contents_b($_url)\n{\n    $ch = curl_init();\n    curl_setopt($ch, CURLOPT_URL, $_url);\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);\n    curl_setopt($ch, CURLOPT_REFERER, 'https://www.bilibili.com/');\n    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');\n\n    $output = curl_exec($ch);\n    curl_close($ch);\n    return $output;\n}\n\n\nclass BangumiAPI\n{\n    \n   \n    private static function __getBangumiRawDataHelper($UserID, $Type='2')\n    {\n        $collOffset = 0;\n$collDataArr = [];\n do {\n                $collData = json_decode(curl_file_get_contents_a('https://api.bgm.tv/v0/users/'.$UserID.'/collections?subject_type=2&type='.$Type.'&limit=50&offset=' . $collOffset), true);\n                $collDataArr = array_merge($collDataArr, $collData['data']);\n                $collOffset += 50;\n            } while ($collOffset < $collData['total']);\n            \n        $data = array();\n\n            foreach ($collDataArr as $v) {\n                $data[] = array(\"name\" => $v['subject']['name'], \"img\" => $v['subject']['images']['medium'], \"url\" => 'https://bangumi.tv/subject/'.$v['subject_id']);\n            }\n    \n        return $data;\n    }\n    \n    \n     \n    private static function __getBangumiRawData($UserID)\n    {\n        $data = array();\n        $data['watching'] = self::__getBangumiRawDataHelper($UserID, '3');\n        $data['wish'] = self::__getBangumiRawDataHelper($UserID, '1');\n        $data['watched'] = self::__getBangumiRawDataHelper($UserID, '2');\n        $data['on_hold'] = self::__getBangumiRawDataHelper($UserID, '4');\n        $data['dropped'] = self::__getBangumiRawDataHelper($UserID, '5');\n        return $data;\n    }\n    \n    private static function __isCacheExpired($FilePath, $ValidTimeSpan)\n    {\n        if (!file_exists($FilePath)) {\n            return -1;\n        }\n\n        $content = json_decode(file_get_contents($FilePath), true);\n        if (!array_key_exists('time', $content) || $content['time'] < 1) {\n            return -1;\n        }\n\n        if (time() - $content['time'] > $ValidTimeSpan) {\n            return 1;\n        }\n\n        return $content;\n    }\n\n    \n    public static function updateBangumiCacheAndReturn($UserID, $PageSize, $From, $ValidTimeSpan, $status='watch')\n    {\n        if (!$UserID) {\n            return json_encode(array());\n        }\n\n        $cache = self::__isCacheExpired(__DIR__ . '/cache/bangumi.json', $ValidTimeSpan);\n\n        if ($cache == -1 || $cache == 1) {\n            // 缓存无效或者过期，重新请求，重新写入\n            $raw = self::__getBangumiRawData($UserID);\n            $cache = array('time' => time(), 'data' => $raw);\n            file_put_contents(__DIR__ . '/cache/bangumi.json', json_encode($cache));\n        }\n\n        $data = $cache['data'];\n\n        // 没有数据，需要在下次刷新\n        if (count($data['watching'])==0 && count($data['wish'])==0 && count($data['watch'])==0) {\n            $cache['time'] = 1;\n            file_put_contents(__DIR__ . '/cache/bangumi.json', json_encode($cache));\n            return json_encode(array());\n        }\n\n        $data = $data[$status];\n        $total = count($data);\n        if ($From < 0) {\n            echo json_encode(array());\n        } else {\n            $end = min($From + $PageSize, $total);\n            $out = array();\n            for ($index = $From; $index < $end; $index++) {\n                array_push($out, $data[$index]);\n            }\n            return json_encode($out);\n        }\n    }\n\n    \n\n  \n}\n\n\nclass BilibiliAPI\n{\n    \n   \n    private static function __getBilibiliRawDataHelper($UserID)\n    {\n       $collOffset = 1;\n$collDataArr = [];\n do {\n                $collData = json_decode(curl_file_get_contents_b('https://api.bilibili.com/x/space/bangumi/follow/list?vmid='.$UserID.'&type=1&ps=30&follow_status=0&pn=' . $collOffset), true);\n                $collDataArr = array_merge($collDataArr, $collData['data']['list']);\n                $collOffset += 1;\n            } while ($collOffset < $collData['data']['total']);\n            \n        $data = array();\n\n            foreach ($collDataArr as $v) {\n                $data[] = array(\"name\" => $v['title'], \"img\" => 'https://i0.wp.com/' . str_replace(array('http://', 'https://'), '', $v['cover']), \"url\" => $v['url']);\n            }\n    \n        return $data;\n    }\n    \n    \n     \n    private static function __getBilibiliRawData($UserID)\n    {\n        $data = array();\n        $data['acg'] = self::__getBilibiliRawDataHelper($UserID);\n        return $data;\n    }\n    \n    private static function __isCacheExpired($FilePath, $ValidTimeSpan)\n    {\n        if (!file_exists($FilePath)) {\n            return -1;\n        }\n\n        $content = json_decode(file_get_contents($FilePath), true);\n        if (!array_key_exists('time', $content) || $content['time'] < 1) {\n            return -1;\n        }\n\n        if (time() - $content['time'] > $ValidTimeSpan) {\n            return 1;\n        }\n\n        return $content;\n    }\n\n    \n    public static function updateBilibiliCacheAndReturn($UserID, $PageSize, $From, $ValidTimeSpan, $status='acg')\n    {\n        if (!$UserID) {\n            return json_encode(array());\n        }\n\n        $cache = self::__isCacheExpired(__DIR__ . '/cache/bilibili.json', $ValidTimeSpan);\n\n        if ($cache == -1 || $cache == 1) {\n            // 缓存无效或者过期，重新请求，重新写入\n            $raw = self::__getBilibiliRawData($UserID);\n            $cache = array('time' => time(), 'data' => $raw);\n            file_put_contents(__DIR__ . '/cache/bilibili.json', json_encode($cache));\n        }\n\n        $data = $cache['data'];\n\n        // 没有数据，需要在下次刷新\n        if (count($data['acg'])==0) {\n            $cache['time'] = 1;\n            file_put_contents(__DIR__ . '/cache/bilibili.json', json_encode($cache));\n            return json_encode(array());\n        }\n\n        $data = $data[$status];\n        $total = count($data);\n        if ($From < 0) {\n            echo json_encode(array());\n        } else {\n            $end = min($From + $PageSize, $total);\n            $out = array();\n            for ($index = $From; $index < $end; $index++) {\n                array_push($out, $data[$index]);\n            }\n            return json_encode($out);\n        }\n    }\n\n    \n\n  \n}\n\n\n        $options = get_option('bearsimple');\n        $UserID = $options['bangumi_accountid'];\n        $UserID2 = $options['bilibili_accountid'];\n        $PageSize = 8;\n        $ValidTimeSpan = 60 * 60 * 24 * 7;\n        $From = 0;\n        if (array_key_exists('from', $_GET)) {\n            $From = $_GET['from'];\n        }\n        if ($_GET['type'] == 'bangumi') {\n            header(\"Content-type: application/json\");\n            $status = array_key_exists('status', $_GET) ? $_GET['status'] : 'watch';\n            echo BangumiAPI::updateBangumiCacheAndReturn($UserID, $PageSize, $From, $ValidTimeSpan, $status);\n        }else if ($_GET['type'] == 'bilibili') {\n            header(\"Content-type: application/json\");\n            $status = array_key_exists('status', $_GET) ? $_GET['status'] : 'acg';\n            echo BilibiliAPI::updateBilibiliCacheAndReturn($UserID2, $PageSize, $From, $ValidTimeSpan, $status);\n        } else {\n            echo json_encode(array());\n        }\n"
  },
  {
    "path": "core/widget/getCommentAction.php",
    "content": "<?php\nsession_start();\nuse Typecho\\Db;\nuse Typecho\\Common;\nuse Widget\\Options;\nheader(\"HTTP/1.1 200 OK\");\nheader(\"Access-Control-Allow-Origin: *\");\ndate_default_timezone_set('PRC');\nerror_reporting(0);\n$options = Helper::options();\n    $temoptions = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $removeChar = [\"https://\", \"http://\"]; \n    \n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) {   \nif($_POST['action'] == 'getCommentToken'){\n    if (!isset($_SESSION['token'])) {\n    $_SESSION['token'] = bin2hex(random_bytes(32));\n}\n$str = mt_rand(100001,999999); \n     $key = Helper::options()->siteUrl; \n$this->response->throwJson([\n            'code'=> 1,\n            'msg' => '获取成功',\n            'token'=>$_SESSION['token']\n    ]);\nreturn;\n}\nelseif($_POST['action'] == 'getCommentMessage'){\n   $ret = \\Typecho\\Cookie::get('__typecho_notice_type');\n   $this->response->throwJson([\n            'code'=> 1,\n            'msg' => '获取成功',\n            'message'=>$ret\n    ]);\nreturn;\n}\n}"
  },
  {
    "path": "core/widget/getDouban.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\nerror_reporting(0);\n\nrequire_once 'Dom.php';\n\nfunction curl_file_get_contents($_url, $type='www')\n{\n    $ch = curl_init();\n\n    $cookie = 'bid=Km3ZGpkEE00; ap_v=0,6.0; _pk_ses.100001.3ac3=*; __utma=30149280.1672442383.1554254872.1554254872.1554254872.1; __utmc=30149280; __utmz=30149280.1554254872.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt_douban=1; __utma=81379588.1887771065.1554254872.1554254872.1554254872.1; __utmc=81379588; __utmz=81379588.1554254872.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; ll=\"108288\"; _pk_id.100001.3ac3=88bbbc1a1f571a42.1554254872.1.1554254939.1554254872.; __utmb=30149280.7.10.1554254872; __utmb=81379588.7.10.1554254872';\n    curl_setopt($ch, CURLOPT_URL, $_url);\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);\n    curl_setopt($ch, CURLOPT_REFERER, 'https://'.$type.'.douban.com/');\n    curl_setopt($ch, CURLOPT_COOKIE, $cookie);\n    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');\n\n    $output = curl_exec($ch);\n    curl_close($ch);\n    return $output;\n}\n\nclass DoubanAPI\n{\n    \n   \n    private static function __getMusicRawDataHelper($UserID, $Type='collect')\n    {\n        $api = 'https://music.douban.com/people/' . $UserID . '/' . $Type;\n        $data = array();\n        while ($api != null) {\n            $raw = curl_file_get_contents($api, 'music');\n            if ($raw == null || $raw == \"\") {\n                break;\n            }\n\n            $doc = str_get_html($raw);\n            \n            $itemArray = $doc->find(\"div.item\");\n            foreach ($itemArray as $v) {\n                $t = $v->find(\"li.title\", 0);\n                $movie_name = str_replace(array(\" \", \"　\", \"\\t\", \"\\n\", \"\\r\"),\n                    array(\"\", \"\", \"\", \"\", \"\"), $t->text());\n                $movie_img = $v->find(\"div.pic a img\", 0)->src;\n\n                // 使用 wp 接口解决防盗链\n                $movie_img = 'https://i0.wp.com/' . str_replace(array('http://', 'https://'), '', $movie_img);\n\n                $movie_url = $t->find(\"a\", 0)->href;\n                $data[] = array(\"name\" => $movie_name, \"img\" => $movie_img, \"url\" => $movie_url);\n            }\n            $url = $doc->find(\"span.next a\", 0);\n            if ($url) {\n                $api = \"https://music.douban.com\" . $url->href;\n            } else {\n                $api = null;\n            }\n        }\n        return $data;\n    }\n    \n    \n     private static function __getBookRawDataHelper($UserID, $Type='collect')\n    {\n        $api = 'https://book.douban.com/people/' . $UserID . '/' . $Type;\n        $data = array();\n        while ($api != null) {\n            $raw = curl_file_get_contents($api, 'book');\n            if ($raw == null || $raw == \"\") {\n                break;\n            }\n\n            $doc = str_get_html($raw);\n            \n            $itemArray = $doc->find(\"li.subject-item\");\n            foreach ($itemArray as $v) {\n                $t = $v->find(\"h2 a\", 0);\n                $movie_name = str_replace(array(\" \", \"　\", \"\\t\", \"\\n\", \"\\r\"),\n                    array(\"\", \"\", \"\", \"\", \"\"), $t->text());\n                $movie_img = $v->find(\"div.pic a img\", 0)->src;\n\n                // 使用 wp 接口解决防盗链\n                $movie_img = 'https://i0.wp.com/' . str_replace(array('http://', 'https://'), '', $movie_img);\n\n                $movie_url = $v->find('a[href^=\"https://book.douban.com/subject/\"]', 0)->href;\n                $data[] = array(\"name\" => $movie_name, \"img\" => $movie_img, \"url\" => $movie_url);\n            }\n            $url = $doc->find(\"span.next a\", 0);\n            if ($url) {\n                $api = \"https://book.douban.com\" . $url->href;\n            } else {\n                $api = null;\n            }\n        }\n        return $data;\n    }\n\n   \n    private static function __getMovieRawDataHelper($UserID, $Type='collect')\n    {\n        $api = 'https://movie.douban.com/people/' . $UserID . '/' . $Type;\n        $data = array();\n        while ($api != null) {\n            $raw = curl_file_get_contents($api, 'movie');\n            if ($raw == null || $raw == \"\") {\n                break;\n            }\n\n            $doc = str_get_html($raw);\n            \n            $itemArray = $doc->find(\"div.item\");\n            foreach ($itemArray as $v) {\n                $t = $v->find(\"li.title\", 0);\n                $movie_name = str_replace(array(\" \", \"　\", \"\\t\", \"\\n\", \"\\r\"),\n                    array(\"\", \"\", \"\", \"\", \"\"), $t->text());\n                $movie_img = $v->find(\"div.pic a img\", 0)->src;\n\n                // 使用 wp 接口解决防盗链\n                $movie_img = 'https://i0.wp.com/' . str_replace(array('http://', 'https://'), '', $movie_img);\n\n                $movie_url = $t->find(\"a\", 0)->href;\n                $data[] = array(\"name\" => $movie_name, \"img\" => $movie_img, \"url\" => $movie_url);\n            }\n            $url = $doc->find(\"span.next a\", 0);\n            if ($url) {\n                $api = \"https://movie.douban.com\" . $url->href;\n            } else {\n                $api = null;\n            }\n        }\n        return $data;\n    }\n    \n   \n    private static function __getBookRawData($UserID)\n    {\n        $data = array();\n        $data['reading'] = self::__getBookRawDataHelper($UserID, 'do');\n        $data['wish'] = self::__getBookRawDataHelper($UserID, 'wish');\n        $data['read'] = self::__getBookRawDataHelper($UserID, 'collect');\n        return $data;\n    }\n    \n   \n    private static function __getMovieRawData($UserID)\n    {\n        $data = array();\n        $data['watching'] = self::__getMovieRawDataHelper($UserID, 'do');\n        $data['wish'] = self::__getMovieRawDataHelper($UserID, 'wish');\n        $data['watched'] = self::__getMovieRawDataHelper($UserID, 'collect');\n        return $data;\n    }\n    \n    \n    private static function __getMusicRawData($UserID)\n    {\n        $data = array();\n        $data['listening'] = self::__getMusicRawDataHelper($UserID, 'do');\n        $data['wish'] = self::__getMusicRawDataHelper($UserID, 'wish');\n        $data['listened'] = self::__getMusicRawDataHelper($UserID, 'collect');\n        return $data;\n    }\n\n\n    \n    private static function __isCacheExpired($FilePath, $ValidTimeSpan)\n    {\n        if (!file_exists($FilePath)) {\n            return -1;\n        }\n\n        $content = json_decode(file_get_contents($FilePath), true);\n        if (!array_key_exists('time', $content) || $content['time'] < 1) {\n            return -1;\n        }\n\n        if (time() - $content['time'] > $ValidTimeSpan) {\n            return 1;\n        }\n\n        return $content;\n    }\n\n    \n    public static function updateBookCacheAndReturn($UserID, $PageSize, $From, $ValidTimeSpan, $status='read')\n    {\n        if (!$UserID) {\n            return json_encode(array());\n        }\n\n        $cache = self::__isCacheExpired(__DIR__ . '/cache/book.json', $ValidTimeSpan);\n\n        if ($cache == -1 || $cache == 1) {\n            // 缓存无效或者过期，重新请求，重新写入\n            $raw = self::__getBookRawData($UserID);\n            $cache = array('time' => time(), 'data' => $raw);\n            file_put_contents(__DIR__ . '/cache/book.json', json_encode($cache));\n        }\n\n        $data = $cache['data'];\n\n        // 没有数据，需要在下次刷新\n        if (count($data['reading'])==0 && count($data['wish'])==0 && count($data['read'])==0) {\n            $cache['time'] = 1;\n            file_put_contents(__DIR__ . '/cache/book.json', json_encode($cache));\n            return json_encode(array());\n        }\n\n        $data = $data[$status];\n        $total = count($data);\n        if ($From < 0) {\n            echo json_encode(array());\n        } else {\n            $end = min($From + $PageSize, $total);\n            $out = array();\n            for ($index = $From; $index < $end; $index++) {\n                array_push($out, $data[$index]);\n            }\n            return json_encode($out);\n        }\n    }\n\n    \npublic static function updateMovieCacheAndReturn($UserID, $PageSize, $From, $ValidTimeSpan, $status='watched')\n    {\n        if (!$UserID) {\n            return json_encode(array(1));\n        }\n\n        $cache = self::__isCacheExpired(__DIR__ . '/cache/movie.json', $ValidTimeSpan);\n\n        if ($cache == -1 || $cache == 1) {\n            // 缓存无效或者过期，重新请求，重新写入\n            $raw = self::__getMovieRawData($UserID);\n            $cache = array('time' => time(), 'data' => $raw);\n            file_put_contents(__DIR__ . '/cache/movie.json', json_encode($cache));\n        }\n\n        $data = $cache['data'];\n\n        // 没有数据，需要在下次刷新\n        if (count($data['watching'])==0 && count($data['wish'])==0 && count($data['watched'])==0) {\n            $cache['time'] = 1;\n            file_put_contents(__DIR__ . '/cache/movie.json', json_encode($cache));\n            return json_encode(array());\n        }\n\n        $data = $data[$status];\n        $total = count($data);\n        if ($From < 0) {\n            echo json_encode(array(1));\n        } else {\n            $end = min($From + $PageSize, $total);\n            $out = array();\n            for ($index = $From; $index < $end; $index++) {\n                array_push($out, $data[$index]);\n            }\n            return json_encode($out);\n        }\n    }\n     \n     \n    \npublic static function updateMusicCacheAndReturn($UserID, $PageSize, $From, $ValidTimeSpan, $status='listened')\n    {\n        if (!$UserID) {\n            return json_encode(array(1));\n        }\n\n        $cache = self::__isCacheExpired(__DIR__ . '/cache/music.json', $ValidTimeSpan);\n\n        if ($cache == -1 || $cache == 1) {\n            // 缓存无效或者过期，重新请求，重新写入\n            $raw = self::__getMusicRawData($UserID);\n            $cache = array('time' => time(), 'data' => $raw);\n            file_put_contents(__DIR__ . '/cache/music.json', json_encode($cache));\n        }\n\n        $data = $cache['data'];\n\n        // 没有数据，需要在下次刷新\n        if (count($data['listening'])==0 && count($data['wish'])==0 && count($data['listened'])==0) {\n            $cache['time'] = 1;\n            file_put_contents(__DIR__ . '/cache/music.json', json_encode($cache));\n            return json_encode(array());\n        }\n\n        $data = $data[$status];\n        $total = count($data);\n        if ($From < 0) {\n            echo json_encode(array(1));\n        } else {\n            $end = min($From + $PageSize, $total);\n            $out = array();\n            for ($index = $From; $index < $end; $index++) {\n                array_push($out, $data[$index]);\n            }\n            return json_encode($out);\n        }\n    }\n    \n  \n}\n\n\n        $options = get_option('bearsimple');\n        $UserID = $options['douban_id'];\n        $PageSize = 8;\n        $ValidTimeSpan = 60 * 60 * 24 * 30;\n        $From = 0;\n        if (array_key_exists('from', $_GET)) {\n            $From = $_GET['from'];\n        }\n        if ($_GET['type'] == 'book') {\n            header(\"Content-type: application/json\");\n            $status = array_key_exists('status', $_GET) ? $_GET['status'] : 'read';\n            echo DoubanAPI::updateBookCacheAndReturn($UserID, $PageSize, $From, $ValidTimeSpan, $status);\n        } elseif ($_GET['type'] == 'movie') {\n            header(\"Content-type: application/json\");\n            $status = array_key_exists('status', $_GET) ? $_GET['status'] : 'watched';\n            echo DoubanAPI::updateMovieCacheAndReturn($UserID, $PageSize, $From, $ValidTimeSpan, $status);\n        }elseif ($_GET['type'] == 'music') {\n            header(\"Content-type: application/json\");\n            $status = array_key_exists('status', $_GET) ? $_GET['status'] : 'listened';\n            echo DoubanAPI::updateMusicCacheAndReturn($UserID, $PageSize, $From, $ValidTimeSpan, $status);\n        } elseif ($_GET['type'] == 'singlebook') {\n            header(\"Content-type: application/json\");\n            echo DoubanAPI::updateSingleCacheAndReturn($_GET['id'], 'book', $ValidTimeSpan);\n        } elseif ($_GET['type'] == 'singlemovie') {\n            header(\"Content-type: application/json\");\n            echo DoubanAPI::updateSingleCacheAndReturn($_GET['id'], 'movie', $ValidTimeSpan);\n        } else {\n            echo json_encode(array());\n        }\n"
  },
  {
    "path": "core/widget/getEmaction.php",
    "content": "<?php\nob_clean();\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    header('Content-type: application/json');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    Typecho_Widget::widget('Widget_User')->to($user);\n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) {   \n   $db = \\Typecho\\Db::get();\n   $data = json_decode(file_get_contents('php://input'),true);\n  switch($data['action']){\n      case 'getReact':\n    $targetId = $data['targetId'];\n    $result = $db->fetchAll($db->select()->from('table.bscore_emaction_data')->where('target_id = ?', $targetId));\n    $newResult = [];\n    foreach ($result as $row) {\n        $newRow = ['reaction_name' => $row['reaction_name'], 'count' => $row['diff']];\n        array_push($newResult, $newRow);\n    }\n    exit(json_encode([\n        'code' => 200,\n        'msg' => 'success',\n        'data' => ['reactionsGot' => $newResult],\n    ]));\n  break;\n      \n      case 'updateReact':\n                   $targetId = $data['targetId'];\n    $reactionName = $data['reaction_name'];\n    $diff = $data['diff'];\n   if (!in_array($diff, [1, -1])) {\n        $diff = $diff > 0 ? 1 : -1;\n    }\n    $reaction_data = $db->fetchRow($db->select()->from('table.bscore_emaction_data')->where('target_id = ?', $targetId)->where('reaction_name = ?', $reactionName));\n    if(!$reaction_data){\n        $datas = array(\n                'target_id' => $targetId,\n                'reaction_name' => $reactionName,\n                'diff' => (int)$diff,\n            );\n            $db->query($db->insert('table.bscore_emaction_data')->rows($datas));\n            \n    }\n    else{\n        if($data['diff'] == '-1'){\n            $diff = (int)$reaction_data['diff'] -1;\n        }\n        else{\n            $diff = (int)$reaction_data['diff'] +1;\n        }\n        if($data['diff'] == '-1' && $reaction_data['diff'] == 0){\n            $diff = 0;\n        }\n        $db->query($db->update('table.bscore_emaction_data')->rows(array('diff' => $diff))->where('target_id = ?', $targetId)->where('reaction_name = ?', $reactionName));\n    }\n    $reaction_sdata = $db->fetchAll($db->select()->from('table.bscore_emaction_data')->where('target_id = ?', $targetId)->where('reaction_name = ?', $reactionName));\n    exit(json_encode([\n      'code' => 200,\n      'msg' => 'success',\n      'data' => ['reactionsGot' => $reaction_sdata]\n    ]));\n \n\n          break;\n}\n}\n  \n\n\n   \n   \n\n    \n    "
  },
  {
    "path": "core/widget/getEmoji.php",
    "content": "<?php\nuse Typecho\\Db;\nob_clean();\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    header('Content-type: application/json');\n    date_default_timezone_set('PRC');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    Typecho_Widget::widget('Widget_User')->to($user);\n    $db = \\Typecho\\Db::get();\n$id = $this->user->uid;\n$opts = array(\n  'http'=>array(\n   'method' => 'GET',\n          'header' => 'Content-type: application/json',\n          'timeout' => 60 * 10,\n       'Connection'=>\"close\"\n  )\n);\n\n$context = stream_context_create($opts);\n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) {   \n        $result = [];\n        if(Bsoptions('Emoji_HideDefault') == false || Bsoptions('Emoji_HideDefault') == ''){\n        $res = json_decode(file_get_contents(str_replace(\"/core\",\"\",dirname(__DIR__)).'/assets/vendors/bs-emoji/bs-emoji.json', false, $context),true);\n        $result = $res;\n        }\n        if(Bsoptions('Emoji_Diy') == true && Bsoptions('Emoji_DiyUrl') !== ''){\n        $res2 = json_decode(file_get_contents(Bsoptions('Emoji_DiyUrl'), false, $context),true);\n        if(Bsoptions('Emoji_HideDefault') == false || Bsoptions('Emoji_HideDefault') == ''){\n        $result = array_merge($res,$res2);\n        }\n        else{\n        $result = $res2;    \n        }\n        }\n       \n\n        exit(json_encode($result,JSON_UNESCAPED_UNICODE));\n\n}"
  },
  {
    "path": "core/widget/getLogin.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\nerror_reporting(0);\nif($_POST['action'] == 'find'){\n    Typecho_Widget::widget('Widget_User')->to($user);\nif($user->hasLogin()){\n$this->response->throwJson([\n            'code'=> 1,\n            'name'=> $this->user->screenName,\n            'group'=>$this->user->group,\n            'url'=> $this->options->adminUrl,\n            'msg' => '已登录',\n    ]);\n}\nelse{\n$this->response->throwJson([\n            'code'=> 0,\n            'msg' => '未登录',\n    ]);\n}\n}\n"
  },
  {
    "path": "core/widget/getLoginAction.php",
    "content": "<?php\n\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\nerror_reporting(0);\nob_clean();\n$options = Helper::options();\n    $temoptions = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $removeChar = [\"https://\", \"http://\"]; \n    Typecho_Widget::widget('Widget_User')->to($user);\nif (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) {     \nif($_POST['action'] == 'login'){\n\necho Helper::options()->loginAction;\nreturn;\n}\nelse if($_POST['action'] == 'protect'){\n\necho Typecho_Widget::widget('Widget_Security')->getTokenUrl($_POST['permalink']);\nreturn;\n}\nelse if($_POST['action'] == 'cross'){\n\necho Typecho_Widget::widget('Widget_Security')->index('/action/comments-edit?do=edit&coid=' . $_POST['coid']);\nreturn;\n}\nelse if($_POST['action'] == 'editprofile'){\n\necho Typecho_Widget::widget('Widget_Security')->getIndex('/action/users-profile');\nreturn;\n}\nelse if($_POST['action'] == 'tougao'){\n\necho Typecho_Widget::widget('Widget_Security')->index('/action/contents-post-edit');\nreturn;\n}\nelse if($_POST['action'] == 'deleteCircle' && $user->hasLogin() && $user->pass('administrator', true)){\n\necho Typecho_Widget::widget('Widget_Security')->index('/action/comments-edit?do=delete&coid=' . $_POST['coid']);\nreturn;\n}\nelse if($_POST['action'] == 'register'){\n\necho Helper::options()->registerAction;\nreturn;\n}\nelse if($_POST['action'] == 'signout'){\n\necho Helper::options()->logoutUrl;\nreturn;\n}\nelse if($_POST['action'] == 'getmap'){\n\necho BsCore_Plugin::getIpLocation($_SERVER['REMOTE_ADDR']);\nreturn;\n}\nelse if($_POST['action'] == 'checklogin'){\nif($this->user->hasLogin()){\n$this->response->throwJson([\n            'code'=> 1,\n            'name'=> $this->user->screenName,\n            'msg' => '已登录',\n    ]);\nreturn;\n}\nelse{\n$this->response->throwJson([\n            'code'=> 0,\n            'msg' => '未登录',\n    ]);\nreturn;\n}\n}\n}"
  },
  {
    "path": "core/widget/getMemosAction.php",
    "content": "<?php\nuse Typecho\\Db;\nuse Typecho\\Common;\nuse Widget\\Options;\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/usr/plugins/BsCore/modules/Markdown/ParsedownExtension.php';\n//use ParsedownExtension;\nheader(\"HTTP/1.1 200 OK\");\nheader(\"Access-Control-Allow-Origin: *\");\ndate_default_timezone_set('PRC');\nerror_reporting(0);\n$options = Helper::options();\n    $temoptions = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $removeChar = [\"https://\", \"http://\"]; \n\n\n\n//获取memos数据方法\nfunction memos_getRequest($url, $type,$postdata = '') {\n    if($postdata)$data = http_build_query($postdata);\n    $options    = array(\n        'http' => array(\n            'method'  => $type,\n            'header'  => \"Content-type: application/json\",\n            'content' => $data,\n            'timeout' => 5\n        ),\n        \"ssl\" => array(\n        \"verify_peer\"=>false,\n        \"verify_peer_name\"=>false,\n    )\n    );\n    $context = stream_context_create($options);\n\n    $result    = file_get_contents($url, false, $context);\n    if($http_response_header[0] != 'HTTP/1.1 200 OK'){\n        $result = array(\n            \"result\" => \"success\",\n            \"reason\" => \"memos error\"\n        );\n        return json_encode($result);\n    }else{\n        return json_decode($result,true);\n    }\n}\n\n//转换memos发布时间\nfunction memos_getTime($time)\n    {\n        $rtime = date(\"Y年m月d日 H:i\", $time);\n        $htime = date(\"H:i\", $time);\n        $time = time() - $time;\n        if ($time < 60) {\n            $str = '刚刚';\n        } elseif ($time < 60 * 60) {\n            $min = floor($time / 60);\n            $str = $min . '分钟前';\n        } elseif ($time < 60 * 60 * 24) {\n            $h = floor($time / (60 * 60));\n            $str = $h . '小时前 ' . $htime;\n        } elseif ($time < 60 * 60 * 24 * 3) {\n            $d = floor($time / (60 * 60 * 24));\n            if ($d == 1){\n                $ztime = time() - $time;\n       $zztime = date(\"H:i\", $ztime);\n                $str = '昨天 ' . $zztime;\n            }else{\n                $qtime = time() - $time;\n       $qqtime = date(\"H:i\", $qtime);\n                $str = '前天 ' . $qqtime;\n        }} else {\n            $str = $rtime;\n        }\n         return $str;\n}\n\n\nif (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) {   \n    $db = \\Typecho\\Db::get();\n    \\Typecho\\Widget::widget('Widget_User')->to($user);\nif($_POST['action'] == 'getmemo'){\n\n$result = array(\n    'list' => array()\n);\n$markdown = new ParsedownExtension;\n$markdownParser = $markdown::instance();\n        \n        \n//resource逻辑\n$data = [];\nif(Bsoptions('Lazyload') == true){\n$lazyload = 'class=\"lazy\" data-';\n}\nif($_POST['action'] == 'getmemo'){\nif(Bsoptions('emaction_Openplace') && in_array('3',Bsoptions('emaction_Openplace')) && Bsoptions('emaction_Closelike') == true){\n       $emaction = true;\n   }\n   else{\n       $emaction = false;\n   }\n$result['number']  = $_POST['number'];   \nif(trim($temoptions['memos_Username']) !== ''){\n $memos_all = memos_getRequest($temoptions['memos_Url'].'/api/v1/memo/stats?creatorUsername='.$temoptions['memos_Username'],'GET');\n$memos = memos_getRequest($temoptions['memos_Url'].'/api/v1/memo?limit='.$_POST['number'].'&creatorUsername='.$temoptions['memos_Username'],'GET');  \n}\nelse{\n$memos_all = memos_getRequest($temoptions['memos_Url'].'/api/v1/memo/all','GET');\n$memos = memos_getRequest($temoptions['memos_Url'].'/api/v1/memo/all?limit='.$_POST['number'],'GET');\n}\n$result['total'] = count($memos_all);\n$result['stin'] = $_POST['stin'];\n$result['numberx']  = array_column($memos,'id');  \n$result['hiddenagree']  = $emaction;  \nforeach($memos as $key => $val){\n  $agree = $db->fetchRow($db->select()->from('table.bscore_memos_agree_data')->where('memosid = ? ', $val['id']));\n    if(!$agree){\n        $val['memos_agree'] = 0;\n    }\n    else{\n        $val['memos_agree'] = $agree['agree'];\n    }\nif(!$val['resourceList']){\n  $data = '';  \n}\nelse{\n$data = [];\n        foreach($val['resourceList'] as $v){\n            //当类型为图片的时候直接使用img标签包裹\n            if (strpos($v['type'], 'image/') !== false) {\n            if(!$v['externalLink']){\n            $data[] = '<img data-fancybox=\"image\" data-caption=\"'.$v['filename'].'\" '.lazyload('auto').'src=\"'.$temoptions['memos_Url'].'/o/r/'.$v['id'].'\" referrerPolicy=\"no-referrer\" data-memo-image>';  \n            }\n            else{\n            $data[] = '<img data-fancybox=\"image\" data-caption=\"'.$v['filename'].'\" '.lazyload('auto').'src=\"'.$v['externalLink'].'\" referrerPolicy=\"no-referrer\" data-memo-image>';      \n            }\n            }\n            //反之则当做超链接处理\n            else{\n              \n              if(!$v['externalLink']){\n            $data[] = '<a href=\"'.$temoptions['memos_Url'].'/o/r/'.$v['id'].'/'.$v['publicId'].'\" target=\"_blank\" data-memo-file><i class=\"file alternate outline icon\"></i>'.$v['filename'].'</a>';  \n            }\n            else{\n                $data[] = '<a href=\"'.$v['externalLink'].'\" target=\"_blank\" data-memo-file><i class=\"file alternate outline icon\"></i>'.$v['filename'].'</a>';  \n            }\n                \n            }\n        }  \n        \n}\n $content = $val['content'];\n     \n        if(strpos($content,'- [x]')!==false||strpos($content,'- [ ]')!==false){\n            $attributes = array(\"style\"=>\"list-style: none;\");\n            $content = str_replace(array('- [x]','- [ ]'), array(\n                '<input type=\"checkbox\" checked=\"true\" disabled=\"true\">',\n                '<input type=\"checkbox\" disabled=\"true\">',\n            ), $content);\n        }\n   \n    \n         $content =  reEmo($markdownParser->setBreaksEnabled(true)->text($content),'comment');\n         $pattern = '/<\\s*img[\\s\\S]+?(?:src=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|alt=[\\'\"]([\\S\\s]*?)[\\'\"]\\s*|[a-z]+=[\\'\"][\\S\\s]*?[\\'\"]\\s*)+[\\s\\S]*?>/i';\nif (strpos($content, '<h1') !== false) {\n        $content = preg_replace('/\\<h1\\>(.*?)\\<\\/h1\\>/sm', '<a class=\"ui label\" style=\"margin-top:10px\"><i class=\"tag icon\"></i>$1</a>', $content);\n   }\n   \n $replacement = '\n  <img data-fancybox=\"image\" data-caption=\"$2\" '.$lazyload.'src=\"$1\">'; \n    $content = preg_replace($pattern, $replacement, $content);\n    \n             $result['list'][] = array(\n                    'memos_id'=> $val['id'],\n                    'memos_time' =>memos_getTime($val['createdTs']),\n                    'memos_uid' =>$val['creatorId'],\n                    'memos_name'=>$val['creatorName'],\n                    'memos_content'=> $content,\n                    'memos_agree'=>$val['memos_agree'],\n                    'resource'=>$data\n                    );\n                    //土办法，前台传入判断是否为next以及上一次输出的memos id数组，然后在这一次输出中删除存在这个数组id的数据\n           if($_POST['stin'] == 'next'){\n           foreach($_POST['numberx'] as $nu){\n        if($val['id'] == $nu)\n        unset($result['list'][$key]);\n    }\n            }\n}\n}\n            exit(json_encode($result,JSON_UNESCAPED_UNICODE));\n}\nelseif($_POST['action'] == 'getmemolike'){\n        if(!is_numeric($_POST['memoid'])){\n                $result = array(\n    'code' => 0,\n    'message' => 'error'\n);\nexit(json_encode($result));  \n    }\n    if(\\Typecho\\Cookie::get('memo_agree_'.$_POST['memoid']) == '1'){\n                $result = array(\n    'code' => 0,\n    'message' => '啊哦，您已经点赞过了~'\n);\nexit(json_encode($result));  \n    }\n    $oldlikenum = $db->fetchRow($db->select('table.bscore_memos_agree_data.agree')->from('table.bscore_memos_agree_data')->where('memosid = ?', $_POST['memoid']));\n    if(!$oldlikenum){\n    $memo_agree = array(\n                'memosid' => $_POST['memoid'],\n                'agree' => 1,\n            );\n    $db->query($db->insert('table.bscore_memos_agree_data')->rows($memo_agree));    \n    }\n    else{\n             $db->query($db->update('table.bscore_memos_agree_data')->rows(array('agree' => (int)$oldlikenum['agree'] + 1))->where('memosid = ?', $_POST['memoid']));\n    }\n    $newlikenum = $db->fetchRow($db->select()->from('table.bscore_memos_agree_data')->where('memosid = ? ', $_POST['memoid']));     \n    \\Typecho\\Cookie::set('memo_agree_'.$_POST['memoid'],'1');    \n $result = array(\n    'code' => 1,\n    'memo_id' => $_POST['memoid'],\n    'memo_agree'=>$newlikenum['agree'],\n    'msg' => 'success',\n);\n        exit(json_encode($result,JSON_UNESCAPED_UNICODE));\n        \n        \n}\n\n}\n\n   "
  },
  {
    "path": "core/widget/getPosterInfo.php",
    "content": "<?php\nuse Utils\\Markdown as Markdown;\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\nerror_reporting(0);\n$cid = $_POST[\"id\"];\n\nfunction getCustomx($cid, $key){\n    $db = Typecho_Db::get();\n    $rows = $db->fetchAll($db->select('table.fields.str_value')->from('table.fields')\n        ->where('table.fields.cid = ?', $cid)\n        ->where('table.fields.name = ?', $key)\n    );\n    // 如果有多个值则存入数组\n    foreach ($rows as $row) {\n        $img = $row['str_value'];\n        if (!empty($img)) {\n            $values[] = $img;\n        }\n    }\n    return $values;\n}\n\nfunction posterPic($cid) {\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $db = Typecho_Db::get();\n    $md = new Markdown();\n    $result = Typecho_Widget::widget('Widget_Archive@post_'.$cid, 'type=post', 'cid='.$cid);\n                    $content = $md::convert($content->text);\n   preg_match_all(\"/\\<img.*?src\\=\\\"(.*?)\\\"[^>]*>/i\", $content, $pic);  //通过正则式获取图片地址\n   $img_src = $pic[1][0];\n\t// 获取文章封面\n\t$cover = getCustomx($cid, 'cover');\nif($cover){\n\t    $thumb = $cover[0];\n\t}else if($img_src){\n\t\t$thumb = $img_src;\n\t}\n\telse{\n\t   $thumb = $options['Poster__AttUrl']; \n\t}\n\t\nif(!$cover && $options['Poster__AttChoose'] == true){\n\t  $thumb = $options['Poster__AttUrl'];   \n\t}\t \n\treturn $thumb;\n}\n\n\nfunction image_to_base64($image){\n\t\t$site_domain = parse_url(Helper::options()->siteUrl, PHP_URL_HOST);\n\t\t$img_domain = parse_url($image, PHP_URL_HOST);\n\t\tif ( $img_domain !== $site_domain ) {\n\t\t\tif(preg_match('/^\\/\\//i', $image)) $image = 'http:' . $image;\n\t\t\t $img_base64 = '';\n\t\t\t $img_url = $image;\n    $imageInfo = getimagesize($img_url);\n    if (!$imageInfo) {\n        return false;\n    }\n    $img_base64 = \"\" . chunk_split(base64_encode(file_get_contents($img_url)));\n        $img_base64 = 'data:' . $imageInfo['mime'] . ';base64,'.$img_base64;\n    return $img_base64;\n\t\t}\n\t\t$image = preg_replace('/^(http:|https:)/i', '', $image);\n\t\treturn $image;\n\t}\n\t\nif(isset($cid) && $cid){\n    $md = new Markdown();\n            $db = Typecho_Db::get();\n            $prefix = $db->getPrefix();\n            $posts = $db->fetchAll($db\n                ->select()->from('table.contents')\n                ->Where('table.contents.cid = ?', $cid));\n                $result = Typecho_Widget::widget('Widget_Archive@post_'.$cid, 'type=post', 'cid='.$cid);\n                    $targetSummary = excerpt($md::convert($result['text']),80);\n                $targetTitle = $result->title;\n                $targetUrl = $result->permalink;\n                $targetDate = $result->created;\n                $expert = getCustomFields($cid, 'excerpt');\n                if($expert){\n                    $targetSummary = $expert[0];\n                }\n                $targetSummary = trim(strip_tags($targetSummary));\n\t\t\t$targetSummary = preg_replace('/\\\\s+/',' ',$targetSummary);\n\n                $res = array(\n\t\t\t\t'head' => image_to_base64(posterPic($cid)),\n\t\t\t\t'logo' => image_to_base64(Bsoptions('Poster__LogoUrl')),\n\t\t\t\t'title' => $targetTitle,\n\t\t\t\t'excerpt' => $targetSummary,\n\t\t\t\t'textlogo' => Helper::options()->title,\n\t\t\t\t'timestamp' => $targetDate\n\t\t\t);\n                echo json_encode($res,JSON_UNESCAPED_UNICODE);\n                exit;\n\n}\n"
  },
  {
    "path": "core/widget/getTags.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\nerror_reporting(0);\nob_clean();\nfunction tags_api() {\n    $page = max(1, isset($_GET['page']) ? intval($_GET['page']) : 1);\n    $perPage = 50;\n    $db = Typecho_Db::get();\n    $tags = $db->fetchAll($db->select()\n        ->from('table.metas')\n        ->where('type = ?', 'tag')\n        ->page($page, $perPage)\n        ->order('mid', Typecho_Db::SORT_DESC));\n\n    $query = $db->fetchAll($db->select()\n        ->from('table.metas')\n        ->where('type = ?', 'tag')\n        ->order('mid', Typecho_Db::SORT_DESC));\n    $total = count($query);\n\n    $arr = array();\nforeach($tags as $value){\n    $val = \\Typecho\\Widget::widget('Widget\\Base\\Metas')->push($value);\n$arr[] = $val;\n}\n\n    header('Content-Type: application/json');\n    echo json_encode([\n        'tags' => $arr,\n        'total' => $total,\n        'currentPage' => $page\n    ]);\n    exit;\n}\n\n    tags_api();\n?>"
  },
  {
    "path": "core/widget/getUsers.php",
    "content": "<?php\nuse Typecho\\Db;\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    Typecho_Widget::widget('Widget_User')->to($user);\n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false && $user->hasLogin() && $user->pass('administrator', true)) {   \n        $db = \\Typecho\\Db::get();\n        $searchQuery = '%' . str_replace(' ', '%', $_GET['q']) . '%';\n        $usersearch = $db->fetchAll($db->select()->from('table.users')->where('name LIKE ? ', htmlspecialchars($searchQuery,ENT_QUOTES,'UTF-8')));\n        foreach($usersearch as $sear){\n       $data[] = array(\n                'id'    =>  $sear['uid'],\n                'name'  =>  $sear['name']\n            );\n\n          \n        }\n        echo json_encode($data);\n       }\n   // }"
  },
  {
    "path": "core/widget/getarticle.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\nheader(\"Access-Control-Allow-Origin: *\");\ndate_default_timezone_set('PRC');\n\n$db = Typecho_Db::get();\n$options = Helper::options();\n$result = ['items' => []];\n\n$keywords = isset($_GET['keyword']) ? trim(strip_tags($_GET['keyword'])) : '';\n$searchWay = Bsoptions('Search_Way') ?? '1'; \n\n$isInternal = false;\nif (!empty($_SERVER['HTTP_REFERER']) && !empty($options->siteUrl)) {\n    $siteDomain = parse_url($options->siteUrl, PHP_URL_HOST);\n    $refDomain = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);\n    $isInternal = ($siteDomain && $refDomain && \n                  strtolower($siteDomain) === strtolower($refDomain));\n}\n\nfunction buildLikeParam($value) {\n    return '%' . str_replace(['%', '_'], ['\\%', '\\_'], $value) . '%';\n}\n\nfunction getPostUrlByCid($cid) {\n    $post = Typecho_Widget::widget('Widget_Archive@post_'.$cid, 'type=post', 'cid='.$cid);\n    return $post->permalink;\n}\n\n// 智能分词处理\nfunction tokenizeKeywords($text) {\n    $tokens = [];\n\n    $langMix = (preg_match('/[\\x{4e00}-\\x{9fa5}]/u', $text) && preg_match('/[a-zA-Z]/', $text));\n    $minLen = $langMix ? 2 : 3; \n\n    // 提取中文字符\n    if (preg_match_all('/[\\x{4e00}-\\x{9fa5}]/u', $text, $matches)) {\n        $tokens = array_merge($tokens, $matches[0]);\n    }\n\n    if (preg_match_all(\"/\\b\\w{{$minLen},}\\b/u\", $text, $matches)) {\n        $tokens = array_merge($tokens, $matches[0]);\n    }\n    \n    // 提取数字\n    if (preg_match_all('/\\b\\d+\\b/', $text, $matches)) {\n        $tokens = array_merge($tokens, $matches[0]);\n    }\n\n    if (empty($tokens)) {\n        $tokens[] = $text;\n    }\n\n    return array_unique($tokens);\n}\n\nfunction generateSummary($content, $cid = 0) {\n    if ($cid > 0) {\n        $excerpts = getCustomFields($cid, 'excerpt');\n        if (!empty($excerpts[0])) {\n            return trim($excerpts[0]);\n        }\n    }\n\n    $hidePatterns = [\n        '/\\{bs-hide[^\\}]*\\}/is',\n        '/\\[bs-hide[^\\]]*\\]/is',\n        '/<blockhide[^>]*>.*?<\\/blockhide>/is',\n        '/\\[bslogin[^\\]]*\\]/is'\n    ];\n    \n    $cleanContent = preg_replace($hidePatterns, '', $content);\n\n    if (class_exists('Markdown')) {\n        $md = new Markdown();\n        $cleanContent = $md::convert($cleanContent);\n    }\n\n    $plainText = trim(strip_tags($cleanContent));\n    $plainText = preg_replace('/\\s+/', ' ', $plainText);\n    \n    if (empty($plainText)) {\n        return '本篇文章暂无摘要~';\n    }\n\n    $maxLen = (preg_match('/[\\x{4e00}-\\x{9fa5}]/u', $plainText)) ? 100 : 150;\n    return Typecho_Common::subStr($plainText, 0, $maxLen, '...');\n}\n\ntry {\n    if (empty($keywords)) {\n        throw new Exception('请输入搜索关键词');\n    }\n\n    if (!$isInternal) {\n        throw new Exception('请求来源不安全，拒绝服务');\n    }\n\n    $select = $db->select()->from('table.contents')\n     ->where('type = ?', 'post')\n     ->where('status = ?', 'publish')\n     ->limit(50);\n    if ($this->user->hasLogin()) {\n        $select->where('(password IS NULL OR password = \\'\\' OR authorId = ?)', \n                     intval($this->user->uid));\n    } else {\n        $select->where('(password IS NULL OR password = \\'\\')');\n    }\n\n    if ($searchWay == '1') {\n        $likeParam = buildLikeParam($keywords);\n        $select->where('(title LIKE ? OR text LIKE ?)', $likeParam, $likeParam);\n    } \n    else {\n        $tokens = tokenizeKeywords($keywords);\n        \n        $conditions = [];\n        $params = [];\n        \n        foreach ($tokens as $token) {\n            $likeToken = buildLikeParam($token);\n            $conditions[] = '(title LIKE ? OR text LIKE ?)';\n            $params[] = $likeToken;\n            $params[] = $likeToken;\n        }\n        \n        $select->where('(' . implode(' OR ', $conditions) . ')', ...$params);\n    }\n\n    $posts = $db->fetchAll($select);\n   \n    if (!empty($posts)) {\n        foreach ($posts as $post) {\n     \n $permalink = getPostUrlByCid($post['cid']);\n            $summary = generateSummary($post['text'], $post['cid']);\n            \n            $result['items'][] = [\n                'url' => $permalink,\n                'article' => htmlspecialchars($post['title']),\n                'description' => htmlspecialchars($summary)\n            ];\n        }\n        \n        if (count($posts) >= 20) {\n            $result['items'][] = [\n                'url' => $options->index . \"?s=\" . urlencode($keywords),\n                'article' => \"查看更多结果\",\n                'description' => \"点击查看完整搜索结果\"\n            ];\n        }\n    } else {\n        $result['items'][] = [\n            'url' => $options->index . \"?s=\" . urlencode($keywords),\n            'article' => \"未找到相关内容\",\n            'description' => \"尝试站内完整搜索\"\n        ];\n    }\n\n} catch (Exception $e) {\n    $result['items'][] = [\n        'url' => $options->index . \"?s=\" . urlencode($keywords),\n        'article' => \"搜索处理出错\",\n        'description' => $e->getMessage()\n    ];\n}\n\nheader('Content-Type: application/json; charset=utf-8');\necho json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);"
  },
  {
    "path": "core/widget/getgithub.php",
    "content": "<?php\n/**\n * \n * Github数据获取\n * Template:Bearsimple\n * Date:2022/02/11\n * \n**/\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\nerror_reporting(0);\n\nfunction getData(){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $optionss = Helper::options();\n    //验证传值\nif ($_GET['type'] !== 'github')\n{\n    $result = array('code'=> '-1','message'=>'The pass-through value is wrong.');\necho json_encode($result); \nexit;\n} \n//验证传值\nif (is_numeric($_GET['page']) == false)\n{\n$result = array('code'=> '-1','message'=>'The pass-through value is wrong.');\necho json_encode($result); \nexit;\n} \n $removeChar = [\"https://\", \"http://\"]; \n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $optionss->siteUrl)) !== false) {   \n$options = bsOptions::getInstance()::get_option( 'bearsimple' );\n$str = $options['github_accountid'];\n    $status = json_decode(curl_get('https://api.github.com/users/'.$options['github_accountid'].'/repos?per_page=99999'),true);\n     //$arr=array_column($status,'fork');\n     $tot = array(\n    'list' => array()\n);\nforeach($status as $voo){\n  $tot['list'][] = array((string)$voo);\n}\n$status = count($tot['list']);\n$max = ceil($status / 12);\n$total = $status;\n$result = array(\n    'total' => $total,\n    'max' => $max,\n    'list' => array()\n);\nif(empty($_GET['page'])){\n    $i = 1;\n}\nelse{\n    $i = $_GET['page']; \n}\n                $info = json_decode(curl_get('https://api.github.com/users/'.$options['github_accountid'].'/repos?per_page=12&page='.$i),true);\n                foreach ($info as $data) {\n                    if($data[\"language\"] == null){\n                       $data[\"language\"] = 'Other'; \n                    }\n                   \t$result['list'][] = array(\n\t 'url' => $data[\"html_url\"],\n\t 'name' => $data[\"name\"],\n\t 'dec' => $data[\"description\"],\n\t 'push' => date('Y-m-d H:m:s',strtotime($data['pushed_at'])),\n     'forks' => $data[\"forks_count\"],\n     'stars' => $data[\"stargazers_count\"],\n     'language' => $data[\"language\"]\n\t);\n                    \n}\n}\nelse{\n    $result = array('code'=> '-1','message'=>'Error');\n}\necho json_encode($result);\n\n}\ngetData();\n?>\n"
  },
  {
    "path": "core/widget/getsign.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    $options = Helper::options();\n    $temoptions = bsOptions::getInstance()::get_option( 'bearsimple' );\n    $removeChar = [\"https://\", \"http://\"]; \n    \n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) {   \n        $db= \\Typecho\\Db::get();\n        if($this->user->uid == '' || $temoptions['UserCenter_sign'] == ''||  $temoptions['UserCenter_sign'] == false){\n            $result = array(\n    'code' => 0,\n    'message' => 'error'\n);\n      exit(json_encode($result));  \n        }\n        $sign_data = array(\n                'signuid' => $this->user->uid,\n                'signtime' => date('Y-m-d',time()),\n            );\n            if(!is_numeric($temoptions['UserCenter_sign_min'])){\n                $min_coin = '1';\n            }\n            elseif($temoptions['UserCenter_sign_min'] <= 0){\n                $min_coin = '1';\n            }\n            else{\n               $min_coin = $temoptions['UserCenter_sign_min']; \n            }\n            \n            \n            if(!is_numeric($temoptions['UserCenter_sign_max'])){\n                $max_coin = '5';\n            }\n            elseif($temoptions['UserCenter_sign_min'] <= 0){\n                $max_coin = '5';\n            }\n            else{\n               $max_coin = $temoptions['UserCenter_sign_max']; \n            }\n            \n            \n            if($temoptions['UserCenter_sign_getCoin'] == true){\n                $rand_coin = rand($min_coin,$max_coin);\n               $sign_data['signcoin'] = $rand_coin;\n            }\n            else{\n               $sign_data['signcoin'] = '0'; \n            }\n            $db->query($db->insert('table.bscore_sign_data')->rows($sign_data));\n            $oldcoin = $db->fetchRow($db->select('table.users.coins')->from('table.users')->where('uid = ?', $this->user->uid));\n             $db->query($db->update('table.users')->rows(array('coins' => (int)$oldcoin['coins'] + $rand_coin))->where('uid = ?', $this->user->uid));\n            $result = array(\n    'code' => 1,\n    'msg' => 'success',\n);\nif($temoptions['UserCenter_sign_getCoin'] == true){\n   $result['signcoin'] = $rand_coin; \n}\n      exit(json_encode($result));\n    }\n"
  },
  {
    "path": "core/widget/pageContent.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n$db = \\Typecho\\Db::get();\n$prefix = $db->getPrefix();\n\n$cid = isset($_POST['cid']) ? addslashes($_POST['cid']) : 0;\n$query= $db->select()->from('table.contents')->where('cid = ?', $cid); \n$row = $db->fetchRow($query);\n$log_content=@$row[\"text\"];\n$page_now = isset($_POST['page_now']) ? intval($_POST['page_now']) : 1;\nif($page_now<1){\n\t$page_now=1;\n}\n$content_list = explode(\"----------\", $log_content);\n$page_count = count($content_list);\n\n$page_rec=1;\n$totalrec=$page_count;\n$page=ceil($totalrec/$page_rec);\n\n$arr['totalItem'] = $totalrec;\n$arr['pageSize'] = $page_rec;\n$arr['totalPage'] = $page;\n\n$content=stripslashes($content_list[$page_now -1]);\n\n$i=0;\n$match_1 = \"/(\\!\\[).*?\\]\\[(\\d)\\]/\";\npreg_match_all ($match_1,$content,$matches_1,PREG_PATTERN_ORDER);\nif(count($matches_1)>0&&count($matches_1[0])>0){\n\tforeach($matches_1[0] as $val_1){\n\t\t$content=str_replace($val_1,\"\",$content);\n\t\t$img_prefix=substr($val_1,strlen($val_1)- 3,3);\n\t\t$img_prefix=str_replace(\"[\",\"\\[\",$img_prefix);\n\t\t$img_prefix=str_replace(\"]\",\"\\]\",$img_prefix);\n\t\t$match_2 = \"/(\".$img_prefix.\":).*?((.gif)|(.jpg)|(.bmp)|(.png)|(.GIF)|(.JPG)|(.PNG)|(.BMP))/\";\n\t\tpreg_match_all ($match_2,$content,$matches_2,PREG_PATTERN_ORDER);\n\t\tif(count($matches_2)>0&&count($matches_2[0])>0){\n\t\t\tforeach($matches_2[0] as $val_2){\n\t\t\t\t$img=substr($val_2,4);\n\t\t\t\t$content=preg_replace($match_2,'<img src=\"'.$img.'\" />',$content);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}else{\n\t\t\tbreak;\n\t\t}\n\t\t$i++;\n\t}\n}\n\nif($page_now==1&&strpos($content, '<!--markdown-->')===0){\n\t$content=substr($content,15);\n}\n$content=\\Utils\\Markdown::convert($content);\n$content = str_replace(\"<img \", \"<img width=\\\"100%\\\"\", $content);\n$arr['log_content'] = reEmoPost(ShortCodePage($content,$_POST['title'],$_POST['remember'],$_POST['cid'],$_POST['haslogin'],$_POST['ArticleType']));\necho json_encode($arr);\n?>"
  },
  {
    "path": "core/widget/postlike.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    \n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false) {   \nif (isset($_POST['agree'])) {\n    $result = array(\n    'code' => 1,\n    'agree' => agree($_POST['agree']),\n);\n      exit(json_encode($result));\n}\n    }\n    else{\n        $result = array(\n    'code' => 2,\n    'message' => 'error'\n);\n      exit(json_encode($result));  \n    }"
  },
  {
    "path": "core/widget/safeRedirection.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\", \"/\"]; \n    $refer = str_replace($removeChar, \"\", $_SERVER['HTTP_REFERER']);\n     echo <<<EOF\n<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n<meta name=\"renderer\" content=\"webkit\">\n<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\" />\n<title>{$options->title} 免责声明</title>\n<style>\nbody {\n\tbackground-color:#fafcfa;\n\tpadding:0;\n\tmargin:0;\n\tcolor:#333;\n\tfont-size:16px;\n}\n.wrapper {\n\tmargin:0 auto;\n\tmargin-top:100px;\n\tdisplay: flex;\n  justify-content: center;\n  align-items: center;\n}\n.main {\n\tbackground-color:#fff;\n\tpadding:40px;\n\tpadding-bottom:25px;\n    border-radius: 5px;\n\tbox-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 1);\n\t-moz-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 1);\n\t-webkit-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 1);\n}\n.logo {\n\ttext-align:center;\n  \tmargin-bottom: 20px;\n}\n.title {\n\ttext-align:center;\n\tfont-size:26px;\n\tcolor:#2a8c2a;\n}\n.content {\n\tborder-top:1px solid #ddd;\n\tmargin-top: 20px;\n\tpadding: 25px 20px;\n}\n.footer {\n\tborder-top:1px solid #ddd;\n\tpadding-top:20px;\n\tfont-size:14px;\n\ttext-align: center;\n\tcolor: #999;\n}\na, a:hover, a:active {color:#999; text-decoration:none;}\n  \n.content p{line-height: 30px;}\n.content a, .content a:hover, .content a:active {color: #00e;}\n</style>\n</head>\n\n<body>\n\t<div class=\"wrapper\">\n\t\t<div class=\"main\">\n          \t<div class=\"logo\"><h1>{$options->title}</h1></div>\n\t\t\t<div class=\"title\">免责声明</div>\n\t\t\t<div class=\"content\">\n              <p>您从 <b>{$refer}</b> 进入本站，<b>{$refer}</b> 网站的内容与本站无关。</p>\n\t\t\t</div>\n\t\t\t<div class=\"footer\">\n\t\t\t\t<a href=\"{$_SERVER['REQUEST_URI']}\" style=\"display: inline-block;background: #155bd5;color: #fff;height: 44px;line-height: 44px;font-size: 14px;padding: 0 30px;border-radius: 30px;\">点击继续访问我们的网站</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</body>\n</html>\nEOF;\n\n           "
  },
  {
    "path": "core/widget/syncData.php",
    "content": "<?php\nuse Typecho\\Db;\nob_clean();\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    header('Content-type: application/json');\n    date_default_timezone_set('PRC');\nignore_user_abort(true);\nset_time_limit(0);\nini_set('memory_limit',-1);\nini_set('mysql.connect_timeout', 900);\nini_set('default_socket_timeout', 900);\nsession_start();\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    Typecho_Widget::widget('Widget_User')->to($user);\n    $db = \\Typecho\\Db::get();\n$id = $this->user->uid;\n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false  && $user->hasLogin()) {   \n       switch($_POST[\"action\"]){ \n           case \"openCopyright\":\n             $db->query($db->update('table.fields')->where('name = ?', 'copyright_cc')->rows(array('str_value' =>$_POST['type'])));\n             $db->query($db->update('table.fields')->where('name = ?', 'copyright')->rows(array('str_value' =>\"1\")));\n $result = array(\n    'code' => 1,\n    'msg' => '同步成功'\n);\nbreak;\n\ncase \"closeCopyright\":\n             $db->query($db->update('table.fields')->where('name = ?', 'copyright')->rows(array('str_value' =>\"2\")));\n $result = array(\n    'code' => 1,\n    'msg' => '同步成功'\n);\nbreak;\ncase \"openHot\":\n             $db->query($db->update('table.fields')->where('name = ?', 'Hot')->rows(array('str_value' =>\"1\")));\n $result = array(\n    'code' => 1,\n    'msg' => '同步成功'\n);\nbreak;\n\ncase \"closeHot\":\n             $db->query($db->update('table.fields')->where('name = ?', 'Hot')->rows(array('str_value' =>\"2\")));\n $result = array(\n    'code' => 1,\n    'msg' => '同步成功'\n);\nbreak;\ncase \"openTag\":\n             $db->query($db->update('table.fields')->where('name = ?', 'tags')->rows(array('str_value' =>\"1\")));\n $result = array(\n    'code' => 1,\n    'msg' => '同步成功'\n);\nbreak;\n\ncase \"closeTag\":\n             $db->query($db->update('table.fields')->where('name = ?', 'tags')->rows(array('str_value' =>\"2\")));\n $result = array(\n    'code' => 1,\n    'msg' => '同步成功'\n);\nbreak;\ncase \"syncCircleData\":\n \n    $fcRows = $db->fetchAll($db->select()->from('table.contents')\n        ->where('template = ?', 'friendcircle.php')\n    );\n    foreach($fcRows as $fcr){\n       $fcMens = $db->fetchAll($db->select()->from('table.comments')\n        ->where('cid = ?', $fcr['cid'])\n        ->where('parent = ?', 0)\n    ); \n     foreach($fcMens as $fcm){\n        $fcData = $db->fetchRow($db->select()->from('table.bscore_friendcircle_data')\n        ->where('coid = ?', $fcm['coid']) \n        );\n        if(!$fcData){\n            $circle_data = array(\n                'coid' => $fcm['coid'],\n                 'location' => '',\n                'private' => false,\n                'resources' => '',\n            );\n    $db->query($db->insert('table.bscore_friendcircle_data')->rows($circle_data));\n    \n        }\n        \n     }\n    }\n     $result = array(\n    'code' => 1,\n    'msg' => '同步成功'\n);\n    break;\n}\n\n        exit(json_encode($result,JSON_UNESCAPED_UNICODE));\n\n}"
  },
  {
    "path": "core/widget/usernotify.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    $options = Helper::options();\n    $removeChar = [\"https://\", \"http://\"]; \n    $temoptions = bsOptions::getInstance()::get_option( 'bearsimple' );\n    Typecho_Widget::widget('Widget_User')->to($user);\n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false && $user->hasLogin() && $user->pass('administrator', true)) {   \n        $db = \\Typecho\\Db::get();\n        if($_POST['type'] == 'notify'){\n           $user = explode(',',$_POST['searchUser']);\n            foreach($user as $arr){\n       $notify = array(\n                'notifyuid' => $arr,\n                'notifytime' => date('Y年m月d日',time()),\n                'notifytitle' => htmlspecialchars($_POST['notifytitle'],ENT_QUOTES,'UTF-8'),\n                'notifytext' => htmlspecialchars($_POST['notifytext'],ENT_QUOTES,'UTF-8'),\n            );\n            $db->query($db->insert('table.bscore_notify_data')->rows($notify)); \n            }\n            \n            echo 1;\n        }\n       \n   }\n   else{\n       echo 0;\n   }"
  },
  {
    "path": "core/widget/wechatServer/Config.php",
    "content": "<?php\n$db = \\Typecho\\Db::get();\n$amapSecret = '';\n$options = bsOptions::getInstance()::get_option('bearsimple');\n$config = [\n    'app_id' => $options['wechat_appid'],\n    'secret' => $options['wechat_appsecret'],\n    'token' => $options['wechat_verifyToken'],\n \t'aes_key' => $options['wechat_aeskey'],\n    'response_type' => 'array',\n   'log' => [\n        'default' => 'prod',\n        'channels' => [\n            'dev' => [\n                'driver' => 'single',\n                'path' => __DIR__.'/tmp/wechat.log',\n                'level' => 'debug',\n            ],\n            'prod' => [\n                'driver' => 'single',\n                'path' =>__DIR__.'/tmp/wechat.log',\n                'level' => 'info',\n            ],\n        ],\n    ],\n];"
  },
  {
    "path": "core/widget/wechatServer/ImgCompress.php",
    "content": "<?php\n/**\n * 超级时光鸡\n * @author 即刻学术 www.ijkxs.com\n * @package custom\n */\n\nclass ImgCompress{\n    private $src;\n    private $image;\n    private $imageinfo;\n    private $percent = 1;\n\n    /**\n     * 图片压缩\n     * @param $src String 源图\n     * @param int $percent 压缩比例\n     */\n    public function __construct($src, $percent=1)\n    {\n        $this->src = $src;\n        $this->percent = $percent;\n    }\n    /** 高清压缩图片\n     * @param string $saveName  提供图片名（可不带扩展名，用源图扩展名）用于保存。或不提供文件名直接显示\n     */\n    public function compressImg($saveName='')\n    {\n        $this->_openImage();\n        if(!empty($saveName)) $this->_saveImage($saveName);  //保存\n        else $this->_showImage();\n    }\n    /**\n     * 内部：打开图片\n     */\n    private function _openImage()\n    {\n        list($width, $height, $type, $attr) = getimagesize($this->src);\n        $this->imageinfo = array(\n            'width'=>$width,\n            'height'=>$height,\n            'type'=>image_type_to_extension($type,false),\n            'attr'=>$attr\n        );\n        $fun = \"imagecreatefrom\".$this->imageinfo['type'];\n        $this->image = $fun($this->src);\n        $this->_thumpImage();\n    }\n    /**\n     * 内部：操作图片\n     */\n    private function _thumpImage()\n    {\n        $new_width = $this->imageinfo['width'] * $this->percent;\n        $new_height = $this->imageinfo['height'] * $this->percent;\n        $image_thump = imagecreatetruecolor($new_width,$new_height);\n        //将原图复制带图片载体上面，并且按照一定比例压缩,极大的保持了清晰度\n        imagecopyresampled($image_thump,$this->image,0,0,0,0,$new_width,$new_height,$this->imageinfo['width'],$this->imageinfo['height']);\n        imagedestroy($this->image);\n        $this->image = $image_thump;\n    }\n    /**\n     * 输出图片:保存图片则用saveImage()\n     */\n    private function _showImage()\n    {\n        header('Content-Type: image/'.$this->imageinfo['type']);\n        $funcs = \"image\".$this->imageinfo['type'];\n        $funcs($this->image);\n    }\n\n    /**\n     * 保存图片到硬盘：\n     * @param string $dstImgName 1、可指定字符串不带后缀的名称，使用源图扩展名 。2、直接指定目标图片名带扩展名。\n     * @return bool\n     */\n    private function _saveImage($dstImgName)\n    {\n        if(empty($dstImgName)) return false;\n        $allowImgs = ['.jpg', '.jpeg', '.png', '.bmp', '.wbmp','.gif'];   //如果目标图片名有后缀就用目标图片扩展名 后缀，如果没有，则用源图的扩展名\n        $dstExt =  strrchr($dstImgName ,\".\");\n        $sourseExt = strrchr($this->src ,\".\");\n        if(!empty($dstExt)) $dstExt =strtolower($dstExt);\n        if(!empty($sourseExt)) $sourseExt =strtolower($sourseExt);\n        //有指定目标名扩展名\n        if(!empty($dstExt) && in_array($dstExt,$allowImgs)){\n            $dstName = $dstImgName;\n        }elseif(!empty($sourseExt) && in_array($sourseExt,$allowImgs)){\n            $dstName = $dstImgName.$sourseExt;\n        }else{\n            $dstName = $dstImgName.$this->imageinfo['type'];\n        }\n        $funcs = \"image\".$this->imageinfo['type'];\n        $funcs($this->image,$dstName);\n    }\n    /**\n     * 销毁图片\n     */\n    public function __destruct(){\n        imagedestroy($this->image);\n    }\n}"
  },
  {
    "path": "core/widget/wechatServer/WechatUtils.php",
    "content": "<?php\nif (!defined('__TYPECHO_ROOT_DIR__')) exit;\nrequire_once 'ImgCompress.php';\n\nclass WechatUtils {\n    \n    public static function uploadFile($blogUrl,$dir,$fileName,$openid){\n $bsoptions = bsOptions::getInstance()::get_option( 'bearsimple' );       \n     \n // 准备要上传的文件\n$file_path = $blogUrl.$dir.$fileName; // 文件路径   \n  \n// 初始化cURL会话\n$ch = curl_init();\n\n// 设置cURL选项\ncurl_setopt($ch, CURLOPT_URL,Typecho_Widget::widget('Widget_Security')->getIndex('/action/upload?do=wechatupload&openid='.$openid)); // 目标URL\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 将结果作为字符串返回，而不是直接输出\ncurl_setopt($ch, CURLOPT_POST, 1); // 启用POST请求\ncurl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 120);\ncurl_setopt($ch, CURLOPT_TIMEOUT, 120);\n$post_fields = array(\n    'file' => new CURLFile($file_path), // 创建CURLFile对象\n    'openid' => $openid,\n    'cid' => $bsoptions['wechat_choose'],\n);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); // 设置POST字段\n\n// 执行cURL会话并获取结果\n$result = curl_exec($ch);\n\n// 关闭cURL会话\ncurl_close($ch);\n\n$ret = json_decode($result,true);\n\n\n\n   return $ret[0];\n    }\n    \n    \n    \n    public static function uploadPic($blogUrl, $name, $pic,$type,$suffix,$openid){\n        $DIRECTORY_SEPARATOR = \"/\";\n        $childDir = $DIRECTORY_SEPARATOR.'usr'.$DIRECTORY_SEPARATOR.'uploads' . $DIRECTORY_SEPARATOR .'wechatServer' .$DIRECTORY_SEPARATOR;\n        $dir = __TYPECHO_ROOT_DIR__ . $childDir;\n        if (!file_exists($dir)){\n            mkdir($dir, 0777, true);\n        }\n        $fileName = $name. $suffix;\n        $file = $dir .$fileName;\n        if ($type == \"web\"){\n            $img = self::getDataFromWebUrl($pic);\n        }else{\n            $img = $pic;\n        }\n        $fp2 = fopen($file , \"a\");\n        fwrite($fp2, $img);\n        fclose($fp2);\n\n        (new Imgcompress($file,1))->compressImg($file);\n        \n $bsoptions = bsOptions::getInstance()::get_option( 'bearsimple' );       \n     \n // 准备要上传的文件\n$file_path = $blogUrl.$childDir.$fileName; // 文件路径   \n  \n// 初始化cURL会话\n$ch = curl_init();\n\n// 设置cURL选项\ncurl_setopt($ch, CURLOPT_URL,Typecho_Widget::widget('Widget_Security')->getIndex('/action/upload?do=wechatupload&openid='.$openid)); // 目标URL\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 将结果作为字符串返回，而不是直接输出\ncurl_setopt($ch, CURLOPT_POST, 1); // 启用POST请求\ncurl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 120);\ncurl_setopt($ch, CURLOPT_TIMEOUT, 120);\n$post_fields = array(\n    'file' => new CURLFile($file_path), // 创建CURLFile对象\n    'openid' => $openid,\n    'cid' => $bsoptions['wechat_choose'],\n);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); // 设置POST字段\n\n// 执行cURL会话并获取结果\n$result = curl_exec($ch);\n\n// 关闭cURL会话\ncurl_close($ch);\n\n$ret = json_decode($result,true);\n\n\n\n   return $ret[0];\n    }\n\n\n    public static  function getDataFromWebUrl($url){\n        $file_contents = \"\";\n        if (function_exists('file_get_contents')) {\n            $file_contents = @file_get_contents($url);\n        }\n        if ($file_contents == \"\") {\n            $ch = curl_init();\n            $timeout = 30;\n            curl_setopt($ch, CURLOPT_URL, $url);\n            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);\n            $file_contents = curl_exec($ch);\n            curl_close($ch);\n        }\n        return $file_contents;\n    }\n}"
  },
  {
    "path": "core/widget/wechatServer/bearWechatHandler.php",
    "content": "<?php\n$db = \\Typecho\\Db::get();\nuse \\EasyWeChat\\Kernel\\Contracts\\EventHandlerInterface;\nuse \\EasyWeChat\\OfficialAccount\\Application;\n\nfunction queryFileExist($type,$content){\n    $pattern = \"/($type->.*?@)/\";\nif (preg_match($pattern, $content)) {\n    return true;\n} else {\n    return false;\n}\n}\n\n\nfunction requestPost($url = '', $post_data = array())\n{\n    if (empty($url) || empty($post_data)) {\n        return false;\n    }\n\n    $o = \"\";\n    foreach ($post_data as $k => $v) {\n        $o .= \"$k=\" . urlencode($v) . \"&\";\n    }\n    $post_data = substr($o, 0, -1);\n\n    $postUrl = $url;\n    $curlPost = $post_data;\n    $ch = curl_init();\n    //初始化curl\n    curl_setopt($ch, CURLOPT_URL, $postUrl);\n    //抓取指定网页\n    curl_setopt($ch, CURLOPT_HEADER, 0);\n    //设置header\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n    //要求结果为字符串且输出到屏幕上\n    curl_setopt($ch, CURLOPT_POST, 1);\n    //post提交方式\n    curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '0');\n    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '0');\n    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);  // 连接等待时间  \n    curl_setopt($ch, CURLOPT_TIMEOUT, 120);         // curl允许执行时间\n    $data = curl_exec($ch);\n    //运行curl\n    curl_close($ch);\n\n    return $data;\n}\n\nfunction push($content, $msg_type, $url, $postEncryptToken, $cid, $action,$msgid,$openid)\n{\n    $desp = array('cid' => $cid,  'content' => $content, 'action' => $action, 'msgid'=> $msgid, 'openid'=> $openid,'postEncryptToken' => md5(\"bearsimple!@#$%^&*()-=+@#$%$\" . $postEncryptToken . \"bearsimple!@#$%^&*()-=+@#$%$@#$%^&*\"), 'msg_type' => $msg_type, 'agent' => 'weixin');\n    $res = requestPost($url, $desp);\n    return $res;\n}\n\nclass BearWechatHandler implements EventHandlerInterface\n{\n    public function handle($message = null)\n    {\n        $openid = $message['FromUserName'];\n       $db = \\Typecho\\Db::get();\n       $prefix = $db->getPrefix();\n       $options = Helper::options();\n       $bsoptions = bsOptions::getInstance()::get_option( 'bearsimple' );\n        $arr = $db->fetchRow($db->query(\"SELECT * FROM `{$prefix}bscore_wechat_data` WHERE openid='{$openid}'\"));\n        $url = Helper::options()->siteUrl.'index.php/wechatServer';\n        $postEncryptToken = Helper::options()->openId;\n        \n        $content = $arr['content'];\n        if($bsoptions['wechat_circleSendText'] == '' || $bsoptions['wechat_circleSendText'] == 'openid' || $bsoptions['wechat_circleSendText'] == '绑定' || $bsoptions['wechat_circleSendText'] == '解除绑定' || $bsoptions['wechat_circleSendText'] == '解绑' || $bsoptions['wechat_circleSendText'] == '帮助' || $bsoptions['wechat_circleSendText'] == '取消' || $bsoptions['wechat_circleSendText'] == '发表'){\n         $wechat_circleSendText = '发朋友圈';   \n        }\n        else{\n         $wechat_circleSendText = $bsoptions['wechat_circleSendText'];\n        }\n        if($bsoptions['wechat_service'] == false){\n           return \"您未开启微信公众号服务，无法通过公众号发送微语，请前往 [Bearsimple主题配置中心 - 实验室 - 微信公众号服务] 进行开启~~~\";\n           die;\n        }\n        switch ($message['Content']) {\n            case 'openid':\n                return $message['FromUserName'];\n                break;\n           case \"绑定\":\n                if (isset($options->openId)) {\n                    return \"您已完成绑定，无法重复绑定\";\n                } else {\n                    \n               if($db->query($db->update('table.options')->rows(array(\n                'value' => $message['FromUserName']))\n                        ->where('name = ?', 'openId')) &&  $db->query($db->insert('table.bscore_wechat_data')->rows(array('openid'=>$message['FromUserName'])))){\n                            \n                    return \"绑定成功！\";\n                        }\n                        else{\n                      return \"绑定失败，请稍后重试或前往BearTalk社区或QQ群寻求帮助！\";      \n                        }\n                \n                }\n                break;\n            case \"解除绑定\":\n            case \"解绑\":\n                if ($db->query($db->update('table.options')->rows(array(\n                'value' => null))\n                        ->where('name = ?', 'openId')) && $db->query($db->delete('table.bscore_wechat_data')->where('openid = ?', $message['FromUserName']))) {\n                    return \"解除绑定完成！\";\n                } else {\n                    return \"操作失败，未知错误\";\n                }\n                break;\n            case \"帮助\":\n                return '帮助中心暂未构建完成~~~';\n                break;\n            default:\n                if (isset($openid)) {\n                    switch ($message['Content']) {\n                       \n                        default:\n                            switch ($message['Content']) {\n                     case $wechat_circleSendText:\n                              $ifCircle = $db->fetchRow($db->select()->from('table.contents')->where('cid = ?', $bsoptions['wechat_choose'])->where('template = ?', 'friendcircle.php'));\n                              if(!$ifCircle){\n                                  return '当前所选择的页面非朋友圈模板，请前往 [Bearsimple主题配置中心 - 实验室 - 微信公众号服务] 重新选择';\n                              }\n                              else{\n                                    $msg_type = 'mixed_circle';\n                                    $db->query(\"update `{$prefix}bscore_wechat_data` set msg_type='$msg_type',content='' where openid='$openid'\");\n                                    return \"当前处于朋友圈模式，可混合发送图片、文字、语音或视频(图片、语音和视频仅限发送其中一项)，发送『发表』进行发表朋友圈，发送『取消』取消本次发送~\";\n                              }\n                                    break;\n                    case \"取消\":\n                        $db->query(\"update `{$prefix}bscore_wechat_data` set msg_type='',content='' where openid='$openid'\");\n                        return '操作已取消';\n                                   break;\n                    case \"发表\":\n                                    $arr = $db->fetchRow($db->query(\"SELECT * FROM `{$prefix}bscore_wechat_data` WHERE openid='{$openid}'\"));\n                                    $str = $arr['content'];\n                                    if ($str == null) {\n                                        $db->query(\"update `{$prefix}bscore_wechat_data` set msg_type='',content='' where openid='$openid'\");\n                                        return \"发表内容为空，取消操作\";//这里因为微信服务器逻辑，超过5s会重试\n                                        exit();\n                                    }\n                                    $msg_type = $arr['msg_type'];\n                                    $arr = mb_split('@', $str);\n                                    $m = count($arr);\n                                    for ($i = 0; $i < $m - 1; $i++) {\n                                        $con[$i] = mb_split('->', $arr[$i]);\n                                    }\n                                    $m1 = count($con);\n                                    for ($m = 0; $m < $m1; $m++) {\n                                        $result[$m] = array('type' => $con[$m][0], 'content' => $con[$m][1]);\n                                    }\n                                    $content = array('results' => $result);\n                                     $status = push(json_encode($content), $msg_type, $url, $postEncryptToken, $bsoptions['wechat_choose'], 'sendCircle',$message['MsgId'],$openid);\n                                    $db->query(\"update `{$prefix}bscore_wechat_data` set msg_type='',content='' where openid='$openid'\");\n                                    switch ($status) {\n                                        case \"1\":\n                                            return \"朋友圈发表成功~\";\n                                           break;\n                                                case \"-1\":\n                                                    return \"参数错误，请稍后重试！\";\n                                                    break;\n                                                case \"-2\":\n                                                    return \"系统核验身份信息错误，请稍后重试！\";\n                                                    break;\n                                                case \"-3\":\n                                                    return \"必要性数据缺失，请检查是否已填写好配置信息或可以发送“解绑”并发送“绑定”后再试！\";\n                                                    break;\n                                                default:\n                                                    return $status;\n                                    }\n                                    break;\n                                default:\n                                    $arr = $db->fetchRow($db->query(\"SELECT * FROM `{$prefix}bscore_wechat_data` WHERE openid='{$openid}'\"));\n                                    $buffer = $arr['content'];\n                                    $type = $arr['msg_type'];\n                                    switch ($message['MsgType']) {\n                                        case \"image\":\n                                    if(queryFileExist('voice',$buffer) == true){\n                                        return '检测到本次发送内容中已包含音频文件，无法继续发送图片~';\n                                    }\n                                    if(queryFileExist('video',$buffer) == true){\n                                        return '检测到本次发送内容中已包含视频文件，无法继续发送图片~';\n                                    }\n                                            $content = $message['PicUrl'];\n                                            $msg_type = \"image\";\n                                            if ($type == 'mixed_circle') {\n                                                $content = $buffer . $msg_type . \"->\" . $content . \"@\";\n                                            }\n                                            if($buffer){\n                                        $pattern = '/(image->.*?@)/';\npreg_match_all($pattern, $buffer, $matches);\n$count = count($matches[1]);\nif($count == 9){\n    return '图片数量已达最大数量九张~~';\n}\nelse{\n                                            $db->query(\"update `{$prefix}bscore_wechat_data` set content='$content' where openid='$openid'\");\n}\n                                            }\n                                            else{\n                                            $db->query(\"update `{$prefix}bscore_wechat_data` set content='$content' where openid='$openid'\");    \n                                            }\n                                            break;\n                                        case \"text\":\n                                                $content = $message['Content'];\n                                                if($content == '[收到不支持的消息类型，暂无法显示]'){\n                                                    return '检测到您发送的是当前不支持的表情包，请重新发送';\n                                                }\n                                            $msg_type = \"text\";\n                                          if ($type == 'mixed_circle') {\n                                                $content = $buffer . $msg_type . \"->\" . $content . \"@\";\n                                            }\n                                            $db->query(\"update `{$prefix}bscore_wechat_data` set content='$content' where openid='$openid'\");\n                                            break;\n                                            \n                                        case \"voice\":\n                                            if(!in_array($message['Format'], $options->allowedAttachmentTypes)){\n                                            return '检测到您未将'.$message['Format'].'格式添加到允许上传的文件类型中，请前往Typecho后台-设置-基本设置中添加！';    \n                                            }\n                                            if(queryFileExist('image',$buffer) == true){\n                                        return '检测到本次发送内容中已包含图片文件，无法继续发送语音~';\n                                    }\n                                    if(queryFileExist('video',$buffer) == true){\n                                        return '检测到本次发送内容中已包含视频文件，无法继续发送语音~';\n                                    }\n                                            $content = $message['MediaId'].'!'.$message['Format'];\n                                            $msg_type = \"voice\";\n                                            if ($type == 'mixed_circle') {\n                                                $content = $buffer . $msg_type . \"->\" . $content . \"@\";\n                                            }\n                                            if($buffer){\n                                        $pattern = '/(voice->.*?@)/';\npreg_match_all($pattern, $buffer, $matches);\n$count = count($matches[1]);\nif($count == 1){\n    return '当前仅能发送一条语音哦~';\n}\nelse{\n                                            $db->query(\"update `{$prefix}bscore_wechat_data` set content='$content' where openid='$openid'\");\n}\n                                            }\n                                            else{\n                                            $db->query(\"update `{$prefix}bscore_wechat_data` set content='$content' where openid='$openid'\");    \n                                            }\n                                            break;\n                                            case \"video\":\n                                                if(!in_array('mp4', $options->allowedAttachmentTypes)){\n                                            return '检测到您未将mp4格式添加到允许上传的文件类型中，请前往Typecho后台-设置-基本设置中添加！';    \n                                            }\n                                            if(queryFileExist('image',$buffer) == true){\n                                        return '检测到本次发送内容中已包含图片文件，无法继续发送视频~';\n                                    }\n                                    if(queryFileExist('voice',$buffer) == true){\n                                        return '检测到本次发送内容中已包含音频文件，无法继续发送视频~';\n                                    }\n                                            $content = $message['MediaId'].'!'.'mp4';\n                                            $msg_type = \"video\";\n                                            if ($type == 'mixed_circle') {\n                                                $content = $buffer . $msg_type . \"->\" . $content . \"@\";\n                                            }\n                                            if($buffer){\n                                        $pattern = '/(video->.*?@)/';\npreg_match_all($pattern, $buffer, $matches);\n$count = count($matches[1]);\nif($count == 1){\n    return '当前仅能发送一条视频哦~';\n}\nelse{\n                                            $db->query(\"update `{$prefix}bscore_wechat_data` set content='$content' where openid='$openid'\");\n}\n                                            }\n                                            else{\n                                            $db->query(\"update `{$prefix}bscore_wechat_data` set content='$content' where openid='$openid'\");    \n                                            }\n                                            break;\n                                        default:\n                                            return \"不支持的消息类型\";\n                                            exit();\n                                    }\n                                    $arr = $db->fetchRow($db->query(\"SELECT * FROM `{$prefix}bscore_wechat_data` WHERE openid='{$openid}'\"));\n                                    $content = $arr['content'];\n                                    $type = $arr['msg_type'];\n                                    switch ($type) {\n                                       case 'mixed_circle':\n                                            return \"请继续，发送『发表』进行发表朋友圈，发送『取消』取消本次发送~\";\n                                            break;\n                                        default:\n                                            $status = push($content, $msg_type, $url, $postEncryptToken, $bsoptions['wechat_choose'],'saysTalk',$message['MsgId'],$openid);\n                                            $db->query(\"update `{$prefix}bscore_wechat_data` set msg_type='',content='' where openid='$openid'\");\n                                            switch ($status) {\n                                                case \"1\":\n                                                    return \"信息发送成功~~~\";\n                                                    break;\n                                                case \"-1\":\n                                                    return \"参数错误，请稍后重试！\";\n                                                    break;\n                                                case \"-2\":\n                                                    return \"系统核验身份信息错误，请稍后重试！\";\n                                                    break;\n                                                case \"-3\":\n                                                    return \"必要性数据缺失，请检查是否已填写好配置信息！\";\n                                                    break;\n                                                default:\n                                                    return $status;\n                                            }\n                                    }\n                            }\n                    }\n                } else {\n                    return \"操作错误\";\n                }\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/autoload.php",
    "content": "<?php\n\n// autoload.php @generated by Composer\n\nrequire_once __DIR__ . '/composer/autoload_real.php';\n\nreturn ComposerAutoloaderInite9f49d6beda0e3b2b3dc20ba58458a65::getLoader();\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/ClassLoader.php",
    "content": "<?php\n\n/*\n * This file is part of Composer.\n *\n * (c) Nils Adermann <naderman@naderman.de>\n *     Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Composer\\Autoload;\n\n/**\n * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.\n *\n *     $loader = new \\Composer\\Autoload\\ClassLoader();\n *\n *     // register classes with namespaces\n *     $loader->add('Symfony\\Component', __DIR__.'/component');\n *     $loader->add('Symfony',           __DIR__.'/framework');\n *\n *     // activate the autoloader\n *     $loader->register();\n *\n *     // to enable searching the include path (eg. for PEAR packages)\n *     $loader->setUseIncludePath(true);\n *\n * In this example, if you try to use a class in the Symfony\\Component\n * namespace or one of its children (Symfony\\Component\\Console for instance),\n * the autoloader will first look for the class under the component/\n * directory, and it will then fallback to the framework/ directory if not\n * found before giving up.\n *\n * This class is loosely based on the Symfony UniversalClassLoader.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @see    https://www.php-fig.org/psr/psr-0/\n * @see    https://www.php-fig.org/psr/psr-4/\n */\nclass ClassLoader\n{\n    private $vendorDir;\n\n    // PSR-4\n    private $prefixLengthsPsr4 = array();\n    private $prefixDirsPsr4 = array();\n    private $fallbackDirsPsr4 = array();\n\n    // PSR-0\n    private $prefixesPsr0 = array();\n    private $fallbackDirsPsr0 = array();\n\n    private $useIncludePath = false;\n    private $classMap = array();\n    private $classMapAuthoritative = false;\n    private $missingClasses = array();\n    private $apcuPrefix;\n\n    private static $registeredLoaders = array();\n\n    public function __construct($vendorDir = null)\n    {\n        $this->vendorDir = $vendorDir;\n    }\n\n    public function getPrefixes()\n    {\n        if (!empty($this->prefixesPsr0)) {\n            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));\n        }\n\n        return array();\n    }\n\n    public function getPrefixesPsr4()\n    {\n        return $this->prefixDirsPsr4;\n    }\n\n    public function getFallbackDirs()\n    {\n        return $this->fallbackDirsPsr0;\n    }\n\n    public function getFallbackDirsPsr4()\n    {\n        return $this->fallbackDirsPsr4;\n    }\n\n    public function getClassMap()\n    {\n        return $this->classMap;\n    }\n\n    /**\n     * @param array $classMap Class to filename map\n     */\n    public function addClassMap(array $classMap)\n    {\n        if ($this->classMap) {\n            $this->classMap = array_merge($this->classMap, $classMap);\n        } else {\n            $this->classMap = $classMap;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix, either\n     * appending or prepending to the ones previously set for this prefix.\n     *\n     * @param string       $prefix  The prefix\n     * @param array|string $paths   The PSR-0 root directories\n     * @param bool         $prepend Whether to prepend the directories\n     */\n    public function add($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            if ($prepend) {\n                $this->fallbackDirsPsr0 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr0\n                );\n            } else {\n                $this->fallbackDirsPsr0 = array_merge(\n                    $this->fallbackDirsPsr0,\n                    (array) $paths\n                );\n            }\n\n            return;\n        }\n\n        $first = $prefix[0];\n        if (!isset($this->prefixesPsr0[$first][$prefix])) {\n            $this->prefixesPsr0[$first][$prefix] = (array) $paths;\n\n            return;\n        }\n        if ($prepend) {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixesPsr0[$first][$prefix]\n            );\n        } else {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                $this->prefixesPsr0[$first][$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace, either\n     * appending or prepending to the ones previously set for this namespace.\n     *\n     * @param string       $prefix  The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths   The PSR-4 base directories\n     * @param bool         $prepend Whether to prepend the directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function addPsr4($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            // Register directories for the root namespace.\n            if ($prepend) {\n                $this->fallbackDirsPsr4 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr4\n                );\n            } else {\n                $this->fallbackDirsPsr4 = array_merge(\n                    $this->fallbackDirsPsr4,\n                    (array) $paths\n                );\n            }\n        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {\n            // Register directories for a new namespace.\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        } elseif ($prepend) {\n            // Prepend directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixDirsPsr4[$prefix]\n            );\n        } else {\n            // Append directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                $this->prefixDirsPsr4[$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix,\n     * replacing any others previously set for this prefix.\n     *\n     * @param string       $prefix The prefix\n     * @param array|string $paths  The PSR-0 base directories\n     */\n    public function set($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr0 = (array) $paths;\n        } else {\n            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace,\n     * replacing any others previously set for this namespace.\n     *\n     * @param string       $prefix The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths  The PSR-4 base directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function setPsr4($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr4 = (array) $paths;\n        } else {\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Turns on searching the include path for class files.\n     *\n     * @param bool $useIncludePath\n     */\n    public function setUseIncludePath($useIncludePath)\n    {\n        $this->useIncludePath = $useIncludePath;\n    }\n\n    /**\n     * Can be used to check if the autoloader uses the include path to check\n     * for classes.\n     *\n     * @return bool\n     */\n    public function getUseIncludePath()\n    {\n        return $this->useIncludePath;\n    }\n\n    /**\n     * Turns off searching the prefix and fallback directories for classes\n     * that have not been registered with the class map.\n     *\n     * @param bool $classMapAuthoritative\n     */\n    public function setClassMapAuthoritative($classMapAuthoritative)\n    {\n        $this->classMapAuthoritative = $classMapAuthoritative;\n    }\n\n    /**\n     * Should class lookup fail if not found in the current class map?\n     *\n     * @return bool\n     */\n    public function isClassMapAuthoritative()\n    {\n        return $this->classMapAuthoritative;\n    }\n\n    /**\n     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.\n     *\n     * @param string|null $apcuPrefix\n     */\n    public function setApcuPrefix($apcuPrefix)\n    {\n        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;\n    }\n\n    /**\n     * The APCu prefix in use, or null if APCu caching is not enabled.\n     *\n     * @return string|null\n     */\n    public function getApcuPrefix()\n    {\n        return $this->apcuPrefix;\n    }\n\n    /**\n     * Registers this instance as an autoloader.\n     *\n     * @param bool $prepend Whether to prepend the autoloader or not\n     */\n    public function register($prepend = false)\n    {\n        spl_autoload_register(array($this, 'loadClass'), true, $prepend);\n\n        if (null === $this->vendorDir) {\n            return;\n        }\n\n        if ($prepend) {\n            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;\n        } else {\n            unset(self::$registeredLoaders[$this->vendorDir]);\n            self::$registeredLoaders[$this->vendorDir] = $this;\n        }\n    }\n\n    /**\n     * Unregisters this instance as an autoloader.\n     */\n    public function unregister()\n    {\n        spl_autoload_unregister(array($this, 'loadClass'));\n\n        if (null !== $this->vendorDir) {\n            unset(self::$registeredLoaders[$this->vendorDir]);\n        }\n    }\n\n    /**\n     * Loads the given class or interface.\n     *\n     * @param  string    $class The name of the class\n     * @return bool|null True if loaded, null otherwise\n     */\n    public function loadClass($class)\n    {\n        if ($file = $this->findFile($class)) {\n            includeFile($file);\n\n            return true;\n        }\n    }\n\n    /**\n     * Finds the path to the file where the class is defined.\n     *\n     * @param string $class The name of the class\n     *\n     * @return string|false The path if found, false otherwise\n     */\n    public function findFile($class)\n    {\n        // class map lookup\n        if (isset($this->classMap[$class])) {\n            return $this->classMap[$class];\n        }\n        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {\n            return false;\n        }\n        if (null !== $this->apcuPrefix) {\n            $file = apcu_fetch($this->apcuPrefix.$class, $hit);\n            if ($hit) {\n                return $file;\n            }\n        }\n\n        $file = $this->findFileWithExtension($class, '.php');\n\n        // Search for Hack files if we are running on HHVM\n        if (false === $file && defined('HHVM_VERSION')) {\n            $file = $this->findFileWithExtension($class, '.hh');\n        }\n\n        if (null !== $this->apcuPrefix) {\n            apcu_add($this->apcuPrefix.$class, $file);\n        }\n\n        if (false === $file) {\n            // Remember that this class does not exist.\n            $this->missingClasses[$class] = true;\n        }\n\n        return $file;\n    }\n\n    /**\n     * Returns the currently registered loaders indexed by their corresponding vendor directories.\n     *\n     * @return self[]\n     */\n    public static function getRegisteredLoaders()\n    {\n        return self::$registeredLoaders;\n    }\n\n    private function findFileWithExtension($class, $ext)\n    {\n        // PSR-4 lookup\n        $logicalPathPsr4 = strtr($class, '\\\\', DIRECTORY_SEPARATOR) . $ext;\n\n        $first = $class[0];\n        if (isset($this->prefixLengthsPsr4[$first])) {\n            $subPath = $class;\n            while (false !== $lastPos = strrpos($subPath, '\\\\')) {\n                $subPath = substr($subPath, 0, $lastPos);\n                $search = $subPath . '\\\\';\n                if (isset($this->prefixDirsPsr4[$search])) {\n                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);\n                    foreach ($this->prefixDirsPsr4[$search] as $dir) {\n                        if (file_exists($file = $dir . $pathEnd)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-4 fallback dirs\n        foreach ($this->fallbackDirsPsr4 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 lookup\n        if (false !== $pos = strrpos($class, '\\\\')) {\n            // namespaced class name\n            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)\n                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);\n        } else {\n            // PEAR-like class name\n            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;\n        }\n\n        if (isset($this->prefixesPsr0[$first])) {\n            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {\n                if (0 === strpos($class, $prefix)) {\n                    foreach ($dirs as $dir) {\n                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-0 fallback dirs\n        foreach ($this->fallbackDirsPsr0 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 include paths.\n        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {\n            return $file;\n        }\n\n        return false;\n    }\n}\n\n/**\n * Scope isolated include.\n *\n * Prevents access to $this/self from included files.\n */\nfunction includeFile($file)\n{\n    include $file;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/InstalledVersions.php",
    "content": "<?php\n\n\n\n\n\n\n\n\n\n\n\nnamespace Composer;\n\nuse Composer\\Autoload\\ClassLoader;\nuse Composer\\Semver\\VersionParser;\n\n\n\n\n\n\n\n\nclass InstalledVersions\n{\nprivate static $installed = array (\n  'root' => \n  array (\n    'pretty_version' => '1.0.0+no-version-set',\n    'version' => '1.0.0.0',\n    'aliases' => \n    array (\n    ),\n    'reference' => NULL,\n    'name' => '__root__',\n  ),\n  'versions' => \n  array (\n    '__root__' => \n    array (\n      'pretty_version' => '1.0.0+no-version-set',\n      'version' => '1.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => NULL,\n    ),\n    'easywechat-composer/easywechat-composer' => \n    array (\n      'pretty_version' => '1.4.1',\n      'version' => '1.4.1.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd',\n    ),\n    'guzzlehttp/guzzle' => \n    array (\n      'pretty_version' => '7.8.1',\n      'version' => '7.8.1.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '41042bc7ab002487b876a0683fc8dce04ddce104',\n    ),\n    'guzzlehttp/promises' => \n    array (\n      'pretty_version' => '2.0.2',\n      'version' => '2.0.2.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'bbff78d96034045e58e13dedd6ad91b5d1253223',\n    ),\n    'guzzlehttp/psr7' => \n    array (\n      'pretty_version' => '2.6.2',\n      'version' => '2.6.2.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '45b30f99ac27b5ca93cb4831afe16285f57b8221',\n    ),\n    'monolog/monolog' => \n    array (\n      'pretty_version' => '3.6.0',\n      'version' => '3.6.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '4b18b21a5527a3d5ffdac2fd35d3ab25a9597654',\n    ),\n    'overtrue/socialite' => \n    array (\n      'pretty_version' => '4.10.1',\n      'version' => '4.10.1.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '457b48f31414dc00d3fb445d6ab9355595067afe',\n    ),\n    'pimple/pimple' => \n    array (\n      'pretty_version' => 'v3.5.0',\n      'version' => '3.5.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'a94b3a4db7fb774b3d78dad2315ddc07629e1bed',\n    ),\n    'psr/cache' => \n    array (\n      'pretty_version' => '3.0.0',\n      'version' => '3.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf',\n    ),\n    'psr/cache-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '2.0|3.0',\n      ),\n    ),\n    'psr/container' => \n    array (\n      'pretty_version' => '2.0.2',\n      'version' => '2.0.2.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'c71ecc56dfe541dbd90c5360474fbc405f8d5963',\n    ),\n    'psr/event-dispatcher' => \n    array (\n      'pretty_version' => '1.0.0',\n      'version' => '1.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0',\n    ),\n    'psr/event-dispatcher-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.0',\n      ),\n    ),\n    'psr/http-client' => \n    array (\n      'pretty_version' => '1.0.3',\n      'version' => '1.0.3.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90',\n    ),\n    'psr/http-client-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.0',\n      ),\n    ),\n    'psr/http-factory' => \n    array (\n      'pretty_version' => '1.1.0',\n      'version' => '1.1.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a',\n    ),\n    'psr/http-factory-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.0',\n      ),\n    ),\n    'psr/http-message' => \n    array (\n      'pretty_version' => '2.0',\n      'version' => '2.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71',\n    ),\n    'psr/http-message-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.0',\n      ),\n    ),\n    'psr/log' => \n    array (\n      'pretty_version' => '3.0.0',\n      'version' => '3.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'fe5ea303b0887d5caefd3d431c3e61ad47037001',\n    ),\n    'psr/log-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '3.0.0',\n      ),\n    ),\n    'psr/simple-cache' => \n    array (\n      'pretty_version' => '3.0.0',\n      'version' => '3.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '764e0b3939f5ca87cb904f570ef9be2d78a07865',\n    ),\n    'psr/simple-cache-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.0|2.0|3.0',\n      ),\n    ),\n    'ralouphie/getallheaders' => \n    array (\n      'pretty_version' => '3.0.3',\n      'version' => '3.0.3.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '120b605dfeb996808c31b6477290a714d356e822',\n    ),\n    'symfony/cache' => \n    array (\n      'pretty_version' => 'v6.4.7',\n      'version' => '6.4.7.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'b9e9b93c9817ec6c789c7943f5e54b57a041c16a',\n    ),\n    'symfony/cache-contracts' => \n    array (\n      'pretty_version' => 'v3.5.0',\n      'version' => '3.5.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'df6a1a44c890faded49a5fca33c2d5c5fd3c2197',\n    ),\n    'symfony/cache-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.1|2.0|3.0',\n      ),\n    ),\n    'symfony/deprecation-contracts' => \n    array (\n      'pretty_version' => 'v3.5.0',\n      'version' => '3.5.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1',\n    ),\n    'symfony/event-dispatcher' => \n    array (\n      'pretty_version' => 'v6.4.7',\n      'version' => '6.4.7.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'd84384f3f67de3cb650db64d685d70395dacfc3f',\n    ),\n    'symfony/event-dispatcher-contracts' => \n    array (\n      'pretty_version' => 'v3.5.0',\n      'version' => '3.5.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '8f93aec25d41b72493c6ddff14e916177c9efc50',\n    ),\n    'symfony/event-dispatcher-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '2.0|3.0',\n      ),\n    ),\n    'symfony/http-foundation' => \n    array (\n      'pretty_version' => 'v6.4.7',\n      'version' => '6.4.7.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'b4db6b833035477cb70e18d0ae33cb7c2b521759',\n    ),\n    'symfony/polyfill-mbstring' => \n    array (\n      'pretty_version' => 'v1.29.0',\n      'version' => '1.29.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '9773676c8a1bb1f8d4340a62efe641cf76eda7ec',\n    ),\n    'symfony/polyfill-php80' => \n    array (\n      'pretty_version' => 'v1.29.0',\n      'version' => '1.29.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '87b68208d5c1188808dd7839ee1e6c8ec3b02f1b',\n    ),\n    'symfony/polyfill-php83' => \n    array (\n      'pretty_version' => 'v1.29.0',\n      'version' => '1.29.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '86fcae159633351e5fd145d1c47de6c528f8caff',\n    ),\n    'symfony/psr-http-message-bridge' => \n    array (\n      'pretty_version' => 'v2.3.1',\n      'version' => '2.3.1.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '581ca6067eb62640de5ff08ee1ba6850a0ee472e',\n    ),\n    'symfony/service-contracts' => \n    array (\n      'pretty_version' => 'v3.5.0',\n      'version' => '3.5.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'bd1d9e59a81d8fa4acdcea3f617c581f7475a80f',\n    ),\n    'symfony/var-exporter' => \n    array (\n      'pretty_version' => 'v7.0.7',\n      'version' => '7.0.7.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'cdecc0022e40e90340ba1a59a3d5ccf069777078',\n    ),\n    'w7corp/easywechat' => \n    array (\n      'pretty_version' => '5.34.1',\n      'version' => '5.34.1.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '1c31e8208aa9961b80e2d9f3761dd46337fd017b',\n    ),\n  ),\n);\nprivate static $canGetVendors;\nprivate static $installedByVendor = array();\n\n\n\n\n\n\n\npublic static function getInstalledPackages()\n{\n$packages = array();\nforeach (self::getInstalled() as $installed) {\n$packages[] = array_keys($installed['versions']);\n}\n\nif (1 === \\count($packages)) {\nreturn $packages[0];\n}\n\nreturn array_keys(array_flip(\\call_user_func_array('array_merge', $packages)));\n}\n\n\n\n\n\n\n\n\n\npublic static function isInstalled($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (isset($installed['versions'][$packageName])) {\nreturn true;\n}\n}\n\nreturn false;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\npublic static function satisfies(VersionParser $parser, $packageName, $constraint)\n{\n$constraint = $parser->parseConstraints($constraint);\n$provided = $parser->parseConstraints(self::getVersionRanges($packageName));\n\nreturn $provided->matches($constraint);\n}\n\n\n\n\n\n\n\n\n\n\npublic static function getVersionRanges($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\n$ranges = array();\nif (isset($installed['versions'][$packageName]['pretty_version'])) {\n$ranges[] = $installed['versions'][$packageName]['pretty_version'];\n}\nif (array_key_exists('aliases', $installed['versions'][$packageName])) {\n$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);\n}\nif (array_key_exists('replaced', $installed['versions'][$packageName])) {\n$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);\n}\nif (array_key_exists('provided', $installed['versions'][$packageName])) {\n$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);\n}\n\nreturn implode(' || ', $ranges);\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getVersion($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\nif (!isset($installed['versions'][$packageName]['version'])) {\nreturn null;\n}\n\nreturn $installed['versions'][$packageName]['version'];\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getPrettyVersion($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\nif (!isset($installed['versions'][$packageName]['pretty_version'])) {\nreturn null;\n}\n\nreturn $installed['versions'][$packageName]['pretty_version'];\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getReference($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\nif (!isset($installed['versions'][$packageName]['reference'])) {\nreturn null;\n}\n\nreturn $installed['versions'][$packageName]['reference'];\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getRootPackage()\n{\n$installed = self::getInstalled();\n\nreturn $installed[0]['root'];\n}\n\n\n\n\n\n\n\n\npublic static function getRawData()\n{\n@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);\n\nreturn self::$installed;\n}\n\n\n\n\n\n\n\npublic static function getAllRawData()\n{\nreturn self::getInstalled();\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\npublic static function reload($data)\n{\nself::$installed = $data;\nself::$installedByVendor = array();\n}\n\n\n\n\n\nprivate static function getInstalled()\n{\nif (null === self::$canGetVendors) {\nself::$canGetVendors = method_exists('Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders');\n}\n\n$installed = array();\n\nif (self::$canGetVendors) {\nforeach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {\nif (isset(self::$installedByVendor[$vendorDir])) {\n$installed[] = self::$installedByVendor[$vendorDir];\n} elseif (is_file($vendorDir.'/composer/installed.php')) {\n$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';\n}\n}\n}\n\n$installed[] = self::$installed;\n\nreturn $installed;\n}\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/LICENSE",
    "content": "\nCopyright (c) Nils Adermann, Jordi Boggiano\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/autoload_classmap.php",
    "content": "<?php\n\n// autoload_classmap.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',\n    'Composer\\\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',\n    'DateError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateError.php',\n    'DateException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateException.php',\n    'DateInvalidOperationException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php',\n    'DateInvalidTimeZoneException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php',\n    'DateMalformedIntervalStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php',\n    'DateMalformedPeriodStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php',\n    'DateMalformedStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php',\n    'DateObjectError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateObjectError.php',\n    'DateRangeError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php',\n    'Override' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/Override.php',\n    'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',\n    'SQLite3Exception' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php',\n    'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',\n    'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',\n    'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',\n    '' => $vendorDir . '/symfony/cache/Traits/ValueWrapper.php',\n);\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/autoload_files.php",
    "content": "<?php\n\n// autoload_files.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',\n    'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',\n    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',\n    '662a729f963d39afe703c9d9b7ab4a8c' => $vendorDir . '/symfony/polyfill-php83/bootstrap.php',\n    '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',\n    '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',\n    'c5521cebe610a9bf42c44b3a5163adfd' => $vendorDir . '/overtrue/socialite/src/Contracts/FactoryInterface.php',\n    'ccd11c8e7dd9b33638b248681bdfba27' => $vendorDir . '/overtrue/socialite/src/Contracts/UserInterface.php',\n    '5649552725dea6ec47381627600e3ac1' => $vendorDir . '/overtrue/socialite/src/Contracts/ProviderInterface.php',\n    '313a9b01f294d730dfc8ff43b9e56416' => $vendorDir . '/w7corp/easywechat/src/Kernel/Support/Helpers.php',\n    '8cfe2b61cc956a1edbaf214308e8c9a1' => $vendorDir . '/w7corp/easywechat/src/Kernel/Helpers.php',\n);\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/autoload_namespaces.php",
    "content": "<?php\n\n// autoload_namespaces.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'Pimple' => array($vendorDir . '/pimple/pimple/src'),\n);\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/autoload_psr4.php",
    "content": "<?php\n\n// autoload_psr4.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'Symfony\\\\Polyfill\\\\Php83\\\\' => array($vendorDir . '/symfony/polyfill-php83'),\n    'Symfony\\\\Polyfill\\\\Php80\\\\' => array($vendorDir . '/symfony/polyfill-php80'),\n    'Symfony\\\\Polyfill\\\\Mbstring\\\\' => array($vendorDir . '/symfony/polyfill-mbstring'),\n    'Symfony\\\\Contracts\\\\Service\\\\' => array($vendorDir . '/symfony/service-contracts'),\n    'Symfony\\\\Contracts\\\\EventDispatcher\\\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'),\n    'Symfony\\\\Contracts\\\\Cache\\\\' => array($vendorDir . '/symfony/cache-contracts'),\n    'Symfony\\\\Component\\\\VarExporter\\\\' => array($vendorDir . '/symfony/var-exporter'),\n    'Symfony\\\\Component\\\\HttpFoundation\\\\' => array($vendorDir . '/symfony/http-foundation'),\n    'Symfony\\\\Component\\\\EventDispatcher\\\\' => array($vendorDir . '/symfony/event-dispatcher'),\n    'Symfony\\\\Component\\\\Cache\\\\' => array($vendorDir . '/symfony/cache'),\n    'Symfony\\\\Bridge\\\\PsrHttpMessage\\\\' => array($vendorDir . '/symfony/psr-http-message-bridge'),\n    'Psr\\\\SimpleCache\\\\' => array($vendorDir . '/psr/simple-cache/src'),\n    'Psr\\\\Log\\\\' => array($vendorDir . '/psr/log/src'),\n    'Psr\\\\Http\\\\Message\\\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'),\n    'Psr\\\\Http\\\\Client\\\\' => array($vendorDir . '/psr/http-client/src'),\n    'Psr\\\\EventDispatcher\\\\' => array($vendorDir . '/psr/event-dispatcher/src'),\n    'Psr\\\\Container\\\\' => array($vendorDir . '/psr/container/src'),\n    'Psr\\\\Cache\\\\' => array($vendorDir . '/psr/cache/src'),\n    'Overtrue\\\\Socialite\\\\' => array($vendorDir . '/overtrue/socialite/src'),\n    'Monolog\\\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),\n    'GuzzleHttp\\\\Psr7\\\\' => array($vendorDir . '/guzzlehttp/psr7/src'),\n    'GuzzleHttp\\\\Promise\\\\' => array($vendorDir . '/guzzlehttp/promises/src'),\n    'GuzzleHttp\\\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),\n    'EasyWeChat\\\\' => array($vendorDir . '/w7corp/easywechat/src'),\n    'EasyWeChatComposer\\\\' => array($vendorDir . '/easywechat-composer/easywechat-composer/src'),\n);\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/autoload_real.php",
    "content": "<?php\n\n// autoload_real.php @generated by Composer\n\nclass ComposerAutoloaderInite9f49d6beda0e3b2b3dc20ba58458a65\n{\n    private static $loader;\n\n    public static function loadClassLoader($class)\n    {\n        if ('Composer\\Autoload\\ClassLoader' === $class) {\n            require __DIR__ . '/ClassLoader.php';\n        }\n    }\n\n    /**\n     * @return \\Composer\\Autoload\\ClassLoader\n     */\n    public static function getLoader()\n    {\n        if (null !== self::$loader) {\n            return self::$loader;\n        }\n\n        require __DIR__ . '/platform_check.php';\n\n        spl_autoload_register(array('ComposerAutoloaderInite9f49d6beda0e3b2b3dc20ba58458a65', 'loadClassLoader'), true, true);\n        self::$loader = $loader = new \\Composer\\Autoload\\ClassLoader(\\dirname(\\dirname(__FILE__)));\n        spl_autoload_unregister(array('ComposerAutoloaderInite9f49d6beda0e3b2b3dc20ba58458a65', 'loadClassLoader'));\n\n        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());\n        if ($useStaticLoader) {\n            require __DIR__ . '/autoload_static.php';\n\n            call_user_func(\\Composer\\Autoload\\ComposerStaticInite9f49d6beda0e3b2b3dc20ba58458a65::getInitializer($loader));\n        } else {\n            $map = require __DIR__ . '/autoload_namespaces.php';\n            foreach ($map as $namespace => $path) {\n                $loader->set($namespace, $path);\n            }\n\n            $map = require __DIR__ . '/autoload_psr4.php';\n            foreach ($map as $namespace => $path) {\n                $loader->setPsr4($namespace, $path);\n            }\n\n            $classMap = require __DIR__ . '/autoload_classmap.php';\n            if ($classMap) {\n                $loader->addClassMap($classMap);\n            }\n        }\n\n        $loader->register(true);\n\n        if ($useStaticLoader) {\n            $includeFiles = Composer\\Autoload\\ComposerStaticInite9f49d6beda0e3b2b3dc20ba58458a65::$files;\n        } else {\n            $includeFiles = require __DIR__ . '/autoload_files.php';\n        }\n        foreach ($includeFiles as $fileIdentifier => $file) {\n            composerRequiree9f49d6beda0e3b2b3dc20ba58458a65($fileIdentifier, $file);\n        }\n\n        return $loader;\n    }\n}\n\nfunction composerRequiree9f49d6beda0e3b2b3dc20ba58458a65($fileIdentifier, $file)\n{\n    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {\n        require $file;\n\n        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/autoload_static.php",
    "content": "<?php\n\n// autoload_static.php @generated by Composer\n\nnamespace Composer\\Autoload;\n\nclass ComposerStaticInite9f49d6beda0e3b2b3dc20ba58458a65\n{\n    public static $files = array (\n        '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',\n        'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',\n        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',\n        '662a729f963d39afe703c9d9b7ab4a8c' => __DIR__ . '/..' . '/symfony/polyfill-php83/bootstrap.php',\n        '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',\n        '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',\n        'c5521cebe610a9bf42c44b3a5163adfd' => __DIR__ . '/..' . '/overtrue/socialite/src/Contracts/FactoryInterface.php',\n        'ccd11c8e7dd9b33638b248681bdfba27' => __DIR__ . '/..' . '/overtrue/socialite/src/Contracts/UserInterface.php',\n        '5649552725dea6ec47381627600e3ac1' => __DIR__ . '/..' . '/overtrue/socialite/src/Contracts/ProviderInterface.php',\n        '313a9b01f294d730dfc8ff43b9e56416' => __DIR__ . '/..' . '/w7corp/easywechat/src/Kernel/Support/Helpers.php',\n        '8cfe2b61cc956a1edbaf214308e8c9a1' => __DIR__ . '/..' . '/w7corp/easywechat/src/Kernel/Helpers.php',\n    );\n\n    public static $prefixLengthsPsr4 = array (\n        'S' => \n        array (\n            'Symfony\\\\Polyfill\\\\Php83\\\\' => 23,\n            'Symfony\\\\Polyfill\\\\Php80\\\\' => 23,\n            'Symfony\\\\Polyfill\\\\Mbstring\\\\' => 26,\n            'Symfony\\\\Contracts\\\\Service\\\\' => 26,\n            'Symfony\\\\Contracts\\\\EventDispatcher\\\\' => 34,\n            'Symfony\\\\Contracts\\\\Cache\\\\' => 24,\n            'Symfony\\\\Component\\\\VarExporter\\\\' => 30,\n            'Symfony\\\\Component\\\\HttpFoundation\\\\' => 33,\n            'Symfony\\\\Component\\\\EventDispatcher\\\\' => 34,\n            'Symfony\\\\Component\\\\Cache\\\\' => 24,\n            'Symfony\\\\Bridge\\\\PsrHttpMessage\\\\' => 30,\n        ),\n        'P' => \n        array (\n            'Psr\\\\SimpleCache\\\\' => 16,\n            'Psr\\\\Log\\\\' => 8,\n            'Psr\\\\Http\\\\Message\\\\' => 17,\n            'Psr\\\\Http\\\\Client\\\\' => 16,\n            'Psr\\\\EventDispatcher\\\\' => 20,\n            'Psr\\\\Container\\\\' => 14,\n            'Psr\\\\Cache\\\\' => 10,\n        ),\n        'O' => \n        array (\n            'Overtrue\\\\Socialite\\\\' => 19,\n        ),\n        'M' => \n        array (\n            'Monolog\\\\' => 8,\n        ),\n        'G' => \n        array (\n            'GuzzleHttp\\\\Psr7\\\\' => 16,\n            'GuzzleHttp\\\\Promise\\\\' => 19,\n            'GuzzleHttp\\\\' => 11,\n        ),\n        'E' => \n        array (\n            'EasyWeChat\\\\' => 11,\n            'EasyWeChatComposer\\\\' => 19,\n        ),\n    );\n\n    public static $prefixDirsPsr4 = array (\n        'Symfony\\\\Polyfill\\\\Php83\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/polyfill-php83',\n        ),\n        'Symfony\\\\Polyfill\\\\Php80\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/polyfill-php80',\n        ),\n        'Symfony\\\\Polyfill\\\\Mbstring\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',\n        ),\n        'Symfony\\\\Contracts\\\\Service\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/service-contracts',\n        ),\n        'Symfony\\\\Contracts\\\\EventDispatcher\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts',\n        ),\n        'Symfony\\\\Contracts\\\\Cache\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/cache-contracts',\n        ),\n        'Symfony\\\\Component\\\\VarExporter\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/var-exporter',\n        ),\n        'Symfony\\\\Component\\\\HttpFoundation\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/http-foundation',\n        ),\n        'Symfony\\\\Component\\\\EventDispatcher\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/event-dispatcher',\n        ),\n        'Symfony\\\\Component\\\\Cache\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/cache',\n        ),\n        'Symfony\\\\Bridge\\\\PsrHttpMessage\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/psr-http-message-bridge',\n        ),\n        'Psr\\\\SimpleCache\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/simple-cache/src',\n        ),\n        'Psr\\\\Log\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/log/src',\n        ),\n        'Psr\\\\Http\\\\Message\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/http-message/src',\n            1 => __DIR__ . '/..' . '/psr/http-factory/src',\n        ),\n        'Psr\\\\Http\\\\Client\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/http-client/src',\n        ),\n        'Psr\\\\EventDispatcher\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/event-dispatcher/src',\n        ),\n        'Psr\\\\Container\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/container/src',\n        ),\n        'Psr\\\\Cache\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/cache/src',\n        ),\n        'Overtrue\\\\Socialite\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/overtrue/socialite/src',\n        ),\n        'Monolog\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog',\n        ),\n        'GuzzleHttp\\\\Psr7\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',\n        ),\n        'GuzzleHttp\\\\Promise\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/guzzlehttp/promises/src',\n        ),\n        'GuzzleHttp\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',\n        ),\n        'EasyWeChat\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/w7corp/easywechat/src',\n        ),\n        'EasyWeChatComposer\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/easywechat-composer/easywechat-composer/src',\n        ),\n    );\n\n    public static $prefixesPsr0 = array (\n        'P' => \n        array (\n            'Pimple' => \n            array (\n                0 => __DIR__ . '/..' . '/pimple/pimple/src',\n            ),\n        ),\n    );\n\n    public static $classMap = array (\n        'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',\n        'Composer\\\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',\n        'DateError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateError.php',\n        'DateException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateException.php',\n        'DateInvalidOperationException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php',\n        'DateInvalidTimeZoneException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php',\n        'DateMalformedIntervalStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php',\n        'DateMalformedPeriodStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php',\n        'DateMalformedStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php',\n        'DateObjectError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateObjectError.php',\n        'DateRangeError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php',\n        'Override' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/Override.php',\n        'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',\n        'SQLite3Exception' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php',\n        'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',\n        'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',\n        'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',\n        '' => __DIR__ . '/..' . '/symfony/cache/Traits/ValueWrapper.php',\n    );\n\n    public static function getInitializer(ClassLoader $loader)\n    {\n        return \\Closure::bind(function () use ($loader) {\n            $loader->prefixLengthsPsr4 = ComposerStaticInite9f49d6beda0e3b2b3dc20ba58458a65::$prefixLengthsPsr4;\n            $loader->prefixDirsPsr4 = ComposerStaticInite9f49d6beda0e3b2b3dc20ba58458a65::$prefixDirsPsr4;\n            $loader->prefixesPsr0 = ComposerStaticInite9f49d6beda0e3b2b3dc20ba58458a65::$prefixesPsr0;\n            $loader->classMap = ComposerStaticInite9f49d6beda0e3b2b3dc20ba58458a65::$classMap;\n\n        }, null, ClassLoader::class);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/installed.json",
    "content": "{\n    \"packages\": [\n        {\n            \"name\": \"easywechat-composer/easywechat-composer\",\n            \"version\": \"1.4.1\",\n            \"version_normalized\": \"1.4.1.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/mingyoung/easywechat-composer.git\",\n                \"reference\": \"3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/mingyoung/easywechat-composer/zipball/3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd\",\n                \"reference\": \"3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"composer-plugin-api\": \"^1.0 || ^2.0\",\n                \"php\": \">=7.0\"\n            },\n            \"require-dev\": {\n                \"composer/composer\": \"^1.0 || ^2.0\",\n                \"phpunit/phpunit\": \"^6.5 || ^7.0\"\n            },\n            \"time\": \"2021-07-05T04:03:22+00:00\",\n            \"type\": \"composer-plugin\",\n            \"extra\": {\n                \"class\": \"EasyWeChatComposer\\\\Plugin\"\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"EasyWeChatComposer\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"张铭阳\",\n                    \"email\": \"mingyoungcheung@gmail.com\"\n                }\n            ],\n            \"description\": \"The composer plugin for EasyWeChat\",\n            \"support\": {\n                \"issues\": \"https://github.com/mingyoung/easywechat-composer/issues\",\n                \"source\": \"https://github.com/mingyoung/easywechat-composer/tree/1.4.1\"\n            },\n            \"install-path\": \"../easywechat-composer/easywechat-composer\"\n        },\n        {\n            \"name\": \"guzzlehttp/guzzle\",\n            \"version\": \"7.8.1\",\n            \"version_normalized\": \"7.8.1.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/guzzle/guzzle.git\",\n                \"reference\": \"41042bc7ab002487b876a0683fc8dce04ddce104\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104\",\n                \"reference\": \"41042bc7ab002487b876a0683fc8dce04ddce104\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-json\": \"*\",\n                \"guzzlehttp/promises\": \"^1.5.3 || ^2.0.1\",\n                \"guzzlehttp/psr7\": \"^1.9.1 || ^2.5.1\",\n                \"php\": \"^7.2.5 || ^8.0\",\n                \"psr/http-client\": \"^1.0\",\n                \"symfony/deprecation-contracts\": \"^2.2 || ^3.0\"\n            },\n            \"provide\": {\n                \"psr/http-client-implementation\": \"1.0\"\n            },\n            \"require-dev\": {\n                \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n                \"ext-curl\": \"*\",\n                \"php-http/client-integration-tests\": \"dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999\",\n                \"php-http/message-factory\": \"^1.1\",\n                \"phpunit/phpunit\": \"^8.5.36 || ^9.6.15\",\n                \"psr/log\": \"^1.1 || ^2.0 || ^3.0\"\n            },\n            \"suggest\": {\n                \"ext-curl\": \"Required for CURL handler support\",\n                \"ext-intl\": \"Required for Internationalized Domain Name (IDN) support\",\n                \"psr/log\": \"Required for using the Log middleware\"\n            },\n            \"time\": \"2023-12-03T20:35:24+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"bamarni-bin\": {\n                    \"bin-links\": true,\n                    \"forward-command\": false\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"src/functions_include.php\"\n                ],\n                \"psr-4\": {\n                    \"GuzzleHttp\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Graham Campbell\",\n                    \"email\": \"hello@gjcampbell.co.uk\",\n                    \"homepage\": \"https://github.com/GrahamCampbell\"\n                },\n                {\n                    \"name\": \"Michael Dowling\",\n                    \"email\": \"mtdowling@gmail.com\",\n                    \"homepage\": \"https://github.com/mtdowling\"\n                },\n                {\n                    \"name\": \"Jeremy Lindblom\",\n                    \"email\": \"jeremeamia@gmail.com\",\n                    \"homepage\": \"https://github.com/jeremeamia\"\n                },\n                {\n                    \"name\": \"George Mponos\",\n                    \"email\": \"gmponos@gmail.com\",\n                    \"homepage\": \"https://github.com/gmponos\"\n                },\n                {\n                    \"name\": \"Tobias Nyholm\",\n                    \"email\": \"tobias.nyholm@gmail.com\",\n                    \"homepage\": \"https://github.com/Nyholm\"\n                },\n                {\n                    \"name\": \"Márk Sági-Kazár\",\n                    \"email\": \"mark.sagikazar@gmail.com\",\n                    \"homepage\": \"https://github.com/sagikazarmark\"\n                },\n                {\n                    \"name\": \"Tobias Schultze\",\n                    \"email\": \"webmaster@tubo-world.de\",\n                    \"homepage\": \"https://github.com/Tobion\"\n                }\n            ],\n            \"description\": \"Guzzle is a PHP HTTP client library\",\n            \"keywords\": [\n                \"client\",\n                \"curl\",\n                \"framework\",\n                \"http\",\n                \"http client\",\n                \"psr-18\",\n                \"psr-7\",\n                \"rest\",\n                \"web service\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/guzzle/guzzle/issues\",\n                \"source\": \"https://github.com/guzzle/guzzle/tree/7.8.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/GrahamCampbell\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/Nyholm\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../guzzlehttp/guzzle\"\n        },\n        {\n            \"name\": \"guzzlehttp/promises\",\n            \"version\": \"2.0.2\",\n            \"version_normalized\": \"2.0.2.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/guzzle/promises.git\",\n                \"reference\": \"bbff78d96034045e58e13dedd6ad91b5d1253223\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223\",\n                \"reference\": \"bbff78d96034045e58e13dedd6ad91b5d1253223\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2.5 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n                \"phpunit/phpunit\": \"^8.5.36 || ^9.6.15\"\n            },\n            \"time\": \"2023-12-03T20:19:20+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"bamarni-bin\": {\n                    \"bin-links\": true,\n                    \"forward-command\": false\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"GuzzleHttp\\\\Promise\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Graham Campbell\",\n                    \"email\": \"hello@gjcampbell.co.uk\",\n                    \"homepage\": \"https://github.com/GrahamCampbell\"\n                },\n                {\n                    \"name\": \"Michael Dowling\",\n                    \"email\": \"mtdowling@gmail.com\",\n                    \"homepage\": \"https://github.com/mtdowling\"\n                },\n                {\n                    \"name\": \"Tobias Nyholm\",\n                    \"email\": \"tobias.nyholm@gmail.com\",\n                    \"homepage\": \"https://github.com/Nyholm\"\n                },\n                {\n                    \"name\": \"Tobias Schultze\",\n                    \"email\": \"webmaster@tubo-world.de\",\n                    \"homepage\": \"https://github.com/Tobion\"\n                }\n            ],\n            \"description\": \"Guzzle promises library\",\n            \"keywords\": [\n                \"promise\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/guzzle/promises/issues\",\n                \"source\": \"https://github.com/guzzle/promises/tree/2.0.2\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/GrahamCampbell\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/Nyholm\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/promises\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../guzzlehttp/promises\"\n        },\n        {\n            \"name\": \"guzzlehttp/psr7\",\n            \"version\": \"2.6.2\",\n            \"version_normalized\": \"2.6.2.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/guzzle/psr7.git\",\n                \"reference\": \"45b30f99ac27b5ca93cb4831afe16285f57b8221\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221\",\n                \"reference\": \"45b30f99ac27b5ca93cb4831afe16285f57b8221\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2.5 || ^8.0\",\n                \"psr/http-factory\": \"^1.0\",\n                \"psr/http-message\": \"^1.1 || ^2.0\",\n                \"ralouphie/getallheaders\": \"^3.0\"\n            },\n            \"provide\": {\n                \"psr/http-factory-implementation\": \"1.0\",\n                \"psr/http-message-implementation\": \"1.0\"\n            },\n            \"require-dev\": {\n                \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n                \"http-interop/http-factory-tests\": \"^0.9\",\n                \"phpunit/phpunit\": \"^8.5.36 || ^9.6.15\"\n            },\n            \"suggest\": {\n                \"laminas/laminas-httphandlerrunner\": \"Emit PSR-7 responses\"\n            },\n            \"time\": \"2023-12-03T20:05:35+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"bamarni-bin\": {\n                    \"bin-links\": true,\n                    \"forward-command\": false\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"GuzzleHttp\\\\Psr7\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Graham Campbell\",\n                    \"email\": \"hello@gjcampbell.co.uk\",\n                    \"homepage\": \"https://github.com/GrahamCampbell\"\n                },\n                {\n                    \"name\": \"Michael Dowling\",\n                    \"email\": \"mtdowling@gmail.com\",\n                    \"homepage\": \"https://github.com/mtdowling\"\n                },\n                {\n                    \"name\": \"George Mponos\",\n                    \"email\": \"gmponos@gmail.com\",\n                    \"homepage\": \"https://github.com/gmponos\"\n                },\n                {\n                    \"name\": \"Tobias Nyholm\",\n                    \"email\": \"tobias.nyholm@gmail.com\",\n                    \"homepage\": \"https://github.com/Nyholm\"\n                },\n                {\n                    \"name\": \"Márk Sági-Kazár\",\n                    \"email\": \"mark.sagikazar@gmail.com\",\n                    \"homepage\": \"https://github.com/sagikazarmark\"\n                },\n                {\n                    \"name\": \"Tobias Schultze\",\n                    \"email\": \"webmaster@tubo-world.de\",\n                    \"homepage\": \"https://github.com/Tobion\"\n                },\n                {\n                    \"name\": \"Márk Sági-Kazár\",\n                    \"email\": \"mark.sagikazar@gmail.com\",\n                    \"homepage\": \"https://sagikazarmark.hu\"\n                }\n            ],\n            \"description\": \"PSR-7 message implementation that also provides common utility methods\",\n            \"keywords\": [\n                \"http\",\n                \"message\",\n                \"psr-7\",\n                \"request\",\n                \"response\",\n                \"stream\",\n                \"uri\",\n                \"url\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/guzzle/psr7/issues\",\n                \"source\": \"https://github.com/guzzle/psr7/tree/2.6.2\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/GrahamCampbell\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/Nyholm\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/psr7\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../guzzlehttp/psr7\"\n        },\n        {\n            \"name\": \"monolog/monolog\",\n            \"version\": \"3.6.0\",\n            \"version_normalized\": \"3.6.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/Seldaek/monolog.git\",\n                \"reference\": \"4b18b21a5527a3d5ffdac2fd35d3ab25a9597654\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654\",\n                \"reference\": \"4b18b21a5527a3d5ffdac2fd35d3ab25a9597654\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\",\n                \"psr/log\": \"^2.0 || ^3.0\"\n            },\n            \"provide\": {\n                \"psr/log-implementation\": \"3.0.0\"\n            },\n            \"require-dev\": {\n                \"aws/aws-sdk-php\": \"^3.0\",\n                \"doctrine/couchdb\": \"~1.0@dev\",\n                \"elasticsearch/elasticsearch\": \"^7 || ^8\",\n                \"ext-json\": \"*\",\n                \"graylog2/gelf-php\": \"^1.4.2 || ^2.0\",\n                \"guzzlehttp/guzzle\": \"^7.4.5\",\n                \"guzzlehttp/psr7\": \"^2.2\",\n                \"mongodb/mongodb\": \"^1.8\",\n                \"php-amqplib/php-amqplib\": \"~2.4 || ^3\",\n                \"phpstan/phpstan\": \"^1.9\",\n                \"phpstan/phpstan-deprecation-rules\": \"^1.0\",\n                \"phpstan/phpstan-strict-rules\": \"^1.4\",\n                \"phpunit/phpunit\": \"^10.5.17\",\n                \"predis/predis\": \"^1.1 || ^2\",\n                \"ruflin/elastica\": \"^7\",\n                \"symfony/mailer\": \"^5.4 || ^6\",\n                \"symfony/mime\": \"^5.4 || ^6\"\n            },\n            \"suggest\": {\n                \"aws/aws-sdk-php\": \"Allow sending log messages to AWS services like DynamoDB\",\n                \"doctrine/couchdb\": \"Allow sending log messages to a CouchDB server\",\n                \"elasticsearch/elasticsearch\": \"Allow sending log messages to an Elasticsearch server via official client\",\n                \"ext-amqp\": \"Allow sending log messages to an AMQP server (1.0+ required)\",\n                \"ext-curl\": \"Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler\",\n                \"ext-mbstring\": \"Allow to work properly with unicode symbols\",\n                \"ext-mongodb\": \"Allow sending log messages to a MongoDB server (via driver)\",\n                \"ext-openssl\": \"Required to send log messages using SSL\",\n                \"ext-sockets\": \"Allow sending log messages to a Syslog server (via UDP driver)\",\n                \"graylog2/gelf-php\": \"Allow sending log messages to a GrayLog2 server\",\n                \"mongodb/mongodb\": \"Allow sending log messages to a MongoDB server (via library)\",\n                \"php-amqplib/php-amqplib\": \"Allow sending log messages to an AMQP server using php-amqplib\",\n                \"rollbar/rollbar\": \"Allow sending log messages to Rollbar\",\n                \"ruflin/elastica\": \"Allow sending log messages to an Elastic Search server\"\n            },\n            \"time\": \"2024-04-12T21:02:21+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Monolog\\\\\": \"src/Monolog\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Jordi Boggiano\",\n                    \"email\": \"j.boggiano@seld.be\",\n                    \"homepage\": \"https://seld.be\"\n                }\n            ],\n            \"description\": \"Sends your logs to files, sockets, inboxes, databases and various web services\",\n            \"homepage\": \"https://github.com/Seldaek/monolog\",\n            \"keywords\": [\n                \"log\",\n                \"logging\",\n                \"psr-3\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/Seldaek/monolog/issues\",\n                \"source\": \"https://github.com/Seldaek/monolog/tree/3.6.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/Seldaek\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/monolog/monolog\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../monolog/monolog\"\n        },\n        {\n            \"name\": \"overtrue/socialite\",\n            \"version\": \"4.10.1\",\n            \"version_normalized\": \"4.10.1.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/overtrue/socialite.git\",\n                \"reference\": \"457b48f31414dc00d3fb445d6ab9355595067afe\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/overtrue/socialite/zipball/457b48f31414dc00d3fb445d6ab9355595067afe\",\n                \"reference\": \"457b48f31414dc00d3fb445d6ab9355595067afe\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-json\": \"*\",\n                \"ext-openssl\": \"*\",\n                \"guzzlehttp/guzzle\": \"^7.0\",\n                \"php\": \">=8.0.2\",\n                \"symfony/psr-http-message-bridge\": \"^2.1|^6.0\"\n            },\n            \"require-dev\": {\n                \"jetbrains/phpstorm-attributes\": \"^1.0\",\n                \"laravel/pint\": \"^1.2\",\n                \"mockery/mockery\": \"^1.3\",\n                \"phpstan/phpstan\": \"^1.7\",\n                \"phpunit/phpunit\": \"^9.0\"\n            },\n            \"time\": \"2024-03-08T06:41:54+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"src/Contracts/FactoryInterface.php\",\n                    \"src/Contracts/UserInterface.php\",\n                    \"src/Contracts/ProviderInterface.php\"\n                ],\n                \"psr-4\": {\n                    \"Overtrue\\\\Socialite\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"overtrue\",\n                    \"email\": \"anzhengchao@gmail.com\"\n                }\n            ],\n            \"description\": \"A collection of OAuth 2 packages.\",\n            \"keywords\": [\n                \"Feishu\",\n                \"login\",\n                \"oauth\",\n                \"qcloud\",\n                \"qq\",\n                \"social\",\n                \"wechat\",\n                \"weibo\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/overtrue/socialite/issues\",\n                \"source\": \"https://github.com/overtrue/socialite/tree/4.10.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/overtrue\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"install-path\": \"../overtrue/socialite\"\n        },\n        {\n            \"name\": \"pimple/pimple\",\n            \"version\": \"v3.5.0\",\n            \"version_normalized\": \"3.5.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/silexphp/Pimple.git\",\n                \"reference\": \"a94b3a4db7fb774b3d78dad2315ddc07629e1bed\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed\",\n                \"reference\": \"a94b3a4db7fb774b3d78dad2315ddc07629e1bed\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2.5\",\n                \"psr/container\": \"^1.1 || ^2.0\"\n            },\n            \"require-dev\": {\n                \"symfony/phpunit-bridge\": \"^5.4@dev\"\n            },\n            \"time\": \"2021-10-28T11:13:42+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"3.4.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-0\": {\n                    \"Pimple\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                }\n            ],\n            \"description\": \"Pimple, a simple Dependency Injection Container\",\n            \"homepage\": \"https://pimple.symfony.com\",\n            \"keywords\": [\n                \"container\",\n                \"dependency injection\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/silexphp/Pimple/tree/v3.5.0\"\n            },\n            \"install-path\": \"../pimple/pimple\"\n        },\n        {\n            \"name\": \"psr/cache\",\n            \"version\": \"3.0.0\",\n            \"version_normalized\": \"3.0.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/cache.git\",\n                \"reference\": \"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\",\n                \"reference\": \"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.0.0\"\n            },\n            \"time\": \"2021-02-03T23:26:27+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"1.0.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Cache\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interface for caching libraries\",\n            \"keywords\": [\n                \"cache\",\n                \"psr\",\n                \"psr-6\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/cache/tree/3.0.0\"\n            },\n            \"install-path\": \"../psr/cache\"\n        },\n        {\n            \"name\": \"psr/container\",\n            \"version\": \"2.0.2\",\n            \"version_normalized\": \"2.0.2.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/container.git\",\n                \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n                \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.4.0\"\n            },\n            \"time\": \"2021-11-05T16:47:00+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"2.0.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Container\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common Container Interface (PHP FIG PSR-11)\",\n            \"homepage\": \"https://github.com/php-fig/container\",\n            \"keywords\": [\n                \"PSR-11\",\n                \"container\",\n                \"container-interface\",\n                \"container-interop\",\n                \"psr\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/php-fig/container/issues\",\n                \"source\": \"https://github.com/php-fig/container/tree/2.0.2\"\n            },\n            \"install-path\": \"../psr/container\"\n        },\n        {\n            \"name\": \"psr/event-dispatcher\",\n            \"version\": \"1.0.0\",\n            \"version_normalized\": \"1.0.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/event-dispatcher.git\",\n                \"reference\": \"dbefd12671e8a14ec7f180cab83036ed26714bb0\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0\",\n                \"reference\": \"dbefd12671e8a14ec7f180cab83036ed26714bb0\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2.0\"\n            },\n            \"time\": \"2019-01-08T18:20:26+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"1.0.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\EventDispatcher\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"http://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Standard interfaces for event handling.\",\n            \"keywords\": [\n                \"events\",\n                \"psr\",\n                \"psr-14\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/php-fig/event-dispatcher/issues\",\n                \"source\": \"https://github.com/php-fig/event-dispatcher/tree/1.0.0\"\n            },\n            \"install-path\": \"../psr/event-dispatcher\"\n        },\n        {\n            \"name\": \"psr/http-client\",\n            \"version\": \"1.0.3\",\n            \"version_normalized\": \"1.0.3.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/http-client.git\",\n                \"reference\": \"bb5906edc1c324c9a05aa0873d40117941e5fa90\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90\",\n                \"reference\": \"bb5906edc1c324c9a05aa0873d40117941e5fa90\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.0 || ^8.0\",\n                \"psr/http-message\": \"^1.0 || ^2.0\"\n            },\n            \"time\": \"2023-09-23T14:17:50+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"1.0.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Http\\\\Client\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interface for HTTP clients\",\n            \"homepage\": \"https://github.com/php-fig/http-client\",\n            \"keywords\": [\n                \"http\",\n                \"http-client\",\n                \"psr\",\n                \"psr-18\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/http-client\"\n            },\n            \"install-path\": \"../psr/http-client\"\n        },\n        {\n            \"name\": \"psr/http-factory\",\n            \"version\": \"1.1.0\",\n            \"version_normalized\": \"1.1.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/http-factory.git\",\n                \"reference\": \"2b4765fddfe3b508ac62f829e852b1501d3f6e8a\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a\",\n                \"reference\": \"2b4765fddfe3b508ac62f829e852b1501d3f6e8a\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.1\",\n                \"psr/http-message\": \"^1.0 || ^2.0\"\n            },\n            \"time\": \"2024-04-15T12:06:14+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"1.0.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"PSR-17: Common interfaces for PSR-7 HTTP message factories\",\n            \"keywords\": [\n                \"factory\",\n                \"http\",\n                \"message\",\n                \"psr\",\n                \"psr-17\",\n                \"psr-7\",\n                \"request\",\n                \"response\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/http-factory\"\n            },\n            \"install-path\": \"../psr/http-factory\"\n        },\n        {\n            \"name\": \"psr/http-message\",\n            \"version\": \"2.0\",\n            \"version_normalized\": \"2.0.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/http-message.git\",\n                \"reference\": \"402d35bcb92c70c026d1a6a9883f06b2ead23d71\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71\",\n                \"reference\": \"402d35bcb92c70c026d1a6a9883f06b2ead23d71\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2 || ^8.0\"\n            },\n            \"time\": \"2023-04-04T09:54:51+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"2.0.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interface for HTTP messages\",\n            \"homepage\": \"https://github.com/php-fig/http-message\",\n            \"keywords\": [\n                \"http\",\n                \"http-message\",\n                \"psr\",\n                \"psr-7\",\n                \"request\",\n                \"response\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/http-message/tree/2.0\"\n            },\n            \"install-path\": \"../psr/http-message\"\n        },\n        {\n            \"name\": \"psr/log\",\n            \"version\": \"3.0.0\",\n            \"version_normalized\": \"3.0.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/log.git\",\n                \"reference\": \"fe5ea303b0887d5caefd3d431c3e61ad47037001\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001\",\n                \"reference\": \"fe5ea303b0887d5caefd3d431c3e61ad47037001\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.0.0\"\n            },\n            \"time\": \"2021-07-14T16:46:02+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"3.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Log\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interface for logging libraries\",\n            \"homepage\": \"https://github.com/php-fig/log\",\n            \"keywords\": [\n                \"log\",\n                \"psr\",\n                \"psr-3\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/log/tree/3.0.0\"\n            },\n            \"install-path\": \"../psr/log\"\n        },\n        {\n            \"name\": \"psr/simple-cache\",\n            \"version\": \"3.0.0\",\n            \"version_normalized\": \"3.0.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/simple-cache.git\",\n                \"reference\": \"764e0b3939f5ca87cb904f570ef9be2d78a07865\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865\",\n                \"reference\": \"764e0b3939f5ca87cb904f570ef9be2d78a07865\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.0.0\"\n            },\n            \"time\": \"2021-10-29T13:26:27+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"3.0.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\SimpleCache\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interfaces for simple caching\",\n            \"keywords\": [\n                \"cache\",\n                \"caching\",\n                \"psr\",\n                \"psr-16\",\n                \"simple-cache\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/simple-cache/tree/3.0.0\"\n            },\n            \"install-path\": \"../psr/simple-cache\"\n        },\n        {\n            \"name\": \"ralouphie/getallheaders\",\n            \"version\": \"3.0.3\",\n            \"version_normalized\": \"3.0.3.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/ralouphie/getallheaders.git\",\n                \"reference\": \"120b605dfeb996808c31b6477290a714d356e822\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822\",\n                \"reference\": \"120b605dfeb996808c31b6477290a714d356e822\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=5.6\"\n            },\n            \"require-dev\": {\n                \"php-coveralls/php-coveralls\": \"^2.1\",\n                \"phpunit/phpunit\": \"^5 || ^6.5\"\n            },\n            \"time\": \"2019-03-08T08:55:37+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"src/getallheaders.php\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Ralph Khattar\",\n                    \"email\": \"ralph.khattar@gmail.com\"\n                }\n            ],\n            \"description\": \"A polyfill for getallheaders.\",\n            \"support\": {\n                \"issues\": \"https://github.com/ralouphie/getallheaders/issues\",\n                \"source\": \"https://github.com/ralouphie/getallheaders/tree/develop\"\n            },\n            \"install-path\": \"../ralouphie/getallheaders\"\n        },\n        {\n            \"name\": \"symfony/cache\",\n            \"version\": \"v6.4.7\",\n            \"version_normalized\": \"6.4.7.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/cache.git\",\n                \"reference\": \"b9e9b93c9817ec6c789c7943f5e54b57a041c16a\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/cache/zipball/b9e9b93c9817ec6c789c7943f5e54b57a041c16a\",\n                \"reference\": \"b9e9b93c9817ec6c789c7943f5e54b57a041c16a\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\",\n                \"psr/cache\": \"^2.0|^3.0\",\n                \"psr/log\": \"^1.1|^2|^3\",\n                \"symfony/cache-contracts\": \"^2.5|^3\",\n                \"symfony/service-contracts\": \"^2.5|^3\",\n                \"symfony/var-exporter\": \"^6.3.6|^7.0\"\n            },\n            \"conflict\": {\n                \"doctrine/dbal\": \"<2.13.1\",\n                \"symfony/dependency-injection\": \"<5.4\",\n                \"symfony/http-kernel\": \"<5.4\",\n                \"symfony/var-dumper\": \"<5.4\"\n            },\n            \"provide\": {\n                \"psr/cache-implementation\": \"2.0|3.0\",\n                \"psr/simple-cache-implementation\": \"1.0|2.0|3.0\",\n                \"symfony/cache-implementation\": \"1.1|2.0|3.0\"\n            },\n            \"require-dev\": {\n                \"cache/integration-tests\": \"dev-master\",\n                \"doctrine/dbal\": \"^2.13.1|^3|^4\",\n                \"predis/predis\": \"^1.1|^2.0\",\n                \"psr/simple-cache\": \"^1.0|^2.0|^3.0\",\n                \"symfony/config\": \"^5.4|^6.0|^7.0\",\n                \"symfony/dependency-injection\": \"^5.4|^6.0|^7.0\",\n                \"symfony/filesystem\": \"^5.4|^6.0|^7.0\",\n                \"symfony/http-kernel\": \"^5.4|^6.0|^7.0\",\n                \"symfony/messenger\": \"^5.4|^6.0|^7.0\",\n                \"symfony/var-dumper\": \"^5.4|^6.0|^7.0\"\n            },\n            \"time\": \"2024-04-18T09:22:46+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Cache\\\\\": \"\"\n                },\n                \"classmap\": [\n                    \"Traits/ValueWrapper.php\"\n                ],\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides extended PSR-6, PSR-16 (and tags) implementations\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"caching\",\n                \"psr6\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/cache/tree/v6.4.7\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/cache\"\n        },\n        {\n            \"name\": \"symfony/cache-contracts\",\n            \"version\": \"v3.5.0\",\n            \"version_normalized\": \"3.5.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/cache-contracts.git\",\n                \"reference\": \"df6a1a44c890faded49a5fca33c2d5c5fd3c2197\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197\",\n                \"reference\": \"df6a1a44c890faded49a5fca33c2d5c5fd3c2197\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\",\n                \"psr/cache\": \"^3.0\"\n            },\n            \"time\": \"2024-04-18T09:32:20+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.5-dev\"\n                },\n                \"thanks\": {\n                    \"name\": \"symfony/contracts\",\n                    \"url\": \"https://github.com/symfony/contracts\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Contracts\\\\Cache\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Generic abstractions related to caching\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"abstractions\",\n                \"contracts\",\n                \"decoupling\",\n                \"interfaces\",\n                \"interoperability\",\n                \"standards\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/cache-contracts/tree/v3.5.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/cache-contracts\"\n        },\n        {\n            \"name\": \"symfony/deprecation-contracts\",\n            \"version\": \"v3.5.0\",\n            \"version_normalized\": \"3.5.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/deprecation-contracts.git\",\n                \"reference\": \"0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1\",\n                \"reference\": \"0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\"\n            },\n            \"time\": \"2024-04-18T09:32:20+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.5-dev\"\n                },\n                \"thanks\": {\n                    \"name\": \"symfony/contracts\",\n                    \"url\": \"https://github.com/symfony/contracts\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"function.php\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"A generic function and convention to trigger deprecation notices\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/deprecation-contracts/tree/v3.5.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/deprecation-contracts\"\n        },\n        {\n            \"name\": \"symfony/event-dispatcher\",\n            \"version\": \"v6.4.7\",\n            \"version_normalized\": \"6.4.7.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/event-dispatcher.git\",\n                \"reference\": \"d84384f3f67de3cb650db64d685d70395dacfc3f\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/event-dispatcher/zipball/d84384f3f67de3cb650db64d685d70395dacfc3f\",\n                \"reference\": \"d84384f3f67de3cb650db64d685d70395dacfc3f\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\",\n                \"symfony/event-dispatcher-contracts\": \"^2.5|^3\"\n            },\n            \"conflict\": {\n                \"symfony/dependency-injection\": \"<5.4\",\n                \"symfony/service-contracts\": \"<2.5\"\n            },\n            \"provide\": {\n                \"psr/event-dispatcher-implementation\": \"1.0\",\n                \"symfony/event-dispatcher-implementation\": \"2.0|3.0\"\n            },\n            \"require-dev\": {\n                \"psr/log\": \"^1|^2|^3\",\n                \"symfony/config\": \"^5.4|^6.0|^7.0\",\n                \"symfony/dependency-injection\": \"^5.4|^6.0|^7.0\",\n                \"symfony/error-handler\": \"^5.4|^6.0|^7.0\",\n                \"symfony/expression-language\": \"^5.4|^6.0|^7.0\",\n                \"symfony/http-foundation\": \"^5.4|^6.0|^7.0\",\n                \"symfony/service-contracts\": \"^2.5|^3\",\n                \"symfony/stopwatch\": \"^5.4|^6.0|^7.0\"\n            },\n            \"time\": \"2024-04-18T09:22:46+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\EventDispatcher\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides tools that allow your application components to communicate with each other by dispatching events and listening to them\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/event-dispatcher/tree/v6.4.7\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/event-dispatcher\"\n        },\n        {\n            \"name\": \"symfony/event-dispatcher-contracts\",\n            \"version\": \"v3.5.0\",\n            \"version_normalized\": \"3.5.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/event-dispatcher-contracts.git\",\n                \"reference\": \"8f93aec25d41b72493c6ddff14e916177c9efc50\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50\",\n                \"reference\": \"8f93aec25d41b72493c6ddff14e916177c9efc50\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\",\n                \"psr/event-dispatcher\": \"^1\"\n            },\n            \"time\": \"2024-04-18T09:32:20+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.5-dev\"\n                },\n                \"thanks\": {\n                    \"name\": \"symfony/contracts\",\n                    \"url\": \"https://github.com/symfony/contracts\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Contracts\\\\EventDispatcher\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Generic abstractions related to dispatching event\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"abstractions\",\n                \"contracts\",\n                \"decoupling\",\n                \"interfaces\",\n                \"interoperability\",\n                \"standards\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/event-dispatcher-contracts\"\n        },\n        {\n            \"name\": \"symfony/http-foundation\",\n            \"version\": \"v6.4.7\",\n            \"version_normalized\": \"6.4.7.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/http-foundation.git\",\n                \"reference\": \"b4db6b833035477cb70e18d0ae33cb7c2b521759\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/http-foundation/zipball/b4db6b833035477cb70e18d0ae33cb7c2b521759\",\n                \"reference\": \"b4db6b833035477cb70e18d0ae33cb7c2b521759\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\",\n                \"symfony/polyfill-mbstring\": \"~1.1\",\n                \"symfony/polyfill-php83\": \"^1.27\"\n            },\n            \"conflict\": {\n                \"symfony/cache\": \"<6.3\"\n            },\n            \"require-dev\": {\n                \"doctrine/dbal\": \"^2.13.1|^3|^4\",\n                \"predis/predis\": \"^1.1|^2.0\",\n                \"symfony/cache\": \"^6.3|^7.0\",\n                \"symfony/dependency-injection\": \"^5.4|^6.0|^7.0\",\n                \"symfony/expression-language\": \"^5.4|^6.0|^7.0\",\n                \"symfony/http-kernel\": \"^5.4.12|^6.0.12|^6.1.4|^7.0\",\n                \"symfony/mime\": \"^5.4|^6.0|^7.0\",\n                \"symfony/rate-limiter\": \"^5.4|^6.0|^7.0\"\n            },\n            \"time\": \"2024-04-18T09:22:46+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\HttpFoundation\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Defines an object-oriented layer for the HTTP specification\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/http-foundation/tree/v6.4.7\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/http-foundation\"\n        },\n        {\n            \"name\": \"symfony/polyfill-mbstring\",\n            \"version\": \"v1.29.0\",\n            \"version_normalized\": \"1.29.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-mbstring.git\",\n                \"reference\": \"9773676c8a1bb1f8d4340a62efe641cf76eda7ec\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec\",\n                \"reference\": \"9773676c8a1bb1f8d4340a62efe641cf76eda7ec\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.1\"\n            },\n            \"provide\": {\n                \"ext-mbstring\": \"*\"\n            },\n            \"suggest\": {\n                \"ext-mbstring\": \"For best performance\"\n            },\n            \"time\": \"2024-01-29T20:11:03+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"name\": \"symfony/polyfill\",\n                    \"url\": \"https://github.com/symfony/polyfill\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Mbstring\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill for the Mbstring extension\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"mbstring\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-mbstring/tree/v1.29.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/polyfill-mbstring\"\n        },\n        {\n            \"name\": \"symfony/polyfill-php80\",\n            \"version\": \"v1.29.0\",\n            \"version_normalized\": \"1.29.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-php80.git\",\n                \"reference\": \"87b68208d5c1188808dd7839ee1e6c8ec3b02f1b\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b\",\n                \"reference\": \"87b68208d5c1188808dd7839ee1e6c8ec3b02f1b\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.1\"\n            },\n            \"time\": \"2024-01-29T20:11:03+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"name\": \"symfony/polyfill\",\n                    \"url\": \"https://github.com/symfony/polyfill\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Php80\\\\\": \"\"\n                },\n                \"classmap\": [\n                    \"Resources/stubs\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Ion Bazan\",\n                    \"email\": \"ion.bazan@gmail.com\"\n                },\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-php80/tree/v1.29.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/polyfill-php80\"\n        },\n        {\n            \"name\": \"symfony/polyfill-php83\",\n            \"version\": \"v1.29.0\",\n            \"version_normalized\": \"1.29.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-php83.git\",\n                \"reference\": \"86fcae159633351e5fd145d1c47de6c528f8caff\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff\",\n                \"reference\": \"86fcae159633351e5fd145d1c47de6c528f8caff\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.1\",\n                \"symfony/polyfill-php80\": \"^1.14\"\n            },\n            \"time\": \"2024-01-29T20:11:03+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"name\": \"symfony/polyfill\",\n                    \"url\": \"https://github.com/symfony/polyfill\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Php83\\\\\": \"\"\n                },\n                \"classmap\": [\n                    \"Resources/stubs\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-php83/tree/v1.29.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/polyfill-php83\"\n        },\n        {\n            \"name\": \"symfony/psr-http-message-bridge\",\n            \"version\": \"v2.3.1\",\n            \"version_normalized\": \"2.3.1.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/psr-http-message-bridge.git\",\n                \"reference\": \"581ca6067eb62640de5ff08ee1ba6850a0ee472e\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/581ca6067eb62640de5ff08ee1ba6850a0ee472e\",\n                \"reference\": \"581ca6067eb62640de5ff08ee1ba6850a0ee472e\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2.5\",\n                \"psr/http-message\": \"^1.0 || ^2.0\",\n                \"symfony/deprecation-contracts\": \"^2.5 || ^3.0\",\n                \"symfony/http-foundation\": \"^5.4 || ^6.0\"\n            },\n            \"require-dev\": {\n                \"nyholm/psr7\": \"^1.1\",\n                \"psr/log\": \"^1.1 || ^2 || ^3\",\n                \"symfony/browser-kit\": \"^5.4 || ^6.0\",\n                \"symfony/config\": \"^5.4 || ^6.0\",\n                \"symfony/event-dispatcher\": \"^5.4 || ^6.0\",\n                \"symfony/framework-bundle\": \"^5.4 || ^6.0\",\n                \"symfony/http-kernel\": \"^5.4 || ^6.0\",\n                \"symfony/phpunit-bridge\": \"^6.2\"\n            },\n            \"suggest\": {\n                \"nyholm/psr7\": \"For a super lightweight PSR-7/17 implementation\"\n            },\n            \"time\": \"2023-07-26T11:53:26+00:00\",\n            \"type\": \"symfony-bridge\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"2.3-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Bridge\\\\PsrHttpMessage\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"http://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"PSR HTTP message bridge\",\n            \"homepage\": \"http://symfony.com\",\n            \"keywords\": [\n                \"http\",\n                \"http-message\",\n                \"psr-17\",\n                \"psr-7\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/symfony/psr-http-message-bridge/issues\",\n                \"source\": \"https://github.com/symfony/psr-http-message-bridge/tree/v2.3.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/psr-http-message-bridge\"\n        },\n        {\n            \"name\": \"symfony/service-contracts\",\n            \"version\": \"v3.5.0\",\n            \"version_normalized\": \"3.5.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/service-contracts.git\",\n                \"reference\": \"bd1d9e59a81d8fa4acdcea3f617c581f7475a80f\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f\",\n                \"reference\": \"bd1d9e59a81d8fa4acdcea3f617c581f7475a80f\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\",\n                \"psr/container\": \"^1.1|^2.0\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\"\n            },\n            \"conflict\": {\n                \"ext-psr\": \"<1.1|>=2\"\n            },\n            \"time\": \"2024-04-18T09:32:20+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.5-dev\"\n                },\n                \"thanks\": {\n                    \"name\": \"symfony/contracts\",\n                    \"url\": \"https://github.com/symfony/contracts\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Contracts\\\\Service\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Test/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Generic abstractions related to writing services\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"abstractions\",\n                \"contracts\",\n                \"decoupling\",\n                \"interfaces\",\n                \"interoperability\",\n                \"standards\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/service-contracts/tree/v3.5.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/service-contracts\"\n        },\n        {\n            \"name\": \"symfony/var-exporter\",\n            \"version\": \"v7.0.7\",\n            \"version_normalized\": \"7.0.7.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/var-exporter.git\",\n                \"reference\": \"cdecc0022e40e90340ba1a59a3d5ccf069777078\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/var-exporter/zipball/cdecc0022e40e90340ba1a59a3d5ccf069777078\",\n                \"reference\": \"cdecc0022e40e90340ba1a59a3d5ccf069777078\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"symfony/property-access\": \"^6.4|^7.0\",\n                \"symfony/serializer\": \"^6.4|^7.0\",\n                \"symfony/var-dumper\": \"^6.4|^7.0\"\n            },\n            \"time\": \"2024-04-18T09:29:19+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\VarExporter\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Allows exporting any serializable PHP data structure to plain PHP code\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"clone\",\n                \"construct\",\n                \"export\",\n                \"hydrate\",\n                \"instantiate\",\n                \"lazy-loading\",\n                \"proxy\",\n                \"serialize\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/var-exporter/tree/v7.0.7\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/var-exporter\"\n        },\n        {\n            \"name\": \"w7corp/easywechat\",\n            \"version\": \"5.34.1\",\n            \"version_normalized\": \"5.34.1.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/w7corp/easywechat.git\",\n                \"reference\": \"1c31e8208aa9961b80e2d9f3761dd46337fd017b\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/w7corp/easywechat/zipball/1c31e8208aa9961b80e2d9f3761dd46337fd017b\",\n                \"reference\": \"1c31e8208aa9961b80e2d9f3761dd46337fd017b\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"easywechat-composer/easywechat-composer\": \"^1.1\",\n                \"ext-fileinfo\": \"*\",\n                \"ext-libxml\": \"*\",\n                \"ext-openssl\": \"*\",\n                \"ext-simplexml\": \"*\",\n                \"guzzlehttp/guzzle\": \"^6.2 || ^7.0\",\n                \"monolog/monolog\": \"^1.22 || ^2.0 || ^3.0\",\n                \"overtrue/socialite\": \"^3.2 || ^4.0\",\n                \"php\": \">=7.4\",\n                \"pimple/pimple\": \"^3.0\",\n                \"psr/simple-cache\": \"^1.0||^2.0||^3.0\",\n                \"symfony/cache\": \"^3.3 || ^4.3 || ^5.0 || ^6.0\",\n                \"symfony/event-dispatcher\": \"^4.3 || ^5.0 || ^6.0\",\n                \"symfony/http-foundation\": \"^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0\",\n                \"symfony/psr-http-message-bridge\": \"^0.3 || ^1.0 || ^2.0\"\n            },\n            \"require-dev\": {\n                \"brainmaestro/composer-git-hooks\": \"^2.7\",\n                \"dms/phpunit-arraysubset-asserts\": \"^0.2.0\",\n                \"friendsofphp/php-cs-fixer\": \"^3.5.0\",\n                \"mikey179/vfsstream\": \"^1.6\",\n                \"mockery/mockery\": \"^1.2.3\",\n                \"phpstan/phpstan\": \"^0.12.0\",\n                \"phpunit/phpunit\": \"^9.3\"\n            },\n            \"time\": \"2023-07-29T09:39:45+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"hooks\": {\n                    \"pre-commit\": [\n                        \"composer test\",\n                        \"composer fix-style\"\n                    ],\n                    \"pre-push\": [\n                        \"composer test\",\n                        \"composer fix-style\"\n                    ]\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"src/Kernel/Support/Helpers.php\",\n                    \"src/Kernel/Helpers.php\"\n                ],\n                \"psr-4\": {\n                    \"EasyWeChat\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"overtrue\",\n                    \"email\": \"anzhengchao@gmail.com\"\n                }\n            ],\n            \"description\": \"微信SDK\",\n            \"keywords\": [\n                \"easywechat\",\n                \"sdk\",\n                \"wechat\",\n                \"weixin\",\n                \"weixin-sdk\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/w7corp/easywechat/issues\",\n                \"source\": \"https://github.com/w7corp/easywechat/tree/5.34.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/overtrue\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"install-path\": \"../w7corp/easywechat\"\n        }\n    ],\n    \"dev\": true,\n    \"dev-package-names\": []\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/installed.php",
    "content": "<?php return array (\n  'root' => \n  array (\n    'pretty_version' => '1.0.0+no-version-set',\n    'version' => '1.0.0.0',\n    'aliases' => \n    array (\n    ),\n    'reference' => NULL,\n    'name' => '__root__',\n  ),\n  'versions' => \n  array (\n    '__root__' => \n    array (\n      'pretty_version' => '1.0.0+no-version-set',\n      'version' => '1.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => NULL,\n    ),\n    'easywechat-composer/easywechat-composer' => \n    array (\n      'pretty_version' => '1.4.1',\n      'version' => '1.4.1.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd',\n    ),\n    'guzzlehttp/guzzle' => \n    array (\n      'pretty_version' => '7.8.1',\n      'version' => '7.8.1.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '41042bc7ab002487b876a0683fc8dce04ddce104',\n    ),\n    'guzzlehttp/promises' => \n    array (\n      'pretty_version' => '2.0.2',\n      'version' => '2.0.2.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'bbff78d96034045e58e13dedd6ad91b5d1253223',\n    ),\n    'guzzlehttp/psr7' => \n    array (\n      'pretty_version' => '2.6.2',\n      'version' => '2.6.2.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '45b30f99ac27b5ca93cb4831afe16285f57b8221',\n    ),\n    'monolog/monolog' => \n    array (\n      'pretty_version' => '3.6.0',\n      'version' => '3.6.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '4b18b21a5527a3d5ffdac2fd35d3ab25a9597654',\n    ),\n    'overtrue/socialite' => \n    array (\n      'pretty_version' => '4.10.1',\n      'version' => '4.10.1.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '457b48f31414dc00d3fb445d6ab9355595067afe',\n    ),\n    'pimple/pimple' => \n    array (\n      'pretty_version' => 'v3.5.0',\n      'version' => '3.5.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'a94b3a4db7fb774b3d78dad2315ddc07629e1bed',\n    ),\n    'psr/cache' => \n    array (\n      'pretty_version' => '3.0.0',\n      'version' => '3.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf',\n    ),\n    'psr/cache-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '2.0|3.0',\n      ),\n    ),\n    'psr/container' => \n    array (\n      'pretty_version' => '2.0.2',\n      'version' => '2.0.2.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'c71ecc56dfe541dbd90c5360474fbc405f8d5963',\n    ),\n    'psr/event-dispatcher' => \n    array (\n      'pretty_version' => '1.0.0',\n      'version' => '1.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0',\n    ),\n    'psr/event-dispatcher-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.0',\n      ),\n    ),\n    'psr/http-client' => \n    array (\n      'pretty_version' => '1.0.3',\n      'version' => '1.0.3.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90',\n    ),\n    'psr/http-client-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.0',\n      ),\n    ),\n    'psr/http-factory' => \n    array (\n      'pretty_version' => '1.1.0',\n      'version' => '1.1.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a',\n    ),\n    'psr/http-factory-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.0',\n      ),\n    ),\n    'psr/http-message' => \n    array (\n      'pretty_version' => '2.0',\n      'version' => '2.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71',\n    ),\n    'psr/http-message-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.0',\n      ),\n    ),\n    'psr/log' => \n    array (\n      'pretty_version' => '3.0.0',\n      'version' => '3.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'fe5ea303b0887d5caefd3d431c3e61ad47037001',\n    ),\n    'psr/log-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '3.0.0',\n      ),\n    ),\n    'psr/simple-cache' => \n    array (\n      'pretty_version' => '3.0.0',\n      'version' => '3.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '764e0b3939f5ca87cb904f570ef9be2d78a07865',\n    ),\n    'psr/simple-cache-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.0|2.0|3.0',\n      ),\n    ),\n    'ralouphie/getallheaders' => \n    array (\n      'pretty_version' => '3.0.3',\n      'version' => '3.0.3.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '120b605dfeb996808c31b6477290a714d356e822',\n    ),\n    'symfony/cache' => \n    array (\n      'pretty_version' => 'v6.4.7',\n      'version' => '6.4.7.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'b9e9b93c9817ec6c789c7943f5e54b57a041c16a',\n    ),\n    'symfony/cache-contracts' => \n    array (\n      'pretty_version' => 'v3.5.0',\n      'version' => '3.5.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'df6a1a44c890faded49a5fca33c2d5c5fd3c2197',\n    ),\n    'symfony/cache-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '1.1|2.0|3.0',\n      ),\n    ),\n    'symfony/deprecation-contracts' => \n    array (\n      'pretty_version' => 'v3.5.0',\n      'version' => '3.5.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1',\n    ),\n    'symfony/event-dispatcher' => \n    array (\n      'pretty_version' => 'v6.4.7',\n      'version' => '6.4.7.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'd84384f3f67de3cb650db64d685d70395dacfc3f',\n    ),\n    'symfony/event-dispatcher-contracts' => \n    array (\n      'pretty_version' => 'v3.5.0',\n      'version' => '3.5.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '8f93aec25d41b72493c6ddff14e916177c9efc50',\n    ),\n    'symfony/event-dispatcher-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '2.0|3.0',\n      ),\n    ),\n    'symfony/http-foundation' => \n    array (\n      'pretty_version' => 'v6.4.7',\n      'version' => '6.4.7.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'b4db6b833035477cb70e18d0ae33cb7c2b521759',\n    ),\n    'symfony/polyfill-mbstring' => \n    array (\n      'pretty_version' => 'v1.29.0',\n      'version' => '1.29.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '9773676c8a1bb1f8d4340a62efe641cf76eda7ec',\n    ),\n    'symfony/polyfill-php80' => \n    array (\n      'pretty_version' => 'v1.29.0',\n      'version' => '1.29.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '87b68208d5c1188808dd7839ee1e6c8ec3b02f1b',\n    ),\n    'symfony/polyfill-php83' => \n    array (\n      'pretty_version' => 'v1.29.0',\n      'version' => '1.29.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '86fcae159633351e5fd145d1c47de6c528f8caff',\n    ),\n    'symfony/psr-http-message-bridge' => \n    array (\n      'pretty_version' => 'v2.3.1',\n      'version' => '2.3.1.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '581ca6067eb62640de5ff08ee1ba6850a0ee472e',\n    ),\n    'symfony/service-contracts' => \n    array (\n      'pretty_version' => 'v3.5.0',\n      'version' => '3.5.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'bd1d9e59a81d8fa4acdcea3f617c581f7475a80f',\n    ),\n    'symfony/var-exporter' => \n    array (\n      'pretty_version' => 'v7.0.7',\n      'version' => '7.0.7.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'cdecc0022e40e90340ba1a59a3d5ccf069777078',\n    ),\n    'w7corp/easywechat' => \n    array (\n      'pretty_version' => '5.34.1',\n      'version' => '5.34.1.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '1c31e8208aa9961b80e2d9f3761dd46337fd017b',\n    ),\n  ),\n);\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/composer/platform_check.php",
    "content": "<?php\n\n// platform_check.php @generated by Composer\n\n$issues = array();\n\nif (!(PHP_VERSION_ID >= 80100)) {\n    $issues[] = 'Your Composer dependencies require a PHP version \">= 8.2.0\". You are running ' . PHP_VERSION . '.';\n}\n\nif ($issues) {\n    if (!headers_sent()) {\n        header('HTTP/1.1 500 Internal Server Error');\n    }\n    if (!ini_get('display_errors')) {\n        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {\n            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);\n        } elseif (!headers_sent()) {\n            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;\n        }\n    }\n    trigger_error(\n        'Composer detected issues in your platform: ' . implode(' ', $issues),\n        E_USER_ERROR\n    );\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/.gitignore",
    "content": ".idea/\n/vendor\ncomposer.lock\nextensions.php\n.php_cs.cache\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/.php_cs",
    "content": "<?php\n\n$header = <<<EOF\nThis file is part of the EasyWeChatComposer.\n\n(c) 张铭阳 <mingyoungcheung@gmail.com>\n\nThis source file is subject to the MIT license that is bundled\nwith this source code in the file LICENSE.\nEOF;\n\nreturn PhpCsFixer\\Config::create()\n    ->setRiskyAllowed(true)\n    ->setRules([\n        '@Symfony' => true,\n        'header_comment' => ['header' => $header],\n        'declare_strict_types' => true,\n        'ordered_imports' => true,\n        'strict_comparison' => true,\n        'no_empty_comment' => false,\n        'yoda_style' => false,\n    ])\n    ->setFinder(\n        PhpCsFixer\\Finder::create()\n            ->exclude('vendor')\n            ->notPath('src/Laravel/config.php', 'src/Laravel/routes.php')\n            ->in(__DIR__)\n    )\n;\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/.travis.yml",
    "content": "language: php\n\nphp:\n  - 7.0\n  - 7.1\n  - 7.2\n  - 7.3\n\ninstall:\n  - travis_retry composer install --no-interaction --no-suggest\n\nscript: ./vendor/bin/phpunit\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/LICENSE",
    "content": "MIT License\n\nCopyright (c) 张铭阳\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/README.md",
    "content": "<p align=\"center\">\n    <h1 align=\"center\">EasyWeChat Composer Plugin</h1>\n</p>\n\n<p align=\"center\">\n    <a href=\"https://travis-ci.org/mingyoung/easywechat-composer\"><img src=\"https://travis-ci.org/mingyoung/easywechat-composer.svg\" alt=\"Build Status\"></a>\n    <a href=\"https://scrutinizer-ci.com/g/mingyoung/easywechat-composer/?branch=master\"><img src=\"https://scrutinizer-ci.com/g/mingyoung/easywechat-composer/badges/quality-score.png?b=master\" alt=\"Scrutinizer Code Quality\"></a>\n    <a href=\"https://packagist.org/packages/easywechat-composer/easywechat-composer\"><img src=\"https://poser.pugx.org/easywechat-composer/easywechat-composer/v/stable.svg\" alt=\"Latest Stable Version\"></a>\n    <a href=\"https://packagist.org/packages/easywechat-composer/easywechat-composer\"><img src=\"https://poser.pugx.org/easywechat-composer/easywechat-composer/d/total.svg\" alt=\"Total Downloads\"></a>\n    <a href=\"https://packagist.org/packages/easywechat-composer/easywechat-composer\"><img src=\"https://poser.pugx.org/easywechat-composer/easywechat-composer/license.svg\" alt=\"License\"></a>\n</p>\n\nUsage\n---\n\nSet the `type` to be `easywechat-extension` in your package composer.json file:\n\n```json\n{\n    \"name\": \"your/package\",\n    \"type\": \"easywechat-extension\"\n}\n```\n\nSpecify server observer classes in the extra section:\n\n```json\n{\n    \"name\": \"your/package\",\n    \"type\": \"easywechat-extension\",\n    \"extra\": {\n        \"observers\": [\n            \"Acme\\\\Observers\\\\Handler\"\n        ]\n    }\n}\n```\n\nExamples\n---\n* [easywechat-composer/open-platform-testcase](https://github.com/mingyoung/open-platform-testcase)\n\nServer Delegation\n---\n\n> 目前仅支持 Laravel\n\n1. 在 `config/app.php` 中添加 `EasyWeChatComposer\\Laravel\\ServiceProvider::class`\n\n2. 在**本地项目**的 `.env` 文件中添加如下配置：\n\n```\nEASYWECHAT_DELEGATION=true # false 则不启用\nEASYWECHAT_DELEGATION_HOST=https://example.com # 线上域名\n```\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/composer.json",
    "content": "{\n    \"name\": \"easywechat-composer/easywechat-composer\",\n    \"description\": \"The composer plugin for EasyWeChat\",\n    \"type\": \"composer-plugin\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"张铭阳\",\n            \"email\": \"mingyoungcheung@gmail.com\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.0\",\n        \"composer-plugin-api\": \"^1.0 || ^2.0\"\n    },\n    \"require-dev\": {\n        \"composer/composer\": \"^1.0 || ^2.0\",\n        \"phpunit/phpunit\": \"^6.5 || ^7.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"EasyWeChatComposer\\\\\": \"src/\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"EasyWeChatComposer\\\\Tests\\\\\": \"tests/\"\n        }\n    },\n    \"extra\": {\n        \"class\": \"EasyWeChatComposer\\\\Plugin\"\n    },\n    \"minimum-stability\": \"dev\",\n    \"prefer-stable\": true\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/phpunit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"https://schema.phpunit.de/7.0/phpunit.xsd\"\n         bootstrap=\"vendor/autoload.php\"\n         colors=\"true\"\n         forceCoversAnnotation=\"true\"\n         beStrictAboutCoversAnnotation=\"true\"\n         beStrictAboutOutputDuringTests=\"true\"\n         beStrictAboutTodoAnnotatedTests=\"true\"\n         verbose=\"true\">\n    <testsuite name=\"EasyWeChatComposer Test\">\n        <directory suffix=\"Test.php\">tests</directory>\n    </testsuite>\n\n    <filter>\n        <whitelist processUncoveredFilesFromWhitelist=\"true\">\n            <directory suffix=\".php\">src</directory>\n        </whitelist>\n    </filter>\n</phpunit>\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Commands/ExtensionsCommand.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Commands;\n\nuse Composer\\Command\\BaseCommand;\nuse Symfony\\Component\\Console\\Helper\\Table;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\nclass ExtensionsCommand extends BaseCommand\n{\n    /**\n     * Configures the current command.\n     */\n    protected function configure()\n    {\n        $this->setName('easywechat:extensions')\n            ->setDescription('Lists all installed extensions.');\n    }\n\n    /**\n     * Executes the current command.\n     *\n     * @param InputInterface  $input\n     * @param OutputInterface $output\n     */\n    protected function execute(InputInterface $input, OutputInterface $output)\n    {\n        $extensions = require __DIR__.'/../../extensions.php';\n\n        if (empty($extensions) || !is_array($extensions)) {\n            return $output->writeln('<info>No extension installed.</info>');\n        }\n\n        $table = new Table($output);\n        $table->setHeaders(['Name', 'Observers'])\n            ->setRows(\n                array_map([$this, 'getRows'], array_keys($extensions), $extensions)\n            )->render();\n    }\n\n    /**\n     * @param string $name\n     * @param array  $extension\n     *\n     * @return array\n     */\n    protected function getRows($name, $extension)\n    {\n        return [$name, implode(\"\\n\", $extension['observers'] ?? [])];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Commands/Provider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Commands;\n\nuse Composer\\Plugin\\Capability\\CommandProvider;\n\nclass Provider implements CommandProvider\n{\n    /**\n     * Retrieves an array of commands.\n     *\n     * @return \\Composer\\Command\\BaseCommand[]\n     */\n    public function getCommands()\n    {\n        return [\n            new ExtensionsCommand(),\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Contracts/Encrypter.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Contracts;\n\ninterface Encrypter\n{\n    /**\n     * Encrypt the given value.\n     *\n     * @param string $value\n     *\n     * @return string\n     */\n    public function encrypt($value);\n\n    /**\n     * Decrypt the given value.\n     *\n     * @param string $payload\n     *\n     * @return string\n     */\n    public function decrypt($payload);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Delegation/DelegationOptions.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Delegation;\n\nuse EasyWeChatComposer\\EasyWeChat;\n\nclass DelegationOptions\n{\n    /**\n     * @var array\n     */\n    protected $config = [\n        'enabled' => false,\n    ];\n\n    /**\n     * @return $this\n     */\n    public function enable()\n    {\n        $this->config['enabled'] = true;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function disable()\n    {\n        $this->config['enabled'] = false;\n\n        return $this;\n    }\n\n    /**\n     * @param bool $ability\n     *\n     * @return $this\n     */\n    public function ability($ability)\n    {\n        $this->config['enabled'] = (bool) $ability;\n\n        return $this;\n    }\n\n    /**\n     * @param string $host\n     *\n     * @return $this\n     */\n    public function toHost($host)\n    {\n        $this->config['host'] = $host;\n\n        return $this;\n    }\n\n    /**\n     * Destructor.\n     */\n    public function __destruct()\n    {\n        EasyWeChat::mergeConfig([\n            'delegation' => $this->config,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Delegation/DelegationTo.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Delegation;\n\nuse EasyWeChatComposer\\Traits\\MakesHttpRequests;\n\nclass DelegationTo\n{\n    use MakesHttpRequests;\n\n    /**\n     * @var \\EasyWeChat\\Kernel\\ServiceContainer\n     */\n    protected $app;\n\n    /**\n     * @var array\n     */\n    protected $identifiers = [];\n\n    /**\n     * @param \\EasyWeChat\\Kernel\\ServiceContainer $app\n     * @param string                              $identifier\n     */\n    public function __construct($app, $identifier)\n    {\n        $this->app = $app;\n\n        $this->push($identifier);\n    }\n\n    /**\n     * @param string $identifier\n     */\n    public function push($identifier)\n    {\n        $this->identifiers[] = $identifier;\n    }\n\n    /**\n     * @param string $identifier\n     *\n     * @return $this\n     */\n    public function __get($identifier)\n    {\n        $this->push($identifier);\n\n        return $this;\n    }\n\n    /**\n     * @param string $method\n     * @param array  $arguments\n     *\n     * @return mixed\n     */\n    public function __call($method, $arguments)\n    {\n        $config = array_intersect_key($this->app->getConfig(), array_flip(['app_id', 'secret', 'token', 'aes_key', 'response_type', 'component_app_id', 'refresh_token']));\n\n        $data = [\n            'config' => $config,\n            'application' => get_class($this->app),\n            'identifiers' => $this->identifiers,\n            'method' => $method,\n            'arguments' => $arguments,\n        ];\n\n        return $this->request('easywechat-composer/delegate', $data);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Delegation/Hydrate.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Delegation;\n\nuse EasyWeChat;\nuse EasyWeChatComposer\\Http\\DelegationResponse;\n\nclass Hydrate\n{\n    /**\n     * @var array\n     */\n    protected $attributes;\n\n    /**\n     * @param array $attributes\n     */\n    public function __construct(array $attributes)\n    {\n        $this->attributes = $attributes;\n    }\n\n    /**\n     * @return array\n     */\n    public function handle()\n    {\n        $app = $this->createsApplication()->shouldntDelegate();\n\n        foreach ($this->attributes['identifiers'] as $identifier) {\n            $app = $app->$identifier;\n        }\n\n        return call_user_func_array([$app, $this->attributes['method']], $this->attributes['arguments']);\n    }\n\n    /**\n     * @return \\EasyWeChat\\Kernel\\ServiceContainer\n     */\n    protected function createsApplication()\n    {\n        $application = $this->attributes['application'];\n\n        if ($application === EasyWeChat\\OpenPlatform\\Authorizer\\OfficialAccount\\Application::class) {\n            return $this->createsOpenPlatformApplication('officialAccount');\n        }\n\n        if ($application === EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Application::class) {\n            return $this->createsOpenPlatformApplication('miniProgram');\n        }\n\n        return new $application($this->buildConfig($this->attributes['config']));\n    }\n\n    protected function createsOpenPlatformApplication($type)\n    {\n        $config = $this->attributes['config'];\n\n        $authorizerAppId = $config['app_id'];\n\n        $config['app_id'] = $config['component_app_id'];\n\n        return EasyWeChat\\Factory::openPlatform($this->buildConfig($config))->$type($authorizerAppId, $config['refresh_token']);\n    }\n\n    protected function buildConfig(array $config)\n    {\n        $config['response_type'] = DelegationResponse::class;\n\n        return $config;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/EasyWeChat.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer;\n\nuse EasyWeChatComposer\\Delegation\\DelegationOptions;\n\nclass EasyWeChat\n{\n    /**\n     * @var array\n     */\n    protected static $config = [];\n\n    /**\n     * Encryption key.\n     *\n     * @var string\n     */\n    protected static $encryptionKey;\n\n    /**\n     * @param array $config\n     */\n    public static function mergeConfig(array $config)\n    {\n        static::$config = array_merge(static::$config, $config);\n    }\n\n    /**\n     * @return array\n     */\n    public static function config()\n    {\n        return static::$config;\n    }\n\n    /**\n     * Set encryption key.\n     *\n     * @param string $key\n     *\n     * @return static\n     */\n    public static function setEncryptionKey(string $key)\n    {\n        static::$encryptionKey = $key;\n\n        return new static();\n    }\n\n    /**\n     * Get encryption key.\n     *\n     * @return string\n     */\n    public static function getEncryptionKey(): string\n    {\n        return static::$encryptionKey;\n    }\n\n    /**\n     * @return \\EasyWeChatComposer\\Delegation\\DelegationOptions\n     */\n    public static function withDelegation()\n    {\n        return new DelegationOptions();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Encryption/DefaultEncrypter.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Encryption;\n\nuse EasyWeChatComposer\\Contracts\\Encrypter;\nuse EasyWeChatComposer\\Exceptions\\DecryptException;\nuse EasyWeChatComposer\\Exceptions\\EncryptException;\n\nclass DefaultEncrypter implements Encrypter\n{\n    /**\n     * @var string\n     */\n    protected $key;\n\n    /**\n     * @var string\n     */\n    protected $cipher;\n\n    /**\n     * @param string $key\n     * @param string $cipher\n     */\n    public function __construct($key, $cipher = 'AES-256-CBC')\n    {\n        $this->key = $key;\n        $this->cipher = $cipher;\n    }\n\n    /**\n     * Encrypt the given value.\n     *\n     * @param string $value\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChatComposer\\Exceptions\\EncryptException\n     */\n    public function encrypt($value)\n    {\n        $iv = random_bytes(openssl_cipher_iv_length($this->cipher));\n\n        $value = openssl_encrypt($value, $this->cipher, $this->key, 0, $iv);\n\n        if ($value === false) {\n            throw new EncryptException('Could not encrypt the data.');\n        }\n\n        $iv = base64_encode($iv);\n\n        return base64_encode(json_encode(compact('iv', 'value')));\n    }\n\n    /**\n     * Decrypt the given value.\n     *\n     * @param string $payload\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChatComposer\\Exceptions\\DecryptException\n     */\n    public function decrypt($payload)\n    {\n        $payload = json_decode(base64_decode($payload), true);\n\n        $iv = base64_decode($payload['iv']);\n\n        $decrypted = openssl_decrypt($payload['value'], $this->cipher, $this->key, 0, $iv);\n\n        if ($decrypted === false) {\n            throw new DecryptException('Could not decrypt the data.');\n        }\n\n        return $decrypted;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Exceptions/DecryptException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Exceptions;\n\nuse Exception;\n\nclass DecryptException extends Exception\n{\n    //\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Exceptions/DelegationException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Exceptions;\n\nuse Exception;\n\nclass DelegationException extends Exception\n{\n    /**\n     * @var string\n     */\n    protected $exception;\n\n    /**\n     * @param string $exception\n     */\n    public function setException($exception)\n    {\n        $this->exception = $exception;\n\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getException()\n    {\n        return $this->exception;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Exceptions/EncryptException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Exceptions;\n\nuse Exception;\n\nclass EncryptException extends Exception\n{\n    //\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Extension.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer;\n\nuse EasyWeChat\\Kernel\\Contracts\\EventHandlerInterface;\nuse Pimple\\Container;\nuse ReflectionClass;\n\nclass Extension\n{\n    /**\n     * @var \\Pimple\\Container\n     */\n    protected $app;\n\n    /**\n     * @var string\n     */\n    protected $manifestPath;\n\n    /**\n     * @var array|null\n     */\n    protected $manifest;\n\n    /**\n     * @param \\Pimple\\Container $app\n     */\n    public function __construct(Container $app)\n    {\n        $this->app = $app;\n        $this->manifestPath = __DIR__.'/../extensions.php';\n    }\n\n    /**\n     * Get observers.\n     *\n     * @return array\n     */\n    public function observers(): array\n    {\n        if ($this->shouldIgnore()) {\n            return [];\n        }\n\n        $observers = [];\n\n        foreach ($this->getManifest() as $name => $extra) {\n            $observers = array_merge($observers, $extra['observers'] ?? []);\n        }\n\n        return array_map([$this, 'listObserver'], array_filter($observers, [$this, 'validateObserver']));\n    }\n\n    /**\n     * @param mixed $observer\n     *\n     * @return bool\n     */\n    protected function isDisable($observer): bool\n    {\n        return in_array($observer, $this->app->config->get('disable_observers', []));\n    }\n\n    /**\n     * Get the observers should be ignore.\n     *\n     * @return bool\n     */\n    protected function shouldIgnore(): bool\n    {\n        return !file_exists($this->manifestPath) || $this->isDisable('*');\n    }\n\n    /**\n     * Validate the given observer.\n     *\n     * @param mixed $observer\n     *\n     * @return bool\n     *\n     * @throws \\ReflectionException\n     */\n    protected function validateObserver($observer): bool\n    {\n        return !$this->isDisable($observer)\n            && (new ReflectionClass($observer))->implementsInterface(EventHandlerInterface::class)\n            && $this->accessible($observer);\n    }\n\n    /**\n     * Determine whether the given observer is accessible.\n     *\n     * @param string $observer\n     *\n     * @return bool\n     */\n    protected function accessible($observer): bool\n    {\n        if (!method_exists($observer, 'getAccessor')) {\n            return true;\n        }\n\n        return in_array(get_class($this->app), (array) $observer::getAccessor());\n    }\n\n    /**\n     * @param mixed $observer\n     *\n     * @return array\n     */\n    protected function listObserver($observer): array\n    {\n        $condition = method_exists($observer, 'onCondition') ? $observer::onCondition() : '*';\n\n        return [$observer, $condition];\n    }\n\n    /**\n     * Get the easywechat manifest.\n     *\n     * @return array\n     */\n    protected function getManifest(): array\n    {\n        if (!is_null($this->manifest)) {\n            return $this->manifest;\n        }\n\n        return $this->manifest = file_exists($this->manifestPath) ? require $this->manifestPath : [];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Http/DelegationResponse.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Http;\n\nclass DelegationResponse extends Response\n{\n    /**\n     * @return string\n     */\n    public function getBodyContents()\n    {\n        return $this->response->getBodyContents();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Http/Response.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Http;\n\nuse EasyWeChat\\Kernel\\Contracts\\Arrayable;\nuse EasyWeChat\\Kernel\\Http\\Response as HttpResponse;\nuse JsonSerializable;\n\nclass Response implements Arrayable, JsonSerializable\n{\n    /**\n     * @var \\EasyWeChat\\Kernel\\Http\\Response\n     */\n    protected $response;\n\n    /**\n     * @var array\n     */\n    protected $array;\n\n    /**\n     * @param \\EasyWeChat\\Kernel\\Http\\Response $response\n     */\n    public function __construct(HttpResponse $response)\n    {\n        $this->response = $response;\n    }\n\n    /**\n     * @see \\ArrayAccess::offsetExists\n     *\n     * @param string $offset\n     *\n     * @return bool\n     */\n    public function offsetExists($offset)\n    {\n        return isset($this->toArray()[$offset]);\n    }\n\n    /**\n     * @see \\ArrayAccess::offsetGet\n     *\n     * @param string $offset\n     *\n     * @return mixed\n     */\n    public function offsetGet($offset)\n    {\n        return $this->toArray()[$offset] ?? null;\n    }\n\n    /**\n     * @see \\ArrayAccess::offsetSet\n     *\n     * @param string $offset\n     * @param mixed  $value\n     */\n    public function offsetSet($offset, $value)\n    {\n        //\n    }\n\n    /**\n     * @see \\ArrayAccess::offsetUnset\n     *\n     * @param string $offset\n     */\n    public function offsetUnset($offset)\n    {\n        //\n    }\n\n    /**\n     * Get the instance as an array.\n     *\n     * @return array\n     */\n    public function toArray()\n    {\n        return $this->array ?: $this->array = $this->response->toArray();\n    }\n\n    /**\n     * Convert the object into something JSON serializable.\n     *\n     * @return array\n     */\n    public function jsonSerialize()\n    {\n        return $this->toArray();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Laravel/Http/Controllers/DelegatesController.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Laravel\\Http\\Controllers;\n\nuse EasyWeChatComposer\\Delegation\\Hydrate;\nuse EasyWeChatComposer\\Encryption\\DefaultEncrypter;\nuse Illuminate\\Http\\Request;\nuse Throwable;\n\nclass DelegatesController\n{\n    /**\n     * @param \\Illuminate\\Http\\Request                        $request\n     * @param \\EasyWeChatComposer\\Encryption\\DefaultEncrypter $encrypter\n     *\n     * @return \\Illuminate\\Http\\Response\n     */\n    public function __invoke(Request $request, DefaultEncrypter $encrypter)\n    {\n        try {\n            $data = json_decode($encrypter->decrypt($request->get('encrypted')), true);\n\n            $hydrate = new Hydrate($data);\n\n            $response = $hydrate->handle();\n\n            return response()->json([\n                'response_type' => get_class($response),\n                'response' => $encrypter->encrypt($response->getBodyContents()),\n            ]);\n        } catch (Throwable $t) {\n            return [\n                'exception' => get_class($t),\n                'message' => $t->getMessage(),\n            ];\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Laravel/ServiceProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Laravel;\n\nuse EasyWeChatComposer\\EasyWeChat;\nuse EasyWeChatComposer\\Encryption\\DefaultEncrypter;\nuse Illuminate\\Foundation\\Application;\nuse Illuminate\\Support\\Arr;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Illuminate\\Support\\Facades\\Route;\nuse Illuminate\\Support\\ServiceProvider as LaravelServiceProvider;\nuse RuntimeException;\n\nclass ServiceProvider extends LaravelServiceProvider\n{\n    /**\n     * Bootstrap any application services.\n     */\n    public function boot()\n    {\n        $this->registerRoutes();\n        $this->publishes([\n            __DIR__.'/config.php' => config_path('easywechat-composer.php'),\n        ]);\n\n        EasyWeChat::setEncryptionKey(\n            $defaultKey = $this->getKey()\n        );\n\n        EasyWeChat::withDelegation()\n                    ->toHost($this->config('delegation.host'))\n                    ->ability($this->config('delegation.enabled'));\n\n        $this->app->when(DefaultEncrypter::class)->needs('$key')->give($defaultKey);\n    }\n\n    /**\n     * Register routes.\n     */\n    protected function registerRoutes()\n    {\n        Route::prefix('easywechat-composer')->namespace('EasyWeChatComposer\\Laravel\\Http\\Controllers')->group(function () {\n            $this->loadRoutesFrom(__DIR__.'/routes.php');\n        });\n    }\n\n    /**\n     * Register any application services.\n     */\n    public function register()\n    {\n        $this->configure();\n    }\n\n    /**\n     * Register config.\n     */\n    protected function configure()\n    {\n        $this->mergeConfigFrom(\n            __DIR__.'/config.php', 'easywechat-composer'\n        );\n    }\n\n    /**\n     * Get the specified configuration value.\n     *\n     * @param string|null $key\n     * @param mixed       $default\n     *\n     * @return mixed\n     */\n    protected function config($key = null, $default = null)\n    {\n        $config = $this->app['config']->get('easywechat-composer');\n\n        if (is_null($key)) {\n            return $config;\n        }\n\n        return Arr::get($config, $key, $default);\n    }\n\n    /**\n     * @return string\n     */\n    protected function getKey()\n    {\n        return $this->config('encryption.key') ?: $this->getMd5Key();\n    }\n\n    /**\n     * @return string\n     */\n    protected function getMd5Key()\n    {\n        $ttl = (version_compare(Application::VERSION, '5.8') === -1) ? 30 : 1800;\n\n        return Cache::remember('easywechat-composer.encryption_key', $ttl, function () {\n            throw_unless(file_exists($path = base_path('composer.lock')), RuntimeException::class, 'No encryption key provided.');\n\n            return md5_file($path);\n        });\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Laravel/config.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) mingyoung <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nreturn [\n\n    'encryption' => [\n\n        'key' => env('EASYWECHAT_KEY'),\n\n    ],\n\n    'delegation' => [\n\n        'enabled' => env('EASYWECHAT_DELEGATION', false),\n\n        'host' => env('EASYWECHAT_DELEGATION_HOST'),\n    ],\n\n];\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Laravel/routes.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nuse Illuminate\\Support\\Facades\\Route;\n\nRoute::post('delegate', 'DelegatesController');\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/ManifestManager.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer;\n\nuse Composer\\Plugin\\PluginInterface;\n\nclass ManifestManager\n{\n    const PACKAGE_TYPE = 'easywechat-extension';\n\n    const EXTRA_OBSERVER = 'observers';\n\n    /**\n     * The vendor path.\n     *\n     * @var string\n     */\n    protected $vendorPath;\n\n    /**\n     * The manifest path.\n     *\n     * @var string\n     */\n    protected $manifestPath;\n\n    /**\n     * @param string      $vendorPath\n     * @param string|null $manifestPath\n     */\n    public function __construct(string $vendorPath, string $manifestPath = null)\n    {\n        $this->vendorPath = $vendorPath;\n        $this->manifestPath = $manifestPath ?: $vendorPath.'/easywechat-composer/easywechat-composer/extensions.php';\n    }\n\n    /**\n     * Remove manifest file.\n     *\n     * @return $this\n     */\n    public function unlink()\n    {\n        if (file_exists($this->manifestPath)) {\n            @unlink($this->manifestPath);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Build the manifest file.\n     */\n    public function build()\n    {\n        $packages = [];\n\n        if (file_exists($installed = $this->vendorPath.'/composer/installed.json')) {\n            $packages = json_decode(file_get_contents($installed), true);\n            if (version_compare(PluginInterface::PLUGIN_API_VERSION, '2.0.0', 'ge')) {\n                $packages = $packages['packages'];\n            }\n        }\n\n        $this->write($this->map($packages));\n    }\n\n    /**\n     * @param array $packages\n     *\n     * @return array\n     */\n    protected function map(array $packages): array\n    {\n        $manifest = [];\n\n        $packages = array_filter($packages, function ($package) {\n            if(isset($package['type'])){\n                return $package['type'] === self::PACKAGE_TYPE;\n            }\n        });\n\n        foreach ($packages as $package) {\n            $manifest[$package['name']] = [self::EXTRA_OBSERVER => $package['extra'][self::EXTRA_OBSERVER] ?? []];\n        }\n\n        return $manifest;\n    }\n\n    /**\n     * Write the manifest array to a file.\n     *\n     * @param array $manifest\n     */\n    protected function write(array $manifest)\n    {\n        file_put_contents(\n            $this->manifestPath,\n            '<?php return '.var_export($manifest, true).';'\n        );\n\n        $this->invalidate($this->manifestPath);\n    }\n\n    /**\n     * Invalidate the given file.\n     *\n     * @param string $file\n     */\n    protected function invalidate($file)\n    {\n        if (function_exists('opcache_invalidate')) {\n            @opcache_invalidate($file, true);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Plugin.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer;\n\nuse Composer\\Composer;\nuse Composer\\EventDispatcher\\EventSubscriberInterface;\nuse Composer\\Installer\\PackageEvent;\nuse Composer\\Installer\\PackageEvents;\nuse Composer\\IO\\IOInterface;\nuse Composer\\Plugin\\Capable;\nuse Composer\\Plugin\\PluginInterface;\nuse Composer\\Script\\Event;\nuse Composer\\Script\\ScriptEvents;\n\nclass Plugin implements PluginInterface, EventSubscriberInterface, Capable\n{\n    /**\n     * @var bool\n     */\n    protected $activated = true;\n\n    /**\n     * Apply plugin modifications to Composer.\n     */\n    public function activate(Composer $composer, IOInterface $io)\n    {\n        //\n    }\n\n    /**\n     * Remove any hooks from Composer.\n     *\n     * This will be called when a plugin is deactivated before being\n     * uninstalled, but also before it gets upgraded to a new version\n     * so the old one can be deactivated and the new one activated.\n     */\n    public function deactivate(Composer $composer, IOInterface $io)\n    {\n        //\n    }\n\n    /**\n     * Prepare the plugin to be uninstalled.\n     *\n     * This will be called after deactivate.\n     */\n    public function uninstall(Composer $composer, IOInterface $io)\n    {\n    }\n\n    /**\n     * @return array\n     */\n    public function getCapabilities()\n    {\n        return [\n            'Composer\\Plugin\\Capability\\CommandProvider' => 'EasyWeChatComposer\\Commands\\Provider',\n        ];\n    }\n\n    /**\n     * Listen events.\n     *\n     * @return array\n     */\n    public static function getSubscribedEvents()\n    {\n        return [\n            PackageEvents::PRE_PACKAGE_UNINSTALL => 'prePackageUninstall',\n            ScriptEvents::POST_AUTOLOAD_DUMP => 'postAutoloadDump',\n        ];\n    }\n\n    /**\n     * @param \\Composer\\Installer\\PackageEvent\n     */\n    public function prePackageUninstall(PackageEvent $event)\n    {\n        if ($event->getOperation()->getPackage()->getName() === 'overtrue/wechat') {\n            $this->activated = false;\n        }\n    }\n\n    public function postAutoloadDump(Event $event)\n    {\n        if (!$this->activated) {\n            return;\n        }\n\n        $manifest = new ManifestManager(\n            rtrim($event->getComposer()->getConfig()->get('vendor-dir'), '/')\n        );\n\n        $manifest->unlink()->build();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Traits/MakesHttpRequests.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Traits;\n\nuse EasyWeChat\\Kernel\\Http\\StreamResponse;\nuse EasyWeChat\\Kernel\\Traits\\ResponseCastable;\nuse EasyWeChatComposer\\Contracts\\Encrypter;\nuse EasyWeChatComposer\\EasyWeChat;\nuse EasyWeChatComposer\\Encryption\\DefaultEncrypter;\nuse EasyWeChatComposer\\Exceptions\\DelegationException;\nuse GuzzleHttp\\Client;\nuse GuzzleHttp\\ClientInterface;\n\ntrait MakesHttpRequests\n{\n    use ResponseCastable;\n\n    /**\n     * @var \\GuzzleHttp\\ClientInterface\n     */\n    protected $httpClient;\n\n    /**\n     * @var \\EasyWeChatComposer\\Contracts\\Encrypter\n     */\n    protected $encrypter;\n\n    /**\n     * @param string $endpoint\n     * @param array  $payload\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function request($endpoint, array $payload)\n    {\n        $response = $this->getHttpClient()->request('POST', $endpoint, [\n            'form_params' => $this->buildFormParams($payload),\n        ]);\n\n        $parsed = $this->parseResponse($response);\n\n        return $this->detectAndCastResponseToType(\n            $this->getEncrypter()->decrypt($parsed['response']),\n            ($parsed['response_type'] === StreamResponse::class) ? 'raw' : $this->app['config']['response_type']\n        );\n    }\n\n    /**\n     * @param array $payload\n     *\n     * @return array\n     */\n    protected function buildFormParams($payload)\n    {\n        return [\n            'encrypted' => $this->getEncrypter()->encrypt(json_encode($payload)),\n        ];\n    }\n\n    /**\n     * @param \\Psr\\Http\\Message\\ResponseInterface $response\n     *\n     * @return array\n     */\n    protected function parseResponse($response)\n    {\n        $result = json_decode((string) $response->getBody(), true);\n\n        if (isset($result['exception'])) {\n            throw (new DelegationException($result['message']))->setException($result['exception']);\n        }\n\n        return $result;\n    }\n\n    /**\n     * @return \\GuzzleHttp\\ClientInterface\n     */\n    protected function getHttpClient(): ClientInterface\n    {\n        return $this->httpClient ?: $this->httpClient = new Client([\n            'base_uri' => $this->app['config']['delegation']['host'],\n        ]);\n    }\n\n    /**\n     * @return \\EasyWeChatComposer\\Contracts\\Encrypter\n     */\n    protected function getEncrypter(): Encrypter\n    {\n        return $this->encrypter ?: $this->encrypter = new DefaultEncrypter(\n            EasyWeChat::getEncryptionKey()\n        );\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/src/Traits/WithAggregator.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Traits;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChatComposer\\Delegation\\DelegationTo;\nuse EasyWeChatComposer\\EasyWeChat;\n\ntrait WithAggregator\n{\n    /**\n     * Aggregate.\n     */\n    protected function aggregate()\n    {\n        foreach (EasyWeChat::config() as $key => $value) {\n            $this['config']->set($key, $value);\n        }\n    }\n\n    /**\n     * @return bool\n     */\n    public function shouldDelegate($id)\n    {\n        return $this['config']->get('delegation.enabled')\n            && $this->offsetGet($id) instanceof BaseClient;\n    }\n\n    /**\n     * @return $this\n     */\n    public function shouldntDelegate()\n    {\n        $this['config']->set('delegation.enabled', false);\n\n        return $this;\n    }\n\n    /**\n     * @param string $id\n     *\n     * @return \\EasyWeChatComposer\\Delegation\n     */\n    public function delegateTo($id)\n    {\n        return new DelegationTo($this, $id);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/easywechat-composer/easywechat-composer/tests/ManifestManagerTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the EasyWeChatComposer.\n *\n * (c) 张铭阳 <mingyoungcheung@gmail.com>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChatComposer\\Tests;\n\nuse EasyWeChatComposer\\ManifestManager;\nuse PHPUnit\\Framework\\TestCase;\n\nclass ManifestManagerTest extends TestCase\n{\n    private $vendorPath;\n    private $manifestPath;\n\n    protected function getManifestManager()\n    {\n        return new ManifestManager(\n            $this->vendorPath = __DIR__.'/__fixtures__/vendor/',\n            $this->manifestPath = __DIR__.'/__fixtures__/extensions.php'\n        );\n    }\n\n    public function testUnlink()\n    {\n        $this->assertInstanceOf(ManifestManager::class, $this->getManifestManager()->unlink());\n        $this->assertFalse(file_exists($this->manifestPath));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/CHANGELOG.md",
    "content": "# Change Log\n\nPlease refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version.\n\n\n## 7.8.1 - 2023-12-03\n\n### Changed\n\n- Updated links in docs to their canonical versions\n- Replaced `call_user_func*` with native calls\n\n\n## 7.8.0 - 2023-08-27\n\n### Added\n\n- Support for PHP 8.3\n- Added automatic closing of handles on `CurlFactory` object destruction\n\n\n## 7.7.1 - 2023-08-27\n\n### Changed\n\n- Remove the need for `AllowDynamicProperties` in `CurlMultiHandler`\n\n\n## 7.7.0 - 2023-05-21\n\n### Added\n\n- Support `guzzlehttp/promises` v2\n\n\n## 7.6.1 - 2023-05-15\n\n### Fixed\n\n- Fix `SetCookie::fromString` MaxAge deprecation warning and skip invalid MaxAge values\n\n\n## 7.6.0 - 2023-05-14\n\n### Added\n\n- Support for setting the minimum TLS version in a unified way\n- Apply on request the version set in options parameters\n\n\n## 7.5.2 - 2023-05-14\n\n### Fixed\n\n- Fixed set cookie constructor validation\n- Fixed handling of files with `'0'` body\n\n### Changed\n\n- Corrected docs and default connect timeout value to 300 seconds\n\n\n## 7.5.1 - 2023-04-17\n\n### Fixed\n\n- Fixed `NO_PROXY` settings so that setting the `proxy` option to `no` overrides the env variable\n\n### Changed\n\n- Adjusted `guzzlehttp/psr7` version constraint to `^1.9.1 || ^2.4.5`\n\n\n## 7.5.0 - 2022-08-28\n\n### Added\n\n- Support PHP 8.2\n- Add request to delay closure params\n\n\n## 7.4.5 - 2022-06-20\n\n### Fixed\n\n* Fix change in port should be considered a change in origin\n* Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin\n\n\n## 7.4.4 - 2022-06-09\n\n### Fixed\n\n* Fix failure to strip Authorization header on HTTP downgrade\n* Fix failure to strip the Cookie header on change in host or HTTP downgrade\n\n\n## 7.4.3 - 2022-05-25\n\n### Fixed\n\n* Fix cross-domain cookie leakage\n\n\n## 7.4.2 - 2022-03-20\n\n### Fixed\n\n- Remove curl auth on cross-domain redirects to align with the Authorization HTTP header\n- Reject non-HTTP schemes in StreamHandler\n- Set a default ssl.peer_name context in StreamHandler to allow `force_ip_resolve`\n\n\n## 7.4.1 - 2021-12-06\n\n### Changed\n\n- Replaced implicit URI to string coercion [#2946](https://github.com/guzzle/guzzle/pull/2946)\n- Allow `symfony/deprecation-contracts` version 3 [#2961](https://github.com/guzzle/guzzle/pull/2961)\n\n### Fixed\n\n- Only close curl handle if it's done [#2950](https://github.com/guzzle/guzzle/pull/2950)\n\n\n## 7.4.0 - 2021-10-18\n\n### Added\n\n- Support PHP 8.1 [#2929](https://github.com/guzzle/guzzle/pull/2929), [#2939](https://github.com/guzzle/guzzle/pull/2939)\n- Support `psr/log` version 2 and 3 [#2943](https://github.com/guzzle/guzzle/pull/2943)\n\n### Fixed\n\n- Make sure we always call `restore_error_handler()` [#2915](https://github.com/guzzle/guzzle/pull/2915)\n- Fix progress parameter type compatibility between the cURL and stream handlers [#2936](https://github.com/guzzle/guzzle/pull/2936)\n- Throw `InvalidArgumentException` when an incorrect `headers` array is provided [#2916](https://github.com/guzzle/guzzle/pull/2916), [#2942](https://github.com/guzzle/guzzle/pull/2942)\n\n### Changed\n\n- Be more strict with types [#2914](https://github.com/guzzle/guzzle/pull/2914), [#2917](https://github.com/guzzle/guzzle/pull/2917), [#2919](https://github.com/guzzle/guzzle/pull/2919), [#2945](https://github.com/guzzle/guzzle/pull/2945)\n\n\n## 7.3.0 - 2021-03-23\n\n### Added\n\n- Support for DER and P12 certificates [#2413](https://github.com/guzzle/guzzle/pull/2413)\n- Support the cURL (http://) scheme for StreamHandler proxies [#2850](https://github.com/guzzle/guzzle/pull/2850)\n- Support for `guzzlehttp/psr7:^2.0` [#2878](https://github.com/guzzle/guzzle/pull/2878)\n\n### Fixed\n\n- Handle exceptions on invalid header consistently between PHP versions and handlers [#2872](https://github.com/guzzle/guzzle/pull/2872)\n\n\n## 7.2.0 - 2020-10-10\n\n### Added\n\n- Support for PHP 8 [#2712](https://github.com/guzzle/guzzle/pull/2712), [#2715](https://github.com/guzzle/guzzle/pull/2715), [#2789](https://github.com/guzzle/guzzle/pull/2789)\n- Support passing a body summarizer to the http errors middleware [#2795](https://github.com/guzzle/guzzle/pull/2795)\n\n### Fixed\n\n- Handle exceptions during response creation [#2591](https://github.com/guzzle/guzzle/pull/2591)\n- Fix CURLOPT_ENCODING not to be overwritten [#2595](https://github.com/guzzle/guzzle/pull/2595)\n- Make sure the Request always has a body object [#2804](https://github.com/guzzle/guzzle/pull/2804)\n\n### Changed\n\n- The `TooManyRedirectsException` has a response [#2660](https://github.com/guzzle/guzzle/pull/2660)\n- Avoid \"functions\" from dependencies [#2712](https://github.com/guzzle/guzzle/pull/2712)\n\n### Deprecated\n\n- Using environment variable GUZZLE_CURL_SELECT_TIMEOUT [#2786](https://github.com/guzzle/guzzle/pull/2786)\n\n\n## 7.1.1 - 2020-09-30\n\n### Fixed\n\n- Incorrect EOF detection for response body streams on Windows.\n\n### Changed\n\n- We dont connect curl `sink` on HEAD requests.\n- Removed some PHP 5 workarounds\n\n\n## 7.1.0 - 2020-09-22\n\n### Added\n\n- `GuzzleHttp\\MessageFormatterInterface`\n\n### Fixed\n\n- Fixed issue that caused cookies with no value not to be stored.\n- On redirects, we allow all safe methods like GET, HEAD and OPTIONS.\n- Fixed logging on empty responses.\n- Make sure MessageFormatter::format returns string\n\n### Deprecated\n\n- All functions in `GuzzleHttp` has been deprecated. Use static methods on `Utils` instead.\n- `ClientInterface::getConfig()`\n- `Client::getConfig()`\n- `Client::__call()`\n- `Utils::defaultCaBundle()`\n- `CurlFactory::LOW_CURL_VERSION_NUMBER`\n\n\n## 7.0.1 - 2020-06-27\n\n* Fix multiply defined functions fatal error [#2699](https://github.com/guzzle/guzzle/pull/2699)\n\n\n## 7.0.0 - 2020-06-27\n\nNo changes since 7.0.0-rc1.\n\n\n## 7.0.0-rc1 - 2020-06-15\n\n### Changed\n\n* Use error level for logging errors in Middleware [#2629](https://github.com/guzzle/guzzle/pull/2629)\n* Disabled IDN support by default and require ext-intl to use it [#2675](https://github.com/guzzle/guzzle/pull/2675)\n\n\n## 7.0.0-beta2 - 2020-05-25\n\n### Added\n\n* Using `Utils` class instead of functions in the `GuzzleHttp` namespace. [#2546](https://github.com/guzzle/guzzle/pull/2546)\n* `ClientInterface::MAJOR_VERSION` [#2583](https://github.com/guzzle/guzzle/pull/2583)\n\n### Changed\n\n* Avoid the `getenv` function when unsafe [#2531](https://github.com/guzzle/guzzle/pull/2531)\n* Added real client methods [#2529](https://github.com/guzzle/guzzle/pull/2529)\n* Avoid functions due to global install conflicts [#2546](https://github.com/guzzle/guzzle/pull/2546)\n* Use Symfony intl-idn polyfill [#2550](https://github.com/guzzle/guzzle/pull/2550)\n* Adding methods for HTTP verbs like `Client::get()`, `Client::head()`, `Client::patch()` etc [#2529](https://github.com/guzzle/guzzle/pull/2529)\n* `ConnectException` extends `TransferException` [#2541](https://github.com/guzzle/guzzle/pull/2541)\n* Updated the default User Agent to \"GuzzleHttp/7\" [#2654](https://github.com/guzzle/guzzle/pull/2654)\n\n### Fixed\n\n* Various intl icu issues [#2626](https://github.com/guzzle/guzzle/pull/2626)\n\n### Removed\n\n* Pool option `pool_size` [#2528](https://github.com/guzzle/guzzle/pull/2528)\n\n\n## 7.0.0-beta1 - 2019-12-30\n\nThe diff might look very big but 95% of Guzzle users will be able to upgrade without modification.\nPlease see [the upgrade document](UPGRADING.md) that describes all BC breaking changes.\n\n### Added\n\n* Implement PSR-18 and dropped PHP 5 support [#2421](https://github.com/guzzle/guzzle/pull/2421) [#2474](https://github.com/guzzle/guzzle/pull/2474)\n* PHP 7 types [#2442](https://github.com/guzzle/guzzle/pull/2442) [#2449](https://github.com/guzzle/guzzle/pull/2449) [#2466](https://github.com/guzzle/guzzle/pull/2466) [#2497](https://github.com/guzzle/guzzle/pull/2497) [#2499](https://github.com/guzzle/guzzle/pull/2499)\n* IDN support for redirects [2424](https://github.com/guzzle/guzzle/pull/2424)\n\n### Changed\n\n* Dont allow passing null as third argument to `BadResponseException::__construct()` [#2427](https://github.com/guzzle/guzzle/pull/2427)\n* Use SAPI constant instead of method call [#2450](https://github.com/guzzle/guzzle/pull/2450)\n* Use native function invocation [#2444](https://github.com/guzzle/guzzle/pull/2444)\n* Better defaults for PHP installations with old ICU lib [2454](https://github.com/guzzle/guzzle/pull/2454)\n* Added visibility to all constants [#2462](https://github.com/guzzle/guzzle/pull/2462)\n* Dont allow passing `null` as URI to `Client::request()` and `Client::requestAsync()` [#2461](https://github.com/guzzle/guzzle/pull/2461)\n* Widen the exception argument to throwable [#2495](https://github.com/guzzle/guzzle/pull/2495)\n\n### Fixed\n\n* Logging when Promise rejected with a string [#2311](https://github.com/guzzle/guzzle/pull/2311)\n\n### Removed\n\n* Class `SeekException` [#2162](https://github.com/guzzle/guzzle/pull/2162)\n* `RequestException::getResponseBodySummary()` [#2425](https://github.com/guzzle/guzzle/pull/2425)\n* `CookieJar::getCookieValue()` [#2433](https://github.com/guzzle/guzzle/pull/2433)\n* `uri_template()` and `UriTemplate` [#2440](https://github.com/guzzle/guzzle/pull/2440)\n* Request options `save_to` and `exceptions` [#2464](https://github.com/guzzle/guzzle/pull/2464)\n\n\n## 6.5.2 - 2019-12-23\n\n* idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489)\n\n\n## 6.5.1 - 2019-12-21\n\n* Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454)\n* IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424)\n\n\n## 6.5.0 - 2019-12-07\n\n* Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143)\n* Improvement: Added support to pass arbitrary options to `curl_multi_init`. [#2287](https://github.com/guzzle/guzzle/pull/2287)\n* Fix: Gracefully handle passing `null` to the `header` option. [#2132](https://github.com/guzzle/guzzle/pull/2132)\n* Fix: `RetryMiddleware` did not do exponential delay between retires due unit mismatch. [#2132](https://github.com/guzzle/guzzle/pull/2132)\n* Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348)\n* Deprecated `ClientInterface::VERSION`\n\n\n## 6.4.1 - 2019-10-23\n\n* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that\n* Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar`\n\n\n## 6.4.0 - 2019-10-23\n\n* Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108)\n* Fix: Test if response is readable before returning a summary in `RequestException::getResponseBodySummary()` [#2081](https://github.com/guzzle/guzzle/pull/2081)\n* Fix: Add support for GUZZLE_CURL_SELECT_TIMEOUT environment variable [#2161](https://github.com/guzzle/guzzle/pull/2161)\n* Improvement: Added `GuzzleHttp\\Exception\\InvalidArgumentException` [#2163](https://github.com/guzzle/guzzle/pull/2163)\n* Improvement: Added `GuzzleHttp\\_current_time()` to use `hrtime()` if that function exists. [#2242](https://github.com/guzzle/guzzle/pull/2242)\n* Improvement: Added curl's `appconnect_time` in `TransferStats` [#2284](https://github.com/guzzle/guzzle/pull/2284)\n* Improvement: Make GuzzleException extend Throwable wherever it's available [#2273](https://github.com/guzzle/guzzle/pull/2273)\n* Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335)\n* Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362)\n\n\n## 6.3.3 - 2018-04-22\n\n* Fix: Default headers when decode_content is specified\n\n\n## 6.3.2 - 2018-03-26\n\n* Fix: Release process\n\n\n## 6.3.1 - 2018-03-26\n\n* Bug fix: Parsing 0 epoch expiry times in cookies [#2014](https://github.com/guzzle/guzzle/pull/2014)\n* Improvement: Better ConnectException detection [#2012](https://github.com/guzzle/guzzle/pull/2012)\n* Bug fix: Malformed domain that contains a \"/\" [#1999](https://github.com/guzzle/guzzle/pull/1999)\n* Bug fix: Undefined offset when a cookie has no first key-value pair [#1998](https://github.com/guzzle/guzzle/pull/1998)\n* Improvement: Support PHPUnit 6 [#1953](https://github.com/guzzle/guzzle/pull/1953)\n* Bug fix: Support empty headers [#1915](https://github.com/guzzle/guzzle/pull/1915)\n* Bug fix: Ignore case during header modifications [#1916](https://github.com/guzzle/guzzle/pull/1916)\n\n+ Minor code cleanups, documentation fixes and clarifications.\n\n\n## 6.3.0 - 2017-06-22\n\n* Feature: force IP resolution (ipv4 or ipv6) [#1608](https://github.com/guzzle/guzzle/pull/1608), [#1659](https://github.com/guzzle/guzzle/pull/1659)\n* Improvement: Don't include summary in exception message when body is empty [#1621](https://github.com/guzzle/guzzle/pull/1621)\n* Improvement: Handle `on_headers` option in MockHandler [#1580](https://github.com/guzzle/guzzle/pull/1580)\n* Improvement: Added SUSE Linux CA path [#1609](https://github.com/guzzle/guzzle/issues/1609)\n* Improvement: Use class reference for getting the name of the class instead of using hardcoded strings [#1641](https://github.com/guzzle/guzzle/pull/1641)\n* Feature: Added `read_timeout` option [#1611](https://github.com/guzzle/guzzle/pull/1611)\n* 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)\n* Deprecation: BadResponseException instantiation without a response [#1642](https://github.com/guzzle/guzzle/pull/1642)\n* Feature: Added NTLM auth [#1569](https://github.com/guzzle/guzzle/pull/1569)\n* Feature: Track redirect HTTP status codes [#1711](https://github.com/guzzle/guzzle/pull/1711)\n* Improvement: Check handler type during construction [#1745](https://github.com/guzzle/guzzle/pull/1745)\n* Improvement: Always include the Content-Length if there's a body [#1721](https://github.com/guzzle/guzzle/pull/1721)\n* Feature: Added convenience method to access a cookie by name [#1318](https://github.com/guzzle/guzzle/pull/1318)\n* Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684)\n* Improvement:  \tUse `\\GuzzleHttp\\Promise\\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827)\n\n+ Minor code cleanups, documentation fixes and clarifications.\n\n\n## 6.2.3 - 2017-02-28\n\n* Fix deprecations with guzzle/psr7 version 1.4\n\n\n## 6.2.2 - 2016-10-08\n\n* Allow to pass nullable Response to delay callable\n* Only add scheme when host is present\n* Fix drain case where content-length is the literal string zero\n* Obfuscate in-URL credentials in exceptions\n\n\n## 6.2.1 - 2016-07-18\n\n* Address HTTP_PROXY security vulnerability, CVE-2016-5385:\n  https://httpoxy.org/\n* Fixing timeout bug with StreamHandler:\n  https://github.com/guzzle/guzzle/pull/1488\n* Only read up to `Content-Length` in PHP StreamHandler to avoid timeouts when\n  a server does not honor `Connection: close`.\n* Ignore URI fragment when sending requests.\n\n\n## 6.2.0 - 2016-03-21\n\n* Feature: added `GuzzleHttp\\json_encode` and `GuzzleHttp\\json_decode`.\n  https://github.com/guzzle/guzzle/pull/1389\n* Bug fix: Fix sleep calculation when waiting for delayed requests.\n  https://github.com/guzzle/guzzle/pull/1324\n* Feature: More flexible history containers.\n  https://github.com/guzzle/guzzle/pull/1373\n* Bug fix: defer sink stream opening in StreamHandler.\n  https://github.com/guzzle/guzzle/pull/1377\n* Bug fix: do not attempt to escape cookie values.\n  https://github.com/guzzle/guzzle/pull/1406\n* Feature: report original content encoding and length on decoded responses.\n  https://github.com/guzzle/guzzle/pull/1409\n* Bug fix: rewind seekable request bodies before dispatching to cURL.\n  https://github.com/guzzle/guzzle/pull/1422\n* Bug fix: provide an empty string to `http_build_query` for HHVM workaround.\n  https://github.com/guzzle/guzzle/pull/1367\n\n\n## 6.1.1 - 2015-11-22\n\n* Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler\n  https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f63e4e4\n* Feature: HandlerStack is now more generic.\n  https://github.com/guzzle/guzzle/commit/f2102941331cda544745eedd97fc8fd46e1ee33e\n* Bug fix: setting verify to false in the StreamHandler now disables peer\n  verification. https://github.com/guzzle/guzzle/issues/1256\n* Feature: Middleware now uses an exception factory, including more error\n  context. https://github.com/guzzle/guzzle/pull/1282\n* Feature: better support for disabled functions.\n  https://github.com/guzzle/guzzle/pull/1287\n* Bug fix: fixed regression where MockHandler was not using `sink`.\n  https://github.com/guzzle/guzzle/pull/1292\n\n\n## 6.1.0 - 2015-09-08\n\n* Feature: Added the `on_stats` request option to provide access to transfer\n  statistics for requests. https://github.com/guzzle/guzzle/pull/1202\n* Feature: Added the ability to persist session cookies in CookieJars.\n  https://github.com/guzzle/guzzle/pull/1195\n* Feature: Some compatibility updates for Google APP Engine\n  https://github.com/guzzle/guzzle/pull/1216\n* Feature: Added support for NO_PROXY to prevent the use of a proxy based on\n  a simple set of rules. https://github.com/guzzle/guzzle/pull/1197\n* Feature: Cookies can now contain square brackets.\n  https://github.com/guzzle/guzzle/pull/1237\n* Bug fix: Now correctly parsing `=` inside of quotes in Cookies.\n  https://github.com/guzzle/guzzle/pull/1232\n* Bug fix: Cusotm cURL options now correctly override curl options of the\n  same name. https://github.com/guzzle/guzzle/pull/1221\n* Bug fix: Content-Type header is now added when using an explicitly provided\n  multipart body. https://github.com/guzzle/guzzle/pull/1218\n* Bug fix: Now ignoring Set-Cookie headers that have no name.\n* Bug fix: Reason phrase is no longer cast to an int in some cases in the\n  cURL handler. https://github.com/guzzle/guzzle/pull/1187\n* Bug fix: Remove the Authorization header when redirecting if the Host\n  header changes. https://github.com/guzzle/guzzle/pull/1207\n* Bug fix: Cookie path matching fixes\n  https://github.com/guzzle/guzzle/issues/1129\n* Bug fix: Fixing the cURL `body_as_string` setting\n  https://github.com/guzzle/guzzle/pull/1201\n* Bug fix: quotes are no longer stripped when parsing cookies.\n  https://github.com/guzzle/guzzle/issues/1172\n* Bug fix: `form_params` and `query` now always uses the `&` separator.\n  https://github.com/guzzle/guzzle/pull/1163\n* Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set.\n  https://github.com/guzzle/guzzle/pull/1189\n\n\n## 6.0.2 - 2015-07-04\n\n* Fixed a memory leak in the curl handlers in which references to callbacks\n  were not being removed by `curl_reset`.\n* Cookies are now extracted properly before redirects.\n* Cookies now allow more character ranges.\n* Decoded Content-Encoding responses are now modified to correctly reflect\n  their state if the encoding was automatically removed by a handler. This\n  means that the `Content-Encoding` header may be removed an the\n  `Content-Length` modified to reflect the message size after removing the\n  encoding.\n* Added a more explicit error message when trying to use `form_params` and\n  `multipart` in the same request.\n* Several fixes for HHVM support.\n* Functions are now conditionally required using an additional level of\n  indirection to help with global Composer installations.\n\n\n## 6.0.1 - 2015-05-27\n\n* Fixed a bug with serializing the `query` request option where the `&`\n  separator was missing.\n* Added a better error message for when `body` is provided as an array. Please\n  use `form_params` or `multipart` instead.\n* Various doc fixes.\n\n\n## 6.0.0 - 2015-05-26\n\n* See the UPGRADING.md document for more information.\n* Added `multipart` and `form_params` request options.\n* Added `synchronous` request option.\n* Added the `on_headers` request option.\n* Fixed `expect` handling.\n* No longer adding default middlewares in the client ctor. These need to be\n  present on the provided handler in order to work.\n* Requests are no longer initiated when sending async requests with the\n  CurlMultiHandler. This prevents unexpected recursion from requests completing\n  while ticking the cURL loop.\n* Removed the semantics of setting `default` to `true`. This is no longer\n  required now that the cURL loop is not ticked for async requests.\n* Added request and response logging middleware.\n* No longer allowing self signed certificates when using the StreamHandler.\n* Ensuring that `sink` is valid if saving to a file.\n* Request exceptions now include a \"handler context\" which provides handler\n  specific contextual information.\n* Added `GuzzleHttp\\RequestOptions` to allow request options to be applied\n  using constants.\n* `$maxHandles` has been removed from CurlMultiHandler.\n* `MultipartPostBody` is now part of the `guzzlehttp/psr7` package.\n\n\n## 5.3.0 - 2015-05-19\n\n* Mock now supports `save_to`\n* Marked `AbstractRequestEvent::getTransaction()` as public.\n* Fixed a bug in which multiple headers using different casing would overwrite\n  previous headers in the associative array.\n* Added `Utils::getDefaultHandler()`\n* Marked `GuzzleHttp\\Client::getDefaultUserAgent` as deprecated.\n* URL scheme is now always lowercased.\n\n\n## 6.0.0-beta.1\n\n* Requires PHP >= 5.5\n* Updated to use PSR-7\n  * Requires immutable messages, which basically means an event based system\n    owned by a request instance is no longer possible.\n  * Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7).\n  * Removed the dependency on `guzzlehttp/streams`. These stream abstractions\n    are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\\Psr7`\n    namespace.\n* Added middleware and handler system\n  * Replaced the Guzzle event and subscriber system with a middleware system.\n  * No longer depends on RingPHP, but rather places the HTTP handlers directly\n    in Guzzle, operating on PSR-7 messages.\n  * Retry logic is now encapsulated in `GuzzleHttp\\Middleware::retry`, which\n    means the `guzzlehttp/retry-subscriber` is now obsolete.\n  * Mocking responses is now handled using `GuzzleHttp\\Handler\\MockHandler`.\n* Asynchronous responses\n  * No longer supports the `future` request option to send an async request.\n    Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`,\n    `getAsync`, etc.).\n  * Utilizing `GuzzleHttp\\Promise` instead of React's promise library to avoid\n    recursion required by chaining and forwarding react promises. See\n    https://github.com/guzzle/promises\n  * Added `requestAsync` and `sendAsync` to send request asynchronously.\n  * Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests\n    asynchronously.\n* Request options\n  * POST and form updates\n    * Added the `form_fields` and `form_files` request options.\n    * Removed the `GuzzleHttp\\Post` namespace.\n    * The `body` request option no longer accepts an array for POST requests.\n  * The `exceptions` request option has been deprecated in favor of the\n    `http_errors` request options.\n  * The `save_to` request option has been deprecated in favor of `sink` request\n    option.\n* Clients no longer accept an array of URI template string and variables for\n  URI variables. You will need to expand URI templates before passing them\n  into a client constructor or request method.\n* Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are\n  now magic methods that will send synchronous requests.\n* Replaced `Utils.php` with plain functions in `functions.php`.\n* Removed `GuzzleHttp\\Collection`.\n* Removed `GuzzleHttp\\BatchResults`. Batched pool results are now returned as\n  an array.\n* Removed `GuzzleHttp\\Query`. Query string handling is now handled using an\n  associative array passed into the `query` request option. The query string\n  is serialized using PHP's `http_build_query`. If you need more control, you\n  can pass the query string in as a string.\n* `GuzzleHttp\\QueryParser` has been replaced with the\n  `GuzzleHttp\\Psr7\\parse_query`.\n\n\n## 5.2.0 - 2015-01-27\n\n* Added `AppliesHeadersInterface` to make applying headers to a request based\n  on the body more generic and not specific to `PostBodyInterface`.\n* Reduced the number of stack frames needed to send requests.\n* Nested futures are now resolved in the client rather than the RequestFsm\n* Finishing state transitions is now handled in the RequestFsm rather than the\n  RingBridge.\n* Added a guard in the Pool class to not use recursion for request retries.\n\n\n## 5.1.0 - 2014-12-19\n\n* Pool class no longer uses recursion when a request is intercepted.\n* The size of a Pool can now be dynamically adjusted using a callback.\n  See https://github.com/guzzle/guzzle/pull/943.\n* Setting a request option to `null` when creating a request with a client will\n  ensure that the option is not set. This allows you to overwrite default\n  request options on a per-request basis.\n  See https://github.com/guzzle/guzzle/pull/937.\n* Added the ability to limit which protocols are allowed for redirects by\n  specifying a `protocols` array in the `allow_redirects` request option.\n* Nested futures due to retries are now resolved when waiting for synchronous\n  responses. See https://github.com/guzzle/guzzle/pull/947.\n* `\"0\"` is now an allowed URI path. See\n  https://github.com/guzzle/guzzle/pull/935.\n* `Query` no longer typehints on the `$query` argument in the constructor,\n  allowing for strings and arrays.\n* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle\n  specific exceptions if necessary.\n\n\n## 5.0.3 - 2014-11-03\n\nThis change updates query strings so that they are treated as un-encoded values\nby default where the value represents an un-encoded value to send over the\nwire. A Query object then encodes the value before sending over the wire. This\nmeans that even value query string values (e.g., \":\") are url encoded. This\nmakes the Query class match PHP's http_build_query function. However, if you\nwant to send requests over the wire using valid query string characters that do\nnot need to be encoded, then you can provide a string to Url::setQuery() and\npass true as the second argument to specify that the query string is a raw\nstring that should not be parsed or encoded (unless a call to getQuery() is\nsubsequently made, forcing the query-string to be converted into a Query\nobject).\n\n\n## 5.0.2 - 2014-10-30\n\n* Added a trailing `\\r\\n` to multipart/form-data payloads. See\n  https://github.com/guzzle/guzzle/pull/871\n* Added a `GuzzleHttp\\Pool::send()` convenience method to match the docs.\n* Status codes are now returned as integers. See\n  https://github.com/guzzle/guzzle/issues/881\n* No longer overwriting an existing `application/x-www-form-urlencoded` header\n  when sending POST requests, allowing for customized headers. See\n  https://github.com/guzzle/guzzle/issues/877\n* Improved path URL serialization.\n\n  * No longer double percent-encoding characters in the path or query string if\n    they are already encoded.\n  * Now properly encoding the supplied path to a URL object, instead of only\n    encoding ' ' and '?'.\n  * Note: This has been changed in 5.0.3 to now encode query string values by\n    default unless the `rawString` argument is provided when setting the query\n    string on a URL: Now allowing many more characters to be present in the\n    query string without being percent encoded. See\n    https://datatracker.ietf.org/doc/html/rfc3986#appendix-A\n\n\n## 5.0.1 - 2014-10-16\n\nBugfix release.\n\n* Fixed an issue where connection errors still returned response object in\n  error and end events event though the response is unusable. This has been\n  corrected so that a response is not returned in the `getResponse` method of\n  these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867\n* Fixed an issue where transfer statistics were not being populated in the\n  RingBridge. https://github.com/guzzle/guzzle/issues/866\n\n\n## 5.0.0 - 2014-10-12\n\nAdding support for non-blocking responses and some minor API cleanup.\n\n### New Features\n\n* Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`.\n* Added a public API for creating a default HTTP adapter.\n* Updated the redirect plugin to be non-blocking so that redirects are sent\n  concurrently. Other plugins like this can now be updated to be non-blocking.\n* Added a \"progress\" event so that you can get upload and download progress\n  events.\n* Added `GuzzleHttp\\Pool` which implements FutureInterface and transfers\n  requests concurrently using a capped pool size as efficiently as possible.\n* Added `hasListeners()` to EmitterInterface.\n* Removed `GuzzleHttp\\ClientInterface::sendAll` and marked\n  `GuzzleHttp\\Client::sendAll` as deprecated (it's still there, just not the\n  recommended way).\n\n### Breaking changes\n\nThe breaking changes in this release are relatively minor. The biggest thing to\nlook out for is that request and response objects no longer implement fluent\ninterfaces.\n\n* Removed the fluent interfaces (i.e., `return $this`) from requests,\n  responses, `GuzzleHttp\\Collection`, `GuzzleHttp\\Url`,\n  `GuzzleHttp\\Query`, `GuzzleHttp\\Post\\PostBody`, and\n  `GuzzleHttp\\Cookie\\SetCookie`. This blog post provides a good outline of\n  why I did this: https://ocramius.github.io/blog/fluent-interfaces-are-evil/.\n  This also makes the Guzzle message interfaces compatible with the current\n  PSR-7 message proposal.\n* Removed \"functions.php\", so that Guzzle is truly PSR-4 compliant. Except\n  for the HTTP request functions from function.php, these functions are now\n  implemented in `GuzzleHttp\\Utils` using camelCase. `GuzzleHttp\\json_decode`\n  moved to `GuzzleHttp\\Utils::jsonDecode`. `GuzzleHttp\\get_path` moved to\n  `GuzzleHttp\\Utils::getPath`. `GuzzleHttp\\set_path` moved to\n  `GuzzleHttp\\Utils::setPath`. `GuzzleHttp\\batch` should now be\n  `GuzzleHttp\\Pool::batch`, which returns an `objectStorage`. Using functions.php\n  caused problems for many users: they aren't PSR-4 compliant, require an\n  explicit include, and needed an if-guard to ensure that the functions are not\n  declared multiple times.\n* Rewrote adapter layer.\n    * Removing all classes from `GuzzleHttp\\Adapter`, these are now\n      implemented as callables that are stored in `GuzzleHttp\\Ring\\Client`.\n    * Removed the concept of \"parallel adapters\". Sending requests serially or\n      concurrently is now handled using a single adapter.\n    * Moved `GuzzleHttp\\Adapter\\Transaction` to `GuzzleHttp\\Transaction`. The\n      Transaction object now exposes the request, response, and client as public\n      properties. The getters and setters have been removed.\n* Removed the \"headers\" event. This event was only useful for changing the\n  body a response once the headers of the response were known. You can implement\n  a similar behavior in a number of ways. One example might be to use a\n  FnStream that has access to the transaction being sent. For example, when the\n  first byte is written, you could check if the response headers match your\n  expectations, and if so, change the actual stream body that is being\n  written to.\n* Removed the `asArray` parameter from\n  `GuzzleHttp\\Message\\MessageInterface::getHeader`. If you want to get a header\n  value as an array, then use the newly added `getHeaderAsArray()` method of\n  `MessageInterface`. This change makes the Guzzle interfaces compatible with\n  the PSR-7 interfaces.\n* `GuzzleHttp\\Message\\MessageFactory` no longer allows subclasses to add\n  custom request options using double-dispatch (this was an implementation\n  detail). Instead, you should now provide an associative array to the\n  constructor which is a mapping of the request option name mapping to a\n  function that applies the option value to a request.\n* Removed the concept of \"throwImmediately\" from exceptions and error events.\n  This control mechanism was used to stop a transfer of concurrent requests\n  from completing. This can now be handled by throwing the exception or by\n  cancelling a pool of requests or each outstanding future request individually.\n* Updated to \"GuzzleHttp\\Streams\" 3.0.\n    * `GuzzleHttp\\Stream\\StreamInterface::getContents()` no longer accepts a\n      `maxLen` parameter. This update makes the Guzzle streams project\n      compatible with the current PSR-7 proposal.\n    * `GuzzleHttp\\Stream\\Stream::__construct`,\n      `GuzzleHttp\\Stream\\Stream::factory`, and\n      `GuzzleHttp\\Stream\\Utils::create` no longer accept a size in the second\n      argument. They now accept an associative array of options, including the\n      \"size\" key and \"metadata\" key which can be used to provide custom metadata.\n\n\n## 4.2.2 - 2014-09-08\n\n* Fixed a memory leak in the CurlAdapter when reusing cURL handles.\n* No longer using `request_fulluri` in stream adapter proxies.\n* Relative redirects are now based on the last response, not the first response.\n\n## 4.2.1 - 2014-08-19\n\n* Ensuring that the StreamAdapter does not always add a Content-Type header\n* Adding automated github releases with a phar and zip\n\n## 4.2.0 - 2014-08-17\n\n* Now merging in default options using a case-insensitive comparison.\n  Closes https://github.com/guzzle/guzzle/issues/767\n* Added the ability to automatically decode `Content-Encoding` response bodies\n  using the `decode_content` request option. This is set to `true` by default\n  to decode the response body if it comes over the wire with a\n  `Content-Encoding`. Set this value to `false` to disable decoding the\n  response content, and pass a string to provide a request `Accept-Encoding`\n  header and turn on automatic response decoding. This feature now allows you\n  to pass an `Accept-Encoding` header in the headers of a request but still\n  disable automatic response decoding.\n  Closes https://github.com/guzzle/guzzle/issues/764\n* Added the ability to throw an exception immediately when transferring\n  requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760\n* Updating guzzlehttp/streams dependency to ~2.1\n* No longer utilizing the now deprecated namespaced methods from the stream\n  package.\n\n## 4.1.8 - 2014-08-14\n\n* Fixed an issue in the CurlFactory that caused setting the `stream=false`\n  request option to throw an exception.\n  See: https://github.com/guzzle/guzzle/issues/769\n* TransactionIterator now calls rewind on the inner iterator.\n  See: https://github.com/guzzle/guzzle/pull/765\n* You can now set the `Content-Type` header to `multipart/form-data`\n  when creating POST requests to force multipart bodies.\n  See https://github.com/guzzle/guzzle/issues/768\n\n## 4.1.7 - 2014-08-07\n\n* Fixed an error in the HistoryPlugin that caused the same request and response\n  to be logged multiple times when an HTTP protocol error occurs.\n* Ensuring that cURL does not add a default Content-Type when no Content-Type\n  has been supplied by the user. This prevents the adapter layer from modifying\n  the request that is sent over the wire after any listeners may have already\n  put the request in a desired state (e.g., signed the request).\n* Throwing an exception when you attempt to send requests that have the\n  \"stream\" set to true in parallel using the MultiAdapter.\n* Only calling curl_multi_select when there are active cURL handles. This was\n  previously changed and caused performance problems on some systems due to PHP\n  always selecting until the maximum select timeout.\n* Fixed a bug where multipart/form-data POST fields were not correctly\n  aggregated (e.g., values with \"&\").\n\n## 4.1.6 - 2014-08-03\n\n* Added helper methods to make it easier to represent messages as strings,\n  including getting the start line and getting headers as a string.\n\n## 4.1.5 - 2014-08-02\n\n* Automatically retrying cURL \"Connection died, retrying a fresh connect\"\n  errors when possible.\n* cURL implementation cleanup\n* Allowing multiple event subscriber listeners to be registered per event by\n  passing an array of arrays of listener configuration.\n\n## 4.1.4 - 2014-07-22\n\n* Fixed a bug that caused multi-part POST requests with more than one field to\n  serialize incorrectly.\n* Paths can now be set to \"0\"\n* `ResponseInterface::xml` now accepts a `libxml_options` option and added a\n  missing default argument that was required when parsing XML response bodies.\n* A `save_to` stream is now created lazily, which means that files are not\n  created on disk unless a request succeeds.\n\n## 4.1.3 - 2014-07-15\n\n* Various fixes to multipart/form-data POST uploads\n* Wrapping function.php in an if-statement to ensure Guzzle can be used\n  globally and in a Composer install\n* Fixed an issue with generating and merging in events to an event array\n* POST headers are only applied before sending a request to allow you to change\n  the query aggregator used before uploading\n* Added much more robust query string parsing\n* Fixed various parsing and normalization issues with URLs\n* Fixing an issue where multi-valued headers were not being utilized correctly\n  in the StreamAdapter\n\n## 4.1.2 - 2014-06-18\n\n* Added support for sending payloads with GET requests\n\n## 4.1.1 - 2014-06-08\n\n* Fixed an issue related to using custom message factory options in subclasses\n* Fixed an issue with nested form fields in a multi-part POST\n* Fixed an issue with using the `json` request option for POST requests\n* Added `ToArrayInterface` to `GuzzleHttp\\Cookie\\CookieJar`\n\n## 4.1.0 - 2014-05-27\n\n* Added a `json` request option to easily serialize JSON payloads.\n* Added a `GuzzleHttp\\json_decode()` wrapper to safely parse JSON.\n* Added `setPort()` and `getPort()` to `GuzzleHttp\\Message\\RequestInterface`.\n* Added the ability to provide an emitter to a client in the client constructor.\n* Added the ability to persist a cookie session using $_SESSION.\n* Added a trait that can be used to add event listeners to an iterator.\n* Removed request method constants from RequestInterface.\n* Fixed warning when invalid request start-lines are received.\n* Updated MessageFactory to work with custom request option methods.\n* Updated cacert bundle to latest build.\n\n4.0.2 (2014-04-16)\n------------------\n\n* Proxy requests using the StreamAdapter now properly use request_fulluri (#632)\n* Added the ability to set scalars as POST fields (#628)\n\n## 4.0.1 - 2014-04-04\n\n* The HTTP status code of a response is now set as the exception code of\n  RequestException objects.\n* 303 redirects will now correctly switch from POST to GET requests.\n* The default parallel adapter of a client now correctly uses the MultiAdapter.\n* HasDataTrait now initializes the internal data array as an empty array so\n  that the toArray() method always returns an array.\n\n## 4.0.0 - 2014-03-29\n\n* For information on changes and upgrading, see:\n  https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40\n* Added `GuzzleHttp\\batch()` as a convenience function for sending requests in\n  parallel without needing to write asynchronous code.\n* Restructured how events are added to `GuzzleHttp\\ClientInterface::sendAll()`.\n  You can now pass a callable or an array of associative arrays where each\n  associative array contains the \"fn\", \"priority\", and \"once\" keys.\n\n## 4.0.0.rc-2 - 2014-03-25\n\n* Removed `getConfig()` and `setConfig()` from clients to avoid confusion\n  around whether things like base_url, message_factory, etc. should be able to\n  be retrieved or modified.\n* Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface\n* functions.php functions were renamed using snake_case to match PHP idioms\n* Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and\n  `GUZZLE_CURL_SELECT_TIMEOUT` environment variables\n* Added the ability to specify custom `sendAll()` event priorities\n* Added the ability to specify custom stream context options to the stream\n  adapter.\n* Added a functions.php function for `get_path()` and `set_path()`\n* CurlAdapter and MultiAdapter now use a callable to generate curl resources\n* MockAdapter now properly reads a body and emits a `headers` event\n* Updated Url class to check if a scheme and host are set before adding \":\"\n  and \"//\". This allows empty Url (e.g., \"\") to be serialized as \"\".\n* Parsing invalid XML no longer emits warnings\n* Curl classes now properly throw AdapterExceptions\n* Various performance optimizations\n* Streams are created with the faster `Stream\\create()` function\n* Marked deprecation_proxy() as internal\n* Test server is now a collection of static methods on a class\n\n## 4.0.0-rc.1 - 2014-03-15\n\n* See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40\n\n## 3.8.1 - 2014-01-28\n\n* Bug: Always using GET requests when redirecting from a 303 response\n* Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in\n  `Guzzle\\Http\\ClientInterface::setSslVerification()`\n* Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL\n* Bug: The body of a request can now be set to `\"0\"`\n* Sending PHP stream requests no longer forces `HTTP/1.0`\n* Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of\n  each sub-exception\n* Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than\n  clobbering everything).\n* Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators)\n* Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`.\n  For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`.\n* Now properly escaping the regular expression delimiter when matching Cookie domains.\n* Network access is now disabled when loading XML documents\n\n## 3.8.0 - 2013-12-05\n\n* Added the ability to define a POST name for a file\n* JSON response parsing now properly walks additionalProperties\n* cURL error code 18 is now retried automatically in the BackoffPlugin\n* Fixed a cURL error when URLs contain fragments\n* Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were\n  CurlExceptions\n* CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e)\n* Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS`\n* Fixed a bug that was encountered when parsing empty header parameters\n* UriTemplate now has a `setRegex()` method to match the docs\n* The `debug` request parameter now checks if it is truthy rather than if it exists\n* Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin\n* Added the ability to combine URLs using strict RFC 3986 compliance\n* Command objects can now return the validation errors encountered by the command\n* Various fixes to cache revalidation (#437 and 29797e5)\n* Various fixes to the AsyncPlugin\n* Cleaned up build scripts\n\n## 3.7.4 - 2013-10-02\n\n* Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430)\n* Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp\n  (see https://github.com/aws/aws-sdk-php/issues/147)\n* Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots\n* Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420)\n* Updated the bundled cacert.pem (#419)\n* OauthPlugin now supports adding authentication to headers or query string (#425)\n\n## 3.7.3 - 2013-09-08\n\n* Added the ability to get the exception associated with a request/command when using `MultiTransferException` and\n  `CommandTransferException`.\n* Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description\n* Schemas are only injected into response models when explicitly configured.\n* No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of\n  an EntityBody.\n* Bug fix: ChunkedIterator can now properly chunk a \\Traversable as well as an \\Iterator.\n* Bug fix: FilterIterator now relies on `\\Iterator` instead of `\\Traversable`.\n* Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody()\n* Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin\n* Bug fix: Visiting XML attributes first before visiting XML children when serializing requests\n* Bug fix: Properly parsing headers that contain commas contained in quotes\n* Bug fix: mimetype guessing based on a filename is now case-insensitive\n\n## 3.7.2 - 2013-08-02\n\n* Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander\n  See https://github.com/guzzle/guzzle/issues/371\n* Bug fix: Cookie domains are now matched correctly according to RFC 6265\n  See https://github.com/guzzle/guzzle/issues/377\n* Bug fix: GET parameters are now used when calculating an OAuth signature\n* Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted\n* `Guzzle\\Common\\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched\n* `Guzzle\\Http\\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input.\n  See https://github.com/guzzle/guzzle/issues/379\n* Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See\n  https://github.com/guzzle/guzzle/pull/380\n* cURL multi cleanup and optimizations\n\n## 3.7.1 - 2013-07-05\n\n* Bug fix: Setting default options on a client now works\n* Bug fix: Setting options on HEAD requests now works. See #352\n* Bug fix: Moving stream factory before send event to before building the stream. See #353\n* Bug fix: Cookies no longer match on IP addresses per RFC 6265\n* Bug fix: Correctly parsing header parameters that are in `<>` and quotes\n* Added `cert` and `ssl_key` as request options\n* `Host` header can now diverge from the host part of a URL if the header is set manually\n* `Guzzle\\Service\\Command\\LocationVisitor\\Request\\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter\n* OAuth parameters are only added via the plugin if they aren't already set\n* Exceptions are now thrown when a URL cannot be parsed\n* Returning `false` if `Guzzle\\Http\\EntityBody::getContentMd5()` fails\n* Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin\n\n## 3.7.0 - 2013-06-10\n\n* See UPGRADING.md for more information on how to upgrade.\n* Requests now support the ability to specify an array of $options when creating a request to more easily modify a\n  request. You can pass a 'request.options' configuration setting to a client to apply default request options to\n  every request created by a client (e.g. default query string variables, headers, curl options, etc.).\n* Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\\Guzzle`.\n  See `Guzzle\\Http\\StaticClient::mount`.\n* Added `command.request_options` to `Guzzle\\Service\\Command\\AbstractCommand` to pass request options to requests\n      created by a command (e.g. custom headers, query string variables, timeout settings, etc.).\n* Stream size in `Guzzle\\Stream\\PhpStreamRequestFactory` will now be set if Content-Length is returned in the\n  headers of a response\n* Added `Guzzle\\Common\\Collection::setPath($path, $value)` to set a value into an array using a nested key\n  (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`)\n* ServiceBuilders now support storing and retrieving arbitrary data\n* CachePlugin can now purge all resources for a given URI\n* CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource\n* CachePlugin now uses the Vary header to determine if a resource is a cache hit\n* `Guzzle\\Http\\Message\\Response` now implements `\\Serializable`\n* Added `Guzzle\\Cache\\CacheAdapterFactory::fromCache()` to more easily create cache adapters\n* `Guzzle\\Service\\ClientInterface::execute()` now accepts an array, single command, or Traversable\n* Fixed a bug in `Guzzle\\Http\\Message\\Header\\Link::addLink()`\n* Better handling of calculating the size of a stream in `Guzzle\\Stream\\Stream` using fstat() and caching the size\n* `Guzzle\\Common\\Exception\\ExceptionCollection` now creates a more readable exception message\n* Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older\n  Symfony users can still use the old version of Monolog.\n* Fixing BC break: Added the implementation back in for `Guzzle\\Http\\Message\\AbstractMessage::getTokenizedHeader()`.\n  Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`.\n* Several performance improvements to `Guzzle\\Common\\Collection`\n* Added an `$options` argument to the end of the following methods of `Guzzle\\Http\\ClientInterface`:\n  createRequest, head, delete, put, patch, post, options, prepareRequest\n* Added an `$options` argument to the end of `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface::createRequest()`\n* Added an `applyOptions()` method to `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface`\n* Changed `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $body = null)` to\n  `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a\n  resource, string, or EntityBody into the $options parameter to specify the download location of the response.\n* Changed `Guzzle\\Common\\Collection::__construct($data)` to no longer accepts a null value for `$data` but a\n  default `array()`\n* Added `Guzzle\\Stream\\StreamInterface::isRepeatable`\n* Removed `Guzzle\\Http\\ClientInterface::setDefaultHeaders(). Use\n  $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or\n  $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`.\n* Removed `Guzzle\\Http\\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`.\n* Removed `Guzzle\\Http\\ClientInterface::expandTemplate()`\n* Removed `Guzzle\\Http\\ClientInterface::setRequestFactory()`\n* Removed `Guzzle\\Http\\ClientInterface::getCurlMulti()`\n* Removed `Guzzle\\Http\\Message\\RequestInterface::canCache`\n* Removed `Guzzle\\Http\\Message\\RequestInterface::setIsRedirect`\n* Removed `Guzzle\\Http\\Message\\RequestInterface::isRedirect`\n* Made `Guzzle\\Http\\Client::expandTemplate` and `getUriTemplate` protected methods.\n* You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting\n  `Guzzle\\Common\\Version::$emitWarnings` to true.\n* Marked `Guzzle\\Http\\Message\\Request::isResponseBodyRepeatable()` as deprecated. Use\n      `$request->getResponseBody()->isRepeatable()` instead.\n* Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use\n  `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n* Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use\n  `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n* Marked `Guzzle\\Http\\Message\\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.\n* Marked `Guzzle\\Http\\Message\\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.\n* Marked `Guzzle\\Cache\\CacheAdapterFactory::factory()` as deprecated\n* Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand.\n  These will work through Guzzle 4.0\n* Marked 'request.params' for `Guzzle\\Http\\Client` as deprecated. Use [request.options][params].\n* Marked `Guzzle\\Service\\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\\Service\\Client.\n* Marked `Guzzle\\Service\\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`.\n* Marked `Guzzle\\Service\\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`.\n* Marked `Guzzle\\Parser\\Url\\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.\n* Marked `Guzzle\\Common\\Collection::inject()` as deprecated.\n* Marked `Guzzle\\Plugin\\CurlAuth\\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');`\n* CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a\n  CacheStorageInterface. These two objects and interface will be removed in a future version.\n* Always setting X-cache headers on cached responses\n* Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin\n* `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface\n  $request, Response $response);`\n* `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`\n* `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`\n* Added `CacheStorageInterface::purge($url)`\n* `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin\n  $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,\n  CanCacheStrategyInterface $canCache = null)`\n* Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`\n\n## 3.6.0 - 2013-05-29\n\n* ServiceDescription now implements ToArrayInterface\n* Added command.hidden_params to blacklist certain headers from being treated as additionalParameters\n* Guzzle can now correctly parse incomplete URLs\n* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.\n* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution\n* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().\n* Specific header implementations can be created for complex headers. When a message creates a header, it uses a\n  HeaderFactory which can map specific headers to specific header classes. There is now a Link header and\n  CacheControl header implementation.\n* Removed from interface: Guzzle\\Http\\ClientInterface::setUriTemplate\n* Removed from interface: Guzzle\\Http\\ClientInterface::setCurlMulti()\n* Removed Guzzle\\Http\\Message\\Request::receivedRequestHeader() and implemented this functionality in\n  Guzzle\\Http\\Curl\\RequestMediator\n* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.\n* Removed the optional $tryChunkedTransfer option from Guzzle\\Http\\Message\\EntityEnclosingRequestInterface\n* Removed the $asObjects argument from Guzzle\\Http\\Message\\MessageInterface::getHeaders()\n* Removed Guzzle\\Parser\\ParserRegister::get(). Use getParser()\n* Removed Guzzle\\Parser\\ParserRegister::set(). Use registerParser().\n* All response header helper functions return a string rather than mixing Header objects and strings inconsistently\n* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle\n  directly via interfaces\n* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist\n  but are a no-op until removed.\n* Most classes that used to require a `Guzzle\\Service\\Command\\CommandInterface` typehint now request a\n  `Guzzle\\Service\\Command\\ArrayCommandInterface`.\n* Added `Guzzle\\Http\\Message\\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response\n  on a request while the request is still being transferred\n* The ability to case-insensitively search for header values\n* Guzzle\\Http\\Message\\Header::hasExactHeader\n* Guzzle\\Http\\Message\\Header::raw. Use getAll()\n* Deprecated cache control specific methods on Guzzle\\Http\\Message\\AbstractMessage. Use the CacheControl header object\n  instead.\n* `Guzzle\\Service\\Command\\CommandInterface` now extends from ToArrayInterface and ArrayAccess\n* Added the ability to cast Model objects to a string to view debug information.\n\n## 3.5.0 - 2013-05-13\n\n* Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times\n* Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove\n  itself from the EventDispatcher)\n* Bug: `Guzzle\\Log\\MessageFormatter` now properly writes \"total_time\" and \"connect_time\" values\n* Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too\n* Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a\n  non-existent key\n* Bug: All __call() method arguments are now required (helps with mocking frameworks)\n* Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference\n  to help with refcount based garbage collection of resources created by sending a request\n* Deprecating ZF1 cache and log adapters. These will be removed in the next major version.\n* Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the\n  HistoryPlugin for a history.\n* Added a `responseBody` alias for the `response_body` location\n* Refactored internals to no longer rely on Response::getRequest()\n* HistoryPlugin can now be cast to a string\n* HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests\n  and responses that are sent over the wire\n* Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects\n\n## 3.4.3 - 2013-04-30\n\n* Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response\n* Added a check to re-extract the temp cacert bundle from the phar before sending each request\n\n## 3.4.2 - 2013-04-29\n\n* Bug fix: Stream objects now work correctly with \"a\" and \"a+\" modes\n* Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present\n* Bug fix: AsyncPlugin no longer forces HEAD requests\n* Bug fix: DateTime timezones are now properly handled when using the service description schema formatter\n* Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails\n* Setting a response on a request will write to the custom request body from the response body if one is specified\n* LogPlugin now writes to php://output when STDERR is undefined\n* Added the ability to set multiple POST files for the same key in a single call\n* application/x-www-form-urlencoded POSTs now use the utf-8 charset by default\n* Added the ability to queue CurlExceptions to the MockPlugin\n* Cleaned up how manual responses are queued on requests (removed \"queued_response\" and now using request.before_send)\n* Configuration loading now allows remote files\n\n## 3.4.1 - 2013-04-16\n\n* Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti\n  handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost.\n* Exceptions are now properly grouped when sending requests in parallel\n* Redirects are now properly aggregated when a multi transaction fails\n* Redirects now set the response on the original object even in the event of a failure\n* Bug fix: Model names are now properly set even when using $refs\n* Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax\n* Added support for oauth_callback in OAuth signatures\n* Added support for oauth_verifier in OAuth signatures\n* Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection\n\n## 3.4.0 - 2013-04-11\n\n* Bug fix: URLs are now resolved correctly based on https://datatracker.ietf.org/doc/html/rfc3986#section-5.2. #289\n* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289\n* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263\n* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264.\n* Bug fix: Added `number` type to service descriptions.\n* Bug fix: empty parameters are removed from an OAuth signature\n* Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header\n* Bug fix: Fixed \"array to string\" error when validating a union of types in a service description\n* Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream\n* Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin.\n* Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs.\n* The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections.\n* Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if\n  the Content-Type can be determined based on the entity body or the path of the request.\n* Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder.\n* Added support for a PSR-3 LogAdapter.\n* Added a `command.after_prepare` event\n* Added `oauth_callback` parameter to the OauthPlugin\n* Added the ability to create a custom stream class when using a stream factory\n* Added a CachingEntityBody decorator\n* Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized.\n* The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar.\n* You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies\n* POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This\n  means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use\n  POST fields or files (the latter is only used when emulating a form POST in the browser).\n* Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest\n\n## 3.3.1 - 2013-03-10\n\n* Added the ability to create PHP streaming responses from HTTP requests\n* Bug fix: Running any filters when parsing response headers with service descriptions\n* Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing\n* Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across\n  response location visitors.\n* Bug fix: Removed the possibility of creating configuration files with circular dependencies\n* RequestFactory::create() now uses the key of a POST file when setting the POST file name\n* Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set\n\n## 3.3.0 - 2013-03-03\n\n* A large number of performance optimizations have been made\n* Bug fix: Added 'wb' as a valid write mode for streams\n* Bug fix: `Guzzle\\Http\\Message\\Response::json()` now allows scalar values to be returned\n* Bug fix: Fixed bug in `Guzzle\\Http\\Message\\Response` where wrapping quotes were stripped from `getEtag()`\n* BC: Removed `Guzzle\\Http\\Utils` class\n* BC: Setting a service description on a client will no longer modify the client's command factories.\n* BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using\n  the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'\n* BC: `Guzzle\\Stream\\Stream::getWrapper()` and `Guzzle\\Stream\\Stream::getSteamType()` are no longer converted to\n  lowercase\n* Operation parameter objects are now lazy loaded internally\n* Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses\n* Added support for instantiating responseType=class responseClass classes. Classes must implement\n  `Guzzle\\Service\\Command\\ResponseClassInterface`\n* Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These\n  additional properties also support locations and can be used to parse JSON responses where the outermost part of the\n  JSON is an array\n* Added support for nested renaming of JSON models (rename sentAs to name)\n* CachePlugin\n    * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error\n    * Debug headers can now added to cached response in the CachePlugin\n\n## 3.2.0 - 2013-02-14\n\n* CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients.\n* URLs with no path no longer contain a \"/\" by default\n* Guzzle\\Http\\QueryString does no longer manages the leading \"?\". This is now handled in Guzzle\\Http\\Url.\n* BadResponseException no longer includes the full request and response message\n* Adding setData() to Guzzle\\Service\\Description\\ServiceDescriptionInterface\n* Adding getResponseBody() to Guzzle\\Http\\Message\\RequestInterface\n* Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription\n* Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list\n* xmlEncoding can now be customized for the XML declaration of a XML service description operation\n* Guzzle\\Http\\QueryString now uses Guzzle\\Http\\QueryAggregator\\QueryAggregatorInterface objects to add custom value\n  aggregation and no longer uses callbacks\n* The URL encoding implementation of Guzzle\\Http\\QueryString can now be customized\n* Bug fix: Filters were not always invoked for array service description parameters\n* Bug fix: Redirects now use a target response body rather than a temporary response body\n* Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded\n* Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives\n\n## 3.1.2 - 2013-01-27\n\n* Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the\n  response body. For example, the XmlVisitor now parses the XML response into an array in the before() method.\n* Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent\n* CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444)\n* Fixed a bug where redirect responses were not chained correctly using getPreviousResponse()\n* Setting default headers on a client after setting the user-agent will not erase the user-agent setting\n\n## 3.1.1 - 2013-01-20\n\n* Adding wildcard support to Guzzle\\Common\\Collection::getPath()\n* Adding alias support to ServiceBuilder configs\n* Adding Guzzle\\Service\\Resource\\CompositeResourceIteratorFactory and cleaning up factory interface\n\n## 3.1.0 - 2013-01-12\n\n* BC: CurlException now extends from RequestException rather than BadResponseException\n* BC: Renamed Guzzle\\Plugin\\Cache\\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse()\n* Added getData to ServiceDescriptionInterface\n* Added context array to RequestInterface::setState()\n* Bug: Removing hard dependency on the BackoffPlugin from Guzzle\\Http\n* Bug: Adding required content-type when JSON request visitor adds JSON to a command\n* Bug: Fixing the serialization of a service description with custom data\n* Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing\n  an array of successful and failed responses\n* Moved getPath from Guzzle\\Service\\Resource\\Model to Guzzle\\Common\\Collection\n* Added Guzzle\\Http\\IoEmittingEntityBody\n* Moved command filtration from validators to location visitors\n* Added `extends` attributes to service description parameters\n* Added getModels to ServiceDescriptionInterface\n\n## 3.0.7 - 2012-12-19\n\n* Fixing phar detection when forcing a cacert to system if null or true\n* Allowing filename to be passed to `Guzzle\\Http\\Message\\Request::setResponseBody()`\n* Cleaning up `Guzzle\\Common\\Collection::inject` method\n* Adding a response_body location to service descriptions\n\n## 3.0.6 - 2012-12-09\n\n* CurlMulti performance improvements\n* Adding setErrorResponses() to Operation\n* composer.json tweaks\n\n## 3.0.5 - 2012-11-18\n\n* Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin\n* Bug: Response body can now be a string containing \"0\"\n* Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert\n* Bug: QueryString::fromString now properly parses query string parameters that contain equal signs\n* Added support for XML attributes in service description responses\n* DefaultRequestSerializer now supports array URI parameter values for URI template expansion\n* Added better mimetype guessing to requests and post files\n\n## 3.0.4 - 2012-11-11\n\n* Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value\n* Bug: Cookies can now be added that have a name, domain, or value set to \"0\"\n* Bug: Using the system cacert bundle when using the Phar\n* Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures\n* Enhanced cookie jar de-duplication\n* Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added\n* Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies\n* Added the ability to create any sort of hash for a stream rather than just an MD5 hash\n\n## 3.0.3 - 2012-11-04\n\n* Implementing redirects in PHP rather than cURL\n* Added PECL URI template extension and using as default parser if available\n* Bug: Fixed Content-Length parsing of Response factory\n* Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams.\n* Adding ToArrayInterface throughout library\n* Fixing OauthPlugin to create unique nonce values per request\n\n## 3.0.2 - 2012-10-25\n\n* Magic methods are enabled by default on clients\n* Magic methods return the result of a command\n* Service clients no longer require a base_url option in the factory\n* Bug: Fixed an issue with URI templates where null template variables were being expanded\n\n## 3.0.1 - 2012-10-22\n\n* Models can now be used like regular collection objects by calling filter, map, etc.\n* Models no longer require a Parameter structure or initial data in the constructor\n* Added a custom AppendIterator to get around a PHP bug with the `\\AppendIterator`\n\n## 3.0.0 - 2012-10-15\n\n* Rewrote service description format to be based on Swagger\n    * Now based on JSON schema\n    * Added nested input structures and nested response models\n    * Support for JSON and XML input and output models\n    * Renamed `commands` to `operations`\n    * Removed dot class notation\n    * Removed custom types\n* Broke the project into smaller top-level namespaces to be more component friendly\n* Removed support for XML configs and descriptions. Use arrays or JSON files.\n* Removed the Validation component and Inspector\n* Moved all cookie code to Guzzle\\Plugin\\Cookie\n* Magic methods on a Guzzle\\Service\\Client now return the command un-executed.\n* Calling getResult() or getResponse() on a command will lazily execute the command if needed.\n* Now shipping with cURL's CA certs and using it by default\n* Added previousResponse() method to response objects\n* No longer sending Accept and Accept-Encoding headers on every request\n* Only sending an Expect header by default when a payload is greater than 1MB\n* Added/moved client options:\n    * curl.blacklist to curl.option.blacklist\n    * Added ssl.certificate_authority\n* Added a Guzzle\\Iterator component\n* Moved plugins from Guzzle\\Http\\Plugin to Guzzle\\Plugin\n* Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin)\n* Added a more robust caching plugin\n* Added setBody to response objects\n* Updating LogPlugin to use a more flexible MessageFormatter\n* Added a completely revamped build process\n* Cleaning up Collection class and removing default values from the get method\n* Fixed ZF2 cache adapters\n\n## 2.8.8 - 2012-10-15\n\n* Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did\n\n## 2.8.7 - 2012-09-30\n\n* Bug: Fixed config file aliases for JSON includes\n* Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests\n* Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload\n* Bug: Hardening request and response parsing to account for missing parts\n* Bug: Fixed PEAR packaging\n* Bug: Fixed Request::getInfo\n* Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail\n* Adding the ability for the namespace Iterator factory to look in multiple directories\n* Added more getters/setters/removers from service descriptions\n* Added the ability to remove POST fields from OAuth signatures\n* OAuth plugin now supports 2-legged OAuth\n\n## 2.8.6 - 2012-09-05\n\n* Added the ability to modify and build service descriptions\n* Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command\n* Added a `json` parameter location\n* Now allowing dot notation for classes in the CacheAdapterFactory\n* Using the union of two arrays rather than an array_merge when extending service builder services and service params\n* Ensuring that a service is a string before doing strpos() checks on it when substituting services for references\n  in service builder config files.\n* Services defined in two different config files that include one another will by default replace the previously\n  defined service, but you can now create services that extend themselves and merge their settings over the previous\n* The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like\n  '_default' with a default JSON configuration file.\n\n## 2.8.5 - 2012-08-29\n\n* Bug: Suppressed empty arrays from URI templates\n* Bug: Added the missing $options argument from ServiceDescription::factory to enable caching\n* Added support for HTTP responses that do not contain a reason phrase in the start-line\n* AbstractCommand commands are now invokable\n* Added a way to get the data used when signing an Oauth request before a request is sent\n\n## 2.8.4 - 2012-08-15\n\n* Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin\n* 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.\n* Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\\Common\\Stream\n* Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream\n* Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5())\n* Added additional response status codes\n* Removed SSL information from the default User-Agent header\n* DELETE requests can now send an entity body\n* Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries\n* Added the ability of the MockPlugin to consume mocked request bodies\n* LogPlugin now exposes request and response objects in the extras array\n\n## 2.8.3 - 2012-07-30\n\n* Bug: Fixed a case where empty POST requests were sent as GET requests\n* Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body\n* Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new\n* Added multiple inheritance to service description commands\n* Added an ApiCommandInterface and added `getParamNames()` and `hasParam()`\n* Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything\n* Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles\n\n## 2.8.2 - 2012-07-24\n\n* Bug: Query string values set to 0 are no longer dropped from the query string\n* Bug: A Collection object is no longer created each time a call is made to `Guzzle\\Service\\Command\\AbstractCommand::getRequestHeaders()`\n* Bug: `+` is now treated as an encoded space when parsing query strings\n* QueryString and Collection performance improvements\n* Allowing dot notation for class paths in filters attribute of a service descriptions\n\n## 2.8.1 - 2012-07-16\n\n* Loosening Event Dispatcher dependency\n* POST redirects can now be customized using CURLOPT_POSTREDIR\n\n## 2.8.0 - 2012-07-15\n\n* BC: Guzzle\\Http\\Query\n    * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl)\n    * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding()\n    * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool)\n    * Changed the aggregation functions of QueryString to be static methods\n    * Can now use fromString() with querystrings that have a leading ?\n* cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters\n* Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body\n* Cookies are no longer URL decoded by default\n* Bug: URI template variables set to null are no longer expanded\n\n## 2.7.2 - 2012-07-02\n\n* BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\\Http\\Parser to Guzzle\\Parser.\n* BC: Removing Guzzle\\Common\\Batch\\Batch::count() and replacing it with isEmpty()\n* CachePlugin now allows for a custom request parameter function to check if a request can be cached\n* Bug fix: CachePlugin now only caches GET and HEAD requests by default\n* Bug fix: Using header glue when transferring headers over the wire\n* Allowing deeply nested arrays for composite variables in URI templates\n* Batch divisors can now return iterators or arrays\n\n## 2.7.1 - 2012-06-26\n\n* Minor patch to update version number in UA string\n* Updating build process\n\n## 2.7.0 - 2012-06-25\n\n* BC: Inflection classes moved to Guzzle\\Inflection. No longer static methods. Can now inject custom inflectors into classes.\n* BC: Removed magic setX methods from commands\n* BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method\n* Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable.\n* Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity)\n* Guzzle\\Service\\Resource\\ResourceIteratorApplyBatched now internally uses the Guzzle\\Common\\Batch namespace\n* Added Guzzle\\Service\\Plugin namespace and a PluginCollectionPlugin\n* Added the ability to set POST fields and files in a service description\n* Guzzle\\Http\\EntityBody::factory() now accepts objects with a __toString() method\n* Adding a command.before_prepare event to clients\n* Added BatchClosureTransfer and BatchClosureDivisor\n* BatchTransferException now includes references to the batch divisor and transfer strategies\n* Fixed some tests so that they pass more reliably\n* Added Guzzle\\Common\\Log\\ArrayLogAdapter\n\n## 2.6.6 - 2012-06-10\n\n* BC: Removing Guzzle\\Http\\Plugin\\BatchQueuePlugin\n* BC: Removing Guzzle\\Service\\Command\\CommandSet\n* Adding generic batching system (replaces the batch queue plugin and command set)\n* Updating ZF cache and log adapters and now using ZF's composer repository\n* Bug: Setting the name of each ApiParam when creating through an ApiCommand\n* Adding result_type, result_doc, deprecated, and doc_url to service descriptions\n* Bug: Changed the default cookie header casing back to 'Cookie'\n\n## 2.6.5 - 2012-06-03\n\n* BC: Renaming Guzzle\\Http\\Message\\RequestInterface::getResourceUri() to getResource()\n* BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from\n* BC: Guzzle\\Http\\Cookie is now used to manage Set-Cookie data, not Cookie data\n* BC: Renaming methods in the CookieJarInterface\n* Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations\n* Making the default glue for HTTP headers ';' instead of ','\n* Adding a removeValue to Guzzle\\Http\\Message\\Header\n* Adding getCookies() to request interface.\n* Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber()\n\n## 2.6.4 - 2012-05-30\n\n* BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class.\n* BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand\n* Bug: Fixing magic method command calls on clients\n* Bug: Email constraint only validates strings\n* Bug: Aggregate POST fields when POST files are present in curl handle\n* Bug: Fixing default User-Agent header\n* Bug: Only appending or prepending parameters in commands if they are specified\n* Bug: Not requiring response reason phrases or status codes to match a predefined list of codes\n* Allowing the use of dot notation for class namespaces when using instance_of constraint\n* Added any_match validation constraint\n* Added an AsyncPlugin\n* Passing request object to the calculateWait method of the ExponentialBackoffPlugin\n* Allowing the result of a command object to be changed\n* Parsing location and type sub values when instantiating a service description rather than over and over at runtime\n\n## 2.6.3 - 2012-05-23\n\n* [BC] Guzzle\\Common\\FromConfigInterface no longer requires any config options.\n* [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields.\n* You can now use an array of data when creating PUT request bodies in the request factory.\n* Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable.\n* [Http] Adding support for Content-Type in multipart POST uploads per upload\n* [Http] Added support for uploading multiple files using the same name (foo[0], foo[1])\n* Adding more POST data operations for easier manipulation of POST data.\n* You can now set empty POST fields.\n* The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files.\n* Split the Guzzle\\Service\\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate.\n* CS updates\n\n## 2.6.2 - 2012-05-19\n\n* [Http] Better handling of nested scope requests in CurlMulti.  Requests are now always prepares in the send() method rather than the addRequest() method.\n\n## 2.6.1 - 2012-05-19\n\n* [BC] Removing 'path' support in service descriptions.  Use 'uri'.\n* [BC] Guzzle\\Service\\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache.\n* [BC] Removing Guzzle\\Common\\NullObject.  Use https://github.com/mtdowling/NullObject if you need it.\n* [BC] Removing Guzzle\\Common\\XmlElement.\n* All commands, both dynamic and concrete, have ApiCommand objects.\n* Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits.\n* Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored.\n* Making the method signature of Guzzle\\Service\\Builder\\ServiceBuilder::factory more flexible.\n\n## 2.6.0 - 2012-05-15\n\n* [BC] Moving Guzzle\\Service\\Builder to Guzzle\\Service\\Builder\\ServiceBuilder\n* [BC] Executing a Command returns the result of the command rather than the command\n* [BC] Moving all HTTP parsing logic to Guzzle\\Http\\Parsers. Allows for faster C implementations if needed.\n* [BC] Changing the Guzzle\\Http\\Message\\Response::setProtocol() method to accept a protocol and version in separate args.\n* [BC] Moving ResourceIterator* to Guzzle\\Service\\Resource\n* [BC] Completely refactored ResourceIterators to iterate over a cloned command object\n* [BC] Moved Guzzle\\Http\\UriTemplate to Guzzle\\Http\\Parser\\UriTemplate\\UriTemplate\n* [BC] Guzzle\\Guzzle is now deprecated\n* Moving Guzzle\\Common\\Guzzle::inject to Guzzle\\Common\\Collection::inject\n* Adding Guzzle\\Version class to give version information about Guzzle\n* Adding Guzzle\\Http\\Utils class to provide getDefaultUserAgent() and getHttpDate()\n* Adding Guzzle\\Curl\\CurlVersion to manage caching curl_version() data\n* ServiceDescription and ServiceBuilder are now cacheable using similar configs\n* Changing the format of XML and JSON service builder configs.  Backwards compatible.\n* Cleaned up Cookie parsing\n* Trimming the default Guzzle User-Agent header\n* Adding a setOnComplete() method to Commands that is called when a command completes\n* Keeping track of requests that were mocked in the MockPlugin\n* Fixed a caching bug in the CacheAdapterFactory\n* Inspector objects can be injected into a Command object\n* Refactoring a lot of code and tests to be case insensitive when dealing with headers\n* Adding Guzzle\\Http\\Message\\HeaderComparison for easy comparison of HTTP headers using a DSL\n* Adding the ability to set global option overrides to service builder configs\n* Adding the ability to include other service builder config files from within XML and JSON files\n* Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method.\n\n## 2.5.0 - 2012-05-08\n\n* Major performance improvements\n* [BC] Simplifying Guzzle\\Common\\Collection.  Please check to see if you are using features that are now deprecated.\n* [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component.\n* [BC] No longer supporting \"{{ }}\" for injecting into command or UriTemplates.  Use \"{}\"\n* Added the ability to passed parameters to all requests created by a client\n* Added callback functionality to the ExponentialBackoffPlugin\n* Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies.\n* Rewinding request stream bodies when retrying requests\n* Exception is thrown when JSON response body cannot be decoded\n* Added configurable magic method calls to clients and commands.  This is off by default.\n* Fixed a defect that added a hash to every parsed URL part\n* Fixed duplicate none generation for OauthPlugin.\n* Emitting an event each time a client is generated by a ServiceBuilder\n* Using an ApiParams object instead of a Collection for parameters of an ApiCommand\n* cache.* request parameters should be renamed to params.cache.*\n* Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle.\n* Added the ability to disable type validation of service descriptions\n* ServiceDescriptions and ServiceBuilders are now Serializable\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2011 Michael Dowling <mtdowling@gmail.com>\nCopyright (c) 2012 Jeremy Lindblom <jeremeamia@gmail.com>\nCopyright (c) 2014 Graham Campbell <hello@gjcampbell.co.uk>\nCopyright (c) 2015 Márk Sági-Kazár <mark.sagikazar@gmail.com>\nCopyright (c) 2015 Tobias Schultze <webmaster@tubo-world.de>\nCopyright (c) 2016 Tobias Nyholm <tobias.nyholm@gmail.com>\nCopyright (c) 2016 George Mponos <gmponos@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/README.md",
    "content": "![Guzzle](.github/logo.png?raw=true)\n\n# Guzzle, PHP HTTP client\n\n[![Latest Version](https://img.shields.io/github/release/guzzle/guzzle.svg?style=flat-square)](https://github.com/guzzle/guzzle/releases)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/guzzle/guzzle/ci.yml?label=ci%20build&style=flat-square)](https://github.com/guzzle/guzzle/actions?query=workflow%3ACI)\n[![Total Downloads](https://img.shields.io/packagist/dt/guzzlehttp/guzzle.svg?style=flat-square)](https://packagist.org/packages/guzzlehttp/guzzle)\n\nGuzzle is a PHP HTTP client that makes it easy to send HTTP requests and\ntrivial to integrate with web services.\n\n- Simple interface for building query strings, POST requests, streaming large\n  uploads, streaming large downloads, using HTTP cookies, uploading JSON data,\n  etc...\n- Can send both synchronous and asynchronous requests using the same interface.\n- Uses PSR-7 interfaces for requests, responses, and streams. This allows you\n  to utilize other PSR-7 compatible libraries with Guzzle.\n- Supports PSR-18 allowing interoperability between other PSR-18 HTTP Clients.\n- Abstracts away the underlying HTTP transport, allowing you to write\n  environment and transport agnostic code; i.e., no hard dependency on cURL,\n  PHP streams, sockets, or non-blocking event loops.\n- Middleware system allows you to augment and compose client behavior.\n\n```php\n$client = new \\GuzzleHttp\\Client();\n$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');\n\necho $response->getStatusCode(); // 200\necho $response->getHeaderLine('content-type'); // 'application/json; charset=utf8'\necho $response->getBody(); // '{\"id\": 1420053, \"name\": \"guzzle\", ...}'\n\n// Send an asynchronous request.\n$request = new \\GuzzleHttp\\Psr7\\Request('GET', 'http://httpbin.org');\n$promise = $client->sendAsync($request)->then(function ($response) {\n    echo 'I completed! ' . $response->getBody();\n});\n\n$promise->wait();\n```\n\n## Help and docs\n\nWe use GitHub issues only to discuss bugs and new features. For support please refer to:\n\n- [Documentation](https://docs.guzzlephp.org)\n- [Stack Overflow](https://stackoverflow.com/questions/tagged/guzzle)\n- [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](https://slack.httplug.io/)\n- [Gitter](https://gitter.im/guzzle/guzzle)\n\n\n## Installing Guzzle\n\nThe recommended way to install Guzzle is through\n[Composer](https://getcomposer.org/).\n\n```bash\ncomposer require guzzlehttp/guzzle\n```\n\n\n## Version Guidance\n\n| Version | Status              | Packagist           | Namespace    | Repo                | Docs                | PSR-7 | PHP Version  |\n|---------|---------------------|---------------------|--------------|---------------------|---------------------|-------|--------------|\n| 3.x     | EOL                 | `guzzle/guzzle`     | `Guzzle`     | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No    | >=5.3.3,<7.0 |\n| 4.x     | EOL                 | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A                 | No    | >=5.4,<7.0   |\n| 5.x     | EOL                 | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No    | >=5.4,<7.4   |\n| 6.x     | Security fixes only | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes   | >=5.5,<8.0   |\n| 7.x     | Latest              | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes   | >=7.2.5,<8.4 |\n\n[guzzle-3-repo]: https://github.com/guzzle/guzzle3\n[guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x\n[guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3\n[guzzle-6-repo]: https://github.com/guzzle/guzzle/tree/6.5\n[guzzle-7-repo]: https://github.com/guzzle/guzzle\n[guzzle-3-docs]: https://guzzle3.readthedocs.io/\n[guzzle-5-docs]: https://docs.guzzlephp.org/en/5.3/\n[guzzle-6-docs]: https://docs.guzzlephp.org/en/6.5/\n[guzzle-7-docs]: https://docs.guzzlephp.org/en/latest/\n\n\n## Security\n\nIf you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/guzzle/security/policy) for more information.\n\n## License\n\nGuzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information.\n\n## For Enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-guzzlehttp-guzzle?utm_source=packagist-guzzlehttp-guzzle&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/UPGRADING.md",
    "content": "Guzzle Upgrade Guide\n====================\n\n6.0 to 7.0\n----------\n\nIn order to take advantage of the new features of PHP, Guzzle dropped the support\nof PHP 5. The minimum supported PHP version is now PHP 7.2. Type hints and return\ntypes for functions and methods have been added wherever possible. \n\nPlease make sure:\n- You are calling a function or a method with the correct type.\n- If you extend a class of Guzzle; update all signatures on methods you override.\n\n#### Other backwards compatibility breaking changes\n\n- Class `GuzzleHttp\\UriTemplate` is removed.\n- Class `GuzzleHttp\\Exception\\SeekException` is removed.\n- Classes `GuzzleHttp\\Exception\\BadResponseException`, `GuzzleHttp\\Exception\\ClientException`, \n  `GuzzleHttp\\Exception\\ServerException` can no longer be initialized with an empty\n  Response as argument.\n- Class `GuzzleHttp\\Exception\\ConnectException` now extends `GuzzleHttp\\Exception\\TransferException`\n  instead of `GuzzleHttp\\Exception\\RequestException`.\n- Function `GuzzleHttp\\Exception\\ConnectException::getResponse()` is removed.\n- Function `GuzzleHttp\\Exception\\ConnectException::hasResponse()` is removed.\n- Constant `GuzzleHttp\\ClientInterface::VERSION` is removed. Added `GuzzleHttp\\ClientInterface::MAJOR_VERSION` instead.\n- Function `GuzzleHttp\\Exception\\RequestException::getResponseBodySummary` is removed.\n  Use `\\GuzzleHttp\\Psr7\\get_message_body_summary` as an alternative.\n- Function `GuzzleHttp\\Cookie\\CookieJar::getCookieValue` is removed.\n- Request option `exceptions` is removed. Please use `http_errors`.\n- Request option `save_to` is removed. Please use `sink`.\n- Pool option `pool_size` is removed. Please use `concurrency`.\n- We now look for environment variables in the `$_SERVER` super global, due to thread safety issues with `getenv`. We continue to fallback to `getenv` in CLI environments, for maximum compatibility.\n- The `get`, `head`, `put`, `post`, `patch`, `delete`, `getAsync`, `headAsync`, `putAsync`, `postAsync`, `patchAsync`, and `deleteAsync` methods are now implemented as genuine methods on `GuzzleHttp\\Client`, with strong typing. The original `__call` implementation remains unchanged for now, for maximum backwards compatibility, but won't be invoked under normal operation.\n- The `log` middleware will log the errors with level `error` instead of `notice` \n- Support for international domain names (IDN) is now disabled by default, and enabling it requires installing ext-intl, linked against a modern version of the C library (ICU 4.6 or higher).\n\n#### Native functions calls\n\nAll internal native functions calls of Guzzle are now prefixed with a slash. This\nchange makes it impossible for method overloading by other libraries or applications.\nExample:\n\n```php\n// Before:\ncurl_version();\n\n// After:\n\\curl_version();\n```\n\nFor the full diff you can check [here](https://github.com/guzzle/guzzle/compare/6.5.4..master).\n\n5.0 to 6.0\n----------\n\nGuzzle now uses [PSR-7](https://www.php-fig.org/psr/psr-7/) for HTTP messages.\nDue to the fact that these messages are immutable, this prompted a refactoring\nof Guzzle to use a middleware based system rather than an event system. Any\nHTTP message interaction (e.g., `GuzzleHttp\\Message\\Request`) need to be\nupdated to work with the new immutable PSR-7 request and response objects. Any\nevent listeners or subscribers need to be updated to become middleware\nfunctions that wrap handlers (or are injected into a\n`GuzzleHttp\\HandlerStack`).\n\n- Removed `GuzzleHttp\\BatchResults`\n- Removed `GuzzleHttp\\Collection`\n- Removed `GuzzleHttp\\HasDataTrait`\n- Removed `GuzzleHttp\\ToArrayInterface`\n- The `guzzlehttp/streams` dependency has been removed. Stream functionality\n  is now present in the `GuzzleHttp\\Psr7` namespace provided by the\n  `guzzlehttp/psr7` package.\n- Guzzle no longer uses ReactPHP promises and now uses the\n  `guzzlehttp/promises` library. We use a custom promise library for three\n  significant reasons:\n  1. React promises (at the time of writing this) are recursive. Promise\n     chaining and promise resolution will eventually blow the stack. Guzzle\n     promises are not recursive as they use a sort of trampolining technique.\n     Note: there has been movement in the React project to modify promises to\n     no longer utilize recursion.\n  2. Guzzle needs to have the ability to synchronously block on a promise to\n     wait for a result. Guzzle promises allows this functionality (and does\n     not require the use of recursion).\n  3. Because we need to be able to wait on a result, doing so using React\n     promises requires wrapping react promises with RingPHP futures. This\n     overhead is no longer needed, reducing stack sizes, reducing complexity,\n     and improving performance.\n- `GuzzleHttp\\Mimetypes` has been moved to a function in\n  `GuzzleHttp\\Psr7\\mimetype_from_extension` and\n  `GuzzleHttp\\Psr7\\mimetype_from_filename`.\n- `GuzzleHttp\\Query` and `GuzzleHttp\\QueryParser` have been removed. Query\n  strings must now be passed into request objects as strings, or provided to\n  the `query` request option when creating requests with clients. The `query`\n  option uses PHP's `http_build_query` to convert an array to a string. If you\n  need a different serialization technique, you will need to pass the query\n  string in as a string. There are a couple helper functions that will make\n  working with query strings easier: `GuzzleHttp\\Psr7\\parse_query` and\n  `GuzzleHttp\\Psr7\\build_query`.\n- Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware\n  system based on PSR-7, using RingPHP and it's middleware system as well adds\n  more complexity than the benefits it provides. All HTTP handlers that were\n  present in RingPHP have been modified to work directly with PSR-7 messages\n  and placed in the `GuzzleHttp\\Handler` namespace. This significantly reduces\n  complexity in Guzzle, removes a dependency, and improves performance. RingPHP\n  will be maintained for Guzzle 5 support, but will no longer be a part of\n  Guzzle 6.\n- As Guzzle now uses a middleware based systems the event system and RingPHP\n  integration has been removed. Note: while the event system has been removed,\n  it is possible to add your own type of event system that is powered by the\n  middleware system.\n  - Removed the `Event` namespace.\n  - Removed the `Subscriber` namespace.\n  - Removed `Transaction` class\n  - Removed `RequestFsm`\n  - Removed `RingBridge`\n  - `GuzzleHttp\\Subscriber\\Cookie` is now provided by\n    `GuzzleHttp\\Middleware::cookies`\n  - `GuzzleHttp\\Subscriber\\HttpError` is now provided by\n    `GuzzleHttp\\Middleware::httpError`\n  - `GuzzleHttp\\Subscriber\\History` is now provided by\n    `GuzzleHttp\\Middleware::history`\n  - `GuzzleHttp\\Subscriber\\Mock` is now provided by\n    `GuzzleHttp\\Handler\\MockHandler`\n  - `GuzzleHttp\\Subscriber\\Prepare` is now provided by\n    `GuzzleHttp\\PrepareBodyMiddleware`\n  - `GuzzleHttp\\Subscriber\\Redirect` is now provided by\n    `GuzzleHttp\\RedirectMiddleware`\n- Guzzle now uses `Psr\\Http\\Message\\UriInterface` (implements in\n  `GuzzleHttp\\Psr7\\Uri`) for URI support. `GuzzleHttp\\Url` is now gone.\n- Static functions in `GuzzleHttp\\Utils` have been moved to namespaced\n  functions under the `GuzzleHttp` namespace. This requires either a Composer\n  based autoloader or you to include functions.php.\n- `GuzzleHttp\\ClientInterface::getDefaultOption` has been renamed to\n  `GuzzleHttp\\ClientInterface::getConfig`.\n- `GuzzleHttp\\ClientInterface::setDefaultOption` has been removed.\n- The `json` and `xml` methods of response objects has been removed. With the\n  migration to strictly adhering to PSR-7 as the interface for Guzzle messages,\n  adding methods to message interfaces would actually require Guzzle messages\n  to extend from PSR-7 messages rather then work with them directly.\n\n## Migrating to middleware\n\nThe change to PSR-7 unfortunately required significant refactoring to Guzzle\ndue to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event\nsystem from plugins. The event system relied on mutability of HTTP messages and\nside effects in order to work. With immutable messages, you have to change your\nworkflow to become more about either returning a value (e.g., functional\nmiddlewares) or setting a value on an object. Guzzle v6 has chosen the\nfunctional middleware approach.\n\nInstead of using the event system to listen for things like the `before` event,\nyou now create a stack based middleware function that intercepts a request on\nthe way in and the promise of the response on the way out. This is a much\nsimpler and more predictable approach than the event system and works nicely\nwith PSR-7 middleware. Due to the use of promises, the middleware system is\nalso asynchronous.\n\nv5:\n\n```php\nuse GuzzleHttp\\Event\\BeforeEvent;\n$client = new GuzzleHttp\\Client();\n// Get the emitter and listen to the before event.\n$client->getEmitter()->on('before', function (BeforeEvent $e) {\n    // Guzzle v5 events relied on mutation\n    $e->getRequest()->setHeader('X-Foo', 'Bar');\n});\n```\n\nv6:\n\nIn v6, you can modify the request before it is sent using the `mapRequest`\nmiddleware. The idiomatic way in v6 to modify the request/response lifecycle is\nto setup a handler middleware stack up front and inject the handler into a\nclient.\n\n```php\nuse GuzzleHttp\\Middleware;\n// Create a handler stack that has all of the default middlewares attached\n$handler = GuzzleHttp\\HandlerStack::create();\n// Push the handler onto the handler stack\n$handler->push(Middleware::mapRequest(function (RequestInterface $request) {\n    // Notice that we have to return a request object\n    return $request->withHeader('X-Foo', 'Bar');\n}));\n// Inject the handler into the client\n$client = new GuzzleHttp\\Client(['handler' => $handler]);\n```\n\n## POST Requests\n\nThis version added the [`form_params`](https://docs.guzzlephp.org/en/latest/request-options.html#form_params)\nand `multipart` request options. `form_params` is an associative array of\nstrings or array of strings and is used to serialize an\n`application/x-www-form-urlencoded` POST request. The\n[`multipart`](https://docs.guzzlephp.org/en/latest/request-options.html#multipart)\noption is now used to send a multipart/form-data POST request.\n\n`GuzzleHttp\\Post\\PostFile` has been removed. Use the `multipart` option to add\nPOST files to a multipart/form-data request.\n\nThe `body` option no longer accepts an array to send POST requests. Please use\n`multipart` or `form_params` instead.\n\nThe `base_url` option has been renamed to `base_uri`.\n\n4.x to 5.0\n----------\n\n## Rewritten Adapter Layer\n\nGuzzle now uses [RingPHP](https://ringphp.readthedocs.org/en/latest) to send\nHTTP requests. The `adapter` option in a `GuzzleHttp\\Client` constructor\nis still supported, but it has now been renamed to `handler`. Instead of\npassing a `GuzzleHttp\\Adapter\\AdapterInterface`, you must now pass a PHP\n`callable` that follows the RingPHP specification.\n\n## Removed Fluent Interfaces\n\n[Fluent interfaces were removed](https://ocramius.github.io/blog/fluent-interfaces-are-evil/)\nfrom the following classes:\n\n- `GuzzleHttp\\Collection`\n- `GuzzleHttp\\Url`\n- `GuzzleHttp\\Query`\n- `GuzzleHttp\\Post\\PostBody`\n- `GuzzleHttp\\Cookie\\SetCookie`\n\n## Removed functions.php\n\nRemoved \"functions.php\", so that Guzzle is truly PSR-4 compliant. The following\nfunctions can be used as replacements.\n\n- `GuzzleHttp\\json_decode` -> `GuzzleHttp\\Utils::jsonDecode`\n- `GuzzleHttp\\get_path` -> `GuzzleHttp\\Utils::getPath`\n- `GuzzleHttp\\Utils::setPath` -> `GuzzleHttp\\set_path`\n- `GuzzleHttp\\Pool::batch` -> `GuzzleHttp\\batch`. This function is, however,\n  deprecated in favor of using `GuzzleHttp\\Pool::batch()`.\n\nThe \"procedural\" global client has been removed with no replacement (e.g.,\n`GuzzleHttp\\get()`, `GuzzleHttp\\post()`, etc.). Use a `GuzzleHttp\\Client`\nobject as a replacement.\n\n## `throwImmediately` has been removed\n\nThe concept of \"throwImmediately\" has been removed from exceptions and error\nevents. This control mechanism was used to stop a transfer of concurrent\nrequests from completing. This can now be handled by throwing the exception or\nby cancelling a pool of requests or each outstanding future request\nindividually.\n\n## headers event has been removed\n\nRemoved the \"headers\" event. This event was only useful for changing the\nbody a response once the headers of the response were known. You can implement\na similar behavior in a number of ways. One example might be to use a\nFnStream that has access to the transaction being sent. For example, when the\nfirst byte is written, you could check if the response headers match your\nexpectations, and if so, change the actual stream body that is being\nwritten to.\n\n## Updates to HTTP Messages\n\nRemoved the `asArray` parameter from\n`GuzzleHttp\\Message\\MessageInterface::getHeader`. If you want to get a header\nvalue as an array, then use the newly added `getHeaderAsArray()` method of\n`MessageInterface`. This change makes the Guzzle interfaces compatible with\nthe PSR-7 interfaces.\n\n3.x to 4.0\n----------\n\n## Overarching changes:\n\n- Now requires PHP 5.4 or greater.\n- No longer requires cURL to send requests.\n- Guzzle no longer wraps every exception it throws. Only exceptions that are\n  recoverable are now wrapped by Guzzle.\n- Various namespaces have been removed or renamed.\n- No longer requiring the Symfony EventDispatcher. A custom event dispatcher\n  based on the Symfony EventDispatcher is\n  now utilized in `GuzzleHttp\\Event\\EmitterInterface` (resulting in significant\n  speed and functionality improvements).\n\nChanges per Guzzle 3.x namespace are described below.\n\n## Batch\n\nThe `Guzzle\\Batch` namespace has been removed. This is best left to\nthird-parties to implement on top of Guzzle's core HTTP library.\n\n## Cache\n\nThe `Guzzle\\Cache` namespace has been removed. (Todo: No suitable replacement\nhas been implemented yet, but hoping to utilize a PSR cache interface).\n\n## Common\n\n- Removed all of the wrapped exceptions. It's better to use the standard PHP\n  library for unrecoverable exceptions.\n- `FromConfigInterface` has been removed.\n- `Guzzle\\Common\\Version` has been removed. The VERSION constant can be found\n  at `GuzzleHttp\\ClientInterface::VERSION`.\n\n### Collection\n\n- `getAll` has been removed. Use `toArray` to convert a collection to an array.\n- `inject` has been removed.\n- `keySearch` has been removed.\n- `getPath` no longer supports wildcard expressions. Use something better like\n  JMESPath for this.\n- `setPath` now supports appending to an existing array via the `[]` notation.\n\n### Events\n\nGuzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses\n`GuzzleHttp\\Event\\Emitter`.\n\n- `Symfony\\Component\\EventDispatcher\\EventDispatcherInterface` is replaced by\n  `GuzzleHttp\\Event\\EmitterInterface`.\n- `Symfony\\Component\\EventDispatcher\\EventDispatcher` is replaced by\n  `GuzzleHttp\\Event\\Emitter`.\n- `Symfony\\Component\\EventDispatcher\\Event` is replaced by\n  `GuzzleHttp\\Event\\Event`, and Guzzle now has an EventInterface in\n  `GuzzleHttp\\Event\\EventInterface`.\n- `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and\n  `HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the\n  event emitter of a request, client, etc. now uses the `getEmitter` method\n  rather than the `getDispatcher` method.\n\n#### Emitter\n\n- Use the `once()` method to add a listener that automatically removes itself\n  the first time it is invoked.\n- Use the `listeners()` method to retrieve a list of event listeners rather than\n  the `getListeners()` method.\n- Use `emit()` instead of `dispatch()` to emit an event from an emitter.\n- Use `attach()` instead of `addSubscriber()` and `detach()` instead of\n  `removeSubscriber()`.\n\n```php\n$mock = new Mock();\n// 3.x\n$request->getEventDispatcher()->addSubscriber($mock);\n$request->getEventDispatcher()->removeSubscriber($mock);\n// 4.x\n$request->getEmitter()->attach($mock);\n$request->getEmitter()->detach($mock);\n```\n\nUse the `on()` method to add a listener rather than the `addListener()` method.\n\n```php\n// 3.x\n$request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } );\n// 4.x\n$request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } );\n```\n\n## Http\n\n### General changes\n\n- The cacert.pem certificate has been moved to `src/cacert.pem`.\n- Added the concept of adapters that are used to transfer requests over the\n  wire.\n- Simplified the event system.\n- Sending requests in parallel is still possible, but batching is no longer a\n  concept of the HTTP layer. Instead, you must use the `complete` and `error`\n  events to asynchronously manage parallel request transfers.\n- `Guzzle\\Http\\Url` has moved to `GuzzleHttp\\Url`.\n- `Guzzle\\Http\\QueryString` has moved to `GuzzleHttp\\Query`.\n- QueryAggregators have been rewritten so that they are simply callable\n  functions.\n- `GuzzleHttp\\StaticClient` has been removed. Use the functions provided in\n  `functions.php` for an easy to use static client instance.\n- Exceptions in `GuzzleHttp\\Exception` have been updated to all extend from\n  `GuzzleHttp\\Exception\\TransferException`.\n\n### Client\n\nCalling methods like `get()`, `post()`, `head()`, etc. no longer create and\nreturn a request, but rather creates a request, sends the request, and returns\nthe response.\n\n```php\n// 3.0\n$request = $client->get('/');\n$response = $request->send();\n\n// 4.0\n$response = $client->get('/');\n\n// or, to mirror the previous behavior\n$request = $client->createRequest('GET', '/');\n$response = $client->send($request);\n```\n\n`GuzzleHttp\\ClientInterface` has changed.\n\n- The `send` method no longer accepts more than one request. Use `sendAll` to\n  send multiple requests in parallel.\n- `setUserAgent()` has been removed. Use a default request option instead. You\n  could, for example, do something like:\n  `$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`.\n- `setSslVerification()` has been removed. Use default request options instead,\n  like `$client->setConfig('defaults/verify', true)`.\n\n`GuzzleHttp\\Client` has changed.\n\n- The constructor now accepts only an associative array. You can include a\n  `base_url` string or array to use a URI template as the base URL of a client.\n  You can also specify a `defaults` key that is an associative array of default\n  request options. You can pass an `adapter` to use a custom adapter,\n  `batch_adapter` to use a custom adapter for sending requests in parallel, or\n  a `message_factory` to change the factory used to create HTTP requests and\n  responses.\n- The client no longer emits a `client.create_request` event.\n- Creating requests with a client no longer automatically utilize a URI\n  template. You must pass an array into a creational method (e.g.,\n  `createRequest`, `get`, `put`, etc.) in order to expand a URI template.\n\n### Messages\n\nMessages no longer have references to their counterparts (i.e., a request no\nlonger has a reference to it's response, and a response no loger has a\nreference to its request). This association is now managed through a\n`GuzzleHttp\\Adapter\\TransactionInterface` object. You can get references to\nthese transaction objects using request events that are emitted over the\nlifecycle of a request.\n\n#### Requests with a body\n\n- `GuzzleHttp\\Message\\EntityEnclosingRequest` and\n  `GuzzleHttp\\Message\\EntityEnclosingRequestInterface` have been removed. The\n  separation between requests that contain a body and requests that do not\n  contain a body has been removed, and now `GuzzleHttp\\Message\\RequestInterface`\n  handles both use cases.\n- Any method that previously accepts a `GuzzleHttp\\Response` object now accept a\n  `GuzzleHttp\\Message\\ResponseInterface`.\n- `GuzzleHttp\\Message\\RequestFactoryInterface` has been renamed to\n  `GuzzleHttp\\Message\\MessageFactoryInterface`. This interface is used to create\n  both requests and responses and is implemented in\n  `GuzzleHttp\\Message\\MessageFactory`.\n- POST field and file methods have been removed from the request object. You\n  must now use the methods made available to `GuzzleHttp\\Post\\PostBodyInterface`\n  to control the format of a POST body. Requests that are created using a\n  standard `GuzzleHttp\\Message\\MessageFactoryInterface` will automatically use\n  a `GuzzleHttp\\Post\\PostBody` body if the body was passed as an array or if\n  the method is POST and no body is provided.\n\n```php\n$request = $client->createRequest('POST', '/');\n$request->getBody()->setField('foo', 'bar');\n$request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r')));\n```\n\n#### Headers\n\n- `GuzzleHttp\\Message\\Header` has been removed. Header values are now simply\n  represented by an array of values or as a string. Header values are returned\n  as a string by default when retrieving a header value from a message. You can\n  pass an optional argument of `true` to retrieve a header value as an array\n  of strings instead of a single concatenated string.\n- `GuzzleHttp\\PostFile` and `GuzzleHttp\\PostFileInterface` have been moved to\n  `GuzzleHttp\\Post`. This interface has been simplified and now allows the\n  addition of arbitrary headers.\n- Custom headers like `GuzzleHttp\\Message\\Header\\Link` have been removed. Most\n  of the custom headers are now handled separately in specific\n  subscribers/plugins, and `GuzzleHttp\\Message\\HeaderValues::parseParams()` has\n  been updated to properly handle headers that contain parameters (like the\n  `Link` header).\n\n#### Responses\n\n- `GuzzleHttp\\Message\\Response::getInfo()` and\n  `GuzzleHttp\\Message\\Response::setInfo()` have been removed. Use the event\n  system to retrieve this type of information.\n- `GuzzleHttp\\Message\\Response::getRawHeaders()` has been removed.\n- `GuzzleHttp\\Message\\Response::getMessage()` has been removed.\n- `GuzzleHttp\\Message\\Response::calculateAge()` and other cache specific\n  methods have moved to the CacheSubscriber.\n- Header specific helper functions like `getContentMd5()` have been removed.\n  Just use `getHeader('Content-MD5')` instead.\n- `GuzzleHttp\\Message\\Response::setRequest()` and\n  `GuzzleHttp\\Message\\Response::getRequest()` have been removed. Use the event\n  system to work with request and response objects as a transaction.\n- `GuzzleHttp\\Message\\Response::getRedirectCount()` has been removed. Use the\n  Redirect subscriber instead.\n- `GuzzleHttp\\Message\\Response::isSuccessful()` and other related methods have\n  been removed. Use `getStatusCode()` instead.\n\n#### Streaming responses\n\nStreaming requests can now be created by a client directly, returning a\n`GuzzleHttp\\Message\\ResponseInterface` object that contains a body stream\nreferencing an open PHP HTTP stream.\n\n```php\n// 3.0\nuse Guzzle\\Stream\\PhpStreamRequestFactory;\n$request = $client->get('/');\n$factory = new PhpStreamRequestFactory();\n$stream = $factory->fromRequest($request);\n$data = $stream->read(1024);\n\n// 4.0\n$response = $client->get('/', ['stream' => true]);\n// Read some data off of the stream in the response body\n$data = $response->getBody()->read(1024);\n```\n\n#### Redirects\n\nThe `configureRedirects()` method has been removed in favor of a\n`allow_redirects` request option.\n\n```php\n// Standard redirects with a default of a max of 5 redirects\n$request = $client->createRequest('GET', '/', ['allow_redirects' => true]);\n\n// Strict redirects with a custom number of redirects\n$request = $client->createRequest('GET', '/', [\n    'allow_redirects' => ['max' => 5, 'strict' => true]\n]);\n```\n\n#### EntityBody\n\nEntityBody interfaces and classes have been removed or moved to\n`GuzzleHttp\\Stream`. All classes and interfaces that once required\n`GuzzleHttp\\EntityBodyInterface` now require\n`GuzzleHttp\\Stream\\StreamInterface`. Creating a new body for a request no\nlonger uses `GuzzleHttp\\EntityBody::factory` but now uses\n`GuzzleHttp\\Stream\\Stream::factory` or even better:\n`GuzzleHttp\\Stream\\create()`.\n\n- `Guzzle\\Http\\EntityBodyInterface` is now `GuzzleHttp\\Stream\\StreamInterface`\n- `Guzzle\\Http\\EntityBody` is now `GuzzleHttp\\Stream\\Stream`\n- `Guzzle\\Http\\CachingEntityBody` is now `GuzzleHttp\\Stream\\CachingStream`\n- `Guzzle\\Http\\ReadLimitEntityBody` is now `GuzzleHttp\\Stream\\LimitStream`\n- `Guzzle\\Http\\IoEmittyinEntityBody` has been removed.\n\n#### Request lifecycle events\n\nRequests previously submitted a large number of requests. The number of events\nemitted over the lifecycle of a request has been significantly reduced to make\nit easier to understand how to extend the behavior of a request. All events\nemitted during the lifecycle of a request now emit a custom\n`GuzzleHttp\\Event\\EventInterface` object that contains context providing\nmethods and a way in which to modify the transaction at that specific point in\ntime (e.g., intercept the request and set a response on the transaction).\n\n- `request.before_send` has been renamed to `before` and now emits a\n  `GuzzleHttp\\Event\\BeforeEvent`\n- `request.complete` has been renamed to `complete` and now emits a\n  `GuzzleHttp\\Event\\CompleteEvent`.\n- `request.sent` has been removed. Use `complete`.\n- `request.success` has been removed. Use `complete`.\n- `error` is now an event that emits a `GuzzleHttp\\Event\\ErrorEvent`.\n- `request.exception` has been removed. Use `error`.\n- `request.receive.status_line` has been removed.\n- `curl.callback.progress` has been removed. Use a custom `StreamInterface` to\n  maintain a status update.\n- `curl.callback.write` has been removed. Use a custom `StreamInterface` to\n  intercept writes.\n- `curl.callback.read` has been removed. Use a custom `StreamInterface` to\n  intercept reads.\n\n`headers` is a new event that is emitted after the response headers of a\nrequest have been received before the body of the response is downloaded. This\nevent emits a `GuzzleHttp\\Event\\HeadersEvent`.\n\nYou can intercept a request and inject a response using the `intercept()` event\nof a `GuzzleHttp\\Event\\BeforeEvent`, `GuzzleHttp\\Event\\CompleteEvent`, and\n`GuzzleHttp\\Event\\ErrorEvent` event.\n\nSee: https://docs.guzzlephp.org/en/latest/events.html\n\n## Inflection\n\nThe `Guzzle\\Inflection` namespace has been removed. This is not a core concern\nof Guzzle.\n\n## Iterator\n\nThe `Guzzle\\Iterator` namespace has been removed.\n\n- `Guzzle\\Iterator\\AppendIterator`, `Guzzle\\Iterator\\ChunkedIterator`, and\n  `Guzzle\\Iterator\\MethodProxyIterator` are nice, but not a core requirement of\n  Guzzle itself.\n- `Guzzle\\Iterator\\FilterIterator` is no longer needed because an equivalent\n  class is shipped with PHP 5.4.\n- `Guzzle\\Iterator\\MapIterator` is not really needed when using PHP 5.5 because\n  it's easier to just wrap an iterator in a generator that maps values.\n\nFor a replacement of these iterators, see https://github.com/nikic/iter\n\n## Log\n\nThe LogPlugin has moved to https://github.com/guzzle/log-subscriber. The\n`Guzzle\\Log` namespace has been removed. Guzzle now relies on\n`Psr\\Log\\LoggerInterface` for all logging. The MessageFormatter class has been\nmoved to `GuzzleHttp\\Subscriber\\Log\\Formatter`.\n\n## Parser\n\nThe `Guzzle\\Parser` namespace has been removed. This was previously used to\nmake it possible to plug in custom parsers for cookies, messages, URI\ntemplates, and URLs; however, this level of complexity is not needed in Guzzle\nso it has been removed.\n\n- Cookie: Cookie parsing logic has been moved to\n  `GuzzleHttp\\Cookie\\SetCookie::fromString`.\n- Message: Message parsing logic for both requests and responses has been moved\n  to `GuzzleHttp\\Message\\MessageFactory::fromMessage`. Message parsing is only\n  used in debugging or deserializing messages, so it doesn't make sense for\n  Guzzle as a library to add this level of complexity to parsing messages.\n- UriTemplate: URI template parsing has been moved to\n  `GuzzleHttp\\UriTemplate`. The Guzzle library will automatically use the PECL\n  URI template library if it is installed.\n- Url: URL parsing is now performed in `GuzzleHttp\\Url::fromString` (previously\n  it was `Guzzle\\Http\\Url::factory()`). If custom URL parsing is necessary,\n  then developers are free to subclass `GuzzleHttp\\Url`.\n\n## Plugin\n\nThe `Guzzle\\Plugin` namespace has been renamed to `GuzzleHttp\\Subscriber`.\nSeveral plugins are shipping with the core Guzzle library under this namespace.\n\n- `GuzzleHttp\\Subscriber\\Cookie`: Replaces the old CookiePlugin. Cookie jar\n  code has moved to `GuzzleHttp\\Cookie`.\n- `GuzzleHttp\\Subscriber\\History`: Replaces the old HistoryPlugin.\n- `GuzzleHttp\\Subscriber\\HttpError`: Throws errors when a bad HTTP response is\n  received.\n- `GuzzleHttp\\Subscriber\\Mock`: Replaces the old MockPlugin.\n- `GuzzleHttp\\Subscriber\\Prepare`: Prepares the body of a request just before\n  sending. This subscriber is attached to all requests by default.\n- `GuzzleHttp\\Subscriber\\Redirect`: Replaces the RedirectPlugin.\n\nThe following plugins have been removed (third-parties are free to re-implement\nthese if needed):\n\n- `GuzzleHttp\\Plugin\\Async` has been removed.\n- `GuzzleHttp\\Plugin\\CurlAuth` has been removed.\n- `GuzzleHttp\\Plugin\\ErrorResponse\\ErrorResponsePlugin` has been removed. This\n  functionality should instead be implemented with event listeners that occur\n  after normal response parsing occurs in the guzzle/command package.\n\nThe following plugins are not part of the core Guzzle package, but are provided\nin separate repositories:\n\n- `Guzzle\\Http\\Plugin\\BackoffPlugin` has been rewritten to be much simpler\n  to build custom retry policies using simple functions rather than various\n  chained classes. See: https://github.com/guzzle/retry-subscriber\n- `Guzzle\\Http\\Plugin\\Cache\\CachePlugin` has moved to\n  https://github.com/guzzle/cache-subscriber\n- `Guzzle\\Http\\Plugin\\Log\\LogPlugin` has moved to\n  https://github.com/guzzle/log-subscriber\n- `Guzzle\\Http\\Plugin\\Md5\\Md5Plugin` has moved to\n  https://github.com/guzzle/message-integrity-subscriber\n- `Guzzle\\Http\\Plugin\\Mock\\MockPlugin` has moved to\n  `GuzzleHttp\\Subscriber\\MockSubscriber`.\n- `Guzzle\\Http\\Plugin\\Oauth\\OauthPlugin` has moved to\n  https://github.com/guzzle/oauth-subscriber\n\n## Service\n\nThe service description layer of Guzzle has moved into two separate packages:\n\n- https://github.com/guzzle/command Provides a high level abstraction over web\n  services by representing web service operations using commands.\n- https://github.com/guzzle/guzzle-services Provides an implementation of\n  guzzle/command that provides request serialization and response parsing using\n  Guzzle service descriptions.\n\n## Stream\n\nStream have moved to a separate package available at\nhttps://github.com/guzzle/streams.\n\n`Guzzle\\Stream\\StreamInterface` has been given a large update to cleanly take\non the responsibilities of `Guzzle\\Http\\EntityBody` and\n`Guzzle\\Http\\EntityBodyInterface` now that they have been removed. The number\nof methods implemented by the `StreamInterface` has been drastically reduced to\nallow developers to more easily extend and decorate stream behavior.\n\n## Removed methods from StreamInterface\n\n- `getStream` and `setStream` have been removed to better encapsulate streams.\n- `getMetadata` and `setMetadata` have been removed in favor of\n  `GuzzleHttp\\Stream\\MetadataStreamInterface`.\n- `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been\n  removed. This data is accessible when\n  using streams that implement `GuzzleHttp\\Stream\\MetadataStreamInterface`.\n- `rewind` has been removed. Use `seek(0)` for a similar behavior.\n\n## Renamed methods\n\n- `detachStream` has been renamed to `detach`.\n- `feof` has been renamed to `eof`.\n- `ftell` has been renamed to `tell`.\n- `readLine` has moved from an instance method to a static class method of\n  `GuzzleHttp\\Stream\\Stream`.\n\n## Metadata streams\n\n`GuzzleHttp\\Stream\\MetadataStreamInterface` has been added to denote streams\nthat contain additional metadata accessible via `getMetadata()`.\n`GuzzleHttp\\Stream\\StreamInterface::getMetadata` and\n`GuzzleHttp\\Stream\\StreamInterface::setMetadata` have been removed.\n\n## StreamRequestFactory\n\nThe entire concept of the StreamRequestFactory has been removed. The way this\nwas used in Guzzle 3 broke the actual interface of sending streaming requests\n(instead of getting back a Response, you got a StreamInterface). Streaming\nPHP requests are now implemented through the `GuzzleHttp\\Adapter\\StreamAdapter`.\n\n3.6 to 3.7\n----------\n\n### Deprecations\n\n- You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.:\n\n```php\n\\Guzzle\\Common\\Version::$emitWarnings = true;\n```\n\nThe following APIs and options have been marked as deprecated:\n\n- Marked `Guzzle\\Http\\Message\\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead.\n- Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n- Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n- Marked `Guzzle\\Http\\Message\\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.\n- Marked `Guzzle\\Http\\Message\\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.\n- Marked `Guzzle\\Cache\\CacheAdapterFactory::factory()` as deprecated\n- Marked `Guzzle\\Service\\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\\Service\\Client.\n- Marked `Guzzle\\Parser\\Url\\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.\n- Marked `Guzzle\\Common\\Collection::inject()` as deprecated.\n- Marked `Guzzle\\Plugin\\CurlAuth\\CurlAuthPlugin` as deprecated. Use\n  `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or\n  `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));`\n\n3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational\nrequest methods. When paired with a client's configuration settings, these options allow you to specify default settings\nfor various aspects of a request. Because these options make other previous configuration options redundant, several\nconfiguration options and methods of a client and AbstractCommand have been deprecated.\n\n- Marked `Guzzle\\Service\\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`.\n- Marked `Guzzle\\Service\\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`.\n- Marked 'request.params' for `Guzzle\\Http\\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')`\n- Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0\n\n        $command = $client->getCommand('foo', array(\n            'command.headers' => array('Test' => '123'),\n            'command.response_body' => '/path/to/file'\n        ));\n\n        // Should be changed to:\n\n        $command = $client->getCommand('foo', array(\n            'command.request_options' => array(\n                'headers' => array('Test' => '123'),\n                'save_as' => '/path/to/file'\n            )\n        ));\n\n### Interface changes\n\nAdditions and changes (you will need to update any implementations or subclasses you may have created):\n\n- Added an `$options` argument to the end of the following methods of `Guzzle\\Http\\ClientInterface`:\n  createRequest, head, delete, put, patch, post, options, prepareRequest\n- Added an `$options` argument to the end of `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface::createRequest()`\n- Added an `applyOptions()` method to `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface`\n- Changed `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $body = null)` to\n  `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a\n  resource, string, or EntityBody into the $options parameter to specify the download location of the response.\n- Changed `Guzzle\\Common\\Collection::__construct($data)` to no longer accepts a null value for `$data` but a\n  default `array()`\n- Added `Guzzle\\Stream\\StreamInterface::isRepeatable`\n- Made `Guzzle\\Http\\Client::expandTemplate` and `getUriTemplate` protected methods.\n\nThe following methods were removed from interfaces. All of these methods are still available in the concrete classes\nthat implement them, but you should update your code to use alternative methods:\n\n- Removed `Guzzle\\Http\\ClientInterface::setDefaultHeaders(). Use\n  `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or\n  `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or\n  `$client->setDefaultOption('headers/{header_name}', 'value')`. or\n  `$client->setDefaultOption('headers', array('header_name' => 'value'))`.\n- Removed `Guzzle\\Http\\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`.\n- Removed `Guzzle\\Http\\ClientInterface::expandTemplate()`. This is an implementation detail.\n- Removed `Guzzle\\Http\\ClientInterface::setRequestFactory()`. This is an implementation detail.\n- Removed `Guzzle\\Http\\ClientInterface::getCurlMulti()`. This is a very specific implementation detail.\n- Removed `Guzzle\\Http\\Message\\RequestInterface::canCache`. Use the CachePlugin.\n- Removed `Guzzle\\Http\\Message\\RequestInterface::setIsRedirect`. Use the HistoryPlugin.\n- Removed `Guzzle\\Http\\Message\\RequestInterface::isRedirect`. Use the HistoryPlugin.\n\n### Cache plugin breaking changes\n\n- CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a\n  CacheStorageInterface. These two objects and interface will be removed in a future version.\n- Always setting X-cache headers on cached responses\n- Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin\n- `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface\n  $request, Response $response);`\n- `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`\n- `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`\n- Added `CacheStorageInterface::purge($url)`\n- `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin\n  $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,\n  CanCacheStrategyInterface $canCache = null)`\n- Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`\n\n3.5 to 3.6\n----------\n\n* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.\n* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution\n* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().\n  For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader().\n  Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request.\n* Specific header implementations can be created for complex headers. When a message creates a header, it uses a\n  HeaderFactory which can map specific headers to specific header classes. There is now a Link header and\n  CacheControl header implementation.\n* Moved getLinks() from Response to just be used on a Link header object.\n\nIf you previously relied on Guzzle\\Http\\Message\\Header::raw(), then you will need to update your code to use the\nHeaderInterface (e.g. toArray(), getAll(), etc.).\n\n### Interface changes\n\n* Removed from interface: Guzzle\\Http\\ClientInterface::setUriTemplate\n* Removed from interface: Guzzle\\Http\\ClientInterface::setCurlMulti()\n* Removed Guzzle\\Http\\Message\\Request::receivedRequestHeader() and implemented this functionality in\n  Guzzle\\Http\\Curl\\RequestMediator\n* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.\n* Removed the optional $tryChunkedTransfer option from Guzzle\\Http\\Message\\EntityEnclosingRequestInterface\n* Removed the $asObjects argument from Guzzle\\Http\\Message\\MessageInterface::getHeaders()\n\n### Removed deprecated functions\n\n* Removed Guzzle\\Parser\\ParserRegister::get(). Use getParser()\n* Removed Guzzle\\Parser\\ParserRegister::set(). Use registerParser().\n\n### Deprecations\n\n* The ability to case-insensitively search for header values\n* Guzzle\\Http\\Message\\Header::hasExactHeader\n* Guzzle\\Http\\Message\\Header::raw. Use getAll()\n* Deprecated cache control specific methods on Guzzle\\Http\\Message\\AbstractMessage. Use the CacheControl header object\n  instead.\n\n### Other changes\n\n* All response header helper functions return a string rather than mixing Header objects and strings inconsistently\n* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle\n  directly via interfaces\n* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist\n  but are a no-op until removed.\n* Most classes that used to require a `Guzzle\\Service\\Command\\CommandInterface` typehint now request a\n  `Guzzle\\Service\\Command\\ArrayCommandInterface`.\n* Added `Guzzle\\Http\\Message\\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response\n  on a request while the request is still being transferred\n* `Guzzle\\Service\\Command\\CommandInterface` now extends from ToArrayInterface and ArrayAccess\n\n3.3 to 3.4\n----------\n\nBase URLs of a client now follow the rules of https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.2 when merging URLs.\n\n3.2 to 3.3\n----------\n\n### Response::getEtag() quote stripping removed\n\n`Guzzle\\Http\\Message\\Response::getEtag()` no longer strips quotes around the ETag response header\n\n### Removed `Guzzle\\Http\\Utils`\n\nThe `Guzzle\\Http\\Utils` class was removed. This class was only used for testing.\n\n### Stream wrapper and type\n\n`Guzzle\\Stream\\Stream::getWrapper()` and `Guzzle\\Stream\\Stream::getStreamType()` are no longer converted to lowercase.\n\n### curl.emit_io became emit_io\n\nEmitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the\n'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'\n\n3.1 to 3.2\n----------\n\n### CurlMulti is no longer reused globally\n\nBefore 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added\nto a single client can pollute requests dispatched from other clients.\n\nIf you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the\nServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is\ncreated.\n\n```php\n$multi = new Guzzle\\Http\\Curl\\CurlMulti();\n$builder = Guzzle\\Service\\Builder\\ServiceBuilder::factory('/path/to/config.json');\n$builder->addListener('service_builder.create_client', function ($event) use ($multi) {\n    $event['client']->setCurlMulti($multi);\n}\n});\n```\n\n### No default path\n\nURLs no longer have a default path value of '/' if no path was specified.\n\nBefore:\n\n```php\n$request = $client->get('http://www.foo.com');\necho $request->getUrl();\n// >> http://www.foo.com/\n```\n\nAfter:\n\n```php\n$request = $client->get('http://www.foo.com');\necho $request->getUrl();\n// >> http://www.foo.com\n```\n\n### Less verbose BadResponseException\n\nThe exception message for `Guzzle\\Http\\Exception\\BadResponseException` no longer contains the full HTTP request and\nresponse information. You can, however, get access to the request and response object by calling `getRequest()` or\n`getResponse()` on the exception object.\n\n### Query parameter aggregation\n\nMulti-valued query parameters are no longer aggregated using a callback function. `Guzzle\\Http\\Query` now has a\nsetAggregator() method that accepts a `Guzzle\\Http\\QueryAggregator\\QueryAggregatorInterface` object. This object is\nresponsible for handling the aggregation of multi-valued query string variables into a flattened hash.\n\n2.8 to 3.x\n----------\n\n### Guzzle\\Service\\Inspector\n\nChange `\\Guzzle\\Service\\Inspector::fromConfig` to `\\Guzzle\\Common\\Collection::fromConfig`\n\n**Before**\n\n```php\nuse Guzzle\\Service\\Inspector;\n\nclass YourClient extends \\Guzzle\\Service\\Client\n{\n    public static function factory($config = array())\n    {\n        $default = array();\n        $required = array('base_url', 'username', 'api_key');\n        $config = Inspector::fromConfig($config, $default, $required);\n\n        $client = new self(\n            $config->get('base_url'),\n            $config->get('username'),\n            $config->get('api_key')\n        );\n        $client->setConfig($config);\n\n        $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));\n\n        return $client;\n    }\n```\n\n**After**\n\n```php\nuse Guzzle\\Common\\Collection;\n\nclass YourClient extends \\Guzzle\\Service\\Client\n{\n    public static function factory($config = array())\n    {\n        $default = array();\n        $required = array('base_url', 'username', 'api_key');\n        $config = Collection::fromConfig($config, $default, $required);\n\n        $client = new self(\n            $config->get('base_url'),\n            $config->get('username'),\n            $config->get('api_key')\n        );\n        $client->setConfig($config);\n\n        $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));\n\n        return $client;\n    }\n```\n\n### Convert XML Service Descriptions to JSON\n\n**Before**\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<client>\n    <commands>\n        <!-- Groups -->\n        <command name=\"list_groups\" method=\"GET\" uri=\"groups.json\">\n            <doc>Get a list of groups</doc>\n        </command>\n        <command name=\"search_groups\" method=\"GET\" uri='search.json?query=\"{{query}} type:group\"'>\n            <doc>Uses a search query to get a list of groups</doc>\n            <param name=\"query\" type=\"string\" required=\"true\" />\n        </command>\n        <command name=\"create_group\" method=\"POST\" uri=\"groups.json\">\n            <doc>Create a group</doc>\n            <param name=\"data\" type=\"array\" location=\"body\" filters=\"json_encode\" doc=\"Group JSON\"/>\n            <param name=\"Content-Type\" location=\"header\" static=\"application/json\"/>\n        </command>\n        <command name=\"delete_group\" method=\"DELETE\" uri=\"groups/{{id}}.json\">\n            <doc>Delete a group by ID</doc>\n            <param name=\"id\" type=\"integer\" required=\"true\"/>\n        </command>\n        <command name=\"get_group\" method=\"GET\" uri=\"groups/{{id}}.json\">\n            <param name=\"id\" type=\"integer\" required=\"true\"/>\n        </command>\n        <command name=\"update_group\" method=\"PUT\" uri=\"groups/{{id}}.json\">\n            <doc>Update a group</doc>\n            <param name=\"id\" type=\"integer\" required=\"true\"/>\n            <param name=\"data\" type=\"array\" location=\"body\" filters=\"json_encode\" doc=\"Group JSON\"/>\n            <param name=\"Content-Type\" location=\"header\" static=\"application/json\"/>\n        </command>\n    </commands>\n</client>\n```\n\n**After**\n\n```json\n{\n    \"name\":       \"Zendesk REST API v2\",\n    \"apiVersion\": \"2012-12-31\",\n    \"description\":\"Provides access to Zendesk views, groups, tickets, ticket fields, and users\",\n    \"operations\": {\n        \"list_groups\":  {\n            \"httpMethod\":\"GET\",\n            \"uri\":       \"groups.json\",\n            \"summary\":   \"Get a list of groups\"\n        },\n        \"search_groups\":{\n            \"httpMethod\":\"GET\",\n            \"uri\":       \"search.json?query=\\\"{query} type:group\\\"\",\n            \"summary\":   \"Uses a search query to get a list of groups\",\n            \"parameters\":{\n                \"query\":{\n                    \"location\":   \"uri\",\n                    \"description\":\"Zendesk Search Query\",\n                    \"type\":       \"string\",\n                    \"required\":   true\n                }\n            }\n        },\n        \"create_group\": {\n            \"httpMethod\":\"POST\",\n            \"uri\":       \"groups.json\",\n            \"summary\":   \"Create a group\",\n            \"parameters\":{\n                \"data\":        {\n                    \"type\":       \"array\",\n                    \"location\":   \"body\",\n                    \"description\":\"Group JSON\",\n                    \"filters\":    \"json_encode\",\n                    \"required\":   true\n                },\n                \"Content-Type\":{\n                    \"type\":    \"string\",\n                    \"location\":\"header\",\n                    \"static\":  \"application/json\"\n                }\n            }\n        },\n        \"delete_group\": {\n            \"httpMethod\":\"DELETE\",\n            \"uri\":       \"groups/{id}.json\",\n            \"summary\":   \"Delete a group\",\n            \"parameters\":{\n                \"id\":{\n                    \"location\":   \"uri\",\n                    \"description\":\"Group to delete by ID\",\n                    \"type\":       \"integer\",\n                    \"required\":   true\n                }\n            }\n        },\n        \"get_group\":    {\n            \"httpMethod\":\"GET\",\n            \"uri\":       \"groups/{id}.json\",\n            \"summary\":   \"Get a ticket\",\n            \"parameters\":{\n                \"id\":{\n                    \"location\":   \"uri\",\n                    \"description\":\"Group to get by ID\",\n                    \"type\":       \"integer\",\n                    \"required\":   true\n                }\n            }\n        },\n        \"update_group\": {\n            \"httpMethod\":\"PUT\",\n            \"uri\":       \"groups/{id}.json\",\n            \"summary\":   \"Update a group\",\n            \"parameters\":{\n                \"id\":          {\n                    \"location\":   \"uri\",\n                    \"description\":\"Group to update by ID\",\n                    \"type\":       \"integer\",\n                    \"required\":   true\n                },\n                \"data\":        {\n                    \"type\":       \"array\",\n                    \"location\":   \"body\",\n                    \"description\":\"Group JSON\",\n                    \"filters\":    \"json_encode\",\n                    \"required\":   true\n                },\n                \"Content-Type\":{\n                    \"type\":    \"string\",\n                    \"location\":\"header\",\n                    \"static\":  \"application/json\"\n                }\n            }\n        }\n}\n```\n\n### Guzzle\\Service\\Description\\ServiceDescription\n\nCommands are now called Operations\n\n**Before**\n\n```php\nuse Guzzle\\Service\\Description\\ServiceDescription;\n\n$sd = new ServiceDescription();\n$sd->getCommands();     // @returns ApiCommandInterface[]\n$sd->hasCommand($name);\n$sd->getCommand($name); // @returns ApiCommandInterface|null\n$sd->addCommand($command); // @param ApiCommandInterface $command\n```\n\n**After**\n\n```php\nuse Guzzle\\Service\\Description\\ServiceDescription;\n\n$sd = new ServiceDescription();\n$sd->getOperations();           // @returns OperationInterface[]\n$sd->hasOperation($name);\n$sd->getOperation($name);       // @returns OperationInterface|null\n$sd->addOperation($operation);  // @param OperationInterface $operation\n```\n\n### Guzzle\\Common\\Inflection\\Inflector\n\nNamespace is now `Guzzle\\Inflection\\Inflector`\n\n### Guzzle\\Http\\Plugin\n\nNamespace is now `Guzzle\\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below.\n\n### Guzzle\\Http\\Plugin\\LogPlugin and Guzzle\\Common\\Log\n\nNow `Guzzle\\Plugin\\Log\\LogPlugin` and `Guzzle\\Log` respectively.\n\n**Before**\n\n```php\nuse Guzzle\\Common\\Log\\ClosureLogAdapter;\nuse Guzzle\\Http\\Plugin\\LogPlugin;\n\n/** @var \\Guzzle\\Http\\Client */\n$client;\n\n// $verbosity is an integer indicating desired message verbosity level\n$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE);\n```\n\n**After**\n\n```php\nuse Guzzle\\Log\\ClosureLogAdapter;\nuse Guzzle\\Log\\MessageFormatter;\nuse Guzzle\\Plugin\\Log\\LogPlugin;\n\n/** @var \\Guzzle\\Http\\Client */\n$client;\n\n// $format is a string indicating desired message format -- @see MessageFormatter\n$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT);\n```\n\n### Guzzle\\Http\\Plugin\\CurlAuthPlugin\n\nNow `Guzzle\\Plugin\\CurlAuth\\CurlAuthPlugin`.\n\n### Guzzle\\Http\\Plugin\\ExponentialBackoffPlugin\n\nNow `Guzzle\\Plugin\\Backoff\\BackoffPlugin`, and other changes.\n\n**Before**\n\n```php\nuse Guzzle\\Http\\Plugin\\ExponentialBackoffPlugin;\n\n$backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge(\n        ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429)\n    ));\n\n$client->addSubscriber($backoffPlugin);\n```\n\n**After**\n\n```php\nuse Guzzle\\Plugin\\Backoff\\BackoffPlugin;\nuse Guzzle\\Plugin\\Backoff\\HttpBackoffStrategy;\n\n// Use convenient factory method instead -- see implementation for ideas of what\n// you can do with chaining backoff strategies\n$backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge(\n        HttpBackoffStrategy::getDefaultFailureCodes(), array(429)\n    ));\n$client->addSubscriber($backoffPlugin);\n```\n\n### Known Issues\n\n#### [BUG] Accept-Encoding header behavior changed unintentionally.\n\n(See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e)\n\nIn version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to\nproperly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen.\nSee issue #217 for a workaround, or use a version containing the fix.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/composer.json",
    "content": "{\n    \"name\": \"guzzlehttp/guzzle\",\n    \"description\": \"Guzzle is a PHP HTTP client library\",\n    \"keywords\": [\n        \"framework\",\n        \"http\",\n        \"rest\",\n        \"web service\",\n        \"curl\",\n        \"client\",\n        \"HTTP client\",\n        \"PSR-7\",\n        \"PSR-18\"\n    ],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Graham Campbell\",\n            \"email\": \"hello@gjcampbell.co.uk\",\n            \"homepage\": \"https://github.com/GrahamCampbell\"\n        },\n        {\n            \"name\": \"Michael Dowling\",\n            \"email\": \"mtdowling@gmail.com\",\n            \"homepage\": \"https://github.com/mtdowling\"\n        },\n        {\n            \"name\": \"Jeremy Lindblom\",\n            \"email\": \"jeremeamia@gmail.com\",\n            \"homepage\": \"https://github.com/jeremeamia\"\n        },\n        {\n            \"name\": \"George Mponos\",\n            \"email\": \"gmponos@gmail.com\",\n            \"homepage\": \"https://github.com/gmponos\"\n        },\n        {\n            \"name\": \"Tobias Nyholm\",\n            \"email\": \"tobias.nyholm@gmail.com\",\n            \"homepage\": \"https://github.com/Nyholm\"\n        },\n        {\n            \"name\": \"Márk Sági-Kazár\",\n            \"email\": \"mark.sagikazar@gmail.com\",\n            \"homepage\": \"https://github.com/sagikazarmark\"\n        },\n        {\n            \"name\": \"Tobias Schultze\",\n            \"email\": \"webmaster@tubo-world.de\",\n            \"homepage\": \"https://github.com/Tobion\"\n        }\n    ],\n    \"require\": {\n        \"php\": \"^7.2.5 || ^8.0\",\n        \"ext-json\": \"*\",\n        \"guzzlehttp/promises\": \"^1.5.3 || ^2.0.1\",\n        \"guzzlehttp/psr7\": \"^1.9.1 || ^2.5.1\",\n        \"psr/http-client\": \"^1.0\",\n        \"symfony/deprecation-contracts\": \"^2.2 || ^3.0\"\n    },\n    \"provide\": {\n        \"psr/http-client-implementation\": \"1.0\"\n    },\n    \"require-dev\": {\n        \"ext-curl\": \"*\",\n        \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n        \"php-http/client-integration-tests\": \"dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999\",\n        \"php-http/message-factory\": \"^1.1\",\n        \"phpunit/phpunit\": \"^8.5.36 || ^9.6.15\",\n        \"psr/log\": \"^1.1 || ^2.0 || ^3.0\"\n    },\n    \"suggest\": {\n        \"ext-curl\": \"Required for CURL handler support\",\n        \"ext-intl\": \"Required for Internationalized Domain Name (IDN) support\",\n        \"psr/log\": \"Required for using the Log middleware\"\n    },\n    \"config\": {\n        \"allow-plugins\": {\n            \"bamarni/composer-bin-plugin\": true\n        },\n        \"preferred-install\": \"dist\",\n        \"sort-packages\": true\n    },\n    \"extra\": {\n        \"bamarni-bin\": {\n            \"bin-links\": true,\n            \"forward-command\": false\n        }\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\\": \"src/\"\n        },\n        \"files\": [\n            \"src/functions_include.php\"\n        ]\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Tests\\\\\": \"tests/\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/BodySummarizer.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\MessageInterface;\n\nfinal class BodySummarizer implements BodySummarizerInterface\n{\n    /**\n     * @var int|null\n     */\n    private $truncateAt;\n\n    public function __construct(int $truncateAt = null)\n    {\n        $this->truncateAt = $truncateAt;\n    }\n\n    /**\n     * Returns a summarized message body.\n     */\n    public function summarize(MessageInterface $message): ?string\n    {\n        return $this->truncateAt === null\n            ? \\GuzzleHttp\\Psr7\\Message::bodySummary($message)\n            : \\GuzzleHttp\\Psr7\\Message::bodySummary($message, $this->truncateAt);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\MessageInterface;\n\ninterface BodySummarizerInterface\n{\n    /**\n     * Returns a summarized message body.\n     */\n    public function summarize(MessageInterface $message): ?string;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Client.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Cookie\\CookieJar;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse GuzzleHttp\\Exception\\InvalidArgumentException;\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * @final\n */\nclass Client implements ClientInterface, \\Psr\\Http\\Client\\ClientInterface\n{\n    use ClientTrait;\n\n    /**\n     * @var array Default request options\n     */\n    private $config;\n\n    /**\n     * Clients accept an array of constructor parameters.\n     *\n     * Here's an example of creating a client using a base_uri and an array of\n     * default request options to apply to each request:\n     *\n     *     $client = new Client([\n     *         'base_uri'        => 'http://www.foo.com/1.0/',\n     *         'timeout'         => 0,\n     *         'allow_redirects' => false,\n     *         'proxy'           => '192.168.16.1:10'\n     *     ]);\n     *\n     * Client configuration settings include the following options:\n     *\n     * - handler: (callable) Function that transfers HTTP requests over the\n     *   wire. The function is called with a Psr7\\Http\\Message\\RequestInterface\n     *   and array of transfer options, and must return a\n     *   GuzzleHttp\\Promise\\PromiseInterface that is fulfilled with a\n     *   Psr7\\Http\\Message\\ResponseInterface on success.\n     *   If no handler is provided, a default handler will be created\n     *   that enables all of the request options below by attaching all of the\n     *   default middleware to the handler.\n     * - base_uri: (string|UriInterface) Base URI of the client that is merged\n     *   into relative URIs. Can be a string or instance of UriInterface.\n     * - **: any request option\n     *\n     * @param array $config Client configuration settings.\n     *\n     * @see \\GuzzleHttp\\RequestOptions for a list of available request options.\n     */\n    public function __construct(array $config = [])\n    {\n        if (!isset($config['handler'])) {\n            $config['handler'] = HandlerStack::create();\n        } elseif (!\\is_callable($config['handler'])) {\n            throw new InvalidArgumentException('handler must be a callable');\n        }\n\n        // Convert the base_uri to a UriInterface\n        if (isset($config['base_uri'])) {\n            $config['base_uri'] = Psr7\\Utils::uriFor($config['base_uri']);\n        }\n\n        $this->configureDefaults($config);\n    }\n\n    /**\n     * @param string $method\n     * @param array  $args\n     *\n     * @return PromiseInterface|ResponseInterface\n     *\n     * @deprecated Client::__call will be removed in guzzlehttp/guzzle:8.0.\n     */\n    public function __call($method, $args)\n    {\n        if (\\count($args) < 1) {\n            throw new InvalidArgumentException('Magic request methods require a URI and optional options array');\n        }\n\n        $uri = $args[0];\n        $opts = $args[1] ?? [];\n\n        return \\substr($method, -5) === 'Async'\n            ? $this->requestAsync(\\substr($method, 0, -5), $uri, $opts)\n            : $this->request($method, $uri, $opts);\n    }\n\n    /**\n     * Asynchronously send an HTTP request.\n     *\n     * @param array $options Request options to apply to the given\n     *                       request and to the transfer. See \\GuzzleHttp\\RequestOptions.\n     */\n    public function sendAsync(RequestInterface $request, array $options = []): PromiseInterface\n    {\n        // Merge the base URI into the request URI if needed.\n        $options = $this->prepareDefaults($options);\n\n        return $this->transfer(\n            $request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')),\n            $options\n        );\n    }\n\n    /**\n     * Send an HTTP request.\n     *\n     * @param array $options Request options to apply to the given\n     *                       request and to the transfer. See \\GuzzleHttp\\RequestOptions.\n     *\n     * @throws GuzzleException\n     */\n    public function send(RequestInterface $request, array $options = []): ResponseInterface\n    {\n        $options[RequestOptions::SYNCHRONOUS] = true;\n\n        return $this->sendAsync($request, $options)->wait();\n    }\n\n    /**\n     * The HttpClient PSR (PSR-18) specify this method.\n     *\n     * {@inheritDoc}\n     */\n    public function sendRequest(RequestInterface $request): ResponseInterface\n    {\n        $options[RequestOptions::SYNCHRONOUS] = true;\n        $options[RequestOptions::ALLOW_REDIRECTS] = false;\n        $options[RequestOptions::HTTP_ERRORS] = false;\n\n        return $this->sendAsync($request, $options)->wait();\n    }\n\n    /**\n     * Create and send an asynchronous HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string              $method  HTTP method\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply. See \\GuzzleHttp\\RequestOptions.\n     */\n    public function requestAsync(string $method, $uri = '', array $options = []): PromiseInterface\n    {\n        $options = $this->prepareDefaults($options);\n        // Remove request modifying parameter because it can be done up-front.\n        $headers = $options['headers'] ?? [];\n        $body = $options['body'] ?? null;\n        $version = $options['version'] ?? '1.1';\n        // Merge the URI into the base URI.\n        $uri = $this->buildUri(Psr7\\Utils::uriFor($uri), $options);\n        if (\\is_array($body)) {\n            throw $this->invalidBody();\n        }\n        $request = new Psr7\\Request($method, $uri, $headers, $body, $version);\n        // Remove the option so that they are not doubly-applied.\n        unset($options['headers'], $options['body'], $options['version']);\n\n        return $this->transfer($request, $options);\n    }\n\n    /**\n     * Create and send an HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string              $method  HTTP method.\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply. See \\GuzzleHttp\\RequestOptions.\n     *\n     * @throws GuzzleException\n     */\n    public function request(string $method, $uri = '', array $options = []): ResponseInterface\n    {\n        $options[RequestOptions::SYNCHRONOUS] = true;\n\n        return $this->requestAsync($method, $uri, $options)->wait();\n    }\n\n    /**\n     * Get a client configuration option.\n     *\n     * These options include default request options of the client, a \"handler\"\n     * (if utilized by the concrete client), and a \"base_uri\" if utilized by\n     * the concrete client.\n     *\n     * @param string|null $option The config option to retrieve.\n     *\n     * @return mixed\n     *\n     * @deprecated Client::getConfig will be removed in guzzlehttp/guzzle:8.0.\n     */\n    public function getConfig(string $option = null)\n    {\n        return $option === null\n            ? $this->config\n            : ($this->config[$option] ?? null);\n    }\n\n    private function buildUri(UriInterface $uri, array $config): UriInterface\n    {\n        if (isset($config['base_uri'])) {\n            $uri = Psr7\\UriResolver::resolve(Psr7\\Utils::uriFor($config['base_uri']), $uri);\n        }\n\n        if (isset($config['idn_conversion']) && ($config['idn_conversion'] !== false)) {\n            $idnOptions = ($config['idn_conversion'] === true) ? \\IDNA_DEFAULT : $config['idn_conversion'];\n            $uri = Utils::idnUriConvert($uri, $idnOptions);\n        }\n\n        return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri;\n    }\n\n    /**\n     * Configures the default options for a client.\n     */\n    private function configureDefaults(array $config): void\n    {\n        $defaults = [\n            'allow_redirects' => RedirectMiddleware::$defaultSettings,\n            'http_errors' => true,\n            'decode_content' => true,\n            'verify' => true,\n            'cookies' => false,\n            'idn_conversion' => false,\n        ];\n\n        // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.\n\n        // We can only trust the HTTP_PROXY environment variable in a CLI\n        // process due to the fact that PHP has no reliable mechanism to\n        // get environment variables that start with \"HTTP_\".\n        if (\\PHP_SAPI === 'cli' && ($proxy = Utils::getenv('HTTP_PROXY'))) {\n            $defaults['proxy']['http'] = $proxy;\n        }\n\n        if ($proxy = Utils::getenv('HTTPS_PROXY')) {\n            $defaults['proxy']['https'] = $proxy;\n        }\n\n        if ($noProxy = Utils::getenv('NO_PROXY')) {\n            $cleanedNoProxy = \\str_replace(' ', '', $noProxy);\n            $defaults['proxy']['no'] = \\explode(',', $cleanedNoProxy);\n        }\n\n        $this->config = $config + $defaults;\n\n        if (!empty($config['cookies']) && $config['cookies'] === true) {\n            $this->config['cookies'] = new CookieJar();\n        }\n\n        // Add the default user-agent header.\n        if (!isset($this->config['headers'])) {\n            $this->config['headers'] = ['User-Agent' => Utils::defaultUserAgent()];\n        } else {\n            // Add the User-Agent header if one was not already set.\n            foreach (\\array_keys($this->config['headers']) as $name) {\n                if (\\strtolower($name) === 'user-agent') {\n                    return;\n                }\n            }\n            $this->config['headers']['User-Agent'] = Utils::defaultUserAgent();\n        }\n    }\n\n    /**\n     * Merges default options into the array.\n     *\n     * @param array $options Options to modify by reference\n     */\n    private function prepareDefaults(array $options): array\n    {\n        $defaults = $this->config;\n\n        if (!empty($defaults['headers'])) {\n            // Default headers are only added if they are not present.\n            $defaults['_conditional'] = $defaults['headers'];\n            unset($defaults['headers']);\n        }\n\n        // Special handling for headers is required as they are added as\n        // conditional headers and as headers passed to a request ctor.\n        if (\\array_key_exists('headers', $options)) {\n            // Allows default headers to be unset.\n            if ($options['headers'] === null) {\n                $defaults['_conditional'] = [];\n                unset($options['headers']);\n            } elseif (!\\is_array($options['headers'])) {\n                throw new InvalidArgumentException('headers must be an array');\n            }\n        }\n\n        // Shallow merge defaults underneath options.\n        $result = $options + $defaults;\n\n        // Remove null values.\n        foreach ($result as $k => $v) {\n            if ($v === null) {\n                unset($result[$k]);\n            }\n        }\n\n        return $result;\n    }\n\n    /**\n     * Transfers the given request and applies request options.\n     *\n     * The URI of the request is not modified and the request options are used\n     * as-is without merging in default options.\n     *\n     * @param array $options See \\GuzzleHttp\\RequestOptions.\n     */\n    private function transfer(RequestInterface $request, array $options): PromiseInterface\n    {\n        $request = $this->applyOptions($request, $options);\n        /** @var HandlerStack $handler */\n        $handler = $options['handler'];\n\n        try {\n            return P\\Create::promiseFor($handler($request, $options));\n        } catch (\\Exception $e) {\n            return P\\Create::rejectionFor($e);\n        }\n    }\n\n    /**\n     * Applies the array of request options to a request.\n     */\n    private function applyOptions(RequestInterface $request, array &$options): RequestInterface\n    {\n        $modify = [\n            'set_headers' => [],\n        ];\n\n        if (isset($options['headers'])) {\n            if (array_keys($options['headers']) === range(0, count($options['headers']) - 1)) {\n                throw new InvalidArgumentException('The headers array must have header name as keys.');\n            }\n            $modify['set_headers'] = $options['headers'];\n            unset($options['headers']);\n        }\n\n        if (isset($options['form_params'])) {\n            if (isset($options['multipart'])) {\n                throw new InvalidArgumentException('You cannot use '\n                    .'form_params and multipart at the same time. Use the '\n                    .'form_params option if you want to send application/'\n                    .'x-www-form-urlencoded requests, and the multipart '\n                    .'option to send multipart/form-data requests.');\n            }\n            $options['body'] = \\http_build_query($options['form_params'], '', '&');\n            unset($options['form_params']);\n            // Ensure that we don't have the header in different case and set the new value.\n            $options['_conditional'] = Psr7\\Utils::caselessRemove(['Content-Type'], $options['_conditional']);\n            $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded';\n        }\n\n        if (isset($options['multipart'])) {\n            $options['body'] = new Psr7\\MultipartStream($options['multipart']);\n            unset($options['multipart']);\n        }\n\n        if (isset($options['json'])) {\n            $options['body'] = Utils::jsonEncode($options['json']);\n            unset($options['json']);\n            // Ensure that we don't have the header in different case and set the new value.\n            $options['_conditional'] = Psr7\\Utils::caselessRemove(['Content-Type'], $options['_conditional']);\n            $options['_conditional']['Content-Type'] = 'application/json';\n        }\n\n        if (!empty($options['decode_content'])\n            && $options['decode_content'] !== true\n        ) {\n            // Ensure that we don't have the header in different case and set the new value.\n            $options['_conditional'] = Psr7\\Utils::caselessRemove(['Accept-Encoding'], $options['_conditional']);\n            $modify['set_headers']['Accept-Encoding'] = $options['decode_content'];\n        }\n\n        if (isset($options['body'])) {\n            if (\\is_array($options['body'])) {\n                throw $this->invalidBody();\n            }\n            $modify['body'] = Psr7\\Utils::streamFor($options['body']);\n            unset($options['body']);\n        }\n\n        if (!empty($options['auth']) && \\is_array($options['auth'])) {\n            $value = $options['auth'];\n            $type = isset($value[2]) ? \\strtolower($value[2]) : 'basic';\n            switch ($type) {\n                case 'basic':\n                    // Ensure that we don't have the header in different case and set the new value.\n                    $modify['set_headers'] = Psr7\\Utils::caselessRemove(['Authorization'], $modify['set_headers']);\n                    $modify['set_headers']['Authorization'] = 'Basic '\n                        .\\base64_encode(\"$value[0]:$value[1]\");\n                    break;\n                case 'digest':\n                    // @todo: Do not rely on curl\n                    $options['curl'][\\CURLOPT_HTTPAUTH] = \\CURLAUTH_DIGEST;\n                    $options['curl'][\\CURLOPT_USERPWD] = \"$value[0]:$value[1]\";\n                    break;\n                case 'ntlm':\n                    $options['curl'][\\CURLOPT_HTTPAUTH] = \\CURLAUTH_NTLM;\n                    $options['curl'][\\CURLOPT_USERPWD] = \"$value[0]:$value[1]\";\n                    break;\n            }\n        }\n\n        if (isset($options['query'])) {\n            $value = $options['query'];\n            if (\\is_array($value)) {\n                $value = \\http_build_query($value, '', '&', \\PHP_QUERY_RFC3986);\n            }\n            if (!\\is_string($value)) {\n                throw new InvalidArgumentException('query must be a string or array');\n            }\n            $modify['query'] = $value;\n            unset($options['query']);\n        }\n\n        // Ensure that sink is not an invalid value.\n        if (isset($options['sink'])) {\n            // TODO: Add more sink validation?\n            if (\\is_bool($options['sink'])) {\n                throw new InvalidArgumentException('sink must not be a boolean');\n            }\n        }\n\n        if (isset($options['version'])) {\n            $modify['version'] = $options['version'];\n        }\n\n        $request = Psr7\\Utils::modifyRequest($request, $modify);\n        if ($request->getBody() instanceof Psr7\\MultipartStream) {\n            // Use a multipart/form-data POST if a Content-Type is not set.\n            // Ensure that we don't have the header in different case and set the new value.\n            $options['_conditional'] = Psr7\\Utils::caselessRemove(['Content-Type'], $options['_conditional']);\n            $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary='\n                .$request->getBody()->getBoundary();\n        }\n\n        // Merge in conditional headers if they are not present.\n        if (isset($options['_conditional'])) {\n            // Build up the changes so it's in a single clone of the message.\n            $modify = [];\n            foreach ($options['_conditional'] as $k => $v) {\n                if (!$request->hasHeader($k)) {\n                    $modify['set_headers'][$k] = $v;\n                }\n            }\n            $request = Psr7\\Utils::modifyRequest($request, $modify);\n            // Don't pass this internal value along to middleware/handlers.\n            unset($options['_conditional']);\n        }\n\n        return $request;\n    }\n\n    /**\n     * Return an InvalidArgumentException with pre-set message.\n     */\n    private function invalidBody(): InvalidArgumentException\n    {\n        return new InvalidArgumentException('Passing in the \"body\" request '\n            .'option as an array to send a request is not supported. '\n            .'Please use the \"form_params\" request option to send a '\n            .'application/x-www-form-urlencoded request, or the \"multipart\" '\n            .'request option to send a multipart/form-data request.');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/ClientInterface.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Client interface for sending HTTP requests.\n */\ninterface ClientInterface\n{\n    /**\n     * The Guzzle major version.\n     */\n    public const MAJOR_VERSION = 7;\n\n    /**\n     * Send an HTTP request.\n     *\n     * @param RequestInterface $request Request to send\n     * @param array            $options Request options to apply to the given\n     *                                  request and to the transfer.\n     *\n     * @throws GuzzleException\n     */\n    public function send(RequestInterface $request, array $options = []): ResponseInterface;\n\n    /**\n     * Asynchronously send an HTTP request.\n     *\n     * @param RequestInterface $request Request to send\n     * @param array            $options Request options to apply to the given\n     *                                  request and to the transfer.\n     */\n    public function sendAsync(RequestInterface $request, array $options = []): PromiseInterface;\n\n    /**\n     * Create and send an HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string              $method  HTTP method.\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @throws GuzzleException\n     */\n    public function request(string $method, $uri, array $options = []): ResponseInterface;\n\n    /**\n     * Create and send an asynchronous HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string              $method  HTTP method\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     */\n    public function requestAsync(string $method, $uri, array $options = []): PromiseInterface;\n\n    /**\n     * Get a client configuration option.\n     *\n     * These options include default request options of the client, a \"handler\"\n     * (if utilized by the concrete client), and a \"base_uri\" if utilized by\n     * the concrete client.\n     *\n     * @param string|null $option The config option to retrieve.\n     *\n     * @return mixed\n     *\n     * @deprecated ClientInterface::getConfig will be removed in guzzlehttp/guzzle:8.0.\n     */\n    public function getConfig(string $option = null);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/ClientTrait.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Client interface for sending HTTP requests.\n */\ntrait ClientTrait\n{\n    /**\n     * Create and send an HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string              $method  HTTP method.\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @throws GuzzleException\n     */\n    abstract public function request(string $method, $uri, array $options = []): ResponseInterface;\n\n    /**\n     * Create and send an HTTP GET request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @throws GuzzleException\n     */\n    public function get($uri, array $options = []): ResponseInterface\n    {\n        return $this->request('GET', $uri, $options);\n    }\n\n    /**\n     * Create and send an HTTP HEAD request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @throws GuzzleException\n     */\n    public function head($uri, array $options = []): ResponseInterface\n    {\n        return $this->request('HEAD', $uri, $options);\n    }\n\n    /**\n     * Create and send an HTTP PUT request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @throws GuzzleException\n     */\n    public function put($uri, array $options = []): ResponseInterface\n    {\n        return $this->request('PUT', $uri, $options);\n    }\n\n    /**\n     * Create and send an HTTP POST request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @throws GuzzleException\n     */\n    public function post($uri, array $options = []): ResponseInterface\n    {\n        return $this->request('POST', $uri, $options);\n    }\n\n    /**\n     * Create and send an HTTP PATCH request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @throws GuzzleException\n     */\n    public function patch($uri, array $options = []): ResponseInterface\n    {\n        return $this->request('PATCH', $uri, $options);\n    }\n\n    /**\n     * Create and send an HTTP DELETE request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @throws GuzzleException\n     */\n    public function delete($uri, array $options = []): ResponseInterface\n    {\n        return $this->request('DELETE', $uri, $options);\n    }\n\n    /**\n     * Create and send an asynchronous HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string              $method  HTTP method\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     */\n    abstract public function requestAsync(string $method, $uri, array $options = []): PromiseInterface;\n\n    /**\n     * Create and send an asynchronous HTTP GET request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     */\n    public function getAsync($uri, array $options = []): PromiseInterface\n    {\n        return $this->requestAsync('GET', $uri, $options);\n    }\n\n    /**\n     * Create and send an asynchronous HTTP HEAD request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     */\n    public function headAsync($uri, array $options = []): PromiseInterface\n    {\n        return $this->requestAsync('HEAD', $uri, $options);\n    }\n\n    /**\n     * Create and send an asynchronous HTTP PUT request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     */\n    public function putAsync($uri, array $options = []): PromiseInterface\n    {\n        return $this->requestAsync('PUT', $uri, $options);\n    }\n\n    /**\n     * Create and send an asynchronous HTTP POST request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     */\n    public function postAsync($uri, array $options = []): PromiseInterface\n    {\n        return $this->requestAsync('POST', $uri, $options);\n    }\n\n    /**\n     * Create and send an asynchronous HTTP PATCH request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     */\n    public function patchAsync($uri, array $options = []): PromiseInterface\n    {\n        return $this->requestAsync('PATCH', $uri, $options);\n    }\n\n    /**\n     * Create and send an asynchronous HTTP DELETE request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     */\n    public function deleteAsync($uri, array $options = []): PromiseInterface\n    {\n        return $this->requestAsync('DELETE', $uri, $options);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Cookie;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Cookie jar that stores cookies as an array\n */\nclass CookieJar implements CookieJarInterface\n{\n    /**\n     * @var SetCookie[] Loaded cookie data\n     */\n    private $cookies = [];\n\n    /**\n     * @var bool\n     */\n    private $strictMode;\n\n    /**\n     * @param bool  $strictMode  Set to true to throw exceptions when invalid\n     *                           cookies are added to the cookie jar.\n     * @param array $cookieArray Array of SetCookie objects or a hash of\n     *                           arrays that can be used with the SetCookie\n     *                           constructor\n     */\n    public function __construct(bool $strictMode = false, array $cookieArray = [])\n    {\n        $this->strictMode = $strictMode;\n\n        foreach ($cookieArray as $cookie) {\n            if (!($cookie instanceof SetCookie)) {\n                $cookie = new SetCookie($cookie);\n            }\n            $this->setCookie($cookie);\n        }\n    }\n\n    /**\n     * Create a new Cookie jar from an associative array and domain.\n     *\n     * @param array  $cookies Cookies to create the jar from\n     * @param string $domain  Domain to set the cookies to\n     */\n    public static function fromArray(array $cookies, string $domain): self\n    {\n        $cookieJar = new self();\n        foreach ($cookies as $name => $value) {\n            $cookieJar->setCookie(new SetCookie([\n                'Domain' => $domain,\n                'Name' => $name,\n                'Value' => $value,\n                'Discard' => true,\n            ]));\n        }\n\n        return $cookieJar;\n    }\n\n    /**\n     * Evaluate if this cookie should be persisted to storage\n     * that survives between requests.\n     *\n     * @param SetCookie $cookie              Being evaluated.\n     * @param bool      $allowSessionCookies If we should persist session cookies\n     */\n    public static function shouldPersist(SetCookie $cookie, bool $allowSessionCookies = false): bool\n    {\n        if ($cookie->getExpires() || $allowSessionCookies) {\n            if (!$cookie->getDiscard()) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Finds and returns the cookie based on the name\n     *\n     * @param string $name cookie name to search for\n     *\n     * @return SetCookie|null cookie that was found or null if not found\n     */\n    public function getCookieByName(string $name): ?SetCookie\n    {\n        foreach ($this->cookies as $cookie) {\n            if ($cookie->getName() !== null && \\strcasecmp($cookie->getName(), $name) === 0) {\n                return $cookie;\n            }\n        }\n\n        return null;\n    }\n\n    public function toArray(): array\n    {\n        return \\array_map(static function (SetCookie $cookie): array {\n            return $cookie->toArray();\n        }, $this->getIterator()->getArrayCopy());\n    }\n\n    public function clear(string $domain = null, string $path = null, string $name = null): void\n    {\n        if (!$domain) {\n            $this->cookies = [];\n\n            return;\n        } elseif (!$path) {\n            $this->cookies = \\array_filter(\n                $this->cookies,\n                static function (SetCookie $cookie) use ($domain): bool {\n                    return !$cookie->matchesDomain($domain);\n                }\n            );\n        } elseif (!$name) {\n            $this->cookies = \\array_filter(\n                $this->cookies,\n                static function (SetCookie $cookie) use ($path, $domain): bool {\n                    return !($cookie->matchesPath($path)\n                        && $cookie->matchesDomain($domain));\n                }\n            );\n        } else {\n            $this->cookies = \\array_filter(\n                $this->cookies,\n                static function (SetCookie $cookie) use ($path, $domain, $name) {\n                    return !($cookie->getName() == $name\n                        && $cookie->matchesPath($path)\n                        && $cookie->matchesDomain($domain));\n                }\n            );\n        }\n    }\n\n    public function clearSessionCookies(): void\n    {\n        $this->cookies = \\array_filter(\n            $this->cookies,\n            static function (SetCookie $cookie): bool {\n                return !$cookie->getDiscard() && $cookie->getExpires();\n            }\n        );\n    }\n\n    public function setCookie(SetCookie $cookie): bool\n    {\n        // If the name string is empty (but not 0), ignore the set-cookie\n        // string entirely.\n        $name = $cookie->getName();\n        if (!$name && $name !== '0') {\n            return false;\n        }\n\n        // Only allow cookies with set and valid domain, name, value\n        $result = $cookie->validate();\n        if ($result !== true) {\n            if ($this->strictMode) {\n                throw new \\RuntimeException('Invalid cookie: '.$result);\n            }\n            $this->removeCookieIfEmpty($cookie);\n\n            return false;\n        }\n\n        // Resolve conflicts with previously set cookies\n        foreach ($this->cookies as $i => $c) {\n            // Two cookies are identical, when their path, and domain are\n            // identical.\n            if ($c->getPath() != $cookie->getPath()\n                || $c->getDomain() != $cookie->getDomain()\n                || $c->getName() != $cookie->getName()\n            ) {\n                continue;\n            }\n\n            // The previously set cookie is a discard cookie and this one is\n            // not so allow the new cookie to be set\n            if (!$cookie->getDiscard() && $c->getDiscard()) {\n                unset($this->cookies[$i]);\n                continue;\n            }\n\n            // If the new cookie's expiration is further into the future, then\n            // replace the old cookie\n            if ($cookie->getExpires() > $c->getExpires()) {\n                unset($this->cookies[$i]);\n                continue;\n            }\n\n            // If the value has changed, we better change it\n            if ($cookie->getValue() !== $c->getValue()) {\n                unset($this->cookies[$i]);\n                continue;\n            }\n\n            // The cookie exists, so no need to continue\n            return false;\n        }\n\n        $this->cookies[] = $cookie;\n\n        return true;\n    }\n\n    public function count(): int\n    {\n        return \\count($this->cookies);\n    }\n\n    /**\n     * @return \\ArrayIterator<int, SetCookie>\n     */\n    public function getIterator(): \\ArrayIterator\n    {\n        return new \\ArrayIterator(\\array_values($this->cookies));\n    }\n\n    public function extractCookies(RequestInterface $request, ResponseInterface $response): void\n    {\n        if ($cookieHeader = $response->getHeader('Set-Cookie')) {\n            foreach ($cookieHeader as $cookie) {\n                $sc = SetCookie::fromString($cookie);\n                if (!$sc->getDomain()) {\n                    $sc->setDomain($request->getUri()->getHost());\n                }\n                if (0 !== \\strpos($sc->getPath(), '/')) {\n                    $sc->setPath($this->getCookiePathFromRequest($request));\n                }\n                if (!$sc->matchesDomain($request->getUri()->getHost())) {\n                    continue;\n                }\n                // Note: At this point `$sc->getDomain()` being a public suffix should\n                // be rejected, but we don't want to pull in the full PSL dependency.\n                $this->setCookie($sc);\n            }\n        }\n    }\n\n    /**\n     * Computes cookie path following RFC 6265 section 5.1.4\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.4\n     */\n    private function getCookiePathFromRequest(RequestInterface $request): string\n    {\n        $uriPath = $request->getUri()->getPath();\n        if ('' === $uriPath) {\n            return '/';\n        }\n        if (0 !== \\strpos($uriPath, '/')) {\n            return '/';\n        }\n        if ('/' === $uriPath) {\n            return '/';\n        }\n        $lastSlashPos = \\strrpos($uriPath, '/');\n        if (0 === $lastSlashPos || false === $lastSlashPos) {\n            return '/';\n        }\n\n        return \\substr($uriPath, 0, $lastSlashPos);\n    }\n\n    public function withCookieHeader(RequestInterface $request): RequestInterface\n    {\n        $values = [];\n        $uri = $request->getUri();\n        $scheme = $uri->getScheme();\n        $host = $uri->getHost();\n        $path = $uri->getPath() ?: '/';\n\n        foreach ($this->cookies as $cookie) {\n            if ($cookie->matchesPath($path)\n                && $cookie->matchesDomain($host)\n                && !$cookie->isExpired()\n                && (!$cookie->getSecure() || $scheme === 'https')\n            ) {\n                $values[] = $cookie->getName().'='\n                    .$cookie->getValue();\n            }\n        }\n\n        return $values\n            ? $request->withHeader('Cookie', \\implode('; ', $values))\n            : $request;\n    }\n\n    /**\n     * If a cookie already exists and the server asks to set it again with a\n     * null value, the cookie must be deleted.\n     */\n    private function removeCookieIfEmpty(SetCookie $cookie): void\n    {\n        $cookieValue = $cookie->getValue();\n        if ($cookieValue === null || $cookieValue === '') {\n            $this->clear(\n                $cookie->getDomain(),\n                $cookie->getPath(),\n                $cookie->getName()\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Cookie;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Stores HTTP cookies.\n *\n * It extracts cookies from HTTP requests, and returns them in HTTP responses.\n * CookieJarInterface instances automatically expire contained cookies when\n * necessary. Subclasses are also responsible for storing and retrieving\n * cookies from a file, database, etc.\n *\n * @see https://docs.python.org/2/library/cookielib.html Inspiration\n *\n * @extends \\IteratorAggregate<SetCookie>\n */\ninterface CookieJarInterface extends \\Countable, \\IteratorAggregate\n{\n    /**\n     * Create a request with added cookie headers.\n     *\n     * If no matching cookies are found in the cookie jar, then no Cookie\n     * header is added to the request and the same request is returned.\n     *\n     * @param RequestInterface $request Request object to modify.\n     *\n     * @return RequestInterface returns the modified request.\n     */\n    public function withCookieHeader(RequestInterface $request): RequestInterface;\n\n    /**\n     * Extract cookies from an HTTP response and store them in the CookieJar.\n     *\n     * @param RequestInterface  $request  Request that was sent\n     * @param ResponseInterface $response Response that was received\n     */\n    public function extractCookies(RequestInterface $request, ResponseInterface $response): void;\n\n    /**\n     * Sets a cookie in the cookie jar.\n     *\n     * @param SetCookie $cookie Cookie to set.\n     *\n     * @return bool Returns true on success or false on failure\n     */\n    public function setCookie(SetCookie $cookie): bool;\n\n    /**\n     * Remove cookies currently held in the cookie jar.\n     *\n     * Invoking this method without arguments will empty the whole cookie jar.\n     * If given a $domain argument only cookies belonging to that domain will\n     * be removed. If given a $domain and $path argument, cookies belonging to\n     * the specified path within that domain are removed. If given all three\n     * arguments, then the cookie with the specified name, path and domain is\n     * removed.\n     *\n     * @param string|null $domain Clears cookies matching a domain\n     * @param string|null $path   Clears cookies matching a domain and path\n     * @param string|null $name   Clears cookies matching a domain, path, and name\n     */\n    public function clear(string $domain = null, string $path = null, string $name = null): void;\n\n    /**\n     * Discard all sessions cookies.\n     *\n     * Removes cookies that don't have an expire field or a have a discard\n     * field set to true. To be called when the user agent shuts down according\n     * to RFC 2965.\n     */\n    public function clearSessionCookies(): void;\n\n    /**\n     * Converts the cookie jar to an array.\n     */\n    public function toArray(): array;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Cookie;\n\nuse GuzzleHttp\\Utils;\n\n/**\n * Persists non-session cookies using a JSON formatted file\n */\nclass FileCookieJar extends CookieJar\n{\n    /**\n     * @var string filename\n     */\n    private $filename;\n\n    /**\n     * @var bool Control whether to persist session cookies or not.\n     */\n    private $storeSessionCookies;\n\n    /**\n     * Create a new FileCookieJar object\n     *\n     * @param string $cookieFile          File to store the cookie data\n     * @param bool   $storeSessionCookies Set to true to store session cookies\n     *                                    in the cookie jar.\n     *\n     * @throws \\RuntimeException if the file cannot be found or created\n     */\n    public function __construct(string $cookieFile, bool $storeSessionCookies = false)\n    {\n        parent::__construct();\n        $this->filename = $cookieFile;\n        $this->storeSessionCookies = $storeSessionCookies;\n\n        if (\\file_exists($cookieFile)) {\n            $this->load($cookieFile);\n        }\n    }\n\n    /**\n     * Saves the file when shutting down\n     */\n    public function __destruct()\n    {\n        $this->save($this->filename);\n    }\n\n    /**\n     * Saves the cookies to a file.\n     *\n     * @param string $filename File to save\n     *\n     * @throws \\RuntimeException if the file cannot be found or created\n     */\n    public function save(string $filename): void\n    {\n        $json = [];\n        /** @var SetCookie $cookie */\n        foreach ($this as $cookie) {\n            if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {\n                $json[] = $cookie->toArray();\n            }\n        }\n\n        $jsonStr = Utils::jsonEncode($json);\n        if (false === \\file_put_contents($filename, $jsonStr, \\LOCK_EX)) {\n            throw new \\RuntimeException(\"Unable to save file {$filename}\");\n        }\n    }\n\n    /**\n     * Load cookies from a JSON formatted file.\n     *\n     * Old cookies are kept unless overwritten by newly loaded ones.\n     *\n     * @param string $filename Cookie file to load.\n     *\n     * @throws \\RuntimeException if the file cannot be loaded.\n     */\n    public function load(string $filename): void\n    {\n        $json = \\file_get_contents($filename);\n        if (false === $json) {\n            throw new \\RuntimeException(\"Unable to load file {$filename}\");\n        }\n        if ($json === '') {\n            return;\n        }\n\n        $data = Utils::jsonDecode($json, true);\n        if (\\is_array($data)) {\n            foreach ($data as $cookie) {\n                $this->setCookie(new SetCookie($cookie));\n            }\n        } elseif (\\is_scalar($data) && !empty($data)) {\n            throw new \\RuntimeException(\"Invalid cookie file: {$filename}\");\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Cookie;\n\n/**\n * Persists cookies in the client session\n */\nclass SessionCookieJar extends CookieJar\n{\n    /**\n     * @var string session key\n     */\n    private $sessionKey;\n\n    /**\n     * @var bool Control whether to persist session cookies or not.\n     */\n    private $storeSessionCookies;\n\n    /**\n     * Create a new SessionCookieJar object\n     *\n     * @param string $sessionKey          Session key name to store the cookie\n     *                                    data in session\n     * @param bool   $storeSessionCookies Set to true to store session cookies\n     *                                    in the cookie jar.\n     */\n    public function __construct(string $sessionKey, bool $storeSessionCookies = false)\n    {\n        parent::__construct();\n        $this->sessionKey = $sessionKey;\n        $this->storeSessionCookies = $storeSessionCookies;\n        $this->load();\n    }\n\n    /**\n     * Saves cookies to session when shutting down\n     */\n    public function __destruct()\n    {\n        $this->save();\n    }\n\n    /**\n     * Save cookies to the client session\n     */\n    public function save(): void\n    {\n        $json = [];\n        /** @var SetCookie $cookie */\n        foreach ($this as $cookie) {\n            if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {\n                $json[] = $cookie->toArray();\n            }\n        }\n\n        $_SESSION[$this->sessionKey] = \\json_encode($json);\n    }\n\n    /**\n     * Load the contents of the client session into the data array\n     */\n    protected function load(): void\n    {\n        if (!isset($_SESSION[$this->sessionKey])) {\n            return;\n        }\n        $data = \\json_decode($_SESSION[$this->sessionKey], true);\n        if (\\is_array($data)) {\n            foreach ($data as $cookie) {\n                $this->setCookie(new SetCookie($cookie));\n            }\n        } elseif (\\strlen($data)) {\n            throw new \\RuntimeException('Invalid cookie data');\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Cookie;\n\n/**\n * Set-Cookie object\n */\nclass SetCookie\n{\n    /**\n     * @var array\n     */\n    private static $defaults = [\n        'Name' => null,\n        'Value' => null,\n        'Domain' => null,\n        'Path' => '/',\n        'Max-Age' => null,\n        'Expires' => null,\n        'Secure' => false,\n        'Discard' => false,\n        'HttpOnly' => false,\n    ];\n\n    /**\n     * @var array Cookie data\n     */\n    private $data;\n\n    /**\n     * Create a new SetCookie object from a string.\n     *\n     * @param string $cookie Set-Cookie header string\n     */\n    public static function fromString(string $cookie): self\n    {\n        // Create the default return array\n        $data = self::$defaults;\n        // Explode the cookie string using a series of semicolons\n        $pieces = \\array_filter(\\array_map('trim', \\explode(';', $cookie)));\n        // The name of the cookie (first kvp) must exist and include an equal sign.\n        if (!isset($pieces[0]) || \\strpos($pieces[0], '=') === false) {\n            return new self($data);\n        }\n\n        // Add the cookie pieces into the parsed data array\n        foreach ($pieces as $part) {\n            $cookieParts = \\explode('=', $part, 2);\n            $key = \\trim($cookieParts[0]);\n            $value = isset($cookieParts[1])\n                ? \\trim($cookieParts[1], \" \\n\\r\\t\\0\\x0B\")\n                : true;\n\n            // Only check for non-cookies when cookies have been found\n            if (!isset($data['Name'])) {\n                $data['Name'] = $key;\n                $data['Value'] = $value;\n            } else {\n                foreach (\\array_keys(self::$defaults) as $search) {\n                    if (!\\strcasecmp($search, $key)) {\n                        if ($search === 'Max-Age') {\n                            if (is_numeric($value)) {\n                                $data[$search] = (int) $value;\n                            }\n                        } else {\n                            $data[$search] = $value;\n                        }\n                        continue 2;\n                    }\n                }\n                $data[$key] = $value;\n            }\n        }\n\n        return new self($data);\n    }\n\n    /**\n     * @param array $data Array of cookie data provided by a Cookie parser\n     */\n    public function __construct(array $data = [])\n    {\n        $this->data = self::$defaults;\n\n        if (isset($data['Name'])) {\n            $this->setName($data['Name']);\n        }\n\n        if (isset($data['Value'])) {\n            $this->setValue($data['Value']);\n        }\n\n        if (isset($data['Domain'])) {\n            $this->setDomain($data['Domain']);\n        }\n\n        if (isset($data['Path'])) {\n            $this->setPath($data['Path']);\n        }\n\n        if (isset($data['Max-Age'])) {\n            $this->setMaxAge($data['Max-Age']);\n        }\n\n        if (isset($data['Expires'])) {\n            $this->setExpires($data['Expires']);\n        }\n\n        if (isset($data['Secure'])) {\n            $this->setSecure($data['Secure']);\n        }\n\n        if (isset($data['Discard'])) {\n            $this->setDiscard($data['Discard']);\n        }\n\n        if (isset($data['HttpOnly'])) {\n            $this->setHttpOnly($data['HttpOnly']);\n        }\n\n        // Set the remaining values that don't have extra validation logic\n        foreach (array_diff(array_keys($data), array_keys(self::$defaults)) as $key) {\n            $this->data[$key] = $data[$key];\n        }\n\n        // Extract the Expires value and turn it into a UNIX timestamp if needed\n        if (!$this->getExpires() && $this->getMaxAge()) {\n            // Calculate the Expires date\n            $this->setExpires(\\time() + $this->getMaxAge());\n        } elseif (null !== ($expires = $this->getExpires()) && !\\is_numeric($expires)) {\n            $this->setExpires($expires);\n        }\n    }\n\n    public function __toString()\n    {\n        $str = $this->data['Name'].'='.($this->data['Value'] ?? '').'; ';\n        foreach ($this->data as $k => $v) {\n            if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) {\n                if ($k === 'Expires') {\n                    $str .= 'Expires='.\\gmdate('D, d M Y H:i:s \\G\\M\\T', $v).'; ';\n                } else {\n                    $str .= ($v === true ? $k : \"{$k}={$v}\").'; ';\n                }\n            }\n        }\n\n        return \\rtrim($str, '; ');\n    }\n\n    public function toArray(): array\n    {\n        return $this->data;\n    }\n\n    /**\n     * Get the cookie name.\n     *\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->data['Name'];\n    }\n\n    /**\n     * Set the cookie name.\n     *\n     * @param string $name Cookie name\n     */\n    public function setName($name): void\n    {\n        if (!is_string($name)) {\n            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);\n        }\n\n        $this->data['Name'] = (string) $name;\n    }\n\n    /**\n     * Get the cookie value.\n     *\n     * @return string|null\n     */\n    public function getValue()\n    {\n        return $this->data['Value'];\n    }\n\n    /**\n     * Set the cookie value.\n     *\n     * @param string $value Cookie value\n     */\n    public function setValue($value): void\n    {\n        if (!is_string($value)) {\n            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);\n        }\n\n        $this->data['Value'] = (string) $value;\n    }\n\n    /**\n     * Get the domain.\n     *\n     * @return string|null\n     */\n    public function getDomain()\n    {\n        return $this->data['Domain'];\n    }\n\n    /**\n     * Set the domain of the cookie.\n     *\n     * @param string|null $domain\n     */\n    public function setDomain($domain): void\n    {\n        if (!is_string($domain) && null !== $domain) {\n            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);\n        }\n\n        $this->data['Domain'] = null === $domain ? null : (string) $domain;\n    }\n\n    /**\n     * Get the path.\n     *\n     * @return string\n     */\n    public function getPath()\n    {\n        return $this->data['Path'];\n    }\n\n    /**\n     * Set the path of the cookie.\n     *\n     * @param string $path Path of the cookie\n     */\n    public function setPath($path): void\n    {\n        if (!is_string($path)) {\n            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);\n        }\n\n        $this->data['Path'] = (string) $path;\n    }\n\n    /**\n     * Maximum lifetime of the cookie in seconds.\n     *\n     * @return int|null\n     */\n    public function getMaxAge()\n    {\n        return null === $this->data['Max-Age'] ? null : (int) $this->data['Max-Age'];\n    }\n\n    /**\n     * Set the max-age of the cookie.\n     *\n     * @param int|null $maxAge Max age of the cookie in seconds\n     */\n    public function setMaxAge($maxAge): void\n    {\n        if (!is_int($maxAge) && null !== $maxAge) {\n            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);\n        }\n\n        $this->data['Max-Age'] = $maxAge === null ? null : (int) $maxAge;\n    }\n\n    /**\n     * The UNIX timestamp when the cookie Expires.\n     *\n     * @return string|int|null\n     */\n    public function getExpires()\n    {\n        return $this->data['Expires'];\n    }\n\n    /**\n     * Set the unix timestamp for which the cookie will expire.\n     *\n     * @param int|string|null $timestamp Unix timestamp or any English textual datetime description.\n     */\n    public function setExpires($timestamp): void\n    {\n        if (!is_int($timestamp) && !is_string($timestamp) && null !== $timestamp) {\n            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int, string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);\n        }\n\n        $this->data['Expires'] = null === $timestamp ? null : (\\is_numeric($timestamp) ? (int) $timestamp : \\strtotime((string) $timestamp));\n    }\n\n    /**\n     * Get whether or not this is a secure cookie.\n     *\n     * @return bool\n     */\n    public function getSecure()\n    {\n        return $this->data['Secure'];\n    }\n\n    /**\n     * Set whether or not the cookie is secure.\n     *\n     * @param bool $secure Set to true or false if secure\n     */\n    public function setSecure($secure): void\n    {\n        if (!is_bool($secure)) {\n            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);\n        }\n\n        $this->data['Secure'] = (bool) $secure;\n    }\n\n    /**\n     * Get whether or not this is a session cookie.\n     *\n     * @return bool|null\n     */\n    public function getDiscard()\n    {\n        return $this->data['Discard'];\n    }\n\n    /**\n     * Set whether or not this is a session cookie.\n     *\n     * @param bool $discard Set to true or false if this is a session cookie\n     */\n    public function setDiscard($discard): void\n    {\n        if (!is_bool($discard)) {\n            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);\n        }\n\n        $this->data['Discard'] = (bool) $discard;\n    }\n\n    /**\n     * Get whether or not this is an HTTP only cookie.\n     *\n     * @return bool\n     */\n    public function getHttpOnly()\n    {\n        return $this->data['HttpOnly'];\n    }\n\n    /**\n     * Set whether or not this is an HTTP only cookie.\n     *\n     * @param bool $httpOnly Set to true or false if this is HTTP only\n     */\n    public function setHttpOnly($httpOnly): void\n    {\n        if (!is_bool($httpOnly)) {\n            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);\n        }\n\n        $this->data['HttpOnly'] = (bool) $httpOnly;\n    }\n\n    /**\n     * Check if the cookie matches a path value.\n     *\n     * A request-path path-matches a given cookie-path if at least one of\n     * the following conditions holds:\n     *\n     * - The cookie-path and the request-path are identical.\n     * - The cookie-path is a prefix of the request-path, and the last\n     *   character of the cookie-path is %x2F (\"/\").\n     * - The cookie-path is a prefix of the request-path, and the first\n     *   character of the request-path that is not included in the cookie-\n     *   path is a %x2F (\"/\") character.\n     *\n     * @param string $requestPath Path to check against\n     */\n    public function matchesPath(string $requestPath): bool\n    {\n        $cookiePath = $this->getPath();\n\n        // Match on exact matches or when path is the default empty \"/\"\n        if ($cookiePath === '/' || $cookiePath == $requestPath) {\n            return true;\n        }\n\n        // Ensure that the cookie-path is a prefix of the request path.\n        if (0 !== \\strpos($requestPath, $cookiePath)) {\n            return false;\n        }\n\n        // Match if the last character of the cookie-path is \"/\"\n        if (\\substr($cookiePath, -1, 1) === '/') {\n            return true;\n        }\n\n        // Match if the first character not included in cookie path is \"/\"\n        return \\substr($requestPath, \\strlen($cookiePath), 1) === '/';\n    }\n\n    /**\n     * Check if the cookie matches a domain value.\n     *\n     * @param string $domain Domain to check against\n     */\n    public function matchesDomain(string $domain): bool\n    {\n        $cookieDomain = $this->getDomain();\n        if (null === $cookieDomain) {\n            return true;\n        }\n\n        // Remove the leading '.' as per spec in RFC 6265.\n        // https://datatracker.ietf.org/doc/html/rfc6265#section-5.2.3\n        $cookieDomain = \\ltrim(\\strtolower($cookieDomain), '.');\n\n        $domain = \\strtolower($domain);\n\n        // Domain not set or exact match.\n        if ('' === $cookieDomain || $domain === $cookieDomain) {\n            return true;\n        }\n\n        // Matching the subdomain according to RFC 6265.\n        // https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.3\n        if (\\filter_var($domain, \\FILTER_VALIDATE_IP)) {\n            return false;\n        }\n\n        return (bool) \\preg_match('/\\.'.\\preg_quote($cookieDomain, '/').'$/', $domain);\n    }\n\n    /**\n     * Check if the cookie is expired.\n     */\n    public function isExpired(): bool\n    {\n        return $this->getExpires() !== null && \\time() > $this->getExpires();\n    }\n\n    /**\n     * Check if the cookie is valid according to RFC 6265.\n     *\n     * @return bool|string Returns true if valid or an error message if invalid\n     */\n    public function validate()\n    {\n        $name = $this->getName();\n        if ($name === '') {\n            return 'The cookie name must not be empty';\n        }\n\n        // Check if any of the invalid characters are present in the cookie name\n        if (\\preg_match(\n            '/[\\x00-\\x20\\x22\\x28-\\x29\\x2c\\x2f\\x3a-\\x40\\x5c\\x7b\\x7d\\x7f]/',\n            $name\n        )) {\n            return 'Cookie name must not contain invalid characters: ASCII '\n                .'Control characters (0-31;127), space, tab and the '\n                .'following characters: ()<>@,;:\\\"/?={}';\n        }\n\n        // Value must not be null. 0 and empty string are valid. Empty strings\n        // are technically against RFC 6265, but known to happen in the wild.\n        $value = $this->getValue();\n        if ($value === null) {\n            return 'The cookie value must not be empty';\n        }\n\n        // Domains must not be empty, but can be 0. \"0\" is not a valid internet\n        // domain, but may be used as server name in a private network.\n        $domain = $this->getDomain();\n        if ($domain === null || $domain === '') {\n            return 'The cookie domain must not be empty';\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Exception when an HTTP error occurs (4xx or 5xx error)\n */\nclass BadResponseException extends RequestException\n{\n    public function __construct(\n        string $message,\n        RequestInterface $request,\n        ResponseInterface $response,\n        \\Throwable $previous = null,\n        array $handlerContext = []\n    ) {\n        parent::__construct($message, $request, $response, $previous, $handlerContext);\n    }\n\n    /**\n     * Current exception and the ones that extend it will always have a response.\n     */\n    public function hasResponse(): bool\n    {\n        return true;\n    }\n\n    /**\n     * This function narrows the return type from the parent class and does not allow it to be nullable.\n     */\n    public function getResponse(): ResponseInterface\n    {\n        /** @var ResponseInterface */\n        return parent::getResponse();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\n/**\n * Exception when a client error is encountered (4xx codes)\n */\nclass ClientException extends BadResponseException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Client\\NetworkExceptionInterface;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Exception thrown when a connection cannot be established.\n *\n * Note that no response is present for a ConnectException\n */\nclass ConnectException extends TransferException implements NetworkExceptionInterface\n{\n    /**\n     * @var RequestInterface\n     */\n    private $request;\n\n    /**\n     * @var array\n     */\n    private $handlerContext;\n\n    public function __construct(\n        string $message,\n        RequestInterface $request,\n        \\Throwable $previous = null,\n        array $handlerContext = []\n    ) {\n        parent::__construct($message, 0, $previous);\n        $this->request = $request;\n        $this->handlerContext = $handlerContext;\n    }\n\n    /**\n     * Get the request that caused the exception\n     */\n    public function getRequest(): RequestInterface\n    {\n        return $this->request;\n    }\n\n    /**\n     * Get contextual information about the error from the underlying handler.\n     *\n     * The contents of this array will vary depending on which handler you are\n     * using. It may also be just an empty array. Relying on this data will\n     * couple you to a specific handler, but can give more debug information\n     * when needed.\n     */\n    public function getHandlerContext(): array\n    {\n        return $this->handlerContext;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Client\\ClientExceptionInterface;\n\ninterface GuzzleException extends ClientExceptionInterface\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nfinal class InvalidArgumentException extends \\InvalidArgumentException implements GuzzleException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nuse GuzzleHttp\\BodySummarizer;\nuse GuzzleHttp\\BodySummarizerInterface;\nuse Psr\\Http\\Client\\RequestExceptionInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * HTTP Request exception\n */\nclass RequestException extends TransferException implements RequestExceptionInterface\n{\n    /**\n     * @var RequestInterface\n     */\n    private $request;\n\n    /**\n     * @var ResponseInterface|null\n     */\n    private $response;\n\n    /**\n     * @var array\n     */\n    private $handlerContext;\n\n    public function __construct(\n        string $message,\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        \\Throwable $previous = null,\n        array $handlerContext = []\n    ) {\n        // Set the code of the exception if the response is set and not future.\n        $code = $response ? $response->getStatusCode() : 0;\n        parent::__construct($message, $code, $previous);\n        $this->request = $request;\n        $this->response = $response;\n        $this->handlerContext = $handlerContext;\n    }\n\n    /**\n     * Wrap non-RequestExceptions with a RequestException\n     */\n    public static function wrapException(RequestInterface $request, \\Throwable $e): RequestException\n    {\n        return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e);\n    }\n\n    /**\n     * Factory method to create a new exception with a normalized error message\n     *\n     * @param RequestInterface             $request        Request sent\n     * @param ResponseInterface            $response       Response received\n     * @param \\Throwable|null              $previous       Previous exception\n     * @param array                        $handlerContext Optional handler context\n     * @param BodySummarizerInterface|null $bodySummarizer Optional body summarizer\n     */\n    public static function create(\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        \\Throwable $previous = null,\n        array $handlerContext = [],\n        BodySummarizerInterface $bodySummarizer = null\n    ): self {\n        if (!$response) {\n            return new self(\n                'Error completing request',\n                $request,\n                null,\n                $previous,\n                $handlerContext\n            );\n        }\n\n        $level = (int) \\floor($response->getStatusCode() / 100);\n        if ($level === 4) {\n            $label = 'Client error';\n            $className = ClientException::class;\n        } elseif ($level === 5) {\n            $label = 'Server error';\n            $className = ServerException::class;\n        } else {\n            $label = 'Unsuccessful request';\n            $className = __CLASS__;\n        }\n\n        $uri = $request->getUri();\n        $uri = static::obfuscateUri($uri);\n\n        // Client Error: `GET /` resulted in a `404 Not Found` response:\n        // <html> ... (truncated)\n        $message = \\sprintf(\n            '%s: `%s %s` resulted in a `%s %s` response',\n            $label,\n            $request->getMethod(),\n            $uri->__toString(),\n            $response->getStatusCode(),\n            $response->getReasonPhrase()\n        );\n\n        $summary = ($bodySummarizer ?? new BodySummarizer())->summarize($response);\n\n        if ($summary !== null) {\n            $message .= \":\\n{$summary}\\n\";\n        }\n\n        return new $className($message, $request, $response, $previous, $handlerContext);\n    }\n\n    /**\n     * Obfuscates URI if there is a username and a password present\n     */\n    private static function obfuscateUri(UriInterface $uri): UriInterface\n    {\n        $userInfo = $uri->getUserInfo();\n\n        if (false !== ($pos = \\strpos($userInfo, ':'))) {\n            return $uri->withUserInfo(\\substr($userInfo, 0, $pos), '***');\n        }\n\n        return $uri;\n    }\n\n    /**\n     * Get the request that caused the exception\n     */\n    public function getRequest(): RequestInterface\n    {\n        return $this->request;\n    }\n\n    /**\n     * Get the associated response\n     */\n    public function getResponse(): ?ResponseInterface\n    {\n        return $this->response;\n    }\n\n    /**\n     * Check if a response was received\n     */\n    public function hasResponse(): bool\n    {\n        return $this->response !== null;\n    }\n\n    /**\n     * Get contextual information about the error from the underlying handler.\n     *\n     * The contents of this array will vary depending on which handler you are\n     * using. It may also be just an empty array. Relying on this data will\n     * couple you to a specific handler, but can give more debug information\n     * when needed.\n     */\n    public function getHandlerContext(): array\n    {\n        return $this->handlerContext;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\n/**\n * Exception when a server error is encountered (5xx codes)\n */\nclass ServerException extends BadResponseException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nclass TooManyRedirectsException extends RequestException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nclass TransferException extends \\RuntimeException implements GuzzleException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\ConnectException;\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\FulfilledPromise;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Psr7\\LazyOpenStream;\nuse GuzzleHttp\\TransferStats;\nuse GuzzleHttp\\Utils;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Creates curl resources from a request\n *\n * @final\n */\nclass CurlFactory implements CurlFactoryInterface\n{\n    public const CURL_VERSION_STR = 'curl_version';\n\n    /**\n     * @deprecated\n     */\n    public const LOW_CURL_VERSION_NUMBER = '7.21.2';\n\n    /**\n     * @var resource[]|\\CurlHandle[]\n     */\n    private $handles = [];\n\n    /**\n     * @var int Total number of idle handles to keep in cache\n     */\n    private $maxHandles;\n\n    /**\n     * @param int $maxHandles Maximum number of idle handles.\n     */\n    public function __construct(int $maxHandles)\n    {\n        $this->maxHandles = $maxHandles;\n    }\n\n    public function create(RequestInterface $request, array $options): EasyHandle\n    {\n        if (isset($options['curl']['body_as_string'])) {\n            $options['_body_as_string'] = $options['curl']['body_as_string'];\n            unset($options['curl']['body_as_string']);\n        }\n\n        $easy = new EasyHandle();\n        $easy->request = $request;\n        $easy->options = $options;\n        $conf = $this->getDefaultConf($easy);\n        $this->applyMethod($easy, $conf);\n        $this->applyHandlerOptions($easy, $conf);\n        $this->applyHeaders($easy, $conf);\n        unset($conf['_headers']);\n\n        // Add handler options from the request configuration options\n        if (isset($options['curl'])) {\n            $conf = \\array_replace($conf, $options['curl']);\n        }\n\n        $conf[\\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy);\n        $easy->handle = $this->handles ? \\array_pop($this->handles) : \\curl_init();\n        curl_setopt_array($easy->handle, $conf);\n\n        return $easy;\n    }\n\n    public function release(EasyHandle $easy): void\n    {\n        $resource = $easy->handle;\n        unset($easy->handle);\n\n        if (\\count($this->handles) >= $this->maxHandles) {\n            \\curl_close($resource);\n        } else {\n            // Remove all callback functions as they can hold onto references\n            // and are not cleaned up by curl_reset. Using curl_setopt_array\n            // does not work for some reason, so removing each one\n            // individually.\n            \\curl_setopt($resource, \\CURLOPT_HEADERFUNCTION, null);\n            \\curl_setopt($resource, \\CURLOPT_READFUNCTION, null);\n            \\curl_setopt($resource, \\CURLOPT_WRITEFUNCTION, null);\n            \\curl_setopt($resource, \\CURLOPT_PROGRESSFUNCTION, null);\n            \\curl_reset($resource);\n            $this->handles[] = $resource;\n        }\n    }\n\n    /**\n     * Completes a cURL transaction, either returning a response promise or a\n     * rejected promise.\n     *\n     * @param callable(RequestInterface, array): PromiseInterface $handler\n     * @param CurlFactoryInterface                                $factory Dictates how the handle is released\n     */\n    public static function finish(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory): PromiseInterface\n    {\n        if (isset($easy->options['on_stats'])) {\n            self::invokeStats($easy);\n        }\n\n        if (!$easy->response || $easy->errno) {\n            return self::finishError($handler, $easy, $factory);\n        }\n\n        // Return the response if it is present and there is no error.\n        $factory->release($easy);\n\n        // Rewind the body of the response if possible.\n        $body = $easy->response->getBody();\n        if ($body->isSeekable()) {\n            $body->rewind();\n        }\n\n        return new FulfilledPromise($easy->response);\n    }\n\n    private static function invokeStats(EasyHandle $easy): void\n    {\n        $curlStats = \\curl_getinfo($easy->handle);\n        $curlStats['appconnect_time'] = \\curl_getinfo($easy->handle, \\CURLINFO_APPCONNECT_TIME);\n        $stats = new TransferStats(\n            $easy->request,\n            $easy->response,\n            $curlStats['total_time'],\n            $easy->errno,\n            $curlStats\n        );\n        ($easy->options['on_stats'])($stats);\n    }\n\n    /**\n     * @param callable(RequestInterface, array): PromiseInterface $handler\n     */\n    private static function finishError(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory): PromiseInterface\n    {\n        // Get error information and release the handle to the factory.\n        $ctx = [\n            'errno' => $easy->errno,\n            'error' => \\curl_error($easy->handle),\n            'appconnect_time' => \\curl_getinfo($easy->handle, \\CURLINFO_APPCONNECT_TIME),\n        ] + \\curl_getinfo($easy->handle);\n        $ctx[self::CURL_VERSION_STR] = \\curl_version()['version'];\n        $factory->release($easy);\n\n        // Retry when nothing is present or when curl failed to rewind.\n        if (empty($easy->options['_err_message']) && (!$easy->errno || $easy->errno == 65)) {\n            return self::retryFailedRewind($handler, $easy, $ctx);\n        }\n\n        return self::createRejection($easy, $ctx);\n    }\n\n    private static function createRejection(EasyHandle $easy, array $ctx): PromiseInterface\n    {\n        static $connectionErrors = [\n            \\CURLE_OPERATION_TIMEOUTED => true,\n            \\CURLE_COULDNT_RESOLVE_HOST => true,\n            \\CURLE_COULDNT_CONNECT => true,\n            \\CURLE_SSL_CONNECT_ERROR => true,\n            \\CURLE_GOT_NOTHING => true,\n        ];\n\n        if ($easy->createResponseException) {\n            return P\\Create::rejectionFor(\n                new RequestException(\n                    'An error was encountered while creating the response',\n                    $easy->request,\n                    $easy->response,\n                    $easy->createResponseException,\n                    $ctx\n                )\n            );\n        }\n\n        // If an exception was encountered during the onHeaders event, then\n        // return a rejected promise that wraps that exception.\n        if ($easy->onHeadersException) {\n            return P\\Create::rejectionFor(\n                new RequestException(\n                    'An error was encountered during the on_headers event',\n                    $easy->request,\n                    $easy->response,\n                    $easy->onHeadersException,\n                    $ctx\n                )\n            );\n        }\n\n        $message = \\sprintf(\n            'cURL error %s: %s (%s)',\n            $ctx['errno'],\n            $ctx['error'],\n            'see https://curl.haxx.se/libcurl/c/libcurl-errors.html'\n        );\n        $uriString = (string) $easy->request->getUri();\n        if ($uriString !== '' && false === \\strpos($ctx['error'], $uriString)) {\n            $message .= \\sprintf(' for %s', $uriString);\n        }\n\n        // Create a connection exception if it was a specific error code.\n        $error = isset($connectionErrors[$easy->errno])\n            ? new ConnectException($message, $easy->request, null, $ctx)\n            : new RequestException($message, $easy->request, $easy->response, null, $ctx);\n\n        return P\\Create::rejectionFor($error);\n    }\n\n    /**\n     * @return array<int|string, mixed>\n     */\n    private function getDefaultConf(EasyHandle $easy): array\n    {\n        $conf = [\n            '_headers' => $easy->request->getHeaders(),\n            \\CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(),\n            \\CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''),\n            \\CURLOPT_RETURNTRANSFER => false,\n            \\CURLOPT_HEADER => false,\n            \\CURLOPT_CONNECTTIMEOUT => 300,\n        ];\n\n        if (\\defined('CURLOPT_PROTOCOLS')) {\n            $conf[\\CURLOPT_PROTOCOLS] = \\CURLPROTO_HTTP | \\CURLPROTO_HTTPS;\n        }\n\n        $version = $easy->request->getProtocolVersion();\n        if ($version == 1.1) {\n            $conf[\\CURLOPT_HTTP_VERSION] = \\CURL_HTTP_VERSION_1_1;\n        } elseif ($version == 2.0) {\n            $conf[\\CURLOPT_HTTP_VERSION] = \\CURL_HTTP_VERSION_2_0;\n        } else {\n            $conf[\\CURLOPT_HTTP_VERSION] = \\CURL_HTTP_VERSION_1_0;\n        }\n\n        return $conf;\n    }\n\n    private function applyMethod(EasyHandle $easy, array &$conf): void\n    {\n        $body = $easy->request->getBody();\n        $size = $body->getSize();\n\n        if ($size === null || $size > 0) {\n            $this->applyBody($easy->request, $easy->options, $conf);\n\n            return;\n        }\n\n        $method = $easy->request->getMethod();\n        if ($method === 'PUT' || $method === 'POST') {\n            // See https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.2\n            if (!$easy->request->hasHeader('Content-Length')) {\n                $conf[\\CURLOPT_HTTPHEADER][] = 'Content-Length: 0';\n            }\n        } elseif ($method === 'HEAD') {\n            $conf[\\CURLOPT_NOBODY] = true;\n            unset(\n                $conf[\\CURLOPT_WRITEFUNCTION],\n                $conf[\\CURLOPT_READFUNCTION],\n                $conf[\\CURLOPT_FILE],\n                $conf[\\CURLOPT_INFILE]\n            );\n        }\n    }\n\n    private function applyBody(RequestInterface $request, array $options, array &$conf): void\n    {\n        $size = $request->hasHeader('Content-Length')\n            ? (int) $request->getHeaderLine('Content-Length')\n            : null;\n\n        // Send the body as a string if the size is less than 1MB OR if the\n        // [curl][body_as_string] request value is set.\n        if (($size !== null && $size < 1000000) || !empty($options['_body_as_string'])) {\n            $conf[\\CURLOPT_POSTFIELDS] = (string) $request->getBody();\n            // Don't duplicate the Content-Length header\n            $this->removeHeader('Content-Length', $conf);\n            $this->removeHeader('Transfer-Encoding', $conf);\n        } else {\n            $conf[\\CURLOPT_UPLOAD] = true;\n            if ($size !== null) {\n                $conf[\\CURLOPT_INFILESIZE] = $size;\n                $this->removeHeader('Content-Length', $conf);\n            }\n            $body = $request->getBody();\n            if ($body->isSeekable()) {\n                $body->rewind();\n            }\n            $conf[\\CURLOPT_READFUNCTION] = static function ($ch, $fd, $length) use ($body) {\n                return $body->read($length);\n            };\n        }\n\n        // If the Expect header is not present, prevent curl from adding it\n        if (!$request->hasHeader('Expect')) {\n            $conf[\\CURLOPT_HTTPHEADER][] = 'Expect:';\n        }\n\n        // cURL sometimes adds a content-type by default. Prevent this.\n        if (!$request->hasHeader('Content-Type')) {\n            $conf[\\CURLOPT_HTTPHEADER][] = 'Content-Type:';\n        }\n    }\n\n    private function applyHeaders(EasyHandle $easy, array &$conf): void\n    {\n        foreach ($conf['_headers'] as $name => $values) {\n            foreach ($values as $value) {\n                $value = (string) $value;\n                if ($value === '') {\n                    // cURL requires a special format for empty headers.\n                    // See https://github.com/guzzle/guzzle/issues/1882 for more details.\n                    $conf[\\CURLOPT_HTTPHEADER][] = \"$name;\";\n                } else {\n                    $conf[\\CURLOPT_HTTPHEADER][] = \"$name: $value\";\n                }\n            }\n        }\n\n        // Remove the Accept header if one was not set\n        if (!$easy->request->hasHeader('Accept')) {\n            $conf[\\CURLOPT_HTTPHEADER][] = 'Accept:';\n        }\n    }\n\n    /**\n     * Remove a header from the options array.\n     *\n     * @param string $name    Case-insensitive header to remove\n     * @param array  $options Array of options to modify\n     */\n    private function removeHeader(string $name, array &$options): void\n    {\n        foreach (\\array_keys($options['_headers']) as $key) {\n            if (!\\strcasecmp($key, $name)) {\n                unset($options['_headers'][$key]);\n\n                return;\n            }\n        }\n    }\n\n    private function applyHandlerOptions(EasyHandle $easy, array &$conf): void\n    {\n        $options = $easy->options;\n        if (isset($options['verify'])) {\n            if ($options['verify'] === false) {\n                unset($conf[\\CURLOPT_CAINFO]);\n                $conf[\\CURLOPT_SSL_VERIFYHOST] = 0;\n                $conf[\\CURLOPT_SSL_VERIFYPEER] = false;\n            } else {\n                $conf[\\CURLOPT_SSL_VERIFYHOST] = 2;\n                $conf[\\CURLOPT_SSL_VERIFYPEER] = true;\n                if (\\is_string($options['verify'])) {\n                    // Throw an error if the file/folder/link path is not valid or doesn't exist.\n                    if (!\\file_exists($options['verify'])) {\n                        throw new \\InvalidArgumentException(\"SSL CA bundle not found: {$options['verify']}\");\n                    }\n                    // If it's a directory or a link to a directory use CURLOPT_CAPATH.\n                    // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.\n                    if (\n                        \\is_dir($options['verify'])\n                        || (\n                            \\is_link($options['verify']) === true\n                            && ($verifyLink = \\readlink($options['verify'])) !== false\n                            && \\is_dir($verifyLink)\n                        )\n                    ) {\n                        $conf[\\CURLOPT_CAPATH] = $options['verify'];\n                    } else {\n                        $conf[\\CURLOPT_CAINFO] = $options['verify'];\n                    }\n                }\n            }\n        }\n\n        if (!isset($options['curl'][\\CURLOPT_ENCODING]) && !empty($options['decode_content'])) {\n            $accept = $easy->request->getHeaderLine('Accept-Encoding');\n            if ($accept) {\n                $conf[\\CURLOPT_ENCODING] = $accept;\n            } else {\n                // The empty string enables all available decoders and implicitly\n                // sets a matching 'Accept-Encoding' header.\n                $conf[\\CURLOPT_ENCODING] = '';\n                // But as the user did not specify any acceptable encodings we need\n                // to overwrite this implicit header with an empty one.\n                $conf[\\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';\n            }\n        }\n\n        if (!isset($options['sink'])) {\n            // Use a default temp stream if no sink was set.\n            $options['sink'] = \\GuzzleHttp\\Psr7\\Utils::tryFopen('php://temp', 'w+');\n        }\n        $sink = $options['sink'];\n        if (!\\is_string($sink)) {\n            $sink = \\GuzzleHttp\\Psr7\\Utils::streamFor($sink);\n        } elseif (!\\is_dir(\\dirname($sink))) {\n            // Ensure that the directory exists before failing in curl.\n            throw new \\RuntimeException(\\sprintf('Directory %s does not exist for sink value of %s', \\dirname($sink), $sink));\n        } else {\n            $sink = new LazyOpenStream($sink, 'w+');\n        }\n        $easy->sink = $sink;\n        $conf[\\CURLOPT_WRITEFUNCTION] = static function ($ch, $write) use ($sink): int {\n            return $sink->write($write);\n        };\n\n        $timeoutRequiresNoSignal = false;\n        if (isset($options['timeout'])) {\n            $timeoutRequiresNoSignal |= $options['timeout'] < 1;\n            $conf[\\CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;\n        }\n\n        // CURL default value is CURL_IPRESOLVE_WHATEVER\n        if (isset($options['force_ip_resolve'])) {\n            if ('v4' === $options['force_ip_resolve']) {\n                $conf[\\CURLOPT_IPRESOLVE] = \\CURL_IPRESOLVE_V4;\n            } elseif ('v6' === $options['force_ip_resolve']) {\n                $conf[\\CURLOPT_IPRESOLVE] = \\CURL_IPRESOLVE_V6;\n            }\n        }\n\n        if (isset($options['connect_timeout'])) {\n            $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1;\n            $conf[\\CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;\n        }\n\n        if ($timeoutRequiresNoSignal && \\strtoupper(\\substr(\\PHP_OS, 0, 3)) !== 'WIN') {\n            $conf[\\CURLOPT_NOSIGNAL] = true;\n        }\n\n        if (isset($options['proxy'])) {\n            if (!\\is_array($options['proxy'])) {\n                $conf[\\CURLOPT_PROXY] = $options['proxy'];\n            } else {\n                $scheme = $easy->request->getUri()->getScheme();\n                if (isset($options['proxy'][$scheme])) {\n                    $host = $easy->request->getUri()->getHost();\n                    if (isset($options['proxy']['no']) && Utils::isHostInNoProxy($host, $options['proxy']['no'])) {\n                        unset($conf[\\CURLOPT_PROXY]);\n                    } else {\n                        $conf[\\CURLOPT_PROXY] = $options['proxy'][$scheme];\n                    }\n                }\n            }\n        }\n\n        if (isset($options['crypto_method'])) {\n            if (\\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']) {\n                if (!defined('CURL_SSLVERSION_TLSv1_0')) {\n                    throw new \\InvalidArgumentException('Invalid crypto_method request option: TLS 1.0 not supported by your version of cURL');\n                }\n                $conf[\\CURLOPT_SSLVERSION] = \\CURL_SSLVERSION_TLSv1_0;\n            } elseif (\\STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method']) {\n                if (!defined('CURL_SSLVERSION_TLSv1_1')) {\n                    throw new \\InvalidArgumentException('Invalid crypto_method request option: TLS 1.1 not supported by your version of cURL');\n                }\n                $conf[\\CURLOPT_SSLVERSION] = \\CURL_SSLVERSION_TLSv1_1;\n            } elseif (\\STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']) {\n                if (!defined('CURL_SSLVERSION_TLSv1_2')) {\n                    throw new \\InvalidArgumentException('Invalid crypto_method request option: TLS 1.2 not supported by your version of cURL');\n                }\n                $conf[\\CURLOPT_SSLVERSION] = \\CURL_SSLVERSION_TLSv1_2;\n            } elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \\STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) {\n                if (!defined('CURL_SSLVERSION_TLSv1_3')) {\n                    throw new \\InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL');\n                }\n                $conf[\\CURLOPT_SSLVERSION] = \\CURL_SSLVERSION_TLSv1_3;\n            } else {\n                throw new \\InvalidArgumentException('Invalid crypto_method request option: unknown version provided');\n            }\n        }\n\n        if (isset($options['cert'])) {\n            $cert = $options['cert'];\n            if (\\is_array($cert)) {\n                $conf[\\CURLOPT_SSLCERTPASSWD] = $cert[1];\n                $cert = $cert[0];\n            }\n            if (!\\file_exists($cert)) {\n                throw new \\InvalidArgumentException(\"SSL certificate not found: {$cert}\");\n            }\n            // OpenSSL (versions 0.9.3 and later) also support \"P12\" for PKCS#12-encoded files.\n            // see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html\n            $ext = pathinfo($cert, \\PATHINFO_EXTENSION);\n            if (preg_match('#^(der|p12)$#i', $ext)) {\n                $conf[\\CURLOPT_SSLCERTTYPE] = strtoupper($ext);\n            }\n            $conf[\\CURLOPT_SSLCERT] = $cert;\n        }\n\n        if (isset($options['ssl_key'])) {\n            if (\\is_array($options['ssl_key'])) {\n                if (\\count($options['ssl_key']) === 2) {\n                    [$sslKey, $conf[\\CURLOPT_SSLKEYPASSWD]] = $options['ssl_key'];\n                } else {\n                    [$sslKey] = $options['ssl_key'];\n                }\n            }\n\n            $sslKey = $sslKey ?? $options['ssl_key'];\n\n            if (!\\file_exists($sslKey)) {\n                throw new \\InvalidArgumentException(\"SSL private key not found: {$sslKey}\");\n            }\n            $conf[\\CURLOPT_SSLKEY] = $sslKey;\n        }\n\n        if (isset($options['progress'])) {\n            $progress = $options['progress'];\n            if (!\\is_callable($progress)) {\n                throw new \\InvalidArgumentException('progress client option must be callable');\n            }\n            $conf[\\CURLOPT_NOPROGRESS] = false;\n            $conf[\\CURLOPT_PROGRESSFUNCTION] = static function ($resource, int $downloadSize, int $downloaded, int $uploadSize, int $uploaded) use ($progress) {\n                $progress($downloadSize, $downloaded, $uploadSize, $uploaded);\n            };\n        }\n\n        if (!empty($options['debug'])) {\n            $conf[\\CURLOPT_STDERR] = Utils::debugResource($options['debug']);\n            $conf[\\CURLOPT_VERBOSE] = true;\n        }\n    }\n\n    /**\n     * This function ensures that a response was set on a transaction. If one\n     * was not set, then the request is retried if possible. This error\n     * typically means you are sending a payload, curl encountered a\n     * \"Connection died, retrying a fresh connect\" error, tried to rewind the\n     * stream, and then encountered a \"necessary data rewind wasn't possible\"\n     * error, causing the request to be sent through curl_multi_info_read()\n     * without an error status.\n     *\n     * @param callable(RequestInterface, array): PromiseInterface $handler\n     */\n    private static function retryFailedRewind(callable $handler, EasyHandle $easy, array $ctx): PromiseInterface\n    {\n        try {\n            // Only rewind if the body has been read from.\n            $body = $easy->request->getBody();\n            if ($body->tell() > 0) {\n                $body->rewind();\n            }\n        } catch (\\RuntimeException $e) {\n            $ctx['error'] = 'The connection unexpectedly failed without '\n                .'providing an error. The request would have been retried, '\n                .'but attempting to rewind the request body failed. '\n                .'Exception: '.$e;\n\n            return self::createRejection($easy, $ctx);\n        }\n\n        // Retry no more than 3 times before giving up.\n        if (!isset($easy->options['_curl_retries'])) {\n            $easy->options['_curl_retries'] = 1;\n        } elseif ($easy->options['_curl_retries'] == 2) {\n            $ctx['error'] = 'The cURL request was retried 3 times '\n                .'and did not succeed. The most likely reason for the failure '\n                .'is that cURL was unable to rewind the body of the request '\n                .'and subsequent retries resulted in the same error. Turn on '\n                .'the debug option to see what went wrong. See '\n                .'https://bugs.php.net/bug.php?id=47204 for more information.';\n\n            return self::createRejection($easy, $ctx);\n        } else {\n            ++$easy->options['_curl_retries'];\n        }\n\n        return $handler($easy->request, $easy->options);\n    }\n\n    private function createHeaderFn(EasyHandle $easy): callable\n    {\n        if (isset($easy->options['on_headers'])) {\n            $onHeaders = $easy->options['on_headers'];\n\n            if (!\\is_callable($onHeaders)) {\n                throw new \\InvalidArgumentException('on_headers must be callable');\n            }\n        } else {\n            $onHeaders = null;\n        }\n\n        return static function ($ch, $h) use (\n            $onHeaders,\n            $easy,\n            &$startingResponse\n        ) {\n            $value = \\trim($h);\n            if ($value === '') {\n                $startingResponse = true;\n                try {\n                    $easy->createResponse();\n                } catch (\\Exception $e) {\n                    $easy->createResponseException = $e;\n\n                    return -1;\n                }\n                if ($onHeaders !== null) {\n                    try {\n                        $onHeaders($easy->response);\n                    } catch (\\Exception $e) {\n                        // Associate the exception with the handle and trigger\n                        // a curl header write error by returning 0.\n                        $easy->onHeadersException = $e;\n\n                        return -1;\n                    }\n                }\n            } elseif ($startingResponse) {\n                $startingResponse = false;\n                $easy->headers = [$value];\n            } else {\n                $easy->headers[] = $value;\n            }\n\n            return \\strlen($h);\n        };\n    }\n\n    public function __destruct()\n    {\n        foreach ($this->handles as $id => $handle) {\n            \\curl_close($handle);\n            unset($this->handles[$id]);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse Psr\\Http\\Message\\RequestInterface;\n\ninterface CurlFactoryInterface\n{\n    /**\n     * Creates a cURL handle resource.\n     *\n     * @param RequestInterface $request Request\n     * @param array            $options Transfer options\n     *\n     * @throws \\RuntimeException when an option cannot be applied\n     */\n    public function create(RequestInterface $request, array $options): EasyHandle;\n\n    /**\n     * Release an easy handle, allowing it to be reused or closed.\n     *\n     * This function must call unset on the easy handle's \"handle\" property.\n     */\n    public function release(EasyHandle $easy): void;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * HTTP handler that uses cURL easy handles as a transport layer.\n *\n * When using the CurlHandler, custom curl options can be specified as an\n * associative array of curl option constants mapping to values in the\n * **curl** key of the \"client\" key of the request.\n *\n * @final\n */\nclass CurlHandler\n{\n    /**\n     * @var CurlFactoryInterface\n     */\n    private $factory;\n\n    /**\n     * Accepts an associative array of options:\n     *\n     * - handle_factory: Optional curl factory used to create cURL handles.\n     *\n     * @param array{handle_factory?: ?CurlFactoryInterface} $options Array of options to use with the handler\n     */\n    public function __construct(array $options = [])\n    {\n        $this->factory = $options['handle_factory']\n            ?? new CurlFactory(3);\n    }\n\n    public function __invoke(RequestInterface $request, array $options): PromiseInterface\n    {\n        if (isset($options['delay'])) {\n            \\usleep($options['delay'] * 1000);\n        }\n\n        $easy = $this->factory->create($request, $options);\n        \\curl_exec($easy->handle);\n        $easy->errno = \\curl_errno($easy->handle);\n\n        return CurlFactory::finish($this, $easy, $this->factory);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\Promise;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Utils;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Returns an asynchronous response using curl_multi_* functions.\n *\n * When using the CurlMultiHandler, custom curl options can be specified as an\n * associative array of curl option constants mapping to values in the\n * **curl** key of the provided request options.\n *\n * @final\n */\nclass CurlMultiHandler\n{\n    /**\n     * @var CurlFactoryInterface\n     */\n    private $factory;\n\n    /**\n     * @var int\n     */\n    private $selectTimeout;\n\n    /**\n     * @var int Will be higher than 0 when `curl_multi_exec` is still running.\n     */\n    private $active = 0;\n\n    /**\n     * @var array Request entry handles, indexed by handle id in `addRequest`.\n     *\n     * @see CurlMultiHandler::addRequest\n     */\n    private $handles = [];\n\n    /**\n     * @var array<int, float> An array of delay times, indexed by handle id in `addRequest`.\n     *\n     * @see CurlMultiHandler::addRequest\n     */\n    private $delays = [];\n\n    /**\n     * @var array<mixed> An associative array of CURLMOPT_* options and corresponding values for curl_multi_setopt()\n     */\n    private $options = [];\n\n    /** @var resource|\\CurlMultiHandle */\n    private $_mh;\n\n    /**\n     * This handler accepts the following options:\n     *\n     * - handle_factory: An optional factory  used to create curl handles\n     * - select_timeout: Optional timeout (in seconds) to block before timing\n     *   out while selecting curl handles. Defaults to 1 second.\n     * - options: An associative array of CURLMOPT_* options and\n     *   corresponding values for curl_multi_setopt()\n     */\n    public function __construct(array $options = [])\n    {\n        $this->factory = $options['handle_factory'] ?? new CurlFactory(50);\n\n        if (isset($options['select_timeout'])) {\n            $this->selectTimeout = $options['select_timeout'];\n        } elseif ($selectTimeout = Utils::getenv('GUZZLE_CURL_SELECT_TIMEOUT')) {\n            @trigger_error('Since guzzlehttp/guzzle 7.2.0: Using environment variable GUZZLE_CURL_SELECT_TIMEOUT is deprecated. Use option \"select_timeout\" instead.', \\E_USER_DEPRECATED);\n            $this->selectTimeout = (int) $selectTimeout;\n        } else {\n            $this->selectTimeout = 1;\n        }\n\n        $this->options = $options['options'] ?? [];\n\n        // unsetting the property forces the first access to go through\n        // __get().\n        unset($this->_mh);\n    }\n\n    /**\n     * @param string $name\n     *\n     * @return resource|\\CurlMultiHandle\n     *\n     * @throws \\BadMethodCallException when another field as `_mh` will be gotten\n     * @throws \\RuntimeException       when curl can not initialize a multi handle\n     */\n    public function __get($name)\n    {\n        if ($name !== '_mh') {\n            throw new \\BadMethodCallException(\"Can not get other property as '_mh'.\");\n        }\n\n        $multiHandle = \\curl_multi_init();\n\n        if (false === $multiHandle) {\n            throw new \\RuntimeException('Can not initialize curl multi handle.');\n        }\n\n        $this->_mh = $multiHandle;\n\n        foreach ($this->options as $option => $value) {\n            // A warning is raised in case of a wrong option.\n            curl_multi_setopt($this->_mh, $option, $value);\n        }\n\n        return $this->_mh;\n    }\n\n    public function __destruct()\n    {\n        if (isset($this->_mh)) {\n            \\curl_multi_close($this->_mh);\n            unset($this->_mh);\n        }\n    }\n\n    public function __invoke(RequestInterface $request, array $options): PromiseInterface\n    {\n        $easy = $this->factory->create($request, $options);\n        $id = (int) $easy->handle;\n\n        $promise = new Promise(\n            [$this, 'execute'],\n            function () use ($id) {\n                return $this->cancel($id);\n            }\n        );\n\n        $this->addRequest(['easy' => $easy, 'deferred' => $promise]);\n\n        return $promise;\n    }\n\n    /**\n     * Ticks the curl event loop.\n     */\n    public function tick(): void\n    {\n        // Add any delayed handles if needed.\n        if ($this->delays) {\n            $currentTime = Utils::currentTime();\n            foreach ($this->delays as $id => $delay) {\n                if ($currentTime >= $delay) {\n                    unset($this->delays[$id]);\n                    \\curl_multi_add_handle(\n                        $this->_mh,\n                        $this->handles[$id]['easy']->handle\n                    );\n                }\n            }\n        }\n\n        // Step through the task queue which may add additional requests.\n        P\\Utils::queue()->run();\n\n        if ($this->active && \\curl_multi_select($this->_mh, $this->selectTimeout) === -1) {\n            // Perform a usleep if a select returns -1.\n            // See: https://bugs.php.net/bug.php?id=61141\n            \\usleep(250);\n        }\n\n        while (\\curl_multi_exec($this->_mh, $this->active) === \\CURLM_CALL_MULTI_PERFORM) {\n        }\n\n        $this->processMessages();\n    }\n\n    /**\n     * Runs until all outstanding connections have completed.\n     */\n    public function execute(): void\n    {\n        $queue = P\\Utils::queue();\n\n        while ($this->handles || !$queue->isEmpty()) {\n            // If there are no transfers, then sleep for the next delay\n            if (!$this->active && $this->delays) {\n                \\usleep($this->timeToNext());\n            }\n            $this->tick();\n        }\n    }\n\n    private function addRequest(array $entry): void\n    {\n        $easy = $entry['easy'];\n        $id = (int) $easy->handle;\n        $this->handles[$id] = $entry;\n        if (empty($easy->options['delay'])) {\n            \\curl_multi_add_handle($this->_mh, $easy->handle);\n        } else {\n            $this->delays[$id] = Utils::currentTime() + ($easy->options['delay'] / 1000);\n        }\n    }\n\n    /**\n     * Cancels a handle from sending and removes references to it.\n     *\n     * @param int $id Handle ID to cancel and remove.\n     *\n     * @return bool True on success, false on failure.\n     */\n    private function cancel($id): bool\n    {\n        if (!is_int($id)) {\n            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an integer to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);\n        }\n\n        // Cannot cancel if it has been processed.\n        if (!isset($this->handles[$id])) {\n            return false;\n        }\n\n        $handle = $this->handles[$id]['easy']->handle;\n        unset($this->delays[$id], $this->handles[$id]);\n        \\curl_multi_remove_handle($this->_mh, $handle);\n        \\curl_close($handle);\n\n        return true;\n    }\n\n    private function processMessages(): void\n    {\n        while ($done = \\curl_multi_info_read($this->_mh)) {\n            if ($done['msg'] !== \\CURLMSG_DONE) {\n                // if it's not done, then it would be premature to remove the handle. ref https://github.com/guzzle/guzzle/pull/2892#issuecomment-945150216\n                continue;\n            }\n            $id = (int) $done['handle'];\n            \\curl_multi_remove_handle($this->_mh, $done['handle']);\n\n            if (!isset($this->handles[$id])) {\n                // Probably was cancelled.\n                continue;\n            }\n\n            $entry = $this->handles[$id];\n            unset($this->handles[$id], $this->delays[$id]);\n            $entry['easy']->errno = $done['result'];\n            $entry['deferred']->resolve(\n                CurlFactory::finish($this, $entry['easy'], $this->factory)\n            );\n        }\n    }\n\n    private function timeToNext(): int\n    {\n        $currentTime = Utils::currentTime();\n        $nextTime = \\PHP_INT_MAX;\n        foreach ($this->delays as $time) {\n            if ($time < $nextTime) {\n                $nextTime = $time;\n            }\n        }\n\n        return ((int) \\max(0, $nextTime - $currentTime)) * 1000000;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse GuzzleHttp\\Utils;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Represents a cURL easy handle and the data it populates.\n *\n * @internal\n */\nfinal class EasyHandle\n{\n    /**\n     * @var resource|\\CurlHandle cURL resource\n     */\n    public $handle;\n\n    /**\n     * @var StreamInterface Where data is being written\n     */\n    public $sink;\n\n    /**\n     * @var array Received HTTP headers so far\n     */\n    public $headers = [];\n\n    /**\n     * @var ResponseInterface|null Received response (if any)\n     */\n    public $response;\n\n    /**\n     * @var RequestInterface Request being sent\n     */\n    public $request;\n\n    /**\n     * @var array Request options\n     */\n    public $options = [];\n\n    /**\n     * @var int cURL error number (if any)\n     */\n    public $errno = 0;\n\n    /**\n     * @var \\Throwable|null Exception during on_headers (if any)\n     */\n    public $onHeadersException;\n\n    /**\n     * @var \\Exception|null Exception during createResponse (if any)\n     */\n    public $createResponseException;\n\n    /**\n     * Attach a response to the easy handle based on the received headers.\n     *\n     * @throws \\RuntimeException if no headers have been received or the first\n     *                           header line is invalid.\n     */\n    public function createResponse(): void\n    {\n        [$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($this->headers);\n\n        $normalizedKeys = Utils::normalizeHeaderKeys($headers);\n\n        if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding'])) {\n            $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']];\n            unset($headers[$normalizedKeys['content-encoding']]);\n            if (isset($normalizedKeys['content-length'])) {\n                $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']];\n\n                $bodyLength = (int) $this->sink->getSize();\n                if ($bodyLength) {\n                    $headers[$normalizedKeys['content-length']] = $bodyLength;\n                } else {\n                    unset($headers[$normalizedKeys['content-length']]);\n                }\n            }\n        }\n\n        // Attach a response to the easy handle with the parsed headers.\n        $this->response = new Response(\n            $status,\n            $headers,\n            $this->sink,\n            $ver,\n            $reason\n        );\n    }\n\n    /**\n     * @param string $name\n     *\n     * @return void\n     *\n     * @throws \\BadMethodCallException\n     */\n    public function __get($name)\n    {\n        $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: '.$name;\n        throw new \\BadMethodCallException($msg);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Utils;\n\n/**\n * @internal\n */\nfinal class HeaderProcessor\n{\n    /**\n     * Returns the HTTP version, status code, reason phrase, and headers.\n     *\n     * @param string[] $headers\n     *\n     * @return array{0:string, 1:int, 2:?string, 3:array}\n     *\n     * @throws \\RuntimeException\n     */\n    public static function parseHeaders(array $headers): array\n    {\n        if ($headers === []) {\n            throw new \\RuntimeException('Expected a non-empty array of header data');\n        }\n\n        $parts = \\explode(' ', \\array_shift($headers), 3);\n        $version = \\explode('/', $parts[0])[1] ?? null;\n\n        if ($version === null) {\n            throw new \\RuntimeException('HTTP version missing from header data');\n        }\n\n        $status = $parts[1] ?? null;\n\n        if ($status === null) {\n            throw new \\RuntimeException('HTTP status code missing from header data');\n        }\n\n        return [$version, (int) $status, $parts[2] ?? null, Utils::headersFromLines($headers)];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\HandlerStack;\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\TransferStats;\nuse GuzzleHttp\\Utils;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Handler that returns responses or throw exceptions from a queue.\n *\n * @final\n */\nclass MockHandler implements \\Countable\n{\n    /**\n     * @var array\n     */\n    private $queue = [];\n\n    /**\n     * @var RequestInterface|null\n     */\n    private $lastRequest;\n\n    /**\n     * @var array\n     */\n    private $lastOptions = [];\n\n    /**\n     * @var callable|null\n     */\n    private $onFulfilled;\n\n    /**\n     * @var callable|null\n     */\n    private $onRejected;\n\n    /**\n     * Creates a new MockHandler that uses the default handler stack list of\n     * middlewares.\n     *\n     * @param array|null    $queue       Array of responses, callables, or exceptions.\n     * @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled.\n     * @param callable|null $onRejected  Callback to invoke when the return value is rejected.\n     */\n    public static function createWithMiddleware(array $queue = null, callable $onFulfilled = null, callable $onRejected = null): HandlerStack\n    {\n        return HandlerStack::create(new self($queue, $onFulfilled, $onRejected));\n    }\n\n    /**\n     * The passed in value must be an array of\n     * {@see \\Psr\\Http\\Message\\ResponseInterface} objects, Exceptions,\n     * callables, or Promises.\n     *\n     * @param array<int, mixed>|null $queue       The parameters to be passed to the append function, as an indexed array.\n     * @param callable|null          $onFulfilled Callback to invoke when the return value is fulfilled.\n     * @param callable|null          $onRejected  Callback to invoke when the return value is rejected.\n     */\n    public function __construct(array $queue = null, callable $onFulfilled = null, callable $onRejected = null)\n    {\n        $this->onFulfilled = $onFulfilled;\n        $this->onRejected = $onRejected;\n\n        if ($queue) {\n            // array_values included for BC\n            $this->append(...array_values($queue));\n        }\n    }\n\n    public function __invoke(RequestInterface $request, array $options): PromiseInterface\n    {\n        if (!$this->queue) {\n            throw new \\OutOfBoundsException('Mock queue is empty');\n        }\n\n        if (isset($options['delay']) && \\is_numeric($options['delay'])) {\n            \\usleep((int) $options['delay'] * 1000);\n        }\n\n        $this->lastRequest = $request;\n        $this->lastOptions = $options;\n        $response = \\array_shift($this->queue);\n\n        if (isset($options['on_headers'])) {\n            if (!\\is_callable($options['on_headers'])) {\n                throw new \\InvalidArgumentException('on_headers must be callable');\n            }\n            try {\n                $options['on_headers']($response);\n            } catch (\\Exception $e) {\n                $msg = 'An error was encountered during the on_headers event';\n                $response = new RequestException($msg, $request, $response, $e);\n            }\n        }\n\n        if (\\is_callable($response)) {\n            $response = $response($request, $options);\n        }\n\n        $response = $response instanceof \\Throwable\n            ? P\\Create::rejectionFor($response)\n            : P\\Create::promiseFor($response);\n\n        return $response->then(\n            function (?ResponseInterface $value) use ($request, $options) {\n                $this->invokeStats($request, $options, $value);\n                if ($this->onFulfilled) {\n                    ($this->onFulfilled)($value);\n                }\n\n                if ($value !== null && isset($options['sink'])) {\n                    $contents = (string) $value->getBody();\n                    $sink = $options['sink'];\n\n                    if (\\is_resource($sink)) {\n                        \\fwrite($sink, $contents);\n                    } elseif (\\is_string($sink)) {\n                        \\file_put_contents($sink, $contents);\n                    } elseif ($sink instanceof StreamInterface) {\n                        $sink->write($contents);\n                    }\n                }\n\n                return $value;\n            },\n            function ($reason) use ($request, $options) {\n                $this->invokeStats($request, $options, null, $reason);\n                if ($this->onRejected) {\n                    ($this->onRejected)($reason);\n                }\n\n                return P\\Create::rejectionFor($reason);\n            }\n        );\n    }\n\n    /**\n     * Adds one or more variadic requests, exceptions, callables, or promises\n     * to the queue.\n     *\n     * @param mixed ...$values\n     */\n    public function append(...$values): void\n    {\n        foreach ($values as $value) {\n            if ($value instanceof ResponseInterface\n                || $value instanceof \\Throwable\n                || $value instanceof PromiseInterface\n                || \\is_callable($value)\n            ) {\n                $this->queue[] = $value;\n            } else {\n                throw new \\TypeError('Expected a Response, Promise, Throwable or callable. Found '.Utils::describeType($value));\n            }\n        }\n    }\n\n    /**\n     * Get the last received request.\n     */\n    public function getLastRequest(): ?RequestInterface\n    {\n        return $this->lastRequest;\n    }\n\n    /**\n     * Get the last received request options.\n     */\n    public function getLastOptions(): array\n    {\n        return $this->lastOptions;\n    }\n\n    /**\n     * Returns the number of remaining items in the queue.\n     */\n    public function count(): int\n    {\n        return \\count($this->queue);\n    }\n\n    public function reset(): void\n    {\n        $this->queue = [];\n    }\n\n    /**\n     * @param mixed $reason Promise or reason.\n     */\n    private function invokeStats(\n        RequestInterface $request,\n        array $options,\n        ResponseInterface $response = null,\n        $reason = null\n    ): void {\n        if (isset($options['on_stats'])) {\n            $transferTime = $options['transfer_time'] ?? 0;\n            $stats = new TransferStats($request, $response, $transferTime, $reason);\n            ($options['on_stats'])($stats);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\RequestOptions;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Provides basic proxies for handlers.\n *\n * @final\n */\nclass Proxy\n{\n    /**\n     * Sends synchronous requests to a specific handler while sending all other\n     * requests to another handler.\n     *\n     * @param callable(\\Psr\\Http\\Message\\RequestInterface, array): \\GuzzleHttp\\Promise\\PromiseInterface $default Handler used for normal responses\n     * @param callable(\\Psr\\Http\\Message\\RequestInterface, array): \\GuzzleHttp\\Promise\\PromiseInterface $sync    Handler used for synchronous responses.\n     *\n     * @return callable(\\Psr\\Http\\Message\\RequestInterface, array): \\GuzzleHttp\\Promise\\PromiseInterface Returns the composed handler.\n     */\n    public static function wrapSync(callable $default, callable $sync): callable\n    {\n        return static function (RequestInterface $request, array $options) use ($default, $sync): PromiseInterface {\n            return empty($options[RequestOptions::SYNCHRONOUS]) ? $default($request, $options) : $sync($request, $options);\n        };\n    }\n\n    /**\n     * Sends streaming requests to a streaming compatible handler while sending\n     * all other requests to a default handler.\n     *\n     * This, for example, could be useful for taking advantage of the\n     * performance benefits of curl while still supporting true streaming\n     * through the StreamHandler.\n     *\n     * @param callable(\\Psr\\Http\\Message\\RequestInterface, array): \\GuzzleHttp\\Promise\\PromiseInterface $default   Handler used for non-streaming responses\n     * @param callable(\\Psr\\Http\\Message\\RequestInterface, array): \\GuzzleHttp\\Promise\\PromiseInterface $streaming Handler used for streaming responses\n     *\n     * @return callable(\\Psr\\Http\\Message\\RequestInterface, array): \\GuzzleHttp\\Promise\\PromiseInterface Returns the composed handler.\n     */\n    public static function wrapStreaming(callable $default, callable $streaming): callable\n    {\n        return static function (RequestInterface $request, array $options) use ($default, $streaming): PromiseInterface {\n            return empty($options['stream']) ? $default($request, $options) : $streaming($request, $options);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\ConnectException;\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\FulfilledPromise;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Psr7;\nuse GuzzleHttp\\TransferStats;\nuse GuzzleHttp\\Utils;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * HTTP handler that uses PHP's HTTP stream wrapper.\n *\n * @final\n */\nclass StreamHandler\n{\n    /**\n     * @var array\n     */\n    private $lastHeaders = [];\n\n    /**\n     * Sends an HTTP request.\n     *\n     * @param RequestInterface $request Request to send.\n     * @param array            $options Request transfer options.\n     */\n    public function __invoke(RequestInterface $request, array $options): PromiseInterface\n    {\n        // Sleep if there is a delay specified.\n        if (isset($options['delay'])) {\n            \\usleep($options['delay'] * 1000);\n        }\n\n        $startTime = isset($options['on_stats']) ? Utils::currentTime() : null;\n\n        try {\n            // Does not support the expect header.\n            $request = $request->withoutHeader('Expect');\n\n            // Append a content-length header if body size is zero to match\n            // cURL's behavior.\n            if (0 === $request->getBody()->getSize()) {\n                $request = $request->withHeader('Content-Length', '0');\n            }\n\n            return $this->createResponse(\n                $request,\n                $options,\n                $this->createStream($request, $options),\n                $startTime\n            );\n        } catch (\\InvalidArgumentException $e) {\n            throw $e;\n        } catch (\\Exception $e) {\n            // Determine if the error was a networking error.\n            $message = $e->getMessage();\n            // This list can probably get more comprehensive.\n            if (false !== \\strpos($message, 'getaddrinfo') // DNS lookup failed\n                || false !== \\strpos($message, 'Connection refused')\n                || false !== \\strpos($message, \"couldn't connect to host\") // error on HHVM\n                || false !== \\strpos($message, 'connection attempt failed')\n            ) {\n                $e = new ConnectException($e->getMessage(), $request, $e);\n            } else {\n                $e = RequestException::wrapException($request, $e);\n            }\n            $this->invokeStats($options, $request, $startTime, null, $e);\n\n            return P\\Create::rejectionFor($e);\n        }\n    }\n\n    private function invokeStats(\n        array $options,\n        RequestInterface $request,\n        ?float $startTime,\n        ResponseInterface $response = null,\n        \\Throwable $error = null\n    ): void {\n        if (isset($options['on_stats'])) {\n            $stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []);\n            ($options['on_stats'])($stats);\n        }\n    }\n\n    /**\n     * @param resource $stream\n     */\n    private function createResponse(RequestInterface $request, array $options, $stream, ?float $startTime): PromiseInterface\n    {\n        $hdrs = $this->lastHeaders;\n        $this->lastHeaders = [];\n\n        try {\n            [$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($hdrs);\n        } catch (\\Exception $e) {\n            return P\\Create::rejectionFor(\n                new RequestException('An error was encountered while creating the response', $request, null, $e)\n            );\n        }\n\n        [$stream, $headers] = $this->checkDecode($options, $headers, $stream);\n        $stream = Psr7\\Utils::streamFor($stream);\n        $sink = $stream;\n\n        if (\\strcasecmp('HEAD', $request->getMethod())) {\n            $sink = $this->createSink($stream, $options);\n        }\n\n        try {\n            $response = new Psr7\\Response($status, $headers, $sink, $ver, $reason);\n        } catch (\\Exception $e) {\n            return P\\Create::rejectionFor(\n                new RequestException('An error was encountered while creating the response', $request, null, $e)\n            );\n        }\n\n        if (isset($options['on_headers'])) {\n            try {\n                $options['on_headers']($response);\n            } catch (\\Exception $e) {\n                return P\\Create::rejectionFor(\n                    new RequestException('An error was encountered during the on_headers event', $request, $response, $e)\n                );\n            }\n        }\n\n        // Do not drain when the request is a HEAD request because they have\n        // no body.\n        if ($sink !== $stream) {\n            $this->drain($stream, $sink, $response->getHeaderLine('Content-Length'));\n        }\n\n        $this->invokeStats($options, $request, $startTime, $response, null);\n\n        return new FulfilledPromise($response);\n    }\n\n    private function createSink(StreamInterface $stream, array $options): StreamInterface\n    {\n        if (!empty($options['stream'])) {\n            return $stream;\n        }\n\n        $sink = $options['sink'] ?? Psr7\\Utils::tryFopen('php://temp', 'r+');\n\n        return \\is_string($sink) ? new Psr7\\LazyOpenStream($sink, 'w+') : Psr7\\Utils::streamFor($sink);\n    }\n\n    /**\n     * @param resource $stream\n     */\n    private function checkDecode(array $options, array $headers, $stream): array\n    {\n        // Automatically decode responses when instructed.\n        if (!empty($options['decode_content'])) {\n            $normalizedKeys = Utils::normalizeHeaderKeys($headers);\n            if (isset($normalizedKeys['content-encoding'])) {\n                $encoding = $headers[$normalizedKeys['content-encoding']];\n                if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') {\n                    $stream = new Psr7\\InflateStream(Psr7\\Utils::streamFor($stream));\n                    $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']];\n\n                    // Remove content-encoding header\n                    unset($headers[$normalizedKeys['content-encoding']]);\n\n                    // Fix content-length header\n                    if (isset($normalizedKeys['content-length'])) {\n                        $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']];\n                        $length = (int) $stream->getSize();\n                        if ($length === 0) {\n                            unset($headers[$normalizedKeys['content-length']]);\n                        } else {\n                            $headers[$normalizedKeys['content-length']] = [$length];\n                        }\n                    }\n                }\n            }\n        }\n\n        return [$stream, $headers];\n    }\n\n    /**\n     * Drains the source stream into the \"sink\" client option.\n     *\n     * @param string $contentLength Header specifying the amount of\n     *                              data to read.\n     *\n     * @throws \\RuntimeException when the sink option is invalid.\n     */\n    private function drain(StreamInterface $source, StreamInterface $sink, string $contentLength): StreamInterface\n    {\n        // If a content-length header is provided, then stop reading once\n        // that number of bytes has been read. This can prevent infinitely\n        // reading from a stream when dealing with servers that do not honor\n        // Connection: Close headers.\n        Psr7\\Utils::copyToStream(\n            $source,\n            $sink,\n            (\\strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1\n        );\n\n        $sink->seek(0);\n        $source->close();\n\n        return $sink;\n    }\n\n    /**\n     * Create a resource and check to ensure it was created successfully\n     *\n     * @param callable $callback Callable that returns stream resource\n     *\n     * @return resource\n     *\n     * @throws \\RuntimeException on error\n     */\n    private function createResource(callable $callback)\n    {\n        $errors = [];\n        \\set_error_handler(static function ($_, $msg, $file, $line) use (&$errors): bool {\n            $errors[] = [\n                'message' => $msg,\n                'file' => $file,\n                'line' => $line,\n            ];\n\n            return true;\n        });\n\n        try {\n            $resource = $callback();\n        } finally {\n            \\restore_error_handler();\n        }\n\n        if (!$resource) {\n            $message = 'Error creating resource: ';\n            foreach ($errors as $err) {\n                foreach ($err as $key => $value) {\n                    $message .= \"[$key] $value\".\\PHP_EOL;\n                }\n            }\n            throw new \\RuntimeException(\\trim($message));\n        }\n\n        return $resource;\n    }\n\n    /**\n     * @return resource\n     */\n    private function createStream(RequestInterface $request, array $options)\n    {\n        static $methods;\n        if (!$methods) {\n            $methods = \\array_flip(\\get_class_methods(__CLASS__));\n        }\n\n        if (!\\in_array($request->getUri()->getScheme(), ['http', 'https'])) {\n            throw new RequestException(\\sprintf(\"The scheme '%s' is not supported.\", $request->getUri()->getScheme()), $request);\n        }\n\n        // HTTP/1.1 streams using the PHP stream wrapper require a\n        // Connection: close header\n        if ($request->getProtocolVersion() == '1.1'\n            && !$request->hasHeader('Connection')\n        ) {\n            $request = $request->withHeader('Connection', 'close');\n        }\n\n        // Ensure SSL is verified by default\n        if (!isset($options['verify'])) {\n            $options['verify'] = true;\n        }\n\n        $params = [];\n        $context = $this->getDefaultContext($request);\n\n        if (isset($options['on_headers']) && !\\is_callable($options['on_headers'])) {\n            throw new \\InvalidArgumentException('on_headers must be callable');\n        }\n\n        if (!empty($options)) {\n            foreach ($options as $key => $value) {\n                $method = \"add_{$key}\";\n                if (isset($methods[$method])) {\n                    $this->{$method}($request, $context, $value, $params);\n                }\n            }\n        }\n\n        if (isset($options['stream_context'])) {\n            if (!\\is_array($options['stream_context'])) {\n                throw new \\InvalidArgumentException('stream_context must be an array');\n            }\n            $context = \\array_replace_recursive($context, $options['stream_context']);\n        }\n\n        // Microsoft NTLM authentication only supported with curl handler\n        if (isset($options['auth'][2]) && 'ntlm' === $options['auth'][2]) {\n            throw new \\InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler');\n        }\n\n        $uri = $this->resolveHost($request, $options);\n\n        $contextResource = $this->createResource(\n            static function () use ($context, $params) {\n                return \\stream_context_create($context, $params);\n            }\n        );\n\n        return $this->createResource(\n            function () use ($uri, &$http_response_header, $contextResource, $context, $options, $request) {\n                $resource = @\\fopen((string) $uri, 'r', false, $contextResource);\n                $this->lastHeaders = $http_response_header ?? [];\n\n                if (false === $resource) {\n                    throw new ConnectException(sprintf('Connection refused for URI %s', $uri), $request, null, $context);\n                }\n\n                if (isset($options['read_timeout'])) {\n                    $readTimeout = $options['read_timeout'];\n                    $sec = (int) $readTimeout;\n                    $usec = ($readTimeout - $sec) * 100000;\n                    \\stream_set_timeout($resource, $sec, $usec);\n                }\n\n                return $resource;\n            }\n        );\n    }\n\n    private function resolveHost(RequestInterface $request, array $options): UriInterface\n    {\n        $uri = $request->getUri();\n\n        if (isset($options['force_ip_resolve']) && !\\filter_var($uri->getHost(), \\FILTER_VALIDATE_IP)) {\n            if ('v4' === $options['force_ip_resolve']) {\n                $records = \\dns_get_record($uri->getHost(), \\DNS_A);\n                if (false === $records || !isset($records[0]['ip'])) {\n                    throw new ConnectException(\\sprintf(\"Could not resolve IPv4 address for host '%s'\", $uri->getHost()), $request);\n                }\n\n                return $uri->withHost($records[0]['ip']);\n            }\n            if ('v6' === $options['force_ip_resolve']) {\n                $records = \\dns_get_record($uri->getHost(), \\DNS_AAAA);\n                if (false === $records || !isset($records[0]['ipv6'])) {\n                    throw new ConnectException(\\sprintf(\"Could not resolve IPv6 address for host '%s'\", $uri->getHost()), $request);\n                }\n\n                return $uri->withHost('['.$records[0]['ipv6'].']');\n            }\n        }\n\n        return $uri;\n    }\n\n    private function getDefaultContext(RequestInterface $request): array\n    {\n        $headers = '';\n        foreach ($request->getHeaders() as $name => $value) {\n            foreach ($value as $val) {\n                $headers .= \"$name: $val\\r\\n\";\n            }\n        }\n\n        $context = [\n            'http' => [\n                'method' => $request->getMethod(),\n                'header' => $headers,\n                'protocol_version' => $request->getProtocolVersion(),\n                'ignore_errors' => true,\n                'follow_location' => 0,\n            ],\n            'ssl' => [\n                'peer_name' => $request->getUri()->getHost(),\n            ],\n        ];\n\n        $body = (string) $request->getBody();\n\n        if ('' !== $body) {\n            $context['http']['content'] = $body;\n            // Prevent the HTTP handler from adding a Content-Type header.\n            if (!$request->hasHeader('Content-Type')) {\n                $context['http']['header'] .= \"Content-Type:\\r\\n\";\n            }\n        }\n\n        $context['http']['header'] = \\rtrim($context['http']['header']);\n\n        return $context;\n    }\n\n    /**\n     * @param mixed $value as passed via Request transfer options.\n     */\n    private function add_proxy(RequestInterface $request, array &$options, $value, array &$params): void\n    {\n        $uri = null;\n\n        if (!\\is_array($value)) {\n            $uri = $value;\n        } else {\n            $scheme = $request->getUri()->getScheme();\n            if (isset($value[$scheme])) {\n                if (!isset($value['no']) || !Utils::isHostInNoProxy($request->getUri()->getHost(), $value['no'])) {\n                    $uri = $value[$scheme];\n                }\n            }\n        }\n\n        if (!$uri) {\n            return;\n        }\n\n        $parsed = $this->parse_proxy($uri);\n        $options['http']['proxy'] = $parsed['proxy'];\n\n        if ($parsed['auth']) {\n            if (!isset($options['http']['header'])) {\n                $options['http']['header'] = [];\n            }\n            $options['http']['header'] .= \"\\r\\nProxy-Authorization: {$parsed['auth']}\";\n        }\n    }\n\n    /**\n     * Parses the given proxy URL to make it compatible with the format PHP's stream context expects.\n     */\n    private function parse_proxy(string $url): array\n    {\n        $parsed = \\parse_url($url);\n\n        if ($parsed !== false && isset($parsed['scheme']) && $parsed['scheme'] === 'http') {\n            if (isset($parsed['host']) && isset($parsed['port'])) {\n                $auth = null;\n                if (isset($parsed['user']) && isset($parsed['pass'])) {\n                    $auth = \\base64_encode(\"{$parsed['user']}:{$parsed['pass']}\");\n                }\n\n                return [\n                    'proxy' => \"tcp://{$parsed['host']}:{$parsed['port']}\",\n                    'auth' => $auth ? \"Basic {$auth}\" : null,\n                ];\n            }\n        }\n\n        // Return proxy as-is.\n        return [\n            'proxy' => $url,\n            'auth' => null,\n        ];\n    }\n\n    /**\n     * @param mixed $value as passed via Request transfer options.\n     */\n    private function add_timeout(RequestInterface $request, array &$options, $value, array &$params): void\n    {\n        if ($value > 0) {\n            $options['http']['timeout'] = $value;\n        }\n    }\n\n    /**\n     * @param mixed $value as passed via Request transfer options.\n     */\n    private function add_crypto_method(RequestInterface $request, array &$options, $value, array &$params): void\n    {\n        if (\n            $value === \\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT\n            || $value === \\STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT\n            || $value === \\STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT\n            || (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && $value === \\STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT)\n        ) {\n            $options['http']['crypto_method'] = $value;\n\n            return;\n        }\n\n        throw new \\InvalidArgumentException('Invalid crypto_method request option: unknown version provided');\n    }\n\n    /**\n     * @param mixed $value as passed via Request transfer options.\n     */\n    private function add_verify(RequestInterface $request, array &$options, $value, array &$params): void\n    {\n        if ($value === false) {\n            $options['ssl']['verify_peer'] = false;\n            $options['ssl']['verify_peer_name'] = false;\n\n            return;\n        }\n\n        if (\\is_string($value)) {\n            $options['ssl']['cafile'] = $value;\n            if (!\\file_exists($value)) {\n                throw new \\RuntimeException(\"SSL CA bundle not found: $value\");\n            }\n        } elseif ($value !== true) {\n            throw new \\InvalidArgumentException('Invalid verify request option');\n        }\n\n        $options['ssl']['verify_peer'] = true;\n        $options['ssl']['verify_peer_name'] = true;\n        $options['ssl']['allow_self_signed'] = false;\n    }\n\n    /**\n     * @param mixed $value as passed via Request transfer options.\n     */\n    private function add_cert(RequestInterface $request, array &$options, $value, array &$params): void\n    {\n        if (\\is_array($value)) {\n            $options['ssl']['passphrase'] = $value[1];\n            $value = $value[0];\n        }\n\n        if (!\\file_exists($value)) {\n            throw new \\RuntimeException(\"SSL certificate not found: {$value}\");\n        }\n\n        $options['ssl']['local_cert'] = $value;\n    }\n\n    /**\n     * @param mixed $value as passed via Request transfer options.\n     */\n    private function add_progress(RequestInterface $request, array &$options, $value, array &$params): void\n    {\n        self::addNotification(\n            $params,\n            static function ($code, $a, $b, $c, $transferred, $total) use ($value) {\n                if ($code == \\STREAM_NOTIFY_PROGRESS) {\n                    // The upload progress cannot be determined. Use 0 for cURL compatibility:\n                    // https://curl.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html\n                    $value($total, $transferred, 0, 0);\n                }\n            }\n        );\n    }\n\n    /**\n     * @param mixed $value as passed via Request transfer options.\n     */\n    private function add_debug(RequestInterface $request, array &$options, $value, array &$params): void\n    {\n        if ($value === false) {\n            return;\n        }\n\n        static $map = [\n            \\STREAM_NOTIFY_CONNECT => 'CONNECT',\n            \\STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',\n            \\STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT',\n            \\STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS',\n            \\STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS',\n            \\STREAM_NOTIFY_REDIRECTED => 'REDIRECTED',\n            \\STREAM_NOTIFY_PROGRESS => 'PROGRESS',\n            \\STREAM_NOTIFY_FAILURE => 'FAILURE',\n            \\STREAM_NOTIFY_COMPLETED => 'COMPLETED',\n            \\STREAM_NOTIFY_RESOLVE => 'RESOLVE',\n        ];\n        static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max'];\n\n        $value = Utils::debugResource($value);\n        $ident = $request->getMethod().' '.$request->getUri()->withFragment('');\n        self::addNotification(\n            $params,\n            static function (int $code, ...$passed) use ($ident, $value, $map, $args): void {\n                \\fprintf($value, '<%s> [%s] ', $ident, $map[$code]);\n                foreach (\\array_filter($passed) as $i => $v) {\n                    \\fwrite($value, $args[$i].': \"'.$v.'\" ');\n                }\n                \\fwrite($value, \"\\n\");\n            }\n        );\n    }\n\n    private static function addNotification(array &$params, callable $notify): void\n    {\n        // Wrap the existing function if needed.\n        if (!isset($params['notification'])) {\n            $params['notification'] = $notify;\n        } else {\n            $params['notification'] = self::callArray([\n                $params['notification'],\n                $notify,\n            ]);\n        }\n    }\n\n    private static function callArray(array $functions): callable\n    {\n        return static function (...$args) use ($functions) {\n            foreach ($functions as $fn) {\n                $fn(...$args);\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/HandlerStack.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Creates a composed Guzzle handler function by stacking middlewares on top of\n * an HTTP handler function.\n *\n * @final\n */\nclass HandlerStack\n{\n    /**\n     * @var (callable(RequestInterface, array): PromiseInterface)|null\n     */\n    private $handler;\n\n    /**\n     * @var array{(callable(callable(RequestInterface, array): PromiseInterface): callable), (string|null)}[]\n     */\n    private $stack = [];\n\n    /**\n     * @var (callable(RequestInterface, array): PromiseInterface)|null\n     */\n    private $cached;\n\n    /**\n     * Creates a default handler stack that can be used by clients.\n     *\n     * The returned handler will wrap the provided handler or use the most\n     * appropriate default handler for your system. The returned HandlerStack has\n     * support for cookies, redirects, HTTP error exceptions, and preparing a body\n     * before sending.\n     *\n     * The returned handler stack can be passed to a client in the \"handler\"\n     * option.\n     *\n     * @param (callable(RequestInterface, array): PromiseInterface)|null $handler HTTP handler function to use with the stack. If no\n     *                                                                            handler is provided, the best handler for your\n     *                                                                            system will be utilized.\n     */\n    public static function create(callable $handler = null): self\n    {\n        $stack = new self($handler ?: Utils::chooseHandler());\n        $stack->push(Middleware::httpErrors(), 'http_errors');\n        $stack->push(Middleware::redirect(), 'allow_redirects');\n        $stack->push(Middleware::cookies(), 'cookies');\n        $stack->push(Middleware::prepareBody(), 'prepare_body');\n\n        return $stack;\n    }\n\n    /**\n     * @param (callable(RequestInterface, array): PromiseInterface)|null $handler Underlying HTTP handler.\n     */\n    public function __construct(callable $handler = null)\n    {\n        $this->handler = $handler;\n    }\n\n    /**\n     * Invokes the handler stack as a composed handler\n     *\n     * @return ResponseInterface|PromiseInterface\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        $handler = $this->resolve();\n\n        return $handler($request, $options);\n    }\n\n    /**\n     * Dumps a string representation of the stack.\n     *\n     * @return string\n     */\n    public function __toString()\n    {\n        $depth = 0;\n        $stack = [];\n\n        if ($this->handler !== null) {\n            $stack[] = '0) Handler: '.$this->debugCallable($this->handler);\n        }\n\n        $result = '';\n        foreach (\\array_reverse($this->stack) as $tuple) {\n            ++$depth;\n            $str = \"{$depth}) Name: '{$tuple[1]}', \";\n            $str .= 'Function: '.$this->debugCallable($tuple[0]);\n            $result = \"> {$str}\\n{$result}\";\n            $stack[] = $str;\n        }\n\n        foreach (\\array_keys($stack) as $k) {\n            $result .= \"< {$stack[$k]}\\n\";\n        }\n\n        return $result;\n    }\n\n    /**\n     * Set the HTTP handler that actually returns a promise.\n     *\n     * @param callable(RequestInterface, array): PromiseInterface $handler Accepts a request and array of options and\n     *                                                                     returns a Promise.\n     */\n    public function setHandler(callable $handler): void\n    {\n        $this->handler = $handler;\n        $this->cached = null;\n    }\n\n    /**\n     * Returns true if the builder has a handler.\n     */\n    public function hasHandler(): bool\n    {\n        return $this->handler !== null;\n    }\n\n    /**\n     * Unshift a middleware to the bottom of the stack.\n     *\n     * @param callable(callable): callable $middleware Middleware function\n     * @param string                       $name       Name to register for this middleware.\n     */\n    public function unshift(callable $middleware, string $name = null): void\n    {\n        \\array_unshift($this->stack, [$middleware, $name]);\n        $this->cached = null;\n    }\n\n    /**\n     * Push a middleware to the top of the stack.\n     *\n     * @param callable(callable): callable $middleware Middleware function\n     * @param string                       $name       Name to register for this middleware.\n     */\n    public function push(callable $middleware, string $name = ''): void\n    {\n        $this->stack[] = [$middleware, $name];\n        $this->cached = null;\n    }\n\n    /**\n     * Add a middleware before another middleware by name.\n     *\n     * @param string                       $findName   Middleware to find\n     * @param callable(callable): callable $middleware Middleware function\n     * @param string                       $withName   Name to register for this middleware.\n     */\n    public function before(string $findName, callable $middleware, string $withName = ''): void\n    {\n        $this->splice($findName, $withName, $middleware, true);\n    }\n\n    /**\n     * Add a middleware after another middleware by name.\n     *\n     * @param string                       $findName   Middleware to find\n     * @param callable(callable): callable $middleware Middleware function\n     * @param string                       $withName   Name to register for this middleware.\n     */\n    public function after(string $findName, callable $middleware, string $withName = ''): void\n    {\n        $this->splice($findName, $withName, $middleware, false);\n    }\n\n    /**\n     * Remove a middleware by instance or name from the stack.\n     *\n     * @param callable|string $remove Middleware to remove by instance or name.\n     */\n    public function remove($remove): void\n    {\n        if (!is_string($remove) && !is_callable($remove)) {\n            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a callable or string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);\n        }\n\n        $this->cached = null;\n        $idx = \\is_callable($remove) ? 0 : 1;\n        $this->stack = \\array_values(\\array_filter(\n            $this->stack,\n            static function ($tuple) use ($idx, $remove) {\n                return $tuple[$idx] !== $remove;\n            }\n        ));\n    }\n\n    /**\n     * Compose the middleware and handler into a single callable function.\n     *\n     * @return callable(RequestInterface, array): PromiseInterface\n     */\n    public function resolve(): callable\n    {\n        if ($this->cached === null) {\n            if (($prev = $this->handler) === null) {\n                throw new \\LogicException('No handler has been specified');\n            }\n\n            foreach (\\array_reverse($this->stack) as $fn) {\n                /** @var callable(RequestInterface, array): PromiseInterface $prev */\n                $prev = $fn[0]($prev);\n            }\n\n            $this->cached = $prev;\n        }\n\n        return $this->cached;\n    }\n\n    private function findByName(string $name): int\n    {\n        foreach ($this->stack as $k => $v) {\n            if ($v[1] === $name) {\n                return $k;\n            }\n        }\n\n        throw new \\InvalidArgumentException(\"Middleware not found: $name\");\n    }\n\n    /**\n     * Splices a function into the middleware list at a specific position.\n     */\n    private function splice(string $findName, string $withName, callable $middleware, bool $before): void\n    {\n        $this->cached = null;\n        $idx = $this->findByName($findName);\n        $tuple = [$middleware, $withName];\n\n        if ($before) {\n            if ($idx === 0) {\n                \\array_unshift($this->stack, $tuple);\n            } else {\n                $replacement = [$tuple, $this->stack[$idx]];\n                \\array_splice($this->stack, $idx, 1, $replacement);\n            }\n        } elseif ($idx === \\count($this->stack) - 1) {\n            $this->stack[] = $tuple;\n        } else {\n            $replacement = [$this->stack[$idx], $tuple];\n            \\array_splice($this->stack, $idx, 1, $replacement);\n        }\n    }\n\n    /**\n     * Provides a debug string for a given callable.\n     *\n     * @param callable|string $fn Function to write as a string.\n     */\n    private function debugCallable($fn): string\n    {\n        if (\\is_string($fn)) {\n            return \"callable({$fn})\";\n        }\n\n        if (\\is_array($fn)) {\n            return \\is_string($fn[0])\n                ? \"callable({$fn[0]}::{$fn[1]})\"\n                : \"callable(['\".\\get_class($fn[0]).\"', '{$fn[1]}'])\";\n        }\n\n        /** @var object $fn */\n        return 'callable('.\\spl_object_hash($fn).')';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/MessageFormatter.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Formats log messages using variable substitutions for requests, responses,\n * and other transactional data.\n *\n * The following variable substitutions are supported:\n *\n * - {request}:        Full HTTP request message\n * - {response}:       Full HTTP response message\n * - {ts}:             ISO 8601 date in GMT\n * - {date_iso_8601}   ISO 8601 date in GMT\n * - {date_common_log} Apache common log date using the configured timezone.\n * - {host}:           Host of the request\n * - {method}:         Method of the request\n * - {uri}:            URI of the request\n * - {version}:        Protocol version\n * - {target}:         Request target of the request (path + query + fragment)\n * - {hostname}:       Hostname of the machine that sent the request\n * - {code}:           Status code of the response (if available)\n * - {phrase}:         Reason phrase of the response  (if available)\n * - {error}:          Any error messages (if available)\n * - {req_header_*}:   Replace `*` with the lowercased name of a request header to add to the message\n * - {res_header_*}:   Replace `*` with the lowercased name of a response header to add to the message\n * - {req_headers}:    Request headers\n * - {res_headers}:    Response headers\n * - {req_body}:       Request body\n * - {res_body}:       Response body\n *\n * @final\n */\nclass MessageFormatter implements MessageFormatterInterface\n{\n    /**\n     * Apache Common Log Format.\n     *\n     * @see https://httpd.apache.org/docs/2.4/logs.html#common\n     *\n     * @var string\n     */\n    public const CLF = '{hostname} {req_header_User-Agent} - [{date_common_log}] \"{method} {target} HTTP/{version}\" {code} {res_header_Content-Length}';\n    public const DEBUG = \">>>>>>>>\\n{request}\\n<<<<<<<<\\n{response}\\n--------\\n{error}\";\n    public const SHORT = '[{ts}] \"{method} {target} HTTP/{version}\" {code}';\n\n    /**\n     * @var string Template used to format log messages\n     */\n    private $template;\n\n    /**\n     * @param string $template Log message template\n     */\n    public function __construct(?string $template = self::CLF)\n    {\n        $this->template = $template ?: self::CLF;\n    }\n\n    /**\n     * Returns a formatted message string.\n     *\n     * @param RequestInterface       $request  Request that was sent\n     * @param ResponseInterface|null $response Response that was received\n     * @param \\Throwable|null        $error    Exception that was received\n     */\n    public function format(RequestInterface $request, ResponseInterface $response = null, \\Throwable $error = null): string\n    {\n        $cache = [];\n\n        /** @var string */\n        return \\preg_replace_callback(\n            '/{\\s*([A-Za-z_\\-\\.0-9]+)\\s*}/',\n            function (array $matches) use ($request, $response, $error, &$cache) {\n                if (isset($cache[$matches[1]])) {\n                    return $cache[$matches[1]];\n                }\n\n                $result = '';\n                switch ($matches[1]) {\n                    case 'request':\n                        $result = Psr7\\Message::toString($request);\n                        break;\n                    case 'response':\n                        $result = $response ? Psr7\\Message::toString($response) : '';\n                        break;\n                    case 'req_headers':\n                        $result = \\trim($request->getMethod()\n                                .' '.$request->getRequestTarget())\n                            .' HTTP/'.$request->getProtocolVersion().\"\\r\\n\"\n                            .$this->headers($request);\n                        break;\n                    case 'res_headers':\n                        $result = $response ?\n                            \\sprintf(\n                                'HTTP/%s %d %s',\n                                $response->getProtocolVersion(),\n                                $response->getStatusCode(),\n                                $response->getReasonPhrase()\n                            ).\"\\r\\n\".$this->headers($response)\n                            : 'NULL';\n                        break;\n                    case 'req_body':\n                        $result = $request->getBody()->__toString();\n                        break;\n                    case 'res_body':\n                        if (!$response instanceof ResponseInterface) {\n                            $result = 'NULL';\n                            break;\n                        }\n\n                        $body = $response->getBody();\n\n                        if (!$body->isSeekable()) {\n                            $result = 'RESPONSE_NOT_LOGGEABLE';\n                            break;\n                        }\n\n                        $result = $response->getBody()->__toString();\n                        break;\n                    case 'ts':\n                    case 'date_iso_8601':\n                        $result = \\gmdate('c');\n                        break;\n                    case 'date_common_log':\n                        $result = \\date('d/M/Y:H:i:s O');\n                        break;\n                    case 'method':\n                        $result = $request->getMethod();\n                        break;\n                    case 'version':\n                        $result = $request->getProtocolVersion();\n                        break;\n                    case 'uri':\n                    case 'url':\n                        $result = $request->getUri()->__toString();\n                        break;\n                    case 'target':\n                        $result = $request->getRequestTarget();\n                        break;\n                    case 'req_version':\n                        $result = $request->getProtocolVersion();\n                        break;\n                    case 'res_version':\n                        $result = $response\n                            ? $response->getProtocolVersion()\n                            : 'NULL';\n                        break;\n                    case 'host':\n                        $result = $request->getHeaderLine('Host');\n                        break;\n                    case 'hostname':\n                        $result = \\gethostname();\n                        break;\n                    case 'code':\n                        $result = $response ? $response->getStatusCode() : 'NULL';\n                        break;\n                    case 'phrase':\n                        $result = $response ? $response->getReasonPhrase() : 'NULL';\n                        break;\n                    case 'error':\n                        $result = $error ? $error->getMessage() : 'NULL';\n                        break;\n                    default:\n                        // handle prefixed dynamic headers\n                        if (\\strpos($matches[1], 'req_header_') === 0) {\n                            $result = $request->getHeaderLine(\\substr($matches[1], 11));\n                        } elseif (\\strpos($matches[1], 'res_header_') === 0) {\n                            $result = $response\n                                ? $response->getHeaderLine(\\substr($matches[1], 11))\n                                : 'NULL';\n                        }\n                }\n\n                $cache[$matches[1]] = $result;\n\n                return $result;\n            },\n            $this->template\n        );\n    }\n\n    /**\n     * Get headers from message as string\n     */\n    private function headers(MessageInterface $message): string\n    {\n        $result = '';\n        foreach ($message->getHeaders() as $name => $values) {\n            $result .= $name.': '.\\implode(', ', $values).\"\\r\\n\";\n        }\n\n        return \\trim($result);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\ninterface MessageFormatterInterface\n{\n    /**\n     * Returns a formatted message string.\n     *\n     * @param RequestInterface       $request  Request that was sent\n     * @param ResponseInterface|null $response Response that was received\n     * @param \\Throwable|null        $error    Exception that was received\n     */\n    public function format(RequestInterface $request, ResponseInterface $response = null, \\Throwable $error = null): string;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Middleware.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Cookie\\CookieJarInterface;\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Log\\LoggerInterface;\n\n/**\n * Functions used to create and wrap handlers with handler middleware.\n */\nfinal class Middleware\n{\n    /**\n     * Middleware that adds cookies to requests.\n     *\n     * The options array must be set to a CookieJarInterface in order to use\n     * cookies. This is typically handled for you by a client.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function cookies(): callable\n    {\n        return static function (callable $handler): callable {\n            return static function ($request, array $options) use ($handler) {\n                if (empty($options['cookies'])) {\n                    return $handler($request, $options);\n                } elseif (!($options['cookies'] instanceof CookieJarInterface)) {\n                    throw new \\InvalidArgumentException('cookies must be an instance of GuzzleHttp\\Cookie\\CookieJarInterface');\n                }\n                $cookieJar = $options['cookies'];\n                $request = $cookieJar->withCookieHeader($request);\n\n                return $handler($request, $options)\n                    ->then(\n                        static function (ResponseInterface $response) use ($cookieJar, $request): ResponseInterface {\n                            $cookieJar->extractCookies($request, $response);\n\n                            return $response;\n                        }\n                    );\n            };\n        };\n    }\n\n    /**\n     * Middleware that throws exceptions for 4xx or 5xx responses when the\n     * \"http_errors\" request option is set to true.\n     *\n     * @param BodySummarizerInterface|null $bodySummarizer The body summarizer to use in exception messages.\n     *\n     * @return callable(callable): callable Returns a function that accepts the next handler.\n     */\n    public static function httpErrors(BodySummarizerInterface $bodySummarizer = null): callable\n    {\n        return static function (callable $handler) use ($bodySummarizer): callable {\n            return static function ($request, array $options) use ($handler, $bodySummarizer) {\n                if (empty($options['http_errors'])) {\n                    return $handler($request, $options);\n                }\n\n                return $handler($request, $options)->then(\n                    static function (ResponseInterface $response) use ($request, $bodySummarizer) {\n                        $code = $response->getStatusCode();\n                        if ($code < 400) {\n                            return $response;\n                        }\n                        throw RequestException::create($request, $response, null, [], $bodySummarizer);\n                    }\n                );\n            };\n        };\n    }\n\n    /**\n     * Middleware that pushes history data to an ArrayAccess container.\n     *\n     * @param array|\\ArrayAccess<int, array> $container Container to hold the history (by reference).\n     *\n     * @return callable(callable): callable Returns a function that accepts the next handler.\n     *\n     * @throws \\InvalidArgumentException if container is not an array or ArrayAccess.\n     */\n    public static function history(&$container): callable\n    {\n        if (!\\is_array($container) && !$container instanceof \\ArrayAccess) {\n            throw new \\InvalidArgumentException('history container must be an array or object implementing ArrayAccess');\n        }\n\n        return static function (callable $handler) use (&$container): callable {\n            return static function (RequestInterface $request, array $options) use ($handler, &$container) {\n                return $handler($request, $options)->then(\n                    static function ($value) use ($request, &$container, $options) {\n                        $container[] = [\n                            'request' => $request,\n                            'response' => $value,\n                            'error' => null,\n                            'options' => $options,\n                        ];\n\n                        return $value;\n                    },\n                    static function ($reason) use ($request, &$container, $options) {\n                        $container[] = [\n                            'request' => $request,\n                            'response' => null,\n                            'error' => $reason,\n                            'options' => $options,\n                        ];\n\n                        return P\\Create::rejectionFor($reason);\n                    }\n                );\n            };\n        };\n    }\n\n    /**\n     * Middleware that invokes a callback before and after sending a request.\n     *\n     * The provided listener cannot modify or alter the response. It simply\n     * \"taps\" into the chain to be notified before returning the promise. The\n     * before listener accepts a request and options array, and the after\n     * listener accepts a request, options array, and response promise.\n     *\n     * @param callable $before Function to invoke before forwarding the request.\n     * @param callable $after  Function invoked after forwarding.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function tap(callable $before = null, callable $after = null): callable\n    {\n        return static function (callable $handler) use ($before, $after): callable {\n            return static function (RequestInterface $request, array $options) use ($handler, $before, $after) {\n                if ($before) {\n                    $before($request, $options);\n                }\n                $response = $handler($request, $options);\n                if ($after) {\n                    $after($request, $options, $response);\n                }\n\n                return $response;\n            };\n        };\n    }\n\n    /**\n     * Middleware that handles request redirects.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function redirect(): callable\n    {\n        return static function (callable $handler): RedirectMiddleware {\n            return new RedirectMiddleware($handler);\n        };\n    }\n\n    /**\n     * Middleware that retries requests based on the boolean result of\n     * invoking the provided \"decider\" function.\n     *\n     * If no delay function is provided, a simple implementation of exponential\n     * backoff will be utilized.\n     *\n     * @param callable $decider Function that accepts the number of retries,\n     *                          a request, [response], and [exception] and\n     *                          returns true if the request is to be retried.\n     * @param callable $delay   Function that accepts the number of retries and\n     *                          returns the number of milliseconds to delay.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function retry(callable $decider, callable $delay = null): callable\n    {\n        return static function (callable $handler) use ($decider, $delay): RetryMiddleware {\n            return new RetryMiddleware($decider, $handler, $delay);\n        };\n    }\n\n    /**\n     * Middleware that logs requests, responses, and errors using a message\n     * formatter.\n     *\n     * @phpstan-param \\Psr\\Log\\LogLevel::* $logLevel  Level at which to log requests.\n     *\n     * @param LoggerInterface                            $logger    Logs messages.\n     * @param MessageFormatterInterface|MessageFormatter $formatter Formatter used to create message strings.\n     * @param string                                     $logLevel  Level at which to log requests.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function log(LoggerInterface $logger, $formatter, string $logLevel = 'info'): callable\n    {\n        // To be compatible with Guzzle 7.1.x we need to allow users to pass a MessageFormatter\n        if (!$formatter instanceof MessageFormatter && !$formatter instanceof MessageFormatterInterface) {\n            throw new \\LogicException(sprintf('Argument 2 to %s::log() must be of type %s', self::class, MessageFormatterInterface::class));\n        }\n\n        return static function (callable $handler) use ($logger, $formatter, $logLevel): callable {\n            return static function (RequestInterface $request, array $options = []) use ($handler, $logger, $formatter, $logLevel) {\n                return $handler($request, $options)->then(\n                    static function ($response) use ($logger, $request, $formatter, $logLevel): ResponseInterface {\n                        $message = $formatter->format($request, $response);\n                        $logger->log($logLevel, $message);\n\n                        return $response;\n                    },\n                    static function ($reason) use ($logger, $request, $formatter): PromiseInterface {\n                        $response = $reason instanceof RequestException ? $reason->getResponse() : null;\n                        $message = $formatter->format($request, $response, P\\Create::exceptionFor($reason));\n                        $logger->error($message);\n\n                        return P\\Create::rejectionFor($reason);\n                    }\n                );\n            };\n        };\n    }\n\n    /**\n     * This middleware adds a default content-type if possible, a default\n     * content-length or transfer-encoding header, and the expect header.\n     */\n    public static function prepareBody(): callable\n    {\n        return static function (callable $handler): PrepareBodyMiddleware {\n            return new PrepareBodyMiddleware($handler);\n        };\n    }\n\n    /**\n     * Middleware that applies a map function to the request before passing to\n     * the next handler.\n     *\n     * @param callable $fn Function that accepts a RequestInterface and returns\n     *                     a RequestInterface.\n     */\n    public static function mapRequest(callable $fn): callable\n    {\n        return static function (callable $handler) use ($fn): callable {\n            return static function (RequestInterface $request, array $options) use ($handler, $fn) {\n                return $handler($fn($request), $options);\n            };\n        };\n    }\n\n    /**\n     * Middleware that applies a map function to the resolved promise's\n     * response.\n     *\n     * @param callable $fn Function that accepts a ResponseInterface and\n     *                     returns a ResponseInterface.\n     */\n    public static function mapResponse(callable $fn): callable\n    {\n        return static function (callable $handler) use ($fn): callable {\n            return static function (RequestInterface $request, array $options) use ($handler, $fn) {\n                return $handler($request, $options)->then($fn);\n            };\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Pool.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\EachPromise;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Promise\\PromisorInterface;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Sends an iterator of requests concurrently using a capped pool size.\n *\n * The pool will read from an iterator until it is cancelled or until the\n * iterator is consumed. When a request is yielded, the request is sent after\n * applying the \"request_options\" request options (if provided in the ctor).\n *\n * When a function is yielded by the iterator, the function is provided the\n * \"request_options\" array that should be merged on top of any existing\n * options, and the function MUST then return a wait-able promise.\n *\n * @final\n */\nclass Pool implements PromisorInterface\n{\n    /**\n     * @var EachPromise\n     */\n    private $each;\n\n    /**\n     * @param ClientInterface $client   Client used to send the requests.\n     * @param array|\\Iterator $requests Requests or functions that return\n     *                                  requests to send concurrently.\n     * @param array           $config   Associative array of options\n     *                                  - concurrency: (int) Maximum number of requests to send concurrently\n     *                                  - options: Array of request options to apply to each request.\n     *                                  - fulfilled: (callable) Function to invoke when a request completes.\n     *                                  - rejected: (callable) Function to invoke when a request is rejected.\n     */\n    public function __construct(ClientInterface $client, $requests, array $config = [])\n    {\n        if (!isset($config['concurrency'])) {\n            $config['concurrency'] = 25;\n        }\n\n        if (isset($config['options'])) {\n            $opts = $config['options'];\n            unset($config['options']);\n        } else {\n            $opts = [];\n        }\n\n        $iterable = P\\Create::iterFor($requests);\n        $requests = static function () use ($iterable, $client, $opts) {\n            foreach ($iterable as $key => $rfn) {\n                if ($rfn instanceof RequestInterface) {\n                    yield $key => $client->sendAsync($rfn, $opts);\n                } elseif (\\is_callable($rfn)) {\n                    yield $key => $rfn($opts);\n                } else {\n                    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.');\n                }\n            }\n        };\n\n        $this->each = new EachPromise($requests(), $config);\n    }\n\n    /**\n     * Get promise\n     */\n    public function promise(): PromiseInterface\n    {\n        return $this->each->promise();\n    }\n\n    /**\n     * Sends multiple requests concurrently and returns an array of responses\n     * and exceptions that uses the same ordering as the provided requests.\n     *\n     * IMPORTANT: This method keeps every request and response in memory, and\n     * as such, is NOT recommended when sending a large number or an\n     * indeterminate number of requests concurrently.\n     *\n     * @param ClientInterface $client   Client used to send the requests\n     * @param array|\\Iterator $requests Requests to send concurrently.\n     * @param array           $options  Passes through the options available in\n     *                                  {@see \\GuzzleHttp\\Pool::__construct}\n     *\n     * @return array Returns an array containing the response or an exception\n     *               in the same order that the requests were sent.\n     *\n     * @throws \\InvalidArgumentException if the event format is incorrect.\n     */\n    public static function batch(ClientInterface $client, $requests, array $options = []): array\n    {\n        $res = [];\n        self::cmpCallback($options, 'fulfilled', $res);\n        self::cmpCallback($options, 'rejected', $res);\n        $pool = new static($client, $requests, $options);\n        $pool->promise()->wait();\n        \\ksort($res);\n\n        return $res;\n    }\n\n    /**\n     * Execute callback(s)\n     */\n    private static function cmpCallback(array &$options, string $name, array &$results): void\n    {\n        if (!isset($options[$name])) {\n            $options[$name] = static function ($v, $k) use (&$results) {\n                $results[$k] = $v;\n            };\n        } else {\n            $currentFn = $options[$name];\n            $options[$name] = static function ($v, $k) use (&$results, $currentFn) {\n                $currentFn($v, $k);\n                $results[$k] = $v;\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Prepares requests that contain a body, adding the Content-Length,\n * Content-Type, and Expect headers.\n *\n * @final\n */\nclass PrepareBodyMiddleware\n{\n    /**\n     * @var callable(RequestInterface, array): PromiseInterface\n     */\n    private $nextHandler;\n\n    /**\n     * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke.\n     */\n    public function __construct(callable $nextHandler)\n    {\n        $this->nextHandler = $nextHandler;\n    }\n\n    public function __invoke(RequestInterface $request, array $options): PromiseInterface\n    {\n        $fn = $this->nextHandler;\n\n        // Don't do anything if the request has no body.\n        if ($request->getBody()->getSize() === 0) {\n            return $fn($request, $options);\n        }\n\n        $modify = [];\n\n        // Add a default content-type if possible.\n        if (!$request->hasHeader('Content-Type')) {\n            if ($uri = $request->getBody()->getMetadata('uri')) {\n                if (is_string($uri) && $type = Psr7\\MimeType::fromFilename($uri)) {\n                    $modify['set_headers']['Content-Type'] = $type;\n                }\n            }\n        }\n\n        // Add a default content-length or transfer-encoding header.\n        if (!$request->hasHeader('Content-Length')\n            && !$request->hasHeader('Transfer-Encoding')\n        ) {\n            $size = $request->getBody()->getSize();\n            if ($size !== null) {\n                $modify['set_headers']['Content-Length'] = $size;\n            } else {\n                $modify['set_headers']['Transfer-Encoding'] = 'chunked';\n            }\n        }\n\n        // Add the expect header if needed.\n        $this->addExpectHeader($request, $options, $modify);\n\n        return $fn(Psr7\\Utils::modifyRequest($request, $modify), $options);\n    }\n\n    /**\n     * Add expect header\n     */\n    private function addExpectHeader(RequestInterface $request, array $options, array &$modify): void\n    {\n        // Determine if the Expect header should be used\n        if ($request->hasHeader('Expect')) {\n            return;\n        }\n\n        $expect = $options['expect'] ?? null;\n\n        // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0\n        if ($expect === false || $request->getProtocolVersion() < 1.1) {\n            return;\n        }\n\n        // The expect header is unconditionally enabled\n        if ($expect === true) {\n            $modify['set_headers']['Expect'] = '100-Continue';\n\n            return;\n        }\n\n        // By default, send the expect header when the payload is > 1mb\n        if ($expect === null) {\n            $expect = 1048576;\n        }\n\n        // Always add if the body cannot be rewound, the size cannot be\n        // determined, or the size is greater than the cutoff threshold\n        $body = $request->getBody();\n        $size = $body->getSize();\n\n        if ($size === null || $size >= (int) $expect || !$body->isSeekable()) {\n            $modify['set_headers']['Expect'] = '100-Continue';\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\BadResponseException;\nuse GuzzleHttp\\Exception\\TooManyRedirectsException;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Request redirect middleware.\n *\n * Apply this middleware like other middleware using\n * {@see \\GuzzleHttp\\Middleware::redirect()}.\n *\n * @final\n */\nclass RedirectMiddleware\n{\n    public const HISTORY_HEADER = 'X-Guzzle-Redirect-History';\n\n    public const STATUS_HISTORY_HEADER = 'X-Guzzle-Redirect-Status-History';\n\n    /**\n     * @var array\n     */\n    public static $defaultSettings = [\n        'max' => 5,\n        'protocols' => ['http', 'https'],\n        'strict' => false,\n        'referer' => false,\n        'track_redirects' => false,\n    ];\n\n    /**\n     * @var callable(RequestInterface, array): PromiseInterface\n     */\n    private $nextHandler;\n\n    /**\n     * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke.\n     */\n    public function __construct(callable $nextHandler)\n    {\n        $this->nextHandler = $nextHandler;\n    }\n\n    public function __invoke(RequestInterface $request, array $options): PromiseInterface\n    {\n        $fn = $this->nextHandler;\n\n        if (empty($options['allow_redirects'])) {\n            return $fn($request, $options);\n        }\n\n        if ($options['allow_redirects'] === true) {\n            $options['allow_redirects'] = self::$defaultSettings;\n        } elseif (!\\is_array($options['allow_redirects'])) {\n            throw new \\InvalidArgumentException('allow_redirects must be true, false, or array');\n        } else {\n            // Merge the default settings with the provided settings\n            $options['allow_redirects'] += self::$defaultSettings;\n        }\n\n        if (empty($options['allow_redirects']['max'])) {\n            return $fn($request, $options);\n        }\n\n        return $fn($request, $options)\n            ->then(function (ResponseInterface $response) use ($request, $options) {\n                return $this->checkRedirect($request, $options, $response);\n            });\n    }\n\n    /**\n     * @return ResponseInterface|PromiseInterface\n     */\n    public function checkRedirect(RequestInterface $request, array $options, ResponseInterface $response)\n    {\n        if (\\strpos((string) $response->getStatusCode(), '3') !== 0\n            || !$response->hasHeader('Location')\n        ) {\n            return $response;\n        }\n\n        $this->guardMax($request, $response, $options);\n        $nextRequest = $this->modifyRequest($request, $options, $response);\n\n        // If authorization is handled by curl, unset it if URI is cross-origin.\n        if (Psr7\\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && defined('\\CURLOPT_HTTPAUTH')) {\n            unset(\n                $options['curl'][\\CURLOPT_HTTPAUTH],\n                $options['curl'][\\CURLOPT_USERPWD]\n            );\n        }\n\n        if (isset($options['allow_redirects']['on_redirect'])) {\n            ($options['allow_redirects']['on_redirect'])(\n                $request,\n                $response,\n                $nextRequest->getUri()\n            );\n        }\n\n        $promise = $this($nextRequest, $options);\n\n        // Add headers to be able to track history of redirects.\n        if (!empty($options['allow_redirects']['track_redirects'])) {\n            return $this->withTracking(\n                $promise,\n                (string) $nextRequest->getUri(),\n                $response->getStatusCode()\n            );\n        }\n\n        return $promise;\n    }\n\n    /**\n     * Enable tracking on promise.\n     */\n    private function withTracking(PromiseInterface $promise, string $uri, int $statusCode): PromiseInterface\n    {\n        return $promise->then(\n            static function (ResponseInterface $response) use ($uri, $statusCode) {\n                // Note that we are pushing to the front of the list as this\n                // would be an earlier response than what is currently present\n                // in the history header.\n                $historyHeader = $response->getHeader(self::HISTORY_HEADER);\n                $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER);\n                \\array_unshift($historyHeader, $uri);\n                \\array_unshift($statusHeader, (string) $statusCode);\n\n                return $response->withHeader(self::HISTORY_HEADER, $historyHeader)\n                                ->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader);\n            }\n        );\n    }\n\n    /**\n     * Check for too many redirects.\n     *\n     * @throws TooManyRedirectsException Too many redirects.\n     */\n    private function guardMax(RequestInterface $request, ResponseInterface $response, array &$options): void\n    {\n        $current = $options['__redirect_count']\n            ?? 0;\n        $options['__redirect_count'] = $current + 1;\n        $max = $options['allow_redirects']['max'];\n\n        if ($options['__redirect_count'] > $max) {\n            throw new TooManyRedirectsException(\"Will not follow more than {$max} redirects\", $request, $response);\n        }\n    }\n\n    public function modifyRequest(RequestInterface $request, array $options, ResponseInterface $response): RequestInterface\n    {\n        // Request modifications to apply.\n        $modify = [];\n        $protocols = $options['allow_redirects']['protocols'];\n\n        // Use a GET request if this is an entity enclosing request and we are\n        // not forcing RFC compliance, but rather emulating what all browsers\n        // would do.\n        $statusCode = $response->getStatusCode();\n        if ($statusCode == 303\n            || ($statusCode <= 302 && !$options['allow_redirects']['strict'])\n        ) {\n            $safeMethods = ['GET', 'HEAD', 'OPTIONS'];\n            $requestMethod = $request->getMethod();\n\n            $modify['method'] = in_array($requestMethod, $safeMethods) ? $requestMethod : 'GET';\n            $modify['body'] = '';\n        }\n\n        $uri = self::redirectUri($request, $response, $protocols);\n        if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) {\n            $idnOptions = ($options['idn_conversion'] === true) ? \\IDNA_DEFAULT : $options['idn_conversion'];\n            $uri = Utils::idnUriConvert($uri, $idnOptions);\n        }\n\n        $modify['uri'] = $uri;\n        Psr7\\Message::rewindBody($request);\n\n        // Add the Referer header if it is told to do so and only\n        // add the header if we are not redirecting from https to http.\n        if ($options['allow_redirects']['referer']\n            && $modify['uri']->getScheme() === $request->getUri()->getScheme()\n        ) {\n            $uri = $request->getUri()->withUserInfo('');\n            $modify['set_headers']['Referer'] = (string) $uri;\n        } else {\n            $modify['remove_headers'][] = 'Referer';\n        }\n\n        // Remove Authorization and Cookie headers if URI is cross-origin.\n        if (Psr7\\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) {\n            $modify['remove_headers'][] = 'Authorization';\n            $modify['remove_headers'][] = 'Cookie';\n        }\n\n        return Psr7\\Utils::modifyRequest($request, $modify);\n    }\n\n    /**\n     * Set the appropriate URL on the request based on the location header.\n     */\n    private static function redirectUri(\n        RequestInterface $request,\n        ResponseInterface $response,\n        array $protocols\n    ): UriInterface {\n        $location = Psr7\\UriResolver::resolve(\n            $request->getUri(),\n            new Psr7\\Uri($response->getHeaderLine('Location'))\n        );\n\n        // Ensure that the redirect URI is allowed based on the protocols.\n        if (!\\in_array($location->getScheme(), $protocols)) {\n            throw new BadResponseException(\\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', $location, \\implode(', ', $protocols)), $request, $response);\n        }\n\n        return $location;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/RequestOptions.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\n/**\n * This class contains a list of built-in Guzzle request options.\n *\n * @see https://docs.guzzlephp.org/en/latest/request-options.html\n */\nfinal class RequestOptions\n{\n    /**\n     * allow_redirects: (bool|array) Controls redirect behavior. Pass false\n     * to disable redirects, pass true to enable redirects, pass an\n     * associative to provide custom redirect settings. Defaults to \"false\".\n     * This option only works if your handler has the RedirectMiddleware. When\n     * passing an associative array, you can provide the following key value\n     * pairs:\n     *\n     * - max: (int, default=5) maximum number of allowed redirects.\n     * - strict: (bool, default=false) Set to true to use strict redirects\n     *   meaning redirect POST requests with POST requests vs. doing what most\n     *   browsers do which is redirect POST requests with GET requests\n     * - referer: (bool, default=false) Set to true to enable the Referer\n     *   header.\n     * - protocols: (array, default=['http', 'https']) Allowed redirect\n     *   protocols.\n     * - on_redirect: (callable) PHP callable that is invoked when a redirect\n     *   is encountered. The callable is invoked with the request, the redirect\n     *   response that was received, and the effective URI. Any return value\n     *   from the on_redirect function is ignored.\n     */\n    public const ALLOW_REDIRECTS = 'allow_redirects';\n\n    /**\n     * auth: (array) Pass an array of HTTP authentication parameters to use\n     * with the request. The array must contain the username in index [0],\n     * the password in index [1], and you can optionally provide a built-in\n     * authentication type in index [2]. Pass null to disable authentication\n     * for a request.\n     */\n    public const AUTH = 'auth';\n\n    /**\n     * body: (resource|string|null|int|float|StreamInterface|callable|\\Iterator)\n     * Body to send in the request.\n     */\n    public const BODY = 'body';\n\n    /**\n     * cert: (string|array) Set to a string to specify the path to a file\n     * containing a PEM formatted SSL client side certificate. If a password\n     * is required, then set cert to an array containing the path to the PEM\n     * file in the first array element followed by the certificate password\n     * in the second array element.\n     */\n    public const CERT = 'cert';\n\n    /**\n     * cookies: (bool|GuzzleHttp\\Cookie\\CookieJarInterface, default=false)\n     * Specifies whether or not cookies are used in a request or what cookie\n     * jar to use or what cookies to send. This option only works if your\n     * handler has the `cookie` middleware. Valid values are `false` and\n     * an instance of {@see \\GuzzleHttp\\Cookie\\CookieJarInterface}.\n     */\n    public const COOKIES = 'cookies';\n\n    /**\n     * connect_timeout: (float, default=0) Float describing the number of\n     * seconds to wait while trying to connect to a server. Use 0 to wait\n     * 300 seconds (the default behavior).\n     */\n    public const CONNECT_TIMEOUT = 'connect_timeout';\n\n    /**\n     * crypto_method: (int) A value describing the minimum TLS protocol\n     * version to use.\n     *\n     * This setting must be set to one of the\n     * ``STREAM_CRYPTO_METHOD_TLS*_CLIENT`` constants. PHP 7.4 or higher is\n     * required in order to use TLS 1.3, and cURL 7.34.0 or higher is required\n     * in order to specify a crypto method, with cURL 7.52.0 or higher being\n     * required to use TLS 1.3.\n     */\n    public const CRYPTO_METHOD = 'crypto_method';\n\n    /**\n     * debug: (bool|resource) Set to true or set to a PHP stream returned by\n     * fopen()  enable debug output with the HTTP handler used to send a\n     * request.\n     */\n    public const DEBUG = 'debug';\n\n    /**\n     * decode_content: (bool, default=true) Specify whether or not\n     * Content-Encoding responses (gzip, deflate, etc.) are automatically\n     * decoded.\n     */\n    public const DECODE_CONTENT = 'decode_content';\n\n    /**\n     * delay: (int) The amount of time to delay before sending in milliseconds.\n     */\n    public const DELAY = 'delay';\n\n    /**\n     * expect: (bool|integer) Controls the behavior of the\n     * \"Expect: 100-Continue\" header.\n     *\n     * Set to `true` to enable the \"Expect: 100-Continue\" header for all\n     * requests that sends a body. Set to `false` to disable the\n     * \"Expect: 100-Continue\" header for all requests. Set to a number so that\n     * the size of the payload must be greater than the number in order to send\n     * the Expect header. Setting to a number will send the Expect header for\n     * all requests in which the size of the payload cannot be determined or\n     * where the body is not rewindable.\n     *\n     * By default, Guzzle will add the \"Expect: 100-Continue\" header when the\n     * size of the body of a request is greater than 1 MB and a request is\n     * using HTTP/1.1.\n     */\n    public const EXPECT = 'expect';\n\n    /**\n     * form_params: (array) Associative array of form field names to values\n     * where each value is a string or array of strings. Sets the Content-Type\n     * header to application/x-www-form-urlencoded when no Content-Type header\n     * is already present.\n     */\n    public const FORM_PARAMS = 'form_params';\n\n    /**\n     * headers: (array) Associative array of HTTP headers. Each value MUST be\n     * a string or array of strings.\n     */\n    public const HEADERS = 'headers';\n\n    /**\n     * http_errors: (bool, default=true) Set to false to disable exceptions\n     * when a non- successful HTTP response is received. By default,\n     * exceptions will be thrown for 4xx and 5xx responses. This option only\n     * works if your handler has the `httpErrors` middleware.\n     */\n    public const HTTP_ERRORS = 'http_errors';\n\n    /**\n     * idn: (bool|int, default=true) A combination of IDNA_* constants for\n     * idn_to_ascii() PHP's function (see \"options\" parameter). Set to false to\n     * disable IDN support completely, or to true to use the default\n     * configuration (IDNA_DEFAULT constant).\n     */\n    public const IDN_CONVERSION = 'idn_conversion';\n\n    /**\n     * json: (mixed) Adds JSON data to a request. The provided value is JSON\n     * encoded and a Content-Type header of application/json will be added to\n     * the request if no Content-Type header is already present.\n     */\n    public const JSON = 'json';\n\n    /**\n     * multipart: (array) Array of associative arrays, each containing a\n     * required \"name\" key mapping to the form field, name, a required\n     * \"contents\" key mapping to a StreamInterface|resource|string, an\n     * optional \"headers\" associative array of custom headers, and an\n     * optional \"filename\" key mapping to a string to send as the filename in\n     * the part. If no \"filename\" key is present, then no \"filename\" attribute\n     * will be added to the part.\n     */\n    public const MULTIPART = 'multipart';\n\n    /**\n     * on_headers: (callable) A callable that is invoked when the HTTP headers\n     * of the response have been received but the body has not yet begun to\n     * download.\n     */\n    public const ON_HEADERS = 'on_headers';\n\n    /**\n     * on_stats: (callable) allows you to get access to transfer statistics of\n     * a request and access the lower level transfer details of the handler\n     * associated with your client. ``on_stats`` is a callable that is invoked\n     * when a handler has finished sending a request. The callback is invoked\n     * with transfer statistics about the request, the response received, or\n     * the error encountered. Included in the data is the total amount of time\n     * taken to send the request.\n     */\n    public const ON_STATS = 'on_stats';\n\n    /**\n     * progress: (callable) Defines a function to invoke when transfer\n     * progress is made. The function accepts the following positional\n     * arguments: the total number of bytes expected to be downloaded, the\n     * number of bytes downloaded so far, the number of bytes expected to be\n     * uploaded, the number of bytes uploaded so far.\n     */\n    public const PROGRESS = 'progress';\n\n    /**\n     * proxy: (string|array) Pass a string to specify an HTTP proxy, or an\n     * array to specify different proxies for different protocols (where the\n     * key is the protocol and the value is a proxy string).\n     */\n    public const PROXY = 'proxy';\n\n    /**\n     * query: (array|string) Associative array of query string values to add\n     * to the request. This option uses PHP's http_build_query() to create\n     * the string representation. Pass a string value if you need more\n     * control than what this method provides\n     */\n    public const QUERY = 'query';\n\n    /**\n     * sink: (resource|string|StreamInterface) Where the data of the\n     * response is written to. Defaults to a PHP temp stream. Providing a\n     * string will write data to a file by the given name.\n     */\n    public const SINK = 'sink';\n\n    /**\n     * synchronous: (bool) Set to true to inform HTTP handlers that you intend\n     * on waiting on the response. This can be useful for optimizations. Note\n     * that a promise is still returned if you are using one of the async\n     * client methods.\n     */\n    public const SYNCHRONOUS = 'synchronous';\n\n    /**\n     * ssl_key: (array|string) Specify the path to a file containing a private\n     * SSL key in PEM format. If a password is required, then set to an array\n     * containing the path to the SSL key in the first array element followed\n     * by the password required for the certificate in the second element.\n     */\n    public const SSL_KEY = 'ssl_key';\n\n    /**\n     * stream: Set to true to attempt to stream a response rather than\n     * download it all up-front.\n     */\n    public const STREAM = 'stream';\n\n    /**\n     * verify: (bool|string, default=true) Describes the SSL certificate\n     * verification behavior of a request. Set to true to enable SSL\n     * certificate verification using the system CA bundle when available\n     * (the default). Set to false to disable certificate verification (this\n     * is insecure!). Set to a string to provide the path to a CA bundle on\n     * disk to enable verification using a custom certificate.\n     */\n    public const VERIFY = 'verify';\n\n    /**\n     * timeout: (float, default=0) Float describing the timeout of the\n     * request in seconds. Use 0 to wait indefinitely (the default behavior).\n     */\n    public const TIMEOUT = 'timeout';\n\n    /**\n     * read_timeout: (float, default=default_socket_timeout ini setting) Float describing\n     * the body read timeout, for stream requests.\n     */\n    public const READ_TIMEOUT = 'read_timeout';\n\n    /**\n     * version: (float) Specifies the HTTP protocol version to attempt to use.\n     */\n    public const VERSION = 'version';\n\n    /**\n     * force_ip_resolve: (bool) Force client to use only ipv4 or ipv6 protocol\n     */\n    public const FORCE_IP_RESOLVE = 'force_ip_resolve';\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Middleware that retries requests based on the boolean result of\n * invoking the provided \"decider\" function.\n *\n * @final\n */\nclass RetryMiddleware\n{\n    /**\n     * @var callable(RequestInterface, array): PromiseInterface\n     */\n    private $nextHandler;\n\n    /**\n     * @var callable\n     */\n    private $decider;\n\n    /**\n     * @var callable(int)\n     */\n    private $delay;\n\n    /**\n     * @param callable                                            $decider     Function that accepts the number of retries,\n     *                                                                         a request, [response], and [exception] and\n     *                                                                         returns true if the request is to be\n     *                                                                         retried.\n     * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke.\n     * @param (callable(int): int)|null                           $delay       Function that accepts the number of retries\n     *                                                                         and returns the number of\n     *                                                                         milliseconds to delay.\n     */\n    public function __construct(callable $decider, callable $nextHandler, callable $delay = null)\n    {\n        $this->decider = $decider;\n        $this->nextHandler = $nextHandler;\n        $this->delay = $delay ?: __CLASS__.'::exponentialDelay';\n    }\n\n    /**\n     * Default exponential backoff delay function.\n     *\n     * @return int milliseconds.\n     */\n    public static function exponentialDelay(int $retries): int\n    {\n        return (int) 2 ** ($retries - 1) * 1000;\n    }\n\n    public function __invoke(RequestInterface $request, array $options): PromiseInterface\n    {\n        if (!isset($options['retries'])) {\n            $options['retries'] = 0;\n        }\n\n        $fn = $this->nextHandler;\n\n        return $fn($request, $options)\n            ->then(\n                $this->onFulfilled($request, $options),\n                $this->onRejected($request, $options)\n            );\n    }\n\n    /**\n     * Execute fulfilled closure\n     */\n    private function onFulfilled(RequestInterface $request, array $options): callable\n    {\n        return function ($value) use ($request, $options) {\n            if (!($this->decider)(\n                $options['retries'],\n                $request,\n                $value,\n                null\n            )) {\n                return $value;\n            }\n\n            return $this->doRetry($request, $options, $value);\n        };\n    }\n\n    /**\n     * Execute rejected closure\n     */\n    private function onRejected(RequestInterface $req, array $options): callable\n    {\n        return function ($reason) use ($req, $options) {\n            if (!($this->decider)(\n                $options['retries'],\n                $req,\n                null,\n                $reason\n            )) {\n                return P\\Create::rejectionFor($reason);\n            }\n\n            return $this->doRetry($req, $options);\n        };\n    }\n\n    private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null): PromiseInterface\n    {\n        $options['delay'] = ($this->delay)(++$options['retries'], $response, $request);\n\n        return $this($request, $options);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/TransferStats.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Represents data at the point after it was transferred either successfully\n * or after a network error.\n */\nfinal class TransferStats\n{\n    /**\n     * @var RequestInterface\n     */\n    private $request;\n\n    /**\n     * @var ResponseInterface|null\n     */\n    private $response;\n\n    /**\n     * @var float|null\n     */\n    private $transferTime;\n\n    /**\n     * @var array\n     */\n    private $handlerStats;\n\n    /**\n     * @var mixed|null\n     */\n    private $handlerErrorData;\n\n    /**\n     * @param RequestInterface       $request          Request that was sent.\n     * @param ResponseInterface|null $response         Response received (if any)\n     * @param float|null             $transferTime     Total handler transfer time.\n     * @param mixed                  $handlerErrorData Handler error data.\n     * @param array                  $handlerStats     Handler specific stats.\n     */\n    public function __construct(\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        float $transferTime = null,\n        $handlerErrorData = null,\n        array $handlerStats = []\n    ) {\n        $this->request = $request;\n        $this->response = $response;\n        $this->transferTime = $transferTime;\n        $this->handlerErrorData = $handlerErrorData;\n        $this->handlerStats = $handlerStats;\n    }\n\n    public function getRequest(): RequestInterface\n    {\n        return $this->request;\n    }\n\n    /**\n     * Returns the response that was received (if any).\n     */\n    public function getResponse(): ?ResponseInterface\n    {\n        return $this->response;\n    }\n\n    /**\n     * Returns true if a response was received.\n     */\n    public function hasResponse(): bool\n    {\n        return $this->response !== null;\n    }\n\n    /**\n     * Gets handler specific error data.\n     *\n     * This might be an exception, a integer representing an error code, or\n     * anything else. Relying on this value assumes that you know what handler\n     * you are using.\n     *\n     * @return mixed\n     */\n    public function getHandlerErrorData()\n    {\n        return $this->handlerErrorData;\n    }\n\n    /**\n     * Get the effective URI the request was sent to.\n     */\n    public function getEffectiveUri(): UriInterface\n    {\n        return $this->request->getUri();\n    }\n\n    /**\n     * Get the estimated time the request was being transferred by the handler.\n     *\n     * @return float|null Time in seconds.\n     */\n    public function getTransferTime(): ?float\n    {\n        return $this->transferTime;\n    }\n\n    /**\n     * Gets an array of all of the handler specific transfer data.\n     */\n    public function getHandlerStats(): array\n    {\n        return $this->handlerStats;\n    }\n\n    /**\n     * Get a specific handler statistic from the handler by name.\n     *\n     * @param string $stat Handler specific transfer stat to retrieve.\n     *\n     * @return mixed|null\n     */\n    public function getHandlerStat(string $stat)\n    {\n        return $this->handlerStats[$stat] ?? null;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/Utils.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\InvalidArgumentException;\nuse GuzzleHttp\\Handler\\CurlHandler;\nuse GuzzleHttp\\Handler\\CurlMultiHandler;\nuse GuzzleHttp\\Handler\\Proxy;\nuse GuzzleHttp\\Handler\\StreamHandler;\nuse Psr\\Http\\Message\\UriInterface;\n\nfinal class Utils\n{\n    /**\n     * Debug function used to describe the provided value type and class.\n     *\n     * @param mixed $input\n     *\n     * @return string Returns a string containing the type of the variable and\n     *                if a class is provided, the class name.\n     */\n    public static function describeType($input): string\n    {\n        switch (\\gettype($input)) {\n            case 'object':\n                return 'object('.\\get_class($input).')';\n            case 'array':\n                return 'array('.\\count($input).')';\n            default:\n                \\ob_start();\n                \\var_dump($input);\n                // normalize float vs double\n                /** @var string $varDumpContent */\n                $varDumpContent = \\ob_get_clean();\n\n                return \\str_replace('double(', 'float(', \\rtrim($varDumpContent));\n        }\n    }\n\n    /**\n     * Parses an array of header lines into an associative array of headers.\n     *\n     * @param iterable $lines Header lines array of strings in the following\n     *                        format: \"Name: Value\"\n     */\n    public static function headersFromLines(iterable $lines): array\n    {\n        $headers = [];\n\n        foreach ($lines as $line) {\n            $parts = \\explode(':', $line, 2);\n            $headers[\\trim($parts[0])][] = isset($parts[1]) ? \\trim($parts[1]) : null;\n        }\n\n        return $headers;\n    }\n\n    /**\n     * Returns a debug stream based on the provided variable.\n     *\n     * @param mixed $value Optional value\n     *\n     * @return resource\n     */\n    public static function debugResource($value = null)\n    {\n        if (\\is_resource($value)) {\n            return $value;\n        }\n        if (\\defined('STDOUT')) {\n            return \\STDOUT;\n        }\n\n        return \\GuzzleHttp\\Psr7\\Utils::tryFopen('php://output', 'w');\n    }\n\n    /**\n     * Chooses and creates a default handler to use based on the environment.\n     *\n     * The returned handler is not wrapped by any default middlewares.\n     *\n     * @return callable(\\Psr\\Http\\Message\\RequestInterface, array): \\GuzzleHttp\\Promise\\PromiseInterface Returns the best handler for the given system.\n     *\n     * @throws \\RuntimeException if no viable Handler is available.\n     */\n    public static function chooseHandler(): callable\n    {\n        $handler = null;\n\n        if (\\defined('CURLOPT_CUSTOMREQUEST')) {\n            if (\\function_exists('curl_multi_exec') && \\function_exists('curl_exec')) {\n                $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler());\n            } elseif (\\function_exists('curl_exec')) {\n                $handler = new CurlHandler();\n            } elseif (\\function_exists('curl_multi_exec')) {\n                $handler = new CurlMultiHandler();\n            }\n        }\n\n        if (\\ini_get('allow_url_fopen')) {\n            $handler = $handler\n                ? Proxy::wrapStreaming($handler, new StreamHandler())\n                : new StreamHandler();\n        } elseif (!$handler) {\n            throw new \\RuntimeException('GuzzleHttp requires cURL, the allow_url_fopen ini setting, or a custom HTTP handler.');\n        }\n\n        return $handler;\n    }\n\n    /**\n     * Get the default User-Agent string to use with Guzzle.\n     */\n    public static function defaultUserAgent(): string\n    {\n        return sprintf('GuzzleHttp/%d', ClientInterface::MAJOR_VERSION);\n    }\n\n    /**\n     * Returns the default cacert bundle for the current system.\n     *\n     * First, the openssl.cafile and curl.cainfo php.ini settings are checked.\n     * If those settings are not configured, then the common locations for\n     * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X\n     * and Windows are checked. If any of these file locations are found on\n     * disk, they will be utilized.\n     *\n     * Note: the result of this function is cached for subsequent calls.\n     *\n     * @throws \\RuntimeException if no bundle can be found.\n     *\n     * @deprecated Utils::defaultCaBundle will be removed in guzzlehttp/guzzle:8.0. This method is not needed in PHP 5.6+.\n     */\n    public static function defaultCaBundle(): string\n    {\n        static $cached = null;\n        static $cafiles = [\n            // Red Hat, CentOS, Fedora (provided by the ca-certificates package)\n            '/etc/pki/tls/certs/ca-bundle.crt',\n            // Ubuntu, Debian (provided by the ca-certificates package)\n            '/etc/ssl/certs/ca-certificates.crt',\n            // FreeBSD (provided by the ca_root_nss package)\n            '/usr/local/share/certs/ca-root-nss.crt',\n            // SLES 12 (provided by the ca-certificates package)\n            '/var/lib/ca-certificates/ca-bundle.pem',\n            // OS X provided by homebrew (using the default path)\n            '/usr/local/etc/openssl/cert.pem',\n            // Google app engine\n            '/etc/ca-certificates.crt',\n            // Windows?\n            'C:\\\\windows\\\\system32\\\\curl-ca-bundle.crt',\n            'C:\\\\windows\\\\curl-ca-bundle.crt',\n        ];\n\n        if ($cached) {\n            return $cached;\n        }\n\n        if ($ca = \\ini_get('openssl.cafile')) {\n            return $cached = $ca;\n        }\n\n        if ($ca = \\ini_get('curl.cainfo')) {\n            return $cached = $ca;\n        }\n\n        foreach ($cafiles as $filename) {\n            if (\\file_exists($filename)) {\n                return $cached = $filename;\n            }\n        }\n\n        throw new \\RuntimeException(\n            <<< EOT\nNo system CA bundle could be found in any of the the common system locations.\nPHP versions earlier than 5.6 are not properly configured to use the system's\nCA bundle by default. In order to verify peer certificates, you will need to\nsupply the path on disk to a certificate bundle to the 'verify' request\noption: https://docs.guzzlephp.org/en/latest/request-options.html#verify. If\nyou do not need a specific certificate bundle, then Mozilla provides a commonly\nused CA bundle which can be downloaded here (provided by the maintainer of\ncURL): https://curl.haxx.se/ca/cacert.pem. Once you have a CA bundle available\non disk, you can set the 'openssl.cafile' PHP ini setting to point to the path\nto the file, allowing you to omit the 'verify' request option. See\nhttps://curl.haxx.se/docs/sslcerts.html for more information.\nEOT\n        );\n    }\n\n    /**\n     * Creates an associative array of lowercase header names to the actual\n     * header casing.\n     */\n    public static function normalizeHeaderKeys(array $headers): array\n    {\n        $result = [];\n        foreach (\\array_keys($headers) as $key) {\n            $result[\\strtolower($key)] = $key;\n        }\n\n        return $result;\n    }\n\n    /**\n     * Returns true if the provided host matches any of the no proxy areas.\n     *\n     * This method will strip a port from the host if it is present. Each pattern\n     * can be matched with an exact match (e.g., \"foo.com\" == \"foo.com\") or a\n     * partial match: (e.g., \"foo.com\" == \"baz.foo.com\" and \".foo.com\" ==\n     * \"baz.foo.com\", but \".foo.com\" != \"foo.com\").\n     *\n     * Areas are matched in the following cases:\n     * 1. \"*\" (without quotes) always matches any hosts.\n     * 2. An exact match.\n     * 3. The area starts with \".\" and the area is the last part of the host. e.g.\n     *    '.mit.edu' will match any host that ends with '.mit.edu'.\n     *\n     * @param string   $host         Host to check against the patterns.\n     * @param string[] $noProxyArray An array of host patterns.\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isHostInNoProxy(string $host, array $noProxyArray): bool\n    {\n        if (\\strlen($host) === 0) {\n            throw new InvalidArgumentException('Empty host provided');\n        }\n\n        // Strip port if present.\n        [$host] = \\explode(':', $host, 2);\n\n        foreach ($noProxyArray as $area) {\n            // Always match on wildcards.\n            if ($area === '*') {\n                return true;\n            }\n\n            if (empty($area)) {\n                // Don't match on empty values.\n                continue;\n            }\n\n            if ($area === $host) {\n                // Exact matches.\n                return true;\n            }\n            // Special match if the area when prefixed with \".\". Remove any\n            // existing leading \".\" and add a new leading \".\".\n            $area = '.'.\\ltrim($area, '.');\n            if (\\substr($host, -\\strlen($area)) === $area) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Wrapper for json_decode that throws when an error occurs.\n     *\n     * @param string $json    JSON data to parse\n     * @param bool   $assoc   When true, returned objects will be converted\n     *                        into associative arrays.\n     * @param int    $depth   User specified recursion depth.\n     * @param int    $options Bitmask of JSON decode options.\n     *\n     * @return object|array|string|int|float|bool|null\n     *\n     * @throws InvalidArgumentException if the JSON cannot be decoded.\n     *\n     * @see https://www.php.net/manual/en/function.json-decode.php\n     */\n    public static function jsonDecode(string $json, bool $assoc = false, int $depth = 512, int $options = 0)\n    {\n        $data = \\json_decode($json, $assoc, $depth, $options);\n        if (\\JSON_ERROR_NONE !== \\json_last_error()) {\n            throw new InvalidArgumentException('json_decode error: '.\\json_last_error_msg());\n        }\n\n        return $data;\n    }\n\n    /**\n     * Wrapper for JSON encoding that throws when an error occurs.\n     *\n     * @param mixed $value   The value being encoded\n     * @param int   $options JSON encode option bitmask\n     * @param int   $depth   Set the maximum depth. Must be greater than zero.\n     *\n     * @throws InvalidArgumentException if the JSON cannot be encoded.\n     *\n     * @see https://www.php.net/manual/en/function.json-encode.php\n     */\n    public static function jsonEncode($value, int $options = 0, int $depth = 512): string\n    {\n        $json = \\json_encode($value, $options, $depth);\n        if (\\JSON_ERROR_NONE !== \\json_last_error()) {\n            throw new InvalidArgumentException('json_encode error: '.\\json_last_error_msg());\n        }\n\n        /** @var string */\n        return $json;\n    }\n\n    /**\n     * Wrapper for the hrtime() or microtime() functions\n     * (depending on the PHP version, one of the two is used)\n     *\n     * @return float UNIX timestamp\n     *\n     * @internal\n     */\n    public static function currentTime(): float\n    {\n        return (float) \\function_exists('hrtime') ? \\hrtime(true) / 1e9 : \\microtime(true);\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     *\n     * @internal\n     */\n    public static function idnUriConvert(UriInterface $uri, int $options = 0): UriInterface\n    {\n        if ($uri->getHost()) {\n            $asciiHost = self::idnToAsci($uri->getHost(), $options, $info);\n            if ($asciiHost === false) {\n                $errorBitSet = $info['errors'] ?? 0;\n\n                $errorConstants = array_filter(array_keys(get_defined_constants()), static function (string $name): bool {\n                    return substr($name, 0, 11) === 'IDNA_ERROR_';\n                });\n\n                $errors = [];\n                foreach ($errorConstants as $errorConstant) {\n                    if ($errorBitSet & constant($errorConstant)) {\n                        $errors[] = $errorConstant;\n                    }\n                }\n\n                $errorMessage = 'IDN conversion failed';\n                if ($errors) {\n                    $errorMessage .= ' (errors: '.implode(', ', $errors).')';\n                }\n\n                throw new InvalidArgumentException($errorMessage);\n            }\n            if ($uri->getHost() !== $asciiHost) {\n                // Replace URI only if the ASCII version is different\n                $uri = $uri->withHost($asciiHost);\n            }\n        }\n\n        return $uri;\n    }\n\n    /**\n     * @internal\n     */\n    public static function getenv(string $name): ?string\n    {\n        if (isset($_SERVER[$name])) {\n            return (string) $_SERVER[$name];\n        }\n\n        if (\\PHP_SAPI === 'cli' && ($value = \\getenv($name)) !== false && $value !== null) {\n            return (string) $value;\n        }\n\n        return null;\n    }\n\n    /**\n     * @return string|false\n     */\n    private static function idnToAsci(string $domain, int $options, ?array &$info = [])\n    {\n        if (\\function_exists('idn_to_ascii') && \\defined('INTL_IDNA_VARIANT_UTS46')) {\n            return \\idn_to_ascii($domain, $options, \\INTL_IDNA_VARIANT_UTS46, $info);\n        }\n\n        throw new \\Error('ext-idn or symfony/polyfill-intl-idn not loaded or too old');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/functions.php",
    "content": "<?php\n\nnamespace GuzzleHttp;\n\n/**\n * Debug function used to describe the provided value type and class.\n *\n * @param mixed $input Any type of variable to describe the type of. This\n *                     parameter misses a typehint because of that.\n *\n * @return string Returns a string containing the type of the variable and\n *                if a class is provided, the class name.\n *\n * @deprecated describe_type will be removed in guzzlehttp/guzzle:8.0. Use Utils::describeType instead.\n */\nfunction describe_type($input): string\n{\n    return Utils::describeType($input);\n}\n\n/**\n * Parses an array of header lines into an associative array of headers.\n *\n * @param iterable $lines Header lines array of strings in the following\n *                        format: \"Name: Value\"\n *\n * @deprecated headers_from_lines will be removed in guzzlehttp/guzzle:8.0. Use Utils::headersFromLines instead.\n */\nfunction headers_from_lines(iterable $lines): array\n{\n    return Utils::headersFromLines($lines);\n}\n\n/**\n * Returns a debug stream based on the provided variable.\n *\n * @param mixed $value Optional value\n *\n * @return resource\n *\n * @deprecated debug_resource will be removed in guzzlehttp/guzzle:8.0. Use Utils::debugResource instead.\n */\nfunction debug_resource($value = null)\n{\n    return Utils::debugResource($value);\n}\n\n/**\n * Chooses and creates a default handler to use based on the environment.\n *\n * The returned handler is not wrapped by any default middlewares.\n *\n * @return callable(\\Psr\\Http\\Message\\RequestInterface, array): \\GuzzleHttp\\Promise\\PromiseInterface Returns the best handler for the given system.\n *\n * @throws \\RuntimeException if no viable Handler is available.\n *\n * @deprecated choose_handler will be removed in guzzlehttp/guzzle:8.0. Use Utils::chooseHandler instead.\n */\nfunction choose_handler(): callable\n{\n    return Utils::chooseHandler();\n}\n\n/**\n * Get the default User-Agent string to use with Guzzle.\n *\n * @deprecated default_user_agent will be removed in guzzlehttp/guzzle:8.0. Use Utils::defaultUserAgent instead.\n */\nfunction default_user_agent(): string\n{\n    return Utils::defaultUserAgent();\n}\n\n/**\n * Returns the default cacert bundle for the current system.\n *\n * First, the openssl.cafile and curl.cainfo php.ini settings are checked.\n * If those settings are not configured, then the common locations for\n * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X\n * and Windows are checked. If any of these file locations are found on\n * disk, they will be utilized.\n *\n * Note: the result of this function is cached for subsequent calls.\n *\n * @throws \\RuntimeException if no bundle can be found.\n *\n * @deprecated default_ca_bundle will be removed in guzzlehttp/guzzle:8.0. This function is not needed in PHP 5.6+.\n */\nfunction default_ca_bundle(): string\n{\n    return Utils::defaultCaBundle();\n}\n\n/**\n * Creates an associative array of lowercase header names to the actual\n * header casing.\n *\n * @deprecated normalize_header_keys will be removed in guzzlehttp/guzzle:8.0. Use Utils::normalizeHeaderKeys instead.\n */\nfunction normalize_header_keys(array $headers): array\n{\n    return Utils::normalizeHeaderKeys($headers);\n}\n\n/**\n * Returns true if the provided host matches any of the no proxy areas.\n *\n * This method will strip a port from the host if it is present. Each pattern\n * can be matched with an exact match (e.g., \"foo.com\" == \"foo.com\") or a\n * partial match: (e.g., \"foo.com\" == \"baz.foo.com\" and \".foo.com\" ==\n * \"baz.foo.com\", but \".foo.com\" != \"foo.com\").\n *\n * Areas are matched in the following cases:\n * 1. \"*\" (without quotes) always matches any hosts.\n * 2. An exact match.\n * 3. The area starts with \".\" and the area is the last part of the host. e.g.\n *    '.mit.edu' will match any host that ends with '.mit.edu'.\n *\n * @param string   $host         Host to check against the patterns.\n * @param string[] $noProxyArray An array of host patterns.\n *\n * @throws Exception\\InvalidArgumentException\n *\n * @deprecated is_host_in_noproxy will be removed in guzzlehttp/guzzle:8.0. Use Utils::isHostInNoProxy instead.\n */\nfunction is_host_in_noproxy(string $host, array $noProxyArray): bool\n{\n    return Utils::isHostInNoProxy($host, $noProxyArray);\n}\n\n/**\n * Wrapper for json_decode that throws when an error occurs.\n *\n * @param string $json    JSON data to parse\n * @param bool   $assoc   When true, returned objects will be converted\n *                        into associative arrays.\n * @param int    $depth   User specified recursion depth.\n * @param int    $options Bitmask of JSON decode options.\n *\n * @return object|array|string|int|float|bool|null\n *\n * @throws Exception\\InvalidArgumentException if the JSON cannot be decoded.\n *\n * @see https://www.php.net/manual/en/function.json-decode.php\n * @deprecated json_decode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonDecode instead.\n */\nfunction json_decode(string $json, bool $assoc = false, int $depth = 512, int $options = 0)\n{\n    return Utils::jsonDecode($json, $assoc, $depth, $options);\n}\n\n/**\n * Wrapper for JSON encoding that throws when an error occurs.\n *\n * @param mixed $value   The value being encoded\n * @param int   $options JSON encode option bitmask\n * @param int   $depth   Set the maximum depth. Must be greater than zero.\n *\n * @throws Exception\\InvalidArgumentException if the JSON cannot be encoded.\n *\n * @see https://www.php.net/manual/en/function.json-encode.php\n * @deprecated json_encode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonEncode instead.\n */\nfunction json_encode($value, int $options = 0, int $depth = 512): string\n{\n    return Utils::jsonEncode($value, $options, $depth);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/guzzle/src/functions_include.php",
    "content": "<?php\n\n// Don't redefine the functions if included multiple times.\nif (!\\function_exists('GuzzleHttp\\describe_type')) {\n    require __DIR__.'/functions.php';\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/CHANGELOG.md",
    "content": "# CHANGELOG\n\n\n## 2.0.2 - 2023-12-03\n\n### Changed\n\n- Replaced `call_user_func*` with native calls\n\n\n## 2.0.1 - 2023-08-03\n\n### Changed\n\n- PHP 8.3 support\n\n\n## 2.0.0 - 2023-05-21\n\n### Added\n\n- Added PHP 7 type hints\n\n### Changed\n\n- All previously non-final non-exception classes have been marked as soft-final\n\n### Removed\n\n- Dropped PHP < 7.2 support\n- All functions in the `GuzzleHttp\\Promise` namespace\n\n\n## 1.5.3 - 2023-05-21\n\n### Changed\n\n- Removed remaining usage of deprecated functions\n\n\n## 1.5.2 - 2022-08-07\n\n### Changed\n\n- Officially support PHP 8.2\n\n\n## 1.5.1 - 2021-10-22\n\n### Fixed\n\n- Revert \"Call handler when waiting on fulfilled/rejected Promise\"\n- Fix pool memory leak when empty array of promises provided\n\n\n## 1.5.0 - 2021-10-07\n\n### Changed\n\n- Call handler when waiting on fulfilled/rejected Promise\n- Officially support PHP 8.1\n\n### Fixed\n\n- Fix manually settle promises generated with `Utils::task`\n\n\n## 1.4.1 - 2021-02-18\n\n### Fixed\n\n- Fixed `each_limit` skipping promises and failing\n\n\n## 1.4.0 - 2020-09-30\n\n### Added\n\n- Support for PHP 8\n- Optional `$recursive` flag to `all`\n- Replaced functions by static methods\n\n### Fixed\n\n- Fix empty `each` processing\n- Fix promise handling for Iterators of non-unique keys\n- Fixed `method_exists` crashes on PHP 8\n- Memory leak on exceptions\n\n\n## 1.3.1 - 2016-12-20\n\n### Fixed\n\n- `wait()` foreign promise compatibility\n\n\n## 1.3.0 - 2016-11-18\n\n### Added\n\n- Adds support for custom task queues.\n\n### Fixed\n\n- Fixed coroutine promise memory leak.\n\n\n## 1.2.0 - 2016-05-18\n\n### Changed\n\n- Update to now catch `\\Throwable` on PHP 7+\n\n\n## 1.1.0 - 2016-03-07\n\n### Changed\n\n- Update EachPromise to prevent recurring on a iterator when advancing, as this\n  could trigger fatal generator errors.\n- Update Promise to allow recursive waiting without unwrapping exceptions.\n\n\n## 1.0.3 - 2015-10-15\n\n### Changed\n\n- Update EachPromise to immediately resolve when the underlying promise iterator\n  is empty. Previously, such a promise would throw an exception when its `wait`\n  function was called.\n\n\n## 1.0.2 - 2015-05-15\n\n### Changed\n\n- Conditionally require functions.php.\n\n\n## 1.0.1 - 2015-06-24\n\n### Changed\n\n- Updating EachPromise to call next on the underlying promise iterator as late\n  as possible to ensure that generators that generate new requests based on\n  callbacks are not iterated until after callbacks are invoked.\n\n\n## 1.0.0 - 2015-05-12\n\n- Initial release\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Michael Dowling <mtdowling@gmail.com>\nCopyright (c) 2015 Graham Campbell <hello@gjcampbell.co.uk>\nCopyright (c) 2017 Tobias Schultze <webmaster@tubo-world.de>\nCopyright (c) 2020 Tobias Nyholm <tobias.nyholm@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/README.md",
    "content": "# Guzzle Promises\n\n[Promises/A+](https://promisesaplus.com/) implementation that handles promise\nchaining and resolution iteratively, allowing for \"infinite\" promise chaining\nwhile keeping the stack size constant. Read [this blog post](https://blog.domenic.me/youre-missing-the-point-of-promises/)\nfor a general introduction to promises.\n\n- [Features](#features)\n- [Quick start](#quick-start)\n- [Synchronous wait](#synchronous-wait)\n- [Cancellation](#cancellation)\n- [API](#api)\n  - [Promise](#promise)\n  - [FulfilledPromise](#fulfilledpromise)\n  - [RejectedPromise](#rejectedpromise)\n- [Promise interop](#promise-interop)\n- [Implementation notes](#implementation-notes)\n\n\n## Features\n\n- [Promises/A+](https://promisesaplus.com/) implementation.\n- Promise resolution and chaining is handled iteratively, allowing for\n  \"infinite\" promise chaining.\n- Promises have a synchronous `wait` method.\n- Promises can be cancelled.\n- Works with any object that has a `then` function.\n- C# style async/await coroutine promises using\n  `GuzzleHttp\\Promise\\Coroutine::of()`.\n\n\n## Installation\n\n```shell\ncomposer require guzzlehttp/promises\n```\n\n\n## Version Guidance\n\n| Version | Status                 | PHP Version  |\n|---------|------------------------|--------------|\n| 1.x     | Bug and security fixes | >=5.5,<8.3   |\n| 2.x     | Latest                 | >=7.2.5,<8.4 |\n\n\n## Quick Start\n\nA *promise* represents the eventual result of an asynchronous operation. The\nprimary way of interacting with a promise is through its `then` method, which\nregisters callbacks to receive either a promise's eventual value or the reason\nwhy the promise cannot be fulfilled.\n\n### Callbacks\n\nCallbacks are registered with the `then` method by providing an optional \n`$onFulfilled` followed by an optional `$onRejected` function.\n\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise->then(\n    // $onFulfilled\n    function ($value) {\n        echo 'The promise was fulfilled.';\n    },\n    // $onRejected\n    function ($reason) {\n        echo 'The promise was rejected.';\n    }\n);\n```\n\n*Resolving* a promise means that you either fulfill a promise with a *value* or\nreject a promise with a *reason*. Resolving a promise triggers callbacks\nregistered with the promise's `then` method. These callbacks are triggered\nonly once and in the order in which they were added.\n\n### Resolving a Promise\n\nPromises are fulfilled using the `resolve($value)` method. Resolving a promise\nwith any value other than a `GuzzleHttp\\Promise\\RejectedPromise` will trigger\nall of the onFulfilled callbacks (resolving a promise with a rejected promise\nwill reject the promise and trigger the `$onRejected` callbacks).\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise\n    ->then(function ($value) {\n        // Return a value and don't break the chain\n        return \"Hello, \" . $value;\n    })\n    // This then is executed after the first then and receives the value\n    // returned from the first then.\n    ->then(function ($value) {\n        echo $value;\n    });\n\n// Resolving the promise triggers the $onFulfilled callbacks and outputs\n// \"Hello, reader.\"\n$promise->resolve('reader.');\n```\n\n### Promise Forwarding\n\nPromises can be chained one after the other. Each then in the chain is a new\npromise. The return value of a promise is what's forwarded to the next\npromise in the chain. Returning a promise in a `then` callback will cause the\nsubsequent promises in the chain to only be fulfilled when the returned promise\nhas been fulfilled. The next promise in the chain will be invoked with the\nresolved value of the promise.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$nextPromise = new Promise();\n\n$promise\n    ->then(function ($value) use ($nextPromise) {\n        echo $value;\n        return $nextPromise;\n    })\n    ->then(function ($value) {\n        echo $value;\n    });\n\n// Triggers the first callback and outputs \"A\"\n$promise->resolve('A');\n// Triggers the second callback and outputs \"B\"\n$nextPromise->resolve('B');\n```\n\n### Promise Rejection\n\nWhen a promise is rejected, the `$onRejected` callbacks are invoked with the\nrejection reason.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise->then(null, function ($reason) {\n    echo $reason;\n});\n\n$promise->reject('Error!');\n// Outputs \"Error!\"\n```\n\n### Rejection Forwarding\n\nIf an exception is thrown in an `$onRejected` callback, subsequent\n`$onRejected` callbacks are invoked with the thrown exception as the reason.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise->then(null, function ($reason) {\n    throw new Exception($reason);\n})->then(null, function ($reason) {\n    assert($reason->getMessage() === 'Error!');\n});\n\n$promise->reject('Error!');\n```\n\nYou can also forward a rejection down the promise chain by returning a\n`GuzzleHttp\\Promise\\RejectedPromise` in either an `$onFulfilled` or\n`$onRejected` callback.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\nuse GuzzleHttp\\Promise\\RejectedPromise;\n\n$promise = new Promise();\n$promise->then(null, function ($reason) {\n    return new RejectedPromise($reason);\n})->then(null, function ($reason) {\n    assert($reason === 'Error!');\n});\n\n$promise->reject('Error!');\n```\n\nIf an exception is not thrown in a `$onRejected` callback and the callback\ndoes not return a rejected promise, downstream `$onFulfilled` callbacks are\ninvoked using the value returned from the `$onRejected` callback.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise\n    ->then(null, function ($reason) {\n        return \"It's ok\";\n    })\n    ->then(function ($value) {\n        assert($value === \"It's ok\");\n    });\n\n$promise->reject('Error!');\n```\n\n\n## Synchronous Wait\n\nYou can synchronously force promises to complete using a promise's `wait`\nmethod. When creating a promise, you can provide a wait function that is used\nto synchronously force a promise to complete. When a wait function is invoked\nit is expected to deliver a value to the promise or reject the promise. If the\nwait function does not deliver a value, then an exception is thrown. The wait\nfunction provided to a promise constructor is invoked when the `wait` function\nof the promise is called.\n\n```php\n$promise = new Promise(function () use (&$promise) {\n    $promise->resolve('foo');\n});\n\n// Calling wait will return the value of the promise.\necho $promise->wait(); // outputs \"foo\"\n```\n\nIf an exception is encountered while invoking the wait function of a promise,\nthe promise is rejected with the exception and the exception is thrown.\n\n```php\n$promise = new Promise(function () use (&$promise) {\n    throw new Exception('foo');\n});\n\n$promise->wait(); // throws the exception.\n```\n\nCalling `wait` on a promise that has been fulfilled will not trigger the wait\nfunction. It will simply return the previously resolved value.\n\n```php\n$promise = new Promise(function () { die('this is not called!'); });\n$promise->resolve('foo');\necho $promise->wait(); // outputs \"foo\"\n```\n\nCalling `wait` on a promise that has been rejected will throw an exception. If\nthe rejection reason is an instance of `\\Exception` the reason is thrown.\nOtherwise, a `GuzzleHttp\\Promise\\RejectionException` is thrown and the reason\ncan be obtained by calling the `getReason` method of the exception.\n\n```php\n$promise = new Promise();\n$promise->reject('foo');\n$promise->wait();\n```\n\n> PHP Fatal error:  Uncaught exception 'GuzzleHttp\\Promise\\RejectionException' with message 'The promise was rejected with value: foo'\n\n### Unwrapping a Promise\n\nWhen synchronously waiting on a promise, you are joining the state of the\npromise into the current state of execution (i.e., return the value of the\npromise if it was fulfilled or throw an exception if it was rejected). This is\ncalled \"unwrapping\" the promise. Waiting on a promise will by default unwrap\nthe promise state.\n\nYou can force a promise to resolve and *not* unwrap the state of the promise\nby passing `false` to the first argument of the `wait` function:\n\n```php\n$promise = new Promise();\n$promise->reject('foo');\n// This will not throw an exception. It simply ensures the promise has\n// been resolved.\n$promise->wait(false);\n```\n\nWhen unwrapping a promise, the resolved value of the promise will be waited\nupon until the unwrapped value is not a promise. This means that if you resolve\npromise A with a promise B and unwrap promise A, the value returned by the\nwait function will be the value delivered to promise B.\n\n**Note**: when you do not unwrap the promise, no value is returned.\n\n\n## Cancellation\n\nYou can cancel a promise that has not yet been fulfilled using the `cancel()`\nmethod of a promise. When creating a promise you can provide an optional\ncancel function that when invoked cancels the action of computing a resolution\nof the promise.\n\n\n## API\n\n### Promise\n\nWhen creating a promise object, you can provide an optional `$waitFn` and\n`$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is\nexpected to resolve the promise. `$cancelFn` is a function with no arguments\nthat is expected to cancel the computation of a promise. It is invoked when the\n`cancel()` method of a promise is called.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise(\n    function () use (&$promise) {\n        $promise->resolve('waited');\n    },\n    function () {\n        // do something that will cancel the promise computation (e.g., close\n        // a socket, cancel a database query, etc...)\n    }\n);\n\nassert('waited' === $promise->wait());\n```\n\nA promise has the following methods:\n\n- `then(callable $onFulfilled, callable $onRejected) : PromiseInterface`\n  \n  Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler.\n\n- `otherwise(callable $onRejected) : PromiseInterface`\n  \n  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.\n\n- `wait($unwrap = true) : mixed`\n\n  Synchronously waits on the promise to complete.\n  \n  `$unwrap` controls whether or not the value of the promise is returned for a\n  fulfilled promise or if an exception is thrown if the promise is rejected.\n  This is set to `true` by default.\n\n- `cancel()`\n\n  Attempts to cancel the promise if possible. The promise being cancelled and\n  the parent most ancestor that has not yet been resolved will also be\n  cancelled. Any promises waiting on the cancelled promise to resolve will also\n  be cancelled.\n\n- `getState() : string`\n\n  Returns the state of the promise. One of `pending`, `fulfilled`, or\n  `rejected`.\n\n- `resolve($value)`\n\n  Fulfills the promise with the given `$value`.\n\n- `reject($reason)`\n\n  Rejects the promise with the given `$reason`.\n\n\n### FulfilledPromise\n\nA fulfilled promise can be created to represent a promise that has been\nfulfilled.\n\n```php\nuse GuzzleHttp\\Promise\\FulfilledPromise;\n\n$promise = new FulfilledPromise('value');\n\n// Fulfilled callbacks are immediately invoked.\n$promise->then(function ($value) {\n    echo $value;\n});\n```\n\n\n### RejectedPromise\n\nA rejected promise can be created to represent a promise that has been\nrejected.\n\n```php\nuse GuzzleHttp\\Promise\\RejectedPromise;\n\n$promise = new RejectedPromise('Error');\n\n// Rejected callbacks are immediately invoked.\n$promise->then(null, function ($reason) {\n    echo $reason;\n});\n```\n\n\n## Promise Interoperability\n\nThis library works with foreign promises that have a `then` method. This means\nyou can use Guzzle promises with [React promises](https://github.com/reactphp/promise)\nfor example. When a foreign promise is returned inside of a then method\ncallback, promise resolution will occur recursively.\n\n```php\n// Create a React promise\n$deferred = new React\\Promise\\Deferred();\n$reactPromise = $deferred->promise();\n\n// Create a Guzzle promise that is fulfilled with a React promise.\n$guzzlePromise = new GuzzleHttp\\Promise\\Promise();\n$guzzlePromise->then(function ($value) use ($reactPromise) {\n    // Do something something with the value...\n    // Return the React promise\n    return $reactPromise;\n});\n```\n\nPlease note that wait and cancel chaining is no longer possible when forwarding\na foreign promise. You will need to wrap a third-party promise with a Guzzle\npromise in order to utilize wait and cancel functions with foreign promises.\n\n\n### Event Loop Integration\n\nIn order to keep the stack size constant, Guzzle promises are resolved\nasynchronously using a task queue. When waiting on promises synchronously, the\ntask queue will be automatically run to ensure that the blocking promise and\nany forwarded promises are resolved. When using promises asynchronously in an\nevent loop, you will need to run the task queue on each tick of the loop. If\nyou do not run the task queue, then promises will not be resolved.\n\nYou can run the task queue using the `run()` method of the global task queue\ninstance.\n\n```php\n// Get the global task queue\n$queue = GuzzleHttp\\Promise\\Utils::queue();\n$queue->run();\n```\n\nFor example, you could use Guzzle promises with React using a periodic timer:\n\n```php\n$loop = React\\EventLoop\\Factory::create();\n$loop->addPeriodicTimer(0, [$queue, 'run']);\n```\n\n\n## Implementation Notes\n\n### Promise Resolution and Chaining is Handled Iteratively\n\nBy shuffling pending handlers from one owner to another, promises are\nresolved iteratively, allowing for \"infinite\" then chaining.\n\n```php\n<?php\nrequire 'vendor/autoload.php';\n\nuse GuzzleHttp\\Promise\\Promise;\n\n$parent = new Promise();\n$p = $parent;\n\nfor ($i = 0; $i < 1000; $i++) {\n    $p = $p->then(function ($v) {\n        // The stack size remains constant (a good thing)\n        echo xdebug_get_stack_depth() . ', ';\n        return $v + 1;\n    });\n}\n\n$parent->resolve(0);\nvar_dump($p->wait()); // int(1000)\n\n```\n\nWhen a promise is fulfilled or rejected with a non-promise value, the promise\nthen takes ownership of the handlers of each child promise and delivers values\ndown the chain without using recursion.\n\nWhen a promise is resolved with another promise, the original promise transfers\nall of its pending handlers to the new promise. When the new promise is\neventually resolved, all of the pending handlers are delivered the forwarded\nvalue.\n\n### A Promise is the Deferred\n\nSome promise libraries implement promises using a deferred object to represent\na computation and a promise object to represent the delivery of the result of\nthe computation. This is a nice separation of computation and delivery because\nconsumers of the promise cannot modify the value that will be eventually\ndelivered.\n\nOne side effect of being able to implement promise resolution and chaining\niteratively is that you need to be able for one promise to reach into the state\nof another promise to shuffle around ownership of handlers. In order to achieve\nthis without making the handlers of a promise publicly mutable, a promise is\nalso the deferred value, allowing promises of the same parent class to reach\ninto and modify the private properties of promises of the same type. While this\ndoes allow consumers of the value to modify the resolution or rejection of the\ndeferred, it is a small price to pay for keeping the stack size constant.\n\n```php\n$promise = new Promise();\n$promise->then(function ($value) { echo $value; });\n// The promise is the deferred value, so you can deliver a value to it.\n$promise->resolve('foo');\n// prints \"foo\"\n```\n\n\n## Upgrading from Function API\n\nA static API was first introduced in 1.4.0, in order to mitigate problems with\nfunctions conflicting between global and local copies of the package. The\nfunction API was removed in 2.0.0. A migration table has been provided here for\nyour convenience:\n\n| Original Function | Replacement Method |\n|----------------|----------------|\n| `queue` | `Utils::queue` |\n| `task` | `Utils::task` |\n| `promise_for` | `Create::promiseFor` |\n| `rejection_for` | `Create::rejectionFor` |\n| `exception_for` | `Create::exceptionFor` |\n| `iter_for` | `Create::iterFor` |\n| `inspect` | `Utils::inspect` |\n| `inspect_all` | `Utils::inspectAll` |\n| `unwrap` | `Utils::unwrap` |\n| `all` | `Utils::all` |\n| `some` | `Utils::some` |\n| `any` | `Utils::any` |\n| `settle` | `Utils::settle` |\n| `each` | `Each::of` |\n| `each_limit` | `Each::ofLimit` |\n| `each_limit_all` | `Each::ofLimitAll` |\n| `!is_fulfilled` | `Is::pending` |\n| `is_fulfilled` | `Is::fulfilled` |\n| `is_rejected` | `Is::rejected` |\n| `is_settled` | `Is::settled` |\n| `coroutine` | `Coroutine::of` |\n\n\n## Security\n\nIf you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/promises/security/policy) for more information.\n\n\n## License\n\nGuzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information.\n\n\n## For Enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-guzzlehttp-promises?utm_source=packagist-guzzlehttp-promises&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/composer.json",
    "content": "{\n    \"name\": \"guzzlehttp/promises\",\n    \"description\": \"Guzzle promises library\",\n    \"keywords\": [\"promise\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Graham Campbell\",\n            \"email\": \"hello@gjcampbell.co.uk\",\n            \"homepage\": \"https://github.com/GrahamCampbell\"\n        },\n        {\n            \"name\": \"Michael Dowling\",\n            \"email\": \"mtdowling@gmail.com\",\n            \"homepage\": \"https://github.com/mtdowling\"\n        },\n        {\n            \"name\": \"Tobias Nyholm\",\n            \"email\": \"tobias.nyholm@gmail.com\",\n            \"homepage\": \"https://github.com/Nyholm\"\n        },\n        {\n            \"name\": \"Tobias Schultze\",\n            \"email\": \"webmaster@tubo-world.de\",\n            \"homepage\": \"https://github.com/Tobion\"\n        }\n    ],\n    \"require\": {\n        \"php\": \"^7.2.5 || ^8.0\"\n    },\n    \"require-dev\": {\n        \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n        \"phpunit/phpunit\": \"^8.5.36 || ^9.6.15\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Promise\\\\\": \"src/\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Promise\\\\Tests\\\\\": \"tests/\"\n        }\n    },\n    \"extra\": {\n        \"bamarni-bin\": {\n            \"bin-links\": true,\n            \"forward-command\": false\n        }\n    },\n    \"config\": {\n        \"allow-plugins\": {\n            \"bamarni/composer-bin-plugin\": true\n        },\n        \"preferred-install\": \"dist\",\n        \"sort-packages\": true\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/AggregateException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Exception thrown when too many errors occur in the some() or any() methods.\n */\nclass AggregateException extends RejectionException\n{\n    public function __construct(string $msg, array $reasons)\n    {\n        parent::__construct(\n            $reasons,\n            sprintf('%s; %d rejected promises', $msg, count($reasons))\n        );\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/CancellationException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Exception that is set as the reason for a promise that has been cancelled.\n */\nclass CancellationException extends RejectionException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/Coroutine.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\nuse Generator;\nuse Throwable;\n\n/**\n * Creates a promise that is resolved using a generator that yields values or\n * promises (somewhat similar to C#'s async keyword).\n *\n * When called, the Coroutine::of method will start an instance of the generator\n * and returns a promise that is fulfilled with its final yielded value.\n *\n * Control is returned back to the generator when the yielded promise settles.\n * This can lead to less verbose code when doing lots of sequential async calls\n * with minimal processing in between.\n *\n *     use GuzzleHttp\\Promise;\n *\n *     function createPromise($value) {\n *         return new Promise\\FulfilledPromise($value);\n *     }\n *\n *     $promise = Promise\\Coroutine::of(function () {\n *         $value = (yield createPromise('a'));\n *         try {\n *             $value = (yield createPromise($value . 'b'));\n *         } catch (\\Throwable $e) {\n *             // The promise was rejected.\n *         }\n *         yield $value . 'c';\n *     });\n *\n *     // Outputs \"abc\"\n *     $promise->then(function ($v) { echo $v; });\n *\n * @param callable $generatorFn Generator function to wrap into a promise.\n *\n * @return Promise\n *\n * @see https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration\n */\nfinal class Coroutine implements PromiseInterface\n{\n    /**\n     * @var PromiseInterface|null\n     */\n    private $currentPromise;\n\n    /**\n     * @var Generator\n     */\n    private $generator;\n\n    /**\n     * @var Promise\n     */\n    private $result;\n\n    public function __construct(callable $generatorFn)\n    {\n        $this->generator = $generatorFn();\n        $this->result = new Promise(function (): void {\n            while (isset($this->currentPromise)) {\n                $this->currentPromise->wait();\n            }\n        });\n        try {\n            $this->nextCoroutine($this->generator->current());\n        } catch (Throwable $throwable) {\n            $this->result->reject($throwable);\n        }\n    }\n\n    /**\n     * Create a new coroutine.\n     */\n    public static function of(callable $generatorFn): self\n    {\n        return new self($generatorFn);\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ): PromiseInterface {\n        return $this->result->then($onFulfilled, $onRejected);\n    }\n\n    public function otherwise(callable $onRejected): PromiseInterface\n    {\n        return $this->result->otherwise($onRejected);\n    }\n\n    public function wait(bool $unwrap = true)\n    {\n        return $this->result->wait($unwrap);\n    }\n\n    public function getState(): string\n    {\n        return $this->result->getState();\n    }\n\n    public function resolve($value): void\n    {\n        $this->result->resolve($value);\n    }\n\n    public function reject($reason): void\n    {\n        $this->result->reject($reason);\n    }\n\n    public function cancel(): void\n    {\n        $this->currentPromise->cancel();\n        $this->result->cancel();\n    }\n\n    private function nextCoroutine($yielded): void\n    {\n        $this->currentPromise = Create::promiseFor($yielded)\n            ->then([$this, '_handleSuccess'], [$this, '_handleFailure']);\n    }\n\n    /**\n     * @internal\n     */\n    public function _handleSuccess($value): void\n    {\n        unset($this->currentPromise);\n        try {\n            $next = $this->generator->send($value);\n            if ($this->generator->valid()) {\n                $this->nextCoroutine($next);\n            } else {\n                $this->result->resolve($value);\n            }\n        } catch (Throwable $throwable) {\n            $this->result->reject($throwable);\n        }\n    }\n\n    /**\n     * @internal\n     */\n    public function _handleFailure($reason): void\n    {\n        unset($this->currentPromise);\n        try {\n            $nextYield = $this->generator->throw(Create::exceptionFor($reason));\n            // The throw was caught, so keep iterating on the coroutine\n            $this->nextCoroutine($nextYield);\n        } catch (Throwable $throwable) {\n            $this->result->reject($throwable);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/Create.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\nfinal class Create\n{\n    /**\n     * Creates a promise for a value if the value is not a promise.\n     *\n     * @param mixed $value Promise or value.\n     */\n    public static function promiseFor($value): PromiseInterface\n    {\n        if ($value instanceof PromiseInterface) {\n            return $value;\n        }\n\n        // Return a Guzzle promise that shadows the given promise.\n        if (is_object($value) && method_exists($value, 'then')) {\n            $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null;\n            $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null;\n            $promise = new Promise($wfn, $cfn);\n            $value->then([$promise, 'resolve'], [$promise, 'reject']);\n\n            return $promise;\n        }\n\n        return new FulfilledPromise($value);\n    }\n\n    /**\n     * Creates a rejected promise for a reason if the reason is not a promise.\n     * If the provided reason is a promise, then it is returned as-is.\n     *\n     * @param mixed $reason Promise or reason.\n     */\n    public static function rejectionFor($reason): PromiseInterface\n    {\n        if ($reason instanceof PromiseInterface) {\n            return $reason;\n        }\n\n        return new RejectedPromise($reason);\n    }\n\n    /**\n     * Create an exception for a rejected promise value.\n     *\n     * @param mixed $reason\n     */\n    public static function exceptionFor($reason): \\Throwable\n    {\n        if ($reason instanceof \\Throwable) {\n            return $reason;\n        }\n\n        return new RejectionException($reason);\n    }\n\n    /**\n     * Returns an iterator for the given value.\n     *\n     * @param mixed $value\n     */\n    public static function iterFor($value): \\Iterator\n    {\n        if ($value instanceof \\Iterator) {\n            return $value;\n        }\n\n        if (is_array($value)) {\n            return new \\ArrayIterator($value);\n        }\n\n        return new \\ArrayIterator([$value]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/Each.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\nfinal class Each\n{\n    /**\n     * Given an iterator that yields promises or values, returns a promise that\n     * is fulfilled with a null value when the iterator has been consumed or\n     * the aggregate promise has been fulfilled or rejected.\n     *\n     * $onFulfilled is a function that accepts the fulfilled value, iterator\n     * index, and the aggregate promise. The callback can invoke any necessary\n     * side effects and choose to resolve or reject the aggregate if needed.\n     *\n     * $onRejected is a function that accepts the rejection reason, iterator\n     * index, and the aggregate promise. The callback can invoke any necessary\n     * side effects and choose to resolve or reject the aggregate if needed.\n     *\n     * @param mixed $iterable Iterator or array to iterate over.\n     */\n    public static function of(\n        $iterable,\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ): PromiseInterface {\n        return (new EachPromise($iterable, [\n            'fulfilled' => $onFulfilled,\n            'rejected' => $onRejected,\n        ]))->promise();\n    }\n\n    /**\n     * Like of, but only allows a certain number of outstanding promises at any\n     * given time.\n     *\n     * $concurrency may be an integer or a function that accepts the number of\n     * pending promises and returns a numeric concurrency limit value to allow\n     * for dynamic a concurrency size.\n     *\n     * @param mixed        $iterable\n     * @param int|callable $concurrency\n     */\n    public static function ofLimit(\n        $iterable,\n        $concurrency,\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ): PromiseInterface {\n        return (new EachPromise($iterable, [\n            'fulfilled' => $onFulfilled,\n            'rejected' => $onRejected,\n            'concurrency' => $concurrency,\n        ]))->promise();\n    }\n\n    /**\n     * Like limit, but ensures that no promise in the given $iterable argument\n     * is rejected. If any promise is rejected, then the aggregate promise is\n     * rejected with the encountered rejection.\n     *\n     * @param mixed        $iterable\n     * @param int|callable $concurrency\n     */\n    public static function ofLimitAll(\n        $iterable,\n        $concurrency,\n        callable $onFulfilled = null\n    ): PromiseInterface {\n        return self::ofLimit(\n            $iterable,\n            $concurrency,\n            $onFulfilled,\n            function ($reason, $idx, PromiseInterface $aggregate): void {\n                $aggregate->reject($reason);\n            }\n        );\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/EachPromise.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Represents a promise that iterates over many promises and invokes\n * side-effect functions in the process.\n *\n * @final\n */\nclass EachPromise implements PromisorInterface\n{\n    private $pending = [];\n\n    private $nextPendingIndex = 0;\n\n    /** @var \\Iterator|null */\n    private $iterable;\n\n    /** @var callable|int|null */\n    private $concurrency;\n\n    /** @var callable|null */\n    private $onFulfilled;\n\n    /** @var callable|null */\n    private $onRejected;\n\n    /** @var Promise|null */\n    private $aggregate;\n\n    /** @var bool|null */\n    private $mutex;\n\n    /**\n     * Configuration hash can include the following key value pairs:\n     *\n     * - fulfilled: (callable) Invoked when a promise fulfills. The function\n     *   is invoked with three arguments: the fulfillment value, the index\n     *   position from the iterable list of the promise, and the aggregate\n     *   promise that manages all of the promises. The aggregate promise may\n     *   be resolved from within the callback to short-circuit the promise.\n     * - rejected: (callable) Invoked when a promise is rejected. The\n     *   function is invoked with three arguments: the rejection reason, the\n     *   index position from the iterable list of the promise, and the\n     *   aggregate promise that manages all of the promises. The aggregate\n     *   promise may be resolved from within the callback to short-circuit\n     *   the promise.\n     * - concurrency: (integer) Pass this configuration option to limit the\n     *   allowed number of outstanding concurrently executing promises,\n     *   creating a capped pool of promises. There is no limit by default.\n     *\n     * @param mixed $iterable Promises or values to iterate.\n     * @param array $config   Configuration options\n     */\n    public function __construct($iterable, array $config = [])\n    {\n        $this->iterable = Create::iterFor($iterable);\n\n        if (isset($config['concurrency'])) {\n            $this->concurrency = $config['concurrency'];\n        }\n\n        if (isset($config['fulfilled'])) {\n            $this->onFulfilled = $config['fulfilled'];\n        }\n\n        if (isset($config['rejected'])) {\n            $this->onRejected = $config['rejected'];\n        }\n    }\n\n    /** @psalm-suppress InvalidNullableReturnType */\n    public function promise(): PromiseInterface\n    {\n        if ($this->aggregate) {\n            return $this->aggregate;\n        }\n\n        try {\n            $this->createPromise();\n            /** @psalm-assert Promise $this->aggregate */\n            $this->iterable->rewind();\n            $this->refillPending();\n        } catch (\\Throwable $e) {\n            $this->aggregate->reject($e);\n        }\n\n        /**\n         * @psalm-suppress NullableReturnStatement\n         */\n        return $this->aggregate;\n    }\n\n    private function createPromise(): void\n    {\n        $this->mutex = false;\n        $this->aggregate = new Promise(function (): void {\n            if ($this->checkIfFinished()) {\n                return;\n            }\n            reset($this->pending);\n            // Consume a potentially fluctuating list of promises while\n            // ensuring that indexes are maintained (precluding array_shift).\n            while ($promise = current($this->pending)) {\n                next($this->pending);\n                $promise->wait();\n                if (Is::settled($this->aggregate)) {\n                    return;\n                }\n            }\n        });\n\n        // Clear the references when the promise is resolved.\n        $clearFn = function (): void {\n            $this->iterable = $this->concurrency = $this->pending = null;\n            $this->onFulfilled = $this->onRejected = null;\n            $this->nextPendingIndex = 0;\n        };\n\n        $this->aggregate->then($clearFn, $clearFn);\n    }\n\n    private function refillPending(): void\n    {\n        if (!$this->concurrency) {\n            // Add all pending promises.\n            while ($this->addPending() && $this->advanceIterator()) {\n            }\n\n            return;\n        }\n\n        // Add only up to N pending promises.\n        $concurrency = is_callable($this->concurrency)\n            ? ($this->concurrency)(count($this->pending))\n            : $this->concurrency;\n        $concurrency = max($concurrency - count($this->pending), 0);\n        // Concurrency may be set to 0 to disallow new promises.\n        if (!$concurrency) {\n            return;\n        }\n        // Add the first pending promise.\n        $this->addPending();\n        // Note this is special handling for concurrency=1 so that we do\n        // not advance the iterator after adding the first promise. This\n        // helps work around issues with generators that might not have the\n        // next value to yield until promise callbacks are called.\n        while (--$concurrency\n            && $this->advanceIterator()\n            && $this->addPending()) {\n        }\n    }\n\n    private function addPending(): bool\n    {\n        if (!$this->iterable || !$this->iterable->valid()) {\n            return false;\n        }\n\n        $promise = Create::promiseFor($this->iterable->current());\n        $key = $this->iterable->key();\n\n        // Iterable keys may not be unique, so we use a counter to\n        // guarantee uniqueness\n        $idx = $this->nextPendingIndex++;\n\n        $this->pending[$idx] = $promise->then(\n            function ($value) use ($idx, $key): void {\n                if ($this->onFulfilled) {\n                    ($this->onFulfilled)(\n                        $value,\n                        $key,\n                        $this->aggregate\n                    );\n                }\n                $this->step($idx);\n            },\n            function ($reason) use ($idx, $key): void {\n                if ($this->onRejected) {\n                    ($this->onRejected)(\n                        $reason,\n                        $key,\n                        $this->aggregate\n                    );\n                }\n                $this->step($idx);\n            }\n        );\n\n        return true;\n    }\n\n    private function advanceIterator(): bool\n    {\n        // Place a lock on the iterator so that we ensure to not recurse,\n        // preventing fatal generator errors.\n        if ($this->mutex) {\n            return false;\n        }\n\n        $this->mutex = true;\n\n        try {\n            $this->iterable->next();\n            $this->mutex = false;\n\n            return true;\n        } catch (\\Throwable $e) {\n            $this->aggregate->reject($e);\n            $this->mutex = false;\n\n            return false;\n        }\n    }\n\n    private function step(int $idx): void\n    {\n        // If the promise was already resolved, then ignore this step.\n        if (Is::settled($this->aggregate)) {\n            return;\n        }\n\n        unset($this->pending[$idx]);\n\n        // Only refill pending promises if we are not locked, preventing the\n        // EachPromise to recursively invoke the provided iterator, which\n        // cause a fatal error: \"Cannot resume an already running generator\"\n        if ($this->advanceIterator() && !$this->checkIfFinished()) {\n            // Add more pending promises if possible.\n            $this->refillPending();\n        }\n    }\n\n    private function checkIfFinished(): bool\n    {\n        if (!$this->pending && !$this->iterable->valid()) {\n            // Resolve the promise if there's nothing left to do.\n            $this->aggregate->resolve(null);\n\n            return true;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/FulfilledPromise.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise that has been fulfilled.\n *\n * Thenning off of this promise will invoke the onFulfilled callback\n * immediately and ignore other callbacks.\n *\n * @final\n */\nclass FulfilledPromise implements PromiseInterface\n{\n    private $value;\n\n    /**\n     * @param mixed $value\n     */\n    public function __construct($value)\n    {\n        if (is_object($value) && method_exists($value, 'then')) {\n            throw new \\InvalidArgumentException(\n                'You cannot create a FulfilledPromise with a promise.'\n            );\n        }\n\n        $this->value = $value;\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ): PromiseInterface {\n        // Return itself if there is no onFulfilled function.\n        if (!$onFulfilled) {\n            return $this;\n        }\n\n        $queue = Utils::queue();\n        $p = new Promise([$queue, 'run']);\n        $value = $this->value;\n        $queue->add(static function () use ($p, $value, $onFulfilled): void {\n            if (Is::pending($p)) {\n                try {\n                    $p->resolve($onFulfilled($value));\n                } catch (\\Throwable $e) {\n                    $p->reject($e);\n                }\n            }\n        });\n\n        return $p;\n    }\n\n    public function otherwise(callable $onRejected): PromiseInterface\n    {\n        return $this->then(null, $onRejected);\n    }\n\n    public function wait(bool $unwrap = true)\n    {\n        return $unwrap ? $this->value : null;\n    }\n\n    public function getState(): string\n    {\n        return self::FULFILLED;\n    }\n\n    public function resolve($value): void\n    {\n        if ($value !== $this->value) {\n            throw new \\LogicException('Cannot resolve a fulfilled promise');\n        }\n    }\n\n    public function reject($reason): void\n    {\n        throw new \\LogicException('Cannot reject a fulfilled promise');\n    }\n\n    public function cancel(): void\n    {\n        // pass\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/Is.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\nfinal class Is\n{\n    /**\n     * Returns true if a promise is pending.\n     */\n    public static function pending(PromiseInterface $promise): bool\n    {\n        return $promise->getState() === PromiseInterface::PENDING;\n    }\n\n    /**\n     * Returns true if a promise is fulfilled or rejected.\n     */\n    public static function settled(PromiseInterface $promise): bool\n    {\n        return $promise->getState() !== PromiseInterface::PENDING;\n    }\n\n    /**\n     * Returns true if a promise is fulfilled.\n     */\n    public static function fulfilled(PromiseInterface $promise): bool\n    {\n        return $promise->getState() === PromiseInterface::FULFILLED;\n    }\n\n    /**\n     * Returns true if a promise is rejected.\n     */\n    public static function rejected(PromiseInterface $promise): bool\n    {\n        return $promise->getState() === PromiseInterface::REJECTED;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/Promise.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Promises/A+ implementation that avoids recursion when possible.\n *\n * @see https://promisesaplus.com/\n *\n * @final\n */\nclass Promise implements PromiseInterface\n{\n    private $state = self::PENDING;\n    private $result;\n    private $cancelFn;\n    private $waitFn;\n    private $waitList;\n    private $handlers = [];\n\n    /**\n     * @param callable $waitFn   Fn that when invoked resolves the promise.\n     * @param callable $cancelFn Fn that when invoked cancels the promise.\n     */\n    public function __construct(\n        callable $waitFn = null,\n        callable $cancelFn = null\n    ) {\n        $this->waitFn = $waitFn;\n        $this->cancelFn = $cancelFn;\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ): PromiseInterface {\n        if ($this->state === self::PENDING) {\n            $p = new Promise(null, [$this, 'cancel']);\n            $this->handlers[] = [$p, $onFulfilled, $onRejected];\n            $p->waitList = $this->waitList;\n            $p->waitList[] = $this;\n\n            return $p;\n        }\n\n        // Return a fulfilled promise and immediately invoke any callbacks.\n        if ($this->state === self::FULFILLED) {\n            $promise = Create::promiseFor($this->result);\n\n            return $onFulfilled ? $promise->then($onFulfilled) : $promise;\n        }\n\n        // It's either cancelled or rejected, so return a rejected promise\n        // and immediately invoke any callbacks.\n        $rejection = Create::rejectionFor($this->result);\n\n        return $onRejected ? $rejection->then(null, $onRejected) : $rejection;\n    }\n\n    public function otherwise(callable $onRejected): PromiseInterface\n    {\n        return $this->then(null, $onRejected);\n    }\n\n    public function wait(bool $unwrap = true)\n    {\n        $this->waitIfPending();\n\n        if ($this->result instanceof PromiseInterface) {\n            return $this->result->wait($unwrap);\n        }\n        if ($unwrap) {\n            if ($this->state === self::FULFILLED) {\n                return $this->result;\n            }\n            // It's rejected so \"unwrap\" and throw an exception.\n            throw Create::exceptionFor($this->result);\n        }\n    }\n\n    public function getState(): string\n    {\n        return $this->state;\n    }\n\n    public function cancel(): void\n    {\n        if ($this->state !== self::PENDING) {\n            return;\n        }\n\n        $this->waitFn = $this->waitList = null;\n\n        if ($this->cancelFn) {\n            $fn = $this->cancelFn;\n            $this->cancelFn = null;\n            try {\n                $fn();\n            } catch (\\Throwable $e) {\n                $this->reject($e);\n            }\n        }\n\n        // Reject the promise only if it wasn't rejected in a then callback.\n        /** @psalm-suppress RedundantCondition */\n        if ($this->state === self::PENDING) {\n            $this->reject(new CancellationException('Promise has been cancelled'));\n        }\n    }\n\n    public function resolve($value): void\n    {\n        $this->settle(self::FULFILLED, $value);\n    }\n\n    public function reject($reason): void\n    {\n        $this->settle(self::REJECTED, $reason);\n    }\n\n    private function settle(string $state, $value): void\n    {\n        if ($this->state !== self::PENDING) {\n            // Ignore calls with the same resolution.\n            if ($state === $this->state && $value === $this->result) {\n                return;\n            }\n            throw $this->state === $state\n                ? new \\LogicException(\"The promise is already {$state}.\")\n                : new \\LogicException(\"Cannot change a {$this->state} promise to {$state}\");\n        }\n\n        if ($value === $this) {\n            throw new \\LogicException('Cannot fulfill or reject a promise with itself');\n        }\n\n        // Clear out the state of the promise but stash the handlers.\n        $this->state = $state;\n        $this->result = $value;\n        $handlers = $this->handlers;\n        $this->handlers = null;\n        $this->waitList = $this->waitFn = null;\n        $this->cancelFn = null;\n\n        if (!$handlers) {\n            return;\n        }\n\n        // If the value was not a settled promise or a thenable, then resolve\n        // it in the task queue using the correct ID.\n        if (!is_object($value) || !method_exists($value, 'then')) {\n            $id = $state === self::FULFILLED ? 1 : 2;\n            // It's a success, so resolve the handlers in the queue.\n            Utils::queue()->add(static function () use ($id, $value, $handlers): void {\n                foreach ($handlers as $handler) {\n                    self::callHandler($id, $value, $handler);\n                }\n            });\n        } elseif ($value instanceof Promise && Is::pending($value)) {\n            // We can just merge our handlers onto the next promise.\n            $value->handlers = array_merge($value->handlers, $handlers);\n        } else {\n            // Resolve the handlers when the forwarded promise is resolved.\n            $value->then(\n                static function ($value) use ($handlers): void {\n                    foreach ($handlers as $handler) {\n                        self::callHandler(1, $value, $handler);\n                    }\n                },\n                static function ($reason) use ($handlers): void {\n                    foreach ($handlers as $handler) {\n                        self::callHandler(2, $reason, $handler);\n                    }\n                }\n            );\n        }\n    }\n\n    /**\n     * Call a stack of handlers using a specific callback index and value.\n     *\n     * @param int   $index   1 (resolve) or 2 (reject).\n     * @param mixed $value   Value to pass to the callback.\n     * @param array $handler Array of handler data (promise and callbacks).\n     */\n    private static function callHandler(int $index, $value, array $handler): void\n    {\n        /** @var PromiseInterface $promise */\n        $promise = $handler[0];\n\n        // The promise may have been cancelled or resolved before placing\n        // this thunk in the queue.\n        if (Is::settled($promise)) {\n            return;\n        }\n\n        try {\n            if (isset($handler[$index])) {\n                /*\n                 * If $f throws an exception, then $handler will be in the exception\n                 * stack trace. Since $handler contains a reference to the callable\n                 * itself we get a circular reference. We clear the $handler\n                 * here to avoid that memory leak.\n                 */\n                $f = $handler[$index];\n                unset($handler);\n                $promise->resolve($f($value));\n            } elseif ($index === 1) {\n                // Forward resolution values as-is.\n                $promise->resolve($value);\n            } else {\n                // Forward rejections down the chain.\n                $promise->reject($value);\n            }\n        } catch (\\Throwable $reason) {\n            $promise->reject($reason);\n        }\n    }\n\n    private function waitIfPending(): void\n    {\n        if ($this->state !== self::PENDING) {\n            return;\n        } elseif ($this->waitFn) {\n            $this->invokeWaitFn();\n        } elseif ($this->waitList) {\n            $this->invokeWaitList();\n        } else {\n            // If there's no wait function, then reject the promise.\n            $this->reject('Cannot wait on a promise that has '\n                .'no internal wait function. You must provide a wait '\n                .'function when constructing the promise to be able to '\n                .'wait on a promise.');\n        }\n\n        Utils::queue()->run();\n\n        /** @psalm-suppress RedundantCondition */\n        if ($this->state === self::PENDING) {\n            $this->reject('Invoking the wait callback did not resolve the promise');\n        }\n    }\n\n    private function invokeWaitFn(): void\n    {\n        try {\n            $wfn = $this->waitFn;\n            $this->waitFn = null;\n            $wfn(true);\n        } catch (\\Throwable $reason) {\n            if ($this->state === self::PENDING) {\n                // The promise has not been resolved yet, so reject the promise\n                // with the exception.\n                $this->reject($reason);\n            } else {\n                // The promise was already resolved, so there's a problem in\n                // the application.\n                throw $reason;\n            }\n        }\n    }\n\n    private function invokeWaitList(): void\n    {\n        $waitList = $this->waitList;\n        $this->waitList = null;\n\n        foreach ($waitList as $result) {\n            do {\n                $result->waitIfPending();\n                $result = $result->result;\n            } while ($result instanceof Promise);\n\n            if ($result instanceof PromiseInterface) {\n                $result->wait(false);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/PromiseInterface.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise represents the eventual result of an asynchronous operation.\n *\n * The primary way of interacting with a promise is through its then method,\n * which registers callbacks to receive either a promise’s eventual value or\n * the reason why the promise cannot be fulfilled.\n *\n * @see https://promisesaplus.com/\n */\ninterface PromiseInterface\n{\n    public const PENDING = 'pending';\n    public const FULFILLED = 'fulfilled';\n    public const REJECTED = 'rejected';\n\n    /**\n     * Appends fulfillment and rejection handlers to the promise, and returns\n     * a new promise resolving to the return value of the called handler.\n     *\n     * @param callable $onFulfilled Invoked when the promise fulfills.\n     * @param callable $onRejected  Invoked when the promise is rejected.\n     */\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ): PromiseInterface;\n\n    /**\n     * Appends a rejection handler callback to the promise, and returns a new\n     * promise resolving to the return value of the callback if it is called,\n     * or to its original fulfillment value if the promise is instead\n     * fulfilled.\n     *\n     * @param callable $onRejected Invoked when the promise is rejected.\n     */\n    public function otherwise(callable $onRejected): PromiseInterface;\n\n    /**\n     * Get the state of the promise (\"pending\", \"rejected\", or \"fulfilled\").\n     *\n     * The three states can be checked against the constants defined on\n     * PromiseInterface: PENDING, FULFILLED, and REJECTED.\n     */\n    public function getState(): string;\n\n    /**\n     * Resolve the promise with the given value.\n     *\n     * @param mixed $value\n     *\n     * @throws \\RuntimeException if the promise is already resolved.\n     */\n    public function resolve($value): void;\n\n    /**\n     * Reject the promise with the given reason.\n     *\n     * @param mixed $reason\n     *\n     * @throws \\RuntimeException if the promise is already resolved.\n     */\n    public function reject($reason): void;\n\n    /**\n     * Cancels the promise if possible.\n     *\n     * @see https://github.com/promises-aplus/cancellation-spec/issues/7\n     */\n    public function cancel(): void;\n\n    /**\n     * Waits until the promise completes if possible.\n     *\n     * Pass $unwrap as true to unwrap the result of the promise, either\n     * returning the resolved value or throwing the rejected exception.\n     *\n     * If the promise cannot be waited on, then the promise will be rejected.\n     *\n     * @return mixed\n     *\n     * @throws \\LogicException if the promise has no wait function or if the\n     *                         promise does not settle after waiting.\n     */\n    public function wait(bool $unwrap = true);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/PromisorInterface.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Interface used with classes that return a promise.\n */\ninterface PromisorInterface\n{\n    /**\n     * Returns a promise.\n     */\n    public function promise(): PromiseInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/RejectedPromise.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise that has been rejected.\n *\n * Thenning off of this promise will invoke the onRejected callback\n * immediately and ignore other callbacks.\n *\n * @final\n */\nclass RejectedPromise implements PromiseInterface\n{\n    private $reason;\n\n    /**\n     * @param mixed $reason\n     */\n    public function __construct($reason)\n    {\n        if (is_object($reason) && method_exists($reason, 'then')) {\n            throw new \\InvalidArgumentException(\n                'You cannot create a RejectedPromise with a promise.'\n            );\n        }\n\n        $this->reason = $reason;\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ): PromiseInterface {\n        // If there's no onRejected callback then just return self.\n        if (!$onRejected) {\n            return $this;\n        }\n\n        $queue = Utils::queue();\n        $reason = $this->reason;\n        $p = new Promise([$queue, 'run']);\n        $queue->add(static function () use ($p, $reason, $onRejected): void {\n            if (Is::pending($p)) {\n                try {\n                    // Return a resolved promise if onRejected does not throw.\n                    $p->resolve($onRejected($reason));\n                } catch (\\Throwable $e) {\n                    // onRejected threw, so return a rejected promise.\n                    $p->reject($e);\n                }\n            }\n        });\n\n        return $p;\n    }\n\n    public function otherwise(callable $onRejected): PromiseInterface\n    {\n        return $this->then(null, $onRejected);\n    }\n\n    public function wait(bool $unwrap = true)\n    {\n        if ($unwrap) {\n            throw Create::exceptionFor($this->reason);\n        }\n\n        return null;\n    }\n\n    public function getState(): string\n    {\n        return self::REJECTED;\n    }\n\n    public function resolve($value): void\n    {\n        throw new \\LogicException('Cannot resolve a rejected promise');\n    }\n\n    public function reject($reason): void\n    {\n        if ($reason !== $this->reason) {\n            throw new \\LogicException('Cannot reject a rejected promise');\n        }\n    }\n\n    public function cancel(): void\n    {\n        // pass\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/RejectionException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A special exception that is thrown when waiting on a rejected promise.\n *\n * The reason value is available via the getReason() method.\n */\nclass RejectionException extends \\RuntimeException\n{\n    /** @var mixed Rejection reason. */\n    private $reason;\n\n    /**\n     * @param mixed       $reason      Rejection reason.\n     * @param string|null $description Optional description.\n     */\n    public function __construct($reason, string $description = null)\n    {\n        $this->reason = $reason;\n\n        $message = 'The promise was rejected';\n\n        if ($description) {\n            $message .= ' with reason: '.$description;\n        } elseif (is_string($reason)\n            || (is_object($reason) && method_exists($reason, '__toString'))\n        ) {\n            $message .= ' with reason: '.$this->reason;\n        } elseif ($reason instanceof \\JsonSerializable) {\n            $message .= ' with reason: '.json_encode($this->reason, JSON_PRETTY_PRINT);\n        }\n\n        parent::__construct($message);\n    }\n\n    /**\n     * Returns the rejection reason.\n     *\n     * @return mixed\n     */\n    public function getReason()\n    {\n        return $this->reason;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/TaskQueue.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A task queue that executes tasks in a FIFO order.\n *\n * This task queue class is used to settle promises asynchronously and\n * maintains a constant stack size. You can use the task queue asynchronously\n * by calling the `run()` function of the global task queue in an event loop.\n *\n *     GuzzleHttp\\Promise\\Utils::queue()->run();\n *\n * @final\n */\nclass TaskQueue implements TaskQueueInterface\n{\n    private $enableShutdown = true;\n    private $queue = [];\n\n    public function __construct(bool $withShutdown = true)\n    {\n        if ($withShutdown) {\n            register_shutdown_function(function (): void {\n                if ($this->enableShutdown) {\n                    // Only run the tasks if an E_ERROR didn't occur.\n                    $err = error_get_last();\n                    if (!$err || ($err['type'] ^ E_ERROR)) {\n                        $this->run();\n                    }\n                }\n            });\n        }\n    }\n\n    public function isEmpty(): bool\n    {\n        return !$this->queue;\n    }\n\n    public function add(callable $task): void\n    {\n        $this->queue[] = $task;\n    }\n\n    public function run(): void\n    {\n        while ($task = array_shift($this->queue)) {\n            /** @var callable $task */\n            $task();\n        }\n    }\n\n    /**\n     * The task queue will be run and exhausted by default when the process\n     * exits IFF the exit is not the result of a PHP E_ERROR error.\n     *\n     * You can disable running the automatic shutdown of the queue by calling\n     * this function. If you disable the task queue shutdown process, then you\n     * MUST either run the task queue (as a result of running your event loop\n     * or manually using the run() method) or wait on each outstanding promise.\n     *\n     * Note: This shutdown will occur before any destructors are triggered.\n     */\n    public function disableShutdown(): void\n    {\n        $this->enableShutdown = false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/TaskQueueInterface.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\ninterface TaskQueueInterface\n{\n    /**\n     * Returns true if the queue is empty.\n     */\n    public function isEmpty(): bool;\n\n    /**\n     * Adds a task to the queue that will be executed the next time run is\n     * called.\n     */\n    public function add(callable $task): void;\n\n    /**\n     * Execute all of the pending task in the queue.\n     */\n    public function run(): void;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/promises/src/Utils.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Promise;\n\nfinal class Utils\n{\n    /**\n     * Get the global task queue used for promise resolution.\n     *\n     * This task queue MUST be run in an event loop in order for promises to be\n     * settled asynchronously. It will be automatically run when synchronously\n     * waiting on a promise.\n     *\n     * <code>\n     * while ($eventLoop->isRunning()) {\n     *     GuzzleHttp\\Promise\\Utils::queue()->run();\n     * }\n     * </code>\n     *\n     * @param TaskQueueInterface|null $assign Optionally specify a new queue instance.\n     */\n    public static function queue(TaskQueueInterface $assign = null): TaskQueueInterface\n    {\n        static $queue;\n\n        if ($assign) {\n            $queue = $assign;\n        } elseif (!$queue) {\n            $queue = new TaskQueue();\n        }\n\n        return $queue;\n    }\n\n    /**\n     * Adds a function to run in the task queue when it is next `run()` and\n     * returns a promise that is fulfilled or rejected with the result.\n     *\n     * @param callable $task Task function to run.\n     */\n    public static function task(callable $task): PromiseInterface\n    {\n        $queue = self::queue();\n        $promise = new Promise([$queue, 'run']);\n        $queue->add(function () use ($task, $promise): void {\n            try {\n                if (Is::pending($promise)) {\n                    $promise->resolve($task());\n                }\n            } catch (\\Throwable $e) {\n                $promise->reject($e);\n            }\n        });\n\n        return $promise;\n    }\n\n    /**\n     * Synchronously waits on a promise to resolve and returns an inspection\n     * state array.\n     *\n     * Returns a state associative array containing a \"state\" key mapping to a\n     * valid promise state. If the state of the promise is \"fulfilled\", the\n     * array will contain a \"value\" key mapping to the fulfilled value of the\n     * promise. If the promise is rejected, the array will contain a \"reason\"\n     * key mapping to the rejection reason of the promise.\n     *\n     * @param PromiseInterface $promise Promise or value.\n     */\n    public static function inspect(PromiseInterface $promise): array\n    {\n        try {\n            return [\n                'state' => PromiseInterface::FULFILLED,\n                'value' => $promise->wait(),\n            ];\n        } catch (RejectionException $e) {\n            return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()];\n        } catch (\\Throwable $e) {\n            return ['state' => PromiseInterface::REJECTED, 'reason' => $e];\n        }\n    }\n\n    /**\n     * Waits on all of the provided promises, but does not unwrap rejected\n     * promises as thrown exception.\n     *\n     * Returns an array of inspection state arrays.\n     *\n     * @see inspect for the inspection state array format.\n     *\n     * @param PromiseInterface[] $promises Traversable of promises to wait upon.\n     */\n    public static function inspectAll($promises): array\n    {\n        $results = [];\n        foreach ($promises as $key => $promise) {\n            $results[$key] = self::inspect($promise);\n        }\n\n        return $results;\n    }\n\n    /**\n     * Waits on all of the provided promises and returns the fulfilled values.\n     *\n     * Returns an array that contains the value of each promise (in the same\n     * order the promises were provided). An exception is thrown if any of the\n     * promises are rejected.\n     *\n     * @param iterable<PromiseInterface> $promises Iterable of PromiseInterface objects to wait on.\n     *\n     * @throws \\Throwable on error\n     */\n    public static function unwrap($promises): array\n    {\n        $results = [];\n        foreach ($promises as $key => $promise) {\n            $results[$key] = $promise->wait();\n        }\n\n        return $results;\n    }\n\n    /**\n     * Given an array of promises, return a promise that is fulfilled when all\n     * the items in the array are fulfilled.\n     *\n     * The promise's fulfillment value is an array with fulfillment values at\n     * respective positions to the original array. If any promise in the array\n     * rejects, the returned promise is rejected with the rejection reason.\n     *\n     * @param mixed $promises  Promises or values.\n     * @param bool  $recursive If true, resolves new promises that might have been added to the stack during its own resolution.\n     */\n    public static function all($promises, bool $recursive = false): PromiseInterface\n    {\n        $results = [];\n        $promise = Each::of(\n            $promises,\n            function ($value, $idx) use (&$results): void {\n                $results[$idx] = $value;\n            },\n            function ($reason, $idx, Promise $aggregate): void {\n                $aggregate->reject($reason);\n            }\n        )->then(function () use (&$results) {\n            ksort($results);\n\n            return $results;\n        });\n\n        if (true === $recursive) {\n            $promise = $promise->then(function ($results) use ($recursive, &$promises) {\n                foreach ($promises as $promise) {\n                    if (Is::pending($promise)) {\n                        return self::all($promises, $recursive);\n                    }\n                }\n\n                return $results;\n            });\n        }\n\n        return $promise;\n    }\n\n    /**\n     * Initiate a competitive race between multiple promises or values (values\n     * will become immediately fulfilled promises).\n     *\n     * When count amount of promises have been fulfilled, the returned promise\n     * is fulfilled with an array that contains the fulfillment values of the\n     * winners in order of resolution.\n     *\n     * This promise is rejected with a {@see AggregateException} if the number\n     * of fulfilled promises is less than the desired $count.\n     *\n     * @param int   $count    Total number of promises.\n     * @param mixed $promises Promises or values.\n     */\n    public static function some(int $count, $promises): PromiseInterface\n    {\n        $results = [];\n        $rejections = [];\n\n        return Each::of(\n            $promises,\n            function ($value, $idx, PromiseInterface $p) use (&$results, $count): void {\n                if (Is::settled($p)) {\n                    return;\n                }\n                $results[$idx] = $value;\n                if (count($results) >= $count) {\n                    $p->resolve(null);\n                }\n            },\n            function ($reason) use (&$rejections): void {\n                $rejections[] = $reason;\n            }\n        )->then(\n            function () use (&$results, &$rejections, $count) {\n                if (count($results) !== $count) {\n                    throw new AggregateException(\n                        'Not enough promises to fulfill count',\n                        $rejections\n                    );\n                }\n                ksort($results);\n\n                return array_values($results);\n            }\n        );\n    }\n\n    /**\n     * Like some(), with 1 as count. However, if the promise fulfills, the\n     * fulfillment value is not an array of 1 but the value directly.\n     *\n     * @param mixed $promises Promises or values.\n     */\n    public static function any($promises): PromiseInterface\n    {\n        return self::some(1, $promises)->then(function ($values) {\n            return $values[0];\n        });\n    }\n\n    /**\n     * Returns a promise that is fulfilled when all of the provided promises have\n     * been fulfilled or rejected.\n     *\n     * The returned promise is fulfilled with an array of inspection state arrays.\n     *\n     * @see inspect for the inspection state array format.\n     *\n     * @param mixed $promises Promises or values.\n     */\n    public static function settle($promises): PromiseInterface\n    {\n        $results = [];\n\n        return Each::of(\n            $promises,\n            function ($value, $idx) use (&$results): void {\n                $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value];\n            },\n            function ($reason, $idx) use (&$results): void {\n                $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason];\n            }\n        )->then(function () use (&$results) {\n            ksort($results);\n\n            return $results;\n        });\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## 2.6.2 - 2023-12-03\n\n### Fixed\n\n- Fixed another issue with the fact that PHP transforms numeric strings in array keys to ints\n\n### Changed\n\n- Updated links in docs to their canonical versions\n- Replaced `call_user_func*` with native calls\n\n## 2.6.1 - 2023-08-27\n\n### Fixed\n\n- Properly handle the fact that PHP transforms numeric strings in array keys to ints\n\n## 2.6.0 - 2023-08-03\n\n### Changed\n\n- Updated the mime type map to add some new entries, fix a couple of invalid entries, and remove an invalid entry\n- Fallback to `application/octet-stream` if we are unable to guess the content type for a multipart file upload\n\n## 2.5.1 - 2023-08-03\n\n### Fixed\n\n- Corrected mime type for `.acc` files to `audio/aac`\n\n### Changed\n\n- PHP 8.3 support\n\n## 2.5.0 - 2023-04-17\n\n### Changed\n\n- Adjusted `psr/http-message` version constraint to `^1.1 || ^2.0`\n\n## 2.4.5 - 2023-04-17\n\n### Fixed\n\n- Prevent possible warnings on unset variables in `ServerRequest::normalizeNestedFileSpec`\n- Fixed `Message::bodySummary` when `preg_match` fails\n- Fixed header validation issue\n\n## 2.4.4 - 2023-03-09\n\n### Changed\n\n- Removed the need for `AllowDynamicProperties` in `LazyOpenStream`\n\n## 2.4.3 - 2022-10-26\n\n### Changed\n\n- Replaced `sha1(uniqid())` by `bin2hex(random_bytes(20))`\n\n## 2.4.2 - 2022-10-25\n\n### Fixed\n\n- Fixed erroneous behaviour when combining host and relative path\n\n## 2.4.1 - 2022-08-28\n\n### Fixed\n\n- Rewind body before reading in `Message::bodySummary`\n\n## 2.4.0 - 2022-06-20\n\n### Added\n\n- Added provisional PHP 8.2 support\n- Added `UriComparator::isCrossOrigin` method\n\n## 2.3.0 - 2022-06-09\n\n### Fixed\n\n- Added `Header::splitList` method\n- Added `Utils::tryGetContents` method\n- Improved `Stream::getContents` method\n- Updated mimetype mappings\n\n## 2.2.2 - 2022-06-08\n\n### Fixed\n\n- Fix `Message::parseRequestUri` for numeric headers\n- Re-wrap exceptions thrown in `fread` into runtime exceptions\n- Throw an exception when multipart options is misformatted\n\n## 2.2.1 - 2022-03-20\n\n### Fixed\n\n- Correct header value validation\n\n## 2.2.0 - 2022-03-20\n\n### Added\n\n- A more compressive list of mime types\n- Add JsonSerializable to Uri\n- Missing return types\n\n### Fixed\n\n- Bug MultipartStream no `uri` metadata\n- Bug MultipartStream with filename for `data://` streams\n- Fixed new line handling in MultipartStream\n- Reduced RAM usage when copying streams\n- Updated parsing in `Header::normalize()`\n\n## 2.1.1 - 2022-03-20\n\n### Fixed\n\n- Validate header values properly\n\n## 2.1.0 - 2021-10-06\n\n### Changed\n\n- Attempting to create a `Uri` object from a malformed URI will no longer throw a generic\n  `InvalidArgumentException`, but rather a `MalformedUriException`, which inherits from the former\n  for backwards compatibility. Callers relying on the exception being thrown to detect invalid\n  URIs should catch the new exception.\n\n### Fixed\n\n- Return `null` in caching stream size if remote size is `null`\n\n## 2.0.0 - 2021-06-30\n\nIdentical to the RC release.\n\n## 2.0.0@RC-1 - 2021-04-29\n\n### Fixed\n\n- Handle possibly unset `url` in `stream_get_meta_data`\n\n## 2.0.0@beta-1 - 2021-03-21\n\n### Added\n\n- PSR-17 factories\n- Made classes final\n- PHP7 type hints\n\n### Changed\n\n- When building a query string, booleans are represented as 1 and 0.\n\n### Removed\n\n- PHP < 7.2 support\n- All functions in the `GuzzleHttp\\Psr7` namespace\n\n## 1.8.1 - 2021-03-21\n\n### Fixed\n\n- Issue parsing IPv6 URLs\n- Issue modifying ServerRequest lost all its attributes\n\n## 1.8.0 - 2021-03-21\n\n### Added\n\n- Locale independent URL parsing\n- Most classes got a `@final` annotation to prepare for 2.0\n\n### Fixed\n\n- Issue when creating stream from `php://input` and curl-ext is not installed\n- Broken `Utils::tryFopen()` on PHP 8\n\n## 1.7.0 - 2020-09-30\n\n### Added\n\n- Replaced functions by static methods\n\n### Fixed\n\n- Converting a non-seekable stream to a string\n- Handle multiple Set-Cookie correctly\n- Ignore array keys in header values when merging\n- Allow multibyte characters to be parsed in `Message:bodySummary()`\n\n### Changed\n\n- Restored partial HHVM 3 support\n\n\n## [1.6.1] - 2019-07-02\n\n### Fixed\n\n- Accept null and bool header values again\n\n\n## [1.6.0] - 2019-06-30\n\n### Added\n\n- Allowed version `^3.0` of `ralouphie/getallheaders` dependency (#244)\n- Added MIME type for WEBP image format (#246)\n- Added more validation of values according to PSR-7 and RFC standards, e.g. status code range (#250, #272)\n\n### Changed\n\n- Tests don't pass with HHVM 4.0, so HHVM support got dropped. Other libraries like composer have done the same. (#262)\n- Accept port number 0 to be valid (#270)\n\n### Fixed\n\n- Fixed subsequent reads from `php://input` in ServerRequest (#247)\n- Fixed readable/writable detection for certain stream modes (#248)\n- Fixed encoding of special characters in the `userInfo` component of an URI (#253)\n\n\n## [1.5.2] - 2018-12-04\n\n### Fixed\n\n- Check body size when getting the message summary\n\n\n## [1.5.1] - 2018-12-04\n\n### Fixed\n\n- Get the summary of a body only if it is readable\n\n\n## [1.5.0] - 2018-12-03\n\n### Added\n\n- Response first-line to response string exception (fixes #145)\n- A test for #129 behavior\n- `get_message_body_summary` function in order to get the message summary\n- `3gp` and `mkv` mime types\n\n### Changed\n\n- Clarify exception message when stream is detached\n\n### Deprecated\n\n- Deprecated parsing folded header lines as per RFC 7230\n\n### Fixed\n\n- Fix `AppendStream::detach` to not close streams\n- `InflateStream` preserves `isSeekable` attribute of the underlying stream\n- `ServerRequest::getUriFromGlobals` to support URLs in query parameters\n\n\nSeveral other fixes and improvements.\n\n\n## [1.4.2] - 2017-03-20\n\n### Fixed\n\n- Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing\n  calls to `trigger_error` when deprecated methods are invoked.\n\n\n## [1.4.1] - 2017-02-27\n\n### Added\n\n- Rriggering of silenced deprecation warnings.\n\n### Fixed\n\n- Reverted BC break by reintroducing behavior to automagically fix a URI with a\n  relative path and an authority by adding a leading slash to the path. It's only\n  deprecated now.\n\n\n## [1.4.0] - 2017-02-21\n\n### Added\n\n- Added common URI utility methods based on RFC 3986 (see documentation in the readme):\n  - `Uri::isDefaultPort`\n  - `Uri::isAbsolute`\n  - `Uri::isNetworkPathReference`\n  - `Uri::isAbsolutePathReference`\n  - `Uri::isRelativePathReference`\n  - `Uri::isSameDocumentReference`\n  - `Uri::composeComponents`\n  - `UriNormalizer::normalize`\n  - `UriNormalizer::isEquivalent`\n  - `UriResolver::relativize`\n\n### Changed\n\n- Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form.\n- Allow `parse_response` to parse a response without delimiting space and reason.\n- Ensure each URI modification results in a valid URI according to PSR-7 discussions.\n  Invalid modifications will throw an exception instead of returning a wrong URI or\n  doing some magic.\n  - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception\n    because the path of a URI with an authority must start with a slash \"/\" or be empty\n  - `(new Uri())->withScheme('http')` will return `'http://localhost'`\n\n### Deprecated\n\n- `Uri::resolve` in favor of `UriResolver::resolve`\n- `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments`\n\n### Fixed\n\n- `Stream::read` when length parameter <= 0.\n- `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory.\n- `ServerRequest::getUriFromGlobals` when `Host` header contains port.\n- Compatibility of URIs with `file` scheme and empty host.\n\n\n## [1.3.1] - 2016-06-25\n\n### Fixed\n\n- `Uri::__toString` for network path references, e.g. `//example.org`.\n- Missing lowercase normalization for host.\n- Handling of URI components in case they are `'0'` in a lot of places,\n  e.g. as a user info password.\n- `Uri::withAddedHeader` to correctly merge headers with different case.\n- Trimming of header values in `Uri::withAddedHeader`. Header values may\n  be surrounded by whitespace which should be ignored according to RFC 7230\n  Section 3.2.4. This does not apply to header names.\n- `Uri::withAddedHeader` with an array of header values.\n- `Uri::resolve` when base path has no slash and handling of fragment.\n- Handling of encoding in `Uri::with(out)QueryValue` so one can pass the\n  key/value both in encoded as well as decoded form to those methods. This is\n  consistent with withPath, withQuery etc.\n- `ServerRequest::withoutAttribute` when attribute value is null.\n\n\n## [1.3.0] - 2016-04-13\n\n### Added\n\n- Remaining interfaces needed for full PSR7 compatibility\n  (ServerRequestInterface, UploadedFileInterface, etc.).\n- Support for stream_for from scalars.\n\n### Changed\n\n- Can now extend Uri.\n\n### Fixed\n- A bug in validating request methods by making it more permissive.\n\n\n## [1.2.3] - 2016-02-18\n\n### Fixed\n\n- Support in `GuzzleHttp\\Psr7\\CachingStream` for seeking forward on remote\n  streams, which can sometimes return fewer bytes than requested with `fread`.\n- Handling of gzipped responses with FNAME headers.\n\n\n## [1.2.2] - 2016-01-22\n\n### Added\n\n- Support for URIs without any authority.\n- Support for HTTP 451 'Unavailable For Legal Reasons.'\n- Support for using '0' as a filename.\n- Support for including non-standard ports in Host headers.\n\n\n## [1.2.1] - 2015-11-02\n\n### Changes\n\n- Now supporting negative offsets when seeking to SEEK_END.\n\n\n## [1.2.0] - 2015-08-15\n\n### Changed\n\n- Body as `\"0\"` is now properly added to a response.\n- Now allowing forward seeking in CachingStream.\n- Now properly parsing HTTP requests that contain proxy targets in\n  `parse_request`.\n- functions.php is now conditionally required.\n- user-info is no longer dropped when resolving URIs.\n\n\n## [1.1.0] - 2015-06-24\n\n### Changed\n\n- URIs can now be relative.\n- `multipart/form-data` headers are now overridden case-insensitively.\n- URI paths no longer encode the following characters because they are allowed\n  in URIs: \"(\", \")\", \"*\", \"!\", \"'\"\n- A port is no longer added to a URI when the scheme is missing and no port is\n  present.\n\n\n## 1.0.0 - 2015-05-19\n\nInitial release.\n\nCurrently unsupported:\n\n- `Psr\\Http\\Message\\ServerRequestInterface`\n- `Psr\\Http\\Message\\UploadedFileInterface`\n\n\n\n[1.6.0]: https://github.com/guzzle/psr7/compare/1.5.2...1.6.0\n[1.5.2]: https://github.com/guzzle/psr7/compare/1.5.1...1.5.2\n[1.5.1]: https://github.com/guzzle/psr7/compare/1.5.0...1.5.1\n[1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0\n[1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2\n[1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1\n[1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0\n[1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1\n[1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0\n[1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3\n[1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2\n[1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1\n[1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0\n[1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Michael Dowling <mtdowling@gmail.com>\nCopyright (c) 2015 Márk Sági-Kazár <mark.sagikazar@gmail.com>\nCopyright (c) 2015 Graham Campbell <hello@gjcampbell.co.uk>\nCopyright (c) 2016 Tobias Schultze <webmaster@tubo-world.de>\nCopyright (c) 2016 George Mponos <gmponos@gmail.com>\nCopyright (c) 2018 Tobias Nyholm <tobias.nyholm@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/README.md",
    "content": "# PSR-7 Message Implementation\n\nThis repository contains a full [PSR-7](https://www.php-fig.org/psr/psr-7/)\nmessage implementation, several stream decorators, and some helpful\nfunctionality like query string parsing.\n\n![CI](https://github.com/guzzle/psr7/workflows/CI/badge.svg)\n![Static analysis](https://github.com/guzzle/psr7/workflows/Static%20analysis/badge.svg)\n\n\n## Features\n\nThis package comes with a number of stream implementations and stream\ndecorators.\n\n\n## Installation\n\n```shell\ncomposer require guzzlehttp/psr7\n```\n\n## Version Guidance\n\n| Version | Status              | PHP Version  |\n|---------|---------------------|--------------|\n| 1.x     | Security fixes only | >=5.4,<8.1   |\n| 2.x     | Latest              | >=7.2.5,<8.4 |\n\n\n## AppendStream\n\n`GuzzleHttp\\Psr7\\AppendStream`\n\nReads from multiple streams, one after the other.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$a = Psr7\\Utils::streamFor('abc, ');\n$b = Psr7\\Utils::streamFor('123.');\n$composed = new Psr7\\AppendStream([$a, $b]);\n\n$composed->addStream(Psr7\\Utils::streamFor(' Above all listen to me'));\n\necho $composed; // abc, 123. Above all listen to me.\n```\n\n\n## BufferStream\n\n`GuzzleHttp\\Psr7\\BufferStream`\n\nProvides a buffer stream that can be written to fill a buffer, and read\nfrom to remove bytes from the buffer.\n\nThis stream returns a \"hwm\" metadata value that tells upstream consumers\nwhat the configured high water mark of the stream is, or the maximum\npreferred size of the buffer.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n// When more than 1024 bytes are in the buffer, it will begin returning\n// false to writes. This is an indication that writers should slow down.\n$buffer = new Psr7\\BufferStream(1024);\n```\n\n\n## CachingStream\n\nThe CachingStream is used to allow seeking over previously read bytes on\nnon-seekable streams. This can be useful when transferring a non-seekable\nentity body fails due to needing to rewind the stream (for example, resulting\nfrom a redirect). Data that is read from the remote stream will be buffered in\na PHP temp stream so that previously read bytes are cached first in memory,\nthen on disk.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\Utils::streamFor(fopen('http://www.google.com', 'r'));\n$stream = new Psr7\\CachingStream($original);\n\n$stream->read(1024);\necho $stream->tell();\n// 1024\n\n$stream->seek(0);\necho $stream->tell();\n// 0\n```\n\n\n## DroppingStream\n\n`GuzzleHttp\\Psr7\\DroppingStream`\n\nStream decorator that begins dropping data once the size of the underlying\nstream becomes too full.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n// Create an empty stream\n$stream = Psr7\\Utils::streamFor();\n\n// Start dropping data when the stream has more than 10 bytes\n$dropping = new Psr7\\DroppingStream($stream, 10);\n\n$dropping->write('01234567890123456789');\necho $stream; // 0123456789\n```\n\n\n## FnStream\n\n`GuzzleHttp\\Psr7\\FnStream`\n\nCompose stream implementations based on a hash of functions.\n\nAllows for easy testing and extension of a provided stream without needing\nto create a concrete class for a simple extension point.\n\n```php\n\nuse GuzzleHttp\\Psr7;\n\n$stream = Psr7\\Utils::streamFor('hi');\n$fnStream = Psr7\\FnStream::decorate($stream, [\n    'rewind' => function () use ($stream) {\n        echo 'About to rewind - ';\n        $stream->rewind();\n        echo 'rewound!';\n    }\n]);\n\n$fnStream->rewind();\n// Outputs: About to rewind - rewound!\n```\n\n\n## InflateStream\n\n`GuzzleHttp\\Psr7\\InflateStream`\n\nUses PHP's zlib.inflate filter to inflate zlib (HTTP deflate, RFC1950) or gzipped (RFC1952) content.\n\nThis stream decorator converts the provided stream to a PHP stream resource,\nthen appends the zlib.inflate filter. The stream is then converted back\nto a Guzzle stream resource to be used as a Guzzle stream.\n\n\n## LazyOpenStream\n\n`GuzzleHttp\\Psr7\\LazyOpenStream`\n\nLazily reads or writes to a file that is opened only after an IO operation\ntake place on the stream.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$stream = new Psr7\\LazyOpenStream('/path/to/file', 'r');\n// The file has not yet been opened...\n\necho $stream->read(10);\n// The file is opened and read from only when needed.\n```\n\n\n## LimitStream\n\n`GuzzleHttp\\Psr7\\LimitStream`\n\nLimitStream can be used to read a subset or slice of an existing stream object.\nThis can be useful for breaking a large file into smaller pieces to be sent in\nchunks (e.g. Amazon S3's multipart upload API).\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\Utils::streamFor(fopen('/tmp/test.txt', 'r+'));\necho $original->getSize();\n// >>> 1048576\n\n// Limit the size of the body to 1024 bytes and start reading from byte 2048\n$stream = new Psr7\\LimitStream($original, 1024, 2048);\necho $stream->getSize();\n// >>> 1024\necho $stream->tell();\n// >>> 0\n```\n\n\n## MultipartStream\n\n`GuzzleHttp\\Psr7\\MultipartStream`\n\nStream that when read returns bytes for a streaming multipart or\nmultipart/form-data stream.\n\n\n## NoSeekStream\n\n`GuzzleHttp\\Psr7\\NoSeekStream`\n\nNoSeekStream wraps a stream and does not allow seeking.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\Utils::streamFor('foo');\n$noSeek = new Psr7\\NoSeekStream($original);\n\necho $noSeek->read(3);\n// foo\nvar_export($noSeek->isSeekable());\n// false\n$noSeek->seek(0);\nvar_export($noSeek->read(3));\n// NULL\n```\n\n\n## PumpStream\n\n`GuzzleHttp\\Psr7\\PumpStream`\n\nProvides a read only stream that pumps data from a PHP callable.\n\nWhen invoking the provided callable, the PumpStream will pass the amount of\ndata requested to read to the callable. The callable can choose to ignore\nthis value and return fewer or more bytes than requested. Any extra data\nreturned by the provided callable is buffered internally until drained using\nthe read() function of the PumpStream. The provided callable MUST return\nfalse when there is no more data to read.\n\n\n## Implementing stream decorators\n\nCreating a stream decorator is very easy thanks to the\n`GuzzleHttp\\Psr7\\StreamDecoratorTrait`. This trait provides methods that\nimplement `Psr\\Http\\Message\\StreamInterface` by proxying to an underlying\nstream. Just `use` the `StreamDecoratorTrait` and implement your custom\nmethods.\n\nFor example, let's say we wanted to call a specific function each time the last\nbyte is read from a stream. This could be implemented by overriding the\n`read()` method.\n\n```php\nuse Psr\\Http\\Message\\StreamInterface;\nuse GuzzleHttp\\Psr7\\StreamDecoratorTrait;\n\nclass EofCallbackStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    private $callback;\n\n    private $stream;\n\n    public function __construct(StreamInterface $stream, callable $cb)\n    {\n        $this->stream = $stream;\n        $this->callback = $cb;\n    }\n\n    public function read($length)\n    {\n        $result = $this->stream->read($length);\n\n        // Invoke the callback when EOF is hit.\n        if ($this->eof()) {\n            ($this->callback)();\n        }\n\n        return $result;\n    }\n}\n```\n\nThis decorator could be added to any existing stream and used like so:\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\Utils::streamFor('foo');\n\n$eofStream = new EofCallbackStream($original, function () {\n    echo 'EOF!';\n});\n\n$eofStream->read(2);\n$eofStream->read(1);\n// echoes \"EOF!\"\n$eofStream->seek(0);\n$eofStream->read(3);\n// echoes \"EOF!\"\n```\n\n\n## PHP StreamWrapper\n\nYou can use the `GuzzleHttp\\Psr7\\StreamWrapper` class if you need to use a\nPSR-7 stream as a PHP stream resource.\n\nUse the `GuzzleHttp\\Psr7\\StreamWrapper::getResource()` method to create a PHP\nstream from a PSR-7 stream.\n\n```php\nuse GuzzleHttp\\Psr7\\StreamWrapper;\n\n$stream = GuzzleHttp\\Psr7\\Utils::streamFor('hello!');\n$resource = StreamWrapper::getResource($stream);\necho fread($resource, 6); // outputs hello!\n```\n\n\n# Static API\n\nThere are various static methods available under the `GuzzleHttp\\Psr7` namespace.\n\n\n## `GuzzleHttp\\Psr7\\Message::toString`\n\n`public static function toString(MessageInterface $message): string`\n\nReturns the string representation of an HTTP message.\n\n```php\n$request = new GuzzleHttp\\Psr7\\Request('GET', 'http://example.com');\necho GuzzleHttp\\Psr7\\Message::toString($request);\n```\n\n\n## `GuzzleHttp\\Psr7\\Message::bodySummary`\n\n`public static function bodySummary(MessageInterface $message, int $truncateAt = 120): string|null`\n\nGet a short summary of the message body.\n\nWill return `null` if the response is not printable.\n\n\n## `GuzzleHttp\\Psr7\\Message::rewindBody`\n\n`public static function rewindBody(MessageInterface $message): void`\n\nAttempts to rewind a message body and throws an exception on failure.\n\nThe body of the message will only be rewound if a call to `tell()`\nreturns a value other than `0`.\n\n\n## `GuzzleHttp\\Psr7\\Message::parseMessage`\n\n`public static function parseMessage(string $message): array`\n\nParses an HTTP message into an associative array.\n\nThe array contains the \"start-line\" key containing the start line of\nthe message, \"headers\" key containing an associative array of header\narray values, and a \"body\" key containing the body of the message.\n\n\n## `GuzzleHttp\\Psr7\\Message::parseRequestUri`\n\n`public static function parseRequestUri(string $path, array $headers): string`\n\nConstructs a URI for an HTTP request message.\n\n\n## `GuzzleHttp\\Psr7\\Message::parseRequest`\n\n`public static function parseRequest(string $message): Request`\n\nParses a request message string into a request object.\n\n\n## `GuzzleHttp\\Psr7\\Message::parseResponse`\n\n`public static function parseResponse(string $message): Response`\n\nParses a response message string into a response object.\n\n\n## `GuzzleHttp\\Psr7\\Header::parse`\n\n`public static function parse(string|array $header): array`\n\nParse an array of header values containing \";\" separated data into an\narray of associative arrays representing the header key value pair data\nof the header. When a parameter does not contain a value, but just\ncontains a key, this function will inject a key with a '' string value.\n\n\n## `GuzzleHttp\\Psr7\\Header::splitList`\n\n`public static function splitList(string|string[] $header): string[]`\n\nSplits a HTTP header defined to contain a comma-separated list into\neach individual value:\n\n```\n$knownEtags = Header::splitList($request->getHeader('if-none-match'));\n```\n\nExample headers include `accept`, `cache-control` and `if-none-match`.\n\n\n## `GuzzleHttp\\Psr7\\Header::normalize` (deprecated)\n\n`public static function normalize(string|array $header): array`\n\n`Header::normalize()` is deprecated in favor of [`Header::splitList()`](README.md#guzzlehttppsr7headersplitlist)\nwhich performs the same operation with a cleaned up API and improved\ndocumentation.\n\nConverts an array of header values that may contain comma separated\nheaders into an array of headers with no comma separated values.\n\n\n## `GuzzleHttp\\Psr7\\Query::parse`\n\n`public static function parse(string $str, int|bool $urlEncoding = true): array`\n\nParse a query string into an associative array.\n\nIf multiple values are found for the same key, the value of that key\nvalue pair will become an array. This function does not parse nested\nPHP style arrays into an associative array (e.g., `foo[a]=1&foo[b]=2`\nwill be parsed into `['foo[a]' => '1', 'foo[b]' => '2'])`.\n\n\n## `GuzzleHttp\\Psr7\\Query::build`\n\n`public static function build(array $params, int|false $encoding = PHP_QUERY_RFC3986): string`\n\nBuild a query string from an array of key value pairs.\n\nThis function can use the return value of `parse()` to build a query\nstring. This function does not modify the provided keys when an array is\nencountered (like `http_build_query()` would).\n\n\n## `GuzzleHttp\\Psr7\\Utils::caselessRemove`\n\n`public static function caselessRemove(iterable<string> $keys, $keys, array $data): array`\n\nRemove the items given by the keys, case insensitively from the data.\n\n\n## `GuzzleHttp\\Psr7\\Utils::copyToStream`\n\n`public static function copyToStream(StreamInterface $source, StreamInterface $dest, int $maxLen = -1): void`\n\nCopy the contents of a stream into another stream until the given number\nof bytes have been read.\n\n\n## `GuzzleHttp\\Psr7\\Utils::copyToString`\n\n`public static function copyToString(StreamInterface $stream, int $maxLen = -1): string`\n\nCopy the contents of a stream into a string until the given number of\nbytes have been read.\n\n\n## `GuzzleHttp\\Psr7\\Utils::hash`\n\n`public static function hash(StreamInterface $stream, string $algo, bool $rawOutput = false): string`\n\nCalculate a hash of a stream.\n\nThis method reads the entire stream to calculate a rolling hash, based on\nPHP's `hash_init` functions.\n\n\n## `GuzzleHttp\\Psr7\\Utils::modifyRequest`\n\n`public static function modifyRequest(RequestInterface $request, array $changes): RequestInterface`\n\nClone and modify a request with the given changes.\n\nThis method is useful for reducing the number of clones needed to mutate\na message.\n\n- method: (string) Changes the HTTP method.\n- set_headers: (array) Sets the given headers.\n- remove_headers: (array) Remove the given headers.\n- body: (mixed) Sets the given body.\n- uri: (UriInterface) Set the URI.\n- query: (string) Set the query string value of the URI.\n- version: (string) Set the protocol version.\n\n\n## `GuzzleHttp\\Psr7\\Utils::readLine`\n\n`public static function readLine(StreamInterface $stream, int $maxLength = null): string`\n\nRead a line from the stream up to the maximum allowed buffer length.\n\n\n## `GuzzleHttp\\Psr7\\Utils::streamFor`\n\n`public static function streamFor(resource|string|null|int|float|bool|StreamInterface|callable|\\Iterator $resource = '', array $options = []): StreamInterface`\n\nCreate a new stream based on the input type.\n\nOptions is an associative array that can contain the following keys:\n\n- metadata: Array of custom metadata.\n- size: Size of the stream.\n\nThis method accepts the following `$resource` types:\n\n- `Psr\\Http\\Message\\StreamInterface`: Returns the value as-is.\n- `string`: Creates a stream object that uses the given string as the contents.\n- `resource`: Creates a stream object that wraps the given PHP stream resource.\n- `Iterator`: If the provided value implements `Iterator`, then a read-only\n  stream object will be created that wraps the given iterable. Each time the\n  stream is read from, data from the iterator will fill a buffer and will be\n  continuously called until the buffer is equal to the requested read size.\n  Subsequent read calls will first read from the buffer and then call `next`\n  on the underlying iterator until it is exhausted.\n- `object` with `__toString()`: If the object has the `__toString()` method,\n  the object will be cast to a string and then a stream will be returned that\n  uses the string value.\n- `NULL`: When `null` is passed, an empty stream object is returned.\n- `callable` When a callable is passed, a read-only stream object will be\n  created that invokes the given callable. The callable is invoked with the\n  number of suggested bytes to read. The callable can return any number of\n  bytes, but MUST return `false` when there is no more data to return. The\n  stream object that wraps the callable will invoke the callable until the\n  number of requested bytes are available. Any additional bytes will be\n  buffered and used in subsequent reads.\n\n```php\n$stream = GuzzleHttp\\Psr7\\Utils::streamFor('foo');\n$stream = GuzzleHttp\\Psr7\\Utils::streamFor(fopen('/path/to/file', 'r'));\n\n$generator = function ($bytes) {\n    for ($i = 0; $i < $bytes; $i++) {\n        yield ' ';\n    }\n}\n\n$stream = GuzzleHttp\\Psr7\\Utils::streamFor($generator(100));\n```\n\n\n## `GuzzleHttp\\Psr7\\Utils::tryFopen`\n\n`public static function tryFopen(string $filename, string $mode): resource`\n\nSafely opens a PHP stream resource using a filename.\n\nWhen fopen fails, PHP normally raises a warning. This function adds an\nerror handler that checks for errors and throws an exception instead.\n\n\n## `GuzzleHttp\\Psr7\\Utils::tryGetContents`\n\n`public static function tryGetContents(resource $stream): string`\n\nSafely gets the contents of a given stream.\n\nWhen stream_get_contents fails, PHP normally raises a warning. This\nfunction adds an error handler that checks for errors and throws an\nexception instead.\n\n\n## `GuzzleHttp\\Psr7\\Utils::uriFor`\n\n`public static function uriFor(string|UriInterface $uri): UriInterface`\n\nReturns a UriInterface for the given value.\n\nThis function accepts a string or UriInterface and returns a\nUriInterface for the given value. If the value is already a\nUriInterface, it is returned as-is.\n\n\n## `GuzzleHttp\\Psr7\\MimeType::fromFilename`\n\n`public static function fromFilename(string $filename): string|null`\n\nDetermines the mimetype of a file by looking at its extension.\n\n\n## `GuzzleHttp\\Psr7\\MimeType::fromExtension`\n\n`public static function fromExtension(string $extension): string|null`\n\nMaps a file extensions to a mimetype.\n\n\n## Upgrading from Function API\n\nThe static API was first introduced in 1.7.0, in order to mitigate problems with functions conflicting between global and local copies of the package. The function API was removed in 2.0.0. A migration table has been provided here for your convenience:\n\n| Original Function | Replacement Method |\n|----------------|----------------|\n| `str` | `Message::toString` |\n| `uri_for` | `Utils::uriFor` |\n| `stream_for` | `Utils::streamFor` |\n| `parse_header` | `Header::parse` |\n| `normalize_header` | `Header::normalize` |\n| `modify_request` | `Utils::modifyRequest` |\n| `rewind_body` | `Message::rewindBody` |\n| `try_fopen` | `Utils::tryFopen` |\n| `copy_to_string` | `Utils::copyToString` |\n| `copy_to_stream` | `Utils::copyToStream` |\n| `hash` | `Utils::hash` |\n| `readline` | `Utils::readLine` |\n| `parse_request` | `Message::parseRequest` |\n| `parse_response` | `Message::parseResponse` |\n| `parse_query` | `Query::parse` |\n| `build_query` | `Query::build` |\n| `mimetype_from_filename` | `MimeType::fromFilename` |\n| `mimetype_from_extension` | `MimeType::fromExtension` |\n| `_parse_message` | `Message::parseMessage` |\n| `_parse_request_uri` | `Message::parseRequestUri` |\n| `get_message_body_summary` | `Message::bodySummary` |\n| `_caseless_remove` | `Utils::caselessRemove` |\n\n\n# Additional URI Methods\n\nAside from the standard `Psr\\Http\\Message\\UriInterface` implementation in form of the `GuzzleHttp\\Psr7\\Uri` class,\nthis library also provides additional functionality when working with URIs as static methods.\n\n## URI Types\n\nAn instance of `Psr\\Http\\Message\\UriInterface` can either be an absolute URI or a relative reference.\nAn absolute URI has a scheme. A relative reference is used to express a URI relative to another URI,\nthe base URI. Relative references can be divided into several forms according to\n[RFC 3986 Section 4.2](https://datatracker.ietf.org/doc/html/rfc3986#section-4.2):\n\n- network-path references, e.g. `//example.com/path`\n- absolute-path references, e.g. `/path`\n- relative-path references, e.g. `subpath`\n\nThe following methods can be used to identify the type of the URI.\n\n### `GuzzleHttp\\Psr7\\Uri::isAbsolute`\n\n`public static function isAbsolute(UriInterface $uri): bool`\n\nWhether the URI is absolute, i.e. it has a scheme.\n\n### `GuzzleHttp\\Psr7\\Uri::isNetworkPathReference`\n\n`public static function isNetworkPathReference(UriInterface $uri): bool`\n\nWhether the URI is a network-path reference. A relative reference that begins with two slash characters is\ntermed an network-path reference.\n\n### `GuzzleHttp\\Psr7\\Uri::isAbsolutePathReference`\n\n`public static function isAbsolutePathReference(UriInterface $uri): bool`\n\nWhether the URI is a absolute-path reference. A relative reference that begins with a single slash character is\ntermed an absolute-path reference.\n\n### `GuzzleHttp\\Psr7\\Uri::isRelativePathReference`\n\n`public static function isRelativePathReference(UriInterface $uri): bool`\n\nWhether the URI is a relative-path reference. A relative reference that does not begin with a slash character is\ntermed a relative-path reference.\n\n### `GuzzleHttp\\Psr7\\Uri::isSameDocumentReference`\n\n`public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool`\n\nWhether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its\nfragment component, identical to the base URI. When no base URI is given, only an empty URI reference\n(apart from its fragment) is considered a same-document reference.\n\n## URI Components\n\nAdditional methods to work with URI components.\n\n### `GuzzleHttp\\Psr7\\Uri::isDefaultPort`\n\n`public static function isDefaultPort(UriInterface $uri): bool`\n\nWhether the URI has the default port of the current scheme. `Psr\\Http\\Message\\UriInterface::getPort` may return null\nor the standard port. This method can be used independently of the implementation.\n\n### `GuzzleHttp\\Psr7\\Uri::composeComponents`\n\n`public static function composeComponents($scheme, $authority, $path, $query, $fragment): string`\n\nComposes a URI reference string from its various components according to\n[RFC 3986 Section 5.3](https://datatracker.ietf.org/doc/html/rfc3986#section-5.3). Usually this method does not need\nto be called manually but instead is used indirectly via `Psr\\Http\\Message\\UriInterface::__toString`.\n\n### `GuzzleHttp\\Psr7\\Uri::fromParts`\n\n`public static function fromParts(array $parts): UriInterface`\n\nCreates a URI from a hash of [`parse_url`](https://www.php.net/manual/en/function.parse-url.php) components.\n\n\n### `GuzzleHttp\\Psr7\\Uri::withQueryValue`\n\n`public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface`\n\nCreates a new URI with a specific query string value. Any existing query string values that exactly match the\nprovided key are removed and replaced with the given key value pair. A value of null will set the query string\nkey without a value, e.g. \"key\" instead of \"key=value\".\n\n### `GuzzleHttp\\Psr7\\Uri::withQueryValues`\n\n`public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface`\n\nCreates a new URI with multiple query string values. It has the same behavior as `withQueryValue()` but for an\nassociative array of key => value.\n\n### `GuzzleHttp\\Psr7\\Uri::withoutQueryValue`\n\n`public static function withoutQueryValue(UriInterface $uri, $key): UriInterface`\n\nCreates a new URI with a specific query string value removed. Any existing query string values that exactly match the\nprovided key are removed.\n\n## Cross-Origin Detection\n\n`GuzzleHttp\\Psr7\\UriComparator` provides methods to determine if a modified URL should be considered cross-origin.\n\n### `GuzzleHttp\\Psr7\\UriComparator::isCrossOrigin`\n\n`public static function isCrossOrigin(UriInterface $original, UriInterface $modified): bool`\n\nDetermines if a modified URL should be considered cross-origin with respect to an original URL.\n\n## Reference Resolution\n\n`GuzzleHttp\\Psr7\\UriResolver` provides methods to resolve a URI reference in the context of a base URI according\nto [RFC 3986 Section 5](https://datatracker.ietf.org/doc/html/rfc3986#section-5). This is for example also what web\nbrowsers do when resolving a link in a website based on the current request URI.\n\n### `GuzzleHttp\\Psr7\\UriResolver::resolve`\n\n`public static function resolve(UriInterface $base, UriInterface $rel): UriInterface`\n\nConverts the relative URI into a new URI that is resolved against the base URI.\n\n### `GuzzleHttp\\Psr7\\UriResolver::removeDotSegments`\n\n`public static function removeDotSegments(string $path): string`\n\nRemoves dot segments from a path and returns the new path according to\n[RFC 3986 Section 5.2.4](https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4).\n\n### `GuzzleHttp\\Psr7\\UriResolver::relativize`\n\n`public static function relativize(UriInterface $base, UriInterface $target): UriInterface`\n\nReturns the target URI as a relative reference from the base URI. This method is the counterpart to resolve():\n\n```php\n(string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))\n```\n\nOne use-case is to use the current request URI as base URI and then generate relative links in your documents\nto reduce the document size or offer self-contained downloadable document archives.\n\n```php\n$base = new Uri('http://example.com/a/b/');\necho UriResolver::relativize($base, new Uri('http://example.com/a/b/c'));  // prints 'c'.\necho UriResolver::relativize($base, new Uri('http://example.com/a/x/y'));  // prints '../x/y'.\necho UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.\necho UriResolver::relativize($base, new Uri('http://example.org/a/b/'));   // prints '//example.org/a/b/'.\n```\n\n## Normalization and Comparison\n\n`GuzzleHttp\\Psr7\\UriNormalizer` provides methods to normalize and compare URIs according to\n[RFC 3986 Section 6](https://datatracker.ietf.org/doc/html/rfc3986#section-6).\n\n### `GuzzleHttp\\Psr7\\UriNormalizer::normalize`\n\n`public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface`\n\nReturns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.\nThis methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask\nof normalizations to apply. The following normalizations are available:\n\n- `UriNormalizer::PRESERVING_NORMALIZATIONS`\n\n    Default normalizations which only include the ones that preserve semantics.\n\n- `UriNormalizer::CAPITALIZE_PERCENT_ENCODING`\n\n    All letters within a percent-encoding triplet (e.g., \"%3A\") are case-insensitive, and should be capitalized.\n\n    Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b`\n\n- `UriNormalizer::DECODE_UNRESERVED_CHARACTERS`\n\n    Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of\n    ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should\n    not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved\n    characters by URI normalizers.\n\n    Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/`\n\n- `UriNormalizer::CONVERT_EMPTY_PATH`\n\n    Converts the empty path to \"/\" for http and https URIs.\n\n    Example: `http://example.org` → `http://example.org/`\n\n- `UriNormalizer::REMOVE_DEFAULT_HOST`\n\n    Removes the default host of the given URI scheme from the URI. Only the \"file\" scheme defines the default host\n    \"localhost\". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to\n    RFC 3986.\n\n    Example: `file://localhost/myfile` → `file:///myfile`\n\n- `UriNormalizer::REMOVE_DEFAULT_PORT`\n\n    Removes the default port of the given URI scheme from the URI.\n\n    Example: `http://example.org:80/` → `http://example.org/`\n\n- `UriNormalizer::REMOVE_DOT_SEGMENTS`\n\n    Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would\n    change the semantics of the URI reference.\n\n    Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html`\n\n- `UriNormalizer::REMOVE_DUPLICATE_SLASHES`\n\n    Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes\n    and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization\n    may change the semantics. Encoded slashes (%2F) are not removed.\n\n    Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html`\n\n- `UriNormalizer::SORT_QUERY_PARAMETERS`\n\n    Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be\n    significant (this is not defined by the standard). So this normalization is not safe and may change the semantics\n    of the URI.\n\n    Example: `?lang=en&article=fred` → `?article=fred&lang=en`\n\n### `GuzzleHttp\\Psr7\\UriNormalizer::isEquivalent`\n\n`public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool`\n\nWhether two URIs can be considered equivalent. Both URIs are normalized automatically before comparison with the given\n`$normalizations` bitmask. The method also accepts relative URI references and returns true when they are equivalent.\nThis of course assumes they will be resolved against the same base URI. If this is not the case, determination of\nequivalence or difference of relative references does not mean anything.\n\n\n## Security\n\nIf you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/psr7/security/policy) for more information.\n\n\n## License\n\nGuzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information.\n\n\n## For Enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-guzzlehttp-psr7?utm_source=packagist-guzzlehttp-psr7&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/composer.json",
    "content": "{\n    \"name\": \"guzzlehttp/psr7\",\n    \"description\": \"PSR-7 message implementation that also provides common utility methods\",\n    \"keywords\": [\n        \"request\",\n        \"response\",\n        \"message\",\n        \"stream\",\n        \"http\",\n        \"uri\",\n        \"url\",\n        \"psr-7\"\n    ],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Graham Campbell\",\n            \"email\": \"hello@gjcampbell.co.uk\",\n            \"homepage\": \"https://github.com/GrahamCampbell\"\n        },\n        {\n            \"name\": \"Michael Dowling\",\n            \"email\": \"mtdowling@gmail.com\",\n            \"homepage\": \"https://github.com/mtdowling\"\n        },\n        {\n            \"name\": \"George Mponos\",\n            \"email\": \"gmponos@gmail.com\",\n            \"homepage\": \"https://github.com/gmponos\"\n        },\n        {\n            \"name\": \"Tobias Nyholm\",\n            \"email\": \"tobias.nyholm@gmail.com\",\n            \"homepage\": \"https://github.com/Nyholm\"\n        },\n        {\n            \"name\": \"Márk Sági-Kazár\",\n            \"email\": \"mark.sagikazar@gmail.com\",\n            \"homepage\": \"https://github.com/sagikazarmark\"\n        },\n        {\n            \"name\": \"Tobias Schultze\",\n            \"email\": \"webmaster@tubo-world.de\",\n            \"homepage\": \"https://github.com/Tobion\"\n        },\n        {\n            \"name\": \"Márk Sági-Kazár\",\n            \"email\": \"mark.sagikazar@gmail.com\",\n            \"homepage\": \"https://sagikazarmark.hu\"\n        }\n    ],\n    \"require\": {\n        \"php\": \"^7.2.5 || ^8.0\",\n        \"psr/http-factory\": \"^1.0\",\n        \"psr/http-message\": \"^1.1 || ^2.0\",\n        \"ralouphie/getallheaders\": \"^3.0\"\n    },\n    \"provide\": {\n        \"psr/http-factory-implementation\": \"1.0\",\n        \"psr/http-message-implementation\": \"1.0\"\n    },\n    \"require-dev\": {\n        \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n        \"http-interop/http-factory-tests\": \"^0.9\",\n        \"phpunit/phpunit\": \"^8.5.36 || ^9.6.15\"\n    },\n    \"suggest\": {\n        \"laminas/laminas-httphandlerrunner\": \"Emit PSR-7 responses\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Psr7\\\\\": \"src/\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Tests\\\\Psr7\\\\\": \"tests/\"\n        }\n    },\n    \"extra\": {\n        \"bamarni-bin\": {\n            \"bin-links\": true,\n            \"forward-command\": false\n        }\n    },\n    \"config\": {\n        \"allow-plugins\": {\n            \"bamarni/composer-bin-plugin\": true\n        },\n        \"preferred-install\": \"dist\",\n        \"sort-packages\": true\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/AppendStream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Reads from multiple streams, one after the other.\n *\n * This is a read-only stream decorator.\n */\nfinal class AppendStream implements StreamInterface\n{\n    /** @var StreamInterface[] Streams being decorated */\n    private $streams = [];\n\n    /** @var bool */\n    private $seekable = true;\n\n    /** @var int */\n    private $current = 0;\n\n    /** @var int */\n    private $pos = 0;\n\n    /**\n     * @param StreamInterface[] $streams Streams to decorate. Each stream must\n     *                                   be readable.\n     */\n    public function __construct(array $streams = [])\n    {\n        foreach ($streams as $stream) {\n            $this->addStream($stream);\n        }\n    }\n\n    public function __toString(): string\n    {\n        try {\n            $this->rewind();\n\n            return $this->getContents();\n        } catch (\\Throwable $e) {\n            if (\\PHP_VERSION_ID >= 70400) {\n                throw $e;\n            }\n            trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);\n\n            return '';\n        }\n    }\n\n    /**\n     * Add a stream to the AppendStream\n     *\n     * @param StreamInterface $stream Stream to append. Must be readable.\n     *\n     * @throws \\InvalidArgumentException if the stream is not readable\n     */\n    public function addStream(StreamInterface $stream): void\n    {\n        if (!$stream->isReadable()) {\n            throw new \\InvalidArgumentException('Each stream must be readable');\n        }\n\n        // The stream is only seekable if all streams are seekable\n        if (!$stream->isSeekable()) {\n            $this->seekable = false;\n        }\n\n        $this->streams[] = $stream;\n    }\n\n    public function getContents(): string\n    {\n        return Utils::copyToString($this);\n    }\n\n    /**\n     * Closes each attached stream.\n     */\n    public function close(): void\n    {\n        $this->pos = $this->current = 0;\n        $this->seekable = true;\n\n        foreach ($this->streams as $stream) {\n            $stream->close();\n        }\n\n        $this->streams = [];\n    }\n\n    /**\n     * Detaches each attached stream.\n     *\n     * Returns null as it's not clear which underlying stream resource to return.\n     */\n    public function detach()\n    {\n        $this->pos = $this->current = 0;\n        $this->seekable = true;\n\n        foreach ($this->streams as $stream) {\n            $stream->detach();\n        }\n\n        $this->streams = [];\n\n        return null;\n    }\n\n    public function tell(): int\n    {\n        return $this->pos;\n    }\n\n    /**\n     * Tries to calculate the size by adding the size of each stream.\n     *\n     * If any of the streams do not return a valid number, then the size of the\n     * append stream cannot be determined and null is returned.\n     */\n    public function getSize(): ?int\n    {\n        $size = 0;\n\n        foreach ($this->streams as $stream) {\n            $s = $stream->getSize();\n            if ($s === null) {\n                return null;\n            }\n            $size += $s;\n        }\n\n        return $size;\n    }\n\n    public function eof(): bool\n    {\n        return !$this->streams\n            || ($this->current >= count($this->streams) - 1\n             && $this->streams[$this->current]->eof());\n    }\n\n    public function rewind(): void\n    {\n        $this->seek(0);\n    }\n\n    /**\n     * Attempts to seek to the given position. Only supports SEEK_SET.\n     */\n    public function seek($offset, $whence = SEEK_SET): void\n    {\n        if (!$this->seekable) {\n            throw new \\RuntimeException('This AppendStream is not seekable');\n        } elseif ($whence !== SEEK_SET) {\n            throw new \\RuntimeException('The AppendStream can only seek with SEEK_SET');\n        }\n\n        $this->pos = $this->current = 0;\n\n        // Rewind each stream\n        foreach ($this->streams as $i => $stream) {\n            try {\n                $stream->rewind();\n            } catch (\\Exception $e) {\n                throw new \\RuntimeException('Unable to seek stream '\n                    .$i.' of the AppendStream', 0, $e);\n            }\n        }\n\n        // Seek to the actual position by reading from each stream\n        while ($this->pos < $offset && !$this->eof()) {\n            $result = $this->read(min(8096, $offset - $this->pos));\n            if ($result === '') {\n                break;\n            }\n        }\n    }\n\n    /**\n     * Reads from all of the appended streams until the length is met or EOF.\n     */\n    public function read($length): string\n    {\n        $buffer = '';\n        $total = count($this->streams) - 1;\n        $remaining = $length;\n        $progressToNext = false;\n\n        while ($remaining > 0) {\n            // Progress to the next stream if needed.\n            if ($progressToNext || $this->streams[$this->current]->eof()) {\n                $progressToNext = false;\n                if ($this->current === $total) {\n                    break;\n                }\n                ++$this->current;\n            }\n\n            $result = $this->streams[$this->current]->read($remaining);\n\n            if ($result === '') {\n                $progressToNext = true;\n                continue;\n            }\n\n            $buffer .= $result;\n            $remaining = $length - strlen($buffer);\n        }\n\n        $this->pos += strlen($buffer);\n\n        return $buffer;\n    }\n\n    public function isReadable(): bool\n    {\n        return true;\n    }\n\n    public function isWritable(): bool\n    {\n        return false;\n    }\n\n    public function isSeekable(): bool\n    {\n        return $this->seekable;\n    }\n\n    public function write($string): int\n    {\n        throw new \\RuntimeException('Cannot write to an AppendStream');\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getMetadata($key = null)\n    {\n        return $key ? null : [];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/BufferStream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Provides a buffer stream that can be written to to fill a buffer, and read\n * from to remove bytes from the buffer.\n *\n * This stream returns a \"hwm\" metadata value that tells upstream consumers\n * what the configured high water mark of the stream is, or the maximum\n * preferred size of the buffer.\n */\nfinal class BufferStream implements StreamInterface\n{\n    /** @var int */\n    private $hwm;\n\n    /** @var string */\n    private $buffer = '';\n\n    /**\n     * @param int $hwm High water mark, representing the preferred maximum\n     *                 buffer size. If the size of the buffer exceeds the high\n     *                 water mark, then calls to write will continue to succeed\n     *                 but will return 0 to inform writers to slow down\n     *                 until the buffer has been drained by reading from it.\n     */\n    public function __construct(int $hwm = 16384)\n    {\n        $this->hwm = $hwm;\n    }\n\n    public function __toString(): string\n    {\n        return $this->getContents();\n    }\n\n    public function getContents(): string\n    {\n        $buffer = $this->buffer;\n        $this->buffer = '';\n\n        return $buffer;\n    }\n\n    public function close(): void\n    {\n        $this->buffer = '';\n    }\n\n    public function detach()\n    {\n        $this->close();\n\n        return null;\n    }\n\n    public function getSize(): ?int\n    {\n        return strlen($this->buffer);\n    }\n\n    public function isReadable(): bool\n    {\n        return true;\n    }\n\n    public function isWritable(): bool\n    {\n        return true;\n    }\n\n    public function isSeekable(): bool\n    {\n        return false;\n    }\n\n    public function rewind(): void\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET): void\n    {\n        throw new \\RuntimeException('Cannot seek a BufferStream');\n    }\n\n    public function eof(): bool\n    {\n        return strlen($this->buffer) === 0;\n    }\n\n    public function tell(): int\n    {\n        throw new \\RuntimeException('Cannot determine the position of a BufferStream');\n    }\n\n    /**\n     * Reads data from the buffer.\n     */\n    public function read($length): string\n    {\n        $currentLength = strlen($this->buffer);\n\n        if ($length >= $currentLength) {\n            // No need to slice the buffer because we don't have enough data.\n            $result = $this->buffer;\n            $this->buffer = '';\n        } else {\n            // Slice up the result to provide a subset of the buffer.\n            $result = substr($this->buffer, 0, $length);\n            $this->buffer = substr($this->buffer, $length);\n        }\n\n        return $result;\n    }\n\n    /**\n     * Writes data to the buffer.\n     */\n    public function write($string): int\n    {\n        $this->buffer .= $string;\n\n        if (strlen($this->buffer) >= $this->hwm) {\n            return 0;\n        }\n\n        return strlen($string);\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getMetadata($key = null)\n    {\n        if ($key === 'hwm') {\n            return $this->hwm;\n        }\n\n        return $key ? null : [];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/CachingStream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator that can cache previously read bytes from a sequentially\n * read stream.\n */\nfinal class CachingStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var StreamInterface Stream being wrapped */\n    private $remoteStream;\n\n    /** @var int Number of bytes to skip reading due to a write on the buffer */\n    private $skipReadBytes = 0;\n\n    /**\n     * @var StreamInterface\n     */\n    private $stream;\n\n    /**\n     * We will treat the buffer object as the body of the stream\n     *\n     * @param StreamInterface $stream Stream to cache. The cursor is assumed to be at the beginning of the stream.\n     * @param StreamInterface $target Optionally specify where data is cached\n     */\n    public function __construct(\n        StreamInterface $stream,\n        StreamInterface $target = null\n    ) {\n        $this->remoteStream = $stream;\n        $this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+'));\n    }\n\n    public function getSize(): ?int\n    {\n        $remoteSize = $this->remoteStream->getSize();\n\n        if (null === $remoteSize) {\n            return null;\n        }\n\n        return max($this->stream->getSize(), $remoteSize);\n    }\n\n    public function rewind(): void\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET): void\n    {\n        if ($whence === SEEK_SET) {\n            $byte = $offset;\n        } elseif ($whence === SEEK_CUR) {\n            $byte = $offset + $this->tell();\n        } elseif ($whence === SEEK_END) {\n            $size = $this->remoteStream->getSize();\n            if ($size === null) {\n                $size = $this->cacheEntireStream();\n            }\n            $byte = $size + $offset;\n        } else {\n            throw new \\InvalidArgumentException('Invalid whence');\n        }\n\n        $diff = $byte - $this->stream->getSize();\n\n        if ($diff > 0) {\n            // Read the remoteStream until we have read in at least the amount\n            // of bytes requested, or we reach the end of the file.\n            while ($diff > 0 && !$this->remoteStream->eof()) {\n                $this->read($diff);\n                $diff = $byte - $this->stream->getSize();\n            }\n        } else {\n            // We can just do a normal seek since we've already seen this byte.\n            $this->stream->seek($byte);\n        }\n    }\n\n    public function read($length): string\n    {\n        // Perform a regular read on any previously read data from the buffer\n        $data = $this->stream->read($length);\n        $remaining = $length - strlen($data);\n\n        // More data was requested so read from the remote stream\n        if ($remaining) {\n            // If data was written to the buffer in a position that would have\n            // been filled from the remote stream, then we must skip bytes on\n            // the remote stream to emulate overwriting bytes from that\n            // position. This mimics the behavior of other PHP stream wrappers.\n            $remoteData = $this->remoteStream->read(\n                $remaining + $this->skipReadBytes\n            );\n\n            if ($this->skipReadBytes) {\n                $len = strlen($remoteData);\n                $remoteData = substr($remoteData, $this->skipReadBytes);\n                $this->skipReadBytes = max(0, $this->skipReadBytes - $len);\n            }\n\n            $data .= $remoteData;\n            $this->stream->write($remoteData);\n        }\n\n        return $data;\n    }\n\n    public function write($string): int\n    {\n        // When appending to the end of the currently read stream, you'll want\n        // to skip bytes from being read from the remote stream to emulate\n        // other stream wrappers. Basically replacing bytes of data of a fixed\n        // length.\n        $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell();\n        if ($overflow > 0) {\n            $this->skipReadBytes += $overflow;\n        }\n\n        return $this->stream->write($string);\n    }\n\n    public function eof(): bool\n    {\n        return $this->stream->eof() && $this->remoteStream->eof();\n    }\n\n    /**\n     * Close both the remote stream and buffer stream\n     */\n    public function close(): void\n    {\n        $this->remoteStream->close();\n        $this->stream->close();\n    }\n\n    private function cacheEntireStream(): int\n    {\n        $target = new FnStream(['write' => 'strlen']);\n        Utils::copyToStream($this, $target);\n\n        return $this->tell();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/DroppingStream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator that begins dropping data once the size of the underlying\n * stream becomes too full.\n */\nfinal class DroppingStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var int */\n    private $maxLength;\n\n    /** @var StreamInterface */\n    private $stream;\n\n    /**\n     * @param StreamInterface $stream    Underlying stream to decorate.\n     * @param int             $maxLength Maximum size before dropping data.\n     */\n    public function __construct(StreamInterface $stream, int $maxLength)\n    {\n        $this->stream = $stream;\n        $this->maxLength = $maxLength;\n    }\n\n    public function write($string): int\n    {\n        $diff = $this->maxLength - $this->stream->getSize();\n\n        // Begin returning 0 when the underlying stream is too large.\n        if ($diff <= 0) {\n            return 0;\n        }\n\n        // Write the stream or a subset of the stream if needed.\n        if (strlen($string) < $diff) {\n            return $this->stream->write($string);\n        }\n\n        return $this->stream->write(substr($string, 0, $diff));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7\\Exception;\n\nuse InvalidArgumentException;\n\n/**\n * Exception thrown if a URI cannot be parsed because it's malformed.\n */\nclass MalformedUriException extends InvalidArgumentException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/FnStream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Compose stream implementations based on a hash of functions.\n *\n * Allows for easy testing and extension of a provided stream without needing\n * to create a concrete class for a simple extension point.\n */\n#[\\AllowDynamicProperties]\nfinal class FnStream implements StreamInterface\n{\n    private const SLOTS = [\n        '__toString', 'close', 'detach', 'rewind',\n        'getSize', 'tell', 'eof', 'isSeekable', 'seek', 'isWritable', 'write',\n        'isReadable', 'read', 'getContents', 'getMetadata',\n    ];\n\n    /** @var array<string, callable> */\n    private $methods;\n\n    /**\n     * @param array<string, callable> $methods Hash of method name to a callable.\n     */\n    public function __construct(array $methods)\n    {\n        $this->methods = $methods;\n\n        // Create the functions on the class\n        foreach ($methods as $name => $fn) {\n            $this->{'_fn_'.$name} = $fn;\n        }\n    }\n\n    /**\n     * Lazily determine which methods are not implemented.\n     *\n     * @throws \\BadMethodCallException\n     */\n    public function __get(string $name): void\n    {\n        throw new \\BadMethodCallException(str_replace('_fn_', '', $name)\n            .'() is not implemented in the FnStream');\n    }\n\n    /**\n     * The close method is called on the underlying stream only if possible.\n     */\n    public function __destruct()\n    {\n        if (isset($this->_fn_close)) {\n            ($this->_fn_close)();\n        }\n    }\n\n    /**\n     * An unserialize would allow the __destruct to run when the unserialized value goes out of scope.\n     *\n     * @throws \\LogicException\n     */\n    public function __wakeup(): void\n    {\n        throw new \\LogicException('FnStream should never be unserialized');\n    }\n\n    /**\n     * Adds custom functionality to an underlying stream by intercepting\n     * specific method calls.\n     *\n     * @param StreamInterface         $stream  Stream to decorate\n     * @param array<string, callable> $methods Hash of method name to a closure\n     *\n     * @return FnStream\n     */\n    public static function decorate(StreamInterface $stream, array $methods)\n    {\n        // If any of the required methods were not provided, then simply\n        // proxy to the decorated stream.\n        foreach (array_diff(self::SLOTS, array_keys($methods)) as $diff) {\n            /** @var callable $callable */\n            $callable = [$stream, $diff];\n            $methods[$diff] = $callable;\n        }\n\n        return new self($methods);\n    }\n\n    public function __toString(): string\n    {\n        try {\n            /** @var string */\n            return ($this->_fn___toString)();\n        } catch (\\Throwable $e) {\n            if (\\PHP_VERSION_ID >= 70400) {\n                throw $e;\n            }\n            trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);\n\n            return '';\n        }\n    }\n\n    public function close(): void\n    {\n        ($this->_fn_close)();\n    }\n\n    public function detach()\n    {\n        return ($this->_fn_detach)();\n    }\n\n    public function getSize(): ?int\n    {\n        return ($this->_fn_getSize)();\n    }\n\n    public function tell(): int\n    {\n        return ($this->_fn_tell)();\n    }\n\n    public function eof(): bool\n    {\n        return ($this->_fn_eof)();\n    }\n\n    public function isSeekable(): bool\n    {\n        return ($this->_fn_isSeekable)();\n    }\n\n    public function rewind(): void\n    {\n        ($this->_fn_rewind)();\n    }\n\n    public function seek($offset, $whence = SEEK_SET): void\n    {\n        ($this->_fn_seek)($offset, $whence);\n    }\n\n    public function isWritable(): bool\n    {\n        return ($this->_fn_isWritable)();\n    }\n\n    public function write($string): int\n    {\n        return ($this->_fn_write)($string);\n    }\n\n    public function isReadable(): bool\n    {\n        return ($this->_fn_isReadable)();\n    }\n\n    public function read($length): string\n    {\n        return ($this->_fn_read)($length);\n    }\n\n    public function getContents(): string\n    {\n        return ($this->_fn_getContents)();\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getMetadata($key = null)\n    {\n        return ($this->_fn_getMetadata)($key);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/Header.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nfinal class Header\n{\n    /**\n     * Parse an array of header values containing \";\" separated data into an\n     * array of associative arrays representing the header key value pair data\n     * of the header. When a parameter does not contain a value, but just\n     * contains a key, this function will inject a key with a '' string value.\n     *\n     * @param string|array $header Header to parse into components.\n     */\n    public static function parse($header): array\n    {\n        static $trimmed = \"\\\"'  \\n\\t\\r\";\n        $params = $matches = [];\n\n        foreach ((array) $header as $value) {\n            foreach (self::splitList($value) as $val) {\n                $part = [];\n                foreach (preg_split('/;(?=([^\"]*\"[^\"]*\")*[^\"]*$)/', $val) ?: [] as $kvp) {\n                    if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {\n                        $m = $matches[0];\n                        if (isset($m[1])) {\n                            $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed);\n                        } else {\n                            $part[] = trim($m[0], $trimmed);\n                        }\n                    }\n                }\n                if ($part) {\n                    $params[] = $part;\n                }\n            }\n        }\n\n        return $params;\n    }\n\n    /**\n     * Converts an array of header values that may contain comma separated\n     * headers into an array of headers with no comma separated values.\n     *\n     * @param string|array $header Header to normalize.\n     *\n     * @deprecated Use self::splitList() instead.\n     */\n    public static function normalize($header): array\n    {\n        $result = [];\n        foreach ((array) $header as $value) {\n            foreach (self::splitList($value) as $parsed) {\n                $result[] = $parsed;\n            }\n        }\n\n        return $result;\n    }\n\n    /**\n     * Splits a HTTP header defined to contain a comma-separated list into\n     * each individual value. Empty values will be removed.\n     *\n     * Example headers include 'accept', 'cache-control' and 'if-none-match'.\n     *\n     * This method must not be used to parse headers that are not defined as\n     * a list, such as 'user-agent' or 'set-cookie'.\n     *\n     * @param string|string[] $values Header value as returned by MessageInterface::getHeader()\n     *\n     * @return string[]\n     */\n    public static function splitList($values): array\n    {\n        if (!\\is_array($values)) {\n            $values = [$values];\n        }\n\n        $result = [];\n        foreach ($values as $value) {\n            if (!\\is_string($value)) {\n                throw new \\TypeError('$header must either be a string or an array containing strings.');\n            }\n\n            $v = '';\n            $isQuoted = false;\n            $isEscaped = false;\n            for ($i = 0, $max = \\strlen($value); $i < $max; ++$i) {\n                if ($isEscaped) {\n                    $v .= $value[$i];\n                    $isEscaped = false;\n\n                    continue;\n                }\n\n                if (!$isQuoted && $value[$i] === ',') {\n                    $v = \\trim($v);\n                    if ($v !== '') {\n                        $result[] = $v;\n                    }\n\n                    $v = '';\n                    continue;\n                }\n\n                if ($isQuoted && $value[$i] === '\\\\') {\n                    $isEscaped = true;\n                    $v .= $value[$i];\n\n                    continue;\n                }\n                if ($value[$i] === '\"') {\n                    $isQuoted = !$isQuoted;\n                    $v .= $value[$i];\n\n                    continue;\n                }\n\n                $v .= $value[$i];\n            }\n\n            $v = \\trim($v);\n            if ($v !== '') {\n                $result[] = $v;\n            }\n        }\n\n        return $result;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/HttpFactory.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\RequestFactoryInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseFactoryInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\ServerRequestFactoryInterface;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Psr\\Http\\Message\\StreamFactoryInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UploadedFileFactoryInterface;\nuse Psr\\Http\\Message\\UploadedFileInterface;\nuse Psr\\Http\\Message\\UriFactoryInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Implements all of the PSR-17 interfaces.\n *\n * Note: in consuming code it is recommended to require the implemented interfaces\n * and inject the instance of this class multiple times.\n */\nfinal class HttpFactory implements RequestFactoryInterface, ResponseFactoryInterface, ServerRequestFactoryInterface, StreamFactoryInterface, UploadedFileFactoryInterface, UriFactoryInterface\n{\n    public function createUploadedFile(\n        StreamInterface $stream,\n        int $size = null,\n        int $error = \\UPLOAD_ERR_OK,\n        string $clientFilename = null,\n        string $clientMediaType = null\n    ): UploadedFileInterface {\n        if ($size === null) {\n            $size = $stream->getSize();\n        }\n\n        return new UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType);\n    }\n\n    public function createStream(string $content = ''): StreamInterface\n    {\n        return Utils::streamFor($content);\n    }\n\n    public function createStreamFromFile(string $file, string $mode = 'r'): StreamInterface\n    {\n        try {\n            $resource = Utils::tryFopen($file, $mode);\n        } catch (\\RuntimeException $e) {\n            if ('' === $mode || false === \\in_array($mode[0], ['r', 'w', 'a', 'x', 'c'], true)) {\n                throw new \\InvalidArgumentException(sprintf('Invalid file opening mode \"%s\"', $mode), 0, $e);\n            }\n\n            throw $e;\n        }\n\n        return Utils::streamFor($resource);\n    }\n\n    public function createStreamFromResource($resource): StreamInterface\n    {\n        return Utils::streamFor($resource);\n    }\n\n    public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface\n    {\n        if (empty($method)) {\n            if (!empty($serverParams['REQUEST_METHOD'])) {\n                $method = $serverParams['REQUEST_METHOD'];\n            } else {\n                throw new \\InvalidArgumentException('Cannot determine HTTP method');\n            }\n        }\n\n        return new ServerRequest($method, $uri, [], null, '1.1', $serverParams);\n    }\n\n    public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface\n    {\n        return new Response($code, [], null, '1.1', $reasonPhrase);\n    }\n\n    public function createRequest(string $method, $uri): RequestInterface\n    {\n        return new Request($method, $uri);\n    }\n\n    public function createUri(string $uri = ''): UriInterface\n    {\n        return new Uri($uri);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/InflateStream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Uses PHP's zlib.inflate filter to inflate zlib (HTTP deflate, RFC1950) or gzipped (RFC1952) content.\n *\n * This stream decorator converts the provided stream to a PHP stream resource,\n * then appends the zlib.inflate filter. The stream is then converted back\n * to a Guzzle stream resource to be used as a Guzzle stream.\n *\n * @see https://datatracker.ietf.org/doc/html/rfc1950\n * @see https://datatracker.ietf.org/doc/html/rfc1952\n * @see https://www.php.net/manual/en/filters.compression.php\n */\nfinal class InflateStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var StreamInterface */\n    private $stream;\n\n    public function __construct(StreamInterface $stream)\n    {\n        $resource = StreamWrapper::getResource($stream);\n        // Specify window=15+32, so zlib will use header detection to both gzip (with header) and zlib data\n        // See https://www.zlib.net/manual.html#Advanced definition of inflateInit2\n        // \"Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection\"\n        // Default window size is 15.\n        stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15 + 32]);\n        $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/LazyOpenStream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Lazily reads or writes to a file that is opened only after an IO operation\n * take place on the stream.\n */\nfinal class LazyOpenStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var string */\n    private $filename;\n\n    /** @var string */\n    private $mode;\n\n    /**\n     * @var StreamInterface\n     */\n    private $stream;\n\n    /**\n     * @param string $filename File to lazily open\n     * @param string $mode     fopen mode to use when opening the stream\n     */\n    public function __construct(string $filename, string $mode)\n    {\n        $this->filename = $filename;\n        $this->mode = $mode;\n\n        // unsetting the property forces the first access to go through\n        // __get().\n        unset($this->stream);\n    }\n\n    /**\n     * Creates the underlying stream lazily when required.\n     */\n    protected function createStream(): StreamInterface\n    {\n        return Utils::streamFor(Utils::tryFopen($this->filename, $this->mode));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/LimitStream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Decorator used to return only a subset of a stream.\n */\nfinal class LimitStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var int Offset to start reading from */\n    private $offset;\n\n    /** @var int Limit the number of bytes that can be read */\n    private $limit;\n\n    /** @var StreamInterface */\n    private $stream;\n\n    /**\n     * @param StreamInterface $stream Stream to wrap\n     * @param int             $limit  Total number of bytes to allow to be read\n     *                                from the stream. Pass -1 for no limit.\n     * @param int             $offset Position to seek to before reading (only\n     *                                works on seekable streams).\n     */\n    public function __construct(\n        StreamInterface $stream,\n        int $limit = -1,\n        int $offset = 0\n    ) {\n        $this->stream = $stream;\n        $this->setLimit($limit);\n        $this->setOffset($offset);\n    }\n\n    public function eof(): bool\n    {\n        // Always return true if the underlying stream is EOF\n        if ($this->stream->eof()) {\n            return true;\n        }\n\n        // No limit and the underlying stream is not at EOF\n        if ($this->limit === -1) {\n            return false;\n        }\n\n        return $this->stream->tell() >= $this->offset + $this->limit;\n    }\n\n    /**\n     * Returns the size of the limited subset of data\n     */\n    public function getSize(): ?int\n    {\n        if (null === ($length = $this->stream->getSize())) {\n            return null;\n        } elseif ($this->limit === -1) {\n            return $length - $this->offset;\n        } else {\n            return min($this->limit, $length - $this->offset);\n        }\n    }\n\n    /**\n     * Allow for a bounded seek on the read limited stream\n     */\n    public function seek($offset, $whence = SEEK_SET): void\n    {\n        if ($whence !== SEEK_SET || $offset < 0) {\n            throw new \\RuntimeException(sprintf(\n                'Cannot seek to offset %s with whence %s',\n                $offset,\n                $whence\n            ));\n        }\n\n        $offset += $this->offset;\n\n        if ($this->limit !== -1) {\n            if ($offset > $this->offset + $this->limit) {\n                $offset = $this->offset + $this->limit;\n            }\n        }\n\n        $this->stream->seek($offset);\n    }\n\n    /**\n     * Give a relative tell()\n     */\n    public function tell(): int\n    {\n        return $this->stream->tell() - $this->offset;\n    }\n\n    /**\n     * Set the offset to start limiting from\n     *\n     * @param int $offset Offset to seek to and begin byte limiting from\n     *\n     * @throws \\RuntimeException if the stream cannot be seeked.\n     */\n    public function setOffset(int $offset): void\n    {\n        $current = $this->stream->tell();\n\n        if ($current !== $offset) {\n            // If the stream cannot seek to the offset position, then read to it\n            if ($this->stream->isSeekable()) {\n                $this->stream->seek($offset);\n            } elseif ($current > $offset) {\n                throw new \\RuntimeException(\"Could not seek to stream offset $offset\");\n            } else {\n                $this->stream->read($offset - $current);\n            }\n        }\n\n        $this->offset = $offset;\n    }\n\n    /**\n     * Set the limit of bytes that the decorator allows to be read from the\n     * stream.\n     *\n     * @param int $limit Number of bytes to allow to be read from the stream.\n     *                   Use -1 for no limit.\n     */\n    public function setLimit(int $limit): void\n    {\n        $this->limit = $limit;\n    }\n\n    public function read($length): string\n    {\n        if ($this->limit === -1) {\n            return $this->stream->read($length);\n        }\n\n        // Check if the current position is less than the total allowed\n        // bytes + original offset\n        $remaining = ($this->offset + $this->limit) - $this->stream->tell();\n        if ($remaining > 0) {\n            // Only return the amount of requested data, ensuring that the byte\n            // limit is not exceeded\n            return $this->stream->read(min($remaining, $length));\n        }\n\n        return '';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/Message.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nfinal class Message\n{\n    /**\n     * Returns the string representation of an HTTP message.\n     *\n     * @param MessageInterface $message Message to convert to a string.\n     */\n    public static function toString(MessageInterface $message): string\n    {\n        if ($message instanceof RequestInterface) {\n            $msg = trim($message->getMethod().' '\n                    .$message->getRequestTarget())\n                .' HTTP/'.$message->getProtocolVersion();\n            if (!$message->hasHeader('host')) {\n                $msg .= \"\\r\\nHost: \".$message->getUri()->getHost();\n            }\n        } elseif ($message instanceof ResponseInterface) {\n            $msg = 'HTTP/'.$message->getProtocolVersion().' '\n                .$message->getStatusCode().' '\n                .$message->getReasonPhrase();\n        } else {\n            throw new \\InvalidArgumentException('Unknown message type');\n        }\n\n        foreach ($message->getHeaders() as $name => $values) {\n            if (is_string($name) && strtolower($name) === 'set-cookie') {\n                foreach ($values as $value) {\n                    $msg .= \"\\r\\n{$name}: \".$value;\n                }\n            } else {\n                $msg .= \"\\r\\n{$name}: \".implode(', ', $values);\n            }\n        }\n\n        return \"{$msg}\\r\\n\\r\\n\".$message->getBody();\n    }\n\n    /**\n     * Get a short summary of the message body.\n     *\n     * Will return `null` if the response is not printable.\n     *\n     * @param MessageInterface $message    The message to get the body summary\n     * @param int              $truncateAt The maximum allowed size of the summary\n     */\n    public static function bodySummary(MessageInterface $message, int $truncateAt = 120): ?string\n    {\n        $body = $message->getBody();\n\n        if (!$body->isSeekable() || !$body->isReadable()) {\n            return null;\n        }\n\n        $size = $body->getSize();\n\n        if ($size === 0) {\n            return null;\n        }\n\n        $body->rewind();\n        $summary = $body->read($truncateAt);\n        $body->rewind();\n\n        if ($size > $truncateAt) {\n            $summary .= ' (truncated...)';\n        }\n\n        // Matches any printable character, including unicode characters:\n        // letters, marks, numbers, punctuation, spacing, and separators.\n        if (preg_match('/[^\\pL\\pM\\pN\\pP\\pS\\pZ\\n\\r\\t]/u', $summary) !== 0) {\n            return null;\n        }\n\n        return $summary;\n    }\n\n    /**\n     * Attempts to rewind a message body and throws an exception on failure.\n     *\n     * The body of the message will only be rewound if a call to `tell()`\n     * returns a value other than `0`.\n     *\n     * @param MessageInterface $message Message to rewind\n     *\n     * @throws \\RuntimeException\n     */\n    public static function rewindBody(MessageInterface $message): void\n    {\n        $body = $message->getBody();\n\n        if ($body->tell()) {\n            $body->rewind();\n        }\n    }\n\n    /**\n     * Parses an HTTP message into an associative array.\n     *\n     * The array contains the \"start-line\" key containing the start line of\n     * the message, \"headers\" key containing an associative array of header\n     * array values, and a \"body\" key containing the body of the message.\n     *\n     * @param string $message HTTP request or response to parse.\n     */\n    public static function parseMessage(string $message): array\n    {\n        if (!$message) {\n            throw new \\InvalidArgumentException('Invalid message');\n        }\n\n        $message = ltrim($message, \"\\r\\n\");\n\n        $messageParts = preg_split(\"/\\r?\\n\\r?\\n/\", $message, 2);\n\n        if ($messageParts === false || count($messageParts) !== 2) {\n            throw new \\InvalidArgumentException('Invalid message: Missing header delimiter');\n        }\n\n        [$rawHeaders, $body] = $messageParts;\n        $rawHeaders .= \"\\r\\n\"; // Put back the delimiter we split previously\n        $headerParts = preg_split(\"/\\r?\\n/\", $rawHeaders, 2);\n\n        if ($headerParts === false || count($headerParts) !== 2) {\n            throw new \\InvalidArgumentException('Invalid message: Missing status line');\n        }\n\n        [$startLine, $rawHeaders] = $headerParts;\n\n        if (preg_match(\"/(?:^HTTP\\/|^[A-Z]+ \\S+ HTTP\\/)(\\d+(?:\\.\\d+)?)/i\", $startLine, $matches) && $matches[1] === '1.0') {\n            // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0\n            $rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders);\n        }\n\n        /** @var array[] $headerLines */\n        $count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER);\n\n        // If these aren't the same, then one line didn't match and there's an invalid header.\n        if ($count !== substr_count($rawHeaders, \"\\n\")) {\n            // Folding is deprecated, see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4\n            if (preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) {\n                throw new \\InvalidArgumentException('Invalid header syntax: Obsolete line folding');\n            }\n\n            throw new \\InvalidArgumentException('Invalid header syntax');\n        }\n\n        $headers = [];\n\n        foreach ($headerLines as $headerLine) {\n            $headers[$headerLine[1]][] = $headerLine[2];\n        }\n\n        return [\n            'start-line' => $startLine,\n            'headers' => $headers,\n            'body' => $body,\n        ];\n    }\n\n    /**\n     * Constructs a URI for an HTTP request message.\n     *\n     * @param string $path    Path from the start-line\n     * @param array  $headers Array of headers (each value an array).\n     */\n    public static function parseRequestUri(string $path, array $headers): string\n    {\n        $hostKey = array_filter(array_keys($headers), function ($k) {\n            // Numeric array keys are converted to int by PHP.\n            $k = (string) $k;\n\n            return strtolower($k) === 'host';\n        });\n\n        // If no host is found, then a full URI cannot be constructed.\n        if (!$hostKey) {\n            return $path;\n        }\n\n        $host = $headers[reset($hostKey)][0];\n        $scheme = substr($host, -4) === ':443' ? 'https' : 'http';\n\n        return $scheme.'://'.$host.'/'.ltrim($path, '/');\n    }\n\n    /**\n     * Parses a request message string into a request object.\n     *\n     * @param string $message Request message string.\n     */\n    public static function parseRequest(string $message): RequestInterface\n    {\n        $data = self::parseMessage($message);\n        $matches = [];\n        if (!preg_match('/^[\\S]+\\s+([a-zA-Z]+:\\/\\/|\\/).*/', $data['start-line'], $matches)) {\n            throw new \\InvalidArgumentException('Invalid request string');\n        }\n        $parts = explode(' ', $data['start-line'], 3);\n        $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1';\n\n        $request = new Request(\n            $parts[0],\n            $matches[1] === '/' ? self::parseRequestUri($parts[1], $data['headers']) : $parts[1],\n            $data['headers'],\n            $data['body'],\n            $version\n        );\n\n        return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]);\n    }\n\n    /**\n     * Parses a response message string into a response object.\n     *\n     * @param string $message Response message string.\n     */\n    public static function parseResponse(string $message): ResponseInterface\n    {\n        $data = self::parseMessage($message);\n        // According to https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2\n        // the space between status-code and reason-phrase is required. But\n        // browsers accept responses without space and reason as well.\n        if (!preg_match('/^HTTP\\/.* [0-9]{3}( .*|$)/', $data['start-line'])) {\n            throw new \\InvalidArgumentException('Invalid response string: '.$data['start-line']);\n        }\n        $parts = explode(' ', $data['start-line'], 3);\n\n        return new Response(\n            (int) $parts[1],\n            $data['headers'],\n            $data['body'],\n            explode('/', $parts[0])[1],\n            $parts[2] ?? null\n        );\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/MessageTrait.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Trait implementing functionality common to requests and responses.\n */\ntrait MessageTrait\n{\n    /** @var string[][] Map of all registered headers, as original name => array of values */\n    private $headers = [];\n\n    /** @var string[] Map of lowercase header name => original name at registration */\n    private $headerNames = [];\n\n    /** @var string */\n    private $protocol = '1.1';\n\n    /** @var StreamInterface|null */\n    private $stream;\n\n    public function getProtocolVersion(): string\n    {\n        return $this->protocol;\n    }\n\n    public function withProtocolVersion($version): MessageInterface\n    {\n        if ($this->protocol === $version) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->protocol = $version;\n\n        return $new;\n    }\n\n    public function getHeaders(): array\n    {\n        return $this->headers;\n    }\n\n    public function hasHeader($header): bool\n    {\n        return isset($this->headerNames[strtolower($header)]);\n    }\n\n    public function getHeader($header): array\n    {\n        $header = strtolower($header);\n\n        if (!isset($this->headerNames[$header])) {\n            return [];\n        }\n\n        $header = $this->headerNames[$header];\n\n        return $this->headers[$header];\n    }\n\n    public function getHeaderLine($header): string\n    {\n        return implode(', ', $this->getHeader($header));\n    }\n\n    public function withHeader($header, $value): MessageInterface\n    {\n        $this->assertHeader($header);\n        $value = $this->normalizeHeaderValue($value);\n        $normalized = strtolower($header);\n\n        $new = clone $this;\n        if (isset($new->headerNames[$normalized])) {\n            unset($new->headers[$new->headerNames[$normalized]]);\n        }\n        $new->headerNames[$normalized] = $header;\n        $new->headers[$header] = $value;\n\n        return $new;\n    }\n\n    public function withAddedHeader($header, $value): MessageInterface\n    {\n        $this->assertHeader($header);\n        $value = $this->normalizeHeaderValue($value);\n        $normalized = strtolower($header);\n\n        $new = clone $this;\n        if (isset($new->headerNames[$normalized])) {\n            $header = $this->headerNames[$normalized];\n            $new->headers[$header] = array_merge($this->headers[$header], $value);\n        } else {\n            $new->headerNames[$normalized] = $header;\n            $new->headers[$header] = $value;\n        }\n\n        return $new;\n    }\n\n    public function withoutHeader($header): MessageInterface\n    {\n        $normalized = strtolower($header);\n\n        if (!isset($this->headerNames[$normalized])) {\n            return $this;\n        }\n\n        $header = $this->headerNames[$normalized];\n\n        $new = clone $this;\n        unset($new->headers[$header], $new->headerNames[$normalized]);\n\n        return $new;\n    }\n\n    public function getBody(): StreamInterface\n    {\n        if (!$this->stream) {\n            $this->stream = Utils::streamFor('');\n        }\n\n        return $this->stream;\n    }\n\n    public function withBody(StreamInterface $body): MessageInterface\n    {\n        if ($body === $this->stream) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->stream = $body;\n\n        return $new;\n    }\n\n    /**\n     * @param (string|string[])[] $headers\n     */\n    private function setHeaders(array $headers): void\n    {\n        $this->headerNames = $this->headers = [];\n        foreach ($headers as $header => $value) {\n            // Numeric array keys are converted to int by PHP.\n            $header = (string) $header;\n\n            $this->assertHeader($header);\n            $value = $this->normalizeHeaderValue($value);\n            $normalized = strtolower($header);\n            if (isset($this->headerNames[$normalized])) {\n                $header = $this->headerNames[$normalized];\n                $this->headers[$header] = array_merge($this->headers[$header], $value);\n            } else {\n                $this->headerNames[$normalized] = $header;\n                $this->headers[$header] = $value;\n            }\n        }\n    }\n\n    /**\n     * @param mixed $value\n     *\n     * @return string[]\n     */\n    private function normalizeHeaderValue($value): array\n    {\n        if (!is_array($value)) {\n            return $this->trimAndValidateHeaderValues([$value]);\n        }\n\n        if (count($value) === 0) {\n            throw new \\InvalidArgumentException('Header value can not be an empty array.');\n        }\n\n        return $this->trimAndValidateHeaderValues($value);\n    }\n\n    /**\n     * Trims whitespace from the header values.\n     *\n     * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field.\n     *\n     * header-field = field-name \":\" OWS field-value OWS\n     * OWS          = *( SP / HTAB )\n     *\n     * @param mixed[] $values Header values\n     *\n     * @return string[] Trimmed header values\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4\n     */\n    private function trimAndValidateHeaderValues(array $values): array\n    {\n        return array_map(function ($value) {\n            if (!is_scalar($value) && null !== $value) {\n                throw new \\InvalidArgumentException(sprintf(\n                    'Header value must be scalar or null but %s provided.',\n                    is_object($value) ? get_class($value) : gettype($value)\n                ));\n            }\n\n            $trimmed = trim((string) $value, \" \\t\");\n            $this->assertValue($trimmed);\n\n            return $trimmed;\n        }, array_values($values));\n    }\n\n    /**\n     * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2\n     *\n     * @param mixed $header\n     */\n    private function assertHeader($header): void\n    {\n        if (!is_string($header)) {\n            throw new \\InvalidArgumentException(sprintf(\n                'Header name must be a string but %s provided.',\n                is_object($header) ? get_class($header) : gettype($header)\n            ));\n        }\n\n        if (!preg_match('/^[a-zA-Z0-9\\'`#$%&*+.^_|~!-]+$/D', $header)) {\n            throw new \\InvalidArgumentException(\n                sprintf('\"%s\" is not valid header name.', $header)\n            );\n        }\n    }\n\n    /**\n     * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2\n     *\n     * field-value    = *( field-content / obs-fold )\n     * field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n     * field-vchar    = VCHAR / obs-text\n     * VCHAR          = %x21-7E\n     * obs-text       = %x80-FF\n     * obs-fold       = CRLF 1*( SP / HTAB )\n     */\n    private function assertValue(string $value): void\n    {\n        // The regular expression intentionally does not support the obs-fold production, because as\n        // per RFC 7230#3.2.4:\n        //\n        // A sender MUST NOT generate a message that includes\n        // line folding (i.e., that has any field-value that contains a match to\n        // the obs-fold rule) unless the message is intended for packaging\n        // within the message/http media type.\n        //\n        // Clients must not send a request with line folding and a server sending folded headers is\n        // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting\n        // folding is not likely to break any legitimate use case.\n        if (!preg_match('/^[\\x20\\x09\\x21-\\x7E\\x80-\\xFF]*$/D', $value)) {\n            throw new \\InvalidArgumentException(\n                sprintf('\"%s\" is not valid header value.', $value)\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/MimeType.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nfinal class MimeType\n{\n    private const MIME_TYPES = [\n        '1km' => 'application/vnd.1000minds.decision-model+xml',\n        '3dml' => 'text/vnd.in3d.3dml',\n        '3ds' => 'image/x-3ds',\n        '3g2' => 'video/3gpp2',\n        '3gp' => 'video/3gp',\n        '3gpp' => 'video/3gpp',\n        '3mf' => 'model/3mf',\n        '7z' => 'application/x-7z-compressed',\n        '7zip' => 'application/x-7z-compressed',\n        '123' => 'application/vnd.lotus-1-2-3',\n        'aab' => 'application/x-authorware-bin',\n        'aac' => 'audio/aac',\n        'aam' => 'application/x-authorware-map',\n        'aas' => 'application/x-authorware-seg',\n        'abw' => 'application/x-abiword',\n        'ac' => 'application/vnd.nokia.n-gage.ac+xml',\n        'ac3' => 'audio/ac3',\n        'acc' => 'application/vnd.americandynamics.acc',\n        'ace' => 'application/x-ace-compressed',\n        'acu' => 'application/vnd.acucobol',\n        'acutc' => 'application/vnd.acucorp',\n        'adp' => 'audio/adpcm',\n        'adts' => 'audio/aac',\n        'aep' => 'application/vnd.audiograph',\n        'afm' => 'application/x-font-type1',\n        'afp' => 'application/vnd.ibm.modcap',\n        'age' => 'application/vnd.age',\n        'ahead' => 'application/vnd.ahead.space',\n        'ai' => 'application/pdf',\n        'aif' => 'audio/x-aiff',\n        'aifc' => 'audio/x-aiff',\n        'aiff' => 'audio/x-aiff',\n        'air' => 'application/vnd.adobe.air-application-installer-package+zip',\n        'ait' => 'application/vnd.dvb.ait',\n        'ami' => 'application/vnd.amiga.ami',\n        'aml' => 'application/automationml-aml+xml',\n        'amlx' => 'application/automationml-amlx+zip',\n        'amr' => 'audio/amr',\n        'apk' => 'application/vnd.android.package-archive',\n        'apng' => 'image/apng',\n        'appcache' => 'text/cache-manifest',\n        'appinstaller' => 'application/appinstaller',\n        'application' => 'application/x-ms-application',\n        'appx' => 'application/appx',\n        'appxbundle' => 'application/appxbundle',\n        'apr' => 'application/vnd.lotus-approach',\n        'arc' => 'application/x-freearc',\n        'arj' => 'application/x-arj',\n        'asc' => 'application/pgp-signature',\n        'asf' => 'video/x-ms-asf',\n        'asm' => 'text/x-asm',\n        'aso' => 'application/vnd.accpac.simply.aso',\n        'asx' => 'video/x-ms-asf',\n        'atc' => 'application/vnd.acucorp',\n        'atom' => 'application/atom+xml',\n        'atomcat' => 'application/atomcat+xml',\n        'atomdeleted' => 'application/atomdeleted+xml',\n        'atomsvc' => 'application/atomsvc+xml',\n        'atx' => 'application/vnd.antix.game-component',\n        'au' => 'audio/x-au',\n        'avci' => 'image/avci',\n        'avcs' => 'image/avcs',\n        'avi' => 'video/x-msvideo',\n        'avif' => 'image/avif',\n        'aw' => 'application/applixware',\n        'azf' => 'application/vnd.airzip.filesecure.azf',\n        'azs' => 'application/vnd.airzip.filesecure.azs',\n        'azv' => 'image/vnd.airzip.accelerator.azv',\n        'azw' => 'application/vnd.amazon.ebook',\n        'b16' => 'image/vnd.pco.b16',\n        'bat' => 'application/x-msdownload',\n        'bcpio' => 'application/x-bcpio',\n        'bdf' => 'application/x-font-bdf',\n        'bdm' => 'application/vnd.syncml.dm+wbxml',\n        'bdoc' => 'application/x-bdoc',\n        'bed' => 'application/vnd.realvnc.bed',\n        'bh2' => 'application/vnd.fujitsu.oasysprs',\n        'bin' => 'application/octet-stream',\n        'blb' => 'application/x-blorb',\n        'blorb' => 'application/x-blorb',\n        'bmi' => 'application/vnd.bmi',\n        'bmml' => 'application/vnd.balsamiq.bmml+xml',\n        'bmp' => 'image/bmp',\n        'book' => 'application/vnd.framemaker',\n        'box' => 'application/vnd.previewsystems.box',\n        'boz' => 'application/x-bzip2',\n        'bpk' => 'application/octet-stream',\n        'bpmn' => 'application/octet-stream',\n        'bsp' => 'model/vnd.valve.source.compiled-map',\n        'btf' => 'image/prs.btif',\n        'btif' => 'image/prs.btif',\n        'buffer' => 'application/octet-stream',\n        'bz' => 'application/x-bzip',\n        'bz2' => 'application/x-bzip2',\n        'c' => 'text/x-c',\n        'c4d' => 'application/vnd.clonk.c4group',\n        'c4f' => 'application/vnd.clonk.c4group',\n        'c4g' => 'application/vnd.clonk.c4group',\n        'c4p' => 'application/vnd.clonk.c4group',\n        'c4u' => 'application/vnd.clonk.c4group',\n        'c11amc' => 'application/vnd.cluetrust.cartomobile-config',\n        'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg',\n        'cab' => 'application/vnd.ms-cab-compressed',\n        'caf' => 'audio/x-caf',\n        'cap' => 'application/vnd.tcpdump.pcap',\n        'car' => 'application/vnd.curl.car',\n        'cat' => 'application/vnd.ms-pki.seccat',\n        'cb7' => 'application/x-cbr',\n        'cba' => 'application/x-cbr',\n        'cbr' => 'application/x-cbr',\n        'cbt' => 'application/x-cbr',\n        'cbz' => 'application/x-cbr',\n        'cc' => 'text/x-c',\n        'cco' => 'application/x-cocoa',\n        'cct' => 'application/x-director',\n        'ccxml' => 'application/ccxml+xml',\n        'cdbcmsg' => 'application/vnd.contact.cmsg',\n        'cdf' => 'application/x-netcdf',\n        'cdfx' => 'application/cdfx+xml',\n        'cdkey' => 'application/vnd.mediastation.cdkey',\n        'cdmia' => 'application/cdmi-capability',\n        'cdmic' => 'application/cdmi-container',\n        'cdmid' => 'application/cdmi-domain',\n        'cdmio' => 'application/cdmi-object',\n        'cdmiq' => 'application/cdmi-queue',\n        'cdr' => 'application/cdr',\n        'cdx' => 'chemical/x-cdx',\n        'cdxml' => 'application/vnd.chemdraw+xml',\n        'cdy' => 'application/vnd.cinderella',\n        'cer' => 'application/pkix-cert',\n        'cfs' => 'application/x-cfs-compressed',\n        'cgm' => 'image/cgm',\n        'chat' => 'application/x-chat',\n        'chm' => 'application/vnd.ms-htmlhelp',\n        'chrt' => 'application/vnd.kde.kchart',\n        'cif' => 'chemical/x-cif',\n        'cii' => 'application/vnd.anser-web-certificate-issue-initiation',\n        'cil' => 'application/vnd.ms-artgalry',\n        'cjs' => 'application/node',\n        'cla' => 'application/vnd.claymore',\n        'class' => 'application/octet-stream',\n        'cld' => 'model/vnd.cld',\n        'clkk' => 'application/vnd.crick.clicker.keyboard',\n        'clkp' => 'application/vnd.crick.clicker.palette',\n        'clkt' => 'application/vnd.crick.clicker.template',\n        'clkw' => 'application/vnd.crick.clicker.wordbank',\n        'clkx' => 'application/vnd.crick.clicker',\n        'clp' => 'application/x-msclip',\n        'cmc' => 'application/vnd.cosmocaller',\n        'cmdf' => 'chemical/x-cmdf',\n        'cml' => 'chemical/x-cml',\n        'cmp' => 'application/vnd.yellowriver-custom-menu',\n        'cmx' => 'image/x-cmx',\n        'cod' => 'application/vnd.rim.cod',\n        'coffee' => 'text/coffeescript',\n        'com' => 'application/x-msdownload',\n        'conf' => 'text/plain',\n        'cpio' => 'application/x-cpio',\n        'cpl' => 'application/cpl+xml',\n        'cpp' => 'text/x-c',\n        'cpt' => 'application/mac-compactpro',\n        'crd' => 'application/x-mscardfile',\n        'crl' => 'application/pkix-crl',\n        'crt' => 'application/x-x509-ca-cert',\n        'crx' => 'application/x-chrome-extension',\n        'cryptonote' => 'application/vnd.rig.cryptonote',\n        'csh' => 'application/x-csh',\n        'csl' => 'application/vnd.citationstyles.style+xml',\n        'csml' => 'chemical/x-csml',\n        'csp' => 'application/vnd.commonspace',\n        'csr' => 'application/octet-stream',\n        'css' => 'text/css',\n        'cst' => 'application/x-director',\n        'csv' => 'text/csv',\n        'cu' => 'application/cu-seeme',\n        'curl' => 'text/vnd.curl',\n        'cwl' => 'application/cwl',\n        'cww' => 'application/prs.cww',\n        'cxt' => 'application/x-director',\n        'cxx' => 'text/x-c',\n        'dae' => 'model/vnd.collada+xml',\n        'daf' => 'application/vnd.mobius.daf',\n        'dart' => 'application/vnd.dart',\n        'dataless' => 'application/vnd.fdsn.seed',\n        'davmount' => 'application/davmount+xml',\n        'dbf' => 'application/vnd.dbf',\n        'dbk' => 'application/docbook+xml',\n        'dcr' => 'application/x-director',\n        'dcurl' => 'text/vnd.curl.dcurl',\n        'dd2' => 'application/vnd.oma.dd2+xml',\n        'ddd' => 'application/vnd.fujixerox.ddd',\n        'ddf' => 'application/vnd.syncml.dmddf+xml',\n        'dds' => 'image/vnd.ms-dds',\n        'deb' => 'application/x-debian-package',\n        'def' => 'text/plain',\n        'deploy' => 'application/octet-stream',\n        'der' => 'application/x-x509-ca-cert',\n        'dfac' => 'application/vnd.dreamfactory',\n        'dgc' => 'application/x-dgc-compressed',\n        'dib' => 'image/bmp',\n        'dic' => 'text/x-c',\n        'dir' => 'application/x-director',\n        'dis' => 'application/vnd.mobius.dis',\n        'disposition-notification' => 'message/disposition-notification',\n        'dist' => 'application/octet-stream',\n        'distz' => 'application/octet-stream',\n        'djv' => 'image/vnd.djvu',\n        'djvu' => 'image/vnd.djvu',\n        'dll' => 'application/octet-stream',\n        'dmg' => 'application/x-apple-diskimage',\n        'dmn' => 'application/octet-stream',\n        'dmp' => 'application/vnd.tcpdump.pcap',\n        'dms' => 'application/octet-stream',\n        'dna' => 'application/vnd.dna',\n        'doc' => 'application/msword',\n        'docm' => 'application/vnd.ms-word.template.macroEnabled.12',\n        'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n        'dot' => 'application/msword',\n        'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',\n        'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n        'dp' => 'application/vnd.osgi.dp',\n        'dpg' => 'application/vnd.dpgraph',\n        'dpx' => 'image/dpx',\n        'dra' => 'audio/vnd.dra',\n        'drle' => 'image/dicom-rle',\n        'dsc' => 'text/prs.lines.tag',\n        'dssc' => 'application/dssc+der',\n        'dtb' => 'application/x-dtbook+xml',\n        'dtd' => 'application/xml-dtd',\n        'dts' => 'audio/vnd.dts',\n        'dtshd' => 'audio/vnd.dts.hd',\n        'dump' => 'application/octet-stream',\n        'dvb' => 'video/vnd.dvb.file',\n        'dvi' => 'application/x-dvi',\n        'dwd' => 'application/atsc-dwd+xml',\n        'dwf' => 'model/vnd.dwf',\n        'dwg' => 'image/vnd.dwg',\n        'dxf' => 'image/vnd.dxf',\n        'dxp' => 'application/vnd.spotfire.dxp',\n        'dxr' => 'application/x-director',\n        'ear' => 'application/java-archive',\n        'ecelp4800' => 'audio/vnd.nuera.ecelp4800',\n        'ecelp7470' => 'audio/vnd.nuera.ecelp7470',\n        'ecelp9600' => 'audio/vnd.nuera.ecelp9600',\n        'ecma' => 'application/ecmascript',\n        'edm' => 'application/vnd.novadigm.edm',\n        'edx' => 'application/vnd.novadigm.edx',\n        'efif' => 'application/vnd.picsel',\n        'ei6' => 'application/vnd.pg.osasli',\n        'elc' => 'application/octet-stream',\n        'emf' => 'image/emf',\n        'eml' => 'message/rfc822',\n        'emma' => 'application/emma+xml',\n        'emotionml' => 'application/emotionml+xml',\n        'emz' => 'application/x-msmetafile',\n        'eol' => 'audio/vnd.digital-winds',\n        'eot' => 'application/vnd.ms-fontobject',\n        'eps' => 'application/postscript',\n        'epub' => 'application/epub+zip',\n        'es3' => 'application/vnd.eszigno3+xml',\n        'esa' => 'application/vnd.osgi.subsystem',\n        'esf' => 'application/vnd.epson.esf',\n        'et3' => 'application/vnd.eszigno3+xml',\n        'etx' => 'text/x-setext',\n        'eva' => 'application/x-eva',\n        'evy' => 'application/x-envoy',\n        'exe' => 'application/octet-stream',\n        'exi' => 'application/exi',\n        'exp' => 'application/express',\n        'exr' => 'image/aces',\n        'ext' => 'application/vnd.novadigm.ext',\n        'ez' => 'application/andrew-inset',\n        'ez2' => 'application/vnd.ezpix-album',\n        'ez3' => 'application/vnd.ezpix-package',\n        'f' => 'text/x-fortran',\n        'f4v' => 'video/mp4',\n        'f77' => 'text/x-fortran',\n        'f90' => 'text/x-fortran',\n        'fbs' => 'image/vnd.fastbidsheet',\n        'fcdt' => 'application/vnd.adobe.formscentral.fcdt',\n        'fcs' => 'application/vnd.isac.fcs',\n        'fdf' => 'application/vnd.fdf',\n        'fdt' => 'application/fdt+xml',\n        'fe_launch' => 'application/vnd.denovo.fcselayout-link',\n        'fg5' => 'application/vnd.fujitsu.oasysgp',\n        'fgd' => 'application/x-director',\n        'fh' => 'image/x-freehand',\n        'fh4' => 'image/x-freehand',\n        'fh5' => 'image/x-freehand',\n        'fh7' => 'image/x-freehand',\n        'fhc' => 'image/x-freehand',\n        'fig' => 'application/x-xfig',\n        'fits' => 'image/fits',\n        'flac' => 'audio/x-flac',\n        'fli' => 'video/x-fli',\n        'flo' => 'application/vnd.micrografx.flo',\n        'flv' => 'video/x-flv',\n        'flw' => 'application/vnd.kde.kivio',\n        'flx' => 'text/vnd.fmi.flexstor',\n        'fly' => 'text/vnd.fly',\n        'fm' => 'application/vnd.framemaker',\n        'fnc' => 'application/vnd.frogans.fnc',\n        'fo' => 'application/vnd.software602.filler.form+xml',\n        'for' => 'text/x-fortran',\n        'fpx' => 'image/vnd.fpx',\n        'frame' => 'application/vnd.framemaker',\n        'fsc' => 'application/vnd.fsc.weblaunch',\n        'fst' => 'image/vnd.fst',\n        'ftc' => 'application/vnd.fluxtime.clip',\n        'fti' => 'application/vnd.anser-web-funds-transfer-initiation',\n        'fvt' => 'video/vnd.fvt',\n        'fxp' => 'application/vnd.adobe.fxp',\n        'fxpl' => 'application/vnd.adobe.fxp',\n        'fzs' => 'application/vnd.fuzzysheet',\n        'g2w' => 'application/vnd.geoplan',\n        'g3' => 'image/g3fax',\n        'g3w' => 'application/vnd.geospace',\n        'gac' => 'application/vnd.groove-account',\n        'gam' => 'application/x-tads',\n        'gbr' => 'application/rpki-ghostbusters',\n        'gca' => 'application/x-gca-compressed',\n        'gdl' => 'model/vnd.gdl',\n        'gdoc' => 'application/vnd.google-apps.document',\n        'ged' => 'text/vnd.familysearch.gedcom',\n        'geo' => 'application/vnd.dynageo',\n        'geojson' => 'application/geo+json',\n        'gex' => 'application/vnd.geometry-explorer',\n        'ggb' => 'application/vnd.geogebra.file',\n        'ggt' => 'application/vnd.geogebra.tool',\n        'ghf' => 'application/vnd.groove-help',\n        'gif' => 'image/gif',\n        'gim' => 'application/vnd.groove-identity-message',\n        'glb' => 'model/gltf-binary',\n        'gltf' => 'model/gltf+json',\n        'gml' => 'application/gml+xml',\n        'gmx' => 'application/vnd.gmx',\n        'gnumeric' => 'application/x-gnumeric',\n        'gpg' => 'application/gpg-keys',\n        'gph' => 'application/vnd.flographit',\n        'gpx' => 'application/gpx+xml',\n        'gqf' => 'application/vnd.grafeq',\n        'gqs' => 'application/vnd.grafeq',\n        'gram' => 'application/srgs',\n        'gramps' => 'application/x-gramps-xml',\n        'gre' => 'application/vnd.geometry-explorer',\n        'grv' => 'application/vnd.groove-injector',\n        'grxml' => 'application/srgs+xml',\n        'gsf' => 'application/x-font-ghostscript',\n        'gsheet' => 'application/vnd.google-apps.spreadsheet',\n        'gslides' => 'application/vnd.google-apps.presentation',\n        'gtar' => 'application/x-gtar',\n        'gtm' => 'application/vnd.groove-tool-message',\n        'gtw' => 'model/vnd.gtw',\n        'gv' => 'text/vnd.graphviz',\n        'gxf' => 'application/gxf',\n        'gxt' => 'application/vnd.geonext',\n        'gz' => 'application/gzip',\n        'gzip' => 'application/gzip',\n        'h' => 'text/x-c',\n        'h261' => 'video/h261',\n        'h263' => 'video/h263',\n        'h264' => 'video/h264',\n        'hal' => 'application/vnd.hal+xml',\n        'hbci' => 'application/vnd.hbci',\n        'hbs' => 'text/x-handlebars-template',\n        'hdd' => 'application/x-virtualbox-hdd',\n        'hdf' => 'application/x-hdf',\n        'heic' => 'image/heic',\n        'heics' => 'image/heic-sequence',\n        'heif' => 'image/heif',\n        'heifs' => 'image/heif-sequence',\n        'hej2' => 'image/hej2k',\n        'held' => 'application/atsc-held+xml',\n        'hh' => 'text/x-c',\n        'hjson' => 'application/hjson',\n        'hlp' => 'application/winhlp',\n        'hpgl' => 'application/vnd.hp-hpgl',\n        'hpid' => 'application/vnd.hp-hpid',\n        'hps' => 'application/vnd.hp-hps',\n        'hqx' => 'application/mac-binhex40',\n        'hsj2' => 'image/hsj2',\n        'htc' => 'text/x-component',\n        'htke' => 'application/vnd.kenameaapp',\n        'htm' => 'text/html',\n        'html' => 'text/html',\n        'hvd' => 'application/vnd.yamaha.hv-dic',\n        'hvp' => 'application/vnd.yamaha.hv-voice',\n        'hvs' => 'application/vnd.yamaha.hv-script',\n        'i2g' => 'application/vnd.intergeo',\n        'icc' => 'application/vnd.iccprofile',\n        'ice' => 'x-conference/x-cooltalk',\n        'icm' => 'application/vnd.iccprofile',\n        'ico' => 'image/x-icon',\n        'ics' => 'text/calendar',\n        'ief' => 'image/ief',\n        'ifb' => 'text/calendar',\n        'ifm' => 'application/vnd.shana.informed.formdata',\n        'iges' => 'model/iges',\n        'igl' => 'application/vnd.igloader',\n        'igm' => 'application/vnd.insors.igm',\n        'igs' => 'model/iges',\n        'igx' => 'application/vnd.micrografx.igx',\n        'iif' => 'application/vnd.shana.informed.interchange',\n        'img' => 'application/octet-stream',\n        'imp' => 'application/vnd.accpac.simply.imp',\n        'ims' => 'application/vnd.ms-ims',\n        'in' => 'text/plain',\n        'ini' => 'text/plain',\n        'ink' => 'application/inkml+xml',\n        'inkml' => 'application/inkml+xml',\n        'install' => 'application/x-install-instructions',\n        'iota' => 'application/vnd.astraea-software.iota',\n        'ipfix' => 'application/ipfix',\n        'ipk' => 'application/vnd.shana.informed.package',\n        'irm' => 'application/vnd.ibm.rights-management',\n        'irp' => 'application/vnd.irepository.package+xml',\n        'iso' => 'application/x-iso9660-image',\n        'itp' => 'application/vnd.shana.informed.formtemplate',\n        'its' => 'application/its+xml',\n        'ivp' => 'application/vnd.immervision-ivp',\n        'ivu' => 'application/vnd.immervision-ivu',\n        'jad' => 'text/vnd.sun.j2me.app-descriptor',\n        'jade' => 'text/jade',\n        'jam' => 'application/vnd.jam',\n        'jar' => 'application/java-archive',\n        'jardiff' => 'application/x-java-archive-diff',\n        'java' => 'text/x-java-source',\n        'jhc' => 'image/jphc',\n        'jisp' => 'application/vnd.jisp',\n        'jls' => 'image/jls',\n        'jlt' => 'application/vnd.hp-jlyt',\n        'jng' => 'image/x-jng',\n        'jnlp' => 'application/x-java-jnlp-file',\n        'joda' => 'application/vnd.joost.joda-archive',\n        'jp2' => 'image/jp2',\n        'jpe' => 'image/jpeg',\n        'jpeg' => 'image/jpeg',\n        'jpf' => 'image/jpx',\n        'jpg' => 'image/jpeg',\n        'jpg2' => 'image/jp2',\n        'jpgm' => 'video/jpm',\n        'jpgv' => 'video/jpeg',\n        'jph' => 'image/jph',\n        'jpm' => 'video/jpm',\n        'jpx' => 'image/jpx',\n        'js' => 'application/javascript',\n        'json' => 'application/json',\n        'json5' => 'application/json5',\n        'jsonld' => 'application/ld+json',\n        'jsonml' => 'application/jsonml+json',\n        'jsx' => 'text/jsx',\n        'jt' => 'model/jt',\n        'jxr' => 'image/jxr',\n        'jxra' => 'image/jxra',\n        'jxrs' => 'image/jxrs',\n        'jxs' => 'image/jxs',\n        'jxsc' => 'image/jxsc',\n        'jxsi' => 'image/jxsi',\n        'jxss' => 'image/jxss',\n        'kar' => 'audio/midi',\n        'karbon' => 'application/vnd.kde.karbon',\n        'kdb' => 'application/octet-stream',\n        'kdbx' => 'application/x-keepass2',\n        'key' => 'application/x-iwork-keynote-sffkey',\n        'kfo' => 'application/vnd.kde.kformula',\n        'kia' => 'application/vnd.kidspiration',\n        'kml' => 'application/vnd.google-earth.kml+xml',\n        'kmz' => 'application/vnd.google-earth.kmz',\n        'kne' => 'application/vnd.kinar',\n        'knp' => 'application/vnd.kinar',\n        'kon' => 'application/vnd.kde.kontour',\n        'kpr' => 'application/vnd.kde.kpresenter',\n        'kpt' => 'application/vnd.kde.kpresenter',\n        'kpxx' => 'application/vnd.ds-keypoint',\n        'ksp' => 'application/vnd.kde.kspread',\n        'ktr' => 'application/vnd.kahootz',\n        'ktx' => 'image/ktx',\n        'ktx2' => 'image/ktx2',\n        'ktz' => 'application/vnd.kahootz',\n        'kwd' => 'application/vnd.kde.kword',\n        'kwt' => 'application/vnd.kde.kword',\n        'lasxml' => 'application/vnd.las.las+xml',\n        'latex' => 'application/x-latex',\n        'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',\n        'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',\n        'les' => 'application/vnd.hhe.lesson-player',\n        'less' => 'text/less',\n        'lgr' => 'application/lgr+xml',\n        'lha' => 'application/octet-stream',\n        'link66' => 'application/vnd.route66.link66+xml',\n        'list' => 'text/plain',\n        'list3820' => 'application/vnd.ibm.modcap',\n        'listafp' => 'application/vnd.ibm.modcap',\n        'litcoffee' => 'text/coffeescript',\n        'lnk' => 'application/x-ms-shortcut',\n        'log' => 'text/plain',\n        'lostxml' => 'application/lost+xml',\n        'lrf' => 'application/octet-stream',\n        'lrm' => 'application/vnd.ms-lrm',\n        'ltf' => 'application/vnd.frogans.ltf',\n        'lua' => 'text/x-lua',\n        'luac' => 'application/x-lua-bytecode',\n        'lvp' => 'audio/vnd.lucent.voice',\n        'lwp' => 'application/vnd.lotus-wordpro',\n        'lzh' => 'application/octet-stream',\n        'm1v' => 'video/mpeg',\n        'm2a' => 'audio/mpeg',\n        'm2v' => 'video/mpeg',\n        'm3a' => 'audio/mpeg',\n        'm3u' => 'text/plain',\n        'm3u8' => 'application/vnd.apple.mpegurl',\n        'm4a' => 'audio/x-m4a',\n        'm4p' => 'application/mp4',\n        'm4s' => 'video/iso.segment',\n        'm4u' => 'application/vnd.mpegurl',\n        'm4v' => 'video/x-m4v',\n        'm13' => 'application/x-msmediaview',\n        'm14' => 'application/x-msmediaview',\n        'm21' => 'application/mp21',\n        'ma' => 'application/mathematica',\n        'mads' => 'application/mads+xml',\n        'maei' => 'application/mmt-aei+xml',\n        'mag' => 'application/vnd.ecowin.chart',\n        'maker' => 'application/vnd.framemaker',\n        'man' => 'text/troff',\n        'manifest' => 'text/cache-manifest',\n        'map' => 'application/json',\n        'mar' => 'application/octet-stream',\n        'markdown' => 'text/markdown',\n        'mathml' => 'application/mathml+xml',\n        'mb' => 'application/mathematica',\n        'mbk' => 'application/vnd.mobius.mbk',\n        'mbox' => 'application/mbox',\n        'mc1' => 'application/vnd.medcalcdata',\n        'mcd' => 'application/vnd.mcd',\n        'mcurl' => 'text/vnd.curl.mcurl',\n        'md' => 'text/markdown',\n        'mdb' => 'application/x-msaccess',\n        'mdi' => 'image/vnd.ms-modi',\n        'mdx' => 'text/mdx',\n        'me' => 'text/troff',\n        'mesh' => 'model/mesh',\n        'meta4' => 'application/metalink4+xml',\n        'metalink' => 'application/metalink+xml',\n        'mets' => 'application/mets+xml',\n        'mfm' => 'application/vnd.mfmp',\n        'mft' => 'application/rpki-manifest',\n        'mgp' => 'application/vnd.osgeo.mapguide.package',\n        'mgz' => 'application/vnd.proteus.magazine',\n        'mid' => 'audio/midi',\n        'midi' => 'audio/midi',\n        'mie' => 'application/x-mie',\n        'mif' => 'application/vnd.mif',\n        'mime' => 'message/rfc822',\n        'mj2' => 'video/mj2',\n        'mjp2' => 'video/mj2',\n        'mjs' => 'text/javascript',\n        'mk3d' => 'video/x-matroska',\n        'mka' => 'audio/x-matroska',\n        'mkd' => 'text/x-markdown',\n        'mks' => 'video/x-matroska',\n        'mkv' => 'video/x-matroska',\n        'mlp' => 'application/vnd.dolby.mlp',\n        'mmd' => 'application/vnd.chipnuts.karaoke-mmd',\n        'mmf' => 'application/vnd.smaf',\n        'mml' => 'text/mathml',\n        'mmr' => 'image/vnd.fujixerox.edmics-mmr',\n        'mng' => 'video/x-mng',\n        'mny' => 'application/x-msmoney',\n        'mobi' => 'application/x-mobipocket-ebook',\n        'mods' => 'application/mods+xml',\n        'mov' => 'video/quicktime',\n        'movie' => 'video/x-sgi-movie',\n        'mp2' => 'audio/mpeg',\n        'mp2a' => 'audio/mpeg',\n        'mp3' => 'audio/mpeg',\n        'mp4' => 'video/mp4',\n        'mp4a' => 'audio/mp4',\n        'mp4s' => 'application/mp4',\n        'mp4v' => 'video/mp4',\n        'mp21' => 'application/mp21',\n        'mpc' => 'application/vnd.mophun.certificate',\n        'mpd' => 'application/dash+xml',\n        'mpe' => 'video/mpeg',\n        'mpeg' => 'video/mpeg',\n        'mpf' => 'application/media-policy-dataset+xml',\n        'mpg' => 'video/mpeg',\n        'mpg4' => 'video/mp4',\n        'mpga' => 'audio/mpeg',\n        'mpkg' => 'application/vnd.apple.installer+xml',\n        'mpm' => 'application/vnd.blueice.multipass',\n        'mpn' => 'application/vnd.mophun.application',\n        'mpp' => 'application/vnd.ms-project',\n        'mpt' => 'application/vnd.ms-project',\n        'mpy' => 'application/vnd.ibm.minipay',\n        'mqy' => 'application/vnd.mobius.mqy',\n        'mrc' => 'application/marc',\n        'mrcx' => 'application/marcxml+xml',\n        'ms' => 'text/troff',\n        'mscml' => 'application/mediaservercontrol+xml',\n        'mseed' => 'application/vnd.fdsn.mseed',\n        'mseq' => 'application/vnd.mseq',\n        'msf' => 'application/vnd.epson.msf',\n        'msg' => 'application/vnd.ms-outlook',\n        'msh' => 'model/mesh',\n        'msi' => 'application/x-msdownload',\n        'msix' => 'application/msix',\n        'msixbundle' => 'application/msixbundle',\n        'msl' => 'application/vnd.mobius.msl',\n        'msm' => 'application/octet-stream',\n        'msp' => 'application/octet-stream',\n        'msty' => 'application/vnd.muvee.style',\n        'mtl' => 'model/mtl',\n        'mts' => 'model/vnd.mts',\n        'mus' => 'application/vnd.musician',\n        'musd' => 'application/mmt-usd+xml',\n        'musicxml' => 'application/vnd.recordare.musicxml+xml',\n        'mvb' => 'application/x-msmediaview',\n        'mvt' => 'application/vnd.mapbox-vector-tile',\n        'mwf' => 'application/vnd.mfer',\n        'mxf' => 'application/mxf',\n        'mxl' => 'application/vnd.recordare.musicxml',\n        'mxmf' => 'audio/mobile-xmf',\n        'mxml' => 'application/xv+xml',\n        'mxs' => 'application/vnd.triscape.mxs',\n        'mxu' => 'video/vnd.mpegurl',\n        'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',\n        'n3' => 'text/n3',\n        'nb' => 'application/mathematica',\n        'nbp' => 'application/vnd.wolfram.player',\n        'nc' => 'application/x-netcdf',\n        'ncx' => 'application/x-dtbncx+xml',\n        'nfo' => 'text/x-nfo',\n        'ngdat' => 'application/vnd.nokia.n-gage.data',\n        'nitf' => 'application/vnd.nitf',\n        'nlu' => 'application/vnd.neurolanguage.nlu',\n        'nml' => 'application/vnd.enliven',\n        'nnd' => 'application/vnd.noblenet-directory',\n        'nns' => 'application/vnd.noblenet-sealer',\n        'nnw' => 'application/vnd.noblenet-web',\n        'npx' => 'image/vnd.net-fpx',\n        'nq' => 'application/n-quads',\n        'nsc' => 'application/x-conference',\n        'nsf' => 'application/vnd.lotus-notes',\n        'nt' => 'application/n-triples',\n        'ntf' => 'application/vnd.nitf',\n        'numbers' => 'application/x-iwork-numbers-sffnumbers',\n        'nzb' => 'application/x-nzb',\n        'oa2' => 'application/vnd.fujitsu.oasys2',\n        'oa3' => 'application/vnd.fujitsu.oasys3',\n        'oas' => 'application/vnd.fujitsu.oasys',\n        'obd' => 'application/x-msbinder',\n        'obgx' => 'application/vnd.openblox.game+xml',\n        'obj' => 'model/obj',\n        'oda' => 'application/oda',\n        'odb' => 'application/vnd.oasis.opendocument.database',\n        'odc' => 'application/vnd.oasis.opendocument.chart',\n        'odf' => 'application/vnd.oasis.opendocument.formula',\n        'odft' => 'application/vnd.oasis.opendocument.formula-template',\n        'odg' => 'application/vnd.oasis.opendocument.graphics',\n        'odi' => 'application/vnd.oasis.opendocument.image',\n        'odm' => 'application/vnd.oasis.opendocument.text-master',\n        'odp' => 'application/vnd.oasis.opendocument.presentation',\n        'ods' => 'application/vnd.oasis.opendocument.spreadsheet',\n        'odt' => 'application/vnd.oasis.opendocument.text',\n        'oga' => 'audio/ogg',\n        'ogex' => 'model/vnd.opengex',\n        'ogg' => 'audio/ogg',\n        'ogv' => 'video/ogg',\n        'ogx' => 'application/ogg',\n        'omdoc' => 'application/omdoc+xml',\n        'onepkg' => 'application/onenote',\n        'onetmp' => 'application/onenote',\n        'onetoc' => 'application/onenote',\n        'onetoc2' => 'application/onenote',\n        'opf' => 'application/oebps-package+xml',\n        'opml' => 'text/x-opml',\n        'oprc' => 'application/vnd.palm',\n        'opus' => 'audio/ogg',\n        'org' => 'text/x-org',\n        'osf' => 'application/vnd.yamaha.openscoreformat',\n        'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',\n        'osm' => 'application/vnd.openstreetmap.data+xml',\n        'otc' => 'application/vnd.oasis.opendocument.chart-template',\n        'otf' => 'font/otf',\n        'otg' => 'application/vnd.oasis.opendocument.graphics-template',\n        'oth' => 'application/vnd.oasis.opendocument.text-web',\n        'oti' => 'application/vnd.oasis.opendocument.image-template',\n        'otp' => 'application/vnd.oasis.opendocument.presentation-template',\n        'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',\n        'ott' => 'application/vnd.oasis.opendocument.text-template',\n        'ova' => 'application/x-virtualbox-ova',\n        'ovf' => 'application/x-virtualbox-ovf',\n        'owl' => 'application/rdf+xml',\n        'oxps' => 'application/oxps',\n        'oxt' => 'application/vnd.openofficeorg.extension',\n        'p' => 'text/x-pascal',\n        'p7a' => 'application/x-pkcs7-signature',\n        'p7b' => 'application/x-pkcs7-certificates',\n        'p7c' => 'application/pkcs7-mime',\n        'p7m' => 'application/pkcs7-mime',\n        'p7r' => 'application/x-pkcs7-certreqresp',\n        'p7s' => 'application/pkcs7-signature',\n        'p8' => 'application/pkcs8',\n        'p10' => 'application/x-pkcs10',\n        'p12' => 'application/x-pkcs12',\n        'pac' => 'application/x-ns-proxy-autoconfig',\n        'pages' => 'application/x-iwork-pages-sffpages',\n        'pas' => 'text/x-pascal',\n        'paw' => 'application/vnd.pawaafile',\n        'pbd' => 'application/vnd.powerbuilder6',\n        'pbm' => 'image/x-portable-bitmap',\n        'pcap' => 'application/vnd.tcpdump.pcap',\n        'pcf' => 'application/x-font-pcf',\n        'pcl' => 'application/vnd.hp-pcl',\n        'pclxl' => 'application/vnd.hp-pclxl',\n        'pct' => 'image/x-pict',\n        'pcurl' => 'application/vnd.curl.pcurl',\n        'pcx' => 'image/x-pcx',\n        'pdb' => 'application/x-pilot',\n        'pde' => 'text/x-processing',\n        'pdf' => 'application/pdf',\n        'pem' => 'application/x-x509-user-cert',\n        'pfa' => 'application/x-font-type1',\n        'pfb' => 'application/x-font-type1',\n        'pfm' => 'application/x-font-type1',\n        'pfr' => 'application/font-tdpfr',\n        'pfx' => 'application/x-pkcs12',\n        'pgm' => 'image/x-portable-graymap',\n        'pgn' => 'application/x-chess-pgn',\n        'pgp' => 'application/pgp',\n        'phar' => 'application/octet-stream',\n        'php' => 'application/x-httpd-php',\n        'php3' => 'application/x-httpd-php',\n        'php4' => 'application/x-httpd-php',\n        'phps' => 'application/x-httpd-php-source',\n        'phtml' => 'application/x-httpd-php',\n        'pic' => 'image/x-pict',\n        'pkg' => 'application/octet-stream',\n        'pki' => 'application/pkixcmp',\n        'pkipath' => 'application/pkix-pkipath',\n        'pkpass' => 'application/vnd.apple.pkpass',\n        'pl' => 'application/x-perl',\n        'plb' => 'application/vnd.3gpp.pic-bw-large',\n        'plc' => 'application/vnd.mobius.plc',\n        'plf' => 'application/vnd.pocketlearn',\n        'pls' => 'application/pls+xml',\n        'pm' => 'application/x-perl',\n        'pml' => 'application/vnd.ctc-posml',\n        'png' => 'image/png',\n        'pnm' => 'image/x-portable-anymap',\n        'portpkg' => 'application/vnd.macports.portpkg',\n        'pot' => 'application/vnd.ms-powerpoint',\n        'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\n        'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',\n        'ppa' => 'application/vnd.ms-powerpoint',\n        'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',\n        'ppd' => 'application/vnd.cups-ppd',\n        'ppm' => 'image/x-portable-pixmap',\n        'pps' => 'application/vnd.ms-powerpoint',\n        'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\n        'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n        'ppt' => 'application/powerpoint',\n        'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\n        'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n        'pqa' => 'application/vnd.palm',\n        'prc' => 'model/prc',\n        'pre' => 'application/vnd.lotus-freelance',\n        'prf' => 'application/pics-rules',\n        'provx' => 'application/provenance+xml',\n        'ps' => 'application/postscript',\n        'psb' => 'application/vnd.3gpp.pic-bw-small',\n        'psd' => 'application/x-photoshop',\n        'psf' => 'application/x-font-linux-psf',\n        'pskcxml' => 'application/pskc+xml',\n        'pti' => 'image/prs.pti',\n        'ptid' => 'application/vnd.pvi.ptid1',\n        'pub' => 'application/x-mspublisher',\n        'pvb' => 'application/vnd.3gpp.pic-bw-var',\n        'pwn' => 'application/vnd.3m.post-it-notes',\n        'pya' => 'audio/vnd.ms-playready.media.pya',\n        'pyo' => 'model/vnd.pytha.pyox',\n        'pyox' => 'model/vnd.pytha.pyox',\n        'pyv' => 'video/vnd.ms-playready.media.pyv',\n        'qam' => 'application/vnd.epson.quickanime',\n        'qbo' => 'application/vnd.intu.qbo',\n        'qfx' => 'application/vnd.intu.qfx',\n        'qps' => 'application/vnd.publishare-delta-tree',\n        'qt' => 'video/quicktime',\n        'qwd' => 'application/vnd.quark.quarkxpress',\n        'qwt' => 'application/vnd.quark.quarkxpress',\n        'qxb' => 'application/vnd.quark.quarkxpress',\n        'qxd' => 'application/vnd.quark.quarkxpress',\n        'qxl' => 'application/vnd.quark.quarkxpress',\n        'qxt' => 'application/vnd.quark.quarkxpress',\n        'ra' => 'audio/x-realaudio',\n        'ram' => 'audio/x-pn-realaudio',\n        'raml' => 'application/raml+yaml',\n        'rapd' => 'application/route-apd+xml',\n        'rar' => 'application/x-rar',\n        'ras' => 'image/x-cmu-raster',\n        'rcprofile' => 'application/vnd.ipunplugged.rcprofile',\n        'rdf' => 'application/rdf+xml',\n        'rdz' => 'application/vnd.data-vision.rdz',\n        'relo' => 'application/p2p-overlay+xml',\n        'rep' => 'application/vnd.businessobjects',\n        'res' => 'application/x-dtbresource+xml',\n        'rgb' => 'image/x-rgb',\n        'rif' => 'application/reginfo+xml',\n        'rip' => 'audio/vnd.rip',\n        'ris' => 'application/x-research-info-systems',\n        'rl' => 'application/resource-lists+xml',\n        'rlc' => 'image/vnd.fujixerox.edmics-rlc',\n        'rld' => 'application/resource-lists-diff+xml',\n        'rm' => 'audio/x-pn-realaudio',\n        'rmi' => 'audio/midi',\n        'rmp' => 'audio/x-pn-realaudio-plugin',\n        'rms' => 'application/vnd.jcp.javame.midlet-rms',\n        'rmvb' => 'application/vnd.rn-realmedia-vbr',\n        'rnc' => 'application/relax-ng-compact-syntax',\n        'rng' => 'application/xml',\n        'roa' => 'application/rpki-roa',\n        'roff' => 'text/troff',\n        'rp9' => 'application/vnd.cloanto.rp9',\n        'rpm' => 'audio/x-pn-realaudio-plugin',\n        'rpss' => 'application/vnd.nokia.radio-presets',\n        'rpst' => 'application/vnd.nokia.radio-preset',\n        'rq' => 'application/sparql-query',\n        'rs' => 'application/rls-services+xml',\n        'rsa' => 'application/x-pkcs7',\n        'rsat' => 'application/atsc-rsat+xml',\n        'rsd' => 'application/rsd+xml',\n        'rsheet' => 'application/urc-ressheet+xml',\n        'rss' => 'application/rss+xml',\n        'rtf' => 'text/rtf',\n        'rtx' => 'text/richtext',\n        'run' => 'application/x-makeself',\n        'rusd' => 'application/route-usd+xml',\n        'rv' => 'video/vnd.rn-realvideo',\n        's' => 'text/x-asm',\n        's3m' => 'audio/s3m',\n        'saf' => 'application/vnd.yamaha.smaf-audio',\n        'sass' => 'text/x-sass',\n        'sbml' => 'application/sbml+xml',\n        'sc' => 'application/vnd.ibm.secure-container',\n        'scd' => 'application/x-msschedule',\n        'scm' => 'application/vnd.lotus-screencam',\n        'scq' => 'application/scvp-cv-request',\n        'scs' => 'application/scvp-cv-response',\n        'scss' => 'text/x-scss',\n        'scurl' => 'text/vnd.curl.scurl',\n        'sda' => 'application/vnd.stardivision.draw',\n        'sdc' => 'application/vnd.stardivision.calc',\n        'sdd' => 'application/vnd.stardivision.impress',\n        'sdkd' => 'application/vnd.solent.sdkm+xml',\n        'sdkm' => 'application/vnd.solent.sdkm+xml',\n        'sdp' => 'application/sdp',\n        'sdw' => 'application/vnd.stardivision.writer',\n        'sea' => 'application/octet-stream',\n        'see' => 'application/vnd.seemail',\n        'seed' => 'application/vnd.fdsn.seed',\n        'sema' => 'application/vnd.sema',\n        'semd' => 'application/vnd.semd',\n        'semf' => 'application/vnd.semf',\n        'senmlx' => 'application/senml+xml',\n        'sensmlx' => 'application/sensml+xml',\n        'ser' => 'application/java-serialized-object',\n        'setpay' => 'application/set-payment-initiation',\n        'setreg' => 'application/set-registration-initiation',\n        'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',\n        'sfs' => 'application/vnd.spotfire.sfs',\n        'sfv' => 'text/x-sfv',\n        'sgi' => 'image/sgi',\n        'sgl' => 'application/vnd.stardivision.writer-global',\n        'sgm' => 'text/sgml',\n        'sgml' => 'text/sgml',\n        'sh' => 'application/x-sh',\n        'shar' => 'application/x-shar',\n        'shex' => 'text/shex',\n        'shf' => 'application/shf+xml',\n        'shtml' => 'text/html',\n        'sid' => 'image/x-mrsid-image',\n        'sieve' => 'application/sieve',\n        'sig' => 'application/pgp-signature',\n        'sil' => 'audio/silk',\n        'silo' => 'model/mesh',\n        'sis' => 'application/vnd.symbian.install',\n        'sisx' => 'application/vnd.symbian.install',\n        'sit' => 'application/x-stuffit',\n        'sitx' => 'application/x-stuffitx',\n        'siv' => 'application/sieve',\n        'skd' => 'application/vnd.koan',\n        'skm' => 'application/vnd.koan',\n        'skp' => 'application/vnd.koan',\n        'skt' => 'application/vnd.koan',\n        'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',\n        'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',\n        'slim' => 'text/slim',\n        'slm' => 'text/slim',\n        'sls' => 'application/route-s-tsid+xml',\n        'slt' => 'application/vnd.epson.salt',\n        'sm' => 'application/vnd.stepmania.stepchart',\n        'smf' => 'application/vnd.stardivision.math',\n        'smi' => 'application/smil',\n        'smil' => 'application/smil',\n        'smv' => 'video/x-smv',\n        'smzip' => 'application/vnd.stepmania.package',\n        'snd' => 'audio/basic',\n        'snf' => 'application/x-font-snf',\n        'so' => 'application/octet-stream',\n        'spc' => 'application/x-pkcs7-certificates',\n        'spdx' => 'text/spdx',\n        'spf' => 'application/vnd.yamaha.smaf-phrase',\n        'spl' => 'application/x-futuresplash',\n        'spot' => 'text/vnd.in3d.spot',\n        'spp' => 'application/scvp-vp-response',\n        'spq' => 'application/scvp-vp-request',\n        'spx' => 'audio/ogg',\n        'sql' => 'application/x-sql',\n        'src' => 'application/x-wais-source',\n        'srt' => 'application/x-subrip',\n        'sru' => 'application/sru+xml',\n        'srx' => 'application/sparql-results+xml',\n        'ssdl' => 'application/ssdl+xml',\n        'sse' => 'application/vnd.kodak-descriptor',\n        'ssf' => 'application/vnd.epson.ssf',\n        'ssml' => 'application/ssml+xml',\n        'sst' => 'application/octet-stream',\n        'st' => 'application/vnd.sailingtracker.track',\n        'stc' => 'application/vnd.sun.xml.calc.template',\n        'std' => 'application/vnd.sun.xml.draw.template',\n        'step' => 'application/STEP',\n        'stf' => 'application/vnd.wt.stf',\n        'sti' => 'application/vnd.sun.xml.impress.template',\n        'stk' => 'application/hyperstudio',\n        'stl' => 'model/stl',\n        'stp' => 'application/STEP',\n        'stpx' => 'model/step+xml',\n        'stpxz' => 'model/step-xml+zip',\n        'stpz' => 'model/step+zip',\n        'str' => 'application/vnd.pg.format',\n        'stw' => 'application/vnd.sun.xml.writer.template',\n        'styl' => 'text/stylus',\n        'stylus' => 'text/stylus',\n        'sub' => 'text/vnd.dvb.subtitle',\n        'sus' => 'application/vnd.sus-calendar',\n        'susp' => 'application/vnd.sus-calendar',\n        'sv4cpio' => 'application/x-sv4cpio',\n        'sv4crc' => 'application/x-sv4crc',\n        'svc' => 'application/vnd.dvb.service',\n        'svd' => 'application/vnd.svd',\n        'svg' => 'image/svg+xml',\n        'svgz' => 'image/svg+xml',\n        'swa' => 'application/x-director',\n        'swf' => 'application/x-shockwave-flash',\n        'swi' => 'application/vnd.aristanetworks.swi',\n        'swidtag' => 'application/swid+xml',\n        'sxc' => 'application/vnd.sun.xml.calc',\n        'sxd' => 'application/vnd.sun.xml.draw',\n        'sxg' => 'application/vnd.sun.xml.writer.global',\n        'sxi' => 'application/vnd.sun.xml.impress',\n        'sxm' => 'application/vnd.sun.xml.math',\n        'sxw' => 'application/vnd.sun.xml.writer',\n        't' => 'text/troff',\n        't3' => 'application/x-t3vm-image',\n        't38' => 'image/t38',\n        'taglet' => 'application/vnd.mynfc',\n        'tao' => 'application/vnd.tao.intent-module-archive',\n        'tap' => 'image/vnd.tencent.tap',\n        'tar' => 'application/x-tar',\n        'tcap' => 'application/vnd.3gpp2.tcap',\n        'tcl' => 'application/x-tcl',\n        'td' => 'application/urc-targetdesc+xml',\n        'teacher' => 'application/vnd.smart.teacher',\n        'tei' => 'application/tei+xml',\n        'teicorpus' => 'application/tei+xml',\n        'tex' => 'application/x-tex',\n        'texi' => 'application/x-texinfo',\n        'texinfo' => 'application/x-texinfo',\n        'text' => 'text/plain',\n        'tfi' => 'application/thraud+xml',\n        'tfm' => 'application/x-tex-tfm',\n        'tfx' => 'image/tiff-fx',\n        'tga' => 'image/x-tga',\n        'tgz' => 'application/x-tar',\n        'thmx' => 'application/vnd.ms-officetheme',\n        'tif' => 'image/tiff',\n        'tiff' => 'image/tiff',\n        'tk' => 'application/x-tcl',\n        'tmo' => 'application/vnd.tmobile-livetv',\n        'toml' => 'application/toml',\n        'torrent' => 'application/x-bittorrent',\n        'tpl' => 'application/vnd.groove-tool-template',\n        'tpt' => 'application/vnd.trid.tpt',\n        'tr' => 'text/troff',\n        'tra' => 'application/vnd.trueapp',\n        'trig' => 'application/trig',\n        'trm' => 'application/x-msterminal',\n        'ts' => 'video/mp2t',\n        'tsd' => 'application/timestamped-data',\n        'tsv' => 'text/tab-separated-values',\n        'ttc' => 'font/collection',\n        'ttf' => 'font/ttf',\n        'ttl' => 'text/turtle',\n        'ttml' => 'application/ttml+xml',\n        'twd' => 'application/vnd.simtech-mindmapper',\n        'twds' => 'application/vnd.simtech-mindmapper',\n        'txd' => 'application/vnd.genomatix.tuxedo',\n        'txf' => 'application/vnd.mobius.txf',\n        'txt' => 'text/plain',\n        'u3d' => 'model/u3d',\n        'u8dsn' => 'message/global-delivery-status',\n        'u8hdr' => 'message/global-headers',\n        'u8mdn' => 'message/global-disposition-notification',\n        'u8msg' => 'message/global',\n        'u32' => 'application/x-authorware-bin',\n        'ubj' => 'application/ubjson',\n        'udeb' => 'application/x-debian-package',\n        'ufd' => 'application/vnd.ufdl',\n        'ufdl' => 'application/vnd.ufdl',\n        'ulx' => 'application/x-glulx',\n        'umj' => 'application/vnd.umajin',\n        'unityweb' => 'application/vnd.unity',\n        'uo' => 'application/vnd.uoml+xml',\n        'uoml' => 'application/vnd.uoml+xml',\n        'uri' => 'text/uri-list',\n        'uris' => 'text/uri-list',\n        'urls' => 'text/uri-list',\n        'usda' => 'model/vnd.usda',\n        'usdz' => 'model/vnd.usdz+zip',\n        'ustar' => 'application/x-ustar',\n        'utz' => 'application/vnd.uiq.theme',\n        'uu' => 'text/x-uuencode',\n        'uva' => 'audio/vnd.dece.audio',\n        'uvd' => 'application/vnd.dece.data',\n        'uvf' => 'application/vnd.dece.data',\n        'uvg' => 'image/vnd.dece.graphic',\n        'uvh' => 'video/vnd.dece.hd',\n        'uvi' => 'image/vnd.dece.graphic',\n        'uvm' => 'video/vnd.dece.mobile',\n        'uvp' => 'video/vnd.dece.pd',\n        'uvs' => 'video/vnd.dece.sd',\n        'uvt' => 'application/vnd.dece.ttml+xml',\n        'uvu' => 'video/vnd.uvvu.mp4',\n        'uvv' => 'video/vnd.dece.video',\n        'uvva' => 'audio/vnd.dece.audio',\n        'uvvd' => 'application/vnd.dece.data',\n        'uvvf' => 'application/vnd.dece.data',\n        'uvvg' => 'image/vnd.dece.graphic',\n        'uvvh' => 'video/vnd.dece.hd',\n        'uvvi' => 'image/vnd.dece.graphic',\n        'uvvm' => 'video/vnd.dece.mobile',\n        'uvvp' => 'video/vnd.dece.pd',\n        'uvvs' => 'video/vnd.dece.sd',\n        'uvvt' => 'application/vnd.dece.ttml+xml',\n        'uvvu' => 'video/vnd.uvvu.mp4',\n        'uvvv' => 'video/vnd.dece.video',\n        'uvvx' => 'application/vnd.dece.unspecified',\n        'uvvz' => 'application/vnd.dece.zip',\n        'uvx' => 'application/vnd.dece.unspecified',\n        'uvz' => 'application/vnd.dece.zip',\n        'vbox' => 'application/x-virtualbox-vbox',\n        'vbox-extpack' => 'application/x-virtualbox-vbox-extpack',\n        'vcard' => 'text/vcard',\n        'vcd' => 'application/x-cdlink',\n        'vcf' => 'text/x-vcard',\n        'vcg' => 'application/vnd.groove-vcard',\n        'vcs' => 'text/x-vcalendar',\n        'vcx' => 'application/vnd.vcx',\n        'vdi' => 'application/x-virtualbox-vdi',\n        'vds' => 'model/vnd.sap.vds',\n        'vhd' => 'application/x-virtualbox-vhd',\n        'vis' => 'application/vnd.visionary',\n        'viv' => 'video/vnd.vivo',\n        'vlc' => 'application/videolan',\n        'vmdk' => 'application/x-virtualbox-vmdk',\n        'vob' => 'video/x-ms-vob',\n        'vor' => 'application/vnd.stardivision.writer',\n        'vox' => 'application/x-authorware-bin',\n        'vrml' => 'model/vrml',\n        'vsd' => 'application/vnd.visio',\n        'vsf' => 'application/vnd.vsf',\n        'vss' => 'application/vnd.visio',\n        'vst' => 'application/vnd.visio',\n        'vsw' => 'application/vnd.visio',\n        'vtf' => 'image/vnd.valve.source.texture',\n        'vtt' => 'text/vtt',\n        'vtu' => 'model/vnd.vtu',\n        'vxml' => 'application/voicexml+xml',\n        'w3d' => 'application/x-director',\n        'wad' => 'application/x-doom',\n        'wadl' => 'application/vnd.sun.wadl+xml',\n        'war' => 'application/java-archive',\n        'wasm' => 'application/wasm',\n        'wav' => 'audio/x-wav',\n        'wax' => 'audio/x-ms-wax',\n        'wbmp' => 'image/vnd.wap.wbmp',\n        'wbs' => 'application/vnd.criticaltools.wbs+xml',\n        'wbxml' => 'application/wbxml',\n        'wcm' => 'application/vnd.ms-works',\n        'wdb' => 'application/vnd.ms-works',\n        'wdp' => 'image/vnd.ms-photo',\n        'weba' => 'audio/webm',\n        'webapp' => 'application/x-web-app-manifest+json',\n        'webm' => 'video/webm',\n        'webmanifest' => 'application/manifest+json',\n        'webp' => 'image/webp',\n        'wg' => 'application/vnd.pmi.widget',\n        'wgsl' => 'text/wgsl',\n        'wgt' => 'application/widget',\n        'wif' => 'application/watcherinfo+xml',\n        'wks' => 'application/vnd.ms-works',\n        'wm' => 'video/x-ms-wm',\n        'wma' => 'audio/x-ms-wma',\n        'wmd' => 'application/x-ms-wmd',\n        'wmf' => 'image/wmf',\n        'wml' => 'text/vnd.wap.wml',\n        'wmlc' => 'application/wmlc',\n        'wmls' => 'text/vnd.wap.wmlscript',\n        'wmlsc' => 'application/vnd.wap.wmlscriptc',\n        'wmv' => 'video/x-ms-wmv',\n        'wmx' => 'video/x-ms-wmx',\n        'wmz' => 'application/x-msmetafile',\n        'woff' => 'font/woff',\n        'woff2' => 'font/woff2',\n        'word' => 'application/msword',\n        'wpd' => 'application/vnd.wordperfect',\n        'wpl' => 'application/vnd.ms-wpl',\n        'wps' => 'application/vnd.ms-works',\n        'wqd' => 'application/vnd.wqd',\n        'wri' => 'application/x-mswrite',\n        'wrl' => 'model/vrml',\n        'wsc' => 'message/vnd.wfa.wsc',\n        'wsdl' => 'application/wsdl+xml',\n        'wspolicy' => 'application/wspolicy+xml',\n        'wtb' => 'application/vnd.webturbo',\n        'wvx' => 'video/x-ms-wvx',\n        'x3d' => 'model/x3d+xml',\n        'x3db' => 'model/x3d+fastinfoset',\n        'x3dbz' => 'model/x3d+binary',\n        'x3dv' => 'model/x3d-vrml',\n        'x3dvz' => 'model/x3d+vrml',\n        'x3dz' => 'model/x3d+xml',\n        'x32' => 'application/x-authorware-bin',\n        'x_b' => 'model/vnd.parasolid.transmit.binary',\n        'x_t' => 'model/vnd.parasolid.transmit.text',\n        'xaml' => 'application/xaml+xml',\n        'xap' => 'application/x-silverlight-app',\n        'xar' => 'application/vnd.xara',\n        'xav' => 'application/xcap-att+xml',\n        'xbap' => 'application/x-ms-xbap',\n        'xbd' => 'application/vnd.fujixerox.docuworks.binder',\n        'xbm' => 'image/x-xbitmap',\n        'xca' => 'application/xcap-caps+xml',\n        'xcs' => 'application/calendar+xml',\n        'xdf' => 'application/xcap-diff+xml',\n        'xdm' => 'application/vnd.syncml.dm+xml',\n        'xdp' => 'application/vnd.adobe.xdp+xml',\n        'xdssc' => 'application/dssc+xml',\n        'xdw' => 'application/vnd.fujixerox.docuworks',\n        'xel' => 'application/xcap-el+xml',\n        'xenc' => 'application/xenc+xml',\n        'xer' => 'application/patch-ops-error+xml',\n        'xfdf' => 'application/xfdf',\n        'xfdl' => 'application/vnd.xfdl',\n        'xht' => 'application/xhtml+xml',\n        'xhtm' => 'application/vnd.pwg-xhtml-print+xml',\n        'xhtml' => 'application/xhtml+xml',\n        'xhvml' => 'application/xv+xml',\n        'xif' => 'image/vnd.xiff',\n        'xl' => 'application/excel',\n        'xla' => 'application/vnd.ms-excel',\n        'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',\n        'xlc' => 'application/vnd.ms-excel',\n        'xlf' => 'application/xliff+xml',\n        'xlm' => 'application/vnd.ms-excel',\n        'xls' => 'application/vnd.ms-excel',\n        'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\n        'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',\n        'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n        'xlt' => 'application/vnd.ms-excel',\n        'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',\n        'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n        'xlw' => 'application/vnd.ms-excel',\n        'xm' => 'audio/xm',\n        'xml' => 'application/xml',\n        'xns' => 'application/xcap-ns+xml',\n        'xo' => 'application/vnd.olpc-sugar',\n        'xop' => 'application/xop+xml',\n        'xpi' => 'application/x-xpinstall',\n        'xpl' => 'application/xproc+xml',\n        'xpm' => 'image/x-xpixmap',\n        'xpr' => 'application/vnd.is-xpr',\n        'xps' => 'application/vnd.ms-xpsdocument',\n        'xpw' => 'application/vnd.intercon.formnet',\n        'xpx' => 'application/vnd.intercon.formnet',\n        'xsd' => 'application/xml',\n        'xsf' => 'application/prs.xsf+xml',\n        'xsl' => 'application/xml',\n        'xslt' => 'application/xslt+xml',\n        'xsm' => 'application/vnd.syncml+xml',\n        'xspf' => 'application/xspf+xml',\n        'xul' => 'application/vnd.mozilla.xul+xml',\n        'xvm' => 'application/xv+xml',\n        'xvml' => 'application/xv+xml',\n        'xwd' => 'image/x-xwindowdump',\n        'xyz' => 'chemical/x-xyz',\n        'xz' => 'application/x-xz',\n        'yaml' => 'text/yaml',\n        'yang' => 'application/yang',\n        'yin' => 'application/yin+xml',\n        'yml' => 'text/yaml',\n        'ymp' => 'text/x-suse-ymp',\n        'z' => 'application/x-compress',\n        'z1' => 'application/x-zmachine',\n        'z2' => 'application/x-zmachine',\n        'z3' => 'application/x-zmachine',\n        'z4' => 'application/x-zmachine',\n        'z5' => 'application/x-zmachine',\n        'z6' => 'application/x-zmachine',\n        'z7' => 'application/x-zmachine',\n        'z8' => 'application/x-zmachine',\n        'zaz' => 'application/vnd.zzazz.deck+xml',\n        'zip' => 'application/zip',\n        'zir' => 'application/vnd.zul',\n        'zirz' => 'application/vnd.zul',\n        'zmm' => 'application/vnd.handheld-entertainment+xml',\n        'zsh' => 'text/x-scriptzsh',\n    ];\n\n    /**\n     * Determines the mimetype of a file by looking at its extension.\n     *\n     * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json\n     */\n    public static function fromFilename(string $filename): ?string\n    {\n        return self::fromExtension(pathinfo($filename, PATHINFO_EXTENSION));\n    }\n\n    /**\n     * Maps a file extensions to a mimetype.\n     *\n     * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json\n     */\n    public static function fromExtension(string $extension): ?string\n    {\n        return self::MIME_TYPES[strtolower($extension)] ?? null;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/MultipartStream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream that when read returns bytes for a streaming multipart or\n * multipart/form-data stream.\n */\nfinal class MultipartStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var string */\n    private $boundary;\n\n    /** @var StreamInterface */\n    private $stream;\n\n    /**\n     * @param array  $elements Array of associative arrays, each containing a\n     *                         required \"name\" key mapping to the form field,\n     *                         name, a required \"contents\" key mapping to a\n     *                         StreamInterface/resource/string, an optional\n     *                         \"headers\" associative array of custom headers,\n     *                         and an optional \"filename\" key mapping to a\n     *                         string to send as the filename in the part.\n     * @param string $boundary You can optionally provide a specific boundary\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function __construct(array $elements = [], string $boundary = null)\n    {\n        $this->boundary = $boundary ?: bin2hex(random_bytes(20));\n        $this->stream = $this->createStream($elements);\n    }\n\n    public function getBoundary(): string\n    {\n        return $this->boundary;\n    }\n\n    public function isWritable(): bool\n    {\n        return false;\n    }\n\n    /**\n     * Get the headers needed before transferring the content of a POST file\n     *\n     * @param string[] $headers\n     */\n    private function getHeaders(array $headers): string\n    {\n        $str = '';\n        foreach ($headers as $key => $value) {\n            $str .= \"{$key}: {$value}\\r\\n\";\n        }\n\n        return \"--{$this->boundary}\\r\\n\".trim($str).\"\\r\\n\\r\\n\";\n    }\n\n    /**\n     * Create the aggregate stream that will be used to upload the POST data\n     */\n    protected function createStream(array $elements = []): StreamInterface\n    {\n        $stream = new AppendStream();\n\n        foreach ($elements as $element) {\n            if (!is_array($element)) {\n                throw new \\UnexpectedValueException('An array is expected');\n            }\n            $this->addElement($stream, $element);\n        }\n\n        // Add the trailing boundary with CRLF\n        $stream->addStream(Utils::streamFor(\"--{$this->boundary}--\\r\\n\"));\n\n        return $stream;\n    }\n\n    private function addElement(AppendStream $stream, array $element): void\n    {\n        foreach (['contents', 'name'] as $key) {\n            if (!array_key_exists($key, $element)) {\n                throw new \\InvalidArgumentException(\"A '{$key}' key is required\");\n            }\n        }\n\n        $element['contents'] = Utils::streamFor($element['contents']);\n\n        if (empty($element['filename'])) {\n            $uri = $element['contents']->getMetadata('uri');\n            if ($uri && \\is_string($uri) && \\substr($uri, 0, 6) !== 'php://' && \\substr($uri, 0, 7) !== 'data://') {\n                $element['filename'] = $uri;\n            }\n        }\n\n        [$body, $headers] = $this->createElement(\n            $element['name'],\n            $element['contents'],\n            $element['filename'] ?? null,\n            $element['headers'] ?? []\n        );\n\n        $stream->addStream(Utils::streamFor($this->getHeaders($headers)));\n        $stream->addStream($body);\n        $stream->addStream(Utils::streamFor(\"\\r\\n\"));\n    }\n\n    /**\n     * @param string[] $headers\n     *\n     * @return array{0: StreamInterface, 1: string[]}\n     */\n    private function createElement(string $name, StreamInterface $stream, ?string $filename, array $headers): array\n    {\n        // Set a default content-disposition header if one was no provided\n        $disposition = self::getHeader($headers, 'content-disposition');\n        if (!$disposition) {\n            $headers['Content-Disposition'] = ($filename === '0' || $filename)\n                ? sprintf(\n                    'form-data; name=\"%s\"; filename=\"%s\"',\n                    $name,\n                    basename($filename)\n                )\n                : \"form-data; name=\\\"{$name}\\\"\";\n        }\n\n        // Set a default content-length header if one was no provided\n        $length = self::getHeader($headers, 'content-length');\n        if (!$length) {\n            if ($length = $stream->getSize()) {\n                $headers['Content-Length'] = (string) $length;\n            }\n        }\n\n        // Set a default Content-Type if one was not supplied\n        $type = self::getHeader($headers, 'content-type');\n        if (!$type && ($filename === '0' || $filename)) {\n            $headers['Content-Type'] = MimeType::fromFilename($filename) ?? 'application/octet-stream';\n        }\n\n        return [$stream, $headers];\n    }\n\n    /**\n     * @param string[] $headers\n     */\n    private static function getHeader(array $headers, string $key): ?string\n    {\n        $lowercaseHeader = strtolower($key);\n        foreach ($headers as $k => $v) {\n            if (strtolower((string) $k) === $lowercaseHeader) {\n                return $v;\n            }\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/NoSeekStream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator that prevents a stream from being seeked.\n */\nfinal class NoSeekStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var StreamInterface */\n    private $stream;\n\n    public function seek($offset, $whence = SEEK_SET): void\n    {\n        throw new \\RuntimeException('Cannot seek a NoSeekStream');\n    }\n\n    public function isSeekable(): bool\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/PumpStream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Provides a read only stream that pumps data from a PHP callable.\n *\n * When invoking the provided callable, the PumpStream will pass the amount of\n * data requested to read to the callable. The callable can choose to ignore\n * this value and return fewer or more bytes than requested. Any extra data\n * returned by the provided callable is buffered internally until drained using\n * the read() function of the PumpStream. The provided callable MUST return\n * false when there is no more data to read.\n */\nfinal class PumpStream implements StreamInterface\n{\n    /** @var callable(int): (string|false|null)|null */\n    private $source;\n\n    /** @var int|null */\n    private $size;\n\n    /** @var int */\n    private $tellPos = 0;\n\n    /** @var array */\n    private $metadata;\n\n    /** @var BufferStream */\n    private $buffer;\n\n    /**\n     * @param callable(int): (string|false|null)  $source  Source of the stream data. The callable MAY\n     *                                                     accept an integer argument used to control the\n     *                                                     amount of data to return. The callable MUST\n     *                                                     return a string when called, or false|null on error\n     *                                                     or EOF.\n     * @param array{size?: int, metadata?: array} $options Stream options:\n     *                                                     - metadata: Hash of metadata to use with stream.\n     *                                                     - size: Size of the stream, if known.\n     */\n    public function __construct(callable $source, array $options = [])\n    {\n        $this->source = $source;\n        $this->size = $options['size'] ?? null;\n        $this->metadata = $options['metadata'] ?? [];\n        $this->buffer = new BufferStream();\n    }\n\n    public function __toString(): string\n    {\n        try {\n            return Utils::copyToString($this);\n        } catch (\\Throwable $e) {\n            if (\\PHP_VERSION_ID >= 70400) {\n                throw $e;\n            }\n            trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);\n\n            return '';\n        }\n    }\n\n    public function close(): void\n    {\n        $this->detach();\n    }\n\n    public function detach()\n    {\n        $this->tellPos = 0;\n        $this->source = null;\n\n        return null;\n    }\n\n    public function getSize(): ?int\n    {\n        return $this->size;\n    }\n\n    public function tell(): int\n    {\n        return $this->tellPos;\n    }\n\n    public function eof(): bool\n    {\n        return $this->source === null;\n    }\n\n    public function isSeekable(): bool\n    {\n        return false;\n    }\n\n    public function rewind(): void\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET): void\n    {\n        throw new \\RuntimeException('Cannot seek a PumpStream');\n    }\n\n    public function isWritable(): bool\n    {\n        return false;\n    }\n\n    public function write($string): int\n    {\n        throw new \\RuntimeException('Cannot write to a PumpStream');\n    }\n\n    public function isReadable(): bool\n    {\n        return true;\n    }\n\n    public function read($length): string\n    {\n        $data = $this->buffer->read($length);\n        $readLen = strlen($data);\n        $this->tellPos += $readLen;\n        $remaining = $length - $readLen;\n\n        if ($remaining) {\n            $this->pump($remaining);\n            $data .= $this->buffer->read($remaining);\n            $this->tellPos += strlen($data) - $readLen;\n        }\n\n        return $data;\n    }\n\n    public function getContents(): string\n    {\n        $result = '';\n        while (!$this->eof()) {\n            $result .= $this->read(1000000);\n        }\n\n        return $result;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getMetadata($key = null)\n    {\n        if (!$key) {\n            return $this->metadata;\n        }\n\n        return $this->metadata[$key] ?? null;\n    }\n\n    private function pump(int $length): void\n    {\n        if ($this->source !== null) {\n            do {\n                $data = ($this->source)($length);\n                if ($data === false || $data === null) {\n                    $this->source = null;\n\n                    return;\n                }\n                $this->buffer->write($data);\n                $length -= strlen($data);\n            } while ($length > 0);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/Query.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nfinal class Query\n{\n    /**\n     * Parse a query string into an associative array.\n     *\n     * If multiple values are found for the same key, the value of that key\n     * value pair will become an array. This function does not parse nested\n     * PHP style arrays into an associative array (e.g., `foo[a]=1&foo[b]=2`\n     * will be parsed into `['foo[a]' => '1', 'foo[b]' => '2'])`.\n     *\n     * @param string   $str         Query string to parse\n     * @param int|bool $urlEncoding How the query string is encoded\n     */\n    public static function parse(string $str, $urlEncoding = true): array\n    {\n        $result = [];\n\n        if ($str === '') {\n            return $result;\n        }\n\n        if ($urlEncoding === true) {\n            $decoder = function ($value) {\n                return rawurldecode(str_replace('+', ' ', (string) $value));\n            };\n        } elseif ($urlEncoding === PHP_QUERY_RFC3986) {\n            $decoder = 'rawurldecode';\n        } elseif ($urlEncoding === PHP_QUERY_RFC1738) {\n            $decoder = 'urldecode';\n        } else {\n            $decoder = function ($str) {\n                return $str;\n            };\n        }\n\n        foreach (explode('&', $str) as $kvp) {\n            $parts = explode('=', $kvp, 2);\n            $key = $decoder($parts[0]);\n            $value = isset($parts[1]) ? $decoder($parts[1]) : null;\n            if (!array_key_exists($key, $result)) {\n                $result[$key] = $value;\n            } else {\n                if (!is_array($result[$key])) {\n                    $result[$key] = [$result[$key]];\n                }\n                $result[$key][] = $value;\n            }\n        }\n\n        return $result;\n    }\n\n    /**\n     * Build a query string from an array of key value pairs.\n     *\n     * This function can use the return value of `parse()` to build a query\n     * string. This function does not modify the provided keys when an array is\n     * encountered (like `http_build_query()` would).\n     *\n     * @param array     $params   Query string parameters.\n     * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986\n     *                            to encode using RFC3986, or PHP_QUERY_RFC1738\n     *                            to encode using RFC1738.\n     */\n    public static function build(array $params, $encoding = PHP_QUERY_RFC3986): string\n    {\n        if (!$params) {\n            return '';\n        }\n\n        if ($encoding === false) {\n            $encoder = function (string $str): string {\n                return $str;\n            };\n        } elseif ($encoding === PHP_QUERY_RFC3986) {\n            $encoder = 'rawurlencode';\n        } elseif ($encoding === PHP_QUERY_RFC1738) {\n            $encoder = 'urlencode';\n        } else {\n            throw new \\InvalidArgumentException('Invalid type');\n        }\n\n        $qs = '';\n        foreach ($params as $k => $v) {\n            $k = $encoder((string) $k);\n            if (!is_array($v)) {\n                $qs .= $k;\n                $v = is_bool($v) ? (int) $v : $v;\n                if ($v !== null) {\n                    $qs .= '='.$encoder((string) $v);\n                }\n                $qs .= '&';\n            } else {\n                foreach ($v as $vv) {\n                    $qs .= $k;\n                    $vv = is_bool($vv) ? (int) $vv : $vv;\n                    if ($vv !== null) {\n                        $qs .= '='.$encoder((string) $vv);\n                    }\n                    $qs .= '&';\n                }\n            }\n        }\n\n        return $qs ? (string) substr($qs, 0, -1) : '';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/Request.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * PSR-7 request implementation.\n */\nclass Request implements RequestInterface\n{\n    use MessageTrait;\n\n    /** @var string */\n    private $method;\n\n    /** @var string|null */\n    private $requestTarget;\n\n    /** @var UriInterface */\n    private $uri;\n\n    /**\n     * @param string                               $method  HTTP method\n     * @param string|UriInterface                  $uri     URI\n     * @param (string|string[])[]                  $headers Request headers\n     * @param string|resource|StreamInterface|null $body    Request body\n     * @param string                               $version Protocol version\n     */\n    public function __construct(\n        string $method,\n        $uri,\n        array $headers = [],\n        $body = null,\n        string $version = '1.1'\n    ) {\n        $this->assertMethod($method);\n        if (!($uri instanceof UriInterface)) {\n            $uri = new Uri($uri);\n        }\n\n        $this->method = strtoupper($method);\n        $this->uri = $uri;\n        $this->setHeaders($headers);\n        $this->protocol = $version;\n\n        if (!isset($this->headerNames['host'])) {\n            $this->updateHostFromUri();\n        }\n\n        if ($body !== '' && $body !== null) {\n            $this->stream = Utils::streamFor($body);\n        }\n    }\n\n    public function getRequestTarget(): string\n    {\n        if ($this->requestTarget !== null) {\n            return $this->requestTarget;\n        }\n\n        $target = $this->uri->getPath();\n        if ($target === '') {\n            $target = '/';\n        }\n        if ($this->uri->getQuery() != '') {\n            $target .= '?'.$this->uri->getQuery();\n        }\n\n        return $target;\n    }\n\n    public function withRequestTarget($requestTarget): RequestInterface\n    {\n        if (preg_match('#\\s#', $requestTarget)) {\n            throw new InvalidArgumentException(\n                'Invalid request target provided; cannot contain whitespace'\n            );\n        }\n\n        $new = clone $this;\n        $new->requestTarget = $requestTarget;\n\n        return $new;\n    }\n\n    public function getMethod(): string\n    {\n        return $this->method;\n    }\n\n    public function withMethod($method): RequestInterface\n    {\n        $this->assertMethod($method);\n        $new = clone $this;\n        $new->method = strtoupper($method);\n\n        return $new;\n    }\n\n    public function getUri(): UriInterface\n    {\n        return $this->uri;\n    }\n\n    public function withUri(UriInterface $uri, $preserveHost = false): RequestInterface\n    {\n        if ($uri === $this->uri) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->uri = $uri;\n\n        if (!$preserveHost || !isset($this->headerNames['host'])) {\n            $new->updateHostFromUri();\n        }\n\n        return $new;\n    }\n\n    private function updateHostFromUri(): void\n    {\n        $host = $this->uri->getHost();\n\n        if ($host == '') {\n            return;\n        }\n\n        if (($port = $this->uri->getPort()) !== null) {\n            $host .= ':'.$port;\n        }\n\n        if (isset($this->headerNames['host'])) {\n            $header = $this->headerNames['host'];\n        } else {\n            $header = 'Host';\n            $this->headerNames['host'] = 'Host';\n        }\n        // Ensure Host is the first header.\n        // See: https://datatracker.ietf.org/doc/html/rfc7230#section-5.4\n        $this->headers = [$header => [$host]] + $this->headers;\n    }\n\n    /**\n     * @param mixed $method\n     */\n    private function assertMethod($method): void\n    {\n        if (!is_string($method) || $method === '') {\n            throw new InvalidArgumentException('Method must be a non-empty string.');\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/Response.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * PSR-7 response implementation.\n */\nclass Response implements ResponseInterface\n{\n    use MessageTrait;\n\n    /** Map of standard HTTP status code/reason phrases */\n    private const PHRASES = [\n        100 => 'Continue',\n        101 => 'Switching Protocols',\n        102 => 'Processing',\n        200 => 'OK',\n        201 => 'Created',\n        202 => 'Accepted',\n        203 => 'Non-Authoritative Information',\n        204 => 'No Content',\n        205 => 'Reset Content',\n        206 => 'Partial Content',\n        207 => 'Multi-status',\n        208 => 'Already Reported',\n        300 => 'Multiple Choices',\n        301 => 'Moved Permanently',\n        302 => 'Found',\n        303 => 'See Other',\n        304 => 'Not Modified',\n        305 => 'Use Proxy',\n        306 => 'Switch Proxy',\n        307 => 'Temporary Redirect',\n        308 => 'Permanent Redirect',\n        400 => 'Bad Request',\n        401 => 'Unauthorized',\n        402 => 'Payment Required',\n        403 => 'Forbidden',\n        404 => 'Not Found',\n        405 => 'Method Not Allowed',\n        406 => 'Not Acceptable',\n        407 => 'Proxy Authentication Required',\n        408 => 'Request Time-out',\n        409 => 'Conflict',\n        410 => 'Gone',\n        411 => 'Length Required',\n        412 => 'Precondition Failed',\n        413 => 'Request Entity Too Large',\n        414 => 'Request-URI Too Large',\n        415 => 'Unsupported Media Type',\n        416 => 'Requested range not satisfiable',\n        417 => 'Expectation Failed',\n        418 => 'I\\'m a teapot',\n        422 => 'Unprocessable Entity',\n        423 => 'Locked',\n        424 => 'Failed Dependency',\n        425 => 'Unordered Collection',\n        426 => 'Upgrade Required',\n        428 => 'Precondition Required',\n        429 => 'Too Many Requests',\n        431 => 'Request Header Fields Too Large',\n        451 => 'Unavailable For Legal Reasons',\n        500 => 'Internal Server Error',\n        501 => 'Not Implemented',\n        502 => 'Bad Gateway',\n        503 => 'Service Unavailable',\n        504 => 'Gateway Time-out',\n        505 => 'HTTP Version not supported',\n        506 => 'Variant Also Negotiates',\n        507 => 'Insufficient Storage',\n        508 => 'Loop Detected',\n        510 => 'Not Extended',\n        511 => 'Network Authentication Required',\n    ];\n\n    /** @var string */\n    private $reasonPhrase;\n\n    /** @var int */\n    private $statusCode;\n\n    /**\n     * @param int                                  $status  Status code\n     * @param (string|string[])[]                  $headers Response headers\n     * @param string|resource|StreamInterface|null $body    Response body\n     * @param string                               $version Protocol version\n     * @param string|null                          $reason  Reason phrase (when empty a default will be used based on the status code)\n     */\n    public function __construct(\n        int $status = 200,\n        array $headers = [],\n        $body = null,\n        string $version = '1.1',\n        string $reason = null\n    ) {\n        $this->assertStatusCodeRange($status);\n\n        $this->statusCode = $status;\n\n        if ($body !== '' && $body !== null) {\n            $this->stream = Utils::streamFor($body);\n        }\n\n        $this->setHeaders($headers);\n        if ($reason == '' && isset(self::PHRASES[$this->statusCode])) {\n            $this->reasonPhrase = self::PHRASES[$this->statusCode];\n        } else {\n            $this->reasonPhrase = (string) $reason;\n        }\n\n        $this->protocol = $version;\n    }\n\n    public function getStatusCode(): int\n    {\n        return $this->statusCode;\n    }\n\n    public function getReasonPhrase(): string\n    {\n        return $this->reasonPhrase;\n    }\n\n    public function withStatus($code, $reasonPhrase = ''): ResponseInterface\n    {\n        $this->assertStatusCodeIsInteger($code);\n        $code = (int) $code;\n        $this->assertStatusCodeRange($code);\n\n        $new = clone $this;\n        $new->statusCode = $code;\n        if ($reasonPhrase == '' && isset(self::PHRASES[$new->statusCode])) {\n            $reasonPhrase = self::PHRASES[$new->statusCode];\n        }\n        $new->reasonPhrase = (string) $reasonPhrase;\n\n        return $new;\n    }\n\n    /**\n     * @param mixed $statusCode\n     */\n    private function assertStatusCodeIsInteger($statusCode): void\n    {\n        if (filter_var($statusCode, FILTER_VALIDATE_INT) === false) {\n            throw new \\InvalidArgumentException('Status code must be an integer value.');\n        }\n    }\n\n    private function assertStatusCodeRange(int $statusCode): void\n    {\n        if ($statusCode < 100 || $statusCode >= 600) {\n            throw new \\InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.');\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/Rfc7230.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\n/**\n * @internal\n */\nfinal class Rfc7230\n{\n    /**\n     * Header related regular expressions (based on amphp/http package)\n     *\n     * Note: header delimiter (\\r\\n) is modified to \\r?\\n to accept line feed only delimiters for BC reasons.\n     *\n     * @see https://github.com/amphp/http/blob/v1.0.1/src/Rfc7230.php#L12-L15\n     *\n     * @license https://github.com/amphp/http/blob/v1.0.1/LICENSE\n     */\n    public const HEADER_REGEX = \"(^([^()<>@,;:\\\\\\\"/[\\]?={}\\x01-\\x20\\x7F]++):[ \\t]*+((?:[ \\t]*+[\\x21-\\x7E\\x80-\\xFF]++)*+)[ \\t]*+\\r?\\n)m\";\n    public const HEADER_FOLD_REGEX = \"(\\r?\\n[ \\t]++)\";\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/ServerRequest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UploadedFileInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Server-side HTTP request\n *\n * Extends the Request definition to add methods for accessing incoming data,\n * specifically server parameters, cookies, matched path parameters, query\n * string arguments, body parameters, and upload file information.\n *\n * \"Attributes\" are discovered via decomposing the request (and usually\n * specifically the URI path), and typically will be injected by the application.\n *\n * Requests are considered immutable; all methods that might change state are\n * implemented such that they retain the internal state of the current\n * message and return a new instance that contains the changed state.\n */\nclass ServerRequest extends Request implements ServerRequestInterface\n{\n    /**\n     * @var array\n     */\n    private $attributes = [];\n\n    /**\n     * @var array\n     */\n    private $cookieParams = [];\n\n    /**\n     * @var array|object|null\n     */\n    private $parsedBody;\n\n    /**\n     * @var array\n     */\n    private $queryParams = [];\n\n    /**\n     * @var array\n     */\n    private $serverParams;\n\n    /**\n     * @var array\n     */\n    private $uploadedFiles = [];\n\n    /**\n     * @param string                               $method       HTTP method\n     * @param string|UriInterface                  $uri          URI\n     * @param (string|string[])[]                  $headers      Request headers\n     * @param string|resource|StreamInterface|null $body         Request body\n     * @param string                               $version      Protocol version\n     * @param array                                $serverParams Typically the $_SERVER superglobal\n     */\n    public function __construct(\n        string $method,\n        $uri,\n        array $headers = [],\n        $body = null,\n        string $version = '1.1',\n        array $serverParams = []\n    ) {\n        $this->serverParams = $serverParams;\n\n        parent::__construct($method, $uri, $headers, $body, $version);\n    }\n\n    /**\n     * Return an UploadedFile instance array.\n     *\n     * @param array $files An array which respect $_FILES structure\n     *\n     * @throws InvalidArgumentException for unrecognized values\n     */\n    public static function normalizeFiles(array $files): array\n    {\n        $normalized = [];\n\n        foreach ($files as $key => $value) {\n            if ($value instanceof UploadedFileInterface) {\n                $normalized[$key] = $value;\n            } elseif (is_array($value) && isset($value['tmp_name'])) {\n                $normalized[$key] = self::createUploadedFileFromSpec($value);\n            } elseif (is_array($value)) {\n                $normalized[$key] = self::normalizeFiles($value);\n                continue;\n            } else {\n                throw new InvalidArgumentException('Invalid value in files specification');\n            }\n        }\n\n        return $normalized;\n    }\n\n    /**\n     * Create and return an UploadedFile instance from a $_FILES specification.\n     *\n     * If the specification represents an array of values, this method will\n     * delegate to normalizeNestedFileSpec() and return that return value.\n     *\n     * @param array $value $_FILES struct\n     *\n     * @return UploadedFileInterface|UploadedFileInterface[]\n     */\n    private static function createUploadedFileFromSpec(array $value)\n    {\n        if (is_array($value['tmp_name'])) {\n            return self::normalizeNestedFileSpec($value);\n        }\n\n        return new UploadedFile(\n            $value['tmp_name'],\n            (int) $value['size'],\n            (int) $value['error'],\n            $value['name'],\n            $value['type']\n        );\n    }\n\n    /**\n     * Normalize an array of file specifications.\n     *\n     * Loops through all nested files and returns a normalized array of\n     * UploadedFileInterface instances.\n     *\n     * @return UploadedFileInterface[]\n     */\n    private static function normalizeNestedFileSpec(array $files = []): array\n    {\n        $normalizedFiles = [];\n\n        foreach (array_keys($files['tmp_name']) as $key) {\n            $spec = [\n                'tmp_name' => $files['tmp_name'][$key],\n                'size' => $files['size'][$key] ?? null,\n                'error' => $files['error'][$key] ?? null,\n                'name' => $files['name'][$key] ?? null,\n                'type' => $files['type'][$key] ?? null,\n            ];\n            $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec);\n        }\n\n        return $normalizedFiles;\n    }\n\n    /**\n     * Return a ServerRequest populated with superglobals:\n     * $_GET\n     * $_POST\n     * $_COOKIE\n     * $_FILES\n     * $_SERVER\n     */\n    public static function fromGlobals(): ServerRequestInterface\n    {\n        $method = $_SERVER['REQUEST_METHOD'] ?? 'GET';\n        $headers = getallheaders();\n        $uri = self::getUriFromGlobals();\n        $body = new CachingStream(new LazyOpenStream('php://input', 'r+'));\n        $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1';\n\n        $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER);\n\n        return $serverRequest\n            ->withCookieParams($_COOKIE)\n            ->withQueryParams($_GET)\n            ->withParsedBody($_POST)\n            ->withUploadedFiles(self::normalizeFiles($_FILES));\n    }\n\n    private static function extractHostAndPortFromAuthority(string $authority): array\n    {\n        $uri = 'http://'.$authority;\n        $parts = parse_url($uri);\n        if (false === $parts) {\n            return [null, null];\n        }\n\n        $host = $parts['host'] ?? null;\n        $port = $parts['port'] ?? null;\n\n        return [$host, $port];\n    }\n\n    /**\n     * Get a Uri populated with values from $_SERVER.\n     */\n    public static function getUriFromGlobals(): UriInterface\n    {\n        $uri = new Uri('');\n\n        $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http');\n\n        $hasPort = false;\n        if (isset($_SERVER['HTTP_HOST'])) {\n            [$host, $port] = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']);\n            if ($host !== null) {\n                $uri = $uri->withHost($host);\n            }\n\n            if ($port !== null) {\n                $hasPort = true;\n                $uri = $uri->withPort($port);\n            }\n        } elseif (isset($_SERVER['SERVER_NAME'])) {\n            $uri = $uri->withHost($_SERVER['SERVER_NAME']);\n        } elseif (isset($_SERVER['SERVER_ADDR'])) {\n            $uri = $uri->withHost($_SERVER['SERVER_ADDR']);\n        }\n\n        if (!$hasPort && isset($_SERVER['SERVER_PORT'])) {\n            $uri = $uri->withPort($_SERVER['SERVER_PORT']);\n        }\n\n        $hasQuery = false;\n        if (isset($_SERVER['REQUEST_URI'])) {\n            $requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2);\n            $uri = $uri->withPath($requestUriParts[0]);\n            if (isset($requestUriParts[1])) {\n                $hasQuery = true;\n                $uri = $uri->withQuery($requestUriParts[1]);\n            }\n        }\n\n        if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) {\n            $uri = $uri->withQuery($_SERVER['QUERY_STRING']);\n        }\n\n        return $uri;\n    }\n\n    public function getServerParams(): array\n    {\n        return $this->serverParams;\n    }\n\n    public function getUploadedFiles(): array\n    {\n        return $this->uploadedFiles;\n    }\n\n    public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface\n    {\n        $new = clone $this;\n        $new->uploadedFiles = $uploadedFiles;\n\n        return $new;\n    }\n\n    public function getCookieParams(): array\n    {\n        return $this->cookieParams;\n    }\n\n    public function withCookieParams(array $cookies): ServerRequestInterface\n    {\n        $new = clone $this;\n        $new->cookieParams = $cookies;\n\n        return $new;\n    }\n\n    public function getQueryParams(): array\n    {\n        return $this->queryParams;\n    }\n\n    public function withQueryParams(array $query): ServerRequestInterface\n    {\n        $new = clone $this;\n        $new->queryParams = $query;\n\n        return $new;\n    }\n\n    /**\n     * @return array|object|null\n     */\n    public function getParsedBody()\n    {\n        return $this->parsedBody;\n    }\n\n    public function withParsedBody($data): ServerRequestInterface\n    {\n        $new = clone $this;\n        $new->parsedBody = $data;\n\n        return $new;\n    }\n\n    public function getAttributes(): array\n    {\n        return $this->attributes;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getAttribute($attribute, $default = null)\n    {\n        if (false === array_key_exists($attribute, $this->attributes)) {\n            return $default;\n        }\n\n        return $this->attributes[$attribute];\n    }\n\n    public function withAttribute($attribute, $value): ServerRequestInterface\n    {\n        $new = clone $this;\n        $new->attributes[$attribute] = $value;\n\n        return $new;\n    }\n\n    public function withoutAttribute($attribute): ServerRequestInterface\n    {\n        if (false === array_key_exists($attribute, $this->attributes)) {\n            return $this;\n        }\n\n        $new = clone $this;\n        unset($new->attributes[$attribute]);\n\n        return $new;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/Stream.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * PHP stream implementation.\n */\nclass Stream implements StreamInterface\n{\n    /**\n     * @see https://www.php.net/manual/en/function.fopen.php\n     * @see https://www.php.net/manual/en/function.gzopen.php\n     */\n    private const READABLE_MODES = '/r|a\\+|ab\\+|w\\+|wb\\+|x\\+|xb\\+|c\\+|cb\\+/';\n    private const WRITABLE_MODES = '/a|w|r\\+|rb\\+|rw|x|c/';\n\n    /** @var resource */\n    private $stream;\n    /** @var int|null */\n    private $size;\n    /** @var bool */\n    private $seekable;\n    /** @var bool */\n    private $readable;\n    /** @var bool */\n    private $writable;\n    /** @var string|null */\n    private $uri;\n    /** @var mixed[] */\n    private $customMetadata;\n\n    /**\n     * This constructor accepts an associative array of options.\n     *\n     * - size: (int) If a read stream would otherwise have an indeterminate\n     *   size, but the size is known due to foreknowledge, then you can\n     *   provide that size, in bytes.\n     * - metadata: (array) Any additional metadata to return when the metadata\n     *   of the stream is accessed.\n     *\n     * @param resource                            $stream  Stream resource to wrap.\n     * @param array{size?: int, metadata?: array} $options Associative array of options.\n     *\n     * @throws \\InvalidArgumentException if the stream is not a stream resource\n     */\n    public function __construct($stream, array $options = [])\n    {\n        if (!is_resource($stream)) {\n            throw new \\InvalidArgumentException('Stream must be a resource');\n        }\n\n        if (isset($options['size'])) {\n            $this->size = $options['size'];\n        }\n\n        $this->customMetadata = $options['metadata'] ?? [];\n        $this->stream = $stream;\n        $meta = stream_get_meta_data($this->stream);\n        $this->seekable = $meta['seekable'];\n        $this->readable = (bool) preg_match(self::READABLE_MODES, $meta['mode']);\n        $this->writable = (bool) preg_match(self::WRITABLE_MODES, $meta['mode']);\n        $this->uri = $this->getMetadata('uri');\n    }\n\n    /**\n     * Closes the stream when the destructed\n     */\n    public function __destruct()\n    {\n        $this->close();\n    }\n\n    public function __toString(): string\n    {\n        try {\n            if ($this->isSeekable()) {\n                $this->seek(0);\n            }\n\n            return $this->getContents();\n        } catch (\\Throwable $e) {\n            if (\\PHP_VERSION_ID >= 70400) {\n                throw $e;\n            }\n            trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);\n\n            return '';\n        }\n    }\n\n    public function getContents(): string\n    {\n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n\n        if (!$this->readable) {\n            throw new \\RuntimeException('Cannot read from non-readable stream');\n        }\n\n        return Utils::tryGetContents($this->stream);\n    }\n\n    public function close(): void\n    {\n        if (isset($this->stream)) {\n            if (is_resource($this->stream)) {\n                fclose($this->stream);\n            }\n            $this->detach();\n        }\n    }\n\n    public function detach()\n    {\n        if (!isset($this->stream)) {\n            return null;\n        }\n\n        $result = $this->stream;\n        unset($this->stream);\n        $this->size = $this->uri = null;\n        $this->readable = $this->writable = $this->seekable = false;\n\n        return $result;\n    }\n\n    public function getSize(): ?int\n    {\n        if ($this->size !== null) {\n            return $this->size;\n        }\n\n        if (!isset($this->stream)) {\n            return null;\n        }\n\n        // Clear the stat cache if the stream has a URI\n        if ($this->uri) {\n            clearstatcache(true, $this->uri);\n        }\n\n        $stats = fstat($this->stream);\n        if (is_array($stats) && isset($stats['size'])) {\n            $this->size = $stats['size'];\n\n            return $this->size;\n        }\n\n        return null;\n    }\n\n    public function isReadable(): bool\n    {\n        return $this->readable;\n    }\n\n    public function isWritable(): bool\n    {\n        return $this->writable;\n    }\n\n    public function isSeekable(): bool\n    {\n        return $this->seekable;\n    }\n\n    public function eof(): bool\n    {\n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n\n        return feof($this->stream);\n    }\n\n    public function tell(): int\n    {\n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n\n        $result = ftell($this->stream);\n\n        if ($result === false) {\n            throw new \\RuntimeException('Unable to determine stream position');\n        }\n\n        return $result;\n    }\n\n    public function rewind(): void\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET): void\n    {\n        $whence = (int) $whence;\n\n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n        if (!$this->seekable) {\n            throw new \\RuntimeException('Stream is not seekable');\n        }\n        if (fseek($this->stream, $offset, $whence) === -1) {\n            throw new \\RuntimeException('Unable to seek to stream position '\n                .$offset.' with whence '.var_export($whence, true));\n        }\n    }\n\n    public function read($length): string\n    {\n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n        if (!$this->readable) {\n            throw new \\RuntimeException('Cannot read from non-readable stream');\n        }\n        if ($length < 0) {\n            throw new \\RuntimeException('Length parameter cannot be negative');\n        }\n\n        if (0 === $length) {\n            return '';\n        }\n\n        try {\n            $string = fread($this->stream, $length);\n        } catch (\\Exception $e) {\n            throw new \\RuntimeException('Unable to read from stream', 0, $e);\n        }\n\n        if (false === $string) {\n            throw new \\RuntimeException('Unable to read from stream');\n        }\n\n        return $string;\n    }\n\n    public function write($string): int\n    {\n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n        if (!$this->writable) {\n            throw new \\RuntimeException('Cannot write to a non-writable stream');\n        }\n\n        // We can't know the size after writing anything\n        $this->size = null;\n        $result = fwrite($this->stream, $string);\n\n        if ($result === false) {\n            throw new \\RuntimeException('Unable to write to stream');\n        }\n\n        return $result;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getMetadata($key = null)\n    {\n        if (!isset($this->stream)) {\n            return $key ? null : [];\n        } elseif (!$key) {\n            return $this->customMetadata + stream_get_meta_data($this->stream);\n        } elseif (isset($this->customMetadata[$key])) {\n            return $this->customMetadata[$key];\n        }\n\n        $meta = stream_get_meta_data($this->stream);\n\n        return $meta[$key] ?? null;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator trait\n *\n * @property StreamInterface $stream\n */\ntrait StreamDecoratorTrait\n{\n    /**\n     * @param StreamInterface $stream Stream to decorate\n     */\n    public function __construct(StreamInterface $stream)\n    {\n        $this->stream = $stream;\n    }\n\n    /**\n     * Magic method used to create a new stream if streams are not added in\n     * the constructor of a decorator (e.g., LazyOpenStream).\n     *\n     * @return StreamInterface\n     */\n    public function __get(string $name)\n    {\n        if ($name === 'stream') {\n            $this->stream = $this->createStream();\n\n            return $this->stream;\n        }\n\n        throw new \\UnexpectedValueException(\"$name not found on class\");\n    }\n\n    public function __toString(): string\n    {\n        try {\n            if ($this->isSeekable()) {\n                $this->seek(0);\n            }\n\n            return $this->getContents();\n        } catch (\\Throwable $e) {\n            if (\\PHP_VERSION_ID >= 70400) {\n                throw $e;\n            }\n            trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);\n\n            return '';\n        }\n    }\n\n    public function getContents(): string\n    {\n        return Utils::copyToString($this);\n    }\n\n    /**\n     * Allow decorators to implement custom methods\n     *\n     * @return mixed\n     */\n    public function __call(string $method, array $args)\n    {\n        /** @var callable $callable */\n        $callable = [$this->stream, $method];\n        $result = ($callable)(...$args);\n\n        // Always return the wrapped object if the result is a return $this\n        return $result === $this->stream ? $this : $result;\n    }\n\n    public function close(): void\n    {\n        $this->stream->close();\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getMetadata($key = null)\n    {\n        return $this->stream->getMetadata($key);\n    }\n\n    public function detach()\n    {\n        return $this->stream->detach();\n    }\n\n    public function getSize(): ?int\n    {\n        return $this->stream->getSize();\n    }\n\n    public function eof(): bool\n    {\n        return $this->stream->eof();\n    }\n\n    public function tell(): int\n    {\n        return $this->stream->tell();\n    }\n\n    public function isReadable(): bool\n    {\n        return $this->stream->isReadable();\n    }\n\n    public function isWritable(): bool\n    {\n        return $this->stream->isWritable();\n    }\n\n    public function isSeekable(): bool\n    {\n        return $this->stream->isSeekable();\n    }\n\n    public function rewind(): void\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET): void\n    {\n        $this->stream->seek($offset, $whence);\n    }\n\n    public function read($length): string\n    {\n        return $this->stream->read($length);\n    }\n\n    public function write($string): int\n    {\n        return $this->stream->write($string);\n    }\n\n    /**\n     * Implement in subclasses to dynamically create streams when requested.\n     *\n     * @throws \\BadMethodCallException\n     */\n    protected function createStream(): StreamInterface\n    {\n        throw new \\BadMethodCallException('Not implemented');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/StreamWrapper.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Converts Guzzle streams into PHP stream resources.\n *\n * @see https://www.php.net/streamwrapper\n */\nfinal class StreamWrapper\n{\n    /** @var resource */\n    public $context;\n\n    /** @var StreamInterface */\n    private $stream;\n\n    /** @var string r, r+, or w */\n    private $mode;\n\n    /**\n     * Returns a resource representing the stream.\n     *\n     * @param StreamInterface $stream The stream to get a resource for\n     *\n     * @return resource\n     *\n     * @throws \\InvalidArgumentException if stream is not readable or writable\n     */\n    public static function getResource(StreamInterface $stream)\n    {\n        self::register();\n\n        if ($stream->isReadable()) {\n            $mode = $stream->isWritable() ? 'r+' : 'r';\n        } elseif ($stream->isWritable()) {\n            $mode = 'w';\n        } else {\n            throw new \\InvalidArgumentException('The stream must be readable, '\n                .'writable, or both.');\n        }\n\n        return fopen('guzzle://stream', $mode, false, self::createStreamContext($stream));\n    }\n\n    /**\n     * Creates a stream context that can be used to open a stream as a php stream resource.\n     *\n     * @return resource\n     */\n    public static function createStreamContext(StreamInterface $stream)\n    {\n        return stream_context_create([\n            'guzzle' => ['stream' => $stream],\n        ]);\n    }\n\n    /**\n     * Registers the stream wrapper if needed\n     */\n    public static function register(): void\n    {\n        if (!in_array('guzzle', stream_get_wrappers())) {\n            stream_wrapper_register('guzzle', __CLASS__);\n        }\n    }\n\n    public function stream_open(string $path, string $mode, int $options, string &$opened_path = null): bool\n    {\n        $options = stream_context_get_options($this->context);\n\n        if (!isset($options['guzzle']['stream'])) {\n            return false;\n        }\n\n        $this->mode = $mode;\n        $this->stream = $options['guzzle']['stream'];\n\n        return true;\n    }\n\n    public function stream_read(int $count): string\n    {\n        return $this->stream->read($count);\n    }\n\n    public function stream_write(string $data): int\n    {\n        return $this->stream->write($data);\n    }\n\n    public function stream_tell(): int\n    {\n        return $this->stream->tell();\n    }\n\n    public function stream_eof(): bool\n    {\n        return $this->stream->eof();\n    }\n\n    public function stream_seek(int $offset, int $whence): bool\n    {\n        $this->stream->seek($offset, $whence);\n\n        return true;\n    }\n\n    /**\n     * @return resource|false\n     */\n    public function stream_cast(int $cast_as)\n    {\n        $stream = clone $this->stream;\n        $resource = $stream->detach();\n\n        return $resource ?? false;\n    }\n\n    /**\n     * @return array{\n     *   dev: int,\n     *   ino: int,\n     *   mode: int,\n     *   nlink: int,\n     *   uid: int,\n     *   gid: int,\n     *   rdev: int,\n     *   size: int,\n     *   atime: int,\n     *   mtime: int,\n     *   ctime: int,\n     *   blksize: int,\n     *   blocks: int\n     * }\n     */\n    public function stream_stat(): array\n    {\n        static $modeMap = [\n            'r' => 33060,\n            'rb' => 33060,\n            'r+' => 33206,\n            'w' => 33188,\n            'wb' => 33188,\n        ];\n\n        return [\n            'dev' => 0,\n            'ino' => 0,\n            'mode' => $modeMap[$this->mode],\n            'nlink' => 0,\n            'uid' => 0,\n            'gid' => 0,\n            'rdev' => 0,\n            'size' => $this->stream->getSize() ?: 0,\n            'atime' => 0,\n            'mtime' => 0,\n            'ctime' => 0,\n            'blksize' => 0,\n            'blocks' => 0,\n        ];\n    }\n\n    /**\n     * @return array{\n     *   dev: int,\n     *   ino: int,\n     *   mode: int,\n     *   nlink: int,\n     *   uid: int,\n     *   gid: int,\n     *   rdev: int,\n     *   size: int,\n     *   atime: int,\n     *   mtime: int,\n     *   ctime: int,\n     *   blksize: int,\n     *   blocks: int\n     * }\n     */\n    public function url_stat(string $path, int $flags): array\n    {\n        return [\n            'dev' => 0,\n            'ino' => 0,\n            'mode' => 0,\n            'nlink' => 0,\n            'uid' => 0,\n            'gid' => 0,\n            'rdev' => 0,\n            'size' => 0,\n            'atime' => 0,\n            'mtime' => 0,\n            'ctime' => 0,\n            'blksize' => 0,\n            'blocks' => 0,\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/UploadedFile.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UploadedFileInterface;\nuse RuntimeException;\n\nclass UploadedFile implements UploadedFileInterface\n{\n    private const ERRORS = [\n        UPLOAD_ERR_OK,\n        UPLOAD_ERR_INI_SIZE,\n        UPLOAD_ERR_FORM_SIZE,\n        UPLOAD_ERR_PARTIAL,\n        UPLOAD_ERR_NO_FILE,\n        UPLOAD_ERR_NO_TMP_DIR,\n        UPLOAD_ERR_CANT_WRITE,\n        UPLOAD_ERR_EXTENSION,\n    ];\n\n    /**\n     * @var string|null\n     */\n    private $clientFilename;\n\n    /**\n     * @var string|null\n     */\n    private $clientMediaType;\n\n    /**\n     * @var int\n     */\n    private $error;\n\n    /**\n     * @var string|null\n     */\n    private $file;\n\n    /**\n     * @var bool\n     */\n    private $moved = false;\n\n    /**\n     * @var int|null\n     */\n    private $size;\n\n    /**\n     * @var StreamInterface|null\n     */\n    private $stream;\n\n    /**\n     * @param StreamInterface|string|resource $streamOrFile\n     */\n    public function __construct(\n        $streamOrFile,\n        ?int $size,\n        int $errorStatus,\n        string $clientFilename = null,\n        string $clientMediaType = null\n    ) {\n        $this->setError($errorStatus);\n        $this->size = $size;\n        $this->clientFilename = $clientFilename;\n        $this->clientMediaType = $clientMediaType;\n\n        if ($this->isOk()) {\n            $this->setStreamOrFile($streamOrFile);\n        }\n    }\n\n    /**\n     * Depending on the value set file or stream variable\n     *\n     * @param StreamInterface|string|resource $streamOrFile\n     *\n     * @throws InvalidArgumentException\n     */\n    private function setStreamOrFile($streamOrFile): void\n    {\n        if (is_string($streamOrFile)) {\n            $this->file = $streamOrFile;\n        } elseif (is_resource($streamOrFile)) {\n            $this->stream = new Stream($streamOrFile);\n        } elseif ($streamOrFile instanceof StreamInterface) {\n            $this->stream = $streamOrFile;\n        } else {\n            throw new InvalidArgumentException(\n                'Invalid stream or file provided for UploadedFile'\n            );\n        }\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     */\n    private function setError(int $error): void\n    {\n        if (false === in_array($error, UploadedFile::ERRORS, true)) {\n            throw new InvalidArgumentException(\n                'Invalid error status for UploadedFile'\n            );\n        }\n\n        $this->error = $error;\n    }\n\n    private static function isStringNotEmpty($param): bool\n    {\n        return is_string($param) && false === empty($param);\n    }\n\n    /**\n     * Return true if there is no upload error\n     */\n    private function isOk(): bool\n    {\n        return $this->error === UPLOAD_ERR_OK;\n    }\n\n    public function isMoved(): bool\n    {\n        return $this->moved;\n    }\n\n    /**\n     * @throws RuntimeException if is moved or not ok\n     */\n    private function validateActive(): void\n    {\n        if (false === $this->isOk()) {\n            throw new RuntimeException('Cannot retrieve stream due to upload error');\n        }\n\n        if ($this->isMoved()) {\n            throw new RuntimeException('Cannot retrieve stream after it has already been moved');\n        }\n    }\n\n    public function getStream(): StreamInterface\n    {\n        $this->validateActive();\n\n        if ($this->stream instanceof StreamInterface) {\n            return $this->stream;\n        }\n\n        /** @var string $file */\n        $file = $this->file;\n\n        return new LazyOpenStream($file, 'r+');\n    }\n\n    public function moveTo($targetPath): void\n    {\n        $this->validateActive();\n\n        if (false === self::isStringNotEmpty($targetPath)) {\n            throw new InvalidArgumentException(\n                'Invalid path provided for move operation; must be a non-empty string'\n            );\n        }\n\n        if ($this->file) {\n            $this->moved = PHP_SAPI === 'cli'\n                ? rename($this->file, $targetPath)\n                : move_uploaded_file($this->file, $targetPath);\n        } else {\n            Utils::copyToStream(\n                $this->getStream(),\n                new LazyOpenStream($targetPath, 'w')\n            );\n\n            $this->moved = true;\n        }\n\n        if (false === $this->moved) {\n            throw new RuntimeException(\n                sprintf('Uploaded file could not be moved to %s', $targetPath)\n            );\n        }\n    }\n\n    public function getSize(): ?int\n    {\n        return $this->size;\n    }\n\n    public function getError(): int\n    {\n        return $this->error;\n    }\n\n    public function getClientFilename(): ?string\n    {\n        return $this->clientFilename;\n    }\n\n    public function getClientMediaType(): ?string\n    {\n        return $this->clientMediaType;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/Uri.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse GuzzleHttp\\Psr7\\Exception\\MalformedUriException;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * PSR-7 URI implementation.\n *\n * @author Michael Dowling\n * @author Tobias Schultze\n * @author Matthew Weier O'Phinney\n */\nclass Uri implements UriInterface, \\JsonSerializable\n{\n    /**\n     * Absolute http and https URIs require a host per RFC 7230 Section 2.7\n     * but in generic URIs the host can be empty. So for http(s) URIs\n     * we apply this default host when no host is given yet to form a\n     * valid URI.\n     */\n    private const HTTP_DEFAULT_HOST = 'localhost';\n\n    private const DEFAULT_PORTS = [\n        'http' => 80,\n        'https' => 443,\n        'ftp' => 21,\n        'gopher' => 70,\n        'nntp' => 119,\n        'news' => 119,\n        'telnet' => 23,\n        'tn3270' => 23,\n        'imap' => 143,\n        'pop' => 110,\n        'ldap' => 389,\n    ];\n\n    /**\n     * Unreserved characters for use in a regex.\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.3\n     */\n    private const CHAR_UNRESERVED = 'a-zA-Z0-9_\\-\\.~';\n\n    /**\n     * Sub-delims for use in a regex.\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.2\n     */\n    private const CHAR_SUB_DELIMS = '!\\$&\\'\\(\\)\\*\\+,;=';\n    private const QUERY_SEPARATORS_REPLACEMENT = ['=' => '%3D', '&' => '%26'];\n\n    /** @var string Uri scheme. */\n    private $scheme = '';\n\n    /** @var string Uri user info. */\n    private $userInfo = '';\n\n    /** @var string Uri host. */\n    private $host = '';\n\n    /** @var int|null Uri port. */\n    private $port;\n\n    /** @var string Uri path. */\n    private $path = '';\n\n    /** @var string Uri query string. */\n    private $query = '';\n\n    /** @var string Uri fragment. */\n    private $fragment = '';\n\n    /** @var string|null String representation */\n    private $composedComponents;\n\n    public function __construct(string $uri = '')\n    {\n        if ($uri !== '') {\n            $parts = self::parse($uri);\n            if ($parts === false) {\n                throw new MalformedUriException(\"Unable to parse URI: $uri\");\n            }\n            $this->applyParts($parts);\n        }\n    }\n\n    /**\n     * UTF-8 aware \\parse_url() replacement.\n     *\n     * The internal function produces broken output for non ASCII domain names\n     * (IDN) when used with locales other than \"C\".\n     *\n     * On the other hand, cURL understands IDN correctly only when UTF-8 locale\n     * is configured (\"C.UTF-8\", \"en_US.UTF-8\", etc.).\n     *\n     * @see https://bugs.php.net/bug.php?id=52923\n     * @see https://www.php.net/manual/en/function.parse-url.php#114817\n     * @see https://curl.haxx.se/libcurl/c/CURLOPT_URL.html#ENCODING\n     *\n     * @return array|false\n     */\n    private static function parse(string $url)\n    {\n        // If IPv6\n        $prefix = '';\n        if (preg_match('%^(.*://\\[[0-9:a-f]+\\])(.*?)$%', $url, $matches)) {\n            /** @var array{0:string, 1:string, 2:string} $matches */\n            $prefix = $matches[1];\n            $url = $matches[2];\n        }\n\n        /** @var string */\n        $encodedUrl = preg_replace_callback(\n            '%[^:/@?&=#]+%usD',\n            static function ($matches) {\n                return urlencode($matches[0]);\n            },\n            $url\n        );\n\n        $result = parse_url($prefix.$encodedUrl);\n\n        if ($result === false) {\n            return false;\n        }\n\n        return array_map('urldecode', $result);\n    }\n\n    public function __toString(): string\n    {\n        if ($this->composedComponents === null) {\n            $this->composedComponents = self::composeComponents(\n                $this->scheme,\n                $this->getAuthority(),\n                $this->path,\n                $this->query,\n                $this->fragment\n            );\n        }\n\n        return $this->composedComponents;\n    }\n\n    /**\n     * Composes a URI reference string from its various components.\n     *\n     * Usually this method does not need to be called manually but instead is used indirectly via\n     * `Psr\\Http\\Message\\UriInterface::__toString`.\n     *\n     * PSR-7 UriInterface treats an empty component the same as a missing component as\n     * getQuery(), getFragment() etc. always return a string. This explains the slight\n     * difference to RFC 3986 Section 5.3.\n     *\n     * Another adjustment is that the authority separator is added even when the authority is missing/empty\n     * for the \"file\" scheme. This is because PHP stream functions like `file_get_contents` only work with\n     * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But\n     * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to\n     * that format).\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.3\n     */\n    public static function composeComponents(?string $scheme, ?string $authority, string $path, ?string $query, ?string $fragment): string\n    {\n        $uri = '';\n\n        // weak type checks to also accept null until we can add scalar type hints\n        if ($scheme != '') {\n            $uri .= $scheme.':';\n        }\n\n        if ($authority != '' || $scheme === 'file') {\n            $uri .= '//'.$authority;\n        }\n\n        if ($authority != '' && $path != '' && $path[0] != '/') {\n            $path = '/'.$path;\n        }\n\n        $uri .= $path;\n\n        if ($query != '') {\n            $uri .= '?'.$query;\n        }\n\n        if ($fragment != '') {\n            $uri .= '#'.$fragment;\n        }\n\n        return $uri;\n    }\n\n    /**\n     * Whether the URI has the default port of the current scheme.\n     *\n     * `Psr\\Http\\Message\\UriInterface::getPort` may return null or the standard port. This method can be used\n     * independently of the implementation.\n     */\n    public static function isDefaultPort(UriInterface $uri): bool\n    {\n        return $uri->getPort() === null\n            || (isset(self::DEFAULT_PORTS[$uri->getScheme()]) && $uri->getPort() === self::DEFAULT_PORTS[$uri->getScheme()]);\n    }\n\n    /**\n     * Whether the URI is absolute, i.e. it has a scheme.\n     *\n     * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true\n     * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative\n     * to another URI, the base URI. Relative references can be divided into several forms:\n     * - network-path references, e.g. '//example.com/path'\n     * - absolute-path references, e.g. '/path'\n     * - relative-path references, e.g. 'subpath'\n     *\n     * @see Uri::isNetworkPathReference\n     * @see Uri::isAbsolutePathReference\n     * @see Uri::isRelativePathReference\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4\n     */\n    public static function isAbsolute(UriInterface $uri): bool\n    {\n        return $uri->getScheme() !== '';\n    }\n\n    /**\n     * Whether the URI is a network-path reference.\n     *\n     * A relative reference that begins with two slash characters is termed an network-path reference.\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2\n     */\n    public static function isNetworkPathReference(UriInterface $uri): bool\n    {\n        return $uri->getScheme() === '' && $uri->getAuthority() !== '';\n    }\n\n    /**\n     * Whether the URI is a absolute-path reference.\n     *\n     * A relative reference that begins with a single slash character is termed an absolute-path reference.\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2\n     */\n    public static function isAbsolutePathReference(UriInterface $uri): bool\n    {\n        return $uri->getScheme() === ''\n            && $uri->getAuthority() === ''\n            && isset($uri->getPath()[0])\n            && $uri->getPath()[0] === '/';\n    }\n\n    /**\n     * Whether the URI is a relative-path reference.\n     *\n     * A relative reference that does not begin with a slash character is termed a relative-path reference.\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2\n     */\n    public static function isRelativePathReference(UriInterface $uri): bool\n    {\n        return $uri->getScheme() === ''\n            && $uri->getAuthority() === ''\n            && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/');\n    }\n\n    /**\n     * Whether the URI is a same-document reference.\n     *\n     * A same-document reference refers to a URI that is, aside from its fragment\n     * component, identical to the base URI. When no base URI is given, only an empty\n     * URI reference (apart from its fragment) is considered a same-document reference.\n     *\n     * @param UriInterface      $uri  The URI to check\n     * @param UriInterface|null $base An optional base URI to compare against\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.4\n     */\n    public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool\n    {\n        if ($base !== null) {\n            $uri = UriResolver::resolve($base, $uri);\n\n            return ($uri->getScheme() === $base->getScheme())\n                && ($uri->getAuthority() === $base->getAuthority())\n                && ($uri->getPath() === $base->getPath())\n                && ($uri->getQuery() === $base->getQuery());\n        }\n\n        return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === '';\n    }\n\n    /**\n     * Creates a new URI with a specific query string value removed.\n     *\n     * Any existing query string values that exactly match the provided key are\n     * removed.\n     *\n     * @param UriInterface $uri URI to use as a base.\n     * @param string       $key Query string key to remove.\n     */\n    public static function withoutQueryValue(UriInterface $uri, string $key): UriInterface\n    {\n        $result = self::getFilteredQueryString($uri, [$key]);\n\n        return $uri->withQuery(implode('&', $result));\n    }\n\n    /**\n     * Creates a new URI with a specific query string value.\n     *\n     * Any existing query string values that exactly match the provided key are\n     * removed and replaced with the given key value pair.\n     *\n     * A value of null will set the query string key without a value, e.g. \"key\"\n     * instead of \"key=value\".\n     *\n     * @param UriInterface $uri   URI to use as a base.\n     * @param string       $key   Key to set.\n     * @param string|null  $value Value to set\n     */\n    public static function withQueryValue(UriInterface $uri, string $key, ?string $value): UriInterface\n    {\n        $result = self::getFilteredQueryString($uri, [$key]);\n\n        $result[] = self::generateQueryString($key, $value);\n\n        return $uri->withQuery(implode('&', $result));\n    }\n\n    /**\n     * Creates a new URI with multiple specific query string values.\n     *\n     * It has the same behavior as withQueryValue() but for an associative array of key => value.\n     *\n     * @param UriInterface    $uri           URI to use as a base.\n     * @param (string|null)[] $keyValueArray Associative array of key and values\n     */\n    public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface\n    {\n        $result = self::getFilteredQueryString($uri, array_keys($keyValueArray));\n\n        foreach ($keyValueArray as $key => $value) {\n            $result[] = self::generateQueryString((string) $key, $value !== null ? (string) $value : null);\n        }\n\n        return $uri->withQuery(implode('&', $result));\n    }\n\n    /**\n     * Creates a URI from a hash of `parse_url` components.\n     *\n     * @see https://www.php.net/manual/en/function.parse-url.php\n     *\n     * @throws MalformedUriException If the components do not form a valid URI.\n     */\n    public static function fromParts(array $parts): UriInterface\n    {\n        $uri = new self();\n        $uri->applyParts($parts);\n        $uri->validateState();\n\n        return $uri;\n    }\n\n    public function getScheme(): string\n    {\n        return $this->scheme;\n    }\n\n    public function getAuthority(): string\n    {\n        $authority = $this->host;\n        if ($this->userInfo !== '') {\n            $authority = $this->userInfo.'@'.$authority;\n        }\n\n        if ($this->port !== null) {\n            $authority .= ':'.$this->port;\n        }\n\n        return $authority;\n    }\n\n    public function getUserInfo(): string\n    {\n        return $this->userInfo;\n    }\n\n    public function getHost(): string\n    {\n        return $this->host;\n    }\n\n    public function getPort(): ?int\n    {\n        return $this->port;\n    }\n\n    public function getPath(): string\n    {\n        return $this->path;\n    }\n\n    public function getQuery(): string\n    {\n        return $this->query;\n    }\n\n    public function getFragment(): string\n    {\n        return $this->fragment;\n    }\n\n    public function withScheme($scheme): UriInterface\n    {\n        $scheme = $this->filterScheme($scheme);\n\n        if ($this->scheme === $scheme) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->scheme = $scheme;\n        $new->composedComponents = null;\n        $new->removeDefaultPort();\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withUserInfo($user, $password = null): UriInterface\n    {\n        $info = $this->filterUserInfoComponent($user);\n        if ($password !== null) {\n            $info .= ':'.$this->filterUserInfoComponent($password);\n        }\n\n        if ($this->userInfo === $info) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->userInfo = $info;\n        $new->composedComponents = null;\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withHost($host): UriInterface\n    {\n        $host = $this->filterHost($host);\n\n        if ($this->host === $host) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->host = $host;\n        $new->composedComponents = null;\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withPort($port): UriInterface\n    {\n        $port = $this->filterPort($port);\n\n        if ($this->port === $port) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->port = $port;\n        $new->composedComponents = null;\n        $new->removeDefaultPort();\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withPath($path): UriInterface\n    {\n        $path = $this->filterPath($path);\n\n        if ($this->path === $path) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->path = $path;\n        $new->composedComponents = null;\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withQuery($query): UriInterface\n    {\n        $query = $this->filterQueryAndFragment($query);\n\n        if ($this->query === $query) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->query = $query;\n        $new->composedComponents = null;\n\n        return $new;\n    }\n\n    public function withFragment($fragment): UriInterface\n    {\n        $fragment = $this->filterQueryAndFragment($fragment);\n\n        if ($this->fragment === $fragment) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->fragment = $fragment;\n        $new->composedComponents = null;\n\n        return $new;\n    }\n\n    public function jsonSerialize(): string\n    {\n        return $this->__toString();\n    }\n\n    /**\n     * Apply parse_url parts to a URI.\n     *\n     * @param array $parts Array of parse_url parts to apply.\n     */\n    private function applyParts(array $parts): void\n    {\n        $this->scheme = isset($parts['scheme'])\n            ? $this->filterScheme($parts['scheme'])\n            : '';\n        $this->userInfo = isset($parts['user'])\n            ? $this->filterUserInfoComponent($parts['user'])\n            : '';\n        $this->host = isset($parts['host'])\n            ? $this->filterHost($parts['host'])\n            : '';\n        $this->port = isset($parts['port'])\n            ? $this->filterPort($parts['port'])\n            : null;\n        $this->path = isset($parts['path'])\n            ? $this->filterPath($parts['path'])\n            : '';\n        $this->query = isset($parts['query'])\n            ? $this->filterQueryAndFragment($parts['query'])\n            : '';\n        $this->fragment = isset($parts['fragment'])\n            ? $this->filterQueryAndFragment($parts['fragment'])\n            : '';\n        if (isset($parts['pass'])) {\n            $this->userInfo .= ':'.$this->filterUserInfoComponent($parts['pass']);\n        }\n\n        $this->removeDefaultPort();\n    }\n\n    /**\n     * @param mixed $scheme\n     *\n     * @throws \\InvalidArgumentException If the scheme is invalid.\n     */\n    private function filterScheme($scheme): string\n    {\n        if (!is_string($scheme)) {\n            throw new \\InvalidArgumentException('Scheme must be a string');\n        }\n\n        return \\strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');\n    }\n\n    /**\n     * @param mixed $component\n     *\n     * @throws \\InvalidArgumentException If the user info is invalid.\n     */\n    private function filterUserInfoComponent($component): string\n    {\n        if (!is_string($component)) {\n            throw new \\InvalidArgumentException('User info must be a string');\n        }\n\n        return preg_replace_callback(\n            '/(?:[^%'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.']+|%(?![A-Fa-f0-9]{2}))/',\n            [$this, 'rawurlencodeMatchZero'],\n            $component\n        );\n    }\n\n    /**\n     * @param mixed $host\n     *\n     * @throws \\InvalidArgumentException If the host is invalid.\n     */\n    private function filterHost($host): string\n    {\n        if (!is_string($host)) {\n            throw new \\InvalidArgumentException('Host must be a string');\n        }\n\n        return \\strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');\n    }\n\n    /**\n     * @param mixed $port\n     *\n     * @throws \\InvalidArgumentException If the port is invalid.\n     */\n    private function filterPort($port): ?int\n    {\n        if ($port === null) {\n            return null;\n        }\n\n        $port = (int) $port;\n        if (0 > $port || 0xFFFF < $port) {\n            throw new \\InvalidArgumentException(\n                sprintf('Invalid port: %d. Must be between 0 and 65535', $port)\n            );\n        }\n\n        return $port;\n    }\n\n    /**\n     * @param (string|int)[] $keys\n     *\n     * @return string[]\n     */\n    private static function getFilteredQueryString(UriInterface $uri, array $keys): array\n    {\n        $current = $uri->getQuery();\n\n        if ($current === '') {\n            return [];\n        }\n\n        $decodedKeys = array_map(function ($k): string {\n            return rawurldecode((string) $k);\n        }, $keys);\n\n        return array_filter(explode('&', $current), function ($part) use ($decodedKeys) {\n            return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true);\n        });\n    }\n\n    private static function generateQueryString(string $key, ?string $value): string\n    {\n        // Query string separators (\"=\", \"&\") within the key or value need to be encoded\n        // (while preventing double-encoding) before setting the query string. All other\n        // chars that need percent-encoding will be encoded by withQuery().\n        $queryString = strtr($key, self::QUERY_SEPARATORS_REPLACEMENT);\n\n        if ($value !== null) {\n            $queryString .= '='.strtr($value, self::QUERY_SEPARATORS_REPLACEMENT);\n        }\n\n        return $queryString;\n    }\n\n    private function removeDefaultPort(): void\n    {\n        if ($this->port !== null && self::isDefaultPort($this)) {\n            $this->port = null;\n        }\n    }\n\n    /**\n     * Filters the path of a URI\n     *\n     * @param mixed $path\n     *\n     * @throws \\InvalidArgumentException If the path is invalid.\n     */\n    private function filterPath($path): string\n    {\n        if (!is_string($path)) {\n            throw new \\InvalidArgumentException('Path must be a string');\n        }\n\n        return preg_replace_callback(\n            '/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\\/]++|%(?![A-Fa-f0-9]{2}))/',\n            [$this, 'rawurlencodeMatchZero'],\n            $path\n        );\n    }\n\n    /**\n     * Filters the query string or fragment of a URI.\n     *\n     * @param mixed $str\n     *\n     * @throws \\InvalidArgumentException If the query or fragment is invalid.\n     */\n    private function filterQueryAndFragment($str): string\n    {\n        if (!is_string($str)) {\n            throw new \\InvalidArgumentException('Query and fragment must be a string');\n        }\n\n        return preg_replace_callback(\n            '/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\\/\\?]++|%(?![A-Fa-f0-9]{2}))/',\n            [$this, 'rawurlencodeMatchZero'],\n            $str\n        );\n    }\n\n    private function rawurlencodeMatchZero(array $match): string\n    {\n        return rawurlencode($match[0]);\n    }\n\n    private function validateState(): void\n    {\n        if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) {\n            $this->host = self::HTTP_DEFAULT_HOST;\n        }\n\n        if ($this->getAuthority() === '') {\n            if (0 === strpos($this->path, '//')) {\n                throw new MalformedUriException('The path of a URI without an authority must not start with two slashes \"//\"');\n            }\n            if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) {\n                throw new MalformedUriException('A relative URI must not have a path beginning with a segment containing a colon');\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/UriComparator.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Provides methods to determine if a modified URL should be considered cross-origin.\n *\n * @author Graham Campbell\n */\nfinal class UriComparator\n{\n    /**\n     * Determines if a modified URL should be considered cross-origin with\n     * respect to an original URL.\n     */\n    public static function isCrossOrigin(UriInterface $original, UriInterface $modified): bool\n    {\n        if (\\strcasecmp($original->getHost(), $modified->getHost()) !== 0) {\n            return true;\n        }\n\n        if ($original->getScheme() !== $modified->getScheme()) {\n            return true;\n        }\n\n        if (self::computePort($original) !== self::computePort($modified)) {\n            return true;\n        }\n\n        return false;\n    }\n\n    private static function computePort(UriInterface $uri): int\n    {\n        $port = $uri->getPort();\n\n        if (null !== $port) {\n            return $port;\n        }\n\n        return 'https' === $uri->getScheme() ? 443 : 80;\n    }\n\n    private function __construct()\n    {\n        // cannot be instantiated\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/UriNormalizer.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Provides methods to normalize and compare URIs.\n *\n * @author Tobias Schultze\n *\n * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6\n */\nfinal class UriNormalizer\n{\n    /**\n     * Default normalizations which only include the ones that preserve semantics.\n     */\n    public const PRESERVING_NORMALIZATIONS =\n        self::CAPITALIZE_PERCENT_ENCODING |\n        self::DECODE_UNRESERVED_CHARACTERS |\n        self::CONVERT_EMPTY_PATH |\n        self::REMOVE_DEFAULT_HOST |\n        self::REMOVE_DEFAULT_PORT |\n        self::REMOVE_DOT_SEGMENTS;\n\n    /**\n     * All letters within a percent-encoding triplet (e.g., \"%3A\") are case-insensitive, and should be capitalized.\n     *\n     * Example: http://example.org/a%c2%b1b → http://example.org/a%C2%B1b\n     */\n    public const CAPITALIZE_PERCENT_ENCODING = 1;\n\n    /**\n     * Decodes percent-encoded octets of unreserved characters.\n     *\n     * For consistency, percent-encoded octets in the ranges of ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39),\n     * hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should not be created by URI producers and,\n     * when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers.\n     *\n     * Example: http://example.org/%7Eusern%61me/ → http://example.org/~username/\n     */\n    public const DECODE_UNRESERVED_CHARACTERS = 2;\n\n    /**\n     * Converts the empty path to \"/\" for http and https URIs.\n     *\n     * Example: http://example.org → http://example.org/\n     */\n    public const CONVERT_EMPTY_PATH = 4;\n\n    /**\n     * Removes the default host of the given URI scheme from the URI.\n     *\n     * Only the \"file\" scheme defines the default host \"localhost\".\n     * All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile`\n     * are equivalent according to RFC 3986. The first format is not accepted\n     * by PHPs stream functions and thus already normalized implicitly to the\n     * second format in the Uri class. See `GuzzleHttp\\Psr7\\Uri::composeComponents`.\n     *\n     * Example: file://localhost/myfile → file:///myfile\n     */\n    public const REMOVE_DEFAULT_HOST = 8;\n\n    /**\n     * Removes the default port of the given URI scheme from the URI.\n     *\n     * Example: http://example.org:80/ → http://example.org/\n     */\n    public const REMOVE_DEFAULT_PORT = 16;\n\n    /**\n     * Removes unnecessary dot-segments.\n     *\n     * Dot-segments in relative-path references are not removed as it would\n     * change the semantics of the URI reference.\n     *\n     * Example: http://example.org/../a/b/../c/./d.html → http://example.org/a/c/d.html\n     */\n    public const REMOVE_DOT_SEGMENTS = 32;\n\n    /**\n     * Paths which include two or more adjacent slashes are converted to one.\n     *\n     * Webservers usually ignore duplicate slashes and treat those URIs equivalent.\n     * But in theory those URIs do not need to be equivalent. So this normalization\n     * may change the semantics. Encoded slashes (%2F) are not removed.\n     *\n     * Example: http://example.org//foo///bar.html → http://example.org/foo/bar.html\n     */\n    public const REMOVE_DUPLICATE_SLASHES = 64;\n\n    /**\n     * Sort query parameters with their values in alphabetical order.\n     *\n     * However, the order of parameters in a URI may be significant (this is not defined by the standard).\n     * So this normalization is not safe and may change the semantics of the URI.\n     *\n     * Example: ?lang=en&article=fred → ?article=fred&lang=en\n     *\n     * Note: The sorting is neither locale nor Unicode aware (the URI query does not get decoded at all) as the\n     * purpose is to be able to compare URIs in a reproducible way, not to have the params sorted perfectly.\n     */\n    public const SORT_QUERY_PARAMETERS = 128;\n\n    /**\n     * Returns a normalized URI.\n     *\n     * The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.\n     * This methods adds additional normalizations that can be configured with the $flags parameter.\n     *\n     * PSR-7 UriInterface cannot distinguish between an empty component and a missing component as\n     * getQuery(), getFragment() etc. always return a string. This means the URIs \"/?#\" and \"/\" are\n     * treated equivalent which is not necessarily true according to RFC 3986. But that difference\n     * is highly uncommon in reality. So this potential normalization is implied in PSR-7 as well.\n     *\n     * @param UriInterface $uri   The URI to normalize\n     * @param int          $flags A bitmask of normalizations to apply, see constants\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6.2\n     */\n    public static function normalize(UriInterface $uri, int $flags = self::PRESERVING_NORMALIZATIONS): UriInterface\n    {\n        if ($flags & self::CAPITALIZE_PERCENT_ENCODING) {\n            $uri = self::capitalizePercentEncoding($uri);\n        }\n\n        if ($flags & self::DECODE_UNRESERVED_CHARACTERS) {\n            $uri = self::decodeUnreservedCharacters($uri);\n        }\n\n        if ($flags & self::CONVERT_EMPTY_PATH && $uri->getPath() === ''\n            && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')\n        ) {\n            $uri = $uri->withPath('/');\n        }\n\n        if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') {\n            $uri = $uri->withHost('');\n        }\n\n        if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) {\n            $uri = $uri->withPort(null);\n        }\n\n        if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) {\n            $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath()));\n        }\n\n        if ($flags & self::REMOVE_DUPLICATE_SLASHES) {\n            $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath()));\n        }\n\n        if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') {\n            $queryKeyValues = explode('&', $uri->getQuery());\n            sort($queryKeyValues);\n            $uri = $uri->withQuery(implode('&', $queryKeyValues));\n        }\n\n        return $uri;\n    }\n\n    /**\n     * Whether two URIs can be considered equivalent.\n     *\n     * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also\n     * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be\n     * resolved against the same base URI. If this is not the case, determination of equivalence or difference of\n     * relative references does not mean anything.\n     *\n     * @param UriInterface $uri1           An URI to compare\n     * @param UriInterface $uri2           An URI to compare\n     * @param int          $normalizations A bitmask of normalizations to apply, see constants\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6.1\n     */\n    public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, int $normalizations = self::PRESERVING_NORMALIZATIONS): bool\n    {\n        return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations);\n    }\n\n    private static function capitalizePercentEncoding(UriInterface $uri): UriInterface\n    {\n        $regex = '/(?:%[A-Fa-f0-9]{2})++/';\n\n        $callback = function (array $match): string {\n            return strtoupper($match[0]);\n        };\n\n        return\n            $uri->withPath(\n                preg_replace_callback($regex, $callback, $uri->getPath())\n            )->withQuery(\n                preg_replace_callback($regex, $callback, $uri->getQuery())\n            );\n    }\n\n    private static function decodeUnreservedCharacters(UriInterface $uri): UriInterface\n    {\n        $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i';\n\n        $callback = function (array $match): string {\n            return rawurldecode($match[0]);\n        };\n\n        return\n            $uri->withPath(\n                preg_replace_callback($regex, $callback, $uri->getPath())\n            )->withQuery(\n                preg_replace_callback($regex, $callback, $uri->getQuery())\n            );\n    }\n\n    private function __construct()\n    {\n        // cannot be instantiated\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/UriResolver.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Resolves a URI reference in the context of a base URI and the opposite way.\n *\n * @author Tobias Schultze\n *\n * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5\n */\nfinal class UriResolver\n{\n    /**\n     * Removes dot segments from a path and returns the new path.\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n     */\n    public static function removeDotSegments(string $path): string\n    {\n        if ($path === '' || $path === '/') {\n            return $path;\n        }\n\n        $results = [];\n        $segments = explode('/', $path);\n        foreach ($segments as $segment) {\n            if ($segment === '..') {\n                array_pop($results);\n            } elseif ($segment !== '.') {\n                $results[] = $segment;\n            }\n        }\n\n        $newPath = implode('/', $results);\n\n        if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) {\n            // Re-add the leading slash if necessary for cases like \"/..\"\n            $newPath = '/'.$newPath;\n        } elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) {\n            // Add the trailing slash if necessary\n            // If newPath is not empty, then $segment must be set and is the last segment from the foreach\n            $newPath .= '/';\n        }\n\n        return $newPath;\n    }\n\n    /**\n     * Converts the relative URI into a new URI that is resolved against the base URI.\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2\n     */\n    public static function resolve(UriInterface $base, UriInterface $rel): UriInterface\n    {\n        if ((string) $rel === '') {\n            // we can simply return the same base URI instance for this same-document reference\n            return $base;\n        }\n\n        if ($rel->getScheme() != '') {\n            return $rel->withPath(self::removeDotSegments($rel->getPath()));\n        }\n\n        if ($rel->getAuthority() != '') {\n            $targetAuthority = $rel->getAuthority();\n            $targetPath = self::removeDotSegments($rel->getPath());\n            $targetQuery = $rel->getQuery();\n        } else {\n            $targetAuthority = $base->getAuthority();\n            if ($rel->getPath() === '') {\n                $targetPath = $base->getPath();\n                $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery();\n            } else {\n                if ($rel->getPath()[0] === '/') {\n                    $targetPath = $rel->getPath();\n                } else {\n                    if ($targetAuthority != '' && $base->getPath() === '') {\n                        $targetPath = '/'.$rel->getPath();\n                    } else {\n                        $lastSlashPos = strrpos($base->getPath(), '/');\n                        if ($lastSlashPos === false) {\n                            $targetPath = $rel->getPath();\n                        } else {\n                            $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1).$rel->getPath();\n                        }\n                    }\n                }\n                $targetPath = self::removeDotSegments($targetPath);\n                $targetQuery = $rel->getQuery();\n            }\n        }\n\n        return new Uri(Uri::composeComponents(\n            $base->getScheme(),\n            $targetAuthority,\n            $targetPath,\n            $targetQuery,\n            $rel->getFragment()\n        ));\n    }\n\n    /**\n     * Returns the target URI as a relative reference from the base URI.\n     *\n     * This method is the counterpart to resolve():\n     *\n     *    (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))\n     *\n     * One use-case is to use the current request URI as base URI and then generate relative links in your documents\n     * to reduce the document size or offer self-contained downloadable document archives.\n     *\n     *    $base = new Uri('http://example.com/a/b/');\n     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c'));  // prints 'c'.\n     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y'));  // prints '../x/y'.\n     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.\n     *    echo UriResolver::relativize($base, new Uri('http://example.org/a/b/'));   // prints '//example.org/a/b/'.\n     *\n     * This method also accepts a target that is already relative and will try to relativize it further. Only a\n     * relative-path reference will be returned as-is.\n     *\n     *    echo UriResolver::relativize($base, new Uri('/a/b/c'));  // prints 'c' as well\n     */\n    public static function relativize(UriInterface $base, UriInterface $target): UriInterface\n    {\n        if ($target->getScheme() !== ''\n            && ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')\n        ) {\n            return $target;\n        }\n\n        if (Uri::isRelativePathReference($target)) {\n            // As the target is already highly relative we return it as-is. It would be possible to resolve\n            // the target with `$target = self::resolve($base, $target);` and then try make it more relative\n            // by removing a duplicate query. But let's not do that automatically.\n            return $target;\n        }\n\n        if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) {\n            return $target->withScheme('');\n        }\n\n        // We must remove the path before removing the authority because if the path starts with two slashes, the URI\n        // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also\n        // invalid.\n        $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost('');\n\n        if ($base->getPath() !== $target->getPath()) {\n            return $emptyPathUri->withPath(self::getRelativePath($base, $target));\n        }\n\n        if ($base->getQuery() === $target->getQuery()) {\n            // Only the target fragment is left. And it must be returned even if base and target fragment are the same.\n            return $emptyPathUri->withQuery('');\n        }\n\n        // If the base URI has a query but the target has none, we cannot return an empty path reference as it would\n        // inherit the base query component when resolving.\n        if ($target->getQuery() === '') {\n            $segments = explode('/', $target->getPath());\n            /** @var string $lastSegment */\n            $lastSegment = end($segments);\n\n            return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment);\n        }\n\n        return $emptyPathUri;\n    }\n\n    private static function getRelativePath(UriInterface $base, UriInterface $target): string\n    {\n        $sourceSegments = explode('/', $base->getPath());\n        $targetSegments = explode('/', $target->getPath());\n        array_pop($sourceSegments);\n        $targetLastSegment = array_pop($targetSegments);\n        foreach ($sourceSegments as $i => $segment) {\n            if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) {\n                unset($sourceSegments[$i], $targetSegments[$i]);\n            } else {\n                break;\n            }\n        }\n        $targetSegments[] = $targetLastSegment;\n        $relativePath = str_repeat('../', count($sourceSegments)).implode('/', $targetSegments);\n\n        // A reference to am empty last segment or an empty first sub-segment must be prefixed with \"./\".\n        // This also applies to a segment with a colon character (e.g., \"file:colon\") that cannot be used\n        // as the first segment of a relative-path reference, as it would be mistaken for a scheme name.\n        if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) {\n            $relativePath = \"./$relativePath\";\n        } elseif ('/' === $relativePath[0]) {\n            if ($base->getAuthority() != '' && $base->getPath() === '') {\n                // In this case an extra slash is added by resolve() automatically. So we must not add one here.\n                $relativePath = \".$relativePath\";\n            } else {\n                $relativePath = \"./$relativePath\";\n            }\n        }\n\n        return $relativePath;\n    }\n\n    private function __construct()\n    {\n        // cannot be instantiated\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/guzzlehttp/psr7/src/Utils.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\nfinal class Utils\n{\n    /**\n     * Remove the items given by the keys, case insensitively from the data.\n     *\n     * @param (string|int)[] $keys\n     */\n    public static function caselessRemove(array $keys, array $data): array\n    {\n        $result = [];\n\n        foreach ($keys as &$key) {\n            $key = strtolower((string) $key);\n        }\n\n        foreach ($data as $k => $v) {\n            if (!in_array(strtolower((string) $k), $keys)) {\n                $result[$k] = $v;\n            }\n        }\n\n        return $result;\n    }\n\n    /**\n     * Copy the contents of a stream into another stream until the given number\n     * of bytes have been read.\n     *\n     * @param StreamInterface $source Stream to read from\n     * @param StreamInterface $dest   Stream to write to\n     * @param int             $maxLen Maximum number of bytes to read. Pass -1\n     *                                to read the entire stream.\n     *\n     * @throws \\RuntimeException on error.\n     */\n    public static function copyToStream(StreamInterface $source, StreamInterface $dest, int $maxLen = -1): void\n    {\n        $bufferSize = 8192;\n\n        if ($maxLen === -1) {\n            while (!$source->eof()) {\n                if (!$dest->write($source->read($bufferSize))) {\n                    break;\n                }\n            }\n        } else {\n            $remaining = $maxLen;\n            while ($remaining > 0 && !$source->eof()) {\n                $buf = $source->read(min($bufferSize, $remaining));\n                $len = strlen($buf);\n                if (!$len) {\n                    break;\n                }\n                $remaining -= $len;\n                $dest->write($buf);\n            }\n        }\n    }\n\n    /**\n     * Copy the contents of a stream into a string until the given number of\n     * bytes have been read.\n     *\n     * @param StreamInterface $stream Stream to read\n     * @param int             $maxLen Maximum number of bytes to read. Pass -1\n     *                                to read the entire stream.\n     *\n     * @throws \\RuntimeException on error.\n     */\n    public static function copyToString(StreamInterface $stream, int $maxLen = -1): string\n    {\n        $buffer = '';\n\n        if ($maxLen === -1) {\n            while (!$stream->eof()) {\n                $buf = $stream->read(1048576);\n                if ($buf === '') {\n                    break;\n                }\n                $buffer .= $buf;\n            }\n\n            return $buffer;\n        }\n\n        $len = 0;\n        while (!$stream->eof() && $len < $maxLen) {\n            $buf = $stream->read($maxLen - $len);\n            if ($buf === '') {\n                break;\n            }\n            $buffer .= $buf;\n            $len = strlen($buffer);\n        }\n\n        return $buffer;\n    }\n\n    /**\n     * Calculate a hash of a stream.\n     *\n     * This method reads the entire stream to calculate a rolling hash, based\n     * on PHP's `hash_init` functions.\n     *\n     * @param StreamInterface $stream    Stream to calculate the hash for\n     * @param string          $algo      Hash algorithm (e.g. md5, crc32, etc)\n     * @param bool            $rawOutput Whether or not to use raw output\n     *\n     * @throws \\RuntimeException on error.\n     */\n    public static function hash(StreamInterface $stream, string $algo, bool $rawOutput = false): string\n    {\n        $pos = $stream->tell();\n\n        if ($pos > 0) {\n            $stream->rewind();\n        }\n\n        $ctx = hash_init($algo);\n        while (!$stream->eof()) {\n            hash_update($ctx, $stream->read(1048576));\n        }\n\n        $out = hash_final($ctx, $rawOutput);\n        $stream->seek($pos);\n\n        return $out;\n    }\n\n    /**\n     * Clone and modify a request with the given changes.\n     *\n     * This method is useful for reducing the number of clones needed to mutate\n     * a message.\n     *\n     * The changes can be one of:\n     * - method: (string) Changes the HTTP method.\n     * - set_headers: (array) Sets the given headers.\n     * - remove_headers: (array) Remove the given headers.\n     * - body: (mixed) Sets the given body.\n     * - uri: (UriInterface) Set the URI.\n     * - query: (string) Set the query string value of the URI.\n     * - version: (string) Set the protocol version.\n     *\n     * @param RequestInterface $request Request to clone and modify.\n     * @param array            $changes Changes to apply.\n     */\n    public static function modifyRequest(RequestInterface $request, array $changes): RequestInterface\n    {\n        if (!$changes) {\n            return $request;\n        }\n\n        $headers = $request->getHeaders();\n\n        if (!isset($changes['uri'])) {\n            $uri = $request->getUri();\n        } else {\n            // Remove the host header if one is on the URI\n            if ($host = $changes['uri']->getHost()) {\n                $changes['set_headers']['Host'] = $host;\n\n                if ($port = $changes['uri']->getPort()) {\n                    $standardPorts = ['http' => 80, 'https' => 443];\n                    $scheme = $changes['uri']->getScheme();\n                    if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) {\n                        $changes['set_headers']['Host'] .= ':'.$port;\n                    }\n                }\n            }\n            $uri = $changes['uri'];\n        }\n\n        if (!empty($changes['remove_headers'])) {\n            $headers = self::caselessRemove($changes['remove_headers'], $headers);\n        }\n\n        if (!empty($changes['set_headers'])) {\n            $headers = self::caselessRemove(array_keys($changes['set_headers']), $headers);\n            $headers = $changes['set_headers'] + $headers;\n        }\n\n        if (isset($changes['query'])) {\n            $uri = $uri->withQuery($changes['query']);\n        }\n\n        if ($request instanceof ServerRequestInterface) {\n            $new = (new ServerRequest(\n                $changes['method'] ?? $request->getMethod(),\n                $uri,\n                $headers,\n                $changes['body'] ?? $request->getBody(),\n                $changes['version'] ?? $request->getProtocolVersion(),\n                $request->getServerParams()\n            ))\n            ->withParsedBody($request->getParsedBody())\n            ->withQueryParams($request->getQueryParams())\n            ->withCookieParams($request->getCookieParams())\n            ->withUploadedFiles($request->getUploadedFiles());\n\n            foreach ($request->getAttributes() as $key => $value) {\n                $new = $new->withAttribute($key, $value);\n            }\n\n            return $new;\n        }\n\n        return new Request(\n            $changes['method'] ?? $request->getMethod(),\n            $uri,\n            $headers,\n            $changes['body'] ?? $request->getBody(),\n            $changes['version'] ?? $request->getProtocolVersion()\n        );\n    }\n\n    /**\n     * Read a line from the stream up to the maximum allowed buffer length.\n     *\n     * @param StreamInterface $stream    Stream to read from\n     * @param int|null        $maxLength Maximum buffer length\n     */\n    public static function readLine(StreamInterface $stream, int $maxLength = null): string\n    {\n        $buffer = '';\n        $size = 0;\n\n        while (!$stream->eof()) {\n            if ('' === ($byte = $stream->read(1))) {\n                return $buffer;\n            }\n            $buffer .= $byte;\n            // Break when a new line is found or the max length - 1 is reached\n            if ($byte === \"\\n\" || ++$size === $maxLength - 1) {\n                break;\n            }\n        }\n\n        return $buffer;\n    }\n\n    /**\n     * Create a new stream based on the input type.\n     *\n     * Options is an associative array that can contain the following keys:\n     * - metadata: Array of custom metadata.\n     * - size: Size of the stream.\n     *\n     * This method accepts the following `$resource` types:\n     * - `Psr\\Http\\Message\\StreamInterface`: Returns the value as-is.\n     * - `string`: Creates a stream object that uses the given string as the contents.\n     * - `resource`: Creates a stream object that wraps the given PHP stream resource.\n     * - `Iterator`: If the provided value implements `Iterator`, then a read-only\n     *   stream object will be created that wraps the given iterable. Each time the\n     *   stream is read from, data from the iterator will fill a buffer and will be\n     *   continuously called until the buffer is equal to the requested read size.\n     *   Subsequent read calls will first read from the buffer and then call `next`\n     *   on the underlying iterator until it is exhausted.\n     * - `object` with `__toString()`: If the object has the `__toString()` method,\n     *   the object will be cast to a string and then a stream will be returned that\n     *   uses the string value.\n     * - `NULL`: When `null` is passed, an empty stream object is returned.\n     * - `callable` When a callable is passed, a read-only stream object will be\n     *   created that invokes the given callable. The callable is invoked with the\n     *   number of suggested bytes to read. The callable can return any number of\n     *   bytes, but MUST return `false` when there is no more data to return. The\n     *   stream object that wraps the callable will invoke the callable until the\n     *   number of requested bytes are available. Any additional bytes will be\n     *   buffered and used in subsequent reads.\n     *\n     * @param resource|string|int|float|bool|StreamInterface|callable|\\Iterator|null $resource Entity body data\n     * @param array{size?: int, metadata?: array}                                    $options  Additional options\n     *\n     * @throws \\InvalidArgumentException if the $resource arg is not valid.\n     */\n    public static function streamFor($resource = '', array $options = []): StreamInterface\n    {\n        if (is_scalar($resource)) {\n            $stream = self::tryFopen('php://temp', 'r+');\n            if ($resource !== '') {\n                fwrite($stream, (string) $resource);\n                fseek($stream, 0);\n            }\n\n            return new Stream($stream, $options);\n        }\n\n        switch (gettype($resource)) {\n            case 'resource':\n                /*\n                 * The 'php://input' is a special stream with quirks and inconsistencies.\n                 * We avoid using that stream by reading it into php://temp\n                 */\n\n                /** @var resource $resource */\n                if ((\\stream_get_meta_data($resource)['uri'] ?? '') === 'php://input') {\n                    $stream = self::tryFopen('php://temp', 'w+');\n                    stream_copy_to_stream($resource, $stream);\n                    fseek($stream, 0);\n                    $resource = $stream;\n                }\n\n                return new Stream($resource, $options);\n            case 'object':\n                /** @var object $resource */\n                if ($resource instanceof StreamInterface) {\n                    return $resource;\n                } elseif ($resource instanceof \\Iterator) {\n                    return new PumpStream(function () use ($resource) {\n                        if (!$resource->valid()) {\n                            return false;\n                        }\n                        $result = $resource->current();\n                        $resource->next();\n\n                        return $result;\n                    }, $options);\n                } elseif (method_exists($resource, '__toString')) {\n                    return self::streamFor((string) $resource, $options);\n                }\n                break;\n            case 'NULL':\n                return new Stream(self::tryFopen('php://temp', 'r+'), $options);\n        }\n\n        if (is_callable($resource)) {\n            return new PumpStream($resource, $options);\n        }\n\n        throw new \\InvalidArgumentException('Invalid resource type: '.gettype($resource));\n    }\n\n    /**\n     * Safely opens a PHP stream resource using a filename.\n     *\n     * When fopen fails, PHP normally raises a warning. This function adds an\n     * error handler that checks for errors and throws an exception instead.\n     *\n     * @param string $filename File to open\n     * @param string $mode     Mode used to open the file\n     *\n     * @return resource\n     *\n     * @throws \\RuntimeException if the file cannot be opened\n     */\n    public static function tryFopen(string $filename, string $mode)\n    {\n        $ex = null;\n        set_error_handler(static function (int $errno, string $errstr) use ($filename, $mode, &$ex): bool {\n            $ex = new \\RuntimeException(sprintf(\n                'Unable to open \"%s\" using mode \"%s\": %s',\n                $filename,\n                $mode,\n                $errstr\n            ));\n\n            return true;\n        });\n\n        try {\n            /** @var resource $handle */\n            $handle = fopen($filename, $mode);\n        } catch (\\Throwable $e) {\n            $ex = new \\RuntimeException(sprintf(\n                'Unable to open \"%s\" using mode \"%s\": %s',\n                $filename,\n                $mode,\n                $e->getMessage()\n            ), 0, $e);\n        }\n\n        restore_error_handler();\n\n        if ($ex) {\n            /** @var $ex \\RuntimeException */\n            throw $ex;\n        }\n\n        return $handle;\n    }\n\n    /**\n     * Safely gets the contents of a given stream.\n     *\n     * When stream_get_contents fails, PHP normally raises a warning. This\n     * function adds an error handler that checks for errors and throws an\n     * exception instead.\n     *\n     * @param resource $stream\n     *\n     * @throws \\RuntimeException if the stream cannot be read\n     */\n    public static function tryGetContents($stream): string\n    {\n        $ex = null;\n        set_error_handler(static function (int $errno, string $errstr) use (&$ex): bool {\n            $ex = new \\RuntimeException(sprintf(\n                'Unable to read stream contents: %s',\n                $errstr\n            ));\n\n            return true;\n        });\n\n        try {\n            /** @var string|false $contents */\n            $contents = stream_get_contents($stream);\n\n            if ($contents === false) {\n                $ex = new \\RuntimeException('Unable to read stream contents');\n            }\n        } catch (\\Throwable $e) {\n            $ex = new \\RuntimeException(sprintf(\n                'Unable to read stream contents: %s',\n                $e->getMessage()\n            ), 0, $e);\n        }\n\n        restore_error_handler();\n\n        if ($ex) {\n            /** @var $ex \\RuntimeException */\n            throw $ex;\n        }\n\n        return $contents;\n    }\n\n    /**\n     * Returns a UriInterface for the given value.\n     *\n     * This function accepts a string or UriInterface and returns a\n     * UriInterface for the given value. If the value is already a\n     * UriInterface, it is returned as-is.\n     *\n     * @param string|UriInterface $uri\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public static function uriFor($uri): UriInterface\n    {\n        if ($uri instanceof UriInterface) {\n            return $uri;\n        }\n\n        if (is_string($uri)) {\n            return new Uri($uri);\n        }\n\n        throw new \\InvalidArgumentException('URI must be a string or UriInterface');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/CHANGELOG.md",
    "content": "### 3.6.0 (2024-04-12)\n\n  * Added `LineFormatter->setBasePath(...)` that allows removing the project's path from the stack trace output (#1873)\n  * Added `$includeExtra` option in `PsrHandler` to also use extra data to replace placeholder values in the message (#1852)\n  * Added ability to customize what is a duplicated message by extending the `DeduplicationHandler` (#1879)\n  * Added handling for using `GelfMessageFormatter` together with the `AmqpHandler` (#1869)\n  * Added ability to extend `GoogleCloudLoggingFormatter` (#1859)\n  * Fixed `__toString` failures in context data crashing the normalization process (#1868)\n  * Fixed PHP 8.4 deprecation warnings (#1874)\n\n### 3.5.0 (2023-10-27)\n\n  * Added ability to indent stack traces in LineFormatter via e.g. `indentStacktraces('  ')` (#1835)\n  * Added ability to configure a max level name length in LineFormatter via e.g. `setMaxLevelNameLength(3)` (#1850)\n  * Added support for indexed arrays (i.e. `[]` and not `{}` arrays once json serialized) containing inline linebreaks in LineFormatter (#1818)\n  * Added `WithMonologChannel` attribute for integrators to use to configure autowiring (#1847)\n  * Fixed log record `extra` data leaking between handlers that have handler-specific processors set (#1819)\n  * Fixed LogglyHandler issue with record level filtering (#1841)\n  * Fixed display_errors parsing in ErrorHandler which did not support string values (#1804)\n  * Fixed bug where the previous error handler would not be restored in some cases where StreamHandler fails (#1815)\n  * Fixed normalization error when normalizing incomplete classes (#1833)\n\n### 3.4.0 (2023-06-21)\n\n  * Added `LoadAverageProcessor` to track one of the 1, 5 or 15min load averages (#1803)\n  * Added support for priority to the `AsMonologProcessor` attribute (#1797)\n  * Added `TelegramBotHandler` `topic`/`message_thread_id` support (#1802)\n  * Fixed `FingersCrossedHandler` passthruLevel checking (#1801)\n  * Fixed support of yearly and monthly rotation log file to rotate only once a month/year (#1805)\n  * Fixed `TestHandler` method docs (#1794)\n  * Fixed handling of falsey `display_errors` string values (#1804)\n\n### 3.3.1 (2023-02-06)\n\n  * Fixed Logger not being serializable anymore (#1792)\n\n### 3.3.0 (2023-02-06)\n\n  * Deprecated FlowdockHandler & Formatter as the flowdock service was shutdown (#1748)\n  * Added `ClosureContextProcessor` to allow delaying the creation of context data by setting a Closure in context which is called when the log record is used (#1745)\n  * Added an ElasticsearchHandler option to set the `op_type` to `create` instead of the default `index` (#1766)\n  * Added support for enum context values in PsrLogMessageProcessor (#1773)\n  * Added graylog2/gelf-php 2.x support (#1747)\n  * Improved `BrowserConsoleHandler` logging to use more appropriate methods than just console.log in the browser (#1739)\n  * Fixed GitProcessor not filtering correctly based on Level (#1749)\n  * Fixed `WhatFailureGroupHandler` not catching errors happening inside `close()` (#1791)\n  * Fixed datetime field in `GoogleCloudLoggingFormatter` (#1758)\n  * Fixed infinite loop detection within Fibers (#1753)\n  * Fixed `AmqpHandler->setExtraAttributes` not working with buffering handler wrappers (#1781)\n\n### 3.2.0 (2022-07-24)\n\n  * Deprecated `CubeHandler` and `PHPConsoleHandler` as both projects are abandoned and those should not be used anymore (#1734)\n  * Marked `Logger` `@final` as it should not be extended, prefer composition or talk to us if you are missing something\n  * Added RFC 5424 level (`7` to `0`) support to `Logger::log` and `Logger::addRecord` to increase interoperability (#1723)\n  * Added `SyslogFormatter` to output syslog-like files which can be consumed by tools like [lnav](https://lnav.org/) (#1689)\n  * Added support for `__toString` for objects which are not json serializable in `JsonFormatter` (#1733)\n  * Added `GoogleCloudLoggingFormatter` (#1719)\n  * Added support for Predis 2.x (#1732)\n  * Added `AmqpHandler->setExtraAttributes` to allow configuring attributes when using an AMQPExchange (#1724)\n  * Fixed serialization/unserialization of handlers to make sure private properties are included (#1727)\n  * Fixed allowInlineLineBreaks in LineFormatter causing issues with windows paths containing `\\n` or `\\r` sequences (#1720)\n  * Fixed max normalization depth not being taken into account when formatting exceptions with a deep chain of previous exceptions (#1726)\n  * Fixed PHP 8.2 deprecation warnings (#1722)\n  * Fixed rare race condition or filesystem issue where StreamHandler is unable to create the directory the log should go into yet it exists already (#1678)\n\n### 3.1.0 (2022-06-09)\n\n  * Added `$datetime` parameter to `Logger::addRecord` as low level API to allow logging into the past or future (#1682)\n  * Added `Logger::useLoggingLoopDetection` to allow disabling cyclic logging detection in concurrent frameworks (#1681)\n  * Fixed handling of fatal errors if callPrevious is disabled in ErrorHandler (#1670)\n  * Fixed interop issue by removing the need for a return type in ProcessorInterface (#1680)\n  * Marked the reusable `Monolog\\Test\\TestCase` class as `@internal` to make sure PHPStorm does not show it above PHPUnit, you may still use it to test your own handlers/etc though (#1677)\n  * Fixed RotatingFileHandler issue when the date format contained slashes (#1671)\n\n### 3.0.0 (2022-05-10)\n\nChanges from RC1\n\n- The `Monolog\\LevelName` enum does not exist anymore, use `Monolog\\Level->getName()` instead.\n\n### 3.0.0-RC1 (2022-05-08)\n\nThis is mostly a cleanup release offering stronger type guarantees for integrators with the\narray->object/enum changes, but there is no big new feature for end users.\n\nSee [UPGRADE notes](UPGRADE.md#300) for details on all breaking changes especially if you are extending/implementing Monolog classes/interfaces.\n\nNoteworthy BC Breaks:\n\n- The minimum supported PHP version is now `8.1.0`.\n- Log records have been converted from an array to a [`Monolog\\LogRecord` object](src/Monolog/LogRecord.php)\n  with public (and mostly readonly) properties. e.g. instead of doing\n  `$record['context']` use `$record->context`.\n  In formatters or handlers if you rather need an array to work with you can use `$record->toArray()`\n  to get back a Monolog 1/2 style record array. This will contain the enum values instead of enum cases\n  in the `level` and `level_name` keys to be more backwards compatible and use simpler data types.\n- `FormatterInterface`, `HandlerInterface`, `ProcessorInterface`, etc. changed to contain `LogRecord $record`\n  instead of `array $record` parameter types. If you want to support multiple Monolog versions this should\n  be possible by type-hinting nothing, or `array|LogRecord` if you support PHP 8.0+. You can then code\n  against the $record using Monolog 2 style as LogRecord implements ArrayAccess for BC.\n  The interfaces do not require a `LogRecord` return type even where it would be applicable, but if you only\n  support Monolog 3 in integration code I would recommend you use `LogRecord` return types wherever fitting\n  to ensure forward compatibility as it may be added in Monolog 4.\n- Log levels are now enums [`Monolog\\Level`](src/Monolog/Level.php) and [`Monolog\\LevelName`](src/Monolog/LevelName.php)\n- Removed deprecated SwiftMailerHandler, migrate to SymfonyMailerHandler instead.\n- `ResettableInterface::reset()` now requires a void return type.\n- All properties have had types added, which may require you to do so as well if you extended\n  a Monolog class and declared the same property.\n\nNew deprecations:\n\n- `Logger::DEBUG`, `Logger::ERROR`, etc. are now deprecated in favor of the `Monolog\\Level` enum.\n  e.g. instead of `Logger::WARNING` use `Level::Warning` if you need to pass the enum case\n  to Monolog or one of its handlers, or `Level::Warning->value` if you need the integer\n  value equal to what `Logger::WARNING` was giving you.\n- `Logger::getLevelName()` is now deprecated.\n\n### 2.9.3 (2024-04-12)\n\n  * Fixed PHP 8.4 deprecation warnings (#1874)\n\n### 2.9.2 (2023-10-27)\n\n  * Fixed display_errors parsing in ErrorHandler which did not support string values (#1804)\n  * Fixed bug where the previous error handler would not be restored in some cases where StreamHandler fails (#1815)\n  * Fixed normalization error when normalizing incomplete classes (#1833)\n\n### 2.9.1 (2023-02-06)\n\n  * Fixed Logger not being serializable anymore (#1792)\n\n### 2.9.0 (2023-02-05)\n\n  * Deprecated FlowdockHandler & Formatter as the flowdock service was shutdown (#1748)\n  * Added support for enum context values in PsrLogMessageProcessor (#1773)\n  * Added graylog2/gelf-php 2.x support (#1747)\n  * Improved `BrowserConsoleHandler` logging to use more appropriate methods than just console.log in the browser (#1739)\n  * Fixed `WhatFailureGroupHandler` not catching errors happening inside `close()` (#1791)\n  * Fixed datetime field in `GoogleCloudLoggingFormatter` (#1758)\n  * Fixed infinite loop detection within Fibers (#1753)\n  * Fixed `AmqpHandler->setExtraAttributes` not working with buffering handler wrappers (#1781)\n\n### 2.8.0 (2022-07-24)\n\n  * Deprecated `CubeHandler` and `PHPConsoleHandler` as both projects are abandoned and those should not be used anymore (#1734)\n  * Added RFC 5424 level (`7` to `0`) support to `Logger::log` and `Logger::addRecord` to increase interoperability (#1723)\n  * Added support for `__toString` for objects which are not json serializable in `JsonFormatter` (#1733)\n  * Added `GoogleCloudLoggingFormatter` (#1719)\n  * Added support for Predis 2.x (#1732)\n  * Added `AmqpHandler->setExtraAttributes` to allow configuring attributes when using an AMQPExchange (#1724)\n  * Fixed serialization/unserialization of handlers to make sure private properties are included (#1727)\n  * Fixed allowInlineLineBreaks in LineFormatter causing issues with windows paths containing `\\n` or `\\r` sequences (#1720)\n  * Fixed max normalization depth not being taken into account when formatting exceptions with a deep chain of previous exceptions (#1726)\n  * Fixed PHP 8.2 deprecation warnings (#1722)\n  * Fixed rare race condition or filesystem issue where StreamHandler is unable to create the directory the log should go into yet it exists already (#1678)\n\n### 2.7.0 (2022-06-09)\n\n  * Added `$datetime` parameter to `Logger::addRecord` as low level API to allow logging into the past or future (#1682)\n  * Added `Logger::useLoggingLoopDetection` to allow disabling cyclic logging detection in concurrent frameworks (#1681)\n  * Fixed handling of fatal errors if callPrevious is disabled in ErrorHandler (#1670)\n  * Marked the reusable `Monolog\\Test\\TestCase` class as `@internal` to make sure PHPStorm does not show it above PHPUnit, you may still use it to test your own handlers/etc though (#1677)\n  * Fixed RotatingFileHandler issue when the date format contained slashes (#1671)\n\n### 2.6.0 (2022-05-10)\n\n  * Deprecated `SwiftMailerHandler`, use `SymfonyMailerHandler` instead\n  * Added `SymfonyMailerHandler` (#1663)\n  * Added ElasticSearch 8.x support to the ElasticsearchHandler (#1662)\n  * Added a way to filter/modify stack traces in LineFormatter (#1665)\n  * Fixed UdpSocket not being able to reopen/reconnect after close()\n  * Fixed infinite loops if a Handler is triggering logging while handling log records\n\n### 2.5.0 (2022-04-08)\n\n  * Added `callType` to IntrospectionProcessor (#1612)\n  * Fixed AsMonologProcessor syntax to be compatible with PHP 7.2 (#1651)\n\n### 2.4.0 (2022-03-14)\n\n  * Added [`Monolog\\LogRecord`](src/Monolog/LogRecord.php) interface that can be used to type-hint records like `array|\\Monolog\\LogRecord $record` to be forward compatible with the upcoming Monolog 3 changes\n  * Added `includeStacktraces` constructor params to LineFormatter & JsonFormatter (#1603)\n  * Added `persistent`, `timeout`, `writingTimeout`, `connectionTimeout`, `chunkSize` constructor params to SocketHandler and derivatives (#1600)\n  * Added `AsMonologProcessor` PHP attribute which can help autowiring / autoconfiguration of processors if frameworks / integrations decide to make use of it. This is useless when used purely with Monolog (#1637)\n  * Added support for keeping native BSON types as is in MongoDBFormatter (#1620)\n  * Added support for a `user_agent` key in WebProcessor, disabled by default but you can use it by configuring the $extraFields you want (#1613)\n  * Added support for username/userIcon in SlackWebhookHandler (#1617)\n  * Added extension points to BrowserConsoleHandler (#1593)\n  * Added record message/context/extra info to exceptions thrown when a StreamHandler cannot open its stream to avoid completely losing the data logged (#1630)\n  * Fixed error handler signature to accept a null $context which happens with internal PHP errors (#1614)\n  * Fixed a few setter methods not returning `self` (#1609)\n  * Fixed handling of records going over the max Telegram message length (#1616)\n\n### 2.3.5 (2021-10-01)\n\n  * Fixed regression in StreamHandler since 2.3.3 on systems with the memory_limit set to >=20GB (#1592)\n\n### 2.3.4 (2021-09-15)\n\n  * Fixed support for psr/log 3.x (#1589)\n\n### 2.3.3 (2021-09-14)\n\n  * Fixed memory usage when using StreamHandler and calling stream_get_contents on the resource you passed to it (#1578, #1577)\n  * Fixed support for psr/log 2.x (#1587)\n  * Fixed some type annotations\n\n### 2.3.2 (2021-07-23)\n\n  * Fixed compatibility with PHP 7.2 - 7.4 when experiencing PCRE errors (#1568)\n\n### 2.3.1 (2021-07-14)\n\n  * Fixed Utils::getClass handling of anonymous classes not being fully compatible with PHP 8 (#1563)\n  * Fixed some `@inheritDoc` annotations having the wrong case\n\n### 2.3.0 (2021-07-05)\n\n  * Added a ton of PHPStan type annotations as well as type aliases on Monolog\\Logger for Record, Level and LevelName that you can import (#1557)\n  * Added ability to customize date format when using JsonFormatter (#1561)\n  * Fixed FilterHandler not calling reset on its internal handler when reset() is called on it (#1531)\n  * Fixed SyslogUdpHandler not setting the timezone correctly on DateTimeImmutable instances (#1540)\n  * Fixed StreamHandler thread safety - chunk size set to 2GB now to avoid interlacing when doing concurrent writes (#1553)\n\n### 2.2.0 (2020-12-14)\n\n  * Added JSON_PARTIAL_OUTPUT_ON_ERROR to default json encoding flags, to avoid dropping entire context data or even records due to an invalid subset of it somewhere\n  * Added setDateFormat to NormalizerFormatter (and Line/Json formatters by extension) to allow changing this after object creation\n  * Added RedisPubSubHandler to log records to a Redis channel using PUBLISH\n  * Added support for Elastica 7, and deprecated the $type argument of ElasticaFormatter which is not in use anymore as of Elastica 7\n  * Added support for millisecond write timeouts in SocketHandler, you can now pass floats to setWritingTimeout, e.g. 0.2 is 200ms\n  * Added support for unix sockets in SyslogUdpHandler (set $port to 0 to make the $host a unix socket)\n  * Added handleBatch support for TelegramBotHandler\n  * Added RFC5424e extended date format including milliseconds to SyslogUdpHandler\n  * Added support for configuring handlers with numeric level values in strings (coming from e.g. env vars)\n  * Fixed Wildfire/FirePHP/ChromePHP handling of unicode characters\n  * Fixed PHP 8 issues in SyslogUdpHandler\n  * Fixed internal type error when mbstring is missing\n\n### 2.1.1 (2020-07-23)\n\n  * Fixed removing of json encoding options\n  * Fixed type hint of $level not accepting strings in SendGridHandler and OverflowHandler\n  * Fixed SwiftMailerHandler not accepting email templates with an empty subject\n  * Fixed array access on null in RavenHandler\n  * Fixed unique_id in WebProcessor not being disableable\n\n### 2.1.0 (2020-05-22)\n\n  * Added `JSON_INVALID_UTF8_SUBSTITUTE` to default json flags, so that invalid UTF8 characters now get converted to [�](https://en.wikipedia.org/wiki/Specials_(Unicode_block)#Replacement_character) instead of being converted from ISO-8859-15 to UTF8 as it was before, which was hardly a comprehensive solution\n  * Added `$ignoreEmptyContextAndExtra` option to JsonFormatter to skip empty context/extra entirely from the output\n  * Added `$parseMode`, `$disableWebPagePreview` and `$disableNotification` options to TelegramBotHandler\n  * Added tentative support for PHP 8\n  * NormalizerFormatter::addJsonEncodeOption and removeJsonEncodeOption are now public to allow modifying default json flags\n  * Fixed GitProcessor type error when there is no git repo present\n  * Fixed normalization of SoapFault objects containing deeply nested objects as \"detail\"\n  * Fixed support for relative paths in RotatingFileHandler\n\n### 2.0.2 (2019-12-20)\n\n  * Fixed ElasticsearchHandler swallowing exceptions details when failing to index log records\n  * Fixed normalization of SoapFault objects containing non-strings as \"detail\" in LineFormatter\n  * Fixed formatting of resources in JsonFormatter\n  * Fixed RedisHandler failing to use MULTI properly when passed a proxied Redis instance (e.g. in Symfony with lazy services)\n  * Fixed FilterHandler triggering a notice when handleBatch was filtering all records passed to it\n  * Fixed Turkish locale messing up the conversion of level names to their constant values\n\n### 2.0.1 (2019-11-13)\n\n  * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable\n  * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler, OverflowHandler and SamplingHandler\n  * Fixed BrowserConsoleHandler formatting when using multiple styles\n  * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings\n  * Fixed normalization of SoapFault objects containing non-strings as \"detail\"\n  * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding\n  * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB).\n  * Fixed type error in BrowserConsoleHandler when the context array of log records was not associative.\n\n### 2.0.0 (2019-08-30)\n\n  * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release\n  * BC Break: Logger methods log/debug/info/notice/warning/error/critical/alert/emergency now have explicit void return types\n  * Added FallbackGroupHandler which works like the WhatFailureGroupHandler but stops dispatching log records as soon as one handler accepted it\n  * Fixed support for UTF-8 when cutting strings to avoid cutting a multibyte-character in half\n  * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases\n  * Fixed date timezone handling in SyslogUdpHandler\n\n### 2.0.0-beta2 (2019-07-06)\n\n  * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release\n  * BC Break: PHP 7.2 is now the minimum required PHP version.\n  * BC Break: Removed SlackbotHandler, RavenHandler and HipChatHandler, see [UPGRADE.md](UPGRADE.md) for details\n  * Added OverflowHandler which will only flush log records to its nested handler when reaching a certain amount of logs (i.e. only pass through when things go really bad)\n  * Added TelegramBotHandler to log records to a [Telegram](https://core.telegram.org/bots/api) bot account\n  * Added support for JsonSerializable when normalizing exceptions\n  * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler\n  * Added SoapFault details to formatted exceptions\n  * Fixed DeduplicationHandler silently failing to start when file could not be opened\n  * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records\n  * Fixed GelfFormatter losing some data when one attachment was too long\n  * Fixed issue in SignalHandler restarting syscalls functionality\n  * Improved performance of LogglyHandler when sending multiple logs in a single request\n\n### 2.0.0-beta1 (2018-12-08)\n\n  * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release\n  * BC Break: PHP 7.1 is now the minimum required PHP version.\n  * BC Break: Quite a few interface changes, only relevant if you implemented your own handlers/processors/formatters\n  * BC Break: Removed non-PSR-3 methods to add records, all the `add*` (e.g. `addWarning`) methods as well as `emerg`, `crit`, `err` and `warn`\n  * BC Break: The record timezone is now set per Logger instance and not statically anymore\n  * BC Break: There is no more default handler configured on empty Logger instances\n  * BC Break: ElasticSearchHandler renamed to ElasticaHandler\n  * BC Break: Various handler-specific breaks, see [UPGRADE.md](UPGRADE.md) for details\n  * Added scalar type hints and return hints in all the places it was possible. Switched strict_types on for more reliability.\n  * Added DateTimeImmutable support, all record datetime are now immutable, and will toString/json serialize with the correct date format, including microseconds (unless disabled)\n  * Added timezone and microseconds to the default date format\n  * Added SendGridHandler to use the SendGrid API to send emails\n  * Added LogmaticHandler to use the Logmatic.io API to store log records\n  * Added SqsHandler to send log records to an AWS SQS queue\n  * Added ElasticsearchHandler to send records via the official ES library. Elastica users should now use ElasticaHandler instead of ElasticSearchHandler\n  * Added NoopHandler which is similar to the NullHandle but does not prevent the bubbling of log records to handlers further down the configuration, useful for temporarily disabling a handler in configuration files\n  * Added ProcessHandler to write log output to the STDIN of a given process\n  * Added HostnameProcessor that adds the machine's hostname to log records\n  * Added a `$dateFormat` option to the PsrLogMessageProcessor which lets you format DateTime instances nicely\n  * Added support for the PHP 7.x `mongodb` extension in the MongoDBHandler\n  * Fixed many minor issues in various handlers, and probably added a few regressions too\n\n### 1.26.1 (2021-05-28)\n\n  * Fixed PHP 8.1 deprecation warning\n\n### 1.26.0 (2020-12-14)\n\n  * Added $dateFormat and $removeUsedContextFields arguments to PsrLogMessageProcessor (backport from 2.x)\n\n### 1.25.5 (2020-07-23)\n\n  * Fixed array access on null in RavenHandler\n  * Fixed unique_id in WebProcessor not being disableable\n\n### 1.25.4 (2020-05-22)\n\n  * Fixed GitProcessor type error when there is no git repo present\n  * Fixed normalization of SoapFault objects containing deeply nested objects as \"detail\"\n  * Fixed support for relative paths in RotatingFileHandler\n\n### 1.25.3 (2019-12-20)\n\n  * Fixed formatting of resources in JsonFormatter\n  * Fixed RedisHandler failing to use MULTI properly when passed a proxied Redis instance (e.g. in Symfony with lazy services)\n  * Fixed FilterHandler triggering a notice when handleBatch was filtering all records passed to it\n  * Fixed Turkish locale messing up the conversion of level names to their constant values\n\n### 1.25.2 (2019-11-13)\n\n  * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable\n  * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler and SamplingHandler\n  * Fixed BrowserConsoleHandler formatting when using multiple styles\n  * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings\n  * Fixed normalization of SoapFault objects containing non-strings as \"detail\"\n  * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding\n\n### 1.25.1 (2019-09-06)\n\n  * Fixed forward-compatible interfaces to be compatible with Monolog 1.x too.\n\n### 1.25.0 (2019-09-06)\n\n  * Deprecated SlackbotHandler, use SlackWebhookHandler or SlackHandler instead\n  * Deprecated RavenHandler, use sentry/sentry 2.x and their Sentry\\Monolog\\Handler instead\n  * Deprecated HipChatHandler, migrate to Slack and use SlackWebhookHandler or SlackHandler instead\n  * Added forward-compatible interfaces and traits FormattableHandlerInterface, FormattableHandlerTrait, ProcessableHandlerInterface, ProcessableHandlerTrait. If you use modern PHP and want to make code compatible with Monolog 1 and 2 this can help. You will have to require at least Monolog 1.25 though.\n  * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler\n  * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records\n  * Fixed issue in SignalHandler restarting syscalls functionality\n  * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases\n  * Fixed ZendMonitorHandler to work with the latest Zend Server versions\n  * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB).\n\n### 1.24.0 (2018-11-05)\n\n  * BC Notice: If you are extending any of the Monolog's Formatters' `normalize` method, make sure you add the new `$depth = 0` argument to your function signature to avoid strict PHP warnings.\n  * Added a `ResettableInterface` in order to reset/reset/clear/flush handlers and processors\n  * Added a `ProcessorInterface` as an optional way to label a class as being a processor (mostly useful for autowiring dependency containers)\n  * Added a way to log signals being received using Monolog\\SignalHandler\n  * Added ability to customize error handling at the Logger level using Logger::setExceptionHandler\n  * Added InsightOpsHandler to migrate users of the LogEntriesHandler\n  * Added protection to NormalizerFormatter against circular and very deep structures, it now stops normalizing at a depth of 9\n  * Added capture of stack traces to ErrorHandler when logging PHP errors\n  * Added RavenHandler support for a `contexts` context or extra key to forward that to Sentry's contexts\n  * Added forwarding of context info to FluentdFormatter\n  * Added SocketHandler::setChunkSize to override the default chunk size in case you must send large log lines to rsyslog for example\n  * Added ability to extend/override BrowserConsoleHandler\n  * Added SlackWebhookHandler::getWebhookUrl and SlackHandler::getToken to enable class extensibility\n  * Added SwiftMailerHandler::getSubjectFormatter to enable class extensibility\n  * Dropped official support for HHVM in test builds\n  * Fixed normalization of exception traces when call_user_func is used to avoid serializing objects and the data they contain\n  * Fixed naming of fields in Slack handler, all field names are now capitalized in all cases\n  * Fixed HipChatHandler bug where slack dropped messages randomly\n  * Fixed normalization of objects in Slack handlers\n  * Fixed support for PHP7's Throwable in NewRelicHandler\n  * Fixed race bug when StreamHandler sometimes incorrectly reported it failed to create a directory\n  * Fixed table row styling issues in HtmlFormatter\n  * Fixed RavenHandler dropping the message when logging exception\n  * Fixed WhatFailureGroupHandler skipping processors when using handleBatch\n    and implement it where possible\n  * Fixed display of anonymous class names\n\n### 1.23.0 (2017-06-19)\n\n  * Improved SyslogUdpHandler's support for RFC5424 and added optional `$ident` argument\n  * Fixed GelfHandler truncation to be per field and not per message\n  * Fixed compatibility issue with PHP <5.3.6\n  * Fixed support for headless Chrome in ChromePHPHandler\n  * Fixed support for latest Aws SDK in DynamoDbHandler\n  * Fixed support for SwiftMailer 6.0+ in SwiftMailerHandler\n\n### 1.22.1 (2017-03-13)\n\n  * Fixed lots of minor issues in the new Slack integrations\n  * Fixed support for allowInlineLineBreaks in LineFormatter when formatting exception backtraces\n\n### 1.22.0 (2016-11-26)\n\n  * Added SlackbotHandler and SlackWebhookHandler to set up Slack integration more easily\n  * Added MercurialProcessor to add mercurial revision and branch names to log records\n  * Added support for AWS SDK v3 in DynamoDbHandler\n  * Fixed fatal errors occurring when normalizing generators that have been fully consumed\n  * Fixed RollbarHandler to include a level (rollbar level), monolog_level (original name), channel and datetime (unix)\n  * Fixed RollbarHandler not flushing records automatically, calling close() explicitly is not necessary anymore\n  * Fixed SyslogUdpHandler to avoid sending empty frames\n  * Fixed a few PHP 7.0 and 7.1 compatibility issues\n\n### 1.21.0 (2016-07-29)\n\n  * Break: Reverted the addition of $context when the ErrorHandler handles regular php errors from 1.20.0 as it was causing issues\n  * Added support for more formats in RotatingFileHandler::setFilenameFormat as long as they have Y, m and d in order\n  * Added ability to format the main line of text the SlackHandler sends by explicitly setting a formatter on the handler\n  * Added information about SoapFault instances in NormalizerFormatter\n  * Added $handleOnlyReportedErrors option on ErrorHandler::registerErrorHandler (default true) to allow logging of all errors no matter the error_reporting level\n\n### 1.20.0 (2016-07-02)\n\n  * Added FingersCrossedHandler::activate() to manually trigger the handler regardless of the activation policy\n  * Added StreamHandler::getUrl to retrieve the stream's URL\n  * Added ability to override addRow/addTitle in HtmlFormatter\n  * Added the $context to context information when the ErrorHandler handles a regular php error\n  * Deprecated RotatingFileHandler::setFilenameFormat to only support 3 formats: Y, Y-m and Y-m-d\n  * Fixed WhatFailureGroupHandler to work with PHP7 throwables\n  * Fixed a few minor bugs\n\n### 1.19.0 (2016-04-12)\n\n  * Break: StreamHandler will not close streams automatically that it does not own. If you pass in a stream (not a path/url), then it will not close it for you. You can retrieve those using getStream() if needed\n  * Added DeduplicationHandler to remove duplicate records from notifications across multiple requests, useful for email or other notifications on errors\n  * Added ability to use `%message%` and other LineFormatter replacements in the subject line of emails sent with NativeMailHandler and SwiftMailerHandler\n  * Fixed HipChatHandler handling of long messages\n\n### 1.18.2 (2016-04-02)\n\n  * Fixed ElasticaFormatter to use more precise dates\n  * Fixed GelfMessageFormatter sending too long messages\n\n### 1.18.1 (2016-03-13)\n\n  * Fixed SlackHandler bug where slack dropped messages randomly\n  * Fixed RedisHandler issue when using with the PHPRedis extension\n  * Fixed AmqpHandler content-type being incorrectly set when using with the AMQP extension\n  * Fixed BrowserConsoleHandler regression\n\n### 1.18.0 (2016-03-01)\n\n  * Added optional reduction of timestamp precision via `Logger->useMicrosecondTimestamps(false)`, disabling it gets you a bit of performance boost but reduces the precision to the second instead of microsecond\n  * Added possibility to skip some extra stack frames in IntrospectionProcessor if you have some library wrapping Monolog that is always adding frames\n  * Added `Logger->withName` to clone a logger (keeping all handlers) with a new name\n  * Added FluentdFormatter for the Fluentd unix socket protocol\n  * Added HandlerWrapper base class to ease the creation of handler wrappers, just extend it and override as needed\n  * Added support for replacing context sub-keys using `%context.*%` in LineFormatter\n  * Added support for `payload` context value in RollbarHandler\n  * Added setRelease to RavenHandler to describe the application version, sent with every log\n  * Added support for `fingerprint` context value in RavenHandler\n  * Fixed JSON encoding errors that would gobble up the whole log record, we now handle those more gracefully by dropping chars as needed\n  * Fixed write timeouts in SocketHandler and derivatives, set to 10sec by default, lower it with `setWritingTimeout()`\n  * Fixed PHP7 compatibility with regard to Exception/Throwable handling in a few places\n\n### 1.17.2 (2015-10-14)\n\n  * Fixed ErrorHandler compatibility with non-Monolog PSR-3 loggers\n  * Fixed SlackHandler handling to use slack functionalities better\n  * Fixed SwiftMailerHandler bug when sending multiple emails they all had the same id\n  * Fixed 5.3 compatibility regression\n\n### 1.17.1 (2015-08-31)\n\n  * Fixed RollbarHandler triggering PHP notices\n\n### 1.17.0 (2015-08-30)\n\n  * Added support for `checksum` and `release` context/extra values in RavenHandler\n  * Added better support for exceptions in RollbarHandler\n  * Added UidProcessor::getUid\n  * Added support for showing the resource type in NormalizedFormatter\n  * Fixed IntrospectionProcessor triggering PHP notices\n\n### 1.16.0 (2015-08-09)\n\n  * Added IFTTTHandler to notify ifttt.com triggers\n  * Added Logger::setHandlers() to allow setting/replacing all handlers\n  * Added $capSize in RedisHandler to cap the log size\n  * Fixed StreamHandler creation of directory to only trigger when the first log write happens\n  * Fixed bug in the handling of curl failures\n  * Fixed duplicate logging of fatal errors when both error and fatal error handlers are registered in monolog's ErrorHandler\n  * Fixed missing fatal errors records with handlers that need to be closed to flush log records\n  * Fixed TagProcessor::addTags support for associative arrays\n\n### 1.15.0 (2015-07-12)\n\n  * Added addTags and setTags methods to change a TagProcessor\n  * Added automatic creation of directories if they are missing for a StreamHandler to open a log file\n  * Added retry functionality to Loggly, Cube and Mandrill handlers so they retry up to 5 times in case of network failure\n  * Fixed process exit code being incorrectly reset to 0 if ErrorHandler::registerExceptionHandler was used\n  * Fixed HTML/JS escaping in BrowserConsoleHandler\n  * Fixed JSON encoding errors being silently suppressed (PHP 5.5+ only)\n\n### 1.14.0 (2015-06-19)\n\n  * Added PHPConsoleHandler to send record to Chrome's PHP Console extension and library\n  * Added support for objects implementing __toString in the NormalizerFormatter\n  * Added support for HipChat's v2 API in HipChatHandler\n  * Added Logger::setTimezone() to initialize the timezone monolog should use in case date.timezone isn't correct for your app\n  * Added an option to send formatted message instead of the raw record on PushoverHandler via ->useFormattedMessage(true)\n  * Fixed curl errors being silently suppressed\n\n### 1.13.1 (2015-03-09)\n\n  * Fixed regression in HipChat requiring a new token to be created\n\n### 1.13.0 (2015-03-05)\n\n  * Added Registry::hasLogger to check for the presence of a logger instance\n  * Added context.user support to RavenHandler\n  * Added HipChat API v2 support in the HipChatHandler\n  * Added NativeMailerHandler::addParameter to pass params to the mail() process\n  * Added context data to SlackHandler when $includeContextAndExtra is true\n  * Added ability to customize the Swift_Message per-email in SwiftMailerHandler\n  * Fixed SwiftMailerHandler to lazily create message instances if a callback is provided\n  * Fixed serialization of INF and NaN values in Normalizer and LineFormatter\n\n### 1.12.0 (2014-12-29)\n\n  * Break: HandlerInterface::isHandling now receives a partial record containing only a level key. This was always the intent and does not break any Monolog handler but is strictly speaking a BC break and you should check if you relied on any other field in your own handlers.\n  * Added PsrHandler to forward records to another PSR-3 logger\n  * Added SamplingHandler to wrap around a handler and include only every Nth record\n  * Added MongoDBFormatter to support better storage with MongoDBHandler (it must be enabled manually for now)\n  * Added exception codes in the output of most formatters\n  * Added LineFormatter::includeStacktraces to enable exception stack traces in logs (uses more than one line)\n  * Added $useShortAttachment to SlackHandler to minify attachment size and $includeExtra to append extra data\n  * Added $host to HipChatHandler for users of private instances\n  * Added $transactionName to NewRelicHandler and support for a transaction_name context value\n  * Fixed MandrillHandler to avoid outputting API call responses\n  * Fixed some non-standard behaviors in SyslogUdpHandler\n\n### 1.11.0 (2014-09-30)\n\n  * Break: The NewRelicHandler extra and context data are now prefixed with extra_ and context_ to avoid clashes. Watch out if you have scripts reading those from the API and rely on names\n  * Added WhatFailureGroupHandler to suppress any exception coming from the wrapped handlers and avoid chain failures if a logging service fails\n  * Added MandrillHandler to send emails via the Mandrillapp.com API\n  * Added SlackHandler to log records to a Slack.com account\n  * Added FleepHookHandler to log records to a Fleep.io account\n  * Added LogglyHandler::addTag to allow adding tags to an existing handler\n  * Added $ignoreEmptyContextAndExtra to LineFormatter to avoid empty [] at the end\n  * Added $useLocking to StreamHandler and RotatingFileHandler to enable flock() while writing\n  * Added support for PhpAmqpLib in the AmqpHandler\n  * Added FingersCrossedHandler::clear and BufferHandler::clear to reset them between batches in long running jobs\n  * Added support for adding extra fields from $_SERVER in the WebProcessor\n  * Fixed support for non-string values in PrsLogMessageProcessor\n  * Fixed SwiftMailer messages being sent with the wrong date in long running scripts\n  * Fixed minor PHP 5.6 compatibility issues\n  * Fixed BufferHandler::close being called twice\n\n### 1.10.0 (2014-06-04)\n\n  * Added Logger::getHandlers() and Logger::getProcessors() methods\n  * Added $passthruLevel argument to FingersCrossedHandler to let it always pass some records through even if the trigger level is not reached\n  * Added support for extra data in NewRelicHandler\n  * Added $expandNewlines flag to the ErrorLogHandler to create multiple log entries when a message has multiple lines\n\n### 1.9.1 (2014-04-24)\n\n  * Fixed regression in RotatingFileHandler file permissions\n  * Fixed initialization of the BufferHandler to make sure it gets flushed after receiving records\n  * Fixed ChromePHPHandler and FirePHPHandler's activation strategies to be more conservative\n\n### 1.9.0 (2014-04-20)\n\n  * Added LogEntriesHandler to send logs to a LogEntries account\n  * Added $filePermissions to tweak file mode on StreamHandler and RotatingFileHandler\n  * Added $useFormatting flag to MemoryProcessor to make it send raw data in bytes\n  * Added support for table formatting in FirePHPHandler via the table context key\n  * Added a TagProcessor to add tags to records, and support for tags in RavenHandler\n  * Added $appendNewline flag to the JsonFormatter to enable using it when logging to files\n  * Added sound support to the PushoverHandler\n  * Fixed multi-threading support in StreamHandler\n  * Fixed empty headers issue when ChromePHPHandler received no records\n  * Fixed default format of the ErrorLogHandler\n\n### 1.8.0 (2014-03-23)\n\n  * Break: the LineFormatter now strips newlines by default because this was a bug, set $allowInlineLineBreaks to true if you need them\n  * Added BrowserConsoleHandler to send logs to any browser's console via console.log() injection in the output\n  * Added FilterHandler to filter records and only allow those of a given list of levels through to the wrapped handler\n  * Added FlowdockHandler to send logs to a Flowdock account\n  * Added RollbarHandler to send logs to a Rollbar account\n  * Added HtmlFormatter to send prettier log emails with colors for each log level\n  * Added GitProcessor to add the current branch/commit to extra record data\n  * Added a Monolog\\Registry class to allow easier global access to pre-configured loggers\n  * Added support for the new official graylog2/gelf-php lib for GelfHandler, upgrade if you can by replacing the mlehner/gelf-php requirement\n  * Added support for HHVM\n  * Added support for Loggly batch uploads\n  * Added support for tweaking the content type and encoding in NativeMailerHandler\n  * Added $skipClassesPartials to tweak the ignored classes in the IntrospectionProcessor\n  * Fixed batch request support in GelfHandler\n\n### 1.7.0 (2013-11-14)\n\n  * Added ElasticSearchHandler to send logs to an Elastic Search server\n  * Added DynamoDbHandler and ScalarFormatter to send logs to Amazon's Dynamo DB\n  * Added SyslogUdpHandler to send logs to a remote syslogd server\n  * Added LogglyHandler to send logs to a Loggly account\n  * Added $level to IntrospectionProcessor so it only adds backtraces when needed\n  * Added $version to LogstashFormatter to allow using the new v1 Logstash format\n  * Added $appName to NewRelicHandler\n  * Added configuration of Pushover notification retries/expiry\n  * Added $maxColumnWidth to NativeMailerHandler to change the 70 chars default\n  * Added chainability to most setters for all handlers\n  * Fixed RavenHandler batch processing so it takes the message from the record with highest priority\n  * Fixed HipChatHandler batch processing so it sends all messages at once\n  * Fixed issues with eAccelerator\n  * Fixed and improved many small things\n\n### 1.6.0 (2013-07-29)\n\n  * Added HipChatHandler to send logs to a HipChat chat room\n  * Added ErrorLogHandler to send logs to PHP's error_log function\n  * Added NewRelicHandler to send logs to NewRelic's service\n  * Added Monolog\\ErrorHandler helper class to register a Logger as exception/error/fatal handler\n  * Added ChannelLevelActivationStrategy for the FingersCrossedHandler to customize levels by channel\n  * Added stack traces output when normalizing exceptions (json output & co)\n  * Added Monolog\\Logger::API constant (currently 1)\n  * Added support for ChromePHP's v4.0 extension\n  * Added support for message priorities in PushoverHandler, see $highPriorityLevel and $emergencyLevel\n  * Added support for sending messages to multiple users at once with the PushoverHandler\n  * Fixed RavenHandler's support for batch sending of messages (when behind a Buffer or FingersCrossedHandler)\n  * Fixed normalization of Traversables with very large data sets, only the first 1000 items are shown now\n  * Fixed issue in RotatingFileHandler when an open_basedir restriction is active\n  * Fixed minor issues in RavenHandler and bumped the API to Raven 0.5.0\n  * Fixed SyslogHandler issue when many were used concurrently with different facilities\n\n### 1.5.0 (2013-04-23)\n\n  * Added ProcessIdProcessor to inject the PID in log records\n  * Added UidProcessor to inject a unique identifier to all log records of one request/run\n  * Added support for previous exceptions in the LineFormatter exception serialization\n  * Added Monolog\\Logger::getLevels() to get all available levels\n  * Fixed ChromePHPHandler so it avoids sending headers larger than Chrome can handle\n\n### 1.4.1 (2013-04-01)\n\n  * Fixed exception formatting in the LineFormatter to be more minimalistic\n  * Fixed RavenHandler's handling of context/extra data, requires Raven client >0.1.0\n  * Fixed log rotation in RotatingFileHandler to work with long running scripts spanning multiple days\n  * Fixed WebProcessor array access so it checks for data presence\n  * Fixed Buffer, Group and FingersCrossed handlers to make use of their processors\n\n### 1.4.0 (2013-02-13)\n\n  * Added RedisHandler to log to Redis via the Predis library or the phpredis extension\n  * Added ZendMonitorHandler to log to the Zend Server monitor\n  * Added the possibility to pass arrays of handlers and processors directly in the Logger constructor\n  * Added `$useSSL` option to the PushoverHandler which is enabled by default\n  * Fixed ChromePHPHandler and FirePHPHandler issue when multiple instances are used simultaneously\n  * Fixed header injection capability in the NativeMailHandler\n\n### 1.3.1 (2013-01-11)\n\n  * Fixed LogstashFormatter to be usable with stream handlers\n  * Fixed GelfMessageFormatter levels on Windows\n\n### 1.3.0 (2013-01-08)\n\n  * Added PSR-3 compliance, the `Monolog\\Logger` class is now an instance of `Psr\\Log\\LoggerInterface`\n  * Added PsrLogMessageProcessor that you can selectively enable for full PSR-3 compliance\n  * Added LogstashFormatter (combine with SocketHandler or StreamHandler to send logs to Logstash)\n  * Added PushoverHandler to send mobile notifications\n  * Added CouchDBHandler and DoctrineCouchDBHandler\n  * Added RavenHandler to send data to Sentry servers\n  * Added support for the new MongoClient class in MongoDBHandler\n  * Added microsecond precision to log records' timestamps\n  * Added `$flushOnOverflow` param to BufferHandler to flush by batches instead of losing\n    the oldest entries\n  * Fixed normalization of objects with cyclic references\n\n### 1.2.1 (2012-08-29)\n\n  * Added new $logopts arg to SyslogHandler to provide custom openlog options\n  * Fixed fatal error in SyslogHandler\n\n### 1.2.0 (2012-08-18)\n\n  * Added AmqpHandler (for use with AMQP servers)\n  * Added CubeHandler\n  * Added NativeMailerHandler::addHeader() to send custom headers in mails\n  * Added the possibility to specify more than one recipient in NativeMailerHandler\n  * Added the possibility to specify float timeouts in SocketHandler\n  * Added NOTICE and EMERGENCY levels to conform with RFC 5424\n  * Fixed the log records to use the php default timezone instead of UTC\n  * Fixed BufferHandler not being flushed properly on PHP fatal errors\n  * Fixed normalization of exotic resource types\n  * Fixed the default format of the SyslogHandler to avoid duplicating datetimes in syslog\n\n### 1.1.0 (2012-04-23)\n\n  * Added Monolog\\Logger::isHandling() to check if a handler will\n    handle the given log level\n  * Added ChromePHPHandler\n  * Added MongoDBHandler\n  * Added GelfHandler (for use with Graylog2 servers)\n  * Added SocketHandler (for use with syslog-ng for example)\n  * Added NormalizerFormatter\n  * Added the possibility to change the activation strategy of the FingersCrossedHandler\n  * Added possibility to show microseconds in logs\n  * Added `server` and `referer` to WebProcessor output\n\n### 1.0.2 (2011-10-24)\n\n  * Fixed bug in IE with large response headers and FirePHPHandler\n\n### 1.0.1 (2011-08-25)\n\n  * Added MemoryPeakUsageProcessor and MemoryUsageProcessor\n  * Added Monolog\\Logger::getName() to get a logger's channel name\n\n### 1.0.0 (2011-07-06)\n\n  * Added IntrospectionProcessor to get info from where the logger was called\n  * Fixed WebProcessor in CLI\n\n### 1.0.0-RC1 (2011-07-01)\n\n  * Initial release\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/LICENSE",
    "content": "Copyright (c) 2011-2020 Jordi Boggiano\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/README.md",
    "content": "![Monolog](logo.jpg)\n\n# Monolog - Logging for PHP [![Continuous Integration](https://github.com/Seldaek/monolog/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/Seldaek/monolog/actions)\n\n[![Total Downloads](https://img.shields.io/packagist/dt/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)\n[![Latest Stable Version](https://img.shields.io/packagist/v/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)\n\n>**Note** This is the **documentation for Monolog 3.x**, if you are using older releases\n>see the documentation for [Monolog 2.x](https://github.com/Seldaek/monolog/blob/2.x/README.md) or [Monolog 1.x](https://github.com/Seldaek/monolog/blob/1.x/README.md)\n\nMonolog sends your logs to files, sockets, inboxes, databases and various\nweb services. See the complete list of handlers below. Special handlers\nallow you to build advanced logging strategies.\n\nThis library implements the [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)\ninterface that you can type-hint against in your own libraries to keep\na maximum of interoperability. You can also use it in your applications to\nmake sure you can always use another compatible logger at a later time.\nAs of 1.11.0 Monolog public APIs will also accept PSR-3 log levels.\nInternally Monolog still uses its own level scheme since it predates PSR-3.\n\n<div align=\"center\">\n  <hr>\n  <sup><b>Sponsored by:</b></sup>\n  <br>\n  <a href=\"https://betterstack.com\">\n    <div>\n      <img src=\"https://github.com/Seldaek/monolog/assets/183678/7de58ce0-2fa2-45c0-b3e8-e60cebb3c4cf\" width=\"200\" alt=\"Better Stack\">\n    </div>\n    <div>\n      Better Stack lets you centralize, search, and visualize your logs.\n    </div>\n  </a>\n  <br>\n  <hr>\n</div>\n\n## Installation\n\nInstall the latest version with\n\n```bash\ncomposer require monolog/monolog\n```\n\n## Basic Usage\n\n```php\n<?php\n\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Monolog\\Handler\\StreamHandler;\n\n// create a log channel\n$log = new Logger('name');\n$log->pushHandler(new StreamHandler('path/to/your.log', Level::Warning));\n\n// add records to the log\n$log->warning('Foo');\n$log->error('Bar');\n```\n\n## Documentation\n\n- [Usage Instructions](doc/01-usage.md)\n- [Handlers, Formatters and Processors](doc/02-handlers-formatters-processors.md)\n- [Utility Classes](doc/03-utilities.md)\n- [Extending Monolog](doc/04-extending.md)\n- [Log Record Structure](doc/message-structure.md)\n\n## Support Monolog Financially\n\nGet supported Monolog and help fund the project with the [Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-monolog-monolog?utm_source=packagist-monolog-monolog&utm_medium=referral&utm_campaign=enterprise) or via [GitHub sponsorship](https://github.com/sponsors/Seldaek).\n\nTidelift delivers commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use.\n\n## Third Party Packages\n\nThird party handlers, formatters and processors are\n[listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You\ncan also add your own there if you publish one.\n\n## About\n\n### Requirements\n\n- Monolog `^3.0` works with PHP 8.1 or above.\n- Monolog `^2.5` works with PHP 7.2 or above.\n- Monolog `^1.25` works with PHP 5.3 up to 8.1, but is not very maintained anymore and will not receive PHP support fixes anymore.\n\n### Support\n\nMonolog 1.x support is somewhat limited at this point and only important fixes will be done. You should migrate to Monolog 2 or 3 where possible to benefit from all the latest features and fixes.\n\n### Submitting bugs and feature requests\n\nBugs and feature request are tracked on [GitHub](https://github.com/Seldaek/monolog/issues)\n\n### Framework Integrations\n\n- Frameworks and libraries using [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)\n  can be used very easily with Monolog since it implements the interface.\n- [Symfony](http://symfony.com) comes out of the box with Monolog.\n- [Laravel](http://laravel.com/) comes out of the box with Monolog.\n- [Lumen](http://lumen.laravel.com/) comes out of the box with Monolog.\n- [PPI](https://github.com/ppi/framework) comes out of the box with Monolog.\n- [CakePHP](http://cakephp.org/) is usable with Monolog via the [cakephp-monolog](https://github.com/jadb/cakephp-monolog) plugin.\n- [Slim](http://www.slimframework.com/) is usable with Monolog via the [Slim-Monolog](https://github.com/Flynsarmy/Slim-Monolog) log writer.\n- [XOOPS 2.6](http://xoops.org/) comes out of the box with Monolog.\n- [Aura.Web_Project](https://github.com/auraphp/Aura.Web_Project) comes out of the box with Monolog.\n- [Nette Framework](http://nette.org/en/) is usable with Monolog via the [contributte/monolog](https://github.com/contributte/monolog) or [orisai/nette-monolog](https://github.com/orisai/nette-monolog) extensions.\n- [Proton Micro Framework](https://github.com/alexbilbie/Proton) comes out of the box with Monolog.\n- [FuelPHP](http://fuelphp.com/) comes out of the box with Monolog.\n- [Equip Framework](https://github.com/equip/framework) comes out of the box with Monolog.\n- [Yii 2](http://www.yiiframework.com/) is usable with Monolog via the [yii2-monolog](https://github.com/merorafael/yii2-monolog) or [yii2-psr-log-target](https://github.com/samdark/yii2-psr-log-target) plugins.\n- [Hawkbit Micro Framework](https://github.com/HawkBitPhp/hawkbit) comes out of the box with Monolog.\n- [SilverStripe 4](https://www.silverstripe.org/) comes out of the box with Monolog.\n- [Drupal](https://www.drupal.org/) is usable with Monolog via the [monolog](https://www.drupal.org/project/monolog) module.\n- [Aimeos ecommerce framework](https://aimeos.org/) is usable with Monolog via the [ai-monolog](https://github.com/aimeos/ai-monolog) extension.\n- [Magento](https://magento.com/) comes out of the box with Monolog.\n- [Spiral Framework](https://spiral.dev) comes out of the box with Monolog bridge.\n\n### Author\n\nJordi Boggiano - <j.boggiano@seld.be> - <http://twitter.com/seldaek><br />\nSee also the list of [contributors](https://github.com/Seldaek/monolog/contributors) who participated in this project.\n\n### License\n\nMonolog is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\n\n### Acknowledgements\n\nThis library is heavily inspired by Python's [Logbook](https://logbook.readthedocs.io/en/stable/)\nlibrary, although most concepts have been adjusted to fit to the PHP world.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/composer.json",
    "content": "{\n    \"name\": \"monolog/monolog\",\n    \"description\": \"Sends your logs to files, sockets, inboxes, databases and various web services\",\n    \"keywords\": [\"log\", \"logging\", \"psr-3\"],\n    \"homepage\": \"https://github.com/Seldaek/monolog\",\n    \"type\": \"library\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jordi Boggiano\",\n            \"email\": \"j.boggiano@seld.be\",\n            \"homepage\": \"https://seld.be\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.1\",\n        \"psr/log\": \"^2.0 || ^3.0\"\n    },\n    \"require-dev\": {\n        \"ext-json\": \"*\",\n        \"aws/aws-sdk-php\": \"^3.0\",\n        \"doctrine/couchdb\": \"~1.0@dev\",\n        \"elasticsearch/elasticsearch\": \"^7 || ^8\",\n        \"graylog2/gelf-php\": \"^1.4.2 || ^2.0\",\n        \"guzzlehttp/guzzle\": \"^7.4.5\",\n        \"guzzlehttp/psr7\": \"^2.2\",\n        \"mongodb/mongodb\": \"^1.8\",\n        \"php-amqplib/php-amqplib\": \"~2.4 || ^3\",\n        \"phpstan/phpstan\": \"^1.9\",\n        \"phpstan/phpstan-deprecation-rules\": \"^1.0\",\n        \"phpstan/phpstan-strict-rules\": \"^1.4\",\n        \"phpunit/phpunit\": \"^10.5.17\",\n        \"predis/predis\": \"^1.1 || ^2\",\n        \"ruflin/elastica\": \"^7\",\n        \"symfony/mailer\": \"^5.4 || ^6\",\n        \"symfony/mime\": \"^5.4 || ^6\"\n    },\n    \"suggest\": {\n        \"graylog2/gelf-php\": \"Allow sending log messages to a GrayLog2 server\",\n        \"doctrine/couchdb\": \"Allow sending log messages to a CouchDB server\",\n        \"ruflin/elastica\": \"Allow sending log messages to an Elastic Search server\",\n        \"elasticsearch/elasticsearch\": \"Allow sending log messages to an Elasticsearch server via official client\",\n        \"php-amqplib/php-amqplib\": \"Allow sending log messages to an AMQP server using php-amqplib\",\n        \"ext-amqp\": \"Allow sending log messages to an AMQP server (1.0+ required)\",\n        \"ext-mongodb\": \"Allow sending log messages to a MongoDB server (via driver)\",\n        \"mongodb/mongodb\": \"Allow sending log messages to a MongoDB server (via library)\",\n        \"aws/aws-sdk-php\": \"Allow sending log messages to AWS services like DynamoDB\",\n        \"rollbar/rollbar\": \"Allow sending log messages to Rollbar\",\n        \"ext-mbstring\": \"Allow to work properly with unicode symbols\",\n        \"ext-sockets\": \"Allow sending log messages to a Syslog server (via UDP driver)\",\n        \"ext-curl\": \"Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler\",\n        \"ext-openssl\": \"Required to send log messages using SSL\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\"Monolog\\\\\": \"src/Monolog\"}\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\"Monolog\\\\\": \"tests/Monolog\"}\n    },\n    \"provide\": {\n        \"psr/log-implementation\": \"3.0.0\"\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-main\": \"3.x-dev\"\n        }\n    },\n    \"scripts\": {\n        \"test\": \"@php vendor/bin/phpunit\",\n        \"phpstan\": \"@php vendor/bin/phpstan analyse\"\n    },\n    \"config\": {\n        \"lock\": false,\n        \"sort-packages\": true,\n        \"platform-check\": false\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Attribute;\n\n/**\n * A reusable attribute to help configure a class or a method as a processor.\n *\n * Using it offers no guarantee: it needs to be leveraged by a Monolog third-party consumer.\n *\n * Using it with the Monolog library only has no effect at all: processors should still be turned into a callable if\n * needed and manually pushed to the loggers and to the processable handlers.\n */\n#[\\Attribute(\\Attribute::TARGET_CLASS | \\Attribute::TARGET_METHOD | \\Attribute::IS_REPEATABLE)]\nclass AsMonologProcessor\n{\n    /**\n     * @param string|null $channel  The logging channel the processor should be pushed to.\n     * @param string|null $handler  The handler the processor should be pushed to.\n     * @param string|null $method   The method that processes the records (if the attribute is used at the class level).\n     * @param int|null    $priority The priority of the processor so the order can be determined.\n     */\n    public function __construct(\n        public readonly ?string $channel = null,\n        public readonly ?string $handler = null,\n        public readonly ?string $method = null,\n        public readonly ?int $priority = null\n    ) {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Attribute/WithMonologChannel.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Attribute;\n\n/**\n * A reusable attribute to help configure a class as expecting a given logger channel.\n *\n * Using it offers no guarantee: it needs to be leveraged by a Monolog third-party consumer.\n *\n * Using it with the Monolog library only has no effect at all: wiring the logger instance into\n * other classes is not managed by Monolog.\n */\n#[\\Attribute(\\Attribute::TARGET_CLASS)]\nfinal class WithMonologChannel\n{\n    public function __construct(\n        public readonly string $channel\n    ) {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/DateTimeImmutable.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse DateTimeZone;\n\n/**\n * Overrides default json encoding of date time objects\n *\n * @author Menno Holtkamp\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass DateTimeImmutable extends \\DateTimeImmutable implements \\JsonSerializable\n{\n    private bool $useMicroseconds;\n\n    public function __construct(bool $useMicroseconds, ?DateTimeZone $timezone = null)\n    {\n        $this->useMicroseconds = $useMicroseconds;\n\n        // if you like to use a custom time to pass to Logger::addRecord directly,\n        // call modify() or setTimestamp() on this instance to change the date after creating it\n        parent::__construct('now', $timezone);\n    }\n\n    public function jsonSerialize(): string\n    {\n        if ($this->useMicroseconds) {\n            return $this->format('Y-m-d\\TH:i:s.uP');\n        }\n\n        return $this->format('Y-m-d\\TH:i:sP');\n    }\n\n    public function __toString(): string\n    {\n        return $this->jsonSerialize();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/ErrorHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse Closure;\nuse Psr\\Log\\LoggerInterface;\nuse Psr\\Log\\LogLevel;\n\n/**\n * Monolog error handler\n *\n * A facility to enable logging of runtime errors, exceptions and fatal errors.\n *\n * Quick setup: <code>ErrorHandler::register($logger);</code>\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass ErrorHandler\n{\n    private Closure|null $previousExceptionHandler = null;\n\n    /** @var array<class-string, LogLevel::*> an array of class name to LogLevel::* constant mapping */\n    private array $uncaughtExceptionLevelMap = [];\n\n    /** @var Closure|true|null */\n    private Closure|bool|null $previousErrorHandler = null;\n\n    /** @var array<int, LogLevel::*> an array of E_* constant to LogLevel::* constant mapping */\n    private array $errorLevelMap = [];\n\n    private bool $handleOnlyReportedErrors = true;\n\n    private bool $hasFatalErrorHandler = false;\n\n    private string $fatalLevel = LogLevel::ALERT;\n\n    private string|null $reservedMemory = null;\n\n    /** @var ?array{type: int, message: string, file: string, line: int, trace: mixed} */\n    private array|null $lastFatalData = null;\n\n    private const FATAL_ERRORS = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR];\n\n    public function __construct(\n        private LoggerInterface $logger\n    ) {\n    }\n\n    /**\n     * Registers a new ErrorHandler for a given Logger\n     *\n     * By default it will handle errors, exceptions and fatal errors\n     *\n     * @param  array<int, LogLevel::*>|false          $errorLevelMap     an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling\n     * @param  array<class-string, LogLevel::*>|false $exceptionLevelMap an array of class name to LogLevel::* constant mapping, or false to disable exception handling\n     * @param  LogLevel::*|null|false                 $fatalLevel        a LogLevel::* constant, null to use the default LogLevel::ALERT or false to disable fatal error handling\n     * @return static\n     */\n    public static function register(LoggerInterface $logger, $errorLevelMap = [], $exceptionLevelMap = [], $fatalLevel = null): self\n    {\n        /** @phpstan-ignore-next-line */\n        $handler = new static($logger);\n        if ($errorLevelMap !== false) {\n            $handler->registerErrorHandler($errorLevelMap);\n        }\n        if ($exceptionLevelMap !== false) {\n            $handler->registerExceptionHandler($exceptionLevelMap);\n        }\n        if ($fatalLevel !== false) {\n            $handler->registerFatalHandler($fatalLevel);\n        }\n\n        return $handler;\n    }\n\n    /**\n     * @param  array<class-string, LogLevel::*> $levelMap an array of class name to LogLevel::* constant mapping\n     * @return $this\n     */\n    public function registerExceptionHandler(array $levelMap = [], bool $callPrevious = true): self\n    {\n        $prev = set_exception_handler(function (\\Throwable $e): void {\n            $this->handleException($e);\n        });\n        $this->uncaughtExceptionLevelMap = $levelMap;\n        foreach ($this->defaultExceptionLevelMap() as $class => $level) {\n            if (!isset($this->uncaughtExceptionLevelMap[$class])) {\n                $this->uncaughtExceptionLevelMap[$class] = $level;\n            }\n        }\n        if ($callPrevious && null !== $prev) {\n            $this->previousExceptionHandler = $prev(...);\n        }\n\n        return $this;\n    }\n\n    /**\n     * @param  array<int, LogLevel::*> $levelMap an array of E_* constant to LogLevel::* constant mapping\n     * @return $this\n     */\n    public function registerErrorHandler(array $levelMap = [], bool $callPrevious = true, int $errorTypes = -1, bool $handleOnlyReportedErrors = true): self\n    {\n        $prev = set_error_handler($this->handleError(...), $errorTypes);\n        $this->errorLevelMap = array_replace($this->defaultErrorLevelMap(), $levelMap);\n        if ($callPrevious) {\n            $this->previousErrorHandler = $prev !== null ? $prev(...) : true;\n        } else {\n            $this->previousErrorHandler = null;\n        }\n\n        $this->handleOnlyReportedErrors = $handleOnlyReportedErrors;\n\n        return $this;\n    }\n\n    /**\n     * @param LogLevel::*|null $level              a LogLevel::* constant, null to use the default LogLevel::ALERT\n     * @param int              $reservedMemorySize Amount of KBs to reserve in memory so that it can be freed when handling fatal errors giving Monolog some room in memory to get its job done\n     * @return $this\n     */\n    public function registerFatalHandler($level = null, int $reservedMemorySize = 20): self\n    {\n        register_shutdown_function($this->handleFatalError(...));\n\n        $this->reservedMemory = str_repeat(' ', 1024 * $reservedMemorySize);\n        $this->fatalLevel = null === $level ? LogLevel::ALERT : $level;\n        $this->hasFatalErrorHandler = true;\n\n        return $this;\n    }\n\n    /**\n     * @return array<class-string, LogLevel::*>\n     */\n    protected function defaultExceptionLevelMap(): array\n    {\n        return [\n            'ParseError' => LogLevel::CRITICAL,\n            'Throwable' => LogLevel::ERROR,\n        ];\n    }\n\n    /**\n     * @return array<int, LogLevel::*>\n     */\n    protected function defaultErrorLevelMap(): array\n    {\n        return [\n            E_ERROR             => LogLevel::CRITICAL,\n            E_WARNING           => LogLevel::WARNING,\n            E_PARSE             => LogLevel::ALERT,\n            E_NOTICE            => LogLevel::NOTICE,\n            E_CORE_ERROR        => LogLevel::CRITICAL,\n            E_CORE_WARNING      => LogLevel::WARNING,\n            E_COMPILE_ERROR     => LogLevel::ALERT,\n            E_COMPILE_WARNING   => LogLevel::WARNING,\n            E_USER_ERROR        => LogLevel::ERROR,\n            E_USER_WARNING      => LogLevel::WARNING,\n            E_USER_NOTICE       => LogLevel::NOTICE,\n            E_STRICT            => LogLevel::NOTICE,\n            E_RECOVERABLE_ERROR => LogLevel::ERROR,\n            E_DEPRECATED        => LogLevel::NOTICE,\n            E_USER_DEPRECATED   => LogLevel::NOTICE,\n        ];\n    }\n\n    private function handleException(\\Throwable $e): never\n    {\n        $level = LogLevel::ERROR;\n        foreach ($this->uncaughtExceptionLevelMap as $class => $candidate) {\n            if ($e instanceof $class) {\n                $level = $candidate;\n                break;\n            }\n        }\n\n        $this->logger->log(\n            $level,\n            sprintf('Uncaught Exception %s: \"%s\" at %s line %s', Utils::getClass($e), $e->getMessage(), $e->getFile(), $e->getLine()),\n            ['exception' => $e]\n        );\n\n        if (null !== $this->previousExceptionHandler) {\n            ($this->previousExceptionHandler)($e);\n        }\n\n        if (!headers_sent() && in_array(strtolower((string) ini_get('display_errors')), ['0', '', 'false', 'off', 'none', 'no'], true)) {\n            http_response_code(500);\n        }\n\n        exit(255);\n    }\n\n    private function handleError(int $code, string $message, string $file = '', int $line = 0): bool\n    {\n        if ($this->handleOnlyReportedErrors && 0 === (error_reporting() & $code)) {\n            return false;\n        }\n\n        // fatal error codes are ignored if a fatal error handler is present as well to avoid duplicate log entries\n        if (!$this->hasFatalErrorHandler || !in_array($code, self::FATAL_ERRORS, true)) {\n            $level = $this->errorLevelMap[$code] ?? LogLevel::CRITICAL;\n            $this->logger->log($level, self::codeToString($code).': '.$message, ['code' => $code, 'message' => $message, 'file' => $file, 'line' => $line]);\n        } else {\n            $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);\n            array_shift($trace); // Exclude handleError from trace\n            $this->lastFatalData = ['type' => $code, 'message' => $message, 'file' => $file, 'line' => $line, 'trace' => $trace];\n        }\n\n        if ($this->previousErrorHandler === true) {\n            return false;\n        }\n        if ($this->previousErrorHandler instanceof Closure) {\n            return (bool) ($this->previousErrorHandler)($code, $message, $file, $line);\n        }\n\n        return true;\n    }\n\n    /**\n     * @private\n     */\n    public function handleFatalError(): void\n    {\n        $this->reservedMemory = '';\n\n        if (is_array($this->lastFatalData)) {\n            $lastError = $this->lastFatalData;\n        } else {\n            $lastError = error_get_last();\n        }\n        if (is_array($lastError) && in_array($lastError['type'], self::FATAL_ERRORS, true)) {\n            $trace = $lastError['trace'] ?? null;\n            $this->logger->log(\n                $this->fatalLevel,\n                'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'],\n                ['code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $trace]\n            );\n\n            if ($this->logger instanceof Logger) {\n                foreach ($this->logger->getHandlers() as $handler) {\n                    $handler->close();\n                }\n            }\n        }\n    }\n\n    private static function codeToString(int $code): string\n    {\n        return match ($code) {\n            E_ERROR => 'E_ERROR',\n            E_WARNING => 'E_WARNING',\n            E_PARSE => 'E_PARSE',\n            E_NOTICE => 'E_NOTICE',\n            E_CORE_ERROR => 'E_CORE_ERROR',\n            E_CORE_WARNING => 'E_CORE_WARNING',\n            E_COMPILE_ERROR => 'E_COMPILE_ERROR',\n            E_COMPILE_WARNING => 'E_COMPILE_WARNING',\n            E_USER_ERROR => 'E_USER_ERROR',\n            E_USER_WARNING => 'E_USER_WARNING',\n            E_USER_NOTICE => 'E_USER_NOTICE',\n            E_STRICT => 'E_STRICT',\n            E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',\n            E_DEPRECATED => 'E_DEPRECATED',\n            E_USER_DEPRECATED => 'E_USER_DEPRECATED',\n            default => 'Unknown PHP error',\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\n\n/**\n * Formats a log message according to the ChromePHP array format\n *\n * @author Christophe Coevoet <stof@notk.org>\n */\nclass ChromePHPFormatter implements FormatterInterface\n{\n    /**\n     * Translates Monolog log levels to Wildfire levels.\n     *\n     * @return 'log'|'info'|'warn'|'error'\n     */\n    private function toWildfireLevel(Level $level): string\n    {\n        return match ($level) {\n            Level::Debug     => 'log',\n            Level::Info      => 'info',\n            Level::Notice    => 'info',\n            Level::Warning   => 'warn',\n            Level::Error     => 'error',\n            Level::Critical  => 'error',\n            Level::Alert     => 'error',\n            Level::Emergency => 'error',\n        };\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function format(LogRecord $record)\n    {\n        // Retrieve the line and file if set and remove them from the formatted extra\n        $backtrace = 'unknown';\n        if (isset($record->extra['file'], $record->extra['line'])) {\n            $backtrace = $record->extra['file'].' : '.$record->extra['line'];\n            unset($record->extra['file'], $record->extra['line']);\n        }\n\n        $message = ['message' => $record->message];\n        if (\\count($record->context) > 0) {\n            $message['context'] = $record->context;\n        }\n        if (\\count($record->extra) > 0) {\n            $message['extra'] = $record->extra;\n        }\n        if (count($message) === 1) {\n            $message = reset($message);\n        }\n\n        return [\n            $record->channel,\n            $message,\n            $backtrace,\n            $this->toWildfireLevel($record->level),\n        ];\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function formatBatch(array $records)\n    {\n        $formatted = [];\n\n        foreach ($records as $record) {\n            $formatted[] = $this->format($record);\n        }\n\n        return $formatted;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Elastica\\Document;\nuse Monolog\\LogRecord;\n\n/**\n * Format a log message into an Elastica Document\n *\n * @author Jelle Vink <jelle.vink@gmail.com>\n */\nclass ElasticaFormatter extends NormalizerFormatter\n{\n    /**\n     * @var string Elastic search index name\n     */\n    protected string $index;\n\n    /**\n     * @var string|null Elastic search document type\n     */\n    protected string|null $type;\n\n    /**\n     * @param string  $index Elastic Search index name\n     * @param ?string $type  Elastic Search document type, deprecated as of Elastica 7\n     *\n     * @throws \\RuntimeException If the function json_encode does not exist\n     */\n    public function __construct(string $index, ?string $type)\n    {\n        // elasticsearch requires a ISO 8601 format date with optional millisecond precision.\n        parent::__construct('Y-m-d\\TH:i:s.uP');\n\n        $this->index = $index;\n        $this->type = $type;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function format(LogRecord $record)\n    {\n        $record = parent::format($record);\n\n        return $this->getDocument($record);\n    }\n\n    public function getIndex(): string\n    {\n        return $this->index;\n    }\n\n    /**\n     * @deprecated since Elastica 7 type has no effect\n     */\n    public function getType(): string\n    {\n        /** @phpstan-ignore-next-line */\n        return $this->type;\n    }\n\n    /**\n     * Convert a log message into an Elastica Document\n     *\n     * @param mixed[] $record\n     */\n    protected function getDocument(array $record): Document\n    {\n        $document = new Document();\n        $document->setData($record);\n        if (method_exists($document, 'setType')) {\n            $document->setType($this->type);\n        }\n        $document->setIndex($this->index);\n\n        return $document;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse DateTimeInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Format a log message into an Elasticsearch record\n *\n * @author Avtandil Kikabidze <akalongman@gmail.com>\n */\nclass ElasticsearchFormatter extends NormalizerFormatter\n{\n    /**\n     * @var string Elasticsearch index name\n     */\n    protected string $index;\n\n    /**\n     * @var string Elasticsearch record type\n     */\n    protected string $type;\n\n    /**\n     * @param string $index Elasticsearch index name\n     * @param string $type  Elasticsearch record type\n     *\n     * @throws \\RuntimeException If the function json_encode does not exist\n     */\n    public function __construct(string $index, string $type)\n    {\n        // Elasticsearch requires an ISO 8601 format date with optional millisecond precision.\n        parent::__construct(DateTimeInterface::ISO8601);\n\n        $this->index = $index;\n        $this->type = $type;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function format(LogRecord $record)\n    {\n        $record = parent::format($record);\n\n        return $this->getDocument($record);\n    }\n\n    /**\n     * Getter index\n     */\n    public function getIndex(): string\n    {\n        return $this->index;\n    }\n\n    /**\n     * Getter type\n     */\n    public function getType(): string\n    {\n        return $this->type;\n    }\n\n    /**\n     * Convert a log message into an Elasticsearch record\n     *\n     * @param  mixed[] $record Log message\n     * @return mixed[]\n     */\n    protected function getDocument(array $record): array\n    {\n        $record['_index'] = $this->index;\n        $record['_type'] = $this->type;\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\LogRecord;\n\n/**\n * formats the record to be used in the FlowdockHandler\n *\n * @author Dominik Liebler <liebler.dominik@gmail.com>\n * @deprecated Since 2.9.0 and 3.3.0, Flowdock was shutdown we will thus drop this handler in Monolog 4\n */\nclass FlowdockFormatter implements FormatterInterface\n{\n    private string $source;\n\n    private string $sourceEmail;\n\n    public function __construct(string $source, string $sourceEmail)\n    {\n        $this->source = $source;\n        $this->sourceEmail = $sourceEmail;\n    }\n\n    /**\n     * @inheritDoc\n     *\n     * @return mixed[]\n     */\n    public function format(LogRecord $record): array\n    {\n        $tags = [\n            '#logs',\n            '#' . $record->level->toPsrLogLevel(),\n            '#' . $record->channel,\n        ];\n\n        foreach ($record->extra as $value) {\n            $tags[] = '#' . $value;\n        }\n\n        $subject = sprintf(\n            'in %s: %s - %s',\n            $this->source,\n            $record->level->getName(),\n            $this->getShortMessage($record->message)\n        );\n\n        return [\n            'source' => $this->source,\n            'from_address' => $this->sourceEmail,\n            'subject' => $subject,\n            'content' => $record->message,\n            'tags' => $tags,\n            'project' => $this->source,\n        ];\n    }\n\n    /**\n     * @inheritDoc\n     *\n     * @return mixed[][]\n     */\n    public function formatBatch(array $records): array\n    {\n        $formatted = [];\n\n        foreach ($records as $record) {\n            $formatted[] = $this->format($record);\n        }\n\n        return $formatted;\n    }\n\n    public function getShortMessage(string $message): string\n    {\n        static $hasMbString;\n\n        if (null === $hasMbString) {\n            $hasMbString = function_exists('mb_strlen');\n        }\n\n        $maxLength = 45;\n\n        if ($hasMbString) {\n            if (mb_strlen($message, 'UTF-8') > $maxLength) {\n                $message = mb_substr($message, 0, $maxLength - 4, 'UTF-8') . ' ...';\n            }\n        } else {\n            if (strlen($message) > $maxLength) {\n                $message = substr($message, 0, $maxLength - 4) . ' ...';\n            }\n        }\n\n        return $message;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Class FluentdFormatter\n *\n * Serializes a log message to Fluentd unix socket protocol\n *\n * Fluentd config:\n *\n * <source>\n *  type unix\n *  path /var/run/td-agent/td-agent.sock\n * </source>\n *\n * Monolog setup:\n *\n * $logger = new Monolog\\Logger('fluent.tag');\n * $fluentHandler = new Monolog\\Handler\\SocketHandler('unix:///var/run/td-agent/td-agent.sock');\n * $fluentHandler->setFormatter(new Monolog\\Formatter\\FluentdFormatter());\n * $logger->pushHandler($fluentHandler);\n *\n * @author Andrius Putna <fordnox@gmail.com>\n */\nclass FluentdFormatter implements FormatterInterface\n{\n    /**\n     * @var bool $levelTag should message level be a part of the fluentd tag\n     */\n    protected bool $levelTag = false;\n\n    /**\n     * @throws \\RuntimeException If the function json_encode does not exist\n     */\n    public function __construct(bool $levelTag = false)\n    {\n        if (!function_exists('json_encode')) {\n            throw new \\RuntimeException('PHP\\'s json extension is required to use Monolog\\'s FluentdUnixFormatter');\n        }\n\n        $this->levelTag = $levelTag;\n    }\n\n    public function isUsingLevelsInTag(): bool\n    {\n        return $this->levelTag;\n    }\n\n    public function format(LogRecord $record): string\n    {\n        $tag = $record->channel;\n        if ($this->levelTag) {\n            $tag .= '.' . $record->level->toPsrLogLevel();\n        }\n\n        $message = [\n            'message' => $record->message,\n            'context' => $record->context,\n            'extra' => $record->extra,\n        ];\n\n        if (!$this->levelTag) {\n            $message['level'] = $record->level->value;\n            $message['level_name'] = $record->level->getName();\n        }\n\n        return Utils::jsonEncode([$tag, $record->datetime->getTimestamp(), $message]);\n    }\n\n    public function formatBatch(array $records): string\n    {\n        $message = '';\n        foreach ($records as $record) {\n            $message .= $this->format($record);\n        }\n\n        return $message;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\LogRecord;\n\n/**\n * Interface for formatters\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\ninterface FormatterInterface\n{\n    /**\n     * Formats a log record.\n     *\n     * @param  LogRecord $record A record to format\n     * @return mixed     The formatted record\n     */\n    public function format(LogRecord $record);\n\n    /**\n     * Formats a set of log records.\n     *\n     * @param  array<LogRecord> $records A set of records to format\n     * @return mixed            The formatted set of records\n     */\n    public function formatBatch(array $records);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Level;\nuse Gelf\\Message;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Serializes a log message to GELF\n * @see http://docs.graylog.org/en/latest/pages/gelf.html\n *\n * @author Matt Lehner <mlehner@gmail.com>\n */\nclass GelfMessageFormatter extends NormalizerFormatter\n{\n    protected const DEFAULT_MAX_LENGTH = 32766;\n\n    /**\n     * @var string the name of the system for the Gelf log message\n     */\n    protected string $systemName;\n\n    /**\n     * @var string a prefix for 'extra' fields from the Monolog record (optional)\n     */\n    protected string $extraPrefix;\n\n    /**\n     * @var string a prefix for 'context' fields from the Monolog record (optional)\n     */\n    protected string $contextPrefix;\n\n    /**\n     * @var int max length per field\n     */\n    protected int $maxLength;\n\n    /**\n     * Translates Monolog log levels to Graylog2 log priorities.\n     */\n    private function getGraylog2Priority(Level $level): int\n    {\n        return match ($level) {\n            Level::Debug     => 7,\n            Level::Info      => 6,\n            Level::Notice    => 5,\n            Level::Warning   => 4,\n            Level::Error     => 3,\n            Level::Critical  => 2,\n            Level::Alert     => 1,\n            Level::Emergency => 0,\n        };\n    }\n\n    /**\n     * @throws \\RuntimeException\n     */\n    public function __construct(?string $systemName = null, ?string $extraPrefix = null, string $contextPrefix = 'ctxt_', ?int $maxLength = null)\n    {\n        if (!class_exists(Message::class)) {\n            throw new \\RuntimeException('Composer package graylog2/gelf-php is required to use Monolog\\'s GelfMessageFormatter');\n        }\n\n        parent::__construct('U.u');\n\n        $this->systemName = (null === $systemName || $systemName === '') ? (string) gethostname() : $systemName;\n\n        $this->extraPrefix = null === $extraPrefix ? '' : $extraPrefix;\n        $this->contextPrefix = $contextPrefix;\n        $this->maxLength = null === $maxLength ? self::DEFAULT_MAX_LENGTH : $maxLength;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function format(LogRecord $record): Message\n    {\n        $context = $extra = [];\n        if (isset($record->context)) {\n            /** @var mixed[] $context */\n            $context = parent::normalize($record->context);\n        }\n        if (isset($record->extra)) {\n            /** @var mixed[] $extra */\n            $extra = parent::normalize($record->extra);\n        }\n\n        $message = new Message();\n        $message\n            ->setTimestamp($record->datetime)\n            ->setShortMessage($record->message)\n            ->setHost($this->systemName)\n            ->setLevel($this->getGraylog2Priority($record->level));\n\n        // message length + system name length + 200 for padding / metadata\n        $len = 200 + strlen($record->message) + strlen($this->systemName);\n\n        if ($len > $this->maxLength) {\n            $message->setShortMessage(Utils::substr($record->message, 0, $this->maxLength));\n        }\n\n        if (isset($record->channel)) {\n            $message->setAdditional('facility', $record->channel);\n        }\n\n        foreach ($extra as $key => $val) {\n            $val = is_scalar($val) || null === $val ? $val : $this->toJson($val);\n            $len = strlen($this->extraPrefix . $key . $val);\n            if ($len > $this->maxLength) {\n                $message->setAdditional($this->extraPrefix . $key, Utils::substr((string) $val, 0, $this->maxLength));\n\n                continue;\n            }\n            $message->setAdditional($this->extraPrefix . $key, $val);\n        }\n\n        foreach ($context as $key => $val) {\n            $val = is_scalar($val) || null === $val ? $val : $this->toJson($val);\n            $len = strlen($this->contextPrefix . $key . $val);\n            if ($len > $this->maxLength) {\n                $message->setAdditional($this->contextPrefix . $key, Utils::substr((string) $val, 0, $this->maxLength));\n\n                continue;\n            }\n            $message->setAdditional($this->contextPrefix . $key, $val);\n        }\n\n        if (!$message->hasAdditional('file') && isset($context['exception']['file'])) {\n            if (1 === preg_match(\"/^(.+):([0-9]+)$/\", $context['exception']['file'], $matches)) {\n                $message->setAdditional('file', $matches[1]);\n                $message->setAdditional('line', $matches[2]);\n            }\n        }\n\n        return $message;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse DateTimeInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Encodes message information into JSON in a format compatible with Cloud logging.\n *\n * @see https://cloud.google.com/logging/docs/structured-logging\n * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry\n *\n * @author Luís Cobucci <lcobucci@gmail.com>\n */\nclass GoogleCloudLoggingFormatter extends JsonFormatter\n{\n    protected function normalizeRecord(LogRecord $record): array\n    {\n        $normalized = parent::normalizeRecord($record);\n\n        // Re-key level for GCP logging\n        $normalized['severity'] = $normalized['level_name'];\n        $normalized['time'] = $record->datetime->format(DateTimeInterface::RFC3339_EXTENDED);\n\n        // Remove keys that are not used by GCP\n        unset($normalized['level'], $normalized['level_name'], $normalized['datetime']);\n\n        return $normalized;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Formats incoming records into an HTML table\n *\n * This is especially useful for html email logging\n *\n * @author Tiago Brito <tlfbrito@gmail.com>\n */\nclass HtmlFormatter extends NormalizerFormatter\n{\n    /**\n     * Translates Monolog log levels to html color priorities.\n     */\n    protected function getLevelColor(Level $level): string\n    {\n        return match ($level) {\n            Level::Debug     => '#CCCCCC',\n            Level::Info      => '#28A745',\n            Level::Notice    => '#17A2B8',\n            Level::Warning   => '#FFC107',\n            Level::Error     => '#FD7E14',\n            Level::Critical  => '#DC3545',\n            Level::Alert     => '#821722',\n            Level::Emergency => '#000000',\n        };\n    }\n\n    /**\n     * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format\n     * @throws \\RuntimeException If the function json_encode does not exist\n     */\n    public function __construct(?string $dateFormat = null)\n    {\n        parent::__construct($dateFormat);\n    }\n\n    /**\n     * Creates an HTML table row\n     *\n     * @param string $th       Row header content\n     * @param string $td       Row standard cell content\n     * @param bool   $escapeTd false if td content must not be html escaped\n     */\n    protected function addRow(string $th, string $td = ' ', bool $escapeTd = true): string\n    {\n        $th = htmlspecialchars($th, ENT_NOQUOTES, 'UTF-8');\n        if ($escapeTd) {\n            $td = '<pre>'.htmlspecialchars($td, ENT_NOQUOTES, 'UTF-8').'</pre>';\n        }\n\n        return \"<tr style=\\\"padding: 4px;text-align: left;\\\">\\n<th style=\\\"vertical-align: top;background: #ccc;color: #000\\\" width=\\\"100\\\">$th:</th>\\n<td style=\\\"padding: 4px;text-align: left;vertical-align: top;background: #eee;color: #000\\\">\".$td.\"</td>\\n</tr>\";\n    }\n\n    /**\n     * Create a HTML h1 tag\n     *\n     * @param string $title Text to be in the h1\n     */\n    protected function addTitle(string $title, Level $level): string\n    {\n        $title = htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8');\n\n        return '<h1 style=\"background: '.$this->getLevelColor($level).';color: #ffffff;padding: 5px;\" class=\"monolog-output\">'.$title.'</h1>';\n    }\n\n    /**\n     * Formats a log record.\n     *\n     * @return string The formatted record\n     */\n    public function format(LogRecord $record): string\n    {\n        $output = $this->addTitle($record->level->getName(), $record->level);\n        $output .= '<table cellspacing=\"1\" width=\"100%\" class=\"monolog-output\">';\n\n        $output .= $this->addRow('Message', $record->message);\n        $output .= $this->addRow('Time', $this->formatDate($record->datetime));\n        $output .= $this->addRow('Channel', $record->channel);\n        if (\\count($record->context) > 0) {\n            $embeddedTable = '<table cellspacing=\"1\" width=\"100%\">';\n            foreach ($record->context as $key => $value) {\n                $embeddedTable .= $this->addRow((string) $key, $this->convertToString($value));\n            }\n            $embeddedTable .= '</table>';\n            $output .= $this->addRow('Context', $embeddedTable, false);\n        }\n        if (\\count($record->extra) > 0) {\n            $embeddedTable = '<table cellspacing=\"1\" width=\"100%\">';\n            foreach ($record->extra as $key => $value) {\n                $embeddedTable .= $this->addRow((string) $key, $this->convertToString($value));\n            }\n            $embeddedTable .= '</table>';\n            $output .= $this->addRow('Extra', $embeddedTable, false);\n        }\n\n        return $output.'</table>';\n    }\n\n    /**\n     * Formats a set of log records.\n     *\n     * @return string The formatted set of records\n     */\n    public function formatBatch(array $records): string\n    {\n        $message = '';\n        foreach ($records as $record) {\n            $message .= $this->format($record);\n        }\n\n        return $message;\n    }\n\n    /**\n     * @param mixed $data\n     */\n    protected function convertToString($data): string\n    {\n        if (null === $data || is_scalar($data)) {\n            return (string) $data;\n        }\n\n        $data = $this->normalize($data);\n\n        return Utils::jsonEncode($data, JSON_PRETTY_PRINT | Utils::DEFAULT_JSON_FLAGS, true);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Stringable;\nuse Throwable;\nuse Monolog\\LogRecord;\n\n/**\n * Encodes whatever record data is passed to it as json\n *\n * This can be useful to log to databases or remote APIs\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass JsonFormatter extends NormalizerFormatter\n{\n    public const BATCH_MODE_JSON = 1;\n    public const BATCH_MODE_NEWLINES = 2;\n\n    /** @var self::BATCH_MODE_* */\n    protected int $batchMode;\n\n    protected bool $appendNewline;\n\n    protected bool $ignoreEmptyContextAndExtra;\n\n    protected bool $includeStacktraces = false;\n\n    /**\n     * @param self::BATCH_MODE_* $batchMode\n     *\n     * @throws \\RuntimeException If the function json_encode does not exist\n     */\n    public function __construct(int $batchMode = self::BATCH_MODE_JSON, bool $appendNewline = true, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = false)\n    {\n        $this->batchMode = $batchMode;\n        $this->appendNewline = $appendNewline;\n        $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra;\n        $this->includeStacktraces = $includeStacktraces;\n\n        parent::__construct();\n    }\n\n    /**\n     * The batch mode option configures the formatting style for\n     * multiple records. By default, multiple records will be\n     * formatted as a JSON-encoded array. However, for\n     * compatibility with some API endpoints, alternative styles\n     * are available.\n     */\n    public function getBatchMode(): int\n    {\n        return $this->batchMode;\n    }\n\n    /**\n     * True if newlines are appended to every formatted record\n     */\n    public function isAppendingNewlines(): bool\n    {\n        return $this->appendNewline;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function format(LogRecord $record): string\n    {\n        $normalized = parent::format($record);\n\n        if (isset($normalized['context']) && $normalized['context'] === []) {\n            if ($this->ignoreEmptyContextAndExtra) {\n                unset($normalized['context']);\n            } else {\n                $normalized['context'] = new \\stdClass;\n            }\n        }\n        if (isset($normalized['extra']) && $normalized['extra'] === []) {\n            if ($this->ignoreEmptyContextAndExtra) {\n                unset($normalized['extra']);\n            } else {\n                $normalized['extra'] = new \\stdClass;\n            }\n        }\n\n        return $this->toJson($normalized, true) . ($this->appendNewline ? \"\\n\" : '');\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function formatBatch(array $records): string\n    {\n        return match ($this->batchMode) {\n            static::BATCH_MODE_NEWLINES => $this->formatBatchNewlines($records),\n            default => $this->formatBatchJson($records),\n        };\n    }\n\n    /**\n     * @return $this\n     */\n    public function includeStacktraces(bool $include = true): self\n    {\n        $this->includeStacktraces = $include;\n\n        return $this;\n    }\n\n    /**\n     * Return a JSON-encoded array of records.\n     *\n     * @phpstan-param LogRecord[] $records\n     */\n    protected function formatBatchJson(array $records): string\n    {\n        return $this->toJson($this->normalize($records), true);\n    }\n\n    /**\n     * Use new lines to separate records instead of a\n     * JSON-encoded array.\n     *\n     * @phpstan-param LogRecord[] $records\n     */\n    protected function formatBatchNewlines(array $records): string\n    {\n        $oldNewline = $this->appendNewline;\n        $this->appendNewline = false;\n        $formatted = array_map(fn (LogRecord $record) => $this->format($record), $records);\n        $this->appendNewline = $oldNewline;\n\n        return implode(\"\\n\", $formatted);\n    }\n\n    /**\n     * Normalizes given $data.\n     *\n     * @return null|scalar|array<mixed[]|scalar|null|object>|object\n     */\n    protected function normalize(mixed $data, int $depth = 0): mixed\n    {\n        if ($depth > $this->maxNormalizeDepth) {\n            return 'Over '.$this->maxNormalizeDepth.' levels deep, aborting normalization';\n        }\n\n        if (is_array($data)) {\n            $normalized = [];\n\n            $count = 1;\n            foreach ($data as $key => $value) {\n                if ($count++ > $this->maxNormalizeItemCount) {\n                    $normalized['...'] = 'Over '.$this->maxNormalizeItemCount.' items ('.count($data).' total), aborting normalization';\n                    break;\n                }\n\n                $normalized[$key] = $this->normalize($value, $depth + 1);\n            }\n\n            return $normalized;\n        }\n\n        if (is_object($data)) {\n            if ($data instanceof \\DateTimeInterface) {\n                return $this->formatDate($data);\n            }\n\n            if ($data instanceof Throwable) {\n                return $this->normalizeException($data, $depth);\n            }\n\n            // if the object has specific json serializability we want to make sure we skip the __toString treatment below\n            if ($data instanceof \\JsonSerializable) {\n                return $data;\n            }\n\n            if ($data instanceof Stringable) {\n                return $data->__toString();\n            }\n\n            return $data;\n        }\n\n        if (is_resource($data)) {\n            return parent::normalize($data);\n        }\n\n        return $data;\n    }\n\n    /**\n     * Normalizes given exception with or without its own stack trace based on\n     * `includeStacktraces` property.\n     *\n     * @inheritDoc\n     */\n    protected function normalizeException(Throwable $e, int $depth = 0): array\n    {\n        $data = parent::normalizeException($e, $depth);\n        if (!$this->includeStacktraces) {\n            unset($data['trace']);\n        }\n\n        return $data;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Closure;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Formats incoming records into a one-line string\n *\n * This is especially useful for logging to files\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @author Christophe Coevoet <stof@notk.org>\n */\nclass LineFormatter extends NormalizerFormatter\n{\n    public const SIMPLE_FORMAT = \"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\\n\";\n\n    protected string $format;\n    protected bool $allowInlineLineBreaks;\n    protected bool $ignoreEmptyContextAndExtra;\n    protected bool $includeStacktraces;\n    protected ?int $maxLevelNameLength = null;\n    protected string $indentStacktraces = '';\n    protected Closure|null $stacktracesParser = null;\n    protected string $basePath = '';\n\n    /**\n     * @param string|null $format                The format of the message\n     * @param string|null $dateFormat            The format of the timestamp: one supported by DateTime::format\n     * @param bool        $allowInlineLineBreaks Whether to allow inline line breaks in log entries\n     *\n     * @throws \\RuntimeException If the function json_encode does not exist\n     */\n    public function __construct(?string $format = null, ?string $dateFormat = null, bool $allowInlineLineBreaks = false, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = false)\n    {\n        $this->format = $format === null ? static::SIMPLE_FORMAT : $format;\n        $this->allowInlineLineBreaks = $allowInlineLineBreaks;\n        $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra;\n        $this->includeStacktraces($includeStacktraces);\n        parent::__construct($dateFormat);\n    }\n\n    /**\n     * Setting a base path will hide the base path from exception and stack trace file names to shorten them\n     * @return $this\n     */\n    public function setBasePath(string $path = ''): self\n    {\n        if ($path !== '') {\n            $path = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;\n        }\n\n        $this->basePath = $path;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function includeStacktraces(bool $include = true, ?Closure $parser = null): self\n    {\n        $this->includeStacktraces = $include;\n        if ($this->includeStacktraces) {\n            $this->allowInlineLineBreaks = true;\n            $this->stacktracesParser = $parser;\n        }\n\n        return $this;\n    }\n\n    /**\n     * Indent stack traces to separate them a bit from the main log record messages\n     *\n     * @param string $indent The string used to indent, for example \"    \"\n     * @return $this\n     */\n    public function indentStacktraces(string $indent): self\n    {\n        $this->indentStacktraces = $indent;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function allowInlineLineBreaks(bool $allow = true): self\n    {\n        $this->allowInlineLineBreaks = $allow;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function ignoreEmptyContextAndExtra(bool $ignore = true): self\n    {\n        $this->ignoreEmptyContextAndExtra = $ignore;\n\n        return $this;\n    }\n\n    /**\n     * Allows cutting the level name to get fixed-length levels like INF for INFO, ERR for ERROR if you set this to 3 for example\n     *\n     * @param int|null $maxLevelNameLength Maximum characters for the level name. Set null for infinite length (default)\n     * @return $this\n     */\n    public function setMaxLevelNameLength(?int $maxLevelNameLength = null): self\n    {\n        $this->maxLevelNameLength = $maxLevelNameLength;\n\n        return $this;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function format(LogRecord $record): string\n    {\n        $vars = parent::format($record);\n\n        if ($this->maxLevelNameLength !== null) {\n            $vars['level_name'] = substr($vars['level_name'], 0, $this->maxLevelNameLength);\n        }\n\n        $output = $this->format;\n        foreach ($vars['extra'] as $var => $val) {\n            if (false !== strpos($output, '%extra.'.$var.'%')) {\n                $output = str_replace('%extra.'.$var.'%', $this->stringify($val), $output);\n                unset($vars['extra'][$var]);\n            }\n        }\n\n        foreach ($vars['context'] as $var => $val) {\n            if (false !== strpos($output, '%context.'.$var.'%')) {\n                $output = str_replace('%context.'.$var.'%', $this->stringify($val), $output);\n                unset($vars['context'][$var]);\n            }\n        }\n\n        if ($this->ignoreEmptyContextAndExtra) {\n            if (\\count($vars['context']) === 0) {\n                unset($vars['context']);\n                $output = str_replace('%context%', '', $output);\n            }\n\n            if (\\count($vars['extra']) === 0) {\n                unset($vars['extra']);\n                $output = str_replace('%extra%', '', $output);\n            }\n        }\n\n        foreach ($vars as $var => $val) {\n            if (false !== strpos($output, '%'.$var.'%')) {\n                $output = str_replace('%'.$var.'%', $this->stringify($val), $output);\n            }\n        }\n\n        // remove leftover %extra.xxx% and %context.xxx% if any\n        if (false !== strpos($output, '%')) {\n            $output = preg_replace('/%(?:extra|context)\\..+?%/', '', $output);\n            if (null === $output) {\n                $pcreErrorCode = preg_last_error();\n\n                throw new \\RuntimeException('Failed to run preg_replace: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode));\n            }\n        }\n\n        return $output;\n    }\n\n    public function formatBatch(array $records): string\n    {\n        $message = '';\n        foreach ($records as $record) {\n            $message .= $this->format($record);\n        }\n\n        return $message;\n    }\n\n    /**\n     * @param mixed $value\n     */\n    public function stringify($value): string\n    {\n        return $this->replaceNewlines($this->convertToString($value));\n    }\n\n    protected function normalizeException(\\Throwable $e, int $depth = 0): string\n    {\n        $str = $this->formatException($e);\n\n        if (($previous = $e->getPrevious()) instanceof \\Throwable) {\n            do {\n                $depth++;\n                if ($depth > $this->maxNormalizeDepth) {\n                    $str .= \"\\n[previous exception] Over \" . $this->maxNormalizeDepth . ' levels deep, aborting normalization';\n                    break;\n                }\n\n                $str .= \"\\n[previous exception] \" . $this->formatException($previous);\n            } while ($previous = $previous->getPrevious());\n        }\n\n        return $str;\n    }\n\n    /**\n     * @param mixed $data\n     */\n    protected function convertToString($data): string\n    {\n        if (null === $data || is_bool($data)) {\n            return var_export($data, true);\n        }\n\n        if (is_scalar($data)) {\n            return (string) $data;\n        }\n\n        return $this->toJson($data, true);\n    }\n\n    protected function replaceNewlines(string $str): string\n    {\n        if ($this->allowInlineLineBreaks) {\n            if (0 === strpos($str, '{') || 0 === strpos($str, '[')) {\n                $str = preg_replace('/(?<!\\\\\\\\)\\\\\\\\[rn]/', \"\\n\", $str);\n                if (null === $str) {\n                    $pcreErrorCode = preg_last_error();\n                    throw new \\RuntimeException('Failed to run preg_replace: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode));\n                }\n            }\n\n            return $str;\n        }\n\n        return str_replace([\"\\r\\n\", \"\\r\", \"\\n\"], ' ', $str);\n    }\n\n    private function formatException(\\Throwable $e): string\n    {\n        $str = '[object] (' . Utils::getClass($e) . '(code: ' . $e->getCode();\n        if ($e instanceof \\SoapFault) {\n            if (isset($e->faultcode)) {\n                $str .= ' faultcode: ' . $e->faultcode;\n            }\n\n            if (isset($e->faultactor)) {\n                $str .= ' faultactor: ' . $e->faultactor;\n            }\n\n            if (isset($e->detail)) {\n                if (is_string($e->detail)) {\n                    $str .= ' detail: ' . $e->detail;\n                } elseif (is_object($e->detail) || is_array($e->detail)) {\n                    $str .= ' detail: ' . $this->toJson($e->detail, true);\n                }\n            }\n        }\n\n        $file = $e->getFile();\n        if ($this->basePath !== '') {\n            $file = preg_replace('{^'.preg_quote($this->basePath).'}', '', $file);\n        }\n\n        $str .= '): ' . $e->getMessage() . ' at ' . $file . ':' . $e->getLine() . ')';\n\n        if ($this->includeStacktraces) {\n            $str .= $this->stacktracesParser($e);\n        }\n\n        return $str;\n    }\n\n    private function stacktracesParser(\\Throwable $e): string\n    {\n        $trace = $e->getTraceAsString();\n\n        if ($this->basePath !== '') {\n            $trace = preg_replace('{^(#\\d+ )' . preg_quote($this->basePath) . '}m', '$1', $trace) ?? $trace;\n        }\n\n        if ($this->stacktracesParser !== null) {\n            $trace = $this->stacktracesParserCustom($trace);\n        }\n\n        if ($this->indentStacktraces !== '') {\n            $trace = str_replace(\"\\n\", \"\\n{$this->indentStacktraces}\", $trace);\n        }\n\n        return \"\\n{$this->indentStacktraces}[stacktrace]\\n{$this->indentStacktraces}\" . $trace . \"\\n\";\n    }\n\n    private function stacktracesParserCustom(string $trace): string\n    {\n        return implode(\"\\n\", array_filter(array_map($this->stacktracesParser, explode(\"\\n\", $trace))));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\LogRecord;\n\n/**\n * Encodes message information into JSON in a format compatible with Loggly.\n *\n * @author Adam Pancutt <adam@pancutt.com>\n */\nclass LogglyFormatter extends JsonFormatter\n{\n    /**\n     * Overrides the default batch mode to new lines for compatibility with the\n     * Loggly bulk API.\n     */\n    public function __construct(int $batchMode = self::BATCH_MODE_NEWLINES, bool $appendNewline = false)\n    {\n        parent::__construct($batchMode, $appendNewline);\n    }\n\n    /**\n     * Appends the 'timestamp' parameter for indexing by Loggly.\n     *\n     * @see https://www.loggly.com/docs/automated-parsing/#json\n     * @see \\Monolog\\Formatter\\JsonFormatter::format()\n     */\n    protected function normalizeRecord(LogRecord $record): array\n    {\n        $recordData = parent::normalizeRecord($record);\n\n        $recordData[\"timestamp\"] = $record->datetime->format(\"Y-m-d\\TH:i:s.uO\");\n        unset($recordData[\"datetime\"]);\n\n        return $recordData;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\LogRecord;\n\n/**\n * Encodes message information into JSON in a format compatible with Logmatic.\n *\n * @author Julien Breux <julien.breux@gmail.com>\n */\nclass LogmaticFormatter extends JsonFormatter\n{\n    protected const MARKERS = [\"sourcecode\", \"php\"];\n\n    protected string $hostname = '';\n\n    protected string $appName = '';\n\n    /**\n     * @return $this\n     */\n    public function setHostname(string $hostname): self\n    {\n        $this->hostname = $hostname;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setAppName(string $appName): self\n    {\n        $this->appName = $appName;\n\n        return $this;\n    }\n\n    /**\n     * Appends the 'hostname' and 'appname' parameter for indexing by Logmatic.\n     *\n     * @see http://doc.logmatic.io/docs/basics-to-send-data\n     * @see \\Monolog\\Formatter\\JsonFormatter::format()\n     */\n    public function normalizeRecord(LogRecord $record): array\n    {\n        $record = parent::normalizeRecord($record);\n\n        if ($this->hostname !== '') {\n            $record[\"hostname\"] = $this->hostname;\n        }\n        if ($this->appName !== '') {\n            $record[\"appname\"] = $this->appName;\n        }\n\n        $record[\"@marker\"] = static::MARKERS;\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\LogRecord;\n\n/**\n * Serializes a log message to Logstash Event Format\n *\n * @see https://www.elastic.co/products/logstash\n * @see https://github.com/elastic/logstash/blob/master/logstash-core/src/main/java/org/logstash/Event.java\n *\n * @author Tim Mower <timothy.mower@gmail.com>\n */\nclass LogstashFormatter extends NormalizerFormatter\n{\n    /**\n     * @var string the name of the system for the Logstash log message, used to fill the @source field\n     */\n    protected string $systemName;\n\n    /**\n     * @var string an application name for the Logstash log message, used to fill the @type field\n     */\n    protected string $applicationName;\n\n    /**\n     * @var string the key for 'extra' fields from the Monolog record\n     */\n    protected string $extraKey;\n\n    /**\n     * @var string the key for 'context' fields from the Monolog record\n     */\n    protected string $contextKey;\n\n    /**\n     * @param string      $applicationName The application that sends the data, used as the \"type\" field of logstash\n     * @param string|null $systemName      The system/machine name, used as the \"source\" field of logstash, defaults to the hostname of the machine\n     * @param string      $extraKey        The key for extra keys inside logstash \"fields\", defaults to extra\n     * @param string      $contextKey      The key for context keys inside logstash \"fields\", defaults to context\n     *\n     * @throws \\RuntimeException If the function json_encode does not exist\n     */\n    public function __construct(string $applicationName, ?string $systemName = null, string $extraKey = 'extra', string $contextKey = 'context')\n    {\n        // logstash requires a ISO 8601 format date with optional millisecond precision.\n        parent::__construct('Y-m-d\\TH:i:s.uP');\n\n        $this->systemName = $systemName === null ? (string) gethostname() : $systemName;\n        $this->applicationName = $applicationName;\n        $this->extraKey = $extraKey;\n        $this->contextKey = $contextKey;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function format(LogRecord $record): string\n    {\n        $recordData = parent::format($record);\n\n        $message = [\n            '@timestamp' => $recordData['datetime'],\n            '@version' => 1,\n            'host' => $this->systemName,\n        ];\n        if (isset($recordData['message'])) {\n            $message['message'] = $recordData['message'];\n        }\n        if (isset($recordData['channel'])) {\n            $message['type'] = $recordData['channel'];\n            $message['channel'] = $recordData['channel'];\n        }\n        if (isset($recordData['level_name'])) {\n            $message['level'] = $recordData['level_name'];\n        }\n        if (isset($recordData['level'])) {\n            $message['monolog_level'] = $recordData['level'];\n        }\n        if ('' !== $this->applicationName) {\n            $message['type'] = $this->applicationName;\n        }\n        if (\\count($recordData['extra']) > 0) {\n            $message[$this->extraKey] = $recordData['extra'];\n        }\n        if (\\count($recordData['context']) > 0) {\n            $message[$this->contextKey] = $recordData['context'];\n        }\n\n        return $this->toJson($message) . \"\\n\";\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse MongoDB\\BSON\\Type;\nuse MongoDB\\BSON\\UTCDateTime;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Formats a record for use with the MongoDBHandler.\n *\n * @author Florian Plattner <me@florianplattner.de>\n */\nclass MongoDBFormatter implements FormatterInterface\n{\n    private bool $exceptionTraceAsString;\n    private int $maxNestingLevel;\n    private bool $isLegacyMongoExt;\n\n    /**\n     * @param int  $maxNestingLevel        0 means infinite nesting, the $record itself is level 1, $record->context is 2\n     * @param bool $exceptionTraceAsString set to false to log exception traces as a sub documents instead of strings\n     */\n    public function __construct(int $maxNestingLevel = 3, bool $exceptionTraceAsString = true)\n    {\n        $this->maxNestingLevel = max($maxNestingLevel, 0);\n        $this->exceptionTraceAsString = $exceptionTraceAsString;\n\n        $this->isLegacyMongoExt = extension_loaded('mongodb') && version_compare((string) phpversion('mongodb'), '1.1.9', '<=');\n    }\n\n    /**\n     * @inheritDoc\n     *\n     * @return mixed[]\n     */\n    public function format(LogRecord $record): array\n    {\n        /** @var mixed[] $res */\n        $res = $this->formatArray($record->toArray());\n\n        return $res;\n    }\n\n    /**\n     * @inheritDoc\n     *\n     * @return array<mixed[]>\n     */\n    public function formatBatch(array $records): array\n    {\n        $formatted = [];\n        foreach ($records as $key => $record) {\n            $formatted[$key] = $this->format($record);\n        }\n\n        return $formatted;\n    }\n\n    /**\n     * @param  mixed[]        $array\n     * @return mixed[]|string Array except when max nesting level is reached then a string \"[...]\"\n     */\n    protected function formatArray(array $array, int $nestingLevel = 0)\n    {\n        if ($this->maxNestingLevel > 0 && $nestingLevel > $this->maxNestingLevel) {\n            return '[...]';\n        }\n\n        foreach ($array as $name => $value) {\n            if ($value instanceof \\DateTimeInterface) {\n                $array[$name] = $this->formatDate($value, $nestingLevel + 1);\n            } elseif ($value instanceof \\Throwable) {\n                $array[$name] = $this->formatException($value, $nestingLevel + 1);\n            } elseif (is_array($value)) {\n                $array[$name] = $this->formatArray($value, $nestingLevel + 1);\n            } elseif (is_object($value) && !$value instanceof Type) {\n                $array[$name] = $this->formatObject($value, $nestingLevel + 1);\n            }\n        }\n\n        return $array;\n    }\n\n    /**\n     * @param  mixed          $value\n     * @return mixed[]|string\n     */\n    protected function formatObject($value, int $nestingLevel)\n    {\n        $objectVars = get_object_vars($value);\n        $objectVars['class'] = Utils::getClass($value);\n\n        return $this->formatArray($objectVars, $nestingLevel);\n    }\n\n    /**\n     * @return mixed[]|string\n     */\n    protected function formatException(\\Throwable $exception, int $nestingLevel)\n    {\n        $formattedException = [\n            'class' => Utils::getClass($exception),\n            'message' => $exception->getMessage(),\n            'code' => (int) $exception->getCode(),\n            'file' => $exception->getFile() . ':' . $exception->getLine(),\n        ];\n\n        if ($this->exceptionTraceAsString === true) {\n            $formattedException['trace'] = $exception->getTraceAsString();\n        } else {\n            $formattedException['trace'] = $exception->getTrace();\n        }\n\n        return $this->formatArray($formattedException, $nestingLevel);\n    }\n\n    protected function formatDate(\\DateTimeInterface $value, int $nestingLevel): UTCDateTime\n    {\n        if ($this->isLegacyMongoExt) {\n            return $this->legacyGetMongoDbDateTime($value);\n        }\n\n        return $this->getMongoDbDateTime($value);\n    }\n\n    private function getMongoDbDateTime(\\DateTimeInterface $value): UTCDateTime\n    {\n        return new UTCDateTime((int) floor(((float) $value->format('U.u')) * 1000));\n    }\n\n    /**\n     * This is needed to support MongoDB Driver v1.19 and below\n     *\n     * See https://github.com/mongodb/mongo-php-driver/issues/426\n     *\n     * It can probably be removed in 2.1 or later once MongoDB's 1.2 is released and widely adopted\n     */\n    private function legacyGetMongoDbDateTime(\\DateTimeInterface $value): UTCDateTime\n    {\n        $milliseconds = floor(((float) $value->format('U.u')) * 1000);\n\n        $milliseconds = (PHP_INT_SIZE == 8) //64-bit OS?\n            ? (int) $milliseconds\n            : (string) $milliseconds;\n\n        return new UTCDateTime($milliseconds);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\DateTimeImmutable;\nuse Monolog\\Utils;\nuse Throwable;\nuse Monolog\\LogRecord;\n\n/**\n * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass NormalizerFormatter implements FormatterInterface\n{\n    public const SIMPLE_DATE = \"Y-m-d\\TH:i:sP\";\n\n    protected string $dateFormat;\n    protected int $maxNormalizeDepth = 9;\n    protected int $maxNormalizeItemCount = 1000;\n\n    private int $jsonEncodeOptions = Utils::DEFAULT_JSON_FLAGS;\n\n    /**\n     * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format\n     * @throws \\RuntimeException If the function json_encode does not exist\n     */\n    public function __construct(?string $dateFormat = null)\n    {\n        $this->dateFormat = null === $dateFormat ? static::SIMPLE_DATE : $dateFormat;\n        if (!function_exists('json_encode')) {\n            throw new \\RuntimeException('PHP\\'s json extension is required to use Monolog\\'s NormalizerFormatter');\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function format(LogRecord $record)\n    {\n        return $this->normalizeRecord($record);\n    }\n\n    /**\n     * Normalize an arbitrary value to a scalar|array|null\n     *\n     * @return null|scalar|array<mixed[]|scalar|null>\n     */\n    public function normalizeValue(mixed $data): mixed\n    {\n        return $this->normalize($data);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function formatBatch(array $records)\n    {\n        foreach ($records as $key => $record) {\n            $records[$key] = $this->format($record);\n        }\n\n        return $records;\n    }\n\n    public function getDateFormat(): string\n    {\n        return $this->dateFormat;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setDateFormat(string $dateFormat): self\n    {\n        $this->dateFormat = $dateFormat;\n\n        return $this;\n    }\n\n    /**\n     * The maximum number of normalization levels to go through\n     */\n    public function getMaxNormalizeDepth(): int\n    {\n        return $this->maxNormalizeDepth;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setMaxNormalizeDepth(int $maxNormalizeDepth): self\n    {\n        $this->maxNormalizeDepth = $maxNormalizeDepth;\n\n        return $this;\n    }\n\n    /**\n     * The maximum number of items to normalize per level\n     */\n    public function getMaxNormalizeItemCount(): int\n    {\n        return $this->maxNormalizeItemCount;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setMaxNormalizeItemCount(int $maxNormalizeItemCount): self\n    {\n        $this->maxNormalizeItemCount = $maxNormalizeItemCount;\n\n        return $this;\n    }\n\n    /**\n     * Enables `json_encode` pretty print.\n     *\n     * @return $this\n     */\n    public function setJsonPrettyPrint(bool $enable): self\n    {\n        if ($enable) {\n            $this->jsonEncodeOptions |= JSON_PRETTY_PRINT;\n        } else {\n            $this->jsonEncodeOptions &= ~JSON_PRETTY_PRINT;\n        }\n\n        return $this;\n    }\n\n    /**\n     * Provided as extension point\n     *\n     * Because normalize is called with sub-values of context data etc, normalizeRecord can be\n     * extended when data needs to be appended on the record array but not to other normalized data.\n     *\n     * @return array<mixed[]|scalar|null>\n     */\n    protected function normalizeRecord(LogRecord $record): array\n    {\n        /** @var array<mixed> $normalized */\n        $normalized = $this->normalize($record->toArray());\n\n        return $normalized;\n    }\n\n    /**\n     * @return null|scalar|array<mixed[]|scalar|null>\n     */\n    protected function normalize(mixed $data, int $depth = 0): mixed\n    {\n        if ($depth > $this->maxNormalizeDepth) {\n            return 'Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization';\n        }\n\n        if (null === $data || is_scalar($data)) {\n            if (is_float($data)) {\n                if (is_infinite($data)) {\n                    return ($data > 0 ? '' : '-') . 'INF';\n                }\n                if (is_nan($data)) {\n                    return 'NaN';\n                }\n            }\n\n            return $data;\n        }\n\n        if (is_array($data)) {\n            $normalized = [];\n\n            $count = 1;\n            foreach ($data as $key => $value) {\n                if ($count++ > $this->maxNormalizeItemCount) {\n                    $normalized['...'] = 'Over ' . $this->maxNormalizeItemCount . ' items ('.count($data).' total), aborting normalization';\n                    break;\n                }\n\n                $normalized[$key] = $this->normalize($value, $depth + 1);\n            }\n\n            return $normalized;\n        }\n\n        if ($data instanceof \\DateTimeInterface) {\n            return $this->formatDate($data);\n        }\n\n        if (is_object($data)) {\n            if ($data instanceof Throwable) {\n                return $this->normalizeException($data, $depth);\n            }\n\n            if ($data instanceof \\JsonSerializable) {\n                /** @var null|scalar|array<mixed[]|scalar|null> $value */\n                $value = $data->jsonSerialize();\n            } elseif (\\get_class($data) === '__PHP_Incomplete_Class') {\n                $accessor = new \\ArrayObject($data);\n                $value = (string) $accessor['__PHP_Incomplete_Class_Name'];\n            } elseif (method_exists($data, '__toString')) {\n                try {\n                    /** @var string $value */\n                    $value = $data->__toString();\n                } catch (\\Throwable) {\n                    // if the toString method is failing, use the default behavior\n                    /** @var null|scalar|array<mixed[]|scalar|null> $value */\n                    $value = json_decode($this->toJson($data, true), true);\n                }\n            } else {\n                // the rest is normalized by json encoding and decoding it\n                /** @var null|scalar|array<mixed[]|scalar|null> $value */\n                $value = json_decode($this->toJson($data, true), true);\n            }\n\n            return [Utils::getClass($data) => $value];\n        }\n\n        if (is_resource($data)) {\n            return sprintf('[resource(%s)]', get_resource_type($data));\n        }\n\n        return '[unknown('.gettype($data).')]';\n    }\n\n    /**\n     * @return mixed[]\n     */\n    protected function normalizeException(Throwable $e, int $depth = 0)\n    {\n        if ($depth > $this->maxNormalizeDepth) {\n            return ['Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization'];\n        }\n\n        if ($e instanceof \\JsonSerializable) {\n            return (array) $e->jsonSerialize();\n        }\n\n        $data = [\n            'class' => Utils::getClass($e),\n            'message' => $e->getMessage(),\n            'code' => (int) $e->getCode(),\n            'file' => $e->getFile().':'.$e->getLine(),\n        ];\n\n        if ($e instanceof \\SoapFault) {\n            if (isset($e->faultcode)) {\n                $data['faultcode'] = $e->faultcode;\n            }\n\n            if (isset($e->faultactor)) {\n                $data['faultactor'] = $e->faultactor;\n            }\n\n            if (isset($e->detail)) {\n                if (is_string($e->detail)) {\n                    $data['detail'] = $e->detail;\n                } elseif (is_object($e->detail) || is_array($e->detail)) {\n                    $data['detail'] = $this->toJson($e->detail, true);\n                }\n            }\n        }\n\n        $trace = $e->getTrace();\n        foreach ($trace as $frame) {\n            if (isset($frame['file'], $frame['line'])) {\n                $data['trace'][] = $frame['file'].':'.$frame['line'];\n            }\n        }\n\n        if (($previous = $e->getPrevious()) instanceof \\Throwable) {\n            $data['previous'] = $this->normalizeException($previous, $depth + 1);\n        }\n\n        return $data;\n    }\n\n    /**\n     * Return the JSON representation of a value\n     *\n     * @param  mixed             $data\n     * @throws \\RuntimeException if encoding fails and errors are not ignored\n     * @return string            if encoding fails and ignoreErrors is true 'null' is returned\n     */\n    protected function toJson($data, bool $ignoreErrors = false): string\n    {\n        return Utils::jsonEncode($data, $this->jsonEncodeOptions, $ignoreErrors);\n    }\n\n    protected function formatDate(\\DateTimeInterface $date): string\n    {\n        // in case the date format isn't custom then we defer to the custom DateTimeImmutable\n        // formatting logic, which will pick the right format based on whether useMicroseconds is on\n        if ($this->dateFormat === self::SIMPLE_DATE && $date instanceof DateTimeImmutable) {\n            return (string) $date;\n        }\n\n        return $date->format($this->dateFormat);\n    }\n\n    /**\n     * @return $this\n     */\n    public function addJsonEncodeOption(int $option): self\n    {\n        $this->jsonEncodeOptions |= $option;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function removeJsonEncodeOption(int $option): self\n    {\n        $this->jsonEncodeOptions &= ~$option;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\LogRecord;\n\n/**\n * Formats data into an associative array of scalar (+ null) values.\n * Objects and arrays will be JSON encoded.\n *\n * @author Andrew Lawson <adlawson@gmail.com>\n */\nclass ScalarFormatter extends NormalizerFormatter\n{\n    /**\n     * @inheritDoc\n     *\n     * @phpstan-return array<string, scalar|null> $record\n     */\n    public function format(LogRecord $record): array\n    {\n        $result = [];\n        foreach ($record->toArray() as $key => $value) {\n            $result[$key] = $this->toScalar($value);\n        }\n\n        return $result;\n    }\n\n    protected function toScalar(mixed $value): string|int|float|bool|null\n    {\n        $normalized = $this->normalize($value);\n\n        if (is_array($normalized)) {\n            return $this->toJson($normalized, true);\n        }\n\n        return $normalized;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/SyslogFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\n\n/**\n * Serializes a log message according to RFC 5424\n *\n * @author Dalibor Karlović <dalibor.karlovic@sigwin.hr>\n * @author Renat Gabdullin <renatobyj@gmail.com>\n */\nclass SyslogFormatter extends LineFormatter\n{\n    private const SYSLOG_FACILITY_USER = 1;\n    private const FORMAT = \"<%extra.priority%>1 %datetime% %extra.hostname% %extra.app-name% %extra.procid% %channel% %extra.structured-data% %level_name%: %message% %context% %extra%\\n\";\n    private const NILVALUE = '-';\n\n    private string $hostname;\n    private int $procid;\n\n    public function __construct(private string $applicationName = self::NILVALUE)\n    {\n        parent::__construct(self::FORMAT, 'Y-m-d\\TH:i:s.uP', true, true);\n        $this->hostname = (string) gethostname();\n        $this->procid = (int) getmypid();\n    }\n\n    public function format(LogRecord $record): string\n    {\n        $record->extra = $this->formatExtra($record);\n\n        return parent::format($record);\n    }\n\n    /**\n     * @param LogRecord $record\n     * @return array<string, mixed>\n     */\n    private function formatExtra(LogRecord $record): array\n    {\n        $extra = $record->extra;\n        $extra['app-name'] = $this->applicationName;\n        $extra['hostname'] = $this->hostname;\n        $extra['procid'] = $this->procid;\n        $extra['priority'] = self::calculatePriority($record->level);\n        $extra['structured-data'] = self::NILVALUE;\n\n        return $extra;\n    }\n\n    private static function calculatePriority(Level $level): int\n    {\n        return (self::SYSLOG_FACILITY_USER * 8) + $level->toRFC5424Level();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\n\n/**\n * Serializes a log message according to Wildfire's header requirements\n *\n * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com>\n * @author Christophe Coevoet <stof@notk.org>\n * @author Kirill chEbba Chebunin <iam@chebba.org>\n */\nclass WildfireFormatter extends NormalizerFormatter\n{\n    /**\n     * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format\n     *\n     * @throws \\RuntimeException If the function json_encode does not exist\n     */\n    public function __construct(?string $dateFormat = null)\n    {\n        parent::__construct($dateFormat);\n\n        // http headers do not like non-ISO-8559-1 characters\n        $this->removeJsonEncodeOption(JSON_UNESCAPED_UNICODE);\n    }\n\n    /**\n     * Translates Monolog log levels to Wildfire levels.\n     *\n     * @return 'LOG'|'INFO'|'WARN'|'ERROR'\n     */\n    private function toWildfireLevel(Level $level): string\n    {\n        return match ($level) {\n            Level::Debug     => 'LOG',\n            Level::Info      => 'INFO',\n            Level::Notice    => 'INFO',\n            Level::Warning   => 'WARN',\n            Level::Error     => 'ERROR',\n            Level::Critical  => 'ERROR',\n            Level::Alert     => 'ERROR',\n            Level::Emergency => 'ERROR',\n        };\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function format(LogRecord $record): string\n    {\n        // Retrieve the line and file if set and remove them from the formatted extra\n        $file = $line = '';\n        if (isset($record->extra['file'])) {\n            $file = $record->extra['file'];\n            unset($record->extra['file']);\n        }\n        if (isset($record->extra['line'])) {\n            $line = $record->extra['line'];\n            unset($record->extra['line']);\n        }\n\n        $message = ['message' => $record->message];\n        $handleError = false;\n        if (count($record->context) > 0) {\n            $message['context'] = $this->normalize($record->context);\n            $handleError = true;\n        }\n        if (count($record->extra) > 0) {\n            $message['extra'] = $this->normalize($record->extra);\n            $handleError = true;\n        }\n        if (count($message) === 1) {\n            $message = reset($message);\n        }\n\n        if (is_array($message) && isset($message['context']['table'])) {\n            $type  = 'TABLE';\n            $label = $record->channel .': '. $record->message;\n            $message = $message['context']['table'];\n        } else {\n            $type  = $this->toWildfireLevel($record->level);\n            $label = $record->channel;\n        }\n\n        // Create JSON object describing the appearance of the message in the console\n        $json = $this->toJson([\n            [\n                'Type'  => $type,\n                'File'  => $file,\n                'Line'  => $line,\n                'Label' => $label,\n            ],\n            $message,\n        ], $handleError);\n\n        // The message itself is a serialization of the above JSON object + it's length\n        return sprintf(\n            '%d|%s|',\n            strlen($json),\n            $json\n        );\n    }\n\n    /**\n     * @inheritDoc\n     *\n     * @phpstan-return never\n     */\n    public function formatBatch(array $records)\n    {\n        throw new \\BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter');\n    }\n\n    /**\n     * @inheritDoc\n     *\n     * @return null|scalar|array<mixed[]|scalar|null>|object\n     */\n    protected function normalize(mixed $data, int $depth = 0): mixed\n    {\n        if (is_object($data) && !$data instanceof \\DateTimeInterface) {\n            return $data;\n        }\n\n        return parent::normalize($data, $depth);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Monolog\\ResettableInterface;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\LogRecord;\n\n/**\n * Base Handler class providing basic level/bubble support\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nabstract class AbstractHandler extends Handler implements ResettableInterface\n{\n    protected Level $level = Level::Debug;\n    protected bool $bubble = true;\n\n    /**\n     * @param int|string|Level|LogLevel::* $level  The minimum logging level at which this handler will be triggered\n     * @param bool                                   $bubble Whether the messages that are handled can bubble up the stack or not\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public function __construct(int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        $this->setLevel($level);\n        $this->bubble = $bubble;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function isHandling(LogRecord $record): bool\n    {\n        return $record->level->value >= $this->level->value;\n    }\n\n    /**\n     * Sets minimum logging level at which this handler will be triggered.\n     *\n     * @param Level|LogLevel::* $level Level or level name\n     * @return $this\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public function setLevel(int|string|Level $level): self\n    {\n        $this->level = Logger::toMonologLevel($level);\n\n        return $this;\n    }\n\n    /**\n     * Gets minimum logging level at which this handler will be triggered.\n     */\n    public function getLevel(): Level\n    {\n        return $this->level;\n    }\n\n    /**\n     * Sets the bubbling behavior.\n     *\n     * @param bool $bubble true means that this handler allows bubbling.\n     *                     false means that bubbling is not permitted.\n     * @return $this\n     */\n    public function setBubble(bool $bubble): self\n    {\n        $this->bubble = $bubble;\n\n        return $this;\n    }\n\n    /**\n     * Gets the bubbling behavior.\n     *\n     * @return bool true means that this handler allows bubbling.\n     *              false means that bubbling is not permitted.\n     */\n    public function getBubble(): bool\n    {\n        return $this->bubble;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function reset(): void\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\LogRecord;\n\n/**\n * Base Handler class providing the Handler structure, including processors and formatters\n *\n * Classes extending it should (in most cases) only implement write($record)\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @author Christophe Coevoet <stof@notk.org>\n */\nabstract class AbstractProcessingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface\n{\n    use ProcessableHandlerTrait;\n    use FormattableHandlerTrait;\n\n    /**\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        if (!$this->isHandling($record)) {\n            return false;\n        }\n\n        if (\\count($this->processors) > 0) {\n            $record = $this->processRecord($record);\n        }\n\n        $record->formatted = $this->getFormatter()->format($record);\n\n        $this->write($record);\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * Writes the (already formatted) record down to the log of the implementing handler\n     */\n    abstract protected function write(LogRecord $record): void;\n\n    public function reset(): void\n    {\n        parent::reset();\n\n        $this->resetProcessors();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\LineFormatter;\n\n/**\n * Common syslog functionality\n */\nabstract class AbstractSyslogHandler extends AbstractProcessingHandler\n{\n    protected int $facility;\n\n    /**\n     * List of valid log facility names.\n     * @var array<string, int>\n     */\n    protected array $facilities = [\n        'auth'     => \\LOG_AUTH,\n        'authpriv' => \\LOG_AUTHPRIV,\n        'cron'     => \\LOG_CRON,\n        'daemon'   => \\LOG_DAEMON,\n        'kern'     => \\LOG_KERN,\n        'lpr'      => \\LOG_LPR,\n        'mail'     => \\LOG_MAIL,\n        'news'     => \\LOG_NEWS,\n        'syslog'   => \\LOG_SYSLOG,\n        'user'     => \\LOG_USER,\n        'uucp'     => \\LOG_UUCP,\n    ];\n\n    /**\n     * Translates Monolog log levels to syslog log priorities.\n     */\n    protected function toSyslogPriority(Level $level): int\n    {\n        return $level->toRFC5424Level();\n    }\n\n    /**\n     * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant\n     */\n    public function __construct(string|int $facility = \\LOG_USER, int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        if (!defined('PHP_WINDOWS_VERSION_BUILD')) {\n            $this->facilities['local0'] = \\LOG_LOCAL0;\n            $this->facilities['local1'] = \\LOG_LOCAL1;\n            $this->facilities['local2'] = \\LOG_LOCAL2;\n            $this->facilities['local3'] = \\LOG_LOCAL3;\n            $this->facilities['local4'] = \\LOG_LOCAL4;\n            $this->facilities['local5'] = \\LOG_LOCAL5;\n            $this->facilities['local6'] = \\LOG_LOCAL6;\n            $this->facilities['local7'] = \\LOG_LOCAL7;\n        } else {\n            $this->facilities['local0'] = 128; // LOG_LOCAL0\n            $this->facilities['local1'] = 136; // LOG_LOCAL1\n            $this->facilities['local2'] = 144; // LOG_LOCAL2\n            $this->facilities['local3'] = 152; // LOG_LOCAL3\n            $this->facilities['local4'] = 160; // LOG_LOCAL4\n            $this->facilities['local5'] = 168; // LOG_LOCAL5\n            $this->facilities['local6'] = 176; // LOG_LOCAL6\n            $this->facilities['local7'] = 184; // LOG_LOCAL7\n        }\n\n        // convert textual description of facility to syslog constant\n        if (is_string($facility) && array_key_exists(strtolower($facility), $this->facilities)) {\n            $facility = $this->facilities[strtolower($facility)];\n        } elseif (!in_array($facility, array_values($this->facilities), true)) {\n            throw new \\UnexpectedValueException('Unknown facility value \"'.$facility.'\" given');\n        }\n\n        $this->facility = $facility;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new LineFormatter('%channel%.%level_name%: %message% %context% %extra%');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Gelf\\Message as GelfMessage;\nuse Monolog\\Level;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\JsonFormatter;\nuse PhpAmqpLib\\Message\\AMQPMessage;\nuse PhpAmqpLib\\Channel\\AMQPChannel;\nuse AMQPExchange;\nuse Monolog\\LogRecord;\n\nclass AmqpHandler extends AbstractProcessingHandler\n{\n    protected AMQPExchange|AMQPChannel $exchange;\n\n    /** @var array<string, mixed> */\n    private array $extraAttributes = [];\n\n    protected string $exchangeName;\n\n    /**\n     * @param AMQPExchange|AMQPChannel $exchange     AMQPExchange (php AMQP ext) or PHP AMQP lib channel, ready for use\n     * @param string|null              $exchangeName Optional exchange name, for AMQPChannel (PhpAmqpLib) only\n     */\n    public function __construct(AMQPExchange|AMQPChannel $exchange, ?string $exchangeName = null, int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        if ($exchange instanceof AMQPChannel) {\n            $this->exchangeName = (string) $exchangeName;\n        } elseif ($exchangeName !== null) {\n            @trigger_error('The $exchangeName parameter can only be passed when using PhpAmqpLib, if using an AMQPExchange instance configure it beforehand', E_USER_DEPRECATED);\n        }\n        $this->exchange = $exchange;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * @return array<string, mixed>\n     */\n    public function getExtraAttributes(): array\n    {\n        return $this->extraAttributes;\n    }\n\n    /**\n     * Configure extra attributes to pass to the AMQPExchange (if you are using the amqp extension)\n     *\n     * @param array<string, mixed> $extraAttributes  One of content_type, content_encoding,\n     *                                               message_id, user_id, app_id, delivery_mode,\n     *                                               priority, timestamp, expiration, type\n     *                                               or reply_to, headers.\n     * @return $this\n     */\n    public function setExtraAttributes(array $extraAttributes): self\n    {\n        $this->extraAttributes = $extraAttributes;\n        return $this;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $data = $record->formatted;\n        $routingKey = $this->getRoutingKey($record);\n\n        if($data instanceof GelfMessage) {\n            $data = json_encode($data->toArray());\n        }\n\n        if ($this->exchange instanceof AMQPExchange) {\n            $attributes = [\n                'delivery_mode' => 2,\n                'content_type'  => 'application/json',\n            ];\n            if (\\count($this->extraAttributes) > 0) {\n                $attributes = array_merge($attributes, $this->extraAttributes);\n            }\n            $this->exchange->publish(\n                $data,\n                $routingKey,\n                0,\n                $attributes\n            );\n        } else {\n            $this->exchange->basic_publish(\n                $this->createAmqpMessage($data),\n                $this->exchangeName,\n                $routingKey\n            );\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        if ($this->exchange instanceof AMQPExchange) {\n            parent::handleBatch($records);\n\n            return;\n        }\n\n        foreach ($records as $record) {\n            if (!$this->isHandling($record)) {\n                continue;\n            }\n\n            $record = $this->processRecord($record);\n            $data = $this->getFormatter()->format($record);\n\n            if($data instanceof GelfMessage) {\n                $data = json_encode($data->toArray());\n            }\n\n            $this->exchange->batch_basic_publish(\n                $this->createAmqpMessage($data),\n                $this->exchangeName,\n                $this->getRoutingKey($record)\n            );\n        }\n\n        $this->exchange->publish_batch();\n    }\n\n    /**\n     * Gets the routing key for the AMQP exchange\n     */\n    protected function getRoutingKey(LogRecord $record): string\n    {\n        $routingKey = sprintf('%s.%s', $record->level->name, $record->channel);\n\n        return strtolower($routingKey);\n    }\n\n    private function createAmqpMessage(string $data): AMQPMessage\n    {\n        $attributes = [\n            'delivery_mode' => 2,\n            'content_type' => 'application/json',\n        ];\n        if (\\count($this->extraAttributes) > 0) {\n            $attributes = array_merge($attributes, $this->extraAttributes);\n        }\n        return new AMQPMessage($data, $attributes);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\nuse Monolog\\Level;\n\nuse function count;\nuse function headers_list;\nuse function stripos;\n\n/**\n * Handler sending logs to browser's javascript console with no browser extension required\n *\n * @author Olivier Poitrey <rs@dailymotion.com>\n */\nclass BrowserConsoleHandler extends AbstractProcessingHandler\n{\n    protected static bool $initialized = false;\n\n    /** @var LogRecord[] */\n    protected static array $records = [];\n\n    protected const FORMAT_HTML = 'html';\n    protected const FORMAT_JS = 'js';\n    protected const FORMAT_UNKNOWN = 'unknown';\n\n    /**\n     * @inheritDoc\n     *\n     * Formatted output may contain some formatting markers to be transferred to `console.log` using the %c format.\n     *\n     * Example of formatted string:\n     *\n     *     You can do [[blue text]]{color: blue} or [[green background]]{background-color: green; color: white}\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new LineFormatter('[[%channel%]]{macro: autolabel} [[%level_name%]]{font-weight: bold} %message%');\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        // Accumulate records\n        static::$records[] = $record;\n\n        // Register shutdown handler if not already done\n        if (!static::$initialized) {\n            static::$initialized = true;\n            $this->registerShutdownFunction();\n        }\n    }\n\n    /**\n     * Convert records to javascript console commands and send it to the browser.\n     * This method is automatically called on PHP shutdown if output is HTML or Javascript.\n     */\n    public static function send(): void\n    {\n        $format = static::getResponseFormat();\n        if ($format === self::FORMAT_UNKNOWN) {\n            return;\n        }\n\n        if (count(static::$records) > 0) {\n            if ($format === self::FORMAT_HTML) {\n                static::writeOutput('<script>' . self::generateScript() . '</script>');\n            } else { // js format\n                static::writeOutput(self::generateScript());\n            }\n            static::resetStatic();\n        }\n    }\n\n    public function close(): void\n    {\n        self::resetStatic();\n    }\n\n    public function reset(): void\n    {\n        parent::reset();\n\n        self::resetStatic();\n    }\n\n    /**\n     * Forget all logged records\n     */\n    public static function resetStatic(): void\n    {\n        static::$records = [];\n    }\n\n    /**\n     * Wrapper for register_shutdown_function to allow overriding\n     */\n    protected function registerShutdownFunction(): void\n    {\n        if (PHP_SAPI !== 'cli') {\n            register_shutdown_function(['Monolog\\Handler\\BrowserConsoleHandler', 'send']);\n        }\n    }\n\n    /**\n     * Wrapper for echo to allow overriding\n     */\n    protected static function writeOutput(string $str): void\n    {\n        echo $str;\n    }\n\n    /**\n     * Checks the format of the response\n     *\n     * If Content-Type is set to application/javascript or text/javascript -> js\n     * If Content-Type is set to text/html, or is unset -> html\n     * If Content-Type is anything else -> unknown\n     *\n     * @return string One of 'js', 'html' or 'unknown'\n     * @phpstan-return self::FORMAT_*\n     */\n    protected static function getResponseFormat(): string\n    {\n        // Check content type\n        foreach (headers_list() as $header) {\n            if (stripos($header, 'content-type:') === 0) {\n                return static::getResponseFormatFromContentType($header);\n            }\n        }\n\n        return self::FORMAT_HTML;\n    }\n\n    /**\n     * @return string One of 'js', 'html' or 'unknown'\n     * @phpstan-return self::FORMAT_*\n     */\n    protected static function getResponseFormatFromContentType(string $contentType): string\n    {\n        // This handler only works with HTML and javascript outputs\n        // text/javascript is obsolete in favour of application/javascript, but still used\n        if (stripos($contentType, 'application/javascript') !== false || stripos($contentType, 'text/javascript') !== false) {\n            return self::FORMAT_JS;\n        }\n\n        if (stripos($contentType, 'text/html') !== false) {\n            return self::FORMAT_HTML;\n        }\n\n        return self::FORMAT_UNKNOWN;\n    }\n\n    private static function generateScript(): string\n    {\n        $script = [];\n        foreach (static::$records as $record) {\n            $context = self::dump('Context', $record->context);\n            $extra = self::dump('Extra', $record->extra);\n\n            if (\\count($context) === 0 && \\count($extra) === 0) {\n                $script[] = self::call_array(self::getConsoleMethodForLevel($record->level), self::handleStyles($record->formatted));\n            } else {\n                $script = array_merge(\n                    $script,\n                    [self::call_array('groupCollapsed', self::handleStyles($record->formatted))],\n                    $context,\n                    $extra,\n                    [self::call('groupEnd')]\n                );\n            }\n        }\n\n        return \"(function (c) {if (c && c.groupCollapsed) {\\n\" . implode(\"\\n\", $script) . \"\\n}})(console);\";\n    }\n\n    private static function getConsoleMethodForLevel(Level $level): string\n    {\n        return match ($level) {\n            Level::Debug => 'debug',\n            Level::Info, Level::Notice => 'info',\n            Level::Warning => 'warn',\n            Level::Error, Level::Critical, Level::Alert, Level::Emergency => 'error',\n        };\n    }\n\n    /**\n     * @return string[]\n     */\n    private static function handleStyles(string $formatted): array\n    {\n        $args = [];\n        $format = '%c' . $formatted;\n        preg_match_all('/\\[\\[(.*?)\\]\\]\\{([^}]*)\\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);\n\n        foreach (array_reverse($matches) as $match) {\n            $args[] = '\"font-weight: normal\"';\n            $args[] = self::quote(self::handleCustomStyles($match[2][0], $match[1][0]));\n\n            $pos = $match[0][1];\n            $format = Utils::substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . Utils::substr($format, $pos + strlen($match[0][0]));\n        }\n\n        $args[] = self::quote('font-weight: normal');\n        $args[] = self::quote($format);\n\n        return array_reverse($args);\n    }\n\n    private static function handleCustomStyles(string $style, string $string): string\n    {\n        static $colors = ['blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey'];\n        static $labels = [];\n\n        $style = preg_replace_callback('/macro\\s*:(.*?)(?:;|$)/', function (array $m) use ($string, &$colors, &$labels) {\n            if (trim($m[1]) === 'autolabel') {\n                // Format the string as a label with consistent auto assigned background color\n                if (!isset($labels[$string])) {\n                    $labels[$string] = $colors[count($labels) % count($colors)];\n                }\n                $color = $labels[$string];\n\n                return \"background-color: $color; color: white; border-radius: 3px; padding: 0 2px 0 2px\";\n            }\n\n            return $m[1];\n        }, $style);\n\n        if (null === $style) {\n            $pcreErrorCode = preg_last_error();\n\n            throw new \\RuntimeException('Failed to run preg_replace_callback: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode));\n        }\n\n        return $style;\n    }\n\n    /**\n     * @param  mixed[] $dict\n     * @return mixed[]\n     */\n    private static function dump(string $title, array $dict): array\n    {\n        $script = [];\n        $dict = array_filter($dict);\n        if (\\count($dict) === 0) {\n            return $script;\n        }\n        $script[] = self::call('log', self::quote('%c%s'), self::quote('font-weight: bold'), self::quote($title));\n        foreach ($dict as $key => $value) {\n            $value = json_encode($value);\n            if (false === $value) {\n                $value = self::quote('');\n            }\n            $script[] = self::call('log', self::quote('%s: %o'), self::quote((string) $key), $value);\n        }\n\n        return $script;\n    }\n\n    private static function quote(string $arg): string\n    {\n        return '\"' . addcslashes($arg, \"\\\"\\n\\\\\") . '\"';\n    }\n\n    /**\n     * @param mixed $args\n     */\n    private static function call(...$args): string\n    {\n        $method = array_shift($args);\n        if (!is_string($method)) {\n            throw new \\UnexpectedValueException('Expected the first arg to be a string, got: '.var_export($method, true));\n        }\n\n        return self::call_array($method, $args);\n    }\n\n    /**\n     * @param mixed[] $args\n     */\n    private static function call_array(string $method, array $args): string\n    {\n        return 'c.' . $method . '(' . implode(', ', $args) . ');';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\ResettableInterface;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Buffers all records until closing the handler and then pass them as batch.\n *\n * This is useful for a MailHandler to send only one mail per request instead of\n * sending one per log message.\n *\n * @author Christophe Coevoet <stof@notk.org>\n */\nclass BufferHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface\n{\n    use ProcessableHandlerTrait;\n\n    protected HandlerInterface $handler;\n\n    protected int $bufferSize = 0;\n\n    protected int $bufferLimit;\n\n    protected bool $flushOnOverflow;\n\n    /** @var LogRecord[] */\n    protected array $buffer = [];\n\n    protected bool $initialized = false;\n\n    /**\n     * @param HandlerInterface $handler         Handler.\n     * @param int              $bufferLimit     How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.\n     * @param bool             $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded\n     */\n    public function __construct(HandlerInterface $handler, int $bufferLimit = 0, int|string|Level $level = Level::Debug, bool $bubble = true, bool $flushOnOverflow = false)\n    {\n        parent::__construct($level, $bubble);\n        $this->handler = $handler;\n        $this->bufferLimit = $bufferLimit;\n        $this->flushOnOverflow = $flushOnOverflow;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        if ($record->level->isLowerThan($this->level)) {\n            return false;\n        }\n\n        if (!$this->initialized) {\n            // __destructor() doesn't get called on Fatal errors\n            register_shutdown_function([$this, 'close']);\n            $this->initialized = true;\n        }\n\n        if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) {\n            if ($this->flushOnOverflow) {\n                $this->flush();\n            } else {\n                array_shift($this->buffer);\n                $this->bufferSize--;\n            }\n        }\n\n        if (\\count($this->processors) > 0) {\n            $record = $this->processRecord($record);\n        }\n\n        $this->buffer[] = $record;\n        $this->bufferSize++;\n\n        return false === $this->bubble;\n    }\n\n    public function flush(): void\n    {\n        if ($this->bufferSize === 0) {\n            return;\n        }\n\n        $this->handler->handleBatch($this->buffer);\n        $this->clear();\n    }\n\n    public function __destruct()\n    {\n        // suppress the parent behavior since we already have register_shutdown_function()\n        // to call close(), and the reference contained there will prevent this from being\n        // GC'd until the end of the request\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function close(): void\n    {\n        $this->flush();\n\n        $this->handler->close();\n    }\n\n    /**\n     * Clears the buffer without flushing any messages down to the wrapped handler.\n     */\n    public function clear(): void\n    {\n        $this->bufferSize = 0;\n        $this->buffer = [];\n    }\n\n    public function reset(): void\n    {\n        $this->flush();\n\n        parent::reset();\n\n        $this->resetProcessors();\n\n        if ($this->handler instanceof ResettableInterface) {\n            $this->handler->reset();\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        if ($this->handler instanceof FormattableHandlerInterface) {\n            $this->handler->setFormatter($formatter);\n\n            return $this;\n        }\n\n        throw new \\UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.');\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function getFormatter(): FormatterInterface\n    {\n        if ($this->handler instanceof FormattableHandlerInterface) {\n            return $this->handler->getFormatter();\n        }\n\n        throw new \\UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\ChromePHPFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\nuse Monolog\\DateTimeImmutable;\n\n/**\n * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/)\n *\n * This also works out of the box with Firefox 43+\n *\n * @author Christophe Coevoet <stof@notk.org>\n */\nclass ChromePHPHandler extends AbstractProcessingHandler\n{\n    use WebRequestRecognizerTrait;\n\n    /**\n     * Version of the extension\n     */\n    protected const VERSION = '4.0';\n\n    /**\n     * Header name\n     */\n    protected const HEADER_NAME = 'X-ChromeLogger-Data';\n\n    /**\n     * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+)\n     */\n    protected const USER_AGENT_REGEX = '{\\b(?:Chrome/\\d+(?:\\.\\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\\d|\\d{3,})(?:\\.\\d)*)\\b}';\n\n    protected static bool $initialized = false;\n\n    /**\n     * Tracks whether we sent too much data\n     *\n     * Chrome limits the headers to 4KB, so when we sent 3KB we stop sending\n     */\n    protected static bool $overflowed = false;\n\n    /** @var mixed[] */\n    protected static array $json = [\n        'version' => self::VERSION,\n        'columns' => ['label', 'log', 'backtrace', 'type'],\n        'rows' => [],\n    ];\n\n    protected static bool $sendHeaders = true;\n\n    /**\n     * @throws \\RuntimeException If the function json_encode does not exist\n     */\n    public function __construct(int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n        if (!function_exists('json_encode')) {\n            throw new \\RuntimeException('PHP\\'s json extension is required to use Monolog\\'s ChromePHPHandler');\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        if (!$this->isWebRequest()) {\n            return;\n        }\n\n        $messages = [];\n\n        foreach ($records as $record) {\n            if ($record->level < $this->level) {\n                continue;\n            }\n\n            $message = $this->processRecord($record);\n            $messages[] = $message;\n        }\n\n        if (\\count($messages) > 0) {\n            $messages = $this->getFormatter()->formatBatch($messages);\n            self::$json['rows'] = array_merge(self::$json['rows'], $messages);\n            $this->send();\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new ChromePHPFormatter();\n    }\n\n    /**\n     * Creates & sends header for a record\n     *\n     * @see sendHeader()\n     * @see send()\n     */\n    protected function write(LogRecord $record): void\n    {\n        if (!$this->isWebRequest()) {\n            return;\n        }\n\n        self::$json['rows'][] = $record->formatted;\n\n        $this->send();\n    }\n\n    /**\n     * Sends the log header\n     *\n     * @see sendHeader()\n     */\n    protected function send(): void\n    {\n        if (self::$overflowed || !self::$sendHeaders) {\n            return;\n        }\n\n        if (!self::$initialized) {\n            self::$initialized = true;\n\n            self::$sendHeaders = $this->headersAccepted();\n            if (!self::$sendHeaders) {\n                return;\n            }\n\n            self::$json['request_uri'] = $_SERVER['REQUEST_URI'] ?? '';\n        }\n\n        $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true);\n        $data = base64_encode($json);\n        if (strlen($data) > 3 * 1024) {\n            self::$overflowed = true;\n\n            $record = new LogRecord(\n                message: 'Incomplete logs, chrome header size limit reached',\n                level: Level::Warning,\n                channel: 'monolog',\n                datetime: new DateTimeImmutable(true),\n            );\n            self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record);\n            $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true);\n            $data = base64_encode($json);\n        }\n\n        if (trim($data) !== '') {\n            $this->sendHeader(static::HEADER_NAME, $data);\n        }\n    }\n\n    /**\n     * Send header string to the client\n     */\n    protected function sendHeader(string $header, string $content): void\n    {\n        if (!headers_sent() && self::$sendHeaders) {\n            header(sprintf('%s: %s', $header, $content));\n        }\n    }\n\n    /**\n     * Verifies if the headers are accepted by the current user agent\n     */\n    protected function headersAccepted(): bool\n    {\n        if (!isset($_SERVER['HTTP_USER_AGENT'])) {\n            return false;\n        }\n\n        return preg_match(static::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']) === 1;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\JsonFormatter;\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\n\n/**\n * CouchDB handler\n *\n * @author Markus Bachmann <markus.bachmann@bachi.biz>\n * @phpstan-type Options array{\n *     host: string,\n *     port: int,\n *     dbname: string,\n *     username: string|null,\n *     password: string|null\n * }\n * @phpstan-type InputOptions array{\n *     host?: string,\n *     port?: int,\n *     dbname?: string,\n *     username?: string|null,\n *     password?: string|null\n * }\n */\nclass CouchDBHandler extends AbstractProcessingHandler\n{\n    /**\n     * @var mixed[]\n     * @phpstan-var Options\n     */\n    private array $options;\n\n    /**\n     * @param mixed[] $options\n     *\n     * @phpstan-param InputOptions $options\n     */\n    public function __construct(array $options = [], int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        $this->options = array_merge([\n            'host'     => 'localhost',\n            'port'     => 5984,\n            'dbname'   => 'logger',\n            'username' => null,\n            'password' => null,\n        ], $options);\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $basicAuth = null;\n        if (null !== $this->options['username'] && null !== $this->options['password']) {\n            $basicAuth = sprintf('%s:%s@', $this->options['username'], $this->options['password']);\n        }\n\n        $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname'];\n        $context = stream_context_create([\n            'http' => [\n                'method'        => 'POST',\n                'content'       => $record->formatted,\n                'ignore_errors' => true,\n                'max_redirects' => 0,\n                'header'        => 'Content-type: application/json',\n            ],\n        ]);\n\n        if (false === @file_get_contents($url, false, $context)) {\n            throw new \\RuntimeException(sprintf('Could not connect to %s', $url));\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Logs to Cube.\n *\n * @link https://github.com/square/cube/wiki\n * @author Wan Chen <kami@kamisama.me>\n * @deprecated Since 2.8.0 and 3.2.0, Cube appears abandoned and thus we will drop this handler in Monolog 4\n */\nclass CubeHandler extends AbstractProcessingHandler\n{\n    private ?\\Socket $udpConnection = null;\n    private ?\\CurlHandle $httpConnection = null;\n    private string $scheme;\n    private string $host;\n    private int $port;\n    /** @var string[] */\n    private array $acceptedSchemes = ['http', 'udp'];\n\n    /**\n     * Create a Cube handler\n     *\n     * @throws \\UnexpectedValueException when given url is not a valid url.\n     *                                   A valid url must consist of three parts : protocol://host:port\n     *                                   Only valid protocols used by Cube are http and udp\n     */\n    public function __construct(string $url, int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        $urlInfo = parse_url($url);\n\n        if ($urlInfo === false || !isset($urlInfo['scheme'], $urlInfo['host'], $urlInfo['port'])) {\n            throw new \\UnexpectedValueException('URL \"'.$url.'\" is not valid');\n        }\n\n        if (!in_array($urlInfo['scheme'], $this->acceptedSchemes, true)) {\n            throw new \\UnexpectedValueException(\n                'Invalid protocol (' . $urlInfo['scheme']  . ').'\n                . ' Valid options are ' . implode(', ', $this->acceptedSchemes)\n            );\n        }\n\n        $this->scheme = $urlInfo['scheme'];\n        $this->host = $urlInfo['host'];\n        $this->port = $urlInfo['port'];\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * Establish a connection to an UDP socket\n     *\n     * @throws \\LogicException           when unable to connect to the socket\n     * @throws MissingExtensionException when there is no socket extension\n     */\n    protected function connectUdp(): void\n    {\n        if (!extension_loaded('sockets')) {\n            throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler');\n        }\n\n        $udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0);\n        if (false === $udpConnection) {\n            throw new \\LogicException('Unable to create a socket');\n        }\n\n        $this->udpConnection = $udpConnection;\n        if (!socket_connect($this->udpConnection, $this->host, $this->port)) {\n            throw new \\LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port);\n        }\n    }\n\n    /**\n     * Establish a connection to an http server\n     *\n     * @throws \\LogicException           when unable to connect to the socket\n     * @throws MissingExtensionException when no curl extension\n     */\n    protected function connectHttp(): void\n    {\n        if (!extension_loaded('curl')) {\n            throw new MissingExtensionException('The curl extension is required to use http URLs with the CubeHandler');\n        }\n\n        $httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put');\n        if (false === $httpConnection) {\n            throw new \\LogicException('Unable to connect to ' . $this->host . ':' . $this->port);\n        }\n\n        $this->httpConnection = $httpConnection;\n        curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, \"POST\");\n        curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $date = $record->datetime;\n\n        $data = ['time' => $date->format('Y-m-d\\TH:i:s.uO')];\n        $context = $record->context;\n\n        if (isset($context['type'])) {\n            $data['type'] = $context['type'];\n            unset($context['type']);\n        } else {\n            $data['type'] = $record->channel;\n        }\n\n        $data['data'] = $context;\n        $data['data']['level'] = $record->level;\n\n        if ($this->scheme === 'http') {\n            $this->writeHttp(Utils::jsonEncode($data));\n        } else {\n            $this->writeUdp(Utils::jsonEncode($data));\n        }\n    }\n\n    private function writeUdp(string $data): void\n    {\n        if (null === $this->udpConnection) {\n            $this->connectUdp();\n        }\n\n        if (null === $this->udpConnection) {\n            throw new \\LogicException('No UDP socket could be opened');\n        }\n\n        socket_send($this->udpConnection, $data, strlen($data), 0);\n    }\n\n    private function writeHttp(string $data): void\n    {\n        if (null === $this->httpConnection) {\n            $this->connectHttp();\n        }\n\n        if (null === $this->httpConnection) {\n            throw new \\LogicException('No connection could be established');\n        }\n\n        curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']');\n        curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, [\n            'Content-Type: application/json',\n            'Content-Length: ' . strlen('['.$data.']'),\n        ]);\n\n        Curl\\Util::execute($this->httpConnection, 5, false);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\Curl;\n\nuse CurlHandle;\n\n/**\n * This class is marked as internal and it is not under the BC promise of the package.\n *\n * @internal\n */\nfinal class Util\n{\n    /** @var array<int> */\n    private static array $retriableErrorCodes = [\n        CURLE_COULDNT_RESOLVE_HOST,\n        CURLE_COULDNT_CONNECT,\n        CURLE_HTTP_NOT_FOUND,\n        CURLE_READ_ERROR,\n        CURLE_OPERATION_TIMEOUTED,\n        CURLE_HTTP_POST_ERROR,\n        CURLE_SSL_CONNECT_ERROR,\n    ];\n\n    /**\n     * Executes a CURL request with optional retries and exception on failure\n     *\n     * @param  CurlHandle  $ch curl handler\n     * @return bool|string @see curl_exec\n     */\n    public static function execute(CurlHandle $ch, int $retries = 5, bool $closeAfterDone = true)\n    {\n        while ($retries--) {\n            $curlResponse = curl_exec($ch);\n            if ($curlResponse === false) {\n                $curlErrno = curl_errno($ch);\n\n                if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || $retries === 0) {\n                    $curlError = curl_error($ch);\n\n                    if ($closeAfterDone) {\n                        curl_close($ch);\n                    }\n\n                    throw new \\RuntimeException(sprintf('Curl error (code %d): %s', $curlErrno, $curlError));\n                }\n\n                continue;\n            }\n\n            if ($closeAfterDone) {\n                curl_close($ch);\n            }\n\n            return $curlResponse;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\LogRecord;\n\n/**\n * Simple handler wrapper that deduplicates log records across multiple requests\n *\n * It also includes the BufferHandler functionality and will buffer\n * all messages until the end of the request or flush() is called.\n *\n * This works by storing all log records' messages above $deduplicationLevel\n * to the file specified by $deduplicationStore. When further logs come in at the end of the\n * request (or when flush() is called), all those above $deduplicationLevel are checked\n * against the existing stored logs. If they match and the timestamps in the stored log is\n * not older than $time seconds, the new log record is discarded. If no log record is new, the\n * whole data set is discarded.\n *\n * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers\n * that send messages to people, to avoid spamming with the same message over and over in case of\n * a major component failure like a database server being down which makes all requests fail in the\n * same way.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass DeduplicationHandler extends BufferHandler\n{\n    protected string $deduplicationStore;\n\n    protected Level $deduplicationLevel;\n\n    protected int $time;\n    protected bool $gc = false;\n\n    /**\n     * @param HandlerInterface                       $handler            Handler.\n     * @param string|null                            $deduplicationStore The file/path where the deduplication log should be kept\n     * @param int|string|Level|LogLevel::* $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes\n     * @param int                                    $time               The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through\n     * @param bool                                   $bubble             Whether the messages that are handled can bubble up the stack or not\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $deduplicationLevel\n     */\n    public function __construct(HandlerInterface $handler, ?string $deduplicationStore = null, int|string|Level $deduplicationLevel = Level::Error, int $time = 60, bool $bubble = true)\n    {\n        parent::__construct($handler, 0, Level::Debug, $bubble, false);\n\n        $this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore;\n        $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel);\n        $this->time = $time;\n    }\n\n    public function flush(): void\n    {\n        if ($this->bufferSize === 0) {\n            return;\n        }\n\n        $store = null;\n\n        if (file_exists($this->deduplicationStore)) {\n            $store = file($this->deduplicationStore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);\n        }\n\n        $passthru = null;\n\n        foreach ($this->buffer as $record) {\n            if ($record->level->value >= $this->deduplicationLevel->value) {\n                $passthru = $passthru === true || !is_array($store) || !$this->isDuplicate($store, $record);\n                if ($passthru) {\n                    $line = $this->buildDeduplicationStoreEntry($record);\n                    file_put_contents($this->deduplicationStore, $line . \"\\n\", FILE_APPEND);\n                    if (!is_array($store)) {\n                        $store = [];\n                    }\n                    $store[] = $line;\n                }\n            }\n        }\n\n        // default of null is valid as well as if no record matches duplicationLevel we just pass through\n        if ($passthru === true || $passthru === null) {\n            $this->handler->handleBatch($this->buffer);\n        }\n\n        $this->clear();\n\n        if ($this->gc) {\n            $this->collectLogs();\n        }\n    }\n\n    /**\n     * If there is a store entry older than e.g. a day, this method should set `$this->gc` to `true` to trigger garbage collection.\n     * @param string[] $store The deduplication store\n     */\n    protected function isDuplicate(array $store, LogRecord $record): bool\n    {\n        $timestampValidity = $record->datetime->getTimestamp() - $this->time;\n        $expectedMessage = preg_replace('{[\\r\\n].*}', '', $record->message);\n        $yesterday = time() - 86400;\n\n        for ($i = count($store) - 1; $i >= 0; $i--) {\n            list($timestamp, $level, $message) = explode(':', $store[$i], 3);\n\n            if ($level === $record->level->getName() && $message === $expectedMessage && $timestamp > $timestampValidity) {\n                return true;\n            }\n\n            if ($timestamp < $yesterday) {\n                $this->gc = true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * @return string The given record serialized as a single line of text\n     */\n    protected function buildDeduplicationStoreEntry(LogRecord $record): string\n    {\n        return $record->datetime->getTimestamp() . ':' . $record->level->getName() . ':' . preg_replace('{[\\r\\n].*}', '', $record->message);\n    }\n\n    private function collectLogs(): void\n    {\n        if (!file_exists($this->deduplicationStore)) {\n            return;\n        }\n\n        $handle = fopen($this->deduplicationStore, 'rw+');\n\n        if (false === $handle) {\n            throw new \\RuntimeException('Failed to open file for reading and writing: ' . $this->deduplicationStore);\n        }\n\n        flock($handle, LOCK_EX);\n        $validLogs = [];\n\n        $timestampValidity = time() - $this->time;\n\n        while (!feof($handle)) {\n            $log = fgets($handle);\n            if (is_string($log) && '' !== $log && substr($log, 0, 10) >= $timestampValidity) {\n                $validLogs[] = $log;\n            }\n        }\n\n        ftruncate($handle, 0);\n        rewind($handle);\n        foreach ($validLogs as $log) {\n            fwrite($handle, $log);\n        }\n\n        flock($handle, LOCK_UN);\n        fclose($handle);\n\n        $this->gc = false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Formatter\\NormalizerFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Doctrine\\CouchDB\\CouchDBClient;\nuse Monolog\\LogRecord;\n\n/**\n * CouchDB handler for Doctrine CouchDB ODM\n *\n * @author Markus Bachmann <markus.bachmann@bachi.biz>\n */\nclass DoctrineCouchDBHandler extends AbstractProcessingHandler\n{\n    private CouchDBClient $client;\n\n    public function __construct(CouchDBClient $client, int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        $this->client = $client;\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $this->client->postDocument($record->formatted);\n    }\n\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new NormalizerFormatter;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Aws\\Sdk;\nuse Aws\\DynamoDb\\DynamoDbClient;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Aws\\DynamoDb\\Marshaler;\nuse Monolog\\Formatter\\ScalarFormatter;\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\n\n/**\n * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/)\n *\n * @link https://github.com/aws/aws-sdk-php/\n * @author Andrew Lawson <adlawson@gmail.com>\n */\nclass DynamoDbHandler extends AbstractProcessingHandler\n{\n    public const DATE_FORMAT = 'Y-m-d\\TH:i:s.uO';\n\n    protected DynamoDbClient $client;\n\n    protected string $table;\n\n    protected Marshaler $marshaler;\n\n    public function __construct(DynamoDbClient $client, string $table, int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        $this->marshaler = new Marshaler;\n\n        $this->client = $client;\n        $this->table = $table;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $filtered = $this->filterEmptyFields($record->formatted);\n        $formatted = $this->marshaler->marshalItem($filtered);\n\n        $this->client->putItem([\n            'TableName' => $this->table,\n            'Item' => $formatted,\n        ]);\n    }\n\n    /**\n     * @param  mixed[] $record\n     * @return mixed[]\n     */\n    protected function filterEmptyFields(array $record): array\n    {\n        return array_filter($record, function ($value) {\n            return [] !== $value;\n        });\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new ScalarFormatter(self::DATE_FORMAT);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Elastica\\Document;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\ElasticaFormatter;\nuse Monolog\\Level;\nuse Elastica\\Client;\nuse Elastica\\Exception\\ExceptionInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Elastic Search handler\n *\n * Usage example:\n *\n *    $client = new \\Elastica\\Client();\n *    $options = array(\n *        'index' => 'elastic_index_name',\n *        'type' => 'elastic_doc_type', Types have been removed in Elastica 7\n *    );\n *    $handler = new ElasticaHandler($client, $options);\n *    $log = new Logger('application');\n *    $log->pushHandler($handler);\n *\n * @author Jelle Vink <jelle.vink@gmail.com>\n * @phpstan-type Options array{\n *     index: string,\n *     type: string,\n *     ignore_error: bool\n * }\n * @phpstan-type InputOptions array{\n *     index?: string,\n *     type?: string,\n *     ignore_error?: bool\n * }\n */\nclass ElasticaHandler extends AbstractProcessingHandler\n{\n    protected Client $client;\n\n    /**\n     * @var mixed[] Handler config options\n     * @phpstan-var Options\n     */\n    protected array $options;\n\n    /**\n     * @param Client  $client  Elastica Client object\n     * @param mixed[] $options Handler configuration\n     *\n     * @phpstan-param InputOptions $options\n     */\n    public function __construct(Client $client, array $options = [], int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n        $this->client = $client;\n        $this->options = array_merge(\n            [\n                'index'          => 'monolog',      // Elastic index name\n                'type'           => 'record',       // Elastic document type\n                'ignore_error'   => false,          // Suppress Elastica exceptions\n            ],\n            $options\n        );\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $this->bulkSend([$record->formatted]);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        if ($formatter instanceof ElasticaFormatter) {\n            return parent::setFormatter($formatter);\n        }\n\n        throw new \\InvalidArgumentException('ElasticaHandler is only compatible with ElasticaFormatter');\n    }\n\n    /**\n     * @return mixed[]\n     *\n     * @phpstan-return Options\n     */\n    public function getOptions(): array\n    {\n        return $this->options;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new ElasticaFormatter($this->options['index'], $this->options['type']);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        $documents = $this->getFormatter()->formatBatch($records);\n        $this->bulkSend($documents);\n    }\n\n    /**\n     * Use Elasticsearch bulk API to send list of documents\n     *\n     * @param Document[] $documents\n     *\n     * @throws \\RuntimeException\n     */\n    protected function bulkSend(array $documents): void\n    {\n        try {\n            $this->client->addDocuments($documents);\n        } catch (ExceptionInterface $e) {\n            if (!$this->options['ignore_error']) {\n                throw new \\RuntimeException(\"Error sending messages to Elasticsearch\", 0, $e);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Elastic\\Elasticsearch\\Response\\Elasticsearch;\nuse Throwable;\nuse RuntimeException;\nuse Monolog\\Level;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\ElasticsearchFormatter;\nuse InvalidArgumentException;\nuse Elasticsearch\\Common\\Exceptions\\RuntimeException as ElasticsearchRuntimeException;\nuse Elasticsearch\\Client;\nuse Monolog\\LogRecord;\nuse Elastic\\Elasticsearch\\Exception\\InvalidArgumentException as ElasticInvalidArgumentException;\nuse Elastic\\Elasticsearch\\Client as Client8;\n\n/**\n * Elasticsearch handler\n *\n * @link https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html\n *\n * Simple usage example:\n *\n *    $client = \\Elasticsearch\\ClientBuilder::create()\n *        ->setHosts($hosts)\n *        ->build();\n *\n *    $options = array(\n *        'index' => 'elastic_index_name',\n *        'type'  => 'elastic_doc_type',\n *    );\n *    $handler = new ElasticsearchHandler($client, $options);\n *    $log = new Logger('application');\n *    $log->pushHandler($handler);\n *\n * @author Avtandil Kikabidze <akalongman@gmail.com>\n * @phpstan-type Options array{\n *     index: string,\n *     type: string,\n *     ignore_error: bool,\n *     op_type: 'index'|'create'\n * }\n * @phpstan-type InputOptions array{\n *     index?: string,\n *     type?: string,\n *     ignore_error?: bool,\n *     op_type?: 'index'|'create'\n * }\n */\nclass ElasticsearchHandler extends AbstractProcessingHandler\n{\n    protected Client|Client8 $client;\n\n    /**\n     * @var mixed[] Handler config options\n     * @phpstan-var Options\n     */\n    protected array $options;\n\n    /**\n     * @var bool\n     */\n    private $needsType;\n\n    /**\n     * @param Client|Client8 $client  Elasticsearch Client object\n     * @param mixed[]        $options Handler configuration\n     *\n     * @phpstan-param InputOptions $options\n     */\n    public function __construct(Client|Client8 $client, array $options = [], int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n        $this->client = $client;\n        $this->options = array_merge(\n            [\n                'index'        => 'monolog', // Elastic index name\n                'type'         => '_doc',    // Elastic document type\n                'ignore_error' => false,     // Suppress Elasticsearch exceptions\n                '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)\n            ],\n            $options\n        );\n\n        if ($client instanceof Client8 || $client::VERSION[0] === '7') {\n            $this->needsType = false;\n            // force the type to _doc for ES8/ES7\n            $this->options['type'] = '_doc';\n        } else {\n            $this->needsType = true;\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $this->bulkSend([$record->formatted]);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        if ($formatter instanceof ElasticsearchFormatter) {\n            return parent::setFormatter($formatter);\n        }\n\n        throw new InvalidArgumentException('ElasticsearchHandler is only compatible with ElasticsearchFormatter');\n    }\n\n    /**\n     * Getter options\n     *\n     * @return mixed[]\n     *\n     * @phpstan-return Options\n     */\n    public function getOptions(): array\n    {\n        return $this->options;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new ElasticsearchFormatter($this->options['index'], $this->options['type']);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        $documents = $this->getFormatter()->formatBatch($records);\n        $this->bulkSend($documents);\n    }\n\n    /**\n     * Use Elasticsearch bulk API to send list of documents\n     *\n     * @param  array<array<mixed>> $records Records + _index/_type keys\n     * @throws \\RuntimeException\n     */\n    protected function bulkSend(array $records): void\n    {\n        try {\n            $params = [\n                'body' => [],\n            ];\n\n            foreach ($records as $record) {\n                $params['body'][] = [\n                    $this->options['op_type'] => $this->needsType ? [\n                        '_index' => $record['_index'],\n                        '_type'  => $record['_type'],\n                    ] : [\n                        '_index' => $record['_index'],\n                    ],\n                ];\n                unset($record['_index'], $record['_type']);\n\n                $params['body'][] = $record;\n            }\n\n            /** @var Elasticsearch */\n            $responses = $this->client->bulk($params);\n\n            if ($responses['errors'] === true) {\n                throw $this->createExceptionFromResponses($responses);\n            }\n        } catch (Throwable $e) {\n            if (! $this->options['ignore_error']) {\n                throw new RuntimeException('Error sending messages to Elasticsearch', 0, $e);\n            }\n        }\n    }\n\n    /**\n     * Creates elasticsearch exception from responses array\n     *\n     * Only the first error is converted into an exception.\n     *\n     * @param mixed[]|Elasticsearch $responses returned by $this->client->bulk()\n     */\n    protected function createExceptionFromResponses($responses): Throwable\n    {\n        foreach ($responses['items'] ?? [] as $item) {\n            if (isset($item['index']['error'])) {\n                return $this->createExceptionFromError($item['index']['error']);\n            }\n        }\n\n        if (class_exists(ElasticInvalidArgumentException::class)) {\n            return new ElasticInvalidArgumentException('Elasticsearch failed to index one or more records.');\n        }\n\n        return new ElasticsearchRuntimeException('Elasticsearch failed to index one or more records.');\n    }\n\n    /**\n     * Creates elasticsearch exception from error array\n     *\n     * @param mixed[] $error\n     */\n    protected function createExceptionFromError(array $error): Throwable\n    {\n        $previous = isset($error['caused_by']) ? $this->createExceptionFromError($error['caused_by']) : null;\n\n        if (class_exists(ElasticInvalidArgumentException::class)) {\n            return new ElasticInvalidArgumentException($error['type'] . ': ' . $error['reason'], 0, $previous);\n        }\n\n        return new ElasticsearchRuntimeException($error['type'] . ': ' . $error['reason'], 0, $previous);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Stores to PHP error_log() handler.\n *\n * @author Elan Ruusamäe <glen@delfi.ee>\n */\nclass ErrorLogHandler extends AbstractProcessingHandler\n{\n    public const OPERATING_SYSTEM = 0;\n    public const SAPI = 4;\n\n    protected int $messageType;\n    protected bool $expandNewlines;\n\n    /**\n     * @param int  $messageType    Says where the error should go.\n     * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries\n     *\n     * @throws \\InvalidArgumentException If an unsupported message type is set\n     */\n    public function __construct(int $messageType = self::OPERATING_SYSTEM, int|string|Level $level = Level::Debug, bool $bubble = true, bool $expandNewlines = false)\n    {\n        parent::__construct($level, $bubble);\n\n        if (false === in_array($messageType, self::getAvailableTypes(), true)) {\n            $message = sprintf('The given message type \"%s\" is not supported', print_r($messageType, true));\n\n            throw new \\InvalidArgumentException($message);\n        }\n\n        $this->messageType = $messageType;\n        $this->expandNewlines = $expandNewlines;\n    }\n\n    /**\n     * @return int[] With all available types\n     */\n    public static function getAvailableTypes(): array\n    {\n        return [\n            self::OPERATING_SYSTEM,\n            self::SAPI,\n        ];\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%');\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        if (!$this->expandNewlines) {\n            error_log((string) $record->formatted, $this->messageType);\n\n            return;\n        }\n\n        $lines = preg_split('{[\\r\\n]+}', (string) $record->formatted);\n        if ($lines === false) {\n            $pcreErrorCode = preg_last_error();\n\n            throw new \\RuntimeException('Failed to preg_split formatted string: ' . $pcreErrorCode . ' / '. Utils::pcreLastErrorMessage($pcreErrorCode));\n        }\n        foreach ($lines as $line) {\n            error_log($line, $this->messageType);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Throwable;\nuse Monolog\\LogRecord;\n\n/**\n * Forwards records to at most one handler\n *\n * If a handler fails, the exception is suppressed and the record is forwarded to the next handler.\n *\n * As soon as one handler handles a record successfully, the handling stops there.\n */\nclass FallbackGroupHandler extends GroupHandler\n{\n    /**\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        if (\\count($this->processors) > 0) {\n            $record = $this->processRecord($record);\n        }\n        foreach ($this->handlers as $handler) {\n            try {\n                $handler->handle(clone $record);\n                break;\n            } catch (Throwable $e) {\n                // What throwable?\n            }\n        }\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        if (\\count($this->processors) > 0) {\n            $processed = [];\n            foreach ($records as $record) {\n                $processed[] = $this->processRecord($record);\n            }\n            $records = $processed;\n        }\n\n        foreach ($this->handlers as $handler) {\n            try {\n                $handler->handleBatch(array_map(fn ($record) => clone $record, $records));\n                break;\n            } catch (Throwable $e) {\n                // What throwable?\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Closure;\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Monolog\\ResettableInterface;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\LogRecord;\n\n/**\n * Simple handler wrapper that filters records based on a list of levels\n *\n * It can be configured with an exact list of levels to allow, or a min/max level.\n *\n * @author Hennadiy Verkh\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass FilterHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface\n{\n    use ProcessableHandlerTrait;\n\n    /**\n     * Handler or factory Closure($record, $this)\n     *\n     * @phpstan-var (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface\n     */\n    protected Closure|HandlerInterface $handler;\n\n    /**\n     * Minimum level for logs that are passed to handler\n     *\n     * @var bool[] Map of Level value => true\n     * @phpstan-var array<value-of<Level::VALUES>, true>\n     */\n    protected array $acceptedLevels;\n\n    /**\n     * Whether the messages that are handled can bubble up the stack or not\n     */\n    protected bool $bubble;\n\n    /**\n     * @phpstan-param (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface $handler\n     *\n     * @param Closure|HandlerInterface                                                 $handler        Handler or factory Closure($record|null, $filterHandler).\n     * @param int|string|Level|array<int|string|Level|LogLevel::*> $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided\n     * @param int|string|Level|LogLevel::*                                   $maxLevel       Maximum level to accept, only used if $minLevelOrList is not an array\n     * @param bool                                                                     $bubble         Whether the messages that are handled can bubble up the stack or not\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::*|array<value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::*> $minLevelOrList\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $maxLevel\n     */\n    public function __construct(Closure|HandlerInterface $handler, int|string|Level|array $minLevelOrList = Level::Debug, int|string|Level $maxLevel = Level::Emergency, bool $bubble = true)\n    {\n        $this->handler  = $handler;\n        $this->bubble   = $bubble;\n        $this->setAcceptedLevels($minLevelOrList, $maxLevel);\n    }\n\n    /**\n     * @phpstan-return list<Level> List of levels\n     */\n    public function getAcceptedLevels(): array\n    {\n        return array_map(fn (int $level) => Level::from($level), array_keys($this->acceptedLevels));\n    }\n\n    /**\n     * @param int|string|Level|LogLevel::*|array<int|string|Level|LogLevel::*> $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided\n     * @param int|string|Level|LogLevel::*                                               $maxLevel       Maximum level or level name to accept, only used if $minLevelOrList is not an array\n     * @return $this\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::*|array<value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::*> $minLevelOrList\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $maxLevel\n     */\n    public function setAcceptedLevels(int|string|Level|array $minLevelOrList = Level::Debug, int|string|Level $maxLevel = Level::Emergency): self\n    {\n        if (is_array($minLevelOrList)) {\n            $acceptedLevels = array_map(Logger::toMonologLevel(...), $minLevelOrList);\n        } else {\n            $minLevelOrList = Logger::toMonologLevel($minLevelOrList);\n            $maxLevel = Logger::toMonologLevel($maxLevel);\n            $acceptedLevels = array_values(array_filter(Level::cases(), fn (Level $level) => $level->value >= $minLevelOrList->value && $level->value <= $maxLevel->value));\n        }\n        $this->acceptedLevels = [];\n        foreach ($acceptedLevels as $level) {\n            $this->acceptedLevels[$level->value] = true;\n        }\n\n        return $this;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function isHandling(LogRecord $record): bool\n    {\n        return isset($this->acceptedLevels[$record->level->value]);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        if (!$this->isHandling($record)) {\n            return false;\n        }\n\n        if (\\count($this->processors) > 0) {\n            $record = $this->processRecord($record);\n        }\n\n        $this->getHandler($record)->handle($record);\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        $filtered = [];\n        foreach ($records as $record) {\n            if ($this->isHandling($record)) {\n                $filtered[] = $record;\n            }\n        }\n\n        if (count($filtered) > 0) {\n            $this->getHandler($filtered[count($filtered) - 1])->handleBatch($filtered);\n        }\n    }\n\n    /**\n     * Return the nested handler\n     *\n     * If the handler was provided as a factory, this will trigger the handler's instantiation.\n     */\n    public function getHandler(LogRecord|null $record = null): HandlerInterface\n    {\n        if (!$this->handler instanceof HandlerInterface) {\n            $handler = ($this->handler)($record, $this);\n            if (!$handler instanceof HandlerInterface) {\n                throw new \\RuntimeException(\"The factory Closure should return a HandlerInterface\");\n            }\n            $this->handler = $handler;\n        }\n\n        return $this->handler;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        $handler = $this->getHandler();\n        if ($handler instanceof FormattableHandlerInterface) {\n            $handler->setFormatter($formatter);\n\n            return $this;\n        }\n\n        throw new \\UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function getFormatter(): FormatterInterface\n    {\n        $handler = $this->getHandler();\n        if ($handler instanceof FormattableHandlerInterface) {\n            return $handler->getFormatter();\n        }\n\n        throw new \\UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');\n    }\n\n    public function reset(): void\n    {\n        $this->resetProcessors();\n\n        if ($this->getHandler() instanceof ResettableInterface) {\n            $this->getHandler()->reset();\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\FingersCrossed;\n\nuse Monolog\\LogRecord;\n\n/**\n * Interface for activation strategies for the FingersCrossedHandler.\n *\n * @author Johannes M. Schmitt <schmittjoh@gmail.com>\n */\ninterface ActivationStrategyInterface\n{\n    /**\n     * Returns whether the given record activates the handler.\n     */\n    public function isHandlerActivated(LogRecord $record): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\FingersCrossed;\n\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\LogRecord;\n\n/**\n * Channel and Error level based monolog activation strategy. Allows to trigger activation\n * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except\n * for records of the 'sql' channel; those should trigger activation on level 'WARN'.\n *\n * Example:\n *\n * <code>\n *   $activationStrategy = new ChannelLevelActivationStrategy(\n *       Level::Critical,\n *       array(\n *           'request' => Level::Alert,\n *           'sensitive' => Level::Error,\n *       )\n *   );\n *   $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy);\n * </code>\n *\n * @author Mike Meessen <netmikey@gmail.com>\n */\nclass ChannelLevelActivationStrategy implements ActivationStrategyInterface\n{\n    private Level $defaultActionLevel;\n\n    /**\n     * @var array<string, Level>\n     */\n    private array $channelToActionLevel;\n\n    /**\n     * @param int|string|Level|LogLevel::*                $defaultActionLevel   The default action level to be used if the record's category doesn't match any\n     * @param array<string, int|string|Level|LogLevel::*> $channelToActionLevel An array that maps channel names to action levels.\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $defaultActionLevel\n     * @phpstan-param array<string, value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::*> $channelToActionLevel\n     */\n    public function __construct(int|string|Level $defaultActionLevel, array $channelToActionLevel = [])\n    {\n        $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel);\n        $this->channelToActionLevel = array_map(Logger::toMonologLevel(...), $channelToActionLevel);\n    }\n\n    public function isHandlerActivated(LogRecord $record): bool\n    {\n        if (isset($this->channelToActionLevel[$record->channel])) {\n            return $record->level->value >= $this->channelToActionLevel[$record->channel]->value;\n        }\n\n        return $record->level->value >= $this->defaultActionLevel->value;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\FingersCrossed;\n\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\nuse Monolog\\Logger;\nuse Psr\\Log\\LogLevel;\n\n/**\n * Error level based activation strategy.\n *\n * @author Johannes M. Schmitt <schmittjoh@gmail.com>\n */\nclass ErrorLevelActivationStrategy implements ActivationStrategyInterface\n{\n    private Level $actionLevel;\n\n    /**\n     * @param int|string|Level $actionLevel Level or name or value\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $actionLevel\n     */\n    public function __construct(int|string|Level $actionLevel)\n    {\n        $this->actionLevel = Logger::toMonologLevel($actionLevel);\n    }\n\n    public function isHandlerActivated(LogRecord $record): bool\n    {\n        return $record->level->value >= $this->actionLevel->value;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Closure;\nuse Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy;\nuse Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface;\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Monolog\\ResettableInterface;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\LogRecord;\n\n/**\n * Buffers all records until a certain level is reached\n *\n * The advantage of this approach is that you don't get any clutter in your log files.\n * Only requests which actually trigger an error (or whatever your actionLevel is) will be\n * in the logs, but they will contain all records, not only those above the level threshold.\n *\n * You can then have a passthruLevel as well which means that at the end of the request,\n * even if it did not get activated, it will still send through log records of e.g. at least a\n * warning level.\n *\n * You can find the various activation strategies in the\n * Monolog\\Handler\\FingersCrossed\\ namespace.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass FingersCrossedHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface\n{\n    use ProcessableHandlerTrait;\n\n    /**\n     * Handler or factory Closure($record, $this)\n     *\n     * @phpstan-var (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface\n     */\n    protected Closure|HandlerInterface $handler;\n\n    protected ActivationStrategyInterface $activationStrategy;\n\n    protected bool $buffering = true;\n\n    protected int $bufferSize;\n\n    /** @var LogRecord[] */\n    protected array $buffer = [];\n\n    protected bool $stopBuffering;\n\n    protected Level|null $passthruLevel = null;\n\n    protected bool $bubble;\n\n    /**\n     * @phpstan-param (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface $handler\n     *\n     * @param Closure|HandlerInterface                    $handler            Handler or factory Closure($record|null, $fingersCrossedHandler).\n     * @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\n     * @param int                                         $bufferSize         How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.\n     * @param bool                                        $bubble             Whether the messages that are handled can bubble up the stack or not\n     * @param bool                                        $stopBuffering      Whether the handler should stop buffering after being triggered (default true)\n     * @param int|string|Level|LogLevel::*|null $passthruLevel      Minimum level to always flush to handler on close, even if strategy not triggered\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::*|ActivationStrategyInterface $activationStrategy\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $passthruLevel\n     */\n    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)\n    {\n        if (null === $activationStrategy) {\n            $activationStrategy = new ErrorLevelActivationStrategy(Level::Warning);\n        }\n\n        // convert simple int activationStrategy to an object\n        if (!$activationStrategy instanceof ActivationStrategyInterface) {\n            $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy);\n        }\n\n        $this->handler = $handler;\n        $this->activationStrategy = $activationStrategy;\n        $this->bufferSize = $bufferSize;\n        $this->bubble = $bubble;\n        $this->stopBuffering = $stopBuffering;\n\n        if ($passthruLevel !== null) {\n            $this->passthruLevel = Logger::toMonologLevel($passthruLevel);\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function isHandling(LogRecord $record): bool\n    {\n        return true;\n    }\n\n    /**\n     * Manually activate this logger regardless of the activation strategy\n     */\n    public function activate(): void\n    {\n        if ($this->stopBuffering) {\n            $this->buffering = false;\n        }\n\n        $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer);\n        $this->buffer = [];\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        if (\\count($this->processors) > 0) {\n            $record = $this->processRecord($record);\n        }\n\n        if ($this->buffering) {\n            $this->buffer[] = $record;\n            if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) {\n                array_shift($this->buffer);\n            }\n            if ($this->activationStrategy->isHandlerActivated($record)) {\n                $this->activate();\n            }\n        } else {\n            $this->getHandler($record)->handle($record);\n        }\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function close(): void\n    {\n        $this->flushBuffer();\n\n        $this->getHandler()->close();\n    }\n\n    public function reset(): void\n    {\n        $this->flushBuffer();\n\n        $this->resetProcessors();\n\n        if ($this->getHandler() instanceof ResettableInterface) {\n            $this->getHandler()->reset();\n        }\n    }\n\n    /**\n     * Clears the buffer without flushing any messages down to the wrapped handler.\n     *\n     * It also resets the handler to its initial buffering state.\n     */\n    public function clear(): void\n    {\n        $this->buffer = [];\n        $this->reset();\n    }\n\n    /**\n     * Resets the state of the handler. Stops forwarding records to the wrapped handler.\n     */\n    private function flushBuffer(): void\n    {\n        if (null !== $this->passthruLevel) {\n            $passthruLevel = $this->passthruLevel;\n            $this->buffer = array_filter($this->buffer, static function ($record) use ($passthruLevel) {\n                return $passthruLevel->includes($record->level);\n            });\n            if (count($this->buffer) > 0) {\n                $this->getHandler(end($this->buffer))->handleBatch($this->buffer);\n            }\n        }\n\n        $this->buffer = [];\n        $this->buffering = true;\n    }\n\n    /**\n     * Return the nested handler\n     *\n     * If the handler was provided as a factory, this will trigger the handler's instantiation.\n     */\n    public function getHandler(LogRecord|null $record = null): HandlerInterface\n    {\n        if (!$this->handler instanceof HandlerInterface) {\n            $handler = ($this->handler)($record, $this);\n            if (!$handler instanceof HandlerInterface) {\n                throw new \\RuntimeException(\"The factory Closure should return a HandlerInterface\");\n            }\n            $this->handler = $handler;\n        }\n\n        return $this->handler;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        $handler = $this->getHandler();\n        if ($handler instanceof FormattableHandlerInterface) {\n            $handler->setFormatter($formatter);\n\n            return $this;\n        }\n\n        throw new \\UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function getFormatter(): FormatterInterface\n    {\n        $handler = $this->getHandler();\n        if ($handler instanceof FormattableHandlerInterface) {\n            return $handler->getFormatter();\n        }\n\n        throw new \\UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\WildfireFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol.\n *\n * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com>\n */\nclass FirePHPHandler extends AbstractProcessingHandler\n{\n    use WebRequestRecognizerTrait;\n\n    /**\n     * WildFire JSON header message format\n     */\n    protected const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2';\n\n    /**\n     * FirePHP structure for parsing messages & their presentation\n     */\n    protected const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1';\n\n    /**\n     * Must reference a \"known\" plugin, otherwise headers won't display in FirePHP\n     */\n    protected const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3';\n\n    /**\n     * Header prefix for Wildfire to recognize & parse headers\n     */\n    protected const HEADER_PREFIX = 'X-Wf';\n\n    /**\n     * Whether or not Wildfire vendor-specific headers have been generated & sent yet\n     */\n    protected static bool $initialized = false;\n\n    /**\n     * Shared static message index between potentially multiple handlers\n     */\n    protected static int $messageIndex = 1;\n\n    protected static bool $sendHeaders = true;\n\n    /**\n     * Base header creation function used by init headers & record headers\n     *\n     * @param array<int|string> $meta    Wildfire Plugin, Protocol & Structure Indexes\n     * @param string            $message Log message\n     *\n     * @return array<string, string> Complete header string ready for the client as key and message as value\n     *\n     * @phpstan-return non-empty-array<string, string>\n     */\n    protected function createHeader(array $meta, string $message): array\n    {\n        $header = sprintf('%s-%s', static::HEADER_PREFIX, join('-', $meta));\n\n        return [$header => $message];\n    }\n\n    /**\n     * Creates message header from record\n     *\n     * @return array<string, string>\n     *\n     * @phpstan-return non-empty-array<string, string>\n     *\n     * @see createHeader()\n     */\n    protected function createRecordHeader(LogRecord $record): array\n    {\n        // Wildfire is extensible to support multiple protocols & plugins in a single request,\n        // but we're not taking advantage of that (yet), so we're using \"1\" for simplicity's sake.\n        return $this->createHeader(\n            [1, 1, 1, self::$messageIndex++],\n            $record->formatted\n        );\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new WildfireFormatter();\n    }\n\n    /**\n     * Wildfire initialization headers to enable message parsing\n     *\n     * @see createHeader()\n     * @see sendHeader()\n     *\n     * @return array<string, string>\n     */\n    protected function getInitHeaders(): array\n    {\n        // Initial payload consists of required headers for Wildfire\n        return array_merge(\n            $this->createHeader(['Protocol', 1], static::PROTOCOL_URI),\n            $this->createHeader([1, 'Structure', 1], static::STRUCTURE_URI),\n            $this->createHeader([1, 'Plugin', 1], static::PLUGIN_URI)\n        );\n    }\n\n    /**\n     * Send header string to the client\n     */\n    protected function sendHeader(string $header, string $content): void\n    {\n        if (!headers_sent() && self::$sendHeaders) {\n            header(sprintf('%s: %s', $header, $content));\n        }\n    }\n\n    /**\n     * Creates & sends header for a record, ensuring init headers have been sent prior\n     *\n     * @see sendHeader()\n     * @see sendInitHeaders()\n     */\n    protected function write(LogRecord $record): void\n    {\n        if (!self::$sendHeaders || !$this->isWebRequest()) {\n            return;\n        }\n\n        // WildFire-specific headers must be sent prior to any messages\n        if (!self::$initialized) {\n            self::$initialized = true;\n\n            self::$sendHeaders = $this->headersAccepted();\n            if (!self::$sendHeaders) {\n                return;\n            }\n\n            foreach ($this->getInitHeaders() as $header => $content) {\n                $this->sendHeader($header, $content);\n            }\n        }\n\n        $header = $this->createRecordHeader($record);\n        if (trim(current($header)) !== '') {\n            $this->sendHeader(key($header), current($header));\n        }\n    }\n\n    /**\n     * Verifies if the headers are accepted by the current user agent\n     */\n    protected function headersAccepted(): bool\n    {\n        if (isset($_SERVER['HTTP_USER_AGENT']) && 1 === preg_match('{\\bFirePHP/\\d+\\.\\d+\\b}', $_SERVER['HTTP_USER_AGENT'])) {\n            return true;\n        }\n\n        return isset($_SERVER['HTTP_X_FIREPHP_VERSION']);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\n\n/**\n * Sends logs to Fleep.io using Webhook integrations\n *\n * You'll need a Fleep.io account to use this handler.\n *\n * @see https://fleep.io/integrations/webhooks/ Fleep Webhooks Documentation\n * @author Ando Roots <ando@sqroot.eu>\n */\nclass FleepHookHandler extends SocketHandler\n{\n    protected const FLEEP_HOST = 'fleep.io';\n\n    protected const FLEEP_HOOK_URI = '/hook/';\n\n    /**\n     * @var string Webhook token (specifies the conversation where logs are sent)\n     */\n    protected string $token;\n\n    /**\n     * Construct a new Fleep.io Handler.\n     *\n     * For instructions on how to create a new web hook in your conversations\n     * see https://fleep.io/integrations/webhooks/\n     *\n     * @param  string                    $token Webhook token\n     * @throws MissingExtensionException if OpenSSL is missing\n     */\n    public function __construct(\n        string $token,\n        $level = Level::Debug,\n        bool $bubble = true,\n        bool $persistent = false,\n        float $timeout = 0.0,\n        float $writingTimeout = 10.0,\n        ?float $connectionTimeout = null,\n        ?int $chunkSize = null\n    ) {\n        if (!extension_loaded('openssl')) {\n            throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler');\n        }\n\n        $this->token = $token;\n\n        $connectionString = 'ssl://' . static::FLEEP_HOST . ':443';\n        parent::__construct(\n            $connectionString,\n            $level,\n            $bubble,\n            $persistent,\n            $timeout,\n            $writingTimeout,\n            $connectionTimeout,\n            $chunkSize\n        );\n    }\n\n    /**\n     * Returns the default formatter to use with this handler\n     *\n     * Overloaded to remove empty context and extra arrays from the end of the log message.\n     *\n     * @return LineFormatter\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new LineFormatter(null, null, true, true);\n    }\n\n    /**\n     * Handles a log record\n     */\n    public function write(LogRecord $record): void\n    {\n        parent::write($record);\n        $this->closeSocket();\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function generateDataStream(LogRecord $record): string\n    {\n        $content = $this->buildContent($record);\n\n        return $this->buildHeader($content) . $content;\n    }\n\n    /**\n     * Builds the header of the API Call\n     */\n    private function buildHeader(string $content): string\n    {\n        $header = \"POST \" . static::FLEEP_HOOK_URI . $this->token . \" HTTP/1.1\\r\\n\";\n        $header .= \"Host: \" . static::FLEEP_HOST . \"\\r\\n\";\n        $header .= \"Content-Type: application/x-www-form-urlencoded\\r\\n\";\n        $header .= \"Content-Length: \" . strlen($content) . \"\\r\\n\";\n        $header .= \"\\r\\n\";\n\n        return $header;\n    }\n\n    /**\n     * Builds the body of API call\n     */\n    private function buildContent(LogRecord $record): string\n    {\n        $dataArray = [\n            'message' => $record->formatted,\n        ];\n\n        return http_build_query($dataArray);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\Formatter\\FlowdockFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Sends notifications through the Flowdock push API\n *\n * This must be configured with a FlowdockFormatter instance via setFormatter()\n *\n * Notes:\n * API token - Flowdock API token\n *\n * @author Dominik Liebler <liebler.dominik@gmail.com>\n * @see https://www.flowdock.com/api/push\n * @deprecated Since 2.9.0 and 3.3.0, Flowdock was shutdown we will thus drop this handler in Monolog 4\n */\nclass FlowdockHandler extends SocketHandler\n{\n    protected string $apiToken;\n\n    /**\n     * @throws MissingExtensionException if OpenSSL is missing\n     */\n    public function __construct(\n        string $apiToken,\n        $level = Level::Debug,\n        bool $bubble = true,\n        bool $persistent = false,\n        float $timeout = 0.0,\n        float $writingTimeout = 10.0,\n        ?float $connectionTimeout = null,\n        ?int $chunkSize = null\n    ) {\n        if (!extension_loaded('openssl')) {\n            throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler');\n        }\n\n        parent::__construct(\n            'ssl://api.flowdock.com:443',\n            $level,\n            $bubble,\n            $persistent,\n            $timeout,\n            $writingTimeout,\n            $connectionTimeout,\n            $chunkSize\n        );\n        $this->apiToken = $apiToken;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        if (!$formatter instanceof FlowdockFormatter) {\n            throw new \\InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\\Formatter\\FlowdockFormatter to function correctly');\n        }\n\n        return parent::setFormatter($formatter);\n    }\n\n    /**\n     * Gets the default formatter.\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        throw new \\InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\\Formatter\\FlowdockFormatter to function correctly');\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        parent::write($record);\n\n        $this->closeSocket();\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function generateDataStream(LogRecord $record): string\n    {\n        $content = $this->buildContent($record);\n\n        return $this->buildHeader($content) . $content;\n    }\n\n    /**\n     * Builds the body of API call\n     */\n    private function buildContent(LogRecord $record): string\n    {\n        return Utils::jsonEncode($record->formatted);\n    }\n\n    /**\n     * Builds the header of the API Call\n     */\n    private function buildHeader(string $content): string\n    {\n        $header = \"POST /v1/messages/team_inbox/\" . $this->apiToken . \" HTTP/1.1\\r\\n\";\n        $header .= \"Host: api.flowdock.com\\r\\n\";\n        $header .= \"Content-Type: application/json\\r\\n\";\n        $header .= \"Content-Length: \" . strlen($content) . \"\\r\\n\";\n        $header .= \"\\r\\n\";\n\n        return $header;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\n\n/**\n * Interface to describe loggers that have a formatter\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\ninterface FormattableHandlerInterface\n{\n    /**\n     * Sets the formatter.\n     *\n     * @return HandlerInterface self\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface;\n\n    /**\n     * Gets the formatter.\n     */\n    public function getFormatter(): FormatterInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\LineFormatter;\n\n/**\n * Helper trait for implementing FormattableInterface\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\ntrait FormattableHandlerTrait\n{\n    protected FormatterInterface|null $formatter = null;\n\n    /**\n     * @inheritDoc\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        $this->formatter = $formatter;\n\n        return $this;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function getFormatter(): FormatterInterface\n    {\n        if (null === $this->formatter) {\n            $this->formatter = $this->getDefaultFormatter();\n        }\n\n        return $this->formatter;\n    }\n\n    /**\n     * Gets the default formatter.\n     *\n     * Overwrite this if the LineFormatter is not a good default for your handler.\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new LineFormatter();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Gelf\\PublisherInterface;\nuse Monolog\\Level;\nuse Monolog\\Formatter\\GelfMessageFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Handler to send messages to a Graylog2 (http://www.graylog2.org) server\n *\n * @author Matt Lehner <mlehner@gmail.com>\n * @author Benjamin Zikarsky <benjamin@zikarsky.de>\n */\nclass GelfHandler extends AbstractProcessingHandler\n{\n    /**\n     * @var PublisherInterface the publisher object that sends the message to the server\n     */\n    protected PublisherInterface $publisher;\n\n    /**\n     * @param PublisherInterface $publisher a gelf publisher object\n     */\n    public function __construct(PublisherInterface $publisher, int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        $this->publisher = $publisher;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $this->publisher->publish($record->formatted);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new GelfMessageFormatter();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\ResettableInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Forwards records to multiple handlers\n *\n * @author Lenar Lõhmus <lenar@city.ee>\n */\nclass GroupHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface\n{\n    use ProcessableHandlerTrait;\n\n    /** @var HandlerInterface[] */\n    protected array $handlers;\n    protected bool $bubble;\n\n    /**\n     * @param HandlerInterface[] $handlers Array of Handlers.\n     * @param bool               $bubble   Whether the messages that are handled can bubble up the stack or not\n     *\n     * @throws \\InvalidArgumentException if an unsupported handler is set\n     */\n    public function __construct(array $handlers, bool $bubble = true)\n    {\n        foreach ($handlers as $handler) {\n            if (!$handler instanceof HandlerInterface) {\n                throw new \\InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.');\n            }\n        }\n\n        $this->handlers = $handlers;\n        $this->bubble = $bubble;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function isHandling(LogRecord $record): bool\n    {\n        foreach ($this->handlers as $handler) {\n            if ($handler->isHandling($record)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        if (\\count($this->processors) > 0) {\n            $record = $this->processRecord($record);\n        }\n\n        foreach ($this->handlers as $handler) {\n            $handler->handle(clone $record);\n        }\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        if (\\count($this->processors) > 0) {\n            $processed = [];\n            foreach ($records as $record) {\n                $processed[] = $this->processRecord($record);\n            }\n            $records = $processed;\n        }\n\n        foreach ($this->handlers as $handler) {\n            $handler->handleBatch(array_map(fn ($record) => clone $record, $records));\n        }\n    }\n\n    public function reset(): void\n    {\n        $this->resetProcessors();\n\n        foreach ($this->handlers as $handler) {\n            if ($handler instanceof ResettableInterface) {\n                $handler->reset();\n            }\n        }\n    }\n\n    public function close(): void\n    {\n        parent::close();\n\n        foreach ($this->handlers as $handler) {\n            $handler->close();\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        foreach ($this->handlers as $handler) {\n            if ($handler instanceof FormattableHandlerInterface) {\n                $handler->setFormatter($formatter);\n            }\n        }\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/Handler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\n/**\n * Base Handler class providing basic close() support as well as handleBatch\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nabstract class Handler implements HandlerInterface\n{\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        foreach ($records as $record) {\n            $this->handle($record);\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function close(): void\n    {\n    }\n\n    public function __destruct()\n    {\n        try {\n            $this->close();\n        } catch (\\Throwable $e) {\n            // do nothing\n        }\n    }\n\n    public function __sleep()\n    {\n        $this->close();\n\n        $reflClass = new \\ReflectionClass($this);\n\n        $keys = [];\n        foreach ($reflClass->getProperties() as $reflProp) {\n            if (!$reflProp->isStatic()) {\n                $keys[] = $reflProp->getName();\n            }\n        }\n\n        return $keys;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\LogRecord;\n\n/**\n * Interface that all Monolog Handlers must implement\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\ninterface HandlerInterface\n{\n    /**\n     * Checks whether the given record will be handled by this handler.\n     *\n     * This is mostly done for performance reasons, to avoid calling processors for nothing.\n     *\n     * Handlers should still check the record levels within handle(), returning false in isHandling()\n     * is no guarantee that handle() will not be called, and isHandling() might not be called\n     * for a given record.\n     *\n     * @param LogRecord $record Partial log record having only a level initialized\n     */\n    public function isHandling(LogRecord $record): bool;\n\n    /**\n     * Handles a record.\n     *\n     * All records may be passed to this method, and the handler should discard\n     * those that it does not want to handle.\n     *\n     * The return value of this function controls the bubbling process of the handler stack.\n     * Unless the bubbling is interrupted (by returning true), the Logger class will keep on\n     * calling further handlers in the stack with a given log record.\n     *\n     * @param  LogRecord $record The record to handle\n     * @return bool      true means that this handler handled the record, and that bubbling is not permitted.\n     *                          false means the record was either not processed or that this handler allows bubbling.\n     */\n    public function handle(LogRecord $record): bool;\n\n    /**\n     * Handles a set of records at once.\n     *\n     * @param array<LogRecord> $records The records to handle\n     */\n    public function handleBatch(array $records): void;\n\n    /**\n     * Closes the handler.\n     *\n     * Ends a log cycle and frees all resources used by the handler.\n     *\n     * Closing a Handler means flushing all buffers and freeing any open resources/handles.\n     *\n     * Implementations have to be idempotent (i.e. it should be possible to call close several times without breakage)\n     * and ideally handlers should be able to reopen themselves on handle() after they have been closed.\n     *\n     * This is useful at the end of a request and will be called automatically when the object\n     * is destroyed if you extend Monolog\\Handler\\Handler.\n     *\n     * If you are thinking of calling this method yourself, most likely you should be\n     * calling ResettableInterface::reset instead. Have a look.\n     */\n    public function close(): void;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\ResettableInterface;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\LogRecord;\n\n/**\n * This simple wrapper class can be used to extend handlers functionality.\n *\n * Example: A custom filtering that can be applied to any handler.\n *\n * Inherit from this class and override handle() like this:\n *\n *   public function handle(LogRecord $record)\n *   {\n *        if ($record meets certain conditions) {\n *            return false;\n *        }\n *        return $this->handler->handle($record);\n *   }\n *\n * @author Alexey Karapetov <alexey@karapetov.com>\n */\nclass HandlerWrapper implements HandlerInterface, ProcessableHandlerInterface, FormattableHandlerInterface, ResettableInterface\n{\n    protected HandlerInterface $handler;\n\n    public function __construct(HandlerInterface $handler)\n    {\n        $this->handler = $handler;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function isHandling(LogRecord $record): bool\n    {\n        return $this->handler->isHandling($record);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        return $this->handler->handle($record);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        $this->handler->handleBatch($records);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function close(): void\n    {\n        $this->handler->close();\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function pushProcessor(callable $callback): HandlerInterface\n    {\n        if ($this->handler instanceof ProcessableHandlerInterface) {\n            $this->handler->pushProcessor($callback);\n\n            return $this;\n        }\n\n        throw new \\LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function popProcessor(): callable\n    {\n        if ($this->handler instanceof ProcessableHandlerInterface) {\n            return $this->handler->popProcessor();\n        }\n\n        throw new \\LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        if ($this->handler instanceof FormattableHandlerInterface) {\n            $this->handler->setFormatter($formatter);\n\n            return $this;\n        }\n\n        throw new \\LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function getFormatter(): FormatterInterface\n    {\n        if ($this->handler instanceof FormattableHandlerInterface) {\n            return $this->handler->getFormatter();\n        }\n\n        throw new \\LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class);\n    }\n\n    public function reset(): void\n    {\n        if ($this->handler instanceof ResettableInterface) {\n            $this->handler->reset();\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * IFTTTHandler uses cURL to trigger IFTTT Maker actions\n *\n * Register a secret key and trigger/event name at https://ifttt.com/maker\n *\n * value1 will be the channel from monolog's Logger constructor,\n * value2 will be the level name (ERROR, WARNING, ..)\n * value3 will be the log record's message\n *\n * @author Nehal Patel <nehal@nehalpatel.me>\n */\nclass IFTTTHandler extends AbstractProcessingHandler\n{\n    private string $eventName;\n    private string $secretKey;\n\n    /**\n     * @param string $eventName The name of the IFTTT Maker event that should be triggered\n     * @param string $secretKey A valid IFTTT secret key\n     *\n     * @throws MissingExtensionException If the curl extension is missing\n     */\n    public function __construct(string $eventName, string $secretKey, int|string|Level $level = Level::Error, bool $bubble = true)\n    {\n        if (!extension_loaded('curl')) {\n            throw new MissingExtensionException('The curl extension is needed to use the IFTTTHandler');\n        }\n\n        $this->eventName = $eventName;\n        $this->secretKey = $secretKey;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function write(LogRecord $record): void\n    {\n        $postData = [\n            \"value1\" => $record->channel,\n            \"value2\" => $record[\"level_name\"],\n            \"value3\" => $record->message,\n        ];\n        $postString = Utils::jsonEncode($postData);\n\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, \"https://maker.ifttt.com/trigger/\" . $this->eventName . \"/with/key/\" . $this->secretKey);\n        curl_setopt($ch, CURLOPT_POST, true);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);\n        curl_setopt($ch, CURLOPT_HTTPHEADER, [\n            \"Content-Type: application/json\",\n        ]);\n\n        Curl\\Util::execute($ch);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\n\n/**\n * Inspired on LogEntriesHandler.\n *\n * @author Robert Kaufmann III <rok3@rok3.me>\n * @author Gabriel Machado <gabriel.ms1@hotmail.com>\n */\nclass InsightOpsHandler extends SocketHandler\n{\n    protected string $logToken;\n\n    /**\n     * @param string $token  Log token supplied by InsightOps\n     * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'.\n     * @param bool   $useSSL Whether or not SSL encryption should be used\n     *\n     * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing\n     */\n    public function __construct(\n        string $token,\n        string $region = 'us',\n        bool $useSSL = true,\n        $level = Level::Debug,\n        bool $bubble = true,\n        bool $persistent = false,\n        float $timeout = 0.0,\n        float $writingTimeout = 10.0,\n        ?float $connectionTimeout = null,\n        ?int $chunkSize = null\n    ) {\n        if ($useSSL && !extension_loaded('openssl')) {\n            throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler');\n        }\n\n        $endpoint = $useSSL\n            ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443'\n            : $region . '.data.logs.insight.rapid7.com:80';\n\n        parent::__construct(\n            $endpoint,\n            $level,\n            $bubble,\n            $persistent,\n            $timeout,\n            $writingTimeout,\n            $connectionTimeout,\n            $chunkSize\n        );\n        $this->logToken = $token;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function generateDataStream(LogRecord $record): string\n    {\n        return $this->logToken . ' ' . $record->formatted;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\n\n/**\n * @author Robert Kaufmann III <rok3@rok3.me>\n */\nclass LogEntriesHandler extends SocketHandler\n{\n    protected string $logToken;\n\n    /**\n     * @param string $token  Log token supplied by LogEntries\n     * @param bool   $useSSL Whether or not SSL encryption should be used.\n     * @param string $host   Custom hostname to send the data to if needed\n     *\n     * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing\n     */\n    public function __construct(\n        string $token,\n        bool $useSSL = true,\n        $level = Level::Debug,\n        bool $bubble = true,\n        string $host = 'data.logentries.com',\n        bool $persistent = false,\n        float $timeout = 0.0,\n        float $writingTimeout = 10.0,\n        ?float $connectionTimeout = null,\n        ?int $chunkSize = null\n    ) {\n        if ($useSSL && !extension_loaded('openssl')) {\n            throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler');\n        }\n\n        $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80';\n        parent::__construct(\n            $endpoint,\n            $level,\n            $bubble,\n            $persistent,\n            $timeout,\n            $writingTimeout,\n            $connectionTimeout,\n            $chunkSize\n        );\n        $this->logToken = $token;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function generateDataStream(LogRecord $record): string\n    {\n        return $this->logToken . ' ' . $record->formatted;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\LogglyFormatter;\nuse function array_key_exists;\nuse CurlHandle;\nuse Monolog\\LogRecord;\n\n/**\n * Sends errors to Loggly.\n *\n * @author Przemek Sobstel <przemek@sobstel.org>\n * @author Adam Pancutt <adam@pancutt.com>\n * @author Gregory Barchard <gregory@barchard.net>\n */\nclass LogglyHandler extends AbstractProcessingHandler\n{\n    protected const HOST = 'logs-01.loggly.com';\n    protected const ENDPOINT_SINGLE = 'inputs';\n    protected const ENDPOINT_BATCH = 'bulk';\n\n    /**\n     * Caches the curl handlers for every given endpoint.\n     *\n     * @var CurlHandle[]\n     */\n    protected array $curlHandlers = [];\n\n    protected string $token;\n\n    /** @var string[] */\n    protected array $tag = [];\n\n    /**\n     * @param string $token API token supplied by Loggly\n     *\n     * @throws MissingExtensionException If the curl extension is missing\n     */\n    public function __construct(string $token, int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        if (!extension_loaded('curl')) {\n            throw new MissingExtensionException('The curl extension is needed to use the LogglyHandler');\n        }\n\n        $this->token = $token;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * Loads and returns the shared curl handler for the given endpoint.\n     */\n    protected function getCurlHandler(string $endpoint): CurlHandle\n    {\n        if (!array_key_exists($endpoint, $this->curlHandlers)) {\n            $this->curlHandlers[$endpoint] = $this->loadCurlHandle($endpoint);\n        }\n\n        return $this->curlHandlers[$endpoint];\n    }\n\n    /**\n     * Starts a fresh curl session for the given endpoint and returns its handler.\n     */\n    private function loadCurlHandle(string $endpoint): CurlHandle\n    {\n        $url = sprintf(\"https://%s/%s/%s/\", static::HOST, $endpoint, $this->token);\n\n        $ch = curl_init();\n\n        curl_setopt($ch, CURLOPT_URL, $url);\n        curl_setopt($ch, CURLOPT_POST, true);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n\n        return $ch;\n    }\n\n    /**\n     * @param string[]|string $tag\n     * @return $this\n     */\n    public function setTag(string|array $tag): self\n    {\n        if ('' === $tag || [] === $tag) {\n            $this->tag = [];\n        } else {\n            $this->tag = is_array($tag) ? $tag : [$tag];\n        }\n\n        return $this;\n    }\n\n    /**\n     * @param string[]|string $tag\n     * @return $this\n     */\n    public function addTag(string|array $tag): self\n    {\n        if ('' !== $tag) {\n            $tag = is_array($tag) ? $tag : [$tag];\n            $this->tag = array_unique(array_merge($this->tag, $tag));\n        }\n\n        return $this;\n    }\n\n    protected function write(LogRecord $record): void\n    {\n        $this->send($record->formatted, static::ENDPOINT_SINGLE);\n    }\n\n    public function handleBatch(array $records): void\n    {\n        $level = $this->level;\n\n        $records = array_filter($records, function ($record) use ($level) {\n            return ($record->level->value >= $level->value);\n        });\n\n        if (\\count($records) > 0) {\n            $this->send($this->getFormatter()->formatBatch($records), static::ENDPOINT_BATCH);\n        }\n    }\n\n    protected function send(string $data, string $endpoint): void\n    {\n        $ch = $this->getCurlHandler($endpoint);\n\n        $headers = ['Content-Type: application/json'];\n\n        if (\\count($this->tag) > 0) {\n            $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag);\n        }\n\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);\n        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\n\n        Curl\\Util::execute($ch, 5, false);\n    }\n\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new LogglyFormatter();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\LogmaticFormatter;\nuse Monolog\\LogRecord;\n\n/**\n * @author Julien Breux <julien.breux@gmail.com>\n */\nclass LogmaticHandler extends SocketHandler\n{\n    private string $logToken;\n\n    private string $hostname;\n\n    private string $appName;\n\n    /**\n     * @param string $token    Log token supplied by Logmatic.\n     * @param string $hostname Host name supplied by Logmatic.\n     * @param string $appName  Application name supplied by Logmatic.\n     * @param bool   $useSSL   Whether or not SSL encryption should be used.\n     *\n     * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing\n     */\n    public function __construct(\n        string $token,\n        string $hostname = '',\n        string $appName = '',\n        bool $useSSL = true,\n        $level = Level::Debug,\n        bool $bubble = true,\n        bool $persistent = false,\n        float $timeout = 0.0,\n        float $writingTimeout = 10.0,\n        ?float $connectionTimeout = null,\n        ?int $chunkSize = null\n    ) {\n        if ($useSSL && !extension_loaded('openssl')) {\n            throw new MissingExtensionException('The OpenSSL PHP extension is required to use SSL encrypted connection for LogmaticHandler');\n        }\n\n        $endpoint = $useSSL ? 'ssl://api.logmatic.io:10515' : 'api.logmatic.io:10514';\n        $endpoint .= '/v1/';\n\n        parent::__construct(\n            $endpoint,\n            $level,\n            $bubble,\n            $persistent,\n            $timeout,\n            $writingTimeout,\n            $connectionTimeout,\n            $chunkSize\n        );\n\n        $this->logToken = $token;\n        $this->hostname = $hostname;\n        $this->appName  = $appName;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function generateDataStream(LogRecord $record): string\n    {\n        return $this->logToken . ' ' . $record->formatted;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        $formatter = new LogmaticFormatter();\n\n        if ($this->hostname !== '') {\n            $formatter->setHostname($this->hostname);\n        }\n        if ($this->appName !== '') {\n            $formatter->setAppName($this->appName);\n        }\n\n        return $formatter;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\HtmlFormatter;\nuse Monolog\\LogRecord;\n\n/**\n * Base class for all mail handlers\n *\n * @author Gyula Sallai\n */\nabstract class MailHandler extends AbstractProcessingHandler\n{\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        $messages = [];\n\n        foreach ($records as $record) {\n            if ($record->level->isLowerThan($this->level)) {\n                continue;\n            }\n\n            $message = $this->processRecord($record);\n            $messages[] = $message;\n        }\n\n        if (\\count($messages) > 0) {\n            $this->send((string) $this->getFormatter()->formatBatch($messages), $messages);\n        }\n    }\n\n    /**\n     * Send a mail with the given content\n     *\n     * @param string $content formatted email body to be sent\n     * @param array  $records the array of log records that formed this content\n     *\n     * @phpstan-param non-empty-array<LogRecord> $records\n     */\n    abstract protected function send(string $content, array $records): void;\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $this->send((string) $record->formatted, [$record]);\n    }\n\n    /**\n     * @phpstan-param non-empty-array<LogRecord> $records\n     */\n    protected function getHighestRecord(array $records): LogRecord\n    {\n        $highestRecord = null;\n        foreach ($records as $record) {\n            if ($highestRecord === null || $record->level->isHigherThan($highestRecord->level)) {\n                $highestRecord = $record;\n            }\n        }\n\n        return $highestRecord;\n    }\n\n    protected function isHtmlBody(string $body): bool\n    {\n        return ($body[0] ?? null) === '<';\n    }\n\n    /**\n     * Gets the default formatter.\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new HtmlFormatter();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Swift;\nuse Swift_Message;\n\n/**\n * MandrillHandler uses cURL to send the emails to the Mandrill API\n *\n * @author Adam Nicholson <adamnicholson10@gmail.com>\n */\nclass MandrillHandler extends MailHandler\n{\n    protected Swift_Message $message;\n    protected string $apiKey;\n\n    /**\n     * @phpstan-param (Swift_Message|callable(): Swift_Message) $message\n     *\n     * @param string                 $apiKey  A valid Mandrill API key\n     * @param callable|Swift_Message $message An example message for real messages, only the body will be replaced\n     *\n     * @throws \\InvalidArgumentException if not a Swift Message is set\n     */\n    public function __construct(string $apiKey, callable|Swift_Message $message, int|string|Level $level = Level::Error, bool $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        if (!$message instanceof Swift_Message) {\n            $message = $message();\n        }\n        if (!$message instanceof Swift_Message) {\n            throw new \\InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it');\n        }\n        $this->message = $message;\n        $this->apiKey = $apiKey;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function send(string $content, array $records): void\n    {\n        $mime = 'text/plain';\n        if ($this->isHtmlBody($content)) {\n            $mime = 'text/html';\n        }\n\n        $message = clone $this->message;\n        $message->setBody($content, $mime);\n        /** @phpstan-ignore-next-line */\n        if (version_compare(Swift::VERSION, '6.0.0', '>=')) {\n            $message->setDate(new \\DateTimeImmutable());\n        } else {\n            /** @phpstan-ignore-next-line */\n            $message->setDate(time());\n        }\n\n        $ch = curl_init();\n\n        curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json');\n        curl_setopt($ch, CURLOPT_POST, 1);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([\n            'key' => $this->apiKey,\n            'raw_message' => (string) $message,\n            'async' => false,\n        ]));\n\n        Curl\\Util::execute($ch);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\n/**\n * Exception can be thrown if an extension for a handler is missing\n *\n * @author Christian Bergau <cbergau86@gmail.com>\n */\nclass MissingExtensionException extends \\Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse MongoDB\\Driver\\BulkWrite;\nuse MongoDB\\Driver\\Manager;\nuse MongoDB\\Client;\nuse Monolog\\Level;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\MongoDBFormatter;\nuse Monolog\\LogRecord;\n\n/**\n * Logs to a MongoDB database.\n *\n * Usage example:\n *\n *   $log = new \\Monolog\\Logger('application');\n *   $client = new \\MongoDB\\Client('mongodb://localhost:27017');\n *   $mongodb = new \\Monolog\\Handler\\MongoDBHandler($client, 'logs', 'prod');\n *   $log->pushHandler($mongodb);\n *\n * The above examples uses the MongoDB PHP library's client class; however, the\n * MongoDB\\Driver\\Manager class from ext-mongodb is also supported.\n */\nclass MongoDBHandler extends AbstractProcessingHandler\n{\n    private \\MongoDB\\Collection $collection;\n\n    private Client|Manager $manager;\n\n    private string|null $namespace = null;\n\n    /**\n     * Constructor.\n     *\n     * @param Client|Manager $mongodb    MongoDB library or driver client\n     * @param string         $database   Database name\n     * @param string         $collection Collection name\n     */\n    public function __construct(Client|Manager $mongodb, string $database, string $collection, int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        if ($mongodb instanceof Client) {\n            $this->collection = $mongodb->selectCollection($database, $collection);\n        } else {\n            $this->manager = $mongodb;\n            $this->namespace = $database . '.' . $collection;\n        }\n\n        parent::__construct($level, $bubble);\n    }\n\n    protected function write(LogRecord $record): void\n    {\n        if (isset($this->collection)) {\n            $this->collection->insertOne($record->formatted);\n        }\n\n        if (isset($this->manager, $this->namespace)) {\n            $bulk = new BulkWrite;\n            $bulk->insert($record->formatted);\n            $this->manager->executeBulkWrite($this->namespace, $bulk);\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new MongoDBFormatter;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Formatter\\LineFormatter;\n\n/**\n * NativeMailerHandler uses the mail() function to send the emails\n *\n * @author Christophe Coevoet <stof@notk.org>\n * @author Mark Garrett <mark@moderndeveloperllc.com>\n */\nclass NativeMailerHandler extends MailHandler\n{\n    /**\n     * The email addresses to which the message will be sent\n     * @var string[]\n     */\n    protected array $to;\n\n    /**\n     * The subject of the email\n     */\n    protected string $subject;\n\n    /**\n     * Optional headers for the message\n     * @var string[]\n     */\n    protected array $headers = [];\n\n    /**\n     * Optional parameters for the message\n     * @var string[]\n     */\n    protected array $parameters = [];\n\n    /**\n     * The wordwrap length for the message\n     */\n    protected int $maxColumnWidth;\n\n    /**\n     * The Content-type for the message\n     */\n    protected string|null $contentType = null;\n\n    /**\n     * The encoding for the message\n     */\n    protected string $encoding = 'utf-8';\n\n    /**\n     * @param string|string[] $to             The receiver of the mail\n     * @param string          $subject        The subject of the mail\n     * @param string          $from           The sender of the mail\n     * @param int             $maxColumnWidth The maximum column width that the message lines will have\n     */\n    public function __construct(string|array $to, string $subject, string $from, int|string|Level $level = Level::Error, bool $bubble = true, int $maxColumnWidth = 70)\n    {\n        parent::__construct($level, $bubble);\n        $this->to = (array) $to;\n        $this->subject = $subject;\n        $this->addHeader(sprintf('From: %s', $from));\n        $this->maxColumnWidth = $maxColumnWidth;\n    }\n\n    /**\n     * Add headers to the message\n     *\n     * @param string|string[] $headers Custom added headers\n     * @return $this\n     */\n    public function addHeader($headers): self\n    {\n        foreach ((array) $headers as $header) {\n            if (strpos($header, \"\\n\") !== false || strpos($header, \"\\r\") !== false) {\n                throw new \\InvalidArgumentException('Headers can not contain newline characters for security reasons');\n            }\n            $this->headers[] = $header;\n        }\n\n        return $this;\n    }\n\n    /**\n     * Add parameters to the message\n     *\n     * @param string|string[] $parameters Custom added parameters\n     * @return $this\n     */\n    public function addParameter($parameters): self\n    {\n        $this->parameters = array_merge($this->parameters, (array) $parameters);\n\n        return $this;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function send(string $content, array $records): void\n    {\n        $contentType = $this->getContentType() ?? ($this->isHtmlBody($content) ? 'text/html' : 'text/plain');\n\n        if ($contentType !== 'text/html') {\n            $content = wordwrap($content, $this->maxColumnWidth);\n        }\n\n        $headers = ltrim(implode(\"\\r\\n\", $this->headers) . \"\\r\\n\", \"\\r\\n\");\n        $headers .= 'Content-type: ' . $contentType . '; charset=' . $this->getEncoding() . \"\\r\\n\";\n        if ($contentType === 'text/html' && false === strpos($headers, 'MIME-Version:')) {\n            $headers .= 'MIME-Version: 1.0' . \"\\r\\n\";\n        }\n\n        $subjectFormatter = new LineFormatter($this->subject);\n        $subject = $subjectFormatter->format($this->getHighestRecord($records));\n\n        $parameters = implode(' ', $this->parameters);\n        foreach ($this->to as $to) {\n            mail($to, $subject, $content, $headers, $parameters);\n        }\n    }\n\n    public function getContentType(): ?string\n    {\n        return $this->contentType;\n    }\n\n    public function getEncoding(): string\n    {\n        return $this->encoding;\n    }\n\n    /**\n     * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML messages.\n     * @return $this\n     */\n    public function setContentType(string $contentType): self\n    {\n        if (strpos($contentType, \"\\n\") !== false || strpos($contentType, \"\\r\") !== false) {\n            throw new \\InvalidArgumentException('The content type can not contain newline characters to prevent email header injection');\n        }\n\n        $this->contentType = $contentType;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setEncoding(string $encoding): self\n    {\n        if (strpos($encoding, \"\\n\") !== false || strpos($encoding, \"\\r\") !== false) {\n            throw new \\InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection');\n        }\n\n        $this->encoding = $encoding;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\Formatter\\NormalizerFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Class to record a log on a NewRelic application.\n * Enabling New Relic High Security mode may prevent capture of useful information.\n *\n * This handler requires a NormalizerFormatter to function and expects an array in $record->formatted\n *\n * @see https://docs.newrelic.com/docs/agents/php-agent\n * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security\n */\nclass NewRelicHandler extends AbstractProcessingHandler\n{\n    /**\n     * @inheritDoc\n     */\n    public function __construct(\n        int|string|Level $level = Level::Error,\n        bool $bubble = true,\n\n        /**\n         * Name of the New Relic application that will receive logs from this handler.\n         */\n        protected string|null $appName = null,\n\n        /**\n         * Some context and extra data is passed into the handler as arrays of values. Do we send them as is\n         * (useful if we are using the API), or explode them for display on the NewRelic RPM website?\n         */\n        protected bool $explodeArrays = false,\n\n        /**\n         * Name of the current transaction\n         */\n        protected string|null $transactionName = null\n    ) {\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        if (!$this->isNewRelicEnabled()) {\n            throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler');\n        }\n\n        if (null !== ($appName = $this->getAppName($record->context))) {\n            $this->setNewRelicAppName($appName);\n        }\n\n        if (null !== ($transactionName = $this->getTransactionName($record->context))) {\n            $this->setNewRelicTransactionName($transactionName);\n            unset($record->formatted['context']['transaction_name']);\n        }\n\n        if (isset($record->context['exception']) && $record->context['exception'] instanceof \\Throwable) {\n            newrelic_notice_error($record->message, $record->context['exception']);\n            unset($record->formatted['context']['exception']);\n        } else {\n            newrelic_notice_error($record->message);\n        }\n\n        if (isset($record->formatted['context']) && is_array($record->formatted['context'])) {\n            foreach ($record->formatted['context'] as $key => $parameter) {\n                if (is_array($parameter) && $this->explodeArrays) {\n                    foreach ($parameter as $paramKey => $paramValue) {\n                        $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue);\n                    }\n                } else {\n                    $this->setNewRelicParameter('context_' . $key, $parameter);\n                }\n            }\n        }\n\n        if (isset($record->formatted['extra']) && is_array($record->formatted['extra'])) {\n            foreach ($record->formatted['extra'] as $key => $parameter) {\n                if (is_array($parameter) && $this->explodeArrays) {\n                    foreach ($parameter as $paramKey => $paramValue) {\n                        $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue);\n                    }\n                } else {\n                    $this->setNewRelicParameter('extra_' . $key, $parameter);\n                }\n            }\n        }\n    }\n\n    /**\n     * Checks whether the NewRelic extension is enabled in the system.\n     */\n    protected function isNewRelicEnabled(): bool\n    {\n        return extension_loaded('newrelic');\n    }\n\n    /**\n     * Returns the appname where this log should be sent. Each log can override the default appname, set in this\n     * handler's constructor, by providing the appname in it's context.\n     *\n     * @param mixed[] $context\n     */\n    protected function getAppName(array $context): ?string\n    {\n        if (isset($context['appname'])) {\n            return $context['appname'];\n        }\n\n        return $this->appName;\n    }\n\n    /**\n     * Returns the name of the current transaction. Each log can override the default transaction name, set in this\n     * handler's constructor, by providing the transaction_name in it's context\n     *\n     * @param mixed[] $context\n     */\n    protected function getTransactionName(array $context): ?string\n    {\n        if (isset($context['transaction_name'])) {\n            return $context['transaction_name'];\n        }\n\n        return $this->transactionName;\n    }\n\n    /**\n     * Sets the NewRelic application that should receive this log.\n     */\n    protected function setNewRelicAppName(string $appName): void\n    {\n        newrelic_set_appname($appName);\n    }\n\n    /**\n     * Overwrites the name of the current transaction\n     */\n    protected function setNewRelicTransactionName(string $transactionName): void\n    {\n        newrelic_name_transaction($transactionName);\n    }\n\n    /**\n     * @param mixed $value\n     */\n    protected function setNewRelicParameter(string $key, $value): void\n    {\n        if (null === $value || is_scalar($value)) {\n            newrelic_add_custom_parameter($key, $value);\n        } else {\n            newrelic_add_custom_parameter($key, Utils::jsonEncode($value, null, true));\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new NormalizerFormatter();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\LogRecord;\n\n/**\n * No-op\n *\n * This handler handles anything, but does nothing, and does not stop bubbling to the rest of the stack.\n * This can be used for testing, or to disable a handler when overriding a configuration without\n * influencing the rest of the stack.\n *\n * @author Roel Harbers <roelharbers@gmail.com>\n */\nclass NoopHandler extends Handler\n{\n    /**\n     * @inheritDoc\n     */\n    public function isHandling(LogRecord $record): bool\n    {\n        return true;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\Logger;\nuse Monolog\\LogRecord;\n\n/**\n * Blackhole\n *\n * Any record it can handle will be thrown away. This can be used\n * to put on top of an existing stack to override it temporarily.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass NullHandler extends Handler\n{\n    private Level $level;\n\n    /**\n     * @param string|int|Level $level The minimum logging level at which this handler will be triggered\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public function __construct(string|int|Level $level = Level::Debug)\n    {\n        $this->level = Logger::toMonologLevel($level);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function isHandling(LogRecord $record): bool\n    {\n        return $record->level->value >= $this->level->value;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        return $record->level->value >= $this->level->value;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Handler to only pass log messages when a certain threshold of number of messages is reached.\n *\n * This can be useful in cases of processing a batch of data, but you're for example only interested\n * in case it fails catastrophically instead of a warning for 1 or 2 events. Worse things can happen, right?\n *\n * Usage example:\n *\n * ```\n *   $log = new Logger('application');\n *   $handler = new SomeHandler(...)\n *\n *   // Pass all warnings to the handler when more than 10 & all error messages when more then 5\n *   $overflow = new OverflowHandler($handler, [Level::Warning->value => 10, Level::Error->value => 5]);\n *\n *   $log->pushHandler($overflow);\n *```\n *\n * @author Kris Buist <krisbuist@gmail.com>\n */\nclass OverflowHandler extends AbstractHandler implements FormattableHandlerInterface\n{\n    private HandlerInterface $handler;\n\n    /** @var array<int, int> */\n    private array $thresholdMap = [];\n\n    /**\n     * Buffer of all messages passed to the handler before the threshold was reached\n     *\n     * @var mixed[][]\n     */\n    private array $buffer = [];\n\n    /**\n     * @param array<int, int> $thresholdMap Dictionary of log level value => threshold\n     */\n    public function __construct(\n        HandlerInterface $handler,\n        array $thresholdMap = [],\n        $level = Level::Debug,\n        bool $bubble = true\n    ) {\n        $this->handler = $handler;\n        foreach ($thresholdMap as $thresholdLevel => $threshold) {\n            $this->thresholdMap[$thresholdLevel] = $threshold;\n        }\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * Handles a record.\n     *\n     * All records may be passed to this method, and the handler should discard\n     * those that it does not want to handle.\n     *\n     * The return value of this function controls the bubbling process of the handler stack.\n     * Unless the bubbling is interrupted (by returning true), the Logger class will keep on\n     * calling further handlers in the stack with a given log record.\n     *\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        if ($record->level->isLowerThan($this->level)) {\n            return false;\n        }\n\n        $level = $record->level->value;\n\n        if (!isset($this->thresholdMap[$level])) {\n            $this->thresholdMap[$level] = 0;\n        }\n\n        if ($this->thresholdMap[$level] > 0) {\n            // The overflow threshold is not yet reached, so we're buffering the record and lowering the threshold by 1\n            $this->thresholdMap[$level]--;\n            $this->buffer[$level][] = $record;\n\n            return false === $this->bubble;\n        }\n\n        if ($this->thresholdMap[$level] == 0) {\n            // This current message is breaking the threshold. Flush the buffer and continue handling the current record\n            foreach ($this->buffer[$level] ?? [] as $buffered) {\n                $this->handler->handle($buffered);\n            }\n            $this->thresholdMap[$level]--;\n            unset($this->buffer[$level]);\n        }\n\n        $this->handler->handle($record);\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        if ($this->handler instanceof FormattableHandlerInterface) {\n            $this->handler->setFormatter($formatter);\n\n            return $this;\n        }\n\n        throw new \\UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.');\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function getFormatter(): FormatterInterface\n    {\n        if ($this->handler instanceof FormattableHandlerInterface) {\n            return $this->handler->getFormatter();\n        }\n\n        throw new \\UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse PhpConsole\\Connector;\nuse PhpConsole\\Handler as VendorPhpConsoleHandler;\nuse PhpConsole\\Helper;\nuse Monolog\\LogRecord;\nuse PhpConsole\\Storage;\n\n/**\n * Monolog handler for Google Chrome extension \"PHP Console\"\n *\n * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely\n *\n * Usage:\n * 1. Install Google Chrome extension [now dead and removed from the chrome store]\n * 2. See overview https://github.com/barbushin/php-console#overview\n * 3. Install PHP Console library https://github.com/barbushin/php-console#installation\n * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png)\n *\n *      $logger = new \\Monolog\\Logger('all', array(new \\Monolog\\Handler\\PHPConsoleHandler()));\n *      \\Monolog\\ErrorHandler::register($logger);\n *      echo $undefinedVar;\n *      $logger->debug('SELECT * FROM users', array('db', 'time' => 0.012));\n *      PC::debug($_SERVER); // PHP Console debugger for any type of vars\n *\n * @author Sergey Barbushin https://www.linkedin.com/in/barbushin\n * @phpstan-type Options array{\n *     enabled: bool,\n *     classesPartialsTraceIgnore: string[],\n *     debugTagsKeysInContext: array<int|string>,\n *     useOwnErrorsHandler: bool,\n *     useOwnExceptionsHandler: bool,\n *     sourcesBasePath: string|null,\n *     registerHelper: bool,\n *     serverEncoding: string|null,\n *     headersLimit: int|null,\n *     password: string|null,\n *     enableSslOnlyMode: bool,\n *     ipMasks: string[],\n *     enableEvalListener: bool,\n *     dumperDetectCallbacks: bool,\n *     dumperLevelLimit: int,\n *     dumperItemsCountLimit: int,\n *     dumperItemSizeLimit: int,\n *     dumperDumpSizeLimit: int,\n *     detectDumpTraceAndSource: bool,\n *     dataStorage: Storage|null\n * }\n * @phpstan-type InputOptions array{\n *     enabled?: bool,\n *     classesPartialsTraceIgnore?: string[],\n *     debugTagsKeysInContext?: array<int|string>,\n *     useOwnErrorsHandler?: bool,\n *     useOwnExceptionsHandler?: bool,\n *     sourcesBasePath?: string|null,\n *     registerHelper?: bool,\n *     serverEncoding?: string|null,\n *     headersLimit?: int|null,\n *     password?: string|null,\n *     enableSslOnlyMode?: bool,\n *     ipMasks?: string[],\n *     enableEvalListener?: bool,\n *     dumperDetectCallbacks?: bool,\n *     dumperLevelLimit?: int,\n *     dumperItemsCountLimit?: int,\n *     dumperItemSizeLimit?: int,\n *     dumperDumpSizeLimit?: int,\n *     detectDumpTraceAndSource?: bool,\n *     dataStorage?: Storage|null\n * }\n *\n * @deprecated Since 2.8.0 and 3.2.0, PHPConsole is abandoned and thus we will drop this handler in Monolog 4\n */\nclass PHPConsoleHandler extends AbstractProcessingHandler\n{\n    /**\n     * @phpstan-var Options\n     */\n    private array $options = [\n        'enabled' => true, // bool Is PHP Console server enabled\n        'classesPartialsTraceIgnore' => ['Monolog\\\\'], // array Hide calls of classes started with...\n        'debugTagsKeysInContext' => [0, 'tag'], // bool Is PHP Console server enabled\n        'useOwnErrorsHandler' => false, // bool Enable errors handling\n        'useOwnExceptionsHandler' => false, // bool Enable exceptions handling\n        'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths\n        'registerHelper' => true, // bool Register PhpConsole\\Helper that allows short debug calls like PC::debug($var, 'ta.g.s')\n        'serverEncoding' => null, // string|null Server internal encoding\n        'headersLimit' => null, // int|null Set headers size limit for your web-server\n        'password' => null, // string|null Protect PHP Console connection by password\n        'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed\n        'ipMasks' => [], // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1')\n        'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required)\n        'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings\n        'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level\n        'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number\n        'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item\n        'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON\n        'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug\n        'dataStorage' => null, // \\PhpConsole\\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ)\n    ];\n\n    private Connector $connector;\n\n    /**\n     * @param  array<string, mixed> $options   See \\Monolog\\Handler\\PHPConsoleHandler::$options for more details\n     * @param  Connector|null       $connector Instance of \\PhpConsole\\Connector class (optional)\n     * @throws \\RuntimeException\n     * @phpstan-param InputOptions $options\n     */\n    public function __construct(array $options = [], ?Connector $connector = null, int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        if (!class_exists('PhpConsole\\Connector')) {\n            throw new \\RuntimeException('PHP Console library not found. See https://github.com/barbushin/php-console#installation');\n        }\n        parent::__construct($level, $bubble);\n        $this->options = $this->initOptions($options);\n        $this->connector = $this->initConnector($connector);\n    }\n\n    /**\n     * @param  array<string, mixed> $options\n     * @return array<string, mixed>\n     *\n     * @phpstan-param InputOptions $options\n     * @phpstan-return Options\n     */\n    private function initOptions(array $options): array\n    {\n        $wrongOptions = array_diff(array_keys($options), array_keys($this->options));\n        if (\\count($wrongOptions) > 0) {\n            throw new \\RuntimeException('Unknown options: ' . implode(', ', $wrongOptions));\n        }\n\n        return array_replace($this->options, $options);\n    }\n\n    private function initConnector(?Connector $connector = null): Connector\n    {\n        if (null === $connector) {\n            if ($this->options['dataStorage'] instanceof Storage) {\n                Connector::setPostponeStorage($this->options['dataStorage']);\n            }\n            $connector = Connector::getInstance();\n        }\n\n        if ($this->options['registerHelper'] && !Helper::isRegistered()) {\n            Helper::register();\n        }\n\n        if ($this->options['enabled'] && $connector->isActiveClient()) {\n            if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) {\n                $handler = VendorPhpConsoleHandler::getInstance();\n                $handler->setHandleErrors($this->options['useOwnErrorsHandler']);\n                $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']);\n                $handler->start();\n            }\n            if (null !== $this->options['sourcesBasePath']) {\n                $connector->setSourcesBasePath($this->options['sourcesBasePath']);\n            }\n            if (null !== $this->options['serverEncoding']) {\n                $connector->setServerEncoding($this->options['serverEncoding']);\n            }\n            if (null !== $this->options['password']) {\n                $connector->setPassword($this->options['password']);\n            }\n            if ($this->options['enableSslOnlyMode']) {\n                $connector->enableSslOnlyMode();\n            }\n            if (\\count($this->options['ipMasks']) > 0) {\n                $connector->setAllowedIpMasks($this->options['ipMasks']);\n            }\n            if (null !== $this->options['headersLimit'] && $this->options['headersLimit'] > 0) {\n                $connector->setHeadersLimit($this->options['headersLimit']);\n            }\n            if ($this->options['detectDumpTraceAndSource']) {\n                $connector->getDebugDispatcher()->detectTraceAndSource = true;\n            }\n            $dumper = $connector->getDumper();\n            $dumper->levelLimit = $this->options['dumperLevelLimit'];\n            $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit'];\n            $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit'];\n            $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit'];\n            $dumper->detectCallbacks = $this->options['dumperDetectCallbacks'];\n            if ($this->options['enableEvalListener']) {\n                $connector->startEvalRequestsListener();\n            }\n        }\n\n        return $connector;\n    }\n\n    public function getConnector(): Connector\n    {\n        return $this->connector;\n    }\n\n    /**\n     * @return array<string, mixed>\n     */\n    public function getOptions(): array\n    {\n        return $this->options;\n    }\n\n    public function handle(LogRecord $record): bool\n    {\n        if ($this->options['enabled'] && $this->connector->isActiveClient()) {\n            return parent::handle($record);\n        }\n\n        return !$this->bubble;\n    }\n\n    /**\n     * Writes the record down to the log of the implementing handler\n     */\n    protected function write(LogRecord $record): void\n    {\n        if ($record->level->isLowerThan(Level::Notice)) {\n            $this->handleDebugRecord($record);\n        } elseif (isset($record->context['exception']) && $record->context['exception'] instanceof \\Throwable) {\n            $this->handleExceptionRecord($record);\n        } else {\n            $this->handleErrorRecord($record);\n        }\n    }\n\n    private function handleDebugRecord(LogRecord $record): void\n    {\n        [$tags, $filteredContext] = $this->getRecordTags($record);\n        $message = $record->message;\n        if (\\count($filteredContext) > 0) {\n            $message .= ' ' . Utils::jsonEncode($this->connector->getDumper()->dump(array_filter($filteredContext)), null, true);\n        }\n        $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']);\n    }\n\n    private function handleExceptionRecord(LogRecord $record): void\n    {\n        $this->connector->getErrorsDispatcher()->dispatchException($record->context['exception']);\n    }\n\n    private function handleErrorRecord(LogRecord $record): void\n    {\n        $context = $record->context;\n\n        $this->connector->getErrorsDispatcher()->dispatchError(\n            $context['code'] ?? null,\n            $context['message'] ?? $record->message,\n            $context['file'] ?? null,\n            $context['line'] ?? null,\n            $this->options['classesPartialsTraceIgnore']\n        );\n    }\n\n    /**\n     * @return array{string, mixed[]}\n     */\n    private function getRecordTags(LogRecord $record): array\n    {\n        $tags = null;\n        $filteredContext = [];\n        if ($record->context !== []) {\n            $filteredContext = $record->context;\n            foreach ($this->options['debugTagsKeysInContext'] as $key) {\n                if (isset($filteredContext[$key])) {\n                    $tags = $filteredContext[$key];\n                    if ($key === 0) {\n                        array_shift($filteredContext);\n                    } else {\n                        unset($filteredContext[$key]);\n                    }\n                    break;\n                }\n            }\n        }\n\n        return [$tags ?? $record->level->toPsrLogLevel(), $filteredContext];\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new LineFormatter('%message%');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\n\n/**\n * Stores to STDIN of any process, specified by a command.\n *\n * Usage example:\n * <pre>\n * $log = new Logger('myLogger');\n * $log->pushHandler(new ProcessHandler('/usr/bin/php /var/www/monolog/someScript.php'));\n * </pre>\n *\n * @author Kolja Zuelsdorf <koljaz@web.de>\n */\nclass ProcessHandler extends AbstractProcessingHandler\n{\n    /**\n     * Holds the process to receive data on its STDIN.\n     *\n     * @var resource|bool|null\n     */\n    private $process;\n\n    private string $command;\n\n    private ?string $cwd;\n\n    /**\n     * @var resource[]\n     */\n    private array $pipes = [];\n\n    /**\n     * @var array<int, string[]>\n     */\n    protected const DESCRIPTOR_SPEC = [\n        0 => ['pipe', 'r'],  // STDIN is a pipe that the child will read from\n        1 => ['pipe', 'w'],  // STDOUT is a pipe that the child will write to\n        2 => ['pipe', 'w'],  // STDERR is a pipe to catch the any errors\n    ];\n\n    /**\n     * @param  string                    $command Command for the process to start. Absolute paths are recommended,\n     *                                            especially if you do not use the $cwd parameter.\n     * @param  string|null               $cwd     \"Current working directory\" (CWD) for the process to be executed in.\n     * @throws \\InvalidArgumentException\n     */\n    public function __construct(string $command, int|string|Level $level = Level::Debug, bool $bubble = true, ?string $cwd = null)\n    {\n        if ($command === '') {\n            throw new \\InvalidArgumentException('The command argument must be a non-empty string.');\n        }\n        if ($cwd === '') {\n            throw new \\InvalidArgumentException('The optional CWD argument must be a non-empty string or null.');\n        }\n\n        parent::__construct($level, $bubble);\n\n        $this->command = $command;\n        $this->cwd = $cwd;\n    }\n\n    /**\n     * Writes the record down to the log of the implementing handler\n     *\n     * @throws \\UnexpectedValueException\n     */\n    protected function write(LogRecord $record): void\n    {\n        $this->ensureProcessIsStarted();\n\n        $this->writeProcessInput($record->formatted);\n\n        $errors = $this->readProcessErrors();\n        if ($errors !== '') {\n            throw new \\UnexpectedValueException(sprintf('Errors while writing to process: %s', $errors));\n        }\n    }\n\n    /**\n     * Makes sure that the process is actually started, and if not, starts it,\n     * assigns the stream pipes, and handles startup errors, if any.\n     */\n    private function ensureProcessIsStarted(): void\n    {\n        if (is_resource($this->process) === false) {\n            $this->startProcess();\n\n            $this->handleStartupErrors();\n        }\n    }\n\n    /**\n     * Starts the actual process and sets all streams to non-blocking.\n     */\n    private function startProcess(): void\n    {\n        $this->process = proc_open($this->command, static::DESCRIPTOR_SPEC, $this->pipes, $this->cwd);\n\n        foreach ($this->pipes as $pipe) {\n            stream_set_blocking($pipe, false);\n        }\n    }\n\n    /**\n     * Selects the STDERR stream, handles upcoming startup errors, and throws an exception, if any.\n     *\n     * @throws \\UnexpectedValueException\n     */\n    private function handleStartupErrors(): void\n    {\n        $selected = $this->selectErrorStream();\n        if (false === $selected) {\n            throw new \\UnexpectedValueException('Something went wrong while selecting a stream.');\n        }\n\n        $errors = $this->readProcessErrors();\n\n        if (is_resource($this->process) === false || $errors !== '') {\n            throw new \\UnexpectedValueException(\n                sprintf('The process \"%s\" could not be opened: ' . $errors, $this->command)\n            );\n        }\n    }\n\n    /**\n     * Selects the STDERR stream.\n     *\n     * @return int|bool\n     */\n    protected function selectErrorStream()\n    {\n        $empty = [];\n        $errorPipes = [$this->pipes[2]];\n\n        return stream_select($errorPipes, $empty, $empty, 1);\n    }\n\n    /**\n     * Reads the errors of the process, if there are any.\n     *\n     * @codeCoverageIgnore\n     * @return string Empty string if there are no errors.\n     */\n    protected function readProcessErrors(): string\n    {\n        return (string) stream_get_contents($this->pipes[2]);\n    }\n\n    /**\n     * Writes to the input stream of the opened process.\n     *\n     * @codeCoverageIgnore\n     */\n    protected function writeProcessInput(string $string): void\n    {\n        fwrite($this->pipes[0], $string);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function close(): void\n    {\n        if (is_resource($this->process)) {\n            foreach ($this->pipes as $pipe) {\n                fclose($pipe);\n            }\n            proc_close($this->process);\n            $this->process = null;\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Processor\\ProcessorInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Interface to describe loggers that have processors\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\ninterface ProcessableHandlerInterface\n{\n    /**\n     * Adds a processor in the stack.\n     *\n     * @phpstan-param ProcessorInterface|(callable(LogRecord): LogRecord) $callback\n     *\n     * @param  ProcessorInterface|callable $callback\n     * @return HandlerInterface            self\n     */\n    public function pushProcessor(callable $callback): HandlerInterface;\n\n    /**\n     * Removes the processor on top of the stack and returns it.\n     *\n     * @phpstan-return ProcessorInterface|(callable(LogRecord): LogRecord) $callback\n     *\n     * @throws \\LogicException             In case the processor stack is empty\n     * @return callable|ProcessorInterface\n     */\n    public function popProcessor(): callable;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\ResettableInterface;\nuse Monolog\\Processor\\ProcessorInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Helper trait for implementing ProcessableInterface\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\ntrait ProcessableHandlerTrait\n{\n    /**\n     * @var callable[]\n     * @phpstan-var array<(callable(LogRecord): LogRecord)|ProcessorInterface>\n     */\n    protected array $processors = [];\n\n    /**\n     * @inheritDoc\n     */\n    public function pushProcessor(callable $callback): HandlerInterface\n    {\n        array_unshift($this->processors, $callback);\n\n        return $this;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function popProcessor(): callable\n    {\n        if (\\count($this->processors) === 0) {\n            throw new \\LogicException('You tried to pop from an empty processor stack.');\n        }\n\n        return array_shift($this->processors);\n    }\n\n    protected function processRecord(LogRecord $record): LogRecord\n    {\n        foreach ($this->processors as $processor) {\n            $record = $processor($record);\n        }\n\n        return $record;\n    }\n\n    protected function resetProcessors(): void\n    {\n        foreach ($this->processors as $processor) {\n            if ($processor instanceof ResettableInterface) {\n                $processor->reset();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Psr\\Log\\LoggerInterface;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Proxies log messages to an existing PSR-3 compliant logger.\n *\n * If a formatter is configured, the formatter's output MUST be a string and the\n * formatted message will be fed to the wrapped PSR logger instead of the original\n * log record's message.\n *\n * @author Michael Moussa <michael.moussa@gmail.com>\n */\nclass PsrHandler extends AbstractHandler implements FormattableHandlerInterface\n{\n    /**\n     * PSR-3 compliant logger\n     */\n    protected LoggerInterface $logger;\n\n    protected FormatterInterface|null $formatter = null;\n    private bool $includeExtra;\n\n    /**\n     * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied\n     */\n    public function __construct(LoggerInterface $logger, int|string|Level $level = Level::Debug, bool $bubble = true, bool $includeExtra = false)\n    {\n        parent::__construct($level, $bubble);\n\n        $this->logger = $logger;\n        $this->includeExtra = $includeExtra;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        if (!$this->isHandling($record)) {\n            return false;\n        }\n\n        $message = $this->formatter !== null\n            ? (string) $this->formatter->format($record)\n            : $record->message;\n\n        $context = $this->includeExtra\n            ? [...$record->extra, ...$record->context]\n            : $record->context;\n\n        $this->logger->log($record->level->toPsrLogLevel(), $message, $context);\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * Sets the formatter.\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        $this->formatter = $formatter;\n\n        return $this;\n    }\n\n    /**\n     * Gets the formatter.\n     */\n    public function getFormatter(): FormatterInterface\n    {\n        if ($this->formatter === null) {\n            throw new \\LogicException('No formatter has been set and this handler does not have a default formatter');\n        }\n\n        return $this->formatter;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Monolog\\Utils;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\LogRecord;\n\n/**\n * Sends notifications through the pushover api to mobile phones\n *\n * @author Sebastian Göttschkes <sebastian.goettschkes@googlemail.com>\n * @see    https://www.pushover.net/api\n */\nclass PushoverHandler extends SocketHandler\n{\n    private string $token;\n\n    /** @var array<int|string> */\n    private array $users;\n\n    private string $title;\n\n    private string|int|null $user = null;\n\n    private int $retry;\n\n    private int $expire;\n\n    private Level $highPriorityLevel;\n\n    private Level $emergencyLevel;\n\n    private bool $useFormattedMessage = false;\n\n    /**\n     * All parameters that can be sent to Pushover\n     * @see https://pushover.net/api\n     * @var array<string, bool>\n     */\n    private array $parameterNames = [\n        'token' => true,\n        'user' => true,\n        'message' => true,\n        'device' => true,\n        'title' => true,\n        'url' => true,\n        'url_title' => true,\n        'priority' => true,\n        'timestamp' => true,\n        'sound' => true,\n        'retry' => true,\n        'expire' => true,\n        'callback' => true,\n    ];\n\n    /**\n     * Sounds the api supports by default\n     * @see https://pushover.net/api#sounds\n     * @var string[]\n     */\n    private array $sounds = [\n        'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming',\n        'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb',\n        'persistent', 'echo', 'updown', 'none',\n    ];\n\n    /**\n     * @param string       $token  Pushover api token\n     * @param string|array $users  Pushover user id or array of ids the message will be sent to\n     * @param string|null  $title  Title sent to the Pushover API\n     * @param bool         $useSSL Whether to connect via SSL. Required when pushing messages to users that are not\n     *                             the pushover.net app owner. OpenSSL is required for this option.\n     * @param int          $retry  The retry parameter specifies how often (in seconds) the Pushover servers will\n     *                             send the same notification to the user.\n     * @param int          $expire The expire parameter specifies how many seconds your notification will continue\n     *                             to be retried for (every retry seconds).\n     *\n     * @param int|string|Level|LogLevel::* $highPriorityLevel The minimum logging level at which this handler will start\n     *                                                                  sending \"high priority\" requests to the Pushover API\n     * @param int|string|Level|LogLevel::* $emergencyLevel    The minimum logging level at which this handler will start\n     *                                                                  sending \"emergency\" requests to the Pushover API\n     *\n     *\n     * @phpstan-param string|array<int|string>    $users\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $highPriorityLevel\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $emergencyLevel\n     */\n    public function __construct(\n        string $token,\n        $users,\n        ?string $title = null,\n        int|string|Level $level = Level::Critical,\n        bool $bubble = true,\n        bool $useSSL = true,\n        int|string|Level $highPriorityLevel = Level::Critical,\n        int|string|Level $emergencyLevel = Level::Emergency,\n        int $retry = 30,\n        int $expire = 25200,\n        bool $persistent = false,\n        float $timeout = 0.0,\n        float $writingTimeout = 10.0,\n        ?float $connectionTimeout = null,\n        ?int $chunkSize = null\n    ) {\n        $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80';\n        parent::__construct(\n            $connectionString,\n            $level,\n            $bubble,\n            $persistent,\n            $timeout,\n            $writingTimeout,\n            $connectionTimeout,\n            $chunkSize\n        );\n\n        $this->token = $token;\n        $this->users = (array) $users;\n        $this->title = $title ?? (string) gethostname();\n        $this->highPriorityLevel = Logger::toMonologLevel($highPriorityLevel);\n        $this->emergencyLevel = Logger::toMonologLevel($emergencyLevel);\n        $this->retry = $retry;\n        $this->expire = $expire;\n    }\n\n    protected function generateDataStream(LogRecord $record): string\n    {\n        $content = $this->buildContent($record);\n\n        return $this->buildHeader($content) . $content;\n    }\n\n    private function buildContent(LogRecord $record): string\n    {\n        // Pushover has a limit of 512 characters on title and message combined.\n        $maxMessageLength = 512 - strlen($this->title);\n\n        $message = ($this->useFormattedMessage) ? $record->formatted : $record->message;\n        $message = Utils::substr($message, 0, $maxMessageLength);\n\n        $timestamp = $record->datetime->getTimestamp();\n\n        $dataArray = [\n            'token' => $this->token,\n            'user' => $this->user,\n            'message' => $message,\n            'title' => $this->title,\n            'timestamp' => $timestamp,\n        ];\n\n        if ($record->level->value >= $this->emergencyLevel->value) {\n            $dataArray['priority'] = 2;\n            $dataArray['retry'] = $this->retry;\n            $dataArray['expire'] = $this->expire;\n        } elseif ($record->level->value >= $this->highPriorityLevel->value) {\n            $dataArray['priority'] = 1;\n        }\n\n        // First determine the available parameters\n        $context = array_intersect_key($record->context, $this->parameterNames);\n        $extra = array_intersect_key($record->extra, $this->parameterNames);\n\n        // Least important info should be merged with subsequent info\n        $dataArray = array_merge($extra, $context, $dataArray);\n\n        // Only pass sounds that are supported by the API\n        if (isset($dataArray['sound']) && !in_array($dataArray['sound'], $this->sounds, true)) {\n            unset($dataArray['sound']);\n        }\n\n        return http_build_query($dataArray);\n    }\n\n    private function buildHeader(string $content): string\n    {\n        $header = \"POST /1/messages.json HTTP/1.1\\r\\n\";\n        $header .= \"Host: api.pushover.net\\r\\n\";\n        $header .= \"Content-Type: application/x-www-form-urlencoded\\r\\n\";\n        $header .= \"Content-Length: \" . strlen($content) . \"\\r\\n\";\n        $header .= \"\\r\\n\";\n\n        return $header;\n    }\n\n    protected function write(LogRecord $record): void\n    {\n        foreach ($this->users as $user) {\n            $this->user = $user;\n\n            parent::write($record);\n            $this->closeSocket();\n        }\n\n        $this->user = null;\n    }\n\n    /**\n     * @param int|string|Level|LogLevel::* $level\n     * @return $this\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public function setHighPriorityLevel(int|string|Level $level): self\n    {\n        $this->highPriorityLevel = Logger::toMonologLevel($level);\n\n        return $this;\n    }\n\n    /**\n     * @param int|string|Level|LogLevel::* $level\n     * @return $this\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public function setEmergencyLevel(int|string|Level $level): self\n    {\n        $this->emergencyLevel = Logger::toMonologLevel($level);\n\n        return $this;\n    }\n\n    /**\n     * Use the formatted message?\n     *\n     * @return $this\n     */\n    public function useFormattedMessage(bool $useFormattedMessage): self\n    {\n        $this->useFormattedMessage = $useFormattedMessage;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\nuse Predis\\Client as Predis;\nuse Redis;\n\n/**\n * Logs to a Redis key using rpush\n *\n * usage example:\n *\n *   $log = new Logger('application');\n *   $redis = new RedisHandler(new Predis\\Client(\"tcp://localhost:6379\"), \"logs\", \"prod\");\n *   $log->pushHandler($redis);\n *\n * @author Thomas Tourlourat <thomas@tourlourat.com>\n */\nclass RedisHandler extends AbstractProcessingHandler\n{\n    /** @var Predis<Predis>|Redis */\n    private Predis|Redis $redisClient;\n    private string $redisKey;\n    protected int $capSize;\n\n    /**\n     * @param Predis<Predis>|Redis $redis   The redis instance\n     * @param string               $key     The key name to push records to\n     * @param int                  $capSize Number of entries to limit list size to, 0 = unlimited\n     */\n    public function __construct(Predis|Redis $redis, string $key, int|string|Level $level = Level::Debug, bool $bubble = true, int $capSize = 0)\n    {\n        $this->redisClient = $redis;\n        $this->redisKey = $key;\n        $this->capSize = $capSize;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        if ($this->capSize > 0) {\n            $this->writeCapped($record);\n        } else {\n            $this->redisClient->rpush($this->redisKey, $record->formatted);\n        }\n    }\n\n    /**\n     * Write and cap the collection\n     * Writes the record to the redis list and caps its\n     */\n    protected function writeCapped(LogRecord $record): void\n    {\n        if ($this->redisClient instanceof Redis) {\n            $mode = defined('Redis::MULTI') ? Redis::MULTI : 1;\n            $this->redisClient->multi($mode)\n                ->rPush($this->redisKey, $record->formatted)\n                ->lTrim($this->redisKey, -$this->capSize, -1)\n                ->exec();\n        } else {\n            $redisKey = $this->redisKey;\n            $capSize = $this->capSize;\n            $this->redisClient->transaction(function ($tx) use ($record, $redisKey, $capSize) {\n                $tx->rpush($redisKey, $record->formatted);\n                $tx->ltrim($redisKey, -$capSize, -1);\n            });\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new LineFormatter();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\nuse Predis\\Client as Predis;\nuse Redis;\n\n/**\n * Sends the message to a Redis Pub/Sub channel using PUBLISH\n *\n * usage example:\n *\n *   $log = new Logger('application');\n *   $redis = new RedisPubSubHandler(new Predis\\Client(\"tcp://localhost:6379\"), \"logs\", Level::Warning);\n *   $log->pushHandler($redis);\n *\n * @author Gaëtan Faugère <gaetan@fauge.re>\n */\nclass RedisPubSubHandler extends AbstractProcessingHandler\n{\n    /** @var Predis<Predis>|Redis */\n    private Predis|Redis $redisClient;\n    private string $channelKey;\n\n    /**\n     * @param Predis<Predis>|Redis $redis The redis instance\n     * @param string               $key   The channel key to publish records to\n     */\n    public function __construct(Predis|Redis $redis, string $key, int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        $this->redisClient = $redis;\n        $this->channelKey = $key;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $this->redisClient->publish($this->channelKey, $record->formatted);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function getDefaultFormatter(): FormatterInterface\n    {\n        return new LineFormatter();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Rollbar\\RollbarLogger;\nuse Throwable;\nuse Monolog\\LogRecord;\n\n/**\n * Sends errors to Rollbar\n *\n * If the context data contains a `payload` key, that is used as an array\n * of payload options to RollbarLogger's log method.\n *\n * Rollbar's context info will contain the context + extra keys from the log record\n * merged, and then on top of that a few keys:\n *\n *  - level (rollbar level name)\n *  - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8)\n *  - channel\n *  - datetime (unix timestamp)\n *\n * @author Paul Statezny <paulstatezny@gmail.com>\n */\nclass RollbarHandler extends AbstractProcessingHandler\n{\n    protected RollbarLogger $rollbarLogger;\n\n    /**\n     * Records whether any log records have been added since the last flush of the rollbar notifier\n     */\n    private bool $hasRecords = false;\n\n    protected bool $initialized = false;\n\n    /**\n     * @param RollbarLogger $rollbarLogger RollbarLogger object constructed with valid token\n     */\n    public function __construct(RollbarLogger $rollbarLogger, int|string|Level $level = Level::Error, bool $bubble = true)\n    {\n        $this->rollbarLogger = $rollbarLogger;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * Translates Monolog log levels to Rollbar levels.\n     *\n     * @return 'debug'|'info'|'warning'|'error'|'critical'\n     */\n    protected function toRollbarLevel(Level $level): string\n    {\n        return match ($level) {\n            Level::Debug     => 'debug',\n            Level::Info      => 'info',\n            Level::Notice    => 'info',\n            Level::Warning   => 'warning',\n            Level::Error     => 'error',\n            Level::Critical  => 'critical',\n            Level::Alert     => 'critical',\n            Level::Emergency => 'critical',\n        };\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        if (!$this->initialized) {\n            // __destructor() doesn't get called on Fatal errors\n            register_shutdown_function([$this, 'close']);\n            $this->initialized = true;\n        }\n\n        $context = $record->context;\n        $context = array_merge($context, $record->extra, [\n            'level' => $this->toRollbarLevel($record->level),\n            'monolog_level' => $record->level->getName(),\n            'channel' => $record->channel,\n            'datetime' => $record->datetime->format('U'),\n        ]);\n\n        if (isset($context['exception']) && $context['exception'] instanceof Throwable) {\n            $exception = $context['exception'];\n            unset($context['exception']);\n            $toLog = $exception;\n        } else {\n            $toLog = $record->message;\n        }\n\n        // @phpstan-ignore-next-line\n        $this->rollbarLogger->log($context['level'], $toLog, $context);\n\n        $this->hasRecords = true;\n    }\n\n    public function flush(): void\n    {\n        if ($this->hasRecords) {\n            $this->rollbarLogger->flush();\n            $this->hasRecords = false;\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function close(): void\n    {\n        $this->flush();\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function reset(): void\n    {\n        $this->flush();\n\n        parent::reset();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse InvalidArgumentException;\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Stores logs to files that are rotated every day and a limited number of files are kept.\n *\n * This rotation is only intended to be used as a workaround. Using logrotate to\n * handle the rotation is strongly encouraged when you can use it.\n *\n * @author Christophe Coevoet <stof@notk.org>\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass RotatingFileHandler extends StreamHandler\n{\n    public const FILE_PER_DAY = 'Y-m-d';\n    public const FILE_PER_MONTH = 'Y-m';\n    public const FILE_PER_YEAR = 'Y';\n\n    protected string $filename;\n    protected int $maxFiles;\n    protected bool|null $mustRotate = null;\n    protected \\DateTimeImmutable $nextRotation;\n    protected string $filenameFormat;\n    protected string $dateFormat;\n\n    /**\n     * @param int      $maxFiles       The maximal amount of files to keep (0 means unlimited)\n     * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write)\n     * @param bool     $useLocking     Try to lock log file before doing any writes\n     */\n    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}')\n    {\n        $this->filename = Utils::canonicalizePath($filename);\n        $this->maxFiles = $maxFiles;\n        $this->setFilenameFormat($filenameFormat, $dateFormat);\n        $this->nextRotation = $this->getNextRotation();\n\n        parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function close(): void\n    {\n        parent::close();\n\n        if (true === $this->mustRotate) {\n            $this->rotate();\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function reset(): void\n    {\n        parent::reset();\n\n        if (true === $this->mustRotate) {\n            $this->rotate();\n        }\n    }\n\n    /**\n     * @return $this\n     */\n    public function setFilenameFormat(string $filenameFormat, string $dateFormat): self\n    {\n        $this->setDateFormat($dateFormat);\n        if (substr_count($filenameFormat, '{date}') === 0) {\n            throw new InvalidArgumentException(\n                'Invalid filename format - format must contain at least `{date}`, because otherwise rotating is impossible.'\n            );\n        }\n        $this->filenameFormat = $filenameFormat;\n        $this->url = $this->getTimedFilename();\n        $this->close();\n\n        return $this;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        // on the first record written, if the log is new, we should rotate (once per day)\n        if (null === $this->mustRotate) {\n            $this->mustRotate = null === $this->url || !file_exists($this->url);\n        }\n\n        if ($this->nextRotation <= $record->datetime) {\n            $this->mustRotate = true;\n            $this->close();\n        }\n\n        parent::write($record);\n    }\n\n    /**\n     * Rotates the files.\n     */\n    protected function rotate(): void\n    {\n        // update filename\n        $this->url = $this->getTimedFilename();\n        $this->nextRotation = $this->getNextRotation();\n\n        // skip GC of old logs if files are unlimited\n        if (0 === $this->maxFiles) {\n            return;\n        }\n\n        $logFiles = glob($this->getGlobPattern());\n        if (false === $logFiles) {\n            // failed to glob\n            return;\n        }\n\n        if ($this->maxFiles >= count($logFiles)) {\n            // no files to remove\n            return;\n        }\n\n        // Sorting the files by name to remove the older ones\n        usort($logFiles, function ($a, $b) {\n            return strcmp($b, $a);\n        });\n\n        foreach (array_slice($logFiles, $this->maxFiles) as $file) {\n            if (is_writable($file)) {\n                // suppress errors here as unlink() might fail if two processes\n                // are cleaning up/rotating at the same time\n                set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline): bool {\n                    return false;\n                });\n                unlink($file);\n                restore_error_handler();\n            }\n        }\n\n        $this->mustRotate = false;\n    }\n\n    protected function getTimedFilename(): string\n    {\n        $fileInfo = pathinfo($this->filename);\n        $timedFilename = str_replace(\n            ['{filename}', '{date}'],\n            [$fileInfo['filename'], date($this->dateFormat)],\n            ($fileInfo['dirname'] ?? '') . '/' . $this->filenameFormat\n        );\n\n        if (isset($fileInfo['extension'])) {\n            $timedFilename .= '.'.$fileInfo['extension'];\n        }\n\n        return $timedFilename;\n    }\n\n    protected function getGlobPattern(): string\n    {\n        $fileInfo = pathinfo($this->filename);\n        $glob = str_replace(\n            ['{filename}', '{date}'],\n            [$fileInfo['filename'], str_replace(\n                ['Y', 'y', 'm', 'd'],\n                ['[0-9][0-9][0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]'],\n                $this->dateFormat)\n            ],\n            ($fileInfo['dirname'] ?? '') . '/' . $this->filenameFormat\n        );\n        if (isset($fileInfo['extension'])) {\n            $glob .= '.'.$fileInfo['extension'];\n        }\n\n        return $glob;\n    }\n\n    protected function setDateFormat(string $dateFormat): void\n    {\n        if (0 === preg_match('{^[Yy](([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) {\n            throw new InvalidArgumentException(\n                'Invalid date format - format must be one of '.\n                'RotatingFileHandler::FILE_PER_DAY (\"Y-m-d\"), RotatingFileHandler::FILE_PER_MONTH (\"Y-m\") '.\n                'or RotatingFileHandler::FILE_PER_YEAR (\"Y\"), or you can set one of the '.\n                'date formats using slashes, underscores and/or dots instead of dashes.'\n            );\n        }\n        $this->dateFormat = $dateFormat;\n    }\n\n    protected function getNextRotation(): \\DateTimeImmutable\n    {\n        return match (str_replace(['/','_','.'], '-', $this->dateFormat)) {\n            self::FILE_PER_MONTH => (new \\DateTimeImmutable('first day of next month'))->setTime(0, 0, 0),\n            self::FILE_PER_YEAR => (new \\DateTimeImmutable('first day of January next year'))->setTime(0, 0, 0),\n            default => (new \\DateTimeImmutable('tomorrow'))->setTime(0, 0, 0),\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Closure;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Sampling handler\n *\n * A sampled event stream can be useful for logging high frequency events in\n * a production environment where you only need an idea of what is happening\n * and are not concerned with capturing every occurrence. Since the decision to\n * handle or not handle a particular event is determined randomly, the\n * resulting sampled log is not guaranteed to contain 1/N of the events that\n * occurred in the application, but based on the Law of large numbers, it will\n * tend to be close to this ratio with a large number of attempts.\n *\n * @author Bryan Davis <bd808@wikimedia.org>\n * @author Kunal Mehta <legoktm@gmail.com>\n */\nclass SamplingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface\n{\n    use ProcessableHandlerTrait;\n\n    /**\n     * Handler or factory Closure($record, $this)\n     *\n     * @phpstan-var (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface\n     */\n    protected Closure|HandlerInterface $handler;\n\n    protected int $factor;\n\n    /**\n     * @phpstan-param (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface $handler\n     *\n     * @param Closure|HandlerInterface $handler Handler or factory Closure($record|null, $samplingHandler).\n     * @param int                      $factor  Sample factor (e.g. 10 means every ~10th record is sampled)\n     */\n    public function __construct(Closure|HandlerInterface $handler, int $factor)\n    {\n        parent::__construct();\n        $this->handler = $handler;\n        $this->factor = $factor;\n    }\n\n    public function isHandling(LogRecord $record): bool\n    {\n        return $this->getHandler($record)->isHandling($record);\n    }\n\n    public function handle(LogRecord $record): bool\n    {\n        if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) {\n            if (\\count($this->processors) > 0) {\n                $record = $this->processRecord($record);\n            }\n\n            $this->getHandler($record)->handle($record);\n        }\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * Return the nested handler\n     *\n     * If the handler was provided as a factory, this will trigger the handler's instantiation.\n     */\n    public function getHandler(LogRecord|null $record = null): HandlerInterface\n    {\n        if (!$this->handler instanceof HandlerInterface) {\n            $handler = ($this->handler)($record, $this);\n            if (!$handler instanceof HandlerInterface) {\n                throw new \\RuntimeException(\"The factory Closure should return a HandlerInterface\");\n            }\n            $this->handler = $handler;\n        }\n\n        return $this->handler;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        $handler = $this->getHandler();\n        if ($handler instanceof FormattableHandlerInterface) {\n            $handler->setFormatter($formatter);\n\n            return $this;\n        }\n\n        throw new \\UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function getFormatter(): FormatterInterface\n    {\n        $handler = $this->getHandler();\n        if ($handler instanceof FormattableHandlerInterface) {\n            return $handler->getFormatter();\n        }\n\n        throw new \\UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\n\n/**\n * SendGridrHandler uses the SendGrid API v2 function to send Log emails, more information in https://sendgrid.com/docs/API_Reference/Web_API/mail.html\n *\n * @author Ricardo Fontanelli <ricardo.fontanelli@hotmail.com>\n */\nclass SendGridHandler extends MailHandler\n{\n    /**\n     * The SendGrid API User\n     */\n    protected string $apiUser;\n\n    /**\n     * The SendGrid API Key\n     */\n    protected string $apiKey;\n\n    /**\n     * The email addresses to which the message will be sent\n     */\n    protected string $from;\n\n    /**\n     * The email addresses to which the message will be sent\n     * @var string[]\n     */\n    protected array $to;\n\n    /**\n     * The subject of the email\n     */\n    protected string $subject;\n\n    /**\n     * @param string          $apiUser The SendGrid API User\n     * @param string          $apiKey  The SendGrid API Key\n     * @param string          $from    The sender of the email\n     * @param string|string[] $to      The recipients of the email\n     * @param string          $subject The subject of the mail\n     *\n     * @throws MissingExtensionException If the curl extension is missing\n     */\n    public function __construct(string $apiUser, string $apiKey, string $from, string|array $to, string $subject, int|string|Level $level = Level::Error, bool $bubble = true)\n    {\n        if (!extension_loaded('curl')) {\n            throw new MissingExtensionException('The curl extension is needed to use the SendGridHandler');\n        }\n\n        parent::__construct($level, $bubble);\n        $this->apiUser = $apiUser;\n        $this->apiKey = $apiKey;\n        $this->from = $from;\n        $this->to = (array) $to;\n        $this->subject = $subject;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function send(string $content, array $records): void\n    {\n        $message = [];\n        $message['api_user'] = $this->apiUser;\n        $message['api_key'] = $this->apiKey;\n        $message['from'] = $this->from;\n        foreach ($this->to as $recipient) {\n            $message['to[]'] = $recipient;\n        }\n        $message['subject'] = $this->subject;\n        $message['date'] = date('r');\n\n        if ($this->isHtmlBody($content)) {\n            $message['html'] = $content;\n        } else {\n            $message['text'] = $content;\n        }\n\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, 'https://api.sendgrid.com/api/mail.send.json');\n        curl_setopt($ch, CURLOPT_POST, 1);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($message));\n        Curl\\Util::execute($ch, 2);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\Slack;\n\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\Formatter\\NormalizerFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Slack record utility helping to log to Slack webhooks or API.\n *\n * @author Greg Kedzierski <greg@gregkedzierski.com>\n * @author Haralan Dobrev <hkdobrev@gmail.com>\n * @see    https://api.slack.com/incoming-webhooks\n * @see    https://api.slack.com/docs/message-attachments\n */\nclass SlackRecord\n{\n    public const COLOR_DANGER = 'danger';\n\n    public const COLOR_WARNING = 'warning';\n\n    public const COLOR_GOOD = 'good';\n\n    public const COLOR_DEFAULT = '#e3e4e6';\n\n    /**\n     * Slack channel (encoded ID or name)\n     */\n    private string|null $channel;\n\n    /**\n     * Name of a bot\n     */\n    private string|null $username;\n\n    /**\n     * User icon e.g. 'ghost', 'http://example.com/user.png'\n     */\n    private string|null $userIcon;\n\n    /**\n     * Whether the message should be added to Slack as attachment (plain text otherwise)\n     */\n    private bool $useAttachment;\n\n    /**\n     * Whether the the context/extra messages added to Slack as attachments are in a short style\n     */\n    private bool $useShortAttachment;\n\n    /**\n     * Whether the attachment should include context and extra data\n     */\n    private bool $includeContextAndExtra;\n\n    /**\n     * Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']\n     * @var string[]\n     */\n    private array $excludeFields;\n\n    private FormatterInterface|null $formatter;\n\n    private NormalizerFormatter $normalizerFormatter;\n\n    /**\n     * @param string[] $excludeFields\n     */\n    public function __construct(\n        ?string $channel = null,\n        ?string $username = null,\n        bool $useAttachment = true,\n        ?string $userIcon = null,\n        bool $useShortAttachment = false,\n        bool $includeContextAndExtra = false,\n        array $excludeFields = [],\n        FormatterInterface|null $formatter = null\n    ) {\n        $this\n            ->setChannel($channel)\n            ->setUsername($username)\n            ->useAttachment($useAttachment)\n            ->setUserIcon($userIcon)\n            ->useShortAttachment($useShortAttachment)\n            ->includeContextAndExtra($includeContextAndExtra)\n            ->excludeFields($excludeFields)\n            ->setFormatter($formatter);\n\n        if ($this->includeContextAndExtra) {\n            $this->normalizerFormatter = new NormalizerFormatter();\n        }\n    }\n\n    /**\n     * Returns required data in format that Slack\n     * is expecting.\n     *\n     * @phpstan-return mixed[]\n     */\n    public function getSlackData(LogRecord $record): array\n    {\n        $dataArray = [];\n\n        if ($this->username !== null) {\n            $dataArray['username'] = $this->username;\n        }\n\n        if ($this->channel !== null) {\n            $dataArray['channel'] = $this->channel;\n        }\n\n        if ($this->formatter !== null && !$this->useAttachment) {\n            $message = $this->formatter->format($record);\n        } else {\n            $message = $record->message;\n        }\n\n        $recordData = $this->removeExcludedFields($record);\n\n        if ($this->useAttachment) {\n            $attachment = [\n                'fallback'  => $message,\n                'text'      => $message,\n                'color'     => $this->getAttachmentColor($record->level),\n                'fields'    => [],\n                'mrkdwn_in' => ['fields'],\n                'ts'        => $recordData['datetime']->getTimestamp(),\n                'footer'      => $this->username,\n                'footer_icon' => $this->userIcon,\n            ];\n\n            if ($this->useShortAttachment) {\n                $attachment['title'] = $recordData['level_name'];\n            } else {\n                $attachment['title'] = 'Message';\n                $attachment['fields'][] = $this->generateAttachmentField('Level', $recordData['level_name']);\n            }\n\n            if ($this->includeContextAndExtra) {\n                foreach (['extra', 'context'] as $key) {\n                    if (!isset($recordData[$key]) || \\count($recordData[$key]) === 0) {\n                        continue;\n                    }\n\n                    if ($this->useShortAttachment) {\n                        $attachment['fields'][] = $this->generateAttachmentField(\n                            $key,\n                            $recordData[$key]\n                        );\n                    } else {\n                        // Add all extra fields as individual fields in attachment\n                        $attachment['fields'] = array_merge(\n                            $attachment['fields'],\n                            $this->generateAttachmentFields($recordData[$key])\n                        );\n                    }\n                }\n            }\n\n            $dataArray['attachments'] = [$attachment];\n        } else {\n            $dataArray['text'] = $message;\n        }\n\n        if ($this->userIcon !== null) {\n            if (false !== ($iconUrl = filter_var($this->userIcon, FILTER_VALIDATE_URL))) {\n                $dataArray['icon_url'] = $iconUrl;\n            } else {\n                $dataArray['icon_emoji'] = \":{$this->userIcon}:\";\n            }\n        }\n\n        return $dataArray;\n    }\n\n    /**\n     * Returns a Slack message attachment color associated with\n     * provided level.\n     */\n    public function getAttachmentColor(Level $level): string\n    {\n        return match ($level) {\n            Level::Error, Level::Critical, Level::Alert, Level::Emergency => static::COLOR_DANGER,\n            Level::Warning => static::COLOR_WARNING,\n            Level::Info, Level::Notice => static::COLOR_GOOD,\n            Level::Debug => static::COLOR_DEFAULT\n        };\n    }\n\n    /**\n     * Stringifies an array of key/value pairs to be used in attachment fields\n     *\n     * @param mixed[] $fields\n     */\n    public function stringify(array $fields): string\n    {\n        /** @var array<mixed> $normalized */\n        $normalized = $this->normalizerFormatter->normalizeValue($fields);\n\n        $hasSecondDimension = \\count(array_filter($normalized, 'is_array')) > 0;\n        $hasOnlyNonNumericKeys = \\count(array_filter(array_keys($normalized), 'is_numeric')) === 0;\n\n        return $hasSecondDimension || $hasOnlyNonNumericKeys\n            ? Utils::jsonEncode($normalized, JSON_PRETTY_PRINT|Utils::DEFAULT_JSON_FLAGS)\n            : Utils::jsonEncode($normalized, Utils::DEFAULT_JSON_FLAGS);\n    }\n\n    /**\n     * Channel used by the bot when posting\n     *\n     * @param ?string $channel\n     * @return $this\n     */\n    public function setChannel(?string $channel = null): self\n    {\n        $this->channel = $channel;\n\n        return $this;\n    }\n\n    /**\n     * Username used by the bot when posting\n     *\n     * @param ?string $username\n     * @return $this\n     */\n    public function setUsername(?string $username = null): self\n    {\n        $this->username = $username;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function useAttachment(bool $useAttachment = true): self\n    {\n        $this->useAttachment = $useAttachment;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setUserIcon(?string $userIcon = null): self\n    {\n        $this->userIcon = $userIcon;\n\n        if (\\is_string($userIcon)) {\n            $this->userIcon = trim($userIcon, ':');\n        }\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function useShortAttachment(bool $useShortAttachment = false): self\n    {\n        $this->useShortAttachment = $useShortAttachment;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function includeContextAndExtra(bool $includeContextAndExtra = false): self\n    {\n        $this->includeContextAndExtra = $includeContextAndExtra;\n\n        if ($this->includeContextAndExtra) {\n            $this->normalizerFormatter = new NormalizerFormatter();\n        }\n\n        return $this;\n    }\n\n    /**\n     * @param string[] $excludeFields\n     * @return $this\n     */\n    public function excludeFields(array $excludeFields = []): self\n    {\n        $this->excludeFields = $excludeFields;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setFormatter(?FormatterInterface $formatter = null): self\n    {\n        $this->formatter = $formatter;\n\n        return $this;\n    }\n\n    /**\n     * Generates attachment field\n     *\n     * @param string|mixed[] $value\n     *\n     * @return array{title: string, value: string, short: false}\n     */\n    private function generateAttachmentField(string $title, $value): array\n    {\n        $value = is_array($value)\n            ? sprintf('```%s```', substr($this->stringify($value), 0, 1990))\n            : $value;\n\n        return [\n            'title' => ucfirst($title),\n            'value' => $value,\n            'short' => false,\n        ];\n    }\n\n    /**\n     * Generates a collection of attachment fields from array\n     *\n     * @param mixed[] $data\n     *\n     * @return array<array{title: string, value: string, short: false}>\n     */\n    private function generateAttachmentFields(array $data): array\n    {\n        /** @var array<mixed> $normalized */\n        $normalized = $this->normalizerFormatter->normalizeValue($data);\n\n        $fields = [];\n        foreach ($normalized as $key => $value) {\n            $fields[] = $this->generateAttachmentField((string) $key, $value);\n        }\n\n        return $fields;\n    }\n\n    /**\n     * Get a copy of record with fields excluded according to $this->excludeFields\n     *\n     * @return mixed[]\n     */\n    private function removeExcludedFields(LogRecord $record): array\n    {\n        $recordData = $record->toArray();\n        foreach ($this->excludeFields as $field) {\n            $keys = explode('.', $field);\n            $node = &$recordData;\n            $lastKey = end($keys);\n            foreach ($keys as $key) {\n                if (!isset($node[$key])) {\n                    break;\n                }\n                if ($lastKey === $key) {\n                    unset($node[$key]);\n                    break;\n                }\n                $node = &$node[$key];\n            }\n        }\n\n        return $recordData;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\Handler\\Slack\\SlackRecord;\nuse Monolog\\LogRecord;\n\n/**\n * Sends notifications through Slack API\n *\n * @author Greg Kedzierski <greg@gregkedzierski.com>\n * @see    https://api.slack.com/\n */\nclass SlackHandler extends SocketHandler\n{\n    /**\n     * Slack API token\n     */\n    private string $token;\n\n    /**\n     * Instance of the SlackRecord util class preparing data for Slack API.\n     */\n    private SlackRecord $slackRecord;\n\n    /**\n     * @param  string                    $token                  Slack API token\n     * @param  string                    $channel                Slack channel (encoded ID or name)\n     * @param  string|null               $username               Name of a bot\n     * @param  bool                      $useAttachment          Whether the message should be added to Slack as attachment (plain text otherwise)\n     * @param  string|null               $iconEmoji              The emoji name to use (or null)\n     * @param  bool                      $useShortAttachment     Whether the context/extra messages added to Slack as attachments are in a short style\n     * @param  bool                      $includeContextAndExtra Whether the attachment should include context and extra data\n     * @param  string[]                  $excludeFields          Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']\n     * @throws MissingExtensionException If no OpenSSL PHP extension configured\n     */\n    public function __construct(\n        string $token,\n        string $channel,\n        ?string $username = null,\n        bool $useAttachment = true,\n        ?string $iconEmoji = null,\n        $level = Level::Critical,\n        bool $bubble = true,\n        bool $useShortAttachment = false,\n        bool $includeContextAndExtra = false,\n        array $excludeFields = [],\n        bool $persistent = false,\n        float $timeout = 0.0,\n        float $writingTimeout = 10.0,\n        ?float $connectionTimeout = null,\n        ?int $chunkSize = null\n    ) {\n        if (!extension_loaded('openssl')) {\n            throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler');\n        }\n\n        parent::__construct(\n            'ssl://slack.com:443',\n            $level,\n            $bubble,\n            $persistent,\n            $timeout,\n            $writingTimeout,\n            $connectionTimeout,\n            $chunkSize\n        );\n\n        $this->slackRecord = new SlackRecord(\n            $channel,\n            $username,\n            $useAttachment,\n            $iconEmoji,\n            $useShortAttachment,\n            $includeContextAndExtra,\n            $excludeFields\n        );\n\n        $this->token = $token;\n    }\n\n    public function getSlackRecord(): SlackRecord\n    {\n        return $this->slackRecord;\n    }\n\n    public function getToken(): string\n    {\n        return $this->token;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function generateDataStream(LogRecord $record): string\n    {\n        $content = $this->buildContent($record);\n\n        return $this->buildHeader($content) . $content;\n    }\n\n    /**\n     * Builds the body of API call\n     */\n    private function buildContent(LogRecord $record): string\n    {\n        $dataArray = $this->prepareContentData($record);\n\n        return http_build_query($dataArray);\n    }\n\n    /**\n     * @return string[]\n     */\n    protected function prepareContentData(LogRecord $record): array\n    {\n        $dataArray = $this->slackRecord->getSlackData($record);\n        $dataArray['token'] = $this->token;\n\n        if (isset($dataArray['attachments']) && is_array($dataArray['attachments']) && \\count($dataArray['attachments']) > 0) {\n            $dataArray['attachments'] = Utils::jsonEncode($dataArray['attachments']);\n        }\n\n        return $dataArray;\n    }\n\n    /**\n     * Builds the header of the API Call\n     */\n    private function buildHeader(string $content): string\n    {\n        $header = \"POST /api/chat.postMessage HTTP/1.1\\r\\n\";\n        $header .= \"Host: slack.com\\r\\n\";\n        $header .= \"Content-Type: application/x-www-form-urlencoded\\r\\n\";\n        $header .= \"Content-Length: \" . strlen($content) . \"\\r\\n\";\n        $header .= \"\\r\\n\";\n\n        return $header;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        parent::write($record);\n        $this->finalizeWrite();\n    }\n\n    /**\n     * Finalizes the request by reading some bytes and then closing the socket\n     *\n     * If we do not read some but close the socket too early, slack sometimes\n     * drops the request entirely.\n     */\n    protected function finalizeWrite(): void\n    {\n        $res = $this->getResource();\n        if (is_resource($res)) {\n            @fread($res, 2048);\n        }\n        $this->closeSocket();\n    }\n\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        parent::setFormatter($formatter);\n        $this->slackRecord->setFormatter($formatter);\n\n        return $this;\n    }\n\n    public function getFormatter(): FormatterInterface\n    {\n        $formatter = parent::getFormatter();\n        $this->slackRecord->setFormatter($formatter);\n\n        return $formatter;\n    }\n\n    /**\n     * Channel used by the bot when posting\n     *\n     * @return $this\n     */\n    public function setChannel(string $channel): self\n    {\n        $this->slackRecord->setChannel($channel);\n\n        return $this;\n    }\n\n    /**\n     * Username used by the bot when posting\n     *\n     * @return $this\n     */\n    public function setUsername(string $username): self\n    {\n        $this->slackRecord->setUsername($username);\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function useAttachment(bool $useAttachment): self\n    {\n        $this->slackRecord->useAttachment($useAttachment);\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setIconEmoji(string $iconEmoji): self\n    {\n        $this->slackRecord->setUserIcon($iconEmoji);\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function useShortAttachment(bool $useShortAttachment): self\n    {\n        $this->slackRecord->useShortAttachment($useShortAttachment);\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function includeContextAndExtra(bool $includeContextAndExtra): self\n    {\n        $this->slackRecord->includeContextAndExtra($includeContextAndExtra);\n\n        return $this;\n    }\n\n    /**\n     * @param string[] $excludeFields\n     * @return $this\n     */\n    public function excludeFields(array $excludeFields): self\n    {\n        $this->slackRecord->excludeFields($excludeFields);\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\Handler\\Slack\\SlackRecord;\nuse Monolog\\LogRecord;\n\n/**\n * Sends notifications through Slack Webhooks\n *\n * @author Haralan Dobrev <hkdobrev@gmail.com>\n * @see    https://api.slack.com/incoming-webhooks\n */\nclass SlackWebhookHandler extends AbstractProcessingHandler\n{\n    /**\n     * Slack Webhook token\n     */\n    private string $webhookUrl;\n\n    /**\n     * Instance of the SlackRecord util class preparing data for Slack API.\n     */\n    private SlackRecord $slackRecord;\n\n    /**\n     * @param string      $webhookUrl             Slack Webhook URL\n     * @param string|null $channel                Slack channel (encoded ID or name)\n     * @param string|null $username               Name of a bot\n     * @param bool        $useAttachment          Whether the message should be added to Slack as attachment (plain text otherwise)\n     * @param string|null $iconEmoji              The emoji name to use (or null)\n     * @param bool        $useShortAttachment     Whether the the context/extra messages added to Slack as attachments are in a short style\n     * @param bool        $includeContextAndExtra Whether the attachment should include context and extra data\n     * @param string[]    $excludeFields          Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']\n     *\n     * @throws MissingExtensionException If the curl extension is missing\n     */\n    public function __construct(\n        string $webhookUrl,\n        ?string $channel = null,\n        ?string $username = null,\n        bool $useAttachment = true,\n        ?string $iconEmoji = null,\n        bool $useShortAttachment = false,\n        bool $includeContextAndExtra = false,\n        $level = Level::Critical,\n        bool $bubble = true,\n        array $excludeFields = []\n    ) {\n        if (!extension_loaded('curl')) {\n            throw new MissingExtensionException('The curl extension is needed to use the SlackWebhookHandler');\n        }\n\n        parent::__construct($level, $bubble);\n\n        $this->webhookUrl = $webhookUrl;\n\n        $this->slackRecord = new SlackRecord(\n            $channel,\n            $username,\n            $useAttachment,\n            $iconEmoji,\n            $useShortAttachment,\n            $includeContextAndExtra,\n            $excludeFields\n        );\n    }\n\n    public function getSlackRecord(): SlackRecord\n    {\n        return $this->slackRecord;\n    }\n\n    public function getWebhookUrl(): string\n    {\n        return $this->webhookUrl;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $postData = $this->slackRecord->getSlackData($record);\n        $postString = Utils::jsonEncode($postData);\n\n        $ch = curl_init();\n        $options = [\n            CURLOPT_URL => $this->webhookUrl,\n            CURLOPT_POST => true,\n            CURLOPT_RETURNTRANSFER => true,\n            CURLOPT_HTTPHEADER => ['Content-type: application/json'],\n            CURLOPT_POSTFIELDS => $postString,\n        ];\n\n        curl_setopt_array($ch, $options);\n\n        Curl\\Util::execute($ch);\n    }\n\n    public function setFormatter(FormatterInterface $formatter): HandlerInterface\n    {\n        parent::setFormatter($formatter);\n        $this->slackRecord->setFormatter($formatter);\n\n        return $this;\n    }\n\n    public function getFormatter(): FormatterInterface\n    {\n        $formatter = parent::getFormatter();\n        $this->slackRecord->setFormatter($formatter);\n\n        return $formatter;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\n\n/**\n * Stores to any socket - uses fsockopen() or pfsockopen().\n *\n * @author Pablo de Leon Belloc <pablolb@gmail.com>\n * @see    http://php.net/manual/en/function.fsockopen.php\n */\nclass SocketHandler extends AbstractProcessingHandler\n{\n    private string $connectionString;\n    private float $connectionTimeout;\n    /** @var resource|null */\n    private $resource;\n    private float $timeout;\n    private float $writingTimeout;\n    private int|null $lastSentBytes = null;\n    private int|null $chunkSize;\n    private bool $persistent;\n    private int|null $errno = null;\n    private string|null $errstr = null;\n    private float|null $lastWritingAt = null;\n\n    /**\n     * @param string     $connectionString  Socket connection string\n     * @param bool       $persistent        Flag to enable/disable persistent connections\n     * @param float      $timeout           Socket timeout to wait until the request is being aborted\n     * @param float      $writingTimeout    Socket timeout to wait until the request should've been sent/written\n     * @param float|null $connectionTimeout Socket connect timeout to wait until the connection should've been\n     *                                      established\n     * @param int|null   $chunkSize         Sets the chunk size. Only has effect during connection in the writing cycle\n     *\n     * @throws \\InvalidArgumentException If an invalid timeout value (less than 0) is passed.\n     */\n    public function __construct(\n        string $connectionString,\n        $level = Level::Debug,\n        bool $bubble = true,\n        bool $persistent = false,\n        float $timeout = 0.0,\n        float $writingTimeout = 10.0,\n        ?float $connectionTimeout = null,\n        ?int $chunkSize = null\n    ) {\n        parent::__construct($level, $bubble);\n        $this->connectionString = $connectionString;\n\n        if ($connectionTimeout !== null) {\n            $this->validateTimeout($connectionTimeout);\n        }\n\n        $this->connectionTimeout = $connectionTimeout ?? (float) ini_get('default_socket_timeout');\n        $this->persistent = $persistent;\n        $this->validateTimeout($timeout);\n        $this->timeout = $timeout;\n        $this->validateTimeout($writingTimeout);\n        $this->writingTimeout = $writingTimeout;\n        $this->chunkSize = $chunkSize;\n    }\n\n    /**\n     * Connect (if necessary) and write to the socket\n     *\n     * @inheritDoc\n     *\n     * @throws \\UnexpectedValueException\n     * @throws \\RuntimeException\n     */\n    protected function write(LogRecord $record): void\n    {\n        $this->connectIfNotConnected();\n        $data = $this->generateDataStream($record);\n        $this->writeToSocket($data);\n    }\n\n    /**\n     * We will not close a PersistentSocket instance so it can be reused in other requests.\n     */\n    public function close(): void\n    {\n        if (!$this->isPersistent()) {\n            $this->closeSocket();\n        }\n    }\n\n    /**\n     * Close socket, if open\n     */\n    public function closeSocket(): void\n    {\n        if (is_resource($this->resource)) {\n            fclose($this->resource);\n            $this->resource = null;\n        }\n    }\n\n    /**\n     * Set socket connection to be persistent. It only has effect before the connection is initiated.\n     *\n     * @return $this\n     */\n    public function setPersistent(bool $persistent): self\n    {\n        $this->persistent = $persistent;\n\n        return $this;\n    }\n\n    /**\n     * Set connection timeout.  Only has effect before we connect.\n     *\n     * @see http://php.net/manual/en/function.fsockopen.php\n     * @return $this\n     */\n    public function setConnectionTimeout(float $seconds): self\n    {\n        $this->validateTimeout($seconds);\n        $this->connectionTimeout = $seconds;\n\n        return $this;\n    }\n\n    /**\n     * Set write timeout. Only has effect before we connect.\n     *\n     * @see http://php.net/manual/en/function.stream-set-timeout.php\n     * @return $this\n     */\n    public function setTimeout(float $seconds): self\n    {\n        $this->validateTimeout($seconds);\n        $this->timeout = $seconds;\n\n        return $this;\n    }\n\n    /**\n     * Set writing timeout. Only has effect during connection in the writing cycle.\n     *\n     * @param float $seconds 0 for no timeout\n     * @return $this\n     */\n    public function setWritingTimeout(float $seconds): self\n    {\n        $this->validateTimeout($seconds);\n        $this->writingTimeout = $seconds;\n\n        return $this;\n    }\n\n    /**\n     * Set chunk size. Only has effect during connection in the writing cycle.\n     *\n     * @return $this\n     */\n    public function setChunkSize(int $bytes): self\n    {\n        $this->chunkSize = $bytes;\n\n        return $this;\n    }\n\n    /**\n     * Get current connection string\n     */\n    public function getConnectionString(): string\n    {\n        return $this->connectionString;\n    }\n\n    /**\n     * Get persistent setting\n     */\n    public function isPersistent(): bool\n    {\n        return $this->persistent;\n    }\n\n    /**\n     * Get current connection timeout setting\n     */\n    public function getConnectionTimeout(): float\n    {\n        return $this->connectionTimeout;\n    }\n\n    /**\n     * Get current in-transfer timeout\n     */\n    public function getTimeout(): float\n    {\n        return $this->timeout;\n    }\n\n    /**\n     * Get current local writing timeout\n     */\n    public function getWritingTimeout(): float\n    {\n        return $this->writingTimeout;\n    }\n\n    /**\n     * Get current chunk size\n     */\n    public function getChunkSize(): ?int\n    {\n        return $this->chunkSize;\n    }\n\n    /**\n     * Check to see if the socket is currently available.\n     *\n     * UDP might appear to be connected but might fail when writing.  See http://php.net/fsockopen for details.\n     */\n    public function isConnected(): bool\n    {\n        return is_resource($this->resource)\n            && !feof($this->resource);  // on TCP - other party can close connection.\n    }\n\n    /**\n     * Wrapper to allow mocking\n     *\n     * @return resource|false\n     */\n    protected function pfsockopen()\n    {\n        return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout);\n    }\n\n    /**\n     * Wrapper to allow mocking\n     *\n     * @return resource|false\n     */\n    protected function fsockopen()\n    {\n        return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout);\n    }\n\n    /**\n     * Wrapper to allow mocking\n     *\n     * @see http://php.net/manual/en/function.stream-set-timeout.php\n     */\n    protected function streamSetTimeout(): bool\n    {\n        $seconds = floor($this->timeout);\n        $microseconds = round(($this->timeout - $seconds) * 1e6);\n\n        if (!is_resource($this->resource)) {\n            throw new \\LogicException('streamSetTimeout called but $this->resource is not a resource');\n        }\n\n        return stream_set_timeout($this->resource, (int) $seconds, (int) $microseconds);\n    }\n\n    /**\n     * Wrapper to allow mocking\n     *\n     * @see http://php.net/manual/en/function.stream-set-chunk-size.php\n     *\n     * @return int|false\n     */\n    protected function streamSetChunkSize(): int|bool\n    {\n        if (!is_resource($this->resource)) {\n            throw new \\LogicException('streamSetChunkSize called but $this->resource is not a resource');\n        }\n\n        if (null === $this->chunkSize) {\n            throw new \\LogicException('streamSetChunkSize called but $this->chunkSize is not set');\n        }\n\n        return stream_set_chunk_size($this->resource, $this->chunkSize);\n    }\n\n    /**\n     * Wrapper to allow mocking\n     *\n     * @return int|false\n     */\n    protected function fwrite(string $data): int|bool\n    {\n        if (!is_resource($this->resource)) {\n            throw new \\LogicException('fwrite called but $this->resource is not a resource');\n        }\n\n        return @fwrite($this->resource, $data);\n    }\n\n    /**\n     * Wrapper to allow mocking\n     *\n     * @return mixed[]|bool\n     */\n    protected function streamGetMetadata(): array|bool\n    {\n        if (!is_resource($this->resource)) {\n            throw new \\LogicException('streamGetMetadata called but $this->resource is not a resource');\n        }\n\n        return stream_get_meta_data($this->resource);\n    }\n\n    private function validateTimeout(float $value): void\n    {\n        if ($value < 0) {\n            throw new \\InvalidArgumentException(\"Timeout must be 0 or a positive float (got $value)\");\n        }\n    }\n\n    private function connectIfNotConnected(): void\n    {\n        if ($this->isConnected()) {\n            return;\n        }\n        $this->connect();\n    }\n\n    protected function generateDataStream(LogRecord $record): string\n    {\n        return (string) $record->formatted;\n    }\n\n    /**\n     * @return resource|null\n     */\n    protected function getResource()\n    {\n        return $this->resource;\n    }\n\n    private function connect(): void\n    {\n        $this->createSocketResource();\n        $this->setSocketTimeout();\n        $this->setStreamChunkSize();\n    }\n\n    private function createSocketResource(): void\n    {\n        if ($this->isPersistent()) {\n            $resource = $this->pfsockopen();\n        } else {\n            $resource = $this->fsockopen();\n        }\n        if (is_bool($resource)) {\n            throw new \\UnexpectedValueException(\"Failed connecting to $this->connectionString ($this->errno: $this->errstr)\");\n        }\n        $this->resource = $resource;\n    }\n\n    private function setSocketTimeout(): void\n    {\n        if (!$this->streamSetTimeout()) {\n            throw new \\UnexpectedValueException(\"Failed setting timeout with stream_set_timeout()\");\n        }\n    }\n\n    private function setStreamChunkSize(): void\n    {\n        if (null !== $this->chunkSize && false === $this->streamSetChunkSize()) {\n            throw new \\UnexpectedValueException(\"Failed setting chunk size with stream_set_chunk_size()\");\n        }\n    }\n\n    private function writeToSocket(string $data): void\n    {\n        $length = strlen($data);\n        $sent = 0;\n        $this->lastSentBytes = $sent;\n        while ($this->isConnected() && $sent < $length) {\n            if (0 == $sent) {\n                $chunk = $this->fwrite($data);\n            } else {\n                $chunk = $this->fwrite(substr($data, $sent));\n            }\n            if ($chunk === false) {\n                throw new \\RuntimeException(\"Could not write to socket\");\n            }\n            $sent += $chunk;\n            $socketInfo = $this->streamGetMetadata();\n            if (is_array($socketInfo) && (bool) $socketInfo['timed_out']) {\n                throw new \\RuntimeException(\"Write timed-out\");\n            }\n\n            if ($this->writingIsTimedOut($sent)) {\n                throw new \\RuntimeException(\"Write timed-out, no data sent for `{$this->writingTimeout}` seconds, probably we got disconnected (sent $sent of $length)\");\n            }\n        }\n        if (!$this->isConnected() && $sent < $length) {\n            throw new \\RuntimeException(\"End-of-file reached, probably we got disconnected (sent $sent of $length)\");\n        }\n    }\n\n    private function writingIsTimedOut(int $sent): bool\n    {\n        // convert to ms\n        if (0.0 == $this->writingTimeout) {\n            return false;\n        }\n\n        if ($sent !== $this->lastSentBytes) {\n            $this->lastWritingAt = microtime(true);\n            $this->lastSentBytes = $sent;\n\n            return false;\n        } else {\n            usleep(100);\n        }\n\n        if ((microtime(true) - (float) $this->lastWritingAt) >= $this->writingTimeout) {\n            $this->closeSocket();\n\n            return true;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Aws\\Sqs\\SqsClient;\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Writes to any sqs queue.\n *\n * @author Martijn van Calker <git@amvc.nl>\n */\nclass SqsHandler extends AbstractProcessingHandler\n{\n    /** 256 KB in bytes - maximum message size in SQS */\n    protected const MAX_MESSAGE_SIZE = 262144;\n    /** 100 KB in bytes - head message size for new error log */\n    protected const HEAD_MESSAGE_SIZE = 102400;\n\n    private SqsClient $client;\n    private string $queueUrl;\n\n    public function __construct(SqsClient $sqsClient, string $queueUrl, int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        $this->client = $sqsClient;\n        $this->queueUrl = $queueUrl;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        if (!isset($record->formatted) || 'string' !== gettype($record->formatted)) {\n            throw new \\InvalidArgumentException('SqsHandler accepts only formatted records as a string' . Utils::getRecordMessageForException($record));\n        }\n\n        $messageBody = $record->formatted;\n        if (strlen($messageBody) >= static::MAX_MESSAGE_SIZE) {\n            $messageBody = Utils::substr($messageBody, 0, static::HEAD_MESSAGE_SIZE);\n        }\n\n        $this->client->sendMessage([\n            'QueueUrl' => $this->queueUrl,\n            'MessageBody' => $messageBody,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Stores to any stream resource\n *\n * Can be used to store into php://stderr, remote and local files, etc.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass StreamHandler extends AbstractProcessingHandler\n{\n    protected const MAX_CHUNK_SIZE = 2147483647;\n    /** 10MB */\n    protected const DEFAULT_CHUNK_SIZE = 10 * 1024 * 1024;\n    protected int $streamChunkSize;\n    /** @var resource|null */\n    protected $stream;\n    protected string|null $url = null;\n    private string|null $errorMessage = null;\n    protected int|null $filePermission;\n    protected bool $useLocking;\n    /** @var true|null */\n    private bool|null $dirCreated = null;\n\n    /**\n     * @param resource|string $stream         If a missing path can't be created, an UnexpectedValueException will be thrown on first write\n     * @param int|null        $filePermission Optional file permissions (default (0644) are only for owner read/write)\n     * @param bool            $useLocking     Try to lock log file before doing any writes\n     *\n     * @throws \\InvalidArgumentException If stream is not a resource or string\n     */\n    public function __construct($stream, int|string|Level $level = Level::Debug, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false)\n    {\n        parent::__construct($level, $bubble);\n\n        if (($phpMemoryLimit = Utils::expandIniShorthandBytes(ini_get('memory_limit'))) !== false) {\n            if ($phpMemoryLimit > 0) {\n                // use max 10% of allowed memory for the chunk size, and at least 100KB\n                $this->streamChunkSize = min(static::MAX_CHUNK_SIZE, max((int) ($phpMemoryLimit / 10), 100 * 1024));\n            } else {\n                // memory is unlimited, set to the default 10MB\n                $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE;\n            }\n        } else {\n            // no memory limit information, set to the default 10MB\n            $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE;\n        }\n\n        if (is_resource($stream)) {\n            $this->stream = $stream;\n\n            stream_set_chunk_size($this->stream, $this->streamChunkSize);\n        } elseif (is_string($stream)) {\n            $this->url = Utils::canonicalizePath($stream);\n        } else {\n            throw new \\InvalidArgumentException('A stream must either be a resource or a string.');\n        }\n\n        $this->filePermission = $filePermission;\n        $this->useLocking = $useLocking;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function close(): void\n    {\n        if (null !== $this->url && is_resource($this->stream)) {\n            fclose($this->stream);\n        }\n        $this->stream = null;\n        $this->dirCreated = null;\n    }\n\n    /**\n     * Return the currently active stream if it is open\n     *\n     * @return resource|null\n     */\n    public function getStream()\n    {\n        return $this->stream;\n    }\n\n    /**\n     * Return the stream URL if it was configured with a URL and not an active resource\n     */\n    public function getUrl(): ?string\n    {\n        return $this->url;\n    }\n\n    public function getStreamChunkSize(): int\n    {\n        return $this->streamChunkSize;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        if (!is_resource($this->stream)) {\n            $url = $this->url;\n            if (null === $url || '' === $url) {\n                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));\n            }\n            $this->createDir($url);\n            $this->errorMessage = null;\n            set_error_handler([$this, 'customErrorHandler']);\n            try {\n                $stream = fopen($url, 'a');\n                if ($this->filePermission !== null) {\n                    @chmod($url, $this->filePermission);\n                }\n            } finally {\n                restore_error_handler();\n            }\n            if (!is_resource($stream)) {\n                $this->stream = null;\n\n                throw new \\UnexpectedValueException(sprintf('The stream or file \"%s\" could not be opened in append mode: '.$this->errorMessage, $url) . Utils::getRecordMessageForException($record));\n            }\n            stream_set_chunk_size($stream, $this->streamChunkSize);\n            $this->stream = $stream;\n        }\n\n        $stream = $this->stream;\n        if ($this->useLocking) {\n            // ignoring errors here, there's not much we can do about them\n            flock($stream, LOCK_EX);\n        }\n\n        $this->streamWrite($stream, $record);\n\n        if ($this->useLocking) {\n            flock($stream, LOCK_UN);\n        }\n    }\n\n    /**\n     * Write to stream\n     * @param resource $stream\n     */\n    protected function streamWrite($stream, LogRecord $record): void\n    {\n        fwrite($stream, (string) $record->formatted);\n    }\n\n    private function customErrorHandler(int $code, string $msg): bool\n    {\n        $this->errorMessage = preg_replace('{^(fopen|mkdir)\\(.*?\\): }', '', $msg);\n\n        return true;\n    }\n\n    private function getDirFromStream(string $stream): ?string\n    {\n        $pos = strpos($stream, '://');\n        if ($pos === false) {\n            return dirname($stream);\n        }\n\n        if ('file://' === substr($stream, 0, 7)) {\n            return dirname(substr($stream, 7));\n        }\n\n        return null;\n    }\n\n    private function createDir(string $url): void\n    {\n        // Do not try to create dir if it has already been tried.\n        if (true === $this->dirCreated) {\n            return;\n        }\n\n        $dir = $this->getDirFromStream($url);\n        if (null !== $dir && !is_dir($dir)) {\n            $this->errorMessage = null;\n            set_error_handler([$this, 'customErrorHandler']);\n            $status = mkdir($dir, 0777, true);\n            restore_error_handler();\n            if (false === $status && !is_dir($dir) && strpos((string) $this->errorMessage, 'File exists') === false) {\n                throw new \\UnexpectedValueException(sprintf('There is no existing directory at \"%s\" and it could not be created: '.$this->errorMessage, $dir));\n            }\n        }\n        $this->dirCreated = true;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Closure;\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Monolog\\LogRecord;\nuse Monolog\\Utils;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\LineFormatter;\nuse Symfony\\Component\\Mailer\\MailerInterface;\nuse Symfony\\Component\\Mailer\\Transport\\TransportInterface;\nuse Symfony\\Component\\Mime\\Email;\n\n/**\n * SymfonyMailerHandler uses Symfony's Mailer component to send the emails\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass SymfonyMailerHandler extends MailHandler\n{\n    protected MailerInterface|TransportInterface $mailer;\n    /** @var Email|Closure(string, LogRecord[]): Email */\n    private Email|Closure $emailTemplate;\n\n    /**\n     * @phpstan-param Email|Closure(string, LogRecord[]): Email $email\n     *\n     * @param MailerInterface|TransportInterface $mailer The mailer to use\n     * @param Closure|Email                      $email  An email template, the subject/body will be replaced\n     */\n    public function __construct($mailer, Email|Closure $email, int|string|Level $level = Level::Error, bool $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        $this->mailer = $mailer;\n        $this->emailTemplate = $email;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function send(string $content, array $records): void\n    {\n        $this->mailer->send($this->buildMessage($content, $records));\n    }\n\n    /**\n     * Gets the formatter for the Swift_Message subject.\n     *\n     * @param string|null $format The format of the subject\n     */\n    protected function getSubjectFormatter(?string $format): FormatterInterface\n    {\n        return new LineFormatter($format);\n    }\n\n    /**\n     * Creates instance of Email to be sent\n     *\n     * @param  string      $content formatted email body to be sent\n     * @param  LogRecord[] $records Log records that formed the content\n     */\n    protected function buildMessage(string $content, array $records): Email\n    {\n        $message = null;\n        if ($this->emailTemplate instanceof Email) {\n            $message = clone $this->emailTemplate;\n        } elseif (is_callable($this->emailTemplate)) {\n            $message = ($this->emailTemplate)($content, $records);\n        }\n\n        if (!$message instanceof Email) {\n            $record = reset($records);\n            throw new \\InvalidArgumentException('Could not resolve message as instance of Email or a callable returning it' . ($record instanceof LogRecord ? Utils::getRecordMessageForException($record) : ''));\n        }\n\n        if (\\count($records) > 0) {\n            $subjectFormatter = $this->getSubjectFormatter($message->getSubject());\n            $message->subject($subjectFormatter->format($this->getHighestRecord($records)));\n        }\n\n        if ($this->isHtmlBody($content)) {\n            if (null !== ($charset = $message->getHtmlCharset())) {\n                $message->html($content, $charset);\n            } else {\n                $message->html($content);\n            }\n        } else {\n            if (null !== ($charset = $message->getTextCharset())) {\n                $message->text($content, $charset);\n            } else {\n                $message->text($content);\n            }\n        }\n\n        return $message->date(new \\DateTimeImmutable());\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Logs to syslog service.\n *\n * usage example:\n *\n *   $log = new Logger('application');\n *   $syslog = new SyslogHandler('myfacility', 'local6');\n *   $formatter = new LineFormatter(\"%channel%.%level_name%: %message% %extra%\");\n *   $syslog->setFormatter($formatter);\n *   $log->pushHandler($syslog);\n *\n * @author Sven Paulus <sven@karlsruhe.org>\n */\nclass SyslogHandler extends AbstractSyslogHandler\n{\n    protected string $ident;\n    protected int $logopts;\n\n    /**\n     * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant\n     * @param int        $logopts  Option flags for the openlog() call, defaults to LOG_PID\n     */\n    public function __construct(string $ident, string|int $facility = LOG_USER, int|string|Level $level = Level::Debug, bool $bubble = true, int $logopts = LOG_PID)\n    {\n        parent::__construct($facility, $level, $bubble);\n\n        $this->ident = $ident;\n        $this->logopts = $logopts;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function close(): void\n    {\n        closelog();\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        openlog($this->ident, $this->logopts, $this->facility);\n        syslog($this->toSyslogPriority($record->level), (string) $record->formatted);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\SyslogUdp;\n\nuse Monolog\\Utils;\nuse Socket;\n\nclass UdpSocket\n{\n    protected const DATAGRAM_MAX_LENGTH = 65023;\n\n    protected string $ip;\n    protected int $port;\n    protected ?Socket $socket = null;\n\n    public function __construct(string $ip, int $port = 514)\n    {\n        $this->ip = $ip;\n        $this->port = $port;\n    }\n\n    public function write(string $line, string $header = \"\"): void\n    {\n        $this->send($this->assembleMessage($line, $header));\n    }\n\n    public function close(): void\n    {\n        if ($this->socket instanceof Socket) {\n            socket_close($this->socket);\n            $this->socket = null;\n        }\n    }\n\n    protected function getSocket(): Socket\n    {\n        if (null !== $this->socket) {\n            return $this->socket;\n        }\n\n        $domain = AF_INET;\n        $protocol = SOL_UDP;\n        // Check if we are using unix sockets.\n        if ($this->port === 0) {\n            $domain = AF_UNIX;\n            $protocol = IPPROTO_IP;\n        }\n\n        $socket = socket_create($domain, SOCK_DGRAM, $protocol);\n        if ($socket instanceof Socket) {\n            return $this->socket = $socket;\n        }\n\n        throw new \\RuntimeException('The UdpSocket to '.$this->ip.':'.$this->port.' could not be opened via socket_create');\n    }\n\n    protected function send(string $chunk): void\n    {\n        socket_sendto($this->getSocket(), $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port);\n    }\n\n    protected function assembleMessage(string $line, string $header): string\n    {\n        $chunkSize = static::DATAGRAM_MAX_LENGTH - strlen($header);\n\n        return $header . Utils::substr($line, 0, $chunkSize);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse DateTimeInterface;\nuse Monolog\\Handler\\SyslogUdp\\UdpSocket;\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\nuse Monolog\\Utils;\n\n/**\n * A Handler for logging to a remote syslogd server.\n *\n * @author Jesper Skovgaard Nielsen <nulpunkt@gmail.com>\n * @author Dominik Kukacka <dominik.kukacka@gmail.com>\n */\nclass SyslogUdpHandler extends AbstractSyslogHandler\n{\n    const RFC3164 = 0;\n    const RFC5424 = 1;\n    const RFC5424e = 2;\n\n    /** @var array<self::RFC*, string> */\n    private array $dateFormats = [\n        self::RFC3164 => 'M d H:i:s',\n        self::RFC5424 => \\DateTime::RFC3339,\n        self::RFC5424e => \\DateTime::RFC3339_EXTENDED,\n    ];\n\n    protected UdpSocket $socket;\n    protected string $ident;\n    /** @var self::RFC* */\n    protected int $rfc;\n\n    /**\n     * @param  string                    $host     Either IP/hostname or a path to a unix socket (port must be 0 then)\n     * @param  int                       $port     Port number, or 0 if $host is a unix socket\n     * @param  string|int                $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant\n     * @param  bool                      $bubble   Whether the messages that are handled can bubble up the stack or not\n     * @param  string                    $ident    Program name or tag for each log message.\n     * @param  int                       $rfc      RFC to format the message for.\n     * @throws MissingExtensionException when there is no socket extension\n     *\n     * @phpstan-param self::RFC* $rfc\n     */\n    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)\n    {\n        if (!extension_loaded('sockets')) {\n            throw new MissingExtensionException('The sockets extension is required to use the SyslogUdpHandler');\n        }\n\n        parent::__construct($facility, $level, $bubble);\n\n        $this->ident = $ident;\n        $this->rfc = $rfc;\n\n        $this->socket = new UdpSocket($host, $port);\n    }\n\n    protected function write(LogRecord $record): void\n    {\n        $lines = $this->splitMessageIntoLines($record->formatted);\n\n        $header = $this->makeCommonSyslogHeader($this->toSyslogPriority($record->level), $record->datetime);\n\n        foreach ($lines as $line) {\n            $this->socket->write($line, $header);\n        }\n    }\n\n    public function close(): void\n    {\n        $this->socket->close();\n    }\n\n    /**\n     * @param  string|string[] $message\n     * @return string[]\n     */\n    private function splitMessageIntoLines($message): array\n    {\n        if (is_array($message)) {\n            $message = implode(\"\\n\", $message);\n        }\n\n        $lines = preg_split('/$\\R?^/m', (string) $message, -1, PREG_SPLIT_NO_EMPTY);\n        if (false === $lines) {\n            $pcreErrorCode = preg_last_error();\n\n            throw new \\RuntimeException('Could not preg_split: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode));\n        }\n\n        return $lines;\n    }\n\n    /**\n     * Make common syslog header (see rfc5424 or rfc3164)\n     */\n    protected function makeCommonSyslogHeader(int $severity, DateTimeInterface $datetime): string\n    {\n        $priority = $severity + $this->facility;\n\n        $pid = getmypid();\n        if (false === $pid) {\n            $pid = '-';\n        }\n\n        $hostname = gethostname();\n        if (false === $hostname) {\n            $hostname = '-';\n        }\n\n        if ($this->rfc === self::RFC3164) {\n            // see https://github.com/phpstan/phpstan/issues/5348\n            // @phpstan-ignore-next-line\n            $dateNew = $datetime->setTimezone(new \\DateTimeZone('UTC'));\n            $date = $dateNew->format($this->dateFormats[$this->rfc]);\n\n            return \"<$priority>\" .\n                $date . \" \" .\n                $hostname . \" \" .\n                $this->ident . \"[\" . $pid . \"]: \";\n        }\n\n        $date = $datetime->format($this->dateFormats[$this->rfc]);\n\n        return \"<$priority>1 \" .\n            $date . \" \" .\n            $hostname . \" \" .\n            $this->ident . \" \" .\n            $pid . \" - - \";\n    }\n\n    /**\n     * Inject your own socket, mainly used for testing\n     *\n     * @return $this\n     */\n    public function setSocket(UdpSocket $socket): self\n    {\n        $this->socket = $socket;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse RuntimeException;\nuse Monolog\\Level;\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Handler sends logs to Telegram using Telegram Bot API.\n *\n * How to use:\n *  1) Create a Telegram bot with https://telegram.me/BotFather;\n *  2) Create a Telegram channel or a group where logs will be recorded;\n *  3) Add the created bot from step 1 to the created channel/group from step 2.\n *\n * In order to create an instance of TelegramBotHandler use\n *  1. The Telegram bot API key from step 1\n *  2. The channel name with the `@` prefix if you created a public channel (e.g. `@my_public_channel`),\n *     or the channel ID with the `-100` prefix if you created a private channel (e.g. `-1001234567890`),\n *     or the group ID from step 2 (e.g. `-1234567890`).\n *\n * @link https://core.telegram.org/bots/api\n *\n * @author Mazur Alexandr <alexandrmazur96@gmail.com>\n */\nclass TelegramBotHandler extends AbstractProcessingHandler\n{\n    private const BOT_API = 'https://api.telegram.org/bot';\n\n    /**\n     * The available values of parseMode according to the Telegram api documentation\n     */\n    private const AVAILABLE_PARSE_MODES = [\n        'HTML',\n        'MarkdownV2',\n        'Markdown', // legacy mode without underline and strikethrough, use MarkdownV2 instead\n    ];\n\n    /**\n     * The maximum number of characters allowed in a message according to the Telegram api documentation\n     */\n    private const MAX_MESSAGE_LENGTH = 4096;\n\n    /**\n     * Telegram bot access token provided by BotFather.\n     * Create telegram bot with https://telegram.me/BotFather and use access token from it.\n     */\n    private string $apiKey;\n\n    /**\n     * Telegram channel name.\n     * Since to start with '@' symbol as prefix.\n     */\n    private string $channel;\n\n    /**\n     * The kind of formatting that is used for the message.\n     * See available options at https://core.telegram.org/bots/api#formatting-options\n     * or in AVAILABLE_PARSE_MODES\n     */\n    private string|null $parseMode;\n\n    /**\n     * Disables link previews for links in the message.\n     */\n    private bool|null $disableWebPagePreview;\n\n    /**\n     * Sends the message silently. Users will receive a notification with no sound.\n     */\n    private bool|null $disableNotification;\n\n    /**\n     * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages.\n     * False - truncates a message that is too long.\n     */\n    private bool $splitLongMessages;\n\n    /**\n     * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests).\n     */\n    private bool $delayBetweenMessages;\n\n    /**\n     * Telegram message thread id, unique identifier for the target message thread (topic) of the forum; for forum supergroups only\n     * See how to get the `message_thread_id` https://stackoverflow.com/a/75178418\n     */\n    private int|null $topic;\n\n    /**\n     * @param  string                    $apiKey               Telegram bot access token provided by BotFather\n     * @param  string                    $channel              Telegram channel name\n     * @param  bool                      $splitLongMessages    Split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages\n     * @param  bool                      $delayBetweenMessages Adds delay between sending a split message according to Telegram API\n     * @param  int                       $topic                Telegram message thread id, unique identifier for the target message thread (topic) of the forum\n     * @throws MissingExtensionException If the curl extension is missing\n     */\n    public function __construct(\n        string $apiKey,\n        string $channel,\n        $level = Level::Debug,\n        bool   $bubble = true,\n        ?string $parseMode = null,\n        ?bool   $disableWebPagePreview = null,\n        ?bool   $disableNotification = null,\n        bool   $splitLongMessages = false,\n        bool   $delayBetweenMessages = false,\n        int    $topic = null\n    ) {\n        if (!extension_loaded('curl')) {\n            throw new MissingExtensionException('The curl extension is needed to use the TelegramBotHandler');\n        }\n\n        parent::__construct($level, $bubble);\n\n        $this->apiKey = $apiKey;\n        $this->channel = $channel;\n        $this->setParseMode($parseMode);\n        $this->disableWebPagePreview($disableWebPagePreview);\n        $this->disableNotification($disableNotification);\n        $this->splitLongMessages($splitLongMessages);\n        $this->delayBetweenMessages($delayBetweenMessages);\n        $this->setTopic($topic);\n    }\n\n    /**\n     * @return $this\n     */\n    public function setParseMode(string|null $parseMode = null): self\n    {\n        if ($parseMode !== null && !in_array($parseMode, self::AVAILABLE_PARSE_MODES, true)) {\n            throw new \\InvalidArgumentException('Unknown parseMode, use one of these: ' . implode(', ', self::AVAILABLE_PARSE_MODES) . '.');\n        }\n\n        $this->parseMode = $parseMode;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function disableWebPagePreview(bool|null $disableWebPagePreview = null): self\n    {\n        $this->disableWebPagePreview = $disableWebPagePreview;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function disableNotification(bool|null $disableNotification = null): self\n    {\n        $this->disableNotification = $disableNotification;\n\n        return $this;\n    }\n\n    /**\n     * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages.\n     * False - truncates a message that is too long.\n     *\n     * @return $this\n     */\n    public function splitLongMessages(bool $splitLongMessages = false): self\n    {\n        $this->splitLongMessages = $splitLongMessages;\n\n        return $this;\n    }\n\n    /**\n     * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests).\n     *\n     * @return $this\n     */\n    public function delayBetweenMessages(bool $delayBetweenMessages = false): self\n    {\n        $this->delayBetweenMessages = $delayBetweenMessages;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setTopic(int $topic = null): self\n    {\n        $this->topic = $topic;\n\n        return $this;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        $messages = [];\n\n        foreach ($records as $record) {\n            if (!$this->isHandling($record)) {\n                continue;\n            }\n\n            if (\\count($this->processors) > 0) {\n                $record = $this->processRecord($record);\n            }\n\n            $messages[] = $record;\n        }\n\n        if (\\count($messages) > 0) {\n            $this->send((string) $this->getFormatter()->formatBatch($messages));\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $this->send($record->formatted);\n    }\n\n    /**\n     * Send request to @link https://api.telegram.org/bot on SendMessage action.\n     */\n    protected function send(string $message): void\n    {\n        $messages = $this->handleMessageLength($message);\n\n        foreach ($messages as $key => $msg) {\n            if ($this->delayBetweenMessages && $key > 0) {\n                sleep(1);\n            }\n\n            $this->sendCurl($msg);\n        }\n    }\n\n    protected function sendCurl(string $message): void\n    {\n        $ch = curl_init();\n        $url = self::BOT_API . $this->apiKey . '/SendMessage';\n        curl_setopt($ch, CURLOPT_URL, $url);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);\n        $params = [\n            'text' => $message,\n            'chat_id' => $this->channel,\n            'parse_mode' => $this->parseMode,\n            'disable_web_page_preview' => $this->disableWebPagePreview,\n            'disable_notification' => $this->disableNotification,\n        ];\n        if ($this->topic !== null) {\n            $params['message_thread_id'] = $this->topic;\n        }\n        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));\n\n        $result = Curl\\Util::execute($ch);\n        if (!is_string($result)) {\n            throw new RuntimeException('Telegram API error. Description: No response');\n        }\n        $result = json_decode($result, true);\n\n        if ($result['ok'] === false) {\n            throw new RuntimeException('Telegram API error. Description: ' . $result['description']);\n        }\n    }\n\n    /**\n     * Handle a message that is too long: truncates or splits into several\n     * @return string[]\n     */\n    private function handleMessageLength(string $message): array\n    {\n        $truncatedMarker = ' (...truncated)';\n        if (!$this->splitLongMessages && strlen($message) > self::MAX_MESSAGE_LENGTH) {\n            return [Utils::substr($message, 0, self::MAX_MESSAGE_LENGTH - strlen($truncatedMarker)) . $truncatedMarker];\n        }\n\n        return str_split($message, self::MAX_MESSAGE_LENGTH);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\LogRecord;\n\n/**\n * Used for testing purposes.\n *\n * It records all records and gives you access to them for verification.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n *\n * @method bool hasEmergency(string|array $recordAssertions)\n * @method bool hasAlert(string|array $recordAssertions)\n * @method bool hasCritical(string|array $recordAssertions)\n * @method bool hasError(string|array $recordAssertions)\n * @method bool hasWarning(string|array $recordAssertions)\n * @method bool hasNotice(string|array $recordAssertions)\n * @method bool hasInfo(string|array $recordAssertions)\n * @method bool hasDebug(string|array $recordAssertions)\n *\n * @method bool hasEmergencyRecords()\n * @method bool hasAlertRecords()\n * @method bool hasCriticalRecords()\n * @method bool hasErrorRecords()\n * @method bool hasWarningRecords()\n * @method bool hasNoticeRecords()\n * @method bool hasInfoRecords()\n * @method bool hasDebugRecords()\n *\n * @method bool hasEmergencyThatContains(string $message)\n * @method bool hasAlertThatContains(string $message)\n * @method bool hasCriticalThatContains(string $message)\n * @method bool hasErrorThatContains(string $message)\n * @method bool hasWarningThatContains(string $message)\n * @method bool hasNoticeThatContains(string $message)\n * @method bool hasInfoThatContains(string $message)\n * @method bool hasDebugThatContains(string $message)\n *\n * @method bool hasEmergencyThatMatches(string $regex)\n * @method bool hasAlertThatMatches(string $regex)\n * @method bool hasCriticalThatMatches(string $regex)\n * @method bool hasErrorThatMatches(string $regex)\n * @method bool hasWarningThatMatches(string $regex)\n * @method bool hasNoticeThatMatches(string $regex)\n * @method bool hasInfoThatMatches(string $regex)\n * @method bool hasDebugThatMatches(string $regex)\n *\n * @method bool hasEmergencyThatPasses(callable $predicate)\n * @method bool hasAlertThatPasses(callable $predicate)\n * @method bool hasCriticalThatPasses(callable $predicate)\n * @method bool hasErrorThatPasses(callable $predicate)\n * @method bool hasWarningThatPasses(callable $predicate)\n * @method bool hasNoticeThatPasses(callable $predicate)\n * @method bool hasInfoThatPasses(callable $predicate)\n * @method bool hasDebugThatPasses(callable $predicate)\n */\nclass TestHandler extends AbstractProcessingHandler\n{\n    /** @var LogRecord[] */\n    protected array $records = [];\n    /** @phpstan-var array<value-of<Level::VALUES>, LogRecord[]> */\n    protected array $recordsByLevel = [];\n    private bool $skipReset = false;\n\n    /**\n     * @return array<LogRecord>\n     */\n    public function getRecords(): array\n    {\n        return $this->records;\n    }\n\n    public function clear(): void\n    {\n        $this->records = [];\n        $this->recordsByLevel = [];\n    }\n\n    public function reset(): void\n    {\n        if (!$this->skipReset) {\n            $this->clear();\n        }\n    }\n\n    public function setSkipReset(bool $skipReset): void\n    {\n        $this->skipReset = $skipReset;\n    }\n\n    /**\n     * @param int|string|Level|LogLevel::* $level Logging level value or name\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public function hasRecords(int|string|Level $level): bool\n    {\n        return isset($this->recordsByLevel[Logger::toMonologLevel($level)->value]);\n    }\n\n    /**\n     * @param string|array $recordAssertions Either a message string or an array containing message and optionally context keys that will be checked against all records\n     *\n     * @phpstan-param array{message: string, context?: mixed[]}|string $recordAssertions\n     */\n    public function hasRecord(string|array $recordAssertions, Level $level): bool\n    {\n        if (is_string($recordAssertions)) {\n            $recordAssertions = ['message' => $recordAssertions];\n        }\n\n        return $this->hasRecordThatPasses(function (LogRecord $rec) use ($recordAssertions) {\n            if ($rec->message !== $recordAssertions['message']) {\n                return false;\n            }\n            if (isset($recordAssertions['context']) && $rec->context !== $recordAssertions['context']) {\n                return false;\n            }\n\n            return true;\n        }, $level);\n    }\n\n    public function hasRecordThatContains(string $message, Level $level): bool\n    {\n        return $this->hasRecordThatPasses(fn (LogRecord $rec) => str_contains($rec->message, $message), $level);\n    }\n\n    public function hasRecordThatMatches(string $regex, Level $level): bool\n    {\n        return $this->hasRecordThatPasses(fn (LogRecord $rec) => preg_match($regex, $rec->message) > 0, $level);\n    }\n\n    /**\n     * @phpstan-param callable(LogRecord, int): mixed $predicate\n     */\n    public function hasRecordThatPasses(callable $predicate, Level $level): bool\n    {\n        $level = Logger::toMonologLevel($level);\n\n        if (!isset($this->recordsByLevel[$level->value])) {\n            return false;\n        }\n\n        foreach ($this->recordsByLevel[$level->value] as $i => $rec) {\n            if ((bool) $predicate($rec, $i)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $this->recordsByLevel[$record->level->value][] = $record;\n        $this->records[] = $record;\n    }\n\n    /**\n     * @param mixed[] $args\n     */\n    public function __call(string $method, array $args): bool\n    {\n        if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {\n            $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];\n            $level = constant(Level::class.'::' . $matches[2]);\n            $callback = [$this, $genericMethod];\n            if (is_callable($callback)) {\n                $args[] = $level;\n\n                return call_user_func_array($callback, $args);\n            }\n        }\n\n        throw new \\BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\ntrait WebRequestRecognizerTrait\n{\n    /**\n     * Checks if PHP's serving a web request\n     */\n    protected function isWebRequest(): bool\n    {\n        return 'cli' !== \\PHP_SAPI && 'phpdbg' !== \\PHP_SAPI;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\LogRecord;\nuse Throwable;\n\n/**\n * Forwards records to multiple handlers suppressing failures of each handler\n * and continuing through to give every handler a chance to succeed.\n *\n * @author Craig D'Amelio <craig@damelio.ca>\n */\nclass WhatFailureGroupHandler extends GroupHandler\n{\n    /**\n     * @inheritDoc\n     */\n    public function handle(LogRecord $record): bool\n    {\n        if (\\count($this->processors) > 0) {\n            $record = $this->processRecord($record);\n        }\n\n        foreach ($this->handlers as $handler) {\n            try {\n                $handler->handle(clone $record);\n            } catch (Throwable) {\n                // What failure?\n            }\n        }\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function handleBatch(array $records): void\n    {\n        if (\\count($this->processors) > 0) {\n            $processed = [];\n            foreach ($records as $record) {\n                $processed[] = $this->processRecord($record);\n            }\n            $records = $processed;\n        }\n\n        foreach ($this->handlers as $handler) {\n            try {\n                $handler->handleBatch(array_map(fn ($record) => clone $record, $records));\n            } catch (Throwable) {\n                // What failure?\n            }\n        }\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function close(): void\n    {\n        foreach ($this->handlers as $handler) {\n            try {\n                $handler->close();\n            } catch (\\Throwable $e) {\n                // What failure?\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\NormalizerFormatter;\nuse Monolog\\Level;\nuse Monolog\\LogRecord;\n\n/**\n * Handler sending logs to Zend Monitor\n *\n * @author  Christian Bergau <cbergau86@gmail.com>\n * @author  Jason Davis <happydude@jasondavis.net>\n */\nclass ZendMonitorHandler extends AbstractProcessingHandler\n{\n    /**\n     * @throws MissingExtensionException\n     */\n    public function __construct(int|string|Level $level = Level::Debug, bool $bubble = true)\n    {\n        if (!function_exists('zend_monitor_custom_event')) {\n            throw new MissingExtensionException(\n                'You must have Zend Server installed with Zend Monitor enabled in order to use this handler'\n            );\n        }\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * Translates Monolog log levels to ZendMonitor levels.\n     */\n    protected function toZendMonitorLevel(Level $level): int\n    {\n        return match ($level) {\n            Level::Debug     => \\ZEND_MONITOR_EVENT_SEVERITY_INFO,\n            Level::Info      => \\ZEND_MONITOR_EVENT_SEVERITY_INFO,\n            Level::Notice    => \\ZEND_MONITOR_EVENT_SEVERITY_INFO,\n            Level::Warning   => \\ZEND_MONITOR_EVENT_SEVERITY_WARNING,\n            Level::Error     => \\ZEND_MONITOR_EVENT_SEVERITY_ERROR,\n            Level::Critical  => \\ZEND_MONITOR_EVENT_SEVERITY_ERROR,\n            Level::Alert     => \\ZEND_MONITOR_EVENT_SEVERITY_ERROR,\n            Level::Emergency => \\ZEND_MONITOR_EVENT_SEVERITY_ERROR,\n        };\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function write(LogRecord $record): void\n    {\n        $this->writeZendMonitorCustomEvent(\n            $record->level->getName(),\n            $record->message,\n            $record->formatted,\n            $this->toZendMonitorLevel($record->level)\n        );\n    }\n\n    /**\n     * Write to Zend Monitor Events\n     * @param string       $type      Text displayed in \"Class Name (custom)\" field\n     * @param string       $message   Text displayed in \"Error String\"\n     * @param array<mixed> $formatted Displayed in Custom Variables tab\n     * @param int          $severity  Set the event severity level (-1,0,1)\n     */\n    protected function writeZendMonitorCustomEvent(string $type, string $message, array $formatted, int $severity): void\n    {\n        zend_monitor_custom_event($type, $message, $formatted, $severity);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function getDefaultFormatter(): FormatterInterface\n    {\n        return new NormalizerFormatter();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Level.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse Psr\\Log\\LogLevel;\n\n/**\n * Represents the log levels\n *\n * Monolog supports the logging levels described by RFC 5424 {@see https://datatracker.ietf.org/doc/html/rfc5424}\n * but due to BC the severity values used internally are not 0-7.\n *\n * To get the level name/value out of a Level there are several options:\n *\n * - Use ->getName() to get the standard Monolog name which is full uppercased (e.g. \"DEBUG\")\n * - Use ->toPsrLogLevel() to get the standard PSR-3 name which is full lowercased (e.g. \"debug\")\n * - Use ->toRFC5424Level() to get the standard RFC 5424 value (e.g. 7 for debug, 0 for emergency)\n * - Use ->name to get the enum case's name which is capitalized (e.g. \"Debug\")\n *\n * To get the internal value for filtering, if the includes/isLowerThan/isHigherThan methods are\n * not enough, you can use ->value to get the enum case's integer value.\n */\nenum Level: int\n{\n    /**\n     * Detailed debug information\n     */\n    case Debug = 100;\n\n    /**\n     * Interesting events\n     *\n     * Examples: User logs in, SQL logs.\n     */\n    case Info = 200;\n\n    /**\n     * Uncommon events\n     */\n    case Notice = 250;\n\n    /**\n     * Exceptional occurrences that are not errors\n     *\n     * Examples: Use of deprecated APIs, poor use of an API,\n     * undesirable things that are not necessarily wrong.\n     */\n    case Warning = 300;\n\n    /**\n     * Runtime errors\n     */\n    case Error = 400;\n\n    /**\n     * Critical conditions\n     *\n     * Example: Application component unavailable, unexpected exception.\n     */\n    case Critical = 500;\n\n    /**\n     * Action must be taken immediately\n     *\n     * Example: Entire website down, database unavailable, etc.\n     * This should trigger the SMS alerts and wake you up.\n     */\n    case Alert = 550;\n\n    /**\n     * Urgent alert.\n     */\n    case Emergency = 600;\n\n    /**\n     * @param value-of<self::NAMES>|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name\n     * @return static\n     */\n    public static function fromName(string $name): self\n    {\n        return match ($name) {\n            'debug', 'Debug', 'DEBUG' => self::Debug,\n            'info', 'Info', 'INFO' => self::Info,\n            'notice', 'Notice', 'NOTICE' => self::Notice,\n            'warning', 'Warning', 'WARNING' => self::Warning,\n            'error', 'Error', 'ERROR' => self::Error,\n            'critical', 'Critical', 'CRITICAL' => self::Critical,\n            'alert', 'Alert', 'ALERT' => self::Alert,\n            'emergency', 'Emergency', 'EMERGENCY' => self::Emergency,\n        };\n    }\n\n    /**\n     * @param value-of<self::VALUES> $value\n     * @return static\n     */\n    public static function fromValue(int $value): self\n    {\n        return self::from($value);\n    }\n\n    /**\n     * Returns true if the passed $level is higher or equal to $this\n     */\n    public function includes(Level $level): bool\n    {\n        return $this->value <= $level->value;\n    }\n\n    public function isHigherThan(Level $level): bool\n    {\n        return $this->value > $level->value;\n    }\n\n    public function isLowerThan(Level $level): bool\n    {\n        return $this->value < $level->value;\n    }\n\n    /**\n     * Returns the monolog standardized all-capitals name of the level\n     *\n     * Use this instead of $level->name which returns the enum case name (e.g. Debug vs DEBUG if you use getName())\n     *\n     * @return value-of<self::NAMES>\n     */\n    public function getName(): string\n    {\n        return match ($this) {\n            self::Debug => 'DEBUG',\n            self::Info => 'INFO',\n            self::Notice => 'NOTICE',\n            self::Warning => 'WARNING',\n            self::Error => 'ERROR',\n            self::Critical => 'CRITICAL',\n            self::Alert => 'ALERT',\n            self::Emergency => 'EMERGENCY',\n        };\n    }\n\n    /**\n     * Returns the PSR-3 level matching this instance\n     *\n     * @phpstan-return \\Psr\\Log\\LogLevel::*\n     */\n    public function toPsrLogLevel(): string\n    {\n        return match ($this) {\n            self::Debug => LogLevel::DEBUG,\n            self::Info => LogLevel::INFO,\n            self::Notice => LogLevel::NOTICE,\n            self::Warning => LogLevel::WARNING,\n            self::Error => LogLevel::ERROR,\n            self::Critical => LogLevel::CRITICAL,\n            self::Alert => LogLevel::ALERT,\n            self::Emergency => LogLevel::EMERGENCY,\n        };\n    }\n\n    /**\n     * Returns the RFC 5424 level matching this instance\n     *\n     * @phpstan-return int<0, 7>\n     */\n    public function toRFC5424Level(): int\n    {\n        return match ($this) {\n            self::Debug => 7,\n            self::Info => 6,\n            self::Notice => 5,\n            self::Warning => 4,\n            self::Error => 3,\n            self::Critical => 2,\n            self::Alert => 1,\n            self::Emergency => 0,\n        };\n    }\n\n    public const VALUES = [\n        100,\n        200,\n        250,\n        300,\n        400,\n        500,\n        550,\n        600,\n    ];\n\n    public const NAMES = [\n        'DEBUG',\n        'INFO',\n        'NOTICE',\n        'WARNING',\n        'ERROR',\n        'CRITICAL',\n        'ALERT',\n        'EMERGENCY',\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/LogRecord.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse ArrayAccess;\n\n/**\n * Monolog log record\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @template-implements ArrayAccess<'message'|'level'|'context'|'level_name'|'channel'|'datetime'|'extra', int|string|\\DateTimeImmutable|array<mixed>>\n */\nclass LogRecord implements ArrayAccess\n{\n    private const MODIFIABLE_FIELDS = [\n        'extra' => true,\n        'formatted' => true,\n    ];\n\n    public function __construct(\n        public readonly \\DateTimeImmutable $datetime,\n        public readonly string $channel,\n        public readonly Level $level,\n        public readonly string $message,\n        /** @var array<mixed> */\n        public readonly array $context = [],\n        /** @var array<mixed> */\n        public array $extra = [],\n        public mixed $formatted = null,\n    ) {\n    }\n\n    public function offsetSet(mixed $offset, mixed $value): void\n    {\n        if ($offset === 'extra') {\n            if (!is_array($value)) {\n                throw new \\InvalidArgumentException('extra must be an array');\n            }\n\n            $this->extra = $value;\n\n            return;\n        }\n\n        if ($offset === 'formatted') {\n            $this->formatted = $value;\n\n            return;\n        }\n\n        throw new \\LogicException('Unsupported operation: setting '.$offset);\n    }\n\n    public function offsetExists(mixed $offset): bool\n    {\n        if ($offset === 'level_name') {\n            return true;\n        }\n\n        return isset($this->{$offset});\n    }\n\n    public function offsetUnset(mixed $offset): void\n    {\n        throw new \\LogicException('Unsupported operation');\n    }\n\n    public function &offsetGet(mixed $offset): mixed\n    {\n        if ($offset === 'level_name' || $offset === 'level') {\n            // avoid returning readonly props by ref as this is illegal\n            if ($offset === 'level_name') {\n                $copy = $this->level->getName();\n            } else {\n                $copy = $this->level->value;\n            }\n\n            return $copy;\n        }\n\n        if (isset(self::MODIFIABLE_FIELDS[$offset])) {\n            return $this->{$offset};\n        }\n\n        // avoid returning readonly props by ref as this is illegal\n        $copy = $this->{$offset};\n\n        return $copy;\n    }\n\n    /**\n     * @phpstan-return array{message: string, context: mixed[], level: value-of<Level::VALUES>, level_name: value-of<Level::NAMES>, channel: string, datetime: \\DateTimeImmutable, extra: mixed[]}\n     */\n    public function toArray(): array\n    {\n        return [\n            'message' => $this->message,\n            'context' => $this->context,\n            'level' => $this->level->value,\n            'level_name' => $this->level->getName(),\n            'channel' => $this->channel,\n            'datetime' => $this->datetime,\n            'extra' => $this->extra,\n        ];\n    }\n\n    public function with(mixed ...$args): self\n    {\n        foreach (['message', 'context', 'level', 'channel', 'datetime', 'extra'] as $prop) {\n            $args[$prop] ??= $this->{$prop};\n        }\n\n        return new self(...$args);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Logger.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse Closure;\nuse DateTimeZone;\nuse Fiber;\nuse Monolog\\Handler\\HandlerInterface;\nuse Monolog\\Processor\\ProcessorInterface;\nuse Psr\\Log\\LoggerInterface;\nuse Psr\\Log\\InvalidArgumentException;\nuse Psr\\Log\\LogLevel;\nuse Throwable;\nuse Stringable;\nuse WeakMap;\n\n/**\n * Monolog log channel\n *\n * It contains a stack of Handlers and a stack of Processors,\n * and uses them to store records that are added to it.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @final\n */\nclass Logger implements LoggerInterface, ResettableInterface\n{\n    /**\n     * Detailed debug information\n     *\n     * @deprecated Use \\Monolog\\Level::Debug\n     */\n    public const DEBUG = 100;\n\n    /**\n     * Interesting events\n     *\n     * Examples: User logs in, SQL logs.\n     *\n     * @deprecated Use \\Monolog\\Level::Info\n     */\n    public const INFO = 200;\n\n    /**\n     * Uncommon events\n     *\n     * @deprecated Use \\Monolog\\Level::Notice\n     */\n    public const NOTICE = 250;\n\n    /**\n     * Exceptional occurrences that are not errors\n     *\n     * Examples: Use of deprecated APIs, poor use of an API,\n     * undesirable things that are not necessarily wrong.\n     *\n     * @deprecated Use \\Monolog\\Level::Warning\n     */\n    public const WARNING = 300;\n\n    /**\n     * Runtime errors\n     *\n     * @deprecated Use \\Monolog\\Level::Error\n     */\n    public const ERROR = 400;\n\n    /**\n     * Critical conditions\n     *\n     * Example: Application component unavailable, unexpected exception.\n     *\n     * @deprecated Use \\Monolog\\Level::Critical\n     */\n    public const CRITICAL = 500;\n\n    /**\n     * Action must be taken immediately\n     *\n     * Example: Entire website down, database unavailable, etc.\n     * This should trigger the SMS alerts and wake you up.\n     *\n     * @deprecated Use \\Monolog\\Level::Alert\n     */\n    public const ALERT = 550;\n\n    /**\n     * Urgent alert.\n     *\n     * @deprecated Use \\Monolog\\Level::Emergency\n     */\n    public const EMERGENCY = 600;\n\n    /**\n     * Monolog API version\n     *\n     * This is only bumped when API breaks are done and should\n     * follow the major version of the library\n     */\n    public const API = 3;\n\n    /**\n     * Mapping between levels numbers defined in RFC 5424 and Monolog ones\n     *\n     * @phpstan-var array<int, Level> $rfc_5424_levels\n     */\n    private const RFC_5424_LEVELS = [\n        7 => Level::Debug,\n        6 => Level::Info,\n        5 => Level::Notice,\n        4 => Level::Warning,\n        3 => Level::Error,\n        2 => Level::Critical,\n        1 => Level::Alert,\n        0 => Level::Emergency,\n    ];\n\n    protected string $name;\n\n    /**\n     * The handler stack\n     *\n     * @var list<HandlerInterface>\n     */\n    protected array $handlers;\n\n    /**\n     * Processors that will process all log records\n     *\n     * To process records of a single handler instead, add the processor on that specific handler\n     *\n     * @var array<(callable(LogRecord): LogRecord)|ProcessorInterface>\n     */\n    protected array $processors;\n\n    protected bool $microsecondTimestamps = true;\n\n    protected DateTimeZone $timezone;\n\n    protected Closure|null $exceptionHandler = null;\n\n    /**\n     * Keeps track of depth to prevent infinite logging loops\n     */\n    private int $logDepth = 0;\n\n    /**\n     * @var WeakMap<Fiber<mixed, mixed, mixed, mixed>, int> Keeps track of depth inside fibers to prevent infinite logging loops\n     */\n    private WeakMap $fiberLogDepth;\n\n    /**\n     * Whether to detect infinite logging loops\n     * This can be disabled via {@see useLoggingLoopDetection} if you have async handlers that do not play well with this\n     */\n    private bool $detectCycles = true;\n\n    /**\n     * @param string             $name       The logging channel, a simple descriptive name that is attached to all log records\n     * @param HandlerInterface[] $handlers   Optional stack of handlers, the first one in the array is called first, etc.\n     * @param callable[]         $processors Optional array of processors\n     * @param DateTimeZone|null  $timezone   Optional timezone, if not provided date_default_timezone_get() will be used\n     *\n     * @phpstan-param array<(callable(LogRecord): LogRecord)|ProcessorInterface> $processors\n     */\n    public function __construct(string $name, array $handlers = [], array $processors = [], DateTimeZone|null $timezone = null)\n    {\n        $this->name = $name;\n        $this->setHandlers($handlers);\n        $this->processors = $processors;\n        $this->timezone = $timezone ?? new DateTimeZone(date_default_timezone_get());\n        $this->fiberLogDepth = new \\WeakMap();\n    }\n\n    public function getName(): string\n    {\n        return $this->name;\n    }\n\n    /**\n     * Return a new cloned instance with the name changed\n     *\n     * @return static\n     */\n    public function withName(string $name): self\n    {\n        $new = clone $this;\n        $new->name = $name;\n\n        return $new;\n    }\n\n    /**\n     * Pushes a handler on to the stack.\n     *\n     * @return $this\n     */\n    public function pushHandler(HandlerInterface $handler): self\n    {\n        array_unshift($this->handlers, $handler);\n\n        return $this;\n    }\n\n    /**\n     * Pops a handler from the stack\n     *\n     * @throws \\LogicException If empty handler stack\n     */\n    public function popHandler(): HandlerInterface\n    {\n        if (0 === \\count($this->handlers)) {\n            throw new \\LogicException('You tried to pop from an empty handler stack.');\n        }\n\n        return array_shift($this->handlers);\n    }\n\n    /**\n     * Set handlers, replacing all existing ones.\n     *\n     * If a map is passed, keys will be ignored.\n     *\n     * @param list<HandlerInterface> $handlers\n     * @return $this\n     */\n    public function setHandlers(array $handlers): self\n    {\n        $this->handlers = [];\n        foreach (array_reverse($handlers) as $handler) {\n            $this->pushHandler($handler);\n        }\n\n        return $this;\n    }\n\n    /**\n     * @return list<HandlerInterface>\n     */\n    public function getHandlers(): array\n    {\n        return $this->handlers;\n    }\n\n    /**\n     * Adds a processor on to the stack.\n     *\n     * @phpstan-param ProcessorInterface|(callable(LogRecord): LogRecord) $callback\n     * @return $this\n     */\n    public function pushProcessor(ProcessorInterface|callable $callback): self\n    {\n        array_unshift($this->processors, $callback);\n\n        return $this;\n    }\n\n    /**\n     * Removes the processor on top of the stack and returns it.\n     *\n     * @phpstan-return ProcessorInterface|(callable(LogRecord): LogRecord)\n     * @throws \\LogicException If empty processor stack\n     */\n    public function popProcessor(): callable\n    {\n        if (0 === \\count($this->processors)) {\n            throw new \\LogicException('You tried to pop from an empty processor stack.');\n        }\n\n        return array_shift($this->processors);\n    }\n\n    /**\n     * @return callable[]\n     * @phpstan-return array<ProcessorInterface|(callable(LogRecord): LogRecord)>\n     */\n    public function getProcessors(): array\n    {\n        return $this->processors;\n    }\n\n    /**\n     * Control the use of microsecond resolution timestamps in the 'datetime'\n     * member of new records.\n     *\n     * As of PHP7.1 microseconds are always included by the engine, so\n     * there is no performance penalty and Monolog 2 enabled microseconds\n     * by default. This function lets you disable them though in case you want\n     * to suppress microseconds from the output.\n     *\n     * @param bool $micro True to use microtime() to create timestamps\n     * @return $this\n     */\n    public function useMicrosecondTimestamps(bool $micro): self\n    {\n        $this->microsecondTimestamps = $micro;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function useLoggingLoopDetection(bool $detectCycles): self\n    {\n        $this->detectCycles = $detectCycles;\n\n        return $this;\n    }\n\n    /**\n     * Adds a log record.\n     *\n     * @param  int                    $level    The logging level (a Monolog or RFC 5424 level)\n     * @param  string                 $message  The log message\n     * @param  mixed[]                $context  The log context\n     * @param  DateTimeImmutable|null $datetime Optional log date to log into the past or future\n     * @return bool                   Whether the record has been processed\n     *\n     * @phpstan-param value-of<Level::VALUES>|Level $level\n     */\n    public function addRecord(int|Level $level, string $message, array $context = [], DateTimeImmutable|null $datetime = null): bool\n    {\n        if (is_int($level) && isset(self::RFC_5424_LEVELS[$level])) {\n            $level = self::RFC_5424_LEVELS[$level];\n        }\n\n        if ($this->detectCycles) {\n            if (null !== ($fiber = Fiber::getCurrent())) {\n                $logDepth = $this->fiberLogDepth[$fiber] = ($this->fiberLogDepth[$fiber] ?? 0) + 1;\n            } else {\n                $logDepth = ++$this->logDepth;\n            }\n        } else {\n            $logDepth = 0;\n        }\n\n        if ($logDepth === 3) {\n            $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.');\n            return false;\n        } elseif ($logDepth >= 5) { // log depth 4 is let through, so we can log the warning above\n            return false;\n        }\n\n        try {\n            $recordInitialized = count($this->processors) === 0;\n\n            $record = new LogRecord(\n                datetime: $datetime ?? new DateTimeImmutable($this->microsecondTimestamps, $this->timezone),\n                channel: $this->name,\n                level: self::toMonologLevel($level),\n                message: $message,\n                context: $context,\n                extra: [],\n            );\n            $handled = false;\n\n            foreach ($this->handlers as $handler) {\n                if (false === $recordInitialized) {\n                    // skip initializing the record as long as no handler is going to handle it\n                    if (!$handler->isHandling($record)) {\n                        continue;\n                    }\n\n                    try {\n                        foreach ($this->processors as $processor) {\n                            $record = $processor($record);\n                        }\n                        $recordInitialized = true;\n                    } catch (Throwable $e) {\n                        $this->handleException($e, $record);\n\n                        return true;\n                    }\n                }\n\n                // once the record is initialized, send it to all handlers as long as the bubbling chain is not interrupted\n                try {\n                    $handled = true;\n                    if (true === $handler->handle(clone $record)) {\n                        break;\n                    }\n                } catch (Throwable $e) {\n                    $this->handleException($e, $record);\n\n                    return true;\n                }\n            }\n\n            return $handled;\n        } finally {\n            if ($this->detectCycles) {\n                if (isset($fiber)) {\n                    $this->fiberLogDepth[$fiber]--;\n                } else {\n                    $this->logDepth--;\n                }\n            }\n        }\n    }\n\n    /**\n     * Ends a log cycle and frees all resources used by handlers.\n     *\n     * Closing a Handler means flushing all buffers and freeing any open resources/handles.\n     * Handlers that have been closed should be able to accept log records again and re-open\n     * themselves on demand, but this may not always be possible depending on implementation.\n     *\n     * This is useful at the end of a request and will be called automatically on every handler\n     * when they get destructed.\n     */\n    public function close(): void\n    {\n        foreach ($this->handlers as $handler) {\n            $handler->close();\n        }\n    }\n\n    /**\n     * Ends a log cycle and resets all handlers and processors to their initial state.\n     *\n     * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal\n     * state, and getting it back to a state in which it can receive log records again.\n     *\n     * This is useful in case you want to avoid logs leaking between two requests or jobs when you\n     * have a long running process like a worker or an application server serving multiple requests\n     * in one process.\n     */\n    public function reset(): void\n    {\n        foreach ($this->handlers as $handler) {\n            if ($handler instanceof ResettableInterface) {\n                $handler->reset();\n            }\n        }\n\n        foreach ($this->processors as $processor) {\n            if ($processor instanceof ResettableInterface) {\n                $processor->reset();\n            }\n        }\n    }\n\n    /**\n     * Gets the name of the logging level as a string.\n     *\n     * This still returns a string instead of a Level for BC, but new code should not rely on this method.\n     *\n     * @throws \\Psr\\Log\\InvalidArgumentException If level is not defined\n     *\n     * @phpstan-param  value-of<Level::VALUES>|Level $level\n     * @phpstan-return value-of<Level::NAMES>\n     *\n     * @deprecated Since 3.0, use {@see toMonologLevel} or {@see \\Monolog\\Level->getName()} instead\n     */\n    public static function getLevelName(int|Level $level): string\n    {\n        return self::toMonologLevel($level)->getName();\n    }\n\n    /**\n     * Converts PSR-3 levels to Monolog ones if necessary\n     *\n     * @param  int|string|Level|LogLevel::* $level Level number (monolog) or name (PSR-3)\n     * @throws \\Psr\\Log\\InvalidArgumentException      If level is not defined\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public static function toMonologLevel(string|int|Level $level): Level\n    {\n        if ($level instanceof Level) {\n            return $level;\n        }\n\n        if (\\is_string($level)) {\n            if (\\is_numeric($level)) {\n                $levelEnum = Level::tryFrom((int) $level);\n                if ($levelEnum === null) {\n                    throw new InvalidArgumentException('Level \"'.$level.'\" is not defined, use one of: '.implode(', ', Level::NAMES + Level::VALUES));\n                }\n\n                return $levelEnum;\n            }\n\n            // Contains first char of all log levels and avoids using strtoupper() which may have\n            // strange results depending on locale (for example, \"i\" will become \"İ\" in Turkish locale)\n            $upper = strtr(substr($level, 0, 1), 'dinweca', 'DINWECA') . strtolower(substr($level, 1));\n            if (defined(Level::class.'::'.$upper)) {\n                return constant(Level::class . '::' . $upper);\n            }\n\n            throw new InvalidArgumentException('Level \"'.$level.'\" is not defined, use one of: '.implode(', ', Level::NAMES + Level::VALUES));\n        }\n\n        $levelEnum = Level::tryFrom($level);\n        if ($levelEnum === null) {\n            throw new InvalidArgumentException('Level \"'.var_export($level, true).'\" is not defined, use one of: '.implode(', ', Level::NAMES + Level::VALUES));\n        }\n\n        return $levelEnum;\n    }\n\n    /**\n     * Checks whether the Logger has a handler that listens on the given level\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public function isHandling(int|string|Level $level): bool\n    {\n        $record = new LogRecord(\n            datetime: new DateTimeImmutable($this->microsecondTimestamps, $this->timezone),\n            channel: $this->name,\n            message: '',\n            level: self::toMonologLevel($level),\n        );\n\n        foreach ($this->handlers as $handler) {\n            if ($handler->isHandling($record)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Set a custom exception handler that will be called if adding a new record fails\n     *\n     * The Closure will receive an exception object and the record that failed to be logged\n     *\n     * @return $this\n     */\n    public function setExceptionHandler(Closure|null $callback): self\n    {\n        $this->exceptionHandler = $callback;\n\n        return $this;\n    }\n\n    public function getExceptionHandler(): Closure|null\n    {\n        return $this->exceptionHandler;\n    }\n\n    /**\n     * Adds a log record at an arbitrary level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param mixed             $level   The log level (a Monolog, PSR-3 or RFC 5424 level)\n     * @param string|Stringable $message The log message\n     * @param mixed[]           $context The log context\n     *\n     * @phpstan-param Level|LogLevel::* $level\n     */\n    public function log($level, string|\\Stringable $message, array $context = []): void\n    {\n        if (!$level instanceof Level) {\n            if (!is_string($level) && !is_int($level)) {\n                throw new \\InvalidArgumentException('$level is expected to be a string, int or '.Level::class.' instance');\n            }\n\n            if (isset(self::RFC_5424_LEVELS[$level])) {\n                $level = self::RFC_5424_LEVELS[$level];\n            }\n\n            $level = static::toMonologLevel($level);\n        }\n\n        $this->addRecord($level, (string) $message, $context);\n    }\n\n    /**\n     * Adds a log record at the DEBUG level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param string|Stringable $message The log message\n     * @param mixed[]           $context The log context\n     */\n    public function debug(string|\\Stringable $message, array $context = []): void\n    {\n        $this->addRecord(Level::Debug, (string) $message, $context);\n    }\n\n    /**\n     * Adds a log record at the INFO level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param string|Stringable $message The log message\n     * @param mixed[]           $context The log context\n     */\n    public function info(string|\\Stringable $message, array $context = []): void\n    {\n        $this->addRecord(Level::Info, (string) $message, $context);\n    }\n\n    /**\n     * Adds a log record at the NOTICE level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param string|Stringable $message The log message\n     * @param mixed[]           $context The log context\n     */\n    public function notice(string|\\Stringable $message, array $context = []): void\n    {\n        $this->addRecord(Level::Notice, (string) $message, $context);\n    }\n\n    /**\n     * Adds a log record at the WARNING level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param string|Stringable $message The log message\n     * @param mixed[]           $context The log context\n     */\n    public function warning(string|\\Stringable $message, array $context = []): void\n    {\n        $this->addRecord(Level::Warning, (string) $message, $context);\n    }\n\n    /**\n     * Adds a log record at the ERROR level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param string|Stringable $message The log message\n     * @param mixed[]           $context The log context\n     */\n    public function error(string|\\Stringable $message, array $context = []): void\n    {\n        $this->addRecord(Level::Error, (string) $message, $context);\n    }\n\n    /**\n     * Adds a log record at the CRITICAL level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param string|Stringable $message The log message\n     * @param mixed[]           $context The log context\n     */\n    public function critical(string|\\Stringable $message, array $context = []): void\n    {\n        $this->addRecord(Level::Critical, (string) $message, $context);\n    }\n\n    /**\n     * Adds a log record at the ALERT level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param string|Stringable $message The log message\n     * @param mixed[]           $context The log context\n     */\n    public function alert(string|\\Stringable $message, array $context = []): void\n    {\n        $this->addRecord(Level::Alert, (string) $message, $context);\n    }\n\n    /**\n     * Adds a log record at the EMERGENCY level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param string|Stringable $message The log message\n     * @param mixed[]           $context The log context\n     */\n    public function emergency(string|\\Stringable $message, array $context = []): void\n    {\n        $this->addRecord(Level::Emergency, (string) $message, $context);\n    }\n\n    /**\n     * Sets the timezone to be used for the timestamp of log records.\n     *\n     * @return $this\n     */\n    public function setTimezone(DateTimeZone $tz): self\n    {\n        $this->timezone = $tz;\n\n        return $this;\n    }\n\n    /**\n     * Returns the timezone to be used for the timestamp of log records.\n     */\n    public function getTimezone(): DateTimeZone\n    {\n        return $this->timezone;\n    }\n\n    /**\n     * Delegates exception management to the custom exception handler,\n     * or throws the exception if no custom handler is set.\n     */\n    protected function handleException(Throwable $e, LogRecord $record): void\n    {\n        if (null === $this->exceptionHandler) {\n            throw $e;\n        }\n\n        ($this->exceptionHandler)($e, $record);\n    }\n\n    /**\n     * @return array<string, mixed>\n     */\n    public function __serialize(): array\n    {\n        return [\n            'name' => $this->name,\n            'handlers' => $this->handlers,\n            'processors' => $this->processors,\n            'microsecondTimestamps' => $this->microsecondTimestamps,\n            'timezone' => $this->timezone,\n            'exceptionHandler' => $this->exceptionHandler,\n            'logDepth' => $this->logDepth,\n            'detectCycles' => $this->detectCycles,\n        ];\n    }\n\n    /**\n     * @param array<string, mixed> $data\n     */\n    public function __unserialize(array $data): void\n    {\n        foreach (['name', 'handlers', 'processors', 'microsecondTimestamps', 'timezone', 'exceptionHandler', 'logDepth', 'detectCycles'] as $property) {\n            if (isset($data[$property])) {\n                $this->$property = $data[$property];\n            }\n        }\n\n        $this->fiberLogDepth = new \\WeakMap();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/ClosureContextProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\LogRecord;\n\n/**\n * Generates a context from a Closure if the Closure is the only value\n * in the context\n *\n * It helps reduce the performance impact of debug logs if they do\n * need to create lots of context information. If this processor is added\n * on the correct handler the context data will only be generated\n * when the logs are actually logged to that handler, which is useful when\n * using FingersCrossedHandler or other filtering handlers to conditionally\n * log records.\n */\nclass ClosureContextProcessor implements ProcessorInterface\n{\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        $context = $record->context;\n        if (isset($context[0]) && 1 === \\count($context) && $context[0] instanceof \\Closure) {\n            try {\n                $context = $context[0]();\n            } catch (\\Throwable $e) {\n                $context = [\n                    'error_on_context_generation' => $e->getMessage(),\n                    'exception' => $e,\n                ];\n            }\n\n            if (!\\is_array($context)) {\n                $context = [$context];\n            }\n\n            $record = $record->with(context: $context);\n        }\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\LogRecord;\n\n/**\n * Injects Git branch and Git commit SHA in all records\n *\n * @author Nick Otter\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass GitProcessor implements ProcessorInterface\n{\n    private Level $level;\n    /** @var array{branch: string, commit: string}|array<never>|null */\n    private static $cache = null;\n\n    /**\n     * @param int|string|Level|LogLevel::* $level The minimum logging level at which this Processor will be triggered\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public function __construct(int|string|Level $level = Level::Debug)\n    {\n        $this->level = Logger::toMonologLevel($level);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        // return if the level is not high enough\n        if ($record->level->isLowerThan($this->level)) {\n            return $record;\n        }\n\n        $record->extra['git'] = self::getGitInfo();\n\n        return $record;\n    }\n\n    /**\n     * @return array{branch: string, commit: string}|array<never>\n     */\n    private static function getGitInfo(): array\n    {\n        if (self::$cache !== null) {\n            return self::$cache;\n        }\n\n        $branches = shell_exec('git branch -v --no-abbrev');\n        if (is_string($branches) && 1 === preg_match('{^\\* (.+?)\\s+([a-f0-9]{40})(?:\\s|$)}m', $branches, $matches)) {\n            return self::$cache = [\n                'branch' => $matches[1],\n                'commit' => $matches[2],\n            ];\n        }\n\n        return self::$cache = [];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\LogRecord;\n\n/**\n * Injects value of gethostname in all records\n */\nclass HostnameProcessor implements ProcessorInterface\n{\n    private static string $host;\n\n    public function __construct()\n    {\n        self::$host = (string) gethostname();\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        $record->extra['hostname'] = self::$host;\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\LogRecord;\n\n/**\n * Injects line/file:class/function where the log message came from\n *\n * Warning: This only works if the handler processes the logs directly.\n * If you put the processor on a handler that is behind a FingersCrossedHandler\n * for example, the processor will only be called once the trigger level is reached,\n * and all the log records will have the same file/line/.. data from the call that\n * triggered the FingersCrossedHandler.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass IntrospectionProcessor implements ProcessorInterface\n{\n    private Level $level;\n\n    /** @var string[] */\n    private array $skipClassesPartials;\n\n    private int $skipStackFramesCount;\n\n    private const SKIP_FUNCTIONS = [\n        'call_user_func',\n        'call_user_func_array',\n    ];\n\n    /**\n     * @param string|int|Level $level               The minimum logging level at which this Processor will be triggered\n     * @param string[]                   $skipClassesPartials\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public function __construct(int|string|Level $level = Level::Debug, array $skipClassesPartials = [], int $skipStackFramesCount = 0)\n    {\n        $this->level = Logger::toMonologLevel($level);\n        $this->skipClassesPartials = array_merge(['Monolog\\\\'], $skipClassesPartials);\n        $this->skipStackFramesCount = $skipStackFramesCount;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        // return if the level is not high enough\n        if ($record->level->isLowerThan($this->level)) {\n            return $record;\n        }\n\n        $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);\n\n        // skip first since it's always the current method\n        array_shift($trace);\n        // the call_user_func call is also skipped\n        array_shift($trace);\n\n        $i = 0;\n\n        while ($this->isTraceClassOrSkippedFunction($trace, $i)) {\n            if (isset($trace[$i]['class'])) {\n                foreach ($this->skipClassesPartials as $part) {\n                    if (strpos($trace[$i]['class'], $part) !== false) {\n                        $i++;\n\n                        continue 2;\n                    }\n                }\n            } elseif (in_array($trace[$i]['function'], self::SKIP_FUNCTIONS, true)) {\n                $i++;\n\n                continue;\n            }\n\n            break;\n        }\n\n        $i += $this->skipStackFramesCount;\n\n        // we should have the call source now\n        $record->extra = array_merge(\n            $record->extra,\n            [\n                'file'      => $trace[$i - 1]['file'] ?? null,\n                'line'      => $trace[$i - 1]['line'] ?? null,\n                'class'     => $trace[$i]['class'] ?? null,\n                'callType'  => $trace[$i]['type'] ?? null,\n                'function'  => $trace[$i]['function'] ?? null,\n            ]\n        );\n\n        return $record;\n    }\n\n    /**\n     * @param array<mixed> $trace\n     */\n    private function isTraceClassOrSkippedFunction(array $trace, int $index): bool\n    {\n        if (!isset($trace[$index])) {\n            return false;\n        }\n\n        return isset($trace[$index]['class']) || in_array($trace[$index]['function'], self::SKIP_FUNCTIONS, true);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/LoadAverageProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\LogRecord;\n\n/**\n * Injects sys_getloadavg in all records @see https://www.php.net/manual/en/function.sys-getloadavg.php\n *\n * @author Johan Vlaar <johan.vlaar.1994@gmail.com>\n */\nclass LoadAverageProcessor implements ProcessorInterface\n{\n    public const LOAD_1_MINUTE = 0;\n    public const LOAD_5_MINUTE = 1;\n    public const LOAD_15_MINUTE = 2;\n\n    private const AVAILABLE_LOAD = [\n        self::LOAD_1_MINUTE,\n        self::LOAD_5_MINUTE,\n        self::LOAD_15_MINUTE,\n    ];\n\n    /**\n     * @var int\n     */\n    protected $avgSystemLoad;\n\n    /**\n     * @param self::LOAD_* $avgSystemLoad\n     */\n    public function __construct(int $avgSystemLoad = self::LOAD_1_MINUTE)\n    {\n        if (!in_array($avgSystemLoad, self::AVAILABLE_LOAD, true)) {\n            throw new \\InvalidArgumentException(sprintf('Invalid average system load: `%s`', $avgSystemLoad));\n        }\n        $this->avgSystemLoad = $avgSystemLoad;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        if (!function_exists('sys_getloadavg')) {\n            return $record;\n        }\n        $usage = sys_getloadavg();\n        if (false === $usage) {\n            return $record;\n        }\n\n        $record->extra['load_average'] = $usage[$this->avgSystemLoad];\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\LogRecord;\n\n/**\n * Injects memory_get_peak_usage in all records\n *\n * @see Monolog\\Processor\\MemoryProcessor::__construct() for options\n * @author Rob Jensen\n */\nclass MemoryPeakUsageProcessor extends MemoryProcessor\n{\n    /**\n     * @inheritDoc\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        $usage = memory_get_peak_usage($this->realUsage);\n\n        if ($this->useFormatting) {\n            $usage = $this->formatBytes($usage);\n        }\n\n        $record->extra['memory_peak_usage'] = $usage;\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\n/**\n * Some methods that are common for all memory processors\n *\n * @author Rob Jensen\n */\nabstract class MemoryProcessor implements ProcessorInterface\n{\n    /**\n     * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported.\n     */\n    protected bool $realUsage;\n\n    /**\n     * @var bool If true, then format memory size to human readable string (MB, KB, B depending on size)\n     */\n    protected bool $useFormatting;\n\n    /**\n     * @param bool $realUsage     Set this to true to get the real size of memory allocated from system.\n     * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size)\n     */\n    public function __construct(bool $realUsage = true, bool $useFormatting = true)\n    {\n        $this->realUsage = $realUsage;\n        $this->useFormatting = $useFormatting;\n    }\n\n    /**\n     * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is\n     *\n     * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as int\n     */\n    protected function formatBytes(int $bytes)\n    {\n        if (!$this->useFormatting) {\n            return $bytes;\n        }\n\n        if ($bytes > 1024 * 1024) {\n            return round($bytes / 1024 / 1024, 2).' MB';\n        } elseif ($bytes > 1024) {\n            return round($bytes / 1024, 2).' KB';\n        }\n\n        return $bytes . ' B';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\LogRecord;\n\n/**\n * Injects memory_get_usage in all records\n *\n * @see Monolog\\Processor\\MemoryProcessor::__construct() for options\n * @author Rob Jensen\n */\nclass MemoryUsageProcessor extends MemoryProcessor\n{\n    /**\n     * @inheritDoc\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        $usage = memory_get_usage($this->realUsage);\n\n        if ($this->useFormatting) {\n            $usage = $this->formatBytes($usage);\n        }\n\n        $record->extra['memory_usage'] = $usage;\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\LogRecord;\n\n/**\n * Injects Hg branch and Hg revision number in all records\n *\n * @author Jonathan A. Schweder <jonathanschweder@gmail.com>\n */\nclass MercurialProcessor implements ProcessorInterface\n{\n    private Level $level;\n    /** @var array{branch: string, revision: string}|array<never>|null */\n    private static $cache = null;\n\n    /**\n     * @param int|string|Level $level The minimum logging level at which this Processor will be triggered\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public function __construct(int|string|Level $level = Level::Debug)\n    {\n        $this->level = Logger::toMonologLevel($level);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        // return if the level is not high enough\n        if ($record->level->isLowerThan($this->level)) {\n            return $record;\n        }\n\n        $record->extra['hg'] = self::getMercurialInfo();\n\n        return $record;\n    }\n\n    /**\n     * @return array{branch: string, revision: string}|array<never>\n     */\n    private static function getMercurialInfo(): array\n    {\n        if (self::$cache !== null) {\n            return self::$cache;\n        }\n\n        $result = explode(' ', trim((string) shell_exec('hg id -nb')));\n\n        if (count($result) >= 3) {\n            return self::$cache = [\n                'branch' => $result[1],\n                'revision' => $result[2],\n            ];\n        }\n\n        return self::$cache = [];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\LogRecord;\n\n/**\n * Adds value of getmypid into records\n *\n * @author Andreas Hörnicke\n */\nclass ProcessIdProcessor implements ProcessorInterface\n{\n    /**\n     * @inheritDoc\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        $record->extra['process_id'] = getmypid();\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\LogRecord;\n\n/**\n * An optional interface to allow labelling Monolog processors.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\ninterface ProcessorInterface\n{\n    /**\n     * @return LogRecord The processed record\n     */\n    public function __invoke(LogRecord $record);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\Utils;\nuse Monolog\\LogRecord;\n\n/**\n * Processes a record's message according to PSR-3 rules\n *\n * It replaces {foo} with the value from $context['foo']\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass PsrLogMessageProcessor implements ProcessorInterface\n{\n    public const SIMPLE_DATE = \"Y-m-d\\TH:i:s.uP\";\n\n    private ?string $dateFormat;\n\n    private bool $removeUsedContextFields;\n\n    /**\n     * @param string|null $dateFormat              The format of the timestamp: one supported by DateTime::format\n     * @param bool        $removeUsedContextFields If set to true the fields interpolated into message gets unset\n     */\n    public function __construct(?string $dateFormat = null, bool $removeUsedContextFields = false)\n    {\n        $this->dateFormat = $dateFormat;\n        $this->removeUsedContextFields = $removeUsedContextFields;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        if (false === strpos($record->message, '{')) {\n            return $record;\n        }\n\n        $replacements = [];\n        $context = $record->context;\n\n        foreach ($context as $key => $val) {\n            $placeholder = '{' . $key . '}';\n            if (strpos($record->message, $placeholder) === false) {\n                continue;\n            }\n\n            if (null === $val || is_scalar($val) || (is_object($val) && method_exists($val, \"__toString\"))) {\n                $replacements[$placeholder] = $val;\n            } elseif ($val instanceof \\DateTimeInterface) {\n                if (null === $this->dateFormat && $val instanceof \\Monolog\\DateTimeImmutable) {\n                    // handle monolog dates using __toString if no specific dateFormat was asked for\n                    // so that it follows the useMicroseconds flag\n                    $replacements[$placeholder] = (string) $val;\n                } else {\n                    $replacements[$placeholder] = $val->format($this->dateFormat ?? static::SIMPLE_DATE);\n                }\n            } elseif ($val instanceof \\UnitEnum) {\n                $replacements[$placeholder] = $val instanceof \\BackedEnum ? $val->value : $val->name;\n            } elseif (is_object($val)) {\n                $replacements[$placeholder] = '[object '.Utils::getClass($val).']';\n            } elseif (is_array($val)) {\n                $replacements[$placeholder] = 'array'.Utils::jsonEncode($val, null, true);\n            } else {\n                $replacements[$placeholder] = '['.gettype($val).']';\n            }\n\n            if ($this->removeUsedContextFields) {\n                unset($context[$key]);\n            }\n        }\n\n        return $record->with(message: strtr($record->message, $replacements), context: $context);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\LogRecord;\n\n/**\n * Adds a tags array into record\n *\n * @author Martijn Riemers\n */\nclass TagProcessor implements ProcessorInterface\n{\n    /** @var string[] */\n    private array $tags;\n\n    /**\n     * @param string[] $tags\n     */\n    public function __construct(array $tags = [])\n    {\n        $this->setTags($tags);\n    }\n\n    /**\n     * @param string[] $tags\n     * @return $this\n     */\n    public function addTags(array $tags = []): self\n    {\n        $this->tags = array_merge($this->tags, $tags);\n\n        return $this;\n    }\n\n    /**\n     * @param string[] $tags\n     * @return $this\n     */\n    public function setTags(array $tags = []): self\n    {\n        $this->tags = $tags;\n\n        return $this;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        $record->extra['tags'] = $this->tags;\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\ResettableInterface;\nuse Monolog\\LogRecord;\n\n/**\n * Adds a unique identifier into records\n *\n * @author Simon Mönch <sm@webfactory.de>\n */\nclass UidProcessor implements ProcessorInterface, ResettableInterface\n{\n    /** @var non-empty-string */\n    private string $uid;\n\n    /**\n     * @param int<1, 32> $length\n     */\n    public function __construct(int $length = 7)\n    {\n        if ($length > 32 || $length < 1) {\n            throw new \\InvalidArgumentException('The uid length must be an integer between 1 and 32');\n        }\n\n        $this->uid = $this->generateUid($length);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        $record->extra['uid'] = $this->uid;\n\n        return $record;\n    }\n\n    public function getUid(): string\n    {\n        return $this->uid;\n    }\n\n    public function reset(): void\n    {\n        $this->uid = $this->generateUid(strlen($this->uid));\n    }\n\n    /**\n     * @param  positive-int     $length\n     * @return non-empty-string\n     */\n    private function generateUid(int $length): string\n    {\n        return substr(bin2hex(random_bytes((int) ceil($length / 2))), 0, $length);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse ArrayAccess;\nuse Monolog\\LogRecord;\n\n/**\n * Injects url/method and remote IP of the current web request in all records\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass WebProcessor implements ProcessorInterface\n{\n    /**\n     * @var array<string, mixed>|ArrayAccess<string, mixed>\n     */\n    protected array|ArrayAccess $serverData;\n\n    /**\n     * Default fields\n     *\n     * Array is structured as [key in record.extra => key in $serverData]\n     *\n     * @var array<string, string>\n     */\n    protected array $extraFields = [\n        'url'         => 'REQUEST_URI',\n        'ip'          => 'REMOTE_ADDR',\n        'http_method' => 'REQUEST_METHOD',\n        'server'      => 'SERVER_NAME',\n        'referrer'    => 'HTTP_REFERER',\n        'user_agent'  => 'HTTP_USER_AGENT',\n    ];\n\n    /**\n     * @param array<string, mixed>|ArrayAccess<string, mixed>|null $serverData  Array or object w/ ArrayAccess that provides access to the $_SERVER data\n     * @param array<string, string>|array<string>|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\n     */\n    public function __construct(array|ArrayAccess|null $serverData = null, array|null $extraFields = null)\n    {\n        if (null === $serverData) {\n            $this->serverData = &$_SERVER;\n        } else {\n            $this->serverData = $serverData;\n        }\n\n        $defaultEnabled = ['url', 'ip', 'http_method', 'server', 'referrer'];\n        if (isset($this->serverData['UNIQUE_ID'])) {\n            $this->extraFields['unique_id'] = 'UNIQUE_ID';\n            $defaultEnabled[] = 'unique_id';\n        }\n\n        if (null === $extraFields) {\n            $extraFields = $defaultEnabled;\n        }\n        if (isset($extraFields[0])) {\n            foreach (array_keys($this->extraFields) as $fieldName) {\n                if (!in_array($fieldName, $extraFields, true)) {\n                    unset($this->extraFields[$fieldName]);\n                }\n            }\n        } else {\n            $this->extraFields = $extraFields;\n        }\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function __invoke(LogRecord $record): LogRecord\n    {\n        // skip processing if for some reason request data\n        // is not present (CLI or wonky SAPIs)\n        if (!isset($this->serverData['REQUEST_URI'])) {\n            return $record;\n        }\n\n        $record->extra = $this->appendExtraFields($record->extra);\n\n        return $record;\n    }\n\n    /**\n     * @return $this\n     */\n    public function addExtraField(string $extraName, string $serverName): self\n    {\n        $this->extraFields[$extraName] = $serverName;\n\n        return $this;\n    }\n\n    /**\n     * @param  mixed[] $extra\n     * @return mixed[]\n     */\n    private function appendExtraFields(array $extra): array\n    {\n        foreach ($this->extraFields as $extraName => $serverName) {\n            $extra[$extraName] = $this->serverData[$serverName] ?? null;\n        }\n\n        return $extra;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Registry.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse InvalidArgumentException;\n\n/**\n * Monolog log registry\n *\n * Allows to get `Logger` instances in the global scope\n * via static method calls on this class.\n *\n * <code>\n * $application = new Monolog\\Logger('application');\n * $api = new Monolog\\Logger('api');\n *\n * Monolog\\Registry::addLogger($application);\n * Monolog\\Registry::addLogger($api);\n *\n * function testLogger()\n * {\n *     Monolog\\Registry::api()->error('Sent to $api Logger instance');\n *     Monolog\\Registry::application()->error('Sent to $application Logger instance');\n * }\n * </code>\n *\n * @author Tomas Tatarko <tomas@tatarko.sk>\n */\nclass Registry\n{\n    /**\n     * List of all loggers in the registry (by named indexes)\n     *\n     * @var Logger[]\n     */\n    private static array $loggers = [];\n\n    /**\n     * Adds new logging channel to the registry\n     *\n     * @param  Logger                    $logger    Instance of the logging channel\n     * @param  string|null               $name      Name of the logging channel ($logger->getName() by default)\n     * @param  bool                      $overwrite Overwrite instance in the registry if the given name already exists?\n     * @throws \\InvalidArgumentException If $overwrite set to false and named Logger instance already exists\n     */\n    public static function addLogger(Logger $logger, ?string $name = null, bool $overwrite = false): void\n    {\n        $name = $name ?? $logger->getName();\n\n        if (isset(self::$loggers[$name]) && !$overwrite) {\n            throw new InvalidArgumentException('Logger with the given name already exists');\n        }\n\n        self::$loggers[$name] = $logger;\n    }\n\n    /**\n     * Checks if such logging channel exists by name or instance\n     *\n     * @param string|Logger $logger Name or logger instance\n     */\n    public static function hasLogger($logger): bool\n    {\n        if ($logger instanceof Logger) {\n            $index = array_search($logger, self::$loggers, true);\n\n            return false !== $index;\n        }\n\n        return isset(self::$loggers[$logger]);\n    }\n\n    /**\n     * Removes instance from registry by name or instance\n     *\n     * @param string|Logger $logger Name or logger instance\n     */\n    public static function removeLogger($logger): void\n    {\n        if ($logger instanceof Logger) {\n            if (false !== ($idx = array_search($logger, self::$loggers, true))) {\n                unset(self::$loggers[$idx]);\n            }\n        } else {\n            unset(self::$loggers[$logger]);\n        }\n    }\n\n    /**\n     * Clears the registry\n     */\n    public static function clear(): void\n    {\n        self::$loggers = [];\n    }\n\n    /**\n     * Gets Logger instance from the registry\n     *\n     * @param  string                    $name Name of the requested Logger instance\n     * @throws \\InvalidArgumentException If named Logger instance is not in the registry\n     */\n    public static function getInstance(string $name): Logger\n    {\n        if (!isset(self::$loggers[$name])) {\n            throw new InvalidArgumentException(sprintf('Requested \"%s\" logger instance is not in the registry', $name));\n        }\n\n        return self::$loggers[$name];\n    }\n\n    /**\n     * Gets Logger instance from the registry via static method call\n     *\n     * @param  string                    $name      Name of the requested Logger instance\n     * @param  mixed[]                   $arguments Arguments passed to static method call\n     * @throws \\InvalidArgumentException If named Logger instance is not in the registry\n     * @return Logger                    Requested instance of Logger\n     */\n    public static function __callStatic(string $name, array $arguments): Logger\n    {\n        return self::getInstance($name);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/ResettableInterface.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\n/**\n * Handler or Processor implementing this interface will be reset when Logger::reset() is called.\n *\n * Resetting ends a log cycle gets them back to their initial state.\n *\n * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal\n * state, and getting it back to a state in which it can receive log records again.\n *\n * This is useful in case you want to avoid logs leaking between two requests or jobs when you\n * have a long running process like a worker or an application server serving multiple requests\n * in one process.\n *\n * @author Grégoire Pineau <lyrixx@lyrixx.info>\n */\ninterface ResettableInterface\n{\n    public function reset(): void;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/SignalHandler.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse Psr\\Log\\LoggerInterface;\nuse Psr\\Log\\LogLevel;\nuse ReflectionExtension;\n\n/**\n * Monolog POSIX signal handler\n *\n * @author Robert Gust-Bardon <robert@gust-bardon.org>\n */\nclass SignalHandler\n{\n    private LoggerInterface $logger;\n\n    /** @var array<int, callable|string|int> SIG_DFL, SIG_IGN or previous callable */\n    private array $previousSignalHandler = [];\n    /** @var array<int, \\Psr\\Log\\LogLevel::*> */\n    private array $signalLevelMap = [];\n    /** @var array<int, bool> */\n    private array $signalRestartSyscalls = [];\n\n    public function __construct(LoggerInterface $logger)\n    {\n        $this->logger = $logger;\n    }\n\n    /**\n     * @param  int|string|Level $level Level or level name\n     * @return $this\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    public function registerSignalHandler(int $signo, int|string|Level $level = LogLevel::CRITICAL, bool $callPrevious = true, bool $restartSyscalls = true, ?bool $async = true): self\n    {\n        if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) {\n            return $this;\n        }\n\n        $level = Logger::toMonologLevel($level)->toPsrLogLevel();\n\n        if ($callPrevious) {\n            $handler = pcntl_signal_get_handler($signo);\n            $this->previousSignalHandler[$signo] = $handler;\n        } else {\n            unset($this->previousSignalHandler[$signo]);\n        }\n        $this->signalLevelMap[$signo] = $level;\n        $this->signalRestartSyscalls[$signo] = $restartSyscalls;\n\n        if ($async !== null) {\n            pcntl_async_signals($async);\n        }\n\n        pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls);\n\n        return $this;\n    }\n\n    /**\n     * @param mixed $siginfo\n     */\n    public function handleSignal(int $signo, $siginfo = null): void\n    {\n        /** @var array<int, string> $signals */\n        static $signals = [];\n\n        if (\\count($signals) === 0 && extension_loaded('pcntl')) {\n            $pcntl = new ReflectionExtension('pcntl');\n            foreach ($pcntl->getConstants() as $name => $value) {\n                if (substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && is_int($value)) {\n                    $signals[$value] = $name;\n                }\n            }\n        }\n\n        $level = $this->signalLevelMap[$signo] ?? LogLevel::CRITICAL;\n        $signal = $signals[$signo] ?? $signo;\n        $context = $siginfo ?? [];\n        $this->logger->log($level, sprintf('Program received signal %s', $signal), $context);\n\n        if (!isset($this->previousSignalHandler[$signo])) {\n            return;\n        }\n\n        if ($this->previousSignalHandler[$signo] === SIG_DFL) {\n            if (extension_loaded('pcntl') && function_exists('pcntl_signal') && function_exists('pcntl_sigprocmask') && function_exists('pcntl_signal_dispatch')\n                && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill')\n            ) {\n                $restartSyscalls = $this->signalRestartSyscalls[$signo] ?? true;\n                pcntl_signal($signo, SIG_DFL, $restartSyscalls);\n                pcntl_sigprocmask(SIG_UNBLOCK, [$signo], $oldset);\n                posix_kill(posix_getpid(), $signo);\n                pcntl_signal_dispatch();\n                pcntl_sigprocmask(SIG_SETMASK, $oldset);\n                pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls);\n            }\n        } elseif (is_callable($this->previousSignalHandler[$signo])) {\n            $this->previousSignalHandler[$signo]($signo, $siginfo);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Test/TestCase.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Test;\n\nuse Monolog\\Level;\nuse Monolog\\Logger;\nuse Monolog\\LogRecord;\nuse Monolog\\DateTimeImmutable;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Psr\\Log\\LogLevel;\n\n/**\n * Lets you easily generate log records and a dummy formatter for testing purposes\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n *\n * @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\n */\nclass TestCase extends \\PHPUnit\\Framework\\TestCase\n{\n    public function tearDown(): void\n    {\n        parent::tearDown();\n\n        if (isset($this->handler)) {\n            unset($this->handler);\n        }\n    }\n\n    /**\n     * @param array<mixed> $context\n     * @param array<mixed> $extra\n     *\n     * @phpstan-param value-of<Level::VALUES>|value-of<Level::NAMES>|Level|LogLevel::* $level\n     */\n    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\n    {\n        return new LogRecord(\n            message: (string) $message,\n            context: $context,\n            level: Logger::toMonologLevel($level),\n            channel: $channel,\n            datetime: $datetime,\n            extra: $extra,\n        );\n    }\n\n    /**\n     * @phpstan-return list<LogRecord>\n     */\n    protected function getMultipleRecords(): array\n    {\n        return [\n            $this->getRecord(Level::Debug, 'debug message 1'),\n            $this->getRecord(Level::Debug, 'debug message 2'),\n            $this->getRecord(Level::Info, 'information'),\n            $this->getRecord(Level::Warning, 'warning'),\n            $this->getRecord(Level::Error, 'error'),\n        ];\n    }\n\n    protected function getIdentityFormatter(): FormatterInterface\n    {\n        $formatter = $this->createMock(FormatterInterface::class);\n        $formatter->expects(self::any())\n            ->method('format')\n            ->willReturnCallback(function ($record) {\n                return $record->message;\n            });\n\n        return $formatter;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Utils.php",
    "content": "<?php declare(strict_types=1);\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nfinal class Utils\n{\n    const DEFAULT_JSON_FLAGS = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION | JSON_INVALID_UTF8_SUBSTITUTE | JSON_PARTIAL_OUTPUT_ON_ERROR;\n\n    public static function getClass(object $object): string\n    {\n        $class = \\get_class($object);\n\n        if (false === ($pos = \\strpos($class, \"@anonymous\\0\"))) {\n            return $class;\n        }\n\n        if (false === ($parent = \\get_parent_class($class))) {\n            return \\substr($class, 0, $pos + 10);\n        }\n\n        return $parent . '@anonymous';\n    }\n\n    public static function substr(string $string, int $start, ?int $length = null): string\n    {\n        if (extension_loaded('mbstring')) {\n            return mb_strcut($string, $start, $length);\n        }\n\n        return substr($string, $start, (null === $length) ? strlen($string) : $length);\n    }\n\n    /**\n     * Makes sure if a relative path is passed in it is turned into an absolute path\n     *\n     * @param string $streamUrl stream URL or path without protocol\n     */\n    public static function canonicalizePath(string $streamUrl): string\n    {\n        $prefix = '';\n        if ('file://' === substr($streamUrl, 0, 7)) {\n            $streamUrl = substr($streamUrl, 7);\n            $prefix = 'file://';\n        }\n\n        // other type of stream, not supported\n        if (false !== strpos($streamUrl, '://')) {\n            return $streamUrl;\n        }\n\n        // already absolute\n        if (substr($streamUrl, 0, 1) === '/' || substr($streamUrl, 1, 1) === ':' || substr($streamUrl, 0, 2) === '\\\\\\\\') {\n            return $prefix.$streamUrl;\n        }\n\n        $streamUrl = getcwd() . '/' . $streamUrl;\n\n        return $prefix.$streamUrl;\n    }\n\n    /**\n     * Return the JSON representation of a value\n     *\n     * @param  mixed             $data\n     * @param  int               $encodeFlags  flags to pass to json encode, defaults to DEFAULT_JSON_FLAGS\n     * @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\n     * @throws \\RuntimeException if encoding fails and errors are not ignored\n     * @return string            when errors are ignored and the encoding fails, \"null\" is returned which is valid json for null\n     */\n    public static function jsonEncode($data, ?int $encodeFlags = null, bool $ignoreErrors = false): string\n    {\n        if (null === $encodeFlags) {\n            $encodeFlags = self::DEFAULT_JSON_FLAGS;\n        }\n\n        if ($ignoreErrors) {\n            $json = @json_encode($data, $encodeFlags);\n            if (false === $json) {\n                return 'null';\n            }\n\n            return $json;\n        }\n\n        $json = json_encode($data, $encodeFlags);\n        if (false === $json) {\n            $json = self::handleJsonError(json_last_error(), $data);\n        }\n\n        return $json;\n    }\n\n    /**\n     * Handle a json_encode failure.\n     *\n     * If the failure is due to invalid string encoding, try to clean the\n     * input and encode again. If the second encoding attempt fails, the\n     * initial error is not encoding related or the input can't be cleaned then\n     * raise a descriptive exception.\n     *\n     * @param  int               $code        return code of json_last_error function\n     * @param  mixed             $data        data that was meant to be encoded\n     * @param  int               $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION\n     * @throws \\RuntimeException if failure can't be corrected\n     * @return string            JSON encoded data after error correction\n     */\n    public static function handleJsonError(int $code, $data, ?int $encodeFlags = null): string\n    {\n        if ($code !== JSON_ERROR_UTF8) {\n            self::throwEncodeError($code, $data);\n        }\n\n        if (is_string($data)) {\n            self::detectAndCleanUtf8($data);\n        } elseif (is_array($data)) {\n            array_walk_recursive($data, ['Monolog\\Utils', 'detectAndCleanUtf8']);\n        } else {\n            self::throwEncodeError($code, $data);\n        }\n\n        if (null === $encodeFlags) {\n            $encodeFlags = self::DEFAULT_JSON_FLAGS;\n        }\n\n        $json = json_encode($data, $encodeFlags);\n\n        if ($json === false) {\n            self::throwEncodeError(json_last_error(), $data);\n        }\n\n        return $json;\n    }\n\n    /**\n     * @internal\n     */\n    public static function pcreLastErrorMessage(int $code): string\n    {\n        if (PHP_VERSION_ID >= 80000) {\n            return preg_last_error_msg();\n        }\n\n        $constants = (get_defined_constants(true))['pcre'];\n        $constants = array_filter($constants, function ($key) {\n            return substr($key, -6) == '_ERROR';\n        }, ARRAY_FILTER_USE_KEY);\n\n        $constants = array_flip($constants);\n\n        return $constants[$code] ?? 'UNDEFINED_ERROR';\n    }\n\n    /**\n     * Throws an exception according to a given code with a customized message\n     *\n     * @param  int               $code return code of json_last_error function\n     * @param  mixed             $data data that was meant to be encoded\n     * @throws \\RuntimeException\n     */\n    private static function throwEncodeError(int $code, $data): never\n    {\n        $msg = match ($code) {\n            JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',\n            JSON_ERROR_STATE_MISMATCH => 'Underflow or the modes mismatch',\n            JSON_ERROR_CTRL_CHAR => 'Unexpected control character found',\n            JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded',\n            default => 'Unknown error',\n        };\n\n        throw new \\RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true));\n    }\n\n    /**\n     * Detect invalid UTF-8 string characters and convert to valid UTF-8.\n     *\n     * Valid UTF-8 input will be left unmodified, but strings containing\n     * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed\n     * original encoding of ISO-8859-15. This conversion may result in\n     * incorrect output if the actual encoding was not ISO-8859-15, but it\n     * will be clean UTF-8 output and will not rely on expensive and fragile\n     * detection algorithms.\n     *\n     * Function converts the input in place in the passed variable so that it\n     * can be used as a callback for array_walk_recursive.\n     *\n     * @param mixed $data Input to check and convert if needed, passed by ref\n     */\n    private static function detectAndCleanUtf8(&$data): void\n    {\n        if (is_string($data) && preg_match('//u', $data) !== 1) {\n            $data = preg_replace_callback(\n                '/[\\x80-\\xFF]+/',\n                function (array $m): string {\n                    return function_exists('mb_convert_encoding') ? mb_convert_encoding($m[0], 'UTF-8', 'ISO-8859-1') : utf8_encode($m[0]);\n                },\n                $data\n            );\n            if (!is_string($data)) {\n                $pcreErrorCode = preg_last_error();\n\n                throw new \\RuntimeException('Failed to preg_replace_callback: ' . $pcreErrorCode . ' / ' . self::pcreLastErrorMessage($pcreErrorCode));\n            }\n            $data = str_replace(\n                ['¤', '¦', '¨', '´', '¸', '¼', '½', '¾'],\n                ['€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'],\n                $data\n            );\n        }\n    }\n\n    /**\n     * Converts a string with a valid 'memory_limit' format, to bytes.\n     *\n     * @param  string|false $val\n     * @return int|false    Returns an integer representing bytes. Returns FALSE in case of error.\n     */\n    public static function expandIniShorthandBytes($val)\n    {\n        if (!is_string($val)) {\n            return false;\n        }\n\n        // support -1\n        if ((int) $val < 0) {\n            return (int) $val;\n        }\n\n        if (preg_match('/^\\s*(?<val>\\d+)(?:\\.\\d+)?\\s*(?<unit>[gmk]?)\\s*$/i', $val, $match) !== 1) {\n            return false;\n        }\n\n        $val = (int) $match['val'];\n        switch (strtolower($match['unit'] ?? '')) {\n            case 'g':\n                $val *= 1024;\n                // no break\n            case 'm':\n                $val *= 1024;\n                // no break\n            case 'k':\n                $val *= 1024;\n        }\n\n        return $val;\n    }\n\n    public static function getRecordMessageForException(LogRecord $record): string\n    {\n        $context = '';\n        $extra = '';\n\n        try {\n            if (\\count($record->context) > 0) {\n                $context = \"\\nContext: \" . json_encode($record->context, JSON_THROW_ON_ERROR);\n            }\n            if (\\count($record->extra) > 0) {\n                $extra = \"\\nExtra: \" . json_encode($record->extra, JSON_THROW_ON_ERROR);\n            }\n        } catch (\\Throwable $e) {\n            // noop\n        }\n\n        return \"\\nThe exception occurred while attempting to log: \" . $record->message . $context . $extra;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/.github/FUNDING.yml",
    "content": "github: [overtrue]\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/.github/dependabot.yml",
    "content": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where the package manifests are located.\n# Please see the documentation for all configuration options:\n# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupdates:\n  - package-ecosystem: \"composer\" # See documentation for possible values\n    directory: \"/\" # Location of package manifests\n    schedule:\n      interval: \"daily\"\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/.github/workflows/lint.yml",
    "content": "name: Lint\non: [push, pull_request]\n\njobs:\n  phpstan:\n    name: PHPStan\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n    - run: composer validate --strict\n    - run: echo \"dir=$(composer config cache-files-dir)\" >> $GITHUB_OUTPUT\n      id: composer-cache\n    - uses: actions/cache@v3\n      with:\n        path: ${{ steps.composer-cache.outputs.dir }}\n        key: dependencies-caches-php-${{ hashFiles('**/composer.lock') }}\n        restore-keys: dependencies-caches-php-\n    - run: composer install --no-progress\n    - run: composer phpstan\n\n  php_cs_fixer:\n    name: PHP-CS-Fxier\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n    - run: echo \"dir=$(composer config cache-files-dir)\" >> $GITHUB_OUTPUT\n      id: composer-cache\n    - uses: actions/cache@v3\n      with:\n        path: ${{ steps.composer-cache.outputs.dir }}\n        key: dependencies-caches-php-${{ hashFiles('**/composer.lock') }}\n        restore-keys: dependencies-caches-php-\n    - run: composer install --no-progress\n    - run: composer check-style\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/.github/workflows/test.yml",
    "content": "name: Test\non: [push, pull_request]\n\njobs:\n  phpunit:\n    name: PHP-${{ matrix.php_version }}-${{ matrix.perfer }}\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        php_version:\n          - 8.0\n          - 8.1\n        perfer:\n          - stable\n          - lowest\n    steps:\n    - uses: actions/checkout@v3\n    - run: composer validate --strict\n    - run: echo \"dir=$(composer config cache-files-dir)\" >> $GITHUB_OUTPUT\n      id: composer-cache\n    - uses: actions/cache@v3\n      with:\n        path: ${{ steps.composer-cache.outputs.dir }}\n        key: dependencies-caches-php-${{ hashFiles('**/composer.lock') }}\n        restore-keys: dependencies-caches-php-\n    - run: composer update --prefer-dist --no-interaction --no-suggest --prefer-${{ matrix.perfer }}\n    - run: ./vendor/bin/phpunit\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/.gitignore",
    "content": "/vendor\ncomposer.phar\ncomposer.lock\n.DS_Store\n/.idea\nThumbs.db\n/*.php\nsftp-config.json\n*.cache.phpunit.result.cache\n.phpunit.result.cache\n.php-cs-fixer.cache\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2021 overtrue <i@overtrue.me>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/README.md",
    "content": "# Socialite\n\nSocialite 是一个 [OAuth2](https://oauth.net/2/) 认证工具。 它的灵感来源于 [laravel/socialite](https://github.com/laravel/socialite) ， 你可以很轻易的在任何 PHP 项目中使用它。[英文文档](/README_EN.md)\n\n[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/overtrue/socialite?style=flat-square)](https://github.com/overtrue/socialite/releases)\n[![GitHub License](https://img.shields.io/github/license/overtrue/socialite?style=flat-square)](https://github.com/overtrue/socialite/blob/master/LICENSE)\n[![Packagist Downloads](https://img.shields.io/packagist/dt/overtrue/socialite?style=flat-square)](https://packagist.org/packages/overtrue/socialite)\n\n[![Sponsor me](https://github.com/overtrue/overtrue/blob/master/sponsor-me-button-s.svg?raw=true)](https://github.com/sponsors/overtrue)\n\n该工具现已支持平台有：Facebook，Github，Google，Linkedin，Outlook，QQ，TAPD，支付宝，淘宝，百度，钉钉，微博，微信，抖音，飞书，Lark，豆瓣，企业微信，腾讯云，Line，Gitee，Coding。\n\n如果你喜欢我的项目并想支持我，[点击这里 :heart:](https://github.com/sponsors/overtrue)\n\n# 版本要求\n\n```\nPHP >= 8.0.2\n```\n\n# 安装\n\n```shell\n$ composer require \"overtrue/socialite\" -vvv\n```\n\n# 使用指南\n\n用户只需要创建相应配置变量，然后通过工具为各个平台创建认证应用，并轻松获取该平台的 access_token 和用户相关信息。工具实现逻辑详见参照各大平台 OAuth2 文档。\n\n工具使用大致分为以下几步：\n\n1. 配置平台设置\n2. 创建对应平台应用\n3. 让用户跳转至平台认证\n4. 服务器收到平台回调 Code，使用 Code 换取平台处用户信息（包括 access_token）\n\n为 Laravel 用户创建的更方便的整合的包： [overtrue/laravel-socialite](https://github.com/overtrue/laravel-socialite)\n\n`authorize.php`: 让用户跳转至平台认证\n\n```php\n<?php\n\nuse Overtrue\\Socialite\\SocialiteManager;\n\n$config = [\n    'github' => [\n        'client_id'     => 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect'      => 'http://localhost/socialite/callback.php',\n    ],\n];\n\n$socialite = new SocialiteManager($config);\n\n$url = $socialite->create('github')->redirect();\n\nreturn redirect($url); \n```\n\n`callback.php`:\n\n```php\n<?php\n\nuse Overtrue\\Socialite\\SocialiteManager;\n\n$config = [\n    'github' => [\n        'client_id' => 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect' => 'http://localhost/socialite/callback.php',\n    ],\n];\n\n$socialite = new SocialiteManager($config);\n\n$code = request()->query('code');\n\n$user = $socialite->create('github')->userFromCode($code);\n\n$user->getId();        // 1472352\n$user->getNickname();  // \"overtrue\"\n$user->getUsername();  // \"overtrue\"\n$user->getName();      // \"安正超\"\n$user->getEmail();     // \"anzhengchao@gmail.com\"\n...\n```\n\n## 配置\n\n为每个平台设置相同的键值对后就能开箱即用：`client_id`, `client_secret`, `redirect`.\n\n示例：\n\n```php\n$config = [\n  'weibo' => [\n    'client_id'     => 'your-app-id',\n    'client_secret' => 'your-app-secret',\n    'redirect'      => 'http://localhost/socialite/callback.php',\n  ],\n  'facebook' => [\n    'client_id'     => 'your-app-id',\n    'client_secret' => 'your-app-secret',\n    'redirect'      => 'http://localhost/socialite/callback.php',\n  ],\n];\n```\n\n### 自定义应用名\n\n你可以使用任意你喜欢的名字对每个平台进行命名，比如说 `foo`， 采用别名的方法后需要在配置中多设置一个 `provider` 键，这样才能告诉工具包如何正确找到你想要的程序：\n\n```php\n$config = [\n  // 为 github 应用起别名为 foo\n    'foo' => [\n        'provider' \t\t\t=> 'github',  // <-- provider name\n        'client_id' \t\t=> 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect' \t\t\t=> 'http://localhost/socialite/callback.php',\n    ],\n       \n    // 另外一个名字叫做 bar 的 github 应用\n    'bar' => [\n        'provider' \t\t\t=> 'github',  // <-- provider name\n        'client_id' \t\t=> 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect' \t\t\t=> 'http://localhost/socialite/callback.php',\n    ],\n  \n    //...\n];\n\n$socialite = new SocialiteManager($config);\n\n$appFoo = $socialite->create('foo');\n$appBar = $socialite->create('bar');\n```\n\n### 扩展自定义服务提供程序\n\n你可以很容易的从自定义的服务提供中创建应用，只需要遵循如下两点：\n\n1. 使用自定义创建器\n\n   如下代码所示，为 foo 应用定义了服务提供名，但是工具本身还未支持，所以使用创建器 `extend()`，以闭包函数的形式为该服务提供创建一个实例。\n\n```php\n$config = [\n    'foo' => [\n        'provider' => 'myprovider',  // <-- 一个工具还未支持的服务提供程序\n        'client_id' => 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect' => 'http://localhost/socialite/callback.php',\n    ],\n];\n\n$socialite = new SocialiteManager($config);\n   \n$socialite->extend('myprovider', function(array $config) {\n    return new MyCustomProvider($config);\n});\n\n$app = $socialite->create('foo');\n```\n\n2. 使用服务提供类\n\n>👋🏻 你的自定义服务提供类必须实现`Overtrue\\Socialite\\Contracts\\ProviderInterface` 接口\n\n```php\nclass MyCustomProvider implements \\Overtrue\\Socialite\\Contracts\\ProviderInterface \n{\n    //...\n}\n```\n\n接下来为 `provider` 设置该类名让工具可以找到该类并实例化：\n\n```php\n$config = [\n    'foo' => [\n        'provider' \t\t\t=> MyCustomProvider::class,  // <-- 类名\n        'client_id' \t\t=> 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect'\t\t \t=> 'http://localhost/socialite/callback.php',\n    ],\n];\n\n$socialite = new SocialiteManager($config);\n$app = $socialite->create('foo');\n```\n\n\n\n## 平台\n\n不同的平台有不同的配置方法，为了确保工具的正常运行，所以请确保你所使用的平台的配置都是如期设置的。\n\n### [支付宝](https://opendocs.alipay.com/open/200/105310#s2)\n\n请按如下方式配置\n\n```php\n$config = [\n  'alipay' => [\n    // 这个键名还能像官方文档那样叫做 'app_id'\n    'client_id' => 'your-app-id', \n \n    // 请根据官方文档，在官方管理后台配置 RSA2\n    // 注意： 这是你自己的私钥\n    // 注意： 不允许私钥内容有其他字符\n    // 建议： 为了保证安全，你可以将文本信息从磁盘文件中读取，而不是在这里明文\n    'rsa_private_key' => 'your-rsa-private-key',\n\n    // 确保这里的值与你在服务后台绑定的地址值一致\n    // 这个键名还能像官方文档那样叫做 'redirect_url'\n    'redirect' => 'http://localhost/socialite/callback.php',\n    \n    // 沙箱模式接入地址见 https://opendocs.alipay.com/open/220/105337#%E5%85%B3%E4%BA%8E%E6%B2%99%E7%AE%B1\n    'sandbox' => false,\n  ]\n  ...\n];\n\n$socialite = new SocialiteManager($config);\n\n$user = $socialite->create('alipay')->userFromCode('here is auth code');\n\n// 详见文档后面 \"User interface\"\n$user->getId();        // 1472352\n$user->getNickname();  // \"overtrue\"\n$user->getUsername();  // \"overtrue\"\n$user->getName();      // \"安正超\"\n...\n```\n\n本工具暂时只支持 RSA2 个人私钥认证方式。\n\n### [钉钉](https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3)\n\n如文档所示\n\n> 注意：该工具仅支持 QR code 连接到第三方网站，用来获取用户信息（opeid， unionid 和 nickname）\n\n```php\n$config = [\n  'dingtalk' => [\n      // or 'app_id'\n      'client_id' => 'your app id',\n\n      // or 'app_secret' \n      'client_secret' => 'your app secret',\n\n      // or 'redirect_url'\n      'redirect' => 'redirect URL'\n  ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$user = $socialite->create('dingtalk')->userFromCode('here is auth code');\n\n// 详见文档后面 \"User interface\"\n$user->getId();        // 1472352\n$user->getNickname();  // \"overtrue\"\n$user->getUsername();  // \"overtrue\"\n$user->getName();      // \"安正超\"\n...\n```\n\n### [抖音](https://open.douyin.com/platform/doc/OpenAPI-oauth2)\n\n> 注意： 使用抖音服务提供的时候，如果你想直接使用 access_token 获取用户信息时，请先设置 openid。 先调用 `withOpenId()` 再调用 `userFromToken()`\n\n```php\n$config = [\n  'douyin' => [\n      'client_id' => 'your app id',\n\n      'client_secret' => 'your app secret',\n\n      'redirect' => 'redirect URL'\n  ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$user = $socialite->create('douyin')->userFromCode('here is auth code');\n\n$user = $socialite->create('douyin')->withOpenId('openId')->userFromToken('here is the access token');\n```\n\n### [头条](https://open.douyin.com/platform/resource/docs/develop/permission/toutiao-or-xigua/OAuth2.0/)\n\n> 注意： 使用`头条`服务提供的时候，如果你想直接使用 access_token 获取用户信息时，请先设置 openid。 先调用 `withOpenId()` 再调用 `userFromToken()`\n\n```php\n$config = [\n  'toutiao' => [\n    'client_id' => 'your app id',\n    'client_secret' => 'your app secret',\n    'redirect' => 'redirect URL'\n  ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$user = $socialite->create('toutiao')->userFromCode('here is auth code');\n$user = $socialite->create('toutiao')->withOpenId('openId')->userFromToken('here is the access token');\n```\n\n### [西瓜](https://open.douyin.com/platform/resource/docs/develop/permission/toutiao-or-xigua/OAuth2.0/)\n\n> 注意： 使用`西瓜`服务提供的时候，如果你想直接使用 access_token 获取用户信息时，请先设置 openid。 先调用 `withOpenId()` 再调用 `userFromToken()`\n\n```php\n$config = [\n  'xigua' => [\n    'client_id' => 'your app id',\n    'client_secret' => 'your app secret',\n    'redirect' => 'redirect URL'\n  ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$user = $socialite->create('xigua')->userFromCode('here is auth code');\n$user = $socialite->create('xigua')->withOpenId('openId')->userFromToken('here is the access token');\n```\n\n\n### [百度](https://developer.baidu.com/wiki/index.php?title=docs/oauth)\n\n其他配置没啥区别，在用法上，可以很轻易的选择重定向登录页面的模式，通过 `withDisplay()`\n\n- **page：**全屏形式的授权页面 (默认)，适用于 web 应用。\n- **popup:** 弹框形式的授权页面，适用于桌面软件应用和 web 应用。\n- **dialog:** 浮层形式的授权页面，只能用于站内 web 应用。\n- **mobile:** Iphone/Android 等智能移动终端上用的授权页面，适用于 Iphone/Android 等智能移动终端上的应用。\n- **tv:** 电视等超大显示屏使用的授权页面。\n- **pad:** IPad/Android 等智能平板电脑使用的授权页面。\n\n```php\n$authUrl = $socialite->create('baidu')->withDisplay('mobile')->redirect();\n\n```\n\n`popup` 模式是工具内默认的使用模式。`basic` 是默认使用的 scopes 值。\n\n### [飞书](https://open.feishu.cn/document/ukTMukTMukTM/uITNz4iM1MjLyUzM)\n\n通过一些简单的方法配置  app_ticket 就能使用内部应用模式\n\n```php\n$config = [\n    'feishu' => [\n        // or 'app_id'\n        'client_id' => 'your app id',\n\n        // or 'app_secret' \n        'client_secret' => 'your app secret',\n\n        // or 'redirect_url'\n        'redirect' => 'redirect URL',\n\n        // 如果你想使用使用内部应用的方式获取 app_access_token\n        // 对这个键设置了 'internal' 值那么你已经开启了内部应用模式\n        'app_mode' => 'internal'\n    ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$feishuDriver = $socialite->create('feishu');\n\n$feishuDriver->withInternalAppMode()->userFromCode('here is code');\n$feishuDriver->withDefaultMode()->withAppTicket('app_ticket')->userFromCode('here is code');\n```\n\n### [Lark](https://open.larksuite.com/document/ukTMukTMukTM/uITNz4iM1MjLyUzM)\n\n通过一些简单的方法配置  app_ticket 就能使用内部应用模式\n\n```php\n$config = [\n    'lark' => [\n        // or 'app_id'\n        'client_id' => 'your app id',\n\n        // or 'app_secret' \n        'client_secret' => 'your app secret',\n\n        // or 'redirect_url'\n        'redirect' => 'redirect URL',\n\n        // 如果你想使用使用内部应用的方式获取 app_access_token\n        // 对这个键设置了 'internal' 值那么你已经开启了内部应用模式\n        'app_mode' => 'internal'\n    ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$larkDriver = $socialite->create('lark');\n\n$larkDriver->withInternalAppMode()->userFromCode('here is code');\n$larkDriver->withDefaultMode()->withAppTicket('app_ticket')->userFromCode('here is code');\n```\n\n### [淘宝](https://open.taobao.com/doc.htm?docId=102635&docType=1&source=search)\n\n其他配置与其他平台的一样，你能选择你想要展示的重定向页面类型通过使用 `withView()` \n\n```php\n$authUrl = $socialite->create('taobao')->withView('wap')->redirect();\n```\n\n`web` 模式是工具默认使用的展示方式， `user_info` 是默认使用的 scopes 范围值。\n\n### [微信](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Official_Accounts/official_account_website_authorization.html)\n\n我们支持开放平台代表公众号进行第三方平台网页授权。\n\n你只需要像下面这样输入你的配置。官方账号不需要授权。\n\n```php\n...\n[\n    'wechat' =>\n        [\n            'client_id' \t\t=> 'client_id',\n            'client_secret' => 'client_secret',\n            'redirect' \t\t\t=> 'redirect-url',\n\n            // 开放平台 - 第三方平台所需\n            'component' => [\n                // or 'app_id', 'component_app_id' as key\n                'id' => 'component-app-id',\n                // or 'app_token', 'access_token', 'component_access_token' as key\n                'token' => 'component-access-token',\n            ]\n        ]\n],\n...\n```\n\n\n### [Coding](https://coding.net/help/openapi#oauth)\n\n您需要额外配置 `team_url` 为您的团队域名，例如：\n\n```php\n$config = [\n    'coding' => [\n        'team_url' => 'https://{your-team}.coding.net', \n        'client_id' => 'your app id',\n        'client_secret' => 'your app secret',\n        'redirect' => 'redirect URL',\n    ]\n];\n```\n\n## 其他一些技巧\n\n### Scopes\n\n在重定向用户之前，您还可以使用 `scopes()` 方法在请求上设置 “范围”。此方法将覆盖所有现有的作用域：\n\n```php\n$response = $socialite->create('github')\n                ->scopes(['scope1', 'scope2'])->redirect();\n```\n\n### Redirect URL\n\n你也可以动态设置' redirect_uri '，你可以使用以下方法来改变 `redirect_uri` URL:\n\n```php\n$url = 'your callback url.';\n\n$socialite->redirect($url);\n// or\n$socialite->withRedirectUrl($url)->redirect();\n```\n\n### State\n\n你的应用程序可以使用一个状态参数来确保响应属于同一个用户发起的请求，从而防止跨站请求伪造 (CSFR) 攻击。当恶意攻击者欺骗用户执行不需要的操作 (只有用户有权在受信任的 web 应用程序上执行) 时，就会发生 CSFR 攻击，所有操作都将在不涉及或警告用户的情况下完成。\n\n这里有一个最简单的例子，说明了如何提供状态可以让你的应用程序更安全。在本例中，我们使用会话 ID 作为状态参数，但是您可以使用您想要为状态创建值的任何逻辑。\n\n### 带着 `state` 参数的重定向\n\n```php\n<?php\nsession_start();\n \n$config = [\n    //...\n];\n\n// Assign to state the hashing of the session ID\n$state = hash('sha256', session_id());\n\n$socialite = new SocialiteManager($config);\n\n$url = $socialite->create('github')->withState($state)->redirect();\n\nreturn redirect($url); \n```\n\n### 检验回调的 `state`\n\n一旦用户授权你的应用程序，用户将被重定向回你的应用程序的 redirect_uri。OAuth 服务器将不加修改地返回状态参数。检查 redirect_uri 中提供的状态是否与应用程序生成的状态相匹配：\n\n```php\n<?php\nsession_start();\n \n$state = request()->query('state');\n$code = request()->query('code');\n \n// Check the state received with current session id\nif ($state != hash('sha256', session_id())) {\n    exit('State does not match!');\n}\n$user = $socialite->create('github')->userFromCode($code);\n\n// authorized\n```\n\n[查看更多关于 `state` 参数的文档](https://auth0.com/docs/protocols/oauth2/oauth-state)\n\n### 其他的一些参数\n\n要在请求中包含任何可选参数，调用 `with()` 方法传入一个你想要设置的关联数组：\n\n```php\n$response = $socialite->create('google')\n                    ->with(['hd' => 'example.com'])->redirect();\n```\n\n\n## User interface\n\n### 标准的 user api：\n\n```php\n$user = $socialite->create('github')->userFromCode($code);\n```\n\n```json\n{\n  \"id\": 1472352,\n  \"nickname\": \"overtrue\",\n  \"name\": \"安正超\",\n  \"email\": \"anzhengchao@gmail.com\",\n  \"avatar\": \"https://avatars.githubusercontent.com/u/1472352?v=3\",\n  \"raw\": {\n    \"login\": \"overtrue\",\n    \"id\": 1472352,\n    \"avatar_url\": \"https://avatars.githubusercontent.com/u/1472352?v=3\",\n    \"gravatar_id\": \"\",\n    \"url\": \"https://api.github.com/users/overtrue\",\n    \"html_url\": \"https://github.com/overtrue\",\n    ...\n  },\n  \"token_response\": {\n    \"access_token\": \"5b1dc56d64fffbd052359f032716cc4e0a1cb9a0\",\n    \"token_type\": \"bearer\",\n    \"scope\": \"user:email\"\n  }\n}\n```\n\n你可以像这样以数组键的形式获取 user 属性：\n\n```php\n$user['id'];        // 1472352\n$user['nickname'];  // \"overtrue\"\n$user['name'];      // \"安正超\"\n$user['email'];     // \"anzhengchao@gmail.com\"\n...\n```\n\n或者使用该 `User` 对象的方法：\n\n```php\nmixed   $user->getId();\n?string $user->getNickname();\n?string $user->getName();\n?string $user->getEmail();\n?string $user->getAvatar();\n?string $user->getRaw();\n?string $user->getAccessToken(); \n?string $user->getRefreshToken();\n?int    $user->getExpiresIn();\n?array  $user->getTokenResponse();\n\n\n```\n\n###  从 OAuth API 响应中取得原始数据\n\n`$user->getRaw()` 方法会返回一个 **array**。\n\n### 当你使用 userFromCode() 想要获取 token 响应的原始数据\n\n`$user->getTokenResponse()` 方法会返回一个 **array** 里面是响应从获取 token 时候 API 返回的响应。\n\n> 注意：当你使用 `userFromCode()` 时，这个方法只返回一个 **有效的数组**，否则将返回 **null**，因为 `userFromToken() ` 没有 token 的 HTTP 响应。\n\n### 通过 access token 获取用户信息\n\n```php\n$accessToken = 'xxxxxxxxxxx';\n$user = $socialite->userFromToken($accessToken);\n```\n\n\n\n# Enjoy it! :heart:\n\n# 参照\n\n- [Alipay - 用户信息授权](https://opendocs.alipay.com/open/289/105656)\n- [DingTalk - 扫码登录第三方网站](https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3)\n- [Google - OpenID Connect](https://developers.google.com/identity/protocols/OpenIDConnect)\n- [Github - Authorizing OAuth Apps](https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/)\n- [Facebook - Graph API](https://developers.facebook.com/docs/graph-api)\n- [Linkedin - Authenticating with OAuth 2.0](https://developer.linkedin.com/docs/oauth2)\n- [微博 - 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)\n- [QQ - OAuth 2.0 登录 QQ](http://wiki.connect.qq.com/oauth2-0%E7%AE%80%E4%BB%8B)\n- [腾讯云 - 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)\n- [微信公众平台 - OAuth 文档](http://mp.weixin.qq.com/wiki/9/01f711493b5a02f24b04365ac5d8fd95.html)\n- [微信开放平台 - 网站应用微信登录开发指南](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN)\n- [微信开放平台 - 代公众号发起网页授权](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318590&token=&lang=zh_CN)\n- [企业微信 - OAuth 文档](https://open.work.weixin.qq.com/api/doc/90000/90135/91020)\n- [企业微信第三方应用 - OAuth 文档](https://open.work.weixin.qq.com/api/doc/90001/90143/91118)\n- [豆瓣 - OAuth 2.0 授权机制说明](http://developers.douban.com/wiki/?title=oauth2)\n- [抖音 - 网站应用开发指南](http://open.douyin.com/platform/doc)\n- [飞书 - 授权说明](https://open.feishu.cn/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM)\n- [Lark - 授权说明](https://open.larksuite.com/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM)\n- [Tapd - 用户授权说明](https://www.tapd.cn/help/show#1120003271001000093)\n- [Line - OAuth 2.0](https://developers.line.biz/en/docs/line-login/integrate-line-login/)\n- [Gitee - OAuth文档](https://gitee.com/api/v5/oauth_doc#/)\n\n\n\n# PHP 扩展包开发\n\n> 想知道如何从零开始构建 PHP 扩展包？\n>\n> 请关注我的实战课程，我会在此课程中分享一些扩展开发经验 —— [《PHP 扩展包实战教程 - 从入门到发布》](https://learnku.com/courses/creating-package)\n\n# License\n\nMIT\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/README_EN.md",
    "content": "# Socialite\n\nSocialite 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)\n\n[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/overtrue/socialite?style=flat-square)](https://github.com/overtrue/socialite/releases)\n[![GitHub License](https://img.shields.io/github/license/overtrue/socialite?style=flat-square)](https://github.com/overtrue/socialite/blob/master/LICENSE)\n[![Packagist Downloads](https://img.shields.io/packagist/dt/overtrue/socialite?style=flat-square)](https://packagist.org/packages/overtrue/socialite)\n\n[![Sponsor me](https://github.com/overtrue/overtrue/blob/master/sponsor-me-button-s.svg?raw=true)](https://github.com/sponsors/overtrue)\n\nThis 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.\n\n如果你喜欢我的项目并想支持我，[点击这里 :heart:](https://github.com/sponsors/overtrue)\n\n# Requirement\n\n```\nPHP >= 8.0.2\n```\n# Installation\n\n```shell\n$ composer require \"overtrue/socialite\" -vvv\n```\n\n# Usage\n\nUsers 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.\n\nThe tool is used in the following steps:\n\n1. Configurate platform config\n2. Use this tool to create a platform application\n3. Let the user redirect to platform authentication\n4. The server receives a Code callback from the platform, and uses the Code to exchange the user information on the platform (including access_token).\n\nPackages created for Laravel users are easier to integrate:  [overtrue/laravel-socialite](https://github.com/overtrue/laravel-socialite)\n\n`authorize.php`:\n\n```php\n<?php\n\nuse Overtrue\\Socialite\\SocialiteManager;\n\n$config = [\n    'github' => [\n        'client_id'     => 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect'      => 'http://localhost/socialite/callback.php',\n    ],\n];\n\n$socialite = new SocialiteManager($config);\n\n$url = $socialite->create('github')->redirect();\n\nreturn redirect($url); \n```\n\n`callback.php`:\n\n```php\n<?php\n\nuse Overtrue\\Socialite\\SocialiteManager;\n\n$config = [\n    'github' => [\n        'client_id' => 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect' => 'http://localhost/socialite/callback.php',\n    ],\n];\n\n$socialite = new SocialiteManager($config);\n\n$code = request()->query('code');\n\n$user = $socialite->create('github')->userFromCode($code);\n\n$user->getId();        // 1472352\n$user->getNickname();  // \"overtrue\"\n$user->getUsername();  // \"overtrue\"\n$user->getName();      // \"安正超\"\n$user->getEmail();     // \"anzhengchao@gmail.com\"\n...\n```\n\n## Configuration\n\nEach create uses the same configuration keys: `client_id`, `client_secret`, `redirect`.\n\nExample:\n```php\n$config = [\n  'weibo' => [\n    'client_id'     => 'your-app-id',\n    'client_secret' => 'your-app-secret',\n    'redirect'      => 'http://localhost/socialite/callback.php',\n  ],\n  'facebook' => [\n    'client_id'     => 'your-app-id',\n    'client_secret' => 'your-app-secret',\n    'redirect'      => 'http://localhost/socialite/callback.php',\n  ],\n];\n```\n\n### Custom app name\n\nYou can use any name you like as the name of the application, such as `foo`, and set provider using `provider` key：\n\n```php\n$config = [\n    'foo' => [\n        'provider' => 'github',  // <-- provider name\n        'client_id' => 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect' => 'http://localhost/socialite/callback.php',\n    ],\n       \n    // another github app\n    'bar' => [\n        'provider' => 'github',  // <-- provider name\n        'client_id' => 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect' => 'http://localhost/socialite/callback.php',\n    ],\n    //...\n];\n```\n\n### Extends custom provider\n\nYou can create application from you custom provider easily，you have to ways to do this: \n\n1. Using custom creator:\n   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.\n\n```php\n$config = [\n    'foo' => [\n        'provider' => 'myprovider',  // <-- provider name\n        'client_id' => 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect' => 'http://localhost/socialite/callback.php',\n    ],\n];\n\n$socialite = new SocialiteManager($config);\n   \n$socialite->extend('myprovider', function(array $config) {\n    return new MyCustomProvider($config);\n});\n\n$app = $socialite->create('foo');\n```\n\n2. Using provider:\n\n>👋🏻 Your custom provider class must be implements of `Overtrue\\Socialite\\Contracts\\ProviderInterface`.\n\n```php\nclass MyCustomProvider implements \\Overtrue\\Socialite\\Contracts\\ProviderInterface \n{\n    //...\n}\n```\n\nthen set `provider` with the class name:\n\n```php\n$config = [\n    'foo' => [\n        'provider' => MyCustomProvider::class,  // <-- class name\n        'client_id' => 'your-app-id',\n        'client_secret' => 'your-app-secret',\n        'redirect' => 'http://localhost/socialite/callback.php',\n    ],\n];\n\n$socialite = new SocialiteManager($config);\n$app = $socialite->create('foo');\n```\n\n\n\n## Platform\n\nDifferent platforms have different configuration methods, so please check the platform Settings you are using.\n\n### [Alipay](https://opendocs.alipay.com/open/200/105310#s2)\n\nYou must have the following configuration.\n```php\n$config = [\n  'alipay' => [\n    // This can also be named as 'app_id' like the official documentation.\n    'client_id' => 'your-app-id', \n \n    // Please refer to the official documentation, in the official management background configuration RSA2.\n    // Note: This is your own private key.\n    // Note: Do not allow the private key content to have extra characters.\n    // 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.\n    'rsa_private_key' => 'your-rsa-private-key',\n\n    // Be sure to set this value and make sure that it is the same address value as set in the official admin system.\n    // This can also be named as 'redirect_url' like the official documentation.\n    'redirect' => 'http://localhost/socialite/callback.php',\n  ]\n  ...\n];\n\n$socialite = new SocialiteManager($config);\n\n$user = $socialite->create('alipay')->userFromCode('here is auth code');\n\n// See this documents \"User interface\"\n$user->getId();        // 1472352\n$user->getNickname();  // \"overtrue\"\n$user->getUsername();  // \"overtrue\"\n$user->getName();      // \"安正超\"\n...\n```\nOnly RSA2 personal private keys are supported, so stay tuned if you want to log in with a certificate.\n\n### [DingTalk](https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3)\n\nFollow the documentation and configure it like following.\n\n> Note: It only supported QR code access to third-part websites. i.e exchange for user information(opendid, unionid and nickname)\n\n```php\n$config = [\n  'dingtalk' => [\n      // or 'app_id'\n      'client_id' => 'your app id',\n\n      // or 'app_secret' \n      'client_secret' => 'your app secret',\n\n      // or 'redirect_url'\n      'redirect' => 'redirect URL'\n  ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$user = $socialite->create('dingtalk')->userFromCode('here is auth code');\n\n// See this documents \"User interface\"\n$user->getId();        // 1472352\n$user->getNickname();  // \"overtrue\"\n$user->getUsername();  // \"overtrue\"\n$user->getName();      // \"安正超\"\n...\n```\n\n### [Douyin](https://open.douyin.com/platform/doc/OpenAPI-oauth2)\n\n> 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()`\n\n```php\n$config = [\n  'douyin' => [\n      'client_id' => 'your app id',\n\n      'client_secret' => 'your app secret',\n\n      'redirect' => 'redirect URL'\n  ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$user = $socialite->create('douyin')->userFromCode('here is auth code');\n\n$user = $socialite->create('douyin')->withOpenId('openId')->userFromToken('here is the access token');\n```\n\n### [TouTiao](https://open.douyin.com/platform/resource/docs/develop/permission/toutiao-or-xigua/OAuth2.0/)\n\n> 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()`\n\n```php\n$config = [\n  'toutiao' => [\n    'client_id' => 'your app id',\n    'client_secret' => 'your app secret',\n    'redirect' => 'redirect URL'\n  ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$user = $socialite->create('toutiao')->userFromCode('here is auth code');\n$user = $socialite->create('toutiao')->withOpenId('openId')->userFromToken('here is the access token');\n```\n\n### [XiGua](https://open.douyin.com/platform/resource/docs/develop/permission/toutiao-or-xigua/OAuth2.0/)\n\n> 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()`\n\n```php\n$config = [\n  'xigua' => [\n    'client_id' => 'your app id',\n    'client_secret' => 'your app secret',\n    'redirect' => 'redirect URL'\n  ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$user = $socialite->create('xigua')->userFromCode('here is auth code');\n$user = $socialite->create('xigua')->withOpenId('openId')->userFromToken('here is the access token');\n```\n\n\n### [Baidu](https://developer.baidu.com/wiki/index.php?title=docs/oauth)\n\nYou can choose the form you want display by using `withDisplay()`.\n\n- **page**\n- **popup**\n- **dialog**\n- **mobile**\n- **tv**\n- **pad**\n\n```php\n$authUrl = $socialite->create('baidu')->withDisplay('mobile')->redirect();\n\n```\n`popup` mode is the default setting with display. `basic` is the default with scopes.\n\n### [Feishu](https://open.feishu.cn/document/ukTMukTMukTM/uITNz4iM1MjLyUzM)\n\nSome simple way to use by internal app mode and config app_ticket.\n\n```php\n$config = [\n    'feishu' => [\n        // or 'app_id'\n        'client_id' => 'your app id',\n\n        // or 'app_secret' \n        'client_secret' => 'your app secret',\n\n        // or 'redirect_url'\n        'redirect' => 'redirect URL',\n\n        // if you want to use internal way to get app_access_token\n        // set this key by 'internal' then you already turn on the internal app mode \n        'app_mode' => 'internal'\n    ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$feishuDriver = $socialite->create('feishu');\n\n$feishuDriver->withInternalAppMode()->userFromCode('here is code');\n$feishuDriver->withDefaultMode()->withAppTicket('app_ticket')->userFromCode('here is code');\n```\n\n### [Lark](https://open.larksuite.com/document/ukTMukTMukTM/uITNz4iM1MjLyUzM)\n\nSome simple way to use by internal app mode and config app_ticket.\n\n```php\n$config = [\n    'lark' => [\n        // or 'app_id'\n        'client_id' => 'your app id',\n\n        // or 'app_secret' \n        'client_secret' => 'your app secret',\n\n        // or 'redirect_url'\n        'redirect' => 'redirect URL',\n\n        // if you want to use internal way to get app_access_token\n        // set this key by 'internal' then you already turn on the internal app mode \n        'app_mode' => 'internal'\n    ]\n];\n\n$socialite = new SocialiteManager($config);\n\n$larkDriver = $socialite->create('lark');\n\n$larkDriver->withInternalAppMode()->userFromCode('here is code');\n$larkDriver->withDefaultMode()->withAppTicket('app_ticket')->userFromCode('here is code');\n```\n\n### [Taobao](https://open.taobao.com/doc.htm?docId=102635&docType=1&source=search)\n\nYou can choose the form you want display by using `withView()`.\n\n```php\n$authUrl = $socialite->create('taobao')->withView('wap')->redirect();\n```\n`web` mode is the default setting with display. `user_info` is the default with scopes.\n\n### [WeChat](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Official_Accounts/official_account_website_authorization.html)\n\nWe support Open Platform Third-party Platform webpage authorizations on behalf of Official Account.\n\nYou just need input your config like below config. Official Accounts authorizations only doesn't need.\n```php\n...\n[\n    'wechat' =>\n        [\n            'client_id' => 'client_id',\n            'client_secret' => 'client_secret',\n            'redirect' => 'redirect-url',\n\n            // Open Platform - Third-party Platform Need\n            'component' => [\n                'id' => 'component-app-id',\n                'token' => 'component-access-token', // or Using a callable as value.\n            ]\n        ]\n],\n...\n```\n\n### [Coding](https://coding.net/help/openapi#oauth)\n\nPlease add the `team_url` parameter to the configuration file to specify the team domain name as follows:\n\n```php\n$config = [\n    'coding' => [\n        'team_url' => 'https://{your-team}.coding.net',\n        'client_id' => 'your app id',\n        'client_secret' => 'your app secret',\n        'redirect' => 'redirect URL',\n    ]\n];\n```\n\n## Some Skill\n\n### Scopes\n\nBefore redirecting the user, you may also set \"scopes\" on the request using the `scopes()` method. This method will overwrite all existing scopes:\n\n```php\n$response = $socialite->create('github')\n                ->scopes(['scope1', 'scope2'])->redirect();\n```\n\n### Redirect URL\n\nYou may also want to dynamically set `redirect_uri`，you can use the following methods to change the `redirect_uri` URL:\n\n```php\n$url = 'your callback url.';\n\n$socialite->redirect($url);\n// or\n$socialite->withRedirectUrl($url)->redirect();\n```\n\n### State\n\nYour 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.\n\nHere'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.\n\n### Redirect with `state` parameter \n```php\n<?php\nsession_start();\n \n$config = [\n    //...\n];\n\n// Assign to state the hashing of the session ID\n$state = hash('sha256', session_id());\n\n$socialite = new SocialiteManager($config);\n\n$url = $socialite->create('github')->withState($state)->redirect();\n\nreturn redirect($url); \n```\n\n### Validate the callback `state`\n\nOnce 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:\n\n```php\n<?php\nsession_start();\n \n$state = request()->query('state');\n$code = request()->query('code');\n \n// Check the state received with current session id\nif ($state != hash('sha256', session_id())) {\n    exit('State does not match!');\n}\n$user = $socialite->create('github')->userFromCode($code);\n\n// authorized\n```\n\n[Read more about `state` parameter](https://auth0.com/docs/protocols/oauth2/oauth-state)\n\n### Additional parameters\n\nTo include any optional parameters in the request, call the `with()` method with an associative array:\n\n```php\n$response = $socialite->create('google')\n                    ->with(['hd' => 'example.com'])->redirect();\n```\n\n\n## User interface\n\n### Standard user api:\n\n```php\n$user = $socialite->create('github')->userFromCode($code);\n```\n\n```json\n{\n  \"id\": 1472352,\n  \"nickname\": \"overtrue\",\n  \"name\": \"安正超\",\n  \"email\": \"anzhengchao@gmail.com\",\n  \"avatar\": \"https://avatars.githubusercontent.com/u/1472352?v=3\",\n  \"raw\": {\n    \"login\": \"overtrue\",\n    \"id\": 1472352,\n    \"avatar_url\": \"https://avatars.githubusercontent.com/u/1472352?v=3\",\n    \"gravatar_id\": \"\",\n    \"url\": \"https://api.github.com/users/overtrue\",\n    \"html_url\": \"https://github.com/overtrue\",\n    ...\n  },\n  \"token_response\": {\n    \"access_token\": \"5b1dc56d64fffbd052359f032716cc4e0a1cb9a0\",\n    \"token_type\": \"bearer\",\n    \"scope\": \"user:email\"\n  }\n}\n```\n\nYou can fetch the user attribute as a array keys like these:\n\n```php\n$user['id'];        // 1472352\n$user['nickname'];  // \"overtrue\"\n$user['name'];      // \"安正超\"\n$user['email'];     // \"anzhengchao@gmail.com\"\n...\n```\n\nOr using the method:\n\n```php\nmixed   $user->getId();\n?string $user->getNickname();\n?string $user->getName();\n?string $user->getEmail();\n?string $user->getAvatar();\n?string $user->getRaw();\n?string $user->getAccessToken(); \n?string $user->getRefreshToken();\n?int    $user->getExpiresIn();\n?array  $user->getTokenResponse();\n\n\n```\n\n### Get raw response from OAuth API\n\nThe `$user->getRaw()` method will return an **array** of the API raw response.\n\n### Get the token response when you use userFromCode()\n\nThe `$user->getTokenResponse()` method will return an **array** of the get token(access token) API response.\n\n> Note: This method only return a **valid array** when you use `userFromCode()`, else will return **null** because use `userFromToken()` have no token response. \n\n### Get user with access token\n\n```php\n$accessToken = 'xxxxxxxxxxx';\n$user = $socialite->userFromToken($accessToken);\n```\n\n\n\n# Enjoy it! :heart:\n\n# Reference\n\n- [Alipay - 用户信息授权](https://opendocs.alipay.com/open/289/105656)\n- [DingTalk - 扫码登录第三方网站](https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3)\n- [Google - OpenID Connect](https://developers.google.com/identity/protocols/OpenIDConnect)\n- [GitHub - Authorizing OAuth Apps](https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/)\n- [Figma - OAuth 2](https://www.figma.com/developers/api#auth-oauth2)\n- [Facebook - Graph API](https://developers.facebook.com/docs/graph-api)\n- [Linkedin - Authenticating with OAuth 2.0](https://developer.linkedin.com/docs/oauth2)\n- [微博 - 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)\n- [QQ - OAuth 2.0 登录 QQ](http://wiki.connect.qq.com/oauth2-0%E7%AE%80%E4%BB%8B)\n- [腾讯云 - 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)\n- [微信公众平台 - OAuth 文档](http://mp.weixin.qq.com/wiki/9/01f711493b5a02f24b04365ac5d8fd95.html)\n- [微信开放平台 - 网站应用微信登录开发指南](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN)\n- [微信开放平台 - 代公众号发起网页授权](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318590&token=&lang=zh_CN)\n- [企业微信 - OAuth 文档](https://open.work.weixin.qq.com/api/doc/90000/90135/91020)\n- [企业微信第三方应用 - OAuth 文档](https://open.work.weixin.qq.com/api/doc/90001/90143/91118)\n- [豆瓣 - OAuth 2.0 授权机制说明](http://developers.douban.com/wiki/?title=oauth2)\n- [抖音 - 网站应用开发指南](http://open.douyin.com/platform/doc)\n- [飞书 - 授权说明](https://open.feishu.cn/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM)\n- [Lark - 授权说明](https://open.larksuite.com/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM)\n- [Tapd - 用户授权说明](https://www.tapd.cn/help/show#1120003271001000093)\n- [Line - OAuth 2.0](https://developers.line.biz/en/docs/line-login/integrate-line-login/)\n- [Gitee - OAuth文档](https://gitee.com/api/v5/oauth_doc#/)\n\n[![Sponsor me](https://github.com/overtrue/overtrue/blob/master/sponsor-me.svg?raw=true)](https://github.com/sponsors/overtrue)\n\n## Project supported by JetBrains\n\nMany thanks to Jetbrains for kindly providing a license for me to work on this and other open-source projects.\n\n[![](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](https://www.jetbrains.com/?from=https://github.com/overtrue)\n\n\n# PHP 扩展包开发\n\n> 想知道如何从零开始构建 PHP 扩展包？\n>\n> 请关注我的实战课程，我会在此课程中分享一些扩展开发经验 —— [《PHP 扩展包实战教程 - 从入门到发布》](https://learnku.com/courses/creating-package)\n\n# License\n\nMIT\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/composer.json",
    "content": "{\n  \"name\": \"overtrue/socialite\",\n  \"description\": \"A collection of OAuth 2 packages.\",\n  \"keywords\": [\n    \"oauth\",\n    \"social\",\n    \"login\",\n    \"weibo\",\n    \"wechat\",\n    \"qq\",\n    \"feishu\",\n    \"qcloud\"\n  ],\n  \"autoload\": {\n    \"files\": [\n      \"src/Contracts/FactoryInterface.php\",\n      \"src/Contracts/UserInterface.php\",\n      \"src/Contracts/ProviderInterface.php\"\n    ],\n    \"psr-4\": {\n      \"Overtrue\\\\Socialite\\\\\": \"src/\"\n    }\n  },\n  \"require\": {\n    \"php\": \">=8.0.2\",\n    \"ext-json\": \"*\",\n    \"ext-openssl\": \"*\",\n    \"guzzlehttp/guzzle\": \"^7.0\",\n    \"symfony/psr-http-message-bridge\": \"^2.1|^6.0\"\n  },\n  \"require-dev\": {\n    \"mockery/mockery\": \"^1.3\",\n    \"phpunit/phpunit\": \"^9.0\",\n    \"jetbrains/phpstorm-attributes\": \"^1.0\",\n    \"phpstan/phpstan\": \"^1.7\",\n    \"laravel/pint\": \"^1.2\"\n  },\n  \"license\": \"MIT\",\n  \"authors\": [\n    {\n      \"name\": \"overtrue\",\n      \"email\": \"anzhengchao@gmail.com\"\n    }\n  ],\n  \"scripts\": {\n    \"check-style\": \"@php vendor/bin/pint --test\",\n    \"fix-style\": \"@php vendor/bin/pint\",\n    \"test\": \"@php vendor/bin/phpunit --colors=always\",\n    \"phpstan\": \"@php vendor/bin/phpstan analyse src\"\n  }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/phpstan.neon.dist",
    "content": "parameters:\n\tcheckMissingIterableValueType: false\n\tcheckGenericClassInNonGenericObjectType: false\n\tlevel: 8\n\tpaths:\n\t\t- src\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/phpunit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit backupGlobals=\"false\"\n         backupStaticAttributes=\"false\"\n         bootstrap=\"vendor/autoload.php\"\n         colors=\"true\"\n         convertErrorsToExceptions=\"true\"\n         convertNoticesToExceptions=\"true\"\n         convertWarningsToExceptions=\"true\"\n         processIsolation=\"false\"\n         stopOnFailure=\"false\"\n>\n    <testsuites>\n        <testsuite name=\"Package Test Suite\">\n            <directory suffix=\".php\">./tests/</directory>\n        </testsuite>\n    </testsuites>\n</phpunit>\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Config.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite;\n\nuse ArrayAccess;\nuse JsonSerializable;\n\nclass Config implements ArrayAccess, JsonSerializable\n{\n    protected array $config;\n\n    /**\n     * @param  array  $config\n     */\n    public function __construct(array $config)\n    {\n        $this->config = $config;\n    }\n\n    public function get(string $key, mixed $default = null): mixed\n    {\n        $config = $this->config;\n\n        if (isset($config[$key])) {\n            return $config[$key];\n        }\n\n        foreach (\\explode('.', $key) as $segment) {\n            if (! \\is_array($config) || ! \\array_key_exists($segment, $config)) {\n                return $default;\n            }\n            $config = $config[$segment];\n        }\n\n        return $config;\n    }\n\n    public function set(string $key, mixed $value): array\n    {\n        $keys = \\explode('.', $key);\n        $config = &$this->config;\n\n        while (\\count($keys) > 1) {\n            $key = \\array_shift($keys);\n            if (! isset($config[$key]) || ! \\is_array($config[$key])) {\n                $config[$key] = [];\n            }\n            $config = &$config[$key];\n        }\n\n        $config[\\array_shift($keys)] = $value;\n\n        return $config;\n    }\n\n    public function has(string $key): bool\n    {\n        return (bool) $this->get($key);\n    }\n\n    public function offsetExists(mixed $offset): bool\n    {\n        \\is_string($offset) || throw new Exceptions\\InvalidArgumentException('The $offset must be type of string here.');\n\n        return \\array_key_exists($offset, $this->config);\n    }\n\n    public function offsetGet(mixed $offset): mixed\n    {\n        \\is_string($offset) || throw new Exceptions\\InvalidArgumentException('The $offset must be type of string here.');\n\n        return $this->get($offset);\n    }\n\n    public function offsetSet(mixed $offset, mixed $value): void\n    {\n        \\is_string($offset) || throw new Exceptions\\InvalidArgumentException('The $offset must be type of string here.');\n\n        $this->set($offset, $value);\n    }\n\n    public function offsetUnset(mixed $offset): void\n    {\n        \\is_string($offset) || throw new Exceptions\\InvalidArgumentException('The $offset must be type of string here.');\n\n        $this->set($offset, null);\n    }\n\n    public function jsonSerialize(): array\n    {\n        return $this->config;\n    }\n\n    public function __toString(): string\n    {\n        return \\json_encode($this, \\JSON_UNESCAPED_UNICODE) ?: '';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Contracts/FactoryInterface.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Contracts;\n\nconst ABNF_APP_ID = 'app_id';\nconst ABNF_APP_SECRET = 'app_secret';\nconst ABNF_OPEN_ID = 'open_id';\nconst ABNF_TOKEN = 'token';\n\ninterface FactoryInterface\n{\n    public function config(\\Overtrue\\Socialite\\Config $config): self;\n\n    public function create(string $name): ProviderInterface;\n\n    public function getResolvedProviders(): array;\n\n    public function buildProvider(string $provider, array $config): ProviderInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Contracts/ProviderInterface.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Contracts;\n\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.1 */\nconst RFC6749_ABNF_CLIENT_ID = 'client_id';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.2 */\nconst RFC6749_ABNF_CLIENT_SECRET = 'client_secret';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.3 */\nconst RFC6749_ABNF_RESPONSE_TYPE = 'response_type';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.4 */\nconst RFC6749_ABNF_SCOPE = 'scope';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.5 */\nconst RFC6749_ABNF_STATE = 'state';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.6 */\nconst RFC6749_ABNF_REDIRECT_URI = 'redirect_uri';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.7 */\nconst RFC6749_ABNF_ERROR = 'error';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.8 */\nconst RFC6749_ABNF_ERROR_DESCRIPTION = 'error_description';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.9 */\nconst RFC6749_ABNF_ERROR_URI = 'error_uri';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.10 */\nconst RFC6749_ABNF_GRANT_TYPE = 'grant_type';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.11 */\nconst RFC6749_ABNF_CODE = 'code';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.12 */\nconst RFC6749_ABNF_ACCESS_TOKEN = 'access_token';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.13 */\nconst RFC6749_ABNF_TOKEN_TYPE = 'token_type';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.14 */\nconst RFC6749_ABNF_EXPIRES_IN = 'expires_in';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.15 */\nconst RFC6749_ABNF_USERNAME = 'username';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.16 */\nconst RFC6749_ABNF_PASSWORD = 'password';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#appendix-A.17 */\nconst RFC6749_ABNF_REFRESH_TOKEN = 'refresh_token';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.3 */\nconst RFC6749_ABNF_AUTHORATION_CODE = 'authorization_code';\n/** @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.4.2 */\nconst RFC6749_ABNF_CLIENT_CREDENTIALS = 'client_credentials';\n\ninterface ProviderInterface\n{\n    public function redirect(?string $redirectUrl = null): string;\n\n    public function userFromCode(string $code): UserInterface;\n\n    public function userFromToken(string $token): UserInterface;\n\n    public function withRedirectUrl(string $redirectUrl): self;\n\n    public function withState(string $state): self;\n\n    /**\n     * @param  string[]  $scopes\n     */\n    public function scopes(array $scopes): self;\n\n    public function with(array $parameters): self;\n\n    public function withScopeSeparator(string $scopeSeparator): self;\n\n    public function getClientId(): ?string;\n\n    public function getClientSecret(): ?string;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Contracts/UserInterface.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Contracts;\n\nconst ABNF_ID = 'id';\nconst ABNF_NAME = 'name';\nconst ABNF_NICKNAME = 'nickname';\nconst ABNF_EMAIL = 'email';\nconst ABNF_AVATAR = 'avatar';\n\ninterface UserInterface\n{\n    public function getId(): mixed;\n\n    public function getNickname(): ?string;\n\n    public function getName(): ?string;\n\n    public function getEmail(): ?string;\n\n    public function getAvatar(): ?string;\n\n    public function getAccessToken(): ?string;\n\n    public function getRefreshToken(): ?string;\n\n    public function getExpiresIn(): ?int;\n\n    public function getProvider(): ProviderInterface;\n\n    public function setRefreshToken(?string $refreshToken): self;\n\n    public function setExpiresIn(int $expiresIn): self;\n\n    public function setTokenResponse(array $response): self;\n\n    public function getTokenResponse(): mixed;\n\n    public function setProvider(ProviderInterface $provider): self;\n\n    public function getRaw(): array;\n\n    public function setRaw(array $user): self;\n\n    public function setAccessToken(string $token): self;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Exceptions/AuthorizeFailedException.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Exceptions;\n\nuse JetBrains\\PhpStorm\\Pure;\n\nclass AuthorizeFailedException extends Exception\n{\n    public array $body;\n\n    #[Pure]\n    public function __construct(string $message, mixed $body)\n    {\n        parent::__construct($message, -1);\n\n        $this->body = (array) $body;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Exceptions/BadRequestException.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Exceptions;\n\nclass BadRequestException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Exceptions/Exception.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Exceptions;\n\nclass Exception extends \\Exception\n{\n    //\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Exceptions/FeiShu/InvalidTicketException.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Exceptions\\FeiShu;\n\nuse Overtrue\\Socialite\\Exceptions;\n\nclass InvalidTicketException extends Exceptions\\Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Exceptions/InvalidArgumentException.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Exceptions;\n\nclass InvalidArgumentException extends \\InvalidArgumentException\n{\n    //\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Exceptions/InvalidTokenException.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Exceptions;\n\nuse JetBrains\\PhpStorm\\Pure;\n\nclass InvalidTokenException extends Exception\n{\n    public string $token;\n\n    #[Pure]\n    public function __construct(string $message, string $token)\n    {\n        parent::__construct($message, -1);\n\n        $this->token = $token;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Exceptions/MethodDoesNotSupportException.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Exceptions;\n\nclass MethodDoesNotSupportException extends Exception\n{\n    //\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Alipay.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see https://opendocs.alipay.com/open/289/105656\n */\nclass Alipay extends Base\n{\n    public const NAME = 'alipay';\n\n    protected string $baseUrl = 'https://openapi.alipay.com/gateway.do';\n\n    protected string $authUrl = 'https://openauth.alipay.com/oauth2/publicAppAuthorize.htm';\n\n    protected array $scopes = ['auth_user'];\n\n    protected string $apiVersion = '1.0';\n\n    protected string $signType = 'RSA2';\n\n    protected string $postCharset = 'UTF-8';\n\n    protected string $format = 'json';\n\n    protected bool $sandbox = false;\n\n    public function __construct(array $config)\n    {\n        parent::__construct($config);\n        $this->sandbox = (bool) $this->config->get('sandbox', false);\n        if ($this->sandbox) {\n            $this->baseUrl = 'https://openapi.alipaydev.com/gateway.do';\n            $this->authUrl = 'https://openauth.alipaydev.com/oauth2/publicAppAuthorize.htm';\n        }\n    }\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase($this->authUrl);\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return $this->baseUrl;\n    }\n\n    /**\n     * @throws Exceptions\\BadRequestException\n     */\n    protected function getUserByToken(string $token): array\n    {\n        $params = $this->getPublicFields('alipay.user.info.share');\n        $params += ['auth_token' => $token];\n        $params['sign'] = $this->generateSign($params);\n\n        $responseInstance = $this->getHttpClient()->post(\n            $this->baseUrl,\n            [\n                'form_params' => $params,\n                'headers' => [\n                    'Content-Type' => 'application/x-www-form-urlencoded;charset=utf-8',\n                ],\n            ]\n        );\n\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (! empty($response['error_response'] ?? null) || empty($response['alipay_user_info_share_response'] ?? [])) {\n            throw new Exceptions\\BadRequestException((string) $responseInstance->getBody());\n        }\n\n        return $response['alipay_user_info_share_response'];\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user['user_id'] ?? null,\n            Contracts\\ABNF_NAME => $user['nick_name'] ?? null,\n            Contracts\\ABNF_AVATAR => $user[Contracts\\ABNF_AVATAR] ?? null,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n        ]);\n    }\n\n    /**\n     * @throws Exceptions\\BadRequestException\n     */\n    public function tokenFromCode(string $code): array\n    {\n        $responseInstance = $this->getHttpClient()->post(\n            $this->getTokenUrl(),\n            [\n                'form_params' => $this->getTokenFields($code),\n                'headers' => [\n                    'Content-Type' => 'application/x-www-form-urlencoded;charset=utf-8',\n                ],\n            ]\n        );\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (! empty($response['error_response'])) {\n            throw new Exceptions\\BadRequestException((string) $responseInstance->getBody());\n        }\n\n        return $this->normalizeAccessTokenResponse($response['alipay_system_oauth_token_response']);\n    }\n\n    /**\n     * @throws Exceptions\\InvalidArgumentException\n     */\n    protected function getCodeFields(): array\n    {\n        if (empty($this->redirectUrl)) {\n            throw new Exceptions\\InvalidArgumentException('Please set the correct redirect URL refer which was on the Alipay Official Admin pannel.');\n        }\n\n        $fields = \\array_merge(\n            [\n                Contracts\\ABNF_APP_ID => $this->getConfig()->get(Contracts\\RFC6749_ABNF_CLIENT_ID) ?? $this->getConfig()->get(Contracts\\ABNF_APP_ID),\n                Contracts\\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator),\n                Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            ],\n            $this->parameters\n        );\n\n        return $fields;\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        $params = $this->getPublicFields('alipay.system.oauth.token');\n        $params += [\n            Contracts\\RFC6749_ABNF_CODE => $code,\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n        ];\n        $params['sign'] = $this->generateSign($params);\n\n        return $params;\n    }\n\n    #[ArrayShape([\n        Contracts\\ABNF_APP_ID => 'string',\n        'format' => 'string',\n        'charset' => 'string',\n        'sign_type' => 'string',\n        'method' => 'string',\n        'timestamp' => 'string',\n        'version' => 'string',\n    ])]\n    public function getPublicFields(string $method): array\n    {\n        return [\n            Contracts\\ABNF_APP_ID => $this->getConfig()->get(Contracts\\RFC6749_ABNF_CLIENT_ID) ?? $this->getConfig()->get(Contracts\\ABNF_APP_ID),\n            'format' => $this->format,\n            'charset' => $this->postCharset,\n            'sign_type' => $this->signType,\n            'method' => $method,\n            'timestamp' => (new \\DateTime('now', new \\DateTimeZone('Asia/Shanghai')))->format('Y-m-d H:i:s'),\n            'version' => $this->apiVersion,\n        ];\n    }\n\n    /**\n     * @see https://opendocs.alipay.com/open/289/105656\n     */\n    protected function generateSign(array $params): string\n    {\n        \\ksort($params);\n\n        return $this->signWithSHA256RSA($this->buildParams($params), $this->getConfig()->get('rsa_private_key'));\n    }\n\n    /**\n     * @throws Exceptions\\InvalidArgumentException\n     */\n    protected function signWithSHA256RSA(string $signContent, string $key): string\n    {\n        if (empty($key)) {\n            throw new Exceptions\\InvalidArgumentException('no RSA private key set.');\n        }\n\n        $key = \"-----BEGIN RSA PRIVATE KEY-----\\n\".\n            \\chunk_split($key, 64, \"\\n\").\n            '-----END RSA PRIVATE KEY-----';\n\n        \\openssl_sign($signContent, $signValue, $key, \\OPENSSL_ALGO_SHA256);\n\n        return \\base64_encode($signValue);\n    }\n\n    public static function buildParams(array $params, bool $urlencode = false, array $except = ['sign']): string\n    {\n        $param_str = '';\n        foreach ($params as $k => $v) {\n            if (\\in_array($k, $except)) {\n                continue;\n            }\n            $param_str .= $k.'=';\n            $param_str .= $urlencode ? \\rawurlencode($v) : $v;\n            $param_str .= '&';\n        }\n\n        return \\rtrim($param_str, '&');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Azure.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\nclass Azure extends Base\n{\n    public const NAME = 'azure';\n\n    protected array $scopes = ['User.Read'];\n\n    protected string $scopeSeparator = ' ';\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase($this->getBaseUrl().'/oauth2/v2.0/authorize');\n    }\n\n    protected function getBaseUrl(): string\n    {\n        return 'https://login.microsoftonline.com/'.$this->config['tenant'];\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return $this->getBaseUrl().'/oauth2/v2.0/token';\n    }\n\n    protected function getUserByToken(string $token, ?array $query = []): array\n    {\n        $response = $this->getHttpClient()->get(\n            'https://graph.microsoft.com/v1.0/me',\n            ['headers' => [\n                'Accept' => 'application/json',\n                'Authorization' => 'Bearer '.$token,\n            ],\n            ]\n        );\n\n        return $this->fromJsonBody($response);\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_ID] ?? null,\n            Contracts\\ABNF_NICKNAME => null,\n            Contracts\\ABNF_NAME => $user['displayName'] ?? null,\n            Contracts\\ABNF_EMAIL => $user['userPrincipalName'] ?? null,\n            Contracts\\ABNF_AVATAR => null,\n        ]);\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return parent::getTokenFields($code) + [\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Baidu.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see https://developer.baidu.com/wiki/index.php?title=docs/oauth [OAuth 2.0 授权机制说明]\n */\nclass Baidu extends Base\n{\n    public const NAME = 'baidu';\n\n    protected string $baseUrl = 'https://openapi.baidu.com';\n\n    protected string $version = '2.0';\n\n    protected array $scopes = ['basic'];\n\n    protected string $display = 'popup';\n\n    public function withDisplay(string $display): self\n    {\n        $this->display = $display;\n\n        return $this;\n    }\n\n    public function withScopes(array $scopes): self\n    {\n        $this->scopes = $scopes;\n\n        return $this;\n    }\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase($this->baseUrl.'/oauth/'.$this->version.'/authorize');\n    }\n\n    protected function getCodeFields(): array\n    {\n        return [\n            Contracts\\RFC6749_ABNF_RESPONSE_TYPE => Contracts\\RFC6749_ABNF_CODE,\n            Contracts\\RFC6749_ABNF_CLIENT_ID => $this->getClientId(),\n            Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            Contracts\\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator),\n            'display' => $this->display,\n        ] + $this->parameters;\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return $this->baseUrl.'/oauth/'.$this->version.'/token';\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return parent::getTokenFields($code) + [\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n        ];\n    }\n\n    protected function getUserByToken(string $token): array\n    {\n        $response = $this->getHttpClient()->get(\n            $this->baseUrl.'/rest/'.$this->version.'/passport/users/getInfo',\n            [\n                'query' => [\n                    Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $token,\n                ],\n                'headers' => [\n                    'Accept' => 'application/json',\n                ],\n            ]\n        );\n\n        return $this->fromJsonBody($response);\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user['userid'] ?? null,\n            Contracts\\ABNF_NICKNAME => $user['realname'] ?? null,\n            Contracts\\ABNF_NAME => $user['username'] ?? null,\n            Contracts\\ABNF_EMAIL => '',\n            Contracts\\ABNF_AVATAR => $user['portrait'] ? 'http://tb.himg.baidu.com/sys/portraitn/item/'.$user['portrait'] : null,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Base.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse GuzzleHttp\\Client as GuzzleClient;\nuse GuzzleHttp\\Utils;\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse Overtrue\\Socialite\\Config;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\nabstract class Base implements Contracts\\ProviderInterface\n{\n    public const NAME = null;\n\n    protected ?string      $state = null;\n\n    protected Config       $config;\n\n    protected ?string      $redirectUrl;\n\n    protected array        $parameters = [];\n\n    protected array        $scopes = [];\n\n    protected string       $scopeSeparator = ',';\n\n    protected GuzzleClient $httpClient;\n\n    protected array        $guzzleOptions = [];\n\n    protected int          $encodingType = PHP_QUERY_RFC1738;\n\n    protected string       $expiresInKey = Contracts\\RFC6749_ABNF_EXPIRES_IN;\n\n    protected string       $accessTokenKey = Contracts\\RFC6749_ABNF_ACCESS_TOKEN;\n\n    protected string       $refreshTokenKey = Contracts\\RFC6749_ABNF_REFRESH_TOKEN;\n\n    public function __construct(array $config)\n    {\n        $this->config = new Config($config);\n\n        // set scopes\n        if ($this->config->has('scopes') && is_array($this->config->get('scopes'))) {\n            $this->scopes = $this->getConfig()->get('scopes');\n        } elseif ($this->config->has(Contracts\\RFC6749_ABNF_SCOPE) && is_string($this->getConfig()->get(Contracts\\RFC6749_ABNF_SCOPE))) {\n            $this->scopes = [$this->getConfig()->get(Contracts\\RFC6749_ABNF_SCOPE)];\n        }\n\n        // normalize Contracts\\RFC6749_ABNF_CLIENT_ID\n        if (! $this->config->has(Contracts\\RFC6749_ABNF_CLIENT_ID)) {\n            $id = $this->config->get(Contracts\\ABNF_APP_ID);\n            if (null != $id) {\n                $this->config->set(Contracts\\RFC6749_ABNF_CLIENT_ID, $id);\n            }\n        }\n\n        // normalize Contracts\\RFC6749_ABNF_CLIENT_SECRET\n        if (! $this->config->has(Contracts\\RFC6749_ABNF_CLIENT_SECRET)) {\n            $secret = $this->config->get(Contracts\\ABNF_APP_SECRET);\n            if (null != $secret) {\n                $this->config->set(Contracts\\RFC6749_ABNF_CLIENT_SECRET, $secret);\n            }\n        }\n\n        // normalize 'redirect_url'\n        if (! $this->config->has('redirect_url')) {\n            $this->config->set('redirect_url', $this->config->get('redirect'));\n        }\n        $this->redirectUrl = $this->config->get('redirect_url');\n    }\n\n    abstract protected function getAuthUrl(): string;\n\n    abstract protected function getTokenUrl(): string;\n\n    abstract protected function getUserByToken(string $token): array;\n\n    abstract protected function mapUserToObject(array $user): Contracts\\UserInterface;\n\n    public function redirect(?string $redirectUrl = null): string\n    {\n        if (! empty($redirectUrl)) {\n            $this->withRedirectUrl($redirectUrl);\n        }\n\n        return $this->getAuthUrl();\n    }\n\n    public function userFromCode(string $code): Contracts\\UserInterface\n    {\n        $tokenResponse = $this->tokenFromCode($code);\n        $user = $this->userFromToken($tokenResponse[$this->accessTokenKey]);\n\n        return $user->setRefreshToken($tokenResponse[$this->refreshTokenKey] ?? null)\n            ->setExpiresIn($tokenResponse[$this->expiresInKey] ?? null)\n            ->setTokenResponse($tokenResponse);\n    }\n\n    public function userFromToken(string $token): Contracts\\UserInterface\n    {\n        $user = $this->getUserByToken($token);\n\n        return $this->mapUserToObject($user)->setProvider($this)->setRaw($user)->setAccessToken($token);\n    }\n\n    public function tokenFromCode(string $code): array\n    {\n        $response = $this->getHttpClient()->post(\n            $this->getTokenUrl(),\n            [\n                'form_params' => $this->getTokenFields($code),\n                'headers' => [\n                    'Accept' => 'application/json',\n                ],\n            ]\n        );\n\n        return $this->normalizeAccessTokenResponse((string) $response->getBody());\n    }\n\n    /**\n     * @throws Exceptions\\MethodDoesNotSupportException\n     */\n    public function refreshToken(string $refreshToken): mixed\n    {\n        throw new Exceptions\\MethodDoesNotSupportException('refreshToken does not support.');\n    }\n\n    public function withRedirectUrl(string $redirectUrl): Contracts\\ProviderInterface\n    {\n        $this->redirectUrl = $redirectUrl;\n\n        return $this;\n    }\n\n    public function withState(string $state): Contracts\\ProviderInterface\n    {\n        $this->state = $state;\n\n        return $this;\n    }\n\n    public function scopes(array $scopes): Contracts\\ProviderInterface\n    {\n        $this->scopes = $scopes;\n\n        return $this;\n    }\n\n    public function with(array $parameters): Contracts\\ProviderInterface\n    {\n        $this->parameters = $parameters;\n\n        return $this;\n    }\n\n    public function getConfig(): Config\n    {\n        return $this->config;\n    }\n\n    public function withScopeSeparator(string $scopeSeparator): Contracts\\ProviderInterface\n    {\n        $this->scopeSeparator = $scopeSeparator;\n\n        return $this;\n    }\n\n    public function getClientId(): ?string\n    {\n        return $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_ID);\n    }\n\n    public function getClientSecret(): ?string\n    {\n        return $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_SECRET);\n    }\n\n    public function getHttpClient(): GuzzleClient\n    {\n        return $this->httpClient ?? new GuzzleClient($this->guzzleOptions);\n    }\n\n    public function setGuzzleOptions(array $config): Contracts\\ProviderInterface\n    {\n        $this->guzzleOptions = $config;\n\n        return $this;\n    }\n\n    public function getGuzzleOptions(): array\n    {\n        return $this->guzzleOptions;\n    }\n\n    protected function formatScopes(array $scopes, string $scopeSeparator): string\n    {\n        return \\implode($scopeSeparator, $scopes);\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return [\n            Contracts\\RFC6749_ABNF_CLIENT_ID => $this->getClientId(),\n            Contracts\\RFC6749_ABNF_CLIENT_SECRET => $this->getClientSecret(),\n            Contracts\\RFC6749_ABNF_CODE => $code,\n            Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n        ];\n    }\n\n    protected function buildAuthUrlFromBase(string $url): string\n    {\n        $query = $this->getCodeFields() + ($this->state ? [Contracts\\RFC6749_ABNF_STATE => $this->state] : []);\n\n        return $url.'?'.\\http_build_query($query, '', '&', $this->encodingType);\n    }\n\n    protected function getCodeFields(): array\n    {\n        $fields = \\array_merge(\n            [\n                Contracts\\RFC6749_ABNF_CLIENT_ID => $this->getClientId(),\n                Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n                Contracts\\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator),\n                Contracts\\RFC6749_ABNF_RESPONSE_TYPE => Contracts\\RFC6749_ABNF_CODE,\n            ],\n            $this->parameters\n        );\n\n        if ($this->state) {\n            $fields[Contracts\\RFC6749_ABNF_STATE] = $this->state;\n        }\n\n        return $fields;\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     */\n    protected function normalizeAccessTokenResponse(mixed $response): array\n    {\n        if ($response instanceof StreamInterface) {\n            $response->tell() && $response->rewind();\n            $response = (string) $response;\n        }\n\n        if (\\is_string($response)) {\n            $response = Utils::jsonDecode($response, true);\n        }\n\n        if (! \\is_array($response)) {\n            throw new Exceptions\\AuthorizeFailedException('Invalid token response', [$response]);\n        }\n\n        if (empty($response[$this->accessTokenKey])) {\n            throw new Exceptions\\AuthorizeFailedException('Authorize Failed: '.Utils::jsonEncode($response, \\JSON_UNESCAPED_UNICODE), $response);\n        }\n\n        return $response + [\n            Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $response[$this->accessTokenKey],\n            Contracts\\RFC6749_ABNF_REFRESH_TOKEN => $response[$this->refreshTokenKey] ?? null,\n            Contracts\\RFC6749_ABNF_EXPIRES_IN => \\intval($response[$this->expiresInKey] ?? 0),\n        ];\n    }\n\n    protected function fromJsonBody(MessageInterface $response): array\n    {\n        $result = Utils::jsonDecode((string) $response->getBody(), true);\n\n        \\is_array($result) || throw new Exceptions\\InvalidArgumentException('Decoded the given response payload failed.');\n\n        return $result;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Coding.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Overtrue\\Socialite\\Exceptions\\InvalidArgumentException;\nuse Overtrue\\Socialite\\User;\n\nclass Coding extends Base\n{\n    public const     NAME = 'coding';\n\n    // example: https://{your-team}.coding.net\n    protected string $teamUrl;\n\n    protected array $scopes = ['user', 'user:email'];\n\n    protected string $scopeSeparator = ',';\n\n    public function __construct(array $config)\n    {\n        parent::__construct($config);\n\n        // https://{your-team}.coding.net\n        $teamUrl = $this->config->get('team_url');\n\n        if (! $teamUrl) {\n            throw new InvalidArgumentException('Missing required config [team_url]');\n        }\n\n        // validate team_url\n        if (filter_var($teamUrl, FILTER_VALIDATE_URL) === false) {\n            throw new InvalidArgumentException('Invalid team_url');\n        }\n\n        $this->teamUrl = rtrim($teamUrl, '/');\n    }\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase(\"$this->teamUrl/oauth_authorize.html\");\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return \"$this->teamUrl/api/oauth/access_token\";\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'null|string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return [\n            Contracts\\RFC6749_ABNF_CLIENT_ID => $this->getClientId(),\n            Contracts\\RFC6749_ABNF_CLIENT_SECRET => $this->getClientSecret(),\n            Contracts\\RFC6749_ABNF_CODE => $code,\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n        ];\n    }\n\n    /**\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\Overtrue\\Socialite\\Exceptions\\BadRequestException\n     */\n    protected function getUserByToken(string $token): array\n    {\n        $responseInstance = $this->getHttpClient()->get(\n            \"$this->teamUrl/api/me\",\n            [\n                'query' => [\n                    'access_token' => $token,\n                ],\n            ]\n        );\n\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (empty($response[Contracts\\ABNF_ID])) {\n            throw new Exceptions\\BadRequestException((string) $responseInstance->getBody());\n        }\n\n        return $response;\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_ID] ?? null,\n            Contracts\\ABNF_NICKNAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n            Contracts\\ABNF_AVATAR => $user[Contracts\\ABNF_AVATAR] ?? null,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/DingTalk.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Overtrue\\Socialite\\User;\n\n/**\n * “第三方个人应用”获取用户信息\n *\n * @see https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3\n *\n * 暂不支持“第三方企业应用”获取用户信息\n * @see https://ding-doc.dingtalk.com/doc#/serverapi3/hv357q\n */\nclass DingTalk extends Base\n{\n    public const NAME = 'dingtalk';\n\n    protected string $getUserByCode = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';\n\n    protected array $scopes = ['snsapi_login'];\n\n    protected string $scopeSeparator = ' ';\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase('https://oapi.dingtalk.com/connect/qrconnect');\n    }\n\n    /**\n     * @throws Exceptions\\InvalidArgumentException\n     */\n    protected function getTokenUrl(): string\n    {\n        throw new Exceptions\\InvalidArgumentException('not supported to get access token.');\n    }\n\n    /**\n     * @throws Exceptions\\InvalidArgumentException\n     */\n    protected function getUserByToken(string $token): array\n    {\n        throw new Exceptions\\InvalidArgumentException('Unable to use token get User.');\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_NAME => $user['nick'] ?? null,\n            Contracts\\ABNF_NICKNAME => $user['nick'] ?? null,\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_OPEN_ID] ?? null,\n            Contracts\\ABNF_EMAIL => null,\n            Contracts\\ABNF_AVATAR => null,\n        ]);\n    }\n\n    protected function getCodeFields(): array\n    {\n        return array_merge(\n            [\n                'appid' => $this->getClientId(),\n                Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n                Contracts\\RFC6749_ABNF_CODE => $this->formatScopes($this->scopes, $this->scopeSeparator),\n                Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            ],\n            $this->parameters\n        );\n    }\n\n    public function getClientId(): ?string\n    {\n        return $this->getConfig()->get(Contracts\\ABNF_APP_ID)\n            ?? $this->getConfig()->get('appid')\n            ?? $this->getConfig()->get('appId')\n            ?? $this->getConfig()->get(Contracts\\RFC6749_ABNF_CLIENT_ID);\n    }\n\n    public function getClientSecret(): ?string\n    {\n        return $this->getConfig()->get(Contracts\\ABNF_APP_SECRET)\n            ?? $this->getConfig()->get('appSecret')\n            ?? $this->getConfig()->get(Contracts\\RFC6749_ABNF_CLIENT_SECRET);\n    }\n\n    protected function createSignature(int $time): string\n    {\n        return \\base64_encode(\\hash_hmac('sha256', (string) $time, (string) $this->getClientSecret(), true));\n    }\n\n    /**\n     * @see https://ding-doc.dingtalk.com/doc#/personnal/tmudue\n     *\n     * @throws Exceptions\\BadRequestException\n     */\n    public function userFromCode(string $code): Contracts\\UserInterface\n    {\n        $time = (int) \\microtime(true) * 1000;\n\n        $responseInstance = $this->getHttpClient()->post($this->getUserByCode, [\n            'query' => [\n                'accessKey' => $this->getClientId(),\n                'timestamp' => $time,\n                'signature' => $this->createSignature($time),\n            ],\n            'json' => ['tmp_auth_code' => $code],\n        ]);\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (0 != ($response['errcode'] ?? 1)) {\n            throw new Exceptions\\BadRequestException((string) $responseInstance->getBody());\n        }\n\n        return new User([\n            Contracts\\ABNF_NAME => $response['user_info']['nick'],\n            Contracts\\ABNF_NICKNAME => $response['user_info']['nick'],\n            Contracts\\ABNF_ID => $response['user_info'][Contracts\\ABNF_OPEN_ID],\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/DouYin.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see http://open.douyin.com/platform\n * @see https://open.douyin.com/platform/doc/OpenAPI-overview\n */\nclass DouYin extends Base\n{\n    public const NAME = 'douyin';\n\n    protected string $baseUrl = 'https://open.douyin.com';\n\n    protected array $scopes = ['user_info'];\n\n    protected ?string $openId;\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase($this->baseUrl.'/platform/oauth/connect/');\n    }\n\n    #[ArrayShape([\n        'client_key' => 'null|string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_SCOPE => 'string',\n        Contracts\\RFC6749_ABNF_RESPONSE_TYPE => 'string',\n    ])]\n    public function getCodeFields(): array\n    {\n        return [\n            'client_key' => $this->getClientId(),\n            Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            Contracts\\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator),\n            Contracts\\RFC6749_ABNF_RESPONSE_TYPE => Contracts\\RFC6749_ABNF_CODE,\n        ];\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return $this->baseUrl.'/oauth/access_token/';\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     */\n    public function tokenFromCode(string $code): array\n    {\n        $response = $this->getHttpClient()->get(\n            $this->getTokenUrl(),\n            [\n                'query' => $this->getTokenFields($code),\n            ]\n        );\n\n        $body = $this->fromJsonBody($response);\n\n        if (empty($body['data'] ?? null) || ($body['data']['error_code'] ?? -1) != 0) {\n            throw new Exceptions\\AuthorizeFailedException('Invalid token response', $body);\n        }\n\n        $this->withOpenId($body['data'][Contracts\\ABNF_OPEN_ID]);\n\n        return $this->normalizeAccessTokenResponse($body['data']);\n    }\n\n    #[ArrayShape([\n        'client_key' => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return [\n            'client_key' => $this->getClientId(),\n            Contracts\\RFC6749_ABNF_CLIENT_SECRET => $this->getClientSecret(),\n            Contracts\\RFC6749_ABNF_CODE => $code,\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n        ];\n    }\n\n    /**\n     * @throws Exceptions\\InvalidArgumentException\n     */\n    protected function getUserByToken(string $token): array\n    {\n        $userUrl = $this->baseUrl.'/oauth/userinfo/';\n\n        if (empty($this->openId)) {\n            throw new Exceptions\\InvalidArgumentException('please set the `open_id` before issue the API request.');\n        }\n\n        $response = $this->getHttpClient()->get(\n            $userUrl,\n            [\n                'query' => [\n                    Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $token,\n                    Contracts\\ABNF_OPEN_ID => $this->openId,\n                ],\n            ]\n        );\n\n        $body = $this->fromJsonBody($response);\n\n        return $body['data'] ?? [];\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_OPEN_ID] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NICKNAME] ?? null,\n            Contracts\\ABNF_NICKNAME => $user[Contracts\\ABNF_NICKNAME] ?? null,\n            Contracts\\ABNF_AVATAR => $user[Contracts\\ABNF_AVATAR] ?? null,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n        ]);\n    }\n\n    public function withOpenId(string $openId): self\n    {\n        $this->openId = $openId;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Douban.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see http://developers.douban.com/wiki/?title=oauth2 [使用 OAuth 2.0 访问豆瓣 API]\n */\nclass Douban extends Base\n{\n    public const NAME = 'douban';\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase('https://www.douban.com/service/auth2/auth');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return 'https://www.douban.com/service/auth2/token';\n    }\n\n    /**\n     * @param  string  $token\n     * @param  ?array  $query\n     */\n    protected function getUserByToken(string $token, ?array $query = []): array\n    {\n        $response = $this->getHttpClient()->get('https://api.douban.com/v2/user/~me', [\n            'headers' => [\n                'Authorization' => 'Bearer '.$token,\n            ],\n        ]);\n\n        return $this->fromJsonBody($response);\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_ID] ?? null,\n            Contracts\\ABNF_NICKNAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_AVATAR => $user[Contracts\\ABNF_AVATAR] ?? null,\n            Contracts\\ABNF_EMAIL => null,\n        ]);\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return parent::getTokenFields($code) + [Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE];\n    }\n\n    public function tokenFromCode(string $code): array\n    {\n        $response = $this->getHttpClient()->post($this->getTokenUrl(), [\n            'form_params' => $this->getTokenFields($code),\n        ]);\n\n        return $this->normalizeAccessTokenResponse($response->getBody());\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Facebook.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see https://developers.facebook.com/docs/graph-api [Facebook - Graph API]\n */\nclass Facebook extends Base\n{\n    public const NAME = 'facebook';\n\n    protected string $graphUrl = 'https://graph.facebook.com';\n\n    protected string $version = 'v3.3';\n\n    protected array $fields = ['first_name', 'last_name', 'email', 'gender', 'verified','picture'];\n\n    protected array $scopes = [];\n\n    protected bool $popup = false;\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase('https://www.facebook.com/'.$this->version.'/dialog/oauth');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return $this->graphUrl.'/oauth/access_token';\n    }\n\n    public function tokenFromCode(string $code): array\n    {\n        $response = $this->getHttpClient()->get($this->getTokenUrl(), [\n            'query' => $this->getTokenFields($code),\n        ]);\n\n        return $this->normalizeAccessTokenResponse($response->getBody());\n    }\n\n    protected function getUserByToken(string $token, ?array $query = []): array\n    {\n        $appSecretProof = \\hash_hmac('sha256', $token, $this->getConfig()->get(Contracts\\RFC6749_ABNF_CLIENT_SECRET));\n\n        $response = $this->getHttpClient()->get($this->graphUrl.'/'.$this->version.'/me', [\n            'query' => [\n                Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $token,\n                'appsecret_proof' => $appSecretProof,\n                'fields' => $this->formatScopes($this->fields, $this->scopeSeparator),\n            ],\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ]);\n\n        return $this->fromJsonBody($response);\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        $userId = $user[Contracts\\ABNF_ID] ?? null;\n        $avatarUrl = $this->graphUrl.'/'.$this->version.'/'.$userId.'/picture';\n\n        $firstName = $user['first_name'] ?? null;\n        $lastName = $user['last_name'] ?? null;\n\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_ID] ?? null,\n            Contracts\\ABNF_NICKNAME => null,\n            Contracts\\ABNF_NAME => $firstName.' '.$lastName,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n            Contracts\\ABNF_AVATAR => $userId ? $avatarUrl.'?type=normal' : null,\n            'avatar_original' => $userId ? $avatarUrl.'?width=1920' : null,\n        ]);\n    }\n\n    protected function getCodeFields(): array\n    {\n        $fields = parent::getCodeFields();\n\n        if ($this->popup) {\n            $fields['display'] = 'popup';\n        }\n\n        return $fields;\n    }\n\n    public function fields(array $fields): self\n    {\n        $this->fields = $fields;\n\n        return $this;\n    }\n\n    public function asPopup(): self\n    {\n        $this->popup = true;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/FeiShu.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see https://open.feishu.cn/document/uQjL04CN/ucDOz4yN4MjL3gzM\n */\nclass FeiShu extends Base\n{\n    public const NAME = 'feishu';\n\n    private const APP_TICKET = 'app_ticket';\n\n    protected string $baseUrl = 'https://open.feishu.cn/open-apis';\n\n    protected string $expiresInKey = 'refresh_expires_in';\n\n    protected bool   $isInternalApp = false;\n\n    public function __construct(array $config)\n    {\n        parent::__construct($config);\n        $this->isInternalApp = ($this->config->get('app_mode') ?? $this->config->get('mode')) == 'internal';\n    }\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase($this->baseUrl.'/authen/v1/index');\n    }\n\n    #[ArrayShape([Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\\ABNF_APP_ID => 'null|string'])]\n    protected function getCodeFields(): array\n    {\n        return [\n            Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            Contracts\\ABNF_APP_ID => $this->getClientId(),\n        ];\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return $this->baseUrl.'/authen/v1/access_token';\n    }\n\n    public function tokenFromCode(string $code): array\n    {\n        return $this->normalizeAccessTokenResponse($this->getTokenFromCode($code));\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     */\n    protected function getTokenFromCode(string $code): array\n    {\n        $this->configAppAccessToken();\n        $responseInstance = $this->getHttpClient()->post($this->getTokenUrl(), [\n            'json' => [\n                'app_access_token' => $this->config->get('app_access_token'),\n                Contracts\\RFC6749_ABNF_CODE => $code,\n                Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n            ],\n        ]);\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (empty($response['data'] ?? null)) {\n            throw new Exceptions\\AuthorizeFailedException('Invalid token response', $response);\n        }\n\n        return $this->normalizeAccessTokenResponse($response['data']);\n    }\n\n    protected function getRefreshTokenUrl(): string\n    {\n        return $this->baseUrl.'/authen/v1/refresh_access_token';\n    }\n\n    /**\n     * @see https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/authen-v1/authen/refresh_access_token\n     */\n    public function refreshToken(string $refreshToken): array\n    {\n        $this->configAppAccessToken();\n        $responseInstance = $this->getHttpClient()->post($this->getRefreshTokenUrl(), [\n            'json' => [\n                'app_access_token' => $this->config->get('app_access_token'),\n                Contracts\\RFC6749_ABNF_REFRESH_TOKEN => $refreshToken,\n                Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_REFRESH_TOKEN,\n            ],\n        ]);\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (empty($response['data'] ?? null)) {\n            throw new Exceptions\\AuthorizeFailedException('Invalid token response', $response);\n        }\n\n        return $this->normalizeAccessTokenResponse($response['data']);\n    }\n\n    /**\n     * @throws Exceptions\\BadRequestException\n     */\n    protected function getUserByToken(string $token): array\n    {\n        $responseInstance = $this->getHttpClient()->get($this->baseUrl.'/authen/v1/user_info', [\n            'headers' => [\n                'Content-Type' => 'application/json',\n                'Authorization' => 'Bearer '.$token,\n            ],\n            'query' => \\array_filter(\n                [\n                    'user_access_token' => $token,\n                ]\n            ),\n        ]);\n\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (empty($response['data'] ?? null)) {\n            throw new Exceptions\\BadRequestException((string) $responseInstance->getBody());\n        }\n\n        return $response['data'];\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user['user_id'] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_NICKNAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_AVATAR => $user['avatar_url'] ?? null,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n        ]);\n    }\n\n    public function withInternalAppMode(): self\n    {\n        $this->isInternalApp = true;\n\n        return $this;\n    }\n\n    public function withDefaultMode(): self\n    {\n        $this->isInternalApp = false;\n\n        return $this;\n    }\n\n    /**\n     * set self::APP_TICKET in config attribute\n     */\n    public function withAppTicket(string $appTicket): self\n    {\n        $this->config->set(self::APP_TICKET, $appTicket);\n\n        return $this;\n    }\n\n    /**\n     * 设置 app_access_token 到 config 设置中\n     * 应用维度授权凭证，开放平台可据此识别调用方的应用身份\n     * 分内建和自建\n     *\n     * @throws Exceptions\\FeiShu\\InvalidTicketException\n     * @throws Exceptions\\InvalidTokenException\n     */\n    protected function configAppAccessToken(): self\n    {\n        $url = $this->baseUrl.'/auth/v3/app_access_token/';\n        $params = [\n            'json' => [\n                Contracts\\ABNF_APP_ID => $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_ID),\n                Contracts\\ABNF_APP_SECRET => $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_SECRET),\n                self::APP_TICKET => $this->config->get(self::APP_TICKET),\n            ],\n        ];\n\n        if ($this->isInternalApp) {\n            $url = $this->baseUrl.'/auth/v3/app_access_token/internal/';\n            $params = [\n                'json' => [\n                    Contracts\\ABNF_APP_ID => $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_ID),\n                    Contracts\\ABNF_APP_SECRET => $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_SECRET),\n                ],\n            ];\n        }\n\n        if (! $this->isInternalApp && ! $this->config->has(self::APP_TICKET)) {\n            throw new Exceptions\\FeiShu\\InvalidTicketException('You are using default mode, please config \\'app_ticket\\' first');\n        }\n\n        $responseInstance = $this->getHttpClient()->post($url, $params);\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (empty($response['app_access_token'] ?? null)) {\n            throw new Exceptions\\InvalidTokenException('Invalid \\'app_access_token\\' response', (string) $responseInstance->getBody());\n        }\n\n        $this->config->set('app_access_token', $response['app_access_token']);\n\n        return $this;\n    }\n\n    /**\n     * 设置 tenant_access_token 到 config 属性中\n     * 应用的企业授权凭证，开放平台据此识别调用方的应用身份和企业身份\n     * 分内建和自建\n     *\n     * @throws Exceptions\\BadRequestException\n     * @throws Exceptions\\AuthorizeFailedException\n     */\n    protected function configTenantAccessToken(): self\n    {\n        $url = $this->baseUrl.'/auth/v3/tenant_access_token/';\n        $params = [\n            'json' => [\n                Contracts\\ABNF_APP_ID => $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_ID),\n                Contracts\\ABNF_APP_SECRET => $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_SECRET),\n                self::APP_TICKET => $this->config->get(self::APP_TICKET),\n            ],\n        ];\n\n        if ($this->isInternalApp) {\n            $url = $this->baseUrl.'/auth/v3/tenant_access_token/internal/';\n            $params = [\n                'json' => [\n                    Contracts\\ABNF_APP_ID => $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_ID),\n                    Contracts\\ABNF_APP_SECRET => $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_SECRET),\n                ],\n            ];\n        }\n\n        if (! $this->isInternalApp && ! $this->config->has(self::APP_TICKET)) {\n            throw new Exceptions\\BadRequestException('You are using default mode, please config \\'app_ticket\\' first');\n        }\n\n        $response = $this->getHttpClient()->post($url, $params);\n        $response = $this->fromJsonBody($response);\n        if (empty($response['tenant_access_token'])) {\n            throw new Exceptions\\AuthorizeFailedException('Invalid tenant_access_token response', $response);\n        }\n\n        $this->config->set('tenant_access_token', $response['tenant_access_token']);\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Figma.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see https://www.figma.com/developers/api#oauth2\n */\nclass Figma extends Base\n{\n    public const NAME = 'figma';\n\n    protected string $scopeSeparator = '';\n\n    protected array $scopes = ['file_read'];\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase('https://www.figma.com/oauth');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return 'https://www.figma.com/api/oauth/token';\n    }\n\n    public function tokenFromCode(string $code): array\n    {\n        $response = $this->getHttpClient()->post($this->getTokenUrl(), [\n            'form_params' => $this->getTokenFields($code),\n        ]);\n\n        return $this->normalizeAccessTokenResponse($response->getBody());\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return parent::getTokenFields($code) + [Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE];\n    }\n\n    protected function getCodeFields(): array\n    {\n        return parent::getCodeFields() + [Contracts\\RFC6749_ABNF_STATE => \\md5(\\uniqid('state_', true))];\n    }\n\n    protected function getUserByToken(string $token, ?array $query = []): array\n    {\n        $response = $this->getHttpClient()->get('https://api.figma.com/v1/me', [\n            'headers' => [\n                'Accept' => 'application/json',\n                'Authorization' => 'Bearer '.$token,\n            ],\n        ]);\n\n        return $this->fromJsonBody($response);\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_ID] ?? null,\n            'username' => $user[Contracts\\ABNF_EMAIL] ?? null,\n            Contracts\\ABNF_NICKNAME => $user['handle'] ?? null,\n            Contracts\\ABNF_NAME => $user['handle'] ?? null,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n            Contracts\\ABNF_AVATAR => $user['img_url'] ?? null,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/GitHub.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\nclass GitHub extends Base\n{\n    public const     NAME = 'github';\n\n    protected array  $scopes = ['read:user'];\n\n    protected string $scopeSeparator = ' ';\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase('https://github.com/login/oauth/authorize');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return 'https://github.com/login/oauth/access_token';\n    }\n\n    protected function getUserByToken(string $token): array\n    {\n        $userUrl = 'https://api.github.com/user';\n\n        $response = $this->getHttpClient()->get(\n            $userUrl,\n            $this->createAuthorizationHeaders($token)\n        );\n\n        $user = $this->fromJsonBody($response);\n\n        if (\\in_array('user:email', $this->scopes)) {\n            $user[Contracts\\ABNF_EMAIL] = $this->getEmailByToken($token);\n        }\n\n        return $user;\n    }\n\n    protected function getEmailByToken(string $token): string\n    {\n        $emailsUrl = 'https://api.github.com/user/emails';\n\n        try {\n            $response = $this->getHttpClient()->get(\n                $emailsUrl,\n                $this->createAuthorizationHeaders($token)\n            );\n        } catch (\\Throwable $e) {\n            return '';\n        }\n\n        foreach ($this->fromJsonBody($response) as $email) {\n            if ($email['primary'] && $email['verified']) {\n                return $email[Contracts\\ABNF_EMAIL];\n            }\n        }\n\n        return '';\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_ID] ?? null,\n            Contracts\\ABNF_NICKNAME => $user['login'] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n            Contracts\\ABNF_AVATAR => $user['avatar_url'] ?? null,\n        ]);\n    }\n\n    #[ArrayShape(['headers' => 'array'])]\n    protected function createAuthorizationHeaders(string $token): array\n    {\n        return [\n            'headers' => [\n                'Accept' => 'application/vnd.github.v3+json',\n                'Authorization' => \\sprintf('token %s', $token),\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Gitee.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\nclass Gitee extends Base\n{\n    public const NAME = 'gitee';\n\n    protected array $scopes = ['user_info'];\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase('https://gitee.com/oauth/authorize');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return 'https://gitee.com/oauth/token';\n    }\n\n    protected function getUserByToken(string $token): array\n    {\n        $userUrl = 'https://gitee.com/api/v5/user';\n        $response = $this->getHttpClient()->get($userUrl, [\n            'query' => [\n                Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $token,\n            ],\n        ]);\n\n        return $this->fromJsonBody($response);\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_ID] ?? null,\n            Contracts\\ABNF_NICKNAME => $user['login'] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n            Contracts\\ABNF_AVATAR => $user['avatar_url'] ?? null,\n        ]);\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return [\n            Contracts\\RFC6749_ABNF_CLIENT_ID => $this->getClientId(),\n            Contracts\\RFC6749_ABNF_CLIENT_SECRET => $this->getClientSecret(),\n            Contracts\\RFC6749_ABNF_CODE => $code,\n            Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Google.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see https://developers.google.com/identity/protocols/OpenIDConnect [OpenID Connect]\n */\nclass Google extends Base\n{\n    public const NAME = 'google';\n\n    protected string $scopeSeparator = ' ';\n\n    protected array $scopes = [\n        'https://www.googleapis.com/auth/userinfo.email',\n        'https://www.googleapis.com/auth/userinfo.profile',\n    ];\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase('https://accounts.google.com/o/oauth2/v2/auth');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return 'https://www.googleapis.com/oauth2/v4/token';\n    }\n\n    public function tokenFromCode(string $code): array\n    {\n        $response = $this->getHttpClient()->post($this->getTokenUrl(), [\n            'form_params' => $this->getTokenFields($code),\n        ]);\n\n        return $this->normalizeAccessTokenResponse($response->getBody());\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return parent::getTokenFields($code) + [Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE];\n    }\n\n    protected function getUserByToken(string $token, ?array $query = []): array\n    {\n        $response = $this->getHttpClient()->get('https://www.googleapis.com/userinfo/v2/me', [\n            'headers' => [\n                'Accept' => 'application/json',\n                'Authorization' => 'Bearer '.$token,\n            ],\n        ]);\n\n        return $this->fromJsonBody($response);\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_ID] ?? null,\n            'username' => $user[Contracts\\ABNF_EMAIL] ?? null,\n            Contracts\\ABNF_NICKNAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n            Contracts\\ABNF_AVATAR => $user['picture'] ?? null,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Lark.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\n/**\n * @see https://open.larksuite.com/document/ukTMukTMukTM/uITNz4iM1MjLyUzM\n */\nclass Lark extends FeiShu\n{\n    public const NAME = 'lark';\n\n    protected string $baseUrl = 'https://open.larksuite.com/open-apis';\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Line.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see https://developers.line.biz/en/docs/line-login/integrate-line-login/ [Integrating LINE Login with your web app]\n */\nclass Line extends Base\n{\n    public const NAME = 'line';\n\n    protected string $baseUrl = 'https://api.line.me/oauth2/';\n\n    protected string $version = 'v2.1';\n\n    protected array $scopes = ['profile'];\n\n    protected function getAuthUrl(): string\n    {\n        $this->state = $this->state ?: \\md5(\\uniqid(Contracts\\RFC6749_ABNF_STATE, true));\n\n        return $this->buildAuthUrlFromBase('https://access.line.me/oauth2/'.$this->version.'/authorize');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return $this->baseUrl.$this->version.'/token';\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return parent::getTokenFields($code) + [Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE];\n    }\n\n    protected function getUserByToken(string $token): array\n    {\n        $response = $this->getHttpClient()->get(\n            'https://api.line.me/v2/profile',\n            [\n                'headers' => [\n                    'Accept' => 'application/json',\n                    'Authorization' => 'Bearer '.$token,\n                ],\n            ]\n        );\n\n        return $this->fromJsonBody($response);\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user['userId'] ?? null,\n            Contracts\\ABNF_NAME => $user['displayName'] ?? null,\n            Contracts\\ABNF_NICKNAME => $user['displayName'] ?? null,\n            Contracts\\ABNF_AVATAR => $user['pictureUrl'] ?? null,\n            Contracts\\ABNF_EMAIL => null,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Linkedin.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see https://developer.linkedin.com/docs/oauth2 [Authenticating with OAuth 2.0]\n */\nclass Linkedin extends Base\n{\n    public const NAME = 'linkedin';\n\n    protected array $scopes = ['r_liteprofile', 'r_emailaddress'];\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase('https://www.linkedin.com/oauth/v2/authorization');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return 'https://www.linkedin.com/oauth/v2/accessToken';\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return parent::getTokenFields($code) + [Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE];\n    }\n\n    protected function getUserByToken(string $token, ?array $query = []): array\n    {\n        $basicProfile = $this->getBasicProfile($token);\n        $emailAddress = $this->getEmailAddress($token);\n\n        return \\array_merge($basicProfile, $emailAddress);\n    }\n\n    protected function getBasicProfile(string $token): array\n    {\n        $url = 'https://api.linkedin.com/v2/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams))';\n\n        $response = $this->getHttpClient()->get($url, [\n            'headers' => [\n                'Authorization' => 'Bearer ' . $token,\n                'X-RestLi-Protocol-Version' => '2.0.0',\n            ],\n        ]);\n\n        return $this->fromJsonBody($response);\n    }\n\n    protected function getEmailAddress(string $token): array\n    {\n        $url = 'https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))';\n\n        $response = $this->getHttpClient()->get($url, [\n            'headers' => [\n                'Authorization' => 'Bearer ' . $token,\n                'X-RestLi-Protocol-Version' => '2.0.0',\n            ],\n        ]);\n\n        return $this->fromJsonBody($response)['elements'][0]['handle~'] ?? [];\n    }\n\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        $preferredLocale = ($user['firstName']['preferredLocale']['language'] ?? null) . '_' .\n            ($user['firstName']['preferredLocale']['country'] ?? null);\n        $firstName = $user['firstName']['localized'][$preferredLocale] ?? null;\n        $lastName = $user['lastName']['localized'][$preferredLocale] ?? null;\n        $name = $firstName . ' ' . $lastName;\n\n        $images = $user['profilePicture']['displayImage~']['elements'] ?? [];\n        $avatars = \\array_filter($images, static fn ($image) => ($image['data']['com.linkedin.digitalmedia.mediaartifact.StillImage']['storageSize']['width'] ?? 0) === 100);\n        $avatar = \\array_shift($avatars);\n        $originalAvatars = \\array_filter($images, static fn ($image) => ($image['data']['com.linkedin.digitalmedia.mediaartifact.StillImage']['storageSize']['width'] ?? 0) === 800);\n        $originalAvatar = \\array_shift($originalAvatars);\n\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_ID] ?? null,\n            Contracts\\ABNF_NICKNAME => $name,\n            Contracts\\ABNF_NAME => $name,\n            Contracts\\ABNF_EMAIL => $user['emailAddress'] ?? null,\n            Contracts\\ABNF_AVATAR => $avatar['identifiers']['0']['identifier'] ?? null,\n            'avatar_original' => $originalAvatar['identifiers']['0']['identifier'] ?? null,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/OpenWeWork.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Overtrue\\Socialite\\Exceptions\\AuthorizeFailedException;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @link https://open.work.weixin.qq.com/api/doc/90001/90143/91120\n */\nclass OpenWeWork extends Base\n{\n    public const NAME = 'open-wework';\n\n    protected bool $detailed = false;\n\n    protected bool $asQrcode = false;\n\n    protected string $userType = 'member';\n\n    protected string $lang = 'zh';\n\n    protected ?string $suiteTicket = null;\n\n    protected ?int $agentId = null;\n\n    protected ?string $suiteAccessToken = null;\n\n    protected string $baseUrl = 'https://qyapi.weixin.qq.com';\n\n    public function __construct(array $config)\n    {\n        parent::__construct($config);\n\n        if ($this->getConfig()->has('base_url')) {\n            $this->baseUrl = $this->getConfig()->get('base_url');\n        }\n    }\n\n    public function withAgentId(int $agentId): self\n    {\n        $this->agentId = $agentId;\n\n        return $this;\n    }\n\n    public function detailed(): self\n    {\n        $this->detailed = true;\n\n        return $this;\n    }\n\n    public function asQrcode(): self\n    {\n        $this->asQrcode = true;\n\n        return $this;\n    }\n\n    public function withUserType(string $userType): self\n    {\n        $this->userType = $userType;\n\n        return $this;\n    }\n\n    public function withLang(string $lang): self\n    {\n        $this->lang = $lang;\n\n        return $this;\n    }\n\n    /**\n     * @throws GuzzleException\n     * @throws AuthorizeFailedException\n     */\n    public function userFromCode(string $code): Contracts\\UserInterface\n    {\n        $user = $this->getUser($this->getSuiteAccessToken(), $code);\n\n        if ($this->detailed) {\n            $user = \\array_merge($user, $this->getUserByTicket($user['user_ticket']));\n        }\n\n        return $this->mapUserToObject($user)->setProvider($this)->setRaw($user);\n    }\n\n    public function withSuiteTicket(string $suiteTicket): self\n    {\n        $this->suiteTicket = $suiteTicket;\n\n        return $this;\n    }\n\n    public function withSuiteAccessToken(string $suiteAccessToken): self\n    {\n        $this->suiteAccessToken = $suiteAccessToken;\n\n        return $this;\n    }\n\n    /**\n     * @throws Exceptions\\InvalidArgumentException\n     */\n    public function getAuthUrl(): string\n    {\n        $queries = \\array_filter([\n            'appid' => $this->getClientId(),\n            Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            Contracts\\RFC6749_ABNF_RESPONSE_TYPE => Contracts\\RFC6749_ABNF_CODE,\n            Contracts\\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator),\n            Contracts\\RFC6749_ABNF_STATE => $this->state,\n            'agentid' => $this->agentId,\n        ]);\n\n        if ($this->asQrcode) {\n            $queries = array_filter([\n                'appid' => $queries['appid'] ?? $this->getClientId(),\n                'redirect_uri' => $queries['redirect_uri'] ?? $this->redirectUrl,\n                'usertype' => $this->userType,\n                'lang' => $this->lang,\n                'state' => $this->state,\n            ]);\n\n            return \\sprintf('https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?%s', http_build_query($queries));\n        }\n\n        return \\sprintf('https://open.weixin.qq.com/connect/oauth2/authorize?%s#wechat_redirect', \\http_build_query($queries));\n    }\n\n    /**\n     * @throws Exceptions\\MethodDoesNotSupportException\n     */\n    protected function getUserByToken(string $token): array\n    {\n        throw new Exceptions\\MethodDoesNotSupportException('Open WeWork doesn\\'t support access_token mode');\n    }\n\n    protected function getSuiteAccessToken(): string\n    {\n        return $this->suiteAccessToken ?? $this->suiteAccessToken = $this->requestSuiteAccessToken();\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException|GuzzleException\n     */\n    protected function getUser(string $token, string $code): array\n    {\n        $responseInstance = $this->getHttpClient()->get(\n            $this->baseUrl.'/cgi-bin/service/getuserinfo3rd',\n            [\n                'query' => \\array_filter(\n                    [\n                        'suite_access_token' => $token,\n                        Contracts\\RFC6749_ABNF_CODE => $code,\n                    ]\n                ),\n            ]\n        );\n\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (($response['errcode'] ?? 1) > 0 || (empty($response['UserId']) && empty($response['openid']))) {\n            throw new Exceptions\\AuthorizeFailedException((string) $responseInstance->getBody(), $response);\n        } elseif (empty($response['user_ticket'])) {\n            $this->detailed = false;\n        }\n\n        return $response;\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     * @throws GuzzleException\n     */\n    protected function getUserByTicket(string $userTicket): array\n    {\n        $responseInstance = $this->getHttpClient()->post(\n            $this->baseUrl.'/cgi-bin/service/auth/getuserdetail3rd',\n            [\n                'query' => [\n                    'suite_access_token' => $this->getSuiteAccessToken(),\n                ],\n                'json' => [\n                    'user_ticket' => $userTicket,\n                ],\n            ],\n        );\n\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (($response['errcode'] ?? 1) > 0 || empty($response['userid'])) {\n            throw new Exceptions\\AuthorizeFailedException((string) $responseInstance->getBody(), $response);\n        }\n\n        return $response;\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User($this->detailed ? [\n            Contracts\\ABNF_ID => $user['userid'] ?? $user['UserId'] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_AVATAR => $user[Contracts\\ABNF_AVATAR] ?? null,\n            'gender' => $user['gender'] ?? null,\n            'corpid' => $user['corpid'] ?? $user['CorpId'] ?? null,\n            'open_userid' => $user['open_userid'] ?? null,\n            'qr_code' => $user['qr_code'] ?? null,\n        ] : [\n            Contracts\\ABNF_ID => $user['userid'] ?? $user['UserId'] ?? $user['OpenId'] ?? $user['openid'] ?? null,\n            'corpid' => $user['CorpId'] ?? null,\n            'open_userid' => $user['open_userid'] ?? null,\n        ]);\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     * @throws GuzzleException\n     */\n    protected function requestSuiteAccessToken(): string\n    {\n        $responseInstance = $this->getHttpClient()->post(\n            $this->baseUrl.'/cgi-bin/service/get_suite_token',\n            [\n                'json' => [\n                    'suite_id' => $this->config->get('suite_id') ?? $this->config->get('client_id'),\n                    'suite_secret' => $this->config->get('suite_secret') ?? $this->config->get('client_secret'),\n                    'suite_ticket' => $this->suiteTicket,\n                ],\n            ]\n        );\n\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (isset($response['errcode']) && $response['errcode'] > 0) {\n            throw new Exceptions\\AuthorizeFailedException((string) $responseInstance->getBody(), $response);\n        }\n\n        return $response['suite_access_token'];\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return '';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Outlook.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\nclass Outlook extends Base\n{\n    public const NAME = 'outlook';\n\n    protected array $scopes = ['User.Read'];\n\n    protected string $scopeSeparator = ' ';\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase('https://login.microsoftonline.com/common/oauth2/v2.0/authorize');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return 'https://login.microsoftonline.com/common/oauth2/v2.0/token';\n    }\n\n    protected function getUserByToken(string $token, ?array $query = []): array\n    {\n        $response = $this->getHttpClient()->get(\n            'https://graph.microsoft.com/v1.0/me',\n            ['headers' => [\n                'Accept' => 'application/json',\n                'Authorization' => 'Bearer '.$token,\n            ],\n            ]\n        );\n\n        return $this->fromJsonBody($response);\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_ID] ?? null,\n            Contracts\\ABNF_NICKNAME => null,\n            Contracts\\ABNF_NAME => $user['displayName'] ?? null,\n            Contracts\\ABNF_EMAIL => $user['userPrincipalName'] ?? null,\n            Contracts\\ABNF_AVATAR => null,\n        ]);\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return parent::getTokenFields($code) + [Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/QCloud.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Overtrue\\Socialite\\User;\n\nclass QCloud extends Base\n{\n    public const NAME = 'qcloud';\n\n    protected array $scopes = ['login'];\n\n    protected string $accessTokenKey = 'UserAccessToken';\n\n    protected string $refreshTokenKey = 'UserRefreshToken';\n\n    protected string $expiresInKey = 'ExpiresAt';\n\n    protected ?string $openId;\n\n    protected ?string $unionId;\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase('https://cloud.tencent.com/open/authorize');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return '';\n    }\n\n    protected function getAppId(): string\n    {\n        return $this->config->get(Contracts\\ABNF_APP_ID) ?? $this->getClientId();\n    }\n\n    protected function getSecretId(): string\n    {\n        return $this->config->get('secret_id');\n    }\n\n    protected function getSecretKey(): string\n    {\n        return $this->config->get('secret_key');\n    }\n\n    public function TokenFromCode(string $code): array\n    {\n        $response = $this->performRequest(\n            'GET',\n            'open.tencentcloudapi.com',\n            'GetUserAccessToken',\n            '2018-12-25',\n            [\n                'query' => [\n                    'UserAuthCode' => $code,\n                ],\n            ]\n        );\n\n        return $this->parseAccessToken($response);\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     */\n    protected function getUserByToken(string $token): array\n    {\n        $secret = $this->getFederationToken($token);\n\n        return $this->performRequest(\n            'GET',\n            'open.tencentcloudapi.com',\n            'GetUserBaseInfo',\n            '2018-12-25',\n            [\n                'headers' => [\n                    'X-TC-Token' => $secret['Token'],\n                ],\n            ],\n            $secret['TmpSecretId'],\n            $secret['TmpSecretKey'],\n        );\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $this->openId ?? null,\n            Contracts\\ABNF_NAME => $user['Nickname'] ?? null,\n            Contracts\\ABNF_NICKNAME => $user['Nickname'] ?? null,\n        ]);\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     */\n    public function performRequest(string $method, string $host, string $action, string $version, array $options = [], ?string $secretId = null, ?string $secretKey = null): array\n    {\n        $method = \\strtoupper($method);\n        $timestamp = \\time();\n        $credential = \\sprintf('%s/%s/tc3_request', \\gmdate('Y-m-d', $timestamp), $this->getServiceFromHost($host));\n        $options['headers'] = \\array_merge(\n            $options['headers'] ?? [],\n            [\n                'X-TC-Action' => $action,\n                'X-TC-Timestamp' => $timestamp,\n                'X-TC-Version' => $version,\n                'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8',\n            ]\n        );\n\n        $signature = $this->sign($method, $host, $options['query'] ?? [], '', $options['headers'], $credential, $secretKey);\n        $options['headers']['Authorization'] =\n            \\sprintf(\n                'TC3-HMAC-SHA256 Credential=%s/%s, SignedHeaders=content-type;host, Signature=%s',\n                $secretId ?? $this->getSecretId(),\n                $credential,\n                $signature\n            );\n        $response = $this->getHttpClient()->get(\"https://{$host}/\", $options);\n\n        $response = $this->fromJsonBody($response);\n\n        if (! empty($response['Response']['Error'])) {\n            throw new Exceptions\\AuthorizeFailedException(\n                \\sprintf('%s: %s', $response['Response']['Error']['Code'], $response['Response']['Error']['Message']),\n                $response\n            );\n        }\n\n        return $response['Response'] ?? [];\n    }\n\n    protected function sign(string $requestMethod, string $host, array $query, string $payload, array $headers, string $credential, ?string $secretKey = null): bool|string\n    {\n        $canonicalRequestString = \\implode(\n            \"\\n\",\n            [\n                $requestMethod,\n                '/',\n                \\http_build_query($query),\n                \"content-type:{$headers['Content-Type']}\\nhost:{$host}\\n\",\n                'content-type;host',\n                \\hash('SHA256', $payload),\n            ]\n        );\n\n        $signString = \\implode(\n            \"\\n\",\n            [\n                'TC3-HMAC-SHA256',\n                $headers['X-TC-Timestamp'],\n                $credential,\n                \\hash('SHA256', $canonicalRequestString),\n            ]\n        );\n\n        $secretKey = $secretKey ?? $this->getSecretKey();\n        $secretDate = \\hash_hmac('SHA256', \\gmdate('Y-m-d', $headers['X-TC-Timestamp']), \"TC3{$secretKey}\", true);\n        $secretService = \\hash_hmac('SHA256', $this->getServiceFromHost($host), $secretDate, true);\n        $secretSigning = \\hash_hmac('SHA256', 'tc3_request', $secretService, true);\n\n        return \\hash_hmac('SHA256', $signString, $secretSigning);\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     */\n    protected function parseAccessToken(array|string $body): array\n    {\n        if (! \\is_array($body)) {\n            $body = \\json_decode($body, true);\n        }\n\n        if (empty($body['UserOpenId'] ?? null)) {\n            throw new Exceptions\\AuthorizeFailedException('Authorize Failed: '.\\json_encode($body, JSON_UNESCAPED_UNICODE), $body);\n        }\n\n        $this->openId = $body['UserOpenId'] ?? null;\n        $this->unionId = $body['UserUnionId'] ?? null;\n\n        return $body;\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     */\n    protected function getFederationToken(string $accessToken): array\n    {\n        $response = $this->performRequest(\n            'GET',\n            'sts.tencentcloudapi.com',\n            'GetThirdPartyFederationToken',\n            '2018-08-13',\n            [\n                'query' => [\n                    'UserAccessToken' => $accessToken,\n                    'Duration' => 7200,\n                    'ApiAppId' => 0,\n                ],\n                'headers' => [\n                    'X-TC-Region' => 'ap-guangzhou', // 官方人员说写死\n                ],\n            ]\n        );\n\n        if (empty($response['Credentials'] ?? null)) {\n            throw new Exceptions\\AuthorizeFailedException('Get Federation Token failed.', $response);\n        }\n\n        return $response['Credentials'];\n    }\n\n    protected function getCodeFields(): array\n    {\n        $fields = \\array_merge(\n            [\n                Contracts\\ABNF_APP_ID => $this->getAppId(),\n                Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n                Contracts\\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator),\n                Contracts\\RFC6749_ABNF_RESPONSE_TYPE => Contracts\\RFC6749_ABNF_CODE,\n            ],\n            $this->parameters\n        );\n\n        if ($this->state) {\n            $fields[Contracts\\RFC6749_ABNF_STATE] = $this->state;\n        }\n\n        return $fields;\n    }\n\n    protected function getServiceFromHost(string $host): string\n    {\n        return \\explode('.', $host)[0] ?? '';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/QQ.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse GuzzleHttp\\Utils;\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions\\AuthorizeFailedException;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see http://wiki.connect.qq.com/oauth2-0%E7%AE%80%E4%BB%8B [QQ - OAuth 2.0 登录QQ]\n */\nclass QQ extends Base\n{\n    public const NAME = 'qq';\n\n    protected string $baseUrl = 'https://graph.qq.com';\n\n    protected array $scopes = ['get_user_info'];\n\n    protected bool $withUnionId = false;\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase($this->baseUrl.'/oauth2.0/authorize');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return $this->baseUrl.'/oauth2.0/token';\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return parent::getTokenFields($code) + [Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE];\n    }\n\n    public function tokenFromCode(string $code): array\n    {\n        $response = $this->getHttpClient()->get($this->getTokenUrl(), [\n            'query' => $this->getTokenFields($code),\n        ]);\n\n        \\parse_str((string) $response->getBody(), $token);\n\n        return $this->normalizeAccessTokenResponse($token);\n    }\n\n    public function withUnionId(): self\n    {\n        $this->withUnionId = true;\n\n        return $this;\n    }\n\n    /**\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\Overtrue\\Socialite\\Exceptions\\AuthorizeFailedException\n     */\n    protected function getUserByToken(string $token): array\n    {\n        $response = $this->getHttpClient()->get($this->baseUrl.'/oauth2.0/me', [\n            'query' => [\n                Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $token,\n                'fmt' => 'json',\n            ] + ($this->withUnionId ? ['unionid' => 1] : []),\n        ]);\n\n        $me = $this->fromJsonBody($response);\n\n        $response = $this->getHttpClient()->get($this->baseUrl.'/user/get_user_info', [\n            'query' => [\n                Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $token,\n                'fmt' => 'json',\n                'openid' => $me['openid'],\n                'oauth_consumer_key' => $this->getClientId(),\n            ],\n        ]);\n\n        $user = $this->fromJsonBody($response);\n\n        if (! array_key_exists('ret', $user) || $user['ret'] !== 0) {\n            throw new AuthorizeFailedException('Authorize Failed: '.Utils::jsonEncode($user, \\JSON_UNESCAPED_UNICODE), $user);\n        }\n\n        return $user + [\n            'unionid' => $me['unionid'] ?? null,\n            'openid' => $me['openid'] ?? null,\n        ];\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user['openid'] ?? null,\n            Contracts\\ABNF_NAME => $user['nickname'] ?? null,\n            Contracts\\ABNF_NICKNAME => $user['nickname'] ?? null,\n            Contracts\\ABNF_EMAIL => $user['email'] ?? null,\n            Contracts\\ABNF_AVATAR => $user['figureurl_qq_2'] ?? null,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Taobao.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see https://open.taobao.com/doc.htm?docId=102635&docType=1&source=search [Taobao - OAuth 2.0 授权登录]\n */\nclass Taobao extends Base\n{\n    public const NAME = 'taobao';\n\n    protected string $baseUrl = 'https://oauth.taobao.com';\n\n    protected string $gatewayUrl = 'https://eco.taobao.com/router/rest';\n\n    protected string $view = 'web';\n\n    protected array $scopes = ['user_info'];\n\n    public function withView(string $view): self\n    {\n        $this->view = $view;\n\n        return $this;\n    }\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase($this->baseUrl.'/authorize');\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        'view' => 'string',\n        Contracts\\RFC6749_ABNF_RESPONSE_TYPE => 'string',\n    ])]\n    public function getCodeFields(): array\n    {\n        return [\n            Contracts\\RFC6749_ABNF_CLIENT_ID => $this->getClientId(),\n            Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            'view' => $this->view,\n            Contracts\\RFC6749_ABNF_RESPONSE_TYPE => Contracts\\RFC6749_ABNF_CODE,\n        ];\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return $this->baseUrl.'/token';\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n        'view' => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return parent::getTokenFields($code) + [\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n            'view' => $this->view,\n        ];\n    }\n\n    public function tokenFromCode(string $code): array\n    {\n        $response = $this->getHttpClient()->post($this->getTokenUrl(), [\n            'query' => $this->getTokenFields($code),\n        ]);\n\n        return $this->normalizeAccessTokenResponse($response->getBody());\n    }\n\n    protected function getUserByToken(string $token, ?array $query = []): array\n    {\n        $response = $this->getHttpClient()->post($this->getUserInfoUrl($this->gatewayUrl, $token));\n\n        return $this->fromJsonBody($response);\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_OPEN_ID] ?? null,\n            Contracts\\ABNF_NICKNAME => $user['nick'] ?? null,\n            Contracts\\ABNF_NAME => $user['nick'] ?? null,\n            Contracts\\ABNF_AVATAR => $user[Contracts\\ABNF_AVATAR] ?? null,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n        ]);\n    }\n\n    protected function generateSign(array $params): string\n    {\n        \\ksort($params);\n\n        $stringToBeSigned = $this->getConfig()->get(Contracts\\RFC6749_ABNF_CLIENT_SECRET);\n\n        foreach ($params as $k => $v) {\n            if (! \\is_array($v) && ! \\str_starts_with($v, '@')) {\n                $stringToBeSigned .= \"$k$v\";\n            }\n        }\n\n        $stringToBeSigned .= $this->getConfig()->get(Contracts\\RFC6749_ABNF_CLIENT_SECRET);\n\n        return \\strtoupper(\\md5($stringToBeSigned));\n    }\n\n    protected function getPublicFields(string $token, array $apiFields = []): array\n    {\n        $fields = [\n            'app_key' => $this->getClientId(),\n            'sign_method' => 'md5',\n            'session' => $token,\n            'timestamp' => (new \\DateTime('now', new \\DateTimeZone('Asia/Shanghai')))->format('Y-m-d H:i:s'),\n            'v' => '2.0',\n            'format' => 'json',\n        ];\n\n        $fields = \\array_merge($apiFields, $fields);\n        $fields['sign'] = $this->generateSign($fields);\n\n        return $fields;\n    }\n\n    protected function getUserInfoUrl(string $url, string $token): string\n    {\n        $apiFields = ['method' => 'taobao.miniapp.userInfo.get'];\n\n        $query = \\http_build_query($this->getPublicFields($token, $apiFields), '', '&', $this->encodingType);\n\n        return $url.'?'.$query;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Tapd.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Overtrue\\Socialite\\User;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * @see https://www.tapd.cn/help/show#1120003271001000708\n */\nclass Tapd extends Base\n{\n    public const NAME = 'tapd';\n\n    protected string $baseUrl = 'https://api.tapd.cn';\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase($this->baseUrl.'/quickstart/testauth');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return $this->baseUrl.'/tokens/request_token';\n    }\n\n    protected function getRefreshTokenUrl(): string\n    {\n        return $this->baseUrl.'/tokens/refresh_token';\n    }\n\n    public function tokenFromCode(string $code): array\n    {\n        $response = $this->getHttpClient()->post($this->getTokenUrl(), [\n            'headers' => [\n                'Accept' => 'application/json',\n                'Authorization' => 'Basic '.\\base64_encode(\\sprintf('%s:%s', $this->getClientId(), $this->getClientSecret())),\n            ],\n            'form_params' => $this->getTokenFields($code),\n        ]);\n\n        return $this->normalizeAccessTokenResponse($response->getBody());\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return [\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n            Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            Contracts\\RFC6749_ABNF_CODE => $code,\n        ];\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_REFRESH_TOKEN => 'string',\n    ])]\n    protected function getRefreshTokenFields(string $refreshToken): array\n    {\n        return [\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_REFRESH_TOKEN,\n            Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            Contracts\\RFC6749_ABNF_REFRESH_TOKEN => $refreshToken,\n        ];\n    }\n\n    public function tokenFromRefreshToken(string $refreshToken): array\n    {\n        $response = $this->getHttpClient()->post($this->getRefreshTokenUrl(), [\n            'headers' => [\n                'Accept' => 'application/json',\n                'Authorization' => 'Basic '.\\base64_encode(\\sprintf('%s:%s', $this->getClientId(), $this->getClientSecret())),\n            ],\n            'form_params' => $this->getRefreshTokenFields($refreshToken),\n        ]);\n\n        return $this->normalizeAccessTokenResponse((string) $response->getBody());\n    }\n\n    protected function getUserByToken(string $token): array\n    {\n        $response = $this->getHttpClient()->get($this->baseUrl.'/users/info', [\n            'headers' => [\n                'Accept' => 'application/json',\n                'Authorization' => 'Bearer '.$token,\n            ],\n        ]);\n\n        return $this->fromJsonBody($response);\n    }\n\n    /**\n     * @throws Exceptions\\BadRequestException\n     */\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        if (! isset($user['status']) && $user['status'] != 1) {\n            throw new Exceptions\\BadRequestException('用户信息获取失败');\n        }\n\n        return new User([\n            Contracts\\ABNF_ID => $user['data'][Contracts\\ABNF_ID] ?? null,\n            Contracts\\ABNF_NICKNAME => $user['data']['nick'] ?? null,\n            Contracts\\ABNF_NAME => $user['data'][Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_EMAIL => $user['data'][Contracts\\ABNF_EMAIL] ?? null,\n            Contracts\\ABNF_AVATAR => $user['data'][Contracts\\ABNF_AVATAR] ?? null,\n        ]);\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     */\n    protected function normalizeAccessTokenResponse(mixed $response): array\n    {\n        if ($response instanceof StreamInterface) {\n            $response->rewind();\n            $response = (string) $response;\n        }\n\n        if (\\is_string($response)) {\n            $response = \\json_decode($response, true) ?? [];\n        }\n\n        if (! \\is_array($response)) {\n            throw new Exceptions\\AuthorizeFailedException('Invalid token response', [$response]);\n        }\n\n        if (empty($response['data'][$this->accessTokenKey] ?? null)) {\n            throw new Exceptions\\AuthorizeFailedException('Authorize Failed: '.\\json_encode($response, JSON_UNESCAPED_UNICODE), $response);\n        }\n\n        return $response + [\n            Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $response['data'][$this->accessTokenKey],\n            Contracts\\RFC6749_ABNF_REFRESH_TOKEN => $response['data'][$this->refreshTokenKey] ?? null,\n            Contracts\\RFC6749_ABNF_EXPIRES_IN => \\intval($response['data'][$this->expiresInKey] ?? 0),\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/TouTiao.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see https://open.douyin.com/platform/resource/docs/openapi/account-permission/toutiao-get-permission-code\n */\nclass TouTiao extends DouYin\n{\n    public const NAME = 'toutiao';\n\n    protected string $baseUrl = 'https://open.snssdk.com';\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase($this->baseUrl.'/oauth/authorize/');\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_OPEN_ID] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NICKNAME] ?? null,\n            Contracts\\ABNF_NICKNAME => $user[Contracts\\ABNF_NICKNAME] ?? null,\n            Contracts\\ABNF_AVATAR => $user[Contracts\\ABNF_AVATAR] ?? null,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/WeChat.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Overtrue\\Socialite\\User;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * @see http://mp.weixin.qq.com/wiki/9/01f711493b5a02f24b04365ac5d8fd95.html [WeChat - 公众平台OAuth文档]\n * @see https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN\n *      [网站应用微信登录开发指南]\n */\nclass WeChat extends Base\n{\n    public const NAME = 'wechat';\n\n    protected string $baseUrl = 'https://api.weixin.qq.com/sns';\n\n    protected array $scopes = ['snsapi_login'];\n\n    protected bool $withCountryCode = false;\n\n    protected ?array $component = null;\n\n    protected ?string $openid = null;\n\n    public function __construct(array $config)\n    {\n        parent::__construct($config);\n\n        if ($this->getConfig()->has('component')) {\n            $this->prepareForComponent((array) $this->getConfig()->get('component'));\n        }\n    }\n\n    public function withOpenid(string $openid): self\n    {\n        $this->openid = $openid;\n\n        return $this;\n    }\n\n    public function withCountryCode(): self\n    {\n        $this->withCountryCode = true;\n\n        return $this;\n    }\n\n    public function tokenFromCode(string $code): array\n    {\n        $response = $this->getTokenFromCode($code);\n\n        return $this->normalizeAccessTokenResponse($response->getBody());\n    }\n\n    /**\n     * @param  array<string,string>  $componentConfig  [Contracts\\ABNF_ID => xxx, Contracts\\ABNF_TOKEN => xxx]\n     */\n    public function withComponent(array $componentConfig): self\n    {\n        $this->prepareForComponent($componentConfig);\n\n        return $this;\n    }\n\n    public function getComponent(): ?array\n    {\n        return $this->component;\n    }\n\n    protected function getAuthUrl(): string\n    {\n        $path = 'oauth2/authorize';\n\n        if (\\in_array('snsapi_login', $this->scopes)) {\n            $path = 'qrconnect';\n        }\n\n        return $this->buildAuthUrlFromBase(\"https://open.weixin.qq.com/connect/{$path}\");\n    }\n\n    protected function buildAuthUrlFromBase(string $url): string\n    {\n        $query = \\http_build_query($this->getCodeFields(), '', '&', $this->encodingType);\n\n        return $url.'?'.$query.'#wechat_redirect';\n    }\n\n    protected function getCodeFields(): array\n    {\n        if (! empty($this->component)) {\n            $this->with(\\array_merge($this->parameters, ['component_appid' => $this->component[Contracts\\ABNF_ID]]));\n        }\n\n        return \\array_merge([\n            'appid' => $this->getClientId(),\n            Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            Contracts\\RFC6749_ABNF_RESPONSE_TYPE => Contracts\\RFC6749_ABNF_CODE,\n            Contracts\\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator),\n            Contracts\\RFC6749_ABNF_STATE => $this->state ?: \\md5(\\uniqid(Contracts\\RFC6749_ABNF_STATE, true)),\n            'connect_redirect' => 1,\n        ], $this->parameters);\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return \\sprintf($this->baseUrl.'/oauth2%s/access_token', empty($this->component) ? '' : '/component');\n    }\n\n    public function userFromCode(string $code): Contracts\\UserInterface\n    {\n        if (\\in_array('snsapi_base', $this->scopes)) {\n            return $this->mapUserToObject($this->fromJsonBody($this->getTokenFromCode($code)));\n        }\n\n        $token = $this->tokenFromCode($code);\n\n        $this->withOpenid($token['openid']);\n\n        $user = $this->userFromToken($token[$this->accessTokenKey]);\n\n        return $user->setRefreshToken($token[Contracts\\RFC6749_ABNF_REFRESH_TOKEN])\n            ->setExpiresIn($token[Contracts\\RFC6749_ABNF_EXPIRES_IN])\n            ->setTokenResponse($token);\n    }\n\n    protected function getUserByToken(string $token): array\n    {\n        $language = $this->withCountryCode ? null : (isset($this->parameters['lang']) ? $this->parameters['lang'] : 'zh_CN');\n\n        $response = $this->getHttpClient()->get($this->baseUrl.'/userinfo', [\n            'query' => \\array_filter([\n                Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $token,\n                'openid' => $this->openid,\n                'lang' => $language,\n            ]),\n        ]);\n\n        return $this->fromJsonBody($response);\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user['openid'] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NICKNAME] ?? null,\n            Contracts\\ABNF_NICKNAME => $user[Contracts\\ABNF_NICKNAME] ?? null,\n            Contracts\\ABNF_AVATAR => $user['headimgurl'] ?? null,\n            Contracts\\ABNF_EMAIL => null,\n        ]);\n    }\n\n    protected function getTokenFields(string $code): array\n    {\n        return empty($this->component) ? [\n            'appid' => $this->getClientId(),\n            'secret' => $this->getClientSecret(),\n            Contracts\\RFC6749_ABNF_CODE => $code,\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n        ] : [\n            'appid' => $this->getClientId(),\n            'component_appid' => $this->component[Contracts\\ABNF_ID],\n            'component_access_token' => $this->component[Contracts\\ABNF_TOKEN],\n            Contracts\\RFC6749_ABNF_CODE => $code,\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n        ];\n    }\n\n    protected function getTokenFromCode(string $code): ResponseInterface\n    {\n        return $this->getHttpClient()->get($this->getTokenUrl(), [\n            'headers' => ['Accept' => 'application/json'],\n            'query' => $this->getTokenFields($code),\n        ]);\n    }\n\n    /**\n     * @throws Exceptions\\InvalidArgumentException\n     */\n    protected function prepareForComponent(array $component): void\n    {\n        $config = [];\n        foreach ($component as $key => $value) {\n            if (\\is_callable($value)) {\n                $value = \\call_user_func($value, $this);\n            }\n\n            switch ($key) {\n                case Contracts\\ABNF_ID:\n                case Contracts\\ABNF_APP_ID:\n                case 'component_app_id':\n                    $config[Contracts\\ABNF_ID] = $value;\n                    break;\n                case Contracts\\ABNF_TOKEN:\n                case Contracts\\RFC6749_ABNF_ACCESS_TOKEN:\n                case 'app_token':\n                case 'component_access_token':\n                    $config[Contracts\\ABNF_TOKEN] = $value;\n                    break;\n            }\n        }\n\n        if (2 !== \\count($config)) {\n            throw new Exceptions\\InvalidArgumentException('Please check your config arguments were available.');\n        }\n\n        if (1 === \\count($this->scopes) && \\in_array('snsapi_login', $this->scopes)) {\n            $this->scopes = ['snsapi_base'];\n        }\n\n        $this->component = $config;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/WeWork.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @link https://developer.work.weixin.qq.com/document/path/91022\n */\nclass WeWork extends Base\n{\n    public const NAME = 'wework';\n\n    protected bool $detailed = false;\n\n    protected ?int $agentId = null;\n\n    protected ?string $apiAccessToken;\n\n    protected bool $asQrcode = false;\n\n    protected string $baseUrl = 'https://qyapi.weixin.qq.com';\n\n    public function __construct(array $config)\n    {\n        parent::__construct($config);\n\n        if ($this->getConfig()->has('base_url')) {\n            $this->baseUrl = $this->getConfig()->get('base_url');\n        }\n\n        if ($this->getConfig()->has('agent_id')) {\n            $this->agentId = $this->getConfig()->get('agent_id');\n        }\n    }\n\n    public function getBaseUrl(): ?string\n    {\n        return $this->baseUrl;\n    }\n\n    public function userFromCode(string $code): Contracts\\UserInterface\n    {\n        $token = $this->getApiAccessToken();\n        $user = $this->getUser($token, $code);\n\n        if ($this->detailed) {\n            $user = $this->getUserById($user['UserId']);\n        }\n\n        return $this->mapUserToObject($user)->setProvider($this)->setRaw($user);\n    }\n\n    public function withAgentId(int $agentId): self\n    {\n        $this->agentId = $agentId;\n\n        return $this;\n    }\n\n    public function detailed(): self\n    {\n        $this->detailed = true;\n\n        return $this;\n    }\n\n    public function asQrcode(): self\n    {\n        $this->asQrcode = true;\n\n        return $this;\n    }\n\n    public function withApiAccessToken(string $apiAccessToken): self\n    {\n        $this->apiAccessToken = $apiAccessToken;\n\n        return $this;\n    }\n\n    public function getAuthUrl(): string\n    {\n        $scopes = $this->formatScopes($this->scopes, $this->scopeSeparator);\n        $queries = array_filter([\n            'appid' => $this->getClientId(),\n            'agentid' => $this->agentId,\n            Contracts\\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl,\n            Contracts\\RFC6749_ABNF_RESPONSE_TYPE => Contracts\\RFC6749_ABNF_CODE,\n            Contracts\\RFC6749_ABNF_SCOPE => $scopes,\n            Contracts\\RFC6749_ABNF_STATE => $this->state,\n        ]);\n\n        if (! $this->agentId && (str_contains($scopes, 'snsapi_privateinfo') || $this->asQrcode)) {\n            throw new Exceptions\\InvalidArgumentException(\"agent_id is require when qrcode mode or scopes is 'snsapi_privateinfo'\");\n        }\n\n        if ($this->asQrcode) {\n            unset($queries[Contracts\\RFC6749_ABNF_SCOPE]);\n\n            return \\sprintf('https://open.work.weixin.qq.com/wwopen/sso/qrConnect?%s', http_build_query($queries));\n        }\n\n        return \\sprintf('https://open.weixin.qq.com/connect/oauth2/authorize?%s#wechat_redirect', \\http_build_query($queries));\n    }\n\n    /**\n     * @throws Exceptions\\MethodDoesNotSupportException\n     */\n    protected function getUserByToken(string $token): array\n    {\n        throw new Exceptions\\MethodDoesNotSupportException('WeWork doesn\\'t support access_token mode');\n    }\n\n    protected function getApiAccessToken(): string\n    {\n        return $this->apiAccessToken ?? $this->apiAccessToken = $this->requestApiAccessToken();\n    }\n\n    protected function getUser(string $token, string $code): array\n    {\n        $responseInstance = $this->getHttpClient()->get(\n            $this->baseUrl.'/cgi-bin/user/getuserinfo',\n            [\n                'query' => \\array_filter(\n                    [\n                        Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $token,\n                        Contracts\\RFC6749_ABNF_CODE => $code,\n                    ]\n                ),\n            ]\n        );\n\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (($response['errcode'] ?? 1) > 0 || (empty($response['UserId']) && empty($response['OpenId']))) {\n            throw new Exceptions\\AuthorizeFailedException((string) $responseInstance->getBody(), $response);\n        } elseif (empty($response['UserId'])) {\n            $this->detailed = false;\n        }\n\n        return $response;\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     */\n    protected function getUserById(string $userId): array\n    {\n        $responseInstance = $this->getHttpClient()->post($this->baseUrl.'/cgi-bin/user/get', [\n            'query' => [\n                Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $this->getApiAccessToken(),\n                'userid' => $userId,\n            ],\n        ]);\n\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (($response['errcode'] ?? 1) > 0 || empty($response['userid'])) {\n            throw new Exceptions\\AuthorizeFailedException((string) $responseInstance->getBody(), $response);\n        }\n\n        return $response;\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User($this->detailed ? [\n            Contracts\\ABNF_ID => $user['userid'] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_AVATAR => $user[Contracts\\ABNF_AVATAR] ?? null,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n        ] : [\n            Contracts\\ABNF_ID => $user['UserId'] ?? null ?: $user['OpenId'] ?? null,\n        ]);\n    }\n\n    /**\n     * @throws Exceptions\\AuthorizeFailedException\n     */\n    protected function requestApiAccessToken(): string\n    {\n        $responseInstance = $this->getHttpClient()->get($this->baseUrl.'/cgi-bin/gettoken', [\n            'query' => \\array_filter(\n                [\n                    'corpid' => $this->config->get('corp_id')\n                        ?? $this->config->get('corpid')\n                        ?? $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_ID),\n                    'corpsecret' => $this->config->get('corp_secret')\n                        ?? $this->config->get('corpsecret')\n                        ?? $this->config->get(Contracts\\RFC6749_ABNF_CLIENT_SECRET),\n                ]\n            ),\n        ]);\n\n        $response = $this->fromJsonBody($responseInstance);\n\n        if (($response['errcode'] ?? 1) > 0) {\n            throw new Exceptions\\AuthorizeFailedException((string) $responseInstance->getBody(), $response);\n        }\n\n        return $response[Contracts\\RFC6749_ABNF_ACCESS_TOKEN];\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return '';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Weibo.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\ArrayShape;\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\Exceptions;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E [OAuth 2.0 授权机制说明]\n */\nclass Weibo extends Base\n{\n    public const NAME = 'weibo';\n\n    protected string $baseUrl = 'https://api.weibo.com';\n\n    protected array $scopes = [Contracts\\ABNF_EMAIL];\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase($this->baseUrl.'/oauth2/authorize');\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return $this->baseUrl.'/2/oauth2/access_token';\n    }\n\n    #[ArrayShape([\n        Contracts\\RFC6749_ABNF_CLIENT_ID => 'null|string',\n        Contracts\\RFC6749_ABNF_CLIENT_SECRET => 'null|string',\n        Contracts\\RFC6749_ABNF_CODE => 'string',\n        Contracts\\RFC6749_ABNF_REDIRECT_URI => 'null|string',\n        Contracts\\RFC6749_ABNF_GRANT_TYPE => 'string',\n    ])]\n    protected function getTokenFields(string $code): array\n    {\n        return parent::getTokenFields($code) + [\n            Contracts\\RFC6749_ABNF_GRANT_TYPE => Contracts\\RFC6749_ABNF_AUTHORATION_CODE,\n        ];\n    }\n\n    /**\n     * @throws Exceptions\\InvalidTokenException\n     */\n    protected function getUserByToken(string $token): array\n    {\n        $uid = $this->getTokenPayload($token)['uid'] ?? null;\n\n        if (empty($uid)) {\n            throw new Exceptions\\InvalidTokenException('Invalid token.', $token);\n        }\n\n        $response = $this->getHttpClient()->get($this->baseUrl.'/2/users/show.json', [\n            'query' => [\n                'uid' => $uid,\n                Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $token,\n            ],\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ]);\n\n        return $this->fromJsonBody($response);\n    }\n\n    /**\n     * @throws Exceptions\\InvalidTokenException\n     */\n    protected function getTokenPayload(string $token): array\n    {\n        $response = $this->getHttpClient()->post($this->baseUrl.'/oauth2/get_token_info', [\n            'query' => [\n                Contracts\\RFC6749_ABNF_ACCESS_TOKEN => $token,\n            ],\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ]);\n\n        $response = $this->fromJsonBody($response);\n\n        if (empty($response['uid'] ?? null)) {\n            throw new Exceptions\\InvalidTokenException(\\sprintf('Invalid token %s', $token), $token);\n        }\n\n        return $response;\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_ID] ?? null,\n            Contracts\\ABNF_NICKNAME => $user['screen_name'] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NAME] ?? null,\n            Contracts\\ABNF_EMAIL => $user[Contracts\\ABNF_EMAIL] ?? null,\n            Contracts\\ABNF_AVATAR => $user['avatar_large'] ?? null,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/XiGua.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Providers;\n\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Contracts;\nuse Overtrue\\Socialite\\User;\n\n/**\n * @see https://open.douyin.com/platform/resource/docs/openapi/account-permission/xigua-get-permission-code\n */\nclass XiGua extends DouYin\n{\n    public const NAME = 'xigua';\n\n    protected string $baseUrl = 'https://open-api.ixigua.com';\n\n    protected function getAuthUrl(): string\n    {\n        return $this->buildAuthUrlFromBase($this->baseUrl.'/oauth/connect');\n    }\n\n    #[Pure]\n    protected function mapUserToObject(array $user): Contracts\\UserInterface\n    {\n        return new User([\n            Contracts\\ABNF_ID => $user[Contracts\\ABNF_OPEN_ID] ?? null,\n            Contracts\\ABNF_NAME => $user[Contracts\\ABNF_NICKNAME] ?? null,\n            Contracts\\ABNF_NICKNAME => $user[Contracts\\ABNF_NICKNAME] ?? null,\n            Contracts\\ABNF_AVATAR => $user[Contracts\\ABNF_AVATAR] ?? null,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/SocialiteManager.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite;\n\nuse Closure;\nuse JetBrains\\PhpStorm\\Pure;\n\nclass SocialiteManager implements Contracts\\FactoryInterface\n{\n    protected Config $config;\n\n    protected array $resolved = [];\n\n    protected static array $customCreators = [];\n\n    protected const PROVIDERS = [\n        Providers\\Alipay::NAME => Providers\\Alipay::class,\n        Providers\\Azure::NAME => Providers\\Azure::class,\n        Providers\\Coding::NAME => Providers\\Coding::class,\n        Providers\\DingTalk::NAME => Providers\\DingTalk::class,\n        Providers\\DouYin::NAME => Providers\\DouYin::class,\n        Providers\\Douban::NAME => Providers\\Douban::class,\n        Providers\\Facebook::NAME => Providers\\Facebook::class,\n        Providers\\FeiShu::NAME => Providers\\FeiShu::class,\n        Providers\\Figma::NAME => Providers\\Figma::class,\n        Providers\\GitHub::NAME => Providers\\GitHub::class,\n        Providers\\Gitee::NAME => Providers\\Gitee::class,\n        Providers\\Google::NAME => Providers\\Google::class,\n        Providers\\Lark::NAME => Providers\\Lark::class,\n        Providers\\Line::NAME => Providers\\Line::class,\n        Providers\\Linkedin::NAME => Providers\\Linkedin::class,\n        Providers\\OpenWeWork::NAME => Providers\\OpenWeWork::class,\n        Providers\\Outlook::NAME => Providers\\Outlook::class,\n        Providers\\QCloud::NAME => Providers\\QCloud::class,\n        Providers\\QQ::NAME => Providers\\QQ::class,\n        Providers\\Taobao::NAME => Providers\\Taobao::class,\n        Providers\\Tapd::NAME => Providers\\Tapd::class,\n        Providers\\TouTiao::NAME => Providers\\TouTiao::class,\n        Providers\\WeChat::NAME => Providers\\WeChat::class,\n        Providers\\WeWork::NAME => Providers\\WeWork::class,\n        Providers\\Weibo::NAME => Providers\\Weibo::class,\n        Providers\\XiGua::NAME => Providers\\XiGua::class,\n    ];\n\n    #[Pure]\n    public function __construct(array $config)\n    {\n        $this->config = new Config($config);\n    }\n\n    public function config(Config $config): self\n    {\n        $this->config = $config;\n\n        return $this;\n    }\n\n    public function create(string $name): Contracts\\ProviderInterface\n    {\n        $name = \\strtolower($name);\n\n        if (! isset($this->resolved[$name])) {\n            $this->resolved[$name] = $this->createProvider($name);\n        }\n\n        return $this->resolved[$name];\n    }\n\n    public function extend(string $name, Closure $callback): self\n    {\n        self::$customCreators[\\strtolower($name)] = $callback;\n\n        return $this;\n    }\n\n    public function getResolvedProviders(): array\n    {\n        return $this->resolved;\n    }\n\n    public function buildProvider(string $provider, array $config): Contracts\\ProviderInterface\n    {\n        $instance = new $provider($config);\n\n        $instance instanceof Contracts\\ProviderInterface || throw new Exceptions\\InvalidArgumentException(\"The {$provider} must be instanceof ProviderInterface.\");\n\n        return $instance;\n    }\n\n    /**\n     * @throws Exceptions\\InvalidArgumentException\n     */\n    protected function createProvider(string $name): Contracts\\ProviderInterface\n    {\n        $config = $this->config->get($name, []);\n        $provider = $config['provider'] ?? $name;\n\n        if (isset(self::$customCreators[$provider])) {\n            return $this->callCustomCreator($provider, $config);\n        }\n\n        if (! $this->isValidProvider($provider)) {\n            throw new Exceptions\\InvalidArgumentException(\"Provider [{$name}] not supported.\");\n        }\n\n        return $this->buildProvider(self::PROVIDERS[$provider] ?? $provider, $config);\n    }\n\n    protected function callCustomCreator(string $name, array $config): Contracts\\ProviderInterface\n    {\n        return self::$customCreators[$name]($config);\n    }\n\n    protected function isValidProvider(string $provider): bool\n    {\n        return isset(self::PROVIDERS[$provider]) || \\is_subclass_of($provider, Contracts\\ProviderInterface::class);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/Traits/HasAttributes.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite\\Traits;\n\nuse JetBrains\\PhpStorm\\Pure;\nuse Overtrue\\Socialite\\Exceptions;\n\ntrait HasAttributes\n{\n    protected array $attributes = [];\n\n    public function getAttributes(): array\n    {\n        return $this->attributes;\n    }\n\n    public function getAttribute(string $name, mixed $default = null): mixed\n    {\n        return $this->attributes[$name] ?? $default;\n    }\n\n    public function setAttribute(string $name, mixed $value): self\n    {\n        $this->attributes[$name] = $value;\n\n        return $this;\n    }\n\n    public function merge(array $attributes): self\n    {\n        $this->attributes = \\array_merge($this->attributes, $attributes);\n\n        return $this;\n    }\n\n    public function offsetExists(mixed $offset): bool\n    {\n        return \\array_key_exists($offset, $this->attributes);\n    }\n\n    public function offsetGet(mixed $offset): mixed\n    {\n        return $this->getAttribute($offset);\n    }\n\n    public function offsetSet(mixed $offset, mixed $value): void\n    {\n        $this->setAttribute($offset, $value);\n    }\n\n    public function offsetUnset(mixed $offset): void\n    {\n        unset($this->attributes[$offset]);\n    }\n\n    public function __get(string $property): mixed\n    {\n        return $this->getAttribute($property);\n    }\n\n    #[Pure]\n    public function toArray(): array\n    {\n        return $this->getAttributes();\n    }\n\n    public function toJSON(): string\n    {\n        $result = \\json_encode($this->getAttributes(), JSON_UNESCAPED_UNICODE);\n\n        false === $result && throw new Exceptions\\Exception('Cannot Processing this instance as JSON stringify.');\n\n        return $result;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/src/User.php",
    "content": "<?php\n\nnamespace Overtrue\\Socialite;\n\nuse ArrayAccess;\nuse JsonSerializable;\n\nclass User implements ArrayAccess, Contracts\\UserInterface, JsonSerializable\n{\n    use Traits\\HasAttributes;\n\n    public function __construct(array $attributes, protected ?Contracts\\ProviderInterface $provider = null)\n    {\n        $this->attributes = $attributes;\n    }\n\n    public function getId(): mixed\n    {\n        return $this->getAttribute(Contracts\\ABNF_ID) ?? $this->getEmail();\n    }\n\n    public function getNickname(): ?string\n    {\n        return $this->getAttribute(Contracts\\ABNF_NICKNAME) ?? $this->getName();\n    }\n\n    public function getName(): ?string\n    {\n        return $this->getAttribute(Contracts\\ABNF_NAME);\n    }\n\n    public function getEmail(): ?string\n    {\n        return $this->getAttribute(Contracts\\ABNF_EMAIL);\n    }\n\n    public function getAvatar(): ?string\n    {\n        return $this->getAttribute(Contracts\\ABNF_AVATAR);\n    }\n\n    public function setAccessToken(string $value): self\n    {\n        $this->setAttribute(Contracts\\RFC6749_ABNF_ACCESS_TOKEN, $value);\n\n        return $this;\n    }\n\n    public function getAccessToken(): ?string\n    {\n        return $this->getAttribute(Contracts\\RFC6749_ABNF_ACCESS_TOKEN);\n    }\n\n    public function setRefreshToken(?string $value): self\n    {\n        $this->setAttribute(Contracts\\RFC6749_ABNF_REFRESH_TOKEN, $value);\n\n        return $this;\n    }\n\n    public function getRefreshToken(): ?string\n    {\n        return $this->getAttribute(Contracts\\RFC6749_ABNF_REFRESH_TOKEN);\n    }\n\n    public function setExpiresIn(int $value): self\n    {\n        $this->setAttribute(Contracts\\RFC6749_ABNF_EXPIRES_IN, $value);\n\n        return $this;\n    }\n\n    public function getExpiresIn(): ?int\n    {\n        return $this->getAttribute(Contracts\\RFC6749_ABNF_EXPIRES_IN);\n    }\n\n    public function setRaw(array $user): self\n    {\n        $this->setAttribute('raw', $user);\n\n        return $this;\n    }\n\n    public function getRaw(): array\n    {\n        return $this->getAttribute('raw', []);\n    }\n\n    public function setTokenResponse(array $response): self\n    {\n        $this->setAttribute('token_response', $response);\n\n        return $this;\n    }\n\n    public function getTokenResponse(): mixed\n    {\n        return $this->getAttribute('token_response');\n    }\n\n    public function jsonSerialize(): array\n    {\n        return $this->attributes;\n    }\n\n    public function __serialize(): array\n    {\n        return $this->attributes;\n    }\n\n    public function __unserialize(array $serialized): void\n    {\n        $this->attributes = $serialized ?: [];\n    }\n\n    public function getProvider(): Contracts\\ProviderInterface\n    {\n        return $this->provider ?? throw new Exceptions\\Exception('The provider instance doesn\\'t initialized correctly.');\n    }\n\n    public function setProvider(Contracts\\ProviderInterface $provider): self\n    {\n        $this->provider = $provider;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/tests/OAuthTest.php",
    "content": "<?php\n\nuse Mockery as m;\nuse Overtrue\\Socialite\\Providers\\Base;\nuse Overtrue\\Socialite\\User;\nuse PHPUnit\\Framework\\TestCase;\n\nclass OAuthTest extends TestCase\n{\n    public function tearDown(): void\n    {\n        m::close();\n    }\n\n    public function test_it_can_get_auth_url_without_redirect()\n    {\n        $config = [\n            'client_id' => 'fake_client_id',\n            'client_secret' => 'fake_client_secret',\n        ];\n        $provider = new OAuthTestProviderStub($config);\n\n        $this->assertSame('http://auth.url?client_id=fake_client_id&scope=info&response_type=code', $provider->redirect());\n    }\n\n    public function test_it_can_get_auth_url_with_redirect()\n    {\n        // 手动配置\n        $config = [\n            'client_id' => 'fake_client_id',\n            'client_secret' => 'fake_client_secret',\n        ];\n        $provider = new OAuthTestProviderStub($config);\n\n        $this->assertSame('http://auth.url?client_id=fake_client_id&redirect_uri=fake_redirect&scope=info&response_type=code', $provider->redirect('fake_redirect'));\n\n        // 用配置属性配置\n        $config += ['redirect_url' => 'fake_redirect'];\n        $provider = new OAuthTestProviderStub($config);\n\n        $this->assertSame('http://auth.url?client_id=fake_client_id&redirect_uri=fake_redirect&scope=info&response_type=code', $provider->redirect('fake_redirect'));\n    }\n\n    public function test_it_can_get_auth_url_with_scopes()\n    {\n        $config = [\n            'client_id' => 'fake_client_id',\n            'client_secret' => 'fake_client_secret',\n        ];\n        $provider = new OAuthTestProviderStub($config);\n        $url = $provider->scopes(['test_info', 'test_email'])->redirect();\n\n        $this->assertSame('http://auth.url?client_id=fake_client_id&scope=test_info%2Ctest_email&response_type=code', $url);\n\n        // 切换scope分割符\n        $url = $provider->scopes(['test_info', 'test_email'])->withScopeSeparator(' ')->redirect();\n        $this->assertSame('http://auth.url?client_id=fake_client_id&scope=test_info%20test_email&response_type=code', $url);\n    }\n\n    public function test_it_can_get_auth_url_with_state()\n    {\n        $config = [\n            'client_id' => 'fake_client_id',\n            'client_secret' => 'fake_client_secret',\n        ];\n        $provider = new OAuthTestProviderStub($config);\n        $url = $provider->withState(123456)->redirect();\n\n        $this->assertSame('http://auth.url?client_id=fake_client_id&scope=info&response_type=code&state=123456', $url);\n    }\n\n    public function test_it_can_get_token()\n    {\n        $config = [\n            'client_id' => 'fake_client_id',\n            'client_secret' => 'fake_client_secret',\n        ];\n        $provider = new OAuthTestProviderStub($config);\n        $response = m::mock(\\Psr\\Http\\Message\\ResponseInterface::class);\n\n        $response->shouldReceive('getBody')->andReturn($response);\n        $response->shouldReceive('__toString')->andReturn(\\json_encode([\n            'access_token' => 'fake_access_token',\n            'refresh_token' => 'fake_refresh_token',\n            'expires_in' => 123456,\n        ]));\n\n        $provider->getHttpClient()->shouldReceive('post')->with('http://token.url', [\n            'form_params' => [\n                'client_id' => 'fake_client_id',\n                'client_secret' => 'fake_client_secret',\n                'code' => 'fake_code',\n                'redirect_uri' => null,\n            ],\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ])->andReturn($response);\n\n        $this->assertSame([\n            'access_token' => 'fake_access_token',\n            'refresh_token' => 'fake_refresh_token',\n            'expires_in' => 123456,\n        ], $provider->tokenFromCode('fake_code'));\n    }\n\n    public function test_it_can_get_user_by_token()\n    {\n        $config = [\n            'client_id' => 'fake_client_id',\n            'client_secret' => 'fake_client_secret',\n        ];\n        $provider = new OAuthTestProviderStub($config);\n\n        $user = $provider->userFromToken('fake_access_token');\n\n        $this->assertSame('foo', $user->getId());\n        $this->assertSame(['id' => 'foo'], $user->getRaw());\n        $this->assertSame('fake_access_token', $user->getAccessToken());\n    }\n\n    public function test_it_can_get_user_by_code()\n    {\n        $config = [\n            'client_id' => 'fake_client_id',\n            'client_secret' => 'fake_client_secret',\n        ];\n        $provider = new OAuthTestProviderStub($config);\n\n        $response = m::mock(\\Psr\\Http\\Message\\ResponseInterface::class);\n        $response->shouldReceive('getBody')->andReturn($response);\n        $response->shouldReceive('__toString')->andReturn(\\json_encode([\n            'access_token' => 'fake_access_token',\n            'refresh_token' => 'fake_refresh_token',\n            'expires_in' => 123456,\n        ]));\n\n        $provider->getHttpClient()->shouldReceive('post')->with('http://token.url', [\n            'form_params' => [\n                'client_id' => 'fake_client_id',\n                'client_secret' => 'fake_client_secret',\n                'code' => 'fake_code',\n                'redirect_uri' => null,\n            ],\n            'headers' => [\n                'Accept' => 'application/json',\n            ],\n        ])->andReturn($response);\n\n        $this->assertSame([\n            'access_token' => 'fake_access_token',\n            'refresh_token' => 'fake_refresh_token',\n            'expires_in' => 123456,\n        ], $provider->tokenFromCode('fake_code'));\n\n        $user = $provider->userFromCode('fake_code');\n        $tokenResponse = [\n            'access_token' => 'fake_access_token',\n            'refresh_token' => 'fake_refresh_token',\n            'expires_in' => 123456,\n        ];\n\n        $this->assertSame('foo', $user->getId());\n        $this->assertSame($tokenResponse, $user->getTokenResponse());\n        $this->assertSame('fake_access_token', $user->getAccessToken());\n        $this->assertSame('fake_refresh_token', $user->getRefreshToken());\n    }\n}\n\nclass OAuthTestProviderStub extends Base\n{\n    public $http;\n\n    protected array $scopes = ['info'];\n\n    protected int $encodingType = PHP_QUERY_RFC3986;\n\n    protected function getAuthUrl(): string\n    {\n        $url = 'http://auth.url';\n\n        return $this->buildAuthUrlFromBase($url);\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return 'http://token.url';\n    }\n\n    protected function getUserByToken(string $token): array\n    {\n        return ['id' => 'foo'];\n    }\n\n    protected function mapUserToObject(array $user): User\n    {\n        return new User(['id' => $user['id']]);\n    }\n\n    /**\n     * Get a fresh instance of the Guzzle HTTP client.\n     *\n     * @return \\GuzzleHttp\\Client\n     */\n    public function getHttpClient(): GuzzleHttp\\Client\n    {\n        if ($this->http) {\n            return $this->http;\n        }\n\n        return $this->http = m::mock(\\GuzzleHttp\\Client::class);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/tests/Providers/FeiShuTest.php",
    "content": "<?php\n\nnamespace Providers;\n\nuse GuzzleHttp\\Client;\nuse GuzzleHttp\\Handler\\MockHandler;\nuse GuzzleHttp\\HandlerStack;\nuse GuzzleHttp\\Psr7\\Response;\nuse Overtrue\\Socialite\\Exceptions\\FeiShu\\InvalidTicketException;\nuse Overtrue\\Socialite\\Exceptions\\InvalidTokenException;\nuse Overtrue\\Socialite\\Providers\\FeiShu;\nuse PHPUnit\\Framework\\TestCase;\n\nclass FeiShuTest extends TestCase\n{\n    public function testProviderCanCreateCorrect()\n    {\n        // one way\n        $config = [\n            'app_id' => 'xxxxx',\n            'app_secret' => 'yyyyy',\n            'app_mode' => 'internal',\n        ];\n        $f = new FeiShu($config);\n        $rf = new \\ReflectionObject($f);\n\n        $this->assertEquals('xxxxx', $f->getClientId());\n        $this->assertEquals('yyyyy', $f->getClientSecret());\n\n        $rfProperty = $rf->getProperty('isInternalApp');\n        $rfProperty->setAccessible(true);\n        $this->assertEquals(true, $rfProperty->getValue($f));\n\n        // diff filed way\n        $config = [\n            'client_id' => 'xxxxx',\n            'client_secret' => 'yyyyy',\n            'mode' => 'internal',\n        ];\n\n        $f = new FeiShu($config);\n        $rf = new \\ReflectionObject($f);\n\n        $this->assertEquals('xxxxx', $f->getClientId());\n        $this->assertEquals('yyyyy', $f->getClientSecret());\n        $rfProperty = $rf->getProperty('isInternalApp');\n        $rfProperty->setAccessible(true);\n        $this->assertEquals(true, $rfProperty->getValue($f));\n\n        // no mode config way\n        $config = [\n            'client_id' => 'xxxxx',\n            'client_secret' => 'yyyyy',\n        ];\n\n        $f = new FeiShu($config);\n        $rf = new \\ReflectionObject($f);\n\n        $this->assertEquals('xxxxx', $f->getClientId());\n        $this->assertEquals('yyyyy', $f->getClientSecret());\n        $rfProperty = $rf->getProperty('isInternalApp');\n        $rfProperty->setAccessible(true);\n        $this->assertEquals(false, $rfProperty->getValue($f));\n    }\n\n    public function testProviderWithInternalAppModeWork()\n    {\n        $config = [\n            'client_id' => 'xxxxx',\n            'client_secret' => 'yyyyy',\n        ];\n\n        $f = new FeiShu($config);\n        $rf = new \\ReflectionObject($f);\n\n        $rfProperty = $rf->getProperty('isInternalApp');\n        $rfProperty->setAccessible(true);\n\n        $f->withInternalAppMode();\n        $this->assertEquals(true, $rfProperty->getValue($f));\n\n        $f->withDefaultMode();\n        $this->assertEquals(false, $rfProperty->getValue($f));\n    }\n\n    public function testProviderWithAppTicketWork()\n    {\n        $config = [\n            'client_id' => 'xxxxx',\n            'client_secret' => 'yyyyy',\n        ];\n\n        $f = new FeiShu($config);\n        $f->withAppTicket('app_ticket');\n        $this->assertEquals('app_ticket', $f->getConfig()->get('app_ticket'));\n    }\n\n    public function testConfigAppAccessTokenWithDefaultModeNoAppTicketWork()\n    {\n        $config = [\n            'client_id' => 'xxxxx',\n            'client_secret' => 'yyyyy',\n        ];\n\n        $f = new FeiShu($config);\n        $fr = new \\ReflectionObject($f);\n        $frClient = $fr->getProperty('httpClient');\n        $frClient->setAccessible(true);\n        $ff = new \\ReflectionMethod(FeiShu::class, 'configAppAccessToken');\n\n        $mock = new MockHandler([\n            new Response(403, []),\n            new Response(200, [], \\json_encode([\n                'app_access_token' => 'app_access_token',\n            ])),\n        ]);\n\n        $handler = HandlerStack::create($mock);\n        $client = new Client(['handler' => $handler]);\n        $frClient->setValue($f, $client);\n        $ff->setAccessible(true);\n\n        // 默认模式下没有 app_ticket\n        $this->expectException(InvalidTicketException::class);\n        $ff->invoke($f);\n\n        $ff->invoke($f);\n        $f->withAppTicket('app_ticket');\n        $this->assertEquals('app_access_token', $f->getConfig()->get('app_access_token'));\n\n        $this->expectException(InvalidTokenException::class);\n        $ff->invoke($f);\n    }\n\n    public function testConfigAppAccessTokenWithDefaultModeAndAppTicketWorkInBadResponse()\n    {\n        $config = [\n            'client_id' => 'xxxxx',\n            'client_secret' => 'yyyyy',\n        ];\n\n        $f = new FeiShu($config);\n        $fr = new \\ReflectionObject($f);\n        $frClient = $fr->getProperty('httpClient');\n        $frClient->setAccessible(true);\n        $ff = new \\ReflectionMethod(FeiShu::class, 'configAppAccessToken');\n\n        $mock = new MockHandler([\n            new Response(200, [], '{}'),\n        ]);\n\n        $handler = HandlerStack::create($mock);\n        $client = new Client(['handler' => $handler]);\n        $frClient->setValue($f, $client);\n        $ff->setAccessible(true);\n\n        $this->expectException(InvalidTokenException::class);\n        $ff->invoke($f->withAppTicket('app_ticket'));\n    }\n\n    public function testConfigAppAccessTokenWithDefaultModeAndAppTicketWorkInGoodResponse()\n    {\n        $config = [\n            'client_id' => 'xxxxx',\n            'client_secret' => 'yyyyy',\n        ];\n\n        $f = new FeiShu($config);\n        $fr = new \\ReflectionObject($f);\n        $frClient = $fr->getProperty('httpClient');\n        $frClient->setAccessible(true);\n        $ff = new \\ReflectionMethod(FeiShu::class, 'configAppAccessToken');\n\n        $mock = new MockHandler([\n            new Response(200, [], \\json_encode([\n                'app_access_token' => 'app_access_token',\n            ])),\n        ]);\n\n        $handler = HandlerStack::create($mock);\n        $client = new Client(['handler' => $handler]);\n        $frClient->setValue($f, $client);\n        $ff->setAccessible(true);\n\n        $this->assertEquals(null, $f->getConfig()->get('app_access_token'));\n        $ff->invoke($f->withAppTicket('app_ticket'));\n        $this->assertEquals('app_access_token', $f->getConfig()->get('app_access_token'));\n    }\n\n    public function testConfigAppAccessTokenWithInternalInBadResponse()\n    {\n        $config = [\n            'client_id' => 'xxxxx',\n            'client_secret' => 'yyyyy',\n            'mode' => 'internal',\n        ];\n\n        $f = new FeiShu($config);\n        $fr = new \\ReflectionObject($f);\n        $frClient = $fr->getProperty('httpClient');\n        $frClient->setAccessible(true);\n        $ff = new \\ReflectionMethod(FeiShu::class, 'configAppAccessToken');\n\n        $mock = new MockHandler([\n            new Response(200, [], '{}'),\n        ]);\n\n        $handler = HandlerStack::create($mock);\n        $client = new Client(['handler' => $handler]);\n        $frClient->setValue($f, $client);\n        $ff->setAccessible(true);\n\n        $this->expectException(InvalidTokenException::class);\n        $ff->invoke($f);\n    }\n\n    public function testConfigAppAccessTokenWithInternalInGoodResponse()\n    {\n        $config = [\n            'client_id' => 'xxxxx',\n            'client_secret' => 'yyyyy',\n            'mode' => 'internal',\n        ];\n\n        $f = new FeiShu($config);\n        $fr = new \\ReflectionObject($f);\n        $frClient = $fr->getProperty('httpClient');\n        $frClient->setAccessible(true);\n        $ff = new \\ReflectionMethod(FeiShu::class, 'configAppAccessToken');\n\n        $mock = new MockHandler([\n            new Response(200, [], \\json_encode([\n                'app_access_token' => 'app_access_token',\n            ])),\n        ]);\n\n        $handler = HandlerStack::create($mock);\n        $client = new Client(['handler' => $handler]);\n        $frClient->setValue($f, $client);\n        $ff->setAccessible(true);\n\n        $this->assertEquals(null, $f->getConfig()->get('app_access_token'));\n        $ff->invoke($f);\n        $this->assertEquals('app_access_token', $f->getConfig()->get('app_access_token'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/tests/Providers/WeWorkTest.php",
    "content": "<?php\n\nuse Overtrue\\Socialite\\Providers\\WeWork;\nuse PHPUnit\\Framework\\TestCase;\n\nclass WeWorkTest extends TestCase\n{\n    public function testOAuthUrl()\n    {\n        $response = (new WeWork([\n            'client_id' => 'CORPID',\n            'client_secret' => 'client_secret',\n            'redirect' => 'REDIRECT_URI',\n        ]))\n            ->scopes(['snsapi_base'])\n            ->redirect();\n\n        $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);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/tests/Providers/WechatTest.php",
    "content": "<?php\n\nuse Overtrue\\Socialite\\Providers\\WeChat;\nuse PHPUnit\\Framework\\TestCase;\n\n// here we need loaded the symbols first.\n\\class_exists(\\Overtrue\\Socialite\\Contracts\\FactoryInterface::class);\n\nclass WechatTest extends TestCase\n{\n    public function testWeChatProviderHasCorrectlyRedirectResponse()\n    {\n        $response = (new WeChat([\n            'client_id' => 'client_id',\n            'client_secret' => 'client_secret',\n            'redirect_url' => 'http://localhost/socialite/callback.php',\n        ]))->redirect();\n\n        $this->assertStringStartsWith('https://open.weixin.qq.com/connect/qrconnect', $response);\n        $this->assertMatchesRegularExpression('/redirect_uri=http%3A%2F%2Flocalhost%2Fsocialite%2Fcallback.php/', $response);\n    }\n\n    public function testWeChatProviderTokenUrlAndRequestFields()\n    {\n        $provider = new WeChat([\n            'client_id' => 'client_id',\n            'client_secret' => 'client_secret',\n            'redirect_url' => 'http://localhost/socialite/callback.php',\n        ]);\n\n        $getTokenUrl = new ReflectionMethod(WeChat::class, 'getTokenUrl');\n        $getTokenUrl->setAccessible(true);\n\n        $getTokenFields = new ReflectionMethod(WeChat::class, 'getTokenFields');\n        $getTokenFields->setAccessible(true);\n\n        $getCodeFields = new ReflectionMethod(WeChat::class, 'getCodeFields');\n        $getCodeFields->setAccessible(true);\n\n        $this->assertSame('https://api.weixin.qq.com/sns/oauth2/access_token', $getTokenUrl->invoke($provider));\n        $this->assertSame([\n            'appid' => 'client_id',\n            'secret' => 'client_secret',\n            'code' => 'iloveyou',\n            'grant_type' => 'authorization_code',\n        ], $getTokenFields->invoke($provider, 'iloveyou'));\n\n        $this->assertSame([\n            'appid' => 'client_id',\n            'redirect_uri' => 'http://localhost/socialite/callback.php',\n            'response_type' => 'code',\n            'scope' => 'snsapi_login',\n            'state' => 'wechat-state',\n            'connect_redirect' => 1,\n        ], $getCodeFields->invoke($provider->withState('wechat-state')));\n    }\n\n    public function testOpenPlatformComponent()\n    {\n        $provider = new WeChat([\n            'client_id' => 'client_id',\n            'client_secret' => null,\n            'redirect' => 'redirect-url',\n            'component' => [\n                'id' => 'component-app-id',\n                'token' => 'token',\n            ],\n        ]);\n        $getTokenUrl = new ReflectionMethod(WeChat::class, 'getTokenUrl');\n        $getTokenUrl->setAccessible(true);\n\n        $getTokenFields = new ReflectionMethod(WeChat::class, 'getTokenFields');\n        $getTokenFields->setAccessible(true);\n\n        $getCodeFields = new ReflectionMethod(WeChat::class, 'getCodeFields');\n        $getCodeFields->setAccessible(true);\n\n        $this->assertSame([\n            'appid' => 'client_id',\n            'redirect_uri' => 'redirect-url',\n            'response_type' => 'code',\n            'scope' => 'snsapi_base',\n            'state' => 'state',\n            'connect_redirect' => 1,\n            'component_appid' => 'component-app-id',\n        ], $getCodeFields->invoke($provider->withState('state')));\n\n        $this->assertSame([\n            'appid' => 'client_id',\n            'component_appid' => 'component-app-id',\n            'component_access_token' => 'token',\n            'code' => 'simcode',\n            'grant_type' => 'authorization_code',\n        ], $getTokenFields->invoke($provider, 'simcode'));\n\n        $this->assertSame('https://api.weixin.qq.com/sns/oauth2/component/access_token', $getTokenUrl->invoke($provider));\n    }\n\n    public function testOpenPlatformComponentWithCustomParameters()\n    {\n        $provider = new WeChat([\n            'client_id' => 'client_id',\n            'client_secret' => null,\n            'redirect' => 'redirect-url',\n            'component' => [\n                'id' => 'component-app-id',\n                'token' => 'token',\n            ],\n        ]);\n\n        $getCodeFields = new ReflectionMethod(WeChat::class, 'getCodeFields');\n        $getCodeFields->setAccessible(true);\n\n        $provider->with(['foo' => 'bar']);\n\n        $fields = $getCodeFields->invoke($provider->withState('wechat-state'));\n        $this->assertArrayHasKey('foo', $fields);\n        $this->assertSame('bar', $fields['foo']);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/tests/SocialiteManagerTest.php",
    "content": "<?php\n\nuse Overtrue\\Socialite\\Providers\\Base;\nuse Overtrue\\Socialite\\Providers\\GitHub;\nuse Overtrue\\Socialite\\SocialiteManager;\nuse Overtrue\\Socialite\\User;\nuse PHPUnit\\Framework\\TestCase;\n\nclass SocialiteManagerTest extends TestCase\n{\n    public function test_it_can_create_from_config()\n    {\n        $config = [\n            'foo' => [\n                'provider' => 'github',\n                'client_id' => 'foo-app-id',\n                'client_secret' => 'your-app-secret',\n                'redirect' => 'http://localhost/socialite/callback.php',\n            ],\n            'bar' => [\n                'provider' => 'github',\n                'client_id' => 'bar-app-id',\n                'client_secret' => 'your-app-secret',\n                'redirect' => 'http://localhost/socialite/callback.php',\n            ],\n        ];\n\n        $manager = new SocialiteManager($config);\n\n        $this->assertInstanceOf(GitHub::class, $manager->create('foo'));\n        $this->assertSame('foo-app-id', $manager->create('foo')->getClientId());\n\n        $this->assertInstanceOf(GitHub::class, $manager->create('bar'));\n        $this->assertSame('bar-app-id', $manager->create('bar')->getClientId());\n\n        // from name\n        $config = [\n            'github' => [\n                'client_id' => 'your-app-id',\n                'client_secret' => 'your-app-secret',\n                'redirect' => 'http://localhost/socialite/callback.php',\n            ],\n        ];\n\n        $manager = new SocialiteManager($config);\n\n        $this->assertInstanceOf(GitHub::class, $manager->create('github'));\n        $this->assertSame('your-app-id', $manager->create('github')->getClientId());\n    }\n\n    public function test_it_can_create_from_custom_creator()\n    {\n        $config = [\n            'foo' => [\n                'provider' => 'myprovider',\n                'client_id' => 'your-app-id',\n                'client_secret' => 'your-app-secret',\n                'redirect' => 'http://localhost/socialite/callback.php',\n            ],\n        ];\n\n        $manager = new SocialiteManager($config);\n\n        $manager->extend('myprovider', function ($config) {\n            return new DummyProviderForCustomProviderTest($config);\n        });\n\n        $this->assertInstanceOf(DummyProviderForCustomProviderTest::class, $manager->create('foo'));\n    }\n\n    public function test_it_can_create_from_custom_provider_class()\n    {\n        $config = [\n            'foo' => [\n                'provider' => DummyProviderForCustomProviderTest::class,\n                'client_id' => 'your-app-id',\n                'client_secret' => 'your-app-secret',\n                'redirect' => 'http://localhost/socialite/callback.php',\n            ],\n        ];\n\n        $manager = new SocialiteManager($config);\n\n        $this->assertInstanceOf(DummyProviderForCustomProviderTest::class, $manager->create('foo'));\n    }\n}\n\nclass DummyProviderForCustomProviderTest extends Base\n{\n    protected function getAuthUrl(): string\n    {\n        return '';\n    }\n\n    protected function getTokenUrl(): string\n    {\n        return '';\n    }\n\n    protected function getUserByToken(string $token): array\n    {\n        return [];\n    }\n\n    protected function mapUserToObject(array $user): User\n    {\n        return new User([]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/overtrue/socialite/tests/UserTest.php",
    "content": "<?php\n\nuse Overtrue\\Socialite\\User;\nuse PHPUnit\\Framework\\TestCase;\n\nclass UserTest extends TestCase\n{\n    public function testJsonserialize()\n    {\n        $this->assertSame('[]', json_encode(new User([])));\n        $this->assertSame('{\"access_token\":\"mock-token\"}', json_encode(new User(['access_token' => 'mock-token'])));\n    }\n\n    public function test_it_can_get_refresh_token()\n    {\n        $user = new User([\n            'name' => 'fake_name',\n            'access_token' => 'mock-token',\n            'refresh_token' => 'fake_refresh',\n        ]);\n\n        // 能通过用 User 对象获取 refresh token\n        $this->assertSame('fake_refresh', $user->getRefreshToken());\n        $this->assertSame('{\"name\":\"fake_name\",\"access_token\":\"mock-token\",\"refresh_token\":\"fake_refresh\"}', json_encode($user));\n\n        // 无 refresh_token 属性返回 null\n        $user = new User([]);\n        $this->assertSame(null, $user->getRefreshToken());\n        // 能通过 setRefreshToken() 设置\n        $user->setRefreshToken('fake_refreshToken');\n        $this->assertSame('fake_refreshToken', $user->getRefreshToken());\n        $this->assertSame('{\"refresh_token\":\"fake_refreshToken\"}', json_encode($user));\n    }\n\n    public function test_it_can_set_raw_data()\n    {\n        $user = new User([]);\n        $data = ['data' => 'raw'];\n\n        $user->setRaw($data);\n        $this->assertSame($data, $user->getRaw());\n        $this->assertSame(json_encode(['raw' => ['data' => 'raw']]), json_encode($user));\n    }\n\n    public function test_ie_can_get_attribute_by_magic_method()\n    {\n        $user = new User(['xx' => 'data']);\n\n        $this->assertSame('data', $user->xx);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/.github/workflows/tests.yml",
    "content": "name: \"Tests\"\n\non:\n  - pull_request\n  - push\n\njobs:\n  test:\n    name: PHP ${{ matrix.php }} - ${{ matrix.dependencies }}\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        php:\n          - \"7.2\"\n          - \"7.3\"\n          - \"7.4\"\n          - \"8.0\"\n          - \"8.1\"\n        dependencies:\n          - \"psr/container:^1.1\"\n          - \"psr/container:^2.0\"\n\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v2\n\n      - name: Setup PHP ${{ matrix.php }}\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: ${{ matrix.php }}\n          ini-values: display_errors=off, log_errors=on\n          extensions: :xdebug\n        env:\n          # https://github.com/shivammathur/setup-php/issues/407#issuecomment-773675741\n          fail-fast: true\n\n      - name: Validate composer.json\n        run: composer validate --strict --no-check-lock\n\n      - name: Install dependencies +${{ matrix.dependencies }}\n        run: |\n          composer require --no-update ${{ matrix.dependencies }}\n          composer update --prefer-dist --no-progress\n\n      - name: Run PHPUnit tests\n        run: vendor/bin/simple-phpunit --verbose\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/.gitignore",
    "content": "phpunit.xml\n.phpunit.result.cache\ncomposer.lock\n/vendor/\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/.php_cs.dist",
    "content": "<?php\n\nreturn PhpCsFixer\\Config::create()\n    ->setRules([\n        '@Symfony' => true,\n        '@Symfony:risky' => true,\n        '@PHPUnit75Migration:risky' => true,\n        'php_unit_dedicate_assert' => true,\n        'array_syntax' => ['syntax' => 'short'],\n        'php_unit_fqcn_annotation' => true,\n        'no_unreachable_default_argument_value' => false,\n        'braces' => ['allow_single_line_closure' => true],\n        'heredoc_to_nowdoc' => false,\n        'ordered_imports' => true,\n        'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'],\n        'native_function_invocation' => ['include' => ['@compiler_optimized'], 'scope' => 'all'],\n    ])\n    ->setRiskyAllowed(true)\n    ->setFinder(PhpCsFixer\\Finder::create()->in(__DIR__.'/src'))\n;\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/CHANGELOG",
    "content": "* 3.4.0 (2021-03-06)\n\n * Implement version 1.1 of PSR-11\n\n* 3.3.1 (2020-11-24)\n\n * Add support for PHP 8\n\n* 3.3.0 (2020-03-03)\n\n * Drop PHP extension\n * Bump min PHP version to 7.2.5\n\n* 3.2.3 (2018-01-21)\n\n * prefixed all function calls with \\ for extra speed\n\n* 3.2.2 (2017-07-23)\n\n * reverted extending a protected closure throws an exception (deprecated it instead)\n\n* 3.2.1 (2017-07-17)\n\n * fixed PHP error\n\n* 3.2.0 (2017-07-17)\n\n * added a PSR-11 service locator\n * added a PSR-11 wrapper\n * added ServiceIterator\n * fixed extending a protected closure (now throws InvalidServiceIdentifierException)\n\n* 3.1.0 (2017-07-03)\n\n * deprecated the C extension\n * added support for PSR-11 exceptions\n\n* 3.0.2 (2015-09-11)\n\n * refactored the C extension\n * minor non-significant changes\n\n* 3.0.1 (2015-07-30)\n\n * simplified some code\n * fixed a segfault in the C extension\n\n* 3.0.0 (2014-07-24)\n\n * removed the Pimple class alias (use Pimple\\Container instead)\n\n* 2.1.1 (2014-07-24)\n\n * fixed compiler warnings for the C extension\n * fixed code when dealing with circular references\n\n* 2.1.0 (2014-06-24)\n\n * moved the Pimple to Pimple\\Container (with a BC layer -- Pimple is now a\n   deprecated alias which will be removed in Pimple 3.0)\n * added Pimple\\ServiceProviderInterface (and Pimple::register())\n\n* 2.0.0 (2014-02-10)\n\n * changed extend to automatically re-assign the extended service and keep it as shared or factory\n   (to keep BC, extend still returns the extended service)\n * changed services to be shared by default (use factory() for factory\n   services)\n\n* 1.0.0\n\n * initial version\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/LICENSE",
    "content": "Copyright (c) 2009-2020 Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/README.rst",
    "content": "Pimple\n======\n\n.. caution::\n\n    Pimple is now closed for changes. No new features will be added and no\n    cosmetic changes will be accepted either. The only accepted changes are\n    compatibility with newer PHP versions and security issue fixes.\n\n.. caution::\n\n    This is the documentation for Pimple 3.x. If you are using Pimple 1.x, read\n    the `Pimple 1.x documentation`_. Reading the Pimple 1.x code is also a good\n    way to learn more about how to create a simple Dependency Injection\n    Container (recent versions of Pimple are more focused on performance).\n\nPimple is a small Dependency Injection Container for PHP.\n\nInstallation\n------------\n\nBefore using Pimple in your project, add it to your ``composer.json`` file:\n\n.. code-block:: bash\n\n    $ ./composer.phar require pimple/pimple \"^3.0\"\n\nUsage\n-----\n\nCreating a container is a matter of creating a ``Container`` instance:\n\n.. code-block:: php\n\n    use Pimple\\Container;\n\n    $container = new Container();\n\nAs many other dependency injection containers, Pimple manages two different\nkind of data: **services** and **parameters**.\n\nDefining Services\n~~~~~~~~~~~~~~~~~\n\nA service is an object that does something as part of a larger system. Examples\nof services: a database connection, a templating engine, or a mailer. Almost\nany **global** object can be a service.\n\nServices are defined by **anonymous functions** that return an instance of an\nobject:\n\n.. code-block:: php\n\n    // define some services\n    $container['session_storage'] = function ($c) {\n        return new SessionStorage('SESSION_ID');\n    };\n\n    $container['session'] = function ($c) {\n        return new Session($c['session_storage']);\n    };\n\nNotice that the anonymous function has access to the current container\ninstance, allowing references to other services or parameters.\n\nAs objects are only created when you get them, the order of the definitions\ndoes not matter.\n\nUsing the defined services is also very easy:\n\n.. code-block:: php\n\n    // get the session object\n    $session = $container['session'];\n\n    // the above call is roughly equivalent to the following code:\n    // $storage = new SessionStorage('SESSION_ID');\n    // $session = new Session($storage);\n\nDefining Factory Services\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBy default, each time you get a service, Pimple returns the **same instance**\nof it. If you want a different instance to be returned for all calls, wrap your\nanonymous function with the ``factory()`` method\n\n.. code-block:: php\n\n    $container['session'] = $container->factory(function ($c) {\n        return new Session($c['session_storage']);\n    });\n\nNow, each call to ``$container['session']`` returns a new instance of the\nsession.\n\nDefining Parameters\n~~~~~~~~~~~~~~~~~~~\n\nDefining a parameter allows to ease the configuration of your container from\nthe outside and to store global values:\n\n.. code-block:: php\n\n    // define some parameters\n    $container['cookie_name'] = 'SESSION_ID';\n    $container['session_storage_class'] = 'SessionStorage';\n\nIf you change the ``session_storage`` service definition like below:\n\n.. code-block:: php\n\n    $container['session_storage'] = function ($c) {\n        return new $c['session_storage_class']($c['cookie_name']);\n    };\n\nYou can now easily change the cookie name by overriding the\n``cookie_name`` parameter instead of redefining the service\ndefinition.\n\nProtecting Parameters\n~~~~~~~~~~~~~~~~~~~~~\n\nBecause Pimple sees anonymous functions as service definitions, you need to\nwrap anonymous functions with the ``protect()`` method to store them as\nparameters:\n\n.. code-block:: php\n\n    $container['random_func'] = $container->protect(function () {\n        return rand();\n    });\n\nModifying Services after Definition\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn some cases you may want to modify a service definition after it has been\ndefined. You can use the ``extend()`` method to define additional code to be\nrun on your service just after it is created:\n\n.. code-block:: php\n\n    $container['session_storage'] = function ($c) {\n        return new $c['session_storage_class']($c['cookie_name']);\n    };\n\n    $container->extend('session_storage', function ($storage, $c) {\n        $storage->...();\n\n        return $storage;\n    });\n\nThe first argument is the name of the service to extend, the second a function\nthat gets access to the object instance and the container.\n\nExtending a Container\n~~~~~~~~~~~~~~~~~~~~~\n\nIf you use the same libraries over and over, you might want to reuse some\nservices from one project to the next one; package your services into a\n**provider** by implementing ``Pimple\\ServiceProviderInterface``:\n\n.. code-block:: php\n\n    use Pimple\\Container;\n\n    class FooProvider implements Pimple\\ServiceProviderInterface\n    {\n        public function register(Container $pimple)\n        {\n            // register some services and parameters\n            // on $pimple\n        }\n    }\n\nThen, register the provider on a Container:\n\n.. code-block:: php\n\n    $pimple->register(new FooProvider());\n\nFetching the Service Creation Function\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWhen you access an object, Pimple automatically calls the anonymous function\nthat you defined, which creates the service object for you. If you want to get\nraw access to this function, you can use the ``raw()`` method:\n\n.. code-block:: php\n\n    $container['session'] = function ($c) {\n        return new Session($c['session_storage']);\n    };\n\n    $sessionFunction = $container->raw('session');\n\nPSR-11 compatibility\n--------------------\n\nFor historical reasons, the ``Container`` class does not implement the PSR-11\n``ContainerInterface``. However, Pimple provides a helper class that will let\nyou decouple your code from the Pimple container class.\n\nThe PSR-11 container class\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``Pimple\\Psr11\\Container`` class lets you access the content of an\nunderlying Pimple container using ``Psr\\Container\\ContainerInterface``\nmethods:\n\n.. code-block:: php\n\n    use Pimple\\Container;\n    use Pimple\\Psr11\\Container as PsrContainer;\n\n    $container = new Container();\n    $container['service'] = function ($c) {\n        return new Service();\n    };\n    $psr11 = new PsrContainer($container);\n\n    $controller = function (PsrContainer $container) {\n        $service = $container->get('service');\n    };\n    $controller($psr11);\n\nUsing the PSR-11 ServiceLocator\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSometimes, a service needs access to several other services without being sure\nthat all of them will actually be used. In those cases, you may want the\ninstantiation of the services to be lazy.\n\nThe traditional solution is to inject the entire service container to get only\nthe services really needed. However, this is not recommended because it gives\nservices a too broad access to the rest of the application and it hides their\nactual dependencies.\n\nThe ``ServiceLocator`` is intended to solve this problem by giving access to a\nset of predefined services while instantiating them only when actually needed.\n\nIt also allows you to make your services available under a different name than\nthe one used to register them. For instance, you may want to use an object\nthat expects an instance of ``EventDispatcherInterface`` to be available under\nthe name ``event_dispatcher`` while your event dispatcher has been\nregistered under the name ``dispatcher``:\n\n.. code-block:: php\n\n    use Monolog\\Logger;\n    use Pimple\\Psr11\\ServiceLocator;\n    use Psr\\Container\\ContainerInterface;\n    use Symfony\\Component\\EventDispatcher\\EventDispatcher;\n\n    class MyService\n    {\n        /**\n         * \"logger\" must be an instance of Psr\\Log\\LoggerInterface\n         * \"event_dispatcher\" must be an instance of Symfony\\Component\\EventDispatcher\\EventDispatcherInterface\n         */\n        private $services;\n\n        public function __construct(ContainerInterface $services)\n        {\n            $this->services = $services;\n        }\n    }\n\n    $container['logger'] = function ($c) {\n        return new Monolog\\Logger();\n    };\n    $container['dispatcher'] = function () {\n        return new EventDispatcher();\n    };\n\n    $container['service'] = function ($c) {\n        $locator = new ServiceLocator($c, array('logger', 'event_dispatcher' => 'dispatcher'));\n\n        return new MyService($locator);\n    };\n\nReferencing a Collection of Services Lazily\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nPassing a collection of services instances in an array may prove inefficient\nif the class that consumes the collection only needs to iterate over it at a\nlater stage, when one of its method is called. It can also lead to problems\nif there is a circular dependency between one of the services stored in the\ncollection and the class that consumes it.\n\nThe ``ServiceIterator`` class helps you solve these issues. It receives a\nlist of service names during instantiation and will retrieve the services\nwhen iterated over:\n\n.. code-block:: php\n\n    use Pimple\\Container;\n    use Pimple\\ServiceIterator;\n\n    class AuthorizationService\n    {\n        private $voters;\n\n        public function __construct($voters)\n        {\n            $this->voters = $voters;\n        }\n\n        public function canAccess($resource)\n        {\n            foreach ($this->voters as $voter) {\n                if (true === $voter->canAccess($resource)) {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n    }\n\n    $container = new Container();\n\n    $container['voter1'] = function ($c) {\n        return new SomeVoter();\n    }\n    $container['voter2'] = function ($c) {\n        return new SomeOtherVoter($c['auth']);\n    }\n    $container['auth'] = function ($c) {\n        return new AuthorizationService(new ServiceIterator($c, array('voter1', 'voter2'));\n    }\n\n.. _Pimple 1.x documentation: https://github.com/silexphp/Pimple/tree/1.1\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/composer.json",
    "content": "{\n    \"name\": \"pimple/pimple\",\n    \"type\": \"library\",\n    \"description\": \"Pimple, a simple Dependency Injection Container\",\n    \"keywords\": [\"dependency injection\", \"container\"],\n    \"homepage\": \"https://pimple.symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Fabien Potencier\",\n            \"email\": \"fabien@symfony.com\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.2.5\",\n        \"psr/container\": \"^1.1 || ^2.0\"\n    },\n    \"require-dev\": {\n        \"symfony/phpunit-bridge\": \"^5.4@dev\"\n    },\n    \"autoload\": {\n        \"psr-0\": { \"Pimple\": \"src/\" }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"3.4.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/phpunit.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"http://schema.phpunit.de/4.1/phpunit.xsd\"\n         backupGlobals=\"false\"\n         colors=\"true\"\n         bootstrap=\"vendor/autoload.php\"\n>\n    <testsuites>\n        <testsuite name=\"Pimple Test Suite\">\n            <directory>./src/Pimple/Tests</directory>\n        </testsuite>\n    </testsuites>\n\n    <listeners>\n        <listener class=\"Symfony\\Bridge\\PhpUnit\\SymfonyTestsListener\" />\n    </listeners>\n</phpunit>\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Container.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple;\n\nuse Pimple\\Exception\\ExpectedInvokableException;\nuse Pimple\\Exception\\FrozenServiceException;\nuse Pimple\\Exception\\InvalidServiceIdentifierException;\nuse Pimple\\Exception\\UnknownIdentifierException;\n\n/**\n * Container main class.\n *\n * @author Fabien Potencier\n */\nclass Container implements \\ArrayAccess\n{\n    private $values = [];\n    private $factories;\n    private $protected;\n    private $frozen = [];\n    private $raw = [];\n    private $keys = [];\n\n    /**\n     * Instantiates the container.\n     *\n     * Objects and parameters can be passed as argument to the constructor.\n     *\n     * @param array $values The parameters or objects\n     */\n    public function __construct(array $values = [])\n    {\n        $this->factories = new \\SplObjectStorage();\n        $this->protected = new \\SplObjectStorage();\n\n        foreach ($values as $key => $value) {\n            $this->offsetSet($key, $value);\n        }\n    }\n\n    /**\n     * Sets a parameter or an object.\n     *\n     * Objects must be defined as Closures.\n     *\n     * Allowing any PHP callable leads to difficult to debug problems\n     * as function names (strings) are callable (creating a function with\n     * the same name as an existing parameter would break your container).\n     *\n     * @param string $id    The unique identifier for the parameter or object\n     * @param mixed  $value The value of the parameter or a closure to define an object\n     *\n     * @return void\n     *\n     * @throws FrozenServiceException Prevent override of a frozen service\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetSet($id, $value)\n    {\n        if (isset($this->frozen[$id])) {\n            throw new FrozenServiceException($id);\n        }\n\n        $this->values[$id] = $value;\n        $this->keys[$id] = true;\n    }\n\n    /**\n     * Gets a parameter or an object.\n     *\n     * @param string $id The unique identifier for the parameter or object\n     *\n     * @return mixed The value of the parameter or an object\n     *\n     * @throws UnknownIdentifierException If the identifier is not defined\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetGet($id)\n    {\n        if (!isset($this->keys[$id])) {\n            throw new UnknownIdentifierException($id);\n        }\n\n        if (\n            isset($this->raw[$id])\n            || !\\is_object($this->values[$id])\n            || isset($this->protected[$this->values[$id]])\n            || !\\method_exists($this->values[$id], '__invoke')\n        ) {\n            return $this->values[$id];\n        }\n\n        if (isset($this->factories[$this->values[$id]])) {\n            return $this->values[$id]($this);\n        }\n\n        $raw = $this->values[$id];\n        $val = $this->values[$id] = $raw($this);\n        $this->raw[$id] = $raw;\n\n        $this->frozen[$id] = true;\n\n        return $val;\n    }\n\n    /**\n     * Checks if a parameter or an object is set.\n     *\n     * @param string $id The unique identifier for the parameter or object\n     *\n     * @return bool\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetExists($id)\n    {\n        return isset($this->keys[$id]);\n    }\n\n    /**\n     * Unsets a parameter or an object.\n     *\n     * @param string $id The unique identifier for the parameter or object\n     *\n     * @return void\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetUnset($id)\n    {\n        if (isset($this->keys[$id])) {\n            if (\\is_object($this->values[$id])) {\n                unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]);\n            }\n\n            unset($this->values[$id], $this->frozen[$id], $this->raw[$id], $this->keys[$id]);\n        }\n    }\n\n    /**\n     * Marks a callable as being a factory service.\n     *\n     * @param callable $callable A service definition to be used as a factory\n     *\n     * @return callable The passed callable\n     *\n     * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object\n     */\n    public function factory($callable)\n    {\n        if (!\\is_object($callable) || !\\method_exists($callable, '__invoke')) {\n            throw new ExpectedInvokableException('Service definition is not a Closure or invokable object.');\n        }\n\n        $this->factories->attach($callable);\n\n        return $callable;\n    }\n\n    /**\n     * Protects a callable from being interpreted as a service.\n     *\n     * This is useful when you want to store a callable as a parameter.\n     *\n     * @param callable $callable A callable to protect from being evaluated\n     *\n     * @return callable The passed callable\n     *\n     * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object\n     */\n    public function protect($callable)\n    {\n        if (!\\is_object($callable) || !\\method_exists($callable, '__invoke')) {\n            throw new ExpectedInvokableException('Callable is not a Closure or invokable object.');\n        }\n\n        $this->protected->attach($callable);\n\n        return $callable;\n    }\n\n    /**\n     * Gets a parameter or the closure defining an object.\n     *\n     * @param string $id The unique identifier for the parameter or object\n     *\n     * @return mixed The value of the parameter or the closure defining an object\n     *\n     * @throws UnknownIdentifierException If the identifier is not defined\n     */\n    public function raw($id)\n    {\n        if (!isset($this->keys[$id])) {\n            throw new UnknownIdentifierException($id);\n        }\n\n        if (isset($this->raw[$id])) {\n            return $this->raw[$id];\n        }\n\n        return $this->values[$id];\n    }\n\n    /**\n     * Extends an object definition.\n     *\n     * Useful when you want to extend an existing object definition,\n     * without necessarily loading that object.\n     *\n     * @param string   $id       The unique identifier for the object\n     * @param callable $callable A service definition to extend the original\n     *\n     * @return callable The wrapped callable\n     *\n     * @throws UnknownIdentifierException        If the identifier is not defined\n     * @throws FrozenServiceException            If the service is frozen\n     * @throws InvalidServiceIdentifierException If the identifier belongs to a parameter\n     * @throws ExpectedInvokableException        If the extension callable is not a closure or an invokable object\n     */\n    public function extend($id, $callable)\n    {\n        if (!isset($this->keys[$id])) {\n            throw new UnknownIdentifierException($id);\n        }\n\n        if (isset($this->frozen[$id])) {\n            throw new FrozenServiceException($id);\n        }\n\n        if (!\\is_object($this->values[$id]) || !\\method_exists($this->values[$id], '__invoke')) {\n            throw new InvalidServiceIdentifierException($id);\n        }\n\n        if (isset($this->protected[$this->values[$id]])) {\n            @\\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);\n        }\n\n        if (!\\is_object($callable) || !\\method_exists($callable, '__invoke')) {\n            throw new ExpectedInvokableException('Extension service definition is not a Closure or invokable object.');\n        }\n\n        $factory = $this->values[$id];\n\n        $extended = function ($c) use ($callable, $factory) {\n            return $callable($factory($c), $c);\n        };\n\n        if (isset($this->factories[$factory])) {\n            $this->factories->detach($factory);\n            $this->factories->attach($extended);\n        }\n\n        return $this[$id] = $extended;\n    }\n\n    /**\n     * Returns all defined value names.\n     *\n     * @return array An array of value names\n     */\n    public function keys()\n    {\n        return \\array_keys($this->values);\n    }\n\n    /**\n     * Registers a service provider.\n     *\n     * @param array $values An array of values that customizes the provider\n     *\n     * @return static\n     */\n    public function register(ServiceProviderInterface $provider, array $values = [])\n    {\n        $provider->register($this);\n\n        foreach ($values as $key => $value) {\n            $this[$key] = $value;\n        }\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Exception;\n\nuse Psr\\Container\\ContainerExceptionInterface;\n\n/**\n * A closure or invokable object was expected.\n *\n * @author Pascal Luna <skalpa@zetareticuli.org>\n */\nclass ExpectedInvokableException extends \\InvalidArgumentException implements ContainerExceptionInterface\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Exception;\n\nuse Psr\\Container\\ContainerExceptionInterface;\n\n/**\n * An attempt to modify a frozen service was made.\n *\n * @author Pascal Luna <skalpa@zetareticuli.org>\n */\nclass FrozenServiceException extends \\RuntimeException implements ContainerExceptionInterface\n{\n    /**\n     * @param string $id Identifier of the frozen service\n     */\n    public function __construct($id)\n    {\n        parent::__construct(\\sprintf('Cannot override frozen service \"%s\".', $id));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Exception;\n\nuse Psr\\Container\\NotFoundExceptionInterface;\n\n/**\n * An attempt to perform an operation that requires a service identifier was made.\n *\n * @author Pascal Luna <skalpa@zetareticuli.org>\n */\nclass InvalidServiceIdentifierException extends \\InvalidArgumentException implements NotFoundExceptionInterface\n{\n    /**\n     * @param string $id The invalid identifier\n     */\n    public function __construct($id)\n    {\n        parent::__construct(\\sprintf('Identifier \"%s\" does not contain an object definition.', $id));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Exception;\n\nuse Psr\\Container\\NotFoundExceptionInterface;\n\n/**\n * The identifier of a valid service or parameter was expected.\n *\n * @author Pascal Luna <skalpa@zetareticuli.org>\n */\nclass UnknownIdentifierException extends \\InvalidArgumentException implements NotFoundExceptionInterface\n{\n    /**\n     * @param string $id The unknown identifier\n     */\n    public function __construct($id)\n    {\n        parent::__construct(\\sprintf('Identifier \"%s\" is not defined.', $id));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Psr11/Container.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009-2017 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Psr11;\n\nuse Pimple\\Container as PimpleContainer;\nuse Psr\\Container\\ContainerInterface;\n\n/**\n * PSR-11 compliant wrapper.\n *\n * @author Pascal Luna <skalpa@zetareticuli.org>\n */\nfinal class Container implements ContainerInterface\n{\n    private $pimple;\n\n    public function __construct(PimpleContainer $pimple)\n    {\n        $this->pimple = $pimple;\n    }\n\n    public function get(string $id)\n    {\n        return $this->pimple[$id];\n    }\n\n    public function has(string $id): bool\n    {\n        return isset($this->pimple[$id]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Psr11;\n\nuse Pimple\\Container as PimpleContainer;\nuse Pimple\\Exception\\UnknownIdentifierException;\nuse Psr\\Container\\ContainerInterface;\n\n/**\n * Pimple PSR-11 service locator.\n *\n * @author Pascal Luna <skalpa@zetareticuli.org>\n */\nclass ServiceLocator implements ContainerInterface\n{\n    private $container;\n    private $aliases = [];\n\n    /**\n     * @param PimpleContainer $container The Container instance used to locate services\n     * @param array           $ids       Array of service ids that can be located. String keys can be used to define aliases\n     */\n    public function __construct(PimpleContainer $container, array $ids)\n    {\n        $this->container = $container;\n\n        foreach ($ids as $key => $id) {\n            $this->aliases[\\is_int($key) ? $id : $key] = $id;\n        }\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function get(string $id)\n    {\n        if (!isset($this->aliases[$id])) {\n            throw new UnknownIdentifierException($id);\n        }\n\n        return $this->container[$this->aliases[$id]];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function has(string $id): bool\n    {\n        return isset($this->aliases[$id]) && isset($this->container[$this->aliases[$id]]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/ServiceIterator.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple;\n\n/**\n * Lazy service iterator.\n *\n * @author Pascal Luna <skalpa@zetareticuli.org>\n */\nfinal class ServiceIterator implements \\Iterator\n{\n    private $container;\n    private $ids;\n\n    public function __construct(Container $container, array $ids)\n    {\n        $this->container = $container;\n        $this->ids = $ids;\n    }\n\n    /**\n     * @return void\n     */\n    #[\\ReturnTypeWillChange]\n    public function rewind()\n    {\n        \\reset($this->ids);\n    }\n\n    /**\n     * @return mixed\n     */\n    #[\\ReturnTypeWillChange]\n    public function current()\n    {\n        return $this->container[\\current($this->ids)];\n    }\n\n    /**\n     * @return mixed\n     */\n    #[\\ReturnTypeWillChange]\n    public function key()\n    {\n        return \\current($this->ids);\n    }\n\n    /**\n     * @return void\n     */\n    #[\\ReturnTypeWillChange]\n    public function next()\n    {\n        \\next($this->ids);\n    }\n\n    /**\n     * @return bool\n     */\n    #[\\ReturnTypeWillChange]\n    public function valid()\n    {\n        return null !== \\key($this->ids);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple;\n\n/**\n * Pimple service provider interface.\n *\n * @author  Fabien Potencier\n * @author  Dominik Zogg\n */\ninterface ServiceProviderInterface\n{\n    /**\n     * Registers services on the given container.\n     *\n     * This method should only be used to configure services and parameters.\n     * It should not get services.\n     */\n    public function register(Container $pimple);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Tests\\Fixtures;\n\nclass Invokable\n{\n    public function __invoke($value = null)\n    {\n        $service = new Service();\n        $service->value = $value;\n\n        return $service;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Tests\\Fixtures;\n\nclass NonInvokable\n{\n    public function __call($a, $b)\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Tests\\Fixtures;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass PimpleServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * Registers services on the given container.\n     *\n     * This method should only be used to configure services and parameters.\n     * It should not get services.\n     */\n    public function register(Container $pimple)\n    {\n        $pimple['param'] = 'value';\n\n        $pimple['service'] = function () {\n            return new Service();\n        };\n\n        $pimple['factory'] = $pimple->factory(function () {\n            return new Service();\n        });\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Tests\\Fixtures;\n\n/**\n * @author  Igor Wiedler <igor@wiedler.ch>\n */\nclass Service\n{\n    public $value;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Tests;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Pimple\\Container;\n\n/**\n * @author Dominik Zogg <dominik.zogg@gmail.com>\n */\nclass PimpleServiceProviderInterfaceTest extends TestCase\n{\n    public function testProvider()\n    {\n        $pimple = new Container();\n\n        $pimpleServiceProvider = new Fixtures\\PimpleServiceProvider();\n        $pimpleServiceProvider->register($pimple);\n\n        $this->assertEquals('value', $pimple['param']);\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $pimple['service']);\n\n        $serviceOne = $pimple['factory'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceOne);\n\n        $serviceTwo = $pimple['factory'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceTwo);\n\n        $this->assertNotSame($serviceOne, $serviceTwo);\n    }\n\n    public function testProviderWithRegisterMethod()\n    {\n        $pimple = new Container();\n\n        $pimple->register(new Fixtures\\PimpleServiceProvider(), [\n            'anotherParameter' => 'anotherValue',\n        ]);\n\n        $this->assertEquals('value', $pimple['param']);\n        $this->assertEquals('anotherValue', $pimple['anotherParameter']);\n\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $pimple['service']);\n\n        $serviceOne = $pimple['factory'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceOne);\n\n        $serviceTwo = $pimple['factory'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceTwo);\n\n        $this->assertNotSame($serviceOne, $serviceTwo);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Tests;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Pimple\\Container;\n\n/**\n * @author Igor Wiedler <igor@wiedler.ch>\n */\nclass PimpleTest extends TestCase\n{\n    public function testWithString()\n    {\n        $pimple = new Container();\n        $pimple['param'] = 'value';\n\n        $this->assertEquals('value', $pimple['param']);\n    }\n\n    public function testWithClosure()\n    {\n        $pimple = new Container();\n        $pimple['service'] = function () {\n            return new Fixtures\\Service();\n        };\n\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $pimple['service']);\n    }\n\n    public function testServicesShouldBeDifferent()\n    {\n        $pimple = new Container();\n        $pimple['service'] = $pimple->factory(function () {\n            return new Fixtures\\Service();\n        });\n\n        $serviceOne = $pimple['service'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceOne);\n\n        $serviceTwo = $pimple['service'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceTwo);\n\n        $this->assertNotSame($serviceOne, $serviceTwo);\n    }\n\n    public function testShouldPassContainerAsParameter()\n    {\n        $pimple = new Container();\n        $pimple['service'] = function () {\n            return new Fixtures\\Service();\n        };\n        $pimple['container'] = function ($container) {\n            return $container;\n        };\n\n        $this->assertNotSame($pimple, $pimple['service']);\n        $this->assertSame($pimple, $pimple['container']);\n    }\n\n    public function testIsset()\n    {\n        $pimple = new Container();\n        $pimple['param'] = 'value';\n        $pimple['service'] = function () {\n            return new Fixtures\\Service();\n        };\n\n        $pimple['null'] = null;\n\n        $this->assertTrue(isset($pimple['param']));\n        $this->assertTrue(isset($pimple['service']));\n        $this->assertTrue(isset($pimple['null']));\n        $this->assertFalse(isset($pimple['non_existent']));\n    }\n\n    public function testConstructorInjection()\n    {\n        $params = ['param' => 'value'];\n        $pimple = new Container($params);\n\n        $this->assertSame($params['param'], $pimple['param']);\n    }\n\n    public function testOffsetGetValidatesKeyIsPresent()\n    {\n        $this->expectException(\\Pimple\\Exception\\UnknownIdentifierException::class);\n        $this->expectExceptionMessage('Identifier \"foo\" is not defined.');\n\n        $pimple = new Container();\n        echo $pimple['foo'];\n    }\n\n    /**\n     * @group legacy\n     */\n    public function testLegacyOffsetGetValidatesKeyIsPresent()\n    {\n        $this->expectException(\\InvalidArgumentException::class);\n        $this->expectExceptionMessage('Identifier \"foo\" is not defined.');\n\n        $pimple = new Container();\n        echo $pimple['foo'];\n    }\n\n    public function testOffsetGetHonorsNullValues()\n    {\n        $pimple = new Container();\n        $pimple['foo'] = null;\n        $this->assertNull($pimple['foo']);\n    }\n\n    public function testUnset()\n    {\n        $pimple = new Container();\n        $pimple['param'] = 'value';\n        $pimple['service'] = function () {\n            return new Fixtures\\Service();\n        };\n\n        unset($pimple['param'], $pimple['service']);\n        $this->assertFalse(isset($pimple['param']));\n        $this->assertFalse(isset($pimple['service']));\n    }\n\n    /**\n     * @dataProvider serviceDefinitionProvider\n     */\n    public function testShare($service)\n    {\n        $pimple = new Container();\n        $pimple['shared_service'] = $service;\n\n        $serviceOne = $pimple['shared_service'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceOne);\n\n        $serviceTwo = $pimple['shared_service'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceTwo);\n\n        $this->assertSame($serviceOne, $serviceTwo);\n    }\n\n    /**\n     * @dataProvider serviceDefinitionProvider\n     */\n    public function testProtect($service)\n    {\n        $pimple = new Container();\n        $pimple['protected'] = $pimple->protect($service);\n\n        $this->assertSame($service, $pimple['protected']);\n    }\n\n    public function testGlobalFunctionNameAsParameterValue()\n    {\n        $pimple = new Container();\n        $pimple['global_function'] = 'strlen';\n        $this->assertSame('strlen', $pimple['global_function']);\n    }\n\n    public function testRaw()\n    {\n        $pimple = new Container();\n        $pimple['service'] = $definition = $pimple->factory(function () {\n            return 'foo';\n        });\n        $this->assertSame($definition, $pimple->raw('service'));\n    }\n\n    public function testRawHonorsNullValues()\n    {\n        $pimple = new Container();\n        $pimple['foo'] = null;\n        $this->assertNull($pimple->raw('foo'));\n    }\n\n    public function testFluentRegister()\n    {\n        $pimple = new Container();\n        $this->assertSame($pimple, $pimple->register($this->getMockBuilder('Pimple\\ServiceProviderInterface')->getMock()));\n    }\n\n    public function testRawValidatesKeyIsPresent()\n    {\n        $this->expectException(\\Pimple\\Exception\\UnknownIdentifierException::class);\n        $this->expectExceptionMessage('Identifier \"foo\" is not defined.');\n\n        $pimple = new Container();\n        $pimple->raw('foo');\n    }\n\n    /**\n     * @group legacy\n     */\n    public function testLegacyRawValidatesKeyIsPresent()\n    {\n        $this->expectException(\\InvalidArgumentException::class);\n        $this->expectExceptionMessage('Identifier \"foo\" is not defined.');\n\n        $pimple = new Container();\n        $pimple->raw('foo');\n    }\n\n    /**\n     * @dataProvider serviceDefinitionProvider\n     */\n    public function testExtend($service)\n    {\n        $pimple = new Container();\n        $pimple['shared_service'] = function () {\n            return new Fixtures\\Service();\n        };\n        $pimple['factory_service'] = $pimple->factory(function () {\n            return new Fixtures\\Service();\n        });\n\n        $pimple->extend('shared_service', $service);\n        $serviceOne = $pimple['shared_service'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceOne);\n        $serviceTwo = $pimple['shared_service'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceTwo);\n        $this->assertSame($serviceOne, $serviceTwo);\n        $this->assertSame($serviceOne->value, $serviceTwo->value);\n\n        $pimple->extend('factory_service', $service);\n        $serviceOne = $pimple['factory_service'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceOne);\n        $serviceTwo = $pimple['factory_service'];\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $serviceTwo);\n        $this->assertNotSame($serviceOne, $serviceTwo);\n        $this->assertNotSame($serviceOne->value, $serviceTwo->value);\n    }\n\n    public function testExtendDoesNotLeakWithFactories()\n    {\n        if (\\extension_loaded('pimple')) {\n            $this->markTestSkipped('Pimple extension does not support this test');\n        }\n        $pimple = new Container();\n\n        $pimple['foo'] = $pimple->factory(function () {\n            return;\n        });\n        $pimple['foo'] = $pimple->extend('foo', function ($foo, $pimple) {\n            return;\n        });\n        unset($pimple['foo']);\n\n        $p = new \\ReflectionProperty($pimple, 'values');\n        $p->setAccessible(true);\n        $this->assertEmpty($p->getValue($pimple));\n\n        $p = new \\ReflectionProperty($pimple, 'factories');\n        $p->setAccessible(true);\n        $this->assertCount(0, $p->getValue($pimple));\n    }\n\n    public function testExtendValidatesKeyIsPresent()\n    {\n        $this->expectException(\\Pimple\\Exception\\UnknownIdentifierException::class);\n        $this->expectExceptionMessage('Identifier \"foo\" is not defined.');\n\n        $pimple = new Container();\n        $pimple->extend('foo', function () {\n        });\n    }\n\n    /**\n     * @group legacy\n     */\n    public function testLegacyExtendValidatesKeyIsPresent()\n    {\n        $this->expectException(\\InvalidArgumentException::class);\n        $this->expectExceptionMessage('Identifier \"foo\" is not defined.');\n\n        $pimple = new Container();\n        $pimple->extend('foo', function () {\n        });\n    }\n\n    public function testKeys()\n    {\n        $pimple = new Container();\n        $pimple['foo'] = 123;\n        $pimple['bar'] = 123;\n\n        $this->assertEquals(['foo', 'bar'], $pimple->keys());\n    }\n\n    /** @test */\n    public function settingAnInvokableObjectShouldTreatItAsFactory()\n    {\n        $pimple = new Container();\n        $pimple['invokable'] = new Fixtures\\Invokable();\n\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\Service', $pimple['invokable']);\n    }\n\n    /** @test */\n    public function settingNonInvokableObjectShouldTreatItAsParameter()\n    {\n        $pimple = new Container();\n        $pimple['non_invokable'] = new Fixtures\\NonInvokable();\n\n        $this->assertInstanceOf('Pimple\\Tests\\Fixtures\\NonInvokable', $pimple['non_invokable']);\n    }\n\n    /**\n     * @dataProvider badServiceDefinitionProvider\n     */\n    public function testFactoryFailsForInvalidServiceDefinitions($service)\n    {\n        $this->expectException(\\Pimple\\Exception\\ExpectedInvokableException::class);\n        $this->expectExceptionMessage('Service definition is not a Closure or invokable object.');\n\n        $pimple = new Container();\n        $pimple->factory($service);\n    }\n\n    /**\n     * @group legacy\n     * @dataProvider badServiceDefinitionProvider\n     */\n    public function testLegacyFactoryFailsForInvalidServiceDefinitions($service)\n    {\n        $this->expectException(\\InvalidArgumentException::class);\n        $this->expectExceptionMessage('Service definition is not a Closure or invokable object.');\n\n        $pimple = new Container();\n        $pimple->factory($service);\n    }\n\n    /**\n     * @dataProvider badServiceDefinitionProvider\n     */\n    public function testProtectFailsForInvalidServiceDefinitions($service)\n    {\n        $this->expectException(\\Pimple\\Exception\\ExpectedInvokableException::class);\n        $this->expectExceptionMessage('Callable is not a Closure or invokable object.');\n\n        $pimple = new Container();\n        $pimple->protect($service);\n    }\n\n    /**\n     * @group legacy\n     * @dataProvider badServiceDefinitionProvider\n     */\n    public function testLegacyProtectFailsForInvalidServiceDefinitions($service)\n    {\n        $this->expectException(\\InvalidArgumentException::class);\n        $this->expectExceptionMessage('Callable is not a Closure or invokable object.');\n\n        $pimple = new Container();\n        $pimple->protect($service);\n    }\n\n    /**\n     * @dataProvider badServiceDefinitionProvider\n     */\n    public function testExtendFailsForKeysNotContainingServiceDefinitions($service)\n    {\n        $this->expectException(\\Pimple\\Exception\\InvalidServiceIdentifierException::class);\n        $this->expectExceptionMessage('Identifier \"foo\" does not contain an object definition.');\n\n        $pimple = new Container();\n        $pimple['foo'] = $service;\n        $pimple->extend('foo', function () {\n        });\n    }\n\n    /**\n     * @group legacy\n     * @dataProvider badServiceDefinitionProvider\n     */\n    public function testLegacyExtendFailsForKeysNotContainingServiceDefinitions($service)\n    {\n        $this->expectException(\\InvalidArgumentException::class);\n        $this->expectExceptionMessage('Identifier \"foo\" does not contain an object definition.');\n\n        $pimple = new Container();\n        $pimple['foo'] = $service;\n        $pimple->extend('foo', function () {\n        });\n    }\n\n    /**\n     * @group legacy\n     * @expectedDeprecation How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure \"foo\" should be protected?\n     */\n    public function testExtendingProtectedClosureDeprecation()\n    {\n        $pimple = new Container();\n        $pimple['foo'] = $pimple->protect(function () {\n            return 'bar';\n        });\n\n        $pimple->extend('foo', function ($value) {\n            return $value.'-baz';\n        });\n\n        $this->assertSame('bar-baz', $pimple['foo']);\n    }\n\n    /**\n     * @dataProvider badServiceDefinitionProvider\n     */\n    public function testExtendFailsForInvalidServiceDefinitions($service)\n    {\n        $this->expectException(\\Pimple\\Exception\\ExpectedInvokableException::class);\n        $this->expectExceptionMessage('Extension service definition is not a Closure or invokable object.');\n\n        $pimple = new Container();\n        $pimple['foo'] = function () {\n        };\n        $pimple->extend('foo', $service);\n    }\n\n    /**\n     * @group legacy\n     * @dataProvider badServiceDefinitionProvider\n     */\n    public function testLegacyExtendFailsForInvalidServiceDefinitions($service)\n    {\n        $this->expectException(\\InvalidArgumentException::class);\n        $this->expectExceptionMessage('Extension service definition is not a Closure or invokable object.');\n\n        $pimple = new Container();\n        $pimple['foo'] = function () {\n        };\n        $pimple->extend('foo', $service);\n    }\n\n    public function testExtendFailsIfFrozenServiceIsNonInvokable()\n    {\n        $this->expectException(\\Pimple\\Exception\\FrozenServiceException::class);\n        $this->expectExceptionMessage('Cannot override frozen service \"foo\".');\n\n        $pimple = new Container();\n        $pimple['foo'] = function () {\n            return new Fixtures\\NonInvokable();\n        };\n        $foo = $pimple['foo'];\n\n        $pimple->extend('foo', function () {\n        });\n    }\n\n    public function testExtendFailsIfFrozenServiceIsInvokable()\n    {\n        $this->expectException(\\Pimple\\Exception\\FrozenServiceException::class);\n        $this->expectExceptionMessage('Cannot override frozen service \"foo\".');\n\n        $pimple = new Container();\n        $pimple['foo'] = function () {\n            return new Fixtures\\Invokable();\n        };\n        $foo = $pimple['foo'];\n\n        $pimple->extend('foo', function () {\n        });\n    }\n\n    /**\n     * Provider for invalid service definitions.\n     */\n    public function badServiceDefinitionProvider()\n    {\n        return [\n          [123],\n          [new Fixtures\\NonInvokable()],\n        ];\n    }\n\n    /**\n     * Provider for service definitions.\n     */\n    public function serviceDefinitionProvider()\n    {\n        return [\n            [function ($value) {\n                $service = new Fixtures\\Service();\n                $service->value = $value;\n\n                return $service;\n            }],\n            [new Fixtures\\Invokable()],\n        ];\n    }\n\n    public function testDefiningNewServiceAfterFreeze()\n    {\n        $pimple = new Container();\n        $pimple['foo'] = function () {\n            return 'foo';\n        };\n        $foo = $pimple['foo'];\n\n        $pimple['bar'] = function () {\n            return 'bar';\n        };\n        $this->assertSame('bar', $pimple['bar']);\n    }\n\n    public function testOverridingServiceAfterFreeze()\n    {\n        $this->expectException(\\Pimple\\Exception\\FrozenServiceException::class);\n        $this->expectExceptionMessage('Cannot override frozen service \"foo\".');\n\n        $pimple = new Container();\n        $pimple['foo'] = function () {\n            return 'foo';\n        };\n        $foo = $pimple['foo'];\n\n        $pimple['foo'] = function () {\n            return 'bar';\n        };\n    }\n\n    /**\n     * @group legacy\n     */\n    public function testLegacyOverridingServiceAfterFreeze()\n    {\n        $this->expectException(\\RuntimeException::class);\n        $this->expectExceptionMessage('Cannot override frozen service \"foo\".');\n\n        $pimple = new Container();\n        $pimple['foo'] = function () {\n            return 'foo';\n        };\n        $foo = $pimple['foo'];\n\n        $pimple['foo'] = function () {\n            return 'bar';\n        };\n    }\n\n    public function testRemovingServiceAfterFreeze()\n    {\n        $pimple = new Container();\n        $pimple['foo'] = function () {\n            return 'foo';\n        };\n        $foo = $pimple['foo'];\n\n        unset($pimple['foo']);\n        $pimple['foo'] = function () {\n            return 'bar';\n        };\n        $this->assertSame('bar', $pimple['foo']);\n    }\n\n    public function testExtendingService()\n    {\n        $pimple = new Container();\n        $pimple['foo'] = function () {\n            return 'foo';\n        };\n        $pimple['foo'] = $pimple->extend('foo', function ($foo, $app) {\n            return \"$foo.bar\";\n        });\n        $pimple['foo'] = $pimple->extend('foo', function ($foo, $app) {\n            return \"$foo.baz\";\n        });\n        $this->assertSame('foo.bar.baz', $pimple['foo']);\n    }\n\n    public function testExtendingServiceAfterOtherServiceFreeze()\n    {\n        $pimple = new Container();\n        $pimple['foo'] = function () {\n            return 'foo';\n        };\n        $pimple['bar'] = function () {\n            return 'bar';\n        };\n        $foo = $pimple['foo'];\n\n        $pimple['bar'] = $pimple->extend('bar', function ($bar, $app) {\n            return \"$bar.baz\";\n        });\n        $this->assertSame('bar.baz', $pimple['bar']);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009-2017 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Tests\\Psr11;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Pimple\\Container;\nuse Pimple\\Psr11\\Container as PsrContainer;\nuse Pimple\\Tests\\Fixtures\\Service;\n\nclass ContainerTest extends TestCase\n{\n    public function testGetReturnsExistingService()\n    {\n        $pimple = new Container();\n        $pimple['service'] = function () {\n            return new Service();\n        };\n        $psr = new PsrContainer($pimple);\n\n        $this->assertSame($pimple['service'], $psr->get('service'));\n    }\n\n    public function testGetThrowsExceptionIfServiceIsNotFound()\n    {\n        $this->expectException(\\Psr\\Container\\NotFoundExceptionInterface::class);\n        $this->expectExceptionMessage('Identifier \"service\" is not defined.');\n\n        $pimple = new Container();\n        $psr = new PsrContainer($pimple);\n\n        $psr->get('service');\n    }\n\n    public function testHasReturnsTrueIfServiceExists()\n    {\n        $pimple = new Container();\n        $pimple['service'] = function () {\n            return new Service();\n        };\n        $psr = new PsrContainer($pimple);\n\n        $this->assertTrue($psr->has('service'));\n    }\n\n    public function testHasReturnsFalseIfServiceDoesNotExist()\n    {\n        $pimple = new Container();\n        $psr = new PsrContainer($pimple);\n\n        $this->assertFalse($psr->has('service'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Tests\\Psr11;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Pimple\\Container;\nuse Pimple\\Psr11\\ServiceLocator;\nuse Pimple\\Tests\\Fixtures;\n\n/**\n * ServiceLocator test case.\n *\n * @author Pascal Luna <skalpa@zetareticuli.org>\n */\nclass ServiceLocatorTest extends TestCase\n{\n    public function testCanAccessServices()\n    {\n        $pimple = new Container();\n        $pimple['service'] = function () {\n            return new Fixtures\\Service();\n        };\n        $locator = new ServiceLocator($pimple, ['service']);\n\n        $this->assertSame($pimple['service'], $locator->get('service'));\n    }\n\n    public function testCanAccessAliasedServices()\n    {\n        $pimple = new Container();\n        $pimple['service'] = function () {\n            return new Fixtures\\Service();\n        };\n        $locator = new ServiceLocator($pimple, ['alias' => 'service']);\n\n        $this->assertSame($pimple['service'], $locator->get('alias'));\n    }\n\n    public function testCannotAccessAliasedServiceUsingRealIdentifier()\n    {\n        $this->expectException(\\Pimple\\Exception\\UnknownIdentifierException::class);\n        $this->expectExceptionMessage('Identifier \"service\" is not defined.');\n\n        $pimple = new Container();\n        $pimple['service'] = function () {\n            return new Fixtures\\Service();\n        };\n        $locator = new ServiceLocator($pimple, ['alias' => 'service']);\n\n        $service = $locator->get('service');\n    }\n\n    public function testGetValidatesServiceCanBeLocated()\n    {\n        $this->expectException(\\Pimple\\Exception\\UnknownIdentifierException::class);\n        $this->expectExceptionMessage('Identifier \"foo\" is not defined.');\n\n        $pimple = new Container();\n        $pimple['service'] = function () {\n            return new Fixtures\\Service();\n        };\n        $locator = new ServiceLocator($pimple, ['alias' => 'service']);\n\n        $service = $locator->get('foo');\n    }\n\n    public function testGetValidatesTargetServiceExists()\n    {\n        $this->expectException(\\Pimple\\Exception\\UnknownIdentifierException::class);\n        $this->expectExceptionMessage('Identifier \"invalid\" is not defined.');\n\n        $pimple = new Container();\n        $pimple['service'] = function () {\n            return new Fixtures\\Service();\n        };\n        $locator = new ServiceLocator($pimple, ['alias' => 'invalid']);\n\n        $service = $locator->get('alias');\n    }\n\n    public function testHasValidatesServiceCanBeLocated()\n    {\n        $pimple = new Container();\n        $pimple['service1'] = function () {\n            return new Fixtures\\Service();\n        };\n        $pimple['service2'] = function () {\n            return new Fixtures\\Service();\n        };\n        $locator = new ServiceLocator($pimple, ['service1']);\n\n        $this->assertTrue($locator->has('service1'));\n        $this->assertFalse($locator->has('service2'));\n    }\n\n    public function testHasChecksIfTargetServiceExists()\n    {\n        $pimple = new Container();\n        $pimple['service'] = function () {\n            return new Fixtures\\Service();\n        };\n        $locator = new ServiceLocator($pimple, ['foo' => 'service', 'bar' => 'invalid']);\n\n        $this->assertTrue($locator->has('foo'));\n        $this->assertFalse($locator->has('bar'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php",
    "content": "<?php\n\n/*\n * This file is part of Pimple.\n *\n * Copyright (c) 2009 Fabien Potencier\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nnamespace Pimple\\Tests;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Pimple\\Container;\nuse Pimple\\ServiceIterator;\nuse Pimple\\Tests\\Fixtures\\Service;\n\nclass ServiceIteratorTest extends TestCase\n{\n    public function testIsIterable()\n    {\n        $pimple = new Container();\n        $pimple['service1'] = function () {\n            return new Service();\n        };\n        $pimple['service2'] = function () {\n            return new Service();\n        };\n        $pimple['service3'] = function () {\n            return new Service();\n        };\n        $iterator = new ServiceIterator($pimple, ['service1', 'service2']);\n\n        $this->assertSame(['service1' => $pimple['service1'], 'service2' => $pimple['service2']], iterator_to_array($iterator));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/cache/CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to this project will be documented in this file, in reverse chronological order by release.\n\n## 1.0.1 - 2016-08-06\n\n### Fixed\n\n- Make spacing consistent in phpdoc annotations php-fig/cache#9 - chalasr\n- Fix grammar in phpdoc annotations php-fig/cache#10 - chalasr\n- Be more specific in docblocks that `getItems()` and `deleteItems()` take an array of strings (`string[]`) compared to just `array` php-fig/cache#8 - GrahamCampbell\n- 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\n\n## 1.0.0 - 2015-12-11\n\nInitial stable release; reflects accepted PSR-6 specification\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/cache/LICENSE.txt",
    "content": "Copyright (c) 2015 PHP Framework Interoperability Group\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/cache/README.md",
    "content": "Caching Interface\n==============\n\nThis repository holds all interfaces related to [PSR-6 (Caching Interface)][psr-url].\n\nNote that this is not a Caching implementation of its own. It is merely interfaces that describe the components of a Caching mechanism.\n\nThe installable [package][package-url] and [implementations][implementation-url] are listed on Packagist.\n\n[psr-url]: https://www.php-fig.org/psr/psr-6/\n[package-url]: https://packagist.org/packages/psr/cache\n[implementation-url]: https://packagist.org/providers/psr/cache-implementation\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/cache/composer.json",
    "content": "{\n    \"name\": \"psr/cache\",\n    \"description\": \"Common interface for caching libraries\",\n    \"keywords\": [\"psr\", \"psr-6\", \"cache\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"https://www.php-fig.org/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.0.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\Cache\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.0.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/cache/src/CacheException.php",
    "content": "<?php\n\nnamespace Psr\\Cache;\n\n/**\n * Exception interface for all exceptions thrown by an Implementing Library.\n */\ninterface CacheException extends \\Throwable\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/cache/src/CacheItemInterface.php",
    "content": "<?php\n\nnamespace Psr\\Cache;\n\n/**\n * CacheItemInterface defines an interface for interacting with objects inside a cache.\n *\n * Each Item object MUST be associated with a specific key, which can be set\n * according to the implementing system and is typically passed by the\n * Cache\\CacheItemPoolInterface object.\n *\n * The Cache\\CacheItemInterface object encapsulates the storage and retrieval of\n * cache items. Each Cache\\CacheItemInterface is generated by a\n * Cache\\CacheItemPoolInterface object, which is responsible for any required\n * setup as well as associating the object with a unique Key.\n * Cache\\CacheItemInterface objects MUST be able to store and retrieve any type\n * of PHP value defined in the Data section of the specification.\n *\n * Calling Libraries MUST NOT instantiate Item objects themselves. They may only\n * be requested from a Pool object via the getItem() method.  Calling Libraries\n * SHOULD NOT assume that an Item created by one Implementing Library is\n * compatible with a Pool from another Implementing Library.\n */\ninterface CacheItemInterface\n{\n    /**\n     * Returns the key for the current cache item.\n     *\n     * The key is loaded by the Implementing Library, but should be available to\n     * the higher level callers when needed.\n     *\n     * @return string\n     *   The key string for this cache item.\n     */\n    public function getKey(): string;\n\n    /**\n     * Retrieves the value of the item from the cache associated with this object's key.\n     *\n     * The value returned must be identical to the value originally stored by set().\n     *\n     * If isHit() returns false, this method MUST return null. Note that null\n     * is a legitimate cached value, so the isHit() method SHOULD be used to\n     * differentiate between \"null value was found\" and \"no value was found.\"\n     *\n     * @return mixed\n     *   The value corresponding to this cache item's key, or null if not found.\n     */\n    public function get(): mixed;\n\n    /**\n     * Confirms if the cache item lookup resulted in a cache hit.\n     *\n     * Note: This method MUST NOT have a race condition between calling isHit()\n     * and calling get().\n     *\n     * @return bool\n     *   True if the request resulted in a cache hit. False otherwise.\n     */\n    public function isHit(): bool;\n\n    /**\n     * Sets the value represented by this cache item.\n     *\n     * The $value argument may be any item that can be serialized by PHP,\n     * although the method of serialization is left up to the Implementing\n     * Library.\n     *\n     * @param mixed $value\n     *   The serializable value to be stored.\n     *\n     * @return static\n     *   The invoked object.\n     */\n    public function set(mixed $value): static;\n\n    /**\n     * Sets the expiration time for this cache item.\n     *\n     * @param ?\\DateTimeInterface $expiration\n     *   The point in time after which the item MUST be considered expired.\n     *   If null is passed explicitly, a default value MAY be used. If none is set,\n     *   the value should be stored permanently or for as long as the\n     *   implementation allows.\n     *\n     * @return static\n     *   The called object.\n     */\n    public function expiresAt(?\\DateTimeInterface $expiration): static;\n\n    /**\n     * Sets the expiration time for this cache item.\n     *\n     * @param int|\\DateInterval|null $time\n     *   The period of time from the present after which the item MUST be considered\n     *   expired. An integer parameter is understood to be the time in seconds until\n     *   expiration. If null is passed explicitly, a default value MAY be used.\n     *   If none is set, the value should be stored permanently or for as long as the\n     *   implementation allows.\n     *\n     * @return static\n     *   The called object.\n     */\n    public function expiresAfter(int|\\DateInterval|null $time): static;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/cache/src/CacheItemPoolInterface.php",
    "content": "<?php\n\nnamespace Psr\\Cache;\n\n/**\n * CacheItemPoolInterface generates CacheItemInterface objects.\n *\n * The primary purpose of Cache\\CacheItemPoolInterface is to accept a key from\n * the Calling Library and return the associated Cache\\CacheItemInterface object.\n * It is also the primary point of interaction with the entire cache collection.\n * All configuration and initialization of the Pool is left up to an\n * Implementing Library.\n */\ninterface CacheItemPoolInterface\n{\n    /**\n     * Returns a Cache Item representing the specified key.\n     *\n     * This method must always return a CacheItemInterface object, even in case of\n     * a cache miss. It MUST NOT return null.\n     *\n     * @param string $key\n     *   The key for which to return the corresponding Cache Item.\n     *\n     * @throws InvalidArgumentException\n     *   If the $key string is not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return CacheItemInterface\n     *   The corresponding Cache Item.\n     */\n    public function getItem(string $key): CacheItemInterface;\n\n    /**\n     * Returns a traversable set of cache items.\n     *\n     * @param string[] $keys\n     *   An indexed array of keys of items to retrieve.\n     *\n     * @throws InvalidArgumentException\n     *   If any of the keys in $keys are not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return iterable\n     *   An iterable collection of Cache Items keyed by the cache keys of\n     *   each item. A Cache item will be returned for each key, even if that\n     *   key is not found. However, if no keys are specified then an empty\n     *   traversable MUST be returned instead.\n     */\n    public function getItems(array $keys = []): iterable;\n\n    /**\n     * Confirms if the cache contains specified cache item.\n     *\n     * Note: This method MAY avoid retrieving the cached value for performance reasons.\n     * This could result in a race condition with CacheItemInterface::get(). To avoid\n     * such situation use CacheItemInterface::isHit() instead.\n     *\n     * @param string $key\n     *   The key for which to check existence.\n     *\n     * @throws InvalidArgumentException\n     *   If the $key string is not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return bool\n     *   True if item exists in the cache, false otherwise.\n     */\n    public function hasItem(string $key): bool;\n\n    /**\n     * Deletes all items in the pool.\n     *\n     * @return bool\n     *   True if the pool was successfully cleared. False if there was an error.\n     */\n    public function clear(): bool;\n\n    /**\n     * Removes the item from the pool.\n     *\n     * @param string $key\n     *   The key to delete.\n     *\n     * @throws InvalidArgumentException\n     *   If the $key string is not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return bool\n     *   True if the item was successfully removed. False if there was an error.\n     */\n    public function deleteItem(string $key): bool;\n\n    /**\n     * Removes multiple items from the pool.\n     *\n     * @param string[] $keys\n     *   An array of keys that should be removed from the pool.\n     *\n     * @throws InvalidArgumentException\n     *   If any of the keys in $keys are not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return bool\n     *   True if the items were successfully removed. False if there was an error.\n     */\n    public function deleteItems(array $keys): bool;\n\n    /**\n     * Persists a cache item immediately.\n     *\n     * @param CacheItemInterface $item\n     *   The cache item to save.\n     *\n     * @return bool\n     *   True if the item was successfully persisted. False if there was an error.\n     */\n    public function save(CacheItemInterface $item): bool;\n\n    /**\n     * Sets a cache item to be persisted later.\n     *\n     * @param CacheItemInterface $item\n     *   The cache item to save.\n     *\n     * @return bool\n     *   False if the item could not be queued or if a commit was attempted and failed. True otherwise.\n     */\n    public function saveDeferred(CacheItemInterface $item): bool;\n\n    /**\n     * Persists any deferred cache items.\n     *\n     * @return bool\n     *   True if all not-yet-saved items were successfully saved or there were none. False otherwise.\n     */\n    public function commit(): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/cache/src/InvalidArgumentException.php",
    "content": "<?php\n\nnamespace Psr\\Cache;\n\n/**\n * Exception interface for invalid cache arguments.\n *\n * Any time an invalid argument is passed into a method it must throw an\n * exception class which implements Psr\\Cache\\InvalidArgumentException.\n */\ninterface InvalidArgumentException extends CacheException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/container/.gitignore",
    "content": "composer.lock\ncomposer.phar\n/vendor/\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/container/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013-2016 container-interop\nCopyright (c) 2016 PHP Framework Interoperability Group\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/container/README.md",
    "content": "Container interface\n==============\n\nThis repository holds all interfaces related to [PSR-11 (Container Interface)][psr-url].\n\nNote that this is not a Container implementation of its own. It is merely abstractions that describe the components of a Dependency Injection Container.\n\nThe installable [package][package-url] and [implementations][implementation-url] are listed on Packagist.\n\n[psr-url]: https://www.php-fig.org/psr/psr-11/\n[package-url]: https://packagist.org/packages/psr/container\n[implementation-url]: https://packagist.org/providers/psr/container-implementation\n\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/container/composer.json",
    "content": "{\n    \"name\": \"psr/container\",\n    \"type\": \"library\",\n    \"description\": \"Common Container Interface (PHP FIG PSR-11)\",\n    \"keywords\": [\"psr\", \"psr-11\", \"container\", \"container-interop\", \"container-interface\"],\n    \"homepage\": \"https://github.com/php-fig/container\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"https://www.php-fig.org/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.4.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\Container\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"2.0.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/container/src/ContainerExceptionInterface.php",
    "content": "<?php\n\nnamespace Psr\\Container;\n\nuse Throwable;\n\n/**\n * Base interface representing a generic exception in a container.\n */\ninterface ContainerExceptionInterface extends Throwable\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/container/src/ContainerInterface.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Psr\\Container;\n\n/**\n * Describes the interface of a container that exposes methods to read its entries.\n */\ninterface ContainerInterface\n{\n    /**\n     * Finds an entry of the container by its identifier and returns it.\n     *\n     * @param string $id Identifier of the entry to look for.\n     *\n     * @throws NotFoundExceptionInterface  No entry was found for **this** identifier.\n     * @throws ContainerExceptionInterface Error while retrieving the entry.\n     *\n     * @return mixed Entry.\n     */\n    public function get(string $id);\n\n    /**\n     * Returns true if the container can return an entry for the given identifier.\n     * Returns false otherwise.\n     *\n     * `has($id)` returning true does not mean that `get($id)` will not throw an exception.\n     * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`.\n     *\n     * @param string $id Identifier of the entry to look for.\n     *\n     * @return bool\n     */\n    public function has(string $id): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/container/src/NotFoundExceptionInterface.php",
    "content": "<?php\n\nnamespace Psr\\Container;\n\n/**\n * No entry was found in the container.\n */\ninterface NotFoundExceptionInterface extends ContainerExceptionInterface\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/event-dispatcher/.editorconfig",
    "content": "; This file is for unifying the coding style for different editors and IDEs.\n; More information at http://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nindent_size = 4\nindent_style = space\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[Makefile]\nindent_style = tab\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/event-dispatcher/.gitignore",
    "content": "/vendor/\ncomposer.lock\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/event-dispatcher/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 PHP-FIG\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/event-dispatcher/README.md",
    "content": "PSR Event Dispatcher\n====================\n\nThis repository holds the interfaces related to [PSR-14](http://www.php-fig.org/psr/psr-14/).\n\nNote that this is not an Event Dispatcher implementation of its own. It is merely interfaces that describe the components of an Event Dispatcher.  See the specification for more details.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/event-dispatcher/composer.json",
    "content": "{\n    \"name\": \"psr/event-dispatcher\",\n    \"description\": \"Standard interfaces for event handling.\",\n    \"type\": \"library\",\n    \"keywords\": [\"psr\", \"psr-14\", \"events\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"http://www.php-fig.org/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.2.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\EventDispatcher\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.0.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/event-dispatcher/src/EventDispatcherInterface.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace Psr\\EventDispatcher;\n\n/**\n * Defines a dispatcher for events.\n */\ninterface EventDispatcherInterface\n{\n    /**\n     * Provide all relevant listeners with an event to process.\n     *\n     * @param object $event\n     *   The object to process.\n     *\n     * @return object\n     *   The Event that was passed, now modified by listeners.\n     */\n    public function dispatch(object $event);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/event-dispatcher/src/ListenerProviderInterface.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace Psr\\EventDispatcher;\n\n/**\n * Mapper from an event to the listeners that are applicable to that event.\n */\ninterface ListenerProviderInterface\n{\n    /**\n     * @param object $event\n     *   An event for which to return the relevant listeners.\n     * @return iterable[callable]\n     *   An iterable (array, iterator, or generator) of callables.  Each\n     *   callable MUST be type-compatible with $event.\n     */\n    public function getListenersForEvent(object $event) : iterable;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/event-dispatcher/src/StoppableEventInterface.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace Psr\\EventDispatcher;\n\n/**\n * An Event whose processing may be interrupted when the event has been handled.\n *\n * A Dispatcher implementation MUST check to determine if an Event\n * is marked as stopped after each listener is called.  If it is then it should\n * return immediately without calling any further Listeners.\n */\ninterface StoppableEventInterface\n{\n    /**\n     * Is propagation stopped?\n     *\n     * This will typically only be used by the Dispatcher to determine if the\n     * previous listener halted propagation.\n     *\n     * @return bool\n     *   True if the Event is complete and no further listeners should be called.\n     *   False to continue calling listeners.\n     */\n    public function isPropagationStopped() : bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-client/CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to this project will be documented in this file, in reverse chronological order by release.\n\n## 1.0.3\n\nAdd `source` link in composer.json. No code changes.\n\n## 1.0.2\n\nAllow PSR-7 (psr/http-message) 2.0. No code changes.\n\n## 1.0.1\n\nAllow installation with PHP 8. No code changes.\n\n## 1.0.0\n\nFirst stable release. No changes since 0.3.0.\n\n## 0.3.0\n\nAdded Interface suffix on exceptions\n \n## 0.2.0 \n\nAll exceptions are in `Psr\\Http\\Client` namespace\n\n## 0.1.0\n\nFirst release\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-client/LICENSE",
    "content": "Copyright (c) 2017 PHP Framework Interoperability Group\n\nPermission is hereby granted, free of charge, to any person obtaining a copy \nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights \nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in \nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-client/README.md",
    "content": "HTTP Client\n===========\n\nThis repository holds all the common code related to [PSR-18 (HTTP Client)][psr-url].\n\nNote that this is not a HTTP Client implementation of its own. It is merely abstractions that describe the components of a HTTP Client.\n\nThe installable [package][package-url] and [implementations][implementation-url] are listed on Packagist.\n\n[psr-url]: https://www.php-fig.org/psr/psr-18\n[package-url]: https://packagist.org/packages/psr/http-client\n[implementation-url]: https://packagist.org/providers/psr/http-client-implementation\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-client/composer.json",
    "content": "{\n    \"name\": \"psr/http-client\",\n    \"description\": \"Common interface for HTTP clients\",\n    \"keywords\": [\"psr\", \"psr-18\", \"http\", \"http-client\"],\n    \"homepage\": \"https://github.com/php-fig/http-client\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"https://www.php-fig.org/\"\n        }\n    ],\n    \"support\": {\n        \"source\": \"https://github.com/php-fig/http-client\"\n    },\n    \"require\": {\n        \"php\": \"^7.0 || ^8.0\",\n        \"psr/http-message\": \"^1.0 || ^2.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\Http\\\\Client\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.0.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-client/src/ClientExceptionInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Client;\n\n/**\n * Every HTTP client related exception MUST implement this interface.\n */\ninterface ClientExceptionInterface extends \\Throwable\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-client/src/ClientInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Client;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\ninterface ClientInterface\n{\n    /**\n     * Sends a PSR-7 request and returns a PSR-7 response.\n     *\n     * @param RequestInterface $request\n     *\n     * @return ResponseInterface\n     *\n     * @throws \\Psr\\Http\\Client\\ClientExceptionInterface If an error happens while processing the request.\n     */\n    public function sendRequest(RequestInterface $request): ResponseInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-client/src/NetworkExceptionInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Client;\n\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Thrown when the request cannot be completed because of network issues.\n *\n * There is no response object as this exception is thrown when no response has been received.\n *\n * Example: the target host name can not be resolved or the connection failed.\n */\ninterface NetworkExceptionInterface extends ClientExceptionInterface\n{\n    /**\n     * Returns the request.\n     *\n     * The request object MAY be a different object from the one passed to ClientInterface::sendRequest()\n     *\n     * @return RequestInterface\n     */\n    public function getRequest(): RequestInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-client/src/RequestExceptionInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Client;\n\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Exception for when a request failed.\n *\n * Examples:\n *      - Request is invalid (e.g. method is missing)\n *      - Runtime request errors (e.g. the body stream is not seekable)\n */\ninterface RequestExceptionInterface extends ClientExceptionInterface\n{\n    /**\n     * Returns the request.\n     *\n     * The request object MAY be a different object from the one passed to ClientInterface::sendRequest()\n     *\n     * @return RequestInterface\n     */\n    public function getRequest(): RequestInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-factory/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 PHP-FIG\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-factory/README.md",
    "content": "HTTP Factories\n==============\n\nThis repository holds all interfaces related to [PSR-17 (HTTP Factories)][psr-url].\n\nNote that this is not a HTTP Factory implementation of its own. It is merely interfaces that describe the components of a HTTP Factory.\n\nThe installable [package][package-url] and [implementations][implementation-url] are listed on Packagist.\n\n[psr-url]: https://www.php-fig.org/psr/psr-17/\n[package-url]: https://packagist.org/packages/psr/http-factory\n[implementation-url]: https://packagist.org/providers/psr/http-factory-implementation\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-factory/composer.json",
    "content": "{\n    \"name\": \"psr/http-factory\",\n    \"description\": \"PSR-17: Common interfaces for PSR-7 HTTP message factories\",\n    \"keywords\": [\n        \"psr\",\n        \"psr-7\",\n        \"psr-17\",\n        \"http\",\n        \"factory\",\n        \"message\",\n        \"request\",\n        \"response\"\n    ],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"https://www.php-fig.org/\"\n        }\n    ],\n    \"support\": {\n        \"source\": \"https://github.com/php-fig/http-factory\"\n    },\n    \"require\": {\n        \"php\": \">=7.1\",\n        \"psr/http-message\": \"^1.0 || ^2.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.0.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-factory/src/RequestFactoryInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\ninterface RequestFactoryInterface\n{\n    /**\n     * Create a new request.\n     *\n     * @param string $method The HTTP method associated with the request.\n     * @param UriInterface|string $uri The URI associated with the request. If\n     *     the value is a string, the factory MUST create a UriInterface\n     *     instance based on it.\n     *\n     * @return RequestInterface\n     */\n    public function createRequest(string $method, $uri): RequestInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-factory/src/ResponseFactoryInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\ninterface ResponseFactoryInterface\n{\n    /**\n     * Create a new response.\n     *\n     * @param int $code HTTP status code; defaults to 200\n     * @param string $reasonPhrase Reason phrase to associate with status code\n     *     in generated response; if none is provided implementations MAY use\n     *     the defaults as suggested in the HTTP specification.\n     *\n     * @return ResponseInterface\n     */\n    public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\ninterface ServerRequestFactoryInterface\n{\n    /**\n     * Create a new server request.\n     *\n     * Note that server-params are taken precisely as given - no parsing/processing\n     * of the given values is performed, and, in particular, no attempt is made to\n     * determine the HTTP method or URI, which must be provided explicitly.\n     *\n     * @param string $method The HTTP method associated with the request.\n     * @param UriInterface|string $uri The URI associated with the request. If\n     *     the value is a string, the factory MUST create a UriInterface\n     *     instance based on it.\n     * @param array $serverParams Array of SAPI parameters with which to seed\n     *     the generated request instance.\n     *\n     * @return ServerRequestInterface\n     */\n    public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-factory/src/StreamFactoryInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\ninterface StreamFactoryInterface\n{\n    /**\n     * Create a new stream from a string.\n     *\n     * The stream SHOULD be created with a temporary resource.\n     *\n     * @param string $content String content with which to populate the stream.\n     *\n     * @return StreamInterface\n     */\n    public function createStream(string $content = ''): StreamInterface;\n\n    /**\n     * Create a stream from an existing file.\n     *\n     * The file MUST be opened using the given mode, which may be any mode\n     * supported by the `fopen` function.\n     *\n     * The `$filename` MAY be any string supported by `fopen()`.\n     *\n     * @param string $filename Filename or stream URI to use as basis of stream.\n     * @param string $mode Mode with which to open the underlying filename/stream.\n     *\n     * @return StreamInterface\n     * @throws \\RuntimeException If the file cannot be opened.\n     * @throws \\InvalidArgumentException If the mode is invalid.\n     */\n    public function createStreamFromFile(string $filename, string $mode = 'r'): StreamInterface;\n\n    /**\n     * Create a new stream from an existing resource.\n     *\n     * The stream MUST be readable and may be writable.\n     *\n     * @param resource $resource PHP resource to use as basis of stream.\n     *\n     * @return StreamInterface\n     */\n    public function createStreamFromResource($resource): StreamInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\ninterface UploadedFileFactoryInterface\n{\n    /**\n     * Create a new uploaded file.\n     *\n     * If a size is not provided it will be determined by checking the size of\n     * the file.\n     *\n     * @see http://php.net/manual/features.file-upload.post-method.php\n     * @see http://php.net/manual/features.file-upload.errors.php\n     *\n     * @param StreamInterface $stream Underlying stream representing the\n     *     uploaded file content.\n     * @param int|null $size in bytes\n     * @param int $error PHP file upload error\n     * @param string|null $clientFilename Filename as provided by the client, if any.\n     * @param string|null $clientMediaType Media type as provided by the client, if any.\n     *\n     * @return UploadedFileInterface\n     *\n     * @throws \\InvalidArgumentException If the file resource is not readable.\n     */\n    public function createUploadedFile(\n        StreamInterface $stream,\n        ?int $size = null,\n        int $error = \\UPLOAD_ERR_OK,\n        ?string $clientFilename = null,\n        ?string $clientMediaType = null\n    ): UploadedFileInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-factory/src/UriFactoryInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\ninterface UriFactoryInterface\n{\n    /**\n     * Create a new URI.\n     *\n     * @param string $uri\n     *\n     * @return UriInterface\n     *\n     * @throws \\InvalidArgumentException If the given URI cannot be parsed.\n     */\n    public function createUri(string $uri = ''): UriInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to this project will be documented in this file, in reverse chronological order by release.\n\n## 1.0.1 - 2016-08-06\n\n### Added\n\n- Nothing.\n\n### Deprecated\n\n- Nothing.\n\n### Removed\n\n- Nothing.\n\n### Fixed\n\n- Updated all `@return self` annotation references in interfaces to use\n  `@return static`, which more closelly follows the semantics of the\n  specification.\n- Updated the `MessageInterface::getHeaders()` return annotation to use the\n  value `string[][]`, indicating the format is a nested array of strings.\n- Updated the `@link` annotation for `RequestInterface::withRequestTarget()`\n  to point to the correct section of RFC 7230.\n- Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation\n  to add the parameter name (`$uploadedFiles`).\n- Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()`\n  method to correctly reference the method parameter (it was referencing an\n  incorrect parameter name previously).\n\n## 1.0.0 - 2016-05-18\n\nInitial stable release; reflects accepted PSR-7 specification.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/LICENSE",
    "content": "Copyright (c) 2014 PHP Framework Interoperability Group\n\nPermission is hereby granted, free of charge, to any person obtaining a copy \nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights \nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in \nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/README.md",
    "content": "PSR Http Message\n================\n\nThis repository holds all interfaces/classes/traits related to\n[PSR-7](http://www.php-fig.org/psr/psr-7/).\n\nNote that this is not a HTTP message implementation of its own. It is merely an\ninterface that describes a HTTP message. See the specification for more details.\n\nUsage\n-----\n\nBefore reading the usage guide we recommend reading the PSR-7 interfaces method list:\n\n* [`PSR-7 Interfaces Method List`](docs/PSR7-Interfaces.md)\n* [`PSR-7 Usage Guide`](docs/PSR7-Usage.md)"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/composer.json",
    "content": "{\n    \"name\": \"psr/http-message\",\n    \"description\": \"Common interface for HTTP messages\",\n    \"keywords\": [\"psr\", \"psr-7\", \"http\", \"http-message\", \"request\", \"response\"],\n    \"homepage\": \"https://github.com/php-fig/http-message\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"https://www.php-fig.org/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \"^7.2 || ^8.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"2.0.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/docs/PSR7-Interfaces.md",
    "content": "# Interfaces\n\nThe purpose of this list is to help in finding the methods when working with PSR-7. This can be considered as a cheatsheet for PSR-7 interfaces.\n\nThe interfaces defined in PSR-7 are the following:\n\n| Class Name | Description |\n|---|---|\n| [Psr\\Http\\Message\\MessageInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessagemessageinterface) | Representation of a HTTP message |\n| [Psr\\Http\\Message\\RequestInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessagerequestinterface) | Representation of an outgoing, client-side request. |\n| [Psr\\Http\\Message\\ServerRequestInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageserverrequestinterface) | Representation of an incoming, server-side HTTP request. | \n| [Psr\\Http\\Message\\ResponseInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageresponseinterface) | Representation of an outgoing, server-side response. |\n| [Psr\\Http\\Message\\StreamInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessagestreaminterface) | Describes a data stream |\n| [Psr\\Http\\Message\\UriInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageuriinterface) | Value object representing a URI. |\n| [Psr\\Http\\Message\\UploadedFileInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageuploadedfileinterface) | Value object representing a file uploaded through an HTTP request. |\n\n## `Psr\\Http\\Message\\MessageInterface` Methods\n\n| Method Name                        | Description | Notes |\n|------------------------------------| ----------- | ----- |\n| `getProtocolVersion()`             | Retrieve HTTP protocol version          |  1.0 or 1.1 |\n| `withProtocolVersion($version)`    | Returns new message instance with given HTTP protocol version          |      |\n| `getHeaders()`                     | Retrieve all HTTP Headers               | [Request Header List](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Request_fields), [Response Header List](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_fields)      |\n| `hasHeader($name)`                 | Checks if HTTP Header with given name exists  | |\n| `getHeader($name)`                 | Retrieves a array with the values for a single header | |\n| `getHeaderLine($name)`             | Retrieves a comma-separated string of the values for a single header |  |\n| `withHeader($name, $value)`        | Returns new message instance with given HTTP Header | if the header existed in the original instance, replaces the header value from the original message with the value provided when creating the new instance. |\n| `withAddedHeader($name, $value)`   | Returns new message instance with appended value to given header | If header already exists value will be appended, if not a new header will be created |\n| `withoutHeader($name)`             | Removes HTTP Header with given name| |\n| `getBody()`                        | Retrieves the HTTP Message Body | Returns object implementing `StreamInterface`|\n| `withBody(StreamInterface $body)`  | Returns new message instance with given HTTP Message Body | |\n\n\n## `Psr\\Http\\Message\\RequestInterface` Methods\n\nSame methods as `Psr\\Http\\Message\\MessageInterface`  + the following methods:\n\n| Method Name                        | Description | Notes |\n|------------------------------------| ----------- | ----- |\n| `getRequestTarget()`                | Retrieves the message's request target              | origin-form, absolute-form, authority-form, asterisk-form ([RFC7230](https://www.rfc-editor.org/rfc/rfc7230.txt)) |\n| `withRequestTarget($requestTarget)` | Return a new message instance with the specific request-target |      |\n| `getMethod()`                       | Retrieves the HTTP method of the request.  |  GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE (defined in [RFC7231](https://tools.ietf.org/html/rfc7231)), PATCH (defined in [RFC5789](https://tools.ietf.org/html/rfc5789)) |\n| `withMethod($method)`               | Returns a new message instance with the provided HTTP method  | |\n| `getUri()`                 | Retrieves the URI instance | |\n| `withUri(UriInterface $uri, $preserveHost = false)` | Returns a new message instance with the provided URI |  |\n\n\n## `Psr\\Http\\Message\\ServerRequestInterface` Methods\n\nSame methods as `Psr\\Http\\Message\\RequestInterface`  + the following methods:\n\n| Method Name                        | Description | Notes |\n|------------------------------------| ----------- | ----- |\n| `getServerParams() `               | Retrieve server parameters  | Typically derived from `$_SERVER`  |\n| `getCookieParams()`                | Retrieves cookies sent by the client to the server. | Typically derived from `$_COOKIES` |\n| `withCookieParams(array $cookies)` |  Returns a new request instance with the specified cookies      |   | \n| `withQueryParams(array $query)` | Returns a new request instance with the specified query string arguments  |  |\n| `getUploadedFiles()` | Retrieve normalized file upload data  |  |\n| `withUploadedFiles(array $uploadedFiles)` | Returns a new request instance with the specified uploaded files  |  |\n| `getParsedBody()` | Retrieve any parameters provided in the request body  |  |\n| `withParsedBody($data)` | Returns a new request instance with the specified body parameters  |  |\n| `getAttributes()` | Retrieve attributes derived from the request  |  |\n| `getAttribute($name, $default = null)` | Retrieve a single derived request attribute  |  |\n| `withAttribute($name, $value)` | Returns a new request instance with the specified derived request attribute  |  |\n| `withoutAttribute($name)` | Returns a new request instance that without the specified derived request attribute  |  |\n\n## `Psr\\Http\\Message\\ResponseInterface` Methods:\n\nSame methods as `Psr\\Http\\Message\\MessageInterface`  + the following methods:\n\n| Method Name                        | Description | Notes |\n|------------------------------------| ----------- | ----- |\n| `getStatusCode()` | Gets the response status code. | |\n| `withStatus($code, $reasonPhrase = '')` | Returns a new response instance with the specified status code and, optionally, reason phrase. | |\n| `getReasonPhrase()` | Gets the response reason phrase associated with the status code. | |\n\n##  `Psr\\Http\\Message\\StreamInterface` Methods\n\n| Method Name                        | Description | Notes |\n|------------------------------------| ----------- | ----- |\n| `__toString()` | Reads all data from the stream into a string, from the beginning to end. | |\n| `close()` | Closes the stream and any underlying resources. | |\n| `detach()` | Separates any underlying resources from the stream. | |\n| `getSize()` | Get the size of the stream if known. | |\n| `eof()` | Returns true if the stream is at the end of the stream.| |\n| `isSeekable()` |  Returns whether or not the stream is seekable. | |\n| `seek($offset, $whence = SEEK_SET)` | Seek to a position in the stream. | |\n| `rewind()` | Seek to the beginning of the stream. | |\n| `isWritable()` | Returns whether or not the stream is writable. | |\n| `write($string)` | Write data to the stream. | |\n| `isReadable()` | Returns whether or not the stream is readable. | |\n| `read($length)` | Read data from the stream. | |\n| `getContents()` | Returns the remaining contents in a string | |\n| `getMetadata($key = null)()` | Get stream metadata as an associative array or retrieve a specific key. | |\n\n## `Psr\\Http\\Message\\UriInterface` Methods\n\n| Method Name                        | Description | Notes |\n|------------------------------------| ----------- | ----- |\n| `getScheme()` | Retrieve the scheme component of the URI. | |\n| `getAuthority()` | Retrieve the authority component of the URI. | |\n| `getUserInfo()` | Retrieve the user information component of the URI. | |\n| `getHost()` | Retrieve the host component of the URI. | |\n| `getPort()` | Retrieve the port component of the URI. | |\n| `getPath()` | Retrieve the path component of the URI. | |\n| `getQuery()` | Retrieve the query string of the URI. | |\n| `getFragment()` | Retrieve the fragment component of the URI. | |\n| `withScheme($scheme)` | Return an instance with the specified scheme. | |\n| `withUserInfo($user, $password = null)` | Return an instance with the specified user information. | |\n| `withHost($host)` | Return an instance with the specified host. | |\n| `withPort($port)` | Return an instance with the specified port. | |\n| `withPath($path)` | Return an instance with the specified path. | |\n| `withQuery($query)` | Return an instance with the specified query string. | |\n| `withFragment($fragment)` | Return an instance with the specified URI fragment. | |\n| `__toString()` | Return the string representation as a URI reference. | |\n\n## `Psr\\Http\\Message\\UploadedFileInterface` Methods\n\n| Method Name                        | Description | Notes |\n|------------------------------------| ----------- | ----- |\n| `getStream()` | Retrieve a stream representing the uploaded file. | |\n| `moveTo($targetPath)` | Move the uploaded file to a new location. | |\n| `getSize()` | Retrieve the file size. | |\n| `getError()` | Retrieve the error associated with the uploaded file. | |\n| `getClientFilename()` | Retrieve the filename sent by the client. | |\n| `getClientMediaType()` | Retrieve the media type sent by the client. | |\n\n> `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface`  because the `Request` and the `Response` are `HTTP Messages`.\n> When using `ServerRequestInterface`, both `RequestInterface` and `Psr\\Http\\Message\\MessageInterface` methods are considered.\n\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/docs/PSR7-Usage.md",
    "content": "### PSR-7 Usage\n\nAll PSR-7 applications comply with these interfaces \nThey were created to establish a standard between middleware implementations.\n\n> `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface`  because the `Request` and the `Response` are `HTTP Messages`.\n> When using `ServerRequestInterface`, both `RequestInterface` and `Psr\\Http\\Message\\MessageInterface` methods are considered.\n\n\nThe following examples will illustrate how basic operations are done in PSR-7.\n\n##### Examples\n\n\nFor this examples to work (at least) a PSR-7 implementation package is required. (eg: zendframework/zend-diactoros, guzzlehttp/psr7, slim/slim, etc)\nAll PSR-7 implementations should have the same behaviour.\n\nThe following will be assumed: \n`$request` is an object of `Psr\\Http\\Message\\RequestInterface` and\n\n`$response` is an object implementing `Psr\\Http\\Message\\RequestInterface`\n\n\n### Working with HTTP Headers\n\n#### Adding headers to response:\n\n```php\n$response->withHeader('My-Custom-Header', 'My Custom Message');\n```\n\n#### Appending values to headers\n\n```php\n$response->withAddedHeader('My-Custom-Header', 'The second message');\n```\n\n#### Checking if header exists:\n\n```php\n$request->hasHeader('My-Custom-Header'); // will return false\n$response->hasHeader('My-Custom-Header'); // will return true\n```\n\n> Note: My-Custom-Header was only added in the Response\n\n#### Getting comma-separated values from a header (also applies to request)\n\n```php\n// getting value from request headers\n$request->getHeaderLine('Content-Type'); // will return: \"text/html; charset=UTF-8\"\n// getting value from response headers\n$response->getHeaderLine('My-Custom-Header'); // will return:  \"My Custom Message; The second message\"\n```\n\n#### Getting array of value from a header (also applies to request)\n```php\n// getting value from request headers\n$request->getHeader('Content-Type'); // will return: [\"text/html\", \"charset=UTF-8\"]\n// getting value from response headers\n$response->getHeader('My-Custom-Header'); // will return:  [\"My Custom Message\",  \"The second message\"]\n```\n\n#### Removing headers from HTTP Messages\n```php\n// removing a header from Request, removing deprecated \"Content-MD5\" header\n$request->withoutHeader('Content-MD5'); \n\n// removing a header from Response\n// effect: the browser won't know the size of the stream\n// the browser will download the stream till it ends\n$response->withoutHeader('Content-Length');\n```\n\n### Working with HTTP Message Body\n\nWhen working with the PSR-7 there are two methods of implementation:\n#### 1. Getting the body separately\n\n> 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.\n\n```php\n$body = $response->getBody();\n// operations on body, eg. read, write, seek\n// ...\n// replacing the old body\n$response->withBody($body); \n// this last statement is optional as we working with objects\n// in this case the \"new\" body is same with the \"old\" one\n// the $body variable has the same value as the one in $request, only the reference is passed\n```\n\n#### 2. Working directly on response\n\n> This method is useful when only performing few operations as the `$request->getBody()` statement fragment is required\n\n```php\n$response->getBody()->write('hello');\n```\n\n### Getting the body contents\n\nThe following snippet gets the contents of a stream contents.\n> 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.\n```php \n$body = $response->getBody();\n$body->rewind(); // or $body->seek(0);\n$bodyText = $body->getContents();\n```\n> 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.\n\n### Append to body\n\n```php\n$response->getBody()->write('Hello'); // writing directly\n$body = $request->getBody(); // which is a `StreamInterface`\n$body->write('xxxxx');\n```\n\n### Prepend to body\nPrepending is different when it comes to streams. The content must be copied before writing the content to be prepended.\nThe following example will explain the behaviour of streams.\n\n```php\n// assuming our response is initially empty\n$body = $repsonse->getBody();\n// writing the string \"abcd\"\n$body->write('abcd');\n\n// seeking to start of stream\n$body->seek(0);\n// writing 'ef'\n$body->write('ef'); // at this point the stream contains \"efcd\"\n```\n\n#### Prepending by rewriting separately\n\n```php\n// assuming our response body stream only contains: \"abcd\"\n$body = $response->getBody();\n$body->rewind();\n$contents = $body->getContents(); // abcd\n// seeking the stream to beginning\n$body->rewind();\n$body->write('ef'); // stream contains \"efcd\"\n$body->write($contents); // stream contains \"efabcd\"\n```\n\n> 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)`.\n\n#### Prepending by using contents as a string\n```php\n$body = $response->getBody();\n$body->rewind();\n$contents = $body->getContents(); // efabcd\n$contents = 'ef'.$contents;\n$body->rewind();\n$body->write($contents);\n```\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/src/MessageInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * HTTP messages consist of requests from a client to a server and responses\n * from a server to a client. This interface defines the methods common to\n * each.\n *\n * Messages are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n *\n * @link http://www.ietf.org/rfc/rfc7230.txt\n * @link http://www.ietf.org/rfc/rfc7231.txt\n */\ninterface MessageInterface\n{\n    /**\n     * Retrieves the HTTP protocol version as a string.\n     *\n     * The string MUST contain only the HTTP version number (e.g., \"1.1\", \"1.0\").\n     *\n     * @return string HTTP protocol version.\n     */\n    public function getProtocolVersion(): string;\n\n    /**\n     * Return an instance with the specified HTTP protocol version.\n     *\n     * The version string MUST contain only the HTTP version number (e.g.,\n     * \"1.1\", \"1.0\").\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new protocol version.\n     *\n     * @param string $version HTTP protocol version\n     * @return static\n     */\n    public function withProtocolVersion(string $version): MessageInterface;\n\n    /**\n     * Retrieves all message header values.\n     *\n     * The keys represent the header name as it will be sent over the wire, and\n     * each value is an array of strings associated with the header.\n     *\n     *     // Represent the headers as a string\n     *     foreach ($message->getHeaders() as $name => $values) {\n     *         echo $name . \": \" . implode(\", \", $values);\n     *     }\n     *\n     *     // Emit headers iteratively:\n     *     foreach ($message->getHeaders() as $name => $values) {\n     *         foreach ($values as $value) {\n     *             header(sprintf('%s: %s', $name, $value), false);\n     *         }\n     *     }\n     *\n     * While header names are not case-sensitive, getHeaders() will preserve the\n     * exact case in which headers were originally specified.\n     *\n     * @return string[][] Returns an associative array of the message's headers. Each\n     *     key MUST be a header name, and each value MUST be an array of strings\n     *     for that header.\n     */\n    public function getHeaders(): array;\n\n    /**\n     * Checks if a header exists by the given case-insensitive name.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return bool Returns true if any header names match the given header\n     *     name using a case-insensitive string comparison. Returns false if\n     *     no matching header name is found in the message.\n     */\n    public function hasHeader(string $name): bool;\n\n    /**\n     * Retrieves a message header value by the given case-insensitive name.\n     *\n     * This method returns an array of all the header values of the given\n     * case-insensitive header name.\n     *\n     * If the header does not appear in the message, this method MUST return an\n     * empty array.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return string[] An array of string values as provided for the given\n     *    header. If the header does not appear in the message, this method MUST\n     *    return an empty array.\n     */\n    public function getHeader(string $name): array;\n\n    /**\n     * Retrieves a comma-separated string of the values for a single header.\n     *\n     * This method returns all of the header values of the given\n     * case-insensitive header name as a string concatenated together using\n     * a comma.\n     *\n     * NOTE: Not all header values may be appropriately represented using\n     * comma concatenation. For such headers, use getHeader() instead\n     * and supply your own delimiter when concatenating.\n     *\n     * If the header does not appear in the message, this method MUST return\n     * an empty string.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return string A string of values as provided for the given header\n     *    concatenated together using a comma. If the header does not appear in\n     *    the message, this method MUST return an empty string.\n     */\n    public function getHeaderLine(string $name): string;\n\n    /**\n     * Return an instance with the provided value replacing the specified header.\n     *\n     * While header names are case-insensitive, the casing of the header will\n     * be preserved by this function, and returned from getHeaders().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new and/or updated header and value.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @param string|string[] $value Header value(s).\n     * @return static\n     * @throws \\InvalidArgumentException for invalid header names or values.\n     */\n    public function withHeader(string $name, $value): MessageInterface;\n\n    /**\n     * Return an instance with the specified header appended with the given value.\n     *\n     * Existing values for the specified header will be maintained. The new\n     * value(s) will be appended to the existing list. If the header did not\n     * exist previously, it will be added.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new header and/or value.\n     *\n     * @param string $name Case-insensitive header field name to add.\n     * @param string|string[] $value Header value(s).\n     * @return static\n     * @throws \\InvalidArgumentException for invalid header names or values.\n     */\n    public function withAddedHeader(string $name, $value): MessageInterface;\n\n    /**\n     * Return an instance without the specified header.\n     *\n     * Header resolution MUST be done without case-sensitivity.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that removes\n     * the named header.\n     *\n     * @param string $name Case-insensitive header field name to remove.\n     * @return static\n     */\n    public function withoutHeader(string $name): MessageInterface;\n\n    /**\n     * Gets the body of the message.\n     *\n     * @return StreamInterface Returns the body as a stream.\n     */\n    public function getBody(): StreamInterface;\n\n    /**\n     * Return an instance with the specified message body.\n     *\n     * The body MUST be a StreamInterface object.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return a new instance that has the\n     * new body stream.\n     *\n     * @param StreamInterface $body Body.\n     * @return static\n     * @throws \\InvalidArgumentException When the body is not valid.\n     */\n    public function withBody(StreamInterface $body): MessageInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/src/RequestInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Representation of an outgoing, client-side request.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - HTTP method\n * - URI\n * - Headers\n * - Message body\n *\n * During construction, implementations MUST attempt to set the Host header from\n * a provided URI if no Host header is provided.\n *\n * Requests are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n */\ninterface RequestInterface extends MessageInterface\n{\n    /**\n     * Retrieves the message's request target.\n     *\n     * Retrieves the message's request-target either as it will appear (for\n     * clients), as it appeared at request (for servers), or as it was\n     * specified for the instance (see withRequestTarget()).\n     *\n     * In most cases, this will be the origin-form of the composed URI,\n     * unless a value was provided to the concrete implementation (see\n     * withRequestTarget() below).\n     *\n     * If no URI is available, and no request-target has been specifically\n     * provided, this method MUST return the string \"/\".\n     *\n     * @return string\n     */\n    public function getRequestTarget(): string;\n\n    /**\n     * Return an instance with the specific request-target.\n     *\n     * If the request needs a non-origin-form request-target — e.g., for\n     * specifying an absolute-form, authority-form, or asterisk-form —\n     * this method may be used to create an instance with the specified\n     * request-target, verbatim.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * changed request target.\n     *\n     * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various\n     *     request-target forms allowed in request messages)\n     * @param string $requestTarget\n     * @return static\n     */\n    public function withRequestTarget(string $requestTarget): RequestInterface;\n\n\n    /**\n     * Retrieves the HTTP method of the request.\n     *\n     * @return string Returns the request method.\n     */\n    public function getMethod(): string;\n\n    /**\n     * Return an instance with the provided HTTP method.\n     *\n     * While HTTP method names are typically all uppercase characters, HTTP\n     * method names are case-sensitive and thus implementations SHOULD NOT\n     * modify the given string.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * changed request method.\n     *\n     * @param string $method Case-sensitive method.\n     * @return static\n     * @throws \\InvalidArgumentException for invalid HTTP methods.\n     */\n    public function withMethod(string $method): RequestInterface;\n\n    /**\n     * Retrieves the URI instance.\n     *\n     * This method MUST return a UriInterface instance.\n     *\n     * @link http://tools.ietf.org/html/rfc3986#section-4.3\n     * @return UriInterface Returns a UriInterface instance\n     *     representing the URI of the request.\n     */\n    public function getUri(): UriInterface;\n\n    /**\n     * Returns an instance with the provided URI.\n     *\n     * This method MUST update the Host header of the returned request by\n     * default if the URI contains a host component. If the URI does not\n     * contain a host component, any pre-existing Host header MUST be carried\n     * over to the returned request.\n     *\n     * You can opt-in to preserving the original state of the Host header by\n     * setting `$preserveHost` to `true`. When `$preserveHost` is set to\n     * `true`, this method interacts with the Host header in the following ways:\n     *\n     * - If the Host header is missing or empty, and the new URI contains\n     *   a host component, this method MUST update the Host header in the returned\n     *   request.\n     * - If the Host header is missing or empty, and the new URI does not contain a\n     *   host component, this method MUST NOT update the Host header in the returned\n     *   request.\n     * - If a Host header is present and non-empty, this method MUST NOT update\n     *   the Host header in the returned request.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new UriInterface instance.\n     *\n     * @link http://tools.ietf.org/html/rfc3986#section-4.3\n     * @param UriInterface $uri New request URI to use.\n     * @param bool $preserveHost Preserve the original state of the Host header.\n     * @return static\n     */\n    public function withUri(UriInterface $uri, bool $preserveHost = false): RequestInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/src/ResponseInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Representation of an outgoing, server-side response.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - Status code and reason phrase\n * - Headers\n * - Message body\n *\n * Responses are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n */\ninterface ResponseInterface extends MessageInterface\n{\n    /**\n     * Gets the response status code.\n     *\n     * The status code is a 3-digit integer result code of the server's attempt\n     * to understand and satisfy the request.\n     *\n     * @return int Status code.\n     */\n    public function getStatusCode(): int;\n\n    /**\n     * Return an instance with the specified status code and, optionally, reason phrase.\n     *\n     * If no reason phrase is specified, implementations MAY choose to default\n     * to the RFC 7231 or IANA recommended reason phrase for the response's\n     * status code.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated status and reason phrase.\n     *\n     * @link http://tools.ietf.org/html/rfc7231#section-6\n     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n     * @param int $code The 3-digit integer result code to set.\n     * @param string $reasonPhrase The reason phrase to use with the\n     *     provided status code; if none is provided, implementations MAY\n     *     use the defaults as suggested in the HTTP specification.\n     * @return static\n     * @throws \\InvalidArgumentException For invalid status code arguments.\n     */\n    public function withStatus(int $code, string $reasonPhrase = ''): ResponseInterface;\n\n    /**\n     * Gets the response reason phrase associated with the status code.\n     *\n     * Because a reason phrase is not a required element in a response\n     * status line, the reason phrase value MAY be null. Implementations MAY\n     * choose to return the default RFC 7231 recommended reason phrase (or those\n     * listed in the IANA HTTP Status Code Registry) for the response's\n     * status code.\n     *\n     * @link http://tools.ietf.org/html/rfc7231#section-6\n     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n     * @return string Reason phrase; must return an empty string if none present.\n     */\n    public function getReasonPhrase(): string;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/src/ServerRequestInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Representation of an incoming, server-side HTTP request.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - HTTP method\n * - URI\n * - Headers\n * - Message body\n *\n * Additionally, it encapsulates all data as it has arrived to the\n * application from the CGI and/or PHP environment, including:\n *\n * - The values represented in $_SERVER.\n * - Any cookies provided (generally via $_COOKIE)\n * - Query string arguments (generally via $_GET, or as parsed via parse_str())\n * - Upload files, if any (as represented by $_FILES)\n * - Deserialized body parameters (generally from $_POST)\n *\n * $_SERVER values MUST be treated as immutable, as they represent application\n * state at the time of request; as such, no methods are provided to allow\n * modification of those values. The other values provide such methods, as they\n * can be restored from $_SERVER or the request body, and may need treatment\n * during the application (e.g., body parameters may be deserialized based on\n * content type).\n *\n * Additionally, this interface recognizes the utility of introspecting a\n * request to derive and match additional parameters (e.g., via URI path\n * matching, decrypting cookie values, deserializing non-form-encoded body\n * content, matching authorization headers to users, etc). These parameters\n * are stored in an \"attributes\" property.\n *\n * Requests are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n */\ninterface ServerRequestInterface extends RequestInterface\n{\n    /**\n     * Retrieve server parameters.\n     *\n     * Retrieves data related to the incoming request environment,\n     * typically derived from PHP's $_SERVER superglobal. The data IS NOT\n     * REQUIRED to originate from $_SERVER.\n     *\n     * @return array\n     */\n    public function getServerParams(): array;\n\n    /**\n     * Retrieve cookies.\n     *\n     * Retrieves cookies sent by the client to the server.\n     *\n     * The data MUST be compatible with the structure of the $_COOKIE\n     * superglobal.\n     *\n     * @return array\n     */\n    public function getCookieParams(): array;\n\n    /**\n     * Return an instance with the specified cookies.\n     *\n     * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST\n     * be compatible with the structure of $_COOKIE. Typically, this data will\n     * be injected at instantiation.\n     *\n     * This method MUST NOT update the related Cookie header of the request\n     * instance, nor related values in the server params.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated cookie values.\n     *\n     * @param array $cookies Array of key/value pairs representing cookies.\n     * @return static\n     */\n    public function withCookieParams(array $cookies): ServerRequestInterface;\n\n    /**\n     * Retrieve query string arguments.\n     *\n     * Retrieves the deserialized query string arguments, if any.\n     *\n     * Note: the query params might not be in sync with the URI or server\n     * params. If you need to ensure you are only getting the original\n     * values, you may need to parse the query string from `getUri()->getQuery()`\n     * or from the `QUERY_STRING` server param.\n     *\n     * @return array\n     */\n    public function getQueryParams(): array;\n\n    /**\n     * Return an instance with the specified query string arguments.\n     *\n     * These values SHOULD remain immutable over the course of the incoming\n     * request. They MAY be injected during instantiation, such as from PHP's\n     * $_GET superglobal, or MAY be derived from some other value such as the\n     * URI. In cases where the arguments are parsed from the URI, the data\n     * MUST be compatible with what PHP's parse_str() would return for\n     * purposes of how duplicate query parameters are handled, and how nested\n     * sets are handled.\n     *\n     * Setting query string arguments MUST NOT change the URI stored by the\n     * request, nor the values in the server params.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated query string arguments.\n     *\n     * @param array $query Array of query string arguments, typically from\n     *     $_GET.\n     * @return static\n     */\n    public function withQueryParams(array $query): ServerRequestInterface;\n\n    /**\n     * Retrieve normalized file upload data.\n     *\n     * This method returns upload metadata in a normalized tree, with each leaf\n     * an instance of Psr\\Http\\Message\\UploadedFileInterface.\n     *\n     * These values MAY be prepared from $_FILES or the message body during\n     * instantiation, or MAY be injected via withUploadedFiles().\n     *\n     * @return array An array tree of UploadedFileInterface instances; an empty\n     *     array MUST be returned if no data is present.\n     */\n    public function getUploadedFiles(): array;\n\n    /**\n     * Create a new instance with the specified uploaded files.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated body parameters.\n     *\n     * @param array $uploadedFiles An array tree of UploadedFileInterface instances.\n     * @return static\n     * @throws \\InvalidArgumentException if an invalid structure is provided.\n     */\n    public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface;\n\n    /**\n     * Retrieve any parameters provided in the request body.\n     *\n     * If the request Content-Type is either application/x-www-form-urlencoded\n     * or multipart/form-data, and the request method is POST, this method MUST\n     * return the contents of $_POST.\n     *\n     * Otherwise, this method may return any results of deserializing\n     * the request body content; as parsing returns structured content, the\n     * potential types MUST be arrays or objects only. A null value indicates\n     * the absence of body content.\n     *\n     * @return null|array|object The deserialized body parameters, if any.\n     *     These will typically be an array or object.\n     */\n    public function getParsedBody();\n\n    /**\n     * Return an instance with the specified body parameters.\n     *\n     * These MAY be injected during instantiation.\n     *\n     * If the request Content-Type is either application/x-www-form-urlencoded\n     * or multipart/form-data, and the request method is POST, use this method\n     * ONLY to inject the contents of $_POST.\n     *\n     * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of\n     * deserializing the request body content. Deserialization/parsing returns\n     * structured data, and, as such, this method ONLY accepts arrays or objects,\n     * or a null value if nothing was available to parse.\n     *\n     * As an example, if content negotiation determines that the request data\n     * is a JSON payload, this method could be used to create a request\n     * instance with the deserialized parameters.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated body parameters.\n     *\n     * @param null|array|object $data The deserialized body data. This will\n     *     typically be in an array or object.\n     * @return static\n     * @throws \\InvalidArgumentException if an unsupported argument type is\n     *     provided.\n     */\n    public function withParsedBody($data): ServerRequestInterface;\n\n    /**\n     * Retrieve attributes derived from the request.\n     *\n     * The request \"attributes\" may be used to allow injection of any\n     * parameters derived from the request: e.g., the results of path\n     * match operations; the results of decrypting cookies; the results of\n     * deserializing non-form-encoded message bodies; etc. Attributes\n     * will be application and request specific, and CAN be mutable.\n     *\n     * @return array Attributes derived from the request.\n     */\n    public function getAttributes(): array;\n\n    /**\n     * Retrieve a single derived request attribute.\n     *\n     * Retrieves a single derived request attribute as described in\n     * getAttributes(). If the attribute has not been previously set, returns\n     * the default value as provided.\n     *\n     * This method obviates the need for a hasAttribute() method, as it allows\n     * specifying a default value to return if the attribute is not found.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @param mixed $default Default value to return if the attribute does not exist.\n     * @return mixed\n     */\n    public function getAttribute(string $name, $default = null);\n\n    /**\n     * Return an instance with the specified derived request attribute.\n     *\n     * This method allows setting a single derived request attribute as\n     * described in getAttributes().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated attribute.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @param mixed $value The value of the attribute.\n     * @return static\n     */\n    public function withAttribute(string $name, $value): ServerRequestInterface;\n\n    /**\n     * Return an instance that removes the specified derived request attribute.\n     *\n     * This method allows removing a single derived request attribute as\n     * described in getAttributes().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that removes\n     * the attribute.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @return static\n     */\n    public function withoutAttribute(string $name): ServerRequestInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/src/StreamInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Describes a data stream.\n *\n * Typically, an instance will wrap a PHP stream; this interface provides\n * a wrapper around the most common operations, including serialization of\n * the entire stream to a string.\n */\ninterface StreamInterface\n{\n    /**\n     * Reads all data from the stream into a string, from the beginning to end.\n     *\n     * This method MUST attempt to seek to the beginning of the stream before\n     * reading data and read the stream until the end is reached.\n     *\n     * Warning: This could attempt to load a large amount of data into memory.\n     *\n     * This method MUST NOT raise an exception in order to conform with PHP's\n     * string casting operations.\n     *\n     * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring\n     * @return string\n     */\n    public function __toString(): string;\n\n    /**\n     * Closes the stream and any underlying resources.\n     *\n     * @return void\n     */\n    public function close(): void;\n\n    /**\n     * Separates any underlying resources from the stream.\n     *\n     * After the stream has been detached, the stream is in an unusable state.\n     *\n     * @return resource|null Underlying PHP stream, if any\n     */\n    public function detach();\n\n    /**\n     * Get the size of the stream if known.\n     *\n     * @return int|null Returns the size in bytes if known, or null if unknown.\n     */\n    public function getSize(): ?int;\n\n    /**\n     * Returns the current position of the file read/write pointer\n     *\n     * @return int Position of the file pointer\n     * @throws \\RuntimeException on error.\n     */\n    public function tell(): int;\n\n    /**\n     * Returns true if the stream is at the end of the stream.\n     *\n     * @return bool\n     */\n    public function eof(): bool;\n\n    /**\n     * Returns whether or not the stream is seekable.\n     *\n     * @return bool\n     */\n    public function isSeekable(): bool;\n\n    /**\n     * Seek to a position in the stream.\n     *\n     * @link http://www.php.net/manual/en/function.fseek.php\n     * @param int $offset Stream offset\n     * @param int $whence Specifies how the cursor position will be calculated\n     *     based on the seek offset. Valid values are identical to the built-in\n     *     PHP $whence values for `fseek()`.  SEEK_SET: Set position equal to\n     *     offset bytes SEEK_CUR: Set position to current location plus offset\n     *     SEEK_END: Set position to end-of-stream plus offset.\n     * @throws \\RuntimeException on failure.\n     */\n    public function seek(int $offset, int $whence = SEEK_SET): void;\n\n    /**\n     * Seek to the beginning of the stream.\n     *\n     * If the stream is not seekable, this method will raise an exception;\n     * otherwise, it will perform a seek(0).\n     *\n     * @see seek()\n     * @link http://www.php.net/manual/en/function.fseek.php\n     * @throws \\RuntimeException on failure.\n     */\n    public function rewind(): void;\n\n    /**\n     * Returns whether or not the stream is writable.\n     *\n     * @return bool\n     */\n    public function isWritable(): bool;\n\n    /**\n     * Write data to the stream.\n     *\n     * @param string $string The string that is to be written.\n     * @return int Returns the number of bytes written to the stream.\n     * @throws \\RuntimeException on failure.\n     */\n    public function write(string $string): int;\n\n    /**\n     * Returns whether or not the stream is readable.\n     *\n     * @return bool\n     */\n    public function isReadable(): bool;\n\n    /**\n     * Read data from the stream.\n     *\n     * @param int $length Read up to $length bytes from the object and return\n     *     them. Fewer than $length bytes may be returned if underlying stream\n     *     call returns fewer bytes.\n     * @return string Returns the data read from the stream, or an empty string\n     *     if no bytes are available.\n     * @throws \\RuntimeException if an error occurs.\n     */\n    public function read(int $length): string;\n\n    /**\n     * Returns the remaining contents in a string\n     *\n     * @return string\n     * @throws \\RuntimeException if unable to read or an error occurs while\n     *     reading.\n     */\n    public function getContents(): string;\n\n    /**\n     * Get stream metadata as an associative array or retrieve a specific key.\n     *\n     * The keys returned are identical to the keys returned from PHP's\n     * stream_get_meta_data() function.\n     *\n     * @link http://php.net/manual/en/function.stream-get-meta-data.php\n     * @param string|null $key Specific metadata to retrieve.\n     * @return array|mixed|null Returns an associative array if no key is\n     *     provided. Returns a specific key value if a key is provided and the\n     *     value is found, or null if the key is not found.\n     */\n    public function getMetadata(?string $key = null);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/src/UploadedFileInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Value object representing a file uploaded through an HTTP request.\n *\n * Instances of this interface are considered immutable; all methods that\n * might change state MUST be implemented such that they retain the internal\n * state of the current instance and return an instance that contains the\n * changed state.\n */\ninterface UploadedFileInterface\n{\n    /**\n     * Retrieve a stream representing the uploaded file.\n     *\n     * This method MUST return a StreamInterface instance, representing the\n     * uploaded file. The purpose of this method is to allow utilizing native PHP\n     * stream functionality to manipulate the file upload, such as\n     * stream_copy_to_stream() (though the result will need to be decorated in a\n     * native PHP stream wrapper to work with such functions).\n     *\n     * If the moveTo() method has been called previously, this method MUST raise\n     * an exception.\n     *\n     * @return StreamInterface Stream representation of the uploaded file.\n     * @throws \\RuntimeException in cases when no stream is available or can be\n     *     created.\n     */\n    public function getStream(): StreamInterface;\n\n    /**\n     * Move the uploaded file to a new location.\n     *\n     * Use this method as an alternative to move_uploaded_file(). This method is\n     * guaranteed to work in both SAPI and non-SAPI environments.\n     * Implementations must determine which environment they are in, and use the\n     * appropriate method (move_uploaded_file(), rename(), or a stream\n     * operation) to perform the operation.\n     *\n     * $targetPath may be an absolute path, or a relative path. If it is a\n     * relative path, resolution should be the same as used by PHP's rename()\n     * function.\n     *\n     * The original file or stream MUST be removed on completion.\n     *\n     * If this method is called more than once, any subsequent calls MUST raise\n     * an exception.\n     *\n     * When used in an SAPI environment where $_FILES is populated, when writing\n     * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be\n     * used to ensure permissions and upload status are verified correctly.\n     *\n     * If you wish to move to a stream, use getStream(), as SAPI operations\n     * cannot guarantee writing to stream destinations.\n     *\n     * @see http://php.net/is_uploaded_file\n     * @see http://php.net/move_uploaded_file\n     * @param string $targetPath Path to which to move the uploaded file.\n     * @throws \\InvalidArgumentException if the $targetPath specified is invalid.\n     * @throws \\RuntimeException on any error during the move operation, or on\n     *     the second or subsequent call to the method.\n     */\n    public function moveTo(string $targetPath): void;\n    \n    /**\n     * Retrieve the file size.\n     *\n     * Implementations SHOULD return the value stored in the \"size\" key of\n     * the file in the $_FILES array if available, as PHP calculates this based\n     * on the actual size transmitted.\n     *\n     * @return int|null The file size in bytes or null if unknown.\n     */\n    public function getSize(): ?int;\n    \n    /**\n     * Retrieve the error associated with the uploaded file.\n     *\n     * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants.\n     *\n     * If the file was uploaded successfully, this method MUST return\n     * UPLOAD_ERR_OK.\n     *\n     * Implementations SHOULD return the value stored in the \"error\" key of\n     * the file in the $_FILES array.\n     *\n     * @see http://php.net/manual/en/features.file-upload.errors.php\n     * @return int One of PHP's UPLOAD_ERR_XXX constants.\n     */\n    public function getError(): int;\n    \n    /**\n     * Retrieve the filename sent by the client.\n     *\n     * Do not trust the value returned by this method. A client could send\n     * a malicious filename with the intention to corrupt or hack your\n     * application.\n     *\n     * Implementations SHOULD return the value stored in the \"name\" key of\n     * the file in the $_FILES array.\n     *\n     * @return string|null The filename sent by the client or null if none\n     *     was provided.\n     */\n    public function getClientFilename(): ?string;\n    \n    /**\n     * Retrieve the media type sent by the client.\n     *\n     * Do not trust the value returned by this method. A client could send\n     * a malicious media type with the intention to corrupt or hack your\n     * application.\n     *\n     * Implementations SHOULD return the value stored in the \"type\" key of\n     * the file in the $_FILES array.\n     *\n     * @return string|null The media type sent by the client or null if none\n     *     was provided.\n     */\n    public function getClientMediaType(): ?string;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/http-message/src/UriInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Value object representing a URI.\n *\n * This interface is meant to represent URIs according to RFC 3986 and to\n * provide methods for most common operations. Additional functionality for\n * working with URIs can be provided on top of the interface or externally.\n * Its primary use is for HTTP requests, but may also be used in other\n * contexts.\n *\n * Instances of this interface are considered immutable; all methods that\n * might change state MUST be implemented such that they retain the internal\n * state of the current instance and return an instance that contains the\n * changed state.\n *\n * Typically the Host header will be also be present in the request message.\n * For server-side requests, the scheme will typically be discoverable in the\n * server parameters.\n *\n * @link http://tools.ietf.org/html/rfc3986 (the URI specification)\n */\ninterface UriInterface\n{\n    /**\n     * Retrieve the scheme component of the URI.\n     *\n     * If no scheme is present, this method MUST return an empty string.\n     *\n     * The value returned MUST be normalized to lowercase, per RFC 3986\n     * Section 3.1.\n     *\n     * The trailing \":\" character is not part of the scheme and MUST NOT be\n     * added.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-3.1\n     * @return string The URI scheme.\n     */\n    public function getScheme(): string;\n\n    /**\n     * Retrieve the authority component of the URI.\n     *\n     * If no authority information is present, this method MUST return an empty\n     * string.\n     *\n     * The authority syntax of the URI is:\n     *\n     * <pre>\n     * [user-info@]host[:port]\n     * </pre>\n     *\n     * If the port component is not set or is the standard port for the current\n     * scheme, it SHOULD NOT be included.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-3.2\n     * @return string The URI authority, in \"[user-info@]host[:port]\" format.\n     */\n    public function getAuthority(): string;\n\n    /**\n     * Retrieve the user information component of the URI.\n     *\n     * If no user information is present, this method MUST return an empty\n     * string.\n     *\n     * If a user is present in the URI, this will return that value;\n     * additionally, if the password is also present, it will be appended to the\n     * user value, with a colon (\":\") separating the values.\n     *\n     * The trailing \"@\" character is not part of the user information and MUST\n     * NOT be added.\n     *\n     * @return string The URI user information, in \"username[:password]\" format.\n     */\n    public function getUserInfo(): string;\n\n    /**\n     * Retrieve the host component of the URI.\n     *\n     * If no host is present, this method MUST return an empty string.\n     *\n     * The value returned MUST be normalized to lowercase, per RFC 3986\n     * Section 3.2.2.\n     *\n     * @see http://tools.ietf.org/html/rfc3986#section-3.2.2\n     * @return string The URI host.\n     */\n    public function getHost(): string;\n\n    /**\n     * Retrieve the port component of the URI.\n     *\n     * If a port is present, and it is non-standard for the current scheme,\n     * this method MUST return it as an integer. If the port is the standard port\n     * used with the current scheme, this method SHOULD return null.\n     *\n     * If no port is present, and no scheme is present, this method MUST return\n     * a null value.\n     *\n     * If no port is present, but a scheme is present, this method MAY return\n     * the standard port for that scheme, but SHOULD return null.\n     *\n     * @return null|int The URI port.\n     */\n    public function getPort(): ?int;\n\n    /**\n     * Retrieve the path component of the URI.\n     *\n     * The path can either be empty or absolute (starting with a slash) or\n     * rootless (not starting with a slash). Implementations MUST support all\n     * three syntaxes.\n     *\n     * Normally, the empty path \"\" and absolute path \"/\" are considered equal as\n     * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically\n     * do this normalization because in contexts with a trimmed base path, e.g.\n     * the front controller, this difference becomes significant. It's the task\n     * of the user to handle both \"\" and \"/\".\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.3.\n     *\n     * As an example, if the value should include a slash (\"/\") not intended as\n     * delimiter between path segments, that value MUST be passed in encoded\n     * form (e.g., \"%2F\") to the instance.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-2\n     * @see https://tools.ietf.org/html/rfc3986#section-3.3\n     * @return string The URI path.\n     */\n    public function getPath(): string;\n\n    /**\n     * Retrieve the query string of the URI.\n     *\n     * If no query string is present, this method MUST return an empty string.\n     *\n     * The leading \"?\" character is not part of the query and MUST NOT be\n     * added.\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.4.\n     *\n     * As an example, if a value in a key/value pair of the query string should\n     * include an ampersand (\"&\") not intended as a delimiter between values,\n     * that value MUST be passed in encoded form (e.g., \"%26\") to the instance.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-2\n     * @see https://tools.ietf.org/html/rfc3986#section-3.4\n     * @return string The URI query string.\n     */\n    public function getQuery(): string;\n\n    /**\n     * Retrieve the fragment component of the URI.\n     *\n     * If no fragment is present, this method MUST return an empty string.\n     *\n     * The leading \"#\" character is not part of the fragment and MUST NOT be\n     * added.\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.5.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-2\n     * @see https://tools.ietf.org/html/rfc3986#section-3.5\n     * @return string The URI fragment.\n     */\n    public function getFragment(): string;\n\n    /**\n     * Return an instance with the specified scheme.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified scheme.\n     *\n     * Implementations MUST support the schemes \"http\" and \"https\" case\n     * insensitively, and MAY accommodate other schemes if required.\n     *\n     * An empty scheme is equivalent to removing the scheme.\n     *\n     * @param string $scheme The scheme to use with the new instance.\n     * @return static A new instance with the specified scheme.\n     * @throws \\InvalidArgumentException for invalid or unsupported schemes.\n     */\n    public function withScheme(string $scheme): UriInterface;\n\n    /**\n     * Return an instance with the specified user information.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified user information.\n     *\n     * Password is optional, but the user information MUST include the\n     * user; an empty string for the user is equivalent to removing user\n     * information.\n     *\n     * @param string $user The user name to use for authority.\n     * @param null|string $password The password associated with $user.\n     * @return static A new instance with the specified user information.\n     */\n    public function withUserInfo(string $user, ?string $password = null): UriInterface;\n\n    /**\n     * Return an instance with the specified host.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified host.\n     *\n     * An empty host value is equivalent to removing the host.\n     *\n     * @param string $host The hostname to use with the new instance.\n     * @return static A new instance with the specified host.\n     * @throws \\InvalidArgumentException for invalid hostnames.\n     */\n    public function withHost(string $host): UriInterface;\n\n    /**\n     * Return an instance with the specified port.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified port.\n     *\n     * Implementations MUST raise an exception for ports outside the\n     * established TCP and UDP port ranges.\n     *\n     * A null value provided for the port is equivalent to removing the port\n     * information.\n     *\n     * @param null|int $port The port to use with the new instance; a null value\n     *     removes the port information.\n     * @return static A new instance with the specified port.\n     * @throws \\InvalidArgumentException for invalid ports.\n     */\n    public function withPort(?int $port): UriInterface;\n\n    /**\n     * Return an instance with the specified path.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified path.\n     *\n     * The path can either be empty or absolute (starting with a slash) or\n     * rootless (not starting with a slash). Implementations MUST support all\n     * three syntaxes.\n     *\n     * If the path is intended to be domain-relative rather than path relative then\n     * it must begin with a slash (\"/\"). Paths not starting with a slash (\"/\")\n     * are assumed to be relative to some base path known to the application or\n     * consumer.\n     *\n     * Users can provide both encoded and decoded path characters.\n     * Implementations ensure the correct encoding as outlined in getPath().\n     *\n     * @param string $path The path to use with the new instance.\n     * @return static A new instance with the specified path.\n     * @throws \\InvalidArgumentException for invalid paths.\n     */\n    public function withPath(string $path): UriInterface;\n\n    /**\n     * Return an instance with the specified query string.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified query string.\n     *\n     * Users can provide both encoded and decoded query characters.\n     * Implementations ensure the correct encoding as outlined in getQuery().\n     *\n     * An empty query string value is equivalent to removing the query string.\n     *\n     * @param string $query The query string to use with the new instance.\n     * @return static A new instance with the specified query string.\n     * @throws \\InvalidArgumentException for invalid query strings.\n     */\n    public function withQuery(string $query): UriInterface;\n\n    /**\n     * Return an instance with the specified URI fragment.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified URI fragment.\n     *\n     * Users can provide both encoded and decoded fragment characters.\n     * Implementations ensure the correct encoding as outlined in getFragment().\n     *\n     * An empty fragment value is equivalent to removing the fragment.\n     *\n     * @param string $fragment The fragment to use with the new instance.\n     * @return static A new instance with the specified fragment.\n     */\n    public function withFragment(string $fragment): UriInterface;\n\n    /**\n     * Return the string representation as a URI reference.\n     *\n     * Depending on which components of the URI are present, the resulting\n     * string is either a full URI or relative reference according to RFC 3986,\n     * Section 4.1. The method concatenates the various components of the URI,\n     * using the appropriate delimiters:\n     *\n     * - If a scheme is present, it MUST be suffixed by \":\".\n     * - If an authority is present, it MUST be prefixed by \"//\".\n     * - The path can be concatenated without delimiters. But there are two\n     *   cases where the path has to be adjusted to make the URI reference\n     *   valid as PHP does not allow to throw an exception in __toString():\n     *     - If the path is rootless and an authority is present, the path MUST\n     *       be prefixed by \"/\".\n     *     - If the path is starting with more than one \"/\" and no authority is\n     *       present, the starting slashes MUST be reduced to one.\n     * - If a query is present, it MUST be prefixed by \"?\".\n     * - If a fragment is present, it MUST be prefixed by \"#\".\n     *\n     * @see http://tools.ietf.org/html/rfc3986#section-4.1\n     * @return string\n     */\n    public function __toString(): string;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/log/LICENSE",
    "content": "Copyright (c) 2012 PHP Framework Interoperability Group\n\nPermission is hereby granted, free of charge, to any person obtaining a copy \nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights \nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in \nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/log/README.md",
    "content": "PSR Log\n=======\n\nThis repository holds all interfaces/classes/traits related to\n[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md).\n\nNote that this is not a logger of its own. It is merely an interface that\ndescribes a logger. See the specification for more details.\n\nInstallation\n------------\n\n```bash\ncomposer require psr/log\n```\n\nUsage\n-----\n\nIf you need a logger, you can use the interface like this:\n\n```php\n<?php\n\nuse Psr\\Log\\LoggerInterface;\n\nclass Foo\n{\n    private $logger;\n\n    public function __construct(LoggerInterface $logger = null)\n    {\n        $this->logger = $logger;\n    }\n\n    public function doSomething()\n    {\n        if ($this->logger) {\n            $this->logger->info('Doing work');\n        }\n           \n        try {\n            $this->doSomethingElse();\n        } catch (Exception $exception) {\n            $this->logger->error('Oh no!', array('exception' => $exception));\n        }\n\n        // do something useful\n    }\n}\n```\n\nYou can then pick one of the implementations of the interface to get a logger.\n\nIf you want to implement the interface, you can require this package and\nimplement `Psr\\Log\\LoggerInterface` in your code. Please read the\n[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)\nfor details.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/log/composer.json",
    "content": "{\n    \"name\": \"psr/log\",\n    \"description\": \"Common interface for logging libraries\",\n    \"keywords\": [\"psr\", \"psr-3\", \"log\"],\n    \"homepage\": \"https://github.com/php-fig/log\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"https://www.php-fig.org/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.0.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\Log\\\\\": \"src\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"3.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/log/src/AbstractLogger.php",
    "content": "<?php\n\nnamespace Psr\\Log;\n\n/**\n * This is a simple Logger implementation that other Loggers can inherit from.\n *\n * It simply delegates all log-level-specific methods to the `log` method to\n * reduce boilerplate code that a simple Logger that does the same thing with\n * messages regardless of the error level has to implement.\n */\nabstract class AbstractLogger implements LoggerInterface\n{\n    use LoggerTrait;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/log/src/InvalidArgumentException.php",
    "content": "<?php\n\nnamespace Psr\\Log;\n\nclass InvalidArgumentException extends \\InvalidArgumentException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/log/src/LogLevel.php",
    "content": "<?php\n\nnamespace Psr\\Log;\n\n/**\n * Describes log levels.\n */\nclass LogLevel\n{\n    const EMERGENCY = 'emergency';\n    const ALERT     = 'alert';\n    const CRITICAL  = 'critical';\n    const ERROR     = 'error';\n    const WARNING   = 'warning';\n    const NOTICE    = 'notice';\n    const INFO      = 'info';\n    const DEBUG     = 'debug';\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/log/src/LoggerAwareInterface.php",
    "content": "<?php\n\nnamespace Psr\\Log;\n\n/**\n * Describes a logger-aware instance.\n */\ninterface LoggerAwareInterface\n{\n    /**\n     * Sets a logger instance on the object.\n     *\n     * @param LoggerInterface $logger\n     *\n     * @return void\n     */\n    public function setLogger(LoggerInterface $logger): void;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/log/src/LoggerAwareTrait.php",
    "content": "<?php\n\nnamespace Psr\\Log;\n\n/**\n * Basic Implementation of LoggerAwareInterface.\n */\ntrait LoggerAwareTrait\n{\n    /**\n     * The logger instance.\n     *\n     * @var LoggerInterface|null\n     */\n    protected ?LoggerInterface $logger = null;\n\n    /**\n     * Sets a logger.\n     *\n     * @param LoggerInterface $logger\n     */\n    public function setLogger(LoggerInterface $logger): void\n    {\n        $this->logger = $logger;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/log/src/LoggerInterface.php",
    "content": "<?php\n\nnamespace Psr\\Log;\n\n/**\n * Describes a logger instance.\n *\n * The message MUST be a string or object implementing __toString().\n *\n * The message MAY contain placeholders in the form: {foo} where foo\n * will be replaced by the context data in key \"foo\".\n *\n * The context array can contain arbitrary data. The only assumption that\n * can be made by implementors is that if an Exception instance is given\n * to produce a stack trace, it MUST be in a key named \"exception\".\n *\n * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md\n * for the full interface specification.\n */\ninterface LoggerInterface\n{\n    /**\n     * System is unusable.\n     *\n     * @param string|\\Stringable $message\n     * @param mixed[] $context\n     *\n     * @return void\n     */\n    public function emergency(string|\\Stringable $message, array $context = []): void;\n\n    /**\n     * Action must be taken immediately.\n     *\n     * Example: Entire website down, database unavailable, etc. This should\n     * trigger the SMS alerts and wake you up.\n     *\n     * @param string|\\Stringable $message\n     * @param mixed[] $context\n     *\n     * @return void\n     */\n    public function alert(string|\\Stringable $message, array $context = []): void;\n\n    /**\n     * Critical conditions.\n     *\n     * Example: Application component unavailable, unexpected exception.\n     *\n     * @param string|\\Stringable $message\n     * @param mixed[] $context\n     *\n     * @return void\n     */\n    public function critical(string|\\Stringable $message, array $context = []): void;\n\n    /**\n     * Runtime errors that do not require immediate action but should typically\n     * be logged and monitored.\n     *\n     * @param string|\\Stringable $message\n     * @param mixed[] $context\n     *\n     * @return void\n     */\n    public function error(string|\\Stringable $message, array $context = []): void;\n\n    /**\n     * Exceptional occurrences that are not errors.\n     *\n     * Example: Use of deprecated APIs, poor use of an API, undesirable things\n     * that are not necessarily wrong.\n     *\n     * @param string|\\Stringable $message\n     * @param mixed[] $context\n     *\n     * @return void\n     */\n    public function warning(string|\\Stringable $message, array $context = []): void;\n\n    /**\n     * Normal but significant events.\n     *\n     * @param string|\\Stringable $message\n     * @param mixed[] $context\n     *\n     * @return void\n     */\n    public function notice(string|\\Stringable $message, array $context = []): void;\n\n    /**\n     * Interesting events.\n     *\n     * Example: User logs in, SQL logs.\n     *\n     * @param string|\\Stringable $message\n     * @param mixed[] $context\n     *\n     * @return void\n     */\n    public function info(string|\\Stringable $message, array $context = []): void;\n\n    /**\n     * Detailed debug information.\n     *\n     * @param string|\\Stringable $message\n     * @param mixed[] $context\n     *\n     * @return void\n     */\n    public function debug(string|\\Stringable $message, array $context = []): void;\n\n    /**\n     * Logs with an arbitrary level.\n     *\n     * @param mixed   $level\n     * @param string|\\Stringable $message\n     * @param mixed[] $context\n     *\n     * @return void\n     *\n     * @throws \\Psr\\Log\\InvalidArgumentException\n     */\n    public function log($level, string|\\Stringable $message, array $context = []): void;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/log/src/LoggerTrait.php",
    "content": "<?php\n\nnamespace Psr\\Log;\n\n/**\n * This is a simple Logger trait that classes unable to extend AbstractLogger\n * (because they extend another class, etc) can include.\n *\n * It simply delegates all log-level-specific methods to the `log` method to\n * reduce boilerplate code that a simple Logger that does the same thing with\n * messages regardless of the error level has to implement.\n */\ntrait LoggerTrait\n{\n    /**\n     * System is unusable.\n     *\n     * @param string|\\Stringable $message\n     * @param array  $context\n     *\n     * @return void\n     */\n    public function emergency(string|\\Stringable $message, array $context = []): void\n    {\n        $this->log(LogLevel::EMERGENCY, $message, $context);\n    }\n\n    /**\n     * Action must be taken immediately.\n     *\n     * Example: Entire website down, database unavailable, etc. This should\n     * trigger the SMS alerts and wake you up.\n     *\n     * @param string|\\Stringable $message\n     * @param array  $context\n     *\n     * @return void\n     */\n    public function alert(string|\\Stringable $message, array $context = []): void\n    {\n        $this->log(LogLevel::ALERT, $message, $context);\n    }\n\n    /**\n     * Critical conditions.\n     *\n     * Example: Application component unavailable, unexpected exception.\n     *\n     * @param string|\\Stringable $message\n     * @param array  $context\n     *\n     * @return void\n     */\n    public function critical(string|\\Stringable $message, array $context = []): void\n    {\n        $this->log(LogLevel::CRITICAL, $message, $context);\n    }\n\n    /**\n     * Runtime errors that do not require immediate action but should typically\n     * be logged and monitored.\n     *\n     * @param string|\\Stringable $message\n     * @param array  $context\n     *\n     * @return void\n     */\n    public function error(string|\\Stringable $message, array $context = []): void\n    {\n        $this->log(LogLevel::ERROR, $message, $context);\n    }\n\n    /**\n     * Exceptional occurrences that are not errors.\n     *\n     * Example: Use of deprecated APIs, poor use of an API, undesirable things\n     * that are not necessarily wrong.\n     *\n     * @param string|\\Stringable $message\n     * @param array  $context\n     *\n     * @return void\n     */\n    public function warning(string|\\Stringable $message, array $context = []): void\n    {\n        $this->log(LogLevel::WARNING, $message, $context);\n    }\n\n    /**\n     * Normal but significant events.\n     *\n     * @param string|\\Stringable $message\n     * @param array  $context\n     *\n     * @return void\n     */\n    public function notice(string|\\Stringable $message, array $context = []): void\n    {\n        $this->log(LogLevel::NOTICE, $message, $context);\n    }\n\n    /**\n     * Interesting events.\n     *\n     * Example: User logs in, SQL logs.\n     *\n     * @param string|\\Stringable $message\n     * @param array  $context\n     *\n     * @return void\n     */\n    public function info(string|\\Stringable $message, array $context = []): void\n    {\n        $this->log(LogLevel::INFO, $message, $context);\n    }\n\n    /**\n     * Detailed debug information.\n     *\n     * @param string|\\Stringable $message\n     * @param array  $context\n     *\n     * @return void\n     */\n    public function debug(string|\\Stringable $message, array $context = []): void\n    {\n        $this->log(LogLevel::DEBUG, $message, $context);\n    }\n\n    /**\n     * Logs with an arbitrary level.\n     *\n     * @param mixed  $level\n     * @param string|\\Stringable $message\n     * @param array  $context\n     *\n     * @return void\n     *\n     * @throws \\Psr\\Log\\InvalidArgumentException\n     */\n    abstract public function log($level, string|\\Stringable $message, array $context = []): void;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/log/src/NullLogger.php",
    "content": "<?php\n\nnamespace Psr\\Log;\n\n/**\n * This Logger can be used to avoid conditional log calls.\n *\n * Logging should always be optional, and if no logger is provided to your\n * library creating a NullLogger instance to have something to throw logs at\n * is a good way to avoid littering your code with `if ($this->logger) { }`\n * blocks.\n */\nclass NullLogger extends AbstractLogger\n{\n    /**\n     * Logs with an arbitrary level.\n     *\n     * @param mixed  $level\n     * @param string|\\Stringable $message\n     * @param array $context\n     *\n     * @return void\n     *\n     * @throws \\Psr\\Log\\InvalidArgumentException\n     */\n    public function log($level, string|\\Stringable $message, array $context = []): void\n    {\n        // noop\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/simple-cache/.editorconfig",
    "content": "; This file is for unifying the coding style for different editors and IDEs.\n; More information at http://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nindent_size = 4\nindent_style = space\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/simple-cache/LICENSE.md",
    "content": "# The MIT License (MIT)\n\nCopyright (c) 2016 PHP Framework Interoperability Group\n\n> Permission is hereby granted, free of charge, to any person obtaining a copy\n> of this software and associated documentation files (the \"Software\"), to deal\n> in the Software without restriction, including without limitation the rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n> The above copyright notice and this permission notice shall be included in\n> all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/simple-cache/README.md",
    "content": "PHP FIG Simple Cache PSR\n========================\n\nThis repository holds all interfaces related to PSR-16.\n\nNote 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.\n\nYou 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.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/simple-cache/composer.json",
    "content": "{\n    \"name\": \"psr/simple-cache\",\n    \"description\": \"Common interfaces for simple caching\",\n    \"keywords\": [\"psr\", \"psr-16\", \"cache\", \"simple-cache\", \"caching\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"https://www.php-fig.org/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.0.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\SimpleCache\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"3.0.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/simple-cache/src/CacheException.php",
    "content": "<?php\n\nnamespace Psr\\SimpleCache;\n\n/**\n * Interface used for all types of exceptions thrown by the implementing library.\n */\ninterface CacheException extends \\Throwable\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/simple-cache/src/CacheInterface.php",
    "content": "<?php\n\nnamespace Psr\\SimpleCache;\n\ninterface CacheInterface\n{\n    /**\n     * Fetches a value from the cache.\n     *\n     * @param string $key     The unique key of this item in the cache.\n     * @param mixed  $default Default value to return if the key does not exist.\n     *\n     * @return mixed The value of the item from the cache, or $default in case of cache miss.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if the $key string is not a legal value.\n     */\n    public function get(string $key, mixed $default = null): mixed;\n\n    /**\n     * Persists data in the cache, uniquely referenced by a key with an optional expiration TTL time.\n     *\n     * @param string                 $key   The key of the item to store.\n     * @param mixed                  $value The value of the item to store, must be serializable.\n     * @param null|int|\\DateInterval $ttl   Optional. The TTL value of this item. If no value is sent and\n     *                                      the driver supports TTL then the library may set a default value\n     *                                      for it or let the driver take care of that.\n     *\n     * @return bool True on success and false on failure.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if the $key string is not a legal value.\n     */\n    public function set(string $key, mixed $value, null|int|\\DateInterval $ttl = null): bool;\n\n    /**\n     * Delete an item from the cache by its unique key.\n     *\n     * @param string $key The unique cache key of the item to delete.\n     *\n     * @return bool True if the item was successfully removed. False if there was an error.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if the $key string is not a legal value.\n     */\n    public function delete(string $key): bool;\n\n    /**\n     * Wipes clean the entire cache's keys.\n     *\n     * @return bool True on success and false on failure.\n     */\n    public function clear(): bool;\n\n    /**\n     * Obtains multiple cache items by their unique keys.\n     *\n     * @param iterable<string> $keys    A list of keys that can be obtained in a single operation.\n     * @param mixed            $default Default value to return for keys that do not exist.\n     *\n     * @return iterable<string, mixed> A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if $keys is neither an array nor a Traversable,\n     *   or if any of the $keys are not a legal value.\n     */\n    public function getMultiple(iterable $keys, mixed $default = null): iterable;\n\n    /**\n     * Persists a set of key => value pairs in the cache, with an optional TTL.\n     *\n     * @param iterable               $values A list of key => value pairs for a multiple-set operation.\n     * @param null|int|\\DateInterval $ttl    Optional. The TTL value of this item. If no value is sent and\n     *                                       the driver supports TTL then the library may set a default value\n     *                                       for it or let the driver take care of that.\n     *\n     * @return bool True on success and false on failure.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if $values is neither an array nor a Traversable,\n     *   or if any of the $values are not a legal value.\n     */\n    public function setMultiple(iterable $values, null|int|\\DateInterval $ttl = null): bool;\n\n    /**\n     * Deletes multiple cache items in a single operation.\n     *\n     * @param iterable<string> $keys A list of string-based keys to be deleted.\n     *\n     * @return bool True if the items were successfully removed. False if there was an error.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if $keys is neither an array nor a Traversable,\n     *   or if any of the $keys are not a legal value.\n     */\n    public function deleteMultiple(iterable $keys): bool;\n\n    /**\n     * Determines whether an item is present in the cache.\n     *\n     * NOTE: It is recommended that has() is only to be used for cache warming type purposes\n     * and not to be used within your live applications operations for get/set, as this method\n     * is subject to a race condition where your has() will return true and immediately after,\n     * another script can remove it making the state of your app out of date.\n     *\n     * @param string $key The cache item key.\n     *\n     * @return bool\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if the $key string is not a legal value.\n     */\n    public function has(string $key): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/psr/simple-cache/src/InvalidArgumentException.php",
    "content": "<?php\n\nnamespace Psr\\SimpleCache;\n\n/**\n * Exception interface for invalid cache arguments.\n *\n * When an invalid argument is passed it must throw an exception which implements\n * this interface\n */\ninterface InvalidArgumentException extends CacheException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/ralouphie/getallheaders/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Ralph Khattar\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/ralouphie/getallheaders/README.md",
    "content": "getallheaders\n=============\n\nPHP `getallheaders()` polyfill. Compatible with PHP >= 5.3.\n\n[![Build Status](https://travis-ci.org/ralouphie/getallheaders.svg?branch=master)](https://travis-ci.org/ralouphie/getallheaders)\n[![Coverage Status](https://coveralls.io/repos/ralouphie/getallheaders/badge.png?branch=master)](https://coveralls.io/r/ralouphie/getallheaders?branch=master)\n[![Latest Stable Version](https://poser.pugx.org/ralouphie/getallheaders/v/stable.png)](https://packagist.org/packages/ralouphie/getallheaders)\n[![Latest Unstable Version](https://poser.pugx.org/ralouphie/getallheaders/v/unstable.png)](https://packagist.org/packages/ralouphie/getallheaders)\n[![License](https://poser.pugx.org/ralouphie/getallheaders/license.png)](https://packagist.org/packages/ralouphie/getallheaders)\n\n\nThis is a simple polyfill for [`getallheaders()`](http://www.php.net/manual/en/function.getallheaders.php).\n\n## Install\n\nFor PHP version **`>= 5.6`**:\n\n```\ncomposer require ralouphie/getallheaders\n```\n\nFor PHP version **`< 5.6`**:\n\n```\ncomposer require ralouphie/getallheaders \"^2\"\n```\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/ralouphie/getallheaders/composer.json",
    "content": "{\n\t\"name\": \"ralouphie/getallheaders\",\n\t\"description\": \"A polyfill for getallheaders.\",\n\t\"license\": \"MIT\",\n\t\"authors\": [\n\t\t{\n\t\t\t\"name\": \"Ralph Khattar\",\n\t\t\t\"email\": \"ralph.khattar@gmail.com\"\n\t\t}\n\t],\n\t\"require\": {\n\t\t\"php\": \">=5.6\"\n\t},\n\t\"require-dev\": {\n\t\t\"phpunit/phpunit\": \"^5 || ^6.5\",\n\t\t\"php-coveralls/php-coveralls\": \"^2.1\"\n\t},\n\t\"autoload\": {\n\t\t\"files\": [\"src/getallheaders.php\"]\n\t},\n\t\"autoload-dev\": {\n\t\t\"psr-4\": {\n\t\t\t\"getallheaders\\\\Tests\\\\\": \"tests/\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/ralouphie/getallheaders/src/getallheaders.php",
    "content": "<?php\n\nif (!function_exists('getallheaders')) {\n\n    /**\n     * Get all HTTP header key/values as an associative array for the current request.\n     *\n     * @return string[string] The HTTP header key/value pairs.\n     */\n    function getallheaders()\n    {\n        $headers = array();\n\n        $copy_server = array(\n            'CONTENT_TYPE'   => 'Content-Type',\n            'CONTENT_LENGTH' => 'Content-Length',\n            'CONTENT_MD5'    => 'Content-Md5',\n        );\n\n        foreach ($_SERVER as $key => $value) {\n            if (substr($key, 0, 5) === 'HTTP_') {\n                $key = substr($key, 5);\n                if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) {\n                    $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key))));\n                    $headers[$key] = $value;\n                }\n            } elseif (isset($copy_server[$key])) {\n                $headers[$copy_server[$key]] = $value;\n            }\n        }\n\n        if (!isset($headers['Authorization'])) {\n            if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {\n                $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];\n            } elseif (isset($_SERVER['PHP_AUTH_USER'])) {\n                $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : '';\n                $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass);\n            } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) {\n                $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST'];\n            }\n        }\n\n        return $headers;\n    }\n\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/AbstractAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\Log\\LoggerAwareInterface;\nuse Psr\\Log\\LoggerInterface;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\ResettableInterface;\nuse Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait;\nuse Symfony\\Component\\Cache\\Traits\\ContractsTrait;\nuse Symfony\\Contracts\\Cache\\CacheInterface;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n */\nabstract class AbstractAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface\n{\n    use AbstractAdapterTrait;\n    use ContractsTrait;\n\n    /**\n     * @internal\n     */\n    protected const NS_SEPARATOR = ':';\n\n    private static bool $apcuSupported;\n\n    protected function __construct(string $namespace = '', int $defaultLifetime = 0)\n    {\n        $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).static::NS_SEPARATOR;\n        $this->defaultLifetime = $defaultLifetime;\n        if (null !== $this->maxIdLength && \\strlen($namespace) > $this->maxIdLength - 24) {\n            throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given (\"%s\").', $this->maxIdLength - 24, \\strlen($namespace), $namespace));\n        }\n        self::$createCacheItem ??= \\Closure::bind(\n            static function ($key, $value, $isHit) {\n                $item = new CacheItem();\n                $item->key = $key;\n                $item->value = $value;\n                $item->isHit = $isHit;\n                $item->unpack();\n\n                return $item;\n            },\n            null,\n            CacheItem::class\n        );\n        self::$mergeByLifetime ??= \\Closure::bind(\n            static function ($deferred, $namespace, &$expiredIds, $getId, $defaultLifetime) {\n                $byLifetime = [];\n                $now = microtime(true);\n                $expiredIds = [];\n\n                foreach ($deferred as $key => $item) {\n                    $key = (string) $key;\n                    if (null === $item->expiry) {\n                        $ttl = 0 < $defaultLifetime ? $defaultLifetime : 0;\n                    } elseif (!$item->expiry) {\n                        $ttl = 0;\n                    } elseif (0 >= $ttl = (int) (0.1 + $item->expiry - $now)) {\n                        $expiredIds[] = $getId($key);\n                        continue;\n                    }\n                    $byLifetime[$ttl][$getId($key)] = $item->pack();\n                }\n\n                return $byLifetime;\n            },\n            null,\n            CacheItem::class\n        );\n    }\n\n    /**\n     * Returns the best possible adapter that your runtime supports.\n     *\n     * Using ApcuAdapter makes system caches compatible with read-only filesystems.\n     */\n    public static function createSystemCache(string $namespace, int $defaultLifetime, string $version, string $directory, ?LoggerInterface $logger = null): AdapterInterface\n    {\n        $opcache = new PhpFilesAdapter($namespace, $defaultLifetime, $directory, true);\n        if (null !== $logger) {\n            $opcache->setLogger($logger);\n        }\n\n        if (!self::$apcuSupported ??= ApcuAdapter::isSupported()) {\n            return $opcache;\n        }\n\n        if ('cli' === \\PHP_SAPI && !filter_var(\\ini_get('apc.enable_cli'), \\FILTER_VALIDATE_BOOL)) {\n            return $opcache;\n        }\n\n        $apcu = new ApcuAdapter($namespace, intdiv($defaultLifetime, 5), $version);\n        if (null !== $logger) {\n            $apcu->setLogger($logger);\n        }\n\n        return new ChainAdapter([$apcu, $opcache]);\n    }\n\n    public static function createConnection(#[\\SensitiveParameter] string $dsn, array $options = []): mixed\n    {\n        if (str_starts_with($dsn, 'redis:') || str_starts_with($dsn, 'rediss:')) {\n            return RedisAdapter::createConnection($dsn, $options);\n        }\n        if (str_starts_with($dsn, 'memcached:')) {\n            return MemcachedAdapter::createConnection($dsn, $options);\n        }\n        if (str_starts_with($dsn, 'couchbase:')) {\n            if (CouchbaseBucketAdapter::isSupported()) {\n                return CouchbaseBucketAdapter::createConnection($dsn, $options);\n            }\n\n            return CouchbaseCollectionAdapter::createConnection($dsn, $options);\n        }\n\n        throw new InvalidArgumentException('Unsupported DSN: it does not start with \"redis[s]:\", \"memcached:\" nor \"couchbase:\".');\n    }\n\n    public function commit(): bool\n    {\n        $ok = true;\n        $byLifetime = (self::$mergeByLifetime)($this->deferred, $this->namespace, $expiredIds, $this->getId(...), $this->defaultLifetime);\n        $retry = $this->deferred = [];\n\n        if ($expiredIds) {\n            try {\n                $this->doDelete($expiredIds);\n            } catch (\\Exception $e) {\n                $ok = false;\n                CacheItem::log($this->logger, 'Failed to delete expired items: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n            }\n        }\n        foreach ($byLifetime as $lifetime => $values) {\n            try {\n                $e = $this->doSave($values, $lifetime);\n            } catch (\\Exception $e) {\n            }\n            if (true === $e || [] === $e) {\n                continue;\n            }\n            if (\\is_array($e) || 1 === \\count($values)) {\n                foreach (\\is_array($e) ? $e : array_keys($values) as $id) {\n                    $ok = false;\n                    $v = $values[$id];\n                    $type = get_debug_type($v);\n                    $message = sprintf('Failed to save key \"{key}\" of type %s%s', $type, $e instanceof \\Exception ? ': '.$e->getMessage() : '.');\n                    CacheItem::log($this->logger, $message, ['key' => substr($id, \\strlen($this->namespace)), 'exception' => $e instanceof \\Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);\n                }\n            } else {\n                foreach ($values as $id => $v) {\n                    $retry[$lifetime][] = $id;\n                }\n            }\n        }\n\n        // When bulk-save failed, retry each item individually\n        foreach ($retry as $lifetime => $ids) {\n            foreach ($ids as $id) {\n                try {\n                    $v = $byLifetime[$lifetime][$id];\n                    $e = $this->doSave([$id => $v], $lifetime);\n                } catch (\\Exception $e) {\n                }\n                if (true === $e || [] === $e) {\n                    continue;\n                }\n                $ok = false;\n                $type = get_debug_type($v);\n                $message = sprintf('Failed to save key \"{key}\" of type %s%s', $type, $e instanceof \\Exception ? ': '.$e->getMessage() : '.');\n                CacheItem::log($this->logger, $message, ['key' => substr($id, \\strlen($this->namespace)), 'exception' => $e instanceof \\Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);\n            }\n        }\n\n        return $ok;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\Log\\LoggerAwareInterface;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\ResettableInterface;\nuse Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait;\nuse Symfony\\Component\\Cache\\Traits\\ContractsTrait;\nuse Symfony\\Contracts\\Cache\\TagAwareCacheInterface;\n\n/**\n * Abstract for native TagAware adapters.\n *\n * To keep info on tags, the tags are both serialized as part of cache value and provided as tag ids\n * to Adapters on operations when needed for storage to doSave(), doDelete() & doInvalidate().\n *\n * @author Nicolas Grekas <p@tchwork.com>\n * @author André Rømcke <andre.romcke+symfony@gmail.com>\n *\n * @internal\n */\nabstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, LoggerAwareInterface, ResettableInterface\n{\n    use AbstractAdapterTrait;\n    use ContractsTrait;\n\n    private const TAGS_PREFIX = \"\\1tags\\1\";\n\n    protected function __construct(string $namespace = '', int $defaultLifetime = 0)\n    {\n        $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).':';\n        $this->defaultLifetime = $defaultLifetime;\n        if (null !== $this->maxIdLength && \\strlen($namespace) > $this->maxIdLength - 24) {\n            throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given (\"%s\").', $this->maxIdLength - 24, \\strlen($namespace), $namespace));\n        }\n        self::$createCacheItem ??= \\Closure::bind(\n            static function ($key, $value, $isHit) {\n                $item = new CacheItem();\n                $item->key = $key;\n                $item->isTaggable = true;\n                // If structure does not match what we expect return item as is (no value and not a hit)\n                if (!\\is_array($value) || !\\array_key_exists('value', $value)) {\n                    return $item;\n                }\n                $item->isHit = $isHit;\n                // Extract value, tags and meta data from the cache value\n                $item->value = $value['value'];\n                $item->metadata[CacheItem::METADATA_TAGS] = isset($value['tags']) ? array_combine($value['tags'], $value['tags']) : [];\n                if (isset($value['meta'])) {\n                    // For compactness these values are packed, & expiry is offset to reduce size\n                    $v = unpack('Ve/Nc', $value['meta']);\n                    $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET;\n                    $item->metadata[CacheItem::METADATA_CTIME] = $v['c'];\n                }\n\n                return $item;\n            },\n            null,\n            CacheItem::class\n        );\n        self::$mergeByLifetime ??= \\Closure::bind(\n            static function ($deferred, &$expiredIds, $getId, $tagPrefix, $defaultLifetime) {\n                $byLifetime = [];\n                $now = microtime(true);\n                $expiredIds = [];\n\n                foreach ($deferred as $key => $item) {\n                    $key = (string) $key;\n                    if (null === $item->expiry) {\n                        $ttl = 0 < $defaultLifetime ? $defaultLifetime : 0;\n                    } elseif (!$item->expiry) {\n                        $ttl = 0;\n                    } elseif (0 >= $ttl = (int) (0.1 + $item->expiry - $now)) {\n                        $expiredIds[] = $getId($key);\n                        continue;\n                    }\n                    // Store Value and Tags on the cache value\n                    if (isset(($metadata = $item->newMetadata)[CacheItem::METADATA_TAGS])) {\n                        $value = ['value' => $item->value, 'tags' => $metadata[CacheItem::METADATA_TAGS]];\n                        unset($metadata[CacheItem::METADATA_TAGS]);\n                    } else {\n                        $value = ['value' => $item->value, 'tags' => []];\n                    }\n\n                    if ($metadata) {\n                        // For compactness, expiry and creation duration are packed, using magic numbers as separators\n                        $value['meta'] = pack('VN', (int) (0.1 + $metadata[CacheItem::METADATA_EXPIRY] - CacheItem::METADATA_EXPIRY_OFFSET), $metadata[CacheItem::METADATA_CTIME]);\n                    }\n\n                    // Extract tag changes, these should be removed from values in doSave()\n                    $value['tag-operations'] = ['add' => [], 'remove' => []];\n                    $oldTags = $item->metadata[CacheItem::METADATA_TAGS] ?? [];\n                    foreach (array_diff_key($value['tags'], $oldTags) as $addedTag) {\n                        $value['tag-operations']['add'][] = $getId($tagPrefix.$addedTag);\n                    }\n                    foreach (array_diff_key($oldTags, $value['tags']) as $removedTag) {\n                        $value['tag-operations']['remove'][] = $getId($tagPrefix.$removedTag);\n                    }\n                    $value['tags'] = array_keys($value['tags']);\n\n                    $byLifetime[$ttl][$getId($key)] = $value;\n                    $item->metadata = $item->newMetadata;\n                }\n\n                return $byLifetime;\n            },\n            null,\n            CacheItem::class\n        );\n    }\n\n    /**\n     * Persists several cache items immediately.\n     *\n     * @param array   $values        The values to cache, indexed by their cache identifier\n     * @param int     $lifetime      The lifetime of the cached values, 0 for persisting until manual cleaning\n     * @param array[] $addTagData    Hash where key is tag id, and array value is list of cache id's to add to tag\n     * @param array[] $removeTagData Hash where key is tag id, and array value is list of cache id's to remove to tag\n     *\n     * @return array The identifiers that failed to be cached or a boolean stating if caching succeeded or not\n     */\n    abstract protected function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []): array;\n\n    /**\n     * Removes multiple items from the pool and their corresponding tags.\n     *\n     * @param array $ids An array of identifiers that should be removed from the pool\n     */\n    abstract protected function doDelete(array $ids): bool;\n\n    /**\n     * Removes relations between tags and deleted items.\n     *\n     * @param array $tagData Array of tag => key identifiers that should be removed from the pool\n     */\n    abstract protected function doDeleteTagRelations(array $tagData): bool;\n\n    /**\n     * Invalidates cached items using tags.\n     *\n     * @param string[] $tagIds An array of tags to invalidate, key is tag and value is tag id\n     */\n    abstract protected function doInvalidate(array $tagIds): bool;\n\n    /**\n     * Delete items and yields the tags they were bound to.\n     */\n    protected function doDeleteYieldTags(array $ids): iterable\n    {\n        foreach ($this->doFetch($ids) as $id => $value) {\n            yield $id => \\is_array($value) && \\is_array($value['tags'] ?? null) ? $value['tags'] : [];\n        }\n\n        $this->doDelete($ids);\n    }\n\n    public function commit(): bool\n    {\n        $ok = true;\n        $byLifetime = (self::$mergeByLifetime)($this->deferred, $expiredIds, $this->getId(...), self::TAGS_PREFIX, $this->defaultLifetime);\n        $retry = $this->deferred = [];\n\n        if ($expiredIds) {\n            // Tags are not cleaned up in this case, however that is done on invalidateTags().\n            try {\n                $this->doDelete($expiredIds);\n            } catch (\\Exception $e) {\n                $ok = false;\n                CacheItem::log($this->logger, 'Failed to delete expired items: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n            }\n        }\n        foreach ($byLifetime as $lifetime => $values) {\n            try {\n                $values = $this->extractTagData($values, $addTagData, $removeTagData);\n                $e = $this->doSave($values, $lifetime, $addTagData, $removeTagData);\n            } catch (\\Exception $e) {\n            }\n            if (true === $e || [] === $e) {\n                continue;\n            }\n            if (\\is_array($e) || 1 === \\count($values)) {\n                foreach (\\is_array($e) ? $e : array_keys($values) as $id) {\n                    $ok = false;\n                    $v = $values[$id];\n                    $type = get_debug_type($v);\n                    $message = sprintf('Failed to save key \"{key}\" of type %s%s', $type, $e instanceof \\Exception ? ': '.$e->getMessage() : '.');\n                    CacheItem::log($this->logger, $message, ['key' => substr($id, \\strlen($this->namespace)), 'exception' => $e instanceof \\Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);\n                }\n            } else {\n                foreach ($values as $id => $v) {\n                    $retry[$lifetime][] = $id;\n                }\n            }\n        }\n\n        // When bulk-save failed, retry each item individually\n        foreach ($retry as $lifetime => $ids) {\n            foreach ($ids as $id) {\n                try {\n                    $v = $byLifetime[$lifetime][$id];\n                    $values = $this->extractTagData([$id => $v], $addTagData, $removeTagData);\n                    $e = $this->doSave($values, $lifetime, $addTagData, $removeTagData);\n                } catch (\\Exception $e) {\n                }\n                if (true === $e || [] === $e) {\n                    continue;\n                }\n                $ok = false;\n                $type = get_debug_type($v);\n                $message = sprintf('Failed to save key \"{key}\" of type %s%s', $type, $e instanceof \\Exception ? ': '.$e->getMessage() : '.');\n                CacheItem::log($this->logger, $message, ['key' => substr($id, \\strlen($this->namespace)), 'exception' => $e instanceof \\Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);\n            }\n        }\n\n        return $ok;\n    }\n\n    public function deleteItems(array $keys): bool\n    {\n        if (!$keys) {\n            return true;\n        }\n\n        $ok = true;\n        $ids = [];\n        $tagData = [];\n\n        foreach ($keys as $key) {\n            $ids[$key] = $this->getId($key);\n            unset($this->deferred[$key]);\n        }\n\n        try {\n            foreach ($this->doDeleteYieldTags(array_values($ids)) as $id => $tags) {\n                foreach ($tags as $tag) {\n                    $tagData[$this->getId(self::TAGS_PREFIX.$tag)][] = $id;\n                }\n            }\n        } catch (\\Exception) {\n            $ok = false;\n        }\n\n        try {\n            if ((!$tagData || $this->doDeleteTagRelations($tagData)) && $ok) {\n                return true;\n            }\n        } catch (\\Exception) {\n        }\n\n        // When bulk-delete failed, retry each item individually\n        foreach ($ids as $key => $id) {\n            try {\n                $e = null;\n                if ($this->doDelete([$id])) {\n                    continue;\n                }\n            } catch (\\Exception $e) {\n            }\n            $message = 'Failed to delete key \"{key}\"'.($e instanceof \\Exception ? ': '.$e->getMessage() : '.');\n            CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n            $ok = false;\n        }\n\n        return $ok;\n    }\n\n    public function invalidateTags(array $tags): bool\n    {\n        if (!$tags) {\n            return false;\n        }\n\n        $tagIds = [];\n        foreach (array_unique($tags) as $tag) {\n            $tagIds[] = $this->getId(self::TAGS_PREFIX.$tag);\n        }\n\n        try {\n            if ($this->doInvalidate($tagIds)) {\n                return true;\n            }\n        } catch (\\Exception $e) {\n            CacheItem::log($this->logger, 'Failed to invalidate tags: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n        }\n\n        return false;\n    }\n\n    /**\n     * Extracts tags operation data from $values set in mergeByLifetime, and returns values without it.\n     */\n    private function extractTagData(array $values, ?array &$addTagData, ?array &$removeTagData): array\n    {\n        $addTagData = $removeTagData = [];\n        foreach ($values as $id => $value) {\n            foreach ($value['tag-operations']['add'] as $tag => $tagId) {\n                $addTagData[$tagId][] = $id;\n            }\n\n            foreach ($value['tag-operations']['remove'] as $tag => $tagId) {\n                $removeTagData[$tagId][] = $id;\n            }\n\n            unset($values[$id]['tag-operations']);\n        }\n\n        return $values;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/AdapterInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\Cache\\CacheItemPoolInterface;\nuse Symfony\\Component\\Cache\\CacheItem;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(CacheItem::class);\n\n/**\n * Interface for adapters managing instances of Symfony's CacheItem.\n *\n * @author Kévin Dunglas <dunglas@gmail.com>\n */\ninterface AdapterInterface extends CacheItemPoolInterface\n{\n    public function getItem(mixed $key): CacheItem;\n\n    /**\n     * @return iterable<string, CacheItem>\n     */\n    public function getItems(array $keys = []): iterable;\n\n    public function clear(string $prefix = ''): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/ApcuAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\Exception\\CacheException;\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass ApcuAdapter extends AbstractAdapter\n{\n    private ?MarshallerInterface $marshaller;\n\n    /**\n     * @throws CacheException if APCu is not enabled\n     */\n    public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $version = null, ?MarshallerInterface $marshaller = null)\n    {\n        if (!static::isSupported()) {\n            throw new CacheException('APCu is not enabled.');\n        }\n        if ('cli' === \\PHP_SAPI) {\n            ini_set('apc.use_request_time', 0);\n        }\n        parent::__construct($namespace, $defaultLifetime);\n\n        if (null !== $version) {\n            CacheItem::validateKey($version);\n\n            if (!apcu_exists($version.'@'.$namespace)) {\n                $this->doClear($namespace);\n                apcu_add($version.'@'.$namespace, null);\n            }\n        }\n\n        $this->marshaller = $marshaller;\n    }\n\n    /**\n     * @return bool\n     */\n    public static function isSupported()\n    {\n        return \\function_exists('apcu_fetch') && filter_var(\\ini_get('apc.enabled'), \\FILTER_VALIDATE_BOOL);\n    }\n\n    protected function doFetch(array $ids): iterable\n    {\n        $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback');\n        try {\n            $values = [];\n            foreach (apcu_fetch($ids, $ok) ?: [] as $k => $v) {\n                if (null !== $v || $ok) {\n                    $values[$k] = null !== $this->marshaller ? $this->marshaller->unmarshall($v) : $v;\n                }\n            }\n\n            return $values;\n        } catch (\\Error $e) {\n            throw new \\ErrorException($e->getMessage(), $e->getCode(), \\E_ERROR, $e->getFile(), $e->getLine());\n        } finally {\n            ini_set('unserialize_callback_func', $unserializeCallbackHandler);\n        }\n    }\n\n    protected function doHave(string $id): bool\n    {\n        return apcu_exists($id);\n    }\n\n    protected function doClear(string $namespace): bool\n    {\n        return isset($namespace[0]) && class_exists(\\APCUIterator::class, false) && ('cli' !== \\PHP_SAPI || filter_var(\\ini_get('apc.enable_cli'), \\FILTER_VALIDATE_BOOL))\n            ? apcu_delete(new \\APCUIterator(sprintf('/^%s/', preg_quote($namespace, '/')), \\APC_ITER_KEY))\n            : apcu_clear_cache();\n    }\n\n    protected function doDelete(array $ids): bool\n    {\n        foreach ($ids as $id) {\n            apcu_delete($id);\n        }\n\n        return true;\n    }\n\n    protected function doSave(array $values, int $lifetime): array|bool\n    {\n        if (null !== $this->marshaller && (!$values = $this->marshaller->marshall($values, $failed))) {\n            return $failed;\n        }\n\n        try {\n            if (false === $failures = apcu_store($values, null, $lifetime)) {\n                $failures = $values;\n            }\n\n            return array_keys($failures);\n        } catch (\\Throwable $e) {\n            if (1 === \\count($values)) {\n                // Workaround https://github.com/krakjoe/apcu/issues/170\n                apcu_delete(array_key_first($values));\n            }\n\n            throw $e;\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/ArrayAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\Cache\\CacheItemInterface;\nuse Psr\\Log\\LoggerAwareInterface;\nuse Psr\\Log\\LoggerAwareTrait;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\ResettableInterface;\nuse Symfony\\Contracts\\Cache\\CacheInterface;\n\n/**\n * An in-memory cache storage.\n *\n * Acts as a least-recently-used (LRU) storage when configured with a maximum number of items.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface\n{\n    use LoggerAwareTrait;\n\n    private bool $storeSerialized;\n    private array $values = [];\n    private array $tags = [];\n    private array $expiries = [];\n    private int $defaultLifetime;\n    private float $maxLifetime;\n    private int $maxItems;\n\n    private static \\Closure $createCacheItem;\n\n    /**\n     * @param bool $storeSerialized Disabling serialization can lead to cache corruptions when storing mutable values but increases performance otherwise\n     */\n    public function __construct(int $defaultLifetime = 0, bool $storeSerialized = true, float $maxLifetime = 0, int $maxItems = 0)\n    {\n        if (0 > $maxLifetime) {\n            throw new InvalidArgumentException(sprintf('Argument $maxLifetime must be positive, %F passed.', $maxLifetime));\n        }\n\n        if (0 > $maxItems) {\n            throw new InvalidArgumentException(sprintf('Argument $maxItems must be a positive integer, %d passed.', $maxItems));\n        }\n\n        $this->defaultLifetime = $defaultLifetime;\n        $this->storeSerialized = $storeSerialized;\n        $this->maxLifetime = $maxLifetime;\n        $this->maxItems = $maxItems;\n        self::$createCacheItem ??= \\Closure::bind(\n            static function ($key, $value, $isHit, $tags) {\n                $item = new CacheItem();\n                $item->key = $key;\n                $item->value = $value;\n                $item->isHit = $isHit;\n                if (null !== $tags) {\n                    $item->metadata[CacheItem::METADATA_TAGS] = $tags;\n                }\n\n                return $item;\n            },\n            null,\n            CacheItem::class\n        );\n    }\n\n    public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed\n    {\n        $item = $this->getItem($key);\n        $metadata = $item->getMetadata();\n\n        // ArrayAdapter works in memory, we don't care about stampede protection\n        if (\\INF === $beta || !$item->isHit()) {\n            $save = true;\n            $item->set($callback($item, $save));\n            if ($save) {\n                $this->save($item);\n            }\n        }\n\n        return $item->get();\n    }\n\n    public function delete(string $key): bool\n    {\n        return $this->deleteItem($key);\n    }\n\n    public function hasItem(mixed $key): bool\n    {\n        if (\\is_string($key) && isset($this->expiries[$key]) && $this->expiries[$key] > microtime(true)) {\n            if ($this->maxItems) {\n                // Move the item last in the storage\n                $value = $this->values[$key];\n                unset($this->values[$key]);\n                $this->values[$key] = $value;\n            }\n\n            return true;\n        }\n        \\assert('' !== CacheItem::validateKey($key));\n\n        return isset($this->expiries[$key]) && !$this->deleteItem($key);\n    }\n\n    public function getItem(mixed $key): CacheItem\n    {\n        if (!$isHit = $this->hasItem($key)) {\n            $value = null;\n\n            if (!$this->maxItems) {\n                // Track misses in non-LRU mode only\n                $this->values[$key] = null;\n            }\n        } else {\n            $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key];\n        }\n\n        return (self::$createCacheItem)($key, $value, $isHit, $this->tags[$key] ?? null);\n    }\n\n    public function getItems(array $keys = []): iterable\n    {\n        \\assert(self::validateKeys($keys));\n\n        return $this->generateItems($keys, microtime(true), self::$createCacheItem);\n    }\n\n    public function deleteItem(mixed $key): bool\n    {\n        \\assert('' !== CacheItem::validateKey($key));\n        unset($this->values[$key], $this->tags[$key], $this->expiries[$key]);\n\n        return true;\n    }\n\n    public function deleteItems(array $keys): bool\n    {\n        foreach ($keys as $key) {\n            $this->deleteItem($key);\n        }\n\n        return true;\n    }\n\n    public function save(CacheItemInterface $item): bool\n    {\n        if (!$item instanceof CacheItem) {\n            return false;\n        }\n        $item = (array) $item;\n        $key = $item[\"\\0*\\0key\"];\n        $value = $item[\"\\0*\\0value\"];\n        $expiry = $item[\"\\0*\\0expiry\"];\n\n        $now = microtime(true);\n\n        if (null !== $expiry) {\n            if (!$expiry) {\n                $expiry = \\PHP_INT_MAX;\n            } elseif ($expiry <= $now) {\n                $this->deleteItem($key);\n\n                return true;\n            }\n        }\n        if ($this->storeSerialized && null === $value = $this->freeze($value, $key)) {\n            return false;\n        }\n        if (null === $expiry && 0 < $this->defaultLifetime) {\n            $expiry = $this->defaultLifetime;\n            $expiry = $now + ($expiry > ($this->maxLifetime ?: $expiry) ? $this->maxLifetime : $expiry);\n        } elseif ($this->maxLifetime && (null === $expiry || $expiry > $now + $this->maxLifetime)) {\n            $expiry = $now + $this->maxLifetime;\n        }\n\n        if ($this->maxItems) {\n            unset($this->values[$key], $this->tags[$key]);\n\n            // Iterate items and vacuum expired ones while we are at it\n            foreach ($this->values as $k => $v) {\n                if ($this->expiries[$k] > $now && \\count($this->values) < $this->maxItems) {\n                    break;\n                }\n\n                unset($this->values[$k], $this->tags[$k], $this->expiries[$k]);\n            }\n        }\n\n        $this->values[$key] = $value;\n        $this->expiries[$key] = $expiry ?? \\PHP_INT_MAX;\n\n        if (null === $this->tags[$key] = $item[\"\\0*\\0newMetadata\"][CacheItem::METADATA_TAGS] ?? null) {\n            unset($this->tags[$key]);\n        }\n\n        return true;\n    }\n\n    public function saveDeferred(CacheItemInterface $item): bool\n    {\n        return $this->save($item);\n    }\n\n    public function commit(): bool\n    {\n        return true;\n    }\n\n    public function clear(string $prefix = ''): bool\n    {\n        if ('' !== $prefix) {\n            $now = microtime(true);\n\n            foreach ($this->values as $key => $value) {\n                if (!isset($this->expiries[$key]) || $this->expiries[$key] <= $now || str_starts_with($key, $prefix)) {\n                    unset($this->values[$key], $this->tags[$key], $this->expiries[$key]);\n                }\n            }\n\n            if ($this->values) {\n                return true;\n            }\n        }\n\n        $this->values = $this->tags = $this->expiries = [];\n\n        return true;\n    }\n\n    /**\n     * Returns all cached values, with cache miss as null.\n     */\n    public function getValues(): array\n    {\n        if (!$this->storeSerialized) {\n            return $this->values;\n        }\n\n        $values = $this->values;\n        foreach ($values as $k => $v) {\n            if (null === $v || 'N;' === $v) {\n                continue;\n            }\n            if (!\\is_string($v) || !isset($v[2]) || ':' !== $v[1]) {\n                $values[$k] = serialize($v);\n            }\n        }\n\n        return $values;\n    }\n\n    /**\n     * @return void\n     */\n    public function reset()\n    {\n        $this->clear();\n    }\n\n    private function generateItems(array $keys, float $now, \\Closure $f): \\Generator\n    {\n        foreach ($keys as $i => $key) {\n            if (!$isHit = isset($this->expiries[$key]) && ($this->expiries[$key] > $now || !$this->deleteItem($key))) {\n                $value = null;\n\n                if (!$this->maxItems) {\n                    // Track misses in non-LRU mode only\n                    $this->values[$key] = null;\n                }\n            } else {\n                if ($this->maxItems) {\n                    // Move the item last in the storage\n                    $value = $this->values[$key];\n                    unset($this->values[$key]);\n                    $this->values[$key] = $value;\n                }\n\n                $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key];\n            }\n            unset($keys[$i]);\n\n            yield $key => $f($key, $value, $isHit, $this->tags[$key] ?? null);\n        }\n\n        foreach ($keys as $key) {\n            yield $key => $f($key, null, false);\n        }\n    }\n\n    private function freeze($value, string $key): string|int|float|bool|array|\\UnitEnum|null\n    {\n        if (null === $value) {\n            return 'N;';\n        }\n        if (\\is_string($value)) {\n            // Serialize strings if they could be confused with serialized objects or arrays\n            if ('N;' === $value || (isset($value[2]) && ':' === $value[1])) {\n                return serialize($value);\n            }\n        } elseif (!\\is_scalar($value)) {\n            try {\n                $serialized = serialize($value);\n            } catch (\\Exception $e) {\n                unset($this->values[$key], $this->tags[$key]);\n                $type = get_debug_type($value);\n                $message = sprintf('Failed to save key \"{key}\" of type %s: %s', $type, $e->getMessage());\n                CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n\n                return null;\n            }\n            // Keep value serialized if it contains any objects or any internal references\n            if ('C' === $serialized[0] || 'O' === $serialized[0] || preg_match('/;[OCRr]:[1-9]/', $serialized)) {\n                return $serialized;\n            }\n        }\n\n        return $value;\n    }\n\n    private function unfreeze(string $key, bool &$isHit): mixed\n    {\n        if ('N;' === $value = $this->values[$key]) {\n            return null;\n        }\n        if (\\is_string($value) && isset($value[2]) && ':' === $value[1]) {\n            try {\n                $value = unserialize($value);\n            } catch (\\Exception $e) {\n                CacheItem::log($this->logger, 'Failed to unserialize key \"{key}\": '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n                $value = false;\n            }\n            if (false === $value) {\n                $value = null;\n                $isHit = false;\n\n                if (!$this->maxItems) {\n                    $this->values[$key] = null;\n                }\n            }\n        }\n\n        return $value;\n    }\n\n    private function validateKeys(array $keys): bool\n    {\n        foreach ($keys as $key) {\n            if (!\\is_string($key) || !isset($this->expiries[$key])) {\n                CacheItem::validateKey($key);\n            }\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/ChainAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\Cache\\CacheItemInterface;\nuse Psr\\Cache\\CacheItemPoolInterface;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\PruneableInterface;\nuse Symfony\\Component\\Cache\\ResettableInterface;\nuse Symfony\\Component\\Cache\\Traits\\ContractsTrait;\nuse Symfony\\Contracts\\Cache\\CacheInterface;\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n/**\n * Chains several adapters together.\n *\n * Cached items are fetched from the first adapter having them in its data store.\n * They are saved and deleted in all adapters at once.\n *\n * @author Kévin Dunglas <dunglas@gmail.com>\n */\nclass ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface\n{\n    use ContractsTrait;\n\n    private array $adapters = [];\n    private int $adapterCount;\n    private int $defaultLifetime;\n\n    private static \\Closure $syncItem;\n\n    /**\n     * @param CacheItemPoolInterface[] $adapters        The ordered list of adapters used to fetch cached items\n     * @param int                      $defaultLifetime The default lifetime of items propagated from lower adapters to upper ones\n     */\n    public function __construct(array $adapters, int $defaultLifetime = 0)\n    {\n        if (!$adapters) {\n            throw new InvalidArgumentException('At least one adapter must be specified.');\n        }\n\n        foreach ($adapters as $adapter) {\n            if (!$adapter instanceof CacheItemPoolInterface) {\n                throw new InvalidArgumentException(sprintf('The class \"%s\" does not implement the \"%s\" interface.', get_debug_type($adapter), CacheItemPoolInterface::class));\n            }\n            if ('cli' === \\PHP_SAPI && $adapter instanceof ApcuAdapter && !filter_var(\\ini_get('apc.enable_cli'), \\FILTER_VALIDATE_BOOL)) {\n                continue; // skip putting APCu in the chain when the backend is disabled\n            }\n\n            if ($adapter instanceof AdapterInterface) {\n                $this->adapters[] = $adapter;\n            } else {\n                $this->adapters[] = new ProxyAdapter($adapter);\n            }\n        }\n        $this->adapterCount = \\count($this->adapters);\n        $this->defaultLifetime = $defaultLifetime;\n\n        self::$syncItem ??= \\Closure::bind(\n            static function ($sourceItem, $item, $defaultLifetime, $sourceMetadata = null) {\n                $sourceItem->isTaggable = false;\n                $sourceMetadata ??= $sourceItem->metadata;\n\n                $item->value = $sourceItem->value;\n                $item->isHit = $sourceItem->isHit;\n                $item->metadata = $item->newMetadata = $sourceItem->metadata = $sourceMetadata;\n\n                if (isset($item->metadata[CacheItem::METADATA_EXPIRY])) {\n                    $item->expiresAt(\\DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', $item->metadata[CacheItem::METADATA_EXPIRY])));\n                } elseif (0 < $defaultLifetime) {\n                    $item->expiresAfter($defaultLifetime);\n                }\n\n                return $item;\n            },\n            null,\n            CacheItem::class\n        );\n    }\n\n    public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed\n    {\n        $doSave = true;\n        $callback = static function (CacheItem $item, bool &$save) use ($callback, &$doSave) {\n            $value = $callback($item, $save);\n            $doSave = $save;\n\n            return $value;\n        };\n\n        $wrap = function (?CacheItem $item = null, bool &$save = true) use ($key, $callback, $beta, &$wrap, &$doSave, &$metadata) {\n            static $lastItem;\n            static $i = 0;\n            $adapter = $this->adapters[$i];\n            if (isset($this->adapters[++$i])) {\n                $callback = $wrap;\n                $beta = \\INF === $beta ? \\INF : 0;\n            }\n            if ($adapter instanceof CacheInterface) {\n                $value = $adapter->get($key, $callback, $beta, $metadata);\n            } else {\n                $value = $this->doGet($adapter, $key, $callback, $beta, $metadata);\n            }\n            if (null !== $item) {\n                (self::$syncItem)($lastItem ??= $item, $item, $this->defaultLifetime, $metadata);\n            }\n            $save = $doSave;\n\n            return $value;\n        };\n\n        return $wrap();\n    }\n\n    public function getItem(mixed $key): CacheItem\n    {\n        $syncItem = self::$syncItem;\n        $misses = [];\n\n        foreach ($this->adapters as $i => $adapter) {\n            $item = $adapter->getItem($key);\n\n            if ($item->isHit()) {\n                while (0 <= --$i) {\n                    $this->adapters[$i]->save($syncItem($item, $misses[$i], $this->defaultLifetime));\n                }\n\n                return $item;\n            }\n\n            $misses[$i] = $item;\n        }\n\n        return $item;\n    }\n\n    public function getItems(array $keys = []): iterable\n    {\n        return $this->generateItems($this->adapters[0]->getItems($keys), 0);\n    }\n\n    private function generateItems(iterable $items, int $adapterIndex): \\Generator\n    {\n        $missing = [];\n        $misses = [];\n        $nextAdapterIndex = $adapterIndex + 1;\n        $nextAdapter = $this->adapters[$nextAdapterIndex] ?? null;\n\n        foreach ($items as $k => $item) {\n            if (!$nextAdapter || $item->isHit()) {\n                yield $k => $item;\n            } else {\n                $missing[] = $k;\n                $misses[$k] = $item;\n            }\n        }\n\n        if ($missing) {\n            $syncItem = self::$syncItem;\n            $adapter = $this->adapters[$adapterIndex];\n            $items = $this->generateItems($nextAdapter->getItems($missing), $nextAdapterIndex);\n\n            foreach ($items as $k => $item) {\n                if ($item->isHit()) {\n                    $adapter->save($syncItem($item, $misses[$k], $this->defaultLifetime));\n                }\n\n                yield $k => $item;\n            }\n        }\n    }\n\n    public function hasItem(mixed $key): bool\n    {\n        foreach ($this->adapters as $adapter) {\n            if ($adapter->hasItem($key)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    public function clear(string $prefix = ''): bool\n    {\n        $cleared = true;\n        $i = $this->adapterCount;\n\n        while ($i--) {\n            if ($this->adapters[$i] instanceof AdapterInterface) {\n                $cleared = $this->adapters[$i]->clear($prefix) && $cleared;\n            } else {\n                $cleared = $this->adapters[$i]->clear() && $cleared;\n            }\n        }\n\n        return $cleared;\n    }\n\n    public function deleteItem(mixed $key): bool\n    {\n        $deleted = true;\n        $i = $this->adapterCount;\n\n        while ($i--) {\n            $deleted = $this->adapters[$i]->deleteItem($key) && $deleted;\n        }\n\n        return $deleted;\n    }\n\n    public function deleteItems(array $keys): bool\n    {\n        $deleted = true;\n        $i = $this->adapterCount;\n\n        while ($i--) {\n            $deleted = $this->adapters[$i]->deleteItems($keys) && $deleted;\n        }\n\n        return $deleted;\n    }\n\n    public function save(CacheItemInterface $item): bool\n    {\n        $saved = true;\n        $i = $this->adapterCount;\n\n        while ($i--) {\n            $saved = $this->adapters[$i]->save($item) && $saved;\n        }\n\n        return $saved;\n    }\n\n    public function saveDeferred(CacheItemInterface $item): bool\n    {\n        $saved = true;\n        $i = $this->adapterCount;\n\n        while ($i--) {\n            $saved = $this->adapters[$i]->saveDeferred($item) && $saved;\n        }\n\n        return $saved;\n    }\n\n    public function commit(): bool\n    {\n        $committed = true;\n        $i = $this->adapterCount;\n\n        while ($i--) {\n            $committed = $this->adapters[$i]->commit() && $committed;\n        }\n\n        return $committed;\n    }\n\n    public function prune(): bool\n    {\n        $pruned = true;\n\n        foreach ($this->adapters as $adapter) {\n            if ($adapter instanceof PruneableInterface) {\n                $pruned = $adapter->prune() && $pruned;\n            }\n        }\n\n        return $pruned;\n    }\n\n    /**\n     * @return void\n     */\n    public function reset()\n    {\n        foreach ($this->adapters as $adapter) {\n            if ($adapter instanceof ResetInterface) {\n                $adapter->reset();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Symfony\\Component\\Cache\\Exception\\CacheException;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller;\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\n\n/**\n * @author Antonio Jose Cerezo Aranda <aj.cerezo@gmail.com>\n */\nclass CouchbaseBucketAdapter extends AbstractAdapter\n{\n    private const THIRTY_DAYS_IN_SECONDS = 2592000;\n    private const MAX_KEY_LENGTH = 250;\n    private const KEY_NOT_FOUND = 13;\n    private const VALID_DSN_OPTIONS = [\n        'operationTimeout',\n        'configTimeout',\n        'configNodeTimeout',\n        'n1qlTimeout',\n        'httpTimeout',\n        'configDelay',\n        'htconfigIdleTimeout',\n        'durabilityInterval',\n        'durabilityTimeout',\n    ];\n\n    private \\CouchbaseBucket $bucket;\n    private MarshallerInterface $marshaller;\n\n    public function __construct(\\CouchbaseBucket $bucket, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null)\n    {\n        if (!static::isSupported()) {\n            throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.');\n        }\n\n        $this->maxIdLength = static::MAX_KEY_LENGTH;\n\n        $this->bucket = $bucket;\n\n        parent::__construct($namespace, $defaultLifetime);\n        $this->enableVersioning();\n        $this->marshaller = $marshaller ?? new DefaultMarshaller();\n    }\n\n    public static function createConnection(#[\\SensitiveParameter] array|string $servers, array $options = []): \\CouchbaseBucket\n    {\n        if (\\is_string($servers)) {\n            $servers = [$servers];\n        }\n\n        if (!static::isSupported()) {\n            throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.');\n        }\n\n        set_error_handler(static fn ($type, $msg, $file, $line) => throw new \\ErrorException($msg, 0, $type, $file, $line));\n\n        $dsnPattern = '/^(?<protocol>couchbase(?:s)?)\\:\\/\\/(?:(?<username>[^\\:]+)\\:(?<password>[^\\@]{6,})@)?'\n            .'(?<host>[^\\:]+(?:\\:\\d+)?)(?:\\/(?<bucketName>[^\\?]+))(?:\\?(?<options>.*))?$/i';\n\n        $newServers = [];\n        $protocol = 'couchbase';\n        try {\n            $options = self::initOptions($options);\n            $username = $options['username'];\n            $password = $options['password'];\n\n            foreach ($servers as $dsn) {\n                if (!str_starts_with($dsn, 'couchbase:')) {\n                    throw new InvalidArgumentException('Invalid Couchbase DSN: it does not start with \"couchbase:\".');\n                }\n\n                preg_match($dsnPattern, $dsn, $matches);\n\n                $username = $matches['username'] ?: $username;\n                $password = $matches['password'] ?: $password;\n                $protocol = $matches['protocol'] ?: $protocol;\n\n                if (isset($matches['options'])) {\n                    $optionsInDsn = self::getOptions($matches['options']);\n\n                    foreach ($optionsInDsn as $parameter => $value) {\n                        $options[$parameter] = $value;\n                    }\n                }\n\n                $newServers[] = $matches['host'];\n            }\n\n            $connectionString = $protocol.'://'.implode(',', $newServers);\n\n            $client = new \\CouchbaseCluster($connectionString);\n            $client->authenticateAs($username, $password);\n\n            $bucket = $client->openBucket($matches['bucketName']);\n\n            unset($options['username'], $options['password']);\n            foreach ($options as $option => $value) {\n                if (!empty($value)) {\n                    $bucket->$option = $value;\n                }\n            }\n\n            return $bucket;\n        } finally {\n            restore_error_handler();\n        }\n    }\n\n    public static function isSupported(): bool\n    {\n        return \\extension_loaded('couchbase') && version_compare(phpversion('couchbase'), '2.6.0', '>=') && version_compare(phpversion('couchbase'), '3.0', '<');\n    }\n\n    private static function getOptions(string $options): array\n    {\n        $results = [];\n        $optionsInArray = explode('&', $options);\n\n        foreach ($optionsInArray as $option) {\n            [$key, $value] = explode('=', $option);\n\n            if (\\in_array($key, static::VALID_DSN_OPTIONS, true)) {\n                $results[$key] = $value;\n            }\n        }\n\n        return $results;\n    }\n\n    private static function initOptions(array $options): array\n    {\n        $options['username'] ??= '';\n        $options['password'] ??= '';\n        $options['operationTimeout'] ??= 0;\n        $options['configTimeout'] ??= 0;\n        $options['configNodeTimeout'] ??= 0;\n        $options['n1qlTimeout'] ??= 0;\n        $options['httpTimeout'] ??= 0;\n        $options['configDelay'] ??= 0;\n        $options['htconfigIdleTimeout'] ??= 0;\n        $options['durabilityInterval'] ??= 0;\n        $options['durabilityTimeout'] ??= 0;\n\n        return $options;\n    }\n\n    protected function doFetch(array $ids): iterable\n    {\n        $resultsCouchbase = $this->bucket->get($ids);\n\n        $results = [];\n        foreach ($resultsCouchbase as $key => $value) {\n            if (null !== $value->error) {\n                continue;\n            }\n            $results[$key] = $this->marshaller->unmarshall($value->value);\n        }\n\n        return $results;\n    }\n\n    protected function doHave(string $id): bool\n    {\n        return false !== $this->bucket->get($id);\n    }\n\n    protected function doClear(string $namespace): bool\n    {\n        if ('' === $namespace) {\n            $this->bucket->manager()->flush();\n\n            return true;\n        }\n\n        return false;\n    }\n\n    protected function doDelete(array $ids): bool\n    {\n        $results = $this->bucket->remove(array_values($ids));\n\n        foreach ($results as $key => $result) {\n            if (null !== $result->error && static::KEY_NOT_FOUND !== $result->error->getCode()) {\n                continue;\n            }\n            unset($results[$key]);\n        }\n\n        return 0 === \\count($results);\n    }\n\n    protected function doSave(array $values, int $lifetime): array|bool\n    {\n        if (!$values = $this->marshaller->marshall($values, $failed)) {\n            return $failed;\n        }\n\n        $lifetime = $this->normalizeExpiry($lifetime);\n\n        $ko = [];\n        foreach ($values as $key => $value) {\n            $result = $this->bucket->upsert($key, $value, ['expiry' => $lifetime]);\n\n            if (null !== $result->error) {\n                $ko[$key] = $result;\n            }\n        }\n\n        return [] === $ko ? true : $ko;\n    }\n\n    private function normalizeExpiry(int $expiry): int\n    {\n        if ($expiry && $expiry > static::THIRTY_DAYS_IN_SECONDS) {\n            $expiry += time();\n        }\n\n        return $expiry;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Couchbase\\Bucket;\nuse Couchbase\\Cluster;\nuse Couchbase\\ClusterOptions;\nuse Couchbase\\Collection;\nuse Couchbase\\DocumentNotFoundException;\nuse Couchbase\\UpsertOptions;\nuse Symfony\\Component\\Cache\\Exception\\CacheException;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller;\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\n\n/**\n * @author Antonio Jose Cerezo Aranda <aj.cerezo@gmail.com>\n */\nclass CouchbaseCollectionAdapter extends AbstractAdapter\n{\n    private const MAX_KEY_LENGTH = 250;\n\n    private Collection $connection;\n    private MarshallerInterface $marshaller;\n\n    public function __construct(Collection $connection, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null)\n    {\n        if (!static::isSupported()) {\n            throw new CacheException('Couchbase >= 3.0.5 < 4.0.0 is required.');\n        }\n\n        $this->maxIdLength = static::MAX_KEY_LENGTH;\n\n        $this->connection = $connection;\n\n        parent::__construct($namespace, $defaultLifetime);\n        $this->enableVersioning();\n        $this->marshaller = $marshaller ?? new DefaultMarshaller();\n    }\n\n    public static function createConnection(#[\\SensitiveParameter] array|string $dsn, array $options = []): Bucket|Collection\n    {\n        if (\\is_string($dsn)) {\n            $dsn = [$dsn];\n        }\n\n        if (!static::isSupported()) {\n            throw new CacheException('Couchbase >= 3.0.5 < 4.0.0 is required.');\n        }\n\n        set_error_handler(static fn ($type, $msg, $file, $line) => throw new \\ErrorException($msg, 0, $type, $file, $line));\n\n        $dsnPattern = '/^(?<protocol>couchbase(?:s)?)\\:\\/\\/(?:(?<username>[^\\:]+)\\:(?<password>[^\\@]{6,})@)?'\n            .'(?<host>[^\\:]+(?:\\:\\d+)?)(?:\\/(?<bucketName>[^\\/\\?]+))(?:(?:\\/(?<scopeName>[^\\/]+))'\n            .'(?:\\/(?<collectionName>[^\\/\\?]+)))?(?:\\/)?(?:\\?(?<options>.*))?$/i';\n\n        $newServers = [];\n        $protocol = 'couchbase';\n        try {\n            $username = $options['username'] ?? '';\n            $password = $options['password'] ?? '';\n\n            foreach ($dsn as $server) {\n                if (!str_starts_with($server, 'couchbase:')) {\n                    throw new InvalidArgumentException('Invalid Couchbase DSN: it does not start with \"couchbase:\".');\n                }\n\n                preg_match($dsnPattern, $server, $matches);\n\n                $username = $matches['username'] ?: $username;\n                $password = $matches['password'] ?: $password;\n                $protocol = $matches['protocol'] ?: $protocol;\n\n                if (isset($matches['options'])) {\n                    $optionsInDsn = self::getOptions($matches['options']);\n\n                    foreach ($optionsInDsn as $parameter => $value) {\n                        $options[$parameter] = $value;\n                    }\n                }\n\n                $newServers[] = $matches['host'];\n            }\n\n            $option = isset($matches['options']) ? '?'.$matches['options'] : '';\n            $connectionString = $protocol.'://'.implode(',', $newServers).$option;\n\n            $clusterOptions = new ClusterOptions();\n            $clusterOptions->credentials($username, $password);\n\n            $client = new Cluster($connectionString, $clusterOptions);\n\n            $bucket = $client->bucket($matches['bucketName']);\n            $collection = $bucket->defaultCollection();\n            if (!empty($matches['scopeName'])) {\n                $scope = $bucket->scope($matches['scopeName']);\n                $collection = $scope->collection($matches['collectionName']);\n            }\n\n            return $collection;\n        } finally {\n            restore_error_handler();\n        }\n    }\n\n    public static function isSupported(): bool\n    {\n        return \\extension_loaded('couchbase') && version_compare(phpversion('couchbase'), '3.0.5', '>=') && version_compare(phpversion('couchbase'), '4.0', '<');\n    }\n\n    private static function getOptions(string $options): array\n    {\n        $results = [];\n        $optionsInArray = explode('&', $options);\n\n        foreach ($optionsInArray as $option) {\n            [$key, $value] = explode('=', $option);\n\n            $results[$key] = $value;\n        }\n\n        return $results;\n    }\n\n    protected function doFetch(array $ids): array\n    {\n        $results = [];\n        foreach ($ids as $id) {\n            try {\n                $resultCouchbase = $this->connection->get($id);\n            } catch (DocumentNotFoundException) {\n                continue;\n            }\n\n            $content = $resultCouchbase->value ?? $resultCouchbase->content();\n\n            $results[$id] = $this->marshaller->unmarshall($content);\n        }\n\n        return $results;\n    }\n\n    protected function doHave($id): bool\n    {\n        return $this->connection->exists($id)->exists();\n    }\n\n    protected function doClear($namespace): bool\n    {\n        return false;\n    }\n\n    protected function doDelete(array $ids): bool\n    {\n        $idsErrors = [];\n        foreach ($ids as $id) {\n            try {\n                $result = $this->connection->remove($id);\n\n                if (null === $result->mutationToken()) {\n                    $idsErrors[] = $id;\n                }\n            } catch (DocumentNotFoundException) {\n            }\n        }\n\n        return 0 === \\count($idsErrors);\n    }\n\n    protected function doSave(array $values, $lifetime): array|bool\n    {\n        if (!$values = $this->marshaller->marshall($values, $failed)) {\n            return $failed;\n        }\n\n        $upsertOptions = new UpsertOptions();\n        $upsertOptions->expiry($lifetime);\n\n        $ko = [];\n        foreach ($values as $key => $value) {\n            try {\n                $this->connection->upsert($key, $value, $upsertOptions);\n            } catch (\\Exception) {\n                $ko[$key] = '';\n            }\n        }\n\n        return [] === $ko ? true : $ko;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Doctrine\\DBAL\\ArrayParameterType;\nuse Doctrine\\DBAL\\Configuration;\nuse Doctrine\\DBAL\\Connection;\nuse Doctrine\\DBAL\\Driver\\ServerInfoAwareConnection;\nuse Doctrine\\DBAL\\DriverManager;\nuse Doctrine\\DBAL\\Exception as DBALException;\nuse Doctrine\\DBAL\\Exception\\TableNotFoundException;\nuse Doctrine\\DBAL\\ParameterType;\nuse Doctrine\\DBAL\\Schema\\DefaultSchemaManagerFactory;\nuse Doctrine\\DBAL\\Schema\\Schema;\nuse Doctrine\\DBAL\\ServerVersionProvider;\nuse Doctrine\\DBAL\\Tools\\DsnParser;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller;\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\nuse Symfony\\Component\\Cache\\PruneableInterface;\n\nclass DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface\n{\n    private const MAX_KEY_LENGTH = 255;\n\n    private MarshallerInterface $marshaller;\n    private Connection $conn;\n    private string $platformName;\n    private string $serverVersion;\n    private string $table = 'cache_items';\n    private string $idCol = 'item_id';\n    private string $dataCol = 'item_data';\n    private string $lifetimeCol = 'item_lifetime';\n    private string $timeCol = 'item_time';\n    private string $namespace;\n\n    /**\n     * You can either pass an existing database Doctrine DBAL Connection or\n     * a DSN string that will be used to connect to the database.\n     *\n     * The cache table is created automatically when possible.\n     * Otherwise, use the createTable() method.\n     *\n     * List of available options:\n     *  * db_table: The name of the table [default: cache_items]\n     *  * db_id_col: The column where to store the cache id [default: item_id]\n     *  * db_data_col: The column where to store the cache data [default: item_data]\n     *  * db_lifetime_col: The column where to store the lifetime [default: item_lifetime]\n     *  * db_time_col: The column where to store the timestamp [default: item_time]\n     *\n     * @throws InvalidArgumentException When namespace contains invalid characters\n     */\n    public function __construct(Connection|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], ?MarshallerInterface $marshaller = null)\n    {\n        if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) {\n            throw new InvalidArgumentException(sprintf('Namespace contains \"%s\" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0]));\n        }\n\n        if ($connOrDsn instanceof Connection) {\n            $this->conn = $connOrDsn;\n        } else {\n            if (!class_exists(DriverManager::class)) {\n                throw new InvalidArgumentException('Failed to parse DSN. Try running \"composer require doctrine/dbal\".');\n            }\n            if (class_exists(DsnParser::class)) {\n                $params = (new DsnParser([\n                    'db2' => 'ibm_db2',\n                    'mssql' => 'pdo_sqlsrv',\n                    'mysql' => 'pdo_mysql',\n                    'mysql2' => 'pdo_mysql',\n                    'postgres' => 'pdo_pgsql',\n                    'postgresql' => 'pdo_pgsql',\n                    'pgsql' => 'pdo_pgsql',\n                    'sqlite' => 'pdo_sqlite',\n                    'sqlite3' => 'pdo_sqlite',\n                ]))->parse($connOrDsn);\n            } else {\n                $params = ['url' => $connOrDsn];\n            }\n\n            $config = new Configuration();\n            if (class_exists(DefaultSchemaManagerFactory::class)) {\n                $config->setSchemaManagerFactory(new DefaultSchemaManagerFactory());\n            }\n\n            $this->conn = DriverManager::getConnection($params, $config);\n        }\n\n        $this->maxIdLength = self::MAX_KEY_LENGTH;\n        $this->table = $options['db_table'] ?? $this->table;\n        $this->idCol = $options['db_id_col'] ?? $this->idCol;\n        $this->dataCol = $options['db_data_col'] ?? $this->dataCol;\n        $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol;\n        $this->timeCol = $options['db_time_col'] ?? $this->timeCol;\n        $this->namespace = $namespace;\n        $this->marshaller = $marshaller ?? new DefaultMarshaller();\n\n        parent::__construct($namespace, $defaultLifetime);\n    }\n\n    /**\n     * Creates the table to store cache items which can be called once for setup.\n     *\n     * Cache ID are saved in a column of maximum length 255. Cache data is\n     * saved in a BLOB.\n     *\n     * @throws DBALException When the table already exists\n     */\n    public function createTable(): void\n    {\n        $schema = new Schema();\n        $this->addTableToSchema($schema);\n\n        foreach ($schema->toSql($this->conn->getDatabasePlatform()) as $sql) {\n            $this->conn->executeStatement($sql);\n        }\n    }\n\n    /**\n     * @param \\Closure $isSameDatabase\n     */\n    public function configureSchema(Schema $schema, Connection $forConnection/* , \\Closure $isSameDatabase */): void\n    {\n        if ($schema->hasTable($this->table)) {\n            return;\n        }\n\n        $isSameDatabase = 2 < \\func_num_args() ? func_get_arg(2) : static fn () => false;\n\n        if ($forConnection !== $this->conn && !$isSameDatabase($this->conn->executeStatement(...))) {\n            return;\n        }\n\n        $this->addTableToSchema($schema);\n    }\n\n    public function prune(): bool\n    {\n        $deleteSql = \"DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ?\";\n        $params = [time()];\n        $paramTypes = [ParameterType::INTEGER];\n\n        if ('' !== $this->namespace) {\n            $deleteSql .= \" AND $this->idCol LIKE ?\";\n            $params[] = sprintf('%s%%', $this->namespace);\n            $paramTypes[] = ParameterType::STRING;\n        }\n\n        try {\n            $this->conn->executeStatement($deleteSql, $params, $paramTypes);\n        } catch (TableNotFoundException) {\n        }\n\n        return true;\n    }\n\n    protected function doFetch(array $ids): iterable\n    {\n        $now = time();\n        $expired = [];\n\n        $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 (?)\";\n        $result = $this->conn->executeQuery($sql, [\n            $now,\n            $ids,\n        ], [\n            ParameterType::INTEGER,\n            class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY,\n        ])->iterateNumeric();\n\n        foreach ($result as $row) {\n            if (null === $row[1]) {\n                $expired[] = $row[0];\n            } else {\n                yield $row[0] => $this->marshaller->unmarshall(\\is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]);\n            }\n        }\n\n        if ($expired) {\n            $sql = \"DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN (?)\";\n            $this->conn->executeStatement($sql, [\n                $now,\n                $expired,\n            ], [\n                ParameterType::INTEGER,\n                class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY,\n            ]);\n        }\n    }\n\n    protected function doHave(string $id): bool\n    {\n        $sql = \"SELECT 1 FROM $this->table WHERE $this->idCol = ? AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ?)\";\n        $result = $this->conn->executeQuery($sql, [\n            $id,\n            time(),\n        ], [\n            ParameterType::STRING,\n            ParameterType::INTEGER,\n        ]);\n\n        return (bool) $result->fetchOne();\n    }\n\n    protected function doClear(string $namespace): bool\n    {\n        if ('' === $namespace) {\n            $sql = $this->conn->getDatabasePlatform()->getTruncateTableSQL($this->table);\n        } else {\n            $sql = \"DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'\";\n        }\n\n        try {\n            $this->conn->executeStatement($sql);\n        } catch (TableNotFoundException) {\n        }\n\n        return true;\n    }\n\n    protected function doDelete(array $ids): bool\n    {\n        $sql = \"DELETE FROM $this->table WHERE $this->idCol IN (?)\";\n        try {\n            $this->conn->executeStatement($sql, [array_values($ids)], [class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY]);\n        } catch (TableNotFoundException) {\n        }\n\n        return true;\n    }\n\n    protected function doSave(array $values, int $lifetime): array|bool\n    {\n        if (!$values = $this->marshaller->marshall($values, $failed)) {\n            return $failed;\n        }\n\n        $platformName = $this->getPlatformName();\n        $insertSql = \"INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?)\";\n\n        switch (true) {\n            case 'mysql' === $platformName:\n                $sql = $insertSql.\" ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)\";\n                break;\n            case 'oci' === $platformName:\n                // DUAL is Oracle specific dummy table\n                $sql = \"MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) \".\n                    \"WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) \".\n                    \"WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?\";\n                break;\n            case 'sqlsrv' === $platformName && version_compare($this->getServerVersion(), '10', '>='):\n                // MERGE is only available since SQL Server 2008 and must be terminated by semicolon\n                // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx\n                $sql = \"MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) \".\n                    \"WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) \".\n                    \"WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;\";\n                break;\n            case 'sqlite' === $platformName:\n                $sql = 'INSERT OR REPLACE'.substr($insertSql, 6);\n                break;\n            case 'pgsql' === $platformName && version_compare($this->getServerVersion(), '9.5', '>='):\n                $sql = $insertSql.\" ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)\";\n                break;\n            default:\n                $platformName = null;\n                $sql = \"UPDATE $this->table SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ? WHERE $this->idCol = ?\";\n                break;\n        }\n\n        $now = time();\n        $lifetime = $lifetime ?: null;\n        try {\n            $stmt = $this->conn->prepare($sql);\n        } catch (TableNotFoundException) {\n            if (!$this->conn->isTransactionActive() || \\in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) {\n                $this->createTable();\n            }\n            $stmt = $this->conn->prepare($sql);\n        }\n\n        if ('sqlsrv' === $platformName || 'oci' === $platformName) {\n            $bind = static function ($id, $data) use ($stmt) {\n                $stmt->bindValue(1, $id);\n                $stmt->bindValue(2, $id);\n                $stmt->bindValue(3, $data, ParameterType::LARGE_OBJECT);\n                $stmt->bindValue(6, $data, ParameterType::LARGE_OBJECT);\n            };\n            $stmt->bindValue(4, $lifetime, ParameterType::INTEGER);\n            $stmt->bindValue(5, $now, ParameterType::INTEGER);\n            $stmt->bindValue(7, $lifetime, ParameterType::INTEGER);\n            $stmt->bindValue(8, $now, ParameterType::INTEGER);\n        } elseif (null !== $platformName) {\n            $bind = static function ($id, $data) use ($stmt) {\n                $stmt->bindValue(1, $id);\n                $stmt->bindValue(2, $data, ParameterType::LARGE_OBJECT);\n            };\n            $stmt->bindValue(3, $lifetime, ParameterType::INTEGER);\n            $stmt->bindValue(4, $now, ParameterType::INTEGER);\n        } else {\n            $stmt->bindValue(2, $lifetime, ParameterType::INTEGER);\n            $stmt->bindValue(3, $now, ParameterType::INTEGER);\n\n            $insertStmt = $this->conn->prepare($insertSql);\n            $insertStmt->bindValue(3, $lifetime, ParameterType::INTEGER);\n            $insertStmt->bindValue(4, $now, ParameterType::INTEGER);\n\n            $bind = static function ($id, $data) use ($stmt, $insertStmt) {\n                $stmt->bindValue(1, $data, ParameterType::LARGE_OBJECT);\n                $stmt->bindValue(4, $id);\n                $insertStmt->bindValue(1, $id);\n                $insertStmt->bindValue(2, $data, ParameterType::LARGE_OBJECT);\n            };\n        }\n\n        foreach ($values as $id => $data) {\n            $bind($id, $data);\n            try {\n                $rowCount = $stmt->executeStatement();\n            } catch (TableNotFoundException) {\n                if (!$this->conn->isTransactionActive() || \\in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) {\n                    $this->createTable();\n                }\n                $rowCount = $stmt->executeStatement();\n            }\n            if (null === $platformName && 0 === $rowCount) {\n                try {\n                    $insertStmt->executeStatement();\n                } catch (DBALException) {\n                    // A concurrent write won, let it be\n                }\n            }\n        }\n\n        return $failed;\n    }\n\n    /**\n     * @internal\n     */\n    protected function getId(mixed $key): string\n    {\n        if ('pgsql' !== $this->platformName ??= $this->getPlatformName()) {\n            return parent::getId($key);\n        }\n\n        if (str_contains($key, \"\\0\") || str_contains($key, '%') || !preg_match('//u', $key)) {\n            $key = rawurlencode($key);\n        }\n\n        return parent::getId($key);\n    }\n\n    private function getPlatformName(): string\n    {\n        if (isset($this->platformName)) {\n            return $this->platformName;\n        }\n\n        $platform = $this->conn->getDatabasePlatform();\n\n        return $this->platformName = match (true) {\n            $platform instanceof \\Doctrine\\DBAL\\Platforms\\MySQLPlatform,\n            $platform instanceof \\Doctrine\\DBAL\\Platforms\\MySQL57Platform => 'mysql',\n            $platform instanceof \\Doctrine\\DBAL\\Platforms\\SqlitePlatform => 'sqlite',\n            $platform instanceof \\Doctrine\\DBAL\\Platforms\\PostgreSQLPlatform,\n            $platform instanceof \\Doctrine\\DBAL\\Platforms\\PostgreSQL94Platform => 'pgsql',\n            $platform instanceof \\Doctrine\\DBAL\\Platforms\\OraclePlatform => 'oci',\n            $platform instanceof \\Doctrine\\DBAL\\Platforms\\SQLServerPlatform,\n            $platform instanceof \\Doctrine\\DBAL\\Platforms\\SQLServer2012Platform => 'sqlsrv',\n            default => $platform::class,\n        };\n    }\n\n    private function getServerVersion(): string\n    {\n        if (isset($this->serverVersion)) {\n            return $this->serverVersion;\n        }\n\n        if ($this->conn instanceof ServerVersionProvider || $this->conn instanceof ServerInfoAwareConnection) {\n            return $this->serverVersion = $this->conn->getServerVersion();\n        }\n\n        // The condition should be removed once support for DBAL <3.3 is dropped\n        $conn = method_exists($this->conn, 'getNativeConnection') ? $this->conn->getNativeConnection() : $this->conn->getWrappedConnection();\n\n        return $this->serverVersion = $conn->getAttribute(\\PDO::ATTR_SERVER_VERSION);\n    }\n\n    private function addTableToSchema(Schema $schema): void\n    {\n        $types = [\n            'mysql' => 'binary',\n            'sqlite' => 'text',\n        ];\n\n        $table = $schema->createTable($this->table);\n        $table->addColumn($this->idCol, $types[$this->getPlatformName()] ?? 'string', ['length' => 255]);\n        $table->addColumn($this->dataCol, 'blob', ['length' => 16777215]);\n        $table->addColumn($this->lifetimeCol, 'integer', ['unsigned' => true, 'notnull' => false]);\n        $table->addColumn($this->timeCol, 'integer', ['unsigned' => true]);\n        $table->setPrimaryKey([$this->idCol]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/FilesystemAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller;\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\nuse Symfony\\Component\\Cache\\PruneableInterface;\nuse Symfony\\Component\\Cache\\Traits\\FilesystemTrait;\n\nclass FilesystemAdapter extends AbstractAdapter implements PruneableInterface\n{\n    use FilesystemTrait;\n\n    public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $directory = null, ?MarshallerInterface $marshaller = null)\n    {\n        $this->marshaller = $marshaller ?? new DefaultMarshaller();\n        parent::__construct('', $defaultLifetime);\n        $this->init($namespace, $directory);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\nuse Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller;\nuse Symfony\\Component\\Cache\\PruneableInterface;\nuse Symfony\\Component\\Cache\\Traits\\FilesystemTrait;\n\n/**\n * Stores tag id <> cache id relationship as a symlink, and lookup on invalidation calls.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n * @author André Rømcke <andre.romcke+symfony@gmail.com>\n */\nclass FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements PruneableInterface\n{\n    use FilesystemTrait {\n        prune as private doPrune;\n        doClear as private doClearCache;\n        doSave as private doSaveCache;\n    }\n\n    /**\n     * Folder used for tag symlinks.\n     */\n    private const TAG_FOLDER = 'tags';\n\n    public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $directory = null, ?MarshallerInterface $marshaller = null)\n    {\n        $this->marshaller = new TagAwareMarshaller($marshaller);\n        parent::__construct('', $defaultLifetime);\n        $this->init($namespace, $directory);\n    }\n\n    public function prune(): bool\n    {\n        $ok = $this->doPrune();\n\n        set_error_handler(static function () {});\n        $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\n        try {\n            foreach ($this->scanHashDir($this->directory.self::TAG_FOLDER.\\DIRECTORY_SEPARATOR) as $dir) {\n                $dir .= \\DIRECTORY_SEPARATOR;\n                $keepDir = false;\n                for ($i = 0; $i < 38; ++$i) {\n                    if (!is_dir($dir.$chars[$i])) {\n                        continue;\n                    }\n                    for ($j = 0; $j < 38; ++$j) {\n                        if (!is_dir($d = $dir.$chars[$i].\\DIRECTORY_SEPARATOR.$chars[$j])) {\n                            continue;\n                        }\n                        foreach (scandir($d, \\SCANDIR_SORT_NONE) ?: [] as $link) {\n                            if ('.' === $link || '..' === $link) {\n                                continue;\n                            }\n                            if ('_' !== $dir[-2] && realpath($d.\\DIRECTORY_SEPARATOR.$link)) {\n                                $keepDir = true;\n                            } else {\n                                unlink($d.\\DIRECTORY_SEPARATOR.$link);\n                            }\n                        }\n                        $keepDir ?: rmdir($d);\n                    }\n                    $keepDir ?: rmdir($dir.$chars[$i]);\n                }\n                $keepDir ?: rmdir($dir);\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        return $ok;\n    }\n\n    protected function doClear(string $namespace): bool\n    {\n        $ok = $this->doClearCache($namespace);\n\n        if ('' !== $namespace) {\n            return $ok;\n        }\n\n        set_error_handler(static function () {});\n        $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\n        $this->tmpSuffix ??= str_replace('/', '-', base64_encode(random_bytes(6)));\n\n        try {\n            foreach ($this->scanHashDir($this->directory.self::TAG_FOLDER.\\DIRECTORY_SEPARATOR) as $dir) {\n                if (rename($dir, $renamed = substr_replace($dir, $this->tmpSuffix.'_', -9))) {\n                    $dir = $renamed.\\DIRECTORY_SEPARATOR;\n                } else {\n                    $dir .= \\DIRECTORY_SEPARATOR;\n                    $renamed = null;\n                }\n\n                for ($i = 0; $i < 38; ++$i) {\n                    if (!is_dir($dir.$chars[$i])) {\n                        continue;\n                    }\n                    for ($j = 0; $j < 38; ++$j) {\n                        if (!is_dir($d = $dir.$chars[$i].\\DIRECTORY_SEPARATOR.$chars[$j])) {\n                            continue;\n                        }\n                        foreach (scandir($d, \\SCANDIR_SORT_NONE) ?: [] as $link) {\n                            if ('.' !== $link && '..' !== $link && (null !== $renamed || !realpath($d.\\DIRECTORY_SEPARATOR.$link))) {\n                                unlink($d.\\DIRECTORY_SEPARATOR.$link);\n                            }\n                        }\n                        null === $renamed ?: rmdir($d);\n                    }\n                    null === $renamed ?: rmdir($dir.$chars[$i]);\n                }\n                null === $renamed ?: rmdir($renamed);\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        return $ok;\n    }\n\n    protected function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []): array\n    {\n        $failed = $this->doSaveCache($values, $lifetime);\n\n        // Add Tags as symlinks\n        foreach ($addTagData as $tagId => $ids) {\n            $tagFolder = $this->getTagFolder($tagId);\n            foreach ($ids as $id) {\n                if ($failed && \\in_array($id, $failed, true)) {\n                    continue;\n                }\n\n                $file = $this->getFile($id);\n\n                if (!@symlink($file, $tagLink = $this->getFile($id, true, $tagFolder)) && !is_link($tagLink)) {\n                    @unlink($file);\n                    $failed[] = $id;\n                }\n            }\n        }\n\n        // Unlink removed Tags\n        foreach ($removeTagData as $tagId => $ids) {\n            $tagFolder = $this->getTagFolder($tagId);\n            foreach ($ids as $id) {\n                if ($failed && \\in_array($id, $failed, true)) {\n                    continue;\n                }\n\n                @unlink($this->getFile($id, false, $tagFolder));\n            }\n        }\n\n        return $failed;\n    }\n\n    protected function doDeleteYieldTags(array $ids): iterable\n    {\n        foreach ($ids as $id) {\n            $file = $this->getFile($id);\n            if (!is_file($file) || !$h = @fopen($file, 'r')) {\n                continue;\n            }\n\n            if (!@unlink($file)) {\n                fclose($h);\n                continue;\n            }\n\n            $meta = explode(\"\\n\", fread($h, 4096), 3)[2] ?? '';\n\n            // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F\n            if (13 < \\strlen($meta) && \"\\x9D\" === $meta[0] && \"\\0\" === $meta[5] && \"\\x5F\" === $meta[9]) {\n                $meta[9] = \"\\0\";\n                $tagLen = unpack('Nlen', $meta, 9)['len'];\n                $meta = substr($meta, 13, $tagLen);\n\n                if (0 < $tagLen -= \\strlen($meta)) {\n                    $meta .= fread($h, $tagLen);\n                }\n\n                try {\n                    yield $id => '' === $meta ? [] : $this->marshaller->unmarshall($meta);\n                } catch (\\Exception) {\n                    yield $id => [];\n                }\n            }\n\n            fclose($h);\n        }\n    }\n\n    protected function doDeleteTagRelations(array $tagData): bool\n    {\n        foreach ($tagData as $tagId => $idList) {\n            $tagFolder = $this->getTagFolder($tagId);\n            foreach ($idList as $id) {\n                @unlink($this->getFile($id, false, $tagFolder));\n            }\n        }\n\n        return true;\n    }\n\n    protected function doInvalidate(array $tagIds): bool\n    {\n        foreach ($tagIds as $tagId) {\n            if (!is_dir($tagFolder = $this->getTagFolder($tagId))) {\n                continue;\n            }\n\n            $this->tmpSuffix ??= str_replace('/', '-', base64_encode(random_bytes(6)));\n\n            set_error_handler(static function () {});\n\n            try {\n                if (rename($tagFolder, $renamed = substr_replace($tagFolder, $this->tmpSuffix.'_', -10))) {\n                    $tagFolder = $renamed.\\DIRECTORY_SEPARATOR;\n                } else {\n                    $renamed = null;\n                }\n\n                foreach ($this->scanHashDir($tagFolder) as $itemLink) {\n                    unlink(realpath($itemLink) ?: $itemLink);\n                    unlink($itemLink);\n                }\n\n                if (null === $renamed) {\n                    continue;\n                }\n\n                $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\n                for ($i = 0; $i < 38; ++$i) {\n                    for ($j = 0; $j < 38; ++$j) {\n                        rmdir($tagFolder.$chars[$i].\\DIRECTORY_SEPARATOR.$chars[$j]);\n                    }\n                    rmdir($tagFolder.$chars[$i]);\n                }\n                rmdir($renamed);\n            } finally {\n                restore_error_handler();\n            }\n        }\n\n        return true;\n    }\n\n    private function getTagFolder(string $tagId): string\n    {\n        return $this->getFile($tagId, false, $this->directory.self::TAG_FOLDER.\\DIRECTORY_SEPARATOR).\\DIRECTORY_SEPARATOR;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/MemcachedAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Symfony\\Component\\Cache\\Exception\\CacheException;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller;\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\n\n/**\n * @author Rob Frawley 2nd <rmf@src.run>\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass MemcachedAdapter extends AbstractAdapter\n{\n    /**\n     * We are replacing characters that are illegal in Memcached keys with reserved characters from\n     * {@see \\Symfony\\Contracts\\Cache\\ItemInterface::RESERVED_CHARACTERS} that are legal in Memcached.\n     * Note: don’t use {@see \\Symfony\\Component\\Cache\\Adapter\\AbstractAdapter::NS_SEPARATOR}.\n     */\n    private const RESERVED_MEMCACHED = \" \\n\\r\\t\\v\\f\\0\";\n    private const RESERVED_PSR6 = '@()\\{}/';\n    private const MAX_KEY_LENGTH = 250;\n\n    private MarshallerInterface $marshaller;\n    private \\Memcached $client;\n    private \\Memcached $lazyClient;\n\n    /**\n     * Using a MemcachedAdapter with a TagAwareAdapter for storing tags is discouraged.\n     * Using a RedisAdapter is recommended instead. If you cannot do otherwise, be aware that:\n     * - the Memcached::OPT_BINARY_PROTOCOL must be enabled\n     *   (that's the default when using MemcachedAdapter::createConnection());\n     * - tags eviction by Memcached's LRU algorithm will break by-tags invalidation;\n     *   your Memcached memory should be large enough to never trigger LRU.\n     *\n     * Using a MemcachedAdapter as a pure items store is fine.\n     */\n    public function __construct(\\Memcached $client, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null)\n    {\n        if (!static::isSupported()) {\n            throw new CacheException('Memcached > 3.1.5 is required.');\n        }\n        $this->maxIdLength = self::MAX_KEY_LENGTH;\n\n        if ('Memcached' === $client::class) {\n            $opt = $client->getOption(\\Memcached::OPT_SERIALIZER);\n            if (\\Memcached::SERIALIZER_PHP !== $opt && \\Memcached::SERIALIZER_IGBINARY !== $opt) {\n                throw new CacheException('MemcachedAdapter: \"serializer\" option must be \"php\" or \"igbinary\".');\n            }\n            $this->maxIdLength -= \\strlen($client->getOption(\\Memcached::OPT_PREFIX_KEY));\n            $this->client = $client;\n        } else {\n            $this->lazyClient = $client;\n        }\n\n        parent::__construct($namespace, $defaultLifetime);\n        $this->enableVersioning();\n        $this->marshaller = $marshaller ?? new DefaultMarshaller();\n    }\n\n    /**\n     * @return bool\n     */\n    public static function isSupported()\n    {\n        return \\extension_loaded('memcached') && version_compare(phpversion('memcached'), '3.1.6', '>=');\n    }\n\n    /**\n     * Creates a Memcached instance.\n     *\n     * By default, the binary protocol, no block, and libketama compatible options are enabled.\n     *\n     * Examples for servers:\n     * - 'memcached://user:pass@localhost?weight=33'\n     * - [['localhost', 11211, 33]]\n     *\n     * @param array[]|string|string[] $servers An array of servers, a DSN, or an array of DSNs\n     *\n     * @throws \\ErrorException When invalid options or servers are provided\n     */\n    public static function createConnection(#[\\SensitiveParameter] array|string $servers, array $options = []): \\Memcached\n    {\n        if (\\is_string($servers)) {\n            $servers = [$servers];\n        }\n        if (!static::isSupported()) {\n            throw new CacheException('Memcached > 3.1.5 is required.');\n        }\n        set_error_handler(static fn ($type, $msg, $file, $line) => throw new \\ErrorException($msg, 0, $type, $file, $line));\n        try {\n            $client = new \\Memcached($options['persistent_id'] ?? null);\n            $username = $options['username'] ?? null;\n            $password = $options['password'] ?? null;\n\n            // parse any DSN in $servers\n            foreach ($servers as $i => $dsn) {\n                if (\\is_array($dsn)) {\n                    continue;\n                }\n                if (!str_starts_with($dsn, 'memcached:')) {\n                    throw new InvalidArgumentException('Invalid Memcached DSN: it does not start with \"memcached:\".');\n                }\n                $params = preg_replace_callback('#^memcached:(//)?(?:([^@]*+)@)?#', function ($m) use (&$username, &$password) {\n                    if (!empty($m[2])) {\n                        [$username, $password] = explode(':', $m[2], 2) + [1 => null];\n                        $username = rawurldecode($username);\n                        $password = null !== $password ? rawurldecode($password) : null;\n                    }\n\n                    return 'file:'.($m[1] ?? '');\n                }, $dsn);\n                if (false === $params = parse_url($params)) {\n                    throw new InvalidArgumentException('Invalid Memcached DSN.');\n                }\n                $query = $hosts = [];\n                if (isset($params['query'])) {\n                    parse_str($params['query'], $query);\n\n                    if (isset($query['host'])) {\n                        if (!\\is_array($hosts = $query['host'])) {\n                            throw new InvalidArgumentException('Invalid Memcached DSN: query parameter \"host\" must be an array.');\n                        }\n                        foreach ($hosts as $host => $weight) {\n                            if (false === $port = strrpos($host, ':')) {\n                                $hosts[$host] = [$host, 11211, (int) $weight];\n                            } else {\n                                $hosts[$host] = [substr($host, 0, $port), (int) substr($host, 1 + $port), (int) $weight];\n                            }\n                        }\n                        $hosts = array_values($hosts);\n                        unset($query['host']);\n                    }\n                    if ($hosts && !isset($params['host']) && !isset($params['path'])) {\n                        unset($servers[$i]);\n                        $servers = array_merge($servers, $hosts);\n                        continue;\n                    }\n                }\n                if (!isset($params['host']) && !isset($params['path'])) {\n                    throw new InvalidArgumentException('Invalid Memcached DSN: missing host or path.');\n                }\n                if (isset($params['path']) && preg_match('#/(\\d+)$#', $params['path'], $m)) {\n                    $params['weight'] = $m[1];\n                    $params['path'] = substr($params['path'], 0, -\\strlen($m[0]));\n                }\n                $params += [\n                    'host' => $params['host'] ?? $params['path'],\n                    'port' => isset($params['host']) ? 11211 : null,\n                    'weight' => 0,\n                ];\n                if ($query) {\n                    $params += $query;\n                    $options = $query + $options;\n                }\n\n                $servers[$i] = [$params['host'], $params['port'], $params['weight']];\n\n                if ($hosts) {\n                    $servers = array_merge($servers, $hosts);\n                }\n            }\n\n            // set client's options\n            unset($options['persistent_id'], $options['username'], $options['password'], $options['weight'], $options['lazy']);\n            $options = array_change_key_case($options, \\CASE_UPPER);\n            $client->setOption(\\Memcached::OPT_BINARY_PROTOCOL, true);\n            $client->setOption(\\Memcached::OPT_NO_BLOCK, true);\n            $client->setOption(\\Memcached::OPT_TCP_NODELAY, true);\n            if (!\\array_key_exists('LIBKETAMA_COMPATIBLE', $options) && !\\array_key_exists(\\Memcached::OPT_LIBKETAMA_COMPATIBLE, $options)) {\n                $client->setOption(\\Memcached::OPT_LIBKETAMA_COMPATIBLE, true);\n            }\n            foreach ($options as $name => $value) {\n                if (\\is_int($name)) {\n                    continue;\n                }\n                if ('HASH' === $name || 'SERIALIZER' === $name || 'DISTRIBUTION' === $name) {\n                    $value = \\constant('Memcached::'.$name.'_'.strtoupper($value));\n                }\n                unset($options[$name]);\n\n                if (\\defined('Memcached::OPT_'.$name)) {\n                    $options[\\constant('Memcached::OPT_'.$name)] = $value;\n                }\n            }\n            $client->setOptions($options + [\\Memcached::OPT_SERIALIZER => \\Memcached::SERIALIZER_PHP]);\n\n            // set client's servers, taking care of persistent connections\n            if (!$client->isPristine()) {\n                $oldServers = [];\n                foreach ($client->getServerList() as $server) {\n                    $oldServers[] = [$server['host'], $server['port']];\n                }\n\n                $newServers = [];\n                foreach ($servers as $server) {\n                    if (1 < \\count($server)) {\n                        $server = array_values($server);\n                        unset($server[2]);\n                        $server[1] = (int) $server[1];\n                    }\n                    $newServers[] = $server;\n                }\n\n                if ($oldServers !== $newServers) {\n                    $client->resetServerList();\n                    $client->addServers($servers);\n                }\n            } else {\n                $client->addServers($servers);\n            }\n\n            if (null !== $username || null !== $password) {\n                if (!method_exists($client, 'setSaslAuthData')) {\n                    trigger_error('Missing SASL support: the memcached extension must be compiled with --enable-memcached-sasl.');\n                }\n                $client->setSaslAuthData($username, $password);\n            }\n\n            return $client;\n        } finally {\n            restore_error_handler();\n        }\n    }\n\n    protected function doSave(array $values, int $lifetime): array|bool\n    {\n        if (!$values = $this->marshaller->marshall($values, $failed)) {\n            return $failed;\n        }\n\n        if ($lifetime && $lifetime > 30 * 86400) {\n            $lifetime += time();\n        }\n\n        $encodedValues = [];\n        foreach ($values as $key => $value) {\n            $encodedValues[self::encodeKey($key)] = $value;\n        }\n\n        return $this->checkResultCode($this->getClient()->setMulti($encodedValues, $lifetime)) ? $failed : false;\n    }\n\n    protected function doFetch(array $ids): iterable\n    {\n        try {\n            $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids);\n\n            $encodedResult = $this->checkResultCode($this->getClient()->getMulti($encodedIds));\n\n            $result = [];\n            foreach ($encodedResult as $key => $value) {\n                $result[self::decodeKey($key)] = $this->marshaller->unmarshall($value);\n            }\n\n            return $result;\n        } catch (\\Error $e) {\n            throw new \\ErrorException($e->getMessage(), $e->getCode(), \\E_ERROR, $e->getFile(), $e->getLine());\n        }\n    }\n\n    protected function doHave(string $id): bool\n    {\n        return false !== $this->getClient()->get(self::encodeKey($id)) || $this->checkResultCode(\\Memcached::RES_SUCCESS === $this->client->getResultCode());\n    }\n\n    protected function doDelete(array $ids): bool\n    {\n        $ok = true;\n        $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids);\n        foreach ($this->checkResultCode($this->getClient()->deleteMulti($encodedIds)) as $result) {\n            if (\\Memcached::RES_SUCCESS !== $result && \\Memcached::RES_NOTFOUND !== $result) {\n                $ok = false;\n            }\n        }\n\n        return $ok;\n    }\n\n    protected function doClear(string $namespace): bool\n    {\n        return '' === $namespace && $this->getClient()->flush();\n    }\n\n    private function checkResultCode(mixed $result): mixed\n    {\n        $code = $this->client->getResultCode();\n\n        if (\\Memcached::RES_SUCCESS === $code || \\Memcached::RES_NOTFOUND === $code) {\n            return $result;\n        }\n\n        throw new CacheException('MemcachedAdapter client error: '.strtolower($this->client->getResultMessage()));\n    }\n\n    private function getClient(): \\Memcached\n    {\n        if (isset($this->client)) {\n            return $this->client;\n        }\n\n        $opt = $this->lazyClient->getOption(\\Memcached::OPT_SERIALIZER);\n        if (\\Memcached::SERIALIZER_PHP !== $opt && \\Memcached::SERIALIZER_IGBINARY !== $opt) {\n            throw new CacheException('MemcachedAdapter: \"serializer\" option must be \"php\" or \"igbinary\".');\n        }\n        if ('' !== $prefix = (string) $this->lazyClient->getOption(\\Memcached::OPT_PREFIX_KEY)) {\n            throw new CacheException(sprintf('MemcachedAdapter: \"prefix_key\" option must be empty when using proxified connections, \"%s\" given.', $prefix));\n        }\n\n        return $this->client = $this->lazyClient;\n    }\n\n    private static function encodeKey(string $key): string\n    {\n        return strtr($key, self::RESERVED_MEMCACHED, self::RESERVED_PSR6);\n    }\n\n    private static function decodeKey(string $key): string\n    {\n        return strtr($key, self::RESERVED_PSR6, self::RESERVED_MEMCACHED);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/NullAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\Cache\\CacheItemInterface;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Contracts\\Cache\\CacheInterface;\n\n/**\n * @author Titouan Galopin <galopintitouan@gmail.com>\n */\nclass NullAdapter implements AdapterInterface, CacheInterface\n{\n    private static \\Closure $createCacheItem;\n\n    public function __construct()\n    {\n        self::$createCacheItem ??= \\Closure::bind(\n            static function ($key) {\n                $item = new CacheItem();\n                $item->key = $key;\n                $item->isHit = false;\n\n                return $item;\n            },\n            null,\n            CacheItem::class\n        );\n    }\n\n    public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed\n    {\n        $save = true;\n\n        return $callback((self::$createCacheItem)($key), $save);\n    }\n\n    public function getItem(mixed $key): CacheItem\n    {\n        return (self::$createCacheItem)($key);\n    }\n\n    public function getItems(array $keys = []): iterable\n    {\n        return $this->generateItems($keys);\n    }\n\n    public function hasItem(mixed $key): bool\n    {\n        return false;\n    }\n\n    public function clear(string $prefix = ''): bool\n    {\n        return true;\n    }\n\n    public function deleteItem(mixed $key): bool\n    {\n        return true;\n    }\n\n    public function deleteItems(array $keys): bool\n    {\n        return true;\n    }\n\n    public function save(CacheItemInterface $item): bool\n    {\n        return true;\n    }\n\n    public function saveDeferred(CacheItemInterface $item): bool\n    {\n        return true;\n    }\n\n    public function commit(): bool\n    {\n        return true;\n    }\n\n    public function delete(string $key): bool\n    {\n        return $this->deleteItem($key);\n    }\n\n    private function generateItems(array $keys): \\Generator\n    {\n        $f = self::$createCacheItem;\n\n        foreach ($keys as $key) {\n            yield $key => $f($key);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/ParameterNormalizer.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\n/**\n * @author Lars Strojny <lars@strojny.net>\n */\nfinal class ParameterNormalizer\n{\n    public static function normalizeDuration(string $duration): int\n    {\n        if (is_numeric($duration)) {\n            return $duration;\n        }\n\n        if (false !== $time = strtotime($duration, 0)) {\n            return $time;\n        }\n\n        try {\n            return \\DateTimeImmutable::createFromFormat('U', 0)->add(new \\DateInterval($duration))->getTimestamp();\n        } catch (\\Exception $e) {\n            throw new \\InvalidArgumentException(sprintf('Cannot parse date interval \"%s\".', $duration), 0, $e);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/PdoAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller;\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\nuse Symfony\\Component\\Cache\\PruneableInterface;\n\nclass PdoAdapter extends AbstractAdapter implements PruneableInterface\n{\n    private const MAX_KEY_LENGTH = 255;\n\n    private MarshallerInterface $marshaller;\n    private \\PDO $conn;\n    private string $dsn;\n    private string $driver;\n    private string $serverVersion;\n    private string $table = 'cache_items';\n    private string $idCol = 'item_id';\n    private string $dataCol = 'item_data';\n    private string $lifetimeCol = 'item_lifetime';\n    private string $timeCol = 'item_time';\n    private ?string $username = null;\n    private ?string $password = null;\n    private array $connectionOptions = [];\n    private string $namespace;\n\n    /**\n     * You can either pass an existing database connection as PDO instance or\n     * a DSN string that will be used to lazy-connect to the database when the\n     * cache is actually used.\n     *\n     * List of available options:\n     *  * db_table: The name of the table [default: cache_items]\n     *  * db_id_col: The column where to store the cache id [default: item_id]\n     *  * db_data_col: The column where to store the cache data [default: item_data]\n     *  * db_lifetime_col: The column where to store the lifetime [default: item_lifetime]\n     *  * db_time_col: The column where to store the timestamp [default: item_time]\n     *  * db_username: The username when lazy-connect [default: '']\n     *  * db_password: The password when lazy-connect [default: '']\n     *  * db_connection_options: An array of driver-specific connection options [default: []]\n     *\n     * @throws InvalidArgumentException When first argument is not PDO nor Connection nor string\n     * @throws InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION\n     * @throws InvalidArgumentException When namespace contains invalid characters\n     */\n    public function __construct(#[\\SensitiveParameter] \\PDO|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], ?MarshallerInterface $marshaller = null)\n    {\n        if (\\is_string($connOrDsn) && str_contains($connOrDsn, '://')) {\n            throw new InvalidArgumentException(sprintf('Usage of Doctrine DBAL URL with \"%s\" is not supported. Use a PDO DSN or \"%s\" instead.', __CLASS__, DoctrineDbalAdapter::class));\n        }\n\n        if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) {\n            throw new InvalidArgumentException(sprintf('Namespace contains \"%s\" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0]));\n        }\n\n        if ($connOrDsn instanceof \\PDO) {\n            if (\\PDO::ERRMODE_EXCEPTION !== $connOrDsn->getAttribute(\\PDO::ATTR_ERRMODE)) {\n                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__));\n            }\n\n            $this->conn = $connOrDsn;\n        } else {\n            $this->dsn = $connOrDsn;\n        }\n\n        $this->maxIdLength = self::MAX_KEY_LENGTH;\n        $this->table = $options['db_table'] ?? $this->table;\n        $this->idCol = $options['db_id_col'] ?? $this->idCol;\n        $this->dataCol = $options['db_data_col'] ?? $this->dataCol;\n        $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol;\n        $this->timeCol = $options['db_time_col'] ?? $this->timeCol;\n        $this->username = $options['db_username'] ?? $this->username;\n        $this->password = $options['db_password'] ?? $this->password;\n        $this->connectionOptions = $options['db_connection_options'] ?? $this->connectionOptions;\n        $this->namespace = $namespace;\n        $this->marshaller = $marshaller ?? new DefaultMarshaller();\n\n        parent::__construct($namespace, $defaultLifetime);\n    }\n\n    /**\n     * Creates the table to store cache items which can be called once for setup.\n     *\n     * Cache ID are saved in a column of maximum length 255. Cache data is\n     * saved in a BLOB.\n     *\n     * @return void\n     *\n     * @throws \\PDOException    When the table already exists\n     * @throws \\DomainException When an unsupported PDO driver is used\n     */\n    public function createTable()\n    {\n        $sql = match ($driver = $this->getDriver()) {\n            // We use varbinary for the ID column because it prevents unwanted conversions:\n            // - character set conversions between server and client\n            // - trailing space removal\n            // - case-insensitivity\n            // - language processing like é == e\n            '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\",\n            '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)\",\n            '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)\",\n            '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)\",\n            '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)\",\n            default => throw new \\DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver \"%s\".', $driver)),\n        };\n\n        $this->getConnection()->exec($sql);\n    }\n\n    public function prune(): bool\n    {\n        $deleteSql = \"DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= :time\";\n\n        if ('' !== $this->namespace) {\n            $deleteSql .= \" AND $this->idCol LIKE :namespace\";\n        }\n\n        $connection = $this->getConnection();\n\n        try {\n            $delete = $connection->prepare($deleteSql);\n        } catch (\\PDOException) {\n            return true;\n        }\n        $delete->bindValue(':time', time(), \\PDO::PARAM_INT);\n\n        if ('' !== $this->namespace) {\n            $delete->bindValue(':namespace', sprintf('%s%%', $this->namespace), \\PDO::PARAM_STR);\n        }\n        try {\n            return $delete->execute();\n        } catch (\\PDOException) {\n            return true;\n        }\n    }\n\n    protected function doFetch(array $ids): iterable\n    {\n        $connection = $this->getConnection();\n\n        $now = time();\n        $expired = [];\n\n        $sql = str_pad('', (\\count($ids) << 1) - 1, '?,');\n        $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)\";\n        $stmt = $connection->prepare($sql);\n        $stmt->bindValue($i = 1, $now, \\PDO::PARAM_INT);\n        foreach ($ids as $id) {\n            $stmt->bindValue(++$i, $id);\n        }\n        $result = $stmt->execute();\n\n        if (\\is_object($result)) {\n            $result = $result->iterateNumeric();\n        } else {\n            $stmt->setFetchMode(\\PDO::FETCH_NUM);\n            $result = $stmt;\n        }\n\n        foreach ($result as $row) {\n            if (null === $row[1]) {\n                $expired[] = $row[0];\n            } else {\n                yield $row[0] => $this->marshaller->unmarshall(\\is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]);\n            }\n        }\n\n        if ($expired) {\n            $sql = str_pad('', (\\count($expired) << 1) - 1, '?,');\n            $sql = \"DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN ($sql)\";\n            $stmt = $connection->prepare($sql);\n            $stmt->bindValue($i = 1, $now, \\PDO::PARAM_INT);\n            foreach ($expired as $id) {\n                $stmt->bindValue(++$i, $id);\n            }\n            $stmt->execute();\n        }\n    }\n\n    protected function doHave(string $id): bool\n    {\n        $connection = $this->getConnection();\n\n        $sql = \"SELECT 1 FROM $this->table WHERE $this->idCol = :id AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > :time)\";\n        $stmt = $connection->prepare($sql);\n\n        $stmt->bindValue(':id', $id);\n        $stmt->bindValue(':time', time(), \\PDO::PARAM_INT);\n        $stmt->execute();\n\n        return (bool) $stmt->fetchColumn();\n    }\n\n    protected function doClear(string $namespace): bool\n    {\n        $conn = $this->getConnection();\n\n        if ('' === $namespace) {\n            if ('sqlite' === $this->getDriver()) {\n                $sql = \"DELETE FROM $this->table\";\n            } else {\n                $sql = \"TRUNCATE TABLE $this->table\";\n            }\n        } else {\n            $sql = \"DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'\";\n        }\n\n        try {\n            $conn->exec($sql);\n        } catch (\\PDOException) {\n        }\n\n        return true;\n    }\n\n    protected function doDelete(array $ids): bool\n    {\n        $sql = str_pad('', (\\count($ids) << 1) - 1, '?,');\n        $sql = \"DELETE FROM $this->table WHERE $this->idCol IN ($sql)\";\n        try {\n            $stmt = $this->getConnection()->prepare($sql);\n            $stmt->execute(array_values($ids));\n        } catch (\\PDOException) {\n        }\n\n        return true;\n    }\n\n    protected function doSave(array $values, int $lifetime): array|bool\n    {\n        if (!$values = $this->marshaller->marshall($values, $failed)) {\n            return $failed;\n        }\n\n        $conn = $this->getConnection();\n\n        $driver = $this->getDriver();\n        $insertSql = \"INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)\";\n\n        switch (true) {\n            case 'mysql' === $driver:\n                $sql = $insertSql.\" ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)\";\n                break;\n            case 'oci' === $driver:\n                // DUAL is Oracle specific dummy table\n                $sql = \"MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) \".\n                    \"WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) \".\n                    \"WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?\";\n                break;\n            case 'sqlsrv' === $driver && version_compare($this->getServerVersion(), '10', '>='):\n                // MERGE is only available since SQL Server 2008 and must be terminated by semicolon\n                // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx\n                $sql = \"MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) \".\n                    \"WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) \".\n                    \"WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;\";\n                break;\n            case 'sqlite' === $driver:\n                $sql = 'INSERT OR REPLACE'.substr($insertSql, 6);\n                break;\n            case 'pgsql' === $driver && version_compare($this->getServerVersion(), '9.5', '>='):\n                $sql = $insertSql.\" ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)\";\n                break;\n            default:\n                $driver = null;\n                $sql = \"UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id\";\n                break;\n        }\n\n        $now = time();\n        $lifetime = $lifetime ?: null;\n        try {\n            $stmt = $conn->prepare($sql);\n        } catch (\\PDOException $e) {\n            if ($this->isTableMissing($e) && (!$conn->inTransaction() || \\in_array($driver, ['pgsql', 'sqlite', 'sqlsrv'], true))) {\n                $this->createTable();\n            }\n            $stmt = $conn->prepare($sql);\n        }\n\n        // $id and $data are defined later in the loop. Binding is done by reference, values are read on execution.\n        if ('sqlsrv' === $driver || 'oci' === $driver) {\n            $stmt->bindParam(1, $id);\n            $stmt->bindParam(2, $id);\n            $stmt->bindParam(3, $data, \\PDO::PARAM_LOB);\n            $stmt->bindValue(4, $lifetime, \\PDO::PARAM_INT);\n            $stmt->bindValue(5, $now, \\PDO::PARAM_INT);\n            $stmt->bindParam(6, $data, \\PDO::PARAM_LOB);\n            $stmt->bindValue(7, $lifetime, \\PDO::PARAM_INT);\n            $stmt->bindValue(8, $now, \\PDO::PARAM_INT);\n        } else {\n            $stmt->bindParam(':id', $id);\n            $stmt->bindParam(':data', $data, \\PDO::PARAM_LOB);\n            $stmt->bindValue(':lifetime', $lifetime, \\PDO::PARAM_INT);\n            $stmt->bindValue(':time', $now, \\PDO::PARAM_INT);\n        }\n        if (null === $driver) {\n            $insertStmt = $conn->prepare($insertSql);\n\n            $insertStmt->bindParam(':id', $id);\n            $insertStmt->bindParam(':data', $data, \\PDO::PARAM_LOB);\n            $insertStmt->bindValue(':lifetime', $lifetime, \\PDO::PARAM_INT);\n            $insertStmt->bindValue(':time', $now, \\PDO::PARAM_INT);\n        }\n\n        foreach ($values as $id => $data) {\n            try {\n                $stmt->execute();\n            } catch (\\PDOException $e) {\n                if ($this->isTableMissing($e) && (!$conn->inTransaction() || \\in_array($driver, ['pgsql', 'sqlite', 'sqlsrv'], true))) {\n                    $this->createTable();\n                }\n                $stmt->execute();\n            }\n            if (null === $driver && !$stmt->rowCount()) {\n                try {\n                    $insertStmt->execute();\n                } catch (\\PDOException) {\n                    // A concurrent write won, let it be\n                }\n            }\n        }\n\n        return $failed;\n    }\n\n    /**\n     * @internal\n     */\n    protected function getId(mixed $key): string\n    {\n        if ('pgsql' !== $this->getDriver()) {\n            return parent::getId($key);\n        }\n\n        if (str_contains($key, \"\\0\") || str_contains($key, '%') || !preg_match('//u', $key)) {\n            $key = rawurlencode($key);\n        }\n\n        return parent::getId($key);\n    }\n\n    private function getConnection(): \\PDO\n    {\n        if (!isset($this->conn)) {\n            $this->conn = new \\PDO($this->dsn, $this->username, $this->password, $this->connectionOptions);\n            $this->conn->setAttribute(\\PDO::ATTR_ERRMODE, \\PDO::ERRMODE_EXCEPTION);\n        }\n\n        return $this->conn;\n    }\n\n    private function getDriver(): string\n    {\n        return $this->driver ??= $this->getConnection()->getAttribute(\\PDO::ATTR_DRIVER_NAME);\n    }\n\n    private function getServerVersion(): string\n    {\n        return $this->serverVersion ??= $this->getConnection()->getAttribute(\\PDO::ATTR_SERVER_VERSION);\n    }\n\n    private function isTableMissing(\\PDOException $exception): bool\n    {\n        $driver = $this->getDriver();\n        [$sqlState, $code] = $exception->errorInfo ?? [null, $exception->getCode()];\n\n        return match ($driver) {\n            'pgsql' => '42P01' === $sqlState,\n            'sqlite' => str_contains($exception->getMessage(), 'no such table:'),\n            'oci' => 942 === $code,\n            'sqlsrv' => 208 === $code,\n            'mysql' => 1146 === $code,\n            default => false,\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/PhpArrayAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\Cache\\CacheItemInterface;\nuse Psr\\Cache\\CacheItemPoolInterface;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\PruneableInterface;\nuse Symfony\\Component\\Cache\\ResettableInterface;\nuse Symfony\\Component\\Cache\\Traits\\ContractsTrait;\nuse Symfony\\Component\\Cache\\Traits\\ProxyTrait;\nuse Symfony\\Component\\VarExporter\\VarExporter;\nuse Symfony\\Contracts\\Cache\\CacheInterface;\n\n/**\n * Caches items at warm up time using a PHP array that is stored in shared memory by OPCache since PHP 7.0.\n * Warmed up items are read-only and run-time discovered items are cached using a fallback adapter.\n *\n * @author Titouan Galopin <galopintitouan@gmail.com>\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface\n{\n    use ContractsTrait;\n    use ProxyTrait;\n\n    private string $file;\n    private array $keys;\n    private array $values;\n\n    private static \\Closure $createCacheItem;\n    private static array $valuesCache = [];\n\n    /**\n     * @param string           $file         The PHP file were values are cached\n     * @param AdapterInterface $fallbackPool A pool to fallback on when an item is not hit\n     */\n    public function __construct(string $file, AdapterInterface $fallbackPool)\n    {\n        $this->file = $file;\n        $this->pool = $fallbackPool;\n        self::$createCacheItem ??= \\Closure::bind(\n            static function ($key, $value, $isHit) {\n                $item = new CacheItem();\n                $item->key = $key;\n                $item->value = $value;\n                $item->isHit = $isHit;\n\n                return $item;\n            },\n            null,\n            CacheItem::class\n        );\n    }\n\n    /**\n     * This adapter takes advantage of how PHP stores arrays in its latest versions.\n     *\n     * @param string                 $file         The PHP file were values are cached\n     * @param CacheItemPoolInterface $fallbackPool A pool to fallback on when an item is not hit\n     */\n    public static function create(string $file, CacheItemPoolInterface $fallbackPool): CacheItemPoolInterface\n    {\n        if (!$fallbackPool instanceof AdapterInterface) {\n            $fallbackPool = new ProxyAdapter($fallbackPool);\n        }\n\n        return new static($file, $fallbackPool);\n    }\n\n    public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed\n    {\n        if (!isset($this->values)) {\n            $this->initialize();\n        }\n        if (!isset($this->keys[$key])) {\n            get_from_pool:\n            if ($this->pool instanceof CacheInterface) {\n                return $this->pool->get($key, $callback, $beta, $metadata);\n            }\n\n            return $this->doGet($this->pool, $key, $callback, $beta, $metadata);\n        }\n        $value = $this->values[$this->keys[$key]];\n\n        if ('N;' === $value) {\n            return null;\n        }\n        try {\n            if ($value instanceof \\Closure) {\n                return $value();\n            }\n        } catch (\\Throwable) {\n            unset($this->keys[$key]);\n            goto get_from_pool;\n        }\n\n        return $value;\n    }\n\n    public function getItem(mixed $key): CacheItem\n    {\n        if (!\\is_string($key)) {\n            throw new InvalidArgumentException(sprintf('Cache key must be string, \"%s\" given.', get_debug_type($key)));\n        }\n        if (!isset($this->values)) {\n            $this->initialize();\n        }\n        if (!isset($this->keys[$key])) {\n            return $this->pool->getItem($key);\n        }\n\n        $value = $this->values[$this->keys[$key]];\n        $isHit = true;\n\n        if ('N;' === $value) {\n            $value = null;\n        } elseif ($value instanceof \\Closure) {\n            try {\n                $value = $value();\n            } catch (\\Throwable) {\n                $value = null;\n                $isHit = false;\n            }\n        }\n\n        return (self::$createCacheItem)($key, $value, $isHit);\n    }\n\n    public function getItems(array $keys = []): iterable\n    {\n        foreach ($keys as $key) {\n            if (!\\is_string($key)) {\n                throw new InvalidArgumentException(sprintf('Cache key must be string, \"%s\" given.', get_debug_type($key)));\n            }\n        }\n        if (!isset($this->values)) {\n            $this->initialize();\n        }\n\n        return $this->generateItems($keys);\n    }\n\n    public function hasItem(mixed $key): bool\n    {\n        if (!\\is_string($key)) {\n            throw new InvalidArgumentException(sprintf('Cache key must be string, \"%s\" given.', get_debug_type($key)));\n        }\n        if (!isset($this->values)) {\n            $this->initialize();\n        }\n\n        return isset($this->keys[$key]) || $this->pool->hasItem($key);\n    }\n\n    public function deleteItem(mixed $key): bool\n    {\n        if (!\\is_string($key)) {\n            throw new InvalidArgumentException(sprintf('Cache key must be string, \"%s\" given.', get_debug_type($key)));\n        }\n        if (!isset($this->values)) {\n            $this->initialize();\n        }\n\n        return !isset($this->keys[$key]) && $this->pool->deleteItem($key);\n    }\n\n    public function deleteItems(array $keys): bool\n    {\n        $deleted = true;\n        $fallbackKeys = [];\n\n        foreach ($keys as $key) {\n            if (!\\is_string($key)) {\n                throw new InvalidArgumentException(sprintf('Cache key must be string, \"%s\" given.', get_debug_type($key)));\n            }\n\n            if (isset($this->keys[$key])) {\n                $deleted = false;\n            } else {\n                $fallbackKeys[] = $key;\n            }\n        }\n        if (!isset($this->values)) {\n            $this->initialize();\n        }\n\n        if ($fallbackKeys) {\n            $deleted = $this->pool->deleteItems($fallbackKeys) && $deleted;\n        }\n\n        return $deleted;\n    }\n\n    public function save(CacheItemInterface $item): bool\n    {\n        if (!isset($this->values)) {\n            $this->initialize();\n        }\n\n        return !isset($this->keys[$item->getKey()]) && $this->pool->save($item);\n    }\n\n    public function saveDeferred(CacheItemInterface $item): bool\n    {\n        if (!isset($this->values)) {\n            $this->initialize();\n        }\n\n        return !isset($this->keys[$item->getKey()]) && $this->pool->saveDeferred($item);\n    }\n\n    public function commit(): bool\n    {\n        return $this->pool->commit();\n    }\n\n    public function clear(string $prefix = ''): bool\n    {\n        $this->keys = $this->values = [];\n\n        $cleared = @unlink($this->file) || !file_exists($this->file);\n        unset(self::$valuesCache[$this->file]);\n\n        if ($this->pool instanceof AdapterInterface) {\n            return $this->pool->clear($prefix) && $cleared;\n        }\n\n        return $this->pool->clear() && $cleared;\n    }\n\n    /**\n     * Store an array of cached values.\n     *\n     * @param array $values The cached values\n     *\n     * @return string[] A list of classes to preload on PHP 7.4+\n     */\n    public function warmUp(array $values): array\n    {\n        if (file_exists($this->file)) {\n            if (!is_file($this->file)) {\n                throw new InvalidArgumentException(sprintf('Cache path exists and is not a file: \"%s\".', $this->file));\n            }\n\n            if (!is_writable($this->file)) {\n                throw new InvalidArgumentException(sprintf('Cache file is not writable: \"%s\".', $this->file));\n            }\n        } else {\n            $directory = \\dirname($this->file);\n\n            if (!is_dir($directory) && !@mkdir($directory, 0777, true)) {\n                throw new InvalidArgumentException(sprintf('Cache directory does not exist and cannot be created: \"%s\".', $directory));\n            }\n\n            if (!is_writable($directory)) {\n                throw new InvalidArgumentException(sprintf('Cache directory is not writable: \"%s\".', $directory));\n            }\n        }\n\n        $preload = [];\n        $dumpedValues = '';\n        $dumpedMap = [];\n        $dump = <<<'EOF'\n<?php\n\n// This file has been auto-generated by the Symfony Cache Component.\n\nreturn [[\n\n\nEOF;\n\n        foreach ($values as $key => $value) {\n            CacheItem::validateKey(\\is_int($key) ? (string) $key : $key);\n            $isStaticValue = true;\n\n            if (null === $value) {\n                $value = \"'N;'\";\n            } elseif (\\is_object($value) || \\is_array($value)) {\n                try {\n                    $value = VarExporter::export($value, $isStaticValue, $preload);\n                } catch (\\Exception $e) {\n                    throw new InvalidArgumentException(sprintf('Cache key \"%s\" has non-serializable \"%s\" value.', $key, get_debug_type($value)), 0, $e);\n                }\n            } elseif (\\is_string($value)) {\n                // Wrap \"N;\" in a closure to not confuse it with an encoded `null`\n                if ('N;' === $value) {\n                    $isStaticValue = false;\n                }\n                $value = var_export($value, true);\n            } elseif (!\\is_scalar($value)) {\n                throw new InvalidArgumentException(sprintf('Cache key \"%s\" has non-serializable \"%s\" value.', $key, get_debug_type($value)));\n            } else {\n                $value = var_export($value, true);\n            }\n\n            if (!$isStaticValue) {\n                $value = str_replace(\"\\n\", \"\\n    \", $value);\n                $value = \"static function () {\\n    return {$value};\\n}\";\n            }\n            $hash = hash('xxh128', $value);\n\n            if (null === $id = $dumpedMap[$hash] ?? null) {\n                $id = $dumpedMap[$hash] = \\count($dumpedMap);\n                $dumpedValues .= \"{$id} => {$value},\\n\";\n            }\n\n            $dump .= var_export($key, true).\" => {$id},\\n\";\n        }\n\n        $dump .= \"\\n], [\\n\\n{$dumpedValues}\\n]];\\n\";\n\n        $tmpFile = uniqid($this->file, true);\n\n        file_put_contents($tmpFile, $dump);\n        @chmod($tmpFile, 0666 & ~umask());\n        unset($serialized, $value, $dump);\n\n        @rename($tmpFile, $this->file);\n        unset(self::$valuesCache[$this->file]);\n\n        $this->initialize();\n\n        return $preload;\n    }\n\n    /**\n     * Load the cache file.\n     */\n    private function initialize(): void\n    {\n        if (isset(self::$valuesCache[$this->file])) {\n            $values = self::$valuesCache[$this->file];\n        } elseif (!is_file($this->file)) {\n            $this->keys = $this->values = [];\n\n            return;\n        } else {\n            $values = self::$valuesCache[$this->file] = (include $this->file) ?: [[], []];\n        }\n\n        if (2 !== \\count($values) || !isset($values[0], $values[1])) {\n            $this->keys = $this->values = [];\n        } else {\n            [$this->keys, $this->values] = $values;\n        }\n    }\n\n    private function generateItems(array $keys): \\Generator\n    {\n        $f = self::$createCacheItem;\n        $fallbackKeys = [];\n\n        foreach ($keys as $key) {\n            if (isset($this->keys[$key])) {\n                $value = $this->values[$this->keys[$key]];\n\n                if ('N;' === $value) {\n                    yield $key => $f($key, null, true);\n                } elseif ($value instanceof \\Closure) {\n                    try {\n                        yield $key => $f($key, $value(), true);\n                    } catch (\\Throwable) {\n                        yield $key => $f($key, null, false);\n                    }\n                } else {\n                    yield $key => $f($key, $value, true);\n                }\n            } else {\n                $fallbackKeys[] = $key;\n            }\n        }\n\n        if ($fallbackKeys) {\n            yield from $this->pool->getItems($fallbackKeys);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/PhpFilesAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Symfony\\Component\\Cache\\Exception\\CacheException;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\PruneableInterface;\nuse Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait;\nuse Symfony\\Component\\VarExporter\\VarExporter;\n\n/**\n * @author Piotr Stankowski <git@trakos.pl>\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Rob Frawley 2nd <rmf@src.run>\n */\nclass PhpFilesAdapter extends AbstractAdapter implements PruneableInterface\n{\n    use FilesystemCommonTrait {\n        doClear as private doCommonClear;\n        doDelete as private doCommonDelete;\n    }\n\n    private \\Closure $includeHandler;\n    private bool $appendOnly;\n    private array $values = [];\n    private array $files = [];\n\n    private static int $startTime;\n    private static array $valuesCache = [];\n\n    /**\n     * @param $appendOnly Set to `true` to gain extra performance when the items stored in this pool never expire.\n     *                    Doing so is encouraged because it fits perfectly OPcache's memory model.\n     *\n     * @throws CacheException if OPcache is not enabled\n     */\n    public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $directory = null, bool $appendOnly = false)\n    {\n        $this->appendOnly = $appendOnly;\n        self::$startTime ??= $_SERVER['REQUEST_TIME'] ?? time();\n        parent::__construct('', $defaultLifetime);\n        $this->init($namespace, $directory);\n        $this->includeHandler = static function ($type, $msg, $file, $line) {\n            throw new \\ErrorException($msg, 0, $type, $file, $line);\n        };\n    }\n\n    /**\n     * @return bool\n     */\n    public static function isSupported()\n    {\n        self::$startTime ??= $_SERVER['REQUEST_TIME'] ?? time();\n\n        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));\n    }\n\n    public function prune(): bool\n    {\n        $time = time();\n        $pruned = true;\n        $getExpiry = true;\n\n        set_error_handler($this->includeHandler);\n        try {\n            foreach ($this->scanHashDir($this->directory) as $file) {\n                try {\n                    if (\\is_array($expiresAt = include $file)) {\n                        $expiresAt = $expiresAt[0];\n                    }\n                } catch (\\ErrorException $e) {\n                    $expiresAt = $time;\n                }\n\n                if ($time >= $expiresAt) {\n                    $pruned = ($this->doUnlink($file) || !file_exists($file)) && $pruned;\n                }\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        return $pruned;\n    }\n\n    protected function doFetch(array $ids): iterable\n    {\n        if ($this->appendOnly) {\n            $now = 0;\n            $missingIds = [];\n        } else {\n            $now = time();\n            $missingIds = $ids;\n            $ids = [];\n        }\n        $values = [];\n\n        begin:\n        $getExpiry = false;\n\n        foreach ($ids as $id) {\n            if (null === $value = $this->values[$id] ?? null) {\n                $missingIds[] = $id;\n            } elseif ('N;' === $value) {\n                $values[$id] = null;\n            } elseif (!\\is_object($value)) {\n                $values[$id] = $value;\n            } elseif (!$value instanceof LazyValue) {\n                $values[$id] = $value();\n            } elseif (false === $values[$id] = include $value->file) {\n                unset($values[$id], $this->values[$id]);\n                $missingIds[] = $id;\n            }\n            if (!$this->appendOnly) {\n                unset($this->values[$id]);\n            }\n        }\n\n        if (!$missingIds) {\n            return $values;\n        }\n\n        set_error_handler($this->includeHandler);\n        try {\n            $getExpiry = true;\n\n            foreach ($missingIds as $k => $id) {\n                try {\n                    $file = $this->files[$id] ??= $this->getFile($id);\n\n                    if (isset(self::$valuesCache[$file])) {\n                        [$expiresAt, $this->values[$id]] = self::$valuesCache[$file];\n                    } elseif (\\is_array($expiresAt = include $file)) {\n                        if ($this->appendOnly) {\n                            self::$valuesCache[$file] = $expiresAt;\n                        }\n\n                        [$expiresAt, $this->values[$id]] = $expiresAt;\n                    } elseif ($now < $expiresAt) {\n                        $this->values[$id] = new LazyValue($file);\n                    }\n\n                    if ($now >= $expiresAt) {\n                        unset($this->values[$id], $missingIds[$k], self::$valuesCache[$file]);\n                    }\n                } catch (\\ErrorException $e) {\n                    unset($missingIds[$k]);\n                }\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        $ids = $missingIds;\n        $missingIds = [];\n        goto begin;\n    }\n\n    protected function doHave(string $id): bool\n    {\n        if ($this->appendOnly && isset($this->values[$id])) {\n            return true;\n        }\n\n        set_error_handler($this->includeHandler);\n        try {\n            $file = $this->files[$id] ??= $this->getFile($id);\n            $getExpiry = true;\n\n            if (isset(self::$valuesCache[$file])) {\n                [$expiresAt, $value] = self::$valuesCache[$file];\n            } elseif (\\is_array($expiresAt = include $file)) {\n                if ($this->appendOnly) {\n                    self::$valuesCache[$file] = $expiresAt;\n                }\n\n                [$expiresAt, $value] = $expiresAt;\n            } elseif ($this->appendOnly) {\n                $value = new LazyValue($file);\n            }\n        } catch (\\ErrorException) {\n            return false;\n        } finally {\n            restore_error_handler();\n        }\n        if ($this->appendOnly) {\n            $now = 0;\n            $this->values[$id] = $value;\n        } else {\n            $now = time();\n        }\n\n        return $now < $expiresAt;\n    }\n\n    protected function doSave(array $values, int $lifetime): array|bool\n    {\n        $ok = true;\n        $expiry = $lifetime ? time() + $lifetime : 'PHP_INT_MAX';\n        $allowCompile = self::isSupported();\n\n        foreach ($values as $key => $value) {\n            unset($this->values[$key]);\n            $isStaticValue = true;\n            if (null === $value) {\n                $value = \"'N;'\";\n            } elseif (\\is_object($value) || \\is_array($value)) {\n                try {\n                    $value = VarExporter::export($value, $isStaticValue);\n                } catch (\\Exception $e) {\n                    throw new InvalidArgumentException(sprintf('Cache key \"%s\" has non-serializable \"%s\" value.', $key, get_debug_type($value)), 0, $e);\n                }\n            } elseif (\\is_string($value)) {\n                // Wrap \"N;\" in a closure to not confuse it with an encoded `null`\n                if ('N;' === $value) {\n                    $isStaticValue = false;\n                }\n                $value = var_export($value, true);\n            } elseif (!\\is_scalar($value)) {\n                throw new InvalidArgumentException(sprintf('Cache key \"%s\" has non-serializable \"%s\" value.', $key, get_debug_type($value)));\n            } else {\n                $value = var_export($value, true);\n            }\n\n            $encodedKey = rawurlencode($key);\n\n            if ($isStaticValue) {\n                $value = \"return [{$expiry}, {$value}];\";\n            } elseif ($this->appendOnly) {\n                $value = \"return [{$expiry}, static fn () => {$value}];\";\n            } else {\n                // We cannot use a closure here because of https://bugs.php.net/76982\n                $value = str_replace('\\Symfony\\Component\\VarExporter\\Internal\\\\', '', $value);\n                $value = \"namespace Symfony\\Component\\VarExporter\\Internal;\\n\\nreturn \\$getExpiry ? {$expiry} : {$value};\";\n            }\n\n            $file = $this->files[$key] = $this->getFile($key, true);\n            // Since OPcache only compiles files older than the script execution start, set the file's mtime in the past\n            $ok = $this->write($file, \"<?php //{$encodedKey}\\n\\n{$value}\\n\", self::$startTime - 10) && $ok;\n\n            if ($allowCompile) {\n                @opcache_invalidate($file, true);\n                @opcache_compile_file($file);\n            }\n            unset(self::$valuesCache[$file]);\n        }\n\n        if (!$ok && !is_writable($this->directory)) {\n            throw new CacheException(sprintf('Cache directory is not writable (%s).', $this->directory));\n        }\n\n        return $ok;\n    }\n\n    protected function doClear(string $namespace): bool\n    {\n        $this->values = [];\n\n        return $this->doCommonClear($namespace);\n    }\n\n    protected function doDelete(array $ids): bool\n    {\n        foreach ($ids as $id) {\n            unset($this->values[$id]);\n        }\n\n        return $this->doCommonDelete($ids);\n    }\n\n    /**\n     * @return bool\n     */\n    protected function doUnlink(string $file)\n    {\n        unset(self::$valuesCache[$file]);\n\n        if (self::isSupported()) {\n            @opcache_invalidate($file, true);\n        }\n\n        return @unlink($file);\n    }\n\n    private function getFileKey(string $file): string\n    {\n        if (!$h = @fopen($file, 'r')) {\n            return '';\n        }\n\n        $encodedKey = substr(fgets($h), 8);\n        fclose($h);\n\n        return rawurldecode(rtrim($encodedKey));\n    }\n}\n\n/**\n * @internal\n */\nclass LazyValue\n{\n    public string $file;\n\n    public function __construct(string $file)\n    {\n        $this->file = $file;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/ProxyAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\Cache\\CacheItemInterface;\nuse Psr\\Cache\\CacheItemPoolInterface;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\PruneableInterface;\nuse Symfony\\Component\\Cache\\ResettableInterface;\nuse Symfony\\Component\\Cache\\Traits\\ContractsTrait;\nuse Symfony\\Component\\Cache\\Traits\\ProxyTrait;\nuse Symfony\\Contracts\\Cache\\CacheInterface;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface\n{\n    use ContractsTrait;\n    use ProxyTrait;\n\n    private string $namespace = '';\n    private int $namespaceLen;\n    private string $poolHash;\n    private int $defaultLifetime;\n\n    private static \\Closure $createCacheItem;\n    private static \\Closure $setInnerItem;\n\n    public function __construct(CacheItemPoolInterface $pool, string $namespace = '', int $defaultLifetime = 0)\n    {\n        $this->pool = $pool;\n        $this->poolHash = spl_object_hash($pool);\n        if ('' !== $namespace) {\n            \\assert('' !== CacheItem::validateKey($namespace));\n            $this->namespace = $namespace;\n        }\n        $this->namespaceLen = \\strlen($namespace);\n        $this->defaultLifetime = $defaultLifetime;\n        self::$createCacheItem ??= \\Closure::bind(\n            static function ($key, $innerItem, $poolHash) {\n                $item = new CacheItem();\n                $item->key = $key;\n\n                if (null === $innerItem) {\n                    return $item;\n                }\n\n                $item->value = $innerItem->get();\n                $item->isHit = $innerItem->isHit();\n                $item->innerItem = $innerItem;\n                $item->poolHash = $poolHash;\n\n                if (!$item->unpack() && $innerItem instanceof CacheItem) {\n                    $item->metadata = $innerItem->metadata;\n                }\n                $innerItem->set(null);\n\n                return $item;\n            },\n            null,\n            CacheItem::class\n        );\n        self::$setInnerItem ??= \\Closure::bind(\n            static function (CacheItemInterface $innerItem, CacheItem $item, $expiry = null) {\n                $innerItem->set($item->pack());\n                $innerItem->expiresAt(($expiry ?? $item->expiry) ? \\DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', $expiry ?? $item->expiry)) : null);\n            },\n            null,\n            CacheItem::class\n        );\n    }\n\n    public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed\n    {\n        if (!$this->pool instanceof CacheInterface) {\n            return $this->doGet($this, $key, $callback, $beta, $metadata);\n        }\n\n        return $this->pool->get($this->getId($key), function ($innerItem, bool &$save) use ($key, $callback) {\n            $item = (self::$createCacheItem)($key, $innerItem, $this->poolHash);\n            $item->set($value = $callback($item, $save));\n            (self::$setInnerItem)($innerItem, $item);\n\n            return $value;\n        }, $beta, $metadata);\n    }\n\n    public function getItem(mixed $key): CacheItem\n    {\n        $item = $this->pool->getItem($this->getId($key));\n\n        return (self::$createCacheItem)($key, $item, $this->poolHash);\n    }\n\n    public function getItems(array $keys = []): iterable\n    {\n        if ($this->namespaceLen) {\n            foreach ($keys as $i => $key) {\n                $keys[$i] = $this->getId($key);\n            }\n        }\n\n        return $this->generateItems($this->pool->getItems($keys));\n    }\n\n    public function hasItem(mixed $key): bool\n    {\n        return $this->pool->hasItem($this->getId($key));\n    }\n\n    public function clear(string $prefix = ''): bool\n    {\n        if ($this->pool instanceof AdapterInterface) {\n            return $this->pool->clear($this->namespace.$prefix);\n        }\n\n        return $this->pool->clear();\n    }\n\n    public function deleteItem(mixed $key): bool\n    {\n        return $this->pool->deleteItem($this->getId($key));\n    }\n\n    public function deleteItems(array $keys): bool\n    {\n        if ($this->namespaceLen) {\n            foreach ($keys as $i => $key) {\n                $keys[$i] = $this->getId($key);\n            }\n        }\n\n        return $this->pool->deleteItems($keys);\n    }\n\n    public function save(CacheItemInterface $item): bool\n    {\n        return $this->doSave($item, __FUNCTION__);\n    }\n\n    public function saveDeferred(CacheItemInterface $item): bool\n    {\n        return $this->doSave($item, __FUNCTION__);\n    }\n\n    public function commit(): bool\n    {\n        return $this->pool->commit();\n    }\n\n    private function doSave(CacheItemInterface $item, string $method): bool\n    {\n        if (!$item instanceof CacheItem) {\n            return false;\n        }\n        $castItem = (array) $item;\n\n        if (null === $castItem[\"\\0*\\0expiry\"] && 0 < $this->defaultLifetime) {\n            $castItem[\"\\0*\\0expiry\"] = microtime(true) + $this->defaultLifetime;\n        }\n\n        if ($castItem[\"\\0*\\0poolHash\"] === $this->poolHash && $castItem[\"\\0*\\0innerItem\"]) {\n            $innerItem = $castItem[\"\\0*\\0innerItem\"];\n        } elseif ($this->pool instanceof AdapterInterface) {\n            // this is an optimization specific for AdapterInterface implementations\n            // so we can save a round-trip to the backend by just creating a new item\n            $innerItem = (self::$createCacheItem)($this->namespace.$castItem[\"\\0*\\0key\"], null, $this->poolHash);\n        } else {\n            $innerItem = $this->pool->getItem($this->namespace.$castItem[\"\\0*\\0key\"]);\n        }\n\n        (self::$setInnerItem)($innerItem, $item, $castItem[\"\\0*\\0expiry\"]);\n\n        return $this->pool->$method($innerItem);\n    }\n\n    private function generateItems(iterable $items): \\Generator\n    {\n        $f = self::$createCacheItem;\n\n        foreach ($items as $key => $item) {\n            if ($this->namespaceLen) {\n                $key = substr($key, $this->namespaceLen);\n            }\n\n            yield $key => $f($key, $item, $this->poolHash);\n        }\n    }\n\n    private function getId(mixed $key): string\n    {\n        \\assert('' !== CacheItem::validateKey($key));\n\n        return $this->namespace.$key;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/Psr16Adapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\SimpleCache\\CacheInterface;\nuse Symfony\\Component\\Cache\\PruneableInterface;\nuse Symfony\\Component\\Cache\\ResettableInterface;\nuse Symfony\\Component\\Cache\\Traits\\ProxyTrait;\n\n/**\n * Turns a PSR-16 cache into a PSR-6 one.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass Psr16Adapter extends AbstractAdapter implements PruneableInterface, ResettableInterface\n{\n    use ProxyTrait;\n\n    /**\n     * @internal\n     */\n    protected const NS_SEPARATOR = '_';\n\n    private object $miss;\n\n    public function __construct(CacheInterface $pool, string $namespace = '', int $defaultLifetime = 0)\n    {\n        parent::__construct($namespace, $defaultLifetime);\n\n        $this->pool = $pool;\n        $this->miss = new \\stdClass();\n    }\n\n    protected function doFetch(array $ids): iterable\n    {\n        foreach ($this->pool->getMultiple($ids, $this->miss) as $key => $value) {\n            if ($this->miss !== $value) {\n                yield $key => $value;\n            }\n        }\n    }\n\n    protected function doHave(string $id): bool\n    {\n        return $this->pool->has($id);\n    }\n\n    protected function doClear(string $namespace): bool\n    {\n        return $this->pool->clear();\n    }\n\n    protected function doDelete(array $ids): bool\n    {\n        return $this->pool->deleteMultiple($ids);\n    }\n\n    protected function doSave(array $values, int $lifetime): array|bool\n    {\n        return $this->pool->setMultiple($values, 0 === $lifetime ? null : $lifetime);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/RedisAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\nuse Symfony\\Component\\Cache\\Traits\\RedisTrait;\n\nclass RedisAdapter extends AbstractAdapter\n{\n    use RedisTrait;\n\n    public function __construct(\\Redis|\\RedisArray|\\RedisCluster|\\Predis\\ClientInterface|\\Relay\\Relay $redis, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null)\n    {\n        $this->init($redis, $namespace, $defaultLifetime, $marshaller);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Predis\\Connection\\Aggregate\\ClusterInterface;\nuse Predis\\Connection\\Aggregate\\PredisCluster;\nuse Predis\\Connection\\Aggregate\\ReplicationInterface;\nuse Predis\\Response\\ErrorInterface;\nuse Predis\\Response\\Status;\nuse Relay\\Relay;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\Exception\\LogicException;\nuse Symfony\\Component\\Cache\\Marshaller\\DeflateMarshaller;\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\nuse Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller;\nuse Symfony\\Component\\Cache\\Traits\\RedisTrait;\n\n/**\n * Stores tag id <> cache id relationship as a Redis Set.\n *\n * Set (tag relation info) is stored without expiry (non-volatile), while cache always gets an expiry (volatile) even\n * if not set by caller. Thus if you configure redis with the right eviction policy you can be safe this tag <> cache\n * relationship survives eviction (cache cleanup when Redis runs out of memory).\n *\n * Redis server 2.8+ with any `volatile-*` eviction policy, OR `noeviction` if you're sure memory will NEVER fill up\n *\n * Design limitations:\n *  - Max 4 billion cache keys per cache tag as limited by Redis Set datatype.\n *    E.g. If you use a \"all\" items tag for expiry instead of clear(), that limits you to 4 billion cache items also.\n *\n * @see https://redis.io/topics/lru-cache#eviction-policies Documentation for Redis eviction policies.\n * @see https://redis.io/topics/data-types#sets Documentation for Redis Set datatype.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n * @author André Rømcke <andre.romcke+symfony@gmail.com>\n */\nclass RedisTagAwareAdapter extends AbstractTagAwareAdapter\n{\n    use RedisTrait;\n\n    /**\n     * On cache items without a lifetime set, we set it to 100 days. This is to make sure cache items are\n     * preferred to be evicted over tag Sets, if eviction policy is configured according to requirements.\n     */\n    private const DEFAULT_CACHE_TTL = 8640000;\n\n    /**\n     * detected eviction policy used on Redis server.\n     */\n    private string $redisEvictionPolicy;\n    private string $namespace;\n\n    public function __construct(\\Redis|Relay|\\RedisArray|\\RedisCluster|\\Predis\\ClientInterface $redis, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null)\n    {\n        if ($redis instanceof \\Predis\\ClientInterface && $redis->getConnection() instanceof ClusterInterface && !$redis->getConnection() instanceof PredisCluster) {\n            throw new InvalidArgumentException(sprintf('Unsupported Predis cluster connection: only \"%s\" is, \"%s\" given.', PredisCluster::class, get_debug_type($redis->getConnection())));\n        }\n\n        $isRelay = $redis instanceof Relay;\n        if ($isRelay || \\defined('Redis::OPT_COMPRESSION') && \\in_array($redis::class, [\\Redis::class, \\RedisArray::class, \\RedisCluster::class], true)) {\n            $compression = $redis->getOption($isRelay ? Relay::OPT_COMPRESSION : \\Redis::OPT_COMPRESSION);\n\n            foreach (\\is_array($compression) ? $compression : [$compression] as $c) {\n                if ($isRelay ? Relay::COMPRESSION_NONE : \\Redis::COMPRESSION_NONE !== $c) {\n                    throw new InvalidArgumentException(sprintf('redis compression must be disabled when using \"%s\", use \"%s\" instead.', static::class, DeflateMarshaller::class));\n                }\n            }\n        }\n\n        $this->init($redis, $namespace, $defaultLifetime, new TagAwareMarshaller($marshaller));\n        $this->namespace = $namespace;\n    }\n\n    protected function doSave(array $values, int $lifetime, array $addTagData = [], array $delTagData = []): array\n    {\n        $eviction = $this->getRedisEvictionPolicy();\n        if ('noeviction' !== $eviction && !str_starts_with($eviction, 'volatile-')) {\n            throw new LogicException(sprintf('Redis maxmemory-policy setting \"%s\" is *not* supported by RedisTagAwareAdapter, use \"noeviction\" or \"volatile-*\" eviction policies.', $eviction));\n        }\n\n        // serialize values\n        if (!$serialized = $this->marshaller->marshall($values, $failed)) {\n            return $failed;\n        }\n\n        // While pipeline isn't supported on RedisCluster, other setups will at least benefit from doing this in one op\n        $results = $this->pipeline(static function () use ($serialized, $lifetime, $addTagData, $delTagData, $failed) {\n            // Store cache items, force a ttl if none is set, as there is no MSETEX we need to set each one\n            foreach ($serialized as $id => $value) {\n                yield 'setEx' => [\n                    $id,\n                    0 >= $lifetime ? self::DEFAULT_CACHE_TTL : $lifetime,\n                    $value,\n                ];\n            }\n\n            // Add and Remove Tags\n            foreach ($addTagData as $tagId => $ids) {\n                if (!$failed || $ids = array_diff($ids, $failed)) {\n                    yield 'sAdd' => array_merge([$tagId], $ids);\n                }\n            }\n\n            foreach ($delTagData as $tagId => $ids) {\n                if (!$failed || $ids = array_diff($ids, $failed)) {\n                    yield 'sRem' => array_merge([$tagId], $ids);\n                }\n            }\n        });\n\n        foreach ($results as $id => $result) {\n            // Skip results of SADD/SREM operations, they'll be 1 or 0 depending on if set value already existed or not\n            if (is_numeric($result)) {\n                continue;\n            }\n            // setEx results\n            if (true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) {\n                $failed[] = $id;\n            }\n        }\n\n        return $failed;\n    }\n\n    protected function doDeleteYieldTags(array $ids): iterable\n    {\n        $lua = <<<'EOLUA'\n            local v = redis.call('GET', KEYS[1])\n            local e = redis.pcall('UNLINK', KEYS[1])\n\n            if type(e) ~= 'number' then\n                redis.call('DEL', KEYS[1])\n            end\n\n            if not v or v:len() <= 13 or v:byte(1) ~= 0x9D or v:byte(6) ~= 0 or v:byte(10) ~= 0x5F then\n                return ''\n            end\n\n            return v:sub(14, 13 + v:byte(13) + v:byte(12) * 256 + v:byte(11) * 65536)\nEOLUA;\n\n        $results = $this->pipeline(function () use ($ids, $lua) {\n            foreach ($ids as $id) {\n                yield 'eval' => $this->redis instanceof \\Predis\\ClientInterface ? [$lua, 1, $id] : [$lua, [$id], 1];\n            }\n        });\n\n        foreach ($results as $id => $result) {\n            if ($result instanceof \\RedisException || $result instanceof \\Relay\\Exception || $result instanceof ErrorInterface) {\n                CacheItem::log($this->logger, 'Failed to delete key \"{key}\": '.$result->getMessage(), ['key' => substr($id, \\strlen($this->namespace)), 'exception' => $result]);\n\n                continue;\n            }\n\n            try {\n                yield $id => !\\is_string($result) || '' === $result ? [] : $this->marshaller->unmarshall($result);\n            } catch (\\Exception) {\n                yield $id => [];\n            }\n        }\n    }\n\n    protected function doDeleteTagRelations(array $tagData): bool\n    {\n        $results = $this->pipeline(static function () use ($tagData) {\n            foreach ($tagData as $tagId => $idList) {\n                array_unshift($idList, $tagId);\n                yield 'sRem' => $idList;\n            }\n        });\n        foreach ($results as $result) {\n            // no-op\n        }\n\n        return true;\n    }\n\n    protected function doInvalidate(array $tagIds): bool\n    {\n        // This script scans the set of items linked to tag: it empties the set\n        // and removes the linked items. When the set is still not empty after\n        // the scan, it means we're in cluster mode and that the linked items\n        // are on other nodes: we move the links to a temporary set and we\n        // garbage collect that set from the client side.\n\n        $lua = <<<'EOLUA'\n            redis.replicate_commands()\n\n            local cursor = '0'\n            local id = KEYS[1]\n            repeat\n                local result = redis.call('SSCAN', id, cursor, 'COUNT', 5000);\n                cursor = result[1];\n                local rems = {}\n\n                for _, v in ipairs(result[2]) do\n                    local ok, _ = pcall(redis.call, 'DEL', ARGV[1]..v)\n                    if ok then\n                        table.insert(rems, v)\n                    end\n                end\n                if 0 < #rems then\n                    redis.call('SREM', id, unpack(rems))\n                end\n            until '0' == cursor;\n\n            redis.call('SUNIONSTORE', '{'..id..'}'..id, id)\n            redis.call('DEL', id)\n\n            return redis.call('SSCAN', '{'..id..'}'..id, '0', 'COUNT', 5000)\nEOLUA;\n\n        $results = $this->pipeline(function () use ($tagIds, $lua) {\n            if ($this->redis instanceof \\Predis\\ClientInterface) {\n                $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : '';\n            } elseif (\\is_array($prefix = $this->redis->getOption($this->redis instanceof Relay ? Relay::OPT_PREFIX : \\Redis::OPT_PREFIX) ?? '')) {\n                $prefix = current($prefix);\n            }\n\n            foreach ($tagIds as $id) {\n                yield 'eval' => $this->redis instanceof \\Predis\\ClientInterface ? [$lua, 1, $id, $prefix] : [$lua, [$id, $prefix], 1];\n            }\n        });\n\n        $lua = <<<'EOLUA'\n            redis.replicate_commands()\n\n            local id = KEYS[1]\n            local cursor = table.remove(ARGV)\n            redis.call('SREM', '{'..id..'}'..id, unpack(ARGV))\n\n            return redis.call('SSCAN', '{'..id..'}'..id, cursor, 'COUNT', 5000)\nEOLUA;\n\n        $success = true;\n        foreach ($results as $id => $values) {\n            if ($values instanceof \\RedisException || $values instanceof \\Relay\\Exception || $values instanceof ErrorInterface) {\n                CacheItem::log($this->logger, 'Failed to invalidate key \"{key}\": '.$values->getMessage(), ['key' => substr($id, \\strlen($this->namespace)), 'exception' => $values]);\n                $success = false;\n\n                continue;\n            }\n\n            [$cursor, $ids] = $values;\n\n            while ($ids || '0' !== $cursor) {\n                $this->doDelete($ids);\n\n                $evalArgs = [$id, $cursor];\n                array_splice($evalArgs, 1, 0, $ids);\n\n                if ($this->redis instanceof \\Predis\\ClientInterface) {\n                    array_unshift($evalArgs, $lua, 1);\n                } else {\n                    $evalArgs = [$lua, $evalArgs, 1];\n                }\n\n                $results = $this->pipeline(function () use ($evalArgs) {\n                    yield 'eval' => $evalArgs;\n                });\n\n                foreach ($results as [$cursor, $ids]) {\n                    // no-op\n                }\n            }\n        }\n\n        return $success;\n    }\n\n    private function getRedisEvictionPolicy(): string\n    {\n        if (isset($this->redisEvictionPolicy)) {\n            return $this->redisEvictionPolicy;\n        }\n\n        $hosts = $this->getHosts();\n        $host = reset($hosts);\n        if ($host instanceof \\Predis\\Client && $host->getConnection() instanceof ReplicationInterface) {\n            // Predis supports info command only on the master in replication environments\n            $hosts = [$host->getClientFor('master')];\n        }\n\n        foreach ($hosts as $host) {\n            $info = $host->info('Memory');\n\n            if (false === $info || null === $info || $info instanceof ErrorInterface) {\n                continue;\n            }\n\n            $info = $info['Memory'] ?? $info;\n\n            return $this->redisEvictionPolicy = $info['maxmemory_policy'] ?? '';\n        }\n\n        return $this->redisEvictionPolicy = '';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/TagAwareAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\Cache\\CacheItemInterface;\nuse Psr\\Cache\\InvalidArgumentException;\nuse Psr\\Log\\LoggerAwareInterface;\nuse Psr\\Log\\LoggerAwareTrait;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\PruneableInterface;\nuse Symfony\\Component\\Cache\\ResettableInterface;\nuse Symfony\\Component\\Cache\\Traits\\ContractsTrait;\nuse Symfony\\Contracts\\Cache\\TagAwareCacheInterface;\n\n/**\n * Implements simple and robust tag-based invalidation suitable for use with volatile caches.\n *\n * This adapter works by storing a version for each tags. When saving an item, it is stored together with its tags and\n * their corresponding versions. When retrieving an item, those tag versions are compared to the current version of\n * each tags. Invalidation is achieved by deleting tags, thereby ensuring that their versions change even when the\n * storage is out of space. When versions of non-existing tags are requested for item commits, this adapter assigns a\n * new random version to them.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Sergey Belyshkin <sbelyshkin@gmail.com>\n */\nclass TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, PruneableInterface, ResettableInterface, LoggerAwareInterface\n{\n    use ContractsTrait;\n    use LoggerAwareTrait;\n\n    public const TAGS_PREFIX = \"\\1tags\\1\";\n\n    private array $deferred = [];\n    private AdapterInterface $pool;\n    private AdapterInterface $tags;\n    private array $knownTagVersions = [];\n    private float $knownTagVersionsTtl;\n\n    private static \\Closure $setCacheItemTags;\n    private static \\Closure $setTagVersions;\n    private static \\Closure $getTagsByKey;\n    private static \\Closure $saveTags;\n\n    public function __construct(AdapterInterface $itemsPool, ?AdapterInterface $tagsPool = null, float $knownTagVersionsTtl = 0.15)\n    {\n        $this->pool = $itemsPool;\n        $this->tags = $tagsPool ?? $itemsPool;\n        $this->knownTagVersionsTtl = $knownTagVersionsTtl;\n        self::$setCacheItemTags ??= \\Closure::bind(\n            static function (array $items, array $itemTags) {\n                foreach ($items as $key => $item) {\n                    $item->isTaggable = true;\n\n                    if (isset($itemTags[$key])) {\n                        $tags = array_keys($itemTags[$key]);\n                        $item->metadata[CacheItem::METADATA_TAGS] = array_combine($tags, $tags);\n                    } else {\n                        $item->value = null;\n                        $item->isHit = false;\n                        $item->metadata = [];\n                    }\n                }\n\n                return $items;\n            },\n            null,\n            CacheItem::class\n        );\n        self::$setTagVersions ??= \\Closure::bind(\n            static function (array $items, array $tagVersions) {\n                foreach ($items as $item) {\n                    $item->newMetadata[CacheItem::METADATA_TAGS] = array_intersect_key($tagVersions, $item->newMetadata[CacheItem::METADATA_TAGS] ?? []);\n                }\n            },\n            null,\n            CacheItem::class\n        );\n        self::$getTagsByKey ??= \\Closure::bind(\n            static function ($deferred) {\n                $tagsByKey = [];\n                foreach ($deferred as $key => $item) {\n                    $tagsByKey[$key] = $item->newMetadata[CacheItem::METADATA_TAGS] ?? [];\n                    $item->metadata = $item->newMetadata;\n                }\n\n                return $tagsByKey;\n            },\n            null,\n            CacheItem::class\n        );\n        self::$saveTags ??= \\Closure::bind(\n            static function (AdapterInterface $tagsAdapter, array $tags) {\n                ksort($tags);\n\n                foreach ($tags as $v) {\n                    $v->expiry = 0;\n                    $tagsAdapter->saveDeferred($v);\n                }\n\n                return $tagsAdapter->commit();\n            },\n            null,\n            CacheItem::class\n        );\n    }\n\n    public function invalidateTags(array $tags): bool\n    {\n        $ids = [];\n        foreach ($tags as $tag) {\n            \\assert('' !== CacheItem::validateKey($tag));\n            unset($this->knownTagVersions[$tag]);\n            $ids[] = $tag.static::TAGS_PREFIX;\n        }\n\n        return !$tags || $this->tags->deleteItems($ids);\n    }\n\n    public function hasItem(mixed $key): bool\n    {\n        return $this->getItem($key)->isHit();\n    }\n\n    public function getItem(mixed $key): CacheItem\n    {\n        foreach ($this->getItems([$key]) as $item) {\n            return $item;\n        }\n    }\n\n    public function getItems(array $keys = []): iterable\n    {\n        $tagKeys = [];\n        $commit = false;\n\n        foreach ($keys as $key) {\n            if ('' !== $key && \\is_string($key)) {\n                $commit = $commit || isset($this->deferred[$key]);\n            }\n        }\n\n        if ($commit) {\n            $this->commit();\n        }\n\n        try {\n            $items = $this->pool->getItems($keys);\n        } catch (InvalidArgumentException $e) {\n            $this->pool->getItems($keys); // Should throw an exception\n\n            throw $e;\n        }\n\n        $bufferedItems = $itemTags = [];\n\n        foreach ($items as $key => $item) {\n            if (null !== $tags = $item->getMetadata()[CacheItem::METADATA_TAGS] ?? null) {\n                $itemTags[$key] = $tags;\n            }\n\n            $bufferedItems[$key] = $item;\n\n            if (null === $tags) {\n                $key = \"\\0tags\\0\".$key;\n                $tagKeys[$key] = $key; // BC with pools populated before v6.1\n            }\n        }\n\n        if ($tagKeys) {\n            foreach ($this->pool->getItems($tagKeys) as $key => $item) {\n                if ($item->isHit()) {\n                    $itemTags[substr($key, \\strlen(\"\\0tags\\0\"))] = $item->get() ?: [];\n                }\n            }\n        }\n\n        $tagVersions = $this->getTagVersions($itemTags, false);\n        foreach ($itemTags as $key => $tags) {\n            foreach ($tags as $tag => $version) {\n                if ($tagVersions[$tag] !== $version) {\n                    unset($itemTags[$key]);\n                    continue 2;\n                }\n            }\n        }\n        $tagVersions = null;\n\n        return (self::$setCacheItemTags)($bufferedItems, $itemTags);\n    }\n\n    public function clear(string $prefix = ''): bool\n    {\n        if ('' !== $prefix) {\n            foreach ($this->deferred as $key => $item) {\n                if (str_starts_with($key, $prefix)) {\n                    unset($this->deferred[$key]);\n                }\n            }\n        } else {\n            $this->deferred = [];\n        }\n\n        if ($this->pool instanceof AdapterInterface) {\n            return $this->pool->clear($prefix);\n        }\n\n        return $this->pool->clear();\n    }\n\n    public function deleteItem(mixed $key): bool\n    {\n        return $this->deleteItems([$key]);\n    }\n\n    public function deleteItems(array $keys): bool\n    {\n        foreach ($keys as $key) {\n            if ('' !== $key && \\is_string($key)) {\n                $keys[] = \"\\0tags\\0\".$key; // BC with pools populated before v6.1\n            }\n        }\n\n        return $this->pool->deleteItems($keys);\n    }\n\n    public function save(CacheItemInterface $item): bool\n    {\n        if (!$item instanceof CacheItem) {\n            return false;\n        }\n        $this->deferred[$item->getKey()] = $item;\n\n        return $this->commit();\n    }\n\n    public function saveDeferred(CacheItemInterface $item): bool\n    {\n        if (!$item instanceof CacheItem) {\n            return false;\n        }\n        $this->deferred[$item->getKey()] = $item;\n\n        return true;\n    }\n\n    public function commit(): bool\n    {\n        if (!$items = $this->deferred) {\n            return true;\n        }\n\n        $tagVersions = $this->getTagVersions((self::$getTagsByKey)($items), true);\n        (self::$setTagVersions)($items, $tagVersions);\n\n        $ok = true;\n        foreach ($items as $key => $item) {\n            if ($this->pool->saveDeferred($item)) {\n                unset($this->deferred[$key]);\n            } else {\n                $ok = false;\n            }\n        }\n        $ok = $this->pool->commit() && $ok;\n\n        $tagVersions = array_keys($tagVersions);\n        (self::$setTagVersions)($items, array_combine($tagVersions, $tagVersions));\n\n        return $ok;\n    }\n\n    public function prune(): bool\n    {\n        return $this->pool instanceof PruneableInterface && $this->pool->prune();\n    }\n\n    /**\n     * @return void\n     */\n    public function reset()\n    {\n        $this->commit();\n        $this->knownTagVersions = [];\n        $this->pool instanceof ResettableInterface && $this->pool->reset();\n        $this->tags instanceof ResettableInterface && $this->tags->reset();\n    }\n\n    public function __sleep(): array\n    {\n        throw new \\BadMethodCallException('Cannot serialize '.__CLASS__);\n    }\n\n    /**\n     * @return void\n     */\n    public function __wakeup()\n    {\n        throw new \\BadMethodCallException('Cannot unserialize '.__CLASS__);\n    }\n\n    public function __destruct()\n    {\n        $this->commit();\n    }\n\n    private function getTagVersions(array $tagsByKey, bool $persistTags): array\n    {\n        $tagVersions = [];\n        $fetchTagVersions = $persistTags;\n\n        foreach ($tagsByKey as $tags) {\n            $tagVersions += $tags;\n            if ($fetchTagVersions) {\n                continue;\n            }\n            foreach ($tags as $tag => $version) {\n                if ($tagVersions[$tag] !== $version) {\n                    $fetchTagVersions = true;\n                }\n            }\n        }\n\n        if (!$tagVersions) {\n            return [];\n        }\n\n        $now = microtime(true);\n        $tags = [];\n        foreach ($tagVersions as $tag => $version) {\n            $tags[$tag.static::TAGS_PREFIX] = $tag;\n            $knownTagVersion = $this->knownTagVersions[$tag] ?? [0, null];\n            if ($fetchTagVersions || $now > $knownTagVersion[0] || $knownTagVersion[1] !== $version) {\n                // reuse previously fetched tag versions until the expiration\n                $fetchTagVersions = true;\n            }\n        }\n\n        if (!$fetchTagVersions) {\n            return $tagVersions;\n        }\n\n        $newTags = [];\n        $newVersion = null;\n        $expiration = $now + $this->knownTagVersionsTtl;\n        foreach ($this->tags->getItems(array_keys($tags)) as $tag => $version) {\n            unset($this->knownTagVersions[$tag = $tags[$tag]]); // update FIFO\n            if (null !== $tagVersions[$tag] = $version->get()) {\n                $this->knownTagVersions[$tag] = [$expiration, $tagVersions[$tag]];\n            } elseif ($persistTags) {\n                $newTags[$tag] = $version->set($newVersion ??= random_bytes(6));\n                $tagVersions[$tag] = $newVersion;\n                $this->knownTagVersions[$tag] = [$expiration, $newVersion];\n            }\n        }\n\n        if ($newTags) {\n            (self::$saveTags)($this->tags, $newTags);\n        }\n\n        while ($now > ($this->knownTagVersions[$tag = array_key_first($this->knownTagVersions)][0] ?? \\INF)) {\n            unset($this->knownTagVersions[$tag]);\n        }\n\n        return $tagVersions;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\Cache\\InvalidArgumentException;\n\n/**\n * Interface for invalidating cached items using tags.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\ninterface TagAwareAdapterInterface extends AdapterInterface\n{\n    /**\n     * Invalidates cached items using tags.\n     *\n     * @param string[] $tags An array of tags to invalidate\n     *\n     * @throws InvalidArgumentException When $tags is not valid\n     */\n    public function invalidateTags(array $tags): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/TraceableAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Psr\\Cache\\CacheItemInterface;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\PruneableInterface;\nuse Symfony\\Component\\Cache\\ResettableInterface;\nuse Symfony\\Contracts\\Cache\\CacheInterface;\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n/**\n * An adapter that collects data about all cache calls.\n *\n * @author Aaron Scherer <aequasi@gmail.com>\n * @author Tobias Nyholm <tobias.nyholm@gmail.com>\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface\n{\n    protected $pool;\n    private array $calls = [];\n\n    public function __construct(AdapterInterface $pool)\n    {\n        $this->pool = $pool;\n    }\n\n    public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed\n    {\n        if (!$this->pool instanceof CacheInterface) {\n            throw new \\BadMethodCallException(sprintf('Cannot call \"%s::get()\": this class doesn\\'t implement \"%s\".', get_debug_type($this->pool), CacheInterface::class));\n        }\n\n        $isHit = true;\n        $callback = function (CacheItem $item, bool &$save) use ($callback, &$isHit) {\n            $isHit = $item->isHit();\n\n            return $callback($item, $save);\n        };\n\n        $event = $this->start(__FUNCTION__);\n        try {\n            $value = $this->pool->get($key, $callback, $beta, $metadata);\n            $event->result[$key] = get_debug_type($value);\n        } finally {\n            $event->end = microtime(true);\n        }\n        if ($isHit) {\n            ++$event->hits;\n        } else {\n            ++$event->misses;\n        }\n\n        return $value;\n    }\n\n    public function getItem(mixed $key): CacheItem\n    {\n        $event = $this->start(__FUNCTION__);\n        try {\n            $item = $this->pool->getItem($key);\n        } finally {\n            $event->end = microtime(true);\n        }\n        if ($event->result[$key] = $item->isHit()) {\n            ++$event->hits;\n        } else {\n            ++$event->misses;\n        }\n\n        return $item;\n    }\n\n    public function hasItem(mixed $key): bool\n    {\n        $event = $this->start(__FUNCTION__);\n        try {\n            return $event->result[$key] = $this->pool->hasItem($key);\n        } finally {\n            $event->end = microtime(true);\n        }\n    }\n\n    public function deleteItem(mixed $key): bool\n    {\n        $event = $this->start(__FUNCTION__);\n        try {\n            return $event->result[$key] = $this->pool->deleteItem($key);\n        } finally {\n            $event->end = microtime(true);\n        }\n    }\n\n    public function save(CacheItemInterface $item): bool\n    {\n        $event = $this->start(__FUNCTION__);\n        try {\n            return $event->result[$item->getKey()] = $this->pool->save($item);\n        } finally {\n            $event->end = microtime(true);\n        }\n    }\n\n    public function saveDeferred(CacheItemInterface $item): bool\n    {\n        $event = $this->start(__FUNCTION__);\n        try {\n            return $event->result[$item->getKey()] = $this->pool->saveDeferred($item);\n        } finally {\n            $event->end = microtime(true);\n        }\n    }\n\n    public function getItems(array $keys = []): iterable\n    {\n        $event = $this->start(__FUNCTION__);\n        try {\n            $result = $this->pool->getItems($keys);\n        } finally {\n            $event->end = microtime(true);\n        }\n        $f = function () use ($result, $event) {\n            $event->result = [];\n            foreach ($result as $key => $item) {\n                if ($event->result[$key] = $item->isHit()) {\n                    ++$event->hits;\n                } else {\n                    ++$event->misses;\n                }\n                yield $key => $item;\n            }\n        };\n\n        return $f();\n    }\n\n    public function clear(string $prefix = ''): bool\n    {\n        $event = $this->start(__FUNCTION__);\n        try {\n            if ($this->pool instanceof AdapterInterface) {\n                return $event->result = $this->pool->clear($prefix);\n            }\n\n            return $event->result = $this->pool->clear();\n        } finally {\n            $event->end = microtime(true);\n        }\n    }\n\n    public function deleteItems(array $keys): bool\n    {\n        $event = $this->start(__FUNCTION__);\n        $event->result['keys'] = $keys;\n        try {\n            return $event->result['result'] = $this->pool->deleteItems($keys);\n        } finally {\n            $event->end = microtime(true);\n        }\n    }\n\n    public function commit(): bool\n    {\n        $event = $this->start(__FUNCTION__);\n        try {\n            return $event->result = $this->pool->commit();\n        } finally {\n            $event->end = microtime(true);\n        }\n    }\n\n    public function prune(): bool\n    {\n        if (!$this->pool instanceof PruneableInterface) {\n            return false;\n        }\n        $event = $this->start(__FUNCTION__);\n        try {\n            return $event->result = $this->pool->prune();\n        } finally {\n            $event->end = microtime(true);\n        }\n    }\n\n    /**\n     * @return void\n     */\n    public function reset()\n    {\n        if ($this->pool instanceof ResetInterface) {\n            $this->pool->reset();\n        }\n\n        $this->clearCalls();\n    }\n\n    public function delete(string $key): bool\n    {\n        $event = $this->start(__FUNCTION__);\n        try {\n            return $event->result[$key] = $this->pool->deleteItem($key);\n        } finally {\n            $event->end = microtime(true);\n        }\n    }\n\n    /**\n     * @return array\n     */\n    public function getCalls()\n    {\n        return $this->calls;\n    }\n\n    /**\n     * @return void\n     */\n    public function clearCalls()\n    {\n        $this->calls = [];\n    }\n\n    public function getPool(): AdapterInterface\n    {\n        return $this->pool;\n    }\n\n    /**\n     * @return TraceableAdapterEvent\n     */\n    protected function start(string $name)\n    {\n        $this->calls[] = $event = new TraceableAdapterEvent();\n        $event->name = $name;\n        $event->start = microtime(true);\n\n        return $event;\n    }\n}\n\n/**\n * @internal\n */\nclass TraceableAdapterEvent\n{\n    public string $name;\n    public float $start;\n    public float $end;\n    public array|bool $result;\n    public int $hits = 0;\n    public int $misses = 0;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Adapter;\n\nuse Symfony\\Contracts\\Cache\\TagAwareCacheInterface;\n\n/**\n * @author Robin Chalas <robin.chalas@gmail.com>\n */\nclass TraceableTagAwareAdapter extends TraceableAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface\n{\n    public function __construct(TagAwareAdapterInterface $pool)\n    {\n        parent::__construct($pool);\n    }\n\n    public function invalidateTags(array $tags): bool\n    {\n        $event = $this->start(__FUNCTION__);\n        try {\n            return $event->result = $this->pool->invalidateTags($tags);\n        } finally {\n            $event->end = microtime(true);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/CHANGELOG.md",
    "content": "CHANGELOG\n=========\n\n6.4\n---\n\n * `EarlyExpirationHandler` no longer implements `MessageHandlerInterface`, rely on `AsMessageHandler` instead\n\n6.3\n---\n\n * Add support for Relay PHP extension for Redis\n * Updates to allow Redis cluster connections using predis/predis:^2.0\n * Add optional parameter `$isSameDatabase` to `DoctrineDbalAdapter::configureSchema()`\n\n6.1\n---\n\n * Add support for ACL auth in RedisAdapter\n * Improve reliability and performance of `TagAwareAdapter` by making tag versions an integral part of item value\n\n6.0\n---\n\n * Remove `DoctrineProvider` and `DoctrineAdapter`\n * Remove support of Doctrine DBAL in `PdoAdapter`\n\n5.4\n---\n\n * Deprecate `DoctrineProvider` and `DoctrineAdapter` because these classes have been added to the `doctrine/cache` package\n * Add `DoctrineDbalAdapter` identical to `PdoAdapter` for `Doctrine\\DBAL\\Connection` or DBAL URL\n * Deprecate usage of `PdoAdapter` with `Doctrine\\DBAL\\Connection` or DBAL URL\n\n5.3\n---\n\n * added support for connecting to Redis Sentinel clusters when using the Redis PHP extension\n * add support for a custom serializer to the `ApcuAdapter` class\n\n5.2.0\n-----\n\n * added integration with Messenger to allow computing cached values in a worker\n * allow ISO 8601 time intervals to specify default lifetime\n\n5.1.0\n-----\n\n * added max-items + LRU + max-lifetime capabilities to `ArrayCache`\n * added `CouchbaseBucketAdapter`\n * added context `cache-adapter` to log messages\n\n5.0.0\n-----\n\n * removed all PSR-16 implementations in the `Simple` namespace\n * removed `SimpleCacheAdapter`\n * removed `AbstractAdapter::unserialize()`\n * removed `CacheItem::getPreviousTags()`\n\n4.4.0\n-----\n\n * added support for connecting to Redis Sentinel clusters\n * added argument `$prefix` to `AdapterInterface::clear()`\n * improved `RedisTagAwareAdapter` to support Redis server >= 2.8 and up to 4B items per tag\n * added `TagAwareMarshaller` for optimized data storage when using `AbstractTagAwareAdapter`\n * added `DeflateMarshaller` to compress serialized values\n * removed support for phpredis 4 `compression`\n * [BC BREAK] `RedisTagAwareAdapter` is not compatible with `RedisCluster` from `Predis` anymore, use `phpredis` instead\n * Marked the `CacheDataCollector` class as `@final`.\n * added `SodiumMarshaller` to encrypt/decrypt values using libsodium\n\n4.3.0\n-----\n\n * removed `psr/simple-cache` dependency, run `composer require psr/simple-cache` if you need it\n * deprecated all PSR-16 adapters, use `Psr16Cache` or `Symfony\\Contracts\\Cache\\CacheInterface` implementations instead\n * deprecated `SimpleCacheAdapter`, use `Psr16Adapter` instead\n\n4.2.0\n-----\n\n * added support for connecting to Redis clusters via DSN\n * added support for configuring multiple Memcached servers via DSN\n * added `MarshallerInterface` and `DefaultMarshaller` to allow changing the serializer and provide one that automatically uses igbinary when available\n * implemented `CacheInterface`, which provides stampede protection via probabilistic early expiration and should become the preferred way to use a cache\n * added sub-second expiry accuracy for backends that support it\n * added support for phpredis 4 `compression` and `tcp_keepalive` options\n * added automatic table creation when using Doctrine DBAL with PDO-based backends\n * throw `LogicException` when `CacheItem::tag()` is called on an item coming from a non tag-aware pool\n * deprecated `CacheItem::getPreviousTags()`, use `CacheItem::getMetadata()` instead\n * deprecated the `AbstractAdapter::unserialize()` and `AbstractCache::unserialize()` methods\n * added `CacheCollectorPass` (originally in `FrameworkBundle`)\n * added `CachePoolClearerPass` (originally in `FrameworkBundle`)\n * added `CachePoolPass` (originally in `FrameworkBundle`)\n * added `CachePoolPrunerPass` (originally in `FrameworkBundle`)\n\n3.4.0\n-----\n\n * added using options from Memcached DSN\n * added PruneableInterface so PSR-6 or PSR-16 cache implementations can declare support for manual stale cache pruning\n * added prune logic to FilesystemTrait, PhpFilesTrait, PdoTrait, TagAwareAdapter and ChainTrait\n * now FilesystemAdapter, PhpFilesAdapter, FilesystemCache, PhpFilesCache, PdoAdapter, PdoCache, ChainAdapter, and\n   ChainCache implement PruneableInterface and support manual stale cache pruning\n\n3.3.0\n-----\n\n * added CacheItem::getPreviousTags() to get bound tags coming from the pool storage if any\n * added PSR-16 \"Simple Cache\" implementations for all existing PSR-6 adapters\n * added Psr6Cache and SimpleCacheAdapter for bidirectional interoperability between PSR-6 and PSR-16\n * added MemcachedAdapter (PSR-6) and MemcachedCache (PSR-16)\n * added TraceableAdapter (PSR-6) and TraceableCache (PSR-16)\n\n3.2.0\n-----\n\n * added TagAwareAdapter for tags-based invalidation\n * added PdoAdapter with PDO and Doctrine DBAL support\n * added PhpArrayAdapter and PhpFilesAdapter for OPcache-backed shared memory storage (PHP 7+ only)\n * added NullAdapter\n\n3.1.0\n-----\n\n * added the component with strict PSR-6 implementations\n * added ApcuAdapter, ArrayAdapter, FilesystemAdapter and RedisAdapter\n * added AbstractAdapter, ChainAdapter and ProxyAdapter\n * added DoctrineAdapter and DoctrineProvider for bidirectional interoperability with Doctrine Cache\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/CacheItem.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache;\n\nuse Psr\\Log\\LoggerInterface;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\Exception\\LogicException;\nuse Symfony\\Contracts\\Cache\\ItemInterface;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n */\nfinal class CacheItem implements ItemInterface\n{\n    private const METADATA_EXPIRY_OFFSET = 1527506807;\n    private const VALUE_WRAPPER = \"\\xA9\";\n\n    protected string $key;\n    protected mixed $value = null;\n    protected bool $isHit = false;\n    protected float|int|null $expiry = null;\n    protected array $metadata = [];\n    protected array $newMetadata = [];\n    protected ?ItemInterface $innerItem = null;\n    protected ?string $poolHash = null;\n    protected bool $isTaggable = false;\n\n    public function getKey(): string\n    {\n        return $this->key;\n    }\n\n    public function get(): mixed\n    {\n        return $this->value;\n    }\n\n    public function isHit(): bool\n    {\n        return $this->isHit;\n    }\n\n    /**\n     * @return $this\n     */\n    public function set($value): static\n    {\n        $this->value = $value;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function expiresAt(?\\DateTimeInterface $expiration): static\n    {\n        $this->expiry = null !== $expiration ? (float) $expiration->format('U.u') : null;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function expiresAfter(mixed $time): static\n    {\n        if (null === $time) {\n            $this->expiry = null;\n        } elseif ($time instanceof \\DateInterval) {\n            $this->expiry = microtime(true) + \\DateTimeImmutable::createFromFormat('U', 0)->add($time)->format('U.u');\n        } elseif (\\is_int($time)) {\n            $this->expiry = $time + microtime(true);\n        } else {\n            throw new InvalidArgumentException(sprintf('Expiration date must be an integer, a DateInterval or null, \"%s\" given.', get_debug_type($time)));\n        }\n\n        return $this;\n    }\n\n    public function tag(mixed $tags): static\n    {\n        if (!$this->isTaggable) {\n            throw new LogicException(sprintf('Cache item \"%s\" comes from a non tag-aware pool: you cannot tag it.', $this->key));\n        }\n        if (!\\is_array($tags) && !$tags instanceof \\Traversable) { // don't use is_iterable(), it's slow\n            $tags = [$tags];\n        }\n        foreach ($tags as $tag) {\n            if (!\\is_string($tag) && !$tag instanceof \\Stringable) {\n                throw new InvalidArgumentException(sprintf('Cache tag must be string or object that implements __toString(), \"%s\" given.', get_debug_type($tag)));\n            }\n            $tag = (string) $tag;\n            if (isset($this->newMetadata[self::METADATA_TAGS][$tag])) {\n                continue;\n            }\n            if ('' === $tag) {\n                throw new InvalidArgumentException('Cache tag length must be greater than zero.');\n            }\n            if (false !== strpbrk($tag, self::RESERVED_CHARACTERS)) {\n                throw new InvalidArgumentException(sprintf('Cache tag \"%s\" contains reserved characters \"%s\".', $tag, self::RESERVED_CHARACTERS));\n            }\n            $this->newMetadata[self::METADATA_TAGS][$tag] = $tag;\n        }\n\n        return $this;\n    }\n\n    public function getMetadata(): array\n    {\n        return $this->metadata;\n    }\n\n    /**\n     * Validates a cache key according to PSR-6.\n     *\n     * @param mixed $key The key to validate\n     *\n     * @throws InvalidArgumentException When $key is not valid\n     */\n    public static function validateKey($key): string\n    {\n        if (!\\is_string($key)) {\n            throw new InvalidArgumentException(sprintf('Cache key must be string, \"%s\" given.', get_debug_type($key)));\n        }\n        if ('' === $key) {\n            throw new InvalidArgumentException('Cache key length must be greater than zero.');\n        }\n        if (false !== strpbrk($key, self::RESERVED_CHARACTERS)) {\n            throw new InvalidArgumentException(sprintf('Cache key \"%s\" contains reserved characters \"%s\".', $key, self::RESERVED_CHARACTERS));\n        }\n\n        return $key;\n    }\n\n    /**\n     * Internal logging helper.\n     *\n     * @internal\n     */\n    public static function log(?LoggerInterface $logger, string $message, array $context = []): void\n    {\n        if ($logger) {\n            $logger->warning($message, $context);\n        } else {\n            $replace = [];\n            foreach ($context as $k => $v) {\n                if (\\is_scalar($v)) {\n                    $replace['{'.$k.'}'] = $v;\n                }\n            }\n            @trigger_error(strtr($message, $replace), \\E_USER_WARNING);\n        }\n    }\n\n    private function pack(): mixed\n    {\n        if (!$m = $this->newMetadata) {\n            return $this->value;\n        }\n        $valueWrapper = self::VALUE_WRAPPER;\n\n        return new $valueWrapper($this->value, $m + ['expiry' => $this->expiry]);\n    }\n\n    private function unpack(): bool\n    {\n        $v = $this->value;\n        $valueWrapper = self::VALUE_WRAPPER;\n\n        if ($v instanceof $valueWrapper) {\n            $this->value = $v->value;\n            $this->metadata = $v->metadata;\n\n            return true;\n        }\n\n        if (!\\is_array($v) || 1 !== \\count($v) || 10 !== \\strlen($k = (string) array_key_first($v)) || \"\\x9D\" !== $k[0] || \"\\0\" !== $k[5] || \"\\x5F\" !== $k[9]) {\n            return false;\n        }\n\n        // BC with pools populated before v6.1\n        $this->value = $v[$k];\n        $this->metadata = unpack('Vexpiry/Nctime', substr($k, 1, -1));\n        $this->metadata['expiry'] += self::METADATA_EXPIRY_OFFSET;\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/DataCollector/CacheDataCollector.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\DataCollector;\n\nuse Symfony\\Component\\Cache\\Adapter\\TraceableAdapter;\nuse Symfony\\Component\\Cache\\Adapter\\TraceableAdapterEvent;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector;\nuse Symfony\\Component\\HttpKernel\\DataCollector\\LateDataCollectorInterface;\n\n/**\n * @author Aaron Scherer <aequasi@gmail.com>\n * @author Tobias Nyholm <tobias.nyholm@gmail.com>\n *\n * @final\n */\nclass CacheDataCollector extends DataCollector implements LateDataCollectorInterface\n{\n    /**\n     * @var TraceableAdapter[]\n     */\n    private array $instances = [];\n\n    public function addInstance(string $name, TraceableAdapter $instance): void\n    {\n        $this->instances[$name] = $instance;\n    }\n\n    public function collect(Request $request, Response $response, ?\\Throwable $exception = null): void\n    {\n        $empty = ['calls' => [], 'adapters' => [], 'config' => [], 'options' => [], 'statistics' => []];\n        $this->data = ['instances' => $empty, 'total' => $empty];\n        foreach ($this->instances as $name => $instance) {\n            $this->data['instances']['calls'][$name] = $instance->getCalls();\n            $this->data['instances']['adapters'][$name] = get_debug_type($instance->getPool());\n        }\n\n        $this->data['instances']['statistics'] = $this->calculateStatistics();\n        $this->data['total']['statistics'] = $this->calculateTotalStatistics();\n    }\n\n    public function reset(): void\n    {\n        $this->data = [];\n        foreach ($this->instances as $instance) {\n            $instance->clearCalls();\n        }\n    }\n\n    public function lateCollect(): void\n    {\n        $this->data['instances']['calls'] = $this->cloneVar($this->data['instances']['calls']);\n    }\n\n    public function getName(): string\n    {\n        return 'cache';\n    }\n\n    /**\n     * Method returns amount of logged Cache reads: \"get\" calls.\n     */\n    public function getStatistics(): array\n    {\n        return $this->data['instances']['statistics'];\n    }\n\n    /**\n     * Method returns the statistic totals.\n     */\n    public function getTotals(): array\n    {\n        return $this->data['total']['statistics'];\n    }\n\n    /**\n     * Method returns all logged Cache call objects.\n     */\n    public function getCalls(): mixed\n    {\n        return $this->data['instances']['calls'];\n    }\n\n    /**\n     * Method returns all logged Cache adapter classes.\n     */\n    public function getAdapters(): array\n    {\n        return $this->data['instances']['adapters'];\n    }\n\n    private function calculateStatistics(): array\n    {\n        $statistics = [];\n        foreach ($this->data['instances']['calls'] as $name => $calls) {\n            $statistics[$name] = [\n                'calls' => 0,\n                'time' => 0,\n                'reads' => 0,\n                'writes' => 0,\n                'deletes' => 0,\n                'hits' => 0,\n                'misses' => 0,\n            ];\n            /** @var TraceableAdapterEvent $call */\n            foreach ($calls as $call) {\n                ++$statistics[$name]['calls'];\n                $statistics[$name]['time'] += ($call->end ?? microtime(true)) - $call->start;\n                if ('get' === $call->name) {\n                    ++$statistics[$name]['reads'];\n                    if ($call->hits) {\n                        ++$statistics[$name]['hits'];\n                    } else {\n                        ++$statistics[$name]['misses'];\n                        ++$statistics[$name]['writes'];\n                    }\n                } elseif ('getItem' === $call->name) {\n                    ++$statistics[$name]['reads'];\n                    if ($call->hits) {\n                        ++$statistics[$name]['hits'];\n                    } else {\n                        ++$statistics[$name]['misses'];\n                    }\n                } elseif ('getItems' === $call->name) {\n                    $statistics[$name]['reads'] += $call->hits + $call->misses;\n                    $statistics[$name]['hits'] += $call->hits;\n                    $statistics[$name]['misses'] += $call->misses;\n                } elseif ('hasItem' === $call->name) {\n                    ++$statistics[$name]['reads'];\n                    foreach ($call->result ?? [] as $result) {\n                        ++$statistics[$name][$result ? 'hits' : 'misses'];\n                    }\n                } elseif ('save' === $call->name) {\n                    ++$statistics[$name]['writes'];\n                } elseif ('deleteItem' === $call->name) {\n                    ++$statistics[$name]['deletes'];\n                }\n            }\n            if ($statistics[$name]['reads']) {\n                $statistics[$name]['hit_read_ratio'] = round(100 * $statistics[$name]['hits'] / $statistics[$name]['reads'], 2);\n            } else {\n                $statistics[$name]['hit_read_ratio'] = null;\n            }\n        }\n\n        return $statistics;\n    }\n\n    private function calculateTotalStatistics(): array\n    {\n        $statistics = $this->getStatistics();\n        $totals = [\n            'calls' => 0,\n            'time' => 0,\n            'reads' => 0,\n            'writes' => 0,\n            'deletes' => 0,\n            'hits' => 0,\n            'misses' => 0,\n        ];\n        foreach ($statistics as $name => $values) {\n            foreach ($totals as $key => $value) {\n                $totals[$key] += $statistics[$name][$key];\n            }\n        }\n        if ($totals['reads']) {\n            $totals['hit_read_ratio'] = round(100 * $totals['hits'] / $totals['reads'], 2);\n        } else {\n            $totals['hit_read_ratio'] = null;\n        }\n\n        return $totals;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\DependencyInjection;\n\nuse Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface;\nuse Symfony\\Component\\Cache\\Adapter\\TraceableAdapter;\nuse Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter;\nuse Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface;\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\nuse Symfony\\Component\\DependencyInjection\\Definition;\nuse Symfony\\Component\\DependencyInjection\\Reference;\n\n/**\n * Inject a data collector to all the cache services to be able to get detailed statistics.\n *\n * @author Tobias Nyholm <tobias.nyholm@gmail.com>\n */\nclass CacheCollectorPass implements CompilerPassInterface\n{\n    /**\n     * @return void\n     */\n    public function process(ContainerBuilder $container)\n    {\n        if (!$container->hasDefinition('data_collector.cache')) {\n            return;\n        }\n\n        foreach ($container->findTaggedServiceIds('cache.pool') as $id => $attributes) {\n            $poolName = $attributes[0]['name'] ?? $id;\n\n            $this->addToCollector($id, $poolName, $container);\n        }\n    }\n\n    private function addToCollector(string $id, string $name, ContainerBuilder $container): void\n    {\n        $definition = $container->getDefinition($id);\n        if ($definition->isAbstract()) {\n            return;\n        }\n\n        $collectorDefinition = $container->getDefinition('data_collector.cache');\n        $recorder = new Definition(is_subclass_of($definition->getClass(), TagAwareAdapterInterface::class) ? TraceableTagAwareAdapter::class : TraceableAdapter::class);\n        $recorder->setTags($definition->getTags());\n        if (!$definition->isPublic() || !$definition->isPrivate()) {\n            $recorder->setPublic($definition->isPublic());\n        }\n        $recorder->setArguments([new Reference($innerId = $id.'.recorder_inner')]);\n\n        foreach ($definition->getMethodCalls() as [$method, $args]) {\n            if ('setCallbackWrapper' !== $method || !$args[0] instanceof Definition || !($args[0]->getArguments()[2] ?? null) instanceof Definition) {\n                continue;\n            }\n            if ([new Reference($id), 'setCallbackWrapper'] == $args[0]->getArguments()[2]->getFactory()) {\n                $args[0]->getArguments()[2]->setFactory([new Reference($innerId), 'setCallbackWrapper']);\n            }\n        }\n\n        $definition->setTags([]);\n        $definition->setPublic(false);\n\n        $container->setDefinition($innerId, $definition);\n        $container->setDefinition($id, $recorder);\n\n        // Tell the collector to add the new instance\n        $collectorDefinition->addMethodCall('addInstance', [$name, new Reference($id)]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\DependencyInjection;\n\nuse Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface;\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\nuse Symfony\\Component\\DependencyInjection\\Reference;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass CachePoolClearerPass implements CompilerPassInterface\n{\n    /**\n     * @return void\n     */\n    public function process(ContainerBuilder $container)\n    {\n        $container->getParameterBag()->remove('cache.prefix.seed');\n\n        foreach ($container->findTaggedServiceIds('cache.pool.clearer') as $id => $attr) {\n            $clearer = $container->getDefinition($id);\n            $pools = [];\n            foreach ($clearer->getArgument(0) as $name => $ref) {\n                if ($container->hasDefinition($ref)) {\n                    $pools[$name] = new Reference($ref);\n                }\n            }\n            $clearer->replaceArgument(0, $pools);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/DependencyInjection/CachePoolPass.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\DependencyInjection;\n\nuse Symfony\\Component\\Cache\\Adapter\\AbstractAdapter;\nuse Symfony\\Component\\Cache\\Adapter\\ArrayAdapter;\nuse Symfony\\Component\\Cache\\Adapter\\ChainAdapter;\nuse Symfony\\Component\\Cache\\Adapter\\NullAdapter;\nuse Symfony\\Component\\Cache\\Adapter\\ParameterNormalizer;\nuse Symfony\\Component\\Cache\\Messenger\\EarlyExpirationDispatcher;\nuse Symfony\\Component\\DependencyInjection\\ChildDefinition;\nuse Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface;\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\nuse Symfony\\Component\\DependencyInjection\\Definition;\nuse Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\DependencyInjection\\Reference;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass CachePoolPass implements CompilerPassInterface\n{\n    /**\n     * @return void\n     */\n    public function process(ContainerBuilder $container)\n    {\n        if ($container->hasParameter('cache.prefix.seed')) {\n            $seed = $container->getParameterBag()->resolveValue($container->getParameter('cache.prefix.seed'));\n        } else {\n            $seed = '_'.$container->getParameter('kernel.project_dir');\n            $seed .= '.'.$container->getParameter('kernel.container_class');\n        }\n\n        $needsMessageHandler = false;\n        $allPools = [];\n        $clearers = [];\n        $attributes = [\n            'provider',\n            'name',\n            'namespace',\n            'default_lifetime',\n            'early_expiration_message_bus',\n            'reset',\n        ];\n        foreach ($container->findTaggedServiceIds('cache.pool') as $id => $tags) {\n            $adapter = $pool = $container->getDefinition($id);\n            if ($pool->isAbstract()) {\n                continue;\n            }\n            $class = $adapter->getClass();\n            while ($adapter instanceof ChildDefinition) {\n                $adapter = $container->findDefinition($adapter->getParent());\n                $class = $class ?: $adapter->getClass();\n                if ($t = $adapter->getTag('cache.pool')) {\n                    $tags[0] += $t[0];\n                }\n            }\n            $name = $tags[0]['name'] ?? $id;\n            if (!isset($tags[0]['namespace'])) {\n                $namespaceSeed = $seed;\n                if (null !== $class) {\n                    $namespaceSeed .= '.'.$class;\n                }\n\n                $tags[0]['namespace'] = $this->getNamespace($namespaceSeed, $name);\n            }\n            if (isset($tags[0]['clearer'])) {\n                $clearer = $tags[0]['clearer'];\n                while ($container->hasAlias($clearer)) {\n                    $clearer = (string) $container->getAlias($clearer);\n                }\n            } else {\n                $clearer = null;\n            }\n            unset($tags[0]['clearer'], $tags[0]['name']);\n\n            if (isset($tags[0]['provider'])) {\n                $tags[0]['provider'] = new Reference(static::getServiceProvider($container, $tags[0]['provider']));\n            }\n\n            if (ChainAdapter::class === $class) {\n                $adapters = [];\n                foreach ($adapter->getArgument(0) as $provider => $adapter) {\n                    if ($adapter instanceof ChildDefinition) {\n                        $chainedPool = $adapter;\n                    } else {\n                        $chainedPool = $adapter = new ChildDefinition($adapter);\n                    }\n\n                    $chainedTags = [\\is_int($provider) ? [] : ['provider' => $provider]];\n                    $chainedClass = '';\n\n                    while ($adapter instanceof ChildDefinition) {\n                        $adapter = $container->findDefinition($adapter->getParent());\n                        $chainedClass = $chainedClass ?: $adapter->getClass();\n                        if ($t = $adapter->getTag('cache.pool')) {\n                            $chainedTags[0] += $t[0];\n                        }\n                    }\n\n                    if (ChainAdapter::class === $chainedClass) {\n                        throw new InvalidArgumentException(sprintf('Invalid service \"%s\": chain of adapters cannot reference another chain, found \"%s\".', $id, $chainedPool->getParent()));\n                    }\n\n                    $i = 0;\n\n                    if (isset($chainedTags[0]['provider'])) {\n                        $chainedPool->replaceArgument($i++, new Reference(static::getServiceProvider($container, $chainedTags[0]['provider'])));\n                    }\n\n                    if (isset($tags[0]['namespace']) && !\\in_array($adapter->getClass(), [ArrayAdapter::class, NullAdapter::class], true)) {\n                        $chainedPool->replaceArgument($i++, $tags[0]['namespace']);\n                    }\n\n                    if (isset($tags[0]['default_lifetime'])) {\n                        $chainedPool->replaceArgument($i++, $tags[0]['default_lifetime']);\n                    }\n\n                    $adapters[] = $chainedPool;\n                }\n\n                $pool->replaceArgument(0, $adapters);\n                unset($tags[0]['provider'], $tags[0]['namespace']);\n                $i = 1;\n            } else {\n                $i = 0;\n            }\n\n            foreach ($attributes as $attr) {\n                if (!isset($tags[0][$attr])) {\n                    // no-op\n                } elseif ('reset' === $attr) {\n                    if ($tags[0][$attr]) {\n                        $pool->addTag('kernel.reset', ['method' => $tags[0][$attr]]);\n                    }\n                } elseif ('early_expiration_message_bus' === $attr) {\n                    $needsMessageHandler = true;\n                    $pool->addMethodCall('setCallbackWrapper', [(new Definition(EarlyExpirationDispatcher::class))\n                        ->addArgument(new Reference($tags[0]['early_expiration_message_bus']))\n                        ->addArgument(new Reference('reverse_container'))\n                        ->addArgument((new Definition('callable'))\n                            ->setFactory([new Reference($id), 'setCallbackWrapper'])\n                            ->addArgument(null)\n                        ),\n                    ]);\n                    $pool->addTag('container.reversible');\n                } elseif ('namespace' !== $attr || !\\in_array($class, [ArrayAdapter::class, NullAdapter::class], true)) {\n                    $argument = $tags[0][$attr];\n\n                    if ('default_lifetime' === $attr && !is_numeric($argument)) {\n                        $argument = (new Definition('int', [$argument]))\n                            ->setFactory([ParameterNormalizer::class, 'normalizeDuration']);\n                    }\n\n                    $pool->replaceArgument($i++, $argument);\n                }\n                unset($tags[0][$attr]);\n            }\n            if (!empty($tags[0])) {\n                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]))));\n            }\n\n            if (null !== $clearer) {\n                $clearers[$clearer][$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE);\n            }\n\n            $allPools[$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE);\n        }\n\n        if (!$needsMessageHandler) {\n            $container->removeDefinition('cache.early_expiration_handler');\n        }\n\n        $notAliasedCacheClearerId = 'cache.global_clearer';\n        while ($container->hasAlias($notAliasedCacheClearerId)) {\n            $notAliasedCacheClearerId = (string) $container->getAlias($notAliasedCacheClearerId);\n        }\n        if ($container->hasDefinition($notAliasedCacheClearerId)) {\n            $clearers[$notAliasedCacheClearerId] = $allPools;\n        }\n\n        foreach ($clearers as $id => $pools) {\n            $clearer = $container->getDefinition($id);\n            if ($clearer instanceof ChildDefinition) {\n                $clearer->replaceArgument(0, $pools);\n            } else {\n                $clearer->setArgument(0, $pools);\n            }\n            $clearer->addTag('cache.pool.clearer');\n\n            if ('cache.system_clearer' === $id) {\n                $clearer->addTag('kernel.cache_clearer');\n            }\n        }\n\n        $allPoolsKeys = array_keys($allPools);\n\n        if ($container->hasDefinition('console.command.cache_pool_list')) {\n            $container->getDefinition('console.command.cache_pool_list')->replaceArgument(0, $allPoolsKeys);\n        }\n\n        if ($container->hasDefinition('console.command.cache_pool_clear')) {\n            $container->getDefinition('console.command.cache_pool_clear')->addArgument($allPoolsKeys);\n        }\n\n        if ($container->hasDefinition('console.command.cache_pool_delete')) {\n            $container->getDefinition('console.command.cache_pool_delete')->addArgument($allPoolsKeys);\n        }\n    }\n\n    private function getNamespace(string $seed, string $id): string\n    {\n        return substr(str_replace('/', '-', base64_encode(hash('sha256', $id.$seed, true))), 0, 10);\n    }\n\n    /**\n     * @internal\n     */\n    public static function getServiceProvider(ContainerBuilder $container, string $name): string\n    {\n        $container->resolveEnvPlaceholders($name, null, $usedEnvs);\n\n        if ($usedEnvs || preg_match('#^[a-z]++:#', $name)) {\n            $dsn = $name;\n\n            if (!$container->hasDefinition($name = '.cache_connection.'.ContainerBuilder::hash($dsn))) {\n                $definition = new Definition(AbstractAdapter::class);\n                $definition->setFactory([AbstractAdapter::class, 'createConnection']);\n                $definition->setArguments([$dsn, ['lazy' => true]]);\n                $container->setDefinition($name, $definition);\n            }\n        }\n\n        return $name;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\DependencyInjection;\n\nuse Symfony\\Component\\Cache\\PruneableInterface;\nuse Symfony\\Component\\DependencyInjection\\Argument\\IteratorArgument;\nuse Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface;\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\nuse Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\DependencyInjection\\Reference;\n\n/**\n * @author Rob Frawley 2nd <rmf@src.run>\n */\nclass CachePoolPrunerPass implements CompilerPassInterface\n{\n    /**\n     * @return void\n     */\n    public function process(ContainerBuilder $container)\n    {\n        if (!$container->hasDefinition('console.command.cache_pool_prune')) {\n            return;\n        }\n\n        $services = [];\n\n        foreach ($container->findTaggedServiceIds('cache.pool') as $id => $tags) {\n            $class = $container->getParameterBag()->resolveValue($container->getDefinition($id)->getClass());\n\n            if (!$reflection = $container->getReflectionClass($class)) {\n                throw new InvalidArgumentException(sprintf('Class \"%s\" used for service \"%s\" cannot be found.', $class, $id));\n            }\n\n            if ($reflection->implementsInterface(PruneableInterface::class)) {\n                $services[$id] = new Reference($id);\n            }\n        }\n\n        $container->getDefinition('console.command.cache_pool_prune')->replaceArgument(0, new IteratorArgument($services));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Exception/CacheException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Exception;\n\nuse Psr\\Cache\\CacheException as Psr6CacheInterface;\nuse Psr\\SimpleCache\\CacheException as SimpleCacheInterface;\n\nif (interface_exists(SimpleCacheInterface::class)) {\n    class CacheException extends \\Exception implements Psr6CacheInterface, SimpleCacheInterface\n    {\n    }\n} else {\n    class CacheException extends \\Exception implements Psr6CacheInterface\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Exception/InvalidArgumentException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Exception;\n\nuse Psr\\Cache\\InvalidArgumentException as Psr6CacheInterface;\nuse Psr\\SimpleCache\\InvalidArgumentException as SimpleCacheInterface;\n\nif (interface_exists(SimpleCacheInterface::class)) {\n    class InvalidArgumentException extends \\InvalidArgumentException implements Psr6CacheInterface, SimpleCacheInterface\n    {\n    }\n} else {\n    class InvalidArgumentException extends \\InvalidArgumentException implements Psr6CacheInterface\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Exception/LogicException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Exception;\n\nuse Psr\\Cache\\CacheException as Psr6CacheInterface;\nuse Psr\\SimpleCache\\CacheException as SimpleCacheInterface;\n\nif (interface_exists(SimpleCacheInterface::class)) {\n    class LogicException extends \\LogicException implements Psr6CacheInterface, SimpleCacheInterface\n    {\n    }\n} else {\n    class LogicException extends \\LogicException implements Psr6CacheInterface\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/LICENSE",
    "content": "Copyright (c) 2016-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/LockRegistry.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache;\n\nuse Psr\\Log\\LoggerInterface;\nuse Symfony\\Contracts\\Cache\\CacheInterface;\nuse Symfony\\Contracts\\Cache\\ItemInterface;\n\n/**\n * LockRegistry is used internally by existing adapters to protect against cache stampede.\n *\n * It does so by wrapping the computation of items in a pool of locks.\n * Foreach each apps, there can be at most 20 concurrent processes that\n * compute items at the same time and only one per cache-key.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nfinal class LockRegistry\n{\n    private static array $openedFiles = [];\n    private static ?array $lockedFiles = null;\n    private static \\Exception $signalingException;\n    private static \\Closure $signalingCallback;\n\n    /**\n     * The number of items in this list controls the max number of concurrent processes.\n     */\n    private static array $files = [\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'AbstractAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'AbstractTagAwareAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'AdapterInterface.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'ApcuAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'ArrayAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'ChainAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'CouchbaseBucketAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'CouchbaseCollectionAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'DoctrineDbalAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'FilesystemAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'FilesystemTagAwareAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'MemcachedAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'NullAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'ParameterNormalizer.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'PdoAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'PhpArrayAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'PhpFilesAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'ProxyAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'Psr16Adapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'RedisAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'RedisTagAwareAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'TagAwareAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'TagAwareAdapterInterface.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'TraceableAdapter.php',\n        __DIR__.\\DIRECTORY_SEPARATOR.'Adapter'.\\DIRECTORY_SEPARATOR.'TraceableTagAwareAdapter.php',\n    ];\n\n    /**\n     * Defines a set of existing files that will be used as keys to acquire locks.\n     *\n     * @return array The previously defined set of files\n     */\n    public static function setFiles(array $files): array\n    {\n        $previousFiles = self::$files;\n        self::$files = $files;\n\n        foreach (self::$openedFiles as $file) {\n            if ($file) {\n                flock($file, \\LOCK_UN);\n                fclose($file);\n            }\n        }\n        self::$openedFiles = self::$lockedFiles = [];\n\n        return $previousFiles;\n    }\n\n    public static function compute(callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, ?\\Closure $setMetadata = null, ?LoggerInterface $logger = null): mixed\n    {\n        if ('\\\\' === \\DIRECTORY_SEPARATOR && null === self::$lockedFiles) {\n            // disable locking on Windows by default\n            self::$files = self::$lockedFiles = [];\n        }\n\n        $key = self::$files ? abs(crc32($item->getKey())) % \\count(self::$files) : -1;\n\n        if ($key < 0 || self::$lockedFiles || !$lock = self::open($key)) {\n            return $callback($item, $save);\n        }\n\n        self::$signalingException ??= unserialize(\"O:9:\\\"Exception\\\":1:{s:16:\\\"\\0Exception\\0trace\\\";a:0:{}}\");\n        self::$signalingCallback ??= fn () => throw self::$signalingException;\n\n        while (true) {\n            try {\n                // race to get the lock in non-blocking mode\n                $locked = flock($lock, \\LOCK_EX | \\LOCK_NB, $wouldBlock);\n\n                if ($locked || !$wouldBlock) {\n                    $logger?->info(sprintf('Lock %s, now computing item \"{key}\"', $locked ? 'acquired' : 'not supported'), ['key' => $item->getKey()]);\n                    self::$lockedFiles[$key] = true;\n\n                    $value = $callback($item, $save);\n\n                    if ($save) {\n                        if ($setMetadata) {\n                            $setMetadata($item);\n                        }\n\n                        $pool->save($item->set($value));\n                        $save = false;\n                    }\n\n                    return $value;\n                }\n                // if we failed the race, retry locking in blocking mode to wait for the winner\n                $logger?->info('Item \"{key}\" is locked, waiting for it to be released', ['key' => $item->getKey()]);\n                flock($lock, \\LOCK_SH);\n            } finally {\n                flock($lock, \\LOCK_UN);\n                unset(self::$lockedFiles[$key]);\n            }\n\n            try {\n                $value = $pool->get($item->getKey(), self::$signalingCallback, 0);\n                $logger?->info('Item \"{key}\" retrieved after lock was released', ['key' => $item->getKey()]);\n                $save = false;\n\n                return $value;\n            } catch (\\Exception $e) {\n                if (self::$signalingException !== $e) {\n                    throw $e;\n                }\n                $logger?->info('Item \"{key}\" not found while lock was released, now retrying', ['key' => $item->getKey()]);\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * @return resource|false\n     */\n    private static function open(int $key)\n    {\n        if (null !== $h = self::$openedFiles[$key] ?? null) {\n            return $h;\n        }\n        set_error_handler(static fn () => null);\n        try {\n            $h = fopen(self::$files[$key], 'r+');\n        } finally {\n            restore_error_handler();\n        }\n\n        return self::$openedFiles[$key] = $h ?: @fopen(self::$files[$key], 'r');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Marshaller/DefaultMarshaller.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Marshaller;\n\nuse Symfony\\Component\\Cache\\Exception\\CacheException;\n\n/**\n * Serializes/unserializes values using igbinary_serialize() if available, serialize() otherwise.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass DefaultMarshaller implements MarshallerInterface\n{\n    private bool $useIgbinarySerialize = true;\n    private bool $throwOnSerializationFailure = false;\n\n    public function __construct(?bool $useIgbinarySerialize = null, bool $throwOnSerializationFailure = false)\n    {\n        if (null === $useIgbinarySerialize) {\n            $useIgbinarySerialize = \\extension_loaded('igbinary') && version_compare('3.1.6', phpversion('igbinary'), '<=');\n        } elseif ($useIgbinarySerialize && (!\\extension_loaded('igbinary') || version_compare('3.1.6', phpversion('igbinary'), '>'))) {\n            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.');\n        }\n        $this->useIgbinarySerialize = $useIgbinarySerialize;\n        $this->throwOnSerializationFailure = $throwOnSerializationFailure;\n    }\n\n    public function marshall(array $values, ?array &$failed): array\n    {\n        $serialized = $failed = [];\n\n        foreach ($values as $id => $value) {\n            try {\n                if ($this->useIgbinarySerialize) {\n                    $serialized[$id] = igbinary_serialize($value);\n                } else {\n                    $serialized[$id] = serialize($value);\n                }\n            } catch (\\Exception $e) {\n                if ($this->throwOnSerializationFailure) {\n                    throw new \\ValueError($e->getMessage(), 0, $e);\n                }\n                $failed[] = $id;\n            }\n        }\n\n        return $serialized;\n    }\n\n    public function unmarshall(string $value): mixed\n    {\n        if ('b:0;' === $value) {\n            return false;\n        }\n        if ('N;' === $value) {\n            return null;\n        }\n        static $igbinaryNull;\n        if ($value === $igbinaryNull ??= \\extension_loaded('igbinary') ? igbinary_serialize(null) : false) {\n            return null;\n        }\n        $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback');\n        try {\n            if (':' === ($value[1] ?? ':')) {\n                if (false !== $value = unserialize($value)) {\n                    return $value;\n                }\n            } elseif (false === $igbinaryNull) {\n                throw new \\RuntimeException('Failed to unserialize values, did you forget to install the \"igbinary\" extension?');\n            } elseif (null !== $value = igbinary_unserialize($value)) {\n                return $value;\n            }\n\n            throw new \\DomainException(error_get_last() ? error_get_last()['message'] : 'Failed to unserialize values.');\n        } catch (\\Error $e) {\n            throw new \\ErrorException($e->getMessage(), $e->getCode(), \\E_ERROR, $e->getFile(), $e->getLine());\n        } finally {\n            ini_set('unserialize_callback_func', $unserializeCallbackHandler);\n        }\n    }\n\n    /**\n     * @internal\n     */\n    public static function handleUnserializeCallback(string $class): never\n    {\n        throw new \\DomainException('Class not found: '.$class);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Marshaller/DeflateMarshaller.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Marshaller;\n\nuse Symfony\\Component\\Cache\\Exception\\CacheException;\n\n/**\n * Compresses values using gzdeflate().\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass DeflateMarshaller implements MarshallerInterface\n{\n    private MarshallerInterface $marshaller;\n\n    public function __construct(MarshallerInterface $marshaller)\n    {\n        if (!\\function_exists('gzdeflate')) {\n            throw new CacheException('The \"zlib\" PHP extension is not loaded.');\n        }\n\n        $this->marshaller = $marshaller;\n    }\n\n    public function marshall(array $values, ?array &$failed): array\n    {\n        return array_map('gzdeflate', $this->marshaller->marshall($values, $failed));\n    }\n\n    public function unmarshall(string $value): mixed\n    {\n        if (false !== $inflatedValue = @gzinflate($value)) {\n            $value = $inflatedValue;\n        }\n\n        return $this->marshaller->unmarshall($value);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Marshaller/MarshallerInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Marshaller;\n\n/**\n * Serializes/unserializes PHP values.\n *\n * Implementations of this interface MUST deal with errors carefully. They MUST\n * also deal with forward and backward compatibility at the storage format level.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\ninterface MarshallerInterface\n{\n    /**\n     * Serializes a list of values.\n     *\n     * When serialization fails for a specific value, no exception should be\n     * thrown. Instead, its key should be listed in $failed.\n     */\n    public function marshall(array $values, ?array &$failed): array;\n\n    /**\n     * Unserializes a single value and throws an exception if anything goes wrong.\n     *\n     * @throws \\Exception Whenever unserialization fails\n     */\n    public function unmarshall(string $value): mixed;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Marshaller/SodiumMarshaller.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Marshaller;\n\nuse Symfony\\Component\\Cache\\Exception\\CacheException;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\n\n/**\n * Encrypt/decrypt values using Libsodium.\n *\n * @author Ahmed TAILOULOUTE <ahmed.tailouloute@gmail.com>\n */\nclass SodiumMarshaller implements MarshallerInterface\n{\n    private MarshallerInterface $marshaller;\n    private array $decryptionKeys;\n\n    /**\n     * @param string[] $decryptionKeys The key at index \"0\" is required and is used to decrypt and encrypt values;\n     *                                 more rotating keys can be provided to decrypt values;\n     *                                 each key must be generated using sodium_crypto_box_keypair()\n     */\n    public function __construct(array $decryptionKeys, ?MarshallerInterface $marshaller = null)\n    {\n        if (!self::isSupported()) {\n            throw new CacheException('The \"sodium\" PHP extension is not loaded.');\n        }\n\n        if (!isset($decryptionKeys[0])) {\n            throw new InvalidArgumentException('At least one decryption key must be provided at index \"0\".');\n        }\n\n        $this->marshaller = $marshaller ?? new DefaultMarshaller();\n        $this->decryptionKeys = $decryptionKeys;\n    }\n\n    public static function isSupported(): bool\n    {\n        return \\function_exists('sodium_crypto_box_seal');\n    }\n\n    public function marshall(array $values, ?array &$failed): array\n    {\n        $encryptionKey = sodium_crypto_box_publickey($this->decryptionKeys[0]);\n\n        $encryptedValues = [];\n        foreach ($this->marshaller->marshall($values, $failed) as $k => $v) {\n            $encryptedValues[$k] = sodium_crypto_box_seal($v, $encryptionKey);\n        }\n\n        return $encryptedValues;\n    }\n\n    public function unmarshall(string $value): mixed\n    {\n        foreach ($this->decryptionKeys as $k) {\n            if (false !== $decryptedValue = @sodium_crypto_box_seal_open($value, $k)) {\n                $value = $decryptedValue;\n                break;\n            }\n        }\n\n        return $this->marshaller->unmarshall($value);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Marshaller;\n\n/**\n * A marshaller optimized for data structures generated by AbstractTagAwareAdapter.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass TagAwareMarshaller implements MarshallerInterface\n{\n    private MarshallerInterface $marshaller;\n\n    public function __construct(?MarshallerInterface $marshaller = null)\n    {\n        $this->marshaller = $marshaller ?? new DefaultMarshaller();\n    }\n\n    public function marshall(array $values, ?array &$failed): array\n    {\n        $failed = $notSerialized = $serialized = [];\n\n        foreach ($values as $id => $value) {\n            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']))) {\n                // if the value is an array with keys \"tags\", \"value\" and \"meta\", use a compact serialization format\n                // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F allow detecting this format quickly in unmarshall()\n\n                $v = $this->marshaller->marshall($value, $f);\n\n                if ($f) {\n                    $f = [];\n                    $failed[] = $id;\n                } else {\n                    if ([] === $value['tags']) {\n                        $v['tags'] = '';\n                    }\n\n                    $serialized[$id] = \"\\x9D\".($value['meta'] ?? \"\\0\\0\\0\\0\\0\\0\\0\\0\").pack('N', \\strlen($v['tags'])).$v['tags'].$v['value'];\n                    $serialized[$id][9] = \"\\x5F\";\n                }\n            } else {\n                // other arbitrary values are serialized using the decorated marshaller below\n                $notSerialized[$id] = $value;\n            }\n        }\n\n        if ($notSerialized) {\n            $serialized += $this->marshaller->marshall($notSerialized, $f);\n            $failed = array_merge($failed, $f);\n        }\n\n        return $serialized;\n    }\n\n    public function unmarshall(string $value): mixed\n    {\n        // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F\n        if (13 >= \\strlen($value) || \"\\x9D\" !== $value[0] || \"\\0\" !== $value[5] || \"\\x5F\" !== $value[9]) {\n            return $this->marshaller->unmarshall($value);\n        }\n\n        // data consists of value, tags and metadata which we need to unpack\n        $meta = substr($value, 1, 12);\n        $meta[8] = \"\\0\";\n        $tagLen = unpack('Nlen', $meta, 8)['len'];\n        $meta = substr($meta, 0, 8);\n\n        return [\n            'value' => $this->marshaller->unmarshall(substr($value, 13 + $tagLen)),\n            'tags' => $tagLen ? $this->marshaller->unmarshall(substr($value, 13, $tagLen)) : [],\n            'meta' => \"\\0\\0\\0\\0\\0\\0\\0\\0\" === $meta ? null : $meta,\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Messenger;\n\nuse Psr\\Log\\LoggerInterface;\nuse Symfony\\Component\\Cache\\Adapter\\AdapterInterface;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\DependencyInjection\\ReverseContainer;\nuse Symfony\\Component\\Messenger\\MessageBusInterface;\nuse Symfony\\Component\\Messenger\\Stamp\\HandledStamp;\n\n/**\n * Sends the computation of cached values to a message bus.\n */\nclass EarlyExpirationDispatcher\n{\n    private MessageBusInterface $bus;\n    private ReverseContainer $reverseContainer;\n    private ?\\Closure $callbackWrapper;\n\n    public function __construct(MessageBusInterface $bus, ReverseContainer $reverseContainer, ?callable $callbackWrapper = null)\n    {\n        $this->bus = $bus;\n        $this->reverseContainer = $reverseContainer;\n        $this->callbackWrapper = null === $callbackWrapper ? null : $callbackWrapper(...);\n    }\n\n    /**\n     * @return mixed\n     */\n    public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \\Closure $setMetadata, ?LoggerInterface $logger = null)\n    {\n        if (!$item->isHit() || null === $message = EarlyExpirationMessage::create($this->reverseContainer, $callback, $item, $pool)) {\n            // The item is stale or the callback cannot be reversed: we must compute the value now\n            $logger?->info('Computing item \"{key}\" online: '.($item->isHit() ? 'callback cannot be reversed' : 'item is stale'), ['key' => $item->getKey()]);\n\n            return null !== $this->callbackWrapper ? ($this->callbackWrapper)($callback, $item, $save, $pool, $setMetadata, $logger) : $callback($item, $save);\n        }\n\n        $envelope = $this->bus->dispatch($message);\n\n        if ($logger) {\n            if ($envelope->last(HandledStamp::class)) {\n                $logger->info('Item \"{key}\" was computed online', ['key' => $item->getKey()]);\n            } else {\n                $logger->info('Item \"{key}\" sent for recomputation', ['key' => $item->getKey()]);\n            }\n        }\n\n        // The item's value is not stale, no need to write it to the backend\n        $save = false;\n\n        return $message->getItem()->get() ?? $item->get();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Messenger;\n\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\DependencyInjection\\ReverseContainer;\nuse Symfony\\Component\\Messenger\\Attribute\\AsMessageHandler;\n\n/**\n * Computes cached values sent to a message bus.\n */\n#[AsMessageHandler]\nclass EarlyExpirationHandler\n{\n    private ReverseContainer $reverseContainer;\n    private array $processedNonces = [];\n\n    public function __construct(ReverseContainer $reverseContainer)\n    {\n        $this->reverseContainer = $reverseContainer;\n    }\n\n    /**\n     * @return void\n     */\n    public function __invoke(EarlyExpirationMessage $message)\n    {\n        $item = $message->getItem();\n        $metadata = $item->getMetadata();\n        $expiry = $metadata[CacheItem::METADATA_EXPIRY] ?? 0;\n        $ctime = $metadata[CacheItem::METADATA_CTIME] ?? 0;\n\n        if ($expiry && $ctime) {\n            // skip duplicate or expired messages\n\n            $processingNonce = [$expiry, $ctime];\n            $pool = $message->getPool();\n            $key = $item->getKey();\n\n            if (($this->processedNonces[$pool][$key] ?? null) === $processingNonce) {\n                return;\n            }\n\n            if (microtime(true) >= $expiry) {\n                return;\n            }\n\n            $this->processedNonces[$pool] = [$key => $processingNonce] + ($this->processedNonces[$pool] ?? []);\n\n            if (\\count($this->processedNonces[$pool]) > 100) {\n                array_pop($this->processedNonces[$pool]);\n            }\n        }\n\n        static $setMetadata;\n\n        $setMetadata ??= \\Closure::bind(\n            function (CacheItem $item, float $startTime) {\n                if ($item->expiry > $endTime = microtime(true)) {\n                    $item->newMetadata[CacheItem::METADATA_EXPIRY] = $item->expiry;\n                    $item->newMetadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime));\n                }\n            },\n            null,\n            CacheItem::class\n        );\n\n        $startTime = microtime(true);\n        $pool = $message->findPool($this->reverseContainer);\n        $callback = $message->findCallback($this->reverseContainer);\n        $save = true;\n        $value = $callback($item, $save);\n        $setMetadata($item, $startTime);\n        $pool->save($item->set($value));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Messenger;\n\nuse Symfony\\Component\\Cache\\Adapter\\AdapterInterface;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\DependencyInjection\\ReverseContainer;\n\n/**\n * Conveys a cached value that needs to be computed.\n */\nfinal class EarlyExpirationMessage\n{\n    private CacheItem $item;\n    private string $pool;\n    private string|array $callback;\n\n    public static function create(ReverseContainer $reverseContainer, callable $callback, CacheItem $item, AdapterInterface $pool): ?self\n    {\n        try {\n            $item = clone $item;\n            $item->set(null);\n        } catch (\\Exception) {\n            return null;\n        }\n\n        $pool = $reverseContainer->getId($pool);\n\n        if (\\is_object($callback)) {\n            if (null === $id = $reverseContainer->getId($callback)) {\n                return null;\n            }\n\n            $callback = '@'.$id;\n        } elseif (!\\is_array($callback)) {\n            $callback = (string) $callback;\n        } elseif (!\\is_object($callback[0])) {\n            $callback = [(string) $callback[0], (string) $callback[1]];\n        } else {\n            if (null === $id = $reverseContainer->getId($callback[0])) {\n                return null;\n            }\n\n            $callback = ['@'.$id, (string) $callback[1]];\n        }\n\n        return new self($item, $pool, $callback);\n    }\n\n    public function getItem(): CacheItem\n    {\n        return $this->item;\n    }\n\n    public function getPool(): string\n    {\n        return $this->pool;\n    }\n\n    /**\n     * @return string|string[]\n     */\n    public function getCallback(): string|array\n    {\n        return $this->callback;\n    }\n\n    public function findPool(ReverseContainer $reverseContainer): AdapterInterface\n    {\n        return $reverseContainer->getService($this->pool);\n    }\n\n    public function findCallback(ReverseContainer $reverseContainer): callable\n    {\n        if (\\is_string($callback = $this->callback)) {\n            return '@' === $callback[0] ? $reverseContainer->getService(substr($callback, 1)) : $callback;\n        }\n        if ('@' === $callback[0][0]) {\n            $callback[0] = $reverseContainer->getService(substr($callback[0], 1));\n        }\n\n        return $callback;\n    }\n\n    private function __construct(CacheItem $item, string $pool, string|array $callback)\n    {\n        $this->item = $item;\n        $this->pool = $pool;\n        $this->callback = $callback;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/PruneableInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache;\n\n/**\n * Interface extends psr-6 and psr-16 caches to allow for pruning (deletion) of all expired cache items.\n */\ninterface PruneableInterface\n{\n    public function prune(): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Psr16Cache.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache;\n\nuse Psr\\Cache\\CacheException as Psr6CacheException;\nuse Psr\\Cache\\CacheItemPoolInterface;\nuse Psr\\SimpleCache\\CacheException as SimpleCacheException;\nuse Psr\\SimpleCache\\CacheInterface;\nuse Symfony\\Component\\Cache\\Adapter\\AdapterInterface;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\Traits\\ProxyTrait;\n\n/**\n * Turns a PSR-6 cache into a PSR-16 one.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterface\n{\n    use ProxyTrait;\n\n    private ?\\Closure $createCacheItem = null;\n    private ?CacheItem $cacheItemPrototype = null;\n    private static \\Closure $packCacheItem;\n\n    public function __construct(CacheItemPoolInterface $pool)\n    {\n        $this->pool = $pool;\n\n        if (!$pool instanceof AdapterInterface) {\n            return;\n        }\n        $cacheItemPrototype = &$this->cacheItemPrototype;\n        $createCacheItem = \\Closure::bind(\n            static function ($key, $value, $allowInt = false) use (&$cacheItemPrototype) {\n                $item = clone $cacheItemPrototype;\n                $item->poolHash = $item->innerItem = null;\n                if ($allowInt && \\is_int($key)) {\n                    $item->key = (string) $key;\n                } else {\n                    \\assert('' !== CacheItem::validateKey($key));\n                    $item->key = $key;\n                }\n                $item->value = $value;\n                $item->isHit = false;\n\n                return $item;\n            },\n            null,\n            CacheItem::class\n        );\n        $this->createCacheItem = function ($key, $value, $allowInt = false) use ($createCacheItem) {\n            if (null === $this->cacheItemPrototype) {\n                $this->get($allowInt && \\is_int($key) ? (string) $key : $key);\n            }\n            $this->createCacheItem = $createCacheItem;\n\n            return $createCacheItem($key, null, $allowInt)->set($value);\n        };\n        self::$packCacheItem ??= \\Closure::bind(\n            static function (CacheItem $item) {\n                $item->newMetadata = $item->metadata;\n\n                return $item->pack();\n            },\n            null,\n            CacheItem::class\n        );\n    }\n\n    public function get($key, $default = null): mixed\n    {\n        try {\n            $item = $this->pool->getItem($key);\n        } catch (SimpleCacheException $e) {\n            throw $e;\n        } catch (Psr6CacheException $e) {\n            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);\n        }\n        if (null === $this->cacheItemPrototype) {\n            $this->cacheItemPrototype = clone $item;\n            $this->cacheItemPrototype->set(null);\n        }\n\n        return $item->isHit() ? $item->get() : $default;\n    }\n\n    public function set($key, $value, $ttl = null): bool\n    {\n        try {\n            if (null !== $f = $this->createCacheItem) {\n                $item = $f($key, $value);\n            } else {\n                $item = $this->pool->getItem($key)->set($value);\n            }\n        } catch (SimpleCacheException $e) {\n            throw $e;\n        } catch (Psr6CacheException $e) {\n            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);\n        }\n        if (null !== $ttl) {\n            $item->expiresAfter($ttl);\n        }\n\n        return $this->pool->save($item);\n    }\n\n    public function delete($key): bool\n    {\n        try {\n            return $this->pool->deleteItem($key);\n        } catch (SimpleCacheException $e) {\n            throw $e;\n        } catch (Psr6CacheException $e) {\n            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);\n        }\n    }\n\n    public function clear(): bool\n    {\n        return $this->pool->clear();\n    }\n\n    public function getMultiple($keys, $default = null): iterable\n    {\n        if ($keys instanceof \\Traversable) {\n            $keys = iterator_to_array($keys, false);\n        } elseif (!\\is_array($keys)) {\n            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, \"%s\" given.', get_debug_type($keys)));\n        }\n\n        try {\n            $items = $this->pool->getItems($keys);\n        } catch (SimpleCacheException $e) {\n            throw $e;\n        } catch (Psr6CacheException $e) {\n            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);\n        }\n        $values = [];\n\n        if (!$this->pool instanceof AdapterInterface) {\n            foreach ($items as $key => $item) {\n                $values[$key] = $item->isHit() ? $item->get() : $default;\n            }\n\n            return $values;\n        }\n\n        foreach ($items as $key => $item) {\n            $values[$key] = $item->isHit() ? (self::$packCacheItem)($item) : $default;\n        }\n\n        return $values;\n    }\n\n    public function setMultiple($values, $ttl = null): bool\n    {\n        $valuesIsArray = \\is_array($values);\n        if (!$valuesIsArray && !$values instanceof \\Traversable) {\n            throw new InvalidArgumentException(sprintf('Cache values must be array or Traversable, \"%s\" given.', get_debug_type($values)));\n        }\n        $items = [];\n\n        try {\n            if (null !== $f = $this->createCacheItem) {\n                $valuesIsArray = false;\n                foreach ($values as $key => $value) {\n                    $items[$key] = $f($key, $value, true);\n                }\n            } elseif ($valuesIsArray) {\n                $items = [];\n                foreach ($values as $key => $value) {\n                    $items[] = (string) $key;\n                }\n                $items = $this->pool->getItems($items);\n            } else {\n                foreach ($values as $key => $value) {\n                    if (\\is_int($key)) {\n                        $key = (string) $key;\n                    }\n                    $items[$key] = $this->pool->getItem($key)->set($value);\n                }\n            }\n        } catch (SimpleCacheException $e) {\n            throw $e;\n        } catch (Psr6CacheException $e) {\n            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);\n        }\n        $ok = true;\n\n        foreach ($items as $key => $item) {\n            if ($valuesIsArray) {\n                $item->set($values[$key]);\n            }\n            if (null !== $ttl) {\n                $item->expiresAfter($ttl);\n            }\n            $ok = $this->pool->saveDeferred($item) && $ok;\n        }\n\n        return $this->pool->commit() && $ok;\n    }\n\n    public function deleteMultiple($keys): bool\n    {\n        if ($keys instanceof \\Traversable) {\n            $keys = iterator_to_array($keys, false);\n        } elseif (!\\is_array($keys)) {\n            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, \"%s\" given.', get_debug_type($keys)));\n        }\n\n        try {\n            return $this->pool->deleteItems($keys);\n        } catch (SimpleCacheException $e) {\n            throw $e;\n        } catch (Psr6CacheException $e) {\n            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);\n        }\n    }\n\n    public function has($key): bool\n    {\n        try {\n            return $this->pool->hasItem($key);\n        } catch (SimpleCacheException $e) {\n            throw $e;\n        } catch (Psr6CacheException $e) {\n            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/README.md",
    "content": "Symfony PSR-6 implementation for caching\n========================================\n\nThe Cache component provides extended\n[PSR-6](https://www.php-fig.org/psr/psr-6/) implementations for adding cache to\nyour applications. It is designed to have a low overhead so that caching is\nfastest. It ships with adapters for the most widespread caching backends.\nIt also provides a [PSR-16](https://www.php-fig.org/psr/psr-16/) adapter,\nand implementations for [symfony/cache-contracts](https://github.com/symfony/cache-contracts)'\n`CacheInterface` and `TagAwareCacheInterface`.\n\nResources\n---------\n\n * [Documentation](https://symfony.com/doc/current/components/cache.html)\n * [Contributing](https://symfony.com/doc/current/contributing/index.html)\n * [Report issues](https://github.com/symfony/symfony/issues) and\n   [send Pull Requests](https://github.com/symfony/symfony/pulls)\n   in the [main Symfony repository](https://github.com/symfony/symfony)\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/ResettableInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache;\n\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n/**\n * Resets a pool's local state.\n */\ninterface ResettableInterface extends ResetInterface\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/AbstractAdapterTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nuse Psr\\Cache\\CacheItemInterface;\nuse Psr\\Log\\LoggerAwareTrait;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\ntrait AbstractAdapterTrait\n{\n    use LoggerAwareTrait;\n\n    /**\n     * needs to be set by class, signature is function(string <key>, mixed <value>, bool <isHit>).\n     */\n    private static \\Closure $createCacheItem;\n\n    /**\n     * needs to be set by class, signature is function(array <deferred>, string <namespace>, array <&expiredIds>).\n     */\n    private static \\Closure $mergeByLifetime;\n\n    private string $namespace = '';\n    private int $defaultLifetime;\n    private string $namespaceVersion = '';\n    private bool $versioningIsEnabled = false;\n    private array $deferred = [];\n    private array $ids = [];\n\n    /**\n     * @var int|null The maximum length to enforce for identifiers or null when no limit applies\n     */\n    protected $maxIdLength;\n\n    /**\n     * Fetches several cache items.\n     *\n     * @param array $ids The cache identifiers to fetch\n     */\n    abstract protected function doFetch(array $ids): iterable;\n\n    /**\n     * Confirms if the cache contains specified cache item.\n     *\n     * @param string $id The identifier for which to check existence\n     */\n    abstract protected function doHave(string $id): bool;\n\n    /**\n     * Deletes all items in the pool.\n     *\n     * @param string $namespace The prefix used for all identifiers managed by this pool\n     */\n    abstract protected function doClear(string $namespace): bool;\n\n    /**\n     * Removes multiple items from the pool.\n     *\n     * @param array $ids An array of identifiers that should be removed from the pool\n     */\n    abstract protected function doDelete(array $ids): bool;\n\n    /**\n     * Persists several cache items immediately.\n     *\n     * @param array $values   The values to cache, indexed by their cache identifier\n     * @param int   $lifetime The lifetime of the cached values, 0 for persisting until manual cleaning\n     *\n     * @return array|bool The identifiers that failed to be cached or a boolean stating if caching succeeded or not\n     */\n    abstract protected function doSave(array $values, int $lifetime): array|bool;\n\n    public function hasItem(mixed $key): bool\n    {\n        $id = $this->getId($key);\n\n        if (isset($this->deferred[$key])) {\n            $this->commit();\n        }\n\n        try {\n            return $this->doHave($id);\n        } catch (\\Exception $e) {\n            CacheItem::log($this->logger, 'Failed to check if key \"{key}\" is cached: '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n\n            return false;\n        }\n    }\n\n    public function clear(string $prefix = ''): bool\n    {\n        $this->deferred = [];\n        if ($cleared = $this->versioningIsEnabled) {\n            if ('' === $namespaceVersionToClear = $this->namespaceVersion) {\n                foreach ($this->doFetch([static::NS_SEPARATOR.$this->namespace]) as $v) {\n                    $namespaceVersionToClear = $v;\n                }\n            }\n            $namespaceToClear = $this->namespace.$namespaceVersionToClear;\n            $namespaceVersion = self::formatNamespaceVersion(mt_rand());\n            try {\n                $e = $this->doSave([static::NS_SEPARATOR.$this->namespace => $namespaceVersion], 0);\n            } catch (\\Exception $e) {\n            }\n            if (true !== $e && [] !== $e) {\n                $cleared = false;\n                $message = 'Failed to save the new namespace'.($e instanceof \\Exception ? ': '.$e->getMessage() : '.');\n                CacheItem::log($this->logger, $message, ['exception' => $e instanceof \\Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);\n            } else {\n                $this->namespaceVersion = $namespaceVersion;\n                $this->ids = [];\n            }\n        } else {\n            $namespaceToClear = $this->namespace.$prefix;\n        }\n\n        try {\n            return $this->doClear($namespaceToClear) || $cleared;\n        } catch (\\Exception $e) {\n            CacheItem::log($this->logger, 'Failed to clear the cache: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n\n            return false;\n        }\n    }\n\n    public function deleteItem(mixed $key): bool\n    {\n        return $this->deleteItems([$key]);\n    }\n\n    public function deleteItems(array $keys): bool\n    {\n        $ids = [];\n\n        foreach ($keys as $key) {\n            $ids[$key] = $this->getId($key);\n            unset($this->deferred[$key]);\n        }\n\n        try {\n            if ($this->doDelete($ids)) {\n                return true;\n            }\n        } catch (\\Exception) {\n        }\n\n        $ok = true;\n\n        // When bulk-delete failed, retry each item individually\n        foreach ($ids as $key => $id) {\n            try {\n                $e = null;\n                if ($this->doDelete([$id])) {\n                    continue;\n                }\n            } catch (\\Exception $e) {\n            }\n            $message = 'Failed to delete key \"{key}\"'.($e instanceof \\Exception ? ': '.$e->getMessage() : '.');\n            CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n            $ok = false;\n        }\n\n        return $ok;\n    }\n\n    public function getItem(mixed $key): CacheItem\n    {\n        $id = $this->getId($key);\n\n        if (isset($this->deferred[$key])) {\n            $this->commit();\n        }\n\n        $isHit = false;\n        $value = null;\n\n        try {\n            foreach ($this->doFetch([$id]) as $value) {\n                $isHit = true;\n            }\n\n            return (self::$createCacheItem)($key, $value, $isHit);\n        } catch (\\Exception $e) {\n            CacheItem::log($this->logger, 'Failed to fetch key \"{key}\": '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n        }\n\n        return (self::$createCacheItem)($key, null, false);\n    }\n\n    public function getItems(array $keys = []): iterable\n    {\n        $ids = [];\n        $commit = false;\n\n        foreach ($keys as $key) {\n            $ids[] = $this->getId($key);\n            $commit = $commit || isset($this->deferred[$key]);\n        }\n\n        if ($commit) {\n            $this->commit();\n        }\n\n        try {\n            $items = $this->doFetch($ids);\n        } catch (\\Exception $e) {\n            CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => $keys, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n            $items = [];\n        }\n        $ids = array_combine($ids, $keys);\n\n        return $this->generateItems($items, $ids);\n    }\n\n    public function save(CacheItemInterface $item): bool\n    {\n        if (!$item instanceof CacheItem) {\n            return false;\n        }\n        $this->deferred[$item->getKey()] = $item;\n\n        return $this->commit();\n    }\n\n    public function saveDeferred(CacheItemInterface $item): bool\n    {\n        if (!$item instanceof CacheItem) {\n            return false;\n        }\n        $this->deferred[$item->getKey()] = $item;\n\n        return true;\n    }\n\n    /**\n     * Enables/disables versioning of items.\n     *\n     * When versioning is enabled, clearing the cache is atomic and doesn't require listing existing keys to proceed,\n     * but old keys may need garbage collection and extra round-trips to the back-end are required.\n     *\n     * Calling this method also clears the memoized namespace version and thus forces a resynchronization of it.\n     *\n     * @return bool the previous state of versioning\n     */\n    public function enableVersioning(bool $enable = true): bool\n    {\n        $wasEnabled = $this->versioningIsEnabled;\n        $this->versioningIsEnabled = $enable;\n        $this->namespaceVersion = '';\n        $this->ids = [];\n\n        return $wasEnabled;\n    }\n\n    public function reset(): void\n    {\n        if ($this->deferred) {\n            $this->commit();\n        }\n        $this->namespaceVersion = '';\n        $this->ids = [];\n    }\n\n    public function __sleep(): array\n    {\n        throw new \\BadMethodCallException('Cannot serialize '.__CLASS__);\n    }\n\n    /**\n     * @return void\n     */\n    public function __wakeup()\n    {\n        throw new \\BadMethodCallException('Cannot unserialize '.__CLASS__);\n    }\n\n    public function __destruct()\n    {\n        if ($this->deferred) {\n            $this->commit();\n        }\n    }\n\n    private function generateItems(iterable $items, array &$keys): \\Generator\n    {\n        $f = self::$createCacheItem;\n\n        try {\n            foreach ($items as $id => $value) {\n                if (!isset($keys[$id])) {\n                    throw new InvalidArgumentException(sprintf('Could not match value id \"%s\" to keys \"%s\".', $id, implode('\", \"', $keys)));\n                }\n                $key = $keys[$id];\n                unset($keys[$id]);\n                yield $key => $f($key, $value, true);\n            }\n        } catch (\\Exception $e) {\n            CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => array_values($keys), 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);\n        }\n\n        foreach ($keys as $key) {\n            yield $key => $f($key, null, false);\n        }\n    }\n\n    /**\n     * @internal\n     */\n    protected function getId(mixed $key): string\n    {\n        if ($this->versioningIsEnabled && '' === $this->namespaceVersion) {\n            $this->ids = [];\n            $this->namespaceVersion = '1'.static::NS_SEPARATOR;\n            try {\n                foreach ($this->doFetch([static::NS_SEPARATOR.$this->namespace]) as $v) {\n                    $this->namespaceVersion = $v;\n                }\n                $e = true;\n                if ('1'.static::NS_SEPARATOR === $this->namespaceVersion) {\n                    $this->namespaceVersion = self::formatNamespaceVersion(time());\n                    $e = $this->doSave([static::NS_SEPARATOR.$this->namespace => $this->namespaceVersion], 0);\n                }\n            } catch (\\Exception $e) {\n            }\n            if (true !== $e && [] !== $e) {\n                $message = 'Failed to save the new namespace'.($e instanceof \\Exception ? ': '.$e->getMessage() : '.');\n                CacheItem::log($this->logger, $message, ['exception' => $e instanceof \\Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);\n            }\n        }\n\n        if (\\is_string($key) && isset($this->ids[$key])) {\n            return $this->namespace.$this->namespaceVersion.$this->ids[$key];\n        }\n        \\assert('' !== CacheItem::validateKey($key));\n        $this->ids[$key] = $key;\n\n        if (\\count($this->ids) > 1000) {\n            $this->ids = \\array_slice($this->ids, 500, null, true); // stop memory leak if there are many keys\n        }\n\n        if (null === $this->maxIdLength) {\n            return $this->namespace.$this->namespaceVersion.$key;\n        }\n        if (\\strlen($id = $this->namespace.$this->namespaceVersion.$key) > $this->maxIdLength) {\n            // Use xxh128 to favor speed over security, which is not an issue here\n            $this->ids[$key] = $id = substr_replace(base64_encode(hash('xxh128', $key, true)), static::NS_SEPARATOR, -(\\strlen($this->namespaceVersion) + 2));\n            $id = $this->namespace.$this->namespaceVersion.$id;\n        }\n\n        return $id;\n    }\n\n    /**\n     * @internal\n     */\n    public static function handleUnserializeCallback(string $class): never\n    {\n        throw new \\DomainException('Class not found: '.$class);\n    }\n\n    private static function formatNamespaceVersion(int $value): string\n    {\n        return strtr(substr_replace(base64_encode(pack('V', $value)), static::NS_SEPARATOR, 5), '/', '_');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/ContractsTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nuse Psr\\Log\\LoggerInterface;\nuse Symfony\\Component\\Cache\\Adapter\\AdapterInterface;\nuse Symfony\\Component\\Cache\\CacheItem;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\LockRegistry;\nuse Symfony\\Contracts\\Cache\\CacheInterface;\nuse Symfony\\Contracts\\Cache\\CacheTrait;\nuse Symfony\\Contracts\\Cache\\ItemInterface;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\ntrait ContractsTrait\n{\n    use CacheTrait {\n        doGet as private contractsGet;\n    }\n\n    private \\Closure $callbackWrapper;\n    private array $computing = [];\n\n    /**\n     * Wraps the callback passed to ->get() in a callable.\n     *\n     * @return callable the previous callback wrapper\n     */\n    public function setCallbackWrapper(?callable $callbackWrapper): callable\n    {\n        if (!isset($this->callbackWrapper)) {\n            $this->callbackWrapper = LockRegistry::compute(...);\n\n            if (\\in_array(\\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {\n                $this->setCallbackWrapper(null);\n            }\n        }\n\n        if (null !== $callbackWrapper && !$callbackWrapper instanceof \\Closure) {\n            $callbackWrapper = $callbackWrapper(...);\n        }\n\n        $previousWrapper = $this->callbackWrapper;\n        $this->callbackWrapper = $callbackWrapper ?? static fn (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \\Closure $setMetadata, ?LoggerInterface $logger) => $callback($item, $save);\n\n        return $previousWrapper;\n    }\n\n    private function doGet(AdapterInterface $pool, string $key, callable $callback, ?float $beta, ?array &$metadata = null): mixed\n    {\n        if (0 > $beta ??= 1.0) {\n            throw new InvalidArgumentException(sprintf('Argument \"$beta\" provided to \"%s::get()\" must be a positive number, %f given.', static::class, $beta));\n        }\n\n        static $setMetadata;\n\n        $setMetadata ??= \\Closure::bind(\n            static function (CacheItem $item, float $startTime, ?array &$metadata) {\n                if ($item->expiry > $endTime = microtime(true)) {\n                    $item->newMetadata[CacheItem::METADATA_EXPIRY] = $metadata[CacheItem::METADATA_EXPIRY] = $item->expiry;\n                    $item->newMetadata[CacheItem::METADATA_CTIME] = $metadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime));\n                } else {\n                    unset($metadata[CacheItem::METADATA_EXPIRY], $metadata[CacheItem::METADATA_CTIME], $metadata[CacheItem::METADATA_TAGS]);\n                }\n            },\n            null,\n            CacheItem::class\n        );\n\n        $this->callbackWrapper ??= LockRegistry::compute(...);\n\n        return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata, &$metadata, $key) {\n            // don't wrap nor save recursive calls\n            if (isset($this->computing[$key])) {\n                $value = $callback($item, $save);\n                $save = false;\n\n                return $value;\n            }\n\n            $this->computing[$key] = $key;\n            $startTime = microtime(true);\n\n            if (!isset($this->callbackWrapper)) {\n                $this->setCallbackWrapper($this->setCallbackWrapper(null));\n            }\n\n            try {\n                $value = ($this->callbackWrapper)($callback, $item, $save, $pool, function (CacheItem $item) use ($setMetadata, $startTime, &$metadata) {\n                    $setMetadata($item, $startTime, $metadata);\n                }, $this->logger ?? null);\n                $setMetadata($item, $startTime, $metadata);\n\n                return $value;\n            } finally {\n                unset($this->computing[$key]);\n            }\n        }, $beta, $metadata, $this->logger ?? null);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/FilesystemCommonTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\ntrait FilesystemCommonTrait\n{\n    private string $directory;\n    private string $tmpSuffix;\n\n    private function init(string $namespace, ?string $directory): void\n    {\n        if (!isset($directory[0])) {\n            $directory = sys_get_temp_dir().\\DIRECTORY_SEPARATOR.'symfony-cache';\n        } else {\n            $directory = realpath($directory) ?: $directory;\n        }\n        if (isset($namespace[0])) {\n            if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) {\n                throw new InvalidArgumentException(sprintf('Namespace contains \"%s\" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0]));\n            }\n            $directory .= \\DIRECTORY_SEPARATOR.$namespace;\n        } else {\n            $directory .= \\DIRECTORY_SEPARATOR.'@';\n        }\n        if (!is_dir($directory)) {\n            @mkdir($directory, 0777, true);\n        }\n        $directory .= \\DIRECTORY_SEPARATOR;\n        // On Windows the whole path is limited to 258 chars\n        if ('\\\\' === \\DIRECTORY_SEPARATOR && \\strlen($directory) > 234) {\n            throw new InvalidArgumentException(sprintf('Cache directory too long (%s).', $directory));\n        }\n\n        $this->directory = $directory;\n    }\n\n    protected function doClear(string $namespace): bool\n    {\n        $ok = true;\n\n        foreach ($this->scanHashDir($this->directory) as $file) {\n            if ('' !== $namespace && !str_starts_with($this->getFileKey($file), $namespace)) {\n                continue;\n            }\n\n            $ok = ($this->doUnlink($file) || !file_exists($file)) && $ok;\n        }\n\n        return $ok;\n    }\n\n    protected function doDelete(array $ids): bool\n    {\n        $ok = true;\n\n        foreach ($ids as $id) {\n            $file = $this->getFile($id);\n            $ok = (!is_file($file) || $this->doUnlink($file) || !file_exists($file)) && $ok;\n        }\n\n        return $ok;\n    }\n\n    /**\n     * @return bool\n     */\n    protected function doUnlink(string $file)\n    {\n        return @unlink($file);\n    }\n\n    private function write(string $file, string $data, ?int $expiresAt = null): bool\n    {\n        $unlink = false;\n        set_error_handler(static fn ($type, $message, $file, $line) => throw new \\ErrorException($message, 0, $type, $file, $line));\n        try {\n            $tmp = $this->directory.$this->tmpSuffix ??= str_replace('/', '-', base64_encode(random_bytes(6)));\n            try {\n                $h = fopen($tmp, 'x');\n            } catch (\\ErrorException $e) {\n                if (!str_contains($e->getMessage(), 'File exists')) {\n                    throw $e;\n                }\n\n                $tmp = $this->directory.$this->tmpSuffix = str_replace('/', '-', base64_encode(random_bytes(6)));\n                $h = fopen($tmp, 'x');\n            }\n            fwrite($h, $data);\n            fclose($h);\n            $unlink = true;\n\n            if (null !== $expiresAt) {\n                touch($tmp, $expiresAt ?: time() + 31556952); // 1 year in seconds\n            }\n\n            $success = rename($tmp, $file);\n            $unlink = !$success;\n\n            return $success;\n        } finally {\n            restore_error_handler();\n\n            if ($unlink) {\n                @unlink($tmp);\n            }\n        }\n    }\n\n    private function getFile(string $id, bool $mkdir = false, ?string $directory = null): string\n    {\n        // Use xxh128 to favor speed over security, which is not an issue here\n        $hash = str_replace('/', '-', base64_encode(hash('xxh128', static::class.$id, true)));\n        $dir = ($directory ?? $this->directory).strtoupper($hash[0].\\DIRECTORY_SEPARATOR.$hash[1].\\DIRECTORY_SEPARATOR);\n\n        if ($mkdir && !is_dir($dir)) {\n            @mkdir($dir, 0777, true);\n        }\n\n        return $dir.substr($hash, 2, 20);\n    }\n\n    private function getFileKey(string $file): string\n    {\n        return '';\n    }\n\n    private function scanHashDir(string $directory): \\Generator\n    {\n        if (!is_dir($directory)) {\n            return;\n        }\n\n        $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\n        for ($i = 0; $i < 38; ++$i) {\n            if (!is_dir($directory.$chars[$i])) {\n                continue;\n            }\n\n            for ($j = 0; $j < 38; ++$j) {\n                if (!is_dir($dir = $directory.$chars[$i].\\DIRECTORY_SEPARATOR.$chars[$j])) {\n                    continue;\n                }\n\n                foreach (@scandir($dir, \\SCANDIR_SORT_NONE) ?: [] as $file) {\n                    if ('.' !== $file && '..' !== $file) {\n                        yield $dir.\\DIRECTORY_SEPARATOR.$file;\n                    }\n                }\n            }\n        }\n    }\n\n    public function __sleep(): array\n    {\n        throw new \\BadMethodCallException('Cannot serialize '.__CLASS__);\n    }\n\n    /**\n     * @return void\n     */\n    public function __wakeup()\n    {\n        throw new \\BadMethodCallException('Cannot unserialize '.__CLASS__);\n    }\n\n    public function __destruct()\n    {\n        if (method_exists(parent::class, '__destruct')) {\n            parent::__destruct();\n        }\n        if (isset($this->tmpSuffix) && is_file($this->directory.$this->tmpSuffix)) {\n            unlink($this->directory.$this->tmpSuffix);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/FilesystemTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nuse Symfony\\Component\\Cache\\Exception\\CacheException;\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Rob Frawley 2nd <rmf@src.run>\n *\n * @internal\n */\ntrait FilesystemTrait\n{\n    use FilesystemCommonTrait;\n\n    private MarshallerInterface $marshaller;\n\n    public function prune(): bool\n    {\n        $time = time();\n        $pruned = true;\n\n        foreach ($this->scanHashDir($this->directory) as $file) {\n            if (!$h = @fopen($file, 'r')) {\n                continue;\n            }\n\n            if (($expiresAt = (int) fgets($h)) && $time >= $expiresAt) {\n                fclose($h);\n                $pruned = (@unlink($file) || !file_exists($file)) && $pruned;\n            } else {\n                fclose($h);\n            }\n        }\n\n        return $pruned;\n    }\n\n    protected function doFetch(array $ids): iterable\n    {\n        $values = [];\n        $now = time();\n\n        foreach ($ids as $id) {\n            $file = $this->getFile($id);\n            if (!is_file($file) || !$h = @fopen($file, 'r')) {\n                continue;\n            }\n            if (($expiresAt = (int) fgets($h)) && $now >= $expiresAt) {\n                fclose($h);\n                @unlink($file);\n            } else {\n                $i = rawurldecode(rtrim(fgets($h)));\n                $value = stream_get_contents($h);\n                fclose($h);\n                if ($i === $id) {\n                    $values[$id] = $this->marshaller->unmarshall($value);\n                }\n            }\n        }\n\n        return $values;\n    }\n\n    protected function doHave(string $id): bool\n    {\n        $file = $this->getFile($id);\n\n        return is_file($file) && (@filemtime($file) > time() || $this->doFetch([$id]));\n    }\n\n    protected function doSave(array $values, int $lifetime): array|bool\n    {\n        $expiresAt = $lifetime ? (time() + $lifetime) : 0;\n        $values = $this->marshaller->marshall($values, $failed);\n\n        foreach ($values as $id => $value) {\n            if (!$this->write($this->getFile($id, true), $expiresAt.\"\\n\".rawurlencode($id).\"\\n\".$value, $expiresAt)) {\n                $failed[] = $id;\n            }\n        }\n\n        if ($failed && !is_writable($this->directory)) {\n            throw new CacheException(sprintf('Cache directory is not writable (%s).', $this->directory));\n        }\n\n        return $failed;\n    }\n\n    private function getFileKey(string $file): string\n    {\n        if (!$h = @fopen($file, 'r')) {\n            return '';\n        }\n\n        fgets($h); // expiry\n        $encodedKey = fgets($h);\n        fclose($h);\n\n        return rawurldecode(rtrim($encodedKey));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/ProxyTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nuse Symfony\\Component\\Cache\\PruneableInterface;\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\ntrait ProxyTrait\n{\n    private object $pool;\n\n    public function prune(): bool\n    {\n        return $this->pool instanceof PruneableInterface && $this->pool->prune();\n    }\n\n    public function reset(): void\n    {\n        if ($this->pool instanceof ResetInterface) {\n            $this->pool->reset();\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/Redis5Proxy.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nuse Symfony\\Component\\VarExporter\\LazyObjectInterface;\nuse Symfony\\Component\\VarExporter\\LazyProxyTrait;\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\Hydrator::class);\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry::class);\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState::class);\n\n/**\n * @internal\n */\nclass Redis5Proxy extends \\Redis implements ResetInterface, LazyObjectInterface\n{\n    use LazyProxyTrait {\n        resetLazyObject as reset;\n    }\n\n    private const LAZY_OBJECT_PROPERTY_SCOPES = [];\n\n    public function __construct()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\\func_get_args());\n    }\n\n    public function _prefix($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\\func_get_args());\n    }\n\n    public function _serialize($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\\func_get_args());\n    }\n\n    public function _unserialize($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\\func_get_args());\n    }\n\n    public function _pack($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\\func_get_args());\n    }\n\n    public function _unpack($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\\func_get_args());\n    }\n\n    public function _compress($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\\func_get_args());\n    }\n\n    public function _uncompress($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\\func_get_args());\n    }\n\n    public function acl($subcmd, ...$args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\\func_get_args());\n    }\n\n    public function append($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\\func_get_args());\n    }\n\n    public function auth(#[\\SensitiveParameter] $auth)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->auth(...\\func_get_args());\n    }\n\n    public function bgSave()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgSave(...\\func_get_args());\n    }\n\n    public function bgrewriteaof()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\\func_get_args());\n    }\n\n    public function bitcount($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\\func_get_args());\n    }\n\n    public function bitop($operation, $ret_key, $key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\\func_get_args());\n    }\n\n    public function bitpos($key, $bit, $start = null, $end = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\\func_get_args());\n    }\n\n    public function blPop($key, $timeout_or_key, ...$extra_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blPop(...\\func_get_args());\n    }\n\n    public function brPop($key, $timeout_or_key, ...$extra_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brPop(...\\func_get_args());\n    }\n\n    public function brpoplpush($src, $dst, $timeout)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\\func_get_args());\n    }\n\n    public function bzPopMax($key, $timeout_or_key, ...$extra_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMax(...\\func_get_args());\n    }\n\n    public function bzPopMin($key, $timeout_or_key, ...$extra_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMin(...\\func_get_args());\n    }\n\n    public function clearLastError()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearLastError(...\\func_get_args());\n    }\n\n    public function client($cmd, ...$args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\\func_get_args());\n    }\n\n    public function close()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\\func_get_args());\n    }\n\n    public function command(...$args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\\func_get_args());\n    }\n\n    public function config($cmd, $key, $value = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\\func_get_args());\n    }\n\n    public function connect($host, $port = null, $timeout = null, $retry_interval = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->connect(...\\func_get_args());\n    }\n\n    public function dbSize()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbSize(...\\func_get_args());\n    }\n\n    public function debug($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->debug(...\\func_get_args());\n    }\n\n    public function decr($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\\func_get_args());\n    }\n\n    public function decrBy($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrBy(...\\func_get_args());\n    }\n\n    public function del($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\\func_get_args());\n    }\n\n    public function discard()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\\func_get_args());\n    }\n\n    public function dump($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\\func_get_args());\n    }\n\n    public function echo($msg)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\\func_get_args());\n    }\n\n    public function eval($script, $args = null, $num_keys = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\\func_get_args());\n    }\n\n    public function evalsha($script_sha, $args = null, $num_keys = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\\func_get_args());\n    }\n\n    public function exec()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\\func_get_args());\n    }\n\n    public function exists($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\\func_get_args());\n    }\n\n    public function expire($key, $timeout)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\\func_get_args());\n    }\n\n    public function expireAt($key, $timestamp)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireAt(...\\func_get_args());\n    }\n\n    public function flushAll($async = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushAll(...\\func_get_args());\n    }\n\n    public function flushDB($async = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushDB(...\\func_get_args());\n    }\n\n    public function geoadd($key, $lng, $lat, $member, ...$other_triples)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\\func_get_args());\n    }\n\n    public function geodist($key, $src, $dst, $unit = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\\func_get_args());\n    }\n\n    public function geohash($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\\func_get_args());\n    }\n\n    public function geopos($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\\func_get_args());\n    }\n\n    public function georadius($key, $lng, $lan, $radius, $unit, $opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\\func_get_args());\n    }\n\n    public function georadius_ro($key, $lng, $lan, $radius, $unit, $opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\\func_get_args());\n    }\n\n    public function georadiusbymember($key, $member, $radius, $unit, $opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\\func_get_args());\n    }\n\n    public function georadiusbymember_ro($key, $member, $radius, $unit, $opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\\func_get_args());\n    }\n\n    public function get($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\\func_get_args());\n    }\n\n    public function getAuth()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getAuth(...\\func_get_args());\n    }\n\n    public function getBit($key, $offset)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getBit(...\\func_get_args());\n    }\n\n    public function getDBNum()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDBNum(...\\func_get_args());\n    }\n\n    public function getHost()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getHost(...\\func_get_args());\n    }\n\n    public function getLastError()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getLastError(...\\func_get_args());\n    }\n\n    public function getMode()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMode(...\\func_get_args());\n    }\n\n    public function getOption($option)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getOption(...\\func_get_args());\n    }\n\n    public function getPersistentID()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPersistentID(...\\func_get_args());\n    }\n\n    public function getPort()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPort(...\\func_get_args());\n    }\n\n    public function getRange($key, $start, $end)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getRange(...\\func_get_args());\n    }\n\n    public function getReadTimeout()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getReadTimeout(...\\func_get_args());\n    }\n\n    public function getSet($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getSet(...\\func_get_args());\n    }\n\n    public function getTimeout()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTimeout(...\\func_get_args());\n    }\n\n    public function hDel($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hDel(...\\func_get_args());\n    }\n\n    public function hExists($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hExists(...\\func_get_args());\n    }\n\n    public function hGet($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGet(...\\func_get_args());\n    }\n\n    public function hGetAll($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGetAll(...\\func_get_args());\n    }\n\n    public function hIncrBy($key, $member, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrBy(...\\func_get_args());\n    }\n\n    public function hIncrByFloat($key, $member, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrByFloat(...\\func_get_args());\n    }\n\n    public function hKeys($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hKeys(...\\func_get_args());\n    }\n\n    public function hLen($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hLen(...\\func_get_args());\n    }\n\n    public function hMget($key, $keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMget(...\\func_get_args());\n    }\n\n    public function hMset($key, $pairs)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMset(...\\func_get_args());\n    }\n\n    public function hSet($key, $member, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSet(...\\func_get_args());\n    }\n\n    public function hSetNx($key, $member, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSetNx(...\\func_get_args());\n    }\n\n    public function hStrLen($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hStrLen(...\\func_get_args());\n    }\n\n    public function hVals($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hVals(...\\func_get_args());\n    }\n\n    public function hscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($str_key, $i_iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function incr($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\\func_get_args());\n    }\n\n    public function incrBy($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrBy(...\\func_get_args());\n    }\n\n    public function incrByFloat($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrByFloat(...\\func_get_args());\n    }\n\n    public function info($option = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\\func_get_args());\n    }\n\n    public function isConnected()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->isConnected(...\\func_get_args());\n    }\n\n    public function keys($pattern)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\\func_get_args());\n    }\n\n    public function lInsert($key, $position, $pivot, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lInsert(...\\func_get_args());\n    }\n\n    public function lLen($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lLen(...\\func_get_args());\n    }\n\n    public function lPop($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPop(...\\func_get_args());\n    }\n\n    public function lPush($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPush(...\\func_get_args());\n    }\n\n    public function lPushx($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPushx(...\\func_get_args());\n    }\n\n    public function lSet($key, $index, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lSet(...\\func_get_args());\n    }\n\n    public function lastSave()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastSave(...\\func_get_args());\n    }\n\n    public function lindex($key, $index)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\\func_get_args());\n    }\n\n    public function lrange($key, $start, $end)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\\func_get_args());\n    }\n\n    public function lrem($key, $value, $count)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\\func_get_args());\n    }\n\n    public function ltrim($key, $start, $stop)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\\func_get_args());\n    }\n\n    public function mget($keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\\func_get_args());\n    }\n\n    public function migrate($host, $port, $key, $db, $timeout, $copy = null, $replace = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->migrate(...\\func_get_args());\n    }\n\n    public function move($key, $dbindex)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->move(...\\func_get_args());\n    }\n\n    public function mset($pairs)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\\func_get_args());\n    }\n\n    public function msetnx($pairs)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\\func_get_args());\n    }\n\n    public function multi($mode = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\\func_get_args());\n    }\n\n    public function object($field, $key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\\func_get_args());\n    }\n\n    public function pconnect($host, $port = null, $timeout = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pconnect(...\\func_get_args());\n    }\n\n    public function persist($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\\func_get_args());\n    }\n\n    public function pexpire($key, $timestamp)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\\func_get_args());\n    }\n\n    public function pexpireAt($key, $timestamp)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireAt(...\\func_get_args());\n    }\n\n    public function pfadd($key, $elements)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\\func_get_args());\n    }\n\n    public function pfcount($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\\func_get_args());\n    }\n\n    public function pfmerge($dstkey, $keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\\func_get_args());\n    }\n\n    public function ping()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\\func_get_args());\n    }\n\n    public function pipeline()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pipeline(...\\func_get_args());\n    }\n\n    public function psetex($key, $expire, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\\func_get_args());\n    }\n\n    public function psubscribe($patterns, $callback)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\\func_get_args());\n    }\n\n    public function pttl($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\\func_get_args());\n    }\n\n    public function publish($channel, $message)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\\func_get_args());\n    }\n\n    public function pubsub($cmd, ...$args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\\func_get_args());\n    }\n\n    public function punsubscribe($pattern, ...$other_patterns)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\\func_get_args());\n    }\n\n    public function rPop($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPop(...\\func_get_args());\n    }\n\n    public function rPush($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPush(...\\func_get_args());\n    }\n\n    public function rPushx($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPushx(...\\func_get_args());\n    }\n\n    public function randomKey()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomKey(...\\func_get_args());\n    }\n\n    public function rawcommand($cmd, ...$args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\\func_get_args());\n    }\n\n    public function rename($key, $newkey)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\\func_get_args());\n    }\n\n    public function renameNx($key, $newkey)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renameNx(...\\func_get_args());\n    }\n\n    public function restore($ttl, $key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\\func_get_args());\n    }\n\n    public function role()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\\func_get_args());\n    }\n\n    public function rpoplpush($src, $dst)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\\func_get_args());\n    }\n\n    public function sAdd($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAdd(...\\func_get_args());\n    }\n\n    public function sAddArray($key, $options)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAddArray(...\\func_get_args());\n    }\n\n    public function sDiff($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiff(...\\func_get_args());\n    }\n\n    public function sDiffStore($dst, $key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiffStore(...\\func_get_args());\n    }\n\n    public function sInter($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInter(...\\func_get_args());\n    }\n\n    public function sInterStore($dst, $key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInterStore(...\\func_get_args());\n    }\n\n    public function sMembers($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMembers(...\\func_get_args());\n    }\n\n    public function sMisMember($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMisMember(...\\func_get_args());\n    }\n\n    public function sMove($src, $dst, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMove(...\\func_get_args());\n    }\n\n    public function sPop($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sPop(...\\func_get_args());\n    }\n\n    public function sRandMember($key, $count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sRandMember(...\\func_get_args());\n    }\n\n    public function sUnion($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnion(...\\func_get_args());\n    }\n\n    public function sUnionStore($dst, $key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnionStore(...\\func_get_args());\n    }\n\n    public function save()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\\func_get_args());\n    }\n\n    public function scan(&$i_iterator, $str_pattern = null, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($i_iterator, ...\\array_slice(\\func_get_args(), 1));\n    }\n\n    public function scard($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\\func_get_args());\n    }\n\n    public function script($cmd, ...$args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\\func_get_args());\n    }\n\n    public function select($dbindex)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->select(...\\func_get_args());\n    }\n\n    public function set($key, $value, $opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\\func_get_args());\n    }\n\n    public function setBit($key, $offset, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setBit(...\\func_get_args());\n    }\n\n    public function setOption($option, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setOption(...\\func_get_args());\n    }\n\n    public function setRange($key, $offset, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setRange(...\\func_get_args());\n    }\n\n    public function setex($key, $expire, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\\func_get_args());\n    }\n\n    public function setnx($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\\func_get_args());\n    }\n\n    public function sismember($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\\func_get_args());\n    }\n\n    public function slaveof($host = null, $port = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slaveof(...\\func_get_args());\n    }\n\n    public function slowlog($arg, $option = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\\func_get_args());\n    }\n\n    public function sort($key, $options = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\\func_get_args());\n    }\n\n    public function sortAsc($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAsc(...\\func_get_args());\n    }\n\n    public function sortAscAlpha($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAscAlpha(...\\func_get_args());\n    }\n\n    public function sortDesc($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDesc(...\\func_get_args());\n    }\n\n    public function sortDescAlpha($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDescAlpha(...\\func_get_args());\n    }\n\n    public function srem($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\\func_get_args());\n    }\n\n    public function sscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($str_key, $i_iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function strlen($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\\func_get_args());\n    }\n\n    public function subscribe($channels, $callback)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\\func_get_args());\n    }\n\n    public function swapdb($srcdb, $dstdb)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->swapdb(...\\func_get_args());\n    }\n\n    public function time()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\\func_get_args());\n    }\n\n    public function ttl($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\\func_get_args());\n    }\n\n    public function type($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\\func_get_args());\n    }\n\n    public function unlink($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\\func_get_args());\n    }\n\n    public function unsubscribe($channel, ...$other_channels)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\\func_get_args());\n    }\n\n    public function unwatch()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\\func_get_args());\n    }\n\n    public function wait($numslaves, $timeout)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->wait(...\\func_get_args());\n    }\n\n    public function watch($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\\func_get_args());\n    }\n\n    public function xack($str_key, $str_group, $arr_ids)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\\func_get_args());\n    }\n\n    public function xadd($str_key, $str_id, $arr_fields, $i_maxlen = null, $boo_approximate = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\\func_get_args());\n    }\n\n    public function xclaim($str_key, $str_group, $str_consumer, $i_min_idle, $arr_ids, $arr_opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\\func_get_args());\n    }\n\n    public function xdel($str_key, $arr_ids)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\\func_get_args());\n    }\n\n    public function xgroup($str_operation, $str_key = null, $str_arg1 = null, $str_arg2 = null, $str_arg3 = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\\func_get_args());\n    }\n\n    public function xinfo($str_cmd, $str_key = null, $str_group = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\\func_get_args());\n    }\n\n    public function xlen($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\\func_get_args());\n    }\n\n    public function xpending($str_key, $str_group, $str_start = null, $str_end = null, $i_count = null, $str_consumer = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\\func_get_args());\n    }\n\n    public function xrange($str_key, $str_start, $str_end, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\\func_get_args());\n    }\n\n    public function xread($arr_streams, $i_count = null, $i_block = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\\func_get_args());\n    }\n\n    public function xreadgroup($str_group, $str_consumer, $arr_streams, $i_count = null, $i_block = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\\func_get_args());\n    }\n\n    public function xrevrange($str_key, $str_start, $str_end, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\\func_get_args());\n    }\n\n    public function xtrim($str_key, $i_maxlen, $boo_approximate = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\\func_get_args());\n    }\n\n    public function zAdd($key, $score, $value, ...$extra_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zAdd(...\\func_get_args());\n    }\n\n    public function zCard($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCard(...\\func_get_args());\n    }\n\n    public function zCount($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCount(...\\func_get_args());\n    }\n\n    public function zIncrBy($key, $value, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zIncrBy(...\\func_get_args());\n    }\n\n    public function zLexCount($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zLexCount(...\\func_get_args());\n    }\n\n    public function zPopMax($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMax(...\\func_get_args());\n    }\n\n    public function zPopMin($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMin(...\\func_get_args());\n    }\n\n    public function zRange($key, $start, $end, $scores = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRange(...\\func_get_args());\n    }\n\n    public function zRangeByLex($key, $min, $max, $offset = null, $limit = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByLex(...\\func_get_args());\n    }\n\n    public function zRangeByScore($key, $start, $end, $options = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByScore(...\\func_get_args());\n    }\n\n    public function zRank($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRank(...\\func_get_args());\n    }\n\n    public function zRem($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRem(...\\func_get_args());\n    }\n\n    public function zRemRangeByLex($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByLex(...\\func_get_args());\n    }\n\n    public function zRemRangeByRank($key, $start, $end)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByRank(...\\func_get_args());\n    }\n\n    public function zRemRangeByScore($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByScore(...\\func_get_args());\n    }\n\n    public function zRevRange($key, $start, $end, $scores = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRange(...\\func_get_args());\n    }\n\n    public function zRevRangeByLex($key, $min, $max, $offset = null, $limit = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByLex(...\\func_get_args());\n    }\n\n    public function zRevRangeByScore($key, $start, $end, $options = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByScore(...\\func_get_args());\n    }\n\n    public function zRevRank($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRank(...\\func_get_args());\n    }\n\n    public function zScore($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zScore(...\\func_get_args());\n    }\n\n    public function zinterstore($key, $keys, $weights = null, $aggregate = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\\func_get_args());\n    }\n\n    public function zscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($str_key, $i_iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function zunionstore($key, $keys, $weights = null, $aggregate = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\\func_get_args());\n    }\n\n    public function delete($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->delete(...\\func_get_args());\n    }\n\n    public function evaluate($script, $args = null, $num_keys = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evaluate(...\\func_get_args());\n    }\n\n    public function evaluateSha($script_sha, $args = null, $num_keys = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evaluateSha(...\\func_get_args());\n    }\n\n    public function getKeys($pattern)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getKeys(...\\func_get_args());\n    }\n\n    public function getMultiple($keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMultiple(...\\func_get_args());\n    }\n\n    public function lGet($key, $index)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lGet(...\\func_get_args());\n    }\n\n    public function lGetRange($key, $start, $end)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lGetRange(...\\func_get_args());\n    }\n\n    public function lRemove($key, $value, $count)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lRemove(...\\func_get_args());\n    }\n\n    public function lSize($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lSize(...\\func_get_args());\n    }\n\n    public function listTrim($key, $start, $stop)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->listTrim(...\\func_get_args());\n    }\n\n    public function open($host, $port = null, $timeout = null, $retry_interval = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->open(...\\func_get_args());\n    }\n\n    public function popen($host, $port = null, $timeout = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->popen(...\\func_get_args());\n    }\n\n    public function renameKey($key, $newkey)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renameKey(...\\func_get_args());\n    }\n\n    public function sContains($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sContains(...\\func_get_args());\n    }\n\n    public function sGetMembers($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sGetMembers(...\\func_get_args());\n    }\n\n    public function sRemove($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sRemove(...\\func_get_args());\n    }\n\n    public function sSize($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sSize(...\\func_get_args());\n    }\n\n    public function sendEcho($msg)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sendEcho(...\\func_get_args());\n    }\n\n    public function setTimeout($key, $timeout)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setTimeout(...\\func_get_args());\n    }\n\n    public function substr($key, $start, $end)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->substr(...\\func_get_args());\n    }\n\n    public function zDelete($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zDelete(...\\func_get_args());\n    }\n\n    public function zDeleteRangeByRank($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zDeleteRangeByRank(...\\func_get_args());\n    }\n\n    public function zDeleteRangeByScore($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zDeleteRangeByScore(...\\func_get_args());\n    }\n\n    public function zInter($key, $keys, $weights = null, $aggregate = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zInter(...\\func_get_args());\n    }\n\n    public function zRemove($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemove(...\\func_get_args());\n    }\n\n    public function zRemoveRangeByScore($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemoveRangeByScore(...\\func_get_args());\n    }\n\n    public function zReverseRange($key, $start, $end, $scores = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zReverseRange(...\\func_get_args());\n    }\n\n    public function zSize($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zSize(...\\func_get_args());\n    }\n\n    public function zUnion($key, $keys, $weights = null, $aggregate = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zUnion(...\\func_get_args());\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/Redis6Proxy.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nuse Symfony\\Component\\VarExporter\\LazyObjectInterface;\nuse Symfony\\Component\\VarExporter\\LazyProxyTrait;\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\Hydrator::class);\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry::class);\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState::class);\n\n/**\n * @internal\n */\nclass Redis6Proxy extends \\Redis implements ResetInterface, LazyObjectInterface\n{\n    use LazyProxyTrait {\n        resetLazyObject as reset;\n    }\n\n    private const LAZY_OBJECT_PROPERTY_SCOPES = [];\n\n    public function __construct($options = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\\func_get_args());\n    }\n\n    public function _compress($value): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\\func_get_args());\n    }\n\n    public function _uncompress($value): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\\func_get_args());\n    }\n\n    public function _prefix($key): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\\func_get_args());\n    }\n\n    public function _serialize($value): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\\func_get_args());\n    }\n\n    public function _unserialize($value): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\\func_get_args());\n    }\n\n    public function _pack($value): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\\func_get_args());\n    }\n\n    public function _unpack($value): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\\func_get_args());\n    }\n\n    public function acl($subcmd, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\\func_get_args());\n    }\n\n    public function append($key, $value): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\\func_get_args());\n    }\n\n    public function auth(#[\\SensitiveParameter] $credentials): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->auth(...\\func_get_args());\n    }\n\n    public function bgSave(): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgSave(...\\func_get_args());\n    }\n\n    public function bgrewriteaof(): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\\func_get_args());\n    }\n\n    public function bitcount($key, $start = 0, $end = -1, $bybit = false): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\\func_get_args());\n    }\n\n    public function bitop($operation, $deskey, $srckey, ...$other_keys): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\\func_get_args());\n    }\n\n    public function bitpos($key, $bit, $start = 0, $end = -1, $bybit = false): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\\func_get_args());\n    }\n\n    public function blPop($key_or_keys, $timeout_or_key, ...$extra_args): \\Redis|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blPop(...\\func_get_args());\n    }\n\n    public function brPop($key_or_keys, $timeout_or_key, ...$extra_args): \\Redis|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brPop(...\\func_get_args());\n    }\n\n    public function brpoplpush($src, $dst, $timeout): \\Redis|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\\func_get_args());\n    }\n\n    public function bzPopMax($key, $timeout_or_key, ...$extra_args): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMax(...\\func_get_args());\n    }\n\n    public function bzPopMin($key, $timeout_or_key, ...$extra_args): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMin(...\\func_get_args());\n    }\n\n    public function bzmpop($timeout, $keys, $from, $count = 1): \\Redis|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzmpop(...\\func_get_args());\n    }\n\n    public function zmpop($keys, $from, $count = 1): \\Redis|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmpop(...\\func_get_args());\n    }\n\n    public function blmpop($timeout, $keys, $from, $count = 1): \\Redis|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmpop(...\\func_get_args());\n    }\n\n    public function lmpop($keys, $from, $count = 1): \\Redis|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmpop(...\\func_get_args());\n    }\n\n    public function clearLastError(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearLastError(...\\func_get_args());\n    }\n\n    public function client($opt, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\\func_get_args());\n    }\n\n    public function close(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\\func_get_args());\n    }\n\n    public function command($opt = null, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\\func_get_args());\n    }\n\n    public function config($operation, $key_or_settings = null, $value = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\\func_get_args());\n    }\n\n    public function connect($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->connect(...\\func_get_args());\n    }\n\n    public function copy($src, $dst, $options = null): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\\func_get_args());\n    }\n\n    public function dbSize(): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbSize(...\\func_get_args());\n    }\n\n    public function debug($key): \\Redis|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->debug(...\\func_get_args());\n    }\n\n    public function decr($key, $by = 1): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\\func_get_args());\n    }\n\n    public function decrBy($key, $value): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrBy(...\\func_get_args());\n    }\n\n    public function del($key, ...$other_keys): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\\func_get_args());\n    }\n\n    public function delete($key, ...$other_keys): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->delete(...\\func_get_args());\n    }\n\n    public function discard(): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\\func_get_args());\n    }\n\n    public function dump($key): \\Redis|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\\func_get_args());\n    }\n\n    public function echo($str): \\Redis|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\\func_get_args());\n    }\n\n    public function eval($script, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\\func_get_args());\n    }\n\n    public function eval_ro($script_sha, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval_ro(...\\func_get_args());\n    }\n\n    public function evalsha($sha1, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\\func_get_args());\n    }\n\n    public function evalsha_ro($sha1, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha_ro(...\\func_get_args());\n    }\n\n    public function exec(): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\\func_get_args());\n    }\n\n    public function exists($key, ...$other_keys): \\Redis|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\\func_get_args());\n    }\n\n    public function expire($key, $timeout, $mode = null): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\\func_get_args());\n    }\n\n    public function expireAt($key, $timestamp, $mode = null): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireAt(...\\func_get_args());\n    }\n\n    public function failover($to = null, $abort = false, $timeout = 0): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->failover(...\\func_get_args());\n    }\n\n    public function expiretime($key): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expiretime(...\\func_get_args());\n    }\n\n    public function pexpiretime($key): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpiretime(...\\func_get_args());\n    }\n\n    public function fcall($fn, $keys = [], $args = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall(...\\func_get_args());\n    }\n\n    public function fcall_ro($fn, $keys = [], $args = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall_ro(...\\func_get_args());\n    }\n\n    public function flushAll($sync = null): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushAll(...\\func_get_args());\n    }\n\n    public function flushDB($sync = null): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushDB(...\\func_get_args());\n    }\n\n    public function function($operation, ...$args): \\Redis|array|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->function(...\\func_get_args());\n    }\n\n    public function geoadd($key, $lng, $lat, $member, ...$other_triples_and_options): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\\func_get_args());\n    }\n\n    public function geodist($key, $src, $dst, $unit = null): \\Redis|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\\func_get_args());\n    }\n\n    public function geohash($key, $member, ...$other_members): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\\func_get_args());\n    }\n\n    public function geopos($key, $member, ...$other_members): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\\func_get_args());\n    }\n\n    public function georadius($key, $lng, $lat, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\\func_get_args());\n    }\n\n    public function georadius_ro($key, $lng, $lat, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\\func_get_args());\n    }\n\n    public function georadiusbymember($key, $member, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\\func_get_args());\n    }\n\n    public function georadiusbymember_ro($key, $member, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\\func_get_args());\n    }\n\n    public function geosearch($key, $position, $shape, $unit, $options = []): array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\\func_get_args());\n    }\n\n    public function geosearchstore($dst, $src, $position, $shape, $unit, $options = []): \\Redis|array|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearchstore(...\\func_get_args());\n    }\n\n    public function get($key): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\\func_get_args());\n    }\n\n    public function getAuth(): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getAuth(...\\func_get_args());\n    }\n\n    public function getBit($key, $idx): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getBit(...\\func_get_args());\n    }\n\n    public function getEx($key, $options = []): \\Redis|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getEx(...\\func_get_args());\n    }\n\n    public function getDBNum(): int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDBNum(...\\func_get_args());\n    }\n\n    public function getDel($key): \\Redis|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDel(...\\func_get_args());\n    }\n\n    public function getHost(): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getHost(...\\func_get_args());\n    }\n\n    public function getLastError(): ?string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getLastError(...\\func_get_args());\n    }\n\n    public function getMode(): int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMode(...\\func_get_args());\n    }\n\n    public function getOption($option): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getOption(...\\func_get_args());\n    }\n\n    public function getPersistentID(): ?string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPersistentID(...\\func_get_args());\n    }\n\n    public function getPort(): int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPort(...\\func_get_args());\n    }\n\n    public function getRange($key, $start, $end): \\Redis|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getRange(...\\func_get_args());\n    }\n\n    public function lcs($key1, $key2, $options = null): \\Redis|array|false|int|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lcs(...\\func_get_args());\n    }\n\n    public function getReadTimeout(): float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getReadTimeout(...\\func_get_args());\n    }\n\n    public function getset($key, $value): \\Redis|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\\func_get_args());\n    }\n\n    public function getTimeout(): false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTimeout(...\\func_get_args());\n    }\n\n    public function getTransferredBytes(): array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTransferredBytes(...\\func_get_args());\n    }\n\n    public function clearTransferredBytes(): void\n    {\n        ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearTransferredBytes(...\\func_get_args());\n    }\n\n    public function hDel($key, $field, ...$other_fields): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hDel(...\\func_get_args());\n    }\n\n    public function hExists($key, $field): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hExists(...\\func_get_args());\n    }\n\n    public function hGet($key, $member): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGet(...\\func_get_args());\n    }\n\n    public function hGetAll($key): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGetAll(...\\func_get_args());\n    }\n\n    public function hIncrBy($key, $field, $value): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrBy(...\\func_get_args());\n    }\n\n    public function hIncrByFloat($key, $field, $value): \\Redis|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrByFloat(...\\func_get_args());\n    }\n\n    public function hKeys($key): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hKeys(...\\func_get_args());\n    }\n\n    public function hLen($key): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hLen(...\\func_get_args());\n    }\n\n    public function hMget($key, $fields): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMget(...\\func_get_args());\n    }\n\n    public function hMset($key, $fieldvals): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMset(...\\func_get_args());\n    }\n\n    public function hRandField($key, $options = null): \\Redis|array|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hRandField(...\\func_get_args());\n    }\n\n    public function hSet($key, $member, $value): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSet(...\\func_get_args());\n    }\n\n    public function hSetNx($key, $field, $value): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSetNx(...\\func_get_args());\n    }\n\n    public function hStrLen($key, $field): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hStrLen(...\\func_get_args());\n    }\n\n    public function hVals($key): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hVals(...\\func_get_args());\n    }\n\n    public function hscan($key, &$iterator, $pattern = null, $count = 0): \\Redis|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($key, $iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function incr($key, $by = 1): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\\func_get_args());\n    }\n\n    public function incrBy($key, $value): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrBy(...\\func_get_args());\n    }\n\n    public function incrByFloat($key, $value): \\Redis|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrByFloat(...\\func_get_args());\n    }\n\n    public function info(...$sections): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\\func_get_args());\n    }\n\n    public function isConnected(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->isConnected(...\\func_get_args());\n    }\n\n    public function keys($pattern)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\\func_get_args());\n    }\n\n    public function lInsert($key, $pos, $pivot, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lInsert(...\\func_get_args());\n    }\n\n    public function lLen($key): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lLen(...\\func_get_args());\n    }\n\n    public function lMove($src, $dst, $wherefrom, $whereto): \\Redis|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lMove(...\\func_get_args());\n    }\n\n    public function blmove($src, $dst, $wherefrom, $whereto, $timeout): \\Redis|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\\func_get_args());\n    }\n\n    public function lPop($key, $count = 0): \\Redis|array|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPop(...\\func_get_args());\n    }\n\n    public function lPos($key, $value, $options = null): \\Redis|array|bool|int|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPos(...\\func_get_args());\n    }\n\n    public function lPush($key, ...$elements): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPush(...\\func_get_args());\n    }\n\n    public function rPush($key, ...$elements): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPush(...\\func_get_args());\n    }\n\n    public function lPushx($key, $value): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPushx(...\\func_get_args());\n    }\n\n    public function rPushx($key, $value): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPushx(...\\func_get_args());\n    }\n\n    public function lSet($key, $index, $value): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lSet(...\\func_get_args());\n    }\n\n    public function lastSave(): int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastSave(...\\func_get_args());\n    }\n\n    public function lindex($key, $index): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\\func_get_args());\n    }\n\n    public function lrange($key, $start, $end): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\\func_get_args());\n    }\n\n    public function lrem($key, $value, $count = 0): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\\func_get_args());\n    }\n\n    public function ltrim($key, $start, $end): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\\func_get_args());\n    }\n\n    public function mget($keys): \\Redis|array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\\func_get_args());\n    }\n\n    public function migrate($host, $port, $key, $dstdb, $timeout, $copy = false, $replace = false, #[\\SensitiveParameter] $credentials = null): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->migrate(...\\func_get_args());\n    }\n\n    public function move($key, $index): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->move(...\\func_get_args());\n    }\n\n    public function mset($key_values): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\\func_get_args());\n    }\n\n    public function msetnx($key_values): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\\func_get_args());\n    }\n\n    public function multi($value = \\Redis::MULTI): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\\func_get_args());\n    }\n\n    public function object($subcommand, $key): \\Redis|false|int|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\\func_get_args());\n    }\n\n    public function open($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->open(...\\func_get_args());\n    }\n\n    public function pconnect($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pconnect(...\\func_get_args());\n    }\n\n    public function persist($key): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\\func_get_args());\n    }\n\n    public function pexpire($key, $timeout, $mode = null): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\\func_get_args());\n    }\n\n    public function pexpireAt($key, $timestamp, $mode = null): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireAt(...\\func_get_args());\n    }\n\n    public function pfadd($key, $elements): \\Redis|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\\func_get_args());\n    }\n\n    public function pfcount($key_or_keys): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\\func_get_args());\n    }\n\n    public function pfmerge($dst, $srckeys): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\\func_get_args());\n    }\n\n    public function ping($message = null): \\Redis|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\\func_get_args());\n    }\n\n    public function pipeline(): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pipeline(...\\func_get_args());\n    }\n\n    public function popen($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->popen(...\\func_get_args());\n    }\n\n    public function psetex($key, $expire, $value): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\\func_get_args());\n    }\n\n    public function psubscribe($patterns, $cb): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\\func_get_args());\n    }\n\n    public function pttl($key): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\\func_get_args());\n    }\n\n    public function publish($channel, $message): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\\func_get_args());\n    }\n\n    public function pubsub($command, $arg = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\\func_get_args());\n    }\n\n    public function punsubscribe($patterns): \\Redis|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\\func_get_args());\n    }\n\n    public function rPop($key, $count = 0): \\Redis|array|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPop(...\\func_get_args());\n    }\n\n    public function randomKey(): \\Redis|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomKey(...\\func_get_args());\n    }\n\n    public function rawcommand($command, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\\func_get_args());\n    }\n\n    public function rename($old_name, $new_name): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\\func_get_args());\n    }\n\n    public function renameNx($key_src, $key_dst): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renameNx(...\\func_get_args());\n    }\n\n    public function restore($key, $ttl, $value, $options = null): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\\func_get_args());\n    }\n\n    public function role(): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\\func_get_args());\n    }\n\n    public function rpoplpush($srckey, $dstkey): \\Redis|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\\func_get_args());\n    }\n\n    public function sAdd($key, $value, ...$other_values): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAdd(...\\func_get_args());\n    }\n\n    public function sAddArray($key, $values): int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAddArray(...\\func_get_args());\n    }\n\n    public function sDiff($key, ...$other_keys): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiff(...\\func_get_args());\n    }\n\n    public function sDiffStore($dst, $key, ...$other_keys): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiffStore(...\\func_get_args());\n    }\n\n    public function sInter($key, ...$other_keys): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInter(...\\func_get_args());\n    }\n\n    public function sintercard($keys, $limit = -1): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sintercard(...\\func_get_args());\n    }\n\n    public function sInterStore($key, ...$other_keys): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInterStore(...\\func_get_args());\n    }\n\n    public function sMembers($key): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMembers(...\\func_get_args());\n    }\n\n    public function sMisMember($key, $member, ...$other_members): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMisMember(...\\func_get_args());\n    }\n\n    public function sMove($src, $dst, $value): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMove(...\\func_get_args());\n    }\n\n    public function sPop($key, $count = 0): \\Redis|array|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sPop(...\\func_get_args());\n    }\n\n    public function sRandMember($key, $count = 0): \\Redis|array|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sRandMember(...\\func_get_args());\n    }\n\n    public function sUnion($key, ...$other_keys): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnion(...\\func_get_args());\n    }\n\n    public function sUnionStore($dst, $key, ...$other_keys): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnionStore(...\\func_get_args());\n    }\n\n    public function save(): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\\func_get_args());\n    }\n\n    public function scan(&$iterator, $pattern = null, $count = 0, $type = null): array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($iterator, ...\\array_slice(\\func_get_args(), 1));\n    }\n\n    public function scard($key): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\\func_get_args());\n    }\n\n    public function script($command, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\\func_get_args());\n    }\n\n    public function select($db): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->select(...\\func_get_args());\n    }\n\n    public function set($key, $value, $options = null): \\Redis|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\\func_get_args());\n    }\n\n    public function setBit($key, $idx, $value): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setBit(...\\func_get_args());\n    }\n\n    public function setRange($key, $index, $value): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setRange(...\\func_get_args());\n    }\n\n    public function setOption($option, $value): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setOption(...\\func_get_args());\n    }\n\n    public function setex($key, $expire, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\\func_get_args());\n    }\n\n    public function setnx($key, $value): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\\func_get_args());\n    }\n\n    public function sismember($key, $value): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\\func_get_args());\n    }\n\n    public function slaveof($host = null, $port = 6379): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slaveof(...\\func_get_args());\n    }\n\n    public function replicaof($host = null, $port = 6379): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->replicaof(...\\func_get_args());\n    }\n\n    public function touch($key_or_array, ...$more_keys): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->touch(...\\func_get_args());\n    }\n\n    public function slowlog($operation, $length = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\\func_get_args());\n    }\n\n    public function sort($key, $options = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\\func_get_args());\n    }\n\n    public function sort_ro($key, $options = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort_ro(...\\func_get_args());\n    }\n\n    public function sortAsc($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAsc(...\\func_get_args());\n    }\n\n    public function sortAscAlpha($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAscAlpha(...\\func_get_args());\n    }\n\n    public function sortDesc($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDesc(...\\func_get_args());\n    }\n\n    public function sortDescAlpha($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDescAlpha(...\\func_get_args());\n    }\n\n    public function srem($key, $value, ...$other_values): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\\func_get_args());\n    }\n\n    public function sscan($key, &$iterator, $pattern = null, $count = 0): array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($key, $iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function ssubscribe($channels, $cb): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ssubscribe(...\\func_get_args());\n    }\n\n    public function strlen($key): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\\func_get_args());\n    }\n\n    public function subscribe($channels, $cb): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\\func_get_args());\n    }\n\n    public function sunsubscribe($channels): \\Redis|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunsubscribe(...\\func_get_args());\n    }\n\n    public function swapdb($src, $dst): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->swapdb(...\\func_get_args());\n    }\n\n    public function time(): \\Redis|array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\\func_get_args());\n    }\n\n    public function ttl($key): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\\func_get_args());\n    }\n\n    public function type($key): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\\func_get_args());\n    }\n\n    public function unlink($key, ...$other_keys): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\\func_get_args());\n    }\n\n    public function unsubscribe($channels): \\Redis|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\\func_get_args());\n    }\n\n    public function unwatch(): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\\func_get_args());\n    }\n\n    public function watch($key, ...$other_keys): \\Redis|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\\func_get_args());\n    }\n\n    public function wait($numreplicas, $timeout): false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->wait(...\\func_get_args());\n    }\n\n    public function xack($key, $group, $ids): false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\\func_get_args());\n    }\n\n    public function xadd($key, $id, $values, $maxlen = 0, $approx = false, $nomkstream = false): \\Redis|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\\func_get_args());\n    }\n\n    public function xautoclaim($key, $group, $consumer, $min_idle, $start, $count = -1, $justid = false): \\Redis|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xautoclaim(...\\func_get_args());\n    }\n\n    public function xclaim($key, $group, $consumer, $min_idle, $ids, $options): \\Redis|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\\func_get_args());\n    }\n\n    public function xdel($key, $ids): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\\func_get_args());\n    }\n\n    public function xgroup($operation, $key = null, $group = null, $id_or_consumer = null, $mkstream = false, $entries_read = -2): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\\func_get_args());\n    }\n\n    public function xinfo($operation, $arg1 = null, $arg2 = null, $count = -1): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\\func_get_args());\n    }\n\n    public function xlen($key): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\\func_get_args());\n    }\n\n    public function xpending($key, $group, $start = null, $end = null, $count = -1, $consumer = null): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\\func_get_args());\n    }\n\n    public function xrange($key, $start, $end, $count = -1): \\Redis|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\\func_get_args());\n    }\n\n    public function xread($streams, $count = -1, $block = -1): \\Redis|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\\func_get_args());\n    }\n\n    public function xreadgroup($group, $consumer, $streams, $count = 1, $block = 1): \\Redis|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\\func_get_args());\n    }\n\n    public function xrevrange($key, $end, $start, $count = -1): \\Redis|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\\func_get_args());\n    }\n\n    public function xtrim($key, $threshold, $approx = false, $minid = false, $limit = -1): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\\func_get_args());\n    }\n\n    public function zAdd($key, $score_or_options, ...$more_scores_and_mems): \\Redis|false|float|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zAdd(...\\func_get_args());\n    }\n\n    public function zCard($key): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCard(...\\func_get_args());\n    }\n\n    public function zCount($key, $start, $end): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCount(...\\func_get_args());\n    }\n\n    public function zIncrBy($key, $value, $member): \\Redis|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zIncrBy(...\\func_get_args());\n    }\n\n    public function zLexCount($key, $min, $max): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zLexCount(...\\func_get_args());\n    }\n\n    public function zMscore($key, $member, ...$other_members): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zMscore(...\\func_get_args());\n    }\n\n    public function zPopMax($key, $count = null): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMax(...\\func_get_args());\n    }\n\n    public function zPopMin($key, $count = null): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMin(...\\func_get_args());\n    }\n\n    public function zRange($key, $start, $end, $options = null): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRange(...\\func_get_args());\n    }\n\n    public function zRangeByLex($key, $min, $max, $offset = -1, $count = -1): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByLex(...\\func_get_args());\n    }\n\n    public function zRangeByScore($key, $start, $end, $options = []): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByScore(...\\func_get_args());\n    }\n\n    public function zrangestore($dstkey, $srckey, $start, $end, $options = null): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangestore(...\\func_get_args());\n    }\n\n    public function zRandMember($key, $options = null): \\Redis|array|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRandMember(...\\func_get_args());\n    }\n\n    public function zRank($key, $member): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRank(...\\func_get_args());\n    }\n\n    public function zRem($key, $member, ...$other_members): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRem(...\\func_get_args());\n    }\n\n    public function zRemRangeByLex($key, $min, $max): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByLex(...\\func_get_args());\n    }\n\n    public function zRemRangeByRank($key, $start, $end): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByRank(...\\func_get_args());\n    }\n\n    public function zRemRangeByScore($key, $start, $end): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByScore(...\\func_get_args());\n    }\n\n    public function zRevRange($key, $start, $end, $scores = null): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRange(...\\func_get_args());\n    }\n\n    public function zRevRangeByLex($key, $max, $min, $offset = -1, $count = -1): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByLex(...\\func_get_args());\n    }\n\n    public function zRevRangeByScore($key, $max, $min, $options = []): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByScore(...\\func_get_args());\n    }\n\n    public function zRevRank($key, $member): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRank(...\\func_get_args());\n    }\n\n    public function zScore($key, $member): \\Redis|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zScore(...\\func_get_args());\n    }\n\n    public function zdiff($keys, $options = null): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiff(...\\func_get_args());\n    }\n\n    public function zdiffstore($dst, $keys): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiffstore(...\\func_get_args());\n    }\n\n    public function zinter($keys, $weights = null, $options = null): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinter(...\\func_get_args());\n    }\n\n    public function zintercard($keys, $limit = -1): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zintercard(...\\func_get_args());\n    }\n\n    public function zinterstore($dst, $keys, $weights = null, $aggregate = null): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\\func_get_args());\n    }\n\n    public function zscan($key, &$iterator, $pattern = null, $count = 0): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($key, $iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function zunion($keys, $weights = null, $options = null): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunion(...\\func_get_args());\n    }\n\n    public function zunionstore($dst, $keys, $weights = null, $aggregate = null): \\Redis|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\\func_get_args());\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/RedisCluster5Proxy.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nuse Symfony\\Component\\VarExporter\\LazyObjectInterface;\nuse Symfony\\Component\\VarExporter\\LazyProxyTrait;\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\Hydrator::class);\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry::class);\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState::class);\n\n/**\n * @internal\n */\nclass RedisCluster5Proxy extends \\RedisCluster implements ResetInterface, LazyObjectInterface\n{\n    use LazyProxyTrait {\n        resetLazyObject as reset;\n    }\n\n    private const LAZY_OBJECT_PROPERTY_SCOPES = [];\n\n    public function __construct($name, $seeds = null, $timeout = null, $read_timeout = null, $persistent = null, #[\\SensitiveParameter] $auth = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\\func_get_args());\n    }\n\n    public function _masters()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_masters(...\\func_get_args());\n    }\n\n    public function _prefix($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\\func_get_args());\n    }\n\n    public function _redir()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_redir(...\\func_get_args());\n    }\n\n    public function _serialize($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\\func_get_args());\n    }\n\n    public function _unserialize($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\\func_get_args());\n    }\n\n    public function _compress($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\\func_get_args());\n    }\n\n    public function _uncompress($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\\func_get_args());\n    }\n\n    public function _pack($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\\func_get_args());\n    }\n\n    public function _unpack($value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\\func_get_args());\n    }\n\n    public function acl($key_or_address, $subcmd, ...$args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\\func_get_args());\n    }\n\n    public function append($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\\func_get_args());\n    }\n\n    public function bgrewriteaof($key_or_address)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\\func_get_args());\n    }\n\n    public function bgsave($key_or_address)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\\func_get_args());\n    }\n\n    public function bitcount($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\\func_get_args());\n    }\n\n    public function bitop($operation, $ret_key, $key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\\func_get_args());\n    }\n\n    public function bitpos($key, $bit, $start = null, $end = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\\func_get_args());\n    }\n\n    public function blpop($key, $timeout_or_key, ...$extra_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blpop(...\\func_get_args());\n    }\n\n    public function brpop($key, $timeout_or_key, ...$extra_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpop(...\\func_get_args());\n    }\n\n    public function brpoplpush($src, $dst, $timeout)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\\func_get_args());\n    }\n\n    public function clearlasterror()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearlasterror(...\\func_get_args());\n    }\n\n    public function bzpopmax($key, $timeout_or_key, ...$extra_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmax(...\\func_get_args());\n    }\n\n    public function bzpopmin($key, $timeout_or_key, ...$extra_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmin(...\\func_get_args());\n    }\n\n    public function client($key_or_address, $arg = null, ...$other_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\\func_get_args());\n    }\n\n    public function close()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\\func_get_args());\n    }\n\n    public function cluster($key_or_address, $arg = null, ...$other_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cluster(...\\func_get_args());\n    }\n\n    public function command(...$args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\\func_get_args());\n    }\n\n    public function config($key_or_address, $arg = null, ...$other_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\\func_get_args());\n    }\n\n    public function dbsize($key_or_address)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbsize(...\\func_get_args());\n    }\n\n    public function decr($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\\func_get_args());\n    }\n\n    public function decrby($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrby(...\\func_get_args());\n    }\n\n    public function del($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\\func_get_args());\n    }\n\n    public function discard()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\\func_get_args());\n    }\n\n    public function dump($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\\func_get_args());\n    }\n\n    public function echo($msg)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\\func_get_args());\n    }\n\n    public function eval($script, $args = null, $num_keys = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\\func_get_args());\n    }\n\n    public function evalsha($script_sha, $args = null, $num_keys = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\\func_get_args());\n    }\n\n    public function exec()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\\func_get_args());\n    }\n\n    public function exists($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\\func_get_args());\n    }\n\n    public function expire($key, $timeout)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\\func_get_args());\n    }\n\n    public function expireat($key, $timestamp)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireat(...\\func_get_args());\n    }\n\n    public function flushall($key_or_address, $async = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushall(...\\func_get_args());\n    }\n\n    public function flushdb($key_or_address, $async = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushdb(...\\func_get_args());\n    }\n\n    public function geoadd($key, $lng, $lat, $member, ...$other_triples)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\\func_get_args());\n    }\n\n    public function geodist($key, $src, $dst, $unit = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\\func_get_args());\n    }\n\n    public function geohash($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\\func_get_args());\n    }\n\n    public function geopos($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\\func_get_args());\n    }\n\n    public function georadius($key, $lng, $lan, $radius, $unit, $opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\\func_get_args());\n    }\n\n    public function georadius_ro($key, $lng, $lan, $radius, $unit, $opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\\func_get_args());\n    }\n\n    public function georadiusbymember($key, $member, $radius, $unit, $opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\\func_get_args());\n    }\n\n    public function georadiusbymember_ro($key, $member, $radius, $unit, $opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\\func_get_args());\n    }\n\n    public function get($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\\func_get_args());\n    }\n\n    public function getbit($key, $offset)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getbit(...\\func_get_args());\n    }\n\n    public function getlasterror()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getlasterror(...\\func_get_args());\n    }\n\n    public function getmode()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getmode(...\\func_get_args());\n    }\n\n    public function getoption($option)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getoption(...\\func_get_args());\n    }\n\n    public function getrange($key, $start, $end)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\\func_get_args());\n    }\n\n    public function getset($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\\func_get_args());\n    }\n\n    public function hdel($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hdel(...\\func_get_args());\n    }\n\n    public function hexists($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexists(...\\func_get_args());\n    }\n\n    public function hget($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hget(...\\func_get_args());\n    }\n\n    public function hgetall($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetall(...\\func_get_args());\n    }\n\n    public function hincrby($key, $member, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrby(...\\func_get_args());\n    }\n\n    public function hincrbyfloat($key, $member, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrbyfloat(...\\func_get_args());\n    }\n\n    public function hkeys($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hkeys(...\\func_get_args());\n    }\n\n    public function hlen($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hlen(...\\func_get_args());\n    }\n\n    public function hmget($key, $keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmget(...\\func_get_args());\n    }\n\n    public function hmset($key, $pairs)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmset(...\\func_get_args());\n    }\n\n    public function hscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($str_key, $i_iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function hset($key, $member, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\\func_get_args());\n    }\n\n    public function hsetnx($key, $member, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hsetnx(...\\func_get_args());\n    }\n\n    public function hstrlen($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hstrlen(...\\func_get_args());\n    }\n\n    public function hvals($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hvals(...\\func_get_args());\n    }\n\n    public function incr($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\\func_get_args());\n    }\n\n    public function incrby($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrby(...\\func_get_args());\n    }\n\n    public function incrbyfloat($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrbyfloat(...\\func_get_args());\n    }\n\n    public function info($key_or_address, $option = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\\func_get_args());\n    }\n\n    public function keys($pattern)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\\func_get_args());\n    }\n\n    public function lastsave($key_or_address)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastsave(...\\func_get_args());\n    }\n\n    public function lget($key, $index)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lget(...\\func_get_args());\n    }\n\n    public function lindex($key, $index)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\\func_get_args());\n    }\n\n    public function linsert($key, $position, $pivot, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->linsert(...\\func_get_args());\n    }\n\n    public function llen($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->llen(...\\func_get_args());\n    }\n\n    public function lpop($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpop(...\\func_get_args());\n    }\n\n    public function lpush($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpush(...\\func_get_args());\n    }\n\n    public function lpushx($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpushx(...\\func_get_args());\n    }\n\n    public function lrange($key, $start, $end)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\\func_get_args());\n    }\n\n    public function lrem($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\\func_get_args());\n    }\n\n    public function lset($key, $index, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lset(...\\func_get_args());\n    }\n\n    public function ltrim($key, $start, $stop)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\\func_get_args());\n    }\n\n    public function mget($keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\\func_get_args());\n    }\n\n    public function mset($pairs)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\\func_get_args());\n    }\n\n    public function msetnx($pairs)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\\func_get_args());\n    }\n\n    public function multi()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\\func_get_args());\n    }\n\n    public function object($field, $key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\\func_get_args());\n    }\n\n    public function persist($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\\func_get_args());\n    }\n\n    public function pexpire($key, $timestamp)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\\func_get_args());\n    }\n\n    public function pexpireat($key, $timestamp)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireat(...\\func_get_args());\n    }\n\n    public function pfadd($key, $elements)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\\func_get_args());\n    }\n\n    public function pfcount($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\\func_get_args());\n    }\n\n    public function pfmerge($dstkey, $keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\\func_get_args());\n    }\n\n    public function ping($key_or_address)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\\func_get_args());\n    }\n\n    public function psetex($key, $expire, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\\func_get_args());\n    }\n\n    public function psubscribe($patterns, $callback)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\\func_get_args());\n    }\n\n    public function pttl($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\\func_get_args());\n    }\n\n    public function publish($channel, $message)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\\func_get_args());\n    }\n\n    public function pubsub($key_or_address, $arg = null, ...$other_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\\func_get_args());\n    }\n\n    public function punsubscribe($pattern, ...$other_patterns)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\\func_get_args());\n    }\n\n    public function randomkey($key_or_address)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomkey(...\\func_get_args());\n    }\n\n    public function rawcommand($cmd, ...$args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\\func_get_args());\n    }\n\n    public function rename($key, $newkey)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\\func_get_args());\n    }\n\n    public function renamenx($key, $newkey)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renamenx(...\\func_get_args());\n    }\n\n    public function restore($ttl, $key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\\func_get_args());\n    }\n\n    public function role()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\\func_get_args());\n    }\n\n    public function rpop($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpop(...\\func_get_args());\n    }\n\n    public function rpoplpush($src, $dst)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\\func_get_args());\n    }\n\n    public function rpush($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpush(...\\func_get_args());\n    }\n\n    public function rpushx($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpushx(...\\func_get_args());\n    }\n\n    public function sadd($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sadd(...\\func_get_args());\n    }\n\n    public function saddarray($key, $options)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->saddarray(...\\func_get_args());\n    }\n\n    public function save($key_or_address)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\\func_get_args());\n    }\n\n    public function scan(&$i_iterator, $str_node, $str_pattern = null, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($i_iterator, ...\\array_slice(\\func_get_args(), 1));\n    }\n\n    public function scard($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\\func_get_args());\n    }\n\n    public function script($key_or_address, $arg = null, ...$other_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\\func_get_args());\n    }\n\n    public function sdiff($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiff(...\\func_get_args());\n    }\n\n    public function sdiffstore($dst, $key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiffstore(...\\func_get_args());\n    }\n\n    public function set($key, $value, $opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\\func_get_args());\n    }\n\n    public function setbit($key, $offset, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setbit(...\\func_get_args());\n    }\n\n    public function setex($key, $expire, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\\func_get_args());\n    }\n\n    public function setnx($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\\func_get_args());\n    }\n\n    public function setoption($option, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setoption(...\\func_get_args());\n    }\n\n    public function setrange($key, $offset, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setrange(...\\func_get_args());\n    }\n\n    public function sinter($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinter(...\\func_get_args());\n    }\n\n    public function sinterstore($dst, $key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinterstore(...\\func_get_args());\n    }\n\n    public function sismember($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\\func_get_args());\n    }\n\n    public function slowlog($key_or_address, $arg = null, ...$other_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\\func_get_args());\n    }\n\n    public function smembers($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smembers(...\\func_get_args());\n    }\n\n    public function smove($src, $dst, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smove(...\\func_get_args());\n    }\n\n    public function sort($key, $options = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\\func_get_args());\n    }\n\n    public function spop($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spop(...\\func_get_args());\n    }\n\n    public function srandmember($key, $count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srandmember(...\\func_get_args());\n    }\n\n    public function srem($key, $value)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\\func_get_args());\n    }\n\n    public function sscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($str_key, $i_iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function strlen($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\\func_get_args());\n    }\n\n    public function subscribe($channels, $callback)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\\func_get_args());\n    }\n\n    public function sunion($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunion(...\\func_get_args());\n    }\n\n    public function sunionstore($dst, $key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunionstore(...\\func_get_args());\n    }\n\n    public function time()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\\func_get_args());\n    }\n\n    public function ttl($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\\func_get_args());\n    }\n\n    public function type($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\\func_get_args());\n    }\n\n    public function unsubscribe($channel, ...$other_channels)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\\func_get_args());\n    }\n\n    public function unlink($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\\func_get_args());\n    }\n\n    public function unwatch()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\\func_get_args());\n    }\n\n    public function watch($key, ...$other_keys)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\\func_get_args());\n    }\n\n    public function xack($str_key, $str_group, $arr_ids)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\\func_get_args());\n    }\n\n    public function xadd($str_key, $str_id, $arr_fields, $i_maxlen = null, $boo_approximate = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\\func_get_args());\n    }\n\n    public function xclaim($str_key, $str_group, $str_consumer, $i_min_idle, $arr_ids, $arr_opts = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\\func_get_args());\n    }\n\n    public function xdel($str_key, $arr_ids)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\\func_get_args());\n    }\n\n    public function xgroup($str_operation, $str_key = null, $str_arg1 = null, $str_arg2 = null, $str_arg3 = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\\func_get_args());\n    }\n\n    public function xinfo($str_cmd, $str_key = null, $str_group = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\\func_get_args());\n    }\n\n    public function xlen($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\\func_get_args());\n    }\n\n    public function xpending($str_key, $str_group, $str_start = null, $str_end = null, $i_count = null, $str_consumer = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\\func_get_args());\n    }\n\n    public function xrange($str_key, $str_start, $str_end, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\\func_get_args());\n    }\n\n    public function xread($arr_streams, $i_count = null, $i_block = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\\func_get_args());\n    }\n\n    public function xreadgroup($str_group, $str_consumer, $arr_streams, $i_count = null, $i_block = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\\func_get_args());\n    }\n\n    public function xrevrange($str_key, $str_start, $str_end, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\\func_get_args());\n    }\n\n    public function xtrim($str_key, $i_maxlen, $boo_approximate = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\\func_get_args());\n    }\n\n    public function zadd($key, $score, $value, ...$extra_args)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zadd(...\\func_get_args());\n    }\n\n    public function zcard($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcard(...\\func_get_args());\n    }\n\n    public function zcount($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcount(...\\func_get_args());\n    }\n\n    public function zincrby($key, $value, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zincrby(...\\func_get_args());\n    }\n\n    public function zinterstore($key, $keys, $weights = null, $aggregate = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\\func_get_args());\n    }\n\n    public function zlexcount($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zlexcount(...\\func_get_args());\n    }\n\n    public function zpopmax($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmax(...\\func_get_args());\n    }\n\n    public function zpopmin($key)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmin(...\\func_get_args());\n    }\n\n    public function zrange($key, $start, $end, $scores = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrange(...\\func_get_args());\n    }\n\n    public function zrangebylex($key, $min, $max, $offset = null, $limit = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebylex(...\\func_get_args());\n    }\n\n    public function zrangebyscore($key, $start, $end, $options = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebyscore(...\\func_get_args());\n    }\n\n    public function zrank($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\\func_get_args());\n    }\n\n    public function zrem($key, $member, ...$other_members)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrem(...\\func_get_args());\n    }\n\n    public function zremrangebylex($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebylex(...\\func_get_args());\n    }\n\n    public function zremrangebyrank($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyrank(...\\func_get_args());\n    }\n\n    public function zremrangebyscore($key, $min, $max)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyscore(...\\func_get_args());\n    }\n\n    public function zrevrange($key, $start, $end, $scores = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrange(...\\func_get_args());\n    }\n\n    public function zrevrangebylex($key, $min, $max, $offset = null, $limit = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebylex(...\\func_get_args());\n    }\n\n    public function zrevrangebyscore($key, $start, $end, $options = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebyscore(...\\func_get_args());\n    }\n\n    public function zrevrank($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\\func_get_args());\n    }\n\n    public function zscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($str_key, $i_iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function zscore($key, $member)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\\func_get_args());\n    }\n\n    public function zunionstore($key, $keys, $weights = null, $aggregate = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\\func_get_args());\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/RedisCluster6Proxy.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nuse Symfony\\Component\\VarExporter\\LazyObjectInterface;\nuse Symfony\\Component\\VarExporter\\LazyProxyTrait;\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\Hydrator::class);\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry::class);\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState::class);\n\n/**\n * @internal\n */\nclass RedisCluster6Proxy extends \\RedisCluster implements ResetInterface, LazyObjectInterface\n{\n    use LazyProxyTrait {\n        resetLazyObject as reset;\n    }\n\n    private const LAZY_OBJECT_PROPERTY_SCOPES = [];\n\n    public function __construct($name, $seeds = null, $timeout = 0, $read_timeout = 0, $persistent = false, #[\\SensitiveParameter] $auth = null, $context = null)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\\func_get_args());\n    }\n\n    public function _compress($value): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\\func_get_args());\n    }\n\n    public function _uncompress($value): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\\func_get_args());\n    }\n\n    public function _serialize($value): bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\\func_get_args());\n    }\n\n    public function _unserialize($value): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\\func_get_args());\n    }\n\n    public function _pack($value): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\\func_get_args());\n    }\n\n    public function _unpack($value): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\\func_get_args());\n    }\n\n    public function _prefix($key): bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\\func_get_args());\n    }\n\n    public function _masters(): array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_masters(...\\func_get_args());\n    }\n\n    public function _redir(): ?string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_redir(...\\func_get_args());\n    }\n\n    public function acl($key_or_address, $subcmd, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\\func_get_args());\n    }\n\n    public function append($key, $value): \\RedisCluster|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\\func_get_args());\n    }\n\n    public function bgrewriteaof($key_or_address): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\\func_get_args());\n    }\n\n    public function bgsave($key_or_address): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\\func_get_args());\n    }\n\n    public function bitcount($key, $start = 0, $end = -1, $bybit = false): \\RedisCluster|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\\func_get_args());\n    }\n\n    public function bitop($operation, $deskey, $srckey, ...$otherkeys): \\RedisCluster|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\\func_get_args());\n    }\n\n    public function bitpos($key, $bit, $start = 0, $end = -1, $bybit = false): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\\func_get_args());\n    }\n\n    public function blpop($key, $timeout_or_key, ...$extra_args): \\RedisCluster|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blpop(...\\func_get_args());\n    }\n\n    public function brpop($key, $timeout_or_key, ...$extra_args): \\RedisCluster|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpop(...\\func_get_args());\n    }\n\n    public function brpoplpush($srckey, $deskey, $timeout): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\\func_get_args());\n    }\n\n    public function lmove($src, $dst, $wherefrom, $whereto): \\Redis|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmove(...\\func_get_args());\n    }\n\n    public function blmove($src, $dst, $wherefrom, $whereto, $timeout): \\Redis|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\\func_get_args());\n    }\n\n    public function bzpopmax($key, $timeout_or_key, ...$extra_args): array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmax(...\\func_get_args());\n    }\n\n    public function bzpopmin($key, $timeout_or_key, ...$extra_args): array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmin(...\\func_get_args());\n    }\n\n    public function bzmpop($timeout, $keys, $from, $count = 1): \\RedisCluster|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzmpop(...\\func_get_args());\n    }\n\n    public function zmpop($keys, $from, $count = 1): \\RedisCluster|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmpop(...\\func_get_args());\n    }\n\n    public function blmpop($timeout, $keys, $from, $count = 1): \\RedisCluster|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmpop(...\\func_get_args());\n    }\n\n    public function lmpop($keys, $from, $count = 1): \\RedisCluster|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmpop(...\\func_get_args());\n    }\n\n    public function clearlasterror(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearlasterror(...\\func_get_args());\n    }\n\n    public function client($key_or_address, $subcommand, $arg = null): array|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\\func_get_args());\n    }\n\n    public function close(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\\func_get_args());\n    }\n\n    public function cluster($key_or_address, $command, ...$extra_args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cluster(...\\func_get_args());\n    }\n\n    public function command(...$extra_args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\\func_get_args());\n    }\n\n    public function config($key_or_address, $subcommand, ...$extra_args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\\func_get_args());\n    }\n\n    public function dbsize($key_or_address): \\RedisCluster|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbsize(...\\func_get_args());\n    }\n\n    public function copy($src, $dst, $options = null): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\\func_get_args());\n    }\n\n    public function decr($key, $by = 1): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\\func_get_args());\n    }\n\n    public function decrby($key, $value): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrby(...\\func_get_args());\n    }\n\n    public function decrbyfloat($key, $value): float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrbyfloat(...\\func_get_args());\n    }\n\n    public function del($key, ...$other_keys): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\\func_get_args());\n    }\n\n    public function discard(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\\func_get_args());\n    }\n\n    public function dump($key): \\RedisCluster|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\\func_get_args());\n    }\n\n    public function echo($key_or_address, $msg): \\RedisCluster|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\\func_get_args());\n    }\n\n    public function eval($script, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\\func_get_args());\n    }\n\n    public function eval_ro($script, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval_ro(...\\func_get_args());\n    }\n\n    public function evalsha($script_sha, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\\func_get_args());\n    }\n\n    public function evalsha_ro($script_sha, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha_ro(...\\func_get_args());\n    }\n\n    public function exec(): array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\\func_get_args());\n    }\n\n    public function exists($key, ...$other_keys): \\RedisCluster|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\\func_get_args());\n    }\n\n    public function touch($key, ...$other_keys): \\RedisCluster|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->touch(...\\func_get_args());\n    }\n\n    public function expire($key, $timeout, $mode = null): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\\func_get_args());\n    }\n\n    public function expireat($key, $timestamp, $mode = null): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireat(...\\func_get_args());\n    }\n\n    public function expiretime($key): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expiretime(...\\func_get_args());\n    }\n\n    public function pexpiretime($key): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpiretime(...\\func_get_args());\n    }\n\n    public function flushall($key_or_address, $async = false): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushall(...\\func_get_args());\n    }\n\n    public function flushdb($key_or_address, $async = false): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushdb(...\\func_get_args());\n    }\n\n    public function geoadd($key, $lng, $lat, $member, ...$other_triples_and_options): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\\func_get_args());\n    }\n\n    public function geodist($key, $src, $dest, $unit = null): \\RedisCluster|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\\func_get_args());\n    }\n\n    public function geohash($key, $member, ...$other_members): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\\func_get_args());\n    }\n\n    public function geopos($key, $member, ...$other_members): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\\func_get_args());\n    }\n\n    public function georadius($key, $lng, $lat, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\\func_get_args());\n    }\n\n    public function georadius_ro($key, $lng, $lat, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\\func_get_args());\n    }\n\n    public function georadiusbymember($key, $member, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\\func_get_args());\n    }\n\n    public function georadiusbymember_ro($key, $member, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\\func_get_args());\n    }\n\n    public function geosearch($key, $position, $shape, $unit, $options = []): \\RedisCluster|array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\\func_get_args());\n    }\n\n    public function geosearchstore($dst, $src, $position, $shape, $unit, $options = []): \\RedisCluster|array|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearchstore(...\\func_get_args());\n    }\n\n    public function get($key): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\\func_get_args());\n    }\n\n    public function getbit($key, $value): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getbit(...\\func_get_args());\n    }\n\n    public function getlasterror(): ?string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getlasterror(...\\func_get_args());\n    }\n\n    public function getmode(): int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getmode(...\\func_get_args());\n    }\n\n    public function getoption($option): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getoption(...\\func_get_args());\n    }\n\n    public function getrange($key, $start, $end): \\RedisCluster|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\\func_get_args());\n    }\n\n    public function lcs($key1, $key2, $options = null): \\RedisCluster|array|false|int|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lcs(...\\func_get_args());\n    }\n\n    public function getset($key, $value): \\RedisCluster|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\\func_get_args());\n    }\n\n    public function gettransferredbytes(): array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->gettransferredbytes(...\\func_get_args());\n    }\n\n    public function cleartransferredbytes(): void\n    {\n        ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cleartransferredbytes(...\\func_get_args());\n    }\n\n    public function hdel($key, $member, ...$other_members): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hdel(...\\func_get_args());\n    }\n\n    public function hexists($key, $member): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexists(...\\func_get_args());\n    }\n\n    public function hget($key, $member): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hget(...\\func_get_args());\n    }\n\n    public function hgetall($key): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetall(...\\func_get_args());\n    }\n\n    public function hincrby($key, $member, $value): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrby(...\\func_get_args());\n    }\n\n    public function hincrbyfloat($key, $member, $value): \\RedisCluster|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrbyfloat(...\\func_get_args());\n    }\n\n    public function hkeys($key): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hkeys(...\\func_get_args());\n    }\n\n    public function hlen($key): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hlen(...\\func_get_args());\n    }\n\n    public function hmget($key, $keys): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmget(...\\func_get_args());\n    }\n\n    public function hmset($key, $key_values): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmset(...\\func_get_args());\n    }\n\n    public function hscan($key, &$iterator, $pattern = null, $count = 0): array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($key, $iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function hrandfield($key, $options = null): \\RedisCluster|array|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hrandfield(...\\func_get_args());\n    }\n\n    public function hset($key, $member, $value): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\\func_get_args());\n    }\n\n    public function hsetnx($key, $member, $value): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hsetnx(...\\func_get_args());\n    }\n\n    public function hstrlen($key, $field): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hstrlen(...\\func_get_args());\n    }\n\n    public function hvals($key): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hvals(...\\func_get_args());\n    }\n\n    public function incr($key, $by = 1): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\\func_get_args());\n    }\n\n    public function incrby($key, $value): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrby(...\\func_get_args());\n    }\n\n    public function incrbyfloat($key, $value): \\RedisCluster|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrbyfloat(...\\func_get_args());\n    }\n\n    public function info($key_or_address, ...$sections): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\\func_get_args());\n    }\n\n    public function keys($pattern): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\\func_get_args());\n    }\n\n    public function lastsave($key_or_address): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastsave(...\\func_get_args());\n    }\n\n    public function lget($key, $index): \\RedisCluster|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lget(...\\func_get_args());\n    }\n\n    public function lindex($key, $index): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\\func_get_args());\n    }\n\n    public function linsert($key, $pos, $pivot, $value): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->linsert(...\\func_get_args());\n    }\n\n    public function llen($key): \\RedisCluster|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->llen(...\\func_get_args());\n    }\n\n    public function lpop($key, $count = 0): \\RedisCluster|array|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpop(...\\func_get_args());\n    }\n\n    public function lpos($key, $value, $options = null): \\Redis|array|bool|int|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpos(...\\func_get_args());\n    }\n\n    public function lpush($key, $value, ...$other_values): \\RedisCluster|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpush(...\\func_get_args());\n    }\n\n    public function lpushx($key, $value): \\RedisCluster|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpushx(...\\func_get_args());\n    }\n\n    public function lrange($key, $start, $end): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\\func_get_args());\n    }\n\n    public function lrem($key, $value, $count = 0): \\RedisCluster|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\\func_get_args());\n    }\n\n    public function lset($key, $index, $value): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lset(...\\func_get_args());\n    }\n\n    public function ltrim($key, $start, $end): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\\func_get_args());\n    }\n\n    public function mget($keys): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\\func_get_args());\n    }\n\n    public function mset($key_values): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\\func_get_args());\n    }\n\n    public function msetnx($key_values): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\\func_get_args());\n    }\n\n    public function multi($value = \\Redis::MULTI): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\\func_get_args());\n    }\n\n    public function object($subcommand, $key): \\RedisCluster|false|int|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\\func_get_args());\n    }\n\n    public function persist($key): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\\func_get_args());\n    }\n\n    public function pexpire($key, $timeout, $mode = null): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\\func_get_args());\n    }\n\n    public function pexpireat($key, $timestamp, $mode = null): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireat(...\\func_get_args());\n    }\n\n    public function pfadd($key, $elements): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\\func_get_args());\n    }\n\n    public function pfcount($key): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\\func_get_args());\n    }\n\n    public function pfmerge($key, $keys): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\\func_get_args());\n    }\n\n    public function ping($key_or_address, $message = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\\func_get_args());\n    }\n\n    public function psetex($key, $timeout, $value): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\\func_get_args());\n    }\n\n    public function psubscribe($patterns, $callback): void\n    {\n        ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\\func_get_args());\n    }\n\n    public function pttl($key): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\\func_get_args());\n    }\n\n    public function publish($channel, $message): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\\func_get_args());\n    }\n\n    public function pubsub($key_or_address, ...$values): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\\func_get_args());\n    }\n\n    public function punsubscribe($pattern, ...$other_patterns): array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\\func_get_args());\n    }\n\n    public function randomkey($key_or_address): \\RedisCluster|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomkey(...\\func_get_args());\n    }\n\n    public function rawcommand($key_or_address, $command, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\\func_get_args());\n    }\n\n    public function rename($key_src, $key_dst): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\\func_get_args());\n    }\n\n    public function renamenx($key, $newkey): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renamenx(...\\func_get_args());\n    }\n\n    public function restore($key, $timeout, $value, $options = null): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\\func_get_args());\n    }\n\n    public function role($key_or_address): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\\func_get_args());\n    }\n\n    public function rpop($key, $count = 0): \\RedisCluster|array|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpop(...\\func_get_args());\n    }\n\n    public function rpoplpush($src, $dst): \\RedisCluster|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\\func_get_args());\n    }\n\n    public function rpush($key, ...$elements): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpush(...\\func_get_args());\n    }\n\n    public function rpushx($key, $value): \\RedisCluster|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpushx(...\\func_get_args());\n    }\n\n    public function sadd($key, $value, ...$other_values): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sadd(...\\func_get_args());\n    }\n\n    public function saddarray($key, $values): \\RedisCluster|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->saddarray(...\\func_get_args());\n    }\n\n    public function save($key_or_address): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\\func_get_args());\n    }\n\n    public function scan(&$iterator, $key_or_address, $pattern = null, $count = 0): array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($iterator, ...\\array_slice(\\func_get_args(), 1));\n    }\n\n    public function scard($key): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\\func_get_args());\n    }\n\n    public function script($key_or_address, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\\func_get_args());\n    }\n\n    public function sdiff($key, ...$other_keys): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiff(...\\func_get_args());\n    }\n\n    public function sdiffstore($dst, $key, ...$other_keys): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiffstore(...\\func_get_args());\n    }\n\n    public function set($key, $value, $options = null): \\RedisCluster|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\\func_get_args());\n    }\n\n    public function setbit($key, $offset, $onoff): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setbit(...\\func_get_args());\n    }\n\n    public function setex($key, $expire, $value): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\\func_get_args());\n    }\n\n    public function setnx($key, $value): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\\func_get_args());\n    }\n\n    public function setoption($option, $value): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setoption(...\\func_get_args());\n    }\n\n    public function setrange($key, $offset, $value): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setrange(...\\func_get_args());\n    }\n\n    public function sinter($key, ...$other_keys): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinter(...\\func_get_args());\n    }\n\n    public function sintercard($keys, $limit = -1): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sintercard(...\\func_get_args());\n    }\n\n    public function sinterstore($key, ...$other_keys): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinterstore(...\\func_get_args());\n    }\n\n    public function sismember($key, $value): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\\func_get_args());\n    }\n\n    public function smismember($key, $member, ...$other_members): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smismember(...\\func_get_args());\n    }\n\n    public function slowlog($key_or_address, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\\func_get_args());\n    }\n\n    public function smembers($key): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smembers(...\\func_get_args());\n    }\n\n    public function smove($src, $dst, $member): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smove(...\\func_get_args());\n    }\n\n    public function sort($key, $options = null): \\RedisCluster|array|bool|int|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\\func_get_args());\n    }\n\n    public function sort_ro($key, $options = null): \\RedisCluster|array|bool|int|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort_ro(...\\func_get_args());\n    }\n\n    public function spop($key, $count = 0): \\RedisCluster|array|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spop(...\\func_get_args());\n    }\n\n    public function srandmember($key, $count = 0): \\RedisCluster|array|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srandmember(...\\func_get_args());\n    }\n\n    public function srem($key, $value, ...$other_values): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\\func_get_args());\n    }\n\n    public function sscan($key, &$iterator, $pattern = null, $count = 0): array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($key, $iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function strlen($key): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\\func_get_args());\n    }\n\n    public function subscribe($channels, $cb): void\n    {\n        ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\\func_get_args());\n    }\n\n    public function sunion($key, ...$other_keys): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunion(...\\func_get_args());\n    }\n\n    public function sunionstore($dst, $key, ...$other_keys): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunionstore(...\\func_get_args());\n    }\n\n    public function time($key_or_address): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\\func_get_args());\n    }\n\n    public function ttl($key): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\\func_get_args());\n    }\n\n    public function type($key): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\\func_get_args());\n    }\n\n    public function unsubscribe($channels): array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\\func_get_args());\n    }\n\n    public function unlink($key, ...$other_keys): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\\func_get_args());\n    }\n\n    public function unwatch(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\\func_get_args());\n    }\n\n    public function watch($key, ...$other_keys): \\RedisCluster|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\\func_get_args());\n    }\n\n    public function xack($key, $group, $ids): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\\func_get_args());\n    }\n\n    public function xadd($key, $id, $values, $maxlen = 0, $approx = false): \\RedisCluster|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\\func_get_args());\n    }\n\n    public function xclaim($key, $group, $consumer, $min_iddle, $ids, $options): \\RedisCluster|array|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\\func_get_args());\n    }\n\n    public function xdel($key, $ids): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\\func_get_args());\n    }\n\n    public function xgroup($operation, $key = null, $group = null, $id_or_consumer = null, $mkstream = false, $entries_read = -2): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\\func_get_args());\n    }\n\n    public function xautoclaim($key, $group, $consumer, $min_idle, $start, $count = -1, $justid = false): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xautoclaim(...\\func_get_args());\n    }\n\n    public function xinfo($operation, $arg1 = null, $arg2 = null, $count = -1): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\\func_get_args());\n    }\n\n    public function xlen($key): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\\func_get_args());\n    }\n\n    public function xpending($key, $group, $start = null, $end = null, $count = -1, $consumer = null): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\\func_get_args());\n    }\n\n    public function xrange($key, $start, $end, $count = -1): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\\func_get_args());\n    }\n\n    public function xread($streams, $count = -1, $block = -1): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\\func_get_args());\n    }\n\n    public function xreadgroup($group, $consumer, $streams, $count = 1, $block = 1): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\\func_get_args());\n    }\n\n    public function xrevrange($key, $start, $end, $count = -1): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\\func_get_args());\n    }\n\n    public function xtrim($key, $maxlen, $approx = false, $minid = false, $limit = -1): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\\func_get_args());\n    }\n\n    public function zadd($key, $score_or_options, ...$more_scores_and_mems): \\RedisCluster|false|float|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zadd(...\\func_get_args());\n    }\n\n    public function zcard($key): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcard(...\\func_get_args());\n    }\n\n    public function zcount($key, $start, $end): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcount(...\\func_get_args());\n    }\n\n    public function zincrby($key, $value, $member): \\RedisCluster|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zincrby(...\\func_get_args());\n    }\n\n    public function zinterstore($dst, $keys, $weights = null, $aggregate = null): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\\func_get_args());\n    }\n\n    public function zintercard($keys, $limit = -1): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zintercard(...\\func_get_args());\n    }\n\n    public function zlexcount($key, $min, $max): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zlexcount(...\\func_get_args());\n    }\n\n    public function zpopmax($key, $value = null): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmax(...\\func_get_args());\n    }\n\n    public function zpopmin($key, $value = null): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmin(...\\func_get_args());\n    }\n\n    public function zrange($key, $start, $end, $options = null): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrange(...\\func_get_args());\n    }\n\n    public function zrangestore($dstkey, $srckey, $start, $end, $options = null): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangestore(...\\func_get_args());\n    }\n\n    public function zrandmember($key, $options = null): \\RedisCluster|array|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrandmember(...\\func_get_args());\n    }\n\n    public function zrangebylex($key, $min, $max, $offset = -1, $count = -1): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebylex(...\\func_get_args());\n    }\n\n    public function zrangebyscore($key, $start, $end, $options = []): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebyscore(...\\func_get_args());\n    }\n\n    public function zrank($key, $member): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\\func_get_args());\n    }\n\n    public function zrem($key, $value, ...$other_values): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrem(...\\func_get_args());\n    }\n\n    public function zremrangebylex($key, $min, $max): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebylex(...\\func_get_args());\n    }\n\n    public function zremrangebyrank($key, $min, $max): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyrank(...\\func_get_args());\n    }\n\n    public function zremrangebyscore($key, $min, $max): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyscore(...\\func_get_args());\n    }\n\n    public function zrevrange($key, $min, $max, $options = null): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrange(...\\func_get_args());\n    }\n\n    public function zrevrangebylex($key, $min, $max, $options = null): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebylex(...\\func_get_args());\n    }\n\n    public function zrevrangebyscore($key, $min, $max, $options = null): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebyscore(...\\func_get_args());\n    }\n\n    public function zrevrank($key, $member): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\\func_get_args());\n    }\n\n    public function zscan($key, &$iterator, $pattern = null, $count = 0): \\RedisCluster|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($key, $iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function zscore($key, $member): \\RedisCluster|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\\func_get_args());\n    }\n\n    public function zmscore($key, $member, ...$other_members): \\Redis|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmscore(...\\func_get_args());\n    }\n\n    public function zunionstore($dst, $keys, $weights = null, $aggregate = null): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\\func_get_args());\n    }\n\n    public function zinter($keys, $weights = null, $options = null): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinter(...\\func_get_args());\n    }\n\n    public function zdiffstore($dst, $keys): \\RedisCluster|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiffstore(...\\func_get_args());\n    }\n\n    public function zunion($keys, $weights = null, $options = null): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunion(...\\func_get_args());\n    }\n\n    public function zdiff($keys, $options = null): \\RedisCluster|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiff(...\\func_get_args());\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\n/**\n * This file acts as a wrapper to the \\RedisCluster implementation so it can accept the same type of calls as\n *  individual \\Redis objects.\n *\n * Calls are made to individual nodes via: RedisCluster->{method}($host, ...args)'\n *  according to https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#directed-node-commands\n *\n * @author Jack Thomas <jack.thomas@solidalpha.com>\n *\n * @internal\n */\nclass RedisClusterNodeProxy\n{\n    public function __construct(\n        private array $host,\n        private \\RedisCluster $redis,\n    ) {\n    }\n\n    public function __call(string $method, array $args)\n    {\n        return $this->redis->{$method}($this->host, ...$args);\n    }\n\n    public function scan(&$iIterator, $strPattern = null, $iCount = null)\n    {\n        return $this->redis->scan($iIterator, $this->host, $strPattern, $iCount);\n    }\n\n    public function getOption($name)\n    {\n        return $this->redis->getOption($name);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/RedisClusterProxy.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nclass_alias(6.0 <= (float) phpversion('redis') ? RedisCluster6Proxy::class : RedisCluster5Proxy::class, RedisClusterProxy::class);\n\nif (false) {\n    /**\n     * @internal\n     */\n    class RedisClusterProxy extends \\RedisCluster\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/RedisProxy.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nclass_alias(6.0 <= (float) phpversion('redis') ? Redis6Proxy::class : Redis5Proxy::class, RedisProxy::class);\n\nif (false) {\n    /**\n     * @internal\n     */\n    class RedisProxy extends \\Redis\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/RedisTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nuse Predis\\Command\\Redis\\UNLINK;\nuse Predis\\Connection\\Aggregate\\ClusterInterface;\nuse Predis\\Connection\\Aggregate\\RedisCluster;\nuse Predis\\Connection\\Aggregate\\ReplicationInterface;\nuse Predis\\Connection\\Cluster\\ClusterInterface as Predis2ClusterInterface;\nuse Predis\\Connection\\Cluster\\RedisCluster as Predis2RedisCluster;\nuse Predis\\Response\\ErrorInterface;\nuse Predis\\Response\\Status;\nuse Relay\\Relay;\nuse Relay\\Sentinel;\nuse Symfony\\Component\\Cache\\Exception\\CacheException;\nuse Symfony\\Component\\Cache\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller;\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\n\n/**\n * @author Aurimas Niekis <aurimas@niekis.lt>\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\ntrait RedisTrait\n{\n    private static array $defaultConnectionOptions = [\n        'class' => null,\n        'persistent' => 0,\n        'persistent_id' => null,\n        'timeout' => 30,\n        'read_timeout' => 0,\n        'retry_interval' => 0,\n        'tcp_keepalive' => 0,\n        'lazy' => null,\n        'redis_cluster' => false,\n        'redis_sentinel' => null,\n        'dbindex' => 0,\n        'failover' => 'none',\n        'ssl' => null, // see https://php.net/context.ssl\n    ];\n    private \\Redis|Relay|\\RedisArray|\\RedisCluster|\\Predis\\ClientInterface $redis;\n    private MarshallerInterface $marshaller;\n\n    private function init(\\Redis|Relay|\\RedisArray|\\RedisCluster|\\Predis\\ClientInterface $redis, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller): void\n    {\n        parent::__construct($namespace, $defaultLifetime);\n\n        if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) {\n            throw new InvalidArgumentException(sprintf('RedisAdapter namespace contains \"%s\" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0]));\n        }\n\n        if ($redis instanceof \\Predis\\ClientInterface && $redis->getOptions()->exceptions) {\n            $options = clone $redis->getOptions();\n            \\Closure::bind(function () { $this->options['exceptions'] = false; }, $options, $options)();\n            $redis = new $redis($redis->getConnection(), $options);\n        }\n\n        $this->redis = $redis;\n        $this->marshaller = $marshaller ?? new DefaultMarshaller();\n    }\n\n    /**\n     * Creates a Redis connection using a DSN configuration.\n     *\n     * Example DSN:\n     *   - redis://localhost\n     *   - redis://example.com:1234\n     *   - redis://secret@example.com/13\n     *   - redis:///var/run/redis.sock\n     *   - redis://secret@/var/run/redis.sock/13\n     *\n     * @param array $options See self::$defaultConnectionOptions\n     *\n     * @throws InvalidArgumentException when the DSN is invalid\n     */\n    public static function createConnection(#[\\SensitiveParameter] string $dsn, array $options = []): \\Redis|\\RedisArray|\\RedisCluster|\\Predis\\ClientInterface|Relay\n    {\n        if (str_starts_with($dsn, 'redis:')) {\n            $scheme = 'redis';\n        } elseif (str_starts_with($dsn, 'rediss:')) {\n            $scheme = 'rediss';\n        } else {\n            throw new InvalidArgumentException('Invalid Redis DSN: it does not start with \"redis[s]:\".');\n        }\n\n        if (!\\extension_loaded('redis') && !class_exists(\\Predis\\Client::class)) {\n            throw new CacheException('Cannot find the \"redis\" extension nor the \"predis/predis\" package.');\n        }\n\n        $params = preg_replace_callback('#^'.$scheme.':(//)?(?:(?:(?<user>[^:@]*+):)?(?<password>[^@]*+)@)?#', function ($m) use (&$auth) {\n            if (isset($m['password'])) {\n                if (\\in_array($m['user'], ['', 'default'], true)) {\n                    $auth = rawurldecode($m['password']);\n                } else {\n                    $auth = [rawurldecode($m['user']), rawurldecode($m['password'])];\n                }\n\n                if ('' === $auth) {\n                    $auth = null;\n                }\n            }\n\n            return 'file:'.($m[1] ?? '');\n        }, $dsn);\n\n        if (false === $params = parse_url($params)) {\n            throw new InvalidArgumentException('Invalid Redis DSN.');\n        }\n\n        $query = $hosts = [];\n\n        $tls = 'rediss' === $scheme;\n        $tcpScheme = $tls ? 'tls' : 'tcp';\n\n        if (isset($params['query'])) {\n            parse_str($params['query'], $query);\n\n            if (isset($query['host'])) {\n                if (!\\is_array($hosts = $query['host'])) {\n                    throw new InvalidArgumentException('Invalid Redis DSN: query parameter \"host\" must be an array.');\n                }\n                foreach ($hosts as $host => $parameters) {\n                    if (\\is_string($parameters)) {\n                        parse_str($parameters, $parameters);\n                    }\n                    if (false === $i = strrpos($host, ':')) {\n                        $hosts[$host] = ['scheme' => $tcpScheme, 'host' => $host, 'port' => 6379] + $parameters;\n                    } elseif ($port = (int) substr($host, 1 + $i)) {\n                        $hosts[$host] = ['scheme' => $tcpScheme, 'host' => substr($host, 0, $i), 'port' => $port] + $parameters;\n                    } else {\n                        $hosts[$host] = ['scheme' => 'unix', 'path' => substr($host, 0, $i)] + $parameters;\n                    }\n                }\n                $hosts = array_values($hosts);\n            }\n        }\n\n        if (isset($params['host']) || isset($params['path'])) {\n            if (!isset($params['dbindex']) && isset($params['path'])) {\n                if (preg_match('#/(\\d+)?$#', $params['path'], $m)) {\n                    $params['dbindex'] = $m[1] ?? '0';\n                    $params['path'] = substr($params['path'], 0, -\\strlen($m[0]));\n                } elseif (isset($params['host'])) {\n                    throw new InvalidArgumentException('Invalid Redis DSN: query parameter \"dbindex\" must be a number.');\n                }\n            }\n\n            if (isset($params['host'])) {\n                array_unshift($hosts, ['scheme' => $tcpScheme, 'host' => $params['host'], 'port' => $params['port'] ?? 6379]);\n            } else {\n                array_unshift($hosts, ['scheme' => 'unix', 'path' => $params['path']]);\n            }\n        }\n\n        if (!$hosts) {\n            throw new InvalidArgumentException('Invalid Redis DSN: missing host.');\n        }\n\n        $params += $query + $options + self::$defaultConnectionOptions;\n\n        if (isset($params['redis_sentinel']) && !class_exists(\\Predis\\Client::class) && !class_exists(\\RedisSentinel::class) && !class_exists(Sentinel::class)) {\n            throw new CacheException('Redis Sentinel support requires one of: \"predis/predis\", \"ext-redis >= 5.2\", \"ext-relay\".');\n        }\n\n        if (isset($params['lazy'])) {\n            $params['lazy'] = filter_var($params['lazy'], \\FILTER_VALIDATE_BOOLEAN);\n        }\n        $params['redis_cluster'] = filter_var($params['redis_cluster'], \\FILTER_VALIDATE_BOOLEAN);\n\n        if ($params['redis_cluster'] && isset($params['redis_sentinel'])) {\n            throw new InvalidArgumentException('Cannot use both \"redis_cluster\" and \"redis_sentinel\" at the same time.');\n        }\n\n        $class = $params['class'] ?? match (true) {\n            $params['redis_cluster'] => \\extension_loaded('redis') ? \\RedisCluster::class : \\Predis\\Client::class,\n            isset($params['redis_sentinel']) => match (true) {\n                \\extension_loaded('redis') => \\Redis::class,\n                \\extension_loaded('relay') => Relay::class,\n                default => \\Predis\\Client::class,\n            },\n            1 < \\count($hosts) && \\extension_loaded('redis') => 1 < \\count($hosts) ? \\RedisArray::class : \\Redis::class,\n            \\extension_loaded('redis') => \\Redis::class,\n            \\extension_loaded('relay') => Relay::class,\n            default => \\Predis\\Client::class,\n        };\n\n        if (isset($params['redis_sentinel']) && !is_a($class, \\Predis\\Client::class, true) && !class_exists(\\RedisSentinel::class) && !class_exists(Sentinel::class)) {\n            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));\n        }\n\n        $isRedisExt = is_a($class, \\Redis::class, true);\n        $isRelayExt = !$isRedisExt && is_a($class, Relay::class, true);\n\n        if ($isRedisExt || $isRelayExt) {\n            $connect = $params['persistent'] || $params['persistent_id'] ? 'pconnect' : 'connect';\n\n            $initializer = static function () use ($class, $isRedisExt, $connect, $params, $auth, $hosts, $tls) {\n                $sentinelClass = $isRedisExt ? \\RedisSentinel::class : Sentinel::class;\n                $redis = new $class();\n                $hostIndex = 0;\n                do {\n                    $host = $hosts[$hostIndex]['host'] ?? $hosts[$hostIndex]['path'];\n                    $port = $hosts[$hostIndex]['port'] ?? 0;\n                    $passAuth = isset($params['auth']) && (!$isRedisExt || \\defined('Redis::OPT_NULL_MULTIBULK_AS_NULL'));\n                    $address = false;\n\n                    if (isset($hosts[$hostIndex]['host']) && $tls) {\n                        $host = 'tls://'.$host;\n                    }\n\n                    if (!isset($params['redis_sentinel'])) {\n                        break;\n                    }\n\n                    try {\n                        if (version_compare(phpversion('redis'), '6.0.0', '>=') && $isRedisExt) {\n                            $options = [\n                                'host' => $host,\n                                'port' => $port,\n                                'connectTimeout' => $params['timeout'],\n                                'persistent' => $params['persistent_id'],\n                                'retryInterval' => $params['retry_interval'],\n                                'readTimeout' => $params['read_timeout'],\n                            ];\n\n                            if ($passAuth) {\n                                $options['auth'] = $params['auth'];\n                            }\n\n                            $sentinel = new \\RedisSentinel($options);\n                        } else {\n                            $extra = $passAuth ? [$params['auth']] : [];\n\n                            $sentinel = new $sentinelClass($host, $port, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...$extra);\n                        }\n\n                        if ($address = $sentinel->getMasterAddrByName($params['redis_sentinel'])) {\n                            [$host, $port] = $address;\n                        }\n                    } catch (\\RedisException|\\Relay\\Exception $redisException) {\n                    }\n                } while (++$hostIndex < \\count($hosts) && !$address);\n\n                if (isset($params['redis_sentinel']) && !$address) {\n                    throw new InvalidArgumentException(sprintf('Failed to retrieve master information from sentinel \"%s\".', $params['redis_sentinel']), previous: $redisException ?? null);\n                }\n\n                try {\n                    $extra = [\n                        'stream' => $params['ssl'] ?? null,\n                    ];\n                    $booleanStreamOptions = [\n                        'allow_self_signed',\n                        'capture_peer_cert',\n                        'capture_peer_cert_chain',\n                        'disable_compression',\n                        'SNI_enabled',\n                        'verify_peer',\n                        'verify_peer_name',\n                    ];\n\n                    foreach ($extra['stream'] ?? [] as $streamOption => $value) {\n                        if (\\in_array($streamOption, $booleanStreamOptions, true) && \\is_string($value)) {\n                            $extra['stream'][$streamOption] = filter_var($value, \\FILTER_VALIDATE_BOOL);\n                        }\n                    }\n\n                    if (isset($params['auth'])) {\n                        $extra['auth'] = $params['auth'];\n                    }\n                    @$redis->{$connect}($host, $port, (float) $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...\\defined('Redis::SCAN_PREFIX') || !$isRedisExt ? [$extra] : []);\n\n                    set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });\n                    try {\n                        $isConnected = $redis->isConnected();\n                    } finally {\n                        restore_error_handler();\n                    }\n                    if (!$isConnected) {\n                        $error = preg_match('/^Redis::p?connect\\(\\): (.*)/', $error ?? $redis->getLastError() ?? '', $error) ? sprintf(' (%s)', $error[1]) : '';\n                        throw new InvalidArgumentException('Redis connection failed: '.$error.'.');\n                    }\n\n                    if ((null !== $auth && !$redis->auth($auth))\n                        // Due to a bug in phpredis we must always select the dbindex if persistent pooling is enabled\n                        // @see https://github.com/phpredis/phpredis/issues/1920\n                        // @see https://github.com/symfony/symfony/issues/51578\n                        || (($params['dbindex'] || ('pconnect' === $connect && '0' !== \\ini_get('redis.pconnect.pooling_enabled'))) && !$redis->select($params['dbindex']))\n                    ) {\n                        $e = preg_replace('/^ERR /', '', $redis->getLastError());\n                        throw new InvalidArgumentException('Redis connection failed: '.$e.'.');\n                    }\n\n                    if (0 < $params['tcp_keepalive'] && (!$isRedisExt || \\defined('Redis::OPT_TCP_KEEPALIVE'))) {\n                        $redis->setOption($isRedisExt ? \\Redis::OPT_TCP_KEEPALIVE : Relay::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);\n                    }\n                } catch (\\RedisException|\\Relay\\Exception $e) {\n                    throw new InvalidArgumentException('Redis connection failed: '.$e->getMessage());\n                }\n\n                return $redis;\n            };\n\n            if ($params['lazy']) {\n                $redis = $isRedisExt ? RedisProxy::createLazyProxy($initializer) : RelayProxy::createLazyProxy($initializer);\n            } else {\n                $redis = $initializer();\n            }\n        } elseif (is_a($class, \\RedisArray::class, true)) {\n            foreach ($hosts as $i => $host) {\n                $hosts[$i] = match ($host['scheme']) {\n                    'tcp' => $host['host'].':'.$host['port'],\n                    'tls' => 'tls://'.$host['host'].':'.$host['port'],\n                    default => $host['path'],\n                };\n            }\n            $params['lazy_connect'] = $params['lazy'] ?? true;\n            $params['connect_timeout'] = $params['timeout'];\n\n            try {\n                $redis = new $class($hosts, $params);\n            } catch (\\RedisClusterException $e) {\n                throw new InvalidArgumentException('Redis connection failed: '.$e->getMessage());\n            }\n\n            if (0 < $params['tcp_keepalive'] && (!$isRedisExt || \\defined('Redis::OPT_TCP_KEEPALIVE'))) {\n                $redis->setOption($isRedisExt ? \\Redis::OPT_TCP_KEEPALIVE : Relay::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);\n            }\n        } elseif (is_a($class, \\RedisCluster::class, true)) {\n            $initializer = static function () use ($isRedisExt, $class, $params, $hosts) {\n                foreach ($hosts as $i => $host) {\n                    $hosts[$i] = match ($host['scheme']) {\n                        'tcp' => $host['host'].':'.$host['port'],\n                        'tls' => 'tls://'.$host['host'].':'.$host['port'],\n                        default => $host['path'],\n                    };\n                }\n\n                try {\n                    $redis = new $class(null, $hosts, $params['timeout'], $params['read_timeout'], (bool) $params['persistent'], $params['auth'] ?? '', ...\\defined('Redis::SCAN_PREFIX') ? [$params['ssl'] ?? null] : []);\n                } catch (\\RedisClusterException $e) {\n                    throw new InvalidArgumentException('Redis connection failed: '.$e->getMessage());\n                }\n\n                if (0 < $params['tcp_keepalive'] && (!$isRedisExt || \\defined('Redis::OPT_TCP_KEEPALIVE'))) {\n                    $redis->setOption($isRedisExt ? \\Redis::OPT_TCP_KEEPALIVE : Relay::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);\n                }\n                $redis->setOption(\\RedisCluster::OPT_SLAVE_FAILOVER, match ($params['failover']) {\n                    'error' => \\RedisCluster::FAILOVER_ERROR,\n                    'distribute' => \\RedisCluster::FAILOVER_DISTRIBUTE,\n                    'slaves' => \\RedisCluster::FAILOVER_DISTRIBUTE_SLAVES,\n                    'none' => \\RedisCluster::FAILOVER_NONE,\n                });\n\n                return $redis;\n            };\n\n            $redis = $params['lazy'] ? RedisClusterProxy::createLazyProxy($initializer) : $initializer();\n        } elseif (is_a($class, \\Predis\\ClientInterface::class, true)) {\n            if ($params['redis_cluster']) {\n                $params['cluster'] = 'redis';\n            } elseif (isset($params['redis_sentinel'])) {\n                $params['replication'] = 'sentinel';\n                $params['service'] = $params['redis_sentinel'];\n            }\n            $params += ['parameters' => []];\n            $params['parameters'] += [\n                'persistent' => $params['persistent'],\n                'timeout' => $params['timeout'],\n                'read_write_timeout' => $params['read_timeout'],\n                'tcp_nodelay' => true,\n            ];\n            if ($params['dbindex']) {\n                $params['parameters']['database'] = $params['dbindex'];\n            }\n            if (null !== $auth) {\n                if (\\is_array($auth)) {\n                    // ACL\n                    $params['parameters']['username'] = $auth[0];\n                    $params['parameters']['password'] = $auth[1];\n                } else {\n                    $params['parameters']['password'] = $auth;\n                }\n            }\n\n            if (isset($params['ssl'])) {\n                foreach ($hosts as $i => $host) {\n                    $hosts[$i]['ssl'] ??= $params['ssl'];\n                }\n            }\n\n            if (1 === \\count($hosts) && !($params['redis_cluster'] || $params['redis_sentinel'])) {\n                $hosts = $hosts[0];\n            } elseif (\\in_array($params['failover'], ['slaves', 'distribute'], true) && !isset($params['replication'])) {\n                $params['replication'] = true;\n                $hosts[0] += ['alias' => 'master'];\n            }\n            $params['exceptions'] = false;\n\n            $redis = new $class($hosts, array_diff_key($params, self::$defaultConnectionOptions));\n            if (isset($params['redis_sentinel'])) {\n                $redis->getConnection()->setSentinelTimeout($params['timeout']);\n            }\n        } elseif (class_exists($class, false)) {\n            throw new InvalidArgumentException(sprintf('\"%s\" is not a subclass of \"Redis\", \"RedisArray\", \"RedisCluster\", \"Relay\\Relay\" nor \"Predis\\ClientInterface\".', $class));\n        } else {\n            throw new InvalidArgumentException(sprintf('Class \"%s\" does not exist.', $class));\n        }\n\n        return $redis;\n    }\n\n    protected function doFetch(array $ids): iterable\n    {\n        if (!$ids) {\n            return [];\n        }\n\n        $result = [];\n\n        if ($this->redis instanceof \\Predis\\ClientInterface && ($this->redis->getConnection() instanceof ClusterInterface || $this->redis->getConnection() instanceof Predis2ClusterInterface)) {\n            $values = $this->pipeline(function () use ($ids) {\n                foreach ($ids as $id) {\n                    yield 'get' => [$id];\n                }\n            });\n        } else {\n            $values = $this->redis->mget($ids);\n\n            if (!\\is_array($values) || \\count($values) !== \\count($ids)) {\n                return [];\n            }\n\n            $values = array_combine($ids, $values);\n        }\n\n        foreach ($values as $id => $v) {\n            if ($v) {\n                $result[$id] = $this->marshaller->unmarshall($v);\n            }\n        }\n\n        return $result;\n    }\n\n    protected function doHave(string $id): bool\n    {\n        return (bool) $this->redis->exists($id);\n    }\n\n    protected function doClear(string $namespace): bool\n    {\n        if ($this->redis instanceof \\Predis\\ClientInterface) {\n            $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : '';\n            $prefixLen = \\strlen($prefix ?? '');\n        }\n\n        $cleared = true;\n        $hosts = $this->getHosts();\n        $host = reset($hosts);\n        if ($host instanceof \\Predis\\Client && $host->getConnection() instanceof ReplicationInterface) {\n            // Predis supports info command only on the master in replication environments\n            $hosts = [$host->getClientFor('master')];\n        }\n\n        foreach ($hosts as $host) {\n            if (!isset($namespace[0])) {\n                $cleared = $host->flushDb() && $cleared;\n                continue;\n            }\n\n            $info = $host->info('Server');\n            $info = !$info instanceof ErrorInterface ? $info['Server'] ?? $info : ['redis_version' => '2.0'];\n\n            if ($host instanceof Relay) {\n                $prefix = Relay::SCAN_PREFIX & $host->getOption(Relay::OPT_SCAN) ? '' : $host->getOption(Relay::OPT_PREFIX);\n                $prefixLen = \\strlen($host->getOption(Relay::OPT_PREFIX) ?? '');\n            } elseif (!$host instanceof \\Predis\\ClientInterface) {\n                $prefix = \\defined('Redis::SCAN_PREFIX') && (\\Redis::SCAN_PREFIX & $host->getOption(\\Redis::OPT_SCAN)) ? '' : $host->getOption(\\Redis::OPT_PREFIX);\n                $prefixLen = \\strlen($host->getOption(\\Redis::OPT_PREFIX) ?? '');\n            }\n            $pattern = $prefix.$namespace.'*';\n\n            if (!version_compare($info['redis_version'], '2.8', '>=')) {\n                // As documented in Redis documentation (http://redis.io/commands/keys) using KEYS\n                // can hang your server when it is executed against large databases (millions of items).\n                // Whenever you hit this scale, you should really consider upgrading to Redis 2.8 or above.\n                $unlink = version_compare($info['redis_version'], '4.0', '>=') ? 'UNLINK' : 'DEL';\n                $args = $this->redis instanceof \\Predis\\ClientInterface ? [0, $pattern] : [[$pattern], 0];\n                $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;\n                continue;\n            }\n\n            $cursor = null;\n            do {\n                $keys = $host instanceof \\Predis\\ClientInterface ? $host->scan($cursor, 'MATCH', $pattern, 'COUNT', 1000) : $host->scan($cursor, $pattern, 1000);\n                if (isset($keys[1]) && \\is_array($keys[1])) {\n                    $cursor = $keys[0];\n                    $keys = $keys[1];\n                }\n                if ($keys) {\n                    if ($prefixLen) {\n                        foreach ($keys as $i => $key) {\n                            $keys[$i] = substr($key, $prefixLen);\n                        }\n                    }\n                    $this->doDelete($keys);\n                }\n            } while ($cursor = (int) $cursor);\n        }\n\n        return $cleared;\n    }\n\n    protected function doDelete(array $ids): bool\n    {\n        if (!$ids) {\n            return true;\n        }\n\n        if ($this->redis instanceof \\Predis\\ClientInterface && ($this->redis->getConnection() instanceof ClusterInterface || $this->redis->getConnection() instanceof Predis2ClusterInterface)) {\n            static $del;\n            $del ??= (class_exists(UNLINK::class) ? 'unlink' : 'del');\n\n            $this->pipeline(function () use ($ids, $del) {\n                foreach ($ids as $id) {\n                    yield $del => [$id];\n                }\n            })->rewind();\n        } else {\n            static $unlink = true;\n\n            if ($unlink) {\n                try {\n                    $unlink = false !== $this->redis->unlink($ids);\n                } catch (\\Throwable) {\n                    $unlink = false;\n                }\n            }\n\n            if (!$unlink) {\n                $this->redis->del($ids);\n            }\n        }\n\n        return true;\n    }\n\n    protected function doSave(array $values, int $lifetime): array|bool\n    {\n        if (!$values = $this->marshaller->marshall($values, $failed)) {\n            return $failed;\n        }\n\n        $results = $this->pipeline(function () use ($values, $lifetime) {\n            foreach ($values as $id => $value) {\n                if (0 >= $lifetime) {\n                    yield 'set' => [$id, $value];\n                } else {\n                    yield 'setEx' => [$id, $lifetime, $value];\n                }\n            }\n        });\n\n        foreach ($results as $id => $result) {\n            if (true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) {\n                $failed[] = $id;\n            }\n        }\n\n        return $failed;\n    }\n\n    private function pipeline(\\Closure $generator, ?object $redis = null): \\Generator\n    {\n        $ids = [];\n        $redis ??= $this->redis;\n\n        if ($redis instanceof \\RedisCluster || ($redis instanceof \\Predis\\ClientInterface && ($redis->getConnection() instanceof RedisCluster || $redis->getConnection() instanceof Predis2RedisCluster))) {\n            // phpredis & predis don't support pipelining with RedisCluster\n            // see https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#pipelining\n            // see https://github.com/nrk/predis/issues/267#issuecomment-123781423\n            $results = [];\n            foreach ($generator() as $command => $args) {\n                $results[] = $redis->{$command}(...$args);\n                $ids[] = 'eval' === $command ? ($redis instanceof \\Predis\\ClientInterface ? $args[2] : $args[1][0]) : $args[0];\n            }\n        } elseif ($redis instanceof \\Predis\\ClientInterface) {\n            $results = $redis->pipeline(static function ($redis) use ($generator, &$ids) {\n                foreach ($generator() as $command => $args) {\n                    $redis->{$command}(...$args);\n                    $ids[] = 'eval' === $command ? $args[2] : $args[0];\n                }\n            });\n        } elseif ($redis instanceof \\RedisArray) {\n            $connections = $results = $ids = [];\n            foreach ($generator() as $command => $args) {\n                $id = 'eval' === $command ? $args[1][0] : $args[0];\n                if (!isset($connections[$h = $redis->_target($id)])) {\n                    $connections[$h] = [$redis->_instance($h), -1];\n                    $connections[$h][0]->multi(\\Redis::PIPELINE);\n                }\n                $connections[$h][0]->{$command}(...$args);\n                $results[] = [$h, ++$connections[$h][1]];\n                $ids[] = $id;\n            }\n            foreach ($connections as $h => $c) {\n                $connections[$h] = $c[0]->exec();\n            }\n            foreach ($results as $k => [$h, $c]) {\n                $results[$k] = $connections[$h][$c];\n            }\n        } else {\n            $redis->multi($redis instanceof Relay ? Relay::PIPELINE : \\Redis::PIPELINE);\n            foreach ($generator() as $command => $args) {\n                $redis->{$command}(...$args);\n                $ids[] = 'eval' === $command ? $args[1][0] : $args[0];\n            }\n            $results = $redis->exec();\n        }\n\n        if (!$redis instanceof \\Predis\\ClientInterface && 'eval' === $command && $redis->getLastError()) {\n            $e = $redis instanceof Relay ? new \\Relay\\Exception($redis->getLastError()) : new \\RedisException($redis->getLastError());\n            $results = array_map(fn ($v) => false === $v ? $e : $v, (array) $results);\n        }\n\n        if (\\is_bool($results)) {\n            return;\n        }\n\n        foreach ($ids as $k => $id) {\n            yield $id => $results[$k];\n        }\n    }\n\n    private function getHosts(): array\n    {\n        $hosts = [$this->redis];\n        if ($this->redis instanceof \\Predis\\ClientInterface) {\n            $connection = $this->redis->getConnection();\n            if (($connection instanceof ClusterInterface || $connection instanceof Predis2ClusterInterface) && $connection instanceof \\Traversable) {\n                $hosts = [];\n                foreach ($connection as $c) {\n                    $hosts[] = new \\Predis\\Client($c);\n                }\n            }\n        } elseif ($this->redis instanceof \\RedisArray) {\n            $hosts = [];\n            foreach ($this->redis->_hosts() as $host) {\n                $hosts[] = $this->redis->_instance($host);\n            }\n        } elseif ($this->redis instanceof \\RedisCluster) {\n            $hosts = [];\n            foreach ($this->redis->_masters() as $host) {\n                $hosts[] = new RedisClusterNodeProxy($host, $this->redis);\n            }\n        }\n\n        return $hosts;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/RelayProxy.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Cache\\Traits;\n\nuse Symfony\\Component\\VarExporter\\LazyObjectInterface;\nuse Symfony\\Component\\VarExporter\\LazyProxyTrait;\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\Hydrator::class);\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry::class);\nclass_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState::class);\n\n/**\n * @internal\n */\nclass RelayProxy extends \\Relay\\Relay implements ResetInterface, LazyObjectInterface\n{\n    use LazyProxyTrait {\n        resetLazyObject as reset;\n    }\n\n    private const LAZY_OBJECT_PROPERTY_SCOPES = [];\n\n    public function __construct($host = null, $port = 6379, $connect_timeout = 0.0, $command_timeout = 0.0, #[\\SensitiveParameter] $context = [], $database = 0)\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\\func_get_args());\n    }\n\n    public function connect($host, $port = 6379, $timeout = 0.0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0.0, #[\\SensitiveParameter] $context = [], $database = 0): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->connect(...\\func_get_args());\n    }\n\n    public function pconnect($host, $port = 6379, $timeout = 0.0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0.0, #[\\SensitiveParameter] $context = [], $database = 0): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pconnect(...\\func_get_args());\n    }\n\n    public function close(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\\func_get_args());\n    }\n\n    public function pclose(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pclose(...\\func_get_args());\n    }\n\n    public function listen($callback): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->listen(...\\func_get_args());\n    }\n\n    public function onFlushed($callback): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->onFlushed(...\\func_get_args());\n    }\n\n    public function onInvalidated($callback, $pattern = null): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->onInvalidated(...\\func_get_args());\n    }\n\n    public function dispatchEvents(): false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dispatchEvents(...\\func_get_args());\n    }\n\n    public function getOption($option): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getOption(...\\func_get_args());\n    }\n\n    public function option($option, $value = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->option(...\\func_get_args());\n    }\n\n    public function setOption($option, $value): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setOption(...\\func_get_args());\n    }\n\n    public function addIgnorePatterns(...$pattern): int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->addIgnorePatterns(...\\func_get_args());\n    }\n\n    public function addAllowPatterns(...$pattern): int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->addAllowPatterns(...\\func_get_args());\n    }\n\n    public function getTimeout(): false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTimeout(...\\func_get_args());\n    }\n\n    public function timeout(): false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->timeout(...\\func_get_args());\n    }\n\n    public function getReadTimeout(): false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getReadTimeout(...\\func_get_args());\n    }\n\n    public function readTimeout(): false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->readTimeout(...\\func_get_args());\n    }\n\n    public function getBytes(): array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getBytes(...\\func_get_args());\n    }\n\n    public function bytes(): array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bytes(...\\func_get_args());\n    }\n\n    public function getHost(): false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getHost(...\\func_get_args());\n    }\n\n    public function isConnected(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->isConnected(...\\func_get_args());\n    }\n\n    public function getPort(): false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPort(...\\func_get_args());\n    }\n\n    public function getAuth(): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getAuth(...\\func_get_args());\n    }\n\n    public function getDbNum(): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDbNum(...\\func_get_args());\n    }\n\n    public function _serialize($value): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\\func_get_args());\n    }\n\n    public function _unserialize($value): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\\func_get_args());\n    }\n\n    public function _compress($value): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\\func_get_args());\n    }\n\n    public function _uncompress($value): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\\func_get_args());\n    }\n\n    public function _pack($value): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\\func_get_args());\n    }\n\n    public function _unpack($value): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\\func_get_args());\n    }\n\n    public function _prefix($value): string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\\func_get_args());\n    }\n\n    public function getLastError(): ?string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getLastError(...\\func_get_args());\n    }\n\n    public function clearLastError(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearLastError(...\\func_get_args());\n    }\n\n    public function endpointId(): false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->endpointId(...\\func_get_args());\n    }\n\n    public function getPersistentID(): false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPersistentID(...\\func_get_args());\n    }\n\n    public function socketId(): false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->socketId(...\\func_get_args());\n    }\n\n    public function rawCommand($cmd, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawCommand(...\\func_get_args());\n    }\n\n    public function select($db): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->select(...\\func_get_args());\n    }\n\n    public function auth(#[\\SensitiveParameter] $auth): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->auth(...\\func_get_args());\n    }\n\n    public function info(...$sections): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\\func_get_args());\n    }\n\n    public function flushdb($sync = null): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushdb(...\\func_get_args());\n    }\n\n    public function flushall($sync = null): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushall(...\\func_get_args());\n    }\n\n    public function fcall($name, $keys = [], $argv = [], $handler = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall(...\\func_get_args());\n    }\n\n    public function fcall_ro($name, $keys = [], $argv = [], $handler = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall_ro(...\\func_get_args());\n    }\n\n    public function function($op, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->function(...\\func_get_args());\n    }\n\n    public function dbsize(): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbsize(...\\func_get_args());\n    }\n\n    public function dump($key): \\Relay\\Relay|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\\func_get_args());\n    }\n\n    public function replicaof($host = null, $port = 0): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->replicaof(...\\func_get_args());\n    }\n\n    public function restore($key, $ttl, $value, $options = null): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\\func_get_args());\n    }\n\n    public function migrate($host, $port, $key, $dstdb, $timeout, $copy = false, $replace = false, #[\\SensitiveParameter] $credentials = null): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->migrate(...\\func_get_args());\n    }\n\n    public function copy($src, $dst, $options = null): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\\func_get_args());\n    }\n\n    public function echo($arg): \\Relay\\Relay|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\\func_get_args());\n    }\n\n    public function ping($arg = null): \\Relay\\Relay|bool|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\\func_get_args());\n    }\n\n    public function idleTime(): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->idleTime(...\\func_get_args());\n    }\n\n    public function randomkey(): \\Relay\\Relay|bool|null|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomkey(...\\func_get_args());\n    }\n\n    public function time(): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\\func_get_args());\n    }\n\n    public function bgrewriteaof(): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\\func_get_args());\n    }\n\n    public function lastsave(): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastsave(...\\func_get_args());\n    }\n\n    public function lcs($key1, $key2, $options = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lcs(...\\func_get_args());\n    }\n\n    public function bgsave($schedule = false): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\\func_get_args());\n    }\n\n    public function save(): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\\func_get_args());\n    }\n\n    public function role(): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\\func_get_args());\n    }\n\n    public function ttl($key): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\\func_get_args());\n    }\n\n    public function pttl($key): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\\func_get_args());\n    }\n\n    public function exists(...$keys): \\Relay\\Relay|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\\func_get_args());\n    }\n\n    public function eval($script, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\\func_get_args());\n    }\n\n    public function eval_ro($script, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval_ro(...\\func_get_args());\n    }\n\n    public function evalsha($sha, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\\func_get_args());\n    }\n\n    public function evalsha_ro($sha, $args = [], $num_keys = 0): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha_ro(...\\func_get_args());\n    }\n\n    public function client($operation, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\\func_get_args());\n    }\n\n    public function geoadd($key, $lng, $lat, $member, ...$other_triples_and_options): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\\func_get_args());\n    }\n\n    public function geodist($key, $src, $dst, $unit = null): \\Relay\\Relay|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\\func_get_args());\n    }\n\n    public function geohash($key, $member, ...$other_members): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\\func_get_args());\n    }\n\n    public function georadius($key, $lng, $lat, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\\func_get_args());\n    }\n\n    public function georadiusbymember($key, $member, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\\func_get_args());\n    }\n\n    public function georadiusbymember_ro($key, $member, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\\func_get_args());\n    }\n\n    public function georadius_ro($key, $lng, $lat, $radius, $unit, $options = []): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\\func_get_args());\n    }\n\n    public function geosearch($key, $position, $shape, $unit, $options = []): \\Relay\\Relay|array\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\\func_get_args());\n    }\n\n    public function geosearchstore($dst, $src, $position, $shape, $unit, $options = []): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearchstore(...\\func_get_args());\n    }\n\n    public function get($key): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\\func_get_args());\n    }\n\n    public function getset($key, $value): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\\func_get_args());\n    }\n\n    public function getrange($key, $start, $end): \\Relay\\Relay|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\\func_get_args());\n    }\n\n    public function setrange($key, $start, $value): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setrange(...\\func_get_args());\n    }\n\n    public function getbit($key, $pos): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getbit(...\\func_get_args());\n    }\n\n    public function bitcount($key, $start = 0, $end = -1, $by_bit = false): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\\func_get_args());\n    }\n\n    public function bitfield($key, ...$args): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitfield(...\\func_get_args());\n    }\n\n    public function config($operation, $key = null, $value = null): \\Relay\\Relay|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\\func_get_args());\n    }\n\n    public function command(...$args): \\Relay\\Relay|array|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\\func_get_args());\n    }\n\n    public function bitop($operation, $dstkey, $srckey, ...$other_keys): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\\func_get_args());\n    }\n\n    public function bitpos($key, $bit, $start = null, $end = null, $bybit = false): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\\func_get_args());\n    }\n\n    public function setbit($key, $pos, $val): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setbit(...\\func_get_args());\n    }\n\n    public function acl($cmd, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\\func_get_args());\n    }\n\n    public function append($key, $value): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\\func_get_args());\n    }\n\n    public function set($key, $value, $options = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\\func_get_args());\n    }\n\n    public function getex($key, $options = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getex(...\\func_get_args());\n    }\n\n    public function getdel($key): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getdel(...\\func_get_args());\n    }\n\n    public function setex($key, $seconds, $value): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\\func_get_args());\n    }\n\n    public function pfadd($key, $elements): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\\func_get_args());\n    }\n\n    public function pfcount($key): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\\func_get_args());\n    }\n\n    public function pfmerge($dst, $srckeys): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\\func_get_args());\n    }\n\n    public function psetex($key, $milliseconds, $value): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\\func_get_args());\n    }\n\n    public function publish($channel, $message): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\\func_get_args());\n    }\n\n    public function pubsub($operation, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\\func_get_args());\n    }\n\n    public function spublish($channel, $message): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spublish(...\\func_get_args());\n    }\n\n    public function setnx($key, $value): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\\func_get_args());\n    }\n\n    public function mget($keys): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\\func_get_args());\n    }\n\n    public function move($key, $db): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->move(...\\func_get_args());\n    }\n\n    public function mset($kvals): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\\func_get_args());\n    }\n\n    public function msetnx($kvals): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\\func_get_args());\n    }\n\n    public function rename($key, $newkey): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\\func_get_args());\n    }\n\n    public function renamenx($key, $newkey): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renamenx(...\\func_get_args());\n    }\n\n    public function del(...$keys): \\Relay\\Relay|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\\func_get_args());\n    }\n\n    public function unlink(...$keys): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\\func_get_args());\n    }\n\n    public function expire($key, $seconds, $mode = null): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\\func_get_args());\n    }\n\n    public function pexpire($key, $milliseconds): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\\func_get_args());\n    }\n\n    public function expireat($key, $timestamp): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireat(...\\func_get_args());\n    }\n\n    public function expiretime($key): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expiretime(...\\func_get_args());\n    }\n\n    public function pexpireat($key, $timestamp_ms): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireat(...\\func_get_args());\n    }\n\n    public function pexpiretime($key): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpiretime(...\\func_get_args());\n    }\n\n    public function persist($key): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\\func_get_args());\n    }\n\n    public function type($key): \\Relay\\Relay|bool|int|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\\func_get_args());\n    }\n\n    public function lmove($srckey, $dstkey, $srcpos, $dstpos): \\Relay\\Relay|false|null|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmove(...\\func_get_args());\n    }\n\n    public function blmove($srckey, $dstkey, $srcpos, $dstpos, $timeout): \\Relay\\Relay|false|null|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\\func_get_args());\n    }\n\n    public function lrange($key, $start, $stop): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\\func_get_args());\n    }\n\n    public function lpush($key, $mem, ...$mems): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpush(...\\func_get_args());\n    }\n\n    public function rpush($key, $mem, ...$mems): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpush(...\\func_get_args());\n    }\n\n    public function lpushx($key, $mem, ...$mems): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpushx(...\\func_get_args());\n    }\n\n    public function rpushx($key, $mem, ...$mems): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpushx(...\\func_get_args());\n    }\n\n    public function lset($key, $index, $mem): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lset(...\\func_get_args());\n    }\n\n    public function lpop($key, $count = 1): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpop(...\\func_get_args());\n    }\n\n    public function lpos($key, $value, $options = null): \\Relay\\Relay|array|false|int|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpos(...\\func_get_args());\n    }\n\n    public function rpop($key, $count = 1): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpop(...\\func_get_args());\n    }\n\n    public function rpoplpush($source, $dest): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\\func_get_args());\n    }\n\n    public function brpoplpush($source, $dest, $timeout): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\\func_get_args());\n    }\n\n    public function blpop($key, $timeout_or_key, ...$extra_args): \\Relay\\Relay|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blpop(...\\func_get_args());\n    }\n\n    public function blmpop($timeout, $keys, $from, $count = 1): \\Relay\\Relay|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmpop(...\\func_get_args());\n    }\n\n    public function bzmpop($timeout, $keys, $from, $count = 1): \\Relay\\Relay|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzmpop(...\\func_get_args());\n    }\n\n    public function lmpop($keys, $from, $count = 1): \\Relay\\Relay|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmpop(...\\func_get_args());\n    }\n\n    public function zmpop($keys, $from, $count = 1): \\Relay\\Relay|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmpop(...\\func_get_args());\n    }\n\n    public function brpop($key, $timeout_or_key, ...$extra_args): \\Relay\\Relay|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpop(...\\func_get_args());\n    }\n\n    public function bzpopmax($key, $timeout_or_key, ...$extra_args): \\Relay\\Relay|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmax(...\\func_get_args());\n    }\n\n    public function bzpopmin($key, $timeout_or_key, ...$extra_args): \\Relay\\Relay|array|false|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmin(...\\func_get_args());\n    }\n\n    public function object($op, $key): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\\func_get_args());\n    }\n\n    public function geopos($key, ...$members): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\\func_get_args());\n    }\n\n    public function lrem($key, $mem, $count = 0): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\\func_get_args());\n    }\n\n    public function lindex($key, $index): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\\func_get_args());\n    }\n\n    public function linsert($key, $op, $pivot, $element): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->linsert(...\\func_get_args());\n    }\n\n    public function ltrim($key, $start, $end): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\\func_get_args());\n    }\n\n    public function hget($hash, $member): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hget(...\\func_get_args());\n    }\n\n    public function hstrlen($hash, $member): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hstrlen(...\\func_get_args());\n    }\n\n    public function hgetall($hash): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetall(...\\func_get_args());\n    }\n\n    public function hkeys($hash): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hkeys(...\\func_get_args());\n    }\n\n    public function hvals($hash): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hvals(...\\func_get_args());\n    }\n\n    public function hmget($hash, $members): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmget(...\\func_get_args());\n    }\n\n    public function hrandfield($hash, $options = null): \\Relay\\Relay|array|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hrandfield(...\\func_get_args());\n    }\n\n    public function hmset($hash, $members): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmset(...\\func_get_args());\n    }\n\n    public function hexists($hash, $member): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexists(...\\func_get_args());\n    }\n\n    public function hsetnx($hash, $member, $value): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hsetnx(...\\func_get_args());\n    }\n\n    public function hset($key, $mem, $val, ...$kvals): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\\func_get_args());\n    }\n\n    public function hdel($key, $mem, ...$mems): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hdel(...\\func_get_args());\n    }\n\n    public function hincrby($key, $mem, $value): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrby(...\\func_get_args());\n    }\n\n    public function hincrbyfloat($key, $mem, $value): \\Relay\\Relay|bool|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrbyfloat(...\\func_get_args());\n    }\n\n    public function incr($key, $by = 1): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\\func_get_args());\n    }\n\n    public function decr($key, $by = 1): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\\func_get_args());\n    }\n\n    public function incrby($key, $value): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrby(...\\func_get_args());\n    }\n\n    public function decrby($key, $value): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrby(...\\func_get_args());\n    }\n\n    public function incrbyfloat($key, $value): \\Relay\\Relay|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrbyfloat(...\\func_get_args());\n    }\n\n    public function sdiff($key, ...$other_keys): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiff(...\\func_get_args());\n    }\n\n    public function sdiffstore($key, ...$other_keys): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiffstore(...\\func_get_args());\n    }\n\n    public function sinter($key, ...$other_keys): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinter(...\\func_get_args());\n    }\n\n    public function sintercard($keys, $limit = -1): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sintercard(...\\func_get_args());\n    }\n\n    public function sinterstore($key, ...$other_keys): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinterstore(...\\func_get_args());\n    }\n\n    public function sunion($key, ...$other_keys): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunion(...\\func_get_args());\n    }\n\n    public function sunionstore($key, ...$other_keys): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunionstore(...\\func_get_args());\n    }\n\n    public function subscribe($channels, $callback): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\\func_get_args());\n    }\n\n    public function unsubscribe($channels = []): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\\func_get_args());\n    }\n\n    public function psubscribe($patterns, $callback): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\\func_get_args());\n    }\n\n    public function punsubscribe($patterns = []): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\\func_get_args());\n    }\n\n    public function ssubscribe($channels, $callback): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ssubscribe(...\\func_get_args());\n    }\n\n    public function sunsubscribe($channels = []): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunsubscribe(...\\func_get_args());\n    }\n\n    public function touch($key_or_array, ...$more_keys): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->touch(...\\func_get_args());\n    }\n\n    public function pipeline(): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pipeline(...\\func_get_args());\n    }\n\n    public function multi($mode = 0): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\\func_get_args());\n    }\n\n    public function exec(): \\Relay\\Relay|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\\func_get_args());\n    }\n\n    public function wait($replicas, $timeout): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->wait(...\\func_get_args());\n    }\n\n    public function watch($key, ...$other_keys): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\\func_get_args());\n    }\n\n    public function unwatch(): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\\func_get_args());\n    }\n\n    public function discard(): bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\\func_get_args());\n    }\n\n    public function getMode($masked = false): int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMode(...\\func_get_args());\n    }\n\n    public function clearBytes(): void\n    {\n        ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearBytes(...\\func_get_args());\n    }\n\n    public function scan(&$iterator, $match = null, $count = 0, $type = null): array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($iterator, ...\\array_slice(\\func_get_args(), 1));\n    }\n\n    public function hscan($key, &$iterator, $match = null, $count = 0): array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($key, $iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function sscan($key, &$iterator, $match = null, $count = 0): array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($key, $iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function zscan($key, &$iterator, $match = null, $count = 0): array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($key, $iterator, ...\\array_slice(\\func_get_args(), 2));\n    }\n\n    public function keys($pattern): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\\func_get_args());\n    }\n\n    public function slowlog($operation, ...$extra_args): \\Relay\\Relay|array|bool|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\\func_get_args());\n    }\n\n    public function smembers($set): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smembers(...\\func_get_args());\n    }\n\n    public function sismember($set, $member): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\\func_get_args());\n    }\n\n    public function smismember($set, ...$members): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smismember(...\\func_get_args());\n    }\n\n    public function srem($set, $member, ...$members): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\\func_get_args());\n    }\n\n    public function sadd($set, $member, ...$members): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sadd(...\\func_get_args());\n    }\n\n    public function sort($key, $options = []): \\Relay\\Relay|array|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\\func_get_args());\n    }\n\n    public function sort_ro($key, $options = []): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort_ro(...\\func_get_args());\n    }\n\n    public function smove($srcset, $dstset, $member): \\Relay\\Relay|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smove(...\\func_get_args());\n    }\n\n    public function spop($set, $count = 1): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spop(...\\func_get_args());\n    }\n\n    public function srandmember($set, $count = 1): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srandmember(...\\func_get_args());\n    }\n\n    public function scard($key): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\\func_get_args());\n    }\n\n    public function script($command, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\\func_get_args());\n    }\n\n    public function strlen($key): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\\func_get_args());\n    }\n\n    public function hlen($key): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hlen(...\\func_get_args());\n    }\n\n    public function llen($key): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->llen(...\\func_get_args());\n    }\n\n    public function xack($key, $group, $ids): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\\func_get_args());\n    }\n\n    public function xadd($key, $id, $values, $maxlen = 0, $approx = false, $nomkstream = false): \\Relay\\Relay|false|string\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\\func_get_args());\n    }\n\n    public function xclaim($key, $group, $consumer, $min_idle, $ids, $options): \\Relay\\Relay|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\\func_get_args());\n    }\n\n    public function xautoclaim($key, $group, $consumer, $min_idle, $start, $count = -1, $justid = false): \\Relay\\Relay|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xautoclaim(...\\func_get_args());\n    }\n\n    public function xlen($key): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\\func_get_args());\n    }\n\n    public function xgroup($operation, $key = null, $group = null, $id_or_consumer = null, $mkstream = false, $entries_read = -2): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\\func_get_args());\n    }\n\n    public function xdel($key, $ids): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\\func_get_args());\n    }\n\n    public function xinfo($operation, $arg1 = null, $arg2 = null, $count = -1): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\\func_get_args());\n    }\n\n    public function xpending($key, $group, $start = null, $end = null, $count = -1, $consumer = null, $idle = 0): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\\func_get_args());\n    }\n\n    public function xrange($key, $start, $end, $count = -1): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\\func_get_args());\n    }\n\n    public function xrevrange($key, $end, $start, $count = -1): \\Relay\\Relay|array|bool\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\\func_get_args());\n    }\n\n    public function xread($streams, $count = -1, $block = -1): \\Relay\\Relay|array|bool|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\\func_get_args());\n    }\n\n    public function xreadgroup($group, $consumer, $streams, $count = 1, $block = 1): \\Relay\\Relay|array|bool|null\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\\func_get_args());\n    }\n\n    public function xtrim($key, $threshold, $approx = false, $minid = false, $limit = -1): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\\func_get_args());\n    }\n\n    public function zadd($key, ...$args): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zadd(...\\func_get_args());\n    }\n\n    public function zrandmember($key, $options = null): mixed\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrandmember(...\\func_get_args());\n    }\n\n    public function zrange($key, $start, $end, $options = null): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrange(...\\func_get_args());\n    }\n\n    public function zrevrange($key, $start, $end, $options = null): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrange(...\\func_get_args());\n    }\n\n    public function zrangebyscore($key, $start, $end, $options = null): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebyscore(...\\func_get_args());\n    }\n\n    public function zrevrangebyscore($key, $start, $end, $options = null): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebyscore(...\\func_get_args());\n    }\n\n    public function zrangestore($dst, $src, $start, $end, $options = null): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangestore(...\\func_get_args());\n    }\n\n    public function zrangebylex($key, $min, $max, $offset = -1, $count = -1): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebylex(...\\func_get_args());\n    }\n\n    public function zrevrangebylex($key, $max, $min, $offset = -1, $count = -1): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebylex(...\\func_get_args());\n    }\n\n    public function zrank($key, $rank, $withscore = false): \\Relay\\Relay|array|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\\func_get_args());\n    }\n\n    public function zrevrank($key, $rank, $withscore = false): \\Relay\\Relay|array|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\\func_get_args());\n    }\n\n    public function zrem($key, ...$args): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrem(...\\func_get_args());\n    }\n\n    public function zremrangebylex($key, $min, $max): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebylex(...\\func_get_args());\n    }\n\n    public function zremrangebyrank($key, $start, $end): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyrank(...\\func_get_args());\n    }\n\n    public function zremrangebyscore($key, $min, $max): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyscore(...\\func_get_args());\n    }\n\n    public function zcard($key): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcard(...\\func_get_args());\n    }\n\n    public function zcount($key, $min, $max): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcount(...\\func_get_args());\n    }\n\n    public function zdiff($keys, $options = null): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiff(...\\func_get_args());\n    }\n\n    public function zdiffstore($dst, $keys): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiffstore(...\\func_get_args());\n    }\n\n    public function zincrby($key, $score, $mem): \\Relay\\Relay|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zincrby(...\\func_get_args());\n    }\n\n    public function zlexcount($key, $min, $max): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zlexcount(...\\func_get_args());\n    }\n\n    public function zmscore($key, ...$mems): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmscore(...\\func_get_args());\n    }\n\n    public function zscore($key, $member): \\Relay\\Relay|false|float\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\\func_get_args());\n    }\n\n    public function zinter($keys, $weights = null, $options = null): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinter(...\\func_get_args());\n    }\n\n    public function zintercard($keys, $limit = -1): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zintercard(...\\func_get_args());\n    }\n\n    public function zinterstore($dst, $keys, $weights = null, $options = null): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\\func_get_args());\n    }\n\n    public function zunion($keys, $weights = null, $options = null): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunion(...\\func_get_args());\n    }\n\n    public function zunionstore($dst, $keys, $weights = null, $options = null): \\Relay\\Relay|false|int\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\\func_get_args());\n    }\n\n    public function zpopmin($key, $count = 1): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmin(...\\func_get_args());\n    }\n\n    public function zpopmax($key, $count = 1): \\Relay\\Relay|array|false\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmax(...\\func_get_args());\n    }\n\n    public function _getKeys()\n    {\n        return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_getKeys(...\\func_get_args());\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/Traits/ValueWrapper.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\n/**\n * A short namespace-less class to serialize items with metadata.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nclass \n{\n    private const EXPIRY_OFFSET = 1648206727;\n    private const INT32_MAX = 2147483647;\n\n    public readonly mixed $value;\n    public readonly array $metadata;\n\n    public function __construct(mixed $value, array $metadata)\n    {\n        $this->value = $value;\n        $this->metadata = $metadata;\n    }\n\n    public function __serialize(): array\n    {\n        // pack 31-bits ctime into 14bits\n        $c = $this->metadata['ctime'] ?? 0;\n        $c = match (true) {\n            $c > self::INT32_MAX - 2 => self::INT32_MAX,\n            $c > 0 => 1 + $c,\n            default => 1,\n        };\n        $e = 0;\n        while (!(0x40000000 & $c)) {\n            $c <<= 1;\n            ++$e;\n        }\n        $c = (0x7FE0 & ($c >> 16)) | $e;\n\n        $pack = pack('Vn', (int) (0.1 + ($this->metadata['expiry'] ?: self::INT32_MAX + self::EXPIRY_OFFSET) - self::EXPIRY_OFFSET), $c);\n\n        if (isset($this->metadata['tags'])) {\n            $pack[4] = $pack[4] | \"\\x80\";\n        }\n\n        return [$pack => $this->value] + ($this->metadata['tags'] ?? []);\n    }\n\n    public function __unserialize(array $data): void\n    {\n        $pack = array_key_first($data);\n        $this->value = $data[$pack];\n\n        if ($hasTags = \"\\x80\" === ($pack[4] & \"\\x80\")) {\n            unset($data[$pack]);\n            $pack[4] = $pack[4] & \"\\x7F\";\n        }\n\n        $metadata = unpack('Vexpiry/nctime', $pack);\n        $metadata['expiry'] += self::EXPIRY_OFFSET;\n\n        if (!$metadata['ctime'] = ((0x4000 | $metadata['ctime']) << 16 >> (0x1F & $metadata['ctime'])) - 1) {\n            unset($metadata['ctime']);\n        }\n\n        if ($hasTags) {\n            $metadata['tags'] = $data;\n        }\n\n        $this->metadata = $metadata;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache/composer.json",
    "content": "{\n    \"name\": \"symfony/cache\",\n    \"type\": \"library\",\n    \"description\": \"Provides extended PSR-6, PSR-16 (and tags) implementations\",\n    \"keywords\": [\"caching\", \"psr6\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"provide\": {\n        \"psr/cache-implementation\": \"2.0|3.0\",\n        \"psr/simple-cache-implementation\": \"1.0|2.0|3.0\",\n        \"symfony/cache-implementation\": \"1.1|2.0|3.0\"\n    },\n    \"require\": {\n        \"php\": \">=8.1\",\n        \"psr/cache\": \"^2.0|^3.0\",\n        \"psr/log\": \"^1.1|^2|^3\",\n        \"symfony/cache-contracts\": \"^2.5|^3\",\n        \"symfony/service-contracts\": \"^2.5|^3\",\n        \"symfony/var-exporter\": \"^6.3.6|^7.0\"\n    },\n    \"require-dev\": {\n        \"cache/integration-tests\": \"dev-master\",\n        \"doctrine/dbal\": \"^2.13.1|^3|^4\",\n        \"predis/predis\": \"^1.1|^2.0\",\n        \"psr/simple-cache\": \"^1.0|^2.0|^3.0\",\n        \"symfony/config\": \"^5.4|^6.0|^7.0\",\n        \"symfony/dependency-injection\": \"^5.4|^6.0|^7.0\",\n        \"symfony/filesystem\": \"^5.4|^6.0|^7.0\",\n        \"symfony/http-kernel\": \"^5.4|^6.0|^7.0\",\n        \"symfony/messenger\": \"^5.4|^6.0|^7.0\",\n        \"symfony/var-dumper\": \"^5.4|^6.0|^7.0\"\n    },\n    \"conflict\": {\n        \"doctrine/dbal\": \"<2.13.1\",\n        \"symfony/dependency-injection\": \"<5.4\",\n        \"symfony/http-kernel\": \"<5.4\",\n        \"symfony/var-dumper\": \"<5.4\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Component\\\\Cache\\\\\": \"\" },\n        \"classmap\": [\n            \"Traits/ValueWrapper.php\"\n        ],\n        \"exclude-from-classmap\": [\n            \"/Tests/\"\n        ]\n    },\n    \"minimum-stability\": \"dev\"\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache-contracts/CHANGELOG.md",
    "content": "CHANGELOG\n=========\n\nThe changelog is maintained for all Symfony contracts at the following URL:\nhttps://github.com/symfony/contracts/blob/main/CHANGELOG.md\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache-contracts/CacheInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Cache;\n\nuse Psr\\Cache\\CacheItemInterface;\nuse Psr\\Cache\\InvalidArgumentException;\n\n/**\n * Covers most simple to advanced caching needs.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\ninterface CacheInterface\n{\n    /**\n     * Fetches a value from the pool or computes it if not found.\n     *\n     * On cache misses, a callback is called that should return the missing value.\n     * This callback is given a PSR-6 CacheItemInterface instance corresponding to the\n     * requested key, that could be used e.g. for expiration control. It could also\n     * be an ItemInterface instance when its additional features are needed.\n     *\n     * @template T\n     *\n     * @param string $key The key of the item to retrieve from the cache\n     * @param (callable(CacheItemInterface,bool):T)|(callable(ItemInterface,bool):T)|CallbackInterface<T> $callback\n     * @param float|null $beta      A float that, as it grows, controls the likeliness of triggering\n     *                              early expiration. 0 disables it, INF forces immediate expiration.\n     *                              The default (or providing null) is implementation dependent but should\n     *                              typically be 1.0, which should provide optimal stampede protection.\n     *                              See https://en.wikipedia.org/wiki/Cache_stampede#Probabilistic_early_expiration\n     * @param array      &$metadata The metadata of the cached item {@see ItemInterface::getMetadata()}\n     *\n     * @return T\n     *\n     * @throws InvalidArgumentException When $key is not valid or when $beta is negative\n     */\n    public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed;\n\n    /**\n     * Removes an item from the pool.\n     *\n     * @param string $key The key to delete\n     *\n     * @return bool True if the item was successfully removed, false if there was any error\n     *\n     * @throws InvalidArgumentException When $key is not valid\n     */\n    public function delete(string $key): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache-contracts/CacheTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Cache;\n\nuse Psr\\Cache\\CacheItemPoolInterface;\nuse Psr\\Cache\\InvalidArgumentException;\nuse Psr\\Log\\LoggerInterface;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(InvalidArgumentException::class);\n\n/**\n * An implementation of CacheInterface for PSR-6 CacheItemPoolInterface classes.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\ntrait CacheTrait\n{\n    public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed\n    {\n        return $this->doGet($this, $key, $callback, $beta, $metadata);\n    }\n\n    public function delete(string $key): bool\n    {\n        return $this->deleteItem($key);\n    }\n\n    private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, ?array &$metadata = null, ?LoggerInterface $logger = null): mixed\n    {\n        if (0 > $beta ??= 1.0) {\n            throw new class(sprintf('Argument \"$beta\" provided to \"%s::get()\" must be a positive number, %f given.', static::class, $beta)) extends \\InvalidArgumentException implements InvalidArgumentException {};\n        }\n\n        $item = $pool->getItem($key);\n        $recompute = !$item->isHit() || \\INF === $beta;\n        $metadata = $item instanceof ItemInterface ? $item->getMetadata() : [];\n\n        if (!$recompute && $metadata) {\n            $expiry = $metadata[ItemInterface::METADATA_EXPIRY] ?? false;\n            $ctime = $metadata[ItemInterface::METADATA_CTIME] ?? false;\n\n            if ($recompute = $ctime && $expiry && $expiry <= ($now = microtime(true)) - $ctime / 1000 * $beta * log(random_int(1, \\PHP_INT_MAX) / \\PHP_INT_MAX)) {\n                // force applying defaultLifetime to expiry\n                $item->expiresAt(null);\n                $logger?->info('Item \"{key}\" elected for early recomputation {delta}s before its expiration', [\n                    'key' => $key,\n                    'delta' => sprintf('%.1f', $expiry - $now),\n                ]);\n            }\n        }\n\n        if ($recompute) {\n            $save = true;\n            $item->set($callback($item, $save));\n            if ($save) {\n                $pool->save($item);\n            }\n        }\n\n        return $item->get();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache-contracts/CallbackInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Cache;\n\nuse Psr\\Cache\\CacheItemInterface;\n\n/**\n * Computes and returns the cached value of an item.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @template T\n */\ninterface CallbackInterface\n{\n    /**\n     * @param CacheItemInterface|ItemInterface $item  The item to compute the value for\n     * @param bool                             &$save Should be set to false when the value should not be saved in the pool\n     *\n     * @return T The computed value for the passed item\n     */\n    public function __invoke(CacheItemInterface $item, bool &$save): mixed;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache-contracts/ItemInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Cache;\n\nuse Psr\\Cache\\CacheException;\nuse Psr\\Cache\\CacheItemInterface;\nuse Psr\\Cache\\InvalidArgumentException;\n\n/**\n * Augments PSR-6's CacheItemInterface with support for tags and metadata.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\ninterface ItemInterface extends CacheItemInterface\n{\n    /**\n     * References the Unix timestamp stating when the item will expire.\n     */\n    public const METADATA_EXPIRY = 'expiry';\n\n    /**\n     * References the time the item took to be created, in milliseconds.\n     */\n    public const METADATA_CTIME = 'ctime';\n\n    /**\n     * References the list of tags that were assigned to the item, as string[].\n     */\n    public const METADATA_TAGS = 'tags';\n\n    /**\n     * Reserved characters that cannot be used in a key or tag.\n     */\n    public const RESERVED_CHARACTERS = '{}()/\\@:';\n\n    /**\n     * Adds a tag to a cache item.\n     *\n     * Tags are strings that follow the same validation rules as keys.\n     *\n     * @param string|string[] $tags A tag or array of tags\n     *\n     * @return $this\n     *\n     * @throws InvalidArgumentException When $tag is not valid\n     * @throws CacheException           When the item comes from a pool that is not tag-aware\n     */\n    public function tag(string|iterable $tags): static;\n\n    /**\n     * Returns a list of metadata info that were saved alongside with the cached value.\n     *\n     * See ItemInterface::METADATA_* consts for keys potentially found in the returned array.\n     */\n    public function getMetadata(): array;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache-contracts/LICENSE",
    "content": "Copyright (c) 2018-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache-contracts/README.md",
    "content": "Symfony Cache Contracts\n=======================\n\nA set of abstractions extracted out of the Symfony components.\n\nCan be used to build on semantics that the Symfony components proved useful and\nthat already have battle tested implementations.\n\nSee https://github.com/symfony/contracts/blob/main/README.md for more information.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache-contracts/TagAwareCacheInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Cache;\n\nuse Psr\\Cache\\InvalidArgumentException;\n\n/**\n * Allows invalidating cached items using tags.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\ninterface TagAwareCacheInterface extends CacheInterface\n{\n    /**\n     * Invalidates cached items using tags.\n     *\n     * When implemented on a PSR-6 pool, invalidation should not apply\n     * to deferred items. Instead, they should be committed as usual.\n     * This allows replacing old tagged values by new ones without\n     * race conditions.\n     *\n     * @param string[] $tags An array of tags to invalidate\n     *\n     * @return bool True on success\n     *\n     * @throws InvalidArgumentException When $tags is not valid\n     */\n    public function invalidateTags(array $tags): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/cache-contracts/composer.json",
    "content": "{\n    \"name\": \"symfony/cache-contracts\",\n    \"type\": \"library\",\n    \"description\": \"Generic abstractions related to caching\",\n    \"keywords\": [\"abstractions\", \"contracts\", \"decoupling\", \"interfaces\", \"interoperability\", \"standards\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.1\",\n        \"psr/cache\": \"^3.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Contracts\\\\Cache\\\\\": \"\" }\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-main\": \"3.5-dev\"\n        },\n        \"thanks\": {\n            \"name\": \"symfony/contracts\",\n            \"url\": \"https://github.com/symfony/contracts\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/deprecation-contracts/CHANGELOG.md",
    "content": "CHANGELOG\n=========\n\nThe changelog is maintained for all Symfony contracts at the following URL:\nhttps://github.com/symfony/contracts/blob/main/CHANGELOG.md\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/deprecation-contracts/LICENSE",
    "content": "Copyright (c) 2020-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/deprecation-contracts/README.md",
    "content": "Symfony Deprecation Contracts\n=============================\n\nA generic function and convention to trigger deprecation notices.\n\nThis package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices.\n\nBy using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component,\nthe triggered deprecations can be caught and logged for later discovery, both on dev and prod environments.\n\nThe function requires at least 3 arguments:\n - the name of the Composer package that is triggering the deprecation\n - the version of the package that introduced the deprecation\n - the message of the deprecation\n - more arguments can be provided: they will be inserted in the message using `printf()` formatting\n\nExample:\n```php\ntrigger_deprecation('symfony/blockchain', '8.9', 'Using \"%s\" is deprecated, use \"%s\" instead.', 'bitcoin', 'fabcoin');\n```\n\nThis will generate the following message:\n`Since symfony/blockchain 8.9: Using \"bitcoin\" is deprecated, use \"fabcoin\" instead.`\n\nWhile not recommended, the deprecation notices can be completely ignored by declaring an empty\n`function trigger_deprecation() {}` in your application.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/deprecation-contracts/composer.json",
    "content": "{\n    \"name\": \"symfony/deprecation-contracts\",\n    \"type\": \"library\",\n    \"description\": \"A generic function and convention to trigger deprecation notices\",\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.1\"\n    },\n    \"autoload\": {\n        \"files\": [\n            \"function.php\"\n        ]\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-main\": \"3.5-dev\"\n        },\n        \"thanks\": {\n            \"name\": \"symfony/contracts\",\n            \"url\": \"https://github.com/symfony/contracts\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/deprecation-contracts/function.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (!function_exists('trigger_deprecation')) {\n    /**\n     * Triggers a silenced deprecation notice.\n     *\n     * @param string $package The name of the Composer package that is triggering the deprecation\n     * @param string $version The version of the package that introduced the deprecation\n     * @param string $message The message of the deprecation\n     * @param mixed  ...$args Values to insert in the message using printf() formatting\n     *\n     * @author Nicolas Grekas <p@tchwork.com>\n     */\n    function trigger_deprecation(string $package, string $version, string $message, mixed ...$args): void\n    {\n        @trigger_error(($package || $version ? \"Since $package $version: \" : '').($args ? vsprintf($message, $args) : $message), \\E_USER_DEPRECATED);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/Attribute/AsEventListener.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\EventDispatcher\\Attribute;\n\n/**\n * Service tag to autoconfigure event listeners.\n *\n * @author Alexander M. Turek <me@derrabus.de>\n */\n#[\\Attribute(\\Attribute::TARGET_CLASS | \\Attribute::TARGET_METHOD | \\Attribute::IS_REPEATABLE)]\nclass AsEventListener\n{\n    public function __construct(\n        public ?string $event = null,\n        public ?string $method = null,\n        public int $priority = 0,\n        public ?string $dispatcher = null,\n    ) {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/CHANGELOG.md",
    "content": "CHANGELOG\n=========\n\n6.0\n---\n\n * Remove `LegacyEventDispatcherProxy`\n\n5.4\n---\n\n * Allow `#[AsEventListener]` attribute on methods\n\n5.3\n---\n\n * Add `#[AsEventListener]` attribute for declaring listeners on PHP 8\n\n5.1.0\n-----\n\n * The `LegacyEventDispatcherProxy` class has been deprecated.\n * Added an optional `dispatcher` attribute to the listener and subscriber tags in `RegisterListenerPass`.\n\n5.0.0\n-----\n\n * The signature of the `EventDispatcherInterface::dispatch()` method has been changed to `dispatch($event, string $eventName = null): object`.\n * The `Event` class has been removed in favor of `Symfony\\Contracts\\EventDispatcher\\Event`.\n * The `TraceableEventDispatcherInterface` has been removed.\n * The `WrappedListener` class is now final.\n\n4.4.0\n-----\n\n * `AddEventAliasesPass` has been added, allowing applications and bundles to extend the event alias mapping used by `RegisterListenersPass`.\n * Made the `event` attribute of the `kernel.event_listener` tag optional for FQCN events.\n\n4.3.0\n-----\n\n * The signature of the `EventDispatcherInterface::dispatch()` method should be updated to `dispatch($event, string $eventName = null)`, not doing so is deprecated\n * deprecated the `Event` class, use `Symfony\\Contracts\\EventDispatcher\\Event` instead\n\n4.1.0\n-----\n\n * added support for invokable event listeners tagged with `kernel.event_listener` by default\n * The `TraceableEventDispatcher::getOrphanedEvents()` method has been added.\n * The `TraceableEventDispatcherInterface` has been deprecated.\n\n4.0.0\n-----\n\n * removed the `ContainerAwareEventDispatcher` class\n * added the `reset()` method to the `TraceableEventDispatcherInterface`\n\n3.4.0\n-----\n\n * Implementing `TraceableEventDispatcherInterface` without the `reset()` method has been deprecated.\n\n3.3.0\n-----\n\n * The ContainerAwareEventDispatcher class has been deprecated. Use EventDispatcher with closure factories instead.\n\n3.0.0\n-----\n\n * The method `getListenerPriority($eventName, $listener)` has been added to the\n   `EventDispatcherInterface`.\n * The methods `Event::setDispatcher()`, `Event::getDispatcher()`, `Event::setName()`\n   and `Event::getName()` have been removed.\n   The event dispatcher and the event name are passed to the listener call.\n\n2.5.0\n-----\n\n * added Debug\\TraceableEventDispatcher (originally in HttpKernel)\n * changed Debug\\TraceableEventDispatcherInterface to extend EventDispatcherInterface\n * added RegisterListenersPass (originally in HttpKernel)\n\n2.1.0\n-----\n\n * added TraceableEventDispatcherInterface\n * added ContainerAwareEventDispatcher\n * added a reference to the EventDispatcher on the Event\n * added a reference to the Event name on the event\n * added fluid interface to the dispatch() method which now returns the Event\n   object\n * added GenericEvent event class\n * added the possibility for subscribers to subscribe several times for the\n   same event\n * added ImmutableEventDispatcher\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\EventDispatcher\\Debug;\n\nuse Psr\\EventDispatcher\\StoppableEventInterface;\nuse Psr\\Log\\LoggerInterface;\nuse Symfony\\Component\\EventDispatcher\\EventDispatcher;\nuse Symfony\\Component\\EventDispatcher\\EventDispatcherInterface;\nuse Symfony\\Component\\EventDispatcher\\EventSubscriberInterface;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\RequestStack;\nuse Symfony\\Component\\Stopwatch\\Stopwatch;\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n/**\n * Collects some data about event listeners.\n *\n * This event dispatcher delegates the dispatching to another one.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass TraceableEventDispatcher implements EventDispatcherInterface, ResetInterface\n{\n    protected $logger;\n    protected $stopwatch;\n\n    /**\n     * @var \\SplObjectStorage<WrappedListener, array{string, string}>|null\n     */\n    private ?\\SplObjectStorage $callStack = null;\n    private EventDispatcherInterface $dispatcher;\n    private array $wrappedListeners = [];\n    private array $orphanedEvents = [];\n    private ?RequestStack $requestStack;\n    private string $currentRequestHash = '';\n\n    public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, ?LoggerInterface $logger = null, ?RequestStack $requestStack = null)\n    {\n        $this->dispatcher = $dispatcher;\n        $this->stopwatch = $stopwatch;\n        $this->logger = $logger;\n        $this->requestStack = $requestStack;\n    }\n\n    /**\n     * @return void\n     */\n    public function addListener(string $eventName, callable|array $listener, int $priority = 0)\n    {\n        $this->dispatcher->addListener($eventName, $listener, $priority);\n    }\n\n    /**\n     * @return void\n     */\n    public function addSubscriber(EventSubscriberInterface $subscriber)\n    {\n        $this->dispatcher->addSubscriber($subscriber);\n    }\n\n    /**\n     * @return void\n     */\n    public function removeListener(string $eventName, callable|array $listener)\n    {\n        if (isset($this->wrappedListeners[$eventName])) {\n            foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) {\n                if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \\Closure && $wrappedListener->getWrappedListener() == $listener)) {\n                    $listener = $wrappedListener;\n                    unset($this->wrappedListeners[$eventName][$index]);\n                    break;\n                }\n            }\n        }\n\n        $this->dispatcher->removeListener($eventName, $listener);\n    }\n\n    /**\n     * @return void\n     */\n    public function removeSubscriber(EventSubscriberInterface $subscriber)\n    {\n        $this->dispatcher->removeSubscriber($subscriber);\n    }\n\n    public function getListeners(?string $eventName = null): array\n    {\n        return $this->dispatcher->getListeners($eventName);\n    }\n\n    public function getListenerPriority(string $eventName, callable|array $listener): ?int\n    {\n        // we might have wrapped listeners for the event (if called while dispatching)\n        // in that case get the priority by wrapper\n        if (isset($this->wrappedListeners[$eventName])) {\n            foreach ($this->wrappedListeners[$eventName] as $wrappedListener) {\n                if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \\Closure && $wrappedListener->getWrappedListener() == $listener)) {\n                    return $this->dispatcher->getListenerPriority($eventName, $wrappedListener);\n                }\n            }\n        }\n\n        return $this->dispatcher->getListenerPriority($eventName, $listener);\n    }\n\n    public function hasListeners(?string $eventName = null): bool\n    {\n        return $this->dispatcher->hasListeners($eventName);\n    }\n\n    public function dispatch(object $event, ?string $eventName = null): object\n    {\n        $eventName ??= $event::class;\n\n        $this->callStack ??= new \\SplObjectStorage();\n\n        $currentRequestHash = $this->currentRequestHash = $this->requestStack && ($request = $this->requestStack->getCurrentRequest()) ? spl_object_hash($request) : '';\n\n        if (null !== $this->logger && $event instanceof StoppableEventInterface && $event->isPropagationStopped()) {\n            $this->logger->debug(sprintf('The \"%s\" event is already stopped. No listeners have been called.', $eventName));\n        }\n\n        $this->preProcess($eventName);\n        try {\n            $this->beforeDispatch($eventName, $event);\n            try {\n                $e = $this->stopwatch->start($eventName, 'section');\n                try {\n                    $this->dispatcher->dispatch($event, $eventName);\n                } finally {\n                    if ($e->isStarted()) {\n                        $e->stop();\n                    }\n                }\n            } finally {\n                $this->afterDispatch($eventName, $event);\n            }\n        } finally {\n            $this->currentRequestHash = $currentRequestHash;\n            $this->postProcess($eventName);\n        }\n\n        return $event;\n    }\n\n    public function getCalledListeners(?Request $request = null): array\n    {\n        if (null === $this->callStack) {\n            return [];\n        }\n\n        $hash = $request ? spl_object_hash($request) : null;\n        $called = [];\n        foreach ($this->callStack as $listener) {\n            [$eventName, $requestHash] = $this->callStack->getInfo();\n            if (null === $hash || $hash === $requestHash) {\n                $called[] = $listener->getInfo($eventName);\n            }\n        }\n\n        return $called;\n    }\n\n    public function getNotCalledListeners(?Request $request = null): array\n    {\n        try {\n            $allListeners = $this->dispatcher instanceof EventDispatcher ? $this->getListenersWithPriority() : $this->getListenersWithoutPriority();\n        } catch (\\Exception $e) {\n            $this->logger?->info('An exception was thrown while getting the uncalled listeners.', ['exception' => $e]);\n\n            // unable to retrieve the uncalled listeners\n            return [];\n        }\n\n        $hash = $request ? spl_object_hash($request) : null;\n        $calledListeners = [];\n\n        if (null !== $this->callStack) {\n            foreach ($this->callStack as $calledListener) {\n                [, $requestHash] = $this->callStack->getInfo();\n\n                if (null === $hash || $hash === $requestHash) {\n                    $calledListeners[] = $calledListener->getWrappedListener();\n                }\n            }\n        }\n\n        $notCalled = [];\n\n        foreach ($allListeners as $eventName => $listeners) {\n            foreach ($listeners as [$listener, $priority]) {\n                if (!\\in_array($listener, $calledListeners, true)) {\n                    if (!$listener instanceof WrappedListener) {\n                        $listener = new WrappedListener($listener, null, $this->stopwatch, $this, $priority);\n                    }\n                    $notCalled[] = $listener->getInfo($eventName);\n                }\n            }\n        }\n\n        uasort($notCalled, $this->sortNotCalledListeners(...));\n\n        return $notCalled;\n    }\n\n    public function getOrphanedEvents(?Request $request = null): array\n    {\n        if ($request) {\n            return $this->orphanedEvents[spl_object_hash($request)] ?? [];\n        }\n\n        if (!$this->orphanedEvents) {\n            return [];\n        }\n\n        return array_merge(...array_values($this->orphanedEvents));\n    }\n\n    /**\n     * @return void\n     */\n    public function reset()\n    {\n        $this->callStack = null;\n        $this->orphanedEvents = [];\n        $this->currentRequestHash = '';\n    }\n\n    /**\n     * Proxies all method calls to the original event dispatcher.\n     *\n     * @param string $method    The method name\n     * @param array  $arguments The method arguments\n     */\n    public function __call(string $method, array $arguments): mixed\n    {\n        return $this->dispatcher->{$method}(...$arguments);\n    }\n\n    /**\n     * Called before dispatching the event.\n     *\n     * @return void\n     */\n    protected function beforeDispatch(string $eventName, object $event)\n    {\n    }\n\n    /**\n     * Called after dispatching the event.\n     *\n     * @return void\n     */\n    protected function afterDispatch(string $eventName, object $event)\n    {\n    }\n\n    private function preProcess(string $eventName): void\n    {\n        if (!$this->dispatcher->hasListeners($eventName)) {\n            $this->orphanedEvents[$this->currentRequestHash][] = $eventName;\n\n            return;\n        }\n\n        foreach ($this->dispatcher->getListeners($eventName) as $listener) {\n            $priority = $this->getListenerPriority($eventName, $listener);\n            $wrappedListener = new WrappedListener($listener instanceof WrappedListener ? $listener->getWrappedListener() : $listener, null, $this->stopwatch, $this);\n            $this->wrappedListeners[$eventName][] = $wrappedListener;\n            $this->dispatcher->removeListener($eventName, $listener);\n            $this->dispatcher->addListener($eventName, $wrappedListener, $priority);\n            $this->callStack->attach($wrappedListener, [$eventName, $this->currentRequestHash]);\n        }\n    }\n\n    private function postProcess(string $eventName): void\n    {\n        unset($this->wrappedListeners[$eventName]);\n        $skipped = false;\n        foreach ($this->dispatcher->getListeners($eventName) as $listener) {\n            if (!$listener instanceof WrappedListener) { // #12845: a new listener was added during dispatch.\n                continue;\n            }\n            // Unwrap listener\n            $priority = $this->getListenerPriority($eventName, $listener);\n            $this->dispatcher->removeListener($eventName, $listener);\n            $this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority);\n\n            if (null !== $this->logger) {\n                $context = ['event' => $eventName, 'listener' => $listener->getPretty()];\n            }\n\n            if ($listener->wasCalled()) {\n                $this->logger?->debug('Notified event \"{event}\" to listener \"{listener}\".', $context);\n            } else {\n                $this->callStack->detach($listener);\n            }\n\n            if (null !== $this->logger && $skipped) {\n                $this->logger->debug('Listener \"{listener}\" was not called for event \"{event}\".', $context);\n            }\n\n            if ($listener->stoppedPropagation()) {\n                $this->logger?->debug('Listener \"{listener}\" stopped propagation of the event \"{event}\".', $context);\n\n                $skipped = true;\n            }\n        }\n    }\n\n    private function sortNotCalledListeners(array $a, array $b): int\n    {\n        if (0 !== $cmp = strcmp($a['event'], $b['event'])) {\n            return $cmp;\n        }\n\n        if (\\is_int($a['priority']) && !\\is_int($b['priority'])) {\n            return 1;\n        }\n\n        if (!\\is_int($a['priority']) && \\is_int($b['priority'])) {\n            return -1;\n        }\n\n        if ($a['priority'] === $b['priority']) {\n            return 0;\n        }\n\n        if ($a['priority'] > $b['priority']) {\n            return -1;\n        }\n\n        return 1;\n    }\n\n    private function getListenersWithPriority(): array\n    {\n        $result = [];\n\n        $allListeners = new \\ReflectionProperty(EventDispatcher::class, 'listeners');\n\n        foreach ($allListeners->getValue($this->dispatcher) as $eventName => $listenersByPriority) {\n            foreach ($listenersByPriority as $priority => $listeners) {\n                foreach ($listeners as $listener) {\n                    $result[$eventName][] = [$listener, $priority];\n                }\n            }\n        }\n\n        return $result;\n    }\n\n    private function getListenersWithoutPriority(): array\n    {\n        $result = [];\n\n        foreach ($this->getListeners() as $eventName => $listeners) {\n            foreach ($listeners as $listener) {\n                $result[$eventName][] = [$listener, null];\n            }\n        }\n\n        return $result;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/Debug/WrappedListener.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\EventDispatcher\\Debug;\n\nuse Psr\\EventDispatcher\\StoppableEventInterface;\nuse Symfony\\Component\\EventDispatcher\\EventDispatcherInterface;\nuse Symfony\\Component\\Stopwatch\\Stopwatch;\nuse Symfony\\Component\\VarDumper\\Caster\\ClassStub;\n\n/**\n * @author Fabien Potencier <fabien@symfony.com>\n */\nfinal class WrappedListener\n{\n    private string|array|object $listener;\n    private ?\\Closure $optimizedListener;\n    private string $name;\n    private bool $called = false;\n    private bool $stoppedPropagation = false;\n    private Stopwatch $stopwatch;\n    private ?EventDispatcherInterface $dispatcher;\n    private string $pretty;\n    private string $callableRef;\n    private ClassStub|string $stub;\n    private ?int $priority = null;\n    private static bool $hasClassStub;\n\n    public function __construct(callable|array $listener, ?string $name, Stopwatch $stopwatch, ?EventDispatcherInterface $dispatcher = null, ?int $priority = null)\n    {\n        $this->listener = $listener;\n        $this->optimizedListener = $listener instanceof \\Closure ? $listener : (\\is_callable($listener) ? $listener(...) : null);\n        $this->stopwatch = $stopwatch;\n        $this->dispatcher = $dispatcher;\n        $this->priority = $priority;\n\n        if (\\is_array($listener)) {\n            [$this->name, $this->callableRef] = $this->parseListener($listener);\n            $this->pretty = $this->name.'::'.$listener[1];\n            $this->callableRef .= '::'.$listener[1];\n        } elseif ($listener instanceof \\Closure) {\n            $r = new \\ReflectionFunction($listener);\n            if (str_contains($r->name, '{closure')) {\n                $this->pretty = $this->name = 'closure';\n            } elseif ($class = \\PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass()) {\n                $this->name = $class->name;\n                $this->pretty = $this->name.'::'.$r->name;\n            } else {\n                $this->pretty = $this->name = $r->name;\n            }\n        } elseif (\\is_string($listener)) {\n            $this->pretty = $this->name = $listener;\n        } else {\n            $this->name = get_debug_type($listener);\n            $this->pretty = $this->name.'::__invoke';\n            $this->callableRef = $listener::class.'::__invoke';\n        }\n\n        if (null !== $name) {\n            $this->name = $name;\n        }\n\n        self::$hasClassStub ??= class_exists(ClassStub::class);\n    }\n\n    public function getWrappedListener(): callable|array\n    {\n        return $this->listener;\n    }\n\n    public function wasCalled(): bool\n    {\n        return $this->called;\n    }\n\n    public function stoppedPropagation(): bool\n    {\n        return $this->stoppedPropagation;\n    }\n\n    public function getPretty(): string\n    {\n        return $this->pretty;\n    }\n\n    public function getInfo(string $eventName): array\n    {\n        $this->stub ??= self::$hasClassStub ? new ClassStub($this->pretty.'()', $this->callableRef ?? $this->listener) : $this->pretty.'()';\n\n        return [\n            'event' => $eventName,\n            'priority' => $this->priority ??= $this->dispatcher?->getListenerPriority($eventName, $this->listener),\n            'pretty' => $this->pretty,\n            'stub' => $this->stub,\n        ];\n    }\n\n    public function __invoke(object $event, string $eventName, EventDispatcherInterface $dispatcher): void\n    {\n        $dispatcher = $this->dispatcher ?: $dispatcher;\n\n        $this->called = true;\n        $this->priority ??= $dispatcher->getListenerPriority($eventName, $this->listener);\n\n        $e = $this->stopwatch->start($this->name, 'event_listener');\n\n        try {\n            ($this->optimizedListener ?? $this->listener)($event, $eventName, $dispatcher);\n        } finally {\n            if ($e->isStarted()) {\n                $e->stop();\n            }\n        }\n\n        if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) {\n            $this->stoppedPropagation = true;\n        }\n    }\n\n    private function parseListener(array $listener): array\n    {\n        if ($listener[0] instanceof \\Closure) {\n            foreach ((new \\ReflectionFunction($listener[0]))->getAttributes(\\Closure::class) as $attribute) {\n                if ($name = $attribute->getArguments()['name'] ?? false) {\n                    return [$name, $attribute->getArguments()['class'] ?? $name];\n                }\n            }\n        }\n\n        if (\\is_object($listener[0])) {\n            return [get_debug_type($listener[0]), $listener[0]::class];\n        }\n\n        return [$listener[0], $listener[0]];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\EventDispatcher\\DependencyInjection;\n\nuse Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface;\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\n\n/**\n * This pass allows bundles to extend the list of event aliases.\n *\n * @author Alexander M. Turek <me@derrabus.de>\n */\nclass AddEventAliasesPass implements CompilerPassInterface\n{\n    private array $eventAliases;\n\n    public function __construct(array $eventAliases)\n    {\n        $this->eventAliases = $eventAliases;\n    }\n\n    public function process(ContainerBuilder $container): void\n    {\n        $eventAliases = $container->hasParameter('event_dispatcher.event_aliases') ? $container->getParameter('event_dispatcher.event_aliases') : [];\n\n        $container->setParameter(\n            'event_dispatcher.event_aliases',\n            array_merge($eventAliases, $this->eventAliases)\n        );\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\EventDispatcher\\DependencyInjection;\n\nuse Symfony\\Component\\DependencyInjection\\Argument\\ServiceClosureArgument;\nuse Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface;\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\nuse Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\DependencyInjection\\Reference;\nuse Symfony\\Component\\EventDispatcher\\EventDispatcher;\nuse Symfony\\Component\\EventDispatcher\\EventSubscriberInterface;\nuse Symfony\\Contracts\\EventDispatcher\\Event;\n\n/**\n * Compiler pass to register tagged services for an event dispatcher.\n */\nclass RegisterListenersPass implements CompilerPassInterface\n{\n    private array $hotPathEvents = [];\n    private array $noPreloadEvents = [];\n\n    /**\n     * @return $this\n     */\n    public function setHotPathEvents(array $hotPathEvents): static\n    {\n        $this->hotPathEvents = array_flip($hotPathEvents);\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setNoPreloadEvents(array $noPreloadEvents): static\n    {\n        $this->noPreloadEvents = array_flip($noPreloadEvents);\n\n        return $this;\n    }\n\n    /**\n     * @return void\n     */\n    public function process(ContainerBuilder $container)\n    {\n        if (!$container->hasDefinition('event_dispatcher') && !$container->hasAlias('event_dispatcher')) {\n            return;\n        }\n\n        $aliases = [];\n\n        if ($container->hasParameter('event_dispatcher.event_aliases')) {\n            $aliases = $container->getParameter('event_dispatcher.event_aliases');\n        }\n\n        $globalDispatcherDefinition = $container->findDefinition('event_dispatcher');\n\n        foreach ($container->findTaggedServiceIds('kernel.event_listener', true) as $id => $events) {\n            $noPreload = 0;\n\n            foreach ($events as $event) {\n                $priority = $event['priority'] ?? 0;\n\n                if (!isset($event['event'])) {\n                    if ($container->getDefinition($id)->hasTag('kernel.event_subscriber')) {\n                        continue;\n                    }\n\n                    $event['method'] ??= '__invoke';\n                    $event['event'] = $this->getEventFromTypeDeclaration($container, $id, $event['method']);\n                }\n\n                $event['event'] = $aliases[$event['event']] ?? $event['event'];\n\n                if (!isset($event['method'])) {\n                    $event['method'] = 'on'.preg_replace_callback([\n                        '/(?<=\\b|_)[a-z]/i',\n                        '/[^a-z0-9]/i',\n                    ], fn ($matches) => strtoupper($matches[0]), $event['event']);\n                    $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']);\n\n                    if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method'])) {\n                        if (!$r->hasMethod('__invoke')) {\n                            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));\n                        }\n\n                        $event['method'] = '__invoke';\n                    }\n                }\n\n                $dispatcherDefinition = $globalDispatcherDefinition;\n                if (isset($event['dispatcher'])) {\n                    $dispatcherDefinition = $container->findDefinition($event['dispatcher']);\n                }\n\n                $dispatcherDefinition->addMethodCall('addListener', [$event['event'], [new ServiceClosureArgument(new Reference($id)), $event['method']], $priority]);\n\n                if (isset($this->hotPathEvents[$event['event']])) {\n                    $container->getDefinition($id)->addTag('container.hot_path');\n                } elseif (isset($this->noPreloadEvents[$event['event']])) {\n                    ++$noPreload;\n                }\n            }\n\n            if ($noPreload && \\count($events) === $noPreload) {\n                $container->getDefinition($id)->addTag('container.no_preload');\n            }\n        }\n\n        $extractingDispatcher = new ExtractingEventDispatcher();\n\n        foreach ($container->findTaggedServiceIds('kernel.event_subscriber', true) as $id => $tags) {\n            $def = $container->getDefinition($id);\n\n            // We must assume that the class value has been correctly filled, even if the service is created by a factory\n            $class = $def->getClass();\n\n            if (!$r = $container->getReflectionClass($class)) {\n                throw new InvalidArgumentException(sprintf('Class \"%s\" used for service \"%s\" cannot be found.', $class, $id));\n            }\n            if (!$r->isSubclassOf(EventSubscriberInterface::class)) {\n                throw new InvalidArgumentException(sprintf('Service \"%s\" must implement interface \"%s\".', $id, EventSubscriberInterface::class));\n            }\n            $class = $r->name;\n\n            $dispatcherDefinitions = [];\n            foreach ($tags as $attributes) {\n                if (!isset($attributes['dispatcher']) || isset($dispatcherDefinitions[$attributes['dispatcher']])) {\n                    continue;\n                }\n\n                $dispatcherDefinitions[$attributes['dispatcher']] = $container->findDefinition($attributes['dispatcher']);\n            }\n\n            if (!$dispatcherDefinitions) {\n                $dispatcherDefinitions = [$globalDispatcherDefinition];\n            }\n\n            $noPreload = 0;\n            ExtractingEventDispatcher::$aliases = $aliases;\n            ExtractingEventDispatcher::$subscriber = $class;\n            $extractingDispatcher->addSubscriber($extractingDispatcher);\n            foreach ($extractingDispatcher->listeners as $args) {\n                $args[1] = [new ServiceClosureArgument(new Reference($id)), $args[1]];\n                foreach ($dispatcherDefinitions as $dispatcherDefinition) {\n                    $dispatcherDefinition->addMethodCall('addListener', $args);\n                }\n\n                if (isset($this->hotPathEvents[$args[0]])) {\n                    $container->getDefinition($id)->addTag('container.hot_path');\n                } elseif (isset($this->noPreloadEvents[$args[0]])) {\n                    ++$noPreload;\n                }\n            }\n            if ($noPreload && \\count($extractingDispatcher->listeners) === $noPreload) {\n                $container->getDefinition($id)->addTag('container.no_preload');\n            }\n            $extractingDispatcher->listeners = [];\n            ExtractingEventDispatcher::$aliases = [];\n        }\n    }\n\n    private function getEventFromTypeDeclaration(ContainerBuilder $container, string $id, string $method): string\n    {\n        if (\n            null === ($class = $container->getDefinition($id)->getClass())\n            || !($r = $container->getReflectionClass($class, false))\n            || !$r->hasMethod($method)\n            || 1 > ($m = $r->getMethod($method))->getNumberOfParameters()\n            || !($type = $m->getParameters()[0]->getType()) instanceof \\ReflectionNamedType\n            || $type->isBuiltin()\n            || Event::class === ($name = $type->getName())\n        ) {\n            throw new InvalidArgumentException(sprintf('Service \"%s\" must define the \"event\" attribute on \"kernel.event_listener\" tags.', $id));\n        }\n\n        return $name;\n    }\n}\n\n/**\n * @internal\n */\nclass ExtractingEventDispatcher extends EventDispatcher implements EventSubscriberInterface\n{\n    public array $listeners = [];\n\n    public static array $aliases = [];\n    public static string $subscriber;\n\n    public function addListener(string $eventName, callable|array $listener, int $priority = 0): void\n    {\n        $this->listeners[] = [$eventName, $listener[1], $priority];\n    }\n\n    public static function getSubscribedEvents(): array\n    {\n        $events = [];\n\n        foreach ([self::$subscriber, 'getSubscribedEvents']() as $eventName => $params) {\n            $events[self::$aliases[$eventName] ?? $eventName] = $params;\n        }\n\n        return $events;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/EventDispatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\EventDispatcher;\n\nuse Psr\\EventDispatcher\\StoppableEventInterface;\nuse Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener;\n\n/**\n * The EventDispatcherInterface is the central point of Symfony's event listener system.\n *\n * Listeners are registered on the manager and events are dispatched through the\n * manager.\n *\n * @author Guilherme Blanco <guilhermeblanco@hotmail.com>\n * @author Jonathan Wage <jonwage@gmail.com>\n * @author Roman Borschel <roman@code-factory.org>\n * @author Bernhard Schussek <bschussek@gmail.com>\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @author Jordan Alliot <jordan.alliot@gmail.com>\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass EventDispatcher implements EventDispatcherInterface\n{\n    private array $listeners = [];\n    private array $sorted = [];\n    private array $optimized;\n\n    public function __construct()\n    {\n        if (__CLASS__ === static::class) {\n            $this->optimized = [];\n        }\n    }\n\n    public function dispatch(object $event, ?string $eventName = null): object\n    {\n        $eventName ??= $event::class;\n\n        if (isset($this->optimized)) {\n            $listeners = $this->optimized[$eventName] ?? (empty($this->listeners[$eventName]) ? [] : $this->optimizeListeners($eventName));\n        } else {\n            $listeners = $this->getListeners($eventName);\n        }\n\n        if ($listeners) {\n            $this->callListeners($listeners, $eventName, $event);\n        }\n\n        return $event;\n    }\n\n    public function getListeners(?string $eventName = null): array\n    {\n        if (null !== $eventName) {\n            if (empty($this->listeners[$eventName])) {\n                return [];\n            }\n\n            if (!isset($this->sorted[$eventName])) {\n                $this->sortListeners($eventName);\n            }\n\n            return $this->sorted[$eventName];\n        }\n\n        foreach ($this->listeners as $eventName => $eventListeners) {\n            if (!isset($this->sorted[$eventName])) {\n                $this->sortListeners($eventName);\n            }\n        }\n\n        return array_filter($this->sorted);\n    }\n\n    public function getListenerPriority(string $eventName, callable|array $listener): ?int\n    {\n        if (empty($this->listeners[$eventName])) {\n            return null;\n        }\n\n        if (\\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \\Closure && 2 >= \\count($listener)) {\n            $listener[0] = $listener[0]();\n            $listener[1] ??= '__invoke';\n        }\n\n        foreach ($this->listeners[$eventName] as $priority => &$listeners) {\n            foreach ($listeners as &$v) {\n                if ($v !== $listener && \\is_array($v) && isset($v[0]) && $v[0] instanceof \\Closure && 2 >= \\count($v)) {\n                    $v[0] = $v[0]();\n                    $v[1] ??= '__invoke';\n                }\n                if ($v === $listener || ($listener instanceof \\Closure && $v == $listener)) {\n                    return $priority;\n                }\n            }\n        }\n\n        return null;\n    }\n\n    public function hasListeners(?string $eventName = null): bool\n    {\n        if (null !== $eventName) {\n            return !empty($this->listeners[$eventName]);\n        }\n\n        foreach ($this->listeners as $eventListeners) {\n            if ($eventListeners) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * @return void\n     */\n    public function addListener(string $eventName, callable|array $listener, int $priority = 0)\n    {\n        $this->listeners[$eventName][$priority][] = $listener;\n        unset($this->sorted[$eventName], $this->optimized[$eventName]);\n    }\n\n    /**\n     * @return void\n     */\n    public function removeListener(string $eventName, callable|array $listener)\n    {\n        if (empty($this->listeners[$eventName])) {\n            return;\n        }\n\n        if (\\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \\Closure && 2 >= \\count($listener)) {\n            $listener[0] = $listener[0]();\n            $listener[1] ??= '__invoke';\n        }\n\n        foreach ($this->listeners[$eventName] as $priority => &$listeners) {\n            foreach ($listeners as $k => &$v) {\n                if ($v !== $listener && \\is_array($v) && isset($v[0]) && $v[0] instanceof \\Closure && 2 >= \\count($v)) {\n                    $v[0] = $v[0]();\n                    $v[1] ??= '__invoke';\n                }\n                if ($v === $listener || ($listener instanceof \\Closure && $v == $listener)) {\n                    unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]);\n                }\n            }\n\n            if (!$listeners) {\n                unset($this->listeners[$eventName][$priority]);\n            }\n        }\n    }\n\n    /**\n     * @return void\n     */\n    public function addSubscriber(EventSubscriberInterface $subscriber)\n    {\n        foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {\n            if (\\is_string($params)) {\n                $this->addListener($eventName, [$subscriber, $params]);\n            } elseif (\\is_string($params[0])) {\n                $this->addListener($eventName, [$subscriber, $params[0]], $params[1] ?? 0);\n            } else {\n                foreach ($params as $listener) {\n                    $this->addListener($eventName, [$subscriber, $listener[0]], $listener[1] ?? 0);\n                }\n            }\n        }\n    }\n\n    /**\n     * @return void\n     */\n    public function removeSubscriber(EventSubscriberInterface $subscriber)\n    {\n        foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {\n            if (\\is_array($params) && \\is_array($params[0])) {\n                foreach ($params as $listener) {\n                    $this->removeListener($eventName, [$subscriber, $listener[0]]);\n                }\n            } else {\n                $this->removeListener($eventName, [$subscriber, \\is_string($params) ? $params : $params[0]]);\n            }\n        }\n    }\n\n    /**\n     * Triggers the listeners of an event.\n     *\n     * This method can be overridden to add functionality that is executed\n     * for each listener.\n     *\n     * @param callable[] $listeners The event listeners\n     * @param string     $eventName The name of the event to dispatch\n     * @param object     $event     The event object to pass to the event handlers/listeners\n     *\n     * @return void\n     */\n    protected function callListeners(iterable $listeners, string $eventName, object $event)\n    {\n        $stoppable = $event instanceof StoppableEventInterface;\n\n        foreach ($listeners as $listener) {\n            if ($stoppable && $event->isPropagationStopped()) {\n                break;\n            }\n            $listener($event, $eventName, $this);\n        }\n    }\n\n    /**\n     * Sorts the internal list of listeners for the given event by priority.\n     */\n    private function sortListeners(string $eventName): void\n    {\n        krsort($this->listeners[$eventName]);\n        $this->sorted[$eventName] = [];\n\n        foreach ($this->listeners[$eventName] as &$listeners) {\n            foreach ($listeners as &$listener) {\n                if (\\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \\Closure && 2 >= \\count($listener)) {\n                    $listener[0] = $listener[0]();\n                    $listener[1] ??= '__invoke';\n                }\n                $this->sorted[$eventName][] = $listener;\n            }\n        }\n    }\n\n    /**\n     * Optimizes the internal list of listeners for the given event by priority.\n     */\n    private function optimizeListeners(string $eventName): array\n    {\n        krsort($this->listeners[$eventName]);\n        $this->optimized[$eventName] = [];\n\n        foreach ($this->listeners[$eventName] as &$listeners) {\n            foreach ($listeners as &$listener) {\n                $closure = &$this->optimized[$eventName][];\n                if (\\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \\Closure && 2 >= \\count($listener)) {\n                    $closure = static function (...$args) use (&$listener, &$closure) {\n                        if ($listener[0] instanceof \\Closure) {\n                            $listener[0] = $listener[0]();\n                            $listener[1] ??= '__invoke';\n                        }\n                        ($closure = $listener(...))(...$args);\n                    };\n                } else {\n                    $closure = $listener instanceof WrappedListener ? $listener : $listener(...);\n                }\n            }\n        }\n\n        return $this->optimized[$eventName];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/EventDispatcherInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\EventDispatcher;\n\nuse Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface as ContractsEventDispatcherInterface;\n\n/**\n * The EventDispatcherInterface is the central point of Symfony's event listener system.\n * Listeners are registered on the manager and events are dispatched through the\n * manager.\n *\n * @author Bernhard Schussek <bschussek@gmail.com>\n */\ninterface EventDispatcherInterface extends ContractsEventDispatcherInterface\n{\n    /**\n     * Adds an event listener that listens on the specified events.\n     *\n     * @param int $priority The higher this value, the earlier an event\n     *                      listener will be triggered in the chain (defaults to 0)\n     *\n     * @return void\n     */\n    public function addListener(string $eventName, callable $listener, int $priority = 0);\n\n    /**\n     * Adds an event subscriber.\n     *\n     * The subscriber is asked for all the events it is\n     * interested in and added as a listener for these events.\n     *\n     * @return void\n     */\n    public function addSubscriber(EventSubscriberInterface $subscriber);\n\n    /**\n     * Removes an event listener from the specified events.\n     *\n     * @return void\n     */\n    public function removeListener(string $eventName, callable $listener);\n\n    /**\n     * @return void\n     */\n    public function removeSubscriber(EventSubscriberInterface $subscriber);\n\n    /**\n     * Gets the listeners of a specific event or all listeners sorted by descending priority.\n     *\n     * @return array<callable[]|callable>\n     */\n    public function getListeners(?string $eventName = null): array;\n\n    /**\n     * Gets the listener priority for a specific event.\n     *\n     * Returns null if the event or the listener does not exist.\n     */\n    public function getListenerPriority(string $eventName, callable $listener): ?int;\n\n    /**\n     * Checks whether an event has any registered listeners.\n     */\n    public function hasListeners(?string $eventName = null): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/EventSubscriberInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\EventDispatcher;\n\n/**\n * An EventSubscriber knows itself what events it is interested in.\n * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes\n * {@link getSubscribedEvents} and registers the subscriber as a listener for all\n * returned events.\n *\n * @author Guilherme Blanco <guilhermeblanco@hotmail.com>\n * @author Jonathan Wage <jonwage@gmail.com>\n * @author Roman Borschel <roman@code-factory.org>\n * @author Bernhard Schussek <bschussek@gmail.com>\n */\ninterface EventSubscriberInterface\n{\n    /**\n     * Returns an array of event names this subscriber wants to listen to.\n     *\n     * The array keys are event names and the value can be:\n     *\n     *  * The method name to call (priority defaults to 0)\n     *  * An array composed of the method name to call and the priority\n     *  * An array of arrays composed of the method names to call and respective\n     *    priorities, or 0 if unset\n     *\n     * For instance:\n     *\n     *  * ['eventName' => 'methodName']\n     *  * ['eventName' => ['methodName', $priority]]\n     *  * ['eventName' => [['methodName1', $priority], ['methodName2']]]\n     *\n     * The code must not depend on runtime state as it will only be called at compile time.\n     * All logic depending on runtime state must be put into the individual methods handling the events.\n     *\n     * @return array<string, string|array{0: string, 1: int}|list<array{0: string, 1?: int}>>\n     */\n    public static function getSubscribedEvents();\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/GenericEvent.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\EventDispatcher;\n\nuse Symfony\\Contracts\\EventDispatcher\\Event;\n\n/**\n * Event encapsulation class.\n *\n * Encapsulates events thus decoupling the observer from the subject they encapsulate.\n *\n * @author Drak <drak@zikula.org>\n *\n * @implements \\ArrayAccess<string, mixed>\n * @implements \\IteratorAggregate<string, mixed>\n */\nclass GenericEvent extends Event implements \\ArrayAccess, \\IteratorAggregate\n{\n    protected $subject;\n    protected $arguments;\n\n    /**\n     * Encapsulate an event with $subject and $arguments.\n     *\n     * @param mixed $subject   The subject of the event, usually an object or a callable\n     * @param array $arguments Arguments to store in the event\n     */\n    public function __construct(mixed $subject = null, array $arguments = [])\n    {\n        $this->subject = $subject;\n        $this->arguments = $arguments;\n    }\n\n    /**\n     * Getter for subject property.\n     */\n    public function getSubject(): mixed\n    {\n        return $this->subject;\n    }\n\n    /**\n     * Get argument by key.\n     *\n     * @throws \\InvalidArgumentException if key is not found\n     */\n    public function getArgument(string $key): mixed\n    {\n        if ($this->hasArgument($key)) {\n            return $this->arguments[$key];\n        }\n\n        throw new \\InvalidArgumentException(sprintf('Argument \"%s\" not found.', $key));\n    }\n\n    /**\n     * Add argument to event.\n     *\n     * @return $this\n     */\n    public function setArgument(string $key, mixed $value): static\n    {\n        $this->arguments[$key] = $value;\n\n        return $this;\n    }\n\n    /**\n     * Getter for all arguments.\n     */\n    public function getArguments(): array\n    {\n        return $this->arguments;\n    }\n\n    /**\n     * Set args property.\n     *\n     * @return $this\n     */\n    public function setArguments(array $args = []): static\n    {\n        $this->arguments = $args;\n\n        return $this;\n    }\n\n    /**\n     * Has argument.\n     */\n    public function hasArgument(string $key): bool\n    {\n        return \\array_key_exists($key, $this->arguments);\n    }\n\n    /**\n     * ArrayAccess for argument getter.\n     *\n     * @param string $key Array key\n     *\n     * @throws \\InvalidArgumentException if key does not exist in $this->args\n     */\n    public function offsetGet(mixed $key): mixed\n    {\n        return $this->getArgument($key);\n    }\n\n    /**\n     * ArrayAccess for argument setter.\n     *\n     * @param string $key Array key to set\n     */\n    public function offsetSet(mixed $key, mixed $value): void\n    {\n        $this->setArgument($key, $value);\n    }\n\n    /**\n     * ArrayAccess for unset argument.\n     *\n     * @param string $key Array key\n     */\n    public function offsetUnset(mixed $key): void\n    {\n        if ($this->hasArgument($key)) {\n            unset($this->arguments[$key]);\n        }\n    }\n\n    /**\n     * ArrayAccess has argument.\n     *\n     * @param string $key Array key\n     */\n    public function offsetExists(mixed $key): bool\n    {\n        return $this->hasArgument($key);\n    }\n\n    /**\n     * IteratorAggregate for iterating over the object like an array.\n     *\n     * @return \\ArrayIterator<string, mixed>\n     */\n    public function getIterator(): \\ArrayIterator\n    {\n        return new \\ArrayIterator($this->arguments);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\EventDispatcher;\n\n/**\n * A read-only proxy for an event dispatcher.\n *\n * @author Bernhard Schussek <bschussek@gmail.com>\n */\nclass ImmutableEventDispatcher implements EventDispatcherInterface\n{\n    private EventDispatcherInterface $dispatcher;\n\n    public function __construct(EventDispatcherInterface $dispatcher)\n    {\n        $this->dispatcher = $dispatcher;\n    }\n\n    public function dispatch(object $event, ?string $eventName = null): object\n    {\n        return $this->dispatcher->dispatch($event, $eventName);\n    }\n\n    /**\n     * @return never\n     */\n    public function addListener(string $eventName, callable|array $listener, int $priority = 0)\n    {\n        throw new \\BadMethodCallException('Unmodifiable event dispatchers must not be modified.');\n    }\n\n    /**\n     * @return never\n     */\n    public function addSubscriber(EventSubscriberInterface $subscriber)\n    {\n        throw new \\BadMethodCallException('Unmodifiable event dispatchers must not be modified.');\n    }\n\n    /**\n     * @return never\n     */\n    public function removeListener(string $eventName, callable|array $listener)\n    {\n        throw new \\BadMethodCallException('Unmodifiable event dispatchers must not be modified.');\n    }\n\n    /**\n     * @return never\n     */\n    public function removeSubscriber(EventSubscriberInterface $subscriber)\n    {\n        throw new \\BadMethodCallException('Unmodifiable event dispatchers must not be modified.');\n    }\n\n    public function getListeners(?string $eventName = null): array\n    {\n        return $this->dispatcher->getListeners($eventName);\n    }\n\n    public function getListenerPriority(string $eventName, callable|array $listener): ?int\n    {\n        return $this->dispatcher->getListenerPriority($eventName, $listener);\n    }\n\n    public function hasListeners(?string $eventName = null): bool\n    {\n        return $this->dispatcher->hasListeners($eventName);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/LICENSE",
    "content": "Copyright (c) 2004-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/README.md",
    "content": "EventDispatcher Component\n=========================\n\nThe EventDispatcher component provides tools that allow your application\ncomponents to communicate with each other by dispatching events and listening to\nthem.\n\nResources\n---------\n\n * [Documentation](https://symfony.com/doc/current/components/event_dispatcher.html)\n * [Contributing](https://symfony.com/doc/current/contributing/index.html)\n * [Report issues](https://github.com/symfony/symfony/issues) and\n   [send Pull Requests](https://github.com/symfony/symfony/pulls)\n   in the [main Symfony repository](https://github.com/symfony/symfony)\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher/composer.json",
    "content": "{\n    \"name\": \"symfony/event-dispatcher\",\n    \"type\": \"library\",\n    \"description\": \"Provides tools that allow your application components to communicate with each other by dispatching events and listening to them\",\n    \"keywords\": [],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Fabien Potencier\",\n            \"email\": \"fabien@symfony.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.1\",\n        \"symfony/event-dispatcher-contracts\": \"^2.5|^3\"\n    },\n    \"require-dev\": {\n        \"symfony/dependency-injection\": \"^5.4|^6.0|^7.0\",\n        \"symfony/expression-language\": \"^5.4|^6.0|^7.0\",\n        \"symfony/config\": \"^5.4|^6.0|^7.0\",\n        \"symfony/error-handler\": \"^5.4|^6.0|^7.0\",\n        \"symfony/http-foundation\": \"^5.4|^6.0|^7.0\",\n        \"symfony/service-contracts\": \"^2.5|^3\",\n        \"symfony/stopwatch\": \"^5.4|^6.0|^7.0\",\n        \"psr/log\": \"^1|^2|^3\"\n    },\n    \"conflict\": {\n        \"symfony/dependency-injection\": \"<5.4\",\n        \"symfony/service-contracts\": \"<2.5\"\n    },\n    \"provide\": {\n        \"psr/event-dispatcher-implementation\": \"1.0\",\n        \"symfony/event-dispatcher-implementation\": \"2.0|3.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Component\\\\EventDispatcher\\\\\": \"\" },\n        \"exclude-from-classmap\": [\n            \"/Tests/\"\n        ]\n    },\n    \"minimum-stability\": \"dev\"\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/CHANGELOG.md",
    "content": "CHANGELOG\n=========\n\nThe changelog is maintained for all Symfony contracts at the following URL:\nhttps://github.com/symfony/contracts/blob/main/CHANGELOG.md\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/Event.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\EventDispatcher;\n\nuse Psr\\EventDispatcher\\StoppableEventInterface;\n\n/**\n * Event is the base class for classes containing event data.\n *\n * This class contains no event data. It is used by events that do not pass\n * state information to an event handler when an event is raised.\n *\n * You can call the method stopPropagation() to abort the execution of\n * further listeners in your event listener.\n *\n * @author Guilherme Blanco <guilhermeblanco@hotmail.com>\n * @author Jonathan Wage <jonwage@gmail.com>\n * @author Roman Borschel <roman@code-factory.org>\n * @author Bernhard Schussek <bschussek@gmail.com>\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass Event implements StoppableEventInterface\n{\n    private bool $propagationStopped = false;\n\n    public function isPropagationStopped(): bool\n    {\n        return $this->propagationStopped;\n    }\n\n    /**\n     * Stops the propagation of the event to further event listeners.\n     *\n     * If multiple event listeners are connected to the same event, no\n     * further event listener will be triggered once any trigger calls\n     * stopPropagation().\n     */\n    public function stopPropagation(): void\n    {\n        $this->propagationStopped = true;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\EventDispatcher;\n\nuse Psr\\EventDispatcher\\EventDispatcherInterface as PsrEventDispatcherInterface;\n\n/**\n * Allows providing hooks on domain-specific lifecycles by dispatching events.\n */\ninterface EventDispatcherInterface extends PsrEventDispatcherInterface\n{\n    /**\n     * Dispatches an event to all registered listeners.\n     *\n     * @template T of object\n     *\n     * @param T           $event     The event to pass to the event handlers/listeners\n     * @param string|null $eventName The name of the event to dispatch. If not supplied,\n     *                               the class of $event should be used instead.\n     *\n     * @return T The passed $event MUST be returned\n     */\n    public function dispatch(object $event, ?string $eventName = null): object;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/LICENSE",
    "content": "Copyright (c) 2018-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/README.md",
    "content": "Symfony EventDispatcher Contracts\n=================================\n\nA set of abstractions extracted out of the Symfony components.\n\nCan be used to build on semantics that the Symfony components proved useful and\nthat already have battle tested implementations.\n\nSee https://github.com/symfony/contracts/blob/main/README.md for more information.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/composer.json",
    "content": "{\n    \"name\": \"symfony/event-dispatcher-contracts\",\n    \"type\": \"library\",\n    \"description\": \"Generic abstractions related to dispatching event\",\n    \"keywords\": [\"abstractions\", \"contracts\", \"decoupling\", \"interfaces\", \"interoperability\", \"standards\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.1\",\n        \"psr/event-dispatcher\": \"^1\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Contracts\\\\EventDispatcher\\\\\": \"\" }\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-main\": \"3.5-dev\"\n        },\n        \"thanks\": {\n            \"name\": \"symfony/contracts\",\n            \"url\": \"https://github.com/symfony/contracts\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/AcceptHeader.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(AcceptHeaderItem::class);\n\n/**\n * Represents an Accept-* header.\n *\n * An accept header is compound with a list of items,\n * sorted by descending quality.\n *\n * @author Jean-François Simon <contact@jfsimon.fr>\n */\nclass AcceptHeader\n{\n    /**\n     * @var AcceptHeaderItem[]\n     */\n    private array $items = [];\n\n    private bool $sorted = true;\n\n    /**\n     * @param AcceptHeaderItem[] $items\n     */\n    public function __construct(array $items)\n    {\n        foreach ($items as $item) {\n            $this->add($item);\n        }\n    }\n\n    /**\n     * Builds an AcceptHeader instance from a string.\n     */\n    public static function fromString(?string $headerValue): self\n    {\n        $parts = HeaderUtils::split($headerValue ?? '', ',;=');\n\n        return new self(array_map(function ($subParts) {\n            static $index = 0;\n            $part = array_shift($subParts);\n            $attributes = HeaderUtils::combine($subParts);\n\n            $item = new AcceptHeaderItem($part[0], $attributes);\n            $item->setIndex($index++);\n\n            return $item;\n        }, $parts));\n    }\n\n    /**\n     * Returns header value's string representation.\n     */\n    public function __toString(): string\n    {\n        return implode(',', $this->items);\n    }\n\n    /**\n     * Tests if header has given value.\n     */\n    public function has(string $value): bool\n    {\n        return isset($this->items[$value]);\n    }\n\n    /**\n     * Returns given value's item, if exists.\n     */\n    public function get(string $value): ?AcceptHeaderItem\n    {\n        return $this->items[$value] ?? $this->items[explode('/', $value)[0].'/*'] ?? $this->items['*/*'] ?? $this->items['*'] ?? null;\n    }\n\n    /**\n     * Adds an item.\n     *\n     * @return $this\n     */\n    public function add(AcceptHeaderItem $item): static\n    {\n        $this->items[$item->getValue()] = $item;\n        $this->sorted = false;\n\n        return $this;\n    }\n\n    /**\n     * Returns all items.\n     *\n     * @return AcceptHeaderItem[]\n     */\n    public function all(): array\n    {\n        $this->sort();\n\n        return $this->items;\n    }\n\n    /**\n     * Filters items on their value using given regex.\n     */\n    public function filter(string $pattern): self\n    {\n        return new self(array_filter($this->items, fn (AcceptHeaderItem $item) => preg_match($pattern, $item->getValue())));\n    }\n\n    /**\n     * Returns first item.\n     */\n    public function first(): ?AcceptHeaderItem\n    {\n        $this->sort();\n\n        return $this->items ? reset($this->items) : null;\n    }\n\n    /**\n     * Sorts items by descending quality.\n     */\n    private function sort(): void\n    {\n        if (!$this->sorted) {\n            uasort($this->items, function (AcceptHeaderItem $a, AcceptHeaderItem $b) {\n                $qA = $a->getQuality();\n                $qB = $b->getQuality();\n\n                if ($qA === $qB) {\n                    return $a->getIndex() > $b->getIndex() ? 1 : -1;\n                }\n\n                return $qA > $qB ? -1 : 1;\n            });\n\n            $this->sorted = true;\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/AcceptHeaderItem.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * Represents an Accept-* header item.\n *\n * @author Jean-François Simon <contact@jfsimon.fr>\n */\nclass AcceptHeaderItem\n{\n    private string $value;\n    private float $quality = 1.0;\n    private int $index = 0;\n    private array $attributes = [];\n\n    public function __construct(string $value, array $attributes = [])\n    {\n        $this->value = $value;\n        foreach ($attributes as $name => $value) {\n            $this->setAttribute($name, $value);\n        }\n    }\n\n    /**\n     * Builds an AcceptHeaderInstance instance from a string.\n     */\n    public static function fromString(?string $itemValue): self\n    {\n        $parts = HeaderUtils::split($itemValue ?? '', ';=');\n\n        $part = array_shift($parts);\n        $attributes = HeaderUtils::combine($parts);\n\n        return new self($part[0], $attributes);\n    }\n\n    /**\n     * Returns header value's string representation.\n     */\n    public function __toString(): string\n    {\n        $string = $this->value.($this->quality < 1 ? ';q='.$this->quality : '');\n        if (\\count($this->attributes) > 0) {\n            $string .= '; '.HeaderUtils::toString($this->attributes, ';');\n        }\n\n        return $string;\n    }\n\n    /**\n     * Set the item value.\n     *\n     * @return $this\n     */\n    public function setValue(string $value): static\n    {\n        $this->value = $value;\n\n        return $this;\n    }\n\n    /**\n     * Returns the item value.\n     */\n    public function getValue(): string\n    {\n        return $this->value;\n    }\n\n    /**\n     * Set the item quality.\n     *\n     * @return $this\n     */\n    public function setQuality(float $quality): static\n    {\n        $this->quality = $quality;\n\n        return $this;\n    }\n\n    /**\n     * Returns the item quality.\n     */\n    public function getQuality(): float\n    {\n        return $this->quality;\n    }\n\n    /**\n     * Set the item index.\n     *\n     * @return $this\n     */\n    public function setIndex(int $index): static\n    {\n        $this->index = $index;\n\n        return $this;\n    }\n\n    /**\n     * Returns the item index.\n     */\n    public function getIndex(): int\n    {\n        return $this->index;\n    }\n\n    /**\n     * Tests if an attribute exists.\n     */\n    public function hasAttribute(string $name): bool\n    {\n        return isset($this->attributes[$name]);\n    }\n\n    /**\n     * Returns an attribute by its name.\n     */\n    public function getAttribute(string $name, mixed $default = null): mixed\n    {\n        return $this->attributes[$name] ?? $default;\n    }\n\n    /**\n     * Returns all attributes.\n     */\n    public function getAttributes(): array\n    {\n        return $this->attributes;\n    }\n\n    /**\n     * Set an attribute.\n     *\n     * @return $this\n     */\n    public function setAttribute(string $name, string $value): static\n    {\n        if ('q' === $name) {\n            $this->quality = (float) $value;\n        } else {\n            $this->attributes[$name] = $value;\n        }\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/BinaryFileResponse.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException;\nuse Symfony\\Component\\HttpFoundation\\File\\File;\n\n/**\n * BinaryFileResponse represents an HTTP response delivering a file.\n *\n * @author Niklas Fiekas <niklas.fiekas@tu-clausthal.de>\n * @author stealth35 <stealth35-php@live.fr>\n * @author Igor Wiedler <igor@wiedler.ch>\n * @author Jordan Alliot <jordan.alliot@gmail.com>\n * @author Sergey Linnik <linniksa@gmail.com>\n */\nclass BinaryFileResponse extends Response\n{\n    protected static $trustXSendfileTypeHeader = false;\n\n    /**\n     * @var File\n     */\n    protected $file;\n    protected $offset = 0;\n    protected $maxlen = -1;\n    protected $deleteFileAfterSend = false;\n    protected $chunkSize = 16 * 1024;\n\n    /**\n     * @param \\SplFileInfo|string $file               The file to stream\n     * @param int                 $status             The response status code (200 \"OK\" by default)\n     * @param array               $headers            An array of response headers\n     * @param bool                $public             Files are public by default\n     * @param string|null         $contentDisposition The type of Content-Disposition to set automatically with the filename\n     * @param bool                $autoEtag           Whether the ETag header should be automatically set\n     * @param bool                $autoLastModified   Whether the Last-Modified header should be automatically set\n     */\n    public function __construct(\\SplFileInfo|string $file, int $status = 200, array $headers = [], bool $public = true, ?string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true)\n    {\n        parent::__construct(null, $status, $headers);\n\n        $this->setFile($file, $contentDisposition, $autoEtag, $autoLastModified);\n\n        if ($public) {\n            $this->setPublic();\n        }\n    }\n\n    /**\n     * Sets the file to stream.\n     *\n     * @return $this\n     *\n     * @throws FileException\n     */\n    public function setFile(\\SplFileInfo|string $file, ?string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true): static\n    {\n        if (!$file instanceof File) {\n            if ($file instanceof \\SplFileInfo) {\n                $file = new File($file->getPathname());\n            } else {\n                $file = new File((string) $file);\n            }\n        }\n\n        if (!$file->isReadable()) {\n            throw new FileException('File must be readable.');\n        }\n\n        $this->file = $file;\n\n        if ($autoEtag) {\n            $this->setAutoEtag();\n        }\n\n        if ($autoLastModified) {\n            $this->setAutoLastModified();\n        }\n\n        if ($contentDisposition) {\n            $this->setContentDisposition($contentDisposition);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Gets the file.\n     */\n    public function getFile(): File\n    {\n        return $this->file;\n    }\n\n    /**\n     * Sets the response stream chunk size.\n     *\n     * @return $this\n     */\n    public function setChunkSize(int $chunkSize): static\n    {\n        if ($chunkSize < 1 || $chunkSize > \\PHP_INT_MAX) {\n            throw new \\LogicException('The chunk size of a BinaryFileResponse cannot be less than 1 or greater than PHP_INT_MAX.');\n        }\n\n        $this->chunkSize = $chunkSize;\n\n        return $this;\n    }\n\n    /**\n     * Automatically sets the Last-Modified header according the file modification date.\n     *\n     * @return $this\n     */\n    public function setAutoLastModified(): static\n    {\n        $this->setLastModified(\\DateTimeImmutable::createFromFormat('U', $this->file->getMTime()));\n\n        return $this;\n    }\n\n    /**\n     * Automatically sets the ETag header according to the checksum of the file.\n     *\n     * @return $this\n     */\n    public function setAutoEtag(): static\n    {\n        $this->setEtag(base64_encode(hash_file('sha256', $this->file->getPathname(), true)));\n\n        return $this;\n    }\n\n    /**\n     * Sets the Content-Disposition header with the given filename.\n     *\n     * @param string $disposition      ResponseHeaderBag::DISPOSITION_INLINE or ResponseHeaderBag::DISPOSITION_ATTACHMENT\n     * @param string $filename         Optionally use this UTF-8 encoded filename instead of the real name of the file\n     * @param string $filenameFallback A fallback filename, containing only ASCII characters. Defaults to an automatically encoded filename\n     *\n     * @return $this\n     */\n    public function setContentDisposition(string $disposition, string $filename = '', string $filenameFallback = ''): static\n    {\n        if ('' === $filename) {\n            $filename = $this->file->getFilename();\n        }\n\n        if ('' === $filenameFallback && (!preg_match('/^[\\x20-\\x7e]*$/', $filename) || str_contains($filename, '%'))) {\n            $encoding = mb_detect_encoding($filename, null, true) ?: '8bit';\n\n            for ($i = 0, $filenameLength = mb_strlen($filename, $encoding); $i < $filenameLength; ++$i) {\n                $char = mb_substr($filename, $i, 1, $encoding);\n\n                if ('%' === $char || \\ord($char) < 32 || \\ord($char) > 126) {\n                    $filenameFallback .= '_';\n                } else {\n                    $filenameFallback .= $char;\n                }\n            }\n        }\n\n        $dispositionHeader = $this->headers->makeDisposition($disposition, $filename, $filenameFallback);\n        $this->headers->set('Content-Disposition', $dispositionHeader);\n\n        return $this;\n    }\n\n    public function prepare(Request $request): static\n    {\n        if ($this->isInformational() || $this->isEmpty()) {\n            parent::prepare($request);\n\n            $this->maxlen = 0;\n\n            return $this;\n        }\n\n        if (!$this->headers->has('Content-Type')) {\n            $this->headers->set('Content-Type', $this->file->getMimeType() ?: 'application/octet-stream');\n        }\n\n        parent::prepare($request);\n\n        $this->offset = 0;\n        $this->maxlen = -1;\n\n        if (false === $fileSize = $this->file->getSize()) {\n            return $this;\n        }\n        $this->headers->remove('Transfer-Encoding');\n        $this->headers->set('Content-Length', $fileSize);\n\n        if (!$this->headers->has('Accept-Ranges')) {\n            // Only accept ranges on safe HTTP methods\n            $this->headers->set('Accept-Ranges', $request->isMethodSafe() ? 'bytes' : 'none');\n        }\n\n        if (self::$trustXSendfileTypeHeader && $request->headers->has('X-Sendfile-Type')) {\n            // Use X-Sendfile, do not send any content.\n            $type = $request->headers->get('X-Sendfile-Type');\n            $path = $this->file->getRealPath();\n            // Fall back to scheme://path for stream wrapped locations.\n            if (false === $path) {\n                $path = $this->file->getPathname();\n            }\n            if ('x-accel-redirect' === strtolower($type)) {\n                // Do X-Accel-Mapping substitutions.\n                // @link https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/#x-accel-redirect\n                $parts = HeaderUtils::split($request->headers->get('X-Accel-Mapping', ''), ',=');\n                foreach ($parts as $part) {\n                    [$pathPrefix, $location] = $part;\n                    if (str_starts_with($path, $pathPrefix)) {\n                        $path = $location.substr($path, \\strlen($pathPrefix));\n                        // Only set X-Accel-Redirect header if a valid URI can be produced\n                        // as nginx does not serve arbitrary file paths.\n                        $this->headers->set($type, $path);\n                        $this->maxlen = 0;\n                        break;\n                    }\n                }\n            } else {\n                $this->headers->set($type, $path);\n                $this->maxlen = 0;\n            }\n        } elseif ($request->headers->has('Range') && $request->isMethod('GET')) {\n            // Process the range headers.\n            if (!$request->headers->has('If-Range') || $this->hasValidIfRangeHeader($request->headers->get('If-Range'))) {\n                $range = $request->headers->get('Range');\n\n                if (str_starts_with($range, 'bytes=')) {\n                    [$start, $end] = explode('-', substr($range, 6), 2) + [1 => 0];\n\n                    $end = ('' === $end) ? $fileSize - 1 : (int) $end;\n\n                    if ('' === $start) {\n                        $start = $fileSize - $end;\n                        $end = $fileSize - 1;\n                    } else {\n                        $start = (int) $start;\n                    }\n\n                    if ($start <= $end) {\n                        $end = min($end, $fileSize - 1);\n                        if ($start < 0 || $start > $end) {\n                            $this->setStatusCode(416);\n                            $this->headers->set('Content-Range', sprintf('bytes */%s', $fileSize));\n                        } elseif ($end - $start < $fileSize - 1) {\n                            $this->maxlen = $end < $fileSize ? $end - $start + 1 : -1;\n                            $this->offset = $start;\n\n                            $this->setStatusCode(206);\n                            $this->headers->set('Content-Range', sprintf('bytes %s-%s/%s', $start, $end, $fileSize));\n                            $this->headers->set('Content-Length', $end - $start + 1);\n                        }\n                    }\n                }\n            }\n        }\n\n        if ($request->isMethod('HEAD')) {\n            $this->maxlen = 0;\n        }\n\n        return $this;\n    }\n\n    private function hasValidIfRangeHeader(?string $header): bool\n    {\n        if ($this->getEtag() === $header) {\n            return true;\n        }\n\n        if (null === $lastModified = $this->getLastModified()) {\n            return false;\n        }\n\n        return $lastModified->format('D, d M Y H:i:s').' GMT' === $header;\n    }\n\n    public function sendContent(): static\n    {\n        try {\n            if (!$this->isSuccessful()) {\n                return $this;\n            }\n\n            if (0 === $this->maxlen) {\n                return $this;\n            }\n\n            $out = fopen('php://output', 'w');\n            $file = fopen($this->file->getPathname(), 'r');\n\n            ignore_user_abort(true);\n\n            if (0 !== $this->offset) {\n                fseek($file, $this->offset);\n            }\n\n            $length = $this->maxlen;\n            while ($length && !feof($file)) {\n                $read = $length > $this->chunkSize || 0 > $length ? $this->chunkSize : $length;\n\n                if (false === $data = fread($file, $read)) {\n                    break;\n                }\n                while ('' !== $data) {\n                    $read = fwrite($out, $data);\n                    if (false === $read || connection_aborted()) {\n                        break 2;\n                    }\n                    if (0 < $length) {\n                        $length -= $read;\n                    }\n                    $data = substr($data, $read);\n                }\n            }\n\n            fclose($out);\n            fclose($file);\n        } finally {\n            if ($this->deleteFileAfterSend && is_file($this->file->getPathname())) {\n                unlink($this->file->getPathname());\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * @throws \\LogicException when the content is not null\n     */\n    public function setContent(?string $content): static\n    {\n        if (null !== $content) {\n            throw new \\LogicException('The content cannot be set on a BinaryFileResponse instance.');\n        }\n\n        return $this;\n    }\n\n    public function getContent(): string|false\n    {\n        return false;\n    }\n\n    /**\n     * Trust X-Sendfile-Type header.\n     *\n     * @return void\n     */\n    public static function trustXSendfileTypeHeader()\n    {\n        self::$trustXSendfileTypeHeader = true;\n    }\n\n    /**\n     * If this is set to true, the file will be unlinked after the request is sent\n     * Note: If the X-Sendfile header is used, the deleteFileAfterSend setting will not be used.\n     *\n     * @return $this\n     */\n    public function deleteFileAfterSend(bool $shouldDelete = true): static\n    {\n        $this->deleteFileAfterSend = $shouldDelete;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/CHANGELOG.md",
    "content": "CHANGELOG\n=========\n\n6.4\n---\n\n * Make `HeaderBag::getDate()`, `Response::getDate()`, `getExpires()` and `getLastModified()` return a `DateTimeImmutable`\n * Support root-level `Generator` in `StreamedJsonResponse`\n * Add `UriSigner` from the HttpKernel component\n * Add `partitioned` flag to `Cookie` (CHIPS Cookie)\n * Add argument `bool $flush = true` to `Response::send()`\n* Make `MongoDbSessionHandler` instantiable with the mongodb extension directly\n\n6.3\n---\n\n * Calling `ParameterBag::getDigit()`, `getAlnum()`, `getAlpha()` on an `array` throws a `UnexpectedValueException` instead of a `TypeError`\n * Add `ParameterBag::getString()` to convert a parameter into string and throw an exception if the value is invalid\n * Add `ParameterBag::getEnum()`\n * Create migration for session table when pdo handler is used\n * Add support for Relay PHP extension for Redis\n * 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)\n * Add `IpUtils::isPrivateIp()`\n * Add `Request::getPayload(): InputBag`\n * Deprecate conversion of invalid values in `ParameterBag::getInt()` and `ParameterBag::getBoolean()`,\n * Deprecate ignoring invalid values when using `ParameterBag::filter()`, unless flag `FILTER_NULL_ON_FAILURE` is set\n\n6.2\n---\n\n * Add `StreamedJsonResponse` class for efficient JSON streaming\n * The HTTP cache store uses the `xxh128` algorithm\n * Deprecate calling `JsonResponse::setCallback()`, `Response::setExpires/setLastModified/setEtag()`, `MockArraySessionStorage/NativeSessionStorage::setMetadataBag()`, `NativeSessionStorage::setSaveHandler()` without arguments\n * Add request matchers under the `Symfony\\Component\\HttpFoundation\\RequestMatcher` namespace\n * Deprecate `RequestMatcher` in favor of `ChainRequestMatcher`\n * Deprecate `Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher` in favor of `Symfony\\Component\\HttpFoundation\\RequestMatcher\\ExpressionRequestMatcher`\n\n6.1\n---\n\n * Add stale while revalidate and stale if error cache header\n * Allow dynamic session \"ttl\" when using a remote storage\n * Deprecate `Request::getContentType()`, use `Request::getContentTypeFormat()` instead\n\n6.0\n---\n\n * Remove the `NamespacedAttributeBag` class\n * Removed `Response::create()`, `JsonResponse::create()`,\n   `RedirectResponse::create()`, `StreamedResponse::create()` and\n   `BinaryFileResponse::create()` methods (use `__construct()` instead)\n * Not passing a `Closure` together with `FILTER_CALLBACK` to `ParameterBag::filter()` throws an `\\InvalidArgumentException`; wrap your filter in a closure instead\n * Not passing a `Closure` together with `FILTER_CALLBACK` to `InputBag::filter()` throws an `\\InvalidArgumentException`; wrap your filter in a closure instead\n * 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\n * Rename `RequestStack::getMasterRequest()` to `getMainRequest()`\n * Not passing `FILTER_REQUIRE_ARRAY` or `FILTER_FORCE_ARRAY` flags to `InputBag::filter()` when filtering an array will throw `BadRequestException`\n * Removed the `Request::HEADER_X_FORWARDED_ALL` constant\n * Retrieving non-scalar values using `InputBag::get()` will throw `BadRequestException` (use `InputBad::all()` instead to retrieve an array)\n * Passing non-scalar default value as the second argument `InputBag::get()` will throw `\\InvalidArgumentException`\n * Passing non-scalar, non-array value as the second argument `InputBag::set()` will throw `\\InvalidArgumentException`\n * Passing `null` as `$requestIp` to `IpUtils::__checkIp()`, `IpUtils::__checkIp4()` or `IpUtils::__checkIp6()` is not supported anymore.\n\n5.4\n---\n\n * Deprecate passing `null` as `$requestIp` to `IpUtils::__checkIp()`, `IpUtils::__checkIp4()` or `IpUtils::__checkIp6()`, pass an empty string instead.\n * Add the `litespeed_finish_request` method to work with Litespeed\n * Deprecate `upload_progress.*` and `url_rewriter.tags` session options\n * Allow setting session options via DSN\n\n5.3\n---\n\n * Add the `SessionFactory`, `NativeSessionStorageFactory`, `PhpBridgeSessionStorageFactory` and `MockFileSessionStorageFactory` classes\n * Calling `Request::getSession()` when there is no available session throws a `SessionNotFoundException`\n * Add the `RequestStack::getSession` method\n * Deprecate the `NamespacedAttributeBag` class\n * Add `ResponseFormatSame` PHPUnit constraint\n * Deprecate the `RequestStack::getMasterRequest()` method and add `getMainRequest()` as replacement\n\n5.2.0\n-----\n\n * added support for `X-Forwarded-Prefix` header\n * added `HeaderUtils::parseQuery()`: it does the same as `parse_str()` but preserves dots in variable names\n * added `File::getContent()`\n * added ability to use comma separated ip addresses for `RequestMatcher::matchIps()`\n * added `Request::toArray()` to parse a JSON request body to an array\n * added `RateLimiter\\RequestRateLimiterInterface` and `RateLimiter\\AbstractRequestRateLimiter`\n * deprecated not passing a `Closure` together with `FILTER_CALLBACK` to `ParameterBag::filter()`; wrap your filter in a closure instead.\n * 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.\n * Deprecated `BinaryFileResponse::create()`, use `__construct()` instead\n\n5.1.0\n-----\n\n * added `Cookie::withValue`, `Cookie::withDomain`, `Cookie::withExpires`,\n   `Cookie::withPath`, `Cookie::withSecure`, `Cookie::withHttpOnly`,\n   `Cookie::withRaw`, `Cookie::withSameSite`\n * Deprecate `Response::create()`, `JsonResponse::create()`,\n   `RedirectResponse::create()`, and `StreamedResponse::create()` methods (use\n   `__construct()` instead)\n * added `Request::preferSafeContent()` and `Response::setContentSafe()` to handle \"safe\" HTTP preference\n   according to [RFC 8674](https://tools.ietf.org/html/rfc8674)\n * made the Mime component an optional dependency\n * added `MarshallingSessionHandler`, `IdentityMarshaller`\n * made `Session` accept a callback to report when the session is being used\n * Add support for all core cache control directives\n * Added `Symfony\\Component\\HttpFoundation\\InputBag`\n * Deprecated retrieving non-string values using `InputBag::get()`, use `InputBag::all()` if you need access to the collection of values\n\n5.0.0\n-----\n\n * made `Cookie` auto-secure and lax by default\n * removed classes in the `MimeType` namespace, use the Symfony Mime component instead\n * removed method `UploadedFile::getClientSize()` and the related constructor argument\n * made `Request::getSession()` throw if the session has not been set before\n * removed `Response::HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL`\n * passing a null url when instantiating a `RedirectResponse` is not allowed\n\n4.4.0\n-----\n\n * passing arguments to `Request::isMethodSafe()` is deprecated.\n * `ApacheRequest` is deprecated, use the `Request` class instead.\n * passing a third argument to `HeaderBag::get()` is deprecated, use method `all()` instead\n * [BC BREAK] `PdoSessionHandler` with MySQL changed the type of the lifetime column,\n   make sure to run `ALTER TABLE sessions MODIFY sess_lifetime INTEGER UNSIGNED NOT NULL` to\n   update your database.\n * `PdoSessionHandler` now precalculates the expiry timestamp in the lifetime column,\n    make sure to run `CREATE INDEX expiry ON sessions (sess_lifetime)` to update your database\n    to speed up garbage collection of expired sessions.\n * added `SessionHandlerFactory` to create session handlers with a DSN\n * added `IpUtils::anonymize()` to help with GDPR compliance.\n\n4.3.0\n-----\n\n * added PHPUnit constraints: `RequestAttributeValueSame`, `ResponseCookieValueSame`, `ResponseHasCookie`,\n   `ResponseHasHeader`, `ResponseHeaderSame`, `ResponseIsRedirected`, `ResponseIsSuccessful`, and `ResponseStatusCodeSame`\n * deprecated `MimeTypeGuesserInterface` and `ExtensionGuesserInterface` in favor of `Symfony\\Component\\Mime\\MimeTypesInterface`.\n * deprecated `MimeType` and `MimeTypeExtensionGuesser` in favor of `Symfony\\Component\\Mime\\MimeTypes`.\n * deprecated `FileBinaryMimeTypeGuesser` in favor of `Symfony\\Component\\Mime\\FileBinaryMimeTypeGuesser`.\n * deprecated `FileinfoMimeTypeGuesser` in favor of `Symfony\\Component\\Mime\\FileinfoMimeTypeGuesser`.\n * added `UrlHelper` that allows to get an absolute URL and a relative path for a given path\n\n4.2.0\n-----\n\n * the default value of the \"$secure\" and \"$samesite\" arguments of Cookie's constructor\n   will respectively change from \"false\" to \"null\" and from \"null\" to \"lax\" in Symfony\n   5.0, you should define their values explicitly or use \"Cookie::create()\" instead.\n * added `matchPort()` in RequestMatcher\n\n4.1.3\n-----\n\n * [BC BREAK] Support for the IIS-only `X_ORIGINAL_URL` and `X_REWRITE_URL`\n   HTTP headers has been dropped for security reasons.\n\n4.1.0\n-----\n\n * Query string normalization uses `parse_str()` instead of custom parsing logic.\n * Passing the file size to the constructor of the `UploadedFile` class is deprecated.\n * The `getClientSize()` method of the `UploadedFile` class is deprecated. Use `getSize()` instead.\n * added `RedisSessionHandler` to use Redis as a session storage\n * The `get()` method of the `AcceptHeader` class now takes into account the\n   `*` and `*/*` default values (if they are present in the Accept HTTP header)\n   when looking for items.\n * deprecated `Request::getSession()` when no session has been set. Use `Request::hasSession()` instead.\n * added `CannotWriteFileException`, `ExtensionFileException`, `FormSizeFileException`,\n   `IniSizeFileException`, `NoFileException`, `NoTmpDirFileException`, `PartialFileException` to\n   handle failed `UploadedFile`.\n * added `MigratingSessionHandler` for migrating between two session handlers without losing sessions\n * added `HeaderUtils`.\n\n4.0.0\n-----\n\n * the `Request::setTrustedHeaderName()` and `Request::getTrustedHeaderName()`\n   methods have been removed\n * the `Request::HEADER_CLIENT_IP` constant has been removed, use\n   `Request::HEADER_X_FORWARDED_FOR` instead\n * the `Request::HEADER_CLIENT_HOST` constant has been removed, use\n   `Request::HEADER_X_FORWARDED_HOST` instead\n * the `Request::HEADER_CLIENT_PROTO` constant has been removed, use\n   `Request::HEADER_X_FORWARDED_PROTO` instead\n * the `Request::HEADER_CLIENT_PORT` constant has been removed, use\n   `Request::HEADER_X_FORWARDED_PORT` instead\n * checking for cacheable HTTP methods using the `Request::isMethodSafe()`\n   method (by not passing `false` as its argument) is not supported anymore and\n   throws a `\\BadMethodCallException`\n * the `WriteCheckSessionHandler`, `NativeSessionHandler` and `NativeProxy` classes have been removed\n * setting session save handlers that do not implement `\\SessionHandlerInterface` in\n   `NativeSessionStorage::setSaveHandler()` is not supported anymore and throws a\n   `\\TypeError`\n\n3.4.0\n-----\n\n * implemented PHP 7.0's `SessionUpdateTimestampHandlerInterface` with a new\n   `AbstractSessionHandler` base class and a new `StrictSessionHandler` wrapper\n * deprecated the `WriteCheckSessionHandler`, `NativeSessionHandler` and `NativeProxy` classes\n * deprecated setting session save handlers that do not implement `\\SessionHandlerInterface` in `NativeSessionStorage::setSaveHandler()`\n * deprecated using `MongoDbSessionHandler` with the legacy mongo extension; use it with the mongodb/mongodb package and ext-mongodb instead\n * deprecated `MemcacheSessionHandler`; use `MemcachedSessionHandler` instead\n\n3.3.0\n-----\n\n * the `Request::setTrustedProxies()` method takes a new `$trustedHeaderSet` argument,\n   see https://symfony.com/doc/current/deployment/proxies.html for more info,\n * deprecated the `Request::setTrustedHeaderName()` and `Request::getTrustedHeaderName()` methods,\n * added `File\\Stream`, to be passed to `BinaryFileResponse` when the size of the served file is unknown,\n   disabling `Range` and `Content-Length` handling, switching to chunked encoding instead\n * added the `Cookie::fromString()` method that allows to create a cookie from a\n   raw header string\n\n3.1.0\n-----\n\n * Added support for creating `JsonResponse` with a string of JSON data\n\n3.0.0\n-----\n\n * The precedence of parameters returned from `Request::get()` changed from \"GET, PATH, BODY\" to \"PATH, GET, BODY\"\n\n2.8.0\n-----\n\n * Finding deep items in `ParameterBag::get()` is deprecated since version 2.8 and\n   will be removed in 3.0.\n\n2.6.0\n-----\n\n * PdoSessionHandler changes\n   - implemented different session locking strategies to prevent loss of data by concurrent access to the same session\n   - [BC BREAK] save session data in a binary column without base64_encode\n   - [BC BREAK] added lifetime column to the session table which allows to have different lifetimes for each session\n   - implemented lazy connections that are only opened when a session is used by either passing a dsn string\n     explicitly or falling back to session.save_path ini setting\n   - added a createTable method that initializes a correctly defined table depending on the database vendor\n\n2.5.0\n-----\n\n * added `JsonResponse::setEncodingOptions()` & `JsonResponse::getEncodingOptions()` for easier manipulation\n   of the options used while encoding data to JSON format.\n\n2.4.0\n-----\n\n * added RequestStack\n * added Request::getEncodings()\n * added accessors methods to session handlers\n\n2.3.0\n-----\n\n * added support for ranges of IPs in trusted proxies\n * `UploadedFile::isValid` now returns false if the file was not uploaded via HTTP (in a non-test mode)\n * Improved error-handling of `\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler`\n   to ensure the supplied PDO handler throws Exceptions on error (as the class expects). Added related test cases\n   to verify that Exceptions are properly thrown when the PDO queries fail.\n\n2.2.0\n-----\n\n * fixed the Request::create() precedence (URI information always take precedence now)\n * added Request::getTrustedProxies()\n * deprecated Request::isProxyTrusted()\n * [BC BREAK] JsonResponse does not turn a top level empty array to an object anymore, use an ArrayObject to enforce objects\n * added a IpUtils class to check if an IP belongs to a CIDR\n * added Request::getRealMethod() to get the \"real\" HTTP method (getMethod() returns the \"intended\" HTTP method)\n * disabled _method request parameter support by default (call Request::enableHttpMethodParameterOverride() to\n   enable it, and Request::getHttpMethodParameterOverride() to check if it is supported)\n * Request::splitHttpAcceptHeader() method is deprecated and will be removed in 2.3\n * Deprecated Flashbag::count() and \\Countable interface, will be removed in 2.3\n\n2.1.0\n-----\n\n * added Request::getSchemeAndHttpHost() and Request::getUserInfo()\n * added a fluent interface to the Response class\n * added Request::isProxyTrusted()\n * added JsonResponse\n * added a getTargetUrl method to RedirectResponse\n * added support for streamed responses\n * made Response::prepare() method the place to enforce HTTP specification\n * [BC BREAK] moved management of the locale from the Session class to the Request class\n * added a generic access to the PHP built-in filter mechanism: ParameterBag::filter()\n * made FileBinaryMimeTypeGuesser command configurable\n * added Request::getUser() and Request::getPassword()\n * added support for the PATCH method in Request\n * removed the ContentTypeMimeTypeGuesser class as it is deprecated and never used on PHP 5.3\n * added ResponseHeaderBag::makeDisposition() (implements RFC 6266)\n * made mimetype to extension conversion configurable\n * [BC BREAK] Moved all session related classes and interfaces into own namespace, as\n   `Symfony\\Component\\HttpFoundation\\Session` and renamed classes accordingly.\n   Session handlers are located in the subnamespace `Symfony\\Component\\HttpFoundation\\Session\\Handler`.\n * SessionHandlers must implement `\\SessionHandlerInterface` or extend from the\n   `Symfony\\Component\\HttpFoundation\\Storage\\Handler\\NativeSessionHandler` base class.\n * Added internal storage driver proxy mechanism for forward compatibility with\n   PHP 5.4 `\\SessionHandler` class.\n * Added session handlers for custom Memcache, Memcached and Null session save handlers.\n * [BC BREAK] Removed `NativeSessionStorage` and replaced with `NativeFileSessionHandler`.\n * [BC BREAK] `SessionStorageInterface` methods removed: `write()`, `read()` and\n   `remove()`.  Added `getBag()`, `registerBag()`.  The `NativeSessionStorage` class\n   is a mediator for the session storage internals including the session handlers\n   which do the real work of participating in the internal PHP session workflow.\n * [BC BREAK] Introduced mock implementations of `SessionStorage` to enable unit\n   and functional testing without starting real PHP sessions.  Removed\n   `ArraySessionStorage`, and replaced with `MockArraySessionStorage` for unit\n   tests; removed `FilesystemSessionStorage`, and replaced with`MockFileSessionStorage`\n   for functional tests.  These do not interact with global session ini\n   configuration values, session functions or `$_SESSION` superglobal. This means\n   they can be configured directly allowing multiple instances to work without\n   conflicting in the same PHP process.\n * [BC BREAK] Removed the `close()` method from the `Session` class, as this is\n   now redundant.\n * Deprecated the following methods from the Session class: `setFlash()`, `setFlashes()`\n   `getFlash()`, `hasFlash()`, and `removeFlash()`. Use `getFlashBag()` instead\n   which returns a `FlashBagInterface`.\n * `Session->clear()` now only clears session attributes as before it cleared\n   flash messages and attributes. `Session->getFlashBag()->all()` clears flashes now.\n * Session data is now managed by `SessionBagInterface` to better encapsulate\n   session data.\n * Refactored session attribute and flash messages system to their own\n  `SessionBagInterface` implementations.\n * Added `FlashBag`. Flashes expire when retrieved by `get()` or `all()`. This\n   implementation is ESI compatible.\n * Added `AutoExpireFlashBag` (default) to replicate Symfony 2.0.x auto expire\n   behavior of messages auto expiring after one page page load.  Messages must\n   be retrieved by `get()` or `all()`.\n * Added `Symfony\\Component\\HttpFoundation\\Attribute\\AttributeBag` to replicate\n   attributes storage behavior from 2.0.x (default).\n * Added `Symfony\\Component\\HttpFoundation\\Attribute\\NamespacedAttributeBag` for\n   namespace session attributes.\n * Flash API can stores messages in an array so there may be multiple messages\n   per flash type.  The old `Session` class API remains without BC break as it\n   will allow single messages as before.\n * Added basic session meta-data to the session to record session create time,\n   last updated time, and the lifetime of the session cookie that was provided\n   to the client.\n * Request::getClientIp() method doesn't take a parameter anymore but bases\n   itself on the trustProxy parameter.\n * Added isMethod() to Request object.\n * [BC BREAK] The methods `getPathInfo()`, `getBaseUrl()` and `getBasePath()` of\n   a `Request` now all return a raw value (vs a urldecoded value before). Any call\n   to one of these methods must be checked and wrapped in a `rawurldecode()` if\n   needed.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/ChainRequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * ChainRequestMatcher verifies that all checks match against a Request instance.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass ChainRequestMatcher implements RequestMatcherInterface\n{\n    /**\n     * @param iterable<RequestMatcherInterface> $matchers\n     */\n    public function __construct(private iterable $matchers)\n    {\n    }\n\n    public function matches(Request $request): bool\n    {\n        foreach ($this->matchers as $matcher) {\n            if (!$matcher->matches($request)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Cookie.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * Represents a cookie.\n *\n * @author Johannes M. Schmitt <schmittjoh@gmail.com>\n */\nclass Cookie\n{\n    public const SAMESITE_NONE = 'none';\n    public const SAMESITE_LAX = 'lax';\n    public const SAMESITE_STRICT = 'strict';\n\n    protected $name;\n    protected $value;\n    protected $domain;\n    protected $expire;\n    protected $path;\n    protected $secure;\n    protected $httpOnly;\n\n    private bool $raw;\n    private ?string $sameSite = null;\n    private bool $partitioned = false;\n    private bool $secureDefault = false;\n\n    private const RESERVED_CHARS_LIST = \"=,; \\t\\r\\n\\v\\f\";\n    private const RESERVED_CHARS_FROM = ['=', ',', ';', ' ', \"\\t\", \"\\r\", \"\\n\", \"\\v\", \"\\f\"];\n    private const RESERVED_CHARS_TO = ['%3D', '%2C', '%3B', '%20', '%09', '%0D', '%0A', '%0B', '%0C'];\n\n    /**\n     * Creates cookie from raw header string.\n     */\n    public static function fromString(string $cookie, bool $decode = false): static\n    {\n        $data = [\n            'expires' => 0,\n            'path' => '/',\n            'domain' => null,\n            'secure' => false,\n            'httponly' => false,\n            'raw' => !$decode,\n            'samesite' => null,\n            'partitioned' => false,\n        ];\n\n        $parts = HeaderUtils::split($cookie, ';=');\n        $part = array_shift($parts);\n\n        $name = $decode ? urldecode($part[0]) : $part[0];\n        $value = isset($part[1]) ? ($decode ? urldecode($part[1]) : $part[1]) : null;\n\n        $data = HeaderUtils::combine($parts) + $data;\n        $data['expires'] = self::expiresTimestamp($data['expires']);\n\n        if (isset($data['max-age']) && ($data['max-age'] > 0 || $data['expires'] > time())) {\n            $data['expires'] = time() + (int) $data['max-age'];\n        }\n\n        return new static($name, $value, $data['expires'], $data['path'], $data['domain'], $data['secure'], $data['httponly'], $data['raw'], $data['samesite'], $data['partitioned']);\n    }\n\n    /**\n     * @see self::__construct\n     *\n     * @param self::SAMESITE_*|''|null $sameSite\n     * @param bool                     $partitioned\n     */\n    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\n    {\n        $partitioned = 9 < \\func_num_args() ? func_get_arg(9) : false;\n\n        return new self($name, $value, $expire, $path, $domain, $secure, $httpOnly, $raw, $sameSite, $partitioned);\n    }\n\n    /**\n     * @param string                        $name     The name of the cookie\n     * @param string|null                   $value    The value of the cookie\n     * @param int|string|\\DateTimeInterface $expire   The time the cookie expires\n     * @param string|null                   $path     The path on the server in which the cookie will be available on\n     * @param string|null                   $domain   The domain that the cookie is available to\n     * @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\n     * @param bool                          $httpOnly Whether the cookie will be made accessible only through the HTTP protocol\n     * @param bool                          $raw      Whether the cookie value should be sent with no url encoding\n     * @param self::SAMESITE_*|''|null      $sameSite Whether the cookie will be available for cross-site requests\n     *\n     * @throws \\InvalidArgumentException\n     */\n    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)\n    {\n        // from PHP source code\n        if ($raw && false !== strpbrk($name, self::RESERVED_CHARS_LIST)) {\n            throw new \\InvalidArgumentException(sprintf('The cookie name \"%s\" contains invalid characters.', $name));\n        }\n\n        if (empty($name)) {\n            throw new \\InvalidArgumentException('The cookie name cannot be empty.');\n        }\n\n        $this->name = $name;\n        $this->value = $value;\n        $this->domain = $domain;\n        $this->expire = self::expiresTimestamp($expire);\n        $this->path = empty($path) ? '/' : $path;\n        $this->secure = $secure;\n        $this->httpOnly = $httpOnly;\n        $this->raw = $raw;\n        $this->sameSite = $this->withSameSite($sameSite)->sameSite;\n        $this->partitioned = $partitioned;\n    }\n\n    /**\n     * Creates a cookie copy with a new value.\n     */\n    public function withValue(?string $value): static\n    {\n        $cookie = clone $this;\n        $cookie->value = $value;\n\n        return $cookie;\n    }\n\n    /**\n     * Creates a cookie copy with a new domain that the cookie is available to.\n     */\n    public function withDomain(?string $domain): static\n    {\n        $cookie = clone $this;\n        $cookie->domain = $domain;\n\n        return $cookie;\n    }\n\n    /**\n     * Creates a cookie copy with a new time the cookie expires.\n     */\n    public function withExpires(int|string|\\DateTimeInterface $expire = 0): static\n    {\n        $cookie = clone $this;\n        $cookie->expire = self::expiresTimestamp($expire);\n\n        return $cookie;\n    }\n\n    /**\n     * Converts expires formats to a unix timestamp.\n     */\n    private static function expiresTimestamp(int|string|\\DateTimeInterface $expire = 0): int\n    {\n        // convert expiration time to a Unix timestamp\n        if ($expire instanceof \\DateTimeInterface) {\n            $expire = $expire->format('U');\n        } elseif (!is_numeric($expire)) {\n            $expire = strtotime($expire);\n\n            if (false === $expire) {\n                throw new \\InvalidArgumentException('The cookie expiration time is not valid.');\n            }\n        }\n\n        return 0 < $expire ? (int) $expire : 0;\n    }\n\n    /**\n     * Creates a cookie copy with a new path on the server in which the cookie will be available on.\n     */\n    public function withPath(string $path): static\n    {\n        $cookie = clone $this;\n        $cookie->path = '' === $path ? '/' : $path;\n\n        return $cookie;\n    }\n\n    /**\n     * Creates a cookie copy that only be transmitted over a secure HTTPS connection from the client.\n     */\n    public function withSecure(bool $secure = true): static\n    {\n        $cookie = clone $this;\n        $cookie->secure = $secure;\n\n        return $cookie;\n    }\n\n    /**\n     * Creates a cookie copy that be accessible only through the HTTP protocol.\n     */\n    public function withHttpOnly(bool $httpOnly = true): static\n    {\n        $cookie = clone $this;\n        $cookie->httpOnly = $httpOnly;\n\n        return $cookie;\n    }\n\n    /**\n     * Creates a cookie copy that uses no url encoding.\n     */\n    public function withRaw(bool $raw = true): static\n    {\n        if ($raw && false !== strpbrk($this->name, self::RESERVED_CHARS_LIST)) {\n            throw new \\InvalidArgumentException(sprintf('The cookie name \"%s\" contains invalid characters.', $this->name));\n        }\n\n        $cookie = clone $this;\n        $cookie->raw = $raw;\n\n        return $cookie;\n    }\n\n    /**\n     * Creates a cookie copy with SameSite attribute.\n     *\n     * @param self::SAMESITE_*|''|null $sameSite\n     */\n    public function withSameSite(?string $sameSite): static\n    {\n        if ('' === $sameSite) {\n            $sameSite = null;\n        } elseif (null !== $sameSite) {\n            $sameSite = strtolower($sameSite);\n        }\n\n        if (!\\in_array($sameSite, [self::SAMESITE_LAX, self::SAMESITE_STRICT, self::SAMESITE_NONE, null], true)) {\n            throw new \\InvalidArgumentException('The \"sameSite\" parameter value is not valid.');\n        }\n\n        $cookie = clone $this;\n        $cookie->sameSite = $sameSite;\n\n        return $cookie;\n    }\n\n    /**\n     * Creates a cookie copy that is tied to the top-level site in cross-site context.\n     */\n    public function withPartitioned(bool $partitioned = true): static\n    {\n        $cookie = clone $this;\n        $cookie->partitioned = $partitioned;\n\n        return $cookie;\n    }\n\n    /**\n     * Returns the cookie as a string.\n     */\n    public function __toString(): string\n    {\n        if ($this->isRaw()) {\n            $str = $this->getName();\n        } else {\n            $str = str_replace(self::RESERVED_CHARS_FROM, self::RESERVED_CHARS_TO, $this->getName());\n        }\n\n        $str .= '=';\n\n        if ('' === (string) $this->getValue()) {\n            $str .= 'deleted; expires='.gmdate('D, d M Y H:i:s T', time() - 31536001).'; Max-Age=0';\n        } else {\n            $str .= $this->isRaw() ? $this->getValue() : rawurlencode($this->getValue());\n\n            if (0 !== $this->getExpiresTime()) {\n                $str .= '; expires='.gmdate('D, d M Y H:i:s T', $this->getExpiresTime()).'; Max-Age='.$this->getMaxAge();\n            }\n        }\n\n        if ($this->getPath()) {\n            $str .= '; path='.$this->getPath();\n        }\n\n        if ($this->getDomain()) {\n            $str .= '; domain='.$this->getDomain();\n        }\n\n        if ($this->isSecure()) {\n            $str .= '; secure';\n        }\n\n        if ($this->isHttpOnly()) {\n            $str .= '; httponly';\n        }\n\n        if (null !== $this->getSameSite()) {\n            $str .= '; samesite='.$this->getSameSite();\n        }\n\n        if ($this->isPartitioned()) {\n            $str .= '; partitioned';\n        }\n\n        return $str;\n    }\n\n    /**\n     * Gets the name of the cookie.\n     */\n    public function getName(): string\n    {\n        return $this->name;\n    }\n\n    /**\n     * Gets the value of the cookie.\n     */\n    public function getValue(): ?string\n    {\n        return $this->value;\n    }\n\n    /**\n     * Gets the domain that the cookie is available to.\n     */\n    public function getDomain(): ?string\n    {\n        return $this->domain;\n    }\n\n    /**\n     * Gets the time the cookie expires.\n     */\n    public function getExpiresTime(): int\n    {\n        return $this->expire;\n    }\n\n    /**\n     * Gets the max-age attribute.\n     */\n    public function getMaxAge(): int\n    {\n        $maxAge = $this->expire - time();\n\n        return 0 >= $maxAge ? 0 : $maxAge;\n    }\n\n    /**\n     * Gets the path on the server in which the cookie will be available on.\n     */\n    public function getPath(): string\n    {\n        return $this->path;\n    }\n\n    /**\n     * Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client.\n     */\n    public function isSecure(): bool\n    {\n        return $this->secure ?? $this->secureDefault;\n    }\n\n    /**\n     * Checks whether the cookie will be made accessible only through the HTTP protocol.\n     */\n    public function isHttpOnly(): bool\n    {\n        return $this->httpOnly;\n    }\n\n    /**\n     * Whether this cookie is about to be cleared.\n     */\n    public function isCleared(): bool\n    {\n        return 0 !== $this->expire && $this->expire < time();\n    }\n\n    /**\n     * Checks if the cookie value should be sent with no url encoding.\n     */\n    public function isRaw(): bool\n    {\n        return $this->raw;\n    }\n\n    /**\n     * Checks whether the cookie should be tied to the top-level site in cross-site context.\n     */\n    public function isPartitioned(): bool\n    {\n        return $this->partitioned;\n    }\n\n    /**\n     * @return self::SAMESITE_*|null\n     */\n    public function getSameSite(): ?string\n    {\n        return $this->sameSite;\n    }\n\n    /**\n     * @param bool $default The default value of the \"secure\" flag when it is set to null\n     */\n    public function setSecureDefault(bool $default): void\n    {\n        $this->secureDefault = $default;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Exception/BadRequestException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Exception;\n\n/**\n * Raised when a user sends a malformed request.\n */\nclass BadRequestException extends UnexpectedValueException implements RequestExceptionInterface\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Exception;\n\n/**\n * The HTTP request contains headers with conflicting information.\n *\n * @author Magnus Nordlander <magnus@fervo.se>\n */\nclass ConflictingHeadersException extends UnexpectedValueException implements RequestExceptionInterface\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Exception/JsonException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Exception;\n\n/**\n * Thrown by Request::toArray() when the content cannot be JSON-decoded.\n *\n * @author Tobias Nyholm <tobias.nyholm@gmail.com>\n */\nfinal class JsonException extends UnexpectedValueException implements RequestExceptionInterface\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Exception;\n\n/**\n * Interface for Request exceptions.\n *\n * Exceptions implementing this interface should trigger an HTTP 400 response in the application code.\n */\ninterface RequestExceptionInterface\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Exception/SessionNotFoundException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Exception;\n\n/**\n * Raised when a session does not exist. This happens in the following cases:\n * - the session is not enabled\n * - attempt to read a session outside a request context (ie. cli script).\n *\n * @author Jérémy Derussé <jeremy@derusse.com>\n */\nclass SessionNotFoundException extends \\LogicException implements RequestExceptionInterface\n{\n    public function __construct(string $message = 'There is currently no session available.', int $code = 0, ?\\Throwable $previous = null)\n    {\n        parent::__construct($message, $code, $previous);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Exception;\n\n/**\n * Raised when a user has performed an operation that should be considered\n * suspicious from a security perspective.\n */\nclass SuspiciousOperationException extends UnexpectedValueException implements RequestExceptionInterface\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Exception/UnexpectedValueException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Exception;\n\nclass UnexpectedValueException extends \\UnexpectedValueException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/ExpressionRequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\nuse Symfony\\Component\\ExpressionLanguage\\Expression;\nuse Symfony\\Component\\ExpressionLanguage\\ExpressionLanguage;\nuse Symfony\\Component\\HttpFoundation\\RequestMatcher\\ExpressionRequestMatcher as NewExpressionRequestMatcher;\n\ntrigger_deprecation('symfony/http-foundation', '6.2', 'The \"%s\" class is deprecated, use \"%s\" instead.', ExpressionRequestMatcher::class, NewExpressionRequestMatcher::class);\n\n/**\n * ExpressionRequestMatcher uses an expression to match a Request.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @deprecated since Symfony 6.2, use \"Symfony\\Component\\HttpFoundation\\RequestMatcher\\ExpressionRequestMatcher\" instead\n */\nclass ExpressionRequestMatcher extends RequestMatcher\n{\n    private ExpressionLanguage $language;\n    private Expression|string $expression;\n\n    /**\n     * @return void\n     */\n    public function setExpression(ExpressionLanguage $language, Expression|string $expression)\n    {\n        $this->language = $language;\n        $this->expression = $expression;\n    }\n\n    public function matches(Request $request): bool\n    {\n        if (!isset($this->language)) {\n            throw new \\LogicException('Unable to match the request as the expression language is not available. Try running \"composer require symfony/expression-language\".');\n        }\n\n        return $this->language->evaluate($this->expression, [\n            'request' => $request,\n            'method' => $request->getMethod(),\n            'path' => rawurldecode($request->getPathInfo()),\n            'host' => $request->getHost(),\n            'ip' => $request->getClientIp(),\n            'attributes' => $request->attributes->all(),\n        ]) && parent::matches($request);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\n/**\n * Thrown when the access on a file was denied.\n *\n * @author Bernhard Schussek <bschussek@gmail.com>\n */\nclass AccessDeniedException extends FileException\n{\n    public function __construct(string $path)\n    {\n        parent::__construct(sprintf('The file %s could not be accessed', $path));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\n/**\n * Thrown when an UPLOAD_ERR_CANT_WRITE error occurred with UploadedFile.\n *\n * @author Florent Mata <florentmata@gmail.com>\n */\nclass CannotWriteFileException extends FileException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\n/**\n * Thrown when an UPLOAD_ERR_EXTENSION error occurred with UploadedFile.\n *\n * @author Florent Mata <florentmata@gmail.com>\n */\nclass ExtensionFileException extends FileException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/FileException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\n/**\n * Thrown when an error occurred in the component File.\n *\n * @author Bernhard Schussek <bschussek@gmail.com>\n */\nclass FileException extends \\RuntimeException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\n/**\n * Thrown when a file was not found.\n *\n * @author Bernhard Schussek <bschussek@gmail.com>\n */\nclass FileNotFoundException extends FileException\n{\n    public function __construct(string $path)\n    {\n        parent::__construct(sprintf('The file \"%s\" does not exist', $path));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\n/**\n * Thrown when an UPLOAD_ERR_FORM_SIZE error occurred with UploadedFile.\n *\n * @author Florent Mata <florentmata@gmail.com>\n */\nclass FormSizeFileException extends FileException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\n/**\n * Thrown when an UPLOAD_ERR_INI_SIZE error occurred with UploadedFile.\n *\n * @author Florent Mata <florentmata@gmail.com>\n */\nclass IniSizeFileException extends FileException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/NoFileException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\n/**\n * Thrown when an UPLOAD_ERR_NO_FILE error occurred with UploadedFile.\n *\n * @author Florent Mata <florentmata@gmail.com>\n */\nclass NoFileException extends FileException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\n/**\n * Thrown when an UPLOAD_ERR_NO_TMP_DIR error occurred with UploadedFile.\n *\n * @author Florent Mata <florentmata@gmail.com>\n */\nclass NoTmpDirFileException extends FileException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/PartialFileException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\n/**\n * Thrown when an UPLOAD_ERR_PARTIAL error occurred with UploadedFile.\n *\n * @author Florent Mata <florentmata@gmail.com>\n */\nclass PartialFileException extends FileException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\nclass UnexpectedTypeException extends FileException\n{\n    public function __construct(mixed $value, string $expectedType)\n    {\n        parent::__construct(sprintf('Expected argument of type %s, %s given', $expectedType, get_debug_type($value)));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/UploadException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File\\Exception;\n\n/**\n * Thrown when an error occurred during file upload.\n *\n * @author Bernhard Schussek <bschussek@gmail.com>\n */\nclass UploadException extends FileException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/File.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File;\n\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException;\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException;\nuse Symfony\\Component\\Mime\\MimeTypes;\n\n/**\n * A file in the file system.\n *\n * @author Bernhard Schussek <bschussek@gmail.com>\n */\nclass File extends \\SplFileInfo\n{\n    /**\n     * Constructs a new file from the given path.\n     *\n     * @param string $path      The path to the file\n     * @param bool   $checkPath Whether to check the path or not\n     *\n     * @throws FileNotFoundException If the given path is not a file\n     */\n    public function __construct(string $path, bool $checkPath = true)\n    {\n        if ($checkPath && !is_file($path)) {\n            throw new FileNotFoundException($path);\n        }\n\n        parent::__construct($path);\n    }\n\n    /**\n     * Returns the extension based on the mime type.\n     *\n     * If the mime type is unknown, returns null.\n     *\n     * This method uses the mime type as guessed by getMimeType()\n     * to guess the file extension.\n     *\n     * @see MimeTypes\n     * @see getMimeType()\n     */\n    public function guessExtension(): ?string\n    {\n        if (!class_exists(MimeTypes::class)) {\n            throw new \\LogicException('You cannot guess the extension as the Mime component is not installed. Try running \"composer require symfony/mime\".');\n        }\n\n        return MimeTypes::getDefault()->getExtensions($this->getMimeType())[0] ?? null;\n    }\n\n    /**\n     * Returns the mime type of the file.\n     *\n     * The mime type is guessed using a MimeTypeGuesserInterface instance,\n     * which uses finfo_file() then the \"file\" system binary,\n     * depending on which of those are available.\n     *\n     * @see MimeTypes\n     */\n    public function getMimeType(): ?string\n    {\n        if (!class_exists(MimeTypes::class)) {\n            throw new \\LogicException('You cannot guess the mime type as the Mime component is not installed. Try running \"composer require symfony/mime\".');\n        }\n\n        return MimeTypes::getDefault()->guessMimeType($this->getPathname());\n    }\n\n    /**\n     * Moves the file to a new location.\n     *\n     * @throws FileException if the target file could not be created\n     */\n    public function move(string $directory, ?string $name = null): self\n    {\n        $target = $this->getTargetFile($directory, $name);\n\n        set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });\n        try {\n            $renamed = rename($this->getPathname(), $target);\n        } finally {\n            restore_error_handler();\n        }\n        if (!$renamed) {\n            throw new FileException(sprintf('Could not move the file \"%s\" to \"%s\" (%s).', $this->getPathname(), $target, strip_tags($error)));\n        }\n\n        @chmod($target, 0666 & ~umask());\n\n        return $target;\n    }\n\n    public function getContent(): string\n    {\n        $content = file_get_contents($this->getPathname());\n\n        if (false === $content) {\n            throw new FileException(sprintf('Could not get the content of the file \"%s\".', $this->getPathname()));\n        }\n\n        return $content;\n    }\n\n    protected function getTargetFile(string $directory, ?string $name = null): self\n    {\n        if (!is_dir($directory)) {\n            if (false === @mkdir($directory, 0777, true) && !is_dir($directory)) {\n                throw new FileException(sprintf('Unable to create the \"%s\" directory.', $directory));\n            }\n        } elseif (!is_writable($directory)) {\n            throw new FileException(sprintf('Unable to write in the \"%s\" directory.', $directory));\n        }\n\n        $target = rtrim($directory, '/\\\\').\\DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name));\n\n        return new self($target, false);\n    }\n\n    /**\n     * Returns locale independent base name of the given path.\n     */\n    protected function getName(string $name): string\n    {\n        $originalName = str_replace('\\\\', '/', $name);\n        $pos = strrpos($originalName, '/');\n        $originalName = false === $pos ? $originalName : substr($originalName, $pos + 1);\n\n        return $originalName;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/Stream.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File;\n\n/**\n * A PHP stream of unknown size.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass Stream extends File\n{\n    public function getSize(): int|false\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/File/UploadedFile.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\File;\n\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\CannotWriteFileException;\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\ExtensionFileException;\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException;\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException;\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\FormSizeFileException;\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\IniSizeFileException;\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\NoFileException;\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\NoTmpDirFileException;\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\PartialFileException;\nuse Symfony\\Component\\Mime\\MimeTypes;\n\n/**\n * A file uploaded through a form.\n *\n * @author Bernhard Schussek <bschussek@gmail.com>\n * @author Florian Eckerstorfer <florian@eckerstorfer.org>\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass UploadedFile extends File\n{\n    private bool $test;\n    private string $originalName;\n    private string $mimeType;\n    private int $error;\n\n    /**\n     * Accepts the information of the uploaded file as provided by the PHP global $_FILES.\n     *\n     * The file object is only created when the uploaded file is valid (i.e. when the\n     * isValid() method returns true). Otherwise the only methods that could be called\n     * on an UploadedFile instance are:\n     *\n     *   * getClientOriginalName,\n     *   * getClientMimeType,\n     *   * isValid,\n     *   * getError.\n     *\n     * Calling any other method on an non-valid instance will cause an unpredictable result.\n     *\n     * @param string      $path         The full temporary path to the file\n     * @param string      $originalName The original file name of the uploaded file\n     * @param string|null $mimeType     The type of the file as provided by PHP; null defaults to application/octet-stream\n     * @param int|null    $error        The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants); null defaults to UPLOAD_ERR_OK\n     * @param bool        $test         Whether the test mode is active\n     *                                  Local files are used in test mode hence the code should not enforce HTTP uploads\n     *\n     * @throws FileException         If file_uploads is disabled\n     * @throws FileNotFoundException If the file does not exist\n     */\n    public function __construct(string $path, string $originalName, ?string $mimeType = null, ?int $error = null, bool $test = false)\n    {\n        $this->originalName = $this->getName($originalName);\n        $this->mimeType = $mimeType ?: 'application/octet-stream';\n        $this->error = $error ?: \\UPLOAD_ERR_OK;\n        $this->test = $test;\n\n        parent::__construct($path, \\UPLOAD_ERR_OK === $this->error);\n    }\n\n    /**\n     * Returns the original file name.\n     *\n     * It is extracted from the request from which the file has been uploaded.\n     * This should not be considered as a safe value to use for a file name on your servers.\n     */\n    public function getClientOriginalName(): string\n    {\n        return $this->originalName;\n    }\n\n    /**\n     * Returns the original file extension.\n     *\n     * It is extracted from the original file name that was uploaded.\n     * This should not be considered as a safe value to use for a file name on your servers.\n     */\n    public function getClientOriginalExtension(): string\n    {\n        return pathinfo($this->originalName, \\PATHINFO_EXTENSION);\n    }\n\n    /**\n     * Returns the file mime type.\n     *\n     * The client mime type is extracted from the request from which the file\n     * was uploaded, so it should not be considered as a safe value.\n     *\n     * For a trusted mime type, use getMimeType() instead (which guesses the mime\n     * type based on the file content).\n     *\n     * @see getMimeType()\n     */\n    public function getClientMimeType(): string\n    {\n        return $this->mimeType;\n    }\n\n    /**\n     * Returns the extension based on the client mime type.\n     *\n     * If the mime type is unknown, returns null.\n     *\n     * This method uses the mime type as guessed by getClientMimeType()\n     * to guess the file extension. As such, the extension returned\n     * by this method cannot be trusted.\n     *\n     * For a trusted extension, use guessExtension() instead (which guesses\n     * the extension based on the guessed mime type for the file).\n     *\n     * @see guessExtension()\n     * @see getClientMimeType()\n     */\n    public function guessClientExtension(): ?string\n    {\n        if (!class_exists(MimeTypes::class)) {\n            throw new \\LogicException('You cannot guess the extension as the Mime component is not installed. Try running \"composer require symfony/mime\".');\n        }\n\n        return MimeTypes::getDefault()->getExtensions($this->getClientMimeType())[0] ?? null;\n    }\n\n    /**\n     * Returns the upload error.\n     *\n     * If the upload was successful, the constant UPLOAD_ERR_OK is returned.\n     * Otherwise one of the other UPLOAD_ERR_XXX constants is returned.\n     */\n    public function getError(): int\n    {\n        return $this->error;\n    }\n\n    /**\n     * Returns whether the file has been uploaded with HTTP and no error occurred.\n     */\n    public function isValid(): bool\n    {\n        $isOk = \\UPLOAD_ERR_OK === $this->error;\n\n        return $this->test ? $isOk : $isOk && is_uploaded_file($this->getPathname());\n    }\n\n    /**\n     * Moves the file to a new location.\n     *\n     * @throws FileException if, for any reason, the file could not have been moved\n     */\n    public function move(string $directory, ?string $name = null): File\n    {\n        if ($this->isValid()) {\n            if ($this->test) {\n                return parent::move($directory, $name);\n            }\n\n            $target = $this->getTargetFile($directory, $name);\n\n            set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });\n            try {\n                $moved = move_uploaded_file($this->getPathname(), $target);\n            } finally {\n                restore_error_handler();\n            }\n            if (!$moved) {\n                throw new FileException(sprintf('Could not move the file \"%s\" to \"%s\" (%s).', $this->getPathname(), $target, strip_tags($error)));\n            }\n\n            @chmod($target, 0666 & ~umask());\n\n            return $target;\n        }\n\n        switch ($this->error) {\n            case \\UPLOAD_ERR_INI_SIZE:\n                throw new IniSizeFileException($this->getErrorMessage());\n            case \\UPLOAD_ERR_FORM_SIZE:\n                throw new FormSizeFileException($this->getErrorMessage());\n            case \\UPLOAD_ERR_PARTIAL:\n                throw new PartialFileException($this->getErrorMessage());\n            case \\UPLOAD_ERR_NO_FILE:\n                throw new NoFileException($this->getErrorMessage());\n            case \\UPLOAD_ERR_CANT_WRITE:\n                throw new CannotWriteFileException($this->getErrorMessage());\n            case \\UPLOAD_ERR_NO_TMP_DIR:\n                throw new NoTmpDirFileException($this->getErrorMessage());\n            case \\UPLOAD_ERR_EXTENSION:\n                throw new ExtensionFileException($this->getErrorMessage());\n        }\n\n        throw new FileException($this->getErrorMessage());\n    }\n\n    /**\n     * Returns the maximum size of an uploaded file as configured in php.ini.\n     *\n     * @return int|float The maximum size of an uploaded file in bytes (returns float if size > PHP_INT_MAX)\n     */\n    public static function getMaxFilesize(): int|float\n    {\n        $sizePostMax = self::parseFilesize(\\ini_get('post_max_size'));\n        $sizeUploadMax = self::parseFilesize(\\ini_get('upload_max_filesize'));\n\n        return min($sizePostMax ?: \\PHP_INT_MAX, $sizeUploadMax ?: \\PHP_INT_MAX);\n    }\n\n    private static function parseFilesize(string $size): int|float\n    {\n        if ('' === $size) {\n            return 0;\n        }\n\n        $size = strtolower($size);\n\n        $max = ltrim($size, '+');\n        if (str_starts_with($max, '0x')) {\n            $max = \\intval($max, 16);\n        } elseif (str_starts_with($max, '0')) {\n            $max = \\intval($max, 8);\n        } else {\n            $max = (int) $max;\n        }\n\n        switch (substr($size, -1)) {\n            case 't': $max *= 1024;\n                // no break\n            case 'g': $max *= 1024;\n                // no break\n            case 'm': $max *= 1024;\n                // no break\n            case 'k': $max *= 1024;\n        }\n\n        return $max;\n    }\n\n    /**\n     * Returns an informative upload error message.\n     */\n    public function getErrorMessage(): string\n    {\n        static $errors = [\n            \\UPLOAD_ERR_INI_SIZE => 'The file \"%s\" exceeds your upload_max_filesize ini directive (limit is %d KiB).',\n            \\UPLOAD_ERR_FORM_SIZE => 'The file \"%s\" exceeds the upload limit defined in your form.',\n            \\UPLOAD_ERR_PARTIAL => 'The file \"%s\" was only partially uploaded.',\n            \\UPLOAD_ERR_NO_FILE => 'No file was uploaded.',\n            \\UPLOAD_ERR_CANT_WRITE => 'The file \"%s\" could not be written on disk.',\n            \\UPLOAD_ERR_NO_TMP_DIR => 'File could not be uploaded: missing temporary directory.',\n            \\UPLOAD_ERR_EXTENSION => 'File upload was stopped by a PHP extension.',\n        ];\n\n        $errorCode = $this->error;\n        $maxFilesize = \\UPLOAD_ERR_INI_SIZE === $errorCode ? self::getMaxFilesize() / 1024 : 0;\n        $message = $errors[$errorCode] ?? 'The file \"%s\" was not uploaded due to an unknown error.';\n\n        return sprintf($message, $this->getClientOriginalName(), $maxFilesize);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/FileBag.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\nuse Symfony\\Component\\HttpFoundation\\File\\UploadedFile;\n\n/**\n * FileBag is a container for uploaded files.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Bulat Shakirzyanov <mallluhuct@gmail.com>\n */\nclass FileBag extends ParameterBag\n{\n    private const FILE_KEYS = ['error', 'name', 'size', 'tmp_name', 'type'];\n\n    /**\n     * @param array|UploadedFile[] $parameters An array of HTTP files\n     */\n    public function __construct(array $parameters = [])\n    {\n        $this->replace($parameters);\n    }\n\n    /**\n     * @return void\n     */\n    public function replace(array $files = [])\n    {\n        $this->parameters = [];\n        $this->add($files);\n    }\n\n    /**\n     * @return void\n     */\n    public function set(string $key, mixed $value)\n    {\n        if (!\\is_array($value) && !$value instanceof UploadedFile) {\n            throw new \\InvalidArgumentException('An uploaded file must be an array or an instance of UploadedFile.');\n        }\n\n        parent::set($key, $this->convertFileInformation($value));\n    }\n\n    /**\n     * @return void\n     */\n    public function add(array $files = [])\n    {\n        foreach ($files as $key => $file) {\n            $this->set($key, $file);\n        }\n    }\n\n    /**\n     * Converts uploaded files to UploadedFile instances.\n     *\n     * @return UploadedFile[]|UploadedFile|null\n     */\n    protected function convertFileInformation(array|UploadedFile $file): array|UploadedFile|null\n    {\n        if ($file instanceof UploadedFile) {\n            return $file;\n        }\n\n        $file = $this->fixPhpFilesArray($file);\n        $keys = array_keys($file);\n        sort($keys);\n\n        if (self::FILE_KEYS == $keys) {\n            if (\\UPLOAD_ERR_NO_FILE == $file['error']) {\n                $file = null;\n            } else {\n                $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['error'], false);\n            }\n        } else {\n            $file = array_map(fn ($v) => $v instanceof UploadedFile || \\is_array($v) ? $this->convertFileInformation($v) : $v, $file);\n            if (array_keys($keys) === $keys) {\n                $file = array_filter($file);\n            }\n        }\n\n        return $file;\n    }\n\n    /**\n     * Fixes a malformed PHP $_FILES array.\n     *\n     * PHP has a bug that the format of the $_FILES array differs, depending on\n     * whether the uploaded file fields had normal field names or array-like\n     * field names (\"normal\" vs. \"parent[child]\").\n     *\n     * This method fixes the array to look like the \"normal\" $_FILES array.\n     *\n     * It's safe to pass an already converted array, in which case this method\n     * just returns the original array unmodified.\n     */\n    protected function fixPhpFilesArray(array $data): array\n    {\n        // Remove extra key added by PHP 8.1.\n        unset($data['full_path']);\n        $keys = array_keys($data);\n        sort($keys);\n\n        if (self::FILE_KEYS != $keys || !isset($data['name']) || !\\is_array($data['name'])) {\n            return $data;\n        }\n\n        $files = $data;\n        foreach (self::FILE_KEYS as $k) {\n            unset($files[$k]);\n        }\n\n        foreach ($data['name'] as $key => $name) {\n            $files[$key] = $this->fixPhpFilesArray([\n                'error' => $data['error'][$key],\n                'name' => $name,\n                'type' => $data['type'][$key],\n                'tmp_name' => $data['tmp_name'][$key],\n                'size' => $data['size'][$key],\n            ]);\n        }\n\n        return $files;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/HeaderBag.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * HeaderBag is a container for HTTP headers.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @implements \\IteratorAggregate<string, list<string|null>>\n */\nclass HeaderBag implements \\IteratorAggregate, \\Countable, \\Stringable\n{\n    protected const UPPER = '_ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n    protected const LOWER = '-abcdefghijklmnopqrstuvwxyz';\n\n    /**\n     * @var array<string, list<string|null>>\n     */\n    protected $headers = [];\n    protected $cacheControl = [];\n\n    public function __construct(array $headers = [])\n    {\n        foreach ($headers as $key => $values) {\n            $this->set($key, $values);\n        }\n    }\n\n    /**\n     * Returns the headers as a string.\n     */\n    public function __toString(): string\n    {\n        if (!$headers = $this->all()) {\n            return '';\n        }\n\n        ksort($headers);\n        $max = max(array_map('strlen', array_keys($headers))) + 1;\n        $content = '';\n        foreach ($headers as $name => $values) {\n            $name = ucwords($name, '-');\n            foreach ($values as $value) {\n                $content .= sprintf(\"%-{$max}s %s\\r\\n\", $name.':', $value);\n            }\n        }\n\n        return $content;\n    }\n\n    /**\n     * Returns the headers.\n     *\n     * @param string|null $key The name of the headers to return or null to get them all\n     *\n     * @return ($key is null ? array<string, list<string|null>> : list<string|null>)\n     */\n    public function all(?string $key = null): array\n    {\n        if (null !== $key) {\n            return $this->headers[strtr($key, self::UPPER, self::LOWER)] ?? [];\n        }\n\n        return $this->headers;\n    }\n\n    /**\n     * Returns the parameter keys.\n     *\n     * @return string[]\n     */\n    public function keys(): array\n    {\n        return array_keys($this->all());\n    }\n\n    /**\n     * Replaces the current HTTP headers by a new set.\n     *\n     * @return void\n     */\n    public function replace(array $headers = [])\n    {\n        $this->headers = [];\n        $this->add($headers);\n    }\n\n    /**\n     * Adds new headers the current HTTP headers set.\n     *\n     * @return void\n     */\n    public function add(array $headers)\n    {\n        foreach ($headers as $key => $values) {\n            $this->set($key, $values);\n        }\n    }\n\n    /**\n     * Returns the first header by name or the default one.\n     */\n    public function get(string $key, ?string $default = null): ?string\n    {\n        $headers = $this->all($key);\n\n        if (!$headers) {\n            return $default;\n        }\n\n        if (null === $headers[0]) {\n            return null;\n        }\n\n        return (string) $headers[0];\n    }\n\n    /**\n     * Sets a header by name.\n     *\n     * @param string|string[]|null $values  The value or an array of values\n     * @param bool                 $replace Whether to replace the actual value or not (true by default)\n     *\n     * @return void\n     */\n    public function set(string $key, string|array|null $values, bool $replace = true)\n    {\n        $key = strtr($key, self::UPPER, self::LOWER);\n\n        if (\\is_array($values)) {\n            $values = array_values($values);\n\n            if (true === $replace || !isset($this->headers[$key])) {\n                $this->headers[$key] = $values;\n            } else {\n                $this->headers[$key] = array_merge($this->headers[$key], $values);\n            }\n        } else {\n            if (true === $replace || !isset($this->headers[$key])) {\n                $this->headers[$key] = [$values];\n            } else {\n                $this->headers[$key][] = $values;\n            }\n        }\n\n        if ('cache-control' === $key) {\n            $this->cacheControl = $this->parseCacheControl(implode(', ', $this->headers[$key]));\n        }\n    }\n\n    /**\n     * Returns true if the HTTP header is defined.\n     */\n    public function has(string $key): bool\n    {\n        return \\array_key_exists(strtr($key, self::UPPER, self::LOWER), $this->all());\n    }\n\n    /**\n     * Returns true if the given HTTP header contains the given value.\n     */\n    public function contains(string $key, string $value): bool\n    {\n        return \\in_array($value, $this->all($key));\n    }\n\n    /**\n     * Removes a header.\n     *\n     * @return void\n     */\n    public function remove(string $key)\n    {\n        $key = strtr($key, self::UPPER, self::LOWER);\n\n        unset($this->headers[$key]);\n\n        if ('cache-control' === $key) {\n            $this->cacheControl = [];\n        }\n    }\n\n    /**\n     * Returns the HTTP header value converted to a date.\n     *\n     * @return \\DateTimeImmutable|null\n     *\n     * @throws \\RuntimeException When the HTTP header is not parseable\n     */\n    public function getDate(string $key, ?\\DateTimeInterface $default = null): ?\\DateTimeInterface\n    {\n        if (null === $value = $this->get($key)) {\n            return null !== $default ? \\DateTimeImmutable::createFromInterface($default) : null;\n        }\n\n        if (false === $date = \\DateTimeImmutable::createFromFormat(\\DATE_RFC2822, $value)) {\n            throw new \\RuntimeException(sprintf('The \"%s\" HTTP header is not parseable (%s).', $key, $value));\n        }\n\n        return $date;\n    }\n\n    /**\n     * Adds a custom Cache-Control directive.\n     *\n     * @return void\n     */\n    public function addCacheControlDirective(string $key, bool|string $value = true)\n    {\n        $this->cacheControl[$key] = $value;\n\n        $this->set('Cache-Control', $this->getCacheControlHeader());\n    }\n\n    /**\n     * Returns true if the Cache-Control directive is defined.\n     */\n    public function hasCacheControlDirective(string $key): bool\n    {\n        return \\array_key_exists($key, $this->cacheControl);\n    }\n\n    /**\n     * Returns a Cache-Control directive value by name.\n     */\n    public function getCacheControlDirective(string $key): bool|string|null\n    {\n        return $this->cacheControl[$key] ?? null;\n    }\n\n    /**\n     * Removes a Cache-Control directive.\n     *\n     * @return void\n     */\n    public function removeCacheControlDirective(string $key)\n    {\n        unset($this->cacheControl[$key]);\n\n        $this->set('Cache-Control', $this->getCacheControlHeader());\n    }\n\n    /**\n     * Returns an iterator for headers.\n     *\n     * @return \\ArrayIterator<string, list<string|null>>\n     */\n    public function getIterator(): \\ArrayIterator\n    {\n        return new \\ArrayIterator($this->headers);\n    }\n\n    /**\n     * Returns the number of headers.\n     */\n    public function count(): int\n    {\n        return \\count($this->headers);\n    }\n\n    /**\n     * @return string\n     */\n    protected function getCacheControlHeader()\n    {\n        ksort($this->cacheControl);\n\n        return HeaderUtils::toString($this->cacheControl, ',');\n    }\n\n    /**\n     * Parses a Cache-Control HTTP header.\n     */\n    protected function parseCacheControl(string $header): array\n    {\n        $parts = HeaderUtils::split($header, ',=');\n\n        return HeaderUtils::combine($parts);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/HeaderUtils.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * HTTP header utility functions.\n *\n * @author Christian Schmidt <github@chsc.dk>\n */\nclass HeaderUtils\n{\n    public const DISPOSITION_ATTACHMENT = 'attachment';\n    public const DISPOSITION_INLINE = 'inline';\n\n    /**\n     * This class should not be instantiated.\n     */\n    private function __construct()\n    {\n    }\n\n    /**\n     * Splits an HTTP header by one or more separators.\n     *\n     * Example:\n     *\n     *     HeaderUtils::split('da, en-gb;q=0.8', ',;')\n     *     // => ['da'], ['en-gb', 'q=0.8']]\n     *\n     * @param string $separators List of characters to split on, ordered by\n     *                           precedence, e.g. ',', ';=', or ',;='\n     *\n     * @return array Nested array with as many levels as there are characters in\n     *               $separators\n     */\n    public static function split(string $header, string $separators): array\n    {\n        if ('' === $separators) {\n            throw new \\InvalidArgumentException('At least one separator must be specified.');\n        }\n\n        $quotedSeparators = preg_quote($separators, '/');\n\n        preg_match_all('\n            /\n                (?!\\s)\n                    (?:\n                        # quoted-string\n                        \"(?:[^\"\\\\\\\\]|\\\\\\\\.)*(?:\"|\\\\\\\\|$)\n                    |\n                        # token\n                        [^\"'.$quotedSeparators.']+\n                    )+\n                (?<!\\s)\n            |\n                # separator\n                \\s*\n                (?<separator>['.$quotedSeparators.'])\n                \\s*\n            /x', trim($header), $matches, \\PREG_SET_ORDER);\n\n        return self::groupParts($matches, $separators);\n    }\n\n    /**\n     * Combines an array of arrays into one associative array.\n     *\n     * Each of the nested arrays should have one or two elements. The first\n     * value will be used as the keys in the associative array, and the second\n     * will be used as the values, or true if the nested array only contains one\n     * element. Array keys are lowercased.\n     *\n     * Example:\n     *\n     *     HeaderUtils::combine([['foo', 'abc'], ['bar']])\n     *     // => ['foo' => 'abc', 'bar' => true]\n     */\n    public static function combine(array $parts): array\n    {\n        $assoc = [];\n        foreach ($parts as $part) {\n            $name = strtolower($part[0]);\n            $value = $part[1] ?? true;\n            $assoc[$name] = $value;\n        }\n\n        return $assoc;\n    }\n\n    /**\n     * Joins an associative array into a string for use in an HTTP header.\n     *\n     * The key and value of each entry are joined with '=', and all entries\n     * are joined with the specified separator and an additional space (for\n     * readability). Values are quoted if necessary.\n     *\n     * Example:\n     *\n     *     HeaderUtils::toString(['foo' => 'abc', 'bar' => true, 'baz' => 'a b c'], ',')\n     *     // => 'foo=abc, bar, baz=\"a b c\"'\n     */\n    public static function toString(array $assoc, string $separator): string\n    {\n        $parts = [];\n        foreach ($assoc as $name => $value) {\n            if (true === $value) {\n                $parts[] = $name;\n            } else {\n                $parts[] = $name.'='.self::quote($value);\n            }\n        }\n\n        return implode($separator.' ', $parts);\n    }\n\n    /**\n     * Encodes a string as a quoted string, if necessary.\n     *\n     * If a string contains characters not allowed by the \"token\" construct in\n     * the HTTP specification, it is backslash-escaped and enclosed in quotes\n     * to match the \"quoted-string\" construct.\n     */\n    public static function quote(string $s): string\n    {\n        if (preg_match('/^[a-z0-9!#$%&\\'*.^_`|~-]+$/i', $s)) {\n            return $s;\n        }\n\n        return '\"'.addcslashes($s, '\"\\\\\"').'\"';\n    }\n\n    /**\n     * Decodes a quoted string.\n     *\n     * If passed an unquoted string that matches the \"token\" construct (as\n     * defined in the HTTP specification), it is passed through verbatim.\n     */\n    public static function unquote(string $s): string\n    {\n        return preg_replace('/\\\\\\\\(.)|\"/', '$1', $s);\n    }\n\n    /**\n     * Generates an HTTP Content-Disposition field-value.\n     *\n     * @param string $disposition      One of \"inline\" or \"attachment\"\n     * @param string $filename         A unicode string\n     * @param string $filenameFallback A string containing only ASCII characters that\n     *                                 is semantically equivalent to $filename. If the filename is already ASCII,\n     *                                 it can be omitted, or just copied from $filename\n     *\n     * @throws \\InvalidArgumentException\n     *\n     * @see RFC 6266\n     */\n    public static function makeDisposition(string $disposition, string $filename, string $filenameFallback = ''): string\n    {\n        if (!\\in_array($disposition, [self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE])) {\n            throw new \\InvalidArgumentException(sprintf('The disposition must be either \"%s\" or \"%s\".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE));\n        }\n\n        if ('' === $filenameFallback) {\n            $filenameFallback = $filename;\n        }\n\n        // filenameFallback is not ASCII.\n        if (!preg_match('/^[\\x20-\\x7e]*$/', $filenameFallback)) {\n            throw new \\InvalidArgumentException('The filename fallback must only contain ASCII characters.');\n        }\n\n        // percent characters aren't safe in fallback.\n        if (str_contains($filenameFallback, '%')) {\n            throw new \\InvalidArgumentException('The filename fallback cannot contain the \"%\" character.');\n        }\n\n        // path separators aren't allowed in either.\n        if (str_contains($filename, '/') || str_contains($filename, '\\\\') || str_contains($filenameFallback, '/') || str_contains($filenameFallback, '\\\\')) {\n            throw new \\InvalidArgumentException('The filename and the fallback cannot contain the \"/\" and \"\\\\\" characters.');\n        }\n\n        $params = ['filename' => $filenameFallback];\n        if ($filename !== $filenameFallback) {\n            $params['filename*'] = \"utf-8''\".rawurlencode($filename);\n        }\n\n        return $disposition.'; '.self::toString($params, ';');\n    }\n\n    /**\n     * Like parse_str(), but preserves dots in variable names.\n     */\n    public static function parseQuery(string $query, bool $ignoreBrackets = false, string $separator = '&'): array\n    {\n        $q = [];\n\n        foreach (explode($separator, $query) as $v) {\n            if (false !== $i = strpos($v, \"\\0\")) {\n                $v = substr($v, 0, $i);\n            }\n\n            if (false === $i = strpos($v, '=')) {\n                $k = urldecode($v);\n                $v = '';\n            } else {\n                $k = urldecode(substr($v, 0, $i));\n                $v = substr($v, $i);\n            }\n\n            if (false !== $i = strpos($k, \"\\0\")) {\n                $k = substr($k, 0, $i);\n            }\n\n            $k = ltrim($k, ' ');\n\n            if ($ignoreBrackets) {\n                $q[$k][] = urldecode(substr($v, 1));\n\n                continue;\n            }\n\n            if (false === $i = strpos($k, '[')) {\n                $q[] = bin2hex($k).$v;\n            } else {\n                $q[] = bin2hex(substr($k, 0, $i)).rawurlencode(substr($k, $i)).$v;\n            }\n        }\n\n        if ($ignoreBrackets) {\n            return $q;\n        }\n\n        parse_str(implode('&', $q), $q);\n\n        $query = [];\n\n        foreach ($q as $k => $v) {\n            if (false !== $i = strpos($k, '_')) {\n                $query[substr_replace($k, hex2bin(substr($k, 0, $i)).'[', 0, 1 + $i)] = $v;\n            } else {\n                $query[hex2bin($k)] = $v;\n            }\n        }\n\n        return $query;\n    }\n\n    private static function groupParts(array $matches, string $separators, bool $first = true): array\n    {\n        $separator = $separators[0];\n        $separators = substr($separators, 1) ?: '';\n        $i = 0;\n\n        if ('' === $separators && !$first) {\n            $parts = [''];\n\n            foreach ($matches as $match) {\n                if (!$i && isset($match['separator'])) {\n                    $i = 1;\n                    $parts[1] = '';\n                } else {\n                    $parts[$i] .= self::unquote($match[0]);\n                }\n            }\n\n            return $parts;\n        }\n\n        $parts = [];\n        $partMatches = [];\n\n        foreach ($matches as $match) {\n            if (($match['separator'] ?? null) === $separator) {\n                ++$i;\n            } else {\n                $partMatches[$i][] = $match;\n            }\n        }\n\n        foreach ($partMatches as $matches) {\n            $parts[] = '' === $separators ? self::unquote($matches[0][0]) : self::groupParts($matches, $separators, false);\n        }\n\n        return $parts;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/InputBag.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\nuse Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException;\nuse Symfony\\Component\\HttpFoundation\\Exception\\UnexpectedValueException;\n\n/**\n * InputBag is a container for user input values such as $_GET, $_POST, $_REQUEST, and $_COOKIE.\n *\n * @author Saif Eddin Gmati <azjezz@protonmail.com>\n */\nfinal class InputBag extends ParameterBag\n{\n    /**\n     * Returns a scalar input value by name.\n     *\n     * @param string|int|float|bool|null $default The default value if the input key does not exist\n     */\n    public function get(string $key, mixed $default = null): string|int|float|bool|null\n    {\n        if (null !== $default && !\\is_scalar($default) && !$default instanceof \\Stringable) {\n            throw new \\InvalidArgumentException(sprintf('Expected a scalar value as a 2nd argument to \"%s()\", \"%s\" given.', __METHOD__, get_debug_type($default)));\n        }\n\n        $value = parent::get($key, $this);\n\n        if (null !== $value && $this !== $value && !\\is_scalar($value) && !$value instanceof \\Stringable) {\n            throw new BadRequestException(sprintf('Input value \"%s\" contains a non-scalar value.', $key));\n        }\n\n        return $this === $value ? $default : $value;\n    }\n\n    /**\n     * Replaces the current input values by a new set.\n     */\n    public function replace(array $inputs = []): void\n    {\n        $this->parameters = [];\n        $this->add($inputs);\n    }\n\n    /**\n     * Adds input values.\n     */\n    public function add(array $inputs = []): void\n    {\n        foreach ($inputs as $input => $value) {\n            $this->set($input, $value);\n        }\n    }\n\n    /**\n     * Sets an input by name.\n     *\n     * @param string|int|float|bool|array|null $value\n     */\n    public function set(string $key, mixed $value): void\n    {\n        if (null !== $value && !\\is_scalar($value) && !\\is_array($value) && !$value instanceof \\Stringable) {\n            throw new \\InvalidArgumentException(sprintf('Expected a scalar, or an array as a 2nd argument to \"%s()\", \"%s\" given.', __METHOD__, get_debug_type($value)));\n        }\n\n        $this->parameters[$key] = $value;\n    }\n\n    /**\n     * Returns the parameter value converted to an enum.\n     *\n     * @template T of \\BackedEnum\n     *\n     * @param class-string<T> $class\n     * @param ?T              $default\n     *\n     * @return ?T\n     */\n    public function getEnum(string $key, string $class, ?\\BackedEnum $default = null): ?\\BackedEnum\n    {\n        try {\n            return parent::getEnum($key, $class, $default);\n        } catch (UnexpectedValueException $e) {\n            throw new BadRequestException($e->getMessage(), $e->getCode(), $e);\n        }\n    }\n\n    /**\n     * Returns the parameter value converted to string.\n     */\n    public function getString(string $key, string $default = ''): string\n    {\n        // Shortcuts the parent method because the validation on scalar is already done in get().\n        return (string) $this->get($key, $default);\n    }\n\n    public function filter(string $key, mixed $default = null, int $filter = \\FILTER_DEFAULT, mixed $options = []): mixed\n    {\n        $value = $this->has($key) ? $this->all()[$key] : $default;\n\n        // Always turn $options into an array - this allows filter_var option shortcuts.\n        if (!\\is_array($options) && $options) {\n            $options = ['flags' => $options];\n        }\n\n        if (\\is_array($value) && !(($options['flags'] ?? 0) & (\\FILTER_REQUIRE_ARRAY | \\FILTER_FORCE_ARRAY))) {\n            throw new BadRequestException(sprintf('Input value \"%s\" contains an array, but \"FILTER_REQUIRE_ARRAY\" or \"FILTER_FORCE_ARRAY\" flags were not set.', $key));\n        }\n\n        if ((\\FILTER_CALLBACK & $filter) && !(($options['options'] ?? null) instanceof \\Closure)) {\n            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)));\n        }\n\n        $options['flags'] ??= 0;\n        $nullOnFailure = $options['flags'] & \\FILTER_NULL_ON_FAILURE;\n        $options['flags'] |= \\FILTER_NULL_ON_FAILURE;\n\n        $value = filter_var($value, $filter, $options);\n\n        if (null !== $value || $nullOnFailure) {\n            return $value;\n        }\n\n        $method = debug_backtrace(\\DEBUG_BACKTRACE_IGNORE_ARGS | \\DEBUG_BACKTRACE_PROVIDE_OBJECT, 2)[1];\n        $method = ($method['object'] ?? null) === $this ? $method['function'] : 'filter';\n        $hint = 'filter' === $method ? 'pass' : 'use method \"filter()\" with';\n\n        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);\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/IpUtils.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * Http utility functions.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass IpUtils\n{\n    public const PRIVATE_SUBNETS = [\n        '127.0.0.0/8',    // RFC1700 (Loopback)\n        '10.0.0.0/8',     // RFC1918\n        '192.168.0.0/16', // RFC1918\n        '172.16.0.0/12',  // RFC1918\n        '169.254.0.0/16', // RFC3927\n        '0.0.0.0/8',      // RFC5735\n        '240.0.0.0/4',    // RFC1112\n        '::1/128',        // Loopback\n        'fc00::/7',       // Unique Local Address\n        'fe80::/10',      // Link Local Address\n        '::ffff:0:0/96',  // IPv4 translations\n        '::/128',         // Unspecified address\n    ];\n\n    private static array $checkedIps = [];\n\n    /**\n     * This class should not be instantiated.\n     */\n    private function __construct()\n    {\n    }\n\n    /**\n     * Checks if an IPv4 or IPv6 address is contained in the list of given IPs or subnets.\n     *\n     * @param string|array $ips List of IPs or subnets (can be a string if only a single one)\n     */\n    public static function checkIp(string $requestIp, string|array $ips): bool\n    {\n        if (!\\is_array($ips)) {\n            $ips = [$ips];\n        }\n\n        $method = substr_count($requestIp, ':') > 1 ? 'checkIp6' : 'checkIp4';\n\n        foreach ($ips as $ip) {\n            if (self::$method($requestIp, $ip)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Compares two IPv4 addresses.\n     * In case a subnet is given, it checks if it contains the request IP.\n     *\n     * @param string $ip IPv4 address or subnet in CIDR notation\n     *\n     * @return bool Whether the request IP matches the IP, or whether the request IP is within the CIDR subnet\n     */\n    public static function checkIp4(string $requestIp, string $ip): bool\n    {\n        $cacheKey = $requestIp.'-'.$ip.'-v4';\n        if (null !== $cacheValue = self::getCacheResult($cacheKey)) {\n            return $cacheValue;\n        }\n\n        if (!filter_var($requestIp, \\FILTER_VALIDATE_IP, \\FILTER_FLAG_IPV4)) {\n            return self::setCacheResult($cacheKey, false);\n        }\n\n        if (str_contains($ip, '/')) {\n            [$address, $netmask] = explode('/', $ip, 2);\n\n            if ('0' === $netmask) {\n                return self::setCacheResult($cacheKey, false !== filter_var($address, \\FILTER_VALIDATE_IP, \\FILTER_FLAG_IPV4));\n            }\n\n            if ($netmask < 0 || $netmask > 32) {\n                return self::setCacheResult($cacheKey, false);\n            }\n        } else {\n            $address = $ip;\n            $netmask = 32;\n        }\n\n        if (false === ip2long($address)) {\n            return self::setCacheResult($cacheKey, false);\n        }\n\n        return self::setCacheResult($cacheKey, 0 === substr_compare(sprintf('%032b', ip2long($requestIp)), sprintf('%032b', ip2long($address)), 0, $netmask));\n    }\n\n    /**\n     * Compares two IPv6 addresses.\n     * In case a subnet is given, it checks if it contains the request IP.\n     *\n     * @author David Soria Parra <dsp at php dot net>\n     *\n     * @see https://github.com/dsp/v6tools\n     *\n     * @param string $ip IPv6 address or subnet in CIDR notation\n     *\n     * @throws \\RuntimeException When IPV6 support is not enabled\n     */\n    public static function checkIp6(string $requestIp, string $ip): bool\n    {\n        $cacheKey = $requestIp.'-'.$ip.'-v6';\n        if (null !== $cacheValue = self::getCacheResult($cacheKey)) {\n            return $cacheValue;\n        }\n\n        if (!((\\extension_loaded('sockets') && \\defined('AF_INET6')) || @inet_pton('::1'))) {\n            throw new \\RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option \"disable-ipv6\".');\n        }\n\n        // Check to see if we were given a IP4 $requestIp or $ip by mistake\n        if (!filter_var($requestIp, \\FILTER_VALIDATE_IP, \\FILTER_FLAG_IPV6)) {\n            return self::setCacheResult($cacheKey, false);\n        }\n\n        if (str_contains($ip, '/')) {\n            [$address, $netmask] = explode('/', $ip, 2);\n\n            if (!filter_var($address, \\FILTER_VALIDATE_IP, \\FILTER_FLAG_IPV6)) {\n                return self::setCacheResult($cacheKey, false);\n            }\n\n            if ('0' === $netmask) {\n                return (bool) unpack('n*', @inet_pton($address));\n            }\n\n            if ($netmask < 1 || $netmask > 128) {\n                return self::setCacheResult($cacheKey, false);\n            }\n        } else {\n            if (!filter_var($ip, \\FILTER_VALIDATE_IP, \\FILTER_FLAG_IPV6)) {\n                return self::setCacheResult($cacheKey, false);\n            }\n\n            $address = $ip;\n            $netmask = 128;\n        }\n\n        $bytesAddr = unpack('n*', @inet_pton($address));\n        $bytesTest = unpack('n*', @inet_pton($requestIp));\n\n        if (!$bytesAddr || !$bytesTest) {\n            return self::setCacheResult($cacheKey, false);\n        }\n\n        for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; ++$i) {\n            $left = $netmask - 16 * ($i - 1);\n            $left = ($left <= 16) ? $left : 16;\n            $mask = ~(0xFFFF >> $left) & 0xFFFF;\n            if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) {\n                return self::setCacheResult($cacheKey, false);\n            }\n        }\n\n        return self::setCacheResult($cacheKey, true);\n    }\n\n    /**\n     * Anonymizes an IP/IPv6.\n     *\n     * Removes the last byte for v4 and the last 8 bytes for v6 IPs\n     */\n    public static function anonymize(string $ip): string\n    {\n        $wrappedIPv6 = false;\n        if (str_starts_with($ip, '[') && str_ends_with($ip, ']')) {\n            $wrappedIPv6 = true;\n            $ip = substr($ip, 1, -1);\n        }\n\n        $packedAddress = inet_pton($ip);\n        if (4 === \\strlen($packedAddress)) {\n            $mask = '255.255.255.0';\n        } elseif ($ip === inet_ntop($packedAddress & inet_pton('::ffff:ffff:ffff'))) {\n            $mask = '::ffff:ffff:ff00';\n        } elseif ($ip === inet_ntop($packedAddress & inet_pton('::ffff:ffff'))) {\n            $mask = '::ffff:ff00';\n        } else {\n            $mask = 'ffff:ffff:ffff:ffff:0000:0000:0000:0000';\n        }\n        $ip = inet_ntop($packedAddress & inet_pton($mask));\n\n        if ($wrappedIPv6) {\n            $ip = '['.$ip.']';\n        }\n\n        return $ip;\n    }\n\n    /**\n     * Checks if an IPv4 or IPv6 address is contained in the list of private IP subnets.\n     */\n    public static function isPrivateIp(string $requestIp): bool\n    {\n        return self::checkIp($requestIp, self::PRIVATE_SUBNETS);\n    }\n\n    private static function getCacheResult(string $cacheKey): ?bool\n    {\n        if (isset(self::$checkedIps[$cacheKey])) {\n            // Move the item last in cache (LRU)\n            $value = self::$checkedIps[$cacheKey];\n            unset(self::$checkedIps[$cacheKey]);\n            self::$checkedIps[$cacheKey] = $value;\n\n            return self::$checkedIps[$cacheKey];\n        }\n\n        return null;\n    }\n\n    private static function setCacheResult(string $cacheKey, bool $result): bool\n    {\n        if (1000 < \\count(self::$checkedIps)) {\n            // stop memory leak if there are many keys\n            self::$checkedIps = \\array_slice(self::$checkedIps, 500, null, true);\n        }\n\n        return self::$checkedIps[$cacheKey] = $result;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/JsonResponse.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * Response represents an HTTP response in JSON format.\n *\n * Note that this class does not force the returned JSON content to be an\n * object. It is however recommended that you do return an object as it\n * protects yourself against XSSI and JSON-JavaScript Hijacking.\n *\n * @see https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/AJAX_Security_Cheat_Sheet.md#always-return-json-with-an-object-on-the-outside\n *\n * @author Igor Wiedler <igor@wiedler.ch>\n */\nclass JsonResponse extends Response\n{\n    protected $data;\n    protected $callback;\n\n    // Encode <, >, ', &, and \" characters in the JSON, making it also safe to be embedded into HTML.\n    // 15 === JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT\n    public const DEFAULT_ENCODING_OPTIONS = 15;\n\n    protected $encodingOptions = self::DEFAULT_ENCODING_OPTIONS;\n\n    /**\n     * @param bool $json If the data is already a JSON string\n     */\n    public function __construct(mixed $data = null, int $status = 200, array $headers = [], bool $json = false)\n    {\n        parent::__construct('', $status, $headers);\n\n        if ($json && !\\is_string($data) && !is_numeric($data) && !\\is_callable([$data, '__toString'])) {\n            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)));\n        }\n\n        $data ??= new \\ArrayObject();\n\n        $json ? $this->setJson($data) : $this->setData($data);\n    }\n\n    /**\n     * Factory method for chainability.\n     *\n     * Example:\n     *\n     *     return JsonResponse::fromJsonString('{\"key\": \"value\"}')\n     *         ->setSharedMaxAge(300);\n     *\n     * @param string $data    The JSON response string\n     * @param int    $status  The response status code (200 \"OK\" by default)\n     * @param array  $headers An array of response headers\n     */\n    public static function fromJsonString(string $data, int $status = 200, array $headers = []): static\n    {\n        return new static($data, $status, $headers, true);\n    }\n\n    /**\n     * Sets the JSONP callback.\n     *\n     * @param string|null $callback The JSONP callback or null to use none\n     *\n     * @return $this\n     *\n     * @throws \\InvalidArgumentException When the callback name is not valid\n     */\n    public function setCallback(?string $callback = null): static\n    {\n        if (1 > \\func_num_args()) {\n            trigger_deprecation('symfony/http-foundation', '6.2', 'Calling \"%s()\" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);\n        }\n        if (null !== $callback) {\n            // partially taken from https://geekality.net/2011/08/03/valid-javascript-identifier/\n            // partially taken from https://github.com/willdurand/JsonpCallbackValidator\n            //      JsonpCallbackValidator is released under the MIT License. See https://github.com/willdurand/JsonpCallbackValidator/blob/v1.1.0/LICENSE for details.\n            //      (c) William Durand <william.durand1@gmail.com>\n            $pattern = '/^[$_\\p{L}][$_\\p{L}\\p{Mn}\\p{Mc}\\p{Nd}\\p{Pc}\\x{200C}\\x{200D}]*(?:\\[(?:\"(?:\\\\\\.|[^\"\\\\\\])*\"|\\'(?:\\\\\\.|[^\\'\\\\\\])*\\'|\\d+)\\])*?$/u';\n            $reserved = [\n                'break', 'do', 'instanceof', 'typeof', 'case', 'else', 'new', 'var', 'catch', 'finally', 'return', 'void', 'continue', 'for', 'switch', 'while',\n                'debugger', 'function', 'this', 'with', 'default', 'if', 'throw', 'delete', 'in', 'try', 'class', 'enum', 'extends', 'super',  'const', 'export',\n                'import', 'implements', 'let', 'private', 'public', 'yield', 'interface', 'package', 'protected', 'static', 'null', 'true', 'false',\n            ];\n            $parts = explode('.', $callback);\n            foreach ($parts as $part) {\n                if (!preg_match($pattern, $part) || \\in_array($part, $reserved, true)) {\n                    throw new \\InvalidArgumentException('The callback name is not valid.');\n                }\n            }\n        }\n\n        $this->callback = $callback;\n\n        return $this->update();\n    }\n\n    /**\n     * Sets a raw string containing a JSON document to be sent.\n     *\n     * @return $this\n     */\n    public function setJson(string $json): static\n    {\n        $this->data = $json;\n\n        return $this->update();\n    }\n\n    /**\n     * Sets the data to be sent as JSON.\n     *\n     * @return $this\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function setData(mixed $data = []): static\n    {\n        try {\n            $data = json_encode($data, $this->encodingOptions);\n        } catch (\\Exception $e) {\n            if ('Exception' === $e::class && str_starts_with($e->getMessage(), 'Failed calling ')) {\n                throw $e->getPrevious() ?: $e;\n            }\n            throw $e;\n        }\n\n        if (\\JSON_THROW_ON_ERROR & $this->encodingOptions) {\n            return $this->setJson($data);\n        }\n\n        if (\\JSON_ERROR_NONE !== json_last_error()) {\n            throw new \\InvalidArgumentException(json_last_error_msg());\n        }\n\n        return $this->setJson($data);\n    }\n\n    /**\n     * Returns options used while encoding data to JSON.\n     */\n    public function getEncodingOptions(): int\n    {\n        return $this->encodingOptions;\n    }\n\n    /**\n     * Sets options used while encoding data to JSON.\n     *\n     * @return $this\n     */\n    public function setEncodingOptions(int $encodingOptions): static\n    {\n        $this->encodingOptions = $encodingOptions;\n\n        return $this->setData(json_decode($this->data));\n    }\n\n    /**\n     * Updates the content and headers according to the JSON data and callback.\n     *\n     * @return $this\n     */\n    protected function update(): static\n    {\n        if (null !== $this->callback) {\n            // Not using application/javascript for compatibility reasons with older browsers.\n            $this->headers->set('Content-Type', 'text/javascript');\n\n            return $this->setContent(sprintf('/**/%s(%s);', $this->callback, $this->data));\n        }\n\n        // Only set the header when there is none or when it equals 'text/javascript' (from a previous update with callback)\n        // in order to not overwrite a custom definition.\n        if (!$this->headers->has('Content-Type') || 'text/javascript' === $this->headers->get('Content-Type')) {\n            $this->headers->set('Content-Type', 'application/json');\n        }\n\n        return $this->setContent($this->data);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/LICENSE",
    "content": "Copyright (c) 2004-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/ParameterBag.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\nuse Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException;\nuse Symfony\\Component\\HttpFoundation\\Exception\\UnexpectedValueException;\n\n/**\n * ParameterBag is a container for key/value pairs.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @implements \\IteratorAggregate<string, mixed>\n */\nclass ParameterBag implements \\IteratorAggregate, \\Countable\n{\n    /**\n     * Parameter storage.\n     */\n    protected $parameters;\n\n    public function __construct(array $parameters = [])\n    {\n        $this->parameters = $parameters;\n    }\n\n    /**\n     * Returns the parameters.\n     *\n     * @param string|null $key The name of the parameter to return or null to get them all\n     */\n    public function all(?string $key = null): array\n    {\n        if (null === $key) {\n            return $this->parameters;\n        }\n\n        if (!\\is_array($value = $this->parameters[$key] ?? [])) {\n            throw new BadRequestException(sprintf('Unexpected value for parameter \"%s\": expecting \"array\", got \"%s\".', $key, get_debug_type($value)));\n        }\n\n        return $value;\n    }\n\n    /**\n     * Returns the parameter keys.\n     */\n    public function keys(): array\n    {\n        return array_keys($this->parameters);\n    }\n\n    /**\n     * Replaces the current parameters by a new set.\n     *\n     * @return void\n     */\n    public function replace(array $parameters = [])\n    {\n        $this->parameters = $parameters;\n    }\n\n    /**\n     * Adds parameters.\n     *\n     * @return void\n     */\n    public function add(array $parameters = [])\n    {\n        $this->parameters = array_replace($this->parameters, $parameters);\n    }\n\n    public function get(string $key, mixed $default = null): mixed\n    {\n        return \\array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default;\n    }\n\n    /**\n     * @return void\n     */\n    public function set(string $key, mixed $value)\n    {\n        $this->parameters[$key] = $value;\n    }\n\n    /**\n     * Returns true if the parameter is defined.\n     */\n    public function has(string $key): bool\n    {\n        return \\array_key_exists($key, $this->parameters);\n    }\n\n    /**\n     * Removes a parameter.\n     *\n     * @return void\n     */\n    public function remove(string $key)\n    {\n        unset($this->parameters[$key]);\n    }\n\n    /**\n     * Returns the alphabetic characters of the parameter value.\n     */\n    public function getAlpha(string $key, string $default = ''): string\n    {\n        return preg_replace('/[^[:alpha:]]/', '', $this->getString($key, $default));\n    }\n\n    /**\n     * Returns the alphabetic characters and digits of the parameter value.\n     */\n    public function getAlnum(string $key, string $default = ''): string\n    {\n        return preg_replace('/[^[:alnum:]]/', '', $this->getString($key, $default));\n    }\n\n    /**\n     * Returns the digits of the parameter value.\n     */\n    public function getDigits(string $key, string $default = ''): string\n    {\n        return preg_replace('/[^[:digit:]]/', '', $this->getString($key, $default));\n    }\n\n    /**\n     * Returns the parameter as string.\n     */\n    public function getString(string $key, string $default = ''): string\n    {\n        $value = $this->get($key, $default);\n        if (!\\is_scalar($value) && !$value instanceof \\Stringable) {\n            throw new UnexpectedValueException(sprintf('Parameter value \"%s\" cannot be converted to \"string\".', $key));\n        }\n\n        return (string) $value;\n    }\n\n    /**\n     * Returns the parameter value converted to integer.\n     */\n    public function getInt(string $key, int $default = 0): int\n    {\n        // In 7.0 remove the fallback to 0, in case of failure an exception will be thrown\n        return $this->filter($key, $default, \\FILTER_VALIDATE_INT, ['flags' => \\FILTER_REQUIRE_SCALAR]) ?: 0;\n    }\n\n    /**\n     * Returns the parameter value converted to boolean.\n     */\n    public function getBoolean(string $key, bool $default = false): bool\n    {\n        return $this->filter($key, $default, \\FILTER_VALIDATE_BOOL, ['flags' => \\FILTER_REQUIRE_SCALAR]);\n    }\n\n    /**\n     * Returns the parameter value converted to an enum.\n     *\n     * @template T of \\BackedEnum\n     *\n     * @param class-string<T> $class\n     * @param ?T              $default\n     *\n     * @return ?T\n     */\n    public function getEnum(string $key, string $class, ?\\BackedEnum $default = null): ?\\BackedEnum\n    {\n        $value = $this->get($key);\n\n        if (null === $value) {\n            return $default;\n        }\n\n        try {\n            return $class::from($value);\n        } catch (\\ValueError|\\TypeError $e) {\n            throw new UnexpectedValueException(sprintf('Parameter \"%s\" cannot be converted to enum: %s.', $key, $e->getMessage()), $e->getCode(), $e);\n        }\n    }\n\n    /**\n     * Filter key.\n     *\n     * @param int                                     $filter  FILTER_* constant\n     * @param int|array{flags?: int, options?: array} $options Flags from FILTER_* constants\n     *\n     * @see https://php.net/filter-var\n     */\n    public function filter(string $key, mixed $default = null, int $filter = \\FILTER_DEFAULT, mixed $options = []): mixed\n    {\n        $value = $this->get($key, $default);\n\n        // Always turn $options into an array - this allows filter_var option shortcuts.\n        if (!\\is_array($options) && $options) {\n            $options = ['flags' => $options];\n        }\n\n        // Add a convenience check for arrays.\n        if (\\is_array($value) && !isset($options['flags'])) {\n            $options['flags'] = \\FILTER_REQUIRE_ARRAY;\n        }\n\n        if (\\is_object($value) && !$value instanceof \\Stringable) {\n            throw new UnexpectedValueException(sprintf('Parameter value \"%s\" cannot be filtered.', $key));\n        }\n\n        if ((\\FILTER_CALLBACK & $filter) && !(($options['options'] ?? null) instanceof \\Closure)) {\n            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)));\n        }\n\n        $options['flags'] ??= 0;\n        $nullOnFailure = $options['flags'] & \\FILTER_NULL_ON_FAILURE;\n        $options['flags'] |= \\FILTER_NULL_ON_FAILURE;\n\n        $value = filter_var($value, $filter, $options);\n\n        if (null !== $value || $nullOnFailure) {\n            return $value;\n        }\n\n        $method = debug_backtrace(\\DEBUG_BACKTRACE_IGNORE_ARGS | \\DEBUG_BACKTRACE_PROVIDE_OBJECT, 2)[1];\n        $method = ($method['object'] ?? null) === $this ? $method['function'] : 'filter';\n        $hint = 'filter' === $method ? 'pass' : 'use method \"filter()\" with';\n\n        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);\n\n        return false;\n    }\n\n    /**\n     * Returns an iterator for parameters.\n     *\n     * @return \\ArrayIterator<string, mixed>\n     */\n    public function getIterator(): \\ArrayIterator\n    {\n        return new \\ArrayIterator($this->parameters);\n    }\n\n    /**\n     * Returns the number of parameters.\n     */\n    public function count(): int\n    {\n        return \\count($this->parameters);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/README.md",
    "content": "HttpFoundation Component\n========================\n\nThe HttpFoundation component defines an object-oriented layer for the HTTP\nspecification.\n\nResources\n---------\n\n * [Documentation](https://symfony.com/doc/current/components/http_foundation.html)\n * [Contributing](https://symfony.com/doc/current/contributing/index.html)\n * [Report issues](https://github.com/symfony/symfony/issues) and\n   [send Pull Requests](https://github.com/symfony/symfony/pulls)\n   in the [main Symfony repository](https://github.com/symfony/symfony)\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RateLimiter;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\RateLimiter\\LimiterInterface;\nuse Symfony\\Component\\RateLimiter\\Policy\\NoLimiter;\nuse Symfony\\Component\\RateLimiter\\RateLimit;\n\n/**\n * An implementation of PeekableRequestRateLimiterInterface that\n * fits most use-cases.\n *\n * @author Wouter de Jong <wouter@wouterj.nl>\n */\nabstract class AbstractRequestRateLimiter implements PeekableRequestRateLimiterInterface\n{\n    public function consume(Request $request): RateLimit\n    {\n        return $this->doConsume($request, 1);\n    }\n\n    public function peek(Request $request): RateLimit\n    {\n        return $this->doConsume($request, 0);\n    }\n\n    private function doConsume(Request $request, int $tokens): RateLimit\n    {\n        $limiters = $this->getLimiters($request);\n        if (0 === \\count($limiters)) {\n            $limiters = [new NoLimiter()];\n        }\n\n        $minimalRateLimit = null;\n        foreach ($limiters as $limiter) {\n            $rateLimit = $limiter->consume($tokens);\n\n            $minimalRateLimit = $minimalRateLimit ? self::getMinimalRateLimit($minimalRateLimit, $rateLimit) : $rateLimit;\n        }\n\n        return $minimalRateLimit;\n    }\n\n    public function reset(Request $request): void\n    {\n        foreach ($this->getLimiters($request) as $limiter) {\n            $limiter->reset();\n        }\n    }\n\n    /**\n     * @return LimiterInterface[] a set of limiters using keys extracted from the request\n     */\n    abstract protected function getLimiters(Request $request): array;\n\n    private static function getMinimalRateLimit(RateLimit $first, RateLimit $second): RateLimit\n    {\n        if ($first->isAccepted() !== $second->isAccepted()) {\n            return $first->isAccepted() ? $second : $first;\n        }\n\n        $firstRemainingTokens = $first->getRemainingTokens();\n        $secondRemainingTokens = $second->getRemainingTokens();\n\n        if ($firstRemainingTokens === $secondRemainingTokens) {\n            return $first->getRetryAfter() < $second->getRetryAfter() ? $second : $first;\n        }\n\n        return $firstRemainingTokens > $secondRemainingTokens ? $second : $first;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RateLimiter;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\RateLimiter\\RateLimit;\n\n/**\n * A request limiter which allows peeking ahead.\n *\n * This is valuable to reduce the cache backend load in scenarios\n * like a login when we only want to consume a token on login failure,\n * and where the majority of requests will be successful and thus not\n * need to consume a token.\n *\n * This way we can peek ahead before allowing the request through, and\n * only consume if the request failed (1 backend op). This is compared\n * to always consuming and then resetting the limit if the request\n * is successful (2 backend ops).\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\ninterface PeekableRequestRateLimiterInterface extends RequestRateLimiterInterface\n{\n    public function peek(Request $request): RateLimit;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RateLimiter;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\RateLimiter\\RateLimit;\n\n/**\n * A special type of limiter that deals with requests.\n *\n * This allows to limit on different types of information\n * from the requests.\n *\n * @author Wouter de Jong <wouter@wouterj.nl>\n */\ninterface RequestRateLimiterInterface\n{\n    public function consume(Request $request): RateLimit;\n\n    public function reset(Request $request): void;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RedirectResponse.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * RedirectResponse represents an HTTP response doing a redirect.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass RedirectResponse extends Response\n{\n    protected $targetUrl;\n\n    /**\n     * Creates a redirect response so that it conforms to the rules defined for a redirect status code.\n     *\n     * @param string $url     The URL to redirect to. The URL should be a full URL, with schema etc.,\n     *                        but practically every browser redirects on paths only as well\n     * @param int    $status  The HTTP status code (302 \"Found\" by default)\n     * @param array  $headers The headers (Location is always set to the given URL)\n     *\n     * @throws \\InvalidArgumentException\n     *\n     * @see https://tools.ietf.org/html/rfc2616#section-10.3\n     */\n    public function __construct(string $url, int $status = 302, array $headers = [])\n    {\n        parent::__construct('', $status, $headers);\n\n        $this->setTargetUrl($url);\n\n        if (!$this->isRedirect()) {\n            throw new \\InvalidArgumentException(sprintf('The HTTP status code is not a redirect (\"%s\" given).', $status));\n        }\n\n        if (301 == $status && !\\array_key_exists('cache-control', array_change_key_case($headers, \\CASE_LOWER))) {\n            $this->headers->remove('cache-control');\n        }\n    }\n\n    /**\n     * Returns the target URL.\n     */\n    public function getTargetUrl(): string\n    {\n        return $this->targetUrl;\n    }\n\n    /**\n     * Sets the redirect target of this response.\n     *\n     * @return $this\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function setTargetUrl(string $url): static\n    {\n        if ('' === $url) {\n            throw new \\InvalidArgumentException('Cannot redirect to an empty URL.');\n        }\n\n        $this->targetUrl = $url;\n\n        $this->setContent(\n            sprintf('<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\" />\n        <meta http-equiv=\"refresh\" content=\"0;url=\\'%1$s\\'\" />\n\n        <title>Redirecting to %1$s</title>\n    </head>\n    <body>\n        Redirecting to <a href=\"%1$s\">%1$s</a>.\n    </body>\n</html>', htmlspecialchars($url, \\ENT_QUOTES, 'UTF-8')));\n\n        $this->headers->set('Location', $url);\n        $this->headers->set('Content-Type', 'text/html; charset=utf-8');\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Request.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\nuse Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException;\nuse Symfony\\Component\\HttpFoundation\\Exception\\JsonException;\nuse Symfony\\Component\\HttpFoundation\\Exception\\SessionNotFoundException;\nuse Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException;\nuse Symfony\\Component\\HttpFoundation\\Session\\SessionInterface;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(AcceptHeader::class);\nclass_exists(FileBag::class);\nclass_exists(HeaderBag::class);\nclass_exists(HeaderUtils::class);\nclass_exists(InputBag::class);\nclass_exists(ParameterBag::class);\nclass_exists(ServerBag::class);\n\n/**\n * Request represents an HTTP request.\n *\n * The methods dealing with URL accept / return a raw path (% encoded):\n *   * getBasePath\n *   * getBaseUrl\n *   * getPathInfo\n *   * getRequestUri\n *   * getUri\n *   * getUriForPath\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass Request\n{\n    public const HEADER_FORWARDED = 0b000001; // When using RFC 7239\n    public const HEADER_X_FORWARDED_FOR = 0b000010;\n    public const HEADER_X_FORWARDED_HOST = 0b000100;\n    public const HEADER_X_FORWARDED_PROTO = 0b001000;\n    public const HEADER_X_FORWARDED_PORT = 0b010000;\n    public const HEADER_X_FORWARDED_PREFIX = 0b100000;\n\n    public const HEADER_X_FORWARDED_AWS_ELB = 0b0011010; // AWS ELB doesn't send X-Forwarded-Host\n    public const HEADER_X_FORWARDED_TRAEFIK = 0b0111110; // All \"X-Forwarded-*\" headers sent by Traefik reverse proxy\n\n    public const METHOD_HEAD = 'HEAD';\n    public const METHOD_GET = 'GET';\n    public const METHOD_POST = 'POST';\n    public const METHOD_PUT = 'PUT';\n    public const METHOD_PATCH = 'PATCH';\n    public const METHOD_DELETE = 'DELETE';\n    public const METHOD_PURGE = 'PURGE';\n    public const METHOD_OPTIONS = 'OPTIONS';\n    public const METHOD_TRACE = 'TRACE';\n    public const METHOD_CONNECT = 'CONNECT';\n\n    /**\n     * @var string[]\n     */\n    protected static $trustedProxies = [];\n\n    /**\n     * @var string[]\n     */\n    protected static $trustedHostPatterns = [];\n\n    /**\n     * @var string[]\n     */\n    protected static $trustedHosts = [];\n\n    protected static $httpMethodParameterOverride = false;\n\n    /**\n     * Custom parameters.\n     *\n     * @var ParameterBag\n     */\n    public $attributes;\n\n    /**\n     * Request body parameters ($_POST).\n     *\n     * @see getPayload() for portability between content types\n     *\n     * @var InputBag\n     */\n    public $request;\n\n    /**\n     * Query string parameters ($_GET).\n     *\n     * @var InputBag\n     */\n    public $query;\n\n    /**\n     * Server and execution environment parameters ($_SERVER).\n     *\n     * @var ServerBag\n     */\n    public $server;\n\n    /**\n     * Uploaded files ($_FILES).\n     *\n     * @var FileBag\n     */\n    public $files;\n\n    /**\n     * Cookies ($_COOKIE).\n     *\n     * @var InputBag\n     */\n    public $cookies;\n\n    /**\n     * Headers (taken from the $_SERVER).\n     *\n     * @var HeaderBag\n     */\n    public $headers;\n\n    /**\n     * @var string|resource|false|null\n     */\n    protected $content;\n\n    /**\n     * @var string[]|null\n     */\n    protected $languages;\n\n    /**\n     * @var string[]|null\n     */\n    protected $charsets;\n\n    /**\n     * @var string[]|null\n     */\n    protected $encodings;\n\n    /**\n     * @var string[]|null\n     */\n    protected $acceptableContentTypes;\n\n    /**\n     * @var string|null\n     */\n    protected $pathInfo;\n\n    /**\n     * @var string|null\n     */\n    protected $requestUri;\n\n    /**\n     * @var string|null\n     */\n    protected $baseUrl;\n\n    /**\n     * @var string|null\n     */\n    protected $basePath;\n\n    /**\n     * @var string|null\n     */\n    protected $method;\n\n    /**\n     * @var string|null\n     */\n    protected $format;\n\n    /**\n     * @var SessionInterface|callable():SessionInterface|null\n     */\n    protected $session;\n\n    /**\n     * @var string|null\n     */\n    protected $locale;\n\n    /**\n     * @var string\n     */\n    protected $defaultLocale = 'en';\n\n    /**\n     * @var array<string, string[]>|null\n     */\n    protected static $formats;\n\n    protected static $requestFactory;\n\n    private ?string $preferredFormat = null;\n    private bool $isHostValid = true;\n    private bool $isForwardedValid = true;\n    private bool $isSafeContentPreferred;\n\n    private array $trustedValuesCache = [];\n\n    private static int $trustedHeaderSet = -1;\n\n    private const FORWARDED_PARAMS = [\n        self::HEADER_X_FORWARDED_FOR => 'for',\n        self::HEADER_X_FORWARDED_HOST => 'host',\n        self::HEADER_X_FORWARDED_PROTO => 'proto',\n        self::HEADER_X_FORWARDED_PORT => 'host',\n    ];\n\n    /**\n     * Names for headers that can be trusted when\n     * using trusted proxies.\n     *\n     * The FORWARDED header is the standard as of rfc7239.\n     *\n     * The other headers are non-standard, but widely used\n     * by popular reverse proxies (like Apache mod_proxy or Amazon EC2).\n     */\n    private const TRUSTED_HEADERS = [\n        self::HEADER_FORWARDED => 'FORWARDED',\n        self::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',\n        self::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',\n        self::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',\n        self::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',\n        self::HEADER_X_FORWARDED_PREFIX => 'X_FORWARDED_PREFIX',\n    ];\n\n    /** @var bool */\n    private $isIisRewrite = false;\n\n    /**\n     * @param array                $query      The GET parameters\n     * @param array                $request    The POST parameters\n     * @param array                $attributes The request attributes (parameters parsed from the PATH_INFO, ...)\n     * @param array                $cookies    The COOKIE parameters\n     * @param array                $files      The FILES parameters\n     * @param array                $server     The SERVER parameters\n     * @param string|resource|null $content    The raw body data\n     */\n    public function __construct(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null)\n    {\n        $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content);\n    }\n\n    /**\n     * Sets the parameters for this request.\n     *\n     * This method also re-initializes all properties.\n     *\n     * @param array                $query      The GET parameters\n     * @param array                $request    The POST parameters\n     * @param array                $attributes The request attributes (parameters parsed from the PATH_INFO, ...)\n     * @param array                $cookies    The COOKIE parameters\n     * @param array                $files      The FILES parameters\n     * @param array                $server     The SERVER parameters\n     * @param string|resource|null $content    The raw body data\n     *\n     * @return void\n     */\n    public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null)\n    {\n        $this->request = new InputBag($request);\n        $this->query = new InputBag($query);\n        $this->attributes = new ParameterBag($attributes);\n        $this->cookies = new InputBag($cookies);\n        $this->files = new FileBag($files);\n        $this->server = new ServerBag($server);\n        $this->headers = new HeaderBag($this->server->getHeaders());\n\n        $this->content = $content;\n        $this->languages = null;\n        $this->charsets = null;\n        $this->encodings = null;\n        $this->acceptableContentTypes = null;\n        $this->pathInfo = null;\n        $this->requestUri = null;\n        $this->baseUrl = null;\n        $this->basePath = null;\n        $this->method = null;\n        $this->format = null;\n    }\n\n    /**\n     * Creates a new request with values from PHP's super globals.\n     */\n    public static function createFromGlobals(): static\n    {\n        $request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER);\n\n        if (str_starts_with($request->headers->get('CONTENT_TYPE', ''), 'application/x-www-form-urlencoded')\n            && \\in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'DELETE', 'PATCH'])\n        ) {\n            parse_str($request->getContent(), $data);\n            $request->request = new InputBag($data);\n        }\n\n        return $request;\n    }\n\n    /**\n     * Creates a Request based on a given URI and configuration.\n     *\n     * The information contained in the URI always take precedence\n     * over the other information (server and parameters).\n     *\n     * @param string               $uri        The URI\n     * @param string               $method     The HTTP method\n     * @param array                $parameters The query (GET) or request (POST) parameters\n     * @param array                $cookies    The request cookies ($_COOKIE)\n     * @param array                $files      The request files ($_FILES)\n     * @param array                $server     The server parameters ($_SERVER)\n     * @param string|resource|null $content    The raw body data\n     */\n    public static function create(string $uri, string $method = 'GET', array $parameters = [], array $cookies = [], array $files = [], array $server = [], $content = null): static\n    {\n        $server = array_replace([\n            'SERVER_NAME' => 'localhost',\n            'SERVER_PORT' => 80,\n            'HTTP_HOST' => 'localhost',\n            'HTTP_USER_AGENT' => 'Symfony',\n            'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',\n            'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',\n            'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',\n            'REMOTE_ADDR' => '127.0.0.1',\n            'SCRIPT_NAME' => '',\n            'SCRIPT_FILENAME' => '',\n            'SERVER_PROTOCOL' => 'HTTP/1.1',\n            'REQUEST_TIME' => time(),\n            'REQUEST_TIME_FLOAT' => microtime(true),\n        ], $server);\n\n        $server['PATH_INFO'] = '';\n        $server['REQUEST_METHOD'] = strtoupper($method);\n\n        $components = parse_url($uri);\n        if (false === $components) {\n            trigger_deprecation('symfony/http-foundation', '6.3', 'Calling \"%s()\" with an invalid URI is deprecated.', __METHOD__);\n            $components = [];\n        }\n        if (isset($components['host'])) {\n            $server['SERVER_NAME'] = $components['host'];\n            $server['HTTP_HOST'] = $components['host'];\n        }\n\n        if (isset($components['scheme'])) {\n            if ('https' === $components['scheme']) {\n                $server['HTTPS'] = 'on';\n                $server['SERVER_PORT'] = 443;\n            } else {\n                unset($server['HTTPS']);\n                $server['SERVER_PORT'] = 80;\n            }\n        }\n\n        if (isset($components['port'])) {\n            $server['SERVER_PORT'] = $components['port'];\n            $server['HTTP_HOST'] .= ':'.$components['port'];\n        }\n\n        if (isset($components['user'])) {\n            $server['PHP_AUTH_USER'] = $components['user'];\n        }\n\n        if (isset($components['pass'])) {\n            $server['PHP_AUTH_PW'] = $components['pass'];\n        }\n\n        if (!isset($components['path'])) {\n            $components['path'] = '/';\n        }\n\n        switch (strtoupper($method)) {\n            case 'POST':\n            case 'PUT':\n            case 'DELETE':\n                if (!isset($server['CONTENT_TYPE'])) {\n                    $server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded';\n                }\n                // no break\n            case 'PATCH':\n                $request = $parameters;\n                $query = [];\n                break;\n            default:\n                $request = [];\n                $query = $parameters;\n                break;\n        }\n\n        $queryString = '';\n        if (isset($components['query'])) {\n            parse_str(html_entity_decode($components['query']), $qs);\n\n            if ($query) {\n                $query = array_replace($qs, $query);\n                $queryString = http_build_query($query, '', '&');\n            } else {\n                $query = $qs;\n                $queryString = $components['query'];\n            }\n        } elseif ($query) {\n            $queryString = http_build_query($query, '', '&');\n        }\n\n        $server['REQUEST_URI'] = $components['path'].('' !== $queryString ? '?'.$queryString : '');\n        $server['QUERY_STRING'] = $queryString;\n\n        return self::createRequestFromFactory($query, $request, [], $cookies, $files, $server, $content);\n    }\n\n    /**\n     * Sets a callable able to create a Request instance.\n     *\n     * This is mainly useful when you need to override the Request class\n     * to keep BC with an existing system. It should not be used for any\n     * other purpose.\n     *\n     * @return void\n     */\n    public static function setFactory(?callable $callable)\n    {\n        self::$requestFactory = $callable;\n    }\n\n    /**\n     * Clones a request and overrides some of its parameters.\n     *\n     * @param array|null $query      The GET parameters\n     * @param array|null $request    The POST parameters\n     * @param array|null $attributes The request attributes (parameters parsed from the PATH_INFO, ...)\n     * @param array|null $cookies    The COOKIE parameters\n     * @param array|null $files      The FILES parameters\n     * @param array|null $server     The SERVER parameters\n     */\n    public function duplicate(?array $query = null, ?array $request = null, ?array $attributes = null, ?array $cookies = null, ?array $files = null, ?array $server = null): static\n    {\n        $dup = clone $this;\n        if (null !== $query) {\n            $dup->query = new InputBag($query);\n        }\n        if (null !== $request) {\n            $dup->request = new InputBag($request);\n        }\n        if (null !== $attributes) {\n            $dup->attributes = new ParameterBag($attributes);\n        }\n        if (null !== $cookies) {\n            $dup->cookies = new InputBag($cookies);\n        }\n        if (null !== $files) {\n            $dup->files = new FileBag($files);\n        }\n        if (null !== $server) {\n            $dup->server = new ServerBag($server);\n            $dup->headers = new HeaderBag($dup->server->getHeaders());\n        }\n        $dup->languages = null;\n        $dup->charsets = null;\n        $dup->encodings = null;\n        $dup->acceptableContentTypes = null;\n        $dup->pathInfo = null;\n        $dup->requestUri = null;\n        $dup->baseUrl = null;\n        $dup->basePath = null;\n        $dup->method = null;\n        $dup->format = null;\n\n        if (!$dup->get('_format') && $this->get('_format')) {\n            $dup->attributes->set('_format', $this->get('_format'));\n        }\n\n        if (!$dup->getRequestFormat(null)) {\n            $dup->setRequestFormat($this->getRequestFormat(null));\n        }\n\n        return $dup;\n    }\n\n    /**\n     * Clones the current request.\n     *\n     * Note that the session is not cloned as duplicated requests\n     * are most of the time sub-requests of the main one.\n     */\n    public function __clone()\n    {\n        $this->query = clone $this->query;\n        $this->request = clone $this->request;\n        $this->attributes = clone $this->attributes;\n        $this->cookies = clone $this->cookies;\n        $this->files = clone $this->files;\n        $this->server = clone $this->server;\n        $this->headers = clone $this->headers;\n    }\n\n    public function __toString(): string\n    {\n        $content = $this->getContent();\n\n        $cookieHeader = '';\n        $cookies = [];\n\n        foreach ($this->cookies as $k => $v) {\n            $cookies[] = \\is_array($v) ? http_build_query([$k => $v], '', '; ', \\PHP_QUERY_RFC3986) : \"$k=$v\";\n        }\n\n        if ($cookies) {\n            $cookieHeader = 'Cookie: '.implode('; ', $cookies).\"\\r\\n\";\n        }\n\n        return\n            sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL')).\"\\r\\n\".\n            $this->headers.\n            $cookieHeader.\"\\r\\n\".\n            $content;\n    }\n\n    /**\n     * Overrides the PHP global variables according to this request instance.\n     *\n     * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE.\n     * $_FILES is never overridden, see rfc1867\n     *\n     * @return void\n     */\n    public function overrideGlobals()\n    {\n        $this->server->set('QUERY_STRING', static::normalizeQueryString(http_build_query($this->query->all(), '', '&')));\n\n        $_GET = $this->query->all();\n        $_POST = $this->request->all();\n        $_SERVER = $this->server->all();\n        $_COOKIE = $this->cookies->all();\n\n        foreach ($this->headers->all() as $key => $value) {\n            $key = strtoupper(str_replace('-', '_', $key));\n            if (\\in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH', 'CONTENT_MD5'], true)) {\n                $_SERVER[$key] = implode(', ', $value);\n            } else {\n                $_SERVER['HTTP_'.$key] = implode(', ', $value);\n            }\n        }\n\n        $request = ['g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE];\n\n        $requestOrder = \\ini_get('request_order') ?: \\ini_get('variables_order');\n        $requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp';\n\n        $_REQUEST = [[]];\n\n        foreach (str_split($requestOrder) as $order) {\n            $_REQUEST[] = $request[$order];\n        }\n\n        $_REQUEST = array_merge(...$_REQUEST);\n    }\n\n    /**\n     * Sets a list of trusted proxies.\n     *\n     * You should only list the reverse proxies that you manage directly.\n     *\n     * @param array $proxies          A list of trusted proxies, the string 'REMOTE_ADDR' will be replaced with $_SERVER['REMOTE_ADDR']\n     * @param int   $trustedHeaderSet A bit field of Request::HEADER_*, to set which headers to trust from your proxies\n     *\n     * @return void\n     */\n    public static function setTrustedProxies(array $proxies, int $trustedHeaderSet)\n    {\n        self::$trustedProxies = array_reduce($proxies, function ($proxies, $proxy) {\n            if ('REMOTE_ADDR' !== $proxy) {\n                $proxies[] = $proxy;\n            } elseif (isset($_SERVER['REMOTE_ADDR'])) {\n                $proxies[] = $_SERVER['REMOTE_ADDR'];\n            }\n\n            return $proxies;\n        }, []);\n        self::$trustedHeaderSet = $trustedHeaderSet;\n    }\n\n    /**\n     * Gets the list of trusted proxies.\n     *\n     * @return string[]\n     */\n    public static function getTrustedProxies(): array\n    {\n        return self::$trustedProxies;\n    }\n\n    /**\n     * Gets the set of trusted headers from trusted proxies.\n     *\n     * @return int A bit field of Request::HEADER_* that defines which headers are trusted from your proxies\n     */\n    public static function getTrustedHeaderSet(): int\n    {\n        return self::$trustedHeaderSet;\n    }\n\n    /**\n     * Sets a list of trusted host patterns.\n     *\n     * You should only list the hosts you manage using regexs.\n     *\n     * @param array $hostPatterns A list of trusted host patterns\n     *\n     * @return void\n     */\n    public static function setTrustedHosts(array $hostPatterns)\n    {\n        self::$trustedHostPatterns = array_map(fn ($hostPattern) => sprintf('{%s}i', $hostPattern), $hostPatterns);\n        // we need to reset trusted hosts on trusted host patterns change\n        self::$trustedHosts = [];\n    }\n\n    /**\n     * Gets the list of trusted host patterns.\n     *\n     * @return string[]\n     */\n    public static function getTrustedHosts(): array\n    {\n        return self::$trustedHostPatterns;\n    }\n\n    /**\n     * Normalizes a query string.\n     *\n     * It builds a normalized query string, where keys/value pairs are alphabetized,\n     * have consistent escaping and unneeded delimiters are removed.\n     */\n    public static function normalizeQueryString(?string $qs): string\n    {\n        if ('' === ($qs ?? '')) {\n            return '';\n        }\n\n        $qs = HeaderUtils::parseQuery($qs);\n        ksort($qs);\n\n        return http_build_query($qs, '', '&', \\PHP_QUERY_RFC3986);\n    }\n\n    /**\n     * Enables support for the _method request parameter to determine the intended HTTP method.\n     *\n     * Be warned that enabling this feature might lead to CSRF issues in your code.\n     * Check that you are using CSRF tokens when required.\n     * If the HTTP method parameter override is enabled, an html-form with method \"POST\" can be altered\n     * and used to send a \"PUT\" or \"DELETE\" request via the _method request parameter.\n     * If these methods are not protected against CSRF, this presents a possible vulnerability.\n     *\n     * The HTTP method can only be overridden when the real HTTP method is POST.\n     *\n     * @return void\n     */\n    public static function enableHttpMethodParameterOverride()\n    {\n        self::$httpMethodParameterOverride = true;\n    }\n\n    /**\n     * Checks whether support for the _method request parameter is enabled.\n     */\n    public static function getHttpMethodParameterOverride(): bool\n    {\n        return self::$httpMethodParameterOverride;\n    }\n\n    /**\n     * Gets a \"parameter\" value from any bag.\n     *\n     * This method is mainly useful for libraries that want to provide some flexibility. If you don't need the\n     * flexibility in controllers, it is better to explicitly get request parameters from the appropriate\n     * public property instead (attributes, query, request).\n     *\n     * Order of precedence: PATH (routing placeholders or custom attributes), GET, POST\n     *\n     * @internal use explicit input sources instead\n     */\n    public function get(string $key, mixed $default = null): mixed\n    {\n        if ($this !== $result = $this->attributes->get($key, $this)) {\n            return $result;\n        }\n\n        if ($this->query->has($key)) {\n            return $this->query->all()[$key];\n        }\n\n        if ($this->request->has($key)) {\n            return $this->request->all()[$key];\n        }\n\n        return $default;\n    }\n\n    /**\n     * Gets the Session.\n     *\n     * @throws SessionNotFoundException When session is not set properly\n     */\n    public function getSession(): SessionInterface\n    {\n        $session = $this->session;\n        if (!$session instanceof SessionInterface && null !== $session) {\n            $this->setSession($session = $session());\n        }\n\n        if (null === $session) {\n            throw new SessionNotFoundException('Session has not been set.');\n        }\n\n        return $session;\n    }\n\n    /**\n     * Whether the request contains a Session which was started in one of the\n     * previous requests.\n     */\n    public function hasPreviousSession(): bool\n    {\n        // the check for $this->session avoids malicious users trying to fake a session cookie with proper name\n        return $this->hasSession() && $this->cookies->has($this->getSession()->getName());\n    }\n\n    /**\n     * Whether the request contains a Session object.\n     *\n     * This method does not give any information about the state of the session object,\n     * like whether the session is started or not. It is just a way to check if this Request\n     * is associated with a Session instance.\n     *\n     * @param bool $skipIfUninitialized When true, ignores factories injected by `setSessionFactory`\n     */\n    public function hasSession(bool $skipIfUninitialized = false): bool\n    {\n        return null !== $this->session && (!$skipIfUninitialized || $this->session instanceof SessionInterface);\n    }\n\n    /**\n     * @return void\n     */\n    public function setSession(SessionInterface $session)\n    {\n        $this->session = $session;\n    }\n\n    /**\n     * @internal\n     *\n     * @param callable(): SessionInterface $factory\n     */\n    public function setSessionFactory(callable $factory): void\n    {\n        $this->session = $factory(...);\n    }\n\n    /**\n     * Returns the client IP addresses.\n     *\n     * In the returned array the most trusted IP address is first, and the\n     * least trusted one last. The \"real\" client IP address is the last one,\n     * but this is also the least trusted one. Trusted proxies are stripped.\n     *\n     * Use this method carefully; you should use getClientIp() instead.\n     *\n     * @see getClientIp()\n     */\n    public function getClientIps(): array\n    {\n        $ip = $this->server->get('REMOTE_ADDR');\n\n        if (!$this->isFromTrustedProxy()) {\n            return [$ip];\n        }\n\n        return $this->getTrustedValues(self::HEADER_X_FORWARDED_FOR, $ip) ?: [$ip];\n    }\n\n    /**\n     * Returns the client IP address.\n     *\n     * This method can read the client IP address from the \"X-Forwarded-For\" header\n     * when trusted proxies were set via \"setTrustedProxies()\". The \"X-Forwarded-For\"\n     * header value is a comma+space separated list of IP addresses, the left-most\n     * being the original client, and each successive proxy that passed the request\n     * adding the IP address where it received the request from.\n     *\n     * If your reverse proxy uses a different header name than \"X-Forwarded-For\",\n     * (\"Client-Ip\" for instance), configure it via the $trustedHeaderSet\n     * argument of the Request::setTrustedProxies() method instead.\n     *\n     * @see getClientIps()\n     * @see https://wikipedia.org/wiki/X-Forwarded-For\n     */\n    public function getClientIp(): ?string\n    {\n        $ipAddresses = $this->getClientIps();\n\n        return $ipAddresses[0];\n    }\n\n    /**\n     * Returns current script name.\n     */\n    public function getScriptName(): string\n    {\n        return $this->server->get('SCRIPT_NAME', $this->server->get('ORIG_SCRIPT_NAME', ''));\n    }\n\n    /**\n     * Returns the path being requested relative to the executed script.\n     *\n     * The path info always starts with a /.\n     *\n     * Suppose this request is instantiated from /mysite on localhost:\n     *\n     *  * http://localhost/mysite              returns an empty string\n     *  * http://localhost/mysite/about        returns '/about'\n     *  * http://localhost/mysite/enco%20ded   returns '/enco%20ded'\n     *  * http://localhost/mysite/about?var=1  returns '/about'\n     *\n     * @return string The raw path (i.e. not urldecoded)\n     */\n    public function getPathInfo(): string\n    {\n        return $this->pathInfo ??= $this->preparePathInfo();\n    }\n\n    /**\n     * Returns the root path from which this request is executed.\n     *\n     * Suppose that an index.php file instantiates this request object:\n     *\n     *  * http://localhost/index.php         returns an empty string\n     *  * http://localhost/index.php/page    returns an empty string\n     *  * http://localhost/web/index.php     returns '/web'\n     *  * http://localhost/we%20b/index.php  returns '/we%20b'\n     *\n     * @return string The raw path (i.e. not urldecoded)\n     */\n    public function getBasePath(): string\n    {\n        return $this->basePath ??= $this->prepareBasePath();\n    }\n\n    /**\n     * Returns the root URL from which this request is executed.\n     *\n     * The base URL never ends with a /.\n     *\n     * This is similar to getBasePath(), except that it also includes the\n     * script filename (e.g. index.php) if one exists.\n     *\n     * @return string The raw URL (i.e. not urldecoded)\n     */\n    public function getBaseUrl(): string\n    {\n        $trustedPrefix = '';\n\n        // the proxy prefix must be prepended to any prefix being needed at the webserver level\n        if ($this->isFromTrustedProxy() && $trustedPrefixValues = $this->getTrustedValues(self::HEADER_X_FORWARDED_PREFIX)) {\n            $trustedPrefix = rtrim($trustedPrefixValues[0], '/');\n        }\n\n        return $trustedPrefix.$this->getBaseUrlReal();\n    }\n\n    /**\n     * Returns the real base URL received by the webserver from which this request is executed.\n     * The URL does not include trusted reverse proxy prefix.\n     *\n     * @return string The raw URL (i.e. not urldecoded)\n     */\n    private function getBaseUrlReal(): string\n    {\n        return $this->baseUrl ??= $this->prepareBaseUrl();\n    }\n\n    /**\n     * Gets the request's scheme.\n     */\n    public function getScheme(): string\n    {\n        return $this->isSecure() ? 'https' : 'http';\n    }\n\n    /**\n     * Returns the port on which the request is made.\n     *\n     * This method can read the client port from the \"X-Forwarded-Port\" header\n     * when trusted proxies were set via \"setTrustedProxies()\".\n     *\n     * The \"X-Forwarded-Port\" header must contain the client port.\n     *\n     * @return int|string|null Can be a string if fetched from the server bag\n     */\n    public function getPort(): int|string|null\n    {\n        if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_PORT)) {\n            $host = $host[0];\n        } elseif ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) {\n            $host = $host[0];\n        } elseif (!$host = $this->headers->get('HOST')) {\n            return $this->server->get('SERVER_PORT');\n        }\n\n        if ('[' === $host[0]) {\n            $pos = strpos($host, ':', strrpos($host, ']'));\n        } else {\n            $pos = strrpos($host, ':');\n        }\n\n        if (false !== $pos && $port = substr($host, $pos + 1)) {\n            return (int) $port;\n        }\n\n        return 'https' === $this->getScheme() ? 443 : 80;\n    }\n\n    /**\n     * Returns the user.\n     */\n    public function getUser(): ?string\n    {\n        return $this->headers->get('PHP_AUTH_USER');\n    }\n\n    /**\n     * Returns the password.\n     */\n    public function getPassword(): ?string\n    {\n        return $this->headers->get('PHP_AUTH_PW');\n    }\n\n    /**\n     * Gets the user info.\n     *\n     * @return string|null A user name if any and, optionally, scheme-specific information about how to gain authorization to access the server\n     */\n    public function getUserInfo(): ?string\n    {\n        $userinfo = $this->getUser();\n\n        $pass = $this->getPassword();\n        if ('' != $pass) {\n            $userinfo .= \":$pass\";\n        }\n\n        return $userinfo;\n    }\n\n    /**\n     * Returns the HTTP host being requested.\n     *\n     * The port name will be appended to the host if it's non-standard.\n     */\n    public function getHttpHost(): string\n    {\n        $scheme = $this->getScheme();\n        $port = $this->getPort();\n\n        if (('http' === $scheme && 80 == $port) || ('https' === $scheme && 443 == $port)) {\n            return $this->getHost();\n        }\n\n        return $this->getHost().':'.$port;\n    }\n\n    /**\n     * Returns the requested URI (path and query string).\n     *\n     * @return string The raw URI (i.e. not URI decoded)\n     */\n    public function getRequestUri(): string\n    {\n        return $this->requestUri ??= $this->prepareRequestUri();\n    }\n\n    /**\n     * Gets the scheme and HTTP host.\n     *\n     * If the URL was called with basic authentication, the user\n     * and the password are not added to the generated string.\n     */\n    public function getSchemeAndHttpHost(): string\n    {\n        return $this->getScheme().'://'.$this->getHttpHost();\n    }\n\n    /**\n     * Generates a normalized URI (URL) for the Request.\n     *\n     * @see getQueryString()\n     */\n    public function getUri(): string\n    {\n        if (null !== $qs = $this->getQueryString()) {\n            $qs = '?'.$qs;\n        }\n\n        return $this->getSchemeAndHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs;\n    }\n\n    /**\n     * Generates a normalized URI for the given path.\n     *\n     * @param string $path A path to use instead of the current one\n     */\n    public function getUriForPath(string $path): string\n    {\n        return $this->getSchemeAndHttpHost().$this->getBaseUrl().$path;\n    }\n\n    /**\n     * Returns the path as relative reference from the current Request path.\n     *\n     * Only the URIs path component (no schema, host etc.) is relevant and must be given.\n     * Both paths must be absolute and not contain relative parts.\n     * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives.\n     * Furthermore, they can be used to reduce the link size in documents.\n     *\n     * Example target paths, given a base path of \"/a/b/c/d\":\n     * - \"/a/b/c/d\"     -> \"\"\n     * - \"/a/b/c/\"      -> \"./\"\n     * - \"/a/b/\"        -> \"../\"\n     * - \"/a/b/c/other\" -> \"other\"\n     * - \"/a/x/y\"       -> \"../../x/y\"\n     */\n    public function getRelativeUriForPath(string $path): string\n    {\n        // be sure that we are dealing with an absolute path\n        if (!isset($path[0]) || '/' !== $path[0]) {\n            return $path;\n        }\n\n        if ($path === $basePath = $this->getPathInfo()) {\n            return '';\n        }\n\n        $sourceDirs = explode('/', isset($basePath[0]) && '/' === $basePath[0] ? substr($basePath, 1) : $basePath);\n        $targetDirs = explode('/', substr($path, 1));\n        array_pop($sourceDirs);\n        $targetFile = array_pop($targetDirs);\n\n        foreach ($sourceDirs as $i => $dir) {\n            if (isset($targetDirs[$i]) && $dir === $targetDirs[$i]) {\n                unset($sourceDirs[$i], $targetDirs[$i]);\n            } else {\n                break;\n            }\n        }\n\n        $targetDirs[] = $targetFile;\n        $path = str_repeat('../', \\count($sourceDirs)).implode('/', $targetDirs);\n\n        // A reference to the same base directory or an empty subdirectory must be prefixed with \"./\".\n        // This also applies to a segment with a colon character (e.g., \"file:colon\") that cannot be used\n        // as the first segment of a relative-path reference, as it would be mistaken for a scheme name\n        // (see https://tools.ietf.org/html/rfc3986#section-4.2).\n        return !isset($path[0]) || '/' === $path[0]\n            || false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos)\n            ? \"./$path\" : $path;\n    }\n\n    /**\n     * Generates the normalized query string for the Request.\n     *\n     * It builds a normalized query string, where keys/value pairs are alphabetized\n     * and have consistent escaping.\n     */\n    public function getQueryString(): ?string\n    {\n        $qs = static::normalizeQueryString($this->server->get('QUERY_STRING'));\n\n        return '' === $qs ? null : $qs;\n    }\n\n    /**\n     * Checks whether the request is secure or not.\n     *\n     * This method can read the client protocol from the \"X-Forwarded-Proto\" header\n     * when trusted proxies were set via \"setTrustedProxies()\".\n     *\n     * The \"X-Forwarded-Proto\" header must contain the protocol: \"https\" or \"http\".\n     */\n    public function isSecure(): bool\n    {\n        if ($this->isFromTrustedProxy() && $proto = $this->getTrustedValues(self::HEADER_X_FORWARDED_PROTO)) {\n            return \\in_array(strtolower($proto[0]), ['https', 'on', 'ssl', '1'], true);\n        }\n\n        $https = $this->server->get('HTTPS');\n\n        return !empty($https) && 'off' !== strtolower($https);\n    }\n\n    /**\n     * Returns the host name.\n     *\n     * This method can read the client host name from the \"X-Forwarded-Host\" header\n     * when trusted proxies were set via \"setTrustedProxies()\".\n     *\n     * The \"X-Forwarded-Host\" header must contain the client host name.\n     *\n     * @throws SuspiciousOperationException when the host name is invalid or not trusted\n     */\n    public function getHost(): string\n    {\n        if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) {\n            $host = $host[0];\n        } elseif (!$host = $this->headers->get('HOST')) {\n            if (!$host = $this->server->get('SERVER_NAME')) {\n                $host = $this->server->get('SERVER_ADDR', '');\n            }\n        }\n\n        // trim and remove port number from host\n        // host is lowercase as per RFC 952/2181\n        $host = strtolower(preg_replace('/:\\d+$/', '', trim($host)));\n\n        // as the host can come from the user (HTTP_HOST and depending on the configuration, SERVER_NAME too can come from the user)\n        // check that it does not contain forbidden characters (see RFC 952 and RFC 2181)\n        // use preg_replace() instead of preg_match() to prevent DoS attacks with long host names\n        if ($host && '' !== preg_replace('/(?:^\\[)?[a-zA-Z0-9-:\\]_]+\\.?/', '', $host)) {\n            if (!$this->isHostValid) {\n                return '';\n            }\n            $this->isHostValid = false;\n\n            throw new SuspiciousOperationException(sprintf('Invalid Host \"%s\".', $host));\n        }\n\n        if (\\count(self::$trustedHostPatterns) > 0) {\n            // to avoid host header injection attacks, you should provide a list of trusted host patterns\n\n            if (\\in_array($host, self::$trustedHosts)) {\n                return $host;\n            }\n\n            foreach (self::$trustedHostPatterns as $pattern) {\n                if (preg_match($pattern, $host)) {\n                    self::$trustedHosts[] = $host;\n\n                    return $host;\n                }\n            }\n\n            if (!$this->isHostValid) {\n                return '';\n            }\n            $this->isHostValid = false;\n\n            throw new SuspiciousOperationException(sprintf('Untrusted Host \"%s\".', $host));\n        }\n\n        return $host;\n    }\n\n    /**\n     * Sets the request method.\n     *\n     * @return void\n     */\n    public function setMethod(string $method)\n    {\n        $this->method = null;\n        $this->server->set('REQUEST_METHOD', $method);\n    }\n\n    /**\n     * Gets the request \"intended\" method.\n     *\n     * If the X-HTTP-Method-Override header is set, and if the method is a POST,\n     * then it is used to determine the \"real\" intended HTTP method.\n     *\n     * The _method request parameter can also be used to determine the HTTP method,\n     * but only if enableHttpMethodParameterOverride() has been called.\n     *\n     * The method is always an uppercased string.\n     *\n     * @see getRealMethod()\n     */\n    public function getMethod(): string\n    {\n        if (null !== $this->method) {\n            return $this->method;\n        }\n\n        $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET'));\n\n        if ('POST' !== $this->method) {\n            return $this->method;\n        }\n\n        $method = $this->headers->get('X-HTTP-METHOD-OVERRIDE');\n\n        if (!$method && self::$httpMethodParameterOverride) {\n            $method = $this->request->get('_method', $this->query->get('_method', 'POST'));\n        }\n\n        if (!\\is_string($method)) {\n            return $this->method;\n        }\n\n        $method = strtoupper($method);\n\n        if (\\in_array($method, ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'PATCH', 'PURGE', 'TRACE'], true)) {\n            return $this->method = $method;\n        }\n\n        if (!preg_match('/^[A-Z]++$/D', $method)) {\n            throw new SuspiciousOperationException(sprintf('Invalid method override \"%s\".', $method));\n        }\n\n        return $this->method = $method;\n    }\n\n    /**\n     * Gets the \"real\" request method.\n     *\n     * @see getMethod()\n     */\n    public function getRealMethod(): string\n    {\n        return strtoupper($this->server->get('REQUEST_METHOD', 'GET'));\n    }\n\n    /**\n     * Gets the mime type associated with the format.\n     */\n    public function getMimeType(string $format): ?string\n    {\n        if (null === static::$formats) {\n            static::initializeFormats();\n        }\n\n        return isset(static::$formats[$format]) ? static::$formats[$format][0] : null;\n    }\n\n    /**\n     * Gets the mime types associated with the format.\n     *\n     * @return string[]\n     */\n    public static function getMimeTypes(string $format): array\n    {\n        if (null === static::$formats) {\n            static::initializeFormats();\n        }\n\n        return static::$formats[$format] ?? [];\n    }\n\n    /**\n     * Gets the format associated with the mime type.\n     */\n    public function getFormat(?string $mimeType): ?string\n    {\n        $canonicalMimeType = null;\n        if ($mimeType && false !== $pos = strpos($mimeType, ';')) {\n            $canonicalMimeType = trim(substr($mimeType, 0, $pos));\n        }\n\n        if (null === static::$formats) {\n            static::initializeFormats();\n        }\n\n        foreach (static::$formats as $format => $mimeTypes) {\n            if (\\in_array($mimeType, (array) $mimeTypes)) {\n                return $format;\n            }\n            if (null !== $canonicalMimeType && \\in_array($canonicalMimeType, (array) $mimeTypes)) {\n                return $format;\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Associates a format with mime types.\n     *\n     * @param string|string[] $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type)\n     *\n     * @return void\n     */\n    public function setFormat(?string $format, string|array $mimeTypes)\n    {\n        if (null === static::$formats) {\n            static::initializeFormats();\n        }\n\n        static::$formats[$format] = \\is_array($mimeTypes) ? $mimeTypes : [$mimeTypes];\n    }\n\n    /**\n     * Gets the request format.\n     *\n     * Here is the process to determine the format:\n     *\n     *  * format defined by the user (with setRequestFormat())\n     *  * _format request attribute\n     *  * $default\n     *\n     * @see getPreferredFormat\n     */\n    public function getRequestFormat(?string $default = 'html'): ?string\n    {\n        $this->format ??= $this->attributes->get('_format');\n\n        return $this->format ?? $default;\n    }\n\n    /**\n     * Sets the request format.\n     *\n     * @return void\n     */\n    public function setRequestFormat(?string $format)\n    {\n        $this->format = $format;\n    }\n\n    /**\n     * Gets the usual name of the format associated with the request's media type (provided in the Content-Type header).\n     *\n     * @deprecated since Symfony 6.2, use getContentTypeFormat() instead\n     */\n    public function getContentType(): ?string\n    {\n        trigger_deprecation('symfony/http-foundation', '6.2', 'The \"%s()\" method is deprecated, use \"getContentTypeFormat()\" instead.', __METHOD__);\n\n        return $this->getContentTypeFormat();\n    }\n\n    /**\n     * Gets the usual name of the format associated with the request's media type (provided in the Content-Type header).\n     *\n     * @see Request::$formats\n     */\n    public function getContentTypeFormat(): ?string\n    {\n        return $this->getFormat($this->headers->get('CONTENT_TYPE', ''));\n    }\n\n    /**\n     * Sets the default locale.\n     *\n     * @return void\n     */\n    public function setDefaultLocale(string $locale)\n    {\n        $this->defaultLocale = $locale;\n\n        if (null === $this->locale) {\n            $this->setPhpDefaultLocale($locale);\n        }\n    }\n\n    /**\n     * Get the default locale.\n     */\n    public function getDefaultLocale(): string\n    {\n        return $this->defaultLocale;\n    }\n\n    /**\n     * Sets the locale.\n     *\n     * @return void\n     */\n    public function setLocale(string $locale)\n    {\n        $this->setPhpDefaultLocale($this->locale = $locale);\n    }\n\n    /**\n     * Get the locale.\n     */\n    public function getLocale(): string\n    {\n        return $this->locale ?? $this->defaultLocale;\n    }\n\n    /**\n     * Checks if the request method is of specified type.\n     *\n     * @param string $method Uppercase request method (GET, POST etc)\n     */\n    public function isMethod(string $method): bool\n    {\n        return $this->getMethod() === strtoupper($method);\n    }\n\n    /**\n     * Checks whether or not the method is safe.\n     *\n     * @see https://tools.ietf.org/html/rfc7231#section-4.2.1\n     */\n    public function isMethodSafe(): bool\n    {\n        return \\in_array($this->getMethod(), ['GET', 'HEAD', 'OPTIONS', 'TRACE']);\n    }\n\n    /**\n     * Checks whether or not the method is idempotent.\n     */\n    public function isMethodIdempotent(): bool\n    {\n        return \\in_array($this->getMethod(), ['HEAD', 'GET', 'PUT', 'DELETE', 'TRACE', 'OPTIONS', 'PURGE']);\n    }\n\n    /**\n     * Checks whether the method is cacheable or not.\n     *\n     * @see https://tools.ietf.org/html/rfc7231#section-4.2.3\n     */\n    public function isMethodCacheable(): bool\n    {\n        return \\in_array($this->getMethod(), ['GET', 'HEAD']);\n    }\n\n    /**\n     * Returns the protocol version.\n     *\n     * If the application is behind a proxy, the protocol version used in the\n     * requests between the client and the proxy and between the proxy and the\n     * server might be different. This returns the former (from the \"Via\" header)\n     * if the proxy is trusted (see \"setTrustedProxies()\"), otherwise it returns\n     * the latter (from the \"SERVER_PROTOCOL\" server parameter).\n     */\n    public function getProtocolVersion(): ?string\n    {\n        if ($this->isFromTrustedProxy()) {\n            preg_match('~^(HTTP/)?([1-9]\\.[0-9]) ~', $this->headers->get('Via') ?? '', $matches);\n\n            if ($matches) {\n                return 'HTTP/'.$matches[2];\n            }\n        }\n\n        return $this->server->get('SERVER_PROTOCOL');\n    }\n\n    /**\n     * Returns the request body content.\n     *\n     * @param bool $asResource If true, a resource will be returned\n     *\n     * @return string|resource\n     *\n     * @psalm-return ($asResource is true ? resource : string)\n     */\n    public function getContent(bool $asResource = false)\n    {\n        $currentContentIsResource = \\is_resource($this->content);\n\n        if (true === $asResource) {\n            if ($currentContentIsResource) {\n                rewind($this->content);\n\n                return $this->content;\n            }\n\n            // Content passed in parameter (test)\n            if (\\is_string($this->content)) {\n                $resource = fopen('php://temp', 'r+');\n                fwrite($resource, $this->content);\n                rewind($resource);\n\n                return $resource;\n            }\n\n            $this->content = false;\n\n            return fopen('php://input', 'r');\n        }\n\n        if ($currentContentIsResource) {\n            rewind($this->content);\n\n            return stream_get_contents($this->content);\n        }\n\n        if (null === $this->content || false === $this->content) {\n            $this->content = file_get_contents('php://input');\n        }\n\n        return $this->content;\n    }\n\n    /**\n     * Gets the decoded form or json request body.\n     *\n     * @throws JsonException When the body cannot be decoded to an array\n     */\n    public function getPayload(): InputBag\n    {\n        if ($this->request->count()) {\n            return clone $this->request;\n        }\n\n        if ('' === $content = $this->getContent()) {\n            return new InputBag([]);\n        }\n\n        try {\n            $content = json_decode($content, true, 512, \\JSON_BIGINT_AS_STRING | \\JSON_THROW_ON_ERROR);\n        } catch (\\JsonException $e) {\n            throw new JsonException('Could not decode request body.', $e->getCode(), $e);\n        }\n\n        if (!\\is_array($content)) {\n            throw new JsonException(sprintf('JSON content was expected to decode to an array, \"%s\" returned.', get_debug_type($content)));\n        }\n\n        return new InputBag($content);\n    }\n\n    /**\n     * Gets the request body decoded as array, typically from a JSON payload.\n     *\n     * @see getPayload() for portability between content types\n     *\n     * @throws JsonException When the body cannot be decoded to an array\n     */\n    public function toArray(): array\n    {\n        if ('' === $content = $this->getContent()) {\n            throw new JsonException('Request body is empty.');\n        }\n\n        try {\n            $content = json_decode($content, true, 512, \\JSON_BIGINT_AS_STRING | \\JSON_THROW_ON_ERROR);\n        } catch (\\JsonException $e) {\n            throw new JsonException('Could not decode request body.', $e->getCode(), $e);\n        }\n\n        if (!\\is_array($content)) {\n            throw new JsonException(sprintf('JSON content was expected to decode to an array, \"%s\" returned.', get_debug_type($content)));\n        }\n\n        return $content;\n    }\n\n    /**\n     * Gets the Etags.\n     */\n    public function getETags(): array\n    {\n        return preg_split('/\\s*,\\s*/', $this->headers->get('If-None-Match', ''), -1, \\PREG_SPLIT_NO_EMPTY);\n    }\n\n    public function isNoCache(): bool\n    {\n        return $this->headers->hasCacheControlDirective('no-cache') || 'no-cache' == $this->headers->get('Pragma');\n    }\n\n    /**\n     * Gets the preferred format for the response by inspecting, in the following order:\n     *   * the request format set using setRequestFormat;\n     *   * the values of the Accept HTTP header.\n     *\n     * Note that if you use this method, you should send the \"Vary: Accept\" header\n     * in the response to prevent any issues with intermediary HTTP caches.\n     */\n    public function getPreferredFormat(?string $default = 'html'): ?string\n    {\n        if ($this->preferredFormat ??= $this->getRequestFormat(null)) {\n            return $this->preferredFormat;\n        }\n\n        foreach ($this->getAcceptableContentTypes() as $mimeType) {\n            if ($this->preferredFormat = $this->getFormat($mimeType)) {\n                return $this->preferredFormat;\n            }\n        }\n\n        return $default;\n    }\n\n    /**\n     * Returns the preferred language.\n     *\n     * @param string[] $locales An array of ordered available locales\n     */\n    public function getPreferredLanguage(?array $locales = null): ?string\n    {\n        $preferredLanguages = $this->getLanguages();\n\n        if (empty($locales)) {\n            return $preferredLanguages[0] ?? null;\n        }\n\n        if (!$preferredLanguages) {\n            return $locales[0];\n        }\n\n        $extendedPreferredLanguages = [];\n        foreach ($preferredLanguages as $language) {\n            $extendedPreferredLanguages[] = $language;\n            if (false !== $position = strpos($language, '_')) {\n                $superLanguage = substr($language, 0, $position);\n                if (!\\in_array($superLanguage, $preferredLanguages)) {\n                    $extendedPreferredLanguages[] = $superLanguage;\n                }\n            }\n        }\n\n        $preferredLanguages = array_values(array_intersect($extendedPreferredLanguages, $locales));\n\n        return $preferredLanguages[0] ?? $locales[0];\n    }\n\n    /**\n     * Gets a list of languages acceptable by the client browser ordered in the user browser preferences.\n     *\n     * @return string[]\n     */\n    public function getLanguages(): array\n    {\n        if (null !== $this->languages) {\n            return $this->languages;\n        }\n\n        $languages = AcceptHeader::fromString($this->headers->get('Accept-Language'))->all();\n        $this->languages = [];\n        foreach ($languages as $acceptHeaderItem) {\n            $lang = $acceptHeaderItem->getValue();\n            if (str_contains($lang, '-')) {\n                $codes = explode('-', $lang);\n                if ('i' === $codes[0]) {\n                    // Language not listed in ISO 639 that are not variants\n                    // of any listed language, which can be registered with the\n                    // i-prefix, such as i-cherokee\n                    if (\\count($codes) > 1) {\n                        $lang = $codes[1];\n                    }\n                } else {\n                    for ($i = 0, $max = \\count($codes); $i < $max; ++$i) {\n                        if (0 === $i) {\n                            $lang = strtolower($codes[0]);\n                        } else {\n                            $lang .= '_'.strtoupper($codes[$i]);\n                        }\n                    }\n                }\n            }\n\n            $this->languages[] = $lang;\n        }\n\n        return $this->languages;\n    }\n\n    /**\n     * Gets a list of charsets acceptable by the client browser in preferable order.\n     *\n     * @return string[]\n     */\n    public function getCharsets(): array\n    {\n        return $this->charsets ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept-Charset'))->all()));\n    }\n\n    /**\n     * Gets a list of encodings acceptable by the client browser in preferable order.\n     *\n     * @return string[]\n     */\n    public function getEncodings(): array\n    {\n        return $this->encodings ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept-Encoding'))->all()));\n    }\n\n    /**\n     * Gets a list of content types acceptable by the client browser in preferable order.\n     *\n     * @return string[]\n     */\n    public function getAcceptableContentTypes(): array\n    {\n        return $this->acceptableContentTypes ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept'))->all()));\n    }\n\n    /**\n     * Returns true if the request is an XMLHttpRequest.\n     *\n     * It works if your JavaScript library sets an X-Requested-With HTTP header.\n     * It is known to work with common JavaScript frameworks:\n     *\n     * @see https://wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript\n     */\n    public function isXmlHttpRequest(): bool\n    {\n        return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');\n    }\n\n    /**\n     * Checks whether the client browser prefers safe content or not according to RFC8674.\n     *\n     * @see https://tools.ietf.org/html/rfc8674\n     */\n    public function preferSafeContent(): bool\n    {\n        if (isset($this->isSafeContentPreferred)) {\n            return $this->isSafeContentPreferred;\n        }\n\n        if (!$this->isSecure()) {\n            // see https://tools.ietf.org/html/rfc8674#section-3\n            return $this->isSafeContentPreferred = false;\n        }\n\n        return $this->isSafeContentPreferred = AcceptHeader::fromString($this->headers->get('Prefer'))->has('safe');\n    }\n\n    /*\n     * The following methods are derived from code of the Zend Framework (1.10dev - 2010-01-24)\n     *\n     * Code subject to the new BSD license (https://framework.zend.com/license).\n     *\n     * Copyright (c) 2005-2010 Zend Technologies USA Inc. (https://www.zend.com/)\n     */\n\n    /**\n     * @return string\n     */\n    protected function prepareRequestUri()\n    {\n        $requestUri = '';\n\n        if ($this->isIisRewrite() && '' != $this->server->get('UNENCODED_URL')) {\n            // IIS7 with URL Rewrite: make sure we get the unencoded URL (double slash problem)\n            $requestUri = $this->server->get('UNENCODED_URL');\n            $this->server->remove('UNENCODED_URL');\n        } elseif ($this->server->has('REQUEST_URI')) {\n            $requestUri = $this->server->get('REQUEST_URI');\n\n            if ('' !== $requestUri && '/' === $requestUri[0]) {\n                // To only use path and query remove the fragment.\n                if (false !== $pos = strpos($requestUri, '#')) {\n                    $requestUri = substr($requestUri, 0, $pos);\n                }\n            } else {\n                // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path,\n                // only use URL path.\n                $uriComponents = parse_url($requestUri);\n\n                if (isset($uriComponents['path'])) {\n                    $requestUri = $uriComponents['path'];\n                }\n\n                if (isset($uriComponents['query'])) {\n                    $requestUri .= '?'.$uriComponents['query'];\n                }\n            }\n        } elseif ($this->server->has('ORIG_PATH_INFO')) {\n            // IIS 5.0, PHP as CGI\n            $requestUri = $this->server->get('ORIG_PATH_INFO');\n            if ('' != $this->server->get('QUERY_STRING')) {\n                $requestUri .= '?'.$this->server->get('QUERY_STRING');\n            }\n            $this->server->remove('ORIG_PATH_INFO');\n        }\n\n        // normalize the request URI to ease creating sub-requests from this request\n        $this->server->set('REQUEST_URI', $requestUri);\n\n        return $requestUri;\n    }\n\n    /**\n     * Prepares the base URL.\n     */\n    protected function prepareBaseUrl(): string\n    {\n        $filename = basename($this->server->get('SCRIPT_FILENAME', ''));\n\n        if (basename($this->server->get('SCRIPT_NAME', '')) === $filename) {\n            $baseUrl = $this->server->get('SCRIPT_NAME');\n        } elseif (basename($this->server->get('PHP_SELF', '')) === $filename) {\n            $baseUrl = $this->server->get('PHP_SELF');\n        } elseif (basename($this->server->get('ORIG_SCRIPT_NAME', '')) === $filename) {\n            $baseUrl = $this->server->get('ORIG_SCRIPT_NAME'); // 1and1 shared hosting compatibility\n        } else {\n            // Backtrack up the script_filename to find the portion matching\n            // php_self\n            $path = $this->server->get('PHP_SELF', '');\n            $file = $this->server->get('SCRIPT_FILENAME', '');\n            $segs = explode('/', trim($file, '/'));\n            $segs = array_reverse($segs);\n            $index = 0;\n            $last = \\count($segs);\n            $baseUrl = '';\n            do {\n                $seg = $segs[$index];\n                $baseUrl = '/'.$seg.$baseUrl;\n                ++$index;\n            } while ($last > $index && (false !== $pos = strpos($path, $baseUrl)) && 0 != $pos);\n        }\n\n        // Does the baseUrl have anything in common with the request_uri?\n        $requestUri = $this->getRequestUri();\n        if ('' !== $requestUri && '/' !== $requestUri[0]) {\n            $requestUri = '/'.$requestUri;\n        }\n\n        if ($baseUrl && null !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) {\n            // full $baseUrl matches\n            return $prefix;\n        }\n\n        if ($baseUrl && null !== $prefix = $this->getUrlencodedPrefix($requestUri, rtrim(\\dirname($baseUrl), '/'.\\DIRECTORY_SEPARATOR).'/')) {\n            // directory portion of $baseUrl matches\n            return rtrim($prefix, '/'.\\DIRECTORY_SEPARATOR);\n        }\n\n        $truncatedRequestUri = $requestUri;\n        if (false !== $pos = strpos($requestUri, '?')) {\n            $truncatedRequestUri = substr($requestUri, 0, $pos);\n        }\n\n        $basename = basename($baseUrl ?? '');\n        if (empty($basename) || !strpos(rawurldecode($truncatedRequestUri), $basename)) {\n            // no match whatsoever; set it blank\n            return '';\n        }\n\n        // If using mod_rewrite or ISAPI_Rewrite strip the script filename\n        // out of baseUrl. $pos !== 0 makes sure it is not matching a value\n        // from PATH_INFO or QUERY_STRING\n        if (\\strlen($requestUri) >= \\strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && 0 !== $pos) {\n            $baseUrl = substr($requestUri, 0, $pos + \\strlen($baseUrl));\n        }\n\n        return rtrim($baseUrl, '/'.\\DIRECTORY_SEPARATOR);\n    }\n\n    /**\n     * Prepares the base path.\n     */\n    protected function prepareBasePath(): string\n    {\n        $baseUrl = $this->getBaseUrl();\n        if (empty($baseUrl)) {\n            return '';\n        }\n\n        $filename = basename($this->server->get('SCRIPT_FILENAME'));\n        if (basename($baseUrl) === $filename) {\n            $basePath = \\dirname($baseUrl);\n        } else {\n            $basePath = $baseUrl;\n        }\n\n        if ('\\\\' === \\DIRECTORY_SEPARATOR) {\n            $basePath = str_replace('\\\\', '/', $basePath);\n        }\n\n        return rtrim($basePath, '/');\n    }\n\n    /**\n     * Prepares the path info.\n     */\n    protected function preparePathInfo(): string\n    {\n        if (null === ($requestUri = $this->getRequestUri())) {\n            return '/';\n        }\n\n        // Remove the query string from REQUEST_URI\n        if (false !== $pos = strpos($requestUri, '?')) {\n            $requestUri = substr($requestUri, 0, $pos);\n        }\n        if ('' !== $requestUri && '/' !== $requestUri[0]) {\n            $requestUri = '/'.$requestUri;\n        }\n\n        if (null === ($baseUrl = $this->getBaseUrlReal())) {\n            return $requestUri;\n        }\n\n        $pathInfo = substr($requestUri, \\strlen($baseUrl));\n        if (false === $pathInfo || '' === $pathInfo) {\n            // If substr() returns false then PATH_INFO is set to an empty string\n            return '/';\n        }\n\n        return $pathInfo;\n    }\n\n    /**\n     * Initializes HTTP request formats.\n     *\n     * @return void\n     */\n    protected static function initializeFormats()\n    {\n        static::$formats = [\n            'html' => ['text/html', 'application/xhtml+xml'],\n            'txt' => ['text/plain'],\n            'js' => ['application/javascript', 'application/x-javascript', 'text/javascript'],\n            'css' => ['text/css'],\n            'json' => ['application/json', 'application/x-json'],\n            'jsonld' => ['application/ld+json'],\n            'xml' => ['text/xml', 'application/xml', 'application/x-xml'],\n            'rdf' => ['application/rdf+xml'],\n            'atom' => ['application/atom+xml'],\n            'rss' => ['application/rss+xml'],\n            'form' => ['application/x-www-form-urlencoded', 'multipart/form-data'],\n        ];\n    }\n\n    private function setPhpDefaultLocale(string $locale): void\n    {\n        // if either the class Locale doesn't exist, or an exception is thrown when\n        // setting the default locale, the intl module is not installed, and\n        // the call can be ignored:\n        try {\n            if (class_exists(\\Locale::class, false)) {\n                \\Locale::setDefault($locale);\n            }\n        } catch (\\Exception) {\n        }\n    }\n\n    /**\n     * Returns the prefix as encoded in the string when the string starts with\n     * the given prefix, null otherwise.\n     */\n    private function getUrlencodedPrefix(string $string, string $prefix): ?string\n    {\n        if ($this->isIisRewrite()) {\n            // ISS with UrlRewriteModule might report SCRIPT_NAME/PHP_SELF with wrong case\n            // see https://github.com/php/php-src/issues/11981\n            if (0 !== stripos(rawurldecode($string), $prefix)) {\n                return null;\n            }\n        } elseif (!str_starts_with(rawurldecode($string), $prefix)) {\n            return null;\n        }\n\n        $len = \\strlen($prefix);\n\n        if (preg_match(sprintf('#^(%%[[:xdigit:]]{2}|.){%d}#', $len), $string, $match)) {\n            return $match[0];\n        }\n\n        return null;\n    }\n\n    private static function createRequestFromFactory(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): static\n    {\n        if (self::$requestFactory) {\n            $request = (self::$requestFactory)($query, $request, $attributes, $cookies, $files, $server, $content);\n\n            if (!$request instanceof self) {\n                throw new \\LogicException('The Request factory must return an instance of Symfony\\Component\\HttpFoundation\\Request.');\n            }\n\n            return $request;\n        }\n\n        return new static($query, $request, $attributes, $cookies, $files, $server, $content);\n    }\n\n    /**\n     * Indicates whether this request originated from a trusted proxy.\n     *\n     * This can be useful to determine whether or not to trust the\n     * contents of a proxy-specific header.\n     */\n    public function isFromTrustedProxy(): bool\n    {\n        return self::$trustedProxies && IpUtils::checkIp($this->server->get('REMOTE_ADDR', ''), self::$trustedProxies);\n    }\n\n    /**\n     * This method is rather heavy because it splits and merges headers, and it's called by many other methods such as\n     * getPort(), isSecure(), getHost(), getClientIps(), getBaseUrl() etc. Thus, we try to cache the results for\n     * best performance.\n     */\n    private function getTrustedValues(int $type, ?string $ip = null): array\n    {\n        $cacheKey = $type.\"\\0\".((self::$trustedHeaderSet & $type) ? $this->headers->get(self::TRUSTED_HEADERS[$type]) : '');\n        $cacheKey .= \"\\0\".$ip.\"\\0\".$this->headers->get(self::TRUSTED_HEADERS[self::HEADER_FORWARDED]);\n\n        if (isset($this->trustedValuesCache[$cacheKey])) {\n            return $this->trustedValuesCache[$cacheKey];\n        }\n\n        $clientValues = [];\n        $forwardedValues = [];\n\n        if ((self::$trustedHeaderSet & $type) && $this->headers->has(self::TRUSTED_HEADERS[$type])) {\n            foreach (explode(',', $this->headers->get(self::TRUSTED_HEADERS[$type])) as $v) {\n                $clientValues[] = (self::HEADER_X_FORWARDED_PORT === $type ? '0.0.0.0:' : '').trim($v);\n            }\n        }\n\n        if ((self::$trustedHeaderSet & self::HEADER_FORWARDED) && (isset(self::FORWARDED_PARAMS[$type])) && $this->headers->has(self::TRUSTED_HEADERS[self::HEADER_FORWARDED])) {\n            $forwarded = $this->headers->get(self::TRUSTED_HEADERS[self::HEADER_FORWARDED]);\n            $parts = HeaderUtils::split($forwarded, ',;=');\n            $param = self::FORWARDED_PARAMS[$type];\n            foreach ($parts as $subParts) {\n                if (null === $v = HeaderUtils::combine($subParts)[$param] ?? null) {\n                    continue;\n                }\n                if (self::HEADER_X_FORWARDED_PORT === $type) {\n                    if (str_ends_with($v, ']') || false === $v = strrchr($v, ':')) {\n                        $v = $this->isSecure() ? ':443' : ':80';\n                    }\n                    $v = '0.0.0.0'.$v;\n                }\n                $forwardedValues[] = $v;\n            }\n        }\n\n        if (null !== $ip) {\n            $clientValues = $this->normalizeAndFilterClientIps($clientValues, $ip);\n            $forwardedValues = $this->normalizeAndFilterClientIps($forwardedValues, $ip);\n        }\n\n        if ($forwardedValues === $clientValues || !$clientValues) {\n            return $this->trustedValuesCache[$cacheKey] = $forwardedValues;\n        }\n\n        if (!$forwardedValues) {\n            return $this->trustedValuesCache[$cacheKey] = $clientValues;\n        }\n\n        if (!$this->isForwardedValid) {\n            return $this->trustedValuesCache[$cacheKey] = null !== $ip ? ['0.0.0.0', $ip] : [];\n        }\n        $this->isForwardedValid = false;\n\n        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]));\n    }\n\n    private function normalizeAndFilterClientIps(array $clientIps, string $ip): array\n    {\n        if (!$clientIps) {\n            return [];\n        }\n        $clientIps[] = $ip; // Complete the IP chain with the IP the request actually came from\n        $firstTrustedIp = null;\n\n        foreach ($clientIps as $key => $clientIp) {\n            if (strpos($clientIp, '.')) {\n                // Strip :port from IPv4 addresses. This is allowed in Forwarded\n                // and may occur in X-Forwarded-For.\n                $i = strpos($clientIp, ':');\n                if ($i) {\n                    $clientIps[$key] = $clientIp = substr($clientIp, 0, $i);\n                }\n            } elseif (str_starts_with($clientIp, '[')) {\n                // Strip brackets and :port from IPv6 addresses.\n                $i = strpos($clientIp, ']', 1);\n                $clientIps[$key] = $clientIp = substr($clientIp, 1, $i - 1);\n            }\n\n            if (!filter_var($clientIp, \\FILTER_VALIDATE_IP)) {\n                unset($clientIps[$key]);\n\n                continue;\n            }\n\n            if (IpUtils::checkIp($clientIp, self::$trustedProxies)) {\n                unset($clientIps[$key]);\n\n                // Fallback to this when the client IP falls into the range of trusted proxies\n                $firstTrustedIp ??= $clientIp;\n            }\n        }\n\n        // Now the IP chain contains only untrusted proxies and the client IP\n        return $clientIps ? array_reverse($clientIps) : [$firstTrustedIp];\n    }\n\n    /**\n     * Is this IIS with UrlRewriteModule?\n     *\n     * This method consumes, caches and removed the IIS_WasUrlRewritten env var,\n     * so we don't inherit it to sub-requests.\n     */\n    private function isIisRewrite(): bool\n    {\n        if (1 === $this->server->getInt('IIS_WasUrlRewritten')) {\n            $this->isIisRewrite = true;\n            $this->server->remove('IIS_WasUrlRewritten');\n        }\n\n        return $this->isIisRewrite;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RequestMatcher;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\RequestMatcherInterface;\n\n/**\n * Checks the Request attributes matches all regular expressions.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass AttributesRequestMatcher implements RequestMatcherInterface\n{\n    /**\n     * @param array<string, string> $regexps\n     */\n    public function __construct(private array $regexps)\n    {\n    }\n\n    public function matches(Request $request): bool\n    {\n        foreach ($this->regexps as $key => $regexp) {\n            $attribute = $request->attributes->get($key);\n            if (!\\is_string($attribute)) {\n                return false;\n            }\n            if (!preg_match('{'.$regexp.'}', $attribute)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RequestMatcher;\n\nuse Symfony\\Component\\ExpressionLanguage\\Expression;\nuse Symfony\\Component\\ExpressionLanguage\\ExpressionLanguage;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\RequestMatcherInterface;\n\n/**\n * ExpressionRequestMatcher uses an expression to match a Request.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass ExpressionRequestMatcher implements RequestMatcherInterface\n{\n    public function __construct(\n        private ExpressionLanguage $language,\n        private Expression|string $expression,\n    ) {\n    }\n\n    public function matches(Request $request): bool\n    {\n        return $this->language->evaluate($this->expression, [\n            'request' => $request,\n            'method' => $request->getMethod(),\n            'path' => rawurldecode($request->getPathInfo()),\n            'host' => $request->getHost(),\n            'ip' => $request->getClientIp(),\n            'attributes' => $request->attributes->all(),\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/HostRequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RequestMatcher;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\RequestMatcherInterface;\n\n/**\n * Checks the Request URL host name matches a regular expression.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass HostRequestMatcher implements RequestMatcherInterface\n{\n    public function __construct(private string $regexp)\n    {\n    }\n\n    public function matches(Request $request): bool\n    {\n        return preg_match('{'.$this->regexp.'}i', $request->getHost());\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RequestMatcher;\n\nuse Symfony\\Component\\HttpFoundation\\IpUtils;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\RequestMatcherInterface;\n\n/**\n * Checks the client IP of a Request.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass IpsRequestMatcher implements RequestMatcherInterface\n{\n    private array $ips;\n\n    /**\n     * @param string[]|string $ips A specific IP address or a range specified using IP/netmask like 192.168.1.0/24\n     *                             Strings can contain a comma-delimited list of IPs/ranges\n     */\n    public function __construct(array|string $ips)\n    {\n        $this->ips = array_reduce((array) $ips, static fn (array $ips, string $ip) => array_merge($ips, preg_split('/\\s*,\\s*/', $ip)), []);\n    }\n\n    public function matches(Request $request): bool\n    {\n        if (!$this->ips) {\n            return true;\n        }\n\n        return IpUtils::checkIp($request->getClientIp() ?? '', $this->ips);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RequestMatcher;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\RequestMatcherInterface;\n\n/**\n * Checks the Request content is valid JSON.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass IsJsonRequestMatcher implements RequestMatcherInterface\n{\n    public function matches(Request $request): bool\n    {\n        return json_validate($request->getContent());\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RequestMatcher;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\RequestMatcherInterface;\n\n/**\n * Checks the HTTP method of a Request.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass MethodRequestMatcher implements RequestMatcherInterface\n{\n    /**\n     * @var string[]\n     */\n    private array $methods = [];\n\n    /**\n     * @param string[]|string $methods An HTTP method or an array of HTTP methods\n     *                                 Strings can contain a comma-delimited list of methods\n     */\n    public function __construct(array|string $methods)\n    {\n        $this->methods = array_reduce(array_map('strtoupper', (array) $methods), static fn (array $methods, string $method) => array_merge($methods, preg_split('/\\s*,\\s*/', $method)), []);\n    }\n\n    public function matches(Request $request): bool\n    {\n        if (!$this->methods) {\n            return true;\n        }\n\n        return \\in_array($request->getMethod(), $this->methods, true);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/PathRequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RequestMatcher;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\RequestMatcherInterface;\n\n/**\n * Checks the Request URL path info matches a regular expression.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass PathRequestMatcher implements RequestMatcherInterface\n{\n    public function __construct(private string $regexp)\n    {\n    }\n\n    public function matches(Request $request): bool\n    {\n        return preg_match('{'.$this->regexp.'}', rawurldecode($request->getPathInfo()));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/PortRequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RequestMatcher;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\RequestMatcherInterface;\n\n/**\n * Checks the HTTP port of a Request.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass PortRequestMatcher implements RequestMatcherInterface\n{\n    public function __construct(private int $port)\n    {\n    }\n\n    public function matches(Request $request): bool\n    {\n        return $request->getPort() === $this->port;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\RequestMatcher;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\RequestMatcherInterface;\n\n/**\n * Checks the HTTP scheme of a Request.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass SchemeRequestMatcher implements RequestMatcherInterface\n{\n    /**\n     * @var string[]\n     */\n    private array $schemes;\n\n    /**\n     * @param string[]|string $schemes A scheme or a list of schemes\n     *                                 Strings can contain a comma-delimited list of schemes\n     */\n    public function __construct(array|string $schemes)\n    {\n        $this->schemes = array_reduce(array_map('strtolower', (array) $schemes), static fn (array $schemes, string $scheme) => array_merge($schemes, preg_split('/\\s*,\\s*/', $scheme)), []);\n    }\n\n    public function matches(Request $request): bool\n    {\n        if (!$this->schemes) {\n            return true;\n        }\n\n        return \\in_array($request->getScheme(), $this->schemes, true);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\ntrigger_deprecation('symfony/http-foundation', '6.2', 'The \"%s\" class is deprecated, use \"%s\" instead.', RequestMatcher::class, ChainRequestMatcher::class);\n\n/**\n * RequestMatcher compares a pre-defined set of checks against a Request instance.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @deprecated since Symfony 6.2, use ChainRequestMatcher instead\n */\nclass RequestMatcher implements RequestMatcherInterface\n{\n    private ?string $path = null;\n    private ?string $host = null;\n    private ?int $port = null;\n\n    /**\n     * @var string[]\n     */\n    private array $methods = [];\n\n    /**\n     * @var string[]\n     */\n    private array $ips = [];\n\n    /**\n     * @var string[]\n     */\n    private array $attributes = [];\n\n    /**\n     * @var string[]\n     */\n    private array $schemes = [];\n\n    /**\n     * @param string|string[]|null $methods\n     * @param string|string[]|null $ips\n     * @param string|string[]|null $schemes\n     */\n    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)\n    {\n        $this->matchPath($path);\n        $this->matchHost($host);\n        $this->matchMethod($methods);\n        $this->matchIps($ips);\n        $this->matchScheme($schemes);\n        $this->matchPort($port);\n\n        foreach ($attributes as $k => $v) {\n            $this->matchAttribute($k, $v);\n        }\n    }\n\n    /**\n     * Adds a check for the HTTP scheme.\n     *\n     * @param string|string[]|null $scheme An HTTP scheme or an array of HTTP schemes\n     *\n     * @return void\n     */\n    public function matchScheme(string|array|null $scheme)\n    {\n        $this->schemes = null !== $scheme ? array_map('strtolower', (array) $scheme) : [];\n    }\n\n    /**\n     * Adds a check for the URL host name.\n     *\n     * @return void\n     */\n    public function matchHost(?string $regexp)\n    {\n        $this->host = $regexp;\n    }\n\n    /**\n     * Adds a check for the URL port.\n     *\n     * @param int|null $port The port number to connect to\n     *\n     * @return void\n     */\n    public function matchPort(?int $port)\n    {\n        $this->port = $port;\n    }\n\n    /**\n     * Adds a check for the URL path info.\n     *\n     * @return void\n     */\n    public function matchPath(?string $regexp)\n    {\n        $this->path = $regexp;\n    }\n\n    /**\n     * Adds a check for the client IP.\n     *\n     * @param string $ip A specific IP address or a range specified using IP/netmask like 192.168.1.0/24\n     *\n     * @return void\n     */\n    public function matchIp(string $ip)\n    {\n        $this->matchIps($ip);\n    }\n\n    /**\n     * Adds a check for the client IP.\n     *\n     * @param string|string[]|null $ips A specific IP address or a range specified using IP/netmask like 192.168.1.0/24\n     *\n     * @return void\n     */\n    public function matchIps(string|array|null $ips)\n    {\n        $ips = null !== $ips ? (array) $ips : [];\n\n        $this->ips = array_reduce($ips, static fn (array $ips, string $ip) => array_merge($ips, preg_split('/\\s*,\\s*/', $ip)), []);\n    }\n\n    /**\n     * Adds a check for the HTTP method.\n     *\n     * @param string|string[]|null $method An HTTP method or an array of HTTP methods\n     *\n     * @return void\n     */\n    public function matchMethod(string|array|null $method)\n    {\n        $this->methods = null !== $method ? array_map('strtoupper', (array) $method) : [];\n    }\n\n    /**\n     * Adds a check for request attribute.\n     *\n     * @return void\n     */\n    public function matchAttribute(string $key, string $regexp)\n    {\n        $this->attributes[$key] = $regexp;\n    }\n\n    public function matches(Request $request): bool\n    {\n        if ($this->schemes && !\\in_array($request->getScheme(), $this->schemes, true)) {\n            return false;\n        }\n\n        if ($this->methods && !\\in_array($request->getMethod(), $this->methods, true)) {\n            return false;\n        }\n\n        foreach ($this->attributes as $key => $pattern) {\n            $requestAttribute = $request->attributes->get($key);\n            if (!\\is_string($requestAttribute)) {\n                return false;\n            }\n            if (!preg_match('{'.$pattern.'}', $requestAttribute)) {\n                return false;\n            }\n        }\n\n        if (null !== $this->path && !preg_match('{'.$this->path.'}', rawurldecode($request->getPathInfo()))) {\n            return false;\n        }\n\n        if (null !== $this->host && !preg_match('{'.$this->host.'}i', $request->getHost())) {\n            return false;\n        }\n\n        if (null !== $this->port && 0 < $this->port && $request->getPort() !== $this->port) {\n            return false;\n        }\n\n        if (IpUtils::checkIp($request->getClientIp() ?? '', $this->ips)) {\n            return true;\n        }\n\n        // Note to future implementors: add additional checks above the\n        // foreach above or else your check might not be run!\n        return 0 === \\count($this->ips);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcherInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * RequestMatcherInterface is an interface for strategies to match a Request.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\ninterface RequestMatcherInterface\n{\n    /**\n     * Decides whether the rule(s) implemented by the strategy matches the supplied request.\n     */\n    public function matches(Request $request): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/RequestStack.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\nuse Symfony\\Component\\HttpFoundation\\Exception\\SessionNotFoundException;\nuse Symfony\\Component\\HttpFoundation\\Session\\SessionInterface;\n\n/**\n * Request stack that controls the lifecycle of requests.\n *\n * @author Benjamin Eberlei <kontakt@beberlei.de>\n */\nclass RequestStack\n{\n    /**\n     * @var Request[]\n     */\n    private array $requests = [];\n\n    /**\n     * Pushes a Request on the stack.\n     *\n     * This method should generally not be called directly as the stack\n     * management should be taken care of by the application itself.\n     *\n     * @return void\n     */\n    public function push(Request $request)\n    {\n        $this->requests[] = $request;\n    }\n\n    /**\n     * Pops the current request from the stack.\n     *\n     * This operation lets the current request go out of scope.\n     *\n     * This method should generally not be called directly as the stack\n     * management should be taken care of by the application itself.\n     */\n    public function pop(): ?Request\n    {\n        if (!$this->requests) {\n            return null;\n        }\n\n        return array_pop($this->requests);\n    }\n\n    public function getCurrentRequest(): ?Request\n    {\n        return end($this->requests) ?: null;\n    }\n\n    /**\n     * Gets the main request.\n     *\n     * Be warned that making your code aware of the main request\n     * might make it un-compatible with other features of your framework\n     * like ESI support.\n     */\n    public function getMainRequest(): ?Request\n    {\n        if (!$this->requests) {\n            return null;\n        }\n\n        return $this->requests[0];\n    }\n\n    /**\n     * Returns the parent request of the current.\n     *\n     * Be warned that making your code aware of the parent request\n     * might make it un-compatible with other features of your framework\n     * like ESI support.\n     *\n     * If current Request is the main request, it returns null.\n     */\n    public function getParentRequest(): ?Request\n    {\n        $pos = \\count($this->requests) - 2;\n\n        return $this->requests[$pos] ?? null;\n    }\n\n    /**\n     * Gets the current session.\n     *\n     * @throws SessionNotFoundException\n     */\n    public function getSession(): SessionInterface\n    {\n        if ((null !== $request = end($this->requests) ?: null) && $request->hasSession()) {\n            return $request->getSession();\n        }\n\n        throw new SessionNotFoundException();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Response.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(ResponseHeaderBag::class);\n\n/**\n * Response represents an HTTP response.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass Response\n{\n    public const HTTP_CONTINUE = 100;\n    public const HTTP_SWITCHING_PROTOCOLS = 101;\n    public const HTTP_PROCESSING = 102;            // RFC2518\n    public const HTTP_EARLY_HINTS = 103;           // RFC8297\n    public const HTTP_OK = 200;\n    public const HTTP_CREATED = 201;\n    public const HTTP_ACCEPTED = 202;\n    public const HTTP_NON_AUTHORITATIVE_INFORMATION = 203;\n    public const HTTP_NO_CONTENT = 204;\n    public const HTTP_RESET_CONTENT = 205;\n    public const HTTP_PARTIAL_CONTENT = 206;\n    public const HTTP_MULTI_STATUS = 207;          // RFC4918\n    public const HTTP_ALREADY_REPORTED = 208;      // RFC5842\n    public const HTTP_IM_USED = 226;               // RFC3229\n    public const HTTP_MULTIPLE_CHOICES = 300;\n    public const HTTP_MOVED_PERMANENTLY = 301;\n    public const HTTP_FOUND = 302;\n    public const HTTP_SEE_OTHER = 303;\n    public const HTTP_NOT_MODIFIED = 304;\n    public const HTTP_USE_PROXY = 305;\n    public const HTTP_RESERVED = 306;\n    public const HTTP_TEMPORARY_REDIRECT = 307;\n    public const HTTP_PERMANENTLY_REDIRECT = 308;  // RFC7238\n    public const HTTP_BAD_REQUEST = 400;\n    public const HTTP_UNAUTHORIZED = 401;\n    public const HTTP_PAYMENT_REQUIRED = 402;\n    public const HTTP_FORBIDDEN = 403;\n    public const HTTP_NOT_FOUND = 404;\n    public const HTTP_METHOD_NOT_ALLOWED = 405;\n    public const HTTP_NOT_ACCEPTABLE = 406;\n    public const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407;\n    public const HTTP_REQUEST_TIMEOUT = 408;\n    public const HTTP_CONFLICT = 409;\n    public const HTTP_GONE = 410;\n    public const HTTP_LENGTH_REQUIRED = 411;\n    public const HTTP_PRECONDITION_FAILED = 412;\n    public const HTTP_REQUEST_ENTITY_TOO_LARGE = 413;\n    public const HTTP_REQUEST_URI_TOO_LONG = 414;\n    public const HTTP_UNSUPPORTED_MEDIA_TYPE = 415;\n    public const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;\n    public const HTTP_EXPECTATION_FAILED = 417;\n    public const HTTP_I_AM_A_TEAPOT = 418;                                               // RFC2324\n    public const HTTP_MISDIRECTED_REQUEST = 421;                                         // RFC7540\n    public const HTTP_UNPROCESSABLE_ENTITY = 422;                                        // RFC4918\n    public const HTTP_LOCKED = 423;                                                      // RFC4918\n    public const HTTP_FAILED_DEPENDENCY = 424;                                           // RFC4918\n    public const HTTP_TOO_EARLY = 425;                                                   // RFC-ietf-httpbis-replay-04\n    public const HTTP_UPGRADE_REQUIRED = 426;                                            // RFC2817\n    public const HTTP_PRECONDITION_REQUIRED = 428;                                       // RFC6585\n    public const HTTP_TOO_MANY_REQUESTS = 429;                                           // RFC6585\n    public const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431;                             // RFC6585\n    public const HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451;                               // RFC7725\n    public const HTTP_INTERNAL_SERVER_ERROR = 500;\n    public const HTTP_NOT_IMPLEMENTED = 501;\n    public const HTTP_BAD_GATEWAY = 502;\n    public const HTTP_SERVICE_UNAVAILABLE = 503;\n    public const HTTP_GATEWAY_TIMEOUT = 504;\n    public const HTTP_VERSION_NOT_SUPPORTED = 505;\n    public const HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506;                        // RFC2295\n    public const HTTP_INSUFFICIENT_STORAGE = 507;                                        // RFC4918\n    public const HTTP_LOOP_DETECTED = 508;                                               // RFC5842\n    public const HTTP_NOT_EXTENDED = 510;                                                // RFC2774\n    public const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511;                             // RFC6585\n\n    /**\n     * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control\n     */\n    private const HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES = [\n        'must_revalidate' => false,\n        'no_cache' => false,\n        'no_store' => false,\n        'no_transform' => false,\n        'public' => false,\n        'private' => false,\n        'proxy_revalidate' => false,\n        'max_age' => true,\n        's_maxage' => true,\n        'stale_if_error' => true,         // RFC5861\n        'stale_while_revalidate' => true, // RFC5861\n        'immutable' => false,\n        'last_modified' => true,\n        'etag' => true,\n    ];\n\n    /**\n     * @var ResponseHeaderBag\n     */\n    public $headers;\n\n    /**\n     * @var string\n     */\n    protected $content;\n\n    /**\n     * @var string\n     */\n    protected $version;\n\n    /**\n     * @var int\n     */\n    protected $statusCode;\n\n    /**\n     * @var string\n     */\n    protected $statusText;\n\n    /**\n     * @var string\n     */\n    protected $charset;\n\n    /**\n     * Status codes translation table.\n     *\n     * The list of codes is complete according to the\n     * {@link https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml Hypertext Transfer Protocol (HTTP) Status Code Registry}\n     * (last updated 2021-10-01).\n     *\n     * Unless otherwise noted, the status code is defined in RFC2616.\n     *\n     * @var array\n     */\n    public static $statusTexts = [\n        100 => 'Continue',\n        101 => 'Switching Protocols',\n        102 => 'Processing',            // RFC2518\n        103 => 'Early Hints',\n        200 => 'OK',\n        201 => 'Created',\n        202 => 'Accepted',\n        203 => 'Non-Authoritative Information',\n        204 => 'No Content',\n        205 => 'Reset Content',\n        206 => 'Partial Content',\n        207 => 'Multi-Status',          // RFC4918\n        208 => 'Already Reported',      // RFC5842\n        226 => 'IM Used',               // RFC3229\n        300 => 'Multiple Choices',\n        301 => 'Moved Permanently',\n        302 => 'Found',\n        303 => 'See Other',\n        304 => 'Not Modified',\n        305 => 'Use Proxy',\n        307 => 'Temporary Redirect',\n        308 => 'Permanent Redirect',    // RFC7238\n        400 => 'Bad Request',\n        401 => 'Unauthorized',\n        402 => 'Payment Required',\n        403 => 'Forbidden',\n        404 => 'Not Found',\n        405 => 'Method Not Allowed',\n        406 => 'Not Acceptable',\n        407 => 'Proxy Authentication Required',\n        408 => 'Request Timeout',\n        409 => 'Conflict',\n        410 => 'Gone',\n        411 => 'Length Required',\n        412 => 'Precondition Failed',\n        413 => 'Content Too Large',                                           // RFC-ietf-httpbis-semantics\n        414 => 'URI Too Long',\n        415 => 'Unsupported Media Type',\n        416 => 'Range Not Satisfiable',\n        417 => 'Expectation Failed',\n        418 => 'I\\'m a teapot',                                               // RFC2324\n        421 => 'Misdirected Request',                                         // RFC7540\n        422 => 'Unprocessable Content',                                       // RFC-ietf-httpbis-semantics\n        423 => 'Locked',                                                      // RFC4918\n        424 => 'Failed Dependency',                                           // RFC4918\n        425 => 'Too Early',                                                   // RFC-ietf-httpbis-replay-04\n        426 => 'Upgrade Required',                                            // RFC2817\n        428 => 'Precondition Required',                                       // RFC6585\n        429 => 'Too Many Requests',                                           // RFC6585\n        431 => 'Request Header Fields Too Large',                             // RFC6585\n        451 => 'Unavailable For Legal Reasons',                               // RFC7725\n        500 => 'Internal Server Error',\n        501 => 'Not Implemented',\n        502 => 'Bad Gateway',\n        503 => 'Service Unavailable',\n        504 => 'Gateway Timeout',\n        505 => 'HTTP Version Not Supported',\n        506 => 'Variant Also Negotiates',                                     // RFC2295\n        507 => 'Insufficient Storage',                                        // RFC4918\n        508 => 'Loop Detected',                                               // RFC5842\n        510 => 'Not Extended',                                                // RFC2774\n        511 => 'Network Authentication Required',                             // RFC6585\n    ];\n\n    /**\n     * Tracks headers already sent in informational responses.\n     */\n    private array $sentHeaders;\n\n    /**\n     * @param int $status The HTTP status code (200 \"OK\" by default)\n     *\n     * @throws \\InvalidArgumentException When the HTTP status code is not valid\n     */\n    public function __construct(?string $content = '', int $status = 200, array $headers = [])\n    {\n        $this->headers = new ResponseHeaderBag($headers);\n        $this->setContent($content);\n        $this->setStatusCode($status);\n        $this->setProtocolVersion('1.0');\n    }\n\n    /**\n     * Returns the Response as an HTTP string.\n     *\n     * The string representation of the Response is the same as the\n     * one that will be sent to the client only if the prepare() method\n     * has been called before.\n     *\n     * @see prepare()\n     */\n    public function __toString(): string\n    {\n        return\n            sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText).\"\\r\\n\".\n            $this->headers.\"\\r\\n\".\n            $this->getContent();\n    }\n\n    /**\n     * Clones the current Response instance.\n     */\n    public function __clone()\n    {\n        $this->headers = clone $this->headers;\n    }\n\n    /**\n     * Prepares the Response before it is sent to the client.\n     *\n     * This method tweaks the Response to ensure that it is\n     * compliant with RFC 2616. Most of the changes are based on\n     * the Request that is \"associated\" with this Response.\n     *\n     * @return $this\n     */\n    public function prepare(Request $request): static\n    {\n        $headers = $this->headers;\n\n        if ($this->isInformational() || $this->isEmpty()) {\n            $this->setContent(null);\n            $headers->remove('Content-Type');\n            $headers->remove('Content-Length');\n            // prevent PHP from sending the Content-Type header based on default_mimetype\n            ini_set('default_mimetype', '');\n        } else {\n            // Content-type based on the Request\n            if (!$headers->has('Content-Type')) {\n                $format = $request->getRequestFormat(null);\n                if (null !== $format && $mimeType = $request->getMimeType($format)) {\n                    $headers->set('Content-Type', $mimeType);\n                }\n            }\n\n            // Fix Content-Type\n            $charset = $this->charset ?: 'UTF-8';\n            if (!$headers->has('Content-Type')) {\n                $headers->set('Content-Type', 'text/html; charset='.$charset);\n            } elseif (0 === stripos($headers->get('Content-Type') ?? '', 'text/') && false === stripos($headers->get('Content-Type') ?? '', 'charset')) {\n                // add the charset\n                $headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset);\n            }\n\n            // Fix Content-Length\n            if ($headers->has('Transfer-Encoding')) {\n                $headers->remove('Content-Length');\n            }\n\n            if ($request->isMethod('HEAD')) {\n                // cf. RFC2616 14.13\n                $length = $headers->get('Content-Length');\n                $this->setContent(null);\n                if ($length) {\n                    $headers->set('Content-Length', $length);\n                }\n            }\n        }\n\n        // Fix protocol\n        if ('HTTP/1.0' != $request->server->get('SERVER_PROTOCOL')) {\n            $this->setProtocolVersion('1.1');\n        }\n\n        // Check if we need to send extra expire info headers\n        if ('1.0' == $this->getProtocolVersion() && str_contains($headers->get('Cache-Control', ''), 'no-cache')) {\n            $headers->set('pragma', 'no-cache');\n            $headers->set('expires', -1);\n        }\n\n        $this->ensureIEOverSSLCompatibility($request);\n\n        if ($request->isSecure()) {\n            foreach ($headers->getCookies() as $cookie) {\n                $cookie->setSecureDefault(true);\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Sends HTTP headers.\n     *\n     * @param positive-int|null $statusCode The status code to use, override the statusCode property if set and not null\n     *\n     * @return $this\n     */\n    public function sendHeaders(/* int $statusCode = null */): static\n    {\n        // headers have already been sent by the developer\n        if (headers_sent()) {\n            return $this;\n        }\n\n        $statusCode = \\func_num_args() > 0 ? func_get_arg(0) : null;\n        $informationalResponse = $statusCode >= 100 && $statusCode < 200;\n        if ($informationalResponse && !\\function_exists('headers_send')) {\n            // skip informational responses if not supported by the SAPI\n            return $this;\n        }\n\n        // headers\n        foreach ($this->headers->allPreserveCaseWithoutCookies() as $name => $values) {\n            $newValues = $values;\n            $replace = false;\n\n            // As recommended by RFC 8297, PHP automatically copies headers from previous 103 responses, we need to deal with that if headers changed\n            $previousValues = $this->sentHeaders[$name] ?? null;\n            if ($previousValues === $values) {\n                // Header already sent in a previous response, it will be automatically copied in this response by PHP\n                continue;\n            }\n\n            $replace = 0 === strcasecmp($name, 'Content-Type');\n\n            if (null !== $previousValues && array_diff($previousValues, $values)) {\n                header_remove($name);\n                $previousValues = null;\n            }\n\n            $newValues = null === $previousValues ? $values : array_diff($values, $previousValues);\n\n            foreach ($newValues as $value) {\n                header($name.': '.$value, $replace, $this->statusCode);\n            }\n\n            if ($informationalResponse) {\n                $this->sentHeaders[$name] = $values;\n            }\n        }\n\n        // cookies\n        foreach ($this->headers->getCookies() as $cookie) {\n            header('Set-Cookie: '.$cookie, false, $this->statusCode);\n        }\n\n        if ($informationalResponse) {\n            headers_send($statusCode);\n\n            return $this;\n        }\n\n        $statusCode ??= $this->statusCode;\n\n        // status\n        header(sprintf('HTTP/%s %s %s', $this->version, $statusCode, $this->statusText), true, $statusCode);\n\n        return $this;\n    }\n\n    /**\n     * Sends content for the current web response.\n     *\n     * @return $this\n     */\n    public function sendContent(): static\n    {\n        echo $this->content;\n\n        return $this;\n    }\n\n    /**\n     * Sends HTTP headers and content.\n     *\n     * @param bool $flush Whether output buffers should be flushed\n     *\n     * @return $this\n     */\n    public function send(/* bool $flush = true */): static\n    {\n        $this->sendHeaders();\n        $this->sendContent();\n\n        $flush = 1 <= \\func_num_args() ? func_get_arg(0) : true;\n        if (!$flush) {\n            return $this;\n        }\n\n        if (\\function_exists('fastcgi_finish_request')) {\n            fastcgi_finish_request();\n        } elseif (\\function_exists('litespeed_finish_request')) {\n            litespeed_finish_request();\n        } elseif (!\\in_array(\\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {\n            static::closeOutputBuffers(0, true);\n            flush();\n        }\n\n        return $this;\n    }\n\n    /**\n     * Sets the response content.\n     *\n     * @return $this\n     */\n    public function setContent(?string $content): static\n    {\n        $this->content = $content ?? '';\n\n        return $this;\n    }\n\n    /**\n     * Gets the current response content.\n     */\n    public function getContent(): string|false\n    {\n        return $this->content;\n    }\n\n    /**\n     * Sets the HTTP protocol version (1.0 or 1.1).\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setProtocolVersion(string $version): static\n    {\n        $this->version = $version;\n\n        return $this;\n    }\n\n    /**\n     * Gets the HTTP protocol version.\n     *\n     * @final\n     */\n    public function getProtocolVersion(): string\n    {\n        return $this->version;\n    }\n\n    /**\n     * Sets the response status code.\n     *\n     * If the status text is null it will be automatically populated for the known\n     * status codes and left empty otherwise.\n     *\n     * @return $this\n     *\n     * @throws \\InvalidArgumentException When the HTTP status code is not valid\n     *\n     * @final\n     */\n    public function setStatusCode(int $code, ?string $text = null): static\n    {\n        $this->statusCode = $code;\n        if ($this->isInvalid()) {\n            throw new \\InvalidArgumentException(sprintf('The HTTP status code \"%s\" is not valid.', $code));\n        }\n\n        if (null === $text) {\n            $this->statusText = self::$statusTexts[$code] ?? 'unknown status';\n\n            return $this;\n        }\n\n        $this->statusText = $text;\n\n        return $this;\n    }\n\n    /**\n     * Retrieves the status code for the current web response.\n     *\n     * @final\n     */\n    public function getStatusCode(): int\n    {\n        return $this->statusCode;\n    }\n\n    /**\n     * Sets the response charset.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setCharset(string $charset): static\n    {\n        $this->charset = $charset;\n\n        return $this;\n    }\n\n    /**\n     * Retrieves the response charset.\n     *\n     * @final\n     */\n    public function getCharset(): ?string\n    {\n        return $this->charset;\n    }\n\n    /**\n     * Returns true if the response may safely be kept in a shared (surrogate) cache.\n     *\n     * Responses marked \"private\" with an explicit Cache-Control directive are\n     * considered uncacheable.\n     *\n     * Responses with neither a freshness lifetime (Expires, max-age) nor cache\n     * validator (Last-Modified, ETag) are considered uncacheable because there is\n     * no way to tell when or how to remove them from the cache.\n     *\n     * Note that RFC 7231 and RFC 7234 possibly allow for a more permissive implementation,\n     * for example \"status codes that are defined as cacheable by default [...]\n     * can be reused by a cache with heuristic expiration unless otherwise indicated\"\n     * (https://tools.ietf.org/html/rfc7231#section-6.1)\n     *\n     * @final\n     */\n    public function isCacheable(): bool\n    {\n        if (!\\in_array($this->statusCode, [200, 203, 300, 301, 302, 404, 410])) {\n            return false;\n        }\n\n        if ($this->headers->hasCacheControlDirective('no-store') || $this->headers->getCacheControlDirective('private')) {\n            return false;\n        }\n\n        return $this->isValidateable() || $this->isFresh();\n    }\n\n    /**\n     * Returns true if the response is \"fresh\".\n     *\n     * Fresh responses may be served from cache without any interaction with the\n     * origin. A response is considered fresh when it includes a Cache-Control/max-age\n     * indicator or Expires header and the calculated age is less than the freshness lifetime.\n     *\n     * @final\n     */\n    public function isFresh(): bool\n    {\n        return $this->getTtl() > 0;\n    }\n\n    /**\n     * Returns true if the response includes headers that can be used to validate\n     * the response with the origin server using a conditional GET request.\n     *\n     * @final\n     */\n    public function isValidateable(): bool\n    {\n        return $this->headers->has('Last-Modified') || $this->headers->has('ETag');\n    }\n\n    /**\n     * Marks the response as \"private\".\n     *\n     * It makes the response ineligible for serving other clients.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setPrivate(): static\n    {\n        $this->headers->removeCacheControlDirective('public');\n        $this->headers->addCacheControlDirective('private');\n\n        return $this;\n    }\n\n    /**\n     * Marks the response as \"public\".\n     *\n     * It makes the response eligible for serving other clients.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setPublic(): static\n    {\n        $this->headers->addCacheControlDirective('public');\n        $this->headers->removeCacheControlDirective('private');\n\n        return $this;\n    }\n\n    /**\n     * Marks the response as \"immutable\".\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setImmutable(bool $immutable = true): static\n    {\n        if ($immutable) {\n            $this->headers->addCacheControlDirective('immutable');\n        } else {\n            $this->headers->removeCacheControlDirective('immutable');\n        }\n\n        return $this;\n    }\n\n    /**\n     * Returns true if the response is marked as \"immutable\".\n     *\n     * @final\n     */\n    public function isImmutable(): bool\n    {\n        return $this->headers->hasCacheControlDirective('immutable');\n    }\n\n    /**\n     * Returns true if the response must be revalidated by shared caches once it has become stale.\n     *\n     * This method indicates that the response must not be served stale by a\n     * cache in any circumstance without first revalidating with the origin.\n     * When present, the TTL of the response should not be overridden to be\n     * greater than the value provided by the origin.\n     *\n     * @final\n     */\n    public function mustRevalidate(): bool\n    {\n        return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->hasCacheControlDirective('proxy-revalidate');\n    }\n\n    /**\n     * Returns the Date header as a DateTime instance.\n     *\n     * @throws \\RuntimeException When the header is not parseable\n     *\n     * @final\n     */\n    public function getDate(): ?\\DateTimeImmutable\n    {\n        return $this->headers->getDate('Date');\n    }\n\n    /**\n     * Sets the Date header.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setDate(\\DateTimeInterface $date): static\n    {\n        $date = \\DateTimeImmutable::createFromInterface($date);\n        $date = $date->setTimezone(new \\DateTimeZone('UTC'));\n        $this->headers->set('Date', $date->format('D, d M Y H:i:s').' GMT');\n\n        return $this;\n    }\n\n    /**\n     * Returns the age of the response in seconds.\n     *\n     * @final\n     */\n    public function getAge(): int\n    {\n        if (null !== $age = $this->headers->get('Age')) {\n            return (int) $age;\n        }\n\n        return max(time() - (int) $this->getDate()->format('U'), 0);\n    }\n\n    /**\n     * Marks the response stale by setting the Age header to be equal to the maximum age of the response.\n     *\n     * @return $this\n     */\n    public function expire(): static\n    {\n        if ($this->isFresh()) {\n            $this->headers->set('Age', $this->getMaxAge());\n            $this->headers->remove('Expires');\n        }\n\n        return $this;\n    }\n\n    /**\n     * Returns the value of the Expires header as a DateTime instance.\n     *\n     * @final\n     */\n    public function getExpires(): ?\\DateTimeImmutable\n    {\n        try {\n            return $this->headers->getDate('Expires');\n        } catch (\\RuntimeException) {\n            // according to RFC 2616 invalid date formats (e.g. \"0\" and \"-1\") must be treated as in the past\n            return \\DateTimeImmutable::createFromFormat('U', time() - 172800);\n        }\n    }\n\n    /**\n     * Sets the Expires HTTP header with a DateTime instance.\n     *\n     * Passing null as value will remove the header.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setExpires(?\\DateTimeInterface $date = null): static\n    {\n        if (1 > \\func_num_args()) {\n            trigger_deprecation('symfony/http-foundation', '6.2', 'Calling \"%s()\" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);\n        }\n        if (null === $date) {\n            $this->headers->remove('Expires');\n\n            return $this;\n        }\n\n        $date = \\DateTimeImmutable::createFromInterface($date);\n        $date = $date->setTimezone(new \\DateTimeZone('UTC'));\n        $this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT');\n\n        return $this;\n    }\n\n    /**\n     * Returns the number of seconds after the time specified in the response's Date\n     * header when the response should no longer be considered fresh.\n     *\n     * First, it checks for a s-maxage directive, then a max-age directive, and then it falls\n     * back on an expires header. It returns null when no maximum age can be established.\n     *\n     * @final\n     */\n    public function getMaxAge(): ?int\n    {\n        if ($this->headers->hasCacheControlDirective('s-maxage')) {\n            return (int) $this->headers->getCacheControlDirective('s-maxage');\n        }\n\n        if ($this->headers->hasCacheControlDirective('max-age')) {\n            return (int) $this->headers->getCacheControlDirective('max-age');\n        }\n\n        if (null !== $expires = $this->getExpires()) {\n            $maxAge = (int) $expires->format('U') - (int) $this->getDate()->format('U');\n\n            return max($maxAge, 0);\n        }\n\n        return null;\n    }\n\n    /**\n     * Sets the number of seconds after which the response should no longer be considered fresh.\n     *\n     * This methods sets the Cache-Control max-age directive.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setMaxAge(int $value): static\n    {\n        $this->headers->addCacheControlDirective('max-age', $value);\n\n        return $this;\n    }\n\n    /**\n     * Sets the number of seconds after which the response should no longer be returned by shared caches when backend is down.\n     *\n     * This method sets the Cache-Control stale-if-error directive.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setStaleIfError(int $value): static\n    {\n        $this->headers->addCacheControlDirective('stale-if-error', $value);\n\n        return $this;\n    }\n\n    /**\n     * Sets the number of seconds after which the response should no longer return stale content by shared caches.\n     *\n     * This method sets the Cache-Control stale-while-revalidate directive.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setStaleWhileRevalidate(int $value): static\n    {\n        $this->headers->addCacheControlDirective('stale-while-revalidate', $value);\n\n        return $this;\n    }\n\n    /**\n     * Sets the number of seconds after which the response should no longer be considered fresh by shared caches.\n     *\n     * This methods sets the Cache-Control s-maxage directive.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setSharedMaxAge(int $value): static\n    {\n        $this->setPublic();\n        $this->headers->addCacheControlDirective('s-maxage', $value);\n\n        return $this;\n    }\n\n    /**\n     * Returns the response's time-to-live in seconds.\n     *\n     * It returns null when no freshness information is present in the response.\n     *\n     * When the response's TTL is 0, the response may not be served from cache without first\n     * revalidating with the origin.\n     *\n     * @final\n     */\n    public function getTtl(): ?int\n    {\n        $maxAge = $this->getMaxAge();\n\n        return null !== $maxAge ? max($maxAge - $this->getAge(), 0) : null;\n    }\n\n    /**\n     * Sets the response's time-to-live for shared caches in seconds.\n     *\n     * This method adjusts the Cache-Control/s-maxage directive.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setTtl(int $seconds): static\n    {\n        $this->setSharedMaxAge($this->getAge() + $seconds);\n\n        return $this;\n    }\n\n    /**\n     * Sets the response's time-to-live for private/client caches in seconds.\n     *\n     * This method adjusts the Cache-Control/max-age directive.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setClientTtl(int $seconds): static\n    {\n        $this->setMaxAge($this->getAge() + $seconds);\n\n        return $this;\n    }\n\n    /**\n     * Returns the Last-Modified HTTP header as a DateTime instance.\n     *\n     * @throws \\RuntimeException When the HTTP header is not parseable\n     *\n     * @final\n     */\n    public function getLastModified(): ?\\DateTimeImmutable\n    {\n        return $this->headers->getDate('Last-Modified');\n    }\n\n    /**\n     * Sets the Last-Modified HTTP header with a DateTime instance.\n     *\n     * Passing null as value will remove the header.\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setLastModified(?\\DateTimeInterface $date = null): static\n    {\n        if (1 > \\func_num_args()) {\n            trigger_deprecation('symfony/http-foundation', '6.2', 'Calling \"%s()\" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);\n        }\n        if (null === $date) {\n            $this->headers->remove('Last-Modified');\n\n            return $this;\n        }\n\n        $date = \\DateTimeImmutable::createFromInterface($date);\n        $date = $date->setTimezone(new \\DateTimeZone('UTC'));\n        $this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT');\n\n        return $this;\n    }\n\n    /**\n     * Returns the literal value of the ETag HTTP header.\n     *\n     * @final\n     */\n    public function getEtag(): ?string\n    {\n        return $this->headers->get('ETag');\n    }\n\n    /**\n     * Sets the ETag value.\n     *\n     * @param string|null $etag The ETag unique identifier or null to remove the header\n     * @param bool        $weak Whether you want a weak ETag or not\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setEtag(?string $etag = null, bool $weak = false): static\n    {\n        if (1 > \\func_num_args()) {\n            trigger_deprecation('symfony/http-foundation', '6.2', 'Calling \"%s()\" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);\n        }\n        if (null === $etag) {\n            $this->headers->remove('Etag');\n        } else {\n            if (!str_starts_with($etag, '\"')) {\n                $etag = '\"'.$etag.'\"';\n            }\n\n            $this->headers->set('ETag', (true === $weak ? 'W/' : '').$etag);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Sets the response's cache headers (validation and/or expiration).\n     *\n     * Available options are: must_revalidate, no_cache, no_store, no_transform, public, private, proxy_revalidate, max_age, s_maxage, immutable, last_modified and etag.\n     *\n     * @return $this\n     *\n     * @throws \\InvalidArgumentException\n     *\n     * @final\n     */\n    public function setCache(array $options): static\n    {\n        if ($diff = array_diff(array_keys($options), array_keys(self::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES))) {\n            throw new \\InvalidArgumentException(sprintf('Response does not support the following options: \"%s\".', implode('\", \"', $diff)));\n        }\n\n        if (isset($options['etag'])) {\n            $this->setEtag($options['etag']);\n        }\n\n        if (isset($options['last_modified'])) {\n            $this->setLastModified($options['last_modified']);\n        }\n\n        if (isset($options['max_age'])) {\n            $this->setMaxAge($options['max_age']);\n        }\n\n        if (isset($options['s_maxage'])) {\n            $this->setSharedMaxAge($options['s_maxage']);\n        }\n\n        if (isset($options['stale_while_revalidate'])) {\n            $this->setStaleWhileRevalidate($options['stale_while_revalidate']);\n        }\n\n        if (isset($options['stale_if_error'])) {\n            $this->setStaleIfError($options['stale_if_error']);\n        }\n\n        foreach (self::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES as $directive => $hasValue) {\n            if (!$hasValue && isset($options[$directive])) {\n                if ($options[$directive]) {\n                    $this->headers->addCacheControlDirective(str_replace('_', '-', $directive));\n                } else {\n                    $this->headers->removeCacheControlDirective(str_replace('_', '-', $directive));\n                }\n            }\n        }\n\n        if (isset($options['public'])) {\n            if ($options['public']) {\n                $this->setPublic();\n            } else {\n                $this->setPrivate();\n            }\n        }\n\n        if (isset($options['private'])) {\n            if ($options['private']) {\n                $this->setPrivate();\n            } else {\n                $this->setPublic();\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Modifies the response so that it conforms to the rules defined for a 304 status code.\n     *\n     * This sets the status, removes the body, and discards any headers\n     * that MUST NOT be included in 304 responses.\n     *\n     * @return $this\n     *\n     * @see https://tools.ietf.org/html/rfc2616#section-10.3.5\n     *\n     * @final\n     */\n    public function setNotModified(): static\n    {\n        $this->setStatusCode(304);\n        $this->setContent(null);\n\n        // remove headers that MUST NOT be included with 304 Not Modified responses\n        foreach (['Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-MD5', 'Content-Type', 'Last-Modified'] as $header) {\n            $this->headers->remove($header);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Returns true if the response includes a Vary header.\n     *\n     * @final\n     */\n    public function hasVary(): bool\n    {\n        return null !== $this->headers->get('Vary');\n    }\n\n    /**\n     * Returns an array of header names given in the Vary header.\n     *\n     * @final\n     */\n    public function getVary(): array\n    {\n        if (!$vary = $this->headers->all('Vary')) {\n            return [];\n        }\n\n        $ret = [];\n        foreach ($vary as $item) {\n            $ret[] = preg_split('/[\\s,]+/', $item);\n        }\n\n        return array_merge([], ...$ret);\n    }\n\n    /**\n     * Sets the Vary header.\n     *\n     * @param bool $replace Whether to replace the actual value or not (true by default)\n     *\n     * @return $this\n     *\n     * @final\n     */\n    public function setVary(string|array $headers, bool $replace = true): static\n    {\n        $this->headers->set('Vary', $headers, $replace);\n\n        return $this;\n    }\n\n    /**\n     * Determines if the Response validators (ETag, Last-Modified) match\n     * a conditional value specified in the Request.\n     *\n     * If the Response is not modified, it sets the status code to 304 and\n     * removes the actual content by calling the setNotModified() method.\n     *\n     * @final\n     */\n    public function isNotModified(Request $request): bool\n    {\n        if (!$request->isMethodCacheable()) {\n            return false;\n        }\n\n        $notModified = false;\n        $lastModified = $this->headers->get('Last-Modified');\n        $modifiedSince = $request->headers->get('If-Modified-Since');\n\n        if (($ifNoneMatchEtags = $request->getETags()) && (null !== $etag = $this->getEtag())) {\n            if (0 == strncmp($etag, 'W/', 2)) {\n                $etag = substr($etag, 2);\n            }\n\n            // Use weak comparison as per https://tools.ietf.org/html/rfc7232#section-3.2.\n            foreach ($ifNoneMatchEtags as $ifNoneMatchEtag) {\n                if (0 == strncmp($ifNoneMatchEtag, 'W/', 2)) {\n                    $ifNoneMatchEtag = substr($ifNoneMatchEtag, 2);\n                }\n\n                if ($ifNoneMatchEtag === $etag || '*' === $ifNoneMatchEtag) {\n                    $notModified = true;\n                    break;\n                }\n            }\n        }\n        // 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.\n        elseif ($modifiedSince && $lastModified) {\n            $notModified = strtotime($modifiedSince) >= strtotime($lastModified);\n        }\n\n        if ($notModified) {\n            $this->setNotModified();\n        }\n\n        return $notModified;\n    }\n\n    /**\n     * Is response invalid?\n     *\n     * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html\n     *\n     * @final\n     */\n    public function isInvalid(): bool\n    {\n        return $this->statusCode < 100 || $this->statusCode >= 600;\n    }\n\n    /**\n     * Is response informative?\n     *\n     * @final\n     */\n    public function isInformational(): bool\n    {\n        return $this->statusCode >= 100 && $this->statusCode < 200;\n    }\n\n    /**\n     * Is response successful?\n     *\n     * @final\n     */\n    public function isSuccessful(): bool\n    {\n        return $this->statusCode >= 200 && $this->statusCode < 300;\n    }\n\n    /**\n     * Is the response a redirect?\n     *\n     * @final\n     */\n    public function isRedirection(): bool\n    {\n        return $this->statusCode >= 300 && $this->statusCode < 400;\n    }\n\n    /**\n     * Is there a client error?\n     *\n     * @final\n     */\n    public function isClientError(): bool\n    {\n        return $this->statusCode >= 400 && $this->statusCode < 500;\n    }\n\n    /**\n     * Was there a server side error?\n     *\n     * @final\n     */\n    public function isServerError(): bool\n    {\n        return $this->statusCode >= 500 && $this->statusCode < 600;\n    }\n\n    /**\n     * Is the response OK?\n     *\n     * @final\n     */\n    public function isOk(): bool\n    {\n        return 200 === $this->statusCode;\n    }\n\n    /**\n     * Is the response forbidden?\n     *\n     * @final\n     */\n    public function isForbidden(): bool\n    {\n        return 403 === $this->statusCode;\n    }\n\n    /**\n     * Is the response a not found error?\n     *\n     * @final\n     */\n    public function isNotFound(): bool\n    {\n        return 404 === $this->statusCode;\n    }\n\n    /**\n     * Is the response a redirect of some form?\n     *\n     * @final\n     */\n    public function isRedirect(?string $location = null): bool\n    {\n        return \\in_array($this->statusCode, [201, 301, 302, 303, 307, 308]) && (null === $location ?: $location == $this->headers->get('Location'));\n    }\n\n    /**\n     * Is the response empty?\n     *\n     * @final\n     */\n    public function isEmpty(): bool\n    {\n        return \\in_array($this->statusCode, [204, 304]);\n    }\n\n    /**\n     * Cleans or flushes output buffers up to target level.\n     *\n     * Resulting level can be greater than target level if a non-removable buffer has been encountered.\n     *\n     * @final\n     */\n    public static function closeOutputBuffers(int $targetLevel, bool $flush): void\n    {\n        $status = ob_get_status(true);\n        $level = \\count($status);\n        $flags = \\PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? \\PHP_OUTPUT_HANDLER_FLUSHABLE : \\PHP_OUTPUT_HANDLER_CLEANABLE);\n\n        while ($level-- > $targetLevel && ($s = $status[$level]) && (!isset($s['del']) ? !isset($s['flags']) || ($s['flags'] & $flags) === $flags : $s['del'])) {\n            if ($flush) {\n                ob_end_flush();\n            } else {\n                ob_end_clean();\n            }\n        }\n    }\n\n    /**\n     * Marks a response as safe according to RFC8674.\n     *\n     * @see https://tools.ietf.org/html/rfc8674\n     */\n    public function setContentSafe(bool $safe = true): void\n    {\n        if ($safe) {\n            $this->headers->set('Preference-Applied', 'safe');\n        } elseif ('safe' === $this->headers->get('Preference-Applied')) {\n            $this->headers->remove('Preference-Applied');\n        }\n\n        $this->setVary('Prefer', false);\n    }\n\n    /**\n     * Checks if we need to remove Cache-Control for SSL encrypted downloads when using IE < 9.\n     *\n     * @see http://support.microsoft.com/kb/323308\n     *\n     * @final\n     */\n    protected function ensureIEOverSSLCompatibility(Request $request): void\n    {\n        if (false !== stripos($this->headers->get('Content-Disposition') ?? '', 'attachment') && 1 == preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT') ?? '', $match) && true === $request->isSecure()) {\n            if ((int) preg_replace('/(MSIE )(.*?);/', '$2', $match[0]) < 9) {\n                $this->headers->remove('Cache-Control');\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/ResponseHeaderBag.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * ResponseHeaderBag is a container for Response HTTP headers.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass ResponseHeaderBag extends HeaderBag\n{\n    public const COOKIES_FLAT = 'flat';\n    public const COOKIES_ARRAY = 'array';\n\n    public const DISPOSITION_ATTACHMENT = 'attachment';\n    public const DISPOSITION_INLINE = 'inline';\n\n    protected $computedCacheControl = [];\n    protected $cookies = [];\n    protected $headerNames = [];\n\n    public function __construct(array $headers = [])\n    {\n        parent::__construct($headers);\n\n        if (!isset($this->headers['cache-control'])) {\n            $this->set('Cache-Control', '');\n        }\n\n        /* RFC2616 - 14.18 says all Responses need to have a Date */\n        if (!isset($this->headers['date'])) {\n            $this->initDate();\n        }\n    }\n\n    /**\n     * Returns the headers, with original capitalizations.\n     */\n    public function allPreserveCase(): array\n    {\n        $headers = [];\n        foreach ($this->all() as $name => $value) {\n            $headers[$this->headerNames[$name] ?? $name] = $value;\n        }\n\n        return $headers;\n    }\n\n    /**\n     * @return array\n     */\n    public function allPreserveCaseWithoutCookies()\n    {\n        $headers = $this->allPreserveCase();\n        if (isset($this->headerNames['set-cookie'])) {\n            unset($headers[$this->headerNames['set-cookie']]);\n        }\n\n        return $headers;\n    }\n\n    /**\n     * @return void\n     */\n    public function replace(array $headers = [])\n    {\n        $this->headerNames = [];\n\n        parent::replace($headers);\n\n        if (!isset($this->headers['cache-control'])) {\n            $this->set('Cache-Control', '');\n        }\n\n        if (!isset($this->headers['date'])) {\n            $this->initDate();\n        }\n    }\n\n    public function all(?string $key = null): array\n    {\n        $headers = parent::all();\n\n        if (null !== $key) {\n            $key = strtr($key, self::UPPER, self::LOWER);\n\n            return 'set-cookie' !== $key ? $headers[$key] ?? [] : array_map('strval', $this->getCookies());\n        }\n\n        foreach ($this->getCookies() as $cookie) {\n            $headers['set-cookie'][] = (string) $cookie;\n        }\n\n        return $headers;\n    }\n\n    /**\n     * @return void\n     */\n    public function set(string $key, string|array|null $values, bool $replace = true)\n    {\n        $uniqueKey = strtr($key, self::UPPER, self::LOWER);\n\n        if ('set-cookie' === $uniqueKey) {\n            if ($replace) {\n                $this->cookies = [];\n            }\n            foreach ((array) $values as $cookie) {\n                $this->setCookie(Cookie::fromString($cookie));\n            }\n            $this->headerNames[$uniqueKey] = $key;\n\n            return;\n        }\n\n        $this->headerNames[$uniqueKey] = $key;\n\n        parent::set($key, $values, $replace);\n\n        // ensure the cache-control header has sensible defaults\n        if (\\in_array($uniqueKey, ['cache-control', 'etag', 'last-modified', 'expires'], true) && '' !== $computed = $this->computeCacheControlValue()) {\n            $this->headers['cache-control'] = [$computed];\n            $this->headerNames['cache-control'] = 'Cache-Control';\n            $this->computedCacheControl = $this->parseCacheControl($computed);\n        }\n    }\n\n    /**\n     * @return void\n     */\n    public function remove(string $key)\n    {\n        $uniqueKey = strtr($key, self::UPPER, self::LOWER);\n        unset($this->headerNames[$uniqueKey]);\n\n        if ('set-cookie' === $uniqueKey) {\n            $this->cookies = [];\n\n            return;\n        }\n\n        parent::remove($key);\n\n        if ('cache-control' === $uniqueKey) {\n            $this->computedCacheControl = [];\n        }\n\n        if ('date' === $uniqueKey) {\n            $this->initDate();\n        }\n    }\n\n    public function hasCacheControlDirective(string $key): bool\n    {\n        return \\array_key_exists($key, $this->computedCacheControl);\n    }\n\n    public function getCacheControlDirective(string $key): bool|string|null\n    {\n        return $this->computedCacheControl[$key] ?? null;\n    }\n\n    /**\n     * @return void\n     */\n    public function setCookie(Cookie $cookie)\n    {\n        $this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie;\n        $this->headerNames['set-cookie'] = 'Set-Cookie';\n    }\n\n    /**\n     * Removes a cookie from the array, but does not unset it in the browser.\n     *\n     * @return void\n     */\n    public function removeCookie(string $name, ?string $path = '/', ?string $domain = null)\n    {\n        $path ??= '/';\n\n        unset($this->cookies[$domain][$path][$name]);\n\n        if (empty($this->cookies[$domain][$path])) {\n            unset($this->cookies[$domain][$path]);\n\n            if (empty($this->cookies[$domain])) {\n                unset($this->cookies[$domain]);\n            }\n        }\n\n        if (empty($this->cookies)) {\n            unset($this->headerNames['set-cookie']);\n        }\n    }\n\n    /**\n     * Returns an array with all cookies.\n     *\n     * @return Cookie[]\n     *\n     * @throws \\InvalidArgumentException When the $format is invalid\n     */\n    public function getCookies(string $format = self::COOKIES_FLAT): array\n    {\n        if (!\\in_array($format, [self::COOKIES_FLAT, self::COOKIES_ARRAY])) {\n            throw new \\InvalidArgumentException(sprintf('Format \"%s\" invalid (%s).', $format, implode(', ', [self::COOKIES_FLAT, self::COOKIES_ARRAY])));\n        }\n\n        if (self::COOKIES_ARRAY === $format) {\n            return $this->cookies;\n        }\n\n        $flattenedCookies = [];\n        foreach ($this->cookies as $path) {\n            foreach ($path as $cookies) {\n                foreach ($cookies as $cookie) {\n                    $flattenedCookies[] = $cookie;\n                }\n            }\n        }\n\n        return $flattenedCookies;\n    }\n\n    /**\n     * Clears a cookie in the browser.\n     *\n     * @param bool $partitioned\n     *\n     * @return void\n     */\n    public function clearCookie(string $name, ?string $path = '/', ?string $domain = null, bool $secure = false, bool $httpOnly = true, ?string $sameSite = null /* , bool $partitioned = false */)\n    {\n        $partitioned = 6 < \\func_num_args() ? \\func_get_arg(6) : false;\n\n        $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly, false, $sameSite, $partitioned));\n    }\n\n    /**\n     * @see HeaderUtils::makeDisposition()\n     *\n     * @return string\n     */\n    public function makeDisposition(string $disposition, string $filename, string $filenameFallback = '')\n    {\n        return HeaderUtils::makeDisposition($disposition, $filename, $filenameFallback);\n    }\n\n    /**\n     * Returns the calculated value of the cache-control header.\n     *\n     * This considers several other headers and calculates or modifies the\n     * cache-control header to a sensible, conservative value.\n     */\n    protected function computeCacheControlValue(): string\n    {\n        if (!$this->cacheControl) {\n            if ($this->has('Last-Modified') || $this->has('Expires')) {\n                return 'private, must-revalidate'; // allows for heuristic expiration (RFC 7234 Section 4.2.2) in the case of \"Last-Modified\"\n            }\n\n            // conservative by default\n            return 'no-cache, private';\n        }\n\n        $header = $this->getCacheControlHeader();\n        if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) {\n            return $header;\n        }\n\n        // public if s-maxage is defined, private otherwise\n        if (!isset($this->cacheControl['s-maxage'])) {\n            return $header.', private';\n        }\n\n        return $header;\n    }\n\n    private function initDate(): void\n    {\n        $this->set('Date', gmdate('D, d M Y H:i:s').' GMT');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/ServerBag.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * ServerBag is a container for HTTP headers from the $_SERVER variable.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Bulat Shakirzyanov <mallluhuct@gmail.com>\n * @author Robert Kiss <kepten@gmail.com>\n */\nclass ServerBag extends ParameterBag\n{\n    /**\n     * Gets the HTTP headers.\n     */\n    public function getHeaders(): array\n    {\n        $headers = [];\n        foreach ($this->parameters as $key => $value) {\n            if (str_starts_with($key, 'HTTP_')) {\n                $headers[substr($key, 5)] = $value;\n            } elseif (\\in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH', 'CONTENT_MD5'], true) && '' !== $value) {\n                $headers[$key] = $value;\n            }\n        }\n\n        if (isset($this->parameters['PHP_AUTH_USER'])) {\n            $headers['PHP_AUTH_USER'] = $this->parameters['PHP_AUTH_USER'];\n            $headers['PHP_AUTH_PW'] = $this->parameters['PHP_AUTH_PW'] ?? '';\n        } else {\n            /*\n             * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default\n             * For this workaround to work, add these lines to your .htaccess file:\n             * RewriteCond %{HTTP:Authorization} .+\n             * RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]\n             *\n             * A sample .htaccess file:\n             * RewriteEngine On\n             * RewriteCond %{HTTP:Authorization} .+\n             * RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]\n             * RewriteCond %{REQUEST_FILENAME} !-f\n             * RewriteRule ^(.*)$ index.php [QSA,L]\n             */\n\n            $authorizationHeader = null;\n            if (isset($this->parameters['HTTP_AUTHORIZATION'])) {\n                $authorizationHeader = $this->parameters['HTTP_AUTHORIZATION'];\n            } elseif (isset($this->parameters['REDIRECT_HTTP_AUTHORIZATION'])) {\n                $authorizationHeader = $this->parameters['REDIRECT_HTTP_AUTHORIZATION'];\n            }\n\n            if (null !== $authorizationHeader) {\n                if (0 === stripos($authorizationHeader, 'basic ')) {\n                    // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic\n                    $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)), 2);\n                    if (2 == \\count($exploded)) {\n                        [$headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']] = $exploded;\n                    }\n                } elseif (empty($this->parameters['PHP_AUTH_DIGEST']) && (0 === stripos($authorizationHeader, 'digest '))) {\n                    // In some circumstances PHP_AUTH_DIGEST needs to be set\n                    $headers['PHP_AUTH_DIGEST'] = $authorizationHeader;\n                    $this->parameters['PHP_AUTH_DIGEST'] = $authorizationHeader;\n                } elseif (0 === stripos($authorizationHeader, 'bearer ')) {\n                    /*\n                     * XXX: Since there is no PHP_AUTH_BEARER in PHP predefined variables,\n                     *      I'll just set $headers['AUTHORIZATION'] here.\n                     *      https://php.net/reserved.variables.server\n                     */\n                    $headers['AUTHORIZATION'] = $authorizationHeader;\n                }\n            }\n        }\n\n        if (isset($headers['AUTHORIZATION'])) {\n            return $headers;\n        }\n\n        // PHP_AUTH_USER/PHP_AUTH_PW\n        if (isset($headers['PHP_AUTH_USER'])) {\n            $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.($headers['PHP_AUTH_PW'] ?? ''));\n        } elseif (isset($headers['PHP_AUTH_DIGEST'])) {\n            $headers['AUTHORIZATION'] = $headers['PHP_AUTH_DIGEST'];\n        }\n\n        return $headers;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Attribute;\n\n/**\n * This class relates to session attribute storage.\n *\n * @implements \\IteratorAggregate<string, mixed>\n */\nclass AttributeBag implements AttributeBagInterface, \\IteratorAggregate, \\Countable\n{\n    private string $name = 'attributes';\n    private string $storageKey;\n\n    protected $attributes = [];\n\n    /**\n     * @param string $storageKey The key used to store attributes in the session\n     */\n    public function __construct(string $storageKey = '_sf2_attributes')\n    {\n        $this->storageKey = $storageKey;\n    }\n\n    public function getName(): string\n    {\n        return $this->name;\n    }\n\n    /**\n     * @return void\n     */\n    public function setName(string $name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * @return void\n     */\n    public function initialize(array &$attributes)\n    {\n        $this->attributes = &$attributes;\n    }\n\n    public function getStorageKey(): string\n    {\n        return $this->storageKey;\n    }\n\n    public function has(string $name): bool\n    {\n        return \\array_key_exists($name, $this->attributes);\n    }\n\n    public function get(string $name, mixed $default = null): mixed\n    {\n        return \\array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default;\n    }\n\n    /**\n     * @return void\n     */\n    public function set(string $name, mixed $value)\n    {\n        $this->attributes[$name] = $value;\n    }\n\n    public function all(): array\n    {\n        return $this->attributes;\n    }\n\n    /**\n     * @return void\n     */\n    public function replace(array $attributes)\n    {\n        $this->attributes = [];\n        foreach ($attributes as $key => $value) {\n            $this->set($key, $value);\n        }\n    }\n\n    public function remove(string $name): mixed\n    {\n        $retval = null;\n        if (\\array_key_exists($name, $this->attributes)) {\n            $retval = $this->attributes[$name];\n            unset($this->attributes[$name]);\n        }\n\n        return $retval;\n    }\n\n    public function clear(): mixed\n    {\n        $return = $this->attributes;\n        $this->attributes = [];\n\n        return $return;\n    }\n\n    /**\n     * Returns an iterator for attributes.\n     *\n     * @return \\ArrayIterator<string, mixed>\n     */\n    public function getIterator(): \\ArrayIterator\n    {\n        return new \\ArrayIterator($this->attributes);\n    }\n\n    /**\n     * Returns the number of attributes.\n     */\n    public function count(): int\n    {\n        return \\count($this->attributes);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Attribute;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface;\n\n/**\n * Attributes store.\n *\n * @author Drak <drak@zikula.org>\n */\ninterface AttributeBagInterface extends SessionBagInterface\n{\n    /**\n     * Checks if an attribute is defined.\n     */\n    public function has(string $name): bool;\n\n    /**\n     * Returns an attribute.\n     */\n    public function get(string $name, mixed $default = null): mixed;\n\n    /**\n     * Sets an attribute.\n     *\n     * @return void\n     */\n    public function set(string $name, mixed $value);\n\n    /**\n     * Returns attributes.\n     *\n     * @return array<string, mixed>\n     */\n    public function all(): array;\n\n    /**\n     * @return void\n     */\n    public function replace(array $attributes);\n\n    /**\n     * Removes an attribute.\n     *\n     * @return mixed The removed value or null when it does not exist\n     */\n    public function remove(string $name): mixed;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Flash;\n\n/**\n * AutoExpireFlashBag flash message container.\n *\n * @author Drak <drak@zikula.org>\n */\nclass AutoExpireFlashBag implements FlashBagInterface\n{\n    private string $name = 'flashes';\n    private array $flashes = ['display' => [], 'new' => []];\n    private string $storageKey;\n\n    /**\n     * @param string $storageKey The key used to store flashes in the session\n     */\n    public function __construct(string $storageKey = '_symfony_flashes')\n    {\n        $this->storageKey = $storageKey;\n    }\n\n    public function getName(): string\n    {\n        return $this->name;\n    }\n\n    /**\n     * @return void\n     */\n    public function setName(string $name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * @return void\n     */\n    public function initialize(array &$flashes)\n    {\n        $this->flashes = &$flashes;\n\n        // The logic: messages from the last request will be stored in new, so we move them to previous\n        // This request we will show what is in 'display'.  What is placed into 'new' this time round will\n        // be moved to display next time round.\n        $this->flashes['display'] = \\array_key_exists('new', $this->flashes) ? $this->flashes['new'] : [];\n        $this->flashes['new'] = [];\n    }\n\n    /**\n     * @return void\n     */\n    public function add(string $type, mixed $message)\n    {\n        $this->flashes['new'][$type][] = $message;\n    }\n\n    public function peek(string $type, array $default = []): array\n    {\n        return $this->has($type) ? $this->flashes['display'][$type] : $default;\n    }\n\n    public function peekAll(): array\n    {\n        return \\array_key_exists('display', $this->flashes) ? $this->flashes['display'] : [];\n    }\n\n    public function get(string $type, array $default = []): array\n    {\n        $return = $default;\n\n        if (!$this->has($type)) {\n            return $return;\n        }\n\n        if (isset($this->flashes['display'][$type])) {\n            $return = $this->flashes['display'][$type];\n            unset($this->flashes['display'][$type]);\n        }\n\n        return $return;\n    }\n\n    public function all(): array\n    {\n        $return = $this->flashes['display'];\n        $this->flashes['display'] = [];\n\n        return $return;\n    }\n\n    /**\n     * @return void\n     */\n    public function setAll(array $messages)\n    {\n        $this->flashes['new'] = $messages;\n    }\n\n    /**\n     * @return void\n     */\n    public function set(string $type, string|array $messages)\n    {\n        $this->flashes['new'][$type] = (array) $messages;\n    }\n\n    public function has(string $type): bool\n    {\n        return \\array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type];\n    }\n\n    public function keys(): array\n    {\n        return array_keys($this->flashes['display']);\n    }\n\n    public function getStorageKey(): string\n    {\n        return $this->storageKey;\n    }\n\n    public function clear(): mixed\n    {\n        return $this->all();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Flash/FlashBag.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Flash;\n\n/**\n * FlashBag flash message container.\n *\n * @author Drak <drak@zikula.org>\n */\nclass FlashBag implements FlashBagInterface\n{\n    private string $name = 'flashes';\n    private array $flashes = [];\n    private string $storageKey;\n\n    /**\n     * @param string $storageKey The key used to store flashes in the session\n     */\n    public function __construct(string $storageKey = '_symfony_flashes')\n    {\n        $this->storageKey = $storageKey;\n    }\n\n    public function getName(): string\n    {\n        return $this->name;\n    }\n\n    /**\n     * @return void\n     */\n    public function setName(string $name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * @return void\n     */\n    public function initialize(array &$flashes)\n    {\n        $this->flashes = &$flashes;\n    }\n\n    /**\n     * @return void\n     */\n    public function add(string $type, mixed $message)\n    {\n        $this->flashes[$type][] = $message;\n    }\n\n    public function peek(string $type, array $default = []): array\n    {\n        return $this->has($type) ? $this->flashes[$type] : $default;\n    }\n\n    public function peekAll(): array\n    {\n        return $this->flashes;\n    }\n\n    public function get(string $type, array $default = []): array\n    {\n        if (!$this->has($type)) {\n            return $default;\n        }\n\n        $return = $this->flashes[$type];\n\n        unset($this->flashes[$type]);\n\n        return $return;\n    }\n\n    public function all(): array\n    {\n        $return = $this->peekAll();\n        $this->flashes = [];\n\n        return $return;\n    }\n\n    /**\n     * @return void\n     */\n    public function set(string $type, string|array $messages)\n    {\n        $this->flashes[$type] = (array) $messages;\n    }\n\n    /**\n     * @return void\n     */\n    public function setAll(array $messages)\n    {\n        $this->flashes = $messages;\n    }\n\n    public function has(string $type): bool\n    {\n        return \\array_key_exists($type, $this->flashes) && $this->flashes[$type];\n    }\n\n    public function keys(): array\n    {\n        return array_keys($this->flashes);\n    }\n\n    public function getStorageKey(): string\n    {\n        return $this->storageKey;\n    }\n\n    public function clear(): mixed\n    {\n        return $this->all();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Flash;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface;\n\n/**\n * FlashBagInterface.\n *\n * @author Drak <drak@zikula.org>\n */\ninterface FlashBagInterface extends SessionBagInterface\n{\n    /**\n     * Adds a flash message for the given type.\n     *\n     * @return void\n     */\n    public function add(string $type, mixed $message);\n\n    /**\n     * Registers one or more messages for a given type.\n     *\n     * @return void\n     */\n    public function set(string $type, string|array $messages);\n\n    /**\n     * Gets flash messages for a given type.\n     *\n     * @param string $type    Message category type\n     * @param array  $default Default value if $type does not exist\n     */\n    public function peek(string $type, array $default = []): array;\n\n    /**\n     * Gets all flash messages.\n     */\n    public function peekAll(): array;\n\n    /**\n     * Gets and clears flash from the stack.\n     *\n     * @param array $default Default value if $type does not exist\n     */\n    public function get(string $type, array $default = []): array;\n\n    /**\n     * Gets and clears flashes from the stack.\n     */\n    public function all(): array;\n\n    /**\n     * Sets all flash messages.\n     *\n     * @return void\n     */\n    public function setAll(array $messages);\n\n    /**\n     * Has flash messages for a given type?\n     */\n    public function has(string $type): bool;\n\n    /**\n     * Returns a list of all defined types.\n     */\n    public function keys(): array;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface;\n\n/**\n * Interface for session with a flashbag.\n */\ninterface FlashBagAwareSessionInterface extends SessionInterface\n{\n    public function getFlashBag(): FlashBagInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Session.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBag;\nuse Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBagInterface;\nuse Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBag;\nuse Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface;\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag;\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage;\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(AttributeBag::class);\nclass_exists(FlashBag::class);\nclass_exists(SessionBagProxy::class);\n\n/**\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Drak <drak@zikula.org>\n *\n * @implements \\IteratorAggregate<string, mixed>\n */\nclass Session implements FlashBagAwareSessionInterface, \\IteratorAggregate, \\Countable\n{\n    protected $storage;\n\n    private string $flashName;\n    private string $attributeName;\n    private array $data = [];\n    private int $usageIndex = 0;\n    private ?\\Closure $usageReporter;\n\n    public function __construct(?SessionStorageInterface $storage = null, ?AttributeBagInterface $attributes = null, ?FlashBagInterface $flashes = null, ?callable $usageReporter = null)\n    {\n        $this->storage = $storage ?? new NativeSessionStorage();\n        $this->usageReporter = null === $usageReporter ? null : $usageReporter(...);\n\n        $attributes ??= new AttributeBag();\n        $this->attributeName = $attributes->getName();\n        $this->registerBag($attributes);\n\n        $flashes ??= new FlashBag();\n        $this->flashName = $flashes->getName();\n        $this->registerBag($flashes);\n    }\n\n    public function start(): bool\n    {\n        return $this->storage->start();\n    }\n\n    public function has(string $name): bool\n    {\n        return $this->getAttributeBag()->has($name);\n    }\n\n    public function get(string $name, mixed $default = null): mixed\n    {\n        return $this->getAttributeBag()->get($name, $default);\n    }\n\n    /**\n     * @return void\n     */\n    public function set(string $name, mixed $value)\n    {\n        $this->getAttributeBag()->set($name, $value);\n    }\n\n    public function all(): array\n    {\n        return $this->getAttributeBag()->all();\n    }\n\n    /**\n     * @return void\n     */\n    public function replace(array $attributes)\n    {\n        $this->getAttributeBag()->replace($attributes);\n    }\n\n    public function remove(string $name): mixed\n    {\n        return $this->getAttributeBag()->remove($name);\n    }\n\n    /**\n     * @return void\n     */\n    public function clear()\n    {\n        $this->getAttributeBag()->clear();\n    }\n\n    public function isStarted(): bool\n    {\n        return $this->storage->isStarted();\n    }\n\n    /**\n     * Returns an iterator for attributes.\n     *\n     * @return \\ArrayIterator<string, mixed>\n     */\n    public function getIterator(): \\ArrayIterator\n    {\n        return new \\ArrayIterator($this->getAttributeBag()->all());\n    }\n\n    /**\n     * Returns the number of attributes.\n     */\n    public function count(): int\n    {\n        return \\count($this->getAttributeBag()->all());\n    }\n\n    public function &getUsageIndex(): int\n    {\n        return $this->usageIndex;\n    }\n\n    /**\n     * @internal\n     */\n    public function isEmpty(): bool\n    {\n        if ($this->isStarted()) {\n            ++$this->usageIndex;\n            if ($this->usageReporter && 0 <= $this->usageIndex) {\n                ($this->usageReporter)();\n            }\n        }\n        foreach ($this->data as &$data) {\n            if (!empty($data)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    public function invalidate(?int $lifetime = null): bool\n    {\n        $this->storage->clear();\n\n        return $this->migrate(true, $lifetime);\n    }\n\n    public function migrate(bool $destroy = false, ?int $lifetime = null): bool\n    {\n        return $this->storage->regenerate($destroy, $lifetime);\n    }\n\n    /**\n     * @return void\n     */\n    public function save()\n    {\n        $this->storage->save();\n    }\n\n    public function getId(): string\n    {\n        return $this->storage->getId();\n    }\n\n    /**\n     * @return void\n     */\n    public function setId(string $id)\n    {\n        if ($this->storage->getId() !== $id) {\n            $this->storage->setId($id);\n        }\n    }\n\n    public function getName(): string\n    {\n        return $this->storage->getName();\n    }\n\n    /**\n     * @return void\n     */\n    public function setName(string $name)\n    {\n        $this->storage->setName($name);\n    }\n\n    public function getMetadataBag(): MetadataBag\n    {\n        ++$this->usageIndex;\n        if ($this->usageReporter && 0 <= $this->usageIndex) {\n            ($this->usageReporter)();\n        }\n\n        return $this->storage->getMetadataBag();\n    }\n\n    /**\n     * @return void\n     */\n    public function registerBag(SessionBagInterface $bag)\n    {\n        $this->storage->registerBag(new SessionBagProxy($bag, $this->data, $this->usageIndex, $this->usageReporter));\n    }\n\n    public function getBag(string $name): SessionBagInterface\n    {\n        $bag = $this->storage->getBag($name);\n\n        return method_exists($bag, 'getBag') ? $bag->getBag() : $bag;\n    }\n\n    /**\n     * Gets the flashbag interface.\n     */\n    public function getFlashBag(): FlashBagInterface\n    {\n        return $this->getBag($this->flashName);\n    }\n\n    /**\n     * Gets the attributebag interface.\n     *\n     * Note that this method was added to help with IDE autocompletion.\n     */\n    private function getAttributeBag(): AttributeBagInterface\n    {\n        return $this->getBag($this->attributeName);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionBagInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session;\n\n/**\n * Session Bag store.\n *\n * @author Drak <drak@zikula.org>\n */\ninterface SessionBagInterface\n{\n    /**\n     * Gets this bag's name.\n     */\n    public function getName(): string;\n\n    /**\n     * Initializes the Bag.\n     *\n     * @return void\n     */\n    public function initialize(array &$array);\n\n    /**\n     * Gets the storage key for this bag.\n     */\n    public function getStorageKey(): string;\n\n    /**\n     * Clears out data from bag.\n     *\n     * @return mixed Whatever data was contained\n     */\n    public function clear(): mixed;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionBagProxy.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nfinal class SessionBagProxy implements SessionBagInterface\n{\n    private SessionBagInterface $bag;\n    private array $data;\n    private ?int $usageIndex;\n    private ?\\Closure $usageReporter;\n\n    public function __construct(SessionBagInterface $bag, array &$data, ?int &$usageIndex, ?callable $usageReporter)\n    {\n        $this->bag = $bag;\n        $this->data = &$data;\n        $this->usageIndex = &$usageIndex;\n        $this->usageReporter = null === $usageReporter ? null : $usageReporter(...);\n    }\n\n    public function getBag(): SessionBagInterface\n    {\n        ++$this->usageIndex;\n        if ($this->usageReporter && 0 <= $this->usageIndex) {\n            ($this->usageReporter)();\n        }\n\n        return $this->bag;\n    }\n\n    public function isEmpty(): bool\n    {\n        if (!isset($this->data[$this->bag->getStorageKey()])) {\n            return true;\n        }\n        ++$this->usageIndex;\n        if ($this->usageReporter && 0 <= $this->usageIndex) {\n            ($this->usageReporter)();\n        }\n\n        return empty($this->data[$this->bag->getStorageKey()]);\n    }\n\n    public function getName(): string\n    {\n        return $this->bag->getName();\n    }\n\n    public function initialize(array &$array): void\n    {\n        ++$this->usageIndex;\n        if ($this->usageReporter && 0 <= $this->usageIndex) {\n            ($this->usageReporter)();\n        }\n\n        $this->data[$this->bag->getStorageKey()] = &$array;\n\n        $this->bag->initialize($array);\n    }\n\n    public function getStorageKey(): string\n    {\n        return $this->bag->getStorageKey();\n    }\n\n    public function clear(): mixed\n    {\n        return $this->bag->clear();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionFactory.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session;\n\nuse Symfony\\Component\\HttpFoundation\\RequestStack;\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageFactoryInterface;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(Session::class);\n\n/**\n * @author Jérémy Derussé <jeremy@derusse.com>\n */\nclass SessionFactory implements SessionFactoryInterface\n{\n    private RequestStack $requestStack;\n    private SessionStorageFactoryInterface $storageFactory;\n    private ?\\Closure $usageReporter;\n\n    public function __construct(RequestStack $requestStack, SessionStorageFactoryInterface $storageFactory, ?callable $usageReporter = null)\n    {\n        $this->requestStack = $requestStack;\n        $this->storageFactory = $storageFactory;\n        $this->usageReporter = null === $usageReporter ? null : $usageReporter(...);\n    }\n\n    public function createSession(): SessionInterface\n    {\n        return new Session($this->storageFactory->createStorage($this->requestStack->getMainRequest()), null, null, $this->usageReporter);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionFactoryInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session;\n\n/**\n * @author Kevin Bond <kevinbond@gmail.com>\n */\ninterface SessionFactoryInterface\n{\n    public function createSession(): SessionInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag;\n\n/**\n * Interface for the session.\n *\n * @author Drak <drak@zikula.org>\n */\ninterface SessionInterface\n{\n    /**\n     * Starts the session storage.\n     *\n     * @throws \\RuntimeException if session fails to start\n     */\n    public function start(): bool;\n\n    /**\n     * Returns the session ID.\n     */\n    public function getId(): string;\n\n    /**\n     * Sets the session ID.\n     *\n     * @return void\n     */\n    public function setId(string $id);\n\n    /**\n     * Returns the session name.\n     */\n    public function getName(): string;\n\n    /**\n     * Sets the session name.\n     *\n     * @return void\n     */\n    public function setName(string $name);\n\n    /**\n     * Invalidates the current session.\n     *\n     * Clears all session attributes and flashes and regenerates the\n     * session and deletes the old session from persistence.\n     *\n     * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value\n     *                           will leave the system settings unchanged, 0 sets the cookie\n     *                           to expire with browser session. Time is in seconds, and is\n     *                           not a Unix timestamp.\n     */\n    public function invalidate(?int $lifetime = null): bool;\n\n    /**\n     * Migrates the current session to a new session id while maintaining all\n     * session attributes.\n     *\n     * @param bool     $destroy  Whether to delete the old session or leave it to garbage collection\n     * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value\n     *                           will leave the system settings unchanged, 0 sets the cookie\n     *                           to expire with browser session. Time is in seconds, and is\n     *                           not a Unix timestamp.\n     */\n    public function migrate(bool $destroy = false, ?int $lifetime = null): bool;\n\n    /**\n     * Force the session to be saved and closed.\n     *\n     * This method is generally not required for real sessions as\n     * the session will be automatically saved at the end of\n     * code execution.\n     *\n     * @return void\n     */\n    public function save();\n\n    /**\n     * Checks if an attribute is defined.\n     */\n    public function has(string $name): bool;\n\n    /**\n     * Returns an attribute.\n     */\n    public function get(string $name, mixed $default = null): mixed;\n\n    /**\n     * Sets an attribute.\n     *\n     * @return void\n     */\n    public function set(string $name, mixed $value);\n\n    /**\n     * Returns attributes.\n     */\n    public function all(): array;\n\n    /**\n     * Sets attributes.\n     *\n     * @return void\n     */\n    public function replace(array $attributes);\n\n    /**\n     * Removes an attribute.\n     *\n     * @return mixed The removed value or null when it does not exist\n     */\n    public function remove(string $name): mixed;\n\n    /**\n     * Clears all attributes.\n     *\n     * @return void\n     */\n    public function clear();\n\n    /**\n     * Checks if the session was started.\n     */\n    public function isStarted(): bool;\n\n    /**\n     * Registers a SessionBagInterface with the session.\n     *\n     * @return void\n     */\n    public function registerBag(SessionBagInterface $bag);\n\n    /**\n     * Gets a bag instance by name.\n     */\n    public function getBag(string $name): SessionBagInterface;\n\n    /**\n     * Gets session meta.\n     */\n    public function getMetadataBag(): MetadataBag;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionUtils.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session;\n\n/**\n * Session utility functions.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Rémon van de Kamp <rpkamp@gmail.com>\n *\n * @internal\n */\nfinal class SessionUtils\n{\n    /**\n     * Finds the session header amongst the headers that are to be sent, removes it, and returns\n     * it so the caller can process it further.\n     */\n    public static function popSessionCookie(string $sessionName, #[\\SensitiveParameter] string $sessionId): ?string\n    {\n        $sessionCookie = null;\n        $sessionCookiePrefix = sprintf(' %s=', urlencode($sessionName));\n        $sessionCookieWithId = sprintf('%s%s;', $sessionCookiePrefix, urlencode($sessionId));\n        $otherCookies = [];\n        foreach (headers_list() as $h) {\n            if (0 !== stripos($h, 'Set-Cookie:')) {\n                continue;\n            }\n            if (11 === strpos($h, $sessionCookiePrefix, 11)) {\n                $sessionCookie = $h;\n\n                if (11 !== strpos($h, $sessionCookieWithId, 11)) {\n                    $otherCookies[] = $h;\n                }\n            } else {\n                $otherCookies[] = $h;\n            }\n        }\n        if (null === $sessionCookie) {\n            return null;\n        }\n\n        header_remove('Set-Cookie');\n        foreach ($otherCookies as $h) {\n            header($h, false);\n        }\n\n        return $sessionCookie;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\SessionUtils;\n\n/**\n * This abstract session handler provides a generic implementation\n * of the PHP 7.0 SessionUpdateTimestampHandlerInterface,\n * enabling strict and lazy session handling.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nabstract class AbstractSessionHandler implements \\SessionHandlerInterface, \\SessionUpdateTimestampHandlerInterface\n{\n    private string $sessionName;\n    private string $prefetchId;\n    private string $prefetchData;\n    private ?string $newSessionId = null;\n    private string $igbinaryEmptyData;\n\n    public function open(string $savePath, string $sessionName): bool\n    {\n        $this->sessionName = $sessionName;\n        if (!headers_sent() && !\\ini_get('session.cache_limiter') && '0' !== \\ini_get('session.cache_limiter')) {\n            header(sprintf('Cache-Control: max-age=%d, private, must-revalidate', 60 * (int) \\ini_get('session.cache_expire')));\n        }\n\n        return true;\n    }\n\n    abstract protected function doRead(#[\\SensitiveParameter] string $sessionId): string;\n\n    abstract protected function doWrite(#[\\SensitiveParameter] string $sessionId, string $data): bool;\n\n    abstract protected function doDestroy(#[\\SensitiveParameter] string $sessionId): bool;\n\n    public function validateId(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        $this->prefetchData = $this->read($sessionId);\n        $this->prefetchId = $sessionId;\n\n        return '' !== $this->prefetchData;\n    }\n\n    public function read(#[\\SensitiveParameter] string $sessionId): string\n    {\n        if (isset($this->prefetchId)) {\n            $prefetchId = $this->prefetchId;\n            $prefetchData = $this->prefetchData;\n            unset($this->prefetchId, $this->prefetchData);\n\n            if ($prefetchId === $sessionId || '' === $prefetchData) {\n                $this->newSessionId = '' === $prefetchData ? $sessionId : null;\n\n                return $prefetchData;\n            }\n        }\n\n        $data = $this->doRead($sessionId);\n        $this->newSessionId = '' === $data ? $sessionId : null;\n\n        return $data;\n    }\n\n    public function write(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        // see https://github.com/igbinary/igbinary/issues/146\n        $this->igbinaryEmptyData ??= \\function_exists('igbinary_serialize') ? igbinary_serialize([]) : '';\n        if ('' === $data || $this->igbinaryEmptyData === $data) {\n            return $this->destroy($sessionId);\n        }\n        $this->newSessionId = null;\n\n        return $this->doWrite($sessionId, $data);\n    }\n\n    public function destroy(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        if (!headers_sent() && filter_var(\\ini_get('session.use_cookies'), \\FILTER_VALIDATE_BOOL)) {\n            if (!isset($this->sessionName)) {\n                throw new \\LogicException(sprintf('Session name cannot be empty, did you forget to call \"parent::open()\" in \"%s\"?.', static::class));\n            }\n            $cookie = SessionUtils::popSessionCookie($this->sessionName, $sessionId);\n\n            /*\n             * We send an invalidation Set-Cookie header (zero lifetime)\n             * when either the session was started or a cookie with\n             * the session name was sent by the client (in which case\n             * we know it's invalid as a valid session cookie would've\n             * started the session).\n             */\n            if (null === $cookie || isset($_COOKIE[$this->sessionName])) {\n                $params = session_get_cookie_params();\n                unset($params['lifetime']);\n                setcookie($this->sessionName, '', $params);\n            }\n        }\n\n        return $this->newSessionId === $sessionId || $this->doDestroy($sessionId);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\n\n/**\n * @author Ahmed TAILOULOUTE <ahmed.tailouloute@gmail.com>\n */\nclass IdentityMarshaller implements MarshallerInterface\n{\n    public function marshall(array $values, ?array &$failed): array\n    {\n        foreach ($values as $key => $value) {\n            if (!\\is_string($value)) {\n                throw new \\LogicException(sprintf('%s accepts only string as data.', __METHOD__));\n            }\n        }\n\n        return $values;\n    }\n\n    public function unmarshall(string $value): string\n    {\n        return $value;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\nuse Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface;\n\n/**\n * @author Ahmed TAILOULOUTE <ahmed.tailouloute@gmail.com>\n */\nclass MarshallingSessionHandler implements \\SessionHandlerInterface, \\SessionUpdateTimestampHandlerInterface\n{\n    private AbstractSessionHandler $handler;\n    private MarshallerInterface $marshaller;\n\n    public function __construct(AbstractSessionHandler $handler, MarshallerInterface $marshaller)\n    {\n        $this->handler = $handler;\n        $this->marshaller = $marshaller;\n    }\n\n    public function open(string $savePath, string $name): bool\n    {\n        return $this->handler->open($savePath, $name);\n    }\n\n    public function close(): bool\n    {\n        return $this->handler->close();\n    }\n\n    public function destroy(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        return $this->handler->destroy($sessionId);\n    }\n\n    public function gc(int $maxlifetime): int|false\n    {\n        return $this->handler->gc($maxlifetime);\n    }\n\n    public function read(#[\\SensitiveParameter] string $sessionId): string\n    {\n        return $this->marshaller->unmarshall($this->handler->read($sessionId));\n    }\n\n    public function write(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        $failed = [];\n        $marshalledData = $this->marshaller->marshall(['data' => $data], $failed);\n\n        if (isset($failed['data'])) {\n            return false;\n        }\n\n        return $this->handler->write($sessionId, $marshalledData['data']);\n    }\n\n    public function validateId(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        return $this->handler->validateId($sessionId);\n    }\n\n    public function updateTimestamp(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        return $this->handler->updateTimestamp($sessionId, $data);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\n/**\n * Memcached based session storage handler based on the Memcached class\n * provided by the PHP memcached extension.\n *\n * @see https://php.net/memcached\n *\n * @author Drak <drak@zikula.org>\n */\nclass MemcachedSessionHandler extends AbstractSessionHandler\n{\n    private \\Memcached $memcached;\n\n    /**\n     * Time to live in seconds.\n     */\n    private int|\\Closure|null $ttl;\n\n    /**\n     * Key prefix for shared environments.\n     */\n    private string $prefix;\n\n    /**\n     * Constructor.\n     *\n     * List of available options:\n     *  * prefix: The prefix to use for the memcached keys in order to avoid collision\n     *  * ttl: The time to live in seconds.\n     *\n     * @throws \\InvalidArgumentException When unsupported options are passed\n     */\n    public function __construct(\\Memcached $memcached, array $options = [])\n    {\n        $this->memcached = $memcached;\n\n        if ($diff = array_diff(array_keys($options), ['prefix', 'expiretime', 'ttl'])) {\n            throw new \\InvalidArgumentException(sprintf('The following options are not supported \"%s\".', implode(', ', $diff)));\n        }\n\n        $this->ttl = $options['expiretime'] ?? $options['ttl'] ?? null;\n        $this->prefix = $options['prefix'] ?? 'sf2s';\n    }\n\n    public function close(): bool\n    {\n        return $this->memcached->quit();\n    }\n\n    protected function doRead(#[\\SensitiveParameter] string $sessionId): string\n    {\n        return $this->memcached->get($this->prefix.$sessionId) ?: '';\n    }\n\n    public function updateTimestamp(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        $this->memcached->touch($this->prefix.$sessionId, $this->getCompatibleTtl());\n\n        return true;\n    }\n\n    protected function doWrite(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        return $this->memcached->set($this->prefix.$sessionId, $data, $this->getCompatibleTtl());\n    }\n\n    private function getCompatibleTtl(): int\n    {\n        $ttl = ($this->ttl instanceof \\Closure ? ($this->ttl)() : $this->ttl) ?? \\ini_get('session.gc_maxlifetime');\n\n        // If the relative TTL that is used exceeds 30 days, memcached will treat the value as Unix time.\n        // We have to convert it to an absolute Unix time at this point, to make sure the TTL is correct.\n        if ($ttl > 60 * 60 * 24 * 30) {\n            $ttl += time();\n        }\n\n        return $ttl;\n    }\n\n    protected function doDestroy(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        $result = $this->memcached->delete($this->prefix.$sessionId);\n\n        return $result || \\Memcached::RES_NOTFOUND == $this->memcached->getResultCode();\n    }\n\n    public function gc(int $maxlifetime): int|false\n    {\n        // not required here because memcached will auto expire the records anyhow.\n        return 0;\n    }\n\n    /**\n     * Return a Memcached instance.\n     */\n    protected function getMemcached(): \\Memcached\n    {\n        return $this->memcached;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\n/**\n * Migrating session handler for migrating from one handler to another. It reads\n * from the current handler and writes both the current and new ones.\n *\n * It ignores errors from the new handler.\n *\n * @author Ross Motley <ross.motley@amara.com>\n * @author Oliver Radwell <oliver.radwell@amara.com>\n */\nclass MigratingSessionHandler implements \\SessionHandlerInterface, \\SessionUpdateTimestampHandlerInterface\n{\n    private \\SessionHandlerInterface&\\SessionUpdateTimestampHandlerInterface $currentHandler;\n    private \\SessionHandlerInterface&\\SessionUpdateTimestampHandlerInterface $writeOnlyHandler;\n\n    public function __construct(\\SessionHandlerInterface $currentHandler, \\SessionHandlerInterface $writeOnlyHandler)\n    {\n        if (!$currentHandler instanceof \\SessionUpdateTimestampHandlerInterface) {\n            $currentHandler = new StrictSessionHandler($currentHandler);\n        }\n        if (!$writeOnlyHandler instanceof \\SessionUpdateTimestampHandlerInterface) {\n            $writeOnlyHandler = new StrictSessionHandler($writeOnlyHandler);\n        }\n\n        $this->currentHandler = $currentHandler;\n        $this->writeOnlyHandler = $writeOnlyHandler;\n    }\n\n    public function close(): bool\n    {\n        $result = $this->currentHandler->close();\n        $this->writeOnlyHandler->close();\n\n        return $result;\n    }\n\n    public function destroy(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        $result = $this->currentHandler->destroy($sessionId);\n        $this->writeOnlyHandler->destroy($sessionId);\n\n        return $result;\n    }\n\n    public function gc(int $maxlifetime): int|false\n    {\n        $result = $this->currentHandler->gc($maxlifetime);\n        $this->writeOnlyHandler->gc($maxlifetime);\n\n        return $result;\n    }\n\n    public function open(string $savePath, string $sessionName): bool\n    {\n        $result = $this->currentHandler->open($savePath, $sessionName);\n        $this->writeOnlyHandler->open($savePath, $sessionName);\n\n        return $result;\n    }\n\n    public function read(#[\\SensitiveParameter] string $sessionId): string\n    {\n        // No reading from new handler until switch-over\n        return $this->currentHandler->read($sessionId);\n    }\n\n    public function write(#[\\SensitiveParameter] string $sessionId, string $sessionData): bool\n    {\n        $result = $this->currentHandler->write($sessionId, $sessionData);\n        $this->writeOnlyHandler->write($sessionId, $sessionData);\n\n        return $result;\n    }\n\n    public function validateId(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        // No reading from new handler until switch-over\n        return $this->currentHandler->validateId($sessionId);\n    }\n\n    public function updateTimestamp(#[\\SensitiveParameter] string $sessionId, string $sessionData): bool\n    {\n        $result = $this->currentHandler->updateTimestamp($sessionId, $sessionData);\n        $this->writeOnlyHandler->updateTimestamp($sessionId, $sessionData);\n\n        return $result;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\nuse MongoDB\\BSON\\Binary;\nuse MongoDB\\BSON\\UTCDateTime;\nuse MongoDB\\Client;\nuse MongoDB\\Driver\\BulkWrite;\nuse MongoDB\\Driver\\Manager;\nuse MongoDB\\Driver\\Query;\n\n/**\n * Session handler using the MongoDB driver extension.\n *\n * @author Markus Bachmann <markus.bachmann@bachi.biz>\n * @author Jérôme Tamarelle <jerome@tamarelle.net>\n *\n * @see https://php.net/mongodb\n */\nclass MongoDbSessionHandler extends AbstractSessionHandler\n{\n    private Manager $manager;\n    private string $namespace;\n    private array $options;\n    private int|\\Closure|null $ttl;\n\n    /**\n     * Constructor.\n     *\n     * List of available options:\n     *  * database: The name of the database [required]\n     *  * collection: The name of the collection [required]\n     *  * id_field: The field name for storing the session id [default: _id]\n     *  * data_field: The field name for storing the session data [default: data]\n     *  * time_field: The field name for storing the timestamp [default: time]\n     *  * expiry_field: The field name for storing the expiry-timestamp [default: expires_at]\n     *  * ttl: The time to live in seconds.\n     *\n     * It is strongly recommended to put an index on the `expiry_field` for\n     * garbage-collection. Alternatively it's possible to automatically expire\n     * the sessions in the database as described below:\n     *\n     * A TTL collections can be used on MongoDB 2.2+ to cleanup expired sessions\n     * automatically. Such an index can for example look like this:\n     *\n     *     db.<session-collection>.createIndex(\n     *         { \"<expiry-field>\": 1 },\n     *         { \"expireAfterSeconds\": 0 }\n     *     )\n     *\n     * More details on: https://docs.mongodb.org/manual/tutorial/expire-data/\n     *\n     * If you use such an index, you can drop `gc_probability` to 0 since\n     * no garbage-collection is required.\n     *\n     * @throws \\InvalidArgumentException When \"database\" or \"collection\" not provided\n     */\n    public function __construct(Client|Manager $mongo, array $options)\n    {\n        if (!isset($options['database']) || !isset($options['collection'])) {\n            throw new \\InvalidArgumentException('You must provide the \"database\" and \"collection\" option for MongoDBSessionHandler.');\n        }\n\n        if ($mongo instanceof Client) {\n            $mongo = $mongo->getManager();\n        }\n\n        $this->manager = $mongo;\n        $this->namespace = $options['database'].'.'.$options['collection'];\n\n        $this->options = array_merge([\n            'id_field' => '_id',\n            'data_field' => 'data',\n            'time_field' => 'time',\n            'expiry_field' => 'expires_at',\n        ], $options);\n        $this->ttl = $this->options['ttl'] ?? null;\n    }\n\n    public function close(): bool\n    {\n        return true;\n    }\n\n    protected function doDestroy(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        $write = new BulkWrite();\n        $write->delete(\n            [$this->options['id_field'] => $sessionId],\n            ['limit' => 1]\n        );\n\n        $this->manager->executeBulkWrite($this->namespace, $write);\n\n        return true;\n    }\n\n    public function gc(int $maxlifetime): int|false\n    {\n        $write = new BulkWrite();\n        $write->delete(\n            [$this->options['expiry_field'] => ['$lt' => $this->getUTCDateTime()]],\n        );\n        $result = $this->manager->executeBulkWrite($this->namespace, $write);\n\n        return $result->getDeletedCount() ?? false;\n    }\n\n    protected function doWrite(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        $ttl = ($this->ttl instanceof \\Closure ? ($this->ttl)() : $this->ttl) ?? \\ini_get('session.gc_maxlifetime');\n        $expiry = $this->getUTCDateTime($ttl);\n\n        $fields = [\n            $this->options['time_field'] => $this->getUTCDateTime(),\n            $this->options['expiry_field'] => $expiry,\n            $this->options['data_field'] => new Binary($data, Binary::TYPE_GENERIC),\n        ];\n\n        $write = new BulkWrite();\n        $write->update(\n            [$this->options['id_field'] => $sessionId],\n            ['$set' => $fields],\n            ['upsert' => true]\n        );\n\n        $this->manager->executeBulkWrite($this->namespace, $write);\n\n        return true;\n    }\n\n    public function updateTimestamp(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        $ttl = ($this->ttl instanceof \\Closure ? ($this->ttl)() : $this->ttl) ?? \\ini_get('session.gc_maxlifetime');\n        $expiry = $this->getUTCDateTime($ttl);\n\n        $write = new BulkWrite();\n        $write->update(\n            [$this->options['id_field'] => $sessionId],\n            ['$set' => [\n                $this->options['time_field'] => $this->getUTCDateTime(),\n                $this->options['expiry_field'] => $expiry,\n            ]],\n            ['multi' => false],\n        );\n\n        $this->manager->executeBulkWrite($this->namespace, $write);\n\n        return true;\n    }\n\n    protected function doRead(#[\\SensitiveParameter] string $sessionId): string\n    {\n        $cursor = $this->manager->executeQuery($this->namespace, new Query([\n            $this->options['id_field'] => $sessionId,\n            $this->options['expiry_field'] => ['$gte' => $this->getUTCDateTime()],\n        ], [\n            'projection' => [\n                '_id' => false,\n                $this->options['data_field'] => true,\n            ],\n            'limit' => 1,\n        ]));\n\n        foreach ($cursor as $document) {\n            return (string) $document->{$this->options['data_field']} ?? '';\n        }\n\n        // Not found\n        return '';\n    }\n\n    private function getUTCDateTime(int $additionalSeconds = 0): UTCDateTime\n    {\n        return new UTCDateTime((time() + $additionalSeconds) * 1000);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\n/**\n * Native session handler using PHP's built in file storage.\n *\n * @author Drak <drak@zikula.org>\n */\nclass NativeFileSessionHandler extends \\SessionHandler\n{\n    /**\n     * @param string|null $savePath Path of directory to save session files\n     *                              Default null will leave setting as defined by PHP.\n     *                              '/path', 'N;/path', or 'N;octal-mode;/path\n     *\n     * @see https://php.net/session.configuration#ini.session.save-path for further details.\n     *\n     * @throws \\InvalidArgumentException On invalid $savePath\n     * @throws \\RuntimeException         When failing to create the save directory\n     */\n    public function __construct(?string $savePath = null)\n    {\n        $baseDir = $savePath ??= \\ini_get('session.save_path');\n\n        if ($count = substr_count($savePath, ';')) {\n            if ($count > 2) {\n                throw new \\InvalidArgumentException(sprintf('Invalid argument $savePath \\'%s\\'.', $savePath));\n            }\n\n            // characters after last ';' are the path\n            $baseDir = ltrim(strrchr($savePath, ';'), ';');\n        }\n\n        if ($baseDir && !is_dir($baseDir) && !@mkdir($baseDir, 0777, true) && !is_dir($baseDir)) {\n            throw new \\RuntimeException(sprintf('Session Storage was not able to create directory \"%s\".', $baseDir));\n        }\n\n        if ($savePath !== \\ini_get('session.save_path')) {\n            ini_set('session.save_path', $savePath);\n        }\n        if ('files' !== \\ini_get('session.save_handler')) {\n            ini_set('session.save_handler', 'files');\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\n/**\n * Can be used in unit testing or in a situations where persisted sessions are not desired.\n *\n * @author Drak <drak@zikula.org>\n */\nclass NullSessionHandler extends AbstractSessionHandler\n{\n    public function close(): bool\n    {\n        return true;\n    }\n\n    public function validateId(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        return true;\n    }\n\n    protected function doRead(#[\\SensitiveParameter] string $sessionId): string\n    {\n        return '';\n    }\n\n    public function updateTimestamp(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        return true;\n    }\n\n    protected function doWrite(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        return true;\n    }\n\n    protected function doDestroy(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        return true;\n    }\n\n    public function gc(int $maxlifetime): int|false\n    {\n        return 0;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\nuse Doctrine\\DBAL\\Schema\\Schema;\nuse Doctrine\\DBAL\\Types\\Types;\n\n/**\n * Session handler using a PDO connection to read and write data.\n *\n * It works with MySQL, PostgreSQL, Oracle, SQL Server and SQLite and implements\n * different locking strategies to handle concurrent access to the same session.\n * Locking is necessary to prevent loss of data due to race conditions and to keep\n * the session data consistent between read() and write(). With locking, requests\n * for the same session will wait until the other one finished writing. For this\n * reason it's best practice to close a session as early as possible to improve\n * concurrency. PHPs internal files session handler also implements locking.\n *\n * Attention: Since SQLite does not support row level locks but locks the whole database,\n * it means only one session can be accessed at a time. Even different sessions would wait\n * for another to finish. So saving session in SQLite should only be considered for\n * development or prototypes.\n *\n * Session data is a binary string that can contain non-printable characters like the null byte.\n * For this reason it must be saved in a binary column in the database like BLOB in MySQL.\n * Saving it in a character column could corrupt the data. You can use createTable()\n * to initialize a correctly defined table.\n *\n * @see https://php.net/sessionhandlerinterface\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Michael Williams <michael.williams@funsational.com>\n * @author Tobias Schultze <http://tobion.de>\n */\nclass PdoSessionHandler extends AbstractSessionHandler\n{\n    /**\n     * No locking is done. This means sessions are prone to loss of data due to\n     * race conditions of concurrent requests to the same session. The last session\n     * write will win in this case. It might be useful when you implement your own\n     * logic to deal with this like an optimistic approach.\n     */\n    public const LOCK_NONE = 0;\n\n    /**\n     * Creates an application-level lock on a session. The disadvantage is that the\n     * lock is not enforced by the database and thus other, unaware parts of the\n     * application could still concurrently modify the session. The advantage is it\n     * does not require a transaction.\n     * This mode is not available for SQLite and not yet implemented for oci and sqlsrv.\n     */\n    public const LOCK_ADVISORY = 1;\n\n    /**\n     * Issues a real row lock. Since it uses a transaction between opening and\n     * closing a session, you have to be careful when you use same database connection\n     * that you also use for your application logic. This mode is the default because\n     * it's the only reliable solution across DBMSs.\n     */\n    public const LOCK_TRANSACTIONAL = 2;\n\n    private \\PDO $pdo;\n\n    /**\n     * DSN string or null for session.save_path or false when lazy connection disabled.\n     */\n    private string|false|null $dsn = false;\n\n    private string $driver;\n    private string $table = 'sessions';\n    private string $idCol = 'sess_id';\n    private string $dataCol = 'sess_data';\n    private string $lifetimeCol = 'sess_lifetime';\n    private string $timeCol = 'sess_time';\n\n    /**\n     * Time to live in seconds.\n     */\n    private int|\\Closure|null $ttl;\n\n    /**\n     * Username when lazy-connect.\n     */\n    private ?string $username = null;\n\n    /**\n     * Password when lazy-connect.\n     */\n    private ?string $password = null;\n\n    /**\n     * Connection options when lazy-connect.\n     */\n    private array $connectionOptions = [];\n\n    /**\n     * The strategy for locking, see constants.\n     */\n    private int $lockMode = self::LOCK_TRANSACTIONAL;\n\n    /**\n     * It's an array to support multiple reads before closing which is manual, non-standard usage.\n     *\n     * @var \\PDOStatement[] An array of statements to release advisory locks\n     */\n    private array $unlockStatements = [];\n\n    /**\n     * True when the current session exists but expired according to session.gc_maxlifetime.\n     */\n    private bool $sessionExpired = false;\n\n    /**\n     * Whether a transaction is active.\n     */\n    private bool $inTransaction = false;\n\n    /**\n     * Whether gc() has been called.\n     */\n    private bool $gcCalled = false;\n\n    /**\n     * You can either pass an existing database connection as PDO instance or\n     * pass a DSN string that will be used to lazy-connect to the database\n     * when the session is actually used. Furthermore it's possible to pass null\n     * which will then use the session.save_path ini setting as PDO DSN parameter.\n     *\n     * List of available options:\n     *  * db_table: The name of the table [default: sessions]\n     *  * db_id_col: The column where to store the session id [default: sess_id]\n     *  * db_data_col: The column where to store the session data [default: sess_data]\n     *  * db_lifetime_col: The column where to store the lifetime [default: sess_lifetime]\n     *  * db_time_col: The column where to store the timestamp [default: sess_time]\n     *  * db_username: The username when lazy-connect [default: '']\n     *  * db_password: The password when lazy-connect [default: '']\n     *  * db_connection_options: An array of driver-specific connection options [default: []]\n     *  * lock_mode: The strategy for locking, see constants [default: LOCK_TRANSACTIONAL]\n     *  * ttl: The time to live in seconds.\n     *\n     * @param \\PDO|string|null $pdoOrDsn A \\PDO instance or DSN string or URL string or null\n     *\n     * @throws \\InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION\n     */\n    public function __construct(#[\\SensitiveParameter] \\PDO|string|null $pdoOrDsn = null, #[\\SensitiveParameter] array $options = [])\n    {\n        if ($pdoOrDsn instanceof \\PDO) {\n            if (\\PDO::ERRMODE_EXCEPTION !== $pdoOrDsn->getAttribute(\\PDO::ATTR_ERRMODE)) {\n                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__));\n            }\n\n            $this->pdo = $pdoOrDsn;\n            $this->driver = $this->pdo->getAttribute(\\PDO::ATTR_DRIVER_NAME);\n        } elseif (\\is_string($pdoOrDsn) && str_contains($pdoOrDsn, '://')) {\n            $this->dsn = $this->buildDsnFromUrl($pdoOrDsn);\n        } else {\n            $this->dsn = $pdoOrDsn;\n        }\n\n        $this->table = $options['db_table'] ?? $this->table;\n        $this->idCol = $options['db_id_col'] ?? $this->idCol;\n        $this->dataCol = $options['db_data_col'] ?? $this->dataCol;\n        $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol;\n        $this->timeCol = $options['db_time_col'] ?? $this->timeCol;\n        $this->username = $options['db_username'] ?? $this->username;\n        $this->password = $options['db_password'] ?? $this->password;\n        $this->connectionOptions = $options['db_connection_options'] ?? $this->connectionOptions;\n        $this->lockMode = $options['lock_mode'] ?? $this->lockMode;\n        $this->ttl = $options['ttl'] ?? null;\n    }\n\n    /**\n     * Adds the Table to the Schema if it doesn't exist.\n     */\n    public function configureSchema(Schema $schema, ?\\Closure $isSameDatabase = null): void\n    {\n        if ($schema->hasTable($this->table) || ($isSameDatabase && !$isSameDatabase($this->getConnection()->exec(...)))) {\n            return;\n        }\n\n        $table = $schema->createTable($this->table);\n        switch ($this->driver) {\n            case 'mysql':\n                $table->addColumn($this->idCol, Types::BINARY)->setLength(128)->setNotnull(true);\n                $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true);\n                $table->addColumn($this->lifetimeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true);\n                $table->addColumn($this->timeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true);\n                $table->addOption('collate', 'utf8mb4_bin');\n                $table->addOption('engine', 'InnoDB');\n                break;\n            case 'sqlite':\n                $table->addColumn($this->idCol, Types::TEXT)->setNotnull(true);\n                $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true);\n                $table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true);\n                $table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true);\n                break;\n            case 'pgsql':\n                $table->addColumn($this->idCol, Types::STRING)->setLength(128)->setNotnull(true);\n                $table->addColumn($this->dataCol, Types::BINARY)->setNotnull(true);\n                $table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true);\n                $table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true);\n                break;\n            case 'oci':\n                $table->addColumn($this->idCol, Types::STRING)->setLength(128)->setNotnull(true);\n                $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true);\n                $table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true);\n                $table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true);\n                break;\n            case 'sqlsrv':\n                $table->addColumn($this->idCol, Types::TEXT)->setLength(128)->setNotnull(true);\n                $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true);\n                $table->addColumn($this->lifetimeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true);\n                $table->addColumn($this->timeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true);\n                break;\n            default:\n                throw new \\DomainException(sprintf('Creating the session table is currently not implemented for PDO driver \"%s\".', $this->driver));\n        }\n        $table->setPrimaryKey([$this->idCol]);\n        $table->addIndex([$this->lifetimeCol], $this->lifetimeCol.'_idx');\n    }\n\n    /**\n     * Creates the table to store sessions which can be called once for setup.\n     *\n     * Session ID is saved in a column of maximum length 128 because that is enough even\n     * for a 512 bit configured session.hash_function like Whirlpool. Session data is\n     * saved in a BLOB. One could also use a shorter inlined varbinary column\n     * if one was sure the data fits into it.\n     *\n     * @return void\n     *\n     * @throws \\PDOException    When the table already exists\n     * @throws \\DomainException When an unsupported PDO driver is used\n     */\n    public function createTable()\n    {\n        // connect if we are not yet\n        $this->getConnection();\n\n        $sql = match ($this->driver) {\n            // We use varbinary for the ID column because it prevents unwanted conversions:\n            // - character set conversions between server and client\n            // - trailing space removal\n            // - case-insensitivity\n            // - language processing like é == e\n            '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\",\n            '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)\",\n            '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)\",\n            '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)\",\n            '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)\",\n            default => throw new \\DomainException(sprintf('Creating the session table is currently not implemented for PDO driver \"%s\".', $this->driver)),\n        };\n\n        try {\n            $this->pdo->exec($sql);\n            $this->pdo->exec(\"CREATE INDEX {$this->lifetimeCol}_idx ON $this->table ($this->lifetimeCol)\");\n        } catch (\\PDOException $e) {\n            $this->rollback();\n\n            throw $e;\n        }\n    }\n\n    /**\n     * Returns true when the current session exists but expired according to session.gc_maxlifetime.\n     *\n     * Can be used to distinguish between a new session and one that expired due to inactivity.\n     */\n    public function isSessionExpired(): bool\n    {\n        return $this->sessionExpired;\n    }\n\n    public function open(string $savePath, string $sessionName): bool\n    {\n        $this->sessionExpired = false;\n\n        if (!isset($this->pdo)) {\n            $this->connect($this->dsn ?: $savePath);\n        }\n\n        return parent::open($savePath, $sessionName);\n    }\n\n    public function read(#[\\SensitiveParameter] string $sessionId): string\n    {\n        try {\n            return parent::read($sessionId);\n        } catch (\\PDOException $e) {\n            $this->rollback();\n\n            throw $e;\n        }\n    }\n\n    public function gc(int $maxlifetime): int|false\n    {\n        // We delay gc() to close() so that it is executed outside the transactional and blocking read-write process.\n        // This way, pruning expired sessions does not block them from being started while the current session is used.\n        $this->gcCalled = true;\n\n        return 0;\n    }\n\n    protected function doDestroy(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        // delete the record associated with this id\n        $sql = \"DELETE FROM $this->table WHERE $this->idCol = :id\";\n\n        try {\n            $stmt = $this->pdo->prepare($sql);\n            $stmt->bindParam(':id', $sessionId, \\PDO::PARAM_STR);\n            $stmt->execute();\n        } catch (\\PDOException $e) {\n            $this->rollback();\n\n            throw $e;\n        }\n\n        return true;\n    }\n\n    protected function doWrite(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        $maxlifetime = (int) (($this->ttl instanceof \\Closure ? ($this->ttl)() : $this->ttl) ?? \\ini_get('session.gc_maxlifetime'));\n\n        try {\n            // We use a single MERGE SQL query when supported by the database.\n            $mergeStmt = $this->getMergeStatement($sessionId, $data, $maxlifetime);\n            if (null !== $mergeStmt) {\n                $mergeStmt->execute();\n\n                return true;\n            }\n\n            $updateStmt = $this->getUpdateStatement($sessionId, $data, $maxlifetime);\n            $updateStmt->execute();\n\n            // When MERGE is not supported, like in Postgres < 9.5, we have to use this approach that can result in\n            // duplicate key errors when the same session is written simultaneously (given the LOCK_NONE behavior).\n            // We can just catch such an error and re-execute the update. This is similar to a serializable\n            // transaction with retry logic on serialization failures but without the overhead and without possible\n            // false positives due to longer gap locking.\n            if (!$updateStmt->rowCount()) {\n                try {\n                    $insertStmt = $this->getInsertStatement($sessionId, $data, $maxlifetime);\n                    $insertStmt->execute();\n                } catch (\\PDOException $e) {\n                    // Handle integrity violation SQLSTATE 23000 (or a subclass like 23505 in Postgres) for duplicate keys\n                    if (str_starts_with($e->getCode(), '23')) {\n                        $updateStmt->execute();\n                    } else {\n                        throw $e;\n                    }\n                }\n            }\n        } catch (\\PDOException $e) {\n            $this->rollback();\n\n            throw $e;\n        }\n\n        return true;\n    }\n\n    public function updateTimestamp(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        $expiry = time() + (int) (($this->ttl instanceof \\Closure ? ($this->ttl)() : $this->ttl) ?? \\ini_get('session.gc_maxlifetime'));\n\n        try {\n            $updateStmt = $this->pdo->prepare(\n                \"UPDATE $this->table SET $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id\"\n            );\n            $updateStmt->bindValue(':id', $sessionId, \\PDO::PARAM_STR);\n            $updateStmt->bindValue(':expiry', $expiry, \\PDO::PARAM_INT);\n            $updateStmt->bindValue(':time', time(), \\PDO::PARAM_INT);\n            $updateStmt->execute();\n        } catch (\\PDOException $e) {\n            $this->rollback();\n\n            throw $e;\n        }\n\n        return true;\n    }\n\n    public function close(): bool\n    {\n        $this->commit();\n\n        while ($unlockStmt = array_shift($this->unlockStatements)) {\n            $unlockStmt->execute();\n        }\n\n        if ($this->gcCalled) {\n            $this->gcCalled = false;\n\n            // delete the session records that have expired\n            $sql = \"DELETE FROM $this->table WHERE $this->lifetimeCol < :time\";\n            $stmt = $this->pdo->prepare($sql);\n            $stmt->bindValue(':time', time(), \\PDO::PARAM_INT);\n            $stmt->execute();\n        }\n\n        if (false !== $this->dsn) {\n            unset($this->pdo, $this->driver); // only close lazy-connection\n        }\n\n        return true;\n    }\n\n    /**\n     * Lazy-connects to the database.\n     */\n    private function connect(#[\\SensitiveParameter] string $dsn): void\n    {\n        $this->pdo = new \\PDO($dsn, $this->username, $this->password, $this->connectionOptions);\n        $this->pdo->setAttribute(\\PDO::ATTR_ERRMODE, \\PDO::ERRMODE_EXCEPTION);\n        $this->driver = $this->pdo->getAttribute(\\PDO::ATTR_DRIVER_NAME);\n    }\n\n    /**\n     * Builds a PDO DSN from a URL-like connection string.\n     *\n     * @todo implement missing support for oci DSN (which look totally different from other PDO ones)\n     */\n    private function buildDsnFromUrl(#[\\SensitiveParameter] string $dsnOrUrl): string\n    {\n        // (pdo_)?sqlite3?:///... => (pdo_)?sqlite3?://localhost/... or else the URL will be invalid\n        $url = preg_replace('#^((?:pdo_)?sqlite3?):///#', '$1://localhost/', $dsnOrUrl);\n\n        $params = parse_url($url);\n\n        if (false === $params) {\n            return $dsnOrUrl; // If the URL is not valid, let's assume it might be a DSN already.\n        }\n\n        $params = array_map('rawurldecode', $params);\n\n        // Override the default username and password. Values passed through options will still win over these in the constructor.\n        if (isset($params['user'])) {\n            $this->username = $params['user'];\n        }\n\n        if (isset($params['pass'])) {\n            $this->password = $params['pass'];\n        }\n\n        if (!isset($params['scheme'])) {\n            throw new \\InvalidArgumentException('URLs without scheme are not supported to configure the PdoSessionHandler.');\n        }\n\n        $driverAliasMap = [\n            'mssql' => 'sqlsrv',\n            'mysql2' => 'mysql', // Amazon RDS, for some weird reason\n            'postgres' => 'pgsql',\n            'postgresql' => 'pgsql',\n            'sqlite3' => 'sqlite',\n        ];\n\n        $driver = $driverAliasMap[$params['scheme']] ?? $params['scheme'];\n\n        // Doctrine DBAL supports passing its internal pdo_* driver names directly too (allowing both dashes and underscores). This allows supporting the same here.\n        if (str_starts_with($driver, 'pdo_') || str_starts_with($driver, 'pdo-')) {\n            $driver = substr($driver, 4);\n        }\n\n        $dsn = null;\n        switch ($driver) {\n            case 'mysql':\n                $dsn = 'mysql:';\n                if ('' !== ($params['query'] ?? '')) {\n                    $queryParams = [];\n                    parse_str($params['query'], $queryParams);\n                    if ('' !== ($queryParams['charset'] ?? '')) {\n                        $dsn .= 'charset='.$queryParams['charset'].';';\n                    }\n\n                    if ('' !== ($queryParams['unix_socket'] ?? '')) {\n                        $dsn .= 'unix_socket='.$queryParams['unix_socket'].';';\n\n                        if (isset($params['path'])) {\n                            $dbName = substr($params['path'], 1); // Remove the leading slash\n                            $dsn .= 'dbname='.$dbName.';';\n                        }\n\n                        return $dsn;\n                    }\n                }\n                // If \"unix_socket\" is not in the query, we continue with the same process as pgsql\n                // no break\n            case 'pgsql':\n                $dsn ??= 'pgsql:';\n\n                if (isset($params['host']) && '' !== $params['host']) {\n                    $dsn .= 'host='.$params['host'].';';\n                }\n\n                if (isset($params['port']) && '' !== $params['port']) {\n                    $dsn .= 'port='.$params['port'].';';\n                }\n\n                if (isset($params['path'])) {\n                    $dbName = substr($params['path'], 1); // Remove the leading slash\n                    $dsn .= 'dbname='.$dbName.';';\n                }\n\n                return $dsn;\n\n            case 'sqlite':\n                return 'sqlite:'.substr($params['path'], 1);\n\n            case 'sqlsrv':\n                $dsn = 'sqlsrv:server=';\n\n                if (isset($params['host'])) {\n                    $dsn .= $params['host'];\n                }\n\n                if (isset($params['port']) && '' !== $params['port']) {\n                    $dsn .= ','.$params['port'];\n                }\n\n                if (isset($params['path'])) {\n                    $dbName = substr($params['path'], 1); // Remove the leading slash\n                    $dsn .= ';Database='.$dbName;\n                }\n\n                return $dsn;\n\n            default:\n                throw new \\InvalidArgumentException(sprintf('The scheme \"%s\" is not supported by the PdoSessionHandler URL configuration. Pass a PDO DSN directly.', $params['scheme']));\n        }\n    }\n\n    /**\n     * Helper method to begin a transaction.\n     *\n     * Since SQLite does not support row level locks, we have to acquire a reserved lock\n     * on the database immediately. Because of https://bugs.php.net/42766 we have to create\n     * such a transaction manually which also means we cannot use PDO::commit or\n     * PDO::rollback or PDO::inTransaction for SQLite.\n     *\n     * Also MySQLs default isolation, REPEATABLE READ, causes deadlock for different sessions\n     * due to https://percona.com/blog/2013/12/12/one-more-innodb-gap-lock-to-avoid/ .\n     * So we change it to READ COMMITTED.\n     */\n    private function beginTransaction(): void\n    {\n        if (!$this->inTransaction) {\n            if ('sqlite' === $this->driver) {\n                $this->pdo->exec('BEGIN IMMEDIATE TRANSACTION');\n            } else {\n                if ('mysql' === $this->driver) {\n                    $this->pdo->exec('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');\n                }\n                $this->pdo->beginTransaction();\n            }\n            $this->inTransaction = true;\n        }\n    }\n\n    /**\n     * Helper method to commit a transaction.\n     */\n    private function commit(): void\n    {\n        if ($this->inTransaction) {\n            try {\n                // commit read-write transaction which also releases the lock\n                if ('sqlite' === $this->driver) {\n                    $this->pdo->exec('COMMIT');\n                } else {\n                    $this->pdo->commit();\n                }\n                $this->inTransaction = false;\n            } catch (\\PDOException $e) {\n                $this->rollback();\n\n                throw $e;\n            }\n        }\n    }\n\n    /**\n     * Helper method to rollback a transaction.\n     */\n    private function rollback(): void\n    {\n        // We only need to rollback if we are in a transaction. Otherwise the resulting\n        // error would hide the real problem why rollback was called. We might not be\n        // in a transaction when not using the transactional locking behavior or when\n        // two callbacks (e.g. destroy and write) are invoked that both fail.\n        if ($this->inTransaction) {\n            if ('sqlite' === $this->driver) {\n                $this->pdo->exec('ROLLBACK');\n            } else {\n                $this->pdo->rollBack();\n            }\n            $this->inTransaction = false;\n        }\n    }\n\n    /**\n     * Reads the session data in respect to the different locking strategies.\n     *\n     * We need to make sure we do not return session data that is already considered garbage according\n     * to the session.gc_maxlifetime setting because gc() is called after read() and only sometimes.\n     */\n    protected function doRead(#[\\SensitiveParameter] string $sessionId): string\n    {\n        if (self::LOCK_ADVISORY === $this->lockMode) {\n            $this->unlockStatements[] = $this->doAdvisoryLock($sessionId);\n        }\n\n        $selectSql = $this->getSelectSql();\n        $selectStmt = $this->pdo->prepare($selectSql);\n        $selectStmt->bindParam(':id', $sessionId, \\PDO::PARAM_STR);\n        $insertStmt = null;\n\n        while (true) {\n            $selectStmt->execute();\n            $sessionRows = $selectStmt->fetchAll(\\PDO::FETCH_NUM);\n\n            if ($sessionRows) {\n                $expiry = (int) $sessionRows[0][1];\n\n                if ($expiry < time()) {\n                    $this->sessionExpired = true;\n\n                    return '';\n                }\n\n                return \\is_resource($sessionRows[0][0]) ? stream_get_contents($sessionRows[0][0]) : $sessionRows[0][0];\n            }\n\n            if (null !== $insertStmt) {\n                $this->rollback();\n                throw new \\RuntimeException('Failed to read session: INSERT reported a duplicate id but next SELECT did not return any data.');\n            }\n\n            if (!filter_var(\\ini_get('session.use_strict_mode'), \\FILTER_VALIDATE_BOOL) && self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) {\n                // In strict mode, session fixation is not possible: new sessions always start with a unique\n                // random id, so that concurrency is not possible and this code path can be skipped.\n                // Exclusive-reading of non-existent rows does not block, so we need to do an insert to block\n                // until other connections to the session are committed.\n                try {\n                    $insertStmt = $this->getInsertStatement($sessionId, '', 0);\n                    $insertStmt->execute();\n                } catch (\\PDOException $e) {\n                    // Catch duplicate key error because other connection created the session already.\n                    // It would only not be the case when the other connection destroyed the session.\n                    if (str_starts_with($e->getCode(), '23')) {\n                        // Retrieve finished session data written by concurrent connection by restarting the loop.\n                        // We have to start a new transaction as a failed query will mark the current transaction as\n                        // aborted in PostgreSQL and disallow further queries within it.\n                        $this->rollback();\n                        $this->beginTransaction();\n                        continue;\n                    }\n\n                    throw $e;\n                }\n            }\n\n            return '';\n        }\n    }\n\n    /**\n     * Executes an application-level lock on the database.\n     *\n     * @return \\PDOStatement The statement that needs to be executed later to release the lock\n     *\n     * @throws \\DomainException When an unsupported PDO driver is used\n     *\n     * @todo implement missing advisory locks\n     *       - for oci using DBMS_LOCK.REQUEST\n     *       - for sqlsrv using sp_getapplock with LockOwner = Session\n     */\n    private function doAdvisoryLock(#[\\SensitiveParameter] string $sessionId): \\PDOStatement\n    {\n        switch ($this->driver) {\n            case 'mysql':\n                // MySQL 5.7.5 and later enforces a maximum length on lock names of 64 characters. Previously, no limit was enforced.\n                $lockId = substr($sessionId, 0, 64);\n                // should we handle the return value? 0 on timeout, null on error\n                // we use a timeout of 50 seconds which is also the default for innodb_lock_wait_timeout\n                $stmt = $this->pdo->prepare('SELECT GET_LOCK(:key, 50)');\n                $stmt->bindValue(':key', $lockId, \\PDO::PARAM_STR);\n                $stmt->execute();\n\n                $releaseStmt = $this->pdo->prepare('DO RELEASE_LOCK(:key)');\n                $releaseStmt->bindValue(':key', $lockId, \\PDO::PARAM_STR);\n\n                return $releaseStmt;\n            case 'pgsql':\n                // Obtaining an exclusive session level advisory lock requires an integer key.\n                // When session.sid_bits_per_character > 4, the session id can contain non-hex-characters.\n                // So we cannot just use hexdec().\n                if (4 === \\PHP_INT_SIZE) {\n                    $sessionInt1 = $this->convertStringToInt($sessionId);\n                    $sessionInt2 = $this->convertStringToInt(substr($sessionId, 4, 4));\n\n                    $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key1, :key2)');\n                    $stmt->bindValue(':key1', $sessionInt1, \\PDO::PARAM_INT);\n                    $stmt->bindValue(':key2', $sessionInt2, \\PDO::PARAM_INT);\n                    $stmt->execute();\n\n                    $releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key1, :key2)');\n                    $releaseStmt->bindValue(':key1', $sessionInt1, \\PDO::PARAM_INT);\n                    $releaseStmt->bindValue(':key2', $sessionInt2, \\PDO::PARAM_INT);\n                } else {\n                    $sessionBigInt = $this->convertStringToInt($sessionId);\n\n                    $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key)');\n                    $stmt->bindValue(':key', $sessionBigInt, \\PDO::PARAM_INT);\n                    $stmt->execute();\n\n                    $releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key)');\n                    $releaseStmt->bindValue(':key', $sessionBigInt, \\PDO::PARAM_INT);\n                }\n\n                return $releaseStmt;\n            case 'sqlite':\n                throw new \\DomainException('SQLite does not support advisory locks.');\n            default:\n                throw new \\DomainException(sprintf('Advisory locks are currently not implemented for PDO driver \"%s\".', $this->driver));\n        }\n    }\n\n    /**\n     * Encodes the first 4 (when PHP_INT_SIZE == 4) or 8 characters of the string as an integer.\n     *\n     * Keep in mind, PHP integers are signed.\n     */\n    private function convertStringToInt(string $string): int\n    {\n        if (4 === \\PHP_INT_SIZE) {\n            return (\\ord($string[3]) << 24) + (\\ord($string[2]) << 16) + (\\ord($string[1]) << 8) + \\ord($string[0]);\n        }\n\n        $int1 = (\\ord($string[7]) << 24) + (\\ord($string[6]) << 16) + (\\ord($string[5]) << 8) + \\ord($string[4]);\n        $int2 = (\\ord($string[3]) << 24) + (\\ord($string[2]) << 16) + (\\ord($string[1]) << 8) + \\ord($string[0]);\n\n        return $int2 + ($int1 << 32);\n    }\n\n    /**\n     * Return a locking or nonlocking SQL query to read session information.\n     *\n     * @throws \\DomainException When an unsupported PDO driver is used\n     */\n    private function getSelectSql(): string\n    {\n        if (self::LOCK_TRANSACTIONAL === $this->lockMode) {\n            $this->beginTransaction();\n\n            switch ($this->driver) {\n                case 'mysql':\n                case 'oci':\n                case 'pgsql':\n                    return \"SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WHERE $this->idCol = :id FOR UPDATE\";\n                case 'sqlsrv':\n                    return \"SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WITH (UPDLOCK, ROWLOCK) WHERE $this->idCol = :id\";\n                case 'sqlite':\n                    // we already locked when starting transaction\n                    break;\n                default:\n                    throw new \\DomainException(sprintf('Transactional locks are currently not implemented for PDO driver \"%s\".', $this->driver));\n            }\n        }\n\n        return \"SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WHERE $this->idCol = :id\";\n    }\n\n    /**\n     * Returns an insert statement supported by the database for writing session data.\n     */\n    private function getInsertStatement(#[\\SensitiveParameter] string $sessionId, string $sessionData, int $maxlifetime): \\PDOStatement\n    {\n        switch ($this->driver) {\n            case 'oci':\n                $data = fopen('php://memory', 'r+');\n                fwrite($data, $sessionData);\n                rewind($data);\n                $sql = \"INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, EMPTY_BLOB(), :expiry, :time) RETURNING $this->dataCol into :data\";\n                break;\n            default:\n                $data = $sessionData;\n                $sql = \"INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time)\";\n                break;\n        }\n\n        $stmt = $this->pdo->prepare($sql);\n        $stmt->bindParam(':id', $sessionId, \\PDO::PARAM_STR);\n        $stmt->bindParam(':data', $data, \\PDO::PARAM_LOB);\n        $stmt->bindValue(':expiry', time() + $maxlifetime, \\PDO::PARAM_INT);\n        $stmt->bindValue(':time', time(), \\PDO::PARAM_INT);\n\n        return $stmt;\n    }\n\n    /**\n     * Returns an update statement supported by the database for writing session data.\n     */\n    private function getUpdateStatement(#[\\SensitiveParameter] string $sessionId, string $sessionData, int $maxlifetime): \\PDOStatement\n    {\n        switch ($this->driver) {\n            case 'oci':\n                $data = fopen('php://memory', 'r+');\n                fwrite($data, $sessionData);\n                rewind($data);\n                $sql = \"UPDATE $this->table SET $this->dataCol = EMPTY_BLOB(), $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id RETURNING $this->dataCol into :data\";\n                break;\n            default:\n                $data = $sessionData;\n                $sql = \"UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id\";\n                break;\n        }\n\n        $stmt = $this->pdo->prepare($sql);\n        $stmt->bindParam(':id', $sessionId, \\PDO::PARAM_STR);\n        $stmt->bindParam(':data', $data, \\PDO::PARAM_LOB);\n        $stmt->bindValue(':expiry', time() + $maxlifetime, \\PDO::PARAM_INT);\n        $stmt->bindValue(':time', time(), \\PDO::PARAM_INT);\n\n        return $stmt;\n    }\n\n    /**\n     * Returns a merge/upsert (i.e. insert or update) statement when supported by the database for writing session data.\n     */\n    private function getMergeStatement(#[\\SensitiveParameter] string $sessionId, string $data, int $maxlifetime): ?\\PDOStatement\n    {\n        switch (true) {\n            case 'mysql' === $this->driver:\n                $mergeSql = \"INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time) \".\n                    \"ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)\";\n                break;\n            case 'sqlsrv' === $this->driver && version_compare($this->pdo->getAttribute(\\PDO::ATTR_SERVER_VERSION), '10', '>='):\n                // MERGE is only available since SQL Server 2008 and must be terminated by semicolon\n                // It also requires HOLDLOCK according to https://weblogs.sqlteam.com/dang/2009/01/31/upsert-race-condition-with-merge/\n                $mergeSql = \"MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) \".\n                    \"WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) \".\n                    \"WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;\";\n                break;\n            case 'sqlite' === $this->driver:\n                $mergeSql = \"INSERT OR REPLACE INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time)\";\n                break;\n            case 'pgsql' === $this->driver && version_compare($this->pdo->getAttribute(\\PDO::ATTR_SERVER_VERSION), '9.5', '>='):\n                $mergeSql = \"INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time) \".\n                    \"ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)\";\n                break;\n            default:\n                // MERGE is not supported with LOBs: https://oracle.com/technetwork/articles/fuecks-lobs-095315.html\n                return null;\n        }\n\n        $mergeStmt = $this->pdo->prepare($mergeSql);\n\n        if ('sqlsrv' === $this->driver) {\n            $mergeStmt->bindParam(1, $sessionId, \\PDO::PARAM_STR);\n            $mergeStmt->bindParam(2, $sessionId, \\PDO::PARAM_STR);\n            $mergeStmt->bindParam(3, $data, \\PDO::PARAM_LOB);\n            $mergeStmt->bindValue(4, time() + $maxlifetime, \\PDO::PARAM_INT);\n            $mergeStmt->bindValue(5, time(), \\PDO::PARAM_INT);\n            $mergeStmt->bindParam(6, $data, \\PDO::PARAM_LOB);\n            $mergeStmt->bindValue(7, time() + $maxlifetime, \\PDO::PARAM_INT);\n            $mergeStmt->bindValue(8, time(), \\PDO::PARAM_INT);\n        } else {\n            $mergeStmt->bindParam(':id', $sessionId, \\PDO::PARAM_STR);\n            $mergeStmt->bindParam(':data', $data, \\PDO::PARAM_LOB);\n            $mergeStmt->bindValue(':expiry', time() + $maxlifetime, \\PDO::PARAM_INT);\n            $mergeStmt->bindValue(':time', time(), \\PDO::PARAM_INT);\n        }\n\n        return $mergeStmt;\n    }\n\n    /**\n     * Return a PDO instance.\n     */\n    protected function getConnection(): \\PDO\n    {\n        if (!isset($this->pdo)) {\n            $this->connect($this->dsn ?: \\ini_get('session.save_path'));\n        }\n\n        return $this->pdo;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\nuse Predis\\Response\\ErrorInterface;\nuse Relay\\Relay;\n\n/**\n * Redis based session storage handler based on the Redis class\n * provided by the PHP redis extension.\n *\n * @author Dalibor Karlović <dalibor@flexolabs.io>\n */\nclass RedisSessionHandler extends AbstractSessionHandler\n{\n    /**\n     * Key prefix for shared environments.\n     */\n    private string $prefix;\n\n    /**\n     * Time to live in seconds.\n     */\n    private int|\\Closure|null $ttl;\n\n    /**\n     * List of available options:\n     *  * prefix: The prefix to use for the keys in order to avoid collision on the Redis server\n     *  * ttl: The time to live in seconds.\n     *\n     * @throws \\InvalidArgumentException When unsupported client or options are passed\n     */\n    public function __construct(\n        private \\Redis|Relay|\\RedisArray|\\RedisCluster|\\Predis\\ClientInterface $redis,\n        array $options = [],\n    ) {\n        if ($diff = array_diff(array_keys($options), ['prefix', 'ttl'])) {\n            throw new \\InvalidArgumentException(sprintf('The following options are not supported \"%s\".', implode(', ', $diff)));\n        }\n\n        $this->prefix = $options['prefix'] ?? 'sf_s';\n        $this->ttl = $options['ttl'] ?? null;\n    }\n\n    protected function doRead(#[\\SensitiveParameter] string $sessionId): string\n    {\n        return $this->redis->get($this->prefix.$sessionId) ?: '';\n    }\n\n    protected function doWrite(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        $ttl = ($this->ttl instanceof \\Closure ? ($this->ttl)() : $this->ttl) ?? \\ini_get('session.gc_maxlifetime');\n        $result = $this->redis->setEx($this->prefix.$sessionId, (int) $ttl, $data);\n\n        return $result && !$result instanceof ErrorInterface;\n    }\n\n    protected function doDestroy(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        static $unlink = true;\n\n        if ($unlink) {\n            try {\n                $unlink = false !== $this->redis->unlink($this->prefix.$sessionId);\n            } catch (\\Throwable) {\n                $unlink = false;\n            }\n        }\n\n        if (!$unlink) {\n            $this->redis->del($this->prefix.$sessionId);\n        }\n\n        return true;\n    }\n\n    #[\\ReturnTypeWillChange]\n    public function close(): bool\n    {\n        return true;\n    }\n\n    public function gc(int $maxlifetime): int|false\n    {\n        return 0;\n    }\n\n    public function updateTimestamp(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        $ttl = ($this->ttl instanceof \\Closure ? ($this->ttl)() : $this->ttl) ?? \\ini_get('session.gc_maxlifetime');\n\n        return $this->redis->expire($this->prefix.$sessionId, (int) $ttl);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\nuse Doctrine\\DBAL\\Configuration;\nuse Doctrine\\DBAL\\DriverManager;\nuse Doctrine\\DBAL\\Schema\\DefaultSchemaManagerFactory;\nuse Doctrine\\DBAL\\Tools\\DsnParser;\nuse Relay\\Relay;\nuse Symfony\\Component\\Cache\\Adapter\\AbstractAdapter;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass SessionHandlerFactory\n{\n    public static function createHandler(object|string $connection, array $options = []): AbstractSessionHandler\n    {\n        if ($query = \\is_string($connection) ? parse_url($connection) : false) {\n            parse_str($query['query'] ?? '', $query);\n\n            if (($options['ttl'] ?? null) instanceof \\Closure) {\n                $query['ttl'] = $options['ttl'];\n            }\n        }\n        $options = ($query ?: []) + $options;\n\n        switch (true) {\n            case $connection instanceof \\Redis:\n            case $connection instanceof Relay:\n            case $connection instanceof \\RedisArray:\n            case $connection instanceof \\RedisCluster:\n            case $connection instanceof \\Predis\\ClientInterface:\n                return new RedisSessionHandler($connection);\n\n            case $connection instanceof \\Memcached:\n                return new MemcachedSessionHandler($connection);\n\n            case $connection instanceof \\PDO:\n                return new PdoSessionHandler($connection);\n\n            case !\\is_string($connection):\n                throw new \\InvalidArgumentException(sprintf('Unsupported Connection: \"%s\".', get_debug_type($connection)));\n            case str_starts_with($connection, 'file://'):\n                $savePath = substr($connection, 7);\n\n                return new StrictSessionHandler(new NativeFileSessionHandler('' === $savePath ? null : $savePath));\n\n            case str_starts_with($connection, 'redis:'):\n            case str_starts_with($connection, 'rediss:'):\n            case str_starts_with($connection, 'memcached:'):\n                if (!class_exists(AbstractAdapter::class)) {\n                    throw new \\InvalidArgumentException('Unsupported Redis or Memcached DSN. Try running \"composer require symfony/cache\".');\n                }\n                $handlerClass = str_starts_with($connection, 'memcached:') ? MemcachedSessionHandler::class : RedisSessionHandler::class;\n                $connection = AbstractAdapter::createConnection($connection, ['lazy' => true]);\n\n                return new $handlerClass($connection, array_intersect_key($options, ['prefix' => 1, 'ttl' => 1]));\n\n            case str_starts_with($connection, 'pdo_oci://'):\n                if (!class_exists(DriverManager::class)) {\n                    throw new \\InvalidArgumentException('Unsupported PDO OCI DSN. Try running \"composer require doctrine/dbal\".');\n                }\n                $connection[3] = '-';\n                $params = class_exists(DsnParser::class) ? (new DsnParser())->parse($connection) : ['url' => $connection];\n                $config = new Configuration();\n                if (class_exists(DefaultSchemaManagerFactory::class)) {\n                    $config->setSchemaManagerFactory(new DefaultSchemaManagerFactory());\n                }\n\n                $connection = DriverManager::getConnection($params, $config);\n                // The condition should be removed once support for DBAL <3.3 is dropped\n                $connection = method_exists($connection, 'getNativeConnection') ? $connection->getNativeConnection() : $connection->getWrappedConnection();\n                // no break;\n\n            case str_starts_with($connection, 'mssql://'):\n            case str_starts_with($connection, 'mysql://'):\n            case str_starts_with($connection, 'mysql2://'):\n            case str_starts_with($connection, 'pgsql://'):\n            case str_starts_with($connection, 'postgres://'):\n            case str_starts_with($connection, 'postgresql://'):\n            case str_starts_with($connection, 'sqlsrv://'):\n            case str_starts_with($connection, 'sqlite://'):\n            case str_starts_with($connection, 'sqlite3://'):\n                return new PdoSessionHandler($connection, $options);\n        }\n\n        throw new \\InvalidArgumentException(sprintf('Unsupported Connection: \"%s\".', $connection));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler;\n\n/**\n * Adds basic `SessionUpdateTimestampHandlerInterface` behaviors to another `SessionHandlerInterface`.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass StrictSessionHandler extends AbstractSessionHandler\n{\n    private \\SessionHandlerInterface $handler;\n    private bool $doDestroy;\n\n    public function __construct(\\SessionHandlerInterface $handler)\n    {\n        if ($handler instanceof \\SessionUpdateTimestampHandlerInterface) {\n            throw new \\LogicException(sprintf('\"%s\" is already an instance of \"SessionUpdateTimestampHandlerInterface\", you cannot wrap it with \"%s\".', get_debug_type($handler), self::class));\n        }\n\n        $this->handler = $handler;\n    }\n\n    /**\n     * Returns true if this handler wraps an internal PHP session save handler using \\SessionHandler.\n     *\n     * @internal\n     */\n    public function isWrapper(): bool\n    {\n        return $this->handler instanceof \\SessionHandler;\n    }\n\n    public function open(string $savePath, string $sessionName): bool\n    {\n        parent::open($savePath, $sessionName);\n\n        return $this->handler->open($savePath, $sessionName);\n    }\n\n    protected function doRead(#[\\SensitiveParameter] string $sessionId): string\n    {\n        return $this->handler->read($sessionId);\n    }\n\n    public function updateTimestamp(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        return $this->write($sessionId, $data);\n    }\n\n    protected function doWrite(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        return $this->handler->write($sessionId, $data);\n    }\n\n    public function destroy(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        $this->doDestroy = true;\n        $destroyed = parent::destroy($sessionId);\n\n        return $this->doDestroy ? $this->doDestroy($sessionId) : $destroyed;\n    }\n\n    protected function doDestroy(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        $this->doDestroy = false;\n\n        return $this->handler->destroy($sessionId);\n    }\n\n    public function close(): bool\n    {\n        return $this->handler->close();\n    }\n\n    public function gc(int $maxlifetime): int|false\n    {\n        return $this->handler->gc($maxlifetime);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface;\n\n/**\n * Metadata container.\n *\n * Adds metadata to the session.\n *\n * @author Drak <drak@zikula.org>\n */\nclass MetadataBag implements SessionBagInterface\n{\n    public const CREATED = 'c';\n    public const UPDATED = 'u';\n    public const LIFETIME = 'l';\n\n    private string $name = '__metadata';\n    private string $storageKey;\n\n    /**\n     * @var array\n     */\n    protected $meta = [self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0];\n\n    /**\n     * Unix timestamp.\n     */\n    private int $lastUsed;\n\n    private int $updateThreshold;\n\n    /**\n     * @param string $storageKey      The key used to store bag in the session\n     * @param int    $updateThreshold The time to wait between two UPDATED updates\n     */\n    public function __construct(string $storageKey = '_sf2_meta', int $updateThreshold = 0)\n    {\n        $this->storageKey = $storageKey;\n        $this->updateThreshold = $updateThreshold;\n    }\n\n    /**\n     * @return void\n     */\n    public function initialize(array &$array)\n    {\n        $this->meta = &$array;\n\n        if (isset($array[self::CREATED])) {\n            $this->lastUsed = $this->meta[self::UPDATED];\n\n            $timeStamp = time();\n            if ($timeStamp - $array[self::UPDATED] >= $this->updateThreshold) {\n                $this->meta[self::UPDATED] = $timeStamp;\n            }\n        } else {\n            $this->stampCreated();\n        }\n    }\n\n    /**\n     * Gets the lifetime that the session cookie was set with.\n     */\n    public function getLifetime(): int\n    {\n        return $this->meta[self::LIFETIME];\n    }\n\n    /**\n     * Stamps a new session's metadata.\n     *\n     * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value\n     *                           will leave the system settings unchanged, 0 sets the cookie\n     *                           to expire with browser session. Time is in seconds, and is\n     *                           not a Unix timestamp.\n     *\n     * @return void\n     */\n    public function stampNew(?int $lifetime = null)\n    {\n        $this->stampCreated($lifetime);\n    }\n\n    public function getStorageKey(): string\n    {\n        return $this->storageKey;\n    }\n\n    /**\n     * Gets the created timestamp metadata.\n     *\n     * @return int Unix timestamp\n     */\n    public function getCreated(): int\n    {\n        return $this->meta[self::CREATED];\n    }\n\n    /**\n     * Gets the last used metadata.\n     *\n     * @return int Unix timestamp\n     */\n    public function getLastUsed(): int\n    {\n        return $this->lastUsed;\n    }\n\n    public function clear(): mixed\n    {\n        // nothing to do\n        return null;\n    }\n\n    public function getName(): string\n    {\n        return $this->name;\n    }\n\n    /**\n     * Sets name.\n     *\n     * @return void\n     */\n    public function setName(string $name)\n    {\n        $this->name = $name;\n    }\n\n    private function stampCreated(?int $lifetime = null): void\n    {\n        $timeStamp = time();\n        $this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp;\n        $this->meta[self::LIFETIME] = $lifetime ?? (int) \\ini_get('session.cookie_lifetime');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface;\n\n/**\n * MockArraySessionStorage mocks the session for unit tests.\n *\n * No PHP session is actually started since a session can be initialized\n * and shutdown only once per PHP execution cycle.\n *\n * When doing functional testing, you should use MockFileSessionStorage instead.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Bulat Shakirzyanov <mallluhuct@gmail.com>\n * @author Drak <drak@zikula.org>\n */\nclass MockArraySessionStorage implements SessionStorageInterface\n{\n    /**\n     * @var string\n     */\n    protected $id = '';\n\n    /**\n     * @var string\n     */\n    protected $name;\n\n    /**\n     * @var bool\n     */\n    protected $started = false;\n\n    /**\n     * @var bool\n     */\n    protected $closed = false;\n\n    /**\n     * @var array\n     */\n    protected $data = [];\n\n    /**\n     * @var MetadataBag\n     */\n    protected $metadataBag;\n\n    /**\n     * @var array|SessionBagInterface[]\n     */\n    protected $bags = [];\n\n    public function __construct(string $name = 'MOCKSESSID', ?MetadataBag $metaBag = null)\n    {\n        $this->name = $name;\n        $this->setMetadataBag($metaBag);\n    }\n\n    /**\n     * @return void\n     */\n    public function setSessionData(array $array)\n    {\n        $this->data = $array;\n    }\n\n    public function start(): bool\n    {\n        if ($this->started) {\n            return true;\n        }\n\n        if (empty($this->id)) {\n            $this->id = $this->generateId();\n        }\n\n        $this->loadSession();\n\n        return true;\n    }\n\n    public function regenerate(bool $destroy = false, ?int $lifetime = null): bool\n    {\n        if (!$this->started) {\n            $this->start();\n        }\n\n        $this->metadataBag->stampNew($lifetime);\n        $this->id = $this->generateId();\n\n        return true;\n    }\n\n    public function getId(): string\n    {\n        return $this->id;\n    }\n\n    /**\n     * @return void\n     */\n    public function setId(string $id)\n    {\n        if ($this->started) {\n            throw new \\LogicException('Cannot set session ID after the session has started.');\n        }\n\n        $this->id = $id;\n    }\n\n    public function getName(): string\n    {\n        return $this->name;\n    }\n\n    /**\n     * @return void\n     */\n    public function setName(string $name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * @return void\n     */\n    public function save()\n    {\n        if (!$this->started || $this->closed) {\n            throw new \\RuntimeException('Trying to save a session that was not started yet or was already closed.');\n        }\n        // nothing to do since we don't persist the session data\n        $this->closed = false;\n        $this->started = false;\n    }\n\n    /**\n     * @return void\n     */\n    public function clear()\n    {\n        // clear out the bags\n        foreach ($this->bags as $bag) {\n            $bag->clear();\n        }\n\n        // clear out the session\n        $this->data = [];\n\n        // reconnect the bags to the session\n        $this->loadSession();\n    }\n\n    /**\n     * @return void\n     */\n    public function registerBag(SessionBagInterface $bag)\n    {\n        $this->bags[$bag->getName()] = $bag;\n    }\n\n    public function getBag(string $name): SessionBagInterface\n    {\n        if (!isset($this->bags[$name])) {\n            throw new \\InvalidArgumentException(sprintf('The SessionBagInterface \"%s\" is not registered.', $name));\n        }\n\n        if (!$this->started) {\n            $this->start();\n        }\n\n        return $this->bags[$name];\n    }\n\n    public function isStarted(): bool\n    {\n        return $this->started;\n    }\n\n    /**\n     * @return void\n     */\n    public function setMetadataBag(?MetadataBag $bag = null)\n    {\n        if (1 > \\func_num_args()) {\n            trigger_deprecation('symfony/http-foundation', '6.2', 'Calling \"%s()\" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);\n        }\n        $this->metadataBag = $bag ?? new MetadataBag();\n    }\n\n    /**\n     * Gets the MetadataBag.\n     */\n    public function getMetadataBag(): MetadataBag\n    {\n        return $this->metadataBag;\n    }\n\n    /**\n     * Generates a session ID.\n     *\n     * This doesn't need to be particularly cryptographically secure since this is just\n     * a mock.\n     */\n    protected function generateId(): string\n    {\n        return hash('sha256', uniqid('ss_mock_', true));\n    }\n\n    /**\n     * @return void\n     */\n    protected function loadSession()\n    {\n        $bags = array_merge($this->bags, [$this->metadataBag]);\n\n        foreach ($bags as $bag) {\n            $key = $bag->getStorageKey();\n            $this->data[$key] ??= [];\n            $bag->initialize($this->data[$key]);\n        }\n\n        $this->started = true;\n        $this->closed = false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage;\n\n/**\n * MockFileSessionStorage is used to mock sessions for\n * functional testing where you may need to persist session data\n * across separate PHP processes.\n *\n * No PHP session is actually started since a session can be initialized\n * and shutdown only once per PHP execution cycle and this class does\n * not pollute any session related globals, including session_*() functions\n * or session.* PHP ini directives.\n *\n * @author Drak <drak@zikula.org>\n */\nclass MockFileSessionStorage extends MockArraySessionStorage\n{\n    private string $savePath;\n\n    /**\n     * @param string|null $savePath Path of directory to save session files\n     */\n    public function __construct(?string $savePath = null, string $name = 'MOCKSESSID', ?MetadataBag $metaBag = null)\n    {\n        $savePath ??= sys_get_temp_dir();\n\n        if (!is_dir($savePath) && !@mkdir($savePath, 0777, true) && !is_dir($savePath)) {\n            throw new \\RuntimeException(sprintf('Session Storage was not able to create directory \"%s\".', $savePath));\n        }\n\n        $this->savePath = $savePath;\n\n        parent::__construct($name, $metaBag);\n    }\n\n    public function start(): bool\n    {\n        if ($this->started) {\n            return true;\n        }\n\n        if (!$this->id) {\n            $this->id = $this->generateId();\n        }\n\n        $this->read();\n\n        $this->started = true;\n\n        return true;\n    }\n\n    public function regenerate(bool $destroy = false, ?int $lifetime = null): bool\n    {\n        if (!$this->started) {\n            $this->start();\n        }\n\n        if ($destroy) {\n            $this->destroy();\n        }\n\n        return parent::regenerate($destroy, $lifetime);\n    }\n\n    /**\n     * @return void\n     */\n    public function save()\n    {\n        if (!$this->started) {\n            throw new \\RuntimeException('Trying to save a session that was not started yet or was already closed.');\n        }\n\n        $data = $this->data;\n\n        foreach ($this->bags as $bag) {\n            if (empty($data[$key = $bag->getStorageKey()])) {\n                unset($data[$key]);\n            }\n        }\n        if ([$key = $this->metadataBag->getStorageKey()] === array_keys($data)) {\n            unset($data[$key]);\n        }\n\n        try {\n            if ($data) {\n                $path = $this->getFilePath();\n                $tmp = $path.bin2hex(random_bytes(6));\n                file_put_contents($tmp, serialize($data));\n                rename($tmp, $path);\n            } else {\n                $this->destroy();\n            }\n        } finally {\n            $this->data = $data;\n        }\n\n        // this is needed when the session object is re-used across multiple requests\n        // in functional tests.\n        $this->started = false;\n    }\n\n    /**\n     * Deletes a session from persistent storage.\n     * Deliberately leaves session data in memory intact.\n     */\n    private function destroy(): void\n    {\n        set_error_handler(static function () {});\n        try {\n            unlink($this->getFilePath());\n        } finally {\n            restore_error_handler();\n        }\n    }\n\n    /**\n     * Calculate path to file.\n     */\n    private function getFilePath(): string\n    {\n        return $this->savePath.'/'.$this->id.'.mocksess';\n    }\n\n    /**\n     * Reads session from storage and loads session.\n     */\n    private function read(): void\n    {\n        set_error_handler(static function () {});\n        try {\n            $data = file_get_contents($this->getFilePath());\n        } finally {\n            restore_error_handler();\n        }\n\n        $this->data = $data ? unserialize($data) : [];\n\n        $this->loadSession();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(MockFileSessionStorage::class);\n\n/**\n * @author Jérémy Derussé <jeremy@derusse.com>\n */\nclass MockFileSessionStorageFactory implements SessionStorageFactoryInterface\n{\n    private ?string $savePath;\n    private string $name;\n    private ?MetadataBag $metaBag;\n\n    /**\n     * @see MockFileSessionStorage constructor.\n     */\n    public function __construct(?string $savePath = null, string $name = 'MOCKSESSID', ?MetadataBag $metaBag = null)\n    {\n        $this->savePath = $savePath;\n        $this->name = $name;\n        $this->metaBag = $metaBag;\n    }\n\n    public function createStorage(?Request $request): SessionStorageInterface\n    {\n        return new MockFileSessionStorage($this->savePath, $this->name, $this->metaBag);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface;\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler;\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy;\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(MetadataBag::class);\nclass_exists(StrictSessionHandler::class);\nclass_exists(SessionHandlerProxy::class);\n\n/**\n * This provides a base class for session attribute storage.\n *\n * @author Drak <drak@zikula.org>\n */\nclass NativeSessionStorage implements SessionStorageInterface\n{\n    /**\n     * @var SessionBagInterface[]\n     */\n    protected $bags = [];\n\n    /**\n     * @var bool\n     */\n    protected $started = false;\n\n    /**\n     * @var bool\n     */\n    protected $closed = false;\n\n    /**\n     * @var AbstractProxy|\\SessionHandlerInterface\n     */\n    protected $saveHandler;\n\n    /**\n     * @var MetadataBag\n     */\n    protected $metadataBag;\n\n    /**\n     * Depending on how you want the storage driver to behave you probably\n     * want to override this constructor entirely.\n     *\n     * List of options for $options array with their defaults.\n     *\n     * @see https://php.net/session.configuration for options\n     * but we omit 'session.' from the beginning of the keys for convenience.\n     *\n     * (\"auto_start\", is not supported as it tells PHP to start a session before\n     * PHP starts to execute user-land code. Setting during runtime has no effect).\n     *\n     * cache_limiter, \"\" (use \"0\" to prevent headers from being sent entirely).\n     * cache_expire, \"0\"\n     * cookie_domain, \"\"\n     * cookie_httponly, \"\"\n     * cookie_lifetime, \"0\"\n     * cookie_path, \"/\"\n     * cookie_secure, \"\"\n     * cookie_samesite, null\n     * gc_divisor, \"100\"\n     * gc_maxlifetime, \"1440\"\n     * gc_probability, \"1\"\n     * lazy_write, \"1\"\n     * name, \"PHPSESSID\"\n     * referer_check, \"\"\n     * serialize_handler, \"php\"\n     * use_strict_mode, \"1\"\n     * use_cookies, \"1\"\n     * use_only_cookies, \"1\"\n     * use_trans_sid, \"0\"\n     * sid_length, \"32\"\n     * sid_bits_per_character, \"5\"\n     * trans_sid_hosts, $_SERVER['HTTP_HOST']\n     * trans_sid_tags, \"a=href,area=href,frame=src,form=\"\n     */\n    public function __construct(array $options = [], AbstractProxy|\\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null)\n    {\n        if (!\\extension_loaded('session')) {\n            throw new \\LogicException('PHP extension \"session\" is required.');\n        }\n\n        $options += [\n            'cache_limiter' => '',\n            'cache_expire' => 0,\n            'use_cookies' => 1,\n            'lazy_write' => 1,\n            'use_strict_mode' => 1,\n        ];\n\n        session_register_shutdown();\n\n        $this->setMetadataBag($metaBag);\n        $this->setOptions($options);\n        $this->setSaveHandler($handler);\n    }\n\n    /**\n     * Gets the save handler instance.\n     */\n    public function getSaveHandler(): AbstractProxy|\\SessionHandlerInterface\n    {\n        return $this->saveHandler;\n    }\n\n    public function start(): bool\n    {\n        if ($this->started) {\n            return true;\n        }\n\n        if (\\PHP_SESSION_ACTIVE === session_status()) {\n            throw new \\RuntimeException('Failed to start the session: already started by PHP.');\n        }\n\n        if (filter_var(\\ini_get('session.use_cookies'), \\FILTER_VALIDATE_BOOL) && headers_sent($file, $line)) {\n            throw new \\RuntimeException(sprintf('Failed to start the session because headers have already been sent by \"%s\" at line %d.', $file, $line));\n        }\n\n        $sessionId = $_COOKIE[session_name()] ?? null;\n        /*\n         * Explanation of the session ID regular expression: `/^[a-zA-Z0-9,-]{22,250}$/`.\n         *\n         * ---------- Part 1\n         *\n         * The part `[a-zA-Z0-9,-]` is related to the PHP ini directive `session.sid_bits_per_character` defined as 6.\n         * See https://www.php.net/manual/en/session.configuration.php#ini.session.sid-bits-per-character.\n         * Allowed values are integers such as:\n         * - 4 for range `a-f0-9`\n         * - 5 for range `a-v0-9`\n         * - 6 for range `a-zA-Z0-9,-`\n         *\n         * ---------- Part 2\n         *\n         * The part `{22,250}` is related to the PHP ini directive `session.sid_length`.\n         * See https://www.php.net/manual/en/session.configuration.php#ini.session.sid-length.\n         * Allowed values are integers between 22 and 256, but we use 250 for the max.\n         *\n         * Where does the 250 come from?\n         * - The length of Windows and Linux filenames is limited to 255 bytes. Then the max must not exceed 255.\n         * - The session filename prefix is `sess_`, a 5 bytes string. Then the max must not exceed 255 - 5 = 250.\n         *\n         * ---------- Conclusion\n         *\n         * The parts 1 and 2 prevent the warning below:\n         * `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.`\n         *\n         * The part 2 prevents the warning below:\n         * `PHP Warning: SessionHandler::read(): open(filepath, O_RDWR) failed: No such file or directory (2).`\n         */\n        if ($sessionId && $this->saveHandler instanceof AbstractProxy && 'files' === $this->saveHandler->getSaveHandlerName() && !preg_match('/^[a-zA-Z0-9,-]{22,250}$/', $sessionId)) {\n            // the session ID in the header is invalid, create a new one\n            session_id(session_create_id());\n        }\n\n        // ok to try and start the session\n        if (!session_start()) {\n            throw new \\RuntimeException('Failed to start the session.');\n        }\n\n        $this->loadSession();\n\n        return true;\n    }\n\n    public function getId(): string\n    {\n        return $this->saveHandler->getId();\n    }\n\n    /**\n     * @return void\n     */\n    public function setId(string $id)\n    {\n        $this->saveHandler->setId($id);\n    }\n\n    public function getName(): string\n    {\n        return $this->saveHandler->getName();\n    }\n\n    /**\n     * @return void\n     */\n    public function setName(string $name)\n    {\n        $this->saveHandler->setName($name);\n    }\n\n    public function regenerate(bool $destroy = false, ?int $lifetime = null): bool\n    {\n        // Cannot regenerate the session ID for non-active sessions.\n        if (\\PHP_SESSION_ACTIVE !== session_status()) {\n            return false;\n        }\n\n        if (headers_sent()) {\n            return false;\n        }\n\n        if (null !== $lifetime && $lifetime != \\ini_get('session.cookie_lifetime')) {\n            $this->save();\n            ini_set('session.cookie_lifetime', $lifetime);\n            $this->start();\n        }\n\n        if ($destroy) {\n            $this->metadataBag->stampNew();\n        }\n\n        return session_regenerate_id($destroy);\n    }\n\n    /**\n     * @return void\n     */\n    public function save()\n    {\n        // Store a copy so we can restore the bags in case the session was not left empty\n        $session = $_SESSION;\n\n        foreach ($this->bags as $bag) {\n            if (empty($_SESSION[$key = $bag->getStorageKey()])) {\n                unset($_SESSION[$key]);\n            }\n        }\n        if ($_SESSION && [$key = $this->metadataBag->getStorageKey()] === array_keys($_SESSION)) {\n            unset($_SESSION[$key]);\n        }\n\n        // Register error handler to add information about the current save handler\n        $previousHandler = set_error_handler(function ($type, $msg, $file, $line) use (&$previousHandler) {\n            if (\\E_WARNING === $type && str_starts_with($msg, 'session_write_close():')) {\n                $handler = $this->saveHandler instanceof SessionHandlerProxy ? $this->saveHandler->getHandler() : $this->saveHandler;\n                $msg = sprintf('session_write_close(): Failed to write session data with \"%s\" handler', $handler::class);\n            }\n\n            return $previousHandler ? $previousHandler($type, $msg, $file, $line) : false;\n        });\n\n        try {\n            session_write_close();\n        } finally {\n            restore_error_handler();\n\n            // Restore only if not empty\n            if ($_SESSION) {\n                $_SESSION = $session;\n            }\n        }\n\n        $this->closed = true;\n        $this->started = false;\n    }\n\n    /**\n     * @return void\n     */\n    public function clear()\n    {\n        // clear out the bags\n        foreach ($this->bags as $bag) {\n            $bag->clear();\n        }\n\n        // clear out the session\n        $_SESSION = [];\n\n        // reconnect the bags to the session\n        $this->loadSession();\n    }\n\n    /**\n     * @return void\n     */\n    public function registerBag(SessionBagInterface $bag)\n    {\n        if ($this->started) {\n            throw new \\LogicException('Cannot register a bag when the session is already started.');\n        }\n\n        $this->bags[$bag->getName()] = $bag;\n    }\n\n    public function getBag(string $name): SessionBagInterface\n    {\n        if (!isset($this->bags[$name])) {\n            throw new \\InvalidArgumentException(sprintf('The SessionBagInterface \"%s\" is not registered.', $name));\n        }\n\n        if (!$this->started && $this->saveHandler->isActive()) {\n            $this->loadSession();\n        } elseif (!$this->started) {\n            $this->start();\n        }\n\n        return $this->bags[$name];\n    }\n\n    /**\n     * @return void\n     */\n    public function setMetadataBag(?MetadataBag $metaBag = null)\n    {\n        if (1 > \\func_num_args()) {\n            trigger_deprecation('symfony/http-foundation', '6.2', 'Calling \"%s()\" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);\n        }\n        $this->metadataBag = $metaBag ?? new MetadataBag();\n    }\n\n    /**\n     * Gets the MetadataBag.\n     */\n    public function getMetadataBag(): MetadataBag\n    {\n        return $this->metadataBag;\n    }\n\n    public function isStarted(): bool\n    {\n        return $this->started;\n    }\n\n    /**\n     * Sets session.* ini variables.\n     *\n     * For convenience we omit 'session.' from the beginning of the keys.\n     * Explicitly ignores other ini keys.\n     *\n     * @param array $options Session ini directives [key => value]\n     *\n     * @see https://php.net/session.configuration\n     *\n     * @return void\n     */\n    public function setOptions(array $options)\n    {\n        if (headers_sent() || \\PHP_SESSION_ACTIVE === session_status()) {\n            return;\n        }\n\n        $validOptions = array_flip([\n            'cache_expire', 'cache_limiter', 'cookie_domain', 'cookie_httponly',\n            'cookie_lifetime', 'cookie_path', 'cookie_secure', 'cookie_samesite',\n            'gc_divisor', 'gc_maxlifetime', 'gc_probability',\n            'lazy_write', 'name', 'referer_check',\n            'serialize_handler', 'use_strict_mode', 'use_cookies',\n            'use_only_cookies', 'use_trans_sid',\n            'sid_length', 'sid_bits_per_character', 'trans_sid_hosts', 'trans_sid_tags',\n        ]);\n\n        foreach ($options as $key => $value) {\n            if (isset($validOptions[$key])) {\n                if ('cookie_secure' === $key && 'auto' === $value) {\n                    continue;\n                }\n                ini_set('session.'.$key, $value);\n            }\n        }\n    }\n\n    /**\n     * Registers session save handler as a PHP session handler.\n     *\n     * To use internal PHP session save handlers, override this method using ini_set with\n     * session.save_handler and session.save_path e.g.\n     *\n     *     ini_set('session.save_handler', 'files');\n     *     ini_set('session.save_path', '/tmp');\n     *\n     * or pass in a \\SessionHandler instance which configures session.save_handler in the\n     * constructor, for a template see NativeFileSessionHandler.\n     *\n     * @see https://php.net/session-set-save-handler\n     * @see https://php.net/sessionhandlerinterface\n     * @see https://php.net/sessionhandler\n     *\n     * @return void\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function setSaveHandler(AbstractProxy|\\SessionHandlerInterface|null $saveHandler = null)\n    {\n        if (1 > \\func_num_args()) {\n            trigger_deprecation('symfony/http-foundation', '6.2', 'Calling \"%s()\" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);\n        }\n\n        // Wrap $saveHandler in proxy and prevent double wrapping of proxy\n        if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \\SessionHandlerInterface) {\n            $saveHandler = new SessionHandlerProxy($saveHandler);\n        } elseif (!$saveHandler instanceof AbstractProxy) {\n            $saveHandler = new SessionHandlerProxy(new StrictSessionHandler(new \\SessionHandler()));\n        }\n        $this->saveHandler = $saveHandler;\n\n        if (headers_sent() || \\PHP_SESSION_ACTIVE === session_status()) {\n            return;\n        }\n\n        if ($this->saveHandler instanceof SessionHandlerProxy) {\n            session_set_save_handler($this->saveHandler, false);\n        }\n    }\n\n    /**\n     * Load the session with attributes.\n     *\n     * After starting the session, PHP retrieves the session from whatever handlers\n     * are set to (either PHP's internal, or a custom save handler set with session_set_save_handler()).\n     * PHP takes the return value from the read() handler, unserializes it\n     * and populates $_SESSION with the result automatically.\n     *\n     * @return void\n     */\n    protected function loadSession(?array &$session = null)\n    {\n        if (null === $session) {\n            $session = &$_SESSION;\n        }\n\n        $bags = array_merge($this->bags, [$this->metadataBag]);\n\n        foreach ($bags as $bag) {\n            $key = $bag->getStorageKey();\n            $session[$key] = isset($session[$key]) && \\is_array($session[$key]) ? $session[$key] : [];\n            $bag->initialize($session[$key]);\n        }\n\n        $this->started = true;\n        $this->closed = false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(NativeSessionStorage::class);\n\n/**\n * @author Jérémy Derussé <jeremy@derusse.com>\n */\nclass NativeSessionStorageFactory implements SessionStorageFactoryInterface\n{\n    private array $options;\n    private AbstractProxy|\\SessionHandlerInterface|null $handler;\n    private ?MetadataBag $metaBag;\n    private bool $secure;\n\n    /**\n     * @see NativeSessionStorage constructor.\n     */\n    public function __construct(array $options = [], AbstractProxy|\\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null, bool $secure = false)\n    {\n        $this->options = $options;\n        $this->handler = $handler;\n        $this->metaBag = $metaBag;\n        $this->secure = $secure;\n    }\n\n    public function createStorage(?Request $request): SessionStorageInterface\n    {\n        $storage = new NativeSessionStorage($this->options, $this->handler, $this->metaBag);\n        if ($this->secure && $request?->isSecure()) {\n            $storage->setOptions(['cookie_secure' => true]);\n        }\n\n        return $storage;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy;\n\n/**\n * Allows session to be started by PHP and managed by Symfony.\n *\n * @author Drak <drak@zikula.org>\n */\nclass PhpBridgeSessionStorage extends NativeSessionStorage\n{\n    public function __construct(AbstractProxy|\\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null)\n    {\n        if (!\\extension_loaded('session')) {\n            throw new \\LogicException('PHP extension \"session\" is required.');\n        }\n\n        $this->setMetadataBag($metaBag);\n        $this->setSaveHandler($handler);\n    }\n\n    public function start(): bool\n    {\n        if ($this->started) {\n            return true;\n        }\n\n        $this->loadSession();\n\n        return true;\n    }\n\n    /**\n     * @return void\n     */\n    public function clear()\n    {\n        // clear out the bags and nothing else that may be set\n        // since the purpose of this driver is to share a handler\n        foreach ($this->bags as $bag) {\n            $bag->clear();\n        }\n\n        // reconnect the bags to the session\n        $this->loadSession();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(PhpBridgeSessionStorage::class);\n\n/**\n * @author Jérémy Derussé <jeremy@derusse.com>\n */\nclass PhpBridgeSessionStorageFactory implements SessionStorageFactoryInterface\n{\n    private AbstractProxy|\\SessionHandlerInterface|null $handler;\n    private ?MetadataBag $metaBag;\n    private bool $secure;\n\n    public function __construct(AbstractProxy|\\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null, bool $secure = false)\n    {\n        $this->handler = $handler;\n        $this->metaBag = $metaBag;\n        $this->secure = $secure;\n    }\n\n    public function createStorage(?Request $request): SessionStorageInterface\n    {\n        $storage = new PhpBridgeSessionStorage($this->handler, $this->metaBag);\n        if ($this->secure && $request?->isSecure()) {\n            $storage->setOptions(['cookie_secure' => true]);\n        }\n\n        return $storage;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy;\n\n/**\n * @author Drak <drak@zikula.org>\n */\nabstract class AbstractProxy\n{\n    /**\n     * Flag if handler wraps an internal PHP session handler (using \\SessionHandler).\n     *\n     * @var bool\n     */\n    protected $wrapper = false;\n\n    /**\n     * @var string\n     */\n    protected $saveHandlerName;\n\n    /**\n     * Gets the session.save_handler name.\n     */\n    public function getSaveHandlerName(): ?string\n    {\n        return $this->saveHandlerName;\n    }\n\n    /**\n     * Is this proxy handler and instance of \\SessionHandlerInterface.\n     */\n    public function isSessionHandlerInterface(): bool\n    {\n        return $this instanceof \\SessionHandlerInterface;\n    }\n\n    /**\n     * Returns true if this handler wraps an internal PHP session save handler using \\SessionHandler.\n     */\n    public function isWrapper(): bool\n    {\n        return $this->wrapper;\n    }\n\n    /**\n     * Has a session started?\n     */\n    public function isActive(): bool\n    {\n        return \\PHP_SESSION_ACTIVE === session_status();\n    }\n\n    /**\n     * Gets the session ID.\n     */\n    public function getId(): string\n    {\n        return session_id();\n    }\n\n    /**\n     * Sets the session ID.\n     *\n     * @return void\n     *\n     * @throws \\LogicException\n     */\n    public function setId(string $id)\n    {\n        if ($this->isActive()) {\n            throw new \\LogicException('Cannot change the ID of an active session.');\n        }\n\n        session_id($id);\n    }\n\n    /**\n     * Gets the session name.\n     */\n    public function getName(): string\n    {\n        return session_name();\n    }\n\n    /**\n     * Sets the session name.\n     *\n     * @return void\n     *\n     * @throws \\LogicException\n     */\n    public function setName(string $name)\n    {\n        if ($this->isActive()) {\n            throw new \\LogicException('Cannot change the name of an active session.');\n        }\n\n        session_name($name);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler;\n\n/**\n * @author Drak <drak@zikula.org>\n */\nclass SessionHandlerProxy extends AbstractProxy implements \\SessionHandlerInterface, \\SessionUpdateTimestampHandlerInterface\n{\n    protected $handler;\n\n    public function __construct(\\SessionHandlerInterface $handler)\n    {\n        $this->handler = $handler;\n        $this->wrapper = $handler instanceof \\SessionHandler;\n        $this->saveHandlerName = $this->wrapper || ($handler instanceof StrictSessionHandler && $handler->isWrapper()) ? \\ini_get('session.save_handler') : 'user';\n    }\n\n    public function getHandler(): \\SessionHandlerInterface\n    {\n        return $this->handler;\n    }\n\n    // \\SessionHandlerInterface\n\n    public function open(string $savePath, string $sessionName): bool\n    {\n        return $this->handler->open($savePath, $sessionName);\n    }\n\n    public function close(): bool\n    {\n        return $this->handler->close();\n    }\n\n    public function read(#[\\SensitiveParameter] string $sessionId): string|false\n    {\n        return $this->handler->read($sessionId);\n    }\n\n    public function write(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        return $this->handler->write($sessionId, $data);\n    }\n\n    public function destroy(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        return $this->handler->destroy($sessionId);\n    }\n\n    public function gc(int $maxlifetime): int|false\n    {\n        return $this->handler->gc($maxlifetime);\n    }\n\n    public function validateId(#[\\SensitiveParameter] string $sessionId): bool\n    {\n        return !$this->handler instanceof \\SessionUpdateTimestampHandlerInterface || $this->handler->validateId($sessionId);\n    }\n\n    public function updateTimestamp(#[\\SensitiveParameter] string $sessionId, string $data): bool\n    {\n        return $this->handler instanceof \\SessionUpdateTimestampHandlerInterface ? $this->handler->updateTimestamp($sessionId, $data) : $this->write($sessionId, $data);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\n\n/**\n * @author Jérémy Derussé <jeremy@derusse.com>\n */\ninterface SessionStorageFactoryInterface\n{\n    /**\n     * Creates a new instance of SessionStorageInterface.\n     */\n    public function createStorage(?Request $request): SessionStorageInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Session\\Storage;\n\nuse Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface;\n\n/**\n * StorageInterface.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Drak <drak@zikula.org>\n */\ninterface SessionStorageInterface\n{\n    /**\n     * Starts the session.\n     *\n     * @throws \\RuntimeException if something goes wrong starting the session\n     */\n    public function start(): bool;\n\n    /**\n     * Checks if the session is started.\n     */\n    public function isStarted(): bool;\n\n    /**\n     * Returns the session ID.\n     */\n    public function getId(): string;\n\n    /**\n     * Sets the session ID.\n     *\n     * @return void\n     */\n    public function setId(string $id);\n\n    /**\n     * Returns the session name.\n     */\n    public function getName(): string;\n\n    /**\n     * Sets the session name.\n     *\n     * @return void\n     */\n    public function setName(string $name);\n\n    /**\n     * Regenerates id that represents this storage.\n     *\n     * This method must invoke session_regenerate_id($destroy) unless\n     * this interface is used for a storage object designed for unit\n     * or functional testing where a real PHP session would interfere\n     * with testing.\n     *\n     * Note regenerate+destroy should not clear the session data in memory\n     * only delete the session data from persistent storage.\n     *\n     * Care: When regenerating the session ID no locking is involved in PHP's\n     * session design. See https://bugs.php.net/61470 for a discussion.\n     * So you must make sure the regenerated session is saved BEFORE sending the\n     * headers with the new ID. Symfony's HttpKernel offers a listener for this.\n     * See Symfony\\Component\\HttpKernel\\EventListener\\SaveSessionListener.\n     * Otherwise session data could get lost again for concurrent requests with the\n     * new ID. One result could be that you get logged out after just logging in.\n     *\n     * @param bool     $destroy  Destroy session when regenerating?\n     * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value\n     *                           will leave the system settings unchanged, 0 sets the cookie\n     *                           to expire with browser session. Time is in seconds, and is\n     *                           not a Unix timestamp.\n     *\n     * @throws \\RuntimeException If an error occurs while regenerating this storage\n     */\n    public function regenerate(bool $destroy = false, ?int $lifetime = null): bool;\n\n    /**\n     * Force the session to be saved and closed.\n     *\n     * This method must invoke session_write_close() unless this interface is\n     * used for a storage object design for unit or functional testing where\n     * a real PHP session would interfere with testing, in which case\n     * it should actually persist the session data if required.\n     *\n     * @return void\n     *\n     * @throws \\RuntimeException if the session is saved without being started, or if the session\n     *                           is already closed\n     */\n    public function save();\n\n    /**\n     * Clear all session data in memory.\n     *\n     * @return void\n     */\n    public function clear();\n\n    /**\n     * Gets a SessionBagInterface by name.\n     *\n     * @throws \\InvalidArgumentException If the bag does not exist\n     */\n    public function getBag(string $name): SessionBagInterface;\n\n    /**\n     * Registers a SessionBagInterface for use.\n     *\n     * @return void\n     */\n    public function registerBag(SessionBagInterface $bag);\n\n    public function getMetadataBag(): MetadataBag;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/StreamedJsonResponse.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * StreamedJsonResponse represents a streamed HTTP response for JSON.\n *\n * A StreamedJsonResponse uses a structure and generics to create an\n * efficient resource-saving JSON response.\n *\n * It is recommended to use flush() function after a specific number of items to directly stream the data.\n *\n * @see flush()\n *\n * @author Alexander Schranz <alexander@sulu.io>\n *\n * Example usage:\n *\n *     function loadArticles(): \\Generator\n *         // some streamed loading\n *         yield ['title' => 'Article 1'];\n *         yield ['title' => 'Article 2'];\n *         yield ['title' => 'Article 3'];\n *         // recommended to use flush() after every specific number of items\n *     }),\n *\n *     $response = new StreamedJsonResponse(\n *         // json structure with generators in which will be streamed\n *         [\n *             '_embedded' => [\n *                 'articles' => loadArticles(), // any generator which you want to stream as list of data\n *             ],\n *         ],\n *     );\n */\nclass StreamedJsonResponse extends StreamedResponse\n{\n    private const PLACEHOLDER = '__symfony_json__';\n\n    /**\n     * @param mixed[]                        $data            JSON Data containing PHP generators which will be streamed as list of data or a Generator\n     * @param int                            $status          The HTTP status code (200 \"OK\" by default)\n     * @param array<string, string|string[]> $headers         An array of HTTP headers\n     * @param int                            $encodingOptions Flags for the json_encode() function\n     */\n    public function __construct(\n        private readonly iterable $data,\n        int $status = 200,\n        array $headers = [],\n        private int $encodingOptions = JsonResponse::DEFAULT_ENCODING_OPTIONS,\n    ) {\n        parent::__construct($this->stream(...), $status, $headers);\n\n        if (!$this->headers->get('Content-Type')) {\n            $this->headers->set('Content-Type', 'application/json');\n        }\n    }\n\n    private function stream(): void\n    {\n        $jsonEncodingOptions = \\JSON_THROW_ON_ERROR | $this->encodingOptions;\n        $keyEncodingOptions = $jsonEncodingOptions & ~\\JSON_NUMERIC_CHECK;\n\n        $this->streamData($this->data, $jsonEncodingOptions, $keyEncodingOptions);\n    }\n\n    private function streamData(mixed $data, int $jsonEncodingOptions, int $keyEncodingOptions): void\n    {\n        if (\\is_array($data)) {\n            $this->streamArray($data, $jsonEncodingOptions, $keyEncodingOptions);\n\n            return;\n        }\n\n        if (is_iterable($data) && !$data instanceof \\JsonSerializable) {\n            $this->streamIterable($data, $jsonEncodingOptions, $keyEncodingOptions);\n\n            return;\n        }\n\n        echo json_encode($data, $jsonEncodingOptions);\n    }\n\n    private function streamArray(array $data, int $jsonEncodingOptions, int $keyEncodingOptions): void\n    {\n        $generators = [];\n\n        array_walk_recursive($data, function (&$item, $key) use (&$generators) {\n            if (self::PLACEHOLDER === $key) {\n                // if the placeholder is already in the structure it should be replaced with a new one that explode\n                // works like expected for the structure\n                $generators[] = $key;\n            }\n\n            // generators should be used but for better DX all kind of Traversable and objects are supported\n            if (\\is_object($item)) {\n                $generators[] = $item;\n                $item = self::PLACEHOLDER;\n            } elseif (self::PLACEHOLDER === $item) {\n                // if the placeholder is already in the structure it should be replaced with a new one that explode\n                // works like expected for the structure\n                $generators[] = $item;\n            }\n        });\n\n        $jsonParts = explode('\"'.self::PLACEHOLDER.'\"', json_encode($data, $jsonEncodingOptions));\n\n        foreach ($generators as $index => $generator) {\n            // send first and between parts of the structure\n            echo $jsonParts[$index];\n\n            $this->streamData($generator, $jsonEncodingOptions, $keyEncodingOptions);\n        }\n\n        // send last part of the structure\n        echo $jsonParts[array_key_last($jsonParts)];\n    }\n\n    private function streamIterable(iterable $iterable, int $jsonEncodingOptions, int $keyEncodingOptions): void\n    {\n        $isFirstItem = true;\n        $startTag = '[';\n\n        foreach ($iterable as $key => $item) {\n            if ($isFirstItem) {\n                $isFirstItem = false;\n                // depending on the first elements key the generator is detected as a list or map\n                // we can not check for a whole list or map because that would hurt the performance\n                // of the streamed response which is the main goal of this response class\n                if (0 !== $key) {\n                    $startTag = '{';\n                }\n\n                echo $startTag;\n            } else {\n                // if not first element of the generic, a separator is required between the elements\n                echo ',';\n            }\n\n            if ('{' === $startTag) {\n                echo json_encode((string) $key, $keyEncodingOptions).':';\n            }\n\n            $this->streamData($item, $jsonEncodingOptions, $keyEncodingOptions);\n        }\n\n        if ($isFirstItem) { // indicates that the generator was empty\n            echo '[';\n        }\n\n        echo '[' === $startTag ? ']' : '}';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/StreamedResponse.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * StreamedResponse represents a streamed HTTP response.\n *\n * A StreamedResponse uses a callback for its content.\n *\n * The callback should use the standard PHP functions like echo\n * to stream the response back to the client. The flush() function\n * can also be used if needed.\n *\n * @see flush()\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass StreamedResponse extends Response\n{\n    protected $callback;\n    protected $streamed;\n    private bool $headersSent;\n\n    /**\n     * @param int $status The HTTP status code (200 \"OK\" by default)\n     */\n    public function __construct(?callable $callback = null, int $status = 200, array $headers = [])\n    {\n        parent::__construct(null, $status, $headers);\n\n        if (null !== $callback) {\n            $this->setCallback($callback);\n        }\n        $this->streamed = false;\n        $this->headersSent = false;\n    }\n\n    /**\n     * Sets the PHP callback associated with this Response.\n     *\n     * @return $this\n     */\n    public function setCallback(callable $callback): static\n    {\n        $this->callback = $callback(...);\n\n        return $this;\n    }\n\n    public function getCallback(): ?\\Closure\n    {\n        if (!isset($this->callback)) {\n            return null;\n        }\n\n        return ($this->callback)(...);\n    }\n\n    /**\n     * This method only sends the headers once.\n     *\n     * @param positive-int|null $statusCode The status code to use, override the statusCode property if set and not null\n     *\n     * @return $this\n     */\n    public function sendHeaders(/* int $statusCode = null */): static\n    {\n        if ($this->headersSent) {\n            return $this;\n        }\n\n        $statusCode = \\func_num_args() > 0 ? func_get_arg(0) : null;\n        if ($statusCode < 100 || $statusCode >= 200) {\n            $this->headersSent = true;\n        }\n\n        return parent::sendHeaders($statusCode);\n    }\n\n    /**\n     * This method only sends the content once.\n     *\n     * @return $this\n     */\n    public function sendContent(): static\n    {\n        if ($this->streamed) {\n            return $this;\n        }\n\n        $this->streamed = true;\n\n        if (!isset($this->callback)) {\n            throw new \\LogicException('The Response callback must be set.');\n        }\n\n        ($this->callback)();\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     *\n     * @throws \\LogicException when the content is not null\n     */\n    public function setContent(?string $content): static\n    {\n        if (null !== $content) {\n            throw new \\LogicException('The content cannot be set on a StreamedResponse instance.');\n        }\n\n        $this->streamed = true;\n\n        return $this;\n    }\n\n    public function getContent(): string|false\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Test\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\HttpFoundation\\Request;\n\nfinal class RequestAttributeValueSame extends Constraint\n{\n    private string $name;\n    private string $value;\n\n    public function __construct(string $name, string $value)\n    {\n        $this->name = $name;\n        $this->value = $value;\n    }\n\n    public function toString(): string\n    {\n        return sprintf('has attribute \"%s\" with value \"%s\"', $this->name, $this->value);\n    }\n\n    /**\n     * @param Request $request\n     */\n    protected function matches($request): bool\n    {\n        return $this->value === $request->attributes->get($this->name);\n    }\n\n    /**\n     * @param Request $request\n     */\n    protected function failureDescription($request): string\n    {\n        return 'the Request '.$this->toString();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Test\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\HttpFoundation\\Cookie;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nfinal class ResponseCookieValueSame extends Constraint\n{\n    private string $name;\n    private string $value;\n    private string $path;\n    private ?string $domain;\n\n    public function __construct(string $name, string $value, string $path = '/', ?string $domain = null)\n    {\n        $this->name = $name;\n        $this->value = $value;\n        $this->path = $path;\n        $this->domain = $domain;\n    }\n\n    public function toString(): string\n    {\n        $str = sprintf('has cookie \"%s\"', $this->name);\n        if ('/' !== $this->path) {\n            $str .= sprintf(' with path \"%s\"', $this->path);\n        }\n        if ($this->domain) {\n            $str .= sprintf(' for domain \"%s\"', $this->domain);\n        }\n        $str .= sprintf(' with value \"%s\"', $this->value);\n\n        return $str;\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function matches($response): bool\n    {\n        $cookie = $this->getCookie($response);\n        if (!$cookie) {\n            return false;\n        }\n\n        return $this->value === (string) $cookie->getValue();\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function failureDescription($response): string\n    {\n        return 'the Response '.$this->toString();\n    }\n\n    protected function getCookie(Response $response): ?Cookie\n    {\n        $cookies = $response->headers->getCookies();\n\n        $filteredCookies = array_filter($cookies, fn (Cookie $cookie) => $cookie->getName() === $this->name && $cookie->getPath() === $this->path && $cookie->getDomain() === $this->domain);\n\n        return reset($filteredCookies) ?: null;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Test\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\n/**\n * Asserts that the response is in the given format.\n *\n * @author Kévin Dunglas <dunglas@gmail.com>\n */\nfinal class ResponseFormatSame extends Constraint\n{\n    private Request $request;\n    private ?string $format;\n\n    public function __construct(Request $request, ?string $format)\n    {\n        $this->request = $request;\n        $this->format = $format;\n    }\n\n    public function toString(): string\n    {\n        return 'format is '.($this->format ?? 'null');\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function matches($response): bool\n    {\n        return $this->format === $this->request->getFormat($response->headers->get('Content-Type'));\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function failureDescription($response): string\n    {\n        return 'the Response '.$this->toString();\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function additionalFailureDescription($response): string\n    {\n        return (string) $response;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Test\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\HttpFoundation\\Cookie;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nfinal class ResponseHasCookie extends Constraint\n{\n    private string $name;\n    private string $path;\n    private ?string $domain;\n\n    public function __construct(string $name, string $path = '/', ?string $domain = null)\n    {\n        $this->name = $name;\n        $this->path = $path;\n        $this->domain = $domain;\n    }\n\n    public function toString(): string\n    {\n        $str = sprintf('has cookie \"%s\"', $this->name);\n        if ('/' !== $this->path) {\n            $str .= sprintf(' with path \"%s\"', $this->path);\n        }\n        if ($this->domain) {\n            $str .= sprintf(' for domain \"%s\"', $this->domain);\n        }\n\n        return $str;\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function matches($response): bool\n    {\n        return null !== $this->getCookie($response);\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function failureDescription($response): string\n    {\n        return 'the Response '.$this->toString();\n    }\n\n    private function getCookie(Response $response): ?Cookie\n    {\n        $cookies = $response->headers->getCookies();\n\n        $filteredCookies = array_filter($cookies, fn (Cookie $cookie) => $cookie->getName() === $this->name && $cookie->getPath() === $this->path && $cookie->getDomain() === $this->domain);\n\n        return reset($filteredCookies) ?: null;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Test\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nfinal class ResponseHasHeader extends Constraint\n{\n    private string $headerName;\n\n    public function __construct(string $headerName)\n    {\n        $this->headerName = $headerName;\n    }\n\n    public function toString(): string\n    {\n        return sprintf('has header \"%s\"', $this->headerName);\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function matches($response): bool\n    {\n        return $response->headers->has($this->headerName);\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function failureDescription($response): string\n    {\n        return 'the Response '.$this->toString();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Test\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nfinal class ResponseHeaderLocationSame extends Constraint\n{\n    public function __construct(private Request $request, private string $expectedValue)\n    {\n    }\n\n    public function toString(): string\n    {\n        return sprintf('has header \"Location\" matching \"%s\"', $this->expectedValue);\n    }\n\n    protected function matches($other): bool\n    {\n        if (!$other instanceof Response) {\n            return false;\n        }\n\n        $location = $other->headers->get('Location');\n\n        if (null === $location) {\n            return false;\n        }\n\n        return $this->toFullUrl($this->expectedValue) === $this->toFullUrl($location);\n    }\n\n    protected function failureDescription($other): string\n    {\n        return 'the Response '.$this->toString();\n    }\n\n    private function toFullUrl(string $url): string\n    {\n        if (null === parse_url($url, \\PHP_URL_PATH)) {\n            $url .= '/';\n        }\n\n        if (str_starts_with($url, '//')) {\n            return sprintf('%s:%s', $this->request->getScheme(), $url);\n        }\n\n        if (str_starts_with($url, '/')) {\n            return $this->request->getSchemeAndHttpHost().$url;\n        }\n\n        return $url;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Test\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nfinal class ResponseHeaderSame extends Constraint\n{\n    private string $headerName;\n    private string $expectedValue;\n\n    public function __construct(string $headerName, string $expectedValue)\n    {\n        $this->headerName = $headerName;\n        $this->expectedValue = $expectedValue;\n    }\n\n    public function toString(): string\n    {\n        return sprintf('has header \"%s\" with value \"%s\"', $this->headerName, $this->expectedValue);\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function matches($response): bool\n    {\n        return $this->expectedValue === $response->headers->get($this->headerName, null);\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function failureDescription($response): string\n    {\n        return 'the Response '.$this->toString();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Test\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nfinal class ResponseIsRedirected extends Constraint\n{\n    public function toString(): string\n    {\n        return 'is redirected';\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function matches($response): bool\n    {\n        return $response->isRedirect();\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function failureDescription($response): string\n    {\n        return 'the Response '.$this->toString();\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function additionalFailureDescription($response): string\n    {\n        return (string) $response;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Test\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nfinal class ResponseIsSuccessful extends Constraint\n{\n    public function toString(): string\n    {\n        return 'is successful';\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function matches($response): bool\n    {\n        return $response->isSuccessful();\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function failureDescription($response): string\n    {\n        return 'the Response '.$this->toString();\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function additionalFailureDescription($response): string\n    {\n        return (string) $response;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Test\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nfinal class ResponseIsUnprocessable extends Constraint\n{\n    public function toString(): string\n    {\n        return 'is unprocessable';\n    }\n\n    /**\n     * @param Response $other\n     */\n    protected function matches($other): bool\n    {\n        return Response::HTTP_UNPROCESSABLE_ENTITY === $other->getStatusCode();\n    }\n\n    /**\n     * @param Response $other\n     */\n    protected function failureDescription($other): string\n    {\n        return 'the Response '.$this->toString();\n    }\n\n    /**\n     * @param Response $other\n     */\n    protected function additionalFailureDescription($other): string\n    {\n        return (string) $other;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation\\Test\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nfinal class ResponseStatusCodeSame extends Constraint\n{\n    private int $statusCode;\n\n    public function __construct(int $statusCode)\n    {\n        $this->statusCode = $statusCode;\n    }\n\n    public function toString(): string\n    {\n        return 'status code is '.$this->statusCode;\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function matches($response): bool\n    {\n        return $this->statusCode === $response->getStatusCode();\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function failureDescription($response): string\n    {\n        return 'the Response '.$this->toString();\n    }\n\n    /**\n     * @param Response $response\n     */\n    protected function additionalFailureDescription($response): string\n    {\n        return (string) $response;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/UriSigner.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\n/**\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass UriSigner\n{\n    private string $secret;\n    private string $parameter;\n\n    /**\n     * @param string $parameter Query string parameter to use\n     */\n    public function __construct(#[\\SensitiveParameter] string $secret, string $parameter = '_hash')\n    {\n        if (!$secret) {\n            throw new \\InvalidArgumentException('A non-empty secret is required.');\n        }\n\n        $this->secret = $secret;\n        $this->parameter = $parameter;\n    }\n\n    /**\n     * Signs a URI.\n     *\n     * The given URI is signed by adding the query string parameter\n     * which value depends on the URI and the secret.\n     */\n    public function sign(string $uri): string\n    {\n        $url = parse_url($uri);\n        $params = [];\n\n        if (isset($url['query'])) {\n            parse_str($url['query'], $params);\n        }\n\n        $uri = $this->buildUrl($url, $params);\n        $params[$this->parameter] = $this->computeHash($uri);\n\n        return $this->buildUrl($url, $params);\n    }\n\n    /**\n     * Checks that a URI contains the correct hash.\n     */\n    public function check(string $uri): bool\n    {\n        $url = parse_url($uri);\n        $params = [];\n\n        if (isset($url['query'])) {\n            parse_str($url['query'], $params);\n        }\n\n        if (empty($params[$this->parameter])) {\n            return false;\n        }\n\n        $hash = $params[$this->parameter];\n        unset($params[$this->parameter]);\n\n        return hash_equals($this->computeHash($this->buildUrl($url, $params)), $hash);\n    }\n\n    public function checkRequest(Request $request): bool\n    {\n        $qs = ($qs = $request->server->get('QUERY_STRING')) ? '?'.$qs : '';\n\n        // we cannot use $request->getUri() here as we want to work with the original URI (no query string reordering)\n        return $this->check($request->getSchemeAndHttpHost().$request->getBaseUrl().$request->getPathInfo().$qs);\n    }\n\n    private function computeHash(string $uri): string\n    {\n        return base64_encode(hash_hmac('sha256', $uri, $this->secret, true));\n    }\n\n    private function buildUrl(array $url, array $params = []): string\n    {\n        ksort($params, \\SORT_STRING);\n        $url['query'] = http_build_query($params, '', '&');\n\n        $scheme = isset($url['scheme']) ? $url['scheme'].'://' : '';\n        $host = $url['host'] ?? '';\n        $port = isset($url['port']) ? ':'.$url['port'] : '';\n        $user = $url['user'] ?? '';\n        $pass = isset($url['pass']) ? ':'.$url['pass'] : '';\n        $pass = ($user || $pass) ? \"$pass@\" : '';\n        $path = $url['path'] ?? '';\n        $query = $url['query'] ? '?'.$url['query'] : '';\n        $fragment = isset($url['fragment']) ? '#'.$url['fragment'] : '';\n\n        return $scheme.$user.$pass.$host.$port.$path.$query.$fragment;\n    }\n}\n\nif (!class_exists(\\Symfony\\Component\\HttpKernel\\UriSigner::class, false)) {\n    class_alias(UriSigner::class, \\Symfony\\Component\\HttpKernel\\UriSigner::class);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/UrlHelper.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\HttpFoundation;\n\nuse Symfony\\Component\\Routing\\RequestContext;\nuse Symfony\\Component\\Routing\\RequestContextAwareInterface;\n\n/**\n * A helper service for manipulating URLs within and outside the request scope.\n *\n * @author Valentin Udaltsov <udaltsov.valentin@gmail.com>\n */\nfinal class UrlHelper\n{\n    public function __construct(\n        private RequestStack $requestStack,\n        private RequestContextAwareInterface|RequestContext|null $requestContext = null,\n    ) {\n    }\n\n    public function getAbsoluteUrl(string $path): string\n    {\n        if (str_contains($path, '://') || str_starts_with($path, '//')) {\n            return $path;\n        }\n\n        if (null === $request = $this->requestStack->getMainRequest()) {\n            return $this->getAbsoluteUrlFromContext($path);\n        }\n\n        if ('#' === $path[0]) {\n            $path = $request->getRequestUri().$path;\n        } elseif ('?' === $path[0]) {\n            $path = $request->getPathInfo().$path;\n        }\n\n        if (!$path || '/' !== $path[0]) {\n            $prefix = $request->getPathInfo();\n            $last = \\strlen($prefix) - 1;\n            if ($last !== $pos = strrpos($prefix, '/')) {\n                $prefix = substr($prefix, 0, $pos).'/';\n            }\n\n            return $request->getUriForPath($prefix.$path);\n        }\n\n        return $request->getSchemeAndHttpHost().$path;\n    }\n\n    public function getRelativePath(string $path): string\n    {\n        if (str_contains($path, '://') || str_starts_with($path, '//')) {\n            return $path;\n        }\n\n        if (null === $request = $this->requestStack->getMainRequest()) {\n            return $path;\n        }\n\n        return $request->getRelativeUriForPath($path);\n    }\n\n    private function getAbsoluteUrlFromContext(string $path): string\n    {\n        if (null === $context = $this->requestContext) {\n            return $path;\n        }\n\n        if ($context instanceof RequestContextAwareInterface) {\n            $context = $context->getContext();\n        }\n\n        if ('' === $host = $context->getHost()) {\n            return $path;\n        }\n\n        $scheme = $context->getScheme();\n        $port = '';\n\n        if ('http' === $scheme && 80 !== $context->getHttpPort()) {\n            $port = ':'.$context->getHttpPort();\n        } elseif ('https' === $scheme && 443 !== $context->getHttpsPort()) {\n            $port = ':'.$context->getHttpsPort();\n        }\n\n        if ('#' === $path[0]) {\n            $queryString = $context->getQueryString();\n            $path = $context->getPathInfo().($queryString ? '?'.$queryString : '').$path;\n        } elseif ('?' === $path[0]) {\n            $path = $context->getPathInfo().$path;\n        }\n\n        if ('/' !== $path[0]) {\n            $path = rtrim($context->getBaseUrl(), '/').'/'.$path;\n        }\n\n        return $scheme.'://'.$host.$port.$path;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/http-foundation/composer.json",
    "content": "{\n    \"name\": \"symfony/http-foundation\",\n    \"type\": \"library\",\n    \"description\": \"Defines an object-oriented layer for the HTTP specification\",\n    \"keywords\": [],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Fabien Potencier\",\n            \"email\": \"fabien@symfony.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.1\",\n        \"symfony/deprecation-contracts\": \"^2.5|^3\",\n        \"symfony/polyfill-mbstring\": \"~1.1\",\n        \"symfony/polyfill-php83\": \"^1.27\"\n    },\n    \"require-dev\": {\n        \"doctrine/dbal\": \"^2.13.1|^3|^4\",\n        \"predis/predis\": \"^1.1|^2.0\",\n        \"symfony/cache\": \"^6.3|^7.0\",\n        \"symfony/dependency-injection\": \"^5.4|^6.0|^7.0\",\n        \"symfony/http-kernel\": \"^5.4.12|^6.0.12|^6.1.4|^7.0\",\n        \"symfony/mime\": \"^5.4|^6.0|^7.0\",\n        \"symfony/expression-language\": \"^5.4|^6.0|^7.0\",\n        \"symfony/rate-limiter\": \"^5.4|^6.0|^7.0\"\n    },\n    \"conflict\": {\n        \"symfony/cache\": \"<6.3\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Component\\\\HttpFoundation\\\\\": \"\" },\n        \"exclude-from-classmap\": [\n            \"/Tests/\"\n        ]\n    },\n    \"minimum-stability\": \"dev\"\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-mbstring/LICENSE",
    "content": "Copyright (c) 2015-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-mbstring/Mbstring.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Polyfill\\Mbstring;\n\n/**\n * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.\n *\n * Implemented:\n * - mb_chr                  - Returns a specific character from its Unicode code point\n * - mb_convert_encoding     - Convert character encoding\n * - mb_convert_variables    - Convert character code in variable(s)\n * - mb_decode_mimeheader    - Decode string in MIME header field\n * - mb_encode_mimeheader    - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED\n * - mb_decode_numericentity - Decode HTML numeric string reference to character\n * - mb_encode_numericentity - Encode character to HTML numeric string reference\n * - mb_convert_case         - Perform case folding on a string\n * - mb_detect_encoding      - Detect character encoding\n * - mb_get_info             - Get internal settings of mbstring\n * - mb_http_input           - Detect HTTP input character encoding\n * - mb_http_output          - Set/Get HTTP output character encoding\n * - mb_internal_encoding    - Set/Get internal character encoding\n * - mb_list_encodings       - Returns an array of all supported encodings\n * - mb_ord                  - Returns the Unicode code point of a character\n * - mb_output_handler       - Callback function converts character encoding in output buffer\n * - mb_scrub                - Replaces ill-formed byte sequences with substitute characters\n * - mb_strlen               - Get string length\n * - mb_strpos               - Find position of first occurrence of string in a string\n * - mb_strrpos              - Find position of last occurrence of a string in a string\n * - mb_str_split            - Convert a string to an array\n * - mb_strtolower           - Make a string lowercase\n * - mb_strtoupper           - Make a string uppercase\n * - mb_substitute_character - Set/Get substitution character\n * - mb_substr               - Get part of string\n * - mb_stripos              - Finds position of first occurrence of a string within another, case insensitive\n * - mb_stristr              - Finds first occurrence of a string within another, case insensitive\n * - mb_strrchr              - Finds the last occurrence of a character in a string within another\n * - mb_strrichr             - Finds the last occurrence of a character in a string within another, case insensitive\n * - mb_strripos             - Finds position of last occurrence of a string within another, case insensitive\n * - mb_strstr               - Finds first occurrence of a string within another\n * - mb_strwidth             - Return width of string\n * - mb_substr_count         - Count the number of substring occurrences\n *\n * Not implemented:\n * - mb_convert_kana         - Convert \"kana\" one from another (\"zen-kaku\", \"han-kaku\" and more)\n * - mb_ereg_*               - Regular expression with multibyte support\n * - mb_parse_str            - Parse GET/POST/COOKIE data and set global variable\n * - mb_preferred_mime_name  - Get MIME charset string\n * - mb_regex_encoding       - Returns current encoding for multibyte regex as string\n * - mb_regex_set_options    - Set/Get the default options for mbregex functions\n * - mb_send_mail            - Send encoded mail\n * - mb_split                - Split multibyte string using regular expression\n * - mb_strcut               - Get part of string\n * - mb_strimwidth           - Get truncated string with specified width\n *\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nfinal class Mbstring\n{\n    public const MB_CASE_FOLD = \\PHP_INT_MAX;\n\n    private const SIMPLE_CASE_FOLD = [\n        ['µ', 'ſ', \"\\xCD\\x85\", 'ς', \"\\xCF\\x90\", \"\\xCF\\x91\", \"\\xCF\\x95\", \"\\xCF\\x96\", \"\\xCF\\xB0\", \"\\xCF\\xB1\", \"\\xCF\\xB5\", \"\\xE1\\xBA\\x9B\", \"\\xE1\\xBE\\xBE\"],\n        ['μ', 's', 'ι',        'σ', 'β',        'θ',        'φ',        'π',        'κ',        'ρ',        'ε',        \"\\xE1\\xB9\\xA1\", 'ι'],\n    ];\n\n    private static $encodingList = ['ASCII', 'UTF-8'];\n    private static $language = 'neutral';\n    private static $internalEncoding = 'UTF-8';\n\n    public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)\n    {\n        if (\\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) {\n            $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);\n        } else {\n            $fromEncoding = self::getEncoding($fromEncoding);\n        }\n\n        $toEncoding = self::getEncoding($toEncoding);\n\n        if ('BASE64' === $fromEncoding) {\n            $s = base64_decode($s);\n            $fromEncoding = $toEncoding;\n        }\n\n        if ('BASE64' === $toEncoding) {\n            return base64_encode($s);\n        }\n\n        if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {\n            if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {\n                $fromEncoding = 'Windows-1252';\n            }\n            if ('UTF-8' !== $fromEncoding) {\n                $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);\n            }\n\n            return preg_replace_callback('/[\\x80-\\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s);\n        }\n\n        if ('HTML-ENTITIES' === $fromEncoding) {\n            $s = html_entity_decode($s, \\ENT_COMPAT, 'UTF-8');\n            $fromEncoding = 'UTF-8';\n        }\n\n        return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);\n    }\n\n    public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars)\n    {\n        $ok = true;\n        array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {\n            if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {\n                $ok = false;\n            }\n        });\n\n        return $ok ? $fromEncoding : false;\n    }\n\n    public static function mb_decode_mimeheader($s)\n    {\n        return iconv_mime_decode($s, 2, self::$internalEncoding);\n    }\n\n    public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)\n    {\n        trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \\E_USER_WARNING);\n    }\n\n    public static function mb_decode_numericentity($s, $convmap, $encoding = null)\n    {\n        if (null !== $s && !\\is_scalar($s) && !(\\is_object($s) && method_exists($s, '__toString'))) {\n            trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\\gettype($s).' given', \\E_USER_WARNING);\n\n            return null;\n        }\n\n        if (!\\is_array($convmap) || (80000 > \\PHP_VERSION_ID && !$convmap)) {\n            return false;\n        }\n\n        if (null !== $encoding && !\\is_scalar($encoding)) {\n            trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\\gettype($s).' given', \\E_USER_WARNING);\n\n            return '';  // Instead of null (cf. mb_encode_numericentity).\n        }\n\n        $s = (string) $s;\n        if ('' === $s) {\n            return '';\n        }\n\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $encoding) {\n            $encoding = null;\n            if (!preg_match('//u', $s)) {\n                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);\n            }\n        } else {\n            $s = iconv($encoding, 'UTF-8//IGNORE', $s);\n        }\n\n        $cnt = floor(\\count($convmap) / 4) * 4;\n\n        for ($i = 0; $i < $cnt; $i += 4) {\n            // collector_decode_htmlnumericentity ignores $convmap[$i + 3]\n            $convmap[$i] += $convmap[$i + 2];\n            $convmap[$i + 1] += $convmap[$i + 2];\n        }\n\n        $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) {\n            $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];\n            for ($i = 0; $i < $cnt; $i += 4) {\n                if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {\n                    return self::mb_chr($c - $convmap[$i + 2]);\n                }\n            }\n\n            return $m[0];\n        }, $s);\n\n        if (null === $encoding) {\n            return $s;\n        }\n\n        return iconv('UTF-8', $encoding.'//IGNORE', $s);\n    }\n\n    public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)\n    {\n        if (null !== $s && !\\is_scalar($s) && !(\\is_object($s) && method_exists($s, '__toString'))) {\n            trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\\gettype($s).' given', \\E_USER_WARNING);\n\n            return null;\n        }\n\n        if (!\\is_array($convmap) || (80000 > \\PHP_VERSION_ID && !$convmap)) {\n            return false;\n        }\n\n        if (null !== $encoding && !\\is_scalar($encoding)) {\n            trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\\gettype($s).' given', \\E_USER_WARNING);\n\n            return null;  // Instead of '' (cf. mb_decode_numericentity).\n        }\n\n        if (null !== $is_hex && !\\is_scalar($is_hex)) {\n            trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\\gettype($s).' given', \\E_USER_WARNING);\n\n            return null;\n        }\n\n        $s = (string) $s;\n        if ('' === $s) {\n            return '';\n        }\n\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $encoding) {\n            $encoding = null;\n            if (!preg_match('//u', $s)) {\n                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);\n            }\n        } else {\n            $s = iconv($encoding, 'UTF-8//IGNORE', $s);\n        }\n\n        static $ulenMask = [\"\\xC0\" => 2, \"\\xD0\" => 2, \"\\xE0\" => 3, \"\\xF0\" => 4];\n\n        $cnt = floor(\\count($convmap) / 4) * 4;\n        $i = 0;\n        $len = \\strlen($s);\n        $result = '';\n\n        while ($i < $len) {\n            $ulen = $s[$i] < \"\\x80\" ? 1 : $ulenMask[$s[$i] & \"\\xF0\"];\n            $uchr = substr($s, $i, $ulen);\n            $i += $ulen;\n            $c = self::mb_ord($uchr);\n\n            for ($j = 0; $j < $cnt; $j += 4) {\n                if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {\n                    $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];\n                    $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';';\n                    continue 2;\n                }\n            }\n            $result .= $uchr;\n        }\n\n        if (null === $encoding) {\n            return $result;\n        }\n\n        return iconv('UTF-8', $encoding.'//IGNORE', $result);\n    }\n\n    public static function mb_convert_case($s, $mode, $encoding = null)\n    {\n        $s = (string) $s;\n        if ('' === $s) {\n            return '';\n        }\n\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $encoding) {\n            $encoding = null;\n            if (!preg_match('//u', $s)) {\n                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);\n            }\n        } else {\n            $s = iconv($encoding, 'UTF-8//IGNORE', $s);\n        }\n\n        if (\\MB_CASE_TITLE == $mode) {\n            static $titleRegexp = null;\n            if (null === $titleRegexp) {\n                $titleRegexp = self::getData('titleCaseRegexp');\n            }\n            $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s);\n        } else {\n            if (\\MB_CASE_UPPER == $mode) {\n                static $upper = null;\n                if (null === $upper) {\n                    $upper = self::getData('upperCase');\n                }\n                $map = $upper;\n            } else {\n                if (self::MB_CASE_FOLD === $mode) {\n                    static $caseFolding = null;\n                    if (null === $caseFolding) {\n                        $caseFolding = self::getData('caseFolding');\n                    }\n                    $s = strtr($s, $caseFolding);\n                }\n\n                static $lower = null;\n                if (null === $lower) {\n                    $lower = self::getData('lowerCase');\n                }\n                $map = $lower;\n            }\n\n            static $ulenMask = [\"\\xC0\" => 2, \"\\xD0\" => 2, \"\\xE0\" => 3, \"\\xF0\" => 4];\n\n            $i = 0;\n            $len = \\strlen($s);\n\n            while ($i < $len) {\n                $ulen = $s[$i] < \"\\x80\" ? 1 : $ulenMask[$s[$i] & \"\\xF0\"];\n                $uchr = substr($s, $i, $ulen);\n                $i += $ulen;\n\n                if (isset($map[$uchr])) {\n                    $uchr = $map[$uchr];\n                    $nlen = \\strlen($uchr);\n\n                    if ($nlen == $ulen) {\n                        $nlen = $i;\n                        do {\n                            $s[--$nlen] = $uchr[--$ulen];\n                        } while ($ulen);\n                    } else {\n                        $s = substr_replace($s, $uchr, $i - $ulen, $ulen);\n                        $len += $nlen - $ulen;\n                        $i += $nlen - $ulen;\n                    }\n                }\n            }\n        }\n\n        if (null === $encoding) {\n            return $s;\n        }\n\n        return iconv('UTF-8', $encoding.'//IGNORE', $s);\n    }\n\n    public static function mb_internal_encoding($encoding = null)\n    {\n        if (null === $encoding) {\n            return self::$internalEncoding;\n        }\n\n        $normalizedEncoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) {\n            self::$internalEncoding = $normalizedEncoding;\n\n            return true;\n        }\n\n        if (80000 > \\PHP_VERSION_ID) {\n            return false;\n        }\n\n        throw new \\ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, \"%s\" given', $encoding));\n    }\n\n    public static function mb_language($lang = null)\n    {\n        if (null === $lang) {\n            return self::$language;\n        }\n\n        switch ($normalizedLang = strtolower($lang)) {\n            case 'uni':\n            case 'neutral':\n                self::$language = $normalizedLang;\n\n                return true;\n        }\n\n        if (80000 > \\PHP_VERSION_ID) {\n            return false;\n        }\n\n        throw new \\ValueError(sprintf('Argument #1 ($language) must be a valid language, \"%s\" given', $lang));\n    }\n\n    public static function mb_list_encodings()\n    {\n        return ['UTF-8'];\n    }\n\n    public static function mb_encoding_aliases($encoding)\n    {\n        switch (strtoupper($encoding)) {\n            case 'UTF8':\n            case 'UTF-8':\n                return ['utf8'];\n        }\n\n        return false;\n    }\n\n    public static function mb_check_encoding($var = null, $encoding = null)\n    {\n        if (PHP_VERSION_ID < 70200 && \\is_array($var)) {\n            trigger_error('mb_check_encoding() expects parameter 1 to be string, array given', \\E_USER_WARNING);\n\n            return null;\n        }\n\n        if (null === $encoding) {\n            if (null === $var) {\n                return false;\n            }\n            $encoding = self::$internalEncoding;\n        }\n\n        if (!\\is_array($var)) {\n            return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var);\n        }\n\n        foreach ($var as $key => $value) {\n            if (!self::mb_check_encoding($key, $encoding)) {\n                return false;\n            }\n            if (!self::mb_check_encoding($value, $encoding)) {\n                return false;\n            }\n        }\n\n        return true;\n\n    }\n\n    public static function mb_detect_encoding($str, $encodingList = null, $strict = false)\n    {\n        if (null === $encodingList) {\n            $encodingList = self::$encodingList;\n        } else {\n            if (!\\is_array($encodingList)) {\n                $encodingList = array_map('trim', explode(',', $encodingList));\n            }\n            $encodingList = array_map('strtoupper', $encodingList);\n        }\n\n        foreach ($encodingList as $enc) {\n            switch ($enc) {\n                case 'ASCII':\n                    if (!preg_match('/[\\x80-\\xFF]/', $str)) {\n                        return $enc;\n                    }\n                    break;\n\n                case 'UTF8':\n                case 'UTF-8':\n                    if (preg_match('//u', $str)) {\n                        return 'UTF-8';\n                    }\n                    break;\n\n                default:\n                    if (0 === strncmp($enc, 'ISO-8859-', 9)) {\n                        return $enc;\n                    }\n            }\n        }\n\n        return false;\n    }\n\n    public static function mb_detect_order($encodingList = null)\n    {\n        if (null === $encodingList) {\n            return self::$encodingList;\n        }\n\n        if (!\\is_array($encodingList)) {\n            $encodingList = array_map('trim', explode(',', $encodingList));\n        }\n        $encodingList = array_map('strtoupper', $encodingList);\n\n        foreach ($encodingList as $enc) {\n            switch ($enc) {\n                default:\n                    if (strncmp($enc, 'ISO-8859-', 9)) {\n                        return false;\n                    }\n                    // no break\n                case 'ASCII':\n                case 'UTF8':\n                case 'UTF-8':\n            }\n        }\n\n        self::$encodingList = $encodingList;\n\n        return true;\n    }\n\n    public static function mb_strlen($s, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return \\strlen($s);\n        }\n\n        return @iconv_strlen($s, $encoding);\n    }\n\n    public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return strpos($haystack, $needle, $offset);\n        }\n\n        $needle = (string) $needle;\n        if ('' === $needle) {\n            if (80000 > \\PHP_VERSION_ID) {\n                trigger_error(__METHOD__.': Empty delimiter', \\E_USER_WARNING);\n\n                return false;\n            }\n\n            return 0;\n        }\n\n        return iconv_strpos($haystack, $needle, $offset, $encoding);\n    }\n\n    public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return strrpos($haystack, $needle, $offset);\n        }\n\n        if ($offset != (int) $offset) {\n            $offset = 0;\n        } elseif ($offset = (int) $offset) {\n            if ($offset < 0) {\n                if (0 > $offset += self::mb_strlen($needle)) {\n                    $haystack = self::mb_substr($haystack, 0, $offset, $encoding);\n                }\n                $offset = 0;\n            } else {\n                $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);\n            }\n        }\n\n        $pos = '' !== $needle || 80000 > \\PHP_VERSION_ID\n            ? iconv_strrpos($haystack, $needle, $encoding)\n            : self::mb_strlen($haystack, $encoding);\n\n        return false !== $pos ? $offset + $pos : false;\n    }\n\n    public static function mb_str_split($string, $split_length = 1, $encoding = null)\n    {\n        if (null !== $string && !\\is_scalar($string) && !(\\is_object($string) && method_exists($string, '__toString'))) {\n            trigger_error('mb_str_split() expects parameter 1 to be string, '.\\gettype($string).' given', \\E_USER_WARNING);\n\n            return null;\n        }\n\n        if (1 > $split_length = (int) $split_length) {\n            if (80000 > \\PHP_VERSION_ID) {\n                trigger_error('The length of each segment must be greater than zero', \\E_USER_WARNING);\n\n                return false;\n            }\n\n            throw new \\ValueError('Argument #2 ($length) must be greater than 0');\n        }\n\n        if (null === $encoding) {\n            $encoding = mb_internal_encoding();\n        }\n\n        if ('UTF-8' === $encoding = self::getEncoding($encoding)) {\n            $rx = '/(';\n            while (65535 < $split_length) {\n                $rx .= '.{65535}';\n                $split_length -= 65535;\n            }\n            $rx .= '.{'.$split_length.'})/us';\n\n            return preg_split($rx, $string, -1, \\PREG_SPLIT_DELIM_CAPTURE | \\PREG_SPLIT_NO_EMPTY);\n        }\n\n        $result = [];\n        $length = mb_strlen($string, $encoding);\n\n        for ($i = 0; $i < $length; $i += $split_length) {\n            $result[] = mb_substr($string, $i, $split_length, $encoding);\n        }\n\n        return $result;\n    }\n\n    public static function mb_strtolower($s, $encoding = null)\n    {\n        return self::mb_convert_case($s, \\MB_CASE_LOWER, $encoding);\n    }\n\n    public static function mb_strtoupper($s, $encoding = null)\n    {\n        return self::mb_convert_case($s, \\MB_CASE_UPPER, $encoding);\n    }\n\n    public static function mb_substitute_character($c = null)\n    {\n        if (null === $c) {\n            return 'none';\n        }\n        if (0 === strcasecmp($c, 'none')) {\n            return true;\n        }\n        if (80000 > \\PHP_VERSION_ID) {\n            return false;\n        }\n        if (\\is_int($c) || 'long' === $c || 'entity' === $c) {\n            return false;\n        }\n\n        throw new \\ValueError('Argument #1 ($substitute_character) must be \"none\", \"long\", \"entity\" or a valid codepoint');\n    }\n\n    public static function mb_substr($s, $start, $length = null, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return (string) substr($s, $start, null === $length ? 2147483647 : $length);\n        }\n\n        if ($start < 0) {\n            $start = iconv_strlen($s, $encoding) + $start;\n            if ($start < 0) {\n                $start = 0;\n            }\n        }\n\n        if (null === $length) {\n            $length = 2147483647;\n        } elseif ($length < 0) {\n            $length = iconv_strlen($s, $encoding) + $length - $start;\n            if ($length < 0) {\n                return '';\n            }\n        }\n\n        return (string) iconv_substr($s, $start, $length, $encoding);\n    }\n\n    public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        [$haystack, $needle] = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [\n            self::mb_convert_case($haystack, \\MB_CASE_LOWER, $encoding),\n            self::mb_convert_case($needle, \\MB_CASE_LOWER, $encoding),\n        ]);\n\n        return self::mb_strpos($haystack, $needle, $offset, $encoding);\n    }\n\n    public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $pos = self::mb_stripos($haystack, $needle, 0, $encoding);\n\n        return self::getSubpart($pos, $part, $haystack, $encoding);\n    }\n\n    public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            $pos = strrpos($haystack, $needle);\n        } else {\n            $needle = self::mb_substr($needle, 0, 1, $encoding);\n            $pos = iconv_strrpos($haystack, $needle, $encoding);\n        }\n\n        return self::getSubpart($pos, $part, $haystack, $encoding);\n    }\n\n    public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $needle = self::mb_substr($needle, 0, 1, $encoding);\n        $pos = self::mb_strripos($haystack, $needle, $encoding);\n\n        return self::getSubpart($pos, $part, $haystack, $encoding);\n    }\n\n    public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        $haystack = self::mb_convert_case($haystack, \\MB_CASE_LOWER, $encoding);\n        $needle = self::mb_convert_case($needle, \\MB_CASE_LOWER, $encoding);\n\n        $haystack = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack);\n        $needle = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle);\n\n        return self::mb_strrpos($haystack, $needle, $offset, $encoding);\n    }\n\n    public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $pos = strpos($haystack, $needle);\n        if (false === $pos) {\n            return false;\n        }\n        if ($part) {\n            return substr($haystack, 0, $pos);\n        }\n\n        return substr($haystack, $pos);\n    }\n\n    public static function mb_get_info($type = 'all')\n    {\n        $info = [\n            'internal_encoding' => self::$internalEncoding,\n            'http_output' => 'pass',\n            'http_output_conv_mimetypes' => '^(text/|application/xhtml\\+xml)',\n            'func_overload' => 0,\n            'func_overload_list' => 'no overload',\n            'mail_charset' => 'UTF-8',\n            'mail_header_encoding' => 'BASE64',\n            'mail_body_encoding' => 'BASE64',\n            'illegal_chars' => 0,\n            'encoding_translation' => 'Off',\n            'language' => self::$language,\n            'detect_order' => self::$encodingList,\n            'substitute_character' => 'none',\n            'strict_detection' => 'Off',\n        ];\n\n        if ('all' === $type) {\n            return $info;\n        }\n        if (isset($info[$type])) {\n            return $info[$type];\n        }\n\n        return false;\n    }\n\n    public static function mb_http_input($type = '')\n    {\n        return false;\n    }\n\n    public static function mb_http_output($encoding = null)\n    {\n        return null !== $encoding ? 'pass' === $encoding : 'pass';\n    }\n\n    public static function mb_strwidth($s, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' !== $encoding) {\n            $s = iconv($encoding, 'UTF-8//IGNORE', $s);\n        }\n\n        $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);\n\n        return ($wide << 1) + iconv_strlen($s, 'UTF-8');\n    }\n\n    public static function mb_substr_count($haystack, $needle, $encoding = null)\n    {\n        return substr_count($haystack, $needle);\n    }\n\n    public static function mb_output_handler($contents, $status)\n    {\n        return $contents;\n    }\n\n    public static function mb_chr($code, $encoding = null)\n    {\n        if (0x80 > $code %= 0x200000) {\n            $s = \\chr($code);\n        } elseif (0x800 > $code) {\n            $s = \\chr(0xC0 | $code >> 6).\\chr(0x80 | $code & 0x3F);\n        } elseif (0x10000 > $code) {\n            $s = \\chr(0xE0 | $code >> 12).\\chr(0x80 | $code >> 6 & 0x3F).\\chr(0x80 | $code & 0x3F);\n        } else {\n            $s = \\chr(0xF0 | $code >> 18).\\chr(0x80 | $code >> 12 & 0x3F).\\chr(0x80 | $code >> 6 & 0x3F).\\chr(0x80 | $code & 0x3F);\n        }\n\n        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {\n            $s = mb_convert_encoding($s, $encoding, 'UTF-8');\n        }\n\n        return $s;\n    }\n\n    public static function mb_ord($s, $encoding = null)\n    {\n        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {\n            $s = mb_convert_encoding($s, 'UTF-8', $encoding);\n        }\n\n        if (1 === \\strlen($s)) {\n            return \\ord($s);\n        }\n\n        $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;\n        if (0xF0 <= $code) {\n            return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;\n        }\n        if (0xE0 <= $code) {\n            return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;\n        }\n        if (0xC0 <= $code) {\n            return (($code - 0xC0) << 6) + $s[2] - 0x80;\n        }\n\n        return $code;\n    }\n\n    public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \\STR_PAD_RIGHT, string $encoding = null): string\n    {\n        if (!\\in_array($pad_type, [\\STR_PAD_RIGHT, \\STR_PAD_LEFT, \\STR_PAD_BOTH], true)) {\n            throw new \\ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH');\n        }\n\n        if (null === $encoding) {\n            $encoding = self::mb_internal_encoding();\n        }\n\n        try {\n            $validEncoding = @self::mb_check_encoding('', $encoding);\n        } catch (\\ValueError $e) {\n            throw new \\ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, \"%s\" given', $encoding));\n        }\n\n        // BC for PHP 7.3 and lower\n        if (!$validEncoding) {\n            throw new \\ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, \"%s\" given', $encoding));\n        }\n\n        if (self::mb_strlen($pad_string, $encoding) <= 0) {\n            throw new \\ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string');\n        }\n\n        $paddingRequired = $length - self::mb_strlen($string, $encoding);\n\n        if ($paddingRequired < 1) {\n            return $string;\n        }\n\n        switch ($pad_type) {\n            case \\STR_PAD_LEFT:\n                return self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string;\n            case \\STR_PAD_RIGHT:\n                return $string.self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding);\n            default:\n                $leftPaddingLength = floor($paddingRequired / 2);\n                $rightPaddingLength = $paddingRequired - $leftPaddingLength;\n\n                return self::mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.self::mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding);\n        }\n    }\n\n    private static function getSubpart($pos, $part, $haystack, $encoding)\n    {\n        if (false === $pos) {\n            return false;\n        }\n        if ($part) {\n            return self::mb_substr($haystack, 0, $pos, $encoding);\n        }\n\n        return self::mb_substr($haystack, $pos, null, $encoding);\n    }\n\n    private static function html_encoding_callback(array $m)\n    {\n        $i = 1;\n        $entities = '';\n        $m = unpack('C*', htmlentities($m[0], \\ENT_COMPAT, 'UTF-8'));\n\n        while (isset($m[$i])) {\n            if (0x80 > $m[$i]) {\n                $entities .= \\chr($m[$i++]);\n                continue;\n            }\n            if (0xF0 <= $m[$i]) {\n                $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;\n            } elseif (0xE0 <= $m[$i]) {\n                $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;\n            } else {\n                $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;\n            }\n\n            $entities .= '&#'.$c.';';\n        }\n\n        return $entities;\n    }\n\n    private static function title_case(array $s)\n    {\n        return self::mb_convert_case($s[1], \\MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \\MB_CASE_LOWER, 'UTF-8');\n    }\n\n    private static function getData($file)\n    {\n        if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {\n            return require $file;\n        }\n\n        return false;\n    }\n\n    private static function getEncoding($encoding)\n    {\n        if (null === $encoding) {\n            return self::$internalEncoding;\n        }\n\n        if ('UTF-8' === $encoding) {\n            return 'UTF-8';\n        }\n\n        $encoding = strtoupper($encoding);\n\n        if ('8BIT' === $encoding || 'BINARY' === $encoding) {\n            return 'CP850';\n        }\n\n        if ('UTF8' === $encoding) {\n            return 'UTF-8';\n        }\n\n        return $encoding;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-mbstring/README.md",
    "content": "Symfony Polyfill / Mbstring\n===========================\n\nThis component provides a partial, native PHP implementation for the\n[Mbstring](https://php.net/mbstring) extension.\n\nMore information can be found in the\n[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).\n\nLicense\n=======\n\nThis library is released under the [MIT license](LICENSE).\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php",
    "content": "<?php\n\nreturn [\n    'İ' => 'i̇',\n    'µ' => 'μ',\n    'ſ' => 's',\n    'ͅ' => 'ι',\n    'ς' => 'σ',\n    'ϐ' => 'β',\n    'ϑ' => 'θ',\n    'ϕ' => 'φ',\n    'ϖ' => 'π',\n    'ϰ' => 'κ',\n    'ϱ' => 'ρ',\n    'ϵ' => 'ε',\n    'ẛ' => 'ṡ',\n    'ι' => 'ι',\n    'ß' => 'ss',\n    'ŉ' => 'ʼn',\n    'ǰ' => 'ǰ',\n    'ΐ' => 'ΐ',\n    'ΰ' => 'ΰ',\n    'և' => 'եւ',\n    'ẖ' => 'ẖ',\n    'ẗ' => 'ẗ',\n    'ẘ' => 'ẘ',\n    'ẙ' => 'ẙ',\n    'ẚ' => 'aʾ',\n    'ẞ' => 'ss',\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    'ῦ' => 'ῦ',\n    'ῧ' => 'ῧ',\n    'ῲ' => 'ὼι',\n    'ῳ' => 'ωι',\n    'ῴ' => 'ώι',\n    'ῶ' => 'ῶ',\n    'ῷ' => 'ῶι',\n    'ῼ' => 'ωι',\n    'ﬀ' => 'ff',\n    'ﬁ' => 'fi',\n    'ﬂ' => 'fl',\n    'ﬃ' => 'ffi',\n    'ﬄ' => 'ffl',\n    'ﬅ' => 'st',\n    'ﬆ' => 'st',\n    'ﬓ' => 'մն',\n    'ﬔ' => 'մե',\n    'ﬕ' => 'մի',\n    'ﬖ' => 'վն',\n    'ﬗ' => 'մխ',\n];\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php",
    "content": "<?php\n\nreturn array (\n  'A' => 'a',\n  'B' => 'b',\n  'C' => 'c',\n  'D' => 'd',\n  'E' => 'e',\n  'F' => 'f',\n  'G' => 'g',\n  'H' => 'h',\n  'I' => 'i',\n  'J' => 'j',\n  'K' => 'k',\n  'L' => 'l',\n  'M' => 'm',\n  'N' => 'n',\n  'O' => 'o',\n  'P' => 'p',\n  'Q' => 'q',\n  'R' => 'r',\n  'S' => 's',\n  'T' => 't',\n  'U' => 'u',\n  'V' => 'v',\n  'W' => 'w',\n  'X' => 'x',\n  'Y' => 'y',\n  'Z' => 'z',\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  'İ' => '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  'Ƥ' => 'ƥ',\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  'Ȱ' => 'ȱ',\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  'Ͼ' => 'ͼ',\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  'Ґ' => 'ґ',\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  'Ԝ' => 'ԝ',\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  'Ⴖ' => 'ⴖ',\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  'Ꮤ' => 'ꮤ',\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  'Ჴ' => 'ჴ',\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  'Ṹ' => 'ṹ',\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  'Ἆ' => 'ἆ',\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  'ᾼ' => 'ᾳ',\n  'Ὲ' => 'ὲ',\n  'Έ' => 'έ',\n  'Ὴ' => 'ὴ',\n  'Ή' => 'ή',\n  'ῌ' => 'ῃ',\n  'Ῐ' => 'ῐ',\n  'Ῑ' => 'ῑ',\n  'Ὶ' => 'ὶ',\n  'Ί' => 'ί',\n  'Ῠ' => 'ῠ',\n  'Ῡ' => 'ῡ',\n  'Ὺ' => 'ὺ',\n  'Ύ' => 'ύ',\n  'Ῥ' => 'ῥ',\n  'Ὸ' => 'ὸ',\n  'Ό' => 'ό',\n  'Ὼ' => 'ὼ',\n  'Ώ' => 'ώ',\n  'ῼ' => 'ῳ',\n  'Ω' => 'ω',\n  'K' => 'k',\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  'Ⱈ' => 'ⱈ',\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  'Ⳁ' => 'ⳁ',\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  'Ꜽ' => 'ꜽ',\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  'Ａ' => 'ａ',\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  '𐒴' => '𐓜',\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  '𐲦' => '𐳦',\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  '𖹙' => '𖹹',\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"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php",
    "content": "<?php\n\n// from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt\n\nreturn '/(?<![\\x{0027}\\x{002E}\\x{003A}\\x{005E}\\x{0060}\\x{00A8}\\x{00AD}\\x{00AF}\\x{00B4}\\x{00B7}\\x{00B8}\\x{02B0}-\\x{02C1}\\x{02C2}-\\x{02C5}\\x{02C6}-\\x{02D1}\\x{02D2}-\\x{02DF}\\x{02E0}-\\x{02E4}\\x{02E5}-\\x{02EB}\\x{02EC}\\x{02ED}\\x{02EE}\\x{02EF}-\\x{02FF}\\x{0300}-\\x{036F}\\x{0374}\\x{0375}\\x{037A}\\x{0384}-\\x{0385}\\x{0387}\\x{0483}-\\x{0487}\\x{0488}-\\x{0489}\\x{0559}\\x{0591}-\\x{05BD}\\x{05BF}\\x{05C1}-\\x{05C2}\\x{05C4}-\\x{05C5}\\x{05C7}\\x{05F4}\\x{0600}-\\x{0605}\\x{0610}-\\x{061A}\\x{061C}\\x{0640}\\x{064B}-\\x{065F}\\x{0670}\\x{06D6}-\\x{06DC}\\x{06DD}\\x{06DF}-\\x{06E4}\\x{06E5}-\\x{06E6}\\x{06E7}-\\x{06E8}\\x{06EA}-\\x{06ED}\\x{070F}\\x{0711}\\x{0730}-\\x{074A}\\x{07A6}-\\x{07B0}\\x{07EB}-\\x{07F3}\\x{07F4}-\\x{07F5}\\x{07FA}\\x{07FD}\\x{0816}-\\x{0819}\\x{081A}\\x{081B}-\\x{0823}\\x{0824}\\x{0825}-\\x{0827}\\x{0828}\\x{0829}-\\x{082D}\\x{0859}-\\x{085B}\\x{08D3}-\\x{08E1}\\x{08E2}\\x{08E3}-\\x{0902}\\x{093A}\\x{093C}\\x{0941}-\\x{0948}\\x{094D}\\x{0951}-\\x{0957}\\x{0962}-\\x{0963}\\x{0971}\\x{0981}\\x{09BC}\\x{09C1}-\\x{09C4}\\x{09CD}\\x{09E2}-\\x{09E3}\\x{09FE}\\x{0A01}-\\x{0A02}\\x{0A3C}\\x{0A41}-\\x{0A42}\\x{0A47}-\\x{0A48}\\x{0A4B}-\\x{0A4D}\\x{0A51}\\x{0A70}-\\x{0A71}\\x{0A75}\\x{0A81}-\\x{0A82}\\x{0ABC}\\x{0AC1}-\\x{0AC5}\\x{0AC7}-\\x{0AC8}\\x{0ACD}\\x{0AE2}-\\x{0AE3}\\x{0AFA}-\\x{0AFF}\\x{0B01}\\x{0B3C}\\x{0B3F}\\x{0B41}-\\x{0B44}\\x{0B4D}\\x{0B56}\\x{0B62}-\\x{0B63}\\x{0B82}\\x{0BC0}\\x{0BCD}\\x{0C00}\\x{0C04}\\x{0C3E}-\\x{0C40}\\x{0C46}-\\x{0C48}\\x{0C4A}-\\x{0C4D}\\x{0C55}-\\x{0C56}\\x{0C62}-\\x{0C63}\\x{0C81}\\x{0CBC}\\x{0CBF}\\x{0CC6}\\x{0CCC}-\\x{0CCD}\\x{0CE2}-\\x{0CE3}\\x{0D00}-\\x{0D01}\\x{0D3B}-\\x{0D3C}\\x{0D41}-\\x{0D44}\\x{0D4D}\\x{0D62}-\\x{0D63}\\x{0DCA}\\x{0DD2}-\\x{0DD4}\\x{0DD6}\\x{0E31}\\x{0E34}-\\x{0E3A}\\x{0E46}\\x{0E47}-\\x{0E4E}\\x{0EB1}\\x{0EB4}-\\x{0EB9}\\x{0EBB}-\\x{0EBC}\\x{0EC6}\\x{0EC8}-\\x{0ECD}\\x{0F18}-\\x{0F19}\\x{0F35}\\x{0F37}\\x{0F39}\\x{0F71}-\\x{0F7E}\\x{0F80}-\\x{0F84}\\x{0F86}-\\x{0F87}\\x{0F8D}-\\x{0F97}\\x{0F99}-\\x{0FBC}\\x{0FC6}\\x{102D}-\\x{1030}\\x{1032}-\\x{1037}\\x{1039}-\\x{103A}\\x{103D}-\\x{103E}\\x{1058}-\\x{1059}\\x{105E}-\\x{1060}\\x{1071}-\\x{1074}\\x{1082}\\x{1085}-\\x{1086}\\x{108D}\\x{109D}\\x{10FC}\\x{135D}-\\x{135F}\\x{1712}-\\x{1714}\\x{1732}-\\x{1734}\\x{1752}-\\x{1753}\\x{1772}-\\x{1773}\\x{17B4}-\\x{17B5}\\x{17B7}-\\x{17BD}\\x{17C6}\\x{17C9}-\\x{17D3}\\x{17D7}\\x{17DD}\\x{180B}-\\x{180D}\\x{180E}\\x{1843}\\x{1885}-\\x{1886}\\x{18A9}\\x{1920}-\\x{1922}\\x{1927}-\\x{1928}\\x{1932}\\x{1939}-\\x{193B}\\x{1A17}-\\x{1A18}\\x{1A1B}\\x{1A56}\\x{1A58}-\\x{1A5E}\\x{1A60}\\x{1A62}\\x{1A65}-\\x{1A6C}\\x{1A73}-\\x{1A7C}\\x{1A7F}\\x{1AA7}\\x{1AB0}-\\x{1ABD}\\x{1ABE}\\x{1B00}-\\x{1B03}\\x{1B34}\\x{1B36}-\\x{1B3A}\\x{1B3C}\\x{1B42}\\x{1B6B}-\\x{1B73}\\x{1B80}-\\x{1B81}\\x{1BA2}-\\x{1BA5}\\x{1BA8}-\\x{1BA9}\\x{1BAB}-\\x{1BAD}\\x{1BE6}\\x{1BE8}-\\x{1BE9}\\x{1BED}\\x{1BEF}-\\x{1BF1}\\x{1C2C}-\\x{1C33}\\x{1C36}-\\x{1C37}\\x{1C78}-\\x{1C7D}\\x{1CD0}-\\x{1CD2}\\x{1CD4}-\\x{1CE0}\\x{1CE2}-\\x{1CE8}\\x{1CED}\\x{1CF4}\\x{1CF8}-\\x{1CF9}\\x{1D2C}-\\x{1D6A}\\x{1D78}\\x{1D9B}-\\x{1DBF}\\x{1DC0}-\\x{1DF9}\\x{1DFB}-\\x{1DFF}\\x{1FBD}\\x{1FBF}-\\x{1FC1}\\x{1FCD}-\\x{1FCF}\\x{1FDD}-\\x{1FDF}\\x{1FED}-\\x{1FEF}\\x{1FFD}-\\x{1FFE}\\x{200B}-\\x{200F}\\x{2018}\\x{2019}\\x{2024}\\x{2027}\\x{202A}-\\x{202E}\\x{2060}-\\x{2064}\\x{2066}-\\x{206F}\\x{2071}\\x{207F}\\x{2090}-\\x{209C}\\x{20D0}-\\x{20DC}\\x{20DD}-\\x{20E0}\\x{20E1}\\x{20E2}-\\x{20E4}\\x{20E5}-\\x{20F0}\\x{2C7C}-\\x{2C7D}\\x{2CEF}-\\x{2CF1}\\x{2D6F}\\x{2D7F}\\x{2DE0}-\\x{2DFF}\\x{2E2F}\\x{3005}\\x{302A}-\\x{302D}\\x{3031}-\\x{3035}\\x{303B}\\x{3099}-\\x{309A}\\x{309B}-\\x{309C}\\x{309D}-\\x{309E}\\x{30FC}-\\x{30FE}\\x{A015}\\x{A4F8}-\\x{A4FD}\\x{A60C}\\x{A66F}\\x{A670}-\\x{A672}\\x{A674}-\\x{A67D}\\x{A67F}\\x{A69C}-\\x{A69D}\\x{A69E}-\\x{A69F}\\x{A6F0}-\\x{A6F1}\\x{A700}-\\x{A716}\\x{A717}-\\x{A71F}\\x{A720}-\\x{A721}\\x{A770}\\x{A788}\\x{A789}-\\x{A78A}\\x{A7F8}-\\x{A7F9}\\x{A802}\\x{A806}\\x{A80B}\\x{A825}-\\x{A826}\\x{A8C4}-\\x{A8C5}\\x{A8E0}-\\x{A8F1}\\x{A8FF}\\x{A926}-\\x{A92D}\\x{A947}-\\x{A951}\\x{A980}-\\x{A982}\\x{A9B3}\\x{A9B6}-\\x{A9B9}\\x{A9BC}\\x{A9CF}\\x{A9E5}\\x{A9E6}\\x{AA29}-\\x{AA2E}\\x{AA31}-\\x{AA32}\\x{AA35}-\\x{AA36}\\x{AA43}\\x{AA4C}\\x{AA70}\\x{AA7C}\\x{AAB0}\\x{AAB2}-\\x{AAB4}\\x{AAB7}-\\x{AAB8}\\x{AABE}-\\x{AABF}\\x{AAC1}\\x{AADD}\\x{AAEC}-\\x{AAED}\\x{AAF3}-\\x{AAF4}\\x{AAF6}\\x{AB5B}\\x{AB5C}-\\x{AB5F}\\x{ABE5}\\x{ABE8}\\x{ABED}\\x{FB1E}\\x{FBB2}-\\x{FBC1}\\x{FE00}-\\x{FE0F}\\x{FE13}\\x{FE20}-\\x{FE2F}\\x{FE52}\\x{FE55}\\x{FEFF}\\x{FF07}\\x{FF0E}\\x{FF1A}\\x{FF3E}\\x{FF40}\\x{FF70}\\x{FF9E}-\\x{FF9F}\\x{FFE3}\\x{FFF9}-\\x{FFFB}\\x{101FD}\\x{102E0}\\x{10376}-\\x{1037A}\\x{10A01}-\\x{10A03}\\x{10A05}-\\x{10A06}\\x{10A0C}-\\x{10A0F}\\x{10A38}-\\x{10A3A}\\x{10A3F}\\x{10AE5}-\\x{10AE6}\\x{10D24}-\\x{10D27}\\x{10F46}-\\x{10F50}\\x{11001}\\x{11038}-\\x{11046}\\x{1107F}-\\x{11081}\\x{110B3}-\\x{110B6}\\x{110B9}-\\x{110BA}\\x{110BD}\\x{110CD}\\x{11100}-\\x{11102}\\x{11127}-\\x{1112B}\\x{1112D}-\\x{11134}\\x{11173}\\x{11180}-\\x{11181}\\x{111B6}-\\x{111BE}\\x{111C9}-\\x{111CC}\\x{1122F}-\\x{11231}\\x{11234}\\x{11236}-\\x{11237}\\x{1123E}\\x{112DF}\\x{112E3}-\\x{112EA}\\x{11300}-\\x{11301}\\x{1133B}-\\x{1133C}\\x{11340}\\x{11366}-\\x{1136C}\\x{11370}-\\x{11374}\\x{11438}-\\x{1143F}\\x{11442}-\\x{11444}\\x{11446}\\x{1145E}\\x{114B3}-\\x{114B8}\\x{114BA}\\x{114BF}-\\x{114C0}\\x{114C2}-\\x{114C3}\\x{115B2}-\\x{115B5}\\x{115BC}-\\x{115BD}\\x{115BF}-\\x{115C0}\\x{115DC}-\\x{115DD}\\x{11633}-\\x{1163A}\\x{1163D}\\x{1163F}-\\x{11640}\\x{116AB}\\x{116AD}\\x{116B0}-\\x{116B5}\\x{116B7}\\x{1171D}-\\x{1171F}\\x{11722}-\\x{11725}\\x{11727}-\\x{1172B}\\x{1182F}-\\x{11837}\\x{11839}-\\x{1183A}\\x{11A01}-\\x{11A0A}\\x{11A33}-\\x{11A38}\\x{11A3B}-\\x{11A3E}\\x{11A47}\\x{11A51}-\\x{11A56}\\x{11A59}-\\x{11A5B}\\x{11A8A}-\\x{11A96}\\x{11A98}-\\x{11A99}\\x{11C30}-\\x{11C36}\\x{11C38}-\\x{11C3D}\\x{11C3F}\\x{11C92}-\\x{11CA7}\\x{11CAA}-\\x{11CB0}\\x{11CB2}-\\x{11CB3}\\x{11CB5}-\\x{11CB6}\\x{11D31}-\\x{11D36}\\x{11D3A}\\x{11D3C}-\\x{11D3D}\\x{11D3F}-\\x{11D45}\\x{11D47}\\x{11D90}-\\x{11D91}\\x{11D95}\\x{11D97}\\x{11EF3}-\\x{11EF4}\\x{16AF0}-\\x{16AF4}\\x{16B30}-\\x{16B36}\\x{16B40}-\\x{16B43}\\x{16F8F}-\\x{16F92}\\x{16F93}-\\x{16F9F}\\x{16FE0}-\\x{16FE1}\\x{1BC9D}-\\x{1BC9E}\\x{1BCA0}-\\x{1BCA3}\\x{1D167}-\\x{1D169}\\x{1D173}-\\x{1D17A}\\x{1D17B}-\\x{1D182}\\x{1D185}-\\x{1D18B}\\x{1D1AA}-\\x{1D1AD}\\x{1D242}-\\x{1D244}\\x{1DA00}-\\x{1DA36}\\x{1DA3B}-\\x{1DA6C}\\x{1DA75}\\x{1DA84}\\x{1DA9B}-\\x{1DA9F}\\x{1DAA1}-\\x{1DAAF}\\x{1E000}-\\x{1E006}\\x{1E008}-\\x{1E018}\\x{1E01B}-\\x{1E021}\\x{1E023}-\\x{1E024}\\x{1E026}-\\x{1E02A}\\x{1E8D0}-\\x{1E8D6}\\x{1E944}-\\x{1E94A}\\x{1F3FB}-\\x{1F3FF}\\x{E0001}\\x{E0020}-\\x{E007F}\\x{E0100}-\\x{E01EF}])(\\pL)(\\pL*+)/u';\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php",
    "content": "<?php\n\nreturn array (\n  'a' => 'A',\n  'b' => 'B',\n  'c' => 'C',\n  'd' => 'D',\n  'e' => 'E',\n  'f' => 'F',\n  'g' => 'G',\n  'h' => 'H',\n  'i' => 'I',\n  'j' => 'J',\n  'k' => 'K',\n  'l' => 'L',\n  'm' => 'M',\n  'n' => 'N',\n  'o' => 'O',\n  'p' => 'P',\n  'q' => 'Q',\n  'r' => 'R',\n  's' => 'S',\n  't' => 'T',\n  'u' => 'U',\n  'v' => 'V',\n  'w' => 'W',\n  'x' => 'X',\n  'y' => 'Y',\n  'z' => 'Z',\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  'ı' => '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  'ſ' => 'S',\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  'ȥ' => 'Ȥ',\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  'ζ' => 'Ζ',\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  'х' => 'Х',\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  'ҿ' => 'Ҿ',\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  'ծ' => 'Ծ',\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  'ჿ' => 'Ჿ',\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  'ṧ' => 'Ṧ',\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  'ỻ' => 'Ỻ',\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  'ᾅ' => 'ἍΙ',\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  'ⓦ' => 'Ⓦ',\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  'ⲗ' => 'Ⲗ',\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  'ⴜ' => 'Ⴜ',\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  'ꝏ' => 'Ꝏ',\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  'ꮅ' => 'Ꮅ',\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  'ｌ' => 'Ｌ',\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  '𐓧' => '𐒿',\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  '𐳱' => '𐲱',\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  '𞤦' => '𞤄',\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  'ß' => 'SS',\n  'ﬀ' => 'FF',\n  'ﬁ' => 'FI',\n  'ﬂ' => 'FL',\n  'ﬃ' => 'FFI',\n  'ﬄ' => 'FFL',\n  'ﬅ' => 'ST',\n  'ﬆ' => 'ST',\n  'և' => 'ԵՒ',\n  'ﬓ' => 'ՄՆ',\n  'ﬔ' => 'ՄԵ',\n  'ﬕ' => 'ՄԻ',\n  'ﬖ' => 'ՎՆ',\n  'ﬗ' => 'ՄԽ',\n  'ŉ' => 'ʼN',\n  'ΐ' => 'Ϊ́',\n  'ΰ' => 'Ϋ́',\n  'ǰ' => 'J̌',\n  'ẖ' => 'H̱',\n  'ẗ' => 'T̈',\n  'ẘ' => 'W̊',\n  'ẙ' => 'Y̊',\n  'ẚ' => 'Aʾ',\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"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-mbstring/bootstrap.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Mbstring as p;\n\nif (\\PHP_VERSION_ID >= 80000) {\n    return require __DIR__.'/bootstrap80.php';\n}\n\nif (!function_exists('mb_convert_encoding')) {\n    function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); }\n}\nif (!function_exists('mb_decode_mimeheader')) {\n    function mb_decode_mimeheader($string) { return p\\Mbstring::mb_decode_mimeheader($string); }\n}\nif (!function_exists('mb_encode_mimeheader')) {\n    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); }\n}\nif (!function_exists('mb_decode_numericentity')) {\n    function mb_decode_numericentity($string, $map, $encoding = null) { return p\\Mbstring::mb_decode_numericentity($string, $map, $encoding); }\n}\nif (!function_exists('mb_encode_numericentity')) {\n    function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); }\n}\nif (!function_exists('mb_convert_case')) {\n    function mb_convert_case($string, $mode, $encoding = null) { return p\\Mbstring::mb_convert_case($string, $mode, $encoding); }\n}\nif (!function_exists('mb_internal_encoding')) {\n    function mb_internal_encoding($encoding = null) { return p\\Mbstring::mb_internal_encoding($encoding); }\n}\nif (!function_exists('mb_language')) {\n    function mb_language($language = null) { return p\\Mbstring::mb_language($language); }\n}\nif (!function_exists('mb_list_encodings')) {\n    function mb_list_encodings() { return p\\Mbstring::mb_list_encodings(); }\n}\nif (!function_exists('mb_encoding_aliases')) {\n    function mb_encoding_aliases($encoding) { return p\\Mbstring::mb_encoding_aliases($encoding); }\n}\nif (!function_exists('mb_check_encoding')) {\n    function mb_check_encoding($value = null, $encoding = null) { return p\\Mbstring::mb_check_encoding($value, $encoding); }\n}\nif (!function_exists('mb_detect_encoding')) {\n    function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\\Mbstring::mb_detect_encoding($string, $encodings, $strict); }\n}\nif (!function_exists('mb_detect_order')) {\n    function mb_detect_order($encoding = null) { return p\\Mbstring::mb_detect_order($encoding); }\n}\nif (!function_exists('mb_parse_str')) {\n    function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; }\n}\nif (!function_exists('mb_strlen')) {\n    function mb_strlen($string, $encoding = null) { return p\\Mbstring::mb_strlen($string, $encoding); }\n}\nif (!function_exists('mb_strpos')) {\n    function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); }\n}\nif (!function_exists('mb_strtolower')) {\n    function mb_strtolower($string, $encoding = null) { return p\\Mbstring::mb_strtolower($string, $encoding); }\n}\nif (!function_exists('mb_strtoupper')) {\n    function mb_strtoupper($string, $encoding = null) { return p\\Mbstring::mb_strtoupper($string, $encoding); }\n}\nif (!function_exists('mb_substitute_character')) {\n    function mb_substitute_character($substitute_character = null) { return p\\Mbstring::mb_substitute_character($substitute_character); }\n}\nif (!function_exists('mb_substr')) {\n    function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\\Mbstring::mb_substr($string, $start, $length, $encoding); }\n}\nif (!function_exists('mb_stripos')) {\n    function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); }\n}\nif (!function_exists('mb_stristr')) {\n    function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); }\n}\nif (!function_exists('mb_strrchr')) {\n    function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); }\n}\nif (!function_exists('mb_strrichr')) {\n    function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); }\n}\nif (!function_exists('mb_strripos')) {\n    function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); }\n}\nif (!function_exists('mb_strrpos')) {\n    function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); }\n}\nif (!function_exists('mb_strstr')) {\n    function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); }\n}\nif (!function_exists('mb_get_info')) {\n    function mb_get_info($type = 'all') { return p\\Mbstring::mb_get_info($type); }\n}\nif (!function_exists('mb_http_output')) {\n    function mb_http_output($encoding = null) { return p\\Mbstring::mb_http_output($encoding); }\n}\nif (!function_exists('mb_strwidth')) {\n    function mb_strwidth($string, $encoding = null) { return p\\Mbstring::mb_strwidth($string, $encoding); }\n}\nif (!function_exists('mb_substr_count')) {\n    function mb_substr_count($haystack, $needle, $encoding = null) { return p\\Mbstring::mb_substr_count($haystack, $needle, $encoding); }\n}\nif (!function_exists('mb_output_handler')) {\n    function mb_output_handler($string, $status) { return p\\Mbstring::mb_output_handler($string, $status); }\n}\nif (!function_exists('mb_http_input')) {\n    function mb_http_input($type = null) { return p\\Mbstring::mb_http_input($type); }\n}\n\nif (!function_exists('mb_convert_variables')) {\n    function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); }\n}\n\nif (!function_exists('mb_ord')) {\n    function mb_ord($string, $encoding = null) { return p\\Mbstring::mb_ord($string, $encoding); }\n}\nif (!function_exists('mb_chr')) {\n    function mb_chr($codepoint, $encoding = null) { return p\\Mbstring::mb_chr($codepoint, $encoding); }\n}\nif (!function_exists('mb_scrub')) {\n    function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); }\n}\nif (!function_exists('mb_str_split')) {\n    function mb_str_split($string, $length = 1, $encoding = null) { return p\\Mbstring::mb_str_split($string, $length, $encoding); }\n}\n\nif (!function_exists('mb_str_pad')) {\n    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); }\n}\n\nif (extension_loaded('mbstring')) {\n    return;\n}\n\nif (!defined('MB_CASE_UPPER')) {\n    define('MB_CASE_UPPER', 0);\n}\nif (!defined('MB_CASE_LOWER')) {\n    define('MB_CASE_LOWER', 1);\n}\nif (!defined('MB_CASE_TITLE')) {\n    define('MB_CASE_TITLE', 2);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-mbstring/bootstrap80.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Mbstring as p;\n\nif (!function_exists('mb_convert_encoding')) {\n    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); }\n}\nif (!function_exists('mb_decode_mimeheader')) {\n    function mb_decode_mimeheader(?string $string): string { return p\\Mbstring::mb_decode_mimeheader((string) $string); }\n}\nif (!function_exists('mb_encode_mimeheader')) {\n    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); }\n}\nif (!function_exists('mb_decode_numericentity')) {\n    function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); }\n}\nif (!function_exists('mb_encode_numericentity')) {\n    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); }\n}\nif (!function_exists('mb_convert_case')) {\n    function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); }\n}\nif (!function_exists('mb_internal_encoding')) {\n    function mb_internal_encoding(?string $encoding = null): string|bool { return p\\Mbstring::mb_internal_encoding($encoding); }\n}\nif (!function_exists('mb_language')) {\n    function mb_language(?string $language = null): string|bool { return p\\Mbstring::mb_language($language); }\n}\nif (!function_exists('mb_list_encodings')) {\n    function mb_list_encodings(): array { return p\\Mbstring::mb_list_encodings(); }\n}\nif (!function_exists('mb_encoding_aliases')) {\n    function mb_encoding_aliases(?string $encoding): array { return p\\Mbstring::mb_encoding_aliases((string) $encoding); }\n}\nif (!function_exists('mb_check_encoding')) {\n    function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\\Mbstring::mb_check_encoding($value, $encoding); }\n}\nif (!function_exists('mb_detect_encoding')) {\n    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); }\n}\nif (!function_exists('mb_detect_order')) {\n    function mb_detect_order(array|string|null $encoding = null): array|bool { return p\\Mbstring::mb_detect_order($encoding); }\n}\nif (!function_exists('mb_parse_str')) {\n    function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; }\n}\nif (!function_exists('mb_strlen')) {\n    function mb_strlen(?string $string, ?string $encoding = null): int { return p\\Mbstring::mb_strlen((string) $string, $encoding); }\n}\nif (!function_exists('mb_strpos')) {\n    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); }\n}\nif (!function_exists('mb_strtolower')) {\n    function mb_strtolower(?string $string, ?string $encoding = null): string { return p\\Mbstring::mb_strtolower((string) $string, $encoding); }\n}\nif (!function_exists('mb_strtoupper')) {\n    function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\\Mbstring::mb_strtoupper((string) $string, $encoding); }\n}\nif (!function_exists('mb_substitute_character')) {\n    function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\\Mbstring::mb_substitute_character($substitute_character); }\n}\nif (!function_exists('mb_substr')) {\n    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); }\n}\nif (!function_exists('mb_stripos')) {\n    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); }\n}\nif (!function_exists('mb_stristr')) {\n    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); }\n}\nif (!function_exists('mb_strrchr')) {\n    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); }\n}\nif (!function_exists('mb_strrichr')) {\n    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); }\n}\nif (!function_exists('mb_strripos')) {\n    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); }\n}\nif (!function_exists('mb_strrpos')) {\n    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); }\n}\nif (!function_exists('mb_strstr')) {\n    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); }\n}\nif (!function_exists('mb_get_info')) {\n    function mb_get_info(?string $type = 'all'): array|string|int|false { return p\\Mbstring::mb_get_info((string) $type); }\n}\nif (!function_exists('mb_http_output')) {\n    function mb_http_output(?string $encoding = null): string|bool { return p\\Mbstring::mb_http_output($encoding); }\n}\nif (!function_exists('mb_strwidth')) {\n    function mb_strwidth(?string $string, ?string $encoding = null): int { return p\\Mbstring::mb_strwidth((string) $string, $encoding); }\n}\nif (!function_exists('mb_substr_count')) {\n    function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); }\n}\nif (!function_exists('mb_output_handler')) {\n    function mb_output_handler(?string $string, ?int $status): string { return p\\Mbstring::mb_output_handler((string) $string, (int) $status); }\n}\nif (!function_exists('mb_http_input')) {\n    function mb_http_input(?string $type = null): array|string|false { return p\\Mbstring::mb_http_input($type); }\n}\n\nif (!function_exists('mb_convert_variables')) {\n    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); }\n}\n\nif (!function_exists('mb_ord')) {\n    function mb_ord(?string $string, ?string $encoding = null): int|false { return p\\Mbstring::mb_ord((string) $string, $encoding); }\n}\nif (!function_exists('mb_chr')) {\n    function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\\Mbstring::mb_chr((int) $codepoint, $encoding); }\n}\nif (!function_exists('mb_scrub')) {\n    function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); }\n}\nif (!function_exists('mb_str_split')) {\n    function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); }\n}\n\nif (!function_exists('mb_str_pad')) {\n    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); }\n}\n\nif (extension_loaded('mbstring')) {\n    return;\n}\n\nif (!defined('MB_CASE_UPPER')) {\n    define('MB_CASE_UPPER', 0);\n}\nif (!defined('MB_CASE_LOWER')) {\n    define('MB_CASE_LOWER', 1);\n}\nif (!defined('MB_CASE_TITLE')) {\n    define('MB_CASE_TITLE', 2);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-mbstring/composer.json",
    "content": "{\n    \"name\": \"symfony/polyfill-mbstring\",\n    \"type\": \"library\",\n    \"description\": \"Symfony polyfill for the Mbstring extension\",\n    \"keywords\": [\"polyfill\", \"shim\", \"compatibility\", \"portable\", \"mbstring\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.1\"\n    },\n    \"provide\": {\n        \"ext-mbstring\": \"*\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Polyfill\\\\Mbstring\\\\\": \"\" },\n        \"files\": [ \"bootstrap.php\" ]\n    },\n    \"suggest\": {\n        \"ext-mbstring\": \"For best performance\"\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"thanks\": {\n            \"name\": \"symfony/polyfill\",\n            \"url\": \"https://github.com/symfony/polyfill\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php80/LICENSE",
    "content": "Copyright (c) 2020-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php80/Php80.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Polyfill\\Php80;\n\n/**\n * @author Ion Bazan <ion.bazan@gmail.com>\n * @author Nico Oelgart <nicoswd@gmail.com>\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nfinal class Php80\n{\n    public static function fdiv(float $dividend, float $divisor): float\n    {\n        return @($dividend / $divisor);\n    }\n\n    public static function get_debug_type($value): string\n    {\n        switch (true) {\n            case null === $value: return 'null';\n            case \\is_bool($value): return 'bool';\n            case \\is_string($value): return 'string';\n            case \\is_array($value): return 'array';\n            case \\is_int($value): return 'int';\n            case \\is_float($value): return 'float';\n            case \\is_object($value): break;\n            case $value instanceof \\__PHP_Incomplete_Class: return '__PHP_Incomplete_Class';\n            default:\n                if (null === $type = @get_resource_type($value)) {\n                    return 'unknown';\n                }\n\n                if ('Unknown' === $type) {\n                    $type = 'closed';\n                }\n\n                return \"resource ($type)\";\n        }\n\n        $class = \\get_class($value);\n\n        if (false === strpos($class, '@')) {\n            return $class;\n        }\n\n        return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous';\n    }\n\n    public static function get_resource_id($res): int\n    {\n        if (!\\is_resource($res) && null === @get_resource_type($res)) {\n            throw new \\TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res)));\n        }\n\n        return (int) $res;\n    }\n\n    public static function preg_last_error_msg(): string\n    {\n        switch (preg_last_error()) {\n            case \\PREG_INTERNAL_ERROR:\n                return 'Internal error';\n            case \\PREG_BAD_UTF8_ERROR:\n                return 'Malformed UTF-8 characters, possibly incorrectly encoded';\n            case \\PREG_BAD_UTF8_OFFSET_ERROR:\n                return 'The offset did not correspond to the beginning of a valid UTF-8 code point';\n            case \\PREG_BACKTRACK_LIMIT_ERROR:\n                return 'Backtrack limit exhausted';\n            case \\PREG_RECURSION_LIMIT_ERROR:\n                return 'Recursion limit exhausted';\n            case \\PREG_JIT_STACKLIMIT_ERROR:\n                return 'JIT stack limit exhausted';\n            case \\PREG_NO_ERROR:\n                return 'No error';\n            default:\n                return 'Unknown error';\n        }\n    }\n\n    public static function str_contains(string $haystack, string $needle): bool\n    {\n        return '' === $needle || false !== strpos($haystack, $needle);\n    }\n\n    public static function str_starts_with(string $haystack, string $needle): bool\n    {\n        return 0 === strncmp($haystack, $needle, \\strlen($needle));\n    }\n\n    public static function str_ends_with(string $haystack, string $needle): bool\n    {\n        if ('' === $needle || $needle === $haystack) {\n            return true;\n        }\n\n        if ('' === $haystack) {\n            return false;\n        }\n\n        $needleLength = \\strlen($needle);\n\n        return $needleLength <= \\strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php80/PhpToken.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Polyfill\\Php80;\n\n/**\n * @author Fedonyuk Anton <info@ensostudio.ru>\n *\n * @internal\n */\nclass PhpToken implements \\Stringable\n{\n    /**\n     * @var int\n     */\n    public $id;\n\n    /**\n     * @var string\n     */\n    public $text;\n\n    /**\n     * @var int\n     */\n    public $line;\n\n    /**\n     * @var int\n     */\n    public $pos;\n\n    public function __construct(int $id, string $text, int $line = -1, int $position = -1)\n    {\n        $this->id = $id;\n        $this->text = $text;\n        $this->line = $line;\n        $this->pos = $position;\n    }\n\n    public function getTokenName(): ?string\n    {\n        if ('UNKNOWN' === $name = token_name($this->id)) {\n            $name = \\strlen($this->text) > 1 || \\ord($this->text) < 32 ? null : $this->text;\n        }\n\n        return $name;\n    }\n\n    /**\n     * @param int|string|array $kind\n     */\n    public function is($kind): bool\n    {\n        foreach ((array) $kind as $value) {\n            if (\\in_array($value, [$this->id, $this->text], true)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    public function isIgnorable(): bool\n    {\n        return \\in_array($this->id, [\\T_WHITESPACE, \\T_COMMENT, \\T_DOC_COMMENT, \\T_OPEN_TAG], true);\n    }\n\n    public function __toString(): string\n    {\n        return (string) $this->text;\n    }\n\n    /**\n     * @return static[]\n     */\n    public static function tokenize(string $code, int $flags = 0): array\n    {\n        $line = 1;\n        $position = 0;\n        $tokens = token_get_all($code, $flags);\n        foreach ($tokens as $index => $token) {\n            if (\\is_string($token)) {\n                $id = \\ord($token);\n                $text = $token;\n            } else {\n                [$id, $text, $line] = $token;\n            }\n            $tokens[$index] = new static($id, $text, $line, $position);\n            $position += \\strlen($text);\n        }\n\n        return $tokens;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php80/README.md",
    "content": "Symfony Polyfill / Php80\n========================\n\nThis component provides features added to PHP 8.0 core:\n\n- [`Stringable`](https://php.net/stringable) interface\n- [`fdiv`](https://php.net/fdiv)\n- [`ValueError`](https://php.net/valueerror) class\n- [`UnhandledMatchError`](https://php.net/unhandledmatcherror) class\n- `FILTER_VALIDATE_BOOL` constant\n- [`get_debug_type`](https://php.net/get_debug_type)\n- [`PhpToken`](https://php.net/phptoken) class\n- [`preg_last_error_msg`](https://php.net/preg_last_error_msg)\n- [`str_contains`](https://php.net/str_contains)\n- [`str_starts_with`](https://php.net/str_starts_with)\n- [`str_ends_with`](https://php.net/str_ends_with)\n- [`get_resource_id`](https://php.net/get_resource_id)\n\nMore information can be found in the\n[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).\n\nLicense\n=======\n\nThis library is released under the [MIT license](LICENSE).\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\n#[Attribute(Attribute::TARGET_CLASS)]\nfinal class Attribute\n{\n    public const TARGET_CLASS = 1;\n    public const TARGET_FUNCTION = 2;\n    public const TARGET_METHOD = 4;\n    public const TARGET_PROPERTY = 8;\n    public const TARGET_CLASS_CONSTANT = 16;\n    public const TARGET_PARAMETER = 32;\n    public const TARGET_ALL = 63;\n    public const IS_REPEATABLE = 64;\n\n    /** @var int */\n    public $flags;\n\n    public function __construct(int $flags = self::TARGET_ALL)\n    {\n        $this->flags = $flags;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) {\n    class PhpToken extends Symfony\\Polyfill\\Php80\\PhpToken\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80000) {\n    interface Stringable\n    {\n        /**\n         * @return string\n         */\n        public function __toString();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80000) {\n    class UnhandledMatchError extends Error\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80000) {\n    class ValueError extends Error\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php80/bootstrap.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Php80 as p;\n\nif (\\PHP_VERSION_ID >= 80000) {\n    return;\n}\n\nif (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) {\n    define('FILTER_VALIDATE_BOOL', \\FILTER_VALIDATE_BOOLEAN);\n}\n\nif (!function_exists('fdiv')) {\n    function fdiv(float $num1, float $num2): float { return p\\Php80::fdiv($num1, $num2); }\n}\nif (!function_exists('preg_last_error_msg')) {\n    function preg_last_error_msg(): string { return p\\Php80::preg_last_error_msg(); }\n}\nif (!function_exists('str_contains')) {\n    function str_contains(?string $haystack, ?string $needle): bool { return p\\Php80::str_contains($haystack ?? '', $needle ?? ''); }\n}\nif (!function_exists('str_starts_with')) {\n    function str_starts_with(?string $haystack, ?string $needle): bool { return p\\Php80::str_starts_with($haystack ?? '', $needle ?? ''); }\n}\nif (!function_exists('str_ends_with')) {\n    function str_ends_with(?string $haystack, ?string $needle): bool { return p\\Php80::str_ends_with($haystack ?? '', $needle ?? ''); }\n}\nif (!function_exists('get_debug_type')) {\n    function get_debug_type($value): string { return p\\Php80::get_debug_type($value); }\n}\nif (!function_exists('get_resource_id')) {\n    function get_resource_id($resource): int { return p\\Php80::get_resource_id($resource); }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php80/composer.json",
    "content": "{\n    \"name\": \"symfony/polyfill-php80\",\n    \"type\": \"library\",\n    \"description\": \"Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions\",\n    \"keywords\": [\"polyfill\", \"shim\", \"compatibility\", \"portable\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Ion Bazan\",\n            \"email\": \"ion.bazan@gmail.com\"\n        },\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.1\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Polyfill\\\\Php80\\\\\": \"\" },\n        \"files\": [ \"bootstrap.php\" ],\n        \"classmap\": [ \"Resources/stubs\" ]\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"thanks\": {\n            \"name\": \"symfony/polyfill\",\n            \"url\": \"https://github.com/symfony/polyfill\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/LICENSE",
    "content": "Copyright (c) 2022-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Php83.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Polyfill\\Php83;\n\n/**\n * @author Ion Bazan <ion.bazan@gmail.com>\n * @author Pierre Ambroise <pierre27.ambroise@gmail.com>\n *\n * @internal\n */\nfinal class Php83\n{\n    private const JSON_MAX_DEPTH = 0x7FFFFFFF; // see https://www.php.net/manual/en/function.json-decode.php\n\n    public static function json_validate(string $json, int $depth = 512, int $flags = 0): bool\n    {\n        if (0 !== $flags && \\defined('JSON_INVALID_UTF8_IGNORE') && \\JSON_INVALID_UTF8_IGNORE !== $flags) {\n            throw new \\ValueError('json_validate(): Argument #3 ($flags) must be a valid flag (allowed flags: JSON_INVALID_UTF8_IGNORE)');\n        }\n\n        if ($depth <= 0) {\n            throw new \\ValueError('json_validate(): Argument #2 ($depth) must be greater than 0');\n        }\n\n        if ($depth > self::JSON_MAX_DEPTH) {\n            throw new \\ValueError(sprintf('json_validate(): Argument #2 ($depth) must be less than %d', self::JSON_MAX_DEPTH));\n        }\n\n        json_decode($json, null, $depth, $flags);\n\n        return \\JSON_ERROR_NONE === json_last_error();\n    }\n\n    public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \\STR_PAD_RIGHT, string $encoding = null): string\n    {\n        if (!\\in_array($pad_type, [\\STR_PAD_RIGHT, \\STR_PAD_LEFT, \\STR_PAD_BOTH], true)) {\n            throw new \\ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH');\n        }\n\n        if (null === $encoding) {\n            $encoding = mb_internal_encoding();\n        }\n\n        try {\n            $validEncoding = @mb_check_encoding('', $encoding);\n        } catch (\\ValueError $e) {\n            throw new \\ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, \"%s\" given', $encoding));\n        }\n\n        // BC for PHP 7.3 and lower\n        if (!$validEncoding) {\n            throw new \\ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, \"%s\" given', $encoding));\n        }\n\n        if (mb_strlen($pad_string, $encoding) <= 0) {\n            throw new \\ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string');\n        }\n\n        $paddingRequired = $length - mb_strlen($string, $encoding);\n\n        if ($paddingRequired < 1) {\n            return $string;\n        }\n\n        switch ($pad_type) {\n            case \\STR_PAD_LEFT:\n                return mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string;\n            case \\STR_PAD_RIGHT:\n                return $string.mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding);\n            default:\n                $leftPaddingLength = floor($paddingRequired / 2);\n                $rightPaddingLength = $paddingRequired - $leftPaddingLength;\n\n                return mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding);\n        }\n    }\n\n    public static function str_increment(string $string): string\n    {\n        if ('' === $string) {\n            throw new \\ValueError('str_increment(): Argument #1 ($string) cannot be empty');\n        }\n\n        if (!\\preg_match(\"/^[a-zA-Z0-9]+$/\", $string)) {\n            throw new \\ValueError('str_increment(): Argument #1 ($string) must be composed only of alphanumeric ASCII characters');\n        }\n\n        if (\\is_numeric($string)) {\n            $offset = stripos($string, 'e');\n            if ($offset !== false) {\n                $char = $string[$offset];\n                $char++;\n                $string[$offset] = $char;\n                $string++;\n\n                switch ($string[$offset]) {\n                    case 'f':\n                        $string[$offset] = 'e';\n                        break;\n                    case 'F':\n                        $string[$offset] = 'E';\n                        break;\n                    case 'g':\n                        $string[$offset] = 'f';\n                        break;\n                    case 'G':\n                        $string[$offset] = 'F';\n                        break;\n                }\n\n                return $string;\n            }\n        }\n\n        return ++$string;\n    }\n\n    public static function str_decrement(string $string): string\n    {\n        if ('' === $string) {\n            throw new \\ValueError('str_decrement(): Argument #1 ($string) cannot be empty');\n        }\n\n        if (!\\preg_match(\"/^[a-zA-Z0-9]+$/\", $string)) {\n            throw new \\ValueError('str_decrement(): Argument #1 ($string) must be composed only of alphanumeric ASCII characters');\n        }\n\n        if (\\preg_match('/\\A(?:0[aA0]?|[aA])\\z/', $string)) {\n            throw new \\ValueError(sprintf('str_decrement(): Argument #1 ($string) \"%s\" is out of decrement range', $string));\n        }\n\n        if (!\\in_array(substr($string, -1), ['A', 'a', '0'], true)) {\n            return join('', array_slice(str_split($string), 0, -1)) . chr(ord(substr($string, -1)) - 1);\n        }\n\n        $carry = '';\n        $decremented = '';\n\n        for ($i = strlen($string) - 1; $i >= 0; $i--) {\n            $char = $string[$i];\n\n            switch ($char) {\n                case 'A':\n                    if ('' !== $carry) {\n                        $decremented = $carry . $decremented;\n                        $carry = '';\n                    }\n                    $carry = 'Z';\n\n                    break;\n                case 'a':\n                    if ('' !== $carry) {\n                        $decremented = $carry . $decremented;\n                        $carry = '';\n                    }\n                    $carry = 'z';\n\n                    break;\n                case '0':\n                    if ('' !== $carry) {\n                        $decremented = $carry . $decremented;\n                        $carry = '';\n                    }\n                    $carry = '9';\n\n                    break;\n                case '1':\n                    if ('' !== $carry) {\n                        $decremented = $carry . $decremented;\n                        $carry = '';\n                    }\n\n                    break;\n                default:\n                    if ('' !== $carry) {\n                        $decremented = $carry . $decremented;\n                        $carry = '';\n                    }\n\n                    if (!\\in_array($char, ['A', 'a', '0'], true)) {\n                        $decremented = chr(ord($char) - 1) . $decremented;\n                    }\n            }\n        }\n\n        return $decremented;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/README.md",
    "content": "Symfony Polyfill / Php83\n========================\n\nThis component provides features added to PHP 8.3 core:\n\n- [`json_validate`](https://wiki.php.net/rfc/json_validate)\n- [`Override`](https://wiki.php.net/rfc/marking_overriden_methods)\n- [`mb_str_pad`](https://wiki.php.net/rfc/mb_str_pad)\n- [`ldap_exop_sync`](https://wiki.php.net/rfc/deprecate_functions_with_overloaded_signatures)\n- [`ldap_connect_wallet`](https://wiki.php.net/rfc/deprecate_functions_with_overloaded_signatures)\n- [`stream_context_set_options`](https://wiki.php.net/rfc/deprecate_functions_with_overloaded_signatures)\n- [`str_increment` and `str_decrement`](https://wiki.php.net/rfc/saner-inc-dec-operators)\n- [`Date*Exception/Error classes`](https://wiki.php.net/rfc/datetime-exceptions)\n- [`SQLite3Exception`](https://wiki.php.net/rfc/sqlite3_exceptions)\n\nMore information can be found in the\n[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).\n\nLicense\n=======\n\nThis library is released under the [MIT license](LICENSE).\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateError.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80300) {\n    class DateError extends Error\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80300) {\n    class DateException extends Exception\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80300) {\n    class DateInvalidOperationException extends DateException\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80300) {\n    class DateInvalidTimeZoneException extends DateException\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80300) {\n    class DateMalformedIntervalStringException extends DateException\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80300) {\n    class DateMalformedPeriodStringException extends DateException\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80300) {\n    class DateMalformedStringException extends DateException\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80300) {\n    class DateObjectError extends DateError\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80300) {\n    class DateRangeError extends DateError\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/Override.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80300) {\n    #[Attribute(Attribute::TARGET_METHOD)]\n    final class Override\n    {\n        public function __construct()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID < 80300) {\n    class SQLite3Exception extends Exception\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/bootstrap.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Php83 as p;\n\nif (\\PHP_VERSION_ID >= 80300) {\n    return;\n}\n\nif (!function_exists('json_validate')) {\n    function json_validate(string $json, int $depth = 512, int $flags = 0): bool { return p\\Php83::json_validate($json, $depth, $flags); }\n}\n\nif (!function_exists('mb_str_pad') && function_exists('mb_substr')) {\n    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); }\n}\n\nif (!function_exists('stream_context_set_options')) {\n    function stream_context_set_options($context, array $options): bool { return stream_context_set_option($context, $options); }\n}\n\nif (!function_exists('str_increment')) {\n    function str_increment(string $string): string { return p\\Php83::str_increment($string); }\n}\n\nif (!function_exists('str_decrement')) {\n    function str_decrement(string $string): string { return p\\Php83::str_decrement($string); }\n}\n\nif (\\PHP_VERSION_ID >= 80100) {\n    return require __DIR__.'/bootstrap81.php';\n}\n\nif (!function_exists('ldap_exop_sync') && function_exists('ldap_exop')) {\n    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); }\n}\n\nif (!function_exists('ldap_connect_wallet') && function_exists('ldap_connect')) {\n    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); }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/bootstrap81.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID >= 80300) {\n    return;\n}\n\nif (!function_exists('ldap_exop_sync') && function_exists('ldap_exop')) {\n    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); }\n}\n\nif (!function_exists('ldap_connect_wallet') && function_exists('ldap_connect')) {\n    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); }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/polyfill-php83/composer.json",
    "content": "{\n    \"name\": \"symfony/polyfill-php83\",\n    \"type\": \"library\",\n    \"description\": \"Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions\",\n    \"keywords\": [\"polyfill\", \"shim\", \"compatibility\", \"portable\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.1\",\n        \"symfony/polyfill-php80\": \"^1.14\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Polyfill\\\\Php83\\\\\": \"\" },\n        \"files\": [ \"bootstrap.php\" ],\n        \"classmap\": [ \"Resources/stubs\" ]\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"thanks\": {\n            \"name\": \"symfony/polyfill\",\n            \"url\": \"https://github.com/symfony/polyfill\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/.php-cs-fixer.dist.php",
    "content": "<?php\n\nreturn (new PhpCsFixer\\Config())\n    ->setRules([\n        '@Symfony' => true,\n        '@Symfony:risky' => true,\n        '@PHPUnit48Migration:risky' => true,\n        '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\n        'array_syntax' => ['syntax' => 'short'],\n        'fopen_flags' => false,\n        'ordered_imports' => true,\n        'protected_to_private' => false,\n        // Part of @Symfony:risky in PHP-CS-Fixer 2.13.0. To be removed from the config file once upgrading\n        'native_function_invocation' => ['include' => ['@compiler_optimized'], 'scope' => 'namespaced'],\n        // Part of future @Symfony ruleset in PHP-CS-Fixer To be removed from the config file once upgrading\n        'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'],\n    ])\n    ->setRiskyAllowed(true)\n    ->setFinder(\n        (new PhpCsFixer\\Finder())\n            ->in(__DIR__)\n            ->exclude('vendor')\n            ->name('*.php')\n    )\n;\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/ArgumentValueResolver/PsrServerRequestResolver.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Bridge\\PsrHttpMessage\\ArgumentValueResolver;\n\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Symfony\\Bridge\\PsrHttpMessage\\HttpMessageFactoryInterface;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface;\nuse Symfony\\Component\\HttpKernel\\Controller\\ValueResolverInterface as BaseValueResolverInterface;\nuse Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadata;\n\n/**\n * Injects the RequestInterface, MessageInterface or ServerRequestInterface when requested.\n *\n * @author Iltar van der Berg <kjarli@gmail.com>\n * @author Alexander M. Turek <me@derrabus.de>\n */\nfinal class PsrServerRequestResolver implements ArgumentValueResolverInterface, ValueResolverInterface\n{\n    private const SUPPORTED_TYPES = [\n        ServerRequestInterface::class => true,\n        RequestInterface::class => true,\n        MessageInterface::class => true,\n    ];\n\n    private $httpMessageFactory;\n\n    public function __construct(HttpMessageFactoryInterface $httpMessageFactory)\n    {\n        $this->httpMessageFactory = $httpMessageFactory;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function supports(Request $request, ArgumentMetadata $argument): bool\n    {\n        if ($this instanceof BaseValueResolverInterface) {\n            trigger_deprecation('symfony/psr-http-message-bridge', '2.3', 'Method \"%s\" is deprecated, call \"resolve()\" without calling \"supports()\" first.', __METHOD__);\n        }\n\n        return self::SUPPORTED_TYPES[$argument->getType()] ?? false;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function resolve(Request $request, ArgumentMetadata $argument): \\Traversable\n    {\n        if (!isset(self::SUPPORTED_TYPES[$argument->getType()])) {\n            return;\n        }\n\n        yield $this->httpMessageFactory->createRequest($request);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/ArgumentValueResolver/ValueResolverInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Bridge\\PsrHttpMessage\\ArgumentValueResolver;\n\nuse Symfony\\Component\\HttpKernel\\Controller\\ValueResolverInterface as BaseValueResolverInterface;\n\nif (interface_exists(BaseValueResolverInterface::class)) {\n    /** @internal */\n    interface ValueResolverInterface extends BaseValueResolverInterface\n    {\n    }\n} else {\n    /** @internal */\n    interface ValueResolverInterface\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/CHANGELOG.md",
    "content": "CHANGELOG\n=========\n\n# 2.3.1 (2023-07-26)\n\n* Don't rely on `Request::getPayload()` to populate the parsed body\n\n# 2.3.0 (2023-07-25)\n\n* Leverage `Request::getPayload()` to populate the parsed body of PSR-7 requests\n* Implement `ValueResolverInterface` introduced with Symfony 6.2\n\n# 2.2.0 (2023-04-21)\n\n* Drop support for Symfony 4\n* Bump minimum version of PHP to 7.2\n* Support version 2 of the psr/http-message contracts\n\n# 2.1.3 (2022-09-05)\n\n* Ignore invalid HTTP headers when creating PSR7 objects\n* Fix for wrong type passed to `moveTo()`\n\n# 2.1.2 (2021-11-05)\n\n* Allow Symfony 6\n\n# 2.1.0 (2021-02-17)\n\n  * Added a `PsrResponseListener` to automatically convert PSR-7 responses returned by controllers\n  * Added a `PsrServerRequestResolver` that allows injecting PSR-7 request objects into controllers\n\n# 2.0.2 (2020-09-29)\n\n  * Fix populating server params from URI in HttpFoundationFactory\n  * Create cookies as raw in HttpFoundationFactory\n  * Fix BinaryFileResponse with Content-Range PsrHttpFactory\n\n# 2.0.1 (2020-06-25)\n\n  * Don't normalize query string in PsrHttpFactory\n  * Fix conversion for HTTPS requests\n  * Fix populating default port and headers in HttpFoundationFactory\n\n# 2.0.0 (2020-01-02)\n\n  * Remove DiactorosFactory\n\n# 1.3.0 (2019-11-25)\n\n  * Added support for streamed requests\n  * Added support for Symfony 5.0+\n  * Fixed bridging UploadedFile objects\n  * Bumped minimum version of Symfony to 4.4\n\n# 1.2.0 (2019-03-11)\n\n  * Added new documentation links\n  * Bumped minimum version of PHP to 7.1\n  * Added support for streamed responses\n\n# 1.1.2 (2019-04-03)\n\n  * Fixed createResponse\n\n# 1.1.1 (2019-03-11)\n\n  * Deprecated DiactorosFactory, use PsrHttpFactory instead\n  * Removed triggering of deprecation\n\n# 1.1.0 (2018-08-30)\n\n  * Added support for creating PSR-7 messages using PSR-17 factories\n\n# 1.0.2 (2017-12-19)\n\n  * Fixed request target in PSR7 Request (mtibben)\n\n# 1.0.1 (2017-12-04)\n\n  * Added support for Symfony 4 (dunglas)\n\n# 1.0.0 (2016-09-14)\n\n  * Initial release\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/EventListener/PsrResponseListener.php",
    "content": "<?php\n\nnamespace Symfony\\Bridge\\PsrHttpMessage\\EventListener;\n\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Symfony\\Bridge\\PsrHttpMessage\\Factory\\HttpFoundationFactory;\nuse Symfony\\Bridge\\PsrHttpMessage\\HttpFoundationFactoryInterface;\nuse Symfony\\Component\\EventDispatcher\\EventSubscriberInterface;\nuse Symfony\\Component\\HttpKernel\\Event\\ViewEvent;\nuse Symfony\\Component\\HttpKernel\\KernelEvents;\n\n/**\n * Converts PSR-7 Response to HttpFoundation Response using the bridge.\n *\n * @author Kévin Dunglas <dunglas@gmail.com>\n * @author Alexander M. Turek <me@derrabus.de>\n */\nfinal class PsrResponseListener implements EventSubscriberInterface\n{\n    private $httpFoundationFactory;\n\n    public function __construct(HttpFoundationFactoryInterface $httpFoundationFactory = null)\n    {\n        $this->httpFoundationFactory = $httpFoundationFactory ?? new HttpFoundationFactory();\n    }\n\n    /**\n     * Do the conversion if applicable and update the response of the event.\n     */\n    public function onKernelView(ViewEvent $event): void\n    {\n        $controllerResult = $event->getControllerResult();\n\n        if (!$controllerResult instanceof ResponseInterface) {\n            return;\n        }\n\n        $event->setResponse($this->httpFoundationFactory->createResponse($controllerResult));\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public static function getSubscribedEvents(): array\n    {\n        return [\n            KernelEvents::VIEW => 'onKernelView',\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/Factory/HttpFoundationFactory.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Bridge\\PsrHttpMessage\\Factory;\n\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UploadedFileInterface;\nuse Psr\\Http\\Message\\UriInterface;\nuse Symfony\\Bridge\\PsrHttpMessage\\HttpFoundationFactoryInterface;\nuse Symfony\\Component\\HttpFoundation\\Cookie;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\HttpFoundation\\StreamedResponse;\n\n/**\n * {@inheritdoc}\n *\n * @author Kévin Dunglas <dunglas@gmail.com>\n */\nclass HttpFoundationFactory implements HttpFoundationFactoryInterface\n{\n    /**\n     * @var int The maximum output buffering size for each iteration when sending the response\n     */\n    private $responseBufferMaxLength;\n\n    public function __construct(int $responseBufferMaxLength = 16372)\n    {\n        $this->responseBufferMaxLength = $responseBufferMaxLength;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @return Request\n     */\n    public function createRequest(ServerRequestInterface $psrRequest, bool $streamed = false)\n    {\n        $server = [];\n        $uri = $psrRequest->getUri();\n\n        if ($uri instanceof UriInterface) {\n            $server['SERVER_NAME'] = $uri->getHost();\n            $server['SERVER_PORT'] = $uri->getPort() ?: ('https' === $uri->getScheme() ? 443 : 80);\n            $server['REQUEST_URI'] = $uri->getPath();\n            $server['QUERY_STRING'] = $uri->getQuery();\n\n            if ('' !== $server['QUERY_STRING']) {\n                $server['REQUEST_URI'] .= '?'.$server['QUERY_STRING'];\n            }\n\n            if ('https' === $uri->getScheme()) {\n                $server['HTTPS'] = 'on';\n            }\n        }\n\n        $server['REQUEST_METHOD'] = $psrRequest->getMethod();\n\n        $server = array_replace($psrRequest->getServerParams(), $server);\n\n        $parsedBody = $psrRequest->getParsedBody();\n        $parsedBody = \\is_array($parsedBody) ? $parsedBody : [];\n\n        $request = new Request(\n            $psrRequest->getQueryParams(),\n            $parsedBody,\n            $psrRequest->getAttributes(),\n            $psrRequest->getCookieParams(),\n            $this->getFiles($psrRequest->getUploadedFiles()),\n            $server,\n            $streamed ? $psrRequest->getBody()->detach() : $psrRequest->getBody()->__toString()\n        );\n        $request->headers->add($psrRequest->getHeaders());\n\n        return $request;\n    }\n\n    /**\n     * Converts to the input array to $_FILES structure.\n     */\n    private function getFiles(array $uploadedFiles): array\n    {\n        $files = [];\n\n        foreach ($uploadedFiles as $key => $value) {\n            if ($value instanceof UploadedFileInterface) {\n                $files[$key] = $this->createUploadedFile($value);\n            } else {\n                $files[$key] = $this->getFiles($value);\n            }\n        }\n\n        return $files;\n    }\n\n    /**\n     * Creates Symfony UploadedFile instance from PSR-7 ones.\n     */\n    private function createUploadedFile(UploadedFileInterface $psrUploadedFile): UploadedFile\n    {\n        return new UploadedFile($psrUploadedFile, function () { return $this->getTemporaryPath(); });\n    }\n\n    /**\n     * Gets a temporary file path.\n     *\n     * @return string\n     */\n    protected function getTemporaryPath()\n    {\n        return tempnam(sys_get_temp_dir(), uniqid('symfony', true));\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @return Response\n     */\n    public function createResponse(ResponseInterface $psrResponse, bool $streamed = false)\n    {\n        $cookies = $psrResponse->getHeader('Set-Cookie');\n        $psrResponse = $psrResponse->withoutHeader('Set-Cookie');\n\n        if ($streamed) {\n            $response = new StreamedResponse(\n                $this->createStreamedResponseCallback($psrResponse->getBody()),\n                $psrResponse->getStatusCode(),\n                $psrResponse->getHeaders()\n            );\n        } else {\n            $response = new Response(\n                $psrResponse->getBody()->__toString(),\n                $psrResponse->getStatusCode(),\n                $psrResponse->getHeaders()\n            );\n        }\n\n        $response->setProtocolVersion($psrResponse->getProtocolVersion());\n\n        foreach ($cookies as $cookie) {\n            $response->headers->setCookie($this->createCookie($cookie));\n        }\n\n        return $response;\n    }\n\n    /**\n     * Creates a Cookie instance from a cookie string.\n     *\n     * Some snippets have been taken from the Guzzle project: https://github.com/guzzle/guzzle/blob/5.3/src/Cookie/SetCookie.php#L34\n     *\n     * @throws \\InvalidArgumentException\n     */\n    private function createCookie(string $cookie): Cookie\n    {\n        foreach (explode(';', $cookie) as $part) {\n            $part = trim($part);\n\n            $data = explode('=', $part, 2);\n            $name = $data[0];\n            $value = isset($data[1]) ? trim($data[1], \" \\n\\r\\t\\0\\x0B\\\"\") : null;\n\n            if (!isset($cookieName)) {\n                $cookieName = $name;\n                $cookieValue = $value;\n\n                continue;\n            }\n\n            if ('expires' === strtolower($name) && null !== $value) {\n                $cookieExpire = new \\DateTime($value);\n\n                continue;\n            }\n\n            if ('path' === strtolower($name) && null !== $value) {\n                $cookiePath = $value;\n\n                continue;\n            }\n\n            if ('domain' === strtolower($name) && null !== $value) {\n                $cookieDomain = $value;\n\n                continue;\n            }\n\n            if ('secure' === strtolower($name)) {\n                $cookieSecure = true;\n\n                continue;\n            }\n\n            if ('httponly' === strtolower($name)) {\n                $cookieHttpOnly = true;\n\n                continue;\n            }\n\n            if ('samesite' === strtolower($name) && null !== $value) {\n                $samesite = $value;\n\n                continue;\n            }\n        }\n\n        if (!isset($cookieName)) {\n            throw new \\InvalidArgumentException('The value of the Set-Cookie header is malformed.');\n        }\n\n        return new Cookie(\n            $cookieName,\n            $cookieValue,\n            $cookieExpire ?? 0,\n            $cookiePath ?? '/',\n            $cookieDomain ?? null,\n            isset($cookieSecure),\n            isset($cookieHttpOnly),\n            true,\n            $samesite ?? null\n        );\n    }\n\n    private function createStreamedResponseCallback(StreamInterface $body): callable\n    {\n        return function () use ($body) {\n            if ($body->isSeekable()) {\n                $body->rewind();\n            }\n\n            if (!$body->isReadable()) {\n                echo $body;\n\n                return;\n            }\n\n            while (!$body->eof()) {\n                echo $body->read($this->responseBufferMaxLength);\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/Factory/PsrHttpFactory.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Bridge\\PsrHttpMessage\\Factory;\n\nuse Psr\\Http\\Message\\ResponseFactoryInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\ServerRequestFactoryInterface;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Psr\\Http\\Message\\StreamFactoryInterface;\nuse Psr\\Http\\Message\\UploadedFileFactoryInterface;\nuse Psr\\Http\\Message\\UploadedFileInterface;\nuse Symfony\\Bridge\\PsrHttpMessage\\HttpMessageFactoryInterface;\nuse Symfony\\Component\\HttpFoundation\\BinaryFileResponse;\nuse Symfony\\Component\\HttpFoundation\\File\\UploadedFile;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\HttpFoundation\\StreamedResponse;\n\n/**\n * Builds Psr\\HttpMessage instances using a PSR-17 implementation.\n *\n * @author Antonio J. García Lagar <aj@garcialagar.es>\n * @author Aurélien Pillevesse <aurelienpillevesse@hotmail.fr>\n */\nclass PsrHttpFactory implements HttpMessageFactoryInterface\n{\n    private $serverRequestFactory;\n    private $streamFactory;\n    private $uploadedFileFactory;\n    private $responseFactory;\n\n    public function __construct(ServerRequestFactoryInterface $serverRequestFactory, StreamFactoryInterface $streamFactory, UploadedFileFactoryInterface $uploadedFileFactory, ResponseFactoryInterface $responseFactory)\n    {\n        $this->serverRequestFactory = $serverRequestFactory;\n        $this->streamFactory = $streamFactory;\n        $this->uploadedFileFactory = $uploadedFileFactory;\n        $this->responseFactory = $responseFactory;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @return ServerRequestInterface\n     */\n    public function createRequest(Request $symfonyRequest)\n    {\n        $uri = $symfonyRequest->server->get('QUERY_STRING', '');\n        $uri = $symfonyRequest->getSchemeAndHttpHost().$symfonyRequest->getBaseUrl().$symfonyRequest->getPathInfo().('' !== $uri ? '?'.$uri : '');\n\n        $request = $this->serverRequestFactory->createServerRequest(\n            $symfonyRequest->getMethod(),\n            $uri,\n            $symfonyRequest->server->all()\n        );\n\n        foreach ($symfonyRequest->headers->all() as $name => $value) {\n            try {\n                $request = $request->withHeader($name, $value);\n            } catch (\\InvalidArgumentException $e) {\n                // ignore invalid header\n            }\n        }\n\n        $body = $this->streamFactory->createStreamFromResource($symfonyRequest->getContent(true));\n\n        if (method_exists(Request::class, 'getContentTypeFormat')) {\n            $format = $symfonyRequest->getContentTypeFormat();\n        } else {\n            $format = $symfonyRequest->getContentType();\n        }\n\n        if ('json' === $format) {\n            $parsedBody = json_decode($symfonyRequest->getContent(), true, 512, \\JSON_BIGINT_AS_STRING);\n\n            if (!\\is_array($parsedBody)) {\n                $parsedBody = null;\n            }\n        } else {\n            $parsedBody = $symfonyRequest->request->all();\n        }\n\n        $request = $request\n            ->withBody($body)\n            ->withUploadedFiles($this->getFiles($symfonyRequest->files->all()))\n            ->withCookieParams($symfonyRequest->cookies->all())\n            ->withQueryParams($symfonyRequest->query->all())\n            ->withParsedBody($parsedBody)\n        ;\n\n        foreach ($symfonyRequest->attributes->all() as $key => $value) {\n            $request = $request->withAttribute($key, $value);\n        }\n\n        return $request;\n    }\n\n    /**\n     * Converts Symfony uploaded files array to the PSR one.\n     */\n    private function getFiles(array $uploadedFiles): array\n    {\n        $files = [];\n\n        foreach ($uploadedFiles as $key => $value) {\n            if (null === $value) {\n                $files[$key] = $this->uploadedFileFactory->createUploadedFile($this->streamFactory->createStream(), 0, \\UPLOAD_ERR_NO_FILE);\n                continue;\n            }\n            if ($value instanceof UploadedFile) {\n                $files[$key] = $this->createUploadedFile($value);\n            } else {\n                $files[$key] = $this->getFiles($value);\n            }\n        }\n\n        return $files;\n    }\n\n    /**\n     * Creates a PSR-7 UploadedFile instance from a Symfony one.\n     */\n    private function createUploadedFile(UploadedFile $symfonyUploadedFile): UploadedFileInterface\n    {\n        return $this->uploadedFileFactory->createUploadedFile(\n            $this->streamFactory->createStreamFromFile(\n                $symfonyUploadedFile->getRealPath()\n            ),\n            (int) $symfonyUploadedFile->getSize(),\n            $symfonyUploadedFile->getError(),\n            $symfonyUploadedFile->getClientOriginalName(),\n            $symfonyUploadedFile->getClientMimeType()\n        );\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @return ResponseInterface\n     */\n    public function createResponse(Response $symfonyResponse)\n    {\n        $response = $this->responseFactory->createResponse($symfonyResponse->getStatusCode(), Response::$statusTexts[$symfonyResponse->getStatusCode()] ?? '');\n\n        if ($symfonyResponse instanceof BinaryFileResponse && !$symfonyResponse->headers->has('Content-Range')) {\n            $stream = $this->streamFactory->createStreamFromFile(\n                $symfonyResponse->getFile()->getPathname()\n            );\n        } else {\n            $stream = $this->streamFactory->createStreamFromFile('php://temp', 'wb+');\n            if ($symfonyResponse instanceof StreamedResponse || $symfonyResponse instanceof BinaryFileResponse) {\n                ob_start(function ($buffer) use ($stream) {\n                    $stream->write($buffer);\n\n                    return '';\n                }, 1);\n\n                $symfonyResponse->sendContent();\n                ob_end_clean();\n            } else {\n                $stream->write($symfonyResponse->getContent());\n            }\n        }\n\n        $response = $response->withBody($stream);\n\n        $headers = $symfonyResponse->headers->all();\n        $cookies = $symfonyResponse->headers->getCookies();\n        if (!empty($cookies)) {\n            $headers['Set-Cookie'] = [];\n\n            foreach ($cookies as $cookie) {\n                $headers['Set-Cookie'][] = $cookie->__toString();\n            }\n        }\n\n        foreach ($headers as $name => $value) {\n            try {\n                $response = $response->withHeader($name, $value);\n            } catch (\\InvalidArgumentException $e) {\n                // ignore invalid header\n            }\n        }\n\n        $protocolVersion = $symfonyResponse->getProtocolVersion();\n        $response = $response->withProtocolVersion($protocolVersion);\n\n        return $response;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/Factory/UploadedFile.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Bridge\\PsrHttpMessage\\Factory;\n\nuse Psr\\Http\\Message\\UploadedFileInterface;\nuse Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException;\nuse Symfony\\Component\\HttpFoundation\\File\\File;\nuse Symfony\\Component\\HttpFoundation\\File\\UploadedFile as BaseUploadedFile;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass UploadedFile extends BaseUploadedFile\n{\n    private $psrUploadedFile;\n    private $test = false;\n\n    public function __construct(UploadedFileInterface $psrUploadedFile, callable $getTemporaryPath)\n    {\n        $error = $psrUploadedFile->getError();\n        $path = '';\n\n        if (\\UPLOAD_ERR_NO_FILE !== $error) {\n            $path = $psrUploadedFile->getStream()->getMetadata('uri') ?? '';\n\n            if ($this->test = !\\is_string($path) || !is_uploaded_file($path)) {\n                $path = $getTemporaryPath();\n                $psrUploadedFile->moveTo($path);\n            }\n        }\n\n        parent::__construct(\n            $path,\n            (string) $psrUploadedFile->getClientFilename(),\n            $psrUploadedFile->getClientMediaType(),\n            $psrUploadedFile->getError(),\n            $this->test\n        );\n\n        $this->psrUploadedFile = $psrUploadedFile;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function move(string $directory, string $name = null): File\n    {\n        if (!$this->isValid() || $this->test) {\n            return parent::move($directory, $name);\n        }\n\n        $target = $this->getTargetFile($directory, $name);\n\n        try {\n            $this->psrUploadedFile->moveTo((string) $target);\n        } catch (\\RuntimeException $e) {\n            throw new FileException(sprintf('Could not move the file \"%s\" to \"%s\" (%s)', $this->getPathname(), $target, $e->getMessage()), 0, $e);\n        }\n\n        @chmod($target, 0666 & ~umask());\n\n        return $target;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/HttpFoundationFactoryInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Bridge\\PsrHttpMessage;\n\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\n/**\n * Creates Symfony Request and Response instances from PSR-7 ones.\n *\n * @author Kévin Dunglas <dunglas@gmail.com>\n */\ninterface HttpFoundationFactoryInterface\n{\n    /**\n     * Creates a Symfony Request instance from a PSR-7 one.\n     *\n     * @return Request\n     */\n    public function createRequest(ServerRequestInterface $psrRequest, bool $streamed = false);\n\n    /**\n     * Creates a Symfony Response instance from a PSR-7 one.\n     *\n     * @return Response\n     */\n    public function createResponse(ResponseInterface $psrResponse, bool $streamed = false);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/HttpMessageFactoryInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Bridge\\PsrHttpMessage;\n\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\n/**\n * Creates PSR HTTP Request and Response instances from Symfony ones.\n *\n * @author Kévin Dunglas <dunglas@gmail.com>\n */\ninterface HttpMessageFactoryInterface\n{\n    /**\n     * Creates a PSR-7 Request instance from a Symfony one.\n     *\n     * @return ServerRequestInterface\n     */\n    public function createRequest(Request $symfonyRequest);\n\n    /**\n     * Creates a PSR-7 Response instance from a Symfony one.\n     *\n     * @return ResponseInterface\n     */\n    public function createResponse(Response $symfonyResponse);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/LICENSE",
    "content": "Copyright (c) 2004-2021 Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/README.md",
    "content": "PSR-7 Bridge\n============\n\nProvides integration for PSR7.\n\nResources\n---------\n\n  * [Documentation](https://symfony.com/doc/current/components/psr7.html)\n\nRunning the tests\n-----------------\n\nIf you want to run the unit tests, install dev dependencies before\nrunning PHPUnit:\n\n    $ cd path/to/Symfony/Bridge/PsrHttpMessage/\n    $ composer.phar install\n    $ phpunit\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/composer.json",
    "content": "{\n    \"name\": \"symfony/psr-http-message-bridge\",\n    \"type\": \"symfony-bridge\",\n    \"description\": \"PSR HTTP message bridge\",\n    \"keywords\": [\"http\", \"psr-7\", \"psr-17\", \"http-message\"],\n    \"homepage\": \"http://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Fabien Potencier\",\n            \"email\": \"fabien@symfony.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"http://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.2.5\",\n        \"psr/http-message\": \"^1.0 || ^2.0\",\n        \"symfony/deprecation-contracts\": \"^2.5 || ^3.0\",\n        \"symfony/http-foundation\": \"^5.4 || ^6.0\"\n    },\n    \"require-dev\": {\n        \"symfony/browser-kit\": \"^5.4 || ^6.0\",\n        \"symfony/config\": \"^5.4 || ^6.0\",\n        \"symfony/event-dispatcher\": \"^5.4 || ^6.0\",\n        \"symfony/framework-bundle\": \"^5.4 || ^6.0\",\n        \"symfony/http-kernel\": \"^5.4 || ^6.0\",\n        \"symfony/phpunit-bridge\": \"^6.2\",\n        \"nyholm/psr7\": \"^1.1\",\n        \"psr/log\": \"^1.1 || ^2 || ^3\"\n    },\n    \"suggest\": {\n        \"nyholm/psr7\": \"For a super lightweight PSR-7/17 implementation\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Bridge\\\\PsrHttpMessage\\\\\": \"\" },\n        \"exclude-from-classmap\": [\n            \"/Tests/\"\n        ]\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-main\": \"2.3-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/Attribute/Required.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service\\Attribute;\n\n/**\n * A required dependency.\n *\n * This attribute indicates that a property holds a required dependency. The annotated property or method should be\n * considered during the instantiation process of the containing class.\n *\n * @author Alexander M. Turek <me@derrabus.de>\n */\n#[\\Attribute(\\Attribute::TARGET_METHOD | \\Attribute::TARGET_PROPERTY)]\nfinal class Required\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/Attribute/SubscribedService.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service\\Attribute;\n\nuse Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait;\nuse Symfony\\Contracts\\Service\\ServiceSubscriberInterface;\n\n/**\n * For use as the return value for {@see ServiceSubscriberInterface}.\n *\n * @example new SubscribedService('http_client', HttpClientInterface::class, false, new Target('githubApi'))\n *\n * Use with {@see ServiceMethodsSubscriberTrait} to mark a method's return type\n * as a subscribed service.\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n */\n#[\\Attribute(\\Attribute::TARGET_METHOD)]\nfinal class SubscribedService\n{\n    /** @var object[] */\n    public array $attributes;\n\n    /**\n     * @param string|null       $key        The key to use for the service\n     * @param class-string|null $type       The service class\n     * @param bool              $nullable   Whether the service is optional\n     * @param object|object[]   $attributes One or more dependency injection attributes to use\n     */\n    public function __construct(\n        public ?string $key = null,\n        public ?string $type = null,\n        public bool $nullable = false,\n        array|object $attributes = [],\n    ) {\n        $this->attributes = \\is_array($attributes) ? $attributes : [$attributes];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/CHANGELOG.md",
    "content": "CHANGELOG\n=========\n\nThe changelog is maintained for all Symfony contracts at the following URL:\nhttps://github.com/symfony/contracts/blob/main/CHANGELOG.md\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/LICENSE",
    "content": "Copyright (c) 2018-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/README.md",
    "content": "Symfony Service Contracts\n=========================\n\nA set of abstractions extracted out of the Symfony components.\n\nCan be used to build on semantics that the Symfony components proved useful and\nthat already have battle tested implementations.\n\nSee https://github.com/symfony/contracts/blob/main/README.md for more information.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/ResetInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\n/**\n * Provides a way to reset an object to its initial state.\n *\n * When calling the \"reset()\" method on an object, it should be put back to its\n * initial state. This usually means clearing any internal buffers and forwarding\n * the call to internal dependencies. All properties of the object should be put\n * back to the same state it had when it was first ready to use.\n *\n * This method could be called, for example, to recycle objects that are used as\n * services, so that they can be used to handle several requests in the same\n * process loop (note that we advise making your services stateless instead of\n * implementing this interface when possible.)\n */\ninterface ResetInterface\n{\n    /**\n     * @return void\n     */\n    public function reset();\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/ServiceCollectionInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\n/**\n * A ServiceProviderInterface that is also countable and iterable.\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n *\n * @template-covariant T of mixed\n *\n * @extends ServiceProviderInterface<T>\n * @extends \\IteratorAggregate<string, T>\n */\ninterface ServiceCollectionInterface extends ServiceProviderInterface, \\Countable, \\IteratorAggregate\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/ServiceLocatorTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\nuse Psr\\Container\\ContainerExceptionInterface;\nuse Psr\\Container\\NotFoundExceptionInterface;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(ContainerExceptionInterface::class);\nclass_exists(NotFoundExceptionInterface::class);\n\n/**\n * A trait to help implement ServiceProviderInterface.\n *\n * @author Robin Chalas <robin.chalas@gmail.com>\n * @author Nicolas Grekas <p@tchwork.com>\n */\ntrait ServiceLocatorTrait\n{\n    private array $factories;\n    private array $loading = [];\n    private array $providedTypes;\n\n    /**\n     * @param array<string, callable> $factories\n     */\n    public function __construct(array $factories)\n    {\n        $this->factories = $factories;\n    }\n\n    public function has(string $id): bool\n    {\n        return isset($this->factories[$id]);\n    }\n\n    public function get(string $id): mixed\n    {\n        if (!isset($this->factories[$id])) {\n            throw $this->createNotFoundException($id);\n        }\n\n        if (isset($this->loading[$id])) {\n            $ids = array_values($this->loading);\n            $ids = \\array_slice($this->loading, array_search($id, $ids));\n            $ids[] = $id;\n\n            throw $this->createCircularReferenceException($id, $ids);\n        }\n\n        $this->loading[$id] = $id;\n        try {\n            return $this->factories[$id]($this);\n        } finally {\n            unset($this->loading[$id]);\n        }\n    }\n\n    public function getProvidedServices(): array\n    {\n        if (!isset($this->providedTypes)) {\n            $this->providedTypes = [];\n\n            foreach ($this->factories as $name => $factory) {\n                if (!\\is_callable($factory)) {\n                    $this->providedTypes[$name] = '?';\n                } else {\n                    $type = (new \\ReflectionFunction($factory))->getReturnType();\n\n                    $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').($type instanceof \\ReflectionNamedType ? $type->getName() : $type) : '?';\n                }\n            }\n        }\n\n        return $this->providedTypes;\n    }\n\n    private function createNotFoundException(string $id): NotFoundExceptionInterface\n    {\n        if (!$alternatives = array_keys($this->factories)) {\n            $message = 'is empty...';\n        } else {\n            $last = array_pop($alternatives);\n            if ($alternatives) {\n                $message = sprintf('only knows about the \"%s\" and \"%s\" services.', implode('\", \"', $alternatives), $last);\n            } else {\n                $message = sprintf('only knows about the \"%s\" service.', $last);\n            }\n        }\n\n        if ($this->loading) {\n            $message = sprintf('The service \"%s\" has a dependency on a non-existent service \"%s\". This locator %s', end($this->loading), $id, $message);\n        } else {\n            $message = sprintf('Service \"%s\" not found: the current service locator %s', $id, $message);\n        }\n\n        return new class($message) extends \\InvalidArgumentException implements NotFoundExceptionInterface {\n        };\n    }\n\n    private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface\n    {\n        return new class(sprintf('Circular reference detected for service \"%s\", path: \"%s\".', $id, implode(' -> ', $path))) extends \\RuntimeException implements ContainerExceptionInterface {\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\nuse Psr\\Container\\ContainerInterface;\nuse Symfony\\Contracts\\Service\\Attribute\\Required;\nuse Symfony\\Contracts\\Service\\Attribute\\SubscribedService;\n\n/**\n * Implementation of ServiceSubscriberInterface that determines subscribed services\n * from methods that have the #[SubscribedService] attribute.\n *\n * Service ids are available as \"ClassName::methodName\" so that the implementation\n * of subscriber methods can be just `return $this->container->get(__METHOD__);`.\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n */\ntrait ServiceMethodsSubscriberTrait\n{\n    protected ContainerInterface $container;\n\n    public static function getSubscribedServices(): array\n    {\n        $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : [];\n\n        foreach ((new \\ReflectionClass(self::class))->getMethods() as $method) {\n            if (self::class !== $method->getDeclaringClass()->name) {\n                continue;\n            }\n\n            if (!$attribute = $method->getAttributes(SubscribedService::class)[0] ?? null) {\n                continue;\n            }\n\n            if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) {\n                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));\n            }\n\n            if (!$returnType = $method->getReturnType()) {\n                throw new \\LogicException(sprintf('Cannot use \"%s\" on methods without a return type in \"%s::%s()\".', SubscribedService::class, $method->name, self::class));\n            }\n\n            /* @var SubscribedService $attribute */\n            $attribute = $attribute->newInstance();\n            $attribute->key ??= self::class.'::'.$method->name;\n            $attribute->type ??= $returnType instanceof \\ReflectionNamedType ? $returnType->getName() : (string) $returnType;\n            $attribute->nullable = $returnType->allowsNull();\n\n            if ($attribute->attributes) {\n                $services[] = $attribute;\n            } else {\n                $services[$attribute->key] = ($attribute->nullable ? '?' : '').$attribute->type;\n            }\n        }\n\n        return $services;\n    }\n\n    #[Required]\n    public function setContainer(ContainerInterface $container): ?ContainerInterface\n    {\n        $ret = null;\n        if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) {\n            $ret = parent::setContainer($container);\n        }\n\n        $this->container = $container;\n\n        return $ret;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/ServiceProviderInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\nuse Psr\\Container\\ContainerInterface;\n\n/**\n * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Mateusz Sip <mateusz.sip@gmail.com>\n *\n * @template-covariant T of mixed\n */\ninterface ServiceProviderInterface extends ContainerInterface\n{\n    /**\n     * @return T\n     */\n    public function get(string $id): mixed;\n\n    public function has(string $id): bool;\n\n    /**\n     * Returns an associative array of service types keyed by the identifiers provided by the current container.\n     *\n     * Examples:\n     *\n     *  * ['logger' => 'Psr\\Log\\LoggerInterface'] means the object provides a service named \"logger\" that implements Psr\\Log\\LoggerInterface\n     *  * ['foo' => '?'] means the container provides service name \"foo\" of unspecified type\n     *  * ['bar' => '?Bar\\Baz'] means the container provides a service \"bar\" of type Bar\\Baz|null\n     *\n     * @return array<string, string> The provided service types, keyed by service names\n     */\n    public function getProvidedServices(): array;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/ServiceSubscriberInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\nuse Symfony\\Contracts\\Service\\Attribute\\SubscribedService;\n\n/**\n * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method.\n *\n * The getSubscribedServices method returns an array of service types required by such instances,\n * optionally keyed by the service names used internally. Service types that start with an interrogation\n * mark \"?\" are optional, while the other ones are mandatory service dependencies.\n *\n * The injected service locators SHOULD NOT allow access to any other services not specified by the method.\n *\n * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally.\n * This interface does not dictate any injection method for these service locators, although constructor\n * injection is recommended.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\ninterface ServiceSubscriberInterface\n{\n    /**\n     * Returns an array of service types (or {@see SubscribedService} objects) required\n     * by such instances, optionally keyed by the service names used internally.\n     *\n     * For mandatory dependencies:\n     *\n     *  * ['logger' => 'Psr\\Log\\LoggerInterface'] means the objects use the \"logger\" name\n     *    internally to fetch a service which must implement Psr\\Log\\LoggerInterface.\n     *  * ['loggers' => 'Psr\\Log\\LoggerInterface[]'] means the objects use the \"loggers\" name\n     *    internally to fetch an iterable of Psr\\Log\\LoggerInterface instances.\n     *  * ['Psr\\Log\\LoggerInterface'] is a shortcut for\n     *  * ['Psr\\Log\\LoggerInterface' => 'Psr\\Log\\LoggerInterface']\n     *\n     * otherwise:\n     *\n     *  * ['logger' => '?Psr\\Log\\LoggerInterface'] denotes an optional dependency\n     *  * ['loggers' => '?Psr\\Log\\LoggerInterface[]'] denotes an optional iterable dependency\n     *  * ['?Psr\\Log\\LoggerInterface'] is a shortcut for\n     *  * ['Psr\\Log\\LoggerInterface' => '?Psr\\Log\\LoggerInterface']\n     *\n     * additionally, an array of {@see SubscribedService}'s can be returned:\n     *\n     *  * [new SubscribedService('logger', Psr\\Log\\LoggerInterface::class)]\n     *  * [new SubscribedService(type: Psr\\Log\\LoggerInterface::class, nullable: true)]\n     *  * [new SubscribedService('http_client', HttpClientInterface::class, attributes: new Target('githubApi'))]\n     *\n     * @return string[]|SubscribedService[] The required service types, optionally keyed by service names\n     */\n    public static function getSubscribedServices(): array;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/ServiceSubscriberTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\nuse Psr\\Container\\ContainerInterface;\nuse Symfony\\Contracts\\Service\\Attribute\\Required;\nuse Symfony\\Contracts\\Service\\Attribute\\SubscribedService;\n\ntrigger_deprecation('symfony/contracts', 'v3.5', '\"%s\" is deprecated, use \"ServiceMethodsSubscriberTrait\" instead.', ServiceSubscriberTrait::class);\n\n/**\n * Implementation of ServiceSubscriberInterface that determines subscribed services\n * from methods that have the #[SubscribedService] attribute.\n *\n * Service ids are available as \"ClassName::methodName\" so that the implementation\n * of subscriber methods can be just `return $this->container->get(__METHOD__);`.\n *\n * @property ContainerInterface $container\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n *\n * @deprecated since symfony/contracts v3.5, use ServiceMethodsSubscriberTrait instead\n */\ntrait ServiceSubscriberTrait\n{\n    public static function getSubscribedServices(): array\n    {\n        $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : [];\n\n        foreach ((new \\ReflectionClass(self::class))->getMethods() as $method) {\n            if (self::class !== $method->getDeclaringClass()->name) {\n                continue;\n            }\n\n            if (!$attribute = $method->getAttributes(SubscribedService::class)[0] ?? null) {\n                continue;\n            }\n\n            if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) {\n                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));\n            }\n\n            if (!$returnType = $method->getReturnType()) {\n                throw new \\LogicException(sprintf('Cannot use \"%s\" on methods without a return type in \"%s::%s()\".', SubscribedService::class, $method->name, self::class));\n            }\n\n            /* @var SubscribedService $attribute */\n            $attribute = $attribute->newInstance();\n            $attribute->key ??= self::class.'::'.$method->name;\n            $attribute->type ??= $returnType instanceof \\ReflectionNamedType ? $returnType->getName() : (string) $returnType;\n            $attribute->nullable = $returnType->allowsNull();\n\n            if ($attribute->attributes) {\n                $services[] = $attribute;\n            } else {\n                $services[$attribute->key] = ($attribute->nullable ? '?' : '').$attribute->type;\n            }\n        }\n\n        return $services;\n    }\n\n    #[Required]\n    public function setContainer(ContainerInterface $container): ?ContainerInterface\n    {\n        $ret = null;\n        if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) {\n            $ret = parent::setContainer($container);\n        }\n\n        $this->container = $container;\n\n        return $ret;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service\\Test;\n\nclass_alias(ServiceLocatorTestCase::class, ServiceLocatorTest::class);\n\nif (false) {\n    /**\n     * @deprecated since PHPUnit 9.6\n     */\n    class ServiceLocatorTest\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service\\Test;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Container\\ContainerExceptionInterface;\nuse Psr\\Container\\ContainerInterface;\nuse Psr\\Container\\NotFoundExceptionInterface;\nuse Symfony\\Contracts\\Service\\ServiceLocatorTrait;\n\nabstract class ServiceLocatorTestCase extends TestCase\n{\n    protected function getServiceLocator(array $factories): ContainerInterface\n    {\n        return new class($factories) implements ContainerInterface {\n            use ServiceLocatorTrait;\n        };\n    }\n\n    public function testHas()\n    {\n        $locator = $this->getServiceLocator([\n            'foo' => fn () => 'bar',\n            'bar' => fn () => 'baz',\n            fn () => 'dummy',\n        ]);\n\n        $this->assertTrue($locator->has('foo'));\n        $this->assertTrue($locator->has('bar'));\n        $this->assertFalse($locator->has('dummy'));\n    }\n\n    public function testGet()\n    {\n        $locator = $this->getServiceLocator([\n            'foo' => fn () => 'bar',\n            'bar' => fn () => 'baz',\n        ]);\n\n        $this->assertSame('bar', $locator->get('foo'));\n        $this->assertSame('baz', $locator->get('bar'));\n    }\n\n    public function testGetDoesNotMemoize()\n    {\n        $i = 0;\n        $locator = $this->getServiceLocator([\n            'foo' => function () use (&$i) {\n                ++$i;\n\n                return 'bar';\n            },\n        ]);\n\n        $this->assertSame('bar', $locator->get('foo'));\n        $this->assertSame('bar', $locator->get('foo'));\n        $this->assertSame(2, $i);\n    }\n\n    public function testThrowsOnUndefinedInternalService()\n    {\n        $locator = $this->getServiceLocator([\n            'foo' => function () use (&$locator) { return $locator->get('bar'); },\n        ]);\n\n        if (!$this->getExpectedException()) {\n            $this->expectException(NotFoundExceptionInterface::class);\n            $this->expectExceptionMessage('The service \"foo\" has a dependency on a non-existent service \"bar\". This locator only knows about the \"foo\" service.');\n        }\n\n        $locator->get('foo');\n    }\n\n    public function testThrowsOnCircularReference()\n    {\n        $locator = $this->getServiceLocator([\n            'foo' => function () use (&$locator) { return $locator->get('bar'); },\n            'bar' => function () use (&$locator) { return $locator->get('baz'); },\n            'baz' => function () use (&$locator) { return $locator->get('bar'); },\n        ]);\n\n        $this->expectException(ContainerExceptionInterface::class);\n        $this->expectExceptionMessage('Circular reference detected for service \"bar\", path: \"bar -> baz -> bar\".');\n\n        $locator->get('foo');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/service-contracts/composer.json",
    "content": "{\n    \"name\": \"symfony/service-contracts\",\n    \"type\": \"library\",\n    \"description\": \"Generic abstractions related to writing services\",\n    \"keywords\": [\"abstractions\", \"contracts\", \"decoupling\", \"interfaces\", \"interoperability\", \"standards\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.1\",\n        \"psr/container\": \"^1.1|^2.0\",\n        \"symfony/deprecation-contracts\": \"^2.5|^3\"\n    },\n    \"conflict\": {\n        \"ext-psr\": \"<1.1|>=2\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Contracts\\\\Service\\\\\": \"\" },\n        \"exclude-from-classmap\": [\n            \"/Test/\"\n        ]\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-main\": \"3.5-dev\"\n        },\n        \"thanks\": {\n            \"name\": \"symfony/contracts\",\n            \"url\": \"https://github.com/symfony/contracts\"\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/CHANGELOG.md",
    "content": "CHANGELOG\n=========\n\n6.4\n---\n\n * Deprecate per-property lazy-initializers\n\n6.2\n---\n\n * Add support for lazy ghost objects and virtual proxies\n * Add `Hydrator::hydrate()`\n * Preserve PHP references also when using `Hydrator::hydrate()` or `Instantiator::instantiate()`\n * Add support for hydrating from native (array) casts\n\n5.1.0\n-----\n\n * added argument `array &$foundClasses` to `VarExporter::export()` to ease with preloading exported values\n\n4.2.0\n-----\n\n * added the component\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Exception;\n\nclass ClassNotFoundException extends \\Exception implements ExceptionInterface\n{\n    public function __construct(string $class, ?\\Throwable $previous = null)\n    {\n        parent::__construct(sprintf('Class \"%s\" not found.', $class), 0, $previous);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Exception/ExceptionInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Exception;\n\ninterface ExceptionInterface extends \\Throwable\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Exception/LogicException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Exception;\n\nclass LogicException extends \\LogicException implements ExceptionInterface\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Exception;\n\nclass NotInstantiableTypeException extends \\Exception implements ExceptionInterface\n{\n    public function __construct(string $type, ?\\Throwable $previous = null)\n    {\n        parent::__construct(sprintf('Type \"%s\" is not instantiable.', $type), 0, $previous);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Hydrator.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter;\n\nuse Symfony\\Component\\VarExporter\\Internal\\Hydrator as InternalHydrator;\n\n/**\n * Utility class to hydrate the properties of an object.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nfinal class Hydrator\n{\n    /**\n     * Sets the properties of an object, including private and protected ones.\n     *\n     * For example:\n     *\n     *     // Sets the public or protected $object->propertyName property\n     *     Hydrator::hydrate($object, ['propertyName' => $propertyValue]);\n     *\n     *     // Sets a private property defined on its parent Bar class:\n     *     Hydrator::hydrate($object, [\"\\0Bar\\0privateBarProperty\" => $propertyValue]);\n     *\n     *     // Alternative way to set the private $object->privateBarProperty property\n     *     Hydrator::hydrate($object, [], [\n     *         Bar::class => ['privateBarProperty' => $propertyValue],\n     *     ]);\n     *\n     * Instances of ArrayObject, ArrayIterator and SplObjectStorage can be hydrated\n     * by using the special \"\\0\" property name to define their internal value:\n     *\n     *     // Hydrates an SplObjectStorage where $info1 is attached to $obj1, etc.\n     *     Hydrator::hydrate($object, [\"\\0\" => [$obj1, $info1, $obj2, $info2...]]);\n     *\n     *     // Hydrates an ArrayObject populated with $inputArray\n     *     Hydrator::hydrate($object, [\"\\0\" => [$inputArray]]);\n     *\n     * @template T of object\n     *\n     * @param T                                         $instance         The object to hydrate\n     * @param array<string, mixed>                      $properties       The properties to set on the instance\n     * @param array<class-string, array<string, mixed>> $scopedProperties The properties to set on the instance,\n     *                                                                    keyed by their declaring class\n     *\n     * @return T\n     */\n    public static function hydrate(object $instance, array $properties = [], array $scopedProperties = []): object\n    {\n        if ($properties) {\n            $class = $instance::class;\n            $propertyScopes = InternalHydrator::$propertyScopes[$class] ??= InternalHydrator::getPropertyScopes($class);\n\n            foreach ($properties as $name => &$value) {\n                [$scope, $name, $readonlyScope] = $propertyScopes[$name] ?? [$class, $name, $class];\n                $scopedProperties[$readonlyScope ?? $scope][$name] = &$value;\n            }\n            unset($value);\n        }\n\n        foreach ($scopedProperties as $scope => $properties) {\n            if ($properties) {\n                (InternalHydrator::$simpleHydrators[$scope] ??= InternalHydrator::getSimpleHydrator($scope))($properties, $instance);\n            }\n        }\n\n        return $instance;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Instantiator.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter;\n\nuse Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface;\nuse Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException;\nuse Symfony\\Component\\VarExporter\\Internal\\Registry;\n\n/**\n * A utility class to create objects without calling their constructor.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nfinal class Instantiator\n{\n    /**\n     * Creates an object and sets its properties without calling its constructor nor any other methods.\n     *\n     * @see Hydrator::hydrate() for examples\n     *\n     * @template T of object\n     *\n     * @param class-string<T>                           $class            The class of the instance to create\n     * @param array<string, mixed>                      $properties       The properties to set on the instance\n     * @param array<class-string, array<string, mixed>> $scopedProperties The properties to set on the instance,\n     *                                                                    keyed by their declaring class\n     *\n     * @return T\n     *\n     * @throws ExceptionInterface When the instance cannot be created\n     */\n    public static function instantiate(string $class, array $properties = [], array $scopedProperties = []): object\n    {\n        $reflector = Registry::$reflectors[$class] ??= Registry::getClassReflector($class);\n\n        if (Registry::$cloneable[$class]) {\n            $instance = clone Registry::$prototypes[$class];\n        } elseif (Registry::$instantiableWithoutConstructor[$class]) {\n            $instance = $reflector->newInstanceWithoutConstructor();\n        } elseif (null === Registry::$prototypes[$class]) {\n            throw new NotInstantiableTypeException($class);\n        } elseif ($reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize')) {\n            $instance = unserialize('C:'.\\strlen($class).':\"'.$class.'\":0:{}');\n        } else {\n            $instance = unserialize('O:'.\\strlen($class).':\"'.$class.'\":0:{}');\n        }\n\n        return $properties || $scopedProperties ? Hydrator::hydrate($instance, $properties, $scopedProperties) : $instance;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Internal/Exporter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Internal;\n\nuse Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nclass Exporter\n{\n    /**\n     * Prepares an array of values for VarExporter.\n     *\n     * For performance this method is public and has no type-hints.\n     *\n     * @param array             &$values\n     * @param \\SplObjectStorage $objectsPool\n     * @param array             &$refsPool\n     * @param int               &$objectsCount\n     * @param bool              &$valuesAreStatic\n     *\n     * @return array\n     *\n     * @throws NotInstantiableTypeException When a value cannot be serialized\n     */\n    public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount, &$valuesAreStatic)\n    {\n        $refs = $values;\n        foreach ($values as $k => $value) {\n            if (\\is_resource($value)) {\n                throw new NotInstantiableTypeException(get_resource_type($value).' resource');\n            }\n            $refs[$k] = $objectsPool;\n\n            if ($isRef = !$valueIsStatic = $values[$k] !== $objectsPool) {\n                $values[$k] = &$value; // Break hard references to make $values completely\n                unset($value);         // independent from the original structure\n                $refs[$k] = $value = $values[$k];\n                if ($value instanceof Reference && 0 > $value->id) {\n                    $valuesAreStatic = false;\n                    ++$value->count;\n                    continue;\n                }\n                $refsPool[] = [&$refs[$k], $value, &$value];\n                $refs[$k] = $values[$k] = new Reference(-\\count($refsPool), $value);\n            }\n\n            if (\\is_array($value)) {\n                if ($value) {\n                    $value = self::prepare($value, $objectsPool, $refsPool, $objectsCount, $valueIsStatic);\n                }\n                goto handle_value;\n            } elseif (!\\is_object($value) || $value instanceof \\UnitEnum) {\n                goto handle_value;\n            }\n\n            $valueIsStatic = false;\n            if (isset($objectsPool[$value])) {\n                ++$objectsCount;\n                $value = new Reference($objectsPool[$value][0]);\n                goto handle_value;\n            }\n\n            $class = $value::class;\n            $reflector = Registry::$reflectors[$class] ??= Registry::getClassReflector($class);\n            $properties = [];\n\n            if ($reflector->hasMethod('__serialize')) {\n                if (!$reflector->getMethod('__serialize')->isPublic()) {\n                    throw new \\Error(sprintf('Call to %s method \"%s::__serialize()\".', $reflector->getMethod('__serialize')->isProtected() ? 'protected' : 'private', $class));\n                }\n\n                if (!\\is_array($serializeProperties = $value->__serialize())) {\n                    throw new \\TypeError($class.'::__serialize() must return an array');\n                }\n\n                if ($reflector->hasMethod('__unserialize')) {\n                    $properties = $serializeProperties;\n                } else {\n                    foreach ($serializeProperties as $n => $v) {\n                        $c = $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass';\n                        $properties[$c][$n] = $v;\n                    }\n                }\n\n                goto prepare_value;\n            }\n\n            $sleep = null;\n            $proto = Registry::$prototypes[$class];\n\n            if (($value instanceof \\ArrayIterator || $value instanceof \\ArrayObject) && null !== $proto) {\n                // ArrayIterator and ArrayObject need special care because their \"flags\"\n                // option changes the behavior of the (array) casting operator.\n                [$arrayValue, $properties] = self::getArrayObjectProperties($value, $proto);\n\n                // populates Registry::$prototypes[$class] with a new instance\n                Registry::getClassReflector($class, Registry::$instantiableWithoutConstructor[$class], Registry::$cloneable[$class]);\n            } elseif ($value instanceof \\SplObjectStorage && Registry::$cloneable[$class] && null !== $proto) {\n                // By implementing Serializable, SplObjectStorage breaks\n                // internal references; let's deal with it on our own.\n                foreach (clone $value as $v) {\n                    $properties[] = $v;\n                    $properties[] = $value[$v];\n                }\n                $properties = ['SplObjectStorage' => [\"\\0\" => $properties]];\n                $arrayValue = (array) $value;\n            } elseif ($value instanceof \\Serializable\n                || $value instanceof \\__PHP_Incomplete_Class\n            ) {\n                ++$objectsCount;\n                $objectsPool[$value] = [$id = \\count($objectsPool), serialize($value), [], 0];\n                $value = new Reference($id);\n                goto handle_value;\n            } else {\n                if (method_exists($class, '__sleep')) {\n                    if (!\\is_array($sleep = $value->__sleep())) {\n                        trigger_error('serialize(): __sleep should return an array only containing the names of instance-variables to serialize', \\E_USER_NOTICE);\n                        $value = null;\n                        goto handle_value;\n                    }\n                    $sleep = array_flip($sleep);\n                }\n\n                $arrayValue = (array) $value;\n            }\n\n            $proto = (array) $proto;\n\n            foreach ($arrayValue as $name => $v) {\n                $i = 0;\n                $n = (string) $name;\n                if ('' === $n || \"\\0\" !== $n[0]) {\n                    $c = $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass';\n                } elseif ('*' === $n[1]) {\n                    $n = substr($n, 3);\n                    $c = $reflector->getProperty($n)->class;\n                    if ('Error' === $c) {\n                        $c = 'TypeError';\n                    } elseif ('Exception' === $c) {\n                        $c = 'ErrorException';\n                    }\n                } else {\n                    $i = strpos($n, \"\\0\", 2);\n                    $c = substr($n, 1, $i - 1);\n                    $n = substr($n, 1 + $i);\n                }\n                if (null !== $sleep) {\n                    if (!isset($sleep[$name]) && (!isset($sleep[$n]) || ($i && $c !== $class))) {\n                        unset($arrayValue[$name]);\n                        continue;\n                    }\n                    unset($sleep[$name], $sleep[$n]);\n                }\n                if (!\\array_key_exists($name, $proto) || $proto[$name] !== $v || \"\\x00Error\\x00trace\" === $name || \"\\x00Exception\\x00trace\" === $name) {\n                    $properties[$c][$n] = $v;\n                }\n            }\n            if ($sleep) {\n                foreach ($sleep as $n => $v) {\n                    trigger_error(sprintf('serialize(): \"%s\" returned as member variable from __sleep() but does not exist', $n), \\E_USER_NOTICE);\n                }\n            }\n            if (method_exists($class, '__unserialize')) {\n                $properties = $arrayValue;\n            }\n\n            prepare_value:\n            $objectsPool[$value] = [$id = \\count($objectsPool)];\n            $properties = self::prepare($properties, $objectsPool, $refsPool, $objectsCount, $valueIsStatic);\n            ++$objectsCount;\n            $objectsPool[$value] = [$id, $class, $properties, method_exists($class, '__unserialize') ? -$objectsCount : (method_exists($class, '__wakeup') ? $objectsCount : 0)];\n\n            $value = new Reference($id);\n\n            handle_value:\n            if ($isRef) {\n                unset($value); // Break the hard reference created above\n            } elseif (!$valueIsStatic) {\n                $values[$k] = $value;\n            }\n            $valuesAreStatic = $valueIsStatic && $valuesAreStatic;\n        }\n\n        return $values;\n    }\n\n    public static function export($value, $indent = '')\n    {\n        switch (true) {\n            case \\is_int($value) || \\is_float($value): return var_export($value, true);\n            case [] === $value: return '[]';\n            case false === $value: return 'false';\n            case true === $value: return 'true';\n            case null === $value: return 'null';\n            case '' === $value: return \"''\";\n            case $value instanceof \\UnitEnum: return '\\\\'.ltrim(var_export($value, true), '\\\\');\n        }\n\n        if ($value instanceof Reference) {\n            if (0 <= $value->id) {\n                return '$o['.$value->id.']';\n            }\n            if (!$value->count) {\n                return self::export($value->value, $indent);\n            }\n            $value = -$value->id;\n\n            return '&$r['.$value.']';\n        }\n        $subIndent = $indent.'    ';\n\n        if (\\is_string($value)) {\n            $code = sprintf(\"'%s'\", addcslashes($value, \"'\\\\\"));\n\n            $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) {\n                $m[1] = sprintf('\\'.\"%s\".\\'', str_replace(\n                    [\"\\0\", \"\\r\", \"\\n\", \"\\u{202A}\", \"\\u{202B}\", \"\\u{202D}\", \"\\u{202E}\", \"\\u{2066}\", \"\\u{2067}\", \"\\u{2068}\", \"\\u{202C}\", \"\\u{2069}\", '\\n\\\\'],\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.'.\"\\\\'],\n                    $m[1]\n                ));\n\n                if (\"'\" === $m[2]) {\n                    return substr($m[1], 0, -2);\n                }\n\n                if (str_ends_with($m[1], 'n\".\\'')) {\n                    return substr_replace($m[1], \"\\n\".$subIndent.\".'\".$m[2], -2);\n                }\n\n                return $m[1].$m[2];\n            }, $code, -1, $count);\n\n            if ($count && str_starts_with($code, \"''.\")) {\n                $code = substr($code, 3);\n            }\n\n            return $code;\n        }\n\n        if (\\is_array($value)) {\n            $j = -1;\n            $code = '';\n            foreach ($value as $k => $v) {\n                $code .= $subIndent;\n                if (!\\is_int($k) || 1 !== $k - $j) {\n                    $code .= self::export($k, $subIndent).' => ';\n                }\n                if (\\is_int($k) && $k > $j) {\n                    $j = $k;\n                }\n                $code .= self::export($v, $subIndent).\",\\n\";\n            }\n\n            return \"[\\n\".$code.$indent.']';\n        }\n\n        if ($value instanceof Values) {\n            $code = $subIndent.\"\\$r = [],\\n\";\n            foreach ($value->values as $k => $v) {\n                $code .= $subIndent.'$r['.$k.'] = '.self::export($v, $subIndent).\",\\n\";\n            }\n\n            return \"[\\n\".$code.$indent.']';\n        }\n\n        if ($value instanceof Registry) {\n            return self::exportRegistry($value, $indent, $subIndent);\n        }\n\n        if ($value instanceof Hydrator) {\n            return self::exportHydrator($value, $indent, $subIndent);\n        }\n\n        throw new \\UnexpectedValueException(sprintf('Cannot export value of type \"%s\".', get_debug_type($value)));\n    }\n\n    private static function exportRegistry(Registry $value, string $indent, string $subIndent): string\n    {\n        $code = '';\n        $serializables = [];\n        $seen = [];\n        $prototypesAccess = 0;\n        $factoriesAccess = 0;\n        $r = '\\\\'.Registry::class;\n        $j = -1;\n\n        foreach ($value->classes as $k => $class) {\n            if (':' === ($class[1] ?? null)) {\n                $serializables[$k] = $class;\n                continue;\n            }\n            if (!Registry::$instantiableWithoutConstructor[$class]) {\n                if (is_subclass_of($class, 'Serializable') && !method_exists($class, '__unserialize')) {\n                    $serializables[$k] = 'C:'.\\strlen($class).':\"'.$class.'\":0:{}';\n                } else {\n                    $serializables[$k] = 'O:'.\\strlen($class).':\"'.$class.'\":0:{}';\n                }\n                if (is_subclass_of($class, 'Throwable')) {\n                    $eol = is_subclass_of($class, 'Error') ? \"\\0Error\\0\" : \"\\0Exception\\0\";\n                    $serializables[$k] = substr_replace($serializables[$k], '1:{s:'.(5 + \\strlen($eol)).':\"'.$eol.'trace\";a:0:{}}', -4);\n                }\n                continue;\n            }\n            $code .= $subIndent.(1 !== $k - $j ? $k.' => ' : '');\n            $j = $k;\n            $eol = \",\\n\";\n            $c = '['.self::export($class).']';\n\n            if ($seen[$class] ?? false) {\n                if (Registry::$cloneable[$class]) {\n                    ++$prototypesAccess;\n                    $code .= 'clone $p'.$c;\n                } else {\n                    ++$factoriesAccess;\n                    $code .= '$f'.$c.'()';\n                }\n            } else {\n                $seen[$class] = true;\n                if (Registry::$cloneable[$class]) {\n                    $code .= 'clone ('.($prototypesAccess++ ? '$p' : '($p = &'.$r.'::$prototypes)').$c.' ?? '.$r.'::p';\n                } else {\n                    $code .= '('.($factoriesAccess++ ? '$f' : '($f = &'.$r.'::$factories)').$c.' ?? '.$r.'::f';\n                    $eol = '()'.$eol;\n                }\n                $code .= '('.substr($c, 1, -1).'))';\n            }\n            $code .= $eol;\n        }\n\n        if (1 === $prototypesAccess) {\n            $code = str_replace('($p = &'.$r.'::$prototypes)', $r.'::$prototypes', $code);\n        }\n        if (1 === $factoriesAccess) {\n            $code = str_replace('($f = &'.$r.'::$factories)', $r.'::$factories', $code);\n        }\n        if ('' !== $code) {\n            $code = \"\\n\".$code.$indent;\n        }\n\n        if ($serializables) {\n            $code = $r.'::unserialize(['.$code.'], '.self::export($serializables, $indent).')';\n        } else {\n            $code = '['.$code.']';\n        }\n\n        return '$o = '.$code;\n    }\n\n    private static function exportHydrator(Hydrator $value, string $indent, string $subIndent): string\n    {\n        $code = '';\n        foreach ($value->properties as $class => $properties) {\n            $code .= $subIndent.'    '.self::export($class).' => '.self::export($properties, $subIndent.'    ').\",\\n\";\n        }\n\n        $code = [\n            self::export($value->registry, $subIndent),\n            self::export($value->values, $subIndent),\n            '' !== $code ? \"[\\n\".$code.$subIndent.']' : '[]',\n            self::export($value->value, $subIndent),\n            self::export($value->wakeups, $subIndent),\n        ];\n\n        return '\\\\'.$value::class.\"::hydrate(\\n\".$subIndent.implode(\",\\n\".$subIndent, $code).\"\\n\".$indent.')';\n    }\n\n    /**\n     * @param \\ArrayIterator|\\ArrayObject $value\n     * @param \\ArrayIterator|\\ArrayObject $proto\n     */\n    private static function getArrayObjectProperties($value, $proto): array\n    {\n        $reflector = $value instanceof \\ArrayIterator ? 'ArrayIterator' : 'ArrayObject';\n        $reflector = Registry::$reflectors[$reflector] ??= Registry::getClassReflector($reflector);\n\n        $properties = [\n            $arrayValue = (array) $value,\n            $reflector->getMethod('getFlags')->invoke($value),\n            $value instanceof \\ArrayObject ? $reflector->getMethod('getIteratorClass')->invoke($value) : 'ArrayIterator',\n        ];\n\n        $reflector = $reflector->getMethod('setFlags');\n        $reflector->invoke($proto, \\ArrayObject::STD_PROP_LIST);\n\n        if ($properties[1] & \\ArrayObject::STD_PROP_LIST) {\n            $reflector->invoke($value, 0);\n            $properties[0] = (array) $value;\n        } else {\n            $reflector->invoke($value, \\ArrayObject::STD_PROP_LIST);\n            $arrayValue = (array) $value;\n        }\n        $reflector->invoke($value, $properties[1]);\n\n        if ([[], 0, 'ArrayIterator'] === $properties) {\n            $properties = [];\n        } else {\n            if ('ArrayIterator' === $properties[2]) {\n                unset($properties[2]);\n            }\n            $properties = [$reflector->class => [\"\\0\" => $properties]];\n        }\n\n        return [$arrayValue, $properties];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Internal/Hydrator.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Internal;\n\nuse Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nclass Hydrator\n{\n    public static array $hydrators = [];\n    public static array $simpleHydrators = [];\n    public static array $propertyScopes = [];\n\n    public function __construct(\n        public readonly Registry $registry,\n        public readonly ?Values $values,\n        public readonly array $properties,\n        public readonly mixed $value,\n        public readonly array $wakeups,\n    ) {\n    }\n\n    public static function hydrate($objects, $values, $properties, $value, $wakeups)\n    {\n        foreach ($properties as $class => $vars) {\n            (self::$hydrators[$class] ??= self::getHydrator($class))($vars, $objects);\n        }\n        foreach ($wakeups as $k => $v) {\n            if (\\is_array($v)) {\n                $objects[-$k]->__unserialize($v);\n            } else {\n                $objects[$v]->__wakeup();\n            }\n        }\n\n        return $value;\n    }\n\n    public static function getHydrator($class)\n    {\n        $baseHydrator = self::$hydrators['stdClass'] ??= static function ($properties, $objects) {\n            foreach ($properties as $name => $values) {\n                foreach ($values as $i => $v) {\n                    $objects[$i]->$name = $v;\n                }\n            }\n        };\n\n        switch ($class) {\n            case 'stdClass':\n                return $baseHydrator;\n\n            case 'ErrorException':\n                return $baseHydrator->bindTo(null, new class() extends \\ErrorException {\n                });\n\n            case 'TypeError':\n                return $baseHydrator->bindTo(null, new class() extends \\Error {\n                });\n\n            case 'SplObjectStorage':\n                return static function ($properties, $objects) {\n                    foreach ($properties as $name => $values) {\n                        if (\"\\0\" === $name) {\n                            foreach ($values as $i => $v) {\n                                for ($j = 0; $j < \\count($v); ++$j) {\n                                    $objects[$i]->attach($v[$j], $v[++$j]);\n                                }\n                            }\n                            continue;\n                        }\n                        foreach ($values as $i => $v) {\n                            $objects[$i]->$name = $v;\n                        }\n                    }\n                };\n        }\n\n        if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) {\n            throw new ClassNotFoundException($class);\n        }\n        $classReflector = new \\ReflectionClass($class);\n\n        switch ($class) {\n            case 'ArrayIterator':\n            case 'ArrayObject':\n                $constructor = $classReflector->getConstructor()->invokeArgs(...);\n\n                return static function ($properties, $objects) use ($constructor) {\n                    foreach ($properties as $name => $values) {\n                        if (\"\\0\" !== $name) {\n                            foreach ($values as $i => $v) {\n                                $objects[$i]->$name = $v;\n                            }\n                        }\n                    }\n                    foreach ($properties[\"\\0\"] ?? [] as $i => $v) {\n                        $constructor($objects[$i], $v);\n                    }\n                };\n        }\n\n        if (!$classReflector->isInternal()) {\n            return $baseHydrator->bindTo(null, $class);\n        }\n\n        if ($classReflector->name !== $class) {\n            return self::$hydrators[$classReflector->name] ??= self::getHydrator($classReflector->name);\n        }\n\n        $propertySetters = [];\n        foreach ($classReflector->getProperties() as $propertyReflector) {\n            if (!$propertyReflector->isStatic()) {\n                $propertySetters[$propertyReflector->name] = $propertyReflector->setValue(...);\n            }\n        }\n\n        if (!$propertySetters) {\n            return $baseHydrator;\n        }\n\n        return static function ($properties, $objects) use ($propertySetters) {\n            foreach ($properties as $name => $values) {\n                if ($setValue = $propertySetters[$name] ?? null) {\n                    foreach ($values as $i => $v) {\n                        $setValue($objects[$i], $v);\n                    }\n                    continue;\n                }\n                foreach ($values as $i => $v) {\n                    $objects[$i]->$name = $v;\n                }\n            }\n        };\n    }\n\n    public static function getSimpleHydrator($class)\n    {\n        $baseHydrator = self::$simpleHydrators['stdClass'] ??= (function ($properties, $object) {\n            $readonly = (array) $this;\n\n            foreach ($properties as $name => &$value) {\n                $object->$name = $value;\n\n                if (!($readonly[$name] ?? false)) {\n                    $object->$name = &$value;\n                }\n            }\n        })->bindTo(new \\stdClass());\n\n        switch ($class) {\n            case 'stdClass':\n                return $baseHydrator;\n\n            case 'ErrorException':\n                return $baseHydrator->bindTo(new \\stdClass(), new class() extends \\ErrorException {\n                });\n\n            case 'TypeError':\n                return $baseHydrator->bindTo(new \\stdClass(), new class() extends \\Error {\n                });\n\n            case 'SplObjectStorage':\n                return static function ($properties, $object) {\n                    foreach ($properties as $name => &$value) {\n                        if (\"\\0\" !== $name) {\n                            $object->$name = $value;\n                            $object->$name = &$value;\n                            continue;\n                        }\n                        for ($i = 0; $i < \\count($value); ++$i) {\n                            $object->attach($value[$i], $value[++$i]);\n                        }\n                    }\n                };\n        }\n\n        if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) {\n            throw new ClassNotFoundException($class);\n        }\n        $classReflector = new \\ReflectionClass($class);\n\n        switch ($class) {\n            case 'ArrayIterator':\n            case 'ArrayObject':\n                $constructor = $classReflector->getConstructor()->invokeArgs(...);\n\n                return static function ($properties, $object) use ($constructor) {\n                    foreach ($properties as $name => &$value) {\n                        if (\"\\0\" === $name) {\n                            $constructor($object, $value);\n                        } else {\n                            $object->$name = $value;\n                            $object->$name = &$value;\n                        }\n                    }\n                };\n        }\n\n        if (!$classReflector->isInternal()) {\n            $readonly = new \\stdClass();\n            foreach ($classReflector->getProperties(\\ReflectionProperty::IS_READONLY) as $propertyReflector) {\n                if ($class === $propertyReflector->class) {\n                    $readonly->{$propertyReflector->name} = true;\n                }\n            }\n\n            return $baseHydrator->bindTo($readonly, $class);\n        }\n\n        if ($classReflector->name !== $class) {\n            return self::$simpleHydrators[$classReflector->name] ??= self::getSimpleHydrator($classReflector->name);\n        }\n\n        $propertySetters = [];\n        foreach ($classReflector->getProperties() as $propertyReflector) {\n            if (!$propertyReflector->isStatic()) {\n                $propertySetters[$propertyReflector->name] = $propertyReflector->setValue(...);\n            }\n        }\n\n        if (!$propertySetters) {\n            return $baseHydrator;\n        }\n\n        return static function ($properties, $object) use ($propertySetters) {\n            foreach ($properties as $name => &$value) {\n                if ($setValue = $propertySetters[$name] ?? null) {\n                    $setValue($object, $value);\n                } else {\n                    $object->$name = $value;\n                    $object->$name = &$value;\n                }\n            }\n        };\n    }\n\n    public static function getPropertyScopes($class): array\n    {\n        $propertyScopes = [];\n        $r = new \\ReflectionClass($class);\n\n        foreach ($r->getProperties() as $property) {\n            $flags = $property->getModifiers();\n\n            if (\\ReflectionProperty::IS_STATIC & $flags) {\n                continue;\n            }\n            $name = $property->name;\n\n            if (\\ReflectionProperty::IS_PRIVATE & $flags) {\n                $readonlyScope = null;\n                if ($flags & \\ReflectionProperty::IS_READONLY) {\n                    $readonlyScope = $class;\n                }\n                $propertyScopes[\"\\0$class\\0$name\"] = $propertyScopes[$name] = [$class, $name, $readonlyScope, $property];\n\n                continue;\n            }\n            $readonlyScope = null;\n            if ($flags & \\ReflectionProperty::IS_READONLY) {\n                $readonlyScope = $property->class;\n            }\n            $propertyScopes[$name] = [$class, $name, $readonlyScope, $property];\n\n            if (\\ReflectionProperty::IS_PROTECTED & $flags) {\n                $propertyScopes[\"\\0*\\0$name\"] = $propertyScopes[$name];\n            }\n        }\n\n        while ($r = $r->getParentClass()) {\n            $class = $r->name;\n\n            foreach ($r->getProperties(\\ReflectionProperty::IS_PRIVATE) as $property) {\n                if (!$property->isStatic()) {\n                    $name = $property->name;\n                    $readonlyScope = $property->isReadOnly() ? $class : null;\n                    $propertyScopes[\"\\0$class\\0$name\"] = [$class, $name, $readonlyScope, $property];\n                    $propertyScopes[$name] ??= [$class, $name, $readonlyScope, $property];\n                }\n            }\n        }\n\n        return $propertyScopes;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Internal/LazyObjectRegistry.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Internal;\n\n/**\n * Stores the state of lazy objects and caches related reflection information.\n *\n * As a micro-optimization, this class uses no type declarations.\n *\n * @internal\n */\nclass LazyObjectRegistry\n{\n    /**\n     * @var array<class-string, \\ReflectionClass>\n     */\n    public static array $classReflectors = [];\n\n    /**\n     * @var array<class-string, array<string, mixed>>\n     */\n    public static array $defaultProperties = [];\n\n    /**\n     * @var array<class-string, list<\\Closure>>\n     */\n    public static array $classResetters = [];\n\n    /**\n     * @var array<class-string, array{get: \\Closure, set: \\Closure, isset: \\Closure, unset: \\Closure}>\n     */\n    public static array $classAccessors = [];\n\n    /**\n     * @var array<class-string, array{set: bool, isset: bool, unset: bool, clone: bool, serialize: bool, unserialize: bool, sleep: bool, wakeup: bool, destruct: bool, get: int}>\n     */\n    public static array $parentMethods = [];\n\n    public static ?\\Closure $noInitializerState = null;\n\n    public static function getClassResetters($class)\n    {\n        $classProperties = [];\n\n        if ((self::$classReflectors[$class] ??= new \\ReflectionClass($class))->isInternal()) {\n            $propertyScopes = [];\n        } else {\n            $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class);\n        }\n\n        foreach ($propertyScopes as $key => [$scope, $name, $readonlyScope]) {\n            $propertyScopes[$k = \"\\0$scope\\0$name\"] ?? $propertyScopes[$k = \"\\0*\\0$name\"] ?? $k = $name;\n\n            if ($k === $key && \"\\0$class\\0lazyObjectState\" !== $k) {\n                $classProperties[$readonlyScope ?? $scope][$name] = $key;\n            }\n        }\n\n        $resetters = [];\n        foreach ($classProperties as $scope => $properties) {\n            $resetters[] = \\Closure::bind(static function ($instance, $skippedProperties) use ($properties) {\n                foreach ($properties as $name => $key) {\n                    if (!\\array_key_exists($key, $skippedProperties)) {\n                        unset($instance->$name);\n                    }\n                }\n            }, null, $scope);\n        }\n\n        $resetters[] = static function ($instance, $skippedProperties) {\n            foreach ((array) $instance as $name => $value) {\n                if (\"\\0\" !== ($name[0] ?? '') && !\\array_key_exists($name, $skippedProperties)) {\n                    unset($instance->$name);\n                }\n            }\n        };\n\n        return $resetters;\n    }\n\n    public static function getClassAccessors($class)\n    {\n        return \\Closure::bind(static fn () => [\n            'get' => static function &($instance, $name, $readonly) {\n                if (!$readonly) {\n                    return $instance->$name;\n                }\n                $value = $instance->$name;\n\n                return $value;\n            },\n            'set' => static function ($instance, $name, $value) {\n                $instance->$name = $value;\n            },\n            'isset' => static fn ($instance, $name) => isset($instance->$name),\n            'unset' => static function ($instance, $name) {\n                unset($instance->$name);\n            },\n        ], null, \\Closure::class === $class ? null : $class)();\n    }\n\n    public static function getParentMethods($class)\n    {\n        $parent = get_parent_class($class);\n        $methods = [];\n\n        foreach (['set', 'isset', 'unset', 'clone', 'serialize', 'unserialize', 'sleep', 'wakeup', 'destruct', 'get'] as $method) {\n            if (!$parent || !method_exists($parent, '__'.$method)) {\n                $methods[$method] = false;\n            } else {\n                $m = new \\ReflectionMethod($parent, '__'.$method);\n                $methods[$method] = !$m->isAbstract() && !$m->isPrivate();\n            }\n        }\n\n        $methods['get'] = $methods['get'] ? ($m->returnsReference() ? 2 : 1) : 0;\n\n        return $methods;\n    }\n\n    public static function getScope($propertyScopes, $class, $property, $readonlyScope = null)\n    {\n        if (null === $readonlyScope && !isset($propertyScopes[$k = \"\\0$class\\0$property\"]) && !isset($propertyScopes[$k = \"\\0*\\0$property\"])) {\n            return null;\n        }\n        $frame = debug_backtrace(\\DEBUG_BACKTRACE_PROVIDE_OBJECT | \\DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2];\n\n        if (\\ReflectionProperty::class === $scope = $frame['class'] ?? \\Closure::class) {\n            $scope = $frame['object']->class;\n        }\n        if (null === $readonlyScope && '*' === $k[1] && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes[\"\\0$scope\\0$property\"])))) {\n            return null;\n        }\n\n        return $scope;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Internal/LazyObjectState.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Internal;\n\nuse Symfony\\Component\\VarExporter\\Hydrator as PublicHydrator;\n\n/**\n * Keeps the state of lazy objects.\n *\n * As a micro-optimization, this class uses no type declarations.\n *\n * @internal\n */\nclass LazyObjectState\n{\n    public const STATUS_UNINITIALIZED_FULL = 1;\n    public const STATUS_UNINITIALIZED_PARTIAL = 2;\n    public const STATUS_INITIALIZED_FULL = 3;\n    public const STATUS_INITIALIZED_PARTIAL = 4;\n\n    /**\n     * @var array<string, true>\n     */\n    public readonly array $skippedProperties;\n\n    /**\n     * @var self::STATUS_*\n     */\n    public int $status = 0;\n\n    public object $realInstance;\n\n    public function __construct(public readonly \\Closure $initializer, $skippedProperties = [])\n    {\n        $this->skippedProperties = $skippedProperties;\n        $this->status = self::STATUS_UNINITIALIZED_FULL;\n    }\n\n    public function initialize($instance, $propertyName, $propertyScope)\n    {\n        if (self::STATUS_UNINITIALIZED_FULL !== $this->status) {\n            return $this->status;\n        }\n\n        $this->status = self::STATUS_INITIALIZED_PARTIAL;\n\n        try {\n            if ($defaultProperties = array_diff_key(LazyObjectRegistry::$defaultProperties[$instance::class], $this->skippedProperties)) {\n                PublicHydrator::hydrate($instance, $defaultProperties);\n            }\n\n            ($this->initializer)($instance);\n        } catch (\\Throwable $e) {\n            $this->status = self::STATUS_UNINITIALIZED_FULL;\n            $this->reset($instance);\n\n            throw $e;\n        }\n\n        return $this->status = self::STATUS_INITIALIZED_FULL;\n    }\n\n    public function reset($instance): void\n    {\n        $class = $instance::class;\n        $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class);\n        $skippedProperties = $this->skippedProperties;\n        $properties = (array) $instance;\n\n        foreach ($propertyScopes as $key => [$scope, $name, $readonlyScope]) {\n            $propertyScopes[$k = \"\\0$scope\\0$name\"] ?? $propertyScopes[$k = \"\\0*\\0$name\"] ?? $k = $name;\n\n            if ($k === $key && (null !== $readonlyScope || !\\array_key_exists($k, $properties))) {\n                $skippedProperties[$k] = true;\n            }\n        }\n\n        foreach (LazyObjectRegistry::$classResetters[$class] as $reset) {\n            $reset($instance, $skippedProperties);\n        }\n\n        $this->status = self::STATUS_UNINITIALIZED_FULL;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Internal/LazyObjectTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Internal;\n\nuse Symfony\\Component\\Serializer\\Attribute\\Ignore;\n\nif (\\PHP_VERSION_ID >= 80300) {\n    /**\n     * @internal\n     */\n    trait LazyObjectTrait\n    {\n        #[Ignore]\n        private readonly LazyObjectState $lazyObjectState;\n    }\n} else {\n    /**\n     * @internal\n     */\n    trait LazyObjectTrait\n    {\n        #[Ignore]\n        private LazyObjectState $lazyObjectState;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Internal/Reference.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Internal;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nclass Reference\n{\n    public int $count = 0;\n\n    public function __construct(\n        public readonly int $id,\n        public readonly mixed $value = null,\n    ) {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Internal/Registry.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Internal;\n\nuse Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException;\nuse Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nclass Registry\n{\n    public static array $reflectors = [];\n    public static array $prototypes = [];\n    public static array $factories = [];\n    public static array $cloneable = [];\n    public static array $instantiableWithoutConstructor = [];\n\n    public function __construct(\n        public readonly array $classes,\n    ) {\n    }\n\n    public static function unserialize($objects, $serializables)\n    {\n        $unserializeCallback = ini_set('unserialize_callback_func', __CLASS__.'::getClassReflector');\n\n        try {\n            foreach ($serializables as $k => $v) {\n                $objects[$k] = unserialize($v);\n            }\n        } finally {\n            ini_set('unserialize_callback_func', $unserializeCallback);\n        }\n\n        return $objects;\n    }\n\n    public static function p($class)\n    {\n        self::getClassReflector($class, true, true);\n\n        return self::$prototypes[$class];\n    }\n\n    public static function f($class)\n    {\n        $reflector = self::$reflectors[$class] ??= self::getClassReflector($class, true, false);\n\n        return self::$factories[$class] = [$reflector, 'newInstanceWithoutConstructor'](...);\n    }\n\n    public static function getClassReflector($class, $instantiableWithoutConstructor = false, $cloneable = null)\n    {\n        if (!($isClass = class_exists($class)) && !interface_exists($class, false) && !trait_exists($class, false)) {\n            throw new ClassNotFoundException($class);\n        }\n        $reflector = new \\ReflectionClass($class);\n\n        if ($instantiableWithoutConstructor) {\n            $proto = $reflector->newInstanceWithoutConstructor();\n        } elseif (!$isClass || $reflector->isAbstract()) {\n            throw new NotInstantiableTypeException($class);\n        } elseif ($reflector->name !== $class) {\n            $reflector = self::$reflectors[$name = $reflector->name] ??= self::getClassReflector($name, false, $cloneable);\n            self::$cloneable[$class] = self::$cloneable[$name];\n            self::$instantiableWithoutConstructor[$class] = self::$instantiableWithoutConstructor[$name];\n            self::$prototypes[$class] = self::$prototypes[$name];\n\n            return $reflector;\n        } else {\n            try {\n                $proto = $reflector->newInstanceWithoutConstructor();\n                $instantiableWithoutConstructor = true;\n            } catch (\\ReflectionException) {\n                $proto = $reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize') ? 'C:' : 'O:';\n                if ('C:' === $proto && !$reflector->getMethod('unserialize')->isInternal()) {\n                    $proto = null;\n                } else {\n                    try {\n                        $proto = @unserialize($proto.\\strlen($class).':\"'.$class.'\":0:{}');\n                    } catch (\\Exception $e) {\n                        if (__FILE__ !== $e->getFile()) {\n                            throw $e;\n                        }\n                        throw new NotInstantiableTypeException($class, $e);\n                    }\n                    if (false === $proto) {\n                        throw new NotInstantiableTypeException($class);\n                    }\n                }\n            }\n            if (null !== $proto && !$proto instanceof \\Throwable && !$proto instanceof \\Serializable && !method_exists($class, '__sleep') && !method_exists($class, '__serialize')) {\n                try {\n                    serialize($proto);\n                } catch (\\Exception $e) {\n                    throw new NotInstantiableTypeException($class, $e);\n                }\n            }\n        }\n\n        if (null === $cloneable) {\n            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'))) {\n                throw new NotInstantiableTypeException($class);\n            }\n\n            $cloneable = $reflector->isCloneable() && !$reflector->hasMethod('__clone');\n        }\n\n        self::$cloneable[$class] = $cloneable;\n        self::$instantiableWithoutConstructor[$class] = $instantiableWithoutConstructor;\n        self::$prototypes[$class] = $proto;\n\n        if ($proto instanceof \\Throwable) {\n            static $setTrace;\n\n            if (null === $setTrace) {\n                $setTrace = [\n                    new \\ReflectionProperty(\\Error::class, 'trace'),\n                    new \\ReflectionProperty(\\Exception::class, 'trace'),\n                ];\n                $setTrace[0] = $setTrace[0]->setValue(...);\n                $setTrace[1] = $setTrace[1]->setValue(...);\n            }\n\n            $setTrace[$proto instanceof \\Exception]($proto, []);\n        }\n\n        return $reflector;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/Internal/Values.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter\\Internal;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nclass Values\n{\n    public function __construct(\n        public readonly array $values,\n    ) {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/LICENSE",
    "content": "Copyright (c) 2018-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/LazyGhostTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter;\n\nuse Symfony\\Component\\Serializer\\Attribute\\Ignore;\nuse Symfony\\Component\\VarExporter\\Internal\\Hydrator;\nuse Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry as Registry;\nuse Symfony\\Component\\VarExporter\\Internal\\LazyObjectState;\nuse Symfony\\Component\\VarExporter\\Internal\\LazyObjectTrait;\n\ntrait LazyGhostTrait\n{\n    use LazyObjectTrait;\n\n    /**\n     * Creates a lazy-loading ghost instance.\n     *\n     * Skipped properties should be indexed by their array-cast identifier, see\n     * https://php.net/manual/language.types.array#language.types.array.casting\n     *\n     * @param (\\Closure(static):void   $initializer       The closure should initialize the object it receives as argument\n     * @param array<string, true>|null $skippedProperties An array indexed by the properties to skip, a.k.a. the ones\n     *                                                    that the initializer doesn't initialize, if any\n     * @param static|null              $instance\n     */\n    public static function createLazyGhost(\\Closure $initializer, ?array $skippedProperties = null, ?object $instance = null): static\n    {\n        if (self::class !== $class = $instance ? $instance::class : static::class) {\n            $skippedProperties[\"\\0\".self::class.\"\\0lazyObjectState\"] = true;\n        } elseif (\\defined($class.'::LAZY_OBJECT_PROPERTY_SCOPES')) {\n            Hydrator::$propertyScopes[$class] ??= $class::LAZY_OBJECT_PROPERTY_SCOPES;\n        }\n\n        $instance ??= (Registry::$classReflectors[$class] ??= new \\ReflectionClass($class))->newInstanceWithoutConstructor();\n        Registry::$defaultProperties[$class] ??= (array) $instance;\n        $instance->lazyObjectState = new LazyObjectState($initializer, $skippedProperties ??= []);\n\n        foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) {\n            $reset($instance, $skippedProperties);\n        }\n\n        return $instance;\n    }\n\n    /**\n     * Returns whether the object is initialized.\n     *\n     * @param $partial Whether partially initialized objects should be considered as initialized\n     */\n    #[Ignore]\n    public function isLazyObjectInitialized(bool $partial = false): bool\n    {\n        if (!$state = $this->lazyObjectState ?? null) {\n            return true;\n        }\n\n        return LazyObjectState::STATUS_INITIALIZED_FULL === $state->status;\n    }\n\n    /**\n     * Forces initialization of a lazy object and returns it.\n     */\n    public function initializeLazyObject(): static\n    {\n        if (!$state = $this->lazyObjectState ?? null) {\n            return $this;\n        }\n\n        if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) {\n            $state->initialize($this, '', null);\n        }\n\n        return $this;\n    }\n\n    /**\n     * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object\n     */\n    public function resetLazyObject(): bool\n    {\n        if (!$state = $this->lazyObjectState ?? null) {\n            return false;\n        }\n\n        if (LazyObjectState::STATUS_UNINITIALIZED_FULL !== $state->status) {\n            $state->reset($this);\n        }\n\n        return true;\n    }\n\n    public function &__get($name): mixed\n    {\n        $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);\n        $scope = null;\n\n        if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) {\n            $scope = Registry::getScope($propertyScopes, $class, $name);\n            $state = $this->lazyObjectState ?? null;\n\n            if ($state && (null === $scope || isset($propertyScopes[\"\\0$scope\\0$name\"]))) {\n                if (LazyObjectState::STATUS_INITIALIZED_FULL === $state->status) {\n                    // Work around php/php-src#12695\n                    $property = null === $scope ? $name : \"\\0$scope\\0$name\";\n                    $property = $propertyScopes[$property][3]\n                        ?? Hydrator::$propertyScopes[$this::class][$property][3] = new \\ReflectionProperty($scope ?? $class, $name);\n                } else {\n                    $property = null;\n                }\n\n                if ($property?->isInitialized($this) ?? LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $readonlyScope ?? $scope)) {\n                    goto get_in_scope;\n                }\n            }\n        }\n\n        if ($parent = (Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['get']) {\n            if (2 === $parent) {\n                return parent::__get($name);\n            }\n            $value = parent::__get($name);\n\n            return $value;\n        }\n\n        if (null === $class) {\n            $frame = debug_backtrace(\\DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0];\n            trigger_error(sprintf('Undefined property: %s::$%s in %s on line %s', $this::class, $name, $frame['file'], $frame['line']), \\E_USER_NOTICE);\n        }\n\n        get_in_scope:\n\n        try {\n            if (null === $scope) {\n                if (null === $readonlyScope) {\n                    return $this->$name;\n                }\n                $value = $this->$name;\n\n                return $value;\n            }\n            $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);\n\n            return $accessor['get']($this, $name, null !== $readonlyScope);\n        } catch (\\Error $e) {\n            if (\\Error::class !== $e::class || !str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) {\n                throw $e;\n            }\n\n            try {\n                if (null === $scope) {\n                    $this->$name = [];\n\n                    return $this->$name;\n                }\n\n                $accessor['set']($this, $name, []);\n\n                return $accessor['get']($this, $name, null !== $readonlyScope);\n            } catch (\\Error) {\n                if (preg_match('/^Cannot access uninitialized non-nullable property ([^ ]++) by reference$/', $e->getMessage(), $matches)) {\n                    throw new \\Error('Typed property '.$matches[1].' must not be accessed before initialization', $e->getCode(), $e->getPrevious());\n                }\n\n                throw $e;\n            }\n        }\n    }\n\n    public function __set($name, $value): void\n    {\n        $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);\n        $scope = null;\n\n        if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) {\n            $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope);\n            $state = $this->lazyObjectState ?? null;\n\n            if ($state && ($readonlyScope === $scope || isset($propertyScopes[\"\\0$scope\\0$name\"]))\n                && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status\n            ) {\n                if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) {\n                    $state->initialize($this, $name, $readonlyScope ?? $scope);\n                }\n                goto set_in_scope;\n            }\n        }\n\n        if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['set']) {\n            parent::__set($name, $value);\n\n            return;\n        }\n\n        set_in_scope:\n\n        if (null === $scope) {\n            $this->$name = $value;\n        } else {\n            $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);\n            $accessor['set']($this, $name, $value);\n        }\n    }\n\n    public function __isset($name): bool\n    {\n        $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);\n        $scope = null;\n\n        if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) {\n            $scope = Registry::getScope($propertyScopes, $class, $name);\n            $state = $this->lazyObjectState ?? null;\n\n            if ($state && (null === $scope || isset($propertyScopes[\"\\0$scope\\0$name\"]))\n                && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status\n                && LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $readonlyScope ?? $scope)\n            ) {\n                goto isset_in_scope;\n            }\n        }\n\n        if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['isset']) {\n            return parent::__isset($name);\n        }\n\n        isset_in_scope:\n\n        if (null === $scope) {\n            return isset($this->$name);\n        }\n        $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);\n\n        return $accessor['isset']($this, $name);\n    }\n\n    public function __unset($name): void\n    {\n        $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);\n        $scope = null;\n\n        if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) {\n            $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope);\n            $state = $this->lazyObjectState ?? null;\n\n            if ($state && ($readonlyScope === $scope || isset($propertyScopes[\"\\0$scope\\0$name\"]))\n                && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status\n            ) {\n                if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) {\n                    $state->initialize($this, $name, $readonlyScope ?? $scope);\n                }\n                goto unset_in_scope;\n            }\n        }\n\n        if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['unset']) {\n            parent::__unset($name);\n\n            return;\n        }\n\n        unset_in_scope:\n\n        if (null === $scope) {\n            unset($this->$name);\n        } else {\n            $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);\n            $accessor['unset']($this, $name);\n        }\n    }\n\n    public function __clone(): void\n    {\n        if ($state = $this->lazyObjectState ?? null) {\n            $this->lazyObjectState = clone $state;\n        }\n\n        if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['clone']) {\n            parent::__clone();\n        }\n    }\n\n    public function __serialize(): array\n    {\n        $class = self::class;\n\n        if ((Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['serialize']) {\n            $properties = parent::__serialize();\n        } else {\n            $this->initializeLazyObject();\n            $properties = (array) $this;\n        }\n        unset($properties[\"\\0$class\\0lazyObjectState\"]);\n\n        if (Registry::$parentMethods[$class]['serialize'] || !Registry::$parentMethods[$class]['sleep']) {\n            return $properties;\n        }\n\n        $scope = get_parent_class($class);\n        $data = [];\n\n        foreach (parent::__sleep() as $name) {\n            $value = $properties[$k = $name] ?? $properties[$k = \"\\0*\\0$name\"] ?? $properties[$k = \"\\0$class\\0$name\"] ?? $properties[$k = \"\\0$scope\\0$name\"] ?? $k = null;\n\n            if (null === $k) {\n                trigger_error(sprintf('serialize(): \"%s\" returned as member variable from __sleep() but does not exist', $name), \\E_USER_NOTICE);\n            } else {\n                $data[$k] = $value;\n            }\n        }\n\n        return $data;\n    }\n\n    public function __destruct()\n    {\n        $state = $this->lazyObjectState ?? null;\n\n        if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state?->status) {\n            return;\n        }\n\n        if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['destruct']) {\n            parent::__destruct();\n        }\n    }\n\n    #[Ignore]\n    private function setLazyObjectAsInitialized(bool $initialized): void\n    {\n        if ($state = $this->lazyObjectState ?? null) {\n            $state->status = $initialized ? LazyObjectState::STATUS_INITIALIZED_FULL : LazyObjectState::STATUS_UNINITIALIZED_FULL;\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/LazyObjectInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter;\n\ninterface LazyObjectInterface\n{\n    /**\n     * Returns whether the object is initialized.\n     *\n     * @param $partial Whether partially initialized objects should be considered as initialized\n     */\n    public function isLazyObjectInitialized(bool $partial = false): bool;\n\n    /**\n     * Forces initialization of a lazy object and returns it.\n     */\n    public function initializeLazyObject(): object;\n\n    /**\n     * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object\n     */\n    public function resetLazyObject(): bool;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/LazyProxyTrait.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter;\n\nuse Symfony\\Component\\Serializer\\Attribute\\Ignore;\nuse Symfony\\Component\\VarExporter\\Hydrator as PublicHydrator;\nuse Symfony\\Component\\VarExporter\\Internal\\Hydrator;\nuse Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry as Registry;\nuse Symfony\\Component\\VarExporter\\Internal\\LazyObjectState;\nuse Symfony\\Component\\VarExporter\\Internal\\LazyObjectTrait;\n\ntrait LazyProxyTrait\n{\n    use LazyObjectTrait;\n\n    /**\n     * Creates a lazy-loading virtual proxy.\n     *\n     * @param \\Closure():object $initializer Returns the proxied object\n     * @param static|null       $instance\n     */\n    public static function createLazyProxy(\\Closure $initializer, ?object $instance = null): static\n    {\n        if (self::class !== $class = $instance ? $instance::class : static::class) {\n            $skippedProperties = [\"\\0\".self::class.\"\\0lazyObjectState\" => true];\n        } elseif (\\defined($class.'::LAZY_OBJECT_PROPERTY_SCOPES')) {\n            Hydrator::$propertyScopes[$class] ??= $class::LAZY_OBJECT_PROPERTY_SCOPES;\n        }\n\n        $instance ??= (Registry::$classReflectors[$class] ??= new \\ReflectionClass($class))->newInstanceWithoutConstructor();\n        $instance->lazyObjectState = new LazyObjectState($initializer);\n\n        foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) {\n            $reset($instance, $skippedProperties ??= []);\n        }\n\n        return $instance;\n    }\n\n    /**\n     * Returns whether the object is initialized.\n     *\n     * @param $partial Whether partially initialized objects should be considered as initialized\n     */\n    #[Ignore]\n    public function isLazyObjectInitialized(bool $partial = false): bool\n    {\n        return !isset($this->lazyObjectState) || isset($this->lazyObjectState->realInstance) || Registry::$noInitializerState === $this->lazyObjectState->initializer;\n    }\n\n    /**\n     * Forces initialization of a lazy object and returns it.\n     */\n    public function initializeLazyObject(): parent\n    {\n        if ($state = $this->lazyObjectState ?? null) {\n            return $state->realInstance ??= ($state->initializer)();\n        }\n\n        return $this;\n    }\n\n    /**\n     * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object\n     */\n    public function resetLazyObject(): bool\n    {\n        if (!isset($this->lazyObjectState) || Registry::$noInitializerState === $this->lazyObjectState->initializer) {\n            return false;\n        }\n\n        unset($this->lazyObjectState->realInstance);\n\n        return true;\n    }\n\n    public function &__get($name): mixed\n    {\n        $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);\n        $scope = null;\n        $instance = $this;\n\n        if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) {\n            $scope = Registry::getScope($propertyScopes, $class, $name);\n\n            if (null === $scope || isset($propertyScopes[\"\\0$scope\\0$name\"])) {\n                if ($state = $this->lazyObjectState ?? null) {\n                    $instance = $state->realInstance ??= ($state->initializer)();\n                }\n                $parent = 2;\n                goto get_in_scope;\n            }\n        }\n        $parent = (Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['get'];\n\n        if ($state = $this->lazyObjectState ?? null) {\n            $instance = $state->realInstance ??= ($state->initializer)();\n        } else {\n            if (2 === $parent) {\n                return parent::__get($name);\n            }\n            $value = parent::__get($name);\n\n            return $value;\n        }\n\n        if (!$parent && null === $class && !\\array_key_exists($name, (array) $instance)) {\n            $frame = debug_backtrace(\\DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0];\n            trigger_error(sprintf('Undefined property: %s::$%s in %s on line %s', $instance::class, $name, $frame['file'], $frame['line']), \\E_USER_NOTICE);\n        }\n\n        get_in_scope:\n\n        try {\n            if (null === $scope) {\n                if (null === $readonlyScope && 1 !== $parent) {\n                    return $instance->$name;\n                }\n                $value = $instance->$name;\n\n                return $value;\n            }\n            $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);\n\n            return $accessor['get']($instance, $name, null !== $readonlyScope || 1 === $parent);\n        } catch (\\Error $e) {\n            if (\\Error::class !== $e::class || !str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) {\n                throw $e;\n            }\n\n            try {\n                if (null === $scope) {\n                    $instance->$name = [];\n\n                    return $instance->$name;\n                }\n\n                $accessor['set']($instance, $name, []);\n\n                return $accessor['get']($instance, $name, null !== $readonlyScope || 1 === $parent);\n            } catch (\\Error) {\n                throw $e;\n            }\n        }\n    }\n\n    public function __set($name, $value): void\n    {\n        $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);\n        $scope = null;\n        $instance = $this;\n\n        if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) {\n            $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope);\n\n            if ($readonlyScope === $scope || isset($propertyScopes[\"\\0$scope\\0$name\"])) {\n                if ($state = $this->lazyObjectState ?? null) {\n                    $instance = $state->realInstance ??= ($state->initializer)();\n                }\n                goto set_in_scope;\n            }\n        }\n\n        if ($state = $this->lazyObjectState ?? null) {\n            $instance = $state->realInstance ??= ($state->initializer)();\n        } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['set']) {\n            parent::__set($name, $value);\n\n            return;\n        }\n\n        set_in_scope:\n\n        if (null === $scope) {\n            $instance->$name = $value;\n        } else {\n            $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);\n            $accessor['set']($instance, $name, $value);\n        }\n    }\n\n    public function __isset($name): bool\n    {\n        $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);\n        $scope = null;\n        $instance = $this;\n\n        if ([$class] = $propertyScopes[$name] ?? null) {\n            $scope = Registry::getScope($propertyScopes, $class, $name);\n\n            if (null === $scope || isset($propertyScopes[\"\\0$scope\\0$name\"])) {\n                if ($state = $this->lazyObjectState ?? null) {\n                    $instance = $state->realInstance ??= ($state->initializer)();\n                }\n                goto isset_in_scope;\n            }\n        }\n\n        if ($state = $this->lazyObjectState ?? null) {\n            $instance = $state->realInstance ??= ($state->initializer)();\n        } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['isset']) {\n            return parent::__isset($name);\n        }\n\n        isset_in_scope:\n\n        if (null === $scope) {\n            return isset($instance->$name);\n        }\n        $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);\n\n        return $accessor['isset']($instance, $name);\n    }\n\n    public function __unset($name): void\n    {\n        $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);\n        $scope = null;\n        $instance = $this;\n\n        if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) {\n            $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope);\n\n            if ($readonlyScope === $scope || isset($propertyScopes[\"\\0$scope\\0$name\"])) {\n                if ($state = $this->lazyObjectState ?? null) {\n                    $instance = $state->realInstance ??= ($state->initializer)();\n                }\n                goto unset_in_scope;\n            }\n        }\n\n        if ($state = $this->lazyObjectState ?? null) {\n            $instance = $state->realInstance ??= ($state->initializer)();\n        } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['unset']) {\n            parent::__unset($name);\n\n            return;\n        }\n\n        unset_in_scope:\n\n        if (null === $scope) {\n            unset($instance->$name);\n        } else {\n            $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);\n            $accessor['unset']($instance, $name);\n        }\n    }\n\n    public function __clone(): void\n    {\n        if (!isset($this->lazyObjectState)) {\n            if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['clone']) {\n                parent::__clone();\n            }\n\n            return;\n        }\n\n        $this->lazyObjectState = clone $this->lazyObjectState;\n\n        if (isset($this->lazyObjectState->realInstance)) {\n            $this->lazyObjectState->realInstance = clone $this->lazyObjectState->realInstance;\n        }\n    }\n\n    public function __serialize(): array\n    {\n        $class = self::class;\n        $state = $this->lazyObjectState ?? null;\n\n        if (!$state && (Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['serialize']) {\n            $properties = parent::__serialize();\n        } else {\n            $properties = (array) $this;\n\n            if ($state) {\n                unset($properties[\"\\0$class\\0lazyObjectState\"]);\n                $properties[\"\\0$class\\0lazyObjectReal\"] = $state->realInstance ??= ($state->initializer)();\n            }\n        }\n\n        if ($state || Registry::$parentMethods[$class]['serialize'] || !Registry::$parentMethods[$class]['sleep']) {\n            return $properties;\n        }\n\n        $scope = get_parent_class($class);\n        $data = [];\n\n        foreach (parent::__sleep() as $name) {\n            $value = $properties[$k = $name] ?? $properties[$k = \"\\0*\\0$name\"] ?? $properties[$k = \"\\0$class\\0$name\"] ?? $properties[$k = \"\\0$scope\\0$name\"] ?? $k = null;\n\n            if (null === $k) {\n                trigger_error(sprintf('serialize(): \"%s\" returned as member variable from __sleep() but does not exist', $name), \\E_USER_NOTICE);\n            } else {\n                $data[$k] = $value;\n            }\n        }\n\n        return $data;\n    }\n\n    public function __unserialize(array $data): void\n    {\n        $class = self::class;\n\n        if ($instance = $data[\"\\0$class\\0lazyObjectReal\"] ?? null) {\n            unset($data[\"\\0$class\\0lazyObjectReal\"]);\n\n            foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) {\n                $reset($this, $data);\n            }\n\n            if ($data) {\n                PublicHydrator::hydrate($this, $data);\n            }\n            $this->lazyObjectState = new LazyObjectState(Registry::$noInitializerState ??= static fn () => throw new \\LogicException('Lazy proxy has no initializer.'));\n            $this->lazyObjectState->realInstance = $instance;\n        } elseif ((Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['unserialize']) {\n            parent::__unserialize($data);\n        } else {\n            PublicHydrator::hydrate($this, $data);\n\n            if (Registry::$parentMethods[$class]['wakeup']) {\n                parent::__wakeup();\n            }\n        }\n    }\n\n    public function __destruct()\n    {\n        if (isset($this->lazyObjectState)) {\n            return;\n        }\n\n        if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['destruct']) {\n            parent::__destruct();\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/ProxyHelper.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter;\n\nuse Symfony\\Component\\VarExporter\\Exception\\LogicException;\nuse Symfony\\Component\\VarExporter\\Internal\\Hydrator;\nuse Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n */\nfinal class ProxyHelper\n{\n    /**\n     * Helps generate lazy-loading ghost objects.\n     *\n     * @throws LogicException When the class is incompatible with ghost objects\n     */\n    public static function generateLazyGhost(\\ReflectionClass $class): string\n    {\n        if (\\PHP_VERSION_ID < 80300 && $class->isReadOnly()) {\n            throw new LogicException(sprintf('Cannot generate lazy ghost with PHP < 8.3: class \"%s\" is readonly.', $class->name));\n        }\n        if ($class->isFinal()) {\n            throw new LogicException(sprintf('Cannot generate lazy ghost: class \"%s\" is final.', $class->name));\n        }\n        if ($class->isInterface() || $class->isAbstract()) {\n            throw new LogicException(sprintf('Cannot generate lazy ghost: \"%s\" is not a concrete class.', $class->name));\n        }\n        if (\\stdClass::class !== $class->name && $class->isInternal()) {\n            throw new LogicException(sprintf('Cannot generate lazy ghost: class \"%s\" is internal.', $class->name));\n        }\n        if ($class->hasMethod('__get') && 'mixed' !== (self::exportType($class->getMethod('__get')) ?? 'mixed')) {\n            throw new LogicException(sprintf('Cannot generate lazy ghost: return type of method \"%s::__get()\" should be \"mixed\".', $class->name));\n        }\n\n        static $traitMethods;\n        $traitMethods ??= (new \\ReflectionClass(LazyGhostTrait::class))->getMethods();\n\n        foreach ($traitMethods as $method) {\n            if ($class->hasMethod($method->name) && $class->getMethod($method->name)->isFinal()) {\n                throw new LogicException(sprintf('Cannot generate lazy ghost: method \"%s::%s()\" is final.', $class->name, $method->name));\n            }\n        }\n\n        $parent = $class;\n        while ($parent = $parent->getParentClass()) {\n            if (\\stdClass::class !== $parent->name && $parent->isInternal()) {\n                throw new LogicException(sprintf('Cannot generate lazy ghost: class \"%s\" extends \"%s\" which is internal.', $class->name, $parent->name));\n            }\n        }\n        $propertyScopes = self::exportPropertyScopes($class->name);\n\n        return <<<EOPHP\n             extends \\\\{$class->name} implements \\Symfony\\Component\\VarExporter\\LazyObjectInterface\n            {\n                use \\Symfony\\Component\\VarExporter\\LazyGhostTrait;\n\n                private const LAZY_OBJECT_PROPERTY_SCOPES = {$propertyScopes};\n            }\n\n            // Help opcache.preload discover always-needed symbols\n            class_exists(\\Symfony\\Component\\VarExporter\\Internal\\Hydrator::class);\n            class_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry::class);\n            class_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState::class);\n\n            EOPHP;\n    }\n\n    /**\n     * Helps generate lazy-loading virtual proxies.\n     *\n     * @param \\ReflectionClass[] $interfaces\n     *\n     * @throws LogicException When the class is incompatible with virtual proxies\n     */\n    public static function generateLazyProxy(?\\ReflectionClass $class, array $interfaces = []): string\n    {\n        if (!class_exists($class?->name ?? \\stdClass::class, false)) {\n            throw new LogicException(sprintf('Cannot generate lazy proxy: \"%s\" is not a class.', $class->name));\n        }\n        if ($class?->isFinal()) {\n            throw new LogicException(sprintf('Cannot generate lazy proxy: class \"%s\" is final.', $class->name));\n        }\n        if (\\PHP_VERSION_ID < 80300 && $class?->isReadOnly()) {\n            throw new LogicException(sprintf('Cannot generate lazy proxy with PHP < 8.3: class \"%s\" is readonly.', $class->name));\n        }\n\n        $methodReflectors = [$class?->getMethods(\\ReflectionMethod::IS_PUBLIC | \\ReflectionMethod::IS_PROTECTED) ?? []];\n        foreach ($interfaces as $interface) {\n            if (!$interface->isInterface()) {\n                throw new LogicException(sprintf('Cannot generate lazy proxy: \"%s\" is not an interface.', $interface->name));\n            }\n            $methodReflectors[] = $interface->getMethods();\n        }\n        $methodReflectors = array_merge(...$methodReflectors);\n\n        $extendsInternalClass = false;\n        if ($parent = $class) {\n            do {\n                $extendsInternalClass = \\stdClass::class !== $parent->name && $parent->isInternal();\n            } while (!$extendsInternalClass && $parent = $parent->getParentClass());\n        }\n        $methodsHaveToBeProxied = $extendsInternalClass;\n        $methods = [];\n\n        foreach ($methodReflectors as $method) {\n            if ('__get' !== strtolower($method->name) || 'mixed' === ($type = self::exportType($method) ?? 'mixed')) {\n                continue;\n            }\n            $methodsHaveToBeProxied = true;\n            $trait = new \\ReflectionMethod(LazyProxyTrait::class, '__get');\n            $body = \\array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine());\n            $body[0] = str_replace('): mixed', '): '.$type, $body[0]);\n            $methods['__get'] = strtr(implode('', $body).'    }', [\n                'Hydrator' => '\\\\'.Hydrator::class,\n                'Registry' => '\\\\'.LazyObjectRegistry::class,\n            ]);\n            break;\n        }\n\n        foreach ($methodReflectors as $method) {\n            if (($method->isStatic() && !$method->isAbstract()) || isset($methods[$lcName = strtolower($method->name)])) {\n                continue;\n            }\n            if ($method->isFinal()) {\n                if ($extendsInternalClass || $methodsHaveToBeProxied || method_exists(LazyProxyTrait::class, $method->name)) {\n                    throw new LogicException(sprintf('Cannot generate lazy proxy: method \"%s::%s()\" is final.', $class->name, $method->name));\n                }\n                continue;\n            }\n            if (method_exists(LazyProxyTrait::class, $method->name) || ($method->isProtected() && !$method->isAbstract())) {\n                continue;\n            }\n\n            $signature = self::exportSignature($method, true, $args);\n            $parentCall = $method->isAbstract() ? \"throw new \\BadMethodCallException('Cannot forward abstract method \\\"{$method->class}::{$method->name}()\\\".')\" : \"parent::{$method->name}({$args})\";\n\n            if ($method->isStatic()) {\n                $body = \"        $parentCall;\";\n            } elseif (str_ends_with($signature, '): never') || str_ends_with($signature, '): void')) {\n                $body = <<<EOPHP\n                        if (isset(\\$this->lazyObjectState)) {\n                            (\\$this->lazyObjectState->realInstance ??= (\\$this->lazyObjectState->initializer)())->{$method->name}({$args});\n                        } else {\n                            {$parentCall};\n                        }\n                EOPHP;\n            } else {\n                if (!$methodsHaveToBeProxied && !$method->isAbstract()) {\n                    // Skip proxying methods that might return $this\n                    foreach (preg_split('/[()|&]++/', self::exportType($method) ?? 'static') as $type) {\n                        if (\\in_array($type = ltrim($type, '?'), ['static', 'object'], true)) {\n                            continue 2;\n                        }\n                        foreach ([$class, ...$interfaces] as $r) {\n                            if ($r && is_a($r->name, $type, true)) {\n                                continue 3;\n                            }\n                        }\n                    }\n                }\n\n                $body = <<<EOPHP\n                        if (isset(\\$this->lazyObjectState)) {\n                            return (\\$this->lazyObjectState->realInstance ??= (\\$this->lazyObjectState->initializer)())->{$method->name}({$args});\n                        }\n\n                        return {$parentCall};\n                EOPHP;\n            }\n            $methods[$lcName] = \"    {$signature}\\n    {\\n{$body}\\n    }\";\n        }\n\n        $types = $interfaces = array_unique(array_column($interfaces, 'name'));\n        $interfaces[] = LazyObjectInterface::class;\n        $interfaces = implode(', \\\\', $interfaces);\n        $parent = $class ? ' extends \\\\'.$class->name : '';\n        array_unshift($types, $class ? 'parent' : '');\n        $type = ltrim(implode('&\\\\', $types), '&');\n\n        if (!$class) {\n            $trait = new \\ReflectionMethod(LazyProxyTrait::class, 'initializeLazyObject');\n            $body = \\array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine());\n            $body[0] = str_replace('): parent', '): '.$type, $body[0]);\n            $methods = ['initializeLazyObject' => implode('', $body).'    }'] + $methods;\n        }\n        $body = $methods ? \"\\n\".implode(\"\\n\\n\", $methods).\"\\n\" : '';\n        $propertyScopes = $class ? self::exportPropertyScopes($class->name) : '[]';\n\n        return <<<EOPHP\n            {$parent} implements \\\\{$interfaces}\n            {\n                use \\Symfony\\Component\\VarExporter\\LazyProxyTrait;\n\n                private const LAZY_OBJECT_PROPERTY_SCOPES = {$propertyScopes};\n            {$body}}\n\n            // Help opcache.preload discover always-needed symbols\n            class_exists(\\Symfony\\Component\\VarExporter\\Internal\\Hydrator::class);\n            class_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry::class);\n            class_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState::class);\n\n            EOPHP;\n    }\n\n    public static function exportSignature(\\ReflectionFunctionAbstract $function, bool $withParameterTypes = true, ?string &$args = null): string\n    {\n        $byRefIndex = 0;\n        $args = '';\n        $param = null;\n        $parameters = [];\n        foreach ($function->getParameters() as $param) {\n            $parameters[] = ($param->getAttributes(\\SensitiveParameter::class) ? '#[\\SensitiveParameter] ' : '')\n                .($withParameterTypes && $param->hasType() ? self::exportType($param).' ' : '')\n                .($param->isPassedByReference() ? '&' : '')\n                .($param->isVariadic() ? '...' : '').'$'.$param->name\n                .($param->isOptional() && !$param->isVariadic() ? ' = '.self::exportDefault($param) : '');\n            if ($param->isPassedByReference()) {\n                $byRefIndex = 1 + $param->getPosition();\n            }\n            $args .= ($param->isVariadic() ? '...$' : '$').$param->name.', ';\n        }\n\n        if (!$param || !$byRefIndex) {\n            $args = '...\\func_get_args()';\n        } elseif ($param->isVariadic()) {\n            $args = substr($args, 0, -2);\n        } else {\n            $args = explode(', ', $args, 1 + $byRefIndex);\n            $args[$byRefIndex] = sprintf('...\\array_slice(\\func_get_args(), %d)', $byRefIndex);\n            $args = implode(', ', $args);\n        }\n\n        $signature = 'function '.($function->returnsReference() ? '&' : '')\n            .($function->isClosure() ? '' : $function->name).'('.implode(', ', $parameters).')';\n\n        if ($function instanceof \\ReflectionMethod) {\n            $signature = ($function->isPublic() ? 'public ' : ($function->isProtected() ? 'protected ' : 'private '))\n                .($function->isStatic() ? 'static ' : '').$signature;\n        }\n        if ($function->hasReturnType()) {\n            $signature .= ': '.self::exportType($function);\n        }\n\n        static $getPrototype;\n        $getPrototype ??= (new \\ReflectionMethod(\\ReflectionMethod::class, 'getPrototype'))->invoke(...);\n\n        while ($function) {\n            if ($function->hasTentativeReturnType()) {\n                return '#[\\ReturnTypeWillChange] '.$signature;\n            }\n\n            try {\n                $function = $function instanceof \\ReflectionMethod && $function->isAbstract() ? false : $getPrototype($function);\n            } catch (\\ReflectionException) {\n                break;\n            }\n        }\n\n        return $signature;\n    }\n\n    public static function exportType(\\ReflectionFunctionAbstract|\\ReflectionProperty|\\ReflectionParameter $owner, bool $noBuiltin = false, ?\\ReflectionType $type = null): ?string\n    {\n        if (!$type ??= $owner instanceof \\ReflectionFunctionAbstract ? $owner->getReturnType() : $owner->getType()) {\n            return null;\n        }\n        $class = null;\n        $types = [];\n        if ($type instanceof \\ReflectionUnionType) {\n            $reflectionTypes = $type->getTypes();\n            $glue = '|';\n        } elseif ($type instanceof \\ReflectionIntersectionType) {\n            $reflectionTypes = $type->getTypes();\n            $glue = '&';\n        } else {\n            $reflectionTypes = [$type];\n            $glue = null;\n        }\n\n        foreach ($reflectionTypes as $type) {\n            if ($type instanceof \\ReflectionIntersectionType) {\n                if ('' !== $name = '('.self::exportType($owner, $noBuiltin, $type).')') {\n                    $types[] = $name;\n                }\n                continue;\n            }\n            $name = $type->getName();\n\n            if ($noBuiltin && $type->isBuiltin()) {\n                continue;\n            }\n            if (\\in_array($name, ['parent', 'self'], true) && $class ??= $owner->getDeclaringClass()) {\n                $name = 'parent' === $name ? ($class->getParentClass() ?: null)?->name ?? 'parent' : $class->name;\n            }\n\n            $types[] = ($noBuiltin || $type->isBuiltin() || 'static' === $name ? '' : '\\\\').$name;\n        }\n\n        if (!$types) {\n            return '';\n        }\n        if (null === $glue) {\n            return (!$noBuiltin && $type->allowsNull() && 'mixed' !== $name ? '?' : '').$types[0];\n        }\n        sort($types);\n\n        return implode($glue, $types);\n    }\n\n    private static function exportPropertyScopes(string $parent): string\n    {\n        $propertyScopes = Hydrator::$propertyScopes[$parent] ??= Hydrator::getPropertyScopes($parent);\n        uksort($propertyScopes, 'strnatcmp');\n        foreach ($propertyScopes as $k => $v) {\n            unset($propertyScopes[$k][3]);\n        }\n        $propertyScopes = VarExporter::export($propertyScopes);\n        $propertyScopes = str_replace(VarExporter::export($parent), 'parent::class', $propertyScopes);\n        $propertyScopes = preg_replace(\"/(?|(,)\\n( )       |\\n        |,\\n    (\\]))/\", '$1$2', $propertyScopes);\n        $propertyScopes = str_replace(\"\\n\", \"\\n    \", $propertyScopes);\n\n        return $propertyScopes;\n    }\n\n    private static function exportDefault(\\ReflectionParameter $param): string\n    {\n        $default = rtrim(substr(explode('$'.$param->name.' = ', (string) $param, 2)[1] ?? '', 0, -2));\n\n        if (\\in_array($default, ['<default>', 'NULL'], true)) {\n            return 'null';\n        }\n        if (str_ends_with($default, \"...'\") && preg_match(\"/^'(?:[^'\\\\\\\\]*+(?:\\\\\\\\.)*+)*+'$/\", $default)) {\n            return VarExporter::export($param->getDefaultValue());\n        }\n\n        $regexp = \"/(\\\"(?:[^\\\"\\\\\\\\]*+(?:\\\\\\\\.)*+)*+\\\"|'(?:[^'\\\\\\\\]*+(?:\\\\\\\\.)*+)*+')/\";\n        $parts = preg_split($regexp, $default, -1, \\PREG_SPLIT_DELIM_CAPTURE | \\PREG_SPLIT_NO_EMPTY);\n\n        $regexp = '/([\\[\\( ]|^)([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*+(?:\\\\\\\\[a-zA-Z0-9_\\x7f-\\xff]++)*+)(?!: )/';\n        $callback = (false !== strpbrk($default, \"\\\\:('\") && $class = $param->getDeclaringClass())\n            ? fn ($m) => $m[1].match ($m[2]) {\n                'new', 'false', 'true', 'null' => $m[2],\n                'NULL' => 'null',\n                'self' => '\\\\'.$class->name,\n                'namespace\\\\parent',\n                'parent' => ($parent = $class->getParentClass()) ? '\\\\'.$parent->name : 'parent',\n                default => '\\\\'.$m[2],\n            }\n            : fn ($m) => $m[1].match ($m[2]) {\n                'new', 'false', 'true', 'null', 'self', 'parent' => $m[2],\n                'NULL' => 'null',\n                default => '\\\\'.$m[2],\n            };\n\n        return implode('', array_map(fn ($part) => match ($part[0]) {\n            '\"' => $part, // for internal classes only\n            \"'\" => false !== strpbrk($part, \"\\\\\\0\\r\\n\") ? '\"'.substr(str_replace(['$', \"\\0\", \"\\r\", \"\\n\"], ['\\$', '\\0', '\\r', '\\n'], $part), 1, -1).'\"' : $part,\n            default => preg_replace_callback($regexp, $callback, $part),\n        }, $parts));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/README.md",
    "content": "VarExporter Component\n=====================\n\nThe VarExporter component provides various tools to deal with the internal state\nof objects:\n\n- `VarExporter::export()` allows exporting any serializable PHP data structure to\n  plain PHP code. While doing so, it preserves all the semantics associated with\n  the serialization mechanism of PHP (`__wakeup`, `__sleep`, `Serializable`,\n  `__serialize`, `__unserialize`);\n- `Instantiator::instantiate()` creates an object and sets its properties without\n  calling its constructor nor any other methods;\n- `Hydrator::hydrate()` can set the properties of an existing object;\n- `Lazy*Trait` can make a class behave as a lazy-loading ghost or virtual proxy.\n\nVarExporter::export()\n---------------------\n\nThe reason to use `VarExporter::export()` *vs* `serialize()` or\n[igbinary](https://github.com/igbinary/igbinary) is performance: thanks to\nOPcache, the resulting code is significantly faster and more memory efficient\nthan using `unserialize()` or `igbinary_unserialize()`.\n\nUnlike `var_export()`, this works on any serializable PHP value.\n\nIt also provides a few improvements over `var_export()`/`serialize()`:\n\n * the output is PSR-2 compatible;\n * the output can be re-indented without messing up with `\\r` or `\\n` in the data;\n * missing classes throw a `ClassNotFoundException` instead of being unserialized\n   to `PHP_Incomplete_Class` objects;\n * references involving `SplObjectStorage`, `ArrayObject` or `ArrayIterator`\n   instances are preserved;\n * `Reflection*`, `IteratorIterator` and `RecursiveIteratorIterator` classes\n   throw an exception when being serialized (their unserialized version is broken\n   anyway, see https://bugs.php.net/76737).\n\nInstantiator and Hydrator\n-------------------------\n\n`Instantiator::instantiate($class)` creates an object of the given class without\ncalling its constructor nor any other methods.\n\n`Hydrator::hydrate()` sets the properties of an existing object, including\nprivate and protected ones. For example:\n\n```php\n// Sets the public or protected $object->propertyName property\nHydrator::hydrate($object, ['propertyName' => $propertyValue]);\n\n// Sets a private property defined on its parent Bar class:\nHydrator::hydrate($object, [\"\\0Bar\\0privateBarProperty\" => $propertyValue]);\n\n// Alternative way to set the private $object->privateBarProperty property\nHydrator::hydrate($object, [], [\n    Bar::class => ['privateBarProperty' => $propertyValue],\n]);\n```\n\n`Lazy*Trait`\n------------\n\nThe component provides two lazy-loading patterns: ghost objects and virtual\nproxies (see https://martinfowler.com/eaaCatalog/lazyLoad.html for reference).\n\nGhost objects work only with concrete and non-internal classes. In the generic\ncase, they are not compatible with using factories in their initializer.\n\nVirtual proxies work with concrete, abstract or internal classes. They provide an\nAPI that looks like the actual objects and forward calls to them. They can cause\nidentity problems because proxies might not be seen as equivalents to the actual\nobjects they proxy.\n\nBecause of this identity problem, ghost objects should be preferred when\npossible. Exceptions thrown by the `ProxyHelper` class can help decide when it\ncan be used or not.\n\nGhost objects and virtual proxies both provide implementations for the\n`LazyObjectInterface` which allows resetting them to their initial state or to\nforcibly initialize them when needed. Note that resetting a ghost object skips\nits read-only properties. You should use a virtual proxy to reset read-only\nproperties.\n\n### `LazyGhostTrait`\n\nBy using `LazyGhostTrait` either directly in your classes or by using\n`ProxyHelper::generateLazyGhost()`, you can make their instances lazy-loadable.\nThis works by creating these instances empty and by computing their state only\nwhen accessing a property.\n\n```php\nclass FooLazyGhost extends Foo\n{\n    use LazyGhostTrait;\n}\n\n$foo = FooLazyGhost::createLazyGhost(initializer: function (Foo $instance): void {\n    // [...] Use whatever heavy logic you need here\n    // to compute the $dependencies of the $instance\n    $instance->__construct(...$dependencies);\n    // [...] Call setters, etc. if needed\n});\n\n// $foo is now a lazy-loading ghost object. The initializer will\n// be called only when and if a *property* is accessed.\n```\n\n### `LazyProxyTrait`\n\nAlternatively, `LazyProxyTrait` can be used to create virtual proxies:\n\n```php\n$proxyCode = ProxyHelper::generateLazyProxy(new ReflectionClass(Foo::class));\n// $proxyCode contains the reference to LazyProxyTrait\n// and should be dumped into a file in production envs\neval('class FooLazyProxy'.$proxyCode);\n\n$foo = FooLazyProxy::createLazyProxy(initializer: function (): Foo {\n    // [...] Use whatever heavy logic you need here\n    // to compute the $dependencies of the $instance\n    $instance = new Foo(...$dependencies);\n    // [...] Call setters, etc. if needed\n\n    return $instance;\n});\n// $foo is now a lazy-loading virtual proxy object. The initializer will\n// be called only when and if a *method* is called.\n```\n\nResources\n---------\n\n * [Documentation](https://symfony.com/doc/current/components/var_exporter.html)\n * [Contributing](https://symfony.com/doc/current/contributing/index.html)\n * [Report issues](https://github.com/symfony/symfony/issues) and\n   [send Pull Requests](https://github.com/symfony/symfony/pulls)\n   in the [main Symfony repository](https://github.com/symfony/symfony)\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/VarExporter.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\VarExporter;\n\nuse Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface;\nuse Symfony\\Component\\VarExporter\\Internal\\Exporter;\nuse Symfony\\Component\\VarExporter\\Internal\\Hydrator;\nuse Symfony\\Component\\VarExporter\\Internal\\Registry;\nuse Symfony\\Component\\VarExporter\\Internal\\Values;\n\n/**\n * Exports serializable PHP values to PHP code.\n *\n * VarExporter allows serializing PHP data structures to plain PHP code (like var_export())\n * while preserving all the semantics associated with serialize() (unlike var_export()).\n *\n * By leveraging OPcache, the generated PHP code is faster than doing the same with unserialize().\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nfinal class VarExporter\n{\n    /**\n     * Exports a serializable PHP value to PHP code.\n     *\n     * @param bool  &$isStaticValue Set to true after execution if the provided value is static, false otherwise\n     * @param array &$foundClasses  Classes found in the value are added to this list as both keys and values\n     *\n     * @throws ExceptionInterface When the provided value cannot be serialized\n     */\n    public static function export(mixed $value, ?bool &$isStaticValue = null, array &$foundClasses = []): string\n    {\n        $isStaticValue = true;\n\n        if (!\\is_object($value) && !(\\is_array($value) && $value) && !\\is_resource($value) || $value instanceof \\UnitEnum) {\n            return Exporter::export($value);\n        }\n\n        $objectsPool = new \\SplObjectStorage();\n        $refsPool = [];\n        $objectsCount = 0;\n\n        try {\n            $value = Exporter::prepare([$value], $objectsPool, $refsPool, $objectsCount, $isStaticValue)[0];\n        } finally {\n            $references = [];\n            foreach ($refsPool as $i => $v) {\n                if ($v[0]->count) {\n                    $references[1 + $i] = $v[2];\n                }\n                $v[0] = $v[1];\n            }\n        }\n\n        if ($isStaticValue) {\n            return Exporter::export($value);\n        }\n\n        $classes = [];\n        $values = [];\n        $states = [];\n        foreach ($objectsPool as $i => $v) {\n            [, $class, $values[], $wakeup] = $objectsPool[$v];\n            $foundClasses[$class] = $classes[] = $class;\n\n            if (0 < $wakeup) {\n                $states[$wakeup] = $i;\n            } elseif (0 > $wakeup) {\n                $states[-$wakeup] = [$i, array_pop($values)];\n                $values[] = [];\n            }\n        }\n        ksort($states);\n\n        $wakeups = [null];\n        foreach ($states as $v) {\n            if (\\is_array($v)) {\n                $wakeups[-$v[0]] = $v[1];\n            } else {\n                $wakeups[] = $v;\n            }\n        }\n\n        if (null === $wakeups[0]) {\n            unset($wakeups[0]);\n        }\n\n        $properties = [];\n        foreach ($values as $i => $vars) {\n            foreach ($vars as $class => $values) {\n                foreach ($values as $name => $v) {\n                    $properties[$class][$name][$i] = $v;\n                }\n            }\n        }\n\n        if ($classes || $references) {\n            $value = new Hydrator(new Registry($classes), $references ? new Values($references) : null, $properties, $value, $wakeups);\n        } else {\n            $isStaticValue = true;\n        }\n\n        return Exporter::export($value);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/symfony/var-exporter/composer.json",
    "content": "{\n    \"name\": \"symfony/var-exporter\",\n    \"type\": \"library\",\n    \"description\": \"Allows exporting any serializable PHP data structure to plain PHP code\",\n    \"keywords\": [\"export\", \"serialize\", \"instantiate\", \"hydrate\", \"construct\", \"clone\", \"lazy-loading\", \"proxy\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.2\"\n    },\n    \"require-dev\": {\n        \"symfony/property-access\": \"^6.4|^7.0\",\n        \"symfony/serializer\": \"^6.4|^7.0\",\n        \"symfony/var-dumper\": \"^6.4|^7.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Component\\\\VarExporter\\\\\": \"\" },\n        \"exclude-from-classmap\": [\n            \"/Tests/\"\n        ]\n    },\n    \"minimum-stability\": \"dev\"\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/CHANGELOG.md",
    "content": "# Change Log\n\n## [Unreleased](https://github.com/overtrue/wechat/tree/HEAD)\n\n[Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0...HEAD)\n\n**Closed issues:**\n\n- 能否增加对symfony4的支持 [\\#1044](https://github.com/overtrue/wechat/issues/1044)\n\n## [4.0.0](https://github.com/overtrue/wechat/tree/4.0.0) (2017-12-11)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.21...4.0.0)\n\n**Closed issues:**\n\n- filecache.php 文件     createPathIfNeeded\\(string $path\\) : bool [\\#1046](https://github.com/overtrue/wechat/issues/1046)\n- 沙箱模式的Notify总是出错：Invalid request payloads. [\\#1045](https://github.com/overtrue/wechat/issues/1045)\n- 你好我是SwooleDistributed框架的作者 [\\#1040](https://github.com/overtrue/wechat/issues/1040)\n\n## [3.3.21](https://github.com/overtrue/wechat/tree/3.3.21) (2017-12-10)\n[Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-beta.4...3.3.21)\n\n**Closed issues:**\n\n- 开启开放平台自动路由后报错 [\\#1042](https://github.com/overtrue/wechat/issues/1042)\n- 关于3.x升级4.x的问题 [\\#1041](https://github.com/overtrue/wechat/issues/1041)\n- 获取不了unionid [\\#1038](https://github.com/overtrue/wechat/issues/1038)\n- authorizer\\_refresh\\_token刷新问题 [\\#1033](https://github.com/overtrue/wechat/issues/1033)\n- lumen+swoole无法获取request信息。 [\\#1032](https://github.com/overtrue/wechat/issues/1032)\n- 上传素材报错， empty post data hint  [\\#1031](https://github.com/overtrue/wechat/issues/1031)\n- 开放平台不支持全网发布接入检测（第三方） [\\#1029](https://github.com/overtrue/wechat/issues/1029)\n- 公众号模板消息不兼容跳转小程序 [\\#1025](https://github.com/overtrue/wechat/issues/1025)\n- swoole下无法使用 [\\#1017](https://github.com/overtrue/wechat/issues/1017)\n- 请教有没有高清素材下载方法？ [\\#997](https://github.com/overtrue/wechat/issues/997)\n- 自动回复多图文素材，错误 [\\#996](https://github.com/overtrue/wechat/issues/996)\n- xml解释失败 [\\#989](https://github.com/overtrue/wechat/issues/989)\n- Curl error 77 [\\#982](https://github.com/overtrue/wechat/issues/982)\n- 3.1.10 H5支付不晓得算不算BUG的BUG [\\#968](https://github.com/overtrue/wechat/issues/968)\n- 请问是否有遇到微信扫码或内部打开外部网站出现请求2次的情况 [\\#963](https://github.com/overtrue/wechat/issues/963)\n- 请问4.0何时正式发布？ [\\#962](https://github.com/overtrue/wechat/issues/962)\n- dev-master 不能用于laravel5.1 [\\#952](https://github.com/overtrue/wechat/issues/952)\n- 请教小程序的模板消息是否支持 [\\#920](https://github.com/overtrue/wechat/issues/920)\n- 模板消息的颜色设置问题 [\\#914](https://github.com/overtrue/wechat/issues/914)\n- 英文文档跳转问题 [\\#854](https://github.com/overtrue/wechat/issues/854)\n- \\[4.0\\] 功能测试 [\\#849](https://github.com/overtrue/wechat/issues/849)\n- \\[4.0\\] 命名变更 [\\#743](https://github.com/overtrue/wechat/issues/743)\n\n**Merged pull requests:**\n\n- Scrutinizer Auto-Fixes [\\#1043](https://github.com/overtrue/wechat/pull/1043) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n- 修复解密小程序转发信息数据\\(wx.getShareInfo\\)失败的问题 [\\#1037](https://github.com/overtrue/wechat/pull/1037) ([yyqqing](https://github.com/yyqqing))\n- 修復微信支付沙盒模式的通知結果本地校驗失敗錯誤。 [\\#1036](https://github.com/overtrue/wechat/pull/1036) ([amyuki](https://github.com/amyuki))\n- 修复 verifyTicket 使用不了自定义缓存的问题 [\\#1034](https://github.com/overtrue/wechat/pull/1034) ([mingyoung](https://github.com/mingyoung))\n- 🚧 Auto discover extensions. [\\#1027](https://github.com/overtrue/wechat/pull/1027) ([mingyoung](https://github.com/mingyoung))\n\n## [4.0.0-beta.4](https://github.com/overtrue/wechat/tree/4.0.0-beta.4) (2017-11-21)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.20...4.0.0-beta.4)\n\n**Closed issues:**\n\n- Order对象的$attributes中不能传入device\\_info参数 [\\#1030](https://github.com/overtrue/wechat/issues/1030)\n- 默认文件缓存的路径是否可以简单修改? [\\#1023](https://github.com/overtrue/wechat/issues/1023)\n- 3.3.17 版本获取 token 的问题 [\\#1022](https://github.com/overtrue/wechat/issues/1022)\n- \\[V3\\] AccessToken.php:243 [\\#1021](https://github.com/overtrue/wechat/issues/1021)\n\n**Merged pull requests:**\n\n- more detailed cache key. [\\#1028](https://github.com/overtrue/wechat/pull/1028) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#1026](https://github.com/overtrue/wechat/pull/1026) ([mingyoung](https://github.com/mingyoung))\n- Specify the request instance. [\\#1024](https://github.com/overtrue/wechat/pull/1024) ([mingyoung](https://github.com/mingyoung))\n\n## [3.3.20](https://github.com/overtrue/wechat/tree/3.3.20) (2017-11-13)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.18...3.3.20)\n\n## [3.3.18](https://github.com/overtrue/wechat/tree/3.3.18) (2017-11-11)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.17...3.3.18)\n\n**Closed issues:**\n\n- 临时二维码接口无法生成以字符串为参数的二维码 [\\#1020](https://github.com/overtrue/wechat/issues/1020)\n- 现金红包出现了500错误，跟进显示http\\_error:true [\\#1016](https://github.com/overtrue/wechat/issues/1016)\n- 4.0 企业微信agent OA的错误 [\\#1015](https://github.com/overtrue/wechat/issues/1015)\n- 求thinkphp框架demo [\\#1010](https://github.com/overtrue/wechat/issues/1010)\n- 沙箱模式获取验签 key 时产生无限循环 , 无法正常获取 [\\#1009](https://github.com/overtrue/wechat/issues/1009)\n- JSSDK里面url导致的invalid signature错误 [\\#1002](https://github.com/overtrue/wechat/issues/1002)\n- 微信支付沙箱模式下，回调验签错误 [\\#998](https://github.com/overtrue/wechat/issues/998)\n- 有微信退款回调接口吗？ [\\#985](https://github.com/overtrue/wechat/issues/985)\n- 希望兼容新出的微信H5支付 [\\#966](https://github.com/overtrue/wechat/issues/966)\n- 小程序生成无限量二维码接口缺少参数 [\\#965](https://github.com/overtrue/wechat/issues/965)\n\n**Merged pull requests:**\n\n- 查询企业付款接口参数调整，加入企业付款到银行卡接口（RSA 参数加密待完成） [\\#1019](https://github.com/overtrue/wechat/pull/1019) ([tianyong90](https://github.com/tianyong90))\n- Token AESKey can be null. [\\#1013](https://github.com/overtrue/wechat/pull/1013) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#1012](https://github.com/overtrue/wechat/pull/1012) ([mingyoung](https://github.com/mingyoung))\n- Add Mini-program tester's binding/unbinding feature [\\#1011](https://github.com/overtrue/wechat/pull/1011) ([caikeal](https://github.com/caikeal))\n- Apply fixes from StyleCI [\\#1008](https://github.com/overtrue/wechat/pull/1008) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#1007](https://github.com/overtrue/wechat/pull/1007) ([overtrue](https://github.com/overtrue))\n- Added open-platform's mini-program code management [\\#1003](https://github.com/overtrue/wechat/pull/1003) ([caikeal](https://github.com/caikeal))\n- Cleanup payment [\\#1001](https://github.com/overtrue/wechat/pull/1001) ([mingyoung](https://github.com/mingyoung))\n- Unify get stream. [\\#995](https://github.com/overtrue/wechat/pull/995) ([mingyoung](https://github.com/mingyoung))\n- Add appCode `page` param. [\\#991](https://github.com/overtrue/wechat/pull/991) ([mingyoung](https://github.com/mingyoung))\n\n## [3.3.17](https://github.com/overtrue/wechat/tree/3.3.17) (2017-10-27)\n[Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-beta.3...3.3.17)\n\n**Closed issues:**\n\n- open platform component\\_verify\\_ticket 错误 [\\#984](https://github.com/overtrue/wechat/issues/984)\n- 请教下载语音后的文件不完整怎么处理？ [\\#980](https://github.com/overtrue/wechat/issues/980)\n- 微信支付 API 调用下单解析缓缓 [\\#977](https://github.com/overtrue/wechat/issues/977)\n- 是否可以加入微信收款（个人转账版）服务接口 [\\#970](https://github.com/overtrue/wechat/issues/970)\n- 微信公众号消息加解密方式‘兼容模式’也需要填写‘aes\\_key’参数，不能为空 [\\#967](https://github.com/overtrue/wechat/issues/967)\n- 第三方平台 接收消息一直报错 但是能回复消息 也会提示错误 [\\#961](https://github.com/overtrue/wechat/issues/961)\n- 中文官网无法访问 [\\#960](https://github.com/overtrue/wechat/issues/960)\n- laravel队列中使用了SDK报Component verify ticket does not exists. [\\#958](https://github.com/overtrue/wechat/issues/958)\n- 接口调用次数每日限额清零方法没有？ [\\#953](https://github.com/overtrue/wechat/issues/953)\n- 获取access\\_toekn失败之后抛出异常的地方，能够与其他地方统一使用下述这个 resolveResponse 返回数据 [\\#951](https://github.com/overtrue/wechat/issues/951)\n- 官网挂了 [\\#950](https://github.com/overtrue/wechat/issues/950)\n- 无法接收到菜单点击事件推送的消息 [\\#949](https://github.com/overtrue/wechat/issues/949)\n- 请教这个sdk是否可用于android 或者ios 登录？ [\\#948](https://github.com/overtrue/wechat/issues/948)\n- 关于access token 后端分布式部署的中控服务器的问题 [\\#947](https://github.com/overtrue/wechat/issues/947)\n- 4.0 不支持laravel 5.2? [\\#946](https://github.com/overtrue/wechat/issues/946)\n- log不能打印出来 [\\#945](https://github.com/overtrue/wechat/issues/945)\n- EasyWeChat.org域名挂了？？ [\\#940](https://github.com/overtrue/wechat/issues/940)\n- 微信静默授权的时候，页面上老是会显示一段很长的英文Redirecting to http://xxxx，很影响用户体验，有没有什么方法可以去掉，保留空白页，或者允许自定义显示内容 [\\#939](https://github.com/overtrue/wechat/issues/939)\n- 微信小程序生成二维码（接口B）微信扫描不出来结果 [\\#938](https://github.com/overtrue/wechat/issues/938)\n- 官网可否支持看老版本的文档？ [\\#937](https://github.com/overtrue/wechat/issues/937)\n- 客服发送消息 收到的中文信息被unicode 编码 [\\#935](https://github.com/overtrue/wechat/issues/935)\n- 有多个商户时，订单通知的 $payment 怎么创建 [\\#934](https://github.com/overtrue/wechat/issues/934)\n- console中使用$app-\\>user-\\>get报错 [\\#932](https://github.com/overtrue/wechat/issues/932)\n- PC端扫描登录的问题 [\\#930](https://github.com/overtrue/wechat/issues/930)\n- 关于小程序支付的疑问 [\\#912](https://github.com/overtrue/wechat/issues/912)\n- 服务商api模式使用可以更加详细吗 [\\#653](https://github.com/overtrue/wechat/issues/653)\n\n**Merged pull requests:**\n\n- 修正 微信公众号要求 所有接口使用 HTTPS 方式访问 [\\#988](https://github.com/overtrue/wechat/pull/988) ([drogjh](https://github.com/drogjh))\n- Apply fixes from StyleCI [\\#987](https://github.com/overtrue/wechat/pull/987) ([mingyoung](https://github.com/mingyoung))\n- 修复微信收款（个人转账版）商户添加、查询含有多余字段导致签名失败的问题 [\\#986](https://github.com/overtrue/wechat/pull/986) ([chenhaizano](https://github.com/chenhaizano))\n- Add merchant client. [\\#983](https://github.com/overtrue/wechat/pull/983) ([mingyoung](https://github.com/mingyoung))\n- Fix PKCS7 unpad issue. [\\#981](https://github.com/overtrue/wechat/pull/981) ([mingyoung](https://github.com/mingyoung))\n- 💯 Add unit tests. [\\#979](https://github.com/overtrue/wechat/pull/979) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#978](https://github.com/overtrue/wechat/pull/978) ([overtrue](https://github.com/overtrue))\n- Add sub-merchant support. [\\#976](https://github.com/overtrue/wechat/pull/976) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#974](https://github.com/overtrue/wechat/pull/974) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#973](https://github.com/overtrue/wechat/pull/973) ([mingyoung](https://github.com/mingyoung))\n- Refactoring payment [\\#972](https://github.com/overtrue/wechat/pull/972) ([mingyoung](https://github.com/mingyoung))\n- Fix request method. [\\#964](https://github.com/overtrue/wechat/pull/964) ([mingyoung](https://github.com/mingyoung))\n- MiniProgram template. [\\#959](https://github.com/overtrue/wechat/pull/959) ([mingyoung](https://github.com/mingyoung))\n- 企业微信 jssdk ticket [\\#954](https://github.com/overtrue/wechat/pull/954) ([mingyoung](https://github.com/mingyoung))\n- Scrutinizer Auto-Fixes [\\#944](https://github.com/overtrue/wechat/pull/944) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n- 简化子商户js config [\\#943](https://github.com/overtrue/wechat/pull/943) ([HanSon](https://github.com/HanSon))\n- Apply fixes from StyleCI [\\#942](https://github.com/overtrue/wechat/pull/942) ([overtrue](https://github.com/overtrue))\n- 支持子商户JS CONFIG生成 [\\#941](https://github.com/overtrue/wechat/pull/941) ([HanSon](https://github.com/HanSon))\n\n## [4.0.0-beta.3](https://github.com/overtrue/wechat/tree/4.0.0-beta.3) (2017-09-23)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.16...4.0.0-beta.3)\n\n**Closed issues:**\n\n- 退款结果通知 [\\#858](https://github.com/overtrue/wechat/issues/858)\n\n**Merged pull requests:**\n\n- Update Application.php [\\#936](https://github.com/overtrue/wechat/pull/936) ([HanSon](https://github.com/HanSon))\n\n## [3.3.16](https://github.com/overtrue/wechat/tree/3.3.16) (2017-09-20)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.15...3.3.16)\n\n**Closed issues:**\n\n- 希望能增加获取回复数据的方法 [\\#929](https://github.com/overtrue/wechat/issues/929)\n- 3.3 版本 数据类型不对导致无法运行 [\\#928](https://github.com/overtrue/wechat/issues/928)\n\n**Merged pull requests:**\n\n- 增加退款回调处理 [\\#931](https://github.com/overtrue/wechat/pull/931) ([leo108](https://github.com/leo108))\n\n## [3.3.15](https://github.com/overtrue/wechat/tree/3.3.15) (2017-09-13)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.14...3.3.15)\n\n**Closed issues:**\n\n- 微信 for windows 发送文件的时候报错 [\\#927](https://github.com/overtrue/wechat/issues/927)\n\n## [3.3.14](https://github.com/overtrue/wechat/tree/3.3.14) (2017-09-13)\n[Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-beta.2...3.3.14)\n\n**Closed issues:**\n\n- 请教授权的时候什么方法拿到用户是否关注了本公众号？ [\\#926](https://github.com/overtrue/wechat/issues/926)\n\n## [4.0.0-beta.2](https://github.com/overtrue/wechat/tree/4.0.0-beta.2) (2017-09-12)\n[Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-beta.1...4.0.0-beta.2)\n\n**Closed issues:**\n\n- readme.md写错了? [\\#923](https://github.com/overtrue/wechat/issues/923)\n- token验证成功，但还是回复暂时不可用，困扰1个星期多了，真心求助！！！有偿都可以！！ [\\#922](https://github.com/overtrue/wechat/issues/922)\n- 条件判断错了，stripos返回的是“返回在字符串 haystack 中 needle 首次出现的数字位置。”，所以不能直接作为条件判断 [\\#915](https://github.com/overtrue/wechat/issues/915)\n- README中的链接是否错误 [\\#913](https://github.com/overtrue/wechat/issues/913)\n- 测试公众号无法接受用户信息 [\\#911](https://github.com/overtrue/wechat/issues/911)\n- ReadMe文件过期 [\\#910](https://github.com/overtrue/wechat/issues/910)\n- 开放平台服务，取消授权会有哪些参数过来？ [\\#909](https://github.com/overtrue/wechat/issues/909)\n- token无法验证 [\\#908](https://github.com/overtrue/wechat/issues/908)\n- laravel 5.4 composer 失败 [\\#907](https://github.com/overtrue/wechat/issues/907)\n- 开放平台：组件ticket无法通过 [\\#904](https://github.com/overtrue/wechat/issues/904)\n- 官方网站一直登陆不了，浙江丽水地区 [\\#903](https://github.com/overtrue/wechat/issues/903)\n- \\[4.0\\] Pimple\\Exception\\UnknownIdentifierException [\\#901](https://github.com/overtrue/wechat/issues/901)\n- 4.0 报错“Your requirements could not be resolved to an installable set of packages.” [\\#898](https://github.com/overtrue/wechat/issues/898)\n\n**Merged pull requests:**\n\n- 修改通过ticket换取二维码图片地址的逻辑 [\\#925](https://github.com/overtrue/wechat/pull/925) ([Gwill](https://github.com/Gwill))\n- make domain more flexible [\\#924](https://github.com/overtrue/wechat/pull/924) ([HanSon](https://github.com/HanSon))\n- add code & domain comment [\\#921](https://github.com/overtrue/wechat/pull/921) ([HanSon](https://github.com/HanSon))\n- Apply fixes from StyleCI [\\#919](https://github.com/overtrue/wechat/pull/919) ([overtrue](https://github.com/overtrue))\n- \\[3.1\\] Custom PreAuthCode Support [\\#918](https://github.com/overtrue/wechat/pull/918) ([freyo](https://github.com/freyo))\n- 修改acess\\_token无效时微信返回错误码的判断 [\\#916](https://github.com/overtrue/wechat/pull/916) ([blackjune](https://github.com/blackjune))\n- \\[4.0\\] Add optional 'request' parameter to notify handler methods [\\#905](https://github.com/overtrue/wechat/pull/905) ([edwardaa](https://github.com/edwardaa))\n- Apply fixes from StyleCI [\\#902](https://github.com/overtrue/wechat/pull/902) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#897](https://github.com/overtrue/wechat/pull/897) ([overtrue](https://github.com/overtrue))\n- 增加OAuth中Guzzle\\Client的配置项的设置 [\\#893](https://github.com/overtrue/wechat/pull/893) ([khsing](https://github.com/khsing))\n- Apply fixes from StyleCI [\\#887](https://github.com/overtrue/wechat/pull/887) ([overtrue](https://github.com/overtrue))\n- Scrutinizer Auto-Fixes [\\#884](https://github.com/overtrue/wechat/pull/884) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n\n## [4.0.0-beta.1](https://github.com/overtrue/wechat/tree/4.0.0-beta.1) (2017-08-31)\n[Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-alpha.2...4.0.0-beta.1)\n\n**Closed issues:**\n\n- http://easywechat.org/ 网站访问不了了? [\\#896](https://github.com/overtrue/wechat/issues/896)\n- 关于缓存，请问为什么key中包含appId \\* 2，有什么讲究吗？ [\\#892](https://github.com/overtrue/wechat/issues/892)\n- 小程序调用解密程序报-41003错误 [\\#891](https://github.com/overtrue/wechat/issues/891)\n- 小程序调用加密数据解密时报错，不存在方法 [\\#890](https://github.com/overtrue/wechat/issues/890)\n- 有关4.0使用文档的问题 [\\#883](https://github.com/overtrue/wechat/issues/883)\n- \\[4.0\\] PHP最低版本能否降到7.0  [\\#880](https://github.com/overtrue/wechat/issues/880)\n\n**Merged pull requests:**\n\n- \\[4.0\\] Pass proper arguments to the Response constructor [\\#895](https://github.com/overtrue/wechat/pull/895) ([edwardaa](https://github.com/edwardaa))\n- Fix baseUrl and json issues. [\\#894](https://github.com/overtrue/wechat/pull/894) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#889](https://github.com/overtrue/wechat/pull/889) ([overtrue](https://github.com/overtrue))\n- Scrutinizer Auto-Fixes [\\#885](https://github.com/overtrue/wechat/pull/885) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n- Apply fixes from StyleCI [\\#882](https://github.com/overtrue/wechat/pull/882) ([overtrue](https://github.com/overtrue))\n- 补充通用卡接口 [\\#881](https://github.com/overtrue/wechat/pull/881) ([XiaoLer](https://github.com/XiaoLer))\n- Apply fixes from StyleCI [\\#879](https://github.com/overtrue/wechat/pull/879) ([overtrue](https://github.com/overtrue))\n- \\[3.1\\] Payment/API 没有使用全局的 cache [\\#878](https://github.com/overtrue/wechat/pull/878) ([edwardaa](https://github.com/edwardaa))\n- Add JSON\\_UNESCAPED\\_UNICODE option. [\\#874](https://github.com/overtrue/wechat/pull/874) ([mingyoung](https://github.com/mingyoung))\n- update \\_\\_set\\_state magic method to static [\\#872](https://github.com/overtrue/wechat/pull/872) ([8090Lambert](https://github.com/8090Lambert))\n\n## [4.0.0-alpha.2](https://github.com/overtrue/wechat/tree/4.0.0-alpha.2) (2017-08-20)\n[Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-alpha.1...4.0.0-alpha.2)\n\n**Closed issues:**\n\n- 你好，怎么用的 [\\#869](https://github.com/overtrue/wechat/issues/869)\n\n**Merged pull requests:**\n\n- Tweak dir [\\#871](https://github.com/overtrue/wechat/pull/871) ([mingyoung](https://github.com/mingyoung))\n- Fix mini-program guard. [\\#870](https://github.com/overtrue/wechat/pull/870) ([mingyoung](https://github.com/mingyoung))\n\n## [4.0.0-alpha.1](https://github.com/overtrue/wechat/tree/4.0.0-alpha.1) (2017-08-14)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.13...4.0.0-alpha.1)\n\n**Closed issues:**\n\n- 对doctrine/cache依赖的版本锁定 [\\#867](https://github.com/overtrue/wechat/issues/867)\n\n## [3.3.13](https://github.com/overtrue/wechat/tree/3.3.13) (2017-08-13)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.12...3.3.13)\n\n**Closed issues:**\n\n- 文档中网页授权实例写的不明确 [\\#850](https://github.com/overtrue/wechat/issues/850)\n- \\[意见\\]作者能否提供getTokenFromServer方法扩展从外部第三方获取access\\_token [\\#837](https://github.com/overtrue/wechat/issues/837)\n- invalid credential, access\\_token is invalid or not latest [\\#808](https://github.com/overtrue/wechat/issues/808)\n- \\[4.0\\] 重构卡券 [\\#806](https://github.com/overtrue/wechat/issues/806)\n- \\[4.0\\] 重构 Broadcasting [\\#805](https://github.com/overtrue/wechat/issues/805)\n- \\[4.0\\] 变更日志 [\\#746](https://github.com/overtrue/wechat/issues/746)\n\n**Merged pull requests:**\n\n- Fixed open-platform authorizer server token. [\\#866](https://github.com/overtrue/wechat/pull/866) ([mingyoung](https://github.com/mingyoung))\n- payment\\ClientTest 优化 [\\#865](https://github.com/overtrue/wechat/pull/865) ([tianyong90](https://github.com/tianyong90))\n- Apply fixes from StyleCI [\\#864](https://github.com/overtrue/wechat/pull/864) ([overtrue](https://github.com/overtrue))\n- 退款通知处理及相关单元测试 [\\#863](https://github.com/overtrue/wechat/pull/863) ([tianyong90](https://github.com/tianyong90))\n- Apply fixes from StyleCI [\\#862](https://github.com/overtrue/wechat/pull/862) ([overtrue](https://github.com/overtrue))\n- Update dependence version. [\\#861](https://github.com/overtrue/wechat/pull/861) ([mingyoung](https://github.com/mingyoung))\n- Add tests. [\\#859](https://github.com/overtrue/wechat/pull/859) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#857](https://github.com/overtrue/wechat/pull/857) ([overtrue](https://github.com/overtrue))\n- Payment 单元测试优化 [\\#856](https://github.com/overtrue/wechat/pull/856) ([tianyong90](https://github.com/tianyong90))\n- Apply fixes from StyleCI [\\#855](https://github.com/overtrue/wechat/pull/855) ([overtrue](https://github.com/overtrue))\n- lists 方法重命名为 list，相关单元测试调整 [\\#853](https://github.com/overtrue/wechat/pull/853) ([tianyong90](https://github.com/tianyong90))\n- Apply fixes from StyleCI [\\#852](https://github.com/overtrue/wechat/pull/852) ([overtrue](https://github.com/overtrue))\n- Payment 单元测试及部分问题修复 [\\#851](https://github.com/overtrue/wechat/pull/851) ([tianyong90](https://github.com/tianyong90))\n- Apply fixes from StyleCI [\\#848](https://github.com/overtrue/wechat/pull/848) ([overtrue](https://github.com/overtrue))\n- 调整 Payment\\BaseClient 注入的 $app 类型 [\\#847](https://github.com/overtrue/wechat/pull/847) ([tianyong90](https://github.com/tianyong90))\n- array\\_merge 方法参数类型转换， type hints [\\#846](https://github.com/overtrue/wechat/pull/846) ([tianyong90](https://github.com/tianyong90))\n- Fix oauth. [\\#845](https://github.com/overtrue/wechat/pull/845) ([mingyoung](https://github.com/mingyoung))\n- Text message. [\\#844](https://github.com/overtrue/wechat/pull/844) ([mingyoung](https://github.com/mingyoung))\n- Rename BaseService -\\> BasicService. [\\#843](https://github.com/overtrue/wechat/pull/843) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#842](https://github.com/overtrue/wechat/pull/842) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#841](https://github.com/overtrue/wechat/pull/841) ([overtrue](https://github.com/overtrue))\n- phpdoc types。 [\\#840](https://github.com/overtrue/wechat/pull/840) ([tianyong90](https://github.com/tianyong90))\n- Apply fixes from StyleCI [\\#839](https://github.com/overtrue/wechat/pull/839) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#836](https://github.com/overtrue/wechat/pull/836) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#835](https://github.com/overtrue/wechat/pull/835) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#833](https://github.com/overtrue/wechat/pull/833) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#831](https://github.com/overtrue/wechat/pull/831) ([overtrue](https://github.com/overtrue))\n\n## [3.3.12](https://github.com/overtrue/wechat/tree/3.3.12) (2017-08-01)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.11...3.3.12)\n\n**Closed issues:**\n\n- 能否整合微信开放平台在给出一套demo [\\#816](https://github.com/overtrue/wechat/issues/816)\n- 请教这个项目的支付部分，尤其是签名和结果回调，是否支持小程序？ [\\#814](https://github.com/overtrue/wechat/issues/814)\n- 微信意图识别接口返回invalid param [\\#804](https://github.com/overtrue/wechat/issues/804)\n- 返回param invalid [\\#803](https://github.com/overtrue/wechat/issues/803)\n\n**Merged pull requests:**\n\n- change comment word [\\#830](https://github.com/overtrue/wechat/pull/830) ([tianyong90](https://github.com/tianyong90))\n- Fix getTicket. [\\#829](https://github.com/overtrue/wechat/pull/829) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#827](https://github.com/overtrue/wechat/pull/827) ([overtrue](https://github.com/overtrue))\n- 修正 HasAttributes Trait 引用错误 [\\#825](https://github.com/overtrue/wechat/pull/825) ([tianyong90](https://github.com/tianyong90))\n- Apply fixes from StyleCI [\\#824](https://github.com/overtrue/wechat/pull/824) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#822](https://github.com/overtrue/wechat/pull/822) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#820](https://github.com/overtrue/wechat/pull/820) ([mingyoung](https://github.com/mingyoung))\n- Add subscribe message. [\\#819](https://github.com/overtrue/wechat/pull/819) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#818](https://github.com/overtrue/wechat/pull/818) ([mingyoung](https://github.com/mingyoung))\n- 微信开放平台帐号管理 [\\#817](https://github.com/overtrue/wechat/pull/817) ([XiaoLer](https://github.com/XiaoLer))\n- add method in comment [\\#813](https://github.com/overtrue/wechat/pull/813) ([HanSon](https://github.com/HanSon))\n- fixed guzzle version [\\#812](https://github.com/overtrue/wechat/pull/812) ([HanSon](https://github.com/HanSon))\n- Apply fixes from StyleCI [\\#811](https://github.com/overtrue/wechat/pull/811) ([mingyoung](https://github.com/mingyoung))\n- Downgrade to php 7.0 [\\#809](https://github.com/overtrue/wechat/pull/809) ([HanSon](https://github.com/HanSon))\n\n## [3.3.11](https://github.com/overtrue/wechat/tree/3.3.11) (2017-07-17)\n[Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-alpha1...3.3.11)\n\n**Closed issues:**\n\n- 请添加 「退款原因」 参数 [\\#802](https://github.com/overtrue/wechat/issues/802)\n\n## [4.0.0-alpha1](https://github.com/overtrue/wechat/tree/4.0.0-alpha1) (2017-07-17)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.10...4.0.0-alpha1)\n\n**Closed issues:**\n\n- Overtrue\\Wechat\\Media not found [\\#801](https://github.com/overtrue/wechat/issues/801)\n- 在微信的接口配置时Token 无效，可任意输入 [\\#800](https://github.com/overtrue/wechat/issues/800)\n\n## [3.3.10](https://github.com/overtrue/wechat/tree/3.3.10) (2017-07-13)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.9...3.3.10)\n\n**Closed issues:**\n\n- 第三方平台refresh\\_token的保存问题 [\\#798](https://github.com/overtrue/wechat/issues/798)\n- 网页授权共享session已晚 [\\#792](https://github.com/overtrue/wechat/issues/792)\n\n**Merged pull requests:**\n\n- 临时二维码也是支持scene\\_str的，这里补充上 [\\#797](https://github.com/overtrue/wechat/pull/797) ([lornewang](https://github.com/lornewang))\n- Apply fixes from StyleCI [\\#795](https://github.com/overtrue/wechat/pull/795) ([overtrue](https://github.com/overtrue))\n- add card message type [\\#794](https://github.com/overtrue/wechat/pull/794) ([IanGely](https://github.com/IanGely))\n- add staff message type wxcard [\\#793](https://github.com/overtrue/wechat/pull/793) ([IanGely](https://github.com/IanGely))\n\n## [3.3.9](https://github.com/overtrue/wechat/tree/3.3.9) (2017-07-07)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.8...3.3.9)\n\n**Closed issues:**\n\n- \\[4.0\\] Http 模块 [\\#678](https://github.com/overtrue/wechat/issues/678)\n- \\[4.0\\] Http 请求类 [\\#582](https://github.com/overtrue/wechat/issues/582)\n\n**Merged pull requests:**\n\n- Apply fixes from StyleCI [\\#791](https://github.com/overtrue/wechat/pull/791) ([overtrue](https://github.com/overtrue))\n- Add get user portrait method. [\\#790](https://github.com/overtrue/wechat/pull/790) ([getive](https://github.com/getive))\n- \\[Feature\\] Move directories [\\#789](https://github.com/overtrue/wechat/pull/789) ([overtrue](https://github.com/overtrue))\n- \\[Feature\\] Move traits to kernel. [\\#788](https://github.com/overtrue/wechat/pull/788) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#787](https://github.com/overtrue/wechat/pull/787) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#786](https://github.com/overtrue/wechat/pull/786) ([overtrue](https://github.com/overtrue))\n\n## [3.3.8](https://github.com/overtrue/wechat/tree/3.3.8) (2017-07-07)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.7...3.3.8)\n\n**Closed issues:**\n\n- $temporary-\\>getStream\\($media\\_id\\) 与 file\\_get\\_contents\\(\\) 有区别？？? [\\#742](https://github.com/overtrue/wechat/issues/742)\n\n## [3.3.7](https://github.com/overtrue/wechat/tree/3.3.7) (2017-07-06)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.6...3.3.7)\n\n**Closed issues:**\n\n- 多添加一个$option [\\#772](https://github.com/overtrue/wechat/issues/772)\n- 消息群发，指定openid群发视频时，微信报错invalid message type hint: \\[JUs0Oa0779ge25\\] [\\#757](https://github.com/overtrue/wechat/issues/757)\n\n## [3.3.6](https://github.com/overtrue/wechat/tree/3.3.6) (2017-07-06)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.5...3.3.6)\n\n**Fixed bugs:**\n\n- 素材管理，如果media\\_id不存在会保存网页返回的错误代码 [\\#592](https://github.com/overtrue/wechat/issues/592)\n\n**Closed issues:**\n\n- https://easywechat.org网站证书刚过期了，知会作者一声 [\\#781](https://github.com/overtrue/wechat/issues/781)\n- access\\_token 是否能不内部主动请求微信 [\\#778](https://github.com/overtrue/wechat/issues/778)\n- 门店创建API \\($poi-\\>create\\) 建议返回 poi\\_id / exception [\\#774](https://github.com/overtrue/wechat/issues/774)\n- 扩展门店小程序错误 [\\#762](https://github.com/overtrue/wechat/issues/762)\n- \\[4.0\\] jssdk 抽出独立模块 [\\#754](https://github.com/overtrue/wechat/issues/754)\n- \\[4.0\\] 消息加密解密模块提取到 Kernel [\\#753](https://github.com/overtrue/wechat/issues/753)\n- 网页能授权但无法获取用户信息，代码跟官方文档一样。 [\\#713](https://github.com/overtrue/wechat/issues/713)\n\n**Merged pull requests:**\n\n- Feature: BaseService. [\\#785](https://github.com/overtrue/wechat/pull/785) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#784](https://github.com/overtrue/wechat/pull/784) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#783](https://github.com/overtrue/wechat/pull/783) ([mingyoung](https://github.com/mingyoung))\n\n## [3.3.5](https://github.com/overtrue/wechat/tree/3.3.5) (2017-07-04)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.4...3.3.5)\n\n**Implemented enhancements:**\n\n- 并发下access\\_token存在脏写隐患 [\\#696](https://github.com/overtrue/wechat/issues/696)\n\n**Merged pull requests:**\n\n- Apply fixes from StyleCI [\\#780](https://github.com/overtrue/wechat/pull/780) ([overtrue](https://github.com/overtrue))\n\n## [3.3.4](https://github.com/overtrue/wechat/tree/3.3.4) (2017-07-04)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.3...3.3.4)\n\n**Closed issues:**\n\n- 网页授权获取用户信息无法打开授权页面 [\\#773](https://github.com/overtrue/wechat/issues/773)\n- Class 'EasyWechat\\Foundation\\Application' not found  [\\#769](https://github.com/overtrue/wechat/issues/769)\n- 获取小程序二维码报错 [\\#766](https://github.com/overtrue/wechat/issues/766)\n- Call to undefined method EasyWeChat\\Server\\Guard::setRequest\\(\\) [\\#765](https://github.com/overtrue/wechat/issues/765)\n- 网页授权问题，提示scopes类型错误 [\\#764](https://github.com/overtrue/wechat/issues/764)\n- 门店小程序扩展错误问题 [\\#763](https://github.com/overtrue/wechat/issues/763)\n- 微信开发者平台，全网发布怎么通过 [\\#761](https://github.com/overtrue/wechat/issues/761)\n- 微信网页授权重复请求报code无效 [\\#714](https://github.com/overtrue/wechat/issues/714)\n\n**Merged pull requests:**\n\n- 新版客服功能-获取聊天记录 [\\#775](https://github.com/overtrue/wechat/pull/775) ([wuwenbao](https://github.com/wuwenbao))\n- Fix mini-program qrcode. [\\#768](https://github.com/overtrue/wechat/pull/768) ([mingyoung](https://github.com/mingyoung))\n- Add code comments [\\#756](https://github.com/overtrue/wechat/pull/756) ([daxiong123](https://github.com/daxiong123))\n\n## [3.3.3](https://github.com/overtrue/wechat/tree/3.3.3) (2017-06-22)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.2...3.3.3)\n\n**Implemented enhancements:**\n\n- \\[4.0\\] Trait HasHttpRequests [\\#671](https://github.com/overtrue/wechat/issues/671)\n- \\[4.0\\] 缓存抽象成 trait: InteractsWithCache [\\#670](https://github.com/overtrue/wechat/issues/670)\n- \\[4.0\\] 返回值类型可配置 [\\#661](https://github.com/overtrue/wechat/issues/661)\n- \\[4.0\\] 报错信息可选 [\\#596](https://github.com/overtrue/wechat/issues/596)\n- \\[4.0\\] 简化并完善开发者配置项 [\\#584](https://github.com/overtrue/wechat/issues/584)\n\n**Fixed bugs:**\n\n- open\\_platform.oauth 过早的获取 access token [\\#701](https://github.com/overtrue/wechat/issues/701)\n\n**Closed issues:**\n\n- 微信网页支付配置生成 [\\#751](https://github.com/overtrue/wechat/issues/751)\n- configForJSSDKPayment [\\#744](https://github.com/overtrue/wechat/issues/744)\n- 发现微信上有管理公众号留言的接口，不知道是不是新出的 [\\#721](https://github.com/overtrue/wechat/issues/721)\n- oauth能获取用户信息，再通过access\\_token与用户openid去获取信息，部分用户的信息为空 [\\#720](https://github.com/overtrue/wechat/issues/720)\n- 接入多个公众号 [\\#718](https://github.com/overtrue/wechat/issues/718)\n- guzzle curl error28 - 去哪设置默认timeout ？ [\\#715](https://github.com/overtrue/wechat/issues/715)\n-  使用$server-\\>getMessage\\(\\);报错 [\\#712](https://github.com/overtrue/wechat/issues/712)\n- 怎样从数据库中调取配置 [\\#711](https://github.com/overtrue/wechat/issues/711)\n- \\[4.0\\] 支持企业微信 [\\#707](https://github.com/overtrue/wechat/issues/707)\n- defaultColor does not work. [\\#703](https://github.com/overtrue/wechat/issues/703)\n- 是否支持H5支付 [\\#694](https://github.com/overtrue/wechat/issues/694)\n- 生成AccessToken时，似乎没有调用自定义缓存的delete方法 [\\#693](https://github.com/overtrue/wechat/issues/693)\n- \\[4.0\\] PSR-6 缓存接口 [\\#692](https://github.com/overtrue/wechat/issues/692)\n- 微信支付沙盒模式支持配置文件配置 [\\#690](https://github.com/overtrue/wechat/issues/690)\n- \\[4.0\\] 优化服务提供器结构 [\\#689](https://github.com/overtrue/wechat/issues/689)\n- 强制项目不要自动获取AccessToken [\\#688](https://github.com/overtrue/wechat/issues/688)\n- 小程序解密$encryptedData数据 [\\#687](https://github.com/overtrue/wechat/issues/687)\n- 微信坑爹timestamp已经解决不需要configForJSSDKPayment改变timestamp中s大小写 [\\#686](https://github.com/overtrue/wechat/issues/686)\n- \\[4.0\\] 所有 API 改名为 Client. [\\#677](https://github.com/overtrue/wechat/issues/677)\n- sandbox\\_signkey 过期 [\\#675](https://github.com/overtrue/wechat/issues/675)\n- 接口配置失败 [\\#672](https://github.com/overtrue/wechat/issues/672)\n- 下载语音文件偶尔报错：ErrorException: is\\_readable\\(\\) expects parameter 1 to be a valid path [\\#667](https://github.com/overtrue/wechat/issues/667)\n- 微信支付沙箱地址混乱 [\\#665](https://github.com/overtrue/wechat/issues/665)\n- 开放平台自动回复出错，提示“该服务号暂时无法提供服务” [\\#654](https://github.com/overtrue/wechat/issues/654)\n- \\[4.0\\]自定义微信API的区域接入点 [\\#636](https://github.com/overtrue/wechat/issues/636)\n- 在命令行使用easywechat如何关闭日志 [\\#601](https://github.com/overtrue/wechat/issues/601)\n- \\[4.0\\] PHP 版本最低要求 7.1 [\\#586](https://github.com/overtrue/wechat/issues/586)\n- \\[4.0\\] 简化微信 API 请求 [\\#583](https://github.com/overtrue/wechat/issues/583)\n- \\[4.0\\] 自定义 endpoint [\\#521](https://github.com/overtrue/wechat/issues/521)\n\n**Merged pull requests:**\n\n- Apply fixes from StyleCI [\\#750](https://github.com/overtrue/wechat/pull/750) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#749](https://github.com/overtrue/wechat/pull/749) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#747](https://github.com/overtrue/wechat/pull/747) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#745](https://github.com/overtrue/wechat/pull/745) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#740](https://github.com/overtrue/wechat/pull/740) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#737](https://github.com/overtrue/wechat/pull/737) ([mingyoung](https://github.com/mingyoung))\n- 分模块静态调用 [\\#734](https://github.com/overtrue/wechat/pull/734) ([mingyoung](https://github.com/mingyoung))\n- Revert \"Apply fixes from StyleCI\" [\\#731](https://github.com/overtrue/wechat/pull/731) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#730](https://github.com/overtrue/wechat/pull/730) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#729](https://github.com/overtrue/wechat/pull/729) ([overtrue](https://github.com/overtrue))\n- Revert \"Apply fixes from StyleCI\" [\\#728](https://github.com/overtrue/wechat/pull/728) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#727](https://github.com/overtrue/wechat/pull/727) ([overtrue](https://github.com/overtrue))\n- 修复Https 请求判断不准 [\\#726](https://github.com/overtrue/wechat/pull/726) ([xutl](https://github.com/xutl))\n- Apply fixes from StyleCI [\\#725](https://github.com/overtrue/wechat/pull/725) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#724](https://github.com/overtrue/wechat/pull/724) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#723](https://github.com/overtrue/wechat/pull/723) ([mingyoung](https://github.com/mingyoung))\n- Correction notes [\\#722](https://github.com/overtrue/wechat/pull/722) ([PersiLiao](https://github.com/PersiLiao))\n- Apply fixes from StyleCI [\\#717](https://github.com/overtrue/wechat/pull/717) ([mingyoung](https://github.com/mingyoung))\n- 新增图文消息留言管理接口 [\\#716](https://github.com/overtrue/wechat/pull/716) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#710](https://github.com/overtrue/wechat/pull/710) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#709](https://github.com/overtrue/wechat/pull/709) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#708](https://github.com/overtrue/wechat/pull/708) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#706](https://github.com/overtrue/wechat/pull/706) ([overtrue](https://github.com/overtrue))\n- 命令行下不打印日志 [\\#705](https://github.com/overtrue/wechat/pull/705) ([mingyoung](https://github.com/mingyoung))\n- add defaultColor [\\#704](https://github.com/overtrue/wechat/pull/704) ([damonto](https://github.com/damonto))\n- Fix [\\#702](https://github.com/overtrue/wechat/pull/702) ([mingyoung](https://github.com/mingyoung))\n- Add api. [\\#700](https://github.com/overtrue/wechat/pull/700) ([mingyoung](https://github.com/mingyoung))\n- Rename method. [\\#699](https://github.com/overtrue/wechat/pull/699) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#698](https://github.com/overtrue/wechat/pull/698) ([mingyoung](https://github.com/mingyoung))\n- 修正素材管理中的返回值文档注释，正确的类型应该是集合，而不是字符串。 [\\#695](https://github.com/overtrue/wechat/pull/695) ([starlight36](https://github.com/starlight36))\n- Payment sandbox config. [\\#691](https://github.com/overtrue/wechat/pull/691) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#684](https://github.com/overtrue/wechat/pull/684) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#683](https://github.com/overtrue/wechat/pull/683) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#682](https://github.com/overtrue/wechat/pull/682) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#681](https://github.com/overtrue/wechat/pull/681) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#680](https://github.com/overtrue/wechat/pull/680) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#679](https://github.com/overtrue/wechat/pull/679) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#676](https://github.com/overtrue/wechat/pull/676) ([mingyoung](https://github.com/mingyoung))\n- checks via composer. [\\#673](https://github.com/overtrue/wechat/pull/673) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#668](https://github.com/overtrue/wechat/pull/668) ([overtrue](https://github.com/overtrue))\n- 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))\n\n## [3.3.2](https://github.com/overtrue/wechat/tree/3.3.2) (2017-04-27)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.1...3.3.2)\n\n**Implemented enhancements:**\n\n- \\[4.0\\] Open Platform 模块 [\\#587](https://github.com/overtrue/wechat/issues/587)\n- \\[4.0\\] 微信支付 sandbox模式 [\\#507](https://github.com/overtrue/wechat/issues/507)\n\n**Closed issues:**\n\n- \\[4.0\\] staff 模块改名为 customer service [\\#585](https://github.com/overtrue/wechat/issues/585)\n\n**Merged pull requests:**\n\n- Module rename. [\\#664](https://github.com/overtrue/wechat/pull/664) ([mingyoung](https://github.com/mingyoung))\n- Merge branch master into branch develop. [\\#663](https://github.com/overtrue/wechat/pull/663) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#662](https://github.com/overtrue/wechat/pull/662) ([mingyoung](https://github.com/mingyoung))\n- Fix payment tools API [\\#660](https://github.com/overtrue/wechat/pull/660) ([mingyoung](https://github.com/mingyoung))\n- Avoid ambiguity [\\#659](https://github.com/overtrue/wechat/pull/659) ([mingyoung](https://github.com/mingyoung))\n- Support Payment Sandbox mode [\\#658](https://github.com/overtrue/wechat/pull/658) ([skyred](https://github.com/skyred))\n- Apply fixes from StyleCI [\\#656](https://github.com/overtrue/wechat/pull/656) ([overtrue](https://github.com/overtrue))\n- Mini program datacube. [\\#655](https://github.com/overtrue/wechat/pull/655) ([mingyoung](https://github.com/mingyoung))\n\n## [3.3.1](https://github.com/overtrue/wechat/tree/3.3.1) (2017-04-16)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.3.0...3.3.1)\n\n**Closed issues:**\n\n- 微信第三方平台缓存位置，是否可以在配置文件中自定义 [\\#648](https://github.com/overtrue/wechat/issues/648)\n- 微信开放平台authorizer token缓存问题 [\\#644](https://github.com/overtrue/wechat/issues/644)\n- 微信开放平台发起网页授权bug [\\#638](https://github.com/overtrue/wechat/issues/638)\n- 微信公众号不能回复接收到的消息，日志无报错 [\\#637](https://github.com/overtrue/wechat/issues/637)\n- \\[4.0\\]黑名单管理 [\\#538](https://github.com/overtrue/wechat/issues/538)\n\n**Merged pull requests:**\n\n- optimizes [\\#652](https://github.com/overtrue/wechat/pull/652) ([mingyoung](https://github.com/mingyoung))\n\n## [3.3.0](https://github.com/overtrue/wechat/tree/3.3.0) (2017-04-13)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.2.7...3.3.0)\n\n**Closed issues:**\n\n- 微信接口获取openid是怎么排序的? [\\#650](https://github.com/overtrue/wechat/issues/650)\n- 缺少网页扫码支付接口 [\\#647](https://github.com/overtrue/wechat/issues/647)\n- 微信下的单的默认过期时间是多少啊 [\\#645](https://github.com/overtrue/wechat/issues/645)\n- 在获取用户信息是出错 [\\#643](https://github.com/overtrue/wechat/issues/643)\n- 调用$app =app\\('wechat'\\);时报错Use of undefined constant CURLOPT\\_IPRESOLVE - assumed 'CURLOPT\\_IPRESOLVE' [\\#633](https://github.com/overtrue/wechat/issues/633)\n- 提示找不到EasyWeChat\\Server\\Guard::setRequest\\(\\)方法 [\\#626](https://github.com/overtrue/wechat/issues/626)\n- 开放平台接收ComponentVerifyTicket,会出现Undefined index: FromUserName [\\#623](https://github.com/overtrue/wechat/issues/623)\n- 美国移动网络获取不到accessToken [\\#610](https://github.com/overtrue/wechat/issues/610)\n- 开放平台 APP 微信登录 [\\#604](https://github.com/overtrue/wechat/issues/604)\n\n**Merged pull requests:**\n\n- Merge from open-platform branch. [\\#651](https://github.com/overtrue/wechat/pull/651) ([mingyoung](https://github.com/mingyoung))\n- Update code for open-platform [\\#649](https://github.com/overtrue/wechat/pull/649) ([mingyoung](https://github.com/mingyoung))\n- Code cleanup & refactoring. [\\#646](https://github.com/overtrue/wechat/pull/646) ([mingyoung](https://github.com/mingyoung))\n- support cash coupon [\\#642](https://github.com/overtrue/wechat/pull/642) ([HanSon](https://github.com/HanSon))\n- ♻️ All tests have been namespaced. [\\#641](https://github.com/overtrue/wechat/pull/641) ([mingyoung](https://github.com/mingyoung))\n- tweak code. [\\#640](https://github.com/overtrue/wechat/pull/640) ([mingyoung](https://github.com/mingyoung))\n- modify oauth property [\\#639](https://github.com/overtrue/wechat/pull/639) ([jekst](https://github.com/jekst))\n- Apply fixes from StyleCI [\\#635](https://github.com/overtrue/wechat/pull/635) ([overtrue](https://github.com/overtrue))\n- ✨ Blacklist. [\\#634](https://github.com/overtrue/wechat/pull/634) ([mingyoung](https://github.com/mingyoung))\n- 🔨 Refactoring for mini-program. [\\#632](https://github.com/overtrue/wechat/pull/632) ([mingyoung](https://github.com/mingyoung))\n\n## [3.2.7](https://github.com/overtrue/wechat/tree/3.2.7) (2017-03-31)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.2.6...3.2.7)\n\n**Closed issues:**\n\n- 不管哪个公众号，只要填写 这个接口地址，都能配置或应用成功，实际上是不成功的，不到怎么找错。。 [\\#611](https://github.com/overtrue/wechat/issues/611)\n\n**Merged pull requests:**\n\n- 修复一个创建卡券时的 bug, 添加获取微信门店类目表的api [\\#631](https://github.com/overtrue/wechat/pull/631) ([Hexor](https://github.com/Hexor))\n\n## [3.2.6](https://github.com/overtrue/wechat/tree/3.2.6) (2017-03-31)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.2.5...3.2.6)\n\n**Closed issues:**\n\n- 我想大量发模板消息，但send每次都等待返回太慢，有啥解决办法吗？ [\\#630](https://github.com/overtrue/wechat/issues/630)\n- 3.2开放平台缺少authorizer\\_token和authorization [\\#629](https://github.com/overtrue/wechat/issues/629)\n- 微信开发平台接受消息报Invalid request signature bug [\\#625](https://github.com/overtrue/wechat/issues/625)\n- 图文上传thumb\\_media\\_id 返回 {\"errcode\":40007,\"errmsg\":\"invalid media\\_id hint: \\[\\]\"}  [\\#622](https://github.com/overtrue/wechat/issues/622)\n- Encryptor基类hack导致小程序的sessionKey base64\\_decode失败 [\\#614](https://github.com/overtrue/wechat/issues/614)\n- 是否有 2.1 升级到最新版的方案？ [\\#609](https://github.com/overtrue/wechat/issues/609)\n- laravel5.3 安装 \"overtrue/wechat:~3.1 失败 [\\#607](https://github.com/overtrue/wechat/issues/607)\n- overtrue/wechat和phpdoc包依赖冲突。 [\\#605](https://github.com/overtrue/wechat/issues/605)\n- \\[bug\\]2个问题 [\\#597](https://github.com/overtrue/wechat/issues/597)\n- 微信第三方平台开发是否只做了一部分？ [\\#594](https://github.com/overtrue/wechat/issues/594)\n- \\[4.0\\] ServiceProvider 移动到各自模块里 [\\#588](https://github.com/overtrue/wechat/issues/588)\n- Cannot use EasyWeChat\\OpenPlatform\\Traits\\VerifyTicket as VerifyTicket because the name is already in use [\\#579](https://github.com/overtrue/wechat/issues/579)\n- 授权state值怎么设置 [\\#573](https://github.com/overtrue/wechat/issues/573)\n- mini\\_app get jscode problem, report appid & secret value is null [\\#569](https://github.com/overtrue/wechat/issues/569)\n- 小程序生成二维码问题 [\\#568](https://github.com/overtrue/wechat/issues/568)\n\n**Merged pull requests:**\n\n- Update OpenPlatform AppId [\\#624](https://github.com/overtrue/wechat/pull/624) ([jeftom](https://github.com/jeftom))\n- Apply fixes from StyleCI [\\#621](https://github.com/overtrue/wechat/pull/621) ([overtrue](https://github.com/overtrue))\n- Apply fixes from StyleCI [\\#618](https://github.com/overtrue/wechat/pull/618) ([overtrue](https://github.com/overtrue))\n- Compatible with php5.5 [\\#617](https://github.com/overtrue/wechat/pull/617) ([mingyoung](https://github.com/mingyoung))\n- Make the testcase works. [\\#616](https://github.com/overtrue/wechat/pull/616) ([mingyoung](https://github.com/mingyoung))\n- Fix mini-program decryptor [\\#615](https://github.com/overtrue/wechat/pull/615) ([mingyoung](https://github.com/mingyoung))\n- Missing message handling [\\#613](https://github.com/overtrue/wechat/pull/613) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#612](https://github.com/overtrue/wechat/pull/612) ([overtrue](https://github.com/overtrue))\n- 添加卡券创建二维码接口 [\\#608](https://github.com/overtrue/wechat/pull/608) ([forecho](https://github.com/forecho))\n- 开放平台大幅重构并且添加测试 [\\#606](https://github.com/overtrue/wechat/pull/606) ([tsunamilx](https://github.com/tsunamilx))\n- Update MessageBuilder.php [\\#603](https://github.com/overtrue/wechat/pull/603) ([U2Fsd](https://github.com/U2Fsd))\n- 生成 js添加到卡包接口 增加fixed\\_begintimestamp、outer\\_str字段 [\\#602](https://github.com/overtrue/wechat/pull/602) ([gychg](https://github.com/gychg))\n- tests for speed [\\#600](https://github.com/overtrue/wechat/pull/600) ([mingyoung](https://github.com/mingyoung))\n- Update test files [\\#599](https://github.com/overtrue/wechat/pull/599) ([mingyoung](https://github.com/mingyoung))\n- 允许自定义ticket缓存key [\\#598](https://github.com/overtrue/wechat/pull/598) ([XiaoLer](https://github.com/XiaoLer))\n- delete top color [\\#595](https://github.com/overtrue/wechat/pull/595) ([HanSon](https://github.com/HanSon))\n- Add payment scan notify handler [\\#593](https://github.com/overtrue/wechat/pull/593) ([acgrid](https://github.com/acgrid))\n- Apply fixes from StyleCI [\\#591](https://github.com/overtrue/wechat/pull/591) ([overtrue](https://github.com/overtrue))\n- Upgrade packages version to 4.0 [\\#590](https://github.com/overtrue/wechat/pull/590) ([reatang](https://github.com/reatang))\n- Move providers to module dir. \\#588 [\\#589](https://github.com/overtrue/wechat/pull/589) ([overtrue](https://github.com/overtrue))\n- 把OpenPlatform中的组件依赖解耦 [\\#581](https://github.com/overtrue/wechat/pull/581) ([reatang](https://github.com/reatang))\n\n## [3.2.5](https://github.com/overtrue/wechat/tree/3.2.5) (2017-02-04)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.2.4...3.2.5)\n\n**Merged pull requests:**\n\n- fix naming [\\#580](https://github.com/overtrue/wechat/pull/580) ([mingyoung](https://github.com/mingyoung))\n- Allow client code configure its own GuzzleHTTP handler [\\#578](https://github.com/overtrue/wechat/pull/578) ([acgrid](https://github.com/acgrid))\n\n## [3.2.4](https://github.com/overtrue/wechat/tree/3.2.4) (2017-01-24)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.2.3...3.2.4)\n\n**Closed issues:**\n\n- 如何在其他框架下使用$app-\\>payment-\\>handleNotify [\\#574](https://github.com/overtrue/wechat/issues/574)\n- 前后端分离单页下获取的config，认证失败 [\\#565](https://github.com/overtrue/wechat/issues/565)\n- 支付签名错误 [\\#563](https://github.com/overtrue/wechat/issues/563)\n\n**Merged pull requests:**\n\n- Update Authorizer.php [\\#577](https://github.com/overtrue/wechat/pull/577) ([ww380459000](https://github.com/ww380459000))\n- 补全通用卡接口 [\\#575](https://github.com/overtrue/wechat/pull/575) ([XiaoLer](https://github.com/XiaoLer))\n- require ext-SimpleXML [\\#572](https://github.com/overtrue/wechat/pull/572) ([garveen](https://github.com/garveen))\n- fix README Contribution link [\\#571](https://github.com/overtrue/wechat/pull/571) ([zhwei](https://github.com/zhwei))\n- Add user data decryption. [\\#570](https://github.com/overtrue/wechat/pull/570) ([mingyoung](https://github.com/mingyoung))\n- change request parameter [\\#567](https://github.com/overtrue/wechat/pull/567) ([cloudsthere](https://github.com/cloudsthere))\n- 完善小程序代码 [\\#566](https://github.com/overtrue/wechat/pull/566) ([mingyoung](https://github.com/mingyoung))\n- 添加小程序支持 [\\#564](https://github.com/overtrue/wechat/pull/564) ([mingyoung](https://github.com/mingyoung))\n\n## [3.2.3](https://github.com/overtrue/wechat/tree/3.2.3) (2017-01-04)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.2.2...3.2.3)\n\n**Closed issues:**\n\n- 文档里的自定义菜单中，group\\_id是否为tag\\_id的误写？ [\\#561](https://github.com/overtrue/wechat/issues/561)\n- Open Platform有简明的使用文档吗？3ks [\\#560](https://github.com/overtrue/wechat/issues/560)\n- 刷新access\\_token有效期，未发现有相关的封装 [\\#540](https://github.com/overtrue/wechat/issues/540)\n\n**Merged pull requests:**\n\n- Update Card.php [\\#562](https://github.com/overtrue/wechat/pull/562) ([XiaoLer](https://github.com/XiaoLer))\n- Apply fixes from StyleCI [\\#559](https://github.com/overtrue/wechat/pull/559) ([overtrue](https://github.com/overtrue))\n- Update API.php [\\#558](https://github.com/overtrue/wechat/pull/558) ([drogjh](https://github.com/drogjh))\n- optimized code [\\#557](https://github.com/overtrue/wechat/pull/557) ([mingyoung](https://github.com/mingyoung))\n\n## [3.2.2](https://github.com/overtrue/wechat/tree/3.2.2) (2016-12-27)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.2.1...3.2.2)\n\n**Closed issues:**\n\n- How to get authorize url? [\\#555](https://github.com/overtrue/wechat/issues/555)\n\n**Merged pull requests:**\n\n- fixed downloadBill method result [\\#556](https://github.com/overtrue/wechat/pull/556) ([hidehalo](https://github.com/hidehalo))\n- add config:log.permission for monolog [\\#554](https://github.com/overtrue/wechat/pull/554) ([woshizoufeng](https://github.com/woshizoufeng))\n- Improve open platform support. [\\#553](https://github.com/overtrue/wechat/pull/553) ([mingyoung](https://github.com/mingyoung))\n- Improve. [\\#552](https://github.com/overtrue/wechat/pull/552) ([mingyoung](https://github.com/mingyoung))\n- add $forceRefresh param to js-\\>ticket\\(\\) method [\\#551](https://github.com/overtrue/wechat/pull/551) ([leo108](https://github.com/leo108))\n\n## [3.2.1](https://github.com/overtrue/wechat/tree/3.2.1) (2016-12-20)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.2.0...3.2.1)\n\n**Merged pull requests:**\n\n- 增加小程序用jscode获取用户信息的接口 [\\#550](https://github.com/overtrue/wechat/pull/550) ([soone](https://github.com/soone))\n\n## [3.2.0](https://github.com/overtrue/wechat/tree/3.2.0) (2016-12-19)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.1.9...3.2.0)\n\n**Closed issues:**\n\n- 喵喵喵 [\\#545](https://github.com/overtrue/wechat/issues/545)\n- HttpException with uploadArticle API [\\#544](https://github.com/overtrue/wechat/issues/544)\n- 是否有接入小程序的计划 [\\#543](https://github.com/overtrue/wechat/issues/543)\n- \"Call to undefined method Overtrue\\Socialite\\Providers\\WeChat Provider::driver\\(\\) [\\#536](https://github.com/overtrue/wechat/issues/536)\n- 服务端Server模块回复音乐消息出错 [\\#533](https://github.com/overtrue/wechat/issues/533)\n- 用户授权出现The key \"access\\_token\" could not be empty [\\#527](https://github.com/overtrue/wechat/issues/527)\n\n**Merged pull requests:**\n\n- Apply fixes from StyleCI [\\#549](https://github.com/overtrue/wechat/pull/549) ([overtrue](https://github.com/overtrue))\n- 添加摇一摇周边模块 [\\#548](https://github.com/overtrue/wechat/pull/548) ([allen05ren](https://github.com/allen05ren))\n- Make some compatible. [\\#542](https://github.com/overtrue/wechat/pull/542) ([mingyoung](https://github.com/mingyoung))\n- Apply fixes from StyleCI [\\#541](https://github.com/overtrue/wechat/pull/541) ([overtrue](https://github.com/overtrue))\n- 改变了http 中 json 方法的接口, 从而支持 添加 添加 query参数 [\\#539](https://github.com/overtrue/wechat/pull/539) ([shoaly](https://github.com/shoaly))\n- 提交 [\\#537](https://github.com/overtrue/wechat/pull/537) ([shoaly](https://github.com/shoaly))\n- Apply fixes from StyleCI [\\#535](https://github.com/overtrue/wechat/pull/535) ([overtrue](https://github.com/overtrue))\n\n## [3.1.9](https://github.com/overtrue/wechat/tree/3.1.9) (2016-12-01)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.1.8...3.1.9)\n\n**Closed issues:**\n\n- 还是不懂怎么获取unionid [\\#531](https://github.com/overtrue/wechat/issues/531)\n- Scope 参数错误或没有 Scope 权限 [\\#528](https://github.com/overtrue/wechat/issues/528)\n- $\\_SERVER\\['SERVER\\_ADDR'\\] 在mac php7中获取不到 [\\#520](https://github.com/overtrue/wechat/issues/520)\n- 能否永久素材其他类型封装个download方法，跟临时一样 [\\#505](https://github.com/overtrue/wechat/issues/505)\n- V3.1 JSSDK使用疑惑 [\\#503](https://github.com/overtrue/wechat/issues/503)\n- 如何加入QQ群 [\\#501](https://github.com/overtrue/wechat/issues/501)\n- 能否在下一个版本把企业的相关接口整合集成进去 [\\#496](https://github.com/overtrue/wechat/issues/496)\n- 既然使用了monolog，那么在Application::initializeLogger只使用了文件流的特定形式来记录日志是否合理？ [\\#494](https://github.com/overtrue/wechat/issues/494)\n- configForShareAddress [\\#482](https://github.com/overtrue/wechat/issues/482)\n- 更新微信文章的时候MatialEasyWeChat\\Material，如果设置了show\\_pic\\_cover和content\\_source\\_url不会生效 [\\#470](https://github.com/overtrue/wechat/issues/470)\n- 请问 SDK 是否支持授权接入的公众号接口调用？ [\\#438](https://github.com/overtrue/wechat/issues/438)\n- 通过unionid发送信息。 [\\#411](https://github.com/overtrue/wechat/issues/411)\n- 【新增】设备管理 [\\#77](https://github.com/overtrue/wechat/issues/77)\n\n**Merged pull requests:**\n\n- Add support wechat open platform. [\\#532](https://github.com/overtrue/wechat/pull/532) ([mingyoung](https://github.com/mingyoung))\n- Applied fixes from StyleCI [\\#530](https://github.com/overtrue/wechat/pull/530) ([overtrue](https://github.com/overtrue))\n- 新增硬件设备api [\\#529](https://github.com/overtrue/wechat/pull/529) ([soone](https://github.com/soone))\n\n## [3.1.8](https://github.com/overtrue/wechat/tree/3.1.8) (2016-11-23)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.1.7...3.1.8)\n\n**Closed issues:**\n\n- SCAN 事件会出现无法提供服务 [\\#525](https://github.com/overtrue/wechat/issues/525)\n\n## [3.1.7](https://github.com/overtrue/wechat/tree/3.1.7) (2016-10-26)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.1.6...3.1.7)\n\n**Closed issues:**\n\n- preg\\_replace unicode 的兼容问题 [\\#515](https://github.com/overtrue/wechat/issues/515)\n\n**Merged pull requests:**\n\n- support psr-http-message-bridge 1.0 [\\#524](https://github.com/overtrue/wechat/pull/524) ([wppd](https://github.com/wppd))\n- Applied fixes from StyleCI [\\#523](https://github.com/overtrue/wechat/pull/523) ([overtrue](https://github.com/overtrue))\n- for \\#520 [\\#522](https://github.com/overtrue/wechat/pull/522) ([jinchun](https://github.com/jinchun))\n\n## [3.1.6](https://github.com/overtrue/wechat/tree/3.1.6) (2016-10-19)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.1.5...3.1.6)\n\n**Closed issues:**\n\n- PHP Fatal error: Uncaught HttpException [\\#517](https://github.com/overtrue/wechat/issues/517)\n- 微信支付回调出错 [\\#514](https://github.com/overtrue/wechat/issues/514)\n\n**Merged pull requests:**\n\n- Fix xml preg replace [\\#519](https://github.com/overtrue/wechat/pull/519) ([springjk](https://github.com/springjk))\n- fix the DOC [\\#518](https://github.com/overtrue/wechat/pull/518) ([ac1982](https://github.com/ac1982))\n\n## [3.1.5](https://github.com/overtrue/wechat/tree/3.1.5) (2016-10-13)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.1.4...3.1.5)\n\n**Closed issues:**\n\n- wechat 在 larave l5.3 使用 passport 包下无法安装 [\\#513](https://github.com/overtrue/wechat/issues/513)\n\n**Merged pull requests:**\n\n- Applied fixes from StyleCI [\\#512](https://github.com/overtrue/wechat/pull/512) ([overtrue](https://github.com/overtrue))\n\n## [3.1.4](https://github.com/overtrue/wechat/tree/3.1.4) (2016-10-12)\n[Full Changelog](https://github.com/overtrue/wechat/compare/2.1.39...3.1.4)\n\n**Closed issues:**\n\n- 微信卡券特殊票券创建之后为什么无法更新卡券信息一致提示code非法。 [\\#511](https://github.com/overtrue/wechat/issues/511)\n- 请添加 「退款方式」 参数 [\\#509](https://github.com/overtrue/wechat/issues/509)\n- 2.1.40命名空间巨变引发的重大问题\\(疑似提错版本了\\) [\\#508](https://github.com/overtrue/wechat/issues/508)\n- 卡券核销、查询建议 [\\#506](https://github.com/overtrue/wechat/issues/506)\n- 支付重复回调问题 [\\#504](https://github.com/overtrue/wechat/issues/504)\n\n**Merged pull requests:**\n\n- Changed method doc to the right accepted param type [\\#510](https://github.com/overtrue/wechat/pull/510) ([marianoasselborn](https://github.com/marianoasselborn))\n- 增加判断是否有人工客服帐号，避免出现无账号时候，头像为默认头像的情况 [\\#502](https://github.com/overtrue/wechat/pull/502) ([hello2t](https://github.com/hello2t))\n- Applied fixes from StyleCI [\\#500](https://github.com/overtrue/wechat/pull/500) ([overtrue](https://github.com/overtrue))\n- 为initializeLogger日志初始话函数添加判断分支 [\\#499](https://github.com/overtrue/wechat/pull/499) ([403studio](https://github.com/403studio))\n\n## [2.1.39](https://github.com/overtrue/wechat/tree/2.1.39) (2016-09-05)\n[Full Changelog](https://github.com/overtrue/wechat/compare/2.1.41...2.1.39)\n\n## [2.1.41](https://github.com/overtrue/wechat/tree/2.1.41) (2016-09-05)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.1.3...2.1.41)\n\n**Closed issues:**\n\n- 调用接口次数超过最大限制问题 [\\#493](https://github.com/overtrue/wechat/issues/493)\n- 微信退款证书报错 Unable to set private key file  [\\#492](https://github.com/overtrue/wechat/issues/492)\n- 微信支付存在问题 [\\#489](https://github.com/overtrue/wechat/issues/489)\n- 预支付下单 response body 为空 [\\#488](https://github.com/overtrue/wechat/issues/488)\n- https check issue [\\#486](https://github.com/overtrue/wechat/issues/486)\n\n**Merged pull requests:**\n\n- update composer.json [\\#498](https://github.com/overtrue/wechat/pull/498) ([ac1982](https://github.com/ac1982))\n- use openssl instead of mcrypt [\\#497](https://github.com/overtrue/wechat/pull/497) ([ac1982](https://github.com/ac1982))\n- 修复 with 方法带数据的问题 [\\#491](https://github.com/overtrue/wechat/pull/491) ([XiaoLer](https://github.com/XiaoLer))\n\n## [3.1.3](https://github.com/overtrue/wechat/tree/3.1.3) (2016-08-08)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.1.2...3.1.3)\n\n**Closed issues:**\n\n- Laravel中写的最简单的例子在phpunit出错。 [\\#485](https://github.com/overtrue/wechat/issues/485)\n- 微信的消息回复的FromUserName和ToUserName是不是对调了 [\\#484](https://github.com/overtrue/wechat/issues/484)\n- 微信红包不能发给别的公众号的用户吗 [\\#483](https://github.com/overtrue/wechat/issues/483)\n- 用户授权登录问题 [\\#481](https://github.com/overtrue/wechat/issues/481)\n- cURL error 56: SSLRead\\(\\) return error -9806 [\\#473](https://github.com/overtrue/wechat/issues/473)\n- 会员卡开卡字段文档有错误 [\\#471](https://github.com/overtrue/wechat/issues/471)\n- Getting more done in GitHub with ZenHub [\\#439](https://github.com/overtrue/wechat/issues/439)\n- 微信支付下单错误 [\\#376](https://github.com/overtrue/wechat/issues/376)\n\n**Merged pull requests:**\n\n- update the File class to recognize pdf file. [\\#480](https://github.com/overtrue/wechat/pull/480) ([ac1982](https://github.com/ac1982))\n- update testActivateUserForm [\\#478](https://github.com/overtrue/wechat/pull/478) ([wangniuniu](https://github.com/wangniuniu))\n- Scrutinizer Auto-Fixes [\\#477](https://github.com/overtrue/wechat/pull/477) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n- Applied fixes from StyleCI [\\#476](https://github.com/overtrue/wechat/pull/476) ([overtrue](https://github.com/overtrue))\n- Scrutinizer Auto-Fixes [\\#475](https://github.com/overtrue/wechat/pull/475) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n- 开放自定义prefix和缓存键值方法 [\\#474](https://github.com/overtrue/wechat/pull/474) ([XiaoLer](https://github.com/XiaoLer))\n- Applied fixes from StyleCI [\\#469](https://github.com/overtrue/wechat/pull/469) ([overtrue](https://github.com/overtrue))\n- modify stats [\\#468](https://github.com/overtrue/wechat/pull/468) ([wangniuniu](https://github.com/wangniuniu))\n\n## [3.1.2](https://github.com/overtrue/wechat/tree/3.1.2) (2016-07-21)\n[Full Changelog](https://github.com/overtrue/wechat/compare/2.1.38...3.1.2)\n\n**Closed issues:**\n\n- 素材管理中，上传图文下的上传图片，关于返回内容的差异 [\\#466](https://github.com/overtrue/wechat/issues/466)\n- spbill\\_create\\_ip参数设置 [\\#461](https://github.com/overtrue/wechat/issues/461)\n\n**Merged pull requests:**\n\n- 更新获取标签下粉丝列表方法 [\\#467](https://github.com/overtrue/wechat/pull/467) ([dingdayu](https://github.com/dingdayu))\n- Applied fixes from StyleCI [\\#465](https://github.com/overtrue/wechat/pull/465) ([overtrue](https://github.com/overtrue))\n- card module. [\\#464](https://github.com/overtrue/wechat/pull/464) ([wangniuniu](https://github.com/wangniuniu))\n- Applied fixes from StyleCI [\\#463](https://github.com/overtrue/wechat/pull/463) ([overtrue](https://github.com/overtrue))\n- Scrutinizer Auto-Fixes [\\#462](https://github.com/overtrue/wechat/pull/462) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n\n## [2.1.38](https://github.com/overtrue/wechat/tree/2.1.38) (2016-07-16)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.1.1...2.1.38)\n\n**Closed issues:**\n\n- 请问卡券管理功能整合上日程表了吗 [\\#454](https://github.com/overtrue/wechat/issues/454)\n\n**Merged pull requests:**\n\n- Typo. [\\#460](https://github.com/overtrue/wechat/pull/460) ([tianyong90](https://github.com/tianyong90))\n- Applied fixes from StyleCI [\\#459](https://github.com/overtrue/wechat/pull/459) ([overtrue](https://github.com/overtrue))\n- add voice recognition [\\#458](https://github.com/overtrue/wechat/pull/458) ([leniy](https://github.com/leniy))\n- Applied fixes from StyleCI [\\#457](https://github.com/overtrue/wechat/pull/457) ([overtrue](https://github.com/overtrue))\n- Update API.php [\\#456](https://github.com/overtrue/wechat/pull/456) ([marvin8212](https://github.com/marvin8212))\n- Update XML.php [\\#455](https://github.com/overtrue/wechat/pull/455) ([canon4ever](https://github.com/canon4ever))\n\n## [3.1.1](https://github.com/overtrue/wechat/tree/3.1.1) (2016-07-12)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.1.0...3.1.1)\n\n**Closed issues:**\n\n- 拿到code=CODE&state=STATE之后怎么拿到openid? [\\#452](https://github.com/overtrue/wechat/issues/452)\n- 安装出错 [\\#450](https://github.com/overtrue/wechat/issues/450)\n- 自定义菜单接口\\(新版\\)出错 [\\#448](https://github.com/overtrue/wechat/issues/448)\n- h5上没法打开微信app授权界面 [\\#447](https://github.com/overtrue/wechat/issues/447)\n- 重构卡券 [\\#76](https://github.com/overtrue/wechat/issues/76)\n\n**Merged pull requests:**\n\n- typos. [\\#453](https://github.com/overtrue/wechat/pull/453) ([tianye](https://github.com/tianye))\n- edit readme.md [\\#451](https://github.com/overtrue/wechat/pull/451) ([tianyong90](https://github.com/tianyong90))\n- Add cache driver config. [\\#449](https://github.com/overtrue/wechat/pull/449) ([dingdayu](https://github.com/dingdayu))\n\n## [3.1.0](https://github.com/overtrue/wechat/tree/3.1.0) (2016-06-28)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.0.21...3.1.0)\n\n**Merged pull requests:**\n\n- Applied fixes from StyleCI [\\#446](https://github.com/overtrue/wechat/pull/446) ([overtrue](https://github.com/overtrue))\n- New Staff API. [\\#445](https://github.com/overtrue/wechat/pull/445) ([overtrue](https://github.com/overtrue))\n- 2.1 [\\#444](https://github.com/overtrue/wechat/pull/444) ([dongnanyanhai](https://github.com/dongnanyanhai))\n- Fix path. [\\#443](https://github.com/overtrue/wechat/pull/443) ([overtrue](https://github.com/overtrue))\n\n## [3.0.21](https://github.com/overtrue/wechat/tree/3.0.21) (2016-06-17)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.0.1...3.0.21)\n\n**Closed issues:**\n\n- scan出现公众号暂时无法服务的消息 [\\#436](https://github.com/overtrue/wechat/issues/436)\n- scan出现公众号暂时无法服务的消息 [\\#435](https://github.com/overtrue/wechat/issues/435)\n- 用户标签接口无法使用 [\\#433](https://github.com/overtrue/wechat/issues/433)\n- WeChatProvider下的getAuthUrl个人觉得应该暴露出来 [\\#432](https://github.com/overtrue/wechat/issues/432)\n- 支持二维码扫描进入公众号推送的SCAN事件 [\\#431](https://github.com/overtrue/wechat/issues/431)\n- \\[3.0\\] EasyWeChat\\Support\\XML::parse方法会将空节点解析为空数组，而不是空字符串 [\\#426](https://github.com/overtrue/wechat/issues/426)\n- 下载二维码, $qrcode-\\>download\\($ticket,$paths\\);  目录参数不可加入 中文 [\\#420](https://github.com/overtrue/wechat/issues/420)\n- \\[help want\\]Is hard to change default configuration of GuzzleHttp [\\#415](https://github.com/overtrue/wechat/issues/415)\n- PHP7.0 curl\\_setopt 设置问题 [\\#413](https://github.com/overtrue/wechat/issues/413)\n- 无法通知微信支付完成 [\\#412](https://github.com/overtrue/wechat/issues/412)\n- 如何获取用户的unionid? [\\#407](https://github.com/overtrue/wechat/issues/407)\n- 是否支持多框架 [\\#406](https://github.com/overtrue/wechat/issues/406)\n- fuckTheWeChatInvalidJSON [\\#405](https://github.com/overtrue/wechat/issues/405)\n- Class 'GuzzleHttp\\Middleware' not found [\\#404](https://github.com/overtrue/wechat/issues/404)\n- 支付统一下单接口签名错误 [\\#402](https://github.com/overtrue/wechat/issues/402)\n- payment里没有configForJSSDKPayment方法 [\\#401](https://github.com/overtrue/wechat/issues/401)\n- 查询支付的地址多了一个空格，导致查询失败，去掉最后的那个空格后就好了 [\\#393](https://github.com/overtrue/wechat/issues/393)\n- 网页授权过不了 [\\#392](https://github.com/overtrue/wechat/issues/392)\n- 微信AccessToken被动更新可能会有并发更新的情况出现 [\\#390](https://github.com/overtrue/wechat/issues/390)\n- 临时素材下载，文件名和扩展名之间会有2个\\[.\\] [\\#389](https://github.com/overtrue/wechat/issues/389)\n- 有一个地方变量名对不上 [\\#380](https://github.com/overtrue/wechat/issues/380)\n- 自定义缓存 [\\#379](https://github.com/overtrue/wechat/issues/379)\n- https://easywechat.org/ 底部 “开始使用” url拼错 [\\#378](https://github.com/overtrue/wechat/issues/378)\n- 在server.php里面调用yii的model，一直报错 [\\#375](https://github.com/overtrue/wechat/issues/375)\n- overture/wechat 2.1.36\\(客服消息转发错误\\) [\\#374](https://github.com/overtrue/wechat/issues/374)\n- 建议支持开发模式下禁用验证 [\\#373](https://github.com/overtrue/wechat/issues/373)\n- https://easywechat.org/ 导航 首页 about:blank [\\#370](https://github.com/overtrue/wechat/issues/370)\n- laravel 下session问题 [\\#369](https://github.com/overtrue/wechat/issues/369)\n- 关于Access——toekn [\\#368](https://github.com/overtrue/wechat/issues/368)\n- 返回支付页面时报错：\"access\\_token\" could not be empty [\\#367](https://github.com/overtrue/wechat/issues/367)\n- xampp下js-\\>config报错 [\\#366](https://github.com/overtrue/wechat/issues/366)\n- 官方文档有误 [\\#360](https://github.com/overtrue/wechat/issues/360)\n- \\[BUG\\] 微信收货地址无法成功 [\\#359](https://github.com/overtrue/wechat/issues/359)\n- 无法获取 $message-\\>ScanCodeInfo-\\>ScanType 对象 [\\#358](https://github.com/overtrue/wechat/issues/358)\n- \\[Bugs\\] 项目文档首页跳转问题 [\\#357](https://github.com/overtrue/wechat/issues/357)\n- Business和UnifiedOrder没有定义 [\\#356](https://github.com/overtrue/wechat/issues/356)\n- 你的网站访问不了。。。。https://easywechat.org/ [\\#352](https://github.com/overtrue/wechat/issues/352)\n- 连续多次执行微信支付退款报错 [\\#348](https://github.com/overtrue/wechat/issues/348)\n- 客服操作 都是  -1 错误 [\\#344](https://github.com/overtrue/wechat/issues/344)\n- 请使用openssl 而不是不安全的mcrypt来加密 [\\#342](https://github.com/overtrue/wechat/issues/342)\n- 文本类型的通知消息 [\\#341](https://github.com/overtrue/wechat/issues/341)\n- 服务器配置https 并且 通过阿里云 https cdn之后, 会出现 https 判断语句失效 [\\#338](https://github.com/overtrue/wechat/issues/338)\n- 作者请问者个sdk支持企业号吗? [\\#336](https://github.com/overtrue/wechat/issues/336)\n- laravel 5.1引入包报错 [\\#331](https://github.com/overtrue/wechat/issues/331)\n- 申请退款有问题 [\\#328](https://github.com/overtrue/wechat/issues/328)\n- 订单相关接口bug [\\#327](https://github.com/overtrue/wechat/issues/327)\n- 临时素材接口无法使用 [\\#319](https://github.com/overtrue/wechat/issues/319)\n- 使用sendNormal\\(\\),sendGroup\\(\\)发送红包时，报Undefined index: HTTP\\_CLIENT\\_IP [\\#316](https://github.com/overtrue/wechat/issues/316)\n- v3中微信卡券功能缺失？ [\\#307](https://github.com/overtrue/wechat/issues/307)\n- 测试 [\\#305](https://github.com/overtrue/wechat/issues/305)\n- \\[3.0\\] 永久素材上传视频无法上传问题 [\\#304](https://github.com/overtrue/wechat/issues/304)\n- Cannot destroy active lambda function [\\#296](https://github.com/overtrue/wechat/issues/296)\n- 微信支付-》企业付款也可以增加个类上去，跟企业红包类似 [\\#232](https://github.com/overtrue/wechat/issues/232)\n\n**Merged pull requests:**\n\n- Applied fixes from StyleCI [\\#442](https://github.com/overtrue/wechat/pull/442) ([overtrue](https://github.com/overtrue))\n- NGINX HTTPS无法签名 [\\#441](https://github.com/overtrue/wechat/pull/441) ([ares333](https://github.com/ares333))\n- Develop [\\#440](https://github.com/overtrue/wechat/pull/440) ([overtrue](https://github.com/overtrue))\n- Develop [\\#437](https://github.com/overtrue/wechat/pull/437) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#434](https://github.com/overtrue/wechat/pull/434) ([overtrue](https://github.com/overtrue))\n- 修改错误提示信息，方便跟踪错误 [\\#430](https://github.com/overtrue/wechat/pull/430) ([zerozh](https://github.com/zerozh))\n- Develop [\\#429](https://github.com/overtrue/wechat/pull/429) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#428](https://github.com/overtrue/wechat/pull/428) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#427](https://github.com/overtrue/wechat/pull/427) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#425](https://github.com/overtrue/wechat/pull/425) ([overtrue](https://github.com/overtrue))\n- update annotation [\\#424](https://github.com/overtrue/wechat/pull/424) ([lilocon](https://github.com/lilocon))\n- Develop [\\#421](https://github.com/overtrue/wechat/pull/421) ([overtrue](https://github.com/overtrue))\n- Set default timeout. [\\#419](https://github.com/overtrue/wechat/pull/419) ([overtrue](https://github.com/overtrue))\n- Develop [\\#418](https://github.com/overtrue/wechat/pull/418) ([overtrue](https://github.com/overtrue))\n- Develop [\\#416](https://github.com/overtrue/wechat/pull/416) ([overtrue](https://github.com/overtrue))\n- better implementation for prepare oauth callback url [\\#414](https://github.com/overtrue/wechat/pull/414) ([lichunqiang](https://github.com/lichunqiang))\n- Develop [\\#410](https://github.com/overtrue/wechat/pull/410) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#409](https://github.com/overtrue/wechat/pull/409) ([overtrue](https://github.com/overtrue))\n- 增加微信支付服务商支持 [\\#408](https://github.com/overtrue/wechat/pull/408) ([takatost](https://github.com/takatost))\n- Develop [\\#403](https://github.com/overtrue/wechat/pull/403) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#400](https://github.com/overtrue/wechat/pull/400) ([overtrue](https://github.com/overtrue))\n- Scrutinizer Auto-Fixes [\\#399](https://github.com/overtrue/wechat/pull/399) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n- Develop [\\#398](https://github.com/overtrue/wechat/pull/398) ([overtrue](https://github.com/overtrue))\n- Develop [\\#397](https://github.com/overtrue/wechat/pull/397) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#396](https://github.com/overtrue/wechat/pull/396) ([overtrue](https://github.com/overtrue))\n- Typo & Improve code. [\\#395](https://github.com/overtrue/wechat/pull/395) ([jinchun](https://github.com/jinchun))\n- Develop [\\#394](https://github.com/overtrue/wechat/pull/394) ([overtrue](https://github.com/overtrue))\n- Bugfix close \\#389 [\\#391](https://github.com/overtrue/wechat/pull/391) ([overtrue](https://github.com/overtrue))\n- Update NoticeNoticeTest.php [\\#388](https://github.com/overtrue/wechat/pull/388) ([xiabeifeng](https://github.com/xiabeifeng))\n- Update Notice.php [\\#387](https://github.com/overtrue/wechat/pull/387) ([xiabeifeng](https://github.com/xiabeifeng))\n- Tests for \\#384 [\\#386](https://github.com/overtrue/wechat/pull/386) ([xiabeifeng](https://github.com/xiabeifeng))\n- Improve Notice API. [\\#384](https://github.com/overtrue/wechat/pull/384) ([xiabeifeng](https://github.com/xiabeifeng))\n- 对应根 版本依赖 [\\#382](https://github.com/overtrue/wechat/pull/382) ([parkshinhye](https://github.com/parkshinhye))\n- Develop [\\#381](https://github.com/overtrue/wechat/pull/381) ([overtrue](https://github.com/overtrue))\n- Develop [\\#377](https://github.com/overtrue/wechat/pull/377) ([overtrue](https://github.com/overtrue))\n- Fix test for \\#371 [\\#372](https://github.com/overtrue/wechat/pull/372) ([overtrue](https://github.com/overtrue))\n- 刷卡支付不需要notify\\_url参数 [\\#371](https://github.com/overtrue/wechat/pull/371) ([lilocon](https://github.com/lilocon))\n- Applied fixes from StyleCI [\\#365](https://github.com/overtrue/wechat/pull/365) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#364](https://github.com/overtrue/wechat/pull/364) ([overtrue](https://github.com/overtrue))\n- Merge Develop [\\#363](https://github.com/overtrue/wechat/pull/363) ([overtrue](https://github.com/overtrue))\n- Update composer.json [\\#361](https://github.com/overtrue/wechat/pull/361) ([jaychan](https://github.com/jaychan))\n- Applied fixes from StyleCI [\\#355](https://github.com/overtrue/wechat/pull/355) ([overtrue](https://github.com/overtrue))\n- \\[ci skip\\]fix document typo [\\#354](https://github.com/overtrue/wechat/pull/354) ([lichunqiang](https://github.com/lichunqiang))\n- 自定义Logger [\\#353](https://github.com/overtrue/wechat/pull/353) ([lilocon](https://github.com/lilocon))\n- Update Refund.php [\\#351](https://github.com/overtrue/wechat/pull/351) ([jaring](https://github.com/jaring))\n- Applied fixes from StyleCI [\\#350](https://github.com/overtrue/wechat/pull/350) ([overtrue](https://github.com/overtrue))\n- OpenSSL bugfix. [\\#349](https://github.com/overtrue/wechat/pull/349) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#347](https://github.com/overtrue/wechat/pull/347) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#346](https://github.com/overtrue/wechat/pull/346) ([overtrue](https://github.com/overtrue))\n- Merge Develop [\\#345](https://github.com/overtrue/wechat/pull/345) ([overtrue](https://github.com/overtrue))\n- 添加代码提示 [\\#343](https://github.com/overtrue/wechat/pull/343) ([lilocon](https://github.com/lilocon))\n- Applied fixes from StyleCI [\\#340](https://github.com/overtrue/wechat/pull/340) ([overtrue](https://github.com/overtrue))\n- Fix bug: Payment::downloadBill\\(\\) response error. [\\#339](https://github.com/overtrue/wechat/pull/339) ([overtrue](https://github.com/overtrue))\n- change get\\_client\\_ip to get\\_server\\_ip [\\#335](https://github.com/overtrue/wechat/pull/335) ([tianyong90](https://github.com/tianyong90))\n- Payment SSL. [\\#334](https://github.com/overtrue/wechat/pull/334) ([overtrue](https://github.com/overtrue))\n- Add a helper to get correct client ip address. fixed \\#316 [\\#333](https://github.com/overtrue/wechat/pull/333) ([tianyong90](https://github.com/tianyong90))\n- Dependency Bugfix. overtrue/laravel-wechat\\#24 [\\#332](https://github.com/overtrue/wechat/pull/332) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#330](https://github.com/overtrue/wechat/pull/330) ([overtrue](https://github.com/overtrue))\n- Merge Develop [\\#329](https://github.com/overtrue/wechat/pull/329) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#326](https://github.com/overtrue/wechat/pull/326) ([overtrue](https://github.com/overtrue))\n- Add \border default notify\\_url. [\\#325](https://github.com/overtrue/wechat/pull/325) ([foreverglory](https://github.com/foreverglory))\n- Revert \"Applied fixes from StyleCI\" [\\#323](https://github.com/overtrue/wechat/pull/323) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#322](https://github.com/overtrue/wechat/pull/322) ([overtrue](https://github.com/overtrue))\n- Develop [\\#321](https://github.com/overtrue/wechat/pull/321) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#320](https://github.com/overtrue/wechat/pull/320) ([overtrue](https://github.com/overtrue))\n- 模板消息添加【 获取模板列表】和【 删除模板】接口 [\\#318](https://github.com/overtrue/wechat/pull/318) ([forecho](https://github.com/forecho))\n- Applied fixes from StyleCI [\\#314](https://github.com/overtrue/wechat/pull/314) ([overtrue](https://github.com/overtrue))\n- fix Temporary upload bug [\\#313](https://github.com/overtrue/wechat/pull/313) ([mani95lisa](https://github.com/mani95lisa))\n- Applied fixes from StyleCI [\\#312](https://github.com/overtrue/wechat/pull/312) ([overtrue](https://github.com/overtrue))\n- MerchantPay Class [\\#311](https://github.com/overtrue/wechat/pull/311) ([ac1982](https://github.com/ac1982))\n- Applied fixes from StyleCI [\\#309](https://github.com/overtrue/wechat/pull/309) ([overtrue](https://github.com/overtrue))\n- Merge Develop [\\#308](https://github.com/overtrue/wechat/pull/308) ([overtrue](https://github.com/overtrue))\n- 删除裂变红包接口中的ip参数 [\\#306](https://github.com/overtrue/wechat/pull/306) ([xjchengo](https://github.com/xjchengo))\n- fix code style and some spelling mistakes [\\#303](https://github.com/overtrue/wechat/pull/303) ([jinchun](https://github.com/jinchun))\n- Merge Develop [\\#302](https://github.com/overtrue/wechat/pull/302) ([overtrue](https://github.com/overtrue))\n- Add method for app payment [\\#301](https://github.com/overtrue/wechat/pull/301) ([lichunqiang](https://github.com/lichunqiang))\n- Removed the return syntax [\\#300](https://github.com/overtrue/wechat/pull/300) ([lichunqiang](https://github.com/lichunqiang))\n- add return tag [\\#299](https://github.com/overtrue/wechat/pull/299) ([lichunqiang](https://github.com/lichunqiang))\n- Merge Develop [\\#298](https://github.com/overtrue/wechat/pull/298) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#297](https://github.com/overtrue/wechat/pull/297) ([overtrue](https://github.com/overtrue))\n- \\[ci skip\\]Update .gitattributes [\\#295](https://github.com/overtrue/wechat/pull/295) ([lichunqiang](https://github.com/lichunqiang))\n- Merge Develop [\\#294](https://github.com/overtrue/wechat/pull/294) ([overtrue](https://github.com/overtrue))\n\n## [3.0.1](https://github.com/overtrue/wechat/tree/3.0.1) (2016-02-19)\n[Full Changelog](https://github.com/overtrue/wechat/compare/3.0...3.0.1)\n\n**Closed issues:**\n\n- composer 安装 3.0版本，报错如下： [\\#291](https://github.com/overtrue/wechat/issues/291)\n- \\[3.0\\] 下载永久素材时，微信返回的Content-Type不正确，导致出错。 [\\#290](https://github.com/overtrue/wechat/issues/290)\n- 挖个坑，自己跳 [\\#147](https://github.com/overtrue/wechat/issues/147)\n\n**Merged pull requests:**\n\n- Applied fixes from StyleCI [\\#293](https://github.com/overtrue/wechat/pull/293) ([overtrue](https://github.com/overtrue))\n- Merge Develop [\\#292](https://github.com/overtrue/wechat/pull/292) ([overtrue](https://github.com/overtrue))\n\n## [3.0](https://github.com/overtrue/wechat/tree/3.0) (2016-02-17)\n[Full Changelog](https://github.com/overtrue/wechat/compare/2.1.0...3.0)\n\n**Implemented enhancements:**\n\n- MIME json 格式检查优化 [\\#49](https://github.com/overtrue/wechat/issues/49)\n- 获取 refresh\\_token，access\\_token [\\#43](https://github.com/overtrue/wechat/issues/43)\n- 关于API\\_TOKEN\\_REFRESH [\\#20](https://github.com/overtrue/wechat/issues/20)\n\n**Closed issues:**\n\n- \\[3.0\\] 无法获取用户分组信息 [\\#285](https://github.com/overtrue/wechat/issues/285)\n- 新的laravel 5.2 不能兼容了 [\\#284](https://github.com/overtrue/wechat/issues/284)\n- \\[3.0\\]Message/Article类的$properties内的source\\_url没有正常转换为content\\_source\\_url. [\\#281](https://github.com/overtrue/wechat/issues/281)\n- 3.0删除个性菜单失败 [\\#280](https://github.com/overtrue/wechat/issues/280)\n- 也许你该给一个代码贡献规范 [\\#277](https://github.com/overtrue/wechat/issues/277)\n- 3.0网页授权时scope为snsapi\\_base得不到openid [\\#276](https://github.com/overtrue/wechat/issues/276)\n- wechat3.0中 有2个地方的js调用参数不一样，超哥没有提供 [\\#272](https://github.com/overtrue/wechat/issues/272)\n- 我想知道2.X和3.0有什么大的区别！ [\\#270](https://github.com/overtrue/wechat/issues/270)\n- 2.1： Link 消息类型没有实现 [\\#269](https://github.com/overtrue/wechat/issues/269)\n- 关于模板消息换行的问题 [\\#266](https://github.com/overtrue/wechat/issues/266)\n- easywechat Invalid request [\\#265](https://github.com/overtrue/wechat/issues/265)\n- 40029不合法的oauth\\_code [\\#264](https://github.com/overtrue/wechat/issues/264)\n- 下载素材的一个小问题 [\\#263](https://github.com/overtrue/wechat/issues/263)\n- \\[2.1\\] 微信自定义菜单结构变更导致`Menu::get\\(\\)` 无法读取个性化菜单 [\\#262](https://github.com/overtrue/wechat/issues/262)\n- payment中是不是不包含H5和JS的生成配置文件的方法了？ [\\#261](https://github.com/overtrue/wechat/issues/261)\n- payment下prepare方法bug [\\#260](https://github.com/overtrue/wechat/issues/260)\n- UserServiceProvider中似乎忘记注册user.group了 [\\#256](https://github.com/overtrue/wechat/issues/256)\n- 2.1.X版媒体下载没有扩展名 [\\#252](https://github.com/overtrue/wechat/issues/252)\n- 为什么所有的子模块在自己的库都是develop分支 [\\#247](https://github.com/overtrue/wechat/issues/247)\n- 网页授权使用跳转的bug [\\#246](https://github.com/overtrue/wechat/issues/246)\n- typo of variable [\\#245](https://github.com/overtrue/wechat/issues/245)\n- The implementation class of ServerServiceProvider missing an important  [\\#244](https://github.com/overtrue/wechat/issues/244)\n- \\[3.0\\]\\[payment\\] 两个可能的bug [\\#235](https://github.com/overtrue/wechat/issues/235)\n- 发送多图文 [\\#233](https://github.com/overtrue/wechat/issues/233)\n- 自定义菜单返回应该把个性化自定义菜单也一起返回 [\\#231](https://github.com/overtrue/wechat/issues/231)\n- 发送模板消息 CRUL 错误 [\\#223](https://github.com/overtrue/wechat/issues/223)\n- 客服接口暂时测到有3个bug，麻烦修复 [\\#222](https://github.com/overtrue/wechat/issues/222)\n- JSSDK access\\_token missing [\\#211](https://github.com/overtrue/wechat/issues/211)\n- Js.php/ticket [\\#210](https://github.com/overtrue/wechat/issues/210)\n- 微信支付里有一个收货地址共享 ,超哥你这里没有,可以加一下不? [\\#204](https://github.com/overtrue/wechat/issues/204)\n- 小问题 [\\#203](https://github.com/overtrue/wechat/issues/203)\n- 网页授权 跳转 [\\#202](https://github.com/overtrue/wechat/issues/202)\n- access token 重复添加的问题 [\\#201](https://github.com/overtrue/wechat/issues/201)\n- authorize snsapi\\_base 下可以获取unionid [\\#198](https://github.com/overtrue/wechat/issues/198)\n- 网页授权 [\\#189](https://github.com/overtrue/wechat/issues/189)\n- 一点建议 [\\#188](https://github.com/overtrue/wechat/issues/188)\n- 接口更新-新增临时素材接口变动 [\\#186](https://github.com/overtrue/wechat/issues/186)\n- 接入多个公众号不用id [\\#185](https://github.com/overtrue/wechat/issues/185)\n- \\[Insight\\] Files should not be executable [\\#184](https://github.com/overtrue/wechat/issues/184)\n- 建议不要写死Http [\\#183](https://github.com/overtrue/wechat/issues/183)\n- laravel4.2安装不成功 [\\#182](https://github.com/overtrue/wechat/issues/182)\n- 是否支持laravel4.2 [\\#181](https://github.com/overtrue/wechat/issues/181)\n- 微信出个性化菜单了，希望支持 [\\#180](https://github.com/overtrue/wechat/issues/180)\n- 3.0 composer依赖Symfony2.7。能不能支持Symfony3.0? [\\#179](https://github.com/overtrue/wechat/issues/179)\n- 发送链接类消息错误 [\\#175](https://github.com/overtrue/wechat/issues/175)\n- Throw Exception的时候 Intel server status 设置为200是不是好一些 [\\#174](https://github.com/overtrue/wechat/issues/174)\n- 生成临时二维码时，返回EventKey不是传递的值 [\\#173](https://github.com/overtrue/wechat/issues/173)\n- 关于素材获取的一个建议 [\\#172](https://github.com/overtrue/wechat/issues/172)\n- 能否增加微信APP支付相关方法 [\\#171](https://github.com/overtrue/wechat/issues/171)\n- 微信回调URL回调不到 [\\#170](https://github.com/overtrue/wechat/issues/170)\n- 素材管理添加永久素材返回JSON/XML内容错误 [\\#169](https://github.com/overtrue/wechat/issues/169)\n- \\[消息的使用\\] 中 \\[上传素材文件\\] 的文档示例貌似有误 [\\#168](https://github.com/overtrue/wechat/issues/168)\n- 素材管理里的download方法不是很符合sdk一站式的解决. [\\#165](https://github.com/overtrue/wechat/issues/165)\n- \\[Wechat\\]不合法的oauth\\_code' in /src/Wechat/Http.php:124 [\\#164](https://github.com/overtrue/wechat/issues/164)\n- AccessToken Expired Error Code [\\#163](https://github.com/overtrue/wechat/issues/163)\n- 素材管理接口出错 [\\#162](https://github.com/overtrue/wechat/issues/162)\n- 两处代码php5.4才能运行 [\\#158](https://github.com/overtrue/wechat/issues/158)\n- extension is null when calling `download video` in wechat.media [\\#157](https://github.com/overtrue/wechat/issues/157)\n- Payment/UnifiedOrder does not support serialize or create by array [\\#155](https://github.com/overtrue/wechat/issues/155)\n- 没有找到\"微信支付-\\>查询订单\"相关功能 [\\#150](https://github.com/overtrue/wechat/issues/150)\n- 请教，Cache::setter中your\\_custom\\_set\\_cache怎么使用 [\\#149](https://github.com/overtrue/wechat/issues/149)\n- 发生异常时, 希望能把发送和接收的原始数据记录下来. [\\#148](https://github.com/overtrue/wechat/issues/148)\n- 发送红包，证书错误 [\\#144](https://github.com/overtrue/wechat/issues/144)\n- 发视频消息总返回 -1 [\\#143](https://github.com/overtrue/wechat/issues/143)\n- 关于PHP版本 [\\#141](https://github.com/overtrue/wechat/issues/141)\n- Server消息回复必须以事件方式吗？ [\\#140](https://github.com/overtrue/wechat/issues/140)\n- 微信支付相关文档细化 [\\#138](https://github.com/overtrue/wechat/issues/138)\n- 好奇地问个问题，这项目的测试用例放在哪？ [\\#135](https://github.com/overtrue/wechat/issues/135)\n- 试了两次，真的不会用 [\\#134](https://github.com/overtrue/wechat/issues/134)\n- 不知道这算不算是个BUG [\\#133](https://github.com/overtrue/wechat/issues/133)\n- 微信小店 [\\#130](https://github.com/overtrue/wechat/issues/130)\n- 多次遇到 accesstoken 无效的问题 [\\#129](https://github.com/overtrue/wechat/issues/129)\n- MCH\\_KEY 微信支付 [\\#128](https://github.com/overtrue/wechat/issues/128)\n- 使用flightphp框架,验证URL的时候,在Apache下接入成功,在Nginx接入失败 [\\#126](https://github.com/overtrue/wechat/issues/126)\n- 好东西！可惜没有我需要的微信红包 [\\#125](https://github.com/overtrue/wechat/issues/125)\n- Cache存储部件可定制 [\\#120](https://github.com/overtrue/wechat/issues/120)\n- 关于Bag [\\#119](https://github.com/overtrue/wechat/issues/119)\n- 将代码部署到负载均衡上如何管理access token  [\\#118](https://github.com/overtrue/wechat/issues/118)\n- 消息接受和回复时，如果不对消息做回复，该如何做？ [\\#117](https://github.com/overtrue/wechat/issues/117)\n- 请教一个问题 [\\#116](https://github.com/overtrue/wechat/issues/116)\n- 关于 Cache [\\#115](https://github.com/overtrue/wechat/issues/115)\n- 如何才能获取普通的access\\_token [\\#113](https://github.com/overtrue/wechat/issues/113)\n- $HTTP\\_RAW\\_POST\\_DATA DEPRECATED [\\#111](https://github.com/overtrue/wechat/issues/111)\n- App支付缺少错误码 [\\#109](https://github.com/overtrue/wechat/issues/109)\n- 当用户信息有 \" 字符时系统出错 \\(用户与用户组管理接口\\) [\\#107](https://github.com/overtrue/wechat/issues/107)\n- 提示错误 [\\#106](https://github.com/overtrue/wechat/issues/106)\n- 使用企业号的时候 接入失败啊，在验证url的时候 [\\#104](https://github.com/overtrue/wechat/issues/104)\n- 支付签名错误 [\\#101](https://github.com/overtrue/wechat/issues/101)\n- 微信支付.$payment-\\>getConfig\\(\\)调用时候\\[Wechat\\]系统繁忙,此时请开发者稍候再试. [\\#96](https://github.com/overtrue/wechat/issues/96)\n- wechat/src/Wechat/Payment/UnifiedOrder.php 小问题 [\\#94](https://github.com/overtrue/wechat/issues/94)\n- 请教laravel中如何在微信支付中 catch  UnifiedOrder 抛出的异常？ [\\#93](https://github.com/overtrue/wechat/issues/93)\n- 是否可以增加一个第三方接口融合功能 [\\#91](https://github.com/overtrue/wechat/issues/91)\n- 订单查询 [\\#90](https://github.com/overtrue/wechat/issues/90)\n- 如何不下载图片，通过mediaId获取图片存储的URL [\\#89](https://github.com/overtrue/wechat/issues/89)\n- 'Undefined index: HTTP\\_HOST'  [\\#88](https://github.com/overtrue/wechat/issues/88)\n- Undefined index: HTTP\\_HOST [\\#87](https://github.com/overtrue/wechat/issues/87)\n- 不能上传gif格式的图片素材 [\\#84](https://github.com/overtrue/wechat/issues/84)\n- OAuth重构 [\\#74](https://github.com/overtrue/wechat/issues/74)\n- \\[3.0\\] Tasks [\\#50](https://github.com/overtrue/wechat/issues/50)\n- appId 和 appSecret不要作为各个类的构造参数 [\\#114](https://github.com/overtrue/wechat/issues/114)\n- 增加debug相关的选项 [\\#112](https://github.com/overtrue/wechat/issues/112)\n- 好像没有获取自动回复数据接口 [\\#108](https://github.com/overtrue/wechat/issues/108)\n- js端查看微信卡券接口 chooseCard [\\#79](https://github.com/overtrue/wechat/issues/79)\n- 【新增】支付 [\\#78](https://github.com/overtrue/wechat/issues/78)\n- 模板消息重构 [\\#75](https://github.com/overtrue/wechat/issues/75)\n- 素材下载自动识别MIME生成后缀 [\\#54](https://github.com/overtrue/wechat/issues/54)\n- \\[建议\\] 深度结合微信多图文与素材管理 [\\#46](https://github.com/overtrue/wechat/issues/46)\n- 群发功能 [\\#18](https://github.com/overtrue/wechat/issues/18)\n\n**Merged pull requests:**\n\n- 3.0 [\\#289](https://github.com/overtrue/wechat/pull/289) ([overtrue](https://github.com/overtrue))\n- Merge Develop [\\#288](https://github.com/overtrue/wechat/pull/288) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#287](https://github.com/overtrue/wechat/pull/287) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#286](https://github.com/overtrue/wechat/pull/286) ([overtrue](https://github.com/overtrue))\n- Fix bug in batchGet method. [\\#283](https://github.com/overtrue/wechat/pull/283) ([tianyong90](https://github.com/tianyong90))\n- Typo. [\\#279](https://github.com/overtrue/wechat/pull/279) ([overtrue](https://github.com/overtrue))\n- Add contribution guide. resolves \\#277 [\\#278](https://github.com/overtrue/wechat/pull/278) ([overtrue](https://github.com/overtrue))\n- Develop [\\#274](https://github.com/overtrue/wechat/pull/274) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#273](https://github.com/overtrue/wechat/pull/273) ([overtrue](https://github.com/overtrue))\n- Develop [\\#271](https://github.com/overtrue/wechat/pull/271) ([overtrue](https://github.com/overtrue))\n- Merge Develop [\\#268](https://github.com/overtrue/wechat/pull/268) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#267](https://github.com/overtrue/wechat/pull/267) ([overtrue](https://github.com/overtrue))\n- Update QRCode.php [\\#258](https://github.com/overtrue/wechat/pull/258) ([webshiyue](https://github.com/webshiyue))\n- Add tests for LuckyMoney. [\\#255](https://github.com/overtrue/wechat/pull/255) ([tianyong90](https://github.com/tianyong90))\n- CS. [\\#254](https://github.com/overtrue/wechat/pull/254) ([overtrue](https://github.com/overtrue))\n- Scrutinizer Auto-Fixes [\\#253](https://github.com/overtrue/wechat/pull/253) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n- Applied fixes from StyleCI [\\#251](https://github.com/overtrue/wechat/pull/251) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#250](https://github.com/overtrue/wechat/pull/250) ([overtrue](https://github.com/overtrue))\n- Merge Develop [\\#249](https://github.com/overtrue/wechat/pull/249) ([overtrue](https://github.com/overtrue))\n- Merge Develop [\\#248](https://github.com/overtrue/wechat/pull/248) ([overtrue](https://github.com/overtrue))\n- Merge from Develop [\\#243](https://github.com/overtrue/wechat/pull/243) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#242](https://github.com/overtrue/wechat/pull/242) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#241](https://github.com/overtrue/wechat/pull/241) ([overtrue](https://github.com/overtrue))\n- Add Luckymoney. [\\#240](https://github.com/overtrue/wechat/pull/240) ([tianyong90](https://github.com/tianyong90))\n- Applied fixes from StyleCI [\\#237](https://github.com/overtrue/wechat/pull/237) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#234](https://github.com/overtrue/wechat/pull/234) ([overtrue](https://github.com/overtrue))\n- Multiple News Items Support [\\#230](https://github.com/overtrue/wechat/pull/230) ([fanglinks](https://github.com/fanglinks))\n- Applied fixes from StyleCI [\\#221](https://github.com/overtrue/wechat/pull/221) ([overtrue](https://github.com/overtrue))\n- \\[3.0\\]\\[Bugfix\\]发送图文消息缺少type [\\#217](https://github.com/overtrue/wechat/pull/217) ([sunbiao0526](https://github.com/sunbiao0526))\n- fix Js.php 获取自定义cache对象 [\\#215](https://github.com/overtrue/wechat/pull/215) ([sunbiao0526](https://github.com/sunbiao0526))\n- Applied fixes from StyleCI [\\#197](https://github.com/overtrue/wechat/pull/197) ([overtrue](https://github.com/overtrue))\n- Add alias [\\#196](https://github.com/overtrue/wechat/pull/196) ([ruchengtang](https://github.com/ruchengtang))\n- Applied fixes from StyleCI [\\#195](https://github.com/overtrue/wechat/pull/195) ([overtrue](https://github.com/overtrue))\n- Applied fixes from StyleCI [\\#194](https://github.com/overtrue/wechat/pull/194) ([overtrue](https://github.com/overtrue))\n- Add Broadcast. [\\#193](https://github.com/overtrue/wechat/pull/193) ([ruchengtang](https://github.com/ruchengtang))\n- 微信红包类优化 [\\#190](https://github.com/overtrue/wechat/pull/190) ([tianyong90](https://github.com/tianyong90))\n- Update ServerServiceProvider.php [\\#187](https://github.com/overtrue/wechat/pull/187) ([ghost](https://github.com/ghost))\n- Update README\\_EN.md [\\#178](https://github.com/overtrue/wechat/pull/178) ([spekulatius](https://github.com/spekulatius))\n- 添加群发消息文档 [\\#177](https://github.com/overtrue/wechat/pull/177) ([ruchengtang](https://github.com/ruchengtang))\n- 群发消息 [\\#176](https://github.com/overtrue/wechat/pull/176) ([ruchengtang](https://github.com/ruchengtang))\n- Master [\\#167](https://github.com/overtrue/wechat/pull/167) ([xiaohome](https://github.com/xiaohome))\n- 微信小店 [\\#166](https://github.com/overtrue/wechat/pull/166) ([xiaohome](https://github.com/xiaohome))\n- \b红包类更新 [\\#161](https://github.com/overtrue/wechat/pull/161) ([overtrue](https://github.com/overtrue))\n- 加入摇一摇红包类，红包类提升至Overtrue命名空间 [\\#160](https://github.com/overtrue/wechat/pull/160) ([tianyong90](https://github.com/tianyong90))\n- 2.1 [\\#159](https://github.com/overtrue/wechat/pull/159) ([overtrue](https://github.com/overtrue))\n- Update QRCode.php [\\#156](https://github.com/overtrue/wechat/pull/156) ([ruchengtang](https://github.com/ruchengtang))\n- 修复使用!=，来判断0 != null 的时候的一个bug [\\#154](https://github.com/overtrue/wechat/pull/154) ([Liv1020](https://github.com/Liv1020))\n- 调整多客服类删除客服方法 [\\#151](https://github.com/overtrue/wechat/pull/151) ([tianyong90](https://github.com/tianyong90))\n- 修复个bug [\\#146](https://github.com/overtrue/wechat/pull/146) ([xiaohome](https://github.com/xiaohome))\n- Update README.md [\\#142](https://github.com/overtrue/wechat/pull/142) ([parkshinhye](https://github.com/parkshinhye))\n- Fix code style to PSR-2 [\\#139](https://github.com/overtrue/wechat/pull/139) ([tianyong90](https://github.com/tianyong90))\n- 加入红包工具类，支持现金和裂变红包的发送及查询 [\\#137](https://github.com/overtrue/wechat/pull/137) ([tianyong90](https://github.com/tianyong90))\n- 卡券类批量获取卡券ID方法支持仅获取指定状态卡券 [\\#132](https://github.com/overtrue/wechat/pull/132) ([tianyong90](https://github.com/tianyong90))\n- 添加客服 卡券回复!!! [\\#124](https://github.com/overtrue/wechat/pull/124) ([parkshinhye](https://github.com/parkshinhye))\n- 调整退款类中一处异常抛出逻辑并修正单词拼写错误 [\\#122](https://github.com/overtrue/wechat/pull/122) ([tianyong90](https://github.com/tianyong90))\n- 加入创建卡券货架接口 [\\#121](https://github.com/overtrue/wechat/pull/121) ([tianyong90](https://github.com/tianyong90))\n- 增加退款类 [\\#105](https://github.com/overtrue/wechat/pull/105) ([jaring](https://github.com/jaring))\n- 增加获取用户已领取卡券方法 [\\#103](https://github.com/overtrue/wechat/pull/103) ([tenstone](https://github.com/tenstone))\n- Scrutinizer Auto-Fixes [\\#100](https://github.com/overtrue/wechat/pull/100) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n- 修正二维码类中生成卡券二维码方法 [\\#99](https://github.com/overtrue/wechat/pull/99) ([tianyong90](https://github.com/tianyong90))\n- 卡券接口加入添加测试白名单方法 [\\#98](https://github.com/overtrue/wechat/pull/98) ([tianyong90](https://github.com/tianyong90))\n- 依样画葫芦写了一个查询订单，更改了UnifiedOrder中Http初始化 [\\#95](https://github.com/overtrue/wechat/pull/95) ([jaring](https://github.com/jaring))\n- accessToken根据appId变化 [\\#92](https://github.com/overtrue/wechat/pull/92) ([keepeye](https://github.com/keepeye))\n- Fix payment sign bug. [\\#82](https://github.com/overtrue/wechat/pull/82) ([0i](https://github.com/0i))\n- \\[wiki\\] wechat payment [\\#81](https://github.com/overtrue/wechat/pull/81) ([0i](https://github.com/0i))\n\n## [2.1.0](https://github.com/overtrue/wechat/tree/2.1.0) (2015-08-18)\n[Full Changelog](https://github.com/overtrue/wechat/compare/2.0.35...2.1.0)\n\n**Merged pull requests:**\n\n- Wechat Payment [\\#80](https://github.com/overtrue/wechat/pull/80) ([0i](https://github.com/0i))\n\n## [2.0.35](https://github.com/overtrue/wechat/tree/2.0.35) (2015-08-11)\n[Full Changelog](https://github.com/overtrue/wechat/compare/2.0.1...2.0.35)\n\n**Implemented enhancements:**\n\n- Overtrue\\Wechat\\Http识别JSON的问题 [\\#47](https://github.com/overtrue/wechat/issues/47)\n\n**Fixed bugs:**\n\n- 模板消息简单格式无效 [\\#34](https://github.com/overtrue/wechat/issues/34)\n\n**Closed issues:**\n\n- $data是数组,title输出不了内容 [\\#73](https://github.com/overtrue/wechat/issues/73)\n- 回调是如何传递外部参数的？ [\\#72](https://github.com/overtrue/wechat/issues/72)\n- 【建议】可以添加微信js的功能吗？ [\\#71](https://github.com/overtrue/wechat/issues/71)\n- Message::make\\('link'\\) 无效 [\\#70](https://github.com/overtrue/wechat/issues/70)\n- 监听消息 返回Bad Request [\\#65](https://github.com/overtrue/wechat/issues/65)\n- 微信素材管理小改版，求跟上~ [\\#64](https://github.com/overtrue/wechat/issues/64)\n- 在新浪SAE平台上的部署问题 [\\#63](https://github.com/overtrue/wechat/issues/63)\n- $xmlInput = file\\_get\\_contents\\('php://input'\\);貌似在某些版本的PHP有问题还是怎的 [\\#57](https://github.com/overtrue/wechat/issues/57)\n- 卡券的 attachExtension 方法  [\\#56](https://github.com/overtrue/wechat/issues/56)\n- 网页授权$auth-\\>authorize\\(\\) 后还需要保存access\\_token吗？ [\\#53](https://github.com/overtrue/wechat/issues/53)\n- php 5.6版本下出现错误（5.6以下版本正常） [\\#51](https://github.com/overtrue/wechat/issues/51)\n- 消息发送后服务器无法正确返回响应 [\\#48](https://github.com/overtrue/wechat/issues/48)\n- token验证失败 [\\#45](https://github.com/overtrue/wechat/issues/45)\n- 微信关注自动回复问题 [\\#44](https://github.com/overtrue/wechat/issues/44)\n- js sdk config 建议增加 beta 字段 [\\#35](https://github.com/overtrue/wechat/issues/35)\n- 关于Util\\HTTP::encode\\(\\)中的urlencode\\(\\)/urldecode\\(\\)成组操作的疑问 [\\#31](https://github.com/overtrue/wechat/issues/31)\n- Media::updateNews\\(\\) 方法与微信API不一致 [\\#29](https://github.com/overtrue/wechat/issues/29)\n- 希望能有一个ThinkPHP的使用示例 [\\#28](https://github.com/overtrue/wechat/issues/28)\n- 事件消息 [\\#22](https://github.com/overtrue/wechat/issues/22)\n- 模板消息notice [\\#21](https://github.com/overtrue/wechat/issues/21)\n- 关于获取（接收）用户发送消息 [\\#19](https://github.com/overtrue/wechat/issues/19)\n- 微信公众号绑定的一点问题，请教。 [\\#16](https://github.com/overtrue/wechat/issues/16)\n- 获取素材列表错误 [\\#15](https://github.com/overtrue/wechat/issues/15)\n\n**Merged pull requests:**\n\n- Scrutinizer Auto-Fixes [\\#69](https://github.com/overtrue/wechat/pull/69) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n- Scrutinizer Auto-Fixes [\\#68](https://github.com/overtrue/wechat/pull/68) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n- Scrutinizer Auto-Fixes [\\#67](https://github.com/overtrue/wechat/pull/67) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer))\n- Fixed StyleCI config [\\#66](https://github.com/overtrue/wechat/pull/66) ([GrahamCampbell](https://github.com/GrahamCampbell))\n- 洁癖爆发了。。。 [\\#62](https://github.com/overtrue/wechat/pull/62) ([TheNorthMemory](https://github.com/TheNorthMemory))\n- fix: js getUrl use Url::current\\(\\) [\\#61](https://github.com/overtrue/wechat/pull/61) ([wdjwxh](https://github.com/wdjwxh))\n- bug-fix: add x-forwarded-host for Url::current [\\#60](https://github.com/overtrue/wechat/pull/60) ([wdjwxh](https://github.com/wdjwxh))\n- Fix request method for User::batchGet\\(\\), should be POST with JSON. [\\#59](https://github.com/overtrue/wechat/pull/59) ([acgrid](https://github.com/acgrid))\n- optimize some code [\\#58](https://github.com/overtrue/wechat/pull/58) ([tabalt](https://github.com/tabalt))\n- 增加使用media id发送图文消息的功能 [\\#52](https://github.com/overtrue/wechat/pull/52) ([zengohm](https://github.com/zengohm))\n- fix Staff::delete, let it works [\\#42](https://github.com/overtrue/wechat/pull/42) ([TheNorthMemory](https://github.com/TheNorthMemory))\n- 支持自定义菜单类型：下发消息media\\_id、跳转图文消息view\\_limited [\\#40](https://github.com/overtrue/wechat/pull/40) ([acgrid](https://github.com/acgrid))\n- docline comments & fix AccessToken parameter typos [\\#39](https://github.com/overtrue/wechat/pull/39) ([TheNorthMemory](https://github.com/TheNorthMemory))\n- Merge from master [\\#38](https://github.com/overtrue/wechat/pull/38) ([overtrue](https://github.com/overtrue))\n- 客服接口Bugfix [\\#37](https://github.com/overtrue/wechat/pull/37) ([overtrue](https://github.com/overtrue))\n- fix Staff and AccessToken typos [\\#36](https://github.com/overtrue/wechat/pull/36) ([TheNorthMemory](https://github.com/TheNorthMemory))\n- Update QRCode.php [\\#33](https://github.com/overtrue/wechat/pull/33) ([refear99](https://github.com/refear99))\n- English Readme [\\#32](https://github.com/overtrue/wechat/pull/32) ([hareluya](https://github.com/hareluya))\n- 更新图文消息方法Media::updateNews\\(\\)与微信API不一致 [\\#30](https://github.com/overtrue/wechat/pull/30) ([acgrid](https://github.com/acgrid))\n- 代码之美在于不断修正 :\\) [\\#27](https://github.com/overtrue/wechat/pull/27) ([TheNorthMemory](https://github.com/TheNorthMemory))\n- the json\\_encode $depth parameter was added@5.5.0 [\\#26](https://github.com/overtrue/wechat/pull/26) ([TheNorthMemory](https://github.com/TheNorthMemory))\n- fix \\#4 for PHP5.3 [\\#25](https://github.com/overtrue/wechat/pull/25) ([TheNorthMemory](https://github.com/TheNorthMemory))\n- fix \\#4 for PHP5.3 [\\#23](https://github.com/overtrue/wechat/pull/23) ([TheNorthMemory](https://github.com/TheNorthMemory))\n- Update QRCode.php [\\#17](https://github.com/overtrue/wechat/pull/17) ([gundanx10](https://github.com/gundanx10))\n\n## [2.0.1](https://github.com/overtrue/wechat/tree/2.0.1) (2015-05-08)\n[Full Changelog](https://github.com/overtrue/wechat/compare/2.0.0...2.0.1)\n\n**Closed issues:**\n\n- 2.0版本使用问题 [\\#14](https://github.com/overtrue/wechat/issues/14)\n\n## [2.0.0](https://github.com/overtrue/wechat/tree/2.0.0) (2015-05-07)\n[Full Changelog](https://github.com/overtrue/wechat/compare/1.0.1...2.0.0)\n\n**Closed issues:**\n\n-  素材管理 -- 部分图片下载失败 [\\#13](https://github.com/overtrue/wechat/issues/13)\n-  素材管理 -- 图片下载失败 [\\#12](https://github.com/overtrue/wechat/issues/12)\n- 请问这样判断Mcrypt到底准不准? [\\#11](https://github.com/overtrue/wechat/issues/11)\n- 好奇怪啊，开发者中心的服务器配置已经提交并验证成功了，可是message不起作用 [\\#10](https://github.com/overtrue/wechat/issues/10)\n- 网页授权一刷新页面就出现40029 不合法的oauth\\_code [\\#8](https://github.com/overtrue/wechat/issues/8)\n- mcrypt\\_module\\_open error [\\#7](https://github.com/overtrue/wechat/issues/7)\n- composer update 之后报错 [\\#6](https://github.com/overtrue/wechat/issues/6)\n- 今天开始，授权时候一直报40029，invalid  code的错误 [\\#5](https://github.com/overtrue/wechat/issues/5)\n- Using $this when not in object context [\\#4](https://github.com/overtrue/wechat/issues/4)\n- 监听事件时不区分 $target（监听所有event和message） [\\#3](https://github.com/overtrue/wechat/issues/3)\n- Does this support Oauth already? [\\#1](https://github.com/overtrue/wechat/issues/1)\n\n**Merged pull requests:**\n\n- Fix wiki url error [\\#9](https://github.com/overtrue/wechat/pull/9) ([sinoon](https://github.com/sinoon))\n- Update Bag.php [\\#2](https://github.com/overtrue/wechat/pull/2) ([zerozh](https://github.com/zerozh))\n\n## [1.0.1](https://github.com/overtrue/wechat/tree/1.0.1) (2015-03-19)\n[Full Changelog](https://github.com/overtrue/wechat/compare/1.0...1.0.1)\n\n## [1.0](https://github.com/overtrue/wechat/tree/1.0) (2015-03-13)\n\n\n\\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/CONTRIBUTING.md",
    "content": "# Contribute\n\n## Introduction\n\nFirst, thank you for considering contributing to wechat! It's people like you that make the open source community such a great community! 😊\n\nWe welcome any type of contribution, not only code. You can help with \n- **QA**: file bug reports, the more details you can give the better (e.g. screenshots with the console open)\n- **Marketing**: writing blog posts, howto's, printing stickers, ...\n- **Community**: presenting the project at meetups, organizing a dedicated meetup for the local community, ...\n- **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.\n- **Money**: we welcome financial contributions in full transparency on our [open collective](https://opencollective.com/wechat).\n\n## Your First Contribution\n\nWorking 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).\n\n## Submitting code\n\nAny 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.\n\n## Code review process\n\nThe 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.\nIt is also always helpful to have some context for your pull request. What was the purpose? Why does it matter to you?\n\n## Financial contributions\n\nWe also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/wechat).\nAnyone 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.\n\n## Questions\n\nIf 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!).\nYou can also reach us at hello@wechat.opencollective.com.\n\n## Credits\n\n### Contributors\n\nThank you to all the people who have already contributed to wechat!\n<a href=\"graphs/contributors\"><img src=\"https://opencollective.com/wechat/contributors.svg?width=890\" /></a>\n\n\n### Backers\n\nThank you to all our backers! [[Become a backer](https://opencollective.com/wechat#backer)]\n\n<a href=\"https://opencollective.com/wechat#backers\" target=\"_blank\"><img src=\"https://opencollective.com/wechat/backers.svg?width=890\"></a>\n\n\n### Sponsors\n\nThank 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))\n\n<a href=\"https://opencollective.com/wechat/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/wechat/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/wechat/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/wechat/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/wechat/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/wechat/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/wechat/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/wechat/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/wechat/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/wechat/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/wechat/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/wechat/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/wechat/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/wechat/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/wechat/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/wechat/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/wechat/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/wechat/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/wechat/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/wechat/sponsor/9/avatar.svg\"></a>\n\n<!-- This `CONTRIBUTING.md` is based on @nayafia's template https://github.com/nayafia/contributing-template -->"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) overtrue <i@overtrue.me>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/README.md",
    "content": "<h1 align=\"left\"><a href=\"https://www.easywechat.com\">EasyWeChat</a></h1>\n\n📦 一个 PHP 微信开发 SDK。\n\n[![Test Status](https://github.com/w7corp/easywechat/workflows/Test/badge.svg)](https://github.com/w7corp/easywechat/actions) \n[![Lint Status](https://github.com/w7corp/easywechat/workflows/Lint/badge.svg)](https://github.com/w7corp/easywechat/actions) \n[![Latest Stable Version](https://poser.pugx.org/w7corp/easywechat/v/stable.svg)](https://packagist.org/packages/w7corp/easywechat) \n[![Latest Unstable Version](https://poser.pugx.org/w7corp/easywechat/v/unstable.svg)](https://packagist.org/packages/w7corp/easywechat)\n[![Total Downloads](https://poser.pugx.org/w7corp/easywechat/downloads)](https://packagist.org/packages/w7corp/easywechat) \n[![License](https://poser.pugx.org/w7corp/easywechat/license)](https://packagist.org/packages/w7corp/easywechat) \n[![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev)\n\n> 📣 **公告**\n> \n>  为了更好的推进项目发展，保障项目更新迭代速度，EasyWeChat 正式并入微擎旗下，加上微擎团队的助力，将会为大家提供更强大更稳固更多元化的开源项目。\n>\n> - 微擎与 EasyWeChat 结合，基于微擎技术资源方面的优势，将积极发展 EasyWeChat 的开源社区，将为 EasyWeChat 开源项目注入巨大活力。\n> - EasyWeChat 原作者 overtrue 将继续担任开源项目的核心开发者，继续参与项目的发展规划，共同打造更强大的开源生态社区。\n> - 项目从 6.0 版本开始将修改包名为 `w7corp/easywechat`，5.x 及以下版本不受影响。\n\n> 🚨 注意：请 PR 时往 5.x 提交，感谢您的贡献！\n\n\n## Requirement\n\n1. PHP >= 7.4\n2. **[Composer](https://getcomposer.org/)**\n3. openssl 拓展\n4. fileinfo 拓展（素材管理模块需要用到）\n\n## Installation\n\n```shell\n$ composer require \"overtrue/wechat:^5.0\" -vvv\n```\n\n## Usage\n\n基本使用（以服务端为例）:\n\n```php\n<?php\n\nuse EasyWeChat\\Factory;\n\n$options = [\n    'app_id'    => 'wx3cf0f39249eb0exxx',\n    'secret'    => 'f1c242f4f28f735d4687abb469072xxx',\n    'token'     => 'easywechat',\n    'log' => [\n        'level' => 'debug',\n        'file'  => '/tmp/easywechat.log',\n    ],\n    // ...\n];\n\n$app = Factory::officialAccount($options);\n\n$server = $app->server;\n$user = $app->user;\n\n$server->push(function($message) use ($user) {\n    $fromUser = $user->get($message['FromUserName']);\n\n    return \"{$fromUser->nickname} 您好！欢迎关注 overtrue!\";\n});\n\n$server->serve()->send();\n```\n\n更多请参考 [https://www.easywechat.com/](https://www.easywechat.com/)。\n\n## Documentation\n\n[官网](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)\n\n## Integration\n\n[Laravel 5 拓展包: overtrue/laravel-wechat](https://github.com/overtrue/laravel-wechat)\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n<a href=\"https://github.com/overtrue/wechat/graphs/contributors\"><img src=\"https://opencollective.com/wechat/contributors.svg?width=890\" /></a>\n\n\n## PHP 扩展包开发\n\n> 想知道如何从零开始构建 PHP 扩展包？\n>\n> 请关注我的实战课程，我会在此课程中分享一些扩展开发经验 —— [《PHP 扩展包实战教程 - 从入门到发布》](https://learnku.com/courses/creating-package)\n\n\n## License\n\nMIT\n\n\n[![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)\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/SECURITY.md",
    "content": "# 更新策略\n\n从最初的稳定版本开始，EasyWeChat 的每个发行分支都会得到两年的全面支持。在这期间，被报告的错误和安全问题会被修复并发布。\n在这两年的积极支持期之后，每个分支再被支持一年，只针对关键安全问题。在此期间的发布是根据需要进行的：根据报告的数量，可能有多个版本发布，也可能没有。\n\n## 当前支持版本情况\n\n| 版本     |      发布日期     |      积极维护更新      |         安全性修复         |\n| ------- | ---------------- | -------------------- | ------------------------- |\n| 6.x     |    2022.02.02    |      2024.02.02      |        2025.02.02         |\n| 5.x     |    2020.07.27    |      2022.07.27      |        2023.07.27         |\n| 4.x     |    2017.12.12    |      2019.12.12      |        2020.12.12         |\n| 3.x     |    2016.02.19    |      2018.02.19      |        2019.02.19         |\n| 2.x     |    2015.05.06    |      2017.05.06      |        2018.05.06         |\n| 1.x     |    2015.02.13    |      2017.02.13      |        2017.02.13         |\n\n\n## 报告安全问题\n\n\n如果您发现 EasyWeChat 有安全漏洞，请发送电子邮件至 anzhengchao@gmail.com。所有的安全漏洞都会得到及时的解决。\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/composer.json",
    "content": "{\n  \"name\": \"overtrue/wechat\",\n  \"description\": \"微信SDK\",\n  \"keywords\": [\n    \"easywechat\",\n    \"wechat\",\n    \"weixin\",\n    \"weixin-sdk\",\n    \"sdk\"\n  ],\n  \"license\": \"MIT\",\n  \"authors\": [\n    {\n      \"name\": \"overtrue\",\n      \"email\": \"anzhengchao@gmail.com\"\n    }\n  ],\n  \"require\": {\n    \"php\": \">=7.4\",\n    \"ext-fileinfo\": \"*\",\n    \"ext-openssl\": \"*\",\n    \"ext-simplexml\": \"*\",\n    \"easywechat-composer/easywechat-composer\": \"^1.1\",\n    \"guzzlehttp/guzzle\": \"^6.2 || ^7.0\",\n    \"monolog/monolog\": \"^1.22 || ^2.0 || ^3.0\",\n    \"overtrue/socialite\": \"^3.2 || ^4.0\",\n    \"pimple/pimple\": \"^3.0\",\n    \"psr/simple-cache\": \"^1.0||^2.0||^3.0\",\n    \"symfony/cache\": \"^3.3 || ^4.3 || ^5.0 || ^6.0\",\n    \"symfony/event-dispatcher\": \"^4.3 || ^5.0 || ^6.0\",\n    \"symfony/http-foundation\": \"^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0\",\n    \"symfony/psr-http-message-bridge\": \"^0.3 || ^1.0 || ^2.0\",\n    \"ext-libxml\": \"*\"\n  },\n  \"require-dev\": {\n    \"friendsofphp/php-cs-fixer\": \"^3.5.0\",\n    \"brainmaestro/composer-git-hooks\": \"^2.7\",\n    \"mikey179/vfsstream\": \"^1.6\",\n    \"mockery/mockery\": \"^1.2.3\",\n    \"phpstan/phpstan\": \"^0.12.0\",\n    \"phpunit/phpunit\": \"^9.3\",\n    \"dms/phpunit-arraysubset-asserts\": \"^0.2.0\"\n  },\n  \"autoload\": {\n    \"psr-4\": {\n      \"EasyWeChat\\\\\": \"src/\"\n    },\n    \"files\": [\n      \"src/Kernel/Support/Helpers.php\",\n      \"src/Kernel/Helpers.php\"\n    ]\n  },\n  \"autoload-dev\": {\n    \"psr-4\": {\n      \"EasyWeChat\\\\Tests\\\\\": \"tests/\"\n    }\n  },\n  \"extra\": {\n    \"hooks\": {\n      \"pre-commit\": [\n        \"composer test\",\n        \"composer fix-style\"\n      ],\n      \"pre-push\": [\n        \"composer test\",\n        \"composer fix-style\"\n      ]\n    }\n  },\n  \"scripts\": {\n    \"post-update-cmd\": [\n      \"cghooks update\"\n    ],\n    \"post-merge\": \"composer install\",\n    \"post-install-cmd\": [\n      \"cghooks add --ignore-lock\",\n      \"cghooks update\"\n    ],\n    \"phpstan\": \"vendor/bin/phpstan analyse\",\n    \"check-style\": \"vendor/bin/php-cs-fixer fix --using-cache=no --diff --config=.php-cs-fixer.dist.php --dry-run --ansi\",\n    \"fix-style\": \"vendor/bin/php-cs-fixer fix --using-cache=no --config=.php-cs-fixer.dist.php --ansi\",\n    \"test\": \"vendor/bin/phpunit --colors=always --testdox\"\n  },\n  \"config\": {\n    \"allow-plugins\": {\n      \"easywechat-composer/easywechat-composer\": true\n    }\n  }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\BasicService;\n\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Class Application.\n *\n * @author overtrue <i@overtrue.me>\n *\n * @property \\EasyWeChat\\BasicService\\Jssdk\\Client           $jssdk\n * @property \\EasyWeChat\\BasicService\\Media\\Client           $media\n * @property \\EasyWeChat\\BasicService\\QrCode\\Client          $qrcode\n * @property \\EasyWeChat\\BasicService\\Url\\Client             $url\n * @property \\EasyWeChat\\BasicService\\ContentSecurity\\Client $content_security\n */\nclass Application extends ServiceContainer\n{\n    /**\n     * @var array\n     */\n    protected $providers = [\n        Jssdk\\ServiceProvider::class,\n        QrCode\\ServiceProvider::class,\n        Media\\ServiceProvider::class,\n        Url\\ServiceProvider::class,\n        ContentSecurity\\ServiceProvider::class,\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/ContentSecurity/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\BasicService\\ContentSecurity;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class Client.\n *\n * @author tianyong90 <412039588@qq.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Text content security check.\n     *\n     * @param string $text\n     * @param array $extra\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function checkText(string $text, array $extra = [])\n    {\n        $params = array_merge(['content' => $text], $extra);\n\n        return $this->httpPostJson('wxa/msg_sec_check', $params);\n    }\n\n    /**\n     * Image security check.\n     *\n     * @param string $path\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function checkImage(string $path)\n    {\n        return $this->httpUpload('wxa/img_sec_check', ['media' => $path]);\n    }\n\n    /**\n     * Media security check.\n     *\n     * @param string $mediaUrl\n     * @param int    $mediaType\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function checkMediaAsync(string $mediaUrl, int $mediaType)\n    {\n        /*\n         * 1:音频;2:图片\n         */\n        $mediaTypes = [1, 2];\n\n        if (!in_array($mediaType, $mediaTypes, true)) {\n            throw new InvalidArgumentException('media type must be 1 or 2');\n        }\n\n        $params = [\n            'media_url' => $mediaUrl,\n            'media_type' => $mediaType,\n        ];\n\n        return $this->httpPostJson('wxa/media_check_async', $params);\n    }\n\n    /**\n     * Image security check async.\n     *\n     * @param string $mediaUrl\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function checkImageAsync(string $mediaUrl)\n    {\n        return $this->checkMediaAsync($mediaUrl, 2);\n    }\n\n    /**\n     * Audio security check async.\n     *\n     * @param string $mediaUrl\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function checkAudioAsync(string $mediaUrl)\n    {\n        return $this->checkMediaAsync($mediaUrl, 1);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/ContentSecurity/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\BasicService\\ContentSecurity;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['content_security'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Jssdk/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\BasicService\\Jssdk;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Support;\nuse EasyWeChat\\Kernel\\Traits\\InteractsWithCache;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    use InteractsWithCache;\n\n    /**\n     * @var string\n     */\n    protected $ticketEndpoint = 'cgi-bin/ticket/getticket';\n\n    /**\n     * Current URI.\n     *\n     * @var string\n     */\n    protected $url;\n\n    /**\n     * Get config json for jsapi.\n     *\n     * @param array       $jsApiList\n     * @param bool        $debug\n     * @param bool        $beta\n     * @param bool        $json\n     * @param array       $openTagList\n     * @param string|null $url\n     *\n     * @return array|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function buildConfig(array $jsApiList, bool $debug = false, bool $beta = false, bool $json = true, array $openTagList = [], string $url = null)\n    {\n        $config = array_merge(compact('debug', 'beta', 'jsApiList', 'openTagList'), $this->configSignature($url));\n\n        return $json ? json_encode($config) : $config;\n    }\n\n    /**\n     * Return jsapi config as a PHP array.\n     *\n     * @param array       $apis\n     * @param bool        $debug\n     * @param bool        $beta\n     * @param array       $openTagList\n     * @param string|null $url\n     *\n     * @return array|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getConfigArray(array $apis, bool $debug = false, bool $beta = false, array $openTagList = [], string $url = null)\n    {\n        return $this->buildConfig($apis, $debug, $beta, false, $openTagList, $url);\n    }\n\n    /**\n     * Get js ticket.\n     *\n     * @param bool   $refresh\n     * @param string $type\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function getTicket(bool $refresh = false, string $type = 'jsapi'): array\n    {\n        $cacheKey = sprintf('easywechat.basic_service.jssdk.ticket.%s.%s', $type, $this->getAppId());\n\n        if (!$refresh && $this->getCache()->has($cacheKey)) {\n            return $this->getCache()->get($cacheKey);\n        }\n\n        /** @var array<string, mixed> $result */\n        $result = $this->castResponseToType(\n            $this->requestRaw($this->ticketEndpoint, 'GET', ['query' => ['type' => $type]]),\n            'array'\n        );\n\n        $this->getCache()->set($cacheKey, $result, $result['expires_in'] - 500);\n\n        if (!$this->getCache()->has($cacheKey)) {\n            throw new RuntimeException('Failed to cache jssdk ticket.');\n        }\n\n        return $result;\n    }\n\n    /**\n     * Build signature.\n     *\n     * @param string|null $url\n     * @param string|null $nonce\n     * @param null        $timestamp\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    protected function configSignature(string $url = null, string $nonce = null, $timestamp = null): array\n    {\n        $url = $url ?: $this->getUrl();\n        $nonce = $nonce ?: Support\\Str::quickRandom(10);\n        $timestamp = $timestamp ?: time();\n\n        return [\n            'appId' => $this->getAppId(),\n            'nonceStr' => $nonce,\n            'timestamp' => $timestamp,\n            'url' => $url,\n            'signature' => $this->getTicketSignature($this->getTicket()['ticket'], $nonce, $timestamp, $url),\n        ];\n    }\n\n    /**\n     * Sign the params.\n     *\n     * @param string $ticket\n     * @param string $nonce\n     * @param int    $timestamp\n     * @param string $url\n     *\n     * @return string\n     */\n    public function getTicketSignature($ticket, $nonce, $timestamp, $url): string\n    {\n        return sha1(sprintf('jsapi_ticket=%s&noncestr=%s&timestamp=%s&url=%s', $ticket, $nonce, $timestamp, $url));\n    }\n\n    /**\n     * @return string\n     */\n    public function dictionaryOrderSignature()\n    {\n        $params = func_get_args();\n\n        sort($params, SORT_STRING);\n\n        return sha1(implode('', $params));\n    }\n\n    /**\n     * Set current url.\n     *\n     * @param string $url\n     *\n     * @return $this\n     */\n    public function setUrl(string $url)\n    {\n        $this->url = $url;\n\n        return $this;\n    }\n\n    /**\n     * Get current url.\n     *\n     * @return string\n     */\n    public function getUrl(): string\n    {\n        if ($this->url) {\n            return $this->url;\n        }\n\n        return Support\\current_url();\n    }\n\n    /**\n     * @return string\n     */\n    protected function getAppId()\n    {\n        return $this->app['config']->get('app_id');\n    }\n\n    /**\n     * @return string\n     */\n    protected function getAgentId()\n    {\n        return $this->app['config']->get('agent_id');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Jssdk/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\BasicService\\Jssdk;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['jssdk'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Media/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\BasicService\\Media;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\Http\\StreamResponse;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Allow media type.\n     *\n     * @var array\n     */\n    protected $allowTypes = ['image', 'voice', 'video', 'thumb'];\n\n    /**\n     * Upload image.\n     *\n     * @param string $path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadImage($path)\n    {\n        return $this->upload('image', $path);\n    }\n\n    /**\n     * Upload video.\n     *\n     * @param string $path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadVideo($path)\n    {\n        return $this->upload('video', $path);\n    }\n\n    /**\n     * @param string $path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadVoice($path)\n    {\n        return $this->upload('voice', $path);\n    }\n\n    /**\n     * @param string $path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadThumb($path)\n    {\n        return $this->upload('thumb', $path);\n    }\n\n    /**\n     * Upload temporary material.\n     *\n     * @param string $type\n     * @param string $path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function upload(string $type, string $path)\n    {\n        if (!file_exists($path) || !is_readable($path)) {\n            throw new InvalidArgumentException(sprintf(\"File does not exist, or the file is unreadable: '%s'\", $path));\n        }\n\n        if (!in_array($type, $this->allowTypes, true)) {\n            throw new InvalidArgumentException(sprintf(\"Unsupported media type: '%s'\", $type));\n        }\n\n        return $this->httpUpload('cgi-bin/media/upload', ['media' => $path], ['type' => $type]);\n    }\n\n    /**\n     * @param string $path\n     * @param string $title\n     * @param string $description\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadVideoForBroadcasting(string $path, string $title, string $description)\n    {\n        $response = $this->uploadVideo($path);\n        /** @var array $arrayResponse */\n        $arrayResponse = $this->detectAndCastResponseToType($response, 'array');\n\n        if (!empty($arrayResponse['media_id'])) {\n            return $this->createVideoForBroadcasting($arrayResponse['media_id'], $title, $description);\n        }\n\n        return $response;\n    }\n\n    /**\n     * @param string $mediaId\n     * @param string $title\n     * @param string $description\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createVideoForBroadcasting(string $mediaId, string $title, string $description)\n    {\n        return $this->httpPostJson('cgi-bin/media/uploadvideo', [\n            'media_id' => $mediaId,\n            'title' => $title,\n            'description' => $description,\n        ]);\n    }\n\n    /**\n     * Fetch item from WeChat server.\n     *\n     * @param string $mediaId\n     *\n     * @return \\EasyWeChat\\Kernel\\Http\\StreamResponse|\\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $mediaId)\n    {\n        $response = $this->requestRaw('cgi-bin/media/get', 'GET', [\n            'query' => [\n                'media_id' => $mediaId,\n            ],\n        ]);\n\n        if (false !== stripos($response->getHeaderLine('Content-disposition'), 'attachment')) {\n            return StreamResponse::buildFromPsrResponse($response);\n        }\n\n        return $this->castResponseToType($response, $this->app['config']->get('response_type'));\n    }\n\n    /**\n     * @param string $mediaId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Http\\Response|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getJssdkMedia(string $mediaId)\n    {\n        $response = $this->requestRaw('cgi-bin/media/get/jssdk', 'GET', [\n            'query' => [\n                'media_id' => $mediaId,\n            ],\n        ]);\n\n        if (false !== stripos($response->getHeaderLine('Content-disposition'), 'attachment')) {\n            return StreamResponse::buildFromPsrResponse($response);\n        }\n\n        return $this->castResponseToType($response, $this->app['config']->get('response_type'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Media/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\n/**\n * ServiceProvider.php.\n *\n * This file is part of the wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\BasicService\\Media;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['media'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/QrCode/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\BasicService\\QrCode;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    public const DAY = 86400;\n    public const SCENE_MAX_VALUE = 100000;\n    public const SCENE_QR_CARD = 'QR_CARD';\n    public const SCENE_QR_TEMPORARY = 'QR_SCENE';\n    public const SCENE_QR_TEMPORARY_STR = 'QR_STR_SCENE';\n    public const SCENE_QR_FOREVER = 'QR_LIMIT_SCENE';\n    public const SCENE_QR_FOREVER_STR = 'QR_LIMIT_STR_SCENE';\n\n    /**\n     * Create forever QR code.\n     *\n     * @param string|int $sceneValue\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function forever($sceneValue)\n    {\n        if (is_int($sceneValue) && $sceneValue > 0 && $sceneValue < self::SCENE_MAX_VALUE) {\n            $type = self::SCENE_QR_FOREVER;\n            $sceneKey = 'scene_id';\n        } else {\n            $type = self::SCENE_QR_FOREVER_STR;\n            $sceneKey = 'scene_str';\n        }\n        $scene = [$sceneKey => $sceneValue];\n\n        return $this->create($type, $scene, false);\n    }\n\n    /**\n     * Create temporary QR code.\n     *\n     * @param string|int $sceneValue\n     * @param int|null   $expireSeconds\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function temporary($sceneValue, $expireSeconds = null)\n    {\n        if (is_int($sceneValue) && $sceneValue > 0) {\n            $type = self::SCENE_QR_TEMPORARY;\n            $sceneKey = 'scene_id';\n        } else {\n            $type = self::SCENE_QR_TEMPORARY_STR;\n            $sceneKey = 'scene_str';\n        }\n        $scene = [$sceneKey => $sceneValue];\n\n        return $this->create($type, $scene, true, $expireSeconds);\n    }\n\n    /**\n     * Return url for ticket.\n     * Detail: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542 .\n     *\n     * @param string $ticket\n     *\n     * @return string\n     */\n    public function url($ticket)\n    {\n        return sprintf('https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s', urlencode($ticket));\n    }\n\n    /**\n     * Create a QrCode.\n     *\n     * @param string $actionName\n     * @param array  $actionInfo\n     * @param bool   $temporary\n     * @param int    $expireSeconds\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function create($actionName, $actionInfo, $temporary = true, $expireSeconds = null)\n    {\n        null !== $expireSeconds || $expireSeconds = 7 * self::DAY;\n\n        $params = [\n            'action_name' => $actionName,\n            'action_info' => ['scene' => $actionInfo],\n        ];\n\n        if ($temporary) {\n            $params['expire_seconds'] = min($expireSeconds, 30 * self::DAY);\n        }\n\n        return $this->httpPostJson('cgi-bin/qrcode/create', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/QrCode/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\BasicService\\QrCode;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['qrcode'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Url/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\BasicService\\Url;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Shorten the url.\n     *\n     * @param string $url\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function shorten(string $url)\n    {\n        $params = [\n            'action' => 'long2short',\n            'long_url' => $url,\n        ];\n\n        return $this->httpPostJson('cgi-bin/shorturl', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Url/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\BasicService\\Url;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['url'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Factory.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat;\n\n/**\n * Class Factory.\n *\n * @method static \\EasyWeChat\\Payment\\Application            payment(array $config)\n * @method static \\EasyWeChat\\MiniProgram\\Application        miniProgram(array $config)\n * @method static \\EasyWeChat\\OpenPlatform\\Application       openPlatform(array $config)\n * @method static \\EasyWeChat\\OfficialAccount\\Application    officialAccount(array $config)\n * @method static \\EasyWeChat\\BasicService\\Application       basicService(array $config)\n * @method static \\EasyWeChat\\Work\\Application               work(array $config)\n * @method static \\EasyWeChat\\OpenWork\\Application           openWork(array $config)\n * @method static \\EasyWeChat\\MicroMerchant\\Application      microMerchant(array $config)\n */\nclass Factory\n{\n    /**\n     * @param string $name\n     * @param array  $config\n     *\n     * @return \\EasyWeChat\\Kernel\\ServiceContainer\n     */\n    public static function make($name, array $config)\n    {\n        $namespace = Kernel\\Support\\Str::studly($name);\n        $application = \"\\\\EasyWeChat\\\\{$namespace}\\\\Application\";\n\n        return new $application($config);\n    }\n\n    /**\n     * Dynamically pass methods to the application.\n     *\n     * @param string $name\n     * @param array  $arguments\n     *\n     * @return mixed\n     */\n    public static function __callStatic($name, $arguments)\n    {\n        return self::make($name, ...$arguments);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/AccessToken.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel;\n\nuse EasyWeChat\\Kernel\\Contracts\\AccessTokenInterface;\nuse EasyWeChat\\Kernel\\Exceptions\\HttpException;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Traits\\HasHttpRequests;\nuse EasyWeChat\\Kernel\\Traits\\InteractsWithCache;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Class AccessToken.\n *\n * @author overtrue <i@overtrue.me>\n */\nabstract class AccessToken implements AccessTokenInterface\n{\n    use HasHttpRequests;\n    use InteractsWithCache;\n\n    /**\n     * @var \\EasyWeChat\\Kernel\\ServiceContainer\n     */\n    protected $app;\n\n    /**\n     * @var string\n     */\n    protected $requestMethod = 'GET';\n\n    /**\n     * @var string\n     */\n    protected $endpointToGetToken;\n\n    /**\n     * @var string\n     */\n    protected $queryName;\n\n    /**\n     * @var array\n     */\n    protected $token;\n\n    /**\n     * @var string\n     */\n    protected $tokenKey = 'access_token';\n\n    /**\n     * @var string\n     */\n    protected $cachePrefix = 'easywechat.kernel.access_token.';\n\n    /**\n     * AccessToken constructor.\n     *\n     * @param \\EasyWeChat\\Kernel\\ServiceContainer $app\n     */\n    public function __construct(ServiceContainer $app)\n    {\n        $this->app = $app;\n    }\n\n    public function getLastToken(): array\n    {\n        return $this->token;\n    }\n\n    /**\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\HttpException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function getRefreshedToken(): array\n    {\n        return $this->getToken(true);\n    }\n\n    /**\n     * @param bool $refresh\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\HttpException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function getToken(bool $refresh = false): array\n    {\n        $cacheKey = $this->getCacheKey();\n        $cache = $this->getCache();\n\n        if (!$refresh && $cache->has($cacheKey) && $result = $cache->get($cacheKey)) {\n            return $result;\n        }\n\n        /** @var array $token */\n        $token = $this->requestToken($this->getCredentials(), true);\n\n        $this->setToken($token[$this->tokenKey], $token['expires_in'] ?? 7200);\n\n        $this->token = $token;\n\n        $this->app->events->dispatch(new Events\\AccessTokenRefreshed($this));\n\n        return $token;\n    }\n\n    /**\n     * @param string $token\n     * @param int    $lifetime\n     *\n     * @return \\EasyWeChat\\Kernel\\Contracts\\AccessTokenInterface\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function setToken(string $token, int $lifetime = 7200): AccessTokenInterface\n    {\n        $this->getCache()->set($this->getCacheKey(), [\n            $this->tokenKey => $token,\n            'expires_in' => $lifetime,\n        ], $lifetime);\n\n        if (!$this->getCache()->has($this->getCacheKey())) {\n            throw new RuntimeException('Failed to cache access token.');\n        }\n\n        return $this;\n    }\n\n    /**\n     * @return \\EasyWeChat\\Kernel\\Contracts\\AccessTokenInterface\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\HttpException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function refresh(): AccessTokenInterface\n    {\n        $this->getToken(true);\n\n        return $this;\n    }\n\n    /**\n     * @param array $credentials\n     * @param bool  $toArray\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\HttpException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function requestToken(array $credentials, $toArray = false)\n    {\n        $response = $this->sendRequest($credentials);\n        $result = json_decode($response->getBody()->getContents(), true);\n        $formatted = $this->castResponseToType($response, $this->app['config']->get('response_type'));\n\n        if (empty($result[$this->tokenKey])) {\n            throw new HttpException('Request access_token fail: '.json_encode($result, JSON_UNESCAPED_UNICODE), $response, $formatted);\n        }\n\n        return $toArray ? $result : $formatted;\n    }\n\n    /**\n     * @param \\Psr\\Http\\Message\\RequestInterface $request\n     * @param array                              $requestOptions\n     *\n     * @return \\Psr\\Http\\Message\\RequestInterface\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\HttpException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function applyToRequest(RequestInterface $request, array $requestOptions = []): RequestInterface\n    {\n        parse_str($request->getUri()->getQuery(), $query);\n\n        $query = http_build_query(array_merge($this->getQuery(), $query));\n\n        return $request->withUri($request->getUri()->withQuery($query));\n    }\n\n    /**\n     * Send http request.\n     *\n     * @param array $credentials\n     *\n     * @return ResponseInterface\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function sendRequest(array $credentials): ResponseInterface\n    {\n        $options = [\n            ('GET' === $this->requestMethod) ? 'query' : 'json' => $credentials,\n        ];\n\n        return $this->setHttpClient($this->app['http_client'])->request($this->getEndpoint(), $this->requestMethod, $options);\n    }\n\n    /**\n     * @return string\n     */\n    protected function getCacheKey()\n    {\n        return $this->cachePrefix.md5(json_encode($this->getCredentials()));\n    }\n\n    /**\n     * The request query will be used to add to the request.\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\HttpException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    protected function getQuery(): array\n    {\n        return [$this->queryName ?? $this->tokenKey => $this->getToken()[$this->tokenKey]];\n    }\n\n    /**\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function getEndpoint(): string\n    {\n        if (empty($this->endpointToGetToken)) {\n            throw new InvalidArgumentException('No endpoint for access token request.');\n        }\n\n        return $this->endpointToGetToken;\n    }\n\n    /**\n     * @return string\n     */\n    public function getTokenKey()\n    {\n        return $this->tokenKey;\n    }\n\n    /**\n     * Credential for get token.\n     *\n     * @return array\n     */\n    abstract protected function getCredentials(): array;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/BaseClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel;\n\nuse EasyWeChat\\Kernel\\Contracts\\AccessTokenInterface;\nuse EasyWeChat\\Kernel\\Http\\Response;\nuse EasyWeChat\\Kernel\\Traits\\HasHttpRequests;\nuse GuzzleHttp\\MessageFormatter;\nuse GuzzleHttp\\Middleware;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Log\\LogLevel;\n\n/**\n * Class BaseClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass BaseClient\n{\n    use HasHttpRequests {\n        request as performRequest;\n    }\n\n    /**\n     * @var \\EasyWeChat\\Kernel\\ServiceContainer\n     */\n    protected $app;\n    /**\n     * @var \\EasyWeChat\\Kernel\\Contracts\\AccessTokenInterface|null\n     */\n    protected $accessToken = null;\n    /**\n     * @var string\n     */\n    protected $baseUri;\n\n    /**\n     * BaseClient constructor.\n     *\n     * @param \\EasyWeChat\\Kernel\\ServiceContainer                    $app\n     * @param \\EasyWeChat\\Kernel\\Contracts\\AccessTokenInterface|null $accessToken\n     */\n    public function __construct(ServiceContainer $app, AccessTokenInterface $accessToken = null)\n    {\n        $this->app = $app;\n        $this->accessToken = $accessToken ?? $this->app['access_token'];\n    }\n\n    /**\n     * GET request.\n     *\n     * @param string $url\n     * @param array  $query\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function httpGet(string $url, array $query = [])\n    {\n        return $this->request($url, 'GET', ['query' => $query]);\n    }\n\n    /**\n     * POST request.\n     *\n     * @param string $url\n     * @param array  $data\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function httpPost(string $url, array $data = [])\n    {\n        return $this->request($url, 'POST', ['form_params' => $data]);\n    }\n\n    /**\n     * JSON request.\n     *\n     * @param string $url\n     * @param array  $data\n     * @param array  $query\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function httpPostJson(string $url, array $data = [], array $query = [])\n    {\n        return $this->request($url, 'POST', ['query' => $query, 'json' => $data]);\n    }\n\n    /**\n     * Upload file.\n     *\n     * @param string $url\n     * @param array  $files\n     * @param array  $form\n     * @param array  $query\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function httpUpload(string $url, array $files = [], array $form = [], array $query = [])\n    {\n        $multipart = [];\n        $headers = [];\n\n        if (isset($form['filename'])) {\n            $headers = [\n                'Content-Disposition' => 'form-data; name=\"media\"; filename=\"'.$form['filename'].'\"'\n            ];\n        }\n\n        foreach ($files as $name => $path) {\n            $multipart[] = [\n                'name' => $name,\n                'contents' => fopen($path, 'r'),\n                'headers' => $headers\n            ];\n        }\n\n        foreach ($form as $name => $contents) {\n            $multipart[] = compact('name', 'contents');\n        }\n\n        return $this->request(\n            $url,\n            'POST',\n            ['query' => $query, 'multipart' => $multipart, 'connect_timeout' => 30, 'timeout' => 30, 'read_timeout' => 30]\n        );\n    }\n\n    /**\n     * @return AccessTokenInterface\n     */\n    public function getAccessToken(): AccessTokenInterface\n    {\n        return $this->accessToken;\n    }\n\n    /**\n     * @param \\EasyWeChat\\Kernel\\Contracts\\AccessTokenInterface $accessToken\n     *\n     * @return $this\n     */\n    public function setAccessToken(AccessTokenInterface $accessToken)\n    {\n        $this->accessToken = $accessToken;\n\n        return $this;\n    }\n\n    /**\n     * @param string $url\n     * @param string $method\n     * @param array  $options\n     * @param bool   $returnRaw\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function request(string $url, string $method = 'GET', array $options = [], $returnRaw = false)\n    {\n        if (empty($this->middlewares)) {\n            $this->registerHttpMiddlewares();\n        }\n\n        $response = $this->performRequest($url, $method, $options);\n\n        $this->app->events->dispatch(new Events\\HttpResponseCreated($response));\n\n        return $returnRaw ? $response : $this->castResponseToType($response, $this->app->config->get('response_type'));\n    }\n\n    /**\n     * @param string $url\n     * @param string $method\n     * @param array  $options\n     *\n     * @return \\EasyWeChat\\Kernel\\Http\\Response\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function requestRaw(string $url, string $method = 'GET', array $options = [])\n    {\n        return Response::buildFromPsrResponse($this->request($url, $method, $options, true));\n    }\n\n    /**\n     * Register Guzzle middlewares.\n     */\n    protected function registerHttpMiddlewares()\n    {\n        // retry\n        $this->pushMiddleware($this->retryMiddleware(), 'retry');\n        // access token\n        $this->pushMiddleware($this->accessTokenMiddleware(), 'access_token');\n        // log\n        $this->pushMiddleware($this->logMiddleware(), 'log');\n    }\n\n    /**\n     * Attache access token to request query.\n     *\n     * @return \\Closure\n     */\n    protected function accessTokenMiddleware()\n    {\n        return function (callable $handler) {\n            return function (RequestInterface $request, array $options) use ($handler) {\n                if ($this->accessToken) {\n                    $request = $this->accessToken->applyToRequest($request, $options);\n                }\n\n                return $handler($request, $options);\n            };\n        };\n    }\n\n    /**\n     * Log the request.\n     *\n     * @return \\Closure\n     */\n    protected function logMiddleware()\n    {\n        $formatter = new MessageFormatter($this->app['config']['http.log_template'] ?? MessageFormatter::DEBUG);\n\n        return Middleware::log($this->app['logger'], $formatter, LogLevel::DEBUG);\n    }\n\n    /**\n     * Return retry middleware.\n     *\n     * @return \\Closure\n     */\n    protected function retryMiddleware()\n    {\n        return Middleware::retry(\n            function (\n                $retries,\n                RequestInterface $request,\n                ResponseInterface $response = null\n            ) {\n                // Limit the number of retries to 2\n                if ($retries < $this->app->config->get('http.max_retries', 1) && $response && $body = $response->getBody()) {\n                    // Retry on server errors\n                    $response = json_decode($body, true);\n\n                    if (!empty($response['errcode']) && in_array(abs($response['errcode']), [40001, 40014, 42001], true)) {\n                        $this->accessToken->refresh();\n                        $this->app['logger']->debug('Retrying with refreshed access token.');\n\n                        return true;\n                    }\n                }\n\n                return false;\n            },\n            function () {\n                return abs($this->app->config->get('http.retry_delay', 500));\n            }\n        );\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Clauses/Clause.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Clauses;\n\n/**\n * Class Clause.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Clause\n{\n    /**\n     * @var array\n     */\n    protected $clauses = [\n        'where' => [],\n    ];\n\n    /**\n     * @param mixed ...$args\n     *\n     * @return $this\n     */\n    public function where(...$args)\n    {\n        array_push($this->clauses['where'], $args);\n\n        return $this;\n    }\n\n    /**\n     * @param mixed $payload\n     *\n     * @return bool\n     */\n    public function intercepted($payload)\n    {\n        return (bool) $this->interceptWhereClause($payload);\n    }\n\n    /**\n     * @param mixed $payload\n     *\n     * @return bool\n     */\n    protected function interceptWhereClause($payload)\n    {\n        foreach ($this->clauses['where'] as $item) {\n            list($key, $value) = $item;\n\n            if (!isset($payload[$key])) {\n                continue;\n            }\n\n            if (is_array($value) && !in_array($payload[$key], $value)) {\n                return true;\n            }\n\n            if (!is_array($value) && $payload[$key] !== $value) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Config.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel;\n\nuse EasyWeChat\\Kernel\\Support\\Collection;\n\n/**\n * Class Config.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Config extends Collection\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Contracts/AccessTokenInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Contracts;\n\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Interface AuthorizerAccessToken.\n *\n * @author overtrue <i@overtrue.me>\n */\ninterface AccessTokenInterface\n{\n    /**\n     * @return array\n     */\n    public function getToken(): array;\n\n    /**\n     * @return \\EasyWeChat\\Kernel\\Contracts\\AccessTokenInterface\n     */\n    public function refresh(): self;\n\n    /**\n     * @param \\Psr\\Http\\Message\\RequestInterface $request\n     * @param array                              $requestOptions\n     *\n     * @return \\Psr\\Http\\Message\\RequestInterface\n     */\n    public function applyToRequest(RequestInterface $request, array $requestOptions = []): RequestInterface;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Contracts/Arrayable.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Contracts;\n\nuse ArrayAccess;\n\n/**\n * Interface Arrayable.\n *\n * @author overtrue <i@overtrue.me>\n */\ninterface Arrayable extends ArrayAccess\n{\n    /**\n     * Get the instance as an array.\n     *\n     * @return array\n     */\n    public function toArray();\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Contracts/EventHandlerInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Contracts;\n\n/**\n * Interface EventHandlerInterface.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\ninterface EventHandlerInterface\n{\n    /**\n     * @param mixed $payload\n     */\n    public function handle($payload = null);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Contracts/MediaInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Contracts;\n\n/**\n * Interface MediaInterface.\n *\n * @author overtrue <i@overtrue.me>\n */\ninterface MediaInterface extends MessageInterface\n{\n    /**\n     * @return string\n     */\n    public function getMediaId(): string;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Contracts/MessageInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Contracts;\n\n/**\n * Interface MessageInterface.\n *\n * @author overtrue <i@overtrue.me>\n */\ninterface MessageInterface\n{\n    /**\n     * @return string\n     */\n    public function getType(): string;\n\n    /**\n     * @return array\n     */\n    public function transformForJsonRequest(): array;\n\n    /**\n     * @return string\n     */\n    public function transformToXml(): string;\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Decorators/FinallyResult.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Decorators;\n\n/**\n * Class FinallyResult.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass FinallyResult\n{\n    /**\n     * @var mixed\n     */\n    public $content;\n\n    /**\n     * FinallyResult constructor.\n     *\n     * @param mixed $content\n     */\n    public function __construct($content)\n    {\n        $this->content = $content;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Decorators/TerminateResult.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Decorators;\n\n/**\n * Class TerminateResult.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass TerminateResult\n{\n    /**\n     * @var mixed\n     */\n    public $content;\n\n    /**\n     * FinallyResult constructor.\n     *\n     * @param mixed $content\n     */\n    public function __construct($content)\n    {\n        $this->content = $content;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Encryptor.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel;\n\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Support\\AES;\nuse EasyWeChat\\Kernel\\Support\\XML;\nuse Throwable;\nuse function EasyWeChat\\Kernel\\Support\\str_random;\n\n/**\n * Class Encryptor.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Encryptor\n{\n    public const ERROR_INVALID_SIGNATURE = -40001; // Signature verification failed\n    public const ERROR_PARSE_XML = -40002; // Parse XML failed\n    public const ERROR_CALC_SIGNATURE = -40003; // Calculating the signature failed\n    public const ERROR_INVALID_AES_KEY = -40004; // Invalid AESKey\n    public const ERROR_INVALID_APP_ID = -40005; // Check AppID failed\n    public const ERROR_ENCRYPT_AES = -40006; // AES EncryptionInterface failed\n    public const ERROR_DECRYPT_AES = -40007; // AES decryption failed\n    public const ERROR_INVALID_XML = -40008; // Invalid XML\n    public const ERROR_BASE64_ENCODE = -40009; // Base64 encoding failed\n    public const ERROR_BASE64_DECODE = -40010; // Base64 decoding failed\n    public const ERROR_XML_BUILD = -40011; // XML build failed\n    public const ILLEGAL_BUFFER = -41003; // Illegal buffer\n\n    /**\n     * App id.\n     *\n     * @var string\n     */\n    protected $appId;\n\n    /**\n     * App token.\n     *\n     * @var string\n     */\n    protected $token;\n\n    /**\n     * @var string\n     */\n    protected $aesKey;\n\n    /**\n     * Block size.\n     *\n     * @var int\n     */\n    protected $blockSize = 32;\n\n    /**\n     * Constructor.\n     *\n     * @param string      $appId\n     * @param string|null $token\n     * @param string|null $aesKey\n     */\n    public function __construct(string $appId, string $token = null, string $aesKey = null)\n    {\n        $this->appId = $appId;\n        $this->token = $token;\n        $this->aesKey = base64_decode($aesKey.'=', true);\n    }\n\n    /**\n     * Get the app token.\n     *\n     * @return string\n     */\n    public function getToken(): string\n    {\n        return $this->token;\n    }\n\n    /**\n     * Encrypt the message and return XML.\n     *\n     * @param string $xml\n     * @param string $nonce\n     * @param int    $timestamp\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function encrypt($xml, $nonce = null, $timestamp = null): string\n    {\n        try {\n            $xml = $this->pkcs7Pad(str_random(16).pack('N', strlen($xml)).$xml.$this->appId, $this->blockSize);\n\n            $encrypted = base64_encode(AES::encrypt(\n                $xml,\n                $this->aesKey,\n                substr($this->aesKey, 0, 16),\n                OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING\n            ));\n            // @codeCoverageIgnoreStart\n        } catch (Throwable $e) {\n            throw new RuntimeException($e->getMessage(), self::ERROR_ENCRYPT_AES);\n        }\n        // @codeCoverageIgnoreEnd\n\n        !is_null($nonce) || $nonce = substr($this->appId, 0, 10);\n        !is_null($timestamp) || $timestamp = time();\n\n        $response = [\n            'Encrypt' => $encrypted,\n            'MsgSignature' => $this->signature($this->token, $timestamp, $nonce, $encrypted),\n            'TimeStamp' => $timestamp,\n            'Nonce' => $nonce,\n        ];\n\n        //生成响应xml\n        return XML::build($response);\n    }\n\n    /**\n     * Decrypt message.\n     *\n     * @param string $content\n     * @param string $msgSignature\n     * @param string $nonce\n     * @param string $timestamp\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function decrypt($content, $msgSignature, $nonce, $timestamp): string\n    {\n        $signature = $this->signature($this->token, $timestamp, $nonce, $content);\n\n        if ($signature !== $msgSignature) {\n            throw new RuntimeException('Invalid Signature.', self::ERROR_INVALID_SIGNATURE);\n        }\n\n        $decrypted = AES::decrypt(\n            base64_decode($content, true),\n            $this->aesKey,\n            substr($this->aesKey, 0, 16),\n            OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING\n        );\n        $result = $this->pkcs7Unpad($decrypted);\n        $content = substr($result, 16, strlen($result));\n        $contentLen = unpack('N', substr($content, 0, 4))[1];\n\n        if (trim(substr($content, $contentLen + 4)) !== $this->appId) {\n            throw new RuntimeException('Invalid appId.', self::ERROR_INVALID_APP_ID);\n        }\n\n        return substr($content, 4, $contentLen);\n    }\n\n    /**\n     * Get SHA1.\n     *\n     * @return string\n     */\n    public function signature(): string\n    {\n        $array = func_get_args();\n        sort($array, SORT_STRING);\n\n        return sha1(implode($array));\n    }\n\n    /**\n     * PKCS#7 pad.\n     *\n     * @param string $text\n     * @param int    $blockSize\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function pkcs7Pad(string $text, int $blockSize): string\n    {\n        if ($blockSize > 256) {\n            throw new RuntimeException('$blockSize may not be more than 256');\n        }\n        $padding = $blockSize - (strlen($text) % $blockSize);\n        $pattern = chr($padding);\n\n        return $text.str_repeat($pattern, $padding);\n    }\n\n    /**\n     * PKCS#7 unpad.\n     *\n     * @param string $text\n     *\n     * @return string\n     */\n    public function pkcs7Unpad(string $text): string\n    {\n        $pad = ord(substr($text, -1));\n        if ($pad < 1 || $pad > $this->blockSize) {\n            $pad = 0;\n        }\n\n        return substr($text, 0, (strlen($text) - $pad));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Events/AccessTokenRefreshed.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Events;\n\nuse EasyWeChat\\Kernel\\AccessToken;\n\n/**\n * Class AccessTokenRefreshed.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass AccessTokenRefreshed\n{\n    /**\n     * @var \\EasyWeChat\\Kernel\\AccessToken\n     */\n    public $accessToken;\n\n    /**\n     * @param \\EasyWeChat\\Kernel\\AccessToken $accessToken\n     */\n    public function __construct(AccessToken $accessToken)\n    {\n        $this->accessToken = $accessToken;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Events/ApplicationInitialized.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Events;\n\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Class ApplicationInitialized.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ApplicationInitialized\n{\n    /**\n     * @var \\EasyWeChat\\Kernel\\ServiceContainer\n     */\n    public $app;\n\n    /**\n     * @param \\EasyWeChat\\Kernel\\ServiceContainer $app\n     */\n    public function __construct(ServiceContainer $app)\n    {\n        $this->app = $app;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Events/HttpResponseCreated.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Events;\n\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Class HttpResponseCreated.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass HttpResponseCreated\n{\n    /**\n     * @var \\Psr\\Http\\Message\\ResponseInterface\n     */\n    public $response;\n\n    /**\n     * @param \\Psr\\Http\\Message\\ResponseInterface $response\n     */\n    public function __construct(ResponseInterface $response)\n    {\n        $this->response = $response;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Events/ServerGuardResponseCreated.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Events;\n\nuse Symfony\\Component\\HttpFoundation\\Response;\n\n/**\n * Class ServerGuardResponseCreated.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServerGuardResponseCreated\n{\n    /**\n     * @var \\Symfony\\Component\\HttpFoundation\\Response\n     */\n    public $response;\n\n    /**\n     * @param \\Symfony\\Component\\HttpFoundation\\Response $response\n     */\n    public function __construct(Response $response)\n    {\n        $this->response = $response;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/BadRequestException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Exceptions;\n\n/**\n * Class BadRequestException.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass BadRequestException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/DecryptException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Exceptions;\n\nclass DecryptException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/Exception.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Exceptions;\n\nuse Exception as BaseException;\n\n/**\n * Class Exception.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Exception extends BaseException\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/HttpException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Exceptions;\n\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Class HttpException.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass HttpException extends Exception\n{\n    /**\n     * @var \\Psr\\Http\\Message\\ResponseInterface|null\n     */\n    public $response;\n\n    /**\n     * @var \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string|null\n     */\n    public $formattedResponse;\n\n    /**\n     * HttpException constructor.\n     *\n     * @param string                                   $message\n     * @param \\Psr\\Http\\Message\\ResponseInterface|null $response\n     * @param null                                     $formattedResponse\n     * @param int|null                                 $code\n     */\n    public function __construct($message, ResponseInterface $response = null, $formattedResponse = null, $code = null)\n    {\n        parent::__construct($message, $code);\n\n        $this->response = $response;\n        $this->formattedResponse = $formattedResponse;\n\n        if ($response) {\n            $response->getBody()->rewind();\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/InvalidArgumentException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Exceptions;\n\n/**\n * Class InvalidArgumentException.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass InvalidArgumentException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/InvalidConfigException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Exceptions;\n\n/**\n * Class InvalidConfigException.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass InvalidConfigException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/RuntimeException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Exceptions;\n\n/**\n * Class RuntimeException.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass RuntimeException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/UnboundServiceException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Exceptions;\n\n/**\n * Class InvalidConfigException.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass UnboundServiceException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Helpers.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel;\n\nuse EasyWeChat\\Kernel\\Contracts\\Arrayable;\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Support\\Arr;\nuse EasyWeChat\\Kernel\\Support\\Collection;\n\nfunction data_get($data, $key, $default = null)\n{\n    switch (true) {\n        case is_array($data):\n            return Arr::get($data, $key, $default);\n        case $data instanceof Collection:\n            return $data->get($key, $default);\n        case $data instanceof Arrayable:\n            return Arr::get($data->toArray(), $key, $default);\n        case $data instanceof \\ArrayIterator:\n            return $data->getArrayCopy()[$key] ?? $default;\n        case $data instanceof \\ArrayAccess:\n            return $data[$key] ?? $default;\n        case $data instanceof \\IteratorAggregate && $data->getIterator() instanceof \\ArrayIterator:\n            return $data->getIterator()->getArrayCopy()[$key] ?? $default;\n        case is_object($data):\n            return $data->{$key} ?? $default;\n        default:\n            throw new RuntimeException(sprintf('Can\\'t access data with key \"%s\"', $key));\n    }\n}\n\nfunction data_to_array($data)\n{\n    switch (true) {\n        case is_array($data):\n            return $data;\n        case $data instanceof Collection:\n            return $data->all();\n        case $data instanceof Arrayable:\n            return $data->toArray();\n        case $data instanceof \\IteratorAggregate && $data->getIterator() instanceof \\ArrayIterator:\n            return $data->getIterator()->getArrayCopy();\n        case $data instanceof \\ArrayIterator:\n            return $data->getArrayCopy();\n        default:\n            throw new RuntimeException(sprintf('Can\\'t transform data to array'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Http/Response.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Http;\n\nuse EasyWeChat\\Kernel\\Support\\Collection;\nuse EasyWeChat\\Kernel\\Support\\XML;\nuse GuzzleHttp\\Psr7\\Response as GuzzleResponse;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Class Response.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Response extends GuzzleResponse\n{\n    /**\n     * @return string\n     */\n    public function getBodyContents()\n    {\n        $this->getBody()->rewind();\n        $contents = $this->getBody()->getContents();\n        $this->getBody()->rewind();\n\n        return $contents;\n    }\n\n    /**\n     * @param \\Psr\\Http\\Message\\ResponseInterface $response\n     *\n     * @return \\EasyWeChat\\Kernel\\Http\\Response\n     */\n    public static function buildFromPsrResponse(ResponseInterface $response)\n    {\n        return new static(\n            $response->getStatusCode(),\n            $response->getHeaders(),\n            $response->getBody(),\n            $response->getProtocolVersion(),\n            $response->getReasonPhrase()\n        );\n    }\n\n    /**\n     * Build to json.\n     *\n     * @return string\n     */\n    public function toJson()\n    {\n        return json_encode($this->toArray());\n    }\n\n    /**\n     * Build to array.\n     *\n     * @return array\n     */\n    public function toArray()\n    {\n        $content = $this->removeControlCharacters($this->getBodyContents());\n\n        if (false !== stripos($this->getHeaderLine('Content-Type'), 'xml') || 0 === stripos($content, '<xml')) {\n            return XML::parse($content);\n        }\n\n        $array = json_decode($content, true, 512, JSON_BIGINT_AS_STRING);\n\n        if (JSON_ERROR_NONE === json_last_error()) {\n            return (array) $array;\n        }\n\n        return [];\n    }\n\n    /**\n     * Get collection data.\n     *\n     * @return \\EasyWeChat\\Kernel\\Support\\Collection\n     */\n    public function toCollection()\n    {\n        return new Collection($this->toArray());\n    }\n\n    /**\n     * @return object\n     */\n    public function toObject()\n    {\n        return json_decode($this->toJson());\n    }\n\n    /**\n     * @return bool|string\n     */\n    public function __toString()\n    {\n        return $this->getBodyContents();\n    }\n\n    /**\n     * @param string $content\n     *\n     * @return string\n     */\n    protected function removeControlCharacters(string $content)\n    {\n        return \\preg_replace('/[\\x00-\\x1F\\x80-\\x9F]/u', '', \\mb_convert_encoding($content, 'UTF-8', 'UTF-8'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Http/StreamResponse.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Http;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Support\\File;\n\n/**\n * Class StreamResponse.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass StreamResponse extends Response\n{\n    /**\n     * @param string $directory\n     * @param string $filename\n     * @param bool   $appendSuffix\n     *\n     * @return bool|int\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function save(string $directory, string $filename = '', bool $appendSuffix = true)\n    {\n        $this->getBody()->rewind();\n\n        $directory = rtrim($directory, '/');\n\n        if (!is_dir($directory)) {\n            mkdir($directory, 0755, true); // @codeCoverageIgnore\n        }\n\n        if (!is_writable($directory)) {\n            throw new InvalidArgumentException(sprintf(\"'%s' is not writable.\", $directory));\n        }\n\n        $contents = $this->getBody()->getContents();\n\n        if (empty($contents) || '{' === $contents[0]) {\n            throw new RuntimeException('Invalid media response content.');\n        }\n\n        if (empty($filename)) {\n            if (preg_match('/filename=\"(?<filename>.*?)\"/', $this->getHeaderLine('Content-Disposition'), $match)) {\n                $filename = $match['filename'];\n            } else {\n                $filename = md5($contents);\n            }\n        }\n\n        if ($appendSuffix && empty(pathinfo($filename, PATHINFO_EXTENSION))) {\n            $filename .= File::getStreamExt($contents);\n        }\n\n        file_put_contents($directory.'/'.$filename, $contents);\n\n        return $filename;\n    }\n\n    /**\n     * @param string $directory\n     * @param string $filename\n     * @param bool   $appendSuffix\n     *\n     * @return bool|int\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function saveAs(string $directory, string $filename, bool $appendSuffix = true)\n    {\n        return $this->save($directory, $filename, $appendSuffix);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Log/LogManager.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Log;\n\nuse EasyWeChat\\Kernel\\ServiceContainer;\nuse InvalidArgumentException;\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Handler\\ErrorLogHandler;\nuse Monolog\\Handler\\FormattableHandlerInterface;\nuse Monolog\\Handler\\HandlerInterface;\nuse Monolog\\Handler\\RotatingFileHandler;\nuse Monolog\\Handler\\SlackWebhookHandler;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Handler\\SyslogHandler;\nuse Monolog\\Handler\\WhatFailureGroupHandler;\nuse Monolog\\Logger as Monolog;\nuse Psr\\Log\\LoggerInterface;\n\n/**\n * Class LogManager.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass LogManager implements LoggerInterface\n{\n    /**\n     * @var \\EasyWeChat\\Kernel\\ServiceContainer\n     */\n    protected $app;\n\n    /**\n     * The array of resolved channels.\n     *\n     * @var array\n     */\n    protected $channels = [];\n\n    /**\n     * The registered custom driver creators.\n     *\n     * @var array\n     */\n    protected $customCreators = [];\n\n    /**\n     * The Log levels.\n     *\n     * @var array\n     */\n    protected $levels = [\n        'debug' => Monolog::DEBUG,\n        'info' => Monolog::INFO,\n        'notice' => Monolog::NOTICE,\n        'warning' => Monolog::WARNING,\n        'error' => Monolog::ERROR,\n        'critical' => Monolog::CRITICAL,\n        'alert' => Monolog::ALERT,\n        'emergency' => Monolog::EMERGENCY,\n    ];\n\n    /**\n     * LogManager constructor.\n     *\n     * @param \\EasyWeChat\\Kernel\\ServiceContainer $app\n     */\n    public function __construct(ServiceContainer $app)\n    {\n        $this->app = $app;\n    }\n\n    /**\n     * Create a new, on-demand aggregate logger instance.\n     *\n     * @param array       $channels\n     * @param string|null $channel\n     *\n     * @return \\Psr\\Log\\LoggerInterface\n     *\n     * @throws \\Exception\n     */\n    public function stack(array $channels, $channel = null)\n    {\n        return $this->createStackDriver(compact('channels', 'channel'));\n    }\n\n    /**\n     * Get a log channel instance.\n     *\n     * @param string|null $channel\n     *\n     * @return mixed\n     *\n     * @throws \\Exception\n     */\n    public function channel($channel = null)\n    {\n        return $this->driver($channel);\n    }\n\n    /**\n     * Get a log driver instance.\n     *\n     * @param string|null $driver\n     *\n     * @return mixed\n     *\n     * @throws \\Exception\n     */\n    public function driver($driver = null)\n    {\n        return $this->get($driver ?? $this->getDefaultDriver());\n    }\n\n    /**\n     * Attempt to get the log from the local cache.\n     *\n     * @param string $name\n     *\n     * @return \\Psr\\Log\\LoggerInterface\n     *\n     * @throws \\Exception\n     */\n    protected function get($name)\n    {\n        try {\n            return $this->channels[$name] ?? ($this->channels[$name] = $this->resolve($name));\n        } catch (\\Throwable $e) {\n            $logger = $this->createEmergencyLogger();\n\n            $logger->emergency('Unable to create configured logger. Using emergency logger.', [\n                'exception' => $e,\n            ]);\n\n            return $logger;\n        }\n    }\n\n    /**\n     * Resolve the given log instance by name.\n     *\n     * @param string $name\n     *\n     * @return \\Psr\\Log\\LoggerInterface\n     *\n     * @throws InvalidArgumentException\n     */\n    protected function resolve($name)\n    {\n        $config = $this->app['config']->get(\\sprintf('log.channels.%s', $name));\n\n        if (is_null($config)) {\n            throw new InvalidArgumentException(\\sprintf('Log [%s] is not defined.', $name));\n        }\n\n        if (isset($this->customCreators[$config['driver']])) {\n            return $this->callCustomCreator($config);\n        }\n\n        $driverMethod = 'create'.ucfirst($config['driver']).'Driver';\n\n        if (method_exists($this, $driverMethod)) {\n            return $this->{$driverMethod}($config);\n        }\n\n        throw new InvalidArgumentException(\\sprintf('Driver [%s] is not supported.', $config['driver']));\n    }\n\n    /**\n     * Create an emergency log handler to avoid white screens of death.\n     *\n     * @return \\Monolog\\Logger\n     *\n     * @throws \\Exception\n     */\n    protected function createEmergencyLogger()\n    {\n        return new Monolog('EasyWeChat', $this->prepareHandlers([new StreamHandler(\n            \\sys_get_temp_dir().'/easywechat/easywechat.log',\n            $this->level(['level' => 'debug'])\n        )]));\n    }\n\n    /**\n     * Call a custom driver creator.\n     *\n     * @param array $config\n     *\n     * @return mixed\n     */\n    protected function callCustomCreator(array $config)\n    {\n        return $this->customCreators[$config['driver']]($this->app, $config);\n    }\n\n    /**\n     * Create an aggregate log driver instance.\n     *\n     * @param array $config\n     *\n     * @return \\Monolog\\Logger\n     *\n     * @throws \\Exception\n     */\n    protected function createStackDriver(array $config)\n    {\n        $handlers = [];\n\n        foreach ($config['channels'] ?? [] as $channel) {\n            $handlers = \\array_merge($handlers, $this->channel($channel)->getHandlers());\n        }\n\n        if ($config['ignore_exceptions'] ?? false) {\n            $handlers = [new WhatFailureGroupHandler($handlers)];\n        }\n\n        return new Monolog($this->parseChannel($config), $handlers);\n    }\n\n    /**\n     * Create an instance of the single file log driver.\n     *\n     * @param array $config\n     *\n     * @return \\Psr\\Log\\LoggerInterface\n     *\n     * @throws \\Exception\n     */\n    protected function createSingleDriver(array $config)\n    {\n        return new Monolog($this->parseChannel($config), [\n            $this->prepareHandler(new StreamHandler(\n                $config['path'],\n                $this->level($config),\n                $config['bubble'] ?? true,\n                $config['permission'] ?? null,\n                $config['locking'] ?? false\n            ), $config),\n        ]);\n    }\n\n    /**\n     * Create an instance of the daily file log driver.\n     *\n     * @param array $config\n     *\n     * @return \\Psr\\Log\\LoggerInterface\n     */\n    protected function createDailyDriver(array $config)\n    {\n        return new Monolog($this->parseChannel($config), [\n            $this->prepareHandler(new RotatingFileHandler(\n                $config['path'],\n                $config['days'] ?? 7,\n                $this->level($config),\n                $config['bubble'] ?? true,\n                $config['permission'] ?? null,\n                $config['locking'] ?? false\n            ), $config),\n        ]);\n    }\n\n    /**\n     * Create an instance of the Slack log driver.\n     *\n     * @param  array  $config\n     *\n     * @return \\Psr\\Log\\LoggerInterface\n     * @throws \\Monolog\\Handler\\MissingExtensionException\n     */\n    protected function createSlackDriver(array $config)\n    {\n        return new Monolog($this->parseChannel($config), [\n            $this->prepareHandler(new SlackWebhookHandler(\n                $config['url'],\n                $config['channel'] ?? null,\n                $config['username'] ?? 'EasyWeChat',\n                $config['attachment'] ?? true,\n                $config['emoji'] ?? ':boom:',\n                $config['short'] ?? false,\n                $config['context'] ?? true,\n                $this->level($config),\n                $config['bubble'] ?? true,\n                $config['exclude_fields'] ?? []\n            ), $config),\n        ]);\n    }\n\n    /**\n     * Create an instance of the syslog log driver.\n     *\n     * @param array $config\n     *\n     * @return \\Psr\\Log\\LoggerInterface\n     */\n    protected function createSyslogDriver(array $config)\n    {\n        return new Monolog($this->parseChannel($config), [\n            $this->prepareHandler(new SyslogHandler(\n                'EasyWeChat',\n                $config['facility'] ?? LOG_USER,\n                $this->level($config)\n            ), $config),\n        ]);\n    }\n\n    /**\n     * Create an instance of the \"error log\" log driver.\n     *\n     * @param array $config\n     *\n     * @return \\Psr\\Log\\LoggerInterface\n     */\n    protected function createErrorlogDriver(array $config)\n    {\n        return new Monolog($this->parseChannel($config), [\n            $this->prepareHandler(\n                new ErrorLogHandler(\n                    $config['type'] ?? ErrorLogHandler::OPERATING_SYSTEM,\n                    $this->level($config)\n                )\n            ),\n        ]);\n    }\n\n    /**\n     * Prepare the handlers for usage by Monolog.\n     *\n     * @param array $handlers\n     *\n     * @return array\n     */\n    protected function prepareHandlers(array $handlers): array\n    {\n        foreach ($handlers as $key => $handler) {\n            $handlers[$key] = $this->prepareHandler($handler);\n        }\n\n        return $handlers;\n    }\n\n    /**\n     * Prepare the handler for usage by Monolog.\n     *\n     * @param  \\Monolog\\Handler\\HandlerInterface  $handler\n     * @param  array  $config\n     *\n     * @return \\Monolog\\Handler\\HandlerInterface\n     */\n    protected function prepareHandler(HandlerInterface $handler, array $config = [])\n    {\n        if (!isset($config['formatter'])) {\n            if ($handler instanceof FormattableHandlerInterface) {\n                $handler->setFormatter($this->formatter());\n            }\n        }\n\n        return $handler;\n    }\n\n    /**\n     * Get a Monolog formatter instance.\n     *\n     * @return \\Monolog\\Formatter\\FormatterInterface\n     */\n    protected function formatter()\n    {\n        $formatter = new LineFormatter(null, null, true, true);\n        $formatter->includeStacktraces();\n\n        return $formatter;\n    }\n\n    /**\n     * Extract the log channel from the given configuration.\n     *\n     * @param array $config\n     *\n     * @return string\n     */\n    protected function parseChannel(array $config): string\n    {\n        return $config['name'] ?? 'EasyWeChat';\n    }\n\n    /**\n     * Parse the string level into a Monolog constant.\n     *\n     * @param array $config\n     *\n     * @return int\n     *\n     * @throws InvalidArgumentException\n     */\n    protected function level(array $config): int\n    {\n        $level = $config['level'] ?? 'debug';\n\n        if (isset($this->levels[$level])) {\n            return $this->levels[$level];\n        }\n\n        throw new InvalidArgumentException('Invalid log level.');\n    }\n\n    /**\n     * Get the default log driver name.\n     *\n     * @return string\n     */\n    public function getDefaultDriver(): ?string\n    {\n        return $this->app['config']['log.default'];\n    }\n\n    /**\n     * Set the default log driver name.\n     *\n     * @param string $name\n     */\n    public function setDefaultDriver($name)\n    {\n        $this->app['config']['log.default'] = $name;\n    }\n\n    /**\n     * Register a custom driver creator Closure.\n     *\n     * @param  string  $driver\n     * @param \\Closure $callback\n     *\n     * @return $this\n     */\n    public function extend(string $driver, \\Closure $callback): LogManager\n    {\n        $this->customCreators[$driver] = $callback->bindTo($this, $this);\n\n        return $this;\n    }\n\n    /**\n     * System is unusable.\n     *\n     * @param string $message\n     * @param array  $context\n     *\n     * @return void\n     *\n     * @throws \\Exception\n     */\n    public function emergency($message, array $context = []): void\n    {\n        $this->driver()->emergency($message, $context);\n    }\n\n    /**\n     * Action must be taken immediately.\n     *\n     * Example: Entire website down, database unavailable, etc. This should\n     * trigger the SMS alerts and wake you up.\n     *\n     * @param string $message\n     * @param array  $context\n     *\n     * @return void\n     *\n     * @throws \\Exception\n     */\n    public function alert($message, array $context = []): void\n    {\n        $this->driver()->alert($message, $context);\n    }\n\n    /**\n     * Critical conditions.\n     *\n     * Example: Application component unavailable, unexpected exception.\n     *\n     * @param string $message\n     * @param array  $context\n     *\n     * @throws \\Exception\n     */\n    public function critical($message, array $context = []): void\n    {\n        $this->driver()->critical($message, $context);\n    }\n\n    /**\n     * Runtime errors that do not require immediate action but should typically\n     * be logged and monitored.\n     *\n     * @param string $message\n     * @param array  $context\n     *\n     * @throws \\Exception\n     */\n    public function error($message, array $context = []): void\n    {\n        $this->driver()->error($message, $context);\n    }\n\n    /**\n     * Exceptional occurrences that are not errors.\n     *\n     * Example: Use of deprecated APIs, poor use of an API, undesirable things\n     * that are not necessarily wrong.\n     *\n     * @param string $message\n     * @param array  $context\n     *\n     * @throws \\Exception\n     */\n    public function warning($message, array $context = []): void\n    {\n        $this->driver()->warning($message, $context);\n    }\n\n    /**\n     * Normal but significant events.\n     *\n     * @param string $message\n     * @param array  $context\n     *\n     * @throws \\Exception\n     */\n    public function notice($message, array $context = []): void\n    {\n        $this->driver()->notice($message, $context);\n    }\n\n    /**\n     * Interesting events.\n     *\n     * Example: User logs in, SQL logs.\n     *\n     * @param string $message\n     * @param array  $context\n     *\n     * @throws \\Exception\n     */\n    public function info($message, array $context = []): void\n    {\n        $this->driver()->info($message, $context);\n    }\n\n    /**\n     * Detailed debug information.\n     *\n     * @param string $message\n     * @param array  $context\n     *\n     * @throws \\Exception\n     */\n    public function debug($message, array $context = []): void\n    {\n        $this->driver()->debug($message, $context);\n    }\n\n    /**\n     * Logs with an arbitrary level.\n     *\n     * @param mixed  $level\n     * @param string $message\n     * @param array  $context\n     *\n     * @throws \\Exception\n     */\n    public function log($level, $message, array $context = []): void\n    {\n        $this->driver()->log($level, $message, $context);\n    }\n\n    /**\n     * Dynamically call the default driver instance.\n     *\n     * @param string $method\n     * @param array  $parameters\n     *\n     * @throws \\Exception\n     */\n    public function __call($method, $parameters)\n    {\n        return $this->driver()->$method(...$parameters);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Article.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Article.\n */\nclass Article extends Message\n{\n    /**\n     * @var string\n     */\n    protected $type = 'mpnews';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'thumb_media_id',\n        'author',\n        'title',\n        'content',\n        'digest',\n        'source_url',\n        'show_cover',\n    ];\n\n    /**\n     * Aliases of attribute.\n     *\n     * @var array\n     */\n    protected $jsonAliases = [\n        'content_source_url' => 'source_url',\n        'show_cover_pic' => 'show_cover',\n    ];\n\n    /**\n     * @var array\n     */\n    protected $required = [\n        'thumb_media_id',\n        'title',\n        'content',\n        'show_cover',\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Card.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\n/**\n * Card.php.\n *\n * @author    overtrue <i@overtrue.me>\n * @copyright 2015 overtrue <i@overtrue.me>\n *\n * @see      https://github.com/overtrue\n * @see      http://overtrue.me\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Card.\n */\nclass Card extends Message\n{\n    /**\n     * Message type.\n     *\n     * @var string\n     */\n    protected $type = 'wxcard';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = ['card_id'];\n\n    /**\n     * Media constructor.\n     *\n     * @param string $cardId\n     */\n    public function __construct(string $cardId)\n    {\n        parent::__construct(['card_id' => $cardId]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/DeviceEvent.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class DeviceEvent.\n *\n * @property string $media_id\n */\nclass DeviceEvent extends Message\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'device_event';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'device_type',\n        'device_id',\n        'content',\n        'session_id',\n        'open_id',\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/DeviceText.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class DeviceText.\n *\n * @property string $content\n */\nclass DeviceText extends Message\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'device_text';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'device_type',\n        'device_id',\n        'content',\n        'session_id',\n        'open_id',\n    ];\n\n    public function toXmlArray()\n    {\n        return [\n            'DeviceType' => $this->get('device_type'),\n            'DeviceID' => $this->get('device_id'),\n            'SessionID' => $this->get('session_id'),\n            'Content' => base64_encode($this->get('content')),\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/File.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Image.\n *\n * @property string $media_id\n */\nclass File extends Media\n{\n    /**\n     * @var string\n     */\n    protected $type = 'file';\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Image.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Image.\n *\n * @property string $media_id\n */\nclass Image extends Media\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'image';\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/InteractiveTaskCard.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class InteractiveTaskCard.\n *\n * @description 企业微信 interactive_taskcard 任务卡片消息类型\n *\n * @author      xyj2156\n * @date        2021年5月25日 15:21:03\n *\n * @property string $title\n * @property string $description\n * @property string $url\n * @property string $task_id\n * @property array  $btn\n */\nclass InteractiveTaskCard extends Message\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'interactive_taskcard';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'title',\n        'description',\n        'url',\n        'task_id',\n        'btn',\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Link.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Link.\n */\nclass Link extends Message\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'link';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'title',\n        'description',\n        'url',\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Location.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Location.\n */\nclass Location extends Message\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'location';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'latitude',\n        'longitude',\n        'scale',\n        'label',\n        'precision',\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Media.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\nuse EasyWeChat\\Kernel\\Contracts\\MediaInterface;\nuse EasyWeChat\\Kernel\\Support\\Str;\n\n/**\n * Class Media.\n */\nclass Media extends Message implements MediaInterface\n{\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = ['media_id'];\n\n    /**\n     * @var array\n     */\n    protected $required = [\n        'media_id',\n    ];\n\n    /**\n     * MaterialClient constructor.\n     *\n     * @param string $mediaId\n     * @param string $type\n     * @param array  $attributes\n     */\n    public function __construct(string $mediaId, $type = null, array $attributes = [])\n    {\n        parent::__construct(array_merge(['media_id' => $mediaId], $attributes));\n\n        !empty($type) && $this->setType($type);\n    }\n\n    /**\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function getMediaId(): string\n    {\n        $this->checkRequiredAttributes();\n\n        return $this->get('media_id');\n    }\n\n    public function toXmlArray()\n    {\n        return [\n            Str::studly($this->getType()) => [\n                'MediaId' => $this->get('media_id'),\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Message.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\nuse EasyWeChat\\Kernel\\Contracts\\MessageInterface;\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Support\\XML;\nuse EasyWeChat\\Kernel\\Traits\\HasAttributes;\n\n/**\n * Class Messages.\n */\nabstract class Message implements MessageInterface\n{\n    use HasAttributes;\n\n    public const TEXT = 2;\n    public const IMAGE = 4;\n    public const VOICE = 8;\n    public const VIDEO = 16;\n    public const SHORT_VIDEO = 32;\n    public const LOCATION = 64;\n    public const LINK = 128;\n    public const DEVICE_EVENT = 256;\n    public const DEVICE_TEXT = 512;\n    public const FILE = 1024;\n    public const TEXT_CARD = 2048;\n    public const TRANSFER = 4096;\n    public const EVENT = 1048576;\n    public const MINIPROGRAM_PAGE = 2097152;\n    public const MINIPROGRAM_NOTICE = 4194304;\n    public const ALL = self::TEXT | self::IMAGE | self::VOICE | self::VIDEO | self::SHORT_VIDEO | self::LOCATION | self::LINK\n                | self::DEVICE_EVENT | self::DEVICE_TEXT | self::FILE | self::TEXT_CARD | self::TRANSFER | self::EVENT\n                | self::MINIPROGRAM_PAGE | self::MINIPROGRAM_NOTICE;\n\n    /**\n     * @var string\n     */\n    protected $type;\n\n    /**\n     * @var int\n     */\n    protected $id;\n\n    /**\n     * @var string\n     */\n    protected $to;\n\n    /**\n     * @var string\n     */\n    protected $from;\n\n    /**\n     * @var array\n     */\n    protected $properties = [];\n\n    /**\n     * @var array\n     */\n    protected $jsonAliases = [];\n\n    /**\n     * Message constructor.\n     *\n     * @param array $attributes\n     */\n    public function __construct(array $attributes = [])\n    {\n        $this->setAttributes($attributes);\n    }\n\n    /**\n     * Return type name message.\n     *\n     * @return string\n     */\n    public function getType(): string\n    {\n        return $this->type;\n    }\n\n    /**\n     * @param string $type\n     */\n    public function setType(string $type)\n    {\n        $this->type = $type;\n    }\n\n    /**\n     * Magic getter.\n     *\n     * @param string $property\n     *\n     * @return mixed\n     */\n    public function __get($property)\n    {\n        if (property_exists($this, $property)) {\n            return $this->$property;\n        }\n\n        return $this->getAttribute($property);\n    }\n\n    /**\n     * Magic setter.\n     *\n     * @param string $property\n     * @param mixed  $value\n     *\n     * @return Message\n     */\n    public function __set($property, $value)\n    {\n        if (property_exists($this, $property)) {\n            $this->$property = $value;\n        } else {\n            $this->setAttribute($property, $value);\n        }\n\n        return $this;\n    }\n\n    /**\n     * @param array $appends\n     *\n     * @return array\n     */\n    public function transformForJsonRequestWithoutType(array $appends = [])\n    {\n        return $this->transformForJsonRequest($appends, false);\n    }\n\n    /**\n     * @param array $appends\n     * @param bool  $withType\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function transformForJsonRequest(array $appends = [], $withType = true): array\n    {\n        if (!$withType) {\n            return $this->propertiesToArray([], $this->jsonAliases);\n        }\n        $messageType = $this->getType();\n        $data = array_merge(['msgtype' => $messageType], $appends);\n\n        $data[$messageType] = array_merge($data[$messageType] ?? [], $this->propertiesToArray([], $this->jsonAliases));\n\n        return $data;\n    }\n\n    /**\n     * @param array $appends\n     * @param bool  $returnAsArray\n     *\n     * @return string\n     */\n    public function transformToXml(array $appends = [], bool $returnAsArray = false): string\n    {\n        $data = array_merge(['MsgType' => $this->getType()], $this->toXmlArray(), $appends);\n\n        return $returnAsArray ? $data : XML::build($data);\n    }\n\n    /**\n     * @param array $data\n     * @param array $aliases\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    protected function propertiesToArray(array $data, array $aliases = []): array\n    {\n        $this->checkRequiredAttributes();\n\n        foreach ($this->attributes as $property => $value) {\n            if (is_null($value) && !$this->isRequired($property)) {\n                continue;\n            }\n            $alias = array_search($property, $aliases, true);\n\n            $data[$alias ?: $property] = $this->get($property);\n        }\n\n        return $data;\n    }\n\n    public function toXmlArray()\n    {\n        throw new RuntimeException(sprintf('Class \"%s\" cannot support transform to XML message.', __CLASS__));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/MiniProgramPage.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class MiniProgramPage.\n */\nclass MiniProgramPage extends Message\n{\n    protected $type = 'miniprogrampage';\n\n    protected $properties = [\n        'title',\n        'appid',\n        'pagepath',\n        'thumb_media_id',\n    ];\n\n    protected $required = [\n        'thumb_media_id', 'appid', 'pagepath',\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/MiniprogramNotice.php",
    "content": "<?php\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\nclass MiniprogramNotice extends Message\n{\n    protected $type = 'miniprogram_notice';\n\n    protected $properties = [\n        'appid',\n        'title',\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Music.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Music.\n *\n * @property string $url\n * @property string $hq_url\n * @property string $title\n * @property string $description\n * @property string $thumb_media_id\n * @property string $format\n */\nclass Music extends Message\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'music';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'title',\n        'description',\n        'url',\n        'hq_url',\n        'thumb_media_id',\n        'format',\n    ];\n\n    /**\n     * Aliases of attribute.\n     *\n     * @var array\n     */\n    protected $jsonAliases = [\n        'musicurl' => 'url',\n        'hqmusicurl' => 'hq_url',\n    ];\n\n    public function toXmlArray()\n    {\n        $music = [\n            'Music' => [\n                'Title' => $this->get('title'),\n                'Description' => $this->get('description'),\n                'MusicUrl' => $this->get('url'),\n                'HQMusicUrl' => $this->get('hq_url'),\n            ],\n        ];\n        if ($thumbMediaId = $this->get('thumb_media_id')) {\n            $music['Music']['ThumbMediaId'] = $thumbMediaId;\n        }\n\n        return $music;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/News.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class News.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass News extends Message\n{\n    /**\n     * @var string\n     */\n    protected $type = 'news';\n\n    /**\n     * @var array\n     */\n    protected $properties = [\n        'items',\n    ];\n\n    /**\n     * News constructor.\n     *\n     * @param array $items\n     */\n    public function __construct(array $items = [])\n    {\n        parent::__construct(compact('items'));\n    }\n\n    /**\n     * @param array $data\n     * @param array $aliases\n     *\n     * @return array\n     */\n    public function propertiesToArray(array $data, array $aliases = []): array\n    {\n        return ['articles' => array_map(function ($item) {\n            if ($item instanceof NewsItem) {\n                return $item->toJsonArray();\n            }\n        }, $this->get('items'))];\n    }\n\n    public function toXmlArray()\n    {\n        $items = [];\n\n        foreach ($this->get('items') as $item) {\n            if ($item instanceof NewsItem) {\n                $items[] = $item->toXmlArray();\n            }\n        }\n\n        return [\n            'ArticleCount' => count($items),\n            'Articles' => $items,\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/NewsItem.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class NewsItem.\n */\nclass NewsItem extends Message\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'news';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'title',\n        'description',\n        'url',\n        'image',\n    ];\n\n    public function toJsonArray()\n    {\n        return [\n            'title' => $this->get('title'),\n            'description' => $this->get('description'),\n            'url' => $this->get('url'),\n            'picurl' => $this->get('image'),\n        ];\n    }\n\n    public function toXmlArray()\n    {\n        return [\n            'Title' => $this->get('title'),\n            'Description' => $this->get('description'),\n            'Url' => $this->get('url'),\n            'PicUrl' => $this->get('image'),\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Raw.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Raw.\n */\nclass Raw extends Message\n{\n    /**\n     * @var string\n     */\n    protected $type = 'raw';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = ['content'];\n\n    /**\n     * Constructor.\n     *\n     * @param string $content\n     */\n    public function __construct(string $content)\n    {\n        parent::__construct(['content' => strval($content)]);\n    }\n\n    /**\n     * @param array $appends\n     * @param bool  $withType\n     *\n     * @return array\n     */\n    public function transformForJsonRequest(array $appends = [], $withType = true): array\n    {\n        return json_decode($this->content, true) ?? [];\n    }\n\n    public function __toString()\n    {\n        return $this->get('content') ?? '';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/ReplyInteractiveTaskCard.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class ReplyInteractiveTaskCard\n *\n * @property array{'replace_name':string} $properties\n *\n * @description 专门为回复 InteractiveTaskCard 类型任务卡片消息而创建的类型\n * @author      xyj2156\n *\n * @package     App\\Extend\\EnterpriseApplication\\BusinessWX\\Message\n */\nclass ReplyInteractiveTaskCard extends Message\n{\n    /**\n     * Message Type\n     *\n     * @var string\n     */\n    protected $type = 'update_taskcard';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'replace_name',\n    ];\n\n    /**\n     * ReplyInteractiveTaskCard constructor.\n     *\n     * @param string $replace_name\n     */\n    public function __construct(string $replace_name = '')\n    {\n        parent::__construct(compact('replace_name'));\n    }\n\n    public function toXmlArray()\n    {\n        return [\n            'TaskCard' => [\n                'ReplaceName' => $this->get('replace_name'),\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/ShortVideo.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class ShortVideo.\n *\n * @property string $title\n * @property string $media_id\n * @property string $description\n * @property string $thumb_media_id\n */\nclass ShortVideo extends Video\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'shortvideo';\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/TaskCard.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class TaskCard.\n *\n * @property string $title\n * @property string $description\n * @property string $url\n * @property string $task_id\n * @property array  $btn\n */\nclass TaskCard extends Message\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'taskcard';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'title',\n        'description',\n        'url',\n        'task_id',\n        'btn',\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Text.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Text.\n *\n * @property string $content\n */\nclass Text extends Message\n{\n    /**\n     * Message type.\n     *\n     * @var string\n     */\n    protected $type = 'text';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = ['content'];\n\n    /**\n     * Text constructor.\n     *\n     * @param string $content\n     */\n    public function __construct(string $content = '')\n    {\n        parent::__construct(compact('content'));\n    }\n\n    /**\n     * @return array\n     */\n    public function toXmlArray()\n    {\n        return [\n            'Content' => $this->get('content'),\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/TextCard.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Text.\n *\n * @property string $title\n * @property string $description\n * @property string $url\n */\nclass TextCard extends Message\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'textcard';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'title',\n        'description',\n        'url',\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Transfer.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Transfer.\n *\n * @property string $to\n * @property string $account\n */\nclass Transfer extends Message\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'transfer_customer_service';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'account',\n    ];\n\n    /**\n     * Transfer constructor.\n     *\n     * @param string|null $account\n     */\n    public function __construct(string $account = null)\n    {\n        parent::__construct(compact('account'));\n    }\n\n    public function toXmlArray()\n    {\n        return empty($this->get('account')) ? [] : [\n            'TransInfo' => [\n                'KfAccount' => $this->get('account'),\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Video.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Video.\n *\n * @property string $video\n * @property string $title\n * @property string $media_id\n * @property string $description\n * @property string $thumb_media_id\n */\nclass Video extends Media\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'video';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'title',\n        'description',\n        'media_id',\n        'thumb_media_id',\n    ];\n\n    /**\n     * Video constructor.\n     *\n     * @param string $mediaId\n     * @param array  $attributes\n     */\n    public function __construct(string $mediaId, array $attributes = [])\n    {\n        parent::__construct($mediaId, 'video', $attributes);\n    }\n\n    public function toXmlArray()\n    {\n        return [\n            'Video' => [\n                'MediaId' => $this->get('media_id'),\n                'Title' => $this->get('title'),\n                'Description' => $this->get('description'),\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Voice.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Messages;\n\n/**\n * Class Voice.\n *\n * @property string $media_id\n */\nclass Voice extends Media\n{\n    /**\n     * Messages type.\n     *\n     * @var string\n     */\n    protected $type = 'voice';\n\n    /**\n     * Properties.\n     *\n     * @var array\n     */\n    protected $properties = [\n        'media_id',\n        'recognition',\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/ConfigServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Providers;\n\nuse EasyWeChat\\Kernel\\Config;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ConfigServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ConfigServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * Registers services on the given container.\n     *\n     * This method should only be used to configure services and parameters.\n     * It should not get services.\n     *\n     * @param Container $pimple A container instance\n     */\n    public function register(Container $pimple)\n    {\n        !isset($pimple['config']) && $pimple['config'] = function ($app) {\n            return new Config($app->getConfig());\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/EventDispatcherServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Providers;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\nuse Symfony\\Component\\EventDispatcher\\EventDispatcher;\n\n/**\n * Class EventDispatcherServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass EventDispatcherServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * Registers services on the given container.\n     *\n     * This method should only be used to configure services and parameters.\n     * It should not get services.\n     *\n     * @param Container $pimple A container instance\n     */\n    public function register(Container $pimple)\n    {\n        !isset($pimple['events']) && $pimple['events'] = function ($app) {\n            $dispatcher = new EventDispatcher();\n\n            foreach ($app->config->get('events.listen', []) as $event => $listeners) {\n                foreach ($listeners as $listener) {\n                    $dispatcher->addListener($event, $listener);\n                }\n            }\n\n            return $dispatcher;\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/ExtensionServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Providers;\n\nuse EasyWeChatComposer\\Extension;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ExtensionServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ExtensionServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * Registers services on the given container.\n     *\n     * This method should only be used to configure services and parameters.\n     * It should not get services.\n     *\n     * @param Container $pimple A container instance\n     */\n    public function register(Container $pimple)\n    {\n        !isset($pimple['extension']) && $pimple['extension'] = function ($app) {\n            return new Extension($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/HttpClientServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Providers;\n\nuse GuzzleHttp\\Client;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class HttpClientServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass HttpClientServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * Registers services on the given container.\n     *\n     * This method should only be used to configure services and parameters.\n     * It should not get services.\n     *\n     * @param Container $pimple A container instance\n     */\n    public function register(Container $pimple)\n    {\n        !isset($pimple['http_client']) && $pimple['http_client'] = function ($app) {\n            return new Client($app['config']->get('http', []));\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/LogServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Providers;\n\nuse EasyWeChat\\Kernel\\Log\\LogManager;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class LoggingServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass LogServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * Registers services on the given container.\n     *\n     * This method should only be used to configure services and parameters.\n     * It should not get services.\n     *\n     * @param Container $pimple A container instance\n     */\n    public function register(Container $pimple)\n    {\n        !isset($pimple['log']) && $pimple['log'] = function ($app) {\n            $config = $app['config']->get('log');\n\n            if (!empty($config)) {\n                $app->rebind('config', $app['config']->merge($config));\n            }\n\n            return new LogManager($app);\n        };\n\n        !isset($pimple['logger']) && $pimple['logger'] = $pimple['log'];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/RequestServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Providers;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\nuse Symfony\\Component\\HttpFoundation\\Request;\n\n/**\n * Class RequestServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass RequestServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * Registers services on the given container.\n     *\n     * This method should only be used to configure services and parameters.\n     * It should not get services.\n     *\n     * @param Container $pimple A container instance\n     */\n    public function register(Container $pimple)\n    {\n        !isset($pimple['request']) && $pimple['request'] = function () {\n            return Request::createFromGlobals();\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/ServerGuard.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel;\n\nuse EasyWeChat\\Kernel\\Contracts\\MessageInterface;\nuse EasyWeChat\\Kernel\\Exceptions\\BadRequestException;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\Messages\\Message;\nuse EasyWeChat\\Kernel\\Messages\\News;\nuse EasyWeChat\\Kernel\\Messages\\NewsItem;\nuse EasyWeChat\\Kernel\\Messages\\Raw as RawMessage;\nuse EasyWeChat\\Kernel\\Messages\\Text;\nuse EasyWeChat\\Kernel\\Support\\XML;\nuse EasyWeChat\\Kernel\\Traits\\Observable;\nuse EasyWeChat\\Kernel\\Traits\\ResponseCastable;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\n/**\n * Class ServerGuard.\n *\n * 1. url 里的 signature 只是将 token+nonce+timestamp 得到的签名，只是用于验证当前请求的，在公众号环境下一直有\n * 2. 企业号消息发送时是没有的，因为固定为完全模式，所以 url 里不会存在 signature, 只有 msg_signature 用于解密消息的\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServerGuard\n{\n    use Observable;\n    use ResponseCastable;\n\n    /**\n     * @var bool\n     */\n    protected $alwaysValidate = false;\n\n    /**\n     * Empty string.\n     */\n    public const SUCCESS_EMPTY_RESPONSE = 'success';\n\n    /**\n     * @var array\n     */\n    public const MESSAGE_TYPE_MAPPING = [\n        'text' => Message::TEXT,\n        'image' => Message::IMAGE,\n        'voice' => Message::VOICE,\n        'video' => Message::VIDEO,\n        'shortvideo' => Message::SHORT_VIDEO,\n        'location' => Message::LOCATION,\n        'link' => Message::LINK,\n        'device_event' => Message::DEVICE_EVENT,\n        'device_text' => Message::DEVICE_TEXT,\n        'event' => Message::EVENT,\n        'file' => Message::FILE,\n        'miniprogrampage' => Message::MINIPROGRAM_PAGE,\n    ];\n\n    /**\n     * @var \\EasyWeChat\\Kernel\\ServiceContainer\n     */\n    protected $app;\n\n    /**\n     * Constructor.\n     *\n     * @codeCoverageIgnore\n     *\n     * @param \\EasyWeChat\\Kernel\\ServiceContainer $app\n     */\n    public function __construct(ServiceContainer $app)\n    {\n        $this->app = $app;\n\n        foreach ($this->app->extension->observers() as $observer) {\n            call_user_func_array([$this, 'push'], $observer);\n        }\n    }\n\n    /**\n     * Handle and return response.\n     *\n     * @return Response\n     *\n     * @throws BadRequestException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function serve(): Response\n    {\n        $this->app['logger']->debug('Request received:', [\n            'method' => $this->app['request']->getMethod(),\n            'uri' => $this->app['request']->getUri(),\n            'content-type' => $this->app['request']->getContentType(),\n            'content' => $this->app['request']->getContent(),\n        ]);\n\n        $response = $this->validate()->resolve();\n\n        $this->app['logger']->debug('Server response created:', ['content' => $response->getContent()]);\n\n        return $response;\n    }\n\n    /**\n     * @return $this\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\BadRequestException\n     */\n    public function validate()\n    {\n        if (!$this->alwaysValidate && !$this->isSafeMode()) {\n            return $this;\n        }\n\n        if ($this->app['request']->get('signature') !== $this->signature([\n                $this->getToken(),\n                $this->app['request']->get('timestamp'),\n                $this->app['request']->get('nonce'),\n            ])) {\n            throw new BadRequestException('Invalid request signature.', 400);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Force validate request.\n     *\n     * @return $this\n     */\n    public function forceValidate()\n    {\n        $this->alwaysValidate = true;\n\n        return $this;\n    }\n\n    /**\n     * Get request message.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|string\n     *\n     * @throws BadRequestException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getMessage()\n    {\n        $message = $this->parseMessage($this->app['request']->getContent(false));\n\n        if (!is_array($message) || empty($message)) {\n            throw new BadRequestException('No message received.');\n        }\n\n        if ($this->isSafeMode() && !empty($message['Encrypt'])) {\n            $message = $this->decryptMessage($message);\n\n            // Handle JSON format.\n            $dataSet = json_decode($message, true);\n\n            if ($dataSet && (JSON_ERROR_NONE === json_last_error())) {\n                return $dataSet;\n            }\n\n            $message = XML::parse($message);\n        }\n\n        return $this->detectAndCastResponseToType($message, $this->app->config->get('response_type'));\n    }\n\n    /**\n     * Resolve server request and return the response.\n     *\n     * @return \\Symfony\\Component\\HttpFoundation\\Response\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\BadRequestException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    protected function resolve(): Response\n    {\n        $result = $this->handleRequest();\n\n        if ($this->shouldReturnRawResponse()) {\n            $response = new Response($result['response']);\n        } else {\n            $response = new Response(\n                $this->buildResponse($result['to'], $result['from'], $result['response']),\n                200,\n                ['Content-Type' => 'application/xml']\n            );\n        }\n\n        $this->app->events->dispatch(new Events\\ServerGuardResponseCreated($response));\n\n        return $response;\n    }\n\n    /**\n     * @return string|null\n     */\n    protected function getToken()\n    {\n        return $this->app['config']['token'];\n    }\n\n    /**\n     * @param string                                                   $to\n     * @param string                                                   $from\n     * @param \\EasyWeChat\\Kernel\\Contracts\\MessageInterface|string|int $message\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function buildResponse(string $to, string $from, $message)\n    {\n        if (empty($message) || self::SUCCESS_EMPTY_RESPONSE === $message) {\n            return self::SUCCESS_EMPTY_RESPONSE;\n        }\n\n        if ($message instanceof RawMessage) {\n            return $message->get('content', self::SUCCESS_EMPTY_RESPONSE);\n        }\n\n        if (is_string($message) || is_numeric($message)) {\n            $message = new Text((string) $message);\n        }\n\n        if (is_array($message) && reset($message) instanceof NewsItem) {\n            $message = new News($message);\n        }\n\n        if (!($message instanceof Message)) {\n            throw new InvalidArgumentException(sprintf('Invalid Messages type \"%s\".', gettype($message)));\n        }\n\n        return $this->buildReply($to, $from, $message);\n    }\n\n    /**\n     * Handle request.\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\BadRequestException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    protected function handleRequest(): array\n    {\n        $castedMessage = $this->getMessage();\n\n        $messageArray = $this->detectAndCastResponseToType($castedMessage, 'array');\n\n        $response = $this->dispatch(self::MESSAGE_TYPE_MAPPING[$messageArray['MsgType'] ?? $messageArray['msg_type'] ?? 'text'], $castedMessage);\n\n        return [\n            'to' => $messageArray['FromUserName'] ?? '',\n            'from' => $messageArray['ToUserName'] ?? '',\n            'response' => $response,\n        ];\n    }\n\n    /**\n     * Build reply XML.\n     *\n     * @param string                                        $to\n     * @param string                                        $from\n     * @param \\EasyWeChat\\Kernel\\Contracts\\MessageInterface $message\n     *\n     * @return string\n     */\n    protected function buildReply(string $to, string $from, MessageInterface $message): string\n    {\n        $prepends = [\n            'ToUserName' => $to,\n            'FromUserName' => $from,\n            'CreateTime' => time(),\n            'MsgType' => $message->getType(),\n        ];\n\n        $response = $message->transformToXml($prepends);\n\n        if ($this->isSafeMode()) {\n            $this->app['logger']->debug('Messages safe mode is enabled.');\n            $response = $this->app['encryptor']->encrypt($response);\n        }\n\n        return $response;\n    }\n\n    /**\n     * @param array $params\n     *\n     * @return string\n     */\n    protected function signature(array $params)\n    {\n        sort($params, SORT_STRING);\n\n        return sha1(implode($params));\n    }\n\n    /**\n     * Parse message array from raw php input.\n     *\n     * @param string $content\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\BadRequestException\n     */\n    protected function parseMessage($content)\n    {\n        try {\n            if (0 === stripos($content, '<')) {\n                $content = XML::parse($content);\n            } else {\n                // Handle JSON format.\n                $dataSet = json_decode($content, true);\n                if ($dataSet && (JSON_ERROR_NONE === json_last_error())) {\n                    $content = $dataSet;\n                }\n            }\n\n            return (array) $content;\n        } catch (\\Exception $e) {\n            throw new BadRequestException(sprintf('Invalid message content:(%s) %s', $e->getCode(), $e->getMessage()), $e->getCode());\n        }\n    }\n\n    /**\n     * Check the request message safe mode.\n     *\n     * @return bool\n     */\n    protected function isSafeMode(): bool\n    {\n        return $this->app['request']->get('signature') && 'aes' === $this->app['request']->get('encrypt_type');\n    }\n\n    /**\n     * @return bool\n     */\n    protected function shouldReturnRawResponse(): bool\n    {\n        return false;\n    }\n\n    /**\n     * @param array $message\n     *\n     * @return mixed\n     */\n    protected function decryptMessage(array $message)\n    {\n        return $message = $this->app['encryptor']->decrypt(\n            $message['Encrypt'],\n            $this->app['request']->get('msg_signature'),\n            $this->app['request']->get('nonce'),\n            $this->app['request']->get('timestamp')\n        );\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/ServiceContainer.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel;\n\nuse EasyWeChat\\Kernel\\Providers\\ConfigServiceProvider;\nuse EasyWeChat\\Kernel\\Providers\\EventDispatcherServiceProvider;\nuse EasyWeChat\\Kernel\\Providers\\ExtensionServiceProvider;\nuse EasyWeChat\\Kernel\\Providers\\HttpClientServiceProvider;\nuse EasyWeChat\\Kernel\\Providers\\LogServiceProvider;\nuse EasyWeChat\\Kernel\\Providers\\RequestServiceProvider;\nuse EasyWeChatComposer\\Traits\\WithAggregator;\nuse Pimple\\Container;\n\n/**\n * Class ServiceContainer.\n *\n * @author overtrue <i@overtrue.me>\n *\n * @property \\EasyWeChat\\Kernel\\Config                          $config\n * @property \\Symfony\\Component\\HttpFoundation\\Request          $request\n * @property \\GuzzleHttp\\Client                                 $http_client\n * @property \\Monolog\\Logger                                    $logger\n * @property \\Symfony\\Component\\EventDispatcher\\EventDispatcher $events\n */\nclass ServiceContainer extends Container\n{\n    use WithAggregator;\n\n    /**\n     * @var string\n     */\n    protected $id;\n\n    /**\n     * @var array\n     */\n    protected $providers = [];\n\n    /**\n     * @var array\n     */\n    protected $defaultConfig = [];\n\n    /**\n     * @var array\n     */\n    protected $userConfig = [];\n\n    /**\n     * Constructor.\n     *\n     * @param array       $config\n     * @param array       $prepends\n     * @param string|null $id\n     */\n    public function __construct(array $config = [], array $prepends = [], string $id = null)\n    {\n        $this->userConfig = $config;\n\n        parent::__construct($prepends);\n\n        $this->registerProviders($this->getProviders());\n\n        $this->id = $id;\n\n        $this->aggregate();\n\n        $this->events->dispatch(new Events\\ApplicationInitialized($this));\n    }\n\n    /**\n     * @return string\n     */\n    public function getId()\n    {\n        return $this->id ?? $this->id = md5(json_encode($this->userConfig));\n    }\n\n    /**\n     * @return array\n     */\n    public function getConfig()\n    {\n        $base = [\n            // http://docs.guzzlephp.org/en/stable/request-options.html\n            'http' => [\n                'timeout' => 30.0,\n                'base_uri' => 'https://api.weixin.qq.com/',\n            ],\n        ];\n\n        return array_replace_recursive($base, $this->defaultConfig, $this->userConfig);\n    }\n\n    /**\n     * Return all providers.\n     *\n     * @return array\n     */\n    public function getProviders()\n    {\n        return array_merge([\n            ConfigServiceProvider::class,\n            LogServiceProvider::class,\n            RequestServiceProvider::class,\n            HttpClientServiceProvider::class,\n            ExtensionServiceProvider::class,\n            EventDispatcherServiceProvider::class,\n        ], $this->providers);\n    }\n\n    /**\n     * @param string $id\n     * @param mixed  $value\n     */\n    public function rebind($id, $value)\n    {\n        $this->offsetUnset($id);\n        $this->offsetSet($id, $value);\n    }\n\n    /**\n     * Magic get access.\n     *\n     * @param string $id\n     *\n     * @return mixed\n     */\n    public function __get($id)\n    {\n        if ($this->shouldDelegate($id)) {\n            return $this->delegateTo($id);\n        }\n\n        return $this->offsetGet($id);\n    }\n\n    /**\n     * Magic set access.\n     *\n     * @param string $id\n     * @param mixed  $value\n     */\n    public function __set($id, $value)\n    {\n        $this->offsetSet($id, $value);\n    }\n\n    /**\n     * @param array $providers\n     */\n    public function registerProviders(array $providers)\n    {\n        foreach ($providers as $provider) {\n            parent::register(new $provider());\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/AES.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Support;\n\n/**\n * Class AES.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass AES\n{\n    /**\n     * @param string $text\n     * @param string $key\n     * @param string $iv\n     * @param int    $option\n     *\n     * @return string\n     */\n    public static function encrypt(string $text, string $key, string $iv, int $option = OPENSSL_RAW_DATA): string\n    {\n        self::validateKey($key);\n        self::validateIv($iv);\n\n        return openssl_encrypt($text, self::getMode($key), $key, $option, $iv);\n    }\n\n    /**\n     * @param string      $cipherText\n     * @param string      $key\n     * @param string      $iv\n     * @param int         $option\n     * @param string|null $method\n     *\n     * @return string\n     */\n    public static function decrypt(string $cipherText, string $key, string $iv, int $option = OPENSSL_RAW_DATA, $method = null): string\n    {\n        self::validateKey($key);\n        self::validateIv($iv);\n\n        return openssl_decrypt($cipherText, $method ?: self::getMode($key), $key, $option, $iv);\n    }\n\n    /**\n     * @param string $key\n     *\n     * @return string\n     */\n    public static function getMode($key)\n    {\n        return 'aes-'.(8 * strlen($key)).'-cbc';\n    }\n\n    /**\n     * @param string $key\n     */\n    public static function validateKey(string $key)\n    {\n        if (!in_array(strlen($key), [16, 24, 32], true)) {\n            throw new \\InvalidArgumentException(sprintf('Key length must be 16, 24, or 32 bytes; got key len (%s).', strlen($key)));\n        }\n    }\n\n    /**\n     * @param string $iv\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public static function validateIv(string $iv)\n    {\n        if (!empty($iv) && 16 !== strlen($iv)) {\n            throw new \\InvalidArgumentException('IV length must be 16 bytes.');\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/Arr.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Support;\n\n/**\n * Array helper from Illuminate\\Support\\Arr.\n */\nclass Arr\n{\n    /**\n     * Add an element to an array using \"dot\" notation if it doesn't exist.\n     *\n     * @param array  $array\n     * @param string $key\n     * @param mixed  $value\n     *\n     * @return array\n     */\n    public static function add(array $array, $key, $value)\n    {\n        if (is_null(static::get($array, $key))) {\n            static::set($array, $key, $value);\n        }\n\n        return $array;\n    }\n\n    /**\n     * Cross join the given arrays, returning all possible permutations.\n     *\n     * @param array ...$arrays\n     *\n     * @return array\n     */\n    public static function crossJoin(...$arrays)\n    {\n        $results = [[]];\n\n        foreach ($arrays as $index => $array) {\n            $append = [];\n\n            foreach ($results as $product) {\n                foreach ($array as $item) {\n                    $product[$index] = $item;\n\n                    $append[] = $product;\n                }\n            }\n\n            $results = $append;\n        }\n\n        return $results;\n    }\n\n    /**\n     * Divide an array into two arrays. One with keys and the other with values.\n     *\n     * @param array $array\n     *\n     * @return array\n     */\n    public static function divide(array $array)\n    {\n        return [array_keys($array), array_values($array)];\n    }\n\n    /**\n     * Flatten a multi-dimensional associative array with dots.\n     *\n     * @param array  $array\n     * @param string $prepend\n     *\n     * @return array\n     */\n    public static function dot(array $array, $prepend = '')\n    {\n        $results = [];\n\n        foreach ($array as $key => $value) {\n            if (is_array($value) && !empty($value)) {\n                $results = array_merge($results, static::dot($value, $prepend.$key.'.'));\n            } else {\n                $results[$prepend.$key] = $value;\n            }\n        }\n\n        return $results;\n    }\n\n    /**\n     * Get all of the given array except for a specified array of items.\n     *\n     * @param array        $array\n     * @param array|string $keys\n     *\n     * @return array\n     */\n    public static function except(array $array, $keys)\n    {\n        static::forget($array, $keys);\n\n        return $array;\n    }\n\n    /**\n     * Determine if the given key exists in the provided array.\n     *\n     * @param array      $array\n     * @param string|int $key\n     *\n     * @return bool\n     */\n    public static function exists(array $array, $key)\n    {\n        return array_key_exists($key, $array);\n    }\n\n    /**\n     * Return the first element in an array passing a given truth test.\n     *\n     * @param array         $array\n     * @param callable|null $callback\n     * @param mixed         $default\n     *\n     * @return mixed\n     */\n    public static function first(array $array, callable $callback = null, $default = null)\n    {\n        if (is_null($callback)) {\n            if (empty($array)) {\n                return $default;\n            }\n\n            foreach ($array as $item) {\n                return $item;\n            }\n        }\n\n        foreach ($array as $key => $value) {\n            if (call_user_func($callback, $value, $key)) {\n                return $value;\n            }\n        }\n\n        return $default;\n    }\n\n    /**\n     * Return the last element in an array passing a given truth test.\n     *\n     * @param array         $array\n     * @param callable|null $callback\n     * @param mixed         $default\n     *\n     * @return mixed\n     */\n    public static function last(array $array, callable $callback = null, $default = null)\n    {\n        if (is_null($callback)) {\n            return empty($array) ? $default : end($array);\n        }\n\n        return static::first(array_reverse($array, true), $callback, $default);\n    }\n\n    /**\n     * Flatten a multi-dimensional array into a single level.\n     *\n     * @param array $array\n     * @param int   $depth\n     *\n     * @return array\n     */\n    public static function flatten(array $array, $depth = \\PHP_INT_MAX)\n    {\n        return array_reduce($array, function ($result, $item) use ($depth) {\n            $item = $item instanceof Collection ? $item->all() : $item;\n\n            if (!is_array($item)) {\n                return array_merge($result, [$item]);\n            } elseif (1 === $depth) {\n                return array_merge($result, array_values($item));\n            }\n\n            return array_merge($result, static::flatten($item, $depth - 1));\n        }, []);\n    }\n\n    /**\n     * Remove one or many array items from a given array using \"dot\" notation.\n     *\n     * @param array        $array\n     * @param array|string $keys\n     */\n    public static function forget(array &$array, $keys)\n    {\n        $original = &$array;\n\n        $keys = (array) $keys;\n\n        if (0 === count($keys)) {\n            return;\n        }\n\n        foreach ($keys as $key) {\n            // if the exact key exists in the top-level, remove it\n            if (static::exists($array, $key)) {\n                unset($array[$key]);\n\n                continue;\n            }\n\n            $parts = explode('.', $key);\n\n            // clean up before each pass\n            $array = &$original;\n\n            while (count($parts) > 1) {\n                $part = array_shift($parts);\n\n                if (isset($array[$part]) && is_array($array[$part])) {\n                    $array = &$array[$part];\n                } else {\n                    continue 2;\n                }\n            }\n\n            unset($array[array_shift($parts)]);\n        }\n    }\n\n    /**\n     * Get an item from an array using \"dot\" notation.\n     *\n     * @param array  $array\n     * @param string $key\n     * @param mixed  $default\n     *\n     * @return mixed\n     */\n    public static function get(array $array, $key, $default = null)\n    {\n        if (is_null($key)) {\n            return $array;\n        }\n\n        if (static::exists($array, $key)) {\n            return $array[$key];\n        }\n\n        foreach (explode('.', $key) as $segment) {\n            if (static::exists($array, $segment)) {\n                $array = $array[$segment];\n            } else {\n                return $default;\n            }\n        }\n\n        return $array;\n    }\n\n    /**\n     * Check if an item or items exist in an array using \"dot\" notation.\n     *\n     * @param array        $array\n     * @param string|array $keys\n     *\n     * @return bool\n     */\n    public static function has(array $array, $keys)\n    {\n        if (is_null($keys)) {\n            return false;\n        }\n\n        $keys = (array) $keys;\n\n        if (empty($array)) {\n            return false;\n        }\n\n        if ($keys === []) {\n            return false;\n        }\n\n        foreach ($keys as $key) {\n            $subKeyArray = $array;\n\n            if (static::exists($array, $key)) {\n                continue;\n            }\n\n            foreach (explode('.', $key) as $segment) {\n                if (static::exists($subKeyArray, $segment)) {\n                    $subKeyArray = $subKeyArray[$segment];\n                } else {\n                    return false;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Determines if an array is associative.\n     *\n     * An array is \"associative\" if it doesn't have sequential numerical keys beginning with zero.\n     *\n     * @param array $array\n     *\n     * @return bool\n     */\n    public static function isAssoc(array $array)\n    {\n        $keys = array_keys($array);\n\n        return array_keys($keys) !== $keys;\n    }\n\n    /**\n     * Get a subset of the items from the given array.\n     *\n     * @param array        $array\n     * @param array|string $keys\n     *\n     * @return array\n     */\n    public static function only(array $array, $keys)\n    {\n        return array_intersect_key($array, array_flip((array) $keys));\n    }\n\n    /**\n     * Push an item onto the beginning of an array.\n     *\n     * @param array $array\n     * @param mixed $value\n     * @param mixed $key\n     *\n     * @return array\n     */\n    public static function prepend(array $array, $value, $key = null)\n    {\n        if (is_null($key)) {\n            array_unshift($array, $value);\n        } else {\n            $array = [$key => $value] + $array;\n        }\n\n        return $array;\n    }\n\n    /**\n     * Get a value from the array, and remove it.\n     *\n     * @param array  $array\n     * @param string $key\n     * @param mixed  $default\n     *\n     * @return mixed\n     */\n    public static function pull(array &$array, $key, $default = null)\n    {\n        $value = static::get($array, $key, $default);\n\n        static::forget($array, $key);\n\n        return $value;\n    }\n\n    /**\n     * Get a 1 value from an array.\n     *\n     * @param array    $array\n     * @param int|null $amount\n     *\n     * @return mixed\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public static function random(array $array, int $amount = null)\n    {\n        if (is_null($amount)) {\n            return $array[array_rand($array)];\n        }\n\n        $keys = array_rand($array, $amount);\n\n        $results = [];\n\n        foreach ((array) $keys as $key) {\n            $results[] = $array[$key];\n        }\n\n        return $results;\n    }\n\n    /**\n     * Set an array item to a given value using \"dot\" notation.\n     *\n     * If no key is given to the method, the entire array will be replaced.\n     *\n     * @param array  $array\n     * @param string $key\n     * @param mixed  $value\n     *\n     * @return array\n     */\n    public static function set(array &$array, string $key, $value)\n    {\n        $keys = explode('.', $key);\n\n        while (count($keys) > 1) {\n            $key = array_shift($keys);\n\n            // If the key doesn't exist at this depth, we will just create an empty array\n            // to hold the next value, allowing us to create the arrays to hold final\n            // values at the correct depth. Then we'll keep digging into the array.\n            if (!isset($array[$key]) || !is_array($array[$key])) {\n                $array[$key] = [];\n            }\n\n            $array = &$array[$key];\n        }\n\n        $array[array_shift($keys)] = $value;\n\n        return $array;\n    }\n\n    /**\n     * Filter the array using the given callback.\n     *\n     * @param array    $array\n     * @param callable $callback\n     *\n     * @return array\n     */\n    public static function where(array $array, callable $callback)\n    {\n        return array_filter($array, $callback, ARRAY_FILTER_USE_BOTH);\n    }\n\n    /**\n     * If the given value is not an array, wrap it in one.\n     *\n     * @param mixed $value\n     *\n     * @return array\n     */\n    public static function wrap($value)\n    {\n        return !is_array($value) ? [$value] : $value;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/ArrayAccessible.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Support;\n\nuse ArrayAccess;\nuse ArrayIterator;\nuse EasyWeChat\\Kernel\\Contracts\\Arrayable;\nuse IteratorAggregate;\n\n/**\n * Class ArrayAccessible.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ArrayAccessible implements ArrayAccess, IteratorAggregate, Arrayable\n{\n    private $array;\n\n    public function __construct(array $array = [])\n    {\n        $this->array = $array;\n    }\n\n    public function offsetExists($offset)\n    {\n        return array_key_exists($offset, $this->array);\n    }\n\n    public function offsetGet($offset)\n    {\n        return $this->array[$offset];\n    }\n\n    public function offsetSet($offset, $value)\n    {\n        if (null === $offset) {\n            $this->array[] = $value;\n        } else {\n            $this->array[$offset] = $value;\n        }\n    }\n\n    public function offsetUnset($offset)\n    {\n        unset($this->array[$offset]);\n    }\n\n    public function getIterator()\n    {\n        return new ArrayIterator($this->array);\n    }\n\n    public function toArray()\n    {\n        return $this->array;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/Collection.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Support;\n\nuse ArrayAccess;\nuse ArrayIterator;\nuse Countable;\nuse EasyWeChat\\Kernel\\Contracts\\Arrayable;\nuse IteratorAggregate;\nuse JsonSerializable;\nuse Serializable;\n\n/**\n * Class Collection.\n */\nclass Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable, Serializable, Arrayable\n{\n    /**\n     * The collection data.\n     *\n     * @var array\n     */\n    protected $items = [];\n\n    /**\n     * set data.\n     *\n     * @param array $items\n     */\n    public function __construct(array $items = [])\n    {\n        foreach ($items as $key => $value) {\n            $this->set($key, $value);\n        }\n    }\n\n    /**\n     * Return all items.\n     *\n     * @return array\n     */\n    public function all()\n    {\n        return $this->items;\n    }\n\n    /**\n     * Return specific items.\n     *\n     * @param array $keys\n     *\n     * @return \\EasyWeChat\\Kernel\\Support\\Collection\n     */\n    public function only(array $keys)\n    {\n        $return = [];\n\n        foreach ($keys as $key) {\n            $value = $this->get($key);\n\n            if (!is_null($value)) {\n                $return[$key] = $value;\n            }\n        }\n\n        return new static($return);\n    }\n\n    /**\n     * Get all items except for those with the specified keys.\n     *\n     * @param mixed $keys\n     *\n     * @return static\n     */\n    public function except($keys)\n    {\n        $keys = is_array($keys) ? $keys : func_get_args();\n\n        return new static(Arr::except($this->items, $keys));\n    }\n\n    /**\n     * Merge data.\n     *\n     * @param Collection|array $items\n     *\n     * @return \\EasyWeChat\\Kernel\\Support\\Collection\n     */\n    public function merge($items)\n    {\n        $clone = new static($this->all());\n\n        foreach ($items as $key => $value) {\n            $clone->set($key, $value);\n        }\n\n        return $clone;\n    }\n\n    /**\n     * To determine Whether the specified element exists.\n     *\n     * @param string $key\n     *\n     * @return bool\n     */\n    public function has($key)\n    {\n        return !is_null(Arr::get($this->items, $key));\n    }\n\n    /**\n     * Retrieve the first item.\n     *\n     * @return mixed\n     */\n    public function first()\n    {\n        return reset($this->items);\n    }\n\n    /**\n     * Retrieve the last item.\n     *\n     * @return bool\n     */\n    public function last()\n    {\n        $end = end($this->items);\n\n        reset($this->items);\n\n        return $end;\n    }\n\n    /**\n     * add the item value.\n     *\n     * @param string $key\n     * @param mixed  $value\n     */\n    public function add($key, $value)\n    {\n        Arr::set($this->items, $key, $value);\n    }\n\n    /**\n     * Set the item value.\n     *\n     * @param string $key\n     * @param mixed  $value\n     */\n    public function set($key, $value)\n    {\n        Arr::set($this->items, $key, $value);\n    }\n\n    /**\n     * Retrieve item from Collection.\n     *\n     * @param string $key\n     * @param mixed  $default\n     *\n     * @return mixed\n     */\n    public function get($key, $default = null)\n    {\n        return Arr::get($this->items, $key, $default);\n    }\n\n    /**\n     * Remove item form Collection.\n     *\n     * @param string $key\n     */\n    public function forget($key)\n    {\n        Arr::forget($this->items, $key);\n    }\n\n    /**\n     * Build to array.\n     *\n     * @return array\n     */\n    public function toArray()\n    {\n        return $this->all();\n    }\n\n    /**\n     * Build to json.\n     *\n     * @param int $option\n     *\n     * @return string\n     */\n    public function toJson($option = JSON_UNESCAPED_UNICODE)\n    {\n        return json_encode($this->all(), $option);\n    }\n\n    /**\n     * To string.\n     *\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->toJson();\n    }\n\n    /**\n     * (PHP 5 &gt;= 5.4.0)<br/>\n     * Specify data which should be serialized to JSON.\n     *\n     * @see http://php.net/manual/en/jsonserializable.jsonserialize.php\n     *\n     * @return mixed data which can be serialized by <b>json_encode</b>,\n     *               which is a value of any type other than a resource\n     */\n    #[\\ReturnTypeWillChange]\n    public function jsonSerialize()\n    {\n        return $this->items;\n    }\n\n    public function __serialize(): array\n    {\n        return $this->items;\n    }\n\n    /**\n     * (PHP 5 &gt;= 5.1.0)<br/>\n     * String representation of object.\n     *\n     * @see http://php.net/manual/en/serializable.serialize.php\n     *\n     * @return string the string representation of the object or null\n     */\n    public function serialize()\n    {\n        return serialize($this->items);\n    }\n\n    /**\n     * (PHP 5 &gt;= 5.0.0)<br/>\n     * Retrieve an external iterator.\n     *\n     * @see http://php.net/manual/en/iteratoraggregate.getiterator.php\n     *\n     * @return \\ArrayIterator An instance of an object implementing <b>Iterator</b> or\n     *                        <b>Traversable</b>\n     */\n    #[\\ReturnTypeWillChange]\n    public function getIterator()\n    {\n        return new ArrayIterator($this->items);\n    }\n\n    /**\n     * (PHP 5 &gt;= 5.1.0)<br/>\n     * Count elements of an object.\n     *\n     * @see http://php.net/manual/en/countable.count.php\n     *\n     * @return int the custom count as an integer.\n     *             </p>\n     *             <p>\n     *             The return value is cast to an integer\n     */\n    #[\\ReturnTypeWillChange]\n    public function count()\n    {\n        return count($this->items);\n    }\n\n    public function __unserialize(array $data): void\n    {\n        $this->items = $data;\n    }\n\n    /**\n     * (PHP 5 &gt;= 5.1.0)<br/>\n     * Constructs the object.\n     *\n     * @see  http://php.net/manual/en/serializable.unserialize.php\n     *\n     * @param string $serialized <p>\n     *                           The string representation of the object.\n     *                           </p>\n     *\n     * @return mixed|void\n     */\n    public function unserialize($serialized)\n    {\n        return $this->items = unserialize($serialized);\n    }\n\n    /**\n     * Get a data by key.\n     *\n     * @param string $key\n     *\n     * @return mixed\n     */\n    public function __get($key)\n    {\n        return $this->get($key);\n    }\n\n    /**\n     * Assigns a value to the specified data.\n     *\n     * @param string $key\n     * @param mixed  $value\n     */\n    public function __set($key, $value)\n    {\n        $this->set($key, $value);\n    }\n\n    /**\n     * Whether or not an data exists by key.\n     *\n     * @param string $key\n     *\n     * @return bool\n     */\n    public function __isset($key)\n    {\n        return $this->has($key);\n    }\n\n    /**\n     * Unset an data by key.\n     *\n     * @param string $key\n     */\n    public function __unset($key)\n    {\n        $this->forget($key);\n    }\n\n    /**\n     * var_export.\n     *\n     * @param array $properties\n     *\n     * @return array\n     */\n    public static function __set_state(array $properties)\n    {\n        return (new static($properties))->all();\n    }\n\n    /**\n     * (PHP 5 &gt;= 5.0.0)<br/>\n     * Whether a offset exists.\n     *\n     * @see http://php.net/manual/en/arrayaccess.offsetexists.php\n     *\n     * @param mixed $offset <p>\n     *                      An offset to check for.\n     *                      </p>\n     *\n     * @return bool true on success or false on failure.\n     *              The return value will be casted to boolean if non-boolean was returned\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetExists($offset)\n    {\n        return $this->has($offset);\n    }\n\n    /**\n     * (PHP 5 &gt;= 5.0.0)<br/>\n     * Offset to unset.\n     *\n     * @see http://php.net/manual/en/arrayaccess.offsetunset.php\n     *\n     * @param mixed $offset <p>\n     *                      The offset to unset.\n     *                      </p>\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetUnset($offset)\n    {\n        if ($this->offsetExists($offset)) {\n            $this->forget($offset);\n        }\n    }\n\n    /**\n     * (PHP 5 &gt;= 5.0.0)<br/>\n     * Offset to retrieve.\n     *\n     * @see http://php.net/manual/en/arrayaccess.offsetget.php\n     *\n     * @param mixed $offset <p>\n     *                      The offset to retrieve.\n     *                      </p>\n     *\n     * @return mixed Can return all value types\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetGet($offset)\n    {\n        return $this->offsetExists($offset) ? $this->get($offset) : null;\n    }\n\n    /**\n     * (PHP 5 &gt;= 5.0.0)<br/>\n     * Offset to set.\n     *\n     * @see http://php.net/manual/en/arrayaccess.offsetset.php\n     *\n     * @param mixed $offset <p>\n     *                      The offset to assign the value to.\n     *                      </p>\n     * @param mixed $value  <p>\n     *                      The value to set.\n     *                      </p>\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetSet($offset, $value)\n    {\n        $this->set($offset, $value);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/File.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Support;\n\nuse finfo;\n\n/**\n * Class File.\n */\nclass File\n{\n    /**\n     * MIME mapping.\n     *\n     * @var array\n     */\n    protected static $extensionMap = [\n        'audio/wav' => '.wav',\n        'audio/x-ms-wma' => '.wma',\n        'video/x-ms-wmv' => '.wmv',\n        'video/mp4' => '.mp4',\n        'audio/mpeg' => '.mp3',\n        'audio/amr' => '.amr',\n        'application/vnd.rn-realmedia' => '.rm',\n        'audio/mid' => '.mid',\n        'image/bmp' => '.bmp',\n        'image/gif' => '.gif',\n        'image/png' => '.png',\n        'image/tiff' => '.tiff',\n        'image/jpeg' => '.jpg',\n        'application/pdf' => '.pdf',\n\n        // 列举更多的文件 mime, 企业号是支持的,公众平台这边之后万一也更新了呢\n        'application/msword' => '.doc',\n\n        'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => '.docx',\n        'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => '.dotx',\n        'application/vnd.ms-word.document.macroEnabled.12' => '.docm',\n        'application/vnd.ms-word.template.macroEnabled.12' => '.dotm',\n\n        'application/vnd.ms-excel' => '.xls',\n\n        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => '.xlsx',\n        'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => '.xltx',\n        'application/vnd.ms-excel.sheet.macroEnabled.12' => '.xlsm',\n        'application/vnd.ms-excel.template.macroEnabled.12' => '.xltm',\n        'application/vnd.ms-excel.addin.macroEnabled.12' => '.xlam',\n        'application/vnd.ms-excel.sheet.binary.macroEnabled.12' => '.xlsb',\n\n        'application/vnd.ms-powerpoint' => '.ppt',\n\n        'application/vnd.openxmlformats-officedocument.presentationml.presentation' => '.pptx',\n        'application/vnd.openxmlformats-officedocument.presentationml.template' => '.potx',\n        'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => '.ppsx',\n        'application/vnd.ms-powerpoint.addin.macroEnabled.12' => '.ppam',\n    ];\n\n    /**\n     * File header signatures.\n     *\n     * @var array\n     */\n    protected static $signatures = [\n        'ffd8ff' => '.jpg',\n        '424d' => '.bmp',\n        '47494638' => '.gif',\n        '2f55736572732f6f7665' => '.png',\n        '89504e47' => '.png',\n        '494433' => '.mp3',\n        'fffb' => '.mp3',\n        'fff3' => '.mp3',\n        '3026b2758e66cf11' => '.wma',\n        '52494646' => '.wav',\n        '57415645' => '.wav',\n        '41564920' => '.avi',\n        '000001ba' => '.mpg',\n        '000001b3' => '.mpg',\n        '2321414d52' => '.amr',\n        '25504446' => '.pdf',\n    ];\n\n    /**\n     * Return steam extension.\n     *\n     * @param string $stream\n     *\n     * @return string|false\n     */\n    public static function getStreamExt($stream)\n    {\n        $ext = self::getExtBySignature($stream);\n\n        try {\n            if (empty($ext) && is_readable($stream)) {\n                $stream = file_get_contents($stream);\n            }\n        } catch (\\Exception $e) {\n        }\n\n        $fileInfo = new finfo(FILEINFO_MIME);\n\n        $mime = strstr($fileInfo->buffer($stream), ';', true);\n\n        return isset(self::$extensionMap[$mime]) ? self::$extensionMap[$mime] : $ext;\n    }\n\n    /**\n     * Get file extension by file header signature.\n     *\n     * @param string $stream\n     *\n     * @return string\n     */\n    public static function getExtBySignature($stream)\n    {\n        $prefix = strval(bin2hex(mb_strcut($stream, 0, 10)));\n\n        foreach (self::$signatures as $signature => $extension) {\n            if (0 === strpos($prefix, strval($signature))) {\n                return $extension;\n            }\n        }\n\n        return '';\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/Helpers.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Support;\n\n/*\n * helpers.\n *\n * @author overtrue <i@overtrue.me>\n */\n\n/**\n * Generate a signature.\n *\n * @param array  $attributes\n * @param string $key\n * @param string $encryptMethod\n *\n * @return string\n */\nfunction generate_sign(array $attributes, $key, $encryptMethod = 'md5')\n{\n    ksort($attributes);\n\n    $attributes['key'] = $key;\n\n    return strtoupper(call_user_func_array($encryptMethod, [urldecode(http_build_query($attributes))]));\n}\n\n/**\n * @param string $signType\n * @param string $secretKey\n *\n * @return \\Closure|string\n */\nfunction get_encrypt_method(string $signType, string $secretKey = '')\n{\n    if ('HMAC-SHA256' === $signType) {\n        return function ($str) use ($secretKey) {\n            return hash_hmac('sha256', $str, $secretKey);\n        };\n    }\n\n    return 'md5';\n}\n\n/**\n * Get client ip.\n *\n * @return string\n */\nfunction get_client_ip()\n{\n    if (!empty($_SERVER['REMOTE_ADDR'])) {\n        $ip = $_SERVER['REMOTE_ADDR'];\n    } else {\n        // for php-cli(phpunit etc.)\n        $ip = defined('PHPUNIT_RUNNING') ? '127.0.0.1' : gethostbyname(gethostname());\n    }\n\n    return filter_var($ip, FILTER_VALIDATE_IP) ?: '127.0.0.1';\n}\n\n/**\n * Get current server ip.\n *\n * @return string\n */\nfunction get_server_ip()\n{\n    if (!empty($_SERVER['SERVER_ADDR'])) {\n        $ip = $_SERVER['SERVER_ADDR'];\n    } elseif (!empty($_SERVER['SERVER_NAME'])) {\n        $ip = gethostbyname($_SERVER['SERVER_NAME']);\n    } else {\n        // for php-cli(phpunit etc.)\n        $ip = defined('PHPUNIT_RUNNING') ? '127.0.0.1' : gethostbyname(gethostname());\n    }\n\n    return filter_var($ip, FILTER_VALIDATE_IP) ?: '127.0.0.1';\n}\n\n/**\n * Return current url.\n *\n * @return string\n */\nfunction current_url()\n{\n    $protocol = 'http://';\n\n    if ((!empty($_SERVER['HTTPS']) && 'off' !== $_SERVER['HTTPS']) || ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? 'http') === 'https') {\n        $protocol = 'https://';\n    }\n\n    return $protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];\n}\n\n/**\n * Return random string.\n *\n * @param string $length\n *\n * @return string\n */\nfunction str_random($length)\n{\n    return Str::random($length);\n}\n\n/**\n * @param string $content\n * @param string $publicKey\n *\n * @return string\n */\nfunction rsa_public_encrypt($content, $publicKey)\n{\n    $encrypted = '';\n    openssl_public_encrypt($content, $encrypted, openssl_pkey_get_public($publicKey), OPENSSL_PKCS1_OAEP_PADDING);\n\n    return base64_encode($encrypted);\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/Str.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Support;\n\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\n\n/**\n * Class Str.\n */\nclass Str\n{\n    /**\n     * The cache of snake-cased words.\n     *\n     * @var array\n     */\n    protected static $snakeCache = [];\n\n    /**\n     * The cache of camel-cased words.\n     *\n     * @var array\n     */\n    protected static $camelCache = [];\n\n    /**\n     * The cache of studly-cased words.\n     *\n     * @var array\n     */\n    protected static $studlyCache = [];\n\n    /**\n     * Convert a value to camel case.\n     *\n     * @param string $value\n     *\n     * @return string\n     */\n    public static function camel($value)\n    {\n        if (isset(static::$camelCache[$value])) {\n            return static::$camelCache[$value];\n        }\n\n        return static::$camelCache[$value] = lcfirst(static::studly($value));\n    }\n\n    /**\n     * Generate a more truly \"random\" alpha-numeric string.\n     *\n     * @param int $length\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public static function random($length = 16)\n    {\n        $string = '';\n\n        while (($len = strlen($string)) < $length) {\n            $size = $length - $len;\n\n            $bytes = static::randomBytes($size);\n\n            $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);\n        }\n\n        return $string;\n    }\n\n    /**\n     * Generate a more truly \"random\" bytes.\n     *\n     * @param int $length\n     *\n     * @return string\n     *\n     * @throws RuntimeException\n     *\n     * @codeCoverageIgnore\n     *\n     * @throws \\Exception\n     */\n    public static function randomBytes($length = 16)\n    {\n        if (function_exists('random_bytes')) {\n            $bytes = random_bytes($length);\n        } elseif (function_exists('openssl_random_pseudo_bytes')) {\n            $bytes = openssl_random_pseudo_bytes($length, $strong);\n            if (false === $bytes || false === $strong) {\n                throw new RuntimeException('Unable to generate random string.');\n            }\n        } else {\n            throw new RuntimeException('OpenSSL extension is required for PHP 5 users.');\n        }\n\n        return $bytes;\n    }\n\n    /**\n     * Generate a \"random\" alpha-numeric string.\n     *\n     * Should not be considered sufficient for cryptography, etc.\n     *\n     * @param int $length\n     *\n     * @return string\n     */\n    public static function quickRandom($length = 16)\n    {\n        $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\n        return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);\n    }\n\n    /**\n     * Convert the given string to upper-case.\n     *\n     * @param string $value\n     *\n     * @return string\n     */\n    public static function upper($value)\n    {\n        return mb_strtoupper($value);\n    }\n\n    /**\n     * Convert the given string to title case.\n     *\n     * @param string $value\n     *\n     * @return string\n     */\n    public static function title($value)\n    {\n        return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8');\n    }\n\n    /**\n     * Convert a string to snake case.\n     *\n     * @param string $value\n     * @param string $delimiter\n     *\n     * @return string\n     */\n    public static function snake($value, $delimiter = '_')\n    {\n        $key = $value.$delimiter;\n\n        if (isset(static::$snakeCache[$key])) {\n            return static::$snakeCache[$key];\n        }\n\n        if (!ctype_lower($value)) {\n            $value = strtolower(preg_replace('/(.)(?=[A-Z])/', '$1'.$delimiter, $value));\n        }\n\n        return static::$snakeCache[$key] = trim($value, '_');\n    }\n\n    /**\n     * Convert a value to studly caps case.\n     *\n     * @param string $value\n     *\n     * @return string\n     */\n    public static function studly($value)\n    {\n        $key = $value;\n\n        if (isset(static::$studlyCache[$key])) {\n            return static::$studlyCache[$key];\n        }\n\n        $value = ucwords(str_replace(['-', '_'], ' ', $value));\n\n        return static::$studlyCache[$key] = str_replace(' ', '', $value);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/XML.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Support;\n\nuse SimpleXMLElement;\n\n/**\n * Class XML.\n */\nclass XML\n{\n    /**\n     * XML to array.\n     *\n     * @param string $xml XML string\n     *\n     * @return array\n     */\n    public static function parse($xml)\n    {\n        $backup = PHP_MAJOR_VERSION < 8 ? libxml_disable_entity_loader(true) : null;\n\n        $result = self::normalize(simplexml_load_string(self::sanitize($xml), 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_NOCDATA | LIBXML_NOBLANKS));\n\n        PHP_MAJOR_VERSION < 8 && libxml_disable_entity_loader($backup);\n\n        return $result;\n    }\n\n    /**\n     * XML encode.\n     *\n     * @param mixed  $data\n     * @param string $root\n     * @param string $item\n     * @param string $attr\n     * @param string $id\n     *\n     * @return string\n     */\n    public static function build(\n        $data,\n        $root = 'xml',\n        $item = 'item',\n        $attr = '',\n        $id = 'id'\n    ) {\n        if (is_array($attr)) {\n            $_attr = [];\n\n            foreach ($attr as $key => $value) {\n                $_attr[] = \"{$key}=\\\"{$value}\\\"\";\n            }\n\n            $attr = implode(' ', $_attr);\n        }\n\n        $attr = trim($attr);\n        $attr = empty($attr) ? '' : \" {$attr}\";\n        $xml = \"<{$root}{$attr}>\";\n        $xml .= self::data2Xml($data, $item, $id);\n        $xml .= \"</{$root}>\";\n\n        return $xml;\n    }\n\n    /**\n     * Build CDATA.\n     *\n     * @param string $string\n     *\n     * @return string\n     */\n    public static function cdata($string)\n    {\n        return sprintf('<![CDATA[%s]]>', $string);\n    }\n\n    /**\n     * Object to array.\n     *\n     *\n     * @param SimpleXMLElement $obj\n     *\n     * @return array\n     */\n    protected static function normalize($obj)\n    {\n        $result = null;\n\n        if (is_object($obj)) {\n            $obj = (array) $obj;\n        }\n\n        if (is_array($obj)) {\n            foreach ($obj as $key => $value) {\n                $res = self::normalize($value);\n                if (('@attributes' === $key) && ($key)) {\n                    $result = $res; // @codeCoverageIgnore\n                } else {\n                    $result[$key] = $res;\n                }\n            }\n        } else {\n            $result = $obj;\n        }\n\n        return $result;\n    }\n\n    /**\n     * Array to XML.\n     *\n     * @param array  $data\n     * @param string $item\n     * @param string $id\n     *\n     * @return string\n     */\n    protected static function data2Xml($data, $item = 'item', $id = 'id')\n    {\n        $xml = $attr = '';\n\n        foreach ($data as $key => $val) {\n            if (is_numeric($key)) {\n                $id && $attr = \" {$id}=\\\"{$key}\\\"\";\n                $key = $item;\n            }\n\n            $xml .= \"<{$key}{$attr}>\";\n\n            if ((is_array($val) || is_object($val))) {\n                $xml .= self::data2Xml((array) $val, $item, $id);\n            } else {\n                $xml .= is_numeric($val) ? $val : self::cdata($val);\n            }\n\n            $xml .= \"</{$key}>\";\n        }\n\n        return $xml;\n    }\n\n    /**\n     * Delete invalid characters in XML.\n     *\n     * @see https://www.w3.org/TR/2008/REC-xml-20081126/#charsets - XML charset range\n     * @see http://php.net/manual/en/regexp.reference.escape.php - escape in UTF-8 mode\n     *\n     * @param string $xml\n     *\n     * @return string\n     */\n    public static function sanitize($xml)\n    {\n        return preg_replace('/[^\\x{9}\\x{A}\\x{D}\\x{20}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{10000}-\\x{10FFFF}]+/u', '', $xml);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Traits/HasAttributes.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Traits;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\Support\\Arr;\nuse EasyWeChat\\Kernel\\Support\\Str;\n\n/**\n * Trait Attributes.\n */\ntrait HasAttributes\n{\n    /**\n     * @var array\n     */\n    protected $attributes = [];\n\n    /**\n     * @var bool\n     */\n    protected $snakeable = true;\n\n    /**\n     * Set Attributes.\n     *\n     * @param array $attributes\n     *\n     * @return $this\n     */\n    public function setAttributes(array $attributes = [])\n    {\n        $this->attributes = $attributes;\n\n        return $this;\n    }\n\n    /**\n     * Set attribute.\n     *\n     * @param string $attribute\n     * @param string $value\n     *\n     * @return $this\n     */\n    public function setAttribute($attribute, $value)\n    {\n        Arr::set($this->attributes, $attribute, $value);\n\n        return $this;\n    }\n\n    /**\n     * Get attribute.\n     *\n     * @param string $attribute\n     * @param mixed  $default\n     *\n     * @return mixed\n     */\n    public function getAttribute($attribute, $default = null)\n    {\n        return Arr::get($this->attributes, $attribute, $default);\n    }\n\n    /**\n     * @param string $attribute\n     *\n     * @return bool\n     */\n    public function isRequired($attribute)\n    {\n        return in_array($attribute, $this->getRequired(), true);\n    }\n\n    /**\n     * @return array|mixed\n     */\n    public function getRequired()\n    {\n        return property_exists($this, 'required') ? $this->required : [];\n    }\n\n    /**\n     * Set attribute.\n     *\n     * @param string $attribute\n     * @param mixed  $value\n     *\n     * @return $this\n     */\n    public function with($attribute, $value)\n    {\n        $this->snakeable && $attribute = Str::snake($attribute);\n\n        $this->setAttribute($attribute, $value);\n\n        return $this;\n    }\n\n    /**\n     * Override parent set() method.\n     *\n     * @param string $attribute\n     * @param mixed  $value\n     *\n     * @return $this\n     */\n    public function set($attribute, $value)\n    {\n        $this->setAttribute($attribute, $value);\n\n        return $this;\n    }\n\n    /**\n     * Override parent get() method.\n     *\n     * @param string $attribute\n     * @param mixed  $default\n     *\n     * @return mixed\n     */\n    public function get($attribute, $default = null)\n    {\n        return $this->getAttribute($attribute, $default);\n    }\n\n    /**\n     * @param string $key\n     *\n     * @return bool\n     */\n    public function has(string $key)\n    {\n        return Arr::has($this->attributes, $key);\n    }\n\n    /**\n     * @param array $attributes\n     *\n     * @return $this\n     */\n    public function merge(array $attributes)\n    {\n        $this->attributes = array_merge($this->attributes, $attributes);\n\n        return $this;\n    }\n\n    /**\n     * @param array|string $keys\n     *\n     * @return array\n     */\n    public function only($keys)\n    {\n        return Arr::only($this->attributes, $keys);\n    }\n\n    /**\n     * Return all items.\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function all()\n    {\n        $this->checkRequiredAttributes();\n\n        return $this->attributes;\n    }\n\n    /**\n     * Magic call.\n     *\n     * @param string $method\n     * @param array  $args\n     *\n     * @return $this\n     */\n    public function __call($method, $args)\n    {\n        if (0 === stripos($method, 'with')) {\n            return $this->with(substr($method, 4), array_shift($args));\n        }\n\n        throw new \\BadMethodCallException(sprintf('Method \"%s\" does not exists.', $method));\n    }\n\n    /**\n     * Magic get.\n     *\n     * @param string $property\n     *\n     * @return mixed\n     */\n    public function __get($property)\n    {\n        return $this->get($property);\n    }\n\n    /**\n     * Magic set.\n     *\n     * @param string $property\n     * @param mixed  $value\n     *\n     * @return $this\n     */\n    public function __set($property, $value)\n    {\n        return $this->with($property, $value);\n    }\n\n    /**\n     * Whether or not an data exists by key.\n     *\n     * @param string $key\n     *\n     * @return bool\n     */\n    public function __isset($key)\n    {\n        return isset($this->attributes[$key]);\n    }\n\n    /**\n     * Check required attributes.\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    protected function checkRequiredAttributes()\n    {\n        foreach ($this->getRequired() as $attribute) {\n            if (is_null($this->get($attribute))) {\n                throw new InvalidArgumentException(sprintf('\"%s\" cannot be empty.', $attribute));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Traits/HasHttpRequests.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Traits;\n\nuse GuzzleHttp\\Client;\nuse GuzzleHttp\\ClientInterface;\nuse GuzzleHttp\\HandlerStack;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Trait HasHttpRequests.\n *\n * @author overtrue <i@overtrue.me>\n */\ntrait HasHttpRequests\n{\n    use ResponseCastable;\n\n    /**\n     * @var \\GuzzleHttp\\ClientInterface\n     */\n    protected $httpClient;\n\n    /**\n     * @var array\n     */\n    protected $middlewares = [];\n\n    /**\n     * @var \\GuzzleHttp\\HandlerStack\n     */\n    protected $handlerStack;\n\n    /**\n     * @var array\n     */\n    protected static $defaults = [\n        'curl' => [\n            CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,\n        ],\n    ];\n\n    /**\n     * Set guzzle default settings.\n     *\n     * @param array $defaults\n     */\n    public static function setDefaultOptions($defaults = [])\n    {\n        self::$defaults = $defaults;\n    }\n\n    /**\n     * Return current guzzle default settings.\n     *\n     * @return array\n     */\n    public static function getDefaultOptions(): array\n    {\n        return self::$defaults;\n    }\n\n    /**\n     * Set GuzzleHttp\\Client.\n     *\n     * @param \\GuzzleHttp\\ClientInterface $httpClient\n     *\n     * @return $this\n     */\n    public function setHttpClient(ClientInterface $httpClient)\n    {\n        $this->httpClient = $httpClient;\n\n        return $this;\n    }\n\n    /**\n     * Return GuzzleHttp\\ClientInterface instance.\n     *\n     * @return ClientInterface\n     */\n    public function getHttpClient(): ClientInterface\n    {\n        if (!($this->httpClient instanceof ClientInterface)) {\n            if (property_exists($this, 'app') && $this->app['http_client']) {\n                $this->httpClient = $this->app['http_client'];\n            } else {\n                $this->httpClient = new Client(['handler' => HandlerStack::create($this->getGuzzleHandler())]);\n            }\n        }\n\n        return $this->httpClient;\n    }\n\n    /**\n     * Add a middleware.\n     *\n     * @param callable $middleware\n     * @param string   $name\n     *\n     * @return $this\n     */\n    public function pushMiddleware(callable $middleware, string $name = null)\n    {\n        if (!is_null($name)) {\n            $this->middlewares[$name] = $middleware;\n        } else {\n            array_push($this->middlewares, $middleware);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Return all middlewares.\n     *\n     * @return array\n     */\n    public function getMiddlewares(): array\n    {\n        return $this->middlewares;\n    }\n\n    /**\n     * Make a request.\n     *\n     * @param string $url\n     * @param string $method\n     * @param array  $options\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface\n     *\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function request($url, $method = 'GET', $options = []): ResponseInterface\n    {\n        $method = strtoupper($method);\n\n        $options = array_merge(self::$defaults, $options, ['handler' => $this->getHandlerStack()]);\n\n        $options = $this->fixJsonIssue($options);\n\n        if (property_exists($this, 'baseUri') && !is_null($this->baseUri)) {\n            $options['base_uri'] = $this->baseUri;\n        }\n\n        $response = $this->getHttpClient()->request($method, $url, $options);\n        $response->getBody()->rewind();\n\n        return $response;\n    }\n\n    /**\n     * @param \\GuzzleHttp\\HandlerStack $handlerStack\n     *\n     * @return $this\n     */\n    public function setHandlerStack(HandlerStack $handlerStack)\n    {\n        $this->handlerStack = $handlerStack;\n\n        return $this;\n    }\n\n    /**\n     * Build a handler stack.\n     *\n     * @return \\GuzzleHttp\\HandlerStack\n     */\n    public function getHandlerStack(): HandlerStack\n    {\n        if ($this->handlerStack) {\n            return $this->handlerStack;\n        }\n\n        $this->handlerStack = HandlerStack::create($this->getGuzzleHandler());\n\n        foreach ($this->middlewares as $name => $middleware) {\n            $this->handlerStack->push($middleware, $name);\n        }\n\n        return $this->handlerStack;\n    }\n\n    /**\n     * @param array $options\n     *\n     * @return array\n     */\n    protected function fixJsonIssue(array $options): array\n    {\n        if (isset($options['json']) && is_array($options['json'])) {\n            $options['headers'] = array_merge($options['headers'] ?? [], ['Content-Type' => 'application/json']);\n\n            if (empty($options['json'])) {\n                $options['body'] = \\GuzzleHttp\\json_encode($options['json'], JSON_FORCE_OBJECT);\n            } else {\n                $options['body'] = \\GuzzleHttp\\json_encode($options['json'], JSON_UNESCAPED_UNICODE);\n            }\n\n            unset($options['json']);\n        }\n\n        return $options;\n    }\n\n    /**\n     * Get guzzle handler.\n     *\n     * @return callable\n     */\n    protected function getGuzzleHandler()\n    {\n        if (property_exists($this, 'app') && isset($this->app['guzzle_handler'])) {\n            return is_string($handler = $this->app->raw('guzzle_handler'))\n                        ? new $handler()\n                        : $handler;\n        }\n\n        return \\GuzzleHttp\\choose_handler();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Traits/InteractsWithCache.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Traits;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\ServiceContainer;\nuse Psr\\Cache\\CacheItemPoolInterface;\nuse Psr\\SimpleCache\\CacheInterface as SimpleCacheInterface;\nuse Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter;\nuse Symfony\\Component\\Cache\\Psr16Cache;\nuse Symfony\\Component\\Cache\\Simple\\FilesystemCache;\n\n/**\n * Trait InteractsWithCache.\n *\n * @author overtrue <i@overtrue.me>\n */\ntrait InteractsWithCache\n{\n    /**\n     * @var \\Psr\\SimpleCache\\CacheInterface\n     */\n    protected $cache;\n\n    /**\n     * Get cache instance.\n     *\n     * @return \\Psr\\SimpleCache\\CacheInterface\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function getCache()\n    {\n        if ($this->cache) {\n            return $this->cache;\n        }\n\n        if (property_exists($this, 'app') && $this->app instanceof ServiceContainer && isset($this->app['cache'])) {\n            $this->setCache($this->app['cache']);\n\n            // Fix PHPStan error\n            assert($this->cache instanceof \\Psr\\SimpleCache\\CacheInterface);\n\n            return $this->cache;\n        }\n\n        return $this->cache = $this->createDefaultCache();\n    }\n\n    /**\n     * Set cache instance.\n     *\n     * @param \\Psr\\SimpleCache\\CacheInterface|\\Psr\\Cache\\CacheItemPoolInterface $cache\n     *\n     * @return $this\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function setCache($cache)\n    {\n        if (empty(\\array_intersect([SimpleCacheInterface::class, CacheItemPoolInterface::class], \\class_implements($cache)))) {\n            throw new InvalidArgumentException(\\sprintf('The cache instance must implements %s or %s interface.', SimpleCacheInterface::class, CacheItemPoolInterface::class));\n        }\n\n        if ($cache instanceof CacheItemPoolInterface) {\n            if (!$this->isSymfony43OrHigher()) {\n                throw new InvalidArgumentException(sprintf('The cache instance must implements %s', SimpleCacheInterface::class));\n            }\n            $cache = new Psr16Cache($cache);\n        }\n\n        $this->cache = $cache;\n\n        return $this;\n    }\n\n    /**\n     * @return \\Psr\\SimpleCache\\CacheInterface\n     */\n    protected function createDefaultCache()\n    {\n        if ($this->isSymfony43OrHigher()) {\n            return new Psr16Cache(new FilesystemAdapter('easywechat', 1500));\n        }\n\n        return new FilesystemCache();\n    }\n\n    /**\n     * @return bool\n     */\n    protected function isSymfony43OrHigher(): bool\n    {\n        return \\class_exists('Symfony\\Component\\Cache\\Psr16Cache');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Traits/Observable.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Traits;\n\nuse EasyWeChat\\Kernel\\Clauses\\Clause;\nuse EasyWeChat\\Kernel\\Contracts\\EventHandlerInterface;\nuse EasyWeChat\\Kernel\\Decorators\\FinallyResult;\nuse EasyWeChat\\Kernel\\Decorators\\TerminateResult;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Trait Observable.\n *\n * @author overtrue <i@overtrue.me>\n */\ntrait Observable\n{\n    /**\n     * @var array\n     */\n    protected $handlers = [];\n\n    /**\n     * @var array\n     */\n    protected $clauses = [];\n\n    /**\n     * @param \\Closure|EventHandlerInterface|callable|string $handler\n     * @param \\Closure|EventHandlerInterface|callable|string $condition\n     *\n     * @return \\EasyWeChat\\Kernel\\Clauses\\Clause\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\ReflectionException\n     */\n    public function push($handler, $condition = '*')\n    {\n        list($handler, $condition) = $this->resolveHandlerAndCondition($handler, $condition);\n\n        if (!isset($this->handlers[$condition])) {\n            $this->handlers[$condition] = [];\n        }\n\n        array_push($this->handlers[$condition], $handler);\n\n        return $this->newClause($handler);\n    }\n\n    /**\n     * @param array $handlers\n     *\n     * @return $this\n     */\n    public function setHandlers(array $handlers = [])\n    {\n        $this->handlers = $handlers;\n\n        return $this;\n    }\n\n    /**\n     * @param \\Closure|EventHandlerInterface|string $handler\n     * @param \\Closure|EventHandlerInterface|string $condition\n     *\n     * @return \\EasyWeChat\\Kernel\\Clauses\\Clause\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\ReflectionException\n     */\n    public function unshift($handler, $condition = '*')\n    {\n        list($handler, $condition) = $this->resolveHandlerAndCondition($handler, $condition);\n\n        if (!isset($this->handlers[$condition])) {\n            $this->handlers[$condition] = [];\n        }\n\n        array_unshift($this->handlers[$condition], $handler);\n\n        return $this->newClause($handler);\n    }\n\n    /**\n     * @param string                                $condition\n     * @param \\Closure|EventHandlerInterface|string $handler\n     *\n     * @return \\EasyWeChat\\Kernel\\Clauses\\Clause\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\ReflectionException\n     */\n    public function observe($condition, $handler)\n    {\n        return $this->push($handler, $condition);\n    }\n\n    /**\n     * @param string                                $condition\n     * @param \\Closure|EventHandlerInterface|string $handler\n     *\n     * @return \\EasyWeChat\\Kernel\\Clauses\\Clause\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\ReflectionException\n     */\n    public function on($condition, $handler)\n    {\n        return $this->push($handler, $condition);\n    }\n\n    /**\n     * @param string|int $event\n     * @param mixed      ...$payload\n     *\n     * @return mixed|null\n     */\n    public function dispatch($event, $payload)\n    {\n        return $this->notify($event, $payload);\n    }\n\n    /**\n     * @param string|int $event\n     * @param mixed      ...$payload\n     *\n     * @return mixed|null\n     */\n    public function notify($event, $payload)\n    {\n        $result = null;\n\n        foreach ($this->handlers as $condition => $handlers) {\n            if ('*' === $condition || ($condition & $event) === $event) {\n                foreach ($handlers as $handler) {\n                    if ($clause = $this->clauses[$this->getHandlerHash($handler)] ?? null) {\n                        if ($clause->intercepted($payload)) {\n                            continue;\n                        }\n                    }\n\n                    $response = $this->callHandler($handler, $payload);\n\n                    switch (true) {\n                        case $response instanceof TerminateResult:\n                            return $response->content;\n                        case true === $response:\n                            continue 2;\n                        case false === $response:\n                            break 3;\n                        case !empty($response) && !($result instanceof FinallyResult):\n                            $result = $response;\n                    }\n                }\n            }\n        }\n\n        return $result instanceof FinallyResult ? $result->content : $result;\n    }\n\n    /**\n     * @return array\n     */\n    public function getHandlers()\n    {\n        return $this->handlers;\n    }\n\n    /**\n     * @param mixed $handler\n     *\n     * @return \\EasyWeChat\\Kernel\\Clauses\\Clause\n     */\n    protected function newClause($handler): Clause\n    {\n        return $this->clauses[$this->getHandlerHash($handler)] = new Clause();\n    }\n\n    /**\n     * @param mixed $handler\n     *\n     * @return string\n     */\n    protected function getHandlerHash($handler)\n    {\n        if (is_string($handler)) {\n            return $handler;\n        }\n\n        if (is_array($handler)) {\n            return is_string($handler[0])\n                ? $handler[0].'::'.$handler[1]\n                : get_class($handler[0]).$handler[1];\n        }\n\n        return spl_object_hash($handler);\n    }\n\n    /**\n     * @param callable $handler\n     * @param mixed    $payload\n     *\n     * @return mixed\n     */\n    protected function callHandler(callable $handler, $payload)\n    {\n        try {\n            return call_user_func_array($handler, [$payload]);\n        } catch (\\Exception $e) {\n            if (property_exists($this, 'app') && $this->app instanceof ServiceContainer) {\n                $this->app['logger']->error($e->getCode().': '.$e->getMessage(), [\n                    'code' => $e->getCode(),\n                    'message' => $e->getMessage(),\n                    'file' => $e->getFile(),\n                    'line' => $e->getLine(),\n                ]);\n            }\n        }\n    }\n\n    /**\n     * @param mixed $handler\n     *\n     * @return \\Closure\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\ReflectionException\n     */\n    protected function makeClosure($handler)\n    {\n        if (is_callable($handler)) {\n            return $handler;\n        }\n\n        if (is_string($handler) && '*' !== $handler) {\n            if (!class_exists($handler)) {\n                throw new InvalidArgumentException(sprintf('Class \"%s\" not exists.', $handler));\n            }\n\n            if (!in_array(EventHandlerInterface::class, (new \\ReflectionClass($handler))->getInterfaceNames(), true)) {\n                throw new InvalidArgumentException(sprintf('Class \"%s\" not an instance of \"%s\".', $handler, EventHandlerInterface::class));\n            }\n\n            return function ($payload) use ($handler) {\n                return (new $handler($this->app ?? null))->handle($payload);\n            };\n        }\n\n        if ($handler instanceof EventHandlerInterface) {\n            return function () use ($handler) {\n                return $handler->handle(...func_get_args());\n            };\n        }\n\n        throw new InvalidArgumentException('No valid handler is found in arguments.');\n    }\n\n    /**\n     * @param mixed $handler\n     * @param mixed $condition\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\ReflectionException\n     */\n    protected function resolveHandlerAndCondition($handler, $condition): array\n    {\n        if (is_int($handler) || (is_string($handler) && !class_exists($handler))) {\n            list($handler, $condition) = [$condition, $handler];\n        }\n\n        return [$this->makeClosure($handler), $condition];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Traits/ResponseCastable.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Kernel\\Traits;\n\nuse EasyWeChat\\Kernel\\Contracts\\Arrayable;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException;\nuse EasyWeChat\\Kernel\\Http\\Response;\nuse EasyWeChat\\Kernel\\Support\\Collection;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Trait ResponseCastable.\n *\n * @author overtrue <i@overtrue.me>\n */\ntrait ResponseCastable\n{\n    /**\n     * @param \\Psr\\Http\\Message\\ResponseInterface $response\n     * @param string|null                         $type\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    protected function castResponseToType(ResponseInterface $response, $type = null)\n    {\n        $response = Response::buildFromPsrResponse($response);\n        $response->getBody()->rewind();\n\n        switch ($type ?? 'array') {\n            case 'collection':\n                return $response->toCollection();\n            case 'array':\n                return $response->toArray();\n            case 'object':\n                return $response->toObject();\n            case 'raw':\n                return $response;\n            default:\n                if (!is_subclass_of($type, Arrayable::class)) {\n                    throw new InvalidConfigException(sprintf('Config key \"response_type\" classname must be an instanceof %s', Arrayable::class));\n                }\n\n                return new $type($response);\n        }\n    }\n\n    /**\n     * @param mixed       $response\n     * @param string|null $type\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    protected function detectAndCastResponseToType($response, $type = null)\n    {\n        switch (true) {\n            case $response instanceof ResponseInterface:\n                $response = Response::buildFromPsrResponse($response);\n\n                break;\n            case $response instanceof Arrayable:\n                $response = new Response(200, [], json_encode($response->toArray()));\n\n                break;\n            case ($response instanceof Collection) || is_array($response) || is_object($response):\n                $response = new Response(200, [], json_encode($response));\n\n                break;\n            case is_scalar($response):\n                $response = new Response(200, [], (string) $response);\n\n                break;\n            default:\n                throw new InvalidArgumentException(sprintf('Unsupported response type \"%s\"', gettype($response)));\n        }\n\n        return $this->castResponseToType($response, $type);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\ServiceContainer;\nuse EasyWeChat\\Kernel\\Support;\nuse EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\InvalidSignException;\n\n/**\n * Class Application.\n *\n * @author liuml <liumenglei0211@gmail.com>\n *\n * @property \\EasyWeChat\\MicroMerchant\\Certficates\\Client    $certficates\n * @property \\EasyWeChat\\MicroMerchant\\Material\\Client       $material\n * @property \\EasyWeChat\\MicroMerchant\\MerchantConfig\\Client $merchantConfig\n * @property \\EasyWeChat\\MicroMerchant\\Withdraw\\Client       $withdraw\n * @property \\EasyWeChat\\MicroMerchant\\Media\\Client          $media\n *\n * @method mixed submitApplication(array $params)\n * @method mixed getStatus(string $applymentId, string $businessCode = '')\n * @method mixed upgrade(array $params)\n * @method mixed getUpgradeStatus(string $subMchId = '')\n */\nclass Application extends ServiceContainer\n{\n    /**\n     * @var array\n     */\n    protected $providers = [\n        // Base services\n        Base\\ServiceProvider::class,\n        Certficates\\ServiceProvider::class,\n        MerchantConfig\\ServiceProvider::class,\n        Material\\ServiceProvider::class,\n        Withdraw\\ServiceProvider::class,\n        Media\\ServiceProvider::class,\n    ];\n\n    /**\n     * @var array\n     */\n    protected $defaultConfig = [\n        'http' => [\n            'base_uri' => 'https://api.mch.weixin.qq.com/',\n        ],\n        'log' => [\n            'default' => 'dev', // 默认使用的 channel，生产环境可以改为下面的 prod\n            'channels' => [\n                // 测试环境\n                'dev' => [\n                    'driver' => 'single',\n                    'path' => '/tmp/easywechat.log',\n                    'level' => 'debug',\n                ],\n                // 生产环境\n                'prod' => [\n                    'driver' => 'daily',\n                    'path' => '/tmp/easywechat.log',\n                    'level' => 'info',\n                ],\n            ],\n        ],\n    ];\n\n    /**\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function getKey()\n    {\n        $key = $this['config']->key;\n\n        if (empty($key)) {\n            throw new InvalidArgumentException('config key connot be empty.');\n        }\n\n        if (32 !== strlen($key)) {\n            throw new InvalidArgumentException(sprintf(\"'%s' should be 32 chars length.\", $key));\n        }\n\n        return $key;\n    }\n\n    /**\n     * set sub-mch-id and appid.\n     *\n     * @param string $subMchId Identification Number of Small and Micro Businessmen Reported by Service Providers\n     * @param string $appId    Public Account ID of Service Provider\n     *\n     * @return $this\n     */\n    public function setSubMchId(string $subMchId, string $appId = '')\n    {\n        $this['config']->set('sub_mch_id', $subMchId);\n        if ($appId) {\n            $this['config']->set('appid', $appId);\n        }\n\n        return $this;\n    }\n\n    /**\n     * setCertificate.\n     *\n     * @param string $certificate\n     * @param string $serialNo\n     *\n     * @return $this\n     */\n    public function setCertificate(string $certificate, string $serialNo)\n    {\n        $this['config']->set('certificate', $certificate);\n        $this['config']->set('serial_no', $serialNo);\n\n        return $this;\n    }\n\n    /**\n     * Returning true indicates that the verification is successful,\n     * returning false indicates that the signature field does not exist or is empty,\n     * and if the signature verification is wrong, the InvalidSignException will be thrown directly.\n     *\n     * @param array $data\n     *\n     * @return bool\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\InvalidSignException\n     */\n    public function verifySignature(array $data)\n    {\n        if (!isset($data['sign']) || empty($data['sign'])) {\n            return false;\n        }\n\n        $sign = $data['sign'];\n        unset($data['sign']);\n\n        $signType = strlen($sign) > 32 ? 'HMAC-SHA256' : 'MD5';\n        $secretKey = $this->getKey();\n\n        $encryptMethod = Support\\get_encrypt_method($signType, $secretKey);\n\n        if (Support\\generate_sign($data, $secretKey, $encryptMethod) === $sign) {\n            return true;\n        }\n\n        throw new InvalidSignException('return value signature verification error');\n    }\n\n    /**\n     * @param string $name\n     * @param array  $arguments\n     *\n     * @return mixed\n     */\n    public function __call($name, $arguments)\n    {\n        return call_user_func_array([$this['base'], $name], $arguments);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Base/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Base;\n\nuse EasyWeChat\\MicroMerchant\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author   liuml  <liumenglei0211@163.com>\n * @DateTime 2019-05-30  14:19\n */\nclass Client extends BaseClient\n{\n    /**\n     * apply to settle in to become a small micro merchant.\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\EncryptException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function submitApplication(array $params)\n    {\n        $params = $this->processParams(array_merge($params, [\n            'version' => '3.0',\n            'cert_sn' => '',\n            'sign_type' => 'HMAC-SHA256',\n            'nonce_str' => uniqid('micro'),\n        ]));\n\n        return $this->safeRequest('applyment/micro/submit', $params);\n    }\n\n    /**\n     * query application status.\n     *\n     * @param string $applymentId\n     * @param string $businessCode\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getStatus(string $applymentId, string $businessCode = '')\n    {\n        if (!empty($applymentId)) {\n            $params = [\n                'applyment_id' => $applymentId,\n            ];\n        } else {\n            $params = [\n                'business_code' => $businessCode,\n            ];\n        }\n\n        $params = array_merge($params, [\n            'version' => '1.0',\n            'sign_type' => 'HMAC-SHA256',\n            'nonce_str' => uniqid('micro'),\n        ]);\n\n        return $this->safeRequest('applyment/micro/getstate', $params);\n    }\n\n    /**\n     * merchant upgrade api.\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\EncryptException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function upgrade(array $params)\n    {\n        $params['sub_mch_id'] = $params['sub_mch_id'] ?? $this->app['config']->sub_mch_id;\n        $params = $this->processParams(array_merge($params, [\n            'version' => '1.0',\n            'cert_sn' => '',\n            'sign_type' => 'HMAC-SHA256',\n            'nonce_str' => uniqid('micro'),\n        ]));\n\n        return $this->safeRequest('applyment/micro/submitupgrade', $params);\n    }\n\n    /**\n     * get upgrade status.\n     *\n     * @param string $subMchId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUpgradeStatus(string $subMchId = '')\n    {\n        return $this->safeRequest('applyment/micro/getupgradestate', [\n            'version' => '1.0',\n            'sign_type' => 'HMAC-SHA256',\n            'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id,\n            'nonce_str' => uniqid('micro'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Base/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Base;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['base'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Certficates/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Certficates;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\MicroMerchant\\Kernel\\BaseClient;\nuse EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\InvalidExtensionException;\n\n/**\n * Class Client.\n *\n * @author   liuml  <liumenglei0211@163.com>\n * @DateTime 2019-05-30  14:19\n */\nclass Client extends BaseClient\n{\n    /**\n     * get certficates.\n     *\n     * @param bool $returnRaw\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\InvalidExtensionException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(bool $returnRaw = false)\n    {\n        $params = [\n            'sign_type' => 'HMAC-SHA256',\n            'nonce_str' => uniqid('micro'),\n        ];\n\n        if (true === $returnRaw) {\n            return $this->requestRaw('risk/getcertficates', $params);\n        }\n        /** @var array $response */\n        $response = $this->requestArray('risk/getcertficates', $params);\n\n        if ('SUCCESS' !== $response['return_code']) {\n            throw new InvalidArgumentException(sprintf('Failed to get certificate. return_code_msg: \"%s\" .', $response['return_code'].'('.$response['return_msg'].')'));\n        }\n        if ('SUCCESS' !== $response['result_code']) {\n            throw new InvalidArgumentException(sprintf('Failed to get certificate. result_err_code_desc: \"%s\" .', $response['result_code'].'('.$response['err_code'].'['.$response['err_code_desc'].'])'));\n        }\n        $certificates = \\GuzzleHttp\\json_decode($response['certificates'], true)['data'][0];\n        $ciphertext = $this->decrypt($certificates['encrypt_certificate']);\n        unset($certificates['encrypt_certificate']);\n        $certificates['certificates'] = $ciphertext;\n\n        return $certificates;\n    }\n\n    /**\n     * decrypt ciphertext.\n     *\n     * @param array $encryptCertificate\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\InvalidExtensionException\n     */\n    public function decrypt(array $encryptCertificate)\n    {\n        if (false === extension_loaded('sodium')) {\n            throw new InvalidExtensionException('sodium extension is not installed，Reference link https://php.net/manual/zh/book.sodium.php');\n        }\n\n        if (false === sodium_crypto_aead_aes256gcm_is_available()) {\n            throw new InvalidExtensionException('aes256gcm is not currently supported');\n        }\n\n        // sodium_crypto_aead_aes256gcm_decrypt function needs to open libsodium extension.\n        // https://www.php.net/manual/zh/function.sodium-crypto-aead-aes256gcm-decrypt.php\n        return sodium_crypto_aead_aes256gcm_decrypt(\n            base64_decode($encryptCertificate['ciphertext'], true),\n            $encryptCertificate['associated_data'],\n            $encryptCertificate['nonce'],\n            $this->app['config']->apiv3_key\n        );\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Certficates/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Certficates;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['certficates'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Kernel/BaseClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Kernel;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\Support;\nuse EasyWeChat\\MicroMerchant\\Application;\nuse EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\EncryptException;\nuse EasyWeChat\\Payment\\Kernel\\BaseClient as PaymentBaseClient;\n\n/**\n * Class BaseClient.\n *\n * @author   liuml  <liumenglei0211@163.com>\n * @DateTime 2019-07-10  12:06\n */\nclass BaseClient extends PaymentBaseClient\n{\n    /**\n     * @var string\n     */\n    protected $certificates;\n\n    /**\n     * BaseClient constructor.\n     *\n     * @param \\EasyWeChat\\MicroMerchant\\Application $app\n     */\n    public function __construct(Application $app)\n    {\n        $this->app = $app;\n\n        $this->setHttpClient($this->app['http_client']);\n    }\n\n    /**\n     * Extra request params.\n     *\n     * @return array\n     */\n    protected function prepends()\n    {\n        return [];\n    }\n\n    /**\n     * httpUpload.\n     *\n     * @param string $url\n     * @param array  $files\n     * @param array  $form\n     * @param array  $query\n     * @param bool   $returnResponse\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\InvalidSignException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function httpUpload(string $url, array $files = [], array $form = [], array $query = [], $returnResponse = false)\n    {\n        $multipart = [];\n\n        foreach ($files as $name => $path) {\n            $multipart[] = [\n                'name' => $name,\n                'contents' => fopen($path, 'r'),\n            ];\n        }\n\n        $base = [\n            'mch_id' => $this->app['config']['mch_id'],\n        ];\n\n        $form = array_merge($base, $form);\n\n        $form['sign'] = $this->getSign($form);\n\n        foreach ($form as $name => $contents) {\n            $multipart[] = compact('name', 'contents');\n        }\n\n        $options = [\n            'query' => $query,\n            'multipart' => $multipart,\n            'connect_timeout' => 30,\n            'timeout' => 30,\n            'read_timeout' => 30,\n            'cert' => $this->app['config']->get('cert_path'),\n            'ssl_key' => $this->app['config']->get('key_path'),\n        ];\n\n        $this->pushMiddleware($this->logMiddleware(), 'log');\n\n        $response = $this->performRequest($url, 'POST', $options);\n\n        $result = $returnResponse ? $response : $this->castResponseToType($response, $this->app->config->get('response_type'));\n        // auto verify signature\n        if ($returnResponse || 'array' !== ($this->app->config->get('response_type') ?? 'array')) {\n            $this->app->verifySignature($this->castResponseToType($response, 'array'));\n        } else {\n            $this->app->verifySignature($result);\n        }\n\n        return $result;\n    }\n\n    /**\n     * request.\n     *\n     * @param string $endpoint\n     * @param array  $params\n     * @param string $method\n     * @param array  $options\n     * @param bool   $returnResponse\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\InvalidSignException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function request(string $endpoint, array $params = [], $method = 'post', array $options = [], $returnResponse = false)\n    {\n        $base = [\n            'mch_id' => $this->app['config']['mch_id'],\n        ];\n\n        $params = array_merge($base, $this->prepends(), $params);\n        $params['sign'] = $this->getSign($params);\n        $options = array_merge([\n            'body' => Support\\XML::build($params),\n        ], $options);\n\n        $this->pushMiddleware($this->logMiddleware(), 'log');\n        $response = $this->performRequest($endpoint, $method, $options);\n        $result = $returnResponse ? $response : $this->castResponseToType($response, $this->app->config->get('response_type'));\n        // auto verify signature\n        if ($returnResponse || 'array' !== ($this->app->config->get('response_type') ?? 'array')) {\n            $this->app->verifySignature($this->castResponseToType($response, 'array'));\n        } else {\n            $this->app->verifySignature($result);\n        }\n\n        return $result;\n    }\n\n    /**\n     * processing parameters contain fields that require sensitive information encryption.\n     *\n     * @param array $params\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\EncryptException\n     */\n    protected function processParams(array $params)\n    {\n        $serial_no = $this->app['config']->get('serial_no');\n        if (null === $serial_no) {\n            throw new InvalidArgumentException('config serial_no connot be empty.');\n        }\n\n        $params['cert_sn'] = $serial_no;\n        $sensitive_fields = $this->getSensitiveFieldsName();\n        foreach ($params as $k => $v) {\n            if (in_array($k, $sensitive_fields, true)) {\n                $params[$k] = $this->encryptSensitiveInformation($v);\n            }\n        }\n\n        return $params;\n    }\n\n    /**\n     * To id card, mobile phone number and other fields sensitive information encryption.\n     *\n     * @param string $string\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\EncryptException\n     */\n    protected function encryptSensitiveInformation(string $string)\n    {\n        $certificates = $this->app['config']->get('certificate');\n        if (null === $certificates) {\n            throw new InvalidArgumentException('config certificate connot be empty.');\n        }\n\n        $encrypted = '';\n        $publicKeyResource = openssl_get_publickey($certificates);\n        $f = openssl_public_encrypt($string, $encrypted, $publicKeyResource, OPENSSL_NO_PADDING);\n        openssl_free_key($publicKeyResource);\n        if ($f) {\n            return base64_encode($encrypted);\n        }\n\n        throw new EncryptException('Encryption of sensitive information failed');\n    }\n\n    /**\n     * get sensitive fields name.\n     *\n     * @return array\n     */\n    protected function getSensitiveFieldsName()\n    {\n        return [\n            'id_card_name',\n            'id_card_number',\n            'account_name',\n            'account_number',\n            'contact',\n            'contact_phone',\n            'contact_email',\n            'legal_person',\n            'mobile_phone',\n            'email',\n        ];\n    }\n\n    /**\n     * getSign.\n     *\n     * @param array $params\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    protected function getSign(array $params)\n    {\n        $params = array_filter($params);\n\n        $key = $this->app->getKey();\n\n        $encryptMethod = Support\\get_encrypt_method(Support\\Arr::get($params, 'sign_type', 'MD5'), $key);\n\n        return Support\\generate_sign($params, $key, $encryptMethod);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Kernel/Exceptions/EncryptException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Kernel\\Exceptions;\n\nuse EasyWeChat\\Kernel\\Exceptions\\Exception;\n\n/**\n * Class EncryptException.\n *\n * @author   liuml  <liumenglei0211@163.com>\n */\nclass EncryptException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Kernel/Exceptions/InvalidExtensionException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Kernel\\Exceptions;\n\nuse EasyWeChat\\Kernel\\Exceptions\\Exception;\n\n/**\n * Class InvalidExtensionException.\n *\n * @author   liuml  <liumenglei0211@163.com>\n */\nclass InvalidExtensionException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Kernel/Exceptions/InvalidSignException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Kernel\\Exceptions;\n\nuse EasyWeChat\\Kernel\\Exceptions\\Exception;\n\n/**\n * Class InvalidSignException.\n *\n * @author   liuml  <liumenglei0211@163.com>\n */\nclass InvalidSignException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Material/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Material;\n\nuse EasyWeChat\\MicroMerchant\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author   liuml  <liumenglei0211@163.com>\n * @DateTime 2019-05-30  14:19\n */\nclass Client extends BaseClient\n{\n    /**\n     * update settlement card.\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\EncryptException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setSettlementCard(array $params)\n    {\n        $params['sub_mch_id'] = $params['sub_mch_id'] ?? $this->app['config']->sub_mch_id;\n        $params = $this->processParams(array_merge($params, [\n            'version' => '1.0',\n            'cert_sn' => '',\n            'sign_type' => 'HMAC-SHA256',\n            'nonce_str' => uniqid('micro'),\n        ]));\n\n        return $this->safeRequest('applyment/micro/modifyarchives', $params);\n    }\n\n    /**\n     * update contact info.\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\EncryptException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateContact(array $params)\n    {\n        $params['sub_mch_id'] = $params['sub_mch_id'] ?? $this->app['config']->sub_mch_id;\n        $params = $this->processParams(array_merge($params, [\n            'version' => '1.0',\n            'cert_sn' => '',\n            'sign_type' => 'HMAC-SHA256',\n            'nonce_str' => uniqid('micro'),\n        ]));\n\n        return $this->safeRequest('applyment/micro/modifycontactinfo', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Material/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Material;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['material'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Media/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Media;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\MicroMerchant\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author   liuml  <liumenglei0211@163.com>\n * @DateTime 2019-06-10 14:50\n */\nclass Client extends BaseClient\n{\n    /**\n     * Upload material.\n     *\n     * @param string $path\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\InvalidSignException\n     */\n    public function upload(string $path)\n    {\n        if (!file_exists($path) || !is_readable($path)) {\n            throw new InvalidArgumentException(sprintf(\"File does not exist, or the file is unreadable: '%s'\", $path));\n        }\n\n        $form = [\n            'media_hash' => strtolower(md5_file($path)),\n            'sign_type' => 'HMAC-SHA256',\n        ];\n\n        return $this->httpUpload('secapi/mch/uploadmedia', ['media' => $path], $form);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Media/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\n/**\n * ServiceProvider.php.\n *\n * This file is part of the wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Media;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['media'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/MerchantConfig/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\MerchantConfig;\n\nuse EasyWeChat\\MicroMerchant\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author   liuml  <liumenglei0211@163.com>\n * @DateTime 2019-05-30  14:19\n */\nclass Client extends BaseClient\n{\n    /**\n     * Service providers configure recommendation functions for small and micro businesses.\n     *\n     * @param string $subAppId\n     * @param string $subscribeAppId\n     * @param string $receiptAppId\n     * @param string $subMchId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setFollowConfig(string $subAppId, string $subscribeAppId, string $receiptAppId = '', string $subMchId = '')\n    {\n        $params = [\n            'sub_appid' => $subAppId,\n            'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id,\n        ];\n\n        if (!empty($subscribeAppId)) {\n            $params['subscribe_appid'] = $subscribeAppId;\n        } else {\n            $params['receipt_appid'] = $receiptAppId;\n        }\n\n        return $this->safeRequest('secapi/mkt/addrecommendconf', array_merge($params, [\n            'sign_type' => 'HMAC-SHA256',\n            'nonce_str' => uniqid('micro'),\n        ]));\n    }\n\n    /**\n     * Configure the new payment directory.\n     *\n     * @param string $jsapiPath\n     * @param string $appId\n     * @param string $subMchId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function addPath(string $jsapiPath, string $appId = '', string $subMchId = '')\n    {\n        return $this->addConfig([\n            'appid' => $appId ?: $this->app['config']->appid,\n            'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id,\n            'jsapi_path' => $jsapiPath,\n        ]);\n    }\n\n    /**\n     * bind appid.\n     *\n     * @param string $subAppId\n     * @param string $appId\n     * @param string $subMchId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function bindAppId(string $subAppId, string $appId = '', string $subMchId = '')\n    {\n        return $this->addConfig([\n            'appid' => $appId ?: $this->app['config']->appid,\n            'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id,\n            'sub_appid' => $subAppId,\n        ]);\n    }\n\n    /**\n     * add sub dev config.\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    private function addConfig(array $params)\n    {\n        return $this->safeRequest('secapi/mch/addsubdevconfig', $params);\n    }\n\n    /**\n     * query Sub Dev Config.\n     *\n     * @param string $subMchId\n     * @param string $appId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getConfig(string $subMchId = '', string $appId = '')\n    {\n        return $this->safeRequest('secapi/mch/querysubdevconfig', [\n            'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id,\n            'appid' => $appId ?: $this->app['config']->appid,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/MerchantConfig/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\MerchantConfig;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['merchantConfig'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Withdraw/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Withdraw;\n\nuse EasyWeChat\\MicroMerchant\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author   liuml  <liumenglei0211@163.com>\n * @DateTime 2019-05-30  14:19\n */\nclass Client extends BaseClient\n{\n    /**\n     * Query withdrawal status.\n     *\n     * @param string $date\n     * @param string $subMchId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function queryWithdrawalStatus($date, $subMchId = '')\n    {\n        return $this->safeRequest('fund/queryautowithdrawbydate', [\n            'date' => $date,\n            'sign_type' => 'HMAC-SHA256',\n            'nonce_str' => uniqid('micro'),\n            'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id,\n        ]);\n    }\n\n    /**\n     * Re-initiation of withdrawal.\n     *\n     * @param string $date\n     * @param string $subMchId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function requestWithdraw($date, $subMchId = '')\n    {\n        return $this->safeRequest('fund/reautowithdrawbydate', [\n            'date' => $date,\n            'sign_type' => 'HMAC-SHA256',\n            'nonce_str' => uniqid('micro'),\n            'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Withdraw/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MicroMerchant\\Withdraw;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['withdraw'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/ActivityMessage/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\ActivityMessage;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\nclass Client extends BaseClient\n{\n    /**\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function createActivityId()\n    {\n        return $this->httpGet('cgi-bin/message/wxopen/activityid/create');\n    }\n\n    /**\n     * @param string $activityId\n     * @param int    $state\n     * @param array  $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateMessage(string $activityId, int $state = 0, array $params = [])\n    {\n        if (!in_array($state, [0, 1], true)) {\n            throw new InvalidArgumentException('\"state\" should be \"0\" or \"1\".');\n        }\n\n        $params = $this->formatParameters($params);\n\n        $params = [\n            'activity_id' => $activityId,\n            'target_state' => $state,\n            'template_info' => ['parameter_list' => $params],\n        ];\n\n        return $this->httpPostJson('cgi-bin/message/wxopen/updatablemsg/send', $params);\n    }\n\n    /**\n     * @param array $params\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    protected function formatParameters(array $params)\n    {\n        $formatted = [];\n\n        foreach ($params as $name => $value) {\n            if (!in_array($name, ['member_count', 'room_limit', 'path', 'version_type'], true)) {\n                continue;\n            }\n\n            if ('version_type' === $name && !in_array($value, ['develop', 'trial', 'release'], true)) {\n                throw new InvalidArgumentException('Invalid value of attribute \"version_type\".');\n            }\n\n            $formatted[] = [\n                'name' => $name,\n                'value' => strval($value),\n            ];\n        }\n\n        return $formatted;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/ActivityMessage/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\ActivityMessage;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['activity_message'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/AppCode/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\AppCode;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Http\\StreamResponse;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get AppCode.\n     *\n     * @param string $path\n     * @param array  $optional\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     */\n    public function get(string $path, array $optional = [])\n    {\n        $params = array_merge([\n            'path' => $path,\n        ], $optional);\n\n        return $this->getStream('wxa/getwxacode', $params);\n    }\n\n    /**\n     * Get AppCode unlimit.\n     *\n     * @param string $scene\n     * @param array  $optional\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     */\n    public function getUnlimit(string $scene, array $optional = [])\n    {\n        $params = array_merge([\n            'scene' => $scene,\n        ], $optional);\n\n        return $this->getStream('wxa/getwxacodeunlimit', $params);\n    }\n\n    /**\n     * Create QrCode.\n     *\n     * @param string   $path\n     * @param int|null $width\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     */\n    public function getQrCode(string $path, int $width = null)\n    {\n        return $this->getStream('cgi-bin/wxaapp/createwxaqrcode', compact('path', 'width'));\n    }\n\n    /**\n     * Get stream.\n     *\n     * @param string $endpoint\n     * @param array  $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function getStream(string $endpoint, array $params)\n    {\n        $response = $this->requestRaw($endpoint, 'POST', ['json' => $params]);\n\n        if (false !== stripos($response->getHeaderLine('Content-disposition'), 'attachment')) {\n            return StreamResponse::buildFromPsrResponse($response);\n        }\n\n        return $this->castResponseToType($response, $this->app['config']->get('response_type'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/AppCode/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\AppCode;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['app_code'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram;\n\nuse EasyWeChat\\BasicService;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Class Application.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n *\n * @property \\EasyWeChat\\MiniProgram\\Auth\\AccessToken           $access_token\n * @property \\EasyWeChat\\MiniProgram\\DataCube\\Client            $data_cube\n * @property \\EasyWeChat\\MiniProgram\\AppCode\\Client             $app_code\n * @property \\EasyWeChat\\MiniProgram\\Auth\\Client                $auth\n * @property \\EasyWeChat\\OfficialAccount\\Server\\Guard           $server\n * @property \\EasyWeChat\\MiniProgram\\Encryptor                  $encryptor\n * @property \\EasyWeChat\\MiniProgram\\TemplateMessage\\Client     $template_message\n * @property \\EasyWeChat\\OfficialAccount\\CustomerService\\Client $customer_service\n * @property \\EasyWeChat\\MiniProgram\\Plugin\\Client              $plugin\n * @property \\EasyWeChat\\MiniProgram\\Plugin\\DevClient           $plugin_dev\n * @property \\EasyWeChat\\MiniProgram\\UniformMessage\\Client      $uniform_message\n * @property \\EasyWeChat\\MiniProgram\\ActivityMessage\\Client     $activity_message\n * @property \\EasyWeChat\\MiniProgram\\Express\\Client             $express\n * @property \\EasyWeChat\\MiniProgram\\NearbyPoi\\Client           $nearby_poi\n * @property \\EasyWeChat\\MiniProgram\\OCR\\Client                 $ocr\n * @property \\EasyWeChat\\MiniProgram\\Soter\\Client               $soter\n * @property \\EasyWeChat\\BasicService\\Media\\Client              $media\n * @property \\EasyWeChat\\BasicService\\ContentSecurity\\Client    $content_security\n * @property \\EasyWeChat\\MiniProgram\\Mall\\ForwardsMall          $mall\n * @property \\EasyWeChat\\MiniProgram\\SubscribeMessage\\Client    $subscribe_message\n * @property \\EasyWeChat\\MiniProgram\\RealtimeLog\\Client         $realtime_log\n * @property \\EasyWeChat\\MiniProgram\\RiskControl\\Client         $risk_control\n * @property \\EasyWeChat\\MiniProgram\\Search\\Client              $search\n * @property \\EasyWeChat\\MiniProgram\\Live\\Client                $live\n * @property \\EasyWeChat\\MiniProgram\\Broadcast\\Client           $broadcast\n * @property \\EasyWeChat\\MiniProgram\\UrlScheme\\Client           $url_scheme\n * @property \\EasyWeChat\\MiniProgram\\Union\\Client               $union\n * @property \\EasyWeChat\\MiniProgram\\Shop\\Register\\Client       $shop_register\n * @property \\EasyWeChat\\MiniProgram\\Shop\\Basic\\Client          $shop_basic\n * @property \\EasyWeChat\\MiniProgram\\Shop\\Account\\Client        $shop_account\n * @property \\EasyWeChat\\MiniProgram\\Shop\\Spu\\Client            $shop_spu\n * @property \\EasyWeChat\\MiniProgram\\Shop\\Order\\Client          $shop_order\n * @property \\EasyWeChat\\MiniProgram\\Shop\\Delivery\\Client       $shop_delivery\n * @property \\EasyWeChat\\MiniProgram\\Shop\\Aftersale\\Client      $shop_aftersale\n * @property \\EasyWeChat\\MiniProgram\\Business\\Client            $business\n * @property \\EasyWeChat\\MiniProgram\\UrlLink\\Client             $url_link\n * @property \\EasyWeChat\\MiniProgram\\QrCode\\Client              $qr_code\n * @property \\EasyWeChat\\MiniProgram\\PhoneNumber\\Client         $phone_number\n * @property \\EasyWeChat\\MiniProgram\\ShortLink\\Client           $short_link\n */\nclass Application extends ServiceContainer\n{\n    /**\n     * @var array\n     */\n    protected $providers = [\n        Auth\\ServiceProvider::class,\n        DataCube\\ServiceProvider::class,\n        AppCode\\ServiceProvider::class,\n        Server\\ServiceProvider::class,\n        TemplateMessage\\ServiceProvider::class,\n        CustomerService\\ServiceProvider::class,\n        UniformMessage\\ServiceProvider::class,\n        ActivityMessage\\ServiceProvider::class,\n        OpenData\\ServiceProvider::class,\n        Plugin\\ServiceProvider::class,\n        QrCode\\ServiceProvider::class,\n        Base\\ServiceProvider::class,\n        Express\\ServiceProvider::class,\n        NearbyPoi\\ServiceProvider::class,\n        OCR\\ServiceProvider::class,\n        Soter\\ServiceProvider::class,\n        Mall\\ServiceProvider::class,\n        SubscribeMessage\\ServiceProvider::class,\n        RealtimeLog\\ServiceProvider::class,\n        RiskControl\\ServiceProvider::class,\n        Search\\ServiceProvider::class,\n        Live\\ServiceProvider::class,\n        Broadcast\\ServiceProvider::class,\n        UrlScheme\\ServiceProvider::class,\n        UrlLink\\ServiceProvider::class,\n        Union\\ServiceProvider::class,\n        PhoneNumber\\ServiceProvider::class,\n        ShortLink\\ServiceProvider::class,\n        // Base services\n        BasicService\\Media\\ServiceProvider::class,\n        BasicService\\ContentSecurity\\ServiceProvider::class,\n\n        Shop\\Register\\ServiceProvider::class,\n        Shop\\Basic\\ServiceProvider::class,\n        Shop\\Account\\ServiceProvider::class,\n        Shop\\Spu\\ServiceProvider::class,\n        Shop\\Order\\ServiceProvider::class,\n        Shop\\Delivery\\ServiceProvider::class,\n        Shop\\Aftersale\\ServiceProvider::class,\n        Business\\ServiceProvider::class,\n    ];\n\n    /**\n     * Handle dynamic calls.\n     *\n     * @param string $method\n     * @param array  $args\n     *\n     * @return mixed\n     */\n    public function __call($method, $args)\n    {\n        return $this->base->$method(...$args);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Auth/AccessToken.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Auth;\n\nuse EasyWeChat\\Kernel\\AccessToken as BaseAccessToken;\n\n/**\n * Class AccessToken.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass AccessToken extends BaseAccessToken\n{\n    /**\n     * @var string\n     */\n    protected $endpointToGetToken = 'cgi-bin/token';\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function getCredentials(): array\n    {\n        return [\n            'grant_type' => 'client_credential',\n            'appid' => $this->app['config']['app_id'],\n            'secret' => $this->app['config']['secret'],\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Auth/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Auth;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Auth.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get session info by code.\n     *\n     * @param string $code\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function session(string $code)\n    {\n        $params = [\n            'appid' => $this->app['config']['app_id'],\n            'secret' => $this->app['config']['secret'],\n            'js_code' => $code,\n            'grant_type' => 'authorization_code',\n        ];\n\n        return $this->httpGet('sns/jscode2session', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Auth/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Auth;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        !isset($app['access_token']) && $app['access_token'] = function ($app) {\n            return new AccessToken($app);\n        };\n\n        !isset($app['auth']) && $app['auth'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Base/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Base;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get paid unionid.\n     *\n     * @param string $openid\n     * @param array  $options\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getPaidUnionid($openid, $options = [])\n    {\n        return $this->httpGet('wxa/getpaidunionid', compact('openid') + $options);\n    }\n    \n    /**\n     * Get version info\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getVersionInfo()\n    {\n        return $this->httpPostJson('wxa/getversioninfo');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Base/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Base;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['base'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Broadcast/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Broadcast;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author Abbotton <uctoo@foxmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Add broadcast goods.\n     *\n     * @param array $goodsInfo\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $goodsInfo)\n    {\n        $params = [\n            'goodsInfo' => $goodsInfo,\n        ];\n\n        return $this->httpPostJson('wxaapi/broadcast/goods/add', $params);\n    }\n\n    /**\n     * Reset audit.\n     *\n     * @param int $auditId\n     * @param int $goodsId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function resetAudit(int $auditId, int $goodsId)\n    {\n        $params = [\n            'auditId' => $auditId,\n            'goodsId' => $goodsId,\n        ];\n\n        return $this->httpPostJson('wxaapi/broadcast/goods/resetaudit', $params);\n    }\n\n    /**\n     * Resubmit audit goods.\n     *\n     * @param int $goodsId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function resubmitAudit(int $goodsId)\n    {\n        $params = [\n            'goodsId' => $goodsId,\n        ];\n\n        return $this->httpPostJson('wxaapi/broadcast/goods/audit', $params);\n    }\n\n    /**\n     * Delete broadcast goods.\n     *\n     * @param int $goodsId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(int $goodsId)\n    {\n        $params = [\n            'goodsId' => $goodsId,\n        ];\n\n        return $this->httpPostJson('wxaapi/broadcast/goods/delete', $params);\n    }\n\n    /**\n     * Update goods info.\n     *\n     * @param array $goodsInfo\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(array $goodsInfo)\n    {\n        $params = [\n            'goodsInfo' => $goodsInfo,\n        ];\n\n        return $this->httpPostJson('wxaapi/broadcast/goods/update', $params);\n    }\n\n    /**\n     * Get goods information and review status.\n     *\n     * @param array $goodsIdArray\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getGoodsWarehouse(array $goodsIdArray)\n    {\n        $params = [\n            'goods_ids' => $goodsIdArray,\n        ];\n\n        return $this->httpPostJson('wxa/business/getgoodswarehouse', $params);\n    }\n\n    /**\n     * Get goods list based on status\n     *\n     * @param  array  $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getApproved(array $params)\n    {\n        return $this->httpGet('wxaapi/broadcast/goods/getapproved', $params);\n    }\n\n    /**\n     * Add goods to the designated live room.\n     *\n     * @param  array  $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function addGoods(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/addgoods', $params);\n    }\n\n    /**\n     * Get Room List.\n     *\n     * @param  int  $start\n     * @param  int  $limit\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @author onekb <1@1kb.ren>\n     */\n    public function getRooms(int $start = 0, int $limit = 10)\n    {\n        $params = [\n            'start' => $start,\n            'limit' => $limit,\n        ];\n\n        return $this->httpPostJson('wxa/business/getliveinfo', $params);\n    }\n\n    /**\n     * Get Playback List.\n     *\n     * @param  int  $roomId\n     * @param  int  $start\n     * @param  int  $limit\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @author onekb <1@1kb.ren>\n     */\n    public function getPlaybacks(int $roomId, int $start = 0, int $limit = 10)\n    {\n        $params = [\n            'action' => 'get_replay',\n            'room_id' => $roomId,\n            'start' => $start,\n            'limit' => $limit,\n        ];\n\n        return $this->httpPostJson('wxa/business/getliveinfo', $params);\n    }\n\n    /**\n     * Create a live room.\n     *\n     * @param  array  $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createLiveRoom(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/create', $params);\n    }\n\n    /**\n     * Delete a live room.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function deleteLiveRoom(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/deleteroom', $params);\n    }\n\n    /**\n     * Update a live room.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function updateLiveRoom(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/editroom', $params);\n    }\n\n    /**\n     * Gets the live room push stream url.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getPushUrl(array $params)\n    {\n        return $this->httpGet('wxaapi/broadcast/room/getpushurl', $params);\n    }\n\n    /**\n     * Gets the live room share qrcode.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getShareQrcode(array $params)\n    {\n        return $this->httpGet('wxaapi/broadcast/room/getsharedcode', $params);\n    }\n\n    /**\n     * Add a live room assistant.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function addAssistant(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/addassistant', $params);\n    }\n\n    /**\n     * Update a live room assistant.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function updateAssistant(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/modifyassistant', $params);\n    }\n\n    /**\n     * Delete a live room assistant.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function deleteAssistant(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/removeassistant', $params);\n    }\n\n    /**\n     * Gets the assistant list.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getAssistantList(array $params)\n    {\n        return $this->httpGet('wxaapi/broadcast/room/getassistantlist', $params);\n    }\n\n    /**\n     * Add the sub anchor.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function addSubAnchor(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/addsubanchor', $params);\n    }\n\n    /**\n     * Update the sub anchor.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function updateSubAnchor(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/modifysubanchor', $params);\n    }\n\n    /**\n     * Delete the sub anchor.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function deleteSubAnchor(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/deletesubanchor', $params);\n    }\n\n    /**\n     * Gets the sub anchor info.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getSubAnchor(array $params)\n    {\n        return $this->httpGet('wxaapi/broadcast/room/getsubanchor', $params);\n    }\n\n    /**\n     * Turn official index on/off.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function updateFeedPublic(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/updatefeedpublic', $params);\n    }\n\n    /**\n     * Turn playback status on/off.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function updateReplay(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/updatereplay', $params);\n    }\n\n    /**\n     * Turn customer service status on/off.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function updateKf(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/updatekf', $params);\n    }\n\n    /**\n     * Turn global comments status on/off.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function updateComment(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/room/updatecomment', $params);\n    }\n\n    /**\n     * Add member role.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function addRole(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/role/addrole', $params);\n    }\n\n    /**\n     * Delete member role.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function deleteRole(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/role/deleterole', $params);\n    }\n\n    /**\n     * Gets the role list.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getRoleList(array $params)\n    {\n        return $this->httpGet('wxaapi/broadcast/role/getrolelist', $params);\n    }\n\n    /**\n     * Gets long-term subscribers.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getFollowers(array $params)\n    {\n        return $this->httpPost('wxa/business/get_wxa_followers', $params);\n    }\n\n    /**\n     * Sending live broadcast start event to long-term subscribers.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function pushMessage(array $params)\n    {\n        return $this->httpPost('wxa/business/push_message', $params);\n    }\n\n    /**\n     * Change the status of goods on/off shelves in room.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateGoodsInRoom(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/goods/onsale', $params);\n    }\n\n    /**\n     * Delete goods in room.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deleteGoodsInRoom(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/goods/deleteInRoom', $params);\n    }\n\n    /**\n     * Push goods in room.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function pushGoods(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/goods/push', $params);\n    }\n\n    /**\n     * Change goods sort in room.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function sortGoods(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/goods/sort', $params);\n    }\n\n    /**\n     * Download goods explanation video.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function downloadGoodsExplanationVideo(array $params)\n    {\n        return $this->httpPost('wxaapi/broadcast/goods/getVideo', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Broadcast/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Broadcast;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author Abbotton <uctoo@foxmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['broadcast'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Business/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n */\n\nnamespace EasyWeChat\\MiniProgram\\Business;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class Client.\n *\n * @author wangdongzhao <elim051@163.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Business register\n     * @param string $accountName\n     * @param string $nickname\n     * @param string $iconMediaId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function register(string $accountName, string $nickname, string $iconMediaId)\n    {\n        $params = [\n            'account_name' => $accountName,\n            'nickname' => $nickname,\n            'icon_media_id' => $iconMediaId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/business/register', $params);\n    }\n\n    /**\n     * Get business\n     * @param int $businessId\n     * @param string $accountName\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getBusiness(int $businessId = 0, string $accountName = '')\n    {\n        if (empty($businessId) && empty($accountName)) {\n            throw new InvalidArgumentException('Missing parameter.');\n        }\n        if ($businessId) {\n            $params = [\n                'business_id' => $businessId,\n            ];\n        } else {\n            $params = [\n                'account_name' => $accountName,\n            ];\n        }\n\n        return $this->httpPostJson('cgi-bin/business/get', $params);\n    }\n\n    /**\n     * Get business list\n     * @param int $offset\n     * @param int $count\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(int $offset = 0, int $count = 10)\n    {\n        $params = [\n            'offset' => $offset,\n            'count' => $count,\n        ];\n\n        return $this->httpPostJson('cgi-bin/business/list', $params);\n    }\n\n    /**\n     * Update business.\n     * @param int $businessId\n     * @param string $nickname\n     * @param string $iconMediaId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(int $businessId, string $nickname = '', string $iconMediaId = '')\n    {\n        $params = [\n            'business_id' => $businessId,\n            'nickname' => $nickname,\n            'icon_media_id' => $iconMediaId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/business/update', $params);\n    }\n\n    /**\n     * Get message builder.\n     *\n     * @param \\EasyWeChat\\Kernel\\Messages\\Message|string $message\n     *\n     * @return \\EasyWeChat\\MiniProgram\\Business\\Messenger\n     */\n    public function message($message)\n    {\n        $messageBuilder = new Messenger($this);\n\n        return $messageBuilder->message($message);\n    }\n\n    /**\n     * Send a message.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(array $message)\n    {\n        return $this->httpPostJson('cgi-bin/message/custom/business/send', $message);\n    }\n\n    /**\n     * Typing status.\n     * @param int $businessId\n     * @param string $toUser openid\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function typing(int $businessId, string $toUser)\n    {\n        $params = [\n            'business_id' => $businessId,\n            'touser' => $toUser,\n            'command' => 'Typing',\n        ];\n\n        return $this->httpPostJson('cgi-bin/business/typing', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Business/Messenger.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n */\n\nnamespace EasyWeChat\\MiniProgram\\Business;\n\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Messages\\Message;\nuse EasyWeChat\\Kernel\\Messages\\Raw as RawMessage;\nuse EasyWeChat\\Kernel\\Messages\\Text;\n\n/**\n * Class MessageBuilder.\n *\n * @author wangdongzhao <elim051@163.com>\n */\nclass Messenger\n{\n    /**\n     * Messages to send.\n     *\n     * @var \\EasyWeChat\\Kernel\\Messages\\Message;\n     */\n    protected $message;\n\n    /**\n     * Messages target user open id.\n     *\n     * @var string\n     */\n    protected $to;\n\n    /**\n     * Messages sender staff id.\n     *\n     * @var string\n     */\n    protected $account;\n\n    /**\n     * Customer service instance.\n     *\n     * @var \\EasyWeChat\\MiniProgram\\Business\\Client\n     */\n    protected $client;\n\n    /**\n     * Messages businessId\n     *\n     * @var int\n     */\n    protected $businessId;\n\n    /**\n     * MessageBuilder constructor.\n     *\n     * @param \\EasyWeChat\\MiniProgram\\Business\\Client $client\n     */\n    public function __construct(Client $client)\n    {\n        $this->client = $client;\n    }\n\n    /**\n     * Set message to send.\n     *\n     * @param string|Message $message\n     *\n     * @return Messenger\n     */\n    public function message($message)\n    {\n        if (is_string($message)) {\n            $message = new Text($message);\n        }\n\n        $this->message = $message;\n\n        return $this;\n    }\n\n    /**\n     * Set staff account to send message.\n     *\n     * @return Messenger\n     */\n    public function by(string $account)\n    {\n        $this->account = $account;\n\n        return $this;\n    }\n\n    /**\n     * @return Messenger\n     */\n    public function from(string $account)\n    {\n        return $this->by($account);\n    }\n\n    /**\n     * Set target user open id.\n     *\n     * @param string $openid\n     *\n     * @return Messenger\n     */\n    public function to($openid)\n    {\n        $this->to = $openid;\n\n        return $this;\n    }\n\n    /**\n     * Set target business id.\n     *\n     * @param int $businessId\n     *\n     * @return Messenger\n     */\n    public function business($businessId)\n    {\n        $this->businessId = $businessId;\n\n        return $this;\n    }\n\n    /**\n     * Send the message.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function send()\n    {\n        if (empty($this->message)) {\n            throw new RuntimeException('No message to send.');\n        }\n\n        if ($this->message instanceof RawMessage) {\n            $message = json_decode($this->message->get('content'), true);\n        } else {\n            $prepends = [\n                'touser' => $this->to,\n            ];\n            if ($this->account) {\n                $prepends['customservice'] = ['kf_account' => $this->account];\n            }\n            if ($this->businessId) {\n                $prepends['businessid'] = $this->businessId;\n            }\n            $message = $this->message->transformForJsonRequest($prepends);\n        }\n\n        return $this->client->send($message);\n    }\n\n    /**\n     * Return property.\n     *\n     * @return mixed\n     */\n    public function __get(string $property)\n    {\n        if (property_exists($this, $property)) {\n            return $this->$property;\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Business/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n */\n\nnamespace EasyWeChat\\MiniProgram\\Business;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author wangdongzhao <elim051@163.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['business'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/CustomerService/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\CustomerService;\n\nuse EasyWeChat\\OfficialAccount\\CustomerService\\Client;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['customer_service'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/DataCube/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\DataCube;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get summary trend.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function summaryTrend(string $from, string $to)\n    {\n        return $this->query('datacube/getweanalysisappiddailysummarytrend', $from, $to);\n    }\n\n    /**\n     * Get daily visit trend.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function dailyVisitTrend(string $from, string $to)\n    {\n        return $this->query('datacube/getweanalysisappiddailyvisittrend', $from, $to);\n    }\n\n    /**\n     * Get weekly visit trend.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function weeklyVisitTrend(string $from, string $to)\n    {\n        return $this->query('datacube/getweanalysisappidweeklyvisittrend', $from, $to);\n    }\n\n    /**\n     * Get monthly visit trend.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function monthlyVisitTrend(string $from, string $to)\n    {\n        return $this->query('datacube/getweanalysisappidmonthlyvisittrend', $from, $to);\n    }\n\n    /**\n     * Get visit distribution.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function visitDistribution(string $from, string $to)\n    {\n        return $this->query('datacube/getweanalysisappidvisitdistribution', $from, $to);\n    }\n\n    /**\n     * Get daily retain info.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function dailyRetainInfo(string $from, string $to)\n    {\n        return $this->query('datacube/getweanalysisappiddailyretaininfo', $from, $to);\n    }\n\n    /**\n     * Get weekly retain info.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function weeklyRetainInfo(string $from, string $to)\n    {\n        return $this->query('datacube/getweanalysisappidweeklyretaininfo', $from, $to);\n    }\n\n    /**\n     * Get monthly retain info.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function monthlyRetainInfo(string $from, string $to)\n    {\n        return $this->query('datacube/getweanalysisappidmonthlyretaininfo', $from, $to);\n    }\n\n    /**\n     * Get visit page.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function visitPage(string $from, string $to)\n    {\n        return $this->query('datacube/getweanalysisappidvisitpage', $from, $to);\n    }\n\n    /**\n     * Get user portrait.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function userPortrait(string $from, string $to)\n    {\n        return $this->query('datacube/getweanalysisappiduserportrait', $from, $to);\n    }\n\n    /**\n     * get performance data\n     * @param string $from\n     * @param string $to\n     * @param string $module\n     * @param string $networktype\n     * @param string $device_level\n     * @param string $device\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function devicePerformanceData(string $from, string $to, string $module, string $networktype = '-1', string $device_level = '-1', string $device = '-1')\n    {\n        $payload = [\n            'time' => [\n                'end_timestamp' => strtotime($to),\n                'begin_timestamp' => strtotime($from),\n            ],\n            'module' => $module,\n            'params' => [\n                ['field' => 'networktype',  'value' => $networktype],\n                ['field' => 'device_level', 'value' => $device_level],\n                ['field' => 'device',       'value' => $device],\n            ]\n        ];\n        return $this->httpPostJson('wxa/business/performance/boot', $payload);\n    }\n\n    /**\n     * Unify query.\n     *\n     * @param string $api\n     * @param string $from\n     * @param string $to\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function query(string $api, string $from, string $to)\n    {\n        $params = [\n            'begin_date' => $from,\n            'end_date' => $to,\n        ];\n\n        return $this->httpPostJson($api, $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/DataCube/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\DataCube;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['data_cube'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Encryptor.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram;\n\nuse EasyWeChat\\Kernel\\Encryptor as BaseEncryptor;\nuse EasyWeChat\\Kernel\\Exceptions\\DecryptException;\nuse EasyWeChat\\Kernel\\Support\\AES;\n\n/**\n * Class Encryptor.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Encryptor extends BaseEncryptor\n{\n    /**\n     * Decrypt data.\n     *\n     * @param string $sessionKey\n     * @param string $iv\n     * @param string $encrypted\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\DecryptException\n     */\n    public function decryptData(string $sessionKey, string $iv, string $encrypted): array\n    {\n        $decrypted = AES::decrypt(\n            base64_decode($encrypted, false),\n            base64_decode($sessionKey, false),\n            base64_decode($iv, false)\n        );\n\n        $decrypted = json_decode($decrypted, true);\n\n        if (!$decrypted) {\n            throw new DecryptException('The given payload is invalid.');\n        }\n\n        return $decrypted;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Express/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Express;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class Client.\n *\n * @author kehuanhuan <1152018701@qq.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 绑定、解绑物流账号\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function bind(array $params = [])\n    {\n        if (empty($params['type']) || empty($params['biz_id']) || empty($params['delivery_id'])) {\n            throw new InvalidArgumentException('Missing parameter.');\n        }\n\n        return $this->httpPostJson('cgi-bin/express/business/account/bind', $params);\n    }\n\n    /**\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function listProviders()\n    {\n        return $this->httpGet('cgi-bin/express/business/delivery/getall');\n    }\n\n    /**\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getAllAccount()\n    {\n        return $this->httpGet('cgi-bin/express/business/account/getall');\n    }\n\n    /**\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createWaybill(array $params = [])\n    {\n        return $this->httpPostJson('cgi-bin/express/business/order/add', $params);\n    }\n\n    /**\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deleteWaybill(array $params = [])\n    {\n        return $this->httpPostJson('cgi-bin/express/business/order/cancel', $params);\n    }\n\n    /**\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getWaybill(array $params = [])\n    {\n        return $this->httpPostJson('cgi-bin/express/business/order/get', $params);\n    }\n\n    /**\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getWaybillTrack(array $params = [])\n    {\n        return $this->httpPostJson('cgi-bin/express/business/path/get', $params);\n    }\n\n    /**\n     * @param string $deliveryId\n     * @param string $bizId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getBalance(string $deliveryId, string $bizId)\n    {\n        return $this->httpPostJson('cgi-bin/express/business/quota/get', [\n            'delivery_id' => $deliveryId,\n            'biz_id' => $bizId,\n        ]);\n    }\n\n    /**\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getPrinter()\n    {\n        return $this->httpPostJson('cgi-bin/express/business/printer/getall');\n    }\n\n    /**\n     * @param string $openid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function bindPrinter(string $openid)\n    {\n        return $this->httpPostJson('cgi-bin/express/business/printer/update', [\n            'update_type' => 'bind',\n            'openid' => $openid,\n        ]);\n    }\n\n    /**\n     * @param string $openid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function unbindPrinter(string $openid)\n    {\n        return $this->httpPostJson('cgi-bin/express/business/printer/update', [\n            'update_type' => 'unbind',\n            'openid' => $openid,\n        ]);\n    }\n\n    /**\n     * 创建退货 ID\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function createReturn(array $params = [])\n    {\n        return $this->httpPostJson('cgi-bin/express/delivery/return/add', $params);\n    }\n\n    /**\n     * 查询退货 ID 状态\n     * @param string $returnId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getReturn(string $returnId)\n    {\n        return $this->httpPostJson('cgi-bin/express/delivery/return/get', [\n            'return_id' => $returnId\n        ]);\n    }\n\n    /**\n     * 解绑退货 ID\n     * @param string $returnId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function unbindReturn(string $returnId)\n    {\n        return $this->httpPostJson('cgi-bin/express/delivery/return/unbind', [\n            'return_id' => $returnId\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Express/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Express;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author kehuanhuan <1152018701@qq.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['express'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Live/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Live;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author onekb <1@1kb.ren>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get Room List.\n     *\n     * @param int $start\n     * @param int $limit\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @deprecated This method has been merged into `\\EasyWeChat\\MiniProgram\\Broadcast`\n     */\n    public function getRooms(int $start = 0, int $limit = 10)\n    {\n        $params = [\n            'start' => $start,\n            'limit' => $limit,\n        ];\n\n        return $this->httpPostJson('wxa/business/getliveinfo', $params);\n    }\n\n    /**\n     * Get Playback List.\n     *\n     * @param int $roomId\n     * @param int $start\n     * @param int $limit\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @deprecated This method has been merged into `\\EasyWeChat\\MiniProgram\\Broadcast`\n     */\n    public function getPlaybacks(int $roomId, int $start = 0, int $limit = 10)\n    {\n        $params = [\n            'action' => 'get_replay',\n            'room_id' => $roomId,\n            'start' => $start,\n            'limit' => $limit,\n        ];\n\n        return $this->httpPostJson('wxa/business/getliveinfo', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Live/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Live;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author onekb <1@1kb.ren>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['live'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/CartClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Mall;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass CartClient extends BaseClient\n{\n    /**\n     * 导入收藏.\n     *\n     * @param array $params\n     * @param bool  $isTest\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add($params, $isTest = false)\n    {\n        return $this->httpPostJson('mall/addshoppinglist', $params, ['is_test' => (int) $isTest]);\n    }\n\n    /**\n     * 查询用户收藏信息.\n     *\n     * @param array $params\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function query($params)\n    {\n        return $this->httpPostJson('mall/queryshoppinglist', $params, ['type' => 'batchquery']);\n    }\n\n    /**\n     * 查询用户收藏信息.\n     *\n     * @param array $params\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function queryByPage($params)\n    {\n        return $this->httpPostJson('mall/queryshoppinglist', $params, ['type' => 'getbypage']);\n    }\n\n    /**\n     * 删除收藏.\n     *\n     * @param string $openid\n     * @param array  $products\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete($openid, array $products = [])\n    {\n        if (empty($products)) {\n            return $this->httpPostJson('mall/deletebizallshoppinglist', ['user_open_id' => $openid]);\n        }\n\n        return $this->httpPostJson('mall/deleteshoppinglist', ['user_open_id' => $openid, 'sku_product_list' => $products]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/ForwardsMall.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Mall;\n\n/**\n * Class Application.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n *\n * @property \\EasyWeChat\\MiniProgram\\Mall\\OrderClient   $order\n * @property \\EasyWeChat\\MiniProgram\\Mall\\CartClient    $cart\n * @property \\EasyWeChat\\MiniProgram\\Mall\\ProductClient $product\n * @property \\EasyWeChat\\MiniProgram\\Mall\\MediaClient   $media\n */\nclass ForwardsMall\n{\n    /**\n     * @var \\EasyWeChat\\Kernel\\ServiceContainer\n     */\n    protected $app;\n\n    /**\n     * @param \\EasyWeChat\\Kernel\\ServiceContainer $app\n     */\n    public function __construct($app)\n    {\n        $this->app = $app;\n    }\n\n    /**\n     * @param string $property\n     *\n     * @return mixed\n     */\n    public function __get($property)\n    {\n        return $this->app[\"mall.{$property}\"];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/MediaClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Mall;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass MediaClient extends BaseClient\n{\n    /**\n     * 更新或导入媒体信息.\n     *\n     * @param array $params\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function import($params)\n    {\n        return $this->httpPostJson('mall/importmedia', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/OrderClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Mall;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass OrderClient extends BaseClient\n{\n    /**\n     * 导入订单.\n     *\n     * @param array $params\n     * @param bool  $isHistory\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add($params, $isHistory = false)\n    {\n        return $this->httpPostJson('mall/importorder', $params, ['action' => 'add-order', 'is_history' => (int) $isHistory]);\n    }\n\n    /**\n     * 导入订单.\n     *\n     * @param array $params\n     * @param bool  $isHistory\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update($params, $isHistory = false)\n    {\n        return $this->httpPostJson('mall/importorder', $params, ['action' => 'update-order', 'is_history' => (int) $isHistory]);\n    }\n\n    /**\n     * 删除订单.\n     *\n     * @param string $openid\n     * @param string $orderId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete($openid, $orderId)\n    {\n        $params = [\n            'user_open_id' => $openid,\n            'order_id' => $orderId,\n        ];\n\n        return $this->httpPostJson('mall/deleteorder', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/ProductClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Mall;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ProductClient extends BaseClient\n{\n    /**\n     * 更新或导入物品信息.\n     *\n     * @param array $params\n     * @param bool  $isTest\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function import($params, $isTest = false)\n    {\n        return $this->httpPostJson('mall/importproduct', $params, ['is_test' => (int) $isTest]);\n    }\n\n    /**\n     * 查询物品信息.\n     *\n     * @param array $params\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function query($params)\n    {\n        return $this->httpPostJson('mall/queryproduct', $params, ['type' => 'batchquery']);\n    }\n\n    /**\n     * 小程序的物品是否可被搜索.\n     *\n     * @param bool $value\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setSearchable($value)\n    {\n        return $this->httpPostJson('mall/brandmanage', ['can_be_search' => $value], ['action' => 'set_biz_can_be_search']);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Mall;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['mall'] = function ($app) {\n            return new ForwardsMall($app);\n        };\n\n        $app['mall.order'] = function ($app) {\n            return new OrderClient($app);\n        };\n\n        $app['mall.cart'] = function ($app) {\n            return new CartClient($app);\n        };\n\n        $app['mall.product'] = function ($app) {\n            return new ProductClient($app);\n        };\n\n        $app['mall.media'] = function ($app) {\n            return new MediaClient($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/NearbyPoi/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\NearbyPoi;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class Client.\n *\n * @author joyeekk <xygao2420@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Add nearby poi.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(array $params)\n    {\n        $params = array_merge([\n            'is_comm_nearby' => '1',\n            'poi_id' => '',\n        ], $params);\n\n        return $this->httpPostJson('wxa/addnearbypoi', $params);\n    }\n\n    /**\n     * Update nearby poi.\n     *\n     * @param string $poiId\n     * @param array  $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $poiId, array $params)\n    {\n        $params = array_merge([\n            'is_comm_nearby' => '1',\n            'poi_id' => $poiId,\n        ], $params);\n\n        return $this->httpPostJson('wxa/addnearbypoi', $params);\n    }\n\n    /**\n     * Delete nearby poi.\n     *\n     * @param string $poiId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $poiId)\n    {\n        return $this->httpPostJson('wxa/delnearbypoi', [\n            'poi_id' => $poiId,\n        ]);\n    }\n\n    /**\n     * Get nearby poi list.\n     *\n     * @param int $page\n     * @param int $pageRows\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function list(int $page, int $pageRows)\n    {\n        return $this->httpGet('wxa/getnearbypoilist', [\n            'page' => $page,\n            'page_rows' => $pageRows,\n        ]);\n    }\n\n    /**\n     * Set nearby poi show status.\n     *\n     * @param string $poiId\n     * @param int    $status\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setVisibility(string $poiId, int $status)\n    {\n        if (!in_array($status, [0, 1], true)) {\n            throw new InvalidArgumentException('status should be 0 or 1.');\n        }\n\n        return $this->httpPostJson('wxa/setnearbypoishowstatus', [\n            'poi_id' => $poiId,\n            'status' => $status,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/NearbyPoi/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\NearbyPoi;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author joyeekk <xygao2420@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['nearby_poi'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/OCR/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\OCR;\n\nuse EasyWeChat\\OfficialAccount\\OCR\\Client;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author joyeekk <xygao2420@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['ocr'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/OpenData/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\OpenData;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author tianyong90 <412039588@qq.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * removeUserStorage.\n     *\n     * @param string $openid\n     * @param string $sessionKey\n     * @param array  $key\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function removeUserStorage(string $openid, string $sessionKey, array $key)\n    {\n        $data = ['key' => $key];\n        $query = [\n            'openid' => $openid,\n            'sig_method' => 'hmac_sha256',\n            'signature' => hash_hmac('sha256', json_encode($data), $sessionKey),\n        ];\n\n        return $this->httpPostJson('wxa/remove_user_storage', $data, $query);\n    }\n\n    /**\n     * setUserStorage.\n     *\n     * @param string $openid\n     * @param string $sessionKey\n     * @param array  $kvList\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setUserStorage(string $openid, string $sessionKey, array $kvList)\n    {\n        $kvList = $this->formatKVLists($kvList);\n\n        $data = ['kv_list' => $kvList];\n        $query = [\n            'openid' => $openid,\n            'sig_method' => 'hmac_sha256',\n            'signature' => hash_hmac('sha256', json_encode($data), $sessionKey),\n        ];\n\n        return $this->httpPostJson('wxa/set_user_storage', $data, $query);\n    }\n\n    /**\n     * @param array $params\n     *\n     * @return array\n     */\n    protected function formatKVLists(array $params)\n    {\n        $formatted = [];\n\n        foreach ($params as $name => $value) {\n            $formatted[] = [\n                'key' => $name,\n                'value' => strval($value),\n            ];\n        }\n\n        return $formatted;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/OpenData/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\OpenData;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['open_data'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/PhoneNumber/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\PhoneNumber;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @package EasyWeChat\\MiniProgram\\PhoneNumber\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取用户手机号.\n     *\n     * @see https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/phonenumber/phonenumber.getPhoneNumber.html\n     *\n     * @param string $code\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     * @author 读心印 <aa24615@qq.com>\n     */\n    public function getUserPhoneNumber(string $code)\n    {\n        $params = [\n            'code' => $code\n        ];\n\n        return $this->httpPostJson('wxa/business/getuserphonenumber', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/PhoneNumber/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\PhoneNumber;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['phone_number'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Plugin/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Plugin;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @param string $appId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function apply($appId)\n    {\n        return $this->httpPostJson('wxa/plugin', [\n            'action' => 'apply',\n            'plugin_appid' => $appId,\n        ]);\n    }\n\n    /**\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list()\n    {\n        return $this->httpPostJson('wxa/plugin', [\n            'action' => 'list',\n        ]);\n    }\n\n    /**\n     * @param string $appId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function unbind($appId)\n    {\n        return $this->httpPostJson('wxa/plugin', [\n            'action' => 'unbind',\n            'plugin_appid' => $appId,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Plugin/DevClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Plugin;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class DevClient.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass DevClient extends BaseClient\n{\n    /**\n     * Get users.\n     *\n     * @param int $page\n     * @param int $size\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUsers(int $page = 1, int $size = 10)\n    {\n        return $this->httpPostJson('wxa/devplugin', [\n            'action' => 'dev_apply_list',\n            'page' => $page,\n            'num' => $size,\n        ]);\n    }\n\n    /**\n     * Agree to use plugin.\n     *\n     * @param string $appId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function agree(string $appId)\n    {\n        return $this->httpPostJson('wxa/devplugin', [\n            'action' => 'dev_agree',\n            'appid' => $appId,\n        ]);\n    }\n\n    /**\n     * Refuse to use plugin.\n     *\n     * @param string $reason\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function refuse(string $reason)\n    {\n        return $this->httpPostJson('wxa/devplugin', [\n            'action' => 'dev_refuse',\n            'reason' => $reason,\n        ]);\n    }\n\n    /**\n     * Delete rejected applications.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete()\n    {\n        return $this->httpPostJson('wxa/devplugin', [\n            'action' => 'dev_delete',\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Plugin/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Plugin;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * Registers services on the given container.\n     *\n     * This method should only be used to configure services and parameters.\n     * It should not get services.\n     *\n     * @param \\Pimple\\Container $app\n     */\n    public function register(Container $app)\n    {\n        $app['plugin'] = function ($app) {\n            return new Client($app);\n        };\n\n        $app['plugin_dev'] = function ($app) {\n            return new DevClient($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/QrCode/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\QrCode;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException;\nuse EasyWeChat\\Kernel\\Support\\Collection;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * QrCode Client\n *\n * 普通链接二维码\n *\n * @link https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/qrcode/qrcode.html\n * @link https://developers.weixin.qq.com/miniprogram/introduction/qrcode.html\n *\n * @author dysodeng <dysodengs@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取已设置的二维码规则\n     *\n     * @return array|Collection|object|ResponseInterface|string\n     *\n     * @throws InvalidConfigException\n     * @throws GuzzleException\n     */\n    public function list()\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/qrcodejumpget');\n    }\n\n    /**\n     * 获取校验文件名称及内容\n     *\n     * @return array|Collection|object|ResponseInterface|string\n     *\n     * @throws GuzzleException\n     * @throws InvalidConfigException\n     */\n    public function getVerifyFile()\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/qrcodejumpdownload');\n    }\n\n    /**\n     * 增加或修改二维码规则\n     *\n     * @param array $params\n     *\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws GuzzleException\n     * @throws InvalidConfigException\n     */\n    public function set(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/qrcodejumpadd', $params);\n    }\n\n    /**\n     * 发布已设置的二维码规则\n     *\n     * @param string $prefix\n     *\n     * @return array|Collection|object|ResponseInterface|string\n     *\n     * @throws GuzzleException\n     * @throws InvalidConfigException\n     */\n    public function publish(string $prefix)\n    {\n        $params = [\n            'prefix' => $prefix\n        ];\n        return $this->httpPostJson('cgi-bin/wxopen/qrcodejumppublish', $params);\n    }\n\n    /**\n     * 删除已设置的二维码规则\n     *\n     * @param string $prefix\n     *\n     * @return array|Collection|object|ResponseInterface|string\n     *\n     * @throws GuzzleException\n     * @throws InvalidConfigException\n     */\n    public function delete(string $prefix)\n    {\n        $params = [\n            'prefix' => $prefix\n        ];\n        return $this->httpPostJson('cgi-bin/wxopen/qrcodejumpdelete', $params);\n    }\n\n    /**\n     * 将二维码长链接转成短链接\n     *\n     * @param string $long_url\n     *\n     * @return array|Collection|object|ResponseInterface|string\n     *\n     * @throws GuzzleException\n     * @throws InvalidConfigException\n     */\n    public function shortUrl(string $long_url)\n    {\n        $params = [\n            'long_url' => $long_url,\n            'action' => 'long2short'\n        ];\n        return $this->httpPostJson('cgi-bin/shorturl', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/QrCode/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\QrCode;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * QrCode ServiceProvider.\n *\n * @author dysodeng <dysodengs@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $pimple)\n    {\n        $pimple['qr_code'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/RealtimeLog/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\RealtimeLog;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Real time log query.\n     *\n     * @param string $date\n     * @param int    $beginTime\n     * @param int    $endTime\n     * @param array  $options\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function search(string $date, int $beginTime, int $endTime, array $options = [])\n    {\n        $params = [\n            'date' => $date,\n            'begintime' => $beginTime,\n            'endtime' => $endTime,\n        ];\n\n        return $this->httpGet('wxaapi/userlog/userlog_search', $params + $options);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/RealtimeLog/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\RealtimeLog;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function register(Container $app)\n    {\n        $app['realtime_log'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/RiskControl/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\RiskControl;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException;\nuse EasyWeChat\\Kernel\\Support\\Collection;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * 安全风控\n *\n * Class Client\n * @package EasyWeChat\\MiniProgram\\RiskControl\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取用户的安全等级\n     *\n     * @param  array  $params\n     * @return array|Collection|object|ResponseInterface|string\n     *\n     * @throws InvalidConfigException\n     * @throws GuzzleException\n     */\n    public function getUserRiskRank(array $params)\n    {\n        return $this->httpPostJson('wxa/getuserriskrank', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/RiskControl/ServiceProvider.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\RiskControl;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * 安全风控\n *\n * Class ServiceProvider\n * @package EasyWeChat\\MiniProgram\\RiskControl\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * @inheritDoc\n     */\n    public function register(Container $app)\n    {\n        $app['risk_control'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Search/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Search;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Submit applet page URL and parameter information.\n     *\n     * @param array $pages\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function submitPage(array $pages)\n    {\n        return $this->httpPostJson('wxa/search/wxaapi_submitpages', compact('pages'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Search/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Search;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['search'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Server/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Server;\n\nuse EasyWeChat\\MiniProgram\\Encryptor;\nuse EasyWeChat\\OfficialAccount\\Server\\Guard;\nuse EasyWeChat\\OfficialAccount\\Server\\Handlers\\EchoStrHandler;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        !isset($app['encryptor']) && $app['encryptor'] = function ($app) {\n            return new Encryptor(\n                $app['config']['app_id'],\n                $app['config']['token'],\n                $app['config']['aes_key']\n            );\n        };\n\n        !isset($app['server']) && $app['server'] = function ($app) {\n            $guard = new Guard($app);\n            $guard->push(new EchoStrHandler($app));\n\n            return $guard;\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Account/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Account;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * 自定义版交易组件及开放接口 - 商家入驻接口\n *\n * @package EasyWeChat\\MiniProgram\\Shop\\Account\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取商家类目列表\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getCategoryList()\n    {\n        return $this->httpPostJson('shop/account/get_category_list');\n    }\n\n    /**\n     * 获取商家品牌列表\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getBrandList()\n    {\n        return $this->httpPostJson('shop/account/get_brand_list');\n    }\n\n    /**\n     * 更新商家信息\n     *\n     * @param string $path 小程序path\n     * @param string $phone 客服联系方式\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateInfo(string $path = '', string $phone = '')\n    {\n        return $this->httpPostJson('shop/account/update_info', [\n            'service_agent_path' => $path,\n            'service_agent_phone' => $phone,\n        ]);\n    }\n\n    /**\n     * 获取商家信息\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getInfo()\n    {\n        return $this->httpPostJson('shop/account/get_info');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Account/ServiceProvider.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Account;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * 自定义版交易组件及开放接口 - 商家入驻接口\n *\n * @package EasyWeChat\\MiniProgram\\Shop\\Account\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function register(Container $app)\n    {\n        $app['shop_account'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Aftersale/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Aftersale;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * 自定义版交易组件及开放接口 - 售后接口\n *\n * @package EasyWeChat\\MiniProgram\\Shop\\Aftersale\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 创建售后\n     *\n     * @param array $aftersale\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(array $aftersale)\n    {\n        return $this->httpPostJson('shop/ecaftersale/add', $aftersale);\n    }\n\n    /**\n     * 获取订单下售后单\n     *\n     * @param array $order 订单数据\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(array $order)\n    {\n        return $this->httpPostJson('shop/ecaftersale/get', $order);\n    }\n\n    /**\n     * 更新售后\n     *\n     * @param array $order 订单数据\n     * @param array $aftersale 售后数据\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(array $order, array $aftersale)\n    {\n        return $this->httpPostJson('shop/ecaftersale/update', array_merge($order, $aftersale));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Aftersale/ServiceProvider.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Aftersale;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * 自定义版交易组件及开放接口 - 售后接口\n *\n * @package EasyWeChat\\MiniProgram\\Shop\\Aftersale\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * @inheritDoc\n     */\n    public function register(Container $app)\n    {\n        $app['shop_aftersale'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Basic/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Basic;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * 自定义版交易组件及开放接口 - 接入商品前必需接口\n *\n * @package EasyWeChat\\MiniProgram\\Shop\\Basic\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取商品类目\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getCat()\n    {\n        return $this->httpPostJson('shop/cat/get');\n    }\n\n    /**\n     * @param string $imageFilePath 图片文件路径\n     * @param int $respType 返回类型\n     * @param int $uploadType 上传类型，本地图片或者网络图片\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function imgUpload(string $imageFilePath, int $respType = 1, int $uploadType = 0)\n    {\n        if ($uploadType == 0) {\n            return $this->httpUpload('shop/img/upload', [\n                'media' => $imageFilePath,\n            ], [\n                'resp_type' => $respType,\n            ]);\n        } else {\n            return $this->httpPostJson('shop/img/upload', [], [\n                'img_url' => $imageFilePath,\n                'resp_type' => $respType,\n                'upload_type' => $uploadType\n            ]);\n        }\n    }\n\n    /**\n     * 品牌审核\n     *\n     * @param array $brand 品牌信息\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function auditBrand(array $brand)\n    {\n        return $this->httpPostJson('shop/audit/audit_brand', [\n            'audit_req' => $brand\n        ]);\n    }\n\n    /**\n     * 类目审核\n     *\n     * @param array $category 类目资质\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function auditCategory(array $category)\n    {\n        return $this->httpPostJson('shop/audit/audit_category', [\n            'audit_req' => $category\n        ]);\n    }\n\n    /**\n     * 获取审核结果\n     *\n     * @param string $auditId 提交审核时返回的id\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function auditResult(string $auditId)\n    {\n        return $this->httpPostJson('shop/audit/result', [\n            'audit_id' => $auditId\n        ]);\n    }\n\n    /**\n     * 获取小程序资质\n     *\n     * @param int $reqType\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getMiniAppCertificate(int $reqType = 2)\n    {\n        return $this->httpPostJson('shop/audit/get_miniapp_certificate', [\n            'req_type' => $reqType\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Basic/ServiceProvider.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Basic;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * 自定义版交易组件及开放接口 - 接入商品前必需接口\n *\n * @package EasyWeChat\\MiniProgram\\Shop\\Basic\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * @inheritDoc\n     */\n    public function register(Container $app)\n    {\n        $app['shop_basic'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Delivery/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Delivery;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * 自定义版交易组件及开放接口 - 物流接口\n *\n * @package EasyWeChat\\MiniProgram\\Shop\\Delivery\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取快递公司列表\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getCompanyList()\n    {\n        return $this->httpPostJson('shop/delivery/get_company_list');\n    }\n\n    /**\n     * 订单发货\n     *\n     * @param array $order\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(array $order)\n    {\n        return $this->httpPostJson('shop/delivery/send', $order);\n    }\n\n    /**\n     * 订单确认收货\n     *\n     * @param array $order\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function recieve(array $order)\n    {\n        return $this->httpPostJson('shop/delivery/recieve', $order);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Delivery/ServiceProvider.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Delivery;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * 自定义版交易组件及开放接口 - 物流接口\n *\n * @package EasyWeChat\\MiniProgram\\Shop\\Delivery\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * @inheritDoc\n     */\n    public function register(Container $app)\n    {\n        $app['shop_delivery'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Order/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Order;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * 自定义版交易组件及开放接口 - 订单接口\n *\n * @package EasyWeChat\\MiniProgram\\Shop\\Order\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 检查场景值是否在支付校验范围内\n     *\n     * @param int $scene 场景值\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function sceneCheck(int $scene)\n    {\n        return $this->httpPostJson('shop/scene/check', ['scene' => $scene]);\n    }\n\n    /**\n     * 生成订单\n     *\n     * @param array $order\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $order)\n    {\n        return $this->httpPostJson('shop/order/add', $order);\n    }\n\n    /**\n     * 生成订单\n     *\n     * @param array $order\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(array $order)\n    {\n        return $this->httpPostJson('shop/order/add', $order);\n    }\n\n    /**\n     * 获取订单详情\n     *\n     * @param string $openid 用户的openid\n     * @param array $orderId 微信侧订单id （订单id二选一）\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $openid, array $orderId)\n    {\n        return $this->httpPostJson('shop/order/get', array_merge($orderId, ['openid' => $openid]));\n    }\n\n    /**\n     * 关闭订单\n     *\n     * @param array $params 请求参数\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function close(array $params)\n    {\n        return $this->httpPostJson('shop/order/close', $params);\n    }\n\n    /**\n     * 获取订单列表\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getList(array $data)\n    {\n        return $this->httpPostJson('shop/order/get_list', $data);\n    }\n\n    /**\n     * 同步订单支付结果\n     *\n     * @param array $pay\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function pay(array $pay)\n    {\n        return $this->httpPostJson('shop/order/pay', $pay);\n    }\n\n    /**\n     * 同步订单支付结果\n     *\n     * @param array $pay\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function syncPayState(array $pay)\n    {\n        return $this->httpPostJson('shop/order/pay', $pay);\n    }\n\n    /**\n     * 同步订单支付结果\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getPayInfo(array $params)\n    {\n        return $this->httpPostJson('shop/order/getpaymentparams', $params);\n    }\n\n    /**\n     * 获取推广员订单\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getFinderOrders(array $params)\n    {\n        return $this->httpPostJson('shop/order/get_list_by_finder', $params);\n    }\n\n    /**\n     * 获取分享员订单\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getSharerOrders(array $params)\n    {\n        return $this->httpPostJson('shop/order/get_list_by_sharer', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Order/ServiceProvider.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Order;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * 自定义版交易组件及开放接口 - 订单接口\n *\n * @package EasyWeChat\\MiniProgram\\Shop\\Order\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * @inheritDoc\n     */\n    public function register(Container $app)\n    {\n        $app['shop_order'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Register/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Register;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author her-cat <hxhsoft@foxmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 接入申请\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function apply()\n    {\n        return $this->httpPostJson('shop/register/apply');\n    }\n\n    /**\n     * 获取接入状态\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function check()\n    {\n        return $this->httpPostJson('shop/register/check');\n    }\n\n    /**\n     * 完成接入任务\n     *\n     * @param int $accessInfoItem\n     *            6:完成spu接口，7:完成订单接口，8:完成物流接口，9:完成售后接口，10:测试完成，11:发版完成\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function finishAccessInfo(int $accessInfoItem)\n    {\n        return $this->httpPostJson('shop/register/finish_access_info', [\n            'access_info_item' => $accessInfoItem\n        ]);\n    }\n\n    /**\n     * 场景接入申请\n     *\n     * @param int $sceneGroupId 1:视频号、公众号场景\n\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function applyScene(int $sceneGroupId = 1)\n    {\n        return $this->httpPostJson('shop/register/apply_scene', [\n            'scene_group_id' => $sceneGroupId\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Register/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Register;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author her-cat <hxhsoft@foxmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function register(Container $app)\n    {\n        $app['shop_register'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Spu/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Spu;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * 自定义版交易组件及开放接口 - SPU接口\n *\n * @package EasyWeChat\\MiniProgram\\Shop\\Spu\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 添加商品\n     *\n     * @param array $product 商品信息\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(array $product)\n    {\n        return $this->httpPostJson('shop/spu/add', $product);\n    }\n\n    /**\n     * 删除商品\n     *\n     * @param array $productId 商品编号信息\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function del(array $productId)\n    {\n        return $this->httpPostJson('shop/spu/del', $productId);\n    }\n\n    /**\n     * 获取商品\n     *\n     * @param array $productId 商品编号信息\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(array $productId)\n    {\n        return $this->httpPostJson('shop/spu/get', $productId);\n    }\n\n    /**\n     * 获取商品列表\n     *\n     * @param array $product 商品信息\n     * @param array $page 分页信息\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getList(array $product, array $page)\n    {\n        return $this->httpPostJson('shop/spu/get_list', array_merge($product, $page));\n    }\n\n    /**\n     * 撤回商品审核\n     *\n     * @param array $productId 商品编号信息 交易组件平台内部商品ID，与out_product_id二选一\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delAudit(array $productId)\n    {\n        return $this->httpPostJson('shop/spu/del_audit', $productId);\n    }\n\n    /**\n     * 更新商品\n     *\n     * @param array $product\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(array $product)\n    {\n        return $this->httpPostJson('shop/spu/update', $product);\n    }\n\n    /**\n     * 该免审更新商品\n     *\n     * @param array $product\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateWithoutAudit(array $product)\n    {\n        return $this->httpPostJson('shop/spu/update_without_audit', $product);\n    }\n\n    /**\n     * 上架商品\n     *\n     * @param array $productId 商品编号数据 交易组件平台内部商品ID，与out_product_id二选一\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function listing(array $productId)\n    {\n        return $this->httpPostJson('shop/spu/listing', $productId);\n    }\n\n    /**\n     * 下架商品\n     *\n     * @param array $productId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delisting(array $productId)\n    {\n        return $this->httpPostJson('shop/spu/delisting', $productId);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Spu/ServiceProvider.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\Shop\\Spu;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * 自定义版交易组件及开放接口 - SPU接口\n *\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n * @package EasyWeChat\\MiniProgram\\Shop\\Spu\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function register(Container $app)\n    {\n        $app['shop_spu'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/ShortLink/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\ShortLink;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException;\nuse EasyWeChat\\Kernel\\Support\\Collection;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Class Client.\n *\n * @package EasyWeChat\\MiniProgram\\ShortLink\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取小程序 Short Link\n     *\n     * @param  string  $pageUrl\n     * @param  string  $pageTitle\n     * @param  bool  $isPermanent\n     *\n     * @return array|Collection|object|ResponseInterface|string\n     *\n     * @throws GuzzleException\n     * @throws InvalidConfigException\n     */\n    public function getShortLink(string $pageUrl, string $pageTitle, bool $isPermanent = false)\n    {\n        $params = [\n            'page_url' => $pageUrl,\n            'page_title' => $pageTitle,\n            'is_permanent' => $isPermanent,\n        ];\n\n        return $this->httpPostJson('wxa/genwxashortlink', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/ShortLink/ServiceProvider.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\ShortLink;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * @inheritDoc\n     */\n    public function register(Container $app)\n    {\n        $app['short_link'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Soter/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Soter;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author her-cat <hxhsoft@foxmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @param string $openid\n     * @param string $json\n     * @param string $signature\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function verifySignature(string $openid, string $json, string $signature)\n    {\n        return $this->httpPostJson('cgi-bin/soter/verify_signature', [\n            'openid' => $openid,\n            'json_string' => $json,\n            'json_signature' => $signature,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Soter/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Soter;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author her-cat <hxhsoft@foxmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function register(Container $app)\n    {\n        $app['soter'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/SubscribeMessage/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\SubscribeMessage;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse ReflectionClass;\n\n/**\n * Class Client.\n *\n * @author hugo <rabbitzhang52@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * {@inheritdoc}.\n     */\n    protected $message = [\n        'touser' => '',\n        'template_id' => '',\n        'page' => '',\n        'data' => [],\n        'miniprogram_state' => 'formal',\n    ];\n\n    /**\n     * {@inheritdoc}.\n     */\n    protected $required = ['touser', 'template_id', 'data'];\n\n    /**\n     * Send a template message.\n     *\n     * @param array $data\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(array $data = [])\n    {\n        $params = $this->formatMessage($data);\n\n        $this->restoreMessage();\n\n        return $this->httpPostJson('cgi-bin/message/subscribe/send', $params);\n    }\n\n    /**\n     * @param array $data\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    protected function formatMessage(array $data = [])\n    {\n        $params = array_merge($this->message, $data);\n\n        foreach ($params as $key => $value) {\n            if (in_array($key, $this->required, true) && empty($value) && empty($this->message[$key])) {\n                throw new InvalidArgumentException(sprintf('Attribute \"%s\" can not be empty!', $key));\n            }\n\n            $params[$key] = empty($value) ? $this->message[$key] : $value;\n        }\n\n        foreach ($params['data'] as $key => $value) {\n            if (is_array($value)) {\n                if (\\array_key_exists('value', $value)) {\n                    $params['data'][$key] = ['value' => $value['value']];\n\n                    continue;\n                }\n\n                if (count($value) >= 1) {\n                    $value = [\n                        'value' => $value[0],\n//                        'color' => $value[1],// color unsupported\n                    ];\n                }\n            } else {\n                $value = [\n                    'value' => strval($value),\n                ];\n            }\n\n            $params['data'][$key] = $value;\n        }\n\n        return $params;\n    }\n\n    /**\n     * Restore message.\n     */\n    protected function restoreMessage()\n    {\n        $this->message = (new ReflectionClass(static::class))->getDefaultProperties()['message'];\n    }\n\n    /**\n     * Combine templates and add them to your personal template library under your account.\n     *\n     * @param string      $tid\n     * @param array       $kidList\n     * @param string|null $sceneDesc\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function addTemplate(string $tid, array $kidList, string $sceneDesc = null)\n    {\n        $sceneDesc = $sceneDesc ?? '';\n        $data = \\compact('tid', 'kidList', 'sceneDesc');\n\n        return $this->httpPost('wxaapi/newtmpl/addtemplate', $data);\n    }\n\n    /**\n     * Delete personal template under account.\n     *\n     * @param string $id\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deleteTemplate(string $id)\n    {\n        return $this->httpPost('wxaapi/newtmpl/deltemplate', ['priTmplId' => $id]);\n    }\n\n    /**\n     * Get keyword list under template title.\n     *\n     * @param string $tid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTemplateKeywords(string $tid)\n    {\n        return $this->httpGet('wxaapi/newtmpl/getpubtemplatekeywords', compact('tid'));\n    }\n\n    /**\n     * Get the title of the public template under the category to which the account belongs.\n     *\n     * @param array $ids\n     * @param int   $start\n     * @param int   $limit\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTemplateTitles(array $ids, int $start = 0, int $limit = 30)\n    {\n        $ids = \\implode(',', $ids);\n        $query = \\compact('ids', 'start', 'limit');\n\n        return $this->httpGet('wxaapi/newtmpl/getpubtemplatetitles', $query);\n    }\n\n    /**\n     * Get list of personal templates under the current account.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTemplates()\n    {\n        return $this->httpGet('wxaapi/newtmpl/gettemplate');\n    }\n\n    /**\n     * Get the category of the applet account.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getCategory()\n    {\n        return $this->httpGet('wxaapi/newtmpl/getcategory');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/SubscribeMessage/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\SubscribeMessage;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['subscribe_message'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/TemplateMessage/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\TemplateMessage;\n\nuse EasyWeChat\\OfficialAccount\\TemplateMessage\\Client as BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    public const API_SEND = 'cgi-bin/message/wxopen/template/send';\n\n    /**\n     * {@inheritdoc}.\n     */\n    protected $message = [\n        'touser' => '',\n        'template_id' => '',\n        'page' => '',\n        'form_id' => '',\n        'data' => [],\n        'emphasis_keyword' => '',\n    ];\n\n    /**\n     * {@inheritdoc}.\n     */\n    protected $required = ['touser', 'template_id', 'form_id'];\n\n    /**\n     * @param int $offset\n     * @param int $count\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(int $offset, int $count)\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/template/library/list', compact('offset', 'count'));\n    }\n\n    /**\n     * @param string $id\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $id)\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/template/library/get', compact('id'));\n    }\n\n    /**\n     * @param string $id\n     * @param array  $keyword\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(string $id, array $keyword)\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/template/add', [\n            'id' => $id,\n            'keyword_id_list' => $keyword,\n        ]);\n    }\n\n    /**\n     * @param string $templateId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $templateId)\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/template/del', [\n            'template_id' => $templateId,\n        ]);\n    }\n\n    /**\n     * @param int $offset\n     * @param int $count\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTemplates(int $offset, int $count)\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/template/list', compact('offset', 'count'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/TemplateMessage/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\TemplateMessage;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['template_message'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/UniformMessage/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\UniformMessage;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\OfficialAccount\\TemplateMessage\\Client as BaseClient;\n\nclass Client extends BaseClient\n{\n    public const API_SEND = 'cgi-bin/message/wxopen/template/uniform_send';\n\n    /**\n     * {@inheritdoc}.\n     *\n     * @var array\n     */\n    protected $message = [\n        'touser' => '',\n    ];\n\n    /**\n     * Weapp Attributes.\n     *\n     * @var array\n     */\n    protected $weappMessage = [\n        'template_id' => '',\n        'page' => '',\n        'form_id' => '',\n        'data' => [],\n        'emphasis_keyword' => '',\n    ];\n\n    /**\n     * Official account attributes.\n     *\n     * @var array\n     */\n    protected $mpMessage = [\n        'appid' => '',\n        'template_id' => '',\n        'url' => '',\n        'miniprogram' => [],\n        'data' => [],\n    ];\n\n    /**\n     * Required attributes.\n     *\n     * @var array\n     */\n    protected $required = ['touser', 'template_id', 'form_id', 'miniprogram', 'appid'];\n\n    /**\n     * @param array $data\n     *\n     * @return array\n     *\n     * @throws InvalidArgumentException\n     */\n    protected function formatMessage(array $data = [])\n    {\n        $params = array_merge($this->message, $data);\n\n        if (empty($params['touser'])) {\n            throw new InvalidArgumentException(sprintf('Attribute \"touser\" can not be empty!'));\n        }\n\n        if (!empty($params['weapp_template_msg'])) {\n            $params['weapp_template_msg'] = $this->formatWeappMessage($params['weapp_template_msg']);\n        }\n\n        if (!empty($params['mp_template_msg'])) {\n            $params['mp_template_msg'] = $this->formatMpMessage($params['mp_template_msg']);\n        }\n\n        return $params;\n    }\n\n    /**\n     * @param array $data\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    protected function formatWeappMessage(array $data = [])\n    {\n        $params = $this->baseFormat($data, $this->weappMessage);\n\n        $params['data'] = $this->formatData($params['data'] ?? []);\n\n        return $params;\n    }\n\n    /**\n     * @param array $data\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    protected function formatMpMessage(array $data = [])\n    {\n        $params = $this->baseFormat($data, $this->mpMessage);\n\n        if (empty($params['miniprogram']['appid'])) {\n            $params['miniprogram']['appid'] = $this->app['config']['app_id'];\n        }\n\n        $params['data'] = $this->formatData($params['data'] ?? []);\n\n        return $params;\n    }\n\n    /**\n     * @param array $data\n     * @param array $default\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    protected function baseFormat($data = [], $default = [])\n    {\n        $params = array_merge($default, $data);\n        foreach ($params as $key => $value) {\n            if (in_array($key, $this->required, true) && empty($value) && empty($default[$key])) {\n                throw new InvalidArgumentException(sprintf('Attribute \"%s\" can not be empty!', $key));\n            }\n\n            $params[$key] = empty($value) ? $default[$key] : $value;\n        }\n\n        return $params;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/UniformMessage/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\UniformMessage;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['uniform_message'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Union/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Union;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author Abbotton <uctoo@foxmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Add promotion.\n     *\n     * @param string $promotionSourceName\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createPromotion(string $promotionSourceName)\n    {\n        $params = [\n            'promotionSourceName' => $promotionSourceName,\n        ];\n\n        return $this->httpPostJson('union/promoter/promotion/add', $params);\n    }\n\n    /**\n     * Delete promotion.\n     *\n     * @param string $promotionSourcePid\n     * @param string $promotionSourceName\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deletePromotion(string $promotionSourcePid, string $promotionSourceName)\n    {\n        $params = [\n            'promotionSourceName' => $promotionSourceName,\n            'promotionSourcePid' => $promotionSourcePid,\n        ];\n\n        return $this->httpPostJson('union/promoter/promotion/del', $params);\n    }\n\n    /**\n     * Update promotion.\n     *\n     * @param array $previousPromotionInfo\n     * @param array $promotionInfo\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updatePromotion(array $previousPromotionInfo, array $promotionInfo)\n    {\n        $params = [\n            'previousPromotionInfo' => $previousPromotionInfo,\n            'promotionInfo' => $promotionInfo,\n        ];\n\n        return $this->httpPostJson('union/promoter/promotion/upd', $params);\n    }\n\n    /**\n     * Get a list of promotion spots.\n     *\n     * @param int $start\n     * @param int $limit\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getPromotionSourceList(int $start = 0, int $limit = 20)\n    {\n        $params = [\n            'start' => $start,\n            'limit' => $limit\n        ];\n\n        return $this->httpGet('union/promoter/promotion/list', $params);\n    }\n\n    /**\n     * Get the list of affiliate product categories and category IDs.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getProductCategory()\n    {\n        return $this->httpGet('union/promoter/product/category');\n    }\n\n    /**\n     * Get the list and detail of affiliate product.\n     *\n     * @param array $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getProductList(array $params)\n    {\n        return $this->httpGet('union/promoter/product/list', $params);\n    }\n\n    /**\n     * Get product promotion materials\n     *\n     * @param string $pid\n     * @param array $productList\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getProductMaterial(string $pid, array $productList)\n    {\n        $params = [\n            'pid' => $pid,\n            'productList' => $productList,\n        ];\n\n        return $this->httpPostJson('union/promoter/product/generate', $params);\n    }\n\n    /**\n     * Query order details based on order ID array.\n     *\n     * @param array $orderIdList\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getOrderInfo(array $orderIdList)\n    {\n        return $this->httpPostJson('union/promoter/order/info', $orderIdList);\n    }\n\n    /**\n     * Query and filter the order list.\n     *\n     * @param int $page\n     * @param string $startTimestamp\n     * @param string $endTimestamp\n     * @param string $commissionStatus\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function searchOrder(int $page = 1, $startTimestamp = '', $endTimestamp = '', $commissionStatus = '')\n    {\n        $params = [\n            'page' => $page,\n            'startTimestamp' => $startTimestamp,\n            'endTimestamp' => $endTimestamp,\n            'commissionStatus' => $commissionStatus\n        ];\n\n        return $this->httpGet('union/promoter/order/search', $params);\n    }\n\n    /**\n     * Get featured products of union.\n     *\n     * @param  array  $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getFeaturedProducts(array $params)\n    {\n        return $this->httpGet('union/promoter/product/select', $params);\n    }\n\n    /**\n     * Query the details of the targeted plan.\n     *\n     * @param  array  $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTargetPlanInfo(array $params)\n    {\n        return $this->httpGet('union/promoter/target/plan_info', $params);\n    }\n\n    /**\n     * Apply to join the targeted plan.\n     *\n     * @param  array  $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function applyJoinTargetPlan(array $params)\n    {\n        return $this->httpPostJson('union/promoter/target/apply_target', $params);\n    }\n\n    /**\n     * Query the status of the targeted plan apply.\n     *\n     * @param  array  $params\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTargetPlanStatus(array $params)\n    {\n        return $this->httpGet('union/promoter/target/apply_status', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Union/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\MiniProgram\\Union;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author Abbotton <uctoo@foxmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['union'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/UrlLink/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\UrlLink;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException;\nuse EasyWeChat\\Kernel\\Support\\Collection;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Url Scheme\n *\n * Class Client\n * @package EasyWeChat\\MiniProgram\\UrlLink\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取小程序 URL Link\n     *\n     * @param  array  $param\n     * @return array|Collection|object|ResponseInterface|string\n     *\n     * @throws GuzzleException\n     * @throws InvalidConfigException\n     */\n    public function generate(array $param = [])\n    {\n        return $this->httpPostJson('wxa/generate_urllink', $param);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/UrlLink/ServiceProvider.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\UrlLink;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * @inheritDoc\n     */\n    public function register(Container $app)\n    {\n        $app['url_link'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/UrlScheme/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\UrlScheme;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException;\nuse EasyWeChat\\Kernel\\Support\\Collection;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Url Scheme\n *\n * Class Client\n * @package EasyWeChat\\MiniProgram\\UrlScheme\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取小程序scheme码\n     *\n     * @param  array  $param\n     * @return array|Collection|object|ResponseInterface|string\n     *\n     * @throws GuzzleException\n     * @throws InvalidConfigException\n     */\n    public function generate(array $param = [])\n    {\n        return $this->httpPostJson('wxa/generatescheme', $param);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/UrlScheme/ServiceProvider.php",
    "content": "<?php\n\nnamespace EasyWeChat\\MiniProgram\\UrlScheme;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * @inheritDoc\n     */\n    public function register(Container $app)\n    {\n        $app['url_scheme'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount;\n\nuse EasyWeChat\\BasicService;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Class Application.\n *\n * @author overtrue <i@overtrue.me>\n *\n * @property \\EasyWeChat\\BasicService\\Media\\Client                     $media\n * @property \\EasyWeChat\\BasicService\\Url\\Client                       $url\n * @property \\EasyWeChat\\BasicService\\QrCode\\Client                    $qrcode\n * @property \\EasyWeChat\\BasicService\\Jssdk\\Client                     $jssdk\n * @property \\EasyWeChat\\OfficialAccount\\Auth\\AccessToken              $access_token\n * @property \\EasyWeChat\\OfficialAccount\\Server\\Guard                  $server\n * @property \\EasyWeChat\\OfficialAccount\\User\\UserClient               $user\n * @property \\EasyWeChat\\OfficialAccount\\User\\TagClient                $user_tag\n * @property \\EasyWeChat\\OfficialAccount\\Menu\\Client                   $menu\n * @property \\EasyWeChat\\OfficialAccount\\TemplateMessage\\Client        $template_message\n * @property \\EasyWeChat\\OfficialAccount\\SubscribeMessage\\Client       $subscribe_message\n * @property \\EasyWeChat\\OfficialAccount\\Material\\Client               $material\n * @property \\EasyWeChat\\OfficialAccount\\CustomerService\\Client        $customer_service\n * @property \\EasyWeChat\\OfficialAccount\\CustomerService\\SessionClient $customer_service_session\n * @property \\EasyWeChat\\OfficialAccount\\Semantic\\Client               $semantic\n * @property \\EasyWeChat\\OfficialAccount\\DataCube\\Client               $data_cube\n * @property \\EasyWeChat\\OfficialAccount\\AutoReply\\Client              $auto_reply\n * @property \\EasyWeChat\\OfficialAccount\\Broadcasting\\Client           $broadcasting\n * @property \\EasyWeChat\\OfficialAccount\\Card\\Card                     $card\n * @property \\EasyWeChat\\OfficialAccount\\Device\\Client                 $device\n * @property \\EasyWeChat\\OfficialAccount\\ShakeAround\\ShakeAround       $shake_around\n * @property \\EasyWeChat\\OfficialAccount\\POI\\Client                    $poi\n * @property \\EasyWeChat\\OfficialAccount\\Store\\Client                  $store\n * @property \\EasyWeChat\\OfficialAccount\\Base\\Client                   $base\n * @property \\EasyWeChat\\OfficialAccount\\Comment\\Client                $comment\n * @property \\EasyWeChat\\OfficialAccount\\OCR\\Client                    $ocr\n * @property \\EasyWeChat\\OfficialAccount\\Goods\\Client                  $goods\n * @property \\Overtrue\\Socialite\\Providers\\WeChat                      $oauth\n * @property \\EasyWeChat\\OfficialAccount\\WiFi\\Client                   $wifi\n * @property \\EasyWeChat\\OfficialAccount\\WiFi\\CardClient               $wifi_card\n * @property \\EasyWeChat\\OfficialAccount\\WiFi\\DeviceClient             $wifi_device\n * @property \\EasyWeChat\\OfficialAccount\\WiFi\\ShopClient               $wifi_shop\n * @property \\EasyWeChat\\OfficialAccount\\Guide\\Client                  $guide\n * @property \\EasyWeChat\\OfficialAccount\\Draft\\Client                  $draft\n * @property \\EasyWeChat\\OfficialAccount\\FreePublish\\Client            $free_publish\n */\nclass Application extends ServiceContainer\n{\n    /**\n     * @var array\n     */\n    protected $providers = [\n        Auth\\ServiceProvider::class,\n        Server\\ServiceProvider::class,\n        User\\ServiceProvider::class,\n        OAuth\\ServiceProvider::class,\n        Menu\\ServiceProvider::class,\n        TemplateMessage\\ServiceProvider::class,\n        SubscribeMessage\\ServiceProvider::class,\n        Material\\ServiceProvider::class,\n        CustomerService\\ServiceProvider::class,\n        Semantic\\ServiceProvider::class,\n        DataCube\\ServiceProvider::class,\n        POI\\ServiceProvider::class,\n        AutoReply\\ServiceProvider::class,\n        Broadcasting\\ServiceProvider::class,\n        Card\\ServiceProvider::class,\n        Device\\ServiceProvider::class,\n        ShakeAround\\ServiceProvider::class,\n        Store\\ServiceProvider::class,\n        Comment\\ServiceProvider::class,\n        Base\\ServiceProvider::class,\n        OCR\\ServiceProvider::class,\n        Goods\\ServiceProvider::class,\n        WiFi\\ServiceProvider::class,\n        Draft\\ServiceProvider::class,\n        FreePublish\\ServiceProvider::class,\n        // Base services\n        BasicService\\QrCode\\ServiceProvider::class,\n        BasicService\\Media\\ServiceProvider::class,\n        BasicService\\Url\\ServiceProvider::class,\n        BasicService\\Jssdk\\ServiceProvider::class,\n        // Append Guide Interface\n        Guide\\ServiceProvider::class,\n    ];\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Auth/AccessToken.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Auth;\n\nuse EasyWeChat\\Kernel\\AccessToken as BaseAccessToken;\n\n/**\n * Class AuthorizerAccessToken.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass AccessToken extends BaseAccessToken\n{\n    /**\n     * @var string\n     */\n    protected $endpointToGetToken = 'cgi-bin/token';\n\n    /**\n     * @return array\n     */\n    protected function getCredentials(): array\n    {\n        return [\n            'grant_type' => 'client_credential',\n            'appid' => $this->app['config']['app_id'],\n            'secret' => $this->app['config']['secret'],\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Auth/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Auth;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        !isset($app['access_token']) && $app['access_token'] = function ($app) {\n            return new AccessToken($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/AutoReply/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\AutoReply;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get current auto reply settings.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function current()\n    {\n        return $this->httpGet('cgi-bin/get_current_autoreply_info');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/AutoReply/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\AutoReply;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['auto_reply'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Base/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Base;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get api quota.\n     *\n     * @param  string  $cgiPath  api cgi_path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getQuota(string $cgiPath)\n    {\n        $params = [\n            'cgi_path' => $cgiPath,\n        ];\n\n        return $this->httpPostJson('cgi-bin/openapi/quota/get', $params);\n    }\n\n    /**\n     * Clear quota.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function clearQuota()\n    {\n        $params = [\n            'appid' => $this->app['config']['app_id'],\n        ];\n\n        return $this->httpPostJson('cgi-bin/clear_quota', $params);\n    }\n\n    /**\n     * Get wechat callback ip.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getValidIps()\n    {\n        return $this->httpGet('cgi-bin/getcallbackip');\n    }\n\n    /**\n     * Check the callback address network.\n     *\n     * @param string $action\n     * @param string $operator\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function checkCallbackUrl(string $action = 'all', string $operator = 'DEFAULT')\n    {\n        if (!in_array($action, ['dns', 'ping', 'all'], true)) {\n            throw new InvalidArgumentException('The action must be dns, ping, all.');\n        }\n\n        $operator = strtoupper($operator);\n\n        if (!in_array($operator, ['CHINANET', 'UNICOM', 'CAP', 'DEFAULT'], true)) {\n            throw new InvalidArgumentException('The operator must be CHINANET, UNICOM, CAP, DEFAULT.');\n        }\n\n        $params = [\n            'action' => $action,\n            'check_operator' => $operator,\n        ];\n\n        return $this->httpPostJson('cgi-bin/callback/check', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Base/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Base;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['base'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Broadcasting/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Broadcasting;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Contracts\\MessageInterface;\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Messages\\Card;\nuse EasyWeChat\\Kernel\\Messages\\Image;\nuse EasyWeChat\\Kernel\\Messages\\Media;\nuse EasyWeChat\\Kernel\\Messages\\Text;\nuse EasyWeChat\\Kernel\\Support\\Arr;\n\n/**\n * Class Client.\n *\n * @method \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string previewTextByName($text, $name);\n * @method \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string previewNewsByName($mediaId, $name);\n * @method \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string previewVoiceByName($mediaId, $name);\n * @method \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string previewImageByName($mediaId, $name);\n * @method \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string previewVideoByName($message, $name);\n * @method \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string previewCardByName($cardId, $name);\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    public const PREVIEW_BY_OPENID = 'touser';\n    public const PREVIEW_BY_NAME = 'towxname';\n\n    /**\n     * Send a message.\n     *\n     * @param array $message\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(array $message)\n    {\n        if (empty($message['filter']) && empty($message['touser'])) {\n            throw new RuntimeException('The message reception object is not specified');\n        }\n\n        $api = Arr::get($message, 'touser') ? 'cgi-bin/message/mass/send' : 'cgi-bin/message/mass/sendall';\n\n        return $this->httpPostJson($api, $message);\n    }\n\n    /**\n     * Preview a message.\n     *\n     * @param array $message\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function preview(array $message)\n    {\n        return $this->httpPostJson('cgi-bin/message/mass/preview', $message);\n    }\n\n    /**\n     * Delete a broadcast.\n     *\n     * @param string $msgId\n     * @param int    $index\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $msgId, int $index = 0)\n    {\n        $options = [\n            'msg_id' => $msgId,\n            'article_idx' => $index,\n        ];\n\n        return $this->httpPostJson('cgi-bin/message/mass/delete', $options);\n    }\n\n    /**\n     * Get a broadcast status.\n     *\n     * @param string $msgId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function status(string $msgId)\n    {\n        $options = [\n            'msg_id' => $msgId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/message/mass/get', $options);\n    }\n\n    /**\n     * Send a text message.\n     *\n     * @param string $message\n     * @param mixed  $reception\n     * @param array  $attributes\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function sendText(string $message, $reception = null, array $attributes = [])\n    {\n        return $this->sendMessage(new Text($message), $reception, $attributes);\n    }\n\n    /**\n     * Send a news message.\n     *\n     * @param string $mediaId\n     * @param mixed  $reception\n     * @param array  $attributes\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function sendNews(string $mediaId, $reception = null, array $attributes = [])\n    {\n        return $this->sendMessage(new Media($mediaId, 'mpnews'), $reception, $attributes);\n    }\n\n    /**\n     * Send a voice message.\n     *\n     * @param string $mediaId\n     * @param mixed  $reception\n     * @param array  $attributes\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function sendVoice(string $mediaId, $reception = null, array $attributes = [])\n    {\n        return $this->sendMessage(new Media($mediaId, 'voice'), $reception, $attributes);\n    }\n\n    /**\n     * Send a image message.\n     *\n     * @param string $mediaId\n     * @param mixed  $reception\n     * @param array  $attributes\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function sendImage(string $mediaId, $reception = null, array $attributes = [])\n    {\n        return $this->sendMessage(new Image($mediaId), $reception, $attributes);\n    }\n\n    /**\n     * Send a video message.\n     *\n     * @param string $mediaId\n     * @param mixed  $reception\n     * @param array  $attributes\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function sendVideo(string $mediaId, $reception = null, array $attributes = [])\n    {\n        return $this->sendMessage(new Media($mediaId, 'mpvideo'), $reception, $attributes);\n    }\n\n    /**\n     * Send a card message.\n     *\n     * @param string $cardId\n     * @param mixed  $reception\n     * @param array  $attributes\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function sendCard(string $cardId, $reception = null, array $attributes = [])\n    {\n        return $this->sendMessage(new Card($cardId), $reception, $attributes);\n    }\n\n    /**\n     * Preview a text message.\n     *\n     * @param string $message   message\n     * @param string $reception\n     * @param string $method\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function previewText(string $message, $reception, $method = self::PREVIEW_BY_OPENID)\n    {\n        return $this->previewMessage(new Text($message), $reception, $method);\n    }\n\n    /**\n     * Preview a news message.\n     *\n     * @param string $mediaId   message\n     * @param string $reception\n     * @param string $method\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function previewNews(string $mediaId, $reception, $method = self::PREVIEW_BY_OPENID)\n    {\n        return $this->previewMessage(new Media($mediaId, 'mpnews'), $reception, $method);\n    }\n\n    /**\n     * Preview a voice message.\n     *\n     * @param string $mediaId   message\n     * @param string $reception\n     * @param string $method\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function previewVoice(string $mediaId, $reception, $method = self::PREVIEW_BY_OPENID)\n    {\n        return $this->previewMessage(new Media($mediaId, 'voice'), $reception, $method);\n    }\n\n    /**\n     * Preview a image message.\n     *\n     * @param string $mediaId   message\n     * @param string $reception\n     * @param string $method\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function previewImage(string $mediaId, $reception, $method = self::PREVIEW_BY_OPENID)\n    {\n        return $this->previewMessage(new Image($mediaId), $reception, $method);\n    }\n\n    /**\n     * Preview a video message.\n     *\n     * @param string $mediaId   message\n     * @param string $reception\n     * @param string $method\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function previewVideo(string $mediaId, $reception, $method = self::PREVIEW_BY_OPENID)\n    {\n        return $this->previewMessage(new Media($mediaId, 'mpvideo'), $reception, $method);\n    }\n\n    /**\n     * Preview a card message.\n     *\n     * @param string $cardId    message\n     * @param string $reception\n     * @param string $method\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function previewCard(string $cardId, $reception, $method = self::PREVIEW_BY_OPENID)\n    {\n        return $this->previewMessage(new Card($cardId), $reception, $method);\n    }\n\n    /**\n     * @param \\EasyWeChat\\Kernel\\Contracts\\MessageInterface $message\n     * @param string                                        $reception\n     * @param string                                        $method\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function previewMessage(MessageInterface $message, string $reception, $method = self::PREVIEW_BY_OPENID)\n    {\n        $message = (new MessageBuilder())->message($message)->buildForPreview($method, $reception);\n\n        return $this->preview($message);\n    }\n\n    /**\n     * @param \\EasyWeChat\\Kernel\\Contracts\\MessageInterface $message\n     * @param mixed                                         $reception\n     * @param array                                         $attributes\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function sendMessage(MessageInterface $message, $reception = null, $attributes = [])\n    {\n        $message = (new MessageBuilder())->message($message)->with($attributes)->toAll();\n\n        if (\\is_int($reception)) {\n            $message->toTag($reception);\n        } elseif (\\is_array($reception)) {\n            $message->toUsers($reception);\n        }\n\n        return $this->send($message->build());\n    }\n\n    /**\n     * @codeCoverageIgnore\n     *\n     * @param string $method\n     * @param array  $args\n     *\n     * @return mixed\n     */\n    public function __call($method, $args)\n    {\n        if (strpos($method, 'ByName') > 0) {\n            $method = strstr($method, 'ByName', true);\n\n            if (method_exists($this, $method)) {\n                array_push($args, self::PREVIEW_BY_NAME);\n\n                return $this->$method(...$args);\n            }\n        }\n\n        throw new \\BadMethodCallException(sprintf('Method %s not exists.', $method));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Broadcasting/MessageBuilder.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Broadcasting;\n\nuse EasyWeChat\\Kernel\\Contracts\\MessageInterface;\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\n\n/**\n * Class MessageBuilder.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass MessageBuilder\n{\n    /**\n     * @var array\n     */\n    protected $to = [];\n\n    /**\n     * @var \\EasyWeChat\\Kernel\\Contracts\\MessageInterface\n     */\n    protected $message;\n\n    /**\n     * @var array\n     */\n    protected $attributes = [];\n\n    /**\n     * Set message.\n     *\n     * @param \\EasyWeChat\\Kernel\\Contracts\\MessageInterface $message\n     *\n     * @return $this\n     */\n    public function message(MessageInterface $message)\n    {\n        $this->message = $message;\n\n        return $this;\n    }\n\n    /**\n     * Set target user or group.\n     *\n     * @param array $to\n     *\n     * @return $this\n     */\n    public function to(array $to)\n    {\n        $this->to = $to;\n\n        return $this;\n    }\n\n    /**\n     * @param int $tagId\n     *\n     * @return \\EasyWeChat\\OfficialAccount\\Broadcasting\\MessageBuilder\n     */\n    public function toTag(int $tagId)\n    {\n        $this->to([\n            'filter' => [\n                'is_to_all' => false,\n                'tag_id' => $tagId,\n            ],\n        ]);\n\n        return $this;\n    }\n\n    /**\n     * @param array $openids\n     *\n     * @return \\EasyWeChat\\OfficialAccount\\Broadcasting\\MessageBuilder\n     */\n    public function toUsers(array $openids)\n    {\n        $this->to([\n            'touser' => $openids,\n        ]);\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function toAll()\n    {\n        $this->to([\n            'filter' => ['is_to_all' => true],\n        ]);\n\n        return $this;\n    }\n\n    /**\n     * @param array $attributes\n     *\n     * @return \\EasyWeChat\\OfficialAccount\\Broadcasting\\MessageBuilder\n     */\n    public function with(array $attributes)\n    {\n        $this->attributes = $attributes;\n\n        return $this;\n    }\n\n    /**\n     * Build message.\n     *\n     * @param array $prepends\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function build(array $prepends = []): array\n    {\n        if (empty($this->message)) {\n            throw new RuntimeException('No message content to send.');\n        }\n\n        $content = $this->message->transformForJsonRequest();\n\n        if (empty($prepends)) {\n            $prepends = $this->to;\n        }\n\n        $message = array_merge($prepends, $content, $this->attributes);\n\n        return $message;\n    }\n\n    /**\n     * Build preview message.\n     *\n     * @param string $by\n     * @param string $user\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function buildForPreview(string $by, string $user): array\n    {\n        return $this->build([$by => $user]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Broadcasting/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Broadcasting;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['broadcasting'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/BoardingPassClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\n/**\n * Class BoardingPassClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass BoardingPassClient extends Client\n{\n    /**\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function checkin(array $params)\n    {\n        return $this->httpPostJson('card/boardingpass/checkin', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/Card.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class Card.\n *\n * @author overtrue <i@overtrue.me>\n *\n * @property \\EasyWeChat\\OfficialAccount\\Card\\CodeClient          $code\n * @property \\EasyWeChat\\OfficialAccount\\Card\\MeetingTicketClient $meeting_ticket\n * @property \\EasyWeChat\\OfficialAccount\\Card\\MemberCardClient    $member_card\n * @property \\EasyWeChat\\OfficialAccount\\Card\\GeneralCardClient   $general_card\n * @property \\EasyWeChat\\OfficialAccount\\Card\\MovieTicketClient   $movie_ticket\n * @property \\EasyWeChat\\OfficialAccount\\Card\\CoinClient          $coin\n * @property \\EasyWeChat\\OfficialAccount\\Card\\SubMerchantClient   $sub_merchant\n * @property \\EasyWeChat\\OfficialAccount\\Card\\BoardingPassClient  $boarding_pass\n * @property \\EasyWeChat\\OfficialAccount\\Card\\JssdkClient         $jssdk\n * @property \\EasyWeChat\\OfficialAccount\\Card\\GiftCardClient      $gift_card\n * @property \\EasyWeChat\\OfficialAccount\\Card\\GiftCardOrderClient $gift_card_order\n * @property \\EasyWeChat\\OfficialAccount\\Card\\GiftCardPageClient  $gift_card_page\n * @property \\EasyWeChat\\OfficialAccount\\Card\\InvoiceClient       $invoice\n */\nclass Card extends Client\n{\n    /**\n     * @param string $property\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function __get($property)\n    {\n        if (isset($this->app[\"card.{$property}\"])) {\n            return $this->app[\"card.{$property}\"];\n        }\n\n        throw new InvalidArgumentException(sprintf('No card service named \"%s\".', $property));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Traits\\InteractsWithCache;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    use InteractsWithCache;\n\n    /**\n     * @var string\n     */\n    protected $url;\n\n    /**\n     * Ticket cache key.\n     *\n     * @var string\n     */\n    protected $ticketCacheKey;\n\n    /**\n     * Ticket cache prefix.\n     *\n     * @var string\n     */\n    protected $ticketCachePrefix = 'easywechat.official_account.card.api_ticket.';\n\n    /**\n     * 获取卡券颜色.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function colors()\n    {\n        return $this->httpGet('card/getcolors');\n    }\n\n    /**\n     * 卡券开放类目查询接口.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function categories()\n    {\n        return $this->httpGet('card/getapplyprotocol');\n    }\n\n    /**\n     * 创建卡券.\n     *\n     * @param string $cardType\n     * @param array  $attributes\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create($cardType = 'member_card', array $attributes = [])\n    {\n        $params = [\n            'card' => [\n                'card_type' => strtoupper($cardType),\n                strtolower($cardType) => $attributes,\n            ],\n        ];\n\n        return $this->httpPostJson('card/create', $params);\n    }\n\n    /**\n     * 查看卡券详情.\n     *\n     * @param string $cardId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get($cardId)\n    {\n        $params = [\n            'card_id' => $cardId,\n        ];\n\n        return $this->httpPostJson('card/get', $params);\n    }\n\n    /**\n     * 批量查询卡列表.\n     *\n     * @param int    $offset\n     * @param int    $count\n     * @param string $statusList\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list($offset = 0, $count = 10, $statusList = 'CARD_STATUS_VERIFY_OK')\n    {\n        $params = [\n            'offset' => $offset,\n            'count' => $count,\n            'status_list' => $statusList,\n        ];\n\n        return $this->httpPostJson('card/batchget', $params);\n    }\n\n    /**\n     * 更改卡券信息接口 and 设置跟随推荐接口.\n     *\n     * @param string $cardId\n     * @param string $type\n     * @param array  $attributes\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update($cardId, $type, array $attributes = [])\n    {\n        $card = [];\n        $card['card_id'] = $cardId;\n        $card[strtolower($type)] = $attributes;\n\n        return $this->httpPostJson('card/update', $card);\n    }\n\n    /**\n     * 删除卡券接口.\n     *\n     * @param string $cardId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete($cardId)\n    {\n        $params = [\n            'card_id' => $cardId,\n        ];\n\n        return $this->httpPostJson('card/delete', $params);\n    }\n\n    /**\n     * 创建二维码.\n     *\n     * @param array $cards\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createQrCode(array $cards)\n    {\n        return $this->httpPostJson('card/qrcode/create', $cards);\n    }\n\n    /**\n     * ticket 换取二维码图片.\n     *\n     * @param string $ticket\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getQrCode($ticket)\n    {\n        $baseUri = 'https://mp.weixin.qq.com/cgi-bin/showqrcode';\n        $params = [\n            'ticket' => $ticket,\n        ];\n\n        $response = $this->requestRaw($baseUri, 'GET', $params);\n\n        return [\n            'status' => $response->getStatusCode(),\n            'reason' => $response->getReasonPhrase(),\n            'headers' => $response->getHeaders(),\n            'body' => strval($response->getBody()),\n            'url' => $baseUri.'?'.http_build_query($params),\n        ];\n    }\n\n    /**\n     * 通过ticket换取二维码 链接.\n     *\n     * @param string $ticket\n     *\n     * @return string\n     */\n    public function getQrCodeUrl($ticket)\n    {\n        return sprintf('https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s', $ticket);\n    }\n\n    /**\n     * 创建货架接口.\n     *\n     * @param string $banner\n     * @param string $pageTitle\n     * @param bool   $canShare\n     * @param string $scene     [SCENE_NEAR_BY 附近,SCENE_MENU 自定义菜单,SCENE_QRCODE 二维码,SCENE_ARTICLE 公众号文章,\n     *                          SCENE_H5 h5页面,SCENE_IVR 自动回复,SCENE_CARD_CUSTOM_CELL 卡券自定义cell]\n     * @param array  $cardList\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createLandingPage($banner, $pageTitle, $canShare, $scene, $cardList)\n    {\n        $params = [\n            'banner' => $banner,\n            'page_title' => $pageTitle,\n            'can_share' => $canShare,\n            'scene' => $scene,\n            'card_list' => $cardList,\n        ];\n\n        return $this->httpPostJson('card/landingpage/create', $params);\n    }\n\n    /**\n     * 图文消息群发卡券.\n     *\n     * @param string $cardId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getHtml($cardId)\n    {\n        $params = [\n            'card_id' => $cardId,\n        ];\n\n        return $this->httpPostJson('card/mpnews/gethtml', $params);\n    }\n\n    /**\n     * 设置测试白名单.\n     *\n     * @param array $openids\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setTestWhitelist($openids)\n    {\n        $params = [\n            'openid' => $openids,\n        ];\n\n        return $this->httpPostJson('card/testwhitelist/set', $params);\n    }\n\n    /**\n     * 设置测试白名单(by username).\n     *\n     * @param array $usernames\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setTestWhitelistByName(array $usernames)\n    {\n        $params = [\n            'username' => $usernames,\n        ];\n\n        return $this->httpPostJson('card/testwhitelist/set', $params);\n    }\n\n    /**\n     * 获取用户已领取卡券接口.\n     *\n     * @param string $openid\n     * @param string $cardId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUserCards($openid, $cardId = '')\n    {\n        $params = [\n            'openid' => $openid,\n            'card_id' => $cardId,\n        ];\n\n        return $this->httpPostJson('card/user/getcardlist', $params);\n    }\n\n    /**\n     * 设置微信买单接口.\n     * 设置买单的 card_id 必须已经配置了门店，否则会报错.\n     *\n     * @param string $cardId\n     * @param bool   $isOpen\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setPayCell($cardId, $isOpen = true)\n    {\n        $params = [\n            'card_id' => $cardId,\n            'is_open' => $isOpen,\n        ];\n\n        return $this->httpPostJson('card/paycell/set', $params);\n    }\n\n    /**\n     * 设置自助核销接口\n     * 设置买单的 card_id 必须已经配置了门店，否则会报错.\n     *\n     * @param string $cardId\n     * @param bool   $isOpen\n     * @param bool   $verifyCod\n     * @param bool   $remarkAmount\n     *\n     * @return mixed\n     */\n    public function setPayConsumeCell($cardId, $isOpen = true, $verifyCod = false, $remarkAmount = false)\n    {\n        $params = [\n            'card_id' => $cardId,\n            'is_open' => $isOpen,\n            'need_verify_cod' => $verifyCod,\n            'need_remark_amount' => $remarkAmount,\n        ];\n\n        return $this->httpPostJson('card/selfconsumecell/set', $params);\n    }\n\n    /**\n     * 增加库存.\n     *\n     * @param string $cardId\n     * @param int    $amount\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function increaseStock($cardId, $amount)\n    {\n        return $this->updateStock($cardId, $amount, 'increase');\n    }\n\n    /**\n     * 减少库存.\n     *\n     * @param string $cardId\n     * @param int    $amount\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function reduceStock($cardId, $amount)\n    {\n        return $this->updateStock($cardId, $amount, 'reduce');\n    }\n\n    /**\n     * 修改库存接口.\n     *\n     * @param string $cardId\n     * @param int    $amount\n     * @param string $action\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function updateStock($cardId, $amount, $action = 'increase')\n    {\n        $key = 'increase' === $action ? 'increase_stock_value' : 'reduce_stock_value';\n        $params = [\n            'card_id' => $cardId,\n            $key => abs($amount),\n        ];\n\n        return $this->httpPostJson('card/modifystock', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/CodeClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class CodeClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass CodeClient extends BaseClient\n{\n    /**\n     * 导入code接口.\n     *\n     * @param string $cardId\n     * @param array  $codes\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deposit(string $cardId, array $codes)\n    {\n        $params = [\n            'card_id' => $cardId,\n            'code' => $codes,\n        ];\n\n        return $this->httpPostJson('card/code/deposit', $params);\n    }\n\n    /**\n     * 查询导入code数目.\n     *\n     * @param string $cardId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getDepositedCount(string $cardId)\n    {\n        $params = [\n            'card_id' => $cardId,\n        ];\n\n        return $this->httpPostJson('card/code/getdepositcount', $params);\n    }\n\n    /**\n     * 核查code接口.\n     *\n     * @param string $cardId\n     * @param array  $codes\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function check(string $cardId, array $codes)\n    {\n        $params = [\n            'card_id' => $cardId,\n            'code' => $codes,\n        ];\n\n        return $this->httpPostJson('card/code/checkcode', $params);\n    }\n\n    /**\n     * 查询 Code 接口.\n     *\n     * @param string $code\n     * @param string $cardId\n     * @param bool   $checkConsume\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $code, string $cardId = '', bool $checkConsume = true)\n    {\n        $params = [\n            'code' => $code,\n            'check_consume' => $checkConsume,\n            'card_id' => $cardId,\n        ];\n\n        return $this->httpPostJson('card/code/get', $params);\n    }\n\n    /**\n     * 更改Code接口.\n     *\n     * @param string $code\n     * @param string $newCode\n     * @param string $cardId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $code, string $newCode, string $cardId = '')\n    {\n        $params = [\n            'code' => $code,\n            'new_code' => $newCode,\n            'card_id' => $cardId,\n        ];\n\n        return $this->httpPostJson('card/code/update', $params);\n    }\n\n    /**\n     * 设置卡券失效.\n     *\n     * @param string $code\n     * @param string $cardId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function disable(string $code, string $cardId = '')\n    {\n        $params = [\n            'code' => $code,\n            'card_id' => $cardId,\n        ];\n\n        return $this->httpPostJson('card/code/unavailable', $params);\n    }\n\n    /**\n     * 核销 Code 接口.\n     *\n     * @param string      $code\n     * @param string|null $cardId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function consume(string $code, string $cardId = null)\n    {\n        $params = [\n            'code' => $code,\n        ];\n\n        if (!is_null($cardId)) {\n            $params['card_id'] = $cardId;\n        }\n\n        return $this->httpPostJson('card/code/consume', $params);\n    }\n\n    /**\n     * Code解码接口.\n     *\n     * @param string $encryptedCode\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function decrypt(string $encryptedCode)\n    {\n        $params = [\n            'encrypt_code' => $encryptedCode,\n        ];\n\n        return $this->httpPostJson('card/code/decrypt', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/CoinClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class CoinClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass CoinClient extends BaseClient\n{\n    /**\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function activate()\n    {\n        return $this->httpGet('card/pay/activate');\n    }\n\n    /**\n     * @param string $cardId\n     * @param int    $quantity\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getPrice(string $cardId, int $quantity)\n    {\n        return $this->httpPostJson('card/pay/getpayprice', [\n            'card_id' => $cardId,\n            'quantity' => $quantity,\n        ]);\n    }\n\n    /**\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function summary()\n    {\n        return $this->httpGet('card/pay/getcoinsinfo');\n    }\n\n    /**\n     * @param int $count\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function recharge(int $count)\n    {\n        return $this->httpPostJson('card/pay/recharge', [\n            'coin_count' => $count,\n        ]);\n    }\n\n    /**\n     * @param string $orderId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function order(string $orderId)\n    {\n        return $this->httpPostJson('card/pay/getorder', ['order_id' => $orderId]);\n    }\n\n    /**\n     * @param array $filters\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function orders(array $filters)\n    {\n        return $this->httpPostJson('card/pay/getorderlist', $filters);\n    }\n\n    /**\n     * @param string $cardId\n     * @param string $orderId\n     * @param int    $quantity\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function confirm(string $cardId, string $orderId, int $quantity)\n    {\n        return $this->httpPostJson('card/pay/confirm', [\n            'card_id' => $cardId,\n            'order_id' => $orderId,\n            'quantity' => $quantity,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/GeneralCardClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\n/**\n * Class GeneralCardClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass GeneralCardClient extends Client\n{\n    /**\n     * 通用卡接口激活.\n     *\n     * @param array $info\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function activate(array $info = [])\n    {\n        return $this->httpPostJson('card/generalcard/activate', $info);\n    }\n\n    /**\n     * 通用卡撤销激活.\n     *\n     * @param string $cardId\n     * @param string $code\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deactivate(string $cardId, string $code)\n    {\n        $params = [\n            'card_id' => $cardId,\n            'code' => $code,\n        ];\n\n        return $this->httpPostJson('card/generalcard/unactivate', $params);\n    }\n\n    /**\n     * 更新会员信息.\n     *\n     * @param array $params\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateUser(array $params = [])\n    {\n        return $this->httpPostJson('card/generalcard/updateuser', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/GiftCardClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class GiftCardClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass GiftCardClient extends BaseClient\n{\n    /**\n     * 申请微信支付礼品卡权限接口.\n     *\n     * @param string $subMchId\n     *\n     * @return mixed\n     */\n    public function add(string $subMchId)\n    {\n        $params = [\n            'sub_mch_id' => $subMchId,\n        ];\n\n        return $this->httpPostJson('card/giftcard/pay/whitelist/add', $params);\n    }\n\n    /**\n     * 绑定商户号到礼品卡小程序接口(商户号必须为公众号申请的商户号，否则报错).\n     *\n     * @param string $subMchId\n     * @param string $wxaAppid\n     *\n     * @return mixed\n     */\n    public function bind(string $subMchId, string $wxaAppid)\n    {\n        $params = [\n            'sub_mch_id' => $subMchId,\n            'wxa_appid' => $wxaAppid,\n        ];\n\n        return $this->httpPostJson('card/giftcard/pay/submch/bind', $params);\n    }\n\n    /**\n     * 上传小程序代码.\n     *\n     * @param string $wxaAppid\n     * @param string $pageId\n     *\n     * @return mixed\n     */\n    public function set(string $wxaAppid, string $pageId)\n    {\n        $params = [\n            'wxa_appid' => $wxaAppid,\n            'page_id' => $pageId,\n        ];\n\n        return $this->httpPostJson('card/giftcard/wxa/set', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/GiftCardOrderClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class GiftCardOrderClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass GiftCardOrderClient extends BaseClient\n{\n    /**\n     * 查询-单个礼品卡订单信息接口.\n     *\n     * @param string $orderId\n     *\n     * @return mixed\n     */\n    public function get(string $orderId)\n    {\n        $params = [\n            'order_id' => $orderId,\n        ];\n\n        return $this->httpPostJson('card/giftcard/order/get', $params);\n    }\n\n    /**\n     * 查询-批量查询礼品卡订单信息接口.\n     *\n     * @param int    $beginTime\n     * @param int    $endTime\n     * @param int    $offset\n     * @param int    $count\n     * @param string $sortType\n     *\n     * @return mixed\n     */\n    public function list(int $beginTime, int $endTime, int $offset = 0, int $count = 10, string $sortType = 'ASC')\n    {\n        $params = [\n            'begin_time' => $beginTime,\n            'end_time' => $endTime,\n            'sort_type' => $sortType,\n            'offset' => $offset,\n            'count' => $count,\n        ];\n\n        return $this->httpPostJson('card/giftcard/order/batchget', $params);\n    }\n\n    /**\n     * 退款接口.\n     *\n     * @param string $orderId\n     *\n     * @return mixed\n     */\n    public function refund(string $orderId)\n    {\n        $params = [\n            'order_id' => $orderId,\n        ];\n\n        return $this->httpPostJson('card/giftcard/order/refund', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/GiftCardPageClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class GiftCardPageClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass GiftCardPageClient extends BaseClient\n{\n    /**\n     * 创建-礼品卡货架接口.\n     *\n     * @param array $attributes\n     *\n     * @return mixed\n     */\n    public function add(array $attributes)\n    {\n        $params = [\n            'page' => $attributes,\n        ];\n\n        return $this->httpPostJson('card/giftcard/page/add', $params);\n    }\n\n    /**\n     * 查询-礼品卡货架信息接口.\n     *\n     * @param string $pageId\n     *\n     * @return mixed\n     */\n    public function get(string $pageId)\n    {\n        $params = [\n            'page_id' => $pageId,\n        ];\n\n        return $this->httpPostJson('card/giftcard/page/get', $params);\n    }\n\n    /**\n     * 修改-礼品卡货架信息接口.\n     *\n     * @param string $pageId\n     * @param string $bannerPicUrl\n     * @param array  $themeList\n     *\n     * @return mixed\n     */\n    public function update(string $pageId, string $bannerPicUrl, array $themeList)\n    {\n        $params = [\n            'page' => [\n                'page_id' => $pageId,\n                'banner_pic_url' => $bannerPicUrl,\n                'theme_list' => $themeList,\n            ],\n        ];\n\n        return $this->httpPostJson('card/giftcard/page/update', $params);\n    }\n\n    /**\n     * 查询-礼品卡货架列表接口.\n     *\n     * @return mixed\n     */\n    public function list()\n    {\n        return $this->httpPostJson('card/giftcard/page/batchget');\n    }\n\n    /**\n     * 下架-礼品卡货架接口(下架某一个货架或者全部货架).\n     *\n     * @param string $pageId\n     *\n     * @return mixed\n     */\n    public function setMaintain(string $pageId = '')\n    {\n        $params = ($pageId ? ['page_id' => $pageId] : ['all' => true]) + [\n                'maintain' => true,\n            ];\n\n        return $this->httpPostJson('card/giftcard/maintain/set', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/InvoiceClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class InvoiceClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass InvoiceClient extends BaseClient\n{\n    /**\n     * 设置支付后开票信息接口.\n     *\n     * @param string $mchid\n     * @param string $sPappid\n     *\n     * @return mixed\n     */\n    public function set(string $mchid, string $sPappid)\n    {\n        $params = [\n            'paymch_info' => [\n                'mchid' => $mchid,\n                's_pappid' => $sPappid,\n            ],\n        ];\n\n        return $this->setBizAttr('set_pay_mch', $params);\n    }\n\n    /**\n     * 查询支付后开票信息接口.\n     *\n     * @return mixed\n     */\n    public function get()\n    {\n        return $this->setBizAttr('get_pay_mch');\n    }\n\n    /**\n     * 设置授权页字段信息接口.\n     *\n     * @param array $userData\n     * @param array $bizData\n     *\n     * @return mixed\n     */\n    public function setAuthField(array $userData, array $bizData)\n    {\n        $params = [\n            'auth_field' => [\n                'user_field' => $userData,\n                'biz_field' => $bizData,\n            ],\n        ];\n\n        return $this->setBizAttr('set_auth_field', $params);\n    }\n\n    /**\n     * 查询授权页字段信息接口.\n     *\n     * @return mixed\n     */\n    public function getAuthField()\n    {\n        return $this->setBizAttr('get_auth_field');\n    }\n\n    /**\n     * 查询开票信息.\n     *\n     * @param string $orderId\n     * @param string $appId\n     *\n     * @return mixed\n     */\n    public function getAuthData(string $appId, string $orderId)\n    {\n        $params = [\n            'order_id' => $orderId,\n            's_appid' => $appId,\n        ];\n\n        return $this->httpPost('card/invoice/getauthdata', $params);\n    }\n\n    /**\n     * 创建卡券发票模板\n     *\n     * @param string $orderId\n     * @param string $appId\n     *\n     * @return mixed\n     */\n    public function createCard(array $params)\n    {\n        return $this->httpPostJson('/card/invoice/platform/createcard', $params);\n    }\n\n    /**\n     * 电子发票卡券插入用户卡包\n     *\n     * @param string $orderId\n     * @param string $appId\n     *\n     * @return mixed\n     */\n    public function insert(array $params)\n    {\n        return $this->httpPostJson('/card/invoice/insert', $params);\n    }\n\n    /**\n     * 更新发票卡券状态\n     *\n     * @param string $orderId\n     * @param string $appId\n     *\n     * @return mixed\n     */\n    public function updatestatus(array $params)\n    {\n        return $this->httpPostJson('/card/invoice/platform/updatestatus', $params);\n    }\n\n    /**\n     * 设置授权页字段信息接口.\n     *\n     * @param array $userData\n     * @param array $bizData\n     *\n     * @return mixed\n     */\n    public function setContact(array $params)\n    {\n        return $this->setBizAttr('set_contact', $params);\n    }\n\n    /**\n     * 获取授权页链接\n     *\n     * @param string $orderId\n     * @param string $appId\n     *\n     * @return mixed\n     */\n    public function getauthurl(array $params)\n    {\n        return $this->httpPostJson('/card/invoice/getauthurl', $params);\n    }\n\n    /**\n     * 创建卡券发票模板\n     *\n     * @param string $orderId\n     * @param string $appId\n     *\n     * @return mixed\n     */\n    public function setUrl()\n    {\n        return $this->httpPostJson('/card/invoice/seturl', []);\n    }\n\n    /**\n     * @param string $action\n     * @param array  $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    private function setBizAttr(string $action, array $params = [])\n    {\n        return $this->httpPostJson('card/invoice/setbizattr', $params, ['action' => $action]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/JssdkClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\nuse EasyWeChat\\BasicService\\Jssdk\\Client as Jssdk;\nuse EasyWeChat\\Kernel\\Support\\Arr;\nuse function EasyWeChat\\Kernel\\Support\\str_random;\n\n/**\n * Class Jssdk.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass JssdkClient extends Jssdk\n{\n    /**\n     * @param bool   $refresh\n     * @param string $type\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function getTicket(bool $refresh = false, string $type = 'wx_card'): array\n    {\n        return parent::getTicket($refresh, $type);\n    }\n\n    /**\n     * 微信卡券：JSAPI 卡券发放.\n     *\n     * @param array $cards\n     *\n     * @return string\n     */\n    public function assign(array $cards)\n    {\n        return json_encode(array_map(function ($card) {\n            return $this->attachExtension($card['card_id'], $card);\n        }, $cards));\n    }\n\n    /**\n     * 生成 js添加到卡包 需要的 card_list 项.\n     *\n     * @param string $cardId\n     * @param array  $extension\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function attachExtension($cardId, array $extension = [])\n    {\n        $timestamp = time();\n        $nonce = str_random(6);\n        $ticket = $this->getTicket()['ticket'];\n\n        $ext = array_merge(['timestamp' => $timestamp, 'nonce_str' => $nonce], Arr::only(\n            $extension,\n            ['code', 'openid', 'outer_id', 'balance', 'fixed_begintimestamp', 'outer_str']\n        ));\n\n        $ext['signature'] = $this->dictionaryOrderSignature($ticket, $timestamp, $cardId, $ext['code'] ?? '', $ext['openid'] ?? '', $nonce);\n\n        return [\n            'cardId' => $cardId,\n            'cardExt' => json_encode($ext),\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/MeetingTicketClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\n/**\n * Class MeetingTicketClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass MeetingTicketClient extends Client\n{\n    /**\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateUser(array $params)\n    {\n        return $this->httpPostJson('card/meetingticket/updateuser', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/MemberCardClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\n/**\n * Class MemberCardClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass MemberCardClient extends Client\n{\n    /**\n     * 会员卡接口激活.\n     *\n     * @param array $info\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function activate(array $info = [])\n    {\n        return $this->httpPostJson('card/membercard/activate', $info);\n    }\n\n    /**\n     * 设置开卡字段接口.\n     *\n     * @param string $cardId\n     * @param array  $settings\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setActivationForm(string $cardId, array $settings)\n    {\n        $params = array_merge(['card_id' => $cardId], $settings);\n\n        return $this->httpPostJson('card/membercard/activateuserform/set', $params);\n    }\n\n    /**\n     * 拉取会员信息接口.\n     *\n     * @param string $cardId\n     * @param string $code\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUser(string $cardId, string $code)\n    {\n        $params = [\n            'card_id' => $cardId,\n            'code' => $code,\n        ];\n\n        return $this->httpPostJson('card/membercard/userinfo/get', $params);\n    }\n\n    /**\n     * 更新会员信息.\n     *\n     * @param array $params\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateUser(array $params = [])\n    {\n        return $this->httpPostJson('card/membercard/updateuser', $params);\n    }\n\n    /**\n     * 获取用户提交资料.\n     *\n     * @param string $activateTicket\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getActivationForm($activateTicket)\n    {\n        $params = [\n            'activate_ticket' => $activateTicket,\n        ];\n\n        return $this->httpPostJson('card/membercard/activatetempinfo/get', $params);\n    }\n\n    /**\n     * 获取开卡组件链接接口.\n     *\n     * @param array $params 包含会员卡ID和随机字符串\n     *\n     * @return string 开卡组件链接\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getActivateUrl(array $params = [])\n    {\n        return $this->httpPostJson('card/membercard/activate/geturl', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/MovieTicketClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\n/**\n * Class MovieTicketClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass MovieTicketClient extends Client\n{\n    /**\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateUser(array $params)\n    {\n        return $this->httpPostJson('card/movieticket/updateuser', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['card'] = function ($app) {\n            return new Card($app);\n        };\n\n        $app['card.client'] = function ($app) {\n            return new Client($app);\n        };\n\n        $app['card.coin'] = function ($app) {\n            return new CoinClient($app);\n        };\n\n        $app['card.sub_merchant'] = function ($app) {\n            return new SubMerchantClient($app);\n        };\n\n        $app['card.code'] = function ($app) {\n            return new CodeClient($app);\n        };\n\n        $app['card.movie_ticket'] = function ($app) {\n            return new MovieTicketClient($app);\n        };\n\n        $app['card.member_card'] = function ($app) {\n            return new MemberCardClient($app);\n        };\n\n        $app['card.general_card'] = function ($app) {\n            return new GeneralCardClient($app);\n        };\n\n        $app['card.boarding_pass'] = function ($app) {\n            return new BoardingPassClient($app);\n        };\n\n        $app['card.meeting_ticket'] = function ($app) {\n            return new MeetingTicketClient($app);\n        };\n\n        $app['card.jssdk'] = function ($app) {\n            return new JssdkClient($app);\n        };\n\n        $app['card.gift_card'] = function ($app) {\n            return new GiftCardClient($app);\n        };\n\n        $app['card.gift_card_order'] = function ($app) {\n            return new GiftCardOrderClient($app);\n        };\n\n        $app['card.gift_card_page'] = function ($app) {\n            return new GiftCardPageClient($app);\n        };\n\n        $app['card.invoice'] = function ($app) {\n            return new InvoiceClient($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/SubMerchantClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Card;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Support\\Arr;\n\n/**\n * Class SubMerchantClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass SubMerchantClient extends BaseClient\n{\n    /**\n     * 添加子商户.\n     *\n     * @param array $info\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $info = [])\n    {\n        $params = [\n            'info' => Arr::only($info, [\n                'brand_name',\n                'logo_url',\n                'protocol',\n                'end_time',\n                'primary_category_id',\n                'secondary_category_id',\n                'agreement_media_id',\n                'operator_media_id',\n                'app_id',\n            ]),\n        ];\n\n        return $this->httpPostJson('card/submerchant/submit', $params);\n    }\n\n    /**\n     * 更新子商户.\n     *\n     * @param int   $merchantId\n     * @param array $info\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(int $merchantId, array $info = [])\n    {\n        $params = [\n            'info' => array_merge(\n                ['merchant_id' => $merchantId],\n                Arr::only($info, [\n                    'brand_name',\n                    'logo_url',\n                    'protocol',\n                    'end_time',\n                    'primary_category_id',\n                    'secondary_category_id',\n                    'agreement_media_id',\n                    'operator_media_id',\n                    'app_id',\n                ])\n            ),\n        ];\n\n        return $this->httpPostJson('card/submerchant/update', $params);\n    }\n\n    /**\n     * 获取子商户信息.\n     *\n     * @param int $merchantId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(int $merchantId)\n    {\n        return $this->httpPostJson('card/submerchant/get', ['merchant_id' => $merchantId]);\n    }\n\n    /**\n     * 批量获取子商户信息.\n     *\n     * @param int    $beginId\n     * @param int    $limit\n     * @param string $status\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(int $beginId = 0, int $limit = 50, string $status = 'CHECKING')\n    {\n        $params = [\n            'begin_id' => $beginId,\n            'limit' => $limit,\n            'status' => $status,\n        ];\n\n        return $this->httpPostJson('card/submerchant/batchget', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Comment/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Comment;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Open article comment.\n     *\n     * @param string   $msgId\n     * @param int|null $index\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function open(string $msgId, int $index = null)\n    {\n        $params = [\n            'msg_data_id' => $msgId,\n            'index' => $index,\n        ];\n\n        return $this->httpPostJson('cgi-bin/comment/open', $params);\n    }\n\n    /**\n     * Close comment.\n     *\n     * @param string   $msgId\n     * @param int|null $index\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function close(string $msgId, int $index = null)\n    {\n        $params = [\n            'msg_data_id' => $msgId,\n            'index' => $index,\n        ];\n\n        return $this->httpPostJson('cgi-bin/comment/close', $params);\n    }\n\n    /**\n     * Get article comments.\n     *\n     * @param string $msgId\n     * @param int    $index\n     * @param int    $begin\n     * @param int    $count\n     * @param int    $type\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(string $msgId, int $index, int $begin, int $count, int $type = 0)\n    {\n        $params = [\n            'msg_data_id' => $msgId,\n            'index' => $index,\n            'begin' => $begin,\n            'count' => $count,\n            'type' => $type,\n        ];\n\n        return $this->httpPostJson('cgi-bin/comment/list', $params);\n    }\n\n    /**\n     * Mark elect comment.\n     *\n     * @param string $msgId\n     * @param int    $index\n     * @param int    $commentId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function markElect(string $msgId, int $index, int $commentId)\n    {\n        $params = [\n            'msg_data_id' => $msgId,\n            'index' => $index,\n            'user_comment_id' => $commentId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/comment/markelect', $params);\n    }\n\n    /**\n     * Unmark elect comment.\n     *\n     * @param string $msgId\n     * @param int    $index\n     * @param int    $commentId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function unmarkElect(string $msgId, int $index, int $commentId)\n    {\n        $params = [\n            'msg_data_id' => $msgId,\n            'index' => $index,\n            'user_comment_id' => $commentId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/comment/unmarkelect', $params);\n    }\n\n    /**\n     * Delete comment.\n     *\n     * @param string $msgId\n     * @param int    $index\n     * @param int    $commentId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $msgId, int $index, int $commentId)\n    {\n        $params = [\n            'msg_data_id' => $msgId,\n            'index' => $index,\n            'user_comment_id' => $commentId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/comment/delete', $params);\n    }\n\n    /**\n     * Reply to a comment.\n     *\n     * @param string $msgId\n     * @param int    $index\n     * @param int    $commentId\n     * @param string $content\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function reply(string $msgId, int $index, int $commentId, string $content)\n    {\n        $params = [\n            'msg_data_id' => $msgId,\n            'index' => $index,\n            'user_comment_id' => $commentId,\n            'content' => $content,\n        ];\n\n        return $this->httpPostJson('cgi-bin/comment/reply/add', $params);\n    }\n\n    /**\n     * Delete a reply.\n     *\n     * @param string $msgId\n     * @param int    $index\n     * @param int    $commentId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deleteReply(string $msgId, int $index, int $commentId)\n    {\n        $params = [\n            'msg_data_id' => $msgId,\n            'index' => $index,\n            'user_comment_id' => $commentId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/comment/reply/delete', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Comment/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\n/**\n * ServiceProvider.php.\n *\n * This file is part of the wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Comment;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['comment'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/CustomerService/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\CustomerService;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * List all staffs.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function list()\n    {\n        return $this->httpGet('cgi-bin/customservice/getkflist');\n    }\n\n    /**\n     * List all online staffs.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function online()\n    {\n        return $this->httpGet('cgi-bin/customservice/getonlinekflist');\n    }\n\n    /**\n     * Create a staff.\n     *\n     * @param string $account\n     * @param string $nickname\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(string $account, string $nickname)\n    {\n        $params = [\n            'kf_account' => $account,\n            'nickname' => $nickname,\n        ];\n\n        return $this->httpPostJson('customservice/kfaccount/add', $params);\n    }\n\n    /**\n     * Update a staff.\n     *\n     * @param string $account\n     * @param string $nickname\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $account, string $nickname)\n    {\n        $params = [\n            'kf_account' => $account,\n            'nickname' => $nickname,\n        ];\n\n        return $this->httpPostJson('customservice/kfaccount/update', $params);\n    }\n\n    /**\n     * Delete a staff.\n     *\n     * @param string $account\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $account)\n    {\n        return $this->httpPostJson('customservice/kfaccount/del', [], ['kf_account' => $account]);\n    }\n\n    /**\n     * Invite a staff.\n     *\n     * @param string $account\n     * @param string $wechatId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function invite(string $account, string $wechatId)\n    {\n        $params = [\n            'kf_account' => $account,\n            'invite_wx' => $wechatId,\n        ];\n\n        return $this->httpPostJson('customservice/kfaccount/inviteworker', $params);\n    }\n\n    /**\n     * Set staff avatar.\n     *\n     * @param string $account\n     * @param string $path\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setAvatar(string $account, string $path)\n    {\n        return $this->httpUpload('customservice/kfaccount/uploadheadimg', ['media' => $path], [], ['kf_account' => $account]);\n    }\n\n    /**\n     * Get message builder.\n     *\n     * @param \\EasyWeChat\\Kernel\\Messages\\Message|string $message\n     *\n     * @return \\EasyWeChat\\OfficialAccount\\CustomerService\\Messenger\n     */\n    public function message($message)\n    {\n        $messageBuilder = new Messenger($this);\n\n        return $messageBuilder->message($message);\n    }\n\n    /**\n     * Send a message.\n     *\n     * @param array $message\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(array $message)\n    {\n        return $this->httpPostJson('cgi-bin/message/custom/send', $message);\n    }\n\n    /**\n     * Show typing status.\n     *\n     * @param string $openid\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function showTypingStatusToUser(string $openid)\n    {\n        return $this->httpPostJson('cgi-bin/message/custom/typing', [\n            'touser' => $openid,\n            'command' => 'Typing',\n        ]);\n    }\n\n    /**\n     * Hide typing status.\n     *\n     * @param string $openid\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function hideTypingStatusToUser(string $openid)\n    {\n        return $this->httpPostJson('cgi-bin/message/custom/typing', [\n            'touser' => $openid,\n            'command' => 'CancelTyping',\n        ]);\n    }\n\n    /**\n     * Get messages history.\n     *\n     * @param int $startTime\n     * @param int $endTime\n     * @param int $msgId\n     * @param int $number\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function messages($startTime, $endTime, int $msgId = 1, int $number = 10000)\n    {\n        $params = [\n            'starttime' => is_numeric($startTime) ? $startTime : strtotime($startTime),\n            'endtime' => is_numeric($endTime) ? $endTime : strtotime($endTime),\n            'msgid' => $msgId,\n            'number' => $number,\n        ];\n\n        return $this->httpPostJson('customservice/msgrecord/getmsglist', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/CustomerService/Messenger.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\CustomerService;\n\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Messages\\Message;\nuse EasyWeChat\\Kernel\\Messages\\Raw as RawMessage;\nuse EasyWeChat\\Kernel\\Messages\\Text;\n\n/**\n * Class MessageBuilder.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Messenger\n{\n    /**\n     * Messages to send.\n     *\n     * @var \\EasyWeChat\\Kernel\\Messages\\Message;\n     */\n    protected $message;\n\n    /**\n     * Messages target user open id.\n     *\n     * @var string\n     */\n    protected $to;\n\n    /**\n     * Messages sender staff id.\n     *\n     * @var string\n     */\n    protected $account;\n\n    /**\n     * Customer service instance.\n     *\n     * @var \\EasyWeChat\\OfficialAccount\\CustomerService\\Client\n     */\n    protected $client;\n\n    /**\n     * MessageBuilder constructor.\n     *\n     * @param \\EasyWeChat\\OfficialAccount\\CustomerService\\Client $client\n     */\n    public function __construct(Client $client)\n    {\n        $this->client = $client;\n    }\n\n    /**\n     * Set message to send.\n     *\n     * @param string|Message $message\n     *\n     * @return Messenger\n     */\n    public function message($message)\n    {\n        if (is_string($message)) {\n            $message = new Text($message);\n        }\n\n        $this->message = $message;\n\n        return $this;\n    }\n\n    /**\n     * Set staff account to send message.\n     *\n     * @param string $account\n     *\n     * @return Messenger\n     */\n    public function by(string $account)\n    {\n        $this->account = $account;\n\n        return $this;\n    }\n\n    /**\n     * @param string $account\n     *\n     * @return Messenger\n     */\n    public function from(string $account)\n    {\n        return $this->by($account);\n    }\n\n    /**\n     * Set target user open id.\n     *\n     * @param string $openid\n     *\n     * @return Messenger\n     */\n    public function to($openid)\n    {\n        $this->to = $openid;\n\n        return $this;\n    }\n\n    /**\n     * Send the message.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function send()\n    {\n        if (empty($this->message)) {\n            throw new RuntimeException('No message to send.');\n        }\n\n        if ($this->message instanceof RawMessage) {\n            $message = json_decode($this->message->get('content'), true);\n        } else {\n            $prepends = [\n                'touser' => $this->to,\n            ];\n            if ($this->account) {\n                $prepends['customservice'] = ['kf_account' => $this->account];\n            }\n            $message = $this->message->transformForJsonRequest($prepends);\n        }\n\n        return $this->client->send($message);\n    }\n\n    /**\n     * Return property.\n     *\n     * @param string $property\n     *\n     * @return mixed\n     */\n    public function __get(string $property)\n    {\n        if (property_exists($this, $property)) {\n            return $this->$property;\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/CustomerService/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\CustomerService;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['customer_service'] = function ($app) {\n            return new Client($app);\n        };\n\n        $app['customer_service_session'] = function ($app) {\n            return new SessionClient($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/CustomerService/SessionClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\CustomerService;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class SessionClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass SessionClient extends BaseClient\n{\n    /**\n     * List all sessions of $account.\n     *\n     * @param string $account\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function list(string $account)\n    {\n        return $this->httpGet('customservice/kfsession/getsessionlist', ['kf_account' => $account]);\n    }\n\n    /**\n     * List all the people waiting.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function waiting()\n    {\n        return $this->httpGet('customservice/kfsession/getwaitcase');\n    }\n\n    /**\n     * Create a session.\n     *\n     * @param string $account\n     * @param string $openid\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(string $account, string $openid)\n    {\n        $params = [\n            'kf_account' => $account,\n            'openid' => $openid,\n        ];\n\n        return $this->httpPostJson('customservice/kfsession/create', $params);\n    }\n\n    /**\n     * Close a session.\n     *\n     * @param string $account\n     * @param string $openid\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function close(string $account, string $openid)\n    {\n        $params = [\n            'kf_account' => $account,\n            'openid' => $openid,\n        ];\n\n        return $this->httpPostJson('customservice/kfsession/close', $params);\n    }\n\n    /**\n     * Get a session.\n     *\n     * @param string $openid\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function get(string $openid)\n    {\n        return $this->httpGet('customservice/kfsession/getsession', ['openid' => $openid]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/DataCube/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\DataCube;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取用户增减数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function userSummary(string $from, string $to)\n    {\n        return $this->query('datacube/getusersummary', $from, $to);\n    }\n\n    /**\n     * 获取累计用户数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function userCumulate(string $from, string $to)\n    {\n        return $this->query('datacube/getusercumulate', $from, $to);\n    }\n\n    /**\n     * 获取图文群发每日数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function articleSummary(string $from, string $to)\n    {\n        return $this->query('datacube/getarticlesummary', $from, $to);\n    }\n\n    /**\n     * 获取图文群发总数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function articleTotal(string $from, string $to)\n    {\n        return $this->query('datacube/getarticletotal', $from, $to);\n    }\n\n    /**\n     * 获取图文统计数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function userReadSummary(string $from, string $to)\n    {\n        return $this->query('datacube/getuserread', $from, $to);\n    }\n\n    /**\n     * 获取图文统计分时数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function userReadHourly(string $from, string $to)\n    {\n        return $this->query('datacube/getuserreadhour', $from, $to);\n    }\n\n    /**\n     * 获取图文分享转发数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function userShareSummary(string $from, string $to)\n    {\n        return $this->query('datacube/getusershare', $from, $to);\n    }\n\n    /**\n     * 获取图文分享转发分时数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function userShareHourly(string $from, string $to)\n    {\n        return $this->query('datacube/getusersharehour', $from, $to);\n    }\n\n    /**\n     * 获取消息发送概况数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function upstreamMessageSummary(string $from, string $to)\n    {\n        return $this->query('datacube/getupstreammsg', $from, $to);\n    }\n\n    /**\n     * 获取消息分送分时数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function upstreamMessageHourly(string $from, string $to)\n    {\n        return $this->query('datacube/getupstreammsghour', $from, $to);\n    }\n\n    /**\n     * 获取消息发送周数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function upstreamMessageWeekly(string $from, string $to)\n    {\n        return $this->query('datacube/getupstreammsgweek', $from, $to);\n    }\n\n    /**\n     * 获取消息发送月数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function upstreamMessageMonthly(string $from, string $to)\n    {\n        return $this->query('datacube/getupstreammsgmonth', $from, $to);\n    }\n\n    /**\n     * 获取消息发送分布数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function upstreamMessageDistSummary(string $from, string $to)\n    {\n        return $this->query('datacube/getupstreammsgdist', $from, $to);\n    }\n\n    /**\n     * 获取消息发送分布周数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function upstreamMessageDistWeekly(string $from, string $to)\n    {\n        return $this->query('datacube/getupstreammsgdistweek', $from, $to);\n    }\n\n    /**\n     * 获取消息发送分布月数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function upstreamMessageDistMonthly(string $from, string $to)\n    {\n        return $this->query('datacube/getupstreammsgdistmonth', $from, $to);\n    }\n\n    /**\n     * 获取接口分析数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function interfaceSummary(string $from, string $to)\n    {\n        return $this->query('datacube/getinterfacesummary', $from, $to);\n    }\n\n    /**\n     * 获取接口分析分时数据.\n     *\n     * @param string $from\n     * @param string $to\n     *\n     * @return mixed\n     */\n    public function interfaceSummaryHourly(string $from, string $to)\n    {\n        return $this->query('datacube/getinterfacesummaryhour', $from, $to);\n    }\n\n    /**\n     * 拉取卡券概况数据接口.\n     *\n     * @param string $from\n     * @param string $to\n     * @param int    $condSource\n     *\n     * @return mixed\n     */\n    public function cardSummary(string $from, string $to, $condSource = 0)\n    {\n        $ext = [\n            'cond_source' => intval($condSource),\n        ];\n\n        return $this->query('datacube/getcardbizuininfo', $from, $to, $ext);\n    }\n\n    /**\n     * 获取免费券数据接口.\n     *\n     * @param string $from\n     * @param string $to\n     * @param int    $condSource\n     * @param string $cardId\n     *\n     * @return mixed\n     */\n    public function freeCardSummary(string $from, string $to, int $condSource = 0, string $cardId = '')\n    {\n        $ext = [\n            'cond_source' => intval($condSource),\n            'card_id' => $cardId,\n        ];\n\n        return $this->query('datacube/getcardcardinfo', $from, $to, $ext);\n    }\n\n    /**\n     * 拉取会员卡数据接口.\n     *\n     * @param string $from\n     * @param string $to\n     * @param int    $condSource\n     *\n     * @return mixed\n     */\n    public function memberCardSummary(string $from, string $to, $condSource = 0)\n    {\n        $ext = [\n            'cond_source' => intval($condSource),\n        ];\n\n        return $this->query('datacube/getcardmembercardinfo', $from, $to, $ext);\n    }\n\n    /**\n     * 拉取单张会员卡数据接口.\n     *\n     * @param string $from\n     * @param string $to\n     * @param string $cardId\n     *\n     * @return mixed\n     */\n    public function memberCardSummaryById(string $from, string $to, string $cardId)\n    {\n        $ext = [\n            'card_id' => $cardId,\n        ];\n\n        return $this->query('datacube/getcardmembercarddetail', $from, $to, $ext);\n    }\n\n    /**\n     * 查询数据.\n     *\n     * @param string $api\n     * @param string $from\n     * @param string $to\n     * @param array  $ext\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function query(string $api, string $from, string $to, array $ext = [])\n    {\n        $params = array_merge([\n            'begin_date' => $from,\n            'end_date' => $to,\n        ], $ext);\n\n        return $this->httpPostJson($api, $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/DataCube/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\DataCube;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['data_cube'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Device/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Device;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @see http://iot.weixin.qq.com/wiki/new/index.html\n *\n * @author soone <66812590@qq.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @param string $deviceId\n     * @param string $openid\n     * @param string $content\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function message(string $deviceId, string $openid, string $content)\n    {\n        $params = [\n            'device_type' => $this->app['config']['device_type'],\n            'device_id' => $deviceId,\n            'open_id' => $openid,\n            'content' => base64_encode($content),\n        ];\n\n        return $this->httpPostJson('device/transmsg', $params);\n    }\n\n    /**\n     * Get device qrcode.\n     *\n     * @param array $deviceIds\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function qrCode(array $deviceIds)\n    {\n        $params = [\n            'device_num' => count($deviceIds),\n            'device_id_list' => $deviceIds,\n        ];\n\n        return $this->httpPostJson('device/create_qrcode', $params);\n    }\n\n    /**\n     * @param array  $devices\n     * @param string $productId\n     * @param int    $opType\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function authorize(array $devices, string $productId, int $opType = 0)\n    {\n        $params = [\n            'device_num' => count($devices),\n            'device_list' => $devices,\n            'op_type' => $opType,\n            'product_id' => $productId,\n        ];\n\n        return $this->httpPostJson('device/authorize_device', $params);\n    }\n\n    /**\n     * 获取 device id 和二维码\n     *\n     * @param string $productId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function createId(string $productId)\n    {\n        $params = [\n            'product_id' => $productId,\n        ];\n\n        return $this->httpGet('device/getqrcode', $params);\n    }\n\n    /**\n     * @param string $openid\n     * @param string $deviceId\n     * @param string $ticket\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function bind(string $openid, string $deviceId, string $ticket)\n    {\n        $params = [\n            'ticket' => $ticket,\n            'device_id' => $deviceId,\n            'openid' => $openid,\n        ];\n\n        return $this->httpPostJson('device/bind', $params);\n    }\n\n    /**\n     * @param string $openid\n     * @param string $deviceId\n     * @param string $ticket\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function unbind(string $openid, string $deviceId, string $ticket)\n    {\n        $params = [\n            'ticket' => $ticket,\n            'device_id' => $deviceId,\n            'openid' => $openid,\n        ];\n\n        return $this->httpPostJson('device/unbind', $params);\n    }\n\n    /**\n     * @param string $openid\n     * @param string $deviceId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function forceBind(string $openid, string $deviceId)\n    {\n        $params = [\n            'device_id' => $deviceId,\n            'openid' => $openid,\n        ];\n\n        return $this->httpPostJson('device/compel_bind', $params);\n    }\n\n    /**\n     * @param string $openid\n     * @param string $deviceId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function forceUnbind(string $openid, string $deviceId)\n    {\n        $params = [\n            'device_id' => $deviceId,\n            'openid' => $openid,\n        ];\n\n        return $this->httpPostJson('device/compel_unbind', $params);\n    }\n\n    /**\n     * @param string $deviceId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function status(string $deviceId)\n    {\n        $params = [\n            'device_id' => $deviceId,\n        ];\n\n        return $this->httpGet('device/get_stat', $params);\n    }\n\n    /**\n     * @param string $ticket\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function verify(string $ticket)\n    {\n        $params = [\n            'ticket' => $ticket,\n        ];\n\n        return $this->httpPost('device/verify_qrcode', $params);\n    }\n\n    /**\n     * @param string $deviceId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function openid(string $deviceId)\n    {\n        $params = [\n            'device_type' => $this->app['config']['device_type'],\n            'device_id' => $deviceId,\n        ];\n\n        return $this->httpGet('device/get_openid', $params);\n    }\n\n    /**\n     * @param string $openid\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function listByOpenid(string $openid)\n    {\n        $params = [\n            'openid' => $openid,\n        ];\n\n        return $this->httpGet('device/get_bind_device', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Device/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Device;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author soone <66812590@qq.com\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['device'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Draft/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Draft;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Messages\\Article;\n\n/**\n * Class Client.\n *\n * @author wangdongzhao <elim051@163.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Add new articles to the draft.\n     * @param array $articles\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(array $articles)\n    {\n        return $this->httpPostJson('cgi-bin/draft/add', $articles);\n    }\n\n    /**\n     * Get article from the draft.\n     * @param string $mediaId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $mediaId)\n    {\n        return $this->httpPostJson('cgi-bin/draft/get', ['media_id' => $mediaId]);\n    }\n\n    /**\n     * Update article\n     * @param string $mediaId\n     * @param int $index\n     * @param mixed $article\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $mediaId, int $index, $article)\n    {\n        $params = [\n            'media_id' => $mediaId,\n            'index' => $index,\n            'articles' => $article\n        ];\n        return $this->httpPostJson('cgi-bin/draft/update', $params);\n    }\n\n    /**\n     * Get draft total count\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function count()\n    {\n        return $this->httpPostJson('cgi-bin/draft/count');\n    }\n\n    /**\n     * Batch get articles from the draft.\n     * @param int $offset\n     * @param int $count\n     * @param int $noContent\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function batchGet(int $offset = 0, int $count = 20, int $noContent = 0)\n    {\n        $params = [\n            'offset' => $offset,\n            'count' => $count,\n            'no_content' => $noContent\n        ];\n        return $this->httpPostJson('cgi-bin/draft/batchget', $params);\n    }\n\n    /**\n     * Delete article.\n     * @param string $mediaId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $mediaId)\n    {\n        return $this->httpPostJson('cgi-bin/draft/delete', ['media_id' => $mediaId]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Draft/ServiceProvider.php",
    "content": "<?php\n\n/**\n * ServiceProvider.php.\n *\n * This file is part of the wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Draft;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author wangdongzhao <elim051@163.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['draft'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/FreePublish/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\FreePublish;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Messages\\Article;\n\n/**\n * Class Client.\n *\n * @author wangdongzhao <elim051@163.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get publish status.\n     * @param string $publishId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $publishId)\n    {\n        return $this->httpPostJson('cgi-bin/freepublish/get', ['publish_id' => $publishId]);\n    }\n\n    /**\n     * Submit article.\n     * @param string $mediaId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function submit(string $mediaId)\n    {\n        return $this->httpPostJson('cgi-bin/freepublish/submit', ['media_id' => $mediaId]);\n    }\n\n    /**\n     * Get article.\n     * @param string $articleId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getArticle(string $articleId)\n    {\n        return $this->httpPostJson('cgi-bin/freepublish/getarticle', ['article_id' => $articleId]);\n    }\n\n    /**\n     * Batch get articles.\n     * @param int $offset\n     * @param int $count\n     * @param int $noContent\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function batchGet(int $offset = 0, int $count = 20, int $noContent = 0)\n    {\n        $params = [\n            'offset' => $offset,\n            'count' => $count,\n            'no_content' => $noContent\n        ];\n        return $this->httpPostJson('cgi-bin/freepublish/batchget', $params);\n    }\n\n    /**\n     * Delete article\n     * @param string $articleId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $articleId)\n    {\n        return $this->httpPostJson('cgi-bin/freepublish/delete', ['article_id' => $articleId]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/FreePublish/ServiceProvider.php",
    "content": "<?php\n\n/**\n * ServiceProvider.php.\n *\n * This file is part of the wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\FreePublish;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author wangdongzhao <elim051@163.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['free_publish'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Goods/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Goods;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author her-cat <hxhsoft@foxmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Add the goods.\n     *\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(array $data)\n    {\n        return $this->httpPostJson('scan/product/v2/add', [\n            'product' => $data,\n        ]);\n    }\n\n    /**\n     * Update the goods.\n     *\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(array $data)\n    {\n        return $this->httpPostJson('scan/product/v2/add', [\n            'product' => $data,\n        ]);\n    }\n\n    /**\n     * Get add or update goods results.\n     *\n     * @param string $ticket\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function status(string $ticket)\n    {\n        return $this->httpPostJson('scan/product/v2/status', [\n            'status_ticket' => $ticket,\n        ]);\n    }\n\n    /**\n     * Get goods information.\n     *\n     * @param string $pid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $pid)\n    {\n        return $this->httpPostJson('scan/product/v2/getinfo', [\n            'product' => [\n                'pid' => $pid,\n            ],\n        ]);\n    }\n\n    /**\n     * Get a list of goods.\n     *\n     * @param string $context\n     * @param int    $page\n     * @param int    $size\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(string $context = '', int $page = 1, int $size = 10)\n    {\n        return $this->httpPostJson('scan/product/v2/getinfobypage', [\n            'page_context' => $context,\n            'page_num' => $page,\n            'page_size' => $size,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Goods/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Goods;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author her-cat <hxhsoft@foxmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['goods'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Guide/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Guide;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException;\nuse EasyWeChat\\Kernel\\Support\\Collection;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Class Client.\n *\n * @author MillsGuo <millsguo@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 添加顾问\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param string $guideHeadImgUrl\n     * @param string $guideNickname\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function createAdviser($guideAccount = '', $guideOpenid = '', $guideHeadImgUrl = '', $guideNickname = '')\n    {\n        $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid);\n        if (!empty($guideHeadImgUrl)) {\n            $params['guide_headimgurl'] = $guideHeadImgUrl;\n        }\n        if (!empty($guideNickname)) {\n            $params['guide_nickname'] = $guideNickname;\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/addguideacct', $params);\n    }\n\n    /**\n     * 获取顾问信息\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getAdviser($guideAccount = '', $guideOpenid = '')\n    {\n        $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/getguideacct', $params);\n    }\n\n    /**\n     * 修改顾问的昵称或头像\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param string $guideHeadImgUrl\n     * @param string $guideNickname\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function updateAdviser($guideAccount = '', $guideOpenid = '', $guideHeadImgUrl = '', $guideNickname = '')\n    {\n        $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid);\n        if (!empty($guideHeadImgUrl)) {\n            $params['guide_headimgurl'] = $guideHeadImgUrl;\n        }\n        if (!empty($guideNickname)) {\n            $params['guide_nickname'] = $guideNickname;\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/updateguideacct', $params);\n    }\n\n    /**\n     * 删除顾问\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function deleteAdviser($guideAccount = '', $guideOpenid = '')\n    {\n        $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/delguideacct', $params);\n    }\n\n    /**\n     * 获取服务号顾问列表\n     *\n     * @return mixed\n     *\n     * @throws InvalidConfigException\n     */\n    public function getAdvisers($count, $page)\n    {\n        $params = [\n            'page' => $page,\n            'num' => $count\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/getguideacctlist', $params);\n    }\n\n    /**\n     * 生成顾问二维码\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param string $qrCodeInfo\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function createQrCode($guideAccount = '', $guideOpenid = '', $qrCodeInfo = '')\n    {\n        $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid);\n        if (!empty($qrCodeInfo)) {\n            $params['qrcode_info'] = $qrCodeInfo;\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/guidecreateqrcode', $params);\n    }\n\n    /**\n     * 获取顾问聊天记录\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param string $openid\n     * @param int $beginTime\n     * @param int $endTime\n     * @param int $page\n     * @param int $count\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getBuyerChatRecords($guideAccount = '', $guideOpenid = '', $openid = '', $beginTime = 0, $endTime = 0, $page = 1, $count = 100)\n    {\n        $params = [\n            'page' => $page,\n            'num' => $count\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n        if (!empty($openid)) {\n            $params['openid'] = $openid;\n        }\n        if (!empty($beginTime)) {\n            $params['begin_time'] = $beginTime;\n        }\n        if (!empty($endTime)) {\n            $params['end_time'] = $endTime;\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/getguidebuyerchatrecord', $params);\n    }\n\n    /**\n     * 设置快捷回复与关注自动回复\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param bool $isDelete\n     * @param array $fastReplyListArray\n     * @param array $guideAutoReply\n     * @param array $guideAutoReplyPlus\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function setConfig($guideAccount = '', $guideOpenid = '', $isDelete = false, $fastReplyListArray = array(), $guideAutoReply = array(), $guideAutoReplyPlus = array())\n    {\n        $params = [\n            'is_delete' => $isDelete\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n        if (!empty($fastReplyListArray)) {\n            $params['guide_fast_reply_list'] = $fastReplyListArray;\n        }\n        if (!empty($guideAutoReply)) {\n            $params['guide_auto_reply'] = $guideAutoReply;\n        }\n        if (!empty($guideAutoReplyPlus)) {\n            $params['guide_auto_reply_plus'] = $guideAutoReplyPlus;\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/setguideconfig', $params);\n    }\n\n    /**\n     * 获取快捷回复与关注自动回复\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getConfig($guideAccount = '', $guideOpenid = '')\n    {\n        try {\n            $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid);\n        } catch (InvalidConfigException $e) {\n            $params = array();\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/getguideconfig', $params);\n    }\n\n    /**\n     * 设置离线自动回复与敏感词\n     * @param bool $isDelete\n     * @param array $blackKeyword\n     * @param array $guideAutoReply\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function setAdviserConfig(bool $isDelete, array $blackKeyword = [], array $guideAutoReply = [])\n    {\n        $params = [\n            'is_delete' => $isDelete\n        ];\n        if (!empty($blackKeyword)) {\n            $params['black_keyword'] = $blackKeyword;\n        }\n        if (!empty($guideAutoReply)) {\n            $params['guide_auto_reply'] = $guideAutoReply;\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/setguideacctconfig', $params);\n    }\n\n    /**\n     * 获取离线自动回复与敏感词\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getAdviserConfig()\n    {\n        return $this->httpPostJson('cgi-bin/guide/getguideacctconfig', array());\n    }\n\n    /**\n     * 允许微信用户复制小程序页面路径\n     * @param string $wxaAppid 小程序APPID\n     * @param string $wxUsername 微信用户的微信号\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function allowCopyMiniAppPath(string $wxaAppid, string $wxUsername)\n    {\n        $params = [\n            'wxa_appid' => $wxaAppid,\n            'wx_username' => $wxUsername\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/pushshowwxapathmenu', $params);\n    }\n\n    /**\n     * 传入微信号或OPENID二选一\n     * @param array $params\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @return array\n     * @throws InvalidConfigException\n     */\n    protected function selectAccountAndOpenid($params, $guideAccount = '', $guideOpenid = '')\n    {\n        if (!is_array($params)) {\n            throw new InvalidConfigException(\"传入配置参数必须为数组\");\n        }\n        if (!empty($guideOpenid)) {\n            $params['guide_openid'] = $guideOpenid;\n        } elseif (!empty($guideAccount)) {\n            $params['guide_account'] = $guideAccount;\n        } else {\n            throw new InvalidConfigException(\"微信号和OPENID不能同时为空\");\n        }\n\n        return $params;\n    }\n\n    /**\n     * 新建顾问分组\n     * @param string $groupName\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function createGroup(string $groupName)\n    {\n        $params = [\n            'group_name' => $groupName\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/newguidegroup', $params);\n    }\n\n    /**\n     * 获取顾问分组列表\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getGuideGroups()\n    {\n        return $this->httpPostJson('cgi-bin/guide/getguidegrouplist', array());\n    }\n\n    /**\n     * 获取指定顾问分组信息\n     * @param int $groupId\n     * @param int $page\n     * @param int $num\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getGroups(int $groupId, int $page, int $num)\n    {\n        $params = [\n            'group_id' => $groupId,\n            'page' => $page,\n            'num' => $num\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/getgroupinfo', $params);\n    }\n\n    /**\n     * 分组内添加顾问\n     * @param int $groupId\n     * @param string $guideAccount\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function addGroupGuide(int $groupId, string $guideAccount)\n    {\n        $params = [\n            'group_id' => $groupId,\n            'gruide_account' => $guideAccount\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/addguide2guidegroup', $params);\n    }\n\n    /**\n     * 分组内删除顾问\n     * @param int $groupId\n     * @param string $guideAccount\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function deleteGroupGuide(int $groupId, string $guideAccount)\n    {\n        $params = [\n            'group_id' => $groupId,\n            'guide_account' => $guideAccount\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/delguide2guidegroup', $params);\n    }\n\n    /**\n     * 获取顾问所在分组\n     * @param string $guideAccount\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getGuideGroup(string $guideAccount)\n    {\n        $params = [\n            'guide_account' => $guideAccount\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/getgroupbyguide', $params);\n    }\n\n    /**\n     * 删除指定顾问分组\n     * @param int $groupId\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function deleteGroup(int $groupId)\n    {\n        $params = [\n            'group_id' => $groupId\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/delguidegroup', $params);\n    }\n\n    /**\n     * 为顾问分配客户\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param array $buyerList\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function createBuyerRelation(string $guideAccount, string $guideOpenid, array $buyerList)\n    {\n        $params = [\n            'buyer_list' => $buyerList\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/addguidebuyerrelation', $params);\n    }\n\n    /**\n     * 为顾问移除客户\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param array $openidList\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function deleteBuyerRelation(string $guideAccount, string $guideOpenid, array $openidList)\n    {\n        $params = [\n            'openid_list' => $openidList\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/delguidebuyerrelation', $params);\n    }\n\n    /**\n     * 获取顾问的客户列表\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param int $page\n     * @param int $num\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getBuyerRelations(string $guideAccount, string $guideOpenid, int $page, int $num)\n    {\n        $params = [\n            'page' => $page,\n            'num' => $num\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/getguidebuyerrelationlist', $params);\n    }\n\n    /**\n     * 为客户更换顾问\n     * @param string $oldGuideTarget\n     * @param string $newGuideTarget\n     * @param array $openidList\n     * @param bool $useTargetOpenid true使用OPENID，false使用微信号\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function rebindBuyerGuide(string $oldGuideTarget, string $newGuideTarget, array $openidList, bool $useTargetOpenid = true)\n    {\n        $params = [\n            'openid_list' => $openidList\n        ];\n        if ($useTargetOpenid) {\n            $params['old_guide_openid'] = $oldGuideTarget;\n            $params['new_guide_openid'] = $newGuideTarget;\n        } else {\n            $params['old_guide_account'] = $oldGuideTarget;\n            $params['new_guide_account'] = $newGuideTarget;\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/rebindguideacctforbuyer', $params);\n    }\n\n    /**\n     * 修改客户昵称\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param string $openid\n     * @param string $nickname\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function updateBuyerRelation(string $guideAccount, string $guideOpenid, string $openid, string $nickname)\n    {\n        $params = [\n            'openid' => $openid,\n            'buyer_nickname' => $nickname\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/updateguidebuyerrelation', $params);\n    }\n\n    /**\n     * 查询客户所属顾问\n     * @param string $openid\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getBuyerRelation(string $openid)\n    {\n        $params = [\n            'openid' => $openid\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/getguidebuyerrelationbybuyer', $params);\n    }\n\n    /**\n     * 查询指定顾问和客户的关系\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param string $openid\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getBuyerRelationByGuide(string $guideAccount, string $guideOpenid, string $openid)\n    {\n        $params = [\n            'openid' => $openid\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/getguidebuyerrelation', $params);\n    }\n\n    /**\n     * 新建可查询的标签类型\n     * @param string $tagName\n     * @param array $tagValues\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function newTagOption(string $tagName, array $tagValues)\n    {\n        $params = [\n            'tag_name' => $tagName,\n            'tag_values' => $tagValues\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/newguidetagoption', $params);\n    }\n\n    /**\n     * 删除指定标签类型\n     * @param string $tagName\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function deleteTagOption(string $tagName)\n    {\n        $params = [\n            'tag_name' => $tagName\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/delguidetagoption', $params);\n    }\n\n    /**\n     * 为标签添加可选值\n     * @param string $tagName\n     * @param array $tagValues\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function createTagOption(string $tagName, array $tagValues)\n    {\n        $params = [\n            'tag_name' => $tagName,\n            'tag_values' => $tagValues\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/addguidetagoption', $params);\n    }\n\n    /**\n     * 获取标签和可选值\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getTagOption()\n    {\n        return $this->httpPostJson('cgi-bin/guide/getguidetagoption', array());\n    }\n\n    /**\n     * 为客户设置标签\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param array $openidList\n     * @param string $tagValue\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function setBuyersTag(string $guideAccount, string $guideOpenid, array $openidList, string $tagValue)\n    {\n        $params = [\n            'tag_value' => $tagValue,\n            'openid_list' => $openidList\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/addguidebuyertag', $params);\n    }\n\n    /**\n     * 查询客户标签\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param string $openid\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getBuyerTags(string $guideAccount, string $guideOpenid, string $openid)\n    {\n        $params = [\n            'openid' => $openid\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/getguidebuyertag', $params);\n    }\n\n    /**\n     * 根据标签值筛选粉丝\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param int $pushCount\n     * @param array $tagValues\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getBuyerByTag(string $guideAccount, string $guideOpenid, int $pushCount = 0, array $tagValues = array())\n    {\n        $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid);\n        if ($pushCount > 0) {\n            $params['push_count'] = $pushCount;\n        }\n        if (count($tagValues) > 0) {\n            $params['tag_values'] = $tagValues;\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/queryguidebuyerbytag', $params);\n    }\n\n    /**\n     * 删除客户标签\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param string $tagValue\n     * @param array $openidList\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function deleteBuyerTag(string $guideAccount, string $guideOpenid, string $tagValue, array $openidList)\n    {\n        $params = [\n            'tag_value' => $tagValue\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n        if (count($openidList) > 0) {\n            $params['openid_list'] = $openidList;\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/delguidebuyertag', $params);\n    }\n\n    /**\n     * 设置自定义客户信息\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param string $openid\n     * @param array $displayTagList\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function setBuyerDisplayTags(string $guideAccount, string $guideOpenid, string $openid, array $displayTagList)\n    {\n        $params = [\n            'openid' => $openid,\n            'display_tag_list' => $displayTagList\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/addguidebuyerdisplaytag', $params);\n    }\n\n    /**\n     * 获取自定义客户信息\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param string $openid\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getBuyerDisplayTags(string $guideAccount, string $guideOpenid, string $openid)\n    {\n        $params = [\n            'openid' => $openid\n        ];\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/getguidebuyerdisplaytag', $params);\n    }\n\n    /**\n     * 添加小程序卡片素材\n     * @param string $mediaId\n     * @param string $title\n     * @param string $path\n     * @param string $appid\n     * @param int $type\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function createCardMaterial(string $mediaId, string $title, string $path, string $appid, int $type = 0)\n    {\n        $params = [\n            'media_id' => $mediaId,\n            'type' => $type,\n            'title' => $title,\n            'path' => $path,\n            'appid' => $appid\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/setguidecardmaterial', $params);\n    }\n\n    /**\n     * 查询小程序卡片素材\n     * @param int $type\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getCardMaterial(int $type = 0)\n    {\n        $params = [\n            'type' => $type\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/getguidecardmaterial', $params);\n    }\n\n    /**\n     * 删除小程序卡片素材\n     * @param string $title\n     * @param string $path\n     * @param string $appid\n     * @param int $type\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function deleteCardMaterial(string $title, string $path, string $appid, int $type = 0)\n    {\n        $params = [\n            'type' => $type,\n            'title' => $title,\n            'path' => $path,\n            'appid' => $appid\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/delguidecardmaterial', $params);\n    }\n\n    /**\n     * 添加图片素材\n     * @param string $mediaId\n     * @param int $type\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function createImageMaterial(string $mediaId, int $type = 0)\n    {\n        $params = [\n            'media_id' => $mediaId,\n            'type' => $type\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/setguideimagematerial', $params);\n    }\n\n    /**\n     * 查询图片素材\n     * @param int $type\n     * @param int $start\n     * @param int $num\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getImageMaterial(int $type, int $start, int $num)\n    {\n        $params = [\n            'type' => $type,\n            'start' => $start,\n            'num' => $num\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/getguideimagematerial', $params);\n    }\n\n    /**\n     * 删除图片素材\n     * @param int $type\n     * @param string $picUrl\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function deleteImageMaterial(int $type, string $picUrl)\n    {\n        $params = [\n            'type' => $type,\n            'picurl' => $picUrl\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/delguideimagematerial', $params);\n    }\n\n    /**\n     * 添加文字素材\n     * @param int $type\n     * @param string $word\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function createWordMaterial(int $type, string $word)\n    {\n        $params = [\n            'type' => $type,\n            'word' => $word\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/setguidewordmaterial', $params);\n    }\n\n    /**\n     * 查询文字素材\n     * @param int $type\n     * @param int $start\n     * @param int $num\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getWordMaterial(int $type, int $start, int $num)\n    {\n        $params = [\n            'type' => $type,\n            'start' => $start,\n            'num' => $num\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/getguidewordmaterial', $params);\n    }\n\n    /**\n     * 删除文字素材\n     * @param int $type\n     * @param string $word\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function deleteWordMaterial(int $type, string $word)\n    {\n        $params = [\n            'type' => $type,\n            'word' => $word\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/delguidewordmaterial', $params);\n    }\n\n    /**\n     * 添加群发任务，为指定顾问添加群发任务\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param string $taskName\n     * @param string $taskRemark\n     * @param int $pushTime\n     * @param array $openidArray\n     * @param array $materialArray\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function createMasSendJob(string $guideAccount, string $guideOpenid, string $taskName, string $taskRemark, int $pushTime, array $openidArray, array $materialArray)\n    {\n        $params = [\n            'task_name' => $taskName,\n            'push_time' => $pushTime,\n            'openid' => $openidArray,\n            'material' => $materialArray\n        ];\n        if (!empty($taskRemark)) {\n            $params['task_remark'] = $taskRemark;\n        }\n        $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid);\n\n        return $this->httpPostJson('cgi-bin/guide/addguidemassendjob', $params);\n    }\n\n    /**\n     * 获取群发任务列表\n     * @param string $guideAccount\n     * @param string $guideOpenid\n     * @param array $taskStatus\n     * @param int $offset\n     * @param int $limit\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getMasSendJobs(string $guideAccount, string $guideOpenid, array $taskStatus = [], int $offset = 0, int $limit = 50)\n    {\n        $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid);\n        if (!empty($taskStatus)) {\n            $params['task_status'] = $taskStatus;\n        }\n        if ($offset > 0) {\n            $params['offset'] = $offset;\n        }\n        if ($limit != 50) {\n            $params['limit'] = $limit;\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/getguidemassendjoblist', $params);\n    }\n\n    /**\n     * 获取指定群发任务信息\n     * @param string $taskId\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function getMasSendJob(string $taskId)\n    {\n        $params = [\n            'task_id' => $taskId\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/getguidemassendjob', $params);\n    }\n\n    /**\n     * 修改群发任务\n     * @param string $taskId\n     * @param string $taskName\n     * @param string $taskRemark\n     * @param int $pushTime\n     * @param array $openidArray\n     * @param array $materialArray\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function updateMasSendJob(string $taskId, string $taskName, string $taskRemark, int $pushTime, array $openidArray, array $materialArray)\n    {\n        $params = [\n            'task_id' => $taskId\n        ];\n        if (!empty($taskName)) {\n            $params['task_name'] = $taskName;\n        }\n        if (!empty($taskRemark)) {\n            $params['task_remark'] = $taskRemark;\n        }\n        if (!empty($pushTime)) {\n            $params['push_time'] = $pushTime;\n        }\n        if (!empty($openidArray)) {\n            $params['openid'] = $openidArray;\n        }\n        if (!empty($materialArray)) {\n            $params['material'] = $materialArray;\n        }\n\n        return $this->httpPostJson('cgi-bin/guide/updateguidemassendjob', $params);\n    }\n\n    /**\n     * 取消群发任务\n     * @param string $taskId\n     * @return array|Collection|object|ResponseInterface|string\n     * @throws InvalidConfigException\n     */\n    public function cancelMasSendJob(string $taskId)\n    {\n        $params = [\n            'task_id' => $taskId\n        ];\n\n        return $this->httpPostJson('cgi-bin/guide/cancelguidemassendjob', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Guide/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Guide;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author millsguo <millsguo@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['guide'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Material/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Material;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\Http\\StreamResponse;\nuse EasyWeChat\\Kernel\\Messages\\Article;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Allow media type.\n     *\n     * @var array\n     */\n    protected $allowTypes = ['image', 'voice', 'video', 'thumb', 'news_image'];\n\n    /**\n     * Upload image.\n     *\n     * @param string $path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadImage(string $path)\n    {\n        return $this->upload('image', $path);\n    }\n\n    /**\n     * Upload voice.\n     *\n     * @param string $path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadVoice(string $path)\n    {\n        return $this->upload('voice', $path);\n    }\n\n    /**\n     * Upload thumb.\n     *\n     * @param string $path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadThumb(string $path)\n    {\n        return $this->upload('thumb', $path);\n    }\n\n    /**\n     * Upload video.\n     *\n     * @param string $path\n     * @param string $title\n     * @param string $description\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadVideo(string $path, string $title, string $description)\n    {\n        $params = [\n            'description' => json_encode(\n                [\n                    'title' => $title,\n                    'introduction' => $description,\n                ],\n                JSON_UNESCAPED_UNICODE\n            ),\n        ];\n\n        return $this->upload('video', $path, $params);\n    }\n\n    /**\n     * Upload articles.\n     *\n     * @param array|Article $articles\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadArticle($articles)\n    {\n        if ($articles instanceof Article || !empty($articles['title'])) {\n            $articles = [$articles];\n        }\n\n        $params = ['articles' => array_map(function ($article) {\n            if ($article instanceof Article) {\n                return $article->transformForJsonRequestWithoutType();\n            }\n\n            return $article;\n        }, $articles)];\n\n        return $this->httpPostJson('cgi-bin/material/add_news', $params);\n    }\n\n    /**\n     * Update article.\n     *\n     * @param string        $mediaId\n     * @param array|Article $article\n     * @param int           $index\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateArticle(string $mediaId, $article, int $index = 0)\n    {\n        if ($article instanceof Article) {\n            $article = $article->transformForJsonRequestWithoutType();\n        }\n\n        $params = [\n            'media_id' => $mediaId,\n            'index' => $index,\n            'articles' => isset($article['title']) ? $article : (isset($article[$index]) ? $article[$index] : []),\n        ];\n\n        return $this->httpPostJson('cgi-bin/material/update_news', $params);\n    }\n\n    /**\n     * Upload image for article.\n     *\n     * @param string $path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function uploadArticleImage(string $path)\n    {\n        return $this->upload('news_image', $path);\n    }\n\n    /**\n     * Fetch material.\n     *\n     * @param string $mediaId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $mediaId)\n    {\n        $response = $this->requestRaw('cgi-bin/material/get_material', 'POST', ['json' => ['media_id' => $mediaId]]);\n\n        if (false !== stripos($response->getHeaderLine('Content-disposition'), 'attachment')) {\n            return StreamResponse::buildFromPsrResponse($response);\n        }\n\n        return $this->castResponseToType($response, $this->app['config']->get('response_type'));\n    }\n\n    /**\n     * Delete material by media ID.\n     *\n     * @param string $mediaId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $mediaId)\n    {\n        return $this->httpPostJson('cgi-bin/material/del_material', ['media_id' => $mediaId]);\n    }\n\n    /**\n     * List materials.\n     *\n     * example:\n     *\n     * {\n     *   \"total_count\": TOTAL_COUNT,\n     *   \"item_count\": ITEM_COUNT,\n     *   \"item\": [{\n     *             \"media_id\": MEDIA_ID,\n     *             \"name\": NAME,\n     *             \"update_time\": UPDATE_TIME\n     *         },\n     *         // more...\n     *   ]\n     * }\n     *\n     * @param string $type\n     * @param int    $offset\n     * @param int    $count\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(string $type, int $offset = 0, int $count = 20)\n    {\n        $params = [\n            'type' => $type,\n            'offset' => $offset,\n            'count' => $count,\n        ];\n\n        return $this->httpPostJson('cgi-bin/material/batchget_material', $params);\n    }\n\n    /**\n     * Get stats of materials.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function stats()\n    {\n        return $this->httpGet('cgi-bin/material/get_materialcount');\n    }\n\n    /**\n     * Upload material.\n     *\n     * @param string $type\n     * @param string $path\n     * @param array  $form\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function upload(string $type, string $path, array $form = [])\n    {\n        if (!file_exists($path) || !is_readable($path)) {\n            throw new InvalidArgumentException(sprintf('File does not exist, or the file is unreadable: \"%s\"', $path));\n        }\n\n        $form['type'] = $type;\n\n        return $this->httpUpload($this->getApiByType($type), ['media' => $path], $form);\n    }\n\n    /**\n     * Get API by type.\n     *\n     * @param string $type\n     *\n     * @return string\n     */\n    public function getApiByType(string $type)\n    {\n        switch ($type) {\n            case 'news_image':\n                return 'cgi-bin/media/uploadimg';\n            default:\n                return 'cgi-bin/material/add_material';\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Material/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\n/**\n * ServiceProvider.php.\n *\n * This file is part of the wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Material;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['material'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Menu/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Menu;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get all menus.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function list()\n    {\n        return $this->httpGet('cgi-bin/menu/get');\n    }\n\n    /**\n     * Get current menus.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function current()\n    {\n        return $this->httpGet('cgi-bin/get_current_selfmenu_info');\n    }\n\n    /**\n     * Add menu.\n     *\n     * @param array $buttons\n     * @param array $matchRule\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $buttons, array $matchRule = [])\n    {\n        if (!empty($matchRule)) {\n            return $this->httpPostJson('cgi-bin/menu/addconditional', [\n                'button' => $buttons,\n                'matchrule' => $matchRule,\n            ]);\n        }\n\n        return $this->httpPostJson('cgi-bin/menu/create', ['button' => $buttons]);\n    }\n\n    /**\n     * Destroy menu.\n     *\n     * @param int $menuId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(int $menuId = null)\n    {\n        if (is_null($menuId)) {\n            return $this->httpGet('cgi-bin/menu/delete');\n        }\n\n        return $this->httpPostJson('cgi-bin/menu/delconditional', ['menuid' => $menuId]);\n    }\n\n    /**\n     * Test conditional menu.\n     *\n     * @param string $userId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function match(string $userId)\n    {\n        return $this->httpPostJson('cgi-bin/menu/trymatch', ['user_id' => $userId]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Menu/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Menu;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['menu'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/OAuth/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\OAuth;\n\nuse Overtrue\\Socialite\\SocialiteManager as Socialite;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['oauth'] = function ($app) {\n            $wechat = [\n                'wechat' => [\n                    'client_id' => $app['config']['app_id'],\n                    'client_secret' => $app['config']['secret'],\n                    'redirect' => $this->prepareCallbackUrl($app),\n                ],\n            ];\n\n            if (!empty($app['config']['component_app_id'] && !empty($app['config']['component_app_token']))) {\n                $wechat['wechat']['component'] = [\n                    'id' => $app['config']['component_app_id'],\n                    'token' => $app['config']['token'],\n                ] ;\n            }\n\n            $socialite = (new Socialite($wechat))->create('wechat');\n\n            $scopes = (array)$app['config']->get('oauth.scopes', ['snsapi_userinfo']);\n\n            if (!empty($scopes)) {\n                $socialite->scopes($scopes);\n            }\n\n            return $socialite;\n        };\n    }\n\n    /**\n     * Prepare the OAuth callback url for wechat.\n     *\n     * @param Container $app\n     *\n     * @return string\n     */\n    private function prepareCallbackUrl($app)\n    {\n        $callback = $app['config']->get('oauth.callback');\n        if (0 === stripos($callback, 'http')) {\n            return $callback;\n        }\n        $baseUrl = $app['request']->getSchemeAndHttpHost();\n\n        return $baseUrl . '/' . ltrim($callback, '/');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/OCR/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\OCR;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class Client.\n *\n * @author joyeekk <xygao2420@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Allow image parameter type.\n     *\n     * @var array\n     */\n    protected $allowTypes = ['photo', 'scan'];\n\n    /**\n     * ID card OCR.\n     *\n     * @param string $path\n     * @param string $type\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function idCard(string $path, string $type = 'photo')\n    {\n        if (!\\in_array($type, $this->allowTypes, true)) {\n            throw new InvalidArgumentException(sprintf(\"Unsupported type: '%s'\", $type));\n        }\n\n        return $this->httpPost('cv/ocr/idcard', [\n            'type' => $type,\n            'img_url' => $path,\n        ]);\n    }\n\n    /**\n     * Bank card OCR.\n     *\n     * @param string $path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function bankCard(string $path)\n    {\n        return $this->httpPost('cv/ocr/bankcard', [\n            'img_url' => $path,\n        ]);\n    }\n\n    /**\n     * Vehicle license OCR.\n     *\n     * @param string $path\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function vehicleLicense(string $path)\n    {\n        return $this->httpPost('cv/ocr/drivinglicense', [\n            'img_url' => $path,\n        ]);\n    }\n\n    /**\n     * Driving OCR.\n     *\n     * @param string $path\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function driving(string $path)\n    {\n        return $this->httpPost('cv/ocr/driving', [\n            'img_url' => $path,\n        ]);\n    }\n\n    /**\n     * Biz License OCR.\n     *\n     * @param string $path\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function bizLicense(string $path)\n    {\n        return $this->httpPost('cv/ocr/bizlicense', [\n            'img_url' => $path,\n        ]);\n    }\n\n    /**\n     * Common OCR.\n     *\n     * @param string $path\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function common(string $path)\n    {\n        return $this->httpPost('cv/ocr/comm', [\n            'img_url' => $path,\n        ]);\n    }\n\n    /**\n     * Plate Number OCR.\n     *\n     * @param string $path\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function plateNumber(string $path)\n    {\n        return $this->httpPost('cv/ocr/platenum', [\n            'img_url' => $path,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/OCR/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\OCR;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author joyeekk <xygao2420@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['ocr'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/POI/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\POI;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get POI supported categories.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function categories()\n    {\n        return $this->httpGet('cgi-bin/poi/getwxcategory');\n    }\n\n    /**\n     * Get POI by ID.\n     *\n     * @param int $poiId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(int $poiId)\n    {\n        return $this->httpPostJson('cgi-bin/poi/getpoi', ['poi_id' => $poiId]);\n    }\n\n    /**\n     * List POI.\n     *\n     * @param int $offset\n     * @param int $limit\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(int $offset = 0, int $limit = 10)\n    {\n        $params = [\n            'begin' => $offset,\n            'limit' => $limit,\n        ];\n\n        return $this->httpPostJson('cgi-bin/poi/getpoilist', $params);\n    }\n\n    /**\n     * Create a POI.\n     *\n     * @param array $baseInfo\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $baseInfo)\n    {\n        $params = [\n            'business' => [\n                'base_info' => $baseInfo,\n            ],\n        ];\n\n        return $this->httpPostJson('cgi-bin/poi/addpoi', $params);\n    }\n\n    /**\n     * @param array $databaseInfo\n     *\n     * @return int\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function createAndGetId(array $databaseInfo)\n    {\n        /** @var array $response */\n        $response = $this->detectAndCastResponseToType($this->create($databaseInfo), 'array');\n\n        return $response['poi_id'];\n    }\n\n    /**\n     * Update a POI.\n     *\n     * @param int   $poiId\n     * @param array $baseInfo\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(int $poiId, array $baseInfo)\n    {\n        $params = [\n            'business' => [\n                'base_info' => array_merge($baseInfo, ['poi_id' => $poiId]),\n            ],\n        ];\n\n        return $this->httpPostJson('cgi-bin/poi/updatepoi', $params);\n    }\n\n    /**\n     * Delete a POI.\n     *\n     * @param int $poiId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(int $poiId)\n    {\n        return $this->httpPostJson('cgi-bin/poi/delpoi', ['poi_id' => $poiId]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/POI/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\POI;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['poi'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Semantic/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Semantic;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get the semantic content of giving string.\n     *\n     * @param string $keyword\n     * @param string $categories\n     * @param array  $optional\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function query(string $keyword, string $categories, array $optional = [])\n    {\n        $params = [\n            'query' => $keyword,\n            'category' => $categories,\n            'appid' => $this->app['config']['app_id'],\n        ];\n\n        return $this->httpPostJson('semantic/semproxy/search', array_merge($params, $optional));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Semantic/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Semantic;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['semantic'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Server/Guard.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Server;\n\nuse EasyWeChat\\Kernel\\ServerGuard;\n\n/**\n * Class Guard.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Guard extends ServerGuard\n{\n    /**\n     * @return bool\n     */\n    protected function shouldReturnRawResponse(): bool\n    {\n        return !is_null($this->app['request']->get('echostr'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Server/Handlers/EchoStrHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Server\\Handlers;\n\nuse EasyWeChat\\Kernel\\Contracts\\EventHandlerInterface;\nuse EasyWeChat\\Kernel\\Decorators\\FinallyResult;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Class EchoStrHandler.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass EchoStrHandler implements EventHandlerInterface\n{\n    /**\n     * @var ServiceContainer\n     */\n    protected $app;\n\n    /**\n     * EchoStrHandler constructor.\n     *\n     * @param ServiceContainer $app\n     */\n    public function __construct(ServiceContainer $app)\n    {\n        $this->app = $app;\n    }\n\n    /**\n     * @param mixed $payload\n     *\n     * @return FinallyResult|null\n     */\n    public function handle($payload = null)\n    {\n        if ($str = $this->app['request']->get('echostr')) {\n            return new FinallyResult($str);\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Server/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Server;\n\nuse EasyWeChat\\Kernel\\Encryptor;\nuse EasyWeChat\\OfficialAccount\\Server\\Handlers\\EchoStrHandler;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        !isset($app['encryptor']) && $app['encryptor'] = function ($app) {\n            return new Encryptor(\n                $app['config']['app_id'],\n                $app['config']['token'],\n                $app['config']['aes_key']\n            );\n        };\n\n        !isset($app['server']) && $app['server'] = function ($app) {\n            $guard = new Guard($app);\n            $guard->push(new EchoStrHandler($app));\n\n            return $guard;\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\ShakeAround;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function register($data)\n    {\n        return $this->httpPostJson('shakearound/account/register', $data);\n    }\n\n    /**\n     * Get audit status.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function status()\n    {\n        return $this->httpGet('shakearound/account/auditstatus');\n    }\n\n    /**\n     * Get shake info.\n     *\n     * @param string $ticket\n     * @param bool   $needPoi\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function user(string $ticket, bool $needPoi = false)\n    {\n        $params = [\n            'ticket' => $ticket,\n        ];\n\n        if ($needPoi) {\n            $params['need_poi'] = 1;\n        }\n\n        return $this->httpPostJson('shakearound/user/getshakeinfo', $params);\n    }\n\n    /**\n     * @param string $ticket\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     */\n    public function userWithPoi(string $ticket)\n    {\n        return $this->user($ticket, true);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/DeviceClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\ShakeAround;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class DeviceClient.\n *\n * @author allen05ren <allen05ren@outlook.com>\n */\nclass DeviceClient extends BaseClient\n{\n    /**\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function apply(array $data)\n    {\n        return $this->httpPostJson('shakearound/device/applyid', $data);\n    }\n\n    /**\n     * Get audit status.\n     *\n     * @param int $applyId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function status(int $applyId)\n    {\n        $params = [\n            'apply_id' => $applyId,\n        ];\n\n        return $this->httpPostJson('shakearound/device/applystatus', $params);\n    }\n\n    /**\n     * Update a device comment.\n     *\n     * @param array  $deviceIdentifier\n     * @param string $comment\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(array $deviceIdentifier, string $comment)\n    {\n        $params = [\n            'device_identifier' => $deviceIdentifier,\n            'comment' => $comment,\n        ];\n\n        return $this->httpPostJson('shakearound/device/update', $params);\n    }\n\n    /**\n     * Bind location for device.\n     *\n     * @param array $deviceIdentifier\n     * @param int   $poiId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function bindPoi(array $deviceIdentifier, int $poiId)\n    {\n        $params = [\n            'device_identifier' => $deviceIdentifier,\n            'poi_id' => $poiId,\n        ];\n\n        return $this->httpPostJson('shakearound/device/bindlocation', $params);\n    }\n\n    /**\n     * @param array  $deviceIdentifier\n     * @param int    $poiId\n     * @param string $appId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function bindThirdPoi(array $deviceIdentifier, int $poiId, string $appId)\n    {\n        $params = [\n            'device_identifier' => $deviceIdentifier,\n            'poi_id' => $poiId,\n            'type' => 2,\n            'poi_appid' => $appId,\n        ];\n\n        return $this->httpPostJson('shakearound/device/bindlocation', $params);\n    }\n\n    /**\n     * Fetch batch of devices by deviceIds.\n     *\n     * @param array $deviceIdentifiers\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function listByIds(array $deviceIdentifiers)\n    {\n        $params = [\n            'type' => 1,\n            'device_identifiers' => $deviceIdentifiers,\n        ];\n\n        return $this->search($params);\n    }\n\n    /**\n     * Pagination to get batch of devices.\n     *\n     * @param int $lastId\n     * @param int $count\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function list(int $lastId, int $count)\n    {\n        $params = [\n            'type' => 2,\n            'last_seen' => $lastId,\n            'count' => $count,\n        ];\n\n        return $this->search($params);\n    }\n\n    /**\n     * Fetch batch of devices by applyId.\n     *\n     * @param int $applyId\n     * @param int $lastId\n     * @param int $count\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     */\n    public function listByApplyId(int $applyId, int $lastId, int $count)\n    {\n        $params = [\n            'type' => 3,\n            'apply_id' => $applyId,\n            'last_seen' => $lastId,\n            'count' => $count,\n        ];\n\n        return $this->search($params);\n    }\n\n    /**\n     * Fetch batch of devices.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function search(array $params)\n    {\n        return $this->httpPostJson('shakearound/device/search', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/GroupClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\ShakeAround;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class GroupClient.\n *\n * @author allen05ren <allen05ren@outlook.com>\n */\nclass GroupClient extends BaseClient\n{\n    /**\n     * Add device group.\n     *\n     * @param string $name\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(string $name)\n    {\n        $params = [\n            'group_name' => $name,\n        ];\n\n        return $this->httpPostJson('shakearound/device/group/add', $params);\n    }\n\n    /**\n     * Update a device group name.\n     *\n     * @param int    $groupId\n     * @param string $name\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(int $groupId, string $name)\n    {\n        $params = [\n            'group_id' => $groupId,\n            'group_name' => $name,\n        ];\n\n        return $this->httpPostJson('shakearound/device/group/update', $params);\n    }\n\n    /**\n     * Delete device group.\n     *\n     * @param int $groupId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(int $groupId)\n    {\n        $params = [\n            'group_id' => $groupId,\n        ];\n\n        return $this->httpPostJson('shakearound/device/group/delete', $params);\n    }\n\n    /**\n     * List all device groups.\n     *\n     * @param int $begin\n     * @param int $count\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(int $begin, int $count)\n    {\n        $params = [\n            'begin' => $begin,\n            'count' => $count,\n        ];\n\n        return $this->httpPostJson('shakearound/device/group/getlist', $params);\n    }\n\n    /**\n     * Get detail of a device group.\n     *\n     * @param int $groupId\n     * @param int $begin\n     * @param int $count\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(int $groupId, int $begin, int $count)\n    {\n        $params = [\n            'group_id' => $groupId,\n            'begin' => $begin,\n            'count' => $count,\n        ];\n\n        return $this->httpPostJson('shakearound/device/group/getdetail', $params);\n    }\n\n    /**\n     * Add  one or more devices to a device group.\n     *\n     * @param int   $groupId\n     * @param array $deviceIdentifiers\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function addDevices(int $groupId, array $deviceIdentifiers)\n    {\n        $params = [\n            'group_id' => $groupId,\n            'device_identifiers' => $deviceIdentifiers,\n        ];\n\n        return $this->httpPostJson('shakearound/device/group/adddevice', $params);\n    }\n\n    /**\n     * Remove one or more devices from a device group.\n     *\n     * @param int   $groupId\n     * @param array $deviceIdentifiers\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function removeDevices(int $groupId, array $deviceIdentifiers)\n    {\n        $params = [\n            'group_id' => $groupId,\n            'device_identifiers' => $deviceIdentifiers,\n        ];\n\n        return $this->httpPostJson('shakearound/device/group/deletedevice', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/MaterialClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\ShakeAround;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class MaterialClient.\n *\n * @author allen05ren <allen05ren@outlook.com>\n */\nclass MaterialClient extends BaseClient\n{\n    /**\n     * Upload image material.\n     *\n     * @param string $path\n     * @param string $type\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadImage(string $path, string $type = 'icon')\n    {\n        if (!file_exists($path) || !is_readable($path)) {\n            throw new InvalidArgumentException(sprintf('File does not exist, or the file is unreadable: \"%s\"', $path));\n        }\n\n        return $this->httpUpload('shakearound/material/add', ['media' => $path], [], ['type' => strtolower($type)]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/PageClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\ShakeAround;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class PageClient.\n *\n * @author allen05ren <allen05ren@outlook.com>\n */\nclass PageClient extends BaseClient\n{\n    /**\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $data)\n    {\n        return $this->httpPostJson('shakearound/page/add', $data);\n    }\n\n    /**\n     * @param int   $pageId\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(int $pageId, array $data)\n    {\n        return $this->httpPostJson('shakearound/page/update', array_merge(['page_id' => $pageId], $data));\n    }\n\n    /**\n     * Fetch batch of pages by pageIds.\n     *\n     * @param array $pageIds\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function listByIds(array $pageIds)\n    {\n        $params = [\n            'type' => 1,\n            'page_ids' => $pageIds,\n        ];\n\n        return $this->httpPostJson('shakearound/page/search', $params);\n    }\n\n    /**\n     * Pagination to get batch of pages.\n     *\n     * @param int $begin\n     * @param int $count\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(int $begin, int $count)\n    {\n        $params = [\n            'type' => 2,\n            'begin' => $begin,\n            'count' => $count,\n        ];\n\n        return $this->httpPostJson('shakearound/page/search', $params);\n    }\n\n    /**\n     * delete a page.\n     *\n     * @param int $pageId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(int $pageId)\n    {\n        $params = [\n            'page_id' => $pageId,\n        ];\n\n        return $this->httpPostJson('shakearound/page/delete', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/RelationClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\ShakeAround;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class RelationClient.\n *\n * @author allen05ren <allen05ren@outlook.com>\n */\nclass RelationClient extends BaseClient\n{\n    /**\n     * Bind pages for device.\n     *\n     * @param array $deviceIdentifier\n     * @param array $pageIds\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function bindPages(array $deviceIdentifier, array $pageIds)\n    {\n        $params = [\n            'device_identifier' => $deviceIdentifier,\n            'page_ids' => $pageIds,\n        ];\n\n        return $this->httpPostJson('shakearound/device/bindpage', $params);\n    }\n\n    /**\n     * Get pageIds by deviceId.\n     *\n     * @param array $deviceIdentifier\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function listByDeviceId(array $deviceIdentifier)\n    {\n        $params = [\n            'type' => 1,\n            'device_identifier' => $deviceIdentifier,\n        ];\n\n        return $this->httpPostJson('shakearound/relation/search', $params);\n    }\n\n    /**\n     * Get devices by pageId.\n     *\n     * @param int $pageId\n     * @param int $begin\n     * @param int $count\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function listByPageId(int $pageId, int $begin, int $count)\n    {\n        $params = [\n            'type' => 2,\n            'page_id' => $pageId,\n            'begin' => $begin,\n            'count' => $count,\n        ];\n\n        return $this->httpPostJson('shakearound/relation/search', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\ShakeAround;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author allen05ren <allen05ren@outlook.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['shake_around'] = function ($app) {\n            return new ShakeAround($app);\n        };\n\n        $app['shake_around.device'] = function ($app) {\n            return new DeviceClient($app);\n        };\n\n        $app['shake_around.page'] = function ($app) {\n            return new PageClient($app);\n        };\n\n        $app['shake_around.material'] = function ($app) {\n            return new MaterialClient($app);\n        };\n\n        $app['shake_around.group'] = function ($app) {\n            return new GroupClient($app);\n        };\n\n        $app['shake_around.relation'] = function ($app) {\n            return new RelationClient($app);\n        };\n\n        $app['shake_around.stats'] = function ($app) {\n            return new StatsClient($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/ShakeAround.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\ShakeAround;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class Card.\n *\n * @author overtrue <i@overtrue.me>\n *\n * @property \\EasyWeChat\\OfficialAccount\\ShakeAround\\DeviceClient   $device\n * @property \\EasyWeChat\\OfficialAccount\\ShakeAround\\GroupClient    $group\n * @property \\EasyWeChat\\OfficialAccount\\ShakeAround\\MaterialClient $material\n * @property \\EasyWeChat\\OfficialAccount\\ShakeAround\\RelationClient $relation\n * @property \\EasyWeChat\\OfficialAccount\\ShakeAround\\StatsClient    $stats\n * @property \\EasyWeChat\\OfficialAccount\\ShakeAround\\PageClient     $page\n */\nclass ShakeAround extends Client\n{\n    /**\n     * @param string $property\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function __get($property)\n    {\n        if (isset($this->app[\"shake_around.{$property}\"])) {\n            return $this->app[\"shake_around.{$property}\"];\n        }\n\n        throw new InvalidArgumentException(sprintf('No shake_around service named \"%s\".', $property));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/StatsClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\ShakeAround;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class StatsClient.\n *\n * @author allen05ren <allen05ren@outlook.com>\n */\nclass StatsClient extends BaseClient\n{\n    /**\n     * Fetch statistics data by deviceId.\n     *\n     * @param array $deviceIdentifier\n     * @param int   $beginTime        (Unix timestamp)\n     * @param int   $endTime          (Unix timestamp)\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deviceSummary(array $deviceIdentifier, int $beginTime, int $endTime)\n    {\n        $params = [\n            'device_identifier' => $deviceIdentifier,\n            'begin_date' => $beginTime,\n            'end_date' => $endTime,\n        ];\n\n        return $this->httpPostJson('shakearound/statistics/device', $params);\n    }\n\n    /**\n     * Fetch all devices statistics data by date.\n     *\n     * @param int $timestamp\n     * @param int $pageIndex\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function devicesSummary(int $timestamp, int $pageIndex)\n    {\n        $params = [\n            'date' => $timestamp,\n            'page_index' => $pageIndex,\n        ];\n\n        return $this->httpPostJson('shakearound/statistics/devicelist', $params);\n    }\n\n    /**\n     * Fetch statistics data by pageId.\n     *\n     * @param int $pageId\n     * @param int $beginTime (Unix timestamp)\n     * @param int $endTime   (Unix timestamp)\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function pageSummary(int $pageId, int $beginTime, int $endTime)\n    {\n        $params = [\n            'page_id' => $pageId,\n            'begin_date' => $beginTime,\n            'end_date' => $endTime,\n        ];\n\n        return $this->httpPostJson('shakearound/statistics/page', $params);\n    }\n\n    /**\n     * Fetch all pages statistics data by date.\n     *\n     * @param int $timestamp\n     * @param int $pageIndex\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function pagesSummary(int $timestamp, int $pageIndex)\n    {\n        $params = [\n            'date' => $timestamp,\n            'page_index' => $pageIndex,\n        ];\n\n        return $this->httpPostJson('shakearound/statistics/pagelist', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Store/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Store;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author bigface <saybye720@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get WXA supported categories.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function categories()\n    {\n        return $this->httpGet('wxa/get_merchant_category');\n    }\n\n    /**\n     * Get district from tencent map .\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function districts()\n    {\n        return $this->httpGet('wxa/get_district');\n    }\n\n    /**\n     * Search store from tencent map.\n     *\n     * @param int    $districtId\n     * @param string $keyword\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function searchFromMap(int $districtId, string $keyword)\n    {\n        $params = [\n            'districtid' => $districtId,\n            'keyword' => $keyword,\n        ];\n\n        return $this->httpPostJson('wxa/search_map_poi', $params);\n    }\n\n    /**\n     * Get store check status.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getStatus()\n    {\n        return $this->httpGet('wxa/get_merchant_audit_info');\n    }\n\n    /**\n     * Create a merchant.\n     *\n     * @param array $baseInfo\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createMerchant(array $baseInfo)\n    {\n        return $this->httpPostJson('wxa/apply_merchant', $baseInfo);\n    }\n\n    /**\n     * Update a merchant.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateMerchant(array $params)\n    {\n        return $this->httpPostJson('wxa/modify_merchant', $params);\n    }\n\n    /**\n     * Create a store from tencent map.\n     *\n     * @param array $baseInfo\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createFromMap(array $baseInfo)\n    {\n        return $this->httpPostJson('wxa/create_map_poi', $baseInfo);\n    }\n\n    /**\n     * Create a store.\n     *\n     * @param array $baseInfo\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $baseInfo)\n    {\n        return $this->httpPostJson('wxa/add_store', $baseInfo);\n    }\n\n    /**\n     * Update a store.\n     *\n     * @param int   $poiId\n     * @param array $baseInfo\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(int $poiId, array $baseInfo)\n    {\n        $params = array_merge($baseInfo, ['poi_id' => $poiId]);\n\n        return $this->httpPostJson('wxa/update_store', $params);\n    }\n\n    /**\n     * Get store by ID.\n     *\n     * @param int $poiId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(int $poiId)\n    {\n        return $this->httpPostJson('wxa/get_store_info', ['poi_id' => $poiId]);\n    }\n\n    /**\n     * List store.\n     *\n     * @param int $offset\n     * @param int $limit\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(int $offset = 0, int $limit = 10)\n    {\n        $params = [\n            'offset' => $offset,\n            'limit' => $limit,\n        ];\n\n        return $this->httpPostJson('wxa/get_store_list', $params);\n    }\n\n    /**\n     * Delete a store.\n     *\n     * @param int $poiId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(int $poiId)\n    {\n        return $this->httpPostJson('wxa/del_store', ['poi_id' => $poiId]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Store/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\Store;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author bigface <saybye720@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['store'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/SubscribeMessage/Client.php",
    "content": "<?php\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\SubscribeMessage;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse ReflectionClass;\n\n/**\n * Class Client.\n *\n * @author tegic <teg1c@foxmail.com>\n */\nclass Client extends BaseClient\n{\n    protected $message = [\n        'touser' => '',\n        'template_id' => '',\n        'page' => '',\n        'miniprogram' => '',\n        'data' => [],\n    ];\n\n    /**\n     * {@inheritdoc}.\n     */\n    protected $required = ['touser', 'template_id', 'data'];\n\n    /**\n     * Combine templates and add them to your personal template library under your account.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function addTemplate(string $tid, array $kidList, string $sceneDesc = null)\n    {\n        $sceneDesc = $sceneDesc ?? '';\n        $data = \\compact('tid', 'kidList', 'sceneDesc');\n\n        return $this->httpPost('wxaapi/newtmpl/addtemplate', $data);\n    }\n\n    /**\n     * Delete personal template under account.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deleteTemplate(string $id)\n    {\n        return $this->httpPost('wxaapi/newtmpl/deltemplate', ['priTmplId' => $id]);\n    }\n\n    /**\n     * Get the category of the applet account.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getCategory()\n    {\n        return $this->httpGet('wxaapi/newtmpl/getcategory');\n    }\n\n    /**\n     * Get keyword list under template title.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTemplateKeywords(string $tid)\n    {\n        return $this->httpGet('wxaapi/newtmpl/getpubtemplatekeywords', compact('tid'));\n    }\n\n    /**\n     * Get the title of the public template under the category to which the account belongs.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTemplateTitles(array $ids, int $start = 0, int $limit = 30)\n    {\n        $ids = \\implode(',', $ids);\n        $query = \\compact('ids', 'start', 'limit');\n\n        return $this->httpGet('wxaapi/newtmpl/getpubtemplatetitles', $query);\n    }\n\n    /**\n     * Get list of personal templates under the current account.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTemplates()\n    {\n        return $this->httpGet('wxaapi/newtmpl/gettemplate');\n    }\n\n    /**\n     * Send a subscribe message.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(array $data = [])\n    {\n        $params = $this->formatMessage($data);\n\n        $this->restoreMessage();\n\n        return $this->httpPostJson('cgi-bin/message/subscribe/bizsend', $params);\n    }\n\n    /**\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    protected function formatMessage(array $data = [])\n    {\n        $params = array_merge($this->message, $data);\n\n        foreach ($params as $key => $value) {\n            if (in_array($key, $this->required, true) && empty($value) && empty($this->message[$key])) {\n                throw new InvalidArgumentException(sprintf('Attribute \"%s\" can not be empty!', $key));\n            }\n\n            $params[$key] = empty($value) ? $this->message[$key] : $value;\n        }\n\n        foreach ($params['data'] as $key => $value) {\n            if (is_array($value)) {\n                if (\\array_key_exists('value', $value)) {\n                    $params['data'][$key] = ['value' => $value['value']];\n\n                    continue;\n                }\n\n                if (count($value) >= 1) {\n                    $value = [\n                        'value' => $value[0],\n//                        'color' => $value[1],// color unsupported\n                    ];\n                }\n            } else {\n                $value = [\n                    'value' => strval($value),\n                ];\n            }\n\n            $params['data'][$key] = $value;\n        }\n\n        return $params;\n    }\n\n    /**\n     * Restore message.\n     */\n    protected function restoreMessage()\n    {\n        $this->message = (new ReflectionClass(static::class))->getDefaultProperties()['message'];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/SubscribeMessage/ServiceProvider.php",
    "content": "<?php\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\SubscribeMessage;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['subscribe_message'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/TemplateMessage/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\TemplateMessage;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse ReflectionClass;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    public const API_SEND = 'cgi-bin/message/template/send';\n\n    /**\n     * Attributes.\n     *\n     * @var array\n     */\n    protected $message = [\n        'touser' => '',\n        'template_id' => '',\n        'url' => '',\n        'data' => [],\n        'miniprogram' => '',\n    ];\n\n    /**\n     * Required attributes.\n     *\n     * @var array\n     */\n    protected $required = ['touser', 'template_id'];\n\n    /**\n     * Set industry.\n     *\n     * @param int $industryOne\n     * @param int $industryTwo\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setIndustry($industryOne, $industryTwo)\n    {\n        $params = [\n            'industry_id1' => $industryOne,\n            'industry_id2' => $industryTwo,\n        ];\n\n        return $this->httpPostJson('cgi-bin/template/api_set_industry', $params);\n    }\n\n    /**\n     * Get industry.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getIndustry()\n    {\n        return $this->httpPostJson('cgi-bin/template/get_industry');\n    }\n\n    /**\n     * Add a template and get template ID.\n     *\n     * @param string $shortId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function addTemplate($shortId, $keywordList = [])\n    {\n        $params = ['template_id_short' => $shortId];\n\n        if ($keywordList) {\n            $params['keyword_name_list'] = $keywordList;\n        }\n\n        return $this->httpPostJson('cgi-bin/template/api_add_template', $params);\n    }\n\n    /**\n     * Get private templates.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getPrivateTemplates()\n    {\n        return $this->httpPostJson('cgi-bin/template/get_all_private_template');\n    }\n\n    /**\n     * Delete private template.\n     *\n     * @param string $templateId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deletePrivateTemplate($templateId)\n    {\n        $params = ['template_id' => $templateId];\n\n        return $this->httpPostJson('cgi-bin/template/del_private_template', $params);\n    }\n\n    /**\n     * Send a template message.\n     *\n     * @param array $data\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(array $data = [])\n    {\n        $params = $this->formatMessage($data);\n\n        $this->restoreMessage();\n\n        return $this->httpPostJson(static::API_SEND, $params);\n    }\n\n    /**\n     * Send template-message for subscription.\n     *\n     * @param array $data\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function sendSubscription(array $data = [])\n    {\n        $params = $this->formatMessage($data);\n\n        $this->restoreMessage();\n\n        return $this->httpPostJson('cgi-bin/message/template/subscribe', $params);\n    }\n\n    /**\n     * @param array $data\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    protected function formatMessage(array $data = [])\n    {\n        $params = array_merge($this->message, $data);\n\n        foreach ($params as $key => $value) {\n            if (in_array($key, $this->required, true) && empty($value) && empty($this->message[$key])) {\n                throw new InvalidArgumentException(sprintf('Attribute \"%s\" can not be empty!', $key));\n            }\n\n            $params[$key] = empty($value) ? $this->message[$key] : $value;\n        }\n\n        $params['data'] = $this->formatData($params['data'] ?? []);\n\n        return $params;\n    }\n\n    /**\n     * @param array $data\n     *\n     * @return array\n     */\n    protected function formatData(array $data)\n    {\n        $formatted = [];\n\n        foreach ($data as $key => $value) {\n            if (is_array($value)) {\n                if (\\array_key_exists('value', $value)) {\n                    $formatted[$key] = $value;\n\n                    continue;\n                }\n\n                if (count($value) >= 2) {\n                    $value = [\n                        'value' => $value[0],\n                        'color' => $value[1],\n                    ];\n                }\n            } else {\n                $value = [\n                    'value' => strval($value),\n                ];\n            }\n\n            $formatted[$key] = $value;\n        }\n\n        return $formatted;\n    }\n\n    /**\n     * Restore message.\n     */\n    protected function restoreMessage()\n    {\n        $this->message = (new ReflectionClass(static::class))->getDefaultProperties()['message'];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/TemplateMessage/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\TemplateMessage;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['template_message'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/User/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\User;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['user'] = function ($app) {\n            return new UserClient($app);\n        };\n\n        $app['user_tag'] = function ($app) {\n            return new TagClient($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/User/TagClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\User;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class TagClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass TagClient extends BaseClient\n{\n    /**\n     * Create tag.\n     *\n     * @param string $name\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(string $name)\n    {\n        $params = [\n            'tag' => ['name' => $name],\n        ];\n\n        return $this->httpPostJson('cgi-bin/tags/create', $params);\n    }\n\n    /**\n     * List all tags.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function list()\n    {\n        return $this->httpGet('cgi-bin/tags/get');\n    }\n\n    /**\n     * Update a tag name.\n     *\n     * @param int    $tagId\n     * @param string $name\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(int $tagId, string $name)\n    {\n        $params = [\n            'tag' => [\n                'id' => $tagId,\n                'name' => $name,\n            ],\n        ];\n\n        return $this->httpPostJson('cgi-bin/tags/update', $params);\n    }\n\n    /**\n     * Delete tag.\n     *\n     * @param int $tagId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(int $tagId)\n    {\n        $params = [\n            'tag' => ['id' => $tagId],\n        ];\n\n        return $this->httpPostJson('cgi-bin/tags/delete', $params);\n    }\n\n    /**\n     * Get user tags.\n     *\n     * @param string $openid\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function userTags(string $openid)\n    {\n        $params = ['openid' => $openid];\n\n        return $this->httpPostJson('cgi-bin/tags/getidlist', $params);\n    }\n\n    /**\n     * Get users from a tag.\n     *\n     * @param int    $tagId\n     * @param string $nextOpenId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function usersOfTag(int $tagId, string $nextOpenId = '')\n    {\n        $params = [\n            'tagid' => $tagId,\n            'next_openid' => $nextOpenId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/user/tag/get', $params);\n    }\n\n    /**\n     * Batch tag users.\n     *\n     * @param array $openids\n     * @param int   $tagId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function tagUsers(array $openids, int $tagId)\n    {\n        $params = [\n            'openid_list' => $openids,\n            'tagid' => $tagId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/tags/members/batchtagging', $params);\n    }\n\n    /**\n     * Untag users from a tag.\n     *\n     * @param array $openids\n     * @param int   $tagId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function untagUsers(array $openids, int $tagId)\n    {\n        $params = [\n            'openid_list' => $openids,\n            'tagid' => $tagId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/tags/members/batchuntagging', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/User/UserClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\User;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class UserClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass UserClient extends BaseClient\n{\n    /**\n     * Fetch a user by open id.\n     *\n     * @param string $openid\n     * @param string $lang\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function get(string $openid, string $lang = 'zh_CN')\n    {\n        $params = [\n            'openid' => $openid,\n            'lang' => $lang,\n        ];\n\n        return $this->httpGet('cgi-bin/user/info', $params);\n    }\n\n    /**\n     * Batch get users.\n     *\n     * @param array  $openids\n     * @param string $lang\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function select(array $openids, string $lang = 'zh_CN')\n    {\n        return $this->httpPostJson('cgi-bin/user/info/batchget', [\n            'user_list' => array_map(function ($openid) use ($lang) {\n                return [\n                    'openid' => $openid,\n                    'lang' => $lang,\n                ];\n            }, $openids),\n        ]);\n    }\n\n    /**\n     * List users.\n     *\n     * @param string $nextOpenId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function list(string $nextOpenId = null)\n    {\n        $params = ['next_openid' => $nextOpenId];\n\n        return $this->httpGet('cgi-bin/user/get', $params);\n    }\n\n    /**\n     * Set user remark.\n     *\n     * @param string $openid\n     * @param string $remark\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function remark(string $openid, string $remark)\n    {\n        $params = [\n            'openid' => $openid,\n            'remark' => $remark,\n        ];\n\n        return $this->httpPostJson('cgi-bin/user/info/updateremark', $params);\n    }\n\n    /**\n     * Get black list.\n     *\n     * @param string|null $beginOpenid\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function blacklist(string $beginOpenid = null)\n    {\n        $params = ['begin_openid' => $beginOpenid];\n\n        return $this->httpPostJson('cgi-bin/tags/members/getblacklist', $params);\n    }\n\n    /**\n     * Batch block user.\n     *\n     * @param array|string $openidList\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function block($openidList)\n    {\n        $params = ['openid_list' => (array) $openidList];\n\n        return $this->httpPostJson('cgi-bin/tags/members/batchblacklist', $params);\n    }\n\n    /**\n     * Batch unblock user.\n     *\n     * @param array $openidList\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function unblock($openidList)\n    {\n        $params = ['openid_list' => (array) $openidList];\n\n        return $this->httpPostJson('cgi-bin/tags/members/batchunblacklist', $params);\n    }\n\n    /**\n     * @param string $oldAppId\n     * @param array  $openidList\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function changeOpenid(string $oldAppId, array $openidList)\n    {\n        $params = [\n            'from_appid' => $oldAppId,\n            'openid_list' => $openidList,\n        ];\n\n        return $this->httpPostJson('cgi-bin/changeopenid', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/WiFi/CardClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\WiFi;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class CardClient.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass CardClient extends BaseClient\n{\n    /**\n     * Set shop card coupon delivery information.\n     *\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function set(array $data)\n    {\n        return $this->httpPostJson('bizwifi/couponput/set', $data);\n    }\n\n    /**\n     * Get shop card coupon delivery information.\n     *\n     * @param int $shopId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(int $shopId = 0)\n    {\n        return $this->httpPostJson('bizwifi/couponput/get', ['shop_id' => $shopId]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/WiFi/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\WiFi;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get Wi-Fi statistics.\n     *\n     * @param string $beginDate\n     * @param string $endDate\n     * @param int    $shopId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function summary(string $beginDate, string $endDate, int $shopId = -1)\n    {\n        $data = [\n            'begin_date' => $beginDate,\n            'end_date' => $endDate,\n            'shop_id' => $shopId,\n        ];\n\n        return $this->httpPostJson('bizwifi/statistics/list', $data);\n    }\n\n    /**\n     * Get the material QR code.\n     *\n     * @param int    $shopId\n     * @param string $ssid\n     * @param int    $type\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getQrCodeUrl(int $shopId, string $ssid, int $type = 0)\n    {\n        $data = [\n            'shop_id' => $shopId,\n            'ssid' => $ssid,\n            'img_id' => $type,\n        ];\n\n        return $this->httpPostJson('bizwifi/qrcode/get', $data);\n    }\n\n    /**\n     * Wi-Fi completion page jump applet.\n     *\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setFinishPage(array $data)\n    {\n        return $this->httpPostJson('bizwifi/finishpage/set', $data);\n    }\n\n    /**\n     * Set the top banner jump applet.\n     *\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setHomePage(array $data)\n    {\n        return $this->httpPostJson('bizwifi/homepage/set', $data);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/WiFi/DeviceClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\WiFi;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class DeviceClient.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass DeviceClient extends BaseClient\n{\n    /**\n     * Add a password device.\n     *\n     * @param int    $shopId\n     * @param string $ssid\n     * @param string $password\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function addPasswordDevice(int $shopId, string $ssid, string $password)\n    {\n        $data = [\n            'shop_id' => $shopId,\n            'ssid' => $ssid,\n            'password' => $password,\n        ];\n\n        return $this->httpPostJson('bizwifi/device/add', $data);\n    }\n\n    /**\n     * Add a portal device.\n     *\n     * @param int    $shopId\n     * @param string $ssid\n     * @param bool   $reset\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function addPortalDevice(int $shopId, string $ssid, bool $reset = false)\n    {\n        $data = [\n            'shop_id' => $shopId,\n            'ssid' => $ssid,\n            'reset' => $reset,\n        ];\n\n        return $this->httpPostJson('bizwifi/apportal/register', $data);\n    }\n\n    /**\n     * Delete device by MAC address.\n     *\n     * @param string $macAddress\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $macAddress)\n    {\n        return $this->httpPostJson('bizwifi/device/delete', ['bssid' => $macAddress]);\n    }\n\n    /**\n     * Get a list of devices.\n     *\n     * @param int $page\n     * @param int $size\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(int $page = 1, int $size = 10)\n    {\n        $data = [\n            'pageindex' => $page,\n            'pagesize' => $size,\n        ];\n\n        return $this->httpPostJson('bizwifi/device/list', $data);\n    }\n\n    /**\n     * Get a list of devices by shop ID.\n     *\n     * @param int $shopId\n     * @param int $page\n     * @param int $size\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function listByShopId(int $shopId, int $page = 1, int $size = 10)\n    {\n        $data = [\n            'shop_id' => $shopId,\n            'pageindex' => $page,\n            'pagesize' => $size,\n        ];\n\n        return $this->httpPostJson('bizwifi/device/list', $data);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/WiFi/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\WiFi;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function register(Container $app)\n    {\n        $app['wifi'] = function ($app) {\n            return new Client($app);\n        };\n\n        $app['wifi_card'] = function ($app) {\n            return new CardClient($app);\n        };\n\n        $app['wifi_device'] = function ($app) {\n            return new DeviceClient($app);\n        };\n\n        $app['wifi_shop'] = function ($app) {\n            return new ShopClient($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/WiFi/ShopClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OfficialAccount\\WiFi;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class ShopClient.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass ShopClient extends BaseClient\n{\n    /**\n     * Get shop Wi-Fi information.\n     *\n     * @param int $shopId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(int $shopId)\n    {\n        return $this->httpPostJson('bizwifi/shop/get', ['shop_id' => $shopId]);\n    }\n\n    /**\n     * Get a list of Wi-Fi shops.\n     *\n     * @param int $page\n     * @param int $size\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(int $page = 1, int $size = 10)\n    {\n        $data = [\n            'pageindex' => $page,\n            'pagesize' => $size,\n        ];\n\n        return $this->httpPostJson('bizwifi/shop/list', $data);\n    }\n\n    /**\n     * Update shop Wi-Fi information.\n     *\n     * @param int   $shopId\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(int $shopId, array $data)\n    {\n        $data = array_merge(['shop_id' => $shopId], $data);\n\n        return $this->httpPostJson('bizwifi/shop/update', $data);\n    }\n\n    /**\n     * Clear shop network and equipment.\n     *\n     * @param int         $shopId\n     * @param string|null $ssid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function clearDevice(int $shopId, string $ssid = null)\n    {\n        $data = [\n            'shop_id' => $shopId,\n        ];\n\n        if (!is_null($ssid)) {\n            $data['ssid'] = $ssid;\n        }\n\n        return $this->httpPostJson('bizwifi/shop/clean', $data);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Application.php",
    "content": "<?php\n\nnamespace EasyWeChat\\OpenPlatform;\n\nuse EasyWeChat\\Kernel\\ServiceContainer;\nuse EasyWeChat\\Kernel\\Traits\\ResponseCastable;\nuse EasyWeChat\\MiniProgram\\Encryptor;\nuse EasyWeChat\\OpenPlatform\\Authorizer\\Auth\\AccessToken;\nuse EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Application as MiniProgram;\nuse EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Auth\\Client;\nuse EasyWeChat\\OpenPlatform\\Authorizer\\OfficialAccount\\Account\\Client as AccountClient;\nuse EasyWeChat\\OpenPlatform\\Authorizer\\OfficialAccount\\Application as OfficialAccount;\nuse EasyWeChat\\OpenPlatform\\Authorizer\\Server\\Guard;\n\nuse function EasyWeChat\\Kernel\\data_get;\n\n/**\n * @property \\EasyWeChat\\OpenPlatform\\Server\\Guard        $server\n * @property \\EasyWeChat\\OpenPlatform\\Auth\\AccessToken    $access_token\n * @property \\EasyWeChat\\OpenPlatform\\CodeTemplate\\Client $code_template\n * @property \\EasyWeChat\\OpenPlatform\\Component\\Client    $component\n *\n * @method mixed handleAuthorize(string $authCode = null)\n * @method mixed getAuthorizer(string $appId)\n * @method mixed getAuthorizerOption(string $appId, string $name)\n * @method mixed setAuthorizerOption(string $appId, string $name, string $value)\n * @method mixed getAuthorizers(int $offset = 0, int $count = 500)\n * @method mixed createPreAuthorizationCode()\n */\nclass Application extends ServiceContainer\n{\n    use ResponseCastable;\n\n    /**\n     * @var array\n     */\n    protected $providers = [\n        Auth\\ServiceProvider::class,\n        Base\\ServiceProvider::class,\n        Server\\ServiceProvider::class,\n        CodeTemplate\\ServiceProvider::class,\n        Component\\ServiceProvider::class,\n    ];\n\n    /**\n     * @var array\n     */\n    protected $defaultConfig = [\n        'http' => [\n            'timeout' => 5.0,\n            'base_uri' => 'https://api.weixin.qq.com/',\n        ],\n    ];\n\n    /**\n     * Creates the officialAccount application.\n     *\n     * @param  string                                                     $appId\n     * @param  string|null                                                $refreshToken\n     * @param  \\EasyWeChat\\OpenPlatform\\Authorizer\\Auth\\AccessToken|null  $accessToken\n     *\n     * @return \\EasyWeChat\\OpenPlatform\\Authorizer\\OfficialAccount\\Application\n     */\n    public function officialAccount(\n        string $appId,\n        string $refreshToken = null,\n        AccessToken $accessToken = null\n    ): OfficialAccount {\n        $application = new OfficialAccount(\n            $this->getAuthorizerConfig($appId, $refreshToken),\n            $this->getReplaceServices($accessToken) + [\n                'encryptor' => $this['encryptor'],\n\n                'account' => function ($app) {\n                    return new AccountClient($app, $this);\n                },\n            ]\n        );\n\n        $application->extend(\n            'oauth',\n            function ($socialite) {\n                /* @var \\Overtrue\\Socialite\\Providers\\WeChat $socialite */\n                $socialite->withComponent(\n                    [\n                        'id' => $this['config']['app_id'],\n                        'token' => fn () => $this['access_token']->getToken()['component_access_token'],\n                    ]\n                );\n\n                return $socialite;\n            }\n        );\n\n        return $application;\n    }\n\n    /**\n     * Creates the miniProgram application.\n     *\n     * @param  string                                                     $appId\n     * @param  string|null                                                $refreshToken\n     * @param  \\EasyWeChat\\OpenPlatform\\Authorizer\\Auth\\AccessToken|null  $accessToken\n     *\n     * @return \\EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Application\n     */\n    public function miniProgram(\n        string $appId,\n        string $refreshToken = null,\n        AccessToken $accessToken = null\n    ): MiniProgram {\n        return new MiniProgram(\n            $this->getAuthorizerConfig($appId, $refreshToken),\n            $this->getReplaceServices($accessToken) + [\n                'encryptor' => function () {\n                    return new Encryptor(\n                        $this['config']['app_id'],\n                        $this['config']['token'],\n                        $this['config']['aes_key']\n                    );\n                },\n\n                'auth' => function ($app) {\n                    return new Client($app, $this);\n                },\n            ]\n        );\n    }\n\n    /**\n     * Return the pre-authorization login page url.\n     *\n     * @param  string             $callbackUrl\n     * @param  string|array|null  $optional\n     *\n     * @return string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function getPreAuthorizationUrl(string $callbackUrl, $optional = []): string\n    {\n        // 兼容旧版 API 设计\n        if (\\is_string($optional)) {\n            $optional = [\n                'pre_auth_code' => $optional,\n            ];\n        } else {\n            $optional['pre_auth_code'] = data_get($this->createPreAuthorizationCode(), 'pre_auth_code');\n        }\n\n        $queries = \\array_merge(\n            $optional,\n            [\n                'component_appid' => $this['config']['app_id'],\n                'redirect_uri' => $callbackUrl,\n            ]\n        );\n\n        return 'https://mp.weixin.qq.com/cgi-bin/componentloginpage?'.http_build_query($queries);\n    }\n\n    /**\n     * Return the pre-authorization login page url (mobile).\n     *\n     * @param  string             $callbackUrl\n     * @param  string|array|null  $optional\n     *\n     * @return string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    public function getMobilePreAuthorizationUrl(string $callbackUrl, $optional = []): string\n    {\n        // 兼容旧版 API 设计\n        if (\\is_string($optional)) {\n            $optional = [\n                'pre_auth_code' => $optional,\n            ];\n        } else {\n            $optional['pre_auth_code'] = data_get($this->createPreAuthorizationCode(), 'pre_auth_code');\n        }\n\n        $queries = \\array_merge(\n            ['auth_type' => 3],\n            $optional,\n            [\n                'component_appid' => $this['config']['app_id'],\n                'redirect_uri' => $callbackUrl,\n                'action' => 'bindcomponent',\n                'no_scan' => 1,\n            ]\n        );\n\n        return 'https://mp.weixin.qq.com/safe/bindcomponent?'.http_build_query($queries).'#wechat_redirect';\n    }\n\n    /**\n     * @param  string       $appId\n     * @param  string|null  $refreshToken\n     *\n     * @return array\n     */\n    protected function getAuthorizerConfig(string $appId, string $refreshToken = null): array\n    {\n        return $this['config']->merge(\n            [\n                'component_app_id' => $this['config']['app_id'],\n                'component_app_token' => $this['access_token']->getToken()['component_access_token'],\n                'app_id' => $appId,\n                'refresh_token' => $refreshToken,\n            ]\n        )->toArray();\n    }\n\n    /**\n     * @param  \\EasyWeChat\\OpenPlatform\\Authorizer\\Auth\\AccessToken|null  $accessToken\n     *\n     * @return array\n     */\n    protected function getReplaceServices(AccessToken $accessToken = null): array\n    {\n        $services = [\n            'access_token' => $accessToken ?: function ($app) {\n                return new AccessToken($app, $this);\n            },\n\n            'server' => function ($app) {\n                return new Guard($app);\n            },\n        ];\n\n        foreach (['cache', 'http_client', 'log', 'logger', 'request'] as $reuse) {\n            if (isset($this[$reuse])) {\n                $services[$reuse] = $this[$reuse];\n            }\n        }\n\n        return $services;\n    }\n\n    /**\n     * Handle dynamic calls.\n     *\n     * @param  string  $method\n     * @param  array   $args\n     *\n     * @return mixed\n     */\n    public function __call($method, $args)\n    {\n        return $this->base->$method(...$args);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Auth/AccessToken.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Auth;\n\nuse EasyWeChat\\Kernel\\AccessToken as BaseAccessToken;\n\n/**\n * Class AccessToken.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass AccessToken extends BaseAccessToken\n{\n    /**\n     * @var string\n     */\n    protected $requestMethod = 'POST';\n\n    /**\n     * @var string\n     */\n    protected $tokenKey = 'component_access_token';\n\n    /**\n     * @var string\n     */\n    protected $endpointToGetToken = 'cgi-bin/component/api_component_token';\n\n    /**\n     * @return array\n     */\n    protected function getCredentials(): array\n    {\n        return [\n            'component_appid' => $this->app['config']['app_id'],\n            'component_appsecret' => $this->app['config']['secret'],\n            'component_verify_ticket' => $this->app['verify_ticket']->getTicket(),\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Auth/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Auth;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['verify_ticket'] = function ($app) {\n            return new VerifyTicket($app);\n        };\n\n        $app['access_token'] = function ($app) {\n            return new AccessToken($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Auth/VerifyTicket.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Auth;\n\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Traits\\InteractsWithCache;\nuse EasyWeChat\\OpenPlatform\\Application;\n\n/**\n * Class VerifyTicket.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass VerifyTicket\n{\n    use InteractsWithCache;\n\n    /**\n     * @var \\EasyWeChat\\OpenPlatform\\Application\n     */\n    protected $app;\n\n    /**\n     * Constructor.\n     *\n     * @param \\EasyWeChat\\OpenPlatform\\Application $app\n     */\n    public function __construct(Application $app)\n    {\n        $this->app = $app;\n    }\n\n    /**\n     * Put the credential `component_verify_ticket` in cache.\n     *\n     * @param string $ticket\n     *\n     * @return $this\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function setTicket(string $ticket)\n    {\n        $this->getCache()->set($this->getCacheKey(), $ticket, 3600);\n\n        if (!$this->getCache()->has($this->getCacheKey())) {\n            throw new RuntimeException('Failed to cache verify ticket.');\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get the credential `component_verify_ticket` from cache.\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function getTicket(): string\n    {\n        if ($cached = $this->getCache()->get($this->getCacheKey())) {\n            return $cached;\n        }\n\n        throw new RuntimeException('Credential \"component_verify_ticket\" does not exist in cache.');\n    }\n\n    /**\n     * Get cache key.\n     *\n     * @return string\n     */\n    protected function getCacheKey(): string\n    {\n        return 'easywechat.open_platform.verify_ticket.'.$this->app['config']['app_id'];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/Aggregate/Account/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\Aggregate\\Account;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author Scholer <scholer_l@live.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 创建开放平台帐号并绑定公众号/小程序.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create()\n    {\n        $params = [\n            'appid' => $this->app['config']['app_id'],\n        ];\n\n        return $this->httpPostJson('cgi-bin/open/create', $params);\n    }\n\n    /**\n     * 将公众号/小程序绑定到开放平台帐号下.\n     *\n     * @param string $openAppId 开放平台帐号appid\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function bindTo(string $openAppId)\n    {\n        $params = [\n            'appid' => $this->app['config']['app_id'],\n            'open_appid' => $openAppId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/open/bind', $params);\n    }\n\n    /**\n     * 将公众号/小程序从开放平台帐号下解绑.\n     *\n     * @param string $openAppId 开放平台帐号appid\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function unbindFrom(string $openAppId)\n    {\n        $params = [\n            'appid' => $this->app['config']['app_id'],\n            'open_appid' => $openAppId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/open/unbind', $params);\n    }\n\n    /**\n     * 获取公众号/小程序所绑定的开放平台帐号.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getBinding()\n    {\n        $params = [\n            'appid' => $this->app['config']['app_id'],\n        ];\n\n        return $this->httpPostJson('cgi-bin/open/get', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/Aggregate/AggregateServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\Aggregate;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass AggregateServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/Auth/AccessToken.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\Auth;\n\nuse EasyWeChat\\Kernel\\AccessToken as BaseAccessToken;\nuse EasyWeChat\\OpenPlatform\\Application;\nuse Pimple\\Container;\n\n/**\n * Class AccessToken.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass AccessToken extends BaseAccessToken\n{\n    /**\n     * @var string\n     */\n    protected $requestMethod = 'POST';\n\n    /**\n     * @var string\n     */\n    protected $queryName = 'access_token';\n\n    /**\n     * {@inheritdoc}.\n     */\n    protected $tokenKey = 'authorizer_access_token';\n\n    /**\n     * @var \\EasyWeChat\\OpenPlatform\\Application\n     */\n    protected $component;\n\n    /**\n     * AuthorizerAccessToken constructor.\n     *\n     * @param \\Pimple\\Container                    $app\n     * @param \\EasyWeChat\\OpenPlatform\\Application $component\n     */\n    public function __construct(Container $app, Application $component)\n    {\n        parent::__construct($app);\n\n        $this->component = $component;\n    }\n\n    /**\n     * {@inheritdoc}.\n     */\n    protected function getCredentials(): array\n    {\n        return [\n            'component_appid' => $this->component['config']['app_id'],\n            'authorizer_appid' => $this->app['config']['app_id'],\n            'authorizer_refresh_token' => $this->app['config']['refresh_token'],\n        ];\n    }\n\n    /**\n     * @return string\n     */\n    public function getEndpoint(): string\n    {\n        return 'cgi-bin/component/api_authorizer_token?'.http_build_query([\n            'component_access_token' => $this->component['access_token']->getToken()['component_access_token'],\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Account/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Account;\n\nuse EasyWeChat\\OpenPlatform\\Authorizer\\Aggregate\\Account\\Client as BaseClient;\n\n/**\n * Class Client.\n *\n * @author ClouderSky <clouder.flow@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取账号基本信息.\n     */\n    public function getBasicInfo()\n    {\n        return $this->httpPostJson('cgi-bin/account/getaccountbasicinfo');\n    }\n\n    /**\n     * 修改头像.\n     *\n     * @param string $mediaId 头像素材mediaId\n     * @param string $left    剪裁框左上角x坐标（取值范围：[0, 1]）\n     * @param string $top     剪裁框左上角y坐标（取值范围：[0, 1]）\n     * @param string $right   剪裁框右下角x坐标（取值范围：[0, 1]）\n     * @param string $bottom  剪裁框右下角y坐标（取值范围：[0, 1]）\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateAvatar(\n        string $mediaId,\n        $left = '0.0',\n        $top = '0.0',\n        $right = '1.0',\n        $bottom = '1.0'\n    ) {\n        $params = [\n            'head_img_media_id' => $mediaId,\n            'x1' => \\strval($left),\n            'y1' => \\strval($top),\n            'x2' => \\strval($right),\n            'y2' => \\strval($bottom),\n        ];\n\n        return $this->httpPostJson('cgi-bin/account/modifyheadimage', $params);\n    }\n\n    /**\n     * 修改功能介绍.\n     *\n     * @param string $signature 功能介绍（简介）\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateSignature(string $signature)\n    {\n        $params = ['signature' => $signature];\n\n        return $this->httpPostJson('cgi-bin/account/modifysignature', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Account/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Account;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['account'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram;\n\nuse EasyWeChat\\MiniProgram\\Application as MiniProgram;\nuse EasyWeChat\\OpenPlatform\\Authorizer\\Aggregate\\AggregateServiceProvider;\n\n/**\n * Class Application.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n *\n * @property \\EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Account\\Client  $account\n * @property \\EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Code\\Client     $code\n * @property \\EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Domain\\Client   $domain\n * @property \\EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Setting\\Client  $setting\n * @property \\EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Tester\\Client   $tester\n * @property \\EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Material\\Client $material\n */\nclass Application extends MiniProgram\n{\n    /**\n     * Application constructor.\n     *\n     * @param array $config\n     * @param array $prepends\n     */\n    public function __construct(array $config = [], array $prepends = [])\n    {\n        parent::__construct($config, $prepends);\n\n        $providers = [\n            AggregateServiceProvider::class,\n            Code\\ServiceProvider::class,\n            Domain\\ServiceProvider::class,\n            Account\\ServiceProvider::class,\n            Setting\\ServiceProvider::class,\n            Tester\\ServiceProvider::class,\n            Material\\ServiceProvider::class,\n            Privacy\\ServiceProvider::class,\n            Security\\ServiceProvider::class,\n        ];\n\n        foreach ($providers as $provider) {\n            $this->register(new $provider());\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Auth/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Auth;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\ServiceContainer;\nuse EasyWeChat\\OpenPlatform\\Application;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @var \\EasyWeChat\\OpenPlatform\\Application\n     */\n    protected $component;\n\n    /**\n     * Client constructor.\n     *\n     * @param \\EasyWeChat\\Kernel\\ServiceContainer  $app\n     * @param \\EasyWeChat\\OpenPlatform\\Application $component\n     */\n    public function __construct(ServiceContainer $app, Application $component)\n    {\n        parent::__construct($app);\n\n        $this->component = $component;\n    }\n\n    /**\n     * Get session info by code.\n     *\n     * @param string $code\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function session(string $code)\n    {\n        $params = [\n            'appid' => $this->app['config']['app_id'],\n            'js_code' => $code,\n            'grant_type' => 'authorization_code',\n            'component_appid' => $this->component['config']['app_id'],\n            'component_access_token' => $this->component['access_token']->getToken()['component_access_token'],\n        ];\n\n        return $this->httpGet('sns/component/jscode2session', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Code/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Code;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @param int    $templateId\n     * @param string $extJson\n     * @param string $version\n     * @param string $description\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function commit(int $templateId, string $extJson, string $version, string $description)\n    {\n        return $this->httpPostJson('wxa/commit', [\n            'template_id' => $templateId,\n            'ext_json' => $extJson,\n            'user_version' => $version,\n            'user_desc' => $description,\n        ]);\n    }\n\n    /**\n     * @param string|null $path\n     *\n     * @return \\EasyWeChat\\Kernel\\Http\\Response\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getQrCode(string $path = null)\n    {\n        return $this->requestRaw('wxa/get_qrcode', 'GET', [\n            'query' => ['path' => $path],\n        ]);\n    }\n\n    /**\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getCategory()\n    {\n        return $this->httpGet('wxa/get_category');\n    }\n\n    /**\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getPage()\n    {\n        return $this->httpGet('wxa/get_page');\n    }\n\n    /**\n     * @param array $data\n     * @param string|null $feedbackInfo\n     * @param string|null $feedbackStuff\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function submitAudit(array $data, string $feedbackInfo = null, string $feedbackStuff = null)\n    {\n        if (isset($data['item_list'])) {\n            return $this->httpPostJson('wxa/submit_audit', $data);\n        }\n\n        return $this->httpPostJson('wxa/submit_audit', [\n            'item_list' => $data,\n            'feedback_info' => $feedbackInfo,\n            'feedback_stuff' => $feedbackStuff,\n        ]);\n    }\n\n    /**\n     * @param int $auditId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getAuditStatus(int $auditId)\n    {\n        return $this->httpPostJson('wxa/get_auditstatus', [\n            'auditid' => $auditId,\n        ]);\n    }\n\n    /**\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getLatestAuditStatus()\n    {\n        return $this->httpGet('wxa/get_latest_auditstatus');\n    }\n\n    /**\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function release()\n    {\n        return $this->httpPostJson('wxa/release');\n    }\n\n    /**\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function withdrawAudit()\n    {\n        return $this->httpGet('wxa/undocodeaudit');\n    }\n\n    /**\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function rollbackRelease()\n    {\n        return $this->httpGet('wxa/revertcoderelease');\n    }\n\n    /**\n     * @param string $action\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function changeVisitStatus(string $action)\n    {\n        return $this->httpPostJson('wxa/change_visitstatus', [\n            'action' => $action,\n        ]);\n    }\n\n    /**\n     * 分阶段发布.\n     *\n     * @param int $grayPercentage\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function grayRelease(int $grayPercentage)\n    {\n        return $this->httpPostJson('wxa/grayrelease', [\n            'gray_percentage' => $grayPercentage,\n        ]);\n    }\n\n    /**\n     * 取消分阶段发布.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function revertGrayRelease()\n    {\n        return $this->httpGet('wxa/revertgrayrelease');\n    }\n\n    /**\n     * 查询当前分阶段发布详情.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getGrayRelease()\n    {\n        return $this->httpGet('wxa/getgrayreleaseplan');\n    }\n\n    /**\n     * 查询当前设置的最低基础库版本及各版本用户占比.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getSupportVersion()\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/getweappsupportversion');\n    }\n\n    /**\n     * 设置最低基础库版本.\n     *\n     * @param string $version\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setSupportVersion(string $version)\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/setweappsupportversion', [\n            'version' => $version,\n        ]);\n    }\n\n    /**\n     * 查询服务商的当月提审限额（quota）和加急次数.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function queryQuota()\n    {\n        return $this->httpGet('wxa/queryquota');\n    }\n\n    /**\n     * 加急审核申请.\n     *\n     * @param int $auditId 审核单ID\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function speedupAudit(int $auditId)\n    {\n        return $this->httpPostJson('wxa/speedupaudit', [\n            'auditid' => $auditId,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Code/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Code;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['code'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Domain/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Domain;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function modify(array $params)\n    {\n        return $this->httpPostJson('wxa/modify_domain', $params);\n    }\n\n    /**\n     * 设置小程序业务域名.\n     *\n     * @param array  $domains\n     * @param string $action\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setWebviewDomain(array $domains, $action = 'add')\n    {\n        return $this->httpPostJson('wxa/setwebviewdomain', [\n            'action' => $action,\n            'webviewdomain' => $domains,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Domain/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Domain;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['domain'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Material/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Material;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Http\\StreamResponse;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Allow media type.\n     *\n     * @var array\n     */\n    protected $allowTypes = ['image', 'voice', 'video', 'thumb', 'news_image'];\n\n    /**\n     * Fetch material.\n     *\n     * @param string $mediaId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $mediaId)\n    {\n        $response = $this->requestRaw('cgi-bin/material/get_material', 'POST', ['json' => ['media_id' => $mediaId]]);\n\n        if (false !== stripos($response->getHeaderLine('Content-disposition'), 'attachment')) {\n            return StreamResponse::buildFromPsrResponse($response);\n        }\n\n        return $this->castResponseToType($response, $this->app['config']->get('response_type'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Material/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\n/**\n * ServiceProvider.php.\n *\n * This file is part of the wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Material;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['material'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Privacy/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Privacy;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class Client.\n *\n * @author lujunyi <lujunyi@shopex.cn>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 查询小程序用户隐私保护指引.\n     */\n    public function get()\n    {\n        return $this->httpPostJson('cgi-bin/component/getprivacysetting', []);\n    }\n\n    /**\n     * 配置小程序用户隐私保护指引\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function set(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/component/setprivacysetting', $params);\n    }\n\n    /**\n     * 上传小程序用户隐私保护指引\n     *\n     * @param string $path\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\MicroMerchant\\Kernel\\Exceptions\\InvalidSignException\n     */\n    public function upload(string $path)\n    {\n        if (!file_exists($path) || !is_readable($path)) {\n            throw new InvalidArgumentException(sprintf(\"File does not exist, or the file is unreadable: '%s'\", $path));\n        }\n\n        return $this->httpUpload('cgi-bin/component/uploadprivacyextfile', ['file' => $path]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Privacy/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Privacy;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['privacy'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Security/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Security;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author lujunyi <lujunyi@shopex.cn>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取隐私接口列表.\n     */\n    public function get()\n    {\n        return $this->httpGet('wxa/security/get_privacy_interface');\n    }\n\n    /**\n     * 申请隐私接口\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function set(array $params)\n    {\n        return $this->httpPostJson('wxa/security/apply_privacy_interface', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Security/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Security;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['security'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Setting/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Setting;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author ClouderSky <clouder.flow@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取账号可以设置的所有类目.\n     */\n    public function getAllCategories()\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/getallcategories');\n    }\n\n    /**\n     * 添加类目.\n     *\n     * @param array $categories 类目数组\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function addCategories(array $categories)\n    {\n        $params = ['categories' => $categories];\n\n        return $this->httpPostJson('cgi-bin/wxopen/addcategory', $params);\n    }\n\n    /**\n     * 删除类目.\n     *\n     * @param int $firstId  一级类目ID\n     * @param int $secondId 二级类目ID\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deleteCategories(int $firstId, int $secondId)\n    {\n        $params = ['first' => $firstId, 'second' => $secondId];\n\n        return $this->httpPostJson('cgi-bin/wxopen/deletecategory', $params);\n    }\n\n    /**\n     * 获取账号已经设置的所有类目.\n     */\n    public function getCategories()\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/getcategory');\n    }\n\n    /**\n     * 修改类目.\n     *\n     * @param array $category 单个类目\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateCategory(array $category)\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/modifycategory', $category);\n    }\n\n    /**\n     * 小程序名称设置及改名.\n     *\n     * @param string $nickname       昵称\n     * @param string $idCardMediaId  身份证照片素材ID\n     * @param string $licenseMediaId 组织机构代码证或营业执照素材ID\n     * @param array  $otherStuffs    其他证明材料素材ID\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setNickname(\n        string $nickname,\n        string $idCardMediaId = '',\n        string $licenseMediaId = '',\n        array $otherStuffs = []\n    ) {\n        $params = [\n            'nick_name' => $nickname,\n            'id_card' => $idCardMediaId,\n            'license' => $licenseMediaId,\n        ];\n\n        for ($i = \\count($otherStuffs) - 1; $i >= 0; --$i) {\n            $params['naming_other_stuff_'.($i + 1)] = $otherStuffs[$i];\n        }\n\n        return $this->httpPostJson('wxa/setnickname', $params);\n    }\n\n    /**\n     * 小程序改名审核状态查询.\n     *\n     * @param int $auditId 审核单id\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getNicknameAuditStatus($auditId)\n    {\n        $params = ['audit_id' => $auditId];\n\n        return $this->httpPostJson('wxa/api_wxa_querynickname', $params);\n    }\n\n    /**\n     * 微信认证名称检测.\n     *\n     * @param string $nickname 名称（昵称）\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function isAvailableNickname($nickname)\n    {\n        $params = ['nick_name' => $nickname];\n\n        return $this->httpPostJson(\n            'cgi-bin/wxverify/checkwxverifynickname',\n            $params\n        );\n    }\n\n    /**\n     * 查询小程序是否可被搜索.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getSearchStatus()\n    {\n        return $this->httpGet('wxa/getwxasearchstatus');\n    }\n\n    /**\n     * 设置小程序可被搜素.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setSearchable()\n    {\n        return $this->httpPostJson('wxa/changewxasearchstatus', [\n            'status' => 0,\n        ]);\n    }\n\n    /**\n     * 设置小程序不可被搜素.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setUnsearchable()\n    {\n        return $this->httpPostJson('wxa/changewxasearchstatus', [\n            'status' => 1,\n        ]);\n    }\n\n    /**\n     * 获取展示的公众号信息.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getDisplayedOfficialAccount()\n    {\n        return $this->httpGet('wxa/getshowwxaitem');\n    }\n\n    /**\n     * 设置展示的公众号.\n     *\n     * @param string|bool $appid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setDisplayedOfficialAccount($appid)\n    {\n        return $this->httpPostJson('wxa/updateshowwxaitem', [\n            'appid' => $appid ?: null,\n            'wxa_subscribe_biz_flag' => $appid ? 1 : 0,\n        ]);\n    }\n\n    /**\n     * 获取可以用来设置的公众号列表.\n     *\n     * @param int $page\n     * @param int $num\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getDisplayableOfficialAccounts(int $page, int $num)\n    {\n        return $this->httpGet('wxa/getwxamplinkforshow', [\n            'page' => $page,\n            'num' => $num,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Setting/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Setting;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['setting'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Tester/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Tester;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author caikeal <caiyuezhang@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 绑定小程序体验者.\n     *\n     * @param string $wechatId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function bind(string $wechatId)\n    {\n        return $this->httpPostJson('wxa/bind_tester', [\n            'wechatid' => $wechatId,\n        ]);\n    }\n\n    /**\n     * 解绑小程序体验者.\n     *\n     * @param string $wechatId\n     * @param string $userStr\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function unbind(string $wechatId = null, string $userStr = null)\n    {\n        return $this->httpPostJson('wxa/unbind_tester', [\n                ($userStr ? 'userstr' : 'wechatid') => $userStr ?? $wechatId,\n            ]);\n    }\n\n    public function unbindWithUserStr(string $userStr)\n    {\n        return $this->httpPostJson('wxa/unbind_tester', [\n                'userstr' => $userStr,\n            ]);\n    }\n\n    /**\n     * 获取体验者列表.\n     *\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list()\n    {\n        return $this->httpPostJson('wxa/memberauth', [\n            'action' => 'get_experiencer',\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Tester/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\MiniProgram\\Tester;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['tester'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/OfficialAccount/Account/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\OfficialAccount\\Account;\n\nuse EasyWeChat\\Kernel\\ServiceContainer;\nuse EasyWeChat\\OpenPlatform\\Application;\nuse EasyWeChat\\OpenPlatform\\Authorizer\\Aggregate\\Account\\Client as BaseClient;\n\n/**\n * Class Client.\n *\n * @author Keal <caiyuezhang@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @var \\EasyWeChat\\OpenPlatform\\Application\n     */\n    protected $component;\n\n    /**\n     * Client constructor.\n     *\n     * @param \\EasyWeChat\\Kernel\\ServiceContainer  $app\n     * @param \\EasyWeChat\\OpenPlatform\\Application $component\n     */\n    public function __construct(ServiceContainer $app, Application $component)\n    {\n        parent::__construct($app);\n\n        $this->component = $component;\n    }\n\n    /**\n     * 从第三方平台跳转至微信公众平台授权注册页面, 授权注册小程序.\n     *\n     * @param string $callbackUrl\n     * @param bool   $copyWxVerify\n     *\n     * @return string\n     */\n    public function getFastRegistrationUrl(string $callbackUrl, bool $copyWxVerify = true): string\n    {\n        $queries = [\n            'copy_wx_verify' => $copyWxVerify,\n            'component_appid' => $this->component['config']['app_id'],\n            'appid' => $this->app['config']['app_id'],\n            'redirect_uri' => $callbackUrl,\n        ];\n\n        return 'https://mp.weixin.qq.com/cgi-bin/fastregisterauth?'.http_build_query($queries);\n    }\n\n    /**\n     * 小程序快速注册.\n     *\n     * @param string $ticket\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function register(string $ticket)\n    {\n        $params = [\n            'ticket' => $ticket,\n        ];\n\n        return $this->httpPostJson('cgi-bin/account/fastregister', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/OfficialAccount/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\OfficialAccount;\n\nuse EasyWeChat\\OfficialAccount\\Application as OfficialAccount;\nuse EasyWeChat\\OpenPlatform\\Authorizer\\Aggregate\\AggregateServiceProvider;\n\n/**\n * Class Application.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n *\n * @property \\EasyWeChat\\OpenPlatform\\Authorizer\\OfficialAccount\\Account\\Client     $account\n * @property \\EasyWeChat\\OpenPlatform\\Authorizer\\OfficialAccount\\MiniProgram\\Client $mini_program\n */\nclass Application extends OfficialAccount\n{\n    /**\n     * Application constructor.\n     *\n     * @param array $config\n     * @param array $prepends\n     */\n    public function __construct(array $config = [], array $prepends = [])\n    {\n        parent::__construct($config, $prepends);\n\n        $providers = [\n            AggregateServiceProvider::class,\n            MiniProgram\\ServiceProvider::class,\n        ];\n\n        foreach ($providers as $provider) {\n            $this->register(new $provider());\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/OfficialAccount/MiniProgram/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\OfficialAccount\\MiniProgram;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author Keal <caiyuezhang@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取公众号关联的小程序.\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list()\n    {\n        return $this->httpPostJson('cgi-bin/wxopen/wxamplinkget');\n    }\n\n    /**\n     * 关联小程序.\n     *\n     * @param string $appId\n     * @param bool   $notifyUsers\n     * @param bool   $showProfile\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function link(string $appId, bool $notifyUsers = true, bool $showProfile = false)\n    {\n        $params = [\n            'appid' => $appId,\n            'notify_users' => (string) $notifyUsers,\n            'show_profile' => (string) $showProfile,\n        ];\n\n        return $this->httpPostJson('cgi-bin/wxopen/wxamplink', $params);\n    }\n\n    /**\n     * 解除已关联的小程序.\n     *\n     * @param string $appId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function unlink(string $appId)\n    {\n        $params = [\n            'appid' => $appId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/wxopen/wxampunlink', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/OfficialAccount/MiniProgram/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\OfficialAccount\\MiniProgram;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['mini_program'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/Server/Guard.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Authorizer\\Server;\n\nuse EasyWeChat\\Kernel\\ServerGuard;\n\n/**\n * Class Guard.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Guard extends ServerGuard\n{\n    /**\n     * Get token from OpenPlatform encryptor.\n     *\n     * @return string\n     */\n    protected function getToken()\n    {\n        return $this->app['encryptor']->getToken();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Base/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Base;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get authorization info.\n     *\n     * @param string|null $authCode\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function handleAuthorize(string $authCode = null)\n    {\n        $params = [\n            'component_appid' => $this->app['config']['app_id'],\n            'authorization_code' => $authCode ?? $this->app['request']->get('auth_code'),\n        ];\n\n        return $this->httpPostJson('cgi-bin/component/api_query_auth', $params);\n    }\n\n    /**\n     * Get authorizer info.\n     *\n     * @param string $appId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getAuthorizer(string $appId)\n    {\n        $params = [\n            'component_appid' => $this->app['config']['app_id'],\n            'authorizer_appid' => $appId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/component/api_get_authorizer_info', $params);\n    }\n\n    /**\n     * Get options.\n     *\n     * @param string $appId\n     * @param string $name\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getAuthorizerOption(string $appId, string $name)\n    {\n        $params = [\n            'component_appid' => $this->app['config']['app_id'],\n            'authorizer_appid' => $appId,\n            'option_name' => $name,\n        ];\n\n        return $this->httpPostJson('cgi-bin/component/api_get_authorizer_option', $params);\n    }\n\n    /**\n     * Set authorizer option.\n     *\n     * @param string $appId\n     * @param string $name\n     * @param string $value\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setAuthorizerOption(string $appId, string $name, string $value)\n    {\n        $params = [\n            'component_appid' => $this->app['config']['app_id'],\n            'authorizer_appid' => $appId,\n            'option_name' => $name,\n            'option_value' => $value,\n        ];\n\n        return $this->httpPostJson('cgi-bin/component/api_set_authorizer_option', $params);\n    }\n\n    /**\n     * Get authorizer list.\n     *\n     * @param int $offset\n     * @param int $count\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getAuthorizers($offset = 0, $count = 500)\n    {\n        $params = [\n            'component_appid' => $this->app['config']['app_id'],\n            'offset' => $offset,\n            'count' => $count,\n        ];\n\n        return $this->httpPostJson('cgi-bin/component/api_get_authorizer_list', $params);\n    }\n\n    /**\n     * Create pre-authorization code.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createPreAuthorizationCode()\n    {\n        $params = [\n            'component_appid' => $this->app['config']['app_id'],\n        ];\n\n        return $this->httpPostJson('cgi-bin/component/api_create_preauthcode', $params);\n    }\n\n    /**\n     * OpenPlatform Clear quota.\n     *\n     * @see https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318587\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function clearQuota()\n    {\n        $params = [\n            'component_appid' => $this->app['config']['app_id'],\n        ];\n\n        return $this->httpPostJson('cgi-bin/component/clear_quota', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Base/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Base;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['base'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/CodeTemplate/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\CodeTemplate;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author caikeal <caiyuezhang@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取草稿箱内的所有临时代码草稿\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getDrafts()\n    {\n        return $this->httpGet('wxa/gettemplatedraftlist');\n    }\n\n    /**\n     * 将草稿箱的草稿选为小程序代码模版.\n     *\n     * @param int $draftId\n     * @param int $templateType\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createFromDraft(int $draftId, int $templateType = 0)\n    {\n        $params = [\n            'draft_id' => $draftId,\n            'template_type' => $templateType,\n        ];\n\n        return $this->httpPostJson('wxa/addtotemplate', $params);\n    }\n\n    /**\n     * 获取代码模版库中的所有小程序代码模版.\n     *\n     * @param int $templateType\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(int $templateType = null)\n    {\n        $params = [\n            'template_type' => $templateType,\n        ];\n\n        return $this->httpGet('wxa/gettemplatelist', $params);\n    }\n\n    /**\n     * 删除指定小程序代码模版.\n     *\n     * @param string $templateId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete($templateId)\n    {\n        $params = [\n            'template_id' => $templateId,\n        ];\n\n        return $this->httpPostJson('wxa/deletetemplate', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/CodeTemplate/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\CodeTemplate;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['code_template'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Component/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Component;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author dudashuang <dudashuang1222@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 通过法人微信快速创建小程序.\n     *\n     * @param array $params\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function registerMiniProgram(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/component/fastregisterweapp', $params, ['action' => 'create']);\n    }\n\n    /**\n     * 查询创建任务状态.\n     *\n     * @param string $companyName\n     * @param string $legalPersonaWechat\n     * @param string $legalPersonaName\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getRegistrationStatus(string $companyName, string $legalPersonaWechat, string $legalPersonaName)\n    {\n        $params = [\n            'name' => $companyName,\n            'legal_persona_wechat' => $legalPersonaWechat,\n            'legal_persona_name' => $legalPersonaName,\n        ];\n\n        return $this->httpPostJson('cgi-bin/component/fastregisterweapp', $params, ['action' => 'search']);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Component/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Component;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['component'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/Guard.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Server;\n\nuse EasyWeChat\\Kernel\\ServerGuard;\nuse EasyWeChat\\OpenPlatform\\Server\\Handlers\\Authorized;\nuse EasyWeChat\\OpenPlatform\\Server\\Handlers\\Unauthorized;\nuse EasyWeChat\\OpenPlatform\\Server\\Handlers\\UpdateAuthorized;\nuse EasyWeChat\\OpenPlatform\\Server\\Handlers\\VerifyTicketRefreshed;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse function EasyWeChat\\Kernel\\data_get;\n\n/**\n * Class Guard.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Guard extends ServerGuard\n{\n    public const EVENT_AUTHORIZED = 'authorized';\n    public const EVENT_UNAUTHORIZED = 'unauthorized';\n    public const EVENT_UPDATE_AUTHORIZED = 'updateauthorized';\n    public const EVENT_COMPONENT_VERIFY_TICKET = 'component_verify_ticket';\n    public const EVENT_THIRD_FAST_REGISTERED = 'notify_third_fasteregister';\n\n    /**\n     * @return \\Symfony\\Component\\HttpFoundation\\Response\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\BadRequestException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    protected function resolve(): Response\n    {\n        $this->registerHandlers();\n\n        $message = $this->getMessage();\n\n        if ($infoType = data_get($message, 'InfoType')) {\n            $this->dispatch($infoType, $message);\n        }\n\n        return new Response(static::SUCCESS_EMPTY_RESPONSE);\n    }\n\n    /**\n     * Register event handlers.\n     */\n    protected function registerHandlers()\n    {\n        $this->on(self::EVENT_AUTHORIZED, Authorized::class);\n        $this->on(self::EVENT_UNAUTHORIZED, Unauthorized::class);\n        $this->on(self::EVENT_UPDATE_AUTHORIZED, UpdateAuthorized::class);\n        $this->on(self::EVENT_COMPONENT_VERIFY_TICKET, VerifyTicketRefreshed::class);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/Handlers/Authorized.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Server\\Handlers;\n\nuse EasyWeChat\\Kernel\\Contracts\\EventHandlerInterface;\n\n/**\n * Class Authorized.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Authorized implements EventHandlerInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function handle($payload = null)\n    {\n        // Do nothing for the time being.\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/Handlers/Unauthorized.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Server\\Handlers;\n\nuse EasyWeChat\\Kernel\\Contracts\\EventHandlerInterface;\n\n/**\n * Class Unauthorized.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Unauthorized implements EventHandlerInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function handle($payload = null)\n    {\n        // Do nothing for the time being.\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/Handlers/UpdateAuthorized.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Server\\Handlers;\n\nuse EasyWeChat\\Kernel\\Contracts\\EventHandlerInterface;\n\n/**\n * Class UpdateAuthorized.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass UpdateAuthorized implements EventHandlerInterface\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function handle($payload = null)\n    {\n        // Do nothing for the time being.\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/Handlers/VerifyTicketRefreshed.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Server\\Handlers;\n\nuse EasyWeChat\\Kernel\\Contracts\\EventHandlerInterface;\nuse EasyWeChat\\Kernel\\Traits\\ResponseCastable;\nuse EasyWeChat\\OpenPlatform\\Application;\n\nuse function EasyWeChat\\Kernel\\data_get;\n\n/**\n * Class VerifyTicketRefreshed.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass VerifyTicketRefreshed implements EventHandlerInterface\n{\n    use ResponseCastable;\n\n    /**\n     * @var \\EasyWeChat\\OpenPlatform\\Application\n     */\n    protected $app;\n\n    /**\n     * Constructor.\n     *\n     * @param \\EasyWeChat\\OpenPlatform\\Application $app\n     */\n    public function __construct(Application $app)\n    {\n        $this->app = $app;\n    }\n\n    /**\n     * {@inheritdoc}.\n     */\n    public function handle($payload = null)\n    {\n        $ticket = data_get($payload, 'ComponentVerifyTicket');\n\n        if (!empty($ticket)) {\n            $this->app['verify_ticket']->setTicket($ticket);\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenPlatform\\Server;\n\nuse EasyWeChat\\Kernel\\Encryptor;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['encryptor'] = function ($app) {\n            return new Encryptor(\n                $app['config']['app_id'],\n                $app['config']['token'],\n                $app['config']['aes_key']\n            );\n        };\n\n        $app['server'] = function ($app) {\n            return new Guard($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork;\n\nuse EasyWeChat\\Kernel\\ServiceContainer;\nuse EasyWeChat\\OpenWork\\Work\\Application as Work;\n\n/**\n * Application.\n *\n * @author xiaomin <keacefull@gmail.com>\n *\n * @property \\EasyWeChat\\OpenWork\\Server\\Guard            $server\n * @property \\EasyWeChat\\OpenWork\\Corp\\Client             $corp\n * @property \\EasyWeChat\\OpenWork\\Provider\\Client         $provider\n * @property \\EasyWeChat\\OpenWork\\SuiteAuth\\AccessToken   $suite_access_token\n * @property \\EasyWeChat\\OpenWork\\Auth\\AccessToken        $provider_access_token\n * @property \\EasyWeChat\\OpenWork\\SuiteAuth\\SuiteTicket   $suite_ticket\n * @property \\EasyWeChat\\OpenWork\\MiniProgram\\Client      $mini_program\n * @property \\EasyWeChat\\OpenWork\\Media\\Client            $media\n * @property \\EasyWeChat\\OpenWork\\Contact\\Client          $contact\n * @property \\EasyWeChat\\OpenWork\\License\\Client          $license_order\n * @property \\EasyWeChat\\OpenWork\\License\\Account         $license_account\n * @property \\EasyWeChat\\OpenWork\\Device\\Client           $device\n * @noinspection PhpFullyQualifiedNameUsageInspection\n */\nclass Application extends ServiceContainer\n{\n    /**\n     * @var array\n     */\n    protected $providers = [\n        Auth\\ServiceProvider::class,\n        SuiteAuth\\ServiceProvider::class,\n        Server\\ServiceProvider::class,\n        Corp\\ServiceProvider::class,\n        Provider\\ServiceProvider::class,\n        MiniProgram\\ServiceProvider::class,\n        Media\\ServiceProvider::class,\n        Contact\\ServiceProvider::class,\n        License\\ServiceProvider::class,\n        Device\\ServiceProvider::class,\n    ];\n\n    /**\n     * @var array\n     */\n    protected $defaultConfig = [\n        // http://docs.guzzlephp.org/en/stable/request-options.html\n        'http' => [\n            'base_uri' => 'https://qyapi.weixin.qq.com/',\n        ],\n    ];\n\n    /**\n     * Creates the miniProgram application.\n     *\n     * @return \\EasyWeChat\\Work\\MiniProgram\\Application\n     */\n    public function miniProgram(): \\EasyWeChat\\Work\\MiniProgram\\Application\n    {\n        return new \\EasyWeChat\\Work\\MiniProgram\\Application($this->getConfig());\n    }\n\n    /**\n     * @param string $authCorpId    企业 corp_id\n     * @param string $permanentCode 企业永久授权码\n     *\n     * @return Work\n     */\n    public function work(string $authCorpId, string $permanentCode): Work\n    {\n        return new Work($authCorpId, $permanentCode, $this);\n    }\n\n    /**\n     * @param string $method\n     * @param array  $arguments\n     *\n     * @return mixed\n     */\n    public function __call($method, $arguments)\n    {\n        return $this['base']->$method(...$arguments);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Auth/AccessToken.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Auth;\n\nuse  EasyWeChat\\Kernel\\AccessToken as BaseAccessToken;\n\n/**\n * AccessToken.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass AccessToken extends BaseAccessToken\n{\n    protected $requestMethod = 'POST';\n\n    /**\n     * @var string\n     */\n    protected $endpointToGetToken = 'cgi-bin/service/get_provider_token';\n\n    /**\n     * @var string\n     */\n    protected $tokenKey = 'provider_access_token';\n\n    /**\n     * @var string\n     */\n    protected $cachePrefix = 'easywechat.kernel.provider_access_token.';\n\n    /**\n     * Credential for get token.\n     *\n     * @return array\n     */\n    protected function getCredentials(): array\n    {\n        return [\n            'corpid' => $this->app['config']['corp_id'], //服务商的corpid\n            'provider_secret' => $this->app['config']['secret'],\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Auth/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Auth;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * ServiceProvider.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        isset($app['provider_access_token']) || $app['provider_access_token'] = function ($app) {\n            return new AccessToken($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Contact/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\OpenWork\\Contact;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Contact Client\n *\n * @author moniang <me@imoniang.com>\n */\nclass Client extends BaseClient\n{\n    public function __construct(ServiceContainer $app)\n    {\n        parent::__construct($app, $app['provider_access_token']);\n    }\n\n\n    /**\n     * 异步通讯录id转译\n     *\n     * @param string      $authCorpId       授权企业corp_id\n     * @param array       $mediaIdList      需要转译的文件的media_id列表，只支持后缀名为xls/xlsx，doc/docx，csv，txt的文件。\n     * 不超过20个文件，获取方式使用{@see \\EasyWeChat\\OpenWork\\Media\\Client::uploadFile() 上传需要转译的文件}\n     *\n     * @param string|null $outputFileName   转译完打包的文件名，不需带后缀。企业微信后台会打包成zip压缩文件，并自动拼接上.zip后缀。\n     * 若media_id_list中文件个数大于1，则该字段必填。若media_id_list中文件个数等于1，且未填该字段，则转译完不打包成压缩文件。支持id转译\n     *\n     * @param string|null $outputFileFormat 若不指定，则输出格式跟输入格式相同。若要转换输出格式，当前仅支持输出文件为pdf格式。\n     * 若$mediaIdList中文件存在相同前缀名的文件，则输出文件命名规则为：文件前缀名_ 文件格式后缀.pdf，例如：20200901_ xlsx.pdf\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function idTranslate(string $authCorpId, array $mediaIdList, string $outputFileName = null, string $outputFileFormat = null)\n    {\n        /** @noinspection SpellCheckingInspection */\n        return $this->httpPostJson('cgi-bin/service/contact/id_translate', [\n            'auth_corpid' => $authCorpId,\n            'media_id_list' => $mediaIdList,\n            'output_file_name' => $outputFileName,\n            'output_file_format' => $outputFileFormat\n        ]);\n    }\n\n    /**\n     * 获取异步任务结果\n     *\n     * @param string $jobId 异步任务id，最大长度为64字节\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function getResult(string $jobId)\n    {\n        /** @noinspection SpellCheckingInspection */\n        return $this->httpGet('cgi-bin/service/batch/getresult', [\n            'jobid' => $jobId\n        ]);\n    }\n\n    /**\n     * 通讯录userid排序\n     *\n     * @param string $authCorpId 查询的企业corp_id\n     * @param array  $userIdList 要排序的user_id列表，最多支持1000个\n     * @param int    $sortType   排序方式 0：根据姓名拼音升序排列，返回用户userid列表 1：根据姓名拼音降序排列，返回用户userid列表\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function sort(string $authCorpId, array $userIdList, int $sortType = 0)\n    {\n        /** @noinspection SpellCheckingInspection */\n        return $this->httpPostJson('cgi-bin/service/contact/sort', [\n            'auth_corpid' => $authCorpId,\n            'sort_type' => $sortType,\n            'useridlist' => $userIdList\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Contact/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Contact;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * ServiceProvider.\n *\n * @author moniang <me@imoniang.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        !isset($app['contact']) && $app['contact'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Corp/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Corp;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Client.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Client constructor.\n     * 三方接口有三个access_token，这里用的是suite_access_token.\n     *\n     * @param ServiceContainer $app\n     */\n    public function __construct(ServiceContainer $app)\n    {\n        parent::__construct($app, $app['suite_access_token']);\n    }\n\n    /**\n     * 企业微信安装应用授权 url.\n     *\n     * @param string $preAuthCode 预授权码\n     * @param string $redirectUri 回调地址\n     * @param string $state\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\Exception\n     */\n    public function getPreAuthorizationUrl(string $preAuthCode = '', string $redirectUri = '', string $state = '')\n    {\n        $redirectUri || $redirectUri = $this->app->config['redirect_uri_install'];\n        $preAuthCode || $preAuthCode = $this->getPreAuthCode()['pre_auth_code'];\n        $state || $state = random_bytes(64);\n\n        $params = [\n            'suite_id' => $this->app['config']['suite_id'],\n            'redirect_uri' => $redirectUri,\n            'pre_auth_code' => $preAuthCode,\n            'state' => $state,\n        ];\n\n        return 'https://open.work.weixin.qq.com/3rdapp/install?' . http_build_query($params);\n    }\n\n    /**\n     * 获取预授权码.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getPreAuthCode()\n    {\n        return $this->httpGet('cgi-bin/service/get_pre_auth_code');\n    }\n\n    /**\n     * 设置授权配置.\n     * 该接口可对某次授权进行配置.\n     *\n     * @param string $preAuthCode\n     * @param array $sessionInfo\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setSession(string $preAuthCode, array $sessionInfo)\n    {\n        $params = [\n            'pre_auth_code' => $preAuthCode,\n            'session_info' => $sessionInfo,\n        ];\n\n        return $this->httpPostJson('cgi-bin/service/set_session_info', $params);\n    }\n\n    /**\n     * 获取企业永久授权码.\n     *\n     * @param string $authCode 临时授权码，会在授权成功时附加在redirect_uri中跳转回第三方服务商网站，或通过回调推送给服务商。长度为64至512个字节\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getPermanentByCode(string $authCode)\n    {\n        $params = [\n            'auth_code' => $authCode,\n        ];\n\n        return $this->httpPostJson('cgi-bin/service/get_permanent_code', $params);\n    }\n\n    /**\n     * 获取企业授权信息.\n     *\n     * @param string $authCorpId\n     * @param string $permanentCode\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getAuthorization(string $authCorpId, string $permanentCode)\n    {\n        $params = [\n            'auth_corpid' => $authCorpId,\n            'permanent_code' => $permanentCode,\n        ];\n\n        return $this->httpPostJson('cgi-bin/service/get_auth_info', $params);\n    }\n\n    /**\n     * 获取应用的管理员列表.\n     *\n     * @param string $authCorpId\n     * @param string $agentId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getManagers(string $authCorpId, string $agentId)\n    {\n        $params = [\n            'auth_corpid' => $authCorpId,\n            'agentid' => $agentId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/service/get_admin_list', $params);\n    }\n\n    /**\n     * 获取登录url.\n     *\n     * @param string $redirectUri\n     * @param string $scope\n     * @param string|null $state\n     *\n     * @return string\n     * @throws \\Exception\n     */\n    public function getOAuthRedirectUrl(string $redirectUri = '', string $scope = 'snsapi_userinfo', string $state = null)\n    {\n        $redirectUri || $redirectUri = $this->app->config['redirect_uri_oauth'];\n        $state || $state = random_bytes(64);\n        $params = [\n            'appid' => $this->app['config']['suite_id'],\n            'redirect_uri' => $redirectUri,\n            'response_type' => 'code',\n            'scope' => $scope,\n            'state' => $state,\n        ];\n\n        return 'https://open.weixin.qq.com/connect/oauth2/authorize?' . http_build_query($params) . '#wechat_redirect';\n    }\n\n    /**\n     * 第三方根据code获取企业成员信息.\n     *\n     * @param string $code\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUserByCode(string $code)\n    {\n        $params = [\n            'code' => $code,\n        ];\n\n        return $this->httpGet('cgi-bin/service/getuserinfo3rd', $params);\n    }\n\n    /**\n     * 第三方使用user_ticket获取成员详情.\n     *\n     * @param string $userTicket\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUserByTicket(string $userTicket)\n    {\n        $params = [\n            'user_ticket' => $userTicket,\n        ];\n\n        return $this->httpPostJson('cgi-bin/service/getuserdetail3rd', $params);\n    }\n\n    /**\n     * 第三方根据unionid查询external_userid\n     *\n     * @param string $unionid 微信用户的unionid\n     * @param string $openid 微信用户的openid\n     * @param string $corpid 需要换取的企业corpid，不填则拉取所有企业\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     * @author SinyLi <yxlix1@163.com>\n     */\n    public function unionidToExternalUserid(string $unionid, string $openid, string $corpid = '')\n    {\n        $params = [\n            'unionid' => $unionid,\n            'openid' => $openid,\n            'corpid' => $corpid\n        ];\n\n        return $this->httpPostJson('cgi-bin/service/externalcontact/unionid_to_external_userid_3rd', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Corp/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Corp;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * ServiceProvider.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * Registers services on the given container.\n     *\n     * This method should only be used to configure services and parameters.\n     * It should not get services.\n     *\n     * @param \\Pimple\\Container $app\n     */\n    public function register(Container $app)\n    {\n        isset($app['corp']) || $app['corp'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Device/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\OpenWork\\Device;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Device Client\n *\n * @author moniang <me@imoniang.com>\n */\nclass Client extends BaseClient\n{\n    public function __construct(ServiceContainer $app)\n    {\n        parent::__construct($app, $app['provider_access_token']);\n    }\n\n\n    /**\n     * 添加设备实例\n     *\n     * 该API用于添加一个设备的实例\n     *\n     * @param string $modelId  设备的型号id，在服务商管理端添加设备型号之后，可以查看型号id\n     * @param string $deviceSn 硬件序列号，只能包含数字和大小写字母，长度最大为128字节，不可与之前已导入的相同\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function add(string $modelId, string $deviceSn)\n    {\n        return $this->httpPostJson('cgi-bin/service/add_device', [\n            'model_id' => $modelId,\n            'device_sn' => $deviceSn\n        ]);\n    }\n\n    /**\n     * 查询设备绑定信息\n     *\n     * 该API用于查询设备绑定的企业信息\n     *\n     * @param string $deviceSn 硬件序列号，只能包含数字和大小写字母，长度最大为128字节\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function get(string $deviceSn)\n    {\n        return $this->httpPostJson('cgi-bin/service/get_device_auth_info', [\n            'device_sn' => $deviceSn\n        ]);\n    }\n\n    /**\n     * 重置设备SecretNo\n     *\n     * 该API用于重置所有类型设备的SecretNo，主要针对同一批次生成相同secretNo(seedSecretNo)的设备，\n     * 可将SecretNo的状态转换为未设置状态，使设备可以重新调用get_secret_no获取新的sercretNo，\n     * 如果对存量设备调用此接口，那么设备固件必须支持通过seed_secret_no获取secretNo。\n     *\n     * @param string $deviceSn 硬件序列号，只能包含数字和大小写字母，长度最大为128字节\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function reset(string $deviceSn)\n    {\n        return $this->httpPostJson('cgi-bin/service/reset_secret_no', [\n            'device_sn' => $deviceSn\n        ]);\n    }\n\n    /**\n     * 获取设备列表\n     *\n     * 硬件服务商可以通过本接口获取已登记的设备信息\n     *\n     * @param int $offset 用于分页拉取数据，表示偏移量\n     * @param int $limit  用于分页拉取数据，表示请求的数据条数\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function list(int $offset, int $limit)\n    {\n        return $this->httpPostJson('cgi-bin/service/list_device', [\n            'offset' => $offset,\n            'limit' => $limit\n        ]);\n    }\n\n    /**\n     * 上传设备日志\n     *\n     * 该API用于异步拉取某个设备的日志文件\n     *\n     * @param string $deviceSn 硬件序列号，只能包含数字和大小写字母，长度最大为128字节\n     * @param string $hint     提示参数，企业微信后台会将此参数透传给设备，设备可根据此参数来决定要上传哪部分日志，服务商可根据实际业务需求来使用此参数，最长为128字节\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function uploadLog(string $deviceSn, string $hint)\n    {\n        return $this->httpPostJson('cgi-bin/service/fetch_device_log', [\n            'device_sn' => $deviceSn,\n            'hint' => $hint\n        ]);\n    }\n\n    /**\n     * 获取设备自定义参数\n     *\n     * @param string $deviceSn 硬件序列号，只能包含数字和大小写字母，长度最大为128字节\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function getFeature(string $deviceSn)\n    {\n        return $this->httpPostJson('cgi-bin/hardware/get_device_feature', [\n            'device_sn' => $deviceSn\n        ]);\n    }\n\n    /**\n     * 删除设备实例\n     *\n     * 该API用于删除一个设备的实例\n     *\n     * @param string $deviceSn 硬件序列号，只能包含数字和大小写字母，长度最大为128字节\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function delete(string $deviceSn)\n    {\n        return $this->httpPostJson('cgi-bin/service/del_device', [\n            'device_sn' => $deviceSn\n        ]);\n    }\n\n    /**\n     * 设置打印机支持状态\n     *\n     * 该API用于设置打印盒子是否支持打印机的信息\n     *\n     * @param string $deviceSn  硬件序列号，只能包含数字和大小写字母，长度最大为128字节\n     * @param bool   $supported 是否支持打印机\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function setPrinterSupportState(string $deviceSn, bool $supported)\n    {\n        return $this->httpPostJson('cgi-bin/service/del_device', [\n            'device_sn' => $deviceSn,\n            'not_supported_printer' => (int)!$supported\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Device/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Device;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * ServiceProvider.\n *\n * @author moniang <me@imoniang.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        !isset($app['device']) && $app['device'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/License/Account.php",
    "content": "<?php\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\License;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * License Account Client\n *\n * @author moniang <me@imoniang.com>\n */\nclass Account extends BaseClient\n{\n    public function __construct(ServiceContainer $app)\n    {\n        parent::__construct($app, $app['provider_access_token']);\n    }\n\n    /**\n     * 激活帐号\n     *\n     * >下单购买帐号并支付完成之后，先调用{@see Client::getAccountList() 获取订单中的帐号列表}接口获取到帐号激活码，\n     * 然后可以调用该接口将激活码绑定到某个企业员工，以对其激活相应的平台服务能力。\n     *\n     * **一个userid允许激活一个基础帐号以及一个互通帐号。**\n     *\n     * @param string $activeCode 帐号激活码\n     * @param string $corpId     待绑定激活的成员所属企业corpId，只支持加密的corpId\n     * @param string $userId     待绑定激活的企业成员userId 。只支持加密的userId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     * @noinspection SpellCheckingInspection\n     */\n    public function active(string $activeCode, string $corpId, string $userId)\n    {\n        return $this->httpPostJson('cgi-bin/license/active_account', [\n            'active_code' => $activeCode,\n            'corpid' => $corpId,\n            'userid' => $userId\n        ]);\n    }\n\n    /**\n     * 批量激活帐号\n     *\n     * >可在一次请求里为一个企业的多个成员激活许可帐号，便于服务商批量化处理。\n     *\n     * **一个userid允许激活一个基础帐号以及一个互通帐号。单次激活的员工数量不超过1000**\n     *\n     * @param string $corpId    待绑定激活的成员所属企业corpid，只支持加密的corpid\n     * @param array $activeList 需要激活的帐号列表,每个数组包含<b>active_code</b>帐号激活码和<b>userid</b>待绑定激活的企业成员加密userid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     * @noinspection SpellCheckingInspection\n     */\n    public function batchActive(string $corpId, array $activeList)\n    {\n        return $this->httpPostJson('cgi-bin/license/batch_active_account', [\n            'corpid' => $corpId,\n            'active_list' => $activeList\n        ]);\n    }\n\n    /**\n     * 获取激活码详情\n     *\n     * >查询某个帐号激活码的状态以及激活绑定情况。\n     *\n     * @param string $corpId\n     * @param string $activeCode\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     * @noinspection SpellCheckingInspection\n     */\n    public function getActiveCodeInfo(string $corpId, string $activeCode)\n    {\n        return $this->httpPostJson('cgi-bin/license/get_active_info_by_code', [\n            'corpid' => $corpId,\n            'active_code' => $activeCode\n        ]);\n    }\n\n    /**\n     * 批量获取激活码详情\n     *\n     * >批量查询帐号激活码的状态以及激活绑定情况。\n     *\n     * @param string   $corpId         要查询的企业的corpid，只支持加密的corpid\n     * @param string[] $activeCodeList 激活码列表，最多不超过1000个\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     * @noinspection SpellCheckingInspection\n     */\n    public function batchGetActiveCodeInfo(string $corpId, array $activeCodeList)\n    {\n        return $this->httpPostJson('cgi-bin/license/batch_get_active_info_by_code', [\n            'corpid' => $corpId,\n            'active_code_list' => $activeCodeList\n        ]);\n    }\n\n    /**\n     * 获取企业的帐号列表\n     *\n     * >查询指定企业下的平台能力服务帐号列表。\n     *\n     * @param string      $corpId 企业corpId ，只支持加密的corpId\n     * @param string|null $cursor 返回的最大记录数，整型，最大值1000，默认值500\n     * @param int         $limit  用于分页查询的游标，字符串类型，由上一次调用返回，首次调用可不填\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     * @noinspection SpellCheckingInspection\n     */\n    public function list(string $corpId, ?string $cursor = null, int $limit = 500)\n    {\n        return $this->httpPostJson('cgi-bin/license/list_actived_account', [\n            'corpid' => $corpId,\n            'limit' => $limit,\n            'cursor' => $cursor\n        ]);\n    }\n\n    /**\n     * 获取成员的激活详情\n     *\n     * >查询某个企业成员的激活情况。\n     *\n     * @param string $corpId 企业corpId ，只支持加密的corpId\n     * @param string $userId 待查询员工的userid，只支持加密的userid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     * @noinspection SpellCheckingInspection\n     */\n    public function getActiveAccountInfo(string $corpId, string $userId)\n    {\n        return $this->httpPostJson('cgi-bin/license/get_active_info_by_user', [\n            'corpid' => $corpId,\n            'userid' => $userId\n        ]);\n    }\n\n\n    /**\n     * 帐号继承\n     *\n     * >在企业员工离职或者工作范围的有变更时，允许将其许可帐号继承给其他员工。\n     *\n     * **调用限制:**\n     * - 转移成员和接收成员属于同一个企业\n     * - 转移成员的帐号已激活，且在有效期\n     * - 转移许可的成员为离职成员时，不限制下次转接的时间间隔\n     * - 转移许可的成员为在职成员时，转接后30天后才可进行下次转接\n     * - 接收成员许可不能与转移成员的许可重叠（同时拥有基础帐号或者互通帐号）\n     * - 单次转移的帐号数限制在1000以内\n     *\n     * @param string $corpId       待绑定激活的成员所属企业corpId，只支持加密的corpId\n     * @param array  $transferList 待转移成员列表，每个数组包含<b>handover_userid</b>转移成员的userid和<b>takeover_userid</b>接收成员的userid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     * @noinspection SpellCheckingInspection\n     */\n    public function batchTransfer(string $corpId, array $transferList)\n    {\n        return $this->httpPostJson('cgi-bin/license/batch_transfer_license', [\n            'corpid' => $corpId,\n            'transfer_list' => $transferList\n        ]);\n    }\n\n    /**\n     * 分配激活码给下游企业\n     *\n     * >服务商可调用该接口将为上游企业购买的激活码分配给下游企业使用。\n     *\n     * @param string $fromCorpid 上游企业corpid。支持明文或者密文的corpid\n     * @param string $toCorpid   下游企业corpid。支持明文或者密文的corpid\n     * @param array  $activeCode 分享的接口许可激活码。单次分享激活码不可超过1000个，累计分享给同一下游企业的激活码总数不可超过上下游通讯录中该下游企业人数的2倍\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     * @noinspection SpellCheckingInspection\n     */\n    public function share(string $fromCorpid, string $toCorpid, array $activeCode)\n    {\n        return $this->httpPostJson('cgi-bin/license/batch_share_active_code', [\n            'from_corpid' => $fromCorpid,\n            'to_corpid' => $toCorpid,\n            'share_list' => array_map(function ($code) {\n                return [\n                    'active_code' => $code,\n                ];\n            }, $activeCode),\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/License/App.php",
    "content": "<?php\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\License;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * License App Client\n *\n * @author keller31 <xiaowei.vip@gmail.com>\n */\nclass App extends BaseClient\n{\n    public function __construct(ServiceContainer $app)\n    {\n        parent::__construct($app, $app['provider_access_token']);\n    }\n\n    /**\n     * 获取应用的接口许可状态\n     * 服务商可获取某个授权企业的应用接口许可试用期，免费试用期为企业首次安装应用后的90天。\n     *\n     * @link https://developer.work.weixin.qq.com/document/path/95844\n     *\n     * @param string $corpid    企业id\n     * @param string $suite_id  套件id\n     * @param string $appid     旧的多应用套件中的应用id，新开发者请忽略\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $corpid, string $suite_id, string $appid = '')\n    {\n        return $this->httpPostJson('cgi-bin/license/get_app_license_info', [\n            'corpid' => $corpid,\n            'suite_id' => $suite_id,\n            'appid' => $appid\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/License/AutoActive.php",
    "content": "<?php\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\License;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * License Client\n *\n * @author keller31 <xiaowei.vip@gmail.com>\n */\nclass AutoActive extends BaseClient\n{\n    public function __construct(ServiceContainer $app)\n    {\n        parent::__construct($app, $app['provider_access_token']);\n    }\n\n    /**\n     * 设置企业的许可自动激活状态\n     * 服务商可以调用该接口设置授权企业的许可自动激活状态。设置为自动激活后，对应授权企业的员工使用服务商应用时，接口许可表现为自动激活。\n     *\n     * @link https://developer.work.weixin.qq.com/document/path/95873\n     *\n     * @param string $corpid    企业ID\n     * @param integer $status   许可自动激活状态。0：关闭，1：打开\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setStatus(string $corpid, int $status)\n    {\n        return $this->httpPostJson('cgi-bin/license/set_auto_active_status', [\n            'corpid' => $corpid,\n            'auto_active_status' => $status\n        ]);\n    }\n\n    /**\n     * 查询企业的许可自动激活状态\n     * 服务商可以调用该接口查询授权企业的许可自动激活状态。\n     *\n     * @link https://developer.work.weixin.qq.com/document/path/95874\n     *\n     * @param string $corpid    企业ID\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getStatus(string $corpid)\n    {\n        return $this->httpPostJson('cgi-bin/license/get_auto_active_status', [\n            'corpid' => $corpid\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/License/Client.php",
    "content": "<?php\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\License;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Order Client\n *\n * @author moniang <me@imoniang.com>\n */\nclass Client extends BaseClient\n{\n    public function __construct(ServiceContainer $app)\n    {\n        parent::__construct($app, $app['provider_access_token']);\n    }\n\n    /**\n     * 下单购买帐号\n     *\n     * 服务商下单为企业购买新的帐号，可以同时购买基础帐号与互通帐号。下单之后，需要到服务商管理端发起支付，支付完成之后，订单才能生效。\n     *\n     * @param string $corpId 企业id，只支持加密的corpid\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection SpellCheckingInspection\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function create(string $corpId, array $data)\n    {\n        return $this->httpPostJson('cgi-bin/license/create_new_order', array_merge([\n            'corpid' => $corpId\n        ], $data));\n    }\n\n    /**\n     * 创建续期任务\n     *\n     * 在同一个订单里，首次创建任务无须指定jobid，后续指定同一个jobid，表示往同一个订单任务追加续期的成员。\n     *\n     * @param string $corpId 企业id，只支持加密的corpid\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection SpellCheckingInspection\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function renew(string $corpId, array $data)\n    {\n        return $this->httpPostJson('cgi-bin/license/create_renew_order_job', array_merge([\n            'corpid' => $corpId\n        ], $data));\n    }\n\n    /**\n     * 提交续期订单\n     *\n     * 创建续期任务之后，需要调用该接口，以提交订单任务。注意，提交之后，需要到服务商管理端发起支付，支付完成之后，订单才能生效。\n     *\n     * @param string $jobId                 任务id\n     * @param string $buyerUserId           下单人。服务商企业内成员userid。该userid必须登录过企业微信，并且企业微信已绑定微信\n     * @param int    $accountDurationMonths 购买的月数，每个月按照31天计算。最多购买36个月。(若企业为服务商测试企业，每次续期只能续期1个月)\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection SpellCheckingInspection\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function submitJob(string $jobId, string $buyerUserId, int $accountDurationMonths)\n    {\n        return $this->httpPostJson('cgi-bin/license/submit_order_job', [\n            'jobid' => $jobId,\n            'buyer_userid' => $buyerUserId,\n            'account_duration' => [\n                'months' => $accountDurationMonths\n            ]\n        ]);\n    }\n\n    /**\n     * 获取订单列表\n     *\n     * 服务商查询自己某段时间内的平台能力服务订单列表\n     *\n     * @param string      $corpId     企业id，只支持加密的corpid。若指定corpid且corpid为服务商测试企业，则返回的订单列表为测试订单列表。否则只返回正式订单列表\n     * @param int|null    $startTime  开始时间,下单时间。可不填。但是不能单独指定该字段，startTime跟endTime必须同时指定。\n     * @param int|null    $endTime    结束时间,下单时间。起始时间跟结束时间不能超过31天。可不填。但是不能单独指定该字段，startTime跟endTime必须同时指定。\n     * @param string|null $cursor     用于分页查询的游标，字符串类型，由上一次调用返回，首次调用可不填\n     * @param int         $limit      返回的最大记录数，整型，最大值1000，默认值500\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection SpellCheckingInspection\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function list(string $corpId, ?int $startTime = null, ?int $endTime = null, ?string $cursor = null, int $limit = 500)\n    {\n        return $this->httpPostJson('cgi-bin/license/list_order', [\n            'corpid' => $corpId,\n            'start_time' => $startTime,\n            'end_time' => $endTime,\n            'cursor' => $cursor,\n            'limit' => $limit\n        ]);\n    }\n\n    /**\n     * 获取订单详情\n     *\n     * 查询某个订单的详情，包括订单的状态、基础帐号个数、互通帐号个数、帐号购买时长等。\n     * 注意，该接口不返回订单中的帐号激活码列表或者续期的帐号成员列表，请调用{@see Client::getAccountList() 获取订单中的帐号列表}接口以获取帐号列表。\n     *\n     * @param string $orderId 订单id\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection SpellCheckingInspection\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function get(string $orderId)\n    {\n        return $this->httpPostJson('cgi-bin/license/get_order', [\n            'order_id' => $orderId\n        ]);\n    }\n\n    /**\n     * 获取订单中的帐号列表\n     *\n     * 查询指定订单下的平台能力服务帐号列表。若为购买帐号的订单或者存量企业的版本付费迁移订单，则返回帐号激活码列表；\n     * 若为续期帐号的订单，则返回续期帐号的成员列表。\n     *\n     * 注意，若是购买帐号的订单，则仅订单支付完成时，系统才会生成帐号，故支付完成之前，该接口不会返回帐号激活码。\n     *\n     * @param string      $orderId 订单号\n     * @param string|null $cursor  用于分页查询的游标，字符串类型，由上一次调用返回，首次调用可不填\n     * @param int         $limit   返回的最大记录数，整型，最大值1000，默认值500\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection SpellCheckingInspection\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function getAccountList(string $orderId, ?string $cursor = null, int $limit = 500)\n    {\n        return $this->httpPostJson('cgi-bin/license/list_order_account', [\n            'order_id' => $orderId,\n            'limit' => $limit,\n            'cursor' => $cursor\n        ]);\n    }\n\n    /**\n     * 取消订单\n     *\n     * 取消接口许可购买和续费订单，只可取消未支付且未失效的订单。\n     *\n     * @param string $corpId 企业id，只支持加密的corpid\n     * @param string $orderId 订单号\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection SpellCheckingInspection\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function cancel(string $corpId, string $orderId)\n    {\n        return $this->httpPostJson('cgi-bin/license/cancel_order', [\n            'corpid' => $corpId,\n            'order_id' => $orderId,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/License/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\License;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * ServiceProvider.\n *\n * @author moniang <me@imoniang.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        !isset($app['license_order']) && $app['license_order'] = function ($app) {\n            return new Client($app);\n        };\n\n        !isset($app['license_account']) && $app['license_account'] = function ($app) {\n            return new Account($app);\n        };\n\n        !isset($app['license_app']) && $app['license_app'] = function ($app) {\n            return new App($app);\n        };\n\n        !isset($app['license_auto_active']) && $app['license_auto_active'] = function ($app) {\n            return new AutoActive($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Media/Client.php",
    "content": "<?php\n\nnamespace EasyWeChat\\OpenWork\\Media;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Media Client\n *\n * @author moniang <me@imoniang.com>\n */\nclass Client extends BaseClient\n{\n    public function __construct(ServiceContainer $app)\n    {\n        parent::__construct($app, $app['provider_access_token']);\n    }\n\n    /**\n     * 上传图片文件\n     *\n     * @param string $path\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function uploadImage(string $path)\n    {\n        return $this->upload('image', $path);\n    }\n\n    /**\n     * 上传语音文件\n     *\n     * @param string $path\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function uploadVoice(string $path)\n    {\n        return $this->upload('voice', $path);\n    }\n\n    /**\n     * 上传视频文件\n     *\n     * @param string $path\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function uploadVideo(string $path)\n    {\n        return $this->upload('video', $path);\n    }\n\n\n    /**\n     * 上传普通文件\n     *\n     * @param string $path\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function uploadFile(string $path)\n    {\n        return $this->upload('file', $path);\n    }\n\n\n    /**\n     * 上传文件\n     *\n     * @param string $type  媒体文件类型，分别有图片（image）、语音（voice）、视频（video），普通文件（file）\n     * @param string $path\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function upload(string $type, string $path)\n    {\n        $files = [\n            'media' => $path,\n        ];\n\n        return $this->httpUpload('cgi-bin/service/media/upload', $files, [], compact('type'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Media/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Media;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * ServiceProvider.\n *\n * @author moniang <me@imoniang.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        !isset($app['media']) && $app['media'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/MiniProgram/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\MiniProgram;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Class Client.\n */\nclass Client extends BaseClient\n{\n    /**\n     * Client constructor.\n     *\n     * @param \\EasyWeChat\\Kernel\\ServiceContainer $app\n     */\n    public function __construct(ServiceContainer $app)\n    {\n        parent::__construct($app, $app['suite_access_token']);\n    }\n\n    /**\n     * Get session info by code.\n     *\n     * @param string $code\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function session(string $code)\n    {\n        $params = [\n            'js_code' => $code,\n            'grant_type' => 'authorization_code',\n        ];\n\n        return $this->httpGet('cgi-bin/service/miniprogram/jscode2session', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/MiniProgram/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\MiniProgram;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * ServiceProvider.\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        !isset($app['mini_program']) && $app['mini_program'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Provider/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Provider;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Client.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Client constructor.\n     *\n     *\n     * @param  ServiceContainer  $app\n     */\n    public function __construct(ServiceContainer $app)\n    {\n        parent::__construct($app, $app['provider_access_token']);\n    }\n\n    /**\n     * 单点登录 - 获取登录的地址.\n     *\n     * @param  string  $redirectUri\n     * @param  string  $userType\n     * @param  string  $state\n     *\n     * @return string\n     */\n    public function getLoginUrl(string $redirectUri = '', string $userType = 'admin', string $state = '')\n    {\n        $redirectUri || $redirectUri = $this->app->config['redirect_uri_single'];\n        $state || $state = random_bytes(64);\n        $params = [\n            'appid' => $this->app['config']['corp_id'],\n            'redirect_uri' => $redirectUri,\n            'usertype' => $userType,\n            'state' => $state,\n        ];\n\n        return 'https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?'.http_build_query($params);\n    }\n\n    /**\n     * 单点登录 - 获取登录用户信息.\n     *\n     * @param  string  $authCode\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getLoginInfo(string $authCode)\n    {\n        $params = [\n            'auth_code' => $authCode,\n        ];\n\n        return $this->httpPostJson('cgi-bin/service/get_login_info', $params);\n    }\n\n    /**\n     * 获取注册定制化URL.\n     *\n     * @param  string  $registerCode\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function getRegisterUri(string $registerCode = '')\n    {\n        if (!$registerCode) {\n            /** @var array $response */\n            $response = $this->detectAndCastResponseToType($this->getRegisterCode(), 'array');\n\n            $registerCode = $response['register_code'];\n        }\n\n        $params = ['register_code' => $registerCode];\n\n        return 'https://open.work.weixin.qq.com/3rdservice/wework/register?'.http_build_query($params);\n    }\n\n    /**\n     * 获取注册码.\n     *\n     * @param  string  $corpName\n     * @param  string  $adminName\n     * @param  string  $adminMobile\n     * @param  string  $state\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getRegisterCode(\n        string $corpName = '',\n        string $adminName = '',\n        string $adminMobile = '',\n        string $state = '',\n        string $templateId = ''\n    ) {\n        $params = [];\n        $params['template_id'] = $this->app['config']['reg_template_id'];\n        !empty($corpName) && $params['corp_name'] = $corpName;\n        !empty($adminName) && $params['admin_name'] = $adminName;\n        !empty($adminMobile) && $params['admin_mobile'] = $adminMobile;\n        !empty($state) && $params['state'] = $state;\n        !empty($templateId) && $params['template_id'] = $templateId;\n\n        return $this->httpPostJson('cgi-bin/service/get_register_code', $params);\n    }\n\n    /**\n     * 查询注册状态.\n     *\n     * Desc:该API用于查询企业注册状态，企业注册成功返回注册信息.\n     *\n     * @param  string  $registerCode\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getRegisterInfo(string $registerCode)\n    {\n        $params = [\n            'register_code' => $registerCode,\n        ];\n\n        return $this->httpPostJson('cgi-bin/service/get_register_info', $params);\n    }\n\n    /**\n     * 设置授权应用可见范围.\n     *\n     * Desc:调用该接口前提是开启通讯录迁移，收到授权成功通知后可调用。\n     *      企业注册初始化安装应用后，应用默认可见范围为根部门。\n     *      如需修改应用可见范围，服务商可以调用该接口设置授权应用的可见范围。\n     *      该接口只能使用注册完成回调事件或者查询注册状态返回的access_token。\n     *      调用设置通讯录同步完成后或者access_token超过30分钟失效（即解除通讯录锁定状态）则不能继续调用该接口。\n     *\n     * @param  string  $accessToken\n     * @param  string  $agentId\n     * @param  array  $allowUser\n     * @param  array  $allowParty\n     * @param  array  $allowTag\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function setAgentScope(\n        string $accessToken,\n        string $agentId,\n        array $allowUser = [],\n        array $allowParty = [],\n        array $allowTag = []\n    ) {\n        $params = [\n            'agentid' => $agentId,\n            'allow_user' => $allowUser,\n            'allow_party' => $allowParty,\n            'allow_tag' => $allowTag,\n            'access_token' => $accessToken,\n        ];\n\n        return $this->httpGet('cgi-bin/agent/set_scope', $params);\n    }\n\n    /**\n     * 设置通讯录同步完成.\n     *\n     * Desc:该API用于设置通讯录同步完成，解除通讯录锁定状态，同时使通讯录迁移access_token失效。\n     *\n     * @param  string  $accessToken\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function contactSyncSuccess(string $accessToken)\n    {\n        $params = ['access_token' => $accessToken];\n\n        return $this->httpGet('cgi-bin/sync/contact_sync_success', $params);\n    }\n\n    /**\n     * 通讯录单个搜索\n     *\n     * @param  string  $corpId\n     * @param  string  $queryWord\n     * @param  int|string  $agentId\n     * @param  int  $offset\n     * @param  int  $limit\n     * @param  int  $queryType\n     * @param  null  $fullMatchField\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function searchContact(\n        string $corpId,\n        string $queryWord,\n        $agentId,\n        int $offset = 0,\n        int $limit = 50,\n        int $queryType = 0,\n        $fullMatchField = null\n    ) {\n        $params = [];\n        $params['auth_corpid'] = $corpId;\n        $params['query_word'] = $queryWord;\n        $params['query_type'] = $queryType;\n        $params['agentid'] = $agentId;\n        $params['offset'] = $offset;\n        $params['limit'] = $limit;\n        !empty($fullMatchField) && $params['full_match_field'] = $fullMatchField;\n\n        return $this->httpPostJson('cgi-bin/service/contact/search', $params);\n    }\n\n    /**\n     * 自建应用代开发获取带参授权链接\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/95436\n     *\n     * @param array $params 请求参数\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getCustomizedAuthUrl(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/service/get_customized_auth_url', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Provider/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Provider;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * ServiceProvider.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    protected $app;\n\n    /**\n     * @param Container $app\n     */\n    public function register(Container $app)\n    {\n        $this->app = $app;\n        isset($app['provider']) || $app['provider'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Server/Guard.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Server;\n\nuse EasyWeChat\\Kernel\\Encryptor;\nuse EasyWeChat\\Kernel\\ServerGuard;\n\n/**\n * Guard.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass Guard extends ServerGuard\n{\n    /**\n     * @var bool\n     */\n    protected $alwaysValidate = true;\n\n    /**\n     * @return $this\n     */\n    public function validate()\n    {\n        return $this;\n    }\n\n    /**\n     * @return bool\n     */\n    protected function shouldReturnRawResponse(): bool\n    {\n        return !is_null($this->app['request']->get('echostr'));\n    }\n\n    protected function isSafeMode(): bool\n    {\n        return true;\n    }\n\n    /**\n     * @param array $message\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     */\n    protected function decryptMessage(array $message)\n    {\n        $encryptor = new Encryptor($message['ToUserName'], $this->app['config']->get('token'), $this->app['config']->get('aes_key'));\n\n        return $message = $encryptor->decrypt(\n            $message['Encrypt'],\n            $this->app['request']->get('msg_signature'),\n            $this->app['request']->get('nonce'),\n            $this->app['request']->get('timestamp')\n        );\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Server/Handlers/EchoStrHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Server\\Handlers;\n\nuse EasyWeChat\\Kernel\\Contracts\\EventHandlerInterface;\nuse EasyWeChat\\Kernel\\Decorators\\FinallyResult;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * EchoStrHandler.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass EchoStrHandler implements EventHandlerInterface\n{\n    /**\n     * @var ServiceContainer\n     */\n    protected $app;\n\n    /**\n     * EchoStrHandler constructor.\n     *\n     * @param ServiceContainer $app\n     */\n    public function __construct(ServiceContainer $app)\n    {\n        $this->app = $app;\n    }\n\n    /**\n     * @param mixed $payload\n     *\n     * @return FinallyResult|null\n     */\n    public function handle($payload = null)\n    {\n        if ($decrypted = $this->app['request']->get('echostr')) {\n            $str = $this->app['encryptor_corp']->decrypt(\n                $decrypted,\n                $this->app['request']->get('msg_signature'),\n                $this->app['request']->get('nonce'),\n                $this->app['request']->get('timestamp')\n            );\n\n            return new FinallyResult($str);\n        }\n        //把SuiteTicket缓存起来\n        if (!empty($payload['SuiteTicket'])) {\n            $this->app['suite_ticket']->setTicket($payload['SuiteTicket']);\n\n            return new FinallyResult(\"success\");\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Server/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Server;\n\nuse EasyWeChat\\Kernel\\Encryptor;\nuse EasyWeChat\\OpenWork\\Server\\Handlers\\EchoStrHandler;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * ServiceProvider.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        //微信第三方在校验url是使用的是GET方式请求和corp_id进行加密\n        !isset($app['encryptor_corp']) && $app['encryptor_corp'] = function ($app) {\n            return new Encryptor(\n                $app['config']['corp_id'],\n                $app['config']['token'],\n                $app['config']['aes_key']\n            );\n        };\n\n        //微信第三方推送数据时使用的是suite_id进行加密\n        !isset($app['encryptor']) && $app['encryptor'] = function ($app) {\n            return new Encryptor(\n                $app['config']['suite_id'],\n                $app['config']['token'],\n                $app['config']['aes_key']\n            );\n        };\n\n        !isset($app['server']) && $app['server'] = function ($app) {\n            $guard = new Guard($app);\n            $guard->push(new EchoStrHandler($app));\n\n            return $guard;\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/SuiteAuth/AccessToken.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\SuiteAuth;\n\nuse  EasyWeChat\\Kernel\\AccessToken as BaseAccessToken;\n\n/**\n * AccessToken.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass AccessToken extends BaseAccessToken\n{\n    /**\n     * @var string\n     */\n    protected $requestMethod = 'POST';\n\n    /**\n     * @var string\n     */\n    protected $endpointToGetToken = 'cgi-bin/service/get_suite_token';\n\n    /**\n     * @var string\n     */\n    protected $tokenKey = 'suite_access_token';\n\n    /**\n     * @var string\n     */\n    protected $cachePrefix = 'easywechat.kernel.suite_access_token.';\n\n    /**\n     * Credential for get token.\n     *\n     * @return array\n     */\n    protected function getCredentials(): array\n    {\n        return [\n            'suite_id' => $this->app['config']['suite_id'],\n            'suite_secret' => $this->app['config']['suite_secret'],\n            'suite_ticket' => $this->app['suite_ticket']->getTicket(),\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/SuiteAuth/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\SuiteAuth;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * ServiceProvider.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['suite_ticket'] = function ($app) {\n            return new SuiteTicket($app);\n        };\n\n        isset($app['suite_access_token']) || $app['suite_access_token'] = function ($app) {\n            return new AccessToken($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/SuiteAuth/SuiteTicket.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\SuiteAuth;\n\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Traits\\InteractsWithCache;\nuse EasyWeChat\\OpenWork\\Application;\n\n/**\n * SuiteTicket.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass SuiteTicket\n{\n    use InteractsWithCache;\n\n    /**\n     * @var Application\n     */\n    protected $app;\n\n    /**\n     * SuiteTicket constructor.\n     *\n     * @param Application $app\n     */\n    public function __construct(Application $app)\n    {\n        $this->app = $app;\n    }\n\n    /**\n     * @param string $ticket\n     *\n     * @return $this\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function setTicket(string $ticket)\n    {\n        $this->getCache()->set($this->getCacheKey(), $ticket, 1800);\n\n        if (!$this->getCache()->has($this->getCacheKey())) {\n            throw new RuntimeException('Failed to cache suite ticket.');\n        }\n\n        return $this;\n    }\n\n    /**\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function getTicket(): string\n    {\n        if ($cached = $this->getCache()->get($this->getCacheKey())) {\n            return $cached;\n        }\n\n        throw new RuntimeException('Credential \"suite_ticket\" does not exist in cache.');\n    }\n\n    /**\n     * @return string\n     */\n    protected function getCacheKey(): string\n    {\n        return 'easywechat.open_work.suite_ticket.'.$this->app['config']['suite_id'];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Work/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Work;\n\nuse EasyWeChat\\OpenWork\\Application as OpenWork;\nuse EasyWeChat\\OpenWork\\Work\\Auth\\AccessToken;\nuse EasyWeChat\\Work\\Application as Work;\n\n/**\n * Application.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass Application extends Work\n{\n    /**\n     * Application constructor.\n     *\n     * @param string   $authCorpId\n     * @param string   $permanentCode\n     * @param OpenWork $component\n     * @param array    $prepends\n     */\n    public function __construct(string $authCorpId, string $permanentCode, OpenWork $component, array $prepends = [])\n    {\n        parent::__construct(\\array_merge($component->getConfig(), ['corp_id' => $authCorpId]), $prepends + [\n                'access_token' => function ($app) use ($authCorpId, $permanentCode, $component) {\n                    return new AccessToken($app, $authCorpId, $permanentCode, $component);\n                },\n            ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Work/Auth/AccessToken.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\OpenWork\\Work\\Auth;\n\nuse EasyWeChat\\Kernel\\AccessToken as BaseAccessToken;\nuse EasyWeChat\\OpenWork\\Application;\nuse Pimple\\Container;\n\n/**\n * AccessToken.\n *\n * @author xiaomin <keacefull@gmail.com>\n */\nclass AccessToken extends BaseAccessToken\n{\n    /**\n     * @var string\n     */\n    protected $requestMethod = 'POST';\n\n    /**\n     * @var string 授权方企业ID\n     */\n    protected $authCorpid;\n\n    /**\n     * @var string 授权方企业永久授权码，通过get_permanent_code获取\n     */\n    protected $permanentCode;\n\n    protected $component;\n\n    /**\n     * AccessToken constructor.\n     *\n     * @param Container   $app\n     * @param string      $authCorpId\n     * @param string      $permanentCode\n     * @param Application $component\n     */\n    public function __construct(Container $app, string $authCorpId, string $permanentCode, Application $component)\n    {\n        $this->authCorpid = $authCorpId;\n        $this->permanentCode = $permanentCode;\n        $this->component = $component;\n        parent::__construct($app);\n    }\n\n    /**\n     * Credential for get token.\n     *\n     * @return array\n     */\n    protected function getCredentials(): array\n    {\n        return [\n            'auth_corpid' => $this->authCorpid,\n            'permanent_code' => $this->permanentCode,\n        ];\n    }\n\n    /**\n     * @return string\n     */\n    public function getEndpoint(): string\n    {\n        return 'cgi-bin/service/get_corp_token?'.http_build_query([\n                'suite_access_token' => $this->component['suite_access_token']->getToken()['suite_access_token'],\n            ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment;\n\nuse Closure;\nuse EasyWeChat\\BasicService;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\ServiceContainer;\nuse EasyWeChat\\Kernel\\Support;\nuse EasyWeChat\\OfficialAccount;\n\n/**\n * Class Application.\n *\n * @property \\EasyWeChat\\Payment\\Bill\\Client              $bill\n * @property \\EasyWeChat\\Payment\\Fundflow\\Client          $fundflow\n * @property \\EasyWeChat\\Payment\\Jssdk\\Client             $jssdk\n * @property \\EasyWeChat\\Payment\\Order\\Client             $order\n * @property \\EasyWeChat\\Payment\\Refund\\Client            $refund\n * @property \\EasyWeChat\\Payment\\Coupon\\Client            $coupon\n * @property \\EasyWeChat\\Payment\\Reverse\\Client           $reverse\n * @property \\EasyWeChat\\Payment\\Redpack\\Client           $redpack\n * @property \\EasyWeChat\\BasicService\\Url\\Client          $url\n * @property \\EasyWeChat\\Payment\\Transfer\\Client          $transfer\n * @property \\EasyWeChat\\Payment\\Security\\Client          $security\n * @property \\EasyWeChat\\Payment\\ProfitSharing\\Client     $profit_sharing\n * @property \\EasyWeChat\\Payment\\Contract\\Client          $contract\n * @property \\EasyWeChat\\OfficialAccount\\Auth\\AccessToken $access_token\n *\n * @method mixed pay(array $attributes)\n * @method mixed authCodeToOpenid(string $authCode)\n */\nclass Application extends ServiceContainer\n{\n    /**\n     * @var array\n     */\n    protected $providers = [\n        OfficialAccount\\Auth\\ServiceProvider::class,\n        BasicService\\Url\\ServiceProvider::class,\n        Base\\ServiceProvider::class,\n        Bill\\ServiceProvider::class,\n        Fundflow\\ServiceProvider::class,\n        Coupon\\ServiceProvider::class,\n        Jssdk\\ServiceProvider::class,\n        Merchant\\ServiceProvider::class,\n        Order\\ServiceProvider::class,\n        Redpack\\ServiceProvider::class,\n        Refund\\ServiceProvider::class,\n        Reverse\\ServiceProvider::class,\n        Sandbox\\ServiceProvider::class,\n        Transfer\\ServiceProvider::class,\n        Security\\ServiceProvider::class,\n        ProfitSharing\\ServiceProvider::class,\n        Contract\\ServiceProvider::class,\n    ];\n\n    /**\n     * @var array\n     */\n    protected $defaultConfig = [\n        'http' => [\n            'base_uri' => 'https://api.mch.weixin.qq.com/',\n        ],\n    ];\n\n    /**\n     * Build payment scheme for product.\n     *\n     * @param string $productId\n     *\n     * @return string\n     */\n    public function scheme(string $productId): string\n    {\n        $params = [\n            'appid' => $this['config']->app_id,\n            'mch_id' => $this['config']->mch_id,\n            'time_stamp' => time(),\n            'nonce_str' => uniqid(),\n            'product_id' => $productId,\n        ];\n\n        $params['sign'] = Support\\generate_sign($params, $this['config']->key);\n\n        return 'weixin://wxpay/bizpayurl?'.http_build_query($params);\n    }\n\n    /**\n     * @param string $codeUrl\n     *\n     * @return string\n     */\n    public function codeUrlScheme(string $codeUrl)\n    {\n        return \\sprintf('weixin://wxpay/bizpayurl?sr=%s', $codeUrl);\n    }\n\n    /**\n     * @param \\Closure $closure\n     *\n     * @return \\Symfony\\Component\\HttpFoundation\\Response\n     *\n     * @codeCoverageIgnore\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\Exception\n     */\n    public function handlePaidNotify(Closure $closure)\n    {\n        return (new Notify\\Paid($this))->handle($closure);\n    }\n\n    /**\n     * @param \\Closure $closure\n     *\n     * @return \\Symfony\\Component\\HttpFoundation\\Response\n     *\n     * @codeCoverageIgnore\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\Exception\n     */\n    public function handleRefundedNotify(Closure $closure)\n    {\n        return (new Notify\\Refunded($this))->handle($closure);\n    }\n\n    /**\n     * @param \\Closure $closure\n     *\n     * @return \\Symfony\\Component\\HttpFoundation\\Response\n     *\n     * @codeCoverageIgnore\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\Exception\n     */\n    public function handleScannedNotify(Closure $closure)\n    {\n        return (new Notify\\Scanned($this))->handle($closure);\n    }\n\n    /**\n     * Set sub-merchant.\n     *\n     * @param string      $mchId\n     * @param string|null $appId\n     *\n     * @return $this\n     */\n    public function setSubMerchant(string $mchId, string $appId = null)\n    {\n        $this['config']->set('sub_mch_id', $mchId);\n        $this['config']->set('sub_appid', $appId);\n\n        return $this;\n    }\n\n    /**\n     * @return bool\n     */\n    public function inSandbox(): bool\n    {\n        return (bool) $this['config']->get('sandbox');\n    }\n\n    /**\n     * @param string|null $endpoint\n     *\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function getKey(string $endpoint = null)\n    {\n        if ('sandboxnew/pay/getsignkey' === $endpoint) {\n            return $this['config']->key;\n        }\n\n        $key = $this->inSandbox() ? $this['sandbox']->getKey() : $this['config']->key;\n\n        if (empty($key)) {\n            throw new InvalidArgumentException('config key should not empty.');\n        }\n\n        if (32 !== strlen($key)) {\n            throw new InvalidArgumentException(sprintf(\"'%s' should be 32 chars length.\", $key));\n        }\n\n        return $key;\n    }\n\n    /**\n     * @param string $name\n     * @param array  $arguments\n     *\n     * @return mixed\n     */\n    public function __call($name, $arguments)\n    {\n        return call_user_func_array([$this['base'], $name], $arguments);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Base/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Base;\n\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\n\nclass Client extends BaseClient\n{\n    /**\n     * Pay the order.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function pay(array $params)\n    {\n        $params['appid'] = $this->app['config']->app_id;\n\n        return $this->request($this->wrap('pay/micropay'), $params);\n    }\n\n    /**\n     * Get openid by auth code.\n     *\n     * @param string $authCode\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function authCodeToOpenid(string $authCode)\n    {\n        return $this->request('tools/authcodetoopenid', [\n            'appid' => $this->app['config']->app_id,\n            'auth_code' => $authCode,\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Base/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Base;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['base'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Bill/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Bill;\n\nuse EasyWeChat\\Kernel\\Http\\StreamResponse;\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\n\nclass Client extends BaseClient\n{\n    /**\n     * Download bill history as a table file.\n     *\n     * @param string $date\n     * @param string $type\n     * @param array  $optional\n     *\n     * @return \\EasyWeChat\\Kernel\\Http\\StreamResponse|\\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $date, string $type = 'ALL', array $optional = [])\n    {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            'bill_date' => $date,\n            'bill_type' => $type,\n        ] + $optional;\n\n        $response = $this->requestRaw($this->wrap('pay/downloadbill'), $params);\n\n        if (0 === strpos($response->getBody()->getContents(), '<xml>')) {\n            return $this->castResponseToType($response, $this->app['config']->get('response_type'));\n        }\n\n        return StreamResponse::buildFromPsrResponse($response);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Bill/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Bill;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['bill'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Contract/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Contract;\n\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author tianyong90 <412039588@qq.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * entrust official account.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function web(array $params)\n    {\n        $params['appid'] = $this->app['config']->app_id;\n\n        return $this->safeRequest('papay/entrustweb', $params);\n    }\n\n    /**\n     * entrust app.\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function app(array $params)\n    {\n        $params['appid'] = $this->app['config']->app_id;\n\n        return $this->safeRequest('papay/preentrustweb', $params);\n    }\n\n    /**\n     * entrust html 5.\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function h5(array $params)\n    {\n        $params['appid'] = $this->app['config']->app_id;\n\n        return $this->safeRequest('papay/h5entrustweb', $params);\n    }\n\n    /**\n     * apply papay.\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function apply(array $params)\n    {\n        $params['appid'] = $this->app['config']->app_id;\n\n        return $this->safeRequest('pay/pappayapply', $params);\n    }\n\n    /**\n     * delete papay contrace.\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(array $params)\n    {\n        $params['appid'] = $this->app['config']->app_id;\n\n        return $this->safeRequest('papay/deletecontract', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Contract/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Contract;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['contract'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Coupon/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Coupon;\n\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author tianyong90 <412039588@qq.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * send a cash coupon.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(array $params)\n    {\n        $params['appid'] = $this->app['config']->app_id;\n        $params['openid_count'] = 1;\n\n        return $this->safeRequest('mmpaymkttransfers/send_coupon', $params);\n    }\n\n    /**\n     * query a coupon stock.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function stock(array $params)\n    {\n        $params['appid'] = $this->app['config']->app_id;\n\n        return $this->request('mmpaymkttransfers/query_coupon_stock', $params);\n    }\n\n    /**\n     * query a info of coupon.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function info(array $params)\n    {\n        $params['appid'] = $this->app['config']->app_id;\n\n        return $this->request('mmpaymkttransfers/querycouponsinfo', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Coupon/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Coupon;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['coupon'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Fundflow/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Fundflow;\n\nuse EasyWeChat\\Kernel\\Http\\StreamResponse;\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\n\nclass Client extends BaseClient\n{\n    /**\n     * Download fundflow history as a table file.\n     *\n     * @param string $date\n     * @param string $type\n     * @param array  $options\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Http\\Response|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $date, string $type = 'Basic', $options = [])\n    {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            'bill_date' => $date,\n            'account_type' => $type,\n            'sign_type' => 'HMAC-SHA256',\n            'nonce_str' => uniqid('micro'),\n        ];\n        $options = array_merge(\n            [\n                'cert' => $this->app['config']->get('cert_path'),\n                'ssl_key' => $this->app['config']->get('key_path'),\n            ],\n            $options\n        );\n        $response = $this->requestRaw('pay/downloadfundflow', $params, 'post', $options);\n\n        if (0 === strpos($response->getBody()->getContents(), '<xml>')) {\n            return $this->castResponseToType($response, $this->app['config']->get('response_type'));\n        }\n\n        return StreamResponse::buildFromPsrResponse($response);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Fundflow/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Fundflow;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['fundflow'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Jssdk/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Jssdk;\n\nuse EasyWeChat\\BasicService\\Jssdk\\Client as JssdkClient;\nuse EasyWeChat\\Kernel\\Support;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends JssdkClient\n{\n    /**\n     * [WeixinJSBridge] Generate js config for payment.\n     *\n     * <pre>\n     * WeixinJSBridge.invoke(\n     *  'getBrandWCPayRequest',\n     *  ...\n     * );\n     * </pre>\n     *\n     * @param string $prepayId\n     * @param bool   $json\n     *\n     * @return string|array\n     */\n    public function bridgeConfig(string $prepayId, bool $json = true)\n    {\n        $params = [\n            'appId' => $this->app['config']->sub_appid ?: $this->app['config']->app_id,\n            'timeStamp' => strval(time()),\n            'nonceStr' => uniqid(),\n            'package' => \"prepay_id=$prepayId\",\n            'signType' => 'MD5',\n        ];\n\n        $params['paySign'] = Support\\generate_sign($params, $this->app['config']->key, 'md5');\n\n        return $json ? json_encode($params) : $params;\n    }\n\n    /**\n     * [JSSDK] Generate js config for payment.\n     *\n     * <pre>\n     * wx.chooseWXPay({...});\n     * </pre>\n     *\n     * @param string $prepayId\n     *\n     * @return array\n     */\n    public function sdkConfig(string $prepayId): array\n    {\n        $config = $this->bridgeConfig($prepayId, false);\n\n        $config['timestamp'] = $config['timeStamp'];\n        unset($config['timeStamp']);\n\n        return $config;\n    }\n\n    /**\n     * Generate app payment parameters.\n     *\n     * @param string $prepayId\n     *\n     * @return array\n     */\n    public function appConfig(string $prepayId): array\n    {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            'partnerid' => $this->app['config']->mch_id,\n            'prepayid' => $prepayId,\n            'noncestr' => uniqid(),\n            'timestamp' => time(),\n            'package' => 'Sign=WXPay',\n        ];\n\n        $params['sign'] = Support\\generate_sign($params, $this->app['config']->key);\n\n        return $params;\n    }\n\n    /**\n     * Generate js config for share user address.\n     *\n     * @param string $accessToken\n     * @param bool                                            $json\n     *\n     * @return string|array\n     */\n    public function shareAddressConfig(string $accessToken, bool $json = true)\n    {\n        $params = [\n            'appId' => $this->app['config']->app_id,\n            'scope' => 'jsapi_address',\n            'timeStamp' => strval(time()),\n            'nonceStr' => uniqid(),\n            'signType' => 'SHA1',\n        ];\n\n        $signParams = [\n            'appid' => $params['appId'],\n            'url' => $this->getUrl(),\n            'timestamp' => $params['timeStamp'],\n            'noncestr' => $params['nonceStr'],\n            'accesstoken' => strval($accessToken),\n        ];\n\n        ksort($signParams);\n\n        $params['addrSign'] = sha1(urldecode(http_build_query($signParams)));\n\n        return $json ? json_encode($params) : $params;\n    }\n\n    /**\n     * Generate js config for contract of mini program.\n     *\n     * @param array $params\n     *\n     * @return array\n     */\n    public function contractConfig(array $params): array\n    {\n        $params['appid'] = $this->app['config']->app_id;\n        $params['timestamp'] = time();\n\n        $params['sign'] = Support\\generate_sign($params, $this->app['config']->key);\n\n        return $params;\n    }\n\n    /**\n     * Generate js config for biz red packet of mini program.\n     *\n     * @param  string $package\n     * @return array\n     */\n    public function miniprogramRedpackConfig(string $package): array\n    {\n        $param = [\n            'appId' => $this->app['config']->app_id,\n            'timeStamp' => '' . time(),\n            'nonceStr' => uniqid(),\n            'package' => urlencode($package),\n        ];\n        ksort($param);\n\n        $buff = '';\n        foreach ($param as $k => $v) {\n            $buff .= $k . \"=\" . $v . \"&\";\n        }\n\n        $param['paySign'] = md5($buff . 'key=' . $this->app['config']->key);\n        $param['signType'] = 'MD5';\n        unset($param['appId']);\n\n        return $param;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Jssdk/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Jssdk;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['jssdk'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Kernel/BaseClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Kernel;\n\nuse EasyWeChat\\Kernel\\Support;\nuse EasyWeChat\\Kernel\\Traits\\HasHttpRequests;\nuse EasyWeChat\\Payment\\Application;\nuse GuzzleHttp\\MessageFormatter;\nuse GuzzleHttp\\Middleware;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Class BaseClient.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass BaseClient\n{\n    use HasHttpRequests { request as performRequest; }\n\n    /**\n     * @var \\EasyWeChat\\Payment\\Application\n     */\n    protected $app;\n\n    /**\n     * Constructor.\n     *\n     * @param \\EasyWeChat\\Payment\\Application $app\n     */\n    public function __construct(Application $app)\n    {\n        $this->app = $app;\n\n        $this->setHttpClient($this->app['http_client']);\n    }\n\n    /**\n     * Extra request params.\n     *\n     * @return array\n     */\n    protected function prepends()\n    {\n        return [];\n    }\n\n    /**\n     * Make a API request.\n     *\n     * @param string $endpoint\n     * @param array  $params\n     * @param string $method\n     * @param array  $options\n     * @param bool   $returnResponse\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function request(string $endpoint, array $params = [], $method = 'post', array $options = [], $returnResponse = false)\n    {\n        $base = [\n            'mch_id' => $this->app['config']['mch_id'],\n            'nonce_str' => uniqid(),\n            'sub_mch_id' => $this->app['config']['sub_mch_id'],\n            'sub_appid' => $this->app['config']['sub_appid'],\n        ];\n\n        $params = array_filter(array_filter(array_merge($base, $this->prepends(), $params)), 'strlen');\n\n        $secretKey = $this->app->getKey($endpoint);\n\n        $encryptMethod = Support\\get_encrypt_method(Support\\Arr::get($params, 'sign_type', 'MD5'), $secretKey);\n\n        $params['sign'] = Support\\generate_sign($params, $secretKey, $encryptMethod);\n\n        $options = array_merge([\n            'body' => Support\\XML::build($params),\n        ], $options);\n\n        $this->pushMiddleware($this->logMiddleware(), 'log');\n\n        $response = $this->performRequest($endpoint, $method, $options);\n\n        return $returnResponse ? $response : $this->castResponseToType($response, $this->app->config->get('response_type'));\n    }\n\n    /**\n     * Log the request.\n     *\n     * @return \\Closure\n     */\n    protected function logMiddleware()\n    {\n        $formatter = new MessageFormatter($this->app['config']['http.log_template'] ?? MessageFormatter::DEBUG);\n\n        return Middleware::log($this->app['logger'], $formatter);\n    }\n\n    /**\n     * Make a request and return raw response.\n     *\n     * @param string $endpoint\n     * @param array  $params\n     * @param string $method\n     * @param array  $options\n     *\n     * @return ResponseInterface\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function requestRaw(string $endpoint, array $params = [], $method = 'post', array $options = [])\n    {\n        /** @var ResponseInterface $response */\n        $response = $this->request($endpoint, $params, $method, $options, true);\n\n        return $response;\n    }\n\n    /**\n     * Make a request and return an array.\n     *\n     * @param string $endpoint\n     * @param array  $params\n     * @param string $method\n     * @param array  $options\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function requestArray(string $endpoint, array $params = [], $method = 'post', array $options = []): array\n    {\n        $response = $this->requestRaw($endpoint, $params, $method, $options);\n\n        return $this->castResponseToType($response, 'array');\n    }\n\n    /**\n     * Request with SSL.\n     *\n     * @param string $endpoint\n     * @param array  $params\n     * @param string $method\n     * @param array  $options\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function safeRequest($endpoint, array $params, $method = 'post', array $options = [])\n    {\n        $options = array_merge([\n            'cert' => $this->app['config']->get('cert_path'),\n            'ssl_key' => $this->app['config']->get('key_path'),\n        ], $options);\n\n        return $this->request($endpoint, $params, $method, $options);\n    }\n\n    /**\n     * Wrapping an API endpoint.\n     *\n     * @param string $endpoint\n     *\n     * @return string\n     */\n    protected function wrap(string $endpoint): string\n    {\n        return $this->app->inSandbox() ? \"sandboxnew/{$endpoint}\" : $endpoint;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Kernel/Exceptions/InvalidSignException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Kernel\\Exceptions;\n\nuse EasyWeChat\\Kernel\\Exceptions\\Exception;\n\nclass InvalidSignException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Kernel/Exceptions/SandboxException.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Kernel\\Exceptions;\n\nuse EasyWeChat\\Kernel\\Exceptions\\Exception;\n\nclass SandboxException extends Exception\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Merchant/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Merchant;\n\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Add sub-merchant.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function addSubMerchant(array $params)\n    {\n        return $this->manage($params, ['action' => 'add']);\n    }\n\n    /**\n     * Query sub-merchant by merchant id.\n     *\n     * @param string $id\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function querySubMerchantByMerchantId(string $id)\n    {\n        $params = [\n            'micro_mch_id' => $id,\n        ];\n\n        return $this->manage($params, ['action' => 'query']);\n    }\n\n    /**\n     * Query sub-merchant by wechat id.\n     *\n     * @param string $id\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function querySubMerchantByWeChatId(string $id)\n    {\n        $params = [\n            'recipient_wechatid' => $id,\n        ];\n\n        return $this->manage($params, ['action' => 'query']);\n    }\n\n    /**\n     * @param array $params\n     * @param array $query\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function manage(array $params, array $query)\n    {\n        $params = array_merge($params, [\n            'appid' => $this->app['config']->app_id,\n            'nonce_str' => '',\n            'sub_mch_id' => '',\n            'sub_appid' => '',\n        ]);\n\n        return $this->safeRequest('secapi/mch/submchmanage', $params, 'post', compact('query'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Merchant/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Merchant;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['merchant'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Notify/Handler.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Notify;\n\nuse Closure;\nuse EasyWeChat\\Kernel\\Exceptions\\Exception;\nuse EasyWeChat\\Kernel\\Support;\nuse EasyWeChat\\Kernel\\Support\\XML;\nuse EasyWeChat\\Payment\\Kernel\\Exceptions\\InvalidSignException;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nabstract class Handler\n{\n    public const SUCCESS = 'SUCCESS';\n    public const FAIL = 'FAIL';\n\n    /**\n     * @var \\EasyWeChat\\Payment\\Application\n     */\n    protected $app;\n\n    /**\n     * @var array\n     */\n    protected $message;\n\n    /**\n     * @var string|null\n     */\n    protected $fail;\n\n    /**\n     * @var array\n     */\n    protected $attributes = [];\n\n    /**\n     * Check sign.\n     * If failed, throws an exception.\n     *\n     * @var bool\n     */\n    protected $check = true;\n\n    /**\n     * Respond with sign.\n     *\n     * @var bool\n     */\n    protected $sign = false;\n\n    /**\n     * @param \\EasyWeChat\\Payment\\Application $app\n     */\n    public function __construct($app)\n    {\n        $this->app = $app;\n    }\n\n    /**\n     * Handle incoming notify.\n     *\n     * @param \\Closure $closure\n     *\n     * @return \\Symfony\\Component\\HttpFoundation\\Response\n     */\n    abstract public function handle(Closure $closure);\n\n    /**\n     * @param string $message\n     */\n    public function fail(string $message)\n    {\n        $this->fail = $message;\n    }\n\n    /**\n     * @param array $attributes\n     * @param bool  $sign\n     *\n     * @return $this\n     */\n    public function respondWith(array $attributes, bool $sign = false)\n    {\n        $this->attributes = $attributes;\n        $this->sign = $sign;\n\n        return $this;\n    }\n\n    /**\n     * Build xml and return the response to WeChat.\n     *\n     * @return \\Symfony\\Component\\HttpFoundation\\Response\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function toResponse(): Response\n    {\n        $base = [\n            'return_code' => is_null($this->fail) ? static::SUCCESS : static::FAIL,\n            'return_msg' => $this->fail,\n        ];\n\n        $attributes = array_merge($base, $this->attributes);\n\n        if ($this->sign) {\n            $attributes['sign'] = Support\\generate_sign($attributes, $this->app->getKey());\n        }\n\n        return new Response(XML::build($attributes));\n    }\n\n    /**\n     * Return the notify message from request.\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\Exception\n     */\n    public function getMessage(): array\n    {\n        if (!empty($this->message)) {\n            return $this->message;\n        }\n\n        try {\n            $message = XML::parse(strval($this->app['request']->getContent()));\n        } catch (\\Throwable $e) {\n            throw new Exception('Invalid request XML: '.$e->getMessage(), 400);\n        }\n\n        if (!is_array($message) || empty($message)) {\n            throw new Exception('Invalid request XML.', 400);\n        }\n\n        if ($this->check) {\n            $this->validate($message);\n        }\n\n        return $this->message = $message;\n    }\n\n    /**\n     * Decrypt message.\n     *\n     * @param string $key\n     *\n     * @return string|null\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\Exception\n     */\n    public function decryptMessage(string $key)\n    {\n        $message = $this->getMessage();\n        if (empty($message[$key])) {\n            return null;\n        }\n\n        return Support\\AES::decrypt(\n            base64_decode($message[$key], true),\n            md5($this->app['config']->key),\n            '',\n            OPENSSL_RAW_DATA,\n            'AES-256-ECB'\n        );\n    }\n\n    /**\n     * Validate the request params.\n     *\n     * @param array $message\n     *\n     * @throws \\EasyWeChat\\Payment\\Kernel\\Exceptions\\InvalidSignException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    protected function validate(array $message)\n    {\n        $sign = $message['sign'];\n        unset($message['sign']);\n\n        if (Support\\generate_sign($message, $this->app->getKey()) !== $sign) {\n            throw new InvalidSignException();\n        }\n    }\n\n    /**\n     * @param mixed $result\n     */\n    protected function strict($result)\n    {\n        if (true !== $result && is_null($this->fail)) {\n            $this->fail(strval($result));\n        }\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Notify/Paid.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Notify;\n\nuse Closure;\n\nclass Paid extends Handler\n{\n    /**\n     * @param \\Closure $closure\n     *\n     * @return \\Symfony\\Component\\HttpFoundation\\Response\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\Exception\n     */\n    public function handle(Closure $closure)\n    {\n        $this->strict(\n            \\call_user_func($closure, $this->getMessage(), [$this, 'fail'])\n        );\n\n        return $this->toResponse();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Notify/Refunded.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Notify;\n\nuse Closure;\nuse EasyWeChat\\Kernel\\Support\\XML;\n\nclass Refunded extends Handler\n{\n    protected $check = false;\n\n    /**\n     * @param \\Closure $closure\n     *\n     * @return \\Symfony\\Component\\HttpFoundation\\Response\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\Exception\n     */\n    public function handle(Closure $closure)\n    {\n        $this->strict(\n            \\call_user_func($closure, $this->getMessage(), $this->reqInfo(), [$this, 'fail'])\n        );\n\n        return $this->toResponse();\n    }\n\n    /**\n     * Decrypt the `req_info` from request message.\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\Exception\n     */\n    public function reqInfo()\n    {\n        return XML::parse($this->decryptMessage('req_info'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Notify/Scanned.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Notify;\n\nuse Closure;\n\nclass Scanned extends Handler\n{\n    protected $check = false;\n\n    /**\n     * @var string|null\n     */\n    protected $alert;\n\n    /**\n     * @param string $message\n     */\n    public function alert(string $message)\n    {\n        $this->alert = $message;\n    }\n\n    /**\n     * @param \\Closure $closure\n     *\n     * @return \\Symfony\\Component\\HttpFoundation\\Response\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\Exception\n     */\n    public function handle(Closure $closure)\n    {\n        $result = \\call_user_func($closure, $this->getMessage(), [$this, 'fail'], [$this, 'alert']);\n\n        $attributes = [\n            'result_code' => is_null($this->alert) && is_null($this->fail) ? static::SUCCESS : static::FAIL,\n            'err_code_des' => $this->alert,\n        ];\n\n        if (is_null($this->alert) && is_string($result)) {\n            $attributes += [\n                'appid' => $this->app['config']->app_id,\n                'mch_id' => $this->app['config']->mch_id,\n                'nonce_str' => uniqid(),\n                'prepay_id' => $result,\n            ];\n        }\n\n        return $this->respondWith($attributes, true)->toResponse();\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Order/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Order;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException;\nuse EasyWeChat\\Kernel\\Support;\nuse EasyWeChat\\Kernel\\Support\\Collection;\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass Client extends BaseClient\n{\n    /**\n     * Unify order.\n     *\n     * @param array $params\n     * @param bool  $isContract\n     *\n     * @return ResponseInterface|Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function unify(array $params, $isContract = false)\n    {\n        if (empty($params['spbill_create_ip'])) {\n            $params['spbill_create_ip'] = ('NATIVE' === $params['trade_type']) ? Support\\get_server_ip() : Support\\get_client_ip();\n        }\n\n        $params['appid'] = $this->app['config']->app_id;\n        $params['notify_url'] = $params['notify_url'] ?? $this->app['config']['notify_url'];\n\n        if ($isContract) {\n            $params['contract_appid'] = $this->app['config']['app_id'];\n            $params['contract_mchid'] = $this->app['config']['mch_id'];\n            $params['request_serial'] = $params['request_serial'] ?? time();\n            $params['contract_notify_url'] = $params['contract_notify_url'] ?? $this->app['config']['contract_notify_url'];\n\n            return $this->request($this->wrap('pay/contractorder'), $params);\n        }\n\n        return $this->request($this->wrap('pay/unifiedorder'), $params);\n    }\n\n    /**\n     * Query order by out trade number.\n     *\n     * @param string $number\n     *\n     * @return ResponseInterface|Collection|array|object|string\n     *\n     * @throws InvalidArgumentException\n     * @throws InvalidConfigException\n     */\n    public function queryByOutTradeNumber(string $number)\n    {\n        return $this->query([\n            'out_trade_no' => $number,\n        ]);\n    }\n\n    /**\n     * Query order by transaction id.\n     *\n     * @param string $transactionId\n     *\n     * @return ResponseInterface|Collection|array|object|string\n     *\n     * @throws InvalidArgumentException\n     * @throws InvalidConfigException\n     */\n    public function queryByTransactionId(string $transactionId)\n    {\n        return $this->query([\n            'transaction_id' => $transactionId,\n        ]);\n    }\n\n    /**\n     * @param array $params\n     *\n     * @return ResponseInterface|Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function query(array $params)\n    {\n        $params['appid'] = $this->app['config']->app_id;\n\n        return $this->request($this->wrap('pay/orderquery'), $params);\n    }\n\n    /**\n     * Close order by out_trade_no.\n     *\n     * @param string $tradeNo\n     *\n     * @return ResponseInterface|Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function close(string $tradeNo)\n    {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            'out_trade_no' => $tradeNo,\n        ];\n\n        return $this->request($this->wrap('pay/closeorder'), $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Order/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Order;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['order'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/ProfitSharing/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\ProfitSharing;\n\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author ClouderSky <clouder.flow@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * {@inheritdoc}.\n     */\n    protected function prepends()\n    {\n        return [\n            'sign_type' => 'HMAC-SHA256',\n        ];\n    }\n\n    /**\n     * Add profit sharing receiver.\n     * 服务商代子商户发起添加分账接收方请求.\n     * 后续可通过发起分账请求将结算后的钱分到该分账接收方.\n     *\n     * @param array $receiver 分账接收方对象，json格式\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function addReceiver(array $receiver)\n    {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            'receiver' => json_encode(\n                $receiver,\n                JSON_UNESCAPED_UNICODE\n            ),\n        ];\n\n        return $this->request(\n            'pay/profitsharingaddreceiver',\n            $params\n        );\n    }\n\n    /**\n     * Delete profit sharing receiver.\n     * 服务商代子商户发起删除分账接收方请求.\n     * 删除后不支持将结算后的钱分到该分账接收方.\n     *\n     * @param array $receiver 分账接收方对象，json格式\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function deleteReceiver(array $receiver)\n    {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            'receiver' => json_encode(\n                $receiver,\n                JSON_UNESCAPED_UNICODE\n            ),\n        ];\n\n        return $this->request(\n            'pay/profitsharingremovereceiver',\n            $params\n        );\n    }\n\n    /**\n     * Single profit sharing.\n     * 请求单次分账.\n     *\n     * @param string $transactionId 微信支付订单号\n     * @param string $outOrderNo    商户系统内部的分账单号\n     * @param array  $receivers     分账接收方列表\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function share(\n        string $transactionId,\n        string $outOrderNo,\n        array $receivers\n    ) {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            'transaction_id' => $transactionId,\n            'out_order_no' => $outOrderNo,\n            'receivers' => json_encode(\n                $receivers,\n                JSON_UNESCAPED_UNICODE\n            ),\n        ];\n\n        return $this->safeRequest(\n            'secapi/pay/profitsharing',\n            $params\n        );\n    }\n\n    /**\n     * Multi profit sharing.\n     * 请求多次分账.\n     *\n     * @param string $transactionId 微信支付订单号\n     * @param string $outOrderNo    商户系统内部的分账单号\n     * @param array  $receivers     分账接收方列表\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function multiShare(\n        string $transactionId,\n        string $outOrderNo,\n        array $receivers\n    ) {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            'transaction_id' => $transactionId,\n            'out_order_no' => $outOrderNo,\n            'receivers' => json_encode(\n                $receivers,\n                JSON_UNESCAPED_UNICODE\n            ),\n        ];\n\n        return $this->safeRequest(\n            'secapi/pay/multiprofitsharing',\n            $params\n        );\n    }\n\n    /**\n     * Finish profit sharing.\n     * 完结分账.\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function markOrderAsFinished(array $params)\n    {\n        $params['appid'] = $this->app['config']->app_id;\n        $params['sub_appid'] = null;\n\n        return $this->safeRequest(\n            'secapi/pay/profitsharingfinish',\n            $params\n        );\n    }\n\n    /**\n     * Query profit sharing result.\n     * 查询分账结果.\n     *\n     * @param string $transactionId 微信支付订单号\n     * @param string $outOrderNo    商户系统内部的分账单号\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function query(\n        string $transactionId,\n        string $outOrderNo\n    ) {\n        $params = [\n            'sub_appid' => null,\n            'transaction_id' => $transactionId,\n            'out_order_no' => $outOrderNo,\n        ];\n\n        return $this->request(\n            'pay/profitsharingquery',\n            $params\n        );\n    }\n\n    /**\n     * Profit sharing return.\n     * 分账回退.\n     *\n     * @param string $outOrderNo    商户系统内部的分账单号\n     * @param string $outReturnNo   商户系统内部分账回退单号\n     * @param int    $returnAmount  回退金额\n     * @param string $returnAccount 回退方账号\n     * @param string $description   回退描述\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function returnShare(\n        string $outOrderNo,\n        string $outReturnNo,\n        int $returnAmount,\n        string $returnAccount,\n        string $description\n    ) {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            'out_order_no' => $outOrderNo,\n            'out_return_no' => $outReturnNo,\n            'return_account_type' => 'MERCHANT_ID',\n            'return_account' => $returnAccount,\n            'return_amount' => $returnAmount,\n            'description' => $description,\n        ];\n\n        return $this->safeRequest(\n            'secapi/pay/profitsharingreturn',\n            $params\n        );\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/ProfitSharing/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\ProfitSharing;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author ClouderSky <clouder.flow@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['profit_sharing'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Redpack/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Redpack;\n\nuse EasyWeChat\\Kernel\\Support;\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author tianyong90 <412039588@qq.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Query redpack.\n     *\n     * @param mixed $mchBillno\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function info($mchBillno)\n    {\n        $params = is_array($mchBillno) ? $mchBillno : ['mch_billno' => $mchBillno];\n        $base = [\n            'appid' => $this->app['config']->app_id,\n            'bill_type' => 'MCHT',\n        ];\n\n        return $this->safeRequest('mmpaymkttransfers/gethbinfo', array_merge($base, $params));\n    }\n\n    /**\n     * Send miniprogram normal redpack.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function sendMiniprogramNormal(array $params)\n    {\n        $base = [\n            'total_num' => 1,\n            'client_ip' => $params['client_ip'] ?? Support\\get_server_ip(),\n            'wxappid' => $this->app['config']->app_id,\n            'notify_way' => 'MINI_PROGRAM_JSAPI',\n        ];\n\n        return $this->safeRequest('mmpaymkttransfers/sendminiprogramhb', array_merge($base, $params));\n    }\n\n    /**\n     * Send normal redpack.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function sendNormal(array $params)\n    {\n        $base = [\n            'total_num' => 1,\n            'client_ip' => $params['client_ip'] ?? Support\\get_server_ip(),\n            'wxappid' => $this->app['config']->app_id,\n        ];\n\n        return $this->safeRequest('mmpaymkttransfers/sendredpack', array_merge($base, $params));\n    }\n\n    /**\n     * Send group redpack.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function sendGroup(array $params)\n    {\n        $base = [\n            'amt_type' => 'ALL_RAND',\n            'wxappid' => $this->app['config']->app_id,\n        ];\n\n        return $this->safeRequest('mmpaymkttransfers/sendgroupredpack', array_merge($base, $params));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Redpack/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Redpack;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['redpack'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Refund/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Refund;\n\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\n\nclass Client extends BaseClient\n{\n    /**\n     * Refund by out trade number.\n     *\n     * @param string $number\n     * @param string $refundNumber\n     * @param int    $totalFee\n     * @param int    $refundFee\n     * @param array  $optional\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function byOutTradeNumber(string $number, string $refundNumber, int $totalFee, int $refundFee, array $optional = [])\n    {\n        return $this->refund($refundNumber, $totalFee, $refundFee, array_merge($optional, ['out_trade_no' => $number]));\n    }\n\n    /**\n     * Refund by transaction id.\n     *\n     * @param string $transactionId\n     * @param string $refundNumber\n     * @param int    $totalFee\n     * @param int    $refundFee\n     * @param array  $optional\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function byTransactionId(string $transactionId, string $refundNumber, int $totalFee, int $refundFee, array $optional = [])\n    {\n        return $this->refund($refundNumber, $totalFee, $refundFee, array_merge($optional, ['transaction_id' => $transactionId]));\n    }\n\n    /**\n     * Query refund by transaction id.\n     *\n     * @param string $transactionId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function queryByTransactionId(string $transactionId)\n    {\n        return $this->query($transactionId, 'transaction_id');\n    }\n\n    /**\n     * Query refund by out trade number.\n     *\n     * @param string $outTradeNumber\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function queryByOutTradeNumber(string $outTradeNumber)\n    {\n        return $this->query($outTradeNumber, 'out_trade_no');\n    }\n\n    /**\n     * Query refund by out refund number.\n     *\n     * @param string $outRefundNumber\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function queryByOutRefundNumber(string $outRefundNumber)\n    {\n        return $this->query($outRefundNumber, 'out_refund_no');\n    }\n\n    /**\n     * Query refund by refund id.\n     *\n     * @param string $refundId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function queryByRefundId(string $refundId)\n    {\n        return $this->query($refundId, 'refund_id');\n    }\n\n    /**\n     * Refund.\n     *\n     * @param string $refundNumber\n     * @param int    $totalFee\n     * @param int    $refundFee\n     * @param array  $optional\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function refund(string $refundNumber, int $totalFee, int $refundFee, $optional = [])\n    {\n        $params = array_merge([\n            'out_refund_no' => $refundNumber,\n            'total_fee' => $totalFee,\n            'refund_fee' => $refundFee,\n            'appid' => $this->app['config']->app_id,\n        ], $optional);\n\n        return $this->safeRequest($this->wrap(\n            $this->app->inSandbox() ? 'pay/refund' : 'secapi/pay/refund'\n        ), $params);\n    }\n\n    /**\n     * Query refund.\n     *\n     * @param string $number\n     * @param string $type\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function query(string $number, string $type)\n    {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            $type => $number,\n        ];\n\n        return $this->request($this->wrap('pay/refundquery'), $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Refund/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Refund;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['refund'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Reverse/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Reverse;\n\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\n\nclass Client extends BaseClient\n{\n    /**\n     * Reverse order by out trade number.\n     *\n     * @param string $outTradeNumber\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function byOutTradeNumber(string $outTradeNumber)\n    {\n        return $this->reverse($outTradeNumber, 'out_trade_no');\n    }\n\n    /**\n     * Reverse order by transaction_id.\n     *\n     * @param string $transactionId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function byTransactionId(string $transactionId)\n    {\n        return $this->reverse($transactionId, 'transaction_id');\n    }\n\n    /**\n     * Reverse order.\n     *\n     * @param string $number\n     * @param string $type\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function reverse(string $number, string $type)\n    {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            $type => $number,\n        ];\n\n        return $this->safeRequest($this->wrap('secapi/pay/reverse'), $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Reverse/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Reverse;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['reverse'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Sandbox/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Sandbox;\n\nuse EasyWeChat\\Kernel\\Traits\\InteractsWithCache;\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\nuse EasyWeChat\\Payment\\Kernel\\Exceptions\\SandboxException;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    use InteractsWithCache;\n\n    /**\n     * @return string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Payment\\Kernel\\Exceptions\\SandboxException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getKey(): string\n    {\n        if ($cache = $this->getCache()->get($this->getCacheKey())) {\n            return $cache;\n        }\n\n        $response = $this->requestArray('sandboxnew/pay/getsignkey');\n\n        if ('SUCCESS' === $response['return_code']) {\n            $this->getCache()->set($this->getCacheKey(), $key = $response['sandbox_signkey'], 24 * 3600);\n\n            return $key;\n        }\n\n        throw new SandboxException($response['retmsg'] ?? $response['return_msg']);\n    }\n\n    /**\n     * @return string\n     */\n    protected function getCacheKey(): string\n    {\n        return 'easywechat.payment.sandbox.'.md5($this->app['config']->app_id.$this->app['config']['mch_id']);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Sandbox/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Sandbox;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * @param \\Pimple\\Container $app\n     */\n    public function register(Container $app)\n    {\n        $app['sandbox'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Security/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Security;\n\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getPublicKey()\n    {\n        $params = [\n            'sign_type' => 'MD5',\n        ];\n\n        return $this->safeRequest('https://fraud.mch.weixin.qq.com/risk/getpublickey', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Security/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Security;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['security'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Transfer/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Transfer;\n\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Payment\\Kernel\\BaseClient;\nuse function EasyWeChat\\Kernel\\Support\\get_server_ip;\nuse function EasyWeChat\\Kernel\\Support\\rsa_public_encrypt;\n\n/**\n * Class Client.\n *\n * @author AC <alexever@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Query MerchantPay to balance.\n     *\n     * @param string $partnerTradeNo\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function queryBalanceOrder(string $partnerTradeNo)\n    {\n        $params = [\n            'appid' => $this->app['config']->app_id,\n            'mch_id' => $this->app['config']->mch_id,\n            'partner_trade_no' => $partnerTradeNo,\n        ];\n\n        return $this->safeRequest('mmpaymkttransfers/gettransferinfo', $params);\n    }\n\n    /**\n     * Send MerchantPay to balance.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function toBalance(array $params)\n    {\n        $base = [\n            'mch_id' => null,\n            'mchid' => $this->app['config']->mch_id,\n            'mch_appid' => $this->app['config']->app_id,\n        ];\n\n        if (empty($params['spbill_create_ip'])) {\n            $params['spbill_create_ip'] = get_server_ip();\n        }\n\n        return $this->safeRequest('mmpaymkttransfers/promotion/transfers', array_merge($base, $params));\n    }\n\n    /**\n     * Query MerchantPay order to BankCard.\n     *\n     * @param string $partnerTradeNo\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function queryBankCardOrder(string $partnerTradeNo)\n    {\n        $params = [\n            'mch_id' => $this->app['config']->mch_id,\n            'partner_trade_no' => $partnerTradeNo,\n        ];\n\n        return $this->safeRequest('mmpaysptrans/query_bank', $params);\n    }\n\n    /**\n     * Send MerchantPay to BankCard.\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function toBankCard(array $params)\n    {\n        foreach (['bank_code', 'partner_trade_no', 'enc_bank_no', 'enc_true_name', 'amount'] as $key) {\n            if (empty($params[$key])) {\n                throw new RuntimeException(\\sprintf('\"%s\" is required.', $key));\n            }\n        }\n\n        $publicKey = file_get_contents($this->app['config']->get('rsa_public_key_path'));\n\n        $params['enc_bank_no'] = rsa_public_encrypt($params['enc_bank_no'], $publicKey);\n        $params['enc_true_name'] = rsa_public_encrypt($params['enc_true_name'], $publicKey);\n\n        return $this->safeRequest('mmpaysptrans/pay_bank', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Transfer/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Payment\\Transfer;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['transfer'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Agent/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Agent;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * This is WeWork Agent Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get agent.\n     *\n     * @param int $agentId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function get(int $agentId)\n    {\n        $params = [\n            'agentid' => $agentId,\n        ];\n\n        return $this->httpGet('cgi-bin/agent/get', $params);\n    }\n\n    /**\n     * Set agent.\n     *\n     * @param int   $agentId\n     * @param array $attributes\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function set(int $agentId, array $attributes)\n    {\n        return $this->httpPostJson('cgi-bin/agent/set', array_merge(['agentid' => $agentId], $attributes));\n    }\n\n    /**\n     * Get agent list.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function list()\n    {\n        return $this->httpGet('cgi-bin/agent/list');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Agent/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Agent;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['agent'] = function ($app) {\n            return new Client($app);\n        };\n\n        $app['agent_workbench'] = function ($app) {\n            return new WorkbenchClient($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Agent/WorkbenchClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Agent;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * This is WeWork Agent WorkbenchClient.\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass WorkbenchClient extends BaseClient\n{\n    /**\n     * 设置应用在工作台展示的模版.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/92535#设置应用在工作台展示的模版\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setWorkbenchTemplate(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/agent/set_workbench_template', $params);\n    }\n\n    /**\n     * 获取应用在工作台展示的模版.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/92535#获取应用在工作台展示的模版\n     *\n     * @param int $agentId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getWorkbenchTemplate(int $agentId)\n    {\n        $params = [\n            'agentid' => $agentId\n        ];\n\n        return $this->httpPostJson('cgi-bin/agent/get_workbench_template', $params);\n    }\n\n    /**\n     * 设置应用在用户工作台展示的数据.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/92535#设置应用在用户工作台展示的数据\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function setWorkbenchData(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/agent/set_workbench_data', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work;\n\nuse EasyWeChat\\Kernel\\ServiceContainer;\nuse EasyWeChat\\Work\\MiniProgram\\Application as MiniProgram;\n\n/**\n * Application.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n *\n * @property \\EasyWeChat\\Work\\OA\\Client                             $oa\n * @property \\EasyWeChat\\Work\\Auth\\AccessToken                      $access_token\n * @property \\EasyWeChat\\Work\\Agent\\Client                          $agent\n * @property \\EasyWeChat\\Work\\Department\\Client                     $department\n * @property \\EasyWeChat\\Work\\Media\\Client                          $media\n * @property \\EasyWeChat\\Work\\Menu\\Client                           $menu\n * @property \\EasyWeChat\\Work\\Message\\Client                        $message\n * @property \\EasyWeChat\\Work\\Message\\Messenger                     $messenger\n * @property \\EasyWeChat\\Work\\User\\Client                           $user\n * @property \\EasyWeChat\\Work\\User\\TagClient                        $tag\n * @property \\EasyWeChat\\Work\\Server\\Guard                          $server\n * @property \\EasyWeChat\\Work\\Jssdk\\Client                          $jssdk\n * @property \\Overtrue\\Socialite\\Providers\\WeWork                   $oauth\n * @property \\EasyWeChat\\Work\\Invoice\\Client                        $invoice\n * @property \\EasyWeChat\\Work\\Chat\\Client                           $chat\n * @property \\EasyWeChat\\Work\\ExternalContact\\Client                $external_contact\n * @property \\EasyWeChat\\Work\\ExternalContact\\ContactWayClient      $contact_way\n * @property \\EasyWeChat\\Work\\ExternalContact\\GroupChatWayClient    $group_chat_way\n * @property \\EasyWeChat\\Work\\ExternalContact\\StatisticsClient      $external_contact_statistics\n * @property \\EasyWeChat\\Work\\ExternalContact\\MessageClient         $external_contact_message\n * @property \\EasyWeChat\\Work\\ExternalContact\\InterceptClient       $intercept\n * @property \\EasyWeChat\\Work\\ExternalContact\\ProductClient         $product\n * @property \\EasyWeChat\\Work\\GroupRobot\\Client                     $group_robot\n * @property \\EasyWeChat\\Work\\GroupRobot\\Messenger                  $group_robot_messenger\n * @property \\EasyWeChat\\Work\\Calendar\\Client                       $calendar\n * @property \\EasyWeChat\\Work\\Schedule\\Client                       $schedule\n * @property \\EasyWeChat\\Work\\MsgAudit\\Client                       $msg_audit\n * @property \\EasyWeChat\\Work\\Live\\Client                           $live\n * @property \\EasyWeChat\\Work\\CorpGroup\\Client                      $corp_group\n * @property \\EasyWeChat\\Work\\ExternalContact\\SchoolClient          $school\n * @property \\EasyWeChat\\Work\\ExternalContact\\MessageTemplateClient $external_contact_message_template\n * @property \\EasyWeChat\\Work\\Kf\\AccountClient                      $kf_account\n * @property \\EasyWeChat\\Work\\Kf\\ServicerClient                     $kf_servicer\n * @property \\EasyWeChat\\Work\\Kf\\MessageClient                      $kf_message\n * @property \\EasyWeChat\\Work\\GroupWelcomeTemplate\\Client           $group_welcome_templage\n * @property \\EasyWeChat\\Work\\Wedrive\\Wedrive                       $wedrive\n *\n * @method mixed getCallbackIp()\n */\nclass Application extends ServiceContainer\n{\n    /**\n     * @var array\n     */\n    protected $providers = [\n        OA\\ServiceProvider::class,\n        Auth\\ServiceProvider::class,\n        Base\\ServiceProvider::class,\n        Menu\\ServiceProvider::class,\n        OAuth\\ServiceProvider::class,\n        User\\ServiceProvider::class,\n        Agent\\ServiceProvider::class,\n        Media\\ServiceProvider::class,\n        Message\\ServiceProvider::class,\n        Department\\ServiceProvider::class,\n        Server\\ServiceProvider::class,\n        Jssdk\\ServiceProvider::class,\n        Invoice\\ServiceProvider::class,\n        Chat\\ServiceProvider::class,\n        ExternalContact\\ServiceProvider::class,\n        GroupRobot\\ServiceProvider::class,\n        Calendar\\ServiceProvider::class,\n        Schedule\\ServiceProvider::class,\n        MsgAudit\\ServiceProvider::class,\n        Live\\ServiceProvider::class,\n        CorpGroup\\ServiceProvider::class,\n        Mobile\\ServiceProvider::class,\n        Kf\\ServiceProvider::class,\n        GroupWelcomeTemplate\\ServiceProvider::class,\n        Wedrive\\ServiceProvider::class,\n    ];\n\n    /**\n     * @var array\n     */\n    protected $defaultConfig = [\n        // http://docs.guzzlephp.org/en/stable/request-options.html\n        'http' => [\n            'base_uri' => 'https://qyapi.weixin.qq.com/',\n        ],\n    ];\n\n    /**\n     * Creates the miniProgram application.\n     *\n     * @return \\EasyWeChat\\Work\\MiniProgram\\Application\n     */\n    public function miniProgram(): MiniProgram\n    {\n        return new MiniProgram($this->getConfig());\n    }\n\n    /**\n     * @param string $method\n     * @param array  $arguments\n     *\n     * @return mixed\n     */\n    public function __call($method, $arguments)\n    {\n        return $this['base']->$method(...$arguments);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Auth/AccessToken.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Auth;\n\nuse EasyWeChat\\Kernel\\AccessToken as BaseAccessToken;\n\n/**\n * Class AccessToken.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass AccessToken extends BaseAccessToken\n{\n    /**\n     * @var string\n     */\n    protected $endpointToGetToken = 'cgi-bin/gettoken';\n\n    /**\n     * @var int\n     */\n    protected $safeSeconds = 0;\n\n    /**\n     * Credential for get token.\n     *\n     * @return array\n     */\n    protected function getCredentials(): array\n    {\n        return [\n            'corpid' => $this->app['config']['corp_id'],\n            'corpsecret' => $this->app['config']['secret'],\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Auth/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Auth;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author lujunyi <lujunyi@shopex.cn>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取网页授权登录url，适用于自建应用与代开发应用。\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/91022\n     *\n     * @param string $redirectUri\n     * @param string $scope\n     * @param string $agentId\n     * @param string|null $state\n     *\n     * @return string\n     * @throws \\Exception\n     */\n    public function getOAuthRedirectUrl(string $redirectUri = '', string $scope = 'snsapi_privateinfo', string $agentId = '', string $state = null)\n    {\n        $redirectUri || $redirectUri = $this->app->config['redirect_uri_oauth'];\n        $state || $state = random_bytes(64);\n        $params = [\n            'appid' => $this->app['config']['suite_id'],\n            'redirect_uri' => $redirectUri,\n            'response_type' => 'code',\n            'scope' => $scope,\n            'state' => $state,\n            'agentid' => $agentId,\n        ];\n\n        return 'https://open.weixin.qq.com/connect/oauth2/authorize?' . http_build_query($params) . '#wechat_redirect';\n    }\n\n\n    /**\n     * 获取访问用户身份。根据code获取成员信息，适用于自建应用与代开发应用。\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/91023\n     *\n     * @param string $code\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUserByCode(string $code)\n    {\n        $params = [\n            'code' => $code,\n        ];\n\n        return $this->httpGet('cgi-bin/auth/getuserinfo', $params);\n    }\n\n    /**\n     * 获取访问用户敏感信息。自建应用与代开发应用可通过该接口获取成员授权的敏感字段。\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/95833\n     *\n     * @param string $userTicket\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUserByTicket(string $userTicket)\n    {\n        $params = [\n            'user_ticket' => $userTicket,\n        ];\n\n        return $this->httpPostJson('cgi-bin/auth/getuserdetail', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Auth/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Auth;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        isset($app['access_token']) || $app['access_token'] = function ($app) {\n            return new AccessToken($app);\n        };\n        !isset($app['auth']) && $app['auth'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Base/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Base;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get callback ip.\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getCallbackIp()\n    {\n        return $this->httpGet('cgi-bin/getcallbackip');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Base/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Base;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * @param Container $app\n     */\n    public function register(Container $app)\n    {\n        $app['base'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Calendar/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Calendar;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Add a calendar.\n     *\n     * @param array $calendar\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(array $calendar)\n    {\n        return $this->httpPostJson('cgi-bin/oa/calendar/add', compact('calendar'));\n    }\n\n    /**\n     * Update the calendar.\n     *\n     * @param string $id\n     * @param array  $calendar\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $id, array $calendar)\n    {\n        $calendar += ['cal_id' => $id];\n\n        return $this->httpPostJson('cgi-bin/oa/calendar/update', compact('calendar'));\n    }\n\n    /**\n     * Get one or more calendars.\n     *\n     * @param string|array $ids\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get($ids)\n    {\n        return $this->httpPostJson('cgi-bin/oa/calendar/get', ['cal_id_list' => (array) $ids]);\n    }\n\n    /**\n     * Delete a calendar.\n     *\n     * @param string $id\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $id)\n    {\n        return $this->httpPostJson('cgi-bin/oa/calendar/del', ['cal_id' => $id]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Calendar/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Calendar;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function register(Container $app)\n    {\n        $app['calendar'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Chat/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Chat;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author XiaolonY <xiaolony@hotmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get chat.\n     *\n     * @param string $chatId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function get(string $chatId)\n    {\n        return $this->httpGet('cgi-bin/appchat/get', ['chatid' => $chatId]);\n    }\n\n    /**\n     * Create chat.\n     *\n     * @param array $data\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $data)\n    {\n        return $this->httpPostJson('cgi-bin/appchat/create', $data);\n    }\n\n    /**\n     * Update chat.\n     *\n     * @param string $chatId\n     * @param array  $data\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $chatId, array $data)\n    {\n        return $this->httpPostJson('cgi-bin/appchat/update', array_merge(['chatid' => $chatId], $data));\n    }\n\n    /**\n     * Send a message.\n     *\n     * @param array $message\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(array $message)\n    {\n        return $this->httpPostJson('cgi-bin/appchat/send', $message);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Chat/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Chat;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author XiaolonY <xiaolony@hotmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['chat'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/CorpGroup/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\CorpGroup;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取应用共享信息.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93403\n     *\n     * @param int $agentId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getAppShareInfo(int $agentId)\n    {\n        $params = [\n            'agentid' => $agentId\n        ];\n\n        return $this->httpPostJson('cgi-bin/corpgroup/corp/list_app_share_info', $params);\n    }\n\n    /**\n     * 获取下级企业的access_token.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93359\n     *\n     * @param string $corpId\n     * @param int $agentId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getToken(string $corpId, int $agentId)\n    {\n        $params = [\n            'corpid' => $corpId,\n            'agentid' => $agentId\n        ];\n\n        return $this->httpPostJson('cgi-bin/corpgroup/corp/gettoken', $params);\n    }\n\n    /**\n     * 获取下级企业的小程序session.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93355\n     *\n     * @param string $userId\n     * @param string $sessionKey\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getMiniProgramTransferSession(string $userId, string $sessionKey)\n    {\n        $params = [\n            'userid' => $userId,\n            'session_key' => $sessionKey\n        ];\n\n        return $this->httpPostJson('cgi-bin/miniprogram/transfer_session', $params);\n    }\n\n    /**\n     * 将明文corpid转换为第三方应用获取的corpid（仅限第三方服务商，转换已获授权企业的corpid）\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/95327#1.4%20corpid%E8%BD%AC%E6%8D%A2\n     *\n     * @param string $corpId 获取到的企业ID\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getOpenCorpid(string $corpId)\n    {\n        return $this->httpPostJson('cgi-bin/corp/to_open_corpid', ['corpid' => $corpId]);\n    }\n\n    /**\n     * 将自建应用获取的userid转换为第三方应用获取的userid（仅代开发自建应用或第三方应用可调用）\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/95327#2.4%20userid%E7%9A%84%E8%BD%AC%E6%8D%A2\n     *\n     * @param array $useridList 获取到的成员ID\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function batchUseridToOpenUserid(array $useridList)\n    {\n        return $this->httpPostJson('cgi-bin/batch/userid_to_openuserid', ['userid_list' => $useridList]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/CorpGroup/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\CorpGroup;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * ServiceProvider.\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    protected $app;\n\n    /**\n     * @param Container $app\n     */\n    public function register(Container $app)\n    {\n        $app['corp_group'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Department/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Department;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * This is WeWork Department Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Create a department.\n     *\n     * @param array $data\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $data)\n    {\n        return $this->httpPostJson('cgi-bin/department/create', $data);\n    }\n\n    /**\n     * Update a department.\n     *\n     * @param int   $id\n     * @param array $data\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(int $id, array $data)\n    {\n        return $this->httpPostJson('cgi-bin/department/update', array_merge(compact('id'), $data));\n    }\n\n    /**\n     * Delete a department.\n     *\n     * @param int $id\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function delete(int $id)\n    {\n        return $this->httpGet('cgi-bin/department/delete', compact('id'));\n    }\n\n    /**\n     * Get department lists.\n     *\n     * @param int|null $id\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function list(?int $id = null)\n    {\n        return $this->httpGet('cgi-bin/department/list', compact('id'));\n    }\n\n    /**\n     * Get sub department lists.\n     *\n     * @param null|int $id\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function simpleList(?int $id = null)\n    {\n        return $this->httpGet('cgi-bin/department/simplelist', compact('id'));\n    }\n\n    /**\n     * Get department details.\n     *\n     * @param int $id\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function get(int $id)\n    {\n        return $this->httpGet('cgi-bin/department/get', compact('id'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Department/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Department;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['department'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\ExternalContact;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取配置了客户联系功能的成员列表.\n     *\n     * @see https://work.weixin.qq.com/api/doc#90000/90135/91554\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getFollowUsers()\n    {\n        return $this->httpGet('cgi-bin/externalcontact/get_follow_user_list');\n    }\n\n    /**\n     * 获取外部联系人列表.\n     *\n     * @see https://work.weixin.qq.com/api/doc#90000/90135/91555\n     *\n     * @param string $userId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(string $userId)\n    {\n        return $this->httpGet('cgi-bin/externalcontact/list', [\n            'userid' => $userId,\n        ]);\n    }\n\n    /**\n     * 批量获取客户详情.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92994\n     *\n     * @param array $userIdList\n     * @param string $cursor\n     * @param integer $limit\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function batchGet(array $userIdList, string $cursor = '', int $limit = 100)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/batch/get_by_user', [\n            'userid_list' => $userIdList,\n            'cursor' => $cursor,\n            'limit' => $limit,\n        ]);\n    }\n\n    /**\n     * 获取外部联系人详情.\n     *\n     * @see https://work.weixin.qq.com/api/doc#90000/90135/91556\n     *\n     * @param string $externalUserId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $externalUserId)\n    {\n        return $this->httpGet('cgi-bin/externalcontact/get', [\n            'external_userid' => $externalUserId,\n        ]);\n    }\n\n    /**\n     * 批量获取外部联系人详情.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90001/90143/93010\n     *\n     * @param array $userIdList\n     * @param string $cursor\n     * @param int $limit\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function batchGetByUser(array $userIdList, string $cursor, int $limit)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/batch/get_by_user', [\n            'userid_list' => $userIdList,\n            'cursor' => $cursor,\n            'limit' => $limit\n        ]);\n    }\n\n\n    /**\n     * 修改客户备注信息.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92115\n     *\n     * @param array $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function remark(array $data)\n    {\n        return $this->httpPostJson(\n            'cgi-bin/externalcontact/remark',\n            $data\n        );\n    }\n\n\n    /**\n     * 获取离职成员的客户列表.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92124\n     *\n     * @param null|int $pageId\n     * @param null|int $pageSize\n     * @param string $cursor\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUnassigned(?int $pageId = null, ?int $pageSize = 1000, ?string $cursor = null)\n    {\n        $params = [\n            'page_id' => $pageId,\n            'page_size' => $pageSize,\n            'cursor' => $cursor,\n        ];\n        $writableParams = array_filter($params, function (string $key) use ($params) {\n            return !is_null($params[$key]);\n        }, ARRAY_FILTER_USE_KEY);\n        return $this->httpPostJson('cgi-bin/externalcontact/get_unassigned_list', $writableParams);\n    }\n\n    /**\n     * 离职成员的外部联系人再分配.\n     *\n     * @see https://work.weixin.qq.com/api/doc#90000/90135/91564\n     *\n     * @param string $externalUserId\n     * @param string $handoverUserId\n     * @param string $takeoverUserId\n     * @param string $transferSuccessMessage\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function transfer(string $externalUserId, string $handoverUserId, string $takeoverUserId, string $transferSuccessMessage)\n    {\n        $params = [\n            'external_userid' => $externalUserId,\n            'handover_userid' => $handoverUserId,\n            'takeover_userid' => $takeoverUserId,\n            'transfer_success_msg' => $transferSuccessMessage\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/transfer', $params);\n    }\n\n    /**\n     * 分配在职成员的客户.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92125\n     *\n     * @param array $externalUserId\n     * @param string $handoverUserId\n     * @param string $takeoverUserId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function transferCustomer(array $externalUserId, string $handoverUserId, string $takeoverUserId, string $transferSuccessMessage)\n    {\n        $params = [\n            'external_userid' => $externalUserId,\n            'handover_userid' => $handoverUserId,\n            'takeover_userid' => $takeoverUserId,\n            'transfer_success_msg' => $transferSuccessMessage\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/transfer_customer', $params);\n    }\n\n    /**\n     * 分配离职成员的客户.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/94081\n     *\n     * @param array $externalUserId\n     * @param string $handoverUserId\n     * @param string $takeoverUserId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function resignedTransferCustomer(array $externalUserId, string $handoverUserId, string $takeoverUserId)\n    {\n        $params = [\n            'external_userid' => $externalUserId,\n            'handover_userid' => $handoverUserId,\n            'takeover_userid' => $takeoverUserId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/resigned/transfer_customer', $params);\n    }\n\n    /**\n     * 离职成员的群再分配.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92127\n     *\n     * @param array $chatIds\n     * @param string $newOwner\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function transferGroupChat(array $chatIds, string $newOwner)\n    {\n        $params = [\n            'chat_id_list' => $chatIds,\n            'new_owner' => $newOwner\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/groupchat/transfer', $params);\n    }\n\n    /**\n     * 查询客户接替状态.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/94082\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @param string $handoverUserId\n     * @param string $takeoverUserId\n     * @param null|string $cursor\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function transferResult(string $handoverUserId, string $takeoverUserId, ?string $cursor = null)\n    {\n        $params = [\n            'handover_userid' => $handoverUserId,\n            'takeover_userid' => $takeoverUserId,\n            'cursor' => $cursor,\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/resigned/transfer_result', $params);\n    }\n\n    /**\n     * 查询客户接替结果.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90001/90143/93009\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @param string $externalUserId\n     * @param string $handoverUserId\n     * @param string $takeoverUserId\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTransferResult(string $externalUserId, string $handoverUserId, string $takeoverUserId)\n    {\n        $params = [\n            'external_userid' => $externalUserId,\n            'handover_userid' => $handoverUserId,\n            'takeover_userid' => $takeoverUserId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/get_transfer_result', $params);\n    }\n\n    /**\n     * 获取客户群列表.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92120\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n\n    public function getGroupChats(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/groupchat/list', $params);\n    }\n\n    /**\n     * 获取客户群详情.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92122\n     *\n     * @param string $chatId\n     * @param int $needName\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n\n    public function getGroupChat(string $chatId, int $needName = 0)\n    {\n        $params = [\n            'chat_id' => $chatId,\n            'need_name' => $needName,\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/groupchat/get', $params);\n    }\n\n    /**\n     * 获取企业标签库.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92117#获取企业标签库\n     *\n     * @param array $tagIds\n     * @param array $groupIds\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n\n    public function getCorpTags(array $tagIds = [], array $groupIds = [])\n    {\n        $params = [\n            'tag_id' => $tagIds,\n            'group_id' => $groupIds\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/get_corp_tag_list', $params);\n    }\n\n\n    /**\n     * 添加企业客户标签.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92117#添加企业客户标签\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n\n    public function addCorpTag(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/add_corp_tag', $params);\n    }\n\n\n    /**\n     * 编辑企业客户标签.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92117#编辑企业客户标签\n     *\n     * @param string $id\n     * @param string|null $name\n     * @param int|null $order\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n\n    public function updateCorpTag(string $id, ?string $name = null, ?int $order = null)\n    {\n        $params = [\n            \"id\" => $id\n        ];\n\n        if (!\\is_null($name)) {\n            $params['name'] = $name;\n        }\n\n        if (!\\is_null($order)) {\n            $params['order'] = $order;\n        }\n\n        return $this->httpPostJson('cgi-bin/externalcontact/edit_corp_tag', $params);\n    }\n\n\n    /**\n     * 删除企业客户标签.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92117#删除企业客户标签\n     *\n     * @param array $tagId\n     * @param array $groupId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n\n    public function deleteCorpTag(array $tagId, array $groupId)\n    {\n        $params = [\n            \"tag_id\" => $tagId,\n            \"group_id\" => $groupId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/del_corp_tag', $params);\n    }\n\n\n    /**\n     * 编辑客户企业标签.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92118\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n\n    public function markTags(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/mark_tag', $params);\n    }\n\n    /**\n     * 外部联系人unionid转换.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90001/90143/93274\n     *\n     * @param string|null $unionid 微信客户的unionid\n     * @param string|null $openid 微信客户的openid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function unionidToExternalUserid(?string $unionid = null, ?string $openid = null)\n    {\n        return $this->httpPostJson(\n            'cgi-bin/externalcontact/unionid_to_external_userid',\n            [\n                'unionid' => $unionid,\n                'openid' => $openid,\n            ]\n        );\n    }\n\n    /**\n     * 代开发应用external_userid转换.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90001/90143/95195\n     *\n     * @param string $externalUserid 代开发自建应用获取到的外部联系人ID\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function toServiceExternalUserid(string $externalUserid)\n    {\n        return $this->httpPostJson(\n            'cgi-bin/externalcontact/to_service_external_userid',\n            [\n                'external_userid' => $externalUserid,\n            ]\n        );\n    }\n\n\n    /**\n     * 转换external_userid\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/95327\n     *\n     * @param array $externalUserIds\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     * @author 读心印 <aa24615@qq.com>\n     */\n\n    public function getNewExternalUserid(array $externalUserIds)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/get_new_external_userid', ['external_userid_list' => $externalUserIds]);\n    }\n\n    /**\n     * 设置迁移完成\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/95327\n     *\n     * @param string $corpid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     * @author 读心印 <aa24615@qq.com>\n     */\n\n    public function finishExternalUseridMigration(string $corpid)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/finish_external_userid_migration', ['corpid' => $corpid]);\n    }\n\n    /**\n     * unionid查询external_userid\n     *\n     * @param string $unionid\n     * @param string $openid\n     * @param string $corpid\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     * @deprecated  使用新方法`\\EasyWeChat\\OpenWork\\Corp\\unionidToExternalUserid`\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/95327\n     *\n     * @author 读心印 <aa24615@qq.com>\n     */\n\n    public function unionidToexternalUserid3rd(string $unionid, string $openid, string $corpid = '')\n    {\n        $params = [\n            'unionid' => $unionid,\n            'openid' => $openid,\n            'corpid' => $corpid\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/unionid_to_external_userid_3rd', $params);\n    }\n\n\n    /**\n     * 客户群opengid转换\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/94822\n     * @param string $opengid 小程序在微信获取到的群ID\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function opengidToChatid(string $opengid)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/opengid_to_chatid', compact('opengid'));\n    }\n\n\n    /**\n     * 上传附件资源\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/95098\n     * @param string $path 附件资源路径\n     * @param string $mediaType 媒体文件类型\n     * @param string $attachmentType 附件类型\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadAttachment(string $path, string $mediaType, string $attachmentType)\n    {\n        $query = [\n            'media_type' => $mediaType,\n            'attachment_type' => $attachmentType,\n        ];\n\n        return $this->httpUpload('cgi-bin/media/upload_attachment', ['media' => $path], [], $query);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/ContactWayClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\ExternalContact;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class ContactWayClient.\n *\n * @author milkmeowo <milkmeowo@gmail.com>\n */\nclass ContactWayClient extends BaseClient\n{\n    /**\n     * 配置客户联系「联系我」方式.\n     *\n     * @param int   $type\n     * @param int   $scene\n     * @param array $config\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(int $type, int $scene, array $config = [])\n    {\n        $params = array_merge([\n            'type' => $type,\n            'scene' => $scene,\n        ], $config);\n\n        return $this->httpPostJson('cgi-bin/externalcontact/add_contact_way', $params);\n    }\n\n    /**\n     * 获取企业已配置的「联系我」方式.\n     *\n     * @param string $configId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $configId)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/get_contact_way', [\n            'config_id' => $configId,\n        ]);\n    }\n\n    /**\n     * 更新企业已配置的「联系我」方式.\n     *\n     * @param string $configId\n     * @param array  $config\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $configId, array $config = [])\n    {\n        $params = array_merge([\n            'config_id' => $configId,\n        ], $config);\n\n        return $this->httpPostJson('cgi-bin/externalcontact/update_contact_way', $params);\n    }\n\n    /**\n     * 删除企业已配置的「联系我」方式.\n     *\n     * @param string $configId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $configId)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/del_contact_way', [\n            'config_id' => $configId,\n        ]);\n    }\n\n    /**\n     * 获取企业已配置的「联系我」列表，注意，该接口仅可获取2021年7月10日以后创建的「联系我」\n     *\n     * @param string $cursor 分页查询使用的游标，为上次请求返回的 next_cursor\n     * @param int $limit 每次查询的分页大小，默认为100条，最多支持1000条\n     * @param int|null $startTime 「联系我」创建起始时间戳, 不传默认为90天前\n     * @param int|null $endTime 「联系我」创建结束时间戳, 不传默认为当前时间\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(string $cursor = '', int $limit = 100, int $startTime = null, int $endTime = null)\n    {\n        $data = [\n            'cursor' => $cursor,\n            'limit' => $limit,\n        ];\n        if ($startTime) {\n            $data['start_time'] = $startTime;\n        }\n        if ($endTime) {\n            $data['end_time'] = $endTime;\n        }\n        return $this->httpPostJson('cgi-bin/externalcontact/list_contact_way', $data);\n    }\n\n    /**\n     * 结束临时会话\n     *\n     * 将指定的企业成员和客户之前的临时会话断开，断开前会自动下发已配置的结束语。\n     *\n     * <b>注意：请保证传入的企业成员和客户之间有仍然有效的临时会话, 通过其他方式的添加外部联系人无法通过此接口关闭会话。</b>\n     * @param string $userId         企业成员的user_id\n     * @param string $externalUserId 客户的外部联系人user_id\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     */\n    public function closeTempChat(string $userId, string $externalUserId)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/close_temp_chat', [\n            'userid' => $userId,\n            'external_userid' => $externalUserId\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/GroupChatWayClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\ExternalContact;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class GroupChatWayClient.\n *\n * @see https://developer.work.weixin.qq.com/document/path/92229\n *\n * @author SinyLi <yxlix1@163.com>\n */\nclass GroupChatWayClient extends BaseClient\n{\n    /**\n     * 配置客户群进群方式\n     *\n     * @param array $params 创建参数\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/groupchat/add_join_way', $params);\n    }\n\n    /**\n     * 获取客户群进群方式配置\n     *\n     * @param string $configId 联系方式的配置id\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $configId)\n    {\n        $params = [\n            'config_id' => $configId\n        ];\n        return $this->httpPostJson('cgi-bin/externalcontact/groupchat/get_join_way', $params);\n    }\n\n    /**\n     * 更新客户群进群方式配置，注意：使用覆盖的方式更新\n     *\n     * @param string $configId 企业联系方式的配置id\n     * @param array $config 更新参数\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $configId, array $config = [])\n    {\n        $params = array_merge([\n            'config_id' => $configId,\n        ], $config);\n        return $this->httpPostJson('cgi-bin/externalcontact/groupchat/update_join_way', $params);\n    }\n\n    /**\n     * 删除客户群进群方式配置\n     *\n     * @param string $configId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $configId)\n    {\n        $params = [\n            'config_id' => $configId\n        ];\n        return $this->httpPostJson('cgi-bin/externalcontact/groupchat/del_join_way', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/InterceptClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\ExternalContact;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class InterceptClient.\n *\n * @package EasyWeChat\\Work\\ExternalContact\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass InterceptClient extends BaseClient\n{\n    /**\n     * 新建敏感词规则.\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/95097#新建敏感词规则\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @author 读心印 <aa24615@qq.com>\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function createInterceptRule(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/add_intercept_rule', $params);\n    }\n\n    /**\n     * 获取敏感词规则列表.\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/95097#获取敏感词规则列表\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @author 读心印 <aa24615@qq.com>\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getInterceptRules()\n    {\n        return $this->httpGet('cgi-bin/externalcontact/get_intercept_rule_list');\n    }\n\n    /**\n     * 获取敏感词规则详情.\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/95097#获取敏感词规则详情\n     *\n     * @param string $ruleId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @author 读心印 <aa24615@qq.com>\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getInterceptRuleDetails(string $ruleId)\n    {\n        $params = [\n            'rule_id' => $ruleId\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/get_intercept_rule', $params);\n    }\n\n    /**\n     * 删除敏感词规则.\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/95097#删除敏感词规则\n     *\n     * @param string $ruleId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @author 读心印 <aa24615@qq.com>\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function deleteInterceptRule(string $ruleId)\n    {\n        $params = [\n            'rule_id' => $ruleId\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/del_intercept_rule', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/MessageClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\ExternalContact;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class MessageClient.\n *\n * @author milkmeowo <milkmeowo@gmail.com>\n */\nclass MessageClient extends BaseClient\n{\n    /**\n     * Required attributes.\n     *\n     * @var array\n     */\n    protected $required = ['content', 'title', 'url', 'pic_media_id', 'appid', 'page'];\n\n    protected $textMessage = [\n        'content' => '',\n    ];\n\n    protected $imageMessage = [\n\n    ];\n\n    protected $linkMessage = [\n        'title' => '',\n        'picurl' => '',\n        'desc' => '',\n        'url' => '',\n    ];\n\n    protected $miniprogramMessage = [\n        'title' => '',\n        'pic_media_id' => '',\n        'appid' => '',\n        'page' => '',\n    ];\n\n    /**\n     * 添加企业群发消息模板\n     *\n     * @see https://work.weixin.qq.com/api/doc#90000/90135/91560\n     *\n     * @param array $msg\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function submit(array $msg)\n    {\n        $params = $this->formatMessage($msg);\n\n        return $this->httpPostJson('cgi-bin/externalcontact/add_msg_template', $params);\n    }\n\n    /**\n     * 获取企业群发消息发送结果.\n     *\n     * @see https://developer.work.weixin.qq.com/document/16251\n     *\n     * @param string      $msgId  群发消息的id，通过{@see MessageClient::submit() 添加企业群发消息模板}接口返回\n     * @param int         $limit  返回的最大记录数，整型，最大值10000，默认值10000\n     * @param string|null $cursor 用于分页查询的游标，字符串类型，由上一次调用返回，首次调用可不填\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @noinspection PhpFullyQualifiedNameUsageInspection\n     * @noinspection SpellCheckingInspection\n     */\n    public function get(string $msgId, int $limit = 10000, ?string $cursor = null)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/get_group_msg_result', [\n            'msgid' => $msgId,\n            'limit' => $limit,\n            'cursor' => $cursor\n        ]);\n    }\n\n    /**\n     * 获取群发记录列表.\n     *\n     * @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\n     *\n     * @param string $chatType 群发任务的类型，默认为single，表示发送给客户，group表示发送给客户群\n     * @param int $startTime 群发任务记录开始时间\n     * @param int $endTime 群发任务记录结束时间\n     * @param string|null $creator 群发任务创建人企业账号id\n     * @param int|null $filterType 创建人类型。0：企业发表 1：个人发表 2：所有，包括个人创建以及企业创建，默认情况下为所有类型\n     * @param int|null $limit 返回的最大记录数，整型，最大值100，默认值50，超过最大值时取默认值\n     * @param string|null $cursor 用于分页查询的游标，字符串类型，由上一次调用返回，首次调用可不填\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getGroupmsgListV2(string $chatType, int $startTime, int $endTime, ?string $creator = null, ?int $filterType = null, ?int $limit = null, ?string $cursor = null)\n    {\n        $data = [\n            'chat_type' => $chatType,\n            'start_time' => $startTime,\n            'end_time' => $endTime,\n            'creator' => $creator,\n            'filter_type' => $filterType,\n            'limit' => $limit,\n            'cursor' => $cursor,\n        ];\n        $writableData = array_filter($data, function (string $key) use ($data) {\n            return !is_null($data[$key]);\n        }, ARRAY_FILTER_USE_KEY);\n        return $this->httpPostJson('cgi-bin/externalcontact/get_groupmsg_list_v2', $writableData);\n    }\n\n    /**\n     * 获取群发成员发送任务列表.\n     *\n     * @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\n     *\n     * @param string $msgId 群发消息的id，通过获取群发记录列表接口返回\n     * @param int|null $limit 返回的最大记录数，整型，最大值1000，默认值500，超过最大值时取默认值\n     * @param string|null $cursor 用于分页查询的游标，字符串类型，由上一次调用返回，首次调用可不填\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getGroupmsgTask(string $msgId, ?int $limit = null, ?string $cursor = null)\n    {\n        $data = [\n            'msgid' => $msgId,\n            'limit' => $limit,\n            'cursor' => $cursor,\n        ];\n        $writableData = array_filter($data, function (string $key) use ($data) {\n            return !is_null($data[$key]);\n        }, ARRAY_FILTER_USE_KEY);\n        return $this->httpPostJson('cgi-bin/externalcontact/get_groupmsg_task', $writableData);\n    }\n\n    /**\n     * 获取企业群发成员执行结果.\n     *\n     * @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\n     *\n     * @param string $msgId 群发消息的id，通过获取群发记录列表接口返回\n     * @param string $userid 发送成员userid，通过获取群发成员发送任务列表接口返回\n     * @param int|null $limit 返回的最大记录数，整型，最大值1000，默认值500，超过最大值时取默认值\n     * @param string|null $cursor 用于分页查询的游标，字符串类型，由上一次调用返回，首次调用可不填\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getGroupmsgSendResult(string $msgId, string $userid, ?int $limit = null, ?string $cursor = null)\n    {\n        $data = [\n            'msgid' => $msgId,\n            'userid' => $userid,\n            'limit' => $limit,\n            'cursor' => $cursor,\n        ];\n        $writableData = array_filter($data, function (string $key) use ($data) {\n            return !is_null($data[$key]);\n        }, ARRAY_FILTER_USE_KEY);\n        return $this->httpPostJson('cgi-bin/externalcontact/get_groupmsg_send_result', $writableData);\n    }\n\n    /**\n     * 发送新客户欢迎语.\n     *\n     * @see https://work.weixin.qq.com/api/doc#90000/90135/91688\n     *\n     * @param string $welcomeCode\n     * @param array $msg\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function sendWelcome(string $welcomeCode, array $msg)\n    {\n        $formattedMsg = $this->formatMessage($msg);\n\n        $params = array_merge($formattedMsg, [\n            'welcome_code' => $welcomeCode,\n        ]);\n\n        return $this->httpPostJson('cgi-bin/externalcontact/send_welcome_msg', $params);\n    }\n\n    /**\n     * @param array $data\n     *\n     * @return array\n     *\n     * @throws InvalidArgumentException\n     */\n    protected function formatMessage(array $data = [])\n    {\n        $params = $data;\n\n        if (!empty($params['text'])) {\n            $params['text'] = $this->formatFields($params['text'], $this->textMessage);\n        }\n\n        if (!empty($params['image'])) {\n            $params['image'] = $this->formatFields($params['image'], $this->imageMessage);\n        }\n\n        if (!empty($params['link'])) {\n            $params['link'] = $this->formatFields($params['link'], $this->linkMessage);\n        }\n\n        if (!empty($params['miniprogram'])) {\n            $params['miniprogram'] = $this->formatFields($params['miniprogram'], $this->miniprogramMessage);\n        }\n\n        return $params;\n    }\n\n    /**\n     * @param array $data\n     * @param array $default\n     *\n     * @return array\n     *\n     * @throws InvalidArgumentException\n     */\n    protected function formatFields(array $data = [], array $default = [])\n    {\n        $params = array_merge($default, $data);\n        foreach ($params as $key => $value) {\n            if (in_array($key, $this->required, true) && empty($value) && empty($default[$key])) {\n                throw new InvalidArgumentException(sprintf('Attribute \"%s\" can not be empty!', $key));\n            }\n\n            $params[$key] = empty($value) ? $default[$key] : $value;\n        }\n\n        return $params;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/MessageTemplateClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\ExternalContact;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class MessageTemplateClient.\n *\n * @author ljyljy0211 <ljyljy0211@gmail.com>\n */\nclass MessageTemplateClient extends BaseClient\n{\n    /**\n     * Required attributes.\n     *\n     * @var array\n     */\n    protected $required = ['title', 'url', 'pic_media_id', 'appid', 'page'];\n\n    protected $textMessage = [\n        'content' => '',\n    ];\n\n    protected $imageMessage = [\n        'media_id' => '',\n        'pic_url' => '',\n    ];\n\n    protected $linkMessage = [\n        'title' => '',\n        'picurl' => '',\n        'desc' => '',\n        'url' => '',\n    ];\n\n    protected $miniprogramMessage = [\n        'title' => '',\n        'pic_media_id' => '',\n        'appid' => '',\n        'page' => '',\n    ];\n\n    /**\n     * 添加入群欢迎语素材.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92366\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     */\n    public function create(array $msgTemplate)\n    {\n        $params = $this->formatMessage($msgTemplate);\n\n        return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/add', $params);\n    }\n\n    /**\n     * 编辑入群欢迎语素材.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92366\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     */\n    public function update(string $templateId, array $msgTemplate)\n    {\n        $params = $this->formatMessage($msgTemplate);\n        $params = array_merge([\n            'template_id' => $templateId,\n        ], $params);\n        return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/edit', $params);\n    }\n\n    /**\n     * 获取入群欢迎语素材.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92366\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     */\n    public function get(string $templateId)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/get', [\n            'template_id' => $templateId,\n        ]);\n    }\n\n    /**\n     * 删除入群欢迎语素材.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92366\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     */\n    public function delete(string $templateId)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/del', [\n            'template_id' => $templateId,\n        ]);\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     * @return array\n     */\n    protected function formatMessage(array $data = [])\n    {\n        $params = $data;\n\n        if (!empty($params['text'])) {\n            $params['text'] = $this->formatFields($params['text'], $this->textMessage);\n        }\n\n        if (!empty($params['image'])) {\n            $params['image'] = $this->formatFields($params['image'], $this->imageMessage);\n        }\n\n        if (!empty($params['link'])) {\n            $params['link'] = $this->formatFields($params['link'], $this->linkMessage);\n        }\n\n        if (!empty($params['miniprogram'])) {\n            $params['miniprogram'] = $this->formatFields($params['miniprogram'], $this->miniprogramMessage);\n        }\n\n        return $params;\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     * @return array\n     */\n    protected function formatFields(array $data = [], array $default = [])\n    {\n        $params = array_merge($default, $data);\n        foreach ($params as $key => $value) {\n            if (in_array($key, $this->required, true) && empty($value) && empty($default[$key])) {\n                throw new InvalidArgumentException(sprintf('Attribute \"%s\" can not be empty!', $key));\n            }\n\n            $params[$key] = empty($value) ? $default[$key] : $value;\n        }\n\n        return $params;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/MomentClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\ExternalContact;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class MomentClient.\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass MomentClient extends BaseClient\n{\n    /**\n     * 创建发表任务\n     *\n     * @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\n     * @param array $param\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createTask(array $param)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/add_moment_task', $param);\n    }\n\n    /**\n     * 获取任务创建结果\n     *\n     * @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\n     *\n     * @param string $jobId 异步任务id\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTask(string $jobId)\n    {\n        return $this->httpGet('cgi-bin/externalcontact/get_moment_task_result', ['jobid' => $jobId]);\n    }\n\n\n    /**\n     * 获取企业全部的发表列表.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93333#获取企业全部的发表列表\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/get_moment_list', $params);\n    }\n\n    /**\n     * 获取客户朋友圈企业发表的列表.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93333#获取客户朋友圈企业发表的列表\n     *\n     * @param string $momentId\n     * @param string $cursor\n     * @param int $limit\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getTasks(string $momentId, string $cursor = '', int $limit = 500)\n    {\n        $params = [\n            'moment_id' => $momentId,\n            'cursor' => $cursor,\n            'limit' => $limit\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/get_moment_task', $params);\n    }\n\n    /**\n     * 获取客户朋友圈发表时选择的可见范围.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93333#获取客户朋友圈发表时选择的可见范围\n     *\n     * @param string $momentId\n     * @param string $userId\n     * @param string $cursor\n     * @param int $limit\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getCustomers(string $momentId, string $userId, string $cursor, int $limit)\n    {\n        $params = [\n            'moment_id' => $momentId,\n            'userid' => $userId,\n            'cursor' => $cursor,\n            'limit' => $limit\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/get_moment_customer_list', $params);\n    }\n\n    /**\n     * 获取客户朋友圈发表后的可见客户列表.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93333#获取客户朋友圈发表后的可见客户列表\n     *\n     * @param string $momentId\n     * @param string $userId\n     * @param string $cursor\n     * @param int $limit\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getSendResult(string $momentId, string $userId, string $cursor, int $limit)\n    {\n        $params = [\n            'moment_id' => $momentId,\n            'userid' => $userId,\n            'cursor' => $cursor,\n            'limit' => $limit\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/get_moment_send_result', $params);\n    }\n\n    /**\n     * 获取客户朋友圈的互动数据.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93333#获取客户朋友圈的互动数据\n     *\n     * @param string $momentId\n     * @param string $userId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getComments(string $momentId, string $userId)\n    {\n        $params = [\n            'moment_id' => $momentId,\n            'userid' => $userId\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/get_moment_comments', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/ProductClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\ExternalContact;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class ProductClient.\n *\n * @package EasyWeChat\\Work\\ExternalContact\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass ProductClient extends BaseClient\n{\n    /**\n     * 创建商品图册.\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/95096\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @author 读心印 <aa24615@qq.com>\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function createProductAlbum(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/add_product_album', $params);\n    }\n\n    /**\n     * 获取商品图册.\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/95096\n     *\n     * @param string $productId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @author 读心印 <aa24615@qq.com>\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getProductAlbumDetails(string $productId)\n    {\n        $params = [\n            'product_id' => $productId\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/get_product_album', $params);\n    }\n\n    /**\n     * 获取商品图册列表.\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/95096\n     *\n     * @param int $limit\n     * @param string $cursor\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @author 读心印 <aa24615@qq.com>\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getProductAlbums(int $limit, string $cursor)\n    {\n        $params = [\n            'limit' => $limit,\n            'cursor' => $cursor,\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/get_product_album_list', $params);\n    }\n\n    /**\n     * 编辑商品图册.\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/95096\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @author 读心印 <aa24615@qq.com>\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function updateProductAlbum(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/update_product_album', $params);\n    }\n\n    /**\n     * 删除商品图册.\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/95096\n     *\n     * @param string $productId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @author 读心印 <aa24615@qq.com>\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function deleteProductAlbum(string $productId)\n    {\n        $params = [\n            'product_id' => $productId\n        ];\n\n        return $this->httpPostJson('cgi-bin/externalcontact/delete_product_album', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/SchoolClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\ExternalContact;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author MillsGuo <millsguo@gmail.com>\n */\nclass SchoolClient extends BaseClient\n{\n    /**\n     * 创建部门\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92340\n     * @param string $name\n     * @param int $parentId\n     * @param int $type\n     * @param int $standardGrade\n     * @param int $registerYear\n     * @param int $order\n     * @param array $departmentAdmins [['userid':'139','type':1],['userid':'1399','type':2]]\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function createDepartment(string $name, int $parentId, int $type, int $standardGrade, int $registerYear, int $order, array $departmentAdmins)\n    {\n        $params = [\n            'name' => $name,\n            'parentid' => $parentId,\n            'type' => $type,\n            'standard_grade' => $standardGrade,\n            'register_year' => $registerYear,\n            'order' => $order,\n            'department_admins' => $departmentAdmins\n        ];\n\n        return $this->httpPostJson('cgi-bin/school/department/create', $params);\n    }\n\n    /**\n     * 更新部门\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92341\n     * @param int $id\n     * @param string $name\n     * @param int $parentId\n     * @param int $type\n     * @param int $standardGrade\n     * @param int $registerYear\n     * @param int $order\n     * @param array $departmentAdmins [['op':0,'userid':'139','type':1],['op':1,'userid':'1399','type':2]] OP=0表示新增或更新，OP=1表示删除管理员\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function updateDepartment(int $id, string $name, int $parentId, int $type, int $standardGrade, int $registerYear, int $order, array $departmentAdmins)\n    {\n        $params = [\n            'id' => $id,\n            'name' => $name,\n            'parentid' => $parentId,\n            'type' => $type,\n            'standard_grade' => $standardGrade,\n            'register_year' => $registerYear,\n            'order' => $order,\n            'department_admins' => $departmentAdmins\n        ];\n        $params = $this->filterNullValue($params);\n\n        return $this->httpPostJson('cgi-bin/school/department/update', $params);\n    }\n\n    /**\n     * 删除部门\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92342\n     * @param int $id\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function deleteDepartment(int $id)\n    {\n        return $this->httpGet('cgi-bin/school/department/delete', [\n            'id' => $id\n        ]);\n    }\n\n    /**\n     * 获取部门列表\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92343\n     * @param int $id 如果ID为0，则获取全量组织架构\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getDepartments(int $id)\n    {\n        if ($id > 0) {\n            $params = [\n                'id' => $id\n            ];\n        } else {\n            $params = [];\n        }\n\n        return $this->httpGet('cgi-bin/school/department/list', $params);\n    }\n\n    /**\n     * 创建学生\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92325\n     * @param string $userId\n     * @param string $name\n     * @param array $department\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function createStudent(string $userId, string $name, array $department)\n    {\n        $params = [\n            'student_userid' => $userId,\n            'name' => $name,\n            'department' => $department\n        ];\n\n        return $this->httpPostJson('cgi-bin/school/user/create_student', $params);\n    }\n\n    /**\n     * 删除学生\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92326\n     * @param string $userId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function deleteStudent(string $userId)\n    {\n        return $this->httpGet('cgi-bin/school/user/delete_student', [\n            'userid' => $userId\n        ]);\n    }\n\n    /**\n     * 更新学生\n     * @see  https://work.weixin.qq.com/api/doc/90000/90135/92327\n     * @param string $userId\n     * @param string $name\n     * @param string $newUserId\n     * @param array $department\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function updateStudent(string $userId, string $name, string $newUserId, array $department)\n    {\n        $params = [\n            'student_userid' => $userId\n        ];\n        if (!empty($name)) {\n            $params['name'] = $name;\n        }\n        if (!empty($newUserId)) {\n            $params['new_student_userid'] = $newUserId;\n        }\n        if (!empty($department)) {\n            $params['department'] = $department;\n        }\n\n        return $this->httpPostJson('cgi-bin/school/user/update_student', $params);\n    }\n\n    /**\n     * 批量创建学生，学生最多100个\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92328\n     * @param array $students 学生格式：[[student_userid:'','name':'','department':[1,2]],['student_userid':'','name':'','department':[1,2]]]\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function batchCreateStudents(array $students)\n    {\n        $params = [\n            'students' => $students\n        ];\n\n        return $this->httpPostJson('cgi-bin/school/user/batch_create_student', $params);\n    }\n\n    /**\n     * 批量删除学生，每次最多100个学生\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92329\n     * @param array $useridList 学生USERID，格式：['zhangsan','lisi']\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function batchDeleteStudents(array $useridList)\n    {\n        return $this->httpPostJson('cgi-bin/school/user/batch_delete_student', [\n            'useridlist' => $useridList\n        ]);\n    }\n\n    /**\n     * 批量更新学生，每次最多100个\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92042\n     * @param array $students 格式：[['student_userid':'lisi','new_student_userid':'lisi2','name':'','department':[1,2]],.....]\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function batchUpdateStudents(array $students)\n    {\n        return $this->httpPostJson('cgi-bin/school/user/batch_update_student', [\n            'students' => $students\n        ]);\n    }\n\n    /**\n     * 创建家长\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92077\n     * @param string $userId\n     * @param string $mobile\n     * @param bool $toInvite\n     * @param array $children\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function createParent(string $userId, string $mobile, bool $toInvite, array $children)\n    {\n        $params = [\n            'parent_userid' => $userId,\n            'mobile' => $mobile,\n            'to_invite' => $toInvite,\n            'children' => $children\n        ];\n\n        return $this->httpPostJson('cgi-bin/school/user/create_parent', $params);\n    }\n\n    /**\n     * 删除家长\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92079\n     * @param string $userId\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function deleteParent(string $userId)\n    {\n        return $this->httpPostJson('cgi-bin/school/user/delete_parent', [\n            'userid' => $userId\n        ]);\n    }\n\n    /**\n     * 更新家长\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92081\n     * @param string $userId\n     * @param string $mobile\n     * @param string $newUserId\n     * @param array $children 格式：[['student_userid':'','relation':''],[]]\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function updateParent(string $userId, string $mobile, string $newUserId, array $children)\n    {\n        $params = [\n            'parent_userid' => $userId\n        ];\n        if (!empty($newUserId)) {\n            $params['new_parent_userid'] = $newUserId;\n        }\n        if (!empty($mobile)) {\n            $params['mobile'] = $mobile;\n        }\n        if (!empty($children)) {\n            $params['children'] = $children;\n        }\n\n        return $this->httpPostJson('cgi-bin/school/user/update_parent', $params);\n    }\n\n    /**\n     * 批量创建家长 每次最多100个\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92078\n     * @param array $parents [['parent_userid':'','mobile':'','to_invite':true,'children':['student_userid':'','relation':'']],.....]\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function batchCreateParents(array $parents)\n    {\n        return $this->httpPostJson('cgi-bin/school/user/batch_create_parent', [\n            'parents' => $parents\n        ]);\n    }\n\n    /**\n     * 批量删除家长，每次最多100个\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92080\n     * @param array $userIdList 格式：['chang','lisi']\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function batchDeleteParents(array $userIdList)\n    {\n        return $this->httpPostJson('cgi-bin/school/user/batch_delete_parent', [\n            'useridlist' => $userIdList\n        ]);\n    }\n\n    /**\n     * 批量更新家长，每次最多100个\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92082\n     * @param array $parents 格式：[['parent_userid':'','new_parent_userid':'','mobile':'','children':[['student_userid':'','relation':''],...]],.....]\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function batchUpdateParents(array $parents)\n    {\n        return $this->httpPostJson('cgi-bin/school/user/batch_update_parent', [\n            'parents' => $parents\n        ]);\n    }\n\n    /**\n     * 读取学生或家长\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92038\n     * @param string $userId 学生或家长的userid\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getUser(string $userId)\n    {\n        return $this->httpGet('cgi-bin/school/user/get', [\n            'userid' => $userId\n        ]);\n    }\n\n    /**\n     * 获取部门成员详情\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92038\n     * @param int $departmentId\n     * @param bool $fetchChild\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getStudents(int $departmentId, bool $fetchChild)\n    {\n        $params = [\n            'department_id' => $departmentId\n        ];\n        if ($fetchChild) {\n            $params['fetch_child'] = 1;\n        } else {\n            $params['fetch_child'] = 0;\n        }\n\n        return $this->httpGet('cgi-bin/school/user/list', $params);\n    }\n\n    /**\n     * 获取学校通知二维码\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92197\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getSubscribeQrCode()\n    {\n        return $this->httpGet('cgi-bin/externalcontact/get_subscribe_qr_code');\n    }\n\n    /**\n     * 设置关注学校通知的模式\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92290\n     * @param int $mode 关注模式，1可扫码填写资料加入，2禁止扫码填写资料加入\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function setSubscribeMode(int $mode)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/set_subscribe_mode', [\n            'subscribe_mode' => $mode\n        ]);\n    }\n\n    /**\n     * 获取关注学校通知的模式\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92290\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getSubscribeMode()\n    {\n        return $this->httpGet('cgi-bin/externalcontact/get_subscribe_mode');\n    }\n\n    /**\n     * 设置【老师可查看班级】的模式\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92652\n     * @param int $mode\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function setTeacherViewMode(int $mode)\n    {\n        return $this->httpPostJson('cgi-bin/school/set_teacher_view_mode', [\n            'view_mode' => $mode\n        ]);\n    }\n\n    /**\n     * 获取【老师可查看班级】的模式\n     * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92652\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getTeacherViewMode()\n    {\n        return $this->httpGet('cgi-bin/school/get_teacher_view_mode');\n    }\n\n    /**\n     * 过滤数组中值为NULL的键\n     * @param array $data\n     * @return array\n     */\n    protected function filterNullValue(array $data)\n    {\n        $returnData = [];\n        foreach ($data as $key => $value) {\n            if ($value !== null) {\n                $returnData[$key] = trim($value);\n            }\n        }\n\n        return $returnData;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\ExternalContact;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['external_contact'] = function ($app) {\n            return new Client($app);\n        };\n\n        $app['contact_way'] = function ($app) {\n            return new ContactWayClient($app);\n        };\n\n        $app['group_chat_way'] = function ($app) {\n            return new GroupChatWayClient($app);\n        };\n\n        $app['external_contact_statistics'] = function ($app) {\n            return new StatisticsClient($app);\n        };\n\n        $app['external_contact_message'] = function ($app) {\n            return new MessageClient($app);\n        };\n\n        $app['school'] = function ($app) {\n            return new SchoolClient($app);\n        };\n\n        $app['external_contact_moment'] = function ($app) {\n            return new MomentClient($app);\n        };\n\n        $app['external_contact_message_template'] = function ($app) {\n            return new MessageTemplateClient($app);\n        };\n\n        $app['product'] = function ($app) {\n            return new ProductClient($app);\n        };\n\n        $app['intercept'] = function ($app) {\n            return new InterceptClient($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/StatisticsClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\ExternalContact;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class StatisticsClient.\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass StatisticsClient extends BaseClient\n{\n    /**\n     * 获取「联系客户统计」数据.\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92132\n     *\n     * @param array  $userIds\n     * @param string $from\n     * @param string $to\n     * @param array  $partyIds\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n\n    public function userBehavior(array $userIds, string $from, string $to, array $partyIds = [])\n    {\n        $params = [\n            'userid' => $userIds,\n            'partyid' => $partyIds,\n            'start_time' => $from,\n            'end_time' => $to,\n        ];\n        return $this->httpPostJson('cgi-bin/externalcontact/get_user_behavior_data', $params);\n    }\n\n\n    /**\n     * 获取「群聊数据统计」数据. (按群主聚合的方式)\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92133\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n\n    public function groupChatStatistic(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/groupchat/statistic', $params);\n    }\n\n\n    /**\n     * 获取「群聊数据统计」数据. (按自然日聚合的方式)\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92133\n     *\n     * @param int $dayBeginTime\n     * @param int $dayEndTime\n     * @param array $userIds\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n\n    public function groupChatStatisticGroupByDay(int $dayBeginTime, int $dayEndTime, array $userIds = [])\n    {\n        $params = [\n            'day_begin_time' => $dayBeginTime,\n            'day_end_time' => $dayEndTime,\n            'owner_filter' => [\n                'userid_list' => $userIds\n            ]\n        ];\n        return $this->httpPostJson('cgi-bin/externalcontact/groupchat/statistic_group_by_day', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\GroupRobot;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Work\\GroupRobot\\Messages\\Message;\n\n/**\n * Class Client.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @param string|Message $message\n     *\n     * @return Messenger\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function message($message)\n    {\n        return (new Messenger($this))->message($message);\n    }\n\n    /**\n     * @param string $key\n     * @param array  $message\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(string $key, array $message)\n    {\n        $this->accessToken = null;\n\n        return $this->httpPostJson('cgi-bin/webhook/send', $message, ['key' => $key]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/Image.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\GroupRobot\\Messages;\n\n/**\n * Class Image.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass Image extends Message\n{\n    /**\n     * @var string\n     */\n    protected $type = 'image';\n\n    /**\n     * @var array\n     */\n    protected $properties = ['base64', 'md5'];\n\n    /**\n     * Image constructor.\n     *\n     * @param string $base64\n     * @param string $md5\n     */\n    public function __construct(string $base64, string $md5)\n    {\n        parent::__construct(compact('base64', 'md5'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/Markdown.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\GroupRobot\\Messages;\n\n/**\n * Class Markdown.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass Markdown extends Message\n{\n    /**\n     * @var string\n     */\n    protected $type = 'markdown';\n\n    /**\n     * @var array\n     */\n    protected $properties = ['content'];\n\n    /**\n     * Markdown constructor.\n     *\n     * @param string $content\n     */\n    public function __construct(string $content)\n    {\n        parent::__construct(compact('content'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/Message.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\GroupRobot\\Messages;\n\nuse EasyWeChat\\Kernel\\Messages\\Message as BaseMessage;\n\n/**\n * Class Message.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass Message extends BaseMessage\n{\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/News.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\GroupRobot\\Messages;\n\n/**\n * Class News.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass News extends Message\n{\n    /**\n     * @var string\n     */\n    protected $type = 'news';\n\n    /**\n     * @var array\n     */\n    protected $properties = ['items'];\n\n    /**\n     * News constructor.\n     *\n     * @param array $items\n     */\n    public function __construct(array $items = [])\n    {\n        parent::__construct(compact('items'));\n    }\n\n    /**\n     * @param array $data\n     * @param array $aliases\n     *\n     * @return array\n     */\n    public function propertiesToArray(array $data, array $aliases = []): array\n    {\n        return ['articles' => array_map(function ($item) {\n            if ($item instanceof NewsItem) {\n                return $item->toJsonArray();\n            }\n        }, $this->get('items'))];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/NewsItem.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\GroupRobot\\Messages;\n\n/**\n * Class NewsItem.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass NewsItem extends Message\n{\n    /**\n     * @var string\n     */\n    protected $type = 'news';\n\n    /**\n     * @var array\n     */\n    protected $properties = [\n        'title',\n        'description',\n        'url',\n        'image',\n    ];\n\n    public function toJsonArray()\n    {\n        return [\n            'title' => $this->get('title'),\n            'description' => $this->get('description'),\n            'url' => $this->get('url'),\n            'picurl' => $this->get('image'),\n        ];\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/Text.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\GroupRobot\\Messages;\n\n/**\n * Class Text.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass Text extends Message\n{\n    /**\n     * @var string\n     */\n    protected $type = 'text';\n\n    /**\n     * @var array\n     */\n    protected $properties = ['content', 'mentioned_list', 'mentioned_mobile_list'];\n\n    /**\n     * Text constructor.\n     *\n     * @param string       $content\n     * @param string|array $userIds\n     * @param string|array $mobiles\n     */\n    public function __construct(string $content, $userIds = [], $mobiles = [])\n    {\n        parent::__construct([\n            'content' => $content,\n            'mentioned_list' => (array) $userIds,\n            'mentioned_mobile_list' => (array) $mobiles,\n        ]);\n    }\n\n    /**\n     * @param array $userIds\n     *\n     * @return Text\n     */\n    public function mention($userIds)\n    {\n        $this->set('mentioned_list', (array) $userIds);\n\n        return $this;\n    }\n\n    /**\n     * @param array $mobiles\n     *\n     * @return Text\n     */\n    public function mentionByMobile($mobiles)\n    {\n        $this->set('mentioned_mobile_list', (array) $mobiles);\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messenger.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\GroupRobot;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException;\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Work\\GroupRobot\\Messages\\Message;\nuse EasyWeChat\\Work\\GroupRobot\\Messages\\Text;\n\n/**\n * Class Messenger.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass Messenger\n{\n    /**\n     * @var Client\n     */\n    protected $client;\n\n    /**\n     * @var Message|null\n     */\n    protected $message;\n\n    /**\n     * @var string|null\n     */\n    protected $groupKey;\n\n    /**\n     * Messenger constructor.\n     *\n     * @param Client $client\n     */\n    public function __construct(Client $client)\n    {\n        $this->client = $client;\n    }\n\n    /**\n     * @param string|Message $message\n     *\n     * @return Messenger\n     *\n     * @throws InvalidArgumentException\n     */\n    public function message($message)\n    {\n        if (is_string($message) || is_numeric($message)) {\n            $message = new Text($message);\n        }\n\n        if (!($message instanceof  Message)) {\n            throw new InvalidArgumentException('Invalid message.');\n        }\n\n        $this->message = $message;\n\n        return $this;\n    }\n\n    /**\n     * @param string $groupKey\n     *\n     * @return Messenger\n     */\n    public function toGroup(string $groupKey)\n    {\n        $this->groupKey = $groupKey;\n\n        return $this;\n    }\n\n    /**\n     * @param string|Message|null $message\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws RuntimeException\n     * @throws InvalidArgumentException\n     * @throws InvalidConfigException\n     */\n    public function send($message = null)\n    {\n        if ($message) {\n            $this->message($message);\n        }\n\n        if (empty($this->message)) {\n            throw new RuntimeException('No message to send.');\n        }\n\n        if (is_null($this->groupKey)) {\n            throw new RuntimeException('No group key specified.');\n        }\n\n        $message = $this->message->transformForJsonRequest();\n\n        return $this->client->send($this->groupKey, $message);\n    }\n\n    /**\n     * @param string $property\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public function __get($property)\n    {\n        if (property_exists($this, $property)) {\n            return $this->$property;\n        }\n\n        throw new InvalidArgumentException(sprintf('No property named \"%s\"', $property));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\GroupRobot;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function register(Container $app)\n    {\n        $app['group_robot'] = function ($app) {\n            return new Client($app);\n        };\n\n        $app['group_robot_messenger'] = function ($app) {\n            return new Messenger($app['group_robot']);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupWelcomeTemplate/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\GroupWelcomeTemplate;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * 入群欢迎语素材管理\n *\n * @package EasyWeChat\\Work\\GroupWelcomeTemplate\\Client\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 添加入群欢迎语素材\n     *\n     * @description 企业可通过此API向企业的入群欢迎语素材库中添加素材。每个企业的入群欢迎语素材库中，最多容纳100个素材。\n     * @param array $data\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(array $data)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/add', $data);\n    }\n\n\n    /**\n     * 编辑入群欢迎语素材\n     *\n     * @description 企业可通过此API编辑入群欢迎语素材库中的素材，且仅能够编辑调用方自己创建的入群欢迎语素材。\n     * @param string $templateId 欢迎语素材id\n     * @param array $data\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function edit(string $templateId, array $data)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/edit', array_merge(\n            ['template_id' => $templateId],\n            $data\n        ));\n    }\n\n    /**\n     * 获取入群欢迎语素材\n     *\n     * @description 企业可通过此API获取入群欢迎语素材。\n     * @param string $templateId 欢迎语素材id\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $templateId)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/get', ['template_id' => $templateId]);\n    }\n\n    /**\n     * 删除入群欢迎语素材\n     *\n     * @description 企业可通过此API删除入群欢迎语素材，且仅能删除调用方自己创建的入群欢迎语素材。\n     * @param string $templateId 欢迎语素材id\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function del(string $templateId)\n    {\n        return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/del', ['template_id' => $templateId]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupWelcomeTemplate/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\GroupWelcomeTemplate;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * 入群欢迎语素材管理\n *\n * @package EasyWeChat\\Work\\GroupWelcomeTemplate\\ServiceProvider\n * @author HaoLiang <haoliang@qiyuankeji.cn>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['group_welcome_template'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Invoice/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Invoice;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @param string $cardId\n     * @param string $encryptCode\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $cardId, string $encryptCode)\n    {\n        $params = [\n            'card_id' => $cardId,\n            'encrypt_code' => $encryptCode,\n        ];\n\n        return $this->httpPostJson('cgi-bin/card/invoice/reimburse/getinvoiceinfo', $params);\n    }\n\n    /**\n     * @param array $invoices\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function select(array $invoices)\n    {\n        $params = [\n            'item_list' => $invoices,\n        ];\n\n        return $this->httpPostJson('cgi-bin/card/invoice/reimburse/getinvoiceinfobatch', $params);\n    }\n\n    /**\n     * @param string $cardId\n     * @param string $encryptCode\n     * @param string $status\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $cardId, string $encryptCode, string $status)\n    {\n        $params = [\n            'card_id' => $cardId,\n            'encrypt_code' => $encryptCode,\n            'reimburse_status' => $status,\n        ];\n\n        return $this->httpPostJson('cgi-bin/card/invoice/reimburse/updateinvoicestatus', $params);\n    }\n\n    /**\n     * @param array  $invoices\n     * @param string $openid\n     * @param string $status\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function batchUpdate(array $invoices, string $openid, string $status)\n    {\n        $params = [\n            'openid' => $openid,\n            'reimburse_status' => $status,\n            'invoice_list' => $invoices,\n        ];\n\n        return $this->httpPostJson('cgi-bin/card/invoice/reimburse/updatestatusbatch', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Invoice/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Invoice;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['invoice'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Jssdk/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Jssdk;\n\nuse EasyWeChat\\BasicService\\Jssdk\\Client as BaseClient;\nuse EasyWeChat\\Kernel\\Contracts\\AccessTokenInterface;\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\ServiceContainer;\nuse EasyWeChat\\Kernel\\Support;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    public function __construct(ServiceContainer $app, AccessTokenInterface $accessToken = null)\n    {\n        parent::__construct($app, $accessToken);\n\n        $this->ticketEndpoint = \\rtrim($app->config->get('http.base_uri'), '/').'/cgi-bin/get_jsapi_ticket';\n    }\n\n    /**\n     * @return string\n     */\n    protected function getAppId()\n    {\n        return $this->app['config']->get('corp_id');\n    }\n\n    /**\n     * Return jsapi agent config as a PHP array.\n     *\n     * @param  array  $apis\n     * @param  int|string  $agentId\n     * @param  bool  $debug\n     * @param  bool  $beta\n     * @param  array  $openTagList\n     * @param  string|null  $url\n     *\n     * @return array|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function getAgentConfigArray(\n        array $apis,\n        $agentId,\n        bool $debug = false,\n        bool $beta = false,\n        array $openTagList = [],\n        string $url = null\n    ) {\n        return $this->buildAgentConfig($apis, $agentId, $debug, $beta, false, $openTagList, $url);\n    }\n\n    /**\n     * Get agent config json for jsapi.\n     *\n     * @param  array  $jsApiList\n     * @param  int|string  $agentId\n     * @param  bool  $debug\n     * @param  bool  $beta\n     * @param  bool  $json\n     * @param  array  $openTagList\n     * @param  string|null  $url\n     *\n     * @return array|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function buildAgentConfig(\n        array $jsApiList,\n        $agentId,\n        bool $debug = false,\n        bool $beta = false,\n        bool $json = true,\n        array $openTagList = [],\n        string $url = null\n    ) {\n        $config = array_merge(compact('debug', 'beta', 'jsApiList', 'openTagList'), $this->agentConfigSignature($agentId, $url));\n\n        return $json ? json_encode($config) : $config;\n    }\n\n    /**\n     * @param  int|string  $agentId\n     * @param  string|null  $url\n     * @param  string|null  $nonce\n     * @param  null  $timestamp\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    protected function agentConfigSignature($agentId, string $url = null, string $nonce = null, $timestamp = null): array\n    {\n        $url = $url ?: $this->getUrl();\n        $nonce = $nonce ?: Support\\Str::quickRandom(10);\n        $timestamp = $timestamp ?: time();\n\n        return [\n            'corpid' => $this->getAppId(),\n            'agentid' => $agentId,\n            'nonceStr' => $nonce,\n            'timestamp' => $timestamp,\n            'url' => $url,\n            'signature' => $this->getTicketSignature($this->getAgentTicket($agentId)['ticket'], $nonce, $timestamp, $url),\n        ];\n    }\n\n    /**\n     * Get js ticket.\n     *\n     * @param  bool  $refresh\n     * @param  string  $type\n     *\n     * @return array\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function getTicket(bool $refresh = false, string $type = 'config'): array\n    {\n        $cacheKey = sprintf('easywechat.work.jssdk.ticket.%s.%s', $type, $this->getAppId());\n\n        if (!$refresh && $this->getCache()->has($cacheKey)) {\n            return $this->getCache()->get($cacheKey);\n        }\n\n        /** @var array<string, mixed> $result */\n        $result = $this->castResponseToType(\n            $this->requestRaw($this->ticketEndpoint, 'GET'),\n            'array'\n        );\n\n        $this->getCache()->set($cacheKey, $result, $result['expires_in'] - 500);\n\n        if (!$this->getCache()->has($cacheKey)) {\n            throw new RuntimeException('Failed to cache jssdk ticket.');\n        }\n\n        return $result;\n    }\n\n    /**\n     * @param  int  $agentId\n     * @param  bool  $refresh\n     * @param  string  $type\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|mixed|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     */\n    public function getAgentTicket($agentId, bool $refresh = false, string $type = 'agent_config')\n    {\n        $cacheKey = sprintf('easywechat.work.jssdk.ticket.%s.%s.%s', $agentId, $type, $this->getAppId());\n\n        if (!$refresh && $this->getCache()->has($cacheKey)) {\n            return $this->getCache()->get($cacheKey);\n        }\n\n        /** @var array<string, mixed> $result */\n        $result = $this->castResponseToType(\n            $this->requestRaw('cgi-bin/ticket/get', 'GET', ['query' => ['type' => $type]]),\n            'array'\n        );\n\n        $this->getCache()->set($cacheKey, $result, $result['expires_in'] - 500);\n\n        if (!$this->getCache()->has($cacheKey)) {\n            throw new RuntimeException('Failed to cache jssdk ticket.');\n        }\n\n        return $result;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Jssdk/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Jssdk;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['jssdk'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Kf/AccountClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Kf;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class AccountClient.\n *\n * @package EasyWeChat\\Work\\Kf\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass AccountClient extends BaseClient\n{\n    /**\n     * 添加客服帐号.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94662\n     *\n     * @param string $name\n     * @param string $mediaId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(string $name, string $mediaId)\n    {\n        $params = [\n            'name' => $name,\n            'media_id' => $mediaId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/kf/account/add', $params);\n    }\n\n    /**\n     * 修改客服帐号.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94664\n     *\n     * @param string $openKfId\n     * @param string $name\n     * @param string $mediaId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $openKfId, string $name, string $mediaId)\n    {\n        $params = [\n            'open_kfid' => $openKfId,\n            'name' => $name,\n            'media_id' => $mediaId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/kf/account/update', $params);\n    }\n\n    /**\n     * 删除客服帐号.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94663\n     *\n     * @param string $openKfId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function del(string $openKfId)\n    {\n        $params = [\n            'open_kfid' => $openKfId\n        ];\n\n        return $this->httpPostJson('cgi-bin/kf/account/del', $params);\n    }\n\n    /**\n     * 获取客服帐号列表.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94661\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list()\n    {\n        return $this->httpGet('cgi-bin/kf/account/list');\n    }\n\n    /**\n     * 获取客服帐号链接.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94665\n     *\n     * @param string $openKfId\n     * @param string $scene\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getAccountLink(string $openKfId, string $scene)\n    {\n        $params = [\n            'open_kfid' => $openKfId,\n            'scene' => $scene\n        ];\n\n        return $this->httpPostJson('cgi-bin/kf/add_contact_way', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Kf/MessageClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Kf;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class MessageClient.\n *\n * @package EasyWeChat\\Work\\Kf\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass MessageClient extends BaseClient\n{\n    /**\n     * 获取会话状态.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94669\n     *\n     * @param string $openKfId\n     * @param string $externalUserId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function state(string $openKfId, string $externalUserId)\n    {\n        $params = [\n            'open_kfid' => $openKfId,\n            'external_userid' => $externalUserId\n        ];\n\n        return $this->httpPostJson('cgi-bin/kf/service_state/get', $params);\n    }\n\n    /**\n     * 变更会话状态.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94669\n     *\n     * @param string $openKfId\n     * @param string $externalUserId\n     * @param int $serviceState\n     * @param string $serviceUserId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateState(string $openKfId, string $externalUserId, int $serviceState, string $serviceUserId)\n    {\n        $params = [\n            'open_kfid' => $openKfId,\n            'external_userid' => $externalUserId,\n            'service_state' => $serviceState,\n            'servicer_userid' => $serviceUserId\n        ];\n\n        return $this->httpPostJson('cgi-bin/kf/service_state/trans', $params);\n    }\n\n    /**\n     * 读取消息.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94670\n     *\n     * @param string $cursor\n     * @param string $token\n     * @param int $limit\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function sync(string $cursor, string $token, int $limit)\n    {\n        $params = [\n            'cursor' => $cursor,\n            'token' => $token,\n            'limit' => $limit\n        ];\n\n        return $this->httpPostJson('cgi-bin/kf/sync_msg', $params);\n    }\n\n    /**\n     * 发送消息.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94677\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/kf/send_msg', $params);\n    }\n\n    /**\n     * 发送事件响应消息.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94677\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function event(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/kf/send_msg_on_event', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Kf/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Kf;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @package EasyWeChat\\Work\\Kf\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['kf_account'] = function ($app) {\n            return new AccountClient($app);\n        };\n\n        $app['kf_servicer'] = function ($app) {\n            return new ServicerClient($app);\n        };\n\n        $app['kf_message'] = function ($app) {\n            return new MessageClient($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Kf/ServicerClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Kf;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class ServicerClient.\n *\n * @package EasyWeChat\\Work\\Kf\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass ServicerClient extends BaseClient\n{\n    /**\n     * 添加接待人员.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94646\n     *\n     * @param string $openKfId\n     * @param array $userIds\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(string $openKfId, array $userIds)\n    {\n        $params = [\n            'open_kfid' => $openKfId,\n            'userid_list' => $userIds\n        ];\n\n        return $this->httpPostJson('cgi-bin/kf/servicer/add', $params);\n    }\n\n    /**\n     * 删除接待人员.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94647\n     *\n     * @param string $openKfId\n     * @param array $userIds\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function del(string $openKfId, array $userIds)\n    {\n        $params = [\n            'open_kfid' => $openKfId,\n            'userid_list' => $userIds\n        ];\n\n        return $this->httpPostJson('cgi-bin/kf/servicer/del', $params);\n    }\n\n    /**\n     * 获取接待人员列表.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94645\n     *\n     * @param string $openKfId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function list(string $openKfId)\n    {\n        $params = [\n            'open_kfid' => $openKfId\n        ];\n\n        return $this->httpGet('cgi-bin/kf/servicer/list', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Live/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Live;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author arthasking <arthasking@126.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * 获取成员直播ID列表\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92735\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUserLivingId(string $userId, int $beginTime, int $endTime, string $nextKey = '0', int $limit = 100)\n    {\n        $params = [\n            'userid' => $userId,\n            'begin_time' => $beginTime,\n            'end_time' => $endTime,\n            'next_key' => $nextKey,\n            'limit' => $limit\n        ];\n\n        return $this->httpPostJson('cgi-bin/living/get_user_livingid', $params);\n    }\n\n    /**\n     * 获取直播详情\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92734\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getLiving(string $livingId)\n    {\n        $params = [\n            'livingid' => $livingId,\n        ];\n\n        return $this->httpGet('cgi-bin/living/get_living_info', $params);\n    }\n\n    /**\n     * 获取看直播统计\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/92736\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getWatchStat(string $livingId, string $nextKey = '0')\n    {\n        $params = [\n            'livingid' => $livingId,\n            'next_key' => $nextKey,\n        ];\n\n        return $this->httpPostJson('cgi-bin/living/get_watch_stat', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Live/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Live;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author arthasking <arthasking@126.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['live'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Media/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Media;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Http\\StreamResponse;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get media.\n     *\n     * @param string $mediaId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Http\\Response|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get(string $mediaId)\n    {\n        return $this->getResources($mediaId, 'cgi-bin/media/get');\n    }\n\n    /**\n     * Upload Image.\n     *\n     * @param string $path\n     * @param array $form\n     *\n     * @return mixed\n     */\n    public function uploadImage(string $path, array $form = [])\n    {\n        return $this->upload('image', $path, $form);\n    }\n\n    /**\n     * Upload Voice.\n     *\n     * @param string $path\n     * @param array $form\n     *\n     * @return mixed\n     */\n    public function uploadVoice(string $path, array $form = [])\n    {\n        return $this->upload('voice', $path, $form);\n    }\n\n    /**\n     * Upload Video.\n     *\n     * @param string $path\n     * @param array $form\n     *\n     * @return mixed\n     */\n    public function uploadVideo(string $path, array $form = [])\n    {\n        return $this->upload('video', $path, $form);\n    }\n\n    /**\n     * Upload File.\n     *\n     * @param string $path\n     * @param array $form\n     *\n     * @return mixed\n     */\n    public function uploadFile(string $path, array $form = [])\n    {\n        return $this->upload('file', $path, $form);\n    }\n\n    /**\n     * Upload media.\n     *\n     * @param string $type\n     * @param string $path\n     * @param array $form\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function upload(string $type, string $path, array $form = [])\n    {\n        $files = [\n            'media' => $path,\n        ];\n\n        return $this->httpUpload('cgi-bin/media/upload', $files, $form, compact('type'));\n    }\n\n    /**\n     * Upload permanently valid images\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/90256\n     * @param string $path\n     * @param array $form\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function uploadImg(string $path, array $form = [])\n    {\n        $files = [\n            'media' => $path,\n        ];\n\n        return $this->httpUpload('cgi-bin/media/uploadimg', $files, $form);\n    }\n\n\n    /**\n     * Get HD voice material\n     *\n     * @see https://work.weixin.qq.com/api/doc/90000/90135/90255\n     * @param string $mediaId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Http\\Response|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getHdVoice(string $mediaId)\n    {\n        return $this->getResources($mediaId, 'cgi-bin/media/get/jssdk');\n    }\n\n    /**\n     * @param string $mediaId\n     * @param string $uri\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Http\\Response|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function getResources(string $mediaId, string $uri)\n    {\n        $response = $this->requestRaw($uri, 'GET', [\n            'query' => [\n                'media_id' => $mediaId,\n            ],\n        ]);\n\n        if (false !== stripos($response->getHeaderLine('Content-Type'), 'text/plain')) {\n            return $this->castResponseToType($response, $this->app['config']->get('response_type'));\n        }\n\n        return StreamResponse::buildFromPsrResponse($response);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Media/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Media;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['media'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Menu/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Menu;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get menu.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function get()\n    {\n        return $this->httpGet('cgi-bin/menu/get', ['agentid' => $this->app['config']['agent_id']]);\n    }\n\n    /**\n     * Create menu for the given agent.\n     *\n     * @param array $data\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $data)\n    {\n        return $this->httpPostJson('cgi-bin/menu/create', $data, ['agentid' => $this->app['config']['agent_id']]);\n    }\n\n    /**\n     * Delete menu.\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function delete()\n    {\n        return $this->httpGet('cgi-bin/menu/delete', ['agentid' => $this->app['config']['agent_id']]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Menu/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Menu;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['menu'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Message/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Message;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * @param string|\\EasyWeChat\\Kernel\\Messages\\Message $message\n     *\n     * @return \\EasyWeChat\\Work\\Message\\Messenger\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function message($message)\n    {\n        return (new Messenger($this))->message($message);\n    }\n\n    /**\n     * @param array $message\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function send(array $message)\n    {\n        return $this->httpPostJson('cgi-bin/message/send', $message);\n    }\n\n    /**\n     * 更新任务卡片消息状态\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/91579\n     *\n     * @param array $userids\n     * @param int $agentId\n     * @param string $taskId\n     * @param string $replaceName\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     */\n    public function updateTaskcard(array $userids, int $agentId, string $taskId, string $replaceName = '已收到')\n    {\n        $params = [\n            'userids' => $userids,\n            'agentid' => $agentId,\n            'task_id' => $taskId,\n            'replace_name' => $replaceName\n        ];\n\n        return $this->httpPostJson('cgi-bin/message/update_taskcard', $params);\n    }\n\n    /**\n     *  * 更新模版卡片消息状态\n     *\n     * @see https://developer.work.weixin.qq.com/document/path/94888\n     *\n     * @param array $userids\n     * @param int $agentId\n     * @param string $responseCode\n     * @param string $replaceName\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function updateTemplateCard(array $userids, int $agentId, string $responseCode, string $replaceName = '已收到')\n    {\n        $params = [\n            'userids' => $userids,\n            'agentid' => $agentId,\n            'response_code' => $responseCode,\n            'button' => [\n                'replace_name' => $replaceName\n            ]\n        ];\n\n        return $this->httpPostJson('cgi-bin/message/update_template_card', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Message/Messenger.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Message;\n\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\nuse EasyWeChat\\Kernel\\Exceptions\\RuntimeException;\nuse EasyWeChat\\Kernel\\Messages\\Message;\nuse EasyWeChat\\Kernel\\Messages\\Text;\nuse EasyWeChat\\Kernel\\Support\\Arr;\n\n/**\n * Class MessageBuilder.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Messenger\n{\n    /**\n     * @var \\EasyWeChat\\Kernel\\Messages\\Message;\n     */\n    protected $message;\n\n    /**\n     * @var array\n     */\n    protected $to = ['touser' => '@all'];\n\n    /**\n     * @var int\n     */\n    protected $agentId;\n\n    /**\n     * @var bool\n     */\n    protected $secretive = false;\n\n    /**\n     * @var \\EasyWeChat\\Work\\Message\\Client\n     */\n    protected $client;\n\n    /**\n     * MessageBuilder constructor.\n     *\n     * @param \\EasyWeChat\\Work\\Message\\Client $client\n     */\n    public function __construct(Client $client)\n    {\n        $this->client = $client;\n    }\n\n    /**\n     * Set message to send.\n     *\n     * @param string|Message $message\n     *\n     * @return \\EasyWeChat\\Work\\Message\\Messenger\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function message($message)\n    {\n        if (is_string($message) || is_numeric($message)) {\n            $message = new Text($message);\n        }\n\n        if (!($message instanceof Message)) {\n            throw new InvalidArgumentException('Invalid message.');\n        }\n\n        $this->message = $message;\n\n        return $this;\n    }\n\n    /**\n     * @param int $agentId\n     *\n     * @return \\EasyWeChat\\Work\\Message\\Messenger\n     */\n    public function ofAgent(int $agentId)\n    {\n        $this->agentId = $agentId;\n\n        return $this;\n    }\n\n    /**\n     * @param array|string $userIds\n     *\n     * @return \\EasyWeChat\\Work\\Message\\Messenger\n     */\n    public function toUser($userIds)\n    {\n        return $this->setRecipients($userIds, 'touser');\n    }\n\n    /**\n     * @param array|string $partyIds\n     *\n     * @return \\EasyWeChat\\Work\\Message\\Messenger\n     */\n    public function toParty($partyIds)\n    {\n        return $this->setRecipients($partyIds, 'toparty');\n    }\n\n    /**\n     * @param array|string $tagIds\n     *\n     * @return \\EasyWeChat\\Work\\Message\\Messenger\n     */\n    public function toTag($tagIds)\n    {\n        return $this->setRecipients($tagIds, 'totag');\n    }\n\n    /**\n     * Keep secret.\n     *\n     * @return \\EasyWeChat\\Work\\Message\\Messenger\n     */\n    public function secretive()\n    {\n        $this->secretive = true;\n\n        return $this;\n    }\n\n    /**\n     * verify recipient is '@all' or not\n     *\n     * @return bool\n     */\n    protected function isBroadcast(): bool\n    {\n        return Arr::get($this->to, 'touser') === '@all';\n    }\n\n    /**\n     * @param array|string $ids\n     * @param string       $key\n     *\n     * @return \\EasyWeChat\\Work\\Message\\Messenger\n     */\n    protected function setRecipients($ids, string $key): self\n    {\n        if (is_array($ids)) {\n            $ids = implode('|', $ids);\n        }\n\n        $this->to = $this->isBroadcast() ? [$key => $ids] : array_merge($this->to, [$key => $ids]);\n\n        return $this;\n    }\n\n    /**\n     * @param \\EasyWeChat\\Kernel\\Messages\\Message|string|null $message\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\RuntimeException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException\n     */\n    public function send($message = null)\n    {\n        if ($message) {\n            $this->message($message);\n        }\n\n        if (empty($this->message)) {\n            throw new RuntimeException('No message to send.');\n        }\n\n        if (is_null($this->agentId)) {\n            throw new RuntimeException('No agentid specified.');\n        }\n\n        $message = $this->message->transformForJsonRequest(array_merge([\n            'agentid' => $this->agentId,\n            'safe' => intval($this->secretive),\n        ], $this->to));\n\n        $this->secretive = false;\n\n        return $this->client->send($message);\n    }\n\n    /**\n     * Return property.\n     *\n     * @param string $property\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public function __get($property)\n    {\n        if (property_exists($this, $property)) {\n            return $this->$property;\n        }\n\n        throw new InvalidArgumentException(sprintf('No property named \"%s\"', $property));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Message/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Message;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['message'] = function ($app) {\n            return new Client($app);\n        };\n\n        $app['messenger'] = function ($app) {\n            $messenger = new Messenger($app['message']);\n\n            if (is_numeric($app['config']['agent_id'])) {\n                $messenger->ofAgent($app['config']['agent_id']);\n            }\n\n            return $messenger;\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/MiniProgram/Application.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\MiniProgram;\n\nuse EasyWeChat\\MiniProgram\\Application as MiniProgram;\nuse EasyWeChat\\Work\\Auth\\AccessToken;\nuse EasyWeChat\\Work\\MiniProgram\\Auth\\Client;\n\n/**\n * Class Application.\n *\n * @author Caikeal <caikeal@qq.com>\n *\n * @property \\EasyWeChat\\Work\\MiniProgram\\Auth\\Client $auth\n */\nclass Application extends MiniProgram\n{\n    /**\n     * Application constructor.\n     *\n     * @param array $config\n     * @param array $prepends\n     */\n    public function __construct(array $config = [], array $prepends = [])\n    {\n        parent::__construct($config, $prepends + [\n            'access_token' => function ($app) {\n                return new AccessToken($app);\n            },\n            'auth' => function ($app) {\n                return new Client($app);\n            },\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/MiniProgram/Auth/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\MiniProgram\\Auth;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get session info by code.\n     *\n     * @param string $code\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function session(string $code)\n    {\n        $params = [\n            'js_code' => $code,\n            'grant_type' => 'authorization_code',\n        ];\n\n        return $this->httpGet('cgi-bin/miniprogram/jscode2session', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Mobile/Auth/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Mobile\\Auth;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n */\nclass Client extends BaseClient\n{\n    /**\n     * 通过code获取用户信息.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90136/91193\n     *\n     * @param string $code\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getUser(string $code)\n    {\n        $params = [\n            'code' => $code,\n        ];\n\n        return $this->httpGet('cgi-bin/user/getuserinfo', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Mobile/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Mobile;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\nuse EasyWeChat\\Work\\Mobile\\Auth\\Client;\n\n/**\n * ServiceProvider.\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    protected $app;\n\n    /**\n     * @param Container $app\n     */\n    public function register(Container $app)\n    {\n        $app['mobile'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/MsgAudit/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\MsgAudit;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author ZengJJ <z373522886@foxmail.com >\n */\nclass Client extends BaseClient\n{\n    /**\n     * @param string|null $type\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException|\\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getPermitUsers(string $type = null)\n    {\n        return $this->httpPostJson('cgi-bin/msgaudit/get_permit_user_list', (empty($type) ? [] : ['type' => $type]));\n    }\n\n    /**\n     * @param array $info 数组，格式: [[userid, exteranalopenid], [userid, exteranalopenid]]\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getSingleAgreeStatus(array $info)\n    {\n        $params = [\n            'info' => $info\n        ];\n\n        return $this->httpPostJson('cgi-bin/msgaudit/check_single_agree', $params);\n    }\n\n    /**\n     * @param  string  $roomId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getRoomAgreeStatus(string $roomId)\n    {\n        $params = [\n            'roomid' => $roomId\n        ];\n\n        return $this->httpPostJson('cgi-bin/msgaudit/check_room_agree', $params);\n    }\n\n    /**\n     * @param  string  $roomId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getRoom(string $roomId)\n    {\n        $params = [\n            'roomid' => $roomId\n        ];\n\n        return $this->httpPostJson('cgi-bin/msgaudit/groupchat/get', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/MsgAudit/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\MsgAudit;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author ZengJJ <z373522886@foxmail.com >\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['msg_audit'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/OA/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\OA;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Get the checkin data.\n     *\n     * @param int   $startTime\n     * @param int   $endTime\n     * @param array $userList\n     * @param int   $type\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function checkinRecords(int $startTime, int $endTime, array $userList, int $type = 3)\n    {\n        $params = [\n            'opencheckindatatype' => $type,\n            'starttime' => $startTime,\n            'endtime' => $endTime,\n            'useridlist' => $userList,\n        ];\n\n        return $this->httpPostJson('cgi-bin/checkin/getcheckindata', $params);\n    }\n\n    /**\n     * Get the checkin rules.\n     *\n     * @param int   $datetime\n     * @param array $userList\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function checkinRules(int $datetime, array $userList)\n    {\n        $params = [\n            'datetime' => $datetime,\n            'useridlist' => $userList,\n        ];\n\n        return $this->httpPostJson('cgi-bin/checkin/getcheckinoption', $params);\n    }\n\n    /**\n     * 获取企业所有打卡规则.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93384\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     * @author 读心印 <aa24615@qq.com>\n     */\n    public function corpCheckinRules()\n    {\n        return $this->httpPostJson('cgi-bin/checkin/getcorpcheckinoption');\n    }\n\n    /**\n     * 获取打卡日报数据.\n     *\n     * @sse https://open.work.weixin.qq.com/api/doc/90000/90135/93374\n     *\n     * @param int   $startTime\n     * @param int   $endTime\n     * @param array $userids\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     * @author 读心印 <aa24615@qq.com>\n     */\n    public function checkinDayData(int $startTime, int $endTime, array $userids)\n    {\n        $params = [\n            'starttime' => $startTime,\n            'endtime' => $endTime,\n            'useridlist' => $userids,\n        ];\n\n        return $this->httpPostJson('cgi-bin/checkin/getcheckin_daydata', $params);\n    }\n\n    /**\n     * 获取打卡日报数据.\n     *\n     * @sse https://open.work.weixin.qq.com/api/doc/90000/90135/93387\n     *\n     * @param int   $startTime\n     * @param int   $endTime\n     * @param array $userids\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     * @author 读心印 <aa24615@qq.com>\n     */\n    public function checkinMonthData(int $startTime, int $endTime, array $userids)\n    {\n        $params = [\n            'starttime' => $startTime,\n            'endtime' => $endTime,\n            'useridlist' => $userids,\n        ];\n\n        return $this->httpPostJson('cgi-bin/checkin/getcheckin_monthdata', $params);\n    }\n\n    /**\n     * 获取打卡人员排班信息.\n     *\n     * @sse https://open.work.weixin.qq.com/api/doc/90000/90135/93380\n     *\n     * @param int   $startTime\n     * @param int   $endTime\n     * @param array $userids\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     * @author 读心印 <aa24615@qq.com>\n     */\n    public function checkinSchedus(int $startTime, int $endTime, array $userids)\n    {\n        $params = [\n            'starttime' => $startTime,\n            'endtime' => $endTime,\n            'useridlist' => $userids,\n        ];\n\n        return $this->httpPostJson('cgi-bin/checkin/getcheckinschedulist', $params);\n    }\n\n    /**\n     * 为打卡人员排班.\n     *\n     * @sse https://open.work.weixin.qq.com/api/doc/90000/90135/93385\n     *\n     * @param array $params\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     * @author 读心印 <aa24615@qq.com>\n     */\n    public function setCheckinSchedus(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/checkin/setcheckinschedulist', $params);\n    }\n\n    /**\n     * 录入打卡人员人脸信息.\n     *\n     * @sse https://open.work.weixin.qq.com/api/doc/90000/90135/93378\n     *\n     * @param string $userid\n     * @param string $userface\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     *\n     * @author 读心印 <aa24615@qq.com>\n     */\n    public function addCheckinUserface(string $userid, string $userface)\n    {\n        $params = [\n            'userid' => $userid,\n            'userface' => $userface\n        ];\n\n        return $this->httpPostJson('cgi-bin/checkin/addcheckinuserface', $params);\n    }\n\n    /**\n     * Get approval template details.\n     *\n     * @param string $templateId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function approvalTemplate(string $templateId)\n    {\n        $params = [\n            'template_id' => $templateId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/oa/gettemplatedetail', $params);\n    }\n\n    /**\n     * Submit an application for approval.\n     *\n     * @param array $data\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function createApproval(array $data)\n    {\n        return $this->httpPostJson('cgi-bin/oa/applyevent', $data);\n    }\n\n    /**\n     * Get Approval number.\n     *\n     * @param int   $startTime\n     * @param int   $endTime\n     * @param int   $nextCursor\n     * @param int   $size\n     * @param array $filters\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function approvalNumbers(int $startTime, int $endTime, int $nextCursor = 0, int $size = 100, array $filters = [])\n    {\n        $params = [\n            'starttime' => $startTime,\n            'endtime' => $endTime,\n            'cursor' => $nextCursor,\n            'size' => $size > 100 ? 100 : $size,\n            'filters' => $filters,\n        ];\n\n        return $this->httpPostJson('cgi-bin/oa/getapprovalinfo', $params);\n    }\n\n    /**\n     * Get approval detail.\n     *\n     * @param int $number\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function approvalDetail(int $number)\n    {\n        $params = [\n            'sp_no' => $number,\n        ];\n\n        return $this->httpPostJson('cgi-bin/oa/getapprovaldetail', $params);\n    }\n\n    /**\n     * Get Approval Data.\n     *\n     * @param int $startTime\n     * @param int $endTime\n     * @param int $nextNumber\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function approvalRecords(int $startTime, int $endTime, int $nextNumber = null)\n    {\n        $params = [\n            'starttime' => $startTime,\n            'endtime' => $endTime,\n            'next_spnum' => $nextNumber,\n        ];\n\n        return $this->httpPostJson('cgi-bin/corp/getapprovaldata', $params);\n    }\n\n\n    /**\n     * 获取公费电话拨打记录.\n     *\n     * @param int $startTime\n     * @param int $endTime\n     * @param int $offset\n     * @param int $limit\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function dialRecords(int $startTime, int $endTime, int $offset = 0, $limit = 100)\n    {\n        $params = [\n            'start_time' => $startTime,\n            'end_time' => $endTime,\n            'offset' => $offset,\n            'limit' => $limit\n        ];\n\n        return $this->httpPostJson('cgi-bin/dial/get_dial_record', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/OA/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\OA;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['oa'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/OAuth/Manager.php",
    "content": "<?php\n\nnamespace EasyWeChat\\Work\\OAuth;\n\nuse EasyWeChat\\Work\\Application;\nuse Overtrue\\Socialite\\Contracts\\ProviderInterface;\nuse Overtrue\\Socialite\\SocialiteManager;\nuse Symfony\\Component\\HttpFoundation\\RedirectResponse;\n\n/**\n * @method $this scopes(array $scopes)\n * @method $this setAgentId(string $agentId)\n */\nclass Manager\n{\n    protected $config;\n\n    /**\n     * @var \\Overtrue\\Socialite\\Contracts\\ProviderInterface\n     */\n    protected $provider;\n    protected $app;\n\n    public function __construct(array $config, Application $app)\n    {\n        $this->config = $config;\n        $this->app = $app;\n    }\n\n    public function redirect($redirect = null)\n    {\n        return new RedirectResponse($this->getProvider()->redirect($redirect));\n    }\n\n    public function user()\n    {\n        $this->getProvider()->withApiAccessToken($this->app['access_token']->getToken()['access_token']);\n\n        return $this->getProvider()->userFromCode($this->app->request->get('code'));\n    }\n\n    protected function getProvider(): ProviderInterface\n    {\n        return $this->provider ?? $this->provider = (new SocialiteManager($this->config))->create('wework');\n    }\n\n    public function __call($name, $arguments)\n    {\n        return \\call_user_func_array([$this->getProvider(), $name], $arguments);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/OAuth/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\OAuth;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\nclass ServiceProvider implements ServiceProviderInterface\n{\n    public function register(Container $app)\n    {\n        $app['oauth'] = function ($app) {\n            $socialite = (new Manager([\n                'wework' => [\n                    'base_url' => $app['config']['http']['base_uri'],\n                    'client_id' => $app['config']['corp_id'],\n                    'client_secret' => null,\n                    'corp_id' => $app['config']['corp_id'],\n                    'corp_secret' => $app['config']['secret'],\n                    'redirect' => $this->prepareCallbackUrl($app),\n                ],\n            ], $app));\n\n            $scopes = (array) $app['config']->get('oauth.scopes', ['snsapi_base']);\n\n            if (!empty($scopes)) {\n                $socialite->scopes($scopes);\n            } else {\n                $socialite->setAgentId($app['config']['agent_id']);\n            }\n\n            return $socialite;\n        };\n    }\n\n    /**\n     * Prepare the OAuth callback url for wechat.\n     *\n     * @param Container $app\n     *\n     * @return string\n     */\n    private function prepareCallbackUrl($app)\n    {\n        $callback = $app['config']->get('oauth.callback');\n\n        if (0 === stripos($callback, 'http')) {\n            return $callback;\n        }\n\n        $baseUrl = $app['request']->getSchemeAndHttpHost();\n\n        return $baseUrl.'/'.ltrim($callback, '/');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Schedule/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Schedule;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Add a schedule.\n     *\n     * @param array $schedule\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function add(array $schedule)\n    {\n        return $this->httpPostJson('cgi-bin/oa/schedule/add', compact('schedule'));\n    }\n\n    /**\n     * Update the schedule.\n     *\n     * @param string $id\n     * @param array  $schedule\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $id, array $schedule)\n    {\n        $schedule += ['schedule_id' => $id];\n\n        return $this->httpPostJson('cgi-bin/oa/schedule/update', compact('schedule'));\n    }\n\n    /**\n     * Get one or more schedules.\n     *\n     * @param string|array $ids\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function get($ids)\n    {\n        return $this->httpPostJson('cgi-bin/oa/schedule/get', ['schedule_id_list' => (array) $ids]);\n    }\n\n    /**\n     * Get the list of schedules under a calendar.\n     *\n     * @param string $calendarId\n     * @param int    $offset\n     * @param int    $limit\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getByCalendar(string $calendarId, int $offset = 0, int $limit = 500)\n    {\n        $data = compact('offset', 'limit') + ['cal_id' => $calendarId];\n\n        return $this->httpPostJson('cgi-bin/oa/schedule/get_by_calendar', $data);\n    }\n\n    /**\n     * Delete a schedule.\n     *\n     * @param string $id\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete(string $id)\n    {\n        return $this->httpPostJson('cgi-bin/oa/schedule/del', ['schedule_id' => $id]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Schedule/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Schedule;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author her-cat <i@her-cat.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function register(Container $app)\n    {\n        $app['schedule'] = function ($app) {\n            return new Client($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Server/Guard.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Server;\n\nuse EasyWeChat\\Kernel\\ServerGuard;\n\n/**\n * Class Guard.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass Guard extends ServerGuard\n{\n    /**\n     * @return $this\n     */\n    public function validate()\n    {\n        return $this;\n    }\n\n    /**\n     * Check the request message safe mode.\n     *\n     * @return bool\n     */\n    protected function isSafeMode(): bool\n    {\n        return true;\n    }\n\n    /**\n     * @return bool\n     */\n    protected function shouldReturnRawResponse(): bool\n    {\n        return !is_null($this->app['request']->get('echostr'));\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Server/Handlers/EchoStrHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Server\\Handlers;\n\nuse EasyWeChat\\Kernel\\Contracts\\EventHandlerInterface;\nuse EasyWeChat\\Kernel\\Decorators\\FinallyResult;\nuse EasyWeChat\\Kernel\\ServiceContainer;\n\n/**\n * Class EchoStrHandler.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass EchoStrHandler implements EventHandlerInterface\n{\n    /**\n     * @var ServiceContainer\n     */\n    protected $app;\n\n    /**\n     * EchoStrHandler constructor.\n     *\n     * @param ServiceContainer $app\n     */\n    public function __construct(ServiceContainer $app)\n    {\n        $this->app = $app;\n    }\n\n    /**\n     * @param mixed $payload\n     *\n     * @return FinallyResult|null\n     */\n    public function handle($payload = null)\n    {\n        if ($decrypted = $this->app['request']->get('echostr')) {\n            $str = $this->app['encryptor']->decrypt(\n                $decrypted,\n                $this->app['request']->get('msg_signature'),\n                $this->app['request']->get('nonce'),\n                $this->app['request']->get('timestamp')\n            );\n\n            return new FinallyResult($str);\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Server/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Server;\n\nuse EasyWeChat\\Kernel\\Encryptor;\nuse EasyWeChat\\Work\\Server\\Handlers\\EchoStrHandler;\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author overtrue <i@overtrue.me>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        !isset($app['encryptor']) && $app['encryptor'] = function ($app) {\n            return new Encryptor(\n                $app['config']['corp_id'],\n                $app['config']['token'],\n                $app['config']['aes_key']\n            );\n        };\n\n        !isset($app['server']) && $app['server'] = function ($app) {\n            $guard = new Guard($app);\n            $guard->push(new EchoStrHandler($app));\n\n            return $guard;\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/User/BatchJobsClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\User;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class BatchJobsClient.\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass BatchJobsClient extends BaseClient\n{\n    /**\n     * 增量更新成员.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/90980\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function batchUpdateUsers(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/batch/syncuser', $params);\n    }\n\n    /**\n     * 全量覆盖成员.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/90981\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function batchReplaceUsers(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/batch/replaceuser', $params);\n    }\n\n    /**\n     * 全量覆盖部门.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/90982\n     *\n     * @param array $params\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function batchReplaceDepartments(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/batch/replaceparty', $params);\n    }\n\n    /**\n     * 获取异步任务结果.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93169\n     *\n     * @param string $jobId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getJobStatus(string $jobId)\n    {\n        $params = [\n            'jobid' => $jobId\n        ];\n\n        return $this->httpGet('cgi-bin/batch/getresult', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/User/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\User;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Exceptions\\InvalidArgumentException;\n\n/**\n * Class Client.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass Client extends BaseClient\n{\n    /**\n     * Create a user.\n     *\n     * @param array $data\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(array $data)\n    {\n        return $this->httpPostJson('cgi-bin/user/create', $data);\n    }\n\n    /**\n     * Update an exist user.\n     *\n     * @param string $id\n     * @param array  $data\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(string $id, array $data)\n    {\n        return $this->httpPostJson('cgi-bin/user/update', array_merge(['userid' => $id], $data));\n    }\n\n    /**\n     * Delete a user.\n     *\n     * @param string|array $userId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function delete($userId)\n    {\n        if (is_array($userId)) {\n            return $this->batchDelete($userId);\n        }\n\n        return $this->httpGet('cgi-bin/user/delete', ['userid' => $userId]);\n    }\n\n    /**\n     * Batch delete users.\n     *\n     * @param array $userIds\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function batchDelete(array $userIds)\n    {\n        return $this->httpPostJson('cgi-bin/user/batchdelete', ['useridlist' => $userIds]);\n    }\n\n    /**\n     * Get user.\n     *\n     * @param string $userId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function get(string $userId)\n    {\n        return $this->httpGet('cgi-bin/user/get', ['userid' => $userId]);\n    }\n\n    /**\n     * Get simple user list.\n     *\n     * @param int  $departmentId\n     * @param bool $fetchChild\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getDepartmentUsers(int $departmentId, bool $fetchChild = false)\n    {\n        $params = [\n            'department_id' => $departmentId,\n            'fetch_child' => (int) $fetchChild,\n        ];\n\n        return $this->httpGet('cgi-bin/user/simplelist', $params);\n    }\n\n    /**\n     * Get user list.\n     *\n     * @param int  $departmentId\n     * @param bool $fetchChild\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getDetailedDepartmentUsers(int $departmentId, bool $fetchChild = false)\n    {\n        $params = [\n            'department_id' => $departmentId,\n            'fetch_child' => (int) $fetchChild,\n        ];\n\n        return $this->httpGet('cgi-bin/user/list', $params);\n    }\n\n    /**\n     * Convert userId to openid.\n     *\n     * @param string   $userId\n     * @param int|null $agentId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function userIdToOpenid(string $userId, int $agentId = null)\n    {\n        $params = [\n            'userid' => $userId,\n            'agentid' => $agentId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/user/convert_to_openid', $params);\n    }\n\n    /**\n     * Convert openid to userId.\n     *\n     * @param string $openid\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function openidToUserId(string $openid)\n    {\n        $params = [\n            'openid' => $openid,\n        ];\n\n        return $this->httpPostJson('cgi-bin/user/convert_to_userid', $params);\n    }\n\n    /**\n     * Convert mobile to userId.\n     *\n     * @param string $mobile\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function mobileToUserId(string $mobile)\n    {\n        $params = [\n            'mobile' => $mobile,\n        ];\n\n        return $this->httpPostJson('cgi-bin/user/getuserid', $params);\n    }\n\n    /**\n     * @param string $userId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function accept(string $userId)\n    {\n        $params = [\n            'userid' => $userId,\n        ];\n\n        return $this->httpGet('cgi-bin/user/authsucc', $params);\n    }\n\n    /**\n     * Batch invite users.\n     *\n     * @param array $params\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function invite(array $params)\n    {\n        return $this->httpPostJson('cgi-bin/batch/invite', $params);\n    }\n\n    /**\n     * Get invitation QR code.\n     *\n     * @param int $sizeType\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws InvalidArgumentException\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function getInvitationQrCode(int $sizeType = 1)\n    {\n        if (!\\in_array($sizeType, [1, 2, 3, 4], true)) {\n            throw new InvalidArgumentException('The sizeType must be 1, 2, 3, 4.');\n        }\n\n        return $this->httpGet('cgi-bin/corp/get_join_qrcode', ['size_type' => $sizeType]);\n    }\n\n    /**\n     * @param string|null $cursor\n     * @param int $limit\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getMemberAuthList(?string $cursor = null, int $limit = 1000)\n    {\n        return $this->httpPostJson('cgi-bin/user/list_member_auth', [\n            'cursor' => $cursor,\n            'limit' => $limit\n        ]);\n    }\n\n    /**\n     * @param string $openUserId\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function checkMemberAuth(string $openUserId)\n    {\n        return $this->httpPostJson('cgi-bin/user/check_member_auth', [\n            'open_userid' => $openUserId\n        ]);\n    }\n\n    /**\n     * @param string $selectedTicket\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getSelectedTicketUserList(string $selectedTicket)\n    {\n        return $this->httpPostJson('cgi-bin/user/list_selected_ticket_user', [\n            'selected_ticket' => $selectedTicket\n        ]);\n    }\n\n    /**\n     * userid转换为open_userid\n     *\n     * @param array $user_ids\n     *\n     * @return array|\\EasyWeChat\\Kernel\\Support\\Collection|object|\\Psr\\Http\\Message\\ResponseInterface|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function userIdToOpenUserId(array $user_ids)\n    {\n        return $this->httpPostJson('cgi-bin/batch/userid_to_openuserid', [\n            'userid_list' => $user_ids\n        ]);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/User/LinkedCorpClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\User;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client.\n *\n * @author 读心印 <aa24615@qq.com>\n */\nclass LinkedCorpClient extends BaseClient\n{\n    /**\n     * 获取应用的可见范围.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93172\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getAgentPermissions()\n    {\n        return $this->httpPostJson('cgi-bin/linkedcorp/agent/get_perm_list');\n    }\n\n    /**\n     * 获取互联企业成员详细信息.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93171\n     *\n     * @param string $userId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUser(string $userId)\n    {\n        $params = [\n            'userid' => $userId\n        ];\n\n        return $this->httpPostJson('cgi-bin/linkedcorp/user/get', $params);\n    }\n\n    /**\n     * 获取互联企业部门成员.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93168\n     *\n     * @param string $departmentId\n     * @param bool $fetchChild\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getUsers(string $departmentId, bool $fetchChild = true)\n    {\n        $params = [\n            'department_id' => $departmentId,\n            'fetch_child' => $fetchChild\n        ];\n\n        return $this->httpPostJson('cgi-bin/linkedcorp/user/simplelist', $params);\n    }\n\n    /**\n     * 获取互联企业部门成员详情.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93169\n     *\n     * @param string $departmentId\n     * @param bool $fetchChild\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getDetailedUsers(string $departmentId, bool $fetchChild = true)\n    {\n        $params = [\n            'department_id' => $departmentId,\n            'fetch_child' => $fetchChild\n        ];\n\n        return $this->httpPostJson('cgi-bin/linkedcorp/user/list', $params);\n    }\n\n    /**\n     * 获取互联企业部门列表.\n     *\n     * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93170\n     *\n     * @param string $departmentId\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function getDepartments(string $departmentId)\n    {\n        $params = [\n            'department_id' => $departmentId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/linkedcorp/department/list', $params);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/User/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\User;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}.\n     */\n    public function register(Container $app)\n    {\n        $app['user'] = function ($app) {\n            return new Client($app);\n        };\n\n        $app['tag'] = function ($app) {\n            return new TagClient($app);\n        };\n\n        $app['linked_corp'] = function ($app) {\n            return new LinkedCorpClient($app);\n        };\n\n        $app['batch_jobs'] = function ($app) {\n            return new BatchJobsClient($app);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/User/TagClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\User;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class TagClient.\n *\n * @author mingyoung <mingyoungcheung@gmail.com>\n */\nclass TagClient extends BaseClient\n{\n    /**\n     * Create tag.\n     *\n     * @param string   $tagName\n     * @param int|null $tagId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function create(string $tagName, int $tagId = null)\n    {\n        $params = [\n            'tagname' => $tagName,\n            'tagid' => $tagId,\n        ];\n\n        return $this->httpPostJson('cgi-bin/tag/create', $params);\n    }\n\n    /**\n     * Update tag.\n     *\n     * @param int    $tagId\n     * @param string $tagName\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function update(int $tagId, string $tagName)\n    {\n        $params = [\n            'tagid' => $tagId,\n            'tagname' => $tagName,\n        ];\n\n        return $this->httpPostJson('cgi-bin/tag/update', $params);\n    }\n\n    /**\n     * Delete tag.\n     *\n     * @param int $tagId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function delete(int $tagId)\n    {\n        return $this->httpGet('cgi-bin/tag/delete', ['tagid' => $tagId]);\n    }\n\n    /**\n     * @param int $tagId\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function get(int $tagId)\n    {\n        return $this->httpGet('cgi-bin/tag/get', ['tagid' => $tagId]);\n    }\n\n    /**\n     * @param int   $tagId\n     * @param array $userList\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function tagUsers(int $tagId, array $userList = [])\n    {\n        return $this->tagOrUntagUsers('cgi-bin/tag/addtagusers', $tagId, $userList);\n    }\n\n    /**\n     * @param int   $tagId\n     * @param array $partyList\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function tagDepartments(int $tagId, array $partyList = [])\n    {\n        return $this->tagOrUntagUsers('cgi-bin/tag/addtagusers', $tagId, [], $partyList);\n    }\n\n    /**\n     * @param int   $tagId\n     * @param array $userList\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function untagUsers(int $tagId, array $userList = [])\n    {\n        return $this->tagOrUntagUsers('cgi-bin/tag/deltagusers', $tagId, $userList);\n    }\n\n    /**\n     * @param int   $tagId\n     * @param array $partyList\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    public function untagDepartments(int $tagId, array $partyList = [])\n    {\n        return $this->tagOrUntagUsers('cgi-bin/tag/deltagusers', $tagId, [], $partyList);\n    }\n\n    /**\n     * @param string $endpoint\n     * @param int    $tagId\n     * @param array  $userList\n     * @param array  $partyList\n     *\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     */\n    protected function tagOrUntagUsers(string $endpoint, int $tagId, array $userList = [], array $partyList = [])\n    {\n        $data = [\n            'tagid' => $tagId,\n            'userlist' => $userList,\n            'partylist' => $partyList,\n        ];\n\n        return $this->httpPostJson($endpoint, $data);\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     */\n    public function list()\n    {\n        return $this->httpGet('cgi-bin/tag/list');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Wedrive/Client.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Wedrive;\n\nuse EasyWeChat\\Kernel\\BaseClient;\n\n/**\n * Class Client\n * \n * @author lio990527 <lio990527@163.com>\n */\nclass Client extends BaseClient\n{\n\n    /**\n     * 获取盘专业版信息\n     * \n     * @param string $userid\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @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\n     */\n    public function proInfo($userid)\n    {\n        return $this->httpPostJson('cgi-bin/wedrive/mng_pro_info', compact('userid'));\n    }\n\n    /**\n     * 获取盘容量信息\n     *\n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     *\n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @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\n     */\n    public function capacity()\n    {\n        return $this->httpPostJson('cgi-bin/wedrive/mng_capacity');\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Wedrive/FileClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Wedrive;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Support\\Arr;\nuse GuzzleHttp\\Cookie\\CookieJar;\n\n/**\n * Class FileClient\n * \n * @author lio990527 <lio990527@163.com>\n */\nclass FileClient extends BaseClient\n{\n    /**\n     * 新建文件/文档\n     *\n     * @param string $userid    操作者userid\n     * @param string $spaceid   空间spaceid\n     * @param string $fatherid  父目录fileid, 在根目录时为空间spaceid\n     * @param int $fileType     文件类型, 1:文件夹 3:文档(文档) 4:文档(表格) 6:文档(幻灯片)\n     * @param string $fileName  文件名字\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @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\n     */\n    public function create($userid, $spaceid, $fatherid, $fileType, $fileName)\n    {\n        $data = [\n            'userid' => $userid,\n            'spaceid' => $spaceid,\n            'fatherid' => $fatherid,\n            'file_type' => $fileType,\n            'file_name' => $fileName\n        ];\n\n        return $this->httpPostJson('cgi-bin/wedrive/file_create', $data);\n    }\n\n    /**\n     * 重命名文件\n     *\n     * @param string $userid    操作人userid\n     * @param string $fileid    文件id\n     * @param string $name      新文件名\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @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\n     */\n    public function rename($userid, $fileid, $name)\n    {\n        $data = [\n            'userid' => $userid,\n            'fileid' => $fileid,\n            'new_name' => $name\n        ];\n\n        return $this->httpPostJson('cgi-bin/wedrive/file_rename', $data);\n    }\n\n    /**\n     * 移动文件\n     *\n     * @param string $userid \n     * @param string|array $fileid  文件fileid\n     * @param string $fatherid 目标目录的fileid\n     * @param boolean $replace 重名时，是否覆盖 false:重名文件进行冲突重命名处理（移动后文件名格式如xxx(1).txt xxx(1).doc等）\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @see https://developer.work.weixin.qq.com/document/path/93657#%E7%A7%BB%E5%8A%A8%E6%96%87%E4%BB%B6\n     */\n    public function move($userid, $fileid, $fatherid, $replace = false)\n    {\n        $fileid = (array) $fileid;\n\n        return $this->httpPostJson('cgi-bin/wedrive/file_move', compact('userid', 'fatherid', 'replace', 'fileid'));\n    }\n\n    /**\n     * 删除文件\n     *\n     * @param string $userid\n     * @param string|array $fileid\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @see https://developer.work.weixin.qq.com/document/path/93657#%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6\n     */\n    public function delete($userid, $fileid)\n    {\n        $fileid = (array) $fileid;\n\n        return $this->httpPostJson('cgi-bin/wedrive/file_delete', compact('userid', 'fileid'));\n    }\n\n    /**\n     * 获取文件列表\n     *\n     * @param string $userid\n     * @param string $spaceid   空间id\n     * @param string $fatherid  目录id\n     * @param integer $start    查询游标 首次填0, 后续填上一次请求返回的next_start\n     * @param integer $limit    拉取条数 最大1000\n     * @param integer $sort     列表排序方式 1:名字升序；2:名字降序；3:大小升序；4:大小降序；5:修改时间升序；6:修改时间降序\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @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\n     */\n    public function list($userid, $spaceid, $fatherid = null, $start = 0, $limit = 1000, $sort = 1)\n    {\n        $data = [\n            'userid' => $userid,\n            'spaceid' => $spaceid,\n            'fatherid' => $fatherid ?: $spaceid,\n            'start' => $start,\n            'limit' => min($limit, 1000),\n            'sort_type' => $sort\n        ];\n\n        return $this->httpPostJson('cgi-bin/wedrive/file_list', $data);\n    }\n\n    /**\n     * 文件信息\n     *\n     * @param string $userid\n     * @param string $fileid\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @see https://developer.work.weixin.qq.com/document/path/93657#%E6%96%87%E4%BB%B6%E4%BF%A1%E6%81%AF\n     */\n    public function info($userid, $fileid)\n    {\n        return $this->httpPostJson('cgi-bin/wedrive/file_info', compact('userid', 'fileid'));\n    }\n\n    /**\n     * 上传文件\n     *\n     * @param string $userid\n     * @param string $spaceid       空间id\n     * @param string $fatherid      目录id\n     * @param string $fileName      文件名\n     * @param string $fileContent   文件内容\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @see https://developer.work.weixin.qq.com/document/path/93657#%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6\n     */\n    public function upload($userid, $spaceid, $fatherid, $fileName, $fileContent)\n    {\n        $data = [\n            'userid' => $userid,\n            'spaceid' => $spaceid,\n            'fatherid' => $fatherid,\n            'file_name' => $fileName,\n            'file_base64_content' => base64_encode($fileContent)\n        ];\n\n        return $this->httpPostJson('cgi-bin/wedrive/file_upload', $data);\n    }\n\n    /**\n     * 文件下载\n     *\n     * @param string $userid\n     * @param string $fileid\n     * @param boolean $download 是否直接下载\n     * \n     * @return \\EasyWeChat\\Kernel\\Http\\StreamResponse|\\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @see https://developer.work.weixin.qq.com/document/path/93657#%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6\n     */\n    public function download($userid, $fileid, $download = false)\n    {\n        $response = $this->httpPostJson('cgi-bin/wedrive/file_download', compact('userid', 'fileid'));\n\n        if (!$download || 0 <> $response['errcode']) {\n            return $response;\n        }\n\n        return $this->getHttpClient()->request('GET', $response['download_url'], [\n            'cookies' => CookieJar::fromArray([\n                $response['cookie_name'] => $response['cookie_value'],\n            ], parse_url($response['download_url'])['host'] ?? 'qq.com'),\n        ]);\n    }\n\n    /**\n     * 获取分享链接\n     *\n     * @param string $userid\n     * @param string $fileid\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @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\n     */\n    public function share($userid, $fileid)\n    {\n        return $this->httpPostJson('cgi-bin/wedrive/file_share', compact('userid', 'fileid'));\n    }\n\n    /**\n     * 分享设置\n     *\n     * @param string $userid\n     * @param string $fileid\n     * @param int $authScope    权限范围：1:指定人 2:企业内 3:企业外\n     * @param int $auth         权限信息 权限信息\n     * 普通文档： 1:仅浏览（可下载) 4:仅预览（仅专业版企业可设置）；如果不填充此字段为保持原有状态\n     * 微文档： 1:仅浏览（可下载） 2:可编辑；如果不填充此字段为保持原有状态\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @see https://developer.work.weixin.qq.com/document/path/93658#%E5%88%86%E4%BA%AB%E8%AE%BE%E7%BD%AE\n     */\n    public function setting($userid, $fileid, $authScope, $auth = null)\n    {\n        $data = [\n            'userid' => $userid,\n            'fileid' => $fileid,\n            'auth_scope' => $authScope,\n            'auth' => $auth\n        ];\n\n        return $this->httpPostJson('cgi-bin/wedrive/file_setting', array_filter($data));\n    }\n\n    /**\n     * 新增成员\n     *\n     * @param string $userid\n     * @param string $fileid\n     * @param array $authInfo 添加成员的信息\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @see https://developer.work.weixin.qq.com/document/path/93658#%E6%96%B0%E5%A2%9E%E6%88%90%E5%91%98\n     */\n    public function aclAdd($userid, $fileid, $authInfo)\n    {\n        $data = [\n            'userid' => $userid,\n            'fileid' => $fileid,\n            'auth_info' => Arr::isAssoc($authInfo) ? [$authInfo] : $authInfo\n        ];\n\n        return $this->httpPostJson('cgi-bin/wedrive/file_acl_add', $data);\n    }\n\n    /**\n     * 删除成员\n     * \n     * @param string $userid\n     * @param string $fileid\n     * @param array $authInfo 删除成员的信息\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @see https://developer.work.weixin.qq.com/document/path/93658#%E5%88%A0%E9%99%A4%E6%88%90%E5%91%98\n     */\n    public function aclDel($userid, $fileid, $authInfo)\n    {\n        $data = [\n            'userid' => $userid,\n            'fileid' => $fileid,\n            'auth_info' => Arr::isAssoc($authInfo) ? [$authInfo] : $authInfo\n        ];\n\n        return $this->httpPostJson('cgi-bin/wedrive/file_acl_del', $data);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Wedrive/ServiceProvider.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Wedrive;\n\nuse Pimple\\Container;\nuse Pimple\\ServiceProviderInterface;\n\n/**\n * Class ServiceProvider\n * \n * @author lio990527 <lio990527@163.com>\n */\nclass ServiceProvider implements ServiceProviderInterface\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function register(Container $app)\n    {\n        $app['wedrive'] = function ($app) {\n            return new Wedrive([\n                'base' => new Client($app),\n                'space' => new SpaceClient($app),\n                'file' => new FileClient($app),\n            ]);\n        };\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Wedrive/SpaceClient.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Wedrive;\n\nuse EasyWeChat\\Kernel\\BaseClient;\nuse EasyWeChat\\Kernel\\Support\\Arr;\n\n/**\n * Class SpaceClient\n * \n * @author lio990527 <lio990527@163.com>\n */\nclass SpaceClient extends BaseClient\n{\n\n    /**\n     * 新建空间\n     *\n     * @param string $userid        操作者userid\n     * @param string $spaceName     空间名称\n     * @param array $authInfo       空间成员权限信息\n     * @param integer $spaceSubType 空间类型, 0:普通 1:相册\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @see https://developer.work.weixin.qq.com/document/path/93656#%E6%96%B0%E5%BB%BA%E7%A9%BA%E9%97%B4\n     */\n    public function create($userid, $spaceName, $authInfo = [], $spaceSubType = 0)\n    {\n        $data = [\n            'userid' => $userid,\n            'space_name' => $spaceName,\n            'auth_info' => Arr::isAssoc($authInfo) ? [$authInfo] : $authInfo,\n            'space_sub_type' => $spaceSubType,\n        ];\n\n        return $this->httpPostJson('cgi-bin/wedrive/space_create', $data);\n    }\n\n    /**\n     * 重命名空间\n     *\n     * @param string $userid\n     * @param string $spaceid\n     * @param string $spaceName 重命名后的空间名\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @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\n     */\n    public function rename($userid, $spaceid, $spaceName)\n    {\n        $data = [\n            'userid' => $userid,\n            'spaceid' => $spaceid,\n            'space_name' => $spaceName\n        ];\n\n        return $this->httpPostJson('cgi-bin/wedrive/space_rename', $data);\n    }\n\n    /**\n     * 解散空间\n     *\n     * @param string $userid\n     * @param string $spaceid\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @see https://developer.work.weixin.qq.com/document/path/93656#%E8%A7%A3%E6%95%A3%E7%A9%BA%E9%97%B4\n     */\n    public function dismiss($userid, $spaceid)\n    {\n        return $this->httpPostJson('cgi-bin/wedrive/space_dismiss', compact('userid', 'spaceid'));\n    }\n\n    /**\n     * 获取空间/相册信息\n     *\n     * @param string $userid\n     * @param string $spaceid\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @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\n     */\n    public function info($userid, $spaceid)\n    {\n        return $this->httpPostJson('cgi-bin/wedrive/space_info', compact('userid', 'spaceid'));\n    }\n\n    /**\n     * 获取邀请链接\n     *\n     * @param string $userid\n     * @param string $spaceid\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @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\n     */\n    public function share($userid, $spaceid)\n    {\n        return $this->httpPostJson('cgi-bin/wedrive/space_share', compact('userid', 'spaceid'));\n    }\n\n    /**\n     * 安全设置\n     *\n     * @param string $userid\n     * @param string $spaceid\n     * @param array  $settings 设置\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @see https://developer.work.weixin.qq.com/document/path/93656#%E5%AE%89%E5%85%A8%E8%AE%BE%E7%BD%AE\n     */\n    public function setting($userid, $spaceid, $settings)\n    {\n        $data = array_merge(compact('userid', 'spaceid'), $settings);\n\n        return $this->httpPostJson('cgi-bin/wedrive/space_setting', $data);\n    }\n\n    /**\n     * 添加成员/部门\n     *\n     * @param string $userid\n     * @param string $spaceid\n     * @param array $authInfo  被添加的空间成员信息\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @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\n     */\n    public function aclAdd($userid, $spaceid, $authInfo)\n    {\n        $data = [\n            'userid' => $userid,\n            'spaceid' => $spaceid,\n            'auth_info' => Arr::isAssoc($authInfo) ? [$authInfo] : $authInfo\n        ];\n\n        return $this->httpPostJson('cgi-bin/wedrive/space_acl_add', $data);\n    }\n\n    /**\n     * 移除成员/部门\n     *\n     * @param string $userid\n     * @param string $spaceid\n     * @param array $authInfo  被移除的空间成员信息\n     * \n     * @return \\Psr\\Http\\Message\\ResponseInterface|\\EasyWeChat\\Kernel\\Support\\Collection|array|object|string\n     * \n     * @throws \\EasyWeChat\\Kernel\\Exceptions\\InvalidConfigException\n     * @throws \\GuzzleHttp\\Exception\\GuzzleException\n     * \n     * @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\n     */\n    public function aclDel($userid, $spaceid, $authInfo)\n    {\n        $data = [\n            'userid' => $userid,\n            'spaceid' => $spaceid,\n            'auth_info' => Arr::isAssoc($authInfo) ? [$authInfo] : $authInfo\n        ];\n\n        return $this->httpPostJson('cgi-bin/wedrive/space_acl_del', $data);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Wedrive/Wedrive.php",
    "content": "<?php\n\n/*\n * This file is part of the overtrue/wechat.\n *\n * (c) overtrue <i@overtrue.me>\n *\n * This source file is subject to the MIT license that is bundled\n * with this source code in the file LICENSE.\n */\n\nnamespace EasyWeChat\\Work\\Wedrive;\n\nuse Pimple\\Container;\n\n/**\n * Class Wedrive\n * \n * @property \\EasyWeChat\\Work\\Wedrive\\Client                 $base\n * @property \\EasyWeChat\\Work\\Wedrive\\SpaceClient            $space\n * @property \\EasyWeChat\\Work\\Wedrive\\FileClient             $file\n * \n * @author lio990527 <lio990527@163.com>\n */\nclass Wedrive extends Container\n{\n\n    public function __get($key)\n    {\n        return $this->offsetGet($key);\n    }\n}\n"
  },
  {
    "path": "core/widget/wechatServer/wechatServer.php",
    "content": "<?php\nob_clean();\nerror_reporting(0);\ndate_default_timezone_set('Asia/Shanghai');\nrequire __DIR__ . '/vendor/autoload.php';\nuse EasyWeChat\\OfficialAccount\\Application;\nuse Typecho\\Cookie;\ninclude 'Config.php';\nrequire('bearWechatHandler.php');\nrequire_once 'WechatUtils.php';\n$options = Helper::options();\n\nfunction getResourcesData($mediaId,$mediaName){\n    $options = bsOptions::getInstance()::get_option('bearsimple');\n    $DIRECTORY_SEPARATOR = \"/\";\n        $childDir = $DIRECTORY_SEPARATOR.'usr'.$DIRECTORY_SEPARATOR.'uploads' . $DIRECTORY_SEPARATOR .'wechatServer' .$DIRECTORY_SEPARATOR;\n        $dir = __TYPECHO_ROOT_DIR__ . $childDir;\n        if (!file_exists($dir)){\n            mkdir($dir, 0777, true);\n        }\n$config = [\n    'app_id' => $options['wechat_appid'],\n    'secret' => $options['wechat_appsecret'],\n    'token' => $options['wechat_verifyToken'],\n \t'aes_key' => $options['wechat_aeskey'],\n    'response_type' => 'array',\n   'log' => [\n        'default' => 'prod',\n        'channels' => [\n            'dev' => [\n                'driver' => 'single',\n                'path' => __DIR__.'/tmp/wechat.log',\n                'level' => 'debug',\n            ],\n            'prod' => [\n                'driver' => 'single',\n                'path' =>__DIR__.'/tmp/wechat.log',\n                'level' => 'info',\n            ],\n        ],\n    ],\n];\n$app = new Application($config);\n$stream = $app->media->get($mediaId);\n\nif ($stream instanceof \\EasyWeChat\\Kernel\\Http\\StreamResponse) {\n  $stream->saveAs('usr/uploads/wechatServer',$mediaName);\n}\n\n    return true;\n}\n\nfunction typeVoiceContent($mediaId,$mediaName,$openid)\n{\n    $DIRECTORY_SEPARATOR = \"/\";\n        $childDir = $DIRECTORY_SEPARATOR.'usr'.$DIRECTORY_SEPARATOR.'uploads' . $DIRECTORY_SEPARATOR .'wechatServer' .$DIRECTORY_SEPARATOR;\n    $options = Helper::options();\n    getResourcesData($mediaId,$mediaName);\n\t$url = WechatUtils::uploadFile($options->rootUrl, $childDir,$mediaName,$openid);\n\treturn $url;\n}\n\nfunction typeVideoContent($mediaId,$mediaName,$openid)\n{\n    $DIRECTORY_SEPARATOR = \"/\";\n        $childDir = $DIRECTORY_SEPARATOR.'usr'.$DIRECTORY_SEPARATOR.'uploads' . $DIRECTORY_SEPARATOR .'wechatServer' .$DIRECTORY_SEPARATOR;\n    $options = Helper::options();\n    getResourcesData($mediaId,$mediaName);\n\t$url = WechatUtils::uploadFile($options->rootUrl, $childDir,$mediaName,$openid);\n\treturn $url;\n}\n\n\nfunction typeImageContent($url, $b,$openid)\n{\n\t$c = WechatUtils::uploadPic($b, uniqid(), $url, 'web', '.jpg',$openid);\n\t$url = $c.',';\n\treturn $url;\n}\nfunction typeTextContent($a,$c = true)\n{\n\tif ($c) {\n\t\t$a = $a .'\n';\n\t}\n\treturn $a;\n}\n\nfunction parseCircleContent($data, $options,$openid,$type)\n{\n\t$arr = json_decode($data, true);\n\t$arr = $arr['results'];\n\t$data = array();\n\t$data['text'] = '';\n\t$images = '';\n\tforeach ($arr as $con2) {\n\tif($type == 'resource'){\n\t\tif ($con2['type'] == 'image') {\n\t\t\t$images .= typeImageContent($con2['content'], $options->rootUrl,$openid);\n\t\t\t$filtered_arr = array_filter(explode(',', $images), function($value) {\n    return $value !== '' && $value !== null;\n});\n\t\t\t$data['resources'] = json_encode($filtered_arr);\n\t\t\t\n\t\t}\n\t\tif ($con2['type'] == 'voice') {\n\t\t    $voice_arr = explode('!',$con2['content']);\n\t\t    $voice_url = typeVoiceContent($voice_arr[0],$voice_arr[0].'.'.$voice_arr[1],$openid);\n\t\t   $data['resources'] = json_encode(explode(',',$voice_url)); \n\t\t}\n\t\tif ($con2['type'] == 'video') {\n\t\t    $voice_arr = explode('!',$con2['content']);\n\t\t    $voice_url = typeVideoContent($voice_arr[0],$voice_arr[0].'.'.$voice_arr[1],$openid);\n\t\t   $data['resources'] = json_encode(explode(',',$voice_url)); \n\t\t}\n\t}\n\n\telseif($type == 'text'){\n\t if ($con2['type'] == 'text') {\n\t\t\t$data['text'] .= typeTextContent($con2['content'], true);\n\t\t}    \n\t}\n\t}\n\treturn $data;\n}\n\n// 获取MD5加密后的内容\nfunction getEncryptToken(){\n    $db = Typecho_Db::get();\n    return md5(md5(\"bearsimple!@#$%^&*()-=+@#$%$\" . Helper::options()->openId . \"bearsimple!@#$%^&*()-=+@#$%$@#$%^&*\"));\n\n}\nswitch($_POST['action']){\n    case 'sendCircle':\n    $options = Helper::options();\n    if (!empty($_POST['content']) && !empty($_POST['postEncryptToken']) && !empty($_POST['cid']) && !empty($_POST['agent'])) {\n        $cid = $_POST['cid'];\n        $postEncryptToken = $_POST['postEncryptToken'];\n        $agent = $_POST['agent'];\n        $msg_type = $_POST['msg_type'];\n        $encryptToken = getEncryptToken();\n        if (md5($postEncryptToken) == $encryptToken) {\n            $msgid = $_POST['msgid'];\n                $db = Typecho_Db::get();\n$checkMsgidSql = $db->select()->from('table.bscore_wechat_msgids')->where('msgid = ?', $msgid);\n$exists = $db->fetchRow($checkMsgidSql);\n\nif ($exists) {\n    echo \"1\";\n    exit;\n} else {\n    $db->query($db->insert('table.bscore_wechat_msgids')->rows(array('msgid' => $msgid)));\n\n                $getAdminSql = $db->select()->from('table.users')->limit(1);\n                $user = $db->fetchRow($getAdminSql);\n                \n                $time = time();\n\n                $thisText = parseCircleContent($_POST['content'], $options,$_POST['openid'],'text')['text'];\n                $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'));\n\n                $insertId = $db->query($insert);\n                $row = $db->fetchRow($db->select('commentsNum')->from('table.contents')->where('cid = ?', $cid));\n                $db->query($db->update('table.contents')->rows(array('commentsNum' => (int) $row['commentsNum'] + 1))->where('cid = ?', $cid));\n                $queryTable = $db->fetchRow($db->select()->from('table.comments')->where('cid = ?', $cid)->where('created = ?', $time));\n                $circle_data = array(\n                    'coid' => $queryTable['coid'],\n                    'location' => '',\n                    'private' => false,\n                    'resources' => parseCircleContent($_POST['content'], $options,$_POST['openid'],'resource')['resources'],\n                );\n                $db->query($db->insert('table.bscore_friendcircle_data')->rows($circle_data));\n                echo '1';\n            }\n        } else {\n            echo '-2';\n        }\n    } else {\n        echo '-3';\n    }  \n    break;\n    case 'saysTalk':\n\t\tif (!empty($_POST['content']) && !empty($_POST['postEncryptToken']) && !empty($_POST['cid']) && !empty($_POST['agent'])) {\n\t\t\t$cid = $_POST['cid'];\n\t\t\t$thisText = $_POST['content'];\n\t\t\t$postEncryptToken = $_POST['postEncryptToken'];\n\t\t\t$agent = $_POST['agent'];\n\t\t\t$msg_type = $_POST['msg_type'];\n            $encryptToken = getEncryptToken();\n\n            if (md5($postEncryptToken) == $encryptToken) {\n\t\t\t\t\t$db = Typecho_Db::get();\n\t\t\t\t\t$getAdminSql = $db->select()->from('table.users')->limit(1);\n\t\t\t\t\t$user = $db->fetchRow($getAdminSql);\n\t\t\t\t\t$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'));\n\t\t\t\t\t$insertId = $db->query($insert);\n\t\t\t\t\t$row = $db->fetchRow($db->select('commentsNum')->from('table.contents')->where('cid = ?', $cid));\n\t\t\t\t\t$db->query($db->update('table.contents')->rows(array('commentsNum' => (int) $row['commentsNum'] + 1))->where('cid = ?', $cid));\n\t\t\t\t\techo '1';\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\techo '-2';\n\t\t\t}\n\t\t} else {\n\t\t\techo '-3';\n\t\t}\n\t\n        break;\n        default:\n$app = new Application($config);\n$app->server->push(BearWechatHandler::class);\n$response = $app->server->serve();\n$response->send();\n}"
  },
  {
    "path": "core/widget/write.php",
    "content": "<?php\n//BearSimple For Typecho\nheader(\"HTTP/1.1 200 OK\");\n    header(\"Access-Control-Allow-Origin: *\");\n    date_default_timezone_set('PRC');\n    function get_file_suffix($file_name, $allow_type = array())\n{\n  $fnarray=$file_name;\n    $file_suffix = strtolower(array_pop($fnarray));\n  if (empty($allow_type))\n  {\n    return $file_suffix;\n  }\n  else\n  {\n    if (in_array($file_suffix, $allow_type))\n    {\n      return true;\n    }\n    else\n    {\n      return false;\n    }\n  }\n}\n\n\n\n\n    Typecho_Widget::widget('Widget_User')->to($user);\n    if ($user->hasLogin()) {\n        if ($_GET[\"url\"] == 'post' || $_GET[\"url\"] == 'page')\n{\nif ($_GET[\"cid\"]) {\n     Typecho_Widget::widget('Widget_Contents_Attachment_Related', 'parentId=' . $_GET[\"cid\"])->to($attachment);\n    } else {\n        Typecho_Widget::widget('Widget_Contents_Attachment_Unattached')->to($attachment);\n    }\n    $result = array(\n    'code' => '1',\n    'list' => array()\n);\n\n$imgif= array('.jpg','.gif','.png','.jpeg','.svg','.ico');\n\nwhile ($attachment->next()){\n    if (preg_match('/\\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $attachment->attachment->url)) {\n\n$attachtype = 'img';\n}else{\n$attachtype = 'other';\n}\n    $result['list'][] = array(\n\t 'title' => $attachment->title,\n\t 'cid' => $attachment->cid,\n\t 'url' => $attachment->attachment->url,\n\t 'type'=>$attachtype,\n\t);\n}\n\necho json_encode($result); \n}\n}\nelse{\n    $arr['msg'] ='鉴权失败';\n    exit(json_encode($arr,JSON_UNESCAPED_UNICODE));\n}\n"
  },
  {
    "path": "cross-says.php",
    "content": "<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; \n?>\n<?php if($this->user->hasLogin()): ?>\n\n<div id=\"comments\" class=\"ui comments\" style=\"display:none;margin: 0px auto;\">\n   \n    \t<form method=\"post\" action=\"<?php editurl($this->commentUrl) ?>\" id=\"commentform\" role=\"form\" class=\"ui reply form\">\n      <div class=\"field\">\n\n<div class=\"ui mini basic icon buttons\" style=\"float:right\">\n  <div class=\"ui button\" id=\"insertimg\"><i class=\"image icon\" data-content=\"插入图片短代码\"></i></div>\n  <div class=\"ui button\" id=\"insertimgs\"><i class=\"images icon\" data-content=\"插入相册短代码\"></i></div>\n  <div class=\"ui button\" id=\"insertmark\"><i class=\"bookmark icon\" data-content=\"插入文字标记短代码\"></i></div>\n    <div class=\"ui button\" id=\"insertruby\"><i class=\"language icon\" data-content=\"插入文字注音短代码\"></i></div>\n</div>\n<input name=\"vtype\" id=\"type\" style=\"display:none\" value=\"cross\">\n<?php \\BsCore\\Plugin::getSecurityToken('html');?>\n                <textarea rows=\"5\" cols=\"30\" name=\"text\" id=\"textarea\" placeholder=\"写一写你的最近动态~\"<?php if(Bsoptions('Emoji') == true) :?> class=\"emotion\"<?php endif; ?> required ><?php $this->remember('textarea'); ?></textarea>\n                \n            </div>\n<?php if(Bsoptions('Emoji') == true) :?>\n    <div class=\"circular ui icon button\" id=\"facecross\">\n\n  <i class=\"smile beam outline icon\"></i>\n </div>\n <div class=\"ignore emoemo\" style=\"margin-top:-40px;margin-bottom:10px\"></div>\n <?php endif; ?>\n <div class=\"ui mini basic icon button\" id=\"editing\" style=\"float:left;display:none\"><i class=\"edit icon\"></i></div>\n                <button type=\"submit\" class=\"ui mini labeled submit icon button\" id=\"submitsays\" style=\"float:right\"><i class=\"location arrow icon\"></i><?php _e('发表动态'); ?></button>\n           <div  class=\"ui mini labeled submit icon button\" id=\"submiteditsays\" style=\"float:right;display:none\"><i class=\"location arrow icon\"></i><?php _e('修改动态'); ?></div>\n    \t</form>\n    \t</div>\n\n    \t <?php endif; ?>\n<br>\n<?php function threadedComments($comments, $options) {\n    $bsoptions = bsOptions::getInstance()::get_option( 'bearsimple' );\n    \\Widget\\Security::alloc()->to($security);\n    \n   if(Bsoptions('emaction_Openplace') && in_array('2',Bsoptions('emaction_Openplace'))&& Bsoptions('emaction_Closelike') == true){\n       $emaction = true;\n   }\n   else{\n       $emaction = false;\n   }\n   \n ?>\n<div class=\"bs-timeline-block\" id=\"<?php $comments->theId(); ?>\">\n\t\t\t<div class=\"bs-timeline-img\">\n\t<img src=\"<?php echo imgravatarq($comments->mail); ?>\">\t\t    \n     \t</div>\n\t\t\t<div class=\"bs-timeline-content break\">\n\t\t\t    <?php $comments->date('Y-m-d H:i'); ?>\n\t\t\t    <div style=\"float:right;display:none\" class=\"editsays\"  data-coid=\"<?php $comments->coid(); ?>\" data-editurl=\"<?php $security->index('/action/comments-edit?do=edit&coid=' . $comments->coid); ?>\" data-time=\"<?php $comments->date('Y-m-d H:i'); ?>\" data-author=\"<?php $comments->author(false); ?>\" data-mail=\"<?php $comments->mail(); ?>\" data-url=\"<?php $comments->url(); ?>\" data-ip=\"<?php $comments->ip(); ?>\" data-type=\"<?php $comments->type(); ?>\">\n  <i class=\"edit icon\"></i>修改\n</div>\n<div style=\"float:right;display:none\" class=\"editsayscancel-<?php $comments->coid(); ?>\"  data-coid=\"<?php $comments->coid(); ?>\"  data-time=\"<?php $comments->date('Y-m-d H:i'); ?>\">\n  <i class=\"edit icon\"></i>取消修改\n</div>\n\t\t\t    <hr class=\"crosshr\">\n       \t<p> \n       \t<?php echo ParseCross(reEmo($comments->content,'comment')); ?>\t</p>\n       \t<div style=\"display:none\" id=\"edit-<?php $comments->coid(); ?>\"> \n       \t<?php echo $comments->content; ?>\t</div>\n       \t<?php if($bsoptions['Comment_like'] == true || $bsoptions['Comment_useragent'] == true):?>\n      <hr class=\"crosshr\">\n   <?php endif; ?>\n   <?php if(Bsoptions('emaction_Openplace') && in_array('2',Bsoptions('emaction_Openplace'))):?>  \n   <emoji-reaction theme=\"light\" endpoint=\"<?php getEmactionAction();?>\" reacttargetid=\"comment-<?php $comments->coid();?>\" style=\"flex-wrap: nowrap; max-width: 100%; display: flex; gap: 0.375rem;height: 1.5rem;<?php if($bsoptions['Comment_like'] == true && $emaction == false): ?>margin-bottom:5px;<?php else:?>float:left<?php endif;?>\"></emoji-reaction>\n   <?php endif;?>\n\t\t\t    <?php if($bsoptions['Comment_like'] == true && $emaction == false): ?>\n\t\t\t  \n\t    \t <?php $agree = $options->hidden?array('agree' => 0, 'recording' => true):agreeNumforcomment($comments->coid);?>\n\t    \t \n        <div style=\"float:left\">\n            \n          <i id=\"commentlike\" class=\"like thumbs up red link icon\" data-coid=\"<?php echo $comments->coid; ?>\"></i><span class=\"agreenumcomment<?php echo $comments->coid; ?>\"><?php echo $agree['agree']; ?></span>\n        </div>\n        <?php endif; ?>\n        <?php if($bsoptions['Comment_useragent'] == true): ?>\n         <div style=\"float:right\"> <?php BearsimpleUserAgent::render($comments->agent); ?></div>\n         <?php endif; ?>\n    \t</div>\n    \t\n\t\t</div>\n<?php } ?>\n     <?php $this->comments()->to($comments); ?>\n     <?php if($this->commentsNum == '0'):?>\n     <br>\n     <article class=\"post\">\n        <center><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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></linearGradient></defs><g transform=\"translate(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg></center>\n                <center><h2>暂无动态</h2></center>\n            </article>\n     <?php else:?>\n         <section id=\"bs-timeline\" class=\"bs-container nosearch\">\n     <?php\n      ob_start();\n   $comments->listComments();\n   $comments_content = ob_get_contents();\n      ob_end_clean();\n   $comments_content = preg_replace(\"/<ol class=\\\"comment-list\\\">/sm\", '', $comments_content);\n   $comments_content = preg_replace(\"/<\\/ol>/sm\", '', $comments_content);\n   echo $comments_content;\n   ?>\n</section>\n\n<?php endif; ?>\n    <?php\n      ob_start(); \n      $comments->pageNav('&laquo;','&raquo;', 1, '');\n      $content = ob_get_contents();\n      ob_end_clean();\n      if(Bsoptions('pagination_style') == '2'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<nav class=\"page-navigator\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<span class=\"page-number\">...</span>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"extend prev\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"extend next\" href=\"$1\">下一页</a>', $content);\n      //适配旧版本\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"extend prev\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"extend next\" href=\"$1\">下一页</a>', $content);\n      ///--->\n      $content = preg_replace(\"/<\\/ol>/sm\", '</nav>', $content);\n      }\n      if(empty(Bsoptions('pagination_style')) || Bsoptions('pagination_style') == '1'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<div class=\"ui labels\" style=\"margin-top:30px\"><div style=\"text-align:center\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<a class=\"ui large label\">...</a>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      //旧版本兼容\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      \n      $content = preg_replace(\"/<\\/ol>/sm\", '</div></div>', $content);\n      }\n      echo $content;\n     ?>\n<script>\njQuery(document).ready(function($){\n$(document).on('click','.editsays',function(){\n    const _parent = $('.editsays');\n    const _editurl = $(this).attr('data-editurl');\n    const _author = $(this).attr('data-author');\n    const _mail = $(this).attr('data-mail');\n    const _url = $(this).attr('data-url');\n    const _ip = $(this).attr('data-ip');\n    const _type = $(this).attr('data-type');\n    const _coid = $(this).attr('data-coid');\n    const htmlContent = $(\"#edit-\" + $(this).attr('data-coid')).html();\n    const plainText = htmlContent\n  .replace(/<\\/p>\\s*<p>/gi, '\\n\\n') \n  .replace(/<\\/?p[^>]*>/gi, '') \n  .replace(/<br>/gi, '\\n')\n  .trim();\n\n$('textarea[name=text]').val(plainText).focus();\n    $('#say').click();\n    $('#editing').html('正在修改 '+$(this).attr('data-time')+' 发布的动态').show();\n    $('#submiteditsays').show();\n    $('#submitsays').hide();\n   $('.editsays').not(this).css(\"pointer-events\",\"none\");\n   $(this).hide();\n    if($(this).css('display')=='none'){\n\t $('.editsayscancel-'+$(this).attr('data-coid')).show();\n}\n$(document).off('click','#submiteditsays').on('click','#submiteditsays',function(){\n        $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: window.location.href,\n                        data: {\n                            \"action\": 'cross',\n                            \"coid\": _coid,\n                        },\n                        dateType: \"json\",\n                        success: function(url) {\n                            \n                            \n    $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: url,\n                        data: {\n                            \"author\": _author,\n                            \"mail\": _mail,\n                            \"url\": _url,\n                            \"ip\": _ip,\n                            \"type\": _type,\n                            \"text\": $('#textarea').val(),\n                        },\n                        dateType: \"json\",\n                        success: function(json) {\n                            if(json.success == 1){\n                                $('body').toast({\n\t\t\t\t\t\t\t    title:'动态修改成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已成功修改，即将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetTimeout(function() {\n            window.location.reload();\n            },2000);\n                            }\n                            else{\n                                $('body').toast({\n\t\t\t\t\t\t\t    title:'动态修改失败',\n\t\t\t\t\t\t\t    class: 'error',\n\t\t\t\t\t\t\t    message: '可能由于网络因素影响导致您修改动态操作失败~~',\n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n                            }\n                        },\n                        error: function() {\n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'动态修改失败',\n\t\t\t\t\t\t\t    class: 'error',\n\t\t\t\t\t\t\t    message: '可能由于网络因素影响导致您修改动态操作失败~~',\n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n                        }\n                    });\n                    \n                    \n                    \n                        },\n                        error: function() {\n                            \n                        }\n                    });\n\n                    \n});\n\n$(document).on('click','.editsayscancel-'+$(this).attr('data-coid'),function(){\n     _parent.show();\n     $('#submiteditsays').hide();\n    $('#submitsays').show();\n    $('.editsayscancel-'+$(this).attr('data-coid')).hide();\n    $('.editsays').not(this).css(\"pointer-events\",\"auto\");\n    $('#editing').hide();\n    $(\"textarea[name=text]\").val('');\n});\n\n    \n});\n\n\n\n$(document).ready(function(){\n$('#insertimg').on('click',function(){\ninsert('[bsimg]图片直链，带http(s)://[/bsimg]\\n');\n});\n$('#insertmark').on('click',function(){\ninsert('[bsmark]要标注的文字[/bsmark]\\n');\n});\n$('#insertruby').on('click',function(){\ninsert('[bsruby]要注音的文字[/bsruby]\\n');\n});\n$('#insertimgs').on('click',function(){\ninsert('[bsgallery title=\"相册名\"]\\n[bsimg title=\"图片标题1\"]图片1直链[/bsimg]\\n[bsimg title=\"图片标题2\"]图片2直链[/bsimg]\\n[bsimg title=\"图片标题3\"]图片3直链[/bsimg]\\n[/bsgallery]\\n');\n});\nfunction insert(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('textarea') && document.getElementById('textarea').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('textarea');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t};\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t};\n\t\t\t\t\tif (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t};\n\t\t\t\t};\n});\n});\n</script>\n<?php if(Bsoptions('Compress') == true) :?></nocompress><?php endif; ?>"
  },
  {
    "path": "cross.php",
    "content": "<?php\n    /**\n    * 时光机[微语]\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n<?php $this->need('compoment/head.php');?>\n<?php if(Bsoptions('cross_style') == '2'): ?>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"<?php AssetsDir();?>assets/css/modules/timeline_custom.css?v=<?php echo themeVersion(); ?>\">\n<?php endif; ?>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n               <div class=\"page-card\">\n                    <h2><i class=\"hourglass half icon\"></i> <?php $this->title() ?></h2><br>\n                    <?php Typecho_Widget::widget('Widget_Stat')->to($stat); ?>\n\n<div class=\"ui three statistics\">\n  <div class=\"statistic\" style=\"margin-left:auto;margin-right:auto\">\n    <div class=\"value\">\n      <?php if($stat->publishedPostsNum > '999'){echo '999+';}else{echo $stat->publishedPostsNum();} ?>\n    </div>\n    <div class=\"label\">\n      篇文章\n    </div>\n  </div>\n  <div class=\"statistic\" style=\"margin-left:auto;margin-right:auto\">\n    <div class=\"value\">\n     <?php if($stat->publishedCommentsNum - $this->commentsNum> '999'){echo '999+';}else{echo $stat->publishedCommentsNum - $this->commentsNum;} ?>\n    </div>\n    <div class=\"label\">\n      条评论\n    </div>\n  </div>\n  <div class=\"statistic\" style=\"margin-left:auto;margin-right:auto\">\n    <div class=\"value\">\n      <?php if($this->commentsNum > '999'){echo '999+';}else{echo $this->commentsNum;} ?>\n    </div>\n    <div class=\"label\">\n      条动态\n    </div>\n  </div>\n \n</div>\n\n<center><button class=\"ui icon button\" style=\"margin-top:20px\"><i class=\"level down alternate icon\"></i>我的动态</button><button id=\"say\" class=\"ui icon button\" style=\"margin-top:20px;display:none;\"><i class=\"location arrow icon\"></i>我要发动态</button></center>\n<?php $this->need('cross-says.php'); ?>\n\n</div></div>\n\n</div>\n<?php if($this->is('page')):?>\n<script>\nfunction addSayBtn(){\n    $.post('<?php getIsLogin(); ?>',{action:'find'},function (res) {\n        res = JSON.parse(res);\n        switch(res.code){\n    case 1 :\n       $('#say').show();\n       $('.editsays').show();\n    break;\n        }\n    })\n}\n    jQuery(document).ready(function($){\naddSayBtn();\n $('#say').on('click', function () {   \n     $(\"#comments\").fadeIn('fast');\n });\n\tvar $timeline_block = $('.bs-timeline-block');\n\n\t$timeline_block.each(function(){\n\t\tif($(this).offset().top > $(window).scrollTop()+$(window).height()*0.75) {\n\t\t\t$(this).find('.bs-timeline-img, .bs-timeline-content').addClass('is-hidden');\n\t\t}\n\t});\n\n\t$(window).on('scroll', function(){\n\t\t$timeline_block.each(function(){\n\t\t\tif( $(this).offset().top <= $(window).scrollTop()+$(window).height()*0.75 && $(this).find('.bs-timeline-img').hasClass('is-hidden') ) {\n\t\t\t\t$(this).find('.bs-timeline-img, .bs-timeline-content').removeClass('is-hidden').addClass('bounce-in');\n\t\t\t}\n\t\t});\n\t});\n});\n</script>\n\n    \n<?php endif; ?>\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "douban.php",
    "content": "<?php\n    /**\n    * 豆瓣\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit;?>\n<?php $this->need('compoment/head.php');?>\n<link rel=\"stylesheet\" href=\"<?php AssetsDir();?>assets/vendors/douban/douban.css?v=<?php echo themeVersion(); ?>\">\n<script>\n    window.DoubanAPI = \"<?php echo Helper::options()->siteUrl.'index.php/getDouban';?>\";\n    window.DoubanPageSize = 8;\n</script>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n              <div class=\"page-card\">\n                <h2><i class=\"puzzle piece icon\"></i><?php $this->title() ?></h2>   \n\n <?php if(!empty(Bsoptions('douban_note'))): ?>     \n    <div class=\"ui segment\">\n  <i class=\"red heart icon\"></i>\n  <?php echo Bsoptions('douban_note');?>\n</div>\n<?php endif; ?>\n\n<?php if(is_array(Bsoptions('douban_show')) && in_array('movie',Bsoptions('douban_show'))):?>\n<section>\n      <h3><i class=\"film icon\"></i> 影视</h3>\n  <div class=\"tab\">\n\n\t<uls class=\"tabs\">\n\t\t<li><a>在看</a></li>\n\t\t<li><a>想看</a></li>\n\t\t<li><a>看过</a></li>\n\t</uls>\n\n\t<div class=\"tab_content\">\n\n\t\t<div class=\"tabs_item\">\n\t\t<div data-status=\"watching\" class=\"douban-movie-list doubanboard-list\"></div>  \n\t\t</div>\n\n\t\t<div class=\"tabs_item\">\n\t\t\t<div data-status=\"wish\" class=\"douban-movie-list doubanboard-list\"></div>  \n\t\t</div>\n\n\t\t<div class=\"tabs_item\">\n\t\t\t<div data-status=\"watched\" class=\"douban-movie-list doubanboard-list\"></div>  \n\t\t</div>\n\t\t\n\t</div>\n</div>\n\n</section>\n <?php endif;?>\n\n<?php if(is_array(Bsoptions('douban_show')) && in_array('book',Bsoptions('douban_show'))):?>\n<section>\n        <h3><i class=\"book icon\"></i> 读书</h3>\n  <div class=\"tab\">\n\n\t<uls class=\"tabs\">\n\t\t<li><a>在读</a></li>\n\t\t<li><a>想读</a></li>\n\t\t<li><a>读过</a></li>\n\t</uls>\n\n\t<div class=\"tab_content\">\n\n\t\t<div class=\"tabs_item\">\n\t\t<div data-status=\"reading\" class=\"douban-book-list doubanboard-list\"></div>  \n\t\t</div>\n\n\t\t<div class=\"tabs_item\">\n\t\t\t<div data-status=\"wish\" class=\"douban-book-list doubanboard-list\"></div>  \n\t\t</div>\n\n\t\t<div class=\"tabs_item\">\n\t\t\t<div data-status=\"read\" class=\"douban-book-list doubanboard-list\"></div>  \n\t\t</div>\n\t\t\n\t</div>\n</div>\n\n     \n</section>\n<?php endif;?>\n\n\n<?php if(is_array(Bsoptions('douban_show')) && in_array('music',Bsoptions('douban_show'))):?>\n<section>\n    <h3><i class=\"music icon\"></i> 音乐</h3>\n   <div class=\"tab\">\n\n\t<uls class=\"tabs\">\n\t\t<li><a>在听</a></li>\n\t\t<li><a>想听</a></li>\n\t\t<li><a>听过</a></li>\n\t</uls>\n\n\t<div class=\"tab_content\">\n\n\t\t<div class=\"tabs_item\">\n\t\t<div data-status=\"listening\" class=\"douban-music-list doubanboard-list\"></div>  \n\t\t</div>\n\n\t\t<div class=\"tabs_item\">\n\t\t\t<div data-status=\"wish\" class=\"douban-music-list doubanboard-list\"></div>  \n\t\t</div>\n\n\t\t<div class=\"tabs_item\">\n\t\t\t<div data-status=\"listened\" class=\"douban-music-list doubanboard-list\"></div>  \n\t\t</div>\n\t\t\n\t</div>\n</div>\n\n</section>\n\n<?php endif;?>\n</div> \n\n       </div> \n<script src=\"<?php AssetsDir();?>assets/vendors/douban/douban.js?v=<?php echo themeVersion(); ?>\"></script>\n</div>\n <script>\n$(document).ready(function () {\n  (function ($) {\n    $('.tab uls.tabs').addClass('active').find('> li:eq(0)').addClass('current');\n\n    $('.tab uls.tabs li a').click(function (g) {\n      var tab = $(this).closest('.tab'),\n      index = $(this).closest('li').index();\n\n      tab.find('uls.tabs > li').removeClass('current');\n      $(this).closest('li').addClass('current');\n\n      tab.find('.tab_content').find('div.tabs_item').not('div.tabs_item:eq(' + index + ')').slideUp();\n      tab.find('.tab_content').find('div.tabs_item:eq(' + index + ')').slideDown();\n\n      g.preventDefault();\n    });\n  })(jQuery);\n\n});\n    </script>\n\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "friendcircle.php",
    "content": "<?php\n    /**\n    * 朋友圈\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n<?php $this->need('compoment/head.php');?>\n<link href=\"<?php AssetsDir();?>assets/vendors/friendcircle/friendcircle.css?v=28\" rel=\"stylesheet\">\n<link href=\"<?php AssetsDir();?>assets/vendors/friendcircle/plyr.min.css\" rel=\"stylesheet\">\n<script src=\"<?php AssetsDir();?>assets/vendors/friendcircle/amrParse.js\"></script>\n\n<?php\n$parameter= array(\n   'parentId'      => $this->hidden ? 0 : $this->cid,\n   'parentContent' => $this->row,\n   'respondId'     => $this->respondId,\n   'commentPage'   => $this->request->filter('int')->commentPage,\n   'commentsPageSize' => '4',\n   'allowComment'  => $this->allow('comment')\n);\n$this->widget('BearSimple_Widget_Friendcircle_Archive',$parameter)->to($comments);\n?>\n\n<div class=\"pure-g\" id=\"layout\">\n    <?php if(Bsoptions('fcircle_hiddenMode') == true):?>\n    <div class=\"pure-u-1 pure-u-md-4-4\">\n        <?php else:?>\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n        <?php endif;?>\n                <div class=\"content_container\">\n               <div class=\"page-card\">\n                    <h2><i class=\"fan green icon\"></i><?php $this->title() ?></h2>\n    <div class=\"friendcircle-container\">\n        <section class=\"friendcircle-bg\">\n            <img src=\"<?php if(Bsoptions('fcircle_Background') == null): ?><?php AssetsDir();?>assets/images/mountain.webp<?php else:?><?php echo Bsoptions('fcircle_Background');?><?php endif;?>\" class=\"friendcircle-bg-img\">\n            <img src=\"<?php if(Bsoptions('fcircle_Avatar') == null): ?><?php AssetsDir();?>assets/images/circle_defaultAvatar.jpg<?php else:?><?php echo Bsoptions('fcircle_Avatar');?><?php endif;?>\" class=\"friendcircle-bg-author\">\n            <span class=\"friendcircle-bg-author-name\"><?php if(Bsoptions('fcircle_Name') == null): ?>神秘人<?php else:?><?php echo Bsoptions('fcircle_Name');?><?php endif;?></span>\n            <span class=\"friendcircle-bg-author-sign\"><?php if(Bsoptions('fcircle_Sign') == null): ?>神秘人的朋友圈<?php else:?><?php echo Bsoptions('fcircle_Sign');?><?php endif;?></span>\n        </section>\n        <button class=\"friendcircle-add\" id=\"friendcircle-add\" style=\"display:none\">发表朋友圈</button>\n        <style>\n        #circleDeleteLoad{\n         position:fixed;   \n        }\n        </style>\n    <div class=\"ui active inverted dimmer\" id=\"circleDeleteLoad\" style=\"display:none\">\n    <div class=\"ui active green elastic loader\"></div>\n  </div>\n  </body>\n  \n  <style>\n      .friendcircle-popup{\n          z-index:9999999999!important;\n      }\n  </style>\n<div class=\"friendcircle-popup friendcirclex\" role=\"alert\">\n<div class=\"ui active inverted dimmer\" id=\"circleSendLoad\" style=\"display:none\">\n    <div class=\"ui active green elastic loader\"></div>\n  </div>\n  <form method=\"post\" action=\"<?php editurl($this->commentUrl) ?>\" name=\"friendcircleform\" id=\"commentform\" class=\"friendcircle-form\">\n    <div class=\"friendcircle-popup-container\">\n      <p style=\"float:left\">\n        <div class=\"friendcircle-popup-close friendcircle-close-button\">\n          <i class=\"chevron left icon\" style=\"pointer-events:none;\"></i>\n        </div>\n    </p>\n  <div class=\"submit\" style=\"float:right\">\n      \n        <button type=\"submit\" name=\"submit\" id=\"submit\">发表</button>\n      </div>\n      <div class=\"message\">\n        <textarea name=\"text\" id=\"text\"  class=\"emotion\" placeholder=\"这一刻的想法...\"></textarea>\n       \n      </div>\n      <input type=\"text\" id=\"vtype\" name=\"vtype\" value=\"friendcircle\" style=\"display:none\">\n      \n        <div class=\"circular ui icon button\" id=\"facecircle\">\n  <i class=\"smile beam outline icon\"></i>\n </div>\n <div class=\"emoemo\" class=\"ignore\"  translate=\"no\" style=\"position: relative;margin-top:-20px\"></div>\n      <br>\n      \n \n\n<div id=\"getUpload\">\n\t\t\t\t<div class=\"ui icon tiny button\" name=\"btn\" id=\"btn\"><i class=\"image outline icon\"></i> 上传图片</div>\n\t\t\t\t<div class=\"ui icon tiny button\" name=\"btn_v\" id=\"btn_v\"><i class=\"file video outline icon\"></i> 上传音/视频</div>\n\t\t\t\t<ul id=\"ul_pics\" class=\"ul_pics clearfix\"></ul>\n\t\t\t\t<ul id=\"ul_video\" class=\"ul_video clearfix\"></ul>\n\t\t</div>\n\n\n      <br>\n      <div class=\"message_action\">\n          <div class=\"getMap\">\n      <i class=\"map marker alternate large green icon\"></i><div class=\"ui mini button\" id=\"getMap\">获取当前位置信息</div><input name=\"getMapInput\" id=\"getMapInput\" value=\"\" style=\"display:none\"></div>\n      <div class=\"canRead\">\n      <i class=\"user alternate large green icon\"></i> \n      <div class=\"ui right aligned toggle checkbox\">\n        <input type=\"checkbox\" id=\"getRead\" name=\"getRead\">\n       <label>仅自己可见</label>\n      </div>\n  \n\n  \n  \n      </div>\n      </div>\n    </div>\n    \n  \n    \n  </form>\n  \n \n</div>\n\n<body>\n\n<?php if (!$comments->have()): ?> \n<center>\n    <div style=\"margin-top:40px\">\n              <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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></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(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><ellipse cx=\"43\" cy=\"9.5\" rx=\"43\" ry=\"9.5\" transform=\"translate(253 701)\" fill=\"#ebedf5\"/><g transform=\"translate(63 354)\"><g transform=\"translate(258.49 305.55)\"><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(-524.241 -66.584)\" fill=\"#fff\"/><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(-523.763 -65.64)\" fill=\"url(#d)\"/></g><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-6.56-18.848-7.364-23.026,4.251-9.233,3.614-18.062c-.652-9.065-6.3-10.479-8.307-10.074s-3.609,2.392-6.154,3.47-6.292-.673-11.112,1.619-9.377,7.547-9.377,7.547c-2.009,2.561.4,10.648-.938,14.691s-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(-279.872 225.445)\" fill=\"#fff\"/><path d=\"M519.206,44.961s.961-1.578,1.726-1.594c1.313-.026,2.7,1.631,2.7,1.631S519.249,46.731,519.206,44.961Z\" transform=\"translate(-268.363 226.187)\" 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=\"translate(-269.464 223.151)\" fill=\"#757f95\"/><path d=\"M505.743,52.715s-6.088-1.338-6.755,3.318,4.181,7.509,7.656.6\" transform=\"translate(-279.292 231.235)\" fill=\"#fff\"/><path d=\"M503.084,74.624s-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.893s-3.738-10.346-8.593-14.5\" transform=\"translate(-276.501 243.626)\" fill=\"url(#e)\"/><path d=\"M514.078,48.635a.6.6,0,0,0-.522.31v0l-.009.014a4.814,4.814,0,0,1-3.228,2.322l-.019,0,0,0a.6.6,0,0,0-.509.5l-.011,0-.406,1.078s.341-.014.842-.088l.057-.307.11-.584v.865c.188-.031.389-.073.6-.121v-.747l.064.454.037.268a5.609,5.609,0,0,0,2.386-1.138,4.083,4.083,0,0,0,1.152-1.977c.04-.155.054-.248.054-.248A.6.6,0,0,0,514.078,48.635Z\" transform=\"translate(-273.668 229.087)\" fill=\"#757f95\"/><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(-270.216 243.516)\" fill=\"url(#f)\"/><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(-277.496 242.564)\" fill=\"#fff\"/></g><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg></div>\n           <h2 class=\"post-title\">博主当前还没有朋友圈呢~</h2>\n        \n              \n  </center>\n  <?php endif;?>\n<?php if ($comments->have()): ?>    \n    <br>\n     <?php\n      ob_start();\n   $comments->listComments();\n   $comments_content = ob_get_contents();\n      ob_end_clean();\n   $comments_content = preg_replace(\"/<ol class=\\\"comment-list\\\">/sm\", '<ul id=\"friendcircle-list\" class=\"friendcircle-list friendcircle-list-front\">', $comments_content);\n   $comments_content = preg_replace(\"/<\\/ol>/sm\", '</ul>', $comments_content);\n   echo $comments_content;\n   ?>\n\n\n    <?php\n      ob_start(); \n\n      $comments->pageNav('&laquo;','&raquo;', 1, '');\n      $content = ob_get_contents();\n      ob_end_clean();\n      \n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<div class=\"ui  labels\" style=\"margin-top:30px\"><div style=\"text-align:center\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<a class=\"ui large label\">...</a>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui green large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      //旧版本兼容\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui green large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      \n      $content = preg_replace(\"/<\\/ol>/sm\", '</div></div>', $content);\n      echo $content;\n    \n     ?>\n\n\n    <?php endif; ?>\n    \n\n\n\n\n        </div>\n    \n \n\n\n\n<div id=\"friendcircle-comment-container\" style=\"display:none\">\n   \n  <div class=\"ui active inverted dimmer\" id=\"circleLoad\" style=\"display:none\">\n    <div class=\"ui active green elastic loader\"></div>\n  </div>\n\n\n             <div class=\"friendcircle-comment-types\">\n                 \n                 <div id=\"nologinshow\" style=\"display:none\">\n            <input type=\"text\" id=\"friendcircle-comment-nickname\" placeholder=\"昵称*\">\n            <input type=\"email\" id=\"friendcircle-comment-email\" placeholder=\"邮箱*\">\n            <input type=\"url\" id=\"friendcircle-comment-url\" placeholder=\"网址\">\n            </div>\n            <div id=\"loginshowlabel\" style=\"display:none;padding-left: 5px;\">\n                <div class=\"ui image label\" style=\"float:left\">\n  <img src=\"<?php echo imgravatarq($this->user->mail); ?>\">\n  <name id=\"authorname\"></name>\n</div>\n                   </div>\n            <textarea id=\"friendcircle-comment-textarea\" class=\"emotion_circle\" required=\"\" spellcheck=\"false\" maxlength=\"500\" onchange=\"this.value=this.value.substring(0, 500)\" onkeydown=\"this.value=this.value.substring(0, 500)\" onkeyup=\"this.value=this.value.substring(0, 500)\" placeholder=\"评论内容\"></textarea>\n            <button id=\"friendcircle-comment-submit\">发送</button>\n            <button id=\"friendcircle-comment-cancelsubmit\">取消</button>\n              <div class=\"circular ui icon button friendcircle-comment-emoji\" id=\"facecirclecomment\">\n  <i class=\"smile beam outline icon\"></i>\n </div>\n          \n                \n            </div>\n <div  class=\"ignore emoemo\"  translate=\"no\"></div>\n            \n         </div>\n      \n\n</div></div>\n\n\n<script src=\"<?php AssetsDir();?>assets/vendors/friendcircle/moxie.js?v=2\"></script>\n<script src=\"<?php AssetsDir();?>assets/vendors/friendcircle/plupload.js\"></script>\n\n<script src=\"<?php AssetsDir();?>assets/vendors/friendcircle/plyr.min.js\"></script>\n\n<script src=\"<?php AssetsDir();?>assets/vendors/friendcircle/funlazy.min.js\"></script>\n       \n   \n\n\n<script>\n\nFunLazy({\n    placeholder: \"<?php AssetsDir();?>assets/images/load.gif\",\n    effect: \"fadeIn\"\n});\n    function amrParse(){\n    function E(selector) {\n        return $(selector);\n    }\n\n    $(\".amr-begin\").on('click', function () {\n        let amr = new BenzAMRRecorder();\n        let playBtn = E('#amr-play-'+$(this).attr('data-circleid'));\n        let stopBtn = E('#amr-stop-'+$(this).attr('data-circleid'));\n        let progressCtrl = E('#amr-progress-'+$(this).attr('data-circleid'));\n        let isDragging = false;\n        let cur = E('#amr-cur-'+$(this).attr('data-circleid'));\n        let duration = E('#amr-duration-'+$(this).attr('data-circleid'));\n        playBtn.prop('disabled', true);\n        stopBtn.prop('disabled', true);\n        progressCtrl.prop('disabled', true);\n        amr.initWithUrl($(this).attr('data-amrfile')).then(function () {\n            playBtn.prop('disabled', false);\n            stopBtn.prop('disabled', false);\n            progressCtrl.prop('disabled', false);\n            progressCtrl.attr('max', amr.getDuration());\n            duration.html(amr.getDuration().toFixed(2) + '\\'');\n        });\n        $(\"#amr-begin-\"+$(this).attr('data-circleid')).hide();\n        $(\"#amr-play-\"+$(this).attr('data-circleid')).fadeIn();\n        $(\"#amr-stop-\"+$(this).attr('data-circleid')).fadeIn();\n         // 绑定事件\n            amr.onPlay(function () {\n                playBtn.html('<i class=\"pause icon\">');\n            });\n            amr.onStop(function () {\n                playBtn.html('<i class=\"play icon\">');\n            });\n            amr.onPause(function () {\n                playBtn.html('<i class=\"play icon\">');\n            });\n            amr.onResume(function () {\n                playBtn.html('<i class=\"pause icon\">');\n            });\n            amr.onEnded(function () {\n                playBtn.html('<i class=\"play icon\">');\n            });\n            amr.onAutoEnded(function () {\n                //预置方法\n            });\n            amr.onStartRecord(function () {\n                //预置方法\n            });\n            amr.onFinishRecord(function () {\n                //预置方法\n            });\n            amr.onCancelRecord(function () {\n                //预置方法\n            });\n            \n            \n             setInterval(function () {\n        if (amr) {\n            cur.html(amr.getCurrentPosition().toFixed(2) + '\\'');\n            if (!isDragging) {\n                progressCtrl.val(amr.getCurrentPosition().toFixed(2));\n            }\n        } else {\n            cur.html('0\\'');\n        }\n    }, 10);\n    playBtn.on('click', function () {\n        amr.playOrPauseOrResume();\n    });\n\n    stopBtn.on('click', function () {\n        amr.stop();\n    });\n\n    progressCtrl.on('mousedown', function () {\n        isDragging = true;\n    });\n    progressCtrl.on('mouseup', function () {\n        isDragging = false;\n    });\n    progressCtrl.on('change', function (e) {\n        amr.setPosition(e.target.value);\n    });\n    \n    \n    \n    });\n     $(\".amr-begin\").click();\n    }\n\n\n\n\n\n\n      $(function(){\namrParse();\n\n$.post('<?php getCommentAction(); ?>',{action:'getCommentToken'},function (res) {\n         res = JSON.parse(res);\n         if(res.code == 1){\n             $(\"#SecurityToken\").remove();\n        var tokenInput=$(\"<input type=\\\"hidden\\\" name=\\\"SecurityToken\\\"  id=\\\"SecurityToken\\\">\");\ntokenInput.attr(\"value\", res.token);\n$(\"#commentform\").append(tokenInput);\n         }\n    });\n    \n           $(\".friendcircle-action\").on('click mouseenter',function() {\n            $(\".tool-container\").hide();\n            $(this).find(\".tool-container\").show();\n       \n        });\n\n      $(document).on('click',function(event) {\n          if (!$(event.target).closest('.circle-action').length) {\n              $(\".tool-container\").hide();\n          }\n         });\n          $('.circle-pictures .circle-picture img,.friendcircle-avatar img,.friendcircle-bg img')\n  .visibility({\n    type       : 'image',\n    transition : 'fade in',\n    duration   : 1000\n  })\n;\n       function plyr(){\n           if(!$(\".circle_player\").length){\n            return false;   \n           }\n         const players = Plyr.setup('.circle_player',{\n              controls : [\n                'play-large', 'play', 'progress', 'current-time', 'mute', 'volume', 'captions',  'pip', 'airplay', 'fullscreen' \n              ],\n              \n          });\n         players.forEach(function(player){\n             \n          player.on('playing', (event) => {\n              player.on('click', (event) => {\nplayer.pause();\n});\n          });\n          player.on('pause', (event) => {\n              player.on('click', (event) => {\nplayer.play();\n});\n          });\n          player.on('enterfullscreen', (event) => {\n  const instance = event.detail.plyr;\n  $(\".plyr--video .plyr__controls .plyr__controls__item\").show();\n});\n         player.on('exitfullscreen', (event) => {\n  const instance = event.detail.plyr;\n  $(\".plyr--video .plyr__controls .plyr__controls__item\").hide();\n});\n});\n}\nplyr();\n          <?php if(Bsoptions('Emoji') == false) :?>\n          $.getScript(setting.import+\"assets/vendors/bs-emoji/bs-emoji.js?v=1.5\",function(){\n        $('#facecircle').BearsimpleEmoji($('.emotion'));\n          $('#facecirclecomment').BearsimpleEmoji($('.emotion_circle'));\n              \n          });\n          <?php endif;?>\n          function autoResize(element) {\n  element.style.height = 'auto';\n  element.style.height = `${element.scrollHeight}px`;\n}\n\nvar textarea = document.getElementById('friendcircle-comment-textarea');\n$(\"#friendcircle-comment-textarea\").on(\"input propertychange\",function(){\n\n    autoResize(this);\n    if(this.value.length){\n    $(\"#friendcircle-comment-container\").attr(\"style\", \"box-shadow: inset 0px 0px 0px 1px #07c160;\");\n    $(\"#friendcircle-comment-submit\").addClass(\"friendcircle-comment-readySubmit\");\n    }\n    else{\n    $(\"#friendcircle-comment-container\").attr(\"style\", \"box-shadow: inset 0px 0px 0px 0px #07c160;\");\n    $(\"#friendcircle-comment-submit\").removeClass(\"friendcircle-comment-readySubmit\");    \n    }\n});\n\n\n  \n          dom = function (id) {\n            return document.getElementById(id);\n        };\n        create = function (tag, attr) {\n            var el = document.createElement(tag);\n        \n            for (var key in attr) {\n                el.setAttribute(key, attr[key]);\n            }\n        \n            return el;\n        };\n        $('.circle-like').on('click',function(){\n            $('.circle-like').css(\"pointer-events\",\"none\");\n            var coid = $(this).attr('data-coid');\n            $.ajax({\n        url: '<?php getCircleAction();?>',\n        type: 'POST',\n        dataType: 'html',\n        data: {\n                            \"action\": 'like',\n                            \"coid\":coid\n                        },\n                        \n        \n        success: function(response) {\n            $('.circle-like').css(\"pointer-events\",\"auto\");\n            json = JSON.parse(response);\n            if(json.code == 500){\n                $('body').toast({\n\t\t\t\t\t\t\t    title:'点赞失败',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: json.msg, \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn false;\n            }\n           $('body').toast({\n\t\t\t\t\t\t\t    title:'点赞成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已点赞成功~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t    \n\t\t\tif(json.likeUser !== '' && json.likeVisitor !== ''){\n\t\t\t    json.likeVisitor = '，'+json.likeVisitor;\n\t\t\t}\n\n\t\t   if(!$(\"#friendcircle-comments-\"+coid).length){\n\t\t       $(\"#friendcircle-action-\"+coid).after('<div class=\"friendcircle-comments\" id=\"friendcircle-comments-'+coid+'\"><span id=\"friendcircle-comments-like-'+coid+'\"><i class=\"heart outline icon\"></i> '+json.likeUser+json.likeVisitor+'</span></div>');\n\t\t   }\n\t\t   if($(\"#friendcircle-comments-\"+coid).length && !$(\"#friendcircle-comments-like-\"+coid).length){\n\t\t\t$(\"#friendcircle-comments-\"+coid).prepend('<span id=\"friendcircle-comments-like-'+coid+'\"><i class=\"heart outline icon\"></i> '+json.likeUser+json.likeVisitor+'</span><hr>');\n\t\t\t}\n\t\t\tif($(\"#friendcircle-comments-\"+coid).length && $(\"#friendcircle-comments-like-\"+coid).length){\n\t\t\t$(\"#friendcircle-comments-like-\"+coid).empty().html('<i class=\"heart outline icon\"></i> '+json.likeUser+json.likeVisitor);\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n        },\n        \n        error: function(req, status, error) {\n            $('.circle-like').css(\"pointer-events\",\"auto\");\n          $('body').toast({\n\t\t\t\t\t\t\t    title:'点赞失败',\n\t\t\t\t\t\t\t    class: 'error',\n\t\t\t\t\t\t\t    message: '网络错误', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n        }\n    });\n    \n    \n    \n        });\n         $('#friendcircle-comment-cancelsubmit').on('click',function(event){\n             var response = dom('friendcircle-comment-container');\n              event.stopPropagation();\n              response.style.display = \"none\";\n              $('.circle-action').css(\"pointer-events\",\"auto\");\n         });\n        $('.circle-comment-children').on('click',function(){\n            $('.circle-action').css(\"pointer-events\",\"none\");\n              var response = dom('friendcircle-comment-container');\n              var com = dom('circle-children-'+$(this).attr('data-coid'));\n              window.localStorage.setItem('reply-coid', $(this).attr('data-coid'));\n                com.appendChild(response).style.display = \"block\";\n                $(\"#friendcircle-comment-textarea\").attr(\"placeholder\", \"回复\"+$(this).attr('data-parentName')+\":\");\n                document.getElementById(\"friendcircle-comment-textarea\").focus();\n          });\n          $('.circle-comment').on('click',function(){\n              $('.circle-action').css(\"pointer-events\",\"none\");\n              var response = dom('friendcircle-comment-container');\n              var com = dom('comment-'+$(this).attr('data-coid'));\n              window.localStorage.setItem('reply-coid', $(this).attr('data-coid'));\n             $(\"#friendcircle-comment-textarea\").attr(\"placeholder\", \"回复<?php echo $this->author->screenName;?>:\");\n                com.appendChild(response).style.display = \"block\";\n               document.getElementById(\"friendcircle-comment-textarea\").focus();\n          });\n         \n        \n         $('.circle-delete').on('click',function(){\n             var coid = $(this).attr('data-coid');\n             var confirms = confirm(\"是否删除这条朋友圈?\");\n             if(confirms == true){\n                $(\"#circleDeleteLoad\").fadeIn();\n                $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: window.location.href,\n                        data: {\n                            \"action\": 'deleteCircle',\n                            \"coid\":coid\n                        },\n                        dateType: \"json\",\n                        success: function(url) {\n                            $.ajax({\n                        type: \"GET\",\n                        async:true,\n                        url: url,\n                        dateType: \"json\",\n                        success: function(json) {\n                            \n                            \n                 $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: '<?php getCircleAction();?>',\n                        data: {\n                            \"action\": 'delete',\n                            \"coid\":coid\n                        },\n                        dateType: \"json\",\n                        success: function(json) {\n                    \n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'删除成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已成功删除，即将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetTimeout(function() {\n            window.location.reload();\n            },2000);\n                          \n                            \n                    \n                        }\n     });\n     \n     \n                        },\n                        error: function() {\n                           alert('删除失败~');\n                        }\n                    });\n                          \n                            \n                    \n                        }\n     });\n                \n                \n                \n                \n                \n                \n                \n             }\n         });\n         $('#friendcircle-comment-submit').on('click',function(){\n             //$(\"#friendcircle-comment-submit\").css(\"pointer-events\",\"none\");\n             $(\"#friendcircle-comment-submit\").prop(\"disabled\", true);\n             $(\"#circleLoad\").fadeIn();\n             if(!$('#nologinshow').is(':hidden')){\n             if(!$('#friendcircle-comment-nickname').val()){\n                 $('body').toast({\n\t\t\t\t\t\t\t    title:'啊哦',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您还没填写昵称！', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t$(\"#circleLoad\").fadeOut();\n\t\t\t\t$(\"#friendcircle-comment-submit\").prop(\"disabled\", false);\n\t\t\t\treturn false;\n             };\n             if(!$('#friendcircle-comment-email').val()){\n                 $('body').toast({\n\t\t\t\t\t\t\t    title:'啊哦',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您还没填写邮箱！', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t$(\"#circleLoad\").fadeOut();\n\t\t\t\t$(\"#friendcircle-comment-submit\").prop(\"disabled\", false);\n\t\t\t\treturn false;\n             }}\n             \n             $.ajax({\n        url: '<?php editurl($this->commentUrl) ?>',\n        type: 'POST',\n        dataType: 'json',\n        data: {\n                            \"author\": $('#friendcircle-comment-nickname').val(),\n                            \"mail\": $('#friendcircle-comment-email').val(),\n                            \"url\": $('#friendcircle-comment-url').val(),\n                            \"text\": $('#friendcircle-comment-textarea').val(),\n                            \"SecurityToken\": $('#SecurityToken').val(),\n                            \"parent\": window.localStorage.getItem('reply-coid'),\n                            \"vtype\":'circlecomment'\n                        },\n                        \n        \n        success: function(response) {\n           $('body').toast({\n\t\t\t\t\t\t\t    title:'评论成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已评论成功，将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\twindow.location.reload();\n        },\n        \n        error: function(req, status, error) {\n          var div = $('<div>');\n        div.html(req.responseText);\n        var content = div.find('.container');\n        if(content.length > 0){\n            $('body').toast({\n\t\t\t\t\t\t\t    title:'评论失败',\n\t\t\t\t\t\t\t    class: 'error',\n\t\t\t\t\t\t\t    message: content.text(), \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n           $(\"#friendcircle-comment-submit\").prop(\"disabled\", false);\n           $(\"#circleLoad\").fadeOut();\n        }\n        else{\n         $('body').toast({\n\t\t\t\t\t\t\t    title:'评论成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已评论成功，将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n         window.location.reload();\n        }\n        }\n    });\n    \n    \n         });\n         \n         \n      \n      <?php\n    $phpMaxFilesize = function_exists('ini_get') ? trim(ini_get('upload_max_filesize')) : 0;\n\nif (preg_match(\"/^([0-9]+)([a-z]{1,2})$/i\", $phpMaxFilesize, $matches)) {\n    $phpMaxFilesize = strtolower($matches[1] . $matches[2] . (1 == strlen($matches[2]) ? 'b' : ''));\n}\n    ?>\n      \n       function fileUploadError (error) {\n        var file = error.file, code = error.code, word; \n        \n        switch (code) {\n            case plupload.FILE_SIZE_ERROR:\n                word = '<?php _e('文件大小超过限制'); ?>';\n                break;\n            case plupload.FILE_EXTENSION_ERROR:\n                word = '<?php _e('文件扩展名不被支持'); ?>';\n                break;\n            case plupload.FILE_DUPLICATE_ERROR:\n                word = '<?php _e('文件已经上传过'); ?>';\n                break;\n            case plupload.HTTP_ERROR:\n            default:\n                word = '<?php _e(\"上传出现错误，可能的原因：1、允许上传的文件类型与所上传的文件类型不符。2、配置了外部存储但没有正确配置。\"); ?>';\n                break;\n        }\n        alert(word);\n        this.removeFile(file);\n        $(\"#\" + file.id).remove();\n       }\n       \n      \n\n\n\t\tvar uploader = new plupload.Uploader({\n\t\t\t\truntimes: 'html5,flash,silverlight,html4',\n\t\t\t\tbrowse_button: 'btn',\n\t\t\t\turl: \"<?php $this->security->index('/action/upload?cid='.$this->cid);?>\",\n\t\t\t\tflash_swf_url   :   '<?php AssetsDir();?>assets/vendors/friendcircle/Moxie.swf',\n            filters         :   {\n                max_file_size       :   '<?php echo $phpMaxFilesize;?>',\n                mime_types          :   [{'title' : '允许上传的文件', 'extensions' : 'gif,jpg,jpeg,png,bmp,webp'}],\n                prevent_duplicates  :   false\n            },\n\t\t\t\tmulti_selection: false, \n\t\t\t\tinit: {\n\t\t\t\t\tFilesAdded: function(up, files) { //文件上传前\n\t\t\t\t\t$(\"#btn_v\").hide();\n\t\t\t\t\t\tif (up.files.length > 9) {\n\t\t\t\t\t\t\talert(\"抱歉，仅能上传9张图片~\");\n\t\t\t\t\t\t\tuploader.destroy();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar li = '';\n\t\t\t\t\t\t\tplupload.each(files, function(file) { //遍历文件\n\t\t\t\t\t\t\t\tli += \"<li id='\" + file['id'] + \"'><div class='fprogress'><span class='fbar'></span><span class='fpercent'>0%</span></div></li>\";\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t$(\"#ul_pics\").append(li);\n\t\t\t\t\t\t\tuploader.start();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tUploadProgress: function(up, file) { \n\t\t\t\t\t\tvar percent = file.percent;\n\t\t\t\t\t\t$(\"#\" + file.id).find('.fbar').css({\n\t\t\t\t\t\t\t\"width\": percent + \"%\"\n\t\t\t\t\t\t});\n\t\t\t\t\t\t$(\"#\" + file.id).find(\".fpercent\").text(percent + \"%\");\n\t\t\t\t\t},\n\t\t\t\t\tFileUploaded: function(up, file, info) {\n\t\t\t\t\t   if (200 == info.status) {\n\t\t\t\t\t        var data = $.parseJSON(info.response);\n\t                      //var data = eval(\"(\" + info.response + \")\");\n\t                      if (data) {\n\t\t\t\t\t\t$(\"#\" + file.id).html(\"<div class='img'><img data-fancybox='image' src='\" + data[0] + \"'/><input name='image' value='\" + data[0] + \"' style='display:none'></div>\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t    }\n\t\t\t\t\t   }\n\t\t\t\t\t   fileUploadError.call(uploader, {\n                        code : plupload.HTTP_ERROR,\n                        file : file\n                    });\n\t\t\t\t\t},\n\t\t\t\t\tError: function(up, err) {\n\t\t\t\t\t\tfileUploadError.call(uploader, err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tuploader.init();\n\t\t\t\n\tvar uploader_video = new plupload.Uploader({\n\t\t\t\truntimes: 'html5,flash,silverlight,html4',\n\t\t\t\tbrowse_button: 'btn_v',\n\t\t\t\turl: \"<?php $this->security->index('/action/upload?cid='.$this->cid);?>\",\n\t\t\t\tflash_swf_url   :   '<?php AssetsDir();?>assets/vendors/friendcircle/Moxie.swf',\n            filters         :   {\n                max_file_size       :   '<?php echo $phpMaxFilesize;?>',\n                mime_types          :   [{'title' : '允许上传的文件', 'extensions' : 'mp3,mp4,mov,wmv,wma,rmvb,rm,avi,flv,ogg,oga,ogv,flac,amr,speex'}],\n                prevent_duplicates  :   false\n            },\n\t\t\t\tmulti_selection: false, \n\t\t\t\tinit: {\n\t\t\t\t\tFilesAdded: function(up, files) { //文件上传前\n\t\t\t\t\tif (up.files.length == 1) {\n\t\t\t\t\t    $(\"#btn_v\").hide();\n\t\t\t\t\t    }\n\t\t\t\t\t$(\"#btn\").hide();\n\t\t\t\t\t\tif (up.files.length > 1) {\n\t\t\t\t\t\t\talert(\"抱歉，仅能上传一个媒体文件~\");\n\t\t\t\t\t\t\tuploader.destroy();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar li = '';\n\t\t\t\t\t\t\tplupload.each(files, function(file) { //遍历文件\n\t\t\t\t\t\t\t\tli += \"<li id='\" + file['id'] + \"'><div class='fprogress'><span class='fbar'></span><span class='fpercent'>0%</span></div></li>\";\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t$(\"#ul_video\").append(li);\n\t\t\t\t\t\t\tuploader_video.start();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tUploadProgress: function(up, file) { \n\t\t\t\t\t\tvar percent = file.percent;\n\t\t\t\t\t\t$(\"#\" + file.id).find('.fbar').css({\n\t\t\t\t\t\t\t\"width\": percent + \"%\"\n\t\t\t\t\t\t});\n\t\t\t\t\t\t$(\"#\" + file.id).find(\".fpercent\").text(percent + \"%\");\n\t\t\t\t\t},\n\t\t\t\t\tFileUploaded: function(up, file, info) {\n\t\t\t\t\t    if (200 == info.status) {\n\t\t\t\t\t        var data = $.parseJSON(info.response);\n\t                      //var data = eval(\"(\" + info.response + \")\");\n\t                      if (data) {\n                         if(data[0].search('.mp4') !== -1){\n                             $(\"#\" + file.id).html(\"<div class='friendcircle_video'><video class='circle_player' controls crossorigin playsinline><source src='\" + data[0] + \"'></video><input name='image' value='\" + data[0] + \"' style='display:none'></div>\");\n                         }\n                         else if(data[0].search('.amr') !== -1){\n                             \n                             $(\"#\" + file.id).html(\"<div class=\\\"circle_player\\\"><div id=\\\"amr-begin-uploadPreview\\\" class=\\\"ui small label amr-begin\\\" data-circleid=\\\"uploadPreview\\\" data-amrfile='\" + data[0] + \"'>加载</div><div id=\\\"amr-play-uploadPreview\\\" class=\\\"ui small green icon label\\\" style=\\\"display:none\\\" disabled><i class=\\\"play icon\\\"></i></div><div id=\\\"amr-stop-uploadPreview\\\" class=\\\"ui small red icon label\\\" style=\\\"display:none\\\" disabled><i class=\\\"stop icon\\\"></i></div><input id=\\\"amr-progress-uploadPreview\\\" type=\\\"range\\\" min=\\\"0\\\" max=\\\"1\\\" step=\\\"any\\\" value=\\\"0\\\"  class=\\\"ui range\\\" disabled><label for=\\\"amr-progress-uploadPreview\\\" style=\\\"vertical-align:middle\\\"><span id=\\\"amr-cur-uploadPreview\\\">0'</span><span>/</span><span id=\\\"amr-duration-uploadPreview\\\">0'</span></label></div><input name='image' value='\" + data[0] + \"' style='display:none'></div>\");\n                             \n                             \n                             amrParse();\n    \n\n   \n                          \n                         }\n                         else{\n                         $(\"#\" + file.id).html(\"<div class='friendcircle_video'><audio class='circle_player' controls><source src='\" + data[0] + \"'></audio><input name='image' value='\" + data[0] + \"' style='display:none'></div>\");  \n                         }\n\t\t\t\t\t\tplyr();\n\t\t\t\t\t\treturn;\n\t                      }\n\t\t\t\t\t    }\n\t\t\t\t\t    fileUploadError.call(uploader_video, {\n                        code : plupload.HTTP_ERROR,\n                        file : file\n                    });\n\t\t\t\t\t},\n\t\t\t\t\tError: function(up, err) {\n\t\t\t\t\t\tfileUploadError.call(uploader_video, err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tuploader_video.init();\t\t\n\t\t\n    \n$(function () {\n\n    getCommentInfo();\n\nfunction getCookie(name){\n    const strcookie = document.cookie;\n    const arrcookie = strcookie.split(\"; \");\n    for (let i = 0; i < arrcookie.length; i++) {\n        const arr = arrcookie[i].split(\"=\");\n        if (arr[0] === name){\n            return arr[1];\n        }\n    }\n    return \"\";\n};\nfunction getCommentInfo(){\n    let nick = document.getElementById('friendcircle-comment-nickname');\n    let mail = document.getElementById('friendcircle-comment-email');\n    let url = document.getElementById('friendcircle-comment-url');\n    let nick_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_author'));\n    let mail_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_mail'));\n    let url_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_url'));\n    if (nick && nick_value!== 'null') nick.value = nick_value;\n    if (mail && mail_value!== 'null') mail.value = mail_value;\n    if (url && url_value!== 'null') url.value = url_value;\n    $.post('<?php getIsLogin(); ?>',{action:'find'},function (res) {\n        res = JSON.parse(res);\n        switch(res.code){\n            case 0 :\n        $('#loginshowlabel').hide();\n    $('#nologinshow').show();\n    break;\n    case 1 :\n        switch(res.group){\n            case 'administrator':\n        $('#friendcircle-add').fadeIn();\n        $('.circle-delete').fadeIn();\n        break;\n        }\n        $('#loginshowlabel').show();\n    $('#nologinshow').hide();\n    $('#authorname').html(res.name);\n    break;\n        }\n    });\n\n\n\n     \n}\n\n\n\nfunction closeForm() {\n  $('.friendcircle-popup').removeClass('is-visible');\n}\n\n\n$('#getMap').on('click', function (event) {\n    $('#getMap').html('正在获取您的位置，请稍等...');\n    $('#getMap').css(\"pointer-events\",\"none\");\n    $.post(window.location.href,{action:'getmap'},function (res) {\n        $('#getMap').html(res);\n        $('#getMapInput').val(res);\n    });\n});\n  \n  $('#friendcircle-add').on('click', function () {\n \n    $('.friendcirclex').addClass('is-visible');\n    document.getElementById(\"text\").focus();\n   \n  });\n\n\n  $('.friendcircle-popup').on('click', function (event) {\n    if ($(event.target).is('.friendcircle-popup-close') || $(event.target).is('.friendcircle-popup')) {\n      event.preventDefault();\n      $(this).removeClass('is-visible');\n    }\n  });\n\n \n  $(document).keyup(function (event) {\n    if (event.which == '27') {\n      $('.friendcircle-popup').removeClass('is-visible');\n    }\n  });\n\n\nfunction undatakey(formdata,name)\n{\n    result = '';\n    for(var i in formdata.split(\"&\")){\n        var row = formdata.split(\"&\")[i];\n        var key = row.split(\"=\")[0];\n        var value = row.split(\"=\")[1];\n        if(key != name){\n            result = result + row + \"&\";\n        }\n    }\n    \n    return result;\n}\n\n\n$('#commentform').submit(function(e) {\n    e.preventDefault();\n    var formData = undatakey($('#commentform').serialize(),'image').slice(0, -1);\nvar resources = '';\n$('input[name=image]').each(function () {\n   resources +=  $(this).val()+',';\n});\n$(\"#commentform\").css(\"pointer-events\",\"none\");\n             $(\"#circleSendLoad\").fadeIn();\n             \n             \n    if(!$('#text').val()){\n                 $('body').toast({\n\t\t\t\t\t\t\t    title:'啊哦',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '动态内容不能为空哦！', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n$(\"#commentform\").css(\"pointer-events\",\"auto\");\n             $(\"#circleSendLoad\").fadeOut();\t\n             return false;\n    };\t\t\t\t\t\n    $.ajax({\n        url: '<?php editurl($this->commentUrl) ?>',\n        type: 'POST',\n        dataType: 'json',\n        data: formData+ '&resources=' + encodeURIComponent(resources.substring(0,resources.length -1)),\n        \n        success: function(response) {\n           $('body').toast({\n\t\t\t\t\t\t\t    title:'发表成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已发表成功，将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\twindow.location.reload();\n        },\n        \n        error: function(req, status, error) {\n          var div = $('<div>');\n        div.html(req.responseText);\n        var content = div.find('.container');\n        if(content.length > 0){\n        $(\"#commentform\").css(\"pointer-events\",\"auto\");\n             $(\"#circleSendLoad\").fadeOut();\n         $('body').toast({\n\t\t\t\t\t\t\t    title:'发表失败',\n\t\t\t\t\t\t\t    class: 'error',\n\t\t\t\t\t\t\t    message: content.text(), \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n        }\n        else{\n         $('body').toast({\n\t\t\t\t\t\t\t    title:'发表成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已发表成功，将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\twindow.location.reload();\n        }\n        }\n    });\n});\n\n\n\n\n \n});\n});\n    </script>\n\n\n\n</div>\n <?php if(Bsoptions('fcircle_hiddenMode') == false || Bsoptions('fcircle_hiddenMode') == ''):?>\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php endif;?>\n    \n             \n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "functions.php",
    "content": "<?php\nerror_reporting(0);\nuse Typecho\\Common;\nuse Typecho\\Exception;\nuse Typecho\\Router;\nuse Utils\\Helper;\nuse Widget\\Options;\nif(!class_exists('CSF')){\n    require_once Helper::options()->pluginDir('BsCore').'/bsoptions-framework.php';\n}\n\nif (!class_exists('bsOptions')){\n    require_once \\Utils\\Helper::options()->pluginDir('BsCore').'/bsOptions.php';\n}\nrequire_once('core/func.php');\nfunction themeVersion()\n        {\n            return '2.9.9.20250803';\n        }\n\n\nfunction themeVersionOnly()\n        {\n            return '2.9.9';\n        }\n\n$options = bsOptions::getInstance()::get_option( 'bearsimple' );\n\n\nfunction Bsoptions($key, $default = false){\n    $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n    return $options[$key];\n}\n\n/**解析表情**/\n$emo = false;\nfunction reEmo($comment,$type){\n    global $emo;\n    $options = Helper::options();\n    if(!$emo){\n        $opts = array(\n  'http'=>array(\n   'method' => 'GET',\n          'header' => 'Content-type: application/json',\n          'timeout' => 60,\n       'Connection'=>\"close\"\n  )\n);\n$context = stream_context_create($opts);\n\n        if(Bsoptions('Emoji_HideDefault') == false || Bsoptions('Emoji_HideDefault') == ''){\n        $res = json_decode(file_get_contents(__DIR__.'/assets/vendors/bs-emoji/bs-emoji.json', false, $context),true);\n        $emo = $res;\n        }\n        if(Bsoptions('Emoji_Diy') == true && Bsoptions('Emoji_DiyUrl') !== ''){\n        $res2 = json_decode(file_get_contents(Bsoptions('Emoji_DiyUrl'), false, $context),true);\n        if(Bsoptions('Emoji_HideDefault') == false || Bsoptions('Emoji_HideDefault') == ''){\n        $emo = array_merge($res,$res2);\n        }\n        else{\n        $emo = $res2;    \n        }\n        }\n        \n        \n    }\n\n\n    foreach ($emo as $v){\n        if($v['category'] !== ''){\n                if($type == 'comment'){\n                $comment = str_replace($v['data'], '<img width=\"30\" src='.$v['icon'] .''.' loading=\"lazy\" style=\"vertical-align:bottom\">', $comment);\n                }\n                elseif($type == 'reply'){\n                $comment = str_replace($v['data'], '<img width=\"20\" src='.$v['icon'] .''.' loading=\"lazy\" style=\"vertical-align:middle\">', $comment);\n                }\n                elseif($type == 'circle'){\n                $comment = str_replace($v['data'], '<img width=\"30\" src='.$v['icon'] .''.' loading=\"lazy\" style=\"vertical-align:middle\">', $comment);\n                $comment = str_replace($v['codex'], '<img width=\"30\" src='.$v['icon'] .''.' loading=\"lazy\" style=\"vertical-align:middle\">', $comment);\n                }\n            \n                else{\n                $comment = str_replace($v['data'], '<img width=\"30\" src='.$v['icon'] .''.' loading=\"lazy\" style=\"vertical-align:middle\">', $comment);                    \n                }\n        }\n    }\n    //当评论没有私密评论时去除私密评论识别标签\n    $comment = str_replace('@私密@', '', $comment);\n    return $comment;\n}\n\nfunction reEmoPost($post){\n    global $emo;\n$options = Helper::options();\n    if(!$emo){\n        $opts = array(\n  'http'=>array(\n   'method' => 'GET',\n          'header' => 'Content-type: application/json',\n          'timeout' => 60 * 10,\n       'Connection'=>\"close\"\n  )\n);\n$context = stream_context_create($opts);\n\n        if(Bsoptions('Emoji_HideDefault') == false || Bsoptions('Emoji_HideDefault') == ''){\n        $res = json_decode(file_get_contents($options->themeUrl.\"/assets/vendors/bs-emoji/bs-emoji.json\", false, $context),true);\n        $emo = $res;\n        }\n        if(Bsoptions('Emoji_Diy') == true && Bsoptions('Emoji_DiyUrl') !== ''){\n        $res2 = json_decode(file_get_contents(Bsoptions('Emoji_DiyUrl'), false, $context),true);\n        if(Bsoptions('Emoji_HideDefault') == false || Bsoptions('Emoji_HideDefault') == ''){\n        $emo = array_merge($res,$res2);\n        }\n        else{\n        $emo = $res2;    \n        }\n        }\n        \n        \n    }\n\n\n\n    foreach ($emo as $v){\n        if($v['category'] !== ''){\n                \n                $post = str_replace($v['data'], '<img style=\"display:inline-block;margin: 0;padding: 0;width:30px;height:30px;vertical-align: middle;\" class=\"emoji\" src=\"'.$v['icon'] .'\"'.' loading=\"lazy\">', $post);\n        }\n    }\n    return $post;\n}\n\n\n\n\nif( class_exists( 'CSF' ) ) {\n    $Tyoptions = Helper::options();\n    $db = \\Typecho\\Db::get();\n    $adapter = $db->getAdapterName();\n  $prefix = 'bearsimple'; \n  syncDb();\n  CSF::createOptions( $prefix, array(\n    'menu_title' => 'Bearsimple',\n    'menu_slug'  => 'my-bearsimple',\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'       => '使用说明',\n    'icon'        => 'fas fa-question-circle',\n    'description' => '欢迎使用BearSimple主题v2版本，本主题为<strong>简约式主题</strong>，适合喜欢简约类的博客站长使用，以下是本主题的使用说明。<span class=\"button button-info csf--button\" id=\"driver_open\">\n            😎\n             功能引导\n        </span>',\n    'fields'      => array(\n\n        array(\n            'type'    => 'heading',\n            'content' => '使用说明',\n        ),\n\n        array(\n            'type'    => 'content',\n            'content' => '1、使用本主题尽量少安装插件，否则可能因存在冲突导致各种各样的问题<br>2、主题用户交流QQ群:561848356<br>3、主题文档中心:<a href=\"https://docs.whitebear.dev/\">戳这里访问</a><br><font color=red>4、若主题配置保存失败请检查是否开启了防火墙，且防火墙是否拦截了请求</font><br>5、不懂的问题或本主题存在的问题可加群或在社区中进行反馈     <br>\n    6、\n       BearTalk社区是为使用者提供的一个讨论交流社区，传送门：<a href=\"https://www.beartalk.ru\" target=\"_blank\">戳这里</a>\n  \n     <center>  <br>\n <div class=\"csf-submessage csf-submessage-info\">当前版本:v'.themeVersion().' / 最新版本:v<font id=\"version\"></font></div>\n<div id=\"versiontips\" style=\"margin-top:10px\"></div></center>\n\n<script src=\"'.Helper::options()->themeUrl.'/assets/js/jquery.min.js\"></script>\n  <script src=\"'.Helper::options()->themeUrl.'/assets/vendors/layer/layer.min.js?v=1\" type=\"application/javascript\"></script>\n<script>\n\n$(function() {\n\n\n$.post(\"https://upgrade.typecho.co.uk/Bearsimple/version.php\",function(data,status){\nswitch(status)\n{\ncase \"success\":\njson = JSON.parse(data);\nnowversion = \"'.themeVersion().'\";\n$(\"#version\").html(json.version);\nif(json.version > nowversion){\nif (/(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent)) {\n    $(\"#versiontips\").html(\\'<div class=\"csf-submessage csf-submessage-warning\">检测到有新版本可以更新，请及时完成更新!<br><a href=\"#check\" class=\"ui warning label\">前往更新<a></div>\\');\n} else {\n    $(\"#versiontips\").html(\\'<div class=\"csf-submessage csf-submessage-warning\">检测到有新版本可以更新，请及时完成更新!<br><a href=\"#tab=在线升级\" class=\"ui warning label\">前往更新<a></div>\\'); \n};\n\n}\nbreak;\ncase \"error\":\n$(\"#version\").html(\"最新版本获取失败\");\nbreak;\ncase \"timeout\":\n$(\"#version\").html(\"最新版本获取超时\");\nbreak;\ndefault: $(\"#version\").html(\"'.themeVersion().'\");\n}\n    });\n});\n</script>',\n        ),\n\n        array(\n            'type'    => 'submessage',\n            'style'   => 'info',\n            'content' => '在反馈本主题相关的问题时，请务必将以下内容放入您要反馈的内容中',\n        ),\narray(\n                'type'    => 'notice',\n            'style'   => 'info',\n                'content' => '<ul style=\"margin:0 auto;\"><li>BearSimple主题版本：v'.themeVersion().'[<a href=\"https://docs.whitebear.dev/index.php/archives/6/\" target=\"_blank\">更新日志</a>]</li><li>PHP版本：'.PHP_VERSION.'</li><li>网站服务器：'.$_SERVER['SERVER_SOFTWARE'].'</li><li>数据库：'.$db->getAdapterName().'[Version：'.$db->getVersion().']</li><li>Typecho版本：'.$Tyoptions->version.'</li><li>User Agent信息：'.$_SERVER['HTTP_USER_AGENT'].'</li></ul>',\n        ),\n\n    )\n) );\n$siteMaintenance_files = glob(__DIR__ . '/modules/siteMaintenance/*.html');\n$siteMaintenance_styles = array_map('basename', $siteMaintenance_files);\n$siteMaintenance_associative = array_combine($siteMaintenance_styles, $siteMaintenance_styles);\n  CSF::createSection( $prefix, array(\n    'title'  => '基础设置',\n    'icon'   => 'fas fa-cog',\n    'fields' => array(\n      \n      array(\n            'id'      => 'header_choose',\n            'type'    => 'radio',\n            'title'   => '站点LOGO类型',\n            'inline'  => true,\n            'options' => array(\n                'text'    => '文字LOGO',\n                'image'   => '图片LOGO',\n            ),\n            'default' => 'text'\n        ),\n      array(\n        'id'    => 'textlogo_text',\n        'type'  => 'text',\n        'title' => '站点文字LOGO',\n        'default' => $Tyoptions->title,\n        'after' => '请填入站点文字LOGO',\n        'dependency' => array( 'header_choose', '==', 'text' ),\n      ),\n      array(\n        'id'    => 'textlogo_dec',\n        'type'  => 'textarea',\n        'title' => '站点文字介绍',\n        'after' => '请填入站点文字介绍',\n        'dependency' => array( 'header_choose', '==', 'text' ),\n      ),\n      array(\n            'id'      => 'imagelogo',\n            'title'   => '站点图片LOGO',\n            'after' => '请上传站点图片LOGO，最佳尺寸为250X70',\n            'type'    => 'upload',\n            'dependency' => array( 'header_choose', '==', 'image' ),\n        ),\n     array(\n            'id'      => 'imagelogo_dark',\n            'title'   => '站点图片LOGO[黑暗模式]',\n            'after' => '请上传黑暗模式时的站点图片LOGO，最佳尺寸为250X70',\n            'type'    => 'upload',\n            'dependency' => array( 'header_choose', '==', 'image' ),\n        ),\n      array(\n            'id'      => 'favicon',\n            'type'    => 'upload',\n            'title'   => '站点Favicon图标',\n        ),\n    array(\n            'id'          => 'siteMaintenance_Open',\n            'type'        => 'switcher',\n            'title'       => '是否开启维护模式',\n            'subtitle' => '选择开启则前台访客访问将显示维护模式页面，仅管理员身份登录后可正常访问前台',\n            'default' => false,\n        ),\n        array(\n            'id'          => 'siteMaintenance_templates',\n            'type'        => 'select',\n            'title'       => '维护模式模板',\n            'after' => '选择维护模式模板，邮件模板可自由DIY，目录位于/usr/themes/bearsimple/modules/siteMaintenance',\n            'options'     => $siteMaintenance_associative,\n            'default' => 'default.html',\n            'dependency' => array( 'siteMaintenance_Open', '==', 'true' ),\n        ), \n      array(\n            'id'      => 'avatar__choose',\n            'type'    => 'radio',\n            'title'   => '头像服务选择',\n            'inline'  => true,\n            'options' => array(\n                'cravatar'    => 'Cravatar服务',\n                'weavatar'   => 'Weavatar服务',\n                'gravatar'   => 'Gravatar服务',\n                'diyavatar'   => '自定义头像',\n                'closeavatar'   => '不显示头像',\n            ),\n            'default' => 'cravatar',\n            'after' => 'Cravatar服务：Cravatar适合在国内使用，优先级:Cravatar头像->Gravatar头像->QQ头像<br>Weavatar服务：Weavatar也适合在国内使用，优先级:Weavatar头像->Gravatar头像->QQ头像<br>Gravatar服务：在国内官方源可能访问不了头像，支持了多个镜像源并支持您填写自定义镜像源<br>自定义头像：您可以通过自定义头像在前台为每个用户显示出随机头像，在自定义头像栏为空时默认为Cravatar<br>不显示头像：若选择不显示头像，则评论区和侧边栏最新评论都将不显示头像<br><font color=red>目前QQ头像调用的是Weavatar，若注册过Weavatar，则不会显示QQ头像</font>',\n        ),\n        array(\n            'id'      => 'Cravatar_default',\n            'type'    => 'upload',\n            'title'   => 'Cravatar默认头像',\n            'after' => '考虑到Cravatar默认头像略丑的问题，这里支持自定义Cravatar默认头像。',\n            'dependency' => array( 'avatar__choose', '==', 'cravatar' ),\n        ),\n        array(\n            'id'      => 'Weavatar_default',\n            'type'    => 'upload',\n            'title'   => 'Weavatar默认头像',\n            'after' => '考虑到Weavatar默认头像略丑的问题，这里支持自定义Weavatar默认头像。',\n            'dependency' => array( 'avatar__choose', '==', 'weavatar' ),\n        ),\n        array(\n        'id'    => 'DiyAvatar',\n        'type'  => 'textarea',\n        'title' => '自定义头像',\n        'after' => '您可以自定义前台评论区随机头像，格式为a.png,b.png，保证每个头像图片都为直链可直接访问，多个头像图片使用英文逗号分隔，当本栏为空时默认使用Cravatar服务。',\n        'dependency' => array( 'avatar__choose', '==', 'diyavatar' ),\n      ),\n      array(\n            'id'          => 'Gravatar',\n            'type'        => 'select',\n            'title'       => 'Gravatar源选择',\n            'after' => '因Gravatar官方在中国大陆地区被Q，导致在中国大陆访问使用Gravatar的站点时头像不显示,这里支持您自主选择合适的源,若为自定义，举例:cdn.v2ex.com/gravatar/<br>本功能适配QQ,当填写的邮箱为QQ邮箱时则显示QQ头像',\n            'options'     => array('1' => 'Gravatar官方源', '3' => 'V2EX*Gravatar镜像源','4' => 'LOLI.NET*Gravatar镜像源','7' => '自定义Gravatar镜像源'),\n            'default' => '5',\n            'dependency' => array( 'avatar__choose', '==', 'gravatar' ),\n        ),\n      array(\n        'id'    => 'GravatarUrl',\n        'type'  => 'text',\n        'title' => '自定义Gravatar源地址',\n        'after' => '请填入自定义Gravatar镜像源地址,格式:cdn.v2ex.com/gravatar/<br>Tips:当您所填写的自定义地址访问时能够显示图片时则您所填写的地址是正常的',\n        'dependency' => array( 'Gravatar|avatar__choose', '==|==', '7|gravatar' ),\n      ),\n       array(\n            'id'          => 'Assets',\n            'type'        => 'select',\n            'title'       => '资源CDN加速',\n            'placeholder' => '选择合适的CDN加速方式',\n            'after' => '本主题支持您选择合适的储存方式来储存样式资源文件进而达到网站加速的效果。',\n            'options'     => array('1' => '本地储存', '3' => '自定义储存'),\n            'default' => '1',\n        ),\n        array(\n        'id'    => 'Assets_Custom',\n        'type'  => 'text',\n        'title' => '自定义CDN加速源地址',\n        'after' => '请填入风格文件储存源地址,例子:https://xxxx.com/，或者https://xxxx.com/xxx/，请务必将整个assets目录都放进去!!!当你填写的是https://xxxx.com/时，风格存储地址应该是https://xxxx.com/assets<br>检测结果:'.GetCheck(),\n        'dependency' => array( 'Assets', '==', '3' ),\n      ),\n      \n              array(\n        'id'    => 'BackGround',\n        'type'    => 'upload',\n        'title' => '网站背景',\n        'after' => '请上传网站背景图片,若为空则不显示<br><a style=\"color:red\">提醒：图片名请勿带括号等特殊符号，如xxx(1).jpg，可能会出现无法显示的情况</a>',\n      ),\n            array(\n        'id'    => 'Diyfont',\n        'type'  => 'upload',\n        'title' => '自定义字体',\n        'after' => '您可以自定义网站所显示的字体，请填入字体直链，或直接上传字体文件，若为空则表示使用默认字体',\n      ),\n        array(\n            'id'      => 'hcsticky',\n            'type'    => 'switcher',\n            'title'       => '是否对侧边栏使用粘住',\n            'subtitle' => '若开启，则侧边栏吸顶。',\n            'default' => false,\n        ),\n        \n\n        array(\n            'id'      => 'global_shadow',\n            'type'    => 'switcher',\n            'title'       => '全局增加阴影效果',\n            'subtitle' => '阴影效果在宽屏模式下看不到效果。',\n            'default' => false,\n        ),\n                array(\n            'id'      => 'global_transparent',\n            'type'    => 'switcher',\n            'title'       => '全局增加透明效果',\n            'subtitle' => '透明效果需设置一张背景图方可显示。',\n            'default' => false,\n        ),\n         array(\n            'id'          => 'pagination_style',\n            'type'        => 'select',\n            'title'       => '分页样式选择',\n            'after' => '选择上一页下一页的分页样式，默认为新样式。',\n            'options'     => array('1' => '新样式',  '2' => '旧样式'),\n            'default' => '1',\n        ),\n         \n        array(\n            'id'          => 'site_style',\n            'type'        => 'select',\n            'title'       => '页面布局选择',\n            'after' => '选择页面布局，双栏或单栏。',\n            'options'     => array('1' => '双栏(文章展现列表+侧边区块栏)',  '2' => '单栏(仅文章展现列表)'),\n            'default' => '1',\n        ),\n        array(\n                'id'      => 'width_Selection',\n                'type'    => 'select',\n                'title'   => '页面宽度模式',\n                'options' => array(\n                    '1' => '窄屏',\n                    '2' => '宽屏',\n                ),\n                'after' => '选择前台是要宽屏模式还是窄屏模式，若为窄屏模式则为固定宽度，若为宽屏模式则跟随屏幕的宽度而变化。',\n                'default' => '1'\n            ),\n    )\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'  => '首页及分类',\n    'icon'   => 'fas fa-list-alt',\n    'fields' => array(\n              array(\n            'id'      => 'Sticky',\n            'type'    => 'switcher',\n            'title'       => '是否开启文章置顶',\n            'default' => false,\n        ),\n        \n    array(\n            'id'          => 'Sticky_cids',\n            'type'        => 'select',\n            'title'       => '首页需要置顶的文章',\n            'chosen'      => true,\n            'multiple'    => true,\n            'sortable'    => true,\n            'ajax'        => true,\n            'options'     => 'posts',\n            'placeholder' => '选择需要置顶的文章',\n            'dependency' => array( 'Sticky', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'Sticky_cids_pages',\n            'type'        => 'select',\n            'title'       => '首页需要置顶的页面',\n            'chosen'      => true,\n            'multiple'    => true,\n            'sortable'    => true,\n            'ajax'        => true,\n            'options'     => 'pages',\n            'placeholder' => '选择需要置顶的页面',\n            'dependency' => array( 'Sticky', '==', 'true' ),\n        ),\n        array(\n\n            'id'          => 'Sticky_cids_category',\n            'type'        => 'select',\n            'title'       => '分类需要置顶的文章',\n            'chosen'      => true,\n            'multiple'    => true,\n            'sortable'    => true,\n            'ajax'        => true,\n            'options'     => 'posts',\n            'placeholder' => '选择需要置顶的文章',\n            'dependency' => array( 'Sticky', '==', 'true' ),\n        ),\n        array(\n\n            'id'      => 'Sticky_Category',\n            'type'    => 'switcher',\n            'title'       => '开启后分类置顶只在文章所属分类置顶',\n            'default' => false,\n            'dependency' => array( 'Sticky', '==', 'true' ),\n        ),\n        array(\n\n            'id'       => 'Sticky_Mod',\n            'type'     => 'code_editor',\n            'title'    => '文章置顶样式',\n            'subtitle' => '可自定义文章置顶样式，支持HTML',\n            'default' => '<span style=\"color:red\">[置顶]</span>',\n            'dependency' => array( 'Sticky', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'Cate_Encrypt_open',\n            'type'    => 'switcher',\n            'title'       => '是否开启文章分类加密',\n            'subtitle' => '您可以对一些不想显示的隐私分类设置密码，本项对已登录用户无效。',\n            'default' => false,\n        ),\n        array(\n            'id'      => 'Cate_Encrypt_hide',\n            'type'    => 'switcher',\n            'title'       => '加密分类中的文章是否在首页显示',\n            'subtitle' => '若开启，则加密分类的所有文章均正常显示在首页中，本项对已登录用户无效。',\n            'default' => false,\n            'dependency' => array( 'Cate_Encrypt_open', '==', 'true'),\n        ),\n        array(\n            'id'     => 'Cate_Encrypt',\n            'type'   => 'group',\n            'title'  => '分类加密',\n            'subtitle' => '您可以通过本项增加指定分类的加密<br>若同个分类设置多个加密，则排越后面越优先。',\n            'dependency' => array( 'Cate_Encrypt_open', '==', 'true'),\n            'fields' => array(\n                array(\n        'id'    => 'Cate_Encrypt_Name',\n        'type'  => 'text',\n        'title' => '标识',\n        'after' => '您可以给该分类加密加个标注，该项仅后台可见~',\n      ),\n            array(\n            'id'          => 'Cate_Encrypt_Id',\n            'type'        => 'select',\n            'title'       => '要加密的分类选择',\n            'chosen'      => true,\n            'multiple'    => false,\n            'sortable'    => true,\n            'ajax'        => true,\n            'options'     => 'category',\n            'placeholder' => '选择需要加密的分类',\n        ),\n               array(\n            'id'          => 'Cate_Encrypt_Note',\n            'type'        => 'text',\n            'title'       => '该分类加密页面描述',\n            'after' => '您可以给该分类加密页面加个描述，该描述前台访客可见~',\n        ),\n        array(\n            'id'          => 'Cate_Encrypt_Password',\n            'type'        => 'text',\n            'title'       => '该分类加密密码',\n            'after' => '请填写该分类加密的密码，若该项为空，则默认密码为654321',\n        ),\n            ),\n        ),\n        \n        array(\n            'id'          => 'Article_forma',\n            'type'        => 'select',\n            'title'       => '选择首页、分类等页面输出文章的展现样式',\n            'after' => '图文样式优先级：文章封面->附件首图->文章首图->自定义随机图片<font color=red>[当图文样式开启使用自定义随机图片为首选时优先级将改变]</font>，无图片时默认显示预设图片',\n            'options'     => array('1' => '图文样式',  '2' => '纯文字样式'),\n            'default' => '1',\n        ),\n        array(\n            'id'      => 'Article_forma_randchoose',\n            'type'    => 'switcher',\n            'title'       => '图文样式是否使用自定义随机图片为首选',\n            'subtitle' => '若开启本项，自定义随机图片的优先级将上调到最高等级，优先级：自定义随机图片->文章封面->附件首图->文章首图',\n            'default' => false,\n            'dependency' => array( 'Article_forma', 'any', '1,3,5' ),\n        ),\n        array(\n            'id'      => 'Article_forma_randapi',\n            'type'    => 'switcher',\n            'title'       => '图文样式是否使用随机图API',\n            'subtitle' => '若开启本项，则自定义随机图片中仅需填写一个随机图API即可',\n            'default' => false,\n            'dependency' => array( 'Article_forma', 'any', '1,3,5' ),\n        ),\n        array(\n        'id'    => 'Article_forma_pic',\n        'type'  => 'textarea',\n        'title' => '图文样式自定义随机图片',\n        'after' => '请填入图文样式自定义随机图片，多张图片使用|间隔<br>当开启了随机图API选项后，若为随机图API，仅需填写一个即可，或者可以填写多个随机图API地址，也是使用|间隔<br><a style=\"color:red\">提醒：图片地址建议不要带参数之类的，可能会出现无法显示的情况</a>',\n        'dependency' => array( 'Article_forma', 'any', '1,3,5' ),\n      ),\n      \n        array(\n            'id'       => 'articletitlenum',\n            'type'     => 'number',\n            'title'    => '首页、分类等页面输出文章的标题字数',\n            'after' => '<br><br>首页、分类等页面输出文章的标题字数, 填写数字即可',\n            'unit'     => '个字',\n        ),\n        array(\n            'id'       => 'articleexcerptnum',\n            'type'     => 'number',\n            'title'    => '首页、分类等页面输出文章的摘要字数',\n            'after' => '<br><br>填写数字即可,该项仅应用于自动截取摘要,当文章内存在手动填写摘要时该项无效',\n            'unit'     => '个字',\n        ),\n    )\n  ) );\n  $all = Typecho_Plugin::export();\n  if (!array_key_exists('TePass', $all['activated'])){\n      $Tepass_check = '<font color=red>当前Tepass插件未启用~</font>';\n  }\n  else{\n      $Tepass_check = '<font color=green>当前Tepass插件已启用~</font>';\n  }\n  CSF::createSection( $prefix, array(\n    'title'  => '顶部设置',\n    'icon'   => 'fas fa-chevron-up',\n    'fields' => array(\n      array(\n            'id'      => 'DNSYJX',\n            'type'    => 'switcher',\n            'title'       => 'DNS预解析',\n            'default' => false,\n        ),\n        array(\n            'id'     => 'DNSYJX_AR',\n            'type'   => 'repeater',\n            'title'  => 'DNS预解析地址',\n            'after' => '对于某些情况而言开启能够提升访问速度,而禁用的话能节省每月100亿的DNS查询',\n'dependency' => array( 'DNSYJX', '==', 'true' ),\n            'fields' => array(\n                array(\n                    'id'    => 'DNSADDRESS',\n                    'type'  => 'text',\n                    'title' => '预解析地址'\n                ),\n                array(\n            'id'      => 'DNSADDRESS_Preconnect',\n            'type'    => 'switcher',\n            'title'       => '是否启用预连接',\n            'default' => false,\n            ),\n            array(\n            'id'      => 'DNSADDRESS_Crossorign',\n            'type'    => 'switcher',\n            'title'       => '是否启用跨域资源共享（CORS）',\n            'default' => false,\n            'dependency' => array( 'DNSADDRESS_Preconnect', '==', 'true' ),\n            ),\n            ),\n        ),\n        array(\n            'id'       => 'CustomizationCode',\n            'type'     => 'code_editor',\n            'title'    => '顶部自定义代码',\n            'subtitle' => '如百度Meta验证代码，均可以放在这里',\n        ),\n        array(\n            'id'          => 'menu_style',\n            'type'        => 'select',\n            'title'       => '导航栏显示选择',\n            'after' => '选择头部导航栏的显示，默认为显示。',\n            'options'     => array('1' => '显示',  '3' => '不显示'),\n            'default' => '1',\n        ),\n        \n        array(\n            'id'          => 'menu_tem',\n            'type'        => 'select',\n            'title'       => '导航栏样式',\n            'after' => '选择头部导航栏的样式，默认为新样式。',\n            'options'     => array('1' => '旧样式',  '2' => '新样式'),\n            'default' => '2',\n            'dependency' => array( 'menu_style', '==', '1' ),\n        ),\n        array(\n            'id'         => 'menu_NewtemSticky',\n            'type'       => 'switcher',\n            'title'      => '导航栏吸顶',\n            'dependency' => array( 'menu_style|menu_tem', '==|==', '1|2' ),\n        ),\n        array(\n            'id'          => 'menu_NewtemToggle',\n            'type'        => 'select',\n            'title'       => '导航栏展开方向[手机端]',\n            'after' => '选择头部导航栏的展开方向，默认为左边。',\n            'options'     => array('left' => '左边',  'right' => '右边',  'top' => '上边',  'bottom' => '下边'),\n            'default' => '1',\n            'dependency' => array( 'menu_style|menu_tem', '==|==', '1|2' ),\n        ),\n        array(\n            'id'         => 'CategoryMenu',\n            'type'       => 'switcher',\n            'title'      => '导航栏显示下拉分类',\n            'text_on'    => '显示',\n            'text_off'   => '不显示',\n            'text_width' => '100',\n            'dependency' => array( 'menu_style', '==', '1' ),\n        ),\n        array(\n            'id'          => 'PageMenu',\n            'type'        => 'select',\n            'title'       => '导航栏页面输出选择',\n            'after' => '选择集合下拉则将所有自定义页面集合为下拉列表，而横向排列则把所有自定义页面链接直接输出，隐藏则隐藏所有页面',\n            'options'     => array('1' => '集合下拉',  '2' => '横向排列',  '3' => '隐藏'),\n            'default' => '1',\n            'dependency' => array( 'menu_style', '==', '1' ),\n        ),\n        array(\n            'id'     => 'Menu',\n            'type'   => 'repeater',\n            'title'  => '自定义导航',\n            'after' => '自由添加前台自定义导航，且可设置是否登录可见',\n            'dependency' => array( 'menu_style', '==', '1' ),\n            'fields' => array(\n                array(\n                    'id'    => 'Menu_Text',\n                    'type'  => 'link',\n                    'title' => '导航链接及文字'\n                ),array(\n            'id'         => 'Menu_LoginShow',\n            'type'       => 'switcher',\n            'title'      => '是否登录可见',\n        ),\n            \n            ),\n        ),\n        \n        \n        \n    )\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'  => '底部设置',\n    'icon'   => 'fas fa-chevron-down',\n    'fields' => array(\n    array(\n        'id'    => 'IcpBa',\n        'type'  => 'text',\n        'title' => 'ICP备案号',\n        'after' => '请填写您网站的ICP备案号,若无ICP备案请为空',\n      ),\n      array(\n        'id'    => 'PoliceBa',\n        'type'  => 'text',\n        'title' => '公安备案号',\n        'after' => '请填写您网站的公安备案号,若无公安备案请为空',\n      ),\n      array(\n            'id'      => 'allOfCharacters',\n            'type'    => 'switcher',\n            'title'       => '底部显示站点文章总字数',\n            'default' => false,\n        ),\n      array(\n            'id'       => 'CustomizationFooterCode',\n            'type'     => 'code_editor',\n            'title'    => '底部自定义代码',\n            'after' => '可放置网站统计代码等<br><font color=red>谨慎填写，仅需填写代码即可！</font>需注意语法，若语法错误可能会造成前台报错甚至组件动作失效！',\n        ),\n    array(\n            'id'       => 'CustomizationFooterJsCode',\n            'type'     => 'code_editor',\n            'title'    => '底部自定义JS代码',\n            'after' => '可放置自定义JS代码等<br><font color=red>谨慎填写，仅需填写代码即可！</font>需注意JS语法，若语法错误可能会造成前台报错甚至组件动作失效！',\n        ),\n        array(\n            'id'         => 'load_Time',\n            'type'       => 'switcher',\n            'title'      => '显示页面加载时间',\n            'text_on'    => '是',\n            'text_off'   => '否',\n            'text_width' => '100',\n        ),\n        array(\n            'id'         => 'blogsclub_shuttle',\n            'type'       => 'switcher',\n            'title'      => '展现BlogsClub空间穿梭传送门',\n            'text_on'    => '是',\n            'text_off'   => '否',\n            'text_width' => '100',\n            'after' => '<br><br>BlogsClub是BearNotion推出的博客俱乐部项目，每一位博主都可以加入，官方网站:<a href=\"https://www.blogsclub.org/\">戳这里</a><br>您可以开启本项来支持BlogsClub~~~',\n        ),\n    )\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'  => '幻灯片设置',\n    'icon'   => 'fas fa-images',\n    'fields' => array(\n      array(\n            'id'      => 'Slidersss',\n            'type'    => 'switcher',\n            'title'       => '是否开启幻灯片功能',\n            'default' => false,\n        ),\n         array(\n            'id'      => 'SliderIndexs',\n            'type'    => 'switcher',\n            'title'       => '首页开启幻灯片',\n            'default' => false,\n            'subtitle' => '对象：首页',\n            'dependency' => array( 'Slidersss', '==', 'true' ),\n        ),\n         array(\n            'id'      => 'SliderOthers',\n            'type'    => 'switcher',\n            'title'       => '其他位置开启幻灯片',\n            'default' => false,\n            'subtitle' => '   对象:分类、标签、搜索',\n            'dependency' => array( 'Slidersss', '==', 'true' ),\n        ),\n      array(\n            'id'     => 'slider__content',\n            'type'   => 'group',\n            'title'  => '幻灯片',\n            'after' => '添加幻灯片需注意幻灯片图片务必为直链。',\n'dependency' => array( 'Slidersss', '==', 'true' ),\n            'fields' => array(\n                array(\n                    'id'    => 'slider__note',\n                    'type'  => 'text',\n                    'title' => '幻灯片备注',\n                    'after'=>'可以备注下该幻灯片，仅后台可见'\n                ),\n                array(\n            'id'      => 'slider__pic',\n            'title'   => '幻灯片图片',\n            'after' => '图片链接务必为直链',\n            'type'    => 'upload',\n        ),\n                \n                array(\n                    'id'    => 'slider__url',\n                    'type'  => 'text',\n                    'title' => '幻灯片跳转链接',\n                    'after'=>'链接务必带http(s)://'\n                ),\n                array(\n                    'id'    => 'slider__title',\n                    'type'  => 'text',\n                    'title' => '幻灯片标题',\n                    'after' => '留空则不显示该幻灯片的标题'\n                ),\n                array(\n                    'id'    => 'slider__desc',\n                    'type'  => 'text',\n                    'title' => '幻灯片描述',\n                    'after' => '留空则不显示该幻灯片的描述'\n                ),\n                array(\n            'id'      => 'slider__window',\n            'type'    => 'switcher',\n            'title'       => '新窗口打开',\n            'default' => false,\n        ),\n            ),\n        ),\n    )\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'  => '公告栏设置',\n    'icon'   => 'fas fa-bullhorn',\n    'fields' => array(\n      array(\n            'id'      => 'Popup',\n            'type'    => 'switcher',\n            'title'       => '是否开启网站公告栏',\n            'subtitle' => '若开启公告栏，则网站左下角会出现公告栏，可填写要向访客展示的公告。',\n            'default' => false,\n        ),\n        array(\n        'id'    => 'PopupTitle',\n        'type'  => 'text',\n        'title' => '公告栏标题',\n        'after' => '请填写公告栏标题，它将显示在公告栏顶部，不填写则不显示',\n        'dependency' => array( 'Popup', '==', 'true' ),\n      ),\n       array(\n        'id'    => 'PopupKey',\n        'type'  => 'text',\n        'title' => '公告栏更新识别码',\n        'after' => '请填写公告栏更新识别码，默认为announcement<br>作用是当访客设置多久不显示公告时，只要更新识别码，公告就会再显示。\n        <br>可以作为公告更新后提醒访客使用，注意每次识别码的填写都需要与前面所填写的值不同，建议为字母+数字~',\n        'default'=> 'announcement',\n        'dependency' => array( 'Popup', '==', 'true' ),\n      ),\n      array(\n            'id'     => 'Popup_Value',\n            'type'   => 'repeater',\n            'title'  => '创建公告',\n            'after' => '可添加多条公告，分别填写公告标题和内容，公告内容支持HTML',\n'dependency' => array( 'Popup', '==', 'true' ),\n            'fields' => array(\n                array(\n                    'id'    => 'Popup_Title_Value',\n                    'type'  => 'text',\n                    'title' => '公告栏标题'\n                ),\n                array(\n                    'id'    => 'Popup_Content_Value',\n                    'type'  => 'textarea',\n                    'title' => '公告栏内容'\n                ),\n            \n            ),\n        ),\n        \n     \n    )\n  ) );\nif(isset($Tyoptions->cronKey)){\n$cronUrl = 'php '.__DIR__.'/core/widget/cron.php '.$Tyoptions->cronKey;\n}\nelse{\n    $cronUrl = '未初始化自动检查密钥，请刷新后重新查看';\n}\n$lastestCron = $db->fetchRow($db->select()->from('table.bscore_cron_data')->where('type =? ', 'checkLinks')->order('id',Typecho\\Db::SORT_DESC));\nif($lastestCron['checksuccess'] !== null){\n$lastestCron_Time = '<div><font color=green>自动检查任务运行正常</font>（上一次自动检查执行时间：'.date('Y年m月d日 H:i:s',$lastestCron['checktime']).'）</div>';\n}\nelse{\n$lastestCron_Time = '<div><font color=red>自动检查任务运行异常</font>（上一次自动检查执行时间：'.date('Y年m月d日 H:i:s',$lastestCron['checktime']).'）</div>';    \n}\n$lastestCron_Success = $lastestCron['checksuccess'];\n$lastestCron_Failed = $lastestCron['checkfailed'];\n$lastestCron_Total = $lastestCron['checktotal'];\n  CSF::createSection( $prefix, array(\n    'title'  => '友链设置',\n    'icon'   => 'fas fa-link',\n    'fields' => array(\n      array(\n            'id'      => 'FriendLinkChoose',\n            'type'    => 'switcher',\n            'title'       => '是否开启右侧友情链接栏',\n            'subtitle' => '若选择开启，则站点右侧增加友情链接栏',\n            'default' => false,\n        ),\n         array(\n        'id'    => 'FriendLink',\n        'type'  => 'textarea',\n        'title' => '友链内容',\n        'after' => '请填入友链内容,格式：友链名称|友链简介|友链地址，多个直接换行',\n        'dependency' => array( 'FriendLinkChoose', '==', 'true' ),\n      ),\n      array(\n            'id'          => 'FriendLink_place',\n            'type'        => 'select',\n            'title'       => '右侧友情链接显示场景',\n            'after' => '针对SEO优化考虑，这里可自主选择右侧友情链接显示场景',\n            'options'     => array('1' => '全局显示',  '2' => '仅首页显示'),\n            'default' => '1',\n            'dependency' => array( 'FriendLinkChoose', '==', 'true' ),\n        ),\n      array(\n            'id'      => 'FriendLinkFoot',\n            'type'    => 'switcher',\n            'title'       => '是否将右侧友情链接放置到底部',\n            'subtitle' => '若选择开启，则站点右侧友情链接将放置到站点底部，同时右侧友情链接栏则会被移除',\n            'default' => false,\n            'dependency' => array( 'FriendLinkChoose', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'FriendLinkSubmit',\n            'type'    => 'switcher',\n            'title'       => '是否允许在独立友链页面自助提交友链',\n            'after' => '<br><br>若为是，则独立友链页面将支持访客自助提交友链(仅当自定义模板选择友链[新]时本项有效)',\n            'default' => true,\n        ),\n        array(\n            'id'      => 'FriendLinkLogomust',\n            'type'    => 'switcher',\n            'title'       => '自助提交友链LOGO图标是否必填',\n            'after' => '<br><br>若为否，则独立友链页面提交友链时友链LOGO图标为非必填，并可以自定义设置一个默认LOGO图标(仅当自定义模板选择友链[新]时本项有效)',\n            'default' => true,\n            'text_on'    => '是',\n            'text_off'   => '否',\n        ),\n        array(\n        'id'    => 'FriendLinkLogoDefault',\n        'type'  => 'upload',\n        'title' => '友链默认LOGO图标',\n        'after' => '若设置友链LOGO图标为非必填，则可在本项填写默认LOGO图标地址或上传默认LOGO图标',\n        'dependency' => array( 'FriendLinkLogomust', '==', 'false' ),\n      ),\n         array(\n            'id'      => 'FriendLinkEmailmust',\n            'type'    => 'switcher',\n            'title'       => '自助提交友链联系邮箱是否必填',\n            'after' => '<br><br>若为是，则独立友链页面提交友链时需要提交者填写邮箱(仅当自定义模板选择友链[新]时本项有效)',\n            'default' => false,\n            'text_on'    => '是',\n            'text_off'   => '否',\n        ),\n      array(\n            'id'      => 'FriendLinkSubmitSendMail',\n            'type'    => 'switcher',\n            'title'       => '友链提交后是否发送邮件给博主',\n            'after' => '<br><br>若为是，则在前台提交友链申请后系统将自动发送一封邮件给博主提醒进行审核(仅当自定义模板选择友链[新]本项有效，并需要您在SMTP设置中开启SMTP服务并配置SMTP信息)',\n            'default' => false,\n            'text_on'    => '是',\n            'text_off'   => '否',\n        ),\n        array(\n            'id'      => 'FriendLinkAcceptSendMail',\n            'type'    => 'switcher',\n            'title'       => '友链审核后是否发送邮件给提交者',\n            'after' => '<br><br>若为是，则当博主审核友链后将发送审核通过或者审核不通过的邮件给提交者(仅当自定义模板选择友链[新]且提交者邮件地址存在时本项有效，并需要您在SMTP设置中开启SMTP服务并配置SMTP信息)',\n            'default' => false,\n            'text_on'    => '是',\n            'text_off'   => '否',\n        ),\n        array(\n            'id'          => 'FriendLinkSkin',\n            'type'        => 'select',\n            'title'       => '友链样式',\n            'after' => '选择友链样式，分为默认和简约',\n            'options'     => array('0' => '默认',  '1' => '简约',  '2' => '传统',  '3' => '新版'),\n            'default' => '0',\n        ),\n        array(\n            'id'      => 'FriendLinkRejectShow',\n            'type'    => 'switcher',\n            'title'       => '失效友链展示',\n            'after' => '<br><br>若为是，则独立友链页面将新增失效友链列表(即已驳回的友链列表)',\n            'default' => false,\n            'text_on'    => '是',\n            'text_off'   => '否',\n        ),\n        array(\n            'id'      => 'FriendLinkRejectShowAll',\n            'type'    => 'switcher',\n            'title'       => '展示所有失效友链',\n            'after' => '<br><br>若为是，则展示所有失效友链，若为否则仅展示已填写驳回原因的失效友链',\n            'default' => false,\n            'text_on'    => '是',\n            'text_off'   => '否',\n            'dependency' => array( 'FriendLinkRejectShow', '==', 'true' ),\n        ),\n        array(\n        'id'    => 'FriendLinkRejectNote',\n        'type'  => 'textarea',\n        'title' => '失效友链说明',\n        'after' => '请填入失效友链说明，将显示在失效友链列表上方',\n        'dependency' => array( 'FriendLinkRejectShow', '==', 'true' ),\n      ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>说明</strong><br> 以下友链操作针对独立友链页面。',\n        ),\n        array(\n            'type'    => 'content',\n            'content' => '<a id=\"createlink\" class=\"button button-primary csf--button add\">新增友链</a>',\n        ),\n        \narray(\n                'id'    => 'friendtab',\n                'type'  => 'tabbed',\n                'title' => '',\n                'tabs'  => array(\n\n                    array(\n                        'title'  => '待审核',\n                        'fields' => array(\n                            array(\n                    'type' =>'content',\n                    'content' => '\n                   <table class=\"ui celled table\">\n  <thead>\n    <tr>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链名称</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链网址</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链图标</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链简介</font></font></th>\n            <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">联系邮箱</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">状态</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">操作</font></font></th>\n    </tr>\n  </thead>\n  <tbody id=\"waitingfl\" style=\"word-break:break-word\">\n  \n  </tbody>\n</table>\n<div class=\"waitingpagelist\"></div>',\n                ),\n                            \n                        ),\n                    ),\n\n                    array(\n                        'title'  => '已通过',\n                        'fields' => array(\n                            array(\n                    'type' =>'content',\n                    'content' => '\n\n                   <table class=\"ui celled table\">\n  <thead>\n    <tr>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链名称</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链网址</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链图标</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链简介</font></font></th>\n                  <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">联系邮箱</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">状态</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">操作</font></font></th>\n    </tr>\n  </thead>\n  <tbody id=\"approvedfl\" style=\"word-break:break-word\">\n  </tbody>\n</table>\n<div class=\"approvedpagelist\"></div>',\n                ),\n                        ),\n                    ),\narray(\n                        'title'  => '已驳回',\n                        'fields' => array(\n                            array(\n                    'type' =>'content',\n                    'content' => '\n\n                   <table class=\"ui celled table\">\n  <thead>\n    <tr>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链名称</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链网址</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链图标</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链简介</font></font></th>\n    <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">联系邮箱</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">状态</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">操作</font></font></th>\n    </tr>\n  </thead>\n  <tbody id=\"rejectfl\" style=\"word-break:break-word\">\n  </tbody>\n</table>\n<div class=\"rejectpagelist\"></div>',\n                ),\n                    ),\n\n                ),\n                \n                array(\n                    'title'  => '查询',\n                        'fields' => array(\n                            array(\n                    'type' =>'content',\n                    'content' => '\n<div><input type=\"text\" id=\"linksearch\" placeholder=\"请输入关键词进行搜索\" autocomplete=\"off\" /></div>\n\n                   <table class=\"ui celled table\">\n  <thead>\n    <tr>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链名称</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链网址</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链图标</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">友链简介</font></font></th>\n    <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">联系邮箱</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">状态</font></font></th>\n      <th><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">操作</font></font></th>\n    </tr>\n  </thead>\n  <tbody id=\"search\" style=\"word-break:break-word\">\n  </tbody>\n</table>\n<div class=\"searchpagelist\">\n            </div>\n',\n                ),\n                    ),\n\n                ),\n              \n              \n              \n              array(\n                        'title'  => '自动检查',\n                        'fields' => array(\n                            \n                            array(\n            'type'    => 'heading',\n            'content' => '自动检查设置',\n        \n        ),\n        \n        array(\n            'type'    => 'subheading',\n            'content' => '自动检查仅检查友链放置页面网址项不为空的友链，该项为空的友链默认不检查。<br><div class=\"ui red label\" style=\"cursor:pointer\" id=\"rebuildCron\">重建计划任务表</div>',\n        ),\n                            array(\n            'id'      => 'checkFailedAction',\n            'type'    => 'switcher',\n            'title'       => '已通过的友链若自动检查失败是否移动至已驳回',\n            'default' => true,\n        ),\n        array(\n        'id'    => 'checkFailedActionText',\n        'type'  => 'text',\n        'title' => '驳回理由',\n        'after' => '请填入驳回理由，若为空则默认理由为：友链检查未通过自动移动至失效友链列表',\n        'dependency' => array( 'checkFailedAction', '==', 'true' ),\n      ),\n      array(\n            'id'      => 'checkSuccessAction',\n            'type'    => 'switcher',\n            'title'       => '已驳回的友链若自动检查通过是否移动至已通过',\n            'default' => true,\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => '自动检查结果',\n        ),\n                            array(\n                    'type' =>'content',\n                    'content' => '\n<h3>自动检查依赖crontab计划任务<br>请在您的服务器上运行计划任务</h3>\n<h4><font color=red>检查需要耗费服务器资源，且可能因为友链的数量增多而影响检查的速度，建议执行时间为每天一次即可。<br>需注意：无法自动检查如Vue、React等需浏览器配合加载的站点，这些站点可能需要手动进行检查</font><br><br>添加计划任务以宝塔面板为例：在宝塔-计划任务中添加类型为Shell脚本的计划任务，脚本内容将以下命令复制粘贴进去，然后根据实际设置执行周期即可（添加完毕后建议先执行一次任务）</h4>\n\n<style>\n.common_input{\npadding:10px;\n    border:1px solid gray;\n    border-radius:10px;\n    width:100%;\n}\n</style>\n<input value=\"'.$cronUrl.'\" class=\"common_input\" readonly>\n<br><br>\n'.$lastestCron_Time.'\n<div>上一次共检查了 <font color=red>'.$lastestCron_Total.'</font> 条符合条件的友链，从已通过列表移入已驳回列表共 <font color=red>'.$lastestCron_Failed.'</font> 条，从已驳回列表移入已通过列表共 <font color=red>'.$lastestCron_Success.'</font> 条</div>\n                 ',\n                ),\n                    ),\n\n                ),\n                \n                \n                \n                \n                ),\n            ),\n        \n    )\n  ) );\n \n  $lazy_styles = array(\n      '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'\n      );\n  CSF::createSection( $prefix, array(\n    'title'  => '加载设置',\n    'icon'   => 'fas fa-spinner',\n    'fields' => array(\n      array(\n            'id'      => 'Pjax',\n            'type'    => 'switcher',\n            'title'       => 'Pjax',\n            'subtitle' => '若选择开启,则将同步启用Pjax加载效果',\n            'default' => false,\n        ),\n        array(\n            'id'       => 'CustomizationFooterJsPjaxCode',\n            'type'     => 'code_editor',\n            'title'    => '自定义Pjax回调代码',\n            'after' => '<font color=red>谨慎填写，仅需填写代码即可！</font>需注意JS语法，若语法错误可能会造成前台报错甚至组件动作失效！',\n            'dependency' => array( 'Pjax', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'Lazyload',\n            'type'    => 'switcher',\n            'title'       => '图片懒加载',\n            'subtitle' => '开启后站点前台全局图片将以懒加载的形式展现，可设置选择懒加载过程中显示的加载图标[设置的加载图标仅作用于文章页面，其他页面的懒加载形式以渐进式效果展现]',\n            'default' => false,\n        ),\n        array(\n            'id'          => 'Lazyload_style',\n            'type'        => 'select',\n            'title'       => '选择图片加载效果',\n            'after' => '图片加载效果指的是图片在加载时展现出来的动效，可以<a target=\"_blank\" href=\"http://b3.typecho.ru/usr/themes/bearsimple/assets/images/loaders/\">戳这里进行预览所有效果</a>。',\n            'options'     => $lazy_styles,\n            'default' => 'none',\n            'dependency' => array( 'Lazyload', '==', '1' ),\n        ), \n      array(\n            'id'      => 'Compress',\n            'type'    => 'switcher',\n            'title'       => 'HTML压缩',\n            'subtitle' => '开启后同步开启最大限度的GZIP压缩，能够加快网站访问',\n            'default' => false,\n        ),\n        array(\n            'id'      => 'Lightbox',\n            'type'    => 'switcher',\n            'title'       => '图片灯箱',\n            'subtitle' => '使用图片灯箱效果听说有BUFF加成~',\n            'default' => false,\n        ),\n        array(\n            'id'      => 'CommentTyping',\n            'type'    => 'switcher',\n            'title'       => '打字效果',\n            'subtitle' => '开启后在前台评论区打字就会出现小球浮现效果',\n            'default' => false,\n        ),\n    )\n  ) );\n  $mail_html = '';\n       $mail_api = Common::url('/action/' . BsCore_Plugin::$action, Options::alloc()->index).'?do=testMail';\n\n        $mail_html .= '<a id=\"testmail\" class=\"button button-primary csf--button\">邮件发送测试</a>\n        <link href=\"'.Helper::options()->themeUrl.'/assets/vendors/toastr.js/toastr.min.css\" rel=\"stylesheet\">\n\t<script src=\"'.Helper::options()->themeUrl.'/assets/vendors/toastr.js/toastr.min.js\"></script>\n        <script>\n        document.getElementById(\"testmail\").onclick = function(){\n        $.post(\"'.$mail_api.'\",function(data,status){\n        try {\n    json = JSON.parse(data);\nswitch(json.code)\n{\ncase \"1\":\ntoastr.success(json.message);\nbreak;\ncase \"0\":\ntoastr.warning(json.message);\nbreak;\n}\n  } catch (e) {\n  var div = $(\"<div>\");\n        div.html(data);\n        var content = div.find(\".container\");\n    toastr.error(\"抱歉，测试邮件发送请求错误，返回错误:\"+content.text());\n  }\n        \n}).error(function (xhr, status, info) {\nvar div = $(\"<div>\");\n        div.html(xhr.responseText);\n        var content = div.find(\".container\");\ntoastr.error(\"抱歉，测试邮件发送请求错误，返回错误:\"+content.text());\n});;\n        };\n        </script>\n        \n        ';\n  \n  CSF::createSection( $prefix, array(\n    'title'  => '行为验证',\n    'icon'   => 'fas fa-shield-alt',\n    'fields' => array(\n      array(\n            'id'          => 'VerifyChoose',\n            'type'        => 'select',\n            'title'       => '选择行为验证方式',\n            'after' => '<font color=red>Cloudflare Turnstile在国内可能会频繁出现验证失败的问题，谨慎选择！</font><br><font color=red>Geetest验证使用的是Geetest 行为验第四代</font><br>若选择关闭,则评论等关键区域将仅保留最基础的Token验证',\n            'options'     => array('1' => '开启普通算数加法验证', '11' => '开启普通算数减法验证', '2' => '开启Vaptcha验证','2-1' => '开启顶象验证','2-2' => '开启Cloudflare Turnstile验证','2-3' => '开启极验Geetest验证', '22' => '开启拼图滑块验证', '22-2' => '开启自定义问答验证','3' => '关闭行为验证'),\n            'default' => '1',\n        ), \n        array(\n            'id'     => 'VerifyQuestion',\n            'type'   => 'group',\n            'title'  => '验证问答',\n            'after' => '开启验证问答后请务必设定一个或一个以上的问题。',\n'dependency' => array( 'VerifyChoose', '==', '22-2' ),\n            'fields' => array(\n                array(\n                    'id'    => 'VerifyQuestion_key',\n                    'type'  => 'text',\n                    'title' => '验证问题',\n                    'after'=>'请输入问题，问题字数不要太多，言简意赅即可'\n                ),\n                array(\n                    'id'    => 'VerifyQuestion_answer',\n                    'type'  => 'text',\n                    'title' => '验证问题答案',\n                    'after'=>'请输入该问题的答案'\n                ),\n                array(\n            'id'      => 'VerifyQuestion_showtip',\n            'type'    => 'switcher',\n            'title'       => '是否启用答案提示',\n            'subtitle' => '开启后前台验证问答下方不显示验证问题答案，仅显示验证问题的提示',\n            'default' => false,\n            \n        ),\n                array(\n                    'id'    => 'VerifyQuestion_showtiptext',\n                    'type'  => 'text',\n                    'title' => '验证问题提示',\n                    'after'=>'请输入该问题的答案提示',\n                    'dependency' => array( 'VerifyQuestion_showtip', '==', 'true' ),\n                ),\n            ),\n        ),\n      array(\n            'id'       => 'Verify22_Buttontext',\n            'type'     => 'text',\n            'title'    => '拼图滑块验证按钮文字',\n            'after' => '请输入拼图滑块验证按钮文字，如人机验证',\n            'default'     => '人机验证',\n            'dependency' => array( 'VerifyChoose', '==', '22' ),\n        ),\n        array(\n            'id'       => 'Verify22_Paneltitle',\n            'type'     => 'text',\n            'title'    => '拼图滑块验证面板标题',\n            'after' => '请输入拼图滑块验证面板标题，如人机验证',\n            'default'     => '人机验证',\n            'dependency' => array( 'VerifyChoose', '==', '22' ),\n        ),\n        array(\n            'id'       => 'Verify22_Paneldec',\n            'type'     => 'text',\n            'title'    => '拼图滑块验证面板操作提示文字',\n            'after' => '请输入拼图滑块验证面板操作提示文字，如滑动滑块，使图片显示角度为正',\n            'default'     => '使图片显示角度为正',\n            'dependency' => array( 'VerifyChoose', '==', '22' ),\n        ),\n        array(\n            'id'       => 'Verify22_Panelimg',\n            'type'     => 'textarea',\n            'title'    => '拼图滑块验证使用的图片',\n            'after' => '请输入拼图滑块验证使用的图片直链,使用英文逗号分隔，如xxx.jpg,abc.png',\n            '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',\n            'dependency' => array( 'VerifyChoose', '==', '22' ),\n        ),\n        //Vaptcha\n        array(\n            'id'       => 'vid',\n            'type'     => 'text',\n            'title'    => 'VID',\n            'after' => '验证单元vid',\n            'dependency' => array( 'VerifyChoose', '==', '2' ),\n        ),\n        array(\n            'id'       => 'vkey',\n            'type'     => 'text',\n            'title'    => 'VKEY',\n            'after' => '验证单元key',\n            'dependency' => array( 'VerifyChoose', '==', '2' ),\n        ),\n        array(\n            'id'      => 'backendVerify_Vaptcha',\n            'type'    => 'switcher',\n            'title'       => '是否启用服务端二次验证',\n            'after' => '<br><br>若启用则在评论者完成验证并提交评论后，系统自动将验证成功的Token与Vaptcha进行服务端二次验证，进一步加强安全性，但因为网络因素影响，可能会导致评论提交等待时间增加。',\n            'default' => false,\n            'dependency' => array( 'VerifyChoose', '==', '2' ),\n        ),\n        //顶象\n        array(\n            'id'       => 'dx_domain',\n            'type'     => 'text',\n            'title'    => '顶象API域名',\n            'after' => '在顶象后台->应用管理页面顶部，apiServer即API域名。',\n            'dependency' => array( 'VerifyChoose', '==', '2-1' ),\n        ),\n        array(\n            'id'       => 'dx_appId',\n            'type'     => 'text',\n            'title'    => '顶象appId',\n            'after' => '在顶象后台->应用管理页面可看到接入应用的appId',\n            'dependency' => array( 'VerifyChoose', '==', '2-1' ),\n        ),\n        array(\n            'id'       => 'dx_appSecret',\n            'type'     => 'text',\n            'title'    => '顶象appSecret',\n            'after' => '在顶象后台->应用管理页面可看到接入应用的appSecret',\n            'dependency' => array( 'VerifyChoose', '==', '2-1' ),\n        ),\n        array(\n            'id'      => 'backendVerify_Dingxiang',\n            'type'    => 'switcher',\n            'title'       => '是否启用服务端二次验证',\n            'after' => '<br><br>若启用则在评论者完成验证并提交评论后，系统自动将验证成功的Token与顶象进行服务端二次验证，进一步加强安全性，但因为网络因素影响，可能会导致评论提交等待时间增加。',\n            'default' => false,\n            'dependency' => array( 'VerifyChoose', '==', '2-1' ),\n        ),\n\n        //Turnstile\n        array(\n            'id'       => 'turnstile_key',\n            'type'     => 'text',\n            'title'    => 'Turnstile siteKey',\n            'after' => '请先注册<a href=\"https://dash.cloudflare.com/sign-up\" target=\"_blank\">Cloudflare</a>以获取Cloudflare Turnstile siteKey',\n            'dependency' => array( 'VerifyChoose', '==', '2-2' ),\n        ),\n        array(\n            'id'       => 'turnstile_secretkey',\n            'type'     => 'text',\n            'title'    => 'Turnstile secretKey',\n            'after' => '请先注册<a href=\"https://dash.cloudflare.com/sign-up\" target=\"_blank\">Cloudflare</a>以获取Cloudflare Turnstile secretKey',\n            'dependency' => array( 'VerifyChoose', '==', '2-2' ),\n        ),\n        array(\n            'id'          => 'turnstile_theme',\n            'type'        => 'select',\n            'title'       => 'Turnstile主题',\n            'after' => '设置Turnstile主题，默认为浅色',\n            'options'     => array('light' => '浅色', 'dark' => '深色', 'auto' => '自动'),\n            'default' => 'light',\n            'dependency' => array( 'VerifyChoose', '==', '2-2' ),\n        ), \n        array(\n            'id'          => 'turnstile_style',\n            'type'        => 'select',\n            'title'       => 'Turnstile布局样式',\n            'after' => '设置Turnstile布局样式，默认为常规型',\n            'options'     => array('normal' => '常规型', 'compact' => '紧凑型'),\n            'default' => 'normal',\n            'dependency' => array( 'VerifyChoose', '==', '2-2' ),\n        ), \n        array(\n            'id'      => 'backendVerify_Turnstile',\n            'type'    => 'switcher',\n            'title'       => '是否启用服务端二次验证',\n            'after' => '<br><br>若启用则在评论者完成验证并提交评论后，系统自动将验证成功的Token与Turnstile进行服务端二次验证，进一步加强安全性，但因为网络因素影响，可能会导致评论提交等待时间增加。',\n            'default' => false,\n            'dependency' => array( 'VerifyChoose', '==', '2-2' ),\n        ),\n         //Geetest\n        array(\n            'id'       => 'geeid',\n            'type'     => 'text',\n            'title'    => 'Geetest验证ID',\n            'after' => 'Geetest验证ID',\n            'dependency' => array( 'VerifyChoose', '==', '2-3' ),\n        ),\n        array(\n            'id'       => 'geekey',\n            'type'     => 'text',\n            'title'    => 'Geetest验证KEY',\n            'after' => 'Geetest验证KEY',\n            'dependency' => array( 'VerifyChoose', '==', '2-3' ),\n        ),\n        array(\n            'id'      => 'backendVerify_Geetest',\n            'type'    => 'switcher',\n            'title'       => '是否启用服务端二次验证',\n            'after' => '<br><br>若启用则在评论者完成验证并提交评论后，系统自动将验证成功的Token与Geetest进行服务端二次验证，进一步加强安全性，但因为网络因素影响，可能会导致评论提交等待时间增加。',\n            'default' => false,\n            'dependency' => array( 'VerifyChoose', '==', '2-3' ),\n        ),\n        /**\n        array(\n            'id'          => 'geestyle',\n            'type'        => 'radio',\n            'title'       => 'Geetest验证方案',\n            'inline'  => true,\n            'after' => '设置Geetest验证方案，默认为滑动验证',\n            'options'     => array('1' => '滑动验证', '2' => '多次验证', '3' => '一键通过验证', '4' => '九宫格验证', '5' => '五子棋验证', '6' => '消消乐验证', '7' => '文字点选验证', '8' => '图标验证'),\n            'default' => '1',\n            'dependency' => array( 'VerifyChoose', '==', '2-3' ),\n        ), \n       */\n    )\n  ) );\n        \n        CSF::createSection( $prefix, array(\n    'title'  => '存储设置',\n    'icon'   => 'fas fa-database',\n    'fields' => array(\n        array(\n            'id'          => 'bucket_choose',\n            'type'        => 'select',\n            'title'       => '文件存储方式',\n            'after' => '选择您所上传文件的存储方式，默认为本地存储',\n            'options'     => array('1' => '本地存储',  '2' => '腾讯云COS',  '3' => '阿里云OSS',  '4' => '七牛云Kodo',  '5' => '又拍云USS',  '6' => '百度云BOS', '7' => '华为云OBS', '8' => 'LskyPro'),\n            'default' => '1',\n        ), \n        //LskyPro\n         array(\n            'type'    => 'submessage',\n            'style'   => 'warning',\n            'content' => '<font color=red>该存储方式仅作用于图片类型(支持gif,jpg,jpeg,png,tiff,bmp,ico,psd,webp)，其他类型会自动变成本地上传！！</font><br>仅在 LskyPro v2.1 开源版本中测试通过，其他版本需自行测试',\n            'dependency' => array( 'bucket_choose', '==', '8' )\n        ),\n        array(\n            'id'          => 'lskypro_api',\n            'type'        => 'text',\n            'title'       => 'LskyPro Api地址',\n            'after' => '必填* 只需填写域名且包含 http(s)://，无需 / 结尾，如https://xxx.com<br><font color=red>Token需填写此项并保存后才可获取！</font>',\n            'dependency' => array( 'bucket_choose', '==', '8' ),\n        ), \n        array(\n            'id'          => 'lskypro_token',\n            'type'        => 'text',\n            'title'       => 'LskyPro Token',\n            'after' => '必填* 因v2.1版本无法直接获取到Token，可 <div id=\"getLskyToken\" style=\"color:red;cursor:pointer;\">点击此处获取Token</div>',\n            'dependency' => array( 'bucket_choose', '==', '8' ),\n        ), \n        array(\n            'id'          => 'lskypro_id',\n            'type'        => 'text',\n            'title'       => 'LskyPro 储存策略ID',\n            'after' => '非必填* 若本项为空则为默认策略',\n            'dependency' => array( 'bucket_choose', '==', '8' ),\n        ), \n        //腾讯云\n        array(\n            'id'          => 'bucket_secret_id',\n            'type'        => 'text',\n            'title'       => '腾讯云SecretId',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://console.cloud.tencent.com/capi\">腾讯云控制台-个人API密钥</a> 获取您的SecretId',\n            'dependency' => array( 'bucket_choose', '==', '2' ),\n        ), \n        array(\n            'id'          => 'bucket_secret_key',\n            'type'        => 'text',\n            'title'       => '腾讯云SecretKey',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://console.cloud.tencent.com/capi\">腾讯云控制台-个人API密钥</a> 获取您的SecretKey',\n            'dependency' => array( 'bucket_choose', '==', '2' ),\n        ), \n        array(\n            'id'          => 'bucket_region',\n            'type'        => 'select',\n            'title'       => 'COS所属地域',\n            'after' => '必选* 选择您的腾讯云COS所属地域，请务必选择正确',\n            'options'     => array(\n          'ap-beijing' => _t('北京'),\n          'ap-beijing-1' => _t('北京一区'),\n          'ap-guangzhou' => _t('广州'),\n          'ap-nanjing' => _t('南京'),\n          'ap-shanghai' => _t('上海'),\n          'ap-chengdu' => _t('成都'),\n          'ap-chongqing' => _t('重庆'),\n          'ap-shenzhen-fsi' => _t('深圳金融'),\n          'ap-shanghai-fsi' => _t('上海金融'),\n          'ap-beijing-fsi' => _t('北京金融'),\n          'ap-hongkong' => _t('香港'),\n          'ap-singapore' => _t('新加坡'),\n          'ap-mumbai' => _t('孟买'),\n          'ap-jakarta' => _t('雅加达'),\n          'ap-seoul' => _t('首尔'),\n          'ap-bangkok' => _t('曼谷'),\n          'ap-tokyo' => _t('东京'),\n          'na-toronto' => _t('多伦多'),\n          'na-siliconvalley' => _t('硅谷'),\n          'na-ashburn' => _t('弗吉尼亚'),\n          'na-toronto' => _t('多伦多'),\n          'sa-saopaulo' => _t('圣保罗'),\n          'eu-frankfurt' => _t('法兰克福'),\n          'eu-moscow' => _t('莫斯科'),\n        ),\n            'dependency' => array( 'bucket_choose', '==', '2' ),\n        ), \n        array(\n            'id'          => 'bucket_name',\n            'type'        => 'text',\n            'title'       => '腾讯云COS存储桶名称',\n            'after' => '必填* 格式为 xxxxx-xxxxxx  请前往<a target=\"_blank\" href=\"https://console.cloud.tencent.com/cos/bucket\">腾讯云COS页面</a> 获取，<font color=red>请务必设置为公有读私有写!</font>',\n            'dependency' => array( 'bucket_choose', '==', '2' ),\n        ), \n         array(\n            'id'          => 'bucket_path',\n            'type'        => 'text',\n            'title'       => '腾讯云COS存储路径',\n            'after' => '必填* 默认为 uploads/，若非必要可不修改，路径最前面不加/',\n            'default' =>'uploads/',\n            'dependency' => array( 'bucket_choose', '==', '2' ),\n        ), \n        array(\n            'id'          => 'bucket_domain',\n            'type'        => 'text',\n            'title'       => '腾讯云COS访问域名',\n            'after' => '留空则为腾讯云默认域名，如：https://xxxxx.cos.ap-beijing.myqcloud.com<br>若填写的为自定义CDN域名，请参考<a target=\"_blank\" href=\"https://cloud.tencent.com/document/product/436/36637\">文档</a><br>若填写的为自定义源站域名，请参考<a target=\"_blank\" href=\"https://cloud.tencent.com/document/product/436/36638\">文档</a><br><font color=\"red\">要注意的一点是若填写的为自定义CDN域名或自定义源站域名，域名需以 https:// 或 https:// 开头</font>',\n            'dependency' => array( 'bucket_choose', '==', '2' ),\n        ), \n        array(\n            'id'      => 'bucket_sync',\n            'type'    => 'switcher',\n            'title'       => '本地云端同步删除',\n            'subtitle' => '在文件管理删除文件时，是否同步删除COS上的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '2' ),\n        ),\n        array(\n            'id'      => 'bucket_localsave',\n            'type'    => 'switcher',\n            'title'       => '双重储存',\n            'subtitle' => '在本地保存一份文件副本，这样的话会占用本地存储空间',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '2' ),\n        ),\n        array(\n            'id'      => 'bucket_localdelete',\n            'type'    => 'switcher',\n            'title'       => '删除时同步删除本地备份',\n            'subtitle' => '在文件管理删除文件时，是否同步删除本地备份的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose|bucket_localsave', '==|==', '2|true' ),\n        ),\n         array(\n            'id'          => 'bucket_other',\n            'type'        => 'text',\n            'title'       => '对象链接附带后缀',\n            'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户，若不需要请留空<br>填写示例: ?v=1&type=webp',\n            'dependency' => array( 'bucket_choose', '==', '2' ),\n        ), \n        //阿里云\n        array(\n            'id'          => 'ali_bucket_accesskey_id',\n            'type'        => 'text',\n            'title'       => '阿里云ACCESSKEY ID',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://ram.console.aliyun.com/manage/ak\">阿里云控制台-RAM访问控制</a> 获取您的ACCESSKEY ID',\n            'dependency' => array( 'bucket_choose', '==', '3' ),\n        ), \n        array(\n            'id'          => 'ali_bucket_accesskey_secret',\n            'type'        => 'text',\n            'title'       => '阿里云ACCESSKEY SECRET',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://ram.console.aliyun.com/manage/ak\">阿里云控制台-RAM访问控制</a> 获取您的ACCESSKEY SECRET',\n            'dependency' => array( 'bucket_choose', '==', '3' ),\n        ), \n        array(\n            'id'          => 'ali_bucket_region',\n            'type'        => 'select',\n            'title'       => 'OSS所属地域',\n            'after' => '必选* 选择您的阿里云OSS所属地域，请务必选择正确',\n            'options'     => array(\n                \"oss-cn-hangzhou\"   =>  \"华东1-杭州\",\n                \"oss-cn-shanghai\"   =>  \"华东2-上海\",\n                \"oss-cn-nanjing\"   =>  \"华东5-南京（本地地域）\",\n                \"oss-cn-fuzhou\"   =>  \"华东6-福州（本地地域）\",\n                \"oss-cn-qingdao\"    =>  \"华北1-青岛\",\n                \"oss-cn-beijing\"    =>  \"华北2-北京\",\n                \"oss-cn-zhangjiakou\"    =>  \"华北3-张家口\",\n                \"oss-cn-huhehaote\"  =>  \"华北5-呼和浩特\",\n                \"oss-cn-wulanchabu\" =>  \"华北6-乌兰察布\",\n                \"oss-cn-shenzhen\"   =>  \"华南1-深圳\",\n                \"oss-cn-heyuan\"     =>  \"华南2-河源\",\n                \"oss-cn-chengdu\"    =>  \"西南1-成都\",\n                \"oss-cn-hongkong\"   =>  \"中国-香港\",\n                \"oss-us-west-1\"     =>  \"美国-硅谷\",\n                \"oss-us-east-1\"     =>  \"美国-弗吉尼亚\",\n                \"oss-ap-southeast-1\"    =>\"新加坡\",\n                \"oss-ap-southeast-2\"    =>\"澳大利亚-悉尼\",\n                \"oss-ap-southeast-3\"    =>\"马来西亚-吉隆坡\",\n                \"oss-ap-southeast-5\"    =>\"印度尼西亚-雅加达\",\n                \"oss-ap-northeast-1\"    =>\"日本-东京\",\n                \"oss-ap-south-1\"    =>  \"印度-孟买\",\n                \"oss-eu-central-1\"  =>  \"德国-法兰克福\",\n                \"oss-eu-west-1\"     =>  \"英国-伦敦\",\n                \"oss-me-east-1\"     =>  \"阿联酋-迪拜\",\n                \"oss-ap-southeast-7\"     =>  \"泰国-曼谷\",\n                \"oss-ap-northeast-2\"     =>  \"韩国-首尔\",\n                \"oss-ap-southeast-6\"     =>  \"菲律宾-马尼拉\",\n                \"other\"             => '无地域属性'\n            ),\n            'dependency' => array( 'bucket_choose', '==', '3' ),\n        ), \n        array(\n            'id'          => 'ali_bucket_other_region',\n            'type'        => 'text',\n            'title'       => 'Endpoint地址',\n            'after' => '当非上述所可选地域时此项必填，填写完整的Endpoint地址，如oss-xx-china-xx.aliyuncs.com',\n            'dependency' => array( 'bucket_choose|ali_bucket_region', '==|==', '3|other' ),\n        ),\n        array(\n            'id'          => 'ali_bucket_name',\n            'type'        => 'text',\n            'title'       => '阿里云OSS存储桶名称',\n            'after' => '必填* 请填写阿里云OSS存储桶名称，即Bucket名称，<font color=red>请务必设置为公有读私有写!</font>',\n            'dependency' => array( 'bucket_choose', '==', '3' ),\n        ),\n        array(\n            'id'          => 'ali_bucket_connect_type',\n            'type'        => 'radio',\n            'title'       => '阿里云OSS存储桶连接方式',\n            'after' => '选择阿里云OSS存储桶连接方式',\n            'options'     => array('.aliyuncs.com' => '外网','-internal.aliyuncs.com' => '内网'),\n            'default' => '.aliyuncs.com',\n            'dependency' => array( 'bucket_choose', '==', '3' ),\n        ),\n        array(\n            'id'          => 'ali_bucket_path',\n            'type'        => 'text',\n            'title'       => '阿里云OSS存储路径',\n            'after' => '必填* 默认为 uploads/，若非必要可不修改，路径最前面不加/',\n            'default' => 'uploads/',\n            'dependency' => array( 'bucket_choose', '==', '3' ),\n        ), \n        array(\n            'id'          => 'ali_bucket_domain',\n            'type'        => 'text',\n            'title'       => '阿里云OSS访问域名',\n            'after' => '留空则为阿里云默认域名，如：https://xxxxx.oss-cn-beijing.aliyuncs.com<br>若填写的为自定义CDN域名，请参考<a target=\"_blank\" href=\"https://help.aliyun.com/document_detail/97687.html\">文档</a><br>若填写的为自定义源站域名，请参考<a target=\"_blank\" href=\"https://help.aliyun.com/document_detail/31836.html\">文档</a><br><font color=\"red\">要注意的一点是若填写的为自定义CDN域名或自定义源站域名，域名需以 http:// 或 https:// 开头</font>',\n            'dependency' => array( 'bucket_choose', '==', '3' ),\n        ), \n        array(\n            'id'      => 'ali_bucket_sync',\n            'type'    => 'switcher',\n            'title'       => '本地云端同步删除',\n            'subtitle' => '在文件管理删除文件时，是否同步删除OSS上的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '3' ),\n        ),\n        array(\n            'id'      => 'ali_bucket_localsave',\n            'type'    => 'switcher',\n            'title'       => '双重储存',\n            'subtitle' => '在本地保存一份文件副本，这样的话会占用本地存储空间',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '3' ),\n        ),\n        array(\n            'id'      => 'ali_bucket_localdelete',\n            'type'    => 'switcher',\n            'title'       => '删除时同步删除本地备份',\n            'subtitle' => '在文件管理删除文件时，是否同步删除本地备份的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose|ali_bucket_localsave', '==|==', '3|true' ),\n        ),\n         array(\n            'id'          => 'ali_bucket_other',\n            'type'        => 'text',\n            'title'       => '对象链接附带后缀',\n            'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户，若不需要请留空<br>填写示例: ?v=1&type=webp',\n            'dependency' => array( 'bucket_choose', '==', '3' ),\n        ),\n        \n        //七牛云\n        array(\n            'id'          => 'qiniu_bucket_accesskey',\n            'type'        => 'text',\n            'title'       => '七牛云AccessKey',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://portal.qiniu.com/user/key\">七牛云个人中心-密钥管理</a> 获取您的AccessKey',\n            'dependency' => array( 'bucket_choose', '==', '4' ),\n        ), \n        array(\n            'id'          => 'qiniu_bucket_secretKey',\n            'type'        => 'text',\n            'title'       => '七牛云SecretKey',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://portal.qiniu.com/user/key\">七牛云个人中心-密钥管理</a> 获取您的SecretKey',\n            'dependency' => array( 'bucket_choose', '==', '4' ),\n        ), \n        array(\n            'id'          => 'qiniu_bucket_name',\n            'type'        => 'text',\n            'title'       => '七牛云Kodo空间名称',\n            'after' => '必填* 请填写七牛云Kodo空间名称,<font color=red>空间应设置为公开</font>',\n            'dependency' => array( 'bucket_choose', '==', '4' ),\n        ), \n        array(\n            'id'          => 'qiniu_bucket_path',\n            'type'        => 'text',\n            'title'       => '七牛云Kodo存储路径',\n            'after' => '必填* 默认为 uploads/，若非必要可不修改，路径最前面不加/',\n            'default' => 'uploads/',\n            'dependency' => array( 'bucket_choose', '==', '4' ),\n        ), \n        array(\n            'id'          => 'qiniu_bucket_domain',\n            'type'        => 'text',\n            'title'       => '七牛云Kodo访问域名',\n            'after' => '切勿留空！可填写七牛测试域名/自定义CDN域名/自定义源站域名<br>若填写的为自定义CDN域名、自定义源站域名，请参考<a target=\"_blank\" href=\"https://developer.qiniu.com/kodo/8527/kodo-domain-name-management\">文档</a><br><font color=\"red\">要注意的一点是若填写的是自定义CDN域名或自定义源站域名，域名需以 http:// 或 https:// 开头，而测试域名则必须为http://开头（七牛的测试域名不允许https访问）</font>',\n            'dependency' => array( 'bucket_choose', '==', '4' ),\n        ), \n        array(\n            'id'      => 'qiniu_bucket_sync',\n            'type'    => 'switcher',\n            'title'       => '本地云端同步删除',\n            'subtitle' => '在文件管理删除文件时，是否同步删除Kodo上的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '4' ),\n        ),\n        array(\n            'id'      => 'qiniu_bucket_localsave',\n            'type'    => 'switcher',\n            'title'       => '双重储存',\n            'subtitle' => '在本地保存一份文件副本，这样的话会占用本地存储空间',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '4' ),\n        ),\n        array(\n            'id'      => 'qiniu_bucket_localdelete',\n            'type'    => 'switcher',\n            'title'       => '删除时同步删除本地备份',\n            'subtitle' => '在文件管理删除文件时，是否同步删除本地备份的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose|qiniu_bucket_localsave', '==|==', '4|true' ),\n        ),\n         array(\n            'id'          => 'qiniu_bucket_other',\n            'type'        => 'text',\n            'title'       => '对象链接附带后缀',\n            'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户，若不需要请留空<br>填写示例: ?v=1&type=webp',\n            'dependency' => array( 'bucket_choose', '==', '4' ),\n        ),\n        \n        //又拍云\n        array(\n            'id'          => 'upyun_bucket_actionUser',\n            'type'        => 'text',\n            'title'       => '又拍云操作员账号',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://console.upyun.com/services/file/\">又拍云存储控制台</a>，在云存储-进入相对应的云存储配置页面-存储管理-操作员授权中获取或新建操作员，权限为可读取、可写入、可删除',\n            'dependency' => array( 'bucket_choose', '==', '5' ),\n        ), \n        array(\n            'id'          => 'upyun_bucket_actionKey',\n            'type'        => 'text',\n            'title'       => '又拍云操作员密码',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://console.upyun.com/services/file/\">又拍云存储控制台</a>，在云存储-进入相对应的云存储配置页面-存储管理-操作员授权中获取或新建操作员，权限为可读取、可写入、可删除',\n            'dependency' => array( 'bucket_choose', '==', '5' ),\n        ), \n        array(\n            'id'          => 'upyun_bucket_name',\n            'type'        => 'text',\n            'title'       => '又拍云存储服务名称',\n            'after' => '必填* 请填写又拍云存储服务名称',\n            'dependency' => array( 'bucket_choose', '==', '5' ),\n        ), \n        array(\n            'id'          => 'upyun_bucket_path',\n            'type'        => 'text',\n            'title'       => '又拍云存储路径',\n            'after' => '必填* 默认为 uploads/，若非必要可不修改，路径最前面不加/',\n            'default' => 'uploads/',\n            'dependency' => array( 'bucket_choose', '==', '5' ),\n        ), \n        array(\n            'id'          => 'upyun_bucket_domain',\n            'type'        => 'text',\n            'title'       => '又拍云存储访问域名',\n            'after' => '切勿留空！可填写又拍云测试域名/加速域名<br>，域名需以 http:// 或 https:// 开头，而测试域名则必须为http://开头（又拍云的测试域名不允许https访问）</font>',\n            'dependency' => array( 'bucket_choose', '==', '5' ),\n        ), \n        array(\n            'id'      => 'upyun_bucket_sync',\n            'type'    => 'switcher',\n            'title'       => '本地云端同步删除',\n            'subtitle' => '在文件管理删除文件时，是否同步删除云存储上的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '5' ),\n        ),\n        array(\n            'id'      => 'upyun_bucket_localsave',\n            'type'    => 'switcher',\n            'title'       => '双重储存',\n            'subtitle' => '在本地保存一份文件副本，这样的话会占用本地存储空间',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '5' ),\n        ),\n        array(\n            'id'      => 'upyun_bucket_localdelete',\n            'type'    => 'switcher',\n            'title'       => '删除时同步删除本地备份',\n            'subtitle' => '在文件管理删除文件时，是否同步删除本地备份的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose|upyun_bucket_localsave', '==|==', '5|true' ),\n        ),\n         array(\n            'id'          => 'upyun_bucket_other',\n            'type'        => 'text',\n            'title'       => '对象链接附带后缀',\n            'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户，若不需要请留空<br>填写示例: ?v=1&type=webp',\n            'dependency' => array( 'bucket_choose', '==', '5' ),\n        ),\n        \n        \n        //华为云\n        array(\n            'id'          => 'hw_bucket_accesskey_id',\n            'type'        => 'text',\n            'title'       => '华为云ACCESSKEY ID',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://console.huaweicloud.com/iam/?locale=zh-cn#/mine/accessKey\">华为云控制台-我的凭证</a> 获取您的ACCESSKEY ID',\n            'dependency' => array( 'bucket_choose', '==', '7' ),\n        ), \n        array(\n            'id'          => 'hw_bucket_accesskey_secret',\n            'type'        => 'text',\n            'title'       => '华为云Secret AccessKey',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://console.huaweicloud.com/iam/?locale=zh-cn#/mine/accessKey\">华为云控制台-我的凭证</a> 获取您的SECRET ACCESS KEY',\n            'dependency' => array( 'bucket_choose', '==', '7' ),\n        ), \n        array(\n            'id'          => 'hw_bucket_region',\n            'type'        => 'select',\n            'title'       => 'OBS所属地域',\n            'after' => '必选* 选择您的华为云OBS所属地域，请务必选择正确',\n            'options'     => array(\n                \"obs.cn-north-4\"   =>  \"华北-北京四\",\n                \"obs.cn-north-1\"   =>  \"华北-北京一\",\n                \"obs.cn-north-9\"   =>  \"华北-乌兰察布一\",\n                \"obs.cn-east-2\"   =>  \"华东-上海二\",\n                \"obs.cn-east-3\"    =>  \"华东-上海一\",\n                \"obs.cn-south-1\"    =>  \"华南-广州\",\n                \"obs.cn-south-4\"    =>  \"华南-广州-友好用户环境\",\n                \"obs.cn-southwest-2\"    =>  \"西南-贵阳一\",\n                \"obs.ap-southeast-1\"  =>  \"中国-香港\",\n                \"obs.la-north-2\" =>  \"拉美-墨西哥城二\",\n                \"obs.na-mexico-1\"   =>  \"拉美-墨西哥城一\",\n                \"obs.sa-brazil-1\"     =>  \"拉美-圣保罗一\",\n                \"obs.la-south-2\"    =>  \"拉美-圣地亚哥\",\n                \"obs.tr-west-1\"   =>  \"土耳其-伊斯坦布尔\",\n                \"obs.ap-southeast-2\"     =>  \"亚太-曼谷\",\n                \"obs.ap-southeast-3\"     =>  \"亚太-新加坡\",\n                \"obs.af-south-1\"     =>  \"非洲-约翰内斯堡\"\n            ),\n            'dependency' => array( 'bucket_choose', '==', '7' ),\n        ), \n        array(\n            'id'          => 'hw_bucket_name',\n            'type'        => 'text',\n            'title'       => '华为云OBS存储桶名称',\n            'after' => '必填* 请填写华为云OBS存储桶名称，即Bucket名称，<font color=red>请务必设置为公有读私有写!</font>',\n            'dependency' => array( 'bucket_choose', '==', '7' ),\n        ),\n        array(\n            'id'          => 'hw_bucket_path',\n            'type'        => 'text',\n            'title'       => '华为云OBS存储路径',\n            'after' => '必填* 默认为 uploads/，若非必要可不修改，路径最前面不加/',\n            'default' => 'uploads/',\n            'dependency' => array( 'bucket_choose', '==', '7' ),\n        ), \n        array(\n            'id'          => 'hw_bucket_domain',\n            'type'        => 'text',\n            'title'       => '华为云OBS访问域名',\n            'after' => '留空则为华为云默认域名，如：https://xxxxxx.obs.cn-north-4.myhuaweicloud.com<br>若填写的为自定义CDN域名，请参考<a target=\"_blank\" href=\"https://support.huaweicloud.com/usermanual-obs/obs_03_0600.html\">文档</a><br>若填写的为自定义源站域名，请参考<a target=\"_blank\" href=\"https://support.huaweicloud.com/usermanual-obs/obs_03_0032.html\">文档</a><br><font color=\"red\">要注意的一点是若填写的为自定义CDN域名或自定义源站域名，域名需以 http:// 或 https:// 开头</font>',\n            'dependency' => array( 'bucket_choose', '==', '7' ),\n        ), \n        array(\n            'id'      => 'hw_bucket_sync',\n            'type'    => 'switcher',\n            'title'       => '本地云端同步删除',\n            'subtitle' => '在文件管理删除文件时，是否同步删除OSS上的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '7' ),\n        ),\n        array(\n            'id'      => 'hw_bucket_localsave',\n            'type'    => 'switcher',\n            'title'       => '双重储存',\n            'subtitle' => '在本地保存一份文件副本，这样的话会占用本地存储空间',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '7' ),\n        ),\n        array(\n            'id'      => 'hw_bucket_localdelete',\n            'type'    => 'switcher',\n            'title'       => '删除时同步删除本地备份',\n            'subtitle' => '在文件管理删除文件时，是否同步删除本地备份的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose|hw_bucket_localsave', '==|==', '7|true' ),\n        ),\n         array(\n            'id'          => 'hw_bucket_other',\n            'type'        => 'text',\n            'title'       => '对象链接附带后缀',\n            'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户，若不需要请留空<br>填写示例: ?v=1&type=webp',\n            'dependency' => array( 'bucket_choose', '==', '7' ),\n        ),\n        \n        \n        //百度云\n        array(\n            'id'          => 'bd_bucket_accesskey',\n            'type'        => 'text',\n            'title'       => '百度云Access Key',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://console.bce.baidu.com/iam/#/iam/accesslist\">百度云控制台-安全认证/ Access Key</a> 获取您的ACCESSKEY',\n            'dependency' => array( 'bucket_choose', '==', '6' ),\n        ), \n        array(\n            'id'          => 'bd_bucket_secretkey',\n            'type'        => 'text',\n            'title'       => '百度云Secret Key',\n            'after' => '必填* 请前往<a target=\"_blank\" href=\"https://console.bce.baidu.com/iam/#/iam/accesslist\">百度云控制台-安全认证/ Access Key</a> 获取您的SECRETKEY',\n            'dependency' => array( 'bucket_choose', '==', '6' ),\n        ), \n        array(\n            'id'          => 'bd_bucket_region',\n            'type'        => 'select',\n            'title'       => 'BOS所属地域',\n            'after' => '必选* 选择您的百度云BOS所属地域，请务必选择正确',\n            'options'     => array(\n                \"bj.bcebos.com\"   =>  \"华北-北京\",\n                \"bd.bcebos.com\"   =>  \"华北-保定\",\n                \"su.bcebos.com\"   =>  \"华东-苏州\",\n                \"gz.bcebos.com\"   =>  \"华南-广州\",\n                \"fwh.bcebos.com\"    =>  \"华中金融-武汉\",\n                \"fsh.bcebos.com\"    =>  \"华东-上海\",\n                \"hkg.bcebos.com\"  =>  \"中国-香港\",\n            ),\n            'dependency' => array( 'bucket_choose', '==', '6' ),\n        ), \n        array(\n            'id'          => 'bd_bucket_name',\n            'type'        => 'text',\n            'title'       => '百度云BOS存储桶名称',\n            'after' => '必填* 请填写百度云BOS存储桶名称，即Bucket名称，<font color=red>请务必设置为公共读</font>',\n            'dependency' => array( 'bucket_choose', '==', '6' ),\n        ),\n        array(\n            'id'          => 'bd_bucket_path',\n            'type'        => 'text',\n            'title'       => '百度云BOS存储路径',\n            'after' => '必填* 默认为 uploads/，若非必要可不修改，路径最前面不加/',\n            'default' => 'uploads/',\n            'dependency' => array( 'bucket_choose', '==', '6' ),\n        ), \n        array(\n            'id'          => 'bd_bucket_domain',\n            'type'        => 'text',\n            'title'       => '百度云BOS访问域名',\n            'after' => '留空则为百度云默认域名，如：https://xxxxxx.bj.bcebos.com<br>若填写的为自定义CDN域名，请参考<a target=\"_blank\" href=\"https://cloud.baidu.com/doc/BOS/s/hkaqii59b\">文档</a><br>若填写的为自定义源站域名，请参考<a target=\"_blank\" href=\"https://cloud.baidu.com/doc/BOS/s/ckaqihkra\">文档</a><br><font color=\"red\">要注意的一点是若填写的为自定义CDN域名或自定义源站域名，域名需以 http:// 或 https:// 开头</font>',\n            'dependency' => array( 'bucket_choose', '==', '6' ),\n        ), \n        array(\n            'id'      => 'bd_bucket_sync',\n            'type'    => 'switcher',\n            'title'       => '本地云端同步删除',\n            'subtitle' => '在文件管理删除文件时，是否同步删除OSS上的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '6' ),\n        ),\n        array(\n            'id'      => 'bd_bucket_localsave',\n            'type'    => 'switcher',\n            'title'       => '双重储存',\n            'subtitle' => '在本地保存一份文件副本，这样的话会占用本地存储空间',\n            'default' => false,\n            'dependency' => array( 'bucket_choose', '==', '6' ),\n        ),\n        array(\n            'id'      => 'bd_bucket_localdelete',\n            'type'    => 'switcher',\n            'title'       => '删除时同步删除本地备份',\n            'subtitle' => '在文件管理删除文件时，是否同步删除本地备份的对应文件',\n            'default' => false,\n            'dependency' => array( 'bucket_choose|bd_bucket_localsave', '==|==', '6|true' ),\n        ),\n         array(\n            'id'          => 'bd_bucket_other',\n            'type'        => 'text',\n            'title'       => '对象链接附带后缀',\n            'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户，若不需要请留空<br>填写示例: ?v=1&type=webp',\n            'dependency' => array( 'bucket_choose', '==', '6' ),\n        ),\n        \n        \n        ),\n        ));\n         $cache_html = '';\n       $cache_api = Common::url('clean-cache', Options::alloc()->index);\n\n        $cache_html .= '<style>code{border-radius:5px}</style><a id=\"cleancache\" class=\"button button-primary csf--button\">清空缓存</a><br><br>需要注意：当选择的是<font color=red>Sqlite或Flysystem缓存</font>时请在站点根目录创建caches目录，缓存文件会存储到该目录中~\n        <link href=\"'.Helper::options()->themeUrl.'/assets/vendors/toastr.js/toastr.min.css\" rel=\"stylesheet\">\n\t<script src=\"'.Helper::options()->themeUrl.'/assets/vendors/toastr.js/toastr.min.js\"></script>\n        <script>\n        document.getElementById(\"cleancache\").onclick = function(){\n        $.get(\"'.$cache_api.'\",function(data,status){\n        json = JSON.parse(data);\nswitch(json.code)\n{\ncase \"1\":\ntoastr.success(json.message);\nbreak;\ncase \"0\":\ntoastr.warning(json.message);\nbreak;\n}\n});\n        };\n        </script>\n        \n        ';\n        $tip = '';\n        if (!class_exists('Memcached',false)) { $tip .= '<br>Memcached:<font color=red>检测到当前Memcached PHP扩展未安装，若开启Memcached缓存，请先安装扩展，否则会出现报错问题！</font>';}else{$tip .= '<br>Memcached:<font color=green>检测到扩展已安装，可开启Memcached缓存:)</font>';} \n        if (!class_exists('Redis',false)) { $tip .= '<br>Redis:<font color=red>检测到当前Redis PHP扩展未安装，若开启Redis缓存，请先安装扩展，否则会出现报错问题！</font>';}else{$tip .= '<br>Redis:<font color=green>检测到扩展已安装，可开启Redis缓存:)</font>';} \n        if (!extension_loaded('apcu')) { $tip .= '<br>Apcu:<font color=red>检测到当前Apcu PHP扩展未安装，若开启Apcu缓存，请先安装扩展，否则会出现报错问题！</font>';}else{$tip .= '<br>Apcu:<font color=green>检测到扩展已安装，可开启Apcu缓存:)</font>';} \n        if (!\\Typecho\\Db\\Adapter\\Pdo\\SQLite::isAvailable() && !\\Typecho\\Db\\Adapter\\SQLite::isAvailable()) { $tip .= '<br>SQLite:<font color=red>检测到当前SQLite PHP扩展未安装，若开启SQLite缓存，请先安装扩展，否则会出现报错问题！</font>';}else{$tip .= '<br>SQLite:<font color=green>检测到扩展已安装，可开启SQLite缓存:)</font>';} \n        if (!extension_loaded('fileinfo')) { $tip .= '<br>Flysystem:<font color=red>检测到当前fileinfo PHP扩展未安装，若开启Flysystem缓存，请先安装fileinfo 扩展，否则会出现报错问题！</font>';}else{$tip .= '<br>Flysystem:<font color=green>检测到扩展已安装，可开启Flysystem缓存:)</font>';} \n        $tip .= '<br>Memory:<font color=green>当前可开启Memory缓存，但仍不建议配置低的机器使用该缓存方式</font>';\n  CSF::createSection( $prefix, array(\n    'title'  => '缓存设置',\n    'icon'   => 'fas fa-sync-alt',\n    'fields' => array(\n      array(\n            'id'      => 'Cache',\n            'type'    => 'switcher',\n            'title'       => '缓存功能',\n            'after' => '<br><br>开启缓存功能后您需要注意:<br><li>1、行为验证中的验证问答和加减法验证可能会失效，请选择其他验证</li><li>2、<font color=red>我们建议您的PHP版本应为8.0及以上，否则有可能会导致报错异常</font></li>',\n            'default' => false,\n        ),\n        array(\n            'id'          => 'Cache_choose',\n            'type'        => 'select',\n            'title'       => '缓存方式',\n            'after' => '您可以自由选择需要的缓存方式<br>缓存扩展自检:'.$tip,\n            'options'     => array('memcached' => 'Memcached缓存', 'redis' => 'Redis缓存', 'apcu' => 'Apcu缓存',  'sqlite' => 'SQLite缓存', 'memory' => 'Memory缓存','flysystem' => 'Flysystem缓存'),\n            'default' => '1',\n            'dependency' => array( 'Cache', '==', 'true' ),\n        ),\n        \n        array(\n            'type'    => 'heading',\n            'content' => '缓存操作',\n            'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ),\n        ),\n        array(\n                    'type' =>'content',\n                    'content' => $cache_html,\n                    'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ),\n                ),\n        array(\n            'type'    => 'heading',\n            'content' => 'Memcached缓存设置',\n            'dependency' => array( 'Cache|Cache_choose', '==|==', 'true|memcached' ),\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => 'Redis缓存设置',\n            'dependency' => array( 'Cache|Cache_choose', '==|==', 'true|redis' ),\n        ),\n        array(\n            'id'      => 'login',\n            'type'    => 'radio',\n            'title'   => '是否对已登录用户失效',\n            'subtitle'=>'已经登录用户不会触发缓存策略',\n            'inline'  => true,\n            'options' => array('关闭', '开启'),\n            'default' => 1,\n            'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ),\n        ),\n        \n        array(\n            'id'       => 'expire',\n            'type'     => 'text',\n            'title'    => '缓存过期时间',\n            'after' => '86400 = 60s * 60m *24h，即一天的秒',\n            'default'     => '86400',\n            'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ),\n        ),\n        array(\n            'id'       => 'host',\n            'type'     => 'text',\n            'title'    => '主机地址',\n            'after' => '主机地址，一般为127.0.0.1',\n            'default'     => '127.0.0.1',\n            'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis' ),\n        ),\n        array(\n            'id'       => 'port',\n            'type'     => 'text',\n            'title'    => '端口号',\n            'after' => 'memcached默认为11211，redis默认为6379',\n            'default'     => '11211',\n            'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis' ),\n        ),\n        array(\n            'id'       => 'rpassword',\n            'type'     => 'text',\n            'title'    => '密码',\n            'after' => 'redis密码,留空代表没有设置密码',\n            'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|redis' ),\n        ),\n        \n        \n    //---------->\n        array(\n            'type'    => 'heading',\n            'content' => '全局缓存',\n            'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ),\n        ),\n        array(\n            'id'      => 'enable_gcache',\n            'type'    => 'radio',\n            'title'   => '是否开启全局缓存',\n            'subtitle'=>'在开启全局缓存的情况下，该页面缓存选项有效',\n            'inline'  => true,\n            'options' => array('关闭', '开启'),\n            'default' => '1',\n            'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ),\n        ),\n        array(\n            'id'      => 'cache_page',\n            'type'    => 'checkbox',\n            'title'   => '需要缓存的页面',\n            'subtitle' => '选择需要缓存的页面',\n            'inline'  => true,\n            'options' => array(\n\t\t\t'index' => '首页',\n\t\t\t'archive' => '归档',\n\t\t\t'post' => '文章',\n\t\t\t'attachment' => '附件',\n\t\t\t'category' => '分类',\n\t\t\t'tag' => '标签',\n\t\t\t'author' => '作者',\n\t\t\t'search' => '搜索',\n\t\t\t'feed' => 'feed',\n\t\t\t'page' => '页面'\n\t\t),\n            'default' => array('index', 'post', 'search', 'page', 'author', 'tag'),\n            'dependency' => array( 'Cache|Cache_choose|enable_gcache', '==|any|==', 'true|memcached,redis,apcu,sqlite,flysystem,memory|1' ),\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => '部分缓存',\n            'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ),\n        ),\n        array(\n            'id'      => 'enable_markcache',\n            'type'    => 'radio',\n            'title'   => '是否开启markdown缓存',\n            'subtitle'=>'在全局缓存命中失效的时候是否开启 markdown 部分缓存,\n        选项关闭，则未命中均不缓存。选项开启后，在文章编辑界面通过 NOCACHE 标签来决定是否缓存当前文章，按钮已经集成了，插入标签就表示不缓存',\n            'inline'  => true,\n            'options' => array('关闭', '开启'),\n            'default' => '0',\n            'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ),\n        ),\n    )\n  ) );\n  $generate_indexnow = '\n  <div id=\"generateApiKey\">\n    <h2 class=\"section-header text-center\">\n        生成 IndexNow 密钥\n    </h2>\n<style>\n.guid{\n    border: 1px solid gray;\n    padding:8px;\n    border-radius:5px\n}\n</style>\n                <text class=\"guid\">IndexNow 密钥</text>\n           \n<br><br>\n        <span class=\"button button-primary csf--button\" onClick=\"handleGenerate()\">\n            <i class=\"fas fa-sync\"></i>\n             重新生成密钥\n        </span>\n        <span class=\"button button-primary csf--button\" id=\"download-icon\">\n            <i class=\"fas fa-download\"></i>\n             下载密钥\n        </span>\n</div>\n  ';\n  CSF::createSection( $prefix, array(\n    'title'  => 'SEO管理',\n    'icon'   => 'fas fa-search-plus',\n    'fields' => array(\n        array(\n            'id'          => 'SiteMap',\n            'type'        => 'select',\n            'title'       => 'Sitemap网站地图',\n            'after' => '开启后博客将生成sitemap<br>\n         开启了伪静态后是xxx.com/sitemap.xml<br>\n         没开启伪静态是xxx.com/index.php/sitemap.xml',\n            'options'     => array(\n            'close' => '关闭',\n            '100' => '显示最新 100 条链接',\n            '200' => '显示最新 200 条链接',\n            '300' => '显示最新 300 条链接',\n            '400' => '显示最新 400 条链接',\n            '500' => '显示最新 500 条链接',\n            '600' => '显示最新 600 条链接',\n            '700' => '显示最新 700 条链接',\n            '800' => '显示最新 800 条链接',\n            '900' => '显示最新 900 条链接',\n            '1000' => '显示最新 1000 条链接',\n        ),\n            'default' => 'close',\n        ),\n        array(\n            'id'      => 'keywords_hide',\n            'type'    => 'switcher',\n            'title'       => '是否隐藏Meta Keywords',\n            'subtitle' => '当前搜索引擎已不再关注Meta Keywords标签，您可以通过本项对Meta Keywords进行隐藏/显示',\n            'default' => false,\n        ),\n        array(\n            'id'      => 'seo_push',\n            'type'    => 'switcher',\n            'title'       => '收录推送',\n            'subtitle' => '开启后需配置推送信息<br>推送动作触发：<br>1、在发布文章后自动推送 <br>2、在访客访问文章时自动推送',\n            'default' => false,\n            \n        ),\n        array(\n                'id'    => 'seotabs',\n                'type'  => 'tabbed',\n                'title' => '',\n                'dependency' => array( 'seo_push', '==', 'true' ),\n                'tabs'  => array(\n\n                    array(\n                        'title'  => '百度站长推送',\n                        'fields' => array(\n                            array(\n            'id'       => 'baidu_token',\n            'type'     => 'text',\n            'title'    => '百度推送接口调用地址',\n            'after' => '位置：站长工具-普通收录-资源提交-API提交-接口调用地址<br>填写格式：http://data.zz.baidu.com/urls?site=https://www.baidu.com&token=xxxxxxxxxxx',\n        ),\n                       \n                        ),\n                        \n              \n                    ),\n                           array(\n                        'title'  => '神马站长推送',\n                        'fields' => array(\n                            array(\n            'id'       => 'shenma_token',\n            'type'     => 'text',\n            'title'    => '神马推送接口调用地址',\n            'after' => '位置：站长平台-数据提交-MIP数据提交-接口调用地址<br>填写格式：https://data.zhanzhang.sm.cn/push?site=www.xxxx.com&user_name=站长平台账号&resource_name=mip_add&token=xxxxxxxxxxx',\n        ),\n                       \n                        ),\n                        ),\n                        array(\n                        'title'  => 'IndexNow推送',\n                        'fields' => array(\n                            array(\n            'id'       => 'indexnow_token',\n            'type'     => 'text',\n            'title'    => 'IndexNow密钥',\n            'after' => '因站点环境及权限等相对复杂的原因，不提供直接生成密钥到根目录，请按照以下提示进行操作:<br>请将以下生成的密钥复制到本栏，并下载密钥上传到站点根目录，确保站点能够正常访问到密钥',\n        ),\n        array(\n                    'type' =>'content',\n                    'content' => $generate_indexnow,\n                ),\n                       \n                        ),\n                        ),\n                        \n                        array(\n                        'title'  => 'Bing站长推送',\n                        'fields' => array(\n                            array(\n            'id'       => 'bing_token',\n            'type'     => 'text',\n            'title'    => 'API密钥',\n            'after' => '位置：站长平台-右上角齿轮-设置-API访问-API密钥，获取您的Bing ApiKey并填写到这里',\n        ),\n                       \n                        ),\n                        ),\n                        array(\n                        'title'  => '头条站长推送',\n                        'fields' => array(\n                            array(\n            'id'       => 'toutiao_token',\n            'type'     => 'text',\n            'title'    => '头条接口Token',\n            'after' => '位置：站长平台-网站工具-自动收录-js提交框中的https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?xxxxxxxxxx<br>填写格式：仅需填写push.js?后面那串字符串即可',\n        ),\n                       \n                        ),\n                        ),\n                ),\n            ),\n            \n        ),\n        ));\n  $styles = array_map('basename', glob(dirname(__FILE__) . '/modules/codehightlight/static/styles/*.css'));\n        $styles = array_combine($styles, $styles);\n        \n$sync_html2 = '';\n       $sync_api2 = Common::url('syncData',Options::alloc()->index);\n\n        $sync_html2 .= '<div id=\"sync3\" class=\"button button-primary csf--button\" style=\"margin:5px\">一键同步朋友圈数据</div>\n        <script>\n        document.getElementById(\"sync3\").onclick = function(){\n        var confirms = confirm(\"确认是否一键同步朋友圈数据？在同步前请务必进行一次数据库备份，以免在同步过程中出现意外情况！\");\n        if(confirms == true){\n        var confirms2 = confirm(\"请再次确认是否一键同步朋友圈数据？\");\n        if(confirms2 == true){\n        $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: \"'.$sync_api2.'\",\n                        data: {\n                            \"action\":\"syncCircleData\"\n                        },\n                        dataType: \"json\",\n                        success: function(data) {\n        json = JSON.parse(JSON.stringify(data));\nswitch(json.code)\n{\ncase 1:\ntoastr.success(\"朋友圈数据已同步完成\",json.msg);\nbreak;\ncase 0:\ntoastr.warning(json.msg);\nbreak;\n}\n}\n        })\n            \n        }\n        }\n        }\n\n        </script>\n        \n        ';\n        \n  CSF::createSection( $prefix, array(\n    'title'  => '模块管理',\n    'icon'   => 'fas fa-cubes',\n    'fields' => array(\n      array(\n            'type'    => 'heading',\n            'content' => '文章优化模块',\n        ),\n        array(\n            'id'          => 'Mermaid',\n            'type'        => 'switcher',\n            'title'       => 'Mermaid美人鱼',\n            'subtitle' => '开启后前台对流程图、思维导图等进行格式转换',\n            'default' => false,\n        ), \n        array(\n            'id'          => 'MathJax',\n            'type'        => 'switcher',\n            'title'       => 'MathJax数学公式',\n            'subtitle' => '开启后前台对数学公式进行格式转换',\n            'default' => false,\n        ), \n        array(\n            'id'          => 'Codehightlight',\n            'type'        => 'select',\n            'title'       => '代码高亮',\n            'after' => '开启后前台对代码显示高亮',\n            'options'     => array('1' => '是',  '2' => '否'),\n            'default' => '2',\n        ), \n\n        array(\n            'id'          => 'code_style',\n            'type'        => 'select',\n            'title'       => '选择高亮主题风格',\n            'after' => '高亮主题风格文件在/usr/themes/bearsimple/modules/codehightlight/static/style中，您可以自行设计样式放入该目录,即可在本项选择',\n            'options'     => $styles,\n            'default' => 'GrayMac.css',\n            'dependency' => array( 'Codehightlight', '==', '1' ),\n        ), \n        array(\n            'id'          => 'showLineNumber',\n            'type'        => 'select',\n            'title'       => '显示行号',\n            'after' => '是否在代码左侧显示行号',\n            'options'     => array('1' => '是',  '2' => '否'),\n            'default' => '1',\n             'dependency' => array( 'Codehightlight', '==', '1' ),\n        ), \n        \n        array(\n            'id'          => 'Editors',\n            'type'        => 'select',\n            'title'       => '编辑器优化',\n            'after' => '若选择开启,则编辑文件、页面的时候将替换官方编辑器，更换为更加美观的编辑器。',\n            'options'     => array('1' => '开启',  '2' => '关闭'),\n            'default' => '2',\n        ), \n        array(\n            'id'      => 'EditorsAutosave',\n            'type'    => 'checkbox',\n            'title'   => '编辑器自动保存方式选择',\n            'after' => '自动保存支持两种方式，两种方式可同时开启不受影响，全都不选代表不开启自动保存<br>第一种即为浏览器保存，文章在还没点击提交的情况下均保存在浏览器中，点击其他文章，先前文章的内容仍会直接覆盖到当前文章。第二种是保存为草稿，编辑器在每隔十五秒会将文章保存为草稿。',\n            'inline'  => true,\n            'options' => array(\n                '1' => '浏览器自动保存',\n                '11' => '自动保存为草稿',\n            ),\n            'dependency' => array( 'Editors', '==', '1' ),\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => '我的追番模块',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '追番模块支持Bilibili和Bangumi<br>\n            Bilibili:您需在下方填写您的Bilibili账户UID并且在空间设置中开启“公开我的追番”功能<br>Bangumi:您需在下方填写您的Bangumi账户UID<br>\n当然，您要想前台能看到的话必须新建一个独立页面，并将自定义模板选择我的追番',\n        ),\n        array(\n            'id'       => 'bangumi_note',\n            'type'     => 'text',\n            'title'    => '追番温馨提示',\n            'after' => '填写追番温馨提示，将显示在追番上方',\n        ),\n        array(\n            'id'          => 'acg_choose',\n            'type'        => 'select',\n            'title'       => '选择追番站点',\n            'after' => '请先选择追番站点，Bilibili或Bangumi',\n            'options'     => array('1' => 'Bilibili',  '2' => 'Bangumi'),\n            'default' => '2',\n        ), \n        array(\n            'id'       => 'bilibili_accountid',\n            'type'     => 'text',\n            'title'    => 'Bilibili UID',\n            'after' => '填写Bilibili UID，并在空间设置中开启“公开我的追番”功能，系统将自动获取您所有的追番记录',\n            'dependency' => array( 'acg_choose', '==', '1' )\n        ),\n        array(\n            'id'       => 'bangumi_accountid',\n            'type'     => 'text',\n            'title'    => 'Bangumi UID',\n            'after' => '填写Bangumi UID，一般在个人中心昵称右边@xxxx，只要填写数字即可，若设置了用户名则直接填写用户名即可，系统将自动获取您所有的追番记录',\n            'dependency' => array( 'acg_choose', '==', '2' )\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => '我的豆瓣模块',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '您可以使用该模块来展示您在豆瓣的收藏<br>\n当然，您要想前台能看到的话，请填写以下项，然后新建一个独立页面，并将自定义模板选择豆瓣<br><font color=red>豆瓣页面在第一次访问时因要生成缓存文件，所以加载会有些慢，请耐心等待，数据更新为30天一次！</font>',\n        ),\n        array(\n            'id'       => 'douban_note',\n            'type'     => 'text',\n            'title'    => '豆瓣温馨提示',\n            'after' => '填写豆瓣温馨提示，将显示在豆瓣列表上方',\n        ),\n        array(\n            'id'       => 'douban_id',\n            'type'     => 'text',\n            'title'    => '豆瓣ID',\n            'after' => '请填写豆瓣ID，例如您在在豆瓣的个人首页网址是https://www.douban.com/people/123456/，那么123456就是您的豆瓣ID',\n        ),\n        \n        array(\n            'id'      => 'douban_show',\n            'type'    => 'checkbox',\n            'title'   => '豆瓣展示类别',\n            'inline'  => true,\n            'options' => array('movie' => '豆瓣影视',  'book' => '豆瓣读书','music' => '豆瓣音乐'),\n            'after'=>'您可以根据您的实际情况选择所要展示的类别'\n        ),\n        \n        array(\n            'type'    => 'heading',\n            'content' => '我的Steam模块',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '您可以使用该模块来展示您的Steam资料<br>\n当然，您要想前台能看到的话，请填写以下项，然后新建一个独立页面，并将自定义模板选择Steam',\n        ),\n        array(\n            'id'       => 'steamId',\n            'type'     => 'text',\n            'title'    => '您的SteamId',\n            'after' => '请填写您的SteamId，SteamId是一串您账户的特殊识别码，可在您的个人资料页面-SteamId中看到，SteamId那串数字复制粘贴到本项即可<br>若您还是不知道SteamId在哪看，可在 https://www.steamidfinder.com 中搜索查找，steamID64 (Dec)即为您的SteamId',\n        ),\n        \n        array(\n            'type'    => 'heading',\n            'content' => 'Emaction表态动作模块',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => 'Emaction是一个仿Github表态动作的模块，访客通过点击相关Emoji表情来表示对该信息的态度，开启本模块后需要勾选开启的区域。',\n        ),\n        array(\n            'id'      => 'emaction_Openplace',\n            'type'    => 'checkbox',\n            'title'   => 'Emaction表态动作应用范围',\n            'after' => '请勾选Emaction表态动作模块的应用范围，勾选后将在勾选的区域中开启。',\n            'inline'  => true,\n            'options' => array(\n                '1' => '评论[包含留言页面]',\n                '2' => '微语时光机页面',\n            ),\n            ),\n        array(\n            'id'          => 'emaction_Closelike',\n            'type'        => 'switcher',\n            'title'       => '是否在勾选的范围中隐藏点赞组件',\n            'subtitle' => '开启后在勾选的应用范围中默认的点赞组件将自动隐藏（如评论点赞）',\n            'default' => false,\n        ), \n        array(\n            'type'    => 'heading',\n            'content' => '朋友圈模块',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '朋友圈和微语是一样的，只是样式不同且功能扩展也不同，遂分为两个模块<br>\n当然，您要想前台能看到的话，请填写以下项，然后新建一个独立页面，并将自定义模板选择朋友圈',\n        ),\n        \n        array(\n            'id'       => 'fcircle_Name',\n            'type'     => 'text',\n            'title'    => '您的朋友圈昵称',\n            'after' => '填写您的朋友圈昵称，将显示在头像左边',\n        ),\n        \n        array(\n            'id'       => 'fcircle_Sign',\n            'type'     => 'text',\n            'title'    => '您的朋友圈个性签名',\n            'after' => '填写您的朋友圈个性签名，将显示在头像下方',\n        ),\n        array(\n            'id'       => 'fcircle_Background',\n            'type'    => 'upload',\n            'title'    => '您的朋友圈顶部背景',\n            'after' => '上传顶部背景图片，该图片将显示在朋友圈顶部',\n        ),\n        array(\n            'id'       => 'fcircle_Avatar',\n            'type'    => 'upload',\n            'title'    => '您的朋友圈头像',\n            'after' => '上传您的朋友圈头像',\n        ),\n        array(\n            'id'          => 'fcircle_hiddenMode',\n            'type'        => 'switcher',\n            'title'       => '单栏模式',\n            'subtitle' => '开启后当全局为双栏模式时朋友圈页面强制显示单栏',\n            'default' => false,\n        ), \n        array(\n            'title'   => '同步数据',\n         'type' =>'content',\n        'content' => $sync_html2,\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => 'Memos模块',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => 'Memos是一个具有知识管理和社交功能的自托管备忘录中心,本主题支持创建一个聚合Memos内容的独立页面，通过本模块可以将您在memos所发布的内容在本站点中呈现出来<br>\n当然，您要想前台能看到的话，请填写以下项，然后新建一个独立页面，并将自定义模板选择Memos<br><font color=red>因Memos Api有改动，本模块建议使用Memos v0.24.0及以上版本，低于v0.24.0版本可能无法正常显示！</font>',\n        ),\n        array(\n            'id'       => 'memos_Url',\n            'type'     => 'text',\n            'title'    => '您的Memos域名',\n            'after' => '填写您的Memos域名，以http(s)://开头，末尾无需添加斜杠',\n        ),\n        array(\n            'id'       => 'memos_Username',\n            'type'     => 'text',\n            'title'    => '您的Memos账户ID',\n            'after' => '一般填1即可，1为Memos初始管理员ID，若为其他成员可按照账户创建顺序递增ID，留空则输出所有公开的Memo',\n        ),\n        array(\n            'id'          => 'memos_Autoavatar',\n            'type'        => 'switcher',\n            'title'       => '是否开启趣味头像',\n            'subtitle' => '本服务由DiceBear提供，开启后Memos列表显示的头像将根据发表Memo的作者ID来生成，不会重复',\n            'default' => false,\n        ), \n        array(\n            'id'          => 'memos_Avatar',\n            'type'        => 'upload',\n            'title'       => 'Memos头像上传',\n            'subtitle' => 'Memos头像仅能上传一个，因此若列出的Memos列表有多个账户时都会显示一样的头像，当开启趣味头像后本项无效',\n            'default' => false,\n        ), \n        array(\n            'id'          => 'memos_Emaction',\n            'type'        => 'switcher',\n            'title'       => '是否开启Emoji Emaction',\n            'subtitle' => '开启后Memo卡片底部会显示Emoji Emaction组件，访客可以通过点选Emoji来表明自己的态度',\n            'default' => false,\n        ), \n        array(\n            'type'    => 'heading',\n            'content' => '微语模块',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '您可以创建一个记录空间，记录一些自己所学的所记的，也可以自言自语胡言乱语23333<br>\n当然，您要想前台能看到的话必须新建一个独立页面，并将自定义模板选择微语[时光机]',\n        ),\n        array(\n            'id'          => 'cross_style',\n            'type'        => 'select',\n            'title'       => 'PC端微语样式',\n            'after' => '可选择PC端的微语结构样式',\n            'options'     => array('1' => '默认样式',  '2' => '树状样式'),\n            'default' => '1',\n        ), \n    array(\n            'type'    => 'heading',\n            'content' => '相册模块',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '本模块支持您设定一个或多个分类作为相册，设定为相册的分类将以相册样式展示~',\n        ),\n         array(\n            'id'     => 'Cate_Album',\n            'type'   => 'group',\n            'title'  => '相册分类',\n            'subtitle' => '您可以通过本项增加指定分类作为相册，设置后该项指定的分类将以相册样式进行展示。',\n            'fields' => array(\n                array(\n        'id'    => 'Cate_Album_Name',\n        'type'  => 'text',\n        'title' => '标识',\n        'after' => '您可以给该相册加个标注，该项仅后台可见~',\n      ),\n      \n            array(\n            'id'          => 'Cate_Album_Id',\n            'type'        => 'select',\n            'title'       => '要作为相册的分类选择',\n            'chosen'      => true,\n            'multiple'    => false,\n            'sortable'    => true,\n            'ajax'        => true,\n            'options'     => 'category',\n            'placeholder' => '选择需要作为相册的分类',\n        ),\n      array(\n            'id'       => 'Cate_Album_Number',\n            'type'     => 'number',\n            'title'    => '该分类下每页显示多少相册',\n            'default'=> '5',\n            'subtitle' => '请输入相册显示数目,填数字即可',\n        ),\n            ),\n            \n        \n        ),\n        \n      \n        \n        array(\n            'type'    => 'heading',\n            'content' => '我的Github仓库模块',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '您需在下方填写您的Github账号<br>\n仓库显示该Github账号下的所有项目，当然，您要想前台能看到的话必须新建一个独立页面，并将自定义模板选择我的Github仓库',\n        ),\n        array(\n            'id'       => 'github_note',\n            'type'     => 'text',\n            'title'    => 'Github仓库温馨提示',\n            'after' => '填写Github仓库温馨提示，将显示在仓库上方',\n        ),\n        array(\n            'id'       => 'github_accountid',\n            'type'     => 'text',\n            'title'    => 'Github账号',\n            'after' => '填写Github账号，系统将自动获取您账户下所有的自创项目',\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => '关于我模块',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '您需在下方填写个人相关信息，当然，您要想前台能看到的话必须新建一个独立页面，并将自定义模板选择关于我',\n        ),\n        array(\n            'id'       => 'aboutme_background',\n            'type'    => 'upload',\n\n            'title'    => '顶部背景',\n            'after' => '上传顶部背景图片，该图片将虚化后作为顶部背景显示',\n        ),\n        array(\n            'id'       => 'aboutme_avatar',\n            'type'    => 'upload',\n\n            'title'    => '顶部头像',\n            'after' => '上传您的头像，将显示在顶部居中位置',\n        ),\n        array(\n            'id'       => 'aboutme_name',\n            'type'     => 'text',\n            'title'    => '名字',\n            'after' => '填写您在自我介绍中的名字',\n        ),\n        array(\n            'id'       => 'aboutme_say',\n            'type'     => 'textarea',\n            'title'    => '自我介绍',\n            'after' => '填写您的自我介绍，不求感人肺腑，只求看得过去～',\n        ),\n        array(\n            'id'       => 'aboutme_job',\n            'type'     => 'text',\n            'title'    => '职业或者给自己颁发个头衔',\n            'after' => '填写您的职业或者头衔名',\n        ),\n        array(\n            'id'       => 'aboutme_lc',\n            'type'     => 'textarea',\n            'title'    => '历程',\n            'after' => '填写您自己的历程，格式<br>[timeline year=\"年份\"]<br>[title]历程标题[/title]<br>[desc]历程内容[/desc]<br>[/timeline]<br>多个历程换行即可',\n        ),\n        array(\n            'id'          => 'aboutme_ghOpen',\n            'type'        => 'switcher',\n            'title'       => '是否开启未来规划',\n            'subtitle' => '开启后关于我页面将显示规划栏目',\n            'default' => false,\n        ), \n        array(\n            'id'       => 'aboutme_gh',\n            'type'     => 'textarea',\n            'title'    => '未来规划',\n            'after' => '填写您自己的未来规划，格式<br>[timeline year=\"年份\"]<br>[title]规划标题[/title]<br>[desc]规划内容[/desc]<br>[/timeline]<br>多个规划换行即可',\n            'dependency' => array( 'aboutme_ghOpen', '==', 'true' )\n        ),\n        array(\n            'id'       => 'aboutme_qq',\n            'type'     => 'text',\n            'title'    => '您的QQ',\n            'after' => '填写您的QQ账号，不填不显示',\n        ),\n        array(\n            'id'       => 'aboutme_weibo',\n            'type'     => 'text',\n            'title'    => '您的微博',\n            'after' => '填写您的微博账号，不填不显示',\n        ),\n        array(\n            'id'       => 'aboutme_weixin',\n            'type'     => 'text',\n            'title'    => '您的微信',\n            'after' => '填写您的微信号，不填不显示',\n        ),\n        array(\n            'id'       => 'aboutme_mail',\n            'type'     => 'text',\n            'title'    => '您的邮箱',\n            'after' => '填写您的邮箱地址，不填不显示',\n        ),\n    )\n  ) );\n  if(Bsoptions('UserCenter_coin_name') !== ''):$coin_name = Bsoptions('UserCenter_coin_name');else:$coin_name = '积分';endif;\n  CSF::createSection( $prefix, array(\n    'title'  => '用户中心',\n    'icon'   => 'fas fa-user-cog',\n    'fields' => array(\n        array(\n            'id'         => 'Login_hidden',\n            'type'       => 'switcher',\n            'title'      => '是否启用登录入口',\n            'text_on'    => '启用',\n            'text_off'   => '不启用',\n            'text_width' => '100',\n            'after'=>'<br><br>开启后登录入口将显示在导航栏上。',\n        ),\n        array(\n            'id'      => 'Login_Other',\n            'type'    => 'checkbox',\n            'title'   => '第三方社交登录',\n            'inline'  => true,\n            'options' => array('qq' => 'QQ',  'wechat' => '微信','weibo' => '微博','github'=>'Github'),\n            'after'=>'该项针对有开启Tepass社交登录的用户['.$Tepass_check.']<br>选择需要显示的社交登录按钮，它将显示在登录框底部。',\n            'dependency' => array( 'Login_hidden', '==', 'true' )\n        ),\n      array(\n            'id'      => 'UserCenterOpen',\n            'type'    => 'switcher',\n            'title'       => '是否启用用户中心',\n            'after' => '<br><br>若选择开启，则前台将启用用户中心，用户中心中用户可进行修改个人资料、投稿等操作。',\n            'default' => false,\n        ),\n        array(\n            'id'      => 'UserCenterRegister',\n            'type'    => 'switcher',\n            'title'       => '前台是否显示注册按钮',\n            'after' => '<br><br>若选择开启，则前台将在登陆框旁显示注册按钮[在允许用户注册的前提下]<br><font color=red>需要注意的是仅在前台完成注册的用户才会拥有初始投稿权限，在后台完成注册的用户不具有投稿权限[初始管理员不受此影响]</font>',\n            'default' => false,\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'UserCenter_tips',\n            'type'        => 'textarea',\n            'title'       => '用户中心首页公告',\n            'after' => '填写本站的用户中心首页公告，不填则不显示',\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),  \n        array(\n            'type'    => 'heading',\n            'content' => '投稿相关',\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n    array(\n            'id'      => 'UserCenter_tougaoOpen',\n            'type'    => 'switcher',\n            'title'       => '是否允许用户自主投稿',\n            'after' => '<br><br>若选择开启，则前台用户中心将允许用户自主投稿<br><font color=red>拥有投稿权限不代表允许用户自主投稿，需拥有投稿权限的用户并且本项为启用状态下前台才会开放自主投稿</font>',\n            'default' => false,\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n     array(\n            'id'          => 'UserCenter_postcate',\n            'type'        => 'select',\n            'title'       => '用户可进行投稿的分类选择',\n            'chosen'      => true,\n            'multiple'    => true,\n            'sortable'    => true,\n            'ajax'        => false,\n            'options'     => 'category',\n            'placeholder' => '选择用户可进行投稿的分类',\n            'dependency' => array( 'UserCenterOpen|UserCenter_tougaoOpen', '==|==', 'true|true' ),\n        ), \n    array(\n            'id'          => 'UserCenter_tougaotips',\n            'type'        => 'textarea',\n            'title'       => '投稿须知',\n            'after' => '填写本站的投稿须知，比如让用户在投稿时需要注意些什么',\n            'dependency' => array( 'UserCenterOpen|UserCenter_tougaoOpen', '==|==', 'true|true' ),\n        ),  \n        array(\n            'type'    => 'heading',\n            'content' => '积分相关',\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'UserCenter_coin_name',\n            'type'     => 'text',\n            'title'    => '用户中心积分名称',\n            'after' => '填写用户中心积分的名称，如金币，不填则显示为积分',\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'UserCenter_coin_dw',\n            'type'     => 'text',\n            'title'    => '用户中心积分单位',\n            'after' => '填写用户中心积分的单位，如枚，一枚金币，不填则不显示单位',\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'UserCenter_sign',\n            'type'    => 'switcher',\n            'title'       => '是否启用每日签到',\n            'after' => '<br><br>若选择开启，则前台用户中心开启签到功能，可设置是否奖励积分。',\n            'default' => false,\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'UserCenter_sign_getCoin',\n            'type'    => 'switcher',\n            'title'       => '每日签到是否可获取积分',\n            'after' => '<br><br>若选择开启，则前台用户中心签到功能每次签到都将获取到所设置的区间内积分。',\n            'default' => false,\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'UserCenter_sign_min',\n            'type'        => 'number',\n            'title'       => '签到获得最小积分值',\n            'default'  => '1',\n            'max'      => 99999,\n            'min'      => 1,\n            'step'     => 1,\n            'after' => '<br><br>填写签到获得最小积分值，禁止为负数！',\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'UserCenter_sign_max',\n            'type'        => 'number',\n            'title'       => '签到获得最大积分值',\n            'default'  => '5',\n            'max'      => 99999999,\n            'min'      => 2,\n            'step'     => 1,\n            'after' => '<br><br>填写签到获得最大积分值，禁止为负数！',\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => '其他设置',\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'UserCenterRedirect',\n            'type'    => 'switcher',\n            'title'       => '是否只允许管理员进入管理后台',\n            'after' => '<br><br>若选择开启，则当已登录用户但非管理员身份访问后台时自动跳转至前台用户中心。',\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n            'default' => true,\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => '日常管理',\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),\n      array(\n            'type'    => 'content',\n            'content' => '<a id=\"sendtongzhi\" class=\"button button-primary csf--button add\">发送个人通知</a>',\n            'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n        ),   \n    array(\n                'id'    => 'UserCenter_tab',\n                'type'  => 'tabbed',\n                'title' => '',\n                'dependency' => array( 'UserCenterOpen', '==', 'true' ),\n                'tabs'  => array(\narray(\n                        'title'  => '头衔管理',\n                        'fields' => array(\n                            array(\n            'id'     => 'UserCenter_rank',\n            'type'   => 'group',\n            'title'  => '新增头衔',\n            'subtitle' => '您可以通过本项为所有注册的用户增加头衔设定，设定在两个数字区间为某个头衔，以此类推。',\n            'fields' => array(\n                array(\n        'id'    => 'UserCenter_rank_Note',\n        'type'  => 'text',\n        'title' => '标识',\n        'after' => '您可以给该头衔加个标注，该项仅后台可见~',\n      ),\n            array(\n            'id'          => 'UserCenter_rank_Name',\n            'type'        => 'text',\n            'title'       => '头衔名称',\n            ),\n            array(\n            'id'      => 'UserCenter_rank_Pic',\n            'title'   => '头衔图标',\n            'after' => '请上传或填写头衔图标直链，最佳尺寸为115x45，若该项为空，则直接显示头衔名称',\n'type'=> 'upload'\n        ),\n               array(\n            'id'          => 'UserCenter_rank_min',\n            'type'        => 'number',\n            'title'       => '头衔最小积分值',\n            'default'  => '0',\n            'after' => '<br><br>填写该头衔的最小积分值，禁止为负数！',\n        ),\n        array(\n            'id'          => 'UserCenter_rank_max',\n            'type'        => 'number',\n            'title'       => '头衔最大积分值',\n            'default'  => '99',\n            'after' => '<br><br>填写该头衔的最大积分值，禁止为负数！',\n        ),\n            ),\n        ),\n        \n        \n                            \n                        ),\n                    ),\n                    \n                    \n                    array(\n                        'title'  => '系统通知',\n                        'fields' => array(\n                            array(\n            'id'     => 'UserCenter_tongzhi',\n            'type'   => 'group',\n            'title'  => '系统通知',\n            'subtitle' => '您可以通过本项针对所有用户发送系统通知。',\n            'fields' => array(\n                array(\n        'id'    => 'UserCenter_tongzhi_Name',\n        'type'  => 'text',\n        'title' => '标识',\n        'after' => '您可以给该通知加个标注，该项仅后台可见~',\n      ),\n            array(\n            'id'          => 'UserCenter_tongzhi_title',\n            'type'        => 'text',\n            'title'       => '系统通知标题',\n            ),\n               array(\n            'id'          => 'UserCenter_tongzhi_date',\n            'type'        => 'date',\n            'title'       => '系统通知时间',\n            'default'  => date('m/d/Y',time()),\n            'after' => '选择系统通知时间',\n        ),\n        array(\n            'id'          => 'UserCenter_tongzhi_text',\n            'type'        => 'textarea',\n            'title'       => '系统通知内容',\n            'after' => '请填写系统通知内容',\n        ),\n            ),\n        ),\n        \n        \n                            \n                        ),\n                    ),\n\n                   \n                \n                array(\n                    'title'  => '用户查询',\n                        'fields' => array(\n                            array(\n                    'type' =>'content',\n                    'content' => '\n<div><input type=\"text\" id=\"usersearch\" placeholder=\"请输入关键词进行搜索\" autocomplete=\"off\" /></div>\n\n                   <table class=\"ui celled table\">\n  <thead>\n    <tr>\n      <th>用户UID</th>\n      <th>用户账号</th>\n      <th>用户昵称</th>\n      <th>用户邮箱</th>\n    <th>投稿文章数</th>\n      <th>用户组</th>\n      <th>'.$coin_name.'</th>\n      <th>投稿权限</th>\n      <th><font style=\"vertical-align: inherit;\">操作</font></th>\n    </tr>\n  </thead>\n  <tbody id=\"searchuser\" style=\"word-break:break-word\">\n  </tbody>\n</table>\n<div class=\"searchuserlist\">\n            </div>\n',\n                ),\n                    ),\n\n                ),\n                \n                \n                ),\n            ))));\n  \n  CSF::createSection( $prefix, array(\n    'title'  => '赞赏设置',\n    'icon'   => 'fas fa-donate',\n    'fields' => array(\n      array(\n            'id'      => 'RewardOpen',\n            'type'    => 'switcher',\n            'title'       => '赞赏功能',\n            'subtitle' => '若选择开启，则文章底部都将出现赞赏按钮用于支持作者。',\n            'default' => false,\n        ),\n        array(\n            'id'      => 'RewardOpen_tepass',\n            'type'    => 'switcher',\n            'title'       => '是否兼容Tepass打赏',\n            'subtitle' => '本项针对开启Tepass插件的用户['.$Tepass_check.']<br>若选择开启，则赞赏功能组件自动替换为Tepass插件来实现。',\n            'default' => false,\n            'dependency' => array( 'RewardOpen', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'RewardOpenAlipay',\n            'type'    => 'switcher',\n            'title'       => '支付宝赞赏',\n            'subtitle' => '若选择开启，则赞赏按钮将增加支付宝',\n            'default' => false,\n            'dependency' => array( 'RewardOpen', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'RewardOpenAlipayText',\n            'type'    => 'upload',\n\n            'title'    => '您的支付宝赞赏图片二维码',\n            'after' => '请上传您的支付宝赞赏图片二维码，尺寸建议300x300',\n            'dependency' => array( 'RewardOpen|RewardOpenAlipay', '==|==', 'true|true' ),\n        ),\n        array(\n            'id'      => 'RewardOpenWechat',\n            'type'    => 'switcher',\n            'title'       => '微信赞赏',\n            'subtitle' => '若选择开启，则赞赏按钮将增加微信',\n            'default' => false,\n            'dependency' => array( 'RewardOpen', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'RewardOpenWechatText',\n            'type'    => 'upload',\n            'title'    => '您的微信赞赏图片二维码',\n            'after' => '请上传您的微信赞赏图片二维码，尺寸建议300x300',\n            'dependency' => array( 'RewardOpen|RewardOpenWechat', '==|==', 'true|true' ),\n        ),\n        array(\n            'id'      => 'RewardOpenQQ',\n            'type'    => 'switcher',\n            'title'       => 'QQ赞赏',\n            'subtitle' => '若选择开启，则赞赏按钮将增加QQ',\n            'default' => false,\n            'dependency' => array( 'RewardOpen', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'RewardOpenQQText',\n            'type'    => 'upload',\n            'title'    => '您的QQ赞赏图片二维码',\n            'after' => '请上传您的QQ赞赏图片二维码，尺寸建议300x300',\n            'dependency' => array( 'RewardOpen|RewardOpenQQ', '==|==', 'true|true' ),\n        ),\n        array(\n            'id'      => 'RewardOpenPaypal',\n            'type'    => 'switcher',\n            'title'       => 'Paypal赞赏',\n            'subtitle' => '若选择开启，则赞赏按钮将增加Paypal',\n            'default' => false,\n            'dependency' => array( 'RewardOpen', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'RewardOpenPaypalText',\n            'type'     => 'text',\n            'title'    => '您的Paypal赞赏链接',\n            'after' => '请输入您的Paypal赞赏链接',\n            'dependency' => array( 'RewardOpen|RewardOpenPaypal', '==|==', 'true|true' ),\n        ),\n        array(\n            'id'      => 'RewardOpenAfdian',\n            'type'    => 'switcher',\n            'title'       => '爱发电赞赏',\n            'subtitle' => '若选择开启，则赞赏按钮将增加爱发电',\n            'default' => false,\n            'dependency' => array( 'RewardOpen', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'RewardOpenAfdianText',\n            'type'     => 'text',\n            'title'    => '您的爱发电赞赏链接',\n            'after' => '请输入您的爱发电赞赏链接',\n            'dependency' => array( 'RewardOpen|RewardOpenAfdian', '==|==', 'true|true' ),\n        ),\n        \n        \n        ),\n  ) );\n    if(file_exists(__TYPECHO_ROOT_DIR__.'/usr/themes/bearsimple/core/extend/vendor/maxmind-db/GeoLite2-City.mmdb')){\n            $max_tips = '<font color=green>maxmind-db目录已存在，无需下载</font>';\n        }\n        else{\n            $max_tips = '<font color=red>maxmind-db目录不存在</font>';\n        }\n  CSF::createSection( $prefix, array(\n    'title'  => '评论设置',\n    'icon'   => 'fas fa-comments',\n    'fields' => array(\n        array(\n            'id'      => 'CommentClose_Hide',\n            'type'    => 'switcher',\n            'title'       => '隐藏评论区',\n            'default' => false,\n            'subtitle'=>'开启本项后全局隐藏评论区，非普通独立页面[如留言、朋友圈不在本项影响范围中]'\n        ),\n      array(\n            'id'          => 'comment_choose',\n            'type'        => 'select',\n            'title'       => '选择评论系统',\n            'subtitle' => '您可以自由选择使用原生评论系统或第三方评论系统',\n            'options'     => array('1' => '原生评论',  '2' => 'Artalk'),\n            'default' => '1',\n        ), \n        array(\n            'id'          => 'artalk_backend',\n            'type'        => 'text',\n            'title'       => 'Artalk后端地址',\n            'subtitle'=>'请填写Artalk后端地址，确认后端地址填写对只需访问 您填写的后端地址/dist/Artalk.css，只要能正常访问到css即填写正确~~',\n            'dependency' => array( 'comment_choose', '==', '2' ),\n            ),\n            array(\n            'id'          => 'artalk_sitename',\n            'type'        => 'text',\n            'title'       => 'Artalk站点名称',\n            'subtitle'=>'请填写Artalk站点名称，站点名称为您在Artalk后台添加站点时所填写的站点名',\n            'dependency' => array( 'comment_choose', '==', '2' ),\n            ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '以下为原生评论专属选项',\n        ),\n        array(\n            'id'      => 'CommentClose',\n            'type'    => 'switcher',\n            'title'       => '文章评论全局开关',\n            'default' => true,\n            'subtitle'=>'若为禁用，则网站全局评论功能都将关闭'\n        ),\n        array(\n            'id'      => 'CommentDesc',\n            'type'    => 'switcher',\n            'title'       => '文章评论列表是否放置在评论表单上面',\n            'default' => false,\n            'subtitle'=>'若启用，评论表单将显示在评论列表下方'\n        ),\n        array(\n            'id'      => 'Emoji',\n            'type'    => 'switcher',\n            'title'       => '评论表情',\n            'default' => false,\n            'subtitle'=>'若开启评论表情，则前台文章评论区将显示表情按钮'\n        ),\n        array(\n            'id'      => 'Emoji_Diy',\n            'type'    => 'switcher',\n            'title'       => '是否添加自定义表情',\n            'default' => false,\n            'subtitle'=>'开启后请填写自定义表情json文件地址',\n            'dependency' => array( 'Emoji', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'Emoji_DiyUrl',\n            'type'     => 'text',\n            'title'    => '自定义表情json文件地址',\n            'after' => '请填写自定义表情json文件地址，遵循格式:<br>\n            <pre><code>[\n            {\n\t\t\"icon\": \"图片地址\",\n\t\t\"data\": \"输出的表情识别符，如:@(开心)，每个表情一个识别符，请勿重复\",\n\t\t\"text\": \"该表情所表达的意思，如开心\",\n\t\t\"category\": \"表情分类名\"\n\t},{\n\t\t\"icon\": \"图片地址\",\n\t\t\"data\": \"输出的表情识别符，如:@(生气)，每个表情一个识别符，请勿重复\",\n\t\t\"text\": \"该表情所表达的意思，如生气\",\n\t\t\"category\": \"表情分类名\"\n\t},{\n\t\t\"icon\": \"图片地址\",\n\t\t\"data\": \"输出的表情识别符，如:@(难过)，每个表情一个识别符，请勿重复\",\n\t\t\"text\": \"该表情所表达的意思，如难过\",\n\t\t\"category\": \"表情分类名\"\n\t}\n]</code></pre>',\n\t'dependency' => array( 'Emoji|Emoji_Diy', '==|==', 'true|true' ),\n        ),\n        array(\n            'id'      => 'Emoji_HideDefault',\n            'type'    => 'switcher',\n            'title'       => '是否隐藏默认内置表情',\n            'default' => false,\n            'subtitle'=>'开启后将隐藏默认的内置表情',\n            'dependency' => array( 'Emoji|Emoji_Diy', '==|==', 'true|true' ),\n        ),\n        array(\n            'id'      => 'Comment_like',\n            'type'    => 'switcher',\n            'title'       => '评论是否开启点赞',\n            'default' => false,\n            'subtitle'=>'开启点赞后评论区每条评论都将显示点赞按钮，<font color=red>本项应用范围包含时光机的动态</font>'\n        ),\n        array(\n            'id'      => 'Comment_useragent',\n            'type'    => 'switcher',\n            'title'       => '评论是否显示UserAgent',\n            'default' => false,\n            'subtitle'=>'开启后将显示评论者使用的浏览器和操作系统图标，<font color=red>本项应用范围包含时光机的动态</font>'\n        ),\n        \n        array(\n            'id'      => 'Comment_ipget',\n            'type'    => 'switcher',\n            'title'       => '评论是否显示IP属地',\n            'default' => false,\n            'subtitle'=>'若开启，则评论区每个评论者都将显示IP属地。<br><font color=red>开启本功能需下载maxmind-db数据库，<a href=\"https://extensions.typecho.co.uk/addons/maxmind-db.zip\">戳这里下载</a>，将压缩包中的maxmind-db目录放入/usr/themes/bearsimple/core/extend/vendor/中即可</font><br>检测：'.$max_tips\n        ),\n        array(\n            'id'      => 'Comment_ipget_data',\n            'type'    => 'switcher',\n            'title'       => '是否使用IP属地信息最新数据',\n            'default' => false,\n            'subtitle'=>'若启用将在新评论使用IP属地信息在线数据库对访客IP地理位置进行查询，因使用的是API查询，可能因网络因素导致影响评论速度！若为禁用，则使用主题内置IP属地数据库进行查询。',\n            'dependency' => array( 'Comment_ipget', '==', 'true' ),\n        ),\n    array(\n            'id'          => 'Comment_ipget_data_choose',\n            'type'        => 'select',\n            'title'       => '选择IP属地信息最新数据源',\n            'after' => '请选择IP属地信息最新数据源，默认为ZXINC，若选择腾讯位置服务请填写应用KEY。',\n            'options'     => array('1' => 'ZXINC',  '2' => '腾讯位置服务'),\n            'default' => '1',\n            'dependency' => array('Comment_ipget|Comment_ipget_data', '==|==', 'true|true' ),\n        ),\n        \n    array(\n            'id'          => 'Comment_ipget_data_tencent_key',\n            'type'        => 'text',\n            'title'       => '腾讯位置服务应用KEY',\n            'subtitle'=>'请填写腾讯位置服务应用KEY，请确保填写的KEY准确无误，否则将影响部分组件运行！',\n            'dependency' => array('Comment_ipget|Comment_ipget_data|Comment_ipget_data_choose', '==|==|==', 'true|true|2' ),\n            ),\n         array(\n            'id'          => 'Comment_ipget_data_tencent_sign',\n            'type'        => 'text',\n            'title'       => '腾讯位置服务应用Secret key[校验签名]',\n            'subtitle'=>'若选择了签名校验，请填写Secret key（ SK ）！',\n            'dependency' => array('Comment_ipget|Comment_ipget_data|Comment_ipget_data_choose', '==|==|==', 'true|true|2' ),\n            ),   \n            \n        array(\n            'id'      => 'Comment_islogin',\n            'type'    => 'switcher',\n            'title'       => '评论区显示已登录者信息',\n            'default' => true,\n            'subtitle'=>'若开启，则在登录后评论区显示已登录者信息。'\n        ),\n        array(\n            'id'      => 'Comment_showmail',\n            'type'    => 'switcher',\n            'title'       => '当邮箱非必填时是否隐藏邮箱输入框',\n            'default' => false,\n            'subtitle'=>'若开启，则评论区隐藏邮箱输入框，需要注意的是当邮箱设置非必填时系统会自动为没填写邮箱的评论者自动生成一个邮箱，以便回复可见可正常使用。'\n        ),\n        array(\n            'id'      => 'Comment_showurl',\n            'type'    => 'switcher',\n            'title'       => '当网址非必填时是否隐藏博客网址输入框',\n            'default' => false,\n            'subtitle'=>'若开启，则评论区隐藏博客网址输入框。'\n        ),\n        array(\n            'id'      => 'Comment_private',\n            'type'    => 'switcher',\n            'title'       => '是否启用私密评论',\n            'default' => false,\n            'subtitle'=>'若开启，则评论区允许提交私密评论，仅登录用户和评论双方可见。'\n        ),\n        array(\n            'id'      => 'Comment_tips',\n            'type'    => 'switcher',\n            'title'       => '是否显示评论提示',\n            'default' => true,\n            'subtitle'=>'若开启，则评论区“我要评论”字旁增加一个提示，默认提示为本博客使用Cookie技术保留信息，若继续评论则表示同意条款。'\n        ),\n        array(\n            'id'       => 'Comment_tips_text',\n            'type'     => 'textarea',\n            'title'    => '评论提示内容',\n            'after' => '请输入评论提示内容',\n            'default' => '本博客使用Cookie技术保留您的个人信息以方便您能够在下一次快速评论，继续评论表示您已同意该条款',\n            'dependency' => array( 'Comment_tips', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'Comment_placeholder',\n            'type'     => 'text',\n            'title'    => '评论文本框占位符',\n            'after' => '请输入评论文本框占位符，即在评论区评论框在还没有文字时显示的文字，可留空，留空则显示默认占位符',\n            'default' => '嘿~ 大神，别默默的看了，快来点评一下吧',\n        ),\n        \n        //评论电邮通知\n        array(\n            'type'    => 'heading',\n            'content' => '评论电邮通知设置',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '主题已内置评论电邮通知功能，您可以通过开启该功能实现评论后邮件推送<font color=red>[在此之前您需要在SMTP设置中开启SMTP服务并填写SMTP信息]</font>',\n        ),\n        array(\n            'id'      => 'CommentNotify__Open',\n            'type'    => 'switcher',\n            'title'       => '评论电邮通知',\n            'default' => false,\n            'subtitle'=>'若选择开启，则评论区的评论回复动作都可以通过邮件形式推送。',\n        ),\n        array(\n            'id'       => 'CommentNotify__AcceptMailAddress',\n            'type'     => 'text',\n            'title'    => '接收邮件的地址',\n            'after' => '接收邮件的地址,如为空则使用文章作者个人设置中的邮件地址',\n            'dependency' => array( 'CommentNotify__Open', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'CommentNotify__TemplateContact',\n            'type'     => 'text',\n            'title'    => '模板中“联系我”的邮件地址',\n            'after' => '联系我用的邮件地址,如为空则使用文章作者个人设置中的邮件地址',\n            'dependency' => array( 'CommentNotify__Open', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'CommentNotify__NotifySetting',\n            'type'    => 'checkbox',\n            'title'   => '提醒设置',\n            'inline'  => true,\n            'options' => array('approved' => '提醒已通过评论','waiting' => '提醒待审核评论','spam' => '提醒垃圾评论'),\n            'subtitle'=>'该选项仅针对博主，访客只发送已通过的评论。',\n            'default' => '1',\n            'dependency' => array( 'CommentNotify__Open', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'CommentNotify__OtherSetting',\n            'type'    => 'checkbox',\n            'title'   => '其他设置',\n            'options' => array('1' => '有评论及回复时，发邮件通知博主','2' => '评论被回复时，发邮件通知评论者','3' => '自己回复自己的评论时，发邮件通知。(同时针对博主和访客)','4' => '记录发送日志'),\n            'subtitle'=>'根据自身实际情况进行勾选，若勾选记录发送日志，日志文件在<code style=\"word-break:break-all\">/usr/plugins/BsCore/log/</code>，当发送邮件较多时文件体积也会随之增大。',\n            'default' => '1',\n            'dependency' => array( 'CommentNotify__Open', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'CommentNotify__Author',\n            'type'     => 'text',\n            'title'    => '博主接收邮件标题',\n            'after' => '{title}为可调用变量，您可以自定义博主接收邮件时的邮件标题',\n            'default'=> '[{title}] 一文有新的评论',\n            'dependency' => array( 'CommentNotify__Open', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'CommentNotify__Reader',\n            'type'     => 'text',\n            'title'    => '访客接收邮件标题',\n            'after' => '{title}为可调用变量，您可以自定义访客接收邮件时的邮件标题',\n            'default'=> '您在 [{title}] 的评论有了回复',\n            'dependency' => array( 'CommentNotify__Open', '==', 'true' ),\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => '评论过滤设置',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '默认强制性过滤全空格评论、包含XSS危险内容评论，其余需过滤内容您可以通过开启智能过滤或开启评论过滤高级设置进行设置。',\n        ),\n        array(\n            'id'      => 'BearSpam_Auto',\n            'type'    => 'switcher',\n            'title'       => '智能过滤[Beta]',\n            'default' => false,\n            'subtitle'=>'您可以通过开启智能过滤来对机器人评论进行拦截，不过请注意:<font color=red>该功能还处于Beta测试阶段，可能出现误拦截的情况</font>',\n        ),\n        array(\n            'id'      => 'BearSpam_Pro',\n            'type'    => 'switcher',\n            'title'       => '评论过滤高级设置',\n            'default' => false,\n            'subtitle'=>'您可以通过开启高级设置对评论区的评论提交做更深层次的过滤。'\n        ),\n        array(\n            'id'       => 'BearSpam_IP',\n            'type'     => 'textarea',\n            'title'    => '过滤IP',\n            'after' => '多条IP请用换行符隔开<br />支持用*号匹配IP段，如：192.168.*.*',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'BearSpam_EMAIL',\n            'type'     => 'textarea',\n            'title'    => '过滤邮箱',\n            'after' => '多个邮箱请用换行符隔开<br />可以是邮箱的全部，或者邮箱部分关键词',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'BearSpam_URL',\n            'type'     => 'textarea',\n            'title'    => '过滤网址',\n            'after' => '多个网址请用换行符隔开<br />可以是网址的全部，或者网址部分关键词。如果网址为空，该项不会起作用',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'BearSpam_ArticleTitle',\n            'type'     => 'select',\n            'title'    => '过滤含有文章标题的评论',\n            'options'  => array('1' => '是',  '2' => '否'),\n            'after' => '根据研究表明机器人发表的内容可能含有评论文章的标题',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'BearSpam_NAME',\n            'type'     => 'textarea',\n            'title'    => '过滤昵称',\n            'after' => '如果评论发布者的昵称含有该关键词，将执行该操作，多个请直接换行',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'BearSpam_NAMEMIN',\n            'type'     => 'number',\n            'title'    => '昵称允许的最短长度',\n            'unit'     => '个字',\n            'subtitle' => '如果评论发布者的昵称小于该最短长度将拦截',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'BearSpam_NAMEMAX',\n            'type'     => 'number',\n            'title'    => '昵称允许的最长长度',\n            'unit'     => '个字',\n            'subtitle' => '如果评论发布者的昵称大于该最长长度将拦截',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'BearSpam_NAMEURL',\n            'type'     => 'select',\n            'title'    => '过滤昵称为网址的评论',\n            'options'  => array('1' => '是',  '2' => '否'),\n            'after' => '根据研究表明机器人发表的评论，昵称很有可能为网址',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'BearSpam_Chinese',\n            'type'     => 'select',\n            'title'    => '过滤不包含中文的评论',\n            'options'  => array('1' => '是',  '2' => '否'),\n            'after' => '当评论内容中没有中文时进行拦截',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'BearSpam_MIN',\n            'type'     => 'number',\n            'title'    => '评论内容允许的最短长度',\n            'unit'     => '个字',\n            'subtitle' => '如果评论发布者的评论内容小于该最短长度将拦截',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'BearSpam_MAX',\n            'type'     => 'number',\n            'title'    => '评论内容允许的最长长度',\n            'unit'     => '个字',\n            'subtitle' => '如果评论发布者的评论内容大于该最长长度将拦截',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'BearSpam_Words',\n            'type'     => 'textarea',\n            'title'    => '过滤敏感词',\n            'after' => '多个词汇请用换行符隔开',\n            'dependency' => array( 'BearSpam_Pro', '==', 'true' ),\n        ),\n    )\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'  => 'SMTP设置',\n    'icon'   => 'far fa-envelope',\n    'fields' => array(\n        array(\n            'id'      => 'Smtp_open',\n            'type'    => 'switcher',\n            'title'       => '是否启用SMTP服务',\n            'after' => '<br><br>若启用则全局开启SMTP服务，该服务用于评论电邮通知、友链提交审核通知等。另外有几点需要注意：<br><font color=red>1、建议使用PHP8，PHP7可能出现无法正常发送邮件的问题<br>2、邮件发送若频率过高可能因所使用的邮箱服务所限制的发送频率而导致发信失败<br>3、若使用了CDN且开启了部分CDN缓存规则或全局缓存也有可能（有一定几率）导致发信失败</font>',\n            'default' => false,\n        ),\n         array(\n            'id'      => 'CommentNotify__testmail',\n            'type'    => 'content',\n            'title'       => '邮件发送测试',\n            'content'=>$mail_html,\n            'dependency' => array( 'Smtp_open', '==', 'true' ),\n            \n        ),\n        array(\n            'id'      => 'CommentNotify__template',\n            'type'    => 'content',\n            'title'       => '邮件发送模板修改',\n            'content'=> '<a href=\"extending.php?panel=BsCore/pages/panel.php&act=editemailtemplates\" class=\"button button-primary csf--button\" target=\"_blank\">戳这里修改邮件模板</a><br><br><font color=red>若修改邮件模板，请在后续主题版本升级前备份邮件模板，避免被覆盖！</font>',\n            'dependency' => array( 'Smtp_open', '==', 'true' ),\n            \n        ),\n        array(\n            'id'      => 'CommentNotify__Sendway',\n            'type'    => 'radio',\n            'title'   => '发信方式',\n            'subtitle'=>'请选择发信方式',\n            'inline'  => true,\n            'options' => array('smtp'=> 'SMTP'),\n            'default' => 'smtp',\n            'dependency' => array( 'Smtp_open', '==', 'true' ),\n        ),\n         array(\n            'id'       => 'CommentNotify__Address',\n            'type'     => 'text',\n            'title'    => '发信服务器地址',\n            'after' => '请输入发信服务器地址，如smtp.qq.com',\n            'dependency' => array( 'Smtp_open', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'CommentNotify__Port',\n            'type'     => 'text',\n            'title'    => '发信服务器端口',\n            'after' => '请输入发信服务器端口，也就是SMTP服务端口，一般为465或587',\n            'dependency' => array( 'Smtp_open', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'CommentNotify__Username',\n            'type'     => 'text',\n            'title'    => '发信邮箱账号',\n            'after' => '请输入发信邮箱账号，也就是SMTP账号，一般就是邮箱地址，如xxx@xxx.com',\n            'dependency' => array( 'Smtp_open', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'CommentNotify__Password',\n            'type'     => 'text',\n            'title'    => '发信邮箱密码',\n            'after' => '请输入发信邮箱密码，也就是SMTP密码，一般就是邮箱密码，若QQ邮箱则为授权码',\n            'dependency' => array( 'Smtp_open', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'CommentNotify__Verify',\n            'type'    => 'checkbox',\n            'title'   => '发信验证',\n            'inline'  => true,\n            'options' => array('true' => '服务器需要验证'),\n            'subtitle'=>'一般情况下都是勾选的。',\n            'default' => 'true',\n            'dependency' => array( 'Smtp_open', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'CommentNotify__VerifyWay',\n            'type'    => 'radio',\n            'title'   => '验证方式',\n            'subtitle'=>'请选择发信验证方式',\n            'inline'  => true,\n            'options' => array('ssl'=> 'SSL加密验证', 'tls'=> 'TLS加密验证', 'none'=> '无验证'),\n            'default' => 'ssl',\n            'dependency' => array( 'Smtp_open', '==', 'true' ),\n        ),\n        \n        array(\n            'id'       => 'CommentNotify__SenderName',\n            'type'     => 'text',\n            'title'    => '发信人名称',\n            'after' => '发信人名称，留空则使用博客标题',\n            'dependency' => array( 'Smtp_open', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'CommentNotify__SenderForm',\n            'type'     => 'text',\n            'title'    => '发信人邮箱',\n            'after' => '发信人邮箱，为空则使用发信邮箱账号',\n            'dependency' => array( 'Smtp_open', '==', 'true' ),\n        ),\n        )\n  ) );\n  Typecho_Widget::widget('Widget_Stat')->to($stat);\n       $sync_api = Common::url('syncData',Options::alloc()->index);\n\n        $sync_htmls = '<div id=\"sync1\" class=\"button button-primary csf--button\" style=\"margin:5px\">一键同步并启用所有文章的知识共享协议</div> <div id=\"sync2\" class=\"button button-primary csf--button\"style=\"margin:5px\">一键同步关闭所有文章的知识共享协议</div>\n        <script>\n        document.getElementById(\"sync1\").onclick = function(){\n        $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: \"'.$sync_api.'\",\n                        data: {\n                            \"action\":\"openCopyright\",\n                            \"type\":$(\"select[name=\\'bearsimple[article_copyrightopen_type]\\']\").val(),\n                        },\n                        dataType: \"json\",\n                        success: function(data) {\n        json = JSON.parse(JSON.stringify(data));\nswitch(json.code)\n{\ncase 1:\ntoastr.success(\"知识共享协议更改同步完成\",json.msg);\nbreak;\ncase 0:\ntoastr.warning(json.msg);\nbreak;\n}\n}\n        })}\n        \n        document.getElementById(\"sync2\").onclick = function(){\n        $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: \"'.$sync_api.'\",\n                        data: {\n                            \"action\":\"closeCopyright\"\n                        },\n                        dataType: \"json\",\n                        success: function(data) {\n        json = JSON.parse(JSON.stringify(data));\nswitch(json.code)\n{\ncase 1:\ntoastr.success(\"所有文章的知识共享协议已同步关闭\",json.msg);\nbreak;\ncase 0:\ntoastr.warning(json.msg);\nbreak;\n}\n}\n        })}\n        </script>\n        \n        ';\n        \n        $sync_htmls2 = '<div id=\"sync_hot1\" class=\"button button-primary csf--button\" style=\"margin:5px\">一键同步启用所有文章的文章热度</div> <div id=\"sync_hot2\" class=\"button button-primary csf--button\"style=\"margin:5px\">一键同步关闭所有文章的文章热度</div>\n        <script>\n        document.getElementById(\"sync_hot1\").onclick = function(){\n        $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: \"'.$sync_api.'\",\n                        data: {\n                            \"action\":\"openHot\",\n                        },\n                        dataType: \"json\",\n                        success: function(data) {\n        json = JSON.parse(JSON.stringify(data));\nswitch(json.code)\n{\ncase 1:\ntoastr.success(\"文章热度已全部启用完成\",json.msg);\nbreak;\ncase 0:\ntoastr.warning(json.msg);\nbreak;\n}\n}\n        })}\n        \n        document.getElementById(\"sync_hot2\").onclick = function(){\n        $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: \"'.$sync_api.'\",\n                        data: {\n                            \"action\":\"closeHot\"\n                        },\n                        dataType: \"json\",\n                        success: function(data) {\n        json = JSON.parse(JSON.stringify(data));\nswitch(json.code)\n{\ncase 1:\ntoastr.success(\"文章热度已全部关闭完成\",json.msg);\nbreak;\ncase 0:\ntoastr.warning(json.msg);\nbreak;\n}\n}\n        })}\n        </script>\n        \n        ';\n$sync_htmls3 = '<div id=\"sync_tag1\" class=\"button button-primary csf--button\" style=\"margin:5px\">一键同步启用所有文章的文章标签</div> <div id=\"sync_tag2\" class=\"button button-primary csf--button\"style=\"margin:5px\">一键同步关闭所有文章的文章标签</div>\n        <script>\n        document.getElementById(\"sync_tag1\").onclick = function(){\n        $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: \"'.$sync_api.'\",\n                        data: {\n                            \"action\":\"openTag\",\n                        },\n                        dataType: \"json\",\n                        success: function(data) {\n        json = JSON.parse(JSON.stringify(data));\nswitch(json.code)\n{\ncase 1:\ntoastr.success(\"文章标签已全部启用完成\",json.msg);\nbreak;\ncase 0:\ntoastr.warning(json.msg);\nbreak;\n}\n}\n        })}\n        \n        document.getElementById(\"sync_tag2\").onclick = function(){\n        $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: \"'.$sync_api.'\",\n                        data: {\n                            \"action\":\"closeTag\"\n                        },\n                        dataType: \"json\",\n                        success: function(data) {\n        json = JSON.parse(JSON.stringify(data));\nswitch(json.code)\n{\ncase 1:\ntoastr.success(\"文章标签已同步关闭完成\",json.msg);\nbreak;\ncase 0:\ntoastr.warning(json.msg);\nbreak;\n}\n}\n        })}\n        </script>\n        \n        ';        \n        \n  CSF::createSection( $prefix, array(\n    'title'  => '文章设置',\n    'icon'   => 'fas fa-file-alt',\n    'fields' => array(\n        array(\n            'id'      => 'articleMetaShows',\n            'type'    => 'checkbox',\n            'title'   => '文章元信息显示',\n            'inline'  => true,\n            'subtitle'=>'可勾选文章页面要显示的元信息，即文章标题下方的文章信息栏（仅文章有效，独立页面不受此项影响）',\n            'options' => array('author' => '作者名',  'time' => '发表时间','category' => '分类'),\n            'default' => array('author','time','category'),\n        ),\n      array(\n            'id'      => 'Share',\n            'type'    => 'switcher',\n            'title'       => '第三方分享',\n            'default' => false,\n            'subtitle'=>'若选择开启,则文章页面都将显示第三方分享按钮，可自定义选择显示哪个。'\n        ),\n        array(\n            'id'      => 'Shares',\n            'type'    => 'checkbox',\n            'title'   => '选择要显示的第三方分享途径',\n            'inline'  => true,\n            'options' => array('qq' => 'QQ',  'qzone' => 'QQ空间','weibo' => '微博','facebook' => 'Facebook','twitter' => 'Twitter','google' => 'Google','linkedin' => 'Linkedin','wechat'=> '微信'),\n            'dependency' => array( 'Share', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'Scroll',\n            'type'    => 'switcher',\n            'title'       => '文章目录树',\n            'default' => false,\n            'subtitle'=>'若选择开启,则文章页面自动识别h1-h6标签，当存在时自动生成目录树<br><font color=red>默认开启文章内目录树，请选择是否开启侧边栏目录树。</font>'\n        ),\n        array(\n            'id'      => 'Scroll_Sidebar',\n            'type'    => 'switcher',\n            'title'       => '侧边栏文章目录树',\n            'default' => false,\n            'subtitle'=>'若选择开启,则文章页面侧边栏将显示目录树，与文章内目录树不冲突，可同步开启。',\n            'dependency' => array( 'Scroll', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'articleFontDefault',\n            'type'        => 'radio',\n            'title'       => '文章默认字体',\n            'inline'  => true,\n            'subtitle' => '前台默认允许访客自行切换字体，但在此之前可选择默认展现的字体',\n            'options'     => array('1' => '默认', '2' => '楷体','3'=>'霞鹜文楷体'),\n            'default' => '1',\n        ),  \n        array(\n            'id'      => 'Like',\n            'type'    => 'switcher',\n            'title'       => '文章点赞',\n            'default' => false,\n            'subtitle'=>'选择开启则文章下方显示点赞按钮'\n        ),\n        array(\n            'id'      => 'Readmode',\n            'type'    => 'switcher',\n            'title'       => '文章阅读模式',\n            'default' => false,\n            'subtitle'=>'选择开启则文章显示阅读模式入口，给予读者一个纯净的阅读体验'\n        ),\n        array(\n            'id'      => 'Readmode_Auto',\n            'type'    => 'switcher',\n            'title'       => '访问文章页面是否自动进入阅读模式',\n            'default' => false,\n            'subtitle'=>'选择开启则当访问文章时自动进入阅读模式，仅文章页面有效，独立页面场景下本设置无效，需要注意的是当文章为密码文章时需验证密码后才能触发该功能',\n            'dependency' => array( 'Readmode', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'pageContent',\n            'type'    => 'switcher',\n            'title'       => '文章分页模式',\n            'default' => false,\n            'subtitle'=>'选择开启则文章内容适当处插入----------后进行内容分页，需要注意的是开启文章分页模式会影响SEO，请谨慎开启!'\n        ),\n        array(\n            'id'      => 'infinite_scroll',\n            'type'    => 'switcher',\n            'title'       => '文章无限加载模式',\n            'default' => false,\n            'subtitle'=>'开启后文章列表输出页面的分页将替换为无限加载按钮，点击按钮将继续加载后面的文章。'\n        ),\n\n        array(\n            'id'       => 'infinite_pageSize',\n            'type'     => 'spinner',\n            'title'    => '文章每一次的加载篇数',\n            'subtitle' => '您目前的文章总数为<font color=\"red\">'.$stat->publishedPostsNum.'</font>篇，加载篇数不可超过或等于文章总数。',\n            'max'      => $stat->publishedPostsNum - 1,\n            'min'      => 1,\n            'step'     => 1,\n            'default'  => Helper::options()->pageSize,\n            'dependency' => array( 'infinite_scroll', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'history_Today',\n            'type'    => 'switcher',\n            'title'       => '那年今日',\n            'default' => false,\n            'subtitle'=>'开启后文章页面会出现那年今日组件，显示历史上的今天或在发布时间后面的年份同月同日所发的文章，当无文章时自动隐藏[仅文章页面，独立页面不显示]。'\n        ),\n        \n        array(\n            'id'       => 'history_Today_Limit',\n            'type'     => 'spinner',\n            'title'    => '那年今日文章篇数',\n            'subtitle' => '可限制那年今日所显示的文章篇数，默认为5篇。',\n            'max'      => '999999',\n            'min'      => 1,\n            'step'     => 1,\n            'default'  => 5,\n            'dependency' => array( 'history_Today', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'more_posts',\n            'type'    => 'switcher',\n            'title'       => '随机文章',\n            'default' => false,\n            'subtitle'=>'开启后文章页面会出现随机文章组件，显示最多十篇随机文章[仅文章页面，独立页面不显示]。'\n        ),\n        array(\n            'id'      => 'more_posts_archive',\n            'type'    => 'switcher',\n            'title'       => '当搜索无结果时显示本组件',\n            'default' => false,\n            'subtitle'=>'开启后除了文章页面外，在搜索关键词没有结果时也显示猜您想看。',\n            'dependency' => array( 'more_posts', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'article_blank',\n            'type'    => 'switcher',\n            'title'       => '文章新窗口打开',\n            'default' => false,\n            'subtitle'=>'开启后首页、分类等输出文章列表页面打开文章均为新窗口打开。'\n        ),\n        array(\n            'id'      => 'article_imgalt',\n            'type'    => 'switcher',\n            'title'       => '文章图片描述显示',\n            'default' => false,\n            'subtitle'=>'开启后文章图片的描述将以小字样式显示在图片下方。'\n        ),\n        array(\n            'id'      => 'article_copyrightopen',\n            'type'    => 'switcher',\n            'title'       => '文章是否默认开启知识共享协议声明',\n            'default' => false,\n            'subtitle'=>'开启后文章发布不需要再自行开启知识共享协议声明，您在设置后所发布的文章都将自动开启知识共享协议声明，下面可自行选择需要默认显示的知识共享协议类型。'\n        ),\n        array(\n            'id'       => 'article_copyrightopen_type',\n            'type'     => 'select',\n            'title'    => '知识共享协议类型',\n            'options'  => array(\n                        'one' => '知识共享署名 4.0 国际许可协议',\n                        'two' => '知识共享署名-非商业性使用 4.0 国际许可协议',\n                        'three' => '知识共享署名-禁止演绎 4.0 国际许可协议',\n                        'four' => '知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议',\n                        'five' => '知识共享署名-相同方式共享 4.0 国际许可协议',\n                        'six' => '知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议',\n                    ),\n            'default'=> 'one',\n            'dependency' => array( 'article_copyrightopen', '==', 'true' ),\n            'after' => '选择知识共享协议类型',\n        ),\n        array(\n            'id'      => 'article_copyrightopen_sync',\n            'type'    => 'content',\n            'title'       => '一键同步',\n            'content'=>$sync_htmls,\n            'dependency' => array( 'article_copyrightopen', '==', 'true' ),\n            \n        ),\n        array(\n            'id'      => 'article_hotopen',\n            'type'    => 'switcher',\n            'title'       => '文章是否默认开启文章热度',\n            'default' => false,\n            'subtitle'=>'开启后文章发布不需要再自行开启文章热度，您在设置后所发布的文章都将自动开启文章热度。'\n        ),\n        array(\n            'id'      => 'article_hotopen_sync',\n            'type'    => 'content',\n            'title'       => '一键同步',\n            'content'=>$sync_htmls2,\n            'dependency' => array( 'article_hotopen', '==', 'true' ),\n            \n        ),\n        array(\n            'id'      => 'article_tagopen',\n            'type'    => 'switcher',\n            'title'       => '文章是否默认开启文章标签',\n            'default' => false,\n            'subtitle'=>'开启后文章发布不需要再自行开启文章标签，您在设置后所发布的文章都将自动开启文章标签。'\n        ),\n        array(\n            'id'      => 'article_tagopen_sync',\n            'type'    => 'content',\n            'title'       => '一键同步',\n            'content'=>$sync_htmls3,\n            'dependency' => array( 'article_tagopen', '==', 'true' ),\n            \n        ),\n         array(\n            'id'      => 'article_textindent',\n            'type'    => 'switcher',\n            'title'       => '文章是否默认自动段落首行缩进',\n            'default' => false,\n            'after'=>'<br><br>开启后文章段落首行都将自动强制缩进。'\n        ),\n        array(\n            'id'      => 'article_videoExt',\n            'type'    => 'checkbox',\n            'title'   => '文章播放器短代码可选扩展',\n            'after' => '这里支持自行选择文章播放器短代码需要开启的扩展。',\n            'inline'  => true,\n            'options' => array(\n                'ext_hls' => 'HLS扩展支持',\n                'ext_flv' => 'FLV扩展支持',\n            ),\n        \n        ),\n    )\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'  => '图片设置',\n    'icon'   => 'fas fa-image',\n    'fields' => array(\n      array(\n            'type'    => 'heading',\n            'content' => '图片水印',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '本主题内置图片水印功能，您可以通过以下设置对前台文章输出的图片进行水印处理。',\n        ),\n        array(\n            'id'      => 'Watermark',\n            'type'    => 'switcher',\n            'title'       => '文章图片水印',\n            'default' => false,\n            'subtitle'=>'开启后可对本功能进行详细设置，前台输出图片时自动打上水印'\n        ),\n        array(\n            'id'       => 'WatermarkType',\n            'type'     => 'select',\n            'title'    => '水印类型',\n            'options'  => array('1' => '文字',  '2' => '图片'),\n            'default'=> '1',\n            'dependency' => array( 'Watermark', '==', 'true' ),\n            'after' => '选择要打上什么样式的水印，若选择图片方式的话在非当前域名下可能存在跨域方面的问题，需自行根据服务器情况设置',\n        ),\n        array(\n            'id'       => 'waterMarkName',\n            'type'     => 'text',\n            'title'    => '水印文字/图片地址',\n            'subtitle' => '若水印类型选择的是文本，则填写文字，若选择的是图片，则请填写图片直链',\n            'dependency' => array( 'Watermark', '==', 'true' ),\n            ),\n            array(\n            'id'       => 'waterMarkKd',\n            'type'     => 'number',\n            'title'    => '水印宽度',\n            'default'=> '130',\n            'unit'     => 'px',\n            'subtitle' => '填写水印宽度，填写数字即可，默认则为130',\n            'dependency' => array( 'Watermark', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'waterMarkTextSize',\n            'type'     => 'number',\n            'title'    => '水印文字大小',\n            'default'=> '12',\n            'unit'     => 'px',\n            'subtitle' => '[仅当水印类型为文字的时候本项有效]<br>填写水印文字大小，单位是px，填写数字即可，默认则为12',\n            'dependency' => array( 'Watermark', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'waterMarkTextColor',\n            'type'     => 'text',\n            'title'    => '水印文字颜色',\n            'default'=> 'white',\n            'subtitle' => '[仅当水印类型为文字的时候本项有效]<br>填写水印文字颜色，可以是HEX或者RGBA 颜色代码，举个最简单的例子，比如填white，则为白色，black则为黑色',\n            'dependency' => array( 'Watermark', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'waterMarkTextBackground',\n            'type'     => 'text',\n            'title'    => '水印文字背景颜色',\n            'default'=> 'black',\n            'subtitle' => '[仅当水印类型为文字的时候本项有效]<br>填写水印文字背景颜色，可以是HEX或者RGBA 颜色代码，举个最简单的例子，比如填white，则为白色，black则为黑色',\n            'dependency' => array( 'Watermark', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'waterMarkLocation',\n            'type'     => 'select',\n            'title'    => '水印位置',\n            'options'  => array('nw' => '左上角',  'n' => '正上方',  'ne' => '右上角','w' => '正左边','e' => '正右边','sw' => '左下角','s' => '正下方','se' => '右下角','c' => '正中间'),\n            'default'=> 'c',\n            'dependency' => array( 'Watermark', '==', 'true' ),\n            'after' => '选择水印位置',\n        ),\n        array(\n            'id'       => 'waterMarkOpacity',\n            'type'     => 'slider',\n            'title'    => '水印透明度',\n            'subtitle' => '水印透明度，在0-1之间选择一个数字，默认0.7',\n            'min'      => 0.1,\n            'max'      => 1,\n            'step'     => 0.1,\n            'default'  => 0.7,\n            'dependency' => array( 'Watermark', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'waterMarkMargin',\n            'type'     => 'number',\n            'title'    => '水印到图片边缘的距离',\n            'default'=> '10',\n            'subtitle' => '填写水印到图片边缘的距离，填写数字即可，默认10',\n            'dependency' => array( 'Watermark', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'waterMarkOutput',\n            'type'     => 'select',\n            'title'    => '打上水印后的图片格式',\n            'options'  => array('null'=>'使用原图格式','jpeg'=>'jpeg','png'=>'png','webp'=>'webp'),\n            'default'=> 'null',\n            'dependency' => array( 'Watermark', '==', 'true' ),\n            'after' => '选择打上水印后的图片格式，默认情况下原图啥格式，输出就啥格式',\n        ),\n        \n        \n        array(\n            'type'    => 'heading',\n            'content' => '图片压缩',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '本主题内置图片压缩功能，您可以通过该功能来对上传的图片进行压缩处理。<br>该服务由TinyPNG提供~',\n        ),\n        array(\n            'id'      => 'Tinypng_open',\n            'type'    => 'switcher',\n            'title'       => '是否启用图片压缩',\n            'default' => false,\n            'subtitle'=>'TinyPNG APIKEY申请地址:<a href=\"https://tinypng.com/developers\">戳这里</a>'\n        ),\n        array(\n            'id'       => 'Tinypng_apikey',\n            'type'     => 'text',\n            'title'    => 'TinyPNG APIKEY',\n            'subtitle' => '请在这里填写TinyPNG ApiKey',\n            'dependency' => array( 'Tinypng_open', '==', 'true' ),\n        ),\n    )\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'  => '海报设置',\n    'icon'   => 'fas fa-id-card',\n    'fields' => array(\n      array(\n            'id'      => 'Poster',\n            'type'    => 'switcher',\n            'title'       => '文章微海报',\n            'default' => false,\n            'after'=>'<br><br>开启后前台文章页面会显示微海报生成按钮'\n        ),\n        array(\n            'id'       => 'Poster__LogoUrl',\n            'type'    => 'upload',\n            'title'    => '海报底部LOGO',\n            'subtitle' => '上传海报底部LOGO，显示在海报底部，留空则显示博客名称<br><font color=red>建议使用本地图片作为底部LOGO，若使用外部图片链接，微海报可能无法正常生成~</font>',\n            'dependency' => array( 'Poster', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'Poster__AttUrl',\n            'type'    => 'upload',\n            'title'    => '海报默认缩略图',\n            'subtitle' => '上传海报默认缩略图，显示在海报顶部，在文章没有填写文章封面栏的情况下使用缩略图<br><font color=red>建议使用本地图片作为默认缩略图，若使用外部图片链接，微海报可能无法正常生成~</font>',\n            'dependency' => array( 'Poster', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'Poster__AttChoose',\n            'type'    => 'switcher',\n            'title'       => '当没有文章封面时默认使用以上缩略图',\n            'default' => false,\n            'after'=>'<br><br>开启后当文章没有填写文章封面图片链接时默认使用以上默认缩略图'\n        ),\n    )\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'  => '区块设置',\n    'icon'   => 'fas fa-th-large',\n    'fields' => array(\n      array(\n            'id'      => 'Cate',\n            'type'    => 'switcher',\n            'title'       => '右侧分类区块',\n            'default' => true,\n            'subtitle'=>'若选择开启,则网站右侧将出现分类区块,显示当前所有分类。'\n        ),\n        array(\n            'id'      => 'LastArticle',\n            'type'    => 'switcher',\n            'title'       => '右侧最近文章区块',\n            'default' => true,\n            'subtitle'=>'若选择开启,则网站右侧将出现最近文章区块,显示最近发布的文章,可控制显示的文章数目。'\n        ),\n        array(\n            'id'      => 'ClockModule',\n            'type'    => 'switcher',\n            'title'       => '时光沙漏区块',\n            'default' => false,\n            'subtitle'=>'若选择开启,则网站右侧将出现时光沙漏区块，动态显示今年-本月-今天的倒计时。'\n        ),\n        array(\n            'id'      => 'AdControl',\n            'type'    => 'switcher',\n            'title'       => '广告区块',\n            'default' => false,\n            'subtitle'=>'若选择开启,则网站将出现广告位置。'\n        ),\n        array(\n            'id'      => 'AdControl_Google',\n            'type'    => 'switcher',\n            'title'       => '启用Google广告联盟',\n            'default' => false,\n            'subtitle'=>'下方开启广告区块若填写的是Google广告联盟代码则本项需开启。',\n            'dependency' => array( 'AdControl', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'AdControl1',\n            'type'    => 'switcher',\n            'title'       => '右侧顶部广告',\n            'default' => false,\n            'subtitle'=>'若选择开启,则网站右侧顶部将出现广告位置。',\n            'dependency' => array( 'AdControl', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'AdControl1_style',\n            'type'        => 'radio',\n            'title'       => '右侧顶部广告类型',\n            'inline'  => true,\n            'after' => '选择右侧顶部广告类型，图片或代码，若有谷歌广告，可选择代码类型',\n            'options'     => array('1' => '图片', '2' => '代码'),\n            'default' => '1',\n            'dependency' => array( 'AdControl|AdControl1', '==|==', 'true|true' ),\n        ), \n        array(\n            'id'       => 'AdControl1Code',\n            'type'     => 'code_editor',\n            'title'    => '右侧顶部广告代码',\n            'after' =>'若为Google广告代码，需将ins标签所有内容包括ins标签下方的js代码内容全部复制到本栏中，<code>adsbygoogle.js</code>不需要引用',\n            'dependency' => array( 'AdControl|AdControl1|AdControl1_style', '==|==|==', 'true|true|2' ),\n        ),\n        array(\n            'id'       => 'AdControl1Src',\n            'type'     => 'text',\n            'title'    => '右侧顶部广告图片链接及指向链接',\n            'subtitle' => '请输入右侧顶部广告图片链接及指向链接，格式：图片链接|指向链接，使用|分隔，有且仅能存在一个',\n            'dependency' => array( 'AdControl|AdControl1|AdControl1_style', '==|==|==', 'true|true|1' ),\n        ),\n        \n        \n        \n        array(\n            'id'      => 'AdControl2',\n            'type'    => 'switcher',\n            'title'       => '右侧底部广告',\n            'default' => false,\n            'subtitle'=>'若选择开启,则网站右侧底部将出现广告位置。',\n            'dependency' => array( 'AdControl', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'AdControl2_style',\n            'type'        => 'radio',\n            'title'       => '右侧底部广告类型',\n            'inline'  => true,\n            'after' => '选择右侧底部广告类型，图片或代码，若有谷歌广告，可选择JS代码类型',\n            'options'     => array('1' => '图片', '2' => '代码'),\n            'default' => '1',\n            'dependency' => array( 'AdControl|AdControl2', '==|==', 'true|true' ),\n        ), \n        array(\n            'id'       => 'AdControl2Code',\n            'type'     => 'code_editor',\n            'title'    => '右侧底部广告代码',\n            'after' =>'若为Google广告代码，需将ins标签所有内容包括ins标签下方的js代码内容全部复制到本栏中，<code>adsbygoogle.js</code>不需要引用',\n            'dependency' => array( 'AdControl|AdControl2|AdControl2_style', '==|==|==', 'true|true|2' ),\n        ),\n        array(\n            'id'       => 'AdControl2Src',\n            'type'     => 'text',\n            'title'    => '右侧底部广告图片链接及指向链接',\n            'subtitle' => '请输入右侧底部广告图片链接及指向链接，格式：图片链接|指向链接，使用|分隔，有且仅能存在一个',\n            'dependency' => array( 'AdControl|AdControl2|AdControl2_style', '==|==|==', 'true|true|1' ),\n        ),\n        array(\n            'id'      => 'AdControl3',\n            'type'    => 'switcher',\n            'title'       => '首页顶部广告',\n            'default' => false,\n            'subtitle'=>'若选择开启,则网站首页顶部将出现广告位置。',\n            'dependency' => array( 'AdControl', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'AdControl3_style',\n            'type'        => 'radio',\n            'title'       => '首页顶部广告类型',\n            'inline'  => true,\n            'after' => '选择首页顶部广告类型，图片或代码，若有谷歌广告，可选择代码类型',\n            'options'     => array('1' => '图片', '2' => '代码'),\n            'default' => '1',\n            'dependency' => array( 'AdControl|AdControl3', '==|==', 'true|true' ),\n        ), \n        array(\n            'id'       => 'AdControl3Code',\n            'type'     => 'code_editor',\n            'title'    => '首页顶部广告代码',\n            'after' =>'若为Google广告代码，需将ins标签所有内容包括ins标签下方的js代码内容全部复制到本栏中，<code>adsbygoogle.js</code>不需要引用',\n            'dependency' => array( 'AdControl|AdControl3|AdControl3_style', '==|==|==', 'true|true|2' ),\n        ),\n        array(\n            'id'       => 'AdControl3Src',\n            'type'     => 'text',\n            'title'    => '首页顶部广告图片链接及指向链接',\n            'subtitle' => '请输入首页顶部图片链接及指向链接，格式：图片链接|指向链接，使用|分隔，有且仅能存在一个',\n            'dependency' => array( 'AdControl|AdControl3|AdControl3_style', '==|==|==', 'true|true|1' ),\n        ),\n        array(\n            'id'      => 'AdControl4',\n            'type'    => 'switcher',\n            'title'       => '分类/搜索/标签/作者文章顶部广告',\n            'default' => false,\n            'subtitle'=>'若选择开启,则分类/搜索/标签/作者文章顶部将出现广告位置。',\n            'dependency' => array( 'AdControl', '==', 'true' ),\n        ),\n         array(\n            'id'          => 'AdControl4_style',\n            'type'        => 'radio',\n            'title'       => '分类/搜索/标签/作者文章顶部广告类型',\n            'inline'  => true,\n            'after' => '选择首页顶部广告类型，图片或代码，若有谷歌广告，可选择代码类型',\n            'options'     => array('1' => '图片', '2' => '代码'),\n            'default' => '1',\n            'dependency' => array( 'AdControl|AdControl4', '==|==', 'true|true' ),\n        ), \n        array(\n            'id'       => 'AdControl4Code',\n            'type'     => 'code_editor',\n            'title'    => '分类/搜索/标签/作者文章顶部广告代码',\n            'after' =>'若为Google广告代码，需将ins标签所有内容包括ins标签下方的js代码内容全部复制到本栏中，<code>adsbygoogle.js</code>不需要引用',\n            'dependency' => array( 'AdControl|AdControl4|AdControl4_style', '==|==|==', 'true|true|2' ),\n        ),\n        array(\n            'id'       => 'AdControl4Src',\n            'type'     => 'text',\n            'title'    => '分类/搜索/标签/作者文章顶部广告图片链接及指向链接',\n            'subtitle' => '请输入分类/搜索/标签/作者文章顶部广告图片链接及指向链接，格式：图片链接|指向链接，使用|分隔，有且仅能存在一个',\n            'dependency' => array( 'AdControl|AdControl4|AdControl4_style', '==|==|==', 'true|true|1' ),\n        ),\n        \n        array(\n            'id'      => 'Search',\n            'type'    => 'checkbox',\n            'title'   => '搜索区块',\n            'inline'  => true,\n            'options' => array('sidebar' => '侧边栏',  'phone' => '手机端导航栏上面','header' => 'PC端顶部右侧'),\n            'subtitle'=>'选择搜索区块要显示的位置，若都不选择则都不显示。'\n        ),\n        array(\n            'id'      => 'Search_Way',\n            'type'    => 'radio',\n            'title'   => '搜索方案',\n            'inline'  => true,\n            'options' => array(\n                '1'    => '简略搜索',\n                '2'   => '精确搜索[Beta]',\n            ),\n            'default' => '1',\n            'subtitle'=>'简略搜索仅模糊查询关键词，而精确搜索则将关键词进行中英文分词进行查询。',\n            \n        ),\n        \n        array(\n            'id'      => 'lastcomment',\n            'type'    => 'switcher',\n            'title'       => '右侧最新回复区块',\n            'default' => true,\n            'subtitle'=>'开启后网站侧边栏将增加最新回复区块，显示最新的五条评论。'\n        ),\n        array(\n            'id'      => 'tagcloud',\n            'type'    => 'switcher',\n            'title'       => '右侧标签云区块',\n            'default' => true,\n            'subtitle'=>'开启后网站侧边栏将增加标签云区块，显示添加的文章标签。'\n        ),\n        array(\n            'id'       => 'tagcloudnum',\n            'type'     => 'number',\n            'title'    => '标签云显示的标签个数',\n            'default'=> '20',\n            'unit'     => '个',\n            'subtitle' => '限制标签云所显示的标签个数，默认显示20个',\n            'dependency' => array( 'tagcloud', '==', 'true' ),\n        ),\n    )\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'  => '博主信息',\n    'icon'   => 'fas fa-user-tie',\n    'fields' => array(\n        array(\n            'id'      => 'Authorz',\n            'type'    => 'switcher',\n            'title'       => '右侧博主区块',\n            'default' => false,\n            'subtitle'=>'若选择开启,则网站右侧将出现博主一栏。'\n        ),\n        \n      array(\n            'id'       => 'AuthorAvatar',\n            'type'    => 'upload',\n            'title'    => '博主头像图片',\n            'after' => '请上传博主头像图片',\n'dependency' => array( 'Authorz', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'AuthorBackground',\n            'type'    => 'upload',\n            'title'    => '博主栏顶部背景图片',\n            'after' => '请上传博主栏顶部背景图片',\n'dependency' => array( 'Authorz', '==', 'true' ),\n        ),\n        \n        array(\n            'id'       => 'AuthorName',\n            'type'     => 'text',\n            'title'    => '博主昵称',\n            'subtitle' => '请填写博主昵称,若为空则不显示',\n            'dependency' => array( 'Authorz', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'AuthorQm',\n            'type'     => 'text',\n            'title'    => '博主个性简介',\n            'subtitle' => '请填写博主个性简介,若为空则不显示',\n            'dependency' => array( 'Authorz', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'AuthorOneSay',\n            'type'    => 'switcher',\n            'title'       => '个性简介处显示一言',\n            'default' => false,\n            'subtitle'=>'若选择开启,则博主栏个性简介将显示一言，不显示所填写的个性简介。<br>开启一言后可能会拖慢加载速度，请谨慎开启',\n             'dependency' => array( 'Authorz', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'QQ_QRCODE',\n            'type'    => 'upload',\n            'title'    => 'QQ二维码图片',\n            'after' => '请上传QQ二维码图片，建议尺寸为300px×300px，若为空则不显示',\n            'dependency' => array( 'Authorz', '==', 'true' ),\n\n        ),\n        array(\n            'id'       => 'Wechat_QRCODE',\n            'type'    => 'upload',\n    \n            'title'    => '微信二维码图片',\n            'after' => '请上传微信二维码图片，建议尺寸为300px×300px，若为空则不显示',\n            'dependency' => array( 'Authorz', '==', 'true' ),\n\n        ),\n        array(\n            'id'       => 'Github_URL',\n            'type'     => 'text',\n            'title'    => 'Github链接',\n            'subtitle' => '请填写Github链接,若为空则不显示',\n            'dependency' => array( 'Authorz', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'Facebook_URL',\n            'type'     => 'text',\n            'title'    => 'Facebook链接',\n            'subtitle' => '请填写Facebook链接,若为空则不显示',\n            'dependency' => array( 'Authorz', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'Twitter_URL',\n            'type'     => 'text',\n            'title'    => 'Twitter链接',\n            'subtitle' => '请填写Twitter链接,若为空则不显示',\n            'dependency' => array( 'Authorz', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'Telegram_URL',\n            'type'     => 'text',\n            'title'    => 'Telegram链接',\n            'subtitle' => '请填写Telegram链接,若为空则不显示',\n            'dependency' => array( 'Authorz', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'Weibo_URL',\n            'type'     => 'text',\n            'title'    => '微博链接',\n            'subtitle' => '请填写微博链接,若为空则不显示',\n            'dependency' => array( 'Authorz', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'FourTotalHidden',\n            'type'    => 'switcher',\n            'title'       => '四项统计',\n            'default' => false,\n            'subtitle'=>'若选择开启，则博主信息栏将显示四项统计：文章、评论、分类、页面。',\n            'dependency' => array( 'Authorz', '==', 'true' ),\n        ),\n\n    )\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'  => '其他设置',\n    'icon'   => 'fas fa-ellipsis-h',\n    'fields' => array(\n\n        array(\n            'id'       => 'ServiceWorker',\n            'type'    => 'text',\n            'title'    => 'ServiceWorker规则文件名',\n            'after' => 'ServiceWorker可为您的博客提供前端静态资源缓存，从而加快访问速度(前提是站点已开启HTTPS)<br><font color=red>您需要在这里填上规则文件名，规则文件在主题目录/vendors/BearSimpleCacheRules.js，将该文件复制一份到您的站点根目录，并在这里填上文件名，如为默认的BearSimpleCacheRules.js，则填BearSimpleCacheRules.js即可。</font><br>不填则表示不开启。',\n        ),\n        \n      array(\n            'id'      => 'CopyProtect',\n            'type'    => 'switcher',\n            'title'       => '防复制',\n            'default' => false,\n            'subtitle'=>'若开启防复制，则禁用右键、复制、拖动等。'\n        ),\n        \n        array(\n            'id'          => 'Top',\n            'type'        => 'switcher',\n            'title'       => '返回顶部',\n            'subtitle' => '若开启，则右侧下方将增加一个返回顶部图标，可自定义',\n            'default' => false,\n        ),\n        array(\n            'id'       => 'TopSrc',\n            'type'    => 'icon',\n            'title'    => '返回顶部图标',\n            'after' => '请选择返回顶部图标,若为空则显示默认图标',\n            'dependency' => array( 'Top', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'Mournmode',\n            'type'        => 'switcher',\n            'title'       => '哀悼模式',\n            'subtitle'=>'若开启哀悼模式，则网站全部显示灰色。',\n            'default' => false,\n        ),\n        \n        array(\n            'id'          => 'IframeProtect',\n            'type'        => 'select',\n            'title'       => 'Iframe嵌入',\n            'after' => '可通过本功能设置防止站点被其他站点通过iframe方式嵌入',\n            'options'     => array('1' => '允许任何网页',  '2' => '只允许同域名网页','3'=>'不允许任何网页'),\n            'default' => '1',\n        ),\n        array(\n            'id'          => 'Link_blank',\n            'type'        => 'select',\n            'title'       => '外链打开方式',\n            'after' => '选择外链的打开方式，在当前窗口打开还是新窗口打开',\n            'options'     => array('1' => '在当前窗口打开',  '2' => '在新窗口打开'),\n            'default' => '1',\n        ),\n        array(\n            'id'          => 'Read_Process',\n            'type'        => 'switcher',\n            'title'       => '阅读进度条',\n            'subtitle' => '选择开启则前台页面滚动时顶部显示阅读进度条',\n            'default' => false,\n        ),\n        array(\n            'id'          => 'safeRedirection',\n            'type'        => 'switcher',\n            'title'       => '免责声明',\n            'subtitle' => '选择开启则当访客从外站访问本站页面时将显示免责声明<br>免责声明Demo请戳<a href=\"'.$Tyoptions->siteUrl.'usr/themes/bearsimple/assets/images/safeDem.png\">这里</a>',\n            'default' => false,\n        ),\n        array(\n            'id'       => 'safeRedirectionNonList',\n            'type'     => 'textarea',\n            'title'    => '免责声明白名单',\n            'after' => '可以在这里填写白名单域名，从白名单域名访问到本站点都将不显示免责声明页面<br>多个域名直接换行即可',\n            'dependency' => array( 'safeRedirection', '==', 'true' ),\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => '操作面板控制中心',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '操作面板指的是在前台右下角增加一个能够让访客自主控制的面板，可以设置切换语言、黑暗模式等。',\n        ),\n        array(\n            'id'          => 'Control_Panel',\n            'type'        => 'switcher',\n            'title'       => '是否开启操作面板',\n            'subtitle' => '选择开启则前台页面右下角显示操作面板，可从下方选择开启一些利于访客阅读的功能',\n            'default' => false,\n        ),\n        array(\n            'id'          => 'Translate',\n            'type'        => 'select',\n            'title'       => '语言切换',\n            'after' => '选择语言切换类型，可选择开启简繁体切换或者全球几十种语言切换',\n            'options'     => array('1' => '开启简繁体切换','11'=>'开启全球语言切换','2' => '否'),\n            'default' => '2',\n            'dependency' => array( 'Control_Panel', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'TranslateLanguage',\n            'type'        => 'select',\n            'title'       => '选择优先显示语言',\n            'after' => '访客访问时优先使用的语言',\n            'options'     => array('1' => '简体中文',  '2' => '繁体中文'),\n            'default' => '1',\n            'dependency' => array( 'Control_Panel|Translate', '==|==', 'true|1' ),\n        ),\n        array(\n            'id'      => 'WorldLanguage',\n            'type'    => 'checkbox',\n            'title'   => '选择要显示的语言',\n            'inline'  => true,\n            'default' => '1',\n            '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' => '毛利语'),\n            'subtitle'=>'支持选择前台显示支持翻译的语言，简体中文作为默认语言所以不在其中<br><font color=red>要注意的一点是有很多语言对中文的翻译是不友好的，有的甚至翻译不出来，从而导致翻译后页面出现错位等问题，所以请谨慎选择</font>',\n             'dependency' => array( 'Control_Panel|Translate', '==|==', 'true|11' ),\n        ),\n        array(\n            'id'      => 'Darkmode',\n            'type'    => 'switcher',\n            'title'       => '黑暗模式',\n            'default' => false,\n            'subtitle'=>'开启后可提供黑暗模式提升访客在夜间阅读时的体验。',\n            'dependency' => array( 'Control_Panel', '==', 'true' ),\n        ),\n        array(\n            'id'      => 'Darkmode_type',\n            'type'    => 'checkbox',\n            'title'   => '黑暗模式切换可选项',\n            'inline'  => true,\n            'options' => array('1' => '根据白天夜晚时间段自动切换',  '2' => '跟随系统'),\n            'subtitle'=>'默认支持手动切换黑暗模式，可勾选可选项对黑暗模式进行加强。',\n            'dependency' => array( 'Control_Panel|Darkmode', '==|==', 'true|true' ),\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => '全局自定义提示设置',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '自定义提示指的是在一些操作或文章中所触发显示的提示，如文章内容回复可见时显示的内容、评论成功时显示的提示内容等。',\n        ),\n       array(\n                'id'    => 'globalTips',\n                'type'  => 'tabbed',\n                'title' => '',\n                'tabs'  => array(\n\n                    array(\n                        'title'  => '文章相关',\n                        'fields' => array(\n                            array(\n            'id'       => 'articleHideAfterComment_Tip',\n            'type'     => 'text',\n            'title'    => '文章内容回复可见时的提示内容',\n            'after' => '填写文章内容回复可见时的提示内容。',\n        ),\n        array(\n            'id'       => 'articleHideAfterLogin_Tip',\n            'type'     => 'text',\n            'title'    => '文章内容登录可见时的提示内容',\n            'after' => '填写文章内容登录可见时的提示内容。',\n        ),\n        array(\n            'id'       => 'articlePwdAfterEnter_Tip',\n            'type'     => 'text',\n            'title'    => '文章加密时输入框下的提示内容',\n            'after' => '填写文章加密时输入框下的提示内容。',\n        ),\n        array(\n            'id'       => 'articlePwdAfterEnterSuccess_Tip',\n            'type'     => 'text',\n            'title'    => '文章密码验证成功的提示内容',\n            'after' => '填写文章密码验证成功的提示内容（已默认三秒刷新页面）。',\n        ),\n        array(\n            'id'       => 'articlePwdAfterEnterFail_Tip',\n            'type'     => 'text',\n            'title'    => '文章密码验证失败的提示内容',\n            'after' => '填写文章密码验证失败的提示内容。',\n        ),\n        array(\n            'id'       => 'articlePwdAfterEnterReadMode_Tip',\n            'type'     => 'text',\n            'title'    => '文章密码未验证即进入阅读模式的提示内容',\n            'after' => '密码文章在没有验证成功密码就点击阅读模式会提示无法进入<br>这里可以填写文章密码未验证即进入阅读模式的提示内容。',\n        ),\n        array(\n            'id'       => 'articleAgreeSuccess_Tip',\n            'type'     => 'text',\n            'title'    => '文章点赞成功的提示内容',\n            'after' => '填写文章点赞成功的提示内容。',\n        ),\n        array(\n            'id'       => 'articleAgreeFail1_Tip',\n            'type'     => 'text',\n            'title'    => '文章点赞失败的提示内容（重复点赞）',\n            'after' => '填写文章点赞失败（重复点赞）的提示内容。',\n        ),\n        array(\n            'id'       => 'articleAgreeFail2_Tip',\n            'type'     => 'text',\n            'title'    => '文章点赞失败的提示内容（网络问题）',\n            'after' => '填写文章点赞失败（网络问题）的提示内容。',\n        ),\n                       \n                        ),\n                        \n        \n        \n                        ),\n                        \n                        array(\n                        'title'  => '评论相关',\n                        'fields' => array(\n                            array(\n            'id'       => 'commentSuccess_Tip',\n            'type'     => 'text',\n            'title'    => '评论成功时的提示内容',\n            'after' => '填写评论成功时的提示内容。',\n        ),\n        array(\n            'id'       => 'commentFail_Tip',\n            'type'     => 'text',\n            'title'    => '评论失败时的提示内容',\n            'after' => '填写评论失败时的提示内容。',\n        ),\n        array(\n            'id'       => 'commentAgreeSuccess_Tip',\n            'type'     => 'text',\n            'title'    => '评论点赞成功时的提示内容',\n            'after' => '填写评论成功时的提示内容。',\n        ),\n        array(\n            'id'       => 'commentAgreeFail1_Tip',\n            'type'     => 'text',\n            'title'    => '评论点赞失败[重复点赞]时的提示内容',\n            'after' => '填写评论点赞失败[重复点赞]时的提示内容。',\n        ),\n        array(\n            'id'       => 'commentAgreeFail2_Tip',\n            'type'     => 'text',\n            'title'    => '评论点赞失败[网络问题]时的提示内容',\n            'after' => '填写评论点赞失败[网络问题]时的提示内容。',\n        ),\n        ),\n        ),\n              ),\n                    ),\n        \n    )\n  ) );\n$template_files = scandir(dirname(__FILE__) . '/modules/GoLinks/templates');\n        $goTemplates = array('NULL' => '禁用');\n        foreach ($template_files as $item) {\n            if (PATH_SEPARATOR !== ':') {\n                $item = mb_convert_encoding($item, \"UTF-8\", \"GBK\");\n            }\n\n            $name = mb_split(\"\\.\", $item)[0];\n            if (empty($name)) {\n                continue;\n            }\n\n            $goTemplates[$name] = $name;\n        }\n        \n    if($Tyoptions->openId !== NULL){\n        $openStatus = '<font color=green>已绑定</font>';\n    }\n    else{\n    $openStatus = '<font color=red>未绑定</font>';\n    }\n    $fixButton = '';\n    if (\"Pdo_Mysql\" === $adapter || \"Mysql\" === $adapter || \"Mysqli\" === $adapter) {\n    $fixButton = '<br>若使用微信公众号的朋友圈模式无法正常发表朋友圈，可尝试 <div class=\"ui red label\" id=\"fixTable\" style=\"cursor:pointer\">修复数据表</div>';\n    }\n  CSF::createSection( $prefix, array(\n    'title'  => '实验室',\n    'icon'   => 'fas fa-flask',\n    'fields' => array(\n        array(\n            'type'    => 'heading',\n            'content' => '外链转内链[Beta]',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '外链转内链功能可以将站点中的外部链接转化为内链进行访问。',\n        ),\n\n        array(\n            'id'          => 'goLinkOpen',\n            'type'        => 'switcher',\n            'title'       => '文章内容外链转内链',\n            'subtitle' => '选择开启则将自动将文章内容中的外链转换为内链，并支持跳转页面<br><font color=red>开启本功能请关闭所有正在使用的外链转内链插件！！否则会出现冲突报错情况</font>',\n            'default' => false,\n        ),\n        array(\n            'id'          => 'goLinkThemes',\n            'type'        => 'select',\n            'title'       => '跳转页面模板',\n            'after' => '选择跳转页面模板，theme1-theme5为3秒后跳转，theme6为点击跳转',\n            'options'     => $goTemplates,\n            'default' => 'NULL',\n            'dependency' => array( 'goLinkOpen', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'goLinkNewWindow',\n            'type'        => 'switcher',\n            'title'       => '外链转内链使用新窗口打开',\n            'subtitle' => '选择开启则将所有转换的内链使用新窗口打开',\n            'default' => false,\n            'dependency' => array( 'goLinkOpen', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'goLinkNonConvertList',\n            'type'     => 'textarea',\n            'title'    => '转换白名单',\n            'after' => '可以在这里填写不转换为内链的白名单，要注意的是除了白名单内的链接外，本站域名也是排除在外，不参与外链转换~~<br>多个域名直接换行即可',\n            'dependency' => array( 'goLinkOpen', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'goLinkList',\n            'type'     => 'textarea',\n            'title'    => '自定义跳转链接',\n            'after' => '可以在这里填写自定义跳转链接，需要填写的格式为：key|网站链接，key不可重复。一个链接一个key，多个请直接换行<br>举个栗子，当您填写的是baidu|https://www.baidu.com/的时候，您可以通过<br>\n    未开启伪静态：您的网址/index.php/go/baidu<br>已开启伪静态：您的网址/go/baidu 来访问。',\n    'default'=>'baidu|https://www.baidu.com/',\n            'dependency' => array( 'goLinkOpen', '==', 'true' ),\n        ),\n        \n        array(\n            'type'    => 'heading',\n            'content' => '智慧AI服务[Beta]',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '智慧AI功能可为您的每一篇文章生成AI摘要等，请在下方填入您的信息。',\n        ),\n        array(\n            'id'          => 'AIService',\n            'type'        => 'switcher',\n            'title'       => '是否开启智慧AI服务',\n            'subtitle' => '选择开启则请完整配置选项，智慧AI服务由TianliGPT提供',\n            'default' => false,\n        ),\n        array(\n            'id'       => 'AIService_Key',\n            'type'     => 'text',\n            'title'    => '智慧AI密钥',\n            'after' => '本服务由TianliGPT提供，开启智慧AI服务需填写TianliGPT KEY，若还没有KEY，可 <a href=\"https://afdian.net/item/2e07e870dad911edacb852540025c377\" target=\"_blank\">戳这里</a> 传送购买。',\n            'dependency' => array( 'AIService', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'AIService_Name',\n            'type'     => 'text',\n            'title'    => '智慧AI名称',\n            'after' => '给您的智慧AI起个名吧。',\n            'dependency' => array( 'AIService', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'AIService_Introduce',\n            'type'     => 'text',\n            'title'    => '智慧AI自我介绍',\n            'after' => '给您的智慧AI拟一个自我介绍吧。',\n            'dependency' => array( 'AIService', '==', 'true' ),\n        ),\n\n        array(\n            'id'       => 'AIService_Version',\n            'type'     => 'text',\n            'title'    => '智慧AI版本号',\n            'after' => '给您的智慧AI写一个版本号或标识，它将显示在AI框的右上角。',\n            'dependency' => array( 'AIService', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'AIService_Auto',\n            'type'        => 'switcher',\n            'title'       => '自动生成摘要',\n            'after' => '<br><br>选择开启则将在打开文章页面后自动生成摘要，若不开启则只显示智慧AI的自我介绍',\n            'default' => false,\n            'dependency' => array( 'AIService', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'AIService_Blacklist',\n            'type'        => 'select',\n            'title'       => '不显示AI摘要的文章',\n            'chosen'      => true,\n            'multiple'    => true,\n            'sortable'    => true,\n            'ajax'        => true,\n            'options'     => 'posts',\n            'placeholder' => '选择不显示AI摘要的文章',\n            'dependency' => array( 'AIService', '==', 'true' ),\n        ),\n        array(\n            'id'          => 'AIService_Blacklist_Page',\n            'type'        => 'select',\n            'title'       => '不显示AI摘要的独立页面',\n            'chosen'      => true,\n            'multiple'    => true,\n            'sortable'    => true,\n            'ajax'        => true,\n            'options'     => 'pages',\n            'placeholder' => '选择不显示AI摘要的独立页面',\n            'dependency' => array( 'AIService', '==', 'true' ),\n        ),\n        array(\n            'type'    => 'heading',\n            'content' => '微信公众号服务[Beta]',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '微信公众号服务为您的微语时光机、朋友圈模块的消息发布提供另外的形式，您可以使用自己的微信公众号来发送消息，它将自动把消息发布到您的时光机/朋友圈。<br>操作说明：填写好以下信息且配置好微信公众号平台后在公众号发送绑定即可完成绑定，绑定成功后在公众号发送内容都会直接发送到微语/朋友圈页面<br><font color=red>当前为实验室测试阶段，仅限于指定一个微语时光机/朋友圈页面进行操作，若有问题请及时反馈</font><br>当前状态：'.$openStatus.'，OpenID：'.$Tyoptions->openId.$fixButton,\n        ),\n         array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<h4><strong>服务使用说明</strong></h4><li>1、当前支持发送内容至微语或朋友圈，但需注意的是请选择好下方要发送内容的页面！</li><li>2、朋友圈：若选择的是朋友圈页面，发送“发朋友圈”四个字即可开启朋友圈模式，朋友圈模式中可发送图片、语音和视频内容，媒体文件缓存临时目录：/usr/uploads/wechatServer/，该目录中的图片可以直接删除，不会造成任何影响~</li><li>3、微语：发送除了指定关键字外的任意文字都将发送到选择的微语页面</li><li>4、发送微语的方法与朋友圈是互通的，也就是说没有开启朋友圈模式下发送除了指定关键字外的任意文字也可以发送到朋友圈</li><li><font color=red>5、最重要的一点：需将/usr/themes/bearsimple/vendors目录中的Upload.php放至/var/Widget目录直接覆盖原有文件，不然朋友圈模式的媒体资源无法正常上传到博客这里，切记！！！</font></li>',\n        ),\n        array(\n            'id'          => 'wechat_service',\n            'type'        => 'switcher',\n            'title'       => '是否开启微信公众号服务',\n            'subtitle' => '选择开启则请完整配置选项，否则可能无法正常使用！',\n            'default' => false,\n        ),\n        array(\n            'id'          => 'wechat_choose',\n            'type'        => 'select',\n            'title'       => '选择微语/朋友圈页面',\n            'placeholder' => '选择一个微语/朋友圈页面',\n            'options'     => 'pages',\n            'dependency' => array( 'wechat_service', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'wechat_circleSendText',\n            'type'     => 'text',\n            'title'    => '发朋友圈快捷命令',\n            'after' => '<font color=red>仅上方选择的页面为朋友圈时有效</font><br> 请填写发朋友圈快捷命令，即开启朋友圈模式的快捷命令，若不填则为发送“发朋友圈”四个字开启朋友圈模式！',\n            'dependency' => array( 'wechat_service', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'wechat_appid',\n            'type'     => 'text',\n            'title'    => '微信公众号appID',\n            'after' => '请填写微信公众号appID',\n            'dependency' => array( 'wechat_service', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'wechat_appsecret',\n            'type'     => 'text',\n            'title'    => '微信公众号appSecret',\n            'after' => '请填写微信公众号appSecret',\n            'dependency' => array( 'wechat_service', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'wechat_aeskey',\n            'type'     => 'text',\n            'title'    => '微信公众号aesKey',\n            'after' => '<font color=red>当为安全模式时本项必填！！！</font><br>请填写微信公众号aesKey，一般为微信平台上随机生成或自编',\n            'dependency' => array( 'wechat_service', '==', 'true' ),\n        ),\n        array(\n            'id'       => 'wechat_verifyToken',\n            'type'     => 'text',\n            'title'    => '微信公众号验证Token',\n            'after' => '请填写微信公众号验证Token，自己编一个即可，要和微信公众号平台上输入的接口Token一致！<br><font color=red>接口URL:'.Helper::options()->siteUrl.'index.php/wechatServer</font>',\n            'dependency' => array( 'wechat_service', '==', 'true' ),\n        ),\n        \n    )\n  ) );\n  CSF::createSection( $prefix, array(\n    'title'  => '短代码',\n    'icon'   => 'fas fa-code',\n    'fields' => array(\n      array(\n            'type'    => 'heading',\n            'content' => '短代码',\n        ),\n        array(\n            'type'    => 'subheading',\n            'content' => '本主题支持的短代码均会显示在这里，方便大家使用',\n        ),\n         array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>1、登录或回复后可见</strong><br> [bshide}隐藏内容[/bshide]',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>2、仅登录后可见</strong><br> [bslogin}隐藏内容[/bslogin]',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>3、Todolist</strong><br>  已完成：[todo-t]已完成的内容[/todo-t]<br>\n    未完成：[todo-f]未完成的内容[/todo-f]',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>4、代码高亮</strong><br> ```语言名称<br>\n    代码内容<br>\n    ```',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>5、字体颜色</strong><br> {bs-font color=\"Hex颜色代码\"}内容{/bs-font}<br>\n   Hex颜色代码例如#FFFFFF',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>6、iframe</strong><br> {bs-iframe}iframe地址{/bs-iframe}<br>\n   iframe地址举个简单的例子，如B站的分享视频代码，<br>\n   &#60;iframe src=\"xxxxxxxx\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"> </iframe>\n   只要xxxxxxxx这一部分就行，也就是src里边这一串链接，这个就是iframe地址',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>7、音频</strong><br> [bsaudio]音频地址[/bsaudio]<br>\n   音频地址必须直链',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>8、手风琴</strong><br>  线性手风琴<br>\n   {bs-accord style=line title=线性手风琴标题}线性手风琴内容{/bs-accord}<br>\n   普通手风琴<br>\n   {bs-accord style=common title=普通手风琴标题}普通手风琴内容{/bs-accord}',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>9、Github仓库</strong><br> [bsgit user=\"仓库创建者，如whitebearcode\"]仓库名，如typecho-bearsimple[/bsgit]',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>10、引用文章</strong><br> [bspost cid=\"文章CID\"]<br>\n    您可以在文章中引用另外一篇文章',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>11、标记文字</strong><br> [bsmark]要标记的文字[/bsmark]<br>\n    您可以在文章中对一些重点内容进行标记，前台会显示划线效果',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>12、文字带拼音</strong><br> [bsruby]要带拼音的文字[/bsruby]<br>\n    您可以在文章中对一些文字附带拼音，前台会在要带拼音的文字上方显示拼音以及声调',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>13、按钮</strong><br> [bsbtn type=\"按钮类型\" color=\"颜色\" url=\"点击按钮跳转的网址\" icon=\"图标名\"]按钮名[/bsbtn]<br>\n    您可以在文章中添加按钮，按钮可设置跳转链接<br>\n    按钮参数：<br>\n    type:common、basic、animated<br>\n    color:standard、primary、secondary、red、orange、yellow、olive、green、teal、violet、purple、pink、brown、grey<br>\n    url:点击按钮跳转的网址，需带http(s)://，如https://www.baidu.com/<br>\n    icon:图标名，参考<a href=\"https://bs-icon.typecho.ru/\" target=\"_blank\">戳这里访问Bearsimple主题适配图标站</a><br>\n    <font color=red>注:当为动画图标时按钮名需设置两个，一个是鼠标未点击按钮时显示的文字，一个是鼠标点击按钮时显示的文字，两个按钮名使用|隔开</font>',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>14、提示框</strong><br> [bsmessage type=\"提示框类型\" color=\"提示框颜色\" title=\"提示框标题\" icon=\"提示框图标\"]提示框内容[/bsmessage]<br>\n    您可以在文章中添加提示框<br>\n    提示框参数：<br>\n    type:common、basic、commonclose、basicclose<br>\n    color:standard、primary、secondary、red、orange、yellow、olive、green、teal、violet、purple、pink、brown、grey<br>\n    title:提示框标题<br>\n    icon:图标名，参考<a href=\"https://bs-icon.typecho.ru/\" target=\"_blank\">戳这里访问Bearsimple主题适配图标站</a><br>\n    <font color=red>注:阴影效果受到提示框颜色影响，有些颜色显示不出来阴影效果</font>',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>15、评星</strong><br> [bseva type=\"star或者heart\"]评星颗数[/bseva]<br>\n    您可以在文章中对一些事物进行评星',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>16、相册</strong><br> [bsgallery title=\"相册名\"]<br>\n[bsimg title=\"图片标题1\"]图片地址1[/bsimg]<br>\n[bsimg title=\"图片标题2\"]图片地址2[/bsimg]<br>\n[bsimg title=\"图片标题3\"]图片地址3[/bsimg]<br>\n[/bsgallery]<br>\n    您可以在文章中通过该短代码将多张图片集成一个相册，建议图片数量不少于四张',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>17、每日60s早报</strong><br> [bspaper image=\"true\"]<br>\n    您可以在文章中通过该短代码调取每日60s早报文字版所有内容当做文章内容来显示<br>参数:image，填写true或者false，选择是否显示60秒早报的头图，填true为显示，false或其他都为不显示',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>18、Mermaid</strong><br> ```mermaid<br>Mermaid流程图内容<br>```<br>\n    您可以在文章中通过该短代码转换mermaid流程图',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>19、时间计划</strong><br> [bstimes title=\"时间计划名\"]<br>\n[bstime time=\"计划时间1\"]计划内容1[/bstime]<br>\n[bstime time=\"计划时间2\"]计划内容2[/bstime]<br>\n[bstime time=\"计划时间3\"]计划内容3[/bstime]<br>\n[/bstimes]<br>\n    您可以在文章中通过该短代码制作一个时间计划，对每日的时间进行规划',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>20、倒计时进度条</strong><br> [bsdate end=\"结束时间，如2022-12-12 23:12:55，年-月-日 时:分:秒，请精确到秒\"]倒计时进度条标题[/bsdate]<br>\n    您可以在文章中通过该短代码制作一个倒计时进度条，可以给自己设定一个时间计划，到达结束时间后看看自己做到了没~',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>21、bframe</strong><br> [bsfra image=\"占位封面图直链\" url=\"页面地址\"]<br>占位封面图直链为进入文章后还没进行交互操作时显示的占位封面图，要求必须直链，若不填会显示默认图片<br>\n   页面地址举个简单的例子，如B站的分享视频代码，<br>\n   &#60;iframe src=\"xxxxxxxx\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"> </iframe>\n   只要xxxxxxxx这一部分就行，也就是src里边这一串链接，这个就是页面地址',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>22、点击复制文字内容</strong><br> [bscopy text=\"点击所复制的内容文字\"]显示的内容文字[/bscopy]<br>可以通过该短代码设置一段可以直接复制的内容<br>\n   text参数里边即为要点击复制的内容，仅允许全文字，禁止HTML或其他代码标签，这些标签均会被过滤掉',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>23、音乐歌单</strong><br> [bsmusic]歌单ID[/bsmusic]<br>可以通过该短代码添加一个歌单列表到您的文章中，目前支持调用网易云音乐，歌单ID请填写网易云音乐的歌单ID',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>24、思维导图</strong><br> ```mermaid<br>mindmap<br>思维导图内容<br>```<br>\n    您可以在文章中通过该短代码转换思维导图，注意:思维导图需开启Mermaid美人鱼才可使用',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>25、标签</strong><br>[bstag]标签名[/bstag]<br>\n    您可以在文章中通过该短代码快速链接至标签文章列表<br>该短代码可自动判断站点中是否存在该标签，若有则显示链接，若无将直接显示文字',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>26、插入视频</strong><br>[bsplayer url=\"视频文件地址\" image=\"视频封面图地址\"]<br>\n    您可以在文章中通过该短代码插入视频',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>27、插入MP3音频文件</strong><br>单个音频使用<br>[bsmp3 url=\"音频文件地址\" singer=\"歌手\" name=\"歌曲名\" image=\"歌曲封面图地址\"]<br>多个音频使用<br>[bsmp3]<br>[mp3 url=\"音频文件地址\" singer=\"歌手\" name=\"歌曲名\" image=\"歌曲封面图地址\"]<br>[mp3 url=\"音频文件地址\" singer=\"歌手\" name=\"歌曲名\" image=\"歌曲封面图地址\"]<br>[/bsmp3]<br>\n    您可以在文章中通过该短代码插入MP3音频文件',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>28、标签卡</strong><br>[bstabs]<br>\n[bstab name=\"标签1\" active=\"true\"]第一个标签卡的内容\n[/bstab]<br>\n[bstab name=\"标签2\"]第二个标签卡的内容\n[/bstab]<br>\n[/bstabs]<br>\n    您可以在文章中通过该短代码插入标签卡<br>\n    参数：name是标签卡标题，active是哪个标签卡要优先展示，只允许一个标签卡使用active=\"true\"',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>29、插入文字显隐</strong><br>[bsopc]要显隐的文字内容[/bsopc]<br>\n    您可以在文章中通过该短代码插入要显隐的文字内容，只有当鼠标放在文字上时才会显示内容',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>30、插入文字提示</strong><br>[bstip text=\"悬浮提示文字内容\"]显示的文字内容[/bstip]<br>\n    您可以在文章中通过该短代码插入点击某些文字时要提示的文字内容，当访客点击文字后会在文字顶部会显示悬浮提示',\n        ),\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>31、插入KBD</strong><br> [bskbd style=\"dark\"]KBD键，如CTRL[/bskbd]<br>\n    您可以在文章中添加KBD键<br>\n    参数：<br>\n    style:dark、gray、white',\n        ),\n    )\n  ) );\nCSF::createSection( $prefix, array(\n    'title'       => '数据备份',\n    'icon'        => 'fas fa-cloud-download-alt',\n    'description' => '本主题支持您通过以下功能对您所填写的配置信息进行备份导出，也可以对备份的数据进行导入。',\n    'fields'      => array(\n\n        array(\n            'type' => 'backup',\n        ),\n\n    )\n) );\n\n?>\n\n<?php\nif(Bsoptions('Cache') == 1 && (Bsoptions('Cache_choose') == 'memcached' || Bsoptions('Cache_choose') == 'redis') && Bsoptions('enable_gcache') == 1){\n    $ifcache = '1';\n}\nelse{\n   $ifcache = '0'; \n}\n                $htmls = '\n                <script>\n                window.ifcache = \"'.$ifcache.'\";\n                </script>\n        <div class=\"ui three steps\">\n  <div class=\"step\" id=\"check\">\n    <i class=\"tree icon\"></i>\n    <div class=\"content\">\n      <div class=\"title\">检测</div>\n    </div>\n  </div>\n  <div class=\"disabled step\" id=\"upgrade\">\n    <i class=\"angle double right icon\"></i>\n    <div class=\"content\">\n      <div class=\"title\">升级</div>\n    </div>\n  </div>\n  <div class=\"disabled step\" id=\"finished\">\n    <i class=\"info icon\"></i>\n    <div class=\"content\">\n      <div class=\"title\">完成</div>\n    </div>\n  </div>\n</div>\n<div id=\"checkcon\">\n<div class=\"ui placeholder segment\">\n  <div class=\"ui icon header\">\n    <i class=\"cloud icon\"></i>\n    您可以通过点击以下按钮进行检测是否符合在线升级的条件\n  </div>\n  <div class=\"inline\">\n    <div class=\"ui button\" id=\"checkbtn\">检测版本</div>\n  </div>\n\n</div>\n  <div id=\"versiontipss\"></div>\n</div>\n<div id=\"upgradecon\" style=\"display:none\">\n<div class=\"ui placeholder segment\">\n  <div class=\"ui icon header\">\n    <i class=\"cloud icon\"></i>\n    检测到最新版本为 v<font id=\"newversion\"></font>，您可以通过点击以下按钮进行在线升级\n  </div>\n<div class=\"ui piled segment\" style=\"margin-top:10px;\">\n  <h4 class=\"ui header\">更新内容</h4>\n  <p id=\"upgradelog\"></p>\n</div>\n  <div class=\"inline\">\n    <div class=\"ui button\" id=\"upgradebtn\" style=\"margin-top:-10px;\">立即更新</div>\n    \n  </div>\n <center><div id=\"pre-message\" style=\"margin-top:20px;\"></div></center>\n <center><div id=\"progress-message\" style=\"margin-top:20px;\"></div></center>\n<progress id=\"progress\" value=\"0\" max=\"100\" style=\"display:none;margin-top:10px;width:100%;max-width:100%;height:20px\"></progress> \n\n</div>\n</div>\n\n<div id=\"finishcon\" style=\"display:none\">\n<div class=\"ui placeholder segment\">\n  <div class=\"ui icon header\">\n    <i class=\"green check icon\"></i>\n    您已成功升级到最新版本，系统将在三秒后自动刷新~~~\n  </div>\n\n</div>\n</div>\n\n<script>\n//检测\n$(\"#checkbtn\").on(\"click\",function(){\n$(\"#checkbtn\").addClass(\"loading\").attr(\"disabled\",\"disabled\");\n    $.post(\"https://upgrade.typecho.co.uk/Bearsimple/version.php\",function(data,status){\nswitch(status)\n{\ncase \"success\":\njson = JSON.parse(data);\nnowversion = \"'.themeVersion().'\";\nif(json.version > nowversion){\n$(\"#versiontipss\").html(\\'<div class=\"csf-submessage csf-submessage-warning\">检测到有新版本可以更新，3秒钟后自动跳转下一步!</div>\\');\n$(\"#newversion\").html(json.version);\n$.post(\"https://upgrade.typecho.co.uk/Bearsimple/upgrade_log.php\",function(data,status){\n$(\"#upgradelog\").html(data);\n});\nsetTimeout(function(){\n$(\"#check\").addClass(\"completed\");\n$(\"#upgrade\").removeClass(\"disabled\");\n$(\"#checkcon\").hide();\n$(\"#upgradecon\").fadeIn();\n},3000);\n}\nif(json.version == nowversion){\n$(\"#versiontipss\").html(\\'<div class=\"csf-submessage csf-submessage-success\">当前版本为最新版本，无需更新~<a href=\"https://docs.whitebear.dev/index.php/archives/6/\" target=\"_blank\">查看版本更新日志</a></div>\\');\n$(\"#checkbtn\").removeClass(\"loading\").removeAttr(\"disabled\",\"disabled\");\n}\nbreak;\ncase \"error\":\ntoastr.warning(\"最新版本获取失败，请稍后重试\");\n$(\"#checkbtn\").removeClass(\"loading\").removeAttr(\"disabled\",\"disabled\");\nbreak;\ncase \"timeout\":\ntoastr.warning(\"最新版本获取超时，请稍后重试\");\n$(\"#checkbtn\").removeClass(\"loading\").removeAttr(\"disabled\",\"disabled\");\nbreak;\n}\n    });\n});\n\n//升级\n$(\"#upgradebtn\").on(\"click\",function(){\n$(\"#upgradebtn\").addClass(\"loading\").attr(\"disabled\",\"disabled\");\n$(\"#upgradebtn\").css(\"pointer-events\",\"none\");\n$.ajax({\n                        type: \"GET\",\n                        url: \"/index.php/bs-upgrade\",\n                        data: {\n                            \"action\": \"prepare-download\",\n                        },\n                        dateType: \"json\",\n                        success: function(json) {\n                            json = JSON.parse(json);\n                             if(json.code == 0){\n                             layer.msg(json.message, {icon: 2});  \n                             $(\"#upgradebtn\").removeClass(\"loading\").removeAttr(\"disabled\",\"disabled\");\n$(\"#upgradebtn\").css(\"pointer-events\",\"auto\");\n                            }\n                            else{\n                           $(\"#pre-message\").html(\"升级包大小：\"+json.filesize+\"，预计需要三十秒，请耐心等待~\");\n                           $(\"#progress-message\").html(\"升级进度：0%\");\n                           $(\"#progress\").fadeIn();\n                        let x = document.getElementById(\"progress\");   \n                        x.setAttribute(\"value\", \"1\");\n                        intervaldown();\n                        //设置定时器定时每5秒获取一次升级进度\n                        let progressx = setInterval(function(){ \n                        intervalprogress();\n                        }, 5000);\n                        $(\"#progress\").one(\"click\",function(){\n                            clearInterval(progressx);\n                            finishUpgrade();\n                        })\n                            }\n                        },\n                        error: function() {\nalert(\"升级准备检测失败，请稍后重试\");\n$(\"#upgradebtn\").removeClass(\"loading\").removeAttr(\"disabled\",\"disabled\");\n                        }\n                    });\n                    \n});\nfunction intervaldown(){\n$.ajax({\n                        type: \"GET\",\n                        url: \"/index.php/bs-upgrade\",\n                        data: {\n                            \"action\": \"download\",\n                        },\n                        dateType: \"json\",\n                    });\n}\nfunction intervalprogress(){\n$.ajax({\n                        type: \"GET\",\n                        url: \"/index.php/bs-upgrade\",\n                        data: {\n                            \"action\": \"getsize\",\n                        },\n                        dateType: \"json\",\n                        success: function(json) {\n                            json = JSON.parse(json);\n                           $(\"#progress-message\").html(\"升级进度：\"+json.filesize+\"%\");\nlet x = document.getElementById(\"progress\");   \n                        x.setAttribute(\"value\", json.filesize);\n                if(json.filesize == \"100\"){\n                \n                $(\"#progress-message\").html(\"正在进行数据效验，请稍后...\");\n                setTimeout(function(){\n                   $(\"#progress\").click();\n},3000);\n                }\n                        },\n                        error: function() {\nalert(\"获取升级进度失败\");\n                        }\n                    });\n}\nfunction finishUpgrade(){\n$.ajax({\n                        type: \"GET\",\n                        url: \"/index.php/bs-upgrade\",\n                        data: {\n                            \"action\": \"finish\",\n                        },\n                        dateType: \"json\",\n                        success: function(json) {\n$(\"#upgrade\").addClass(\"completed\");\n$(\"#finished\").removeClass(\"disabled\");\n$(\"#upgradecon\").hide();\n$(\"#finishcon\").fadeIn();\nif(ifcache ==\"1\"){\n$.get(\"'.$cache_api.'\");\n}\nsetTimeout(function(){\nwindow.parent.location.reload();\n},3000);\n                        },\n                        error: function() {\nalert(\"升级失败\");\n                        }\n                    });\n}\n</script>\n        ';\n        \n        CSF::createSection( $prefix, array(\n    'title'       => '在线升级',\n    'icon'        => 'fa fa-cloud-upload-alt',\n    \n    'fields'      => array(\n        array(\n            'type'    => 'notice',\n            'style'   => 'info',\n            'content' => '<strong>注意事项</strong><p> <ul><li>1、若您有开启缓存功能，那么在升级完成后都请关闭一次缓存功能提交保存后再启用。</li><li>2、若出现在线升级卡顿无法升级，可能是您的服务器网络到升级节点之间存在异常，则需要手动覆盖升级或者稍等一会再试试。</li><li>3、若升级完毕后出现报错，可尝试通过手动覆盖新版本来进行修复，下载地址:<a href=\"https://files.bear.dance/Bearsimple/Bearsimple_v'.themeVersionOnly().'.release.zip\">戳这里</a></ul></p>',\n        ),\narray(\n                    'type' =>'content',\n                    'content' => $htmls,\n                ),\n        \n\n    )\n) );\n}\nfunction themeConfig($form)\n{\n\n   ?>\n       <?php $all = Typecho_Plugin::export();\n       \\Widget\\Security::alloc()->to($security);?>\n<?php if (!array_key_exists('BsCore', $all['activated'])) : ?>\n   <div class=\"update-check message error\"><p>检测到您未安装BsCore插件，主题尚处于封印状态，您需要安装启用BsCore核心插件后方能解除封印QAQ！<br>若您还未下载核心插件，可戳这里进行下载并将核心插件放入/usr/plugins，当下方出现解除封印按钮时点击按钮后即可解除封印~~~\n   <?php if(is_dir(Helper::options()->pluginDir('BsCore'))):?><br><button onclick=\"window.location.href='<?php $security->index('/action/plugins-edit?activate=BsCore'); ?>'\"  class=\"btn\">\n解除封印</button></p>\n</div>\n<?php endif;?>\n   <?php else:?>\n   \n<style>\n.body.container{\n    max-width:100%!important;\n}\n</style>\n        <link href=\"<?php echo Helper::options()->themeUrl;?>/assets/vendors/toastr.js/toastr.min.css\" rel=\"stylesheet\">\n\t<script src=\"<?php echo Helper::options()->themeUrl;?>/assets/vendors/toastr.js/toastr.min.js\"></script>\n\t<link href=\"<?php echo Helper::options()->themeUrl;?>/assets/vendors/driver.js/driver.min.css\" rel=\"stylesheet\">\n\t<script src=\"<?php echo Helper::options()->themeUrl;?>/assets/vendors/driver.js/driver.min.js.iife.js\"></script>\n        \n<?php\n\n    $params = [\n        'args'=> [\n            'framework_title' => 'Bearsimple v'.themeVersionOnly(),\n            'footer_text' => '自豪的使用BearSimple主题!',\n        ]\n    ];\n    ?>\n    \n<script>\n\n           window.deactivateURL = '<?php $security->index('/action/plugins-edit?deactivate=BsCore'); ?>';\n           window.activateURL = '<?php $security->index('/action/plugins-edit?activate=BsCore'); ?>';\n           window.CacheUrl = '<?php echo Common::url('clean-cache', Options::alloc()->index); ?>';\n           window.siteName = \"<?php echo Helper::options()->title; ?>\";\n           window.siteDesc = \"<?php echo Helper::options()->description; ?>\";\n           window.siteUrl = \"<?php echo Helper::options()->siteUrl; ?>\";\n           window.useTheme = 'bearsimple';\n           window.siteToken = '<?php echo md5Encode(Helper::options()->siteUrl); ?>7bae2123bear';\n        </script>\n        <?php\n    CSF::setup('bearsimple', $params);\n    \n    ?>\n   \n       <?php endif; ?>\n       <?php\n       CSF::setTypechoOptionForm($form);\n       ?>\n              <?php if (array_key_exists('BsCore', $all['activated'])) : ?>\n          <style>\n\n        .popup{\n            all:unset;\n            font-size:0; overflow:hidden;\n        }\n        .message{\n            all:unset;\n            font-size:0; overflow:hidden;\n        }\n        .message a{\n            all:unset;\n            font-size:0; overflow:hidden;\n        }\n        .success{\n            all:unset;\n            font-size:0; overflow:hidden;\n        }\n        .success a{\n            all:unset;\n            font-size:0; overflow:hidden;\n        }\n        .message.popup.success{\n            all:unset;\n            font-size:0; overflow:hidden;\n        }\n        </style>\n<?php endif; ?>\n\n       <?php if (!array_key_exists('BsCore', $all['activated'])) : ?>\n       \n    <script src=\"<?php echo Helper::options()->themeUrl; ?>assets/js/jquery.min.js\"></script>\n    \n\n   <script>\n       $('#wpwrap').hide();\n   </script>\n   <?php endif; ?>\n    <?php\n} ?>"
  },
  {
    "path": "github.php",
    "content": "<?php\n    /**\n    * 我的Github仓库\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n<?php $this->need('compoment/head.php');?>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n    <div class=\"page-card\">\n                    <h2><i class=\"github alternate icon\"></i> <?php $this->title() ?></h2>\n\n<?php if(!empty(Bsoptions('github_note'))): ?>     \n    <div class=\"ui segment\">\n  <i class=\"red heart icon\"></i>\n  <?php echo Bsoptions('github_note');?>\n</div>\n<?php endif; ?>\n\n\n\n\n<div class=\"ui active inverted dimmer\" id=\"commonLoad\" style=\"display:none\">\n    <div class=\"ui active black elastic loader\"></div>\n  </div>\n <div id=\"loading\"  class=\"ui icon message\" style=\"display:none\">\n  <i class=\"github alternate loading icon\"></i>\n  <div class=\"content\">\n    <div class=\"header\">\n      正在获取中.....\n    </div>\n    <p>请稍等一下哦～马上就出来了</p>\n  </div>\n</div>\n                <div class=\"github-projects\">\n                    </div>\n<br>\n            <!--分页链接-->\n            <div class=\"pagelist\">\n            </div>\n</div>\n</div>\n\n <script>\n$(\"#loading\").show();\n            $(function() {\n                var page = 1;\n                var n = 0;\n                var max = 1;\n                getData();\n                function getData() {\n                    $.ajax({\n                        type: \"GET\",\n                        async:true,\n                        url: \"<?php getGhFile(); ?>\",\n                        data: {\n                            \"page\": page,\n                            \"type\": 'github'\n                        },\n                        dateType: \"json\",\n                        success: function(json) {\n                            json = JSON.parse(json);\n                            n = json.total;\n                            max = json.max;\n                            if(json.total == null || json.total == 0){\n                             toastr.warning('啊哦，暂未获取到数据~~请稍后再试');   \n                             $(\"#loading\").hide();\n                            }\n                            else{\n                            content(json.list);\n                            }\n                        },\n                        complete: function() {\n                            $(\"#commonLoad\").fadeOut();\n                            pageList();\n                        },\n                        error: function() {\n                            alert(\"数据获取错误，请稍后再试~~\");\n                        }\n                    });\n                };\n                function pageList() {\n                    page = Math.min(page, max);\n                    page = Math.max(page, 1);\n                    var html = \"<center><div class=\\\"ui circular labels\\\"><a class=\\\"ui label\\\" data-page=\"+ page +\">共\" + n + \"条</a><a class=\\\"ui label\\\" data-page=\"+ page +\">第\" + page + \"/\" + max + \"页</a>\";\n                    html += '<a class=\\\"ui label\\\" href=\"#\" data-page=\"1\">首页</a>';\n                    html += (page > 1) ? '<a class=\\\"ui label\\\" href=\"#\" data-page=\"' + (page - 1) + '\">上一页</a>' : '<a class=\\\"ui label\\\" href=\"#\" data-page=\"1\">上一页</a>';\n                    html += (page < max) ? '<a class=\\\"ui label\\\" href=\"#\" data-page=\"' + (page + 1) + '\">下一页</a>' : '<a class=\\\"ui label\\\" href=\"#\" data-page=\"' + max + '\">下一页</a>';\n                    html += '<a class=\\\"ui label\\\" href=\"#\" data-page=\"' + max + '\">尾页</a><div class=\\\"ui mini input\\\"><input id=\\\"dipage\\\" type=\\\"number\\\" placeholder=\\\"输入跳转的页码\\\"></div><a id=\\\"gopage\\\" class=\\\"ui label\\\" href=\"#\">跳转到指定页</a></div></center>';\n                    var $html = $(html);\n                    \n                    $html.find(\"a\").click(function() {\n                        if($(this).attr(\"id\")!=='gopage'){\n                        page = $(this).attr(\"data-page\");\n                        }\n                        else{\n                            var dipage = document.getElementById(\"dipage\").value;\n                            switch(dipage){\n                            case dipage < 1 :\n                                page = 1;\n                            break;\n                            case dipage > max:\n                                page = max;\n                            break;\n                            default:\n                            page = dipage;\n                        };\n                        };\n                        $(\"#commonLoad\").fadeIn();\n                        getData();\n                    });\n                    \n                    \n                    $(\".pagelist\").html($html);\n                };\n                function abbreviateNumber(number) {\n  if (number >= 1000) {\n    return (number / 1000).toFixed(1) + 'k';\n  }\n  return number.toString();\n}\n                function content(list) {\n                    var str = \" \";\n                    for(var i in list) {\n\nstr += '<div class=\"project-card\"><h2 class=\"project-name\">' + list[i]['name'] + '</h2><div class=\"project-lan\"><span class=\"project-language\"><i class=\"fas fa-code\"></i>' + list[i]['language'] + '</span></div><p class=\"project-description\">' + list[i]['dec'] + '</p><div class=\"project-meta\"><div class=\"project-stats\"><span class=\"project-stars\"><i class=\"fas fa-star\"></i> ' + abbreviateNumber(list[i]['stars']) + '</span><span class=\"project-forks\"><i class=\"fas fa-code-branch\"></i> ' + abbreviateNumber(list[i]['forks']) + '</span></div></div><a href=\"' + list[i]['url'] + '\" class=\"project-link\" target=\"_blank\">访问项目仓库</a></div>'\n}\n$(\".github-projects\").html(str);\n$(\"#loading\").hide();\n\n\n                }\n            });\n        </script>\n  \n</div>\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "index.php",
    "content": "<?php\n/**\n * 简洁清新淡雅，让写作回归内容本身<br><font color=red>建议使用PHP8.2，低于PHP8可能会出现报错<br>已适配Typecho v1.3，若有兼容性问题请及时反馈~</font>\n * @package BearSimple \n * @author BearNotion\n * @version v2.9.9-release\n * @link https://www.bearnotion.ru/\n * \n */\n\nif (!defined('__TYPECHO_ROOT_DIR__')) exit;\n $this->need('compoment/head.php');\n  ?>\n\n\n<?php $this->need('pages/index-z.php'); ?>\n\n\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>\n"
  },
  {
    "path": "links.php",
    "content": "<?php\n    /**\n    * 友链\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit;\n$loader = Bsoptions('Lazyload_style');\n?>\n<?php $this->need('compoment/head.php');?>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n         <div class=\"page-card\">\n                <h2><i class=\"jsfiddle icon\"></i> <?php $this->title() ?></h2><br>    \n\n<ul id=\"friendlinks\">\n<?php echo $this->content ?>\n\n</ul>\n<br>\n    <?php if(!$this->hidden): ?>\n    <?php $this->need('comments.php'); ?>\n<?php else:?>\n<center>\n<h3 class=\"ui icon header\">\n  <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>\n  <div class=\"content\">\n    评论区已被封印~\n  </div>\n</h3></center>\n<?php endif; ?>\n\n\n</div>\n<script>\n(function(){\n    let a =document.getElementById(\"friendlinks\");\n    if(a){\n        let ns = a.querySelectorAll(\"bslink\");\n        let nsl = ns.length;\n        let str ='<div class=\"ui three column doubling stackable masonry grid\" style=\"word-break:break-all;\">';\n        let bgid = 0;\n        for(let i = 0;i<=nsl-4;i+=4){\n           bgid = Math.floor(Math.random() * 6);\n            str += (`<div class=\"column\"><div class=\"ui fluid card\" hrefs=\"${ns[i+1].innerText}\"<?php if(Bsoptions('Link_blank') == true):?> target=\"_blank\"<?php endif; ?>><div class=\"content\"><div class=\"center aligned header\">${ns[i].innerText}</div><div class=\"center aligned description\"><p>${ns[i+3].innerText}</p></div></div><div class=\"extra content\"><div class=\"center aligned author\"><img class=\"ui avatar image<?php if(Bsoptions('Lazyload') == true): ?> lazyload lazyload-style-<?php echo $loader;?><?php endif;?>\" <?php if(Bsoptions('Lazyload') == true): ?>src=\"data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\" <?php endif; ?> <?php if(Bsoptions('Lazyload') == true): ?> data-<?php endif; ?>src=\"${ns[i+2].innerText}\">${ns[i].innerText}</div></div></div></div>`);\n        }\n        str+='</div>';\n        let n1 = document.createElement(\"div\");\n        n1.innerHTML = str;\n        a.parentNode.insertBefore(n1,a);\n        a.style=\"display: none;\";\n    }else{\n        console.log('error');\n    }\n}());\n </script> \n\n\n\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "links_new.php",
    "content": "<?php\n    /**\n    * 友链[新]\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit;\n$loader = Bsoptions('Lazyload_style');\n?>\n<?php $this->need('compoment/head.php');?>\n<?php if(Bsoptions('FriendLinkSkin') == '1' || Bsoptions('FriendLinkSkin') == '3'): ?>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"<?php AssetsDir();?>assets/css/modules/friendlink_custom.min.css?v=<?php echo themeVersion(); ?>\">\n<?php endif; ?>\n\n    \n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n                   <div class=\"page-card\">\n                <h2><i class=\"jsfiddle icon\"></i> <?php $this->title() ?></h2>\n<div class=\"ui secondary pointing short scrolling menu\"  id=\"uitab\">\n    <a class=\"active item\" data-tab=\"first\"><i class=\"list icon\"></i>友链列表</a>\n    <?php if(Bsoptions('FriendLinkRejectShow') == true):?>\n    <a class=\"item\" data-tab=\"fourth\"><i class=\"exclamation circle icon\"></i>失效友链列表</a>\n    <?php endif;?>\n  <a class=\"item\" data-tab=\"second\"><i class=\"bullhorn icon\"></i>友链说明</a>\n                      <?php if(Bsoptions('FriendLinkSubmit') == true || Bsoptions('FriendLinkSubmit') == ''): ?><a class=\"item\" data-tab=\"third\"><i class=\"hand holding heart icon\"></i>提交友链</a><?php endif; ?>\n\n</div>\n<div class=\"ui bottom attached active tab \" data-tab=\"first\">\n    <?php if(Bsoptions('FriendLinkSkin') == '0' || Bsoptions('FriendLinkSkin') == ''): ?>\n    <div class=\"flcard-columns\">\n      <?php foreach(get_friendlink() as $link): ?>\n    <a class=\"flcard\" href=\"<?php echo $link['friendurl']; ?>\" <?php if(Bsoptions('Link_blank') == true):?> target=\"_blank\"<?php endif; ?> style=\"text-align:center\">\n      <div class=\"flcard-body\">\n        <div class=\"mt-1 mb-1\">\n          <img class=\"flcard-avatar<?php if(Bsoptions('Lazyload') == true): ?> lazyload lazyload-style-<?php echo $loader;?><?php endif;?>\" <?php if(Bsoptions('Lazyload') == true): ?>src=\"data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\" data-<?php endif; ?>src=\"<?php echo $link['friendpic']; ?>\" <?php if(Bsoptions('Lazyload') == '' || Bsoptions('Lazyload') == false): ?>loading=\"lazy\"<?php endif;?>>\n        </div>\n        <div style=\"margin-top:-3px\">\n        <h4 class=\"flcard-title mb-1\"><?php echo $link['friendname']; ?></h4>\n        <p class=\"mt-1 mb-1\"><?php echo $link['frienddec']; ?></p>\n        </div>\n      </div>\n    </a>\n      <?php endforeach; ?>\n      </div>\n     <?php endif;?>\n    \n   \n      \n      \n<?php if(Bsoptions('FriendLinkSkin') == '1'): ?>\n<div class=\"page friend\">\n\t\t\t\t<ul class=\"friend-ul grid w-full grid-cols-3 gap-4 sm:grid-cols-4 xl:grid-cols-5\">\n\t\t\t\t     <?php foreach(get_friendlink() as $link): ?>\n\t\t\t\t\t<li class=\"relative inline-block transform overflow-hidden text-center duration-300 hover:-translate-y-1\">\n\t\t\t\t\t\t<a href=\"<?php echo $link['friendurl']; ?>\" class=\"block h-full w-full py-4\"\n\t\t\t\t\t\t   <?php if(Bsoptions('Link_blank') == true):?> target=\"_blank\"<?php endif; ?> rel=\"noopener noreferrer\"><?php echo $link['friendname']; ?></a>\n\t\t\t\t\t\t<img class=\"friend-img absolute right-0 top-0 h-full transform rounded-full duration-300<?php if(Bsoptions('Lazyload') == true): ?> lazyload lazyload-style-<?php echo $loader;?><?php endif;?>\" <?php if(Bsoptions('Lazyload') == true): ?>src=\"data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\" <?php endif; ?>\n\t\t\t\t\t\t\t <?php if(Bsoptions('Lazyload') == true): ?> data-<?php endif; ?>src=\"<?php echo $link['friendpic']; ?>\" alt=\"<?php echo $link['friendname']; ?>\" <?php if(Bsoptions('Lazyload') == '' || Bsoptions('Lazyload') == false): ?>loading=\"lazy\"<?php endif;?>>\n\t\t\t\t\t</li>\n\t\t\t\t\t<?php endforeach; ?>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t</ul>\n</div>\n<?php endif;?>\n<?php if(Bsoptions('FriendLinkSkin') == '2'): ?>\n  <div class=\"ui three column doubling stackable masonry grid\" style=\"word-break:break-all;\">\n      <?php foreach(get_friendlink() as $link): ?>\n      <div class=\"column\">\n      <div class=\"ui fluid card\" hrefs=\"<?php echo $link['friendurl']; ?>\"<?php if(Bsoptions('Link_blank') == true):?> target=\"_blank\"<?php endif; ?>><div class=\"content\"><div class=\"center aligned header\"><?php echo $link['friendname']; ?></div><div class=\"center aligned description\"><p><?php echo $link['frienddec']; ?></p></div></div><div class=\"extra content\"><div class=\"center aligned author\"><img class=\"ui avatar image<?php if(Bsoptions('Lazyload') == true): ?> lazyload lazyload-style-<?php echo $loader;?><?php endif;?>\" <?php if(Bsoptions('Lazyload') == true): ?>src=\"data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\" <?php endif; ?> <?php if(Bsoptions('Lazyload') == true): ?> data-<?php endif; ?>src=\"<?php echo $link['friendpic']; ?>\" <?php if(Bsoptions('Lazyload') == '' || Bsoptions('Lazyload') == false): ?>loading=\"lazy\"<?php endif;?>><?php echo $link['friendname']; ?></div></div></div></div>\n      <?php endforeach; ?>\n     </div>\n     <?php endif;?>\n <?php if(Bsoptions('FriendLinkSkin') == '3'): ?>\n <div class=\"bsui_link_container\">\n        <div class=\"bsui_link_masonry\">\n      <?php foreach(get_friendlink() as $link): ?>\n      <div class=\"bsui_link_card\">\n                <img <?php if(Bsoptions('Lazyload') == true): ?>src=\"data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\" <?php endif; ?> <?php if(Bsoptions('Lazyload') == true): ?> data-<?php endif; ?>src=\"<?php echo $link['friendpic']; ?>\" class=\"bsui_link_icon<?php if(Bsoptions('Lazyload') == true): ?> lazyload lazyload-style-<?php echo $loader;?><?php endif;?>\" <?php if(Bsoptions('Lazyload') == '' || Bsoptions('Lazyload') == false): ?>loading=\"lazy\"<?php endif;?>>\n                <div class=\"bsui_link_content\">\n                    <a href=\"<?php echo $link['friendurl']; ?>\" class=\"bsui_link_name\"<?php if(Bsoptions('Link_blank') == true):?> target=\"_blank\"<?php endif; ?>><?php echo $link['friendname']; ?></a>\n                    <p class=\"bsui_link_desc\"><?php echo $link['frienddec']; ?></p>\n                </div>\n            </div>\n     \n      <?php endforeach; ?>\n     </div></div>\n     <?php endif;?>  \n   \n   \n \n    \n    \n</div>\n<?php if(Bsoptions('FriendLinkRejectShow') == true):?>\n<div class=\"ui bottom attached tab \" data-tab=\"fourth\">\n    <?php if(Bsoptions('FriendLinkRejectShow') == true && Bsoptions('FriendLinkRejectNote') !== ''):?>\n    <div class=\"ui warning message\">\n  <i class=\"exclamation circle icon\"></i>\n  <?php echo Bsoptions('FriendLinkRejectNote');?>\n</div>\n<?php endif;?>\n <table class=\"ui black unstackable celled long scrolling table\" style=\"word-break:break-all\">\n  <thead>\n    <tr><th>友链名称</th>\n    <th>失效原因</th>\n  </tr></thead><tbody>\n      <?php foreach(get_friendlink('reject') as $link): ?>\n    <tr>\n      <td><?php echo $link['friendname'];?></td>\n      <td><?php if($link['rejectreason'] == NULL):?>无<?php else:?><?php echo $link['rejectreason'];?><?php endif;?></td>\n    </tr>\n    <?php endforeach;?>\n \n  </tbody>\n</table>\n    </div>\n    <?php endif;?>\n<div class=\"ui bottom attached tab bdesc\" data-tab=\"second\">\n  <?php echo reEmoPost(ShortCode($this->content,$this,$this->user->hasLogin(),$this->fields->ArticleType)); ?>\n</div>\n\n\n<div class=\"ui bottom attached tab \" data-tab=\"third\">\n\n\n\n<form class=\"ui form\" id=\"friendform\">\n  <div class=\"field\">\n    <label class=\"required\">友链名称</label>\n    <input type=\"text\" id=\"friendname\" name=\"friendname\" placeholder=\"填写友链名称\" required>\n  </div>\n  <div class=\"field\">\n    <label class=\"required\">友链网址</label>\n    <input type=\"text\" id=\"friendurl\" name=\"friendurl\" placeholder=\"填写友链网址，包含http(s)://\" required>\n  </div>\n  <div class=\"field\">\n    <label <?php if(Bsoptions('FriendLinkLogomust') == true):?>class=\"required\"<?php endif;?>>友链图标</label>\n    <input type=\"text\" id=\"friendpic\" name=\"friendpic\" placeholder=\"填写友链图标地址，包含http(s)://\">\n  </div>\n \n  <div class=\"field\">\n    <label class=\"required\">友链描述</label>\n    <input type=\"text\" id=\"frienddec\" name=\"frienddec\" placeholder=\"填写友链描述\" required>\n  </div>\n  <div class=\"field\">\n    <label id=\"contm\"<?php if(Bsoptions('FriendLinkEmailmust') == true):?> class=\"required\"<?php endif;?>>联系邮箱</label>\n    <input type=\"text\" id=\"contactmail\" name=\"contactmail\" placeholder=\"填写联系邮箱\" <?php if(empty(Bsoptions('FriendLinkLogoDefault'))):?>required<?php endif;?>>\n  </div>\n <div class=\"field\">\n    <label class=\"required\">您站点的友链放置页面网址</label>\n    <input type=\"text\" id=\"friendcheckurl\" name=\"checkurl\" placeholder=\"填写您站点的友链放置页面网址\" required>\n  </div>\n\n\n<?php switch(Bsoptions('VerifyChoose')) :?>\n<?php case '1' :?>\n             <?php \\BsCore\\Plugin::spam_protection_mathjia();?>\n            <div class=\"field\">\n      <label class=\"required\">若提交，则表示您已阅读本站友链相关说明并严格遵守本站关于友链的相关要求</label>\n</div>\n   <div class=\"ui button\" id=\"friendbtn\" >提交</div>\n             <?php break; ?>\n             <?php case '11' :?>\n             <?php \\BsCore\\Plugin::spam_protection_mathjian();?>\n             <div class=\"field\">\n      <label class=\"required\">若提交，则表示您已阅读本站友链相关说明并严格遵守本站关于友链的相关要求</label>\n</div>\n<div class=\"ui button\" id=\"friendbtn\" >提交</div>\n             <?php break; ?>\n              <?php case '22-2' :?>\n             <?php \\BsCore\\Plugin::spam_protection_question();?>\n            <div class=\"field\">\n      <label class=\"required\">若提交，则表示您已阅读本站友链相关说明并严格遵守本站关于友链的相关要求</label>\n</div>\n<div class=\"ui button\" id=\"friendbtn\">提交</div>\n             <?php break; ?>\n             <?php case '2' :?>\n          \n             \n             <?php $this->need('modules/Verify/BearCaptcha/Vaptcha/Vaptcha_Link.php'); ?>\n    <div class=\"field\">\n      <label class=\"required\">若提交，则表示您已阅读本站友链相关说明并严格遵守本站关于友链的相关要求</label>\n</div>\n<div class=\"ui button\" id=\"friendbtn\"  style=\"pointer-events:none\">提交</div>\n             <?php break; ?>\n             <?php case '2-1' :?>\n       \n             <?php $this->need('modules/Verify/BearCaptcha/Dingxiang/DX_Captcha_Link.php'); ?>\n             <div class=\"field\">\n      <label class=\"required\">若提交，则表示您已阅读本站友链相关说明并严格遵守本站关于友链的相关要求</label>\n</div>\n<div class=\"ui button\" id=\"friendbtn\"  style=\"pointer-events:none\">提交</div>\n             <?php break; ?>\n             <?php case '2-2' :?>\n            \n             <?php $this->need('modules/Verify/BearCaptcha/Turnstile/Turnstile_Link.php'); ?>\n             <div class=\"field\">\n      <label class=\"required\">若提交，则表示您已阅读本站友链相关说明并严格遵守本站关于友链的相关要求</label>\n</div>\n<div class=\"ui button\" id=\"friendbtn\"  style=\"pointer-events:none\">提交</div>\n             <?php break; ?>\n              <?php case '2-3' :?>\n          \n             <?php $this->need('modules/Verify/BearCaptcha/Geetest/Geetest_Link.php'); ?>\n             <div class=\"field\">\n      <label class=\"required\">若提交，则表示您已阅读本站友链相关说明并严格遵守本站关于友链的相关要求</label>\n</div>\n\t<div class=\"ui button\" id=\"friendbtn\"  style=\"pointer-events:none\">提交</div>\n             <?php break; ?>\n             <?php case '22' :?>\n          \n             <p>\n             <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{\n\t\t\techo Bsoptions('Verify22_Buttontext');}\n\t\t\t  ?></span>\n\t\t\t  <div class=\"field\"><div style=\"height:5px\"></div>\n      <label class=\"required\">若提交，则表示您已阅读本站友链相关说明并严格遵守本站关于友链的相关要求</label>\n</div>\n\t\t\t  <div class=\"ui button\" id=\"friendbtn\"  style=\"pointer-events:none\">提交</div>\n\n</p>\n<?php $this->need('modules/Verify/BearCaptcha/Captcha/Captcha_Link.php'); ?>\n             <?php break; ?>\n     <?php case '3' || '' :?>\n      <div class=\"field\">\n  <label class=\"required\">验证码</label>\n   <div id=\"captcha\">\n    </div>\n        <div class=\"field\">\n    <input style=\"width:200px\" type=\"text\" id=\"captcha_verify\" name=\"captcha_verify\" placeholder=\"输入验证码，区分大小写\">\n  </div>\n  </div>\n         <div class=\"field\">\n      <label class=\"required\">若提交，则表示您已阅读本站友链相关说明并严格遵守本站关于友链的相关要求</label>\n</div>\n         <div class=\"ui button\" id=\"friendbtn\">提交</div>\n             <?php break; ?>\n <?php endswitch; ?>\n  \n</form>\n\n\n</div>\n\n</div>\n<script>\n$(function(){\n    <?php if(Bsoptions('VerifyChoose') == '3'||Bsoptions('VerifyChoose') == '') :?>\n    createCaptcha();\n    <?php endif; ?>\n    getTokenInfo();\n    $('#friendbtn').on('click',function(){\n        let friendName = document.getElementById('friendname');\n    let friendUrl = document.getElementById('friendurl');\n    let friendPic = document.getElementById('friendpic');\n    let friendDec = document.getElementById('frienddec');\n    let contactMail = document.getElementById('contactmail');\n    let checkurl = document.getElementById('friendcheckurl');\n    <?php if(Bsoptions('VerifyChoose') == '3'||Bsoptions('VerifyChoose') == '') :?>\n    let captcha = document.getElementById('captcha_verify');\n    <?php endif; ?>\n    let rejectWord = new RegExp(\"[`~!#$^*|{}';',\\\\[\\\\]<>《》~！#￥……*（）——|{}【】‘；：”“'。，、？ ]\");\n    let checkmail = /^[a-zA-Z0-9]+([-_.][A-Za-zd]+)*@([a-zA-Z0-9]+[-.])+[A-Za-zd]{2,5}$/;\n    if($(\"#contm\").hasClass('required')){\n    if(contactMail.value == ''){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您的联系邮箱为空,请务必填写哦', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n        return false;\n    }    \n    \n    if(rejectWord.test(contactMail.value) ||checkmail.test(contactMail.value) == false){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您的联系邮箱包含违规字符，也有可能是非邮箱正确格式哦', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n        return false;\n    }\n    };\n    if(friendName.value == '' || rejectWord.test(friendName.value)){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您的友链名称为空或者包含违规字符哦', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n        return false;\n    }\n    else if(friendUrl.value == '' || rejectWord.test(friendUrl.value)){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您的友链网址为空或者包含违规字符哦', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n        return false;\n    }\n    else if(checkurl.value == '' || rejectWord.test(checkurl.value)){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您站点的友链放置页面网址为空或者包含违规字符哦', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n        return false;\n    }\n   \n    else if(friendDec.value == ''){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您的友链描述为空或者包含违规字符哦', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n        return false;\n    }\n    <?php if(Bsoptions('VerifyChoose') == '3'||Bsoptions('VerifyChoose') == '') :?>\n    else if(captcha.value == ''){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '验证码为空哦', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n        return false;\n    }\n    else if(captcha.value !== code){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '验证码错误，请重新输入', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\tcreateCaptcha();\n        return false;\n    };\n    <?php endif; ?>\n    $(\"#friendbtn\").css(\"pointer-events\",\"none\").addClass('loading');\n                    $.ajax({\n                        type: \"POST\",\n                        url: \"<?php getFriendFile(); ?>\",\n                        data: $(\"#friendform\").serialize(),\n                        dateType: \"json\",\n                        success: function(json) {\n                            jsonx = json.trim();\n                            result = JSON.parse(jsonx);\n                       switch(result.code){  \n                           case 1:\n                    $('body').toast({\n\t\t\t\t\t\t\t    title:'提交成功',\n\t\t\t\t\t\t\t    class: 'green',\n\t\t\t\t\t\t\t    message: '您的友链申请已提交成功，请等待博主审核～', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t$('body').toast({\n\t\t\t\t\t\t\t    title:'提交失败',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: result.msg, \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t$(\"#friendbtn\").css(\"pointer-events\",\"auto\").removeClass('loading');\n\t\t\t\t\t\t    break;\n                       }\n                        },\n                        error: function() {\n                            alert(\"提交过程中出现错误，请稍后再试~~\");\n                        }\n                    });\n});\n });\nfunction getTokenInfo(){\n     $.post('<?php getCommentAction(); ?>',{action:'getCommentToken'},function (res) {\n         res = JSON.parse(res);\n         if(res.code == 1){\n             $(\"#SecurityToken\").remove();\n        var tokenInput=$(\"<input type=\\\"hidden\\\" name=\\\"SecurityToken\\\"  id=\\\"SecurityToken\\\">\");\ntokenInput.attr(\"value\", res.token);\n$(\"#friendform\").append(tokenInput);\n         }\n    })\n}\nvar code;\nfunction createCaptcha() {\n  document.getElementById('captcha').innerHTML = \"\";\n  var charsArray =\n  \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@!#$%^&*\";\n  var lengthOtp = 6;\n  var captcha = [];\n  for (var i = 0; i < lengthOtp; i++) {\n    var index = Math.floor(Math.random() * charsArray.length + 1);\n    if (captcha.indexOf(charsArray[index]) == -1)\n    captcha.push(charsArray[index]);else\n    i--;\n  }\n  var canv = document.createElement(\"canvas\");\n  canv.id = \"captcha\";\n  canv.width = 100;\n  canv.height = 50;\n  var ctx = canv.getContext(\"2d\");\n  ctx.font = \"25px Georgia\";\n  ctx.strokeText(captcha.join(\"\"), 0, 30);\n  code = captcha.join(\"\");\n  document.getElementById(\"captcha\").appendChild(canv);\n}\n </script> \n\n</div>\n\n</div>\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "memos.php",
    "content": "<?php\n    /**\n    * Memos\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n<?php $this->need('compoment/head.php');?>\n<link rel=\"stylesheet\" href=\"https://staticfile.typecho.co.uk/fancybox/fancybox.min.css\">\n<script>\nwindow.Prism = window.Prism || {};\nwindow.Prism.manual = true; // 禁用自动高亮\n</script>\n<?php if(Bsoptions('Emoji') == true) :?>\n<link href=\"<?php AssetsDir();?>assets/vendors/bs-emoji/bs-emoji.css\" rel=\"stylesheet\" type=\"text/css\">\n<?php endif; ?>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n              <div class=\"page-card\">\n                    <h2><i class=\"lightbulb outline icon\"></i> <?php $this->title() ?></h2>\n\n    <script src=\"<?php AssetsDir();?>assets/vendors/marked.js/marked.min.js\"></script>\n    <script src=\"<?php AssetsDir();?>assets/vendors/purify/purify.min.js\"></script>\n\n\n    <div id=\"memo-container\"></div>\n    <button id=\"loadMore\" class=\"load-more\">加载更多</button>\n    \n<script>\n        var nextPageToken = '';\nvar MEMO_DOMAIN = '<?php echo Bsoptions('memos_Url');?>';\nvar pageSize = 10;\nvar isLoading = false;\nvar userCache = {};\nvar pendingUserRequests = {};\n\nasync function fetchUserNickname(creator) {\n  try {\n    const response = await fetch(`${MEMO_DOMAIN}/api/v1/${creator}`);\n    if (!response.ok) throw new Error('用户信息获取失败');\n    const data = await response.json();\n    return data.nickname || '未知用户';\n  } catch (error) {\n    console.error('获取用户信息失败:', error);\n    return '用户加载失败';\n  }\n}\n\nfunction updateUserDisplay(creator, nickname) {\n  document.querySelectorAll(`.author-name[data-creator=\"${creator}\"]`).forEach(el => {\n    el.textContent = nickname;\n  });\n}\n\n        function getResourceUrl(resource) {\n            if (resource.externalLink) return resource.externalLink;\n            return `${MEMO_DOMAIN}/file/${encodeURIComponent(resource.name)}/${encodeURIComponent(resource.filename)}`;\n        }\n\n        function renderResources(resources) {\n            return resources.map(res => {\n                const url = getResourceUrl(res);\n                if (res.type.startsWith('image/')) {\n                    return `<div class=\"resource-item\">\n                        <img src=\"${url}\" alt=\"${res.filename}\" loading=\"lazy\">\n                    </div>`;\n                }\n                return `<div class=\"resource-item\">\n                    <a href=\"${url}\" target=\"_blank\" rel=\"noopener\"><i class=\"file alternate outline icon\"></i>${res.filename}</a>\n                </div>`;\n            }).join('');\n        }\n\nfunction renderMemoCard(memo) {\n  const container = document.createElement('div');\n  container.className = 'memo-item';\n  \n  const creator = memo.creator;\n  const memoId = memo.name;\n  const cleanContent = DOMPurify.sanitize(marked.parse(memo.content));\n  \n  container.innerHTML = `\n    <div class=\"avatar-container\">\n      <div class=\"avatar\">\n      <?php if(Bsoptions('memos_Autoavatar') == '' || Bsoptions('memos_Autoavatar') == true):?>\n        <img src=\"https://api.dicebear.com/7.x/miniavs/svg?seed=${creator.split('/').pop()}\">\n    <?php else:?>\n       <img src=\"<?php echo Bsoptions('memos_Avatar');?>\">\n       <?php endif;?>\n      </div>\n    </div>\n    <div class=\"memo-card\">\n      <div class=\"memo-header\">\n        <span class=\"author-name\" data-creator=\"${creator}\">\n          ${userCache[creator] || '加载中...'}\n        </span>\n        <span class=\"memo-time\">${new Date(memo.displayTime).toLocaleString('zh-CN')}</span>\n      </div>\n      <div class=\"memo-body\">\n        ${cleanContent}\n        ${memo.resources?.length ? `<div class=\"memo-resources\">${renderResources(memo.resources)}</div>` : ''}\n        ${renderLocation(memo.location)}\n      </div>\n      <?php if(Bsoptions('memos_Emaction') == true):?>\n      <div class=\"emoji-reaction\">\n      <emoji-reaction theme=\"light\" endpoint=\"<?php getEmactionAction();?>\" reacttargetid=\"${memoId}\" ></emoji-reaction>\n      </div>\n      <?php endif;?>\n    </div>\n  `;\n\n  if (!userCache[creator] && !pendingUserRequests[creator]) {\n    pendingUserRequests[creator] = true;\n    \n    fetchUserNickname(creator).then(nickname => {\n      userCache[creator] = nickname;\n      pendingUserRequests[creator] = false;\n      updateUserDisplay(creator, nickname);\n    });\n  }\n\n  return container;\n}\n\nfunction renderLocation(location) {\n    if (!location || typeof location !== 'object') return '';\n\n    const { placeholder, latitude, longitude } = location;\n\n    if (typeof latitude === 'number' && typeof longitude === 'number') {\n        return `\n        <div class=\"memo-location\">\n            <div class=\"location-icon\"></div>\n            <div class=\"location-text\">\n                <span>${placeholder || '当前位置'}</span>\n            </div>\n        </div>\n        `;\n    }\n\n    if (placeholder) {\n        return `\n        <div class=\"memo-location placeholder\">\n            <div class=\"location-icon\">❔</div>\n            <div class=\"location-text\">\n                ${placeholder}\n            </div>\n        </div>\n        `;\n    }\n\n    return '';\n}\n  \n        async function loadMemos() {\n            if (isLoading || nextPageToken === null) return;\n\n            const loadBtn = document.getElementById('loadMore');\n            try {\n                isLoading = true;\n                loadBtn.disabled = true;\n                loadBtn.textContent = '加载中...';\n\n                const params = new URLSearchParams({ pageSize });\n                if (nextPageToken) params.set('pageToken', nextPageToken);\n\n                const response = await fetch(`${MEMO_DOMAIN}/api/v1/<?php if(Bsoptions('memos_Username') !== '' && Bsoptions('memos_Username') !== null):?>users/<?php echo Bsoptions('memos_Username');?>/<?php endif;?>memos?${params}`);\n                if (!response.ok) {\n                    const error = await response.json();\n                    throw new Error(error.message || `HTTP错误 ${response.status}`);\n                }\n\n                const data = await response.json();\n                nextPageToken = data.nextPageToken || null;\n\n                const container = document.getElementById('memo-container');\n                data.memos.forEach(memo => container.appendChild(renderMemoCard(memo)));\n\n                loadBtn.textContent = nextPageToken ? '加载更多' : '没有更多了';\n            } catch (error) {\n                console.error('加载失败:', error);\n                loadBtn.textContent = `加载失败: ${error.message}`;\n                nextPageToken = null;\n            } finally {\n                isLoading = false;\n                loadBtn.disabled = !nextPageToken;\n            }\n        }\n$(document).ready(function() {\n        document.getElementById('loadMore').addEventListener('click', loadMemos);\n        loadMemos();\n});\n    </script>\n\n</div></div>\n\n\n\n\n</div>\n\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "messages.php",
    "content": "<?php\n    /**\n    * 留言\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n<?php $this->need('compoment/head.php');?>\n\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n               <div class=\"page-card\">\n                    <h2><i class=\"envelope outline icon\"></i> <?php $this->title() ?></h2>\n                   \n\n<?php echo reEmoPost(ShortCode($this->content,$this,$this->user->hasLogin(),$this->fields->ArticleType)); ?>\n\n\n\n\n<?php if(Bsoptions('comment_choose') == '' || Bsoptions('comment_choose') == '1'): ?>    \n\n <?php\n$parameter= array(\n   'parentId'      => $this->hidden ? 0 : $this->cid,\n   'parentContent' => $this->row,\n   'respondId'     => $this->respondId,\n   'commentPage'   => $this->request->filter('int')->commentPage,\n   'allowComment'  => $this->allow('comment')\n);\n$this->widget('BearSimple_Widget_Comments_Archive',$parameter)->to($comments);\n?>\n<h3><i class=\"circular book reader icon\"></i> <?php _e('读者墙'); ?></h3>\n<?php \n$readerData = getReaders();\nusort($readerData, function($a, $b) {\n    return $b['num'] - $a['num'];\n});\n\nif($readerData):?>\n<div class=\"readers-wall\">\n    <?php foreach($readerData as $index => $reader):?>\n    <div class=\"reader-card <?php echo $index < 3 ? 'top-'.($index+1) : ''; ?>\">\n        <img src=\"<?php echo imgravatarq($reader['mail']); ?>\" \n             loading=\"lazy\" \n             class=\"reader-avatar\"\n             alt=\"<?php echo $reader['author'];?>的头像\">\n        \n        <div class=\"reader-name\"><?php echo $reader['author'];?></div>\n        \n        <div class=\"reader-stats\">\n            <span><?php echo $reader['num'];?> 条评论</span>\n        </div>\n    </div>\n    <?php endforeach;?>\n</div>\n<?php endif;?>\n\n<div id=\"comments-con\">\n  <div id=\"comments\">\n <?php if(Bsoptions('CommentDesc')== true):?>\n <br>\n <div id=\"bscommen\"> \n     <?php if ($comments->have()): ?>    \n    \n     <?php\n      ob_start();\n   $comments->listComments();\n   $comments_content = ob_get_contents();\n      ob_end_clean();\n   $comments_content = preg_replace(\"/<ol class=\\\"comment-list\\\">/sm\", '', $comments_content);\n   $comments_content = preg_replace(\"/<\\/ol>/sm\", '', $comments_content);\n   echo $comments_content;\n   ?>\n\n\n    <?php\n\n      ob_start(); \n\n      $comments->pageNav('&laquo;','&raquo;', 1, '');\n      $content = ob_get_contents();\n      ob_end_clean();\n      if(Bsoptions('pagination_style')== '2'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<nav class=\"page-navigator\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<span class=\"page-number\">...</span>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n       $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);\n      $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);\n      //适配旧版本\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n      $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);\n      $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);\n      ///--->\n      $content = preg_replace(\"/<\\/ol>/sm\", '</nav>', $content);\n      }\n      if(empty(Bsoptions('pagination_style ')) || Bsoptions('pagination_style') == '1'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<div class=\"ui  labels\" style=\"margin-top:30px\"><div style=\"text-align:center\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<a class=\"ui large label\">...</a>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      //旧版本兼容\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      \n      $content = preg_replace(\"/<\\/ol>/sm\", '</div></div>', $content);\n      }\n      echo $content;\n     ?>\n\n    <?php endif; ?>\n\n\n    </div>\n    <?php endif; ?>\n    \n<?php if ($this->allow('comment') && Bsoptions('CommentClose') == true): ?>\n\n\n\n       \n        <div id=\"<?php $this->respondId(); ?>\" class=\"respond\">\n            \n                <?php $comments->cancelReply(); ?>\n            \n\n            <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>\n            <form method=\"post\" action=\"<?php editurl($this->commentUrl) ?>\" id=\"commentform\" role=\"form\"  class=\"ui form\">\n<div id=\"forminput\">\n                <!-- 已登录 -->\n                <?php if(Bsoptions('Comment_islogin') == true || Bsoptions('Comment_islogin') == ''):?>\n                <div id=\"loginshowlabel\" style=\"display:none\">\n                <div class=\"ui image label\">\n  <img src=\"<?php echo imgravatarq($this->user->mail); ?>\">\n  <name id=\"authorname\"></name>\n</div>\n                   </div>\n                    <?php endif; ?>\n                <!-- 未登录 -->\n  <div class=\"<?php if(Helper::options()->commentsRequireURL == true || Bsoptions('Comment_showmail') == true):?>three<?php else: ?>two<?php endif; ?> fields\">\n    <div class=\"field\">\n      <label class=\"required\">您的昵称</label>\n      <div class=\"ui icon input\">\n      <input type=\"text\" name=\"author\" id=\"author\" placeholder=\"填写您的昵称\" required>\n      <i id=\"randname\"  class=\"circular dice link icon\"></i>\n</div>\n    </div>\n    <?php if(Helper::options()->commentsRequireMail == true || Bsoptions('Comment_showmail') == false):?>\n    <div class=\"field\">\n      <label <?php if(Helper::options()->commentsRequireMail == true):?>class=\"required\"<?php endif; ?>>您的邮箱</label>\n      <input type=\"email\" name=\"mail\" id=\"mail\"   placeholder=\"填写您的电邮地址\" <?php if(Helper::options()->commentsRequireMail == true):?>required<?php endif; ?>>\n    </div>\n    <?php endif; ?>\n    <?php if(Helper::options()->commentsRequireMail == false && Bsoptions('Comment_showmail') == true):?>\n    <div class=\"field\" style=\"display:none;\">\n      <label class=\"required\">您的邮箱</label>\n      <input type=\"email\" name=\"mail\" id=\"mail\"  placeholder=\"填写您的电邮地址\" disabled=\"\">\n    </div>\n    <?php endif; ?>\n    <?php if(Helper::options()->commentsRequireURL == true || Bsoptions('Comment_showurl') == false):?>\n    <div class=\"field\">\n      <label <?php if(Helper::options()->commentsRequireURL == true):?>class=\"required\"<?php endif; ?>>您的博客网址</label>\n      <input type=\"text\" name=\"url\" id=\"url\" placeholder=\"填写您的博客网站网址\" <?php if(Helper::options()->commentsRequireURL == true):?>required<?php endif; ?>>\n    </div>\n    <?php endif; ?>\n    <?php if(Helper::options()->commentsRequireURL == false && Bsoptions('Comment_showurl') == true):?>\n    <div class=\"field\" style=\"display:none;\">\n      <label <?php if(Helper::options()->commentsRequireURL == true):?>class=\"required\"<?php endif; ?>>您的博客网址</label>\n      <input type=\"text\" name=\"url\" id=\"url\" placeholder=\"填写您的博客网站网址\" <?php if(Helper::options()->commentsRequireURL == true):?>required<?php endif; ?>>\n    </div>\n    <?php endif; ?>\n  </div>\n   <!-- end -->\n   \n  <div class=\"field\">\n      <label class=\"required\">评论内容</label>\n      \n      <?php if(Bsoptions('Comment_private') == true):?>\n      <div class=\"ui slider checkbox\" style=\"margin:5px 0 7px 0\">\n  <input type=\"checkbox\" name=\"privatecomment\" id=\"privatecomment\">\n  <label>私密评论</label>\n\n</div>\n<?php endif; ?>\n      <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>\n    </div>\n    <?php if(Bsoptions('Emoji') == true) :?>\n    <div class=\"circular ui icon button\" id=\"face\">\n  <i class=\"smile beam outline icon\"></i>\n </div>\n <div class=\"ignore emoemo\" style=\"margin-top:-7px;margin-bottom:6px\" translate=\"no\"></div>\n <?php endif; ?>\n <?php if(Bsoptions('CommentNotify__Open') == true) :?>\n <div class=\"ui checkbox\" style=\"margin:-7px 0 5px 0\">\n  <input type=\"checkbox\" name=\"accept\">\n  <label>不接收来自本博客的回复邮件</label>\n</div>\n<?php endif; ?>\n<?php switch(Bsoptions('VerifyChoose')) :?>\n<?php case '1' :?>\n             <?php \\BsCore\\Plugin::spam_protection_mathjia();?>\n             </div>\n             <button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;\">\n  提交留言\n</button>\n             <?php break; ?>\n             <?php case '11' :?>\n             <?php \\BsCore\\Plugin::spam_protection_mathjian();?>\n             </div>\n             <button  type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;\">\n  提交留言\n</button>\n             <?php break; ?>\n              <?php case '22-2' :?>\n             <?php \\BsCore\\Plugin::spam_protection_question();?>\n             </div>\n             <button  type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;\">\n  提交留言\n</button>\n             <?php break; ?>\n             <?php case '2' :?>\n             </div>\n             \n             <?php $this->need('modules/Verify/BearCaptcha/Vaptcha/Vaptcha.php'); ?>\n<button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;margin-top:5px\" disabled=\"\">\n  提交留言\n</button>\n             <?php break; ?>\n             <?php case '2-1' :?>\n             </div>\n             <?php $this->need('modules/Verify/BearCaptcha/Dingxiang/DX_Captcha.php'); ?>\n<button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;margin-top:5px\" disabled=\"\">\n  提交留言\n</button>\n             <?php break; ?>\n             <?php case '2-2' :?>\n             </div>\n             <?php $this->need('modules/Verify/BearCaptcha/Turnstile/Turnstile.php'); ?>\n<button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;margin-top:5px\" disabled=\"\">\n  提交留言\n</button>\n             <?php break; ?>\n              <?php case '2-3' :?>\n             </div>\n             <?php $this->need('modules/Verify/BearCaptcha/Geetest/Geetest.php'); ?>\n<button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;margin-top:5px\" disabled=\"\">\n  提交留言\n</button>\n             <?php break; ?>\n             <?php case '22' :?>\n             </div>\n             <p>\n             <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{\n\t\t\techo Bsoptions('Verify22_Buttontext');}\n\t\t\t  ?></span>\n\t<button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;\" disabled=\"\">\n  提交留言\n</button>\n</p>\n<?php $this->need('modules/Verify/BearCaptcha/Captcha/Captcha.php'); ?>\n             <?php break; ?>\n     <?php case '3' || '' :?>\n     </div><p>\n             <button type=\"button\" id=\"commentsubmit\" class=\"ui button\" style=\"float:left;\">\n  提交留言\n</button>\n</p>\n             <?php break; ?>\n <?php endswitch; ?>\n            </form>\n            <div style=\"height:30px\"></div>\n        </div>\n\n\n\n    <?php else: ?>\n   <center>\n<h3 class=\"ui icon header\">\n<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>\n  <div class=\"content\">\n    啊哦，评论功能已关闭～\n  </div>\n</h3>\n    </center>\n    <?php endif; ?>\n\n     <?php if(Bsoptions('CommentDesc')== '' || Bsoptions('CommentDesc') == false):?>\n  <div id=\"bscommen\"> \n     \n     <?php if ($comments->have()): ?>    \n    <br>\n    \n     <?php\n      ob_start();\n   $comments->listComments();\n   $comments_content = ob_get_contents();\n      ob_end_clean();\n   $comments_content = preg_replace(\"/<ol class=\\\"comment-list\\\">/sm\", '', $comments_content);\n   $comments_content = preg_replace(\"/<\\/ol>/sm\", '', $comments_content);\n   echo $comments_content;\n   ?>\n\n\n    <?php\n\n      ob_start(); \n\n      $comments->pageNav('&laquo;','&raquo;', 1, '');\n      $content = ob_get_contents();\n      ob_end_clean();\n      if(Bsoptions('pagination_style')== '2'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<nav class=\"page-navigator\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<span class=\"page-number\">...</span>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n       $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);\n      $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);\n      //适配旧版本\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n      $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);\n      $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);\n      ///--->\n      $content = preg_replace(\"/<\\/ol>/sm\", '</nav>', $content);\n      }\n      if(empty(Bsoptions('pagination_style ')) || Bsoptions('pagination_style') == '1'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<div class=\"ui labels\" style=\"margin-top:30px\"><div style=\"text-align:center\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<a class=\"ui large label\">...</a>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      //旧版本兼容\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\" >(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      \n      $content = preg_replace(\"/<\\/ol>/sm\", '</div></div>', $content);\n      }\n      echo $content;\n     ?>\n\n    <?php endif; ?>\n</div>    \n<?php endif; ?>\n</div></div></div></div>\n<script>\nfunction getCookie(name){\n    const strcookie = document.cookie;\n    const arrcookie = strcookie.split(\"; \");\n    for (let i = 0; i < arrcookie.length; i++) {\n        const arr = arrcookie[i].split(\"=\");\n        if (arr[0] === name){\n            return arr[1];\n        }\n    }\n    return \"\";\n}\nfunction getCommentInfo(){\n    let nick = document.getElementById('author');\n    let mail = document.getElementById('mail');\n    let url = document.getElementById('url');\n    let nick_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_author'));\n    let mail_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_mail'));\n    let url_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_url'));\n    if (nick && nick_value!== 'null') nick.value = nick_value;\n    if (mail && mail_value!== 'null') mail.value = mail_value;\n    if (url && url_value!== 'null') url.value = url_value;\n    $.post('<?php getIsLogin(); ?>',{action:'find'},function (res) {\n        res = JSON.parse(res);\n        switch(res.code){\n            case 0 :\n        $('#loginshowlabel').hide();\n    $('#nologinshow').show();\n    break;\n    case 1 :\n        $('#loginshowlabel').show();\n    $('#nologinshow').hide();\n    $('#authorname').html(res.name);\n    break;\n        }\n    });\n     $.post('<?php getCommentAction(); ?>',{action:'getCommentToken'},function (res) {\n         res = JSON.parse(res);\n         if(res.code == 1){\n             $(\"#SecurityToken\").remove();\n        var tokenInput=$(\"<input type=\\\"hidden\\\" name=\\\"SecurityToken\\\"  id=\\\"SecurityToken\\\">\");\ntokenInput.attr(\"value\", res.token);\n$(\"#commentform\").append(tokenInput);\n         }\n    })\n}\ngetCommentInfo();\n</script>\n\n<?php else:?>\n    <?php $this->need('thirdparty_comments.php'); ?>\n    <?php endif;?>\n    </div>\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "modules/GoLinks/templates/theme1.html",
    "content": "<html>\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n    <meta http-equiv=\"refresh\" content=\"{{delay}};url='{{url}}';\">\r\n    <title>页面加载中,请稍候...</title>\r\n    <style type=\"text/css\">html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {\r\n        margin: 0;\r\n        padding: 0;\r\n        border: 0;\r\n        font-size: 100%;\r\n        font: inherit;\r\n        vertical-align: baseline\r\n    }\r\n\r\n    body {\r\n        background: #3498db;\r\n    }\r\n\r\n    #loader-container {\r\n        width: 188px;\r\n        height: 188px;\r\n        color: white;\r\n        margin: 0 auto;\r\n        position: absolute;\r\n        top: 50%;\r\n        left: 50%;\r\n        margin-right: -50%;\r\n        transform: translate(-50%, -50%);\r\n        border: 5px solid #3498db;\r\n        border-radius: 50%;\r\n        -webkit-animation: borderScale 1s infinite ease-in-out;\r\n        animation: borderScale 1s infinite ease-in-out;\r\n    }\r\n\r\n    #loadingText {\r\n        font-family: 'Raleway', sans-serif;\r\n        font-size: 1.4em;\r\n        position: absolute;\r\n        top: 50%;\r\n        left: 50%;\r\n        margin-right: -50%;\r\n        transform: translate(-50%, -50%);\r\n    }\r\n\r\n    @-webkit-keyframes borderScale {\r\n        0% {\r\n            border: 5px solid white;\r\n        }\r\n        50% {\r\n            border: 25px solid #3498db;\r\n        }\r\n        100% {\r\n            border: 5px solid white;\r\n        }\r\n    }\r\n\r\n    @keyframes borderScale {\r\n        0% {\r\n            border: 5px solid white;\r\n        }\r\n        50% {\r\n            border: 25px solid #3498db;\r\n        }\r\n        100% {\r\n            border: 5px solid white;\r\n        }\r\n    }</style>\r\n</head>\r\n<body>\r\n<div id=\"loader-container\"><p id=\"loadingText\">页面加载中...</p></div>\r\n</body>\r\n</html>"
  },
  {
    "path": "modules/GoLinks/templates/theme2.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width\">\n<meta name=\"robots\" content=\"noindex, nofollow\">\n<meta http-equiv=\"refresh\" content=\"{{delay}};url='{{url}}';\">\n<meta charset=\"UTF-8\">\n<!--[if IE 8]>\n<style>\n.ie8 .alert-circle,.ie8 .alert-footer{display:none}.ie8 .alert-box{padding-top:75px}.ie8 .alert-sec-text{top:45px}\n</style>\n<![endif]--><title>页面加载中,请稍候...</title>\n<style>\n*{margin:0;padding:0;border:0}body,html{min-height:100%}body{background:radial-gradient(#eee,#444)}.loader{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:175px;height:100px}.loader span{display:block;background:#ccc;width:7px;height:10%;border-radius:14px;margin-right:5px;float:left;margin-top:25%}.loader span:last-child{margin-right:0}.loader span:nth-child(1){animation:load 2.5s 1.4s infinite linear}.loader span:nth-child(2){animation:load 2.5s 1.2s infinite linear}.loader span:nth-child(3){animation:load 2.5s 1s infinite linear}.loader span:nth-child(4){animation:load 2.5s .8s infinite linear}.loader span:nth-child(5){animation:load 2.5s .6s infinite linear}.loader span:nth-child(6){animation:load 2.5s .4s infinite linear}.loader span:nth-child(7){animation:load 2.5s .2s infinite linear}.loader span:nth-child(8){animation:load 2.5s 0s infinite linear}.loader span:nth-child(9){animation:load 2.5s .2s infinite linear}.loader span:nth-child(10){animation:load 2.5s .4s infinite linear}.loader span:nth-child(11){animation:load 2.5s .6s infinite linear}.loader span:nth-child(12){animation:load 2.5s .8s infinite linear}.loader span:nth-child(13){animation:load 2.5s 1s infinite linear}.loader span:nth-child(14){animation:load 2.5s 1.2s infinite linear}.loader span:nth-child(15){animation:load 2.5s 1.4s infinite linear}@keyframes load{0%{background:#ccc;margin-top:25%;height:10%}50%{background:#444;height:100%;margin-top:0}100%{background:#ccc;height:10%;margin-top:25%}}\n</style>\n</head>\n<body>\n<div class=\"loader\">\n\t<span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>\n</div>\n</body>\n</html>"
  },
  {
    "path": "modules/GoLinks/templates/theme3.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width\">\n<meta name=\"robots\" content=\"noindex, nofollow\"/>\n<meta http-equiv=\"refresh\" content=\"{{delay}};url='{{url}}';\">\n<meta charset=\"UTF-8\">\n<title>页面加载中,请稍候...</title>\n<style>\na{background:#13a3a5;padding:5px;margin:10px;display:block;cursor:pointer;font-size:1.5em;float:left;text-decoration:none;font-size:18px;color:#fff}a,body{font-weight:100}body{-webkit-tap-highlight-color:transparent;background-color:#222428;font-size:100%;font-family:Open Sans;height:100%}.loader{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-mos-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;width:80%;overflow:visible}.loader,.loader div{position:absolute;height:36px}.loader div{width:30px;margin:0 10px;opacity:0;animation:move 2s linear infinite;-o-animation:move 2s linear infinite;-moz-animation:move 2s linear infinite;-webkit-animation:move 2s linear infinite;transform:rotate(180deg);-o-transform:rotate(180deg);-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);color:#fff;font-size:3em}.loader div:nth-child(8):before{background:#db2f00}.loader div:nth-child(8):before,.loader div:nth-child(9):before{content:'';position:absolute;bottom:-15px;left:0;width:30px;height:30px;border-radius:100%}.loader div:nth-child(9):before{background:#f2f2f2}.loader div:nth-child(10):before{bottom:-15px;height:30px;background:#13a3a5}.loader div:after,.loader div:nth-child(10):before{content:'';position:absolute;left:0;width:30px;border-radius:100%}.loader div:after{bottom:-40px;height:5px;background:#39312d}.loader div:nth-child(2){animation-delay:.2s;-o-animation-delay:.2s;-moz-animation-delay:.2s;-webkit-animation-delay:.2s}.loader div:nth-child(3){animation-delay:.4s;-o-animation-delay:.4s;-webkit-animation-delay:.4s}.loader div:nth-child(4){animation-delay:.6s;-o-animation-delay:.6s;-moz-animation-delay:.6s;-webkit-animation-delay:.6s}.loader div:nth-child(5){animation-delay:.8s;-o-animation-delay:.8s;-moz-animation-delay:.8s;-webkit-animation-delay:.8s}.loader div:nth-child(6){animation-delay:1s;-o-animation-delay:1s;-moz-animation-delay:1s;-webkit-animation-delay:1s}.loader div:nth-child(7){animation-delay:1.2s;-o-animation-delay:1.2s;-moz-animation-delay:1.2s;-webkit-animation-delay:1.2s}.loader div:nth-child(8){animation-delay:1.4s;-o-animation-delay:1.4s;-moz-animation-delay:1.4s;-webkit-animation-delay:1.4s}.loader div:nth-child(9){animation-delay:1.6s;-o-animation-delay:1.6s;-moz-animation-delay:1.6s;-webkit-animation-delay:1.6s}.loader div:nth-child(10){animation-delay:1.8s;-o-animation-delay:1.8s;-moz-animation-delay:1.8s;-webkit-animation-delay:1.8s}@keyframes move{0%{right:0;opacity:0}35%{right:41%}35%,65%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}65%{right:59%}to{right:100%;-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}}@-webkit-keyframes move{0%,to{opacity:0}0%{right:0}35%{right:41%}35%,75%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}75%{right:59%}to{right:100%;-webkit-transform:rotate(-180deg);transform:rotate(-180deg);opacity:0}}\n</style>\n</head>\n<body class=\"ie8\" style=\"\">\n<div class=\"loader\">\n\t<div>\n\t\tL\n\t</div>\n\t<div>\n\t\tO\n\t</div>\n\t<div>\n\t\tA\n\t</div>\n\t<div>\n\t\tD\n\t</div>\n\t<div>\n\t\tI\n\t</div>\n\t<div>\n\t\tN\n\t</div>\n\t<div>\n\t\tG\n\t</div>\n\t<div>\n\t</div>\n\t<div>\n\t</div>\n\t<div>\n\t</div>\n</div>\n</body>\n</html>"
  },
  {
    "path": "modules/GoLinks/templates/theme4.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width\">\n<meta name=\"robots\" content=\"noindex, nofollow\"/>\n<meta http-equiv=\"refresh\" content=\"{{delay}};url='{{url}}';\">\n<meta charset=\"UTF-8\">\n<title>页面加载中,请稍候...</title>\n<style>\nhtml{overflow:hidden}html,html body{height:100%;min-height:100%}html body{background:#222428;background-size:163px;font:14px/21px Monaco,sans-serif;color:#999;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}html body a,html body a:visited{text-decoration:none;color:#ff805f}html body h4{margin:0;color:#666}.scene{width:100%;height:100%;-webkit-perspective:600;perspective:600;display:flex;align-items:center;justify-content:center}.scene svg{width:15pc;height:15pc}.dc-logo{position:fixed;right:10px;bottom:10px}.dc-logo:hover svg{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-animation:arrow-spin 2.5s 0s cubic-bezier(0.165,0.84,0.44,1) infinite;animation:arrow-spin 2.5s 0s cubic-bezier(0.165,0.84,0.44,1) infinite}.dc-logo:hover:hover:before{content:'\\2764';color:#00fffe;left:-70px}.dc-logo:hover:hover:after,.dc-logo:hover:hover:before{padding:6px;font:10px/1 Monaco,sans-serif;font-size:10px;text-transform:uppercase;position:absolute;top:-30px;white-space:nowrap;z-index:20px;box-shadow:0 0 4px #222;background:rgba(0,0,0,.4)}.dc-logo:hover:hover:after{content:'Digital Craft';color:#6e6f71;right:0;background-image:none}@keyframes arrow-spin{50%{-webkit-transform:rotateY(360deg);transform:rotateY(360deg)}}\n</style>\n</head>\n<body>\n<div class=\"scene\">\n  <svg version=\"1.1\" id=\"dc-spinner\" xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" width:\"38\" height:\"38\" viewbox=\"0 0 38 38\" preserveaspectratio=\"xMinYMin meet\">\n  <text x=\"14\" y=\"21\" font-family=\"Monaco\" font-size=\"2px\" style=\"letter-spacing:0.6\" fill=\"grey\">LOADING\n  <animate attributename=\"opacity\" values=\"0;1;0\" dur=\"1.8s\" repeatcount=\"indefinite\"/>\n  </text>\n  <path fill=\"#373a42\" d=\"M20,35c-8.271,0-15-6.729-15-15S11.729,5,20,5s15,6.729,15,15S28.271,35,20,35z M20,5.203 C11.841,5.203,5.203,11.841,5.203,20c0,8.159,6.638,14.797,14.797,14.797S34.797,28.159,34.797,20 C34.797,11.841,28.159,5.203,20,5.203z\">\n  </path>\n  <path fill=\"#373a42\" d=\"M20,33.125c-7.237,0-13.125-5.888-13.125-13.125S12.763,6.875,20,6.875S33.125,12.763,33.125,20 S27.237,33.125,20,33.125z M20,7.078C12.875,7.078,7.078,12.875,7.078,20c0,7.125,5.797,12.922,12.922,12.922 S32.922,27.125,32.922,20C32.922,12.875,27.125,7.078,20,7.078z\">\n  </path>\n  <path fill=\"#2AA198\" stroke=\"#2AA198\" stroke-width=\"0.6027\" stroke-miterlimit=\"10\" d=\"M5.203,20 c0-8.159,6.638-14.797,14.797-14.797V5C11.729,5,5,11.729,5,20s6.729,15,15,15v-0.203C11.841,34.797,5.203,28.159,5.203,20z\">\n  <animatetransform attributename=\"transform\" type=\"rotate\" from=\"0 20 20\" to=\"360 20 20\" calcmode=\"spline\" keysplines=\"0.4, 0, 0.2, 1\" keytimes=\"0;1\" dur=\"2s\" repeatcount=\"indefinite\"/>\n  </path>\n  <path fill=\"#859900\" stroke=\"#859900\" stroke-width=\"0.2027\" stroke-miterlimit=\"10\" d=\"M7.078,20 c0-7.125,5.797-12.922,12.922-12.922V6.875C12.763,6.875,6.875,12.763,6.875,20S12.763,33.125,20,33.125v-0.203 C12.875,32.922,7.078,27.125,7.078,20z\">\n  <animatetransform attributename=\"transform\" type=\"rotate\" from=\"0 20 20\" to=\"360 20 20\" dur=\"1.8s\" repeatcount=\"indefinite\"/>\n  </path>\n  </svg>\n</div>\n</body>\n</html>"
  },
  {
    "path": "modules/GoLinks/templates/theme5.html",
    "content": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width\">\n<meta name=\"robots\" content=\"noindex, nofollow\"/>\n<meta http-equiv=\"refresh\" content=\"{{delay}};url='{{url}}';\">\n<meta charset=\"UTF-8\">\n<!--[if IE 8]>\n<style>\n.ie8 .alert-circle,.ie8 .alert-footer{display:none}.ie8 .alert-box{padding-top:75px}.ie8 .alert-sec-text{top:45px}\n</style>\n<![endif]--><title>页面加载中,请稍候...</title>\n\n<style type=\"text/css\">body{margin:0;height:100vh;display:flex;align-items:center;justify-content:center;background:#222428}.container{width:8em;height:1em;font-size:35px;display:flex;justify-content:space-between}.container span{width:1em;height:1em;--duration:1.5s}.girl{animation:slide var(--duration) ease-in-out infinite alternate}@keyframes slide{0%{transform:translateX(0);filter:brightness(1)}to{transform:translatex(6.75em);filter:brightness(1.45)}}.boys{width:6em;display:flex;justify-content:space-between}.boys span{animation:var(--duration) ease-in-out infinite alternate}.boys span:nth-child(1){animation-name:jump-off-1}.boys span:nth-child(2){animation-name:jump-off-2}.boys span:nth-child(3){animation-name:jump-off-3}.boys span:nth-child(4){animation-name:jump-off-4}@keyframes jump-off-1{0%,15%{transform:rotate(0deg)}35%,to{transform-origin:-50% center;transform:rotate(-180deg)}}@keyframes jump-off-2{0%,30%{transform:rotate(0deg)}50%,to{transform-origin:-50% center;transform:rotate(-180deg)}}@keyframes jump-off-3{0%,45%{transform:rotate(0deg)}65%,to{transform-origin:-50% center;transform:rotate(-180deg)}}@keyframes jump-off-4{0%,60%{transform:rotate(0deg)}80%,to{transform-origin:-50% center;transform:rotate(-180deg)}}.container span:before{content:'';position:absolute;width:inherit;height:inherit;border-radius:15%;box-shadow:0 0 .1em rgba(0,0,0,.3)}.girl:before{background-color:hotpink}.boys span:before{background-color:#1e90ff;animation:var(--duration) ease-in-out infinite alternate}.boys span:nth-child(1):before{filter:brightness(1);animation-name:jump-down-1}.boys span:nth-child(2):before{filter:brightness(1.15);animation-name:jump-down-2}.boys span:nth-child(3):before{filter:brightness(1.3);animation-name:jump-down-3}.boys span:nth-child(4):before{filter:brightness(1.45);animation-name:jump-down-4}@keyframes jump-down-1{5%{transform:scale(1,1)}15%{transform-origin:center bottom;transform:scale(1.3,0.7)}20%,25%{transform-origin:center bottom;transform:scale(0.8,1.4)}40%{transform-origin:center top;transform:scale(1.3,0.7)}55%,to{transform:scale(1,1)}}@keyframes jump-down-2{20%{transform:scale(1,1)}30%{transform-origin:center bottom;transform:scale(1.3,0.7)}35%,40%{transform-origin:center bottom;transform:scale(0.8,1.4)}55%{transform-origin:center top;transform:scale(1.3,0.7)}70%,to{transform:scale(1,1)}}@keyframes jump-down-3{35%{transform:scale(1,1)}45%{transform-origin:center bottom;transform:scale(1.3,0.7)}50%,55%{transform-origin:center bottom;transform:scale(0.8,1.4)}70%{transform-origin:center top;transform:scale(1.3,0.7)}85%,to{transform:scale(1,1)}}@keyframes jump-down-4{50%{transform:scale(1,1)}60%{transform-origin:center bottom;transform:scale(1.3,0.7)}65%,70%{transform-origin:center bottom;transform:scale(0.8,1.4)}85%{transform-origin:center top;transform:scale(1.3,0.7)}to{transform:scale(1,1)}}\n</style>\n\n</head>\n<body>\n\n<div class=\"container\">\n  <span class=\"girl\"></span>\n  <div class=\"boys\">\n    <span></span>\n    <span></span>\n    <span></span>\n    <span></span>\n  </div>\n</div>\n\n</body>\n</html>"
  },
  {
    "path": "modules/GoLinks/templates/theme6.html",
    "content": "<html>\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\">\n    <meta name=\"robots\" content=\"noindex, nofollow\" />\n    <title>{{title}} - 跳转提示</title>\n    <style>body{font-family:'Cascadia Code','Consolas','Microsoft YaHei',SimHei !important;margin:0;padding:0 30px;background:#fff;font-size:12px}img{border:none}a{text-decoration:none;cursor:pointer;outline:0}a:hover{text-decoration:underline}a,a:link,a:visited{color:#1e5494}a.btn_blue:focus{border-color:#93d4fc;box-shadow:0 0 5px #60caff}a.btn_blue{display:inline-block;padding:6px 25px;margin:0;font-size:14px;font-weight:700;text-align:center;border-radius:3px;border:1px solid #0d659b;color:#fff;color:#fff!important;background-color:#238aca;background:-moz-linear-gradient(top,#238aca,#0074bc);background:-webkit-linear-gradient(top,#238aca,#0074bc);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#238aca',endColorstr='#0074bc');-ms-filter:\"progid:DXImageTransform.Microsoft.gradient(startColorstr='#238aca',endColorstr='#0074bc')\"}a.btn_blue:hover{text-decoration:none;background-color:#238aca;background:-moz-linear-gradient(top,#2a96d8,#0169a9);background:-webkit-linear-gradient(top,#2a96d8,#0169a9);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2a96d8',endColorstr='#0169a9');-ms-filter:\"progid:DXImageTransform.Microsoft.gradient(startColorstr='#2a96d8',endColorstr='#0169a9')\"}a.btn_blue:active{background-color:#238aca;background:-moz-linear-gradient(top,#0074bc,#238aca);background:-webkit-linear-gradient(top,#0074bc,#238aca);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0074bc',endColorstr='#238aca');-ms-filter:\"progid:DXImageTransform.Microsoft.gradient(startColorstr='#0074bc',endColorstr='#238aca')\";outline:0}.remind_block{overflow:hidden}.remind_block .remind_content{overflow:hidden}.remind_block .remind_title{margin-bottom:10px;padding-top:3px;font-weight:700;font-size:20px;font-family:\"Microsoft YaHei\",\"lucida Grande\",Verdana}.remind_block .remind_detail{line-height:1.5;font-size:16px;color:#535353}.warning .remind_title{color:#16a085}.container{max-width:640px;margin:0 auto;padding-top:25px}.header{margin-bottom:5px}.footer{margin-top:18px;text-align:center;color:#a0a0a0;font-size:12px}.content{border:1px solid #bbb;box-shadow:0 0 3px #d4d4d4}.c-container{padding:30px}.c-footer{padding:10px 15px;background:#f1f1f1;border-top:1px solid #bbb;overflow:hidden}.c-footer-a1,.c-footer-a2{float:left}.c-footer-a2{margin:8px 0 0 15px}.safety-url{margin-bottom:15px;padding-bottom:15px;border-bottom:1px solid #dfdfdf;word-wrap:break-word;word-break:break-all}.footer .dot{margin:0 .25em}</style>\n</head>\n\n<body>\n    <div class=\"container\">\n\n        <div class=\"content\">\n            <div class=\"c-container warning\">\n                <div id=\"remind_block\" class=\"remind_block\" style=\"height: 260px;\">\n                    <div class=\"remind_content\">\n                        <div class=\"remind_title\">\n                            您将要访问\n                        </div>\n                        <div class=\"remind_detail\">\n                            <div class=\"safety-url\">\n                                {{url}}\n                            </div>\n                            <span style=\"color:#CC0000;font-weight:800;\">温馨提示:</span><br/>该网页不属于\"{{title}}\"，我们无法确认该网页是否安全，它可能包含未知的安全隐患，请注意保护好个人信息！\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"c-footer\">\n            <a href=\"{{url}}\" rel=\"nofollow\" class=\"c-footer-a1 btn_blue\">继续访问</a><a class=\"c-footer-a2\" href=\"{{siteUrl}}\" rel=\"nofollow\">返回主页</a>\n        </div>\n    </div>\n    <div class=\"footer\">\n        &copy; <span class=\"dot\">{{year}}</span><a href='{{siteUrl}}' target='_blank'> {{title}}</a>\n    </div>\n</body>\n\n</html>"
  },
  {
    "path": "modules/SiteMap/sitemap.php",
    "content": "<?php\nheader(\"HTTP/1.1 200 OK\");\nheader(\"Content-Type: text/xml\");\n$options = Helper::options();\n$db = Typecho_Db::get();\n$limit = bsOptions::getInstance()::get_option( 'bearsimple' )['SiteMap'];\n$pages = $db->fetchAll(\n    $db->select()->from('table.contents')\n        ->where('table.contents.status = ?', 'publish')\n        ->where('table.contents.created < ?', $options->gmtTime)\n        ->where('table.contents.type = ?', 'page')\n        ->limit($limit)\n        ->order('table.contents.created', Typecho_Db::SORT_DESC)\n);\n$articles = $db->fetchAll(\n    $db->select()->from('table.contents')\n        ->where('table.contents.status = ?', 'publish')\n        ->where('table.contents.created < ?', $options->gmtTime)\n        ->where('table.contents.type = ?', 'post')\n        ->limit($limit)\n        ->order('table.contents.created', Typecho_Db::SORT_DESC)\n);\nob_clean();\necho \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\";\necho \"<urlset xmlns=\\\"http://www.sitemaps.org/schemas/sitemap/0.9\\\">\\n\";\nforeach ($pages as $page) {\n    $tpage = Typecho_Widget::widget('Widget_Abstract_Contents')->push($page);\n    echo \"\\t<url>\\n\";\n    echo \"\\t\\t<loc>\" . $tpage['permalink'] . \"</loc>\\n\";\n    echo \"\\t\\t<lastmod>\" . date('Y-m-d\\TH:i:s\\Z', $page['modified']) . \"</lastmod>\\n\";\n    echo \"\\t\\t<changefreq>monthly</changefreq>\\n\";\n    echo \"\\t\\t<priority>0.8</priority>\\n\";\n    echo \"\\t</url>\\n\";\n}\nforeach ($articles as $article) {\n    $tpost = Typecho_Widget::widget('Widget_Abstract_Contents')->push($article);\n    echo \"\\t<url>\\n\";\n    echo \"\\t\\t<loc>\" . $tpost['permalink'] . \"</loc>\\n\";\n    echo \"\\t\\t<lastmod>\" . date('Y-m-d\\TH:i:s\\Z', $article['modified']) . \"</lastmod>\\n\";\n    echo \"\\t\\t<changefreq>monthly</changefreq>\\n\";\n    echo \"\\t\\t<priority>0.5</priority>\\n\";\n    echo \"\\t</url>\\n\";\n}\necho \"</urlset>\";\nexit;"
  },
  {
    "path": "modules/Upgrade/Upgrade.php",
    "content": "<?php \nheader(\"HTTP/1.1 200 OK\");\nrequire_once 'pclzip.lib.php';\nuse PclZip;\nignore_user_abort(true);\nset_time_limit(0);\nini_set('memory_limit',-1);\nini_set('default_socket_timeout', 900);\n$options = Helper::options();\n    $removeChar = [\"https://\", \"http://\", \"/\"]; \n    Typecho_Widget::widget('Widget_User')->to($user);\n    if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", $options->siteUrl)) !== false && $user->hasLogin()) {   \n$action = @$_GET['action'];\nfunction convert($size)\n  {\n     $unit=array('b','kb','mb','gb','tb','pb');\n     return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];\n  }\n\nfunction is_dir_writable($dir) {\n    if (!is_dir($dir)) {\n        return false;\n    }\n    if (!is_readable($dir) || !is_writable($dir)) {\n        return false;\n    }\n  \n    return true;\n}\n\nfunction remote_filesize($url)\n{\n    ob_start();\n    $ch = curl_init($url);\n    curl_setopt($ch, CURLOPT_HEADER, 1);\n    curl_setopt($ch, CURLOPT_NOBODY, 1);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);\n    $ok = curl_exec($ch);\n    curl_close($ch);\n    $head = ob_get_contents();\n    ob_end_clean();\n    $regex = '/Content-Length:\\s([0-9].+?)\\s/';\n    $count = preg_match($regex, $head, $matches);\n    return isset($matches[1]) ? $matches[1] : \"unknown\";\n}\n$file_url  = 'http://upgrade.typecho.co.uk/Bearsimple/bearsimple_lastest_update.zip';\n$tmp_path = __DIR__.'/bearsimple_lastest_update.zip';\nswitch($action){\n    case 'prepare-download':\n               $directory = __TYPECHO_ROOT_DIR__.__TYPECHO_THEME_DIR__;\nif (!is_dir_writable($directory)) {\n     $result = array(\n    'code' => 0,\n    'message' => '升级前置检测不通过，原因：usr/themes目录不可读或不可写，请先赋予权限后重试！'\n    \n);\nexit(json_encode($result)); \n}\n        $file_size   = convert(remote_filesize($file_url));\n$data['code']     = '1';\n\t$data['message']  = 'success';\n\t$data['filesize']  = $file_size;\necho json_encode($data, JSON_UNESCAPED_UNICODE);\nbreak;\ncase 'getsize':\n         if (file_exists($tmp_path)) {\n             $total = remote_filesize($file_url);\n            $num = filesize($tmp_path);\n            $round=round($num/$total*100,2);\nif($round > 100){\n   $round = '100'; \n}\n clearstatcache();\n    $data['code']     = '1';\n\t$data['message']  = 'success';\n\t$data['filesize'] = $round;\necho json_encode($data, JSON_UNESCAPED_UNICODE);\n        }\n        break;\ncase 'download':\nsession_write_close();\n        if ($fp = fopen($file_url, \"rb\")) {\n\n                if (!$download_fp = fopen($tmp_path, \"wb\")) {\n                    exit;\n                }\n\n                while (!feof($fp)) {\n                    if (!file_exists($tmp_path)) {\n                        fclose($download_fp);\n                        exit;\n                    }\n                    fwrite($download_fp, fread($fp, 128), 128);\n                }\n\n                fclose($download_fp);\n                fclose($fp);\n\n            } else {\n                exit;\n            }\n        break;\ncase 'finish':\n        $archive = new PclZip(__DIR__.'/bearsimple_lastest_update.zip');\n$archive->extract(PCLZIP_OPT_PATH,'./usr/plugins',PCLZIP_OPT_BY_PREG, \"/^BsCore/\",PCLZIP_OPT_REPLACE_NEWER);\n$archive->extract(PCLZIP_OPT_PATH,'./usr/themes',PCLZIP_OPT_BY_PREG, \"/^bearsimple/\",PCLZIP_OPT_REPLACE_NEWER);\nunlink($tmp_path);\n$data['code']     = '1';\n\t$data['message']  = 'success';\necho json_encode($data, JSON_UNESCAPED_UNICODE);\n        break;\n}\n}\nelse{\n    $data['code']     = '0';\n\t$data['message']  = 'Sorry，Not authorization.';\necho json_encode($data, JSON_UNESCAPED_UNICODE);\n}"
  },
  {
    "path": "modules/Upgrade/pclzip.lib.php",
    "content": "<?php\n// --------------------------------------------------------------------------------\n// PhpConcept Library - Zip Module 2.8.4\n// --------------------------------------------------------------------------------\n// License GNU/LGPL - Vincent Blavet - August 2009\n// http://www.phpconcept.net\n// --------------------------------------------------------------------------------\n//\n// Presentation :\n//   PclZip is a PHP library that manage ZIP archives.\n//   So far tests show that archives generated by PclZip are readable by\n//   WinZip application and other tools.\n//\n// Description :\n//   See readme.txt and http://www.phpconcept.net\n//\n// Warning :\n//   This library and the associated files are non commercial, non professional\n//   work.\n//   It should not have unexpected results. However if any damage is caused by\n//   this software the author can not be responsible.\n//   The use of this software is at the risk of the user.\n//\n// --------------------------------------------------------------------------------\n// $Id: pclzip.lib.php,v 1.60 2009/09/30 21:01:04 vblavet Exp $\n// --------------------------------------------------------------------------------\n\n// ----- Constants\nif (!defined('PCLZIP_READ_BLOCK_SIZE')) {\n    define('PCLZIP_READ_BLOCK_SIZE', 2048);\n}\n\n// ----- File list separator\n// In version 1.x of PclZip, the separator for file list is a space\n// (which is not a very smart choice, specifically for windows paths !).\n// A better separator should be a comma (,). This constant gives you the\n// abilty to change that.\n// However notice that changing this value, may have impact on existing\n// scripts, using space separated filenames.\n// Recommanded values for compatibility with older versions :\n//define( 'PCLZIP_SEPARATOR', ' ' );\n// Recommanded values for smart separation of filenames.\nif (!defined('PCLZIP_SEPARATOR')) {\n    define('PCLZIP_SEPARATOR', ',');\n}\n\n// ----- Error configuration\n// 0 : PclZip Class integrated error handling\n// 1 : PclError external library error handling. By enabling this\n//     you must ensure that you have included PclError library.\n// [2,...] : reserved for futur use\nif (!defined('PCLZIP_ERROR_EXTERNAL')) {\n    define('PCLZIP_ERROR_EXTERNAL', 0);\n}\n\n// ----- Optional static temporary directory\n//       By default temporary files are generated in the script current\n//       path.\n//       If defined :\n//       - MUST BE terminated by a '/'.\n//       - MUST be a valid, already created directory\n//       Samples :\n// define( 'PCLZIP_TEMPORARY_DIR', '/temp/' );\n// define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' );\nif (!defined('PCLZIP_TEMPORARY_DIR')) {\n    define('PCLZIP_TEMPORARY_DIR', '');\n}\n\n// ----- Optional threshold ratio for use of temporary files\n//       Pclzip sense the size of the file to add/extract and decide to\n//       use or not temporary file. The algorythm is looking for\n//       memory_limit of PHP and apply a ratio.\n//       threshold = memory_limit * ratio.\n//       Recommended values are under 0.5. Default 0.47.\n//       Samples :\n// define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.5 );\nif (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) {\n    define('PCLZIP_TEMPORARY_FILE_RATIO', 0.47);\n}\n\n// --------------------------------------------------------------------------------\n// ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED *****\n// --------------------------------------------------------------------------------\n\n// ----- Global variables\n$g_pclzip_version = \"2.8.2\";\n\n// ----- Error codes\n//   -1 : Unable to open file in binary write mode\n//   -2 : Unable to open file in binary read mode\n//   -3 : Invalid parameters\n//   -4 : File does not exist\n//   -5 : Filename is too long (max. 255)\n//   -6 : Not a valid zip file\n//   -7 : Invalid extracted file size\n//   -8 : Unable to create directory\n//   -9 : Invalid archive extension\n//  -10 : Invalid archive format\n//  -11 : Unable to delete file (unlink)\n//  -12 : Unable to rename file (rename)\n//  -13 : Invalid header checksum\n//  -14 : Invalid archive size\ndefine('PCLZIP_ERR_USER_ABORTED', 2);\ndefine('PCLZIP_ERR_NO_ERROR', 0);\ndefine('PCLZIP_ERR_WRITE_OPEN_FAIL', -1);\ndefine('PCLZIP_ERR_READ_OPEN_FAIL', -2);\ndefine('PCLZIP_ERR_INVALID_PARAMETER', -3);\ndefine('PCLZIP_ERR_MISSING_FILE', -4);\ndefine('PCLZIP_ERR_FILENAME_TOO_LONG', -5);\ndefine('PCLZIP_ERR_INVALID_ZIP', -6);\ndefine('PCLZIP_ERR_BAD_EXTRACTED_FILE', -7);\ndefine('PCLZIP_ERR_DIR_CREATE_FAIL', -8);\ndefine('PCLZIP_ERR_BAD_EXTENSION', -9);\ndefine('PCLZIP_ERR_BAD_FORMAT', -10);\ndefine('PCLZIP_ERR_DELETE_FILE_FAIL', -11);\ndefine('PCLZIP_ERR_RENAME_FILE_FAIL', -12);\ndefine('PCLZIP_ERR_BAD_CHECKSUM', -13);\ndefine('PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14);\ndefine('PCLZIP_ERR_MISSING_OPTION_VALUE', -15);\ndefine('PCLZIP_ERR_INVALID_OPTION_VALUE', -16);\ndefine('PCLZIP_ERR_ALREADY_A_DIRECTORY', -17);\ndefine('PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18);\ndefine('PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19);\ndefine('PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20);\ndefine('PCLZIP_ERR_DIRECTORY_RESTRICTION', -21);\n\n// ----- Options values\ndefine('PCLZIP_OPT_PATH', 77001);\ndefine('PCLZIP_OPT_ADD_PATH', 77002);\ndefine('PCLZIP_OPT_REMOVE_PATH', 77003);\ndefine('PCLZIP_OPT_REMOVE_ALL_PATH', 77004);\ndefine('PCLZIP_OPT_SET_CHMOD', 77005);\ndefine('PCLZIP_OPT_EXTRACT_AS_STRING', 77006);\ndefine('PCLZIP_OPT_NO_COMPRESSION', 77007);\ndefine('PCLZIP_OPT_BY_NAME', 77008);\ndefine('PCLZIP_OPT_BY_INDEX', 77009);\ndefine('PCLZIP_OPT_BY_EREG', 77010);\ndefine('PCLZIP_OPT_BY_PREG', 77011);\ndefine('PCLZIP_OPT_COMMENT', 77012);\ndefine('PCLZIP_OPT_ADD_COMMENT', 77013);\ndefine('PCLZIP_OPT_PREPEND_COMMENT', 77014);\ndefine('PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015);\ndefine('PCLZIP_OPT_REPLACE_NEWER', 77016);\ndefine('PCLZIP_OPT_STOP_ON_ERROR', 77017);\n// Having big trouble with crypt. Need to multiply 2 long int\n// which is not correctly supported by PHP ...\n//define( 'PCLZIP_OPT_CRYPT', 77018 );\ndefine('PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019);\ndefine('PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020);\ndefine('PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020); // alias\ndefine('PCLZIP_OPT_TEMP_FILE_ON', 77021);\ndefine('PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021); // alias\ndefine('PCLZIP_OPT_TEMP_FILE_OFF', 77022);\ndefine('PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022); // alias\n\n// ----- File description attributes\ndefine('PCLZIP_ATT_FILE_NAME', 79001);\ndefine('PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002);\ndefine('PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003);\ndefine('PCLZIP_ATT_FILE_MTIME', 79004);\ndefine('PCLZIP_ATT_FILE_CONTENT', 79005);\ndefine('PCLZIP_ATT_FILE_COMMENT', 79006);\n\n// ----- Call backs values\ndefine('PCLZIP_CB_PRE_EXTRACT', 78001);\ndefine('PCLZIP_CB_POST_EXTRACT', 78002);\ndefine('PCLZIP_CB_PRE_ADD', 78003);\ndefine('PCLZIP_CB_POST_ADD', 78004);\n/* For futur use\ndefine( 'PCLZIP_CB_PRE_LIST', 78005 );\ndefine( 'PCLZIP_CB_POST_LIST', 78006 );\ndefine( 'PCLZIP_CB_PRE_DELETE', 78007 );\ndefine( 'PCLZIP_CB_POST_DELETE', 78008 );\n*/\n\n// --------------------------------------------------------------------------------\n// Class : PclZip\n// Description :\n//   PclZip is the class that represent a Zip archive.\n//   The public methods allow the manipulation of the archive.\n// Attributes :\n//   Attributes must not be accessed directly.\n// Methods :\n//   PclZip() : Object creator\n//   create() : Creates the Zip archive\n//   listContent() : List the content of the Zip archive\n//   extract() : Extract the content of the archive\n//   properties() : List the properties of the archive\n// --------------------------------------------------------------------------------\nclass PclZip\n{\n    // ----- Filename of the zip file\n    public $zipname = '';\n\n    // ----- File descriptor of the zip file\n    public $zip_fd = 0;\n\n    // ----- Internal error handling\n    public $error_code = 1;\n    public $error_string = '';\n\n    // ----- Current status of the magic_quotes_runtime\n    // This value store the php configuration for magic_quotes\n    // The class can then disable the magic_quotes and reset it after\n    public $magic_quotes_status;\n\n    // --------------------------------------------------------------------------------\n    // Function : PclZip()\n    // Description :\n    //   Creates a PclZip object and set the name of the associated Zip archive\n    //   filename.\n    //   Note that no real action is taken, if the archive does not exist it is not\n    //   created. Use create() for that.\n    // --------------------------------------------------------------------------------\n    public function __construct($p_zipname)\n    {\n\n        // ----- Tests the zlib\n        if (!function_exists('gzopen')) {\n            die('Abort ' . basename(__FILE__) . ' : Missing zlib extensions');\n        }\n\n        // ----- Set the attributes\n        $this->zipname             = $p_zipname;\n        $this->zip_fd              = 0;\n        $this->magic_quotes_status = -1;\n\n        // ----- Return\n        return;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function :\n    //   create($p_filelist, $p_add_dir=\"\", $p_remove_dir=\"\")\n    //   create($p_filelist, $p_option, $p_option_value, ...)\n    // Description :\n    //   This method supports two different synopsis. The first one is historical.\n    //   This method creates a Zip Archive. The Zip file is created in the\n    //   filesystem. The files and directories indicated in $p_filelist\n    //   are added in the archive. See the parameters description for the\n    //   supported format of $p_filelist.\n    //   When a directory is in the list, the directory and its content is added\n    //   in the archive.\n    //   In this synopsis, the function takes an optional variable list of\n    //   options. See bellow the supported options.\n    // Parameters :\n    //   $p_filelist : An array containing file or directory names, or\n    //                 a string containing one filename or one directory name, or\n    //                 a string containing a list of filenames and/or directory\n    //                 names separated by spaces.\n    //   $p_add_dir : A path to add before the real path of the archived file,\n    //                in order to have it memorized in the archive.\n    //   $p_remove_dir : A path to remove from the real path of the file to archive,\n    //                   in order to have a shorter path memorized in the archive.\n    //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir\n    //                   is removed first, before $p_add_dir is added.\n    // Options :\n    //   PCLZIP_OPT_ADD_PATH :\n    //   PCLZIP_OPT_REMOVE_PATH :\n    //   PCLZIP_OPT_REMOVE_ALL_PATH :\n    //   PCLZIP_OPT_COMMENT :\n    //   PCLZIP_CB_PRE_ADD :\n    //   PCLZIP_CB_POST_ADD :\n    // Return Values :\n    //   0 on failure,\n    //   The list of the added files, with a status of the add action.\n    //   (see PclZip::listContent() for list entry format)\n    // --------------------------------------------------------------------------------\n    public function create($p_filelist)\n    {\n        $v_result = 1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Set default values\n        $v_options                            = array();\n        $v_options[PCLZIP_OPT_NO_COMPRESSION] = false;\n\n        // ----- Look for variable options arguments\n        $v_size = func_num_args();\n\n        // ----- Look for arguments\n        if ($v_size > 1) {\n            // ----- Get the arguments\n            $v_arg_list = func_get_args();\n\n            // ----- Remove from the options list the first argument\n            array_shift($v_arg_list);\n            $v_size--;\n\n            // ----- Look for first arg\n            if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n\n                // ----- Parse the options\n                $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array(\n                    PCLZIP_OPT_REMOVE_PATH => 'optional',\n                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                    PCLZIP_OPT_ADD_PATH => 'optional',\n                    PCLZIP_CB_PRE_ADD => 'optional',\n                    PCLZIP_CB_POST_ADD => 'optional',\n                    PCLZIP_OPT_NO_COMPRESSION => 'optional',\n                    PCLZIP_OPT_COMMENT => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n                    //, PCLZIP_OPT_CRYPT => 'optional'\n                ));\n                if ($v_result != 1) {\n                    return 0;\n                }\n\n            // ----- Look for 2 args\n            // Here we need to support the first historic synopsis of the\n            // method.\n            } else {\n\n                // ----- Get the first argument\n                $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];\n\n                // ----- Look for the optional second argument\n                if ($v_size == 2) {\n                    $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];\n                } elseif ($v_size > 2) {\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid number / type of arguments\");\n\n                    return 0;\n                }\n            }\n        }\n\n        // ----- Look for default option values\n        $this->privOptionDefaultThreshold($v_options);\n\n        // ----- Init\n        $v_string_list    = array();\n        $v_att_list       = array();\n        $v_filedescr_list = array();\n        $p_result_list    = array();\n\n        // ----- Look if the $p_filelist is really an array\n        if (is_array($p_filelist)) {\n\n            // ----- Look if the first element is also an array\n            //       This will mean that this is a file description entry\n            if (isset($p_filelist[0]) && is_array($p_filelist[0])) {\n                $v_att_list = $p_filelist;\n\n            // ----- The list is a list of string names\n            } else {\n                $v_string_list = $p_filelist;\n            }\n\n        // ----- Look if the $p_filelist is a string\n        } elseif (is_string($p_filelist)) {\n            // ----- Create a list from the string\n            $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);\n\n        // ----- Invalid variable type for $p_filelist\n        } else {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type p_filelist\");\n\n            return 0;\n        }\n\n        // ----- Reformat the string list\n        if (sizeof($v_string_list) != 0) {\n            foreach ($v_string_list as $v_string) {\n                if ($v_string != '') {\n                    $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;\n                } else {\n                }\n            }\n        }\n\n        // ----- For each file in the list check the attributes\n        $v_supported_attributes = array(\n            PCLZIP_ATT_FILE_NAME => 'mandatory',\n            PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional',\n            PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional',\n            PCLZIP_ATT_FILE_MTIME => 'optional',\n            PCLZIP_ATT_FILE_CONTENT => 'optional',\n            PCLZIP_ATT_FILE_COMMENT => 'optional'\n        );\n        foreach ($v_att_list as $v_entry) {\n            $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes);\n            if ($v_result != 1) {\n                return 0;\n            }\n        }\n\n        // ----- Expand the filelist (expand directories)\n        $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);\n        if ($v_result != 1) {\n            return 0;\n        }\n\n        // ----- Call the create fct\n        $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);\n        if ($v_result != 1) {\n            return 0;\n        }\n\n        // ----- Return\n        return $p_result_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function :\n    //   add($p_filelist, $p_add_dir=\"\", $p_remove_dir=\"\")\n    //   add($p_filelist, $p_option, $p_option_value, ...)\n    // Description :\n    //   This method supports two synopsis. The first one is historical.\n    //   This methods add the list of files in an existing archive.\n    //   If a file with the same name already exists, it is added at the end of the\n    //   archive, the first one is still present.\n    //   If the archive does not exist, it is created.\n    // Parameters :\n    //   $p_filelist : An array containing file or directory names, or\n    //                 a string containing one filename or one directory name, or\n    //                 a string containing a list of filenames and/or directory\n    //                 names separated by spaces.\n    //   $p_add_dir : A path to add before the real path of the archived file,\n    //                in order to have it memorized in the archive.\n    //   $p_remove_dir : A path to remove from the real path of the file to archive,\n    //                   in order to have a shorter path memorized in the archive.\n    //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir\n    //                   is removed first, before $p_add_dir is added.\n    // Options :\n    //   PCLZIP_OPT_ADD_PATH :\n    //   PCLZIP_OPT_REMOVE_PATH :\n    //   PCLZIP_OPT_REMOVE_ALL_PATH :\n    //   PCLZIP_OPT_COMMENT :\n    //   PCLZIP_OPT_ADD_COMMENT :\n    //   PCLZIP_OPT_PREPEND_COMMENT :\n    //   PCLZIP_CB_PRE_ADD :\n    //   PCLZIP_CB_POST_ADD :\n    // Return Values :\n    //   0 on failure,\n    //   The list of the added files, with a status of the add action.\n    //   (see PclZip::listContent() for list entry format)\n    // --------------------------------------------------------------------------------\n    public function add($p_filelist)\n    {\n        $v_result = 1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Set default values\n        $v_options                            = array();\n        $v_options[PCLZIP_OPT_NO_COMPRESSION] = false;\n\n        // ----- Look for variable options arguments\n        $v_size = func_num_args();\n\n        // ----- Look for arguments\n        if ($v_size > 1) {\n            // ----- Get the arguments\n            $v_arg_list = func_get_args();\n\n            // ----- Remove form the options list the first argument\n            array_shift($v_arg_list);\n            $v_size--;\n\n            // ----- Look for first arg\n            if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n\n                // ----- Parse the options\n                $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array(\n                    PCLZIP_OPT_REMOVE_PATH => 'optional',\n                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                    PCLZIP_OPT_ADD_PATH => 'optional',\n                    PCLZIP_CB_PRE_ADD => 'optional',\n                    PCLZIP_CB_POST_ADD => 'optional',\n                    PCLZIP_OPT_NO_COMPRESSION => 'optional',\n                    PCLZIP_OPT_COMMENT => 'optional',\n                    PCLZIP_OPT_ADD_COMMENT => 'optional',\n                    PCLZIP_OPT_PREPEND_COMMENT => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n                    //, PCLZIP_OPT_CRYPT => 'optional'\n                ));\n                if ($v_result != 1) {\n                    return 0;\n                }\n\n            // ----- Look for 2 args\n            // Here we need to support the first historic synopsis of the\n            // method.\n            } else {\n\n                // ----- Get the first argument\n                $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];\n\n                // ----- Look for the optional second argument\n                if ($v_size == 2) {\n                    $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];\n                } elseif ($v_size > 2) {\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid number / type of arguments\");\n\n                    // ----- Return\n                    return 0;\n                }\n            }\n        }\n\n        // ----- Look for default option values\n        $this->privOptionDefaultThreshold($v_options);\n\n        // ----- Init\n        $v_string_list    = array();\n        $v_att_list       = array();\n        $v_filedescr_list = array();\n        $p_result_list    = array();\n\n        // ----- Look if the $p_filelist is really an array\n        if (is_array($p_filelist)) {\n\n            // ----- Look if the first element is also an array\n            //       This will mean that this is a file description entry\n            if (isset($p_filelist[0]) && is_array($p_filelist[0])) {\n                $v_att_list = $p_filelist;\n\n            // ----- The list is a list of string names\n            } else {\n                $v_string_list = $p_filelist;\n            }\n\n        // ----- Look if the $p_filelist is a string\n        } elseif (is_string($p_filelist)) {\n            // ----- Create a list from the string\n            $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);\n\n        // ----- Invalid variable type for $p_filelist\n        } else {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type '\" . gettype($p_filelist) . \"' for p_filelist\");\n\n            return 0;\n        }\n\n        // ----- Reformat the string list\n        if (sizeof($v_string_list) != 0) {\n            foreach ($v_string_list as $v_string) {\n                $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;\n            }\n        }\n\n        // ----- For each file in the list check the attributes\n        $v_supported_attributes = array(\n            PCLZIP_ATT_FILE_NAME => 'mandatory',\n            PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional',\n            PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional',\n            PCLZIP_ATT_FILE_MTIME => 'optional',\n            PCLZIP_ATT_FILE_CONTENT => 'optional',\n            PCLZIP_ATT_FILE_COMMENT => 'optional'\n        );\n        foreach ($v_att_list as $v_entry) {\n            $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes);\n            if ($v_result != 1) {\n                return 0;\n            }\n        }\n\n        // ----- Expand the filelist (expand directories)\n        $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);\n        if ($v_result != 1) {\n            return 0;\n        }\n\n        // ----- Call the create fct\n        $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);\n        if ($v_result != 1) {\n            return 0;\n        }\n\n        // ----- Return\n        return $p_result_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : listContent()\n    // Description :\n    //   This public method, gives the list of the files and directories, with their\n    //   properties.\n    //   The properties of each entries in the list are (used also in other functions) :\n    //     filename : Name of the file. For a create or add action it is the filename\n    //                given by the user. For an extract function it is the filename\n    //                of the extracted file.\n    //     stored_filename : Name of the file / directory stored in the archive.\n    //     size : Size of the stored file.\n    //     compressed_size : Size of the file's data compressed in the archive\n    //                       (without the headers overhead)\n    //     mtime : Last known modification date of the file (UNIX timestamp)\n    //     comment : Comment associated with the file\n    //     folder : true | false\n    //     index : index of the file in the archive\n    //     status : status of the action (depending of the action) :\n    //              Values are :\n    //                ok : OK !\n    //                filtered : the file / dir is not extracted (filtered by user)\n    //                already_a_directory : the file can not be extracted because a\n    //                                      directory with the same name already exists\n    //                write_protected : the file can not be extracted because a file\n    //                                  with the same name already exists and is\n    //                                  write protected\n    //                newer_exist : the file was not extracted because a newer file exists\n    //                path_creation_fail : the file is not extracted because the folder\n    //                                     does not exist and can not be created\n    //                write_error : the file was not extracted because there was a\n    //                              error while writing the file\n    //                read_error : the file was not extracted because there was a error\n    //                             while reading the file\n    //                invalid_header : the file was not extracted because of an archive\n    //                                 format error (bad file header)\n    //   Note that each time a method can continue operating when there\n    //   is an action error on a file, the error is only logged in the file status.\n    // Return Values :\n    //   0 on an unrecoverable failure,\n    //   The list of the files in the archive.\n    // --------------------------------------------------------------------------------\n    public function listContent()\n    {\n        $v_result = 1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            return (0);\n        }\n\n        // ----- Call the extracting fct\n        $p_list = array();\n        if (($v_result = $this->privList($p_list)) != 1) {\n            unset($p_list);\n\n            return (0);\n        }\n\n        // ----- Return\n        return $p_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function :\n    //   extract($p_path=\"./\", $p_remove_path=\"\")\n    //   extract([$p_option, $p_option_value, ...])\n    // Description :\n    //   This method supports two synopsis. The first one is historical.\n    //   This method extract all the files / directories from the archive to the\n    //   folder indicated in $p_path.\n    //   If you want to ignore the 'root' part of path of the memorized files\n    //   you can indicate this in the optional $p_remove_path parameter.\n    //   By default, if a newer file with the same name already exists, the\n    //   file is not extracted.\n    //\n    //   If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions\n    //   are used, the path indicated in PCLZIP_OPT_ADD_PATH is append\n    //   at the end of the path value of PCLZIP_OPT_PATH.\n    // Parameters :\n    //   $p_path : Path where the files and directories are to be extracted\n    //   $p_remove_path : First part ('root' part) of the memorized path\n    //                    (if any similar) to remove while extracting.\n    // Options :\n    //   PCLZIP_OPT_PATH :\n    //   PCLZIP_OPT_ADD_PATH :\n    //   PCLZIP_OPT_REMOVE_PATH :\n    //   PCLZIP_OPT_REMOVE_ALL_PATH :\n    //   PCLZIP_CB_PRE_EXTRACT :\n    //   PCLZIP_CB_POST_EXTRACT :\n    // Return Values :\n    //   0 or a negative value on failure,\n    //   The list of the extracted files, with a status of the action.\n    //   (see PclZip::listContent() for list entry format)\n    // --------------------------------------------------------------------------------\n    public function extract()\n    {\n        $v_result = 1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            return (0);\n        }\n\n        // ----- Set default values\n        $v_options         = array();\n        //    $v_path = \"./\";\n        $v_path            = '';\n        $v_remove_path     = \"\";\n        $v_remove_all_path = false;\n\n        // ----- Look for variable options arguments\n        $v_size = func_num_args();\n\n        // ----- Default values for option\n        $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false;\n\n        // ----- Look for arguments\n        if ($v_size > 0) {\n            // ----- Get the arguments\n            $v_arg_list = func_get_args();\n\n            // ----- Look for first arg\n            if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n\n                // ----- Parse the options\n                $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array(\n                    PCLZIP_OPT_PATH => 'optional',\n                    PCLZIP_OPT_REMOVE_PATH => 'optional',\n                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                    PCLZIP_OPT_ADD_PATH => 'optional',\n                    PCLZIP_CB_PRE_EXTRACT => 'optional',\n                    PCLZIP_CB_POST_EXTRACT => 'optional',\n                    PCLZIP_OPT_SET_CHMOD => 'optional',\n                    PCLZIP_OPT_BY_NAME => 'optional',\n                    PCLZIP_OPT_BY_EREG => 'optional',\n                    PCLZIP_OPT_BY_PREG => 'optional',\n                    PCLZIP_OPT_BY_INDEX => 'optional',\n                    PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',\n                    PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',\n                    PCLZIP_OPT_REPLACE_NEWER => 'optional',\n                    PCLZIP_OPT_STOP_ON_ERROR => 'optional',\n                    PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n                ));\n                if ($v_result != 1) {\n                    return 0;\n                }\n\n                // ----- Set the arguments\n                if (isset($v_options[PCLZIP_OPT_PATH])) {\n                    $v_path = $v_options[PCLZIP_OPT_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {\n                    $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {\n                    $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {\n                    // ----- Check for '/' in last path char\n                    if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {\n                        $v_path .= '/';\n                    }\n                    $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];\n                }\n\n            // ----- Look for 2 args\n            // Here we need to support the first historic synopsis of the\n            // method.\n            } else {\n\n                // ----- Get the first argument\n                $v_path = $v_arg_list[0];\n\n                // ----- Look for the optional second argument\n                if ($v_size == 2) {\n                    $v_remove_path = $v_arg_list[1];\n                } elseif ($v_size > 2) {\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid number / type of arguments\");\n\n                    // ----- Return\n                    return 0;\n                }\n            }\n        }\n\n        // ----- Look for default option values\n        $this->privOptionDefaultThreshold($v_options);\n\n        // ----- Trace\n\n        // ----- Call the extracting fct\n        $p_list   = array();\n        $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options);\n        if ($v_result < 1) {\n            unset($p_list);\n\n            return (0);\n        }\n\n        // ----- Return\n        return $p_list;\n    }\n    // --------------------------------------------------------------------------------\n\n\n    // --------------------------------------------------------------------------------\n    // Function :\n    //   extractByIndex($p_index, $p_path=\"./\", $p_remove_path=\"\")\n    //   extractByIndex($p_index, [$p_option, $p_option_value, ...])\n    // Description :\n    //   This method supports two synopsis. The first one is historical.\n    //   This method is doing a partial extract of the archive.\n    //   The extracted files or folders are identified by their index in the\n    //   archive (from 0 to n).\n    //   Note that if the index identify a folder, only the folder entry is\n    //   extracted, not all the files included in the archive.\n    // Parameters :\n    //   $p_index : A single index (integer) or a string of indexes of files to\n    //              extract. The form of the string is \"0,4-6,8-12\" with only numbers\n    //              and '-' for range or ',' to separate ranges. No spaces or ';'\n    //              are allowed.\n    //   $p_path : Path where the files and directories are to be extracted\n    //   $p_remove_path : First part ('root' part) of the memorized path\n    //                    (if any similar) to remove while extracting.\n    // Options :\n    //   PCLZIP_OPT_PATH :\n    //   PCLZIP_OPT_ADD_PATH :\n    //   PCLZIP_OPT_REMOVE_PATH :\n    //   PCLZIP_OPT_REMOVE_ALL_PATH :\n    //   PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and\n    //     not as files.\n    //     The resulting content is in a new field 'content' in the file\n    //     structure.\n    //     This option must be used alone (any other options are ignored).\n    //   PCLZIP_CB_PRE_EXTRACT :\n    //   PCLZIP_CB_POST_EXTRACT :\n    // Return Values :\n    //   0 on failure,\n    //   The list of the extracted files, with a status of the action.\n    //   (see PclZip::listContent() for list entry format)\n    // --------------------------------------------------------------------------------\n    //function extractByIndex($p_index, options...)\n    public function extractByIndex($p_index)\n    {\n        $v_result = 1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            return (0);\n        }\n\n        // ----- Set default values\n        $v_options         = array();\n        //    $v_path = \"./\";\n        $v_path            = '';\n        $v_remove_path     = \"\";\n        $v_remove_all_path = false;\n\n        // ----- Look for variable options arguments\n        $v_size = func_num_args();\n\n        // ----- Default values for option\n        $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false;\n\n        // ----- Look for arguments\n        if ($v_size > 1) {\n            // ----- Get the arguments\n            $v_arg_list = func_get_args();\n\n            // ----- Remove form the options list the first argument\n            array_shift($v_arg_list);\n            $v_size--;\n\n            // ----- Look for first arg\n            if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n\n                // ----- Parse the options\n                $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array(\n                    PCLZIP_OPT_PATH => 'optional',\n                    PCLZIP_OPT_REMOVE_PATH => 'optional',\n                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                    PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',\n                    PCLZIP_OPT_ADD_PATH => 'optional',\n                    PCLZIP_CB_PRE_EXTRACT => 'optional',\n                    PCLZIP_CB_POST_EXTRACT => 'optional',\n                    PCLZIP_OPT_SET_CHMOD => 'optional',\n                    PCLZIP_OPT_REPLACE_NEWER => 'optional',\n                    PCLZIP_OPT_STOP_ON_ERROR => 'optional',\n                    PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n                ));\n                if ($v_result != 1) {\n                    return 0;\n                }\n\n                // ----- Set the arguments\n                if (isset($v_options[PCLZIP_OPT_PATH])) {\n                    $v_path = $v_options[PCLZIP_OPT_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {\n                    $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {\n                    $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {\n                    // ----- Check for '/' in last path char\n                    if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {\n                        $v_path .= '/';\n                    }\n                    $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];\n                }\n                if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {\n                    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false;\n                } else {\n                }\n\n            // ----- Look for 2 args\n            // Here we need to support the first historic synopsis of the\n            // method.\n            } else {\n\n                // ----- Get the first argument\n                $v_path = $v_arg_list[0];\n\n                // ----- Look for the optional second argument\n                if ($v_size == 2) {\n                    $v_remove_path = $v_arg_list[1];\n                } elseif ($v_size > 2) {\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid number / type of arguments\");\n\n                    // ----- Return\n                    return 0;\n                }\n            }\n        }\n\n        // ----- Trace\n\n        // ----- Trick\n        // Here I want to reuse extractByRule(), so I need to parse the $p_index\n        // with privParseOptions()\n        $v_arg_trick     = array(\n            PCLZIP_OPT_BY_INDEX,\n            $p_index\n        );\n        $v_options_trick = array();\n        $v_result        = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, array(\n            PCLZIP_OPT_BY_INDEX => 'optional'\n        ));\n        if ($v_result != 1) {\n            return 0;\n        }\n        $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];\n\n        // ----- Look for default option values\n        $this->privOptionDefaultThreshold($v_options);\n\n        // ----- Call the extracting fct\n        if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {\n            return (0);\n        }\n\n        // ----- Return\n        return $p_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function :\n    //   delete([$p_option, $p_option_value, ...])\n    // Description :\n    //   This method removes files from the archive.\n    //   If no parameters are given, then all the archive is emptied.\n    // Parameters :\n    //   None or optional arguments.\n    // Options :\n    //   PCLZIP_OPT_BY_INDEX :\n    //   PCLZIP_OPT_BY_NAME :\n    //   PCLZIP_OPT_BY_EREG :\n    //   PCLZIP_OPT_BY_PREG :\n    // Return Values :\n    //   0 on failure,\n    //   The list of the files which are still present in the archive.\n    //   (see PclZip::listContent() for list entry format)\n    // --------------------------------------------------------------------------------\n    public function delete()\n    {\n        $v_result = 1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            return (0);\n        }\n\n        // ----- Set default values\n        $v_options = array();\n\n        // ----- Look for variable options arguments\n        $v_size = func_num_args();\n\n        // ----- Look for arguments\n        if ($v_size > 0) {\n            // ----- Get the arguments\n            $v_arg_list = func_get_args();\n\n            // ----- Parse the options\n            $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array(\n                PCLZIP_OPT_BY_NAME => 'optional',\n                PCLZIP_OPT_BY_EREG => 'optional',\n                PCLZIP_OPT_BY_PREG => 'optional',\n                PCLZIP_OPT_BY_INDEX => 'optional'\n            ));\n            if ($v_result != 1) {\n                return 0;\n            }\n        }\n\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Call the delete fct\n        $v_list = array();\n        if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {\n            $this->privSwapBackMagicQuotes();\n            unset($v_list);\n\n            return (0);\n        }\n\n        // ----- Magic quotes trick\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Return\n        return $v_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : deleteByIndex()\n    // Description :\n    //   ***** Deprecated *****\n    //   delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered.\n    // --------------------------------------------------------------------------------\n    public function deleteByIndex($p_index)\n    {\n\n        $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);\n\n        // ----- Return\n        return $p_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : properties()\n    // Description :\n    //   This method gives the properties of the archive.\n    //   The properties are :\n    //     nb : Number of files in the archive\n    //     comment : Comment associated with the archive file\n    //     status : not_exist, ok\n    // Parameters :\n    //   None\n    // Return Values :\n    //   0 on failure,\n    //   An array with the archive properties.\n    // --------------------------------------------------------------------------------\n    public function properties()\n    {\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            $this->privSwapBackMagicQuotes();\n\n            return (0);\n        }\n\n        // ----- Default properties\n        $v_prop            = array();\n        $v_prop['comment'] = '';\n        $v_prop['nb']      = 0;\n        $v_prop['status']  = 'not_exist';\n\n        // ----- Look if file exists\n        if (@is_file($this->zipname)) {\n            // ----- Open the zip file\n            if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) {\n                $this->privSwapBackMagicQuotes();\n\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \\'' . $this->zipname . '\\' in binary read mode');\n\n                // ----- Return\n                return 0;\n            }\n\n            // ----- Read the central directory informations\n            $v_central_dir = array();\n            if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n                $this->privSwapBackMagicQuotes();\n\n                return 0;\n            }\n\n            // ----- Close the zip file\n            $this->privCloseFd();\n\n            // ----- Set the user attributes\n            $v_prop['comment'] = $v_central_dir['comment'];\n            $v_prop['nb']      = $v_central_dir['entries'];\n            $v_prop['status']  = 'ok';\n        }\n\n        // ----- Magic quotes trick\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Return\n        return $v_prop;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : duplicate()\n    // Description :\n    //   This method creates an archive by copying the content of an other one. If\n    //   the archive already exist, it is replaced by the new one without any warning.\n    // Parameters :\n    //   $p_archive : The filename of a valid archive, or\n    //                a valid PclZip object.\n    // Return Values :\n    //   1 on success.\n    //   0 or a negative value on error (error code).\n    // --------------------------------------------------------------------------------\n    public function duplicate($p_archive)\n    {\n        $v_result = 1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Look if the $p_archive is a PclZip object\n        if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) {\n\n            // ----- Duplicate the archive\n            $v_result = $this->privDuplicate($p_archive->zipname);\n\n        // ----- Look if the $p_archive is a string (so a filename)\n        } elseif (is_string($p_archive)) {\n\n            // ----- Check that $p_archive is a valid zip file\n            // TBC : Should also check the archive format\n            if (!is_file($p_archive)) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"No file with filename '\" . $p_archive . \"'\");\n                $v_result = PCLZIP_ERR_MISSING_FILE;\n            } else {\n                // ----- Duplicate the archive\n                $v_result = $this->privDuplicate($p_archive);\n            }\n\n        // ----- Invalid variable\n        } else {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type p_archive_to_add\");\n            $v_result = PCLZIP_ERR_INVALID_PARAMETER;\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : merge()\n    // Description :\n    //   This method merge the $p_archive_to_add archive at the end of the current\n    //   one ($this).\n    //   If the archive ($this) does not exist, the merge becomes a duplicate.\n    //   If the $p_archive_to_add archive does not exist, the merge is a success.\n    // Parameters :\n    //   $p_archive_to_add : It can be directly the filename of a valid zip archive,\n    //                       or a PclZip object archive.\n    // Return Values :\n    //   1 on success,\n    //   0 or negative values on error (see below).\n    // --------------------------------------------------------------------------------\n    public function merge($p_archive_to_add)\n    {\n        $v_result = 1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            return (0);\n        }\n\n        // ----- Look if the $p_archive_to_add is a PclZip object\n        if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) {\n\n            // ----- Merge the archive\n            $v_result = $this->privMerge($p_archive_to_add);\n\n        // ----- Look if the $p_archive_to_add is a string (so a filename)\n        } elseif (is_string($p_archive_to_add)) {\n\n            // ----- Create a temporary archive\n            $v_object_archive = new PclZip($p_archive_to_add);\n\n            // ----- Merge the archive\n            $v_result = $this->privMerge($v_object_archive);\n\n        // ----- Invalid variable\n        } else {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type p_archive_to_add\");\n            $v_result = PCLZIP_ERR_INVALID_PARAMETER;\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : errorCode()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function errorCode()\n    {\n        if (PCLZIP_ERROR_EXTERNAL == 1) {\n            return (PclErrorCode());\n        } else {\n            return ($this->error_code);\n        }\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : errorName()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function errorName($p_with_code = false)\n    {\n        $v_name = array(\n            PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',\n            PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',\n            PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',\n            PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',\n            PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',\n            PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',\n            PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',\n            PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',\n            PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',\n            PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',\n            PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',\n            PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',\n            PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',\n            PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',\n            PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',\n            PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',\n            PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',\n            PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',\n            PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION',\n            PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE',\n            PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION'\n        );\n\n        if (isset($v_name[$this->error_code])) {\n            $v_value = $v_name[$this->error_code];\n        } else {\n            $v_value = 'NoName';\n        }\n\n        if ($p_with_code) {\n            return ($v_value . ' (' . $this->error_code . ')');\n        } else {\n            return ($v_value);\n        }\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : errorInfo()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function errorInfo($p_full = false)\n    {\n        if (PCLZIP_ERROR_EXTERNAL == 1) {\n            return (PclErrorString());\n        } else {\n            if ($p_full) {\n                return ($this->errorName(true) . \" : \" . $this->error_string);\n            } else {\n                return ($this->error_string . \" [code \" . $this->error_code . \"]\");\n            }\n        }\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS *****\n    // *****                                                        *****\n    // *****       THESES FUNCTIONS MUST NOT BE USED DIRECTLY       *****\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privCheckFormat()\n    // Description :\n    //   This method check that the archive exists and is a valid zip archive.\n    //   Several level of check exists. (futur)\n    // Parameters :\n    //   $p_level : Level of check. Default 0.\n    //              0 : Check the first bytes (magic codes) (default value))\n    //              1 : 0 + Check the central directory (futur)\n    //              2 : 1 + Check each file header (futur)\n    // Return Values :\n    //   true on success,\n    //   false on error, the error code is set.\n    // --------------------------------------------------------------------------------\n    public function privCheckFormat($p_level = 0)\n    {\n        $v_result = true;\n\n        // ----- Reset the file system cache\n        clearstatcache();\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Look if the file exits\n        if (!is_file($this->zipname)) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"Missing archive file '\" . $this->zipname . \"'\");\n\n            return (false);\n        }\n\n        // ----- Check that the file is readeable\n        if (!is_readable($this->zipname)) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, \"Unable to read archive '\" . $this->zipname . \"'\");\n\n            return (false);\n        }\n\n        // ----- Check the magic code\n        // TBC\n\n        // ----- Check the central header\n        // TBC\n\n        // ----- Check each file header\n        // TBC\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privParseOptions()\n    // Description :\n    //   This internal methods reads the variable list of arguments ($p_options_list,\n    //   $p_size) and generate an array with the options and values ($v_result_list).\n    //   $v_requested_options contains the options that can be present and those that\n    //   must be present.\n    //   $v_requested_options is an array, with the option value as key, and 'optional',\n    //   or 'mandatory' as value.\n    // Parameters :\n    //   See above.\n    // Return Values :\n    //   1 on success.\n    //   0 on failure.\n    // --------------------------------------------------------------------------------\n    public function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options = false)\n    {\n        $v_result = 1;\n\n        // ----- Read the options\n        $i = 0;\n        while ($i < $p_size) {\n\n            // ----- Check if the option is supported\n            if (!isset($v_requested_options[$p_options_list[$i]])) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid optional parameter '\" . $p_options_list[$i] . \"' for this method\");\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Look for next option\n            switch ($p_options_list[$i]) {\n                // ----- Look for options that request a path value\n                case PCLZIP_OPT_PATH:\n                case PCLZIP_OPT_REMOVE_PATH:\n                case PCLZIP_OPT_ADD_PATH:\n                    // ----- Check the number of parameters\n                    if (($i + 1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i + 1], false);\n                    $i++;\n                    break;\n\n                case PCLZIP_OPT_TEMP_FILE_THRESHOLD:\n                    // ----- Check the number of parameters\n                    if (($i + 1) >= $p_size) {\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Check for incompatible options\n                    if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Check the value\n                    $v_value = $p_options_list[$i + 1];\n                    if ((!is_integer($v_value)) || ($v_value < 0)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Integer expected for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value (and convert it in bytes)\n                    $v_result_list[$p_options_list[$i]] = $v_value * 1048576;\n                    $i++;\n                    break;\n\n                case PCLZIP_OPT_TEMP_FILE_ON:\n                    // ----- Check for incompatible options\n                    if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    $v_result_list[$p_options_list[$i]] = true;\n                    break;\n\n                case PCLZIP_OPT_TEMP_FILE_OFF:\n                    // ----- Check for incompatible options\n                    if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'\");\n\n                        return PclZip::errorCode();\n                    }\n                    // ----- Check for incompatible options\n                    if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    $v_result_list[$p_options_list[$i]] = true;\n                    break;\n\n                case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION:\n                    // ----- Check the number of parameters\n                    if (($i + 1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    if (is_string($p_options_list[$i + 1]) && ($p_options_list[$i + 1] != '')) {\n                        $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i + 1], false);\n                        $i++;\n                    } else {\n                    }\n                    break;\n\n                // ----- Look for options that request an array of string for value\n                case PCLZIP_OPT_BY_NAME:\n                    // ----- Check the number of parameters\n                    if (($i + 1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    if (is_string($p_options_list[$i + 1])) {\n                        $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i + 1];\n                    } elseif (is_array($p_options_list[$i + 1])) {\n                        $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1];\n                    } else {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Wrong parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n                    $i++;\n                    break;\n\n                // ----- Look for options that request an EREG or PREG expression\n                case PCLZIP_OPT_BY_EREG:\n                    $p_options_list[$i] = PCLZIP_OPT_BY_PREG;\n                    // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG\n                    // to PCLZIP_OPT_BY_PREG\n                case PCLZIP_OPT_BY_PREG:\n                    //case PCLZIP_OPT_CRYPT :\n                    // ----- Check the number of parameters\n                    if (($i + 1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    if (is_string($p_options_list[$i + 1])) {\n                        $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1];\n                    } else {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Wrong parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n                    $i++;\n                    break;\n\n                // ----- Look for options that takes a string\n                case PCLZIP_OPT_COMMENT:\n                case PCLZIP_OPT_ADD_COMMENT:\n                case PCLZIP_OPT_PREPEND_COMMENT:\n                    // ----- Check the number of parameters\n                    if (($i + 1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    if (is_string($p_options_list[$i + 1])) {\n                        $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1];\n                    } else {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Wrong parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n                    $i++;\n                    break;\n\n                // ----- Look for options that request an array of index\n                case PCLZIP_OPT_BY_INDEX:\n                    // ----- Check the number of parameters\n                    if (($i + 1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    $v_work_list = array();\n                    if (is_string($p_options_list[$i + 1])) {\n\n                        // ----- Remove spaces\n                        $p_options_list[$i + 1] = strtr($p_options_list[$i + 1], ' ', '');\n\n                        // ----- Parse items\n                        $v_work_list = explode(\",\", $p_options_list[$i + 1]);\n                    } elseif (is_integer($p_options_list[$i + 1])) {\n                        $v_work_list[0] = $p_options_list[$i + 1] . '-' . $p_options_list[$i + 1];\n                    } elseif (is_array($p_options_list[$i + 1])) {\n                        $v_work_list = $p_options_list[$i + 1];\n                    } else {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Value must be integer, string or array for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Reduce the index list\n                    // each index item in the list must be a couple with a start and\n                    // an end value : [0,3], [5-5], [8-10], ...\n                    // ----- Check the format of each item\n                    $v_sort_flag  = false;\n                    $v_sort_value = 0;\n                    for ($j = 0; $j < sizeof($v_work_list); $j++) {\n                        // ----- Explode the item\n                        $v_item_list      = explode(\"-\", $v_work_list[$j]);\n                        $v_size_item_list = sizeof($v_item_list);\n\n                        // ----- TBC : Here we might check that each item is a\n                        // real integer ...\n\n                        // ----- Look for single value\n                        if ($v_size_item_list == 1) {\n                            // ----- Set the option value\n                            $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];\n                            $v_result_list[$p_options_list[$i]][$j]['end']   = $v_item_list[0];\n                        } elseif ($v_size_item_list == 2) {\n                            // ----- Set the option value\n                            $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];\n                            $v_result_list[$p_options_list[$i]][$j]['end']   = $v_item_list[1];\n                        } else {\n                            // ----- Error log\n                            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Too many values in index range for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                            // ----- Return\n                            return PclZip::errorCode();\n                        }\n\n                        // ----- Look for list sort\n                        if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {\n                            $v_sort_flag = true;\n\n                            // ----- TBC : An automatic sort should be writen ...\n                            // ----- Error log\n                            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Invalid order of index range for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                            // ----- Return\n                            return PclZip::errorCode();\n                        }\n                        $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];\n                    }\n\n                    // ----- Sort the items\n                    if ($v_sort_flag) {\n                        // TBC : To Be Completed\n                    }\n\n                    // ----- Next option\n                    $i++;\n                    break;\n\n                // ----- Look for options that request no value\n                case PCLZIP_OPT_REMOVE_ALL_PATH:\n                case PCLZIP_OPT_EXTRACT_AS_STRING:\n                case PCLZIP_OPT_NO_COMPRESSION:\n                case PCLZIP_OPT_EXTRACT_IN_OUTPUT:\n                case PCLZIP_OPT_REPLACE_NEWER:\n                case PCLZIP_OPT_STOP_ON_ERROR:\n                    $v_result_list[$p_options_list[$i]] = true;\n                    break;\n\n                // ----- Look for options that request an octal value\n                case PCLZIP_OPT_SET_CHMOD:\n                    // ----- Check the number of parameters\n                    if (($i + 1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1];\n                    $i++;\n                    break;\n\n                // ----- Look for options that request a call-back\n                case PCLZIP_CB_PRE_EXTRACT:\n                case PCLZIP_CB_POST_EXTRACT:\n                case PCLZIP_CB_PRE_ADD:\n                case PCLZIP_CB_POST_ADD:\n                    /* for futur use\n                    case PCLZIP_CB_PRE_DELETE :\n                    case PCLZIP_CB_POST_DELETE :\n                    case PCLZIP_CB_PRE_LIST :\n                    case PCLZIP_CB_POST_LIST :\n                    */\n                    // ----- Check the number of parameters\n                    if (($i + 1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    $v_function_name = $p_options_list[$i + 1];\n\n                    // ----- Check that the value is a valid existing function\n                    if (!function_exists($v_function_name)) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Function '\" . $v_function_name . \"()' is not an existing function for option '\" . PclZipUtilOptionText($p_options_list[$i]) . \"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Set the attribute\n                    $v_result_list[$p_options_list[$i]] = $v_function_name;\n                    $i++;\n                    break;\n\n                default:\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Unknown parameter '\" . $p_options_list[$i] . \"'\");\n\n                    // ----- Return\n                    return PclZip::errorCode();\n            }\n\n            // ----- Next options\n            $i++;\n        }\n\n        // ----- Look for mandatory options\n        if ($v_requested_options !== false) {\n            for ($key = reset($v_requested_options); $key = key($v_requested_options); $key = next($v_requested_options)) {\n                // ----- Look for mandatory option\n                if ($v_requested_options[$key] == 'mandatory') {\n                    // ----- Look if present\n                    if (!isset($v_result_list[$key])) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Missing mandatory parameter \" . PclZipUtilOptionText($key) . \"(\" . $key . \")\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n                }\n            }\n        }\n\n        // ----- Look for default values\n        if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {\n\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privOptionDefaultThreshold()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privOptionDefaultThreshold(&$p_options)\n    {\n        $v_result = 1;\n\n        if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) {\n            return $v_result;\n        }\n\n        // ----- Get 'memory_limit' configuration value\n        $v_memory_limit = ini_get('memory_limit');\n        $v_memory_limit = trim($v_memory_limit);\n        $last           = strtolower(substr($v_memory_limit, -1));\n        $v_memory_limit = preg_replace('/\\s*[KkMmGg]$/', '', $v_memory_limit);\n\n        if ($last == 'g') {\n            //$v_memory_limit = $v_memory_limit*1024*1024*1024;\n            $v_memory_limit = $v_memory_limit * 1073741824;\n        }\n        if ($last == 'm') {\n            //$v_memory_limit = $v_memory_limit*1024*1024;\n            $v_memory_limit = $v_memory_limit * 1048576;\n        }\n        if ($last == 'k') {\n            $v_memory_limit = $v_memory_limit * 1024;\n        }\n\n        $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit * PCLZIP_TEMPORARY_FILE_RATIO);\n\n        // ----- Sanity check : No threshold if value lower than 1M\n        if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) {\n            unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]);\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privFileDescrParseAtt()\n    // Description :\n    // Parameters :\n    // Return Values :\n    //   1 on success.\n    //   0 on failure.\n    // --------------------------------------------------------------------------------\n    public function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options = false)\n    {\n        $v_result = 1;\n\n        // ----- For each file in the list check the attributes\n        foreach ($p_file_list as $v_key => $v_value) {\n\n            // ----- Check if the option is supported\n            if (!isset($v_requested_options[$v_key])) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid file attribute '\" . $v_key . \"' for this file\");\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Look for attribute\n            switch ($v_key) {\n                case PCLZIP_ATT_FILE_NAME:\n                    if (!is_string($v_value)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \" . gettype($v_value) . \". String expected for attribute '\" . PclZipUtilOptionText($v_key) . \"'\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);\n\n                    if ($p_filedescr['filename'] == '') {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid empty filename for attribute '\" . PclZipUtilOptionText($v_key) . \"'\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    break;\n\n                case PCLZIP_ATT_FILE_NEW_SHORT_NAME:\n                    if (!is_string($v_value)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \" . gettype($v_value) . \". String expected for attribute '\" . PclZipUtilOptionText($v_key) . \"'\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);\n\n                    if ($p_filedescr['new_short_name'] == '') {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid empty short filename for attribute '\" . PclZipUtilOptionText($v_key) . \"'\");\n\n                        return PclZip::errorCode();\n                    }\n                    break;\n\n                case PCLZIP_ATT_FILE_NEW_FULL_NAME:\n                    if (!is_string($v_value)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \" . gettype($v_value) . \". String expected for attribute '\" . PclZipUtilOptionText($v_key) . \"'\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);\n\n                    if ($p_filedescr['new_full_name'] == '') {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid empty full filename for attribute '\" . PclZipUtilOptionText($v_key) . \"'\");\n\n                        return PclZip::errorCode();\n                    }\n                    break;\n\n                // ----- Look for options that takes a string\n                case PCLZIP_ATT_FILE_COMMENT:\n                    if (!is_string($v_value)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \" . gettype($v_value) . \". String expected for attribute '\" . PclZipUtilOptionText($v_key) . \"'\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    $p_filedescr['comment'] = $v_value;\n                    break;\n\n                case PCLZIP_ATT_FILE_MTIME:\n                    if (!is_integer($v_value)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \" . gettype($v_value) . \". Integer expected for attribute '\" . PclZipUtilOptionText($v_key) . \"'\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    $p_filedescr['mtime'] = $v_value;\n                    break;\n\n                case PCLZIP_ATT_FILE_CONTENT:\n                    $p_filedescr['content'] = $v_value;\n                    break;\n\n                default:\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Unknown parameter '\" . $v_key . \"'\");\n\n                    // ----- Return\n                    return PclZip::errorCode();\n            }\n\n            // ----- Look for mandatory options\n            if ($v_requested_options !== false) {\n                for ($key = reset($v_requested_options); $key = key($v_requested_options); $key = next($v_requested_options)) {\n                    // ----- Look for mandatory option\n                    if ($v_requested_options[$key] == 'mandatory') {\n                        // ----- Look if present\n                        if (!isset($p_file_list[$key])) {\n                            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Missing mandatory parameter \" . PclZipUtilOptionText($key) . \"(\" . $key . \")\");\n\n                            return PclZip::errorCode();\n                        }\n                    }\n                }\n            }\n\n            // end foreach\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privFileDescrExpand()\n    // Description :\n    //   This method look for each item of the list to see if its a file, a folder\n    //   or a string to be added as file. For any other type of files (link, other)\n    //   just ignore the item.\n    //   Then prepare the information that will be stored for that file.\n    //   When its a folder, expand the folder with all the files that are in that\n    //   folder (recursively).\n    // Parameters :\n    // Return Values :\n    //   1 on success.\n    //   0 on failure.\n    // --------------------------------------------------------------------------------\n    public function privFileDescrExpand(&$p_filedescr_list, &$p_options)\n    {\n        $v_result = 1;\n\n        // ----- Create a result list\n        $v_result_list = array();\n\n        // ----- Look each entry\n        for ($i = 0; $i < sizeof($p_filedescr_list); $i++) {\n\n            // ----- Get filedescr\n            $v_descr = $p_filedescr_list[$i];\n\n            // ----- Reduce the filename\n            $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false);\n            $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);\n\n            // ----- Look for real file or folder\n            if (file_exists($v_descr['filename'])) {\n                if (@is_file($v_descr['filename'])) {\n                    $v_descr['type'] = 'file';\n                } elseif (@is_dir($v_descr['filename'])) {\n                    $v_descr['type'] = 'folder';\n                } elseif (@is_link($v_descr['filename'])) {\n                    // skip\n                    continue;\n                } else {\n                    // skip\n                    continue;\n                }\n\n            // ----- Look for string added as file\n            } elseif (isset($v_descr['content'])) {\n                $v_descr['type'] = 'virtual_file';\n\n            // ----- Missing file\n            } else {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"File '\" . $v_descr['filename'] . \"' does not exist\");\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Calculate the stored filename\n            $this->privCalculateStoredFilename($v_descr, $p_options);\n\n            // ----- Add the descriptor in result list\n            $v_result_list[sizeof($v_result_list)] = $v_descr;\n\n            // ----- Look for folder\n            if ($v_descr['type'] == 'folder') {\n                // ----- List of items in folder\n                $v_dirlist_descr = array();\n                $v_dirlist_nb    = 0;\n                if ($v_folder_handler = @opendir($v_descr['filename'])) {\n                    while (($v_item_handler = @readdir($v_folder_handler)) !== false) {\n\n                        // ----- Skip '.' and '..'\n                        if (($v_item_handler == '.') || ($v_item_handler == '..')) {\n                            continue;\n                        }\n\n                        // ----- Compose the full filename\n                        $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'] . '/' . $v_item_handler;\n\n                        // ----- Look for different stored filename\n                        // Because the name of the folder was changed, the name of the\n                        // files/sub-folders also change\n                        if (($v_descr['stored_filename'] != $v_descr['filename']) && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {\n                            if ($v_descr['stored_filename'] != '') {\n                                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'] . '/' . $v_item_handler;\n                            } else {\n                                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler;\n                            }\n                        }\n\n                        $v_dirlist_nb++;\n                    }\n\n                    @closedir($v_folder_handler);\n                } else {\n                    // TBC : unable to open folder in read mode\n                }\n\n                // ----- Expand each element of the list\n                if ($v_dirlist_nb != 0) {\n                    // ----- Expand\n                    if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {\n                        return $v_result;\n                    }\n\n                    // ----- Concat the resulting list\n                    $v_result_list = array_merge($v_result_list, $v_dirlist_descr);\n                } else {\n                }\n\n                // ----- Free local array\n                unset($v_dirlist_descr);\n            }\n        }\n\n        // ----- Get the result list\n        $p_filedescr_list = $v_result_list;\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privCreate()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privCreate($p_filedescr_list, &$p_result_list, &$p_options)\n    {\n        $v_result      = 1;\n        $v_list_detail = array();\n\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Open the file in write mode\n        if (($v_result = $this->privOpenFd('wb')) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Add the list of files\n        $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);\n\n        // ----- Close\n        $this->privCloseFd();\n\n        // ----- Magic quotes trick\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privAdd()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privAdd($p_filedescr_list, &$p_result_list, &$p_options)\n    {\n        $v_result      = 1;\n        $v_list_detail = array();\n\n        // ----- Look if the archive exists or is empty\n        if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) {\n\n            // ----- Do a create\n            $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);\n\n            // ----- Return\n            return $v_result;\n        }\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Open the zip file\n        if (($v_result = $this->privOpenFd('rb')) != 1) {\n            // ----- Magic quotes trick\n            $this->privSwapBackMagicQuotes();\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir = array();\n        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n\n            return $v_result;\n        }\n\n        // ----- Go to beginning of File\n        @rewind($this->zip_fd);\n\n        // ----- Creates a temporay file\n        $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp';\n\n        // ----- Open the temporary file in write mode\n        if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) {\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\'' . $v_zip_temp_name . '\\' in binary write mode');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Copy the files from the archive to the temporary file\n        // TBC : Here I should better append the file and go back to erase the central dir\n        $v_size = $v_central_dir['offset'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = fread($this->zip_fd, $v_read_size);\n            @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Swap the file descriptor\n        // Here is a trick : I swap the temporary fd with the zip fd, in order to use\n        // the following methods on the temporary fil and not the real archive\n        $v_swap        = $this->zip_fd;\n        $this->zip_fd  = $v_zip_temp_fd;\n        $v_zip_temp_fd = $v_swap;\n\n        // ----- Add the files\n        $v_header_list = array();\n        if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) {\n            fclose($v_zip_temp_fd);\n            $this->privCloseFd();\n            @unlink($v_zip_temp_name);\n            $this->privSwapBackMagicQuotes();\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Store the offset of the central dir\n        $v_offset = @ftell($this->zip_fd);\n\n        // ----- Copy the block of file headers from the old archive\n        $v_size = $v_central_dir['size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = @fread($v_zip_temp_fd, $v_read_size);\n            @fwrite($this->zip_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Create the Central Dir files header\n        for ($i = 0, $v_count = 0; $i < sizeof($v_header_list); $i++) {\n            // ----- Create the file header\n            if ($v_header_list[$i]['status'] == 'ok') {\n                if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {\n                    fclose($v_zip_temp_fd);\n                    $this->privCloseFd();\n                    @unlink($v_zip_temp_name);\n                    $this->privSwapBackMagicQuotes();\n\n                    // ----- Return\n                    return $v_result;\n                }\n                $v_count++;\n            }\n\n            // ----- Transform the header to a 'usable' info\n            $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);\n        }\n\n        // ----- Zip file comment\n        $v_comment = $v_central_dir['comment'];\n        if (isset($p_options[PCLZIP_OPT_COMMENT])) {\n            $v_comment = $p_options[PCLZIP_OPT_COMMENT];\n        }\n        if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {\n            $v_comment = $v_comment . $p_options[PCLZIP_OPT_ADD_COMMENT];\n        }\n        if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {\n            $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT] . $v_comment;\n        }\n\n        // ----- Calculate the size of the central header\n        $v_size = @ftell($this->zip_fd) - $v_offset;\n\n        // ----- Create the central dir footer\n        if (($v_result = $this->privWriteCentralHeader($v_count + $v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) {\n            // ----- Reset the file list\n            unset($v_header_list);\n            $this->privSwapBackMagicQuotes();\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Swap back the file descriptor\n        $v_swap        = $this->zip_fd;\n        $this->zip_fd  = $v_zip_temp_fd;\n        $v_zip_temp_fd = $v_swap;\n\n        // ----- Close\n        $this->privCloseFd();\n\n        // ----- Close the temporary file\n        @fclose($v_zip_temp_fd);\n\n        // ----- Magic quotes trick\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Delete the zip file\n        // TBC : I should test the result ...\n        @unlink($this->zipname);\n\n        // ----- Rename the temporary file\n        // TBC : I should test the result ...\n        //@rename($v_zip_temp_name, $this->zipname);\n        PclZipUtilRename($v_zip_temp_name, $this->zipname);\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privOpenFd()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function privOpenFd($p_mode)\n    {\n        $v_result = 1;\n\n        // ----- Look if already open\n        if ($this->zip_fd != 0) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \\'' . $this->zipname . '\\' already open');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Open the zip file\n        if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \\'' . $this->zipname . '\\' in ' . $p_mode . ' mode');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privCloseFd()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function privCloseFd()\n    {\n        $v_result = 1;\n\n        if ($this->zip_fd != 0) {\n            @fclose($this->zip_fd);\n        }\n        $this->zip_fd = 0;\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privAddList()\n    // Description :\n    //   $p_add_dir and $p_remove_dir will give the ability to memorize a path which is\n    //   different from the real path of the file. This is usefull if you want to have PclTar\n    //   running in any directory, and memorize relative path from an other directory.\n    // Parameters :\n    //   $p_list : An array containing the file or directory names to add in the tar\n    //   $p_result_list : list of added files with their properties (specially the status field)\n    //   $p_add_dir : Path to add in the filename path archived\n    //   $p_remove_dir : Path to remove in the filename path archived\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    //  function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options)\n    public function privAddList($p_filedescr_list, &$p_result_list, &$p_options)\n    {\n        $v_result = 1;\n\n        // ----- Add the files\n        $v_header_list = array();\n        if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Store the offset of the central dir\n        $v_offset = @ftell($this->zip_fd);\n\n        // ----- Create the Central Dir files header\n        for ($i = 0, $v_count = 0; $i < sizeof($v_header_list); $i++) {\n            // ----- Create the file header\n            if ($v_header_list[$i]['status'] == 'ok') {\n                if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {\n                    // ----- Return\n                    return $v_result;\n                }\n                $v_count++;\n            }\n\n            // ----- Transform the header to a 'usable' info\n            $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);\n        }\n\n        // ----- Zip file comment\n        $v_comment = '';\n        if (isset($p_options[PCLZIP_OPT_COMMENT])) {\n            $v_comment = $p_options[PCLZIP_OPT_COMMENT];\n        }\n\n        // ----- Calculate the size of the central header\n        $v_size = @ftell($this->zip_fd) - $v_offset;\n\n        // ----- Create the central dir footer\n        if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) {\n            // ----- Reset the file list\n            unset($v_header_list);\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privAddFileList()\n    // Description :\n    // Parameters :\n    //   $p_filedescr_list : An array containing the file description\n    //                      or directory names to add in the zip\n    //   $p_result_list : list of added files with their properties (specially the status field)\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options)\n    {\n        $v_result = 1;\n        $v_header = array();\n\n        // ----- Recuperate the current number of elt in list\n        $v_nb = sizeof($p_result_list);\n\n        // ----- Loop on the files\n        for ($j = 0; ($j < sizeof($p_filedescr_list)) && ($v_result == 1); $j++) {\n            // ----- Format the filename\n            $p_filedescr_list[$j]['filename'] = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);\n\n            // ----- Skip empty file names\n            // TBC : Can this be possible ? not checked in DescrParseAtt ?\n            if ($p_filedescr_list[$j]['filename'] == \"\") {\n                continue;\n            }\n\n            // ----- Check the filename\n            if (($p_filedescr_list[$j]['type'] != 'virtual_file') && (!file_exists($p_filedescr_list[$j]['filename']))) {\n                PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"File '\" . $p_filedescr_list[$j]['filename'] . \"' does not exist\");\n\n                return PclZip::errorCode();\n            }\n\n            // ----- Look if it is a file or a dir with no all path remove option\n            // or a dir with all its path removed\n            //      if (   (is_file($p_filedescr_list[$j]['filename']))\n            //          || (   is_dir($p_filedescr_list[$j]['filename'])\n            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]))) {\n\n                // ----- Add the file\n                $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header, $p_options);\n                if ($v_result != 1) {\n                    return $v_result;\n                }\n\n                // ----- Store the file infos\n                $p_result_list[$v_nb++] = $v_header;\n            }\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privAddFile()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privAddFile($p_filedescr, &$p_header, &$p_options)\n    {\n        $v_result = 1;\n\n        // ----- Working variable\n        $p_filename = $p_filedescr['filename'];\n\n        // TBC : Already done in the fileAtt check ... ?\n        if ($p_filename == \"\") {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid file list parameter (invalid or empty list)\");\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Look for a stored different filename\n        /* TBC : Removed\n        if (isset($p_filedescr['stored_filename'])) {\n        $v_stored_filename = $p_filedescr['stored_filename'];\n        } else {\n        $v_stored_filename = $p_filedescr['stored_filename'];\n        }\n        */\n\n        // ----- Set the file properties\n        clearstatcache();\n        $p_header['version']           = 20;\n        $p_header['version_extracted'] = 10;\n        $p_header['flag']              = 0;\n        $p_header['compression']       = 0;\n        $p_header['crc']               = 0;\n        $p_header['compressed_size']   = 0;\n        $p_header['filename_len']      = strlen($p_filename);\n        $p_header['extra_len']         = 0;\n        $p_header['disk']              = 0;\n        $p_header['internal']          = 0;\n        $p_header['offset']            = 0;\n        $p_header['filename']          = $p_filename;\n        // TBC : Removed    $p_header['stored_filename'] = $v_stored_filename;\n        $p_header['stored_filename']   = $p_filedescr['stored_filename'];\n        $p_header['extra']             = '';\n        $p_header['status']            = 'ok';\n        $p_header['index']             = -1;\n\n        // ----- Look for regular file\n        if ($p_filedescr['type'] == 'file') {\n            $p_header['external'] = 0x00000000;\n            $p_header['size']     = filesize($p_filename);\n\n        // ----- Look for regular folder\n        } elseif ($p_filedescr['type'] == 'folder') {\n            $p_header['external'] = 0x00000010;\n            $p_header['mtime']    = filemtime($p_filename);\n            $p_header['size']     = filesize($p_filename);\n\n        // ----- Look for virtual file\n        } elseif ($p_filedescr['type'] == 'virtual_file') {\n            $p_header['external'] = 0x00000000;\n            $p_header['size']     = strlen($p_filedescr['content']);\n        }\n\n        // ----- Look for filetime\n        if (isset($p_filedescr['mtime'])) {\n            $p_header['mtime'] = $p_filedescr['mtime'];\n        } elseif ($p_filedescr['type'] == 'virtual_file') {\n            $p_header['mtime'] = time();\n        } else {\n            $p_header['mtime'] = filemtime($p_filename);\n        }\n\n        // ------ Look for file comment\n        if (isset($p_filedescr['comment'])) {\n            $p_header['comment_len'] = strlen($p_filedescr['comment']);\n            $p_header['comment']     = $p_filedescr['comment'];\n        } else {\n            $p_header['comment_len'] = 0;\n            $p_header['comment']     = '';\n        }\n\n        // ----- Look for pre-add callback\n        if (isset($p_options[PCLZIP_CB_PRE_ADD])) {\n\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_header, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n            //      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header);\n            if ($v_result == 0) {\n                // ----- Change the file status\n                $p_header['status'] = \"skipped\";\n                $v_result           = 1;\n            }\n\n            // ----- Update the informations\n            // Only some fields can be modified\n            if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {\n                $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);\n            }\n        }\n\n        // ----- Look for empty stored filename\n        if ($p_header['stored_filename'] == \"\") {\n            $p_header['status'] = \"filtered\";\n        }\n\n        // ----- Check the path length\n        if (strlen($p_header['stored_filename']) > 0xFF) {\n            $p_header['status'] = 'filename_too_long';\n        }\n\n        // ----- Look if no error, or file not skipped\n        if ($p_header['status'] == 'ok') {\n\n            // ----- Look for a file\n            if ($p_filedescr['type'] == 'file') {\n                // ----- Look for using temporary file to zip\n                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'])))) {\n                    $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options);\n                    if ($v_result < PCLZIP_ERR_NO_ERROR) {\n                        return $v_result;\n                    }\n\n                // ----- Use \"in memory\" zip algo\n                } else {\n\n                    // ----- Open the source file\n                    if (($v_file = @fopen($p_filename, \"rb\")) == 0) {\n                        PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, \"Unable to open file '$p_filename' in binary read mode\");\n\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Read the file content\n                    $v_content = @fread($v_file, $p_header['size']);\n\n                    // ----- Close the file\n                    @fclose($v_file);\n\n                    // ----- Calculate the CRC\n                    $p_header['crc'] = @crc32($v_content);\n\n                    // ----- Look for no compression\n                    if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {\n                        // ----- Set header parameters\n                        $p_header['compressed_size'] = $p_header['size'];\n                        $p_header['compression']     = 0;\n\n                    // ----- Look for normal compression\n                    } else {\n                        // ----- Compress the content\n                        $v_content = @gzdeflate($v_content);\n\n                        // ----- Set header parameters\n                        $p_header['compressed_size'] = strlen($v_content);\n                        $p_header['compression']     = 8;\n                    }\n\n                    // ----- Call the header generation\n                    if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {\n                        @fclose($v_file);\n\n                        return $v_result;\n                    }\n\n                    // ----- Write the compressed (or not) content\n                    @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);\n\n                }\n\n            // ----- Look for a virtual file (a file from string)\n            } elseif ($p_filedescr['type'] == 'virtual_file') {\n\n                $v_content = $p_filedescr['content'];\n\n                // ----- Calculate the CRC\n                $p_header['crc'] = @crc32($v_content);\n\n                // ----- Look for no compression\n                if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {\n                    // ----- Set header parameters\n                    $p_header['compressed_size'] = $p_header['size'];\n                    $p_header['compression']     = 0;\n\n                // ----- Look for normal compression\n                } else {\n                    // ----- Compress the content\n                    $v_content = @gzdeflate($v_content);\n\n                    // ----- Set header parameters\n                    $p_header['compressed_size'] = strlen($v_content);\n                    $p_header['compression']     = 8;\n                }\n\n                // ----- Call the header generation\n                if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {\n                    @fclose($v_file);\n\n                    return $v_result;\n                }\n\n                // ----- Write the compressed (or not) content\n                @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);\n\n            // ----- Look for a directory\n            } elseif ($p_filedescr['type'] == 'folder') {\n                // ----- Look for directory last '/'\n                if (@substr($p_header['stored_filename'], -1) != '/') {\n                    $p_header['stored_filename'] .= '/';\n                }\n\n                // ----- Set the file properties\n                $p_header['size']     = 0;\n                //$p_header['external'] = 0x41FF0010;   // Value for a folder : to be checked\n                $p_header['external'] = 0x00000010; // Value for a folder : to be checked\n\n                // ----- Call the header generation\n                if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {\n                    return $v_result;\n                }\n            }\n        }\n\n        // ----- Look for post-add callback\n        if (isset($p_options[PCLZIP_CB_POST_ADD])) {\n\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_header, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n            //      eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header);\n            if ($v_result == 0) {\n                // ----- Ignored\n                $v_result = 1;\n            }\n\n            // ----- Update the informations\n            // Nothing can be modified\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privAddFileUsingTempFile()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options)\n    {\n        $v_result = PCLZIP_ERR_NO_ERROR;\n\n        // ----- Working variable\n        $p_filename = $p_filedescr['filename'];\n\n        // ----- Open the source file\n        if (($v_file = @fopen($p_filename, \"rb\")) == 0) {\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, \"Unable to open file '$p_filename' in binary read mode\");\n\n            return PclZip::errorCode();\n        }\n\n        // ----- Creates a compressed temporary file\n        $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.gz';\n        if (($v_file_compressed = @gzopen($v_gzip_temp_name, \"wb\")) == 0) {\n            fclose($v_file);\n            PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \\'' . $v_gzip_temp_name . '\\' in binary write mode');\n\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n        $v_size = filesize($p_filename);\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = @fread($v_file, $v_read_size);\n            //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n            @gzputs($v_file_compressed, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Close the file\n        @fclose($v_file);\n        @gzclose($v_file_compressed);\n\n        // ----- Check the minimum file size\n        if (filesize($v_gzip_temp_name) < 18) {\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \\'' . $v_gzip_temp_name . '\\' has invalid filesize - should be minimum 18 bytes');\n\n            return PclZip::errorCode();\n        }\n\n        // ----- Extract the compressed attributes\n        if (($v_file_compressed = @fopen($v_gzip_temp_name, \"rb\")) == 0) {\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\'' . $v_gzip_temp_name . '\\' in binary read mode');\n\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the gzip file header\n        $v_binary_data = @fread($v_file_compressed, 10);\n        $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data);\n\n        // ----- Check some parameters\n        $v_data_header['os'] = bin2hex($v_data_header['os']);\n\n        // ----- Read the gzip file footer\n        @fseek($v_file_compressed, filesize($v_gzip_temp_name) - 8);\n        $v_binary_data = @fread($v_file_compressed, 8);\n        $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data);\n\n        // ----- Set the attributes\n        $p_header['compression']     = ord($v_data_header['cm']);\n        //$p_header['mtime'] = $v_data_header['mtime'];\n        $p_header['crc']             = $v_data_footer['crc'];\n        $p_header['compressed_size'] = filesize($v_gzip_temp_name) - 18;\n\n        // ----- Close the file\n        @fclose($v_file_compressed);\n\n        // ----- Call the header generation\n        if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {\n            return $v_result;\n        }\n\n        // ----- Add the compressed data\n        if (($v_file_compressed = @fopen($v_gzip_temp_name, \"rb\")) == 0) {\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\'' . $v_gzip_temp_name . '\\' in binary read mode');\n\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n        fseek($v_file_compressed, 10);\n        $v_size = $p_header['compressed_size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = @fread($v_file_compressed, $v_read_size);\n            //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n            @fwrite($this->zip_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Close the file\n        @fclose($v_file_compressed);\n\n        // ----- Unlink the temporary file\n        @unlink($v_gzip_temp_name);\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privCalculateStoredFilename()\n    // Description :\n    //   Based on file descriptor properties and global options, this method\n    //   calculate the filename that will be stored in the archive.\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privCalculateStoredFilename(&$p_filedescr, &$p_options)\n    {\n        $v_result = 1;\n\n        // ----- Working variables\n        $p_filename = $p_filedescr['filename'];\n        if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {\n            $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];\n        } else {\n            $p_add_dir = '';\n        }\n        if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {\n            $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];\n        } else {\n            $p_remove_dir = '';\n        }\n        if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {\n            $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];\n        } else {\n            $p_remove_all_dir = 0;\n        }\n\n        // ----- Look for full name change\n        if (isset($p_filedescr['new_full_name'])) {\n            // ----- Remove drive letter if any\n            $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']);\n\n        // ----- Look for path and/or short name change\n        } else {\n\n            // ----- Look for short name change\n            // Its when we cahnge just the filename but not the path\n            if (isset($p_filedescr['new_short_name'])) {\n                $v_path_info = pathinfo($p_filename);\n                $v_dir       = '';\n                if ($v_path_info['dirname'] != '') {\n                    $v_dir = $v_path_info['dirname'] . '/';\n                }\n                $v_stored_filename = $v_dir . $p_filedescr['new_short_name'];\n            } else {\n                // ----- Calculate the stored filename\n                $v_stored_filename = $p_filename;\n            }\n\n            // ----- Look for all path to remove\n            if ($p_remove_all_dir) {\n                $v_stored_filename = basename($p_filename);\n\n            // ----- Look for partial path remove\n            } elseif ($p_remove_dir != \"\") {\n                if (substr($p_remove_dir, -1) != '/') {\n                    $p_remove_dir .= \"/\";\n                }\n\n                if ((substr($p_filename, 0, 2) == \"./\") || (substr($p_remove_dir, 0, 2) == \"./\")) {\n\n                    if ((substr($p_filename, 0, 2) == \"./\") && (substr($p_remove_dir, 0, 2) != \"./\")) {\n                        $p_remove_dir = \"./\" . $p_remove_dir;\n                    }\n                    if ((substr($p_filename, 0, 2) != \"./\") && (substr($p_remove_dir, 0, 2) == \"./\")) {\n                        $p_remove_dir = substr($p_remove_dir, 2);\n                    }\n                }\n\n                $v_compare = PclZipUtilPathInclusion($p_remove_dir, $v_stored_filename);\n                if ($v_compare > 0) {\n                    if ($v_compare == 2) {\n                        $v_stored_filename = \"\";\n                    } else {\n                        $v_stored_filename = substr($v_stored_filename, strlen($p_remove_dir));\n                    }\n                }\n            }\n\n            // ----- Remove drive letter if any\n            $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename);\n\n            // ----- Look for path to add\n            if ($p_add_dir != \"\") {\n                if (substr($p_add_dir, -1) == \"/\") {\n                    $v_stored_filename = $p_add_dir . $v_stored_filename;\n                } else {\n                    $v_stored_filename = $p_add_dir . \"/\" . $v_stored_filename;\n                }\n            }\n        }\n\n        // ----- Filename (reduce the path of stored name)\n        $v_stored_filename              = PclZipUtilPathReduction($v_stored_filename);\n        $p_filedescr['stored_filename'] = $v_stored_filename;\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privWriteFileHeader()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privWriteFileHeader(&$p_header)\n    {\n        $v_result = 1;\n\n        // ----- Store the offset position of the file\n        $p_header['offset'] = ftell($this->zip_fd);\n\n        // ----- Transform UNIX mtime to DOS format mdate/mtime\n        $v_date  = getdate($p_header['mtime']);\n        $v_mtime = ($v_date['hours'] << 11) + ($v_date['minutes'] << 5) + $v_date['seconds'] / 2;\n        $v_mdate = (($v_date['year'] - 1980) << 9) + ($v_date['mon'] << 5) + $v_date['mday'];\n\n        // ----- Packed data\n        $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']);\n\n        // ----- Write the first 148 bytes of the header in the archive\n        fputs($this->zip_fd, $v_binary_data, 30);\n\n        // ----- Write the variable fields\n        if (strlen($p_header['stored_filename']) != 0) {\n            fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));\n        }\n        if ($p_header['extra_len'] != 0) {\n            fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privWriteCentralFileHeader()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privWriteCentralFileHeader(&$p_header)\n    {\n        $v_result = 1;\n\n        // TBC\n        //for (reset($p_header); $key = key($p_header); next($p_header)) {\n        //}\n\n        // ----- Transform UNIX mtime to DOS format mdate/mtime\n        $v_date  = getdate($p_header['mtime']);\n        $v_mtime = ($v_date['hours'] << 11) + ($v_date['minutes'] << 5) + $v_date['seconds'] / 2;\n        $v_mdate = (($v_date['year'] - 1980) << 9) + ($v_date['mon'] << 5) + $v_date['mday'];\n\n        // ----- Packed data\n        $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']);\n\n        // ----- Write the 42 bytes of the header in the zip file\n        fputs($this->zip_fd, $v_binary_data, 46);\n\n        // ----- Write the variable fields\n        if (strlen($p_header['stored_filename']) != 0) {\n            fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));\n        }\n        if ($p_header['extra_len'] != 0) {\n            fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);\n        }\n        if ($p_header['comment_len'] != 0) {\n            fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privWriteCentralHeader()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment)\n    {\n        $v_result = 1;\n\n        // ----- Packed data\n        $v_binary_data = pack(\"VvvvvVVv\", 0x06054b50, 0, 0, $p_nb_entries, $p_nb_entries, $p_size, $p_offset, strlen($p_comment));\n\n        // ----- Write the 22 bytes of the header in the zip file\n        fputs($this->zip_fd, $v_binary_data, 22);\n\n        // ----- Write the variable fields\n        if (strlen($p_comment) != 0) {\n            fputs($this->zip_fd, $p_comment, strlen($p_comment));\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privList()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privList(&$p_list)\n    {\n        $v_result = 1;\n\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Open the zip file\n        if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) {\n            // ----- Magic quotes trick\n            $this->privSwapBackMagicQuotes();\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \\'' . $this->zipname . '\\' in binary read mode');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir = array();\n        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n            $this->privSwapBackMagicQuotes();\n\n            return $v_result;\n        }\n\n        // ----- Go to beginning of Central Dir\n        @rewind($this->zip_fd);\n        if (@fseek($this->zip_fd, $v_central_dir['offset'])) {\n            $this->privSwapBackMagicQuotes();\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Read each entry\n        for ($i = 0; $i < $v_central_dir['entries']; $i++) {\n            // ----- Read the file header\n            if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) {\n                $this->privSwapBackMagicQuotes();\n\n                return $v_result;\n            }\n            $v_header['index'] = $i;\n\n            // ----- Get the only interesting attributes\n            $this->privConvertHeader2FileInfo($v_header, $p_list[$i]);\n            unset($v_header);\n        }\n\n        // ----- Close the zip file\n        $this->privCloseFd();\n\n        // ----- Magic quotes trick\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privConvertHeader2FileInfo()\n    // Description :\n    //   This function takes the file informations from the central directory\n    //   entries and extract the interesting parameters that will be given back.\n    //   The resulting file infos are set in the array $p_info\n    //     $p_info['filename'] : Filename with full path. Given by user (add),\n    //                           extracted in the filesystem (extract).\n    //     $p_info['stored_filename'] : Stored filename in the archive.\n    //     $p_info['size'] = Size of the file.\n    //     $p_info['compressed_size'] = Compressed size of the file.\n    //     $p_info['mtime'] = Last modification date of the file.\n    //     $p_info['comment'] = Comment associated with the file.\n    //     $p_info['folder'] = true/false : indicates if the entry is a folder or not.\n    //     $p_info['status'] = status of the action on the file.\n    //     $p_info['crc'] = CRC of the file content.\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privConvertHeader2FileInfo($p_header, &$p_info)\n    {\n        $v_result = 1;\n\n        // ----- Get the interesting attributes\n        $v_temp_path               = PclZipUtilPathReduction($p_header['filename']);\n        $p_info['filename']        = $v_temp_path;\n        $v_temp_path               = PclZipUtilPathReduction($p_header['stored_filename']);\n        $p_info['stored_filename'] = $v_temp_path;\n        $p_info['size']            = $p_header['size'];\n        $p_info['compressed_size'] = $p_header['compressed_size'];\n        $p_info['mtime']           = $p_header['mtime'];\n        $p_info['comment']         = $p_header['comment'];\n        $p_info['folder']          = (($p_header['external'] & 0x00000010) == 0x00000010);\n        $p_info['index']           = $p_header['index'];\n        $p_info['status']          = $p_header['status'];\n        $p_info['crc']             = $p_header['crc'];\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privExtractByRule()\n    // Description :\n    //   Extract a file or directory depending of rules (by index, by name, ...)\n    // Parameters :\n    //   $p_file_list : An array where will be placed the properties of each\n    //                  extracted file\n    //   $p_path : Path to add while writing the extracted files\n    //   $p_remove_path : Path to remove (from the file memorized path) while writing the\n    //                    extracted files. If the path does not match the file path,\n    //                    the file is extracted with its memorized path.\n    //                    $p_remove_path does not apply to 'list' mode.\n    //                    $p_path and $p_remove_path are commulative.\n    // Return Values :\n    //   1 on success,0 or less on error (see error code list)\n    // --------------------------------------------------------------------------------\n    public function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)\n    {\n        $v_result = 1;\n\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Check the path\n        if (($p_path == \"\") || ((substr($p_path, 0, 1) != \"/\") && (substr($p_path, 0, 3) != \"../\") && (substr($p_path, 1, 2) != \":/\"))) {\n            $p_path = \"./\" . $p_path;\n        }\n\n        // ----- Reduce the path last (and duplicated) '/'\n        if (($p_path != \"./\") && ($p_path != \"/\")) {\n            // ----- Look for the path end '/'\n            while (substr($p_path, -1) == \"/\") {\n                $p_path = substr($p_path, 0, strlen($p_path) - 1);\n            }\n        }\n\n        // ----- Look for path to remove format (should end by /)\n        if (($p_remove_path != \"\") && (substr($p_remove_path, -1) != '/')) {\n            $p_remove_path .= '/';\n        }\n        $p_remove_path_size = strlen($p_remove_path);\n\n        // ----- Open the zip file\n        if (($v_result = $this->privOpenFd('rb')) != 1) {\n            $this->privSwapBackMagicQuotes();\n\n            return $v_result;\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir = array();\n        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n            // ----- Close the zip file\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n\n            return $v_result;\n        }\n\n        // ----- Start at beginning of Central Dir\n        $v_pos_entry = $v_central_dir['offset'];\n\n        // ----- Read each entry\n        $j_start = 0;\n        for ($i = 0, $v_nb_extracted = 0; $i < $v_central_dir['entries']; $i++) {\n\n            // ----- Read next Central dir entry\n            @rewind($this->zip_fd);\n            if (@fseek($this->zip_fd, $v_pos_entry)) {\n                // ----- Close the zip file\n                $this->privCloseFd();\n                $this->privSwapBackMagicQuotes();\n\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Read the file header\n            $v_header = array();\n            if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) {\n                // ----- Close the zip file\n                $this->privCloseFd();\n                $this->privSwapBackMagicQuotes();\n\n                return $v_result;\n            }\n\n            // ----- Store the index\n            $v_header['index'] = $i;\n\n            // ----- Store the file position\n            $v_pos_entry = ftell($this->zip_fd);\n\n            // ----- Look for the specific extract rules\n            $v_extract = false;\n\n            // ----- Look for extract by name rule\n            if ((isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {\n\n                // ----- Look if the filename is in the list\n                for ($j = 0; ($j < sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {\n\n                    // ----- Look for a directory\n                    if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == \"/\") {\n\n                        // ----- Look if the directory is in the filename path\n                        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])) {\n                            $v_extract = true;\n                        }\n\n                    // ----- Look for a filename\n                    } elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {\n                        $v_extract = true;\n                    }\n                }\n            // ----- Look for extract by ereg rule\n            // ereg() is deprecated with PHP 5.3\n            /*\n            elseif (   (isset($p_options[PCLZIP_OPT_BY_EREG]))\n            && ($p_options[PCLZIP_OPT_BY_EREG] != \"\")) {\n\n            if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) {\n            $v_extract = true;\n            }\n            }\n            */\n\n            // ----- Look for extract by preg rule\n            } elseif ((isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != \"\")) {\n\n                if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {\n                    $v_extract = true;\n                }\n\n            // ----- Look for extract by index rule\n            } elseif ((isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {\n\n                // ----- Look if the index is in the list\n                for ($j = $j_start; ($j < sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {\n\n                    if (($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i <= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {\n                        $v_extract = true;\n                    }\n                    if ($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {\n                        $j_start = $j + 1;\n                    }\n\n                    if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start'] > $i) {\n                        break;\n                    }\n                }\n\n            // ----- Look for no rule, which means extract all the archive\n            } else {\n                $v_extract = true;\n            }\n\n            // ----- Check compression method\n            if (($v_extract) && (($v_header['compression'] != 8) && ($v_header['compression'] != 0))) {\n                $v_header['status'] = 'unsupported_compression';\n\n                // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n                if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) {\n\n                    $this->privSwapBackMagicQuotes();\n\n                    PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, \"Filename '\" . $v_header['stored_filename'] . \"' is \" . \"compressed by an unsupported compression \" . \"method (\" . $v_header['compression'] . \") \");\n\n                    return PclZip::errorCode();\n                }\n            }\n\n            // ----- Check encrypted files\n            if (($v_extract) && (($v_header['flag'] & 1) == 1)) {\n                $v_header['status'] = 'unsupported_encryption';\n\n                // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n                if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) {\n\n                    $this->privSwapBackMagicQuotes();\n\n                    PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, \"Unsupported encryption for \" . \" filename '\" . $v_header['stored_filename'] . \"'\");\n\n                    return PclZip::errorCode();\n                }\n            }\n\n            // ----- Look for real extraction\n            if (($v_extract) && ($v_header['status'] != 'ok')) {\n                $v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++]);\n                if ($v_result != 1) {\n                    $this->privCloseFd();\n                    $this->privSwapBackMagicQuotes();\n\n                    return $v_result;\n                }\n\n                $v_extract = false;\n            }\n\n            // ----- Look for real extraction\n            if ($v_extract) {\n\n                // ----- Go to the file position\n                @rewind($this->zip_fd);\n                if (@fseek($this->zip_fd, $v_header['offset'])) {\n                    // ----- Close the zip file\n                    $this->privCloseFd();\n\n                    $this->privSwapBackMagicQuotes();\n\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n                    // ----- Return\n                    return PclZip::errorCode();\n                }\n\n                // ----- Look for extraction as string\n                if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {\n\n                    $v_string = '';\n\n                    // ----- Extracting the file\n                    $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options);\n                    if ($v_result1 < 1) {\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n\n                        return $v_result1;\n                    }\n\n                    // ----- Get the only interesting attributes\n                    if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) {\n                        // ----- Close the zip file\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n\n                        return $v_result;\n                    }\n\n                    // ----- Set the file content\n                    $p_file_list[$v_nb_extracted]['content'] = $v_string;\n\n                    // ----- Next extracted file\n                    $v_nb_extracted++;\n\n                    // ----- Look for user callback abort\n                    if ($v_result1 == 2) {\n                        break;\n                    }\n\n                // ----- Look for extraction in standard output\n                } elseif ((isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {\n                    // ----- Extracting the file in standard output\n                    $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);\n                    if ($v_result1 < 1) {\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n\n                        return $v_result1;\n                    }\n\n                    // ----- Get the only interesting attributes\n                    if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n\n                        return $v_result;\n                    }\n\n                    // ----- Look for user callback abort\n                    if ($v_result1 == 2) {\n                        break;\n                    }\n\n                // ----- Look for normal extraction\n                } else {\n                    // ----- Extracting the file\n                    $v_result1 = $this->privExtractFile($v_header, $p_path, $p_remove_path, $p_remove_all_path, $p_options);\n                    if ($v_result1 < 1) {\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n\n                        return $v_result1;\n                    }\n\n                    // ----- Get the only interesting attributes\n                    if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {\n                        // ----- Close the zip file\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n\n                        return $v_result;\n                    }\n\n                    // ----- Look for user callback abort\n                    if ($v_result1 == 2) {\n                        break;\n                    }\n                }\n            }\n        }\n\n        // ----- Close the zip file\n        $this->privCloseFd();\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privExtractFile()\n    // Description :\n    // Parameters :\n    // Return Values :\n    //\n    // 1 : ... ?\n    // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback\n    // --------------------------------------------------------------------------------\n    public function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)\n    {\n        $v_result = 1;\n\n        // ----- Read the file header\n        if (($v_result = $this->privReadFileHeader($v_header)) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Check that the file header is coherent with $p_entry info\n        if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {\n            // TBC\n        }\n\n        // ----- Look for all path to remove\n        if ($p_remove_all_path == true) {\n            // ----- Look for folder entry that not need to be extracted\n            if (($p_entry['external'] & 0x00000010) == 0x00000010) {\n\n                $p_entry['status'] = \"filtered\";\n\n                return $v_result;\n            }\n\n            // ----- Get the basename of the path\n            $p_entry['filename'] = basename($p_entry['filename']);\n\n        // ----- Look for path to remove\n        } elseif ($p_remove_path != \"\") {\n            if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) {\n\n                // ----- Change the file status\n                $p_entry['status'] = \"filtered\";\n\n                // ----- Return\n                return $v_result;\n            }\n\n            $p_remove_path_size = strlen($p_remove_path);\n            if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) {\n\n                // ----- Remove the path\n                $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);\n\n            }\n        }\n\n        // Patch for Zip Traversal vulnerability\n        if (strpos($p_entry['stored_filename'], '../') !== false || strpos($p_entry['stored_filename'], '..\\\\') !== false) {\n            $p_entry['stored_filename'] = basename($p_entry['stored_filename']);\n            $p_entry['filename'] = basename($p_entry['stored_filename']);\n        }\n\n        // ----- Add the path\n        if ($p_path != '') {\n            $p_entry['filename'] = $p_path . \"/\" . $p_entry['filename'];\n        }\n\n        // ----- Check a base_dir_restriction\n        if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {\n            $v_inclusion = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], $p_entry['filename']);\n            if ($v_inclusion == 0) {\n\n                PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, \"Filename '\" . $p_entry['filename'] . \"' is \" . \"outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION\");\n\n                return PclZip::errorCode();\n            }\n        }\n\n        // ----- Look for pre-extract callback\n        if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {\n\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n            //      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);\n            if ($v_result == 0) {\n                // ----- Change the file status\n                $p_entry['status'] = \"skipped\";\n                $v_result          = 1;\n            }\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                // ----- This status is internal and will be changed in 'skipped'\n                $p_entry['status'] = \"aborted\";\n                $v_result          = PCLZIP_ERR_USER_ABORTED;\n            }\n\n            // ----- Update the informations\n            // Only some fields can be modified\n            $p_entry['filename'] = $v_local_header['filename'];\n        }\n\n        // ----- Look if extraction should be done\n        if ($p_entry['status'] == 'ok') {\n\n            // ----- Look for specific actions while the file exist\n            if (file_exists($p_entry['filename'])) {\n\n                // ----- Look if file is a directory\n                if (is_dir($p_entry['filename'])) {\n\n                    // ----- Change the file status\n                    $p_entry['status'] = \"already_a_directory\";\n\n                    // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n                    // For historical reason first PclZip implementation does not stop\n                    // when this kind of error occurs.\n                    if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) {\n\n                        PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, \"Filename '\" . $p_entry['filename'] . \"' is \" . \"already used by an existing directory\");\n\n                        return PclZip::errorCode();\n                    }\n\n                // ----- Look if file is write protected\n                } elseif (!is_writeable($p_entry['filename'])) {\n\n                    // ----- Change the file status\n                    $p_entry['status'] = \"write_protected\";\n\n                    // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n                    // For historical reason first PclZip implementation does not stop\n                    // when this kind of error occurs.\n                    if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) {\n\n                        PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, \"Filename '\" . $p_entry['filename'] . \"' exists \" . \"and is write protected\");\n\n                        return PclZip::errorCode();\n                    }\n\n                // ----- Look if the extracted file is older\n                } elseif (filemtime($p_entry['filename']) > $p_entry['mtime']) {\n                    // ----- Change the file status\n                    if ((isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) && ($p_options[PCLZIP_OPT_REPLACE_NEWER] === true)) {\n                    } else {\n                        $p_entry['status'] = \"newer_exist\";\n\n                        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n                        // For historical reason first PclZip implementation does not stop\n                        // when this kind of error occurs.\n                        if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) {\n\n                            PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, \"Newer version of '\" . $p_entry['filename'] . \"' exists \" . \"and option PCLZIP_OPT_REPLACE_NEWER is not selected\");\n\n                            return PclZip::errorCode();\n                        }\n                    }\n                } else {\n                }\n\n            // ----- Check the directory availability and create it if necessary\n            } else {\n                if ((($p_entry['external'] & 0x00000010) == 0x00000010) || (substr($p_entry['filename'], -1) == '/')) {\n                    $v_dir_to_check = $p_entry['filename'];\n                } elseif (!strstr($p_entry['filename'], \"/\")) {\n                    $v_dir_to_check = \"\";\n                } else {\n                    $v_dir_to_check = dirname($p_entry['filename']);\n                }\n\n                if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external'] & 0x00000010) == 0x00000010))) != 1) {\n\n                    // ----- Change the file status\n                    $p_entry['status'] = \"path_creation_fail\";\n\n                    // ----- Return\n                    //return $v_result;\n                    $v_result = 1;\n                }\n            }\n        }\n\n        // ----- Look if extraction should be done\n        if ($p_entry['status'] == 'ok') {\n\n            // ----- Do the extraction (if not a folder)\n            if (!(($p_entry['external'] & 0x00000010) == 0x00000010)) {\n                // ----- Look for not compressed file\n                if ($p_entry['compression'] == 0) {\n\n                    // ----- Opening destination file\n                    if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {\n\n                        // ----- Change the file status\n                        $p_entry['status'] = \"write_error\";\n\n                        // ----- Return\n                        return $v_result;\n                    }\n\n                    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n                    $v_size = $p_entry['compressed_size'];\n                    while ($v_size != 0) {\n                        $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n                        $v_buffer    = @fread($this->zip_fd, $v_read_size);\n                        /* Try to speed up the code\n                        $v_binary_data = pack('a'.$v_read_size, $v_buffer);\n                        @fwrite($v_dest_file, $v_binary_data, $v_read_size);\n                        */\n                        @fwrite($v_dest_file, $v_buffer, $v_read_size);\n                        $v_size -= $v_read_size;\n                    }\n\n                    // ----- Closing the destination file\n                    fclose($v_dest_file);\n\n                    // ----- Change the file mtime\n                    touch($p_entry['filename'], $p_entry['mtime']);\n\n                } else {\n                    // ----- TBC\n                    // Need to be finished\n                    if (($p_entry['flag'] & 1) == 1) {\n                        PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \\'' . $p_entry['filename'] . '\\' is encrypted. Encrypted files are not supported.');\n\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Look for using temporary file to unzip\n                    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'])))) {\n                        $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options);\n                        if ($v_result < PCLZIP_ERR_NO_ERROR) {\n                            return $v_result;\n                        }\n\n                    // ----- Look for extract in memory\n                    } else {\n\n                        // ----- Read the compressed file in a buffer (one shot)\n                        $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n                        // ----- Decompress the file\n                        $v_file_content = @gzinflate($v_buffer);\n                        unset($v_buffer);\n                        if ($v_file_content === false) {\n\n                            // ----- Change the file status\n                            // TBC\n                            $p_entry['status'] = \"error\";\n\n                            return $v_result;\n                        }\n\n                        // ----- Opening destination file\n                        if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {\n\n                            // ----- Change the file status\n                            $p_entry['status'] = \"write_error\";\n\n                            return $v_result;\n                        }\n\n                        // ----- Write the uncompressed data\n                        @fwrite($v_dest_file, $v_file_content, $p_entry['size']);\n                        unset($v_file_content);\n\n                        // ----- Closing the destination file\n                        @fclose($v_dest_file);\n\n                    }\n\n                    // ----- Change the file mtime\n                    @touch($p_entry['filename'], $p_entry['mtime']);\n                }\n\n                // ----- Look for chmod option\n                if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {\n\n                    // ----- Change the mode of the file\n                    @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);\n                }\n\n            }\n        }\n\n        // ----- Change abort status\n        if ($p_entry['status'] == \"aborted\") {\n            $p_entry['status'] = \"skipped\";\n\n        // ----- Look for post-extract callback\n        } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {\n\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n            //      eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                $v_result = PCLZIP_ERR_USER_ABORTED;\n            }\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privExtractFileUsingTempFile()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privExtractFileUsingTempFile(&$p_entry, &$p_options)\n    {\n        $v_result = 1;\n\n        // ----- Creates a temporary file\n        $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.gz';\n        if (($v_dest_file = @fopen($v_gzip_temp_name, \"wb\")) == 0) {\n            fclose($v_file);\n            PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \\'' . $v_gzip_temp_name . '\\' in binary write mode');\n\n            return PclZip::errorCode();\n        }\n\n        // ----- Write gz file format header\n        $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3));\n        @fwrite($v_dest_file, $v_binary_data, 10);\n\n        // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n        $v_size = $p_entry['compressed_size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = @fread($this->zip_fd, $v_read_size);\n            //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n            @fwrite($v_dest_file, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Write gz file format footer\n        $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']);\n        @fwrite($v_dest_file, $v_binary_data, 8);\n\n        // ----- Close the temporary file\n        @fclose($v_dest_file);\n\n        // ----- Opening destination file\n        if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {\n            $p_entry['status'] = \"write_error\";\n\n            return $v_result;\n        }\n\n        // ----- Open the temporary gz file\n        if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) {\n            @fclose($v_dest_file);\n            $p_entry['status'] = \"read_error\";\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\'' . $v_gzip_temp_name . '\\' in binary read mode');\n\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n        $v_size = $p_entry['size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = @gzread($v_src_file, $v_read_size);\n            //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n            @fwrite($v_dest_file, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n        @fclose($v_dest_file);\n        @gzclose($v_src_file);\n\n        // ----- Delete the temporary file\n        @unlink($v_gzip_temp_name);\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privExtractFileInOutput()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privExtractFileInOutput(&$p_entry, &$p_options)\n    {\n        $v_result = 1;\n\n        // ----- Read the file header\n        if (($v_result = $this->privReadFileHeader($v_header)) != 1) {\n            return $v_result;\n        }\n\n        // ----- Check that the file header is coherent with $p_entry info\n        if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {\n            // TBC\n        }\n\n        // ----- Look for pre-extract callback\n        if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {\n\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n            //      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);\n            if ($v_result == 0) {\n                // ----- Change the file status\n                $p_entry['status'] = \"skipped\";\n                $v_result          = 1;\n            }\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                // ----- This status is internal and will be changed in 'skipped'\n                $p_entry['status'] = \"aborted\";\n                $v_result          = PCLZIP_ERR_USER_ABORTED;\n            }\n\n            // ----- Update the informations\n            // Only some fields can be modified\n            $p_entry['filename'] = $v_local_header['filename'];\n        }\n\n        // ----- Trace\n\n        // ----- Look if extraction should be done\n        if ($p_entry['status'] == 'ok') {\n\n            // ----- Do the extraction (if not a folder)\n            if (!(($p_entry['external'] & 0x00000010) == 0x00000010)) {\n                // ----- Look for not compressed file\n                if ($p_entry['compressed_size'] == $p_entry['size']) {\n\n                    // ----- Read the file in a buffer (one shot)\n                    $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n                    // ----- Send the file to the output\n                    echo $v_buffer;\n                    unset($v_buffer);\n                } else {\n\n                    // ----- Read the compressed file in a buffer (one shot)\n                    $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n                    // ----- Decompress the file\n                    $v_file_content = gzinflate($v_buffer);\n                    unset($v_buffer);\n\n                    // ----- Send the file to the output\n                    echo $v_file_content;\n                    unset($v_file_content);\n                }\n            }\n        }\n\n        // ----- Change abort status\n        if ($p_entry['status'] == \"aborted\") {\n            $p_entry['status'] = \"skipped\";\n\n        // ----- Look for post-extract callback\n        } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {\n\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n            //      eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                $v_result = PCLZIP_ERR_USER_ABORTED;\n            }\n        }\n\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privExtractFileAsString()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privExtractFileAsString(&$p_entry, &$p_string, &$p_options)\n    {\n        $v_result = 1;\n\n        // ----- Read the file header\n        $v_header = array();\n        if (($v_result = $this->privReadFileHeader($v_header)) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Check that the file header is coherent with $p_entry info\n        if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {\n            // TBC\n        }\n\n        // ----- Look for pre-extract callback\n        if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {\n\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n            //      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);\n            if ($v_result == 0) {\n                // ----- Change the file status\n                $p_entry['status'] = \"skipped\";\n                $v_result          = 1;\n            }\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                // ----- This status is internal and will be changed in 'skipped'\n                $p_entry['status'] = \"aborted\";\n                $v_result          = PCLZIP_ERR_USER_ABORTED;\n            }\n\n            // ----- Update the informations\n            // Only some fields can be modified\n            $p_entry['filename'] = $v_local_header['filename'];\n        }\n\n        // ----- Look if extraction should be done\n        if ($p_entry['status'] == 'ok') {\n\n            // ----- Do the extraction (if not a folder)\n            if (!(($p_entry['external'] & 0x00000010) == 0x00000010)) {\n                // ----- Look for not compressed file\n                //      if ($p_entry['compressed_size'] == $p_entry['size'])\n                if ($p_entry['compression'] == 0) {\n\n                    // ----- Reading the file\n                    $p_string = @fread($this->zip_fd, $p_entry['compressed_size']);\n                } else {\n\n                    // ----- Reading the file\n                    $v_data = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n                    // ----- Decompress the file\n                    if (($p_string = @gzinflate($v_data)) === false) {\n                        // TBC\n                    }\n                }\n\n                // ----- Trace\n            } else {\n                // TBC : error : can not extract a folder in a string\n            }\n\n        }\n\n        // ----- Change abort status\n        if ($p_entry['status'] == \"aborted\") {\n            $p_entry['status'] = \"skipped\";\n\n        // ----- Look for post-extract callback\n        } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {\n\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Swap the content to header\n            $v_local_header['content'] = $p_string;\n            $p_string                  = '';\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n            //      eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);\n\n            // ----- Swap back the content to header\n            $p_string = $v_local_header['content'];\n            unset($v_local_header['content']);\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                $v_result = PCLZIP_ERR_USER_ABORTED;\n            }\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privReadFileHeader()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privReadFileHeader(&$p_header)\n    {\n        $v_result = 1;\n\n        // ----- Read the 4 bytes signature\n        $v_binary_data = @fread($this->zip_fd, 4);\n        $v_data        = unpack('Vid', $v_binary_data);\n\n        // ----- Check signature\n        if ($v_data['id'] != 0x04034b50) {\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the first 42 bytes of the header\n        $v_binary_data = fread($this->zip_fd, 26);\n\n        // ----- Look for invalid block size\n        if (strlen($v_binary_data) != 26) {\n            $p_header['filename'] = \"\";\n            $p_header['status']   = \"invalid_header\";\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Invalid block size : \" . strlen($v_binary_data));\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Extract the values\n        $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);\n\n        // ----- Get filename\n        $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);\n\n        // ----- Get extra_fields\n        if ($v_data['extra_len'] != 0) {\n            $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);\n        } else {\n            $p_header['extra'] = '';\n        }\n\n        // ----- Extract properties\n        $p_header['version_extracted'] = $v_data['version'];\n        $p_header['compression']       = $v_data['compression'];\n        $p_header['size']              = $v_data['size'];\n        $p_header['compressed_size']   = $v_data['compressed_size'];\n        $p_header['crc']               = $v_data['crc'];\n        $p_header['flag']              = $v_data['flag'];\n        $p_header['filename_len']      = $v_data['filename_len'];\n\n        // ----- Recuperate date in UNIX format\n        $p_header['mdate'] = $v_data['mdate'];\n        $p_header['mtime'] = $v_data['mtime'];\n        if ($p_header['mdate'] && $p_header['mtime']) {\n            // ----- Extract time\n            $v_hour    = ($p_header['mtime'] & 0xF800) >> 11;\n            $v_minute  = ($p_header['mtime'] & 0x07E0) >> 5;\n            $v_seconde = ($p_header['mtime'] & 0x001F) * 2;\n\n            // ----- Extract date\n            $v_year  = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;\n            $v_month = ($p_header['mdate'] & 0x01E0) >> 5;\n            $v_day   = $p_header['mdate'] & 0x001F;\n\n            // ----- Get UNIX date format\n            $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);\n\n        } else {\n            $p_header['mtime'] = time();\n        }\n\n        // TBC\n        //for (reset($v_data); $key = key($v_data); next($v_data)) {\n        //}\n\n        // ----- Set the stored filename\n        $p_header['stored_filename'] = $p_header['filename'];\n\n        // ----- Set the status field\n        $p_header['status'] = \"ok\";\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privReadCentralFileHeader()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privReadCentralFileHeader(&$p_header)\n    {\n        $v_result = 1;\n\n        // ----- Read the 4 bytes signature\n        $v_binary_data = @fread($this->zip_fd, 4);\n        $v_data        = unpack('Vid', $v_binary_data);\n\n        // ----- Check signature\n        if ($v_data['id'] != 0x02014b50) {\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the first 42 bytes of the header\n        $v_binary_data = fread($this->zip_fd, 42);\n\n        // ----- Look for invalid block size\n        if (strlen($v_binary_data) != 42) {\n            $p_header['filename'] = \"\";\n            $p_header['status']   = \"invalid_header\";\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Invalid block size : \" . strlen($v_binary_data));\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Extract the values\n        $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);\n\n        // ----- Get filename\n        if ($p_header['filename_len'] != 0) {\n            $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);\n        } else {\n            $p_header['filename'] = '';\n        }\n\n        // ----- Get extra\n        if ($p_header['extra_len'] != 0) {\n            $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);\n        } else {\n            $p_header['extra'] = '';\n        }\n\n        // ----- Get comment\n        if ($p_header['comment_len'] != 0) {\n            $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);\n        } else {\n            $p_header['comment'] = '';\n        }\n\n        // ----- Extract properties\n\n        // ----- Recuperate date in UNIX format\n        //if ($p_header['mdate'] && $p_header['mtime'])\n        // TBC : bug : this was ignoring time with 0/0/0\n        if (1) {\n            // ----- Extract time\n            $v_hour    = ($p_header['mtime'] & 0xF800) >> 11;\n            $v_minute  = ($p_header['mtime'] & 0x07E0) >> 5;\n            $v_seconde = ($p_header['mtime'] & 0x001F) * 2;\n\n            // ----- Extract date\n            $v_year  = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;\n            $v_month = ($p_header['mdate'] & 0x01E0) >> 5;\n            $v_day   = $p_header['mdate'] & 0x001F;\n\n            // ----- Get UNIX date format\n            $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);\n\n        } else {\n            $p_header['mtime'] = time();\n        }\n\n        // ----- Set the stored filename\n        $p_header['stored_filename'] = $p_header['filename'];\n\n        // ----- Set default status to ok\n        $p_header['status'] = 'ok';\n\n        // ----- Look if it is a directory\n        if (substr($p_header['filename'], -1) == '/') {\n            //$p_header['external'] = 0x41FF0010;\n            $p_header['external'] = 0x00000010;\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privCheckFileHeaders()\n    // Description :\n    // Parameters :\n    // Return Values :\n    //   1 on success,\n    //   0 on error;\n    // --------------------------------------------------------------------------------\n    public function privCheckFileHeaders(&$p_local_header, &$p_central_header)\n    {\n        $v_result = 1;\n\n        // ----- Check the static values\n        // TBC\n        if ($p_local_header['filename'] != $p_central_header['filename']) {\n        }\n        if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) {\n        }\n        if ($p_local_header['flag'] != $p_central_header['flag']) {\n        }\n        if ($p_local_header['compression'] != $p_central_header['compression']) {\n        }\n        if ($p_local_header['mtime'] != $p_central_header['mtime']) {\n        }\n        if ($p_local_header['filename_len'] != $p_central_header['filename_len']) {\n        }\n\n        // ----- Look for flag bit 3\n        if (($p_local_header['flag'] & 8) == 8) {\n            $p_local_header['size']            = $p_central_header['size'];\n            $p_local_header['compressed_size'] = $p_central_header['compressed_size'];\n            $p_local_header['crc']             = $p_central_header['crc'];\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privReadEndCentralDir()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privReadEndCentralDir(&$p_central_dir)\n    {\n        $v_result = 1;\n\n        // ----- Go to the end of the zip file\n        $v_size = filesize($this->zipname);\n        @fseek($this->zip_fd, $v_size);\n        if (@ftell($this->zip_fd) != $v_size) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \\'' . $this->zipname . '\\'');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- First try : look if this is an archive with no commentaries (most of the time)\n        // in this case the end of central dir is at 22 bytes of the file end\n        $v_found = 0;\n        if ($v_size > 26) {\n            @fseek($this->zip_fd, $v_size - 22);\n            if (($v_pos = @ftell($this->zip_fd)) != ($v_size - 22)) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \\'' . $this->zipname . '\\'');\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Read for bytes\n            $v_binary_data = @fread($this->zip_fd, 4);\n            $v_data        = @unpack('Vid', $v_binary_data);\n\n            // ----- Check signature\n            if ($v_data['id'] == 0x06054b50) {\n                $v_found = 1;\n            }\n\n            $v_pos = ftell($this->zip_fd);\n        }\n\n        // ----- Go back to the maximum possible size of the Central Dir End Record\n        if (!$v_found) {\n            $v_maximum_size = 65557; // 0xFFFF + 22;\n            if ($v_maximum_size > $v_size) {\n                $v_maximum_size = $v_size;\n            }\n            @fseek($this->zip_fd, $v_size - $v_maximum_size);\n            if (@ftell($this->zip_fd) != ($v_size - $v_maximum_size)) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \\'' . $this->zipname . '\\'');\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Read byte per byte in order to find the signature\n            $v_pos   = ftell($this->zip_fd);\n            $v_bytes = 0x00000000;\n            while ($v_pos < $v_size) {\n                // ----- Read a byte\n                $v_byte = @fread($this->zip_fd, 1);\n\n                // -----  Add the byte\n                //$v_bytes = ($v_bytes << 8) | Ord($v_byte);\n                // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number\n                // Otherwise on systems where we have 64bit integers the check below for the magic number will fail.\n                $v_bytes = (($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte);\n\n                // ----- Compare the bytes\n                if ($v_bytes == 0x504b0506) {\n                    $v_pos++;\n                    break;\n                }\n\n                $v_pos++;\n            }\n\n            // ----- Look if not found end of central dir\n            if ($v_pos == $v_size) {\n\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Unable to find End of Central Dir Record signature\");\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n        }\n\n        // ----- Read the first 18 bytes of the header\n        $v_binary_data = fread($this->zip_fd, 18);\n\n        // ----- Look for invalid block size\n        if (strlen($v_binary_data) != 18) {\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Invalid End of Central Dir Record size : \" . strlen($v_binary_data));\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Extract the values\n        $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);\n\n        // ----- Check the global size\n        if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {\n\n            // ----- Removed in release 2.2 see readme file\n            // The check of the file size is a little too strict.\n            // Some bugs where found when a zip is encrypted/decrypted with 'crypt'.\n            // While decrypted, zip has training 0 bytes\n            if (0) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'The central dir is not at the end of the archive.' . ' Some trailing bytes exists after the archive.');\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n        }\n\n        // ----- Get comment\n        if ($v_data['comment_size'] != 0) {\n            $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);\n        } else {\n            $p_central_dir['comment'] = '';\n        }\n\n        $p_central_dir['entries']      = $v_data['entries'];\n        $p_central_dir['disk_entries'] = $v_data['disk_entries'];\n        $p_central_dir['offset']       = $v_data['offset'];\n        $p_central_dir['size']         = $v_data['size'];\n        $p_central_dir['disk']         = $v_data['disk'];\n        $p_central_dir['disk_start']   = $v_data['disk_start'];\n\n        // TBC\n        //for (reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) {\n        //}\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privDeleteByRule()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privDeleteByRule(&$p_result_list, &$p_options)\n    {\n        $v_result      = 1;\n        $v_list_detail = array();\n\n        // ----- Open the zip file\n        if (($v_result = $this->privOpenFd('rb')) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir = array();\n        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n            $this->privCloseFd();\n\n            return $v_result;\n        }\n\n        // ----- Go to beginning of File\n        @rewind($this->zip_fd);\n\n        // ----- Scan all the files\n        // ----- Start at beginning of Central Dir\n        $v_pos_entry = $v_central_dir['offset'];\n        @rewind($this->zip_fd);\n        if (@fseek($this->zip_fd, $v_pos_entry)) {\n            // ----- Close the zip file\n            $this->privCloseFd();\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Read each entry\n        $v_header_list = array();\n        $j_start       = 0;\n        for ($i = 0, $v_nb_extracted = 0; $i < $v_central_dir['entries']; $i++) {\n\n            // ----- Read the file header\n            $v_header_list[$v_nb_extracted] = array();\n            if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) {\n                // ----- Close the zip file\n                $this->privCloseFd();\n\n                return $v_result;\n            }\n\n            // ----- Store the index\n            $v_header_list[$v_nb_extracted]['index'] = $i;\n\n            // ----- Look for the specific extract rules\n            $v_found = false;\n\n            // ----- Look for extract by name rule\n            if ((isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {\n\n                // ----- Look if the filename is in the list\n                for ($j = 0; ($j < sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {\n\n                    // ----- Look for a directory\n                    if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == \"/\") {\n\n                        // ----- Look if the directory is in the filename path\n                        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])) {\n                            $v_found = true;\n                        } 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])) {\n                            $v_found = true;\n                        }\n\n                    // ----- Look for a filename\n                    } elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {\n                        $v_found = true;\n                    }\n                }\n\n            // ----- Look for extract by ereg rule\n            // ereg() is deprecated with PHP 5.3\n            /*\n            elseif (   (isset($p_options[PCLZIP_OPT_BY_EREG]))\n            && ($p_options[PCLZIP_OPT_BY_EREG] != \"\")) {\n\n            if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {\n            $v_found = true;\n            }\n            }\n            */\n\n            // ----- Look for extract by preg rule\n            } elseif ((isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != \"\")) {\n\n                if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {\n                    $v_found = true;\n                }\n\n            // ----- Look for extract by index rule\n            } elseif ((isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {\n\n                // ----- Look if the index is in the list\n                for ($j = $j_start; ($j < sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {\n\n                    if (($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i <= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {\n                        $v_found = true;\n                    }\n                    if ($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {\n                        $j_start = $j + 1;\n                    }\n\n                    if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start'] > $i) {\n                        break;\n                    }\n                }\n            } else {\n                $v_found = true;\n            }\n\n            // ----- Look for deletion\n            if ($v_found) {\n                unset($v_header_list[$v_nb_extracted]);\n            } else {\n                $v_nb_extracted++;\n            }\n        }\n\n        // ----- Look if something need to be deleted\n        if ($v_nb_extracted > 0) {\n\n            // ----- Creates a temporay file\n            $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp';\n\n            // ----- Creates a temporary zip archive\n            $v_temp_zip = new PclZip($v_zip_temp_name);\n\n            // ----- Open the temporary zip file in write mode\n            if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {\n                $this->privCloseFd();\n\n                // ----- Return\n                return $v_result;\n            }\n\n            // ----- Look which file need to be kept\n            for ($i = 0; $i < sizeof($v_header_list); $i++) {\n\n                // ----- Calculate the position of the header\n                @rewind($this->zip_fd);\n                if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) {\n                    // ----- Close the zip file\n                    $this->privCloseFd();\n                    $v_temp_zip->privCloseFd();\n                    @unlink($v_zip_temp_name);\n\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n                    // ----- Return\n                    return PclZip::errorCode();\n                }\n\n                // ----- Read the file header\n                $v_local_header = array();\n                if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {\n                    // ----- Close the zip file\n                    $this->privCloseFd();\n                    $v_temp_zip->privCloseFd();\n                    @unlink($v_zip_temp_name);\n\n                    // ----- Return\n                    return $v_result;\n                }\n\n                // ----- Check that local file header is same as central file header\n                if ($this->privCheckFileHeaders($v_local_header, $v_header_list[$i]) != 1) {\n                    // TBC\n                }\n                unset($v_local_header);\n\n                // ----- Write the file header\n                if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {\n                    // ----- Close the zip file\n                    $this->privCloseFd();\n                    $v_temp_zip->privCloseFd();\n                    @unlink($v_zip_temp_name);\n\n                    // ----- Return\n                    return $v_result;\n                }\n\n                // ----- Read/write the data block\n                if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {\n                    // ----- Close the zip file\n                    $this->privCloseFd();\n                    $v_temp_zip->privCloseFd();\n                    @unlink($v_zip_temp_name);\n\n                    // ----- Return\n                    return $v_result;\n                }\n            }\n\n            // ----- Store the offset of the central dir\n            $v_offset = @ftell($v_temp_zip->zip_fd);\n\n            // ----- Re-Create the Central Dir files header\n            for ($i = 0; $i < sizeof($v_header_list); $i++) {\n                // ----- Create the file header\n                if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {\n                    $v_temp_zip->privCloseFd();\n                    $this->privCloseFd();\n                    @unlink($v_zip_temp_name);\n\n                    // ----- Return\n                    return $v_result;\n                }\n\n                // ----- Transform the header to a 'usable' info\n                $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);\n            }\n\n            // ----- Zip file comment\n            $v_comment = '';\n            if (isset($p_options[PCLZIP_OPT_COMMENT])) {\n                $v_comment = $p_options[PCLZIP_OPT_COMMENT];\n            }\n\n            // ----- Calculate the size of the central header\n            $v_size = @ftell($v_temp_zip->zip_fd) - $v_offset;\n\n            // ----- Create the central dir footer\n            if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {\n                // ----- Reset the file list\n                unset($v_header_list);\n                $v_temp_zip->privCloseFd();\n                $this->privCloseFd();\n                @unlink($v_zip_temp_name);\n\n                // ----- Return\n                return $v_result;\n            }\n\n            // ----- Close\n            $v_temp_zip->privCloseFd();\n            $this->privCloseFd();\n\n            // ----- Delete the zip file\n            // TBC : I should test the result ...\n            @unlink($this->zipname);\n\n            // ----- Rename the temporary file\n            // TBC : I should test the result ...\n            //@rename($v_zip_temp_name, $this->zipname);\n            PclZipUtilRename($v_zip_temp_name, $this->zipname);\n\n            // ----- Destroy the temporary archive\n            unset($v_temp_zip);\n\n        // ----- Remove every files : reset the file\n        } elseif ($v_central_dir['entries'] != 0) {\n            $this->privCloseFd();\n\n            if (($v_result = $this->privOpenFd('wb')) != 1) {\n                return $v_result;\n            }\n\n            if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {\n                return $v_result;\n            }\n\n            $this->privCloseFd();\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privDirCheck()\n    // Description :\n    //   Check if a directory exists, if not it creates it and all the parents directory\n    //   which may be useful.\n    // Parameters :\n    //   $p_dir : Directory path to check.\n    // Return Values :\n    //    1 : OK\n    //   -1 : Unable to create directory\n    // --------------------------------------------------------------------------------\n    public function privDirCheck($p_dir, $p_is_dir = false)\n    {\n        $v_result = 1;\n\n        // ----- Remove the final '/'\n        if (($p_is_dir) && (substr($p_dir, -1) == '/')) {\n            $p_dir = substr($p_dir, 0, strlen($p_dir) - 1);\n        }\n\n        // ----- Check the directory availability\n        if ((is_dir($p_dir)) || ($p_dir == \"\")) {\n            return 1;\n        }\n\n        // ----- Extract parent directory\n        $p_parent_dir = dirname($p_dir);\n\n        // ----- Just a check\n        if ($p_parent_dir != $p_dir) {\n            // ----- Look for parent directory\n            if ($p_parent_dir != \"\") {\n                if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) {\n                    return $v_result;\n                }\n            }\n        }\n\n        // ----- Create the directory\n        if (!@mkdir($p_dir, 0777)) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, \"Unable to create directory '$p_dir'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privMerge()\n    // Description :\n    //   If $p_archive_to_add does not exist, the function exit with a success result.\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privMerge(&$p_archive_to_add)\n    {\n        $v_result = 1;\n\n        // ----- Look if the archive_to_add exists\n        if (!is_file($p_archive_to_add->zipname)) {\n\n            // ----- Nothing to merge, so merge is a success\n            $v_result = 1;\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Look if the archive exists\n        if (!is_file($this->zipname)) {\n\n            // ----- Do a duplicate\n            $v_result = $this->privDuplicate($p_archive_to_add->zipname);\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Open the zip file\n        if (($v_result = $this->privOpenFd('rb')) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir = array();\n        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n            $this->privCloseFd();\n\n            return $v_result;\n        }\n\n        // ----- Go to beginning of File\n        @rewind($this->zip_fd);\n\n        // ----- Open the archive_to_add file\n        if (($v_result = $p_archive_to_add->privOpenFd('rb')) != 1) {\n            $this->privCloseFd();\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir_to_add = array();\n        if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) {\n            $this->privCloseFd();\n            $p_archive_to_add->privCloseFd();\n\n            return $v_result;\n        }\n\n        // ----- Go to beginning of File\n        @rewind($p_archive_to_add->zip_fd);\n\n        // ----- Creates a temporay file\n        $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp';\n\n        // ----- Open the temporary file in write mode\n        if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) {\n            $this->privCloseFd();\n            $p_archive_to_add->privCloseFd();\n\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\'' . $v_zip_temp_name . '\\' in binary write mode');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Copy the files from the archive to the temporary file\n        // TBC : Here I should better append the file and go back to erase the central dir\n        $v_size = $v_central_dir['offset'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = fread($this->zip_fd, $v_read_size);\n            @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Copy the files from the archive_to_add into the temporary file\n        $v_size = $v_central_dir_to_add['offset'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = fread($p_archive_to_add->zip_fd, $v_read_size);\n            @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Store the offset of the central dir\n        $v_offset = @ftell($v_zip_temp_fd);\n\n        // ----- Copy the block of file headers from the old archive\n        $v_size = $v_central_dir['size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = @fread($this->zip_fd, $v_read_size);\n            @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Copy the block of file headers from the archive_to_add\n        $v_size = $v_central_dir_to_add['size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = @fread($p_archive_to_add->zip_fd, $v_read_size);\n            @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Merge the file comments\n        $v_comment = $v_central_dir['comment'] . ' ' . $v_central_dir_to_add['comment'];\n\n        // ----- Calculate the size of the (new) central header\n        $v_size = @ftell($v_zip_temp_fd) - $v_offset;\n\n        // ----- Swap the file descriptor\n        // Here is a trick : I swap the temporary fd with the zip fd, in order to use\n        // the following methods on the temporary fil and not the real archive fd\n        $v_swap        = $this->zip_fd;\n        $this->zip_fd  = $v_zip_temp_fd;\n        $v_zip_temp_fd = $v_swap;\n\n        // ----- Create the central dir footer\n        if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries'] + $v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) {\n            $this->privCloseFd();\n            $p_archive_to_add->privCloseFd();\n            @fclose($v_zip_temp_fd);\n            $this->zip_fd = null;\n\n            // ----- Reset the file list\n            unset($v_header_list);\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Swap back the file descriptor\n        $v_swap        = $this->zip_fd;\n        $this->zip_fd  = $v_zip_temp_fd;\n        $v_zip_temp_fd = $v_swap;\n\n        // ----- Close\n        $this->privCloseFd();\n        $p_archive_to_add->privCloseFd();\n\n        // ----- Close the temporary file\n        @fclose($v_zip_temp_fd);\n\n        // ----- Delete the zip file\n        // TBC : I should test the result ...\n        @unlink($this->zipname);\n\n        // ----- Rename the temporary file\n        // TBC : I should test the result ...\n        //@rename($v_zip_temp_name, $this->zipname);\n        PclZipUtilRename($v_zip_temp_name, $this->zipname);\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privDuplicate()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privDuplicate($p_archive_filename)\n    {\n        $v_result = 1;\n\n        // ----- Look if the $p_archive_filename exists\n        if (!is_file($p_archive_filename)) {\n\n            // ----- Nothing to duplicate, so duplicate is a success.\n            $v_result = 1;\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Open the zip file\n        if (($v_result = $this->privOpenFd('wb')) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Open the temporary file in write mode\n        if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) {\n            $this->privCloseFd();\n\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \\'' . $p_archive_filename . '\\' in binary write mode');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Copy the files from the archive to the temporary file\n        // TBC : Here I should better append the file and go back to erase the central dir\n        $v_size = filesize($p_archive_filename);\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = fread($v_zip_temp_fd, $v_read_size);\n            @fwrite($this->zip_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Close\n        $this->privCloseFd();\n\n        // ----- Close the temporary file\n        @fclose($v_zip_temp_fd);\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privErrorLog()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function privErrorLog($p_error_code = 0, $p_error_string = '')\n    {\n        if (PCLZIP_ERROR_EXTERNAL == 1) {\n            PclError($p_error_code, $p_error_string);\n        } else {\n            $this->error_code   = $p_error_code;\n            $this->error_string = $p_error_string;\n        }\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privErrorReset()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function privErrorReset()\n    {\n        if (PCLZIP_ERROR_EXTERNAL == 1) {\n            PclErrorReset();\n        } else {\n            $this->error_code   = 0;\n            $this->error_string = '';\n        }\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privDisableMagicQuotes()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privDisableMagicQuotes()\n    {\n        $v_result = 1;\n\n        // ----- Look if function exists\n        if ((!function_exists(\"get_magic_quotes_runtime\")) || (!function_exists(\"set_magic_quotes_runtime\"))) {\n            return $v_result;\n        }\n\n        // ----- Look if already done\n        if ($this->magic_quotes_status != -1) {\n            return $v_result;\n        }\n\n        // ----- Get and memorize the magic_quote value\n        $this->magic_quotes_status = @get_magic_quotes_runtime();\n\n        // ----- Disable magic_quotes\n        if ($this->magic_quotes_status == 1) {\n            @set_magic_quotes_runtime(0);\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privSwapBackMagicQuotes()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privSwapBackMagicQuotes()\n    {\n        $v_result = 1;\n\n        // ----- Look if function exists\n        if ((!function_exists(\"get_magic_quotes_runtime\")) || (!function_exists(\"set_magic_quotes_runtime\"))) {\n            return $v_result;\n        }\n\n        // ----- Look if something to do\n        if ($this->magic_quotes_status != -1) {\n            return $v_result;\n        }\n\n        // ----- Swap back magic_quotes\n        if ($this->magic_quotes_status == 1) {\n            @set_magic_quotes_runtime($this->magic_quotes_status);\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n}\n\n// End of class\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilPathReduction()\n// Description :\n// Parameters :\n// Return Values :\n// --------------------------------------------------------------------------------\nfunction PclZipUtilPathReduction($p_dir)\n{\n    $v_result = \"\";\n\n    // ----- Look for not empty path\n    if ($p_dir != \"\") {\n        // ----- Explode path by directory names\n        $v_list = explode(\"/\", $p_dir);\n\n        // ----- Study directories from last to first\n        $v_skip = 0;\n        for ($i = sizeof($v_list) - 1; $i >= 0; $i--) {\n            // ----- Look for current path\n            if ($v_list[$i] == \".\") {\n                // ----- Ignore this directory\n                // Should be the first $i=0, but no check is done\n            } elseif ($v_list[$i] == \"..\") {\n                $v_skip++;\n            } elseif ($v_list[$i] == \"\") {\n                // ----- First '/' i.e. root slash\n                if ($i == 0) {\n                    $v_result = \"/\" . $v_result;\n                    if ($v_skip > 0) {\n                        // ----- It is an invalid path, so the path is not modified\n                        // TBC\n                        $v_result = $p_dir;\n                        $v_skip   = 0;\n                    }\n\n                // ----- Last '/' i.e. indicates a directory\n                } elseif ($i == (sizeof($v_list) - 1)) {\n                    $v_result = $v_list[$i];\n\n                // ----- Double '/' inside the path\n                } else {\n                    // ----- Ignore only the double '//' in path,\n                    // but not the first and last '/'\n                }\n            } else {\n                // ----- Look for item to skip\n                if ($v_skip > 0) {\n                    $v_skip--;\n                } else {\n                    $v_result = $v_list[$i] . ($i != (sizeof($v_list) - 1) ? \"/\" . $v_result : \"\");\n                }\n            }\n        }\n\n        // ----- Look for skip\n        if ($v_skip > 0) {\n            while ($v_skip > 0) {\n                $v_result = '../' . $v_result;\n                $v_skip--;\n            }\n        }\n    }\n\n    // ----- Return\n    return $v_result;\n}\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilPathInclusion()\n// Description :\n//   This function indicates if the path $p_path is under the $p_dir tree. Or,\n//   said in an other way, if the file or sub-dir $p_path is inside the dir\n//   $p_dir.\n//   The function indicates also if the path is exactly the same as the dir.\n//   This function supports path with duplicated '/' like '//', but does not\n//   support '.' or '..' statements.\n// Parameters :\n// Return Values :\n//   0 if $p_path is not inside directory $p_dir\n//   1 if $p_path is inside directory $p_dir\n//   2 if $p_path is exactly the same as $p_dir\n// --------------------------------------------------------------------------------\nfunction PclZipUtilPathInclusion($p_dir, $p_path)\n{\n    $v_result = 1;\n\n    // ----- Look for path beginning by ./\n    if (($p_dir == '.') || ((strlen($p_dir) >= 2) && (substr($p_dir, 0, 2) == './'))) {\n        $p_dir = PclZipUtilTranslateWinPath(getcwd(), false) . '/' . substr($p_dir, 1);\n    }\n    if (($p_path == '.') || ((strlen($p_path) >= 2) && (substr($p_path, 0, 2) == './'))) {\n        $p_path = PclZipUtilTranslateWinPath(getcwd(), false) . '/' . substr($p_path, 1);\n    }\n\n    // ----- Explode dir and path by directory separator\n    $v_list_dir       = explode(\"/\", $p_dir);\n    $v_list_dir_size  = sizeof($v_list_dir);\n    $v_list_path      = explode(\"/\", $p_path);\n    $v_list_path_size = sizeof($v_list_path);\n\n    // ----- Study directories paths\n    $i = 0;\n    $j = 0;\n    while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {\n\n        // ----- Look for empty dir (path reduction)\n        if ($v_list_dir[$i] == '') {\n            $i++;\n            continue;\n        }\n        if ($v_list_path[$j] == '') {\n            $j++;\n            continue;\n        }\n\n        // ----- Compare the items\n        if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ($v_list_path[$j] != '')) {\n            $v_result = 0;\n        }\n\n        // ----- Next items\n        $i++;\n        $j++;\n    }\n\n    // ----- Look if everything seems to be the same\n    if ($v_result) {\n        // ----- Skip all the empty items\n        while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) {\n            $j++;\n        }\n        while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) {\n            $i++;\n        }\n\n        if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {\n            // ----- There are exactly the same\n            $v_result = 2;\n        } elseif ($i < $v_list_dir_size) {\n            // ----- The path is shorter than the dir\n            $v_result = 0;\n        }\n    }\n\n    // ----- Return\n    return $v_result;\n}\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilCopyBlock()\n// Description :\n// Parameters :\n//   $p_mode : read/write compression mode\n//             0 : src & dest normal\n//             1 : src gzip, dest normal\n//             2 : src normal, dest gzip\n//             3 : src & dest gzip\n// Return Values :\n// --------------------------------------------------------------------------------\nfunction PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode = 0)\n{\n    $v_result = 1;\n\n    if ($p_mode == 0) {\n        while ($p_size != 0) {\n            $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = @fread($p_src, $v_read_size);\n            @fwrite($p_dest, $v_buffer, $v_read_size);\n            $p_size -= $v_read_size;\n        }\n    } elseif ($p_mode == 1) {\n        while ($p_size != 0) {\n            $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = @gzread($p_src, $v_read_size);\n            @fwrite($p_dest, $v_buffer, $v_read_size);\n            $p_size -= $v_read_size;\n        }\n    } elseif ($p_mode == 2) {\n        while ($p_size != 0) {\n            $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = @fread($p_src, $v_read_size);\n            @gzwrite($p_dest, $v_buffer, $v_read_size);\n            $p_size -= $v_read_size;\n        }\n    } elseif ($p_mode == 3) {\n        while ($p_size != 0) {\n            $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer    = @gzread($p_src, $v_read_size);\n            @gzwrite($p_dest, $v_buffer, $v_read_size);\n            $p_size -= $v_read_size;\n        }\n    }\n\n    // ----- Return\n    return $v_result;\n}\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilRename()\n// Description :\n//   This function tries to do a simple rename() function. If it fails, it\n//   tries to copy the $p_src file in a new $p_dest file and then unlink the\n//   first one.\n// Parameters :\n//   $p_src : Old filename\n//   $p_dest : New filename\n// Return Values :\n//   1 on success, 0 on failure.\n// --------------------------------------------------------------------------------\nfunction PclZipUtilRename($p_src, $p_dest)\n{\n    $v_result = 1;\n\n    // ----- Try to rename the files\n    if (!@rename($p_src, $p_dest)) {\n\n        // ----- Try to copy & unlink the src\n        if (!@copy($p_src, $p_dest)) {\n            $v_result = 0;\n        } elseif (!@unlink($p_src)) {\n            $v_result = 0;\n        }\n    }\n\n    // ----- Return\n    return $v_result;\n}\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilOptionText()\n// Description :\n//   Translate option value in text. Mainly for debug purpose.\n// Parameters :\n//   $p_option : the option value.\n// Return Values :\n//   The option text value.\n// --------------------------------------------------------------------------------\nfunction PclZipUtilOptionText($p_option)\n{\n\n    $v_list = get_defined_constants();\n    for (reset($v_list); $v_key = key($v_list); next($v_list)) {\n        $v_prefix = substr($v_key, 0, 10);\n        if ((($v_prefix == 'PCLZIP_OPT') || ($v_prefix == 'PCLZIP_CB_') || ($v_prefix == 'PCLZIP_ATT')) && ($v_list[$v_key] == $p_option)) {\n            return $v_key;\n        }\n    }\n\n    $v_result = 'Unknown';\n\n    return $v_result;\n}\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilTranslateWinPath()\n// Description :\n//   Translate windows path by replacing '\\' by '/' and optionally removing\n//   drive letter.\n// Parameters :\n//   $p_path : path to translate.\n//   $p_remove_disk_letter : true | false\n// Return Values :\n//   The path translated.\n// --------------------------------------------------------------------------------\nfunction PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter = true)\n{\n    if (stristr(php_uname(), 'windows')) {\n        // ----- Look for potential disk letter\n        if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {\n            $p_path = substr($p_path, $v_position + 1);\n        }\n        // ----- Change potential windows directory separator\n        if ((strpos($p_path, '\\\\') > 0) || (substr($p_path, 0, 1) == '\\\\')) {\n            $p_path = strtr($p_path, '\\\\', '/');\n        }\n    }\n\n    return $p_path;\n}\n// --------------------------------------------------------------------------------\n"
  },
  {
    "path": "modules/UserCenter/common/head.php",
    "content": "<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit;?>\n<?php\nob_clean();\n$seo_description = '';\n$keywords = '';\n$seo_description = Helper::options()->description;\n  if($this->is('single') && $this->fields->seo_dec !== ''){\n            $seo_description = $this->fields->seo_dec;\n    } \n  if($this->is('category') && $this->getDescription() !== NULL){\n            $seo_description = $this->getDescription();\n    } \nif(Bsoptions('keywords_hide') == true){\n$keywords = '&keywords=0';    \n}\nif(empty(Bsoptions('IframeProtect')) || Bsoptions('IframeProtect') !== '1'){\nswitch(Bsoptions('IframeProtect')){\n    case '2':\n    header('X-Frame-Options:SAMEORIGIN');\n    break;\n    case '3':\n    header('X-Frame-Options:DENY');  \n    break;\n}\n}\n?>\n<!DOCTYPE html>\n<html lang=\"zh-CN\" data-theme=\"light\"<?php if (Bsoptions('Mournmode') == true): ?> class=\"gray\"<?php endif; ?>>\n    <head>\n    <meta name=\"referrer\" content=\"unsafe-url\">\n    <meta charset=\"UTF-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge, chrome=1\">\n    <?php if(is_https()):?>\n    <meta http-equiv=\"Content-Security-Policy\" content=\"upgrade-insecure-requests\">\n    <?php endif; ?>\n    <meta name=\"renderer\" content=\"webkit\">\n <?php if (Bsoptions('DNSYJX') == true): ?>\n    <meta http-equiv=\"x-dns-prefetch-control\" content=\"on\">\n    <?php foreach(Bsoptions('DNSYJX_AR') as $dnsyjx): ?>\n    <?php if($dnsyjx['DNSADDRESS_Preconnect'] == true):?>\n    <link rel=\"preconnect\" href=\"<?php echo $dnsyjx['DNSADDRESS'] ?>\" <?php if($dnsyjx['DNSADDRESS_Crossorign'] == true):?>crossorign<?php endif; ?>>\n    <?php endif; ?>\n<link rel=\"dns-prefetch\" href=\"<?php echo $dnsyjx['DNSADDRESS'] ?>\">\n    <?php endforeach; ?>\n<?php endif; ?>\n<?php if (Bsoptions('DNSYJX') == '' || Bsoptions('DNSYJX') == false): ?>\n<meta http-equiv=\"x-dns-prefetch-control\" content=\"off\">\n<?php endif; ?>\n <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\" />\n <?php if(Bsoptions('favicon') !== ''): ?>\n <link rel=\"shortcut icon\" href=\"<?php echo Bsoptions('favicon') ?>\" />\n <?php endif; ?>\n\n <title>用户中心 - <?php echo $this->options->title;?></title>\n    <meta name=\"description\" content=\"用户中心 - <?php echo $this->options->title;?>\" />\n    <meta property=\"og:title\" content=\"用户中心 - <?php echo $this->options->title;?>\" />\n    <meta property=\"og:description\" content=\"用户中心 - <?php echo $this->options->title;?>\" />\n    <meta property=\"og:site_name\" content=\"<?php $this->options->title(); ?>\" />\n    <meta property=\"og:type\" content=\"<?php if($this->is('post') || $this->is('page')) echo 'article'; else echo 'website'; ?>\" />\n    <meta property=\"og:url\" content=\"<?php $this->permalink(); ?>\" />\n    <meta property=\"article:published_time\" content=\"<?php echo date('c', $this->created); ?>\" />\n    <meta property=\"article:modified_time\" content=\"<?php echo date('c', $this->modified); ?>\" />\n    <?php $this->header('commentReply=1&description='.$keywords.'&pingback=0&xmlrpc=0&wlw=0&generator=&template=&atom='); ?>\n<script src=\"<?php AssetsDir();?>assets/js/jquery.min.js\" type=\"application/javascript\"></script>\n<link href=\"<?php AssetsDir();?>assets/css/bearsimple.min.css?v=<?php echo themeVersion(); ?>\" rel=\"stylesheet\">\n<link href=\"<?php AssetsDir();?>assets/vendors/fomantic-ui/semantic.min.css?v=2\" rel=\"stylesheet\">\n<link href=\"<?php AssetsDir();?>assets/css/modules/global_custom.min.css?v=<?php echo themeVersion(); ?>\" rel=\"stylesheet\">\n<link rel=\"preload\" href=\"//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/font-awesome/5.15.4/css/all.min.css?ver=5.15.4\" as=\"style\" onload=\"this.rel='stylesheet'\" crossorigin>\n<link rel=\"preload\" href=\"//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/font-awesome/5.15.4/css/v4-shims.min.css?ver=5.15.4\" as=\"style\" onload=\"this.rel='stylesheet'\" crossorigin>\n<link rel=\"preload\" href=\"https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@200;300;400;500;600;700;900&display=swap\" as=\"style\" onload=\"this.rel='stylesheet'\" crossorigin>\n<link rel=\"preload\" href=\"<?php AssetsDir();?>assets/css/lxgw/style.css\" as=\"style\" onload=\"this.rel='stylesheet'\" crossorigin>\n<link href=\"<?php AssetsDir();?>assets/vendors/usercenter/usercenter.min.css?v=<?php echo themeVersion(); ?>\" rel=\"stylesheet\">\n<script src='<?php AssetsDir();?>assets/vendors/usercenter/usercenter.min.js?v=3'></script>\n<script src=\"<?php AssetsDir();?>assets/js/toastr.min.js\"></script>\n<?php bs_style(); ?>\n<?php echo Bsoptions('CustomizationCode'); ?>\n<?php if((Bsoptions('menu_style') !== \"3\") && Bsoptions('menu_tem') == \"2\" || Bsoptions('menu_tem') == \"\"):?>\n<link href=\"<?php AssetsDir();?>assets/vendors/menu/menu.min.css?v=2\" rel=\"stylesheet\" />\n<?php endif;?>\n<link href=\"<?php AssetsDir();?>assets/vendors/fancybox/fancybox.min.css?v=3\" rel=\"stylesheet\">\n<?php if(Bsoptions('Popup') == true) :?>\n<link href=\"<?php AssetsDir();?>assets/vendors/bs-announcement/bs-announcement.min.css?v=1\" rel=\"stylesheet\" type=\"text/css\">\n<?php endif; ?>\n<?php if(Bsoptions('Slidersss') == true) :?>\n<link href=\"<?php AssetsDir();?>assets/vendors/slider/bearslider.min.css?v=1\" rel=\"stylesheet\" type=\"text/css\">\n<?php endif; ?>\n<link href=\"<?php AssetsDir2();?>assets/vendors/bs-toc/bs-toc.min.css\" rel=\"stylesheet\" type=\"text/css\">\n<link href=\"<?php AssetsDir2();?>assets/vendors/bs-toc/bs-toc2.min.css\" rel=\"stylesheet\" type=\"text/css\">\n  <?php if (Bsoptions('Translate') == \"11\"): ?>\n  <script src=\"<?php AssetsDir();?>assets/vendors/translate/translate.js\"></script>\n  <?php endif; ?>\n<link href=\"<?php AssetsDir();?>assets/vendors/sweetalert2/sweetalert2.min.css\" type=\"text/css\" rel=\"stylesheet\" />\n\n<link rel=\"stylesheet\" href=\"<?php AssetsDir();?>assets/vendors/bs-audio/audio.css\">\n<link href=\"<?php AssetsDir();?>assets/vendors/bs-emoji/bs-emoji.css?v=<?php echo themeVersion(); ?>\" rel=\"stylesheet\" type=\"text/css\">\n <?php if(Bsoptions('AIService') == true && Bsoptions('AIService_Key') !== ''): ?> \n<link rel=\"stylesheet\" href=\"<?php AssetsDir();?>assets/vendors/aiTool/ai.min.css\">\n<?php endif;?>\n<script>\n<?php if(Bsoptions('MathJax') == true):?>\n    window.Mathjaxv3 = \"open\";\n    <?php else:?>\n    window.Mathjaxv3 = \"close\";\n    <?php endif; ?>\n    <?php if(Bsoptions('Cache') == true && (Bsoptions('Cache_choose') == 'memcached' || Bsoptions('Cache_choose') == 'redis') && Bsoptions('enable_gcache') == true):?>\n    window.GlobalCache = \"on\";\n    <?php endif; ?>\n    window.Defaultfont = \"<?php echo Bsoptions('articleFontDefault') ?>\";\n    window['setting'] = {\n        import: \"<?php AssetsDir();?>\",\n    \timport2 : \"<?php AssetsDir2();?>\",\n    \tsiteUrl : \"<?php $this->options ->siteUrl(); ?>\",\n    \t<?php if(Bsoptions('Darkmode') == true) :?>\n\t\tdarkmode: \"true\",\n\t\tdarkmodetype: \"<?php if(Bsoptions('Darkmode_type') !== '') :?><?php echo implode(',',Bsoptions('Darkmode_type'));?><?php else:?>null<?php endif;?>\",\n\t\tlogo_type:\"<?php echo Bsoptions('header_choose') ?>\",\n\t\tdarkmode_logo:\"<?php echo Bsoptions('imagelogo_dark') ?>\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Lazyload') == true) :?>\n\t\tLazyload: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Mermaid') == true) :?>\n\t\tMermaid: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Mournmode') == true) :?>\n\t\tMournmode: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('ClockModule') == true) :?>\n\t\tClockModule: \"true\",\n\t\t<?php endif; ?>\n<?php if(Bsoptions('Read_Process') == true) :?>\n\t\treadprocess: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Readmode') == true) :?>\n\t\treadmode: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Pjax') == '1') :?>\n\t\tpjax:\"<?php echo Bsoptions('Pjax'); ?>\",\n\t\t<?php else:?>\n\t\tpjax:\"2\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Emoji') == true) :?>\n        owo: \"true\",\n\t<?php endif; ?>\n\t    islogin:\"<?php echo $this->user->hasLogin(); ?>\",\n        commentsRequireMail: \"<?php echo Helper::options()->commentsRequireMail; ?>\",\n        commentsRequireURL: \"<?php echo Helper::options()->commentsRequireURL; ?>\",\n\t    verify_type:\"<?php echo Bsoptions('VerifyChoose'); ?>\",\n\t<?php if(Bsoptions('VerifyChoose') == '2') :?>\n        vid: \"<?php echo Bsoptions('vid'); ?>\",\n\t<?php endif; ?>\n\t<?php if(Bsoptions('VerifyChoose') == '2-1') :?>\n        dx_appid: \"<?php echo Bsoptions('dx_appId'); ?>\",\n        dx_apiserver: \"<?php echo Bsoptions('dx_domain'); ?>\",\n\t<?php endif; ?>\n\t<?php if(Bsoptions('VerifyChoose') == '2-2') :?>\n        turnstile_sitekey: \"<?php echo Bsoptions('turnstile_key'); ?>\",\n        turnstile_theme: \"<?php echo Bsoptions('turnstile_theme'); ?>\",\n\t<?php endif; ?>\n\t\t<?php if(Bsoptions('VerifyChoose') == '2-3') :?>\n        geetest_id: \"<?php echo Bsoptions('geeid'); ?>\",\n\t<?php endif; ?>\n\t\tsearch:\"<?php if(!empty(Bsoptions('Search')[0]&& is_array(Bsoptions('Search')))){echo count(Bsoptions('Search'));}else{echo 0;}; ?>\",\n\t\t<?php if(!empty(Bsoptions('Search')[0]) && @in_array('header',Bsoptions('Search'))) :?>\n\t\theader_search: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(!empty(Bsoptions('Search')[0]) && @in_array('phone',Bsoptions('Search'))) :?>\n\t\tphone_search: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(!empty(Bsoptions('Search')[0]) && @in_array('sidebar',Bsoptions('Search'))) :?>\n\t\tsidebar_search: \"true\",\n\t\t<?php endif; ?>\n<?php if(Bsoptions('Slidersss') == '1' && Bsoptions('SliderIndexs') == '1' || Bsoptions('SliderOthers') == '1') :?>\n\t\tslider: \"true\",\n\t\t<?php endif; ?>\n\t\tmenu_style: \"2\",\n\t\t<?php if(Bsoptions('Like') == true): ?>\n\t\tLike: \"true\",\n\t\tLikenum: \"<?php echo agreeNum($this->cid)['recording']; ?>\",\n\t\tgetPostLikeFile:\"<?php echo getPostLikeFile();?>\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Comment_like') == true): ?>\n\t\tCommentLike: \"true\",\n\t\tgetCommentLikeFile:\"<?php echo getCommentLikeFile();?>\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('hcsticky') == '1') :?>\n\t\tsticky: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Lightbox') == true) :?>\n\t\timagebox: \"true\",\n\t\t<?php endif; ?>\n\t\t<?php if(Bsoptions('Watermark') == true) :?>\n\t\tWatermark: \"true\",\n\t\tWatermarkType:\"<?php echo Bsoptions('WatermarkType');?>\",\n\t\t<?php if(Bsoptions('WatermarkType') == '1'||empty(Bsoptions('WatermarkType'))) :?>\n        Watermark_textBg:\"<?php echo Bsoptions('waterMarkTextBackground');?>\",\n        Watermark_textColor:\"<?php if(empty(Bsoptions('waterMarkTextColor'))) :?>white<?php else:?><?php echo Bsoptions('waterMarkTextColor');?><?php endif; ?>\",\n        Watermark_text: \"<?php if(empty(Bsoptions('waterMarkName'))) :?><?php $this->options->title();?><?php else:?><?php echo Bsoptions('waterMarkName');?><?php endif; ?>\",\n        Watermark_textWidth: <?php if(empty(Bsoptions('waterMarkKd'))) :?>130<?php else:?><?php echo Bsoptions('waterMarkKd');?><?php endif; ?>,\n        Watermark_textSize: <?php if(empty(Bsoptions('waterMarkTextSize'))) :?>12<?php else:?><?php echo Bsoptions('waterMarkTextSize');?><?php endif; ?>,\n    <?php endif; ?>\n    <?php if(Bsoptions('WatermarkType') == '2') :?>\n        Watermark_path:\"<?php echo Bsoptions('waterMarkName');?>\",\n    <?php endif; ?>\n        Watermark_gravity: \"<?php if(empty(Bsoptions('waterMarkLocation'))) :?>c<?php else:?><?php echo Bsoptions('waterMarkLocation');?><?php endif; ?>\",\n        Watermark_opacity: <?php if(empty(Bsoptions('waterMarkOpacity'))) :?>1<?php else:?><?php echo Bsoptions('waterMarkOpacity');?><?php endif; ?>,\n        Watermark_margin: <?php if(empty(Bsoptions('waterMarkMargin'))) :?>12<?php else:?><?php echo Bsoptions('waterMarkMargin');?><?php endif; ?>,\n        waterMarkOutput: \"<?php echo Bsoptions('waterMarkOutput');?>\",\n    <?php if(!empty(Bsoptions('waterMarkOutput')) && Bsoptions('waterMarkOutput') !== 'null') :?>\n        Watermark_outputType: \"<?php echo Bsoptions('waterMarkOutput');?>\",\n    <?php endif; ?>\n\t<?php endif; ?>\n\t<?php if(Bsoptions('Popup') == true) :?>\n\t    Popup: \"true\",\n\t    PopupTitle: \"<?php if(empty(Bsoptions('PopupTitle'))){ echo '公告栏';}else{echo Bsoptions('PopupTitle');}; ?>\",\n        PopupTitleClose: <?php if(Bsoptions('PopupTitleClose') == 1){ echo 'true';}else{echo 'false';}; ?>,\n        PopupClose: <?php if(Bsoptions('PopupClose') == 1){ echo 'true';}else{echo 'false';}; ?>,\n        PopupAutoHide: <?php if(Bsoptions('PopupAutoHide') == '0'){ echo 0;}elseif(Bsoptions('PopupAutoHide') == '1'){echo \"'\".'auto'.\"'\";}else{if(empty(Bsoptions('PopupAutoHideSecond'))){echo 10;}else{echo Bsoptions('PopupAutoHideSecond');}}; ?>,\n        PopupAutoClose: <?php if(Bsoptions('PopupAutoClose') == '0'){ echo 0;}elseif(Bsoptions('PopupAutoClose') == '1'){echo \"'\".'auto'.\"'\";}else{if(empty(Bsoptions('PopupAutoCloseSecond'))){echo 10;}else{echo Bsoptions('PopupAutoCloseSecond');}}; ?>,\n        PopupWidth: <?php if(empty(Bsoptions('PopupWidth'))){ echo 300;}elseif(Bsoptions('PopupWidth') == '0'){echo \"'\".'auto'.\"'\";}else{echo Bsoptions('PopupWidth');}; ?>, \n        PopupHeight: <?php if(Bsoptions('PopupHeight') == null || Bsoptions('PopupHeight') == '0'){ echo \"'\".'auto'.\"'\";}else{echo Bsoptions('PopupHeight');}; ?>,\n        PopupSpeed: <?php if(empty(Bsoptions('PopupSpeed'))){ echo 10;}else{echo Bsoptions('PopupSpeed');}; ?>,\n        PopupEffect: '<?php if(empty(Bsoptions('PopupEffect'))){ echo 'fading';}else{echo Bsoptions('PopupEffect');}; ?>',\n\t<?php endif; ?>\n\t<?php if(Bsoptions('Top') == true) :?>\n\t    Top : \"true\",\n\t<?php endif; ?>\n\t<?php if(Bsoptions('infinite_scroll') == true): ?>\n\t    infinite_scroll:'true',\n\t<?php else: ?>\n\t    infinite_scroll:'false',\n\t<?php endif; ?>\n<?php if(Bsoptions('Login_hidden') == true): ?> \n        Login_hidden:'true',\n        loginAction:'<?php $this->options->loginAction();?>',\n        registerOpen:'<?php $this->options->allowRegister(); ?>',\n        registerAction:'<?php $this->options->registerAction(); ?>',\n        registerAllow:'<?php echo Bsoptions('UserCenterRegister'); ?>',\n        login_other:\"<?php if(Bsoptions('Login_Other') !== '') :?><?php echo implode(',',Bsoptions('Login_Other'));?><?php else:?>null<?php endif; ?>\",\n    <?php endif; ?>\n    <?php if(Bsoptions('Share') == true): ?>\n        Share:'true',\n    <?php if(!empty(Bsoptions('Shares')[0]) && @in_array('wechat',Bsoptions('Shares'))) :?>\n        Sharewechat:'true',\n    <?php endif; ?>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('Translate'))): ?>\n        Translate:'<?php echo Bsoptions('Translate');?>',\n        TranslateLanguage:'<?php if(Bsoptions('TranslateLanguage') == '1') :?>2<?php else: ?>1<?php endif; ?>',\n    <?php endif; ?>\n    AIService: '<?php echo Bsoptions('AIService');?>',\n    <?php if(Bsoptions('AIService') == true && Bsoptions('AIService_Key') !== ''): ?>\n       ai : {\n        AIService_Key: '<?php echo Bsoptions('AIService_Key');?>',\n        AIService_Name: '<?php if(Bsoptions('AIService_Name') !== '') echo Bsoptions('AIService_Name'); else echo \"BearAI\";?>',\n        AIService_Introduce: '<?php if(Bsoptions('AIService_Introduce') !== '') echo Bsoptions('AIService_Introduce'); else echo \"我是文章辅助AI，点击下方的按钮，让我生成本文摘要。\";?>',\n        AIService_Version: '<?php if(Bsoptions('AIService_Version') !== '') echo Bsoptions('AIService_Version'); else echo \"BearAI\";?>',\n        AIService_Auto: '<?php if(Bsoptions('AIService_Auto') == true) echo 1; else echo 0;?>',\n        AIService_Selector: '#post-content #bearsimple-images',\n        <?php if(Bsoptions('AIService_Blacklist') !== '' || Bsoptions('AIService_Blacklist_Page') !== ''): ?>\n        AIService_Blacklist:'<?php echo getAiTools();?>'\n        <?php endif;?>\n       },\n    <?php endif;?>\n        tips : {\n          articlePwdAfterEnterSuccess_Tip : '<?php echo empty(Bsoptions('globalTips')['articlePwdAfterEnterSuccess_Tip'])? '您已成功验证文章密码，页面将在3秒后刷新~' : Bsoptions('globalTips')['articlePwdAfterEnterSuccess_Tip'];?>',\n          articlePwdAfterEnterFail_Tip : '<?php echo empty(Bsoptions('globalTips')['articlePwdAfterEnterFail_Tip'])? '您输入的文章密码有误，请重新输入~' : Bsoptions('globalTips')['articlePwdAfterEnterFail_Tip'];?>',\n          articleAgreeSuccess_Tip : '<?php echo empty(Bsoptions('globalTips')['articleAgreeSuccess_Tip'])? 'Yeah~您已成功点赞本文章!' : Bsoptions('globalTips')['articleAgreeSuccess_Tip'];?>',\n          articleAgreeFail1_Tip : '<?php echo empty(Bsoptions('globalTips')['articleAgreeFail1_Tip'])? '啊哦，您已经点赞过惹~' : Bsoptions('globalTips')['articleAgreeFail1_Tip'];?>',\n          articleAgreeFail2_Tip : '<?php echo empty(Bsoptions('globalTips')['articleAgreeFail2_Tip'])? '网络出现堵塞，请稍后重试~' : Bsoptions('globalTips')['articleAgreeFail2_Tip'];?>',\n          commentSuccess_Tip : '<?php echo empty(Bsoptions('globalTips')['commentSuccess_Tip'])? '您已评论成功，将自动刷新~' : Bsoptions('globalTips')['commentSuccess_Tip'];?>',\n          commentFail_Tip : '<?php echo empty(Bsoptions('globalTips')['commentFail_Tip'])? '请手动刷新页面后再尝试操作~' : Bsoptions('globalTips')['commentFail_Tip'];?>',\n          commentAgreeSuccess_Tip : '<?php echo empty(Bsoptions('globalTips')['commentAgreeSuccess_Tip'])? 'Yeah~您已成功点赞!' : Bsoptions('globalTips')['commentAgreeSuccess_Tip'];?>',\n          commentAgreeFail1_Tip : '<?php echo empty(Bsoptions('globalTips')['commentAgreeFail1_Tip'])? '啊哦，您已经点赞过惹~' : Bsoptions('globalTips')['commentAgreeFail1_Tip'];?>',\n          commentAgreeFail2_Tip : '<?php echo empty(Bsoptions('globalTips')['commentAgreeFail2_Tip'])? '网络出现堵塞，请稍后重试~' : Bsoptions('globalTips')['commentAgreeFail2_Tip'];?>',\n        }\n     };\n\n</script>\n<script src=\"<?php AssetsDir();?>assets/js/modules/darkmode.js\"></script>\n </head>\n <body <?php if(Bsoptions('CopyProtect') == true) :?>oncontextmenu='return false' ondragstart='return false' onselectstart ='return false' onselect='document.selection.empty()' oncopy='document.selection.empty()' onbeforecopy='return false'<?php endif; ?> <?php if (Bsoptions('DNSYJX') == true): ?>data-instant-allow-external-links<?php endif;?>>\n     <?php if(Bsoptions('Read_Process') == true) :?>\n \n<div class=\"read_progress\">\n    <div class=\"read_progress_inner\"></div>\n</div>\n\n<?php endif; ?>\n\n     <div id=\"pjax\">\n<?php if(Bsoptions('Pjax') == true) :?>\n<?php $this->header('commentReply=1&description=0&keywords=0&generator=0&template=0&pingback=0&xmlrpc=0&wlw=0&rss2=0&rss1=0&antiSpam=0&atom'); ?>\n     <?php endif; ?>\n     <div class=\"body_container\" id=\"body_container\">\n         \n         <div id=\"header\">\n             <div class=\"site-name\">\n<?php if(!empty(Bsoptions('Search')[0]) && @in_array('header',Bsoptions('Search'))) :?>   \n        <form name=\"pcsearch\" role=\"search\" method=\"get\" id=\"searchform1\">\n <div class=\"bearmargin\" style=\"float:right;\"><div class=\"ui category search\"><div class=\"ui large icon input pc\">\n      <input class=\"prompt\" id=\"pcsearch\" type=\"text\" name=\"s\" placeholder=\"输入关键词实时搜索\">\n      <i class=\"search link icon\"></i>\n</div></div></div>\n</form> \n<?php endif; ?>\n                 <?php if(Bsoptions('header_choose') == 'image') :?>\n    <a id=\"logo\" href=\"<?php $this->options->siteUrl(); ?>\"><img id=\"sitelogo\" width=\"250\" height=\"70\" src=\"<?php echo Bsoptions('imagelogo') ?>\"></a>\n        \t    <p class=\"description\"></p>\n        \t    <?php else :?>\n        \t     <a id=\"logo\" href=\"<?php $this->options->siteUrl(); ?>\"><?php echo Bsoptions('textlogo_text') ?>\t     </a>\n        \t     <?php if(!empty(Bsoptions('textlogo_dec'))) :?>\n        \t    <p class=\"description\"><?php echo Bsoptions('textlogo_dec'); ?></p>\n        \t     <?php endif; ?>\n        \t     \n      <?php endif; ?>\n        \n        \t     \n        \t    </div>\n        \t    <?php if(!empty(Bsoptions('Search')[0]) && @in_array('phone',Bsoptions('Search'))) :?> \n<form name=\"phonesearch\" role=\"search\" method=\"get\" id=\"searchformbyphone\">\n <div style=\"text-align:center\">\n<div class=\"ui category search\">\n<div class=\"ui icon input phone\">\n      <input class=\"prompt\" id=\"phonesearch\" type=\"text\" name=\"s\" placeholder=\"输入关键词实时搜索\">\n      <i class=\"search link icon\"></i>\n</div>\n</div></div>\n</form>\n<?php endif; ?>\n\n\n  </div>\n\n    \n    <?php if(Bsoptions('menu_style') !== \"3\"): ?>\n<div class=\"navbar_e\">\n<?php if(Bsoptions('menu_tem') == \"1\"):?>\n<ul class=\"menu\">\n    <li><a href=\"<?php $this->options->siteUrl(); ?>\"<?php if($this->is('index')): ?> class=\"current\"<?php endif; ?>>首页</a></li>\n      <?php if(Bsoptions('CategoryMenu') == null || Bsoptions('CategoryMenu') == true): ?>\n    <li>\n      <a  <?php if($this->is('category')): ?> class=\"current\"<?php endif; ?>>分类 <i class=\"angle double right icon\"></i></a>\n      <ul>\n          <?php $this->widget('Widget_Metas_Category_List')->to($categorys); ?>\n          <?php while($categorys->next()): ?>\n\n<?php if ($categorys->levels === 0): ?>\n\n<?php $children = $categorys->getAllChildren($categorys->mid); ?>\n\n<?php if (empty($children)) { ?>\n        <li><a href=\"<?php $categorys->permalink(); ?>\" title=\"<?php $categorys->name(); ?>\" <?php if($this->is('category',$categorys->slug)): ?> class=\"current\"<?php endif; ?>><?php $categorys->name(); ?></a></li>\n      <?php }  else { ?>\n         <li><a href=\"<?php $categorys->permalink(); ?>\" <?php if($this->is('category',$categorys->slug)): ?> class=\"current\"<?php endif; ?>><?php $categorys->name(); ?> <i class=\"angle double right icon\"></i></a>\n\n          <ul>\n               <?php foreach ($children as $mid) { ?>\n           <?php $child = $categorys->getCategory($mid); ?>\n\n                <li><a href=\"<?php echo $child['permalink'] ?>\" title=\"<?php echo $child['name']; ?>\" <?php if($this->is('category',$child['slug'])): ?> class=\"current\"<?php endif; ?>><?php echo $child['name']; ?></a></li>\n                <?php } ?>\n          </ul>\n        </li>\n          <?php } ?>\n            <?php endif; ?><?php endwhile; ?>\n      </ul>\n    </li>\n    <?php endif; ?>\n    \n   \n\n\n<?php if(Bsoptions('PageMenu') !== \"3\"): ?>\n<?php $this->widget('Widget_Contents_Page_List')->to($pages); ?>\n<?php if($pages->have()): ?>\n<?php if(Bsoptions('PageMenu') == null || Bsoptions('PageMenu') == \"1\"): ?>\n        <li><a<?php if($this->is('page')): ?> class=\"current\"<?php endif; ?>>页面 <i class=\"angle double right icon\"></i></a>\n          <ul>\n                    <?php while($pages->next()): ?>\n            <li><a href=\"<?php $pages->permalink(); ?>\" <?php if($this->is('page',$pages->slug)): ?> class=\"current\"<?php endif; ?> title=\"<?php $pages->name(); ?>\"><?php $pages->title(); ?></a></li>\n            <?php endwhile; ?>\n            </ul>\n        </li>\n        <?php else : ?>\n                    <?php while($pages->next()): ?>\n            <li><a href=\"<?php $pages->permalink(); ?>\"<?php if($this->is('page',$pages->slug)): ?> class=\"current\"<?php endif; ?> title=\"<?php $pages->name(); ?>\"><?php $pages->title(); ?></a></li>\n         <?php endwhile; ?>\n         <?php endif; ?>\n<?php endif; ?>\n<?php endif; ?>\n        <?php if(is_array(Bsoptions('Menu'))):?>\n  <?php foreach (Bsoptions('Menu') as $item): \n    $menuText = $item['Menu_Text'];\n    $needLogin = !empty($item['Menu_LoginShow']);\n    if (empty(trim($menuText['url'])) && empty(trim($menuText['text']))) {\n        continue;\n    }\n    $url = !empty(trim($menuText['url'])) ? htmlspecialchars(trim($menuText['url'])) : 'javascript:;';\n    $text = !empty(trim($menuText['text'])) ? htmlspecialchars(trim($menuText['text'])) : '未命名导航';\n?>\n<li class=\"<?= $needLogin ? 'need-login' : '' ?>\" \n    <?= $needLogin ? 'style=\"display:none\"' : '' ?>>\n    <a href=\"<?= $url ?>\" \n       title=\"<?= $text ?>\"\n       <?= ($menuText['target'] === '_blank') ? 'target=\"_blank\"' : '' ?>>\n       <?= $text ?>\n    </a>\n</li>\n<?php endforeach; ?>\n<?php endif;?>\n        \n<?php if(Bsoptions('Login_hidden') == true): ?>\n<li id=\"bs-login\" style=\"display:none\"><a><?php _e('登录'); ?></a></li>\n<li id=\"bs-islogin\" style=\"display:none\"></li>\n<li id=\"bs-islogin2\" style=\"display:none\"></li>\n<?php endif; ?>\n  </ul>\n  <?php endif; ?>\n \n <?php if(Bsoptions('menu_tem') == \"2\" || Bsoptions('menu_tem') == \"\"):?>\n    <nav id=\"bearnavbar\" class=\"sm-navbar <?php if(Bsoptions('menu_NewtemSticky') == true):?>sm-navbar--sticky-top <?php endif;?>sm-navbar--offcanvas-<?php if(Bsoptions('menu_NewtemToggle') == ''):?>left<?php else:?><?php echo Bsoptions('menu_NewtemToggle');?><?php endif;?>\">\n\n<span></span>\n  <span class=\"sm-toggler-state\" id=\"sm-toggler-state-1\"></span>\n  <div class=\"sm-toggler\">\n    <a class=\"sm-toggler-anchor sm-toggler-anchor--show\" href=\"#sm-toggler-state-1\" role=\"button\" aria-label=\"Open\">\n      <span class=\"sm-toggler-icon sm-toggler-icon--show\"></span>\n    </a>\n    <a class=\"sm-toggler-anchor sm-toggler-anchor--hide\" href=\"#\" role=\"button\" aria-label=\"Close\">\n      <span class=\"sm-toggler-icon sm-toggler-icon--hide\"></span>\n    </a>\n  </div>\n\n  <a class=\"sm-offcanvas-overlay\" href=\"#\" aria-hidden=\"true\" tabindex=\"-1\"></a>\n\n  <div class=\"sm-offcanvas\">\n\n    <div class=\"sm-hide-large\" style=\"display: flex; align-items: center; justify-content: space-between\" aria-hidden=\"true\">\n      <h1 class=\"sm-brand\">导航</h1>\n      <div class=\"sm-toggler\">\n        <a class=\"sm-toggler-anchor sm-toggler-anchor--hide\" href=\"#\" role=\"button\" tabindex=\"-1\">\n          <span class=\"sm-toggler-icon sm-toggler-icon--hide\"></span>\n        </a>\n      </div>\n    </div>\n\n    <ul class=\"sm-nav\">\n      <li class=\"sm-nav-item\"><a class=\"sm-nav-link<?php if($this->is('index')):?> current<?php endif;?>\" href=\"<?php $this->options->siteUrl(); ?>\">首页</a></li>\n      <?php if(Bsoptions('CategoryMenu') == null || Bsoptions('CategoryMenu') == true): ?>\n      <?php $this->widget('Widget_Metas_Category_List')->to($categorys); ?>\n      <li class=\"sm-nav-item\">\n          <a class=\"sm-nav-link sm-sub-toggler<?php if($this->is('category')): ?> current<?php endif;?>\">分类</a>\n    \n        <ul class=\"sm-sub\">\n                  <?php while($categorys->next()): ?>\n\n<?php if ($categorys->levels === 0): ?>\n\n<?php $children = $categorys->getAllChildren($categorys->mid); ?>\n\n<?php if (empty($children)) { ?>\n          <li class=\"sm-sub-item\"><a class=\"sm-sub-link<?php if($this->is('category',$categorys->slug)): ?> current<?php endif;?>\" href=\"<?php $categorys->permalink(); ?>\"><?php $categorys->name(); ?></a></li>\n          <?php }  else { ?>\n          <li class=\"sm-sub-item\">\n            <a class=\"sm-sub-link sm-sub-link--split<?php if($this->is('category',$categorys->slug)): ?> current<?php endif;?>\" href=\"<?php $categorys->permalink(); ?>\"><?php $categorys->name(); ?></a\n            ><button class=\"sm-sub-link sm-sub-link--split sm-sub-toggler\" aria-label=\"Toggle\"></button>\n            <ul class=\"sm-sub\">\n                <?php foreach ($children as $mid) { ?>\n           <?php $child = $categorys->getCategory($mid); ?>\n              <li class=\"sm-sub-item\"><a class=\"sm-sub-link<?php if($this->is('category',$child['slug'])): ?> current<?php endif;?>\" href=\"<?php echo $child['permalink'] ?>\"><?php echo $child['name']; ?></a></li>\n              <?php } ?>\n              \n              \n            </ul>\n          </li>\n          <?php } ?>\n          <?php endif; ?><?php endwhile; ?>\n         \n                      \n         \n         \n        </ul>\n      </li>\n <?php endif; ?>\n        \n        <?php if(Bsoptions('PageMenu') !== \"3\"): ?>\n        <?php $this->widget('Widget_Contents_Page_List')->to($pages); ?>\n        <?php if($pages->have()): ?>\n<?php if(Bsoptions('PageMenu') == null || Bsoptions('PageMenu') == \"1\"): ?>\n<li class=\"sm-nav-item\">\n        <a class=\"sm-nav-link sm-sub-toggler<?php if($this->is('page')): ?> current<?php endif; ?>\">页面</a>\n        <ul class=\"sm-sub\">\n            <?php while($pages->next()): ?>\n          <li class=\"sm-sub-item\"><a class=\"sm-sub-link<?php if($this->is('page',$pages->slug)): ?> current<?php endif; ?>\" href=\"<?php $pages->permalink(); ?>\"><?php $pages->title(); ?></a></li>\n          <?php endwhile;?>\n          </ul>\n</li>\n\n<?php else:?>\n<?php while($pages->next()): ?>\n<li class=\"sm-nav-item\"><a class=\"sm-nav-link<?php if($this->is('page',$pages->slug)): ?> current<?php endif; ?>\" href=\"<?php $pages->permalink(); ?>\"><?php $pages->title(); ?></a></li>\n<?php endwhile;?>\n<?php endif;?>\n  <?php endif;?> \n  <?php endif;?> \n  \n  <?php if(is_array(Bsoptions('Menu'))):?>\n  <?php foreach (Bsoptions('Menu') as $item): \n    $menuText = $item['Menu_Text'];\n    $needLogin = !empty($item['Menu_LoginShow']);\n    if (empty(trim($menuText['url'])) && empty(trim($menuText['text']))) {\n        continue;\n    }\n    $url = !empty(trim($menuText['url'])) ? htmlspecialchars(trim($menuText['url'])) : 'javascript:;';\n    $text = !empty(trim($menuText['text'])) ? htmlspecialchars(trim($menuText['text'])) : '未命名导航';\n?>\n<li class=\"sm-nav-item<?= $needLogin ? ' need-login' : '' ?>\" \n    <?= $needLogin ? 'style=\"display:none\"' : '' ?>>\n    <a class=\"sm-nav-link\" href=\"<?= $url ?>\" \n       title=\"<?= $text ?>\"\n       <?= ($menuText['target'] === '_blank') ? 'target=\"_blank\"' : '' ?>>\n       <?= $text ?>\n    </a>\n</li>\n<?php endforeach; ?>\n<?php endif;?>\n\n<?php if(Bsoptions('Login_hidden') == true): ?>\n<li class=\"sm-nav-item\" id=\"bs-login\" style=\"display:none\"><a class=\"sm-nav-link\"><?php _e('登录'); ?></a></li>\n<li class=\"sm-nav-item\" id=\"bs-islogin\" style=\"display:none\"></li>\n<li class=\"sm-nav-item\" id=\"bs-islogin2\" style=\"display:none\"></li>\n<?php endif; ?>\n\n\n    </ul>\n  </div>\n</nav>\n<?php endif; ?>\n\n</div>\n<?php endif; ?>\n<div class=\"sticky\" id=\"sticky\">"
  },
  {
    "path": "modules/UserCenter/user.php",
    "content": "<?php\n/**\n * \n * 用户中心\n * \n**/\n$options= Helper::options();\nheader(\"HTTP/1.1 200 OK\");\n    header('Access-Control-Allow-Origin:*');\n    header(\"Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Accept\");\n $this->need('modules/UserCenter/common/head.php');\n  ?>\n  <link rel=\"stylesheet\" href=\"https://staticfile.typecho.co.uk/fancybox/fancybox.min.css\">\n  <link href=\"https://staticfile.typecho.co.uk/froala/css/froala_editor.pkgd.min.css\" rel=\"stylesheet\" type=\"text/css\" />\n\n<div class=\"pure-g\" id=\"layout\">\n          <div class=\"pure-u-1 pure-u-md-4-4\">\n        \n                <div class=\"content_container\">\n  <style>\n      #submit-bar{\n          z-index: 999;\n      }\n      .comments-list .comment-box{margin-left:0;}\n      .comments-list .comment-box:before,.comments-list .comment-box:after{border-width:0}\n  </style>\n                    <script>\n                    document.addEventListener(\"DOMContentLoaded\", function() {\n                        var session_current = sessionStorage.getItem(\"bearui_config_current\");\n\t    if(session_current == 'bearui_info'){\n\t    $(\"#submit-btn\").show();\n\t    }\n\t    else{\n\t    $(\"#submit-btn\").hide();\n\t    }\n\t    if(session_current == 'bearui_tougao'){\n\t    $(\"#submit-btn-tougao\").show();\n\t    }\n\t    else{\n\t    $(\"#submit-btn-tougao\").hide();  \n\t    }\n\t    if(session_current == 'bearui_says'){\n\t    $(\"#submit-btn-says\").show();\n\t    }\n\t    else{\n\t    $(\"#submit-btn-says\").hide();  \n\t    }\n\t    if(session_current !== 'bearui_tougao' && session_current !== 'bearui_info'&& session_current !== 'bearui_says'){\n\t        $(\"#submit-bar\").hide();\n\t    }\n\t    else{\n\t       $(\"#submit-bar\").show(); \n\t    }\n                    \n$(document).on(\"click\",\".tabs li\",function(){\n\t    var session_current = sessionStorage.getItem(\"bearui_config_current\");\n\t    if(session_current == 'bearui_info'){\n\t    $(\"#submit-btn\").show();\n\t    }\n\t    else{\n\t    $(\"#submit-btn\").hide(); \n\t    }\n\t    if(session_current == 'bearui_tougao'){\n\t    $(\"#submit-btn-tougao\").show();\n\t    }\n\t    else{\n\t    $(\"#submit-btn-tougao\").hide();  \n\t    }\n\t    if(session_current == 'bearui_says'){\n\t    $(\"#submit-btn-says\").show();\n\t    }\n\t    else{\n\t    $(\"#submit-btn-says\").hide();  \n\t    }\n\t    if(session_current !== 'bearui_tougao' && session_current !== 'bearui_info'&& session_current !== 'bearui_says'){\n\t        $(\"#submit-bar\").hide();\n\t    }\n\t    else{\n\t       $(\"#submit-bar\").show(); \n\t    }\n\n\t});\n});\n\t</script>\n<div class=\"bearui_config\">\n        <div>\n            <div class=\"bearui_config__aside\">\n                <div class=\"logo\">用户中心</div>\n                <ul class=\"tabs\">\n                    <li class=\"item\" data-current=\"bearui_notice\"><i class=\"thumbtack icon\"></i>  用户首页</li>\n                    <li class=\"item\" data-current=\"bearui_info\"><i class=\"file alternate outline icon\"></i> 资料信息</li>\n                    <?php if(($this->user->group !== 'subscriber' && $this->user->submission == '1' && Bsoptions('UserCenter_tougaoOpen') == true) || $this->user->group == 'administrator'):?>\n                    <li class=\"item\" data-current=\"bearui_tougao\"><i class=\"pencil alternate icon\"></i> 我要投稿</li>\n                    <?php endif; ?>\n                    <li class=\"item\" data-current=\"bearui_says\" id=\"uisays\"><i class=\"heart icon\"></i> 我的动态</li>\n                    <li class=\"item\" data-current=\"bearui_gaojian\" id=\"gaojian_list\"><i class=\"edit icon\"></i> 稿件列表</li>\n                    <li class=\"item\" data-current=\"bearui_tongzhi\"><i class=\"bullhorn icon\"></i> 我的通知</li>\n                    <?php if($this->user->group == 'administrator' || $this->user->group == 'editor'):?> <li class=\"item\"><div hrefs=\"<?php $this->options->adminUrl();?>\" target=\"_blank\"><i class=\"cog icon\"></i> 管理后台</div></li><?php endif; ?>\n                    <li class=\"item\" id=\"signout\"><i class=\"sign out alternate icon\"></i> 退出登录</li>\n                </ul>\n            </div>\n        </div>\n        <div class=\"bearui_config__notice\">\n                     \n<?php if(Bsoptions('UserCenter_tips') !== ''):?>\n         <div class=\"ui large info message\">\n <?php echo Bsoptions('UserCenter_tips'); ?>\n</div>\n<?php endif;?>\n\n<style>\n.welcome-header {\n  display: flex;\n  align-items: flex-start;\n  margin-bottom: 20px;\n}\n\n.welcome-header i.icon {\n  font-size: 2.2rem;\n  margin-right: 15px;\n  color: #3b82f6;\n}\n\n.header-content h3 {\n  font-size: 1.5rem;\n  margin: 0 0 8px 0;\n  color: #1e293b;\n}\n\n.today-dates {\n  color: #64748b;\n  font-weight: 500;\n}\n.user-stats-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(360px, 1fr));\n  gap: 18px;\n  margin-bottom: 20px;\n}\n\n.stat-card {\n  background: #f8fafc;\n  border-radius: 12px;\n  padding: 18px;\n  display: flex;\n  align-items: center;\n  transition: transform 0.3s ease, box-shadow 0.3s ease;\n}\n\n.stat-card:hover {\n  transform: translateY(-5px);\n  box-shadow: 0 6px 18px rgba(37, 99, 235, 0.1);\n}\n\n.stat-icon {\n  width: 50px;\n  height: 50px;\n  border-radius: 12px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-right: 15px;\n  color: white;\n}\n\n.stat-icon i.icon {\n  margin: 0;\n  font-size: 1.8rem;\n}\n.blue-bg { background: #3b82f6; }\n.teal-bg { background: #14b8a6; }\n.purple-bg { background: #8b5cf6; }\n.orange-bg { background: #f59e0b; }\n.green-bg { background: #10b981; }\n\n.stat-content {\n  flex: 1;\n}\n\n.stat-value {\n  font-size: 1.4rem;\n  font-weight: 700;\n  color: #1e293b;\n  margin-bottom: 4px;\n}\n\n.stat-label {\n  font-size: 0.9rem;\n  color: #64748b;\n  letter-spacing: 0.5px;\n}\n\n.stat-link {\n  color: #3b82f6;\n  text-decoration: none;\n  transition: all 0.2s ease;\n  display: block;\n}\n\n.stat-link:hover {\n  color: #2563eb;\n  text-decoration: underline;\n}\n\n.coin-unit {\n  font-size: 0.9rem;\n  color: #94a3b8;\n}\n.sign-card {\n  background: rgba(16, 185, 129, 0.05);\n  border: 1px dashed rgba(16, 185, 129, 0.3);\n}\n.encouragement {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding-top: 15px;\n  color: #3b82f6;\n  font-weight: 500;\n  font-size: 1.1rem;\n  letter-spacing: 0.5px;\n  border-top: 1px solid #e2e8f0;\n}\n\n.encouragement i.icon {\n  margin-right: 8px;\n}\n</style>\n<div class=\"welcome-card\">\n  <div class=\"welcome-header\">\n    <i class=\"calendar outline icon\"></i>\n    <div class=\"header-content\">\n      <h3>欢迎来到 <?php $options->title();?> 用户中心</h3>\n      <span class=\"today-dates\">今天是<?php monweek(); ?></span>\n    </div>\n  </div>\n\n  <div class=\"user-stats-grid\">\n    <div class=\"stat-card\">\n      <div class=\"stat-icon blue-bg\">\n        <i class=\"file alternate outline icon\"></i>\n      </div>\n      <div class=\"stat-content\">\n        <div class=\"stat-value\"><?php echo allpostnum($this->user->uid); ?></div>\n        <div class=\"stat-label\">投稿文章数</div>\n      </div>\n    </div>\n\n    <div class=\"stat-card\">\n      <div class=\"stat-icon teal-bg\">\n        <i class=\"user circle icon\"></i>\n      </div>\n      <div class=\"stat-content\">\n        <div class=\"stat-value\">\n          <a href=\"<?php echo Helper::options()->siteUrl().'index.php/author/'.$this->user->uid; ?>\" \n             target=\"_blank\" class=\"stat-link\">\n            查看主页\n          </a>\n        </div>\n        <div class=\"stat-label\">个人主页</div>\n      </div>\n    </div>\n\n    <div class=\"stat-card\">\n      <div class=\"stat-icon purple-bg\">\n        <i class=\"coins icon\"></i>\n      </div>\n      <div class=\"stat-content\">\n        <div class=\"stat-value\">\n          <?php echo $this->user->coins; ?>\n          <?php if(Bsoptions('UserCenter_coin_dw') !== ''):?>\n            <span class=\"coin-unit\"><?php echo Bsoptions('UserCenter_coin_dw'); ?></span>\n          <?php endif;?>\n        </div>\n        <div class=\"stat-label\">\n          <?php if(Bsoptions('UserCenter_coin_name') !== ''):?>\n            <?php echo Bsoptions('UserCenter_coin_name'); ?>\n          <?php else:?>积分<?php endif;?>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"stat-card\">\n      <div class=\"stat-icon orange-bg\">\n        <i class=\"crown icon\"></i>\n      </div>\n      <div class=\"stat-content\">\n        <div class=\"stat-value\">\n          <?php if(user_tier($this->user->coins) == ''):?>\n            暂无等级\n          <?php else:?>\n            <?php echo user_tier($this->user->coins); ?>\n          <?php endif;?>\n        </div>\n        <div class=\"stat-label\">您的等级</div>\n      </div>\n    </div>\n\n    <?php if(Bsoptions('UserCenter_sign') == true):?>\n    <div class=\"stat-card sign-card\">\n      <div class=\"stat-icon green-bg\">\n        <i class=\"calendar check icon\"></i>\n      </div>\n      <div class=\"stat-content\">\n        <div class=\"stat-value\"><?php echo user_sign($this->user->uid); ?></div>\n        <div class=\"stat-label\">每日签到</div>\n      </div>\n    </div>\n    <?php endif;?>\n  </div>\n\n  <div class=\"encouragement\">\n    <i class=\"star icon\"></i>\n    <span>继续加油吧~</span>\n  </div>\n</div>\n\n\n\n\n     \n       </div>\n\n\n\n    <div id=\"user-form\">\n<ul class=\"bearui_content bearui_info\">\n<li>\n<label class=\"typecho-label\">\n账号</label>\n<input id=\"Username\" name=\"Username\" type=\"text\" class=\"text\" value=\"<?php echo $this->user->name; ?>\" disabled/>\n<p class=\"description\">\n*账号不允许更改</p>\n</li>\n</ul>\n<ul class=\"bearui_content bearui_info\">\n<li>\n<label class=\"typecho-label\">\n昵称</label>\n<input id=\"screenName\" name=\"screenName\" type=\"text\" class=\"text\" value=\"<?php echo $this->user->screenName; ?>\" />\n<p class=\"description\">\n*该项为必填项，请填入您的个性昵称</p>\n</li>\n</ul>\n<ul class=\"bearui_content bearui_info\">\n<li>\n<label class=\"typecho-label\">\n您的个人主页地址</label>\n<input id=\"userurl\" name=\"url\" type=\"text\" class=\"text\" value=\"<?php echo $this->user->url; ?>\" />\n<p class=\"description\">\n*该项为必填项，请填入您的个人主页地址</p>\n</li>\n</ul>\n<ul class=\"bearui_content bearui_info\">\n<li>\n<label class=\"typecho-label\">\n您的邮箱地址</label>\n<input id=\"usermail\" name=\"mail\" type=\"text\" class=\"text\" value=\"<?php echo $this->user->mail; ?>\" />\n<p class=\"description\">\n*该项为必填项，请填入您的邮箱地址</p>\n</li>\n</ul>\n<ul class=\"bearui_content bearui_info\">\n<li>\n<label class=\"typecho-label\">\n您的个性签名</label>\n<input id=\"usersignature\" name=\"signature\" type=\"text\" class=\"text\" value=\"<?php if($this->user->signature == 0):?>这个人太懒了，没有留下个性签名<?php else:?><?php echo $this->user->signature; ?><?php endif; ?>\" />\n<p class=\"description\">\n请填入您的个性签名</p>\n</li>\n</ul>\n\n<ul class=\"bearui_content bearui_tougao\">\n    <li>\n<label class=\"typecho-label\">\n投稿须知</label>\n<p class=\"description\">\n<?php if(Bsoptions('UserCenter_tougaotips') == ''):?>投稿前请注意投稿内容不得出现违法内容以及违禁词，违者将封禁投稿权限<?php else:?><?php echo Bsoptions('UserCenter_tougaotips'); ?><?php endif; ?> </p>\n</li> \n</ul>\n<ul class=\"bearui_content bearui_tougao\">\n<li>\n<label class=\"typecho-label\">\n投稿标题</label>\n<input id=\"tougao_title\" name=\"tougao_title\" type=\"text\" class=\"text\" />\n<p class=\"description\">\n*该项为必填项，请填入投稿标题</p>\n</li>\n</ul>\n\n<ul class=\"bearui_content bearui_tougao\">\n<li>\n<label class=\"typecho-label\">\n投稿栏目</label>\n<select name=\"category\" id=\"tougao_category\">\n    <?php if(Bsoptions('UserCenter_postcate')[0] !== ''):?>\n    <?php foreach(Bsoptions('UserCenter_postcate') as $postcate):?>\n<option value=\"<?php echo $postcate; ?>\">\n<?php echo getCategoryName($postcate); ?></option>\n<?php endforeach; ?>\n<?php endif;?>\n\n</select>\n<p class=\"description\">\n*该项为必选项，请根据您所投稿的内容选择要投稿的栏目</p>\n</li>\n</ul>\n       \n<ul class=\"bearui_content bearui_tougao\">\n    <li>\n<label class=\"typecho-label\" for=\"description-0-3\">\n投稿内容</label>\n<textarea class=\"textarea\" id=\"tougao_textarea\"></textarea>\n<p class=\"description\">\n*该项为必填项，请填入您的投稿内容</p>\n</li> \n</ul>\n<ul class=\"bearui_content bearui_tougao\">\n<li>\n                            <label for=\"token-input-tags\" class=\"typecho-label\">标签[多个标签使用英文逗号隔开]</label>\n                            <input id=\"tags\" name=\"tags\" type=\"text\" placeholder=\"请输入标签名\" class=\"text\"/>\n         </li>         \n       </ul>          \n<ul class=\"bearui_content bearui_tougao\">\n    <li>\n<label class=\"typecho-label\" for=\"description-0-3\">\n验证码</label>\n<div id=\"captcha\"></div>\n<input type=\"text\" class=\"text\" id=\"captcha_verify\"  placeholder=\"输入验证码，区分大小写\">\n<p class=\"description\">\n*请填入以上验证码，区分大小写</p>\n</li> \n</ul>\n<ul class=\"bearui_content bearui_tougao\">\n\n      <div class=\"required\"><font color=red>*</font>若提交，则表示您已阅读本站投稿须知并严格遵守本站关于投稿的相关要求</div>\n\n</ul>\n\n\n\n<ul class=\"bearui_content bearui_gaojian\">\n     <div class=\"ui segment\">\n  <i class=\"exclamation circle icon\"></i>\n  审核通过的文章可以通过点击投稿标题进入文章页面噢~\n</div>\n<table class=\"ui striped table\" style=\"word-break:break-all\">\n  <thead>\n    <tr>\n      <th>投稿标题</th>\n      <th>投稿时间</th>\n      <th>投稿栏目</th>\n      <th>状态</th>\n    </tr>\n  </thead>\n  <tbody id=\"postfl\">\n    \n  </tbody>\n</table>\n    <div class=\"postpagelist\"></div>\n</ul>\n\n\n<ul class=\"bearui_content bearui_says\">\n<li>\n<label class=\"typecho-label\">\n今天发点什么动态？</label>\n\n<form class=\"ui form\" id=\"saysform\">\n  <div class=\"field\">\n      <div class=\"ui mini basic icon button\" id=\"editing\" style=\"float:left;display:none\"><i class=\"edit icon\"></i></div>\n      <div class=\"ui mini basic icon buttons\" style=\"float:right\">\n  <div class=\"ui button\" id=\"insertimg\"><i class=\"image icon\" data-content=\"插入图片短代码\"></i></div>\n  <div class=\"ui button\" id=\"insertmark\"><i class=\"bookmark icon\" data-content=\"插入文字标记短代码\"></i></div>\n    <div class=\"ui button\" id=\"insertruby\"><i class=\"language icon\" data-content=\"插入文字注音短代码\"></i></div>\n</div>\n      <textarea rows=\"5\" cols=\"30\" name=\"saystext\" id=\"saystext\" placeholder=\"写一写你的最近动态~\"<?php if(Bsoptions('Emoji') == true) :?> class=\"emotion\"<?php endif; ?> required ></textarea>\n    \n<?php if(Bsoptions('Emoji') == true) :?>\n    <div class=\"circular ui icon button\" id=\"facesays\">\n\n  <i class=\"smile beam outline icon\"></i>\n </div>\n <div  class=\"ignore emoemo\" style=\"margin-top:-30px;margin-bottom:10px\"></div>\n <?php endif; ?>\n <input type=\"text\" name=\"sid\" id=\"edit-sid\" value=\"\"  class=\"hidden\">\n <input type=\"text\" name=\"type\" value=\"submitsays\" class=\"hidden\">\n<div class=\"ui segment\">\n    <div class=\"field\">\n      <div class=\"ui toggle checkbox\">\n        <input type=\"checkbox\" name=\"saysprivate\"  class=\"hidden\">\n        <label>该动态仅自己可见</label>\n      </div>\n    </div>\n  </div>\n  \n  </div>\n</form>\n<p class=\"description\">\n*发表您的每日动态，记录美好生活</p>\n</li>\n</ul>\n<ul class=\"bearui_content bearui_says\">\n<li>\n<label class=\"typecho-label\">\n动态列表</label>\n\n\n<div class=\"comments-container\">\n\t\n\n\t\t<ul id=\"comments-list\" class=\"comments-list\">\n\t\t\t<div id=\"saysfl\">\n\t\t\t\n\t\t</div>\n<div class=\"sayspagelist\"></div>\n\t\t</ul>\n</div>\n\n\n</li>\n</ul>\n\n<ul class=\"bearui_content bearui_tongzhi\">\n \n   <div class=\"ui secondary menu\" id=\"uitab\">\n    <a class=\"active item\" data-tab=\"first\">个人通知</a>\n  <a class=\"item\" data-tab=\"second\">系统通知</a>\n</div>\n<div class=\"ui bottom attached active tab \" data-tab=\"first\">\n   <div class=\"ui accordion\">\n     <?php if(userNotify($this->user->uid) !== ''):?>\n    <?php foreach(userNotify($this->user->uid) as $usertz):?>\n <div class=\"title\">\n    <i class=\"dropdown icon\"></i>\n    <?php echo $usertz['notifytitle'];?> - <?php  echo $usertz['notifytime'];?>\n  </div>\n  <div class=\"content\">\n    <p class=\"transition hidden\"><?php echo $usertz['notifytext'];?></p>\n  </div>\n<?php endforeach; ?>\n<?php endif; ?>\n  \n\n</div>\n\n</div>\n\n<div class=\"ui bottom attached tab \" data-tab=\"second\">\n    \n    \n       <div class=\"ui accordion\">\n     <?php if(Bsoptions('UserCenter_tab')['UserCenter_tongzhi'][0] !== ''):?>\n    <?php foreach(Bsoptions('UserCenter_tab')['UserCenter_tongzhi'] as $systemtz):?>\n <div class=\"title\">\n    <i class=\"dropdown icon\"></i>\n    <?php if($systemtz['UserCenter_tongzhi_title'] == ''):?>无<?php else:?><?php echo $systemtz['UserCenter_tongzhi_title'];?><?php endif; ?> - <?php $date = DateTime::createFromFormat('m/d/Y', $systemtz['UserCenter_tongzhi_date']); echo $date->format('Y年m月d日');?>\n  </div>\n  <div class=\"content\">\n <p class=\"transition hidden\"><?php if($systemtz['UserCenter_tongzhi_text'] == ''):?>暂无内容<?php else:?><?php echo $systemtz['UserCenter_tongzhi_text'];?><?php endif; ?></p>\n  </div>\n<?php endforeach; ?>\n<?php endif; ?>\n  \n</div>\n    \n    \n    \n    </div>\n\n    \n</ul>\n<style>\n    #submit-bar{\n        z-index: 99991!important;\n    }\n</style>\n<ul class=\"typecho-option typecho-option-submit\" id=\"submit-bar\">\n<li>\n<div class=\"ui large button\" id=\"submit-btn\" style=\"display:none\">\n提交修改</div>\n<div class=\"ui large button\" id=\"submit-btn-tougao\" style=\"display:none\">\n提交投稿</div>\n<div class=\"ui large button\" id=\"submit-btn-says\" style=\"display:none\">\n发布动态</div>\n</li>\n</ul>\n\n\n\n\n</div>\n\n\n\n\n\n            </div>\n      \n    \n\n\n\n        \n        </div></div>\n<script src=\"https://staticfile.typecho.co.uk/froala/js/froala_editor.pkgd.min.js\"></script>\n<script src=\"https://staticfile.typecho.co.uk/froala/js/languages/zh_cn.js\"></script>\n<script>\n\n  $(document).ready(function() {\n    \n$.getScript('https://staticfile.typecho.co.uk/fancybox/fancybox.umd.min.js',function(){\n  Fancybox.bind('[data-fancybox=\"single\"]', {\n      groupAttr: false,\n});\n  Fancybox.bind('[data-fancybox=\"gallery\"]', {\n});\n});\n$('#insertimg').on('click',function(){\ninsert('[bsimg]图片直链，带http(s)://[/bsimg]\\n');\n});\n$('#insertmark').on('click',function(){\ninsert('[bsmark]要标注的文字[/bsmark]\\n');\n});\n$('#insertruby').on('click',function(){\ninsert('[bsruby]要注音的文字[/bsruby]\\n');\n});\nfunction insert(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('saystext') && document.getElementById('saystext').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('saystext');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t};\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t};\n\t\t\t\t\tif (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t};\n\t\t\t\t};\n\n      \n\n        const editor = new FroalaEditor('#tougao_textarea',\n  {language: 'zh_cn',\n  toolbarButtons: ['fullscreen', 'bold', 'italic', 'underline', 'strikeThrough',  'fontFamily', 'fontSize',   'inlineStyle', 'paragraphStyle', 'paragraphFormat', 'align', 'formatOL', 'formatUL', 'outdent', 'indent', '-', 'insertLink', 'insertImage', 'insertTable',  'quote', 'insertHR', 'undo', 'redo', 'clearFormatting', 'selectAll'],\n    pluginsEnabled: ['image', 'table', 'lists','charCounter','fullscreen','link','fontSize','quote','align'],\n    linkConvertEmailAddress: false,\n    linkInsertButtons: ['linkBack'],\n    imageUpload:false,\n  }\n  );  \n     \n  \n    getpostdata();\n    //获取文章数据\nvar postpage = 1;\n                var postn = 0;\n                var postmax = 1;\nfunction getpostdata(){\n     $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: '<?php getUserAction(); ?>',\n                        data: {\n                            \"type\": 'getallpost',\n                            \"page\": postpage\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                     \n                            json = JSON.parse(data);\nif(json.list == ''){\n    postn = json.total;\n                            postmax = json.max;\n                                var strs = \" \";\n                                strs += '<tr></tr>';\n                                $(\"#postfl\").html(strs);\n                            }\n                            else{\n                                postn = json.total;\n                            postmax = json.max;\ncontent2(json.list);\n}\n\n                        },\n                        complete: function() {\n                            pageList();\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n                    function pageList() {\n                    postpage = Math.min(postpage, postmax);\n                    postpage = Math.max(postpage, 1);\n                    var html = \"<center><div class=\\\"ui circular labels\\\"><a class=\\\"ui label\\\" data-page=\"+ postpage +\">共\" + postn + \"条</a><a class=\\\"ui label\\\" data-page=\"+ postpage +\">第\" + postpage + \"/\" + postmax + \"页</a>\";\n                    html += '<a class=\\\"ui label\\\"  data-page=\"1\">首页</a>';\n                    html += (postpage > 1) ? '<a class=\\\"ui label\\\"  data-page=\"' + (postpage - 1) + '\">上一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"1\">上一页</a>';\n                    html += (postpage < postmax) ? '<a class=\\\"ui label\\\"  data-page=\"' + (postpage + 1) + '\">下一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"' + postmax + '\">下一页</a>';\n                    html += '<a class=\\\"ui label\\\"  data-page=\"' + postmax + '\">尾页</a><div class=\\\"ui mini input\\\"><input id=\\\"dipage\\\" type=\\\"number\\\" placeholder=\\\"输入跳转的页码\\\"></div><a id=\\\"gopage\\\" class=\\\"ui label\\\" >跳转到指定页</a></div></center>';\n                    var $html = $(html);\n                    \n                    $html.find(\"a\").click(function() {\n                        if($(this).attr(\"id\")!=='gopage'){\n                        postpage = $(this).attr(\"data-page\");\n                        }\n                        else{\n                            var dipage = document.getElementById(\"dipage\").value;\n                            if(dipage > postmax){\n                              postpage = postmax;\n                            }\n                            else if(dipage < 1){\n                               postpage = 1; \n                            }\n                            else{\n                              postpage = dipage;  \n                            }\n                            \n                           \n                        };\n                        getpostdata();\n                    });\n                    \n                    \n                    $(\".postpagelist\").html($html);\n                }\n                \n                \n     function content2(lists) {\n                    var str2 = \" \";\n                    for(var i in lists) {\nstr2 += '<tr><td>' + lists[i]['post_title'] + '</td><td>' + lists[i]['post_time'] + '</td><td>' + lists[i]['post_category'] + '</td><td>' + lists[i]['post_status'] + '</td></tr>';\n$(\"#postfl\").html(str2);\n}\n}\n}\n\n\n\n    createCaptcha();\n\nvar code;\nvar captcha = document.getElementById('captcha_verify');\nfunction createCaptcha() {\n  document.getElementById('captcha').innerHTML = \"\";\n  var charsArray =\n  \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@!#$%^&*\";\n  var lengthOtp = 6;\n  var captcha = [];\n  for (var i = 0; i < lengthOtp; i++) {\n    var index = Math.floor(Math.random() * charsArray.length + 1);\n    if (captcha.indexOf(charsArray[index]) == -1)\n    captcha.push(charsArray[index]);else\n    i--;\n  }\n  var canv = document.createElement(\"canvas\");\n  canv.id = \"captcha\";\n  canv.width = 100;\n  canv.height = 50;\n  var ctx = canv.getContext(\"2d\");\n  ctx.font = \"25px Georgia\";\n  ctx.strokeText(captcha.join(\"\"), 0, 30);\n  code = captcha.join(\"\");\n  document.getElementById(\"captcha\").appendChild(canv);\n}\n$(document).off('click','#submit-btn').on('click','#submit-btn',function(){\n     $(\"#submit-btn\").css(\"pointer-events\",\"none\").addClass('loading');\n     $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: window.location.href,\n                        data: {\n                            \"action\": 'editprofile',\n                        },\n                        dateType: \"json\",\n                        success: function(url) {\n                            $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: url,\n                        data: {\n                            \"screenName\": $(\"#screenName\").val(),\n                            \"url\": $(\"#userurl\").val(),\n                            \"mail\": $(\"#usermail\").val(),\n                            \"do\": 'profile',\n                        },\n                        dateType: \"json\",\n                        success: function(json) {\n                            $.post('<?php getUserAction(); ?>',{type:'editUserSignature',person_Signature:$(\"#usersignature\").val()});\n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'个人资料修改成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已成功修改，即将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetTimeout(function() {\n            window.location.reload();\n            },2000);\n                        },\n                        error: function() {\n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'个人资料修改成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已成功修改，即将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetTimeout(function() {\n            window.location.reload();\n            },2000);\n                        }\n                    });\n                          \n                            \n                    \n                        }\n     });\n     \n});\n\n$(document).off('click','#signout').on('click','#signout',function(){\n     $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: window.location.href,\n                        data: {\n                            \"action\": 'signout',\n                        },\n                        dateType: \"json\",\n                        success: function(url) {\n                            $.ajax({\n                        type: \"GET\",\n                        async:true,\n                        url: url,\n                        dateType: \"json\",\n                        success: function(json) {\n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'您已退出登录',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已退出登录，3秒后返回首页~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetTimeout(function() {\n            window.location = '<?php $this->options->siteUrl();?>';\n            },2000);\n                        },\n                        error: function() {\n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'您已退出登录',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已退出登录，3秒后返回首页~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetTimeout(function() {\n            window.location = '<?php $this->options->siteUrl();?>';\n            },2000);\n                        }\n                    });\n                          \n                            \n                    \n                        }\n     });\n     \n});\n\n$(document).off('click','#submit-btn-tougao').on('click','#submit-btn-tougao',function(){\n    if(!$(\"#tougao_title\").val()){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '检测到投稿标题为空，请重新输入~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn false;\n    }\n    if(!$(\"#tougao_category\").find(\"option:selected\").val()){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '检测到投稿栏目为空，请重新输入~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn false;\n    }\n    if(!editor.html.get()){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '检测到投稿内容为空，请重新输入~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn false;\n    }\n        if(captcha.value == ''){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '验证码为空哦', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n        return false;\n    }\n    if(captcha.value !== code){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '验证码错误，请重新输入', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\tcreateCaptcha();\n        return false;\n    };\n    $(\"#submit-btn-tougao\").css(\"pointer-events\",\"none\").addClass('loading');\n    $.ajax({\n                        type: \"POST\",\n                        url: window.location.href,\n                        data: {\n                            \"action\": 'tougao',\n                        },\n                        dateType: \"json\",\n                        success: function(url) {\n                            $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: url,\n                        data: {\n                            \"title\": $(\"#tougao_title\").val(),\n                            \"category\": $(\"#tougao_category\").find(\"option:selected\").val(),\n                            \"created\": '<?php echo time(); ?>',\n                            'text': editor.html.get(),\n                            'tags':filterXSS($(\"#tags\").val()),\n                            \"do\": 'publish',\n                            \"cid\": '',\n                            \"allowComment\":'1'\n                            \n                        },\n                        dateType: \"json\",\n                        success: function(json) {\n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'投稿成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已成功投稿，即将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetTimeout(function() {\n            window.location.reload();\n            $('#gaojian_list').click();\n            },2000);\n            \n                        },\n                        error: function() {\n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'投稿成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t\t    message: '您已成功投稿，即将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetTimeout(function() {\n            window.location.reload();\n            $('#gaojian_list').click();\n            },2000);\n                        }\n                    });\n                          \n                            \n                    \n                        }\n     });\n     \n});\n\n$(document).off('click','#b-sign').on('click','#b-sign',function(){\n\n   $(\"#b-sign\").css(\"pointer-events\",\"none\").addClass('loading'); \n   \n   $.ajax({\n                        type: \"GET\",\n                        async:true,\n                        url: '<?php getSign(); ?>',\n                        dateType: \"json\",\n                        success: function(json) {\n                            json = JSON.parse(json);\n                            if(json.code == 1){\n                                var signcoin = '';\n                         if(json.signcoin){\n                             signcoin = ',获得'+json.signcoin+'<?php if(Bsoptions('UserCenter_coin_dw') !== ''):?><?php echo Bsoptions('UserCenter_coin_dw'); ?><?php endif;?><?php if(Bsoptions('UserCenter_coin_name') !== ''):?><?php echo Bsoptions('UserCenter_coin_name'); ?><?php else:?>积分<?php endif;?>'\n                         }\n                         else{\n                             signcoin = '';\n                         }\n                              $('body').toast({\n\t\t\t\t\t\t\t    title:'签到成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t        message: '您已成功签到'+signcoin+',即将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});  \n                                \tsetTimeout(function() {\n            window.location.reload();\n            },2000);\n                            }\n                            else{\n                              $('body').toast({\n\t\t\t\t\t\t\t    title:'签到失败',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '啊哦，似乎网络出现了什么问题，请稍后再试~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});  \n                            }\n                    \n                        },\n                        error: function() {\n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'签到失败',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '啊哦，似乎网络出现了什么问题，请稍后再试~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n                        }\n     });\n   \n});\n\n\n$(document).off('click','#submit-btn-says').on('click','#submit-btn-says',function(){\n        if(!$('#saystext').val()){\n        $('body').toast({\n\t\t\t\t\t\t\t    title:'温馨提示~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '检测到发表的动态内容为空，请重新输入~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn false;\n    }\n   $(\"#submit-btn-says\").css(\"pointer-events\",\"none\").addClass('loading'); \n   \n   $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: '<?php getUserAction();?>',\n                        dateType: \"json\",\n                        data: \n                        $(\"#saysform\").serialize()\n                        ,\n                        success: function(json) {\n                            json = JSON.parse(json);\n                            if(json.code== 1 && json.sid == ''){\n                              $('body').toast({\n\t\t\t\t\t\t\t    title:'动态发表成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t        message: '您已成功发表动态,即将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});  \n                                \tsetTimeout(function() {\n            window.location.reload();\n            },2000);\n                            }\n                            else if(json.code== 1 && json.sid){\n                              $('body').toast({\n\t\t\t\t\t\t\t    title:'动态修改成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t        message: '您已成功修改动态,即将自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});  \n                                \tsetTimeout(function() {\n            window.location.reload();\n            },2000);\n                            }\n                            else{\n                              $('body').toast({\n\t\t\t\t\t\t\t    title:'提交失败',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '啊哦，似乎网络出现了什么问题，请稍后再试~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});  \n                            }\n                    \n                        },\n                        error: function() {\n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'提交失败',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '啊哦，似乎网络出现了什么问题，请稍后再试~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n                        }\n     });\n   \n});\n\n\n//获取动态数据\n  getsaysdata();\nvar sayspage = 1;\n                var saysn = 0;\n                var saysmax = 1;\nfunction getsaysdata(){\n     $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: '<?php getUserAction(); ?>',\n                        data: {\n                            \"type\": 'getsays',\n                            \"page\": sayspage,\n                            'index':'2'\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                     \n                            json = JSON.parse(data);\nif(json.list == ''){\n    saysn = json.total;\n                            saysmax = json.max;\n                                var strs = \" \";\n                                strs += '<article class=\"post\"><center><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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></linearGradient></defs><g transform=\"translate(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg><h2>这里暂时没有动态~</h2></center></article>';\n                                $(\"#saysfl\").html(strs);\n                                \n                            }\n                            else{\n                                saysn = json.total;\n                            saysmax = json.max;\ncontent2(json.list);\npageList();\n}\n\n                        },\n                        complete: function() {\n                            \n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n                     function pageList() {\n                    sayspage = Math.min(sayspage, saysmax);\n                    sayspage = Math.max(sayspage, 1);\n                    var html = \"<center><div class=\\\"ui circular labels\\\"><a class=\\\"ui label\\\" data-page=\"+ sayspage +\">共\" + saysn + \"条</a><a class=\\\"ui label\\\" data-page=\"+ sayspage +\">第\" + sayspage + \"/\" + saysmax + \"页</a>\";\n                    html += '<a class=\\\"ui label\\\"  data-page=\"1\">首页</a>';\n                    html += (sayspage > 1) ? '<a class=\\\"ui label\\\"  data-page=\"' + (sayspage - 1) + '\">上一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"1\">上一页</a>';\n                    html += (sayspage < saysmax) ? '<a class=\\\"ui label\\\"  data-page=\"' + (sayspage + 1) + '\">下一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"' + saysmax + '\">下一页</a>';\n                    html += '<a class=\\\"ui label\\\"  data-page=\"' + saysmax + '\">尾页</a><div class=\\\"ui mini input\\\"><input id=\\\"dipagex\\\" type=\\\"number\\\" placeholder=\\\"输入跳转的页码\\\"></div><a id=\\\"gopage\\\" class=\\\"ui label\\\" >跳转到指定页</a></div></center>';\n                    var $html = $(html);\n                    \n                    $html.find(\"a\").click(function() {\n                        if($(this).attr(\"id\")!=='gopage'){\n                        sayspage = $(this).attr(\"data-page\");\n                        }\n                        else{\n                            var dipage = document.getElementById(\"dipagex\").value;\n                            if(dipage > saysmax){\n                              sayspage = saysmax;\n                            }\n                            else if(dipage < 1){\n                               sayspage = 1; \n                            }\n                            else{\n                              sayspage = dipage;  \n                            }\n\n                        };\n                        \n                        getsaysdata();\n                    });\n                    \n                    \n                    $(\".sayspagelist\").html($html);\n                }\n\n                \n     function content2(lists) {\n                    var str2 = \" \";\n                    var privatesays = \" \";\n                    for(var i in lists) {\n                        if(lists[i]['saysprivate'] == 'on'){\n                          privatesays = '不公开';  \n                        }\n                        else{\n                          privatesays = '';    \n                        }\nstr2 += '<li><div class=\"comment-main-levels\"><div class=\"comment-box\"><div class=\"comment-head\"><h6 class=\"comment-name by-author\"><?php echo getAuthorInfo($this->user->uid,'screenName'); ?></h6> <span>' + lists[i]['saystime'] + '</span> <span style=\"float:right\">'+ privatesays +'</span><i class=\"thumbs up red icon\"></i><spanx class=\"clikenum\">' + lists[i]['sayslike'] + '</spanx></div><div class=\"comment-content\">' + lists[i]['saystext'] + '</div><div style=\"display:none\" id=\"edit-' + lists[i]['saysid']+'\">' + lists[i]['saystext_sim'] + '</div></div></div><span class=\"ui small icon red basic label delete\" style=\"float:right;margin-top:15px\" data-sid=\"' + lists[i]['saysid'] + '\"><i class=\"times icon\"></i> 删除</span><span class=\"ui small icon blue basic label edit\" style=\"float:right;margin-top:15px;margin-right:10px\" data-sid=\"' + lists[i]['saysid'] + '\" data-time=\"' + lists[i]['saystime'] + '\" data-private=\"'+ lists[i]['saysprivate'] +'\"><i class=\"edit icon\"></i> 修改</span><span class=\"ui small icon blue basic label\" id=\"editcancel-' + lists[i]['saysid'] + '\" style=\"float:right;margin-top:15px;margin-right:10px;display:none\" data-sid=\"' + lists[i]['saysid'] + '\"><i class=\"edit icon\"></i> 取消修改</span></li>';\n$(\"#saysfl\").html(str2);\n}\n}\n}\n$(document).off('click','.ui.small.icon.red.basic.label.delete').on('click','.ui.small.icon.red.basic.label.delete',function(){\n   $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: '<?php getUserAction();?>',\n                        dateType: \"json\",\n                        data: {\n                        \"type\":'deletesays',\n                        \"saysid\":$(this).attr('data-sid')\n                        }\n                        ,\n                        success: function(data) {\n                            if(data== 1){\n                              $('body').toast({\n\t\t\t\t\t\t\t    title:'动态删除成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t        message: '您已成功删除动态~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});  \n                                getsaysdata();\n                            }\n                            else{\n                              $('body').toast({\n\t\t\t\t\t\t\t    title:'动态删除失败',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '啊哦，似乎网络出现了什么问题，请稍后再试~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});  \n                            }\n                    \n                        },\n                        error: function() {\n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'动态删除失败',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '啊哦，似乎网络出现了什么问题，请稍后再试~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n                        }\n     });\n     \n});\n\n\n$(document).off('click','.ui.small.icon.blue.basic.label.edit').on('click','.ui.small.icon.blue.basic.label.edit',function(){\n   const _parent = $('.ui.small.icon.blue.basic.label.edit');\n   $('textarea[name=saystext]').val($.trim($(\"#edit-\"+$(this).attr('data-sid')).text())).focus();\n   if($(this).attr('data-private') == 'on'){\n   $('input:checkbox').eq(0).prop(\"checked\",true); \n   }\n   else{\n   $('input:checkbox').eq(0).prop(\"checked\",false);     \n   }\n   $('#editing').html('正在修改 '+$(this).attr('data-time')+' 发布的动态').show();\n   $('#submit-btn-says').text('修改动态');\n   $('.ui.small.icon.blue.basic.label.edit').not(this).css(\"pointer-events\",\"none\");\n   $(this).hide();\n    if($(this).css('display')=='none'){\n\t $('#editcancel-'+$(this).attr('data-sid')).fadeIn();\n}\n$('#edit-sid').val($(this).attr('data-sid'));\n\n$(document).on('click','#editcancel-'+$(this).attr('data-sid'),function(){\n     _parent.show();\n    $('#submit-btn-says').text('发布动态');\n    $('#editcancel-'+$(this).attr('data-sid')).hide();\n    $('.ui.small.icon.blue.basic.label.edit').not(this).css(\"pointer-events\",\"auto\");\n    $('#editing').hide();\n    $(\"textarea[name=saystext]\").val('');\n    $('input:checkbox').eq(1).prop(\"checked\",false); \n    $('#edit-sid').val('');\n});\n\n});\n\n});\n</script>\n\n<?php $this->need('compoment/foot.php'); ?>\n"
  },
  {
    "path": "modules/Verify/BearCaptcha/Captcha/Captcha.php",
    "content": "<link rel=\"stylesheet\" href=\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/BsVerify.min.css\">\r\n<script type=\"text/javascript\" src=\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/BsVerify.min.js\"></script>\r\n<script type=\"text/javascript\">\r\nfunction verify(){\r\n    BsVerify.configure({\r\n    tolerance: 10,\r\n    duration: 500,\r\n    mask: .5,\r\n    maskClosable: true,\r\n    title: '<?php if(empty(Bsoptions('Verify22_Paneltitle'))){echo '人机验证';}else{\r\n\t\t\techo Bsoptions('Verify22_Paneltitle');}\r\n\t\t\t  ?>',\r\n    text: '<?php if(empty(Bsoptions('Verify22_Paneldec'))){echo '滑动滑块，使图片显示角度为正';}else{\r\n\t\t\techo Bsoptions('Verify22_Paneldec');}?>',\r\n    album: [\r\n\t\t\t   <?php if(empty(Bsoptions('Verify22_Panelimg'))) :?>\r\n\r\n\t\t\t    \"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/img/t1.png\",\r\n\r\n\t\t\t\t\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/img/t2.png\",\r\n\t\t\t\t\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/img/t3.png\"\r\n\t\t\t\t<?php else: ?>\r\n\t\t\t\t<?php $pic = explode(\",\", Bsoptions('Verify22_Panelimg'));\r\n\t\t\t\t$pics = implode('\",\"',$pic);\r\n\t\t\t\t$panelimg = '\"'.$pics.'\"';\r\n\t\t\t\techo $panelimg;\r\n\t\t\t\t?>\r\n\t\t\t\t<?php endif; ?>\r\n    ]\r\n  });\r\n\r\n  BsVerify.action(function (code) {\r\n    switch (code) {\r\n      case 1:\r\n        document.getElementById(\"commentsubmit\").removeAttribute(\"disabled\");\r\n$(\"#bsverify\").hide();  \r\n        break;\r\n    }\r\n  });\r\n}\r\n\t\t\r\n\t\r\n\t$(window).bind('popstate',function(event) { \r\n\t    var button=document.getElementsByTagName(\"span\");\r\nfor(var i=0;i<button.length;i++) {\r\nif(typeof(button[i].id)!=\"undefined\" && button[i].id == \"bsverify\") {\r\n\t    \t\t\t$('#bsverify').show();\r\n}};\r\n});\r\n</script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Captcha/Captcha_Link.php",
    "content": "<link rel=\"stylesheet\" href=\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/BsVerify.min.css\">\n<script type=\"text/javascript\" src=\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/BsVerify.min.js\"></script>\n<script type=\"text/javascript\">\nfunction verify(){\n    BsVerify.configure({\n    tolerance: 10,\n    duration: 500,\n    mask: .5,\n    maskClosable: true,\n    title: '<?php if(empty(Bsoptions('Verify22_Paneltitle'))){echo '人机验证';}else{\n\t\t\techo Bsoptions('Verify22_Paneltitle');}\n\t\t\t  ?>',\n    text: '<?php if(empty(Bsoptions('Verify22_Paneldec'))){echo '滑动滑块，使图片显示角度为正';}else{\n\t\t\techo Bsoptions('Verify22_Paneldec');}?>',\n    album: [\n\t\t\t   <?php if(empty(Bsoptions('Verify22_Panelimg'))) :?>\n\n\t\t\t    \"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/img/t1.png\",\n\n\t\t\t\t\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/img/t2.png\",\n\t\t\t\t\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/img/t3.png\"\n\t\t\t\t<?php else: ?>\n\t\t\t\t<?php $pic = explode(\",\", Bsoptions('Verify22_Panelimg'));\n\t\t\t\t$pics = implode('\",\"',$pic);\n\t\t\t\t$panelimg = '\"'.$pics.'\"';\n\t\t\t\techo $panelimg;\n\t\t\t\t?>\n\t\t\t\t<?php endif; ?>\n    ]\n  });\n\n  BsVerify.action(function (code) {\n    switch (code) {\n      case 1:\n        $('#friendbtn').css(\"pointer-events\",\"auto\");\n        \n$(\"#bsverify\").hide();  \n        break;\n    }\n  });\n}\n\t\t\n\t\n\t$(window).bind('popstate',function(event) { \n\t    var button=document.getElementsByTagName(\"span\");\nfor(var i=0;i<button.length;i++) {\nif(typeof(button[i].id)!=\"undefined\" && button[i].id == \"bsverify\") {\n\t    \t\t\t$('#bsverify').show();\n}};\n});\n</script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Captcha/Captcha_Memo.php",
    "content": "<link rel=\"stylesheet\" href=\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/BsVerify.min.css\">\n<script type=\"text/javascript\" src=\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/BsVerify.min.js\"></script>\n<script type=\"text/javascript\">\nfunction verify(){\n    BsVerify.configure({\n    tolerance: 10,\n    duration: 500,\n    mask: .5,\n    maskClosable: true,\n    title: '<?php if(empty(Bsoptions('Verify22_Paneltitle'))){echo '人机验证';}else{\n\t\t\techo Bsoptions('Verify22_Paneltitle');}\n\t\t\t  ?>',\n    text: '<?php if(empty(Bsoptions('Verify22_Paneldec'))){echo '滑动滑块，使图片显示角度为正';}else{\n\t\t\techo Bsoptions('Verify22_Paneldec');}?>',\n    album: [\n\t\t\t   <?php if(empty(Bsoptions('Verify22_Panelimg'))) :?>\n\n\t\t\t    \"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/img/t1.png\",\n\n\t\t\t\t\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/img/t2.png\",\n\t\t\t\t\"<?php AssetsDir();?>assets/verify/BearCaptcha/Captcha/img/t3.png\"\n\t\t\t\t<?php else: ?>\n\t\t\t\t<?php $pic = explode(\",\", Bsoptions('Verify22_Panelimg'));\n\t\t\t\t$pics = implode('\",\"',$pic);\n\t\t\t\t$panelimg = '\"'.$pics.'\"';\n\t\t\t\techo $panelimg;\n\t\t\t\t?>\n\t\t\t\t<?php endif; ?>\n    ]\n  });\n\n  BsVerify.action(function (code) {\n    switch (code) {\n      case 1:\n        document.getElementById(\"memosubmit\").removeAttribute(\"disabled\");\n$(\"#bsverify\").hide();  \n        break;\n    }\n  });\n}\n\t\t\n\t\n\t$(window).bind('popstate',function(event) { \n\t    var button=document.getElementsByTagName(\"span\");\nfor(var i=0;i<button.length;i++) {\nif(typeof(button[i].id)!=\"undefined\" && button[i].id == \"bsverify\") {\n\t    \t\t\t$('#bsverify').show();\n}};\n});\n</script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Dingxiang/DX_Captcha.php",
    "content": "<div style=\"height:5px\"></div><div id=\"dx_captcha\"></div>\n<script>\nif($('#dx_captcha').length){\n$.getScript('https://cdn.dingxiang-inc.com/ctu-group/captcha-ui/index.js',function(){\n    var myCaptcha = _dx.Captcha(document.getElementById('dx_captcha'), {\n    appId: '<?php echo Bsoptions('dx_appId'); ?>',\n    apiServer: 'https://<?php echo Bsoptions('dx_domain'); ?>',\n    success: function (token) {\n        let tokeninput = $(\"<input type='text' name='dx_token' style='display:none'/>\");\n        tokeninput.attr(\"value\",token);\n        $(\"#textarea\").append(tokeninput);\n      document.getElementById(\"commentsubmit\").removeAttribute(\"disabled\");\n    }\n    })\n});\n}\n  $(document).on('pjax:complete', function() {  \n      if($('#dx_captcha').length){\n      $.getScript('https://cdn.dingxiang-inc.com/ctu-group/captcha-ui/index.js',function(){\n          var myCaptcha = _dx.Captcha(document.getElementById('dx_captcha'), {\n    appId: '<?php echo Bsoptions('dx_appId'); ?>',\n    apiServer: 'https://<?php echo Bsoptions('dx_domain'); ?>',\n    success: function (token) {\n        let tokeninput = $(\"<input type='text' name='dx_token' style='display:none'/>\");\n        tokeninput.attr(\"value\",token);\n        $(\"#textarea\").append(tokeninput);\n      document.getElementById(\"commentsubmit\").removeAttribute(\"disabled\");\n    }\n})\n      })  \n      }\n    });\n\n     $(window).bind('popstate',function(event) {  \n         if($('#dx_captcha').length){\n         $.getScript('https://cdn.dingxiang-inc.com/ctu-group/captcha-ui/index.js',function(){\n                 var myCaptcha = _dx.Captcha(document.getElementById('dx_captcha'), {\n    appId: '<?php echo Bsoptions('dx_appId'); ?>',\n    apiServer: 'https://<?php echo Bsoptions('dx_domain'); ?>',\n    success: function (token) {\n        let tokeninput = $(\"<input type='text' name='dx_token' style='display:none'/>\");\n        tokeninput.attr(\"value\",token);\n        $(\"#textarea\").append(tokeninput);\n      document.getElementById(\"commentsubmit\").removeAttribute(\"disabled\");\n    }\n})\n})\n}\n    }); \n</script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Dingxiang/DX_Captcha_Link.php",
    "content": "<div style=\"height:5px\"></div><div id=\"dx_captcha\"></div>\n<script>\nif($('#dx_captcha').length){\n$.getScript('https://cdn.dingxiang-inc.com/ctu-group/captcha-ui/index.js',function(){\n    var myCaptcha = _dx.Captcha(document.getElementById('dx_captcha'), {\n    appId: '<?php echo Bsoptions('dx_appId'); ?>',\n    apiServer: 'https://<?php echo Bsoptions('dx_domain'); ?>',\n    success: function (token) {\n        let tokeninput = $(\"<input type='text' name='dx_token' style='display:none'/>\");\n        tokeninput.attr(\"value\",token);\n        $(\"#friendform\").append(tokeninput);\n      $('#friendbtn').css(\"pointer-events\",\"auto\");\n    }\n    })\n});\n}\n  $(document).on('pjax:complete', function() {  \n      if($('#dx_captcha').length){\n      $.getScript('https://cdn.dingxiang-inc.com/ctu-group/captcha-ui/index.js',function(){\n          var myCaptcha = _dx.Captcha(document.getElementById('dx_captcha'), {\n    appId: '<?php echo Bsoptions('dx_appId'); ?>',\n    apiServer: 'https://<?php echo Bsoptions('dx_domain'); ?>',\n    success: function (token) {\n        let tokeninput = $(\"<input type='text' name='dx_token' style='display:none'/>\");\n        tokeninput.attr(\"value\",token);\n        $(\"#friendform\").append(tokeninput);\n      $('#friendbtn').css(\"pointer-events\",\"auto\");\n    }\n})\n      })  \n      }\n    });\n\n     $(window).bind('popstate',function(event) {  \n         if($('#dx_captcha').length){\n         $.getScript('https://cdn.dingxiang-inc.com/ctu-group/captcha-ui/index.js',function(){\n                 var myCaptcha = _dx.Captcha(document.getElementById('dx_captcha'), {\n    appId: '<?php echo Bsoptions('dx_appId'); ?>',\n    apiServer: 'https://<?php echo Bsoptions('dx_domain'); ?>',\n    success: function (token) {\n        let tokeninput = $(\"<input type='text' name='dx_token' style='display:none'/>\");\n        tokeninput.attr(\"value\",token);\n        $(\"#friendform\").append(tokeninput);\n      $('#friendbtn').css(\"pointer-events\",\"auto\");\n    }\n})\n})\n}\n    }); \n</script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Dingxiang/DX_Captcha_Memo.php",
    "content": "<div style=\"height:5px\"></div><div id=\"dx_captcha\"></div>\n<script>\nif($('#dx_captcha').length){\n$.getScript('https://cdn.dingxiang-inc.com/ctu-group/captcha-ui/index.js',function(){\n    var myCaptcha = _dx.Captcha(document.getElementById('dx_captcha'), {\n    appId: '<?php echo Bsoptions('dx_appId'); ?>',\n    apiServer: 'https://<?php echo Bsoptions('dx_domain'); ?>',\n    success: function (token) {\n        let tokeninput = $(\"<input type='text' name='dx_token' style='display:none'/>\");\n        tokeninput.attr(\"value\",token);\n        $(\"#textarea\").append(tokeninput);\n      document.getElementById(\"memosubmit\").removeAttribute(\"disabled\");\n    }\n    })\n});\n}\n  $(document).on('pjax:complete', function() {  \n      if($('#dx_captcha').length){\n      $.getScript('https://cdn.dingxiang-inc.com/ctu-group/captcha-ui/index.js',function(){\n          var myCaptcha = _dx.Captcha(document.getElementById('dx_captcha'), {\n    appId: '<?php echo Bsoptions('dx_appId'); ?>',\n    apiServer: 'https://<?php echo Bsoptions('dx_domain'); ?>',\n    success: function (token) {\n        let tokeninput = $(\"<input type='text' name='dx_token' style='display:none'/>\");\n        tokeninput.attr(\"value\",token);\n        $(\"#textarea\").append(tokeninput);\n      document.getElementById(\"memosubmit\").removeAttribute(\"disabled\");\n    }\n})\n      })  \n      }\n    });\n\n     $(window).bind('popstate',function(event) {  \n         if($('#dx_captcha').length){\n         $.getScript('https://cdn.dingxiang-inc.com/ctu-group/captcha-ui/index.js',function(){\n                 var myCaptcha = _dx.Captcha(document.getElementById('dx_captcha'), {\n    appId: '<?php echo Bsoptions('dx_appId'); ?>',\n    apiServer: 'https://<?php echo Bsoptions('dx_domain'); ?>',\n    success: function (token) {\n        let tokeninput = $(\"<input type='text' name='dx_token' style='display:none'/>\");\n        tokeninput.attr(\"value\",token);\n        $(\"#textarea\").append(tokeninput);\n      document.getElementById(\"memosubmit\").removeAttribute(\"disabled\");\n    }\n})\n})\n}\n    }); \n</script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Geetest/Geetest.php",
    "content": "<div id=\"geetest_captcha\"></div>\n<script>\n$(function(){\n    $.getScript('<?php AssetsDir();?>assets/js/gt4.js',function(){\ninitGeetest4({\n    product: 'float',\n    captchaId: '<?php echo Bsoptions('geeid'); ?>'\n},function (captcha) {\n    $(\"#geetest_captcha\").empty();\n    captcha.appendTo(\"#geetest_captcha\");\n    captcha.onSuccess(function(){\n      document.getElementById(\"commentsubmit\").removeAttribute(\"disabled\");\n      var result = captcha.getValidate();\n      var lot_number = $('<input type=\"text\" name=\"lot_number\" id=\"lot_number\" style=\"display:none\"/>');\n          lot_number.attr('value', result.lot_number);\n      var captcha_output = $('<input type=\"text\" name=\"captcha_output\" id=\"captcha_output\" style=\"display:none\"/>');\n          captcha_output.attr('value', result.captcha_output);\n      var pass_token = $('<input type=\"text\" name=\"pass_token\" id=\"pass_token\" style=\"display:none\"/>');\n          pass_token.attr('value', result.pass_token);\n      var gen_time = $('<input type=\"text\" name=\"gen_time\" id=\"gen_time\" style=\"display:none\"/>');\n          gen_time.attr('value', result.gen_time);\n$('#commentform').append(lot_number);\n$('#commentform').append(captcha_output);\n$('#commentform').append(pass_token);\n$('#commentform').append(gen_time);\n    })\n});\n});\n});\n</script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Geetest/Geetest_Link.php",
    "content": "<div id=\"geetest_captcha_l\"></div><div style=\"height:5px\"></div>\n<script>\n$(function(){\n    $.getScript('<?php AssetsDir();?>assets/js/gt4.js',function(){\ninitGeetest4({\n    product: 'float',\n    captchaId: '<?php echo Bsoptions('geeid'); ?>',\n    \n},function (captcha) {\n    $(\"#geetest_captcha_l\").empty();\n    captcha.appendTo(\"#geetest_captcha_l\");\n    captcha.onSuccess(function(){\n      $('#friendbtn').css(\"pointer-events\",\"auto\");\n      var result = captcha.getValidate();\n      var lot_number = $('<input type=\"text\" name=\"lot_number\" id=\"lot_number\" style=\"display:none\"/>');\n          lot_number.attr('value', result.lot_number);\n      var captcha_output = $('<input type=\"text\" name=\"captcha_output\" id=\"captcha_output\" style=\"display:none\"/>');\n          captcha_output.attr('value', result.captcha_output);\n      var pass_token = $('<input type=\"text\" name=\"pass_token\" id=\"pass_token\" style=\"display:none\"/>');\n          pass_token.attr('value', result.pass_token);\n      var gen_time = $('<input type=\"text\" name=\"gen_time\" id=\"gen_time\" style=\"display:none\"/>');\n          gen_time.attr('value', result.gen_time);\n$('#friendform').append(lot_number);\n$('#friendform').append(captcha_output);\n$('#friendform').append(pass_token);\n$('#friendform').append(gen_time);\n    })\n});\n});\n});\n</script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Geetest/Geetest_Memo.php",
    "content": "<div id=\"geetest_captcha\"></div>\n<script>\n$(function(){\n    $.getScript('<?php AssetsDir();?>assets/js/gt4.js',function(){\ninitGeetest4({\n    product: 'float',\n    captchaId: '<?php echo Bsoptions('geeid'); ?>'\n},function (captcha) {\n    $(\"#geetest_captcha\").empty();\n    captcha.appendTo(\"#geetest_captcha\");\n    captcha.onSuccess(function(){\n      document.getElementById(\"memosubmit\").removeAttribute(\"disabled\");\n      var result = captcha.getValidate();\n      var lot_number = $('<input type=\"text\" name=\"lot_number\" id=\"lot_number\" style=\"display:none\"/>');\n          lot_number.attr('value', result.lot_number);\n      var captcha_output = $('<input type=\"text\" name=\"captcha_output\" id=\"captcha_output\" style=\"display:none\"/>');\n          captcha_output.attr('value', result.captcha_output);\n      var pass_token = $('<input type=\"text\" name=\"pass_token\" id=\"pass_token\" style=\"display:none\"/>');\n          pass_token.attr('value', result.pass_token);\n      var gen_time = $('<input type=\"text\" name=\"gen_time\" id=\"gen_time\" style=\"display:none\"/>');\n          gen_time.attr('value', result.gen_time);\n$('#commentform').append(lot_number);\n$('#commentform').append(captcha_output);\n$('#commentform').append(pass_token);\n$('#commentform').append(gen_time);\n    })\n});\n});\n});\n</script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Geetest/Geetest_Message.php",
    "content": "<div id=\"geetest_captcha_m\"></div>\n<script>\n$(function(){\n    $.getScript('<?php AssetsDir();?>assets/js/gt4.js',function(){\ninitGeetest4({\n    product: 'float',\n    captchaId: '<?php echo Bsoptions('geeid'); ?>'\n},function (captcha) {\n    $(\"#geetest_captcha_m\").empty();\n    captcha.appendTo(\"#geetest_captcha_m\");\n    captcha.onSuccess(function(){\n      document.getElementById(\"commentsubmit\").removeAttribute(\"disabled\");\n      var result = captcha.getValidate();\n      var lot_number = $('<input type=\"text\" name=\"lot_number\" id=\"lot_number\" style=\"display:none\"/>');\n          lot_number.attr('value', result.lot_number);\n      var captcha_output = $('<input type=\"text\" name=\"captcha_output\" id=\"captcha_output\" style=\"display:none\"/>');\n          captcha_output.attr('value', result.captcha_output);\n      var pass_token = $('<input type=\"text\" name=\"pass_token\" id=\"pass_token\" style=\"display:none\"/>');\n          pass_token.attr('value', result.pass_token);\n      var gen_time = $('<input type=\"text\" name=\"gen_time\" id=\"gen_time\" style=\"display:none\"/>');\n          gen_time.attr('value', result.gen_time);\n$('#commentform').append(lot_number);\n$('#commentform').append(captcha_output);\n$('#commentform').append(pass_token);\n$('#commentform').append(gen_time);\n    })\n});\n});\n});\n</script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Turnstile/Turnstile.php",
    "content": "<div style=\"height:5px\"></div>\n<script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js?onload=onloadTurnstileCallback\" async defer></script>\n            <script id=\"turnstile-script\">\n            window.onloadTurnstileCallback=function(){eval(function(p,a,c,k,e,r){e=String;if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'[1-4]'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\\\\\b'+e(c)+'\\\\\\\\b','g'),k[c]);return p});turnstile.render('#turnstile_captcha',{sitekey:'<?php echo Bsoptions('turnstile_key'); ?>',theme:'<?php echo Bsoptions('turnstile_theme'); ?>',action:'comment',callback:function(token){document.getElementById(\"commentsubmit\").removeAttribute(\"disabled\");},})};\n            </script>\n            <div id=\"turnstile_captcha\"></div>\n"
  },
  {
    "path": "modules/Verify/BearCaptcha/Turnstile/Turnstile_Link.php",
    "content": "<div style=\"height:5px\"></div>\n<script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js?onload=onloadTurnstileCallback\" async defer></script>\n            <script id=\"turnstile-script\">\n            window.onloadTurnstileCallback=function(){eval(function(p,a,c,k,e,r){e=String;if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'[1-4]'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\\\\\b'+e(c)+'\\\\\\\\b','g'),k[c]);return p});turnstile.render('#turnstile_captcha',{sitekey:'<?php echo Bsoptions('turnstile_key'); ?>',theme:'<?php echo Bsoptions('turnstile_theme'); ?>',action:'comment',callback:function(token){$('#friendbtn').css(\"pointer-events\",\"auto\");},})};\n            </script>\n            <div id=\"turnstile_captcha\"></div>\n"
  },
  {
    "path": "modules/Verify/BearCaptcha/Turnstile/Turnstile_Memo.php",
    "content": "<div style=\"height:5px\"></div>\n<script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js?onload=onloadTurnstileCallback\" async defer></script>\n            <script id=\"turnstile-script\">\n            window.onloadTurnstileCallback=function(){eval(function(p,a,c,k,e,r){e=String;if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'[1-4]'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\\\\\b'+e(c)+'\\\\\\\\b','g'),k[c]);return p});turnstile.render('#turnstile_captcha',{sitekey:'<?php echo Bsoptions('turnstile_key'); ?>',theme:'<?php echo Bsoptions('turnstile_theme'); ?>',action:'comment',callback:function(token){document.getElementById(\"memosubmit\").removeAttribute(\"disabled\");},})};\n            </script>\n            <div id=\"turnstile_captcha\"></div>\n"
  },
  {
    "path": "modules/Verify/BearCaptcha/Vaptcha/Vaptcha.php",
    "content": "<style>\n                .VAPTCHA-init-main {\n            display: table;\n            width: 100%;\n            height: 100%;\n            background-color: #eeeeee;\n            \n        }\n\n        .VAPTCHA-init-loading {\n            display: table-cell;\n            vertical-align: middle;\n            text-align: center;\n          \n        }\n\n        .VAPTCHA-init-loading>a {\n            display: inline-block;\n            width: 18px;\n            height: 18px;\n            border: none;\n            \n        }\n\n        .VAPTCHA-init-loading .VAPTCHA-text {\n            font-family: sans-serif;\n            font-size: 12px;\n            color: #cccccc;\n            vertical-align: middle;\n            \n        }\n            </style><div style=\"height:5px\"></div>\n            <div id=\"VAPTCHAContainers\" style=\"width: 300px;height: 36px;\">\n        <div class=\"VAPTCHA-init-main\">\n            <div class=\"VAPTCHA-init-loading\">\n                <a href=\"/\" target=\"_blank\">\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"48px\"\n                        height=\"60px\" viewBox=\"0 0 24 30\"\n                        style=\"enable-background: new 0 0 50 50; width: 14px; height: 14px; vertical-align: middle\"\n                        xml:space=\"preserve\">\n                        <rect x=\"0\" y=\"9.22656\" width=\"4\" height=\"12.5469\" fill=\"#CCCCCC\">\n                            <animate attributeName=\"height\" attributeType=\"XML\" values=\"5;21;5\" begin=\"0s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                            <animate attributeName=\"y\" attributeType=\"XML\" values=\"13; 5; 13\" begin=\"0s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                        </rect>\n                        <rect x=\"10\" y=\"5.22656\" width=\"4\" height=\"20.5469\" fill=\"#CCCCCC\">\n                            <animate attributeName=\"height\" attributeType=\"XML\" values=\"5;21;5\" begin=\"0.15s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                            <animate attributeName=\"y\" attributeType=\"XML\" values=\"13; 5; 13\" begin=\"0.15s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                        </rect>\n                        <rect x=\"20\" y=\"8.77344\" width=\"4\" height=\"13.4531\" fill=\"#CCCCCC\">\n                            <animate attributeName=\"height\" attributeType=\"XML\" values=\"5;21;5\" begin=\"0.3s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                            <animate attributeName=\"y\" attributeType=\"XML\" values=\"13; 5; 13\" begin=\"0.3s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                        </rect>\n                    </svg>\n                </a>\n                <span class=\"VAPTCHA-text\">Vaptcha 初始化中...</span>\n            </div>\n        </div>\n    </div>\n            <script>\n            if($('#VAPTCHAContainers').length){\n                $.getScript('//v-cn.vaptcha.com/v3.js',function(){\n                vaptcha({\n            vid: '<?php echo Bsoptions('vid'); ?>',\n            mode: 'click',\n            scene: 1,\n            container: '#VAPTCHAContainers',\n            area: 'auto',\n        }).then(function (VAPTCHAObj) {\n            obj = VAPTCHAObj;\n            VAPTCHAObj.render();\n            VAPTCHAObj.renderTokenInput('#commentform');\n            VAPTCHAObj.listen('pass', function () {\n                document.getElementById(\"commentsubmit\").removeAttribute(\"disabled\");\n\n\n            })\n      \n        })\n                });\n            };\n    \n        $(document).on('pjax:complete', function() {  \n         if($('#VAPTCHAContainers').length){\n         $.getScript('https://v-cn.vaptcha.com/v3.js',function(){\n                vaptcha({\n            vid: '<?php echo Bsoptions('vid'); ?>',\n            mode: 'click',\n            scene: 1,\n            container: '#VAPTCHAContainers',\n            area: 'auto',\n        }).then(function (VAPTCHAObj) {\n             obj = VAPTCHAObj;\nVAPTCHAObj.renderTokenInput('#commentform');\n            VAPTCHAObj.render();\n\n            VAPTCHAObj.listen('pass', function () {\n                document.getElementById(\"commentsubmit\").removeAttribute(\"disabled\");\n            })\n        })\n         })\n         \n         }\n         \n    });\n\n     $(window).bind('popstate',function(event) {  \n                $.getScript('https://v-cn.vaptcha.com/v3.js',function(){\n                vaptcha({\n            vid: '<?php echo Bsoptions('vid'); ?>',\n            mode: 'click',\n            scene: 1,\n            container: '#VAPTCHAContainers',\n            area: 'auto',\n        }).then(function (VAPTCHAObj) {\n            obj = VAPTCHAObj;\n            VAPTCHAObj.renderTokenInput('#commentform');\n            VAPTCHAObj.render();\n            VAPTCHAObj.listen('pass', function () {\n                document.getElementById(\"commentsubmit\").removeAttribute(\"disabled\");\n            })\n        })\n                })\n    }); \n            </script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Vaptcha/Vaptcha_Link.php",
    "content": "<style>\n                .VAPTCHA-init-main {\n            display: table;\n            width: 100%;\n            height: 100%;\n            background-color: #eeeeee;\n            \n        }\n\n        .VAPTCHA-init-loading {\n            display: table-cell;\n            vertical-align: middle;\n            text-align: center;\n          \n        }\n\n        .VAPTCHA-init-loading>a {\n            display: inline-block;\n            width: 18px;\n            height: 18px;\n            border: none;\n            \n        }\n\n        .VAPTCHA-init-loading .VAPTCHA-text {\n            font-family: sans-serif;\n            font-size: 12px;\n            color: #cccccc;\n            vertical-align: middle;\n            \n        }\n            </style><div style=\"height:5px\"></div>\n            <div id=\"VAPTCHAContainers\" style=\"width: 300px;height: 36px;\">\n        <div class=\"VAPTCHA-init-main\">\n            <div class=\"VAPTCHA-init-loading\">\n                <a href=\"/\" target=\"_blank\">\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"48px\"\n                        height=\"60px\" viewBox=\"0 0 24 30\"\n                        style=\"enable-background: new 0 0 50 50; width: 14px; height: 14px; vertical-align: middle\"\n                        xml:space=\"preserve\">\n                        <rect x=\"0\" y=\"9.22656\" width=\"4\" height=\"12.5469\" fill=\"#CCCCCC\">\n                            <animate attributeName=\"height\" attributeType=\"XML\" values=\"5;21;5\" begin=\"0s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                            <animate attributeName=\"y\" attributeType=\"XML\" values=\"13; 5; 13\" begin=\"0s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                        </rect>\n                        <rect x=\"10\" y=\"5.22656\" width=\"4\" height=\"20.5469\" fill=\"#CCCCCC\">\n                            <animate attributeName=\"height\" attributeType=\"XML\" values=\"5;21;5\" begin=\"0.15s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                            <animate attributeName=\"y\" attributeType=\"XML\" values=\"13; 5; 13\" begin=\"0.15s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                        </rect>\n                        <rect x=\"20\" y=\"8.77344\" width=\"4\" height=\"13.4531\" fill=\"#CCCCCC\">\n                            <animate attributeName=\"height\" attributeType=\"XML\" values=\"5;21;5\" begin=\"0.3s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                            <animate attributeName=\"y\" attributeType=\"XML\" values=\"13; 5; 13\" begin=\"0.3s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                        </rect>\n                    </svg>\n                </a>\n                <span class=\"VAPTCHA-text\">Vaptcha 初始化中...</span>\n            </div>\n        </div>\n    </div>\n            <script>\n            if($('#VAPTCHAContainers').length){\n                $.getScript('//v-cn.vaptcha.com/v3.js',function(){\n                vaptcha({\n            vid: '<?php echo Bsoptions('vid'); ?>',\n            mode: 'click',\n            scene: 1,\n            container: '#VAPTCHAContainers',\n            area: 'auto',\n        }).then(function (VAPTCHAObj) {\n            obj = VAPTCHAObj;\n            VAPTCHAObj.render();\n            VAPTCHAObj.renderTokenInput('#friendform');\n            VAPTCHAObj.listen('pass', function () {\n                $('#friendbtn').css(\"pointer-events\",\"auto\");\n\n\n            })\n      \n        })\n                });\n            };\n    \n        $(document).on('pjax:complete', function() {  \n         if($('#VAPTCHAContainers').length){\n         $.getScript('https://v-cn.vaptcha.com/v3.js',function(){\n                vaptcha({\n            vid: '<?php echo Bsoptions('vid'); ?>',\n            mode: 'click',\n            scene: 1,\n            container: '#VAPTCHAContainers',\n            area: 'auto',\n        }).then(function (VAPTCHAObj) {\n             obj = VAPTCHAObj;\nVAPTCHAObj.renderTokenInput('#friendform');\n            VAPTCHAObj.render();\n\n            VAPTCHAObj.listen('pass', function () {\n                $('#friendbtn').css(\"pointer-events\",\"auto\");\n            })\n        })\n         })\n         \n         }\n         \n    });\n\n     $(window).bind('popstate',function(event) {  \n                $.getScript('https://v-cn.vaptcha.com/v3.js',function(){\n                vaptcha({\n            vid: '<?php echo Bsoptions('vid'); ?>',\n            mode: 'click',\n            scene: 1,\n            container: '#VAPTCHAContainers',\n            area: 'auto',\n        }).then(function (VAPTCHAObj) {\n            obj = VAPTCHAObj;\n            VAPTCHAObj.renderTokenInput('#friendform');\n            VAPTCHAObj.render();\n            VAPTCHAObj.listen('pass', function () {\n                $('#friendbtn').css(\"pointer-events\",\"auto\");\n            })\n        })\n                })\n    }); \n            </script>"
  },
  {
    "path": "modules/Verify/BearCaptcha/Vaptcha/Vaptcha_Memo.php",
    "content": "<style>\n                .VAPTCHA-init-main {\n            display: table;\n            width: 100%;\n            height: 100%;\n            background-color: #eeeeee;\n            \n        }\n\n        .VAPTCHA-init-loading {\n            display: table-cell;\n            vertical-align: middle;\n            text-align: center;\n          \n        }\n\n        .VAPTCHA-init-loading>a {\n            display: inline-block;\n            width: 18px;\n            height: 18px;\n            border: none;\n            \n        }\n\n        .VAPTCHA-init-loading .VAPTCHA-text {\n            font-family: sans-serif;\n            font-size: 12px;\n            color: #cccccc;\n            vertical-align: middle;\n            \n        }\n            </style><div style=\"height:5px\"></div>\n            <div id=\"VAPTCHAContainers\" style=\"width: 300px;height: 36px;\">\n        <div class=\"VAPTCHA-init-main\">\n            <div class=\"VAPTCHA-init-loading\">\n                <a href=\"/\" target=\"_blank\">\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"48px\"\n                        height=\"60px\" viewBox=\"0 0 24 30\"\n                        style=\"enable-background: new 0 0 50 50; width: 14px; height: 14px; vertical-align: middle\"\n                        xml:space=\"preserve\">\n                        <rect x=\"0\" y=\"9.22656\" width=\"4\" height=\"12.5469\" fill=\"#CCCCCC\">\n                            <animate attributeName=\"height\" attributeType=\"XML\" values=\"5;21;5\" begin=\"0s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                            <animate attributeName=\"y\" attributeType=\"XML\" values=\"13; 5; 13\" begin=\"0s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                        </rect>\n                        <rect x=\"10\" y=\"5.22656\" width=\"4\" height=\"20.5469\" fill=\"#CCCCCC\">\n                            <animate attributeName=\"height\" attributeType=\"XML\" values=\"5;21;5\" begin=\"0.15s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                            <animate attributeName=\"y\" attributeType=\"XML\" values=\"13; 5; 13\" begin=\"0.15s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                        </rect>\n                        <rect x=\"20\" y=\"8.77344\" width=\"4\" height=\"13.4531\" fill=\"#CCCCCC\">\n                            <animate attributeName=\"height\" attributeType=\"XML\" values=\"5;21;5\" begin=\"0.3s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                            <animate attributeName=\"y\" attributeType=\"XML\" values=\"13; 5; 13\" begin=\"0.3s\" dur=\"0.6s\"\n                                repeatCount=\"indefinite\"></animate>\n                        </rect>\n                    </svg>\n                </a>\n                <span class=\"VAPTCHA-text\">Vaptcha 初始化中...</span>\n            </div>\n        </div>\n    </div>\n            <script>\n            if($('#VAPTCHAContainers').length){\n                $.getScript('//v-cn.vaptcha.com/v3.js',function(){\n                vaptcha({\n            vid: '<?php echo Bsoptions('vid'); ?>',\n            mode: 'click',\n            scene: 1,\n            container: '#VAPTCHAContainers',\n            area: 'auto',\n        }).then(function (VAPTCHAObj) {\n            obj = VAPTCHAObj;\n            VAPTCHAObj.render();\n            VAPTCHAObj.renderTokenInput('#commentform');\n            VAPTCHAObj.listen('pass', function () {\n                document.getElementById(\"memosubmit\").removeAttribute(\"disabled\");\n\n\n            })\n      \n        })\n                });\n            };\n    \n        $(document).on('pjax:complete', function() {  \n         if($('#VAPTCHAContainers').length){\n         $.getScript('https://v-cn.vaptcha.com/v3.js',function(){\n                vaptcha({\n            vid: '<?php echo Bsoptions('vid'); ?>',\n            mode: 'click',\n            scene: 1,\n            container: '#VAPTCHAContainers',\n            area: 'auto',\n        }).then(function (VAPTCHAObj) {\n             obj = VAPTCHAObj;\nVAPTCHAObj.renderTokenInput('#commentform');\n            VAPTCHAObj.render();\n\n            VAPTCHAObj.listen('pass', function () {\n                document.getElementById(\"memosubmit\").removeAttribute(\"disabled\");\n            })\n        })\n         })\n         \n         }\n         \n    });\n\n     $(window).bind('popstate',function(event) {  \n                $.getScript('https://v-cn.vaptcha.com/v3.js',function(){\n                vaptcha({\n            vid: '<?php echo Bsoptions('vid'); ?>',\n            mode: 'click',\n            scene: 1,\n            container: '#VAPTCHAContainers',\n            area: 'auto',\n        }).then(function (VAPTCHAObj) {\n            obj = VAPTCHAObj;\n            VAPTCHAObj.renderTokenInput('#commentform');\n            VAPTCHAObj.render();\n            VAPTCHAObj.listen('pass', function () {\n                document.getElementById(\"memosubmit\").removeAttribute(\"disabled\");\n            })\n        })\n                })\n    }); \n            </script>"
  },
  {
    "path": "modules/codehightlight/static/prism.js",
    "content": "/* PrismJS 1.29.0\nhttps://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 */\nvar _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,\"&amp;\").replace(/</g,\"&lt;\").replace(/\\u00a0/g,\" \")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,\"__id\",{value:++t}),e.__id},clone:function e(n,t){var r,i;switch(t=t||{},a.util.type(n)){case\"Object\":if(i=a.util.objId(n),t[i])return t[i];for(var l in r={},t[i]=r,n)n.hasOwnProperty(l)&&(r[l]=e(n[l],t));return r;case\"Array\":return i=a.util.objId(n),t[i]?t[i]:(r=[],t[i]=r,n.forEach((function(n,a){r[a]=e(n,t)})),r);default:return n}},getLanguage:function(e){for(;e;){var t=n.exec(e.className);if(t)return t[1].toLowerCase();e=e.parentElement}return\"none\"},setLanguage:function(e,t){e.className=e.className.replace(RegExp(n,\"gi\"),\"\"),e.classList.add(\"language-\"+t)},currentScript:function(){if(\"undefined\"==typeof document)return null;if(\"currentScript\"in document)return document.currentScript;try{throw new Error}catch(r){var e=(/at [^(\\r\\n]*\\((.*):[^:]+:[^:]+\\)$/i.exec(r.stack)||[])[1];if(e){var n=document.getElementsByTagName(\"script\");for(var t in n)if(n[t].src==e)return n[t]}return null}},isActive:function(e,n,t){for(var r=\"no-\"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:r,plaintext:r,text:r,txt:r,extend:function(e,n){var t=a.util.clone(a.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(e,n,t,r){var i=(r=r||a.languages)[e],l={};for(var o in i)if(i.hasOwnProperty(o)){if(o==n)for(var s in t)t.hasOwnProperty(s)&&(l[s]=t[s]);t.hasOwnProperty(o)||(l[o]=i[o])}var u=r[e];return r[e]=l,a.languages.DFS(a.languages,(function(n,t){t===u&&n!=e&&(this[n]=l)})),l},DFS:function e(n,t,r,i){i=i||{};var l=a.util.objId;for(var o in n)if(n.hasOwnProperty(o)){t.call(n,o,n[o],r||o);var s=n[o],u=a.util.type(s);\"Object\"!==u||i[l(s)]?\"Array\"!==u||i[l(s)]||(i[l(s)]=!0,e(s,t,o,i)):(i[l(s)]=!0,e(s,t,null,i))}}},plugins:{},highlightAll:function(e,n){a.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'};a.hooks.run(\"before-highlightall\",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),a.hooks.run(\"before-all-elements-highlight\",r);for(var i,l=0;i=r.elements[l++];)a.highlightElement(i,!0===n,r.callback)},highlightElement:function(n,t,r){var i=a.util.getLanguage(n),l=a.languages[i];a.util.setLanguage(n,i);var o=n.parentElement;o&&\"pre\"===o.nodeName.toLowerCase()&&a.util.setLanguage(o,i);var s={element:n,language:i,grammar:l,code:n.textContent};function u(e){s.highlightedCode=e,a.hooks.run(\"before-insert\",s),s.element.innerHTML=s.highlightedCode,a.hooks.run(\"after-highlight\",s),a.hooks.run(\"complete\",s),r&&r.call(s.element)}if(a.hooks.run(\"before-sanity-check\",s),(o=s.element.parentElement)&&\"pre\"===o.nodeName.toLowerCase()&&!o.hasAttribute(\"tabindex\")&&o.setAttribute(\"tabindex\",\"0\"),!s.code)return a.hooks.run(\"complete\",s),void(r&&r.call(s.element));if(a.hooks.run(\"before-highlight\",s),s.grammar)if(t&&e.Worker){var c=new Worker(a.filename);c.onmessage=function(e){u(e.data)},c.postMessage(JSON.stringify({language:s.language,code:s.code,immediateClose:!0}))}else u(a.highlight(s.code,s.grammar,s.language));else u(a.util.encode(s.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};if(a.hooks.run(\"before-tokenize\",r),!r.grammar)throw new Error('The language \"'+r.language+'\" has no grammar.');return r.tokens=a.tokenize(r.code,r.grammar),a.hooks.run(\"after-tokenize\",r),i.stringify(a.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new s;return u(a,a.head,e),o(e,a,n,a.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=a.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=a.hooks.all[e];if(t&&t.length)for(var r,i=0;r=t[i++];)r(n)}},Token:i};function i(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||\"\").length}function l(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function o(e,n,t,r,s,g){for(var f in t)if(t.hasOwnProperty(f)&&t[f]){var h=t[f];h=Array.isArray(h)?h:[h];for(var d=0;d<h.length;++d){if(g&&g.cause==f+\",\"+d)return;var v=h[d],p=v.inside,m=!!v.lookbehind,y=!!v.greedy,k=v.alias;if(y&&!v.pattern.global){var x=v.pattern.toString().match(/[imsuy]*$/)[0];v.pattern=RegExp(v.pattern.source,x+\"g\")}for(var b=v.pattern||v,w=r.next,A=s;w!==n.tail&&!(g&&A>=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&&(j<O||\"string\"==typeof C.value);C=C.next)L++,j+=C.value.length;L--,E=e.slice(A,j),P.index-=A}else if(!(P=l(b,0,E,m)))continue;S=P.index;var N=P[0],_=E.slice(0,S),M=E.slice(S+N.length),W=A+E.length;g&&W>g.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<t&&r!==e.tail;a++)r=r.next;n.next=r,r.prev=n,e.length-=a}if(e.Prism=a,i.stringify=function e(n,t){if(\"string\"==typeof n)return n;if(Array.isArray(n)){var r=\"\";return n.forEach((function(n){r+=e(n,t)})),r}var i={type:n.type,content:e(n.content,t),tag:\"span\",classes:[\"token\",n.type],attributes:{},language:t},l=n.alias;l&&(Array.isArray(l)?Array.prototype.push.apply(i.classes,l):i.classes.push(l)),a.hooks.run(\"wrap\",i);var o=\"\";for(var s in i.attributes)o+=\" \"+s+'=\"'+(i.attributes[s]||\"\").replace(/\"/g,\"&quot;\")+'\"';return\"<\"+i.tag+' class=\"'+i.classes.join(\" \")+'\"'+o+\">\"+i.content+\"</\"+i.tag+\">\"},!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);\nPrism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\\s\\S])*?-->/,greedy:!0},prolog:{pattern:/<\\?[\\s\\S]+?\\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>\"'[\\]]|\"[^\"]*\"|'[^']*')+(?:\\[(?:[^<\"'\\]]|\"[^\"]*\"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\\]\\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:/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/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(/&amp;/,\"&\"))})),Object.defineProperty(Prism.languages.markup.tag,\"addInlined\",{value:function(a,e){var s={};s[\"language-\"+e]={pattern:/(^<!\\[CDATA\\[)[\\s\\S]+?(?=\\]\\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\\[CDATA\\[|\\]\\]>$/i;var t={\"included-cdata\":{pattern:/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,inside:s}};t[\"language-\"+e]={pattern:/[\\s\\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp(\"(<__[^>]*>)(?:<!\\\\[CDATA\\\\[(?:[^\\\\]]|\\\\](?!\\\\]>))*\\\\]\\\\]>|(?!<!\\\\[CDATA\\\\[)[^])*?(?=</__>)\".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;\n!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);\nPrism.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:/[{}[\\];(),.:]/};\nPrism.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;\nPrism.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:/[,.:()]/};\n!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);\nPrism.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}});\nPrism.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};\n!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);\nPrism.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:/[()\\[\\]{}:.;,]/};\nPrism.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;\nPrism.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:/\\^?.*\\$|\\^.*\\$?/};\nPrism.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:/[;[\\]()`,.]/};\n!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*[<\\\\[])|(?!<keyword>))[A-Z_]\\\\w*(?:\\\\s*\\\\.\\\\s*[A-Z_]\\\\w*)*\\\\b(?:\\\\s*(?:\\\\[\\\\s*\\\\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*\".replace(/<keyword>/g,(function(){return t.source}));function i(e){return RegExp(e.replace(/<CLASS-NAME>/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+)<CLASS-NAME>\"),lookbehind:!0,inside:a},{pattern:i(\"(\\\\(\\\\s*)<CLASS-NAME>(?=\\\\s*\\\\)\\\\s*[\\\\w(])\"),lookbehind:!0,inside:a},{pattern:i(\"<CLASS-NAME>(?=\\\\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);\nPrism.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\"}};\nPrism.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:/[{}():,¬«»《》]/};\nPrism.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:/::|[?.:,;()[\\]{}]/};\nPrism.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;\n!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(?!<keyword>)\\\\w+(?:\\\\s*\\\\.\\\\s*\\\\w+)*\\\\b\".replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend(\"c\",{\"class-name\":[{pattern:RegExp(\"(\\\\b(?:class|concept|enum|struct|typename)\\\\s+)(?!<keyword>)\\\\w+\".replace(/<keyword>/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]*>|'+\"<mod-name>(?:\\\\s*:\\\\s*<mod-name>)?|:\\\\s*<mod-name>\".replace(/<mod-name>/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);\nPrism.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;\nPrism.languages.arff={comment:/%.*/,string:{pattern:/([\"'])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,greedy:!0},keyword:/@(?:attribute|data|end|relation)\\b/i,number:/\\b\\d+(?:\\.\\d+)?\\b/,punctuation:/[{},]/};\nPrism.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;\n!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);\n!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]*)<?\\d*>/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<a;e++)n[t[e]]=i[t[e]];return n}n.inside.interpreted.inside.rest=e(\"macro inline replacement entity\"),i[\"passthrough-block\"].inside.rest=e(\"macro\"),i[\"literal-block\"].inside.rest=e(\"callout\"),i.table.inside.rest=e(\"comment-block passthrough-block literal-block other-block list-punctuation indented-block comment title attribute-entry attributes hr page-break admonition list-label callout macro inline replacement entity line-continuation\"),i[\"other-block\"].inside.rest=e(\"table list-punctuation indented-block comment attribute-entry attributes hr page-break admonition list-label macro inline replacement entity line-continuation\"),i.title.inside.rest=e(\"macro inline replacement entity\"),t.hooks.add(\"wrap\",(function(t){\"entity\"===t.type&&(t.attributes.title=t.content.replace(/&amp;/,\"&\"))})),t.languages.adoc=t.languages.asciidoc}(Prism);\n!function(e){function n(e,n){return e.replace(/<<(\\d+)>>/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<n;s++)e=e.replace(/<<self>>/g,(function(){return\"(?:\"+e+\")\"}));return e.replace(/<<self>>/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(\"<(?:[^<>;=+\\\\-*/%&|^]|<<self>>)*>\",2),b=a(\"\\\\((?:[^()]|<<self>>)*\\\\)\",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>>|\\\\(<<self>>*\\\\)\",[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>>|\\\\(<<self>>*\\\\)\",[R]),2),P=n(\"\\\\{(?!\\\\{)(?:(?![}:])<<0>>)*<<1>>?\\\\}\",[F,A]),U=a(n(\"[^\\\"'/()]|/(?!\\\\*)|/\\\\*(?:[^*]|\\\\*(?!/))*\\\\*/|<<0>>|\\\\(<<self>>*\\\\)\",[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);\nPrism.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:/(<script(?=.*runat=['\"]?server\\b)[^>]*>)[\\s\\S]*?(?=<\\/script>)/i,lookbehind:!0,alias:[\"asp\",\"script\"],inside:Prism.languages.csharp||{}}});\nPrism.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:/[(),:]/};\nPrism.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:/[(),:]/};\nPrism.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:/[{}[\\]():,]/};\nPrism.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:/[\\[\\]().,:]/};\n!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);\nPrism.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\"];\nPrism.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;\n!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<s.length;i++)o[s[i]]=e.languages.bash[s[i]];e.languages.sh=e.languages.bash,e.languages.shell=e.languages.bash}(Prism);\nPrism.languages.basic={comment:{pattern:/(?:!|REM\\b).+/i,inside:{keyword:/^REM/i}},string:{pattern:/\"(?:\"\"|[!#$%&'()*,\\/:;<=>?^\\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:/[,;:()]/};\n!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);\nPrism.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;\n!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);\nPrism.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;\nPrism.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\"}});\nPrism.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:/%[%?]|[|:;\\[\\]<>]/}}});\nPrism.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;\nPrism.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:/[←⇐↩(){}⟨⟩[\\]‿·⋄,.;:?]/};\nPrism.languages.brainfuck={pointer:{pattern:/<|>/,alias:\"keyword\"},increment:{pattern:/\\+/,alias:\"inserted\"},decrement:{pattern:/-/,alias:\"deleted\"},branching:{pattern:/\\[|\\]/,alias:\"important\"},operator:/[.,]/,comment:/\\S+/};\nPrism.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;\nPrism.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:/[{}[\\];(),.:]/};\nPrism.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;\nPrism.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;\nPrism.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]+/}}});\nPrism.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]+/};\nPrism.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;\nPrism.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;\nPrism.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:/[{}\\[\\](),]/};\nPrism.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:/[()>}]|\\$[<{]/};\nPrism.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:/[.:,()]/};\n!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);\nPrism.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;\n!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);\n!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);\n!function(e){for(var t=\"\\\\(\\\\*(?:[^(*]|\\\\((?!\\\\*)|\\\\*(?!\\\\))|<self>)*\\\\*\\\\)\",i=0;i<2;i++)t=t.replace(/<self>/g,(function(){return t}));t=t.replace(/<self>/g,\"[]\"),e.languages.coq={comment:RegExp(t),string:{pattern:/\"(?:[^\"]|\"\")*\"(?!\")/,greedy:!0},attribute:[{pattern:RegExp('#\\\\[(?:[^\\\\[\\\\](\"]|\"(?:[^\"]|\"\")*\"(?!\")|\\\\((?!\\\\*)|<comment>)*\\\\]'.replace(/<comment>/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);\n!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);\n!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);\n!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);\nPrism.languages.csv={value:/[^\\r\\n,\"]+|\"(?:[^\"]|\"\")*\"(?!\")/,punctuation:/,/};\n!function(e){var n=\"(?:\"+\"\\\"\\\"\\\"(?:[^\\\\\\\\\\\"]|\\\"(?!\\\"\\\"\\\\2)|<esc>)*\\\"\\\"\\\"|'''(?:[^\\\\\\\\']|'(?!''\\\\2)|<esc>)*'''|\\\"(?:[^\\\\\\\\\\r\\n\\\"]|\\\"(?!\\\\2)|<esc>)*\\\"|'(?:[^\\\\\\\\\\r\\n']|'(?!\\\\2)|<esc>)*'\".replace(/<esc>/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);\nPrism.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:/[()[\\]{},;.]/};\nPrism.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\"}});\n!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);\n!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);\nPrism.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:/[;\\[\\](){}`,.]/};\nPrism.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;\n!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);\n!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<i.length&&!(r>=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);\n!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);\nPrism.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\"];\n!function(e){var n=\"(?:[ \\t]+(?![ \\t])(?:<SP_BS>)?|<SP_BS>)\".replace(/<SP_BS>/g,(function(){return\"\\\\\\\\[\\r\\n](?:\\\\s|\\\\\\\\[\\r\\n]|#.*(?!.))*(?![\\\\s#]|\\\\\\\\[\\r\\n])\"})),r=\"\\\"(?:[^\\\"\\\\\\\\\\r\\n]|\\\\\\\\(?:\\r\\n|[^]))*\\\"|'(?:[^'\\\\\\\\\\r\\n]|\\\\\\\\(?:\\r\\n|[^]))*'\",t=\"--[\\\\w-]+=(?:<STR>|(?![\\\"'])(?:[^\\\\s\\\\\\\\]|\\\\\\\\.)+)\".replace(/<STR>/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(/<OPT>/g,(function(){return t})).replace(/<SP>/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<SP>)?\\\\w+<SP>)<OPT>(?:<SP><OPT>)*\",\"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<SP>)?HEALTHCHECK<SP>(?:<OPT><SP>)*)(?:CMD|NONE)\\\\b\",\"i\"),lookbehind:!0,greedy:!0},{pattern:a(\"(^(?:ONBUILD<SP>)?FROM<SP>(?:<OPT><SP>)*(?!--)[^ \\t\\\\\\\\]+<SP>)AS\",\"i\"),lookbehind:!0,greedy:!0},{pattern:a(\"(^ONBUILD<SP>)\\\\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);\n!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(/<ID>/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]+)<ID>\",\"i\"),lookbehind:!0,greedy:!0,alias:\"class-name\",inside:n},\"attr-value\":{pattern:r(\"(=[ \\t\\r\\n]*)<ID>\"),lookbehind:!0,greedy:!0,inside:n},\"attr-name\":{pattern:r(\"([\\\\[;, \\t\\r\\n])<ID>(?=[ \\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\\\\\\\\])<ID>\"),lookbehind:!0,greedy:!0,inside:n},operator:/[=:]|-[->]/,punctuation:/[\\[\\]{};,]/},e.languages.gv=e.languages.dot}(Prism);\nPrism.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:/[-=|*/!]/};\nPrism.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:/^=/}}};\nPrism.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:/\\\\\\\\|\\|\\.\\.\\||\\.\\.|\\/[~\\/=]?|[><]=?|[-+*^=~]/};\n!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);\nPrism.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}}}}));\nPrism.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:/[{}[\\]|(),.:]/};\nPrism.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:/[\\[\\](){},;]|\\.+|:+/};\n!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);\n!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);\nPrism.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:/[()[\\]{}:;,.#|]|<<|>>/};\nPrism.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\"];\nPrism.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|<-|->|[!=:]=|<?\\|{1,3}>?|\\??(?:<=|>=|<>|[-+*/%=<>])\\??|[!?^&]|~[+~-]|:>|:\\?>?/}),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}});\n!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\",\"<wrapper>\",\"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\",\"<PRIVATE\",\">>>>>>\",\"<<<<<<<\",\"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?\",\"<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\",\"<iota>\",\"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?\",\"<reversed>\",\"3append-as\",\"virtual-sequence\",\"subseq?\",\"remove-nth!\",\"length\",\"last-index\",\"lengthen\",\"assert-sequence\",\"copy\",\"move\",\"third\",\"first\",\"tail?\",\"set-first\",\"prefix\",\"bounds-error\",\"<repetition>\",\"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\",\"<fp-nan>\",\"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\",\"input<sequence\",\"append-outputs\",\"drop-inputs\",\"inputs\",\"smart-2reduce\",\"drop-outputs\",\"smart-reduce\",\"preserving\",\"smart-when\",\"outputs\",\"append-outputs-as\",\"smart-unless\",\"smart-if*\",\"sum-outputs\",\"input<sequence-unsafe\",\"output>sequence\"]),e.languages.factor=i}(Prism);\n!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:/[()<BDO®]/,alias:\"bold\"}}}(Prism);\nPrism.languages[\"firestore-security-rules\"]=Prism.languages.extend(\"clike\",{comment:/\\/\\/.*/,keyword:/\\b(?:allow|function|if|match|null|return|rules_version|service)\\b/,operator:/&&|\\|\\||[<>!=]=?|[-+*/%]|\\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:/,/}}});\n!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);\nPrism.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:/\\(\\/|\\/\\)|[(),;:&]/};\n!function(e){for(var t=\"[^<()\\\"']|\\\\((?:<expr>)*\\\\)|<(?!#--)|<#--(?:[^-]|-(?!->))*--\\x3e|\\\"(?:[^\\\\\\\\\\\"]|\\\\\\\\.)*\\\"|'(?:[^\\\\\\\\']|\\\\\\\\.)*'\",n=0;n<2;n++)t=t.replace(/<expr>/g,(function(){return t}));t=t.replace(/<expr>/g,\"[^\\\\s\\\\S]\");var i={comment:/<#--[\\s\\S]*?-->/,string:[{pattern:/\\br(\"|')(?:(?!\\1)[^\\\\]|\\\\.)*\\1/,greedy:!0},{pattern:RegExp(\"(\\\"|')(?:(?!\\\\1|\\\\$\\\\{)[^\\\\\\\\]|\\\\\\\\.|\\\\$\\\\{(?:(?!\\\\})(?:<expr>))*\\\\})*\\\\1\".replace(/<expr>/g,(function(){return t}))),greedy:!0,inside:{interpolation:{pattern:RegExp(\"((?:^|[^\\\\\\\\])(?:\\\\\\\\\\\\\\\\)*)\\\\$\\\\{(?:(?!\\\\})(?:<expr>))*\\\\}\".replace(/<expr>/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|</?[#@][a-zA-Z](?:<expr>)*?>|\\\\$\\\\{(?:<expr>)*?\\\\}\".replace(/<expr>/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);\nPrism.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/});\nPrism.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;\nPrism.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:/[:*]/};\nPrism.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:/[.:,;()[\\]{}]/};\nPrism.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\"}};\nPrism.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;\n!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);\nPrism.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};\nPrism.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/});\nPrism.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;\nPrism.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\"];\nPrism.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\"];\nPrism.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:/[()[\\],]/};\n!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);\nPrism.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;e<t.length;){var a=t[e++];if(\"keyword\"===a.type&&\"mutation\"===a.content){var r=[];if(c([\"definition-mutation\",\"punctuation\"])&&\"(\"===l(1).content){e+=2;var i=f(/^\\($/,/^\\)$/);if(-1===i)continue;for(;e<i;e++){var o=l(0);\"variable\"===o.type&&(b(o,\"variable-input\"),r.push(o.content))}e=i+1}if(c([\"punctuation\",\"property-query\"])&&\"{\"===l(0).content&&(e++,b(l(0),\"property-mutation\"),r.length>0)){var s=f(/^\\{$/,/^\\}$/);if(-1===s)continue;for(var u=e;u<s;u++){var p=t[u];\"variable\"===p.type&&r.indexOf(p.content)>=0&&b(p,\"variable-input\")}}}}function l(n){return t[e+n]}function c(n,t){t=t||0;for(var e=0;e<n.length;e++){var a=l(e+t);if(!a||a.type!==n[e])return!1}return!0}function f(n,a){for(var r=1,i=e;i<t.length;i++){var o=t[i],s=o.content;if(\"punctuation\"===o.type&&\"string\"==typeof s)if(n.test(s))r++;else if(a.test(s)&&0==--r)return i}return-1}function b(n,t){var e=n.alias;e?Array.isArray(e)||(n.alias=e=[e]):n.alias=e=[],e.push(t)}}));\n!function(e){var n={pattern:/((?:^|[^\\\\$])(?:\\\\{2})*)\\$(?:\\w+|\\{[^{}]*\\})/,lookbehind:!0,inside:{\"interpolation-punctuation\":{pattern:/^\\$\\{?|\\}$/,alias:\"punctuation\"},expression:{pattern:/[\\s\\S]+/,inside:null}}};e.languages.groovy=e.languages.extend(\"clike\",{string:{pattern:/'''(?:[^\\\\]|\\\\[\\s\\S])*?'''|'(?:\\\\.|[^\\\\'\\r\\n])*'/,greedy:!0},keyword:/\\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\\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(\"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);\n!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<a;r++){var i=e[r];i=\"string\"==typeof i?{filter:i,language:i}:i,n.languages[i.language]&&(t[\"filter-\"+i.filter]={pattern:RegExp(\"((?:^|\\\\r?\\\\n|\\\\r)([\\\\t ]*)):{{filter_name}}(?:(?:\\\\r?\\\\n|\\\\r)(?:\\\\2[\\\\t ].+|\\\\s*?(?=\\\\r?\\\\n|\\\\r)))+\".replace(\"{{filter_name}}\",(function(){return i.filter}))),lookbehind:!0,inside:{\"filter-name\":{pattern:/^:[\\w-]+/,alias:\"symbol\"},text:{pattern:/[\\s\\S]+/,alias:[i.language,\"language-\"+i.language],inside:n.languages[i.language]}}})}n.languages.insertBefore(\"haml\",\"filter\",t)}(Prism);\n!function(a){a.languages.handlebars={comment:/\\{\\{![\\s\\S]*?\\}\\}/,delimiter:{pattern:/^\\{\\{\\{?|\\}\\}\\}?$/,alias:\"punctuation\"},string:/([\"'])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,number:/\\b0x[\\dA-Fa-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[Ee][+-]?\\d+)?/,boolean:/\\b(?:false|true)\\b/,block:{pattern:/^(\\s*(?:~\\s*)?)[#\\/]\\S+?(?=\\s*(?:~\\s*)?$|\\s)/,lookbehind:!0,alias:\"keyword\"},brackets:{pattern:/\\[[^\\]]+\\]/,inside:{punctuation:/\\[|\\]/,variable:/[\\s\\S]+/}},punctuation:/[!\"#%&':()*+,.\\/;<=>@\\[\\\\\\]^`{|}~]/,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);\nPrism.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;\nPrism.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\"}});\nPrism.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:/[=\\[\\]{}]/};\nPrism.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/});\nPrism.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:/\\.[\\^\\+\\*=\\?]|![><:\\.=\\?!]|=[>|:,\\.\\-\\^<+;/~\\*\\?]|\\?[>|:\\.\\-\\^<\\+&~=@!]|\\|[\\$_%:\\.\\-\\^~\\*=@\\?]|\\+[|\\$\\+\\*]|:[_\\-\\^\\+~\\*]|%[_:\\.\\-\\^\\+~\\*=]|\\^[|:\\.\\-\\+&~\\*=\\?]|\\$[|_%:<>\\-\\^&~@=\\?]|;[:<\\+;\\/~\\*=]|~[>|\\$_%<\\+\\/&=\\?!]|--|==/};\n!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);\nPrism.languages.hpkp={directive:{pattern:/\\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\\s;=]|$)/i,alias:\"property\"},operator:/=/,punctuation:/;/};\nPrism.languages.hsts={directive:{pattern:/\\b(?:includeSubDomains|max-age|preload)(?=[\\s;=]|$)/i,alias:\"property\"},operator:/=/,punctuation:/;/};\nPrism.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:/[\\[,;:()\\]]/};\nPrism.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:/[\\[\\](){},;]/};\n!function(e){function t(e,s){return s<=0?\"[]\":e.replace(/<SELF>/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(\"\\\\{(?:[^{}']|'(?![{},'])|''|<STR>|<SELF>)*\\\\}\".replace(/<STR>/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(\"(?:[^{}']|'[^']*'|\\\\{(?:<SELF>)?\\\\})+\",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);\nPrism.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;\n!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);\nPrism.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\"};\nPrism.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:/=/};\nPrism.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:/[=!*/%+\\-^&|]=|>>?=?|<<?=?|:?:?=|\\+\\+?|--?|\\*\\*?|\\/\\/?|%|\\|\\|?|&&?|\\b(?:and|not|or|return)\\b|@@?|\\?\\??|\\.\\./,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.j={comment:{pattern:/\\bNB\\..*/,greedy:!0},string:{pattern:/'(?:''|[^'\\r\\n])*'/,greedy:!0},keyword:/\\b(?:(?:CR|LF|adverb|conjunction|def|define|dyad|monad|noun|verb)\\b|(?:assert|break|case|catch[dt]?|continue|do|else|elseif|end|fcase|for|for_\\w+|goto_\\w+|if|label_\\w+|return|select|throw|try|while|whilst)\\.)/,verb:{pattern:/(?!\\^:|;\\.|[=!][.:])(?:\\{(?:\\.|::?)?|p(?:\\.\\.?|:)|[=!\\]]|[<>+*\\-%$|,#][.:]?|[?^]\\.?|[;\\[]:?|[~}\"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:/[()]/};\n!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+)(?!<keyword>)[a-z]\\\\w*(?:\\\\.[a-z]\\\\w*)*\\\\.?\".replace(/<keyword>/g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\\./}}})}(Prism);\n!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);\n!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<s;i++)o[i]instanceof RegExp&&(o[i]={pattern:o[i]}),n(o[i]);else n(o)}}(e,(function(a){a.inside||(a.inside={}),a.inside.rest=n}))}))}}),e.addSupport([\"java\",\"javascript\",\"php\"],e)}(Prism);\n!function(a){var e=/(^(?:[\\t ]*(?:\\*\\s*)*))[^*\\s].*$/m,n=\"(?:\\\\b[a-zA-Z]\\\\w+\\\\s*\\\\.\\\\s*)*\\\\b[A-Z]\\\\w*(?:\\\\s*<mem>)?|<mem>\".replace(/<mem>/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)>(?!<code>)\\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);\nPrism.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$.+-]*\\/)+(?:<init>)?\\([^()]*\\)/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$]+(?=\\.(?:<init>|[\\w$]+)\\()/,function:/(?:<init>|[\\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/}}};\nPrism.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:/[{}[\\](),.]/};\nPrism.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]*:)/}});\n!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);\n!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);\n!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+(?:<TYPE>\\\\s+)?)[A-Z]\\\\w*(?:\\\\.[A-Z]\\\\w*)*\".replace(/<TYPE>/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);\n!function(a){function e(a,e){return RegExp(a.replace(/<ID>/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*)(?:<ID>(?:\\\\s*,\\\\s*(?:\\\\*\\\\s*as\\\\s+<ID>|\\\\{[^{}]*\\\\}))?|\\\\*\\\\s*as\\\\s+<ID>|\\\\{[^{}]*\\\\})(?=\\\\s*\\\\bfrom\\\\b)\"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e(\"(\\\\bexport\\\\b\\\\s*)(?:\\\\*(?:\\\\s*as\\\\s+<ID>)?(?=\\\\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*)#?<ID>\"),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<t.length;r++){var n=t[r],s=a.languages.javascript[n];\"RegExp\"===a.util.type(s)&&(s=a.languages.javascript[n]={pattern:s});var o=s.inside||{};s.inside=o,o[\"maybe-class-name\"]=/^[A-Z][\\s\\S]*/}}(Prism);\nPrism.languages.json={property:{pattern:/(^|[^\\\\])\"(?:\\\\.|[^\\\\\"\\r\\n])*\"(?=\\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\\\])\"(?:\\\\.|[^\\\\\"\\r\\n])*\"(?!\\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\\/\\/.*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,greedy:!0},number:/-?\\b\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?\\b/i,punctuation:/[{}[\\],]/,operator:/:/,boolean:/\\b(?:false|true)\\b/,null:{pattern:/\\bnull\\b/,alias:\"keyword\"}},Prism.languages.webmanifest=Prism.languages.json;\n!function(n){var e=/(\"|')(?:\\\\(?:\\r\\n?|\\n|.)|(?!\\1)[^\\\\\\r\\n])*\\1/;n.languages.json5=n.languages.extend(\"json\",{property:[{pattern:RegExp(e.source+\"(?=\\\\s*:)\"),greedy:!0},{pattern:/(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/,alias:\"unquoted\"}],string:{pattern:e,greedy:!0},number:/[+-]?\\b(?:NaN|Infinity|0x[a-fA-F\\d]+)\\b|[+-]?(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[eE][+-]?\\d+\\b)?/})}(Prism);\nPrism.languages.jsonp=Prism.languages.extend(\"json\",{punctuation:/[{}[\\]();,.]/}),Prism.languages.insertBefore(\"jsonp\",\"punctuation\",{function:/(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*\\()/});\nPrism.languages.jsstacktrace={\"error-message\":{pattern:/^\\S.*/m,alias:\"string\"},\"stack-frame\":{pattern:/(^[ \\t]+)at[ \\t].*/m,lookbehind:!0,inside:{\"not-my-code\":{pattern:/^at[ \\t]+(?!\\s)(?:node\\.js|<unknown>|.*(?:node_modules|\\(<anonymous>\\)|\\(<unknown>|<anonymous>$|\\(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:/:/}}}}};\n!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<t.length;n++){if(o>=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<a;r++){var i=n[r];if(\"string\"!=typeof i){var o=i.content;if(Array.isArray(o))if(\"template-string\"===i.type){var s=o[1];if(3===o.length&&\"string\"!=typeof s&&\"embedded-code\"===s.type){var p=c(s),l=s.alias,u=Array.isArray(l)?l[0]:l,f=e.languages[u];if(!f)continue;o[1]=g(p,f,u)}}else t(o);else\"string\"!=typeof o&&t([o])}}}(t.tokens)}))}(Prism);\nPrism.languages.julia={comment:{pattern:/(^|[^\\\\])(?:#=(?:[^#=]|=(?!#)|#(?!=)|#=(?:[^#=]|=(?!#)|#(?!=))*=#)*=#|#.*)/,lookbehind:!0},regex:{pattern:/r\"(?:\\\\.|[^\"\\\\\\r\\n])*\"[imsx]{0,4}/,greedy:!0},string:{pattern:/\"\"\"[\\s\\S]+?\"\"\"|(?:\\b\\w+)?\"(?:\\\\.|[^\"\\\\\\r\\n])*\"|`(?:[^\\\\`\\r\\n]|\\\\.)*`/,greedy:!0},char:{pattern:/(^|[^\\w'])'(?:\\\\[^\\r\\n][^'\\r\\n]*|[^\\\\\\r\\n])'/,lookbehind:!0,greedy:!0},keyword:/\\b(?:abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|in|let|local|macro|module|print|println|quote|return|struct|try|type|typealias|using|while)\\b/,boolean:/\\b(?:false|true)\\b/,number:/(?:\\b(?=\\d)|\\B(?=\\.))(?:0[box])?(?:[\\da-f]+(?:_[\\da-f]+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[efp][+-]?\\d+(?:_\\d+)*)?j?/i,operator:/&&|\\|\\||[-+*^%÷⊻&$\\\\]=?|\\/[\\/=]?|!=?=?|\\|[=>]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,punctuation:/::?|[{}[\\]();,.?]/,constant:/\\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\\b|[πℯ]/};\nPrism.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}<ipv4>|(?:[\\\\da-f]{1,4}:){0,5}:<ipv4>|::(?:[\\\\da-f]{1,4}:){0,5}<ipv4>|[\\\\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})?|<ipv4>(?:/\\\\d{1,2})?)\\\\b\".replace(/<ipv4>/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:/[\\{\\}]/};\nPrism.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:/[()=,]/};\n!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);\n!function(n){function o(n,o){return RegExp(n.replace(/<nonId>/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(\"(^|[<nonId>])(?:да|нет)(?=[<nonId>]|$)\"),lookbehind:!0},\"operator-word\":{pattern:o(\"(^|[<nonId>])(?:и|или|не)(?=[<nonId>]|$)\"),lookbehind:!0,alias:\"keyword\"},\"system-variable\":{pattern:o(\"(^|[<nonId>])знач(?=[<nonId>]|$)\"),lookbehind:!0,alias:\"keyword\"},type:[{pattern:o(\"(^|[<nonId>])(?:вещ|лит|лог|сим|цел)(?:\\\\x20*таб)?(?=[<nonId>]|$)\"),lookbehind:!0,alias:\"builtin\"},{pattern:o(\"(^|[<nonId>])(?:компл|сканкод|файл|цвет)(?=[<nonId>]|$)\"),lookbehind:!0,alias:\"important\"}],keyword:{pattern:o(\"(^|[<nonId>])(?:алг|арг(?:\\\\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\\\\x20+|_)исп)?|кц(?:(?:\\\\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[<nonId>]|$)\"),lookbehind:!0},name:{pattern:o(\"(^|[<nonId>])[^\\\\d<nonId>][^<nonId>]*(?:\\\\x20+[^<nonId>]+)*(?=[<nonId>]|$)\"),lookbehind:!0},number:{pattern:o(\"(^|[<nonId>])(?:\\\\B\\\\$[\\\\da-f]+\\\\b|(?:\\\\b\\\\d+(?:\\\\.\\\\d*)?|\\\\B\\\\.\\\\d+)(?:e[+-]?\\\\d+)?)(?=[<nonId>]|$)\",\"i\"),lookbehind:!0},punctuation:/:=|[(),:;\\[\\]]/,\"operator-char\":{pattern:/\\*\\*?|<[=>]?|>=?|[-+/=]/,alias:\"operator\"}},n.languages.kum=n.languages.kumir}(Prism);\nPrism.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:/[()\\[\\]{},;.:]/};\n!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);\n!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);\nPrism.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\"}});\n!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]}({\"<ureal dec>\":\"\\\\d+(?:/\\\\d+)|(?:\\\\d+(?:\\\\.\\\\d*)?|\\\\.\\\\d+)(?:[esfdl][+-]?\\\\d+)?\",\"<real dec>\":\"[+-]?<ureal dec>|[+-](?:inf|nan)\\\\.0\",\"<imaginary dec>\":\"[+-](?:<ureal dec>|(?:inf|nan)\\\\.0)?i\",\"<complex dec>\":\"<real dec>(?:@<real dec>|<imaginary dec>)?|<imaginary dec>\",\"<num dec>\":\"(?:#d(?:#[ei])?|#[ei](?:#d)?)?<complex dec>\",\"<ureal box>\":\"[0-9a-f]+(?:/[0-9a-f]+)?\",\"<real box>\":\"[+-]?<ureal box>|[+-](?:inf|nan)\\\\.0\",\"<imaginary box>\":\"[+-](?:<ureal box>|(?:inf|nan)\\\\.0)?i\",\"<complex box>\":\"<real box>(?:@<real box>|<imaginary box>)?|<imaginary box>\",\"<num box>\":\"#[box](?:#[ei])?|(?:#[ei])?#[box]<complex box>\",\"<number>\":\"(^|[()\\\\[\\\\]\\\\s])(?:<num dec>|<num box>)(?=[()\\\\[\\\\]\\\\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);\n!function(e){for(var n='\\\\((?:[^();\"#\\\\\\\\]|\\\\\\\\[^]|;.*(?!.)|\"(?:[^\"\\\\\\\\]|\\\\\\\\.)*\"|#(?:\\\\{(?:(?!#\\\\})[^])*#\\\\}|[^{])|<expr>)*\\\\)',i=0;i<5;i++)n=n.replace(/<expr>/g,(function(){return n}));n=n.replace(/<expr>/g,\"[^\\\\s\\\\S]\");var d=e.languages.lilypond={comment:/%(?:(?!\\{).*|\\{[\\s\\S]*?%\\})/,\"embedded-scheme\":{pattern:RegExp('(^|[=\\\\s])#(?:\"(?:[^\"\\\\\\\\]|\\\\\\\\.)*\"|[^\\\\s()\"]*(?:[^\\\\s()]|<expr>))'.replace(/<expr>/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);\nPrism.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\")}));\n!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);\nPrism.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;\n!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);\nPrism.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:/[\\[\\].,]/};\nPrism.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}|…|,|!/};\nPrism.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:/[()[\\]{}<>,;.:]/};\nPrism.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:/[:;(){}]/};\n!function(n){function e(n){return n=n.replace(/<inner>/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__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\\\\b|\\\\*\\\\*(?:(?!\\\\*)<inner>|\\\\*(?:(?!\\\\*)<inner>)+\\\\*)+\\\\*\\\\*\"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\\s\\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\\*\\*|__/}},italic:{pattern:e(\"\\\\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\\\\b|\\\\*(?:(?!\\\\*)<inner>|\\\\*\\\\*(?:(?!\\\\*)<inner>)+\\\\*\\\\*)+\\\\*\"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\\s\\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e(\"(~~?)(?:(?!~)<inner>)+\\\\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('!?\\\\[(?:(?!\\\\])<inner>)+\\\\](?:\\\\([^\\\\s)]+(?:[\\t ]+\"(?:\\\\\\\\.|[^\"\\\\\\\\])*\")?\\\\)|[ \\t]?\\\\[(?:(?!\\\\])<inner>)+\\\\])'),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<a;t++){var i=e[t];if(\"code\"===i.type){var r=i.content[1],o=i.content[3];if(r&&o&&\"code-language\"===r.type&&\"code-block\"===o.type&&\"string\"==typeof r.content){var l=r.content.replace(/\\b#/g,\"sharp\").replace(/\\b\\+\\+/g,\"pp\"),s=\"language-\"+(l=(/[a-z][\\w-]*/i.exec(l)||[\"\"])[0].toLowerCase());o.alias?\"string\"==typeof o.alias?o.alias=[o.alias,s]:o.alias.push(s):o.alias=[s]}}else n(i.content)}}(n.tokens)})),n.hooks.add(\"wrap\",(function(e){if(\"code-block\"===e.type){for(var t=\"\",a=0,i=e.classes.length;a<i;a++){var s=e.classes[a],d=/language-(.+)/.exec(s);if(d){t=d[1];break}}var p=n.languages[t];if(p)e.content=n.highlight(e.content.replace(r,\"\").replace(/&(\\w{1,8}|#x?[\\da-f]{1,8});/gi,(function(n,e){var t;return\"#\"===(e=e.toLowerCase())[0]?(t=\"x\"===e[1]?parseInt(e.slice(2),16):Number(e.slice(1)),l(t)):o[e]||n})),p,t);else if(t&&\"none\"!==t&&n.plugins.autoloader){var u=\"md-\"+(new Date).valueOf()+\"-\"+Math.floor(1e16*Math.random());e.attributes.id=u,n.plugins.autoloader.loadLanguages(t,(function(){var e=document.getElementById(u);e&&(e.innerHTML=n.highlight(e.textContent,n.languages[t],t))}))}}}));var r=RegExp(n.languages.markup.tag.pattern.source,\"gi\"),o={amp:\"&\",lt:\"<\",gt:\">\",quot:'\"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism);\n!function(t){var e=\"\\\\bvoid\\\\b|<org>|\\\\b(?:complex|numeric|pointer(?:\\\\s*\\\\([^()]*\\\\))?|real|string|(?:class|struct)\\\\s+\\\\w+|transmorphic)(?:\\\\s*<org>)?\".replace(/<org>/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);\nPrism.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}|[.,;\\[\\](){}!]/};\n!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);\nPrism.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;\nPrism.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]|===+|---+|-\\.+-)(?![<>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:/[(){};]/};\nPrism.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}};\nPrism.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:/\\(#|#\\)|[,:;\\[\\](){}]/};\n!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);\nPrism.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:/[.,:;()\\[\\]]/};\nPrism.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;\nPrism.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:/[;[\\](),.{}:]/};\nPrism.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;\nPrism.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:/[{}[\\];(),:]/};\n!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<e.length;n++){var t=e[n],r=\"[]{}\".indexOf(t);if(-1!==r)if(r%2==0)a.push(r+1);else if(a.pop()!==r)return!1}return 0===a.length})(a)||(e.type=\"bad-line\",e.content=a)}}))}))}(Prism);\nPrism.languages.nasm={comment:/;.*$/m,string:/([\"'`])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,label:{pattern:/(^\\s*)[A-Za-z._?$][\\w.?$@~#]*:/m,lookbehind:!0,alias:\"function\"},keyword:[/\\[?BITS (?:16|32|64)\\]?/,{pattern:/(^\\s*)section\\s*[a-z.]+:?/im,lookbehind:!0},/(?:extern|global)[^;\\r\\n]*/i,/(?:CPU|DEFAULT|FLOAT).*$/m],register:{pattern:/\\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)\\b/i,alias:\"variable\"},number:/(?:\\b|(?=\\$))(?:0[hx](?:\\.[\\da-f]+|[\\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:/[\\[\\]*+\\-\\/%<>=&|$!]/};\nPrism.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:/[,:=[\\]{}()-]/};\nPrism.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\\-.]+/};\n!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);\nPrism.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:/[({\\[]\\.|\\.[)}\\]]|[`(){}\\[\\],:]/};\nPrism.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;\nPrism.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}};\nPrism.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;\nPrism.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/};\n!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);\n!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);\nPrism.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;\nPrism.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:/[\\[\\](){}.:;?]/};\nPrism.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:/[\\[\\]{}().,:;|]/};\n!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);\nPrism.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;\n!function(e){var n=\"(?:\\\\b\\\\w+(?:<braces>)?|<braces>)\".replace(/<braces>/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+)<type>\".replace(/<type>/g,(function(){return n})),\"i\"),lookbehind:!0,inside:null},{pattern:RegExp(\"<type>(?=\\\\s+is\\\\b)\".replace(/<type>/g,(function(){return n})),\"i\"),inside:null},{pattern:RegExp(\"(:\\\\s*)<type>\".replace(/<type>/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);\nPrism.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:/[(){}\\[\\];,]/};\nPrism.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;\nPrism.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;\n!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);\n!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);\nPrism.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:/::|\\\\/}}});\n!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);\nPrism.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\"}});\nPrism.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;\n!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);\nPrism.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\"}});\nPrism.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:/[(){}\\[\\],]/};\n!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);\nPrism.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:/[=:]/};\n!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);\n!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<i;a++){var r=t[a];r=\"string\"==typeof r?{filter:r,language:r}:r,e.languages[r.language]&&(n[\"filter-\"+r.filter]={pattern:RegExp(\"(^([\\t ]*)):<filter_name>(?:(?:\\r?\\n|\\r(?!\\n))(?:\\\\2[\\t ].+|\\\\s*?(?=\\r?\\n|\\r)))+\".replace(\"<filter_name>\",(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);\n!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);\n!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(\"%< *-\\\\*- *<lang>\\\\d* *-\\\\*-[^]+?%>\".replace(\"<lang>\",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);\nPrism.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;\nPrism.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;\nPrism.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;\n!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(/<<self>>/g,(function(){return\"(?:\"+e+\")\"}));return e.replace(/<<self>>/g,\"[^\\\\s\\\\S]\")}(n('\\\\{(?:[^\"{}]|<<0>>|<<self>>)*\\\\}',[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;\nPrism.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:/[(){}\\[\\];.]/};\n!function(e){for(var r=\"(?:[^\\\\\\\\()[\\\\]{}\\\"'/]|<string>|/(?![*/])|<comment>|\\\\(<expr>*\\\\)|\\\\[<expr>*\\\\]|\\\\{<expr>*\\\\}|\\\\\\\\[^])\".replace(/<string>/g,(function(){return\"\\\"(?:\\\\\\\\.|[^\\\\\\\\\\\"\\r\\n])*\\\"|'(?:\\\\\\\\.|[^\\\\\\\\'\\r\\n])*'\"})).replace(/<comment>/g,(function(){return\"//.*(?!.)|/\\\\*(?:[^*]|\\\\*(?!/))*\\\\*/\"})),t=0;t<2;t++)r=r.replace(/<expr>/g,(function(){return r}));r=r.replace(/<expr>/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*\\\\(<js>*\\\\)\\\\s*\\\\{<js>*\\\\}\".replace(/<js>/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;}[])(?:(?!$|[;}])<js>)+\".replace(/<js>/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);\nPrism.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/});\nPrism.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:/[(){}\\[\\],;]/};\nPrism.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;\n!function(e){function s(e,s){for(var a=0;a<s;a++)e=e.replace(/<self>/g,(function(){return\"(?:\"+e+\")\"}));return e.replace(/<self>/g,\"[^\\\\s\\\\S]\").replace(/<str>/g,'(?:@(?!\")|\"(?:[^\\r\\n\\\\\\\\\"]|\\\\\\\\.)*\"|@\"(?:[^\\\\\\\\\"]|\"\"|\\\\\\\\[^])*\"(?!\")|\\'(?:(?:[^\\r\\n\\'\\\\\\\\]|\\\\\\\\.|\\\\\\\\[Uux][\\\\da-fA-F]{1,8})\\'|(?=[^\\\\\\\\](?!\\'))))').replace(/<comment>/g,\"(?:/(?![/*])|//.*[\\r\\n]|/\\\\*[^*]*(?:\\\\*(?!/)[^*]*)*\\\\*/)\")}var a=s(\"\\\\((?:[^()'\\\"@/]|<str>|<comment>|<self>)*\\\\)\",2),t=s(\"\\\\[(?:[^\\\\[\\\\]'\\\"@/]|<str>|<comment>|<self>)*\\\\]\",1),r=s(\"\\\\{(?:[^{}'\\\"@/]|<str>|<comment>|<self>)*\\\\}\",2),n=\"@(?:await\\\\b\\\\s*)?(?:(?!await\\\\b)\\\\w+\\\\b|\"+a+\")(?:[?!]?\\\\.\\\\w+\\\\b|(?:\"+s(\"<(?:[^<>'\\\"@/]|<comment>|<self>)*>\",1)+\")?\"+a+\"|\"+t+\")*(?![?!\\\\.(\\\\[]|<(?!/))\",l=\"(?:\\\"[^\\\"@]*\\\"|'[^'@]*'|[^\\\\s'\\\"@>=]+(?=[\\\\s>])|[\\\"'][^\\\"'@]*(?:(?:@(?![\\\\w()])|\"+n+\")[^\\\"'@]*)+[\\\"'])\",i=\"(?:\\\\s(?:\\\\s*[^\\\\s>/=]+(?:\\\\s*=\\\\s*<tagAttrValue>|(?=[\\\\s/>])))+)?\".replace(/<tagAttrValue>/,l),g=\"(?!\\\\d)[^\\\\s>/=$<%]+\"+i+\"\\\\s*/?>\",o=\"\\\\B@?(?:<([a-zA-Z][\\\\w:]*)\"+i+\"\\\\s*>(?:[^<]|</?(?!\\\\1\\\\b)\"+g+\"|\"+s(\"<\\\\1\"+i+\"\\\\s*>(?:[^<]|</?(?!\\\\1\\\\b)\"+g+\"|<self>)*</\\\\1\\\\s*>\",2)+\")*</\\\\1\\\\s*>|<\"+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(\"</?\"+g),e.languages.cshtml.tag.inside[\"attr-value\"].pattern=RegExp(\"=\\\\s*\"+l),e.languages.insertBefore(\"inside\",\"punctuation\",{value:p},e.languages.cshtml.tag.inside[\"attr-value\"]),e.languages.insertBefore(\"cshtml\",\"prolog\",{\"razor-comment\":{pattern:/@\\*[\\s\\S]*?\\*@/,greedy:!0,alias:\"comment\"},block:{pattern:RegExp(\"(^|[^@])@(?:\"+[r,\"(?:code|functions)\\\\s*\"+r,\"(?:for|foreach|lock|switch|using|while)\\\\s*\"+a+\"\\\\s*\"+r,\"do\\\\s*\"+r+\"\\\\s*while\\\\s*\"+a+\"(?:\\\\s*;)?\",\"try\\\\s*\"+r+\"\\\\s*catch\\\\s*\"+a+\"\\\\s*\"+r+\"\\\\s*finally\\\\s*\"+r,\"if\\\\s*\"+a+\"\\\\s*\"+r+\"(?:\\\\s*else(?:\\\\s+if\\\\s*\"+a+\")?\\\\s*\"+r+\")*\",\"helper\\\\s+\\\\w+\\\\s*\"+a+\"\\\\s*\"+r].join(\"|\")+\")\"),lookbehind:!0,greedy:!0,inside:{keyword:/^@\\w*/,csharp:c}},directive:{pattern:/^([ \\t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\\s).*/m,lookbehind:!0,greedy:!0,inside:{keyword:/^@\\w+/,csharp:c}},value:p,\"delegate-operator\":{pattern:/(^|[^@])@(?=<)/,lookbehind:!0,alias:\"operator\"}}),e.languages.razor=e.languages.cshtml}(Prism);\n!function(t){var n=t.util.clone(t.languages.javascript),e=\"(?:\\\\{<S>*\\\\.{3}(?:[^{}]|<BRACES>)*\\\\})\";function a(t,n){return t=t.replace(/<S>/g,(function(){return\"(?:\\\\s|//.*(?!.)|/\\\\*(?:[^*]|\\\\*(?!/))\\\\*/)\"})).replace(/<BRACES>/g,(function(){return\"(?:\\\\{(?:\\\\{(?:\\\\{[^{}]*\\\\}|[^{}])*\\\\}|[^{}])*\\\\})\"})).replace(/<SPREAD>/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>+(?:[\\\\w.:$-]+(?:=(?:\\\"(?:\\\\\\\\[^]|[^\\\\\\\\\\\"])*\\\"|'(?:\\\\\\\\[^]|[^\\\\\\\\'])*'|[^\\\\s{'\\\"/>=]+|<BRACES>))?|<SPREAD>))*<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(\"<SPREAD>\"),inside:t.languages.jsx}},t.languages.jsx.tag),t.languages.insertBefore(\"inside\",\"special-attr\",{script:{pattern:a(\"=<BRACES>\"),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;a<n.length;a++){var o=n[a],i=!1;if(\"string\"!=typeof o&&(\"tag\"===o.type&&o.content[0]&&\"tag\"===o.content[0].type?\"</\"===o.content[0].content[0].content?e.length>0&&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);a<n.length-1&&(\"string\"==typeof n[a+1]||\"plain-text\"===n[a+1].type)&&(r+=s(n[a+1]),n.splice(a+1,1)),a>0&&(\"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);\n!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$]|(?=</))(?:\"+t.pattern.source+\")\",t.pattern.flags),t.lookbehind=!0}(Prism);\nPrism.languages.reason=Prism.languages.extend(\"clike\",{string:{pattern:/\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\\\\\\r\\n\"])*\"/,greedy:!0},\"class-name\":/\\b[A-Z]\\w*/,keyword:/\\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\\b/,operator:/\\.{3}|:[:=]|\\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\\-*\\/]\\.?|\\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;\n!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:/\\((?:\\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:\"punctuation\",inside:{\"group-name\":i}},{pattern:/\\)/,alias:\"punctuation\"}],quantifier:{pattern:/(?:[+*?]|\\{\\d+(?:,\\d*)?\\})[?+]?/,alias:\"number\"},alternation:{pattern:/\\|/,alias:\"keyword\"}}}(Prism);\nPrism.languages.rego={comment:/#.*/,property:{pattern:/(^|[^\\\\.])(?:\"(?:\\\\.|[^\\\\\"\\r\\n])*\"|`[^`]*`|\\b[a-z_]\\w*\\b)(?=\\s*:(?!=))/i,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\\\])\"(?:\\\\.|[^\\\\\"\\r\\n])*\"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\\b(?:as|default|else|import|not|null|package|set(?=\\s*\\()|some|with)\\b/,boolean:/\\b(?:false|true)\\b/,function:{pattern:/\\b[a-z_]\\w*\\b(?:\\s*\\.\\s*\\b[a-z_]\\w*\\b)*(?=\\s*\\()/i,inside:{namespace:/\\b\\w+\\b(?=\\s*\\.)/,punctuation:/\\./}},number:/-?\\b\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?\\b/i,operator:/[-+*/%|&]|[<>:=]=?|!=|\\b_\\b/,punctuation:/[,;.\\[\\]{}()]/};\nPrism.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;\nPrism.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;\nPrism.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}};\nPrism.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`'\",.:;#\\/\\\\()<>\\[\\]{}]*/};\nPrism.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:/[{},.;:=]/};\n!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]*<name>[ \\t]*\\\\*{3}(?:.|[\\r\\n](?!\\\\*{3}))*\".replace(/<name>/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);\n!function(e){for(var a=\"/\\\\*(?:[^*/]|\\\\*(?!/)|/(?!\\\\*)|<self>)*\\\\*/\",t=0;t<2;t++)a=a.replace(/<self>/g,(function(){return a}));a=a.replace(/<self>/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);\n!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+)?(?:<act>)\\\\.[a-z]+\\\\b[^;]+\".replace(/<act>/g,(function(){return k})),\"i\"),lookbehind:!0,inside:{keyword:RegExp(\"(?:<act>)\\\\.[a-z]+\\\\b\".replace(/<act>/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)(?:<str>|[^;\\\"'])+;\".replace(/<str>/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))?)(?:<str>|[^\\\"'])+?(?=endsubmit;)\".replace(/<str>/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))?)(?:<str>|[^\\\"'])+?(?=endsubmit;)\".replace(/<str>/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)(?:[^;\\\"']|<str>)+;\".replace(/<str>/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);\n!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);\nPrism.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;\nPrism.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;\n!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?)|\\\\$(?!')|<(?!<)|<<str>>)+\".replace(/<<str>>/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);\nPrism.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:/[{}(),;:]/};\nPrism.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:/[.;:?\\[\\](){}]/};\n!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\\\\}|\"+\"\\\\{(?:[^{}\\\"']|<str>|\\\\{(?:[^{}\\\"']|<str>|\\\\{(?:[^{}\\\"']|<str>)*\\\\})*\\\\})*\\\\}\".replace(/<str>/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);\n!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*)<TERMINAL>(?:\\\\s*(?:(?:\\\\*|->)\\\\s*<TERMINAL>|,\\\\s*<TERMINAL>(?:(?=<NOT-LAST>)|(?!<NOT-LAST>)\\\\s+<LONG-ID>)))*\".replace(/<NOT-LAST>/g,(function(){return\"\\\\s*(?:[*,]|->)\"})).replace(/<TERMINAL>/g,(function(){return\"(?:'[\\\\w']*|<LONG-ID>|\\\\((?:[^()]|\\\\([^()]*\\\\))*\\\\)|\\\\{(?:[^{}]|\\\\{[^{}]*\\\\})*\\\\})(?:\\\\s+<LONG-ID>)*\"})).replace(/<LONG-ID>/g,(function(){return\"(?!<KEYWORD>)[a-z\\\\d_][\\\\w'.]*\"})).replace(/<KEYWORD>/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);\nPrism.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;\n!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);\n!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);\nPrism.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;\nPrism.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;\nPrism.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:/[()[\\],]/};\nPrism.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\"];\nPrism.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\"}});\n!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);\nPrism.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;\nPrism.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:/[()[\\].,;]/};\n!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);\nPrism.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;\nPrism.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}));\n!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);\n!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);\nPrism.languages.t4=Prism.languages[\"t4-cs\"]=Prism.languages[\"t4-templating\"].createT4(\"csharp\");\nPrism.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:/[,;:(){}]/});\nPrism.languages[\"t4-vb\"]=Prism.languages[\"t4-templating\"].createT4(\"vbnet\");\n!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]|[?:-]<PLAIN>)(?:[ \\t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*\".replace(/<PLAIN>/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<<prop>>[ \\t]+)?)(?:<<value>>)(?=[ \\t]*(?:$|,|\\\\]|\\\\}|(?:[\\r\\n]\\\\s*)?#))\".replace(/<<prop>>/g,(function(){return t})).replace(/<<value>>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp(\"([\\\\-:]\\\\s*(?:\\\\s<<prop>>[ \\t]+)?[|>])[ \\t]*(?:((?:\\r?\\n|\\r)[ \\t]+)\\\\S[^\\r\\n]*(?:\\\\2[^\\r\\n]+)*)\".replace(/<<prop>>/g,(function(){return t}))),lookbehind:!0,alias:\"string\"},comment:/#.*/,key:{pattern:RegExp(\"((?:^|[:\\\\-,[{\\r\\n?])[ \\t]*(?:<<prop>>[ \\t]+)?)<<key>>(?=\\\\s*:\\\\s)\".replace(/<<prop>>/g,(function(){return t})).replace(/<<key>>/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);\nPrism.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\"}};\nPrism.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:/[{}()\\[\\]]/};\n!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);\n!function(n){function e(n,e){return RegExp(n.replace(/<MOD>/g,(function(){return\"(?:\\\\([^|()\\n]+\\\\)|\\\\[[^\\\\]\\n]+\\\\]|\\\\{[^}\\n]+\\\\})\"})).replace(/<PAR>/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*(?:<MOD>|<PAR>|[<>=])*\\\\.\"),inside:{modifier:{pattern:e(\"(^[a-z]\\\\w*)(?:<MOD>|<PAR>|[<>=])+(?=\\\\.)\"),lookbehind:!0,inside:i},tag:/^[a-z]\\w*/,punctuation:/\\.$/}},list:{pattern:e(\"^[*#]+<MOD>*\\\\s+\\\\S.*\",\"m\"),inside:{modifier:{pattern:e(\"(^[*#]+)<MOD>+\"),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:e(\"^(?:(?:<MOD>|<PAR>|[<>=^~])+\\\\.\\\\s*)?(?:\\\\|(?:(?:<MOD>|<PAR>|[<>=^~_]|[\\\\\\\\/]\\\\d+)+\\\\.|(?!(?:<MOD>|<PAR>|[<>=^~_]|[\\\\\\\\/]\\\\d+)+\\\\.))[^|]*)+\\\\|\",\"m\"),inside:{modifier:{pattern:e(\"(^|\\\\|(?:\\r?\\n|\\r)?)(?:<MOD>|<PAR>|[<>=^~_]|[\\\\\\\\/]\\\\d+)+(?=\\\\.)\"),lookbehind:!0,inside:i},punctuation:/\\||^\\./}},inline:{pattern:e(\"(^|[^a-zA-Z\\\\d])(\\\\*\\\\*|__|\\\\?\\\\?|[*_%@+\\\\-^~])<MOD>*.+?\\\\2(?![a-zA-Z\\\\d])\"),lookbehind:!0,inside:{bold:{pattern:e(\"(^(\\\\*\\\\*?)<MOD>*).+?(?=\\\\2)\"),lookbehind:!0},italic:{pattern:e(\"(^(__?)<MOD>*).+?(?=\\\\2)\"),lookbehind:!0},cite:{pattern:e(\"(^\\\\?\\\\?<MOD>*).+?(?=\\\\?\\\\?)\"),lookbehind:!0,alias:\"string\"},code:{pattern:e(\"(^@<MOD>*).+?(?=@)\"),lookbehind:!0,alias:\"keyword\"},inserted:{pattern:e(\"(^\\\\+<MOD>*).+?(?=\\\\+)\"),lookbehind:!0},deleted:{pattern:e(\"(^-<MOD>*).+?(?=-)\"),lookbehind:!0},span:{pattern:e(\"(^%<MOD>*).+?(?=%)\"),lookbehind:!0},modifier:{pattern:e(\"(^\\\\*\\\\*|__|\\\\?\\\\?|[*_%@+\\\\-^~])<MOD>+\"),lookbehind:!0,inside:i},punctuation:/[*_%?@+\\-^~]+/}},\"link-ref\":{pattern:/^\\[[^\\]]+\\]\\S+$/m,inside:{string:{pattern:/(^\\[)[^\\]]+(?=\\])/,lookbehind:!0},url:{pattern:/(^\\])\\S+$/,lookbehind:!0},punctuation:/[\\[\\]]/}},link:{pattern:e('\"<MOD>*[^\"]+\":.+?(?=[^\\\\w/]?(?:\\\\s|$))'),inside:{text:{pattern:e('(^\"<MOD>*)[^\"]+(?=\")'),lookbehind:!0},modifier:{pattern:e('(^\")<MOD>+'),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[\":]/}},image:{pattern:e(\"!(?:<MOD>|<PAR>|[<>=])*(?![<>=])[^!\\\\s()]+(?:\\\\([^)]+\\\\))?!(?::.+?(?=[^\\\\w/]?(?:\\\\s|$)))?\"),inside:{source:{pattern:e(\"(^!(?:<MOD>|<PAR>|[<>=])*)(?![<>=])[^!\\\\s()]+(?:\\\\([^)]+\\\\))?(?=!)\"),lookbehind:!0,alias:\"url\"},modifier:{pattern:e(\"(^!)(?:<MOD>|<PAR>|[<>=])+\"),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);\n!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);\n!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);\nPrism.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\")}));\n!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:/<INCLUDE_TYPOSCRIPT:\\s*source\\s*=\\s*(?:\"[^\"\\r\\n]*\"|'[^'\\r\\n]*')\\s*>/,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);\nPrism.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;\nPrism.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:/[()\\[\\]{}:.,]/};\nPrism.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;\n!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);\nPrism.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]+$/}}});\n!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);\nPrism.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:/[[\\];(),.:]/};\nPrism.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:/[{}[\\];(),.:]/};\nPrism.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:/[{}[\\](),;:]/};\nPrism.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\"];\nPrism.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/};\nPrism.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:/[()]/};\n!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);\nPrism.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:/[@(){}[\\],;<>:.]/};\nPrism.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}}}});\nPrism.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;\nPrism.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]+/}};\n!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);\n!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);\nPrism.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:/[.,;:()]/};\n!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;i<a.length;i++){var r=a[i],s=!1;if(\"string\"!=typeof r&&(\"tag\"===r.type&&r.content[0]&&\"tag\"===r.content[0].type?\"</\"===r.content[0].content[0].content?o.length>0&&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);i<a.length-1&&(\"string\"==typeof a[i+1]||\"plain-text\"===a[i+1].type)&&(l+=t(a[i+1]),a.splice(i+1,1)),i>0&&(\"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);\nPrism.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:/[{};:]/};\n!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*<ALIGN>|\\\\s*const\\\\b|\\\\s*volatile\\\\b|\\\\s*allowzero\\\\b)*)\".replace(/<ALIGN>/g,n(o))+\"\\\\s*)*\"+\"(?:\\\\bpromise\\\\b|(?:\\\\berror\\\\.)?<ID>(?:\\\\.<ID>)*(?!\\\\s+<ID>))\".replace(/<ID>/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*)<TYPE>(?=\\\\s*(?:<ALIGN>\\\\s*)?[=;,)])|<TYPE>(?=\\\\s*(?:<ALIGN>\\\\s*)?\\\\{)\".replace(/<TYPE>/g,n(s)).replace(/<ALIGN>/g,n(o))),lookbehind:!0,inside:null},{pattern:RegExp(\"(\\\\)\\\\s*)<TYPE>(?=\\\\s*(?:<ALIGN>\\\\s*)?;)\".replace(/<TYPE>/g,n(s)).replace(/<ALIGN>/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);\n!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);t<r&&(t=r),t>s&&(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(\"<span></span>\");(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;r<t.length;r++)void 0===t[r]&&(t[r]=n.children[i++].getBoundingClientRect().height)})),t.forEach((function(e){var n=e.sizer,t=e.element.querySelector(\".line-numbers-rows\");n.style.display=\"none\",n.innerHTML=\"\",e.lineHeights.forEach((function(e,n){t.children[n].style.height=e+\"px\"}))}))}}}();\n!function(){if(\"undefined\"!=typeof Prism&&\"undefined\"!=typeof document){var e=[],t={},n=function(){};Prism.plugins.toolbar={};var a=Prism.plugins.toolbar.registerButton=function(n,a){var r;r=\"function\"==typeof a?a:function(e){var t;return\"function\"==typeof a.onClick?((t=document.createElement(\"button\")).type=\"button\",t.addEventListener(\"click\",(function(){a.onClick.call(this,e)}))):\"string\"==typeof a.url?(t=document.createElement(\"a\")).href=a.url:t=document.createElement(\"span\"),a.className&&t.classList.add(a.className),t.textContent=a.text,t},n in t?console.warn('There is a button with the key \"'+n+'\" registered already.'):e.push(t[n]=r)},r=Prism.plugins.toolbar.hook=function(a){var r=a.element.parentNode;if(r&&/pre/i.test(r.nodeName)&&!r.parentNode.classList.contains(\"code-toolbar\")){var o=document.createElement(\"div\");o.classList.add(\"code-toolbar\"),r.parentNode.insertBefore(o,r),o.appendChild(r);var i=document.createElement(\"div\");i.classList.add(\"toolbar\");var l=e,d=function(e){for(;e;){var t=e.getAttribute(\"data-toolbar-order\");if(null!=t)return(t=t.trim()).length?t.split(/\\s*,\\s*/g):[];e=e.parentElement}}(a.element);d&&(l=d.map((function(e){return t[e]||n}))),l.forEach((function(e){var t=e(a);if(t){var n=document.createElement(\"div\");n.classList.add(\"toolbar-item\"),n.appendChild(t),i.appendChild(n)}})),o.appendChild(i)}};a(\"label\",(function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute(\"data-label\")){var n,a,r=t.getAttribute(\"data-label\");try{a=document.querySelector(\"template#\"+r)}catch(e){}return a?n=a.content:(t.hasAttribute(\"data-url\")?(n=document.createElement(\"a\")).href=t.getAttribute(\"data-url\"):n=document.createElement(\"span\"),n.textContent=r),n}})),Prism.hooks.add(\"complete\",r)}}();\n!function(){if(\"undefined\"!=typeof Prism&&\"undefined\"!=typeof document)if(Prism.plugins.toolbar){var e={none:\"Plain text\",plain:\"Plain text\",plaintext:\"Plain text\",text:\"Plain text\",txt:\"Plain text\",html:\"HTML\",xml:\"XML\",svg:\"SVG\",mathml:\"MathML\",ssml:\"SSML\",rss:\"RSS\",css:\"CSS\",clike:\"C-like\",js:\"JavaScript\",abap:\"ABAP\",abnf:\"ABNF\",al:\"AL\",antlr4:\"ANTLR4\",g4:\"ANTLR4\",apacheconf:\"Apache Configuration\",apl:\"APL\",aql:\"AQL\",ino:\"Arduino\",arff:\"ARFF\",armasm:\"ARM Assembly\",\"arm-asm\":\"ARM Assembly\",art:\"Arturo\",asciidoc:\"AsciiDoc\",adoc:\"AsciiDoc\",aspnet:\"ASP.NET (C#)\",asm6502:\"6502 Assembly\",asmatmel:\"Atmel AVR Assembly\",autohotkey:\"AutoHotkey\",autoit:\"AutoIt\",avisynth:\"AviSynth\",avs:\"AviSynth\",\"avro-idl\":\"Avro IDL\",avdl:\"Avro IDL\",awk:\"AWK\",gawk:\"GAWK\",sh:\"Shell\",basic:\"BASIC\",bbcode:\"BBcode\",bbj:\"BBj\",bnf:\"BNF\",rbnf:\"RBNF\",bqn:\"BQN\",bsl:\"BSL (1C:Enterprise)\",oscript:\"OneScript\",csharp:\"C#\",cs:\"C#\",dotnet:\"C#\",cpp:\"C++\",cfscript:\"CFScript\",cfc:\"CFScript\",cil:\"CIL\",cilkc:\"Cilk/C\",\"cilk-c\":\"Cilk/C\",cilkcpp:\"Cilk/C++\",\"cilk-cpp\":\"Cilk/C++\",cilk:\"Cilk/C++\",cmake:\"CMake\",cobol:\"COBOL\",coffee:\"CoffeeScript\",conc:\"Concurnas\",csp:\"Content-Security-Policy\",\"css-extras\":\"CSS Extras\",csv:\"CSV\",cue:\"CUE\",dataweave:\"DataWeave\",dax:\"DAX\",django:\"Django/Jinja2\",jinja2:\"Django/Jinja2\",\"dns-zone-file\":\"DNS zone file\",\"dns-zone\":\"DNS zone file\",dockerfile:\"Docker\",dot:\"DOT (Graphviz)\",gv:\"DOT (Graphviz)\",ebnf:\"EBNF\",editorconfig:\"EditorConfig\",ejs:\"EJS\",etlua:\"Embedded Lua templating\",erb:\"ERB\",\"excel-formula\":\"Excel Formula\",xlsx:\"Excel Formula\",xls:\"Excel Formula\",fsharp:\"F#\",\"firestore-security-rules\":\"Firestore security rules\",ftl:\"FreeMarker Template Language\",gml:\"GameMaker Language\",gamemakerlanguage:\"GameMaker Language\",gap:\"GAP (CAS)\",gcode:\"G-code\",gdscript:\"GDScript\",gedcom:\"GEDCOM\",gettext:\"gettext\",po:\"gettext\",glsl:\"GLSL\",gn:\"GN\",gni:\"GN\",\"linker-script\":\"GNU Linker Script\",ld:\"GNU Linker Script\",\"go-module\":\"Go module\",\"go-mod\":\"Go module\",graphql:\"GraphQL\",hbs:\"Handlebars\",hs:\"Haskell\",hcl:\"HCL\",hlsl:\"HLSL\",http:\"HTTP\",hpkp:\"HTTP Public-Key-Pins\",hsts:\"HTTP Strict-Transport-Security\",ichigojam:\"IchigoJam\",\"icu-message-format\":\"ICU Message Format\",idr:\"Idris\",ignore:\".ignore\",gitignore:\".gitignore\",hgignore:\".hgignore\",npmignore:\".npmignore\",inform7:\"Inform 7\",javadoc:\"JavaDoc\",javadoclike:\"JavaDoc-like\",javastacktrace:\"Java stack trace\",jq:\"JQ\",jsdoc:\"JSDoc\",\"js-extras\":\"JS Extras\",json:\"JSON\",webmanifest:\"Web App Manifest\",json5:\"JSON5\",jsonp:\"JSONP\",jsstacktrace:\"JS stack trace\",\"js-templates\":\"JS Templates\",keepalived:\"Keepalived Configure\",kts:\"Kotlin Script\",kt:\"Kotlin\",kumir:\"KuMir (КуМир)\",kum:\"KuMir (КуМир)\",latex:\"LaTeX\",tex:\"TeX\",context:\"ConTeXt\",lilypond:\"LilyPond\",ly:\"LilyPond\",emacs:\"Lisp\",elisp:\"Lisp\",\"emacs-lisp\":\"Lisp\",llvm:\"LLVM IR\",log:\"Log file\",lolcode:\"LOLCODE\",magma:\"Magma (CAS)\",md:\"Markdown\",\"markup-templating\":\"Markup templating\",matlab:\"MATLAB\",maxscript:\"MAXScript\",mel:\"MEL\",metafont:\"METAFONT\",mongodb:\"MongoDB\",moon:\"MoonScript\",n1ql:\"N1QL\",n4js:\"N4JS\",n4jsd:\"N4JS\",\"nand2tetris-hdl\":\"Nand To Tetris HDL\",naniscript:\"Naninovel Script\",nani:\"Naninovel Script\",nasm:\"NASM\",neon:\"NEON\",nginx:\"nginx\",nsis:\"NSIS\",objectivec:\"Objective-C\",objc:\"Objective-C\",ocaml:\"OCaml\",opencl:\"OpenCL\",openqasm:\"OpenQasm\",qasm:\"OpenQasm\",parigp:\"PARI/GP\",objectpascal:\"Object Pascal\",psl:\"PATROL Scripting Language\",pcaxis:\"PC-Axis\",px:\"PC-Axis\",peoplecode:\"PeopleCode\",pcode:\"PeopleCode\",php:\"PHP\",phpdoc:\"PHPDoc\",\"php-extras\":\"PHP Extras\",\"plant-uml\":\"PlantUML\",plantuml:\"PlantUML\",plsql:\"PL/SQL\",powerquery:\"PowerQuery\",pq:\"PowerQuery\",mscript:\"PowerQuery\",powershell:\"PowerShell\",promql:\"PromQL\",properties:\".properties\",protobuf:\"Protocol Buffers\",purebasic:\"PureBasic\",pbfasm:\"PureBasic\",purs:\"PureScript\",py:\"Python\",qsharp:\"Q#\",qs:\"Q#\",q:\"Q (kdb+ database)\",qml:\"QML\",rkt:\"Racket\",cshtml:\"Razor C#\",razor:\"Razor C#\",jsx:\"React JSX\",tsx:\"React TSX\",renpy:\"Ren'py\",rpy:\"Ren'py\",res:\"ReScript\",rest:\"reST (reStructuredText)\",robotframework:\"Robot Framework\",robot:\"Robot Framework\",rb:\"Ruby\",sas:\"SAS\",sass:\"Sass (Sass)\",scss:\"Sass (SCSS)\",\"shell-session\":\"Shell session\",\"sh-session\":\"Shell session\",shellsession:\"Shell session\",sml:\"SML\",smlnj:\"SML/NJ\",solidity:\"Solidity (Ethereum)\",sol:\"Solidity (Ethereum)\",\"solution-file\":\"Solution file\",sln:\"Solution file\",soy:\"Soy (Closure Template)\",sparql:\"SPARQL\",rq:\"SPARQL\",\"splunk-spl\":\"Splunk SPL\",sqf:\"SQF: Status Quo Function (Arma 3)\",sql:\"SQL\",stata:\"Stata Ado\",iecst:\"Structured Text (IEC 61131-3)\",supercollider:\"SuperCollider\",sclang:\"SuperCollider\",systemd:\"Systemd configuration file\",\"t4-templating\":\"T4 templating\",\"t4-cs\":\"T4 Text Templates (C#)\",t4:\"T4 Text Templates (C#)\",\"t4-vb\":\"T4 Text Templates (VB)\",tap:\"TAP\",tt2:\"Template Toolkit 2\",toml:\"TOML\",trickle:\"trickle\",troy:\"troy\",trig:\"TriG\",ts:\"TypeScript\",tsconfig:\"TSConfig\",uscript:\"UnrealScript\",uc:\"UnrealScript\",uorazor:\"UO Razor Script\",uri:\"URI\",url:\"URL\",vbnet:\"VB.Net\",vhdl:\"VHDL\",vim:\"vim\",\"visual-basic\":\"Visual Basic\",vba:\"VBA\",vb:\"Visual Basic\",wasm:\"WebAssembly\",\"web-idl\":\"Web IDL\",webidl:\"Web IDL\",wgsl:\"WGSL\",wiki:\"Wiki markup\",wolfram:\"Wolfram language\",nb:\"Mathematica Notebook\",wl:\"Wolfram language\",xeoracube:\"XeoraCube\",\"xml-doc\":\"XML doc (.net)\",xojo:\"Xojo (REALbasic)\",xquery:\"XQuery\",yaml:\"YAML\",yml:\"YAML\",yang:\"YANG\"};Prism.plugins.toolbar.registerButton(\"show-language\",(function(a){var t=a.element.parentNode;if(t&&/pre/i.test(t.nodeName)){var o,i=t.getAttribute(\"data-language\")||e[a.language]||((o=a.language)?(o.substring(0,1).toUpperCase()+o.substring(1)).replace(/s(?=cript)/,\"S\"):o);if(i){var s=document.createElement(\"span\");return s.textContent=i,s}}}))}else console.warn(\"Show Languages plugin loaded before Toolbar plugin.\")}();\n!function(){function t(t){var e=document.createElement(\"textarea\");e.value=t.getText(),e.style.top=\"0\",e.style.left=\"0\",e.style.position=\"fixed\",document.body.appendChild(e),e.focus(),e.select();try{var o=document.execCommand(\"copy\");setTimeout((function(){o?t.success():t.error()}),1)}catch(e){setTimeout((function(){t.error(e)}),1)}document.body.removeChild(e)}\"undefined\"!=typeof Prism&&\"undefined\"!=typeof document&&(Prism.plugins.toolbar?Prism.plugins.toolbar.registerButton(\"copy-to-clipboard\",(function(e){var o=e.element,n=function(t){var e={copy:\"复制\",\"copy-error\":\"Press Ctrl+C to copy\",\"copy-success\":\"复制成功!\",\"copy-timeout\":5e3};for(var o in e){for(var n=\"data-prismjs-\"+o,c=t;c&&!c.hasAttribute(n);)c=c.parentElement;c&&(e[o]=c.getAttribute(n))}return e}(o),c=document.createElement(\"button\");c.className=\"copy-to-clipboard-button\",c.setAttribute(\"type\",\"button\");var r=document.createElement(\"span\");return c.appendChild(r),u(\"copy\"),function(e,o){e.addEventListener(\"click\",(function(){!function(e){navigator.clipboard?navigator.clipboard.writeText(e.getText()).then(e.success,(function(){t(e)})):t(e)}(o)}))}(c,{getText:function(){return o.textContent},success:function(){u(\"copy-success\"),i()},error:function(){u(\"copy-error\"),setTimeout((function(){!function(t){window.getSelection().selectAllChildren(t)}(o)}),1),i()}}),c;function i(){setTimeout((function(){u(\"copy\")}),n[\"copy-timeout\"])}function u(t){r.textContent=n[t],c.setAttribute(\"data-copy-state\",t)}})):console.warn(\"Copy to Clipboard plugin loaded before Toolbar plugin.\"))}();\n"
  },
  {
    "path": "modules/codehightlight/static/styles/BlackMac.css",
    "content": "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:#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;}"
  },
  {
    "path": "modules/codehightlight/static/styles/GrayMac.css",
    "content": "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;}"
  },
  {
    "path": "modules/codehightlight/static/styles/WhiteMac.css",
    "content": "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;}"
  },
  {
    "path": "modules/codehightlight/static/styles/coy.css",
    "content": "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}"
  },
  {
    "path": "modules/codehightlight/static/styles/gruvbox-light.css",
    "content": "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}"
  },
  {
    "path": "modules/codehightlight/static/styles/material-dark.css",
    "content": "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;}"
  },
  {
    "path": "modules/codehightlight/static/styles/material-light.css",
    "content": "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;}"
  },
  {
    "path": "modules/codehightlight/static/styles/one-dark.css",
    "content": "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;}"
  },
  {
    "path": "modules/codehightlight/static/styles/one-light.css",
    "content": "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;}"
  },
  {
    "path": "modules/lock.php",
    "content": "<?php if(Bsoptions('AdControl') == true) :?>\n<?php if(Bsoptions('AdControl4') == true && !empty(Bsoptions('AdControl4Src'))) :?>\n<?php billboard(Bsoptions('AdControl4Src'),'other'); ?>\n  <?php endif; ?><?php endif; ?>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n                    \n                    <div class=\"ui placeholder segment\">\n  <div class=\"ui icon header\">\n    <i class=\"exclamation triangle icon\"></i>\n    分类「<?php $this->archiveTitle(array('category'  =>  _t('%s')), '', ''); ?>」\n    <?php if(!empty(CategoryEncrypt(categeid($this->getArchiveSlug()))['Cate_Encrypt_Note'])):?>\n <br>\n   <small><i class=\"question circle large icon\" style=\"display:inline-block;margin:auto\"></i> <?php echo CategoryEncrypt(categeid($this->getArchiveSlug()))['Cate_Encrypt_Note']; ?></small>  <?php endif; ?>\n  </div>\n  <div class=\"ui form\">\n  <div class=\"field\">\n    <label>请输入该分类的访问密码：</label>\n    <input type=\"password\" id=\"open_password\" placeholder=\"请输入访问密码\">\n  </div>\n  <div class=\"ui button\" id=\"encryptsubmit\">提交</div>\n</div>\n</div>\n                    \n                    </div></div>\n                    \n                    <script>\n                        $('#encryptsubmit').on('click',function(){\n                            $.ajax({\n                        type: \"POST\",\n                        url: \"<?php getEncrypt(); ?>\",\n                        data: {\n                            \"action\": 'open_lock',\n                            \"password\": $('#open_password').val(),\n                            \"encryptpassword\":'<?php echo $_POST['data']['md5_password']?>',\n                            \"type\": '<?php echo $_POST['data']['type']?>',\n                            \"category\": '<?php echo $_POST['data']['category']?>',\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\n                            if (json.code == \"1\"){\n               $('body')\n\t\t\t\t\t\t\t\t\t\t.toast({\n\t\t\t\t\t\t\t    title:'Ohhh~',\n\t\t\t\t\t\t\t    class: 'green',\n\t\t\t\t\t\t\t    message: '密码验证成功，两秒后自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n\n                setTimeout(function (){\n                    <?php if(Bsoptions('Pjax') == '1') :?>\n                     $.pjax({ url: window.location.href, container: '#pjax', fragment: '#pjax',timeout: 50000});\n                     <?php else:?>\n                    window.location.reload();\n                    <?php endif; ?>\n                },2000);\n            }else if (json.code == \"-1\"){\n                $('body').toast({\n\t\t\t\t\t\t\t    title:'抱歉~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您输入的密码错误，请重试', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n            }else if (json.code == \"-2\"){\n               $('body').toast({\n\t\t\t\t\t\t\t    title:'抱歉~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您尚未输入密码哦~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n            }\n                        },\n                        error: function() {\n                            $('body')\n\t\t\t\t\t\t\t.toast({\n\t\t\t\t\t\t\t    title:'抱歉~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '检测到您的网络环境异常，请稍后再试~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n                        }\n                    });\n                        })\n                    </script>"
  },
  {
    "path": "modules/lock_article.php",
    "content": "<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n                    \n                    <div class=\"ui placeholder segment\">\n  <div class=\"ui icon header\">\n    <i class=\"exclamation triangle icon\"></i>\n    <?php $this->widget('Widget_Metas_Category_List')->to($categorys);?>\n    <?php while ($categorys->next()): ?> <?php if ($this->category ==\n$categorys->slug):?>\n<?php $slug_name = $categorys->name; ?>\n<?php $slug = $categorys->slug; ?>\n<?php endif; ?>\n<?php endwhile; ?>\n    当前文章所属分类「<?php echo $slug_name; ?>」已被加密！\n    <?php if(!empty(CategoryEncrypt(categeid($slug))['Cate_Encrypt_Note'])):?>\n <br>\n   <small><i class=\"question circle large icon\" style=\"display:inline-block;margin:auto\"></i> <?php echo CategoryEncrypt(categeid($slug))['Cate_Encrypt_Note']; ?></small>  <?php endif; ?>\n  </div>\n  <div class=\"ui form\">\n  <div class=\"field\">\n    <label>请输入该分类的访问密码：</label>\n    <input type=\"password\" id=\"open_password\" placeholder=\"请输入访问密码\">\n  </div>\n  <div class=\"ui button\" id=\"encryptsubmit\">提交</div>\n</div>\n</div>\n                    \n                    </div></div>\n                    \n                    <script>\n                        $('#encryptsubmit').on('click',function(){\n                            $.ajax({\n                        type: \"POST\",\n                        url: \"<?php getEncrypt(); ?>\",\n                        data: {\n                            \"action\": 'open_lock',\n                            \"password\": $('#open_password').val(),\n                            \"encryptpassword\":'<?php echo $_POST['data']['md5_password']?>',\n                            \"type\": '<?php echo $_POST['data']['type']?>',\n                            \"category\": '<?php echo $_POST['data']['category']?>',\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\n                            if (json.code == \"1\"){\n               $('body')\n\t\t\t\t\t\t\t\t\t\t.toast({\n\t\t\t\t\t\t\t    title:'Ohhh~',\n\t\t\t\t\t\t\t    class: 'green',\n\t\t\t\t\t\t\t    message: '密码验证成功，两秒后自动刷新~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t\t\t\t});\n\n                setTimeout(function (){\n                    <?php if(Bsoptions('Pjax') == '1') :?>\n                     $.pjax({ url: window.location.href, container: '#pjax', fragment: '#pjax',timeout: 50000});\n                     <?php else:?>\n                    window.location.reload();\n                    <?php endif; ?>\n                },2000);\n            }else if (json.code == \"-1\"){\n                $('body').toast({\n\t\t\t\t\t\t\t    title:'抱歉~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您输入的密码错误，请重试', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n            }else if (json.code == \"-2\"){\n               $('body').toast({\n\t\t\t\t\t\t\t    title:'抱歉~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您尚未输入密码哦~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n            }\n                        },\n                        error: function() {\n                            $('body')\n\t\t\t\t\t\t\t.toast({\n\t\t\t\t\t\t\t    title:'抱歉~',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '检测到您的网络环境异常，请稍后再试~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});\n                        }\n                    });\n                        })\n                    </script>"
  },
  {
    "path": "modules/poster.php",
    "content": "<div id=\"posterModal\" class=\"poster-modal\">\n    <div class=\"poster-modal__content\" onclick=\"event.stopPropagation()\">\n        <span class=\"poster-modal__close\" onclick=\"closeModal()\">&times;</span>\n        <!-- 加载动画 -->\n        <div id=\"posterLoading\" class=\"poster-modal__loading\">\n            <div class=\"poster-modal__spinner\"></div>\n            <div class=\"poster-modal__loading-text\">生成中，请稍候...</div>\n        </div>\n        <img id=\"posterImage\" src=\"\" alt=\"海报\" style=\"display: none;\">\n        <!-- 下载海报按钮 -->\n        <div class=\"poster-modal__button-container\">\n            <button class=\"poster-modal__button\" onclick=\"downloadPoster()\" style=\"display: none;\">下载海报</button>\n        </div>\n    </div>\n</div>\n\n<!-- 引入库 -->\n<script src=\"<?php AssetsDir();?>assets/js/qrcode.min.js\"></script>\n<script src=\"<?php AssetsDir();?>assets/js/html2canvas.min.js\"></script>\n<script>\n    // 弹窗相关\n    var posterModal = document.getElementById('posterModal');\n    var posterImage = document.getElementById('posterImage');\n    var posterLoading = document.getElementById('posterLoading');\n    var downloadButton = document.querySelector('.poster-modal__button');\n\n    // 打开弹窗\n    function openModal() {\n        posterModal.classList.add('poster-modal--active');\n    }\n\n    // 关闭弹窗\n    function closeModal() {\n        posterModal.classList.remove('poster-modal--active');\n    }\n\n    // 点击外部关闭弹窗\n    posterModal.addEventListener('click', (event) => {\n        if (event.target === posterModal) {\n            closeModal();\n        }\n    });\n\n    // 生成海报\n    async function generatePoster() {\n        // 显示加载动画\n        posterLoading.style.display = 'flex';\n        posterImage.style.display = 'none';\n        downloadButton.style.display = 'none';\n\n        // 打开弹窗\n        openModal();\n\n        // 使用 setTimeout 确保 UI 更新\n        await new Promise((resolve) => setTimeout(resolve, 0));\n\n        // 动态创建海报模板\n        var posterTemplate = document.createElement('div');\n        posterTemplate.className = 'poster-template';\n\n        // 封面\n        var cover = document.createElement('div');\n        cover.className = 'poster-template__cover';\n      \n        cover.style.backgroundImage = `url('<?php echo posterPic($this->cid);?>')`;\n        posterTemplate.appendChild(cover);\n\n        // 内容\n        var content = document.createElement('div');\n        content.className = 'poster-template__content';\n\n        // 标题\n        var title = document.createElement('div');\n        title.className = 'poster-template__title';\n        title.innerText = '<?php echo $this->title;?>';\n        content.appendChild(title);\n\n        // 摘要\n        var summary = document.createElement('div');\n        summary.className = 'poster-template__summary';\n        summary.innerText = `<?php if ($this->fields->excerpt == null): ?>\n            <?php echo excerpt($this->excerpt, 80); ?>\n        <?php else: ?>\n            <?php $this->fields->excerpt(); ?>\n        <?php endif; ?>`;\n        content.appendChild(summary);\n\n        // 信息\n        var info = document.createElement('div');\n        info.className = 'poster-template__info';\n        info.innerHTML = `\n            <span>作者：<?php $this->author(); ?></span>\n            <span>时间：<?php $this->date(); ?></span>\n        `;\n        content.appendChild(info);\n\n        // 底部区域\n        var footer = document.createElement('div');\n        footer.className = 'poster-template__footer';\n\n        var blogName = document.createElement('div');\n        blogName.className = 'poster-template__blog-name';\n        \n        <?php if(Bsoptions('Poster__LogoUrl') !== null && Bsoptions('Poster__LogoUrl') !== ''): ?>\n        var blogNameImage = document.createElement('img');\n        blogNameImage.src = '<?php echo Bsoptions('Poster__LogoUrl');?>';\n        blogName.appendChild(blogNameImage);\n        <?php else:?>\n        var blogNameText = document.createElement('span');\n        blogNameText.innerText = '<?php echo Bsoptions('textlogo_text') ?>';\n        blogName.appendChild(blogNameText);\n        <?php endif;?>\n        footer.appendChild(blogName);\n\n       // 二维码\n    var qrcodeContainer = document.createElement('div');\n    qrcodeContainer.className = 'poster-template__qrcode';\n    var articleUrl = '<?php $this->permalink(); ?>';\n    try {\n        const qrcodeImg = document.createElement('canvas');\n        QRCode.toCanvas(qrcodeImg, articleUrl, {\n        width: 100,\n        height: 100\n    });\n    const articleImageUrl = qrcodeImg.toDataURL('image/png');\n        qrcodeImg.src = articleImageUrl;\n        qrcodeContainer.appendChild(qrcodeImg);\n    } catch (error) {\n        console.error('生成二维码失败:', error);\n        qrcodeContainer.innerText = '二维码生成失败';\n    }\n\n    // 扫一扫文字\n    var scanText = document.createElement('div');\n    scanText.className = 'poster-template__qrcode-text';\n    scanText.innerText = '扫一扫二维码';\n    qrcodeContainer.appendChild(scanText);\n\nfooter.appendChild(qrcodeContainer);\n        posterTemplate.appendChild(content);\n        posterTemplate.appendChild(footer);\n        document.body.appendChild(posterTemplate);\n\n  \n        var canvas = await html2canvas(posterTemplate, {\n            logging: false\n        });\n\n        var img = canvas.toDataURL('image/png');\n        posterImage.src = img;\n\n\n        posterLoading.style.display = 'none';\n        posterImage.style.display = 'block';\n        downloadButton.style.display = 'block';\n\n\n        document.body.removeChild(posterTemplate);\n    }\n\n    // 下载海报\n    function downloadPoster() {\n        var link = document.createElement('a');\n        link.href = posterImage.src;\n        link.download = 'poster-<?php echo $this->cid;?>.png';\n        link.click();\n    }\n</script>"
  },
  {
    "path": "modules/siteMaintenance/default.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <title>本站正在维护中...</title>\n  <meta name=\"viewport\" content=\"user-scalable=no, width=device-width\" />\n<style>\nbody {\n    margin: 0;\n    padding: 0;\n}\n* {\n    box-sizing: border-box;\n}\n.maintenance {\n    background-image: url(/usr/themes/bearsimple/modules/siteMaintenance/images/main.jpg);\n    background-repeat: no-repeat;\n    background-position: center center;\n    background-attachment: scroll;\n    background-size: cover;\n}\n\n.maintenance {\n    width: 100%;\n    height: 100%;\n    min-height: 100vh;\n}\n\n.maintenance {\n    display: flex;\n    flex-flow: column nowrap;\n    justify-content: center;\n    align-items: center;\n}\n\n.maintenance_contain {\n    display: flex;\n    flex-direction: column;\n    flex-wrap: nowrap;\n    align-items: center;\n    justify-content: center;\n    width: 100%;  \n    padding: 15px;  \n}\n.maintenance_contain img {\n    width: auto;\n    max-width: 100%;\n}\n.pp-infobox-title-prefix {\n    font-weight: 500;\n    font-size: 20px;\n    color: #000000;\n    margin-top: 30px;\n    text-align: center;\n}\n\n.pp-infobox-title-prefix {\n    font-family: sans-serif;\n}\n\n.pp-infobox-title {\n    color: #000000;\n    font-family: sans-serif;\n    font-weight: 700;\n    font-size: 40px;\n    margin-top: 10px;\n    margin-bottom: 10px;\n    text-align: center;\n    display: block;\n    word-break: break-word;  \n}\n\n.pp-infobox-description {\n    color: #000000;\n    font-family:  sans-serif;\n    font-weight: 400;\n    font-size: 18px;\n    margin-top: 0px;\n    margin-bottom: 0px;\n    text-align: center;\n}\n\n.pp-infobox-description p {\n    margin: 0;\n}\n\n.title-text.pp-primary-title {\n    color: #000000;\n    padding-top: 0px;\n    padding-bottom: 0px;\n    padding-left: 0px;\n    padding-right: 0px;\n    font-family: sans-serif;\n    font-weight: 500;\n    font-size: 18px;\n    line-height: 1.4;\n    margin-top: 50px;\n    margin-bottom: 0px;\n}\n\n</style>\n</head>\n\n<body>\n  <div class=\"maintenance\">\n  <div class=\"maintenance_contain\">\n    <img src=\"/usr/themes/bearsimple/modules/siteMaintenance/images/main-vector.png\">\n    <span class=\"pp-infobox-title-prefix\">非常抱歉地告知您：</span>\n    <div class=\"pp-infobox-title-wrapper\">\n\t\t  <h3 class=\"pp-infobox-title\">本站正在维护施工中！</h3>\n\t  </div> \n  <div class=\"pp-infobox-description\">\n\t\t<p>我们会尽快结束维护施工并恢复正常访问~若您还有其他问题，请联系博主。</p>\t\t\t</div>    \n    \n  </div>\n</div>\n</body>\n</html>"
  },
  {
    "path": "modules/sticky.php",
    "content": "<?php\n$sticky = Bsoptions('sticky_cids');\n\nif($sticky && $this->is('index') || $this->is('front')){\n    $sticky_cids = explode(',', strtr($sticky, ' ', ','));\n    $sticky_html = $this->options->sticky_html; \n    $db = Typecho_Db::get();\n    $pageSize = $this->options->pageSize;\n    $select1 = $this->select()->where('type = ?', 'post');\n    $select2 = $this->select()->where('type = ? && status = ? && created < ?', 'post','publish',time());\n    $this->row = [];\n    $this->stack = [];\n    $this->length = 0;\n    $order = '';\n    foreach($sticky as $i => $cid) {\n        if($i == 0) $select1->where('cid = ?', $cid);\n        else $select1->orWhere('cid = ?', $cid);\n        $order .= \" when $cid then $i\";\n        $select2->where('table.contents.cid != ?', $cid); \n    }\n    if ($order) $select1->order(null,\"(case cid$order end)\");\n    if ($this->_currentPage == 1) foreach($db->fetchAll($select1) as $sticky_post){\n        $sticky_post['sticky'] = $sticky_html;\n        $this->push($sticky_post);\n    }\n$uid = $this->user->uid;\n    if($uid) $select2->orWhere('authorId = ? && status = ?',$uid,'private');\n    $sticky_posts = $db->fetchAll($select2->order('table.contents.created', Typecho_Db::SORT_DESC)->page($this->_currentPage, $this->parameter->pageSize));\n    foreach($sticky_posts as $sticky_post) $this->push($sticky_post);\n    $this->setTotal($this->getTotal()-count($sticky));\n}"
  },
  {
    "path": "modules/tools.php",
    "content": "<script>\n$(function() {\n  // 显示/隐藏下拉菜单\n  var toggleMenu = document.getElementById('toggle-menu');\n  var dropdownMenu = document.getElementById('dropdown-menu');\n\n  toggleMenu.addEventListener('click', () => {\n    dropdownMenu.classList.toggle('show');\n  });\n\n  // 点击其他地方隐藏下拉菜单\n  window.addEventListener('click', (event) => {\n    if (!event.target.closest('.article-actions')) {\n      dropdownMenu.classList.remove('show');\n    }\n  });\n  // 按 Esc 键关闭菜单\n  window.addEventListener('keydown', (event) => {\n    if (event.key === 'Escape') {\n      dropdownMenu.classList.remove('show');\n    }\n  });\n<?php if(Bsoptions('Readmode') == true): ?>\n // 获取元素\nvar readingModeOverlay = document.getElementById('reading-mode-overlay');\nvar toggleReadingMode = document.getElementById('toggle-reading-mode');\nvar exitReadingMode = document.getElementById('exit-reading-mode');\nvar toggleSettingsPanel = document.getElementById('toggle-settings-panel');\nvar settingsPanel = document.getElementById('settings-panel');\nvar readingModeContent = document.getElementById('reading-mode');\n\n// 进入阅读模式\ntoggleReadingMode.addEventListener('click', () => {\n    <?php if($this->hidden): ?>\n    $('body').toast({\n        title: '抱歉~',\n        class: 'warning',\n        message: '<?php echo empty(Bsoptions('globalTips')['articlePwdAfterEnterReadMode_Tip']) ? '本文存在密码，验证文章密码后方可进入阅读模式' : Bsoptions('globalTips')['articlePwdAfterEnterReadMode_Tip']; ?>',\n        showIcon: 'flushed outline',\n        showProgress: 'top',\n    });\n    return false;\n    <?php endif; ?>\n     \n\n    // 显示遮罩层\n    readingModeOverlay.style.position = 'fixed';\n    readingModeOverlay.style.top = '0'; // 显示在屏幕顶部\n    readingModeOverlay.style.left = '0'; // 显示在屏幕左侧\n    \n    if ($('#darkmode').is(':checked')) {\n        document.documentElement.setAttribute('data-theme', 'light');\n    }\n    $(\"#bs-theme-control\").css('display', 'none');\n    document.body.style.overflow = 'hidden';\nreadingModeOverlay.classList.add('show');\n\n});\n\nexitReadingMode.addEventListener('click', () => {\n    // 隐藏遮罩层\n    readingModeOverlay.style.position = 'absolute';\n    readingModeOverlay.style.top = '-9999px'; // 移动到屏幕外\n    readingModeOverlay.style.left = '-9999px'; // 移动到屏幕外\n\n    if ($('#darkmode').is(':checked') && setting.Mournmode !== 'true') {\n        document.documentElement.setAttribute('data-theme', 'dark');\n    }\n    $(\"#bs-theme-control\").css('display', 'block');\n    document.body.style.overflow = '';\n});\n\n  // 显示/隐藏设置面板\n  toggleSettingsPanel.addEventListener('click', (event) => {\n    event.stopPropagation(); // 阻止事件冒泡\n    settingsPanel.style.display = settingsPanel.style.display === 'block' ? 'none' : 'block';\n  });\n\n  // 点击空白处隐藏设置面板\n  document.addEventListener('click', (event) => {\n    if (!event.target.closest('.reading-mode-panel') && !event.target.closest('#toggle-settings-panel')) {\n      settingsPanel.style.display = 'none';\n    }\n  });\n\n  // 切换背景颜色\n  document.getElementById('bg-light').addEventListener('click', () => {\n    readingModeOverlay.classList.remove('bg-sepia', 'bg-dark');\n    readingModeOverlay.classList.add('bg-light');\n    readingModeOverlay.style.color = '#333'; // 设置文字颜色\n  });\n\n  document.getElementById('bg-sepia').addEventListener('click', () => {\n    readingModeOverlay.classList.remove('bg-light', 'bg-dark');\n    readingModeOverlay.classList.add('bg-sepia');\n    readingModeOverlay.style.color = '#5a4a42'; // 设置文字颜色\n  });\n\n  document.getElementById('bg-dark').addEventListener('click', () => {\n    readingModeOverlay.classList.remove('bg-light', 'bg-sepia');\n    readingModeOverlay.classList.add('bg-dark');\n    readingModeOverlay.style.color = '#f5f5f5'; // 设置文字颜色\n  });\n\n  // 切换字体大小（阅读模式）\n  document.getElementById('text-small').addEventListener('click', () => {\n    readingModeContent.style.fontSize = '16.369px';\n  });\n\n  document.getElementById('text-medium').addEventListener('click', () => {\n    readingModeContent.style.fontSize = '18.82px';\n  });\n\n  document.getElementById('text-large').addEventListener('click', () => {\n    readingModeContent.style.fontSize = '21.28px';\n  });\n  <?php if(Bsoptions('Readmode_Auto') == true && !$this->hidden): ?>\n  $(\"#toggle-reading-mode\").click();\n  <?php endif;?>\n<?php endif;?>\n // 切换字体（普通模式）\nvar fontSwitch1 = document.getElementById('article_change_m');\nvar fontSwitch2 = document.getElementById('article_change_k');\nvar fontSwitch3 = document.getElementById('article_change_xlwk');\nvar bodyElement = document.getElementById('post-content');\n\nvar updateFontCheckmark = (selectedButton) => {\n  // 移除所有字体按钮的打勾\n  document.querySelectorAll('#article_change_m, #article_change_k, #article_change_xlwk').forEach(button => {\n    button.classList.remove('active');\n  });\n  // 为选中的按钮添加打勾\n  selectedButton.classList.add('active');\n};\n\nfontSwitch1.addEventListener('click', () => {\n  $('.post-content').removeClass('article_font_xlwk');\n  $('.post-content').removeClass('article_font');\n  localStorage.setItem('article_font', 'm');\n  updateFontCheckmark(fontSwitch1);\n});\n\nfontSwitch2.addEventListener('click', () => {\n  $('.post-content').addClass('article_font');\n  $('.post-content').removeClass('article_font_xlwk');\n  localStorage.setItem('article_font', 'k');\n  updateFontCheckmark(fontSwitch2);\n});\n\nfontSwitch3.addEventListener('click', () => {\n  $('.post-content').removeClass('article_font');\n  $('.post-content').addClass('article_font_xlwk');\n  localStorage.setItem('article_font', 'xlwk');\n  updateFontCheckmark(fontSwitch3);\n});\n\n// 初始化字体打勾状态\nif (localStorage.getItem('article_font')) {\n  switch (localStorage.getItem('article_font')) {\n    case 'k':\n      $('.post-content').addClass('article_font');\n      updateFontCheckmark(fontSwitch2);\n      break;\n    case 'xlwk':\n      $('.post-content').addClass('article_font_xlwk');\n      updateFontCheckmark(fontSwitch3);\n      break;\n    case 'm':\n      $('.post-content').removeClass('article_font');\n      updateFontCheckmark(fontSwitch1);\n      break;\n  }\n}\n\n// 切换字体大小（普通模式）\nvar sizeSmall = document.getElementById('text-size-small');\nvar sizeMedium = document.getElementById('text-size-medium');\nvar sizeLarge = document.getElementById('text-size-large');\n\nvar updateSizeCheckmark = (selectedButton) => {\n  // 移除所有字体大小按钮的打勾\n  document.querySelectorAll('#text-size-small, #text-size-medium, #text-size-large').forEach(button => {\n    button.classList.remove('active');\n  });\n  // 为选中的按钮添加打勾\n  selectedButton.classList.add('active');\n};\n\nsizeSmall.addEventListener('click', () => {\n  document.getElementById('post-content').style.fontSize = '16.369px';\n  localStorage.setItem('text_size', 'small');\n  updateSizeCheckmark(sizeSmall);\n});\n\nsizeMedium.addEventListener('click', () => {\n  document.getElementById('post-content').style.fontSize = '18.82px';\n  localStorage.setItem('text_size', 'medium');\n  updateSizeCheckmark(sizeMedium);\n});\n\nsizeLarge.addEventListener('click', () => {\n  document.getElementById('post-content').style.fontSize = '21.28px';\n  localStorage.setItem('text_size', 'large');\n  updateSizeCheckmark(sizeLarge);\n});\n\n// 初始化字体大小打勾状态\nif (localStorage.getItem('text_size')) {\n  var textSize = localStorage.getItem('text_size');\n  var postContent = document.getElementById('post-content');\n\n  switch (textSize) {\n    case 'small':\n      postContent.style.fontSize = '16.369px';\n      updateSizeCheckmark(sizeSmall);\n      break;\n    case 'medium':\n      postContent.style.fontSize = '18.82px';\n      updateSizeCheckmark(sizeMedium);\n      break;\n    case 'large':\n      postContent.style.fontSize = '21.28px';\n      updateSizeCheckmark(sizeLarge);\n      break;\n  }\n}\n\n});\n</script>"
  },
  {
    "path": "modules/translate.php",
    "content": "  <div class=\"foot-setting-item global\">\n  <div class=\"foot-setting-label\">\n    <i class=\"fas fa-globe\"></i>\n    <span>全球语言</span>\n  </div>\n  <select id=\"language-select\" class=\"language-select\">\n      <option value=\"chinese_simplified\">简体中文</option>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('chinese_traditional',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"chinese_traditional\">繁体中文</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('german',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"german\">Deutsch</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('corsican',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"corsican\">Corsu</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('guarani',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"guarani\">Guarani</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('kinyarwanda',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"kinyarwanda\">Kinyarwanda</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('hausa',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"hausa\">Hausa</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('norwegian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"norwegian\">Norge</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('dutch',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"dutch\">Nederlands</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('yoruba',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"yoruba\">Yoruba</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('english',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"english\">English</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('gongen',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"gongen\">गोंगेन हें नांव</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('latin',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"latin\">Latina</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('nepali',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"nepali\">नेपाली</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('french',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"french\">Français</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('czech',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"czech\">čeština</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('hawaiian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"hawaiian\">ʻŌlelo Hawaiʻi</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('georgian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"georgian\">ჯორჯიანი</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('russian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"russian\">Русский</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('persian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"persian\">فارسی</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('bhojpuri',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"bhojpuri\">भोजपुरी</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('hindi',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"hindi\">हिंदी</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('belarusian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"belarusian\">беларускі</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('swahili',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"swahili\">Kiswahili</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('icelandic',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"icelandic\">Íslenska</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('yiddish',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"yiddish\">ייַדיש</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('twi',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"twi\">Twi</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('irish',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"irish\">Gaeilge</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('gujarati',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"gujarati\">ગુજરાતી</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('khmer',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"khmer\">ខ្មែរ</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('slovak',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"slovak\">Slovenčina</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('hebrew',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"hebrew\">עברית</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('kannada',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"kannada\">ಕನ್ನಡ</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('hungarian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"hungarian\">Magyar</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('tamil',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"tamil\">தமிழ்</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('arabic',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"arabic\">العربية</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('bengali',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"bengali\">বাংলা</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('azerbaijani',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"azerbaijani\">Azərbaycan</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('samoan',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"samoan\">Samoan</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('afrikaans',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"afrikaans\">Afrikaans</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('indonesian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"indonesian\">Bahasa Indonesia</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('danish',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"danish\">Dansk</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('shona',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"shona\">Shona</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('bambara',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"bambara\">Bamanankan</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('lithuanian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"lithuanian\">Lietuvių</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('vietnamese',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"vietnamese\">Tiếng Việt</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('maltese',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"maltese\">Malti</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('turkmen',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"turkmen\">Türkmen</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('assamese',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"assamese\">অসমীয়া</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('catalan',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"catalan\">Català</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('singapore',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"singapore\">Singapore</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('cebuano',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"cebuano\">Cebuano</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('scottish-gaelic',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"scottish-gaelic\">Gàidhlig</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('sanskrit',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"sanskrit\">संस्कृत</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('polish',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"polish\">Polski</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('galician',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"galician\">Galego</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('latvian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"latvian\">Latviešu</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('ukrainian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"ukrainian\">Українська</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('tatar',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"tatar\">Татар</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('welsh',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"welsh\">Cymraeg</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('japanese',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"japanese\">日本語</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('filipino',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"filipino\">Filipino</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('aymara',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"aymara\">Aymara</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('lao',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"lao\">ລາວ</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('telugu',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"telugu\">తెలుగు</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('romanian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"romanian\">Română</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('haitian_creole',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"haitian_creole\">Kreyòl Ayisyen</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('dogrid',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"dogrid\">डोग्रिड</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('swedish',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"swedish\">Svenska</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('maithili',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"maithili\">मैथिली</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('thai',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"thai\">ไทย</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('armenian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"armenian\">Հայերեն</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('burmese',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"burmese\">မြန်မာ</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('pashto',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"pashto\">پښتو</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('hmong',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"hmong\">Hmoob</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('dhivehi',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"dhivehi\">ދިވެހި</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('luxembourgish',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"luxembourgish\">Lëtzebuergesch</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('sindhi',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"sindhi\">سنڌي</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('kurdish',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"kurdish\">Kurdî</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('turkish',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"turkish\">Türkçe</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('macedonian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"macedonian\">Македонски</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('bulgarian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"bulgarian\">Български</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('malay',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"malay\">Bahasa Melayu</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('luganda',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"luganda\">Luganda</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('marathi',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"marathi\">मराठी</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('estonian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"estonian\">Eesti</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('malayalam',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"malayalam\">മലയാളം</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('slovene',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"slovene\">Slovenščina</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('urdu',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"urdu\">اردو</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('portuguese',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"portuguese\">Português</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('igbo',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"igbo\">Igbo</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('kurdish_sorani',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"kurdish_sorani\">کوردی-سۆرانی</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('oromo',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"oromo\">Oromoo</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('greek',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"greek\">Ελληνικά</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('spanish',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"spanish\">Español</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('frisian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"frisian\">Frysk</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('somali',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"somali\">Soomaali</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('amharic',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"amharic\">አማርኛ</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('nyanja',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"nyanja\">Nyanja</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('punjabi',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"punjabi\">ਪੰਜਾਬੀ</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('basque',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"basque\">Euskara</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('italian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"italian\">Italiano</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('albanian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"albanian\">Shqip</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('korean',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"korean\">한국어</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('tajik',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"tajik\">Тоҷикӣ</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('finnish',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"finnish\">Suomi</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('kyrgyz',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"kyrgyz\">Кыргызча</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('ewe',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"ewe\">Eʋegbe</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('croatian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"croatian\">Hrvatski</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('creole',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"creole\">Kreyòl</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('quechua',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"quechua\">Quechua</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('bosnian',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"bosnian\">Bosanski</option>\n    <?php endif; ?>\n    <?php if(!empty(Bsoptions('WorldLanguage')[0]) && @in_array('maori',Bsoptions('WorldLanguage'))): ?>\n      <option value=\"maori\">Māori</option>\n    <?php endif; ?>\n    <?php if(empty(Bsoptions('WorldLanguage'))): ?>\n      <option disabled>暂未找到可选语言</option>\n    <?php endif; ?>\n  </select>\n</div>\n<script>\n$(document).ready(function() {\n  const savedLanguage = localStorage.getItem('selectedLanguage');\n\n  if (savedLanguage) {\n    $('#language-select').val(savedLanguage);\n  }\n\n  // 监听语言选择的变化\n  $('#language-select').on('change', function () {\n    const selectedLanguage = $(this).val();\n\n    localStorage.setItem('selectedLanguage', selectedLanguage);\n\n    translate.changeLanguage(selectedLanguage);\n  });\n});\n</script>"
  },
  {
    "path": "modules/tw_cn.js",
    "content": "var defaultEncoding = 2;\nvar translateDelay = 0;\nvar cookieDomain = \"/\";\nvar msgToTraditionalChinese = \"简体\";\nvar msgToSimplifiedChinese = \"繁體\";\nvar translateButtonId = \"translateLink\";\nvar currentEncoding = defaultEncoding;\nvar targetEncodingCookie = \"targetEncoding\" + cookieDomain.replace(/\\./g, \"\");\nvar targetEncoding = (getCookie(targetEncodingCookie) == null ? defaultEncoding: getCookie(targetEncodingCookie));\nvar translateButtonObject;\nfunction translateText(txt) {\n\tif (txt == \"\" || txt == null) return \"\";\n\tif (currentEncoding == 1 && targetEncoding == 2) return Simplized(txt);\n\telse if (currentEncoding == 2 && targetEncoding == 1) return Traditionalized(txt);\n\telse return txt\n}\nfunction translateBody(fobj) {\n\tif (typeof(fobj) == \"object\") var objs = fobj.childNodes;\n\telse var objs = document.body.childNodes;\n\tfor (var i = 0; i < objs.length; i++) {\n\t\tvar obj = objs.item(i);\n\t\tif (\"||BR|HR|TEXTAREA|\".indexOf(\"|\" + obj.tagName + \"|\") > 0 || obj == translateButtonObject) continue;\n\t\tif (obj.title != \"\" && obj.title != null) obj.title = translateText(obj.title);\n\t\tif (obj.alt != \"\" && obj.alt != null) obj.alt = translateText(obj.alt);\n\t\tif (obj.tagName == \"INPUT\" && obj.value != \"\" && obj.type != \"text\" && obj.type != \"hidden\") obj.value = translateText(obj.value);\n\t\tif (obj.nodeType == 3) obj.data = translateText(obj.data);\n\t\telse translateBody(obj)\n\t}\n}\nfunction translatePage() {\n\tif (targetEncoding == 1) {\n\t\tcurrentEncoding = 1;\n\t\ttargetEncoding = 2;\n\t\ttranslateButtonObject.innerHTML = msgToTraditionalChinese;\n\t\tsetCookie(targetEncodingCookie, targetEncoding, 7);\n\t\ttranslateBody()\n\t} else if (targetEncoding == 2) {\n\t\tcurrentEncoding = 2;\n\t\ttargetEncoding = 1;\n\t\ttranslateButtonObject.innerHTML = msgToSimplifiedChinese;\n\t\tsetCookie(targetEncodingCookie, targetEncoding, 7);\n\t\ttranslateBody()\n\t}\n}\nfunction JTPYStr() {\n\treturn '万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾鼋鼌鼍鼗鼹齄齐齑齿龀龁龂龃龄龅龆龇龈龉龊龋龌龙龚龛龟志制咨只里系范松没尝尝闹面准钟别闲干尽脏拼'\n}\nfunction FTPYStr() {\n\treturn '萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊溜愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽黿鼂鼉鞀鼴齇齊齏齒齔齕齗齟齡齙齠齜齦齬齪齲齷龍龔龕龜誌製谘隻裡係範鬆冇嚐嘗鬨麵準鐘彆閒乾儘臟拚'\n}\nfunction Traditionalized(cc) {\n\tvar str = '';\n\tvar ss = JTPYStr();\n\tvar tt = FTPYStr();\n\tfor (var i = 0; i < cc.length; i++) {\n\t\tif (cc.charCodeAt(i) > 10000 && ss.indexOf(cc.charAt(i)) != -1) str += tt.charAt(ss.indexOf(cc.charAt(i)));\n\t\telse str += cc.charAt(i)\n\t}\n\treturn str\n}\nfunction Simplized(cc) {\n\tvar str = '';\n\tvar ss = JTPYStr();\n\tvar tt = FTPYStr();\n\tfor (var i = 0; i < cc.length; i++) {\n\t\tif (cc.charCodeAt(i) > 10000 && tt.indexOf(cc.charAt(i)) != -1) str += ss.charAt(tt.indexOf(cc.charAt(i)));\n\t\telse str += cc.charAt(i)\n\t}\n\treturn str\n}\nfunction setCookie(name, value, days) {\n\tif (days) {\n\t\tvar date = new Date();\n\t\tdate.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n\t\tvar expires = \"; expires=\" + date.toGMTString()\n\t} else var expires = \"\";\n\tdocument.cookie = name + \"=\" + value + expires + \"; path=/\"\n}\nfunction getCookie(name) {\n\tvar nameEQ = name + \"=\";\n\tvar ca = document.cookie.split(';');\n\tfor (var i = 0; i < ca.length; i++) {\n\t\tvar c = ca[i];\n\t\twhile (c.charAt(0) == ' ') c = c.substring(1, c.length);\n\t\tif (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length)\n\t}\n\treturn null\n}\nfunction translateInitilization() {\n\ttranslateButtonObject = document.getElementById(translateButtonId);\n\tif (translateButtonObject) {\n\t\twith(translateButtonObject) {\n\t\t\tif (typeof(document.all) != \"object\") {\n\t\t\t\thref = \"javascript:translatePage();\"\n\t\t\t} else {\n\t\t\t\thref = \"#\";\n\t\t\t\tonclick = new Function(\"translatePage(); return false;\")\n\t\t\t}\n\t\t}\n\t\tif (currentEncoding != targetEncoding) {\n\t\t\tsetTimeout(\"translateBody()\", translateDelay);\n\t\t\tif (targetEncoding == 1) translateButtonObject.innerHTML = msgToSimplifiedChinese;\n\t\t\telse translateButtonObject.innerHTML = msgToTraditionalChinese\n\t\t}\n\t}\n}"
  },
  {
    "path": "page.php",
    "content": "<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; \n?>\n<?php $this->need('compoment/head.php');?>\n\n<?php $this->need('pages/page.php'); ?>\n\n\n<script>\narticleCid=<?php echo $this->cid;?>;\narticleType= 'page';\nfunction addPostView(){if (typeof articleCid != 'undefined' && articleCid) $.post('/',{postview:articleCid,postType:articleType},function (res) {articleCid='';\n       $('#ahot').html(res.data);\n   })}\nfunction addPostEditBtn(){\n    $.post('<?php getIsLogin(); ?>',{action:'find'},function (res) {\n        res = JSON.parse(res);\n        switch(res.code){\n    case 1 :\n       $('#editbtn').show();\n    break;\n        }\n    })\n}\n   $(function(){addPostView();addPostEditBtn();})\n</script>\n <?php if(Bsoptions('AIService') == true && Bsoptions('AIService_Key') !== ''): ?> \n<script src=\"<?php AssetsDir();?>assets/vendors/aiTool/ai.min.js\"></script>\n<?php endif;?>\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>\n"
  },
  {
    "path": "pages/album.php",
    "content": "<?php if(Bsoptions('AdControl') == true) :?>\n<?php if(Bsoptions('AdControl4') == true && !empty(Bsoptions('AdControl4Src'))) :?>\n<?php billboard(Bsoptions('AdControl4Src'),'other'); ?>\n  <?php endif; ?><?php endif; ?>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n                  \n                        <div class=\"category-card\">\n    <!-- 背景图片 -->\n    <img src=\"<?php AssetsDir(); ?>assets/images/square.webp\" class=\"card-background\">\n    \n    <!-- 内容区域 -->\n    <div class=\"card-content\">\n        <div class=\"icon\">\n            <i class=\"images outline icon\"></i>\n        </div>\n        <h3 class=\"category-name\">\n            <?php $this->archiveTitle(array(\n            'category'  =>  _t('%s'),\n            'search'    =>  _t('包含关键字「%s」的相册'),\n            'tag'       =>  _t('标签「%s」下的相册'),\n            'author'    =>  _t('「%s」发布的相册')\n        ), '', ''); ?>\n        </h3>\n        <?php if($this->is('category')): ?>\n            <p class=\"category-description\"><?php echo $this->getDescription();?></p>\n        <?php endif; ?>\n    </div>\n</div>\n   \n\n   \n<?php if(Bsoptions('Slidersss') == true && Bsoptions('SliderOthers') == true) :?>\n <div id=\"bearslider\">\n\t    <?php foreach (Bsoptions('slider__content') as $sliderpic) { ?>\n\t\t<a href=\"<?php echo $sliderpic['slider__url'];?>\"><img src=\"<?php echo $sliderpic['slider__pic'];?>\"  title=\"<?php echo $sliderpic['slider__title'];?>\" alt=\"<?php echo $sliderpic['slider__desc'];?>\"></a>\n\t\t <?php } ?>\n\t\n\t</div>\n\n<?php endif; ?>\n <div class=\"page-card\">\n           <?php if ($this->have()): ?>\n               <div class=\"album-list\">\n\n   <?php while($this->next()): ?>\n <a class=\"album\" href=\"<?php $this->permalink() ?>\">\n        <img <?php echo lazyload('1'); ?>src=\"<?php echo thumb2($this,'album'); ?>\" alt=\"相册\" class=\"album-cover\">\n        <div class=\"album-info\">\n            <h3 class=\"album-title\"><?php echo $this->title ?></h3>\n        </div>\n    </a>\n    \n   \t<?php endwhile; ?>\n</div>\n\n<?php\n      ob_start(); \n      $this->pageNav('&laquo;','&raquo;', 1, '');\n      $content = ob_get_contents();\n      ob_end_clean();\n      if(Bsoptions('pagination_style') == '2'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<nav class=\"page-navigator\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<span class=\"page-number\">...</span>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n       $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);\n      $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);\n      $content = preg_replace(\"/<\\/ol>/sm\", '</nav>', $content);\n      }\n      if(empty(Bsoptions('pagination_style')) || Bsoptions('pagination_style') == '1'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<div class=\"ui labels\" style=\"margin-top:30px\"><div style=\"text-align:center\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<a class=\"ui large label\">...</a>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      $content = preg_replace(\"/<\\/ol>/sm\", '</div></div>', $content);\n      }\n      echo $content;\n     ?>\n     \n   <?php else :?>\n<article class=\"post\">\n        <center><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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></linearGradient></defs><g transform=\"translate(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg></center>\n                <center><h2>这里暂时没有相册～</h2></center>\n            </article>\n            \n<?php endif; ?>\n\n\n    \n     \n\n  </div>\n     </div>\n</div>"
  },
  {
    "path": "pages/archive.php",
    "content": "                    <?php if(Bsoptions('AdControl') == true && Bsoptions('AdControl4') == true) :?>\n<?php billboard(Bsoptions('AdControl4_style'),'other'); ?>\n  <?php endif; ?>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n<?php if(Bsoptions('Slidersss') == true && Bsoptions('SliderOthers') == true) :?>\n  <div id=\"bearslider\" style=\"display:none;margin-bottom:20px\">\n <?php foreach (Bsoptions('slider__content') as $sliderpic) { ?>\n\t\t<a href=\"<?php echo $sliderpic['slider__url'];?>\"<?php if($sliderpic['slider__window']== true):?> target=\"_blank\"<?php endif; ?>><img src=\"<?php echo $sliderpic['slider__pic'];?>\"  title=\"<?php echo $sliderpic['slider__title'];?>\" alt=\"<?php echo $sliderpic['slider__desc'];?>\"></a>\n\t\t <?php } ?>\n\t\n\t</div>\n\n<?php endif; ?>\n<div class=\"category-card\">\n    <!-- 背景图片 -->\n    <img src=\"<?php AssetsDir(); ?>assets/images/square.webp\" class=\"card-background\">\n    \n    <!-- 内容区域 -->\n    <div class=\"card-content\">\n        <div class=\"icon\">\n            <?php $this->archiveTitle(array(\n                'category'  =>  _t('<i class=\"newspaper icon\"></i>'),\n                'search'    =>  _t('<i class=\"search icon\"></i>'),\n                'tag'       =>  _t('<i class=\"tag icon\"></i>'),\n                'author'    =>  _t('作者「%s」的个人资料')\n            ), '', ''); ?>\n            \n        </div>\n        <h3 class=\"category-name\">\n            <?php $this->archiveTitle(array(\n                'category'  =>  _t('分类「%s」下的文章'),\n                'search'    =>  _t('包含关键字「%s」的文章'),\n                'tag'       =>  _t('标签「%s」下的文章'),\n                'author'    =>  _t('作者「%s」的个人资料')\n            ), '', ''); ?>\n        </h3>\n        <?php if($this->is('category')): ?>\n            <p class=\"category-description\"><?php echo $this->getDescription();?></p>\n        <?php endif; ?>\n    </div>\n</div>\n                  \n\n  \n\n\n\n           <?php if ($this->have()): ?>\n\n           <?php while($this->next()): ?>\n<?php switch(Bsoptions('Article_forma')):?>\n<?php case '1':\n    default:\n        ?>\n<div class=\"pic-article-card\">\n  <!-- 文章封面 -->\n  <div class=\"pic-article-cover\">\n    <?php if (thumb2($this) !== \"\"): ?>\n      <img <?php echo lazyload('auto', thumb2($this)); ?>src=\"<?php echo thumb2($this); ?>\">\n    <?php else: ?>\n      <img <?php echo lazyload('auto', thumb2($this)); ?>src=\"<?php AssetsDir(); ?>assets/images/cover_new.webp\">\n    <?php endif; ?>\n  </div>\n\n  <!-- 文章内容 -->\n  <div class=\"pic-article-content\">\n    <!-- 文章标题 -->\n    <h2 class=\"pic-article-title\">\n      <a href=\"<?php $this->permalink(); ?>\" <?php if (Bsoptions('article_blank') == true): ?>target=\"_blank\"<?php endif; ?>>\n        <?php $this->sticky(); ?>\n        <?php echo cutexpert($this->title, articletitlenum()); ?>\n      </a>\n    </h2>\n\n    <!-- 文章摘要 -->\n    <div class=\"pic-article-excerpt\">\n     <?php if ($this->fields->excerpt == null): ?>\n          <?php echo cutexpert($this->excerpt, articledecnum()); ?>\n        <?php else: ?>\n          <?php $this->fields->excerpt(); ?>\n        <?php endif; ?>\n    </div>\n\n    <!-- 文章元信息 -->\n    <div class=\"pic-article-meta\">\n      <span class=\"pic-meta-item\"><i class=\"fas fa-calendar-alt\"></i> <?php $this->date(); ?></span>\n      <?php if (!empty($this->category)): ?>\n        <span class=\"pic-meta-item\"><i class=\"fas fa-folder\"></i> <?php $this->category('<bsvi style=\"display:none\">', false); ?></bsvi></span>\n      <?php endif; ?>\n      <span class=\"pic-meta-item\"><i class=\"fas fa-comments\"></i> <?php $this->commentsNum('暂无评论', '1 条评论', '%d 条评论'); ?></span>\n    </div>\n  </div>\n</div>\n<?php break;\ncase '2':\n    ?>\n    <div class=\"simple-article-item\">\n    <!-- 文章标题 -->\n    <h2 class=\"simple-article-title\">\n      <a href=\"<?php $this->permalink(); ?>\" <?php if (Bsoptions('article_blank') == true): ?>target=\"_blank\"<?php endif; ?>><?php $this->sticky(); ?>\n        <?php echo cutexpert($this->title, articletitlenum()); ?></a>\n    </h2>\n\n    <!-- 文章摘要 -->\n    <div class=\"simple-article-excerpt\">\n        <?php if ($this->fields->excerpt == null): ?>\n          <?php echo cutexpert($this->excerpt, articledecnum()); ?>\n        <?php else: ?>\n          <?php $this->fields->excerpt(); ?>\n        <?php endif; ?>\n    </div>\n\n    <!-- 文章元信息 -->\n    <div class=\"simple-article-meta\">\n      <span class=\"meta-item\"><i class=\"fas fa-calendar-alt\"></i> <?php $this->date(); ?></span>\n      <span class=\"meta-item\"><i class=\"fas fa-folder\"></i> <?php $this->category('<bsvi style=\"display:none\">', false); ?></span>\n      <span class=\"meta-item\"><i class=\"fas fa-comments\"></i> <?php $this->commentsNum('暂无评论', '1 条评论', '%d 条评论'); ?></span>\n    </div>\n  </div>\n    <?php break;?>\n    <?php endswitch;?>\n<?php endwhile; ?>\n\n<?php else :?>\n<article class=\"post\">\n        <center><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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></linearGradient></defs><g transform=\"translate(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg></center>\n                <center><h2>这里暂时没有文章～</h2></center>\n                <?php if($this->is('search') && (Bsoptions('more_posts') == true && Bsoptions('more_posts_archive') == true)): ?>\n                <br>\n<div class=\"recommended-articles\">\n  <h3><i class=\"circular dice icon\"></i> 随机文章</h3>\n  <div class=\"article-masonry\">\n\t\t<?php getRandomPosts(); ?>\n\t\t\n\t\t \t</div></div>\n                <?php endif; ?>\n            </article>\n            \n<?php endif; ?>\n<?php if(Bsoptions('infinite_scroll') == false || empty(Bsoptions('infinite_scroll'))): ?>\n<?php\n      ob_start(); \n      $this->pageNav('&laquo;','&raquo;', 1, '');\n      $content = ob_get_contents();\n      ob_end_clean();\n      if(Bsoptions('pagination_style') == '2'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<nav class=\"page-navigator\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<span class=\"page-number\">...</span>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n       $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);\n      $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);\n      $content = preg_replace(\"/<\\/ol>/sm\", '</nav>', $content);\n      }\n      if(empty(Bsoptions('pagination_style')) || Bsoptions('pagination_style') == '1'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<div class=\"ui labels\" style=\"margin-top:30px\"><div style=\"text-align:center\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<a class=\"ui large label\">...</a>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      $content = preg_replace(\"/<\\/ol>/sm\", '</div></div>', $content);\n      }\n      echo $content;\n     ?>\n    \n     <?php endif; ?>\n\n  </div>\n     <?php if ($this->have()): ?>\n<?php if(Bsoptions('infinite_scroll') == true): ?>\n<div class=\"pagination\" style=\"display:none;\">\n                   \n                    <?php $this->pageLink('下一页','next'); ?>\n               </div>\n            \n<div class=\"page-load-status\" style=\"display:none;\">\n<div class=\"ui active centered inline loader infinite-scroll-request\" style=\"margin-top:20px\"></div>\n\n <h2 class=\"ui icon header infinite-scroll-last\">\n  <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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></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(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><ellipse cx=\"43\" cy=\"9.5\" rx=\"43\" ry=\"9.5\" transform=\"translate(253 701)\" fill=\"#ebedf5\"/><g transform=\"translate(63 354)\"><g transform=\"translate(258.49 305.55)\"><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(-524.241 -66.584)\" fill=\"#fff\"/><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(-523.763 -65.64)\" fill=\"url(#d)\"/></g><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-6.56-18.848-7.364-23.026,4.251-9.233,3.614-18.062c-.652-9.065-6.3-10.479-8.307-10.074s-3.609,2.392-6.154,3.47-6.292-.673-11.112,1.619-9.377,7.547-9.377,7.547c-2.009,2.561.4,10.648-.938,14.691s-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(-279.872 225.445)\" fill=\"#fff\"/><path d=\"M519.206,44.961s.961-1.578,1.726-1.594c1.313-.026,2.7,1.631,2.7,1.631S519.249,46.731,519.206,44.961Z\" transform=\"translate(-268.363 226.187)\" 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=\"translate(-269.464 223.151)\" fill=\"#757f95\"/><path d=\"M505.743,52.715s-6.088-1.338-6.755,3.318,4.181,7.509,7.656.6\" transform=\"translate(-279.292 231.235)\" fill=\"#fff\"/><path d=\"M503.084,74.624s-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.893s-3.738-10.346-8.593-14.5\" transform=\"translate(-276.501 243.626)\" fill=\"url(#e)\"/><path d=\"M514.078,48.635a.6.6,0,0,0-.522.31v0l-.009.014a4.814,4.814,0,0,1-3.228,2.322l-.019,0,0,0a.6.6,0,0,0-.509.5l-.011,0-.406,1.078s.341-.014.842-.088l.057-.307.11-.584v.865c.188-.031.389-.073.6-.121v-.747l.064.454.037.268a5.609,5.609,0,0,0,2.386-1.138,4.083,4.083,0,0,0,1.152-1.977c.04-.155.054-.248.054-.248A.6.6,0,0,0,514.078,48.635Z\" transform=\"translate(-273.668 229.087)\" fill=\"#757f95\"/><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(-270.216 243.516)\" fill=\"url(#f)\"/><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(-277.496 242.564)\" fill=\"#fff\"/></g><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg>\n  <div class=\"content\" style=\"margin-top:5px\">\n    啊哦，已经到底啦～\n  </div>\n</h2>\n\n<h2 class=\"ui icon header infinite-scroll-error\">\n  <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>\n  <div class=\"content\" style=\"margin-top:5px\">\n    啊哦，加载错误啦～\n  </div>\n</h2>\n\n</div>\n\n<?php if(categorynum(categoryid($this->getArchiveSlug())) > Bsoptions('infinite_pageSize') && $this->is('archive')): ?>\n<center><button class=\"ui right labeled icon button\" id=\"bsnext\" style=\"margin-top:20px;\">\n  <i class=\"right arrow icon\"></i>\n  加载更多\n</button></center>\n<?php elseif($this->getTotal() > Bsoptions('infinite_pageSize') && $this->is('search')): ?>\n<center><button class=\"ui right labeled icon button\" id=\"bsnext\" style=\"margin-top:20px;\">\n  <i class=\"right arrow icon\"></i>\n  加载更多\n</button></center>\n<?php else:?><center><br>\n<h2 class=\"ui icon header\">\n <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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></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(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><ellipse cx=\"43\" cy=\"9.5\" rx=\"43\" ry=\"9.5\" transform=\"translate(253 701)\" fill=\"#ebedf5\"/><g transform=\"translate(63 354)\"><g transform=\"translate(258.49 305.55)\"><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(-524.241 -66.584)\" fill=\"#fff\"/><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(-523.763 -65.64)\" fill=\"url(#d)\"/></g><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-6.56-18.848-7.364-23.026,4.251-9.233,3.614-18.062c-.652-9.065-6.3-10.479-8.307-10.074s-3.609,2.392-6.154,3.47-6.292-.673-11.112,1.619-9.377,7.547-9.377,7.547c-2.009,2.561.4,10.648-.938,14.691s-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(-279.872 225.445)\" fill=\"#fff\"/><path d=\"M519.206,44.961s.961-1.578,1.726-1.594c1.313-.026,2.7,1.631,2.7,1.631S519.249,46.731,519.206,44.961Z\" transform=\"translate(-268.363 226.187)\" 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=\"translate(-269.464 223.151)\" fill=\"#757f95\"/><path d=\"M505.743,52.715s-6.088-1.338-6.755,3.318,4.181,7.509,7.656.6\" transform=\"translate(-279.292 231.235)\" fill=\"#fff\"/><path d=\"M503.084,74.624s-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.893s-3.738-10.346-8.593-14.5\" transform=\"translate(-276.501 243.626)\" fill=\"url(#e)\"/><path d=\"M514.078,48.635a.6.6,0,0,0-.522.31v0l-.009.014a4.814,4.814,0,0,1-3.228,2.322l-.019,0,0,0a.6.6,0,0,0-.509.5l-.011,0-.406,1.078s.341-.014.842-.088l.057-.307.11-.584v.865c.188-.031.389-.073.6-.121v-.747l.064.454.037.268a5.609,5.609,0,0,0,2.386-1.138,4.083,4.083,0,0,0,1.152-1.977c.04-.155.054-.248.054-.248A.6.6,0,0,0,514.078,48.635Z\" transform=\"translate(-273.668 229.087)\" fill=\"#757f95\"/><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(-270.216 243.516)\" fill=\"url(#f)\"/><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(-277.496 242.564)\" fill=\"#fff\"/></g><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg>\n\n  <div class=\"content\" style=\"margin-top:5px\">\n    啊哦，已经到底啦～\n  </div>\n</h2></center>\n  <?php endif; ?>\n\n  <?php endif; ?>\n\n  <?php endif; ?></div>"
  },
  {
    "path": "pages/author.php",
    "content": "<?php $loader = Bsoptions('Lazyload_style');?>\n<?php if(Bsoptions('AdControl') == true) :?>\n<?php if(Bsoptions('AdControl4') == true && !empty(Bsoptions('AdControl4Src'))) :?>\n<?php billboard(Bsoptions('AdControl4Src'),'other'); ?>\n  <?php endif; ?><?php endif; ?>\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n    \n  <div class=\"post_author\">\n  <div class=\"post_author-avatar\"><img alt=\"<?php echo $this->getArchiveTitle(); ?>\" src=\"<?php echo imgravatarq(getAuthorInfo($this->getArchiveSlug(),'mail')); ?>\" loading=\"lazy\"></div>\n  <div class=\"post_author-content\">\n    <div class=\"post_author-header\">\n      <span class=\"post_author-name\"><?php echo $this->getArchiveTitle(); ?></span>\n  </div>\n      <span class=\"post_author-title\"><?php if(user_tier(getAuthorInfo($this->getArchiveSlug(),'coins')) == ''):?>暂无等级<?php else:?><?php echo user_tier(getAuthorInfo($this->getArchiveSlug(),'coins')); ?><?php endif;?></span>\n  <p class=\"post_author-bio\"> <?php if(getAuthorInfo($this->getArchiveSlug(),'person_Signature') == 0):?>这个人太懒了，没有留下个性签名<?php else:?><?php echo getAuthorInfo($this->getArchiveSlug(),'signature'); ?><?php endif; ?></p></div></div>\n\n<div class=\"page-card\">\n<div class=\"ui secondary menu wrapped\" id=\"uitab\">\n    <a class=\"active item\" data-tab=\"first\"><i class=\"pen icon\"></i>文章列表(共<?php echo allpostnum(getAuthorInfo($this->getArchiveSlug(),'uid')); ?>篇文章)</a>\n  <a class=\"item\" data-tab=\"second\"><i class=\"comment alternate icon\"></i>ta的动态</a>\n</div>\n<div class=\"ui bottom attached active tab \" data-tab=\"first\">\n    \n<?php if ($this->have()): ?>\n    \n    <ul class=\"article-list\">\n        <?php while($this->next()): ?>\n  <li class=\"article-list-article\">\n    <a class=\"article-list-article-link\" href=\"<?php $this->permalink() ?>\">\n      <span class=\"article-category\">\n        <?php $this->category('<bsvi style=\\'display:none\\'>',false); ?>\n      </span>\n      <h2 class=\"article-list-article-title\">\n        <?php echo cutexpert($this->title,articletitlenum()) ?>\n      </h2>\n      <p class=\"article-meta\">\n       投稿于 <?php $this->date(); ?>\n      </p>\n    </a>\n  </li>\n  <?php endwhile; ?>\n \n\n</ul>\n\n<?php else :?>\n<article class=\"post\">\n        <center><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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></linearGradient></defs><g transform=\"translate(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg></center>\n                <center><h2>Ta暂时没有发表文章~</h2></center>\n            </article>\n<?php endif; ?>\n \n <?php\n      ob_start(); \n      $this->pageNav('&laquo;','&raquo;', 1, '');\n      $content = ob_get_contents();\n      ob_end_clean();\n      if(Bsoptions('pagination_style') == '2'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<nav class=\"page-navigator\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<span class=\"page-number\">...</span>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n       $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);\n      $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);\n      $content = preg_replace(\"/<\\/ol>/sm\", '</nav>', $content);\n      }\n      if(empty(Bsoptions('pagination_style')) || Bsoptions('pagination_style') == '1'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<div class=\"ui labels\" style=\"margin-top:30px\"><div style=\"text-align:center\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<a class=\"ui large label\">...</a>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      $content = preg_replace(\"/<\\/ol>/sm\", '</div></div>', $content);\n      }\n      echo $content;\n     ?>\n\n\n\n    \n    </div>\n <div class=\"ui bottom attached tab \" data-tab=\"second\">\n  \n  \n<div class=\"comments-container\">\n\n\t\n\n\t\t\t<div id=\"saysfl\">\n\t\t\t\n\t\t</div>\n\n\t\t<br>\n\t\t<div class=\"sayspagelist\"></div>\n</div>\n  \n  \n  \n  \n    </div>\n  \n\n\n                   </div>   \n\n  \n  \n  \n   </div>\n   </div>\n   \n   <script>\n   $(function(){\n     \n  getsaysdata();\nvar sayspage = 1;\n                var saysn = 0;\n                var saysmax = 1;\nfunction getsaysdata(){\n     $.ajax({\n                        type: \"POST\",\n                        url: '<?php getUserAction(); ?>',\n                        data: {\n                            \"type\": 'getsays_index',\n                            \"page\": sayspage,\n                            'authorId':'<?php echo $this->getArchiveSlug();?>'\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                     \n                            json = JSON.parse(data);\nif(json.list == ''){\n    saysn = json.total;\n                            saysmax = json.max;\n                                var strs = \" \";\n                                strs += '<article class=\"post\"><center><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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></linearGradient></defs><g transform=\"translate(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg><h2>Ta暂时没有发表动态~</h2></center></article>';\n                                $(\"#saysfl\").html(strs);\n                            }\n                            else{\n                                saysn = json.total;\n                            saysmax = json.max;\ncontent2(json.list);\n}\n\n                        },\n                        complete: function() {\n                            <?php if(Bsoptions('Lazyload') == true) :?>\n                           lazyLoad();\n                           <?php endif; ?>\n                            pageList();\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n                     function pageList() {\n                         if(saysn !== 0){\n                    sayspage = Math.min(sayspage, saysmax);\n                    sayspage = Math.max(sayspage, 1);\n                    var html = \"<center><div class=\\\"ui labels\\\"><a class=\\\"ui label\\\" data-page=\"+ sayspage +\">共\" + saysn + \"条</a><a class=\\\"ui label\\\" data-page=\"+ sayspage +\">第\" + sayspage + \"/\" + saysmax + \"页</a>\";\n                    html += '<a class=\\\"ui label\\\"  data-page=\"1\">首页</a>';\n                    html += (sayspage > 1) ? '<a class=\\\"ui label\\\"  data-page=\"' + (sayspage - 1) + '\">上一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"1\">上一页</a>';\n                    html += (sayspage < saysmax) ? '<a class=\\\"ui label\\\"  data-page=\"' + (sayspage + 1) + '\">下一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"' + saysmax + '\">下一页</a>';\n                    html += '<a class=\\\"ui label\\\"  data-page=\"' + saysmax + '\">尾页</a><div class=\\\"ui mini input\\\"><input id=\\\"dipagex\\\" type=\\\"number\\\" placeholder=\\\"输入跳转的页码\\\"></div><a id=\\\"gopage\\\" class=\\\"ui label\\\" >跳转到指定页</a></div></center>';\n                    var $html = $(html);\n                    \n                    $html.find(\"a\").click(function() {\n                        if($(this).attr(\"id\")!=='gopage'){\n                        sayspage = $(this).attr(\"data-page\");\n                        }\n                        else{\n                            var dipage = document.getElementById(\"dipagex\").value;\n                            if(dipage > saysmax){\n                              sayspage = saysmax;\n                            }\n                            else if(dipage < 1){\n                               sayspage = 1; \n                            }\n                            else{\n                              sayspage = dipage;  \n                            }\n\n                        };\n                        \n                        getsaysdata();\n                    });\n                    \n                    \n                    $(\".sayspagelist\").html($html);\n                         }\n                }\n\n                \n     function content2(lists) {\n                    var str2 = \" \";\n                    var privatesays = \" \";\n                    for(var i in lists) {\nstr2 += '<li><div class=\"comment-main-level\"><div class=\"comment-avatar\"><img src=\"<?php echo imgravatarq(getAuthorInfo($this->getArchiveSlug(),'mail')); ?>\" loading=\"lazy\"></div><div class=\"comment-box\"><div class=\"comment-head\"><h6 class=\"comment-name by-author\"><?php echo getAuthorInfo($this->getArchiveSlug(),'screenName'); ?></h6> <span>' + lists[i]['saystime'] + '</span> <i class=\"thumbs up red icon\" id=\"likebtn-' + lists[i]['saysid'] + '\" data-sid=\"' + lists[i]['saysid'] + '\"></i><spanx class=\"clikenum\" id=\"clikenum-' + lists[i]['saysid'] + '\">' + lists[i]['sayslike'] + '</spanx></div><div class=\"comment-content\">' + lists[i]['saystext'] + '</div></div></div></li>';\n}\n\n$(\"#saysfl\").html('<ul id=\"comments-list\" class=\"comments-list comments-list-front\">'+str2+'</ul>');\n}\n}\n\n\n$(document).off('click','.thumbs.up.red.icon').on('click','.thumbs.up.red.icon',function(){\n    if(localStorage.getItem('sayslike-'+$(this).attr('data-sid')) == 'yes'){\n       $('body').toast({\n\t\t\t\t\t\t\t    title:'点赞失败',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '您已经给该动态点过赞了哦~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t}); \n\t\t\t\t\t\t\treturn false;\n    }\n    $('#likebtn-'+$(this).attr('data-sid')).css(\"pointer-events\",\"none\");\n    var count = 0;\n    var clike = $('#clikenum-'+$(this).attr('data-sid'));\n    var clikenum = parseInt(clike.text());\n$.ajax({\n                        type: \"POST\",\n                        url: '<?php getUserAction(); ?>',\n                        data: {\n                            \"type\": 'like',\n                            'sid': $(this).attr('data-sid'),\n                            'authorId':'<?php echo $this->getArchiveSlug();?>'\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                          data = JSON.parse(data);  \nif(data.code == 1){\n    localStorage.setItem('sayslike-'+data.sid, 'yes');\n     $('body').toast({\n\t\t\t\t\t\t\t    title:'点赞成功',\n\t\t\t\t\t\t\t    class: 'success',\n\t\t\t\t\t\t        message: '您已成功点赞~', \n\t\t\t\t\t\t\t    showIcon: 'grin beam outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});  \n    clike.text(clikenum +1);  \n    $('#likebtn-'+data.sid).css(\"pointer-events\",\"auto\");\n}\nelse{\n    $('body').toast({\n\t\t\t\t\t\t\t    title:'点赞失败',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '啊哦，似乎网络出现了什么问题，请稍后再试~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t}); \n\t\t\t\t\t\t\t$('#likebtn-'+data.sid).css(\"pointer-events\",\"auto\");\n}\n\n                        },\n                        error: function() {\n                            $('body').toast({\n\t\t\t\t\t\t\t    title:'点赞失败',\n\t\t\t\t\t\t\t    class: 'warning',\n\t\t\t\t\t\t\t    message: '啊哦，似乎网络出现了什么问题，请稍后再试~', \n\t\t\t\t\t\t\t    showIcon: 'flushed outline',\n\t\t\t\t\t\t\t    showProgress: 'top',\n\t\t\t\t\t\t\t});  \n                        }\n                    });\n                    \n})\n});\n</script>"
  },
  {
    "path": "pages/index-z.php",
    "content": "<?php if(Bsoptions('AdControl') == true && Bsoptions('AdControl3') == true) :?>\n<?php billboard(Bsoptions('AdControl3_style'),'index'); ?>\n  <?php endif; ?>\n<div class=\"pure-g\" id=\"layout\">\n          <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n        \n                <div class=\"content_container\">\n <?php if(Bsoptions('Slidersss') == true && Bsoptions('SliderIndexs') == true) :?>\n\t<div id=\"bearslider\" style=\"display:none;margin-bottom:20px;\">\n\t    <?php foreach (Bsoptions('slider__content') as $sliderpic) { ?>\n\t\t<a href=\"<?php echo $sliderpic['slider__url'];?>\"<?php if($sliderpic['slider__window']== true):?> target=\"_blank\"<?php endif; ?>><img src=\"<?php echo $sliderpic['slider__pic'];?>\"  title=\"<?php echo $sliderpic['slider__title'];?>\" alt=\"<?php echo $sliderpic['slider__desc'];?>\"></a>\n\t\t <?php } ?>\n\t\n\t</div>\n\n\n\n<?php endif?>\n\n\n\n           <?php if ($this->have()): ?>\n\n           <?php while($this->next()): ?>\n<?php switch(Bsoptions('Article_forma')):?>\n<?php case '1':\n    default:\n        ?>\n<div class=\"pic-article-card\">\n  <!-- 文章封面 -->\n  <div class=\"pic-article-cover\">\n    <?php if (thumb2($this) !== \"\"): ?>\n      <img <?php echo lazyload('auto', thumb2($this)); ?>src=\"<?php echo thumb2($this); ?>\">\n    <?php else: ?>\n      <img <?php echo lazyload('auto', thumb2($this)); ?>src=\"<?php AssetsDir(); ?>assets/images/cover_new.webp\">\n    <?php endif; ?>\n  </div>\n\n  <!-- 文章内容 -->\n  <div class=\"pic-article-content\">\n    <!-- 文章标题 -->\n    <h2 class=\"pic-article-title\">\n      <a href=\"<?php $this->permalink(); ?>\" <?php if (Bsoptions('article_blank') == true): ?>target=\"_blank\"<?php endif; ?>>\n        <?php $this->sticky(); ?>\n        <?php echo cutexpert($this->title, articletitlenum()); ?>\n      </a>\n    </h2>\n\n    <!-- 文章摘要 -->\n    <div class=\"pic-article-excerpt\">\n        <?php if ($this->fields->excerpt == null): ?>\n          <?php echo cutexpert($this->excerpt, articledecnum()); ?>\n        <?php else: ?>\n          <?php $this->fields->excerpt(); ?>\n        <?php endif; ?>\n    </div>\n\n    <!-- 文章元信息 -->\n    <div class=\"pic-article-meta\">\n      <span class=\"pic-meta-item\"><i class=\"fas fa-calendar-alt\"></i> <?php $this->date(); ?></span>\n      <?php if (!empty($this->category)): ?>\n        <span class=\"pic-meta-item\"><i class=\"fas fa-folder\"></i> <?php $this->category('<bsvi style=\"display:none\">', false); ?></bsvi></span>\n      <?php endif; ?>\n      <span class=\"pic-meta-item\"><i class=\"fas fa-comments\"></i> <?php $this->commentsNum('暂无评论', '1 条评论', '%d 条评论'); ?></span>\n    </div>\n  </div>\n</div>\n<?php break;\ncase '2':\n    ?>\n    <div class=\"simple-article-item\">\n    <!-- 文章标题 -->\n    <h2 class=\"simple-article-title\">\n      <a href=\"<?php $this->permalink(); ?>\" <?php if (Bsoptions('article_blank') == true): ?>target=\"_blank\"<?php endif; ?>><?php $this->sticky(); ?>\n        <?php echo cutexpert($this->title, articletitlenum()); ?></a>\n    </h2>\n\n    <!-- 文章摘要 -->\n    <div class=\"simple-article-excerpt\">\n        <?php if ($this->fields->excerpt == null): ?>\n          <?php echo cutexpert($this->excerpt, articledecnum()); ?>\n        <?php else: ?>\n          <?php $this->fields->excerpt(); ?>\n        <?php endif; ?>\n    </div>\n\n    <!-- 文章元信息 -->\n    <div class=\"simple-article-meta\">\n      <span class=\"meta-item\"><i class=\"fas fa-calendar-alt\"></i> <?php $this->date(); ?></span>\n      <span class=\"meta-item\"><i class=\"fas fa-folder\"></i> <?php $this->category('<bsvi style=\"display:none\">', false); ?></span>\n      <span class=\"meta-item\"><i class=\"fas fa-comments\"></i> <?php $this->commentsNum('暂无评论', '1 条评论', '%d 条评论'); ?></span>\n    </div>\n  </div>\n    <?php break;?>\n    <?php endswitch;?>\n<?php endwhile; ?>\n\n<?php else :?>\n<article class=\"post\">\n        <center><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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></linearGradient></defs><g transform=\"translate(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg></center>\n                <center><h2>这里暂时没有文章~</h2></center>\n            </article>\n<?php endif; ?>\n\n<?php if(Bsoptions('infinite_scroll') == false || empty(Bsoptions('infinite_scroll'))): ?>\n<?php\n      ob_start(); \n      $this->pageNav('&laquo;','&raquo;', 1, '');\n      $content = ob_get_contents();\n      ob_end_clean();\n      if(Bsoptions('pagination_style') == '2'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<nav class=\"page-navigator\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<span class=\"page-number\">...</span>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number current\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"page-number\" href=\"$1\">$2</a>', $content);\n       $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);\n      $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);\n      $content = preg_replace(\"/<\\/ol>/sm\", '</nav>', $content);\n      }\n      if(empty(Bsoptions('pagination_style')) || Bsoptions('pagination_style') == '1'){\n      $content = preg_replace(\"/<ol class=\\\"(.*?)\\\">/sm\", '<div class=\"ui labels\" style=\"margin-top:30px\"><div style=\"text-align:center\">', $content);\n      $content = preg_replace(\"/<li><span>(.*?)<\\/span><\\/li>/sm\", '<a class=\"ui large label\">...</a>', $content);\n      $content = preg_replace(\"/<li class=\\\"current\\\"><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui black large label\" href=\"$1\">$2</a>', $content);\n      $content = preg_replace(\"/<li><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">$2</a>', $content);\n       $content = preg_replace(\"/<li [class=\\\"prev\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" href=\"$1\">上一页</a>', $content);\n      $content = preg_replace(\"/<li [class=\\\"next\\\"]+><a href=\\\"(.*?)\\\">(.*?)<\\/a><\\/li>/sm\", '<a class=\"ui large label\" style=\"margin-top:5px\" href=\"$1\">下一页</a>', $content);\n      $content = preg_replace(\"/<\\/ol>/sm\", '</div></div>', $content);\n      }\n      echo $content;\n     ?>\n     \n     <?php endif; ?>\n     </div>\n     <?php if ($this->have()): ?>\n<?php if(Bsoptions('infinite_scroll') == true): ?>\n<div class=\"pagination\" style=\"display:none;\">\n                   \n                    <?php $this->pageLink('下一页','next'); ?>\n               </div>\n<div class=\"page-load-status\" style=\"display:none;\">\n<div class=\"ui active centered inline loader infinite-scroll-request\" style=\"margin-top:20px\"></div>\n\n <h2 class=\"ui icon header infinite-scroll-last\">\n  <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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></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(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><ellipse cx=\"43\" cy=\"9.5\" rx=\"43\" ry=\"9.5\" transform=\"translate(253 701)\" fill=\"#ebedf5\"/><g transform=\"translate(63 354)\"><g transform=\"translate(258.49 305.55)\"><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(-524.241 -66.584)\" fill=\"#fff\"/><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(-523.763 -65.64)\" fill=\"url(#d)\"/></g><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-6.56-18.848-7.364-23.026,4.251-9.233,3.614-18.062c-.652-9.065-6.3-10.479-8.307-10.074s-3.609,2.392-6.154,3.47-6.292-.673-11.112,1.619-9.377,7.547-9.377,7.547c-2.009,2.561.4,10.648-.938,14.691s-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(-279.872 225.445)\" fill=\"#fff\"/><path d=\"M519.206,44.961s.961-1.578,1.726-1.594c1.313-.026,2.7,1.631,2.7,1.631S519.249,46.731,519.206,44.961Z\" transform=\"translate(-268.363 226.187)\" 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=\"translate(-269.464 223.151)\" fill=\"#757f95\"/><path d=\"M505.743,52.715s-6.088-1.338-6.755,3.318,4.181,7.509,7.656.6\" transform=\"translate(-279.292 231.235)\" fill=\"#fff\"/><path d=\"M503.084,74.624s-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.893s-3.738-10.346-8.593-14.5\" transform=\"translate(-276.501 243.626)\" fill=\"url(#e)\"/><path d=\"M514.078,48.635a.6.6,0,0,0-.522.31v0l-.009.014a4.814,4.814,0,0,1-3.228,2.322l-.019,0,0,0a.6.6,0,0,0-.509.5l-.011,0-.406,1.078s.341-.014.842-.088l.057-.307.11-.584v.865c.188-.031.389-.073.6-.121v-.747l.064.454.037.268a5.609,5.609,0,0,0,2.386-1.138,4.083,4.083,0,0,0,1.152-1.977c.04-.155.054-.248.054-.248A.6.6,0,0,0,514.078,48.635Z\" transform=\"translate(-273.668 229.087)\" fill=\"#757f95\"/><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(-270.216 243.516)\" fill=\"url(#f)\"/><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(-277.496 242.564)\" fill=\"#fff\"/></g><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg>\n  <div class=\"content\" style=\"margin-top:5px\">\n    啊哦，已经到底啦～\n  </div>\n</h2>\n\n<h2 class=\"ui icon header infinite-scroll-error\">\n  <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>\n  <div class=\"content\" style=\"margin-top:5px\">\n    啊哦，加载错误啦～\n  </div>\n</h2>\n\n</div>\n\n<?php Typecho_Widget::widget('Widget_Stat')->to($stat); ?>\n<?php if($stat->publishedPostsNum <= Bsoptions('infinite_pageSize')):?><center><br>\n<h2 class=\"ui icon header\">\n  <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=\"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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></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(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><ellipse cx=\"43\" cy=\"9.5\" rx=\"43\" ry=\"9.5\" transform=\"translate(253 701)\" fill=\"#ebedf5\"/><g transform=\"translate(63 354)\"><g transform=\"translate(258.49 305.55)\"><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(-524.241 -66.584)\" fill=\"#fff\"/><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(-523.763 -65.64)\" fill=\"url(#d)\"/></g><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-6.56-18.848-7.364-23.026,4.251-9.233,3.614-18.062c-.652-9.065-6.3-10.479-8.307-10.074s-3.609,2.392-6.154,3.47-6.292-.673-11.112,1.619-9.377,7.547-9.377,7.547c-2.009,2.561.4,10.648-.938,14.691s-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(-279.872 225.445)\" fill=\"#fff\"/><path d=\"M519.206,44.961s.961-1.578,1.726-1.594c1.313-.026,2.7,1.631,2.7,1.631S519.249,46.731,519.206,44.961Z\" transform=\"translate(-268.363 226.187)\" 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=\"translate(-269.464 223.151)\" fill=\"#757f95\"/><path d=\"M505.743,52.715s-6.088-1.338-6.755,3.318,4.181,7.509,7.656.6\" transform=\"translate(-279.292 231.235)\" fill=\"#fff\"/><path d=\"M503.084,74.624s-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.893s-3.738-10.346-8.593-14.5\" transform=\"translate(-276.501 243.626)\" fill=\"url(#e)\"/><path d=\"M514.078,48.635a.6.6,0,0,0-.522.31v0l-.009.014a4.814,4.814,0,0,1-3.228,2.322l-.019,0,0,0a.6.6,0,0,0-.509.5l-.011,0-.406,1.078s.341-.014.842-.088l.057-.307.11-.584v.865c.188-.031.389-.073.6-.121v-.747l.064.454.037.268a5.609,5.609,0,0,0,2.386-1.138,4.083,4.083,0,0,0,1.152-1.977c.04-.155.054-.248.054-.248A.6.6,0,0,0,514.078,48.635Z\" transform=\"translate(-273.668 229.087)\" fill=\"#757f95\"/><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(-270.216 243.516)\" fill=\"url(#f)\"/><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(-277.496 242.564)\" fill=\"#fff\"/></g><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg>\n  <div class=\"content\">\n    啊哦，已经到底啦～\n  </div>\n</h2></center>\n<?php else:?>\n<center><button class=\"ui right labeled icon button\" id=\"bsnext\" style=\"margin-top:20px;\">\n  <i class=\"right arrow icon\"></i>\n  加载更多\n</button></center>\n<?php endif; ?>\n  <?php endif; ?>\n  <?php endif; ?></div>"
  },
  {
    "path": "pages/page.php",
    "content": "<script>\n    var BsTocPostDate = \"<?php $this->date(\"Y-m-d H:m\"); ?>\";\n    var BsTocPostTitle = \"<?php $this->title() ?>\";\n    var Permalink = \"<?php $this->permalink(); ?>\";\n</script>\n<script src=\"<?php AssetsDir();?>assets/vendors/bs-audio/audio.js\"></script>\n<?php if(Bsoptions('RewardOpen') == true):?>\n<script src=\"<?php AssetsDir();?>assets/js/article_donate.js?v=<?php echo themeVersion(); ?>\"></script>\n<?php endif;?>\n<?php if(Bsoptions('Readmode') == true): ?> \n<?php echo readModeContent($this,reEmoPost(ShortCode($this->content,$this,$this->user->hasLogin(),$this->fields->ArticleType,'readmode'))); ?>\n<?php endif; ?>\n             \n\n<div class=\"pure-g\" id=\"layout\">\n           \n      <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n          <div class=\"content_container\">\n         <div id=\"bearsimple-scroll\">\n       \n          <article class=\"post\">\n              \n                         <?php if($this->fields->articleplo !== null && $this->fields->articleplo !== '1'): ?>\n              <div class=\"ui basic pointing below big label\" style=\"letter-spacing:1px;line-height:1.23;\">\n  <i class=\"bullhorn icon\"></i><?php $this->fields->articleplonr() ?>\n</div>\n              <?php endif; ?>\n\n<div class=\"article-header\">\n\n  <div class=\"article-title\"><?php $this->title() ?></div>\n\n <div class=\"bsmeta_article-meta\">\n                <div class=\"bsmeta_meta-item\">\n                    <i class=\"bsmeta_icon fas fa-user\"></i>\n                    <span class=\"bsmeta_label\">作者</span>\n                    <span class=\"bsmeta_value\">\n                        <a class=\"bsmeta_author\" href=\"<?php $this->author->permalink(); ?>\"><?php $this->author(); ?></a>\n                    </span>\n                </div>\n                \n                <div class=\"bsmeta_meta-item\">\n                    <i class=\"bsmeta_icon fas fa-calendar-alt\"></i>\n                    <span class=\"bsmeta_label\">发布于</span>\n                    <span class=\"bsmeta_value\"><?php $this->date(); ?></span>\n                </div>\n               \n                 <?php if($this->fields->Hot == '1'): ?>\n                <div class=\"bsmeta_meta-item\">\n                    <i class=\"bsmeta_icon fas fa-eye\"></i>\n                    <span class=\"bsmeta_label\">热度</span>\n                    <span class=\"bsmeta_hot-display\" data-scid=\"<?php echo $this->cid; ?>\">\n                        <span class=\"bsmeta_hot-value\"><hot id=\"ahot\"></hot>°C</span>\n                    </span>\n                </div>\n                <?php endif; ?>\n            </div>\n\n\n\n\n  <div class=\"article-actions\">\n    <button class=\"action-btn\" id=\"toggle-menu\">\n      <i class=\"fas fa-cog\"></i> 选项\n    </button>\n   <div class=\"dropdown-menu\" id=\"dropdown-menu\">\n  <button id=\"article_change_m\"><i class=\"fas fa-font\"></i> 默认字体 <span class=\"checkmark\">✓</span></button>\n  <button id=\"article_change_k\"><i class=\"fas fa-font\"></i> 思源宋体 <span class=\"checkmark\">✓</span></button>\n  <button id=\"article_change_xlwk\"><i class=\"fas fa-font\"></i> 霞鹜文楷体 <span class=\"checkmark\">✓</span></button>\n  <div class=\"divider\"></div>\n  <button id=\"text-size-small\"><i class=\"fas fa-text-height\"></i> 小 <span class=\"checkmark\">✓</span></button>\n  <button id=\"text-size-medium\"><i class=\"fas fa-text-height\"></i> 中 <span class=\"checkmark\">✓</span></button>\n  <button id=\"text-size-large\"><i class=\"fas fa-text-height\"></i> 大 <span class=\"checkmark\">✓</span></button>\n  <div class=\"divider\"></div>\n  <?php if(Bsoptions('Readmode') == true): ?><button id=\"toggle-reading-mode\"><i class=\"fas fa-book\"></i> 阅读模式</button><?php endif;?>\n  <?php if(Bsoptions('Poster') == true): ?><button onclick=\"generatePoster()\"><i class=\"fas fa-newspaper\"></i> 生成海报</button><?php endif; ?>\n  <button id=\"editbtn\" style=\"display:none;\" onclick=\"window.open('<?php $this->options->adminUrl('/write-page.php?cid='.$this->cid); ?>','_self')\"><i class=\"pencil icon\"></i>编辑</button>\n</div>\n  </div>\n</div>\n\n<?php $this->need('modules/tools.php'); ?>\n          \n<div class=\"post-content\" id=\"post-content\"><div id=\"para\">\n   \n<?php if ($this->fields->Overdue && $this->fields->Overdue !== 'close' && floor((time() - ($this->modified)) / 86400) > $this->fields->Overdue) : ?>\n<div class=\"ui warning icon message\">\n  <i class=\"exclamation circle loading icon\"></i>\n  <div class=\"content\">\n    <div class=\"header\">\n温馨提示：</div>\n <p>\n本文最后更新于<?php echo date('Y年m月d日' , $this->modified);?>，已超过<?php echo floor((time()-($this->modified))/86400);?>天没有更新，若内容或图片失效，请留言反馈。\n </p>\n </div>\n</div>\n<?php endif; ?>\n<p>\n  \n<?php if($this->hidden||$this->titleshow): ?>\n\n<form action=\"<?php echo Typecho_Widget::widget('Widget_Security')->getTokenUrl($this->permalink); ?>\" method=\"post\" id=\"form\">\n<div class=\"ui form warning\">\n  <div class=\"field\">\n    <label>本文已设定密码保护，请输入密码访问</label>\n    <input type=\"password\" class=\"text\" name=\"protectPassword\" id=\"protectPassword\" placeholder=\"请输入文章密码\" autocomplete=\"off\">\n    <input type=\"hidden\" name=\"protectCID\" value=\"<?php $this->cid(); ?>\" />\n  </div>\n  <div class=\"ui warning message\">\n    <div class=\"header\">Tips:</div>\n    <ul class=\"list\">\n      <li><?php echo empty(Bsoptions('globalTips')['articlePwdAfterEnter_Tip'])? '请不要随意多次尝试,否则可能触发本站自我保护机制~' : Bsoptions('globalTips')['articlePwdAfterEnter_Tip'];?></li>\n    </ul>\n  </div>\n  <button class=\"ui submit button\" id=\"protectajax\" type=\"button\">提交</button>\n</div>\n</form>\n<?php else: ?>\n<a id=\"bs_toc_begin\"></a> \n                <div id=\"bs_toc_body\">\n<?php if(Bsoptions('pageContent') == true): ?> \n<?php echo BsCore_Plugin::parseContent($this,$this->user->hasLogin(),$this->remember('mail', true),reEmoPost(ShortCode($this->content,$this,$this->user->hasLogin(),$this->fields->ArticleType))); ?>\n<?php else:?>\n<?php echo reEmoPost(ShortCode($this->content,$this,$this->user->hasLogin(),$this->fields->ArticleType)); ?>\n<?php endif;?>\n<?php if (array_key_exists('TePass', Typecho_Plugin::export()['activated'])){echo TePass_Plugin::getTePass();} ?>\n</div>\n<?php endif;?></p></div></div> </article>\n\n\n  <?php if($this->fields->copyright == '1'): ?>\n<div class=\"bearcopyright-container\">\n                <div class=\"bearcopyright-icon\">\n                    <i class=\"fas fa-copyright\"></i>\n                </div>\n                \n                <div class=\"bearcopyright-header\">\n                    版权属于：<strong><?php $this->author() ?></strong> 所有，\n                    <span class=\"bearcopyright-license-wrapper\">\n                        采用《<?php echo copyright_cc($this->fields->copyright_cc);?></a>》进行许可，\n                    </span>\n                    转载请注明文章来源。\n                </div>\n                \n                <div class=\"bearcopyright-link\">\n                    <a href=\"<?php $this->permalink() ?>\"><i class=\"fas fa-link\"></i> <?php $this->permalink() ?></a>\n                </div>\n            </div>\n<?php endif; ?>\n\n    \n\n\n\n<?php article_module_output($this); ?>\n<?php if (Bsoptions('RewardOpen_tepass') == true && array_key_exists('TePass', Typecho_Plugin::export()['activated'])) :?> \n<?php echo TePass_Plugin::getReward(); ?>\n<?php endif; ?>\n<?php if(Bsoptions('Poster') == true): ?>\n<?php $this->need('modules/poster.php'); ?>\n<?php endif; ?>\n\n                    \n      \n</div>\n\n\n    \n       \n    <?php if(!$this->hidden): ?>\n    <?php if(Bsoptions('CommentClose_Hide') == '' || Bsoptions('CommentClose_Hide') == false): ?> \n<?php if(Bsoptions('comment_choose') == '' || Bsoptions('comment_choose') == '1'): ?>    \n    <?php $this->need('comments.php'); ?>\n    <?php else:?>\n    <?php $this->need('thirdparty_comments.php'); ?>\n    <?php endif;?>\n    <?php else:?>\n    </div></div>\n    <?php endif;?>\n<?php else:?>\n<div class=\"comment-card\">\n<center>\n<h3 class=\"ui icon header\">\n  <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>\n  <div class=\"content\">\n    评论区已被封印~\n  </div>\n</h3></center>\n</div>\n</div></div>\n<?php endif; ?>\n"
  },
  {
    "path": "pages/post.php",
    "content": "<script>\n    var BsTocPostDate = \"<?php $this->date(\"Y-m-d H:m\"); ?>\";\n    var BsTocPostTitle = \"<?php $this->title() ?>\";\n    var Permalink = \"<?php $this->permalink(); ?>\";\n</script>\n\n<script src=\"<?php AssetsDir();?>assets/vendors/bs-audio/audio.js\"></script>\n<?php if(Bsoptions('RewardOpen') == true):?>\n<script src=\"<?php AssetsDir();?>assets/js/article_donate.js?v=<?php echo themeVersion(); ?>\"></script>\n<?php endif;?>\n<?php if(Bsoptions('Readmode') == true): ?> \n<?php echo readModeContent($this,reEmoPost(ShortCode($this->content,$this,$this->user->hasLogin(),$this->fields->ArticleType,'readmode'))); ?>\n<?php endif; ?>\n<div class=\"pure-g\" id=\"layout\">\n           \n      <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n          <div class=\"content_container\">\n         <div id=\"bearsimple-scroll\">\n   \n          <article class=\"post\">\n              \n                         <?php if($this->fields->articleplo !== null && $this->fields->articleplo !== '1'): ?>\n              <div class=\"ui basic pointing below big label\" style=\"letter-spacing:1px;line-height:1.23;\">\n  <i class=\"bullhorn icon\"></i><?php $this->fields->articleplonr() ?>\n</div>\n              <?php endif; ?>\n\n<div class=\"article-header\">\n  <div class=\"article-title\"><?php $this->title() ?></div>\n\n\n<?php\n$articleMetaShow = Bsoptions(\"articleMetaShows\");\n$showAuthor = $showTime = $showCategory = false;\n$showAnyMeta = false;\n$showHot = ($this->fields->Hot == '1');\n\nif ($articleMetaShow === null) {\n    $showAuthor = $showTime = $showCategory = true;\n    $showAnyMeta = true;\n} elseif ($articleMetaShow === '') {\n    $showAuthor = $showTime = $showCategory = false;\n    $showAnyMeta = false;\n} elseif (is_array($articleMetaShow) && count($articleMetaShow) > 0) {\n    $showAuthor = in_array('author', $articleMetaShow);\n    $showTime = in_array('time', $articleMetaShow);\n    $showCategory = in_array('category', $articleMetaShow);\n    $showAnyMeta = $showAuthor || $showTime || $showCategory;\n}\n\n$hideEntireMeta = (!$showAnyMeta && !$showHot);\n?>\n\n<?php if (!$hideEntireMeta): ?>\n<div class=\"bsmeta_article-meta\">\n    <?php if ($showAuthor): ?>\n    <div class=\"bsmeta_meta-item\">\n        <i class=\"bsmeta_icon fas fa-user\"></i>\n        <span class=\"bsmeta_label\">作者</span>\n        <span class=\"bsmeta_value\">\n            <a class=\"bsmeta_author\" href=\"<?php $this->author->permalink(); ?>\"><?php $this->author(); ?></a>\n        </span>\n    </div>\n    <?php endif; ?>\n    \n    <?php if ($showTime): ?>\n    <div class=\"bsmeta_meta-item\">\n        <i class=\"bsmeta_icon fas fa-calendar-alt\"></i>\n        <span class=\"bsmeta_label\">发布于</span>\n        <span class=\"bsmeta_value\"><?php $this->date(); ?></span>\n    </div>\n    <?php endif; ?>\n    \n    <?php if ($showCategory && $this->categories): ?>\n    <div class=\"bsmeta_meta-item\">\n        <i class=\"bsmeta_icon fas fa-folder\"></i>\n        <span class=\"bsmeta_label\">分类</span>\n        <div class=\"bsmeta_value bsmeta_category-links\">\n            <?php foreach ($this->categories as $category): ?>\n                <a href=\"<?php echo $category['permalink']; ?>\" class=\"bsmeta_category-link\"><?php echo $category['name']; ?></a>\n            <?php endforeach; ?>\n        </div>\n    </div>\n    <?php endif; ?>\n    \n    <?php if($showHot): ?>\n    <div class=\"bsmeta_meta-item\">\n        <i class=\"bsmeta_icon fas fa-eye\"></i>\n        <span class=\"bsmeta_label\">热度</span>\n        <span class=\"bsmeta_hot-display\" data-scid=\"<?php echo $this->cid; ?>\">\n            <span class=\"bsmeta_hot-value\"><hot id=\"ahot\"></hot>°C</span>\n        </span>\n    </div>\n    <?php endif; ?>\n</div>\n<?php endif; ?>\n\n\n  <div class=\"article-actions\" style=\"margin-top:-8px\">\n    <button class=\"action-btn\" id=\"toggle-menu\">\n      <i class=\"fas fa-cog\"></i> 选项\n    </button>\n   <div class=\"dropdown-menu\" id=\"dropdown-menu\">\n  <button id=\"article_change_m\"><i class=\"fas fa-font\"></i> 默认字体 <span class=\"checkmark\">✓</span></button>\n  <button id=\"article_change_k\"><i class=\"fas fa-font\"></i> 思源宋体 <span class=\"checkmark\">✓</span></button>\n  <button id=\"article_change_xlwk\"><i class=\"fas fa-font\"></i> 霞鹜文楷体 <span class=\"checkmark\">✓</span></button>\n  <div class=\"divider\"></div>\n  <button id=\"text-size-small\"><i class=\"fas fa-text-height\"></i> 小 <span class=\"checkmark\">✓</span></button>\n  <button id=\"text-size-medium\"><i class=\"fas fa-text-height\"></i> 中 <span class=\"checkmark\">✓</span></button>\n  <button id=\"text-size-large\"><i class=\"fas fa-text-height\"></i> 大 <span class=\"checkmark\">✓</span></button>\n   <?php if(Bsoptions('Readmode') == true || Bsoptions('Poster') == true): ?> \n     <div class=\"divider\"></div>\n     <?php endif;?>\n  <?php if(Bsoptions('Readmode') == true): ?><button id=\"toggle-reading-mode\"><i class=\"fas fa-book\"></i> 阅读模式</button><?php endif;?>\n  <?php if(Bsoptions('Poster') == true): ?><button onclick=\"generatePoster()\"><i class=\"fas fa-newspaper\"></i> 生成海报</button><?php endif; ?>\n  <button id=\"editbtn\" style=\"display:none;\" onclick=\"window.open('<?php $this->options->adminUrl('/write-post.php?cid='.$this->cid); ?>','_self')\"><i class=\"pencil icon\"></i>编辑</button>\n</div>\n  </div>\n</div>\n\n\n<?php $this->need('modules/tools.php'); ?>\n          \n<div class=\"post-content\" id=\"post-content\"><div id=\"para\">\n   \n<?php if ($this->fields->Overdue && $this->fields->Overdue !== 'close' && floor((time() - ($this->modified)) / 86400) > $this->fields->Overdue) : ?>\n<div class=\"ui warning icon message\">\n  <i class=\"exclamation circle loading icon\"></i>\n  <div class=\"content\">\n    <div class=\"header\">\n温馨提示：</div>\n <p>\n本文最后更新于<?php echo date('Y年m月d日' , $this->modified);?>，已超过<?php echo floor((time()-($this->modified))/86400);?>天没有更新，若内容或图片失效，请留言反馈。\n </p>\n </div>\n</div>\n<?php endif; ?>\n<p>\n  \n<?php if($this->hidden||$this->titleshow): ?>\n\n<form action=\"<?php echo Typecho_Widget::widget('Widget_Security')->getTokenUrl($this->permalink); ?>\" method=\"post\" id=\"form\">\n<div class=\"ui form warning\">\n  <div class=\"field\">\n    <label>本文已设定密码保护，请输入密码访问</label>\n    <input type=\"password\" class=\"text\" name=\"protectPassword\" id=\"protectPassword\" placeholder=\"请输入文章密码\" autocomplete=\"off\">\n    <input type=\"hidden\" name=\"protectCID\" value=\"<?php $this->cid(); ?>\" />\n  </div>\n  <div class=\"ui warning message\">\n    <div class=\"header\">Tips:</div>\n    <ul class=\"list\">\n      <li><?php echo empty(Bsoptions('globalTips')['articlePwdAfterEnter_Tip'])? '请不要随意多次尝试,否则可能触发本站自我保护机制~' : Bsoptions('globalTips')['articlePwdAfterEnter_Tip'];?></li>\n    </ul>\n  </div>\n  <button class=\"ui submit button\" id=\"protectajax\" type=\"button\">提交</button>\n</div>\n</form>\n<?php else: ?>\n<a id=\"bs_toc_begin\"></a> \n                <div id=\"bs_toc_body\">\n<?php if(Bsoptions('pageContent') == true): ?> \n<?php echo BsCore_Plugin::parseContent($this,$this->user->hasLogin(),$this->remember('mail', true),reEmoPost(ShortCode($this->content,$this,$this->user->hasLogin(),$this->fields->ArticleType))); ?>\n<?php else:?>\n<?php echo reEmoPost(ShortCode($this->content,$this,$this->user->hasLogin(),$this->fields->ArticleType)); ?>\n<?php endif;?>\n<?php if (array_key_exists('TePass', Typecho_Plugin::export()['activated'])){echo TePass_Plugin::getTePass();} ?>\n</div>\n<?php endif;?></p></div></div> </article>\n\n    <?php if($this->fields->tags == '1'): ?><br>\n<?php tags($this);?><?php endif; ?>\n\n  <?php if($this->fields->copyright == '1'): ?>\n   <div class=\"bearcopyright-container\">\n                <div class=\"bearcopyright-icon\">\n                    <i class=\"fas fa-copyright\"></i>\n                </div>\n                \n                <div class=\"bearcopyright-header\">\n                    版权属于：<strong><?php $this->author() ?></strong> 所有，\n                    <span class=\"bearcopyright-license-wrapper\">\n                        采用《<?php echo copyright_cc($this->fields->copyright_cc);?></a>》进行许可，\n                    </span>\n                    转载请注明文章来源。\n                </div>\n                \n                <div class=\"bearcopyright-link\">\n                    <a href=\"<?php $this->permalink() ?>\"><i class=\"fas fa-link\"></i> <?php $this->permalink() ?></a>\n                </div>\n            </div>\n\n<?php endif; ?>\n<?php if(Bsoptions('history_Today') == true): ?> \n<?php historyToday($this->created)?>\n    <?php endif; ?>\n    \n<div class=\"article-navigation\">\n  <!-- 上一篇 -->\n  <span href=\"\" class=\"nav-link prev-link\">\n    <i class=\"fas fa-chevron-left\"></i>\n    <span class=\"nav-text\"><?php $this->thePrev('%s','没有了'); ?></span>\n  </span>\n\n  <!-- 下一篇 -->\n  <span href=\"\" class=\"nav-link next-link\">\n    <span class=\"nav-text\"><?php $this->theNext('%s','没有了'); ?></span>\n    <i class=\"fas fa-chevron-right\"></i>\n  </span>\n</div>\n\n<?php article_module_output($this); ?>\n\n    \n    \n<?php if (Bsoptions('RewardOpen_tepass') == true && array_key_exists('TePass', Typecho_Plugin::export()['activated'])) :?> \n<?php echo TePass_Plugin::getReward(); ?>\n<?php endif; ?>\n<?php if(Bsoptions('Poster') == true): ?>\n<?php $this->need('modules/poster.php'); ?>\n<?php endif; ?>\n\n\n<?php if(Bsoptions('more_posts') == true): ?>\n<div class=\"recommended-articles\">\n  <h3><i class=\"circular dice icon\"></i> 随机文章</h3>\n  <div class=\"article-masonry\">\n\n\t\t<?php getRandomPosts($this->cid); ?>\n\t\t</div></div>\n\t<?php endif; ?>\t\n    \n</div>\n\n\n    \n       \n    <?php if(!$this->hidden): ?>\n    <?php if(Bsoptions('CommentClose_Hide') == '' || Bsoptions('CommentClose_Hide') == false): ?> \n<?php if(Bsoptions('comment_choose') == '' || Bsoptions('comment_choose') == '1'): ?>    \n\n    <?php $this->need('comments.php'); ?>\n    <?php else:?>\n\n    <?php $this->need('thirdparty_comments.php'); ?>\n\n    <?php endif;?>\n    <?php else:?>\n    </div></div>\n    <?php endif;?>\n<?php else:?>\n<div class=\"comment-card\">\n<center>\n<h3 class=\"ui icon header\">\n  <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>\n  <div class=\"content\">\n    评论区已被封印~\n  </div>\n</h3></center>\n</div>\n</div></div>\n<?php endif; ?>\n"
  },
  {
    "path": "pages/sidebar.php",
    "content": "<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n<div class=\"<?php if(Bsoptions('site_style') == '2'):?>hidden <?php endif;?>pure-u-1-4 hidden_mid_and_down\">\n    <aside id=\"sidebar\" class=\"sidebar\">\n        <?php if(Bsoptions('Scroll') == true && Bsoptions('Scroll_Sidebar') == true && $this->is('single')): ?>\n   <div class=\"recent-menutree-card bsmenutree\" style=\"display:none\">\n<div class=\"card-header\">\n  <i class=\"list alternate outline icon\"></i>\n 文章目录\n</div>\n<div class=\"card-body\">\n<span id=\"menutree\"></span>\n</div>\n</div>\n<?php endif; ?>\n\n<?php if(Bsoptions('AdControl') == true && Bsoptions('AdControl1') == true) :?>\n<div class=\"widget\">\n<!--右侧广告模块1-->\n    <?php billboard(Bsoptions('AdControl1_style'),'sidebar1'); ?></div>\n    <?php endif; ?>\n    \n<?php if(Bsoptions('Authorz') == true) :?>\n<div class=\"blogger-card\">\n  <!-- 顶部背景 -->\n  <div class=\"blogger-top-bg\"<?php if(Bsoptions('AuthorBackground') !== null && Bsoptions('AuthorBackground') !== '') :?>style=\"background-image: url('<?php echo Bsoptions('AuthorBackground');?>');\"<?php endif;?>></div>\n\n  <!-- 博主头像和名字 -->\n  <div class=\"blogger-header\">\n    <img src=\"<?php echo Bsoptions('AuthorAvatar') ?>\" class=\"blogger-avatar\">\n    <div class=\"blogger-name\"><?php echo Bsoptions('AuthorName') ?></div>\n  </div>\n\n  <!-- 博主个性简介 -->\n  <div class=\"blogger-bio\">\n    <?php if(Bsoptions('AuthorOneSay') == true) :?><?php echo get_hito(); ?><?php elseif(Bsoptions('AuthorQm') !== null): ?><?php echo Bsoptions('AuthorQm') ?><?php endif; ?>\n  </div>\n\n  <?php if (array_filter([Bsoptions('Github_URL'), Bsoptions('Wechat_QRCODE'), Bsoptions('QQ_QRCODE'), Bsoptions('Facebook_URL'), Bsoptions('Twitter_URL'), Bsoptions('Telegram_URL'), Bsoptions('Weibo_URL')])) : ?>\n    <!-- 社交平台图标 -->\n    <div class=\"blogger-social\">\n      <?php if(!empty(Bsoptions('QQ_QRCODE'))) :?>\n        <a class=\"social-icon\" id=\"contactqq\"><i class=\"fab fa-qq\"></i></a>\n      <?php endif;?>\n      <?php if(!empty(Bsoptions('Wechat_QRCODE'))) :?>\n        <a class=\"social-icon\" id=\"contactwechat\"><i class=\"fab fa-weixin\"></i></a>\n      <?php endif;?>\n      <?php if(!empty(Bsoptions('Weibo_URL'))) :?>\n        <a href=\"<?php echo Bsoptions('Weibo_URL') ?>\"<?php if(Bsoptions('Link_blank') == true):?> target=\"_blank\"<?php endif; ?> class=\"social-icon\"><i class=\"fab fa-weibo\"></i></a>\n      <?php endif;?>\n      <?php if(!empty(Bsoptions('Github_URL'))) :?>\n        <a href=\"<?php echo Bsoptions('Github_URL') ?>\"<?php if(Bsoptions('Link_blank') == true):?> target=\"_blank\"<?php endif; ?> class=\"social-icon\"><i class=\"fab fa-github\"></i></a>\n      <?php endif;?>\n      <?php if(!empty(Bsoptions('Twitter_URL'))) :?>\n        <a href=\"<?php echo Bsoptions('Twitter_URL') ?>\"<?php if(Bsoptions('Link_blank') == true):?> target=\"_blank\"<?php endif; ?> class=\"social-icon\"><i class=\"fas fa-times\"></i></a>\n      <?php endif; ?>\n      <?php if(!empty(Bsoptions('Telegram_URL'))) :?>\n        <a href=\"<?php echo Bsoptions('Telegram_URL') ?>\"<?php if(Bsoptions('Link_blank') == true):?> target=\"_blank\"<?php endif; ?> class=\"social-icon\"><i class=\"fab fa-telegram\"></i></a>\n      <?php endif; ?>\n    </div>\n\n\n  <?php endif;?>\n\n  <?php if(Bsoptions('FourTotalHidden') == true) :?>\n    <?php Typecho_Widget::widget('Widget_Stat')->to($stat); ?>\n    <!-- 统计信息 -->\n    <div class=\"blogger-stats\">\n      <div class=\"stat-item\">\n        <div class=\"stat-number\"><?php if($stat->publishedPostsNum > '99'){echo '99+';}else{echo $stat->publishedPostsNum();} ?></div>\n        <div class=\"stat-label\">文章</div>\n      </div>\n      <div class=\"stat-item\">\n        <div class=\"stat-number\"><?php if($stat->publishedCommentsNum - crossnum() > '99'){echo '99+';}else{echo $stat->publishedCommentsNum - crossnum();} ?></div>\n        <div class=\"stat-label\">评论</div>\n      </div>\n      <div class=\"stat-item\">\n        <div class=\"stat-number\"><?php if($stat->categoriesNum > '99'){echo '99+';}else{echo $stat->categoriesNum();} ?></div>\n        <div class=\"stat-label\">分类</div>\n      </div>\n      <div class=\"stat-item\">\n        <div class=\"stat-number\"><?php if($stat->publishedPagesNum > '99'){echo '99+';}else{echo $stat->publishedPagesNum();} ?></div>\n        <div class=\"stat-label\">页面</div>\n      </div>\n    </div>\n  <?php endif;?>\n</div>\n<?php endif;?>\n\n\n\n<!--搜索模块-->\n<?php if(!empty(Bsoptions('Search')[0]) && @in_array('sidebar',Bsoptions('Search'))) :?>\n\n<!-- 搜索框 -->\n<form name=\"sidesearch\" role=\"search\" method=\"get\" id=\"searchform2\">\n<div class=\"search-box ui category search\">\n  <input class=\"prompt\" type=\"text\" id=\"sidebarsearch\" name=\"s\" placeholder=\"输入关键词实时搜索\" />\n<i class=\"search link icon\"></i>\n</div>\n</form>\n\n  <?php endif; ?>\n  <?php if(Bsoptions('Cate') == true) :?>\n<div class=\"sidebar-card\">\n  <div class=\"card-header\"><i class=\"folder open outline icon\"></i> 文章分类</div>\n  <?php $this->widget('Widget_Metas_Category_List')->to($categorys); ?>\n        <div class=\"card-body\">\n  <ul class=\"tree-view\">\n    \n    <?php while($categorys->next()): ?>\n<?php if ($categorys->levels === 0): ?>\n<?php $children = $categorys->getAllChildren($categorys->mid); ?>\n<?php \n$totalCount = $categorys->count; \nif (!empty($children)) {\n    foreach ($children as $mid) {\n        $child = $categorys->getCategory($mid);\n        $totalCount += $child['count'];\n    }\n}\n?>\n<?php if (empty($children)) { ?>\n    <li>\n      <div class=\"tree-node\">\n        <a href=\"<?php $categorys->permalink(); ?>\" class=\"category-link\"><?php $categorys->name(); ?> <span class=\"category-count\">(<?php echo $categorys->count(); ?>)</span></a>\n      </div>\n    </li>\n   <?php } else { ?>\n  <li>\n      <div class=\"tree-node\">\n        <span class=\"toggle-icon\"></span>\n        <a href=\"<?php $categorys->permalink(); ?>\" class=\"category-link\"><?php $categorys->name(); ?> <span class=\"category-count\">(<?php echo $totalCount; ?>)</span></a>\n      </div>\n      <ul class=\"tree-view\">\n          <?php foreach ($children as $mid) { ?>\n<?php $child = $categorys->getCategory($mid); ?>\n        <li>\n          <div class=\"tree-node\">\n            <a href=\"<?php echo $child['permalink'] ?>\" class=\"category-link\"><?php echo $child['name']; ?> <span class=\"category-count\">(<?php echo $child['count']; ?>)</span></a>\n          </div>\n          \n        </li>\n      <?php } ?>\n      </ul>\n    </li> \n   <?php } ?><?php endif; ?><?php endwhile; ?>\n  </ul>\n</div>\n</div>\n<script>\n var toggleIcons = document.querySelectorAll('.toggle-icon');\n\ntoggleIcons.forEach(icon => {\n  icon.addEventListener('click', function() {\n    this.classList.toggle('open'); // 切换 open 类\n    var subTree = this.parentElement.nextElementSibling;\n    if (subTree) {\n      subTree.classList.toggle('open');\n    }\n  });\n});\n</script>\n<?php endif; ?>\n<?php if(Bsoptions('LastArticle') == true) :?>\n<?php $this->widget('Widget_Post_hot@hot', 'pageSize=5')->to($hot); ?>\n<div class=\"recent-posts-card\">\n  <div class=\"card-header\"><i class=\"newspaper icon\"></i> 最近文章</div>\n        <div class=\"card-body\">\n  <ul class=\"recent-posts-list\">\n      <?php while($hot->next()): ?>\n    <li>\n      <a href=\"<?php $hot->permalink() ?>\"><?php $hot->title(); ?></a>\n      <div class=\"recent-posts-meta\"><?php echo date('Y/m/d',$hot->created); ?>  ·  <?php $hot->commentsNum('暂无评论', '1 条评论', '%d 条评论'); ?></div>\n    </li>\n    <?php endwhile; ?>\n  </ul>\n  </div>\n</div>\n<?php endif;?>\n\n<?php if(Bsoptions('lastcomment') == true) :?>\n<div class=\"recent-comments-card\">\n  <div class=\"card-header\"><i class=\"comment dots outline icon\"></i> 最新评论</div>\n  <?php lastComments(); ?>\n \n</div>\n<?php endif;?>\n<?php if(Bsoptions('tagcloud') == true) :?>\n<?php Typecho_Widget::widget('Widget_Metas_Tag_Cloud','ignoreZeroCount=0&limit='.tagcloudnum())->to($tags); ?>\n<div class=\"tag-cloud-card\">\n       <div class=\"card-header\"><i class=\"tags icon\"></i> 文章标签</div>\n             <div class=\"card-body\">\n  <?php if($tags->have()): ?>\n  <ul class=\"tag-cloud-list\">\n      <?php while ($tags->next()): ?>\n    <li><a href=\"<?php $tags->permalink();?>\"><?php $tags->name(); ?></a></li>\n    <?php endwhile; ?>\n  </ul>\n  <?php endif; ?>\n</div>\n</div>\n <?php endif; ?>\n\n<?php if(Bsoptions('ClockModule') == true) :?>\n<div class=\"countdown-card\">\n        <div class=\"card-header\"><i class=\"hourglass half icon\"></i> 时光沙漏</div>\n              <div class=\"card-body\">\n  <div class=\"countdown-item\">\n    <div class=\"countdown-label\">今年剩余时间</div>\n    <div class=\"countdown-progress\">\n      <div class=\"countdown-progress-bar\" id=\"year-progress\"></div>\n    </div>\n    <div class=\"countdown-time\" id=\"year-time\"></div>\n  </div>\n  <div class=\"countdown-item\">\n    <div class=\"countdown-label\">本月剩余时间</div>\n    <div class=\"countdown-progress\">\n      <div class=\"countdown-progress-bar\" id=\"month-progress\"></div>\n    </div>\n    <div class=\"countdown-time\" id=\"month-time\"></div>\n  </div>\n  <div class=\"countdown-item\">\n    <div class=\"countdown-label\">今天剩余时间</div>\n    <div class=\"countdown-progress\">\n      <div class=\"countdown-progress-bar\" id=\"day-progress\"></div>\n    </div>\n    <div class=\"countdown-time\" id=\"day-time\"></div>\n  </div>\n</div>\n</div>\n\n<script>\n    function updateCountdown() {\n  const now = new Date();\n\n  // 今年剩余时间\n  const yearEnd = new Date(now.getFullYear(), 11, 31, 23, 59, 59);\n  const yearTotal = yearEnd - new Date(now.getFullYear(), 0, 1);\n  const yearRemaining = yearEnd - now;\n  const yearProgress = ((yearTotal - yearRemaining) / yearTotal) * 100;\n  $('#year-progress').css('width', `${yearProgress}%`);\n  $('#year-time').text(`${Math.floor(yearRemaining / (1000 * 60 * 60 * 24))} 天`);\n\n  // 本月剩余时间\n  const monthEnd = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59);\n  const monthTotal = monthEnd - new Date(now.getFullYear(), now.getMonth(), 1);\n  const monthRemaining = monthEnd - now;\n  const monthProgress = ((monthTotal - monthRemaining) / monthTotal) * 100;\n  $('#month-progress').css('width', `${monthProgress}%`);\n  $('#month-time').text(`${Math.floor(monthRemaining / (1000 * 60 * 60 * 24))} 天`);\n\n  // 今天剩余时间\n  const dayEnd = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59);\n  const dayTotal = 24 * 60 * 60 * 1000; // 一天的总毫秒数\n  const dayRemaining = dayEnd - now;\n  const dayProgress = ((dayTotal - dayRemaining) / dayTotal) * 100;\n  $('#day-progress').css('width', `${dayProgress}%`);\n  const hoursRemaining = Math.floor(dayRemaining / (1000 * 60 * 60));\n  const minutesRemaining = Math.floor((dayRemaining % (1000 * 60 * 60)) / (1000 * 60));\n  $('#day-time').text(`${hoursRemaining} 小时 ${minutesRemaining} 分钟`);\n}\n\n// 初始化并每秒更新一次\nupdateCountdown();\nsetInterval(updateCountdown, 1000);\n</script>\n<?php endif;?>\n\n    \n<?php if(Bsoptions('FriendLinkChoose') == true && Bsoptions('FriendLinkFoot') == false) :?>\n  <?php if((Bsoptions('FriendLink_place') == '1') || (Bsoptions('FriendLink_place') == '2' && $this->is('index'))) :?>\n    <!-- 友情链接卡片 -->\n    <div class=\"friend-link-card\">\n      <div class=\"card-header\">\n        <i class=\"linkify icon\"></i>\n        <span>友情链接</span>\n      </div>\n      <div class=\"friend-link-card-body\">\n        <?php if(empty(Bsoptions('FriendLink'))) :?>\n          <!-- 无友情链接时的提示 -->\n          <div class=\"empty-state\">\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"148\" height=\"148\" viewBox=\"0 0 480 480\"><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=\"1\" y1=\"0.5\" x2=\"0.112\" y2=\"1.125\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\"1\" stop-color=\"#747f95\"/></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(-135 -375)\"><circle cx=\"184\" cy=\"184\" r=\"184\" transform=\"translate(191 443)\" fill=\"#f3f3fa\"/><path d=\"M2925,350h0c-8.837,0-16-32.235-16-72s7.163-72,16-72c.038,0,11.813.471,18.75-7.529s9-14.486,9-24.469c0-34.257,14.681-58.6,28.25-63.313,3.909-.688,10,.818,16-4.354s8-9.372,8-16.333c0-37.555,12.536-68,28-68s28,30.445,28,68c0,6.961-.667,10.328,5.333,15.5s14.76,4.5,18.667,5.187c13.569,4.714,24,33.055,24,67.312a101.212,101.212,0,0,0,2.333,20s4.485,11.842,11,5.5,9.13-14.885,10.25-22.871C3135.767,157.923,3142.61,142,3149,142c6.519,0,12.127,16.566,14.645,40.566.741,7.066,2.2,11.743,6.521,17.6A14.3,14.3,0,0,0,3180.92,206H3181c6.488,0,12.073,16.409,14.617,40.308.5,4.725.982,7.6,5.3,11.527S3212.884,262,3212.884,262l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573C3227.336,294.758,3229,311.835,3229,330c0,6.817-.237,13.546-.7,20H2925Zm303.3,0h0Z\" transform=\"translate(-2718 397)\" 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(350.969 539)\" fill=\"url(#a)\"/><path d=\"M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h256a16,16,0,1,1,0,32s-15.5,0-27.5,3S3165,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(-2702 701)\" fill=\"#d1d6e2\"/><path d=\"M-2493,98s-56.355,45.651-64,16,74.25-17.75-16,72\" transform=\"translate(3044 409)\" fill=\"none\" stroke=\"#909aa9\" stroke-linecap=\"round\" stroke-width=\"2\" stroke-dasharray=\"10\"/><path d=\"M4,2.2C7.15-.75,16,0,16,0s-1.5,4-2.6,8-.232,5.942-1.8,8C7.6,21.25,0,21,0,21s.75-3.4,2-8S.85,5.15,4,2.2Z\" transform=\"translate(447 603.085)\" fill=\"#909aa9\"/><ellipse cx=\"10\" cy=\"4\" rx=\"10\" ry=\"4\" transform=\"translate(294 787)\" fill=\"url(#c)\"/><path d=\"M8.44,24s8.115-6,6.94-10S11.51,9.625,9.775,6.125A11.222,11.222,0,0,1,8.44,0S1.767,2.625,1.5,9.375C1.38,12.419,4.436,14.344,6.171,18A32.451,32.451,0,0,1,8.44,24Z\" transform=\"translate(287 794.497) rotate(-90)\" fill=\"#909aa9\"/><path d=\"M0,0,57,4.5,136,0l31.5,12,17,10-37,8.5-24.5-5-58,5L4,23Z\" transform=\"translate(191 699)\" fill=\"#fff\"/><path d=\"M-1.4,1.2,60,9l58.75-5.25L143,9l36-9V24.5L144.4,29l-16.2-7.25L95.6,23l-5.1,1.5L67.2,21.75,5,23.25S2.8,16.713,1.2,11.2-1.4,1.2-1.4,1.2Z\" transform=\"translate(196 720)\" fill=\"#eceff5\"/><ellipse cx=\"43\" cy=\"9.5\" rx=\"43\" ry=\"9.5\" transform=\"translate(253 701)\" fill=\"#ebedf5\"/><g transform=\"translate(63 354)\"><g transform=\"translate(258.49 305.55)\"><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(-524.241 -66.584)\" fill=\"#fff\"/><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(-523.763 -65.64)\" fill=\"url(#d)\"/></g><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-6.56-18.848-7.364-23.026,4.251-9.233,3.614-18.062c-.652-9.065-6.3-10.479-8.307-10.074s-3.609,2.392-6.154,3.47-6.292-.673-11.112,1.619-9.377,7.547-9.377,7.547c-2.009,2.561.4,10.648-.938,14.691s-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(-279.872 225.445)\" fill=\"#fff\"/><path d=\"M519.206,44.961s.961-1.578,1.726-1.594c1.313-.026,2.7,1.631,2.7,1.631S519.249,46.731,519.206,44.961Z\" transform=\"translate(-268.363 226.187)\" 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=\"translate(-269.464 223.151)\" fill=\"#757f95\"/><path d=\"M505.743,52.715s-6.088-1.338-6.755,3.318,4.181,7.509,7.656.6\" transform=\"translate(-279.292 231.235)\" fill=\"#fff\"/><path d=\"M503.084,74.624s-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.893s-3.738-10.346-8.593-14.5\" transform=\"translate(-276.501 243.626)\" fill=\"url(#e)\"/><path d=\"M514.078,48.635a.6.6,0,0,0-.522.31v0l-.009.014a4.814,4.814,0,0,1-3.228,2.322l-.019,0,0,0a.6.6,0,0,0-.509.5l-.011,0-.406,1.078s.341-.014.842-.088l.057-.307.11-.584v.865c.188-.031.389-.073.6-.121v-.747l.064.454.037.268a5.609,5.609,0,0,0,2.386-1.138,4.083,4.083,0,0,0,1.152-1.977c.04-.155.054-.248.054-.248A.6.6,0,0,0,514.078,48.635Z\" transform=\"translate(-273.668 229.087)\" fill=\"#757f95\"/><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(-270.216 243.516)\" fill=\"url(#f)\"/><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(-277.496 242.564)\" fill=\"#fff\"/></g><path d=\"M0,9.833l18-9.5,2.667,4v8.2L13,18,8.167,12.532,0,13.671Z\" transform=\"translate(377 777)\" fill=\"#eceff5\"/><path d=\"M4,3.167,18,0V10l-5,3.167-4.833-4L0,10Z\" transform=\"translate(377 777)\" fill=\"#fff\"/><path d=\"M-.211,18.893,16,12l.246,14.107-2.084,4.646L0,31Z\" transform=\"matrix(1, 0.017, -0.017, 1, 400.376, 734.864)\" fill=\"#eceff5\"/><path d=\"M9.75,12H16l-3.75,7H0Z\" transform=\"translate(400 735)\" fill=\"#fff\"/><g transform=\"translate(447 690)\"><path d=\"M97,0,63.923,4.5,24.316,0,8.523,12,0,22l18.55,8.5,12.283-5,29.079,5,23.488-5,6.467-12.126Z\" transform=\"translate(-1 12)\" fill=\"#fff\"/><path d=\"M81.149.607l-28.1,3.945L26.17,1.9l-11.1,2.655L-2.651-1.333V12.391l17.083,2.276L21.846,11l14.917.632,2.334.759L49.759,11l28.991,1.391s-1.4-1.778,0-4.724A43.992,43.992,0,0,0,81.149.607Z\" transform=\"translate(1.651 35.333)\" fill=\"#eceff5\"/></g></g></svg>\n            <p>暂无友情链接显示</p>\n          </div>\n        <?php else: ?>\n          <!-- 友情链接列表 -->\n          <ul class=\"friend-link-list\">\n            <?php foreach (getFriendLink() as $FriendLinks): ?>\n              <li>\n                <a href=\"<?php echo $FriendLinks[2]; ?>\" title=\"<?php echo $FriendLinks[1]; ?>\"<?php echo parselink($FriendLinks[2]); ?>>\n                  <?php echo $FriendLinks[0]; ?>\n                </a>\n              </li>\n            <?php endforeach; ?>\n          </ul>\n        <?php endif; ?>\n      </div>\n    </div>\n  <?php endif; ?>\n<?php endif; ?>\n\n\n<?php if(Bsoptions('AdControl') == true && Bsoptions('AdControl2') == true) :?>\n<div class=\"widget\">\n<!--右侧广告模块2-->\n<?php billboard(Bsoptions('AdControl2_style'),'sidebar2'); ?> </div>\n  <?php endif; ?>\n</aside></div> "
  },
  {
    "path": "post.php",
    "content": "<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; \n?>\n<?php $this->need('compoment/head.php');?>\n<?php $this->widget('Widget_Metas_Category_List')->to($categorys);?>\n<?php while ($categorys->next()): ?> <?php if ($this->category ==\n$categorys->slug):?>\n<?php $slug = $categorys->slug; ?>\n<?php $slug_name = $categorys->title; ?>\n<?php endif; ?>\n<?php endwhile; ?>\n<?php \n$category = array();\nif(empty(CategoryEncrypt(categeid($slug))['Cate_Encrypt_Password'])){\n$category['md5_password'] = md5Encode('654321');//初始密码，即加密密码没填的情况下的默认密码，可改动    \n}\nelse{\n$category['md5_password'] = md5Encode(CategoryEncrypt(categeid($slug))['Cate_Encrypt_Password']);\n}\n$category['type'] = \"category\";\n$category['category'] = $slug;\n$_POST['data'] = $category;\n$password = Typecho_Cookie::get('category_'.$slug);\nif ((!empty($password) && $password == $category['md5_password']) || $this->user->hasLogin()){\n    $cookie = true;\n}\n\n?>\n<?php if(Bsoptions('Cate_Encrypt_open') == true && !empty(CategoryEncrypt(categeid($slug))) && !$cookie):?>\n<?php $this->need('modules/lock_article.php'); ?>\n<?php else:?>\n\n\n<?php $this->need('pages/post.php'); ?>\n\n  <?php endif; ?>\n\n\n<script>\narticleCid=<?php echo $this->cid;?>;\narticleType= 'post';\nfunction addPostView(){if (typeof articleCid != 'undefined' && articleCid) $.post('/',{postview:articleCid,postType:articleType},function (res) {articleCid='';\n       $('#ahot').html(res.data);\n   })}\nfunction addPostEditBtn(){\n    $.post('<?php getIsLogin(); ?>',{action:'find'},function (res) {\n        res = JSON.parse(res);\n        switch(res.code){\n    case 1 :\n       $('#editbtn').show();\n    break;\n        }\n    })\n}\n   $(function(){addPostView();addPostEditBtn();})\n</script>\n\n\n\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>\n\n\n"
  },
  {
    "path": "steam.php",
    "content": "<?php\n    /**\n    * Steam\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit;\n$loader = Bsoptions('Lazyload_style');?>\n<?php $this->need('compoment/head.php');?>\n<link rel=\"stylesheet\" href=\"<?php AssetsDir();?>assets/css/modules/steam/style.css?v=<?php echo themeVersion(); ?>\">\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n               <div class=\"page-card\">\n                <h2><i class=\"steam icon\"></i><?php $this->title() ?></h2><br>   \n\n  <div class=\"loading-sticks positioning\" id=\"simpleLoading\" style=\"display:none\">\n  <div class=\"loading\"></div>\n  <div class=\"loading\"></div>\n  <div class=\"loading\"></div>\n</div>\n\n\n  <div class=\"steamContainer\" style=\"display:none\">\n\n <div class=\"userProf\">\n<div class=\"leftSide\">\n  <div class=\"avatar_b\">\n   <span></span>\n   <badge></badge>\n   <div class=\"wrapp\">\n    <img src=\"\" alt=\"\">\n   </div>\n  </div>\n  <div class=\"userTitle\">\n   <h1><a target=\"_blank\"></a>\n</h1>\n   <div class=\"userDesc\">\n           <div class=\"userlevel\"></div>\n    <div class=\"userhave\"></div>\n \n   </div>\n\n  </div>\n\t</div>\n\n </div>\n\t<div class=\"userGames\">\n\t\t<div class=\"gamesTitle\">\n\t\t\t\t<h3><i class=\"gamepad icon\"></i> 游戏库 ¬</h3>\n\t\t</div>\n\t <div class=\"steamgames-container games\">\n\t\t</div>\n\t\t\n\t\n\t</div>\n\n</div></div>\n      <script>\nlet steamId = \"<?php echo Bsoptions('steamId');?>\";\nlet userProf = $(\".userProf\");\nlet userImg = $(\".avatar_b\");\nlet userDesc = $(\".userDesc\");\nlet userTitle = $(\".userTitle\");\nlet gamesList = $('.games');\nlet badge = $('.avatar_b badge');\n$(\"#simpleLoading\").show();\n$.getJSON(\"https://steam.typecho.co.uk/steam/api?type=profile&steamid=\" + steamId, function (resp) {\n    userImg.children(\".wrapp\").children(\"img\").attr(\"src\", resp.avatarfull);\n    userTitle.children(\"h1\").children(\"a\").attr(\"href\", resp.profileurl);\n    userTitle.children(\"h1\").children(\"a\").html(resp.personaname);\n    if(resp.personastate == 1){\n     badge.css('background-color', 'green');   \n    }\n    else if(resp.personastate == 2){\n     badge.css('background-color', 'yellow');   \n    }\n    else{\n     badge.css('background-color', 'gray');   \n    }\n});\n\n$.getJSON(\"https://steam.typecho.co.uk/steam/api?type=level&steamid=\" + steamId, function (resp) {\n    userDesc.children(\".userlevel\").html(\"Lv\"+resp.response.player_level);    \n});\n$.getJSON(\"https://steam.typecho.co.uk/steam/api?type=games&steamid=\" + steamId, function (resp) {\n     $(\"#simpleLoading\").fadeOut();\n      $(\".steamContainer\").fadeIn();\n    if(!resp.response.game_count){\n    userDesc.children(\".userhave\").html(\"共拥有 0 款游戏\");    \n    }\n    else{\n    userDesc.children(\".userhave\").html(\"共拥有 \"+resp.response.game_count+\" 款游戏\");\n    }\n    for (let i = 0;i<9999;i++) {\n      let games = resp.response.games[i];\n      if(games){\n      if(games.playtime_forever == 0){\n       games.playtime_forever = \"还没玩过\";   \n      }\n      else{\n        games.playtime_forever = '玩了'+games.playtime_forever+'分钟';\n      }\n      gamesList.append('<div class=\"steamgames-card\"><div class=\"image-wrapper\"><img src=\"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/'+games.appid+'/header.jpg\" onerror=\"loadDefaultImage(this)\" loading=\"lazy\"></div><div class=\"details\"><div><a class=\"title\">'+games.name+'</a></div><div><a class=\"sub-title\">'+games.playtime_forever+'</a></div></div></div>');\n \n    \n    }\n}\n});\nfunction loadDefaultImage(imgElement) {\n  imgElement.src = '<?php AssetsDir();?>assets/css/modules/steam/nocover.jpg';\n}\n    </script>\n\n\n       </div> \n</div>\n\n\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "tags.php",
    "content": "<?php\n    /**\n    * 全部标签\n    *\n    * @package custom\n    */\n?>\n<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n<?php $this->need('compoment/head.php');?>\n\n<div class=\"pure-g\" id=\"layout\">\n            <div class=\"pure-u-1 pure-u-md-<?php if(Bsoptions('site_style') == '1' || Bsoptions('site_style') == ''):?>3<?php endif;?><?php if(Bsoptions('site_style') == '2'):?>4<?php endif;?>-4\">\n                <div class=\"content_container\">\n            <div class=\"page-card\">\n                    <h2><i class=\"tags icon\"></i> <?php $this->title() ?></h2><br>\n<div class=\"tag-page\">\n    <div class=\"tag-cloud\" id=\"tagCloud\"></div>\n    <div class=\"load-control\">\n        <button class=\"load-btn\" id=\"loadMore\">显示更多</button>\n    </div>\n</div>\n\n<script>\n$(document).ready(function() {\n    const tagCloud = document.getElementById('tagCloud');\n    const loadBtn = document.getElementById('loadMore');\n    let currentPage = 1;\n    let totalPages = 1;\n\n    const renderTags = (tags) => {\n        const fragment = document.createDocumentFragment();\n        \n        tags.forEach(tag => {\n            const card = document.createElement('a');\n            card.className = 'tag-card';\n            card.href = tag.url;\n            card.style = `--hue: ${Math.floor(Math.random()*360)}`;\n            card.innerHTML = `\n                <span class=\"tag-name\">${tag.name}</span>\n                <span class=\"tag-count\">${tag.count}</span>\n            `;\n            fragment.appendChild(card);\n        });\n\n        tagCloud.appendChild(fragment);\n    };\n\n    const loadTags = async () => {\n        loadBtn.disabled = true;\n        loadBtn.textContent = '加载中...';\n        \n        try {\n            const response = await fetch('<?php echo getTagsApi();?>?page='+currentPage);\n            const { tags, total } = await response.json();\n            if(tags.length > 0) {\n                renderTags(tags);\n                totalPages = Math.ceil(total / 50);\n                currentPage++;\n                if(currentPage > totalPages) {\n                    loadBtn.remove();\n                } else {\n                    loadBtn.disabled = false;\n                    loadBtn.textContent = '显示更多';\n                }\n            } else {\n                loadBtn.remove();\n            }\n        } catch (error) {\n            loadBtn.textContent = '加载失败，点击重试';\n            loadBtn.disabled = false;\n        }\n    };\n    loadTags();\n    loadBtn.addEventListener('click', loadTags);\n});\n</script>\n</div></div>\n\n</div>\n<?php $this->need('compoment/sidebar.php'); ?>\n<?php $this->need('compoment/foot.php'); ?>"
  },
  {
    "path": "thirdparty_comments.php",
    "content": "<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>\n<div class=\"comment-card\">\n<h3 class=\"ui header\">\n\n  <i class=\"comment alternate outline icon\"></i>评论区\n</h3>\n<br>\n<link href=\"<?php echo Bsoptions('artalk_backend');?>/dist/Artalk.css\" rel=\"stylesheet\" />\n\n<div id=\"Comments\"></div>\n<script>\n$(function(){\n    $.getScript('<?php echo Bsoptions('artalk_backend');?>/dist/Artalk.js',function(){\n       Artalk.init({\n  el:        '#Comments',\n  pageKey:   '<?php echo $this->permalink;?>',\n  pageTitle: '',\n  server:    '<?php echo Bsoptions('artalk_backend');?>',\n  site:      '<?php echo Bsoptions('artalk_sitename');?>',\n}); \n    })\n    \n    \n})\n\n</script>\n    </div>\n    \n</div>\n\n\n</div>"
  },
  {
    "path": "vendors/BearSimpleCacheRules.js",
    "content": "/* eslint-disable no-unused-vars */\n/* eslint-disable indent */\n/* eslint-disable linebreak-style */\n'use strict';\n\n(function () {\n  'use strict';\n  /**\n  * Service Worker Toolbox caching\n  */\n\n  var cacheVersion = '-toolbox-v1';\n  var dynamicVendorCacheName = 'dynamic-vendor' + cacheVersion;\n  var staticVendorCacheName = 'static-vendor' + cacheVersion;\n  var staticAssetsCacheName = 'static-assets' + cacheVersion;\n  var contentCacheName = 'content' + cacheVersion;\n  var maxEntries = 200;\n\n\n  self.importScripts('usr/themes/bearsimple/assets/js/sw-toolbox.js');\n\n  self.toolbox.options.debug = false;\n\n  // 缓存本站静态文件\n  self.toolbox.router.get('/usr/(.*)', self.toolbox.cacheFirst, {\n    cache: {\n      name: staticAssetsCacheName,\n      maxEntries: maxEntries\n    }\n  });\n\n  // 缓存 Gravatar 头像\n  self.toolbox.router.get('/avatar/(.*)', self.toolbox.cacheFirst, {\n    origin: /(secure\\.gravatar\\.com)/,\n    cache: {\n      name: staticVendorCacheName,\n      maxEntries: maxEntries\n    }\n  });\n\n  // 缓存 Google 字体\n  self.toolbox.router.get('/(.*)', self.toolbox.cacheFirst, {\n    origin: /(fonts\\.googleapis\\.com)/,\n    cache: {\n      name: staticVendorCacheName,\n      maxEntries: maxEntries\n    }\n  });\n  // 缓存 Emoji\n  self.toolbox.router.get('/(.*)', self.toolbox.cacheFirst, {\n    origin: /(twemoji\\.maxcdn\\.com)/,\n    cache: {\n      name: staticVendorCacheName,\n      maxEntries: maxEntries\n    }\n  });\n  self.toolbox.router.get('/(.*)', self.toolbox.cacheFirst, {\n    origin: /(fonts\\.gstatic\\.com)/,\n    cache: {\n      name: staticVendorCacheName,\n      maxEntries: maxEntries\n    }\n  });\nself.toolbox.router.get('/(.*)', self.toolbox.cacheFirst, {\n    origin: /(puhuiti\\.oss-cn-hangzhou\\.aliyuncs\\.com)/,\n    cache: {\n      name: staticVendorCacheName,\n      maxEntries: maxEntries\n    }\n  });\n  // immediately activate this serviceworker\n  self.addEventListener('install', function (event) {\n    return event.waitUntil(self.skipWaiting());\n  });\n\n  self.addEventListener('activate', function (event) {\n    return event.waitUntil(self.clients.claim());\n  });\n\n})();"
  },
  {
    "path": "vendors/Upload.php",
    "content": "<?php\n/** \n *  上传组件,适配兼容Bearsimple\n *  @author qining\n */\nnamespace Widget;\n\nuse Typecho\\Common;\nuse Typecho\\Date;\nuse Typecho\\Db\\Exception;\nuse Typecho\\Plugin;\nuse Typecho\\Widget;\nuse Widget\\Base\\Contents;\n\nif (!defined('__TYPECHO_ROOT_DIR__')) {\n    exit;\n}\n\n/**\n * 上传组件\n *\n * @author qining\n * @category typecho\n * @package Widget\n */\nclass Upload extends Contents implements ActionInterface\n{\n    //上传文件目录\n    public const UPLOAD_DIR = '/usr/uploads';\n\n    /**\n     * 删除文件\n     *\n     * @param array $content 文件相关信息\n     * @return bool\n     */\n    public static function deleteHandle(array $content): bool\n    {\n        $result = Plugin::factory(Upload::class)->trigger($hasDeleted)->deleteHandle($content);\n        if ($hasDeleted) {\n            return $result;\n        }\n\n        return @unlink(__TYPECHO_ROOT_DIR__ . '/' . $content['attachment']->path);\n    }\n\n    /**\n     * 获取实际文件绝对访问路径\n     *\n     * @param array $content 文件相关信息\n     * @return string\n     */\n    public static function attachmentHandle(array $content): string\n    {\n        $result = Plugin::factory(Upload::class)->trigger($hasPlugged)->attachmentHandle($content);\n        if ($hasPlugged) {\n            return $result;\n        }\n\n        $options = Options::alloc();\n        return Common::url(\n            $content['attachment']->path,\n            defined('__TYPECHO_UPLOAD_URL__') ? __TYPECHO_UPLOAD_URL__ : $options->siteUrl\n        );\n    }\n\n    /**\n     * 获取实际文件数据\n     *\n     * @param array $content\n     * @return string\n     */\n    public static function attachmentDataHandle(array $content): string\n    {\n        $result = Plugin::factory(Upload::class)->trigger($hasPlugged)->attachmentDataHandle($content);\n        if ($hasPlugged) {\n            return $result;\n        }\n\n        return file_get_contents(\n            Common::url(\n                $content['attachment']->path,\n                defined('__TYPECHO_UPLOAD_ROOT_DIR__') ? __TYPECHO_UPLOAD_ROOT_DIR__ : __TYPECHO_ROOT_DIR__\n            )\n        );\n    }\n\n    /**\n     * 初始化函数\n     */\n    public function action()\n    {\n        $options = Options::alloc();\n        if (isset($_POST['openid']) && $_POST['openid'] == $options->openId) {\n            $this->upload(1,$_POST['cid']);\n        }\n        else{\n        if ($this->user->pass('contributor', true) && $this->request->isPost()) {\n            $this->security->protect();\n            if ($this->request->is('do=modify&cid')) {\n                $this->modify();\n            } else {\n                $this->upload();\n            }\n        } else {\n            $this->response->setStatus(403);\n        }\n        }\n    }\n\n    /**\n     * 执行升级程序\n     *\n     * @throws Exception\n     */\n    public function modify()\n    {\n        if (!empty($_FILES)) {\n            $file = array_pop($_FILES);\n            if (0 == $file['error'] && is_uploaded_file($file['tmp_name'])) {\n                $this->db->fetchRow($this->select()->where('table.contents.cid = ?', $this->request->filter('int')->cid)\n                    ->where('table.contents.type = ?', 'attachment'), [$this, 'push']);\n\n                if (!$this->have()) {\n                    $this->response->setStatus(404);\n                    exit;\n                }\n\n                if (!$this->allow('edit')) {\n                    $this->response->setStatus(403);\n                    exit;\n                }\n\n                // xhr的send无法支持utf8\n                if ($this->request->isAjax()) {\n                    $file['name'] = urldecode($file['name']);\n                }\n\n                $result = self::modifyHandle($this->row, $file);\n\n                if (false !== $result) {\n                    self::pluginHandle()->beforeModify($result);\n\n                    $this->update([\n                        'text' => serialize($result)\n                    ], $this->db->sql()->where('cid = ?', $this->cid));\n\n                    $this->db->fetchRow($this->select()->where('table.contents.cid = ?', $this->cid)\n                        ->where('table.contents.type = ?', 'attachment'), [$this, 'push']);\n\n                    /** 增加插件接口 */\n                    self::pluginHandle()->modify($this);\n\n                    $this->response->throwJson([$this->attachment->url, [\n                        'cid' => $this->cid,\n                        'title' => $this->attachment->name,\n                        'type' => $this->attachment->type,\n                        'size' => $this->attachment->size,\n                        'bytes' => number_format(ceil($this->attachment->size / 1024)) . ' Kb',\n                        'isImage' => $this->attachment->isImage,\n                        'url' => $this->attachment->url,\n                        'permalink' => $this->permalink\n                    ]]);\n                }\n            }\n        }\n\n        $this->response->throwJson(false);\n    }\n\n    /**\n     * 修改文件处理函数,如果需要实现自己的文件哈希或者特殊的文件系统,请在options表里把modifyHandle改成自己的函数\n     *\n     * @param array $content 老文件\n     * @param array $file 新上传的文件\n     * @return mixed\n     */\n    public static function modifyHandle(array $content, array $file)\n    {\n        if (empty($file['name'])) {\n            return false;\n        }\n\n        $result = self::pluginHandle()->trigger($hasModified)->modifyHandle($content, $file);\n        if ($hasModified) {\n            return $result;\n        }\n\n        $ext = self::getSafeName($file['name']);\n\n        if ($content['attachment']->type != $ext) {\n            return false;\n        }\n\n        $path = Common::url(\n            $content['attachment']->path,\n            defined('__TYPECHO_UPLOAD_ROOT_DIR__') ? __TYPECHO_UPLOAD_ROOT_DIR__ : __TYPECHO_ROOT_DIR__\n        );\n        $dir = dirname($path);\n\n        //创建上传目录\n        if (!is_dir($dir)) {\n            if (!self::makeUploadDir($dir)) {\n                return false;\n            }\n        }\n\n        if (isset($file['tmp_name'])) {\n            @unlink($path);\n\n            //移动上传文件\n            if (!@move_uploaded_file($file['tmp_name'], $path)) {\n                return false;\n            }\n        } elseif (isset($file['bytes'])) {\n            @unlink($path);\n\n            //直接写入文件\n            if (!file_put_contents($path, $file['bytes'])) {\n                return false;\n            }\n        } elseif (isset($file['bits'])) {\n            @unlink($path);\n\n            //直接写入文件\n            if (!file_put_contents($path, $file['bits'])) {\n                return false;\n            }\n        } else {\n            return false;\n        }\n\n        if (!isset($file['size'])) {\n            $file['size'] = filesize($path);\n        }\n\n        //返回相对存储路径\n        return [\n            'name' => $content['attachment']->name,\n            'path' => $content['attachment']->path,\n            'size' => $file['size'],\n            'type' => $content['attachment']->type,\n            'mime' => $content['attachment']->mime\n        ];\n    }\n\n    /**\n     * 获取安全的文件名\n     *\n     * @param string $name\n     * @return string\n     */\n    private static function getSafeName(string &$name): string\n    {\n        $name = str_replace(['\"', '<', '>'], '', $name);\n        $name = str_replace('\\\\', '/', $name);\n        $name = false === strpos($name, '/') ? ('a' . $name) : str_replace('/', '/a', $name);\n        $info = pathinfo($name);\n        $name = substr($info['basename'], 1);\n\n        return isset($info['extension']) ? strtolower($info['extension']) : '';\n    }\n\n    /**\n     * 创建上传路径\n     *\n     * @param string $path 路径\n     * @return boolean\n     */\n    private static function makeUploadDir(string $path): bool\n    {\n        $path = preg_replace(\"/\\\\\\+/\", '/', $path);\n        $current = rtrim($path, '/');\n        $last = $current;\n\n        while (!is_dir($current) && false !== strpos($path, '/')) {\n            $last = $current;\n            $current = dirname($current);\n        }\n\n        if ($last == $current) {\n            return true;\n        }\n\n        if (!@mkdir($last, 0755)) {\n            return false;\n        }\n\n        return self::makeUploadDir($path);\n    }\n\n    /**\n     * 执行升级程序\n     *\n     * @throws Exception\n     */\n    public function upload($authorId = null,$ucid = null)\n    {\n        if (!empty($_FILES)) {\n            $file = array_pop($_FILES);\n            if (0 == $file['error'] && is_uploaded_file($file['tmp_name'])) {\n                // xhr的send无法支持utf8\n                if ($this->request->isAjax()) {\n                    $file['name'] = urldecode($file['name']);\n                }\n                $result = self::uploadHandle($file);\n\n                if (false !== $result) {\n                    self::pluginHandle()->beforeUpload($result);\n\n                    $struct = [\n                        'title' => $result['name'],\n                        'slug' => $result['name'],\n                        'type' => 'attachment',\n                        'status' => 'publish',\n                        'text' => serialize($result),\n                        'allowComment' => 1,\n                        'allowPing' => 0,\n                        'allowFeed' => 1\n                    ];\n  if(isset($authorId) && isset($ucid)){\n                     $cid = $ucid;\n                        $struct['parent'] = $cid;\n                        $struct['authorId'] = 1;\n                    }\n                    else{\n                    if (isset($this->request->cid)) {\n                        $cid = $this->request->filter('int')->cid;\n                        \n                        if ($this->isWriteable($this->db->sql()->where('cid = ?', $cid))) {\n                            $struct['parent'] = $cid;\n                        }\n                    }\n                    }\n\n                    $insertId = $this->insert($struct);\n\n                    $this->db->fetchRow($this->select()->where('table.contents.cid = ?', $insertId)\n                        ->where('table.contents.type = ?', 'attachment'), [$this, 'push']);\n\n                    /** 增加插件接口 */\n                    self::pluginHandle()->upload($this);\n\n                    $this->response->throwJson([$this->attachment->url, [\n                        'cid' => $insertId,\n                        'title' => $this->attachment->name,\n                        'type' => $this->attachment->type,\n                        'size' => $this->attachment->size,\n                        'bytes' => number_format(ceil($this->attachment->size / 1024)) . ' Kb',\n                        'isImage' => $this->attachment->isImage,\n                        'url' => $this->attachment->url,\n                        'permalink' => $this->permalink\n                    ]]);\n\n                }\n            }\n        }\n\n        $this->response->throwJson(false);\n    }\n\n    /**\n     * 上传文件处理函数,如果需要实现自己的文件哈希或者特殊的文件系统,请在options表里把uploadHandle改成自己的函数\n     *\n     * @param array $file 上传的文件\n     * @return mixed\n     */\n    public static function uploadHandle(array $file)\n    {\n        if (empty($file['name'])) {\n            return false;\n        }\n\n        $result = self::pluginHandle()->trigger($hasUploaded)->uploadHandle($file);\n        if ($hasUploaded) {\n            return $result;\n        }\n\n        $ext = self::getSafeName($file['name']);\n\n        if (!self::checkFileType($ext)) {\n            return false;\n        }\n\n        $date = new Date();\n        $path = Common::url(\n            defined('__TYPECHO_UPLOAD_DIR__') ? __TYPECHO_UPLOAD_DIR__ : self::UPLOAD_DIR,\n            defined('__TYPECHO_UPLOAD_ROOT_DIR__') ? __TYPECHO_UPLOAD_ROOT_DIR__ : __TYPECHO_ROOT_DIR__\n        ) . '/' . $date->year . '/' . $date->month;\n\n        //创建上传目录\n        if (!is_dir($path)) {\n            if (!self::makeUploadDir($path)) {\n                return false;\n            }\n        }\n\n        //获取文件名\n        $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext;\n        $path = $path . '/' . $fileName;\n\n        if (isset($file['tmp_name'])) {\n            //移动上传文件\n            if (!@move_uploaded_file($file['tmp_name'], $path)) {\n                return false;\n            }\n        } elseif (isset($file['bytes'])) {\n            //直接写入文件\n            if (!file_put_contents($path, $file['bytes'])) {\n                return false;\n            }\n        } elseif (isset($file['bits'])) {\n            //直接写入文件\n            if (!file_put_contents($path, $file['bits'])) {\n                return false;\n            }\n        } else {\n            return false;\n        }\n\n        if (!isset($file['size'])) {\n            $file['size'] = filesize($path);\n        }\n\n        //返回相对存储路径\n        return [\n            'name' => $file['name'],\n            'path' => (defined('__TYPECHO_UPLOAD_DIR__') ? __TYPECHO_UPLOAD_DIR__ : self::UPLOAD_DIR)\n                . '/' . $date->year . '/' . $date->month . '/' . $fileName,\n            'size' => $file['size'],\n            'type' => $ext,\n            'mime' => Common::mimeContentType($path)\n        ];\n    }\n\n    /**\n     * 检查文件名\n     *\n     * @access private\n     * @param string $ext 扩展名\n     * @return boolean\n     */\n    public static function checkFileType(string $ext): bool\n    {\n        $options = Options::alloc();\n        return in_array($ext, $options->allowedAttachmentTypes);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/Action.php",
    "content": "<?php\nnamespace TypechoPlugin\\BsCore;\nuse BsCore;\nuse bsOptions;\nuse \\Utils\\Helper;\n//use Typecho\\{Exception, Widget, Db};\nuse Typecho\\Cookie;\nuse Widget\\Options;\nuse PHPMailer\\PHPMailer\\PHPMailer;\nuse PHPMailer\\PHPMailer\\SMTP;\nuse Typecho\\Common;\nuse Typecho\\Date;\nuse Typecho\\Db\\Exception;\nuse Typecho\\Plugin;\nuse Typecho\\Widget;\nuse Widget\\Base\\Contents;\n\n\nrequire_once Helper::options()->pluginDir('BsCore'). '/lib/phpmailer/Exception.php';\nrequire_once Helper::options()->pluginDir('BsCore'). '/lib/phpmailer/PHPMailer.php';\nrequire_once Helper::options()->pluginDir('BsCore'). '/lib/phpmailer/SMTP.php';\n\n\nrequire_once dirname(__FILE__) . '/modules/Tinypng/Tinify/Exception.php';\nrequire_once dirname(__FILE__) . '/modules/Tinypng/Tinify/ResultMeta.php';\nrequire_once dirname(__FILE__) . '/modules/Tinypng/Tinify/Result.php';\nrequire_once dirname(__FILE__) . '/modules/Tinypng/Tinify/Source.php';\nrequire_once dirname(__FILE__) . '/modules/Tinypng/Tinify/Client.php';\nrequire_once dirname(__FILE__) . '/modules/Tinypng/Tinify.php';\n\nif(!class_exists('CSF')){\n    require_once Helper::options()->pluginDir('BsCore').'/bsoptions-framework.php';\n}\n\nif (!class_exists('bsOptions')){\n    require_once \\Utils\\Helper::options()->pluginDir('BsCore').'/bsOptions.php';\n}\n\nfunction curl_file_get_contents($_url, $type='www')\n{\n    $ch = curl_init();\n\n    curl_setopt($ch, CURLOPT_URL, $_url);\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);\n    curl_setopt($ch, CURLOPT_REFERER, 'https://'.$type.'.douban.com/');\n    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');\n\n    $output = curl_exec($ch);\n    curl_close($ch);\n    return $output;\n}\n\n\n\n\nclass Action extends Widget implements \\Widget\\ActionInterface\n{\n  private string $_template_dir = __DIR__ . '/modules/MailServices/';\n     \n \n    \n   public function bsshortlink()\n    {\n        $requestString = $this->request->key;\n        $siteUrl = preg_replace(\"/https?:\\/\\//\", \"\", Helper::options()->siteUrl);\n        $options = get_option('bearsimple');\n        $referer = $this->request->getReferer();\n        $template = $options['goLinkThemes'] == 'NULL' ? null : $options['goLinkThemes'];\n\n        // 设置nofollow属性\n        $this->response->setHeader('X-Robots-Tag', 'noindex, nofollow');\n        \n        if ($requestString === \\BsCore\\Plugin::urlSafeB64Encodes(\\BsCore\\Plugin::urlSafeB64Decodes($requestString))) {\n            // 自动转换链接处理\n            $target = \\BsCore\\Plugin::urlSafeB64Decodes($requestString);\n            $allow_redirect = false; // 默认不允许跳转\n            // 检查 referer\n            $allow_redirect = \\BsCore\\Plugin::checkDomains($referer, $refererList);\n            if (strpos($referer, $siteUrl) !== false) {\n                $allow_redirect = true;\n            }\n            if (!$allow_redirect) {\n                $this->response->redirect($siteUrl, 301);\n                exit();\n            }\n        }elseif(\\BsCore\\Plugin::bCore_getDiyLink($requestString)['url']) {\n               $target = \\BsCore\\Plugin::bCore_getDiyLink($requestString)['url'];\n        }else {\n            throw new \\Typecho\\Widget\\Exception(_t('您访问的网页不存在'), 404);\n        }\n        \n        if ($template === 'NULL' || $template === null) {\n            // 无跳转页面\n            $this->response->redirect($target, 301);\n        } else {\n            $filename = Helper::options()->themeUrl . '/modules/GoLinks/templates/'. $template . '.html';\n            if (PATH_SEPARATOR !== ':') {\n                $filename = mb_convert_encoding($filename, 'GBK', \"auto\");\n            }\n            $contents = file_get_contents($filename);\n            $html = str_replace(array('{{url}}', '{{delay}}', '{{title}}', '{{siteUrl}}', '{{year}}'), array($target, '3',Helper::options()->title,Helper::options()->siteUrl,date('Y')), $contents);\n            echo preg_replace_callback(\"/\\{\\{([_a-z0-9]+)\\}\\}/i\",\n               array(__CLASS__, '__relpaceCallbacks'), $html);\n            exit();\n        }\n    }\n    \n    public function tinypng_status()\n    {\n        $apikey = trim(get_option('bearsimple')['Tinypng_apikey']);\n        \\Tinify\\setKey($apikey);\n        \\Tinify\\validate();\n        $compressionsThisMonth = \\Tinify\\compressionCount();\n        $number = 500 - $compressionsThisMonth;\n        echo $number;\n\n    }\n    \n    public function clean_cache()\n    {\n        $options = get_option('bearsimple');\n        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') {\n            \\BsCore\\Plugin::initBackend($options['Cache_choose']);\n            try {\n                \\BsCore\\Plugin::$cache->flush();\n                $data['code']  = '1';\n\t            $data['message']  = '缓存清理成功!';\n                echo json_encode($data, JSON_UNESCAPED_UNICODE);\n            } catch (Exception $e) {\n                print $e->getMessage();\n            }\n        } else{\n            // 关闭其他插件选项\n            if ($options['enable_gcache'] == '1'){\n                $options['enable_gcache'] = 0;\n            }\n            if ($options['enable_markcache'] == '1'){\n                $options['enable_markcache'] = 0;\n            }\n            $data['code']  = '0';\n\t            $data['message']  = '缓存清理失败，请检查缓存方式!';\n                echo json_encode($data, JSON_UNESCAPED_UNICODE);\n        }\n\n        bsOptions::update_option('bearsimple', $options);\n\n    }\n    \n    //邮件功能\n    private $_db;\n    private $_dir;\n    private $_options;\n    private $_isMailLog = false;\n    private $_user;\n    private  $_email;\n\n    /**\n     * 读取缓存文件内容\n     */\n    public function process($fileName)\n    { \n        $this->init();\n        $options = get_option('bearsimple');\n        //获取评论内容\n        $file = $this->_dir . '/cache/' . $fileName;\n        if (file_exists($file)) {\n            $this->_email = unserialize(file_get_contents($file));\n            @unlink($file);\n\n            if (!$this->_user->simpleLogin($this->_email->ownerId)) {\n                $this->widget('Widget_Archive@404', 'type=404')->render();\n                exit;\n            }\n        } else {\n            $this->widget('Widget_Archive@404', 'type=404')->render();\n            exit;\n        }\n         \n         if($this->_email->banMail){\n             $this->ban($this->_email->coid,true);\n         }\n        //发件人邮箱\n        $this->_email->from = $options['CommentNotify__SenderForm'] ? $options['CommentNotify__SenderForm'] : $options['CommentNotify__Username'];\n\n        //发件人名称\n        $this->_email->fromName = $options['CommentNotify__SenderName'] ? $options['CommentNotify__SenderName'] : $this->_email->siteTitle;\n\n        //向博主发邮件的标题格式\n        $this->_email->titleForOwner = $options['CommentNotify__Author'];\n\n        //向访客发邮件的标题格式\n        $this->_email->titleForGuest = $options['CommentNotify__Reader'];\n\n        //验证博主是否接收自己的邮件\n        $toMe = (in_array('3', $options['CommentNotify__OtherSetting']) && $this->_email->ownerId == $this->_email->authorId) ? true : false;\n\n        //向博主发信\n        if (\n            in_array($this->_email->status, $options['CommentNotify__NotifySetting']) && in_array('1', $options['CommentNotify__OtherSetting'])\n            && ($toMe || $this->_email->ownerId != $this->_email->authorId) && 0 == $this->_email->parent\n        ) {\n            if (empty($options['CommentNotify__AcceptMailAddress'])) {\n                \\Typecho\\Widget::widget('Widget_Users_Author@temp' . $this->_email->cid, array('uid' => $this->_email->ownerId))->to($user);\n                $this->_email->to = $user->mail;\n            } else {\n                $this->_email->to = $options['CommentNotify__AcceptMailAddress'];\n            }\n\n            $this->authorMail()->sendMail();\n        }\n\n        //向访客发信\n        if (\n            0 != $this->_email->parent\n            && 'approved' == $this->_email->status\n            && in_array('2', $options['CommentNotify__OtherSetting'])\n            && !$this->ban($this->_email->parent)\n        ) {\n            //如果联系我的邮件地址为空，则使用文章作者的邮件地址\n            if (empty($this->_email->contactme)) {\n                if (!isset($user) || !$user) {\n                    \\Typecho\\Widget::widget('Widget_Users_Author@temp' . $this->_email->cid, array('uid' => $this->_email->ownerId))->to($user);\n                }\n                $this->_email->contactme = $user->mail;\n            } else {\n                $this->_email->contactme = $options['CommentNotify__TemplateContact'];\n            }\n\n            $original = $this->_db->fetchRow($this->_db->select('author', 'mail', 'text')\n                ->from('table.comments')\n                ->where('coid = ?', $this->_email->parent));\n\n            if (\n                in_array('3', $options['CommentNotify__OtherSetting'])\n                || $this->_email->mail != $original['mail']\n            ) {\n                $this->_email->to             = $original['mail'];\n                $this->_email->originalText   = \\BsCore\\Plugin::getEmo($original['text']);\n                $this->_email->originalAuthor = $original['author'];\n                $this->guestMail()->sendMail();\n            }\n        }\n\n        $date = new \\Typecho\\Date(\\Typecho\\Date::gmtTime());\n        $time = $date->format('Y-m-d H:i:s');\n        $this->mailLog(false, $time . \" 邮件发送完毕!\\r\\n\");\n    }\n\n    /**\n     * 作者邮件信息\n     * @return $this\n     */\n    public function authorMail()\n    {\n         error_reporting(0);\n        $options = get_option('bearsimple');\n        $this->_email->toName = $this->_email->siteTitle;\n        $date = new \\Typecho\\Date($this->_email->created);\n        $time = $date->format('Y-m-d H:i:s');\n        $status = array(\n            \"approved\" => '通过',\n            \"waiting\"  => '待审',\n            \"spam\"     => '垃圾'\n        );\n        $search  = array(\n            '{siteTitle}',\n            '{title}',\n            '{author}',\n            '{ip}',\n            '{mail}',\n            '{permalink}',\n            '{manage}',\n            '{text}',\n            '{time}',\n            '{status}',\n            '{siteurl}'\n        );\n        $replace = array(\n            $this->_email->siteTitle,\n            $this->_email->title,\n            $this->_email->author,\n            $this->_email->ip,\n            $this->_email->mail,\n            $this->_email->permalink,\n            $this->_email->manage,\n            $this->_email->text,\n            $time,\n            $status[$this->_email->status],\n            $this->_options->siteUrl\n            \n        );\n\n        $this->_email->msgHtml = str_replace($search, $replace, file_get_contents(dirname(__FILE__).\"/modules/MailServices/owner.html\"));\n        $this->_email->subject = str_replace($search, $replace, $this->_email->titleForOwner);\n        $this->_email->altBody = \"作者：\" . $this->_email->author . \"\\r\\n链接：\" . $this->_email->permalink . \"\\r\\n评论：\\r\\n\" . $this->_email->text;\n\n        return $this;\n    }\n\n    /**\n     * 访问邮件信息\n     * @return $this\n     */\n    public function guestMail()\n    {\n         error_reporting(0);\n        $options = get_option('bearsimple');\n        $sysoptions = \\Typecho\\Widget::widget('Widget_Options');\n        $this->_email->toName = $this->_email->originalAuthor ? $this->_email->originalAuthor : $this->_email->siteTitle;\n        $date    = new \\Typecho\\Date($this->_email->created);\n        $time    = $date->format('Y-m-d H:i:s');\n        $search  = array(\n            '{siteTitle}',\n            '{title}',\n            '{author_p}',\n            '{author}',\n            '{permalink}',\n            '{text}',\n            '{contactme}',\n            '{text_p}',\n            '{time}',\n            '{siteurl}'\n        );\n        $replace = array(\n            $this->_email->siteTitle,\n            $this->_email->title,\n            $this->_email->originalAuthor,\n            $this->_email->author,\n            $this->_email->permalink,\n            $this->_email->text,\n            $this->_email->contactme,\n            $this->_email->originalText,\n            $time,\n            $this->_options->siteUrl\n        );\n\n        $this->_email->msgHtml = str_replace($search, $replace, file_get_contents(dirname(__FILE__).\"/modules/MailServices/guest.html\"));\n        $this->_email->subject = str_replace($search, $replace, $this->_email->titleForGuest);\n        $this->_email->altBody = \"作者：\" . $this->_email->author . \"\\r\\n链接：\" . $this->_email->permalink . \"\\r\\n评论：\\r\\n\" . $this->_email->text;\n\n        return $this;\n    }\n\n    /*\n     * 发送邮件\n     */\n    public function sendMail()\n    {\n         error_reporting(0);\n        /** 载入邮件组件 */\n        $mailer = new PHPMailer(true);\n        $mailer->CharSet = 'UTF-8';\n        $mailer->Encoding = 'base64';\n$options = get_option('bearsimple');\n        //选择发信模式\n        switch ($options['CommentNotify__Sendway']) {\n            case 'smtp':\n                $mailer->IsSMTP();\n\n                if (in_array('true', $options['CommentNotify__Verify'])) {\n                    $mailer->SMTPAuth = true;\n                }\n                switch ($options['CommentNotify__VerifyWay']) {\n                    case 'ssl':\n                        $mailer->SMTPSecure = \"ssl\";\n                        break;\n                    case 'tls':\n                        $mailer->SMTPSecure = \"tls\";\n                        break;\n                    case 'none':\n                        $mailer->SMTPSecure = \"\";\n                        break;\n                }\n\n                $mailer->Host     = $options['CommentNotify__Address'];\n                $mailer->Port     = $options['CommentNotify__Port'];\n                $mailer->Username = $options['CommentNotify__Username'];\n                $mailer->Password = $options['CommentNotify__Password'];\n\n                break;\n        }\n       $mailer->SMTPOptions = array(\n'ssl' => array(\n    'verify_peer' => false,\n    'verify_peer_name' => false,\n    'allow_self_signed' => true\n    )\n);\n$mailer->isHTML(true); \n        $mailer->SetFrom($this->_email->from, $this->_email->fromName);\n        $mailer->AddReplyTo($this->_email->to, $this->_email->toName);\n        $mailer->Subject = $this->_email->subject;\n        $mailer->AltBody = $this->_email->altBody;\n        $mailer->MsgHTML($this->_email->msgHtml);\n        $mailer->AddAddress($this->_email->to, $this->_email->toName);\n      \n        if ($result = $mailer->Send()) {\n            $this->mailLog();\n        } else {\n            $this->mailLog(false, $mailer->ErrorInfo . \"\\r\\n\");\n            $result = $mailer->ErrorInfo;\n        }\n\n        $mailer->ClearAddresses();\n        $mailer->ClearReplyTos();\n\n        return $result;\n    }\n\n    /*\n     * 记录邮件发送日志和错误信息\n     */\n    public function mailLog($type = true, $content = null)\n    {\n        if (!$this->_isMailLog) {\n            return false;\n        }\n\n        $fileName = $this->_dir . '/log/mailer_log.txt';\n        if ($type) {\n            $guest = explode('@', $this->_email->to);\n            $guest = substr($this->_email->to, 0, 1) . '***' . $guest[1];\n            $content  = $content ? $content : \"向 \" . $guest . \" 发送邮件成功！\\r\\n\";\n        }\n\n        file_put_contents($fileName, $content, FILE_APPEND);\n    }\n\n   \n    /*\n     * 验证原评论者是否接收评论\n     */\n    public function ban($parent, $isWrite = false)\n    {\n        if ($parent) {\n            $index    = ceil($parent / 500);\n            $filename = $this->_dir . '/log/ban_' . $index . '.list';\n\n            if (!file_exists($filename)) {\n                $list = array();\n                file_put_contents($filename, serialize($list));\n            } else {\n                $list = unserialize(file_get_contents($filename));\n            }\n\n            //写入记录\n            if ($isWrite) {\n                $list[$parent] = 1;\n                file_put_contents($filename, serialize($list));\n\n                return true;\n            } else if (isset($list[$parent]) && $list[$parent]) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * 邮件发送测试\n     */\n    public function testMail()\n    {\n        error_reporting(0);\n$options = get_option('bearsimple');\n        $this->init();\n        $this->_isMailLog = true;\n        $this->_email->from = $options['CommentNotify__SenderForm'] ? $options['CommentNotify__SenderForm'] : $options['CommentNotify__Username'];\n        $this->_email->fromName = $options['CommentNotify__SenderName'] ? $options['CommentNotify__SenderName'] : $this->_options->title;\n        $this->_email->to = $this->_user->mail;\n        $this->_email->toName = $this->_user->screenName;\n        $this->_email->subject = '测试邮件';\n        $this->_email->altBody = '这是一封由BearSimple发出的测试邮件';\n        $this->_email->msgHtml = '这是一封由BearSimple发出的测试邮件';\n\n        $result = $this->sendMail();\n$data['code']  =  true === $result ? '1' : '0';\n\t            $data['message']  = true === $result ? _t('测试邮件发送成功，已发送至'.$this->_user->mail) : _t('测试邮件发送失败：' . $result);\n                echo json_encode($data, JSON_UNESCAPED_UNICODE);\n       \n\n    }\n    \n    /*\n     * 获取管理员信息\n     */\n    public function userInfo($value,$uid)\n    {\n    $db   = \\Typecho\\Db::get();\n    $prow = $db->fetchRow($db->select($value)->from('table.users')->where('uid = ?', $uid));\n    $text = $prow[$value];\n    return $text;\n     }\n     \n    /*\n     * 邮件发送[友链]\n     */\n    public function linkMail()\n    {\n        error_reporting(0);\n$options = get_option('bearsimple');\n$sysoptions = \\Typecho\\Widget::widget('Widget_Options');\n        $this->init();\n        $this->_isMailLog = true;\n        $this->_email->from = $options['CommentNotify__SenderForm'] ? $options['CommentNotify__SenderForm'] : $options['CommentNotify__Username'];\n        $this->_email->fromName = $options['CommentNotify__SenderName'] ? $options['CommentNotify__SenderName'] : $this->_options->title;\n        \n        $search  = array(\n            '{siteTitle}',\n            '{friendname}',\n            '{siteurl}'\n        );\n        $replace = array(\n            $sysoptions->title,\n            $_GET['friendname'],\n            $sysoptions->siteUrl\n        );\n        \n        switch($_GET['type']){\n            case 'notifyaccept':\n        $this->_email->to = self::userInfo('mail','1');\n        $this->_email->toName = $this->_user->screenName;\n        $this->_email->subject = '您的站点有新的友链申请等待审核哦';\n        $this->_email->altBody = '友链审核提醒';\n        $this->_email->msgHtml = str_replace($search, $replace, file_get_contents(dirname(__FILE__).\"/modules/MailServices/friendlink_notify.html\"));\n        //$this->_email->msgHtml = '主人，有人提交了友链申请啦，快去审核下叭～';\n        break;\n        case 'notifysuccess':\n        $this->_email->to = $_GET['mail'];\n        $this->_email->toName = $_GET['mail'];\n        $this->_email->subject = '友链审核结果';\n        $this->_email->altBody = '友链审核结果';\n        $this->_email->msgHtml = str_replace($search, $replace, file_get_contents(dirname(__FILE__).\"/modules/MailServices/friendlink_approved.html\"));\n        //$this->_email->msgHtml = '您好，您在'.$this->_options->title.'提交的友链申请已经审核通过，后续还请您遵守本站关于互换友链的相关说明哦。';\n        break;\n        case 'notifyfail':\n        $this->_email->to = $_GET['mail'];\n        $this->_email->toName = $_GET['mail'];\n        $this->_email->subject = '友链审核结果';\n         $this->_email->altBody = '友链审核结果';\n        $this->_email->msgHtml = str_replace($search, $replace, file_get_contents(dirname(__FILE__).\"/modules/MailServices/friendlink_reject.html\"));\n        //$this->_email->msgHtml = '您好，您在'.$this->_options->title.'提交的友链申请审核不通过，还请您参照本站关于互换友链的标准并检查是否符合哦。';\n        break;\n}\n        $result = $this->sendMail();\n$data['code']  =  true === $result ? '1' : '0';\n\t            $data['message']  = true === $result ? _t('邮件发送成功') : _t('邮件发送失败：' . $result);\n                echo json_encode($data, JSON_UNESCAPED_UNICODE);\n       \n\n    }\n     \n     \n     public function editEmailTemplate($file)\n    {\n        $path = $this->_template_dir . $file;\n\n        if (file_exists($path) && is_writeable($path)) {\n            $handle = fopen($path, 'wb');\n            if ($handle && fwrite($handle, $this->request->content)) {\n                fclose($handle);\n                $this->widget('Widget_Notice')->set(_t(\"您所进行的编辑已经保存\", $file), 'success');\n            } else {\n                $this->widget('Widget_Notice')->set(_t(\"该文件 %s 无法被写入\", $file), 'error');\n            }\n            $this->response->goBack();\n        } else {\n            throw new \\Typecho\\Widget\\Exception(_t('您编辑的模板文件不存在'));\n        }\n    }\n    \n    \n    /**\n     * 初始化\n     * @return $this\n     */\n    public function init()\n    {\n        $this->_dir = dirname(__FILE__);\n        $this->_db = \\Typecho\\Db::get();\n        $this->_email = (object)\n        $this->_user = $this->widget('Widget_User');\n        $this->_options = $this->widget('Widget_Options');\n        $this->mailLog(false, \"开始发送邮件Action：\" . $this->request->send . \"\\r\\n\");\n    }\n    public function action()\n    {\n         \n        $this->on($this->request->is('do=testMail'))->testMail();\n        $this->on($this->request->is('do=linkMail'))->linkMail();\n        $this->on($this->request->is('do=tinypng'))->tinypng_status();\n        $this->on($this->request->is('send'))->process($this->request->send);\n        $this->on($this->request->is('do=editEmailTemplate'))->editEmailTemplate($this->request->edit);\n    }\n\n    private function __relpaceCallbacks($matches)\n    {\n        return $this->options->{$matches[1]};\n    }\n}"
  },
  {
    "path": "配套插件/BsCore/Console.php",
    "content": "<?php\n\nnamespace TypechoPlugin\\BsCore;\n\nuse \\Typecho\\{Widget};\nuse \\Typecho\\Widget\\Helper\\Form;\nuse \\Typecho\\Widget\\Helper\\Form\\Element\\{Text, Hidden, Submit, Textarea};\n\n\nif (!defined('__TYPECHO_ROOT_DIR__')) exit;\n\n\nclass Console extends Widget\n{\n    /** \n     * 模板文件目录\n     * \n     *  @var string \n     */\n    private $_template_dir = __DIR__ . '/modules/MailServices/';\n\n    /** \n     * 当前文件\n     * \n     * @var string  \n     */\n    private $_currentFile;\n\n    /**\n     * 执行函数\n     *\n     * @return void\n     * @throws \\Typecho\\Widget\\Exception\n     */\n    public function execute()\n    {\n        $this->widget('Widget_User')->pass('administrator');\n        $files = glob($this->_template_dir . '*.html');\n        $this->_currentFile = $this->request->get('file', 'owner.html');\n\n        if (preg_match(\"/^([_0-9a-z-\\.\\ ])+$/i\", $this->_currentFile) && file_exists($this->_template_dir . $this->_currentFile)) {\n            foreach ($files as $file) {\n                if (!file_exists($file)) continue;\n                $file = basename($file);\n                $this->push(array(\n                    'file'      =>  $file,\n                    'current'   => ($file == $this->_currentFile)\n                ));\n            }\n            return;\n        }\n        throw new \\Typecho\\Widget\\Exception('模板文件不存在', 404);\n    }\n\n    /**\n     * 获取菜单标题\n     *\n     * @return string\n     */\n    public function getMenuTitle(): string\n    {\n        return _t('编辑文件 %s', $this->_currentFile);\n    }\n\n    /**\n     * 获取文件内容\n     *\n     * @return string\n     */\n    public function currentContent(): string\n    {\n        return htmlspecialchars(file_get_contents($this->_template_dir . $this->_currentFile));\n    }\n\n    /**\n     * 获取文件是否可读\n     *\n     * @return string\n     */\n    public function currentIsWriteable(): string\n    {\n        return is_writeable($this->_template_dir . $this->_currentFile);\n    }\n\n    /**\n     * 获取当前文件\n     *\n     * @return string\n     */\n    public function currentFile(): string\n    {\n        return $this->_currentFile;\n    }\n\n    \n}\n"
  },
  {
    "path": "配套插件/BsCore/Plugin.php",
    "content": "<?php\nnamespace TypechoPlugin\\BsCore;\nerror_reporting(0);\nsession_start();\nuse Utils\\Helper;\nuse Typecho\\Plugin\\PluginInterface;\nuse Typecho\\Widget\\Helper\\Form;\nuse Typecho\\{Plugin\\Exception, Widget, Db, Widget\\Request as WidgetRequest};\nuse \\CSF as CSF;\nuse bsOptions;\nuse Widget\\Options;\nuse Typecho\\Common;\nuse Typecho\\Router;\nuse Widget\\Archive;\nuse Widget\\Contents\\Post\\Admin;\nuse Widget\\Contents\\Post\\Edit;\nuse Widget\\Feedback;\nuse Widget\\Service;\nuse Widget\\Upload;\nuse CURLFile;\nuse ReflectionClass;\nuse Utils\\PasswordHash;\nuse Typecho\\Widget\\Response as WidgetResponse;\nuse Utils\\Markdown as Markdown;\nrequire_once 'modules/DX_Captcha/CaptchaClient.php';\nuse CaptchaClient;\nrequire_once 'modules/Markdown/Parser.php';\nrequire_once 'modules/Tinypng/Tinify/Exception.php';\nrequire_once 'modules/Tinypng/Tinify/ResultMeta.php';\nrequire_once 'modules/Tinypng/Tinify/Result.php';\nrequire_once 'modules/Tinypng/Tinify/Source.php';\nrequire_once 'modules/Tinypng/Tinify/Client.php';\nrequire_once 'modules/Tinypng/Tinify.php';\nrequire_once 'modules/aliyun_oss/aliyun-oss-php-sdk-2.6.0.phar';\nuse OSS\\OssClient;\nuse OSS\\Core\\OssException;\nrequire_once 'modules/qiniu_kodo/autoload.php';\nuse Qiniu\\Auth;\nuse Qiniu\\Storage\\BucketManager;\nuse Qiniu\\Storage\\UploadManager;\nrequire_once 'modules/upyun_uss/vendor/autoload.php';\nuse Upyun\\Upyun;\nuse Upyun\\Config;\nrequire_once 'modules/huawei_obs/vendor/autoload.php';\nrequire_once 'modules/huawei_obs/obs-autoloader.php';\nuse Obs\\ObsClient;\nrequire_once 'modules/baidu_bos/BaiduBce.phar';\nuse BaiduBce\\Services\\Bos\\BosClient;\nuse BaiduBce\\Services\\Bos\\BosOptions;\n\nrequire_once 'modules/cache/autoload.php';\n/**\n * BearSimple主题核心插件\n * <br>安装后无需进行其他设置\n * @package BsCore\n * @author BearNotion\n * @version v2.9.9-release\n * @link https://www.bearnotion.ru/\n *\n */\n\n\n\nif (!defined('__TYPECHO_ROOT_DIR__')) exit;\nif (!defined('pluginName')) {\n  define('pluginName', 'BsCore');\n}\nrequire_once 'bsoptions-framework.php';\nclass Plugin implements PluginInterface\n{\n    public static $action = 'bs-ajax';\n    #邮件\n    private static $_isMailLog  = false;\n    private static $_adapter    = false;\n    \n    #上传文件目录\n  const UPLOAD_DIR = 'usr/uploads';\n  const PLUGIN_DIR = '/usr/plugins/BsCore/';\npublic static $cache = null;\n\tpublic static $html = null;\n\tpublic static $path = null;\n\tpublic static $sys_config = null;\n\tpublic static $plugin_config = null;\n\tpublic static $request = null;\n\tpublic static $passed = false;\n    public static $_panel  = 'BsCore/pages/panel.php';\n    \n     public static function getNS(): string\n    {\n        return __NAMESPACE__;\n    }\n    \n    public static function activate()\n    {\n        /* \n         *\n         *  初始化路由和方法\n         *\n         */\n        bsRouter::initRouter();\n        Helper::addPanel(0, self::$_panel, 'BearSimple主题扩展控制', 'BearSimple主题扩展控制面板', 'administrator');\n        if(get_option('bearsimple')['goLinkOpen'] == true){\n        //外链转内链钩子\n        Helper::addRoute('go', '/go/[key]/', 'TypechoPlugin\\BsCore\\Action', 'bsshortlink');\n        \\Typecho\\Plugin::factory('Widget_Abstract_Contents')->contentEx_12 = [__CLASS__, 'replace'];\n        \\Typecho\\Plugin::factory('Widget_Abstract_Contents')->excerptEx_12 = [__CLASS__, 'replace'];\n        }\n        \\Typecho\\Plugin::factory('index.php')->begin = [__CLASS__, 'initevent'];\n        \\Typecho\\Plugin::factory('admin/header.php')->header_999 = [__CLASS__, 'enqueue_style'];\n        \\Typecho\\Plugin::factory('admin/footer.php')->end_999 = [__CLASS__, 'enqueue_script'];\n         if(get_option('bearsimple')['Cache'] == true && !empty(get_option('bearsimple')['Cache_choose']) && get_option('bearsimple')['Cache_choose'] !== '1'){\n        //缓存功能钩子\n        Helper::addRoute('clean-cache', '/clean-cache', 'TypechoPlugin\\BsCore\\Action', 'clean_cache');\n\t\t\\Typecho\\Plugin::factory('index.php')->begin = array(__CLASS__, 'C');\n\t\t\\Typecho\\Plugin::factory('index.php')->end = array(__CLASS__, 'S');\n        \\Typecho\\Plugin::factory('Widget_Contents_Post_Edit')->finishPublish = [__CLASS__, 'post_update'];\n        \\Typecho\\Plugin::factory('Widget_Contents_Page_Edit')->finishPublish = [__CLASS__, 'post_update'];\n        \\Typecho\\Plugin::factory('Widget_Contents_Post_Edit')->delete = [__CLASS__, 'post_del_update'];\n        \\Typecho\\Plugin::factory('Widget_Contents_Page_Edit')->delete = [__CLASS__, 'post_del_update'];\n        \\Typecho\\Plugin::factory('Widget_Feedback')->finishComment_1 = [__CLASS__, 'comment_update'];\n\t\t\\Typecho\\Plugin::factory('Widget_Comments_Edit')->finishDelete = [__CLASS__, 'comment_update2'];\n\t\t\\Typecho\\Plugin::factory('Widget_Comments_Edit')->finishEdit = [__CLASS__, 'comment_update2'];\n\t\t\\Typecho\\Plugin::factory('Widget_Comments_Edit')->finishComment = [__CLASS__, 'comment_update2'];\n        \\Typecho\\Plugin::factory('Widget_Abstract_Contents')->contentEx = [__CLASS__, 'cache_contentEx'];\n        \\Typecho\\Plugin::factory('BsCache.Widget_Cache')->getCache = [__CLASS__, 'BsCache_getCache'];\n        \\Typecho\\Plugin::factory('BsCache.Widget_Cache')->setCache = [__CLASS__, 'BsCache_setCache'];\n         }\n         if(get_option('bearsimple')['Cache'] == true && !empty(get_option('bearsimple')['Cache_choose']) && get_option('bearsimple')['Cache_choose'] == '1'){\n         \\Typecho\\Plugin::factory('index.php')->begin = [__CLASS__, 'getCache_file'];\n        \\Typecho\\Plugin::factory('index.php')->end = [__CLASS__, 'setCache_file'];\n         }\n        if(get_option('bearsimple')['Editors'] == '2'){\n        \\Typecho\\Plugin::factory('admin/write-post.php')->bottom_1000 =  [__CLASS__,'btbutton'];\n        \\Typecho\\Plugin::factory('admin/write-page.php')->bottom_1000 = [__CLASS__, 'btbutton'];\n        }\n        else{\n        \\Typecho\\Plugin::factory('admin/write-post.php')->richEditor_1000 = [__CLASS__, 'Editor'];\n        \\Typecho\\Plugin::factory('admin/write-page.php')->richEditor_1000 = [__CLASS__, 'Editor'];\n        }\n        \\Typecho\\Plugin::factory('Widget_Feedback')->comment = [__CLASS__, 'filter'];\n        \\Typecho\\Plugin::factory('Widget_Feedback')->finishComment_134 = [__CLASS__, 'filter2'];\n          if(get_option('bearsimple')['Sticky'] == true){\n        //文章置顶\n        \\Typecho\\Plugin::factory('Widget_Archive')->indexHandle =  [__CLASS__, 'sticky'];\n\t\t\\Typecho\\Plugin::factory('Widget_Archive')->categoryHandle =[__CLASS__, 'stickyC'];\n          }\n          if(get_option('bearsimple')['seo_push'] == true){\n          \\Typecho\\Plugin::factory('Widget_Contents_Post_Edit')->finishPublish = [__CLASS__, 'seo_publishpush'];\n          }\n          //LskyPro\n          if(get_option('bearsimple')['bucket_choose'] == '8'){\n\\Typecho\\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'lsky_uploadHandle'];\n   \\Typecho\\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'lsky_modifyHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'lsky_deleteHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'lsky_attachmentHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'lsky_attachmentDataHandle'];\n        }\n        //腾讯云COS\n        if(get_option('bearsimple')['bucket_choose'] == '2'){\n\\Typecho\\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'uploadHandle'];\n   \\Typecho\\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'modifyHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'deleteHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'attachmentHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'attachmentDataHandle'];\n    \\Typecho\\Plugin::factory('Widget_Archive')->beforeRender = [__CLASS__, 'Widget_Archive_beforeRender'];\n        }\n        //阿里云COS\n        if(get_option('bearsimple')['bucket_choose'] == '3'){\n\\Typecho\\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'ali_uploadHandle'];\n   \\Typecho\\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'ali_modifyHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'ali_deleteHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'ali_attachmentHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'ali_attachmentDataHandle'];\n        }\n        //七牛云Kodo\n        if(get_option('bearsimple')['bucket_choose'] == '4'){\n\\Typecho\\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'qiniu_uploadHandle'];\n   \\Typecho\\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'qiniu_modifyHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'qiniu_deleteHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'qiniu_attachmentHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'qiniu_attachmentDataHandle'];\n        }\n        //又拍云USS\n        if(get_option('bearsimple')['bucket_choose'] == '5'){\n\\Typecho\\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'upyun_uploadHandle'];\n   \\Typecho\\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'upyun_modifyHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'upyun_deleteHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'upyun_attachmentHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'upyun_attachmentDataHandle'];\n        }\n        //华为云OBS\n        if(get_option('bearsimple')['bucket_choose'] == '7'){\n\\Typecho\\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'hw_uploadHandle'];\n   \\Typecho\\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'hw_modifyHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'hw_deleteHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'hw_attachmentHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'hw_attachmentDataHandle'];\n        }\n        //百度云BOS\n        if(get_option('bearsimple')['bucket_choose'] == '6'){\n\\Typecho\\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'bd_uploadHandle'];\n   \\Typecho\\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'bd_modifyHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'bd_deleteHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'bd_attachmentHandle'];\n    \\Typecho\\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'bd_attachmentDataHandle'];\n        }\n        //代码高亮\n        \\Typecho\\Plugin::factory('Widget_Archive')->header = [__CLASS__, 'headlink'];\n       \\Typecho\\Plugin::factory('Widget_Archive')->footer = [__CLASS__, 'footlink'];\n       //登陆验证逻辑\n       //\\Typecho\\Plugin::factory('admin/header.php')->header_1081 = [__CLASS__, 'loginverify'];\n         //邮件\n         if(get_option('bearsimple')['CommentNotify__Open'] == true && get_option('bearsimple')['Smtp_open'] == true){\n         \\Typecho\\Plugin::factory('Widget_Feedback')->finishComment_28654 = [__CLASS__,'parseComment'];\n        \\Typecho\\Plugin::factory('Widget_Comments_Edit')->finishComment_25674 = [__CLASS__,'parseComment'];\n        \\Typecho\\Plugin::factory('Widget_Comments_Edit')->mark_25544 = [__CLASS__,'parseCommentMark'];\n         }\n         if(get_option('bearsimple')['Smtp_open'] == true){\n         Helper::addAction(self::$action, 'TypechoPlugin\\BsCore\\Action');\n         }\n         if(get_option('bearsimple')['Comment_private'] == true){\n         \\Typecho\\Plugin::factory('Widget_Abstract_Comments')->contentEx = [__CLASS__,'secretComment'];\n         }\n         if(get_option('bearsimple')['Cate_Encrypt_open'] == true && get_option('bearsimple')['Cate_Encrypt_hide'] == false){\n         \\Typecho\\Plugin::factory('Widget_Archive')->indexHandle_133 = [__CLASS__,'CateFilter'];\n         }\n         //当腾讯云COS存储未开启时且Tinypng压缩开启\n         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'){\n        \\Typecho\\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__,'tinypng_uploadHandle'];\n         }\n         if(get_option('bearsimple')['Tinypng_open'] == true){\n        \\Typecho\\Plugin::factory('admin/write-post.php')->bottom = [__CLASS__,'tinypng_bottom'];\n         }\n         \\Typecho\\Plugin::factory('admin/write-post.php')->bottom_99 = [__CLASS__,'tags_bottom'];\n         //当开启用户中心功能\n         if(get_option('bearsimple')['UserCenterOpen'] == true){\n         \\Typecho\\Plugin::factory('Widget_Register')->register_99 = [__CLASS__,'bregister'];   \n         \\Typecho\\Plugin::factory('Widget_Register')->finishRegister_99 = [__CLASS__,'bregister_finish'];   \n         }\n         \\Typecho\\Plugin::factory('Widget_Abstract_Contents')->markdown = [__CLASS__, 'markdownparse'];\n         \\Typecho\\Plugin::factory('Widget_Archive')->beforeRender_siteMaintenance_15613 = [__CLASS__, 'siteMaintenance'];\n        \\CSF::activateEvent();\n        \n        /* \n         *\n         *  检测数据库并插入数据库表\n         *\n         */\n         \n         $db = \\Typecho\\Db::get();\n          $prefix = $db->getPrefix();\n         $table = $db->getPrefix() . 'bscore_friendlinks';\n         $table2 = $db->getPrefix() . 'bscore_sign_data';\n         $table3 = $db->getPrefix() . 'bscore_notify_data';\n         $table4 = $db->getPrefix() . 'bscore_says_data';\n         $table5 = $db->getPrefix() . 'bscore_memos_agree_data';\n    $adapter = $db->getAdapterName();\n        if (\"Pdo_SQLite\" === $adapter || \"SQLite\" === $adapter) {\n            //友链表检测初始化\n            $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   friendname TEXT,\n\t\t\t   friendurl TEXT,\n\t\t\t   friendpic TEXT,\n\t\t\t   frienddec TEXT,\n\t\t\t   contactmail TEXT,\n\t\t\t   status TEXT)\");\n\t\t\t   //用户中心签到表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table2 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   signuid TEXT,\n\t\t\t   signtime TEXT,\n\t\t\t   signcoin TEXT)\");\n\t\t\t   //用户中心通知表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table3 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   notifyuid TEXT,\n\t\t\t   notifytime TEXT,\n\t\t\t   notifytitle TEXT,\n\t\t\t   notifytext TEXT)\");\n\t\t\t   //用户中心动态表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table4 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   saysuid TEXT,\n\t\t\t   saystime TEXT,\n\t\t\t   saystext TEXT,\n\t\t\t   saysprivate TEXT,\n\t\t\t   sayslike TEXT DEFAULT 0)\");\n\t\t\t   //memos点赞表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table5 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   memosid  TEXT,\n\t\t\t   agree TEXT)\");\n\n\t\t\t   if (!array_key_exists('coins', $db->fetchRow($db->select()->from('table.users')))) {\n$db->query('ALTER TABLE ' . $prefix . 'users ADD coins TEXT NOT NULL  DEFAULT 0;');\n}\nif (!array_key_exists('submission', $db->fetchRow($db->select()->from('table.users')))) {\n$db->query('ALTER TABLE ' . $prefix . 'users ADD submission TEXT NOT NULL  DEFAULT true;');\n}\nif (!array_key_exists('signature', $db->fetchRow($db->select()->from('table.users')))) {\n$db->query('ALTER TABLE ' . $prefix . 'users ADD signature TEXT NOT NULL  DEFAULT 0;');\n}\n\nif (strpos($db->fetchAll($db->query(\"select sql from sqlite_master where type = 'table' and name = '\" . $table . \"'\"))[0]['sql'], 'checkurl') == false) {\n            $db->query('ALTER TABLE ' . $prefix . 'bscore_friendlinks ADD checkurl TEXT NOT NULL DEFAULT 0;');\n        }\nif (strpos($db->fetchAll($db->query(\"select sql from sqlite_master where type = 'table' and name = '\" . $table . \"'\"))[0]['sql'], 'type') == false) {\n            $db->query('ALTER TABLE ' . $prefix . 'bscore_friendlinks ADD type TEXT NOT NULL DEFAULT 0;');\n        }\nif (strpos($db->fetchAll($db->query(\"select sql from sqlite_master where type = 'table' and name = '\" . $table . \"'\"))[0]['sql'], 'rejectreason') == false) {\n            $db->query('ALTER TABLE ' . $prefix . 'bscore_friendlinks ADD rejectreason TEXT NULL DEFAULT NULL;');\n        }\n        }\n        \n        \n         if(\"pgsql\" === $adapter || \"Pdo_Pgsql\" === $adapter){\n            //友链表检测初始化\n            $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   friendname TEXT,\n\t\t\t   friendurl TEXT,\n\t\t\t   friendpic TEXT,\n\t\t\t   frienddec TEXT,\n\t\t\t   contactmail TEXT,\n\t\t\t   checkurl TEXT NOT NULL DEFAULT 0,\n\t\t\t   type TEXT NOT NULL DEFAULT 0,\n\t\t\t   rejectreason TEXT NULL DEFAULT NULL,\n\t\t\t   status TEXT)\");\n\t\t\t   //用户中心签到表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table2 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   signuid TEXT,\n\t\t\t   signtime TEXT,\n\t\t\t   signcoin TEXT)\");\n\t\t\t   //用户中心通知表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table3 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   notifyuid TEXT,\n\t\t\t   notifytime TEXT,\n\t\t\t   notifytitle TEXT,\n\t\t\t   notifytext TEXT)\");\n\t\t\t   //用户中心动态表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table4 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   saysuid TEXT,\n\t\t\t   saystime TEXT,\n\t\t\t   saystext TEXT,\n\t\t\t   saysprivate TEXT,\n\t\t\t   sayslike TEXT DEFAULT 0)\");\n\t\t\t   //memos点赞表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table5 . \" (\n\t\t\t   id INTEGER PRIMARY KEY,\n\t\t\t   memosid  TEXT,\n\t\t\t   agree TEXT)\");\n\n\t\t\t   if (!array_key_exists('coins', $db->fetchRow($db->select()->from('table.users')))) {\n$db->query('ALTER TABLE ' . $prefix . 'users ADD coins TEXT NOT NULL  DEFAULT 0;');\n}\nif (!array_key_exists('submission', $db->fetchRow($db->select()->from('table.users')))) {\n$db->query('ALTER TABLE ' . $prefix . 'users ADD submission TEXT NOT NULL  DEFAULT true;');\n}\nif (!array_key_exists('signature', $db->fetchRow($db->select()->from('table.users')))) {\n$db->query('ALTER TABLE ' . $prefix . 'users ADD signature TEXT NOT NULL  DEFAULT 0;');\n}\n\n\n        \n        \n        \n        }\n        \n        \n        \n        if (\"Pdo_Mysql\" === $adapter || \"Mysql\" === $adapter || \"Mysqli\" === $adapter) {\n            $dbConfig = null;\n            if (class_exists('\\Typecho\\Db')) {\n                $dbConfig = $db->getConfig($db::READ);\n            } else {\n                $dbConfig = $db->getConfig()[0];\n            }\n            $charset = $dbConfig->charset;\n            $db->query(\"CREATE TABLE IF NOT EXISTS \" . $table . \" (\n\t\t\t\t  `id` int(8) NOT NULL AUTO_INCREMENT,\n\t\t\t\t  `friendname` varchar(1000) NOT NULL,\n\t\t\t      `friendurl` varchar(1000) NOT NULL,\n\t\t\t      `friendpic` varchar(1000) NOT NULL,\n\t\t\t      `frienddec` varchar(1000) NOT NULL,\n\t\t\t      `contactmail` varchar(1000) DEFAULT NULL,\n\t\t\t      `status` varchar(1000) NOT NULL,\n\t\t\t\t  PRIMARY KEY (`id`)\n\t\t\t\t) DEFAULT CHARSET=$charset AUTO_INCREMENT=1\");\n\t\t\t\t\n\t\t\t$db->query(\" CREATE TABLE IF NOT EXISTS \" . $table2 . \" (\n\t\t\t   `id` int(8) NOT NULL AUTO_INCREMENT,\n\t\t\t   `signuid` varchar(1000) NOT NULL,\n\t\t\t   `signtime` varchar(1000) NOT NULL,\n\t\t\t   `signcoin` varchar(1000) NOT NULL,\n\t\t\t  PRIMARY KEY (`id`)\n\t\t\t\t) DEFAULT CHARSET=$charset AUTO_INCREMENT=1\");\n\t\t\t\t\n\t\t\t$db->query(\" CREATE TABLE IF NOT EXISTS \" . $table3 . \" (\n\t\t\t   `id` int(8) NOT NULL AUTO_INCREMENT,\n\t\t\t   `notifyuid` varchar(1000) NOT NULL,\n\t\t\t   `notifytime` varchar(1000) NOT NULL,\n\t\t\t   `notifytitle` varchar(1000) NOT NULL,\n\t\t\t   `notifytext` varchar(1000) NOT NULL,\n\t\t\t  PRIMARY KEY (`id`)\n\t\t\t\t) DEFAULT CHARSET=$charset AUTO_INCREMENT=1\");\n\t\t\t\t\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table4 . \" (\n\t\t\t   `id` int(8) NOT NULL AUTO_INCREMENT,\n\t\t\t   `saysuid` varchar(1000) NOT NULL,\n\t\t\t   `saystime`  varchar(1000) NOT NULL,\n\t\t\t   `saystext`  varchar(1000) NOT NULL,\n\t\t\t   `saysprivate`  varchar(1000) NOT NULL,\n\t\t\t   `sayslike`  varchar(1000) NOT NULL DEFAULT 0,\n\t\t\t  PRIMARY KEY (`id`)\n\t\t\t\t) DEFAULT CHARSET=$charset AUTO_INCREMENT=1\");\n\t\t\t\t\n\t\t\t\t//memos点赞表检测初始化\n\t\t\t   $db->query(\" CREATE TABLE IF NOT EXISTS \" . $table5 . \" (\n\t\t\t   `id` int(10) NOT NULL AUTO_INCREMENT,\n\t\t\t   `memosid`  varchar(150) NOT NULL,\n\t\t\t   `agree`  varchar(1000) NOT NULL,\n\t\t\t  PRIMARY KEY (`id`)\n\t\t\t\t) DEFAULT CHARSET=$charset AUTO_INCREMENT=1\");\n\t\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tif(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'){\n            $db->query('ALTER TABLE '.$table.' ADD `contactmail` varchar(1000) DEFAULT null;');\n        }\n        if (!array_key_exists('coins', $db->fetchRow($db->select()->from('table.users')))) {\n$db->query('ALTER TABLE `' . $prefix . 'users` ADD `coins` varchar(1000) NOT NULL  DEFAULT 0;');\n}\nif (!array_key_exists('submission', $db->fetchRow($db->select()->from('table.users')))) {\n$db->query('ALTER TABLE `' . $prefix . 'users` ADD `submission` varchar(1000) NOT NULL  DEFAULT true;');\n}\nif (!array_key_exists('signature', $db->fetchRow($db->select()->from('table.users')))) {\n$db->query('ALTER TABLE `' . $prefix . 'users` ADD `signature` varchar(1000) NOT NULL  DEFAULT 0;');\n}\n\n\n\nif(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'){\n            $db->query('ALTER TABLE ' . $table . '  ADD `checkurl` varchar(1000) NOT NULL  DEFAULT 0;');\n        }\nif(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'){\n            $db->query('ALTER TABLE ' . $table . '  ADD `type` varchar(1000) NOT NULL  DEFAULT 0;');\n        }\nif(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'){\n            $db->query('ALTER TABLE ' . $table . '  ADD `rejectreason` varchar(1000) NULL DEFAULT NULL;');\n        }\n        }\n     \n        \n        \n         return _t('BsCore核心同步完成');\n    }\n\n    public static function deactivate()\n    {\n        bsRouter::removeRouter();\n        Helper::removePanel(0, self::$_panel);\n        Helper::removeAction('upload');\n        return _t('BsCore核心清除完成');\n    }\n    \n    \n   \n\n    public static function initevent()\n    {\n        if (!class_exists('bsOptions')){\n            require_once \\Utils\\Helper::options()->pluginDir('BsCore').'/bsOptions.php';\n        }\n    }\n    public static function send_request($url, $postdata,$sendtype,$header = 'Content-type: application/x-www-form-urlencoded') {\n     if($postdata){\n         if(is_array($postdata)){\n    $data = http_build_query($postdata);\n         }\n         else{\n           $data = $postdata;\n         }\n    $options    = array(\n        'http' => array(\n            'method'  => $sendtype,\n            'header'  => $header,\n            'content' => $data,\n            'timeout' => 5\n        )\n    );\n     }\n     else{\n     $options    = array(\n        'http' => array(\n            'method'  => $sendtype,\n            'header'  => \"Content-type: application/x-www-form-urlencoded\",\n            'timeout' => 5\n        )\n    );    \n     }\n    $context = stream_context_create($options);\n    $result    = file_get_contents($url, false, $context);\n    if($http_response_header[0] !== 'HTTP/1.1 200 OK'){\n        $result = array(\n            \"result\" => \"success\",\n            \"reason\" => \"request fail\"\n        );\n        return json_encode($result);\n    }else{\n        return $result;\n    }\n}\n\n    public static function enqueue_style($header=null, $old=null)\n    {\n        \\Typecho\\Widget::widget('Widget_User')->to($user);\n        if(\\Typecho\\Cookie::get('__typecho_notice_highlight') && \\Typecho\\Cookie::get('__typecho_notice_highlight') == 'plugin-BsCore'){\n        \\Typecho\\Cookie::delete('__typecho_notice_type');\n        \\Typecho\\Cookie::delete('__typecho_notice');\n        }\n        $options = get_option('bearsimple');\n        if($user->hasLogin() && !$user->pass('administrator', true) && $options['UserCenterRedirect'] == true){\n        header('Location: '.Helper::options()->siteUrl.'/index.php/usercenter', true, 302);\n        }\n        if ($old!=null) $header = $old;\n        return CSF::get_enqueue_style($header);\n    }\n\n    public static function enqueue_script($footer=null)\n    {\n        return CSF::get_enqueue_script($footer);\n    }\n\n    public static function config(Form $form)\n    {\n\n    }\n\n    public static function personalConfig(Form $form)\n    {\n    }\n    \n    \n\n public static function configHandle($origin_config, $is_init)\n    {\n        return true;\n    }\n\n public static function siteMaintenance(){\n        $options = bsOptions::getInstance()::get_option('bearsimple');\n        \\Typecho\\Widget::widget('Widget_User')->to($user);\n        if($options['siteMaintenance_Open'] == true && (!$user->hasLogin() && !$user->pass('administrator', true))){\n            if(!$options['siteMaintenance_templates']){\n                $tem = 'default.html';\n            }\n            else{\n                $tem = $options['siteMaintenance_templates'];\n            }\n        $content =  file_get_contents(str_replace(\"/plugins\",\"\",dirname(__DIR__)).'/themes/bearsimple/modules/siteMaintenance/'.$tem);\n        echo $content;\n        exit;\n        }\n    }\n    \n public static function bCore_parseMultilineData($str, $columnCount)\n    {\n        $result = array();\n        if (!empty($str)) {\n            $data = explode(\"\\n\", $str);\n            foreach ($data as $item) {\n                $item = trim($item);\n                if (!empty($item)) {\n                    $itemData = explode('|', $item, $columnCount);\n                    if (count($itemData) == $columnCount) {\n                        foreach ($itemData as $k => $v) {\n                            $itemData[$k] = trim($v);\n                        }\n                        $result[] = $itemData;\n                    }\n                }\n            }\n        }\n        return $result;\n    }\n public static function bCore_seacharr_by_value($array, $index, $value){\n    if(is_array($array) && count($array)>0) {\n        foreach(array_keys($array) as $key){\n            $temp[$key] = $array[$key][$index];\n            if ($temp[$key] == $value){\n                $newarray[$key] = $array[$key];\n            }\n        }\n    }\n    return $newarray;\n}\npublic static function bCore_getDiyLinkToArray($data){\n    $res = array();\nforeach($data as $k=>$v){\n    $res[]= array(\n        'url' => $v[1],\n        'key'=>$v[0]\n        );\n        \n}\nreturn $res;\n }\n//获取自定义内链\npublic static function bCore_getDiyLink($key){\n    $options = bsOptions::getInstance()::get_option('bearsimple');\n    $data = self::bCore_parseMultilineData($options['goLinkList'],2);\n    $result = self::bCore_seacharr_by_value(self::bCore_getDiyLinkToArray($data),'key',$key);\n    $res = array();\nforeach($result as $k=>$v){\n   foreach ($v as $key=>$value) {\n      $res[$key] = $value;\n   }\n}\n    return $res;\n}\n\npublic static function markdownparse($text)\n    {\n$parser = new \\HyperDown\\Parser();\nreturn $parser->makeHtml($text);\n        \n        \n    }\n public static function bregister($v) {\n  $hasher = new PasswordHash(8, true);\n  if(\\Typecho\\Widget::widget('Widget_Register')->request->password !== ''){\n    $generatedPassword = \\Typecho\\Widget::widget('Widget_Register')->request->password;\n  }else{\n    $generatedPassword = \\Typecho\\Common::randString(7);\n  }\n  define('getpassd', (string)$generatedPassword);\n  $wPassword = $hasher->HashPassword((string)$generatedPassword);\n  $v['password']=$wPassword;\n  if(\\Typecho\\Widget::widget('Widget_Register')->request->regtype == 'nobackend'){\n  $v['group']='contributor';\n  $v['submission']=1;\n  }\n  else{\n   $v['submission']=0;   \n  }\n  return $v;\n}   \n\npublic static function bregister_finish($obj) {\n $wPassword=getpassd;\n \\Typecho\\Widget::widget('Widget_User')->to($user);\n $user->login($obj->request->name,$wPassword);\n \\Typecho\\Cookie::delete('__typecho_first_run');\n \\Typecho\\Cookie::delete('__typecho_remember_name');\n \\Typecho\\Cookie::delete('__typecho_remember_mail');\n $obj->widget('Widget_Notice')->set(_t('用户 <strong>%s</strong> 已经成功注册, 密码为 <strong>%s</strong>', $obj->screenName, $wPassword), 'success');\n if (NULL != $obj->request->referer) {\n $obj->response->redirect($obj->request->referer);\n }else if(NULL != $obj->request->tz){\n   if (Helper::options()->rewrite==0){$authorurl=Helper::options()->rootUrl.'/index.php/usercenter/';}else{$authorurl=Helper::options()->rootUrl.'/usercenter/';}\n  $obj->response->redirect($authorurl.$obj->user->uid);\n }else{\n $obj->response->redirect(Helper::options()->adminUrl);\n }\n}\n //外链转内链\n public static function replace($text, $widget, $lastResult)\n    {\n        $text = empty($lastResult) ? $text : $lastResult;\n        $options = get_option('bearsimple');\n        \n        $target = '';\n        if($options['Pjax'] == 1){\n            $target .= ' pjax=\"no\"';\n        }\n        if($options['goLinkNewWindow'] == 1){\n            $target .= ' target=\"_blank\"';\n        }\n            $fields = unserialize($widget->fields);\n            // 文章内容和评论内容处理\n            @preg_match_all('/<a(.*?)href=\"(?!#)(.*?)\"(.*?)>/', $text, $matches);\n            if ($matches) {\n                foreach ($matches[2] as $link) {\n                    $link = str_replace('mailto:','',$link);\n                    if (!filter_var($link, FILTER_VALIDATE_EMAIL)) {\n                    $text = str_replace(\"href=\\\"$link\\\"\", \"href=\\\"\" . self::convertLinks($link) . \"\\\"\" . $target, $text);\n                    }\n                    \n                \n                }\n            }\n        return $text;\n    }\n public static function urlSafeB64Encodes($str)\n    {\n        $data = base64_encode($str);\n        return str_replace(array('+', '/', '='), array('-', '_', ''), $data);\n    }\npublic static function urlSafeB64Decodes($str)\n    {\n        $data = str_replace(array('-', '_'), array('+', '/'), $str);\n        $mod = strlen($data) % 4;\n        if ($mod) {\n            $data .= substr('====', $mod);\n        }\n        return base64_decode($data);\n    }\n  public static function textareaToArrs($textarea)\n    {\n        $str = str_replace(array(\"\\r\\n\", \"\\r\", \"\\n\"), \"|\", $textarea);\n        if ($str == \"\") {\n            return null;\n        }\n\n        return explode(\"|\", $str);\n    }\n public static function checkDomains($url, $arr)\n    {\n        if ($arr === null) {\n            return false;\n        }\n\n        if (count($arr) === 0) {\n            return false;\n        }\n\n        foreach ($arr as $a) {\n            if (strpos($url, $a) !== false) {\n                return true;\n            }\n        }\n        return false;\n    }\n public static function convertLinks($link, $check = true)\n    {\n        $options = get_option('bearsimple');\n        $linkBase = ltrim(rtrim(\\Typecho\\Router::get('go')['url'], '/'), '/'); // 防止链接形式修改后不能用\n        $siteUrl = Helper::options()->siteUrl;\n        $nonConvertList = self::textareaToArrs($options['goLinkNonConvertList']); // 不转换列表\n        if ($check) {\n            if (strpos($link, '://') !== false && strpos($link, rtrim($siteUrl, '/')) !== false) {\n                return $link;\n            }\n            // 本站链接不处理 不转换列表中的不处理\n            if (self::checkDomains($link, $nonConvertList)) {\n                return $link;\n            }\n\n            // 图片不处理\n            if (preg_match('/\\.(jpg|jepg|png|ico|bmp|gif|tiff)/i', $link)) {\n                return $link;\n            }\n        }\n        return \\Typecho\\Common::url(str_replace('[key]', self::urlSafeB64Encodes(htmlspecialchars_decode($link)), $linkBase), Helper::options()->index);\n    }\n    \n  //取出所有加密分类mid并剔除重复值\npublic static function getCols($arr, $col)\n    {\n        $ret = array();\n        foreach ($arr as $row)\n        {\n            if (isset($row[$col])) {\n                $ret[] = $row[$col];\n            }\n        }\n        \n        return array_unique($ret);\n    }\n    \n//加密的分类排列\npublic static function EncryptCategory(){\n    $options = get_option('bearsimple');\n    $data = $options['Cate_Encrypt'];\n    $res = self::getCols($data, 'Cate_Encrypt_Id');\n    return $res;\n}\n\n  public static function CateFilter($thisx, $select) {\n    \\Typecho\\Widget::widget('Widget_User')->to($user);\n    $mid = self::EncryptCategory();\n    $db = \\Typecho\\Db::get();\n    \n    if(empty($mid) || $user->hasLogin()) return $select;\n    \n    $encryptedMids = array_map('intval', (array)$mid);\n    $encryptedMids = array_filter(array_unique($encryptedMids));\n    \n    if(empty($encryptedMids)) return $select;\n    \n    $midList = implode(',', $encryptedMids);\n\n    $prefix = $db->getPrefix();\n    $select = $select->join(\n        $prefix.'relationships AS filter_rel', // 指定别名\n        \"filter_rel.cid = {$prefix}contents.cid AND filter_rel.mid IN ($midList)\", \n        'LEFT'\n    );\n    \n    $select->where('filter_rel.cid IS NULL');\n    return $select;\n}\n   // 置顶\n   public static function sticky($archive, $select)\n    {\n        $config  = get_option('bearsimple');\n        if(!empty($config['Sticky_cids'])&&!empty($config['Sticky_cids_pages'])){\n        $sticky_cids = array_merge($config['Sticky_cids'],$config['Sticky_cids_pages']);\n        }\n        if(!empty($config['Sticky_cids'])&&empty($config['Sticky_cids_pages'])){\n        $sticky_cids = $config['Sticky_cids'];\n        }\n        if(empty($config['Sticky_cids'])&&!empty($config['Sticky_cids_pages'])){\n        $sticky_cids = $config['Sticky_cids_pages'];\n        }\n        if (!$sticky_cids) return;\n\n        $pagesize = Helper::options()->pageSize;\n        $db = \\Typecho\\Db::get();\n        $paded = $archive->request->get('page', 1);\n$sticky_html = $config['Sticky_Mod'] ? $config['Sticky_Mod'] : \"<span style='color:red'>[置顶] </span>\";\n        foreach($sticky_cids as $cid) {\n          if ($cid && $sticky_post = $db->fetchRow($archive->select()->where('cid = ?', $cid))) {\n              if ($paded == 1) {                \n                $sticky_post['title'] = $sticky_post['title'];\n                $sticky_post['sticky'] = $sticky_html;\n                $archive->push($sticky_post); \n                //$pagesize = $pagesize - 1;\n              }\n              $select->where('table.contents.cid != ?', $cid);\n              if ($pagesize > 0) { \n              $archive->parameter->pageSize = $pagesize;\n              }\n          }\n        }\n    }\n    \n\tpublic static function stickyC($archive, $select)\n\t{\n\t\t$config  = get_option('bearsimple');\n        $sticky_cid = $config['Sticky_cids_category'];\n        if (!$sticky_cid) return;\n\n        $pagesize = Helper::options()->pageSize;\n        $db = \\Typecho\\Db::get();\n        $paded = $archive->request->get('page', 1);\n$sticky_html = $config['Sticky_Mod'] ? $config['Sticky_Mod'] : \"<span style='color:red'>[置顶] </span>\";\n        foreach($sticky_cid as $cid) {\n          $sticky_post = $db->fetchRow($archive->select()->where('cid = ?', $cid));\n          if ($config['Sticky_Category']) {             \n          \t    $archive->widget('Widget_Archive@'.$cid, 'pageSize=1&type=post', 'cid='.$cid)->to($slug);\n      \t        $pattern = preg_match(\"/\".$slug->category.\"/i\", $_SERVER['PHP_SELF']);\n          }else {\n          \t    $pattern = true;\n          }\n      \t        \n          if ($cid && $sticky_post && $pattern) {\n              if ($paded == 1) {\n                $sticky_post['title'] = $sticky_post['title'];\n                $sticky_post['sticky'] = $sticky_html;\n                $archive->push($sticky_post);\n                //$pagesize = $pagesize - 1;\n              }\n              $select->where('table.contents.cid != ?', $cid);\n              if ($pagesize > 0) {\n              $archive->parameter->pageSize = $pagesize;\n              }\n          }\n\n        }\n\t}\n     public function setField(string $name, string $type, string $value, int $cid)\n    {\n        $db = \\Typecho\\Db::get();\n        if (\n            empty($name)\n            || !in_array($type, ['str', 'int', 'float'])\n        ) {\n            return false;\n        }\n\n        $exist = $db->fetchRow($db->select('cid')->from('table.fields')\n            ->where('cid = ? AND name = ?', $cid, $name));\n\n        if (empty($exist)) {\n            return $db->query($db->insert('table.fields')\n                ->rows([\n                    'cid'         => $cid,\n                    'name'        => $name,\n                    'type'        => $type,\n                    'str_value'   => 'str' == $type ? $value : null,\n                    'int_value'   => 'int' == $type ? intval($value) : 0,\n                    'float_value' => 'float' == $type ? floatval($value) : 0\n                ]));\n        } else {\n            return $db->query($db->update('table.fields')\n                ->rows([\n                    'type'        => $type,\n                    'str_value'   => 'str' == $type ? $value : null,\n                    'int_value'   => 'int' == $type ? intval($value) : 0,\n                    'float_value' => 'float' == $type ? floatval($value) : 0\n                ])\n                ->where('cid = ? AND name = ?', $cid, $name));\n        }\n    }\n    public static function C()\n    {\n        self::initEnv();\n        $op = Helper::options();\n        $scheme = parse_url($op->siteUrl)['scheme'];\n        $host = parse_url($op->siteUrl)['host'];\n        $ip = gethostbyname($_SERVER['HTTP_HOST']);\n        if (self::$plugin_config->enable_gcache == '0')\n            return ;\n        if (self::$plugin_config->Cache_choose == '0')\n            return;\n        if (!self::preCheck()) return;\n\n        if (!self::initPath()) return;\n        try {\n            $data = self::getCache();\n            if (!empty($data)) {\n                if ($data['time'] + self::$plugin_config->expire < time())\n                    self::$passed = false;\n               //处理可能存在开启缓存后域名被替换为IP地址的问题\n               $html = $data['html'];\n               $html = str_replace('https://'.$ip,$op->siteUrl,$html);\n               $html = str_replace('http://'.$ip,$op->siteUrl,$html);\n               $html = str_replace('http//','',$html);\n               $html = str_replace('https//','',$html);\n               $html = str_replace(':443/','',$html);\n               $html = str_replace('http://'.$host.'/',$op->siteUrl,$html);\n               $html = str_replace('https://'.$host.'/',$op->siteUrl,$html);\n               $html = str_replace($op->siteUrl.'/',$op->siteUrl,$html);\n               $html = str_replace($_SERVER['SERVER_ADDR'],$_SERVER['SERVER_NAME'],$html);\n               header('BsCache: HIT');\n         echo $html;\n                die;\n            }\n        } catch (Exception $e) {\n            echo $e->getMessage();\n        }\n        ob_flush();\n    }\n\n    public static function S($html = '')\n    {\n        if (self::$plugin_config->Cache_choose == '0')\n            return;\n        if (is_null(self::$path) || !self::$passed)\n            return;\n        if (empty($html))\n            $html = ob_get_contents();\n        $data = array();\n        $data['time'] = time();\n        $data['html'] = $html;\n        self::setCache($data);\n    }\n\n    public static function getCache($name = null)\n    {\n        if ($name) return unserialize(self::$cache->get($name));\n        return unserialize(self::$cache->get(self::$path));\n    }\n\n    public static function setCache($data, $name = null)\n    {\n        if ($name) return self::$cache->set($name, serialize($data));\n        return self::$cache->set(self::$path, serialize($data));\n    }\n\n    public static function delCache($path, $rmHome = True)\n    {\n        self::$cache->delete($path);\n        if ($rmHome)\n            self::$cache->delete('/');\n    }\n\n    public static function preCheck($checkPost = True)\n    {\n        if ($checkPost && self::$request->isPost()) return false;\n\n        if (self::$plugin_config->login && \\Typecho\\Widget::widget('Widget_User')->hasLogin())\n            return false;\n        if (self::$plugin_config->Cache_choose == '0')\n            return false;\n        self::$passed = true;\n        return true;\n    }\n\n    public static function initEnv()\n    {\n        if (!class_exists('bsOptions')){\n            require_once \\Utils\\Helper::options()->pluginDir('BsCore').'/bsOptions.php';\n        }\n        if (is_null(self::$sys_config))\n            self::$sys_config = bsOptions::getInstance();\n        if (is_null(self::$plugin_config))\n            self::$plugin_config = (Object)self::$sys_config::get_option('bearsimple');\n        if (is_null(self::$request))\n            self::$request = new \\Typecho\\Request();\n    }\n\n    public static function initPath($pathInfo='')\n    {\n\n        if(empty($pathInfo))\n            $pathInfo = self::$request->getPathInfo();\n        if (!self::needCache($pathInfo)){\n            return false;\n        }\n\n        self::$path = $pathInfo;\n        return self::initBackend(self::$plugin_config->Cache_choose);\n    }\n\n    public static function initBackend($backend){\n        if ($backend == '0') return false;\n        $options = get_option('bearsimple');\n        $class_name = \"typecho_\".$options['Cache_choose'];\n        require_once 'modules/cache/cache.interface.php';\n        require_once \"modules/cache/$class_name.class.php\";\n        self::$cache = call_user_func(array($class_name, 'getInstance'), self::$plugin_config);\n        if (is_null(self::$cache))\n            return false;\n        return true;\n    }\n\n    public static function needCache($path)\n    {\n        $pattern = '#^' . __TYPECHO_ADMIN_DIR__ . '#i';\n        if (preg_match($pattern, $path)) return false;\n        $pattern = '#^/action#i';\n        if (preg_match($pattern, $path)) return false;\n        $requestUrl = self::$request->getRequestUri();\n        $pattern = '/.*?s=.*/i';\n        if (preg_match($pattern, $requestUrl)) return false;\n        $pattern = '#^/search#i';\n        if (preg_match($pattern, $path) and in_array('search', self::$plugin_config->cache_page)) return true;\n        $_routable = Helper::options()->routingTable;\n        $post_regx = $_routable[0]['post']['regx'];\n        if (array_key_exists('TePass', \\Typecho\\Plugin::export()['activated'])){\n        if (preg_match($post_regx,$path,$arr)){\n            if ($arr[1] and !empty($arr[1])){\n                $db = \\Typecho\\Db::get();\n                try {\n\t\t    $database = $db->getConfig($db::READ)['database'];\n                    $tepass_exist = $db->fetchRow($db->select()->from('information_schema.TABLES')->where('TABLE_NAME = ?',$db->getPrefix().'tepass_posts')->where('TABLE_SCHEMA = ?',$database));\n                    if (isset($tepass_exist) and count($tepass_exist) > 0){\n                          $p_id = $db->fetchObject($db->select('id')->from('table.tepass_posts')->where('post_id = ?',$arr[1]))->id;\n                          if ($p_id) return false;\n                    }\n\n                }catch (Typecho_Db_Query_Exception $e){\n                    \n                }\n\n            } \n        }\n}\n\n\n        foreach ($_routable as $page => $route) {\n            if ($route[0]['widget'] != '\\Widget\\Archive' and $route[0]['widget'] != 'Widget_Archive') continue;\n            $regx = Router::get($page);\n            if (preg_match($regx['regx'], $path)) {\n                $exclude = array('_year', '_month', '_day', '_page');\n                $page = str_replace($exclude, '', $page);\n\n                if (in_array($page, get_option('bearsimple')['cache_page']))\n                    return true;\n            }\n        }\n        return false;\n    }\n\n    public static function post_update($contents, $class)\n    {\n        if ('publish' != $contents['visibility'] || $contents['created'] > time())\n            return;\n\n        self::initEnv();\n        if (self::$plugin_config->Cache_choose == '0')\n            return;\n        self::$passed = true;\n\n        $type = $contents['type'];\n        $routeExists = (NULL != \\Typecho\\Router::get($type));\n        if (!$routeExists) {\n            self::initPath('#');\n            self::delCache(self::$path);\n            return;\n        }\n\n        $db = \\Typecho\\Db::get();\n        $contents['cid'] = $class->cid;\n        $contents['categories'] = $db->fetchAll($db->select()->from('table.metas')\n            ->join('table.relationships', 'table.relationships.mid = table.metas.mid')\n            ->where('table.relationships.cid = ?', $contents['cid'])\n            ->where('table.metas.type = ?', 'category')\n            ->order('table.metas.order', \\Typecho\\Db::SORT_ASC));\n        $contents['category'] = urlencode(current(\\Typecho\\Common::arrayFlatten($contents['categories'], 'slug')));\n        $contents['slug'] = urlencode(empty($contents['slug'])?$class->slug:$contents['slug']);\n        $contents['date'] = new \\Typecho\\Date($contents['created']);\n        $contents['year'] = $contents['date']->year;\n        $contents['month'] = $contents['date']->month;\n        $contents['day'] = $contents['date']->day;\n\n        if (!self::initPath(\\Typecho\\Router::url($type, $contents))){\n            return;\n        }\n        self::delCache(self::$path);\n        if ($class->cid)\n            self::delCache(self::getPostMarkCacheName($class->cid));\n    }\n\n    public static function post_del_update($cid, $obj)\n    {\n        if (self::$plugin_config->Cache_choose == '0')\n            return;\n        $db = \\Typecho\\Db::get();\n        $postObject = $db->fetchRow($db->select()\n            ->from('table.contents')->where('cid = ?', $cid));\n        if (!$postObject['cid']){\n            return;\n        }\n        $val = \\Typecho\\Widget::widget('Widget_Abstract_Contents')->push($postObject);\n        $url =  str_replace(Helper::options()->siteUrl, \"\", $val['permalink']);\n        $cacheUrl =  str_replace('index.php', \"\", $url);\n        self::initEnv();\n\n        self::initBackend(self::$plugin_config->Cache_choose);\n        self::delCache($cacheUrl);\n        if ($cid){\n            self::delCache($cacheUrl.'_'.$cid.'_markdown');\n        }\n    }\n\n    public static function comment_update($comment)\n    {\n        if (self::$plugin_config->Cache_choose == '0')\n            return;\n        self::initEnv();\n        if (!self::preCheck(false)) return;\n        if (!self::initBackend(self::$plugin_config->Cache_choose))\n            return;\n        $path_info = self::$request->getPathInfo();\n        $article_url = preg_replace('/\\/comment$/i','',$path_info);\n\n        self::delCache($article_url);\n        if ($comment->cid)\n            self::delCache(self::getPostMarkCacheName($comment->cid));\n    }\n\n    public static function comment_update2($comment, $edit)\n    {\n        if (self::$plugin_config->Cache_choose == '0')\n            return;\n        self::initEnv();\n        self::preCheck(false);\n        self::initBackend(self::$plugin_config->Cache_choose);\n        $perm = stripslashes($edit->parentContent['permalink']);\n        $perm = preg_replace('/(https?):\\/\\//', '', $perm);\n        $perm = preg_replace('/'.$_SERVER['HTTP_HOST'].'/', '', $perm);\n        self::delCache($perm);\n        if ($edit->cid)\n            self::delCache(self::getPostMarkCacheName($edit->cid));\n        if ($comment->cid)\n            self::delCache(self::getPostMarkCacheName($comment->cid));\n    }\n    \n    public static function getPostMarkCacheName($cid){\n        if (!self::$path)\n            self::$path = self::$request->getPathInfo();\n        return self::$path.'_'.$cid.'_markdown';\n    }\n\n    public static function cache_contentEx($content, $obj, $lastResult){\n        if (self::$plugin_config->Cache_choose == '0')\n            return $content;\n        $content = empty( $lastResult ) ? $content : $lastResult;\n        if (self::$plugin_config->enable_markcache == '0'){\n            return $content;\n        }\n        if (substr_count($content,'<!--no-cache-->'))\n            return $content;\n        self::initEnv();\n        self::$path = self::$request->getPathInfo();\n        $cacheName = self::getPostMarkCacheName($obj->cid);\n        self::initEnv();\n        if (!self::preCheck(false)) {\n            return $content;\n        }\n        if (!self::initBackend(self::$plugin_config->Cache_choose)){\n            return $content;\n        }\n        try {\n            $data = self::getCache($cacheName);\n            if (!empty($data)) {\n                if ($data['time'] + self::$plugin_config->expire < time())\n                    self::$passed = false;\n                return $data['html'];\n            }\n        } catch (Exception $e) {\n            return $content;\n        }\n\n        if (is_null(self::$path) || !self::$passed)\n            return $content;\n        $data = array();\n        $data['time'] = time();\n        $data['html'] = $content;\n        self::setCache($data,$cacheName);\n        return $content;\n    }\n\n    public static function BsCache_setCache($cacheKey,$val){\n        self::initEnv();\n        if (!self::preCheck(false)) {\n            return false;\n        }\n        if (!self::initBackend(self::$plugin_config->Cache_choose)){\n            return false;\n        }\n        $data = array();\n        $data['time'] = time();\n        $data['html'] = $val;\n        self::setCache($data,$cacheKey);\n        return true;\n    }\n    \n    public static function BsCache_getCache($cacheKey){\n        self::initEnv();\n        if (!self::preCheck(false)) {\n            return false;\n        }\n        if (!self::initBackend(self::$plugin_config->Cache_choose)){\n            return false;\n        }\n        try{\n            $data = self::getCache($cacheKey);\n            if (!empty($data)) {\n                if ($data['time'] + self::$plugin_config->expire < time())\n                    self::$passed = false;\n                return $data['html'];\n            }\n        } catch (Exception $e) {\n            echo $e->getMessage();\n            return false;\n        }\n        return false;\n    }\n\npublic static function btbutton(){\n     $options = Helper::options();\n    \n        $dir = $options->pluginUrl.'/BsCore/assets/vendors/';\n     if(get_option('bearsimple')['Editors'] == '2'){\n\t\tif (strpos( $_SERVER['REQUEST_URI'],'write-post.php') !== false)\n{\n    $url = 'post';\n\\Typecho\\Widget::widget('Widget_Contents_Post_Edit')->to($post);\n}\nif (strpos( $_SERVER['REQUEST_URI'],'write-page.php') !== false)\n{\n    $url = 'page';\n\\Typecho\\Widget::widget('Widget_Contents_Page_Edit')->to($page);\n}\nif (isset($post) || isset($page)) {\n    $cid = isset($post) ? $post->cid : $page->cid;\n    \n    if ($cid) {\n        \\Typecho\\Widget::widget('Widget_Contents_Attachment_Related', 'parentId=' . $cid)->to($attachment);\n    } else {\n        \\Typecho\\Widget::widget('Widget_Contents_Attachment_Unattached')->to($attachment);\n    }\n}\n\t\t?><style>.wmd-button-row {\n    height: auto;\n}\n</style>\n <?php $fontawesomeUrl = $dir.'fontawesome/font-awesome.min.css?v=1';?>\n<link rel=\"stylesheet\" href=\" <?php echo $fontawesomeUrl; ?>\" />\n<link rel=\"stylesheet\" href=\"<?php echo $options->pluginUrl;?>/BsCore/assets/vendors/sweetalert2/sweetalert2.min.css\" />\n<link href=\"<?php echo $dir;?>sweetalert2/bootstrap-4.css\" rel=\"stylesheet\">\n        <script src=\"<?php echo $options->pluginUrl;?>/BsCore/assets/vendors/sweetalert2/sweetalert2.min.js\"></script>\n<link rel=\"stylesheet\" href=\"<?php echo $options->pluginUrl;?>/BsCore/assets/vendors/bootstrap-colorpicker/bootstrap-colorpicker.min.css\" />\n<script type=\"text/javascript\" src=\"<?php echo $options->pluginUrl;?>/BsCore/assets/vendors/bootstrap-colorpicker/bootstrap-colorpicker.min.js\"></script>\n\n        <link href=\"<?php echo Helper::options()->pluginUrl ?>/BsCore/modules/bs-emoji/bs-emoji.css?v=1\" rel=\"stylesheet\" type=\"text/css\">\n<script src=\"<?php echo Helper::options()->pluginUrl ?>/BsCore/modules/bs-emoji/bs-emoji.js?v=2\"></script>\n<?php if(get_option('bearsimple')['Cache'] == true && (get_option('bearsimple')['Cache_choose'] == 'memcached'||get_option('bearsimple')['Cache_choose'] == 'redis'||get_option('bearsimple')['Cache_choose'] == 'apcu'||get_option('bearsimple')['Cache_choose'] == 'sqlite'||get_option('bearsimple')['Cache_choose'] == 'memory'||get_option('bearsimple')['Cache_choose'] == 'flysystem') &&  get_option('bearsimple')['enable_markcache'] == true): ?>\n<script>\n            $(document).ready(function(){\n                $('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-TePass-button\" title=\"插入不缓存标签\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-times\"></i></span></li>');\n                if($('#wmd-button-row').length !== 0){\n                    $('#wmd-TePass-button').click(function(){\n                        var rs = \"\\r\\n<!--no-cache-->\\r\\n\";\n                        var myField = $('#text')[0];\n                        insertAtCursor(myField,rs);\n                    })\n                }\n                function insertAtCursor(myField, myValue) {\n                    if (document.selection) {\n                        myField.focus();\n                        sel = document.selection.createRange();\n                        sel.text = myValue;\n                        sel.select();\n                    }\n                    else if (myField.selectionStart || myField.selectionStart === '0') {\n                        var startPos = myField.selectionStart;\n                        var endPos = myField.selectionEnd;\n                        var restoreTop = myField.scrollTop;\n                        myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length);\n                        if (restoreTop > 0) {myField.scrollTop = restoreTop;}\n                        myField.selectionStart = startPos + myValue.length;\n                        myField.selectionEnd = startPos + myValue.length;\n                        myField.focus();\n                    } else {\n                        myField.value += myValue;\n                        myField.focus();\n                    }\n                }\n            });\n        </script>\n        <?php endif; ?>\n        \n       \n<script>\n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-loginkj-button\" title=\"登录后可见\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-user-circle\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-loginkj-button').click(function(){\n\t\t\t\t\t\tvar rs = \"[bslogin]隐藏内容[/bslogin]\";\n\t\t\t\t\t\tloginkj(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction loginkj(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t\n\n\t\t\t});\n</script>\n\t\t<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-hfkj-button\" title=\"回复或登录后可见\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-commenting\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-hfkj-button').click(function(){\n\t\t\t\t\t\tvar rs = \"[bshide]隐藏内容[/bshide]\";\n\t\t\t\t\t\thfkj(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction hfkj(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t\n\n\t\t\t});\n</script>\n\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-todocheck-button\" title=\"打勾已完成\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-check-square\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-todocheck-button').click(function(){\n\t\t\t\t\t\tvar rs = \"[todo-t]Todolist已完成的内容[/todo-t]\";\n\t\t\t\t\t\ttodocheck(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction todocheck(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-todonotcheck-button\" title=\"打叉未完成\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-square\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-todonotcheck-button').click(function(){\n\t\t\t\t\t\tvar rs = \"[todo-f]Todolist待完成的内容[/todo-f]\";\n\t\t\t\t\t\ttodonotcheck(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction todonotcheck(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-codes-button\" title=\"代码高亮\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><svg t=\"1632126906909\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2425\" width=\"16\" height=\"16\"><path d=\"M298.900577 778.338974c-7.070023 7.070023-17.974373 7.070023-25.043373 0L20.039405 524.521175c-7.070023-7.070023-7.070023-17.974373 0-25.043373l253.8178-253.8178c7.070023-7.070023 17.974373-7.070023 25.043373 0l27.242458 27.242458c7.070023 7.070023 7.070023 17.974373 0 25.043373L112.089891 512l214.053144 214.053144c7.070023 7.070023 7.070023 17.974373 0 25.043373L298.900577 778.338974zM444.87316 873.098151c-2.726088 9.269108-12.522198 14.702863-21.24486 11.995195l-33.767058-9.269108c-9.250688-2.726088-14.702863-12.522198-11.976776-21.790282l203.148793-703.132108c2.726088-9.269108 12.522198-14.702863 21.24486-11.995195l33.767058 9.269108c9.250688 2.726088 14.702863 12.522198 11.976776 21.790282L444.87316 873.098151zM752.049215 778.338974c-7.070023 7.070023-17.974373 7.070023-25.043373 0l-27.242458-27.242458c-7.070023-7.070023-7.070023-17.974373 0-25.043373l214.053144-214.053144L699.763384 297.946856c-7.070023-7.070023-7.070023-17.974373 0-25.043373l27.242458-27.242458c7.070023-7.070023 17.974373-7.070023 25.043373 0l253.8178 253.8178c7.070023 7.070023 7.070023 17.974373 0 25.043373L752.049215 778.338974z\" p-id=\"2426\" fill=\"#707070\"></path></svg></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-codes-button').click(function(){\n\t\t\t\t\t\tvar rs = \"```编程语言\\n这里是内容\\n```\";\n\t\t\t\t\t\tcodes(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction codes(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-fontcolor-button\" title=\"字体颜色\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-font\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-fontcolor-button').click(function(){\n\t\t\t\t\t\tSwal.fire({\n  title: '字体颜色选择器面板',\n  html: \"<div id=\\\"color\\\"></div><br>选择完颜色后点击下面的直接插入按钮进行应用，本功能实现的效果仅在前台文章内页可见。\",\n  icon: 'info',\nshowCancelButton: true,\n  confirmButtonColor: '#3085d6',\n  cancelButtonColor: '#d33',\n  cancelButtonText: \"取消\", \n  confirmButtonText: '直接插入'\n}).then((result) => {\n  if (result.isConfirmed) {\n  var colorss = document.getElementById(\"colors\").value;\n  if(!colorss){\n      alert('未选择颜色，不能直接插入!');\n  }\n  else{\n    fontcolor('{bs-font color=\"'+ colorss + '\"}内容{/bs-font}');\n  }\n  }\n})\n       $('#color').colorpicker({\n        popover: false,\n        inline: true,\n        container: '#color',\ntemplate: '<div class=\"colorpicker\">' +\n          '<div class=\"colorpicker-saturation\"><i class=\"colorpicker-guide\"></i></div>' +\n          '<div class=\"colorpicker-hue\"><i class=\"colorpicker-guide\"></i></div>' +\n          '<div class=\"colorpicker-alpha\">' +\n          '   <div class=\"colorpicker-alpha-color\"></div>' +\n          '   <i class=\"colorpicker-guide\"></i>' +\n          '</div>' +\n          '<div class=\"colorpicker-bar\">' +\n          '   <div class=\"input-group\">' +\n          '       <input id=\"colors\" class=\"form-control input-block color-io\" />' +\n          '   </div>' +\n          '</div>' +\n          '</div>'\n        })\n        .on('colorpickerCreate', function (e) {\n          var io = e.colorpicker.element.find('.color-io');\n          io.val(e.color.string());\n          io.on('change keyup', function () {\n            e.colorpicker.setValue(io.val());\n          });\n        })\n        .on('colorpickerChange', function (e) {\n          var io = e.colorpicker.element.find('.color-io');\n          if (e.value === io.val() || !e.color || !e.color.isValid()) {\n            return;\n          }\n          io.val(e.color.string());\n        });\n\t\t\t\t\t\t\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction fontcolor(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-iframe-button\" title=\"插入iframe\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-window-maximize\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-iframe-button').click(function(){\n\t\t\t\t\t\tvar rs = \"{bs-iframe}iframe地址{/bs-iframe}\";\n\t\t\t\t\t\tiframe(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction iframe(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-bframe-button\" title=\"插入Bframe\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-external-link-square\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-bframe-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bsfra image=\"占位封面图直链\" url=\"页面地址\"]';\n\t\t\t\t\t\tbframe(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction bframe(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-audio-button\" title=\"插入音频\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-file-audio-o\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-audio-button').click(function(){\n\t\t\t\t\t\tvar rs = \"[bsaudio]音频地址[/bsaudio]\";\n\t\t\t\t\t\taudio(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction audio(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-musiclist-button\" title=\"插入音乐歌单\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-music\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-musiclist-button').click(function(){\n\t\t\t\t\t\tvar rs = \"[bsmusic]网易云音乐歌单ID[/bsmusic]\";\n\t\t\t\t\t\tmusiclist(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction musiclist(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-star-button\" title=\"插入评星\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-star-half-o\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-star-button').click(function(){\n\t\t\t\t\t\tSwal.fire({\n  title: '第一步 选择评星样式',\n  input: 'select',\n  inputOptions: {\n      'star': '星星',\n      'heart': '红心',\n  },\n  inputPlaceholder: '选择一款样式',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valueone) => {\n    return new Promise((resolve) => {\n      if (valueone !== '') {\n\n                Swal.fire({\n  title: '第二步 输入评星数目',\n  input: 'number',\ninputLabel: '输入评星数目，最高五颗星',\ninputAttributes:{\n  min:1,\n  max:5,\n  \n},\n  inputPlaceholder: '输入评星数目',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '插入',\n  inputValidator: (valuetwo) => {\n    return new Promise((resolve) => {\n      if (valuetwo !== '') {\nvar text = '[bseva type=\"'+valueone+'\"]'+valuetwo+'[/bseva]';\n      star(text);\n        \n        resolve() \n      } \n      else{\n         resolve('您必须输入评星数目~~') \n      }\n    })\n  }\n})\n\n        \n    \n        resolve() \n      } \n      else{\n         resolve('您必须选择一款评星样式~~') \n      }\n    })\n  }\n})\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction star(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-accord1-button\" title=\"插入线性手风琴\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-plus-square\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-accord1-button').click(function(){\n\t\t\t\t\t\tvar rs = \"{bs-accord style=line title=线性手风琴标题}线性手风琴内容{/bs-accord}\";\n\t\t\t\t\t\taccord1(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction accord1(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-accord2-button\" title=\"插入普通手风琴\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-plus-square-o\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-accord2-button').click(function(){\n\t\t\t\t\t\tvar rs = \"{bs-accord style=common title=普通手风琴标题}普通手风琴内容{/bs-accord}\";\n\t\t\t\t\t\taccord2(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction accord2(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-message-button\" title=\"插入提示框\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-sticky-note-o\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-message-button').click(function(){\n\t\t\t\t\t\tSwal.fire({\n  title: '第一步 选择提示框样式',\n  input: 'select',\n  inputOptions: {\n      'common': '普通提示框',\n      'basic': '阴影提示框',\n      'commonclose': '普通可关闭提示框',\n      'basicclose':'阴影可关闭提示框',\n  },\n  inputPlaceholder: '选择一款提示框',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valueone) => {\n    return new Promise((resolve) => {\n      if (valueone !== '') {\n\n                Swal.fire({\n  title: '第二步 选择提示框颜色',\n  input: 'select',\n  inputOptions: {\n      'standard': '淡色',\n      'info':'淡青色',\n      'primary': '蓝色',\n      'secondary': '黑色',\n      'red': '红色',\n      'orange': '橙色',\n      'yellow': '黄色',\n      'olive': '淡绿色',\n      'green': '深绿色',\n      'teal': '青色',\n      'violet': '紫罗兰色',\n      'purple': '基佬紫色',\n      'pink': '粉色',\n      'brown': '土黄色',\n      'grey': '灰色',\n  },\n  inputPlaceholder: '选择一款颜色',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuetwo) => {\n    return new Promise((resolve) => {\n      if (valuetwo !== '') {\n        \n        \n\n  Swal.fire({\n      title: '第三步 填写提示框标题',\n  input: 'text',\n  inputLabel: '提示框标题',\n  inputPlaceholder: '填写提示框标题',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuethree) => {\n    return new Promise((resolve) => {\n      if (valuethree !== '') {\n        \n        \n        Swal.fire({\n  title: '第四步 填写提示框内容',\n  input: 'textarea',\n  inputLabel: '提示框内容',\n  inputPlaceholder: '请填写提示框内容',\n  showCancelButton: true,\n  cancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuefour) => {\n    if (!valuefour) {\n      return '您必须填写提示框内容'\n    }\n    else{\n        \n        \n        \n        Swal.fire({\n  title: '第五步 填写提示框图标名',\n  input: 'text',\n  inputLabel: '提示框图标名(若不需要图标可留空)',\n  'html':'<a href=\"https://bs-icon.typecho.ru/\" target=\"_blank\">图标获取请戳这里</a>',\n  inputPlaceholder: '请填写提示框图标名',\n  showCancelButton: true,\n  cancelButtonText: \"取消\", \n  confirmButtonText: '插入',\n  inputValidator: (valuefive) => {\n      if(!valuefive){\n          var icon = '';\n      }\n      else{\n          var icon = ' icon=\"'+valuefive+'\"';\n      }\n      var text = '[bsmessage type=\"'+valueone+'\" color=\"'+valuetwo+'\" title=\"'+valuethree+'\"'+icon+']'+valuefour+'[/bsmessage]';\n      message(text);\n    resolve()\n  }\n})\n        \n        \n        \n        resolve()\n    }\n  }\n})\n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须填写提示框标题~~') \n      }\n    })\n  }\n})\n\n        \n        \n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须选择一款颜色~~') \n      }\n    })\n  }\n})\n\n        \n        \n        \n        \n        \n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须选择一款提示框~~') \n      }\n    })\n  }\n})\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction message(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-button-button\" title=\"插入按钮\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-circle-o-notch\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-button-button').click(function(){\n\t\t\t\t\t\tSwal.fire({\n  title: '第一步 选择按钮样式',\n  input: 'select',\n  inputOptions: {\n      'common': '普通按钮',\n      'basic': '光圈按钮',\n      'animated': '动画按钮',\n  },\n  inputPlaceholder: '选择一款按钮',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valueone) => {\n    return new Promise((resolve) => {\n      if (valueone !== '') {\n\n                Swal.fire({\n  title: '第二步 选择按钮颜色',\n  input: 'select',\n  inputOptions: {\n      'standard': '淡色',\n      'primary': '蓝色',\n      'secondary': '黑色',\n      'red': '红色',\n      'orange': '橙色',\n      'yellow': '黄色',\n      'olive': '淡绿色',\n      'green': '深绿色',\n      'teal': '青色',\n      'violet': '紫罗兰色',\n      'purple': '基佬紫色',\n      'pink': '粉色',\n      'brown': '土黄色',\n      'grey': '灰色',\n  },\n  inputPlaceholder: '选择一款颜色',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuetwo) => {\n    return new Promise((resolve) => {\n      if (valuetwo !== '') {\n        \n        \n\n  Swal.fire({\n      title: '第三步 填写按钮点击链接',\n  input: 'url',\n  inputLabel: '按钮点击跳转链接',\n  inputPlaceholder: '填写按钮点击跳转链接，需带http(s)://',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuethree) => {\n    return new Promise((resolve) => {\n      if (valuethree !== '') {\n        \n        \n        Swal.fire({\n  title: '第四步 填写按钮名称',\n  input: 'text',\n  inputLabel: '按钮名称(若为动画按钮，两个名称请使用|隔开)',\n  inputPlaceholder: '请填写按钮名称',\n  showCancelButton: true,\n  cancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuefour) => {\n    if (!valuefour) {\n      return '您必须填写按钮名称'\n    }\n    else{\n        \n        \n        \n        Swal.fire({\n  title: '第五步 填写按钮图标名',\n  input: 'text',\n  inputLabel: '按钮图标名(若不需要图标可留空)',\n  'html':'<a href=\"https://bs-icon.typecho.ru/\" target=\"_blank\">图标获取请戳这里</a>',\n  inputPlaceholder: '请填写按钮图标名',\n  showCancelButton: true,\n  cancelButtonText: \"取消\", \n  confirmButtonText: '插入',\n  inputValidator: (valuefive) => {\n      if(!valuefive){\n          var icon = '';\n      }\n      else{\n          var icon = ' icon=\"'+valuefive+'\"';\n      }\n      var text = '[bsbtn type=\"'+valueone+'\" color=\"'+valuetwo+'\" url=\"'+valuethree+'\"'+icon+']'+valuefour+'[/bsbtn]';\n      button(text);\n    resolve()\n  }\n})\n        \n        \n        \n        resolve()\n    }\n  }\n})\n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须填写跳转链接~~') \n      }\n    })\n  }\n})\n\n        \n        \n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须选择一款颜色~~') \n      }\n    })\n  }\n})\n\n        \n        \n        \n        \n        \n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须选择一款按钮~~') \n      }\n    })\n  }\n})\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction button(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n <script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-progress-button\" title=\"插入进度条\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-product-hunt\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t    $('#wmd-progress-button').click(function(){\n\t\t\t\t    Swal.fire({\n  title: '选择进度条颜色',\n  input: 'select',\n  inputOptions: {\n      'normal':'蓝色',\n      'secondary': '黑色',\n      'default': '灰色',\n      'warning': '黄色',\n      'success': '绿色',\n      'info': '天蓝色',\n      'warning': '黄色',\n      'danger': '红色'\n  },\n  inputPlaceholder: '选择一款颜色',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valueone) => {\n    return new Promise((resolve) => {\n      if (valueone !== '') {\n      \n      Swal.fire({\n      title: '第二步 填写进度条标题',\n  input: 'text',\n  inputLabel: '进度条标题[将显示在进度条上方]',\n  inputPlaceholder: '填写进度条标题',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuetwo) => {\n    return new Promise((resolve) => {\n      if (valuetwo !== '') {\n             Swal.fire({\n      title: '第三步 填写进度条数值',\n  input: 'text',\n  inputLabel: '进度条数值[如40%就填写40]',\n  inputPlaceholder: '填写进度条数值',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '插入',\n  inputValidator: (valuethree) => {\n    return new Promise((resolve) => {\n      if (valuethree !== '') {\n                var text = '[bsprog color=\"'+valueone+'\" number=\"'+valuethree+'\"]'+valuetwo+'[/bsprog]';\n      progress(text);\n    resolve()\n      }\n      else{\n       resolve('您必须填写进度条数值~')    \n      }\n    })\n  }\n})\n    resolve()\n      }\n      else{\n       resolve('您必须填写进度条标题~')    \n      }\n    })\n  }\n})\n      \n      \n      \n      \n      } \n      else{\n         resolve('您必须选择一款颜色~') \n      }\n    })\n  }\n})\n\n\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction progress(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-fujian-button\" title=\"插入所有附件\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-paperclip\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-fujian-button').click(function(){\n                 function getData() {\n                    $.ajax({\n                        type: \"GET\",\n                        url: \"<?php getAttachFile(); ?>\",\n                        data: {\n                            \"cid\": \"<?php echo $cid; ?>\",\n                             \"url\": \"<?php echo $url; ?>\",\n                        },\n                        dateType: \"json\",\n                        success: function(json) {\n                            json = JSON.parse(json);\n                            content(json.list);\n                        },\n                        complete: function() {\n                        },\n                        error: function() {\n                            alert(\"数据获取错误\");\n                        }\n                    });\n                }\n                getData();\n                function content(list) {\n                    var filename = \" \";\n                    var fileurl = \" \";\n                    for(var i in list) {\n                        if(list[i]['type'] == 'img'){\n                        filename += '![' + list[i]['title'] + '][' + list[i]['cid'] + ']\\n'\nfileurl += '\\n  [' + list[i]['cid'] + ']:' + list[i]['url']\n}\n                        if(list[i]['type'] == 'other'){\n                        filename += '[' + list[i]['title'] + '][' + list[i]['cid'] + ']\\n'\nfileurl += '\\n  [' + list[i]['cid'] + ']:' + list[i]['url']\n}\n}\nfujian(filename + fileurl);\n}\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction fujian(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-bscardgithub-button\" title=\"Github仓库\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-github\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-bscardgithub-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bsgit user=\"Github仓库拥有者，如whitebearcode\"]Github项目名，如typecho-bearsimple[/bsgit]';\n\t\t\t\t\t\tgithubcard(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction githubcard(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-gallery-button\" title=\"相册\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-file-image-o\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-gallery-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bsgallery title=\"相册名\"]\\n[bsimg title=\"图片标题1\"]图片地址1[/bsimg]\\n[bsimg title=\"图片标题2\"]图片地址2[/bsimg]\\n[bsimg title=\"图片标题3\"]图片地址3[/bsimg]\\n[/bsgallery]';\n\t\t\t\t\t\tgallery(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction gallery(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-time-button\" title=\"时间计划\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-microchip\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-time-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bstimes title=\"时间计划名，必填!\"]\\n[bstime time=\"时间\"]计划内容[/bstime]\\n[bstime time=\"时间2\"]计划内容2[/bstime]\\n[bstime time=\"时间3\"]计划内容3[/bstime]\\n[/bstimes]';\n\t\t\t\t\t\ttime(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction time(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-quotepost-button\" title=\"引用文章\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-newspaper-o\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-quotepost-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bspost cid=\"文章CID\"]';\n\t\t\t\t\t\tquotepost(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction quotepost(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-postmark-button\" title=\"标注文字\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-bookmark-o\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-postmark-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bsmark]要标注的内容[/bsmark]';\n\t\t\t\t\t\tpostmark(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction postmark(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-postruby-button\" title=\"文字带拼音\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-file-word-o\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-postruby-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bsruby]要带拼音的汉字[/bsruby]';\n\t\t\t\t\t\tpostruby(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction postruby(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-everydaypaper-button\" title=\"每日60s早报\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-calendar-o\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-everydaypaper-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bspaper image=\"true\"]';\n\t\t\t\t\t\teverydaypaper(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction everydaypaper(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-emoji-button\" title=\"表情\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-paw\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-emoji-button').click(function(){\n\t\t\t\t\t    Swal.fire({\n  title: '表情面板',\n  html: '<button id=\\\"emoji\\\" class=\"swal2-confirm swal2-styled\">点击显示表情面板</button><br><div id=\"emoemo\"></div><br>Tips:点击表情后将直接插入到文章中',\n  icon: 'info',\nshowCancelButton: false,\nshowConfirmButton: false,\n\n});\n\t\t$('#emoji').BearsimpleEmoji($('#text'));\n\t\t$.fn.insertText = function(text){\n\t\t    Swal.close();\n\t\t\tvar rs = text+' ';\n\t\t\t\t\t\temoji(rs);     \n\t\t\treturn this;\n\t\t}\n\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction emoji(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-mermaid-button\" title=\"流程图\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-random\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-mermaid-button').click(function(){\n\t\t\t\t\t\tvar rs = '```mermaid\\nMermaid内容\\n```';\n\t\t\t\t\t\tmermaid(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction mermaid(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-mindmap-button\" title=\"思维导图\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-map-signs\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-mindmap-button').click(function(){\n\t\t\t\t\t\tvar rs = '```mermaid\\nmindmap\\n思维导图内容\\n```';\n\t\t\t\t\t\tmindmap(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction mindmap(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-dateprogress-button\" title=\"插入倒计时进度条\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-calendar\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t    $('#wmd-dateprogress-button').click(function(){\n\t\t\t\t    Swal.fire({\n  title: '选择倒计时进度条颜色',\n  input: 'select',\n  inputOptions: {\n      'blue':'蓝色',\n      'green': '绿色',\n      'cyan': '青色',\n      'yellow': '黄色',\n      'red': '红色',\n      'orange': '橙色',\n      'black': '黑色',\n  },\n  inputPlaceholder: '选择一款颜色',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valueone) => {\n    return new Promise((resolve) => {\n      if (valueone !== '') {\n      \n      Swal.fire({\n      title: '第二步 填写倒计时进度条标题',\n  input: 'text',\n  inputLabel: '倒计时进度条标题[将显示在倒计时进度条上方]',\n  inputPlaceholder: '填写倒计时进度条标题',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuetwo) => {\n    return new Promise((resolve) => {\n      if (valuetwo !== '') {\n             Swal.fire({\n      title: '第三步 填写倒计时结束日期',\n  input: 'text',\n  inputLabel: '按照年-月-日 时:分:秒来填写，如2022-12-12 22:12:12',\n  inputPlaceholder: '填写倒计时结束日期',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '插入',\n  inputValidator: (valuethree) => {\n    return new Promise((resolve) => {\n      if (valuethree !== '') {\n\n                var text = '[bsdate color=\"'+valueone+'\" end=\"'+valuethree+'\"]'+valuetwo+'[/bsdate]';\n      dateprogress(text);\n    resolve()\n     \n      }\n      else{\n       resolve('您必须填写结束日期~')    \n      }\n    })\n  }\n})\n    resolve()\n      }\n      else{\n       resolve('您必须填写倒计时进度条标题~')    \n      }\n    })\n  }\n})\n      \n      \n      \n      \n      } \n      else{\n         resolve('您必须选择一款颜色~') \n      }\n    })\n  }\n})\n\n\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction dateprogress(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-copytext-button\" title=\"点击复制内容\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-copy\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-copytext-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bscopy text=\"点击所复制的内容文字\"]显示的内容文字[/bscopy]';\n\t\t\t\t\t\tcopytext(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction copytext(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-tag-button\" title=\"文章标签\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-tag\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-tag-button').click(function(){\n\t\t\t\t\t\tvar rs = '[tag]要调用的标签名[/tag]';\n\t\t\t\t\t\ttag(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction tag(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-video-button\" title=\"插入视频\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-video-camera\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-video-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bsplayer url=\"视频文件地址\" image=\"视频封面图地址\"]\\n';\n\t\t\t\t\t\tvideo(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction video(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-mp3-button\" title=\"插入mp3音频文件\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-file-sound-o\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-mp3-button').click(function(){\n\t\t\t\t\t\tvar rs = '单首歌曲使用\\n[bsmp3 url=\"音频文件地址\" singer=\"歌手\" name=\"歌曲名\" image=\"歌曲封面图地址\"]\\n多首歌曲使用\\n[bsmp3]\\n[mp3 url=\"音频文件地址\" singer=\"歌手\" name=\"歌曲名\" image=\"歌曲封面图地址\"]\\n[mp3 url=\"音频文件地址\" singer=\"歌手\" name=\"歌曲名\" image=\"歌曲封面图地址\"]\\n[/bsmp3]\\n';\n\t\t\t\t\t\tmp3(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction mp3(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-tabs-button\" title=\"插入标签卡\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-tablet\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-tabs-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bstabs]\\n[bstab name=\"标签1\" active=\"true\"]第一个标签卡的内容[/bstab]\\n[bstab name=\"标签2\"]第二个标签卡的内容[/bstab]\\n[/bstabs]\\n';\n\t\t\t\t\t\ttabs(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction tabs(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-textopc-button\" title=\"插入文字显隐\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-shower\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-textopc-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bsopc]需要显隐的文字内容[/bsopc]\\n';\n\t\t\t\t\t\ttextopc(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction textopc(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-texttip-button\" title=\"插入文字提示\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-gittip\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-texttip-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bstip text=\"悬浮提示文字内容\"]显示的文字内容[/bstip]\\n';\n\t\t\t\t\t\ttexttip(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction texttip(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n<script> \n          $(document).ready(function(){\n          \t$('#wmd-button-row').append('<li class=\"wmd-button\" id=\"wmd-textkbd-button\" title=\"插入键盘文本短代码\"><span style=\"background: none;margin-top:5px;font-size: large;text-align: center;color: #999999;font-family: serif;\"><i class=\"fa fa-keyboard-o\"></i></span></li>');\n\t\t\t\tif($('#wmd-button-row').length !== 0){\n\t\t\t\t\t$('#wmd-textkbd-button').click(function(){\n\t\t\t\t\t\tvar rs = '[bskbd style=\"颜色，dark、gray或者white\"]键盘文本内容，如CTRL[/bskbd]\\n';\n\t\t\t\t\t\ttextkbd(rs);\n\t\t\t\t\t})\n\t\t\t\t}\n\n\n\t\t\t\tfunction textkbd(tag) {\n\t\t\t\t\tvar myField;\n\t\t\t\t\tif (document.getElementById('text') && document.getElementById('text').type == 'textarea') {\n\t\t\t\t\t\tmyField = document.getElementById('text');\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (document.selection) {\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tsel = document.selection.createRange();\n\t\t\t\t\t\tsel.text = tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t\telse if (myField.selectionStart || myField.selectionStart == '0') {\n\t\t\t\t\t\tvar startPos = myField.selectionStart;\n\t\t\t\t\t\tvar endPos = myField.selectionEnd;\n\t\t\t\t\t\tvar cursorPos = startPos;\n\t\t\t\t\t\tmyField.value = myField.value.substring(0, startPos)\n\t\t\t\t\t\t+ tag\n\t\t\t\t\t\t+ myField.value.substring(endPos, myField.value.length);\n\t\t\t\t\t\tcursorPos += tag.length;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t\tmyField.selectionStart = cursorPos;\n\t\t\t\t\t\tmyField.selectionEnd = cursorPos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmyField.value += tag;\n\t\t\t\t\t\tmyField.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n</script>\n\n<?php\n}\n}\n\n/**\n     * 插入编辑器\n     */\n     public static function Editor()\n    {\n        $options = Helper::options();\n    \n        $dir = $options->pluginUrl.'/BsCore/assets/vendors/';\n        $cssUrl = $dir.'easymde/easymde.min.css';\n        $jsUrl = $dir.'easymde/easymde.min.js';\n        \n        \n\tif (strpos( $_SERVER['REQUEST_URI'],'write-post.php') !== false)\n{\n    $url = 'post';\n\\Typecho\\Widget::widget('Widget_Contents_Post_Edit')->to($post);\n}\nif (strpos( $_SERVER['REQUEST_URI'],'write-page.php') !== false)\n{\n    $url = 'page';\n\\Typecho\\Widget::widget('Widget_Contents_Page_Edit')->to($page);\n}\n\nif (isset($post) || isset($page)) {\n    $cid = isset($post) ? $post->cid : $page->cid;\n    \n    if ($cid) {\n        \\Typecho\\Widget::widget('Widget_Contents_Attachment_Related', 'parentId=' . $cid)->to($attachment);\n    } else {\n        \\Typecho\\Widget::widget('Widget_Contents_Attachment_Unattached')->to($attachment);\n    }\n}\n\n        ?>\n      <?php $fontawesomeUrl = $dir.'fontawesome/font-awesome.min.css?v=1';?>\n<link rel=\"stylesheet\" href=\" <?php echo $fontawesomeUrl; ?>\" />\n        <link rel=\"stylesheet\" href=\"<?php echo $cssUrl; ?>?v=1\" />\n<link rel=\"stylesheet\" href=\"<?php echo $options->pluginUrl;?>/BsCore/assets/vendors/sweetalert2/sweetalert2.min.css\" />\n        <script type=\"text/javascript\" src=\"<?php echo $jsUrl; ?>?v=1\"></script>\n<link href=\"<?php echo $dir;?>sweetalert2/bootstrap-4.css\" rel=\"stylesheet\">\n        <script src=\"<?php echo $options->pluginUrl;?>/BsCore/assets/vendors/sweetalert2/sweetalert2.min.js\"></script>\n<link rel=\"stylesheet\" href=\"<?php echo $options->pluginUrl;?>/BsCore/assets/vendors/bootstrap-colorpicker/bootstrap-colorpicker.min.css\" />\n<script type=\"text/javascript\" src=\"<?php echo $options->pluginUrl;?>/BsCore/assets/vendors/bootstrap-colorpicker/bootstrap-colorpicker.min.js\"></script>\n\t<link href=\"<?php echo $options->pluginUrl;?>/BsCore/assets/vendors/toastr.js/toastr.min.css\" rel=\"stylesheet\">\n\t<script src=\"<?php echo $options->pluginUrl;?>/BsCore/assets/vendors/toastr.js/toastr.min.js\"></script>\n<script src=\"<?php echo $options->pluginUrl;?>/BsCore/assets/vendors/turndown/turndown.min.js\"></script>\n<style>\n    .editor-statusbar .lines:before{content:'行数: '}\n    .editor-statusbar .words:before{content:'字数: '}\n    .editor-statusbar .lines:after{content:' 行'}\n    .editor-statusbar .words:after{content:' 个字'}\n    .editor-toolbar{\n        background:#2d333b;\n    }\n   .fullscreen{\n       background:#2d333b;\n   }\n    .editor-toolbar i,\n    .editor-toolbar button::after{\n        color:#adbac7;\n    }\n    .editor-toolbar button:hover{\n        background:#444c56;\n    }\n    .editor-toolbar button.active{\n                background:#444c56;\n                \n    }\n    .cm-s-easymde{\n       background:#22272e;\n        color:#adbac7;\n    }\n\n.CodeMirror {\n  --selection-bg: #316dca;\n  --selection-active-bg: #3d8ef7;\n  --selection-text: white;\n}\n\n.CodeMirror-selected {\n  background: var(--selection-bg) !important;\n}\n\n.CodeMirror-selectedtext {\n  color: var(--selection-text) !important;\n}\n\n.CodeMirror-focused .CodeMirror-selected {\n  background: var(--selection-active-bg) !important;\n}\n\n.CodeMirror-selection-secondary {\n  background: #ffd33d !important;\n}\n\n.cm-s-easymde .CodeMirror-selected {\n  background: #80cbc4 !important;\n}\n\n.CodeMirror-cursor {\n  border-left: 2px solid #fff !important; \n}\n\n.CodeMirror-focused .CodeMirror-cursor {\n  border-left-color: #fff !important;\n}\n\n\n</style>\n\n<link href=\"<?php echo Helper::options()->pluginUrl ?>/BsCore/modules/bs-emoji/bs-emoji.css?v=1\" rel=\"stylesheet\" type=\"text/css\">\n<script src=\"<?php echo Helper::options()->pluginUrl ?>/BsCore/modules/bs-emoji/bs-emoji.js?v=2\"></script>\n        <script>\n        \n\n            $(document).ready(function() {\n                     \n                $.fn.autoHeight = function () {\n        function autoHeight(elem) {\n            elem.style.height = 'auto';\n            elem.scrollTop = 0;\n            elem.style.height = elem.scrollHeight + 'px';\n        }\n\n        this.each(function () {\n            autoHeight(this);\n            $(this).on('keyup', function () {\n                autoHeight(this);\n            });\n        });\n    }\n\n  $(\"#excerpt-0-18\").autoHeight();\n                $('#excerpt-0-18').css({'width':'100%'});\n                new EasyMDE({\n        placeholder:'您现在可以开始撰写文章啦~~~',\n        autoDownloadFontAwesome: false,\n        spellChecker:false,\n        nativeSpellcheck:false,\n        sideBySideFullscreen:false,\n        maxHeight:\"400px\",\n        showIcons: ['strikethrough', 'code', 'table', 'redo', 'heading', 'undo', 'heading-bigger', 'heading-smaller', 'heading-1', 'heading-2', 'heading-3', 'clean-block', 'horizontal-rule','side-by-side'],\n        <?php if(bsOptions::getInstance()::get_option( 'bearsimple' )['EditorsAutosave'][0] == '1'):?>\n        autosave: {\n            enabled: true,\n            delay: 1000,\n            uniqueId: 'text',\n            timeFormat:{locale:'zh-CN'},\n            text:'自动保存时间：'\n        },\n        <?php endif; ?>\n        toolbar: [ \n<?php if(get_option('bearsimple')['Cache'] == true && (get_option('bearsimple')['Cache_choose'] == 'memcached'||get_option('bearsimple')['Cache_choose'] == 'redis'||get_option('bearsimple')['Cache_choose'] == 'apcu'||get_option('bearsimple')['Cache_choose'] == 'sqlite'||get_option('bearsimple')['Cache_choose'] == 'memory'||get_option('bearsimple')['Cache_choose'] == 'flysystem') &&  get_option('bearsimple')['enable_markcache'] == true): ?>\n{ name: \"nocache\", className: \"fa fa-ban\", action:nocache,title: \"插入不缓存标签\"},\n<?php endif; ?>\n{ name: \"bold\", action:EasyMDE.toggleBold, className: \"fa fa-bold\",title: \"加粗\"}, \n{ name: \"italic\", action:EasyMDE.toggleItalic, className: \"fa fa-italic\",title: \"字体倾斜\"}, \n{ name: \"strikethrough\", action:EasyMDE.toggleStrikethrough, className: \"fa fa-strikethrough\",title: \"删除线\"},\n{ name: \"heading-smaller\", action:EasyMDE.toggleHeadingSmaller, className: \"fa fa-font\",title: \"字体缩小\"}, \n{ name: \"heading-bigger\", action:EasyMDE.toggleHeadingBigger, className: \"fa fa-font\",title: \"字体放大\"},\n{ name: \"heading-1\", action:EasyMDE.toggleHeading1, className: \"fa fa-header header-1\",title: \"H1字号\"},\n{ name: \"heading-2\", action:EasyMDE.toggleHeading2, className: \"fa fa-header header-2\",title: \"H2字号\"},\n{ name: \"heading-3\", action:EasyMDE.toggleHeading3, className: \"fa fa-header header-3\",title: \"H3字号\"}, \n{ name: \"code\", action:EasyMDE.toggleCodeBlock, className: \"fa fa-code\",title: \"代码\"}, \n{ name: \"quote\", action:EasyMDE.toggleBlockquote, className: \"fa fa-quote-left\",title: \"引用\"}, \n{ name: \"unordered-list\", action:EasyMDE.toggleUnorderedList, className: \"fa fa-list-ul\",title: \"无序列表\"}, \n{ name: \"ordered-list\", action:EasyMDE.toggleOrderedList, className: \"fa fa-list-ol\",title: \"有序列表\"}, \n{ name: \"clean-block\", action:EasyMDE.cleanBlock, className: \"fa fa-eraser\",title: \"擦除代码块\"}, \n{ name: \"link\", action:EasyMDE.drawLink, className: \"fa fa-link\",title: \"插入链接\"}, \n{ name: \"image\", action:EasyMDE.drawImage, className: \"fa fa-picture-o\",title: \"插入图片\"}, \n{ name: \"table\", action:EasyMDE.drawTable, className: \"fa fa-table\",title: \"插入表格\"}, \n{ name: \"color\", className: \"fa fa-tint\", action:colorpc,title: \"字体颜色选择器\"},\n{ name: \"button\", className: \"fa fa-square-o\", action:button,title: \"按钮\"},\n{ name: \"message\", className: \"fa fa-comment-o\", action:message,title: \"提示框\"},\n{ name: \"iframe\", className: \"fa fa-window-restore\", action:iframe,title: \"插入iframe\"},\n{ name: \"bframe\", className: \"fa fa-external-link\", action:bframe,title: \"插入bframe\"},\n{ name: \"audio\", className: \"fa fa-volume-up\", action:audio,title: \"插入音频\"},\n{ name: \"musiclist\", className: \"fa fa-music\", action:musiclist,title: \"插入音乐歌单\"},\n{ name: \"hide\", className: \"fa fa-eye-slash\", action:hide,title: \"回复或登录后可见\"},\n{ name: \"login\", className: \"fa fa-user-secret\", action:login,title: \"登录后可见\"},\n{ name: \"inserts\", className: \"fa fa-paperclip\", action:attachInsertEvent,title: \"插入所有附件\"},\n{ name: \"insertper\", className: \"fa fa-file-o\", action:insertper,title: \"插入单个附件\"},\n{ name: \"copyupload\", className: \"fa fa-clone\", action:copyupload,title: \"复制粘贴上传\"},\n{ name: \"todolist1\", className: \"fa fa-check-square-o\", action:todolist1,title: \"已完成列表\"},\n{ name: \"todolist2\", className: \"fa fa-square-o\", action:todolist2,title: \"未完成列表\"},\n{ name: \"star\", className: \"fa fa-star-half-o\", action:star,title: \"评星\"},\n{ name: \"accord1\", className: \"fa fa-bars\", action:accord1,title: \"线性手风琴\"},\n{ name: \"accord2\", className: \"fa fa-list-alt\", action:accord2,title: \"普通手风琴\"},\n{ name: \"quotepost\", className: \"fa fa-quote-right\", action:quotepost,title: \"引用文章\"},\n{ name: \"postmark\", className: \"fa fa-bookmark\", action:postmark,title: \"标注文字\"},\n{ name: \"postruby\", className: \"fa fa-font\", action:postruby,title: \"文字带拼音\"},\n{ name: \"everydaypaper\", className: \"fa fa-newspaper-o\", action:everydaypaper,title: \"每日60s早报\"},\n{ name: \"emoji\", className: \"fa fa-smile-o\", action:emoji,title: \"表情\"},\n{ name: \"hr\", className: \"fa fa-minus\", action:hr,title: \"分割线\"},\n{ name: \"mermaid\", className: \"fa fa-share-alt\", action:mermaid,title: \"流程图\"},\n{ name: \"mindmap\", className: \"fa fa-sitemap\", action:mindmap,title: \"思维导图\"},\n{ name: \"gallery\", className: \"fa fa-th\", action:gallery,title: \"相册\"},\n{ name: \"time\", className: \"fa fa-clock-o\", action:time,title: \"时间计划\"},\n{ name: \"githubcard\", className: \"fa fa-github\", action:githubcard,title: \"Github仓库\"},\n{ name: \"autosaves\", className: \"fa fa-floppy-o\", action:autosave,title: \"自动保存\"},\n{ name: \"progress\", className: \"fa fa-spinner\", action:progress,title: \"进度条\"},\n{ name: \"dateprogress\", className: \"fa fa-hourglass-half\", action:dateprogress,title: \"倒计时进度条\"},\n{ name: \"copytext\", className: \"fa fa-clipboard\", action:copytext,title: \"点击复制内容\"},\n{ name: \"tag\", className: \"fa fa-tags\", action:tag,title: \"文章标签\"},\n{ name: \"video\", className: \"fa fa-film\", action:video,title: \"插入视频\"},\n{ name: \"mp3\", className: \"fa fa-file-audio-o\", action:mp3,title: \"插入mp3音频文件\"},\n{ name: \"tabs\", className: \"fa fa-folder-o\", action:tabs,title: \"插入标签卡\"},\n{ name: \"textopc\", className: \"fa fa-lightbulb-o\", action:textopc,title: \"插入文字显隐\"},\n{ name: \"texttip\", className: \"fa fa-info-circle\", action:texttip,title: \"插入文字提示\"},\n{ name: \"textkbd\", className: \"fa fa-keyboard-o\", action:textkbd,title: \"插入键盘文本短代码\"}\n],\n        promptURLs:true,\n        promptTexts:{\n            image:\"请填写图片直链\",\n            link:\"请填写网址链接\",\n        },\n        element: document.getElementById('text'),\n    });\n            });\n       function dateprogress(editor){\n           Swal.fire({\n  title: '选择倒计时进度条颜色',\n  input: 'select',\n  inputOptions: {\n      'blue':'蓝色',\n      'green': '绿色',\n      'cyan': '青色',\n      'yellow': '黄色',\n      'red': '红色',\n      'orange': '橙色',\n      'black': '黑色',\n  },\n  inputPlaceholder: '选择一款颜色',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valueone) => {\n    return new Promise((resolve) => {\n      if (valueone !== '') {\n      \n      Swal.fire({\n      title: '第二步 填写倒计时进度条标题',\n  input: 'text',\n  inputLabel: '倒计时进度条标题[将显示在倒计时进度条上方]',\n  inputPlaceholder: '填写倒计时进度条标题',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuetwo) => {\n    return new Promise((resolve) => {\n      if (valuetwo !== '') {\n             Swal.fire({\n      title: '第三步 填写倒计时结束日期',\n  input: 'text',\n  inputLabel: '按照年-月-日 时:分:秒来填写，如2022-12-12 22:12:12',\n  inputPlaceholder: '填写倒计时结束日期',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '插入',\n  inputValidator: (valuethree) => {\n    return new Promise((resolve) => {\n      if (valuethree !== '') {\n\n                var text = '[bsdate color=\"'+valueone+'\" end=\"'+valuethree+'\"]'+valuetwo+'[/bsdate]';\n   editor.codemirror.doc.replaceSelection(text); \n    resolve()\n     \n      }\n      else{\n       resolve('您必须填写结束日期~')    \n      }\n    })\n  }\n})\n    resolve()\n      }\n      else{\n       resolve('您必须填写倒计时进度条标题~')    \n      }\n    })\n  }\n})\n      \n      \n      \n      \n      } \n      else{\n         resolve('您必须选择一款颜色~') \n      }\n    })\n  }\n})\n\n\n\n    \n       }\n      \n       function copyupload(editor){\n $(document).on('paste',function(event){\n                    let defaultValue = editor.codemirror.doc.getValue();\n                        event = event.originalEvent;\n                        var cbd = event.clipboardData;\n                        var ua = window.navigator.userAgent;\n                        var uploadURL = '<?php Helper::security()->index('/action/upload?cid=CID'); ?>';\n                        \n                        if (!(event.clipboardData && event.clipboardData.items)) {\n                            return;\n                        }\n\n                        if (cbd.items && cbd.items.length === 2 && cbd.items[0].kind === \"string\" && cbd.items[1].kind === \"file\" &&\n                            cbd.types && cbd.types.length === 2 && cbd.types[0] === \"text/plain\" && cbd.types[1] === \"Files\" &&\n                            ua.match(/Macintosh/i) && Number(ua.match(/Chrome\\/(\\d{2})/i)[1]) < 49){\n                            return;\n                        }\n\n                        var itemLength = cbd.items.length;\n       \n                        if (itemLength == 0) {\n                            return;\n                        }\n\n                        if (itemLength == 1 && cbd.items[0].kind == 'string') {\n                            return;\n                        }\n\n                        if ((itemLength == 1 && cbd.items[0].kind == 'file')\n                                || itemLength > 1\n                            ) {\n                            for (var i = 0; i < cbd.items.length; i++) {\n                                var item = cbd.items[i];\n\n                                if(item.kind == \"file\") {\n                                    var blob = item.getAsFile();\n                                    if (blob.size === 0) {\n                                        return;\n                                    }\n                                    var ext = blob.name.substring(blob.name.lastIndexOf(\".\")+1);\n                                    var formData = new FormData();\n                                    formData.append('blob', blob, Math.floor(new Date().getTime() / 1000) + '.' + ext);\n                                    var uploadFailText = '文件上传失败(' + blob.name + ')'\n                                    toastr.success('检测到正在复制粘贴图片，熊宝正在努力上传中~~');\n                                    $.ajax({\n                                        method: 'post',\n                                        url: uploadURL.replace('CID', $('input[name=\"cid\"]').val()),\n                                        data: formData,\n                                        contentType: false,\n                                        processData: false,\n                                        success: function(data) {\n                                \n                                            if (data[0]) {\n                                       \n                                                var filehz = data[0].substring(data[0].lastIndexOf(\".\")+1);\n                                                switch(filehz){\n                                                 case 'gif':\n                                                 editor.codemirror.doc.replaceSelection('![](' + data[0] + ')\\n');\n                                                 break;\n                                                 case 'jpg':\n                                                 editor.codemirror.doc.replaceSelection('![](' + data[0] + ')\\n');\n                                                 break;\n                                                 case 'jpeg':\n                                                 editor.codemirror.doc.replaceSelection('![](' + data[0] + ')\\n');\n                                                 break;\n                                                 case 'gif':\n                                                 editor.codemirror.doc.replaceSelection('![](' + data[0] + ')\\n');\n                                                 break;\n                                                 case 'png':\n                                                 editor.codemirror.doc.replaceSelection('![](' + data[0] + ')\\n');\n                                                 break;\n                                                 case 'tiff':\n                                                 editor.codemirror.doc.replaceSelection('![](' + data[0] + ')\\n');\n                                                 break;\n                                                 case 'bmp':\n                                                 editor.codemirror.doc.replaceSelection('![](' + data[0] + ')\\n');\n                                                 break;\n                                                 case 'svg':\n                                                 editor.codemirror.doc.replaceSelection('![](' + data[0] + ')\\n');\n                                                 break;\n                                                 case 'ico':\n                                                 editor.codemirror.doc.replaceSelection('![](' + data[0] + ')\\n');\n                                                 break;\n                                                 default:\n                                                 editor.codemirror.doc.replaceSelection('['+data[1]['cid']+']['+data[1]['cid']+']\\n['+data[1]['cid']+']: ' + data[0]+'\\n');\n                                                }\n                                            \n                                            } else {\n                                               editor.codemirror.doc.replaceSelection(uploadFailText);\n                                            }\n                                         \n                                        },\n                                        error: function() {\n                                            editor.codemirror.doc.replaceSelection(uploadFailText);\n                                        }\n                                    });\n                                }\n                            }\n\n                        }\n\n\t\t\t});\n       }\n       \n              setTimeout(function() {\n                var button = $(\".copyupload\");\n                button.click();\n            }, 2000);\n       \n       \n       \n            \n            function star(editor){\n               Swal.fire({\n  title: '第一步 选择评星样式',\n  input: 'select',\n  inputOptions: {\n      'star': '星星',\n      'heart': '红心',\n  },\n  inputPlaceholder: '选择一款样式',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valueone) => {\n    return new Promise((resolve) => {\n      if (valueone !== '') {\n\n                Swal.fire({\n  title: '第二步 输入评星数目',\n  input: 'number',\ninputLabel: '输入评星数目，最高五颗星',\ninputAttributes:{\n  min:1,\n  max:5,\n  \n},\n  inputPlaceholder: '输入评星数目',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '插入',\n  inputValidator: (valuetwo) => {\n    return new Promise((resolve) => {\n      if (valuetwo !== '') {\nvar text = '[bseva type=\"'+valueone+'\"]'+valuetwo+'[/bseva]';\n      editor.codemirror.doc.replaceSelection(text);\n        \n        resolve() \n      } \n      else{\n         resolve('您必须输入评星数目~~') \n      }\n    })\n  }\n})\n\n        \n    \n        resolve() \n      } \n      else{\n         resolve('您必须选择一款评星样式~~') \n      }\n    })\n  }\n}) \n            }\n            function autosave(editor){\n          <?php if(bsOptions::getInstance()::get_option( 'bearsimple' )['EditorsAutosave'][0] == '11'||bsOptions::getInstance()::get_option( 'bearsimple' )['EditorsAutosave'][1] == '11'):?>\n            //$(\"textarea:eq(1)\").bind(\"input propertychange\", autosaves); //废弃方法\n        setInterval(function(){\n         var submitted = false, form = $('form[name=write_post],form[name=write_page]').submit(function () {\n        submitted = true;\n    }), formAction = form.attr('action'),\n        idInput = $('input[name=cid]'),\n        cid = idInput.val(),\n        draft = $('input[name=draft]'),\n        draftId = draft.length > 0 ? draft.val() : 0,\n        btnSave = $('#btn-save').removeAttr('name').removeAttr('value'),\n        btnSubmit = $('#btn-submit').removeAttr('name').removeAttr('value'),\n        btnPreview = $('#btn-preview'),\n        //doAction = $('<input type=\"hidden\" name=\"do\" value=\"publish\" />').appendTo(form),\n        locked = false,\n        changed = false,\n        autoSave = $('<span id=\"auto-save-message\" class=\"left\"></span>').prependTo('.submit'),\n        lastSaveTime = null;\n        var data = new FormData(form.get(0));\n        data.set(\"text\",editor.value());\n        var localcid = \"<?php echo $cid;?>\";\nif(localcid == '' && localStorage.getItem('autosavecid') && localStorage.getItem('autosavecid') !== ''){\ndata.set(\"cid\",localStorage.getItem('autosavecid'));\n}\nelse{\n    data.set(\"cid\",localcid);\n}\n     \n        function callback(o) {\ntoastr.success('已自动保存<br>保存时间:'+o.time);   \nlocalStorage.setItem('autosavecid',o.cid);\n$('input[name=cid]').val(o.cid);\n        }\n                data.append('do', 'save');\n\n            \n  $.ajax({\n                url: formAction,\n                processData: false,\n                contentType: false,\n                type: 'POST',\n                data: data,\n                success: callback\n            });    \n   },15000); \n   <?php endif; ?>\n}\n            \n                setTimeout(function() {\n                var buttons = $(\".autosaves\");\n                buttons.click();\n            }, 2000);\n            \n\n            setTimeout(function() {\n                var button = $(\".insertper\");\n                button.click();\n            }, 2000);\n        function insertper (editor) {\n        \n  $('#file-list').on('mousedown', '.insert', function(){\n      var s=$(this).parents(\"li\").data('url');\n   if(s.match(/\\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i)){\n        var fileurl=\"![\"+$(this).text()+\"](\"+$(this).parents(\"li\").data('url')+\")\\n\";\n   }\n   else{\n       var fileurl=\"[\"+$(this).text()+\"](\"+$(this).parents(\"li\").data('url')+\")\\n\";\n   }\n                 editor.codemirror.doc.replaceSelection(fileurl); \n});\n    }\n\n             function attachInsertEvent (editor) {\n                 function getData() {\n                    $.ajax({\n                        type: \"GET\",\n                        url: \"<?php getAttachFile(); ?>\",\n                        data: {\n                            \"cid\": \"<?php echo $cid; ?>\",\n                             \"url\": \"<?php echo $url; ?>\",\n                        },\n                        dateType: \"json\",\n                        success: function(json) {\n                            json = JSON.parse(json);\n                            content(json.list);\n                        },\n                        complete: function() {\n                        },\n                        error: function() {\n                            alert(\"数据获取错误\");\n                        }\n                    });\n                }\n                getData();\n                function content(list) {\n                    var filename = \" \";\n                    var fileurl = \" \";\n                    for(var i in list) {\n                        if(list[i]['type'] == 'img'){\n                        fileurl += '![' + list[i]['title'] + ']('+ list[i]['url'] +')\\n'\n}\n                        if(list[i]['type'] == 'other'){\n                        fileurl += '[' + list[i]['title'] + ']('+ list[i]['url'] +')\\n'\n}\n}\neditor.codemirror.doc.replaceSelection(fileurl);\n}\n    }\n    function iframe(editor){\n    editor.codemirror.doc.replaceSelection('{bs-iframe}iframe地址，可为video等{/bs-iframe}'); \n            }\n            function tag(editor){\n    editor.codemirror.doc.replaceSelection('[tag]要调用的标签名[/tag]'); \n            }\n            function everydaypaper(editor){\n    editor.codemirror.doc.replaceSelection('[bspaper image=\"true\"]'); \n            }\n            function mermaid(editor){\n    editor.codemirror.doc.replaceSelection('```mermaid\\nMermaid内容\\n```'); \n            }\n             function video(editor){\n    editor.codemirror.doc.replaceSelection('[bsplayer url=\"视频文件地址\" image=\"视频封面图地址\"]'); \n            }\n            function mp3(editor){\n    editor.codemirror.doc.replaceSelection('单个音频使用\\n[bsmp3 url=\"音频文件地址\" singer=\"歌手\" name=\"歌曲名\" image=\"歌曲封面图地址\"]\\n多个音频使用\\n[bsmp3]\\n[mp3 url=\"音频文件地址\" singer=\"歌手\" name=\"歌曲名\" image=\"歌曲封面图地址\"]\\n[mp3 url=\"音频文件地址\" singer=\"歌手\" name=\"歌曲名\" image=\"歌曲封面图地址\"]\\n[/bsmp3]\\n'); \n            }\n            function tabs(editor){\n    editor.codemirror.doc.replaceSelection('[bstabs]\\n[bstab name=\"标签1\" active=\"true\"]第一个标签卡的内容[/bstab]\\n[bstab name=\"标签2\"]第二个标签卡的内容[/bstab]\\n[/bstabs]\\n'); \n            }\n            function mindmap(editor){\n    editor.codemirror.doc.replaceSelection('```mermaid\\nmindmap\\n思维导图内容\\n```'); \n            }\n            function textopc(editor){\n    editor.codemirror.doc.replaceSelection('[bsopc]需要显隐的文字内容[/bsopc]\\n'); \n            }\n            function texttip(editor){\n    editor.codemirror.doc.replaceSelection('[bstip text=\"悬浮提示文字内容\"]显示的文字内容[/bstip]\\n'); \n            }\n            function textkbd(editor){\n    editor.codemirror.doc.replaceSelection('[bskbd style=\"颜色，dark、gray或者white\"]键盘文本内容，如CTRL[/bskbd]\\n'); \n            }\n            function githubcard(editor){\n    editor.codemirror.doc.replaceSelection('[bsgit user=\"Github仓库拥有者，如whitebearcode\"]Github项目名，如typecho-bearsimple[/bsgit]'); \n            }\n            \n                function hr(editor){\n    editor.codemirror.doc.replaceSelection('----------'); \n            }\n            function copytext(editor){\n    editor.codemirror.doc.replaceSelection('[bscopy text=\"点击所复制的内容文字\"]显示的内容文字[/bscopy]'); \n            }\n            function musiclist(editor){\n    editor.codemirror.doc.replaceSelection('[bsmusic]网易云音乐歌单ID[/bsmusic]'); \n            }\n            function hide(editor){\n    editor.codemirror.doc.replaceSelection('[bshide]隐藏内容[/bshide]'); \n            }\n            function gallery(editor){\n    editor.codemirror.doc.replaceSelection('[bsgallery title=\"相册名\"]\\n[bsimg title=\"图片标题1\"]图片地址1[/bsimg]\\n[bsimg title=\"图片标题2\"]图片地址2[/bsimg]\\n[bsimg title=\"图片标题3\"]图片地址3[/bsimg]\\n[/bsgallery]'); \n            }\n            function time(editor){\n    editor.codemirror.doc.replaceSelection('[bstimes title=\"时间计划名，必填!\"]\\n[bstime time=\"时间\"]计划内容[/bstime]\\n[bstime time=\"时间2\"]计划内容2[/bstime]\\n[bstime time=\"时间3\"]计划内容3[/bstime]\\n[/bstimes]'); \n            }\n            function login(editor){\n    editor.codemirror.doc.replaceSelection('[bslogin]隐藏内容[/bslogin]'); \n            }\n            function nocache(editor){\n    editor.codemirror.doc.replaceSelection(\"\\r\\n<!--no-cache-->\\r\\n\"); \n            }\n            function audio(editor){\n    editor.codemirror.doc.replaceSelection('[bsaudio]音频地址[/bsaudio]'); \n            }\n            function accord1(editor){\n    editor.codemirror.doc.replaceSelection('{bs-accord style=line title=线性手风琴标题}线性手风琴内容{/bs-accord}'); \n            }\n            function accord2(editor){\n    editor.codemirror.doc.replaceSelection('{bs-accord style=common title=普通手风琴标题}普通手风琴内容{/bs-accord}'); \n            }\n            function quotepost(editor){\n    editor.codemirror.doc.replaceSelection('[bspost cid=\"文章CID\"]'); \n            }\n            function postmark(editor){\n    editor.codemirror.doc.replaceSelection('[bsmark]要标注的内容[/bsmark]'); \n            }\n            function postruby(editor){\n    editor.codemirror.doc.replaceSelection('[bsruby]要带拼音的汉字[/bsruby]'); \n            }\n             function todolist1(editor){\n    editor.codemirror.doc.replaceSelection('[todo-t]Todolist已完成的内容[/todo-t]'); \n            }\n             function todolist2(editor){\n    editor.codemirror.doc.replaceSelection('[todo-f]Todolist待完成的内容[/todo-f]'); \n            }\n             function bframe(editor){\n    editor.codemirror.doc.replaceSelection('[bsfra image=\"占位封面图直链\" url=\"页面地址\"]'); \n            }\n\n\nfunction button(editor){\n         Swal.fire({\n  title: '第一步 选择按钮样式',\n  input: 'select',\n  inputOptions: {\n      'common': '普通按钮',\n      'basic': '光圈按钮',\n      'animated': '动画按钮',\n  },\n  inputPlaceholder: '选择一款按钮',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valueone) => {\n    return new Promise((resolve) => {\n      if (valueone !== '') {\n\n                Swal.fire({\n  title: '第二步 选择按钮颜色',\n  input: 'select',\n  inputOptions: {\n      'standard': '淡色',\n      'primary': '蓝色',\n      'secondary': '黑色',\n      'red': '红色',\n      'orange': '橙色',\n      'yellow': '黄色',\n      'olive': '淡绿色',\n      'green': '深绿色',\n      'teal': '青色',\n      'violet': '紫罗兰色',\n      'purple': '基佬紫色',\n      'pink': '粉色',\n      'brown': '土黄色',\n      'grey': '灰色',\n  },\n  inputPlaceholder: '选择一款颜色',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuetwo) => {\n    return new Promise((resolve) => {\n      if (valuetwo !== '') {\n        \n        \n\n  Swal.fire({\n      title: '第三步 填写按钮点击链接',\n  input: 'url',\n  inputLabel: '按钮点击跳转链接',\n  inputPlaceholder: '填写按钮点击跳转链接，需带http(s)://',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuethree) => {\n    return new Promise((resolve) => {\n      if (valuethree !== '') {\n        \n        \n        Swal.fire({\n  title: '第四步 填写按钮名称',\n  input: 'text',\n  inputLabel: '按钮名称(若为动画按钮，两个名称请使用|隔开)',\n  inputPlaceholder: '请填写按钮名称',\n  showCancelButton: true,\n  cancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuefour) => {\n    if (!valuefour) {\n      return '您必须填写按钮名称'\n    }\n    else{\n        \n        \n        \n        Swal.fire({\n  title: '第五步 填写按钮图标名',\n  input: 'text',\n  inputLabel: '按钮图标名(若不需要图标可留空)',\n  'html':'<a href=\"https://bs-icon.typecho.ru/\" target=\"_blank\">图标获取请戳这里</a>',\n  inputPlaceholder: '请填写按钮图标名',\n  showCancelButton: true,\n  cancelButtonText: \"取消\", \n  confirmButtonText: '插入',\n  inputValidator: (valuefive) => {\n      if(!valuefive){\n          var icon = '';\n      }\n      else{\n          var icon = ' icon=\"'+valuefive+'\"';\n      }\n      var text = '[bsbtn type=\"'+valueone+'\" color=\"'+valuetwo+'\" url=\"'+valuethree+'\"'+icon+']'+valuefour+'[/bsbtn]';\n      editor.codemirror.doc.replaceSelection(text);\n    resolve()\n  }\n})\n        \n        \n        \n        resolve()\n    }\n  }\n})\n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须填写跳转链接~~') \n      }\n    })\n  }\n})\n\n        \n        \n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须选择一款颜色~~') \n      }\n    })\n  }\n})\n\n        \n        \n        \n        \n        \n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须选择一款按钮~~') \n      }\n    })\n  }\n})\n\n      }\n      \n      function progress(editor){\n         Swal.fire({\n  title: '选择进度条颜色',\n  input: 'select',\n  inputOptions: {\n       'normal':'蓝色',\n      'secondary': '黑色',\n      'default': '灰色',\n      'warning': '黄色',\n      'success': '绿色',\n      'info': '天蓝色',\n      'warning': '黄色',\n      'danger': '红色'\n  },\n  inputPlaceholder: '选择一款颜色',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valueone) => {\n    return new Promise((resolve) => {\n      if (valueone !== '') {\n      \n      Swal.fire({\n      title: '第二步 填写进度条标题',\n  input: 'text',\n  inputLabel: '进度条标题[将显示在进度条上方]',\n  inputPlaceholder: '填写进度条标题',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuetwo) => {\n    return new Promise((resolve) => {\n      if (valuetwo !== '') {\n             Swal.fire({\n      title: '第三步 填写进度条数值',\n  input: 'text',\n  inputLabel: '进度条数值[如40%就填写40]',\n  inputPlaceholder: '填写进度条数值',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '插入',\n  inputValidator: (valuethree) => {\n    return new Promise((resolve) => {\n      if (valuethree !== '') {\n                var text = '[bsprog color=\"'+valueone+'\" number=\"'+valuethree+'\"]'+valuetwo+'[/bsprog]';\n      editor.codemirror.doc.replaceSelection(text);\n    resolve()\n      }\n      else{\n       resolve('您必须填写进度条数值~')    \n      }\n    })\n  }\n})\n    resolve()\n      }\n      else{\n       resolve('您必须填写进度条标题~')    \n      }\n    })\n  }\n})\n      \n      \n      \n      \n      } \n      else{\n         resolve('您必须选择一款颜色~') \n      }\n    })\n  }\n})\n\n      }\n      \n      function message(editor){\n         Swal.fire({\n  title: '第一步 选择提示框样式',\n  input: 'select',\n  inputOptions: {\n      'common': '普通提示框',\n      'basic': '阴影提示框',\n      'commonclose': '普通可关闭提示框',\n      'basicclose':'阴影可关闭提示框',\n  },\n  inputPlaceholder: '选择一款提示框',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valueone) => {\n    return new Promise((resolve) => {\n      if (valueone !== '') {\n\n                Swal.fire({\n  title: '第二步 选择提示框颜色',\n  input: 'select',\n  inputOptions: {\n      'standard': '淡色',\n      'info':'淡青色',\n      'primary': '蓝色',\n      'secondary': '黑色',\n      'red': '红色',\n      'orange': '橙色',\n      'yellow': '黄色',\n      'olive': '淡绿色',\n      'green': '深绿色',\n      'teal': '青色',\n      'violet': '紫罗兰色',\n      'purple': '基佬紫色',\n      'pink': '粉色',\n      'brown': '土黄色',\n      'grey': '灰色',\n  },\n  inputPlaceholder: '选择一款颜色',\n  showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuetwo) => {\n    return new Promise((resolve) => {\n      if (valuetwo !== '') {\n        \n        \n\n  Swal.fire({\n      title: '第三步 填写提示框标题',\n  input: 'text',\n  inputLabel: '提示框标题',\n  inputPlaceholder: '填写提示框标题',\n    showCancelButton: true,\ncancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuethree) => {\n    return new Promise((resolve) => {\n      if (valuethree !== '') {\n        \n        \n        Swal.fire({\n  title: '第四步 填写提示框内容',\n  input: 'textarea',\n  inputLabel: '提示框内容',\n  inputPlaceholder: '请填写提示框内容',\n  showCancelButton: true,\n  cancelButtonText: \"取消\", \n  confirmButtonText: '下一步',\n  inputValidator: (valuefour) => {\n    if (!valuefour) {\n      return '您必须填写提示框内容'\n    }\n    else{\n        \n        \n        \n        Swal.fire({\n  title: '第五步 填写提示框图标名',\n  input: 'text',\n  inputLabel: '提示框图标名(若不需要图标可留空)',\n  'html':'<a href=\"https://bs-icon.typecho.ru/\" target=\"_blank\">图标获取请戳这里</a>',\n  inputPlaceholder: '请填写提示框图标名',\n  showCancelButton: true,\n  cancelButtonText: \"取消\", \n  confirmButtonText: '插入',\n  inputValidator: (valuefive) => {\n      if(!valuefive){\n          var icon = '';\n      }\n      else{\n          var icon = ' icon=\"'+valuefive+'\"';\n      }\n      var text = '[bsmessage type=\"'+valueone+'\" color=\"'+valuetwo+'\" title=\"'+valuethree+'\"'+icon+']'+valuefour+'[/bsmessage]';\n      editor.codemirror.doc.replaceSelection(text);\n    resolve()\n  }\n})\n        \n        \n        \n        resolve()\n    }\n  }\n})\n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须填写提示框标题~~') \n      }\n    })\n  }\n})\n\n        \n        \n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须选择一款颜色~~') \n      }\n    })\n  }\n})\n\n        \n        \n        \n        \n        \n        \n        \n        \n        resolve() \n      } \n      else{\n         resolve('您必须选择一款提示框~~') \n      }\n    })\n  }\n})\n\n      }\n      function emoji(editor){\n       Swal.fire({\n  title: '表情面板',\n  html: '<button id=\\\"emoji\\\" class=\"swal2-confirm swal2-styled\">点击显示表情面板</button><br><div id=\"emoemo\"></div><br>Tips:点击表情后将直接插入到文章中',\n  icon: 'info',\nshowCancelButton: false,\nshowConfirmButton: false,\n\n});\n\t\t$('#emoji').BearsimpleEmoji($('#text'));\n\t\t$.fn.insertText = function(text){\n\t\t    editor.codemirror.doc.replaceSelection(text+' ');\n\t\t    Swal.close();\n\t\t\tthis.each(function() {\n\t\t\t\tif(this.tagName !== 'INPUT' && this.tagName !== 'TEXTAREA') {return;}\n\t\t\t\tif (document.selection) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\tvar cr = document.selection.createRange();\n\t\t\t\t\tcr.text = text;\n\t\t\t\t\tcr.collapse();\n\t\t\t\t\tcr.select();\n\t\t\t\t}else if (this.selectionStart || this.selectionStart == '0') {\n\t\t\t\t\tvar \n\t\t\t\t\tstart = this.selectionStart,\n\t\t\t\t\tend = this.selectionEnd;\n\t\t\t\t\tthis.value = this.value.substring(0, start)+ text+ this.value.substring(end, this.value.length);\n\t\t\t\t\tthis.selectionStart = this.selectionEnd = start+text.length;\n\t\t\t\t}else {\n\t\t\t\t\tthis.value += text;\n\t\t\t\t}\n\t\t\t});        \n\t\t\treturn this;\n\t\t}\n\t\t\n\n}\n\n       function colorpc(editor){\n       Swal.fire({\n  title: '字体颜色选择器面板',\n  html: \"<div id=\\\"color\\\"></div><br>选择完颜色后点击下面的直接插入按钮进行应用，本功能实现的效果仅在前台文章内页可见。\",\n  icon: 'info',\nshowCancelButton: true,\n  confirmButtonColor: '#3085d6',\n  cancelButtonColor: '#d33',\n  cancelButtonText: \"取消\", \n  confirmButtonText: '直接插入'\n}).then((result) => {\n  if (result.isConfirmed) {\n  var colorss = document.getElementById(\"colors\").value;\n  if(!colorss){\n      alert('未选择颜色，不能直接插入!');\n  }\n  else{\n    editor.codemirror.doc.replaceSelection('{bs-font color=\"'+ colorss + '\"}内容{/bs-font}');\n  }\n  }\n})\n       $('#color').colorpicker({\n        popover: false,\n        inline: true,\n        container: '#color',\ntemplate: '<div class=\"colorpicker\">' +\n          '<div class=\"colorpicker-saturation\"><i class=\"colorpicker-guide\"></i></div>' +\n          '<div class=\"colorpicker-hue\"><i class=\"colorpicker-guide\"></i></div>' +\n          '<div class=\"colorpicker-alpha\">' +\n          '   <div class=\"colorpicker-alpha-color\"></div>' +\n          '   <i class=\"colorpicker-guide\"></i>' +\n          '</div>' +\n          '<div class=\"colorpicker-bar\">' +\n          '   <div class=\"input-group\">' +\n          '       <input id=\"colors\" class=\"form-control input-block color-io\" />' +\n          '   </div>' +\n          '</div>' +\n          '</div>'\n        })\n        .on('colorpickerCreate', function (e) {\n          var io = e.colorpicker.element.find('.color-io');\n          io.val(e.color.string());\n          io.on('change keyup', function () {\n            e.colorpicker.setValue(io.val());\n          });\n        })\n        .on('colorpickerChange', function (e) {\n          var io = e.colorpicker.element.find('.color-io');\n          if (e.value === io.val() || !e.color || !e.color.isValid()) {\n            return;\n          }\n          io.val(e.color.string());\n        });\n       }\n       $(document).ready(function() {\n     \n           $(\".copyupload\").attr(\"style\",\"display:none;\");\n               $(\".insertper\").attr(\"style\",\"display:none;\");\n               $(\".autosaves\").attr(\"style\",\"display:none;\");\n               localStorage.setItem('autosavecid','');\n               $(\"#wmd-button-bar\").attr(\"style\",\"display:none;\");\n        \n       });\n     \n\n      \n        </script>\n        <?php\n    }\n    \n    \n    \n    //腾讯云COS\n    \n    /**\n   * @description: 上传文件处理函数\n   * @param {array} $file\n   * @return {*}\n   */\n  public static function uploadHandle(array $file)\n  {\n   $boptions = get_option('bearsimple');\n        $opt = Helper::options();\n        \n        //文件名是否空\n        if (empty($file['name'])) {\n            return false;\n        }\n        //文件名安全性检测\n        $ext = self::getSafeName($file['name']);\n        if (!self::getTypechoMethod(\"checkFileType\", $ext) || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n        //判断格式\n        $ext = strtolower($ext);\n        \n        if (empty($date)) {\n            $date = new \\Typecho\\Date($opt->gmtTime);\n        }\n        $filePath = self::getUploadDir()  . $date->year . '/' . $date->month;\n\n        if (!isset($file['tmp_name'])) {\n            return false;\n        }\n        \n        //创建上传目录\n        if (!is_dir($filePath)) {\n\n            if (!self::getTypechoMethod(\"makeUploadDir\", $filePath)) {\n\n                return false;\n            }\n        }\n\n        $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext;\n        $path = $filePath . '/' . $fileName;\n        \n        if (isset($file['tmp_name'])) {\n            $content = file_get_contents($file['tmp_name']);\n        } else if (isset($file['bytes'])) {\n            $content = $file['bytes'];\n        } else {\n            return false;\n        }\n        \n        \n        //判断是否开启tinypng\n        if($boptions['Tinypng_open'] == true){\n        \n        $isimage = in_array($ext, array(\"jpg\", \"png\", \"jpeg\"));\n\n        \n        \n        if ($isimage) {\n            $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']);\n            \\Tinify\\setKey($apikey);\n            $source = \\Tinify\\fromFile($file['tmp_name']);\n        }\n        \n        if (!$isimage) {\n            if (isset($file['tmp_name'])) {\n                if (!@move_uploaded_file($file['tmp_name'], $path)) {\n                    return false;\n                }\n            } else if (isset($file['bytes'])) {\n                if (!file_put_contents($path, $file['bytes'])) {\n                    return false;\n                }\n            } else {\n                return false;\n            }\n        }\n        if ($isimage) {\n            $source->toFile($path);\n            $file['size'] = filesize($path);\n        } else if (!isset($file['size'])) {\n            $file['size'] = filesize($path);\n    }         \n    $file['tmp_name'] = $path;\n    }\n    $uploadfile = self::getUploadFile($file);\n\n    /* 上传到COS */\n    #初始化COS\n    $cosClient = self::CosInit();\n    try {\n      #判断是否存在重名文件，重名则重新生成\n      $times = 10;\n      while ($times > 0 && self::doesObjectExist($path)) {\n        $fileName = sprintf('%u', crc32(uniqid($times--))) . '.' . $ext;\n        $path = $fileDir . '/' . $fileName;\n      }\n\n      $cosClient->upload(\n        $bucket = $boptions['bucket_name'],\n        $key = $path,\n        $body = fopen($uploadfile, 'rb'),\n        $options = array(\n          \"ACL\" => 'public-read',\n          'CacheControl' => 'private'\n        )\n      );\n    } catch (Exception $e) {\n      echo \"$e\\n\";\n      return false;\n    }\n\n    if (!isset($file['size'])) {\n      $fileInfo = $cosClient->headObject(array('Bucket' => $boptions['bucket_name'], 'Key' => $path))->toArray();\n      $file['size'] = $fileInfo['ContentLength'];\n    }\n    \n    if ($boptions['bucket_localsave'] == true && self::makeUploadDir($filePath)) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $path);\n    }\n\n    #返回相对存储路径\n    return array(\n      'name' => $file['name'],\n      'path' => $path,\n      'size' => $file['size'],\n      'type' => $ext,\n      'mime' => @\\Typecho\\Common::mimeContentType($path)\n    );\n  }\n\n  /**\n   * @description: 修改文件处理函数\n   * @param {array} $content 旧文件\n   * @param {array} $file 新文件\n   * @return {*}\n   */\n  public static function modifyHandle(array $content, array $file)\n  {\n    if (empty($file['name'])) {\n      return false;\n    }\nif ($opts['bucket_other'] !== '') {\n      $bucket_other = $opts['bucket_other'];\n    }\n    #获取扩展名\n    $ext = self::getSafeName($file['name']);\n    #判定是否是允许的文件类型\n    if ($content['attachment']->type != $ext || \\Typecho\\Common::isAppEngine()) {\n      return false;\n    }\n    #获取设置参数\n    $opt = get_option('bearsimple');\n    #获取文件路径\n    $path = $content['attachment']->path;\n    #获得上传文件\n    $uploadfile = self::getUploadFile($file);\n    #如果没有临时文件，则退出\n    if (!isset($uploadfile)) {\n      return false;\n    }\n\n    /* 上传到COS */\n    $cosClient = self::CosInit();\n    try {\n      $cosClient->upload(\n        $bucket = $opt['bucket'],\n        $key = $path,\n        $body = fopen($uploadfile, 'rb'),\n        $options = array(\n          \"ACL\" => 'public-read',\n          'CacheControl' => 'private'\n        )\n      );\n    } catch (Exception $e) {\n      echo \"$e\\n\";\n      return false;\n    }\n\n    if (!isset($file['size'])) {\n      $fileInfo = $cosClient->headObject(array('Bucket' => $opt['bucket_name'], 'Key' => $path))->toArray();\n      $file['size'] = $fileInfo['ContentLength'];\n    }\n\n    if ($opt['bucket_localsave'] == true) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $path);\n    }\n\n\n    #返回相对存储路径\n    return array(\n      'name' => $content['attachment']->name,\n      'path' => $content['attachment']->path,\n      'size' => $file['size'],\n      'type' => $content['attachment']->type,\n      'mime' => $content['attachment']->mime\n    );\n  }\n\n  /**\n   * @description: 删除文件\n   * @param {array} $content\n   * @return {*}\n   */\n  public static function deleteHandle(array $content)\n  {\n    #获取设置参数\n    $opt = get_option('bearsimple');\n\n    #删除本地文件\n    if ($opt['bucket_localsave'] == true && $opt['bucket_localdelete']== true) {\n      @unlink($content['attachment']->path);\n    }\n    # 开启同步删除COS文件则执行\n    if ($opt['bucket_sync']==true) {\n      #初始化COS\n      $cosClient = self::CosInit();\n      try {\n        $result = $cosClient->deleteObject(array(\n          #bucket的命名规则为{name}-{appid} ，此处填写的存储桶名称必须为此格式\n          'Bucket' => $opt['bucket_name'],\n          'Key' => $content['attachment']->path\n        ));\n      } catch (Exception $e) {\n        echo \"$e\\n\";\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * @description: 获取对象访问Url\n   * @param {array} $content\n   * @return {*}\n   */\n  public static function attachmentHandle(array $content)\n  {\n      $options = get_option('bearsimple');\n         if (preg_match('/\\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) {\n        $diy_style  = $options['bucket_other'];\n        }\n        return \\Typecho\\Common::url($content['attachment']->path, self::tx_getDomain()).$diy_style;\n        \n  }\n\n  /**\n   * @description: 获取对象访问Url\n   * @param array $content\n   * @return {*}\n   */\n  public static function attachmentDataHandle(array $content)\n  {\n    return file_get_contents(self::attachmentHandle($content));\n  }\n\n  /**\n   * @description: 更新正文中的对象网址钩子\n   * @return {*}\n   */\n  public static function Widget_Archive_beforeRender()\n  {\n    ob_start();\n    $html = ob_get_contents();\n    ob_clean();\n    echo self::beforeRender($html);\n    ob_end_flush();\n  }\n\n  /**\n   * @description: 更新正文中的对象网址（获得新的sign）\n   * @param string $text 页面html\n   * @return string\n   */\n  public static function beforeRender($text)\n  {\n    $opt = get_option('bearsimple');\n    $cosClient = self::CosInit();\n    if ($opt['bucket_sign'] == 1) {\n      return preg_replace_callback(\n        '/https?:\\/\\/[-A-Za-z0-9+&@#\\/\\%?=~_|!:,.;]+[-A-Za-z0-9+&@#\\/\\%=~_|]/i',\n        function ($matches) use ($opt, $cosClient) {\n          $url = $matches[0];\n          if (strpos($url, self::getDomain()) !== false) {\n            $expTime = explode('q-key-time%3D', $url);\n            if (sizeof($expTime) > 1) {\n              @$expTime = explode('%26q', $expTime[1])[0];\n              @$expTime = explode('%3B', $expTime)[1];\n              #未过期，不更新\n              if ($expTime > time()) {\n                return $url;\n              }\n            }\n            $path = str_replace(self::getDomain(), '', $url);\n            $url = $cosClient->getObjectUrl($opt['bucket_name'], explode('?', $path)[0], '+10 minutes');\n          }\n          return $url;\n        },\n        $text\n      );\n    }\n    return $text;\n  }\n\n  /**\n   * @description: COS初始化\n   * @param object $options 设置信息\n   * @return {*}\n   */\n  public static function CosInit($options = '')\n  {\n    try {\n      if (!$options) {\n        $options = get_option('bearsimple');\n      }\n    } catch (Exception $e) {\n    }\n    \n      require_once 'phar://' . __DIR__ . '/modules/tencent_cos/phar/cos-sdk-v5-7.phar/vendor/autoload.php';\n    \n   if(empty($options['bucket_secret_id'])||empty($options['bucket_secret_key'])){\n       return new \\Qcloud\\Cos\\Client(array(\n      'region' => 'ap-beijing',\n      'schema' => 'https', #协议头部，默认为http\n      'credentials' => array(\n        'secretId' => 'fix',\n        'secretKey' => 'fix'\n      )\n    ));\n   }\n   else{\n    return new \\Qcloud\\Cos\\Client(array(\n      'region' => $options['bucket_region'],\n      'schema' => 'https', #协议头部，默认为http\n      'credentials' => array(\n        'secretId' => $options['bucket_secret_id'],\n        'secretKey' => $options['bucket_secret_key']\n      )\n    ));\n   }\n  }\n\n  /**\n   * @description: 判断存储桶是否存在\n   * @param {*} $opt\n   * @return {*}\n   */\n  public static function doesBucketExist($opt)\n  {\n    #初始化COS\n    $cosClient = self::CosInit($opt);\n    try {\n      $result = $cosClient->doesBucketExist(\n        $opt['bucket_name']\n      );\n      if (!$result) {\n        return false;\n      }\n    } catch (Exception $e) {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * @description: 判断对象是否已存在\n   * @param {*} $key\n   * @return {*}\n   */\n  public static function doesObjectExist($key)\n  {\n    #获取设置参数\n    $opt = get_option('bearsimple');\n    #初始化COS\n    $cosClient = self::CosInit();\n    try {\n      $result = $cosClient->doesObjectExist(\n        $opt['bucket_name'],\n        $key\n      );\n      if ($result) {\n        return true;\n      }\n    } catch (Exception $e) {\n      return true;\n    }\n    return false;\n  }\n  \n  \n  \n  \n  //阿里处理方法\n  \n  /**\n     * 上传文件处理函数\n     *\n     * @access public\n     * @param array $file 上传的文件\n     * @return mixed\n     */\n    public static function ali_uploadHandle($file) {\n         $options = get_option('bearsimple');\n        $opt = Helper::options();\n        \n        //文件名是否空\n        if (empty($file['name'])) {\n            return false;\n        }\n        //文件名安全性检测\n        $ext = self::getSafeName($file['name']);\n        if (!self::getTypechoMethod(\"checkFileType\", $ext) || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n        //判断格式\n        $ext = strtolower($ext);\n        \n        if (empty($date)) {\n            $date = new \\Typecho\\Date($opt->gmtTime);\n        }\n        $filePath = self::ali_getUploadDir()  . $date->year . '/' . $date->month;\n\n        if (!isset($file['tmp_name'])) {\n            return false;\n        }\n        \n        //创建上传目录\n        if (!is_dir($filePath)) {\n\n            if (!self::getTypechoMethod(\"makeUploadDir\", $filePath)) {\n\n                return false;\n            }\n        }\n\n        $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext;\n        $path = $filePath . '/' . $fileName;\n        \n        if (isset($file['tmp_name'])) {\n            $content = file_get_contents($file['tmp_name']);\n        } else if (isset($file['bytes'])) {\n            $content = $file['bytes'];\n        } else {\n            return false;\n        }\n        \n        \n        //判断是否开启tinypng\n        if($options['Tinypng_open'] == true){\n        \n        $isimage = in_array($ext, array(\"jpg\", \"png\", \"jpeg\"));\n\n        \n        \n        if ($isimage) {\n            $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']);\n            \\Tinify\\setKey($apikey);\n            $source = \\Tinify\\fromFile($file['tmp_name']);\n        }\n        \n        if (!$isimage) {\n            if (isset($file['tmp_name'])) {\n                if (!@move_uploaded_file($file['tmp_name'], $path)) {\n                    return false;\n                }\n            } else if (isset($file['bytes'])) {\n                if (!file_put_contents($path, $file['bytes'])) {\n                    return false;\n                }\n            } else {\n                return false;\n            }\n        }\n        if ($isimage) {\n            $source->toFile($path);\n            $file['size'] = filesize($path);\n        } else if (!isset($file['size'])) {\n            $file['size'] = filesize($path);\n    }         \n    $file['tmp_name'] = $path;\n    }\n    \n\n\n      \n        $uploadfile = self::getUploadFile($file);\n\n        if (!isset($uploadfile)) {\n            return false;\n        }\n\n        $oss_client = self::ossInit();\n        try {\n            $oss_client->doesBucketExist($options['ali_bucket_name']);\n        } catch (Exception $e) {\n            return false;\n        }\n       try {\n            $oss_client->putObject($options['ali_bucket_name'], $path, $content);\n            \n        } catch (Exception $e) {\n            return false;\n        }\n\n if ($options['ali_bucket_localsave'] == true && self::makeUploadDir($filePath)) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $path);\n    }\n    else{\n        @unlink($path);\n    }\n    \n             return array(\n            'name' => $file['name'],\n            'path' => $path,\n            'size' => $file['size'],\n            'type' => $ext,\n            'mime' => @\\Typecho\\Common::mimeContentType($path)\n        );\n            \n        \n    }\n\n    /**\n     * 修改文件处理函数\n     *\n     * @access public\n     * @param array $content 老文件\n     * @param array $file 新上传的文件\n     * @return mixed\n     */\n    public static function ali_modifyHandle($content, $file)\n    {\n        \n         $options = get_option('bearsimple');\n       if (isset($file['tmp_name'])) {\n            $contents = file_get_contents($file['tmp_name']);\n        } else if (isset($file['bytes'])) {\n            $contents = $file['bytes'];\n        } else {\n            return false;\n        }\n        if (empty($file['name'])) {\n            return false;\n        }\n\n        $ext = self::getSafeName($file['name']);\n\n       if (!\\Widget\\Upload::checkFileType($ext) || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n\n       $uploadfile = self::getUploadFile($file);\n\n        if (!isset($uploadfile)) {\n            return false;\n        }\n\n        $oss_client = self::ossInit();\n         \n         try{\n            $ali_response = $oss_client->putObject($options['ali_bucket_name'], $content['attachment']->path, $contents);\n        } catch(OssException $e) {\n             \n            return false;\n        }\n        \n      if ($options['ali_bucket_localsave'] == true) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $content['attachment']->path);\n    }\n    \n\n        return array(\n            'name' => $content['attachment']->name,\n            'path' => $content['attachment']->path,\n            'size' => intval($ali_response['oss-requestheaders']['Content-Length']),\n            'type' => $ext,\n            'mime' => $ali_response['oss-requestheaders']['Content-Type']\n        );\n    }\n\n    /**\n     * 删除文件\n     *\n     * @access public\n     * @param array $content 文件相关信息\n     * @return string\n     */\n    public static function ali_deleteHandle(array $content)\n    {\n         $options = get_option('bearsimple');\n        $oss_client = self::ossInit();\n#删除本地文件\n    if ($options['ali_bucket_localsave'] == true && $options['ali_bucket_localdelete']== true) {\n      @unlink($content['attachment']->path);\n    }\n    if ($options['ali_bucket_sync']==true) {\n        try {\n            $oss_client->deleteObject($options['bd_bucket_name'],$content['attachment']->path);\n            return true;\n        } catch (Exception $e) {\n            return false;\n        } \n    }\n    return true;\n    }\n\n    /**\n     * 获取实际文件绝对访问路径\n     *\n     * @access public\n     * @param array $content 文件相关信息\n     * @return string\n     */\n    public static function ali_attachmentHandle(array $content) {\n         $options = get_option('bearsimple');\n         if (preg_match('/\\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) {\n        $diy_style  = $options['ali_bucket_other'];\n        }\n        return \\Typecho\\Common::url($content['attachment']->path, self::ali_getDomain()).$diy_style;\n    \n       \n    }\n\n    /**\n     * 获取实际文件数据\n     *\n     * @access public\n     * @param array $content\n     * @return string\n     */\n    public static function ali_attachmentDataHandle(array $content)\n    {\n        return file_get_contents(self::ali_attachmentHandle($content));\n    }\n    \n    /**\n   * @description: OSS初始化\n   * @param object $options 设置信息\n   * @return {*}\n   */\n  public static function ossInit($options = '')\n  {\n      \n    try {\n      if (!$options) {\n        $options = get_option('bearsimple');\n      }\n    } catch (Exception $e) {\n    }\n    $end_point   = 'http://' . (($options['ali_bucket_region'] === \"other\") ?\n                $options['ali_bucket_other_region'] :\n                $options['ali_bucket_region'] . $options['ali_bucket_connect_type']);\n   if(empty($options['ali_bucket_accesskey_id'])||empty($options['ali_bucket_accesskey_secret'])){\n       return new OssClient('fix', 'fix', $end_point);\n   }\n   else{\n    return new OssClient($options['ali_bucket_accesskey_id'], $options['ali_bucket_accesskey_secret'], $end_point);\n   }\n  }\n  \n  \n  //七牛云Kodo\n  \n  public static function qiniu_uploadHandle($file)\n    {\n        $options = get_option('bearsimple');\n        $opt = Helper::options();\n        \n        //文件名是否空\n        if (empty($file['name'])) {\n            return false;\n        }\n        //文件名安全性检测\n        $ext = self::getSafeName($file['name']);\n        if (!self::getTypechoMethod(\"checkFileType\", $ext) || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n        //判断格式\n        $ext = strtolower($ext);\n        \n        if (empty($date)) {\n            $date = new \\Typecho\\Date($opt->gmtTime);\n        }\n        $filePath = self::qiniu_getUploadDir()  . $date->year . '/' . $date->month;\n\n        if (!isset($file['tmp_name'])) {\n            return false;\n        }\n        \n        //创建上传目录\n        if (!is_dir($filePath)) {\n\n            if (!self::getTypechoMethod(\"makeUploadDir\", $filePath)) {\n\n                return false;\n            }\n        }\n\n        $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext;\n        $path = $filePath . '/' . $fileName;\n        \n        if (isset($file['tmp_name'])) {\n            $content = file_get_contents($file['tmp_name']);\n        } else if (isset($file['bytes'])) {\n            $content = $file['bytes'];\n        } else {\n            return false;\n        }\n        \n        \n        //判断是否开启tinypng\n        if($options['Tinypng_open'] == true){\n        \n        $isimage = in_array($ext, array(\"jpg\", \"png\", \"jpeg\"));\n\n        \n        \n        if ($isimage) {\n            $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']);\n            \\Tinify\\setKey($apikey);\n            $source = \\Tinify\\fromFile($file['tmp_name']);\n        }\n        \n        if (!$isimage) {\n            if (isset($file['tmp_name'])) {\n                if (!@move_uploaded_file($file['tmp_name'], $path)) {\n                    return false;\n                }\n            } else if (isset($file['bytes'])) {\n                if (!file_put_contents($path, $file['bytes'])) {\n                    return false;\n                }\n            } else {\n                return false;\n            }\n        }\n        if ($isimage) {\n            $source->toFile($path);\n            $file['size'] = filesize($path);\n        } else if (!isset($file['size'])) {\n            $file['size'] = filesize($path);\n    }         \n    $file['tmp_name'] = $path;\n    }\n        $uploadfile = self::getUploadFile($file);\n\n        $uploadMgr = new UploadManager();\n        list($ret, $err) = $uploadMgr->putFile(self::qiniu_getAuthToken(), ltrim($path, \"/\"), $uploadfile);\n        if ($err !== null) {\n            return false;\n        }\n        if (!isset($file['size'])) {\n            $file['size'] = filesize($uploadfile);\n        }\n        \n    if ($options['qiniu_bucket_localsave'] == true && self::makeUploadDir($filePath)) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $path);\n    }\n    else{\n        @unlink($path);\n    }\n        return array(\n            'name' => $file['name'],\n            'path' => $path,\n            'size' => $file['size'],\n            'type' => $ext,\n            'mime' => @\\Typecho\\Common::mimeContentType($path)\n        );\n    }\n\n    /**\n     * 七牛修改文件\n     *\n     * @access public\n     * @param array $content 老文件\n     * @param array $file 新上传的文件\n     * @return mixed\n     */\n    public static function qiniu_modifyHandle($content, $file)\n    {\n        if (empty($file['name'])) {\n            return false;\n        }\n\n        //获取扩展名\n        $ext = self::getSafeName($file['name']);\n        //判定是否是允许的文件类型\n        if ($content['attachment']->type != $ext || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n        //获取文件路径\n        $path = $content['attachment']->path;\n        //获得上传文件\n        $uploadfile = self::getUploadFile($file);\n        //如果没有临时文件，则退出\n        if (!isset($uploadfile)) {\n            return false;\n        }\n\n        $uploadMgr = new UploadManager();\n        $kodo_path = ltrim($path, \"/\");\n        list($ret, $err) = $uploadMgr->putFile(self::qiniu_getAuthToken($kodo_path), $kodo_path, $uploadfile, null,\n            'application/octet-stream',\n            false,\n            $resumeFile,\n            $version,\n            $partSize);\n        if ($err !== null) {\n            return false;\n        }\n\n        if (!isset($file['size'])) {\n            $file['size'] = filesize($uploadfile);\n        }\n\nif ($options['qiniu_bucket_localsave'] == true) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $content['attachment']->path);\n    }\n    \n        //返回相对存储路径\n        return array(\n            'name' => $content['attachment']->name,\n            'path' => $content['attachment']->path,\n            'size' => $file['size'],\n            'type' => $content['attachment']->type,\n            'mime' => $content['attachment']->mime\n        );\n    }\n\n    /**\n     * 七牛删除文件\n     *\n     * @access public\n     * @param array $content 文件相关信息\n     * @return string\n     */\n    public static function qiniu_deleteHandle(array $content)\n    {\n        $options = get_option('bearsimple');\n        $bucket = $options['qiniu_bucket_name'];\n        #删除本地文件\n    if ($options['qiniu_bucket_localsave'] == true && $options['qiniu_bucket_localdelete']== true) {\n      @unlink($content['attachment']->path);\n    }\n    if ($options['qiniu_bucket_sync']==true) {\n        $bucketManager = new BucketManager(self::qiniu_getAuthToken());\n        $err = $bucketManager->delete($bucket, ltrim($content['attachment']->path, \"/\"));\n        if ($err != null) {\n            return false;\n        }\n    }\n        return true;\n    }\n\n     /**\n     * 七牛获取域名\n     *\n     * @access public\n     * @param array $content 文件相关信息\n     * @return string\n     */\n    public static function qiniu_attachmentHandle(array $content)\n    {\n        $options = get_option('bearsimple');\n        if (preg_match('/\\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) {\n        $diy_style  = $options['qiniu_bucket_other'];\n        }\n        return \\Typecho\\Common::url($content['attachment']->path, $options['qiniu_bucket_domain']).$diy_style;\n    }\n\n    /**\n     * 七牛获取实际文件数据\n     *\n     * @access public\n     * @param array $content\n     * @return string\n     */\n    public static function qiniu_attachmentDataHandle($content)\n    {\n        $options = get_option('bearsimple');\n        $bucket = $options['qiniu_bucket_name'];\n        $bucketManager = new BucketManager(self::qiniu_getAuthToken());\n        list($fileInfo, $err) = $bucketManager->stat($bucket, ltrim($content['attachment']->path, \"/\"));\n        if ($err != null) {\n            var_dump($err);\n            return false;\n        }\n        return $fileInfo;\n    }\n    \n    public static function qiniu_getAuth()\n    {\n        $options = get_option('bearsimple');\n        $accessKey = trim($options['qiniu_bucket_accesskey']);\n        $secretKey = trim($options['qiniu_bucket_secretKey']);\n        return new Auth($accessKey, $secretKey);\n    }\n    public static function qiniu_getAuthToken($key = null)\n    {\n        $options = get_option('bearsimple');\nreturn self::qiniu_getAuth()->uploadToken($options['qiniu_bucket_name'], $key);\n}\n    \n  \n  //又拍云\n  \n  \n  public static function upyun_uploadHandle($file)\n    {\n          $options = get_option('bearsimple');\n        $opt = Helper::options();\n        \n        //文件名是否空\n        if (empty($file['name'])) {\n            return false;\n        }\n        //文件名安全性检测\n        $ext = self::getSafeName($file['name']);\n        if (!self::getTypechoMethod(\"checkFileType\", $ext) || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n        //判断格式\n        $ext = strtolower($ext);\n        \n        if (empty($date)) {\n            $date = new \\Typecho\\Date($opt->gmtTime);\n        }\n        $filePath = self::upyun_getUploadDir()  . $date->year . '/' . $date->month;\n\n        if (!isset($file['tmp_name'])) {\n            return false;\n        }\n        \n        //创建上传目录\n        if (!is_dir($filePath)) {\n\n            if (!self::getTypechoMethod(\"makeUploadDir\", $filePath)) {\n\n                return false;\n            }\n        }\n\n        $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext;\n        $path = $filePath . '/' . $fileName;\n        \n        if (isset($file['tmp_name'])) {\n            $content = file_get_contents($file['tmp_name']);\n        } else if (isset($file['bytes'])) {\n            $content = $file['bytes'];\n        } else {\n            return false;\n        }\n        \n        \n        //判断是否开启tinypng\n        if($options['Tinypng_open'] == true){\n        \n        $isimage = in_array($ext, array(\"jpg\", \"png\", \"jpeg\"));\n\n        \n        \n        if ($isimage) {\n            $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']);\n            \\Tinify\\setKey($apikey);\n            $source = \\Tinify\\fromFile($file['tmp_name']);\n        }\n        \n        if (!$isimage) {\n            if (isset($file['tmp_name'])) {\n                if (!@move_uploaded_file($file['tmp_name'], $path)) {\n                    return false;\n                }\n            } else if (isset($file['bytes'])) {\n                if (!file_put_contents($path, $file['bytes'])) {\n                    return false;\n                }\n            } else {\n                return false;\n            }\n        }\n        if ($isimage) {\n            $source->toFile($path);\n            $file['size'] = filesize($path);\n        } else if (!isset($file['size'])) {\n            $file['size'] = filesize($path);\n    }         \n    $file['tmp_name'] = $path;\n    }\n\n        $uploadfile = self::getUploadFile($file);\n\n        if (!isset($uploadfile)) {\n            return false;\n        } else {\n            //上传文件\n            $upyun = self::upyunInit();\n            $fh = fopen($uploadfile, 'rb');\n            $upyun->write($path, $fh, TRUE);\n            if(is_resource($fh)) {\n                fclose($fh);\n            }\n        }\n\n        if (!isset($file['size'])) {\n            $fileInfo = $upyun->getFileInfo($path);\n            $file['size'] = $fileInfo['x-upyun-file-size'];\n        }\nif ($options['upyun_bucket_localsave'] == true && self::makeUploadDir($filePath)) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $path);\n    }\n    else{\n       @unlink($path);\n    }\n        //返回相对存储路径\n        return array(\n            'name' => $file['name'],\n            'path' => $path,\n            'size' => $file['size'],\n            'type' => $ext,\n            'mime' => @\\Typecho\\Common::mimeContentType($path)\n        );\n    }\n\n    /**\n     * 修改文件处理函数\n     *\n     * @access public\n     * @param array $content 老文件\n     * @param array $file 新上传的文件\n     * @return mixed\n     */\n    public static function upyun_modifyHandle($content, $file)\n    {\n        $options = get_option('bearsimple');\n        if (empty($file['name'])) {\n            return false;\n        }\n\n        //获取扩展名\n        $ext = self::getSafeName($file['name']);\n\n        if ($content['attachment']->type != $ext || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n\n        //获取文件路径\n        $path = $content['attachment']->path;\n\n        $uploadfile = self::getUploadFile($file);\n\n        if (!isset($uploadfile)) {\n            return false;\n        } else {\n            //修改文件\n            $upyun = self::upyunInit();\n            $fh = fopen($uploadfile, 'rb');\n            $upyun->writeFile($path, $fh, TRUE);\n            fclose($fh);\n        }\n\n        if (!isset($file['size'])) {\n            $fileInfo = $upyun->getFileInfo($path);\n            $file['size'] = $fileInfo['x-upyun-file-size'];\n        }\n        \n        if ($options['upyun_bucket_localsave'] == true) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $content['attachment']->path);\n    }\n    \n        //返回相对存储路径\n        return array(\n            'name' => $content['attachment']->name,\n            'path' => $content['attachment']->path,\n            'size' => $file['size'],\n            'type' => $content['attachment']->type,\n            'mime' => $content['attachment']->mime\n        );\n    }\n\n    /**\n     * 删除文件\n     *\n     * @access public\n     * @param array $content 文件相关信息\n     * @return string\n     */\n    public static function upyun_deleteHandle(array $content)\n    {\n        $options = get_option('bearsimple');\n        $upyun = self::upyunInit();\n        $path = $content['attachment']->path;\n        \n        #删除本地文件\n    if ($options['upyun_bucket_localsave'] == true && $options['upyun_bucket_localdelete']== true) {\n      @unlink($content['attachment']->path);\n    }\n    if ($options['upyun_bucket_sync']==true) {\n        $upyun->delete($path);\n    }\n    return true;\n        \n        \n    }\n\n    /**\n     * 获取实际文件绝对访问路径\n     *\n     * @access public\n     * @param array $content 文件相关信息\n     * @return string\n     */\n    public static function upyun_attachmentHandle(array $content)\n    {\n        $options = get_option('bearsimple');\n        if (preg_match('/\\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) {\n        $diy_style  = $options['upyun_bucket_other'];\n        }\n        return \\Typecho\\Common::url($content['attachment']->path, $options['upyun_bucket_domain']).$diy_style;\n    }\n\n    /**\n     * 获取实际文件数据\n     *\n     * @access public\n     * @param array $content\n     * @return string\n     */\n    public static function upyun_attachmentDataHandle(array $content)\n    {\n        $upyun = self::upyunInit();\n        return $upyun->getFileInfo($content['attachment']->path);\n    }\n\n\n   \n    public static function upyunInit()\n    {\n        $options = get_option('bearsimple');\n        return new Upyun(new Config($options['upyun_bucket_name'], $options['upyun_bucket_actionUser'], $options['upyun_bucket_actionKey']));\n    }\n    \n    \n    //华为云OBS\n    public static function hw_uploadHandle($file)\n    {\n        $options = get_option('bearsimple');\n        $opt = Helper::options();\n        if (empty($file['name'])) {\n            return false;\n        }\n        //文件名安全性检测\n        $ext = self::getSafeName($file['name']);\n        if (!self::getTypechoMethod(\"checkFileType\", $ext) || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n        //判断格式\n        $ext = strtolower($ext);\n        \n        if (empty($date)) {\n            $date = new \\Typecho\\Date($opt->gmtTime);\n        }\n        $filePath = self::hw_getUploadDir()  . $date->year . '/' . $date->month;\n\n        if (!isset($file['tmp_name'])) {\n            return false;\n        }\n        \n        //创建上传目录\n        if (!is_dir($filePath)) {\n\n            if (!self::getTypechoMethod(\"makeUploadDir\", $filePath)) {\n\n                return false;\n            }\n        }\n\n        $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext;\n        $path = $filePath . '/' . $fileName;\n        \n        if (isset($file['tmp_name'])) {\n            $content = file_get_contents($file['tmp_name']);\n        } else if (isset($file['bytes'])) {\n            $content = $file['bytes'];\n        } else {\n            return false;\n        }\n        \n        \n        //判断是否开启tinypng\n        if($options['Tinypng_open'] == true){\n        \n        $isimage = in_array($ext, array(\"jpg\", \"png\", \"jpeg\"));\n\n        \n        \n        if ($isimage) {\n            $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']);\n            \\Tinify\\setKey($apikey);\n            $source = \\Tinify\\fromFile($file['tmp_name']);\n        }\n        \n        if (!$isimage) {\n            if (isset($file['tmp_name'])) {\n                if (!@move_uploaded_file($file['tmp_name'], $path)) {\n                    return false;\n                }\n            } else if (isset($file['bytes'])) {\n                if (!file_put_contents($path, $file['bytes'])) {\n                    return false;\n                }\n            } else {\n                return false;\n            }\n        }\n        if ($isimage) {\n            $source->toFile($path);\n            $file['size'] = filesize($path);\n        } else if (!isset($file['size'])) {\n            $file['size'] = filesize($path);\n    }         \n    $file['tmp_name'] = $path;\n    }\n    \n       \n\n        $uploadfile = self::getUploadFile($file);\n\n        if (!isset($uploadfile)) {\n            return false;\n        }\n\n        $obsClient = self::obsInit();\n\n        try {\n            $obsClient->putObject([\n                'Bucket' => $options['hw_bucket_name'],\n                'Key' => $path,\n                'SourceFile' => $uploadfile\n            ]);\n        } catch (Exception $e) {\n            return false;\n        } finally {\n            $obsClient->close();\n        }\n\nif ($options['hw_bucket_localsave'] == true && self::makeUploadDir($filePath)) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $path);\n    }\n    else{\n        @unlink($path);\n    }\n    \n        //返回相对存储路径\n        return array(\n            'name' => $file['name'],\n            'path' => $path,\n            'size' => $file['size'],\n            'type' => $ext,\n            'mime' => @\\Typecho\\Common::mimeContentType($path)\n        );\n    }\n\n\n    public static function hw_modifyHandle($content, $file)\n    {\n        $options = get_option('bearsimple');\n        if (empty($file['name'])) {\n            return false;\n        }\n\n        $ext = self::getSafeName($file['name']);\n\n       if (!\\Widget\\Upload::checkFileType($ext) || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n\n       $uploadfile = self::getUploadFile($file);\n\n        if (!isset($uploadfile)) {\n            return false;\n        }\n\n        $obsClient = self::obsInit();\n\n        try {\n            $obsClient->putObject([\n                'Bucket' => $options['hw_bucket_name'],\n                'Key' => $content['attachment']->path,\n                'SourceFile' => $uploadfile\n            ]);\n        } catch (Exception $e) {\n            return false;\n        } finally {\n            $obsClient->close();\n        }\nif ($options['hw_bucket_localsave'] == true) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $content['attachment']->path);\n    }\n \n        return array(\n            'name' => $content['attachment']->name,\n            'path' => $content['attachment']->path,\n            'size' => $file['size'],\n            'type' => $content['attachment']->type,\n            'mime' => $content['attachment']->mime\n        );\n    }\n\n\n    public static function hw_deleteHandle(array $content)\n    {\n        $options = get_option('bearsimple');\n        $obsClient = self::obsInit();\nif ($options['hw_bucket_localsave'] == true && $options['hw_bucket_localdelete']== true) {\n      @unlink($content['attachment']->path);\n    }\n    if ($options['hw_bucket_sync']==true) {\n        try {\n            $obsClient->deleteObject([\n                'Bucket' => $options['hw_bucket_name'],\n                'Key' => $content['attachment']->path\n            ]);\n            return true;\n        } catch (Exception $e) {\n            return false;\n        } finally {\n            $obsClient->close();\n        }\n    }\n    }\n\n   \n    public static function hw_attachmentHandle(array $content)\n    {\n        $options = get_option('bearsimple');\n         if (preg_match('/\\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) {\n        $diy_style  = $options['hw_bucket_other'];\n        }\n        return \\Typecho\\Common::url($content['attachment']->path, self::hw_getDomain()).$diy_style;\n    }\n\n\n    public static function hw_attachmentDataHandle(array $content)\n    {\n        $options = get_option('bearsimple');\n        return file_get_contents(\\Typecho\\Common::url($content['attachment']->path, self::hw_getDomain()));\n    }\n\n    \n    private static function obsInit()\n    {\n        $options = get_option('bearsimple');\n        return new ObsClient([\n            'key' => $options['hw_bucket_accesskey_id'],\n            'secret' => $options['hw_bucket_accesskey_secret'],\n            'endpoint' => $options['hw_bucket_region'].'.myhuaweicloud.com',\n            'socket_timeout' => 30,\n            'connect_timeout' => 10\n        ]);\n    }\n  \n  \n  \n  public static function bd_uploadHandle($file) {\n      $options = get_option('bearsimple');\n        $opt = Helper::options();\n        \n        //文件名是否空\n        if (empty($file['name'])) {\n            return false;\n        }\n        //文件名安全性检测\n        $ext = self::getSafeName($file['name']);\n        if (!self::getTypechoMethod(\"checkFileType\", $ext) || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n        //判断格式\n        $ext = strtolower($ext);\n        \n        if (empty($date)) {\n            $date = new \\Typecho\\Date($opt->gmtTime);\n        }\n        $filePath = self::bd_getUploadDir()  . $date->year . '/' . $date->month;\n\n        if (!isset($file['tmp_name'])) {\n            return false;\n        }\n        \n        //创建上传目录\n        if (!is_dir($filePath)) {\n\n            if (!self::getTypechoMethod(\"makeUploadDir\", $filePath)) {\n\n                return false;\n            }\n        }\n\n        $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext;\n        $path = $filePath . '/' . $fileName;\n        \n        if (isset($file['tmp_name'])) {\n            $content = file_get_contents($file['tmp_name']);\n        } else if (isset($file['bytes'])) {\n            $content = $file['bytes'];\n        } else {\n            return false;\n        }\n        \n        \n        //判断是否开启tinypng\n        if($options['Tinypng_open'] == true){\n        \n        $isimage = in_array($ext, array(\"jpg\", \"png\", \"jpeg\"));\n\n        \n        \n        if ($isimage) {\n            $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']);\n            \\Tinify\\setKey($apikey);\n            $source = \\Tinify\\fromFile($file['tmp_name']);\n        }\n        \n        if (!$isimage) {\n            if (isset($file['tmp_name'])) {\n                if (!@move_uploaded_file($file['tmp_name'], $path)) {\n                    return false;\n                }\n            } else if (isset($file['bytes'])) {\n                if (!file_put_contents($path, $file['bytes'])) {\n                    return false;\n                }\n            } else {\n                return false;\n            }\n        }\n        if ($isimage) {\n            $source->toFile($path);\n            $file['size'] = filesize($path);\n        } else if (!isset($file['size'])) {\n            $file['size'] = filesize($path);\n    }         \n    $file['tmp_name'] = $path;\n    }\n    \n\n\n      \n        $uploadfile = self::getUploadFile($file);\n\n        if (!isset($uploadfile)) {\n            return false;\n        }\n\n        $bosClient = self::bosInit();\n        try {\n            $bosClient->doesBucketExist($options['bd_bucket_name']);\n        } catch (Exception $e) {\n            return false;\n        }\n       try {\n            $bosClient->putObjectFromString($options['bd_bucket_name'], $path, $content, array(BosOptions::CONTENT_TYPE => $file['type']));\n            \n        } catch (Exception $e) {\n            return false;\n        }\n\n if ($options['bd_bucket_localsave'] == true && self::makeUploadDir($filePath)) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $path);\n    }\n    else{\n        @unlink($path);\n    }\n    \n    \n    \n        //返回相对存储路径\n        return array(\n            'name' => $file['name'],\n            'path' => $path,\n            'size' => $file['size'],\n            'type' => $ext,\n            'mime' => @\\Typecho\\Common::mimeContentType($path)\n        );\n    }\n\n\n    public static function bd_modifyHandle($content, $file)\n    {\n       $options = get_option('bearsimple');\n       if (isset($file['tmp_name'])) {\n            $contents = file_get_contents($file['tmp_name']);\n        } else if (isset($file['bytes'])) {\n            $contents = $file['bytes'];\n        } else {\n            return false;\n        }\n        if (empty($file['name'])) {\n            return false;\n        }\n\n        $ext = self::getSafeName($file['name']);\n\n       if (!\\Widget\\Upload::checkFileType($ext) || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n\n       $uploadfile = self::getUploadFile($file);\n\n        if (!isset($uploadfile)) {\n            return false;\n        }\n\n        $bosClient = self::bosInit();\n\n        try {\n            $bosClient->putObjectFromString($options['bd_bucket_name'], $content['attachment']->path, $contents, array(BosOptions::CONTENT_TYPE => $file['type']));\n        } catch (Exception $e) {\n            return false;\n        } \n      if ($options['bd_bucket_localsave'] == true) {\n      #本地存储一份\n      @move_uploaded_file($uploadfile, $content['attachment']->path);\n    }\n    \n \n        return array(\n            'name' => $content['attachment']->name,\n            'path' => $content['attachment']->path,\n            'size' => $file['size'],\n            'type' => $content['attachment']->type,\n            'mime' => $content['attachment']->mime\n        );\n    }\n\n\n    public static function bd_deleteHandle(array $content)\n    {\n       $options = get_option('bearsimple');\n        $bosClient = self::bosInit();\n#删除本地文件\n    if ($options['bd_bucket_localsave'] == true && $options['bd_bucket_localdelete']== true) {\n      @unlink($content['attachment']->path);\n    }\n    if ($options['bd_bucket_sync']==true) {\n        try {\n            $bosClient->deleteObject($options['bd_bucket_name'],$content['attachment']->path);\n            return true;\n        } catch (Exception $e) {\n            return false;\n        } \n    }\n    return true;\n    }\n\n\n    public static function bd_attachmentHandle(array $content) {\n       $options = get_option('bearsimple');\n         if (preg_match('/\\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) {\n        $diy_style  = $options['bd_bucket_other'];\n        }\n        return \\Typecho\\Common::url($content['attachment']->path, self::bd_getDomain()).$diy_style;\n    }\n\n\n    public static function bd_attachmentDataHandle(array $content)\n    {\n        return file_get_contents(self::bd_attachmentHandle($content));\n    }\n    \n    \n  private static function bosInit()\n    {\n        $options = get_option('bearsimple');\n        return new BosClient(array(\n                'credentials' => array(\n                    'accessKeyId' => $options['bd_bucket_accesskey'],\n                    'secretAccessKey' => $options['bd_bucket_secretkey'],\n                ),\n                'endpoint' => 'http://' .$options['bd_bucket_region'],\n            ));\n    }\n  \n  private static function tx_getDomain()\n  {\n    $options = get_option('bearsimple');\n        $domain = $options['bucket_domain'];\n        if (empty($domain)) $domain = 'https://' .$options['bucket_name'] . '.cos.' . $options['bucket_region'].'.myqcloud.com';\n\n        return $domain;\n  }  \n  \n  private static function ali_getDomain()\n  {\n    $options = get_option('bearsimple');\n        $domain = $options['ali_bucket_domain'];\n        $bucket_name = $options['ali_bucket_name'];\n            $end_point   = ($options['ali_bucket_region'] === \"other\") ? \n                            $options['ali_bucket_other_region'] : \n                            $options['ali_bucket_region'];\n        if (empty($domain)) $domain = 'https://' .$bucket_name . '.' . $end_point.'.aliyuncs.com';\n\n        return $domain;\n  }  \n  \n  private static function bd_getDomain()\n  {\n    $options = get_option('bearsimple');\n        $domain = $options['bd_bucket_domain'];\n        if (empty($domain)) $domain = 'https://' .$options['bd_bucket_name'] . '.' . $options['bd_bucket_region'];\n\n        return $domain;\n  }  \n  \n  private static function hw_getDomain()\n  {\n    $options = get_option('bearsimple');\n        $domain = $options['hw_bucket_domain'];\n        if (empty($domain)) $domain = 'https://' .$options['hw_bucket_name'] . '.' . $options['hw_bucket_region']. '.myhuaweicloud.com';\n\n        return $domain;\n  }  \n\n  private static function getDomain()\n  {\n    $opt = get_option('bearsimple');\n    $domain = $opt['bucket_domain'];\n    if (empty($domain))  $domain = 'https://' . $opt['bucket_name'] . '.cos.' . $opt['bucket_region'] . '.myqcloud.com';\n    return $domain;\n  }\n  \n  \n  \n \n  \nprivate static function checkFileType($ext)\n    {\n        $options = \\Typecho\\Widget::widget('Widget_Options');\n        return in_array($ext, $options->allowedAttachmentTypes);\n    }\n \n \n  private static function makeUploadDir(string $path)\n  {\n    $path = preg_replace(\"/\\\\\\+/\", '/', $path);\n    $current = rtrim($path, '/');\n    $last = $current;\n\n    while (!is_dir($current) && false !== strpos($path, '/')) {\n      $last = $current;\n      $current = dirname($current);\n    }\n\n    if ($last == $current) {\n      return true;\n    }\n\n    if (!@mkdir($last, 0755)) {\n      return false;\n    }\n\n    return self::makeUploadDir($path);\n  }\n  \n  private static function makeUploadaDir($path)\n    {\n        $path = preg_replace(\"/\\\\\\+/\", '/', $path);\n        $current = rtrim($path, '/');\n        $last = $current;\n\n        while (!is_dir($current) && false !== strpos($path, '/')) {\n            $last = $current;\n            $current = dirname($current);\n        }\n\n        if ($last == $current) {\n            return true;\n        }\n\n        if (!@mkdir($last)) {\n            return false;\n        }\n\n        $stat = @stat($last);\n        $perms = $stat['mode'] & 0007777;\n        @chmod($last, $perms);\n\n        return self::makeUploadaDir($path);\n    }\n\n  private static function getUploadDir()\n  {\n    $opt = get_option('bearsimple');\n    if ($opt['bucket_path']) {\n      return $opt['bucket_path'];\n    } else if (defined('__TYPECHO_UPLOAD_DIR__')) {\n      return __TYPECHO_UPLOAD_DIR__;\n    } else {\n      return self::UPLOAD_DIR;\n    }\n  }\n  \n  private static function ali_getUploadDir()\n  {\n    $opt = get_option('bearsimple');\n    if ($opt['ali_bucket_path']) {\n      return $opt['ali_bucket_path'];\n    } else if (defined('__TYPECHO_UPLOAD_DIR__')) {\n      return __TYPECHO_UPLOAD_DIR__;\n    } else {\n      return self::UPLOAD_DIR;\n    }\n  }\n  \n  private static function qiniu_getUploadDir()\n  {\n    $opt = get_option('bearsimple');\n    if ($opt['qiniu_bucket_path']) {\n      return $opt['qiniu_bucket_path'];\n    } else if (defined('__TYPECHO_UPLOAD_DIR__')) {\n      return __TYPECHO_UPLOAD_DIR__;\n    } else {\n      return self::UPLOAD_DIR;\n    }\n  }\n  \n  private static function upyun_getUploadDir()\n  {\n    $opt = get_option('bearsimple');\n    if ($opt['upyun_bucket_path']) {\n      return $opt['upyun_bucket_path'];\n    } else if (defined('__TYPECHO_UPLOAD_DIR__')) {\n      return __TYPECHO_UPLOAD_DIR__;\n    } else {\n      return self::UPLOAD_DIR;\n    }\n  }\n  \n  private static function hw_getUploadDir()\n  {\n    $opt = get_option('bearsimple');\n    if ($opt['hw_bucket_path']) {\n      return $opt['hw_bucket_path'];\n    } else if (defined('__TYPECHO_UPLOAD_DIR__')) {\n      return __TYPECHO_UPLOAD_DIR__;\n    } else {\n      return self::UPLOAD_DIR;\n    }\n  }\n  \n  private static function bd_getUploadDir()\n  {\n    $opt = get_option('bearsimple');\n    if ($opt['bd_bucket_path']) {\n      return $opt['bd_bucket_path'];\n    } else if (defined('__TYPECHO_UPLOAD_DIR__')) {\n      return __TYPECHO_UPLOAD_DIR__;\n    } else {\n      return self::UPLOAD_DIR;\n    }\n  }\n  \n  private static function getUploadFile($file)\n  {\n    return isset($file['tmp_name']) ? $file['tmp_name'] : (isset($file['bytes']) ? $file['bytes'] : (isset($file['bits']) ? $file['bits'] : ''));\n  }\n\n  \n  private static function getSafeName(&$file)\n  {\n    $file = str_replace(array('\"', '<', '>'), '', $file);\n    $file = str_replace('\\\\', '/', $file);\n    $file = false === strpos($file, '/') ? ('a' . $file) : str_replace('/', '/a', $file);\n    $info = pathinfo($file);\n    $file = substr($info['basename'], 1);\n    return isset($info['extension']) ? strtolower($info['extension']) : '';\n  }\n  private static function getSafeaName(&$name) {\n        $name = str_replace(array('\"', '<', '>'), '', $name);\n        $name = str_replace('\\\\', '/', $name);\n        $name = false === strpos($name, '/') ? ('a' . $name) : str_replace('/', '/a', $name);\n        $info = pathinfo($name);\n        $name = substr($info['basename'], 1);\n        return $name;\n    }\n  \n  private static function getExtentionName(&$name) {\n        $info = pathinfo($name);\n        return isset($info['extension']) ? strtolower($info['extension']) : '';\n    }\n    \n\n  private static function compareVersion($test)\n  {\n    $currentVersion = explode('.', PHP_VERSION);\n    $testVersion = explode('.', $test);\n    $ret = 0;\n    for ($i = 0; $i < sizeof($currentVersion); $i++) {\n      if ($currentVersion[$i] == $testVersion[$i]) {\n        continue;\n      }\n      if ($currentVersion[$i] > $testVersion[$i]) {\n        $ret = 1;\n        break;\n      } else {\n        $ret = -1;\n        break;\n      }\n    }\n    return $ret;\n  }\n  \n  \n  //文章内容分页\n  public static function parseContent($obj,$u,$r,$con){\n\t\t$options = \\Typecho\\Widget::widget('Widget_Options');\n\t\t$db = \\Typecho\\Db::get();\n\t\t$query= $db->select()->from('table.contents')->where('cid = ?', $obj->cid); \n\t\t$row = $db->fetchRow($query);\n\t\t$log_content=$row['text'];\n\t\tif(get_option('Scroll') == 1){\n\t\t    $menutree = 'window.tocManager.displayDisableTocTips = false;window.tocManager.generateToc();';\t\t}\n\t\t$Page_Mark = \"----------\";\n\t\tif(strpos($log_content, $Page_Mark)) $ob = \"Y\";\n\t\tif(isset($ob)){\n\t\t\t$content_list = explode($Page_Mark, $log_content);\n\t\t\t$page_count = count($content_list);\n\t\t\t$page_now = !empty($_GET['page_now']) ? intval($_GET['page_now']) : 1;\n\t\t\t$page_now = ($page_now > $page_count && $page_count>0) ? $page_count : $page_now;\n\t\t\t$log_content = stripslashes($content_list[$page_now -1]);\n\t\t\t\n\t\t\t\t$log_content = '\n\t\t\t\t\t<div id=\"pagearea\"></div>\n\t\t\t\t\t<div id=\"pageBar\"></div>\n\t\t\t\t\t<script>\n\t\t\t\t\tvar curPage;\n\t\t\t\t\tvar totalItem;\n\t\t\t\t\tvar pageSize;\n\t\t\t\t\tvar totalPage;\n\t\t\t\t\t \n\t\t\t\t\t//获取分页数据\n\t\t\t\t\tfunction turnPage(page){\n\t\t\t\t\t  $.ajax({\n\t\t\t\t\t\ttype: \"POST\",\n\t\t\t\t\t\turl: \"'.$options->siteUrl.'/index.php/bs-pagecontent\",\n\t\t\t\t\t\tdata: {\"page_now\":page,\"cid\":\"'.$obj->cid.'\",\"title\":\"'.$obj->title.'\",\"remember\":\"'.$r.'\",\"haslogin\":\"'.$u.'\",\"ArticleType\":\"'.$obj->fields->ArticleType.'\"},\n\t\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t\tbeforeSend: function() {\n\t\t\t\t\t\t  $(\"#pagearea\").append(\"<div class=\\\"ui medium active secondary inline text loader\\\">加载中......</div>\");\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsuccess: function(json) {\n\t\t\t\t\t\t  $(\"#pagearea\").empty();/*移除原来的分页数据*/\n\t\t\t\t\t\t  totalItem = json.totalItem;\n\t\t\t\t\t\t  pageSize = json.pageSize;\n\t\t\t\t\t\t  curPage = page;\n\t\t\t\t\t\t  totalPage = json.totalPage;\n\t\t\t\t\t\t  var data_content = json.log_content;\n\t\t\t\t\t\t  $(\"#pagearea\").append(data_content);\n\n\t\t\t'.$menutree.'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcomplete: function() {    /*添加分页按钮栏*/\n\t\t\t\t\t\t  getPageBar();\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror: function() {\n\t\t\t\t\t\t  alert(\"数据加载失败\");\n\t\t\t\t\t\t}\n\t\t\t\t\t  });\n\t\t\t\t\t}\n\t\t\t\t\t/*获取分页条（分页按钮栏的规则和样式根据自己的需要来设置）*/\n\t\t\t\t\tfunction getPageBar(){\n\t\t\t\t\t  if(curPage > totalPage) {\n\t\t\t\t\t\tcurPage = totalPage;\n\t\t\t\t\t  }\n\t\t\t\t\t  if(curPage < 1) {\n\t\t\t\t\t\tcurPage = 1;\n\t\t\t\t\t  }\n\t\t\t\t\t \n\t\t\t\t\t  pageBar = \"<div class=\\\"ui circular labels\\\"><div style=\\\"text-align:center\\\">\";\n\t\t\t\t\t \n\t\t\t\t\t  /*如果不是第一页*/\n\t\t\t\t\t  if(curPage != 1){\n\t\t\t\t\t\tpageBar += \"<a class=\\\"ui large label\\\" href=\\\"javascript:turnPage(1)\\\">首页</a>&nbsp;\";\n\t\t\t\t\t\tpageBar += \"<a class=\\\"ui large label\\\" href=\\\"javascript:turnPage(\"+(curPage-1)+\")\\\">上一页</a>&nbsp;\";\n\t\t\t\t\t  }\n\t\t\t\t\t \n\t\t\t\t\t  /*显示的页码按钮(5个)*/\n\t\t\t\t\t  var start,end;\n\t\t\t\t\t  if(totalPage <= 5) {\n\t\t\t\t\t\tstart = 1;\n\t\t\t\t\t\tend = totalPage;\n\t\t\t\t\t  } else {\n\t\t\t\t\t\tif(curPage-2 <= 0) {\n\t\t\t\t\t\t\tstart = 1;\n\t\t\t\t\t\t\tend = 5;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif(totalPage-curPage < 2) {\n\t\t\t\t\t\t\t\tstart = totalPage - 4;\n\t\t\t\t\t\t\t\tend = totalPage;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tstart = curPage - 2;\n\t\t\t\t\t\t\t\tend = curPage + 2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t  }\n\t\t\t\t\t  \n\t\t\t\t\t  for(var i=start;i<=end;i++) {\n\t\t\t\t\t\tif(i == curPage) {\n\t\t\t\t\t\t\tpageBar += \"<a class=\\\"ui large grey  label\\\" href=\\\"javascript:turnPage(\"+i+\")\\\">\"+i+\"</a>&nbsp;\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpageBar += \"<a class=\\\"ui large label\\\" href=\\\"javascript:turnPage(\"+i+\")\\\">\"+i+\"</a>&nbsp;\";\n\t\t\t\t\t\t}\n\t\t\t\t\t  }\n\t\t\t\t\t  \n\t\t\t\t\t  /*如果不是最后页*/\n\t\t\t\t\t  if(curPage != totalPage){\n\t\t\t\t\t\tpageBar += \"<a class=\\\"ui large label\\\" href=\\\"javascript:turnPage(\"+(parseInt(curPage)+1)+\")\\\">下一页</a>&nbsp;\";\n\t\t\t\t\t\tpageBar += \"<a class=\\\"ui large label\\\" href=\\\"javascript:turnPage(\"+totalPage+\")\\\">尾页</a>\";\n\t\t\t\t\t  }\n\t\t\t\t\t\tpageBar += \"</div></div>\"; \n\t\t\t\t\t  $(\"#pageBar\").html(pageBar);\n\t\t\t\t\t}\n\t\t\t\t\t \n\t\t\t\t\t/*页面加载时初始化分页*/\n\t\t\t\t\t$(function() {\n\t\t\t\t\t  turnPage(1);\n\t\t\t\t\t});\n\t\t\t\t\t     $(window).bind(\\'popstate\\',function(event) {  \n\t\t\t\t\t     turnPage(1);\n\t\t\t\t\t     });\n\t\t\t\t\t</script>\n\t\t\t\t';\n\t\t\t\treturn $log_content;\n\t\t\t?>\n\t\t\t\t<?php\n\t\t}else{\n\t\t\treturn $con;\n\t\t}\n  }\n  \n  \n  \n  \n  public static function xsscheck($text)\n{\n    $xsscheck = false;\n    $list = array(\n        '/onabort/is',\n        '/onblur/is',\n        '/onchange/is',\n        '/onclick/is',\n        '/ondblclick/is',\n        '/onerror/is',\n        '/onfocus/is',\n        '/onkeydown/is',\n        '/onkeypress/is',\n        '/onkeyup/is',\n        '/onload/is',\n        '/onmousedown/is',\n        '/onmousemove/is',\n        '/onmouseout/is',\n        '/onmouseover/is',\n        '/onmouseup/is',\n        '/onreset/is',\n        '/onresize/is',\n        '/onselect/is',\n        '/onsubmit/is',\n        '/onunload/is',\n        '/eval/is',\n        '/ascript:/is',\n        '/style=/is',\n        '/width=/is',\n        '/width:/is',\n        '/height=/is',\n        '/height:/is',\n        '/src=/is',\n    );\n    if (strip_tags($text)) {\n        for ($i = 0; $i < count($list); $i++) {\n            if (preg_match($list[$i], $text) > 0) {\n                $xsscheck = true;\n                break;\n            }\n        }\n    } else {\n        $xsscheck = true;\n    };\n    return $xsscheck;\n}\n\n/**\n    * PHP获取字符串中英文混合长度 \n    */\n    public static function strLength($str){        \n        preg_match_all('/./us', $str, $match);\n        return count($match[0]);  // 输出9\n    }\n        \n        \n\n    /**\n     * 检查$str中是否含有$words_str中的词汇\n     * \n     */\n    public static function searchArray($keyword, $array) {\n    foreach ($array as $item) {\n        if (preg_match(\"/\\b[a-zA-Z\\x{4e00}-\\x{9fa5}]{$keyword}\\b/\", $item)) {\n            return true;\n        }\n    }\n    return false;\n}\n\n\tpublic static function check_in($words_str, $str)  \n{  \n$words = explode(\"\\n\", $words_str);\n\t\tif (empty($words)) {\n\t\t\treturn false;\n\t\t}\n\t$result = array_filter($words, function($word) use ($str){\n\t\t    if (false !== stripos($str, trim($word))) {\n                return true;\n            }\n            else{\n                return false;\n            }\n\t\t});\n\t\treturn $result;\n\t}\n\n    /**\n     * 检查$ip中是否在$words_ip的IP段中\n     * \n     */\n\tpublic static function check_ip($words_ip, $ip)\n\t{\n\t\t$words = explode(\"\\n\", $words_ip);\n\t\tif (empty($words)) {\n\t\t\treturn false;\n\t\t}\n\t\tforeach ($words as $word) {\n\t\t\t$word = trim($word);\n\t\t\tif (false !== strpos($word, '*')) {\n\t\t\t\t$word = \"/^\".str_replace('*', '\\d{1,3}', $word).\"$/\";\n\t\t\t\tif (preg_match($word, $ip)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (false !== strpos($ip, $word)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n public static function GetRandStr($length){\n $str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n $len = strlen($str)-1;\n $randstr = '';\n for ($i=0;$i<$length;$i++) {\n  $num=mt_rand(0,$len);\n  $randstr .= $str[$num];\n }\n return $randstr;\n}\n public static function secretComment($data, $obj,$last){\n     $text = empty($last)?$data:$last;             \n     $db = \\Typecho\\Db::get();\n     $iscircle = $db->fetchRow($db->select()->from('table.contents')\n                ->where('cid = ? AND template = ?', $obj->cid,'friendcircle.php')->limit(1));   \n    $iscross = $db->fetchRow($db->select()->from('table.contents')\n                ->where('cid = ? AND template = ?', $obj->cid,'cross.php')->limit(1));      \n     $parentid=array();$parentmail=array();//定义初始父级信息数组\n     if($obj->parent>0){//如果拥有父级，则循环将所有父级信息加入数组\n       \n       $parent = $obj->parent;            \n            while ($parent > 0) {\n                $parentRows = $db->fetchRow($db->select()->from('table.comments')\n                ->where('coid = ? AND status = ?', $parent, 'approved')->limit(1));\n                \n                if (!empty($parentRows)) {\n                    $coid = $parent;\n                    $parent = $parentRows['parent'];\n                  array_push($parentid,$parentRows['authorId']);\n                  array_push($parentmail,$parentRows['mail']);\n                } else {\n                    break;\n                }\n            }   \n     }\n     if($iscircle || $iscross){\n         return $text;\n     }\n     \\Typecho\\Widget::widget('Widget_User')->to($user);//获取当前用户信息\n     $stext = $text; \n      if(strpos($text,'@私密@') !== false){\n          if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){\n     $stext = '<beartext class=\"comment-excerpta break bshideContent\">该评论为私密评论，仅已登录者与评论双方可见</beartext>';\n     $text = '<beartext class=\"comment-excerpta break\">'.str_replace(\"@私密@\",\"\",$text).'</beartext>';\n          }\n          else{\n      $stext = '<beartext class=\"comment-excerptb break bshideContent\">该评论为私密评论，仅已登录者与评论双方可见</beartext>';\n     $text = '<beartext class=\"comment-excerptb break\">'.str_replace(\"@私密@\",\"\",$text).'</beartext>';        \n          }\n      \n      \n      \n     \n if (\\Typecho\\Widget::widget('Widget_User')->hasLogin()){\n   if($user->group==\"administrator\"||$user->group==\"editor\"||$user->uid==$obj->authorId||$user->uid==$obj->ownerId||in_array($user->uid,$parentid)){\n       if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){\n       Helper::options()->commentsHTMLTagAllowed='<beartext class=\"comment-excerpta break\">'.Helper::options()->commentsHTMLTagAllowed;\n       }\n       else{\n        Helper::options()->commentsHTMLTagAllowed='<beartext class=\"comment-excerptb break\">'.Helper::options()->commentsHTMLTagAllowed;   \n       }\n     return $text;\n   }else{\n     if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){\n       Helper::options()->commentsHTMLTagAllowed='<beartext class=\"comment-excerpta break bshideContent\">'.Helper::options()->commentsHTMLTagAllowed;\n       }\n       else{\n        Helper::options()->commentsHTMLTagAllowed='<beartext class=\"comment-excerptb break bshideContent\">'.Helper::options()->commentsHTMLTagAllowed;   \n       }\n     return $stext;\n   }\n}else{\n$commentsMail = \\Typecho\\Cookie::get('__typecho_remember_mail');\nif(($obj->mail==$commentsMail && $obj->authorId==0)||(!empty($parentmail) && in_array($commentsMail,$parentmail))){\n    if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){\n       Helper::options()->commentsHTMLTagAllowed='<beartext class=\"comment-excerpta break\">'.Helper::options()->commentsHTMLTagAllowed;\n       }\n       else{\n        Helper::options()->commentsHTMLTagAllowed='<beartext class=\"comment-excerptb break\">'.Helper::options()->commentsHTMLTagAllowed;   \n       }\n    return $text;\n}else{\n    if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){\n       Helper::options()->commentsHTMLTagAllowed='<beartext class=\"comment-excerpta break bshideContent\">'.Helper::options()->commentsHTMLTagAllowed;\n       }\n       else{\n        Helper::options()->commentsHTMLTagAllowed='<beartext class=\"comment-excerptb break bshideContent\">'.Helper::options()->commentsHTMLTagAllowed;   \n       }\n  return $stext;\n} \n }  \n      }\n      \n      \n      else{\n          if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){\n        $text = '<beartext class=\"comment-excerpta break\">'.str_replace(\"@私密@\",\"\",$text).'</beartext>';\n        Helper::options()->commentsHTMLTagAllowed='<beartext class=\"comment-excerpta break\">'.Helper::options()->commentsHTMLTagAllowed;\n          }\n          else{\n           $text = '<beartext class=\"comment-excerptb break\">'.str_replace(\"@私密@\",\"\",$text).'</beartext>';\n        Helper::options()->commentsHTMLTagAllowed='<beartext class=\"comment-excerptb break\">'.Helper::options()->commentsHTMLTagAllowed;   \n          }\n  return $text;\n      }\n     \n   \n   }\n \n\n public static function post_request($url, $postdata) {\n    $data = http_build_query($postdata);\n    $options    = array(\n        'http' => array(\n            'method'  => 'POST',\n            'header'  => \"Content-type: application/x-www-form-urlencoded\",\n            'content' => $data,\n            'timeout' => 5\n        )\n    );\n    $context = stream_context_create($options);\n    $result    = file_get_contents($url, false, $context);\n    if($http_response_header[0] != 'HTTP/1.1 200 OK'){\n        $result = array(\n            \"result\" => \"success\",\n            \"reason\" => \"request geetest api fail\"\n        );\n        return json_encode($result);\n    }else{\n        return $result;\n    }\n}\n \n public static function spam_protection_mathjia(){\n   \n    $num1=rand(1,49);\n    $num2=rand(1,49);\n\n    echo \"<div class=\\\"field\\\">\n    <label class=\\\"required\\\">验证码</label>\n  <input type=\\\"text\\\" name=\\\"sum\\\" class=\\\"text\\\" value=\\\"\\\" size=\\\"10\\\" tabindex=\\\"4\\\" style=\\\"width:180px\\\" placeholder=\\\"$num1 + $num2 = ?\\\">\n</div>\\n\";\n    echo \"<input type=\\\"hidden\\\" name=\\\"num1\\\" value=\\\"$num1\\\">\\n\";\n    echo \"<input type=\\\"hidden\\\" name=\\\"num2\\\" value=\\\"$num2\\\">\\n\";\n    echo \"<input type=\\\"hidden\\\" name=\\\"spam_protection_mathstyle\\\" value=\\\"addition\\\">\";\n}\n\npublic static function spam_protection_mathjian(){\n   \n    $num1=rand(1,49);\n    $num2=rand(1,49);\n\n    echo \"<div class=\\\"field\\\">\n    <label class=\\\"required\\\">验证码</label>\n  <input type=\\\"text\\\" name=\\\"sum\\\" class=\\\"text\\\" value=\\\"\\\" size=\\\"10\\\" tabindex=\\\"4\\\" style=\\\"width:180px\\\" placeholder=\\\"$num1 - $num2 = ?\\\">\n</div>\\n\";\n    echo \"<input type=\\\"hidden\\\" name=\\\"num1\\\" value=\\\"$num1\\\">\\n\";\n    echo \"<input type=\\\"hidden\\\" name=\\\"num2\\\" value=\\\"$num2\\\">\\n\";\n    echo \"<input type=\\\"hidden\\\" name=\\\"spam_protection_mathstyle\\\" value=\\\"subtraction\\\">\";\n}\n\npublic static function spam_protection_question(){\n   $opt = get_option('bearsimple');\n   $rand = mt_rand(0,count($opt['VerifyQuestion'])-1);\n   $rand_key = $opt['VerifyQuestion'][$rand]['VerifyQuestion_key'];\n   $rand_answer = $opt['VerifyQuestion'][$rand]['VerifyQuestion_answer'];\n   $rand_answer_tipshow = $opt['VerifyQuestion'][$rand]['VerifyQuestion_showtip'];\n   $rand_answer_tipshow_text = $opt['VerifyQuestion'][$rand]['VerifyQuestion_showtiptext'];\n   if($rand_answer_tipshow == true){\n     echo \"<div class=\\\"field\\\">\n    <label class=\\\"required\\\">验证问答</label>\n    <div class=\\\"ui input\\\">\n  <input type=\\\"text\\\" placeholder=\\\"$rand_key\\\" name=\\\"answer\\\">\n \n</div><br>\n<div style=\\\"margin-top:5px;margin-bottom:5px;font-weight:bold;\\\"><a id=\\\"answerhide\\\">显示答案提示</a>\n  <a id=\\\"answershow\\\" style=\\\"display:none;\\\">隐藏答案提示</a>\n  <span class=\\\"answer\\\" style=\\\"display:none;\\\">\n    「答案提示:$rand_answer_tipshow_text 」</span></div>\n</div>\";  \n   }\n   else{\n    echo \"<div class=\\\"field\\\">\n    <label class=\\\"required\\\">验证问答</label>\n    <div class=\\\"ui input\\\">\n  <input type=\\\"text\\\" placeholder=\\\"$rand_key\\\" name=\\\"answer\\\">\n \n</div><br>\n<div style=\\\"margin-top:5px;margin-bottom:5px;font-weight:bold;\\\"><a id=\\\"answerhide\\\">显示答案</a>\n  <a id=\\\"answershow\\\" style=\\\"display:none;\\\">隐藏答案</a>\n  <span class=\\\"answer\\\" style=\\\"display:none;\\\">\n    「答案:$rand_answer 」</span></div>\n</div>\";\n}\n self::getSecurity('set','__typecho_comment_question_answer',$rand_answer);\n}\n \npublic static  function authToken($string, $operation = 'DECODE', $key = '', $expiry = 0) { \n    $opurl = Helper::options()->siteUrl; \n  $ckey_length = 4;  \n  $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);  \n  $keya = md5(substr($key, 0, 16));  \n  $keyb = md5(substr($key, 16, 16));  \n  $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): \nsubstr(md5(microtime()), -$ckey_length)) : '';  \n  $cryptkey = $keya.md5($keya.$keyc);  \n  $key_length = strlen($cryptkey);  \n  $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : \nsprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;  \n  $string_length = strlen($string);  \n  $result = '';  \n  $box = range(0, 255);  \n  $rndkey = array();  \n  for($i = 0; $i <= 255; $i++) {  \n    $rndkey[$i] = ord($cryptkey[$i % $key_length]);  \n  }  \n  for($j = $i = 0; $i < 256; $i++) {  \n    $j = ($j + $box[$i] + $rndkey[$i]) % 256;  \n    $tmp = $box[$i];  \n    $box[$i] = $box[$j];  \n    $box[$j] = $tmp;  \n  }  \n  for($a = $j = $i = 0; $i < $string_length; $i++) {  \n    $a = ($a + 1) % 256;  \n    $j = ($j + $box[$a]) % 256;  \n    $tmp = $box[$a];  \n    $box[$a] = $box[$j];  \n    $box[$j] = $tmp;  \n    $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));  \n  }  \n  if($operation == 'DECODE') { \n    if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && \nsubstr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {  \n      return substr($result, 26);  \n    } else {  \n      return '';  \n    }  \n  } else {  \n    return $keyc.str_replace('=', '', base64_encode($result));  \n  }  \n}\n\n public static function getSecurityToken($type = NULL){\n     $str = mt_rand(100001,999999); \n     $key = Helper::options()->siteUrl; \n     $securityToken = self::authToken($str,'ENCODE',$key,0);\n     if($type == 'html'){\n     echo \"<input type=\\\"hidden\\\" name=\\\"SecurityToken\\\"  id=\\\"SecurityToken\\\" value='\".$securityToken.\"'>\\n\";\n     }\n     self::getSecurity('set','__typecho_security_token',$securityToken);\n }\n \n public static function getIpLocation($ip){\n     $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n     if($options['Comment_ipget_data_choose'] == 2 && $options['Comment_ipget_data_tencent_key'] !== ''){\n         if(trim($options['Comment_ipget_data_tencent_sign']) !== ''){\n             $md5 = md5('/ws/location/v1/ip?ip='.$ip.'&key='.$options['Comment_ipget_data_tencent_key'].$options['Comment_ipget_data_tencent_sign']);\n             $url = 'https://apis.map.qq.com/ws/location/v1/ip?key='.$options['Comment_ipget_data_tencent_key'].'&ip='.$ip.'&sig='.$md5;\n         }\n         else{\n        $url = 'https://apis.map.qq.com/ws/location/v1/ip?key='.$options['Comment_ipget_data_tencent_key'].'&ip='.$ip;\n         }\n$headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0)';\n\nforeach( $headers as $n => $v )\n{ $headerArr[] = $n .':' . $v; }\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url); \ncurl_setopt($ch, CURLOPT_USERAGENT, $headerArr);\ncurl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);\ncurl_setopt($ch, CURLOPT_TIMEOUT, 10);\ncurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\ncurl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n$response = curl_exec($ch);\ncurl_close($ch);\n   $info = json_decode($response,true)['result']['ad_info'];\n   $nation = $info['nation'];\n   $province = $info['province'];\n   $city = $info['city'];\n   $district = $info['district'];\n   if($nation !== NULL){\n   return $nation.$province.$city.$district;\n   }\n   else{\n   return '天外来客';    \n   }\n     }\n     else{\n$url = 'https://ip.zxinc.org/api.php?type=json&ip='.$ip;\n$headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0)';\n\nforeach( $headers as $n => $v )\n{ $headerArr[] = $n .':' . $v; }\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, $url); \ncurl_setopt($ch, CURLOPT_USERAGENT, $headerArr);\ncurl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);\ncurl_setopt($ch, CURLOPT_TIMEOUT, 10);\ncurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\ncurl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n$response = curl_exec($ch);\ncurl_close($ch);\n    \n    $info = json_decode($response,true)['data']['country'];\n    if($info == null){\n    $info = '未知';    \n    }\n      return $info;\n     }\n     \n  \n     }\n\n\n  /**\n     * 智能过滤\n     * \n     */\n     \n    public static function getLastCommentTimeByIp($ipAddress) {\n    \t$db = \\Typecho\\Db::get();\n    $ipFind = $db->fetchRow($db->select()->from('table.comments')->where('table.comments.ip = ?', $ipAddress)->order('table.comments.created', \\Typecho\\Db::SORT_DESC));;\n    if($ipFind){\n        return $ipFind['created'];\n    }\n    return 0;\n}\n\n    public static function containsHiddenCharacters($str) {\n    $hiddenChars = [\n        \"\\x01\", // SOH (Start of Heading)\n        \"\\x02\", // STX (Start of Text)\n        \"\\x03\", // ETX (End of Text)\n        \"\\x04\", // EOT (End of Transmission)\n        \"\\x05\", // ENQ (Enquiry)\n        \"\\x06\", // ACK (Acknowledge)\n        \"\\x07\", // BEL (Bell)\n        \"\\x08\", // BS (Backspace)\n        \"\\x09\", // HT (Horizontal Tab)\n        \"\\x0A\", // LF (Line Feed)\n        \"\\x0B\", // VT (Vertical Tab)\n        \"\\x0C\", // FF (Form Feed)\n        \"\\x0D\", // CR (Carriage Return)\n        \"\\x0E\", // SO (Shift Out)\n        \"\\x0F\", // SI (Shift In)\n        \"\\x10\", // DLE (Data Link Escape)\n        \"\\x11\", // DC1 (Device Control 1)\n        \"\\x12\", // DC2 (Device Control 2)\n        \"\\x13\", // DC3 (Device Control 3)\n        \"\\x14\", // DC4 (Device Control 4)\n        \"\\x15\", // NAK (Negative Acknowledge)\n        \"\\x16\", // SYN (Synchronous Idle)\n        \"\\x17\", // ETB (End of Transmission Block)\n        \"\\x18\", // CAN (Cancel)\n        \"\\x19\", // EM (End of Medium)\n        \"\\x1A\", // Substitute character\n        \"\\x1B\", // ESC (Escape)\n        \"\\x1C\", // File Separator\n        \"\\x1D\", // Group Separator\n        \"\\x1E\", // Record Separator\n        \"\\x1F\"  // Unit Separator\n    ];\n\n    foreach ($hiddenChars as $char) {\n        if (strpos($str, $char) !== false) {\n            return true;\n        }\n    }\n\n    return false;\n}\n    public static function isUrl($text) {\n    //$urlPattern = '/^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$/';\n    //return preg_match($urlPattern, $text);\n    $urlPattern = '/\\b(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?\\b/';\n    return preg_match($urlPattern, $text);\n}\n\n\tpublic static function isBotComment($comment, $timeSinceLastComment = 60){\n\t//一些常见的机器人用户代理字符串\n    $botUserAgents = [\n        'bot',\n        'crawl',\n        'spider',\n        'robot',\n        'crawling',\n        'fetch',\n        'indexing',\n        'mediapartners'\n    ];\n\n    // 检查用户代理是否包含机器人关键词\n    foreach ($botUserAgents as $botKeyword) {\n        if (stripos($comment['agent'], $botKeyword) !== false) {\n            return true;\n        }\n    }\n\n    // 检查评论内容是否过于简单或重复\n    if (strlen($comment['text']) < 10 || preg_match('/^\\s*$/', $comment['text'])) {\n        return true;\n    }\n\n    // 检查IP地址是否在短时间内发送了多个评论\n    $lastCommentTime = self::getLastCommentTimeByIp($comment['ip']);\n    if ($lastCommentTime && (time() - $lastCommentTime) < $timeSinceLastComment) {\n        return true;\n    }\n    // 检查评论内容是否包含隐藏字符\n    if (self::containsHiddenCharacters($comment['text'])) {\n        return true;\n    }\n    // 检查评论昵称是否包含网址\n    if (self::isUrl($comment['author'])) {\n        return true;\n    }\n    // 如果以上条件都不满足，则认为不是机器人评论\n    return false;\n\t}\n\t\n\t\n public static function filter($comment,$post){\n $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n $db = \\Typecho\\Db::get();\n $removeChar = [\"https://\", \"http://\"]; \nif (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, \"\", Helper::options()->siteUrl)) == false ) { \n    throw new \\Typecho\\Widget\\Exception(\"抱歉，检测到来源错误，请在正确的页面进行评论。\",200);\n}\nif($_POST['SecurityToken'] !== $_SESSION['token'] && !$_POST['vtype']){\n    throw new \\Typecho\\Widget\\Exception(\"抱歉，安全检测未通过，请刷新页面后重新进行评论。\",200);\n}\n if(Plugin::xsscheck($comment['text'])) {\n\t\t\t\\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的评论包含危险内容，请返回修改后再试。\",200);\n        }\n$comment['url'] =htmlspecialchars($comment['url'],ENT_QUOTES,'UTF-8');\n        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) {\n    throw new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的评论包含危险内容，请返回修改后再试。\", 200);                      \n}\n if(!$_POST['vtype'] && $_POST['vtype'] !== 'cross' && $_POST['vtype'] !== 'friendcircle' && $_POST['vtype'] !== 'circlecomment'){ //判断POST过来的vtype字段是否为指定类型或为空\n \n\n         if (strlen(trim(preg_replace('/\\xc2\\xa0/',' ',$comment['text']))) == 0) {\n\t\t\t\\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的评论内容只有空格，请返回修改后再试。\",200);\n            }\n         if($options['BearSpam_Auto'] == true){\n        if (self::isBotComment($comment)) {\n              throw new \\Typecho\\Widget\\Exception(\"抱歉，本条评论被判定为机器人评论，已自动拦截。\",200);  \n            }\n            }   \n      \n        if($options['BearSpam_Pro'] == true){\n        if (!empty($options['BearSpam_IP'])) {\n\t\t\tif (Plugin::check_ip($options['BearSpam_IP'], $comment['ip'])) {\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的IP处于屏蔽范围内，已拦截本条评论。\",200);\n\t\t\t  \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}\n\n            \n        }\n\t\tif (!empty($options['BearSpam_EMAIL'])) {\n\t\t\tif (Plugin::check_in($options['BearSpam_EMAIL'], $comment['mail'])) {\n\t\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的邮箱处于屏蔽范围内，已拦截本条评论。\",200);\n\t\t\t\t  \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}\n\t\t}\n\t\t\n\t\t\tif (!empty($options['BearSpam_NAME'])) {\n\t\t\tif (Plugin::check_in($options['BearSpam_NAME'], $comment['author'])) {\n\t\t\t    \n\t\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的昵称存在敏感禁止词汇，已拦截本条评论。\",200);\n\t\t\t\t  \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!empty($options['BearSpam_URL'])) {\n\t\t\tif (Plugin::check_in($options['BearSpam_URL'], $comment['url'])) {\n\t\t\t    \t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的网址处于屏蔽范围内，已拦截本条评论。\",200);\n\t\t\t\\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!empty($options['BearSpam_ArticleTitle'])&& $options['BearSpam_ArticleTitle'] == \"1\") {\n\t\t\t$db = \\Typecho\\Db::get();\n            // 获取评论所在文章\n            $pot = $db->fetchRow($db->select('title')->from('table.contents')->where('cid = ?', $comment['cid']));        \n            if(strstr($comment['text'], $pot['title'])){\n                \t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的评论内容疑似存在灌水内容，已自动拦截。\",200);\n\\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!empty($options['BearSpam_NAMEMIN'])) {    \n            if(Plugin::strLength($comment['author']) < $options['BearSpam_NAMEMIN']){\n\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的评论昵称过短，已自动拦截。\",200);\n\t\t\t\\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!empty($options['BearSpam_NAMEMAX'])) {    \n            if (Plugin::strLength($comment['author']) > $options['BearSpam_NAMEMAX']) {\n                throw new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的评论昵称过长，已自动拦截。\",200);\n\t\t\t\\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}}\n\t\t\t\n\t\t\tif (!empty($options['BearSpam_NAMEURL'])&& $options['BearSpam_NAMEURL'] == \"1\") {    \n            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) {\n\t\t\t                throw new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的评论昵称异常，已自动拦截。\",200);\n\t\t\t\\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}}\n\t\t\t\n\t\t\tif (!empty($options['BearSpam_Chinese'])&& $options['BearSpam_Chinese'] == \"1\") {    \n            if (preg_match(\"/[\\x{4e00}-\\x{9fa5}]/u\", $comment['text']) == 0) {\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的评论内容不包含中文，已自动拦截。\",200);\n\t\t\t\\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}}\n\t\t\t\n\t\t\tif (!empty($options['BearSpam_MIN'])) {    \n            if(Plugin::strLength($comment['text']) < $options['BearSpam_MIN']){         \n\t\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的评论内容字数过少，已自动拦截。\",200);\n\t\t\t\\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}}\n\t\t\t\n\t\t\tif (!empty($options['BearSpam_MAX'])) {    \n            if(Plugin::strLength($comment['text']) > $options['BearSpam_MAX']){         \n\t\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的评论内容字数过多，已自动拦截。\",200);\n\t\t\t\\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}}\n\t\t\t\n\t\t\tif (!empty($options['BearSpam_Words'])) {    \n            if (Plugin::check_in($options['BearSpam_Words'], $comment['text'])) { \n\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的评论内容包含敏感禁止词汇，已自动拦截。\",200);\n\t\t\t\\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\t}\n\t\t\t\t\t    \n\t\t\t}\n        }\n         if ($options['VerifyChoose'] == '22-2'){\n            $answer = $_POST['answer'];\n            $ganswer = self::getSecurity('get','__typecho_comment_question_answer');\n             switch($answer){\n        case $ganswer:\n        break;\n        case null:\n        throw new \\Typecho\\Widget\\Exception('对不起，请输入验证码。',200);\n        break;\n        default:\n        throw new \\Typecho\\Widget\\Exception('对不起，验证码错误，请重试。',200);\n           \n         }\n         }\n       if ($options['VerifyChoose'] == '1' || $options['VerifyChoose'] == '11'){\n           $sum = $_POST['sum'];\n           switch($_POST['spam_protection_mathstyle']){\n               case 'addition':\n                   switch($sum){\n        case $_POST['num1'] + $_POST['num2']:\n        break;\n        case null:\n        throw new \\Typecho\\Widget\\Exception('对不起，请输入验证码。',200);\n        break;\n        default:\n        throw new \\Typecho\\Widget\\Exception('对不起，验证码错误，请重试。',200);\n    }\n                   break;\n               case 'subtraction':\n                    switch($sum){\n        case $_POST['num1'] - $_POST['num2']:\n        break;\n        case null:\n        throw new \\Typecho\\Widget\\Exception('对不起，请输入验证码。',200);\n        break;\n        default:\n        throw new \\Typecho\\Widget\\Exception('对不起，验证码错误，请重试。',200);\n    }\n                   break;\n           }\n       } \n      if ($options['VerifyChoose']== '2-2' && !empty($options['turnstile_key']) && !empty($options['turnstile_secretkey']) && $options['backendVerify_Turnstile'] == true) {\n     if(empty($_POST['cf-turnstile-response'])){\n         \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的验证密钥已失效，需重新验证！\",200); \n     }\n     elseif (isset($_POST['cf-turnstile-response'])) {\n$response_data = self::getTurnstileResult($_POST['cf-turnstile-response'], $options['turnstile_secretkey']);\nif ($response_data['success']) {\n                if ($response_data['action'] == 'comment') {\n                    return $comment;\n                } else {\n                    \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n                    throw new Typecho_Widget_Exception(_t(self::getTurnstileResultMsg('场景验证失败')),200);\n                }\n            } else {\n                \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n                throw new Typecho_Widget_Exception(_t(self::getTurnstileResultMsg($response_data)),200);\n            }\n        } else {\n            \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n            throw new Typecho_Widget_Exception(_t('加载验证码失败, 请检查你的网络'),200);\n        }\n\n }\n \n \n        if ($options['VerifyChoose']== '2' && !empty($options['vid']) && !empty($options['vkey']) && $options['backendVerify_Vaptcha'] == true) {\n     if(empty($_POST['vaptcha_server']) || empty($_POST['vaptcha_token'])){\n         \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的验证密钥已失效，需重新验证！\",200); \n     }\n $url = $_POST['vaptcha_server'];\n $data = array(\n     'id'=> $options['vid'],\n     'secretkey' => $options['vkey'],\n     'scene'=> '1',\n     'token'=> $_POST['vaptcha_token'],\n     'ip'=> $comment['ip']\n     );\n    $ch = curl_init();  \n    curl_setopt($ch,CURLOPT_URL,$url);\n    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);  \n    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,3);  \n    curl_setopt($ch, CURLOPT_POST, 1);\n    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type'=>'application/json'));\n    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n    $handles = curl_exec($ch);  \n    curl_close($ch);  \n    $result = json_decode($handles,true);\n    if($result['success'] == 0){\n        \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，您未通过人机验证，原因:\".$result['msg'],200);\n    }\n }\n  if ($options['VerifyChoose']== '2-3' && !empty($options['geeid']) && !empty($options['geekey']) && $options['backendVerify_Geetest'] == true) {\n      $captcha_id = $options['geeid'];\n$captcha_key = $options['geekey'];\n$api_server = \"https://gcaptcha4.geetest.com\";\n$lot_number = $_POST['lot_number'];\n$captcha_output = $_POST['captcha_output'];\n$pass_token = $_POST['pass_token'];\n$gen_time = $_POST['gen_time'];\n$sign_token = hash_hmac('sha256', $lot_number, $captcha_key);\n$query = array(\n    \"lot_number\" => $lot_number,\n    \"captcha_output\" => $captcha_output,\n    \"pass_token\" => $pass_token,\n    \"gen_time\" => $gen_time,\n    \"sign_token\" => $sign_token\n);\n$url = sprintf($api_server . \"/validate\" . \"?captcha_id=%s\", $captcha_id);\n$res = self::post_request($url,$query);\n$obj = json_decode($res,true);\n\nif($obj['status'] == 'success' && $obj['result'] == 'fail'){\n    \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，您未通过人机验证，原因:\".$obj['reason'],200);\n}\nif($obj['status'] == 'error' && $obj['code']){\n    \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，您未通过人机验证，错误码:\".$obj['code'].\"，原因:\".$obj['msg'],200);\n}\n\n  }\n if ($options['VerifyChoose']== '2-1' && !empty($options['dx_domain']) && !empty($options['dx_appId']) && !empty($options['dx_appSecret']) && $options['backendVerify_Dingxiang'] == true) {\n     \n     if(empty($_POST['dx_token'])){\n         \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，系统检测到您的验证密钥已失效，需重新验证！\",200); \n     }\n   $appId = $options['dx_appId'];\n$appSecret = $options['dx_appSecret'];\n$client = new CaptchaClient($appId,$appSecret);\n$client->setTimeOut(2);\n$client->setCaptchaUrl(\"https://\".$options['dx_domain'].\"/api/tokenVerify\");\n$response = $client->verifyToken($_POST['dx_token']);\nif(!$response->result){\n    \\Typecho\\Cookie::set('__typecho_remember_text', $comment['text']);\n\t\t\tthrow new \\Typecho\\Widget\\Exception(\"抱歉，您未通过人机验证，请返回重试。\",200);\n}\n }\n \n            \\Typecho\\Cookie::delete('__typecho_remember_text');\n            if(empty($comment['mail'])){\n                $comment['mail'] = self::GetRandStr(17).'@privatemail.com';\n                \\Typecho\\Cookie::set('__typecho_remember_mail', $comment['mail']);\n            }\n            if($_POST['privatecomment'] == 'on'){\n                $comment['text'] = '@私密@'.$comment['text'];\n            }\n            \n }\n\n\n        return $comment;\n }\n\npublic static function filter2($comment)\n    {\n        $options = get_option('bearsimple');\n      $db = \\Typecho\\Db::get();\n if ($options['Comment_ipget'] == true && $options['Comment_ipget_data'] == true){\n     $ip = array(\n                'coid' => $comment->coid,\n                'location' => self::getIpLocation($comment->ip),\n            );\n            $db->query($db->insert('table.bscore_iplocation_data')->rows($ip));\n     \n }\n if($_POST['vtype'] == 'friendcircle'){\n     if($_POST['getRead'] == 'on'){\n         $private = true;\n     }\n     else{\n         $private = false;\n     }\n     if($_POST['resources']){\n      $_POST['resources'] = json_encode(explode(',',$_POST['resources']));   \n     }\n     $circle_data = array(\n                'coid' => $comment->coid,\n                'location' => $_POST['getMapInput'],\n                'private' => $private,\n                'resources' => $_POST['resources'],\n            );\n    $db->query($db->insert('table.bscore_friendcircle_data')->rows($circle_data));\n }\nreturn true; \n\n           \n    }\n    private static function getTurnstileResult($turnstile_response, $secretKey)\n    {\n        $beforeload = array('secret' => $secretKey, 'response' => $turnstile_response);\n        $beforeload['remoteip'] = $_SERVER['REMOTE_ADDR'];\n        $stream = stream_context_create(array(\n            'http' => array(\n                'method' => 'POST',\n                'content' => http_build_query($beforeload)\n            )\n        ));\n        $response = file_get_contents(\"https://challenges.cloudflare.com/turnstile/v0/siteverify\", false, $stream);\n        $response = json_decode($response, true);\n        return $response;\n    }\n\n    private static function getTurnstileResultMsg($resp)\n    {\n        if ($resp['success'] == true) {\n            return '验证通过';\n        } else {\n            switch (strtolower($resp['error-codes'][0])) {\n                case 'missing-input-response':\n                    return '请先完成验证';\n\n                case 'invalid-input-response':\n                    return '验证无效或已过期';\n\n                case 'timeout-or-duplicate':\n                    return '验证密钥已被使用, 请重新验证';\n\n                case 'bad-request':\n                    return '呜呜呜验证失败了,要不 再试一次?';\n\n                case 'internal-error':\n                    return '验证服务器寄了, 再试一次吧';\n\n                case 'missing-input-secret':\n                case 'invalid-input-secret':\n                    return '未设置或设置了无效的 secretKey';\n\n                default:\n                    return '还请再试一次！';\n            }\n        }\n    }\n    \n //文件缓存\n \npublic static function getCache_file(){\n        $req = \\Typecho\\Request::getInstance();\n        $url = $req->getRequestUri();\n\n\n        if(!$req->isGet()){\n            return;\n        }\n        if(strstr($url,'/action/') !== false || strstr($url,'/admin/') !== false){\n            \n            return;\n        }\n\n        $hash = md5($url);\n\n        @$settings = bsOptions::getInstance()::get_option( 'bearsimple' );\n        if(!$settings) return;\n\n\n        $cache_timeout = intval($settings['cache_timeout']);\n\n        $cache_root = $settings['cache_dir'];\n        if(strstr($cache_root, '/') !== 0 ){\n            $cache_root = __TYPECHO_ROOT_DIR__.'/usr/'.$cache_root;\n        }\n\n        if($cache_timeout <= 0){\n            $cache_timeout = 60; //1min\n        }\n\n        $file = self::hash2dir($hash,$cache_root).$hash.\".gz\";\n        if(file_exists($file)){\n            $filetime = filemtime($file);\n            if($filetime !== false && time() - $filetime < $cache_timeout){\n                $fh = fopen($file, \"rb\");\n                $content = fread($fh,filesize ($file));\n                fclose($fh);\n                $html = gzuncompress($content);\n                echo $html;\n                exit(0);\n            }\n        }else{\n        \n        }\n    }\n\n    public static function setCache_file(){\n        $req = \\Typecho\\Request::getInstance();\n        $url = $req->getRequestUri();\n        \n        if(!$req->isGet()){\n            return;\n        }\n        if(strstr($url,'/action/') !== false || strstr($url,'/admin/') !== false){\n            return;\n        }\n       $_routingTable = Helper::options()->routingTable;\n        $post_regx = $_routingTable[0]['post']['regx'];\n        if (array_key_exists('TePass', \\Typecho\\Plugin::export()['activated'])){\n        if (preg_match($post_regx,$path,$arr)){\n            if ($arr[1] and !empty($arr[1])){\n                $db = \\Typecho\\Db::get();\n                try {\n\t\t    $database = $db->getConfig($db::READ)['database'];\n                    $tepass_exist = $db->fetchRow($db->select()->from('information_schema.TABLES')->where('TABLE_NAME = ?',$db->getPrefix().'tepass_posts')->where('TABLE_SCHEMA = ?',$database));\n                    if (isset($tepass_exist) and count($tepass_exist) > 0){\n                          $p_id = $db->fetchObject($db->select('id')->from('table.tepass_posts')->where('post_id = ?',$arr[1]))->id;\n                          if ($p_id) return;\n                    }\n\n                }catch (Typecho_Db_Query_Exception $e){\n                  \n                }\n\n            }\n        }\n        }\n        \n        @$settings = bsOptions::getInstance()::get_option( 'bearsimple' );\n        if(!$settings) return;\n        $cache_root = $settings['cache_dir'];\n        if(strstr($cache_root, '/') !== 0 ){\n            $cache_root = __TYPECHO_ROOT_DIR__.'/usr/'.$cache_root;\n        }\n\n        $hash = md5($url);\n        $file = self::hash2dir($hash,$cache_root).$hash.\".gz\";\n        $dir = dirname($file);\n\n        if(!file_exists($dir)){\n            $ret = mkdir($dir,0777,true);\n            if(!$ret){\n                return;\n            }\n        }\n\n        $html = ob_get_contents();\n        $html_gz = gzcompress($html);\n        $fp = fopen($file, 'w');\n        fwrite($fp, $html_gz);\n        fclose($fp);\n    }\n\n    private static function hash2dir($hash,$base_dir=\"\"){\n        $dir=\"\";\n        for($i = 0; $i < strlen($hash) ; $i+=2){\n            $dir = $dir.\"/\".substr($hash, $i, 2);\n        }\n        return rtrim($base_dir,'/').$dir.'/';\n    }\n \n \n //代码高亮\n     public static function headlink($cssUrl) {\n        \n        $options = Helper::options();\n    \n        $dir = $options->themeUrl.'/';\n   \n    if(bsOptions::getInstance()::get_option('bearsimple' )['Codehightlight'] == true){\n        $style = bsOptions::getInstance()::get_option('bearsimple' )['code_style'];\n        if(empty($style)){\n            $style = 'coy.css';\n        }\n        else{\n       $style = bsOptions::getInstance()::get_option( 'bearsimple' )['code_style'];\n        }\n        $cssUrl = $dir.'modules/codehightlight/static/styles/' . $style.'?v=2.9.9';\n        $playerUrl = $dir.'assets/vendors/player/player.min.css?v=2.3.4';\n        $mp3Url = $dir.'assets/vendors/mp3/mp3.min.css?v=2.3.4';\n    \n        echo '<link rel=\"stylesheet\" type=\"text/css\" href=\"' . $cssUrl . '\" />';\n        echo '<link rel=\"stylesheet\" type=\"text/css\" href=\"' . $playerUrl . '\" />';\n        echo '<link rel=\"stylesheet\" type=\"text/css\" href=\"' . $mp3Url . '\" /><script>var APlayers = [];var APlayerOptions = [];</script>';\n        \n    }\n    \n    }\n\n    /**\n     * 底部脚本\n     *\n     * @access public\n     * @param unknown $footlink\n     * @return unknown\n     */\n    public static function footlink() {\n      $options = Helper::options();\n        $dir = $options->themeUrl.'/';\n\n\n  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'])){\n      echo <<<HTML\n  <script src=\"{$dir}assets/vendors/player/hls.min.js\"></script>\nHTML;\n  }\n  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'])){\n      echo <<<HTML\n  <script src=\"{$dir}assets/vendors/player/flv.min.js\"></script>\nHTML;\n  }\n  echo <<<HTML\n    <script src=\"{$dir}assets/vendors/player/player.min.js?v=2.3.4\" type=\"text/javascript\"></script>\n    <script src=\"{$dir}assets/vendors/player/load-player.js\" type=\"text/javascript\"></script>\n    <script src=\"{$dir}assets/vendors/mp3/mp3.min.js?v=2.3.4\"></script>\n    <script src=\"{$dir}assets/vendors/mp3/load-mp3.js?v=2.3.4\"></script>\n    <script type=\"text/javascript\">\n    $(document).on('pjax:complete', function () {\n    loadDPlayer();\n    loadAPlayer();\n    });\n    </script>\nHTML;\n\nif(bsOptions::getInstance()::get_option('bearsimple')['seo_push'] == true && bsOptions::getInstance()::get_option('bearsimple')['seotabs']['baidu_token'] !== ''){\n        echo PHP_EOL.'<script>\n(function(){\n  var bp = document.createElement(\"script\");\n  var curProtocol = window.location.protocol.split(\":\")[0];\n  if (curProtocol === \"https\"){\n    bp.src = \"https://zz.bdstatic.com/linksubmit/push.js\";\n  }else{\n    bp.src = \"http://push.zhanzhang.baidu.com/push.js\";\n  }\n    var s = document.getElementsByTagName(\"script\")[0];\n    s.parentNode.insertBefore(bp, s);\n})();\n</script>'.PHP_EOL;\n}\nif(bsOptions::getInstance()::get_option('bearsimple')['AdControl'] == true && bsOptions::getInstance()::get_option('bearsimple')['AdControl_Google'] == true){\necho '<script async src=\"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>';\n}\n    }\n    \n    \n    /**解析表情**/\npublic static function getEmo($comment){\n    $options = Helper::options();\n    $Temoptions = get_option('bearsimple');\n        $opts = array(\n  'http'=>array(\n   'method' => 'GET',\n          'header' => 'Content-type: application/json',\n          'timeout' => 60 * 10,\n       'Connection'=>\"close\"\n  )\n);\n$context = stream_context_create($opts);\n\n        if($Temoptions['Emoji_HideDefault'] == false || $Temoptions['Emoji_HideDefault'] == ''){\n        $res = json_decode(file_get_contents(str_replace(\"/plugins\",\"\",dirname(__DIR__)).'/themes/bearsimple/assets/vendors/bs-emoji/bs-emoji.json', false, $context),true);\n        $emo = $res;\n        }\n        if($Temoptions['Emoji_Diy'] == true && $Temoptions['Emoji_DiyUrl'] !== ''){\n        $res2 = json_decode(file_get_contents($Temoptions['Emoji_DiyUrl'], false, $context),true);\n        if($Temoptions['Emoji_HideDefault'] == false || $Temoptions['Emoji_HideDefault'] == ''){\n        $emo = array_merge($res,$res2);\n        }\n        else{\n        $emo = $res2;    \n        }\n        }\n        \n        \n\n\n    foreach ($emo as $v){\n        if($v['category'] !== ''){\n                if($type == 'comment'){\n                $comment = str_replace($v['data'], '<img width=\"30\" height=\"30\" src='.$v['icon'] .''.' loading=\"lazy\">', $comment);\n                }\n                elseif($type == 'reply'){\n                $comment = str_replace($v['data'], '<img width=\"20\" height=\"20\" src='.$v['icon'] .''.' loading=\"lazy\">', $comment);\n                }\n                else{\n                $comment = str_replace($v['data'], '<img width=\"30\" height=\"30\" src='.$v['icon'] .''.' loading=\"lazy\">', $comment);                    \n                }\n        }\n    }\n    //当评论没有私密评论时去除私密评论识别标签\n    $comment = str_replace('@私密@', '', $comment);\n    return $comment;\n}\n\n    //邮件\n    public static function parseCommentMark($comments,$comment,$status)\n    {\n        $options = \\Typecho\\Widget::widget('Widget_Options');\n        $Temoptions = get_option('bearsimple');\n        if($status == 'approved'){\n        $cfg = array(\n            'siteTitle' => $options->title,\n            'timezone'  => $options->timezone,\n            'cid'       => $comment->cid,\n            'coid'      => $comment->coid,\n            'created'   => $comment->created,\n            'author'    => $comment->author,\n            'authorId'  => $comment->authorId,\n            'ownerId'   => $comment->ownerId,\n            'mail'      => $comment->mail,\n            'ip'        => $comment->ip,\n            'title'     => $comment->title,\n            'text'      => self::getEmo($comment->text),\n            'permalink' => $comment->permalink,\n            'status'    => $status,\n            'parent'    => $comment->parent,\n            'manage'    => $options->adminUrl . \"/manage-comments.php\"\n        );\n    self::$_isMailLog = in_array('4', $Temoptions['CommentNotify__OtherSetting']) ? true : false;\n        if($_POST['accept'] == 'on'){\n            $cfg['banMail'] = 1;\n        }\n        else{\n            $cfg['banMail'] = 0;\n        }\n\n        $fileName = \\Typecho\\Common::randString(12);\n        $cfg      = (object)$cfg;\n        file_put_contents(dirname(__FILE__) . '/cache/' . $fileName, serialize($cfg));\n        $url = ($options->rewrite) ? $options->siteUrl : $options->siteUrl . 'index.php';\n        $url = rtrim($url, '/') . '/action/' . self::$action . '?send=' . $fileName;\n\n        $date = new \\Typecho\\Date(\\Typecho\\Date::gmtTime());\n        $time = $date->format('Y-m-d H:i:s');\n\n        self::saveLog(\"{$time} 开始发送请求：{$comment->parent}{$url}\\n\");\n        self::asyncRequest($url);\n    }\n    }\n    /**\n     * 获取邮件内容\n     *\n     * @access public\n     * @param $comment 调用参数\n     * @return void\n     */\n    public static function parseComment($comment)\n    {\n        $options = \\Typecho\\Widget::widget('Widget_Options');\n        $Temoptions = get_option('bearsimple');\n        if($_POST['vtype'] == 'friendcircle'){\n         return true;   \n        }\n        $cfg = array(\n            'siteTitle' => $options->title,\n            'timezone'  => $options->timezone,\n            'cid'       => $comment->cid,\n            'coid'      => $comment->coid,\n            'created'   => $comment->created,\n            'author'    => $comment->author,\n            'authorId'  => $comment->authorId,\n            'ownerId'   => $comment->ownerId,\n            'mail'      => $comment->mail,\n            'ip'        => $comment->ip,\n            'title'     => $comment->title,\n            'text'      => self::getEmo($comment->text),\n            'permalink' => $comment->permalink,\n            'status'    => $comment->status,\n            'parent'    => $comment->parent,\n            'manage'    => $options->adminUrl . \"/manage-comments.php\"\n        );\n\n      \n self::$_isMailLog = in_array('4', $Temoptions['CommentNotify__OtherSetting']) ? true : false;\n        if($_POST['accept'] == 'on'){\n            $cfg['banMail'] = 1;\n        }\n        else{\n            $cfg['banMail'] = 0;\n        }\n\n        $fileName = \\Typecho\\Common::randString(12);\n        $cfg      = (object)$cfg;\n        file_put_contents(dirname(__FILE__) . '/cache/' . $fileName, serialize($cfg));\n        $url = ($options->rewrite) ? $options->siteUrl : $options->siteUrl . 'index.php';\n        $url = rtrim($url, '/') . '/action/' . self::$action . '?send=' . $fileName;\n\n        $date = new \\Typecho\\Date(\\Typecho\\Date::gmtTime());\n        $time = $date->format('Y-m-d H:i:s');\n       \n        self::saveLog(\"{$time} 开始发送请求：{$url}\\n\");\n        self::asyncRequest($url);\n    }\n\n\n\n    public static function asyncRequest($url)\n{\n    self::isAvailable();\n        self::$_adapter == 'Socket' ? self::socket($url) : self::curl($url);\n}\n\n    /**\n     * Socket 请求\n     * @param $url\n     * @return bool\n     */\n    public static function socket($url)\n    {\n        $params = parse_url($url);\n        $path = $params['path'] . '?' . $params['query'];\n        $host = $params['host'];\n        $port = 80;\n        $scheme = '';\n\n        if ('https' == $params['scheme']) {\n            $port = 443;\n            $scheme = 'ssl://';\n        }\n\n        if (function_exists('fsockopen')) {\n            $fp = @fsockopen($scheme . $host, $port, $errno, $errstr, 30);\n        } elseif (function_exists('pfsockopen')) {\n            $fp = @pfsockopen($scheme . $host, $port, $errno, $errstr, 30);\n        } else {\n            $fp = stream_socket_client($scheme . $host . \":$port\", $errno, $errstr, 30);\n        }\n\n        if ($fp === false) {\n            self::saveLog(\"SOCKET错误,\" . $errno . ':' . $errstr);\n            return false;\n        }\n\n        $out = \"GET \" . $path . \" HTTP/1.1\\r\\n\";\n        $out .= \"Host: $host\\r\\n\";\n        $out .= \"Connection: Close\\r\\n\\r\\n\";\n\n        self::saveLog(\"Socket 方式发送\\r\\n\");\n\n        fwrite($fp, $out);\n        sleep(1);\n        fclose($fp);\n        self::saveLog(\"请求结束\\r\\n\");\n    }\n\n    /**\n     * Curl 请求\n     * @param $url\n     */\n    public static function curl($url)\n    {\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_HTTPGET, 1);\n        curl_setopt($ch, CURLOPT_URL, $url);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  // 将curl_exec()获取的信息以文件流的形式返回,不直接输出。  \n        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);  // 连接等待时间  \n        curl_setopt($ch, CURLOPT_TIMEOUT, 1);         // curl允许执行时间\n\n        self::saveLog(\"Curl 方式发送\\r\\n\");\n\n        curl_exec($ch);\n        curl_close($ch);\n        self::saveLog(\"请求结束\\r\\n\");\n    }\n\n    /**\n     * 检测 适配器\n     * @return string\n     */\n    public static function isAvailable()\n    {\n        function_exists('ini_get') && ini_get('allow_url_fopen') && (self::$_adapter = 'Socket');\n        false == self::$_adapter && function_exists('curl_version') && (self::$_adapter = 'Curl');\n\n        return self::$_adapter;\n    }\n\n    /**\n     * 检测 是否可写\n     * @param $file\n     * @return bool\n     */\n    public static function isWritable($file)\n    {\n        if (is_dir($file)) {\n            $dir = $file;\n            if ($fp = @fopen(\"$dir/check_writable\", 'w')) {\n                @fclose($fp);\n                @unlink(\"$dir/check_writable\");\n                $writeable = true;\n            } else {\n                $writeable = false;\n            }\n        } else {\n            if ($fp = @fopen($file, 'a+')) {\n                @fclose($fp);\n                $writeable = true;\n            } else {\n                $writeable = false;\n            }\n        }\n\n        return $writeable;\n    }\n    /**\n     * 写入记录\n     * @param $content\n     * @return bool\n     */\n    public static function saveLog($content)\n    {\n        if (!self::$_isMailLog) {\n            return false;\n        }\n\n        file_put_contents(dirname(__FILE__) . '/log/mailer_log.txt', $content, FILE_APPEND);\n    }\n    \n    public function sign($msg, $key)\n    {\n        $signature = '';\n        $success = openssl_sign($msg, $signature, $key, 'SHA256');\n        if(!$success){\n            return false;\n        }\n        return $signature;\n    }\n\n\n    public function urlEncode($input)\n    {\n        return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));\n    }\n    public function encode($payload, $key, $alg = 'RS256')\n    {\n        $header = array('typ' => 'JWT', 'alg' => $alg);\n        $segments = array();\n        $segments[] = $this->urlEncode(json_encode($header));\n        $segments[] = $this->urlEncode(json_encode($payload));\n        $signing_input = implode('.', $segments);\n        $signature = $this->sign($signing_input, $key);\n        $segments[] = $this->urlEncode($signature);\n        return implode('.', $segments);\n    }\n    \n    //百度推送\n    public static function seo_publishpush($content, $edit)\n    {\n        $bd_api = get_option('bearsimple')['seotabs']['baidu_token'];\n        $sm_api = get_option('bearsimple')['seotabs']['shenma_token'];\n        $bing_api = get_option('bearsimple')['seotabs']['bing_token'];\n        $toutiao_api = get_option('bearsimple')['seotabs']['toutiao_token'];\n        $indexnow_api = get_option('bearsimple')['seotabs']['indexnow_token'];\n        $siteUrl = Helper::options()->siteUrl;\n         $adminUrl = Helper::options()->adminUrl;\n         $db = \\Typecho\\Db::get();\n        $content['cid'] = $edit->cid;\n        $content['slug'] = $edit->slug;\n        \n        //获取分类缩略名\n        $content['category'] = urlencode(current(\\Typecho\\Common::arrayFlatten($db->fetchAll($db->select()->from('table.metas')\n            ->join('table.relationships', 'table.relationships.mid = table.metas.mid')\n            ->where('table.relationships.cid = ?', $content['cid'])\n            ->where('table.metas.type = ?', 'category')\n            ->order('table.metas.order', \\Typecho\\Db::SORT_ASC)), 'slug')));\n\n        //获取并格式化文章创建时间\n        $content['created'] = $edit->created;\n        $created = new \\Typecho\\Date($content['created']);\n        $content['year'] = $created->year; $content['month'] = $created->month; $content['day'] = $created->day;\n\n        //生成URL\n        $url = $edit->permalink;\n         $urls = array(0=>$url);\n        if($content['created'] >  Helper::options()->time) exit('<script>location.href=\"'.$adminUrl.'/manage-posts.php\";</script>');\n        \n        if($bd_api !== ''){\n        if(strpos($bd_api, 'data.zz.baidu.com') !== 7) exit('<script>alert(\"请配置正确的百度收录推送接口调用地址\");location.href=\"'.$adminUrl.'/manage-posts.php\";</script>');\n        //发送请求\n        $ch = curl_init();\n        $options =  array(\n            CURLOPT_URL => $bd_api,\n            CURLOPT_POST => true,\n            CURLOPT_RETURNTRANSFER => true,\n            CURLOPT_POSTFIELDS => $url,\n            CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),\n        );\n        curl_setopt_array($ch, $options);\n        $result = curl_exec($ch);\n        \n        $res = json_decode($result, true);\n        //if(isset($res['error'])) exit('<script>alert(\"链接提交百度过程中出现错误，错误代码：'.$res['error'].'，错误信息：'.$res['message'].'。\");location.href=\"'.$adminUrl.'/manage-posts.php\";</script>');\n        \n        }\n        \n        if($sm_api !== ''){\n           //发送请求\n        $ch = curl_init();\n        $options =  array(\n            CURLOPT_URL => $sm_api,\n            CURLOPT_POST => true,\n            CURLOPT_RETURNTRANSFER => true,\n            CURLOPT_POSTFIELDS => $url,\n            CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),\n        );\n        curl_setopt_array($ch, $options);\n        $result = curl_exec($ch);\n        \n        $res = json_decode($result, true);\n        //if($res['returnCode'] !== 200) exit('<script>alert(\"链接提交神马过程中出现错误，错误代码：'.$res['returnCode'].'，错误信息：'.$res['errorMsg'].'。\");location.href=\"'.$adminUrl.'/manage-posts.php\";</script>');  \n        }\n        \n        if($bing_api !== ''){\n        $submit_url = array();\n        $home_url = Helper::options()->siteUrl;\n        $len = strlen($home_url);\n        foreach($urls as $url){\n            $url = trim($url);\n            if(empty($url)){\n                continue;\n            }\n            if(substr($url,0,$len)!=$home_url){\n                continue;\n            }\n            $submit_url[] = $url;\n        }\n           //发送请求\n        $ch = curl_init();\n        $options =  array(\n            CURLOPT_URL => 'https://ssl.bing.com/webmaster/api.svc/json/SubmitUrlbatch?apikey='.$bing_api,\n            CURLOPT_POST => true,\n            CURLOPT_RETURNTRANSFER => true,\n            CURLOPT_POSTFIELDS => json_encode(array('siteUrl'=>$home_url,'urlList'=>$submit_url)),\n            CURLOPT_HTTPHEADER => array('Content-Type: text/json; charset=utf-8'),\n        );\n        curl_setopt_array($ch, $options);\n        $result = curl_exec($ch);\n        \n        $res = json_decode($result, true);\n       /*\n        if(!$res)\n            exit('<script>alert(\"链接提交Bing过程中响应解析出错\");location.href=\"'.$adminUrl.'/manage-posts.php\";</script>'); \n        \n        if(isset($res['ErrorCode']))\n           exit('<script>alert(\"链接提交Bing过程中出现错误，错误代码：'.$res['ErrorCode'].'，错误信息：'.$res['Message'].'。\");location.href=\"'.$adminUrl.'/manage-posts.php\";</script>'); \n        */\n        }\n        \n        if($toutiao_api !== ''){\n            $url = urlencode($url);\n           //发送请求\n        $ch = curl_init();\n        $options =  array(\n            CURLOPT_URL => 'https://zhanzhang.toutiao.com/s.gif?url='.$url.'&token='.$toutiao_api,\n            CURLOPT_POST => false,\n            CURLOPT_RETURNTRANSFER => true,\n            CURLOPT_HTTPHEADER => array('Content-Type: text/json; charset=utf-8'),\n        );\n        curl_setopt_array($ch, $options);\n        $result = curl_exec($ch);\n        \n        $res = json_decode($result, true);\n        //if($res['code'] == 8) exit('<script>alert(\"链接提交头条过程中出现错误，错误代码：'.$res['code'].'，错误信息：'.$res['msg'].'。\");location.href=\"'.$adminUrl.'/manage-posts.php\";</script>');  \n        }\n        \n          if($indexnow_api !== ''){\n           //发送请求\n        $ch = curl_init();\n        $options =  array(\n            CURLOPT_URL => 'https://www.bing.com/indexnow?key='.$indexnow_api.'&url='.$url,\n            CURLOPT_POST => FALSE,\n            CURLOPT_RETURNTRANSFER => true,\n            CURLOPT_TIMEOUT => 5,\n            CURLOPT_HTTPHEADER => array('Content-Type: application/json; charset=utf-8'),\n        );\n        curl_setopt_array($ch, $options);\n        $result = curl_exec($ch);\n        $resCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);\n         curl_close($ch);\n         /*\n         if($resCode !== 200){\n            $msg  = [\n                202=>'URL校验正常，IndexNow密钥已激活，该通知或许仅会显示这一次:).',\n                400=>'非法格式',\n                403=>'在密钥无效的情况下出现错误（例如，没有找到密钥，找到文件但密钥内容不在文件中）。',\n                422=>'如果URL不属于主机，或者密钥与协议中的模式不匹配，就会出现这种情况',\n                429=>'请求过多(被限制了)',\n            ];\n            $err = $msg[$resCode] ? $msg[$resCode] : 'api error,response code['.$resCode.']';\n            exit('<script>alert(\"链接提交IndexNow过程中出现错误，原因：'.$err.'。\");location.href=\"'.$adminUrl.'/manage-posts.php\";</script>');\n        }\n        */\n        \n        \n        }\n        \n    }\n    \n      public static function seo_autopush()\n    {\n        echo PHP_EOL.'<script>\n(function(){\n  var bp = document.createElement(\"script\");\n  var curProtocol = window.location.protocol.split(\":\")[0];\n  if (curProtocol === \"https\"){\n    bp.src = \"https://zz.bdstatic.com/linksubmit/push.js\";\n  }else{\n    bp.src = \"http://push.zhanzhang.baidu.com/push.js\";\n  }\n    var s = document.getElementsByTagName(\"script\")[0];\n    s.parentNode.insertBefore(bp, s);\n})();\n</script>'.PHP_EOL;\n    }\n   \n    \n    public static function tags_bottom(){\n        ?><style>.autotags a{cursor: pointer; padding: 0px 6px; margin: 2px 0;display: inline-block;border-radius: 2px;text-decoration: none;}\n.autotags a:hover{background: #ccc;color: #fff;}\n</style>\n<script> $(document).ready(function(){\n    $('#tags').after('<div style=\"margin-top: 20px;\" class=\"autotags\"><label for=\"token-input-tags\" class=\"typecho-label\">点击标签自动插入</label><ul style=\"list-style: none;border: 1px solid #D9D9D6;padding: 6px 12px; max-height: 240px;overflow: auto;background-color: #FFF;border-radius: 2px;\"><?php\n$i=0;\n\\Typecho\\Widget::widget('Widget_Metas_Tag_Cloud', 'sort=count&desc=1&limit=200')->to($tags);\nwhile ($tags->next()) {\n    if (strpos($tags->name, \"'\") == false) {\necho \"<a id=\".$i.\" onclick=\\\"$(\\'#tags\\').tokenInput(\\'add\\', {id: \\'\".$tags->name.\"\\', tags: \\'\".$tags->name.\"\\'});\\\">\".$tags->name.\"</a>\";\n$i++;\n}\n}\n?></ul></div>');\n  });</script>\n<?php\n    }\n    \n     /*\n\n     * 文件上传\n\n     * @param $file\n\n     *\n\n     */\n\n    public static function tinypng_uploadHandle($file)\n    {\n        //文件名是否空\n        if (empty($file['name'])) {\n            return false;\n        }\n        //文件名安全性检测\n        $ext = self::getTypechoMethod(\"getSafeName\", $file['name']);\n        if (!self::getTypechoMethod(\"checkFileType\", $ext) || \\Typecho\\Common::isAppEngine()) {\n            return false;\n        }\n        //判断格式\n        $ext = strtolower($ext);\n        $isimage = in_array($ext, array(\"jpg\", \"png\", \"jpeg\"));\n\n        $options = Helper::options();\n        if (empty($date)) {\n            $date = new \\Typecho\\Date($options->gmtTime);\n        }\n        $path = \\Typecho\\Common::url(defined('__TYPECHO_UPLOAD_DIR__') ? __TYPECHO_UPLOAD_DIR__ : \\Widget\\Upload::UPLOAD_DIR,\n\n                defined('__TYPECHO_UPLOAD_ROOT_DIR__') ? __TYPECHO_UPLOAD_ROOT_DIR__ : __TYPECHO_ROOT_DIR__)\n\n            . '/' . $date->year . '/' . $date->month;\n\n        if (!isset($file['tmp_name'])) {\n            return false;\n        }\n        if ($isimage) {\n            $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']);\n            \\Tinify\\setKey($apikey);\n            $source = \\Tinify\\fromFile($file['tmp_name']);\n        }\n        //创建上传目录\n        if (!is_dir($path)) {\n\n            if (!self::getTypechoMethod(\"makeUploadDir\", $path)) {\n\n                return false;\n            }\n        }\n\n        $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext;\n        $path = $path . '/' . $fileName;\n        if (!$isimage) {\n            if (isset($file['tmp_name'])) {\n                if (!@move_uploaded_file($file['tmp_name'], $path)) {\n                    return false;\n                }\n            } else if (isset($file['bytes'])) {\n                if (!file_put_contents($path, $file['bytes'])) {\n                    return false;\n                }\n            } else {\n                return false;\n            }\n        }\n        if ($isimage) {\n            $source->toFile($path);\n            $file['size'] = filesize($path);\n        } else if (!isset($file['size'])) {\n            $file['size'] = filesize($path);\n        }\n\n        return array(\n            'name' => $file['name'],\n            'path' => (defined('__TYPECHO_UPLOAD_DIR__') ? __TYPECHO_UPLOAD_DIR__ : \\Widget\\Upload::UPLOAD_DIR)\n                . '/' . $date->year . '/' . $date->month . '/' . $fileName,\n            'size' => $file['size'],\n            'type' => $ext,\n            'mime' => \\Typecho\\Common::mimeContentType($path)\n        );\n    }\n    \n    \n    public static function lsky_uploadHandle($file)\n    {\n        $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n        if (empty($file['name'])) {\n\n            return false;\n        }\n\n        $ext = self::_getSafeName($file['name']);\n\n        if (!Upload::checkFileType($ext) || Common::isAppEngine()) {\n\n            return false;\n        }\n        \n        if (self::_isImage($ext)) {\n\n            return self::_uploadImg($file, $ext);\n        }\n   \n        \n    \n        return self::_uploadOtherFile($file, $ext);\n    }\n\n    public static function lsky_deleteHandle(array $content): bool\n    {\n    $ext = $content['attachment']->type;\n\n        if (self::_isImage($ext)) {\n\n            return self::_deleteImg($content);\n        }\n\n        return unlink($content['attachment']->path);\n    }\n\n    public static function lsky_modifyHandle($content, $file)\n    {\n        $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n        if (empty($file['name'])) {\n\n            return false;\n        }\n        $ext = self::_getSafeName($file['name']);\n        if ($content['attachment']->type != $ext || Common::isAppEngine()) {\n\n            return false;\n        }\n\n        if (!self::_getUploadFile($file)) {\n\n            return false;\n        }\n       $uploadfile = self::_getUploadFile($file);\n        if (self::_isImage($ext)) {\n            self::_deleteImg($content);\n\n            return self::_uploadImg($file, $ext);\n        }\n      \n        return self::_uploadOtherFile($file, $ext);\n    }\n\n    public static function lsky_attachmentHandle(array $content): string\n    {\n\t\t$arr = unserialize($content['text']);\n\t\t$text = strstr($content['text'],'.');\n\t\t$ext = substr($text,1,3);\n        if (self::_isImage($ext)) {\n\n            return $content['attachment']->path ?? '';\n        }\n\n        $ret = explode('/'.self::UPLOAD_DIR, $arr['path']);\n        return Common::url('/'.self::UPLOAD_DIR . @$ret[1], Options::alloc()->siteUrl);\n    }\n   \n   public static function lsky_attachmentDataHandle(array $content)\n    {\n        return file_get_contents(self::lsky_attachmentHandle($content));\n    }\n    \n    private static function _getUploadDir($ext = ''): string\n    {\n        if (self::_isImage($ext)) {\n            $url = parse_url(Options::alloc()->siteUrl);\n            $DIR = str_replace('.', '_', $url['host']);\n            return __TYPECHO_ROOT_DIR__ . '/'.self::UPLOAD_DIR;\n        } elseif (defined('__TYPECHO_UPLOAD_DIR__')) {\n            return __TYPECHO_UPLOAD_DIR__;\n        } else {\n            $path = Common::url('/'.self::UPLOAD_DIR, __TYPECHO_ROOT_DIR__);\n            return $path;\n        }\n    }\n\n    private static function _getUploadFile($file): string\n    {\n        return $file['tmp_name'] ?? ($file['bytes'] ?? ($file['bits'] ?? ''));\n    }\n\n    private static function _getSafeName(&$name): string\n    {\n        $name = str_replace(array('\"', '<', '>'), '', $name);\n        $name = str_replace('\\\\', '/', $name);\n        $name = false === strpos($name, '/') ? ('a' . $name) : str_replace('/', '/a', $name);\n        $info = pathinfo($name);\n        $name = substr($info['basename'], 1);\n\n        return isset($info['extension']) ? strtolower($info['extension']) : '';\n    }\n\n    private static function _makeUploadDir($path): bool\n    {\n        $path    = preg_replace(\"/\\\\\\+/\", '/', $path);\n        $current = rtrim($path, '/');\n        $last    = $current;\n\n        while (!is_dir($current) && false !== strpos($path, '/')) {\n            $last    = $current;\n            $current = dirname($current);\n        }\n\n        if ($last == $current) {\n            return true;\n        }\n\n        if (!@mkdir($last)) {\n            return false;\n        }\n\n        $stat  = @stat($last);\n        $perms = $stat['mode'] & 0007777;\n        @chmod($last, $perms);\n\n        return self::_makeUploadDir($path);\n    }\n\n    private static function _isImage($ext): bool\n    {\n        $img_ext_arr = array('gif','jpg','jpeg','png','tiff','bmp','ico','psd','webp','JPG','BMP','GIF','PNG','JPEG','ICO','PSD','TIFF','WEBP');\n        return in_array($ext, $img_ext_arr);\n    }\n\n    private static function _uploadOtherFile($file, $ext)\n    {\n        $dir = self::_getUploadDir($ext) . '/' . date('Y') . '/' . date('m');\n        if (!self::_makeUploadDir($dir)) {\n\n            return false;\n        }\n\n        $path = sprintf('%s/%u.%s', $dir, crc32(uniqid()), $ext);\n        if (!isset($file['tmp_name']) || !@move_uploaded_file($file['tmp_name'], $path)) {\n\n            return false;\n       }\n   \n \n\n        return [\n            'name' => $file['name'],\n            'path' => $path,\n            'size' => $file['size'] ?? filesize($path),\n            'type' => $ext,\n            'mime' => @Common::mimeContentType($path)\n        ];\n    }\n\n\n    private static function _uploadImg($file, $ext)\n    {\n       \n    \n        $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n        $api     = $options['lskypro_api'] . '/api/v1/upload';\n\t\t$token   = 'Bearer '.$options['lskypro_token'];\n        $strategyId = $options['lskypro_id'];\n        \n        $tmp     = self::_getUploadFile($file);\n        if (empty($tmp)) {\n\n            return false;\n        }\n\n\t\t$img = $file['name'];\n        if (!rename($tmp, $img)) {\n\n            return false;\n        }\n        $params = ['file' => new CURLFile($img)];\n        if ($strategyId) {\n            $params['strategy_id'] = $strategyId;\n        }\n\n        $res = self::_curlPost($api, $params, $token);\n          \n          \n        unlink($img);\n\n        if (!$res) {\n\n            return false;\n        }\n      \n\n        $json = json_decode($res, true);\n     \n        \n        if ($json['status'] === false) {\n            return false;\n        }\n        \n        $data = $json['data'];\n         $data = $json['data'];\n        return [\n            'img_key' => $data['key'],\n            'img_id' => $data['md5'],\n            'name'   => $data['origin_name'],\n            'path'   => $data['links']['url'],\n            'size'   => $data['size']*1024,\n            'type'   => $data['extension'],\n            'mime'   => $data['mimetype'],\n\t\t\t'description'  => $data['mimetype'],\n        ];\n    }\n\n    private static function _deleteImg(array $content): bool\n    {\n      \n        $options = bsOptions::getInstance()::get_option( 'bearsimple' );\n        $api     = $options['lskypro_api'] . '/api/v1/upload';\n\t\t$token   = 'Bearer '.$options['lskypro_token'];\n     \n\n        $id = $content['attachment']->img_key;\n        \n        if (empty($id)) {\n            return false;\n        }\n        \n        $res  = self::_curlDelete($api . '/' . $id, ['key' => $id], $token);\n        $json = json_decode($res, true);\n    \n        if (!is_array($json)) {\n\n            return false;\n        }\n\n        return true;\n    }\n\n    private static function _curlDelete($api, $post, $token)\n    {\n        $headers = array(\n            \"Content-Type: multipart/form-data\",\n            \"Accept: application/json\",\n            \"Authorization: \".$token,\n            );\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, $api);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);\n        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, \"DELETE\");\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\n        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');\n        curl_setopt($ch, CURLOPT_POST, 1);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);\n        $res = curl_exec($ch);\n        curl_close($ch);\n\n        return $res;\n    }\n    \n    private static function _curlPost($api, $post, $token)\n    {\n        $headers = array(\n            \"Content-Type: multipart/form-data\",\n            \"Accept: application/json\",\n            \"Authorization: \".$token,\n            );\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, $api);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\n        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');\n        curl_setopt($ch, CURLOPT_POST, 1);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);\n        $res = curl_exec($ch);\n        curl_close($ch);\n\n        return $res;\n    }\n    \n\n    public static function getTypechoMethod($methodName, $inParams)\n\n    {\n\n        if (empty($objReflectClass)) {\n\n            $objReflectClass = new ReflectionClass(\"Widget_Upload\");\n\n        }\n\n        $method = $objReflectClass->getMethod($methodName);\n\n        $method->setAccessible(true);\n\n        if (\"getSafeName\" == $methodName) {\n\n            $result = $method->invokeArgs(null, array(&$inParams));\n\n        } else {\n\n            $result = $method->invokeArgs(null, array($inParams));\n\n        }\n\n        return $result;\n\n    }\n\n\n\n    /**\n\n     * 异步更新可用压缩数\n\n     * @param $post\n\n     */\n\n    public static function tinypng_bottom($post)\n\n    {\n\n        $options = Helper::options();\n\n        $statusPath = \\Typecho\\Common::url(\"/action/bs-ajax?do=tinypng\", $options->index);\n\n\n\n        echo <<<EOT\n\n        <script>\n\n$(\"#tab-files\").append(\"<div id=\\\"upload-panel\\\" class=\\\"p\\\">     <div class=\\\"upload-area tinypngstatus\\\" draggable=\\\"true\\\" title=\\\"点击更新\\\" style=\\\"position: relative;cursor: pointer;\\\">图片压缩可用数正在查询中...</div> </div>\");\n\nfunction statusfind() {\n\n\t$.ajax({\n\n\t\turl: \"{$statusPath}\",\n\n\t\tasync: true,\n\n\t\tdataType: \"text\",\n\n\t\tglobal: true,\n\n\t\tsuccess: function(result) {\n\n\t\t    //如果正常返回数字\n\n\t\t    if(!isNaN(result)){\n\n\t\t        $(\".tinypngstatus\").text(\"图片压缩可用：\"+result+\"张\");\n\n\t\t    }else{\n\n\t\t          var sear=new RegExp('Provide an API key');\n\n\t\t          var unknownerror = true;\n\n　　              if(sear.test(result)){\n\n                      unknownerror = false;\n\n    　　             $(\".tinypngstatus\").html(\"<span style=\\\"color:#df4068;\\\">TinyPNG APIKEY需要设置</span>\");\n\n　　              }\n\n                  //未知错误\n\n                  if(unknownerror){\n\n                    $(\".tinypngstatus\").html(\"<span style=\\\"color:#df4068;\\\">TinyPNG出现错误</span>\");\n\n                  }\n\n\t\t    }\t    \n\n\t\t},\n\n\t\terror:function(result) {\n\n\t\t\t$(\".tinypngstatus\").html(\"<span style=\\\"color:#df4068;\\\">TinyPNG状态获取失败，网络故障或者配置错误</span>\");\n\n\t\t}\n\n\t});\n\n}\n\n$(\"#tab-files-btn\").click(statusfind);\n\nfunction statusfindsession(){\n\n     $(\".tinypngstatus\").text(\"图片压缩可用数查询中...\");\n\n    statusfind();\n\n}\n\n$(\".tinypngstatus\").click(statusfindsession);\n\n</script>\\n\n\nEOT;\n\n    }\npublic static function getSecurity($typeName,$name,$value = null){\n    if($typeName == 'get'){\n        $value = \\Typecho\\Cookie::get($name);\n        return $value;\n    }\n    elseif($typeName == 'set'){\n        \\Typecho\\Cookie::set($name, $value);\n    }\n    else{\n        \\Typecho\\Cookie::delete($name, $value);\n    }\n}\n\n\n}"
  },
  {
    "path": "配套插件/BsCore/assets/css/color-picker.css",
    "content": "/* rtl:ignore */\n.wp-color-picker {\n\twidth: 80px;\n\tdirection: ltr;\n}\n\n.wp-picker-container .hidden {\n\tdisplay: none;\n}\n\n/* Needs higher specificiity. */\n.wp-picker-container .wp-color-result.button {\n\tmin-height: 30px;\n\tmargin: 0 6px 6px 0;\n\tpadding: 0 0 0 30px;\n\tfont-size: 11px;\n}\n\n.wp-color-result-text {\n\tbackground: #f6f7f7;\n\tborder-radius: 0 2px 2px 0;\n\tborder-left: 1px solid #c3c4c7;\n\tcolor: #50575e;\n\tdisplay: block;\n\tline-height: 2.54545455; /* 28px */\n\tpadding: 0 6px;\n\ttext-align: center;\n}\n\n.wp-color-result:hover,\n.wp-color-result:focus {\n\tbackground: #f6f7f7;\n\tborder-color: #8c8f94;\n\tcolor: #1d2327;\n}\n\n.wp-color-result:hover:after,\n.wp-color-result:focus:after {\n\tcolor: #1d2327;\n\tborder-color: #a7aaad;\n\tborder-left: 1px solid #8c8f94;\n}\n\n.wp-picker-container {\n\tdisplay: inline-block;\n}\n\n.wp-color-result:focus {\n\tborder-color: #4f94d4;\n\tbox-shadow: 0 0 3px rgba(34, 113, 177, 0.8);\n}\n\n.wp-color-result:active {\n\t/* See Trac ticket #39662 */\n\ttransform: none !important;\n}\n\n.wp-picker-open + .wp-picker-input-wrap {\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n.wp-picker-input-wrap label {\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n/* For the old `custom-background` page, to override the inline-block and margins from `.form-table td fieldset label`. */\n.form-table .wp-picker-input-wrap label {\n\tmargin: 0 !important;\n}\n\n.wp-picker-input-wrap .button.wp-picker-default,\n.wp-picker-input-wrap .button.wp-picker-clear,\n.wp-customizer .wp-picker-input-wrap .button.wp-picker-default,\n.wp-customizer .wp-picker-input-wrap .button.wp-picker-clear {\n\tmargin-left: 6px;\n\tpadding: 0 8px;\n\tline-height: 2.54545455; /* 28px */\n\tmin-height: 30px;\n}\n\n.wp-picker-container .iris-square-slider .ui-slider-handle:focus {\n\tbackground-color: #50575e\n}\n\n.wp-picker-container .iris-picker {\n\tborder-radius: 0;\n\tborder-color: #dcdcde;\n\tmargin-top: 6px;\n}\n\n.wp-picker-container input[type=\"text\"].wp-color-picker {\n\twidth: 4rem;\n\tfont-size: 12px;\n\tfont-family: monospace;\n\tline-height: 2.33333333; /* 28px */\n\tmargin: 0;\n\tpadding: 0 5px;\n\tvertical-align: top;\n\tmin-height: 30px;\n}\n\n.wp-color-picker::-webkit-input-placeholder {\n\tcolor: #646970;\n}\n\n.wp-color-picker::-moz-placeholder {\n\tcolor: #646970;\n\topacity: 1;\n}\n\n.wp-color-picker:-ms-input-placeholder {\n\tcolor: #646970;\n}\n\n.wp-picker-container input[type=\"text\"].iris-error {\n\tbackground-color: #fcf0f1;\n\tborder-color: #d63638;\n\tcolor: #000;\n}\n\n.iris-picker .ui-square-handle:focus,\n.iris-picker .iris-strip .ui-slider-handle:focus {\n\tborder-color: #3582c4;\n\tborder-style: solid;\n\tbox-shadow: 0 0 0 1px #3582c4;\n\toutline: 2px solid transparent;\n}\n\n.iris-picker .iris-palette:focus {\n\tbox-shadow: 0 0 0 2px #3582c4;\n}\n\n@media screen and (max-width: 782px) {\n\t.wp-picker-container input[type=\"text\"].wp-color-picker {\n\t\twidth: 5rem;\n\t\tfont-size: 16px;\n\t\tline-height: 1.875; /* 30px */\n\t\tmin-height: 32px;\n\t}\n\n\t.wp-customizer .wp-picker-container input[type=\"text\"].wp-color-picker {\n\t\tpadding: 0 5px;\n\t}\n\n\t.wp-picker-input-wrap .button.wp-picker-default,\n\t.wp-picker-input-wrap .button.wp-picker-clear {\n\t\tpadding: 0 8px;\n\t\tline-height: 2.14285714; /* 30px */\n\t\tmin-height: 32px;\n\t}\n\n\t.wp-customizer .wp-picker-input-wrap .button.wp-picker-default,\n\t.wp-customizer .wp-picker-input-wrap .button.wp-picker-clear {\n\t\tpadding: 0 8px;\n\t\tfont-size: 14px;\n\t\tline-height: 2.14285714; /* 30px */\n\t\tmin-height: 32px;\n\t}\n\n\t.wp-picker-container .wp-color-result.button {\n\t\tpadding: 0 0 0 40px;\n\t\tfont-size: 14px;\n\t\tline-height: 2.14285714; /* 30px */\n\t}\n\n\t.wp-customizer .wp-picker-container .wp-color-result.button {\n\t\tfont-size: 14px;\n\t\tline-height: 2.14285714; /* 30px */\n\t}\n\n\t.wp-picker-container .wp-color-result-text {\n\t\tpadding: 0 14px;\n\t\tfont-size: inherit;\n\t\tline-height: inherit;\n\t}\n\n\t.wp-customizer .wp-picker-container .wp-color-result-text {\n\t\tpadding: 0 10px;\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/css/style.scss",
    "content": "\n.wp-core-ui .button-primary {\n  background: #2271b1;\n  border-color: #2271b1;\n  color: #fff;\n  text-decoration: none;\n  text-shadow: none;\n}\n\n.wp-core-ui .button-primary:hover {\n  background: #135e96;\n  border-color: #135e96;\n  color: #fff;\n}\n.wp-core-ui select:hover {\n  color: #2271b1\n}\n\n.wp-core-ui select {\n  font-size: 14px;\n  line-height: 2;\n  color: #2c3338;\n  border-color: #8c8f94;\n  box-shadow: none;\n  border-radius: 3px;\n  padding: 0 24px 0 8px;\n  min-height: 30px;\n  max-width: 25rem;\n  -webkit-appearance: none;\n  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%;\n  background-size: 16px 16px;\n  cursor: pointer;\n  vertical-align: middle;\n}\n\n.wp-core-ui select[multiple] {\n  height: auto;\n  padding-right: 8px;\n  background: #fff;\n}\n\n.ui-autocomplete {\n  padding: 0;\n  margin: 0;\n  list-style: none;\n  position: absolute;\n  z-index: 10000;\n  border: 1px solid #4f94d4;\n  box-shadow: 0 1px 2px rgba(79,148,212, 80%);\n  background-color: #fff;\n}\n\n.ui-autocomplete li {\n  margin-bottom: 0;\n  padding: 4px 10px;\n  white-space: nowrap;\n  text-align: left;\n  cursor: pointer;\n}\n\n\n@media (min-width: 768px) {\n  .col-tb-offset-2 {\n    margin-left: 0;\n  }\n  .col-tb-8 {\n    width: 100%;\n  }\n}\n\n/*! This file is auto-generated */\n@font-face {\n  font-family: dashicons;\n  src: url(\"../fonts/dashicons.eot?99ac726223c749443b642ce33df8b800\");\n  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\");\n  font-weight: 400;\n  font-style: normal\n}\n\n.dashicons, .dashicons-before:before {\n  font-family: dashicons, serif;\n  display: inline-block;\n  line-height: 1;\n  font-weight: 400;\n  font-style: normal;\n  speak: never;\n  text-decoration: inherit;\n  text-transform: none;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  width: 20px;\n  height: 20px;\n  font-size: 20px;\n  vertical-align: top;\n  text-align: center;\n  transition: color .1s ease-in\n}\n\n.dashicons-admin-appearance:before {\n  content: \"\\f100\"\n}\n\n.dashicons-admin-collapse:before {\n  content: \"\\f148\"\n}\n\n.dashicons-admin-comments:before {\n  content: \"\\f101\"\n}\n\n.dashicons-admin-customizer:before {\n  content: \"\\f540\"\n}\n\n.dashicons-admin-generic:before {\n  content: \"\\f111\"\n}\n\n.dashicons-admin-home:before {\n  content: \"\\f102\"\n}\n\n.dashicons-admin-links:before {\n  content: \"\\f103\"\n}\n\n.dashicons-admin-media:before {\n  content: \"\\f104\"\n}\n\n.dashicons-admin-multisite:before {\n  content: \"\\f541\"\n}\n\n.dashicons-admin-network:before {\n  content: \"\\f112\"\n}\n\n.dashicons-admin-page:before {\n  content: \"\\f105\"\n}\n\n.dashicons-admin-plugins:before {\n  content: \"\\f106\"\n}\n\n.dashicons-admin-post:before {\n  content: \"\\f109\"\n}\n\n.dashicons-admin-settings:before {\n  content: \"\\f108\"\n}\n\n.dashicons-admin-site-alt:before {\n  content: \"\\f11d\"\n}\n\n.dashicons-admin-site-alt2:before {\n  content: \"\\f11e\"\n}\n\n.dashicons-admin-site-alt3:before {\n  content: \"\\f11f\"\n}\n\n.dashicons-admin-site:before {\n  content: \"\\f319\"\n}\n\n.dashicons-admin-tools:before {\n  content: \"\\f107\"\n}\n\n.dashicons-admin-users:before {\n  content: \"\\f110\"\n}\n\n.dashicons-airplane:before {\n  content: \"\\f15f\"\n}\n\n.dashicons-album:before {\n  content: \"\\f514\"\n}\n\n.dashicons-align-center:before {\n  content: \"\\f134\"\n}\n\n.dashicons-align-full-width:before {\n  content: \"\\f114\"\n}\n\n.dashicons-align-left:before {\n  content: \"\\f135\"\n}\n\n.dashicons-align-none:before {\n  content: \"\\f138\"\n}\n\n.dashicons-align-pull-left:before {\n  content: \"\\f10a\"\n}\n\n.dashicons-align-pull-right:before {\n  content: \"\\f10b\"\n}\n\n.dashicons-align-right:before {\n  content: \"\\f136\"\n}\n\n.dashicons-align-wide:before {\n  content: \"\\f11b\"\n}\n\n.dashicons-amazon:before {\n  content: \"\\f162\"\n}\n\n.dashicons-analytics:before {\n  content: \"\\f183\"\n}\n\n.dashicons-archive:before {\n  content: \"\\f480\"\n}\n\n.dashicons-arrow-down-alt:before {\n  content: \"\\f346\"\n}\n\n.dashicons-arrow-down-alt2:before {\n  content: \"\\f347\"\n}\n\n.dashicons-arrow-down:before {\n  content: \"\\f140\"\n}\n\n.dashicons-arrow-left-alt:before {\n  content: \"\\f340\"\n}\n\n.dashicons-arrow-left-alt2:before {\n  content: \"\\f341\"\n}\n\n.dashicons-arrow-left:before {\n  content: \"\\f141\"\n}\n\n.dashicons-arrow-right-alt:before {\n  content: \"\\f344\"\n}\n\n.dashicons-arrow-right-alt2:before {\n  content: \"\\f345\"\n}\n\n.dashicons-arrow-right:before {\n  content: \"\\f139\"\n}\n\n.dashicons-arrow-up-alt:before {\n  content: \"\\f342\"\n}\n\n.dashicons-arrow-up-alt2:before {\n  content: \"\\f343\"\n}\n\n.dashicons-arrow-up-duplicate:before {\n  content: \"\\f143\"\n}\n\n.dashicons-arrow-up:before {\n  content: \"\\f142\"\n}\n\n.dashicons-art:before {\n  content: \"\\f309\"\n}\n\n.dashicons-awards:before {\n  content: \"\\f313\"\n}\n\n.dashicons-backup:before {\n  content: \"\\f321\"\n}\n\n.dashicons-bank:before {\n  content: \"\\f16a\"\n}\n\n.dashicons-beer:before {\n  content: \"\\f16c\"\n}\n\n.dashicons-bell:before {\n  content: \"\\f16d\"\n}\n\n.dashicons-block-default:before {\n  content: \"\\f12b\"\n}\n\n.dashicons-book-alt:before {\n  content: \"\\f331\"\n}\n\n.dashicons-book:before {\n  content: \"\\f330\"\n}\n\n.dashicons-buddicons-activity:before {\n  content: \"\\f452\"\n}\n\n.dashicons-buddicons-bbpress-logo:before {\n  content: \"\\f477\"\n}\n\n.dashicons-buddicons-buddypress-logo:before {\n  content: \"\\f448\"\n}\n\n.dashicons-buddicons-community:before {\n  content: \"\\f453\"\n}\n\n.dashicons-buddicons-forums:before {\n  content: \"\\f449\"\n}\n\n.dashicons-buddicons-friends:before {\n  content: \"\\f454\"\n}\n\n.dashicons-buddicons-groups:before {\n  content: \"\\f456\"\n}\n\n.dashicons-buddicons-pm:before {\n  content: \"\\f457\"\n}\n\n.dashicons-buddicons-replies:before {\n  content: \"\\f451\"\n}\n\n.dashicons-buddicons-topics:before {\n  content: \"\\f450\"\n}\n\n.dashicons-buddicons-tracking:before {\n  content: \"\\f455\"\n}\n\n.dashicons-building:before {\n  content: \"\\f512\"\n}\n\n.dashicons-businessman:before {\n  content: \"\\f338\"\n}\n\n.dashicons-businessperson:before {\n  content: \"\\f12e\"\n}\n\n.dashicons-businesswoman:before {\n  content: \"\\f12f\"\n}\n\n.dashicons-button:before {\n  content: \"\\f11a\"\n}\n\n.dashicons-calculator:before {\n  content: \"\\f16e\"\n}\n\n.dashicons-calendar-alt:before {\n  content: \"\\f508\"\n}\n\n.dashicons-calendar:before {\n  content: \"\\f145\"\n}\n\n.dashicons-camera-alt:before {\n  content: \"\\f129\"\n}\n\n.dashicons-camera:before {\n  content: \"\\f306\"\n}\n\n.dashicons-car:before {\n  content: \"\\f16b\"\n}\n\n.dashicons-carrot:before {\n  content: \"\\f511\"\n}\n\n.dashicons-cart:before {\n  content: \"\\f174\"\n}\n\n.dashicons-category:before {\n  content: \"\\f318\"\n}\n\n.dashicons-chart-area:before {\n  content: \"\\f239\"\n}\n\n.dashicons-chart-bar:before {\n  content: \"\\f185\"\n}\n\n.dashicons-chart-line:before {\n  content: \"\\f238\"\n}\n\n.dashicons-chart-pie:before {\n  content: \"\\f184\"\n}\n\n.dashicons-clipboard:before {\n  content: \"\\f481\"\n}\n\n.dashicons-clock:before {\n  content: \"\\f469\"\n}\n\n.dashicons-cloud-saved:before {\n  content: \"\\f137\"\n}\n\n.dashicons-cloud-upload:before {\n  content: \"\\f13b\"\n}\n\n.dashicons-cloud:before {\n  content: \"\\f176\"\n}\n\n.dashicons-code-standards:before {\n  content: \"\\f13a\"\n}\n\n.dashicons-coffee:before {\n  content: \"\\f16f\"\n}\n\n.dashicons-color-picker:before {\n  content: \"\\f131\"\n}\n\n.dashicons-columns:before {\n  content: \"\\f13c\"\n}\n\n.dashicons-controls-back:before {\n  content: \"\\f518\"\n}\n\n.dashicons-controls-forward:before {\n  content: \"\\f519\"\n}\n\n.dashicons-controls-pause:before {\n  content: \"\\f523\"\n}\n\n.dashicons-controls-play:before {\n  content: \"\\f522\"\n}\n\n.dashicons-controls-repeat:before {\n  content: \"\\f515\"\n}\n\n.dashicons-controls-skipback:before {\n  content: \"\\f516\"\n}\n\n.dashicons-controls-skipforward:before {\n  content: \"\\f517\"\n}\n\n.dashicons-controls-volumeoff:before {\n  content: \"\\f520\"\n}\n\n.dashicons-controls-volumeon:before {\n  content: \"\\f521\"\n}\n\n.dashicons-cover-image:before {\n  content: \"\\f13d\"\n}\n\n.dashicons-dashboard:before {\n  content: \"\\f226\"\n}\n\n.dashicons-database-add:before {\n  content: \"\\f170\"\n}\n\n.dashicons-database-export:before {\n  content: \"\\f17a\"\n}\n\n.dashicons-database-import:before {\n  content: \"\\f17b\"\n}\n\n.dashicons-database-remove:before {\n  content: \"\\f17c\"\n}\n\n.dashicons-database-view:before {\n  content: \"\\f17d\"\n}\n\n.dashicons-database:before {\n  content: \"\\f17e\"\n}\n\n.dashicons-desktop:before {\n  content: \"\\f472\"\n}\n\n.dashicons-dismiss:before {\n  content: \"\\f153\"\n}\n\n.dashicons-download:before {\n  content: \"\\f316\"\n}\n\n.dashicons-drumstick:before {\n  content: \"\\f17f\"\n}\n\n.dashicons-edit-large:before {\n  content: \"\\f327\"\n}\n\n.dashicons-edit-page:before {\n  content: \"\\f186\"\n}\n\n.dashicons-edit:before {\n  content: \"\\f464\"\n}\n\n.dashicons-editor-aligncenter:before {\n  content: \"\\f207\"\n}\n\n.dashicons-editor-alignleft:before {\n  content: \"\\f206\"\n}\n\n.dashicons-editor-alignright:before {\n  content: \"\\f208\"\n}\n\n.dashicons-editor-bold:before {\n  content: \"\\f200\"\n}\n\n.dashicons-editor-break:before {\n  content: \"\\f474\"\n}\n\n.dashicons-editor-code-duplicate:before {\n  content: \"\\f494\"\n}\n\n.dashicons-editor-code:before {\n  content: \"\\f475\"\n}\n\n.dashicons-editor-contract:before {\n  content: \"\\f506\"\n}\n\n.dashicons-editor-customchar:before {\n  content: \"\\f220\"\n}\n\n.dashicons-editor-expand:before {\n  content: \"\\f211\"\n}\n\n.dashicons-editor-help:before {\n  content: \"\\f223\"\n}\n\n.dashicons-editor-indent:before {\n  content: \"\\f222\"\n}\n\n.dashicons-editor-insertmore:before {\n  content: \"\\f209\"\n}\n\n.dashicons-editor-italic:before {\n  content: \"\\f201\"\n}\n\n.dashicons-editor-justify:before {\n  content: \"\\f214\"\n}\n\n.dashicons-editor-kitchensink:before {\n  content: \"\\f212\"\n}\n\n.dashicons-editor-ltr:before {\n  content: \"\\f10c\"\n}\n\n.dashicons-editor-ol-rtl:before {\n  content: \"\\f12c\"\n}\n\n.dashicons-editor-ol:before {\n  content: \"\\f204\"\n}\n\n.dashicons-editor-outdent:before {\n  content: \"\\f221\"\n}\n\n.dashicons-editor-paragraph:before {\n  content: \"\\f476\"\n}\n\n.dashicons-editor-paste-text:before {\n  content: \"\\f217\"\n}\n\n.dashicons-editor-paste-word:before {\n  content: \"\\f216\"\n}\n\n.dashicons-editor-quote:before {\n  content: \"\\f205\"\n}\n\n.dashicons-editor-removeformatting:before {\n  content: \"\\f218\"\n}\n\n.dashicons-editor-rtl:before {\n  content: \"\\f320\"\n}\n\n.dashicons-editor-spellcheck:before {\n  content: \"\\f210\"\n}\n\n.dashicons-editor-strikethrough:before {\n  content: \"\\f224\"\n}\n\n.dashicons-editor-table:before {\n  content: \"\\f535\"\n}\n\n.dashicons-editor-textcolor:before {\n  content: \"\\f215\"\n}\n\n.dashicons-editor-ul:before {\n  content: \"\\f203\"\n}\n\n.dashicons-editor-underline:before {\n  content: \"\\f213\"\n}\n\n.dashicons-editor-unlink:before {\n  content: \"\\f225\"\n}\n\n.dashicons-editor-video:before {\n  content: \"\\f219\"\n}\n\n.dashicons-ellipsis:before {\n  content: \"\\f11c\"\n}\n\n.dashicons-email-alt:before {\n  content: \"\\f466\"\n}\n\n.dashicons-email-alt2:before {\n  content: \"\\f467\"\n}\n\n.dashicons-email:before {\n  content: \"\\f465\"\n}\n\n.dashicons-embed-audio:before {\n  content: \"\\f13e\"\n}\n\n.dashicons-embed-generic:before {\n  content: \"\\f13f\"\n}\n\n.dashicons-embed-photo:before {\n  content: \"\\f144\"\n}\n\n.dashicons-embed-post:before {\n  content: \"\\f146\"\n}\n\n.dashicons-embed-video:before {\n  content: \"\\f149\"\n}\n\n.dashicons-excerpt-view:before {\n  content: \"\\f164\"\n}\n\n.dashicons-exit:before {\n  content: \"\\f14a\"\n}\n\n.dashicons-external:before {\n  content: \"\\f504\"\n}\n\n.dashicons-facebook-alt:before {\n  content: \"\\f305\"\n}\n\n.dashicons-facebook:before {\n  content: \"\\f304\"\n}\n\n.dashicons-feedback:before {\n  content: \"\\f175\"\n}\n\n.dashicons-filter:before {\n  content: \"\\f536\"\n}\n\n.dashicons-flag:before {\n  content: \"\\f227\"\n}\n\n.dashicons-food:before {\n  content: \"\\f187\"\n}\n\n.dashicons-format-aside:before {\n  content: \"\\f123\"\n}\n\n.dashicons-format-audio:before {\n  content: \"\\f127\"\n}\n\n.dashicons-format-chat:before {\n  content: \"\\f125\"\n}\n\n.dashicons-format-gallery:before {\n  content: \"\\f161\"\n}\n\n.dashicons-format-image:before {\n  content: \"\\f128\"\n}\n\n.dashicons-format-quote:before {\n  content: \"\\f122\"\n}\n\n.dashicons-format-status:before {\n  content: \"\\f130\"\n}\n\n.dashicons-format-video:before {\n  content: \"\\f126\"\n}\n\n.dashicons-forms:before {\n  content: \"\\f314\"\n}\n\n.dashicons-fullscreen-alt:before {\n  content: \"\\f188\"\n}\n\n.dashicons-fullscreen-exit-alt:before {\n  content: \"\\f189\"\n}\n\n.dashicons-games:before {\n  content: \"\\f18a\"\n}\n\n.dashicons-google:before {\n  content: \"\\f18b\"\n}\n\n.dashicons-googleplus:before {\n  content: \"\\f462\"\n}\n\n.dashicons-grid-view:before {\n  content: \"\\f509\"\n}\n\n.dashicons-groups:before {\n  content: \"\\f307\"\n}\n\n.dashicons-hammer:before {\n  content: \"\\f308\"\n}\n\n.dashicons-heading:before {\n  content: \"\\f10e\"\n}\n\n.dashicons-heart:before {\n  content: \"\\f487\"\n}\n\n.dashicons-hidden:before {\n  content: \"\\f530\"\n}\n\n.dashicons-hourglass:before {\n  content: \"\\f18c\"\n}\n\n.dashicons-html:before {\n  content: \"\\f14b\"\n}\n\n.dashicons-id-alt:before {\n  content: \"\\f337\"\n}\n\n.dashicons-id:before {\n  content: \"\\f336\"\n}\n\n.dashicons-image-crop:before {\n  content: \"\\f165\"\n}\n\n.dashicons-image-filter:before {\n  content: \"\\f533\"\n}\n\n.dashicons-image-flip-horizontal:before {\n  content: \"\\f169\"\n}\n\n.dashicons-image-flip-vertical:before {\n  content: \"\\f168\"\n}\n\n.dashicons-image-rotate-left:before {\n  content: \"\\f166\"\n}\n\n.dashicons-image-rotate-right:before {\n  content: \"\\f167\"\n}\n\n.dashicons-image-rotate:before {\n  content: \"\\f531\"\n}\n\n.dashicons-images-alt:before {\n  content: \"\\f232\"\n}\n\n.dashicons-images-alt2:before {\n  content: \"\\f233\"\n}\n\n.dashicons-index-card:before {\n  content: \"\\f510\"\n}\n\n.dashicons-info-outline:before {\n  content: \"\\f14c\"\n}\n\n.dashicons-info:before {\n  content: \"\\f348\"\n}\n\n.dashicons-insert-after:before {\n  content: \"\\f14d\"\n}\n\n.dashicons-insert-before:before {\n  content: \"\\f14e\"\n}\n\n.dashicons-insert:before {\n  content: \"\\f10f\"\n}\n\n.dashicons-instagram:before {\n  content: \"\\f12d\"\n}\n\n.dashicons-laptop:before {\n  content: \"\\f547\"\n}\n\n.dashicons-layout:before {\n  content: \"\\f538\"\n}\n\n.dashicons-leftright:before {\n  content: \"\\f229\"\n}\n\n.dashicons-lightbulb:before {\n  content: \"\\f339\"\n}\n\n.dashicons-linkedin:before {\n  content: \"\\f18d\"\n}\n\n.dashicons-list-view:before {\n  content: \"\\f163\"\n}\n\n.dashicons-location-alt:before {\n  content: \"\\f231\"\n}\n\n.dashicons-location:before {\n  content: \"\\f230\"\n}\n\n.dashicons-lock-duplicate:before {\n  content: \"\\f315\"\n}\n\n.dashicons-lock:before {\n  content: \"\\f160\"\n}\n\n.dashicons-marker:before {\n  content: \"\\f159\"\n}\n\n.dashicons-media-archive:before {\n  content: \"\\f501\"\n}\n\n.dashicons-media-audio:before {\n  content: \"\\f500\"\n}\n\n.dashicons-media-code:before {\n  content: \"\\f499\"\n}\n\n.dashicons-media-default:before {\n  content: \"\\f498\"\n}\n\n.dashicons-media-document:before {\n  content: \"\\f497\"\n}\n\n.dashicons-media-interactive:before {\n  content: \"\\f496\"\n}\n\n.dashicons-media-spreadsheet:before {\n  content: \"\\f495\"\n}\n\n.dashicons-media-text:before {\n  content: \"\\f491\"\n}\n\n.dashicons-media-video:before {\n  content: \"\\f490\"\n}\n\n.dashicons-megaphone:before {\n  content: \"\\f488\"\n}\n\n.dashicons-menu-alt:before {\n  content: \"\\f228\"\n}\n\n.dashicons-menu-alt2:before {\n  content: \"\\f329\"\n}\n\n.dashicons-menu-alt3:before {\n  content: \"\\f349\"\n}\n\n.dashicons-menu:before {\n  content: \"\\f333\"\n}\n\n.dashicons-microphone:before {\n  content: \"\\f482\"\n}\n\n.dashicons-migrate:before {\n  content: \"\\f310\"\n}\n\n.dashicons-minus:before {\n  content: \"\\f460\"\n}\n\n.dashicons-money-alt:before {\n  content: \"\\f18e\"\n}\n\n.dashicons-money:before {\n  content: \"\\f526\"\n}\n\n.dashicons-move:before {\n  content: \"\\f545\"\n}\n\n.dashicons-nametag:before {\n  content: \"\\f484\"\n}\n\n.dashicons-networking:before {\n  content: \"\\f325\"\n}\n\n.dashicons-no-alt:before {\n  content: \"\\f335\"\n}\n\n.dashicons-no:before {\n  content: \"\\f158\"\n}\n\n.dashicons-open-folder:before {\n  content: \"\\f18f\"\n}\n\n.dashicons-palmtree:before {\n  content: \"\\f527\"\n}\n\n.dashicons-paperclip:before {\n  content: \"\\f546\"\n}\n\n.dashicons-pdf:before {\n  content: \"\\f190\"\n}\n\n.dashicons-performance:before {\n  content: \"\\f311\"\n}\n\n.dashicons-pets:before {\n  content: \"\\f191\"\n}\n\n.dashicons-phone:before {\n  content: \"\\f525\"\n}\n\n.dashicons-pinterest:before {\n  content: \"\\f192\"\n}\n\n.dashicons-playlist-audio:before {\n  content: \"\\f492\"\n}\n\n.dashicons-playlist-video:before {\n  content: \"\\f493\"\n}\n\n.dashicons-plugins-checked:before {\n  content: \"\\f485\"\n}\n\n.dashicons-plus-alt:before {\n  content: \"\\f502\"\n}\n\n.dashicons-plus-alt2:before {\n  content: \"\\f543\"\n}\n\n.dashicons-plus:before {\n  content: \"\\f132\"\n}\n\n.dashicons-podio:before {\n  content: \"\\f19c\"\n}\n\n.dashicons-portfolio:before {\n  content: \"\\f322\"\n}\n\n.dashicons-post-status:before {\n  content: \"\\f173\"\n}\n\n.dashicons-pressthis:before {\n  content: \"\\f157\"\n}\n\n.dashicons-printer:before {\n  content: \"\\f193\"\n}\n\n.dashicons-privacy:before {\n  content: \"\\f194\"\n}\n\n.dashicons-products:before {\n  content: \"\\f312\"\n}\n\n.dashicons-randomize:before {\n  content: \"\\f503\"\n}\n\n.dashicons-reddit:before {\n  content: \"\\f195\"\n}\n\n.dashicons-redo:before {\n  content: \"\\f172\"\n}\n\n.dashicons-remove:before {\n  content: \"\\f14f\"\n}\n\n.dashicons-rest-api:before {\n  content: \"\\f124\"\n}\n\n.dashicons-rss:before {\n  content: \"\\f303\"\n}\n\n.dashicons-saved:before {\n  content: \"\\f15e\"\n}\n\n.dashicons-schedule:before {\n  content: \"\\f489\"\n}\n\n.dashicons-screenoptions:before {\n  content: \"\\f180\"\n}\n\n.dashicons-search:before {\n  content: \"\\f179\"\n}\n\n.dashicons-share-alt:before {\n  content: \"\\f240\"\n}\n\n.dashicons-share-alt2:before {\n  content: \"\\f242\"\n}\n\n.dashicons-share:before {\n  content: \"\\f237\"\n}\n\n.dashicons-shield-alt:before {\n  content: \"\\f334\"\n}\n\n.dashicons-shield:before {\n  content: \"\\f332\"\n}\n\n.dashicons-shortcode:before {\n  content: \"\\f150\"\n}\n\n.dashicons-slides:before {\n  content: \"\\f181\"\n}\n\n.dashicons-smartphone:before {\n  content: \"\\f470\"\n}\n\n.dashicons-smiley:before {\n  content: \"\\f328\"\n}\n\n.dashicons-sort:before {\n  content: \"\\f156\"\n}\n\n.dashicons-sos:before {\n  content: \"\\f468\"\n}\n\n.dashicons-spotify:before {\n  content: \"\\f196\"\n}\n\n.dashicons-star-empty:before {\n  content: \"\\f154\"\n}\n\n.dashicons-star-filled:before {\n  content: \"\\f155\"\n}\n\n.dashicons-star-half:before {\n  content: \"\\f459\"\n}\n\n.dashicons-sticky:before {\n  content: \"\\f537\"\n}\n\n.dashicons-store:before {\n  content: \"\\f513\"\n}\n\n.dashicons-superhero-alt:before {\n  content: \"\\f197\"\n}\n\n.dashicons-superhero:before {\n  content: \"\\f198\"\n}\n\n.dashicons-table-col-after:before {\n  content: \"\\f151\"\n}\n\n.dashicons-table-col-before:before {\n  content: \"\\f152\"\n}\n\n.dashicons-table-col-delete:before {\n  content: \"\\f15a\"\n}\n\n.dashicons-table-row-after:before {\n  content: \"\\f15b\"\n}\n\n.dashicons-table-row-before:before {\n  content: \"\\f15c\"\n}\n\n.dashicons-table-row-delete:before {\n  content: \"\\f15d\"\n}\n\n.dashicons-tablet:before {\n  content: \"\\f471\"\n}\n\n.dashicons-tag:before {\n  content: \"\\f323\"\n}\n\n.dashicons-tagcloud:before {\n  content: \"\\f479\"\n}\n\n.dashicons-testimonial:before {\n  content: \"\\f473\"\n}\n\n.dashicons-text-page:before {\n  content: \"\\f121\"\n}\n\n.dashicons-text:before {\n  content: \"\\f478\"\n}\n\n.dashicons-thumbs-down:before {\n  content: \"\\f542\"\n}\n\n.dashicons-thumbs-up:before {\n  content: \"\\f529\"\n}\n\n.dashicons-tickets-alt:before {\n  content: \"\\f524\"\n}\n\n.dashicons-tickets:before {\n  content: \"\\f486\"\n}\n\n.dashicons-tide:before {\n  content: \"\\f10d\"\n}\n\n.dashicons-translation:before {\n  content: \"\\f326\"\n}\n\n.dashicons-trash:before {\n  content: \"\\f182\"\n}\n\n.dashicons-twitch:before {\n  content: \"\\f199\"\n}\n\n.dashicons-twitter-alt:before {\n  content: \"\\f302\"\n}\n\n.dashicons-twitter:before {\n  content: \"\\f301\"\n}\n\n.dashicons-undo:before {\n  content: \"\\f171\"\n}\n\n.dashicons-universal-access-alt:before {\n  content: \"\\f507\"\n}\n\n.dashicons-universal-access:before {\n  content: \"\\f483\"\n}\n\n.dashicons-unlock:before {\n  content: \"\\f528\"\n}\n\n.dashicons-update-alt:before {\n  content: \"\\f113\"\n}\n\n.dashicons-update:before {\n  content: \"\\f463\"\n}\n\n.dashicons-upload:before {\n  content: \"\\f317\"\n}\n\n.dashicons-vault:before {\n  content: \"\\f178\"\n}\n\n.dashicons-video-alt:before {\n  content: \"\\f234\"\n}\n\n.dashicons-video-alt2:before {\n  content: \"\\f235\"\n}\n\n.dashicons-video-alt3:before {\n  content: \"\\f236\"\n}\n\n.dashicons-visibility:before {\n  content: \"\\f177\"\n}\n\n.dashicons-warning:before {\n  content: \"\\f534\"\n}\n\n.dashicons-welcome-add-page:before {\n  content: \"\\f133\"\n}\n\n.dashicons-welcome-comments:before {\n  content: \"\\f117\"\n}\n\n.dashicons-welcome-learn-more:before {\n  content: \"\\f118\"\n}\n\n.dashicons-welcome-view-site:before {\n  content: \"\\f115\"\n}\n\n.dashicons-welcome-widgets-menus:before {\n  content: \"\\f116\"\n}\n\n.dashicons-welcome-write-blog:before {\n  content: \"\\f119\"\n}\n\n.dashicons-whatsapp:before {\n  content: \"\\f19a\"\n}\n\n.dashicons-wordpress-alt:before {\n  content: \"\\f324\"\n}\n\n.dashicons-wordpress:before {\n  content: \"\\f120\"\n}\n\n.dashicons-xing:before {\n  content: \"\\f19d\"\n}\n\n.dashicons-yes-alt:before {\n  content: \"\\f12a\"\n}\n\n.dashicons-yes:before {\n  content: \"\\f147\"\n}\n\n.dashicons-youtube:before {\n  content: \"\\f19b\"\n}\n\n.dashicons-editor-distractionfree:before {\n  content: \"\\f211\"\n}\n\n.dashicons-exerpt-view:before {\n  content: \"\\f164\"\n}\n\n.dashicons-format-links:before {\n  content: \"\\f103\"\n}\n\n.dashicons-format-standard:before {\n  content: \"\\f109\"\n}\n\n.dashicons-post-trash:before {\n  content: \"\\f182\"\n}\n\n.dashicons-share1:before {\n  content: \"\\f237\"\n}\n\n.dashicons-welcome-edit-page:before {\n  content: \"\\f119\"\n}\n\n/*! This file is auto-generated */\nhtml {\n  --wp-admin--admin-bar--height: 32px;\n  scroll-padding-top: var(--wp-admin--admin-bar--height)\n}\n\n\n/*! This file is auto-generated */\n.wp-core-ui {\n  .ui-content{\n    a {\n      color: #2271b1;\n      transition-property: border, background, color;\n      transition-duration: .05s;\n      transition-timing-function: ease-in-out\n    }\n\n    a, div {\n      outline: 0\n    }\n\n    a:active, a:hover {\n      color: #135e96\n    }\n  }\n  .select:before, .select:after {\n    content: none;\n  }\n  #wpwrap {\n    height: auto;\n    min-height: 100%;\n    width: 100%;\n    position: relative;\n    -webkit-font-smoothing: subpixel-antialiased\n  }\n\n  #wpcontent {\n    height: 100%;\n    padding-left: 20px\n  }\n\n  .folded #wpcontent, .folded #wpfooter {\n    margin-left: 36px\n  }\n\n  #wpbody-content {\n    padding-bottom: 65px;\n    float: left;\n    width: 100%;\n    overflow: visible\n  }\n\n  .inner-sidebar {\n    float: right;\n    clear: right;\n    display: none;\n    width: 281px;\n    position: relative\n  }\n\n  .columns-2 .inner-sidebar {\n    margin-right: auto;\n    width: 286px;\n    display: block\n  }\n\n  .columns-2 .inner-sidebar #side-sortables, .inner-sidebar #side-sortables {\n    min-height: 300px;\n    width: 280px;\n    padding: 0\n  }\n\n  .has-right-sidebar .inner-sidebar {\n    display: block\n  }\n\n  .has-right-sidebar #post-body {\n    float: left;\n    clear: left;\n    width: 100%;\n    margin-right: -2000px\n  }\n\n  .has-right-sidebar #post-body-content {\n    margin-right: 300px;\n    float: none;\n    width: auto\n  }\n\n  #col-left {\n    float: left;\n    width: 35%\n  }\n\n  #col-right {\n    float: right;\n    width: 65%\n  }\n\n  #col-left .col-wrap {\n    padding: 0 6px 0 0\n  }\n\n  #col-right .col-wrap {\n    padding: 0 0 0 6px\n  }\n\n  .alignleft {\n    float: left\n  }\n\n  .alignright {\n    float: right\n  }\n\n  .textleft {\n    text-align: left\n  }\n\n  .textright {\n    text-align: right\n  }\n\n  .clear {\n    clear: both\n  }\n\n  .wp-clearfix:after {\n    content: \"\";\n    display: table;\n    clear: both\n  }\n\n  .screen-reader-text, .screen-reader-text span, .ui-helper-hidden-accessible {\n    border: 0;\n    clip: rect(1px, 1px, 1px, 1px);\n    -webkit-clip-path: inset(50%);\n    clip-path: inset(50%);\n    height: 1px;\n    margin: -1px;\n    overflow: hidden;\n    padding: 0;\n    position: absolute;\n    width: 1px;\n    word-wrap: normal !important\n  }\n\n  .button .screen-reader-text {\n    height: auto\n  }\n\n  .screen-reader-shortcut {\n    position: absolute;\n    top: -1000em\n  }\n\n  .screen-reader-shortcut:focus {\n    left: 6px;\n    top: -25px;\n    height: auto;\n    width: auto;\n    display: block;\n    font-size: 14px;\n    font-weight: 600;\n    padding: 15px 23px 14px;\n    background: #f0f0f1;\n    color: #2271b1;\n    z-index: 100000;\n    line-height: normal;\n    box-shadow: 0 0 2px 2px rgba(0, 0, 0, .6);\n    text-decoration: none;\n    outline: 2px solid transparent;\n    outline-offset: -2px\n  }\n\n  .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 {\n    display: none\n  }\n\n  #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 {\n    border: 1px solid #c3c4c7;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04)\n  }\n\n  .comment-ays, .feature-filter, .imgedit-group, .popular-tags, .stuffbox, .widgets-holder-wrap, .wp-editor-container, p.popular-tags, table.widefat {\n    background: #fff\n  }\n\n  body, html {\n    height: 100%;\n    margin: 0;\n    padding: 0\n  }\n\n  body {\n    background: #f0f0f1;\n    color: #3c434a;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n    font-size: 13px;\n    line-height: 1.4em;\n    min-width: 600px\n  }\n\n  body.iframe {\n    min-width: 0;\n    padding-top: 1px\n  }\n\n  body.modal-open {\n    overflow: hidden\n  }\n\n  body.mobile.modal-open #wpwrap {\n    overflow: hidden;\n    position: fixed;\n    height: 100%\n  }\n\n  iframe, img {\n    border: 0\n  }\n\n  td {\n    font-family: inherit;\n    font-size: inherit;\n    font-weight: inherit;\n    line-height: inherit\n  }\n\n\n\n  .wp-person a:focus .gravatar, a:focus, a:focus .media-icon img {\n    color: #043959;\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8);\n    outline: 1px solid transparent\n  }\n\n  #adminmenu a:focus {\n    box-shadow: none;\n    outline: 1px solid transparent;\n    outline-offset: -1px\n  }\n\n  .screen-reader-text:focus {\n    box-shadow: none;\n    outline: 0\n  }\n\n  blockquote, q {\n    quotes: none\n  }\n\n  blockquote:after, blockquote:before, q:after, q:before {\n    content: \"\";\n    content: none\n  }\n\n  .wp-die-message, p {\n    font-size: 13px;\n    line-height: 1.5;\n    margin: 1em 0\n  }\n\n  blockquote {\n    margin: 1em\n  }\n  .wp-core-ui{\n    dd, li {\n      margin-bottom: 6px\n    }\n  }\n\n\n  h1, h2, h3, h4, h5, h6 {\n    display: block;\n    font-weight: 600\n  }\n\n  h1 {\n    color: #1d2327;\n    font-size: 2em;\n    margin: .67em 0\n  }\n\n  h2, h3 {\n    color: #1d2327;\n    font-size: 1.3em;\n    margin: 1em 0\n  }\n\n  .update-core-php h2 {\n    margin-top: 4em\n  }\n\n  .update-messages h2, .update-php h2, h4 {\n    font-size: 1em;\n    margin: 1.33em 0\n  }\n\n  h5 {\n    font-size: .83em;\n    margin: 1.67em 0\n  }\n\n  h6 {\n    font-size: .67em;\n    margin: 2.33em 0\n  }\n\n  ol, ul {\n    padding: 0\n  }\n\n  ul {\n    list-style: none\n  }\n\n  ol {\n    list-style-type: decimal;\n    margin-left: 2em\n  }\n\n  ul.ul-disc {\n    list-style: disc outside\n  }\n\n  ul.ul-square {\n    list-style: square outside\n  }\n\n  ol.ol-decimal {\n    list-style: decimal outside\n  }\n\n  ol.ol-decimal, ul.ul-disc, ul.ul-square {\n    margin-left: 1.8em\n  }\n\n  ol.ol-decimal > li, ul.ul-disc > li, ul.ul-square > li {\n    margin: 0 0 .5em\n  }\n\n  .ltr {\n    direction: ltr\n  }\n\n  .code, code {\n    font-family: Consolas, Monaco, monospace;\n    direction: ltr;\n    unicode-bidi: embed\n  }\n\n  code, kbd {\n    padding: 3px 5px 2px;\n    margin: 0 1px;\n    background: #f0f0f1;\n    background: rgba(0, 0, 0, .07);\n    font-size: 13px\n  }\n\n  .subsubsub {\n    list-style: none;\n    margin: 8px 0 0;\n    padding: 0;\n    font-size: 13px;\n    float: left;\n    color: #646970\n  }\n\n  .subsubsub a {\n    line-height: 2;\n    padding: .2em;\n    text-decoration: none\n  }\n\n  .subsubsub a .count, .subsubsub a.current .count {\n    color: #50575e;\n    font-weight: 400\n  }\n\n  .subsubsub a.current {\n    font-weight: 600;\n    border: none\n  }\n\n  .subsubsub li {\n    display: inline-block;\n    margin: 0;\n    padding: 0;\n    white-space: nowrap\n  }\n\n  .widefat {\n    border-spacing: 0;\n    width: 100%;\n    clear: both;\n    margin: 0\n  }\n\n  .widefat * {\n    word-wrap: break-word\n  }\n\n  .widefat a, .widefat button.button-link {\n    text-decoration: none\n  }\n\n  .widefat td, .widefat th {\n    padding: 8px 10px\n  }\n\n  .widefat thead td, .widefat thead th {\n    border-bottom: 1px solid #c3c4c7\n  }\n\n  .widefat tfoot td, .widefat tfoot th {\n    border-top: 1px solid #c3c4c7;\n    border-bottom: none\n  }\n\n  .widefat .no-items td {\n    border-bottom-width: 0\n  }\n\n  .widefat td {\n    vertical-align: top\n  }\n\n  .widefat td, .widefat td ol, .widefat td p, .widefat td ul {\n    font-size: 13px;\n    line-height: 1.5em\n  }\n\n  .widefat tfoot td, .widefat th, .widefat thead td {\n    text-align: left;\n    line-height: 1.3em;\n    font-size: 14px\n  }\n\n  .updates-table td input, .widefat tfoot td input, .widefat th input, .widefat thead td input {\n    margin: 0 0 0 8px;\n    padding: 0;\n    vertical-align: text-top\n  }\n\n  .widefat .check-column {\n    width: 2.2em;\n    padding: 6px 0 25px;\n    vertical-align: top\n  }\n\n  .widefat tbody th.check-column {\n    padding: 9px 0 22px\n  }\n\n  .updates-table tbody td.check-column, .widefat tbody th.check-column, .widefat tfoot td.check-column, .widefat thead td.check-column {\n    padding: 11px 0 0 3px\n  }\n\n  .widefat tfoot td.check-column, .widefat thead td.check-column {\n    padding-top: 4px;\n    vertical-align: middle\n  }\n\n  .update-php div.error, .update-php div.updated {\n    margin-left: 0\n  }\n\n  .no-js .widefat tfoot .check-column input, .no-js .widefat thead .check-column input {\n    display: none\n  }\n\n  .column-comments, .column-links, .column-posts, .widefat .num {\n    text-align: center\n  }\n\n  .widefat th#comments {\n    vertical-align: middle\n  }\n\n  .wrap {\n    margin: 10px 20px 0 2px\n  }\n\n  .wrap.block-editor-no-js {\n    padding-left: 20px\n  }\n\n  .postbox .inside h2, .wrap [class$=icon32] + h2, .wrap h1, .wrap > h2:first-child {\n    font-size: 23px;\n    font-weight: 400;\n    margin: 0;\n    padding: 9px 0 4px;\n    line-height: 1.3\n  }\n\n  .wrap h1.wp-heading-inline {\n    display: inline-block;\n    margin-right: 5px\n  }\n\n  .wp-header-end {\n    visibility: hidden;\n    margin: -2px 0 0\n  }\n\n  .subtitle {\n    margin: 0;\n    padding-left: 25px;\n    color: #50575e;\n    font-size: 14px;\n    font-weight: 400;\n    line-height: 1\n  }\n\n  .subtitle strong {\n    word-break: break-all\n  }\n\n  .wrap .add-new-h2, .wrap .add-new-h2:active, .wrap .page-title-action, .wrap .page-title-action:active {\n    margin-left: 4px;\n    padding: 4px 8px;\n    position: relative;\n    top: -3px;\n    text-decoration: none;\n    border: 1px solid #2271b1;\n    border-radius: 2px;\n    text-shadow: none;\n    font-weight: 600;\n    font-size: 13px;\n    line-height: normal;\n    color: #2271b1;\n    background: #f6f7f7;\n    cursor: pointer\n  }\n\n  .wrap .wp-heading-inline + .page-title-action {\n    margin-left: 0\n  }\n\n  .wrap .add-new-h2:hover, .wrap .page-title-action:hover {\n    background: #f0f0f1;\n    border-color: #0a4b78;\n    color: #0a4b78\n  }\n\n  .page-title-action:focus {\n    color: #0a4b78\n  }\n\n  .form-table th label[for=WPLANG] .dashicons, .form-table th label[for=locale] .dashicons {\n    margin-left: 5px\n  }\n\n  .wrap .page-title-action:focus {\n    border-color: #3582c4;\n    box-shadow: 0 0 0 1px #3582c4;\n    outline: 2px solid transparent\n  }\n\n  .wrap h1.long-header {\n    padding-right: 0\n  }\n\n  .wp-dialog {\n    background-color: #fff\n  }\n\n  #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 {\n    border-color: #8c8f94;\n    box-shadow: 0 1px 2px rgba(0, 0, 0, .1)\n  }\n\n  .sorthelper {\n    background-color: #c5d9ed\n  }\n\n  .ac_match, .subsubsub a.current {\n    color: #000\n  }\n\n  .alternate, .striped > tbody > :nth-child(odd), ul.striped > :nth-child(odd) {\n    background-color: #f6f7f7\n  }\n\n  .bar {\n    background-color: #f0f0f1;\n    border-right-color: #4f94d4\n  }\n\n  .highlight {\n    background-color: #f0f6fc;\n    color: #3c434a\n  }\n\n  .wp-ui-primary {\n    color: #fff;\n    background-color: #2c3338\n  }\n\n  .wp-ui-text-primary {\n    color: #2c3338\n  }\n\n  .wp-ui-highlight {\n    color: #fff;\n    background-color: #2271b1\n  }\n\n  .wp-ui-text-highlight {\n    color: #2271b1\n  }\n\n  .wp-ui-notification {\n    color: #fff;\n    background-color: #d63638\n  }\n\n  .wp-ui-text-notification {\n    color: #d63638\n  }\n\n  .wp-ui-text-icon {\n    color: #8c8f94\n  }\n\n  img.emoji {\n    display: inline !important;\n    border: none !important;\n    height: 1em !important;\n    width: 1em !important;\n    margin: 0 .07em !important;\n    vertical-align: -.1em !important;\n    background: 0 0 !important;\n    padding: 0 !important;\n    box-shadow: none !important\n  }\n\n  #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 {\n    line-height: 1.4em\n  }\n\n  .menu-item-handle, .widget .widget-top {\n    background: #f6f7f7;\n    color: #1d2327\n  }\n\n  .stuffbox .hndle {\n    border-bottom: 1px solid #c3c4c7\n  }\n\n  .quicktags {\n    background-color: #c3c4c7;\n    color: #000;\n    font-size: 12px\n  }\n\n  .icon32 {\n    display: none\n  }\n\n  #bulk-titles div a:before, .notice-dismiss:before, .tagchecklist .ntdelbutton .remove-tag-icon:before, .welcome-panel .welcome-panel-close:before {\n    background: 0 0;\n    color: #787c82;\n    content: \"\\f153\";\n    display: block;\n    font: normal 16px/20px dashicons;\n    speak: never;\n    height: 20px;\n    text-align: center;\n    width: 20px;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .welcome-panel .welcome-panel-close:before {\n    margin: 0\n  }\n\n  #bulk-titles div a:before {\n    margin: 1px 0\n  }\n\n  .tagchecklist .ntdelbutton .remove-tag-icon:before {\n    margin-left: 2px;\n    border-radius: 50%;\n    color: #2271b1;\n    line-height: 1.28\n  }\n\n  .tagchecklist .ntdelbutton:focus {\n    outline: 0\n  }\n\n  #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 {\n    color: #d63638\n  }\n\n  .tagchecklist .ntdelbutton:focus .remove-tag-icon:before {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8)\n  }\n\n  .key-labels label {\n    line-height: 24px\n  }\n\n  b, strong {\n    font-weight: 600\n  }\n\n  .pre {\n    white-space: pre-wrap;\n    word-wrap: break-word\n  }\n\n  .howto {\n    color: #646970;\n    display: block\n  }\n\n  p.install-help {\n    margin: 8px 0;\n    font-style: italic\n  }\n\n  .no-break {\n    white-space: nowrap\n  }\n\n  hr {\n    border: 0;\n    border-top: 1px solid #dcdcde;\n    border-bottom: 1px solid #f6f7f7\n  }\n\n  #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 {\n    color: #b32d2e\n  }\n\n  #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 {\n    color: #b32d2e;\n    border: none\n  }\n\n  #major-publishing-actions {\n    padding: 10px;\n    clear: both;\n    border-top: 1px solid #dcdcde;\n    background: #f6f7f7\n  }\n\n  #delete-action {\n    float: left;\n    line-height: 2.30769231\n  }\n\n  #delete-link {\n    line-height: 2.30769231;\n    vertical-align: middle;\n    text-align: left;\n    margin-left: 8px\n  }\n\n  #delete-link a {\n    text-decoration: none\n  }\n\n  #publishing-action {\n    text-align: right;\n    float: right;\n    line-height: 1.9\n  }\n\n  #publishing-action .spinner {\n    float: none;\n    margin-top: 5px\n  }\n\n  #misc-publishing-actions {\n    padding: 6px 0 0\n  }\n\n  .misc-pub-section {\n    padding: 6px 10px 8px\n  }\n\n  .misc-pub-filename {\n    word-wrap: break-word\n  }\n\n  #minor-publishing-actions {\n    padding: 10px 10px 0;\n    text-align: right\n  }\n\n  #save-post {\n    float: left\n  }\n\n  .preview {\n    float: right\n  }\n\n  #sticky-span {\n    margin-left: 18px\n  }\n\n  .approve, .unapproved .unapprove {\n    display: none\n  }\n\n  .spam .approve, .trash .approve, .unapproved .approve {\n    display: inline\n  }\n\n  td.action-links, th.action-links {\n    text-align: right\n  }\n\n  #misc-publishing-actions .notice {\n    margin-left: 10px;\n    margin-right: 10px\n  }\n\n  .wp-filter {\n    display: inline-block;\n    position: relative;\n    box-sizing: border-box;\n    margin: 12px 0 25px;\n    padding: 0 10px;\n    width: 100%;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04);\n    border: 1px solid #c3c4c7;\n    background: #fff;\n    color: #50575e;\n    font-size: 13px\n  }\n\n  .wp-filter a {\n    text-decoration: none\n  }\n\n  .filter-count {\n    display: inline-block;\n    vertical-align: middle;\n    min-width: 4em\n  }\n\n  .filter-count .count, .title-count {\n    display: inline-block;\n    position: relative;\n    top: -1px;\n    padding: 4px 10px;\n    border-radius: 30px;\n    background: #646970;\n    color: #fff;\n    font-size: 14px;\n    font-weight: 600\n  }\n\n  .title-count {\n    display: inline;\n    top: -3px;\n    margin-left: 5px;\n    margin-right: 20px\n  }\n\n  .filter-items {\n    float: left\n  }\n\n  .filter-links {\n    display: inline-block;\n    margin: 0\n  }\n\n  .filter-links li {\n    display: inline-block;\n    margin: 0\n  }\n\n  .filter-links li > a {\n    display: inline-block;\n    margin: 0 10px;\n    padding: 15px 0;\n    border-bottom: 4px solid #fff;\n    color: #646970;\n    cursor: pointer\n  }\n\n  .filter-links .current {\n    box-shadow: none;\n    border-bottom: 4px solid #646970;\n    color: #1d2327\n  }\n\n  .filter-links li > a:focus, .filter-links li > a:hover, .show-filters .filter-links a.current:focus, .show-filters .filter-links a.current:hover {\n    color: #135e96\n  }\n\n  .wp-filter .search-form {\n    float: right;\n    margin: 10px 0\n  }\n\n  .wp-filter .search-form input[type=search] {\n    margin: 1px 0;\n    width: 280px;\n    max-width: 100%\n  }\n\n  .wp-filter .search-form select {\n    margin: 0\n  }\n\n  .plugin-install-php .wp-filter {\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: space-between;\n    align-items: center\n  }\n\n  .wp-filter .search-form.search-plugins {\n    margin-top: 0\n  }\n\n  .wp-filter .search-form.search-plugins .wp-filter-search, .wp-filter .search-form.search-plugins select {\n    display: inline-block;\n    margin-top: 10px;\n    vertical-align: top\n  }\n\n  .wp-filter .button.drawer-toggle {\n    margin: 10px 9px 0;\n    padding: 0 10px 0 6px;\n    border-color: transparent;\n    background-color: transparent;\n    color: #646970;\n    vertical-align: baseline;\n    box-shadow: none\n  }\n\n  .wp-filter .drawer-toggle:before {\n    content: \"\\f111\";\n    margin: 0 5px 0 0;\n    color: #646970;\n    font: normal 16px/1 dashicons;\n    vertical-align: text-bottom;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .wp-filter .button.drawer-toggle:focus, .wp-filter .button.drawer-toggle:hover, .wp-filter .drawer-toggle:focus:before, .wp-filter .drawer-toggle:hover:before {\n    background-color: transparent;\n    color: #135e96\n  }\n\n  .wp-filter .button.drawer-toggle:focus:active, .wp-filter .button.drawer-toggle:hover {\n    border-color: transparent\n  }\n\n  .wp-filter .button.drawer-toggle:focus {\n    border-color: #4f94d4\n  }\n\n  .wp-filter .button.drawer-toggle:active {\n    background: 0 0;\n    box-shadow: none;\n    transform: none\n  }\n\n  .wp-filter .drawer-toggle.current:before {\n    color: #fff\n  }\n\n  .filter-drawer, .wp-filter .favorites-form {\n    display: none;\n    margin: 0 -10px 0 -20px;\n    padding: 20px;\n    border-top: 1px solid #f0f0f1;\n    background: #f6f7f7;\n    overflow: hidden\n  }\n\n  .show-favorites-form .favorites-form, .show-filters .filter-drawer {\n    display: block\n  }\n\n  .show-filters .filter-links a.current {\n    border-bottom: none\n  }\n\n  .show-filters .wp-filter .button.drawer-toggle {\n    border-radius: 2px;\n    background: #646970;\n    color: #fff\n  }\n\n  .show-filters .wp-filter .drawer-toggle:focus, .show-filters .wp-filter .drawer-toggle:hover {\n    background: #2271b1\n  }\n\n  .show-filters .wp-filter .drawer-toggle:before {\n    color: #fff\n  }\n\n  .filter-group {\n    box-sizing: border-box;\n    position: relative;\n    float: left;\n    margin: 0 1% 0 0;\n    padding: 20px 10px 10px;\n    width: 24%;\n    background: #fff;\n    border: 1px solid #dcdcde;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04)\n  }\n\n  .filter-group legend {\n    position: absolute;\n    top: 10px;\n    display: block;\n    margin: 0;\n    padding: 0;\n    font-size: 1em;\n    font-weight: 600\n  }\n\n  .filter-drawer .filter-group-feature {\n    margin: 28px 0 0;\n    list-style-type: none;\n    font-size: 12px\n  }\n\n  .filter-drawer .filter-group-feature input, .filter-drawer .filter-group-feature label {\n    line-height: 1.4\n  }\n\n  .filter-drawer .filter-group-feature input {\n    position: absolute;\n    margin: 0\n  }\n\n  .filter-group .filter-group-feature label {\n    display: block;\n    margin: 14px 0 14px 23px\n  }\n\n  .filter-drawer .buttons {\n    clear: both;\n    margin-bottom: 20px\n  }\n\n  .filter-drawer .filter-group + .buttons {\n    margin-bottom: 0;\n    padding-top: 20px\n  }\n\n  .filter-drawer .buttons .button span {\n    display: inline-block;\n    opacity: .8;\n    font-size: 12px;\n    text-indent: 10px\n  }\n\n  .wp-filter .button.clear-filters {\n    display: none;\n    margin-left: 10px\n  }\n\n  .wp-filter .button-link.edit-filters {\n    padding: 0 5px;\n    line-height: 2.2\n  }\n\n  .filtered-by {\n    display: none;\n    margin: 0\n  }\n\n  .filtered-by > span {\n    font-weight: 600\n  }\n\n  .filtered-by a {\n    margin-left: 10px\n  }\n\n  .filtered-by .tags {\n    display: inline\n  }\n\n  .filtered-by .tag {\n    margin: 0 5px;\n    padding: 4px 8px;\n    border: 1px solid #dcdcde;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04);\n    background: #fff;\n    font-size: 11px\n  }\n\n  .filters-applied .filter-drawer .buttons, .filters-applied .filter-drawer br, .filters-applied .filter-group {\n    display: none\n  }\n\n  .filters-applied .filtered-by {\n    display: block\n  }\n\n  .filters-applied .filter-drawer {\n    padding: 20px\n  }\n\n  .error .content-filterable, .loading-content .content-filterable, .show-filters .content-filterable, .show-filters .favorites-form, .show-filters.filters-applied.loading-content .content-filterable {\n    display: none\n  }\n\n  .show-filters.filters-applied .content-filterable {\n    display: block\n  }\n\n  .loading-content .spinner {\n    display: block;\n    margin: 40px auto 0;\n    float: none\n  }\n\n  @media only screen and (max-width: 1120px) {\n    .filter-drawer {\n      border-bottom: 1px solid #f0f0f1\n    }\n    .filter-group {\n      margin-bottom: 0;\n      margin-top: 5px;\n      width: 100%\n    }\n    .filter-group li {\n      margin: 10px 0\n    }\n  }\n  @media only screen and (max-width: 1000px) {\n    .filter-items {\n      float: none\n    }\n    .wp-filter .media-toolbar-primary, .wp-filter .media-toolbar-secondary, .wp-filter .search-form {\n      float: none;\n      position: relative;\n      max-width: 100%\n    }\n  }\n  @media only screen and (max-width: 782px) {\n    .filter-group li {\n      padding: 0;\n      width: 50%\n    }\n  }\n  @media only screen and (max-width: 320px) {\n    .filter-count {\n      display: none\n    }\n    .wp-filter .drawer-toggle {\n      margin: 10px 0\n    }\n    .filter-group li, .wp-filter .search-form input[type=search] {\n      width: 100%\n    }\n  }\n\n  .notice, div.error, div.updated {\n    background: #fff;\n    border: 1px solid #c3c4c7;\n    border-left-width: 4px;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04);\n    margin: 5px 15px 2px;\n    padding: 1px 12px\n  }\n\n  div[class=update-message] {\n    padding: .5em 12px .5em 0\n  }\n\n  .form-table td .notice p, .notice p, .notice-title, div.error p, div.updated p {\n    margin: .5em 0;\n    padding: 2px\n  }\n\n  .error a {\n    text-decoration: underline\n  }\n\n  .updated a {\n    padding-bottom: 2px\n  }\n\n  .notice-alt {\n    box-shadow: none\n  }\n\n  .notice-large {\n    padding: 10px 20px\n  }\n\n  .notice-title {\n    display: inline-block;\n    color: #1d2327;\n    font-size: 18px\n  }\n\n  .wp-core-ui .notice.is-dismissible {\n    padding-right: 38px;\n    position: relative\n  }\n\n  .notice-dismiss {\n    position: absolute;\n    top: 0;\n    right: 1px;\n    border: none;\n    margin: 0;\n    padding: 9px;\n    background: 0 0;\n    color: #787c82;\n    cursor: pointer\n  }\n\n  .notice-dismiss:active:before, .notice-dismiss:focus:before, .notice-dismiss:hover:before {\n    color: #d63638\n  }\n\n  .notice-dismiss:focus {\n    outline: 0;\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8)\n  }\n\n  .notice-success, div.updated {\n    border-left-color: #00a32a\n  }\n\n  .notice-success.notice-alt {\n    background-color: #edfaef\n  }\n\n  .notice-warning {\n    border-left-color: #dba617\n  }\n\n  .notice-warning.notice-alt {\n    background-color: #fcf9e8\n  }\n\n  .notice-error, div.error {\n    border-left-color: #d63638\n  }\n\n  .notice-error.notice-alt {\n    background-color: #fcf0f1\n  }\n\n  .notice-info {\n    border-left-color: #72aee6\n  }\n\n  .notice-info.notice-alt {\n    background-color: #f0f6fc\n  }\n\n  .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 {\n    display: inline-block;\n    font: normal 20px/1 dashicons;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    vertical-align: top\n  }\n\n  .media-upload-form .notice, .media-upload-form div.error, .wrap .notice, .wrap div.error, .wrap div.updated {\n    margin: 5px 0 15px\n  }\n\n  .wrap #templateside .notice {\n    display: block;\n    margin: 0;\n    padding: 5px 8px;\n    font-weight: 600;\n    text-decoration: none\n  }\n\n  .wrap #templateside span.notice {\n    margin-left: -12px\n  }\n\n  #templateside li.notice a {\n    padding: 0\n  }\n\n  .button.installing:before, .button.updating-message:before, .import-php .updating-message:before, .update-message p:before, .updating-message p:before {\n    color: #d63638;\n    content: \"\\f463\"\n  }\n\n  .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 {\n    animation: rotation 2s infinite linear\n  }\n\n  @media (prefers-reduced-motion: reduce) {\n    .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 {\n      animation: none\n    }\n  }\n\n  .theme-overlay .theme-autoupdate .dashicons-update.spin {\n    margin-right: 3px\n  }\n\n  .button.updated-message:before, .installed p:before, .updated-message p:before {\n    color: #68de7c;\n    content: \"\\f147\"\n  }\n\n  .update-message.notice-error p:before {\n    color: #d63638;\n    content: \"\\f534\"\n  }\n\n  .import-php .updating-message:before, .wrap .notice p:before {\n    margin-right: 6px;\n    vertical-align: bottom\n  }\n\n  #update-nag, .update-nag {\n    display: inline-block;\n    line-height: 1.4;\n    padding: 11px 15px;\n    font-size: 14px;\n    margin: 25px 20px 0 2px\n  }\n\n  ul#dismissed-updates {\n    display: none\n  }\n\n  #dismissed-updates li > p {\n    margin-top: 0\n  }\n\n  #dismiss, #undismiss {\n    margin-left: .5em\n  }\n\n  form.upgrade {\n    margin-top: 8px\n  }\n\n  form.upgrade .hint {\n    font-style: italic;\n    font-size: 85%;\n    margin: -.5em 0 2em\n  }\n\n  .update-php .spinner {\n    float: none;\n    margin: -4px 0\n  }\n\n  h2.wp-current-version {\n    margin-bottom: .3em\n  }\n\n  p.update-last-checked {\n    margin-top: 0\n  }\n\n  p.auto-update-status {\n    margin-top: 2em;\n    line-height: 1.8\n  }\n\n  #ajax-loading, .ajax-feedback, .ajax-loading, .imgedit-wait-spin, .list-ajax-loading {\n    visibility: hidden\n  }\n\n  #ajax-response.alignleft {\n    margin-left: 2em\n  }\n\n  .button.installed:before, .button.installing:before, .button.updated-message:before, .button.updating-message:before {\n    margin: 3px 5px 0 -2px\n  }\n\n  .button-primary.updating-message:before {\n    color: #fff\n  }\n\n  .button-primary.updated-message:before {\n    color: #9ec2e6\n  }\n\n  .button.updated-message {\n    transition-property: border, background, color;\n    transition-duration: .05s;\n    transition-timing-function: ease-in-out\n  }\n\n  @media aural {\n    .button.installed:before, .button.installing:before, .update-message p:before, .wrap .notice p:before {\n      speak: never\n    }\n  }\n\n  #adminmenu a, #catlist a, #taglist a {\n    text-decoration: none\n  }\n\n  #contextual-help-wrap, #screen-options-wrap {\n    margin: 0;\n    padding: 8px 20px 12px;\n    position: relative\n  }\n\n  #contextual-help-wrap {\n    overflow: auto;\n    margin-left: 0\n  }\n\n  #screen-meta-links {\n    float: right;\n    margin: 0 20px 0 0\n  }\n\n  #screen-meta {\n    display: none;\n    margin: 0 20px -1px 0;\n    position: relative;\n    background-color: #fff;\n    border: 1px solid #c3c4c7;\n    border-top: none;\n    box-shadow: 0 0 0 transparent\n  }\n\n  #contextual-help-link-wrap, #screen-options-link-wrap {\n    float: left;\n    margin: 0 0 0 6px\n  }\n\n  #screen-meta-links .screen-meta-toggle {\n    position: relative;\n    top: 0\n  }\n\n  #screen-meta-links .show-settings {\n    border: 1px solid #c3c4c7;\n    border-top: none;\n    height: auto;\n    margin-bottom: 0;\n    padding: 3px 6px 3px 16px;\n    background: #fff;\n    border-radius: 0 0 4px 4px;\n    color: #646970;\n    line-height: 1.7;\n    box-shadow: 0 0 0 transparent;\n    transition: box-shadow .1s linear\n  }\n\n  #screen-meta-links .show-settings:active, #screen-meta-links .show-settings:focus, #screen-meta-links .show-settings:hover {\n    color: #2c3338\n  }\n\n  #screen-meta-links .show-settings:focus {\n    border-color: #4f94d4;\n    box-shadow: 0 0 3px rgba(34, 113, 177, .8)\n  }\n\n  #screen-meta-links .show-settings:active {\n    transform: none\n  }\n\n  #screen-meta-links .show-settings:after {\n    right: 0;\n    content: \"\\f140\";\n    font: normal 20px/1 dashicons;\n    speak: never;\n    display: inline-block;\n    padding: 0 5px 0 0;\n    bottom: 2px;\n    position: relative;\n    vertical-align: bottom;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    text-decoration: none\n  }\n\n  #screen-meta-links .screen-meta-active:after {\n    content: \"\\f142\"\n  }\n\n  .toggle-arrow {\n    background-repeat: no-repeat;\n    background-position: top left;\n    background-color: transparent;\n    height: 22px;\n    line-height: 22px;\n    display: block\n  }\n\n  .toggle-arrow-active {\n    background-position: bottom left\n  }\n\n  #contextual-help-wrap h5, #screen-options-wrap h5, #screen-options-wrap legend {\n    margin: 0;\n    padding: 8px 0;\n    font-size: 13px;\n    font-weight: 600\n  }\n\n  .metabox-prefs label {\n    display: inline-block;\n    padding-right: 15px;\n    line-height: 2.35\n  }\n\n  #number-of-columns {\n    display: inline-block;\n    vertical-align: middle;\n    line-height: 30px\n  }\n\n  .metabox-prefs input[type=checkbox] {\n    margin-top: 0;\n    margin-right: 6px\n  }\n\n  .metabox-prefs label input, .metabox-prefs label input[type=checkbox] {\n    margin: -4px 5px 0 0\n  }\n\n  .metabox-prefs .columns-prefs label input {\n    margin: -1px 2px 0 0\n  }\n\n  .metabox-prefs label a {\n    display: none\n  }\n\n  .metabox-prefs .screen-options input, .metabox-prefs .screen-options label {\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle\n  }\n\n  .metabox-prefs .screen-options .screen-per-page {\n    margin-right: 15px\n  }\n\n  .metabox-prefs .screen-options label {\n    line-height: 2.2;\n    padding-right: 0\n  }\n\n  .screen-options + .screen-options {\n    margin-top: 10px\n  }\n\n  .metabox-prefs .submit {\n    margin-top: 1em;\n    padding: 0\n  }\n\n  #contextual-help-wrap {\n    padding: 0\n  }\n\n  #contextual-help-columns {\n    position: relative\n  }\n\n  #contextual-help-back {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 150px;\n    right: 170px;\n    border: 1px solid #c3c4c7;\n    border-top: none;\n    border-bottom: none;\n    background: #f0f6fc\n  }\n\n  #contextual-help-wrap.no-sidebar #contextual-help-back {\n    right: 0;\n    border-right-width: 0;\n    border-bottom-right-radius: 2px\n  }\n\n  .contextual-help-tabs {\n    float: left;\n    width: 150px;\n    margin: 0\n  }\n\n  .contextual-help-tabs ul {\n    margin: 1em 0\n  }\n\n  .contextual-help-tabs li {\n    margin-bottom: 0;\n    list-style-type: none;\n    border-style: solid;\n    border-width: 0 0 0 2px;\n    border-color: transparent\n  }\n\n  .contextual-help-tabs a {\n    display: block;\n    padding: 5px 5px 5px 12px;\n    line-height: 1.4;\n    text-decoration: none;\n    border: 1px solid transparent;\n    border-right: none;\n    border-left: none\n  }\n\n  .contextual-help-tabs a:hover {\n    color: #2c3338\n  }\n\n  .contextual-help-tabs .active {\n    padding: 0;\n    margin: 0 -1px 0 0;\n    border-left: 2px solid #72aee6;\n    background: #f0f6fc;\n    box-shadow: 0 2px 0 rgba(0, 0, 0, .02), 0 1px 0 rgba(0, 0, 0, .02)\n  }\n\n  .contextual-help-tabs .active a {\n    border-color: #c3c4c7;\n    color: #2c3338\n  }\n\n  .contextual-help-tabs-wrap {\n    padding: 0 20px;\n    overflow: auto\n  }\n\n  .help-tab-content {\n    display: none;\n    margin: 0 22px 12px 0;\n    line-height: 1.6\n  }\n\n  .help-tab-content.active {\n    display: block\n  }\n\n  .help-tab-content ul li {\n    list-style-type: disc;\n    margin-left: 18px\n  }\n\n  .contextual-help-sidebar {\n    width: 150px;\n    float: right;\n    padding: 0 8px 0 12px;\n    overflow: auto\n  }\n\n  html.wp-toolbar {\n    padding-top: 32px;\n    box-sizing: border-box;\n    -ms-overflow-style: scrollbar\n  }\n\n  .widefat td, .widefat th {\n    color: #50575e\n  }\n\n  .widefat tfoot td, .widefat th, .widefat thead td {\n    font-weight: 400\n  }\n\n  .widefat tfoot tr td, .widefat tfoot tr th, .widefat thead tr td, .widefat thead tr th {\n    color: #2c3338\n  }\n\n  .widefat td p {\n    margin: 2px 0 .8em\n  }\n\n  .widefat ol, .widefat p, .widefat ul {\n    color: #2c3338\n  }\n\n  .widefat .column-comment p {\n    margin: .6em 0\n  }\n\n  .widefat .column-comment ul {\n    list-style: initial;\n    margin-left: 2em\n  }\n\n  .postbox-container {\n    float: left\n  }\n\n  .postbox-container .meta-box-sortables {\n    box-sizing: border-box\n  }\n\n  #wpbody-content .metabox-holder {\n    padding-top: 10px\n  }\n\n  .metabox-holder .postbox-container .meta-box-sortables {\n    min-height: 1px;\n    position: relative\n  }\n\n  #post-body-content {\n    width: 100%;\n    min-width: 463px;\n    float: left\n  }\n\n  #post-body.columns-2 #postbox-container-1 {\n    float: right;\n    margin-right: -300px;\n    width: 280px\n  }\n\n  #post-body.columns-2 #side-sortables {\n    min-height: 250px\n  }\n\n  @media only screen and (max-width: 799px) {\n    #wpbody-content .metabox-holder .postbox-container .empty-container {\n      outline: 0;\n      height: 0;\n      min-height: 0\n    }\n  }\n\n  .js .postbox .hndle, .js .widget .widget-top {\n    cursor: move\n  }\n\n  .js .postbox .hndle.is-non-sortable, .js .widget .widget-top.is-non-sortable {\n    cursor: auto\n  }\n\n  .hndle a {\n    font-size: 12px;\n    font-weight: 400\n  }\n\n  .postbox-header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    border-bottom: 1px solid #c3c4c7\n  }\n\n  .postbox-header .hndle {\n    flex-grow: 1;\n    display: flex;\n    justify-content: space-between;\n    align-items: center\n  }\n\n  .postbox-header .handle-actions {\n    flex-shrink: 0\n  }\n\n  .postbox .handle-order-higher, .postbox .handle-order-lower, .postbox .handlediv {\n    width: 36px;\n    height: 36px;\n    margin: 0;\n    padding: 0;\n    border: 0;\n    background: 0 0;\n    cursor: pointer\n  }\n\n  .postbox .handle-order-higher, .postbox .handle-order-lower {\n    color: #787c82;\n    width: 1.62rem\n  }\n\n  .edit-post-meta-boxes-area .postbox .handle-order-higher, .edit-post-meta-boxes-area .postbox .handle-order-lower {\n    width: 44px;\n    height: 44px;\n    color: #1d2327\n  }\n\n  .postbox .handle-order-higher[aria-disabled=true], .postbox .handle-order-lower[aria-disabled=true] {\n    cursor: default;\n    color: #a7aaad\n  }\n\n  .sortable-placeholder {\n    border: 1px dashed #c3c4c7;\n    margin-bottom: 20px\n  }\n\n  .postbox, .stuffbox {\n    margin-bottom: 20px;\n    padding: 0;\n    line-height: 1\n  }\n\n  .postbox.closed {\n    border-bottom: 0\n  }\n\n  .postbox .hndle, .stuffbox .hndle {\n    -webkit-user-select: none;\n    user-select: none\n  }\n\n  .postbox .inside {\n    padding: 0 12px 12px;\n    line-height: 1.4;\n    font-size: 13px\n  }\n\n  .stuffbox .inside {\n    padding: 0;\n    line-height: 1.4;\n    font-size: 13px;\n    margin-top: 0\n  }\n\n  .postbox .inside {\n    margin: 11px 0;\n    position: relative\n  }\n\n  .postbox .inside > p:last-child, .rss-widget ul li:last-child {\n    margin-bottom: 1px !important\n  }\n\n  .postbox.closed h3 {\n    border: none;\n    box-shadow: none\n  }\n\n  .postbox table.form-table {\n    margin-bottom: 0\n  }\n\n  .postbox table.widefat {\n    box-shadow: none\n  }\n\n  .temp-border {\n    border: 1px dotted #c3c4c7\n  }\n\n  .columns-prefs label {\n    padding: 0 10px 0 0\n  }\n\n  #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 {\n    font-weight: 600\n  }\n\n  #wpfooter {\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    padding: 10px 20px;\n    color: #50575e\n  }\n\n  #wpfooter p {\n    font-size: 13px;\n    margin: 0;\n    line-height: 1.55\n  }\n\n  #footer-thankyou {\n    font-style: italic\n  }\n\n  .nav-tab {\n    float: left;\n    border: 1px solid #c3c4c7;\n    border-bottom: none;\n    margin-left: .5em;\n    padding: 5px 10px;\n    font-size: 14px;\n    line-height: 1.71428571;\n    font-weight: 600;\n    background: #dcdcde;\n    color: #50575e;\n    text-decoration: none;\n    white-space: nowrap\n  }\n\n  .nav-tab-small .nav-tab, h3 .nav-tab {\n    padding: 5px 14px;\n    font-size: 12px;\n    line-height: 1.33\n  }\n\n  .nav-tab:focus, .nav-tab:hover {\n    background-color: #fff;\n    color: #3c434a\n  }\n\n  .nav-tab-active, .nav-tab:focus:active {\n    box-shadow: none\n  }\n\n  .nav-tab-active {\n    margin-bottom: -1px;\n    color: #3c434a\n  }\n\n  .nav-tab-active, .nav-tab-active:focus, .nav-tab-active:focus:active, .nav-tab-active:hover {\n    border-bottom: 1px solid #f0f0f1;\n    background: #f0f0f1;\n    color: #000\n  }\n\n  .nav-tab-wrapper, .wrap h2.nav-tab-wrapper, h1.nav-tab-wrapper {\n    border-bottom: 1px solid #c3c4c7;\n    margin: 0;\n    padding-top: 9px;\n    padding-bottom: 0;\n    line-height: inherit\n  }\n\n  .nav-tab-wrapper:not(.wp-clearfix):after {\n    content: \"\";\n    display: table;\n    clear: both\n  }\n\n  .spinner {\n    background: url(images/spinner.gif) no-repeat;\n    background-size: 20px 20px;\n    display: inline-block;\n    visibility: hidden;\n    float: right;\n    vertical-align: middle;\n    opacity: .7;\n    width: 20px;\n    height: 20px;\n    margin: 4px 10px 0\n  }\n\n  .loading-content .spinner, .spinner.is-active {\n    visibility: visible\n  }\n\n  #template > div {\n    margin-right: 16em\n  }\n\n  #template .notice {\n    margin-top: 1em;\n    margin-right: 3%\n  }\n\n  #template .notice p {\n    width: auto\n  }\n\n  #template .submit .spinner {\n    float: none\n  }\n\n  .metabox-holder .postbox > h3, .metabox-holder .stuffbox > h3, .metabox-holder h2.hndle, .metabox-holder h3.hndle {\n    font-size: 14px;\n    padding: 8px 12px;\n    margin: 0;\n    line-height: 1.4\n  }\n\n  .nav-menus-php .metabox-holder h3 {\n    padding: 10px 10px 11px 14px;\n    line-height: 1.5\n  }\n\n  #templateside ul li a {\n    text-decoration: none\n  }\n\n  .plugin-install #description, .plugin-install-network #description {\n    width: 60%\n  }\n\n  table .column-rating, table .column-visible, table .vers {\n    text-align: left\n  }\n\n  .attention, .error-message {\n    color: #d63638;\n    font-weight: 600\n  }\n\n  body.iframe {\n    height: 98%\n  }\n\n  .lp-show-latest p {\n    display: none\n  }\n\n  .lp-show-latest .lp-error p, .lp-show-latest p:last-child {\n    display: block\n  }\n\n  .media-icon {\n    width: 62px;\n    text-align: center\n  }\n\n  .media-icon img {\n    border: 1px solid #dcdcde;\n    border: 1px solid rgba(0, 0, 0, .07)\n  }\n\n  #howto {\n    font-size: 11px;\n    margin: 0 5px;\n    display: block\n  }\n\n  .importers {\n    font-size: 16px;\n    width: auto\n  }\n\n  .importers td {\n    padding-right: 14px;\n    line-height: 1.4\n  }\n\n  .importers .import-system {\n    max-width: 250px\n  }\n\n  .importers td.desc {\n    max-width: 500px\n  }\n\n  .importer-action, .importer-desc, .importer-title {\n    display: block\n  }\n\n  .importer-title {\n    color: #000;\n    font-size: 14px;\n    font-weight: 400;\n    margin-bottom: .2em\n  }\n\n  .importer-action {\n    line-height: 1.55;\n    color: #50575e;\n    margin-bottom: 1em\n  }\n\n  #post-body #post-body-content #namediv h2, #post-body #post-body-content #namediv h3 {\n    margin-top: 0\n  }\n\n  .edit-comment-author {\n    color: #1d2327;\n    border-bottom: 1px solid #f0f0f1\n  }\n\n  #namediv h2 label, #namediv h3 label {\n    vertical-align: baseline\n  }\n\n  #namediv table {\n    width: 100%\n  }\n\n  #namediv td.first {\n    width: 10px;\n    white-space: nowrap\n  }\n\n  #namediv input {\n    width: 100%\n  }\n\n  #namediv p {\n    margin: 10px 0\n  }\n\n  .zerosize {\n    height: 0;\n    width: 0;\n    margin: 0;\n    border: 0;\n    padding: 0;\n    overflow: hidden;\n    position: absolute\n  }\n\n  br.clear {\n    height: 2px;\n    line-height: .15\n  }\n\n  .checkbox {\n    border: none;\n    margin: 0;\n    padding: 0\n  }\n\n  fieldset {\n    border: 0;\n    padding: 0;\n    margin: 0\n  }\n\n  .post-categories {\n    display: inline;\n    margin: 0;\n    padding: 0\n  }\n\n  .post-categories li {\n    display: inline\n  }\n\n  div.star-holder {\n    position: relative;\n    height: 17px;\n    width: 100px;\n    background: url(images/stars.png?ver=20121108) repeat-x bottom left\n  }\n\n  div.star-holder .star-rating {\n    background: url(images/stars.png?ver=20121108) repeat-x top left;\n    height: 17px;\n    float: left\n  }\n\n  .star-rating {\n    white-space: nowrap\n  }\n\n  .star-rating .star {\n    display: inline-block;\n    width: 20px;\n    height: 20px;\n    -webkit-font-smoothing: antialiased;\n    font-size: 20px;\n    line-height: 1;\n    font-family: dashicons;\n    text-decoration: inherit;\n    font-weight: 400;\n    font-style: normal;\n    vertical-align: top;\n    transition: color .1s ease-in;\n    text-align: center;\n    color: #dba617\n  }\n\n  .star-rating .star-full:before {\n    content: \"\\f155\"\n  }\n\n  .star-rating .star-half:before {\n    content: \"\\f459\"\n  }\n\n  .rtl .star-rating .star-half {\n    transform: rotateY(180deg)\n  }\n\n  .star-rating .star-empty:before {\n    content: \"\\f154\"\n  }\n\n  div.action-links {\n    font-weight: 400;\n    margin: 6px 0 0\n  }\n\n  #plugin-information {\n    background: #fff;\n    position: fixed;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    height: 100%;\n    padding: 0\n  }\n\n  #plugin-information-scrollable {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    height: 100%\n  }\n\n  #plugin-information-title {\n    padding: 0 26px;\n    background: #f6f7f7;\n    font-size: 22px;\n    font-weight: 600;\n    line-height: 2.4;\n    position: relative;\n    height: 56px\n  }\n\n  #plugin-information-title.with-banner {\n    margin-right: 0;\n    height: 250px;\n    background-size: cover\n  }\n\n  #plugin-information-title h2 {\n    font-size: 1em;\n    font-weight: 600;\n    padding: 0;\n    margin: 0;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap\n  }\n\n  #plugin-information-title.with-banner h2 {\n    position: relative;\n    font-family: \"Helvetica Neue\", sans-serif;\n    display: inline-block;\n    font-size: 30px;\n    line-height: 1.68;\n    box-sizing: border-box;\n    max-width: 100%;\n    padding: 0 15px;\n    margin-top: 174px;\n    color: #fff;\n    background: rgba(29, 35, 39, .9);\n    text-shadow: 0 1px 3px rgba(0, 0, 0, .4);\n    box-shadow: 0 0 30px rgba(255, 255, 255, .1);\n    border-radius: 8px\n  }\n\n  #plugin-information-title div.vignette {\n    display: none\n  }\n\n  #plugin-information-title.with-banner div.vignette {\n    position: absolute;\n    display: block;\n    top: 0;\n    left: 0;\n    height: 250px;\n    width: 100%;\n    background: 0 0;\n    box-shadow: inset 0 0 50px 4px rgba(0, 0, 0, .2), inset 0 -1px 0 rgba(0, 0, 0, .1)\n  }\n\n  #plugin-information-tabs {\n    padding: 0 16px;\n    position: relative;\n    right: 0;\n    left: 0;\n    min-height: 36px;\n    font-size: 0;\n    z-index: 1;\n    border-bottom: 1px solid #dcdcde;\n    background: #f6f7f7\n  }\n\n  #plugin-information-tabs a {\n    position: relative;\n    display: inline-block;\n    padding: 9px 10px;\n    margin: 0;\n    height: 18px;\n    line-height: 1.3;\n    font-size: 14px;\n    text-decoration: none;\n    transition: none\n  }\n\n  #plugin-information-tabs a.current {\n    margin: 0 -1px -1px;\n    background: #fff;\n    border: 1px solid #dcdcde;\n    border-bottom-color: #fff;\n    padding-top: 8px;\n    color: #2c3338\n  }\n\n  #plugin-information-tabs.with-banner a.current {\n    border-top: none;\n    padding-top: 9px\n  }\n\n  #plugin-information-tabs a:active, #plugin-information-tabs a:focus {\n    outline: 0\n  }\n\n  #plugin-information-content {\n    overflow: hidden;\n    background: #fff;\n    position: relative;\n    top: 0;\n    right: 0;\n    left: 0;\n    min-height: 100%;\n    min-height: calc(100% - 152px)\n  }\n\n  #plugin-information-content.with-banner {\n    min-height: calc(100% - 346px)\n  }\n\n  #section-holder {\n    position: relative;\n    top: 0;\n    right: 250px;\n    bottom: 0;\n    left: 0;\n    margin-top: 10px;\n    margin-right: 250px;\n    padding: 10px 26px 99999px;\n    margin-bottom: -99932px\n  }\n\n  #section-holder .notice {\n    margin: 5px 0 15px\n  }\n\n  #section-holder .updated {\n    margin: 16px 0\n  }\n\n  #plugin-information .fyi {\n    float: right;\n    position: relative;\n    top: 0;\n    right: 0;\n    padding: 16px 16px 99999px;\n    margin-bottom: -99932px;\n    width: 217px;\n    border-left: 1px solid #dcdcde;\n    background: #f6f7f7;\n    color: #646970\n  }\n\n  #plugin-information .fyi strong {\n    color: #3c434a\n  }\n\n  #plugin-information .fyi h3 {\n    font-weight: 600;\n    text-transform: uppercase;\n    font-size: 12px;\n    color: #646970;\n    margin: 24px 0 8px\n  }\n\n  #plugin-information .fyi h2 {\n    font-size: .9em;\n    margin-bottom: 0;\n    margin-right: 0\n  }\n\n  #plugin-information .fyi ul {\n    padding: 0;\n    margin: 0;\n    list-style: none\n  }\n\n  #plugin-information .fyi li {\n    margin: 0 0 10px\n  }\n\n  #plugin-information .fyi-description {\n    margin-top: 0\n  }\n\n  #plugin-information .counter-container {\n    margin: 3px 0\n  }\n\n  #plugin-information .counter-label {\n    float: left;\n    margin-right: 5px;\n    min-width: 55px\n  }\n\n  #plugin-information .counter-back {\n    height: 17px;\n    width: 92px;\n    background-color: #dcdcde;\n    float: left\n  }\n\n  #plugin-information .counter-bar {\n    height: 17px;\n    background-color: #f0c33c;\n    float: left\n  }\n\n  #plugin-information .counter-count {\n    margin-left: 5px\n  }\n\n  #plugin-information .fyi ul.contributors {\n    margin-top: 10px\n  }\n\n  #plugin-information .fyi ul.contributors li {\n    display: inline-block;\n    margin-right: 8px;\n    vertical-align: middle\n  }\n\n  #plugin-information .fyi ul.contributors li {\n    display: inline-block;\n    margin-right: 8px;\n    vertical-align: middle\n  }\n\n  #plugin-information .fyi ul.contributors li img {\n    vertical-align: middle;\n    margin-right: 4px\n  }\n\n  #plugin-information-footer {\n    padding: 13px 16px;\n    position: absolute;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    height: 40px;\n    border-top: 1px solid #dcdcde;\n    background: #f6f7f7\n  }\n\n  #plugin-information .section {\n    direction: ltr\n  }\n\n  #plugin-information .section ol, #plugin-information .section ul {\n    list-style-type: disc;\n    margin-left: 24px\n  }\n\n  #plugin-information .section, #plugin-information .section p {\n    font-size: 14px;\n    line-height: 1.7\n  }\n\n  #plugin-information #section-screenshots ol {\n    list-style: none;\n    margin: 0\n  }\n\n  #plugin-information #section-screenshots li img {\n    vertical-align: text-top;\n    margin-top: 16px;\n    max-width: 100%;\n    width: auto;\n    height: auto;\n    box-shadow: 0 1px 2px rgba(0, 0, 0, .3)\n  }\n\n  #plugin-information #section-screenshots li p {\n    font-style: italic;\n    padding-left: 20px\n  }\n\n  #plugin-information pre {\n    padding: 7px;\n    overflow: auto;\n    border: 1px solid #c3c4c7\n  }\n\n  #plugin-information blockquote {\n    border-left: 2px solid #dcdcde;\n    color: #646970;\n    font-style: italic;\n    margin: 1em 0;\n    padding: 0 0 0 1em\n  }\n\n  #plugin-information .review {\n    overflow: hidden;\n    width: 100%;\n    margin-bottom: 20px;\n    border-bottom: 1px solid #dcdcde\n  }\n\n  #plugin-information .review-title-section {\n    overflow: hidden\n  }\n\n  #plugin-information .review-title-section h4 {\n    display: inline-block;\n    float: left;\n    margin: 0 6px 0 0\n  }\n\n  #plugin-information .reviewer-info p {\n    clear: both;\n    margin: 0;\n    padding-top: 2px\n  }\n\n  #plugin-information .reviewer-info .avatar {\n    float: left;\n    margin: 4px 6px 0 0\n  }\n\n  #plugin-information .reviewer-info .star-rating {\n    float: left\n  }\n\n  #plugin-information .review-meta {\n    float: left;\n    margin-left: .75em\n  }\n\n  #plugin-information .review-body {\n    float: left;\n    width: 100%\n  }\n\n  .plugin-version-author-uri {\n    font-size: 13px\n  }\n\n  .update-php .button.button-primary {\n    margin-right: 1em\n  }\n\n  @media screen and (max-width: 771px) {\n    #plugin-information-title.with-banner {\n      height: 100px\n    }\n    #plugin-information-title.with-banner h2 {\n      margin-top: 30px;\n      font-size: 20px;\n      line-height: 2;\n      max-width: 85%\n    }\n    #plugin-information-title.with-banner div.vignette {\n      height: 100px\n    }\n    #plugin-information-tabs {\n      overflow: hidden;\n      padding: 0;\n      height: auto\n    }\n    #plugin-information-tabs a.current {\n      margin-bottom: 0;\n      border-bottom: none\n    }\n    #plugin-information .fyi {\n      float: none;\n      border: 1px solid #dcdcde;\n      position: static;\n      width: auto;\n      margin: 26px 26px 0;\n      padding-bottom: 0\n    }\n    #section-holder {\n      position: static;\n      margin: 0;\n      padding-bottom: 70px\n    }\n    #plugin-information .fyi h3, #plugin-information .fyi small {\n      display: none\n    }\n    #plugin-information-footer {\n      padding: 12px 16px 0;\n      height: 46px\n    }\n  }\n\n  #TB_window.plugin-details-modal {\n    background: #fff\n  }\n\n  #TB_window.plugin-details-modal.thickbox-loading:before {\n    content: \"\";\n    display: block;\n    width: 20px;\n    height: 20px;\n    position: absolute;\n    left: 50%;\n    top: 50%;\n    z-index: -1;\n    margin: -10px 0 0 -10px;\n    background: #fff url(images/spinner.gif) no-repeat center;\n    background-size: 20px 20px;\n    transform: translateZ(0)\n  }\n\n  @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {\n    #TB_window.plugin-details-modal.thickbox-loading:before {\n      background-image: url(images/spinner-2x.gif)\n    }\n  }\n\n  .plugin-details-modal #TB_title {\n    float: left;\n    height: 1px\n  }\n\n  .plugin-details-modal #TB_ajaxWindowTitle {\n    display: none\n  }\n\n  .plugin-details-modal #TB_closeWindowButton {\n    left: auto;\n    right: -30px;\n    color: #f0f0f1\n  }\n\n  .plugin-details-modal #TB_closeWindowButton:focus, .plugin-details-modal #TB_closeWindowButton:hover {\n    color: #135e96;\n    outline: 0;\n    box-shadow: none\n  }\n\n  .plugin-details-modal .tb-close-icon {\n    display: none\n  }\n\n  .plugin-details-modal #TB_closeWindowButton:after {\n    content: \"\\f335\";\n    font: normal 32px/29px dashicons;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  @media screen and (max-width: 830px) {\n    .plugin-details-modal #TB_closeWindowButton {\n      right: 0;\n      top: -30px\n    }\n  }\n\n  img {\n    border: none\n  }\n\n  .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 {\n    content: \"\\f142\";\n    display: inline-block;\n    font: normal 20px/1 dashicons;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    text-decoration: none\n  }\n\n  .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 {\n    content: \"\\f140\"\n  }\n\n  .postbox .handle-order-higher .order-higher-indicator::before {\n    content: \"\\f343\";\n    color: inherit\n  }\n\n  .postbox .handle-order-lower .order-lower-indicator::before {\n    content: \"\\f347\";\n    color: inherit\n  }\n\n  .postbox .handle-order-higher .order-higher-indicator::before, .postbox .handle-order-lower .order-lower-indicator::before {\n    position: relative;\n    top: .11rem;\n    width: 20px;\n    height: 20px\n  }\n\n  .postbox .handlediv .toggle-indicator::before {\n    width: 20px;\n    border-radius: 50%\n  }\n\n  .postbox .handlediv .toggle-indicator::before {\n    position: relative;\n    top: .05rem;\n    text-indent: -1px\n  }\n\n  .rtl .postbox .handlediv .toggle-indicator::before {\n    text-indent: 1px\n  }\n\n  .bulk-action-notice .toggle-indicator::before {\n    line-height: 16px;\n    vertical-align: top;\n    color: #787c82\n  }\n\n  .postbox .handle-order-higher:focus, .postbox .handle-order-lower:focus, .postbox .handlediv:focus {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8);\n    outline: 1px solid transparent\n  }\n\n  .postbox .handle-order-higher:focus .order-higher-indicator::before, .postbox .handle-order-lower:focus .order-lower-indicator::before, .postbox .handlediv:focus .toggle-indicator::before {\n    box-shadow: none;\n    outline: 1px solid transparent\n  }\n\n  #photo-add-url-div input[type=text] {\n    width: 300px\n  }\n\n  .alignleft h2 {\n    margin: 0\n  }\n\n  #template textarea {\n    font-family: Consolas, Monaco, monospace;\n    font-size: 13px;\n    background: #f6f7f7;\n    -moz-tab-size: 4;\n    -o-tab-size: 4;\n    tab-size: 4\n  }\n\n  #template .CodeMirror, #template textarea {\n    width: 100%;\n    min-height: 60vh;\n    height: calc(100vh - 295px);\n    border: 1px solid #dcdcde;\n    box-sizing: border-box\n  }\n\n  #templateside > h2 {\n    padding-top: 6px;\n    padding-bottom: 7px;\n    margin: 0\n  }\n\n  #templateside ol, #templateside ul {\n    margin: 0;\n    padding: 0\n  }\n\n  #templateside > ul {\n    box-sizing: border-box;\n    margin-top: 0;\n    overflow: auto;\n    padding: 0;\n    min-height: 60vh;\n    height: calc(100vh - 295px);\n    background-color: #f6f7f7;\n    border: 1px solid #dcdcde;\n    border-left: none\n  }\n\n  #templateside ul ul {\n    padding-left: 12px\n  }\n\n  #templateside > ul > li > ul[role=group] {\n    padding-left: 0\n  }\n\n  [role=treeitem][aria-expanded=false] > ul {\n    display: none\n  }\n\n  [role=treeitem] span[aria-hidden] {\n    display: inline;\n    font-family: dashicons;\n    font-size: 20px;\n    position: absolute;\n    pointer-events: none\n  }\n\n  [role=treeitem][aria-expanded=false] > .folder-label .icon:after {\n    content: \"\\f139\"\n  }\n\n  [role=treeitem][aria-expanded=true] > .folder-label .icon:after {\n    content: \"\\f140\"\n  }\n\n  [role=treeitem] .folder-label {\n    display: block;\n    padding: 3px 3px 3px 12px;\n    cursor: pointer\n  }\n\n  [role=treeitem] {\n    outline: 0\n  }\n\n  [role=treeitem] .folder-label.focus {\n    color: #043959;\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8)\n  }\n\n  [role=treeitem] .folder-label.hover, [role=treeitem].hover {\n    background-color: #f0f0f1\n  }\n\n  .tree-folder {\n    margin: 0;\n    position: relative\n  }\n\n  [role=treeitem] li {\n    position: relative\n  }\n\n  .tree-folder .tree-folder::after {\n    content: \"\";\n    display: block;\n    position: absolute;\n    left: 2px;\n    border-left: 1px solid #c3c4c7;\n    top: -13px;\n    bottom: 10px\n  }\n\n  .tree-folder > li::before {\n    content: \"\";\n    position: absolute;\n    display: block;\n    border-left: 1px solid #c3c4c7;\n    left: 2px;\n    top: -5px;\n    height: 18px;\n    width: 7px;\n    border-bottom: 1px solid #c3c4c7\n  }\n\n  .tree-folder > li::after {\n    content: \"\";\n    position: absolute;\n    display: block;\n    border-left: 1px solid #c3c4c7;\n    left: 2px;\n    bottom: -7px;\n    top: 0\n  }\n\n  #templateside .current-file {\n    margin: -4px 0 -2px\n  }\n\n  .tree-folder > .current-file::before {\n    left: 4px;\n    height: 15px;\n    width: 0;\n    border-left: none;\n    top: 3px\n  }\n\n  .tree-folder > .current-file::after {\n    bottom: -4px;\n    height: 7px;\n    left: 2px;\n    top: auto\n  }\n\n  .tree-folder li:last-child > .tree-folder::after, .tree-folder > li:last-child::after {\n    display: none\n  }\n\n  #documentation label, #theme-plugin-editor-label, #theme-plugin-editor-selector {\n    font-weight: 600\n  }\n\n  #theme-plugin-editor-label {\n    display: inline-block;\n    margin-bottom: 1em\n  }\n\n  #docs-list, #template textarea {\n    direction: ltr\n  }\n\n  .fileedit-sub #plugin, .fileedit-sub #theme {\n    max-width: 40%\n  }\n\n  .fileedit-sub .alignright {\n    text-align: right\n  }\n\n  #template p {\n    width: 97%\n  }\n\n  #file-editor-linting-error {\n    margin-top: 1em;\n    margin-bottom: 1em\n  }\n\n  #file-editor-linting-error > .notice {\n    margin: 0;\n    display: inline-block\n  }\n\n  #file-editor-linting-error > .notice > p {\n    width: auto\n  }\n\n  #template .submit {\n    margin-top: 1em;\n    padding: 0\n  }\n\n  #template .submit input[type=submit][disabled] {\n    cursor: not-allowed\n  }\n\n  #templateside {\n    float: right;\n    width: 16em;\n    word-wrap: break-word\n  }\n\n  #postcustomstuff p.submit {\n    margin: 0\n  }\n\n  #templateside h4 {\n    margin: 1em 0 0\n  }\n\n  #templateside li {\n    margin: 4px 0\n  }\n\n  #templateside li:not(.howto) a, .theme-editor-php .highlight {\n    display: block;\n    padding: 3px 0 3px 12px;\n    text-decoration: none\n  }\n\n  #templateside li:not(.howto) > a:first-of-type {\n    padding-top: 0\n  }\n\n  #templateside li.howto {\n    padding: 6px 12px 12px\n  }\n\n  .theme-editor-php .highlight {\n    margin: -3px 3px -3px -12px\n  }\n\n  #templateside .highlight {\n    border: none;\n    font-weight: 600\n  }\n\n  .nonessential {\n    color: #646970;\n    font-size: 11px;\n    font-style: italic;\n    padding-left: 12px\n  }\n\n  #documentation {\n    margin-top: 10px\n  }\n\n  #documentation label {\n    line-height: 1.8;\n    vertical-align: baseline\n  }\n\n  .fileedit-sub {\n    padding: 10px 0 8px;\n    line-height: 180%\n  }\n\n  #file-editor-warning .file-editor-warning-content {\n    margin: 25px\n  }\n\n  .accordion-section-title:after, .control-section .accordion-section-title:after, .nav-menus-php .item-edit:before, .widget-top .widget-action .toggle-indicator:before {\n    content: \"\\f140\";\n    font: normal 20px/1 dashicons;\n    speak: never;\n    display: block;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    text-decoration: none\n  }\n\n  .widget-top .widget-action .toggle-indicator:before {\n    padding: 1px 2px 1px 0;\n    border-radius: 50%\n  }\n\n  .accordion-section-title:after, .handlediv, .item-edit, .postbox .handlediv.button-link, .toggle-indicator {\n    color: #787c82\n  }\n\n  .widget-action {\n    color: #50575e\n  }\n\n  .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 {\n    color: #1d2327;\n    outline: 1px solid transparent\n  }\n\n  .widget-top .widget-action:focus .toggle-indicator:before {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8)\n  }\n\n  .accordion-section-title:after, .control-section .accordion-section-title:after {\n    float: right;\n    right: 20px;\n    top: -2px\n  }\n\n  #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 {\n    content: \"\\f142\"\n  }\n\n  button, input, select, textarea {\n    box-sizing: border-box;\n    font-family: inherit;\n    font-size: inherit;\n    font-weight: inherit\n  }\n\n  input, textarea {\n    font-size: 14px\n  }\n\n  textarea {\n    overflow: auto;\n    padding: 2px 6px;\n    line-height: 1.42857143;\n    resize: vertical\n  }\n\n  label {\n    cursor: pointer\n  }\n\n  input, select {\n    margin: 0 1px\n  }\n\n  textarea.code {\n    padding: 4px 6px 1px\n  }\n\n  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 {\n    box-shadow: 0 0 0 transparent;\n    border-radius: 4px;\n    border: 1px solid #8c8f94;\n    background-color: #fff;\n    color: #2c3338\n  }\n\n  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] {\n    padding: 0 8px;\n    line-height: 2;\n    min-height: 30px\n  }\n\n  ::-webkit-datetime-edit {\n    line-height: 1.85714286\n  }\n\n  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 {\n    border-color: #2271b1;\n    box-shadow: 0 0 0 1px #2271b1;\n    outline: 2px solid transparent\n  }\n\n  input[type=email], input[type=url] {\n    direction: ltr\n  }\n\n  input[type=checkbox], input[type=radio] {\n    border: 1px solid #8c8f94;\n    border-radius: 4px;\n    background: #fff;\n    color: #50575e;\n    clear: none;\n    cursor: pointer;\n    display: inline-block;\n    line-height: 0;\n    height: 1rem;\n    margin: -.25rem .25rem 0 0;\n    outline: 0;\n    padding: 0 !important;\n    text-align: center;\n    vertical-align: middle;\n    width: 1rem;\n    min-width: 1rem;\n    -webkit-appearance: none;\n    box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n    transition: .05s border-color ease-in-out\n  }\n\n  input[type=radio]:checked + label:before {\n    color: #8c8f94\n  }\n\n  .wp-core-ui input[type=reset]:active, .wp-core-ui input[type=reset]:hover {\n    color: #135e96\n  }\n\n  .wp-admin p input[type=checkbox], .wp-admin p input[type=radio], td > input[type=checkbox] {\n    margin-top: 0\n  }\n\n  .wp-admin p label input[type=checkbox] {\n    margin-top: -4px\n  }\n\n  .wp-admin p label input[type=radio] {\n    margin-top: -2px\n  }\n\n  input[type=radio] {\n    border-radius: 50%;\n    margin-right: .25rem;\n    line-height: .71428571\n  }\n\n  input[type=checkbox]:checked::before, input[type=radio]:checked::before {\n    float: left;\n    display: inline-block;\n    vertical-align: middle;\n    width: 1rem;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  input[type=checkbox]:checked::before {\n    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\");\n    margin: -.1875rem 0 0 -.25rem;\n    height: 1.3125rem;\n    width: 1.3125rem\n  }\n\n  input[type=radio]:checked::before {\n    content: \"\";\n    border-radius: 50%;\n    width: .5rem;\n    height: .5rem;\n    margin: .1875rem;\n    background-color: #3582c4;\n    line-height: 1.14285714\n  }\n\n  @-moz-document url-prefix() {\n    .form-table input.tog, input[type=checkbox], input[type=radio] {\n      margin-bottom: -1px\n    }\n  }\n\n  input[type=search] {\n    -webkit-appearance: textfield\n  }\n\n  input[type=search]::-webkit-search-decoration {\n    display: none\n  }\n\n  .wp-admin input[type=file] {\n    padding: 3px 0;\n    cursor: pointer\n  }\n\n  input.readonly, input[readonly], textarea.readonly, textarea[readonly] {\n    background-color: #f0f0f1\n  }\n\n  ::-webkit-input-placeholder {\n    color: #646970\n  }\n\n  ::-moz-placeholder {\n    color: #646970;\n    opacity: 1\n  }\n\n  :-ms-input-placeholder {\n    color: #646970\n  }\n\n  .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 {\n    border-color: #d63638 !important;\n    box-shadow: 0 0 2px rgba(214, 54, 56, .8)\n  }\n\n  .form-table .form-required.form-invalid td:after {\n    content: \"\\f534\";\n    font: normal 20px/1 dashicons;\n    color: #d63638;\n    margin-left: -25px;\n    vertical-align: middle\n  }\n\n  .form-table .form-required.user-pass1-wrap.form-invalid td:after {\n    content: \"\"\n  }\n\n  .form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after {\n    content: \"\\f534\";\n    font: normal 20px/1 dashicons;\n    color: #d63638;\n    margin: 0 6px 0 -29px;\n    vertical-align: middle\n  }\n\n  .form-input-tip {\n    color: #646970\n  }\n\n  input.disabled, input:disabled, select.disabled, select:disabled, textarea.disabled, textarea:disabled {\n    background: rgba(255, 255, 255, .5);\n    border-color: rgba(220, 220, 222, .75);\n    box-shadow: inset 0 1px 2px rgba(0, 0, 0, .04);\n    color: rgba(44, 51, 56, .5)\n  }\n\n  input[type=file].disabled, input[type=file]:disabled, input[type=range].disabled, input[type=range]:disabled {\n    background: 0 0;\n    box-shadow: none;\n    cursor: default\n  }\n\n  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 {\n    opacity: .7\n  }\n\n  .wp-core-ui select {\n    font-size: 14px;\n    line-height: 2;\n    color: #2c3338;\n    border-color: #8c8f94;\n    box-shadow: none;\n    border-radius: 3px;\n    padding: 0 24px 0 8px;\n    min-height: 30px;\n    max-width: 25rem;\n    -webkit-appearance: none;\n    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%;\n    background-size: 16px 16px;\n    cursor: pointer;\n    vertical-align: middle\n  }\n\n  .wp-core-ui select:hover {\n    color: #2271b1\n  }\n\n  .wp-core-ui select:focus {\n    border-color: #2271b1;\n    color: #0a4b78;\n    box-shadow: 0 0 0 1px #2271b1\n  }\n\n  .wp-core-ui select:active {\n    border-color: #8c8f94;\n    box-shadow: none\n  }\n\n  .wp-core-ui select.disabled, .wp-core-ui select:disabled {\n    color: #a7aaad;\n    border-color: #dcdcde;\n    background-color: #f6f7f7;\n    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');\n    box-shadow: none;\n    text-shadow: 0 1px 0 #fff;\n    cursor: default;\n    transform: none\n  }\n\n  .wp-core-ui select:-moz-focusring {\n    color: transparent;\n    text-shadow: 0 0 0 #0a4b78\n  }\n\n  .wp-core-ui select::-ms-value {\n    background: 0 0;\n    color: #50575e\n  }\n\n  .wp-core-ui select:hover::-ms-value {\n    color: #2271b1\n  }\n\n  .wp-core-ui select:focus::-ms-value {\n    color: #0a4b78\n  }\n\n  .wp-core-ui select.disabled::-ms-value, .wp-core-ui select:disabled::-ms-value {\n    color: #a7aaad\n  }\n\n  .wp-core-ui select::-ms-expand {\n    display: none\n  }\n\n  .wp-admin .button-cancel {\n    display: inline-block;\n    min-height: 28px;\n    padding: 0 5px;\n    line-height: 2\n  }\n\n  .meta-box-sortables select {\n    max-width: 100%\n  }\n\n  .meta-box-sortables input {\n    vertical-align: middle\n  }\n\n  .misc-pub-post-status select {\n    margin-top: 0\n  }\n\n  .wp-core-ui select[multiple] {\n    height: auto;\n    padding-right: 8px;\n    background: #fff\n  }\n\n  .submit {\n    padding: 1.5em 0;\n    margin: 5px 0;\n    border-bottom-left-radius: 3px;\n    border-bottom-right-radius: 3px;\n    border: none\n  }\n\n  form p.submit a.cancel:hover {\n    text-decoration: none\n  }\n\n  p.submit {\n    text-align: left;\n    max-width: 100%;\n    margin-top: 20px;\n    padding-top: 10px\n  }\n\n  .textright p.submit {\n    border: none;\n    text-align: right\n  }\n\n  table.form-table + input + input + p.submit, table.form-table + input + p.submit, table.form-table + p.submit {\n    border-top: none;\n    padding-top: 0\n  }\n\n  #major-publishing-actions input, #minor-publishing-actions .preview, #minor-publishing-actions input {\n    text-align: center\n  }\n\n  input.all-options, textarea.all-options {\n    width: 250px\n  }\n\n  input.large-text, textarea.large-text {\n    width: 99%\n  }\n\n  .regular-text {\n    width: 25em\n  }\n\n  input.small-text {\n    width: 50px;\n    padding: 0 6px\n  }\n\n  label input.small-text {\n    margin-top: -4px\n  }\n\n  input[type=number].small-text {\n    width: 65px;\n    padding-right: 0\n  }\n\n  input.tiny-text {\n    width: 35px\n  }\n\n  input[type=number].tiny-text {\n    width: 45px;\n    padding-right: 0\n  }\n\n  #doaction, #doaction2, #post-query-submit {\n    margin: 0 8px 0 0\n  }\n\n  .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 {\n    display: none\n  }\n\n  .tablenav .actions select {\n    float: left;\n    margin-right: 6px;\n    max-width: 12.5rem\n  }\n\n  #timezone_string option {\n    margin-left: 1em\n  }\n\n  .wp-cancel-pw > .dashicons, .wp-hide-pw > .dashicons {\n    position: relative;\n    top: 3px;\n    width: 1.25rem;\n    height: 1.25rem;\n    top: .25rem;\n    font-size: 20px\n  }\n\n  .wp-cancel-pw .dashicons-no {\n    display: none\n  }\n\n  #your-profile label + a, label {\n    vertical-align: middle\n  }\n\n  #your-profile label + a, fieldset label {\n    vertical-align: middle\n  }\n\n  .options-media-php [for*=\"_size_\"] {\n    min-width: 10em;\n    vertical-align: baseline\n  }\n\n  .options-media-php .small-text[name*=\"_size_\"] {\n    margin: 0 0 1em\n  }\n\n  .wp-generate-pw {\n    margin-top: 1em\n  }\n\n  .wp-pwd {\n    margin-top: 1em\n  }\n\n  #misc-publishing-actions label {\n    vertical-align: baseline\n  }\n\n  #pass-strength-result {\n    background-color: #f0f0f1;\n    border: 1px solid #dcdcde;\n    color: #1d2327;\n    margin: -1px 1px 5px;\n    padding: 3px 5px;\n    text-align: center;\n    width: 25em;\n    box-sizing: border-box;\n    opacity: 0\n  }\n\n  #pass-strength-result.short {\n    background-color: #ffabaf;\n    border-color: #e65054;\n    opacity: 1\n  }\n\n  #pass-strength-result.bad {\n    background-color: #facfd2;\n    border-color: #f86368;\n    opacity: 1\n  }\n\n  #pass-strength-result.good {\n    background-color: #f5e6ab;\n    border-color: #f0c33c;\n    opacity: 1\n  }\n\n  #pass-strength-result.strong {\n    background-color: #b8e6bf;\n    border-color: #68de7c;\n    opacity: 1\n  }\n\n  .password-input-wrapper input {\n    font-family: Consolas, Monaco, monospace\n  }\n\n  #pass1-text.short, #pass1.short {\n    border-color: #e65054\n  }\n\n  #pass1-text.bad, #pass1.bad {\n    border-color: #f86368\n  }\n\n  #pass1-text.good, #pass1.good {\n    border-color: #f0c33c\n  }\n\n  #pass1-text.strong, #pass1.strong {\n    border-color: #68de7c\n  }\n\n  .pw-weak {\n    display: none\n  }\n\n  .indicator-hint {\n    padding-top: 8px\n  }\n\n  .wp-pwd [type=password], .wp-pwd [type=text] {\n    margin-bottom: 0;\n    min-height: 30px\n  }\n\n  .wp-pwd input::-ms-reveal {\n    display: none\n  }\n\n  #pass1-text, .show-password #pass1 {\n    display: none\n  }\n\n  #pass1-text::-ms-clear {\n    display: none\n  }\n\n  .show-password #pass1-text {\n    display: inline-block\n  }\n\n  p.search-box {\n    float: right;\n    margin: 0\n  }\n\n  .network-admin.themes-php p.search-box {\n    clear: left\n  }\n\n  .search-box input[name=\"s\"], .tablenav .search-plugins input[name=\"s\"], .tagsdiv .newtag {\n    float: left;\n    margin: 0 4px 0 0\n  }\n\n  .js.plugins-php .search-box .wp-filter-search {\n    margin: 0;\n    width: 280px\n  }\n\n  input[type=email].ui-autocomplete-loading, input[type=text].ui-autocomplete-loading {\n    background-image: url(images/loading.gif);\n    background-repeat: no-repeat;\n    background-position: right center;\n    visibility: visible\n  }\n\n  input.ui-autocomplete-input.open {\n    border-bottom-color: transparent\n  }\n\n  ul#add-to-blog-users {\n    margin: 0 0 0 14px\n  }\n\n  .ui-autocomplete {\n    padding: 0;\n    margin: 0;\n    list-style: none;\n    position: absolute;\n    z-index: 10000;\n    border: 1px solid #4f94d4;\n    box-shadow: 0 1px 2px rgba(79, 148, 212, .8);\n    background-color: #fff\n  }\n\n  .ui-autocomplete li {\n    margin-bottom: 0;\n    padding: 4px 10px;\n    white-space: nowrap;\n    text-align: left;\n    cursor: pointer\n  }\n\n  .ui-autocomplete .ui-state-focus {\n    background-color: #dcdcde\n  }\n\n  .wp-tags-autocomplete .ui-state-focus, .wp-tags-autocomplete [aria-selected=true] {\n    background-color: #2271b1;\n    color: #fff;\n    outline: 2px solid transparent\n  }\n\n  .form-table {\n    border-collapse: collapse;\n    margin-top: .5em;\n    width: 100%;\n    clear: both\n  }\n\n  .form-table, .form-table td, .form-table td p, .form-table th {\n    font-size: 14px\n  }\n\n  .form-table td {\n    margin-bottom: 9px;\n    padding: 15px 10px;\n    line-height: 1.3;\n    vertical-align: middle\n  }\n\n  .form-table th, .form-wrap label {\n    color: #1d2327;\n    font-weight: 400;\n    text-shadow: none;\n    vertical-align: baseline\n  }\n\n  .form-table th {\n    vertical-align: top;\n    text-align: left;\n    padding: 20px 10px 20px 0;\n    width: 200px;\n    line-height: 1.3;\n    font-weight: 600\n  }\n\n  .form-table .td-full, .form-table th.th-full {\n    width: auto;\n    padding: 20px 10px 20px 0;\n    font-weight: 400\n  }\n\n  .form-table td p {\n    margin-top: 4px;\n    margin-bottom: 0\n  }\n\n  .form-table .date-time-doc {\n    margin-top: 1em\n  }\n\n  .form-table p.timezone-info {\n    margin: 1em 0\n  }\n\n  .form-table td fieldset label {\n    margin: .35em 0 .5em !important;\n    display: inline-block\n  }\n\n  .form-table td fieldset p label {\n    margin-top: 0 !important\n  }\n\n  .form-table td fieldset label, .form-table td fieldset li, .form-table td fieldset p {\n    line-height: 1.4\n  }\n\n  .form-table input.tog, .form-table input[type=radio] {\n    margin-top: -4px;\n    margin-right: 4px;\n    float: none\n  }\n\n  .form-table .pre {\n    padding: 8px;\n    margin: 0\n  }\n\n  table.form-table td .updated {\n    font-size: 13px\n  }\n\n  table.form-table td .updated p {\n    font-size: 13px;\n    margin: .3em 0\n  }\n\n  #profile-page .form-table textarea {\n    width: 500px;\n    margin-bottom: 6px\n  }\n\n  #profile-page .form-table #rich_editing {\n    margin-right: 5px\n  }\n\n  #your-profile legend {\n    font-size: 22px\n  }\n\n  #display_name {\n    width: 15em\n  }\n\n  #adduser .form-field input, #createuser .form-field input {\n    width: 25em\n  }\n\n  .color-option {\n    display: inline-block;\n    width: 24%;\n    padding: 5px 15px 15px;\n    box-sizing: border-box;\n    margin-bottom: 3px\n  }\n\n  .color-option.selected, .color-option:hover {\n    background: #dcdcde\n  }\n\n  .color-palette {\n    width: 100%;\n    border-spacing: 0;\n    border-collapse: collapse\n  }\n\n  .color-palette td {\n    height: 20px;\n    padding: 0;\n    border: none\n  }\n\n  .color-option {\n    cursor: pointer\n  }\n\n  .create-application-password .form-field {\n    max-width: 25em\n  }\n\n  .create-application-password label {\n    font-weight: 600\n  }\n\n  .create-application-password p.submit {\n    margin-bottom: 0;\n    padding-bottom: 0;\n    display: block\n  }\n\n  #application-passwords-section .notice {\n    margin-top: 20px;\n    margin-bottom: 0\n  }\n\n  .application-password-display input.code {\n    width: 19em\n  }\n\n  .auth-app-card.card {\n    max-width: 768px\n  }\n\n  .authorize-application-php .form-wrap p {\n    display: block\n  }\n\n  .tool-box .title {\n    margin: 8px 0;\n    font-size: 18px;\n    font-weight: 400;\n    line-height: 24px\n  }\n\n  .label-responsive {\n    vertical-align: middle\n  }\n\n  #export-filters p {\n    margin: 0 0 1em\n  }\n\n  #export-filters p.submit {\n    margin: 7px 0 5px\n  }\n\n  .card {\n    position: relative;\n    margin-top: 20px;\n    padding: .7em 2em 1em;\n    min-width: 255px;\n    max-width: 520px;\n    border: 1px solid #c3c4c7;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04);\n    background: #fff;\n    box-sizing: border-box\n  }\n\n  .pressthis h4 {\n    margin: 2em 0 1em\n  }\n\n  .pressthis textarea {\n    width: 100%;\n    font-size: 1em\n  }\n\n  #pressthis-code-wrap {\n    overflow: auto\n  }\n\n  .pressthis-bookmarklet-wrapper {\n    margin: 20px 0 8px;\n    vertical-align: top;\n    position: relative;\n    z-index: 1\n  }\n\n  .pressthis-bookmarklet, .pressthis-bookmarklet:active, .pressthis-bookmarklet:focus, .pressthis-bookmarklet:hover {\n    display: inline-block;\n    position: relative;\n    cursor: move;\n    color: #2c3338;\n    background: #dcdcde;\n    border-radius: 5px;\n    border: 1px solid #c3c4c7;\n    font-style: normal;\n    line-height: 16px;\n    font-size: 14px;\n    text-decoration: none\n  }\n\n  .pressthis-bookmarklet:active {\n    outline: 0\n  }\n\n  .pressthis-bookmarklet:after {\n    content: \"\";\n    width: 70%;\n    height: 55%;\n    z-index: -1;\n    position: absolute;\n    right: 10px;\n    bottom: 9px;\n    background: 0 0;\n    transform: skew(20deg) rotate(6deg);\n    box-shadow: 0 10px 8px rgba(0, 0, 0, .6)\n  }\n\n  .pressthis-bookmarklet:hover:after {\n    transform: skew(20deg) rotate(9deg);\n    box-shadow: 0 10px 8px rgba(0, 0, 0, .7)\n  }\n\n  .pressthis-bookmarklet span {\n    display: inline-block;\n    margin: 0;\n    padding: 0 12px 8px 9px\n  }\n\n  .pressthis-bookmarklet span:before {\n    color: #787c82;\n    font: normal 20px/1 dashicons;\n    content: \"\\f157\";\n    position: relative;\n    display: inline-block;\n    top: 4px;\n    margin-right: 4px\n  }\n\n  .pressthis-js-toggle {\n    margin-left: 10px;\n    padding: 0;\n    height: auto;\n    vertical-align: top\n  }\n\n  .pressthis-js-toggle.button.button {\n    margin-left: 10px;\n    padding: 0;\n    height: auto;\n    vertical-align: top\n  }\n\n  .pressthis-js-toggle .dashicons {\n    margin: 5px 8px 6px 7px;\n    color: #50575e\n  }\n\n  .timezone-info code {\n    white-space: nowrap\n  }\n\n  .defaultavatarpicker .avatar {\n    margin: 2px 0;\n    vertical-align: middle\n  }\n\n  .options-general-php .date-time-text {\n    display: inline-block;\n    min-width: 10em\n  }\n\n  .options-general-php input.small-text {\n    width: 56px;\n    margin: -2px 0\n  }\n\n  .options-general-php .spinner {\n    float: none;\n    margin: -3px 3px 0\n  }\n\n  .options-general-php .language-install-spinner, .settings-php .language-install-spinner {\n    display: inline-block;\n    float: none;\n    margin: -3px 5px 0;\n    vertical-align: middle\n  }\n\n  .form-table.permalink-structure .available-structure-tags li {\n    float: left;\n    margin-right: 5px\n  }\n\n  .setup-php textarea {\n    max-width: 100%\n  }\n\n  .form-field #site-address {\n    max-width: 25em\n  }\n\n  .form-field #domain {\n    max-width: 22em\n  }\n\n  .form-field #admin-email, .form-field #blog_last_updated, .form-field #blog_registered, .form-field #path, .form-field #site-title {\n    max-width: 25em\n  }\n\n  .form-field #path {\n    margin-bottom: 5px\n  }\n\n  #search-sites, #search-users {\n    max-width: 60%\n  }\n\n  .request-filesystem-credentials-dialog {\n    display: none;\n    visibility: visible\n  }\n\n  .request-filesystem-credentials-dialog .notification-dialog {\n    top: 10%;\n    max-height: 85%\n  }\n\n  .request-filesystem-credentials-dialog-content {\n    margin: 25px\n  }\n\n  #request-filesystem-credentials-title {\n    font-size: 1.3em;\n    margin: 1em 0\n  }\n\n  .request-filesystem-credentials-form legend {\n    font-size: 1em;\n    padding: 1.33em 0;\n    font-weight: 600\n  }\n\n  .request-filesystem-credentials-form input[type=password], .request-filesystem-credentials-form input[type=text] {\n    display: block\n  }\n\n  .request-filesystem-credentials-dialog input[type=password], .request-filesystem-credentials-dialog input[type=text] {\n    width: 100%\n  }\n\n  .request-filesystem-credentials-form .field-title {\n    font-weight: 600\n  }\n\n  .request-filesystem-credentials-dialog label[for=hostname], .request-filesystem-credentials-dialog label[for=private_key], .request-filesystem-credentials-dialog label[for=public_key] {\n    display: block;\n    margin-bottom: 1em\n  }\n\n  .request-filesystem-credentials-dialog .ftp-password, .request-filesystem-credentials-dialog .ftp-username {\n    float: left;\n    width: 48%\n  }\n\n  .request-filesystem-credentials-dialog .ftp-password {\n    margin-left: 4%\n  }\n\n  .request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons {\n    text-align: right\n  }\n\n  .request-filesystem-credentials-dialog label[for=ftp] {\n    margin-right: 10px\n  }\n\n  .request-filesystem-credentials-dialog #auth-keys-desc {\n    margin-bottom: 0\n  }\n\n  #request-filesystem-credentials-dialog .button:not(:last-child) {\n    margin-right: 10px\n  }\n\n  #request-filesystem-credentials-form .cancel-button {\n    display: none\n  }\n\n  #request-filesystem-credentials-dialog .cancel-button {\n    display: inline\n  }\n\n  .request-filesystem-credentials-dialog .ftp-password, .request-filesystem-credentials-dialog .ftp-username {\n    float: none;\n    width: auto\n  }\n\n  .request-filesystem-credentials-dialog .ftp-username {\n    margin-bottom: 1em\n  }\n\n  .request-filesystem-credentials-dialog .ftp-password {\n    margin: 0\n  }\n\n  .request-filesystem-credentials-dialog .ftp-password em {\n    color: #8c8f94\n  }\n\n  .request-filesystem-credentials-dialog label {\n    display: block;\n    line-height: 1.5;\n    margin-bottom: 1em\n  }\n\n  .request-filesystem-credentials-form legend {\n    padding-bottom: 0\n  }\n\n  .request-filesystem-credentials-form #ssh-keys legend {\n    font-size: 1.3em\n  }\n\n  .request-filesystem-credentials-form .notice {\n    margin: 0 0 20px;\n    clear: both\n  }\n\n  .tools-privacy-policy-page form {\n    margin-bottom: 1.3em\n  }\n\n  .tools-privacy-policy-page input.button {\n    margin: 0 1px 0 6px\n  }\n\n  .tools-privacy-policy-page select {\n    margin: 0 1px .5em 6px\n  }\n\n  .tools-privacy-edit {\n    margin: 1.5em 0\n  }\n\n  .tools-privacy-policy-page span {\n    line-height: 2\n  }\n\n  .privacy_requests .column-email {\n    width: 40%\n  }\n\n  .privacy_requests .column-type {\n    text-align: center\n  }\n\n  .privacy_requests tfoot td:first-child, .privacy_requests thead td:first-child {\n    border-left: 4px solid #fff\n  }\n\n  .privacy_requests tbody th {\n    border-left: 4px solid #fff;\n    background: #fff;\n    box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1)\n  }\n\n  .privacy_requests .row-actions {\n    color: #787c82\n  }\n\n  .privacy_requests .row-actions.processing {\n    position: static\n  }\n\n  .privacy_requests tbody .has-request-results th {\n    box-shadow: none\n  }\n\n  .privacy_requests tbody .request-results th .notice {\n    margin: 0 0 5px\n  }\n\n  .privacy_requests tbody td {\n    background: #fff;\n    box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1)\n  }\n\n  .privacy_requests tbody .has-request-results td {\n    box-shadow: none\n  }\n\n  .privacy_requests .next_steps .button {\n    word-wrap: break-word;\n    white-space: normal\n  }\n\n  .privacy_requests .status-request-confirmed td, .privacy_requests .status-request-confirmed th {\n    background-color: #fff;\n    border-left-color: #72aee6\n  }\n\n  .privacy_requests .status-request-failed td, .privacy_requests .status-request-failed th {\n    background-color: #f6f7f7;\n    border-left-color: #d63638\n  }\n\n  .privacy_requests .export_personal_data_failed a {\n    vertical-align: baseline\n  }\n\n  .status-label {\n    font-weight: 600\n  }\n\n  .status-label.status-request-pending {\n    font-weight: 400;\n    font-style: italic;\n    color: #646970\n  }\n\n  .status-label.status-request-failed {\n    color: #d63638;\n    font-weight: 600\n  }\n\n  .wp-privacy-request-form {\n    clear: both\n  }\n\n  .wp-privacy-request-form-field {\n    margin: 1.5em 0\n  }\n\n  .wp-privacy-request-form input {\n    margin: 0\n  }\n\n  .email-personal-data::before {\n    display: inline-block;\n    font: normal 20px/1 dashicons;\n    margin: 3px 5px 0 -2px;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    vertical-align: top\n  }\n\n  .email-personal-data--sending::before {\n    color: #d63638;\n    content: \"\\f463\";\n    animation: rotation 2s infinite linear\n  }\n\n  .email-personal-data--sent::before {\n    color: #68de7c;\n    content: \"\\f147\"\n  }\n\n  @media screen and (max-width: 782px) {\n    textarea {\n      -webkit-appearance: none\n    }\n    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] {\n      -webkit-appearance: none;\n      padding: 3px 10px;\n      min-height: 40px\n    }\n    ::-webkit-datetime-edit {\n      line-height: 1.875\n    }\n    .widefat tfoot td input[type=checkbox], .widefat th input[type=checkbox], .widefat thead td input[type=checkbox], input[type=checkbox] {\n      -webkit-appearance: none\n    }\n    .widefat tfoot td input[type=checkbox], .widefat th input[type=checkbox], .widefat thead td input[type=checkbox] {\n      margin-bottom: 8px\n    }\n    .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 {\n      width: 1.875rem;\n      height: 1.875rem;\n      margin: -.1875rem -.3125rem\n    }\n    input[type=checkbox], input[type=radio] {\n      height: 1.5625rem;\n      width: 1.5625rem\n    }\n    .wp-admin p input[type=checkbox], .wp-admin p input[type=radio] {\n      margin-top: -.1875rem\n    }\n    input[type=radio]:checked:before {\n      vertical-align: middle;\n      width: .5625rem;\n      height: .5625rem;\n      margin: .4375rem;\n      line-height: .76190476\n    }\n    .wp-upload-form input[type=submit] {\n      margin-top: 10px\n    }\n    .wp-admin .form-table select, .wp-core-ui select {\n      min-height: 40px;\n      font-size: 16px;\n      line-height: 1.625;\n      padding: 5px 24px 5px 8px\n    }\n    .wp-admin .button-cancel {\n      margin-bottom: 0;\n      padding: 2px 0;\n      font-size: 14px;\n      vertical-align: middle\n    }\n    #adduser .form-field input, #createuser .form-field input {\n      width: 100%\n    }\n    .form-table {\n      box-sizing: border-box\n    }\n    .form-table td, .form-table th, .label-responsive {\n      display: block;\n      width: auto;\n      vertical-align: middle\n    }\n    .label-responsive {\n      margin: .5em 0\n    }\n    .export-filters li {\n      margin-bottom: 0\n    }\n    .form-table .color-palette td {\n      display: table-cell;\n      width: 15px\n    }\n    .form-table table.color-palette {\n      margin-right: 10px\n    }\n    input, textarea {\n      font-size: 16px\n    }\n    #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 {\n      width: 100%;\n      display: block;\n      max-width: none;\n      box-sizing: border-box\n    }\n    .form-table .form-required.form-invalid td:after {\n      float: right;\n      margin: -30px 3px 0 0\n    }\n    .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 {\n      width: auto;\n      max-width: 4.375em;\n      display: inline;\n      padding: 3px 6px;\n      margin: 0 3px\n    }\n    #pass-strength-result {\n      width: 100%;\n      box-sizing: border-box;\n      padding: 8px\n    }\n    p.search-box {\n      float: none;\n      position: absolute;\n      bottom: 0;\n      width: 98%;\n      height: 90px;\n      margin-bottom: 20px\n    }\n    p.search-box input[name=\"s\"] {\n      float: none;\n      width: 100%;\n      margin-bottom: 10px;\n      vertical-align: middle\n    }\n    p.search-box input[type=submit] {\n      margin-bottom: 10px\n    }\n    .form-table span.description {\n      display: inline;\n      padding: 4px 0 0;\n      line-height: 1.4;\n      font-size: 14px\n    }\n    .form-table th {\n      padding: 10px 0 0;\n      border-bottom: 0\n    }\n    .form-table td {\n      margin-bottom: 0;\n      padding: 4px 0 6px\n    }\n    .form-table.permalink-structure td code {\n      margin-left: 32px;\n      display: inline-block\n    }\n    .form-table.permalink-structure td input[type=text] {\n      margin-left: 32px;\n      margin-top: 4px;\n      width: 96%\n    }\n    .form-table input.regular-text {\n      width: 100%\n    }\n    .form-table label {\n      font-size: 14px\n    }\n    .background-position-control .button-group > label {\n      font-size: 0\n    }\n    .form-table fieldset label {\n      display: block\n    }\n    #local-time, #utc-time {\n      display: block;\n      float: none;\n      margin-top: .5em\n    }\n    .form-field #domain {\n      max-width: none\n    }\n    .wp-pwd {\n      position: relative\n    }\n    #profile-page .form-table #pass1 {\n      padding-right: 90px\n    }\n    .wp-pwd button.button {\n      background: 0 0;\n      border: 1px solid transparent;\n      box-shadow: none;\n      line-height: 2;\n      margin: 0;\n      padding: 5px 9px;\n      position: absolute;\n      right: 0;\n      top: 0;\n      width: 2.375rem;\n      height: 2.375rem;\n      min-width: 40px;\n      min-height: 40px\n    }\n    .wp-pwd button.wp-hide-pw {\n      right: 2.5rem\n    }\n    .wp-pwd button.button:focus, .wp-pwd button.button:hover {\n      background: 0 0\n    }\n    .wp-pwd button.button:active {\n      background: 0 0;\n      box-shadow: none;\n      transform: none\n    }\n    .wp-pwd .button .text {\n      display: none\n    }\n    .wp-pwd [type=password], .wp-pwd [type=text] {\n      line-height: 2;\n      padding-right: 5rem\n    }\n    .wp-cancel-pw .dashicons-no {\n      display: inline-block\n    }\n    .options-general-php input[type=text].small-text {\n      max-width: 6.25em;\n      margin: 0\n    }\n    .tools-privacy-policy-page form.wp-create-privacy-page {\n      margin-bottom: 1em\n    }\n    .tools-privacy-policy-page input#set-page, .tools-privacy-policy-page select {\n      margin: 10px 0 0\n    }\n    .tools-privacy-policy-page .wp-create-privacy-page span {\n      display: block;\n      margin-bottom: 1em\n    }\n    .tools-privacy-policy-page .wp-create-privacy-page .button {\n      margin-left: 0\n    }\n    .wp-list-table.privacy_requests tr:not(.inline-edit-row):not(.no-items) td.column-primary:not(.check-column) {\n      display: table-cell\n    }\n    .wp-list-table.privacy_requests.widefat th input, .wp-list-table.privacy_requests.widefat thead td input {\n      margin-left: 5px\n    }\n    .wp-privacy-request-form-field input[type=text] {\n      width: 100%;\n      margin-bottom: 10px;\n      vertical-align: middle\n    }\n    .regular-text {\n      max-width: 100%\n    }\n  }\n  @media only screen and (max-width: 768px) {\n    .form-field input[type=email], .form-field input[type=password], .form-field input[type=text], .form-field select, .form-field textarea {\n      width: 99%\n    }\n    .form-wrap .form-field {\n      padding: 0\n    }\n  }\n  @media only screen and (max-height: 480px), screen and (max-width: 450px) {\n    .file-editor-warning .notification-dialog, .request-filesystem-credentials-dialog .notification-dialog {\n      width: 100%;\n      height: 100%;\n      max-height: 100%;\n      position: fixed;\n      top: 0;\n      margin: 0;\n      left: 0\n    }\n  }\n  @media screen and (max-width: 600px) {\n    .color-option {\n      width: 49%\n    }\n  }\n  @media only screen and (max-width: 320px) {\n    .options-general-php .date-time-text.date-time-custom-text {\n      min-width: 0;\n      margin-right: .5em\n    }\n  }\n  @keyframes rotation {\n    0% {\n      transform: rotate(0)\n    }\n    100% {\n      transform: rotate(359deg)\n    }\n  }\n\n\n  .ui-draggable-handle, .ui-sortable-handle {\n    touch-action: none\n  }\n\n  .accordion-section {\n    border-bottom: 1px solid #dcdcde;\n    margin: 0\n  }\n\n  .accordion-section.open .accordion-section-content, .no-js .accordion-section .accordion-section-content {\n    display: block\n  }\n\n  .accordion-section.open:hover {\n    border-bottom-color: #dcdcde\n  }\n\n  .accordion-section-content {\n    display: none;\n    padding: 10px 20px 15px;\n    overflow: hidden;\n    background: #fff\n  }\n\n  .accordion-section-title {\n    margin: 0;\n    padding: 12px 15px 15px;\n    position: relative;\n    border-left: 1px solid #dcdcde;\n    border-right: 1px solid #dcdcde;\n    -webkit-user-select: none;\n    user-select: none\n  }\n\n  .js .accordion-section-title {\n    cursor: pointer\n  }\n\n  .js .accordion-section-title:after {\n    position: absolute;\n    top: 12px;\n    right: 10px;\n    z-index: 1\n  }\n\n  .accordion-section-title:focus {\n    outline: 1px solid transparent\n  }\n\n  .accordion-section-title:focus:after, .accordion-section-title:hover:after {\n    border-color: #a7aaad transparent;\n    outline: 1px solid transparent\n  }\n\n  .cannot-expand .accordion-section-title {\n    cursor: auto\n  }\n\n  .cannot-expand .accordion-section-title:after {\n    display: none\n  }\n\n  .control-section .accordion-section-title, .customize-pane-child .accordion-section-title {\n    border-left: none;\n    border-right: none;\n    padding: 10px 10px 11px 14px;\n    line-height: 1.55;\n    background: #fff\n  }\n\n  .control-section .accordion-section-title:after, .customize-pane-child .accordion-section-title:after {\n    top: calc(50% - 10px)\n  }\n\n  .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 {\n    color: #1d2327;\n    background: #f6f7f7\n  }\n\n  .control-section.open .accordion-section-title {\n    border-bottom: 1px solid #dcdcde\n  }\n\n  .network-admin .edit-site-actions {\n    margin-top: 0\n  }\n\n  .my-sites {\n    display: block;\n    overflow: auto;\n    zoom: 1\n  }\n\n  .my-sites li {\n    display: block;\n    padding: 8px 3%;\n    min-height: 130px;\n    margin: 0\n  }\n\n  @media only screen and (max-width: 599px) {\n    .my-sites li {\n      min-height: 0\n    }\n  }\n  @media only screen and (min-width: 600px) {\n    .my-sites.striped li {\n      background-color: #fff;\n      position: relative\n    }\n    .my-sites.striped li:after {\n      content: \"\";\n      width: 1px;\n      height: 100%;\n      position: absolute;\n      top: 0;\n      right: 0;\n      background: #c3c4c7\n    }\n  }\n  @media only screen and (min-width: 600px) and (max-width: 699px) {\n    .my-sites li {\n      float: left;\n      width: 44%\n    }\n    .my-sites.striped li {\n      background-color: #fff\n    }\n    .my-sites.striped li:nth-of-type(2n+1) {\n      clear: left\n    }\n    .my-sites.striped li:nth-of-type(2n+2):after {\n      content: none\n    }\n    .my-sites li:nth-of-type(4n+1), .my-sites li:nth-of-type(4n+2) {\n      background-color: #f6f7f7\n    }\n  }\n  @media only screen and (min-width: 700px) and (max-width: 1199px) {\n    .my-sites li {\n      float: left;\n      width: 27.333333%;\n      background-color: #fff\n    }\n    .my-sites.striped li:nth-of-type(3n+3):after {\n      content: none\n    }\n    .my-sites li:nth-of-type(6n+1), .my-sites li:nth-of-type(6n+2), .my-sites li:nth-of-type(6n+3) {\n      background-color: #f6f7f7\n    }\n  }\n  @media only screen and (min-width: 1200px) and (max-width: 1399px) {\n    .my-sites li {\n      float: left;\n      width: 21%;\n      padding: 8px 2%;\n      background-color: #fff\n    }\n    .my-sites.striped li:nth-of-type(4n+1) {\n      clear: left\n    }\n    .my-sites.striped li:nth-of-type(4n+4):after {\n      content: none\n    }\n    .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) {\n      background-color: #f6f7f7\n    }\n  }\n  @media only screen and (min-width: 1400px) and (max-width: 1599px) {\n    .my-sites li {\n      float: left;\n      width: 16%;\n      padding: 8px 2%;\n      background-color: #fff\n    }\n    .my-sites.striped li:nth-of-type(5n+1) {\n      clear: left\n    }\n    .my-sites.striped li:nth-of-type(5n+5):after {\n      content: none\n    }\n    .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) {\n      background-color: #f6f7f7\n    }\n  }\n  @media only screen and (min-width: 1600px) {\n    .my-sites li {\n      float: left;\n      width: 12.666666%;\n      padding: 8px 2%;\n      background-color: #fff\n    }\n    .my-sites.striped li:nth-of-type(6n+1) {\n      clear: left\n    }\n    .my-sites.striped li:nth-of-type(6n+6):after {\n      content: none\n    }\n    .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) {\n      background-color: #f6f7f7\n    }\n  }\n\n  .my-sites li a {\n    text-decoration: none\n  }\n\n  @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {\n    div.star-holder, div.star-holder .star-rating {\n      background: url(images/stars-2x.png?ver=20121108) repeat-x bottom left;\n      background-size: 21px 37px\n    }\n    .spinner {\n      background-image: url(images/spinner-2x.gif)\n    }\n  }\n  @media screen and (max-width: 782px) {\n    html.wp-toolbar {\n      padding-top: 46px\n    }\n    .screen-reader-shortcut:focus {\n      top: -39px\n    }\n    body {\n      min-width: 240px;\n      overflow-x: hidden\n    }\n    body * {\n      -webkit-tap-highlight-color: transparent !important\n    }\n    #wpcontent {\n      position: relative;\n      margin-left: 0;\n      padding-left: 10px\n    }\n    #wpbody-content {\n      padding-bottom: 100px\n    }\n    .wrap {\n      clear: both;\n      margin-right: 12px;\n      margin-left: 0\n    }\n    #col-left, #col-right {\n      float: none;\n      width: auto\n    }\n    #col-left .col-wrap, #col-right .col-wrap {\n      padding: 0\n    }\n    #collapse-menu, .post-format-select {\n      display: none !important\n    }\n    .wrap h1.wp-heading-inline {\n      margin-bottom: .5em\n    }\n    .wrap .add-new-h2, .wrap .add-new-h2:active, .wrap .page-title-action, .wrap .page-title-action:active {\n      padding: 10px 15px;\n      font-size: 14px;\n      white-space: nowrap\n    }\n    .media-upload-form div.error, .notice, .wrap div.error, .wrap div.updated {\n      margin: 20px 0 10px;\n      padding: 5px 10px;\n      font-size: 14px;\n      line-height: 175%\n    }\n    .wp-core-ui .notice.is-dismissible {\n      padding-right: 46px\n    }\n    .notice-dismiss {\n      padding: 13px\n    }\n    .wrap .icon32 + h2 {\n      margin-top: -2px\n    }\n    .wp-responsive-open #wpbody {\n      right: -16em\n    }\n    code {\n      word-wrap: break-word;\n      word-wrap: anywhere;\n      word-break: break-word\n    }\n    .postbox {\n      font-size: 14px\n    }\n    .metabox-holder .postbox > h3, .metabox-holder .stuffbox > h3, .metabox-holder h2, .metabox-holder h3.hndle {\n      padding: 12px\n    }\n    .postbox .handlediv {\n      margin-top: 3px\n    }\n    .subsubsub {\n      font-size: 16px;\n      text-align: center;\n      margin-bottom: 15px\n    }\n    #template .CodeMirror, #template textarea {\n      box-sizing: border-box\n    }\n    #templateside {\n      float: none;\n      width: auto\n    }\n    #templateside > ul {\n      border-left: 1px solid #dcdcde\n    }\n    #templateside li {\n      margin: 0\n    }\n    #templateside li:not(.howto) a {\n      display: block;\n      padding: 5px\n    }\n    #templateside li.howto {\n      padding: 12px\n    }\n    #templateside .highlight {\n      padding: 5px;\n      margin-left: -5px;\n      margin-top: -5px\n    }\n    #template .notice, #template > div {\n      float: none;\n      margin: 1em 0;\n      width: auto\n    }\n    #template .CodeMirror, #template textarea {\n      width: 100%\n    }\n    #templateside ul ul {\n      padding-left: 1.5em\n    }\n    [role=treeitem] .folder-label {\n      display: block;\n      padding: 5px\n    }\n    .tree-folder .tree-folder::after, .tree-folder > li::after, .tree-folder > li::before {\n      left: -8px\n    }\n    .tree-folder > li::before {\n      top: 0;\n      height: 13px\n    }\n    .tree-folder > .current-file::before {\n      left: -5px;\n      top: 7px;\n      width: 4px\n    }\n    .tree-folder > .current-file::after {\n      height: 9px;\n      left: -8px\n    }\n    .wrap #templateside span.notice {\n      margin-left: -5px;\n      width: 100%\n    }\n    .fileedit-sub .alignright {\n      float: left;\n      margin-top: 15px;\n      width: 100%;\n      text-align: left\n    }\n    .fileedit-sub .alignright label {\n      display: block\n    }\n    .fileedit-sub #plugin, .fileedit-sub #theme {\n      margin-left: 0;\n      max-width: 70%\n    }\n    .fileedit-sub input[type=submit] {\n      margin-bottom: 0\n    }\n    #documentation label[for=docs-list] {\n      display: block\n    }\n    #documentation select[name=docs-list] {\n      margin-left: 0;\n      max-width: 60%\n    }\n    #documentation input[type=button] {\n      margin-bottom: 0\n    }\n    #wpfooter {\n      display: none\n    }\n    #comments-form .checkforspam {\n      display: none\n    }\n    .edit-comment-author {\n      margin: 2px 0 0\n    }\n    .filter-drawer .filter-group-feature input, .filter-drawer .filter-group-feature label {\n      line-height: 2.1\n    }\n    .filter-drawer .filter-group-feature label {\n      margin-left: 32px\n    }\n    .wp-filter .button.drawer-toggle {\n      font-size: 13px;\n      line-height: 2;\n      height: 28px\n    }\n    #screen-meta #contextual-help-wrap {\n      overflow: visible\n    }\n    #screen-meta #contextual-help-back, #screen-meta .contextual-help-sidebar {\n      display: none\n    }\n    #screen-meta .contextual-help-tabs {\n      clear: both;\n      width: 100%;\n      float: none\n    }\n    #screen-meta .contextual-help-tabs ul {\n      margin: 0 0 1em;\n      padding: 1em 0 0\n    }\n    #screen-meta .contextual-help-tabs .active {\n      margin: 0\n    }\n    #screen-meta .contextual-help-tabs-wrap {\n      clear: both;\n      max-width: 100%;\n      float: none\n    }\n    #screen-meta, #screen-meta-links {\n      margin-right: 10px\n    }\n    #screen-meta-links {\n      margin-bottom: 20px\n    }\n    .wp-filter .search-form input[type=search] {\n      font-size: 1rem\n    }\n    .wp-filter .search-form.search-plugins {\n      min-width: 100%\n    }\n  }\n  @media screen and (max-width: 600px) {\n    #wpwrap.wp-responsive-open {\n      overflow-x: hidden\n    }\n    html.wp-toolbar {\n      padding-top: 0\n    }\n    .screen-reader-shortcut:focus {\n      top: 7px\n    }\n    #wpbody {\n      padding-top: 46px\n    }\n    div#post-body.metabox-holder.columns-1 {\n      overflow-x: hidden\n    }\n    .nav-tab-wrapper, .wrap h2.nav-tab-wrapper, h1.nav-tab-wrapper {\n      border-bottom: 0\n    }\n    h1 .nav-tab, h2 .nav-tab, h3 .nav-tab, nav .nav-tab {\n      margin: 10px 10px 0 0;\n      border-bottom: 1px solid #c3c4c7\n    }\n    .nav-tab-active:focus, .nav-tab-active:focus:active, .nav-tab-active:hover {\n      border-bottom: 1px solid #c3c4c7\n    }\n    .wp-filter .search-form input[type=search] {\n      width: 100%\n    }\n  }\n  @media screen and (max-width: 320px) {\n    #network_dashboard_right_now .subsubsub {\n      font-size: 14px;\n      text-align: left\n    }\n  }\n  /*! This file is auto-generated */\n\n  /*! This file is auto-generated */\n  #adminmenu, #adminmenu .wp-submenu, #adminmenuback, #adminmenuwrap {\n    width: 160px;\n    background-color: #1d2327\n  }\n\n  #adminmenuback {\n    position: fixed;\n    top: 0;\n    bottom: -120px;\n    z-index: 1\n  }\n\n  .php-error #adminmenuback {\n    position: absolute\n  }\n\n  .php-error #adminmenuback, .php-error #adminmenuwrap {\n    margin-top: 2em\n  }\n\n  #adminmenu {\n    clear: left;\n    margin: 12px 0;\n    padding: 0;\n    list-style: none\n  }\n\n  .folded #adminmenu, .folded #adminmenu li.menu-top, .folded #adminmenuback, .folded #adminmenuwrap {\n    width: 36px\n  }\n\n  .icon16 {\n    height: 18px;\n    width: 18px;\n    padding: 6px;\n    margin: -6px 0 0 -8px;\n    float: left\n  }\n\n  .icon16:before {\n    color: #8c8f94;\n    font: normal 20px/1 dashicons;\n    speak: never;\n    padding: 6px 0;\n    height: 34px;\n    width: 20px;\n    display: inline-block;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    transition: all .1s ease-in-out\n  }\n\n  .icon16.icon-dashboard:before {\n    content: \"\\f226\"\n  }\n\n  .icon16.icon-post:before {\n    content: \"\\f109\"\n  }\n\n  .icon16.icon-media:before {\n    content: \"\\f104\"\n  }\n\n  .icon16.icon-links:before {\n    content: \"\\f103\"\n  }\n\n  .icon16.icon-page:before {\n    content: \"\\f105\"\n  }\n\n  .icon16.icon-comments:before {\n    content: \"\\f101\";\n    margin-top: 1px\n  }\n\n  .icon16.icon-appearance:before {\n    content: \"\\f100\"\n  }\n\n  .icon16.icon-plugins:before {\n    content: \"\\f106\"\n  }\n\n  .icon16.icon-users:before {\n    content: \"\\f110\"\n  }\n\n  .icon16.icon-tools:before {\n    content: \"\\f107\"\n  }\n\n  .icon16.icon-settings:before {\n    content: \"\\f108\"\n  }\n\n  .icon16.icon-site:before {\n    content: \"\\f541\"\n  }\n\n  .icon16.icon-generic:before {\n    content: \"\\f111\"\n  }\n\n  .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 {\n    background-image: none !important\n  }\n\n  #adminmenuwrap {\n    position: relative;\n    float: left;\n    z-index: 9990\n  }\n\n  #adminmenu * {\n    -webkit-user-select: none;\n    user-select: none\n  }\n\n  #adminmenu li {\n    margin: 0;\n    padding: 0\n  }\n\n  #adminmenu a {\n    display: block;\n    line-height: 1.3;\n    padding: 2px 5px;\n    color: #f0f0f1\n  }\n\n  #adminmenu .wp-submenu a {\n    color: #c3c4c7;\n    color: rgba(240, 246, 252, .7);\n    font-size: 13px;\n    line-height: 1.4;\n    margin: 0;\n    padding: 5px 0\n  }\n\n  #adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover {\n    background: 0 0\n  }\n\n  #adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, #adminmenu a:hover, #adminmenu li.menu-top > a:focus {\n    color: #72aee6\n  }\n\n  #adminmenu a:focus, #adminmenu a:hover, .folded #adminmenu .wp-submenu-head:hover {\n    box-shadow: inset 4px 0 0 0 currentColor;\n    transition: box-shadow .1s linear\n  }\n\n  #adminmenu li.menu-top {\n    border: none;\n    min-height: 34px;\n    position: relative\n  }\n\n  #adminmenu .wp-submenu {\n    list-style: none;\n    position: absolute;\n    top: -1000em;\n    left: 160px;\n    overflow: visible;\n    word-wrap: break-word;\n    padding: 7px 0 8px;\n    z-index: 9999;\n    background-color: #2c3338;\n    box-shadow: 0 3px 5px rgba(0, 0, 0, .2)\n  }\n\n  #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 {\n    top: -1px\n  }\n\n  #adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n    top: 0\n  }\n\n  #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 {\n    position: relative;\n    z-index: 3;\n    top: auto;\n    left: auto;\n    right: auto;\n    bottom: auto;\n    border: 0 none;\n    margin-top: 0;\n    box-shadow: none\n  }\n\n  .folded #adminmenu .wp-has-current-submenu .wp-submenu {\n    box-shadow: 0 3px 5px rgba(0, 0, 0, .2)\n  }\n\n  #adminmenu li.menu-top:hover, #adminmenu li.opensub > a.menu-top, #adminmenu li > a.menu-top:focus {\n    position: relative;\n    background-color: #1d2327;\n    color: #72aee6\n  }\n\n  .folded #adminmenu li.menu-top:hover, .folded #adminmenu li.opensub > a.menu-top, .folded #adminmenu li > a.menu-top:focus {\n    z-index: 10000\n  }\n\n  #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 {\n    background: #2271b1;\n    color: #fff\n  }\n\n  .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 {\n    top: 0;\n    left: 36px\n  }\n\n  .folded #adminmenu .wp-has-current-submenu .wp-submenu, .folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n    position: absolute;\n    top: -1000em\n  }\n\n  #adminmenu .wp-not-current-submenu .wp-submenu, .folded #adminmenu .wp-has-current-submenu .wp-submenu {\n    min-width: 160px;\n    width: auto;\n    border-left: 5px solid transparent\n  }\n\n  #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 {\n    color: #fff\n  }\n\n  #adminmenu .wp-not-current-submenu li > a, .folded #adminmenu .wp-has-current-submenu li > a {\n    padding-right: 16px;\n    padding-left: 14px;\n    transition: all .1s ease-in-out, outline 0s\n  }\n\n  #adminmenu .wp-has-current-submenu ul > li > a, .folded #adminmenu li.menu-top .wp-submenu > li > a {\n    padding: 5px 12px\n  }\n\n  #adminmenu .wp-submenu-head, #adminmenu a.menu-top {\n    font-size: 14px;\n    font-weight: 400;\n    line-height: 1.3;\n    padding: 0\n  }\n\n  #adminmenu .wp-submenu-head {\n    display: none\n  }\n\n  .folded #adminmenu .wp-menu-name {\n    position: absolute;\n    left: -999px\n  }\n\n  .folded #adminmenu .wp-submenu-head {\n    display: block\n  }\n\n  #adminmenu .wp-submenu li {\n    padding: 0;\n    margin: 0\n  }\n\n  #adminmenu .wp-menu-image img {\n    padding: 9px 0 0;\n    opacity: .6\n  }\n\n  #adminmenu div.wp-menu-name {\n    padding: 8px 8px 8px 36px;\n    overflow-wrap: break-word;\n    word-wrap: break-word;\n    -ms-word-break: break-all;\n    word-break: break-word;\n    -webkit-hyphens: auto;\n    hyphens: auto\n  }\n\n  #adminmenu div.wp-menu-image {\n    float: left;\n    width: 36px;\n    height: 34px;\n    margin: 0;\n    text-align: center\n  }\n\n  #adminmenu div.wp-menu-image.svg {\n    background-repeat: no-repeat;\n    background-position: center;\n    background-size: 20px auto\n  }\n\n  div.wp-menu-image:before {\n    color: #a7aaad;\n    color: rgba(240, 246, 252, .6);\n    padding: 7px 0;\n    transition: all .1s ease-in-out\n  }\n\n  #adminmenu div.wp-menu-image:before {\n    color: #a7aaad;\n    color: rgba(240, 246, 252, .6)\n  }\n\n  #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 {\n    color: #fff\n  }\n\n  #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 {\n    color: #72aee6\n  }\n\n  .folded #adminmenu div.wp-menu-image {\n    width: 35px;\n    height: 30px;\n    position: absolute;\n    z-index: 25\n  }\n\n  .folded #adminmenu a.menu-top {\n    height: 34px\n  }\n\n  .sticky-menu #adminmenuwrap {\n    position: fixed\n  }\n\n  .wp-menu-arrow {\n    display: none !important\n  }\n\n  ul#adminmenu a.wp-has-current-submenu {\n    position: relative\n  }\n\n  ul#adminmenu a.wp-has-current-submenu:after, ul#adminmenu > li.current > a.current:after {\n    right: 0;\n    border: solid 8px transparent;\n    content: \" \";\n    height: 0;\n    width: 0;\n    position: absolute;\n    pointer-events: none;\n    border-right-color: #f0f0f1;\n    top: 50%;\n    margin-top: -8px\n  }\n\n  .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 {\n    display: none\n  }\n\n  .folded ul#adminmenu a.wp-has-current-submenu:after, .folded ul#adminmenu > li a.current:after {\n    border-width: 4px;\n    margin-top: -4px\n  }\n\n  #adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after, #adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after {\n    right: 0;\n    border: 8px solid transparent;\n    content: \" \";\n    height: 0;\n    width: 0;\n    position: absolute;\n    pointer-events: none;\n    top: 10px;\n    z-index: 10000\n  }\n\n  .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 {\n    border-width: 4px;\n    margin-top: -4px;\n    top: 18px\n  }\n\n  #adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after, #adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {\n    border-right-color: #2c3338\n  }\n\n  #adminmenu li.menu-top:hover .wp-menu-image img, #adminmenu li.wp-has-current-submenu .wp-menu-image img {\n    opacity: 1\n  }\n\n  #adminmenu li.wp-menu-separator {\n    height: 5px;\n    padding: 0;\n    margin: 0 0 6px;\n    cursor: inherit\n  }\n\n  #adminmenu div.separator {\n    height: 2px;\n    padding: 0\n  }\n\n  #adminmenu .wp-submenu .wp-submenu-head {\n    color: #fff;\n    font-weight: 400;\n    font-size: 14px;\n    padding: 5px 4px 5px 11px;\n    margin: -7px 0 4px -5px;\n    border-width: 3px 0 3px 5px;\n    border-style: solid;\n    border-color: transparent\n  }\n\n  #adminmenu li.current, .folded #adminmenu li.wp-menu-open {\n    border: 0 none\n  }\n\n  #adminmenu .awaiting-mod, #adminmenu .update-plugins {\n    display: inline-block;\n    vertical-align: top;\n    box-sizing: border-box;\n    margin: 1px 0 -1px 2px;\n    padding: 0 5px;\n    min-width: 18px;\n    height: 18px;\n    border-radius: 9px;\n    background-color: #d63638;\n    color: #fff;\n    font-size: 11px;\n    line-height: 1.6;\n    text-align: center;\n    z-index: 26\n  }\n\n  #adminmenu li a.wp-has-current-submenu .update-plugins, #adminmenu li.current a .awaiting-mod {\n    background-color: #d63638;\n    color: #fff\n  }\n\n  #adminmenu li span.count-0 {\n    display: none\n  }\n\n  #collapse-button {\n    display: block;\n    width: 100%;\n    height: 34px;\n    margin: 0;\n    border: none;\n    padding: 0;\n    position: relative;\n    overflow: visible;\n    background: 0 0;\n    color: #a7aaad;\n    cursor: pointer\n  }\n\n  #collapse-button:hover {\n    color: #72aee6\n  }\n\n  #collapse-button:focus {\n    color: #72aee6;\n    outline: 1px solid transparent;\n    outline-offset: -1px\n  }\n\n  #collapse-button .collapse-button-icon, #collapse-button .collapse-button-label {\n    display: block;\n    position: absolute;\n    top: 0;\n    left: 0\n  }\n\n  #collapse-button .collapse-button-label {\n    top: 8px\n  }\n\n  #collapse-button .collapse-button-icon {\n    width: 36px;\n    height: 34px\n  }\n\n  #collapse-button .collapse-button-label {\n    padding: 0 0 0 36px\n  }\n\n  .folded #collapse-button .collapse-button-label {\n    display: none\n  }\n\n  #collapse-button .collapse-button-icon:after {\n    content: \"\\f148\";\n    display: block;\n    position: relative;\n    top: 7px;\n    text-align: center;\n    font: normal 20px/1 dashicons !important;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .folded #collapse-button .collapse-button-icon:after, .rtl #collapse-button .collapse-button-icon:after {\n    transform: rotate(180deg)\n  }\n\n  .rtl.folded #collapse-button .collapse-button-icon:after {\n    transform: none\n  }\n\n  #collapse-button .collapse-button-icon:after, #collapse-button .collapse-button-label {\n    transition: all .1s ease-in-out\n  }\n\n  li#wp-admin-bar-menu-toggle {\n    display: none\n  }\n\n  .customize-support #menu-appearance a[href=\"themes.php?page=custom-background\"], .customize-support #menu-appearance a[href=\"themes.php?page=custom-header\"] {\n    display: none\n  }\n\n  @media only screen and (max-width: 960px) {\n    .auto-fold #wpcontent, .auto-fold #wpfooter {\n      margin-left: 36px\n    }\n    .auto-fold #adminmenu, .auto-fold #adminmenu li.menu-top, .auto-fold #adminmenuback, .auto-fold #adminmenuwrap {\n      width: 36px\n    }\n    .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 {\n      top: 0;\n      left: 36px\n    }\n    .auto-fold #adminmenu .wp-has-current-submenu .wp-submenu, .auto-fold #adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n      position: absolute;\n      top: -1000em;\n      margin-right: -1px;\n      padding: 7px 0 8px;\n      z-index: 9999\n    }\n    .auto-fold #adminmenu .wp-has-current-submenu .wp-submenu {\n      min-width: 150px;\n      width: auto\n    }\n    .auto-fold #adminmenu .wp-has-current-submenu li > a {\n      padding-right: 16px;\n      padding-left: 14px\n    }\n    .auto-fold #adminmenu li.menu-top .wp-submenu > li > a {\n      padding-left: 12px\n    }\n    .auto-fold #adminmenu .wp-menu-name {\n      position: absolute;\n      left: -999px\n    }\n    .auto-fold #adminmenu .wp-submenu-head {\n      display: block\n    }\n    .auto-fold #adminmenu div.wp-menu-image {\n      height: 30px;\n      width: 34px;\n      position: absolute;\n      z-index: 25\n    }\n    .auto-fold #adminmenu a.menu-top {\n      min-height: 34px\n    }\n    .auto-fold #adminmenu li.wp-menu-open {\n      border: 0 none\n    }\n    .auto-fold #adminmenu .wp-has-current-submenu.menu-top-last {\n      margin-bottom: 0\n    }\n    .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 {\n      display: none\n    }\n    .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 {\n      border-width: 4px;\n      margin-top: -4px;\n      top: 16px\n    }\n    .auto-fold ul#adminmenu a.wp-has-current-submenu:after, .auto-fold ul#adminmenu > li a.current:after {\n      border-width: 4px;\n      margin-top: -4px\n    }\n    .auto-fold #adminmenu li.menu-top:hover, .auto-fold #adminmenu li.opensub > a.menu-top, .auto-fold #adminmenu li > a.menu-top:focus {\n      z-index: 10000\n    }\n    .auto-fold #collapse-menu .collapse-button-label {\n      display: none\n    }\n    .auto-fold #collapse-button .collapse-button-icon:after {\n      transform: rotate(180deg)\n    }\n    .rtl.auto-fold #collapse-button .collapse-button-icon:after {\n      transform: none\n    }\n  }\n  @media screen and (max-width: 782px) {\n    .auto-fold #wpcontent {\n      position: relative;\n      margin-left: 0;\n      padding-left: 10px\n    }\n    .sticky-menu #adminmenuwrap {\n      position: relative;\n      z-index: auto;\n      top: 0\n    }\n    .auto-fold #adminmenu, .auto-fold #adminmenuback, .auto-fold #adminmenuwrap {\n      position: absolute;\n      width: 190px;\n      z-index: 100\n    }\n    .auto-fold #adminmenuback {\n      position: fixed\n    }\n    .auto-fold #adminmenuback, .auto-fold #adminmenuwrap {\n      display: none\n    }\n    .auto-fold .wp-responsive-open #adminmenuback, .auto-fold .wp-responsive-open #adminmenuwrap {\n      display: block\n    }\n    .auto-fold #adminmenu li.menu-top {\n      width: 100%\n    }\n    .auto-fold #adminmenu li a {\n      font-size: 16px;\n      padding: 5px\n    }\n    .auto-fold #adminmenu li.menu-top .wp-submenu > li > a {\n      padding: 10px 10px 10px 20px\n    }\n    .auto-fold #adminmenu .wp-menu-name {\n      position: static\n    }\n    .auto-fold ul#adminmenu a.wp-has-current-submenu:after, .auto-fold ul#adminmenu > li.current > a.current:after {\n      border-width: 8px;\n      margin-top: -8px\n    }\n    .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 {\n      display: none\n    }\n    #adminmenu .wp-submenu {\n      position: relative;\n      display: none\n    }\n    .auto-fold #adminmenu .selected .wp-submenu, .auto-fold #adminmenu .wp-menu-open .wp-submenu {\n      position: relative;\n      display: block;\n      top: 0;\n      left: -1px;\n      box-shadow: none\n    }\n    .auto-fold #adminmenu .selected .wp-submenu:after, .auto-fold #adminmenu .wp-menu-open .wp-submenu:after {\n      display: none\n    }\n    .auto-fold #adminmenu .opensub .wp-submenu {\n      display: none\n    }\n    .auto-fold #adminmenu .selected .wp-submenu {\n      display: block\n    }\n    .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 {\n      display: block\n    }\n    .auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu, .auto-fold #adminmenu a.menu-top:focus + .wp-submenu {\n      position: relative;\n      left: -1px;\n      right: 0;\n      top: 0\n    }\n    #adminmenu .wp-not-current-submenu .wp-submenu, .folded #adminmenu .wp-has-current-submenu .wp-submenu {\n      border-left: none\n    }\n    #adminmenu .wp-submenu .wp-submenu-head {\n      display: none\n    }\n    #wp-responsive-toggle {\n      position: fixed;\n      top: 5px;\n      left: 4px;\n      padding-right: 10px;\n      z-index: 99999;\n      border: none;\n      box-sizing: border-box\n    }\n    #wpadminbar #wp-admin-bar-menu-toggle a {\n      display: block;\n      padding: 0;\n      overflow: hidden;\n      outline: 0;\n      text-decoration: none;\n      border: 1px solid transparent;\n      background: 0 0;\n      height: 44px;\n      margin-left: -1px\n    }\n    .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n      background: #2c3338\n    }\n    li#wp-admin-bar-menu-toggle {\n      display: block\n    }\n    #wpadminbar #wp-admin-bar-menu-toggle a:hover {\n      border: 1px solid transparent\n    }\n    #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n      content: \"\\f228\";\n      display: inline-block;\n      float: left;\n      font: normal 40px/45px dashicons;\n      vertical-align: middle;\n      outline: 0;\n      margin: 0;\n      -webkit-font-smoothing: antialiased;\n      -moz-osx-font-smoothing: grayscale;\n      height: 44px;\n      width: 50px;\n      padding: 0;\n      border: none;\n      text-align: center;\n      text-decoration: none;\n      box-sizing: border-box\n    }\n    .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n      color: #72aee6\n    }\n  }\n  @media screen and (max-width: 600px) {\n    #adminmenuback, #adminmenuwrap {\n      display: none\n    }\n    .wp-responsive-open #adminmenuback, .wp-responsive-open #adminmenuwrap {\n      display: block\n    }\n    .auto-fold #adminmenu {\n      top: 46px\n    }\n  }\n  /*! This file is auto-generated */\n  #wpbody-content #dashboard-widgets.columns-1 .postbox-container {\n    width: 100%\n  }\n\n  #wpbody-content #dashboard-widgets.columns-2 .postbox-container {\n    width: 49.5%\n  }\n\n  #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 {\n    float: right;\n    width: 50.5%\n  }\n\n  #wpbody-content #dashboard-widgets.columns-3 .postbox-container {\n    width: 33.5%\n  }\n\n  #wpbody-content #dashboard-widgets.columns-3 #postbox-container-1 {\n    width: 33%\n  }\n\n  #wpbody-content #dashboard-widgets.columns-3 #postbox-container-3, #wpbody-content #dashboard-widgets.columns-3 #postbox-container-4 {\n    float: right\n  }\n\n  #wpbody-content #dashboard-widgets.columns-4 .postbox-container {\n    width: 25%\n  }\n\n  #dashboard-widgets .postbox-container {\n    width: 25%\n  }\n\n  #dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container {\n    border: none !important\n  }\n\n  #dashboard-widgets-wrap {\n    overflow: hidden;\n    margin: 0 -8px\n  }\n\n  #dashboard-widgets .postbox .inside {\n    margin-bottom: 0\n  }\n\n  #dashboard-widgets .meta-box-sortables {\n    display: flow-root;\n    min-height: 100px;\n    margin: 0 8px 20px\n  }\n\n  #dashboard-widgets .postbox-container .empty-container {\n    outline: 3px dashed #c3c4c7;\n    height: 250px\n  }\n\n  .is-dragging-metaboxes #dashboard-widgets .meta-box-sortables {\n    outline: 3px dashed #646970;\n    display: flow-root\n  }\n\n  #dashboard-widgets .postbox-container .empty-container:after {\n    content: attr(data-emptystring);\n    margin: auto;\n    position: absolute;\n    top: 50%;\n    left: 0;\n    right: 0;\n    transform: translateY(-50%);\n    padding: 0 2em;\n    text-align: center;\n    color: #646970;\n    font-size: 16px;\n    line-height: 1.5;\n    display: none\n  }\n\n  #the-comment-list td.comment p.comment-author {\n    margin-top: 0;\n    margin-left: 0\n  }\n\n  #the-comment-list p.comment-author img {\n    float: left;\n    margin-right: 8px\n  }\n\n  #the-comment-list p.comment-author strong a {\n    border: none\n  }\n\n  #the-comment-list td {\n    vertical-align: top\n  }\n\n  #the-comment-list td.comment {\n    word-wrap: break-word\n  }\n\n  #the-comment-list td.comment img {\n    max-width: 100%\n  }\n\n  .index-php #screen-meta-links {\n    margin: 0 20px 8px 0\n  }\n\n  .welcome-panel {\n    position: relative;\n    overflow: auto;\n    margin: 16px 0;\n    background: #2271b1 url(images/about-texture.png) center repeat;\n    background-size: 500px 500px;\n    background-blend-mode: overlay;\n    font-size: 14px;\n    line-height: 1.3;\n    clear: both\n  }\n\n  .welcome-panel::before {\n    content: \"\";\n    position: absolute;\n    top: -16px;\n    right: 96px;\n    z-index: 0;\n    width: 300px;\n    height: 382px;\n    background: url(images/about-header-about.svg) no-repeat center;\n    background-size: contain\n  }\n\n  .welcome-panel h2 {\n    margin: 0;\n    font-size: 48px;\n    font-weight: 600;\n    line-height: 1.25;\n    color: #fff\n  }\n\n  .welcome-panel h3 {\n    margin: 0;\n    font-size: 20px;\n    font-weight: 400;\n    line-height: 1.4\n  }\n\n  .welcome-panel p {\n    font-size: inherit;\n    line-height: inherit\n  }\n\n  .welcome-panel-header {\n    color: #fff\n  }\n\n  .welcome-panel-header a {\n    color: #fff\n  }\n\n  .welcome-panel-header a:focus, .welcome-panel-header a:hover {\n    color: #f5e6ab;\n    text-decoration: none\n  }\n\n  .welcome-panel .welcome-panel-close:focus, .welcome-panel-header a:focus {\n    outline-color: currentColor;\n    outline-offset: 1px;\n    box-shadow: none\n  }\n\n  .welcome-panel-header p {\n    margin: .5em 0 0;\n    font-size: 20px;\n    line-height: 1.4\n  }\n\n  .welcome-panel .welcome-panel-close {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n    padding: 10px 15px 10px 24px;\n    font-size: 13px;\n    line-height: 1.23076923;\n    text-decoration: none\n  }\n\n  .welcome-panel .welcome-panel-close:before {\n    position: absolute;\n    top: 8px;\n    left: 0;\n    transition: all .1s ease-in-out;\n    content: '\\f335';\n    font-size: 24px;\n    color: #fff\n  }\n\n  .welcome-panel .welcome-panel-close {\n    color: #fff\n  }\n\n  .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 {\n    color: #f5e6ab\n  }\n\n  .wp-core-ui .welcome-panel .button.button-hero {\n    margin: 15px 13px 3px 0;\n    padding: 12px 36px;\n    height: auto;\n    line-height: 1.4285714;\n    white-space: normal\n  }\n\n  .welcome-panel-content {\n    min-height: 400px;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between\n  }\n\n  .welcome-panel-header {\n    box-sizing: border-box;\n    margin-left: auto;\n    margin-right: auto;\n    max-width: 1500px;\n    width: 100%;\n    padding: 48px 408px 48px 48px\n  }\n\n  .welcome-panel .welcome-panel-column-container {\n    box-sizing: border-box;\n    width: 100%;\n    clear: both;\n    display: grid;\n    z-index: 1;\n    margin-top: 32px;\n    padding: 48px;\n    grid-template-columns:repeat(3, 1fr);\n    gap: 32px;\n    align-self: flex-end;\n    background: #fff\n  }\n\n  [class*=welcome-panel-icon] {\n    height: 60px;\n    width: 60px;\n    background-color: #1d2327;\n    background-position: center;\n    background-size: 24px 24px;\n    background-repeat: no-repeat;\n    border-radius: 100%\n  }\n\n  .welcome-panel-column {\n    display: grid;\n    grid-template-columns:min-content 1fr;\n    gap: 24px\n  }\n\n  .welcome-panel-icon-pages {\n    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\")\n  }\n\n  .welcome-panel-icon-layout {\n    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\")\n  }\n\n  .welcome-panel-icon-styles {\n    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\")\n  }\n\n  .welcome-panel .welcome-widgets-menus {\n    line-height: 1.14285714\n  }\n\n  .welcome-panel .welcome-panel-column ul {\n    margin: .8em 1em 1em 0\n  }\n\n  .welcome-panel li {\n    font-size: 14px\n  }\n\n  .welcome-panel li a {\n    text-decoration: none\n  }\n\n  .welcome-panel .welcome-panel-column li {\n    line-height: 1.14285714;\n    list-style-type: none;\n    padding: 0 0 8px\n  }\n\n  .welcome-panel .welcome-icon {\n    background: 0 0 !important\n  }\n\n  #dashboard_right_now .search-engines-info:before, #dashboard_right_now li a:before, #dashboard_right_now li span:before, .welcome-panel .welcome-icon:before {\n    color: #646970;\n    font: normal 20px/1 dashicons;\n    speak: never;\n    display: inline-block;\n    padding: 0 10px 0 0;\n    position: relative;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    text-decoration: none !important;\n    vertical-align: top\n  }\n\n  .welcome-panel .welcome-edit-page:before, .welcome-panel .welcome-write-blog:before {\n    content: \"\\f119\";\n    top: -3px\n  }\n\n  .welcome-panel .welcome-add-page:before {\n    content: \"\\f132\";\n    top: -1px\n  }\n\n  .welcome-panel .welcome-setup-home:before {\n    content: \"\\f102\";\n    top: -1px\n  }\n\n  .welcome-panel .welcome-view-site:before {\n    content: \"\\f115\";\n    top: -2px\n  }\n\n  .welcome-panel .welcome-widgets-menus:before {\n    content: \"\\f116\";\n    top: -2px\n  }\n\n  .welcome-panel .welcome-widgets:before {\n    content: \"\\f538\";\n    top: -2px\n  }\n\n  .welcome-panel .welcome-menus:before {\n    content: \"\\f163\";\n    top: -2px\n  }\n\n  .welcome-panel .welcome-comments:before {\n    content: \"\\f117\";\n    top: -1px\n  }\n\n  .welcome-panel .welcome-learn-more:before {\n    content: \"\\f118\";\n    top: -1px\n  }\n\n  #dashboard_right_now .search-engines-info:before, #dashboard_right_now li a:before, #dashboard_right_now li > span:before {\n    content: \"\\f159\";\n    padding: 0 5px 0 0\n  }\n\n  #dashboard_right_now .page-count a:before, #dashboard_right_now .page-count span:before {\n    content: \"\\f105\"\n  }\n\n  #dashboard_right_now .post-count a:before, #dashboard_right_now .post-count span:before {\n    content: \"\\f109\"\n  }\n\n  #dashboard_right_now .comment-count a:before {\n    content: \"\\f101\"\n  }\n\n  #dashboard_right_now .comment-mod-count a:before {\n    content: \"\\f125\"\n  }\n\n  #dashboard_right_now .storage-count a:before {\n    content: \"\\f104\"\n  }\n\n  #dashboard_right_now .storage-count.warning a:before {\n    content: \"\\f153\"\n  }\n\n  #dashboard_right_now .search-engines-info:before {\n    content: \"\\f348\"\n  }\n\n  .community-events-errors {\n    margin: 0\n  }\n\n  .community-events-loading {\n    padding: 10px 12px 8px\n  }\n\n  .community-events {\n    margin-bottom: 6px;\n    padding: 0 12px\n  }\n\n  .community-events .spinner {\n    float: none;\n    margin: 5px 2px 0;\n    vertical-align: top\n  }\n\n  .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] {\n    display: none\n  }\n\n  .community-events .activity-block:first-child, .community-events h2 {\n    padding-top: 12px;\n    padding-bottom: 10px\n  }\n\n  .community-events-form {\n    margin: 15px 0 5px\n  }\n\n  .community-events-form .regular-text {\n    width: 40%;\n    height: 29px;\n    margin: 0;\n    vertical-align: top\n  }\n\n  .community-events li.event-none {\n    border-left: 4px solid #72aee6\n  }\n\n  #dashboard-widgets .community-events li.event-none a {\n    text-decoration: underline\n  }\n\n  .community-events-form label {\n    display: inline-block;\n    vertical-align: top;\n    line-height: 2.15384615;\n    height: 28px\n  }\n\n  .community-events .activity-block > p {\n    margin-bottom: 0;\n    display: inline\n  }\n\n  .community-events-toggle-location {\n    vertical-align: middle\n  }\n\n  #community-events-submit {\n    margin-left: 3px;\n    margin-right: 3px\n  }\n\n  #dashboard-widgets .community-events-cancel.button-link {\n    vertical-align: top;\n    line-height: 2;\n    height: 28px;\n    text-decoration: underline\n  }\n\n  .community-events ul {\n    background-color: #f6f7f7;\n    padding-left: 0;\n    padding-right: 0;\n    padding-bottom: 0\n  }\n\n  .community-events li {\n    margin: 0;\n    padding: 8px 12px;\n    color: #2c3338\n  }\n\n  .community-events li:first-child {\n    border-top: 1px solid #f0f0f1\n  }\n\n  .community-events li ~ li {\n    border-top: 1px solid #f0f0f1\n  }\n\n  .community-events .activity-block.last {\n    border-bottom: 1px solid #f0f0f1;\n    padding-top: 0;\n    margin-top: -1px\n  }\n\n  .community-events .event-info {\n    display: block\n  }\n\n  .event-icon {\n    height: 18px;\n    padding-right: 10px;\n    width: 18px;\n    display: none\n  }\n\n  .event-icon:before {\n    color: #646970;\n    font-size: 18px\n  }\n\n  .event-meetup .event-icon:before {\n    content: \"\\f484\"\n  }\n\n  .event-wordcamp .event-icon:before {\n    content: \"\\f486\"\n  }\n\n  .community-events .event-title {\n    font-weight: 600;\n    display: block\n  }\n\n  .community-events .event-date, .community-events .event-time {\n    display: block\n  }\n\n  .community-events-footer {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding: 12px;\n    border-top: 1px solid #f0f0f1;\n    color: #dcdcde\n  }\n\n  .community-events-footer .screen-reader-text {\n    height: inherit;\n    white-space: nowrap\n  }\n\n  #dashboard_primary .inside {\n    margin: 0;\n    padding: 0\n  }\n\n  #dashboard_primary .widget-loading {\n    padding: 12px 12px 0;\n    margin-bottom: 1em !important\n  }\n\n  #dashboard_primary .inside .notice {\n    margin: 0\n  }\n\n  body #dashboard-widgets .postbox form .submit {\n    margin: 0\n  }\n\n  .dashboard-widget-control-form p {\n    margin-top: 0\n  }\n\n  .rssSummary {\n    color: #646970;\n    margin-top: 4px\n  }\n\n  #dashboard_primary .rss-widget {\n    font-size: 13px;\n    padding: 0 12px\n  }\n\n  #dashboard_primary .rss-widget:last-child {\n    border-bottom: none;\n    padding-bottom: 8px\n  }\n\n  #dashboard_primary .rss-widget a {\n    font-weight: 400\n  }\n\n  #dashboard_primary .rss-widget span, #dashboard_primary .rss-widget span.rss-date {\n    color: #646970\n  }\n\n  #dashboard_primary .rss-widget span.rss-date {\n    margin-left: 12px\n  }\n\n  #dashboard_primary .rss-widget ul li {\n    padding: 4px 0;\n    margin: 0\n  }\n\n  #dashboard_right_now ul {\n    margin: 0;\n    display: inline-block;\n    width: 100%\n  }\n\n  #dashboard_right_now li {\n    width: 50%;\n    float: left;\n    margin-bottom: 10px\n  }\n\n  #dashboard_right_now .inside {\n    padding: 0\n  }\n\n  #dashboard_right_now .main {\n    padding: 0 12px 11px\n  }\n\n  #dashboard_right_now .main p {\n    margin: 0\n  }\n\n  #dashboard_right_now #wp-version-message .button {\n    float: right;\n    position: relative;\n    top: -5px;\n    margin-left: 5px\n  }\n\n  #dashboard_right_now p.search-engines-info {\n    margin: 1em 0\n  }\n\n  .mu-storage {\n    overflow: hidden\n  }\n\n  #dashboard-widgets h3.mu-storage {\n    margin: 0 0 10px;\n    padding: 0;\n    font-size: 14px;\n    font-weight: 400\n  }\n\n  #dashboard_right_now .sub {\n    color: #50575e;\n    background: #f6f7f7;\n    border-top: 1px solid #f0f0f1;\n    padding: 10px 12px 6px\n  }\n\n  #dashboard_right_now .sub h3 {\n    color: #50575e\n  }\n\n  #dashboard_right_now .sub p {\n    margin: 0 0 1em\n  }\n\n  #dashboard_right_now .warning a:before, #dashboard_right_now .warning span:before {\n    color: #d63638\n  }\n\n  #dashboard_quick_press .inside {\n    margin: 0;\n    padding: 0\n  }\n\n  #dashboard_quick_press div.updated {\n    margin-bottom: 10px;\n    border: 1px solid #f0f0f1;\n    border-width: 1px 1px 1px 0\n  }\n\n  #dashboard_quick_press form {\n    margin: 12px\n  }\n\n  #dashboard_quick_press .drafts {\n    padding: 10px 0 0\n  }\n\n  #dashboard_quick_press label {\n    display: inline-block;\n    margin-bottom: 4px\n  }\n\n  #dashboard_quick_press input, #dashboard_quick_press textarea {\n    box-sizing: border-box;\n    margin: 0\n  }\n\n  #dashboard-widgets .postbox form .submit {\n    margin: -39px 0;\n    float: right\n  }\n\n  #description-wrap {\n    margin-top: 12px\n  }\n\n  #quick-press textarea#content {\n    min-height: 90px;\n    max-height: 1300px;\n    margin: 0 0 8px;\n    padding: 6px 7px;\n    resize: none\n  }\n\n  .js #dashboard_quick_press .drafts {\n    border-top: 1px solid #f0f0f1\n  }\n\n  #dashboard_quick_press .drafts abbr {\n    border: none\n  }\n\n  #dashboard_quick_press .drafts .view-all {\n    float: right;\n    margin: 0 12px 0 0\n  }\n\n  #dashboard_primary a.rsswidget {\n    font-weight: 400\n  }\n\n  #dashboard_quick_press .drafts ul {\n    margin: 0 12px\n  }\n\n  #dashboard_quick_press .drafts li {\n    margin-bottom: 1em\n  }\n\n  #dashboard_quick_press .drafts li time {\n    color: #646970\n  }\n\n  #dashboard_quick_press .drafts p {\n    margin: 0;\n    word-wrap: break-word\n  }\n\n  #dashboard_quick_press .draft-title {\n    word-wrap: break-word\n  }\n\n  #dashboard_quick_press .draft-title a, #dashboard_quick_press .draft-title time {\n    margin: 0 5px 0 0\n  }\n\n  #dashboard-widgets h3, #dashboard-widgets h4, #dashboard_quick_press .drafts h2 {\n    margin: 0 12px 8px;\n    padding: 0;\n    font-size: 14px;\n    font-weight: 400;\n    color: #1d2327\n  }\n\n  #dashboard_quick_press .drafts h2 {\n    line-height: inherit\n  }\n\n  #dashboard-widgets .inside h3, #dashboard-widgets .inside h4 {\n    margin-left: 0;\n    margin-right: 0\n  }\n\n  #dashboard_activity .comment-meta span.approve:before {\n    content: \"\\f227\";\n    font: 20px/.5 dashicons;\n    margin-left: 5px;\n    vertical-align: middle;\n    position: relative;\n    top: -1px;\n    margin-right: 2px\n  }\n\n  #dashboard_activity .inside {\n    margin: 0;\n    padding-bottom: 0\n  }\n\n  #dashboard_activity .no-activity {\n    overflow: hidden;\n    padding: 12px 0;\n    text-align: center\n  }\n\n  #dashboard_activity .no-activity p {\n    color: #646970;\n    font-size: 16px\n  }\n\n  #dashboard_activity .subsubsub {\n    float: none;\n    border-top: 1px solid #f0f0f1;\n    margin: 0 -12px;\n    padding: 8px 12px 4px\n  }\n\n  #dashboard_activity .subsubsub a .count, #dashboard_activity .subsubsub a.current .count {\n    color: #646970\n  }\n\n  #future-posts ul, #published-posts ul {\n    clear: both;\n    margin-bottom: 0\n  }\n\n  #future-posts li, #published-posts li {\n    margin-bottom: 8px\n  }\n\n  #future-posts ul span, #published-posts ul span {\n    display: inline-block;\n    margin-right: 5px;\n    min-width: 150px;\n    color: #646970\n  }\n\n  .activity-block {\n    border-bottom: 1px solid #f0f0f1;\n    margin: 0 -12px;\n    padding: 8px 12px 4px\n  }\n\n  .activity-block:last-child {\n    border-bottom: none\n  }\n\n  .activity-block .subsubsub li {\n    color: #dcdcde\n  }\n\n  #activity-widget #the-comment-list div.undo, #activity-widget #the-comment-list tr.undo {\n    background: 0 0;\n    padding: 6px 0;\n    margin-left: 12px\n  }\n\n  #activity-widget #the-comment-list .comment-item {\n    background: #f6f7f7;\n    padding: 12px;\n    position: relative\n  }\n\n  #activity-widget #the-comment-list .avatar {\n    position: absolute;\n    top: 12px\n  }\n\n  #activity-widget #the-comment-list .dashboard-comment-wrap.has-avatar {\n    padding-left: 63px\n  }\n\n  #activity-widget #the-comment-list .dashboard-comment-wrap blockquote {\n    margin: 1em 0\n  }\n\n  #activity-widget #the-comment-list .comment-item p.row-actions {\n    margin: 4px 0 0\n  }\n\n  #activity-widget #the-comment-list .comment-item:first-child {\n    border-top: 1px solid #f0f0f1\n  }\n\n  #activity-widget #the-comment-list .unapproved {\n    background-color: #fcf9e8\n  }\n\n  #activity-widget #the-comment-list .unapproved:before {\n    content: \"\";\n    display: block;\n    position: absolute;\n    left: 0;\n    top: 0;\n    bottom: 0;\n    background: #d63638;\n    width: 4px\n  }\n\n  #activity-widget #the-comment-list .spam-undo-inside .avatar, #activity-widget #the-comment-list .trash-undo-inside .avatar {\n    position: relative;\n    top: 0\n  }\n\n  #dashboard-widgets #dashboard_browser_nag.postbox .inside {\n    margin: 10px\n  }\n\n  .postbox .button-link .edit-box {\n    display: none\n  }\n\n  .edit-box {\n    opacity: 0\n  }\n\n  .edit-box:focus, .hndle:hover .edit-box {\n    opacity: 1\n  }\n\n  #dashboard-widgets form .input-text-wrap input {\n    width: 100%\n  }\n\n  #dashboard-widgets form .textarea-wrap textarea {\n    width: 100%\n  }\n\n  #dashboard-widgets .postbox form .submit {\n    float: none;\n    margin: .5em 0 0;\n    padding: 0;\n    border: none\n  }\n\n  #dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish {\n    min-width: 0\n  }\n\n  #dashboard-widgets .button-link, #dashboard-widgets li a, .community-events-footer a {\n    text-decoration: none\n  }\n\n  #dashboard-widgets h2 a {\n    text-decoration: underline\n  }\n\n  #dashboard-widgets .hndle .postbox-title-action {\n    float: right;\n    line-height: 1.2\n  }\n\n  #dashboard_plugins h5 {\n    font-size: 14px\n  }\n\n  #latest-comments #the-comment-list {\n    position: relative;\n    margin: 0 -12px\n  }\n\n  #activity-widget #the-comment-list .comment, #activity-widget #the-comment-list .pingback {\n    box-shadow: inset 0 1px 0 rgba(0, 0, 0, .06)\n  }\n\n  #activity-widget .comments #the-comment-list .alt {\n    background-color: transparent\n  }\n\n  #activity-widget #latest-comments #the-comment-list .comment-item {\n    min-height: 50px;\n    margin: 0;\n    padding: 12px\n  }\n\n  #latest-comments #the-comment-list .pingback {\n    padding-left: 12px !important\n  }\n\n  #latest-comments #the-comment-list .comment-item:first-child {\n    border-top: none\n  }\n\n  #latest-comments #the-comment-list .comment-meta {\n    line-height: 1.5;\n    margin: 0;\n    color: #646970\n  }\n\n  #latest-comments #the-comment-list .comment-meta cite {\n    font-style: normal;\n    font-weight: 400\n  }\n\n  #latest-comments #the-comment-list .comment-item blockquote, #latest-comments #the-comment-list .comment-item blockquote p {\n    margin: 0;\n    padding: 0;\n    display: inline\n  }\n\n  #latest-comments #the-comment-list .comment-item p.row-actions {\n    margin: 3px 0 0;\n    padding: 0;\n    font-size: 13px\n  }\n\n  .rss-widget ul {\n    margin: 0;\n    padding: 0;\n    list-style: none\n  }\n\n  a.rsswidget {\n    font-size: 13px;\n    font-weight: 600;\n    line-height: 1.4\n  }\n\n  .rss-widget ul li {\n    line-height: 1.5;\n    margin-bottom: 12px\n  }\n\n  .rss-widget span.rss-date {\n    color: #646970;\n    font-size: 13px;\n    margin-left: 3px\n  }\n\n  .rss-widget cite {\n    display: block;\n    text-align: right;\n    margin: 0 0 1em;\n    padding: 0\n  }\n\n  .rss-widget cite:before {\n    content: \"\\2014\"\n  }\n\n  .dashboard-comment-wrap {\n    word-wrap: break-word\n  }\n\n  #dashboard_browser_nag a.update-browser-link {\n    font-size: 1.2em;\n    font-weight: 600\n  }\n\n  #dashboard_browser_nag a {\n    text-decoration: underline\n  }\n\n  #dashboard_browser_nag p.browser-update-nag.has-browser-icon {\n    padding-right: 128px\n  }\n\n  #dashboard_browser_nag .browser-icon {\n    margin-top: -32px\n  }\n\n  #dashboard_browser_nag.postbox {\n    background-color: #b32d2e;\n    background-image: none;\n    border-color: #b32d2e;\n    color: #fff;\n    box-shadow: none\n  }\n\n  #dashboard_browser_nag.postbox h2 {\n    border-bottom-color: transparent;\n    background: transparent none;\n    color: #fff;\n    box-shadow: none\n  }\n\n  #dashboard_browser_nag a {\n    color: #fff\n  }\n\n  #dashboard_browser_nag.postbox .postbox-header {\n    border-color: transparent\n  }\n\n  #dashboard_browser_nag h2.hndle {\n    border: none;\n    font-weight: 600;\n    font-size: 20px;\n    padding-top: 10px\n  }\n\n  .postbox#dashboard_browser_nag p a.dismiss {\n    font-size: 14px\n  }\n\n  .postbox#dashboard_browser_nag a, .postbox#dashboard_browser_nag p, .postbox#dashboard_browser_nag p.browser-update-nag {\n    font-size: 16px\n  }\n\n  #dashboard_php_nag .dashicons-warning {\n    color: #dba617;\n    padding-right: 6px\n  }\n\n  #dashboard_php_nag.php-insecure .dashicons-warning {\n    color: #d63638\n  }\n\n  #dashboard_php_nag h2 {\n    display: inline-block\n  }\n\n  #dashboard_php_nag p {\n    margin: 12px 0\n  }\n\n  #dashboard_php_nag h3 {\n    font-weight: 600\n  }\n\n  #dashboard_php_nag .button .dashicons-external {\n    line-height: 25px\n  }\n\n  @media only screen and (min-width: 1600px) {\n    .welcome-panel .welcome-panel-column-container {\n      display: flex;\n      justify-content: center\n    }\n    .welcome-panel-column {\n      width: 100%;\n      max-width: 460px\n    }\n  }\n  @media only screen and (max-width: 799px) {\n    #wpbody-content #dashboard-widgets .postbox-container {\n      width: 100%\n    }\n    #dashboard-widgets .meta-box-sortables {\n      min-height: 0\n    }\n    .is-dragging-metaboxes #dashboard-widgets .meta-box-sortables {\n      min-height: 100px\n    }\n    #dashboard-widgets .meta-box-sortables.empty-container {\n      margin-bottom: 0\n    }\n  }\n  @media only screen and (min-width: 800px) and (max-width: 1499px) {\n    #wpbody-content #dashboard-widgets .postbox-container {\n      width: 49.5%\n    }\n    #wpbody-content #dashboard-widgets #postbox-container-2, #wpbody-content #dashboard-widgets #postbox-container-3, #wpbody-content #dashboard-widgets #postbox-container-4 {\n      float: right;\n      width: 50.5%\n    }\n    #dashboard-widgets #postbox-container-3 .empty-container, #dashboard-widgets #postbox-container-4 .empty-container {\n      outline: 0;\n      height: 0;\n      min-height: 0;\n      margin-bottom: 0\n    }\n    #dashboard-widgets #postbox-container-3 .empty-container:after, #dashboard-widgets #postbox-container-4 .empty-container:after {\n      display: none\n    }\n    #wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container {\n      width: 100%\n    }\n    #wpbody #dashboard-widgets .metabox-holder.columns-1 .postbox-container .empty-container {\n      outline: 0;\n      height: 0;\n      min-height: 0;\n      margin-bottom: 0\n    }\n    .index-php .columns-prefs, .index-php .screen-layout {\n      display: block\n    }\n    .columns-prefs .columns-prefs-3, .columns-prefs .columns-prefs-4 {\n      display: none\n    }\n    #dashboard-widgets .postbox-container .empty-container:after {\n      display: block\n    }\n  }\n  @media only screen and (min-width: 1500px) and (max-width: 1800px) {\n    #wpbody-content #dashboard-widgets .postbox-container {\n      width: 33.5%\n    }\n    #wpbody-content #dashboard-widgets #postbox-container-1 {\n      width: 33%\n    }\n    #wpbody-content #dashboard-widgets #postbox-container-3, #wpbody-content #dashboard-widgets #postbox-container-4 {\n      float: right\n    }\n    #dashboard-widgets #postbox-container-4 .empty-container {\n      outline: 0;\n      height: 0;\n      min-height: 0;\n      margin-bottom: 0\n    }\n    #dashboard-widgets #postbox-container-4 .empty-container:after {\n      display: none\n    }\n    #dashboard-widgets .postbox-container .empty-container:after {\n      display: block\n    }\n  }\n  @media only screen and (min-width: 1801px) {\n    #dashboard-widgets .postbox-container .empty-container:after {\n      display: block\n    }\n  }\n  @media screen and (max-width: 870px) {\n    .welcome-panel .welcome-panel-column li {\n      display: inline-block;\n      margin-right: 13px\n    }\n    .welcome-panel .welcome-panel-column ul {\n      margin: .4em 0 0\n    }\n  }\n  @media screen and (max-width: 1180px) and (min-width: 783px) {\n    .welcome-panel-column {\n      grid-template-columns:1fr\n    }\n    [class*=welcome-panel-icon] {\n      display: none\n    }\n  }\n  @media screen and (max-width: 782px) {\n    .welcome-panel::before {\n      width: 240px;\n      height: 305px;\n      right: 32px\n    }\n    .welcome-panel-header {\n      padding: 32px 288px 32px 32px\n    }\n    .welcome-panel .welcome-panel-column-container {\n      grid-template-columns:1fr;\n      box-sizing: border-box;\n      padding: 32px;\n      width: 100%\n    }\n    .welcome-panel .welcome-panel-column-content {\n      max-width: 520px\n    }\n    .welcome-panel .welcome-panel-close {\n      overflow: hidden;\n      text-indent: 40px;\n      white-space: nowrap;\n      width: 20px;\n      height: 20px;\n      padding: 5px;\n      top: 5px;\n      right: 5px\n    }\n    .welcome-panel .welcome-panel-close::before {\n      top: 5px;\n      left: -35px\n    }\n    #dashboard-widgets h2 {\n      padding: 12px\n    }\n    #dashboard_recent_comments #the-comment-list .comment-item .avatar {\n      height: 30px;\n      width: 30px;\n      margin: 4px 10px 5px 0\n    }\n    .community-events-toggle-location {\n      height: 38px;\n      vertical-align: baseline\n    }\n    .community-events-form .regular-text {\n      height: 32px\n    }\n    #community-events-submit {\n      margin-bottom: 0;\n      vertical-align: top\n    }\n    #dashboard-widgets .community-events-cancel.button-link, .community-events-form label {\n      font-size: 14px;\n      line-height: normal;\n      height: auto;\n      padding: 6px 0;\n      border: 1px solid transparent\n    }\n    .community-events .spinner {\n      margin-top: 7px\n    }\n  }\n  @media screen and (max-width: 600px) {\n    .welcome-panel::before {\n      display: none\n    }\n    .welcome-panel-header {\n      padding: 32px\n    }\n  }\n  @media screen and (max-width: 480px) {\n    .welcome-panel-column {\n      gap: 16px\n    }\n  }\n  @media screen and (max-width: 360px) {\n    .welcome-panel-column {\n      grid-template-columns:1fr\n    }\n    [class*=welcome-panel-icon] {\n      display: none\n    }\n  }\n  @media screen and (min-width: 355px) {\n    .community-events .event-info {\n      display: table-row;\n      float: left;\n      max-width: 59%\n    }\n    .event-icon, .event-icon[aria-hidden=true] {\n      display: table-cell\n    }\n    .event-info-inner {\n      display: table-cell\n    }\n    .community-events .event-date-time {\n      float: right;\n      max-width: 39%\n    }\n    .community-events .event-date, .community-events .event-time {\n      text-align: right\n    }\n  }\n  /*! This file is auto-generated */\n  .response-links {\n    display: block;\n    margin-bottom: 1em\n  }\n\n  .response-links a {\n    display: block\n  }\n\n  .response-links a.comments-edit-item-link {\n    font-weight: 600\n  }\n\n  .response-links a.comments-view-item-link {\n    font-size: 12px\n  }\n\n  .post-com-count-wrapper strong {\n    font-weight: 400\n  }\n\n  .comments-view-item-link {\n    display: inline-block;\n    clear: both\n  }\n\n  .column-comments .post-com-count-wrapper, .column-response .post-com-count-wrapper {\n    white-space: nowrap;\n    word-wrap: normal\n  }\n\n  .column-comments .post-com-count, .column-response .post-com-count {\n    display: inline-block;\n    vertical-align: top\n  }\n\n  .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 {\n    margin-top: 5px\n  }\n\n  .column-comments .comment-count-approved, .column-comments .comment-count-no-comments, .column-response .comment-count-approved, .column-response .comment-count-no-comments {\n    box-sizing: border-box;\n    display: block;\n    padding: 0 8px;\n    min-width: 24px;\n    height: 2em;\n    border-radius: 5px;\n    background-color: #646970;\n    color: #fff;\n    font-size: 11px;\n    line-height: 1.90909090;\n    text-align: center\n  }\n\n  .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 {\n    content: \"\";\n    display: block;\n    margin-left: 8px;\n    width: 0;\n    height: 0;\n    border-top: 5px solid #646970;\n    border-right: 5px solid transparent\n  }\n\n  .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 {\n    background: #2271b1\n  }\n\n  .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 {\n    border-top-color: #2271b1\n  }\n\n  .column-comments .post-com-count-pending, .column-response .post-com-count-pending {\n    position: relative;\n    left: -3px;\n    padding: 0 5px;\n    min-width: 7px;\n    height: 17px;\n    border: 2px solid #fff;\n    border-radius: 11px;\n    background: #d63638;\n    color: #fff;\n    font-size: 9px;\n    line-height: 1.88888888;\n    text-align: center\n  }\n\n  .column-comments .post-com-count-no-pending, .column-response .post-com-count-no-pending {\n    display: none\n  }\n\n  .commentlist li {\n    padding: 1em 1em .2em;\n    margin: 0;\n    border-bottom: 1px solid #c3c4c7\n  }\n\n  .commentlist li li {\n    border-bottom: 0;\n    padding: 0\n  }\n\n  .commentlist p {\n    padding: 0;\n    margin: 0 0 .8em\n  }\n\n  #submitted-on, .submitted-on {\n    color: #50575e\n  }\n\n  #replyrow td {\n    padding: 2px\n  }\n\n  #replysubmit {\n    margin: 0;\n    padding: 5px 7px 10px;\n    overflow: hidden\n  }\n\n  #replysubmit .reply-submit-buttons {\n    margin-bottom: 0\n  }\n\n  #replysubmit .button {\n    margin-right: 5px\n  }\n\n  #replysubmit .spinner {\n    float: none;\n    margin: -4px 0 0\n  }\n\n  #replyrow.inline-edit-row fieldset.comment-reply {\n    font-size: inherit;\n    line-height: inherit\n  }\n\n  #replyrow legend {\n    margin: 0;\n    padding: .2em 5px 0;\n    font-size: 13px;\n    line-height: 1.4;\n    font-weight: 600\n  }\n\n  #replyrow.inline-edit-row label {\n    display: inline;\n    vertical-align: baseline;\n    line-height: inherit\n  }\n\n  #commentsdiv #edithead .inside, #edithead .inside {\n    float: left;\n    padding: 3px 0 2px 5px;\n    margin: 0;\n    text-align: center\n  }\n\n  #edithead .inside input {\n    width: 180px\n  }\n\n  #edithead label {\n    padding: 2px 0\n  }\n\n  #replycontainer {\n    padding: 5px\n  }\n\n  #replycontent {\n    height: 120px;\n    box-shadow: none\n  }\n\n  #replyerror {\n    border-color: #dcdcde;\n    background-color: #f6f7f7\n  }\n\n  .commentlist .avatar {\n    vertical-align: text-top\n  }\n\n  #the-comment-list div.undo, #the-comment-list tr.undo {\n    background-color: #f6f7f7\n  }\n\n  #the-comment-list .unapproved td, #the-comment-list .unapproved th {\n    background-color: #fcf9e8\n  }\n\n  #the-comment-list .unapproved th.check-column {\n    border-left: 4px solid #d63638\n  }\n\n  #the-comment-list .unapproved th.check-column input {\n    margin-left: 4px\n  }\n\n  #the-comment-list .approve a {\n    color: #007017\n  }\n\n  #the-comment-list .unapprove a {\n    color: #996800\n  }\n\n  #the-comment-list td, #the-comment-list th {\n    box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1)\n  }\n\n  #the-comment-list tr:last-child td, #the-comment-list tr:last-child th {\n    box-shadow: none\n  }\n\n  #the-comment-list tr.unapproved + tr.approved td, #the-comment-list tr.unapproved + tr.approved th {\n    border-top: 1px solid rgba(0, 0, 0, .03)\n  }\n\n  .vim-current, .vim-current td, .vim-current th {\n    background-color: #f0f6fc !important\n  }\n\n  th .comment-grey-bubble {\n    height: 16px;\n    width: 16px\n  }\n\n  th .comment-grey-bubble:before {\n    content: \"\\f101\";\n    font: normal 20px/.5 dashicons;\n    speak: never;\n    display: inline-block;\n    padding: 0;\n    top: 4px;\n    left: -4px;\n    position: relative;\n    vertical-align: top;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    text-decoration: none !important;\n    color: #3c434a\n  }\n\n  table.fixed {\n    table-layout: fixed\n  }\n\n  .fixed .column-rating, .fixed .column-visible {\n    width: 8%\n  }\n\n  .fixed .column-author, .fixed .column-format, .fixed .column-links, .fixed .column-parent, .fixed .column-posts {\n    width: 10%\n  }\n\n  .fixed .column-date {\n    width: 14%\n  }\n\n  .column-date span[title] {\n    -webkit-text-decoration: dotted underline;\n    text-decoration: dotted underline\n  }\n\n  .fixed .column-posts {\n    width: 74px\n  }\n\n  .fixed .column-posts, .fixed .column-role {\n    -webkit-hyphens: auto;\n    hyphens: auto\n  }\n\n  .fixed .column-comment .comment-author {\n    display: none\n  }\n\n  .fixed .column-categories, .fixed .column-rel, .fixed .column-response, .fixed .column-role, .fixed .column-tags {\n    width: 15%\n  }\n\n  .fixed .column-slug {\n    width: 25%\n  }\n\n  .fixed .column-locations {\n    width: 35%\n  }\n\n  .fixed .column-comments {\n    width: 5.5em;\n    padding: 8px 0;\n    text-align: left\n  }\n\n  .fixed .column-comments .vers {\n    padding-left: 3px\n  }\n\n  td.column-title strong, td.plugin-title strong {\n    display: block;\n    margin-bottom: .2em;\n    font-size: 14px\n  }\n\n  td.column-title p, td.plugin-title p {\n    margin: 6px 0\n  }\n\n  table.media .column-title .media-icon {\n    float: left;\n    min-height: 60px;\n    margin: 0 9px 0 0\n  }\n\n  table.media .column-title .media-icon img {\n    max-width: 60px;\n    height: auto;\n    vertical-align: top\n  }\n\n  table.media .column-title .has-media-icon ~ .row-actions {\n    margin-left: 70px\n  }\n\n  table.media .column-title .filename {\n    margin-bottom: .2em\n  }\n\n  .wp-list-table a {\n    transition: none\n  }\n\n  #the-list tr:last-child td, #the-list tr:last-child th {\n    border-bottom: none !important;\n    box-shadow: none\n  }\n\n  #comments-form .fixed .column-author {\n    width: 20%\n  }\n\n  #commentsdiv.postbox .inside {\n    margin: 0;\n    padding: 0\n  }\n\n  #commentsdiv .inside .row-actions {\n    line-height: 1.38461538\n  }\n\n  #commentsdiv .inside .column-author {\n    width: 25%\n  }\n\n  #commentsdiv .column-comment p {\n    margin: .6em 0;\n    padding: 0\n  }\n\n  #commentsdiv #replyrow td {\n    padding: 0\n  }\n\n  #commentsdiv p {\n    padding: 8px 10px;\n    margin: 0\n  }\n\n  #commentsdiv .comments-box {\n    border: 0 none\n  }\n\n  #commentsdiv .comments-box thead td, #commentsdiv .comments-box thead th {\n    background: 0 0;\n    padding: 0 7px 4px\n  }\n\n  #commentsdiv .comments-box tr:last-child td {\n    border-bottom: 0 none\n  }\n\n  #commentsdiv #edithead .inside input {\n    width: 160px\n  }\n\n  .sorting-indicator {\n    display: block;\n    visibility: hidden;\n    width: 10px;\n    height: 4px;\n    margin-top: 8px;\n    margin-left: 7px\n  }\n\n  .sorting-indicator:before {\n    content: \"\\f142\";\n    font: normal 20px/1 dashicons;\n    speak: never;\n    display: inline-block;\n    padding: 0;\n    top: -4px;\n    left: -8px;\n    color: #3c434a;\n    line-height: .5;\n    position: relative;\n    vertical-align: top;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    text-decoration: none !important;\n    color: #3c434a\n  }\n\n  .column-comments .sorting-indicator:before {\n    top: 0;\n    left: -10px\n  }\n\n  th.desc a:focus span.sorting-indicator:before, th.desc:hover span.sorting-indicator:before, th.sorted.asc .sorting-indicator:before {\n    content: \"\\f142\"\n  }\n\n  th.asc a:focus span.sorting-indicator:before, th.asc:hover span.sorting-indicator:before, th.sorted.desc .sorting-indicator:before {\n    content: \"\\f140\"\n  }\n\n  .wp-list-table .toggle-row {\n    position: absolute;\n    right: 8px;\n    top: 10px;\n    display: none;\n    padding: 0;\n    width: 40px;\n    height: 40px;\n    border: none;\n    outline: 0;\n    background: 0 0\n  }\n\n  .wp-list-table .toggle-row:hover {\n    cursor: pointer\n  }\n\n  .wp-list-table .toggle-row:focus:before {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8)\n  }\n\n  .wp-list-table .toggle-row:active {\n    box-shadow: none\n  }\n\n  .wp-list-table .toggle-row:before {\n    position: absolute;\n    top: -5px;\n    left: 10px;\n    border-radius: 50%;\n    display: block;\n    padding: 1px 2px 1px 0;\n    color: #3c434a;\n    content: \"\\f140\";\n    font: normal 20px/1 dashicons;\n    line-height: 1;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    speak: never\n  }\n\n  .wp-list-table .is-expanded .toggle-row:before {\n    content: \"\\f142\"\n  }\n\n  .locked-indicator {\n    display: none;\n    margin-left: 6px;\n    height: 20px;\n    width: 16px\n  }\n\n  .locked-indicator-icon:before {\n    color: #8c8f94;\n    content: \"\\f160\";\n    display: inline-block;\n    font: normal 20px/1 dashicons;\n    speak: never;\n    vertical-align: middle;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .locked-info {\n    display: none;\n    margin-top: 4px\n  }\n\n  .locked-text {\n    vertical-align: top\n  }\n\n  .wp-locked .locked-indicator, .wp-locked .locked-info {\n    display: block\n  }\n\n  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 {\n    display: none\n  }\n\n  .fixed .column-comments .sorting-indicator {\n    margin-top: 3px\n  }\n\n  #menu-locations-wrap .widefat {\n    width: 60%\n  }\n\n  .widefat th.sortable, .widefat th.sorted {\n    padding: 0\n  }\n\n  th.sortable a, th.sorted a {\n    display: block;\n    overflow: hidden;\n    padding: 8px\n  }\n\n  .fixed .column-comments.sortable a, .fixed .column-comments.sorted a {\n    padding: 8px 0\n  }\n\n  th.sortable a span, th.sorted a span {\n    float: left;\n    cursor: pointer\n  }\n\n  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 {\n    visibility: visible\n  }\n\n  .tablenav-pages .current-page {\n    margin: 0 2px 0 0;\n    font-size: 13px;\n    text-align: center\n  }\n\n  .tablenav .total-pages {\n    margin-right: 2px\n  }\n\n  .tablenav #table-paging {\n    margin-left: 2px\n  }\n\n  .tablenav {\n    clear: both;\n    height: 30px;\n    margin: 6px 0 4px;\n    padding-top: 5px;\n    vertical-align: middle\n  }\n\n  .tablenav.themes {\n    max-width: 98%\n  }\n\n  .tablenav .tablenav-pages {\n    float: right;\n    margin: 0 0 9px\n  }\n\n  .tablenav .no-pages, .tablenav .one-page .pagination-links {\n    display: none\n  }\n\n  .tablenav .tablenav-pages .button, .tablenav .tablenav-pages .tablenav-pages-navspan {\n    display: inline-block;\n    vertical-align: baseline;\n    min-width: 30px;\n    min-height: 30px;\n    margin: 0;\n    padding: 0 4px;\n    font-size: 16px;\n    line-height: 1.625;\n    text-align: center\n  }\n\n  .tablenav .displaying-num {\n    margin-right: 7px\n  }\n\n  .tablenav .one-page .displaying-num {\n    display: inline-block;\n    margin: 5px 0\n  }\n\n  .tablenav .actions {\n    padding: 0 8px 0 0\n  }\n\n  .wp-filter .actions {\n    display: inline-block;\n    vertical-align: middle\n  }\n\n  .tablenav .delete {\n    margin-right: 20px\n  }\n\n  .tablenav .view-switch {\n    float: right;\n    margin: 0 5px;\n    padding-top: 3px\n  }\n\n  .wp-filter .view-switch {\n    display: inline-block;\n    vertical-align: middle;\n    padding: 12px 0;\n    margin: 0 8px 0 2px\n  }\n\n  .media-toolbar.wp-filter .view-switch {\n    margin: 0 12px 0 2px\n  }\n\n  .view-switch a {\n    float: left;\n    width: 28px;\n    height: 28px;\n    text-align: center;\n    line-height: 1.84615384;\n    text-decoration: none\n  }\n\n  .view-switch a:before {\n    color: #c3c4c7;\n    display: inline-block;\n    font: normal 20px/1 dashicons;\n    speak: never;\n    vertical-align: middle;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .view-switch a:focus:before, .view-switch a:hover:before {\n    color: #787c82\n  }\n\n  .view-switch a.current:before {\n    color: #2271b1\n  }\n\n  .view-switch .view-list:before {\n    content: \"\\f163\"\n  }\n\n  .view-switch .view-excerpt:before {\n    content: \"\\f164\"\n  }\n\n  .view-switch .view-grid:before {\n    content: \"\\f509\"\n  }\n\n  .filter {\n    float: left;\n    margin: -5px 0 0 10px\n  }\n\n  .filter .subsubsub {\n    margin-left: -10px;\n    margin-top: 13px\n  }\n\n  .screen-per-page {\n    width: 4em\n  }\n\n  #posts-filter .wp-filter {\n    margin-bottom: 0\n  }\n\n  #posts-filter fieldset {\n    float: left;\n    margin: 0 1.5ex 1em 0;\n    padding: 0\n  }\n\n  #posts-filter fieldset legend {\n    padding: 0 0 .2em 1px\n  }\n\n  p.pagenav {\n    margin: 0;\n    display: inline\n  }\n\n  .pagenav span {\n    font-weight: 600;\n    margin: 0 6px\n  }\n\n  .row-title {\n    font-size: 14px !important;\n    font-weight: 600\n  }\n\n  .column-comment .comment-author {\n    margin-bottom: .6em\n  }\n\n  .column-author img, .column-comment .comment-author img, .column-username img {\n    float: left;\n    margin-right: 10px;\n    margin-top: 1px\n  }\n\n  .row-actions {\n    color: #a7aaad;\n    font-size: 13px;\n    padding: 2px 0 0;\n    position: relative;\n    left: -9999em\n  }\n\n  .rtl .row-actions a {\n    display: inline-block\n  }\n\n  .row-actions .network_active, .row-actions .network_only {\n    color: #000\n  }\n\n  .comment-item:hover .row-actions, .mobile .row-actions, .no-js .row-actions, .row-actions.visible, tr:hover .row-actions {\n    position: static\n  }\n\n  .row-actions-visible {\n    padding: 2px 0 0\n  }\n\n  #wpbody-content .inline-edit-row fieldset {\n    font-size: 12px;\n    float: left;\n    margin: 0;\n    padding: 0;\n    width: 100%\n  }\n\n  #wpbody-content .inline-edit-row fieldset .inline-edit-col, tr.inline-edit-row td {\n    padding: 0 .5em\n  }\n\n  #wpbody-content .quick-edit-row-post .inline-edit-col-left {\n    width: 40%\n  }\n\n  #wpbody-content .quick-edit-row-post .inline-edit-col-right {\n    width: 39%\n  }\n\n  #wpbody-content .inline-edit-row-post .inline-edit-col-center {\n    width: 20%\n  }\n\n  #wpbody-content .quick-edit-row-page .inline-edit-col-left {\n    width: 50%\n  }\n\n  #wpbody-content .bulk-edit-row-post .inline-edit-col-right, #wpbody-content .quick-edit-row-page .inline-edit-col-right {\n    width: 49%\n  }\n\n  #wpbody-content .bulk-edit-row .inline-edit-col-left {\n    width: 30%\n  }\n\n  #wpbody-content .bulk-edit-row-page .inline-edit-col-right {\n    width: 69%\n  }\n\n  #wpbody-content .bulk-edit-row .inline-edit-col-bottom {\n    float: right;\n    width: 69%\n  }\n\n  #wpbody-content .inline-edit-row-page .inline-edit-col-right {\n    margin-top: 27px\n  }\n\n  .inline-edit-row fieldset .inline-edit-group {\n    clear: both;\n    line-height: 2.5\n  }\n\n  .inline-edit-row .submit {\n    clear: both;\n    padding: .5em;\n    margin: .5em 0 0\n  }\n\n  .inline-edit-row .notice-error {\n    margin-top: 1em\n  }\n\n  .inline-edit-row .notice-error .error {\n    margin: .5em 0;\n    padding: 2px\n  }\n\n  #the-list .inline-edit-row .inline-edit-legend {\n    margin: 0;\n    padding: .2em .5em 0;\n    line-height: 2.5;\n    font-weight: 600\n  }\n\n  #the-list #bulk-edit.inline-edit-row .inline-edit-legend {\n    padding: .2em .5em\n  }\n\n  .inline-edit-row fieldset span.checkbox-title, .inline-edit-row fieldset span.title {\n    margin: 0;\n    padding: 0\n  }\n\n  .inline-edit-row fieldset label, .inline-edit-row fieldset span.inline-edit-categories-label {\n    display: block;\n    margin: .2em 0;\n    line-height: 2.5\n  }\n\n  .inline-edit-row fieldset.inline-edit-date label {\n    display: inline-block;\n    margin: 0;\n    vertical-align: baseline;\n    line-height: 2\n  }\n\n  .inline-edit-row fieldset label.inline-edit-tags {\n    margin-top: 0\n  }\n\n  .inline-edit-row fieldset label.inline-edit-tags span.title {\n    margin: .2em 0;\n    width: auto\n  }\n\n  .inline-edit-row fieldset label span.title, .inline-edit-row fieldset.inline-edit-date legend {\n    display: block;\n    float: left;\n    width: 6em;\n    line-height: 2.5\n  }\n\n  #posts-filter fieldset.inline-edit-date legend {\n    padding: 0\n  }\n\n  .inline-edit-row fieldset .timestamp-wrap, .inline-edit-row fieldset label span.input-text-wrap {\n    display: block;\n    margin-left: 6em\n  }\n\n  .quick-edit-row-post fieldset.inline-edit-col-right label span.title {\n    width: auto;\n    padding-right: .5em\n  }\n\n  .inline-edit-row .inline-edit-or {\n    margin: .2em 6px .2em 0;\n    line-height: 2.5\n  }\n\n  .inline-edit-row .input-text-wrap input[type=text] {\n    width: 100%\n  }\n\n  .inline-edit-row fieldset label input[type=checkbox] {\n    vertical-align: middle\n  }\n\n  .inline-edit-row fieldset label textarea {\n    width: 100%;\n    height: 4em;\n    vertical-align: top\n  }\n\n  #wpbody-content .bulk-edit-row fieldset .inline-edit-group label {\n    max-width: 50%\n  }\n\n  #wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child {\n    margin-right: .5em\n  }\n\n  .inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input {\n    width: 6em\n  }\n\n  .inline-edit-row .inline-edit-legend {\n    text-transform: uppercase\n  }\n\n  .inline-edit-row fieldset .inline-edit-date {\n    float: left\n  }\n\n  .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] {\n    vertical-align: middle;\n    text-align: center;\n    padding: 0 4px\n  }\n\n  .inline-edit-row fieldset label input.inline-edit-password-input {\n    width: 8em\n  }\n\n  ul.cat-checklist {\n    height: 12em;\n    border: solid 1px #dcdcde;\n    overflow-y: scroll;\n    padding: 0 5px;\n    margin: 0;\n    background-color: #fff\n  }\n\n  #bulk-titles {\n    display: block;\n    height: 12em;\n    border: 1px solid #dcdcde;\n    overflow-y: scroll;\n    padding: 0 5px;\n    margin: 0 0 5px\n  }\n\n  .inline-edit-row fieldset ul.cat-checklist input, .inline-edit-row fieldset ul.cat-checklist li {\n    margin: 0;\n    position: relative\n  }\n\n  .inline-edit-row #bulk-titles div, .inline-edit-row fieldset ul.cat-checklist label {\n    font-style: normal;\n    font-size: 11px\n  }\n\n  .inline-edit-row fieldset label input.inline-edit-menu-order-input {\n    width: 3em\n  }\n\n  .inline-edit-row fieldset label input.inline-edit-slug-input {\n    width: 75%\n  }\n\n  .inline-edit-row #post_parent, .inline-edit-row select[name=page_template] {\n    max-width: 80%\n  }\n\n  .quick-edit-row-post fieldset label.inline-edit-status {\n    float: left\n  }\n\n  #bulk-titles {\n    line-height: 140%\n  }\n\n  #bulk-titles div {\n    margin: .2em .3em\n  }\n\n  #bulk-titles div a {\n    cursor: pointer;\n    display: block;\n    float: left;\n    height: 18px;\n    margin: 0 3px 0 -2px;\n    overflow: hidden;\n    position: relative;\n    width: 20px\n  }\n\n  #bulk-titles div a:before {\n    position: relative;\n    top: -3px\n  }\n\n  .plugins tbody, .plugins tbody th.check-column {\n    padding: 8px 0 0 2px\n  }\n\n  .plugins tbody th.check-column input[type=checkbox] {\n    margin-top: 4px\n  }\n\n  .updates-table .plugin-title p {\n    margin-top: 0\n  }\n\n  .plugins .inactive th.check-column, .plugins tfoot td.check-column, .plugins thead td.check-column {\n    padding-left: 6px\n  }\n\n  .plugins, .plugins td, .plugins th {\n    color: #000\n  }\n\n  .plugins tr {\n    background: #fff\n  }\n\n  .plugins p {\n    margin: 0 4px;\n    padding: 0\n  }\n\n  .plugins .desc p {\n    margin: 0 0 8px\n  }\n\n  .plugins td.desc {\n    line-height: 1.5\n  }\n\n  .plugins .desc ol, .plugins .desc ul {\n    margin: 0 0 0 2em\n  }\n\n  .plugins .desc ul {\n    list-style-type: disc\n  }\n\n  .plugins .row-actions {\n    font-size: 13px;\n    padding: 0\n  }\n\n  .plugins .active td, .plugins .active th, .plugins .inactive td, .plugins .inactive th {\n    padding: 10px 9px\n  }\n\n  .plugins .active td, .plugins .active th {\n    background-color: #f0f6fc\n  }\n\n  .plugins .update td, .plugins .update th {\n    border-bottom: 0\n  }\n\n  .plugin-install #the-list td, .plugins .active td, .plugins .active th, .plugins .inactive td, .plugins .inactive th, .upgrade .plugins td, .upgrade .plugins th {\n    box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1)\n  }\n\n  .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 {\n    border-top: 1px solid rgba(0, 0, 0, .03);\n    box-shadow: inset 0 1px 0 rgba(0, 0, 0, .02), inset 0 -1px 0 #dcdcde\n  }\n\n  .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 {\n    box-shadow: none\n  }\n\n  .plugin-update-tr.active td, .plugins .active th.check-column {\n    border-left: 4px solid #72aee6\n  }\n\n  .wp-list-table.plugins .plugin-title, .wp-list-table.plugins .theme-title {\n    padding-right: 12px;\n    white-space: nowrap\n  }\n\n  .plugins .plugin-title .dashicons, .plugins .plugin-title img {\n    float: left;\n    padding: 0 10px 0 0;\n    width: 64px;\n    height: 64px\n  }\n\n  .plugins .plugin-title .dashicons:before {\n    padding: 2px;\n    background-color: #f0f0f1;\n    box-shadow: inset 0 0 10px rgba(167, 170, 173, .15);\n    font-size: 60px;\n    color: #c3c4c7\n  }\n\n  #update-themes-table .plugin-title .dashicons, #update-themes-table .plugin-title img {\n    width: 85px\n  }\n\n  .plugins .column-auto-updates {\n    width: 14.2em\n  }\n\n  .plugins .inactive .plugin-title strong {\n    font-weight: 400\n  }\n\n  .plugins .row-actions, .plugins .second {\n    padding: 0 0 5px\n  }\n\n  .plugins .row-actions {\n    white-space: normal;\n    min-width: 12em\n  }\n\n  .plugins .update .row-actions, .plugins .update .second, .plugins .updated .row-actions, .plugins .updated .second {\n    padding-bottom: 0\n  }\n\n  .plugins-php .widefat tfoot td, .plugins-php .widefat tfoot th {\n    border-top-style: solid;\n    border-top-width: 1px\n  }\n\n  .plugins .plugin-update-tr .plugin-update {\n    box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1);\n    overflow: hidden;\n    padding: 0\n  }\n\n  .plugins .plugin-update-tr .notice, .plugins .plugin-update-tr div[class=update-message] {\n    margin: 5px 20px 15px 40px\n  }\n\n  .plugins .notice p {\n    margin: .5em 0\n  }\n\n  .plugins .plugin-description a, .plugins .plugin-update a, .updates-table .plugin-title a {\n    text-decoration: underline\n  }\n\n  .plugins tr.paused th.check-column {\n    border-left: 4px solid #d63638\n  }\n\n  .plugins tr.paused td, .plugins tr.paused th {\n    background-color: #f6f7f7\n  }\n\n  .plugins .paused .dashicons-warning, .plugins tr.paused .plugin-title {\n    color: #d63638\n  }\n\n  .plugins .paused .error-display code, .plugins .paused .error-display p {\n    font-size: 90%;\n    color: rgba(0, 0, 0, .7)\n  }\n\n  .plugins .resume-link {\n    color: #d63638\n  }\n\n  .plugin-card .update-now:before {\n    color: #d63638;\n    content: \"\\f463\";\n    display: inline-block;\n    font: normal 20px/1 dashicons;\n    margin: 3px 5px 0 -2px;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    vertical-align: top\n  }\n\n  .plugin-card .updating-message:before {\n    content: \"\\f463\";\n    animation: rotation 2s infinite linear\n  }\n\n  @keyframes rotation {\n    0% {\n      transform: rotate(0)\n    }\n    100% {\n      transform: rotate(359deg)\n    }\n  }\n\n  .plugin-card .updated-message:before {\n    color: #68de7c;\n    content: \"\\f147\"\n  }\n\n  .plugin-install-php h2 {\n    clear: both\n  }\n\n  .plugin-install-php h3 {\n    margin: 2.5em 0 8px\n  }\n\n  .plugin-install-php .wp-filter {\n    margin-bottom: 0\n  }\n\n  .plugin-group {\n    overflow: hidden;\n    margin-top: 1.5em\n  }\n\n  .plugin-group h3 {\n    margin-top: 0\n  }\n\n  .plugin-card {\n    float: left;\n    margin: 0 8px 16px;\n    width: 48.5%;\n    width: calc(50% - 8px);\n    background-color: #fff;\n    border: 1px solid #dcdcde;\n    box-sizing: border-box\n  }\n\n  .plugin-card:nth-child(odd) {\n    clear: both;\n    margin-left: 0\n  }\n\n  .plugin-card:nth-child(even) {\n    margin-right: 0\n  }\n\n  @media screen and (min-width: 1600px) and (max-width: 2299px) {\n    .plugin-card {\n      width: 30%;\n      width: calc(33.1% - 8px)\n    }\n    .plugin-card:nth-child(odd) {\n      clear: none;\n      margin-left: 8px\n    }\n    .plugin-card:nth-child(even) {\n      margin-right: 8px\n    }\n    .plugin-card:nth-child(3n+1) {\n      clear: both;\n      margin-left: 0\n    }\n    .plugin-card:nth-child(3n) {\n      margin-right: 0\n    }\n  }\n  @media screen and (min-width: 2300px) {\n    .plugin-card {\n      width: 25%;\n      width: calc(25% - 12px)\n    }\n    .plugin-card:nth-child(odd) {\n      clear: none;\n      margin-left: 8px\n    }\n    .plugin-card:nth-child(even) {\n      margin-right: 8px\n    }\n    .plugin-card:nth-child(4n+1) {\n      clear: both;\n      margin-left: 0\n    }\n    .plugin-card:nth-child(4n) {\n      margin-right: 0\n    }\n  }\n\n  .plugin-card-top {\n    position: relative;\n    padding: 20px 20px 10px;\n    min-height: 135px\n  }\n\n  .plugin-action-buttons, div.action-links {\n    margin: 0\n  }\n\n  .plugin-card h3 {\n    margin: 0 12px 12px 0;\n    font-size: 18px;\n    line-height: 1.3\n  }\n\n  .plugin-card .desc, .plugin-card .name {\n    margin-left: 148px;\n    margin-right: 128px\n  }\n\n  .plugin-card .action-links {\n    position: absolute;\n    top: 20px;\n    right: 20px;\n    width: 120px\n  }\n\n  .plugin-action-buttons {\n    clear: right;\n    float: right;\n    margin-bottom: 1em;\n    text-align: right\n  }\n\n  .plugin-action-buttons li {\n    margin-bottom: 10px\n  }\n\n  .plugin-card-bottom {\n    clear: both;\n    padding: 12px 20px;\n    background-color: #f6f7f7;\n    border-top: 1px solid #dcdcde;\n    overflow: hidden\n  }\n\n  .plugin-card-bottom .star-rating {\n    display: inline\n  }\n\n  .plugin-card-update-failed .update-now {\n    font-weight: 600\n  }\n\n  .plugin-card-update-failed .notice-error {\n    margin: 0;\n    padding-left: 16px;\n    box-shadow: 0 -1px 0 #dcdcde\n  }\n\n  .plugin-card-update-failed .plugin-card-bottom {\n    display: none\n  }\n\n  .plugin-card .column-rating {\n    line-height: 1.76923076\n  }\n\n  .plugin-card .column-rating, .plugin-card .column-updated {\n    margin-bottom: 4px\n  }\n\n  .plugin-card .column-downloaded, .plugin-card .column-rating {\n    float: left;\n    clear: left;\n    max-width: 180px\n  }\n\n  .plugin-card .column-compatibility, .plugin-card .column-updated {\n    text-align: right;\n    float: right;\n    clear: right;\n    width: 65%;\n    width: calc(100% - 180px)\n  }\n\n  .plugin-card .column-compatibility span:before {\n    font: normal 20px/.5 dashicons;\n    speak: never;\n    display: inline-block;\n    padding: 0;\n    top: 4px;\n    left: -2px;\n    position: relative;\n    vertical-align: top;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    text-decoration: none !important;\n    color: #3c434a\n  }\n\n  .plugin-card .column-compatibility .compatibility-incompatible:before {\n    content: \"\\f158\";\n    color: #d63638\n  }\n\n  .plugin-card .column-compatibility .compatibility-compatible:before {\n    content: \"\\f147\";\n    color: #007017\n  }\n\n  .plugin-card .notice {\n    margin: 20px 20px 0\n  }\n\n  .plugin-icon {\n    position: absolute;\n    top: 20px;\n    left: 20px;\n    width: 128px;\n    height: 128px;\n    margin: 0 20px 20px 0\n  }\n\n  .no-plugin-results {\n    color: #646970;\n    font-size: 18px;\n    font-style: normal;\n    margin: 0;\n    padding: 100px 0 0;\n    text-align: center\n  }\n\n  .wp-list-table .site-archived, .wp-list-table .site-deleted, .wp-list-table tr.site-archived, .wp-list-table tr.site-deleted {\n    background: #fcf0f1\n  }\n\n  .wp-list-table .site-mature, .wp-list-table .site-spammed, .wp-list-table tr.site-mature, .wp-list-table tr.site-spammed {\n    background: #fcf9e8\n  }\n\n  .sites.fixed .column-lastupdated, .sites.fixed .column-registered {\n    width: 20%\n  }\n\n  .sites.fixed .column-users {\n    width: 80px\n  }\n\n  @media screen and (max-width: 1100px) and (min-width: 782px), (max-width: 480px) {\n    .plugin-card .action-links {\n      position: static;\n      margin-left: 148px;\n      width: auto\n    }\n    .plugin-action-buttons {\n      float: none;\n      margin: 1em 0 0;\n      text-align: left\n    }\n    .plugin-action-buttons li {\n      display: inline-block;\n      vertical-align: middle\n    }\n    .plugin-action-buttons li .button {\n      margin-right: 20px\n    }\n    .plugin-card h3 {\n      margin-right: 24px\n    }\n    .plugin-card .desc, .plugin-card .name {\n      margin-right: 0\n    }\n    .plugin-card .desc p:first-of-type {\n      margin-top: 0\n    }\n  }\n  @media screen and (max-width: 782px) {\n    .tablenav {\n      height: auto\n    }\n    .tablenav.top {\n      margin: 20px 0 5px\n    }\n    .tablenav.bottom {\n      position: relative;\n      margin-top: 15px\n    }\n    .tablenav br {\n      display: none\n    }\n    .tablenav br.clear {\n      display: block\n    }\n    .tablenav .view-switch, .tablenav.top .actions {\n      display: none\n    }\n    .view-switch a {\n      width: 36px;\n      height: 36px;\n      line-height: 2.53846153\n    }\n    .tablenav.top .displaying-num {\n      display: none\n    }\n    .tablenav.bottom .displaying-num {\n      position: absolute;\n      right: 0;\n      top: 11px;\n      margin: 0;\n      font-size: 14px\n    }\n    .tablenav .tablenav-pages {\n      width: 100%;\n      text-align: center;\n      margin: 0 0 25px\n    }\n    .tablenav.bottom .tablenav-pages {\n      margin-top: 25px\n    }\n    .tablenav.top .tablenav-pages.one-page {\n      display: none\n    }\n    .tablenav.bottom .tablenav-pages.one-page {\n      margin-top: 15px;\n      height: 0\n    }\n    .tablenav-pages .pagination-links {\n      font-size: 16px\n    }\n    .tablenav .tablenav-pages .button, .tablenav .tablenav-pages .tablenav-pages-navspan {\n      min-width: 44px;\n      padding: 12px 8px;\n      font-size: 18px;\n      line-height: 1\n    }\n    .tablenav-pages .pagination-links .current-page {\n      min-width: 44px;\n      padding: 12px 6px;\n      font-size: 16px;\n      line-height: 1.125\n    }\n    .form-wrap > p {\n      display: none\n    }\n    .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) {\n      display: none\n    }\n    .wp-list-table thead th.column-primary {\n      width: 100%\n    }\n    .wp-list-table tr th.check-column {\n      display: table-cell\n    }\n    .wp-list-table .check-column {\n      width: 2.5em\n    }\n    .wp-list-table .column-primary .toggle-row {\n      display: block\n    }\n    .wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column) {\n      position: relative;\n      clear: both;\n      width: auto !important\n    }\n    .wp-list-table td.column-primary {\n      padding-right: 50px\n    }\n    .wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) {\n      padding: 3px 8px 3px 35%\n    }\n    .wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before {\n      position: absolute;\n      left: 10px;\n      display: block;\n      overflow: hidden;\n      width: 32%;\n      content: attr(data-colname);\n      white-space: nowrap;\n      text-overflow: ellipsis\n    }\n    .wp-list-table .is-expanded td:not(.hidden) {\n      display: block !important;\n      overflow: hidden\n    }\n    .column-posts, .widefat .num {\n      text-align: left\n    }\n    #comments-form .fixed .column-author, #commentsdiv .fixed .column-author {\n      display: none !important\n    }\n    .fixed .column-comment .comment-author {\n      display: block\n    }\n    .fixed .column-author.hidden ~ .column-comment .comment-author {\n      display: none\n    }\n    #the-comment-list .is-expanded td {\n      box-shadow: none\n    }\n    #the-comment-list .is-expanded td:last-child {\n      box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1)\n    }\n    .post-com-count .screen-reader-text {\n      position: static;\n      -webkit-clip-path: none;\n      clip-path: none;\n      width: auto;\n      height: auto;\n      margin: 0\n    }\n    .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 {\n      content: none\n    }\n    .column-comments .post-com-count [aria-hidden=true], .column-response .post-com-count [aria-hidden=true] {\n      display: none\n    }\n    .column-comments .post-com-count-wrapper, .column-response .post-com-count-wrapper {\n      white-space: normal\n    }\n    .column-comments .post-com-count-wrapper > a, .column-response .post-com-count-wrapper > a {\n      display: block\n    }\n    .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 {\n      margin-top: 0;\n      margin-right: .5em\n    }\n    .column-comments .post-com-count-pending, .column-response .post-com-count-pending {\n      position: static;\n      height: auto;\n      min-width: 0;\n      padding: 0;\n      border: none;\n      border-radius: 0;\n      background: 0 0;\n      color: #b32d2e;\n      font-size: inherit;\n      line-height: inherit;\n      text-align: left\n    }\n    .column-comments .post-com-count-pending:hover, .column-response .post-com-count-pending:hover {\n      color: #d63638\n    }\n    .widefat tfoot td.check-column, .widefat thead td.check-column {\n      padding-top: 10px\n    }\n    .row-actions {\n      margin-left: -8px;\n      margin-right: -8px;\n      padding-top: 4px\n    }\n    body:not(.plugins-php) .row-actions {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 8px;\n      color: transparent\n    }\n    .row-actions span .button-link, .row-actions span a {\n      display: inline-block;\n      padding: 4px 8px;\n      line-height: 1.5\n    }\n    .row-actions span.approve:before, .row-actions span.unapprove:before {\n      content: \"| \"\n    }\n    #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 {\n      float: none;\n      width: 100%\n    }\n    #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 {\n      max-width: none;\n      float: none;\n      margin-bottom: 5px\n    }\n    #wpbody .bulk-edit-row fieldset select {\n      display: block;\n      width: 100%;\n      max-width: none;\n      box-sizing: border-box\n    }\n    .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] {\n      font-size: 16px;\n      line-height: 2;\n      padding: 3px 4px\n    }\n    .inline-edit-row #bulk-titles div, .inline-edit-row fieldset ul.cat-checklist label {\n      font-size: 16px\n    }\n    .inline-edit-row fieldset label span.title, .inline-edit-row fieldset.inline-edit-date legend {\n      float: none\n    }\n    .inline-edit-row fieldset label.inline-edit-tags {\n      padding: 0 .5em\n    }\n    .inline-edit-row fieldset .inline-edit-col label.inline-edit-tags {\n      padding: 0\n    }\n    .inline-edit-row fieldset .timestamp-wrap, .inline-edit-row fieldset label span.input-text-wrap {\n      margin-left: 0\n    }\n    .inline-edit-row .inline-edit-or {\n      margin: 0 6px 0 0\n    }\n    #commentsdiv #edithead .inside, #edithead .inside {\n      float: none;\n      text-align: left;\n      padding: 3px 5px\n    }\n    #commentsdiv #edithead .inside input, #edithead .inside input {\n      width: 100%\n    }\n    #edithead label {\n      display: block\n    }\n    #bulk-titles div {\n      margin: .8em .3em\n    }\n    #bulk-titles div a {\n      height: 22px\n    }\n    #wpbody-content .updates-table .plugin-title {\n      width: auto;\n      white-space: normal\n    }\n    .link-manager-php #posts-filter {\n      margin-top: 25px\n    }\n    .link-manager-php .tablenav.bottom {\n      overflow: hidden\n    }\n    .comments-box .toggle-row, .wp-list-table.plugins .toggle-row {\n      display: none\n    }\n    #wpbody-content .wp-list-table.plugins td {\n      display: block;\n      width: auto;\n      padding: 10px 9px\n    }\n    #wpbody-content .wp-list-table.plugins .desc.hidden {\n      display: none\n    }\n    #wpbody-content .wp-list-table.plugins .column-description {\n      padding-top: 2px\n    }\n    #wpbody-content .wp-list-table.plugins .plugin-title, #wpbody-content .wp-list-table.plugins .theme-title {\n      padding-right: 12px;\n      white-space: normal\n    }\n    .wp-list-table.plugins .plugin-title, .wp-list-table.plugins .theme-title {\n      padding-top: 13px;\n      padding-bottom: 4px\n    }\n    .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 {\n      box-shadow: none;\n      border-top: none\n    }\n    .plugins #the-list tr td {\n      border-top: none\n    }\n    .plugins tbody {\n      padding: 1px 0 0\n    }\n    .plugins .plugin-update-tr:before, .plugins tr.active + tr.inactive td.column-description, .plugins tr.active + tr.inactive th.check-column {\n      box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1)\n    }\n    .plugins tr.active + tr.inactive td, .plugins tr.active + tr.inactive th.check-column {\n      border-top: none\n    }\n    .plugins .plugin-update-tr:before {\n      content: \"\";\n      display: table-cell\n    }\n    .plugins #the-list .plugin-update-tr .plugin-update {\n      border-left: none\n    }\n    .plugin-update-tr .update-message {\n      margin-left: 0\n    }\n    .plugins .active.update + .plugin-update-tr:before, .plugins .active.updated + .plugin-update-tr:before {\n      background-color: #f0f6fc;\n      border-left: 4px solid #72aee6\n    }\n    .plugins .plugin-update-tr .update-message {\n      margin-left: 0\n    }\n    .wp-list-table.plugins .plugin-title strong, .wp-list-table.plugins .theme-title strong {\n      font-size: 1.4em;\n      line-height: 1.5\n    }\n    .plugins tbody th.check-column {\n      padding: 8px 0 0 5px\n    }\n    .plugins .inactive th.check-column, .plugins tfoot td.check-column, .plugins thead td.check-column {\n      padding-left: 9px\n    }\n    table.plugin-install .column-description, table.plugin-install .column-name, table.plugin-install .column-rating, table.plugin-install .column-version {\n      display: block;\n      width: auto\n    }\n    table.plugin-install th.column-description, table.plugin-install th.column-name, table.plugin-install th.column-rating, table.plugin-install th.column-version {\n      display: none\n    }\n    table.plugin-install td.column-name strong {\n      font-size: 1.4em;\n      line-height: 1.6em\n    }\n    table.plugin-install #the-list td {\n      box-shadow: none\n    }\n    table.plugin-install #the-list tr {\n      display: block;\n      box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1)\n    }\n    .plugin-card {\n      margin-left: 0;\n      margin-right: 0;\n      width: 100%\n    }\n    table.media .column-title .has-media-icon ~ .row-actions {\n      margin-left: 0;\n      clear: both\n    }\n  }\n  @media screen and (max-width: 480px) {\n    .tablenav-pages .current-page {\n      margin: 0\n    }\n    .tablenav.bottom .displaying-num {\n      position: relative;\n      top: 0;\n      display: block;\n      text-align: right;\n      padding-bottom: .5em\n    }\n    .tablenav.bottom .tablenav-pages.one-page {\n      height: auto\n    }\n    .tablenav-pages .tablenav-paging-text {\n      float: left;\n      width: 100%;\n      padding-top: .5em\n    }\n  }\n  /*! This file is auto-generated */\n  #poststuff {\n    padding-top: 10px;\n    min-width: 763px\n  }\n\n  #poststuff #post-body {\n    padding: 0\n  }\n\n  #poststuff .postbox-container {\n    width: 100%\n  }\n\n  #poststuff #post-body.columns-2 {\n    margin-right: 300px\n  }\n\n  #show-comments {\n    overflow: hidden\n  }\n\n  #save-action .spinner, #show-comments a {\n    float: left\n  }\n\n  #show-comments .spinner {\n    float: none;\n    margin-top: 0\n  }\n\n  #lost-connection-notice .spinner {\n    visibility: visible;\n    float: left;\n    margin: 0 5px 0 0\n  }\n\n  #titlediv {\n    position: relative\n  }\n\n  #titlediv label {\n    cursor: text\n  }\n\n  #titlediv div.inside {\n    margin: 0\n  }\n\n  #poststuff #titlewrap {\n    border: 0;\n    padding: 0\n  }\n\n  #titlediv #title {\n    padding: 3px 8px;\n    font-size: 1.7em;\n    line-height: 100%;\n    height: 1.7em;\n    width: 100%;\n    outline: 0;\n    margin: 0 0 3px;\n    background-color: #fff\n  }\n\n  #titlediv #title-prompt-text {\n    color: #646970;\n    position: absolute;\n    font-size: 1.7em;\n    padding: 10px;\n    pointer-events: none\n  }\n\n  input#link_description, input#link_url {\n    width: 100%\n  }\n\n  #pending {\n    background: 0 none;\n    border: 0 none;\n    padding: 0;\n    font-size: 11px;\n    margin-top: -1px\n  }\n\n  #comment-link-box, #edit-slug-box {\n    line-height: 1.84615384;\n    min-height: 25px;\n    margin-top: 5px;\n    padding: 0 10px;\n    color: #646970\n  }\n\n  #edit-slug-box .cancel {\n    margin-right: 10px;\n    padding: 0;\n    font-size: 11px\n  }\n\n  #comment-link-box {\n    margin: 5px 0;\n    padding: 0 5px\n  }\n\n  #editable-post-name-full {\n    display: none\n  }\n\n  #editable-post-name {\n    font-weight: 600\n  }\n\n  #editable-post-name input {\n    font-size: 13px;\n    font-weight: 400;\n    height: 24px;\n    margin: 0;\n    width: 16em\n  }\n\n  .postarea h3 label {\n    float: left\n  }\n\n  body.post-new-php .submitbox .submitdelete {\n    display: none\n  }\n\n  .submitbox .submit a:hover {\n    text-decoration: underline\n  }\n\n  .submitbox .submit input {\n    margin-bottom: 8px;\n    margin-right: 4px;\n    padding: 6px\n  }\n\n  #post-status-select {\n    margin-top: 3px\n  }\n\n  body.post-type-wp_navigation .inline-edit-status, body.post-type-wp_navigation div#minor-publishing {\n    display: none\n  }\n\n  .is-dragging-metaboxes .metabox-holder .postbox-container .meta-box-sortables {\n    outline: 3px dashed #646970;\n    display: flow-root;\n    min-height: 60px;\n    margin-bottom: 20px\n  }\n\n  .postbox {\n    position: relative;\n    min-width: 255px;\n    border: 1px solid #c3c4c7;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04);\n    background: #fff\n  }\n\n  #trackback_url {\n    width: 99%\n  }\n\n  #normal-sortables .postbox .submit {\n    background: transparent none;\n    border: 0 none;\n    float: right;\n    padding: 0 12px;\n    margin: 0\n  }\n\n  .category-add input[type=text], .category-add select {\n    width: 100%;\n    max-width: 260px;\n    vertical-align: baseline\n  }\n\n  #side-sortables .category-add input[type=text], #side-sortables .category-add select {\n    margin: 0 0 1em\n  }\n\n  #side-sortables .add-menu-item-tabs li, .wp-tab-bar li, ul.category-tabs li {\n    display: inline;\n    line-height: 1.35\n  }\n\n  .no-js .category-tabs li.hide-if-no-js {\n    display: none\n  }\n\n  #side-sortables .add-menu-item-tabs a, .category-tabs a, .wp-tab-bar a {\n    text-decoration: none\n  }\n\n  #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 {\n    color: #2c3338\n  }\n\n  .category-tabs {\n    margin: 8px 0 5px\n  }\n\n  #category-adder h4 {\n    margin: 0\n  }\n\n  .taxonomy-add-new {\n    display: inline-block;\n    margin: 10px 0;\n    font-weight: 600\n  }\n\n  #side-sortables .add-menu-item-tabs, .wp-tab-bar {\n    margin-bottom: 3px\n  }\n\n  #normal-sortables .postbox #replyrow .submit {\n    float: none;\n    margin: 0;\n    padding: 5px 7px 10px;\n    overflow: hidden\n  }\n\n  #side-sortables .submitbox .submit .preview, #side-sortables .submitbox .submit a.preview:hover, #side-sortables .submitbox .submit input {\n    border: 0 none\n  }\n\n  ul.add-menu-item-tabs, ul.category-tabs, ul.wp-tab-bar {\n    margin-top: 12px\n  }\n\n  ul.add-menu-item-tabs li, ul.category-tabs li {\n    border: solid 1px transparent;\n    position: relative\n  }\n\n  .wp-tab-active, ul.add-menu-item-tabs li.tabs, ul.category-tabs li.tabs {\n    border: 1px solid #dcdcde;\n    border-bottom-color: #fff;\n    background-color: #fff\n  }\n\n  ul.add-menu-item-tabs li, ul.category-tabs li, ul.wp-tab-bar li {\n    padding: 3px 5px 6px\n  }\n\n  #set-post-thumbnail {\n    display: inline-block;\n    max-width: 100%\n  }\n\n  #postimagediv .inside img {\n    max-width: 100%;\n    height: auto;\n    width: auto;\n    vertical-align: top;\n    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);\n    background-position: 0 0, 10px 10px;\n    background-size: 20px 20px\n  }\n\n  form#tags-filter {\n    position: relative\n  }\n\n  .ui-tabs-hide, .wp-hidden-children .wp-hidden-child {\n    display: none\n  }\n\n  #post-body .tagsdiv #newtag {\n    margin-right: 5px;\n    width: 16em\n  }\n\n  #side-sortables input#post_password {\n    width: 94%\n  }\n\n  #side-sortables .tagsdiv #newtag {\n    width: 68%\n  }\n\n  #post-status-info {\n    width: 100%;\n    border-spacing: 0;\n    border: 1px solid #c3c4c7;\n    border-top: none;\n    background-color: #f6f7f7;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04);\n    z-index: 999\n  }\n\n  #post-status-info td {\n    font-size: 12px\n  }\n\n  .autosave-info {\n    padding: 2px 10px;\n    text-align: right\n  }\n\n  #editorcontent #post-status-info {\n    border: none\n  }\n\n  #content-resize-handle {\n    background: transparent url(images/resize.gif) no-repeat scroll right bottom;\n    width: 12px;\n    cursor: row-resize\n  }\n\n  .rtl #content-resize-handle {\n    background-image: url(images/resize-rtl.gif);\n    background-position: left bottom\n  }\n\n  .wp-editor-expand #content-resize-handle {\n    display: none\n  }\n\n  #postdivrich #content {\n    resize: none\n  }\n\n  #wp-word-count {\n    padding: 2px 10px\n  }\n\n  #wp-content-editor-container {\n    position: relative\n  }\n\n  .wp-editor-expand #wp-content-editor-tools {\n    z-index: 1000;\n    border-bottom: 1px solid #c3c4c7\n  }\n\n  .wp-editor-expand #wp-content-editor-container {\n    box-shadow: none;\n    margin-top: -1px\n  }\n\n  .wp-editor-expand #wp-content-editor-container {\n    border-bottom: 0 none\n  }\n\n  .wp-editor-expand div.mce-statusbar {\n    z-index: 1\n  }\n\n  .wp-editor-expand #post-status-info {\n    border-top: 1px solid #c3c4c7\n  }\n\n  .wp-editor-expand div.mce-toolbar-grp {\n    z-index: 999\n  }\n\n  .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 {\n    position: static !important;\n    width: auto !important;\n    padding: 0 !important\n  }\n\n  .mce-fullscreen #wp-content-wrap .mce-statusbar {\n    visibility: visible !important\n  }\n\n  .mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw {\n    display: none\n  }\n\n  .mce-fullscreen #wp-content-wrap .mce-wp-dfw, .post-php.mce-fullscreen #wpadminbar {\n    display: none\n  }\n\n  #wp-content-editor-tools {\n    background-color: #f0f0f1;\n    padding-top: 20px\n  }\n\n  #poststuff #post-body.columns-2 #side-sortables {\n    width: 280px\n  }\n\n  #timestampdiv select {\n    vertical-align: top;\n    font-size: 12px;\n    line-height: 2.33333333\n  }\n\n  #aa, #hh, #jj, #mn {\n    padding: 6px 1px;\n    font-size: 12px;\n    line-height: 1.16666666\n  }\n\n  #hh, #jj, #mn {\n    width: 2em\n  }\n\n  #aa {\n    width: 3.4em\n  }\n\n  .curtime #timestamp {\n    padding: 2px 0 1px;\n    display: inline !important;\n    height: auto !important\n  }\n\n  #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 {\n    color: #8c8f94\n  }\n\n  #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 {\n    font: normal 20px/1 dashicons;\n    speak: never;\n    display: inline-block;\n    margin-left: -1px;\n    padding-right: 3px;\n    vertical-align: top;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  #post-body .misc-pub-comment-status:before, #post-body .misc-pub-post-status:before {\n    content: \"\\f173\"\n  }\n\n  #post-body #visibility:before {\n    content: \"\\f177\"\n  }\n\n  .curtime #timestamp:before {\n    content: \"\\f145\";\n    position: relative;\n    top: -1px\n  }\n\n  #post-body .misc-pub-uploadedby:before {\n    content: \"\\f110\";\n    position: relative;\n    top: -1px\n  }\n\n  #post-body .misc-pub-uploadedto:before {\n    content: \"\\f318\";\n    position: relative;\n    top: -1px\n  }\n\n  #post-body .misc-pub-revisions:before {\n    content: \"\\f321\"\n  }\n\n  #post-body .misc-pub-response-to:before {\n    content: \"\\f101\"\n  }\n\n  #timestampdiv {\n    padding-top: 5px;\n    line-height: 1.76923076\n  }\n\n  #timestampdiv p {\n    margin: 8px 0 6px\n  }\n\n  #timestampdiv input {\n    text-align: center\n  }\n\n  .notification-dialog {\n    position: fixed;\n    top: 30%;\n    max-height: 70%;\n    left: 50%;\n    width: 450px;\n    margin-left: -225px;\n    background: #fff;\n    box-shadow: 0 3px 6px rgba(0, 0, 0, .3);\n    line-height: 1.5;\n    z-index: 1000005;\n    overflow-y: auto\n  }\n\n  .notification-dialog-background {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: #000;\n    opacity: .7;\n    z-index: 1000000\n  }\n\n  #post-lock-dialog .post-locked-message, #post-lock-dialog .post-taken-over {\n    margin: 25px\n  }\n\n  #file-editor-warning .button, #post-lock-dialog .post-locked-message a.button {\n    margin-right: 10px\n  }\n\n  #post-lock-dialog .post-locked-avatar {\n    float: left;\n    margin: 0 20px 20px 0\n  }\n\n  #post-lock-dialog .wp-tab-first {\n    outline: 0\n  }\n\n  #post-lock-dialog .locked-saving img {\n    float: left;\n    margin-right: 3px\n  }\n\n  #post-lock-dialog.saved .locked-saved, #post-lock-dialog.saving .locked-saving {\n    display: inline\n  }\n\n  #excerpt {\n    display: block;\n    margin: 12px 0 0;\n    height: 4em;\n    width: 100%\n  }\n\n  .tagchecklist {\n    margin-left: 14px;\n    font-size: 12px;\n    overflow: auto\n  }\n\n  .tagchecklist br {\n    display: none\n  }\n\n  .tagchecklist strong {\n    margin-left: -8px;\n    position: absolute\n  }\n\n  .tagchecklist > li {\n    float: left;\n    margin-right: 25px;\n    font-size: 13px;\n    line-height: 1.8;\n    cursor: default;\n    max-width: 100%;\n    overflow: hidden;\n    text-overflow: ellipsis\n  }\n\n  .tagchecklist .ntdelbutton {\n    position: absolute;\n    width: 24px;\n    height: 24px;\n    border: none;\n    margin: 0 0 0 -19px;\n    padding: 0;\n    background: 0 0;\n    cursor: pointer;\n    text-indent: 0\n  }\n\n  #poststuff .stuffbox > h3, #poststuff h2, #poststuff h3.hndle {\n    font-size: 14px;\n    padding: 8px 12px;\n    margin: 0;\n    line-height: 1.4\n  }\n\n  #poststuff .stuffbox h2 {\n    padding: 8px 10px\n  }\n\n  #poststuff .stuffbox > h2 {\n    border-bottom: 1px solid #f0f0f1\n  }\n\n  #poststuff .inside {\n    margin: 6px 0 0\n  }\n\n  .link-add-php #poststuff .inside, .link-php #poststuff .inside {\n    margin-top: 12px\n  }\n\n  #poststuff .stuffbox .inside {\n    margin: 0\n  }\n\n  #poststuff .inside #page_template, #poststuff .inside #parent_id {\n    max-width: 100%\n  }\n\n  .post-attributes-label-wrapper {\n    margin-bottom: .5em\n  }\n\n  .post-attributes-label {\n    vertical-align: baseline;\n    font-weight: 600\n  }\n\n  #comment-status-radio, #post-visibility-select {\n    line-height: 1.5;\n    margin-top: 3px\n  }\n\n  #linksubmitdiv .inside, #poststuff #submitdiv .inside {\n    margin: 0;\n    padding: 0\n  }\n\n  #post-body-content, .edit-form-section {\n    margin-bottom: 20px\n  }\n\n  .wp_attachment_details .attachment-content-description {\n    margin-top: .5385em;\n    display: inline-block;\n    min-height: 1.6923em\n  }\n\n  .privacy-settings #wpcontent, .privacy-settings.auto-fold #wpcontent, .site-health #wpcontent, .site-health.auto-fold #wpcontent {\n    padding-left: 0\n  }\n\n  .health-check-header h1, .privacy-settings-header h1 {\n    display: inline-block;\n    font-weight: 600;\n    margin: 0 .8rem 1rem;\n    font-size: 23px;\n    padding: 9px 0 4px;\n    line-height: 1.3\n  }\n\n  .health-check-header, .privacy-settings-header {\n    text-align: center;\n    margin: 0 0 1rem;\n    background: #fff;\n    border-bottom: 1px solid #dcdcde\n  }\n\n  .health-check-title-section, .privacy-settings-title-section {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    clear: both;\n    padding-top: 8px\n  }\n\n  .privacy-settings-tabs-wrapper {\n    display: -ms-inline-grid;\n    -ms-grid-columns: 1fr 1fr;\n    vertical-align: top;\n    display: inline-grid;\n    grid-template-columns:1fr 1fr\n  }\n\n  .privacy-settings-tab {\n    display: block;\n    text-decoration: none;\n    color: inherit;\n    padding: .5rem 1rem 1rem;\n    margin: 0 1rem;\n    transition: box-shadow .5s ease-in-out\n  }\n\n  .health-check-tab:nth-child(1), .privacy-settings-tab:nth-child(1) {\n    -ms-grid-column: 1\n  }\n\n  .health-check-tab:nth-child(2), .privacy-settings-tab:nth-child(2) {\n    -ms-grid-column: 2\n  }\n\n  .health-check-tab:focus, .privacy-settings-tab:focus {\n    color: #1d2327;\n    outline: 1px solid #787c82;\n    box-shadow: none\n  }\n\n  .health-check-tab.active, .privacy-settings-tab.active {\n    box-shadow: inset 0 -3px #3582c4;\n    font-weight: 600\n  }\n\n  .health-check-body, .privacy-settings-body {\n    max-width: 800px;\n    margin: 0 auto\n  }\n\n  .tools-privacy-policy-page th {\n    min-width: 230px\n  }\n\n  .hr-separator {\n    margin-top: 20px;\n    margin-bottom: 15px\n  }\n\n  .health-check-accordion, .privacy-settings-accordion {\n    border: 1px solid #c3c4c7\n  }\n\n  .health-check-accordion-heading, .privacy-settings-accordion-heading {\n    margin: 0;\n    border-top: 1px solid #c3c4c7;\n    font-size: inherit;\n    line-height: inherit;\n    font-weight: 600;\n    color: inherit\n  }\n\n  .health-check-accordion-heading:first-child, .privacy-settings-accordion-heading:first-child {\n    border-top: none\n  }\n\n  .health-check-accordion-trigger, .privacy-settings-accordion-trigger {\n    background: #fff;\n    border: 0;\n    color: #2c3338;\n    cursor: pointer;\n    display: flex;\n    font-weight: 400;\n    margin: 0;\n    padding: 1em 3.5em 1em 1.5em;\n    min-height: 46px;\n    position: relative;\n    text-align: left;\n    width: 100%;\n    align-items: center;\n    justify-content: space-between;\n    -webkit-user-select: auto;\n    user-select: auto\n  }\n\n  .health-check-accordion-trigger:active, .health-check-accordion-trigger:hover, .privacy-settings-accordion-trigger:active, .privacy-settings-accordion-trigger:hover {\n    background: #f6f7f7\n  }\n\n  .health-check-accordion-trigger:focus, .privacy-settings-accordion-trigger:focus {\n    color: #1d2327;\n    border: none;\n    box-shadow: none;\n    outline-offset: -1px;\n    outline: 2px solid #2271b1;\n    background-color: #f6f7f7\n  }\n\n  .health-check-accordion-trigger .title, .privacy-settings-accordion-trigger .title {\n    pointer-events: none;\n    font-weight: 600;\n    flex-grow: 1\n  }\n\n  .health-check-accordion-trigger .icon, .privacy-settings-accordion-trigger .icon, .privacy-settings-view-read .icon, .site-health-view-passed .icon {\n    border: solid #50575e;\n    border-width: 0 2px 2px 0;\n    height: .5rem;\n    pointer-events: none;\n    position: absolute;\n    right: 1.5em;\n    top: 50%;\n    transform: translateY(-70%) rotate(45deg);\n    width: .5rem\n  }\n\n  .health-check-accordion-trigger .badge, .privacy-settings-accordion-trigger .badge {\n    padding: .1rem .5rem .15rem;\n    color: #2c3338;\n    font-weight: 600\n  }\n\n  .privacy-settings-accordion-trigger .badge {\n    margin-left: .5rem\n  }\n\n  .health-check-accordion-trigger .badge.blue, .privacy-settings-accordion-trigger .badge.blue {\n    border: 1px solid #72aee6\n  }\n\n  .health-check-accordion-trigger .badge.orange, .privacy-settings-accordion-trigger .badge.orange {\n    border: 1px solid #dba617\n  }\n\n  .health-check-accordion-trigger .badge.red, .privacy-settings-accordion-trigger .badge.red {\n    border: 1px solid #e65054\n  }\n\n  .health-check-accordion-trigger .badge.green, .privacy-settings-accordion-trigger .badge.green {\n    border: 1px solid #00ba37\n  }\n\n  .health-check-accordion-trigger .badge.purple, .privacy-settings-accordion-trigger .badge.purple {\n    border: 1px solid #2271b1\n  }\n\n  .health-check-accordion-trigger .badge.gray, .privacy-settings-accordion-trigger .badge.gray {\n    border: 1px solid #c3c4c7\n  }\n\n  .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 {\n    transform: translateY(-30%) rotate(-135deg)\n  }\n\n  .health-check-accordion-panel, .privacy-settings-accordion-panel {\n    margin: 0;\n    padding: 1em 1.5em;\n    background: #fff\n  }\n\n  .health-check-accordion-panel[hidden], .privacy-settings-accordion-panel[hidden] {\n    display: none\n  }\n\n  .health-check-accordion-panel a .dashicons, .privacy-settings-accordion-panel a .dashicons {\n    text-decoration: none\n  }\n\n  .privacy-settings-accordion-actions {\n    text-align: right;\n    display: block\n  }\n\n  .privacy-settings-accordion-actions .success {\n    display: none;\n    color: #008a20;\n    padding-right: 1em;\n    padding-top: 6px\n  }\n\n  .privacy-settings-accordion-actions .success.visible {\n    display: inline-block\n  }\n\n  .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 {\n    display: none\n  }\n\n  .privacy-settings-accordion-panel strong.privacy-policy-tutorial, .privacy-settings-accordion-panel strong.wp-policy-help {\n    display: block;\n    margin: 0 0 1em\n  }\n\n  .privacy-text-copy span {\n    pointer-events: none\n  }\n\n  .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) {\n    margin: 0;\n    padding: 1em;\n    border-left: 2px solid #787c82\n  }\n\n  @media screen and (max-width: 782px) {\n    .health-check-body, .privacy-settings-body {\n      margin: 0 12px;\n      width: auto\n    }\n    .privacy-settings .notice, .site-health .notice {\n      margin: 5px 10px 15px\n    }\n    .privacy-settings .update-nag, .site-health .update-nag {\n      margin-right: 10px;\n      margin-left: 10px\n    }\n    input#create-page {\n      margin-top: 10px\n    }\n    .wp-core-ui button.privacy-text-copy {\n      white-space: normal;\n      line-height: 1.8\n    }\n  }\n  @media only screen and (max-width: 1004px) {\n    .health-check-body, .privacy-settings-body {\n      margin: 0 22px;\n      width: auto\n    }\n  }\n\n  #postcustomstuff thead th {\n    padding: 5px 8px 8px;\n    background-color: #f0f0f1\n  }\n\n  #postcustom #postcustomstuff .submit {\n    border: 0 none;\n    float: none;\n    padding: 0 8px 8px\n  }\n\n  #side-sortables #postcustom #postcustomstuff .submit {\n    margin: 0;\n    padding: 0\n  }\n\n  #side-sortables #postcustom #postcustomstuff #the-list textarea {\n    height: 85px\n  }\n\n  #side-sortables #postcustom #postcustomstuff td.left input, #side-sortables #postcustom #postcustomstuff td.left select, #side-sortables #postcustomstuff #newmetaleft a {\n    margin: 3px 3px 0\n  }\n\n  #postcustomstuff table {\n    margin: 0;\n    width: 100%;\n    border: 1px solid #dcdcde;\n    border-spacing: 0;\n    background-color: #f6f7f7\n  }\n\n  #postcustomstuff tr {\n    vertical-align: top\n  }\n\n  #postcustomstuff table input, #postcustomstuff table select, #postcustomstuff table textarea {\n    width: 96%;\n    margin: 8px\n  }\n\n  #side-sortables #postcustomstuff table input, #side-sortables #postcustomstuff table select, #side-sortables #postcustomstuff table textarea {\n    margin: 3px\n  }\n\n  #postcustomstuff td.left, #postcustomstuff th.left {\n    width: 38%\n  }\n\n  #postcustomstuff .submit input {\n    margin: 0;\n    width: auto\n  }\n\n  #postcustomstuff #newmetaleft a {\n    display: inline-block;\n    margin: 0 8px 8px;\n    text-decoration: none\n  }\n\n  .no-js #postcustomstuff #enternew {\n    display: none\n  }\n\n  #post-body-content .compat-attachment-fields {\n    margin-bottom: 20px\n  }\n\n  .compat-attachment-fields th {\n    padding-top: 5px;\n    padding-right: 10px\n  }\n\n  #select-featured-image {\n    padding: 4px 0;\n    overflow: hidden\n  }\n\n  #select-featured-image img {\n    max-width: 100%;\n    height: auto;\n    margin-bottom: 10px\n  }\n\n  #select-featured-image a {\n    float: left;\n    clear: both\n  }\n\n  #select-featured-image .remove {\n    display: none;\n    margin-top: 10px\n  }\n\n  .js #select-featured-image.has-featured-image .remove {\n    display: inline-block\n  }\n\n  .no-js #select-featured-image .choose {\n    display: none\n  }\n\n  .post-format-icon::before {\n    display: inline-block;\n    vertical-align: middle;\n    height: 20px;\n    width: 20px;\n    margin-top: -4px;\n    margin-right: 7px;\n    color: #dcdcde;\n    font: normal 20px/1 dashicons;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  a.post-format-icon:hover:before {\n    color: #135e96\n  }\n\n  #post-formats-select {\n    line-height: 2\n  }\n\n  #post-formats-select .post-format-icon::before {\n    top: 5px\n  }\n\n  input.post-format {\n    margin-top: 1px\n  }\n\n  label.post-format-icon {\n    margin-left: 0;\n    padding: 2px 0\n  }\n\n  .post-format-icon.post-format-standard::before {\n    content: \"\\f109\"\n  }\n\n  .post-format-icon.post-format-image::before {\n    content: \"\\f128\"\n  }\n\n  .post-format-icon.post-format-gallery::before {\n    content: \"\\f161\"\n  }\n\n  .post-format-icon.post-format-audio::before {\n    content: \"\\f127\"\n  }\n\n  .post-format-icon.post-format-video::before {\n    content: \"\\f126\"\n  }\n\n  .post-format-icon.post-format-chat::before {\n    content: \"\\f125\"\n  }\n\n  .post-format-icon.post-format-status::before {\n    content: \"\\f130\"\n  }\n\n  .post-format-icon.post-format-aside::before {\n    content: \"\\f123\"\n  }\n\n  .post-format-icon.post-format-quote::before {\n    content: \"\\f122\"\n  }\n\n  .post-format-icon.post-format-link::before {\n    content: \"\\f103\"\n  }\n\n  .category-adder {\n    margin-left: 120px;\n    padding: 4px 0\n  }\n\n  .category-adder h4 {\n    margin: 0 0 8px\n  }\n\n  #side-sortables .category-adder {\n    margin: 0\n  }\n\n  .categorydiv div.tabs-panel, .customlinkdiv div.tabs-panel, .posttypediv div.tabs-panel, .taxonomydiv div.tabs-panel, .wp-tab-panel {\n    min-height: 42px;\n    max-height: 200px;\n    overflow: auto;\n    padding: 0 .9em;\n    border: solid 1px #dcdcde;\n    background-color: #fff\n  }\n\n  div.tabs-panel-active {\n    display: block\n  }\n\n  div.tabs-panel-inactive {\n    display: none\n  }\n\n  div.tabs-panel-active:focus {\n    box-shadow: inset 0 0 0 1px #4f94d4, inset 0 0 2px 1px rgba(79, 148, 212, .8);\n    outline: 0 none\n  }\n\n  #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 {\n    margin-left: 18px\n  }\n\n  ul.categorychecklist li {\n    margin: 0;\n    padding: 0;\n    line-height: 1.69230769;\n    word-wrap: break-word\n  }\n\n  .categorydiv .tabs-panel, .customlinkdiv .tabs-panel, .posttypediv .tabs-panel, .taxonomydiv .tabs-panel {\n    border-width: 3px;\n    border-style: solid\n  }\n\n  .form-wrap label {\n    display: block;\n    padding: 2px 0\n  }\n\n  .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 {\n    border-style: solid;\n    border-width: 1px;\n    width: 95%\n  }\n\n  .form-field p, .form-field select {\n    max-width: 95%\n  }\n\n  .form-wrap p, p.description {\n    margin: 2px 0 5px;\n    color: #646970\n  }\n\n  .form-wrap p, p.description, p.help, span.description {\n    font-size: 13px\n  }\n\n  p.description code {\n    font-style: normal\n  }\n\n  .form-wrap .form-field {\n    margin: 1em 0;\n    padding: 0\n  }\n\n  .col-wrap h2 {\n    margin: 12px 0;\n    font-size: 1.1em\n  }\n\n  .col-wrap p.submit {\n    margin-top: -10px\n  }\n\n  .edit-term-notes {\n    margin-top: 2em\n  }\n\n  #poststuff .tagsdiv .ajaxtag {\n    margin-top: 1em\n  }\n\n  #poststuff .tagsdiv .howto {\n    margin: 1em 0 6px\n  }\n\n  .ajaxtag .newtag {\n    position: relative\n  }\n\n  .tagsdiv .newtag {\n    width: 180px\n  }\n\n  .tagsdiv .the-tags {\n    display: block;\n    height: 60px;\n    margin: 0 auto;\n    overflow: auto;\n    width: 260px\n  }\n\n  #post-body-content .tagsdiv .the-tags {\n    margin: 0 5px\n  }\n\n  p.popular-tags {\n    border: none;\n    line-height: 2em;\n    padding: 8px 12px 12px;\n    text-align: justify\n  }\n\n  p.popular-tags a {\n    padding: 0 3px\n  }\n\n  .tagcloud {\n    width: 97%;\n    margin: 0 0 40px;\n    text-align: justify\n  }\n\n  .tagcloud h2 {\n    margin: 2px 0 12px\n  }\n\n  #poststuff .inside .the-tagcloud {\n    margin: 5px 0 10px;\n    padding: 8px;\n    border: 1px solid #dcdcde;\n    line-height: 1.2;\n    word-spacing: 3px\n  }\n\n  .the-tagcloud ul {\n    margin: 0\n  }\n\n  .the-tagcloud ul li {\n    display: inline-block\n  }\n\n  .ac_results {\n    display: none;\n    margin: -1px 0 0;\n    padding: 0;\n    list-style: none;\n    position: absolute;\n    z-index: 10000;\n    border: 1px solid #4f94d4;\n    background-color: #fff\n  }\n\n  .wp-customizer .ac_results {\n    z-index: 500000\n  }\n\n  .ac_results li {\n    margin: 0;\n    padding: 5px 10px;\n    white-space: nowrap;\n    text-align: left\n  }\n\n  .ac_over .ac_match, .ac_results .ac_over {\n    background-color: #2271b1;\n    color: #fff;\n    cursor: pointer\n  }\n\n  .ac_match {\n    text-decoration: underline\n  }\n\n  #addtag .spinner {\n    float: none;\n    vertical-align: top\n  }\n\n  #edittag {\n    max-width: 800px\n  }\n\n  .edit-tag-actions {\n    margin-top: 20px\n  }\n\n  .comment-php .wp-editor-area {\n    height: 200px\n  }\n\n  .comment-ays td, .comment-ays th {\n    padding: 10px 15px\n  }\n\n  .comment-ays .comment-content ul {\n    list-style: initial;\n    margin-left: 2em\n  }\n\n  .comment-ays .comment-content a[href]:after {\n    content: \"(\" attr(href) \")\";\n    display: inline-block;\n    padding: 0 4px;\n    color: #646970;\n    font-size: 13px;\n    word-break: break-all\n  }\n\n  .comment-ays .comment-content p.edit-comment {\n    margin-top: 10px\n  }\n\n  .comment-ays .comment-content p.edit-comment a[href]:after {\n    content: \"\";\n    padding: 0\n  }\n\n  .comment-ays-submit .button-cancel {\n    margin-left: 1em\n  }\n\n  .spam-undo-inside, .trash-undo-inside {\n    margin: 1px 8px 1px 0;\n    line-height: 1.23076923\n  }\n\n  .spam-undo-inside .avatar, .trash-undo-inside .avatar {\n    height: 20px;\n    width: 20px;\n    margin-right: 8px;\n    vertical-align: middle\n  }\n\n  .stuffbox .editcomment {\n    clear: none;\n    margin-top: 0\n  }\n\n  #namediv.stuffbox .editcomment input {\n    width: 100%\n  }\n\n  #namediv.stuffbox .editcomment.form-table td {\n    padding: 10px\n  }\n\n  #comment-status-radio p {\n    margin: 3px 0 5px\n  }\n\n  #comment-status-radio input {\n    margin: 2px 3px 5px 0;\n    vertical-align: middle\n  }\n\n  #comment-status-radio label {\n    padding: 5px 0\n  }\n\n  table.links-table {\n    width: 100%;\n    border-spacing: 0\n  }\n\n  .links-table th {\n    font-weight: 400;\n    text-align: left;\n    vertical-align: top;\n    min-width: 80px;\n    width: 20%;\n    word-wrap: break-word\n  }\n\n  .links-table td, .links-table th {\n    padding: 5px 0\n  }\n\n  .links-table td label {\n    margin-right: 8px\n  }\n\n  .links-table td input[type=text], .links-table td textarea {\n    width: 100%\n  }\n\n  .links-table #link_rel {\n    max-width: 280px\n  }\n\n  #qt_content_dfw {\n    display: none\n  }\n\n  .wp-editor-expand #qt_content_dfw {\n    display: inline-block\n  }\n\n  .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 {\n    opacity: 0;\n    transition-duration: .6s;\n    transition-property: opacity;\n    transition-timing-function: ease-in-out\n  }\n\n  .focus-on #wp-toolbar {\n    opacity: .3\n  }\n\n  .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 {\n    opacity: 1;\n    transition-duration: .2s;\n    transition-property: opacity;\n    transition-timing-function: ease-in-out\n  }\n\n  .focus-off #wp-toolbar {\n    -webkit-transform: translate(0, 0)\n  }\n\n  .focus-on #adminmenuback, .focus-on #adminmenuwrap {\n    transition-duration: .6s;\n    transition-property: transform;\n    transition-timing-function: ease-in-out\n  }\n\n  .focus-on #adminmenuback, .focus-on #adminmenuwrap {\n    transform: translateX(-100%)\n  }\n\n  .focus-off #adminmenuback, .focus-off #adminmenuwrap {\n    transform: translateX(0);\n    transition-duration: .2s;\n    transition-property: transform;\n    transition-timing-function: ease-in-out\n  }\n\n  @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {\n    #content-resize-handle, #post-body .wp_themeSkin .mceStatusbar a.mceResize {\n      background: transparent url(images/resize-2x.gif) no-repeat scroll right bottom;\n      background-size: 11px 11px\n    }\n    .rtl #content-resize-handle, .rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize {\n      background-image: url(images/resize-rtl-2x.gif);\n      background-position: left bottom\n    }\n  }\n  @media only screen and (max-width: 1200px) {\n    .post-type-attachment #poststuff {\n      min-width: 0\n    }\n    .post-type-attachment #wpbody-content #poststuff #post-body {\n      margin: 0\n    }\n    .post-type-attachment #wpbody-content #post-body.columns-2 #postbox-container-1 {\n      margin-right: 0;\n      width: 100%\n    }\n    .post-type-attachment #poststuff #postbox-container-1 #side-sortables:empty, .post-type-attachment #poststuff #postbox-container-1 .empty-container {\n      outline: 0;\n      height: 0;\n      min-height: 0\n    }\n    .post-type-attachment #poststuff #post-body.columns-2 #side-sortables {\n      min-height: 0;\n      width: auto\n    }\n    .is-dragging-metaboxes.post-type-attachment #post-body .meta-box-sortables {\n      outline: 0;\n      min-height: 0;\n      margin-bottom: 0\n    }\n    .post-type-attachment .columns-prefs, .post-type-attachment .screen-layout {\n      display: none\n    }\n  }\n  @media only screen and (max-width: 850px) {\n    #poststuff {\n      min-width: 0\n    }\n    #wpbody-content #poststuff #post-body {\n      margin: 0\n    }\n    #wpbody-content #post-body.columns-2 #postbox-container-1 {\n      margin-right: 0;\n      width: 100%\n    }\n    #poststuff #postbox-container-1 #side-sortables:empty, #poststuff #postbox-container-1 .empty-container {\n      height: 0;\n      min-height: 0\n    }\n    #poststuff #post-body.columns-2 #side-sortables {\n      min-height: 0;\n      width: auto\n    }\n    .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 {\n      height: auto;\n      min-height: 60px\n    }\n    .columns-prefs, .screen-layout {\n      display: none\n    }\n  }\n  @media screen and (max-width: 782px) {\n    .wp-core-ui .edit-tag-actions .button-primary {\n      margin-bottom: 0\n    }\n    #post-body-content {\n      min-width: 0\n    }\n    #titlediv #title-prompt-text {\n      padding: 10px\n    }\n    #poststuff .stuffbox .inside {\n      padding: 0 2px 4px 0\n    }\n    #poststuff .stuffbox > h3, #poststuff h2, #poststuff h3.hndle {\n      padding: 12px\n    }\n    #namediv.stuffbox .editcomment.form-table td {\n      padding: 5px 10px\n    }\n    .post-format-options {\n      padding-right: 0\n    }\n    .post-format-options a {\n      margin-right: 5px;\n      margin-bottom: 5px;\n      min-width: 52px\n    }\n    .post-format-options .post-format-title {\n      font-size: 11px\n    }\n    .post-format-options a div {\n      height: 28px;\n      width: 28px\n    }\n    .post-format-options a div:before {\n      font-size: 26px !important\n    }\n    #post-visibility-select {\n      line-height: 280%\n    }\n    .wp-core-ui .save-post-visibility, .wp-core-ui .save-timestamp {\n      vertical-align: middle;\n      margin-right: 15px\n    }\n    .timestamp-wrap select#mm {\n      display: block;\n      width: 100%;\n      margin-bottom: 10px\n    }\n    .timestamp-wrap #aa, .timestamp-wrap #hh, .timestamp-wrap #jj, .timestamp-wrap #mn {\n      padding: 12px 3px;\n      font-size: 14px;\n      margin-bottom: 5px;\n      width: auto;\n      text-align: center\n    }\n    ul.category-tabs {\n      margin: 30px 0 15px\n    }\n    ul.category-tabs li.tabs {\n      padding: 15px\n    }\n    ul.categorychecklist li {\n      margin-bottom: 15px\n    }\n    ul.categorychecklist ul {\n      margin-top: 15px\n    }\n    .category-add input[type=text], .category-add select {\n      max-width: none;\n      margin-bottom: 15px\n    }\n    .tagsdiv .newtag {\n      width: 100%;\n      height: auto;\n      margin-bottom: 15px\n    }\n    .tagchecklist {\n      margin: 25px 10px\n    }\n    .tagchecklist > li {\n      font-size: 16px;\n      line-height: 1.4\n    }\n    #commentstatusdiv p {\n      line-height: 2.8\n    }\n    .mceToolbar * {\n      white-space: normal !important\n    }\n    .mceToolbar td, .mceToolbar tr {\n      float: left !important\n    }\n    .wp_themeSkin a.mceButton {\n      width: 30px;\n      height: 30px\n    }\n    .wp_themeSkin .mceButton .mceIcon {\n      margin-top: 5px;\n      margin-left: 5px\n    }\n    .wp_themeSkin .mceSplitButton {\n      margin-top: 1px\n    }\n    .wp_themeSkin .mceSplitButton td a.mceAction {\n      padding: 6px 3px 6px 6px\n    }\n    .wp_themeSkin .mceSplitButton td a.mceOpen, .wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen {\n      padding-top: 6px;\n      padding-bottom: 6px;\n      background-position: 1px 6px\n    }\n    .wp_themeSkin table.mceListBox {\n      margin: 5px\n    }\n    div.quicktags-toolbar input {\n      padding: 10px 20px\n    }\n    button.wp-switch-editor {\n      font-size: 16px;\n      line-height: 1;\n      margin: 7px 0 0 7px;\n      padding: 8px 12px\n    }\n    #wp-content-media-buttons a {\n      font-size: 14px;\n      padding: 6px 10px\n    }\n    .wp-media-buttons span.jetpack-contact-form-icon, .wp-media-buttons span.wp-media-buttons-icon {\n      width: 22px !important;\n      margin-left: -2px !important\n    }\n    .wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before, .wp-media-buttons .add_media span.wp-media-buttons-icon:before {\n      font-size: 20px !important\n    }\n    #content_wp_fullscreen {\n      display: none\n    }\n    .misc-pub-section {\n      padding: 20px 10px\n    }\n    .misc-pub-section > a {\n      float: right;\n      font-size: 16px\n    }\n    #delete-action, #publishing-action {\n      line-height: 3.61538461\n    }\n    #publishing-action .spinner {\n      float: none;\n      margin-top: -2px\n    }\n    .comment-ays td, .comment-ays th {\n      padding-bottom: 0\n    }\n    .comment-ays td {\n      padding-top: 6px\n    }\n    .links-table #link_rel {\n      max-width: none\n    }\n    .links-table td, .links-table th {\n      padding: 10px 0\n    }\n    .edit-term-notes {\n      display: none\n    }\n    .privacy-text-box {\n      width: auto\n    }\n    .privacy-text-box-toc {\n      float: none;\n      width: auto;\n      height: 100%;\n      display: flex;\n      flex-direction: column\n    }\n    .privacy-text-section .return-to-top {\n      margin: 2em 0 0\n    }\n  }\n  /*! This file is auto-generated */\n  .revisions-control-frame, .revisions-diff-frame {\n    position: relative\n  }\n\n  .revisions-diff-frame {\n    top: 10px\n  }\n\n  .revisions-controls {\n    padding-top: 40px;\n    z-index: 1\n  }\n\n  .revisions-controls input[type=checkbox] {\n    position: relative;\n    top: -1px;\n    vertical-align: text-bottom\n  }\n\n  .revisions.pinned .revisions-controls {\n    position: fixed;\n    top: 0;\n    height: 82px;\n    background: #fff;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, .1)\n  }\n\n  .revisions-tickmarks {\n    position: relative;\n    margin: 0 auto;\n    height: .7em;\n    top: 7px;\n    max-width: 70%;\n    box-sizing: border-box;\n    background-color: #fff\n  }\n\n  .revisions-tickmarks > div {\n    position: absolute;\n    height: 100%;\n    border-left: 1px solid #a7aaad;\n    box-sizing: border-box\n  }\n\n  .revisions-tickmarks > div:first-child {\n    border-width: 0\n  }\n\n  .comparing-two-revisions .revisions-controls {\n    height: 140px\n  }\n\n  .comparing-two-revisions.pinned .revisions-controls {\n    height: 124px\n  }\n\n  .revisions .diff-error {\n    position: absolute;\n    text-align: center;\n    margin: 0 auto;\n    width: 100%;\n    display: none\n  }\n\n  .revisions.diff-error .diff-error {\n    display: block\n  }\n\n  .revisions .loading-indicator {\n    position: absolute;\n    vertical-align: middle;\n    opacity: 0;\n    width: 100%;\n    width: calc(100% - 30px);\n    top: 50%;\n    top: calc(50% - 10px);\n    transition: opacity .5s\n  }\n\n  body.folded .revisions .loading-indicator {\n    margin-left: -32px\n  }\n\n  .revisions .loading-indicator span.spinner {\n    display: block;\n    margin: 0 auto;\n    float: none\n  }\n\n  .revisions.loading .loading-indicator {\n    opacity: 1\n  }\n\n  .revisions .diff {\n    transition: opacity .5s\n  }\n\n  .revisions.loading .diff {\n    opacity: .5\n  }\n\n  .revisions.diff-error .diff {\n    visibility: hidden\n  }\n\n  .revisions-meta {\n    margin-top: 20px;\n    background-color: #fff;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, .1);\n    overflow: hidden\n  }\n\n  .revisions.pinned .revisions-meta {\n    box-shadow: none\n  }\n\n  .revision-toggle-compare-mode {\n    position: absolute;\n    top: 0;\n    right: 0\n  }\n\n  .comparing-two-revisions .revisions-next, .comparing-two-revisions .revisions-previous, .revisions-meta .diff-meta-to strong {\n    display: none\n  }\n\n  .revisions-controls .author-card .date {\n    color: #646970\n  }\n\n  .revisions-controls .author-card.autosave {\n    color: #d63638\n  }\n\n  .revisions-controls .author-card .author-name {\n    font-weight: 600\n  }\n\n  .comparing-two-revisions .diff-meta-to strong {\n    display: block\n  }\n\n  .revisions.pinned .revisions-buttons {\n    padding: 0 11px\n  }\n\n  .revisions-next, .revisions-previous {\n    position: relative;\n    z-index: 1\n  }\n\n  .revisions-previous {\n    float: left\n  }\n\n  .revisions-next {\n    float: right\n  }\n\n  .revisions-controls .wp-slider {\n    max-width: 70%;\n    margin: 0 auto;\n    top: -3px\n  }\n\n  .revisions-diff {\n    padding: 15px;\n    background-color: #fff;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, .1)\n  }\n\n  .revisions-diff h3:first-child {\n    margin-top: 0\n  }\n\n  #revisions-meta-restored img, .post-revisions li img {\n    vertical-align: middle\n  }\n\n  table.diff {\n    table-layout: fixed;\n    width: 100%;\n    white-space: pre-wrap\n  }\n\n  table.diff col.content {\n    width: auto\n  }\n\n  table.diff col.content.diffsplit {\n    width: 48%\n  }\n\n  table.diff col.diffsplit.middle {\n    width: auto\n  }\n\n  table.diff col.ltype {\n    width: 30px\n  }\n\n  table.diff tr {\n    background-color: transparent\n  }\n\n  table.diff td, table.diff th {\n    font-family: Consolas, Monaco, monospace;\n    font-size: 14px;\n    line-height: 1.57142857;\n    padding: .5em .5em .5em 2em;\n    vertical-align: top;\n    word-wrap: break-word\n  }\n\n  table.diff td h1, table.diff td h2, table.diff td h3, table.diff td h4, table.diff td h5, table.diff td h6 {\n    margin: 0\n  }\n\n  table.diff .diff-addedline ins, table.diff .diff-deletedline del {\n    text-decoration: none\n  }\n\n  table.diff .diff-deletedline {\n    position: relative;\n    background-color: #fcf0f1\n  }\n\n  table.diff .diff-deletedline del {\n    background-color: #ffabaf\n  }\n\n  table.diff .diff-addedline {\n    position: relative;\n    background-color: #edfaef\n  }\n\n  table.diff .diff-addedline .dashicons, table.diff .diff-deletedline .dashicons {\n    position: absolute;\n    top: .85714286em;\n    left: .5em;\n    width: 1em;\n    height: 1em;\n    font-size: 1em;\n    line-height: 1\n  }\n\n  table.diff .diff-addedline .dashicons {\n    top: .92857143em\n  }\n\n  table.diff .diff-addedline ins {\n    background-color: #68de7c\n  }\n\n  .diff-meta {\n    padding: 5px;\n    clear: both;\n    min-height: 32px\n  }\n\n  .diff-title strong {\n    line-height: 2.46153846;\n    min-width: 60px;\n    text-align: right;\n    float: left;\n    margin-right: 5px\n  }\n\n  .revisions-controls .author-card .author-info {\n    font-size: 12px;\n    line-height: 1.33333333\n  }\n\n  .revisions-controls .author-card .author-info, .revisions-controls .author-card .avatar {\n    float: left;\n    margin-left: 6px;\n    margin-right: 6px\n  }\n\n  .revisions-controls .author-card .byline {\n    display: block;\n    font-size: 12px\n  }\n\n  .revisions-controls .author-card .avatar {\n    vertical-align: middle\n  }\n\n  .diff-meta input.restore-revision {\n    float: right;\n    margin-left: 6px;\n    margin-right: 6px;\n    margin-top: 2px\n  }\n\n  .diff-meta-from {\n    display: none\n  }\n\n  .comparing-two-revisions .diff-meta-from {\n    display: block\n  }\n\n  .revisions-tooltip {\n    position: absolute;\n    bottom: 105px;\n    margin-right: 0;\n    margin-left: -69px;\n    z-index: 0;\n    max-width: 350px;\n    min-width: 130px;\n    padding: 8px 4px;\n    display: none;\n    opacity: 0\n  }\n\n  .revisions-tooltip.flipped {\n    margin-left: 0;\n    margin-right: -70px\n  }\n\n  .revisions.pinned .revisions-tooltip {\n    display: none !important\n  }\n\n  .comparing-two-revisions .revisions-tooltip {\n    bottom: 145px\n  }\n\n  .revisions-tooltip-arrow {\n    width: 70px;\n    height: 15px;\n    overflow: hidden;\n    position: absolute;\n    left: 0;\n    margin-left: 35px;\n    bottom: -15px\n  }\n\n  .revisions-tooltip.flipped .revisions-tooltip-arrow {\n    margin-left: 0;\n    margin-right: 35px;\n    left: auto;\n    right: 0\n  }\n\n  .revisions-tooltip-arrow > span {\n    content: \"\";\n    position: absolute;\n    left: 20px;\n    top: -20px;\n    width: 25px;\n    height: 25px;\n    transform: rotate(45deg)\n  }\n\n  .revisions-tooltip.flipped .revisions-tooltip-arrow > span {\n    left: auto;\n    right: 20px\n  }\n\n  .revisions-tooltip, .revisions-tooltip-arrow > span {\n    border: 1px solid #dcdcde;\n    background-color: #fff\n  }\n\n  .revisions-tooltip {\n    display: none\n  }\n\n  .arrow {\n    width: 70px;\n    height: 16px;\n    overflow: hidden;\n    position: absolute;\n    left: 0;\n    margin-left: -35px;\n    bottom: 90px;\n    z-index: 10000\n  }\n\n  .arrow:after {\n    z-index: 9999;\n    background-color: #fff;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, .1)\n  }\n\n  .arrow.top {\n    top: -16px;\n    bottom: auto\n  }\n\n  .arrow.left {\n    left: 20%\n  }\n\n  .arrow:after {\n    content: \"\";\n    position: absolute;\n    left: 20px;\n    top: -20px;\n    width: 25px;\n    height: 25px;\n    transform: rotate(45deg)\n  }\n\n  .revisions-tooltip, .revisions-tooltip-arrow:after {\n    border-width: 1px;\n    border-style: solid\n  }\n\n  div.revisions-controls > .wp-slider > .ui-slider-handle {\n    margin-left: -10px\n  }\n\n  .rtl div.revisions-controls > .wp-slider > .ui-slider-handle {\n    margin-right: -10px\n  }\n\n  .wp-slider.ui-slider {\n    position: relative;\n    border: 1px solid #dcdcde;\n    text-align: left;\n    cursor: pointer\n  }\n\n  .wp-slider .ui-slider-handle {\n    border-radius: 50%;\n    height: 18px;\n    margin-top: -5px;\n    outline: 0;\n    padding: 2px;\n    position: absolute;\n    width: 18px;\n    z-index: 2;\n    touch-action: none\n  }\n\n  .wp-slider .ui-slider-handle, .wp-slider .ui-slider-handle.focus {\n    background: #f6f7f7;\n    border: 1px solid #c3c4c7;\n    box-shadow: 0 1px 0 #c3c4c7\n  }\n\n  .wp-slider .ui-slider-handle.ui-state-hover, .wp-slider .ui-slider-handle:hover {\n    background: #f6f7f7;\n    border-color: #8c8f94\n  }\n\n  .wp-slider .ui-slider-handle.ui-state-active, .wp-slider .ui-slider-handle:active {\n    background: #f0f0f1;\n    border-color: #8c8f94;\n    box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .5);\n    transform: translateY(1px)\n  }\n\n  .wp-slider .ui-slider-handle:before {\n    background: 0 0;\n    position: absolute;\n    top: 2px;\n    left: 2px;\n    color: #50575e;\n    content: \"\\f229\";\n    font: normal 18px/1 dashicons;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .wp-slider .ui-slider-handle.ui-state-hover:before, .wp-slider .ui-slider-handle:hover:before {\n    color: #1d2327\n  }\n\n  .wp-slider .ui-slider-handle.from-handle:before, .wp-slider .ui-slider-handle.to-handle:before {\n    font-size: 20px !important;\n    margin: -1px 0 0 -1px\n  }\n\n  .wp-slider .ui-slider-handle.from-handle:before {\n    content: \"\\f139\"\n  }\n\n  .wp-slider .ui-slider-handle.to-handle:before {\n    content: \"\\f141\"\n  }\n\n  .rtl .wp-slider .ui-slider-handle.from-handle:before {\n    content: \"\\f141\"\n  }\n\n  .rtl .wp-slider .ui-slider-handle.to-handle:before {\n    content: \"\\f139\";\n    right: -1px\n  }\n\n  .wp-slider .ui-slider-range {\n    position: absolute;\n    font-size: .7em;\n    display: block;\n    border: 0;\n    background-color: transparent;\n    background-image: none\n  }\n\n  .wp-slider.ui-slider-horizontal {\n    height: .7em\n  }\n\n  .wp-slider.ui-slider-horizontal .ui-slider-handle {\n    top: -.25em;\n    margin-left: -.6em\n  }\n\n  .wp-slider.ui-slider-horizontal .ui-slider-range {\n    top: 0;\n    height: 100%\n  }\n\n  .wp-slider.ui-slider-horizontal .ui-slider-range-min {\n    left: 0\n  }\n\n  .wp-slider.ui-slider-horizontal .ui-slider-range-max {\n    right: 0\n  }\n\n  @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {\n    .revision-tick.completed-false {\n      background-image: url(images/spinner-2x.gif)\n    }\n  }\n  @media screen and (max-width: 782px) {\n    #diff-next-revision, #diff-previous-revision {\n      margin-top: -1em\n    }\n    .revisions-buttons {\n      overflow: hidden;\n      margin-bottom: 15px\n    }\n    .comparing-two-revisions .revisions-controls, .revisions-controls {\n      height: 170px\n    }\n    .revisions-tooltip {\n      bottom: 130px;\n      z-index: 2\n    }\n    .diff-meta {\n      overflow: hidden\n    }\n    table.diff {\n      -ms-word-break: break-all;\n      word-break: break-all;\n      word-wrap: break-word\n    }\n    .diff-meta input.restore-revision {\n      margin-top: 0\n    }\n  }\n  /*! This file is auto-generated */\n  .media-item .describe {\n    border-collapse: collapse;\n    width: 100%;\n    border-top: 1px solid #dcdcde;\n    clear: both;\n    cursor: default\n  }\n\n  .media-item.media-blank .describe {\n    border: 0\n  }\n\n  .media-item .describe th {\n    vertical-align: top;\n    text-align: left;\n    padding: 5px 10px 10px;\n    width: 140px\n  }\n\n  .media-item .describe .align th {\n    padding-top: 0\n  }\n\n  .media-item .media-item-info tr {\n    background-color: transparent\n  }\n\n  .media-item .describe td {\n    padding: 0 8px 8px 0;\n    vertical-align: top\n  }\n\n  .media-item thead.media-item-info td {\n    padding: 4px 10px 0\n  }\n\n  .media-item .media-item-info .A1B1 {\n    padding: 0 0 0 10px\n  }\n\n  .media-item td.savesend {\n    padding-bottom: 15px\n  }\n\n  .media-item .thumbnail {\n    max-height: 128px;\n    max-width: 128px\n  }\n\n  .media-list-subtitle {\n    display: block\n  }\n\n  .media-list-title {\n    display: block\n  }\n\n  #wpbody-content #async-upload-wrap a {\n    display: none\n  }\n\n  .media-upload-form {\n    margin-top: 20px\n  }\n\n  .media-upload-form td label {\n    margin-right: 6px;\n    margin-left: 2px\n  }\n\n  .media-upload-form .align .field label {\n    display: inline;\n    padding: 0 0 0 23px;\n    margin: 0 1em 0 3px;\n    font-weight: 600\n  }\n\n  .media-upload-form tr.image-size label {\n    margin: 0 0 0 5px;\n    font-weight: 600\n  }\n\n  .media-upload-form th.label label {\n    font-weight: 600;\n    margin: .5em;\n    font-size: 13px\n  }\n\n  .media-upload-form th.label label span {\n    padding: 0 5px\n  }\n\n  .media-item .describe input[type=text], .media-item .describe textarea {\n    width: 460px\n  }\n\n  .media-item .describe p.help {\n    margin: 0;\n    padding: 0 0 0 5px\n  }\n\n  .describe-toggle-off, .describe-toggle-on {\n    display: block;\n    line-height: 2.76923076;\n    float: right;\n    margin-right: 10px\n  }\n\n  .media-item-wrapper {\n    display: grid;\n    grid-template-columns:1fr 1fr\n  }\n\n  .media-item .attachment-tools {\n    display: flex;\n    justify-content: flex-end;\n    align-items: center\n  }\n\n  .media-item .edit-attachment {\n    padding: 14px 0;\n    display: block;\n    margin-right: 10px\n  }\n\n  .media-item .edit-attachment.copy-to-clipboard-container {\n    margin-top: 0\n  }\n\n  .media-item-copy-container .success {\n    line-height: 0\n  }\n\n  .media-item button .copy-attachment-url {\n    margin-top: 14px\n  }\n\n  .media-item .copy-to-clipboard-container {\n    margin-top: 7px\n  }\n\n  .media-item .describe-toggle-off, .media-item.open .describe-toggle-on {\n    display: none\n  }\n\n  .media-item.open .describe-toggle-off {\n    display: block\n  }\n\n  .media-upload-form .media-item {\n    min-height: 70px;\n    margin-bottom: 1px;\n    position: relative;\n    width: 100%;\n    background: #fff\n  }\n\n  .media-upload-form .media-item, .media-upload-form .media-item .error {\n    box-shadow: 0 1px 0 #dcdcde\n  }\n\n  #media-items:empty {\n    border: 0 none\n  }\n\n  .media-item .filename {\n    padding: 14px 0;\n    overflow: hidden;\n    margin-left: 6px\n  }\n\n  .media-item .pinkynail {\n    float: left;\n    margin: 0 10px 0 0;\n    max-height: 70px;\n    max-width: 70px\n  }\n\n  .media-item .startclosed, .media-item .startopen {\n    display: none\n  }\n\n  .media-item .original {\n    position: relative;\n    height: 34px\n  }\n\n  .media-item .progress {\n    float: right;\n    height: 22px;\n    margin: 7px 6px;\n    width: 200px;\n    line-height: 2em;\n    padding: 0;\n    overflow: hidden;\n    border-radius: 22px;\n    background: #dcdcde;\n    box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1)\n  }\n\n  .media-item .bar {\n    z-index: 9;\n    width: 0;\n    height: 100%;\n    margin-top: -22px;\n    border-radius: 22px;\n    background-color: #2271b1;\n    box-shadow: inset 0 0 2px rgba(0, 0, 0, .3)\n  }\n\n  .media-item .progress .percent {\n    z-index: 10;\n    position: relative;\n    width: 200px;\n    padding: 0;\n    color: #fff;\n    text-align: center;\n    line-height: 22px;\n    font-weight: 400;\n    text-shadow: 0 1px 2px rgba(0, 0, 0, .2)\n  }\n\n  .upload-php .fixed .column-parent {\n    width: 15%\n  }\n\n  .js .html-uploader #plupload-upload-ui {\n    display: none\n  }\n\n  .js .html-uploader #html-upload-ui {\n    display: block\n  }\n\n  #html-upload-ui #async-upload {\n    font-size: 1em\n  }\n\n  .media-upload-form .media-item .error, .media-upload-form .media-item.error {\n    width: auto;\n    margin: 0 0 1px\n  }\n\n  .media-upload-form .media-item .error {\n    padding: 10px 0 10px 14px;\n    min-height: 50px\n  }\n\n  .media-item .error-div button.dismiss {\n    float: right;\n    margin: 0 10px 0 15px\n  }\n\n  .find-box {\n    background-color: #fff;\n    box-shadow: 0 3px 6px rgba(0, 0, 0, .3);\n    width: 600px;\n    overflow: hidden;\n    margin-left: -300px;\n    position: fixed;\n    top: 30px;\n    bottom: 30px;\n    left: 50%;\n    z-index: 100105\n  }\n\n  .find-box-head {\n    background: #fff;\n    border-bottom: 1px solid #dcdcde;\n    height: 36px;\n    font-size: 18px;\n    font-weight: 600;\n    line-height: 2;\n    padding: 0 36px 0 16px;\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0\n  }\n\n  .find-box-inside {\n    overflow: auto;\n    padding: 16px;\n    background-color: #fff;\n    position: absolute;\n    top: 37px;\n    bottom: 45px;\n    overflow-y: scroll;\n    width: 100%;\n    box-sizing: border-box\n  }\n\n  .find-box-search {\n    padding-bottom: 16px\n  }\n\n  .find-box-search .spinner {\n    float: none;\n    left: 105px;\n    position: absolute\n  }\n\n  #find-posts-response, .find-box-search {\n    position: relative\n  }\n\n  #find-posts-input, #find-posts-search {\n    float: left\n  }\n\n  #find-posts-input {\n    width: 140px;\n    height: 28px;\n    margin: 0 4px 0 0\n  }\n\n  .widefat .found-radio {\n    padding-right: 0;\n    width: 16px\n  }\n\n  #find-posts-close {\n    width: 36px;\n    height: 36px;\n    border: none;\n    padding: 0;\n    position: absolute;\n    top: 0;\n    right: 0;\n    cursor: pointer;\n    text-align: center;\n    background: 0 0;\n    color: #646970\n  }\n\n  #find-posts-close:focus, #find-posts-close:hover {\n    color: #135e96\n  }\n\n  #find-posts-close:focus {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8);\n    outline: 2px solid transparent;\n    outline-offset: -2px\n  }\n\n  #find-posts-close:before {\n    font: normal 20px/36px dashicons;\n    vertical-align: top;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    content: \"\\f158\"\n  }\n\n  .find-box-buttons {\n    padding: 8px 16px;\n    background: #fff;\n    border-top: 1px solid #dcdcde;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    right: 0\n  }\n\n  @media screen and (max-width: 782px) {\n    .find-box-inside {\n      bottom: 57px\n    }\n  }\n  @media screen and (max-width: 660px) {\n    .find-box {\n      top: 0;\n      bottom: 0;\n      left: 0;\n      right: 0;\n      margin: 0;\n      width: 100%\n    }\n  }\n\n  .ui-find-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: #000;\n    opacity: .7;\n    z-index: 100100\n  }\n\n  .drag-drop #drag-drop-area {\n    border: 4px dashed #c3c4c7;\n    height: 200px\n  }\n\n  .drag-drop .drag-drop-inside {\n    margin: 60px auto 0;\n    width: 250px\n  }\n\n  .drag-drop-inside p {\n    font-size: 14px;\n    margin: 5px 0;\n    display: none\n  }\n\n  .drag-drop .drag-drop-inside p {\n    text-align: center\n  }\n\n  .drag-drop-inside p.drag-drop-info {\n    font-size: 20px\n  }\n\n  .drag-drop .drag-drop-inside p, .drag-drop-inside p.drag-drop-buttons {\n    display: block\n  }\n\n  .drag-drop.drag-over #drag-drop-area {\n    border-color: #9ec2e6\n  }\n\n  #plupload-upload-ui {\n    position: relative\n  }\n\n  .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 {\n    position: static\n  }\n\n  .media-frame.mode-grid .media-frame-menu, .media-frame.mode-grid .media-frame-router, .media-frame.mode-grid .media-frame-title {\n    display: none\n  }\n\n  .media-frame.mode-grid .media-frame-content {\n    background-color: transparent;\n    border: none\n  }\n\n  .upload-php .mode-grid .media-sidebar {\n    position: relative;\n    width: auto;\n    margin-top: 12px;\n    padding: 0 16px;\n    border-left: 4px solid #d63638;\n    box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);\n    background-color: #fff\n  }\n\n  .upload-php .mode-grid .hide-sidebar .media-sidebar {\n    display: none\n  }\n\n  .upload-php .mode-grid .media-sidebar .media-uploader-status {\n    border-bottom: none;\n    padding-bottom: 0;\n    max-width: 100%\n  }\n\n  .upload-php .mode-grid .media-sidebar .upload-error {\n    margin: 12px 0;\n    padding: 4px 0 0;\n    border: none;\n    box-shadow: none;\n    background: 0 0\n  }\n\n  .upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2 {\n    display: none\n  }\n\n  .media-frame.mode-grid .uploader-inline {\n    position: relative;\n    top: auto;\n    right: auto;\n    left: auto;\n    bottom: auto;\n    padding-top: 0;\n    margin-top: 20px;\n    border: 4px dashed #c3c4c7\n  }\n\n  .media-frame.mode-select .attachments-browser.fixed:not(.has-load-more) .attachments, .media-frame.mode-select .attachments-browser.has-load-more.fixed .attachments-wrapper {\n    position: relative;\n    top: 94px;\n    padding-bottom: 94px\n  }\n\n  .media-frame.mode-grid .attachment.details:focus, .media-frame.mode-grid .attachment:focus, .media-frame.mode-grid .selected.attachment:focus {\n    box-shadow: inset 0 0 2px 3px #f0f0f1, inset 0 0 0 7px #4f94d4;\n    outline: 2px solid transparent;\n    outline-offset: -6px\n  }\n\n  .media-frame.mode-grid .selected.attachment {\n    box-shadow: inset 0 0 0 5px #f0f0f1, inset 0 0 0 7px #c3c4c7\n  }\n\n  .media-frame.mode-grid .attachment.details {\n    box-shadow: inset 0 0 0 3px #f0f0f1, inset 0 0 0 7px #4f94d4\n  }\n\n  .media-frame.mode-grid.mode-select .attachment .thumbnail {\n    opacity: .65\n  }\n\n  .media-frame.mode-select .attachment.selected .thumbnail {\n    opacity: 1\n  }\n\n  .media-frame.mode-grid .media-toolbar {\n    margin-bottom: 15px;\n    height: auto\n  }\n\n  .media-frame.mode-grid .media-toolbar select {\n    margin: 0 10px 0 0\n  }\n\n  .media-frame.mode-grid.mode-edit .media-toolbar-secondary > .select-mode-toggle-button {\n    margin: 0 8px 0 0;\n    vertical-align: middle\n  }\n\n  .media-frame.mode-grid .attachments-browser .bulk-select {\n    display: inline-block;\n    margin: 0 10px 0 0\n  }\n\n  .media-frame.mode-grid .search {\n    margin-top: 0\n  }\n\n  .media-search-input-label {\n    margin: 0 .2em 0 0;\n    vertical-align: baseline\n  }\n\n  .media-frame.mode-grid .media-search-input-label {\n    position: static;\n    margin: 0 .5em 0 0\n  }\n\n  .attachments-browser .media-toolbar-secondary > .media-button {\n    margin-right: 10px\n  }\n\n  .media-frame.mode-select .attachments-browser.fixed .media-toolbar {\n    position: fixed;\n    top: 32px;\n    left: auto;\n    right: 20px;\n    margin-top: 0\n  }\n\n  .media-frame.mode-grid .attachments-browser {\n    padding: 0\n  }\n\n  .media-frame.mode-grid .attachments-browser .attachments {\n    padding: 2px\n  }\n\n  .media-frame.mode-grid .attachments-browser .no-media {\n    color: #646970;\n    font-size: 18px;\n    font-style: normal;\n    margin: 0;\n    padding: 100px 0 0;\n    text-align: center\n  }\n\n  .edit-attachment-frame {\n    display: block;\n    height: 100%;\n    width: 100%\n  }\n\n  .edit-attachment-frame .edit-media-header {\n    overflow: hidden\n  }\n\n  .upload-php .media-modal-close .media-modal-icon:before {\n    content: \"\\f335\";\n    font-size: 22px\n  }\n\n  .edit-attachment-frame .edit-media-header .left, .edit-attachment-frame .edit-media-header .right, .upload-php .media-modal-close {\n    cursor: pointer;\n    color: #787c82;\n    background-color: transparent;\n    height: 50px;\n    width: 50px;\n    padding: 0;\n    position: absolute;\n    text-align: center;\n    border: 0;\n    border-left: 1px solid #dcdcde;\n    transition: color .1s ease-in-out, background .1s ease-in-out\n  }\n\n  .upload-php .media-modal-close {\n    top: 0;\n    right: 0\n  }\n\n  .edit-attachment-frame .edit-media-header .left {\n    right: 102px\n  }\n\n  .edit-attachment-frame .edit-media-header .right {\n    right: 51px\n  }\n\n  .edit-attachment-frame .media-frame-title {\n    left: 0;\n    right: 150px\n  }\n\n  .edit-attachment-frame .edit-media-header .left:before, .edit-attachment-frame .edit-media-header .right:before {\n    font: normal 20px/50px dashicons !important;\n    display: inline;\n    font-weight: 300\n  }\n\n  .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 {\n    background: #dcdcde;\n    border-color: #c3c4c7;\n    color: #000;\n    outline: 0;\n    box-shadow: none\n  }\n\n  .edit-attachment-frame .edit-media-header .left:focus, .edit-attachment-frame .edit-media-header .right:focus, .upload-php .media-modal-close:focus {\n    outline: 2px solid transparent;\n    outline-offset: -2px\n  }\n\n  .upload-php .media-modal-close:focus .media-modal-icon:before, .upload-php .media-modal-close:hover .media-modal-icon:before {\n    color: #000\n  }\n\n  .edit-attachment-frame .edit-media-header .left:before {\n    content: \"\\f341\"\n  }\n\n  .edit-attachment-frame .edit-media-header .right:before {\n    content: \"\\f345\"\n  }\n\n  .edit-attachment-frame .edit-media-header [disabled], .edit-attachment-frame .edit-media-header [disabled]:hover {\n    color: #c3c4c7;\n    background: inherit;\n    cursor: default\n  }\n\n  .edit-attachment-frame .media-frame-content, .edit-attachment-frame .media-frame-router {\n    left: 0\n  }\n\n  .edit-attachment-frame .media-frame-content {\n    border-bottom: none;\n    bottom: 0;\n    top: 50px\n  }\n\n  .edit-attachment-frame .attachment-details {\n    position: absolute;\n    overflow: auto;\n    top: 0;\n    bottom: 0;\n    right: 0;\n    left: 0;\n    box-shadow: inset 0 4px 4px -4px rgba(0, 0, 0, .1)\n  }\n\n  .edit-attachment-frame .attachment-media-view {\n    float: left;\n    width: 65%;\n    height: 100%\n  }\n\n  .edit-attachment-frame .attachment-media-view .thumbnail {\n    box-sizing: border-box;\n    padding: 16px;\n    height: 100%\n  }\n\n  .edit-attachment-frame .attachment-media-view .details-image {\n    display: block;\n    margin: 0 auto 16px;\n    max-width: 100%;\n    max-height: 90%;\n    max-height: calc(100% - 42px);\n    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);\n    background-position: 0 0, 10px 10px;\n    background-size: 20px 20px\n  }\n\n  .edit-attachment-frame .attachment-media-view .details-image.icon {\n    background: 0 0\n  }\n\n  .edit-attachment-frame .attachment-media-view .attachment-actions {\n    text-align: center\n  }\n\n  .edit-attachment-frame .wp-media-wrapper {\n    margin-bottom: 12px\n  }\n\n  .edit-attachment-frame input, .edit-attachment-frame textarea {\n    padding: 6px 8px;\n    line-height: 1.14285714\n  }\n\n  .edit-attachment-frame .attachment-info {\n    overflow: auto;\n    box-sizing: border-box;\n    margin-bottom: 0;\n    padding: 12px 16px 0;\n    width: 35%;\n    height: 100%;\n    box-shadow: inset 0 4px 4px -4px rgba(0, 0, 0, .1);\n    border-bottom: 0;\n    border-left: 1px solid #dcdcde;\n    background: #f6f7f7\n  }\n\n  .edit-attachment-frame .attachment-info .details, .edit-attachment-frame .attachment-info .settings {\n    position: relative;\n    overflow: hidden;\n    float: none;\n    margin-bottom: 15px;\n    padding-bottom: 15px;\n    border-bottom: 1px solid #dcdcde\n  }\n\n  .edit-attachment-frame .attachment-info .filename {\n    font-weight: 400;\n    color: #646970\n  }\n\n  .edit-attachment-frame .attachment-info .thumbnail {\n    margin-bottom: 12px\n  }\n\n  .attachment-info .actions {\n    margin-bottom: 16px\n  }\n\n  .attachment-info .actions a {\n    display: inline;\n    text-decoration: none\n  }\n\n  .copy-to-clipboard-container {\n    display: flex;\n    align-items: center;\n    margin-top: 8px;\n    clear: both\n  }\n\n  .copy-to-clipboard-container .copy-attachment-url {\n    white-space: normal\n  }\n\n  .copy-to-clipboard-container .success {\n    color: #008a20;\n    margin-left: 8px\n  }\n\n  .wp_attachment_details .attachment-alt-text {\n    margin-bottom: 5px\n  }\n\n  .wp_attachment_details .attachment-alt-text-description {\n    margin-top: 5px\n  }\n\n  .wp_attachment_details label[for=content] {\n    font-size: 13px;\n    line-height: 1.5;\n    margin: 1em 0\n  }\n\n  .wp_attachment_details #attachment_caption {\n    height: 4em\n  }\n\n  .describe .image-editor {\n    vertical-align: top\n  }\n\n  .imgedit-wrap {\n    position: relative;\n    padding-top: 10px\n  }\n\n  .imgedit-settings fieldset, .imgedit-settings p {\n    margin: 8px 0\n  }\n\n  .imgedit-settings legend {\n    margin-bottom: 5px\n  }\n\n  .describe .imgedit-wrap .imgedit-settings {\n    padding: 0 5px\n  }\n\n  .wp_attachment_holder div.updated {\n    margin-top: 0\n  }\n\n  .wp_attachment_holder .imgedit-wrap > div {\n    height: auto\n  }\n\n  .wp_attachment_holder .imgedit-wrap .imgedit-panel-content {\n    float: left;\n    padding: 3px 16px 0 0;\n    min-width: 400px;\n    max-width: calc(100% - 266px)\n  }\n\n  .wp_attachment_holder .imgedit-wrap .imgedit-settings {\n    float: right;\n    width: 250px\n  }\n\n  .imgedit-settings input {\n    margin-top: 0;\n    vertical-align: middle\n  }\n\n  .imgedit-wait {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    width: 100%;\n    background: #fff;\n    opacity: .7;\n    display: none\n  }\n\n  .imgedit-wait:before {\n    content: \"\";\n    display: block;\n    width: 20px;\n    height: 20px;\n    position: absolute;\n    left: 50%;\n    top: 50%;\n    margin: -10px 0 0 -10px;\n    background: transparent url(images/spinner.gif) no-repeat center;\n    background-size: 20px 20px;\n    transform: translateZ(0)\n  }\n\n  .no-float {\n    float: none\n  }\n\n  .imgedit-settings .disabled, .media-disabled {\n    color: #a7aaad\n  }\n\n  .A1B1 {\n    overflow: hidden\n  }\n\n  .A1B1 .button, .wp_attachment_image .button {\n    float: left\n  }\n\n  .no-js .wp_attachment_image .button {\n    display: none\n  }\n\n  .A1B1 .spinner, .wp_attachment_image .spinner {\n    float: left\n  }\n\n  .imgedit-menu {\n    margin: 0 0 12px\n  }\n\n  .imgedit-menu .note-no-rotate {\n    clear: both;\n    margin: 0;\n    padding: 1em 0 0\n  }\n\n  .image-editor .imgedit-menu .button {\n    display: inline-block;\n    width: auto;\n    min-height: 28px;\n    font-size: 13px;\n    line-height: 2;\n    margin: 0 8px 8px 0;\n    padding: 0 10px\n  }\n\n  .imgedit-menu .button:before {\n    font: normal 16px/1 dashicons;\n    margin-right: 8px;\n    speak: never;\n    vertical-align: middle;\n    position: relative;\n    top: -2px;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .imgedit-menu .button.disabled {\n    color: #a7aaad;\n    border-color: #dcdcde;\n    background: #f6f7f7;\n    box-shadow: none;\n    text-shadow: 0 1px 0 #fff;\n    cursor: default;\n    transform: none\n  }\n\n  .imgedit-crop:before {\n    content: \"\\f165\"\n  }\n\n  .imgedit-rleft:before {\n    content: \"\\f166\"\n  }\n\n  .imgedit-rright:before {\n    content: \"\\f167\"\n  }\n\n  .imgedit-flipv:before {\n    content: \"\\f168\"\n  }\n\n  .imgedit-fliph:before {\n    content: \"\\f169\"\n  }\n\n  .imgedit-undo:before {\n    content: \"\\f171\"\n  }\n\n  .imgedit-redo:before {\n    content: \"\\f172\"\n  }\n\n  .imgedit-crop-wrap {\n    position: relative\n  }\n\n  .imgedit-crop-wrap img {\n    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);\n    background-position: 0 0, 10px 10px;\n    background-size: 20px 20px\n  }\n\n  .imgedit-crop {\n    margin: 0 8px 0 0\n  }\n\n  .imgedit-rleft {\n    margin: 0 3px\n  }\n\n  .imgedit-rright {\n    margin: 0 8px 0 3px\n  }\n\n  .imgedit-flipv {\n    margin: 0 3px\n  }\n\n  .imgedit-fliph {\n    margin: 0 8px 0 3px\n  }\n\n  .imgedit-undo {\n    margin: 0 3px\n  }\n\n  .imgedit-redo {\n    margin: 0 8px 0 3px\n  }\n\n  .imgedit-thumbnail-preview {\n    margin: 10px 8px 0 0\n  }\n\n  .imgedit-thumbnail-preview-caption {\n    display: block\n  }\n\n  #poststuff .imgedit-group-top h2 {\n    display: inline-block;\n    margin: 0;\n    padding: 0;\n    font-size: 14px;\n    line-height: 1.4\n  }\n\n  #poststuff .imgedit-group-top .button-link {\n    text-decoration: none;\n    color: #1d2327\n  }\n\n  .imgedit-applyto .imgedit-label {\n    display: block;\n    padding: .5em 0 0\n  }\n\n  .imgedit-help {\n    display: none;\n    padding-bottom: 8px\n  }\n\n  .imgedit-help.imgedit-restore {\n    padding-bottom: 0\n  }\n\n  .image-editor .imgedit-settings .imgedit-help-toggle, .image-editor .imgedit-settings .imgedit-help-toggle:active, .image-editor .imgedit-settings .imgedit-help-toggle:hover {\n    border: 1px solid transparent;\n    margin: -1px 0 0 -1px;\n    padding: 0;\n    background: 0 0;\n    color: #2271b1;\n    font-size: 20px;\n    line-height: 1;\n    cursor: pointer;\n    box-sizing: content-box;\n    box-shadow: none\n  }\n\n  .image-editor .imgedit-settings .imgedit-help-toggle:focus {\n    color: #2271b1;\n    border-color: #4f94d4;\n    box-shadow: 0 0 3px rgba(34, 113, 177, .8);\n    outline: 2px solid transparent\n  }\n\n  .form-table td.imgedit-response {\n    padding: 0\n  }\n\n  .imgedit-submit {\n    margin: 8px 0 0\n  }\n\n  .imgedit-submit-btn {\n    margin-left: 20px\n  }\n\n  .imgedit-wrap .nowrap {\n    white-space: nowrap;\n    font-size: 12px;\n    line-height: inherit\n  }\n\n  span.imgedit-scale-warn {\n    color: #d63638;\n    font-size: 20px;\n    font-style: normal;\n    visibility: hidden;\n    vertical-align: middle\n  }\n\n  .imgedit-save-target {\n    margin: 8px 0\n  }\n\n  .imgedit-save-target legend {\n    font-weight: 600\n  }\n\n  .imgedit-group {\n    margin-bottom: 8px;\n    padding: 10px\n  }\n\n  .imgedit-settings .imgedit-original-dimensions {\n    display: inline-block\n  }\n\n  .imgedit-settings .imgedit-crop-ratio input[type=text], .imgedit-settings .imgedit-crop-sel input[type=text], .imgedit-settings .imgedit-scale input[type=text] {\n    width: 80px;\n    font-size: 14px;\n    padding: 0 8px\n  }\n\n  .imgedit-separator {\n    display: inline-block;\n    width: 7px;\n    text-align: center;\n    font-size: 13px;\n    color: #3c434a\n  }\n\n  .imgedit-settings .imgedit-scale-button-wrapper {\n    margin-top: .3077em;\n    display: block\n  }\n\n  .imgedit-settings .imgedit-scale .button {\n    margin-bottom: 0\n  }\n\n  audio, video {\n    display: inline-block;\n    max-width: 100%\n  }\n\n  .wp-core-ui .mejs-container {\n    width: 100%;\n    max-width: 100%\n  }\n\n  .wp-core-ui .mejs-container * {\n    box-sizing: border-box\n  }\n\n  .wp-core-ui .mejs-time {\n    box-sizing: content-box\n  }\n\n  @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {\n    .imgedit-wait:before {\n      background-image: url(images/spinner-2x.gif)\n    }\n  }\n  @media screen and (max-width: 782px) {\n    .wp_attachment_details label[for=content] {\n      font-size: 14px;\n      line-height: 1.5\n    }\n    .media-upload-form .media-item .error, .media-upload-form .media-item.error {\n      font-size: 13px;\n      line-height: 1.5\n    }\n    .media-upload-form .media-item.error {\n      padding: 1px 10px\n    }\n    .media-upload-form .media-item .error {\n      padding: 10px 0 10px 12px\n    }\n    .imgedit-settings .imgedit-crop-ratio input[type=text], .imgedit-settings .imgedit-crop-sel input[type=text], .imgedit-settings .imgedit-scale input[type=text] {\n      font-size: 16px;\n      padding: 6px 10px\n    }\n    .wp_attachment_holder .imgedit-wrap .imgedit-panel-content, .wp_attachment_holder .imgedit-wrap .imgedit-settings {\n      float: none;\n      width: auto;\n      max-width: none;\n      padding-bottom: 16px\n    }\n    .copy-to-clipboard-container .success {\n      font-size: 14px\n    }\n  }\n  @media only screen and (max-width: 600px) {\n    .media-item-wrapper {\n      grid-template-columns:1fr\n    }\n  }\n  @media only screen and (max-width: 1120px) {\n    #wp-media-grid .wp-filter .attachment-filters {\n      max-width: 100%\n    }\n  }\n  @media only screen and (max-width: 782px) {\n    .media-frame.mode-select .attachments-browser.fixed .media-toolbar {\n      top: 46px;\n      right: 10px\n    }\n  }\n  @media only screen and (max-width: 600px) {\n    .media-frame.mode-select .attachments-browser.fixed .media-toolbar {\n      top: 0\n    }\n  }\n  @media only screen and (max-width: 480px) {\n    .edit-attachment-frame .media-frame-title {\n      right: 110px\n    }\n    .edit-attachment-frame .edit-media-header .left, .edit-attachment-frame .edit-media-header .right, .upload-php .media-modal-close {\n      width: 40px;\n      height: 40px\n    }\n    .edit-attachment-frame .edit-media-header .left:before, .edit-attachment-frame .edit-media-header .right:before {\n      line-height: 40px !important\n    }\n    .edit-attachment-frame .edit-media-header .left {\n      right: 82px\n    }\n    .edit-attachment-frame .edit-media-header .right {\n      right: 41px\n    }\n    .edit-attachment-frame .media-frame-content {\n      top: 40px\n    }\n    .edit-attachment-frame .attachment-media-view {\n      float: none;\n      height: auto;\n      width: 100%\n    }\n    .edit-attachment-frame .attachment-info {\n      height: auto;\n      width: 100%\n    }\n  }\n  @media only screen and (max-width: 640px), screen and (max-height: 400px) {\n    .upload-php .mode-grid .media-sidebar {\n      max-width: 100%\n    }\n  }\n  /*! This file is auto-generated */\n  .themes-php {\n    overflow-y: scroll\n  }\n\n  body.js .theme-browser.search-loading {\n    display: none\n  }\n\n  .theme-browser .themes {\n    clear: both\n  }\n\n  .themes-php:not(.network-admin) .wrap h1 {\n    margin-bottom: 15px\n  }\n\n  .themes-php .wrap h1 .button {\n    margin-left: 20px\n  }\n\n  .themes-php .search-form {\n    display: inline\n  }\n\n  .themes-php .wp-filter-search {\n    position: relative;\n    top: -2px;\n    left: 20px;\n    margin: 0;\n    width: 280px\n  }\n\n  .theme .notice, .theme .notice.is-dismissible {\n    left: 0;\n    margin: 0;\n    position: absolute;\n    right: 0;\n    top: 0\n  }\n\n  .theme-browser .theme {\n    cursor: pointer;\n    float: left;\n    margin: 0 4% 4% 0;\n    position: relative;\n    width: 30.6%;\n    border: 1px solid #dcdcde;\n    box-shadow: 0 1px 1px -1px rgba(0, 0, 0, .1);\n    box-sizing: border-box\n  }\n\n  .theme-browser .theme:nth-child(3n) {\n    margin-right: 0\n  }\n\n  .theme-browser .theme.focus, .theme-browser .theme:hover {\n    cursor: pointer\n  }\n\n  .theme-browser .theme .theme-name {\n    font-size: 15px;\n    font-weight: 600;\n    height: 18px;\n    margin: 0;\n    padding: 15px;\n    box-shadow: inset 0 1px 0 rgba(0, 0, 0, .1);\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    background: #fff;\n    background: rgba(255, 255, 255, .65)\n  }\n\n  .theme-browser .theme .theme-actions {\n    opacity: 0;\n    transition: opacity .1s ease-in-out;\n    height: auto;\n    background: rgba(246, 247, 247, .7);\n    border-left: 1px solid rgba(0, 0, 0, .05)\n  }\n\n  .theme-browser .theme.focus .theme-actions, .theme-browser .theme:hover .theme-actions {\n    opacity: 1\n  }\n\n  .theme-browser .theme .theme-actions .button-primary {\n    margin-right: 3px\n  }\n\n  .theme-browser .theme .theme-actions .button {\n    float: none;\n    margin-left: 3px\n  }\n\n  .theme-browser .theme .theme-screenshot {\n    display: block;\n    overflow: hidden;\n    position: relative;\n    -webkit-backface-visibility: hidden;\n    transition: opacity .2s ease-in-out\n  }\n\n  .theme-browser .theme .theme-screenshot:after {\n    content: \"\";\n    display: block;\n    padding-top: 66.66666%\n  }\n\n  .theme-browser .theme .theme-screenshot img {\n    height: auto;\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    transition: opacity .2s ease-in-out\n  }\n\n  .theme-browser .theme.focus .theme-screenshot, .theme-browser .theme:hover .theme-screenshot {\n    background: #fff\n  }\n\n  .theme-browser.rendered .theme.focus .theme-screenshot img, .theme-browser.rendered .theme:hover .theme-screenshot img {\n    opacity: .4\n  }\n\n  .theme-browser .theme .more-details {\n    opacity: 0;\n    position: absolute;\n    top: 35%;\n    right: 20%;\n    left: 20%;\n    width: 60%;\n    background: #1d2327;\n    background: rgba(0, 0, 0, .7);\n    color: #fff;\n    font-size: 15px;\n    text-shadow: 0 1px 0 rgba(0, 0, 0, .6);\n    -webkit-font-smoothing: antialiased;\n    font-weight: 600;\n    padding: 15px 12px;\n    text-align: center;\n    border-radius: 3px;\n    border: none;\n    transition: opacity .1s ease-in-out\n  }\n\n  .theme-browser .theme .more-details:focus {\n    box-shadow: 0 0 0 1px #fff, 0 0 0 3px #2271b1\n  }\n\n  .theme-browser .theme.focus {\n    border-color: #4f94d4;\n    box-shadow: 0 0 2px rgba(79, 148, 212, .8)\n  }\n\n  .theme-browser .theme.focus .more-details {\n    opacity: 1\n  }\n\n  .theme-browser .theme.active.focus .theme-actions {\n    display: block\n  }\n\n  .theme-browser.rendered .theme.focus .more-details, .theme-browser.rendered .theme:hover .more-details {\n    opacity: 1\n  }\n\n  .theme-browser .theme.active .theme-name {\n    background: #1d2327;\n    color: #fff;\n    padding-right: 110px;\n    font-weight: 300;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .5)\n  }\n\n  .theme-browser .customize-control .theme.active .theme-name {\n    padding-right: 15px\n  }\n\n  .theme-browser .theme.active .theme-name span {\n    font-weight: 600\n  }\n\n  .theme-browser .theme.active .theme-actions {\n    background: rgba(44, 51, 56, .7);\n    border-left: none;\n    opacity: 1\n  }\n\n  .theme-id-container {\n    position: relative\n  }\n\n  .theme-browser .theme .theme-actions, .theme-browser .theme.active .theme-actions {\n    position: absolute;\n    top: 50%;\n    transform: translateY(-50%);\n    right: 0;\n    padding: 9px 15px;\n    box-shadow: inset 0 1px 0 rgba(0, 0, 0, .1)\n  }\n\n  .theme-browser .theme.active .theme-actions .button-primary {\n    margin-right: 0\n  }\n\n  .theme-browser .theme .theme-author {\n    background: #1d2327;\n    color: #f0f0f1;\n    display: none;\n    font-size: 14px;\n    margin: 0 10px;\n    padding: 5px 10px;\n    position: absolute;\n    bottom: 56px\n  }\n\n  .theme-browser .theme.display-author .theme-author {\n    display: block\n  }\n\n  .theme-browser .theme.display-author .theme-author a {\n    color: inherit\n  }\n\n  .theme-browser .theme.add-new-theme {\n    border: none;\n    box-shadow: none\n  }\n\n  .theme-browser .theme.add-new-theme a {\n    text-decoration: none;\n    display: block;\n    position: relative;\n    z-index: 1\n  }\n\n  .theme-browser .theme.add-new-theme a:after {\n    display: block;\n    content: \"\";\n    background: 0 0;\n    background: rgba(0, 0, 0, 0);\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    padding: 0;\n    text-shadow: none;\n    border: 5px dashed #dcdcde;\n    border: 5px dashed rgba(0, 0, 0, .1);\n    box-sizing: border-box\n  }\n\n  .theme-browser .theme.add-new-theme span:after {\n    background: #dcdcde;\n    background: rgba(140, 143, 148, .1);\n    border-radius: 50%;\n    display: inline-block;\n    content: \"\\f132\";\n    -webkit-font-smoothing: antialiased;\n    font: normal 74px/115px dashicons;\n    width: 100px;\n    height: 100px;\n    vertical-align: middle;\n    text-align: center;\n    color: #8c8f94;\n    position: absolute;\n    top: 30%;\n    left: 50%;\n    margin-left: -50px;\n    text-indent: -4px;\n    padding: 0;\n    text-shadow: none;\n    z-index: 4\n  }\n\n  .rtl .theme-browser .theme.add-new-theme span:after {\n    text-indent: 4px\n  }\n\n  .theme-browser .theme.add-new-theme a:focus .theme-screenshot, .theme-browser .theme.add-new-theme a:hover .theme-screenshot {\n    background: 0 0\n  }\n\n  .theme-browser .theme.add-new-theme a:focus span:after, .theme-browser .theme.add-new-theme a:hover span:after {\n    background: #fff;\n    color: #2271b1\n  }\n\n  .theme-browser .theme.add-new-theme a:focus:after, .theme-browser .theme.add-new-theme a:hover:after {\n    border-color: transparent;\n    color: #fff;\n    background: #2271b1;\n    content: \"\"\n  }\n\n  .theme-browser .theme.add-new-theme .theme-name {\n    background: 0 0;\n    text-align: center;\n    box-shadow: none;\n    font-weight: 400;\n    position: relative;\n    top: 0;\n    margin-top: -18px;\n    padding-top: 0;\n    padding-bottom: 48px\n  }\n\n  .theme-browser .theme.add-new-theme a:focus .theme-name, .theme-browser .theme.add-new-theme a:hover .theme-name {\n    color: #fff;\n    z-index: 2\n  }\n\n  .theme-overlay .theme-backdrop {\n    position: absolute;\n    left: -20px;\n    right: 0;\n    top: 0;\n    bottom: 0;\n    background: #f0f0f1;\n    background: rgba(240, 240, 241, .9);\n    z-index: 10000\n  }\n\n  .theme-overlay .theme-header {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    height: 48px;\n    border-bottom: 1px solid #dcdcde\n  }\n\n  .theme-overlay .theme-header button {\n    padding: 0\n  }\n\n  .theme-overlay .theme-header .close {\n    cursor: pointer;\n    height: 48px;\n    width: 50px;\n    text-align: center;\n    float: right;\n    border: 0;\n    border-left: 1px solid #dcdcde;\n    background-color: transparent;\n    transition: color .1s ease-in-out, background .1s ease-in-out\n  }\n\n  .theme-overlay .theme-header .close:before {\n    font: normal 22px/50px dashicons !important;\n    color: #787c82;\n    display: inline-block;\n    content: \"\\f335\";\n    font-weight: 300\n  }\n\n  .theme-overlay .theme-header .left, .theme-overlay .theme-header .right {\n    cursor: pointer;\n    color: #787c82;\n    background-color: transparent;\n    height: 48px;\n    width: 54px;\n    float: left;\n    text-align: center;\n    border: 0;\n    border-right: 1px solid #dcdcde;\n    transition: color .1s ease-in-out, background .1s ease-in-out\n  }\n\n  .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 {\n    background: #dcdcde;\n    border-color: #c3c4c7;\n    color: #000\n  }\n\n  .theme-overlay .theme-header .close:focus:before, .theme-overlay .theme-header .close:hover:before {\n    color: #000\n  }\n\n  .theme-overlay .theme-header .close:focus, .theme-overlay .theme-header .left:focus, .theme-overlay .theme-header .right:focus {\n    box-shadow: none;\n    outline: 0\n  }\n\n  .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 {\n    color: #c3c4c7;\n    background: inherit;\n    cursor: inherit\n  }\n\n  .theme-overlay .theme-header .left:before, .theme-overlay .theme-header .right:before {\n    font: normal 20px/50px dashicons !important;\n    display: inline;\n    font-weight: 300\n  }\n\n  .theme-overlay .theme-header .left:before {\n    content: \"\\f341\"\n  }\n\n  .theme-overlay .theme-header .right:before {\n    content: \"\\f345\"\n  }\n\n  .theme-overlay .theme-wrap {\n    clear: both;\n    position: fixed;\n    top: 9%;\n    left: 190px;\n    right: 30px;\n    bottom: 3%;\n    background: #fff;\n    box-shadow: 0 1px 20px 5px rgba(0, 0, 0, .1);\n    z-index: 10000;\n    box-sizing: border-box;\n    -webkit-overflow-scrolling: touch\n  }\n\n  body.folded .theme-browser ~ .theme-overlay .theme-wrap {\n    left: 70px\n  }\n\n  .theme-overlay .theme-about {\n    position: absolute;\n    top: 49px;\n    bottom: 57px;\n    left: 0;\n    right: 0;\n    overflow: auto;\n    padding: 2% 4%\n  }\n\n  .theme-overlay .theme-actions {\n    position: absolute;\n    text-align: center;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    padding: 10px 25px 5px;\n    background: #f6f7f7;\n    z-index: 30;\n    box-sizing: border-box;\n    border-top: 1px solid #f0f0f1\n  }\n\n  .theme-overlay .theme-actions a {\n    margin-right: 5px;\n    margin-bottom: 5px\n  }\n\n  .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\"] {\n    display: none\n  }\n\n  .broken-themes a.delete-theme, .theme-overlay .theme-actions .delete-theme {\n    color: #d63638;\n    text-decoration: none;\n    border-color: transparent;\n    box-shadow: none;\n    background: 0 0\n  }\n\n  .theme-overlay .theme-actions .delete-theme {\n    position: absolute;\n    right: 10px;\n    bottom: 5px\n  }\n\n  .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 {\n    background: #d63638;\n    color: #fff;\n    border-color: #d63638\n  }\n\n  .theme-overlay .theme-actions .active-theme, .theme-overlay.active .theme-actions .inactive-theme {\n    display: none\n  }\n\n  .theme-overlay .theme-actions .inactive-theme, .theme-overlay.active .theme-actions .active-theme {\n    display: block\n  }\n\n  .theme-overlay .theme-screenshots {\n    float: left;\n    margin: 0 30px 0 0;\n    width: 55%;\n    max-width: 1200px;\n    text-align: center\n  }\n\n  .theme-overlay .screenshot {\n    border: 1px solid #fff;\n    box-sizing: border-box;\n    overflow: hidden;\n    position: relative;\n    box-shadow: 0 0 0 1px rgba(0, 0, 0, .2)\n  }\n\n  .theme-overlay .screenshot:after {\n    content: \"\";\n    display: block;\n    padding-top: 75%\n  }\n\n  .theme-overlay .screenshot img {\n    height: auto;\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%\n  }\n\n  .theme-overlay.small-screenshot .theme-screenshots {\n    position: absolute;\n    width: 302px\n  }\n\n  .theme-overlay.small-screenshot .theme-info {\n    margin-left: 350px;\n    width: auto\n  }\n\n  .theme-overlay .screenshot.thumb {\n    background: #c3c4c7;\n    border: 1px solid #f0f0f1;\n    float: none;\n    display: inline-block;\n    margin: 10px 5px 0;\n    width: 140px;\n    height: 80px;\n    cursor: pointer\n  }\n\n  .theme-overlay .screenshot.thumb:after {\n    content: \"\";\n    display: block;\n    padding-top: 100%\n  }\n\n  .theme-overlay .screenshot.thumb img {\n    cursor: pointer;\n    height: auto;\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: auto\n  }\n\n  .theme-overlay .screenshot.selected {\n    background: 0 0;\n    border: 2px solid #72aee6\n  }\n\n  .theme-overlay .screenshot.selected img {\n    opacity: .8\n  }\n\n  .theme-browser .theme .theme-screenshot.blank, .theme-overlay .screenshot.blank {\n    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=)\n  }\n\n  .theme-overlay .theme-info {\n    width: 40%;\n    float: left\n  }\n\n  .theme-overlay .current-label {\n    background: #2c3338;\n    color: #fff;\n    font-size: 11px;\n    display: inline-block;\n    padding: 2px 8px;\n    border-radius: 2px;\n    margin: 0 0 -10px;\n    -webkit-user-select: none;\n    user-select: none\n  }\n\n  .theme-overlay .theme-name {\n    color: #1d2327;\n    font-size: 32px;\n    font-weight: 100;\n    margin: 10px 0 0;\n    line-height: 1.3;\n    word-wrap: break-word;\n    overflow-wrap: break-word\n  }\n\n  .theme-overlay .theme-version {\n    color: #646970;\n    font-size: 13px;\n    font-weight: 400;\n    float: none;\n    display: inline-block;\n    margin-left: 10px\n  }\n\n  .theme-overlay .theme-author {\n    margin: 15px 0 25px;\n    color: #646970;\n    font-size: 16px;\n    font-weight: 400;\n    line-height: inherit\n  }\n\n  .theme-overlay .toggle-auto-update {\n    display: inline-flex;\n    align-items: center;\n    min-height: 20px;\n    vertical-align: top\n  }\n\n  .theme-overlay .theme-autoupdate .toggle-auto-update {\n    text-decoration: none\n  }\n\n  .theme-overlay .theme-autoupdate .toggle-auto-update .label {\n    text-decoration: underline\n  }\n\n  .theme-overlay .theme-description {\n    color: #50575e;\n    font-size: 15px;\n    font-weight: 400;\n    line-height: 1.5;\n    margin: 30px 0 0\n  }\n\n  .theme-overlay .theme-tags {\n    border-top: 3px solid #f0f0f1;\n    color: #646970;\n    font-size: 13px;\n    font-weight: 400;\n    margin: 30px 0 0;\n    padding-top: 20px\n  }\n\n  .theme-overlay .theme-tags span {\n    color: #3c434a;\n    font-weight: 600;\n    margin-right: 5px\n  }\n\n  .theme-overlay .parent-theme {\n    background: #fff;\n    border: 1px solid #f0f0f1;\n    border-left: 4px solid #72aee6;\n    font-size: 14px;\n    font-weight: 400;\n    margin-top: 30px;\n    padding: 10px 10px 10px 20px\n  }\n\n  .theme-overlay .parent-theme strong {\n    font-weight: 600\n  }\n\n  .single-theme .theme, .single-theme .theme-overlay .theme-backdrop, .single-theme .theme-overlay .theme-header {\n    display: none\n  }\n\n  .single-theme .theme-overlay .theme-wrap {\n    clear: both;\n    min-height: 330px;\n    position: relative;\n    left: auto;\n    right: auto;\n    top: auto;\n    bottom: auto;\n    z-index: 10\n  }\n\n  .single-theme .theme-overlay .theme-about {\n    padding: 30px 30px 70px;\n    position: static\n  }\n\n  .single-theme .theme-overlay .theme-actions {\n    position: absolute\n  }\n\n  @media only screen and (min-width: 2000px) {\n    #wpwrap .theme-browser .theme {\n      width: 17.6%;\n      margin: 0 3% 3% 0\n    }\n    #wpwrap .theme-browser .theme:nth-child(3n), #wpwrap .theme-browser .theme:nth-child(4n) {\n      margin-right: 3%\n    }\n    #wpwrap .theme-browser .theme:nth-child(5n) {\n      margin-right: 0\n    }\n  }\n  @media only screen and (min-width: 1680px) {\n    .theme-overlay .theme-wrap {\n      width: 1450px;\n      margin: 0 auto\n    }\n  }\n  @media only screen and (min-width: 1640px) {\n    .theme-browser .theme {\n      width: 22.7%;\n      margin: 0 3% 3% 0\n    }\n    .theme-browser .theme .theme-screenshot:after {\n      padding-top: 75%\n    }\n    .theme-browser .theme:nth-child(3n) {\n      margin-right: 3%\n    }\n    .theme-browser .theme:nth-child(4n) {\n      margin-right: 0\n    }\n  }\n  @media only screen and (max-width: 1120px) {\n    .theme-browser .theme {\n      width: 47.5%;\n      margin-right: 0\n    }\n    .theme-browser .theme:nth-child(even) {\n      margin-right: 0\n    }\n    .theme-browser .theme:nth-child(odd) {\n      margin-right: 5%\n    }\n  }\n  @media only screen and (max-width: 960px) {\n    .theme-overlay .theme-wrap {\n      left: 65px\n    }\n  }\n  @media only screen and (max-width: 780px) {\n    .theme-overlay .theme-wrap, body.folded .theme-overlay .theme-wrap {\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      padding: 70px 20px 20px;\n      border: none;\n      z-index: 100000;\n      position: fixed\n    }\n    .theme-browser .theme.active .theme-name span {\n      display: none\n    }\n    .theme-overlay .theme-screenshots {\n      width: 40%\n    }\n    .theme-overlay .theme-info {\n      width: 50%\n    }\n    .single-theme .theme-wrap {\n      padding: 10px\n    }\n    .theme-browser .theme .theme-actions {\n      padding: 5px 10px 4px\n    }\n    .theme-overlay.small-screenshot .theme-screenshots {\n      position: static;\n      float: none;\n      max-width: 302px\n    }\n    .theme-overlay.small-screenshot .theme-info {\n      margin-left: 0;\n      width: auto\n    }\n    .theme.focus .more-details, .theme:hover .more-details, .theme:not(.active):focus .theme-actions, .theme:not(.active):hover .theme-actions {\n      display: none\n    }\n    .theme-browser.rendered .theme.focus .theme-screenshot img, .theme-browser.rendered .theme:hover .theme-screenshot img {\n      opacity: 1\n    }\n  }\n  @media only screen and (max-width: 480px) {\n    .theme-browser .theme {\n      width: 100%;\n      margin-right: 0\n    }\n    .theme-browser .theme:nth-child(2n), .theme-browser .theme:nth-child(3n) {\n      margin-right: 0\n    }\n    .theme-overlay .theme-about {\n      bottom: 105px\n    }\n    .theme-overlay .theme-actions {\n      padding-left: 4%;\n      padding-right: 4%\n    }\n  }\n  @media only screen and (max-width: 650px) {\n    .theme-overlay .theme-description {\n      margin-left: 0\n    }\n    .theme-overlay .theme-actions .delete-theme {\n      position: relative;\n      right: auto;\n      bottom: auto\n    }\n    .theme-overlay .theme-actions .inactive-theme {\n      display: inline\n    }\n    .theme-overlay .theme-screenshots {\n      width: 100%;\n      float: none\n    }\n    .theme-overlay .theme-info {\n      width: 100%\n    }\n    .theme-overlay .theme-author {\n      margin: 5px 0 15px\n    }\n    .theme-overlay .current-label {\n      margin-top: 10px;\n      font-size: 13px\n    }\n    .themes-php .wp-filter-search {\n      float: none;\n      clear: both;\n      left: 0;\n      right: 0;\n      margin: -5px 0 20px;\n      width: 100%;\n      max-width: 280px\n    }\n    .theme-browser .theme.add-new-theme span:after {\n      font: normal 60px/90px dashicons;\n      width: 80px;\n      height: 80px;\n      top: 30%;\n      left: 50%;\n      text-indent: 0;\n      margin-left: -40px\n    }\n    .single-theme .theme-wrap {\n      margin: 0 -12px 0 -10px;\n      padding: 10px\n    }\n    .single-theme .theme-overlay .theme-about {\n      padding: 10px;\n      overflow: visible\n    }\n    .single-theme .current-label {\n      display: none\n    }\n    .single-theme .theme-overlay .theme-actions {\n      position: static\n    }\n  }\n\n  .broken-themes {\n    clear: both\n  }\n\n  .broken-themes table {\n    text-align: left;\n    width: 50%;\n    border-spacing: 3px;\n    padding: 3px\n  }\n\n  .update-php .wrap {\n    max-width: 40rem\n  }\n\n  .theme-browser .theme .theme-installed {\n    background: #2271b1\n  }\n\n  .theme-browser .theme .notice-success p:before {\n    color: #68de7c;\n    content: \"\\f147\";\n    display: inline-block;\n    font: normal 20px/1 dashicons;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    vertical-align: top\n  }\n\n  .theme-install.updated-message:before {\n    content: \"\"\n  }\n\n  .theme-install-php .wp-filter {\n    padding-left: 20px\n  }\n\n  .theme-install-php a.browse-themes, .theme-install-php a.upload {\n    cursor: pointer\n  }\n\n  .plugin-install-tab-upload .upload-view-toggle .upload, .upload-view-toggle .browse {\n    display: none\n  }\n\n  .plugin-install-tab-upload .upload-view-toggle .browse {\n    display: inline\n  }\n\n  .upload-plugin, .upload-theme {\n    box-sizing: border-box;\n    display: none;\n    margin: 0;\n    padding: 50px 0;\n    width: 100%;\n    overflow: hidden;\n    position: relative;\n    top: 10px;\n    text-align: center\n  }\n\n  .plugin-install-tab-upload .upload-plugin, .show-upload-view .upload-plugin, .show-upload-view .upload-plugin-wrap, .show-upload-view .upload-theme {\n    display: block\n  }\n\n  .upload-plugin .wp-upload-form, .upload-theme .wp-upload-form {\n    background: #f6f7f7;\n    border: 1px solid #c3c4c7;\n    padding: 30px;\n    margin: 30px auto;\n    display: inline-flex;\n    justify-content: space-between;\n    align-items: center\n  }\n\n  .upload-plugin .wp-upload-form input[type=file], .upload-theme .wp-upload-form input[type=file] {\n    margin-right: 10px\n  }\n\n  .upload-plugin .install-help, .upload-theme .install-help {\n    color: #50575e;\n    font-size: 18px;\n    font-style: normal;\n    margin: 0;\n    padding: 0;\n    text-align: center\n  }\n\n  p.no-themes, p.no-themes-local {\n    clear: both;\n    color: #646970;\n    font-size: 18px;\n    font-style: normal;\n    margin: 0;\n    padding: 100px 0;\n    text-align: center;\n    display: none\n  }\n\n  .no-results p.no-themes {\n    display: block\n  }\n\n  .theme-install-php .add-new-theme {\n    display: none !important\n  }\n\n  @media only screen and (max-width: 1120px) {\n    .upload-theme .wp-upload-form {\n      margin: 20px 0;\n      max-width: 100%\n    }\n    .upload-theme .install-help {\n      font-size: 15px;\n      padding: 20px 0 0\n    }\n  }\n\n  .theme-details .theme-rating {\n    line-height: 1.9\n  }\n\n  .theme-details .star-rating {\n    display: inline\n  }\n\n  .theme-details .no-rating, .theme-details .num-ratings {\n    font-size: 11px;\n    color: #646970\n  }\n\n  .theme-details .no-rating {\n    display: block;\n    line-height: 1.9\n  }\n\n  .update-from-upload-comparison {\n    border-top: 1px solid #dcdcde;\n    border-bottom: 1px solid #dcdcde;\n    text-align: left;\n    margin: 1rem 0 1.4rem;\n    border-collapse: collapse;\n    width: 100%\n  }\n\n  .update-from-upload-comparison tr:last-child td {\n    height: 1.4rem;\n    vertical-align: top\n  }\n\n  .update-from-upload-comparison tr:first-child th {\n    font-weight: 700;\n    height: 1.4rem;\n    vertical-align: bottom\n  }\n\n  .update-from-upload-comparison td.name-label {\n    text-align: right\n  }\n\n  .update-from-upload-comparison td, .update-from-upload-comparison th {\n    padding: .4rem 1.4rem\n  }\n\n  .update-from-upload-comparison td.warning {\n    color: #d63638\n  }\n\n  .update-from-upload-actions {\n    margin-top: 1.4rem\n  }\n\n  .appearance_page_custom-header #headimg {\n    border: 1px solid #dcdcde;\n    overflow: hidden;\n    width: 100%\n  }\n\n  .appearance_page_custom-header #upload-form p label {\n    font-size: 12px\n  }\n\n  .appearance_page_custom-header .available-headers .default-header {\n    float: left;\n    margin: 0 20px 20px 0\n  }\n\n  .appearance_page_custom-header .random-header {\n    clear: both;\n    margin: 0 20px 20px 0;\n    vertical-align: middle\n  }\n\n  .appearance_page_custom-header .available-headers label input, .appearance_page_custom-header .random-header label input {\n    margin-right: 10px\n  }\n\n  .appearance_page_custom-header .available-headers label img {\n    vertical-align: middle\n  }\n\n  div#custom-background-image {\n    min-height: 100px;\n    border: 1px solid #dcdcde\n  }\n\n  div#custom-background-image img {\n    max-width: 400px;\n    max-height: 300px\n  }\n\n  .background-position-control input[type=radio]:checked ~ .button {\n    background: #f0f0f1;\n    border-color: #8c8f94;\n    box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .5);\n    z-index: 1\n  }\n\n  .background-position-control input[type=radio]:focus ~ .button {\n    border-color: #4f94d4;\n    box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .5), 0 0 3px rgba(34, 113, 177, .8);\n    color: #1d2327\n  }\n\n  .background-position-control .background-position-center-icon, .background-position-control .background-position-center-icon:before {\n    display: inline-block;\n    line-height: 1;\n    text-align: center;\n    transition: background-color .1s ease-in\n  }\n\n  .background-position-control .background-position-center-icon {\n    height: 20px;\n    margin-top: 13px;\n    vertical-align: top;\n    width: 20px\n  }\n\n  .background-position-control .background-position-center-icon:before {\n    background-color: #50575e;\n    border-radius: 50%;\n    content: \"\";\n    height: 12px;\n    width: 12px\n  }\n\n  .background-position-control .button:hover .background-position-center-icon:before, .background-position-control input[type=radio]:focus ~ .button .background-position-center-icon:before {\n    background-color: #1d2327\n  }\n\n  .background-position-control .button-group {\n    display: block\n  }\n\n  .background-position-control .button-group .button {\n    border-radius: 0;\n    box-shadow: none;\n    height: 40px !important;\n    line-height: 2.9 !important;\n    margin: 0 -1px 0 0 !important;\n    padding: 0 10px 1px !important;\n    position: relative\n  }\n\n  .background-position-control .button-group .button:active, .background-position-control .button-group .button:focus, .background-position-control .button-group .button:hover {\n    z-index: 1\n  }\n\n  .background-position-control .button-group:last-child .button {\n    box-shadow: 0 1px 0 #c3c4c7\n  }\n\n  .background-position-control .button-group > label {\n    margin: 0 !important\n  }\n\n  .background-position-control .button-group:first-child > label:first-child .button {\n    border-radius: 3px 0 0\n  }\n\n  .background-position-control .button-group:first-child > label:first-child .dashicons {\n    transform: rotate(45deg)\n  }\n\n  .background-position-control .button-group:first-child > label:last-child .button {\n    border-radius: 0 3px 0 0\n  }\n\n  .background-position-control .button-group:first-child > label:last-child .dashicons {\n    transform: rotate(-45deg)\n  }\n\n  .background-position-control .button-group:last-child > label:first-child .button {\n    border-radius: 0 0 0 3px\n  }\n\n  .background-position-control .button-group:last-child > label:first-child .dashicons {\n    transform: rotate(-45deg)\n  }\n\n  .background-position-control .button-group:last-child > label:last-child .button {\n    border-radius: 0 0 3px\n  }\n\n  .background-position-control .button-group:last-child > label:last-child .dashicons {\n    transform: rotate(45deg)\n  }\n\n  .background-position-control .button-group .dashicons {\n    margin-top: 9px\n  }\n\n  .background-position-control .button-group + .button-group {\n    margin-top: -1px\n  }\n\n  body.full-overlay-active {\n    overflow: hidden;\n    visibility: hidden\n  }\n\n  .wp-full-overlay {\n    background: 0 0;\n    z-index: 500000;\n    position: fixed;\n    overflow: visible;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    height: 100%;\n    min-width: 0\n  }\n\n  .wp-full-overlay-sidebar {\n    box-sizing: border-box;\n    position: fixed;\n    min-width: 300px;\n    max-width: 600px;\n    width: 18%;\n    height: 100%;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    padding: 0;\n    margin: 0;\n    z-index: 10;\n    background: #f0f0f1;\n    border-right: none\n  }\n\n  .wp-full-overlay.collapsed .wp-full-overlay-sidebar {\n    overflow: visible\n  }\n\n  .wp-full-overlay.collapsed, .wp-full-overlay.expanded .wp-full-overlay-sidebar {\n    margin-left: 0 !important\n  }\n\n  .wp-full-overlay.expanded {\n    margin-left: 300px\n  }\n\n  .wp-full-overlay.collapsed .wp-full-overlay-sidebar {\n    margin-left: -300px\n  }\n\n  @media screen and (min-width: 1667px) {\n    .wp-full-overlay.expanded {\n      margin-left: 18%\n    }\n    .wp-full-overlay.collapsed .wp-full-overlay-sidebar {\n      margin-left: -18%\n    }\n  }\n  @media screen and (min-width: 3333px) {\n    .wp-full-overlay.expanded {\n      margin-left: 600px\n    }\n    .wp-full-overlay.collapsed .wp-full-overlay-sidebar {\n      margin-left: -600px\n    }\n  }\n\n  .wp-full-overlay-sidebar:after {\n    content: \"\";\n    display: block;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    right: 0;\n    width: 3px;\n    z-index: 1000\n  }\n\n  .wp-full-overlay-main {\n    position: absolute;\n    left: 0;\n    right: 0;\n    top: 0;\n    bottom: 0;\n    height: 100%\n  }\n\n  .wp-full-overlay-sidebar .wp-full-overlay-header {\n    position: absolute;\n    left: 0;\n    right: 0;\n    height: 45px;\n    padding: 0 15px;\n    line-height: 3.2;\n    z-index: 10;\n    margin: 0;\n    border-top: none;\n    box-shadow: none\n  }\n\n  .wp-full-overlay-sidebar .wp-full-overlay-header a.back {\n    margin-top: 9px\n  }\n\n  .wp-full-overlay-sidebar .wp-full-overlay-footer {\n    bottom: 0;\n    border-bottom: none;\n    border-top: none;\n    box-shadow: none\n  }\n\n  .wp-full-overlay-sidebar .wp-full-overlay-sidebar-content {\n    position: absolute;\n    top: 45px;\n    bottom: 45px;\n    left: 0;\n    right: 0;\n    overflow: auto\n  }\n\n  .theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header {\n    padding: 0\n  }\n\n  .theme-install-overlay .close-full-overlay, .theme-install-overlay .next-theme, .theme-install-overlay .previous-theme {\n    display: block;\n    position: relative;\n    float: left;\n    width: 45px;\n    height: 45px;\n    background: #f0f0f1;\n    border-right: 1px solid #dcdcde;\n    color: #3c434a;\n    cursor: pointer;\n    text-decoration: none;\n    transition: color .1s ease-in-out, background .1s ease-in-out\n  }\n\n  .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 {\n    background: #dcdcde;\n    border-color: #c3c4c7;\n    color: #000;\n    outline: 0;\n    box-shadow: none\n  }\n\n  .theme-install-overlay .close-full-overlay:before {\n    font: normal 22px/1 dashicons;\n    content: \"\\f335\";\n    position: relative;\n    top: 7px;\n    left: 13px\n  }\n\n  .theme-install-overlay .previous-theme:before {\n    font: normal 20px/1 dashicons;\n    content: \"\\f341\";\n    position: relative;\n    top: 6px;\n    left: 14px\n  }\n\n  .theme-install-overlay .next-theme:before {\n    font: normal 20px/1 dashicons;\n    content: \"\\f345\";\n    position: relative;\n    top: 6px;\n    left: 13px\n  }\n\n  .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 {\n    color: #c3c4c7;\n    background: #f0f0f1;\n    cursor: default;\n    pointer-events: none\n  }\n\n  .theme-install-overlay .close-full-overlay, .theme-install-overlay .next-theme, .theme-install-overlay .previous-theme {\n    border-left: 0;\n    border-top: 0;\n    border-bottom: 0\n  }\n\n  .theme-install-overlay .close-full-overlay:before, .theme-install-overlay .next-theme:before, .theme-install-overlay .previous-theme:before {\n    top: 2px;\n    left: 0\n  }\n\n  .wp-core-ui .wp-full-overlay .collapse-sidebar {\n    position: fixed;\n    bottom: 0;\n    left: 0;\n    padding: 9px 0 9px 10px;\n    height: 45px;\n    color: #646970;\n    outline: 0;\n    line-height: 1;\n    background-color: transparent !important;\n    border: none !important;\n    box-shadow: none !important;\n    border-radius: 0 !important\n  }\n\n  .wp-core-ui .wp-full-overlay .collapse-sidebar:focus, .wp-core-ui .wp-full-overlay .collapse-sidebar:hover {\n    color: #2271b1\n  }\n\n  .wp-full-overlay .collapse-sidebar-arrow, .wp-full-overlay .collapse-sidebar-label {\n    display: inline-block;\n    vertical-align: middle;\n    line-height: 1.6\n  }\n\n  .wp-full-overlay .collapse-sidebar-arrow {\n    width: 20px;\n    height: 20px;\n    margin: 0 2px;\n    border-radius: 50%;\n    overflow: hidden\n  }\n\n  .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow, .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8)\n  }\n\n  .wp-full-overlay .collapse-sidebar-label {\n    margin-left: 3px\n  }\n\n  .wp-full-overlay.collapsed .collapse-sidebar-label {\n    display: none\n  }\n\n  .wp-full-overlay .collapse-sidebar-arrow:before {\n    display: block;\n    content: \"\\f148\";\n    background: #f0f0f1;\n    font: normal 20px/1 dashicons;\n    speak: never;\n    padding: 0;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .wp-core-ui .wp-full-overlay.collapsed .collapse-sidebar {\n    padding: 9px 10px\n  }\n\n  .rtl .wp-full-overlay .collapse-sidebar-arrow:before, .wp-full-overlay.collapsed .collapse-sidebar-arrow:before {\n    transform: rotate(180.001deg)\n  }\n\n  .rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before {\n    transform: none\n  }\n\n  .wp-full-overlay, .wp-full-overlay .collapse-sidebar, .wp-full-overlay-main, .wp-full-overlay-sidebar {\n    transition-property: left, right, top, bottom, width, margin;\n    transition-duration: .2s\n  }\n\n  .wp-full-overlay {\n    background: #1d2327\n  }\n\n  .wp-full-overlay-main {\n    background-color: #f0f0f1\n  }\n\n  .expanded .wp-full-overlay-footer {\n    position: fixed;\n    bottom: 0;\n    left: 0;\n    min-width: 299px;\n    max-width: 599px;\n    width: 18%;\n    width: calc(18% - 1px);\n    height: 45px;\n    border-top: 1px solid #dcdcde;\n    background: #f0f0f1\n  }\n\n  .wp-full-overlay-footer .devices-wrapper {\n    float: right\n  }\n\n  .wp-full-overlay-footer .devices {\n    position: relative;\n    background: #f0f0f1;\n    box-shadow: -20px 0 10px -5px #f0f0f1\n  }\n\n  .wp-full-overlay-footer .devices button {\n    cursor: pointer;\n    background: 0 0;\n    border: none;\n    height: 45px;\n    padding: 0 3px;\n    margin: 0 0 0 -4px;\n    box-shadow: none;\n    border-top: 1px solid transparent;\n    border-bottom: 4px solid transparent;\n    transition: .15s color ease-in-out, .15s background-color ease-in-out, .15s border-color ease-in-out\n  }\n\n  .wp-full-overlay-footer .devices button:focus {\n    box-shadow: none;\n    outline: 0\n  }\n\n  .wp-full-overlay-footer .devices button:before {\n    display: inline-block;\n    -webkit-font-smoothing: antialiased;\n    font: normal 20px/30px dashicons;\n    vertical-align: top;\n    margin: 3px 0;\n    padding: 4px 8px;\n    color: #646970\n  }\n\n  .wp-full-overlay-footer .devices button.active {\n    border-bottom-color: #1d2327\n  }\n\n  .wp-full-overlay-footer .devices button:focus, .wp-full-overlay-footer .devices button:hover {\n    background-color: #fff\n  }\n\n  .wp-full-overlay-footer .devices button.active:hover, .wp-full-overlay-footer .devices button:focus {\n    border-bottom-color: #2271b1\n  }\n\n  .wp-full-overlay-footer .devices button.active:before {\n    color: #1d2327\n  }\n\n  .wp-full-overlay-footer .devices button:focus:before, .wp-full-overlay-footer .devices button:hover:before {\n    color: #2271b1\n  }\n\n  .wp-full-overlay-footer .devices .preview-desktop:before {\n    content: \"\\f472\"\n  }\n\n  .wp-full-overlay-footer .devices .preview-tablet:before {\n    content: \"\\f471\"\n  }\n\n  .wp-full-overlay-footer .devices .preview-mobile:before {\n    content: \"\\f470\"\n  }\n\n  @media screen and (max-width: 1024px) {\n    .wp-full-overlay-footer .devices {\n      display: none\n    }\n  }\n\n  .collapsed .wp-full-overlay-footer .devices button:before {\n    display: none\n  }\n\n  .preview-mobile .wp-full-overlay-main {\n    margin: auto 0 auto -160px;\n    width: 320px;\n    height: 480px;\n    max-height: 100%;\n    max-width: 100%;\n    left: 50%\n  }\n\n  .preview-tablet .wp-full-overlay-main {\n    margin: auto 0 auto -360px;\n    width: 720px;\n    height: 1080px;\n    max-height: 100%;\n    max-width: 100%;\n    left: 50%\n  }\n\n  .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 {\n    display: none\n  }\n\n  #customize-container, #customize-controls .notice.notification-overlay {\n    background: #f0f0f1;\n    z-index: 500000;\n    position: fixed;\n    overflow: visible;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    height: 100%\n  }\n\n  #customize-container {\n    display: none\n  }\n\n  #customize-container, .theme-install-overlay {\n    visibility: visible\n  }\n\n  .customize-loading #customize-container iframe {\n    opacity: 0\n  }\n\n  #customize-container iframe, .theme-install-overlay iframe {\n    height: 100%;\n    width: 100%;\n    z-index: 20;\n    transition: opacity .3s\n  }\n\n  #customize-controls {\n    margin-top: 0\n  }\n\n  .theme-install-overlay {\n    display: none\n  }\n\n  .theme-install-overlay.single-theme {\n    display: block\n  }\n\n  .install-theme-info {\n    display: none;\n    padding: 10px 20px 60px\n  }\n\n  .single-theme .install-theme-info {\n    padding-top: 15px\n  }\n\n  .theme-install-overlay .install-theme-info {\n    display: block\n  }\n\n  .install-theme-info .theme-install {\n    float: right;\n    margin-top: 18px\n  }\n\n  .install-theme-info .theme-name {\n    font-size: 16px;\n    line-height: 1.5;\n    margin-bottom: 0;\n    margin-top: 0\n  }\n\n  .install-theme-info .theme-screenshot {\n    margin: 15px 0;\n    width: 258px;\n    border: 1px solid #c3c4c7\n  }\n\n  .install-theme-info .theme-details {\n    overflow: hidden\n  }\n\n  .theme-details .theme-version {\n    margin: 15px 0\n  }\n\n  .theme-details .theme-description {\n    float: left;\n    color: #646970;\n    line-height: 1.6;\n    max-width: 100%\n  }\n\n  .theme-install-overlay .wp-full-overlay-header .button {\n    float: right;\n    margin: 8px 10px 0 0\n  }\n\n  .theme-install-overlay .wp-full-overlay-sidebar {\n    background: #f0f0f1;\n    border-right: 1px solid #dcdcde\n  }\n\n  .theme-install-overlay .wp-full-overlay-sidebar-content {\n    background: #fff;\n    border-top: 1px solid #dcdcde;\n    border-bottom: 1px solid #dcdcde\n  }\n\n  .theme-install-overlay .wp-full-overlay-main {\n    position: absolute;\n    z-index: 0;\n    background-color: #f0f0f1\n  }\n\n  .customize-loading #customize-container {\n    background-color: #f0f0f1\n  }\n\n  #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 {\n    content: \"\";\n    display: block;\n    width: 20px;\n    height: 20px;\n    position: absolute;\n    left: 50%;\n    top: 50%;\n    z-index: -1;\n    margin: -10px 0 0 -10px;\n    transform: translateZ(0);\n    background: transparent url(images/spinner.gif) no-repeat center center;\n    background-size: 20px 20px\n  }\n\n  #customize-preview.wp-full-overlay-main.iframe-ready:before, .theme-install-overlay.iframe-ready .wp-full-overlay-main:before {\n    background-image: none\n  }\n\n  @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {\n    .wp-full-overlay .collapse-sidebar-arrow {\n      background-image: url(images/arrows-2x.png);\n      background-size: 15px 123px\n    }\n    #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 {\n      background-image: url(images/spinner-2x.gif)\n    }\n  }\n  @media screen and (max-width: 782px) {\n    .available-theme .action-links .delete-theme {\n      float: none;\n      margin: 0;\n      padding: 0;\n      clear: both\n    }\n    .available-theme .action-links .delete-theme a {\n      padding: 0\n    }\n    .broken-themes table {\n      width: 100%\n    }\n    .theme-install-overlay .wp-full-overlay-header .button {\n      font-size: 13px;\n      line-height: 2.15384615;\n      min-height: 30px\n    }\n    .theme-browser .theme .theme-actions .button {\n      margin-bottom: 0\n    }\n    .theme-browser .theme .theme-actions, .theme-browser .theme.active .theme-actions {\n      padding-top: 4px;\n      padding-bottom: 4px\n    }\n    .upload-plugin .wp-upload-form, .upload-theme .wp-upload-form {\n      display: block\n    }\n  }\n  @media aural {\n    .theme .notice:before, .theme-info .updated-message:before, .theme-info .updating-message:before, .theme-install.updating-message:before {\n      speak: never\n    }\n  }\n  /*! This file is auto-generated */\n  .about__container {\n    --background: transparent;\n    --subtle-background: #def;\n    --text: #000;\n    --text-light: #fff;\n    --accent-1: #3858e9;\n    --accent-2: #3858e9;\n    --nav-background: #fff;\n    --nav-border: transparent;\n    --nav-color: var(--text);\n    --nav-current: var(--accent-1);\n    --gap: 2rem\n  }\n\n  .about-php, .credits-php, .freedoms-php, .privacy-php {\n    background: #f0f7ff\n  }\n\n  .about-php #wpcontent, .credits-php #wpcontent, .freedoms-php #wpcontent, .privacy-php #wpcontent {\n    background: linear-gradient(180deg, #fff 50%, #f0f7ff 100%);\n    padding: 0 24px\n  }\n\n  @media screen and (max-width: 782px) {\n    .about-php.auto-fold #wpcontent, .credits-php.auto-fold #wpcontent, .freedoms-php.auto-fold #wpcontent, .privacy-php.auto-fold #wpcontent {\n      padding-left: 24px\n    }\n  }\n\n  .about__container {\n    max-width: 1000px;\n    margin: 24px auto;\n    clear: both\n  }\n\n  .about__container .alignleft {\n    float: left\n  }\n\n  .about__container .alignright {\n    float: right\n  }\n\n  .about__container .aligncenter {\n    text-align: center\n  }\n\n  .about__container .is-vertically-aligned-top {\n    align-self: start\n  }\n\n  .about__container .is-vertically-aligned-center {\n    align-self: center\n  }\n\n  .about__container .is-vertically-aligned-bottom {\n    align-self: end\n  }\n\n  .about__section {\n    background: var(--background);\n    clear: both\n  }\n\n  .about__container .has-accent-background-color {\n    background-color: var(--accent-1);\n    color: var(--text-light)\n  }\n\n  .about__container .has-accent-background-color a {\n    color: var(--text-light)\n  }\n\n  .about__container .has-transparent-background-color {\n    background-color: transparent\n  }\n\n  .about__container .has-accent-color {\n    color: var(--accent-1)\n  }\n\n  .about__container .has-border {\n    border: 3px solid currentColor\n  }\n\n  .about__container .has-subtle-background-color {\n    background-color: var(--subtle-background)\n  }\n\n  .about__container .has-background-image {\n    background-size: contain;\n    background-repeat: no-repeat;\n    background-position: center\n  }\n\n  .about__section {\n    margin: 0 0 var(--gap)\n  }\n\n  .about__section .column:not(.is-edge-to-edge) {\n    padding: var(--gap)\n  }\n\n  .about__section + .about__section .is-section-header {\n    padding-bottom: var(--gap)\n  }\n\n  .about__section .column.has-border, .about__section .column[class*=background-color], .about__section:where([class*=background-color]) .column {\n    padding-top: var(--gap);\n    padding-bottom: var(--gap)\n  }\n\n  .about__section .column p:first-of-type {\n    margin-top: 0\n  }\n\n  .about__section .column p:last-of-type {\n    margin-bottom: 0\n  }\n\n  .about__section .has-text-columns {\n    columns: 2;\n    column-gap: calc(var(--gap) * 2)\n  }\n\n  .about__section .is-section-header {\n    margin-bottom: 0;\n    padding: var(--gap) var(--gap) 0\n  }\n\n  .about__section .is-section-header p:last-child {\n    margin-bottom: 0\n  }\n\n  .about__section .is-section-header:first-child:last-child {\n    padding: 0\n  }\n\n  .about__section.is-feature {\n    padding: var(--gap)\n  }\n\n  .about__section.is-feature p {\n    margin: 0\n  }\n\n  .about__section.is-feature p + p {\n    margin-top: calc(var(--gap) / 2)\n  }\n\n  .about__section.has-1-column {\n    margin-left: auto;\n    margin-right: auto;\n    max-width: 36em\n  }\n\n  .about__section.has-2-columns, .about__section.has-3-columns, .about__section.has-4-columns, .about__section.has-overlap-style {\n    display: grid\n  }\n\n  .about__section.has-gutters {\n    gap: var(--gap);\n    margin-bottom: calc(var(--gap) * 2)\n  }\n\n  .about__section.has-2-columns {\n    grid-template-columns:1fr 1fr\n  }\n\n  .about__section.has-2-columns.is-wider-right {\n    grid-template-columns:2fr 3fr\n  }\n\n  .about__section.has-2-columns.is-wider-left {\n    grid-template-columns:3fr 2fr\n  }\n\n  .about__section.has-2-columns .is-section-header {\n    grid-column-start: 1;\n    -ms-grid-column-span: 2;\n    grid-column-end: span 2\n  }\n\n  .about__section.has-2-columns .column:nth-of-type(2n+1) {\n    grid-column-start: 1\n  }\n\n  .about__section.has-2-columns .column:nth-of-type(2n) {\n    grid-column-start: 2\n  }\n\n  .about__section.has-3-columns {\n    grid-template-columns:repeat(3, 1fr)\n  }\n\n  .about__section.has-3-columns .is-section-header {\n    grid-column-start: 1;\n    -ms-grid-column-span: 3;\n    grid-column-end: span 3\n  }\n\n  .about__section.has-3-columns .column:nth-of-type(3n+1) {\n    grid-column-start: 1\n  }\n\n  .about__section.has-3-columns .column:nth-of-type(3n+2) {\n    grid-column-start: 2\n  }\n\n  .about__section.has-3-columns .column:nth-of-type(3n) {\n    grid-column-start: 3\n  }\n\n  .about__section.has-4-columns {\n    grid-template-columns:repeat(4, 1fr)\n  }\n\n  .about__section.has-4-columns .is-section-header {\n    grid-column-start: 1;\n    -ms-grid-column-span: 4;\n    grid-column-end: span 4\n  }\n\n  .about__section.has-4-columns .column:nth-of-type(4n+1) {\n    grid-column-start: 1\n  }\n\n  .about__section.has-4-columns .column:nth-of-type(4n+2) {\n    grid-column-start: 2\n  }\n\n  .about__section.has-4-columns .column:nth-of-type(4n+3) {\n    grid-column-start: 3\n  }\n\n  .about__section.has-4-columns .column:nth-of-type(4n) {\n    grid-column-start: 4\n  }\n\n  .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 {\n    grid-row-start: 2\n  }\n\n  .about__section.has-overlap-style {\n    grid-template-columns:repeat(7, 1fr)\n  }\n\n  .about__section.has-overlap-style .column {\n    grid-row-start: 1\n  }\n\n  .about__section.has-overlap-style .column:nth-of-type(2n+1) {\n    grid-column-start: 2;\n    -ms-grid-column-span: 3;\n    grid-column-end: span 3\n  }\n\n  .about__section.has-overlap-style .column:nth-of-type(2n) {\n    grid-column-start: 4;\n    -ms-grid-column-span: 3;\n    grid-column-end: span 3\n  }\n\n  .about__section.has-overlap-style .column.is-top-layer {\n    z-index: 1\n  }\n\n  @media screen and (max-width: 782px) {\n    .about__section.has-2-columns.is-wider-left, .about__section.has-2-columns.is-wider-right, .about__section.has-3-columns {\n      display: block;\n      margin-bottom: calc(var(--gap) / 2)\n    }\n    .about__section .column:not(.is-edge-to-edge) {\n      padding-top: var(--gap);\n      padding-bottom: var(--gap)\n    }\n    .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 {\n      margin-bottom: calc(var(--gap) * 2)\n    }\n    .about__section.has-2-columns.has-gutters .column, .about__section.has-3-columns.has-gutters .column {\n      margin-bottom: var(--gap)\n    }\n    .about__section.has-2-columns.has-gutters .column:last-child, .about__section.has-3-columns.has-gutters .column:last-child {\n      margin-bottom: 0\n    }\n    .about__section.has-3-columns .column:nth-of-type(n) {\n      padding-top: calc(var(--gap) / 2);\n      padding-bottom: calc(var(--gap) / 2)\n    }\n    .about__section.has-4-columns {\n      grid-template-columns:repeat(2, 1fr)\n    }\n    .about__section.has-4-columns .column:nth-of-type(2n+1) {\n      grid-column-start: 1\n    }\n    .about__section.has-4-columns .column:nth-of-type(2n) {\n      grid-column-start: 2\n    }\n    .about__section.has-4-columns .column:nth-of-type(4n), .about__section.has-4-columns .column:nth-of-type(4n+3) {\n      grid-row-start: 2\n    }\n    .about__section.has-4-columns .is-section-header {\n      -ms-grid-column-span: 2;\n      grid-column-end: span 2\n    }\n    .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) {\n      grid-row-start: 3\n    }\n    .about__section.has-overlap-style {\n      grid-template-columns:1fr\n    }\n    .about__section.has-overlap-style .column.column {\n      grid-column-start: 1;\n      -ms-grid-column-span: 1;\n      grid-column-end: 2;\n      grid-row-start: 1;\n      -ms-grid-row-span: 1;\n      grid-row-end: 2\n    }\n  }\n  @media screen and (max-width: 600px) {\n    .about__section.has-2-columns {\n      display: block;\n      margin-bottom: var(--gap)\n    }\n    .about__section.has-2-columns:not(.has-gutters) .column:nth-of-type(n) {\n      padding-top: calc(var(--gap) / 2);\n      padding-bottom: calc(var(--gap) / 2)\n    }\n    .about__section.has-2-columns.has-gutters {\n      margin-bottom: calc(var(--gap) * 2)\n    }\n    .about__section.has-2-columns.has-gutters .column {\n      margin-bottom: var(--gap)\n    }\n    .about__section.has-2-columns.has-gutters .column:last-child {\n      margin-bottom: 0\n    }\n  }\n  @media screen and (max-width: 480px) {\n    .about__section.is-feature .column {\n      padding: 0\n    }\n    .about__section.has-4-columns {\n      display: block;\n      padding-bottom: calc(var(--gap) / 2)\n    }\n    .about__section.has-4-columns.has-gutters .column {\n      margin-bottom: calc(var(--gap) / 2)\n    }\n    .about__section.has-4-columns.has-gutters .column:last-child {\n      margin-bottom: 0\n    }\n    .about__section.has-4-columns .column:nth-of-type(n) {\n      padding-top: calc(var(--gap) / 2);\n      padding-bottom: calc(var(--gap) / 2)\n    }\n  }\n\n  .about__container {\n    line-height: 1.4;\n    color: var(--text)\n  }\n\n  .about__container h1 {\n    padding: 0;\n    color: inherit\n  }\n\n  .about__container h1, .about__container h2, .about__container h3.is-larger-heading {\n    margin-top: 0;\n    margin-bottom: .5em;\n    font-size: 2em;\n    line-height: 1.2;\n    font-weight: 700\n  }\n\n  .about__container h1.is-smaller-heading, .about__container h2.is-smaller-heading, .about__container h3 {\n    margin-top: 0;\n    font-size: 1.6em;\n    line-height: 1.3;\n    font-weight: 400\n  }\n\n  .about__container p {\n    font-size: inherit;\n    line-height: inherit\n  }\n\n  .about__container p.is-subheading {\n    margin-top: 0;\n    font-size: 1.8em\n  }\n\n  .about__section a {\n    color: var(--accent-1);\n    text-decoration: underline\n  }\n\n  .about__section a:active, .about__section a:focus, .about__section a:hover {\n    color: var(--accent-1);\n    text-decoration: none\n  }\n\n  .wp-credits-list a {\n    text-decoration: none\n  }\n\n  .wp-credits-list a:active, .wp-credits-list a:focus, .wp-credits-list a:hover {\n    text-decoration: underline\n  }\n\n  .about__container ul {\n    list-style: disc;\n    margin-left: calc(var(--gap) / 2)\n  }\n\n  .about__container img {\n    margin: 0;\n    max-width: 100%;\n    vertical-align: middle\n  }\n\n  .about__container .about__image {\n    margin: 0\n  }\n\n  .about__container .about__image img {\n    max-width: 100%;\n    width: 100%;\n    height: auto\n  }\n\n  .about__container .about__image figcaption {\n    margin-top: .5em;\n    text-align: center\n  }\n\n  .about__container .about__image .wp-video {\n    margin-left: auto;\n    margin-right: auto\n  }\n\n  .about__container .about__image + h3 {\n    margin-top: 1.5em\n  }\n\n  .about__container hr {\n    margin: 0;\n    height: var(--gap);\n    border: none\n  }\n\n  .about__container hr.is-small {\n    height: calc(var(--gap) / 4)\n  }\n\n  .about__container hr.is-large {\n    height: calc(var(--gap) * 2);\n    margin: calc(var(--gap) / 2) auto\n  }\n\n  .about__container .notice, .about__container div.error, .about__container div.updated {\n    display: none !important\n  }\n\n  .about__section {\n    font-size: 1.2em\n  }\n\n  .about__section.is-feature {\n    font-size: 1.6em\n  }\n\n  @media screen and (max-width: 480px) {\n    .about__section.is-feature {\n      font-size: 1.4em\n    }\n    .about__container h1, .about__container h2, .about__container h3.is-larger-heading {\n      font-size: 2em\n    }\n  }\n\n  .about__header {\n    position: relative;\n    margin-bottom: var(--gap);\n    padding-top: 0;\n    background-image: url('images/about-texture.png');\n    background-color: var(--accent-2);\n    background-size: 500px 500px;\n    background-blend-mode: overlay;\n    color: var(--text-light)\n  }\n\n  .about__header::before {\n    content: \"\";\n    position: absolute;\n    top: 0;\n    right: 64px;\n    z-index: 0;\n    width: 300px;\n    height: 382px;\n    background: url(images/about-header-about.svg) no-repeat center;\n    background-size: contain\n  }\n\n  .credits-php .about__header::before {\n    top: auto;\n    bottom: 70px;\n    height: 310px;\n    background-image: url('images/about-header-credits.svg')\n  }\n\n  .freedoms-php .about__header::before {\n    top: calc(50% - 182px);\n    right: 32px;\n    width: 375px;\n    height: 300px;\n    background-image: url('images/about-header-freedoms.svg')\n  }\n\n  .privacy-php .about__header::before {\n    top: auto;\n    bottom: -16px;\n    background-image: url('images/about-header-privacy.svg')\n  }\n\n  .about__header-image {\n    margin: 0 var(--gap) 3em\n  }\n\n  .about__header-title {\n    box-sizing: border-box;\n    padding: 6rem 380px 0 0;\n    margin: 0 2rem\n  }\n\n  .about__header-title h1 {\n    margin: 0 0 .5rem;\n    padding: 0;\n    font-size: 4.5rem;\n    line-height: 1;\n    font-weight: 400\n  }\n\n  .about__header-text {\n    box-sizing: border-box;\n    margin: 0 0 7rem;\n    padding: 0 380px 0 2rem;\n    font-size: 1.6rem;\n    line-height: 1.15\n  }\n\n  .freedoms-php .about__header-text, .freedoms-php .about__header-title {\n    padding-right: 423px;\n    margin-right: 0\n  }\n\n  .about__header-navigation {\n    position: relative;\n    z-index: 1;\n    display: flex;\n    justify-content: center;\n    padding-top: 0;\n    background: var(--nav-background);\n    color: var(--nav-color);\n    border-bottom: 3px solid var(--nav-border)\n  }\n\n  .about__header-navigation .nav-tab {\n    margin-left: 0;\n    padding: calc(var(--gap) * .75) var(--gap);\n    float: none;\n    font-size: 1.4em;\n    line-height: 1;\n    border-width: 0 0 3px;\n    border-style: solid;\n    border-color: transparent;\n    background: 0 0;\n    color: inherit\n  }\n\n  .about__header-navigation .nav-tab:active, .about__header-navigation .nav-tab:hover {\n    background-color: var(--nav-current);\n    color: var(--text-light)\n  }\n\n  .about__header-navigation .nav-tab-active {\n    margin-bottom: -3px;\n    color: var(--nav-current);\n    border-width: 0 0 6px;\n    border-color: var(--nav-current)\n  }\n\n  .about__header-navigation .nav-tab-active:active, .about__header-navigation .nav-tab-active:hover {\n    background-color: var(--nav-current);\n    color: var(--text-light);\n    border-color: var(--nav-current)\n  }\n\n  @media screen and (max-width: 960px) {\n    .about__header-title h1 {\n      font-size: 4.8em\n    }\n  }\n  @media screen and (max-width: 782px) {\n    .about__header::before {\n      width: 240px;\n      height: 305px;\n      right: 32px\n    }\n    .credits-php .about__header::before {\n      height: 248px\n    }\n    .freedoms-php .about__header::before {\n      top: calc(50% - 132px);\n      height: 192px;\n      width: 240px\n    }\n    .privacy-php .about__header::before {\n      bottom: 0;\n      height: 280px\n    }\n    .about__container .about__header-text {\n      font-size: 1.4em\n    }\n    .about__header-container {\n      display: block\n    }\n    .about__header-text, .about__header-title {\n      padding-right: 288px !important\n    }\n    .about__header-image, .about__header-title {\n      margin-left: calc(var(--gap) / 2);\n      margin-right: calc(var(--gap) / 2)\n    }\n    .about__header-text {\n      margin-top: 0;\n      margin-right: 0;\n      padding-left: calc(var(--gap) / 2)\n    }\n    .about__header-navigation .nav-tab {\n      margin-top: 0;\n      margin-right: 0;\n      padding-left: calc(var(--gap) / 2);\n      padding-right: calc(var(--gap) / 2)\n    }\n  }\n  @media screen and (max-width: 600px) {\n    .about__header::before {\n      display: none\n    }\n    .about__header-text, .about__header-title {\n      padding-right: calc(var(--gap) / 2) !important\n    }\n  }\n  @media screen and (max-width: 480px) {\n    .about__header-title p {\n      font-size: 2.4em\n    }\n    .about__header-title {\n      padding-top: 2rem\n    }\n    .about__header-text {\n      margin-bottom: 2rem\n    }\n    .about__header-navigation {\n      display: block\n    }\n    .about__header-navigation .nav-tab {\n      display: block;\n      margin-bottom: 0;\n      padding: calc(var(--gap) / 2);\n      border-left-width: 6px;\n      border-bottom: none\n    }\n    .about__header-navigation .nav-tab-active {\n      border-bottom: none;\n      border-left-width: 6px\n    }\n  }\n\n  .about__section .wp-people-group-title {\n    margin-bottom: calc(var(--gap) * 2);\n    text-align: center\n  }\n\n  .about__section .wp-people-group {\n    margin: 0;\n    display: flex;\n    flex-wrap: wrap\n  }\n\n  .about__section .wp-person {\n    display: inline-block;\n    vertical-align: top;\n    box-sizing: border-box;\n    margin-bottom: var(--gap);\n    width: 25%;\n    text-align: center\n  }\n\n  .about__section .compact .wp-person {\n    height: auto;\n    width: 20%\n  }\n\n  .about__section .wp-person-avatar {\n    display: block;\n    margin: 0 auto calc(var(--gap) / 2);\n    width: 140px;\n    height: 140px;\n    border-radius: 100%;\n    overflow: hidden;\n    background: var(--accent-1)\n  }\n\n  .about__section .wp-person .gravatar {\n    width: 140px;\n    height: 140px;\n    filter: grayscale(100%);\n    mix-blend-mode: screen\n  }\n\n  .about__section .compact .wp-person .gravatar, .about__section .compact .wp-person-avatar {\n    width: 80px;\n    height: 80px\n  }\n\n  .about__section .wp-person .web {\n    font-size: 1.4em;\n    font-weight: 600;\n    text-decoration: none\n  }\n\n  .about__section .wp-person .web:hover {\n    text-decoration: underline\n  }\n\n  .about__section .compact .wp-person .web {\n    font-size: 1.2em\n  }\n\n  .about__section .wp-person .title {\n    display: block;\n    margin-top: .5em\n  }\n\n  @media screen and (max-width: 782px) {\n    .about__section .wp-person {\n      width: 33%\n    }\n    .about__section .compact .wp-person {\n      width: 25%\n    }\n    .about__section .wp-person .gravatar, .about__section .wp-person-avatar {\n      width: 120px;\n      height: 120px\n    }\n  }\n  @media screen and (max-width: 600px) {\n    .about__section .wp-person {\n      width: 50%\n    }\n    .about__section .compact .wp-person {\n      width: 33%\n    }\n    .about__section .wp-person .web {\n      font-size: 1.2em\n    }\n  }\n  @media screen and (max-width: 480px) {\n    .about__section .wp-person {\n      min-width: 100%\n    }\n    .about__section .wp-person .web {\n      font-size: 1em\n    }\n    .about__section .compact .wp-person .web {\n      font-size: 1em\n    }\n  }\n\n  .about__section .column .freedom-image {\n    margin-bottom: var(--gap);\n    max-height: 140px\n  }\n\n  .about-wrap {\n    position: relative;\n    margin: 25px 40px 0 20px;\n    max-width: 1050px;\n    font-size: 15px\n  }\n\n  .about-wrap.full-width-layout {\n    max-width: 1200px\n  }\n\n  .about-wrap-content {\n    max-width: 1050px\n  }\n\n  .about-wrap .notice, .about-wrap div.error, .about-wrap div.updated {\n    display: none !important\n  }\n\n  .about-wrap hr {\n    border: 0;\n    height: 0;\n    margin: 3em 0 0;\n    border-top: 1px solid rgba(0, 0, 0, .1)\n  }\n\n  .about-wrap img {\n    margin: 0;\n    width: 100%;\n    height: auto;\n    vertical-align: middle\n  }\n\n  .about-wrap .inline-svg img {\n    max-width: 100%;\n    width: auto;\n    height: auto\n  }\n\n  .about-wrap video {\n    margin: 1.5em auto\n  }\n\n  .wp-badge {\n    background: #0073aa url(images/w-logo-white.png?ver=20160308) no-repeat;\n    background-position: center 25px;\n    background-size: 80px 80px;\n    color: #fff;\n    font-size: 14px;\n    text-align: center;\n    font-weight: 600;\n    margin: 5px 0 0;\n    padding-top: 120px;\n    height: 40px;\n    display: inline-block;\n    width: 140px;\n    text-rendering: optimizeLegibility;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, .2)\n  }\n\n  .svg .wp-badge {\n    background-image: url(images/wordpress-logo-white.svg?ver=20160308)\n  }\n\n  .about-wrap .wp-badge {\n    position: absolute;\n    top: 0;\n    right: 0\n  }\n\n  .about-wrap .nav-tab {\n    padding-right: 15px;\n    padding-left: 15px;\n    font-size: 18px;\n    line-height: 1.33333333\n  }\n\n  .about-wrap h1 {\n    margin: .2em 200px 0 0;\n    padding: 0;\n    color: #32373c;\n    line-height: 1.2;\n    font-size: 2.8em;\n    font-weight: 400\n  }\n\n  .about-wrap h2 {\n    margin: 40px 0 .6em;\n    font-size: 2.7em;\n    line-height: 1.3;\n    font-weight: 300;\n    text-align: center\n  }\n\n  .about-wrap h3 {\n    margin: 1.25em 0 .6em;\n    font-size: 1.4em;\n    line-height: 1.5\n  }\n\n  .about-wrap h4 {\n    font-size: 16px;\n    color: #23282d\n  }\n\n  .about-wrap p {\n    line-height: 1.5;\n    font-size: 16px\n  }\n\n  .about-wrap code, .about-wrap ol li p {\n    font-size: 14px;\n    font-weight: 400\n  }\n\n  .about-wrap figcaption {\n    font-size: 13px;\n    text-align: center;\n    color: #fff;\n    text-overflow: ellipsis\n  }\n\n  .about-wrap .about-description, .about-wrap .about-text {\n    margin-top: 1.4em;\n    font-weight: 400;\n    line-height: 1.6;\n    font-size: 19px\n  }\n\n  .about-wrap .about-text {\n    margin: 1em 200px 1em 0;\n    color: #555d66\n  }\n\n  .about-wrap .has-1-columns, .about-wrap .has-2-columns, .about-wrap .has-3-columns, .about-wrap .has-4-columns {\n    display: grid;\n    max-width: 800px;\n    margin-top: 40px;\n    margin-left: auto;\n    margin-right: auto\n  }\n\n  .about-wrap .column {\n    margin-right: 20px;\n    margin-left: 20px\n  }\n\n  .about-wrap .is-wide {\n    max-width: 760px\n  }\n\n  .about-wrap .is-fullwidth {\n    max-width: 100%\n  }\n\n  .about-wrap .has-1-columns {\n    display: block;\n    max-width: 680px;\n    margin: 0 auto 40px\n  }\n\n  .about-wrap .has-2-columns {\n    grid-template-columns:1fr 1fr\n  }\n\n  .about-wrap .has-2-columns .column:nth-of-type(2n+1) {\n    grid-column-start: 1\n  }\n\n  .about-wrap .has-2-columns .column:nth-of-type(2n) {\n    grid-column-start: 2\n  }\n\n  .about-wrap .has-2-columns.is-wider-right {\n    grid-template-columns:1fr 2fr\n  }\n\n  .about-wrap .has-2-columns.is-wider-left {\n    grid-template-columns:2fr 1fr\n  }\n\n  .about-wrap .has-3-columns {\n    grid-template-columns:repeat(3, 1fr)\n  }\n\n  .about-wrap .has-3-columns .column:nth-of-type(3n+1) {\n    grid-column-start: 1\n  }\n\n  .about-wrap .has-3-columns .column:nth-of-type(3n+2) {\n    grid-column-start: 2\n  }\n\n  .about-wrap .has-3-columns .column:nth-of-type(3n) {\n    grid-column-start: 3\n  }\n\n  .about-wrap .has-4-columns {\n    grid-template-columns:repeat(4, 1fr)\n  }\n\n  .about-wrap .has-4-columns .column:nth-of-type(4n+1) {\n    grid-column-start: 1\n  }\n\n  .about-wrap .has-4-columns .column:nth-of-type(4n+2) {\n    grid-column-start: 2\n  }\n\n  .about-wrap .has-4-columns .column:nth-of-type(4n+3) {\n    grid-column-start: 3\n  }\n\n  .about-wrap .has-4-columns .column:nth-of-type(4n) {\n    grid-column-start: 4\n  }\n\n  .about-wrap .column :first-child {\n    margin-top: 0\n  }\n\n  .about-wrap .aligncenter {\n    text-align: center\n  }\n\n  .about-wrap .alignleft {\n    float: left;\n    margin-right: 40px\n  }\n\n  .about-wrap .alignright {\n    float: right;\n    margin-left: 40px\n  }\n\n  .about-wrap .is-vertically-aligned-top {\n    align-self: start\n  }\n\n  .about-wrap .is-vertically-aligned-center {\n    align-self: center\n  }\n\n  .about-wrap .is-vertically-aligned-bottom {\n    align-self: end\n  }\n\n  .about-wrap .point-releases {\n    margin-top: 5px;\n    border-bottom: 1px solid #ddd\n  }\n\n  .about-wrap .changelog {\n    margin-bottom: 40px\n  }\n\n  .about-wrap .changelog.point-releases h3 {\n    padding-top: 35px\n  }\n\n  .about-wrap .changelog.point-releases h3:first-child {\n    padding-top: 7px\n  }\n\n  .about-wrap .changelog.feature-section .col {\n    margin-top: 40px\n  }\n\n  .about-wrap .lead-description {\n    font-size: 1.5em;\n    text-align: center\n  }\n\n  .about-wrap .feature-section p {\n    margin-top: .6em\n  }\n\n  .about-wrap .headline-feature {\n    margin: 0 auto 40px;\n    max-width: 680px\n  }\n\n  .about-wrap .headline-feature h2 {\n    margin: 50px 0 0\n  }\n\n  .about-wrap .headline-feature img {\n    max-width: 600px;\n    width: 100%\n  }\n\n  .about-wrap .return-to-dashboard {\n    margin: 30px 0 0 -5px;\n    font-size: 14px;\n    font-weight: 600\n  }\n\n  .about-wrap .return-to-dashboard a {\n    text-decoration: none;\n    padding: 0 5px\n  }\n\n  .about-wrap h2.wp-people-group {\n    margin: 2.6em 0 1.33em;\n    padding: 0;\n    font-size: 16px;\n    line-height: inherit;\n    font-weight: 600;\n    text-align: left\n  }\n\n  .about-wrap .wp-people-group {\n    padding: 0 5px;\n    margin: 0 -15px 0 -5px\n  }\n\n  .about-wrap .compact {\n    margin-bottom: 0\n  }\n\n  .about-wrap .wp-person {\n    display: inline-block;\n    vertical-align: top;\n    margin-right: 10px;\n    padding-bottom: 15px;\n    height: 70px;\n    width: 280px\n  }\n\n  .about-wrap .compact .wp-person {\n    height: auto;\n    width: 180px;\n    padding-bottom: 0;\n    margin-bottom: 0\n  }\n\n  .about-wrap .wp-person .gravatar {\n    float: left;\n    margin: 0 10px 10px 0;\n    padding: 1px;\n    width: 60px;\n    height: 60px\n  }\n\n  .about-wrap .compact .wp-person .gravatar {\n    width: 30px;\n    height: 30px\n  }\n\n  .about-wrap .wp-person .web {\n    margin: 6px 0 2px;\n    font-size: 16px;\n    font-weight: 400;\n    line-height: 2;\n    text-decoration: none\n  }\n\n  .about-wrap .wp-person .title {\n    display: block\n  }\n\n  .about-wrap #wp-people-group-validators + p.wp-credits-list {\n    margin-top: 0\n  }\n\n  .about-wrap p.wp-credits-list a {\n    white-space: nowrap\n  }\n\n  .freedoms-php .about-wrap ol {\n    margin: 40px 60px\n  }\n\n  .freedoms-php .about-wrap ol li {\n    list-style-type: decimal;\n    font-weight: 600\n  }\n\n  .freedoms-php .about-wrap ol p {\n    font-weight: 400;\n    margin: .6em 0\n  }\n\n  .freedoms-php .column .freedoms-image {\n    background-image: url('images/freedoms.png');\n    background-size: 100%;\n    padding-top: 100%\n  }\n\n  .freedoms-php .column:nth-of-type(2) .freedoms-image {\n    background-position: 0 34%\n  }\n\n  .freedoms-php .column:nth-of-type(3) .freedoms-image {\n    background-position: 0 66%\n  }\n\n  .freedoms-php .column:nth-of-type(4) .freedoms-image {\n    background-position: 0 100%\n  }\n\n  @media screen and (max-width: 782px) {\n    .about-wrap .has-3-columns, .about-wrap .has-4-columns {\n      grid-template-columns:1fr 1fr\n    }\n    .about-wrap .has-3-columns .column:nth-of-type(3n+1), .about-wrap .has-4-columns .column:nth-of-type(4n+1) {\n      grid-column-start: 1;\n      grid-row-start: 1\n    }\n    .about-wrap .has-3-columns .column:nth-of-type(3n+2), .about-wrap .has-4-columns .column:nth-of-type(4n+2) {\n      grid-column-start: 2;\n      grid-row-start: 1\n    }\n    .about-wrap .has-3-columns .column:nth-of-type(3n), .about-wrap .has-4-columns .column:nth-of-type(4n+3) {\n      grid-column-start: 1;\n      grid-row-start: 2\n    }\n    .about-wrap .has-4-columns .column:nth-of-type(4n) {\n      grid-column-start: 2;\n      grid-row-start: 2\n    }\n  }\n  @media screen and (max-width: 600px) {\n    .about-wrap .has-2-columns, .about-wrap .has-3-columns, .about-wrap .has-4-columns {\n      display: block\n    }\n    .about-wrap :not(.is-wider-right):not(.is-wider-left) .column {\n      margin-right: 0;\n      margin-left: 0\n    }\n    .about-wrap .has-2-columns.is-wider-left, .about-wrap .has-2-columns.is-wider-right {\n      display: grid\n    }\n  }\n  @media only screen and (max-width: 500px) {\n    .about-wrap {\n      margin-right: 20px;\n      margin-left: 10px\n    }\n    .about-wrap .about-text, .about-wrap h1 {\n      margin-right: 0\n    }\n    .about-wrap .about-text {\n      margin-bottom: .25em\n    }\n    .about-wrap .wp-badge {\n      position: relative;\n      margin-bottom: 1.5em;\n      width: 100%\n    }\n  }\n  @media only screen and (max-width: 480px) {\n    .about-wrap .has-2-columns.is-wider-left, .about-wrap .has-2-columns.is-wider-right {\n      display: block\n    }\n    .about-wrap .column {\n      margin-right: 0;\n      margin-left: 0\n    }\n    .about-wrap .has-2-columns.is-wider-left img, .about-wrap .has-2-columns.is-wider-right img {\n      max-width: 160px\n    }\n  }\n  /*! This file is auto-generated */\n  .no-js #message {\n    display: block\n  }\n\n  ul.add-menu-item-tabs li {\n    padding: 3px 5px 4px 8px\n  }\n\n  .accordion-section ul.add-menu-item-tabs, .accordion-section ul.category-tabs, .accordion-section ul.wp-tab-bar {\n    margin: 0\n  }\n\n  .accordion-section .categorychecklist {\n    margin: 13px 0\n  }\n\n  #nav-menu-meta .accordion-section-content {\n    padding: 18px 13px\n  }\n\n  #nav-menu-meta .button-controls {\n    margin-bottom: 0\n  }\n\n  .has-no-menu-item .button-controls {\n    display: none\n  }\n\n  #nav-menus-frame {\n    margin-left: 300px;\n    margin-top: 23px\n  }\n\n  #wpbody-content #menu-settings-column {\n    display: inline;\n    width: 281px;\n    margin-left: -300px;\n    clear: both;\n    float: left;\n    padding-top: 0\n  }\n\n  #menu-settings-column .inside {\n    clear: both;\n    margin: 10px 0 0\n  }\n\n  .metabox-holder-disabled .accordion-section-content, .metabox-holder-disabled .accordion-section-title, .metabox-holder-disabled .postbox {\n    opacity: .5\n  }\n\n  .metabox-holder-disabled .button-controls .select-all {\n    display: none\n  }\n\n  #wpbody {\n    position: relative\n  }\n\n  .is-submenu {\n    color: #50575e;\n    font-style: italic;\n    font-weight: 400;\n    margin-left: 4px\n  }\n\n  .manage-menus {\n    margin-top: 23px;\n    padding: 10px;\n    overflow: hidden;\n    background: #fff\n  }\n\n  .manage-menus .selected-menu, .manage-menus .submit-btn, .manage-menus select, .nav-menus-php .add-new-menu-action {\n    display: inline-block;\n    margin-right: 3px;\n    vertical-align: middle\n  }\n\n  .manage-menus select, .menu-location-menus select {\n    max-width: 100%\n  }\n\n  .menu-edit #post-body-content h3 {\n    margin: 1em 0 10px\n  }\n\n  #nav-menu-bulk-actions-top {\n    margin: 1em 0\n  }\n\n  #nav-menu-bulk-actions-bottom {\n    margin: 1em 0;\n    margin: calc(1em + 9px) 0\n  }\n\n  .bulk-actions input.button {\n    margin-right: 12px\n  }\n\n  .bulk-select-button {\n    position: relative;\n    display: inline-block;\n    padding: 0 10px;\n    font-size: 13px;\n    line-height: 2.15384615;\n    height: auto;\n    min-height: 30px;\n    background: #f6f7f7;\n    vertical-align: top;\n    border: 1px solid #dcdcde;\n    margin: 0;\n    cursor: pointer;\n    border-radius: 3px;\n    white-space: nowrap;\n    box-sizing: border-box\n  }\n\n  .bulk-selection .bulk-select-button {\n    color: #2271b1;\n    border-color: #2271b1;\n    background: #f6f7f7;\n    vertical-align: top\n  }\n\n  #pending-menu-items-to-delete {\n    display: none\n  }\n\n  .bulk-selection #pending-menu-items-to-delete {\n    display: block;\n    margin-top: 1em\n  }\n\n  #pending-menu-items-to-delete p {\n    margin-bottom: 0\n  }\n\n  #pending-menu-items-to-delete ul {\n    margin-top: 0;\n    list-style: none\n  }\n\n  #pending-menu-items-to-delete ul li {\n    display: inline\n  }\n\n  input.bulk-select-switcher + .bulk-select-button-label {\n    vertical-align: inherit\n  }\n\n  label.bulk-select-button:active, label.bulk-select-button:focus-within, label.bulk-select-button:hover {\n    background: #f0f0f1;\n    border-color: #0a4b78;\n    color: #0a4b78\n  }\n\n  input.bulk-select-switcher:focus + .bulk-select-button-label {\n    color: #0a4b78\n  }\n\n  .bulk-actions input.menu-items-delete {\n    -webkit-appearance: none;\n    appearance: none;\n    font-size: inherit;\n    border: 0;\n    line-height: 2.1em;\n    background: 0 0;\n    cursor: pointer;\n    text-decoration: underline;\n    color: #b32d2e\n  }\n\n  .bulk-actions input.menu-items-delete:hover {\n    color: #b32d2e;\n    border: none\n  }\n\n  .bulk-actions input.menu-items-delete.disabled {\n    cursor: default;\n    color: #a7aaad;\n    box-shadow: none\n  }\n\n  .menu-settings {\n    border-top: 1px solid #f0f0f1;\n    margin-top: 2em\n  }\n\n  .menu-settings-group {\n    margin: 0 0 10px;\n    overflow: hidden;\n    padding-left: 20%\n  }\n\n  .menu-settings-group:last-of-type {\n    margin-bottom: 0\n  }\n\n  .menu-settings-input {\n    float: left;\n    margin: 0;\n    width: 100%\n  }\n\n  .menu-settings-group-name {\n    float: left;\n    clear: both;\n    width: 25%;\n    padding: 3px 0 0;\n    margin-left: -25%\n  }\n\n  .menu-settings label {\n    vertical-align: baseline\n  }\n\n  .menu-edit .checkbox-input {\n    margin-top: 4px\n  }\n\n  .theme-location-set {\n    color: #646970;\n    font-size: 11px\n  }\n\n  #menu-management-liquid {\n    float: left;\n    min-width: 100%;\n    margin-top: 3px\n  }\n\n  #menu-management {\n    position: relative;\n    margin-right: 20px;\n    margin-top: -3px;\n    width: 100%\n  }\n\n  #menu-management .menu-edit {\n    margin-bottom: 20px\n  }\n\n  .nav-menus-php #post-body {\n    padding: 0 10px;\n    border-top: 1px solid #fff;\n    border-bottom: 1px solid #dcdcde;\n    background: #fff\n  }\n\n  #nav-menu-footer, #nav-menu-header {\n    padding: 0 10px;\n    background: #f6f7f7\n  }\n\n  #nav-menu-header {\n    border-bottom: 1px solid #dcdcde;\n    margin-bottom: 0\n  }\n\n  #nav-menu-header .menu-name-label {\n    display: inline-block;\n    vertical-align: middle;\n    margin-right: 7px\n  }\n\n  .nav-menus-php #post-body div.error, .nav-menus-php #post-body div.updated {\n    margin: 0\n  }\n\n  .nav-menus-php #post-body-content {\n    position: relative;\n    float: none\n  }\n\n  .nav-menus-php #post-body-content .post-body-plain {\n    margin-bottom: 0\n  }\n\n  #menu-management .menu-add-new abbr {\n    font-weight: 600\n  }\n\n  #select-nav-menu-container {\n    text-align: right;\n    padding: 0 10px 3px;\n    margin-bottom: 5px\n  }\n\n  #select-nav-menu {\n    width: 100px;\n    display: inline\n  }\n\n  #menu-name-label {\n    margin-top: -2px\n  }\n\n  .widefat .menu-locations .menu-location-title {\n    padding: 13px 10px 0\n  }\n\n  .menu-location-title label {\n    font-weight: 600\n  }\n\n  .menu-location-menus select {\n    float: left\n  }\n\n  #locations-nav-menu-wrapper {\n    padding: 5px 0\n  }\n\n  .locations-nav-menu-select select {\n    float: left;\n    width: 160px;\n    margin-right: 5px\n  }\n\n  .locations-row-links {\n    float: left;\n    margin: 6px 0 0 6px\n  }\n\n  .locations-add-menu-link, .locations-edit-menu-link {\n    margin: 0 3px\n  }\n\n  .locations-edit-menu-link {\n    padding-right: 3px;\n    border-right: 1px solid #c3c4c7\n  }\n\n  #menu-management .inside {\n    padding: 0 10px\n  }\n\n  .customlinkdiv .menu-item-textbox, .postbox .howto input {\n    width: 180px;\n    float: right\n  }\n\n  .accordion-container .outer-border {\n    margin: 0\n  }\n\n  .customlinkdiv p {\n    margin-top: 0\n  }\n\n  #nav-menu-theme-locations .howto select {\n    width: 100%\n  }\n\n  #nav-menu-theme-locations .button-controls {\n    text-align: right\n  }\n\n  .add-menu-item-view-all {\n    height: 400px\n  }\n\n  #menu-container .submit {\n    margin: 0 0 10px;\n    padding: 0\n  }\n\n  #cancel-save {\n    text-decoration: underline;\n    font-size: 12px;\n    margin-left: 20px;\n    margin-top: 5px\n  }\n\n  .button-primary.right, .button-secondary.right, .button.right {\n    float: right\n  }\n\n  .list-controls {\n    float: left;\n    margin-top: 5px\n  }\n\n  .add-to-menu {\n    float: right\n  }\n\n  .button-controls {\n    clear: both;\n    margin: 10px 0\n  }\n\n  .hide-all, .show-all {\n    cursor: pointer\n  }\n\n  .hide-all {\n    display: none\n  }\n\n  #menu-name {\n    width: 270px;\n    vertical-align: middle\n  }\n\n  #manage-menu .inside {\n    padding: 0\n  }\n\n  #available-links dt {\n    display: block\n  }\n\n  #add-custom-link .howto {\n    font-size: 12px\n  }\n\n  #add-custom-link label span {\n    display: block;\n    float: left;\n    margin-top: 5px;\n    padding-right: 5px\n  }\n\n  .menu-item-textbox {\n    width: 180px\n  }\n\n  .customlinkdiv label, .nav-menus-php .howto span {\n    float: left;\n    margin-top: 6px\n  }\n\n  .quick-search {\n    width: 190px\n  }\n\n  .quick-search-wrap .spinner {\n    float: none;\n    margin: -3px -10px 0 0\n  }\n\n  .nav-menus-php .list-wrap {\n    display: none;\n    clear: both;\n    margin-bottom: 10px\n  }\n\n  .nav-menus-php .postbox p.submit {\n    margin-bottom: 0\n  }\n\n  .nav-menus-php .list li {\n    display: none;\n    margin: 0 0 5px\n  }\n\n  .nav-menus-php .list li .menu-item-title {\n    cursor: pointer;\n    display: block\n  }\n\n  .nav-menus-php .list li .menu-item-title input {\n    margin-right: 3px;\n    margin-top: -3px\n  }\n\n  .menu-item-title input[type=checkbox] {\n    display: inline-block;\n    margin-top: -4px\n  }\n\n  .menu-item-title .post-state {\n    font-weight: 600\n  }\n\n  #menu-container .inside {\n    padding-bottom: 10px\n  }\n\n  .menu {\n    padding-top: 1em\n  }\n\n  #menu-to-edit {\n    margin: 0;\n    padding: .1em 0\n  }\n\n  .menu ul {\n    width: 100%\n  }\n\n  .menu li {\n    margin-bottom: 0;\n    position: relative\n  }\n\n  .menu-item-bar {\n    clear: both;\n    line-height: 1.5;\n    position: relative;\n    margin: 9px 0 0\n  }\n\n  .menu-item-bar .menu-item-handle {\n    border: 1px solid #dcdcde;\n    position: relative;\n    padding: 10px 15px;\n    height: auto;\n    min-height: 20px;\n    max-width: 382px;\n    line-height: 2.30769230;\n    overflow: hidden;\n    word-wrap: break-word\n  }\n\n  .menu-item-bar .menu-item-handle:hover {\n    border-color: #8c8f94\n  }\n\n  #menu-to-edit .menu-item-invalid .menu-item-handle {\n    background: #fcf0f1;\n    border-color: #d63638\n  }\n\n  .no-js .menu-item-edit-active .item-edit {\n    display: none\n  }\n\n  .js .menu-item-handle {\n    cursor: move\n  }\n\n  .menu li.deleting .menu-item-handle {\n    background-image: none;\n    background-color: #f86368\n  }\n\n  .menu-item-handle .item-title {\n    font-size: 13px;\n    font-weight: 600;\n    line-height: 1.53846153;\n    display: block;\n    margin-right: 13em\n  }\n\n  .menu-item-handle .menu-item-checkbox {\n    display: none\n  }\n\n  .bulk-selection .menu-item-handle .menu-item-checkbox {\n    display: inline-block;\n    margin-right: 6px\n  }\n\n  .menu-item-handle .menu-item-title.no-title {\n    color: #646970\n  }\n\n  li.menu-item.ui-sortable-helper .menu-item-bar {\n    margin-top: 0\n  }\n\n  li.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar {\n    margin-top: 9px\n  }\n\n  .menu .sortable-placeholder {\n    height: 35px;\n    width: 410px;\n    margin-top: 9px\n  }\n\n  .menu-item .menu-item-transport:empty {\n    display: none\n  }\n\n  .menu-item-depth-0 {\n    margin-left: 0\n  }\n\n  .menu-item-depth-1 {\n    margin-left: 30px\n  }\n\n  .menu-item-depth-2 {\n    margin-left: 60px\n  }\n\n  .menu-item-depth-3 {\n    margin-left: 90px\n  }\n\n  .menu-item-depth-4 {\n    margin-left: 120px\n  }\n\n  .menu-item-depth-5 {\n    margin-left: 150px\n  }\n\n  .menu-item-depth-6 {\n    margin-left: 180px\n  }\n\n  .menu-item-depth-7 {\n    margin-left: 210px\n  }\n\n  .menu-item-depth-8 {\n    margin-left: 240px\n  }\n\n  .menu-item-depth-9 {\n    margin-left: 270px\n  }\n\n  .menu-item-depth-10 {\n    margin-left: 300px\n  }\n\n  .menu-item-depth-11 {\n    margin-left: 330px\n  }\n\n  .menu-item-depth-0 .menu-item-transport {\n    margin-left: 0\n  }\n\n  .menu-item-depth-1 .menu-item-transport {\n    margin-left: -30px\n  }\n\n  .menu-item-depth-2 .menu-item-transport {\n    margin-left: -60px\n  }\n\n  .menu-item-depth-3 .menu-item-transport {\n    margin-left: -90px\n  }\n\n  .menu-item-depth-4 .menu-item-transport {\n    margin-left: -120px\n  }\n\n  .menu-item-depth-5 .menu-item-transport {\n    margin-left: -150px\n  }\n\n  .menu-item-depth-6 .menu-item-transport {\n    margin-left: -180px\n  }\n\n  .menu-item-depth-7 .menu-item-transport {\n    margin-left: -210px\n  }\n\n  .menu-item-depth-8 .menu-item-transport {\n    margin-left: -240px\n  }\n\n  .menu-item-depth-9 .menu-item-transport {\n    margin-left: -270px\n  }\n\n  .menu-item-depth-10 .menu-item-transport {\n    margin-left: -300px\n  }\n\n  .menu-item-depth-11 .menu-item-transport {\n    margin-left: -330px\n  }\n\n  body.menu-max-depth-0 {\n    min-width: 950px !important\n  }\n\n  body.menu-max-depth-1 {\n    min-width: 980px !important\n  }\n\n  body.menu-max-depth-2 {\n    min-width: 1010px !important\n  }\n\n  body.menu-max-depth-3 {\n    min-width: 1040px !important\n  }\n\n  body.menu-max-depth-4 {\n    min-width: 1070px !important\n  }\n\n  body.menu-max-depth-5 {\n    min-width: 1100px !important\n  }\n\n  body.menu-max-depth-6 {\n    min-width: 1130px !important\n  }\n\n  body.menu-max-depth-7 {\n    min-width: 1160px !important\n  }\n\n  body.menu-max-depth-8 {\n    min-width: 1190px !important\n  }\n\n  body.menu-max-depth-9 {\n    min-width: 1220px !important\n  }\n\n  body.menu-max-depth-10 {\n    min-width: 1250px !important\n  }\n\n  body.menu-max-depth-11 {\n    min-width: 1280px !important\n  }\n\n  .item-type {\n    display: inline-block;\n    padding: 12px 16px;\n    color: #646970;\n    font-size: 12px;\n    line-height: 1.5\n  }\n\n  .item-controls {\n    font-size: 12px;\n    position: absolute;\n    right: 20px;\n    top: -1px\n  }\n\n  .item-controls a {\n    text-decoration: none\n  }\n\n  .item-controls a:hover {\n    cursor: pointer\n  }\n\n  .item-controls .item-order {\n    padding-right: 10px\n  }\n\n  .nav-menus-php .item-edit {\n    position: absolute;\n    right: -20px;\n    top: 0;\n    display: block;\n    width: 30px;\n    height: 40px;\n    outline: 0\n  }\n\n  .no-js.nav-menus-php .item-edit {\n    position: static;\n    float: right;\n    width: auto;\n    height: auto;\n    margin: 12px -10px 12px 0;\n    padding: 0;\n    color: #2271b1;\n    text-decoration: underline;\n    font-size: 12px;\n    line-height: 1.5\n  }\n\n  .no-js.nav-menus-php .item-edit .screen-reader-text {\n    position: static;\n    -webkit-clip-path: none;\n    clip-path: none;\n    width: auto;\n    height: auto;\n    margin: 0\n  }\n\n  .nav-menus-php .item-edit:before {\n    margin-top: 10px;\n    margin-left: 4px;\n    width: 20px;\n    border-radius: 50%;\n    text-indent: -1px\n  }\n\n  .no-js.nav-menus-php .item-edit:before {\n    display: none\n  }\n\n  .rtl .nav-menus-php .item-edit:before {\n    text-indent: 1px\n  }\n\n  .js.nav-menus-php .item-edit:focus {\n    box-shadow: none\n  }\n\n  .nav-menus-php .item-edit:focus:before {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8)\n  }\n\n  .menu-instructions-inactive {\n    display: none\n  }\n\n  .menu-item-settings {\n    display: block;\n    max-width: 392px;\n    padding: 10px;\n    position: relative;\n    z-index: 10;\n    border: 1px solid #c3c4c7;\n    border-top: none;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04)\n  }\n\n  .menu-item-settings .field-move {\n    margin: 3px 0 5px;\n    line-height: 1.5\n  }\n\n  .field-move-visual-label {\n    float: left;\n    margin-right: 4px\n  }\n\n  .menu-item-settings .field-move .button-link {\n    display: none;\n    margin: 0 2px\n  }\n\n  .menu-item-edit-active .menu-item-settings {\n    display: block\n  }\n\n  .menu-item-edit-inactive .menu-item-settings {\n    display: none\n  }\n\n  .add-menu-item-pagelinks {\n    margin: .5em -10px;\n    text-align: center\n  }\n\n  .add-menu-item-pagelinks .page-numbers {\n    display: inline-block;\n    min-width: 20px\n  }\n\n  .add-menu-item-pagelinks .page-numbers.dots {\n    min-width: 0\n  }\n\n  .link-to-original {\n    display: block;\n    margin: 0 0 15px;\n    padding: 3px 5px 5px;\n    border: 1px solid #dcdcde;\n    color: #646970;\n    font-size: 12px\n  }\n\n  .link-to-original a {\n    padding-left: 4px;\n    font-style: normal\n  }\n\n  .hidden-field {\n    display: none\n  }\n\n  .menu-item-settings .description-thin, .menu-item-settings .description-wide {\n    margin-right: 10px;\n    float: left\n  }\n\n  .description-thin {\n    width: calc(50% - 5px)\n  }\n\n  .menu-item-settings .description-thin + .description-thin {\n    margin-right: 0\n  }\n\n  .description-wide {\n    width: 100%\n  }\n\n  .menu-item-actions {\n    padding-top: 15px;\n    padding-bottom: 7px\n  }\n\n  #cancel-save {\n    cursor: pointer\n  }\n\n  .nav-menus-php .major-publishing-actions {\n    clear: both;\n    padding: 10px 0;\n    line-height: 2.15384615\n  }\n\n  .nav-menus-php .major-publishing-actions .publishing-action {\n    text-align: right;\n    float: right\n  }\n\n  .nav-menus-php .delete-action {\n    float: left;\n    line-height: 2.1\n  }\n\n  .nav-menus-php .major-publishing-actions .form-invalid {\n    padding-left: 4px;\n    margin-left: -4px\n  }\n\n  #menu-item-name-wrap, #menu-item-url-wrap, #nav-menus-frame, .button-controls {\n    display: block\n  }\n\n  @media only screen and (min-width: 769px) and (max-width: 1000px) {\n    body.menu-max-depth-0 {\n      min-width: 0 !important\n    }\n    #menu-management-liquid {\n      width: 100%\n    }\n    .nav-menus-php #post-body-content {\n      min-width: 0\n    }\n  }\n  @media screen and (max-width: 782px) {\n    body.nav-menus-php, body.wp-customizer {\n      min-width: 0 !important\n    }\n    #nav-menus-frame {\n      margin-left: 0;\n      float: none;\n      width: 100%\n    }\n    #wpbody-content #menu-settings-column {\n      display: block;\n      width: 100%;\n      float: none;\n      margin-left: 0\n    }\n    #side-sortables .add-menu-item-tabs {\n      margin: 15px 0 14px\n    }\n    ul.add-menu-item-tabs li.tabs {\n      padding: 13px 15px 14px\n    }\n    .nav-menus-php .customlinkdiv .howto input {\n      width: 65%\n    }\n    .nav-menus-php .quick-search {\n      width: 85%\n    }\n    #menu-management-liquid {\n      margin-top: 25px\n    }\n    .nav-menus-php .menu-name-label.howto span {\n      margin-top: 13px\n    }\n    #menu-name {\n      width: 100%\n    }\n    .nav-menus-php #nav-menu-header .major-publishing-actions .publishing-action {\n      padding-top: 1em\n    }\n    .nav-menus-php .delete-action {\n      font-size: 14px;\n      line-height: 2.14285714\n    }\n    .description-wide, .menu-item-bar .menu-item-handle, .menu-item-settings {\n      width: auto\n    }\n    .menu-item-settings {\n      padding: 10px\n    }\n    .menu-item-settings .description-thin, .menu-item-settings .description-wide {\n      width: 100%\n    }\n    .menu-item-settings input {\n      width: 100%\n    }\n    .menu-item-settings input[type=checkbox], .menu-item-settings input[type=radio] {\n      width: 25px\n    }\n    .menu-settings-group {\n      padding-left: 0;\n      overflow: visible\n    }\n    .menu-settings-group-name {\n      float: none;\n      width: auto;\n      margin-left: 0;\n      margin-bottom: 15px\n    }\n    .menu-settings-input {\n      float: none;\n      margin-bottom: 15px\n    }\n    .menu-edit .checkbox-input {\n      margin-top: 0\n    }\n    .manage-menus select {\n      margin: .5em 0\n    }\n    .wp-core-ui .manage-menus .button {\n      margin-bottom: 0\n    }\n    .widefat .menu-locations .menu-location-title {\n      padding-top: 16px\n    }\n  }\n  @media only screen and (min-width: 783px) {\n    @supports (position:sticky) and (scroll-margin-bottom:130px) {\n      #nav-menu-footer {\n        position: sticky;\n        bottom: 0;\n        z-index: 10;\n        box-shadow: 0 -1px 0 0 #ddd\n      }\n      #save_menu_header {\n        display: none\n      }\n    }\n  }\n  @media only screen and (max-width: 768px) {\n    #menu-locations-wrap .widefat {\n      width: 100%\n    }\n  }\n  /*! This file is auto-generated */\n  .wp-pointer-content {\n    padding: 0 0 10px;\n    position: relative;\n    font-size: 13px;\n    background: #fff;\n    border: 1px solid #c3c4c7;\n    box-shadow: 0 3px 6px rgba(0, 0, 0, .08)\n  }\n\n  .wp-pointer-content h3 {\n    position: relative;\n    margin: -1px -1px 5px;\n    padding: 15px 18px 14px 60px;\n    border: 1px solid #2271b1;\n    border-bottom: none;\n    line-height: 1.4;\n    font-size: 14px;\n    color: #fff;\n    background: #2271b1\n  }\n\n  .wp-pointer-content h3:before {\n    background: #fff;\n    border-radius: 50%;\n    color: #2271b1;\n    content: \"\\f227\";\n    font: normal 20px/1.6 dashicons;\n    position: absolute;\n    top: 8px;\n    left: 15px;\n    speak: never;\n    text-align: center;\n    width: 32px;\n    height: 32px;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .wp-pointer-content h4 {\n    margin: 1.33em 20px 1em;\n    font-size: 1.15em\n  }\n\n  .wp-pointer-content p {\n    padding: 0 20px\n  }\n\n  .wp-pointer-buttons {\n    margin: 0;\n    padding: 5px 15px;\n    overflow: auto\n  }\n\n  .wp-pointer-buttons a {\n    float: right;\n    display: inline-block;\n    text-decoration: none\n  }\n\n  .wp-pointer-buttons a.close {\n    padding-left: 3px;\n    position: relative\n  }\n\n  .wp-pointer-buttons a.close:before {\n    background: 0 0;\n    color: #787c82;\n    content: \"\\f153\";\n    display: block !important;\n    font: normal 16px/1 dashicons;\n    speak: never;\n    margin: 1px 0;\n    text-align: center;\n    -webkit-font-smoothing: antialiased !important;\n    width: 10px;\n    height: 100%;\n    position: absolute;\n    left: -15px;\n    top: 1px\n  }\n\n  .wp-pointer-buttons a.close:hover:before {\n    color: #d63638\n  }\n\n  .wp-pointer-arrow, .wp-pointer-arrow-inner {\n    position: absolute;\n    width: 0;\n    height: 0\n  }\n\n  .wp-pointer-arrow {\n    z-index: 10;\n    width: 0;\n    height: 0;\n    border: 0 solid transparent\n  }\n\n  .wp-pointer-arrow-inner {\n    z-index: 20\n  }\n\n  .wp-pointer-top, .wp-pointer-undefined {\n    padding-top: 13px\n  }\n\n  .wp-pointer-bottom {\n    margin-top: -13px;\n    padding-bottom: 13px\n  }\n\n  .wp-pointer-left {\n    padding-left: 13px\n  }\n\n  .wp-pointer-right {\n    margin-left: -13px;\n    padding-right: 13px\n  }\n\n  .wp-pointer-bottom .wp-pointer-arrow, .wp-pointer-top .wp-pointer-arrow, .wp-pointer-undefined .wp-pointer-arrow {\n    left: 50px\n  }\n\n  .wp-pointer-left .wp-pointer-arrow, .wp-pointer-right .wp-pointer-arrow {\n    top: 50%;\n    margin-top: -15px\n  }\n\n  .wp-pointer-top .wp-pointer-arrow, .wp-pointer-undefined .wp-pointer-arrow {\n    top: 0;\n    border-width: 0 13px 13px;\n    border-bottom-color: #2271b1\n  }\n\n  .wp-pointer-top .wp-pointer-arrow-inner, .wp-pointer-undefined .wp-pointer-arrow-inner {\n    top: 1px;\n    margin-left: -13px;\n    margin-top: -13px;\n    border: 13px solid transparent;\n    border-bottom-color: #2271b1;\n    display: block;\n    content: \" \"\n  }\n\n  .wp-pointer-bottom .wp-pointer-arrow {\n    bottom: 0;\n    border-width: 13px 13px 0;\n    border-top-color: #c3c4c7\n  }\n\n  .wp-pointer-bottom .wp-pointer-arrow-inner {\n    bottom: 1px;\n    margin-left: -13px;\n    margin-bottom: -13px;\n    border: 13px solid transparent;\n    border-top-color: #fff;\n    display: block;\n    content: \" \"\n  }\n\n  .wp-pointer-left .wp-pointer-arrow {\n    left: 0;\n    border-width: 13px 13px 13px 0;\n    border-right-color: #c3c4c7\n  }\n\n  .wp-pointer-left .wp-pointer-arrow-inner {\n    left: 1px;\n    margin-left: -13px;\n    margin-top: -13px;\n    border: 13px solid transparent;\n    border-right-color: #fff;\n    display: block;\n    content: \" \"\n  }\n\n  .wp-pointer-right .wp-pointer-arrow {\n    right: 0;\n    border-width: 13px 0 13px 13px;\n    border-left-color: #c3c4c7\n  }\n\n  .wp-pointer-right .wp-pointer-arrow-inner {\n    right: 1px;\n    margin-right: -13px;\n    margin-top: -13px;\n    border: 13px solid transparent;\n    border-left-color: #fff;\n    display: block;\n    content: \" \"\n  }\n\n  .wp-pointer.arrow-bottom .wp-pointer-content {\n    margin-bottom: -45px\n  }\n\n  .wp-pointer.arrow-bottom .wp-pointer-arrow {\n    top: 100%;\n    margin-top: -30px\n  }\n\n  @media screen and (max-width: 782px) {\n    .wp-pointer {\n      display: none\n    }\n  }\n  /*! This file is auto-generated */\n  .widget {\n    margin: 0 auto 10px;\n    position: relative;\n    box-sizing: border-box\n  }\n\n  .widget.open {\n    z-index: 99\n  }\n\n  .widget.open:focus-within {\n    z-index: 100\n  }\n\n  .widget-top {\n    font-size: 13px;\n    font-weight: 600;\n    background: #f6f7f7\n  }\n\n  .widget-top .widget-action {\n    border: 0;\n    margin: 0;\n    padding: 10px;\n    background: 0 0;\n    cursor: pointer\n  }\n\n  .widget-title h3, .widget-title h4 {\n    margin: 0;\n    padding: 15px;\n    font-size: 1em;\n    line-height: 1;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    -webkit-user-select: none;\n    user-select: none\n  }\n\n  .widgets-holder-wrap .widget-inside {\n    border-top: none;\n    padding: 1px 15px 15px;\n    line-height: 1.23076923\n  }\n\n  .widget.widget-dirty .widget-control-close-wrapper {\n    display: none\n  }\n\n  #available-widgets .widget-description, #widgets-right a.widget-control-edit, .in-widget-title {\n    color: #646970\n  }\n\n  .deleting .widget-title, .deleting .widget-top .widget-action .toggle-indicator:before {\n    color: #a7aaad\n  }\n\n  .wp-core-ui .media-widget-control .selected, .wp-core-ui .media-widget-control.selected .not-selected, .wp-core-ui .media-widget-control.selected .placeholder {\n    display: none\n  }\n\n  .media-widget-control.selected .selected {\n    display: inline-block\n  }\n\n  .media-widget-buttons {\n    text-align: left;\n    margin-top: 0\n  }\n\n  .media-widget-control .media-widget-buttons .button {\n    width: auto;\n    height: auto;\n    margin-top: 12px;\n    white-space: normal\n  }\n\n  .media-widget-buttons .button:first-child {\n    margin-right: 8px\n  }\n\n  .media-widget-control .attachment-media-view .button-add-media, .media-widget-control .placeholder {\n    border: 1px dashed #c3c4c7;\n    box-sizing: border-box;\n    cursor: pointer;\n    line-height: 1.6;\n    padding: 9px 0;\n    position: relative;\n    text-align: center;\n    width: 100%\n  }\n\n  .media-widget-control .attachment-media-view .button-add-media {\n    cursor: pointer;\n    background-color: #f0f0f1;\n    color: #2c3338\n  }\n\n  .media-widget-control .attachment-media-view .button-add-media:hover {\n    background-color: #fff\n  }\n\n  .media-widget-control .attachment-media-view .button-add-media:focus {\n    background-color: #fff;\n    border-style: solid;\n    border-color: #4f94d4;\n    box-shadow: 0 0 3px rgba(34, 113, 177, .8);\n    outline: 2px solid transparent;\n    outline-offset: -2px\n  }\n\n  .media-widget-control .media-widget-preview {\n    background: 0 0;\n    text-align: center\n  }\n\n  .media-widget-control .media-widget-preview .notice {\n    text-align: initial\n  }\n\n  .media-frame .media-widget-embed-notice p code, .media-widget-control .notice p code {\n    padding: 0 3px 0 0\n  }\n\n  .media-frame .media-widget-embed-notice {\n    margin-top: 16px\n  }\n\n  .media-widget-control .media-widget-preview img {\n    max-width: 100%;\n    vertical-align: middle;\n    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);\n    background-position: 0 0, 10px 10px;\n    background-size: 20px 20px\n  }\n\n  .media-widget-control .media-widget-preview .wp-video-shortcode {\n    background: #000\n  }\n\n  .media-frame.media-widget .media-toolbar-secondary {\n    min-width: 300px\n  }\n\n  .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 {\n    display: none\n  }\n\n  .media-widget-video-preview {\n    width: 100%\n  }\n\n  .media-widget-video-link {\n    display: inline-block;\n    min-height: 132px;\n    width: 100%;\n    background: #000\n  }\n\n  .media-widget-video-link .dashicons {\n    font: normal 60px/1 dashicons;\n    position: relative;\n    width: 100%;\n    top: -90px;\n    color: #fff;\n    text-decoration: none\n  }\n\n  .media-widget-video-link.no-poster .dashicons {\n    top: 30px\n  }\n\n  .media-frame #embed-url-field.invalid, .media-widget-image-link > .link:invalid {\n    border: 1px solid #d63638\n  }\n\n  .media-widget-image-link {\n    margin: 1em 0\n  }\n\n  .media-widget-gallery-preview {\n    display: flex;\n    justify-content: flex-start;\n    flex-wrap: wrap;\n    margin: -1.79104477%\n  }\n\n  .media-widget-preview.media_gallery, .media-widget-preview.media_image {\n    cursor: pointer\n  }\n\n  .media-widget-preview .placeholder {\n    background: #f0f0f1\n  }\n\n  .media-widget-gallery-preview .gallery-item {\n    box-sizing: border-box;\n    width: 50%;\n    margin: 0;\n    background: 0 0\n  }\n\n  .media-widget-gallery-preview .gallery-item .gallery-icon {\n    margin: 4.5%\n  }\n\n  .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 {\n    max-width: 33.33%\n  }\n\n  .media-widget-gallery-preview .gallery-item img {\n    height: auto;\n    vertical-align: bottom\n  }\n\n  .media-widget-gallery-preview .gallery-icon {\n    position: relative\n  }\n\n  .media-widget-gallery-preview .gallery-icon-placeholder {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    width: 100%;\n    box-sizing: border-box;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  .media-widget-gallery-preview .gallery-icon-placeholder-text {\n    font-weight: 600;\n    font-size: 2em;\n    color: #fff\n  }\n\n  .widget.ui-draggable-dragging {\n    min-width: 100%\n  }\n\n  .widget.ui-sortable-helper {\n    opacity: .8\n  }\n\n  .widget-placeholder {\n    border: 1px dashed #c3c4c7;\n    margin: 0 auto 10px;\n    height: 45px;\n    width: 100%;\n    box-sizing: border-box\n  }\n\n  #widgets-right .widget-placeholder {\n    margin-top: 0\n  }\n\n  #widgets-right .closed .widget-placeholder {\n    height: 0;\n    border: 0;\n    margin-top: -10px\n  }\n\n  .sidebar-name {\n    position: relative;\n    box-sizing: border-box\n  }\n\n  .js .sidebar-name {\n    cursor: pointer\n  }\n\n  .sidebar-name .handlediv {\n    float: right;\n    width: 38px;\n    height: 38px;\n    border: 0;\n    margin: 0;\n    padding: 8px;\n    background: 0 0;\n    cursor: pointer;\n    outline: 0\n  }\n\n  #widgets-right .sidebar-name .handlediv {\n    margin: 5px 3px 0 0\n  }\n\n  .sidebar-name .handlediv:focus {\n    box-shadow: none;\n    outline: 1px solid transparent\n  }\n\n  #widgets-left .sidebar-name .toggle-indicator {\n    display: none\n  }\n\n  #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 {\n    display: block\n  }\n\n  .sidebar-name .toggle-indicator:before {\n    padding: 1px 2px 1px 0;\n    border-radius: 50%\n  }\n\n  .sidebar-name .handlediv:focus .toggle-indicator:before {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8)\n  }\n\n  .sidebar-name h2, .sidebar-name h3 {\n    margin: 0;\n    padding: 8px 10px;\n    overflow: hidden;\n    white-space: normal;\n    line-height: 1.5\n  }\n\n  .widgets-holder-wrap .description {\n    padding: 0 0 15px;\n    margin: 0;\n    font-style: normal;\n    color: #646970\n  }\n\n  .inactive-sidebar .description, .widget-holder .description {\n    color: #50575e\n  }\n\n  #widgets-right .widgets-holder-wrap .description {\n    padding-left: 7px;\n    padding-right: 7px\n  }\n\n  div.widget-liquid-left {\n    margin: 0;\n    width: 38%;\n    float: left\n  }\n\n  div.widget-liquid-right {\n    float: right;\n    width: 58%\n  }\n\n  div#widgets-left {\n    padding-top: 12px\n  }\n\n  div#widgets-left .closed .sidebar-name, div#widgets-left .inactive-sidebar.closed .sidebar-name {\n    margin-bottom: 10px\n  }\n\n  div#widgets-left .sidebar-name h2, div#widgets-left .sidebar-name h3 {\n    padding: 10px 0;\n    margin: 0 10px 0 0\n  }\n\n  #widgets-left .widgets-holder-wrap, div#widgets-left .widget-holder {\n    background: 0 0;\n    border: none\n  }\n\n  #widgets-left .widgets-holder-wrap {\n    border: none;\n    box-shadow: none\n  }\n\n  #available-widgets .widget {\n    margin: 0\n  }\n\n  #available-widgets .widget:nth-child(odd) {\n    clear: both\n  }\n\n  #available-widgets .widget .widget-description {\n    display: block;\n    padding: 10px 15px;\n    font-size: 12px;\n    overflow-wrap: break-word;\n    word-wrap: break-word;\n    -ms-word-break: break-all;\n    word-break: break-word;\n    -webkit-hyphens: auto;\n    hyphens: auto\n  }\n\n  #available-widgets #widget-list {\n    position: relative\n  }\n\n  #widgets-left .inactive-sidebar {\n    clear: both;\n    width: 100%;\n    background: 0 0;\n    padding: 0;\n    margin: 0 0 20px;\n    border: none;\n    box-shadow: none\n  }\n\n  #widgets-left .inactive-sidebar.first {\n    margin-top: 40px\n  }\n\n  div#widgets-left .inactive-sidebar .widget.expanded {\n    left: auto\n  }\n\n  .widget-title-action {\n    float: right;\n    position: relative\n  }\n\n  div#widgets-left .inactive-sidebar .widgets-sortables {\n    min-height: 42px;\n    padding: 0;\n    background: 0 0;\n    margin: 0;\n    position: relative\n  }\n\n  div#widgets-right .sidebars-column-1, div#widgets-right .sidebars-column-2 {\n    max-width: 450px\n  }\n\n  div#widgets-right .widgets-holder-wrap {\n    margin: 10px 0 0\n  }\n\n  div#widgets-right .sidebar-description {\n    min-height: 20px;\n    margin-top: -5px\n  }\n\n  div#widgets-right .sidebar-name h2, div#widgets-right .sidebar-name h3 {\n    padding: 15px 15px 15px 7px\n  }\n\n  div#widgets-right .widget-top {\n    padding: 0\n  }\n\n  div#widgets-right .widgets-sortables {\n    padding: 0 8px;\n    margin-bottom: 9px;\n    position: relative;\n    min-height: 123px\n  }\n\n  div#widgets-right .closed .widgets-sortables {\n    min-height: 0;\n    margin-bottom: 0\n  }\n\n  .remove-inactive-widgets .spinner, .sidebar-name .spinner {\n    float: none;\n    position: relative;\n    top: -2px;\n    margin: -5px 5px\n  }\n\n  .sidebar-name .spinner {\n    position: absolute;\n    top: 18px;\n    right: 30px\n  }\n\n  #widgets-right .widgets-holder-wrap.widget-hover {\n    border-color: #787c82;\n    box-shadow: 0 1px 2px rgba(0, 0, 0, .3)\n  }\n\n  .widget-access-link {\n    float: right;\n    margin: -5px 0 10px 10px\n  }\n\n  .widgets_access #widgets-left .widget .widget-top {\n    cursor: auto\n  }\n\n  .widgets_access #wpwrap .widget-control-edit, .widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description, .widgets_access #wpwrap .widgets-holder-wrap.closed .widget {\n    display: block\n  }\n\n  .widgets_access #widgets-left .widget .widget-top:hover, .widgets_access #widgets-right .widget .widget-top:hover {\n    border-color: #dcdcde\n  }\n\n  #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 {\n    display: none\n  }\n\n  .widget-control-edit {\n    display: block;\n    color: #646970;\n    background: #f0f0f1;\n    padding: 0 15px;\n    line-height: 3.30769230;\n    border-left: 1px solid #dcdcde\n  }\n\n  #widgets-left .widget-control-edit:hover, #widgets-right .widget-control-edit:hover {\n    color: #fff;\n    background: #3c434a;\n    border-left: 0;\n    outline: 1px solid #3c434a\n  }\n\n  .widgets-holder-wrap .sidebar-description, .widgets-holder-wrap .sidebar-name {\n    -webkit-user-select: none;\n    user-select: none\n  }\n\n  .editwidget {\n    margin: 0 auto\n  }\n\n  .editwidget .widget-inside {\n    display: block;\n    padding: 0 15px\n  }\n\n  .editwidget .widget-control-actions {\n    margin-top: 20px\n  }\n\n  .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 {\n    display: none\n  }\n\n  .js .widgets-holder-wrap.closed .widget.ui-sortable-helper {\n    display: block\n  }\n\n  .widget-description, .widget-inside {\n    display: none\n  }\n\n  .widget-inside {\n    background: #fff\n  }\n\n  .widget-inside select {\n    max-width: 100%\n  }\n\n  #removing-widget {\n    display: none;\n    font-weight: 400;\n    padding-left: 15px;\n    font-size: 12px;\n    line-height: 1;\n    color: #000\n  }\n\n  .js #removing-widget {\n    color: #72aee6\n  }\n\n  #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 {\n    display: none\n  }\n\n  .widgets_access #widget-list, .widgets_access .widget-holder {\n    padding-top: 10px\n  }\n\n  .widgets_access #access-off {\n    display: inline\n  }\n\n  .widgets_access .sidebar-name, .widgets_access .widget .widget-top {\n    cursor: default\n  }\n\n  .widget-liquid-left #widgets-left.chooser #available-widgets .widget, .widget-liquid-left #widgets-left.chooser .inactive-sidebar {\n    transition: opacity .1s linear\n  }\n\n  .widget-liquid-left #widgets-left.chooser #available-widgets .widget, .widget-liquid-left #widgets-left.chooser .inactive-sidebar {\n    opacity: .2;\n    pointer-events: none\n  }\n\n  .widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question {\n    opacity: 1;\n    pointer-events: auto\n  }\n\n  #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 {\n    border-color: #8c8f94;\n    box-shadow: 0 1px 2px rgba(0, 0, 0, .1)\n  }\n\n  .widgets-chooser ul.widgets-chooser-sidebars {\n    margin: 0;\n    list-style-type: none;\n    max-height: 300px;\n    overflow: auto\n  }\n\n  .widgets-chooser {\n    display: none\n  }\n\n  .widgets-chooser ul {\n    border: 1px solid #c3c4c7\n  }\n\n  .widgets-chooser li {\n    border-bottom: 1px solid #c3c4c7;\n    background: #fff;\n    margin: 0;\n    position: relative\n  }\n\n  .widgets-chooser .widgets-chooser-button {\n    width: 100%;\n    padding: 10px 15px 10px 35px;\n    background: 0 0;\n    border: 0;\n    box-sizing: border-box;\n    text-align: left;\n    cursor: pointer;\n    transition: background .2s ease-in-out\n  }\n\n  .widgets-chooser .widgets-chooser-button:focus, .widgets-chooser .widgets-chooser-button:hover {\n    outline: 0;\n    text-decoration: underline\n  }\n\n  .widgets-chooser li:last-child {\n    border: none\n  }\n\n  .widgets-chooser .widgets-chooser-selected .widgets-chooser-button {\n    background: #2271b1;\n    color: #fff\n  }\n\n  .widgets-chooser .widgets-chooser-selected:before {\n    content: \"\\f147\";\n    display: block;\n    -webkit-font-smoothing: antialiased;\n    font: normal 26px/1 dashicons;\n    color: #fff;\n    position: absolute;\n    top: 7px;\n    left: 5px\n  }\n\n  .widgets-chooser .widgets-chooser-actions {\n    padding: 10px 0 12px;\n    text-align: center\n  }\n\n  #available-widgets .widget .widget-top {\n    cursor: pointer\n  }\n\n  #available-widgets .widget.ui-draggable-dragging .widget-top {\n    cursor: move\n  }\n\n  .text-widget-fields {\n    position: relative\n  }\n\n  .text-widget-fields [hidden] {\n    display: none\n  }\n\n  .text-widget-fields .wp-pointer.wp-pointer-top {\n    position: absolute;\n    z-index: 3;\n    top: 100px;\n    right: 10px;\n    left: 10px\n  }\n\n  .text-widget-fields .wp-pointer .wp-pointer-arrow {\n    left: auto;\n    right: 15px\n  }\n\n  .text-widget-fields .wp-pointer .wp-pointer-buttons {\n    line-height: 1.4\n  }\n\n  .custom-html-widget-fields > p > .CodeMirror {\n    border: 1px solid #dcdcde\n  }\n\n  .custom-html-widget-fields code {\n    padding-top: 1px;\n    padding-bottom: 1px\n  }\n\n  ul.CodeMirror-hints {\n    z-index: 101\n  }\n\n  .widget-control-actions .custom-html-widget-save-button.button.validation-blocked {\n    cursor: not-allowed\n  }\n\n  @media screen and (max-width: 782px) {\n    .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] {\n      margin: .25rem .25rem .25rem 0\n    }\n  }\n  @media screen and (max-width: 480px) {\n    div.widget-liquid-left {\n      width: 100%;\n      float: none;\n      border-right: none;\n      padding-right: 0\n    }\n    #widgets-left .sidebar-name {\n      margin-right: 0\n    }\n    #widgets-left #available-widgets .widget-top {\n      margin-right: 0\n    }\n    #widgets-left .inactive-sidebar .widgets-sortables {\n      margin-right: 0\n    }\n    div.widget-liquid-right {\n      width: 100%;\n      float: none\n    }\n    div.widget {\n      max-width: 480px\n    }\n    .widget-access-link {\n      float: none;\n      margin: 15px 0 0\n    }\n  }\n  @media screen and (max-width: 320px) {\n    div.widget {\n      max-width: 320px\n    }\n  }\n  @media only screen and (min-width: 1250px) {\n    #widgets-left #available-widgets .widget {\n      width: 49%;\n      float: left\n    }\n    .widget.ui-draggable-dragging {\n      min-width: 49%\n    }\n    #widgets-left #available-widgets .widget:nth-child(even) {\n      float: right\n    }\n    #widgets-right .sidebars-column-1, #widgets-right .sidebars-column-2 {\n      float: left;\n      width: 49%\n    }\n    #widgets-right .sidebars-column-1 {\n      margin-right: 2%\n    }\n    #widgets-right.single-sidebar .sidebars-column-1, #widgets-right.single-sidebar .sidebars-column-2 {\n      float: none;\n      width: 100%;\n      margin: 0\n    }\n  }\n  /*! This file is auto-generated */\n  .site-icon-preview .favicon-preview {\n    margin: 5px 0 20px;\n    overflow: hidden;\n    position: relative;\n    max-width: 180px\n  }\n\n  .site-icon-preview .browser-title, .site-icon-preview .favicon {\n    height: 16px;\n    left: 88px;\n    overflow: hidden;\n    position: absolute;\n    top: 16px\n  }\n\n  .site-icon-preview .favicon {\n    width: 16px\n  }\n\n  .site-icon-preview .browser-title {\n    left: 109px;\n    width: 72px;\n    white-space: nowrap\n  }\n\n  .site-icon-preview .app-icon-preview {\n    background-color: #000;\n    border-radius: 16px;\n    height: 64px;\n    overflow: hidden;\n    width: 64px;\n    margin-top: 5px\n  }\n\n  .site-icon-preview .app-icon-preview, .site-icon-preview .favicon {\n    direction: ltr\n  }\n\n  .customize-control-site_icon .favicon-preview {\n    float: left;\n    margin-right: 12px;\n    margin-bottom: 0\n  }\n\n  .customize-control-site_icon .app-icon-preview {\n    margin-top: 9px\n  }\n\n  /*! This file is auto-generated */\n  body.rtl, body.rtl .press-this a.wp-switch-editor {\n    font-family: Tahoma, Arial, sans-serif\n  }\n\n  .rtl h1, .rtl h2, .rtl h3, .rtl h4, .rtl h5, .rtl h6 {\n    font-family: Arial, sans-serif;\n    font-weight: 600\n  }\n\n  body.locale-he-il, body.locale-he-il .press-this a.wp-switch-editor {\n    font-family: Arial, sans-serif\n  }\n\n  .locale-he-il em {\n    font-style: normal;\n    font-weight: 600\n  }\n\n  .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 {\n    font-style: normal\n  }\n\n  .locale-zh-cn .hdnle a {\n    font-size: 12px\n  }\n\n  .locale-zh-cn form.upgrade .hint {\n    font-style: normal;\n    font-size: 100%\n  }\n\n  .locale-zh-cn #sort-buttons {\n    font-size: 1em !important\n  }\n\n  .locale-de-de #customize-header-actions .button, .locale-de-de-formal #customize-header-actions .button {\n    padding: 0 5px 1px\n  }\n\n  .locale-de-de #customize-header-actions .spinner, .locale-de-de-formal #customize-header-actions .spinner {\n    margin: 16px 3px 0\n  }\n\n  .locale-ru-ru #adminmenu {\n    width: inherit\n  }\n\n  .locale-ru-ru #adminmenu, .locale-ru-ru #wpbody {\n    margin-left: 0\n  }\n\n  .locale-ru-ru .inline-edit-row fieldset label span.title, .locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend {\n    width: 8em\n  }\n\n  .locale-ru-ru .inline-edit-row fieldset .timestamp-wrap, .locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap {\n    margin-left: 8em\n  }\n\n  .locale-ru-ru.post-new-php .tagsdiv .newtag, .locale-ru-ru.post-php .tagsdiv .newtag {\n    width: 165px\n  }\n\n  .locale-ru-ru.press-this .posting {\n    margin-right: 277px\n  }\n\n  .locale-ru-ru .press-this-sidebar {\n    width: 265px\n  }\n\n  .locale-ru-ru #customize-header-actions .button {\n    padding: 0 5px 1px\n  }\n\n  .locale-ru-ru #customize-header-actions .spinner {\n    margin: 16px 3px 0\n  }\n\n  .locale-lt-lt .inline-edit-row fieldset label span.title, .locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend {\n    width: 8em\n  }\n\n  .locale-lt-lt .inline-edit-row fieldset .timestamp-wrap, .locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap {\n    margin-left: 8em\n  }\n\n  @media screen and (max-width: 782px) {\n    .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 {\n      margin-left: 0\n    }\n  }\n  /*! This file is auto-generated */\n  .wp-core-ui .button, .wp-core-ui .button-primary, .wp-core-ui .button-secondary {\n    display: inline-block;\n    text-decoration: none;\n    font-size: 13px;\n    line-height: 2.15384615;\n    min-height: 30px;\n    margin: 0;\n    padding: 0 10px;\n    cursor: pointer;\n    border-width: 1px;\n    border-style: solid;\n    -webkit-appearance: none;\n    border-radius: 3px;\n    white-space: nowrap;\n    box-sizing: border-box\n  }\n\n  .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 {\n    border-width: 0;\n    border-style: none;\n    padding: 0\n  }\n\n  .wp-core-ui .button-group.button-large .button, .wp-core-ui .button.button-large {\n    min-height: 32px;\n    line-height: 2.30769231;\n    padding: 0 12px\n  }\n\n  .wp-core-ui .button-group.button-small .button, .wp-core-ui .button.button-small {\n    min-height: 26px;\n    line-height: 2.18181818;\n    padding: 0 8px;\n    font-size: 11px\n  }\n\n  .wp-core-ui .button-group.button-hero .button, .wp-core-ui .button.button-hero {\n    font-size: 14px;\n    min-height: 46px;\n    line-height: 3.14285714;\n    padding: 0 36px\n  }\n\n  .wp-core-ui .button.hidden {\n    display: none\n  }\n\n  .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 {\n    background: 0 0;\n    border: none;\n    box-shadow: none;\n    padding: 0 2px 1px;\n    width: auto\n  }\n\n  .wp-core-ui .button, .wp-core-ui .button-secondary {\n    color: #2271b1;\n    border-color: #2271b1;\n    background: #f6f7f7;\n    vertical-align: top\n  }\n\n  .wp-core-ui p .button {\n    vertical-align: baseline\n  }\n\n  .wp-core-ui .button-secondary:hover, .wp-core-ui .button.hover, .wp-core-ui .button:hover {\n    background: #f0f0f1;\n    border-color: #0a4b78;\n    color: #0a4b78\n  }\n\n  .wp-core-ui .button-secondary:focus, .wp-core-ui .button.focus, .wp-core-ui .button:focus {\n    background: #f6f7f7;\n    border-color: #3582c4;\n    color: #0a4b78;\n    box-shadow: 0 0 0 1px #3582c4;\n    outline: 2px solid transparent;\n    outline-offset: 0\n  }\n\n  .wp-core-ui .button-secondary:active, .wp-core-ui .button:active {\n    background: #f6f7f7;\n    border-color: #8c8f94;\n    box-shadow: none\n  }\n\n  .wp-core-ui .button.active, .wp-core-ui .button.active:hover {\n    background-color: #dcdcde;\n    color: #135e96;\n    border-color: #0a4b78;\n    box-shadow: inset 0 2px 5px -3px #0a4b78\n  }\n\n  .wp-core-ui .button.active:focus {\n    border-color: #3582c4;\n    box-shadow: inset 0 2px 5px -3px #0a4b78, 0 0 0 1px #3582c4\n  }\n\n  .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] {\n    color: #a7aaad !important;\n    border-color: #dcdcde !important;\n    background: #f6f7f7 !important;\n    box-shadow: none !important;\n    cursor: default;\n    transform: none !important\n  }\n\n  .wp-core-ui .button-link {\n    margin: 0;\n    padding: 0;\n    box-shadow: none;\n    border: 0;\n    border-radius: 0;\n    background: 0 0;\n    cursor: pointer;\n    text-align: left;\n    color: #2271b1;\n    text-decoration: underline;\n    transition-property: border, background, color;\n    transition-duration: .05s;\n    transition-timing-function: ease-in-out\n  }\n\n  .wp-core-ui .button-link:active, .wp-core-ui .button-link:hover {\n    color: #135e96\n  }\n\n  .wp-core-ui .button-link:focus {\n    color: #043959;\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8);\n    outline: 1px solid transparent\n  }\n\n  .wp-core-ui .button-link-delete {\n    color: #d63638\n  }\n\n  .wp-core-ui .button-link-delete:focus, .wp-core-ui .button-link-delete:hover {\n    color: #d63638;\n    background: 0 0\n  }\n\n  .wp-core-ui .button-link-delete:disabled {\n    background: 0 0 !important\n  }\n\n  .wp-core-ui .button-primary {\n    background: #2271b1;\n    border-color: #2271b1;\n    color: #fff;\n    text-decoration: none;\n    text-shadow: none\n  }\n\n  .wp-core-ui .button-primary.focus, .wp-core-ui .button-primary.hover, .wp-core-ui .button-primary:focus, .wp-core-ui .button-primary:hover {\n    background: #135e96;\n    border-color: #135e96;\n    color: #fff\n  }\n\n  .wp-core-ui .button-primary.focus, .wp-core-ui .button-primary:focus {\n    box-shadow: 0 0 0 1px #fff, 0 0 0 3px #2271b1\n  }\n\n  .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 {\n    background: #135e96;\n    border-color: #135e96;\n    box-shadow: none;\n    color: #fff\n  }\n\n  .wp-core-ui .button-primary-disabled, .wp-core-ui .button-primary.disabled, .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary[disabled] {\n    color: #a7aaad !important;\n    background: #f6f7f7 !important;\n    border-color: #dcdcde !important;\n    box-shadow: none !important;\n    text-shadow: none !important;\n    cursor: default\n  }\n\n  .wp-core-ui .button-group {\n    position: relative;\n    display: inline-block;\n    white-space: nowrap;\n    font-size: 0;\n    vertical-align: middle\n  }\n\n  .wp-core-ui .button-group > .button {\n    display: inline-block;\n    border-radius: 0;\n    margin-right: -1px\n  }\n\n  .wp-core-ui .button-group > .button:first-child {\n    border-radius: 3px 0 0 3px\n  }\n\n  .wp-core-ui .button-group > .button:last-child {\n    border-radius: 0 3px 3px 0\n  }\n\n  .wp-core-ui .button-group > .button-primary + .button {\n    border-left: 0\n  }\n\n  .wp-core-ui .button-group > .button:focus {\n    position: relative;\n    z-index: 1\n  }\n\n  .wp-core-ui .button-group > .button.active {\n    background-color: #dcdcde;\n    color: #135e96;\n    border-color: #0a4b78;\n    box-shadow: inset 0 2px 5px -3px #0a4b78\n  }\n\n  .wp-core-ui .button-group > .button.active:focus {\n    border-color: #3582c4;\n    box-shadow: inset 0 2px 5px -3px #0a4b78, 0 0 0 1px #3582c4\n  }\n\n  @media screen and (max-width: 782px) {\n    .wp-core-ui .button, .wp-core-ui .button.button-large, .wp-core-ui .button.button-small, a.preview, input#publish, input#save-post {\n      padding: 0 14px;\n      line-height: 2.71428571;\n      font-size: 14px;\n      vertical-align: middle;\n      min-height: 40px;\n      margin-bottom: 4px\n    }\n    .wp-core-ui .copy-to-clipboard-container .copy-attachment-url {\n      margin-bottom: 0\n    }\n    #media-upload.wp-core-ui .button {\n      padding: 0 10px 1px;\n      min-height: 24px;\n      line-height: 22px;\n      font-size: 13px\n    }\n    .media-frame.mode-grid .bulk-select .button {\n      margin-bottom: 0\n    }\n    .wp-core-ui .save-post-status.button {\n      position: relative;\n      margin: 0 14px 0 10px\n    }\n    .wp-core-ui.wp-customizer .button {\n      font-size: 13px;\n      line-height: 2.15384615;\n      min-height: 30px;\n      margin: 0;\n      vertical-align: inherit\n    }\n    .media-modal-content .media-toolbar-primary .media-button {\n      margin-top: 10px;\n      margin-left: 5px\n    }\n    .interim-login .button.button-large {\n      min-height: 30px;\n      line-height: 2;\n      padding: 0 12px 2px\n    }\n  }\n  /*! This file is auto-generated */\n  #wp-auth-check-wrap.hidden {\n    display: none\n  }\n\n  #wp-auth-check-wrap #wp-auth-check-bg {\n    position: fixed;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    background: #000;\n    opacity: .7;\n    z-index: 1000010\n  }\n\n  #wp-auth-check-wrap #wp-auth-check {\n    position: fixed;\n    left: 50%;\n    overflow: hidden;\n    top: 40px;\n    bottom: 20px;\n    max-height: 415px;\n    width: 380px;\n    margin: 0 0 0 -190px;\n    padding: 30px 0 0;\n    background-color: #f0f0f1;\n    z-index: 1000011;\n    box-shadow: 0 3px 6px rgba(0, 0, 0, .3)\n  }\n\n  @media screen and (max-width: 380px) {\n    #wp-auth-check-wrap #wp-auth-check {\n      left: 0;\n      width: 100%;\n      margin: 0\n    }\n  }\n\n  #wp-auth-check-wrap.fallback #wp-auth-check {\n    max-height: 180px;\n    overflow: auto\n  }\n\n  #wp-auth-check-wrap #wp-auth-check-form {\n    height: 100%;\n    position: relative;\n    overflow: auto;\n    -webkit-overflow-scrolling: touch\n  }\n\n  #wp-auth-check-form.loading:before {\n    content: \"\";\n    display: block;\n    width: 20px;\n    height: 20px;\n    position: absolute;\n    left: 50%;\n    top: 50%;\n    margin: -10px 0 0 -10px;\n    background: url(../images/spinner.gif) no-repeat center;\n    background-size: 20px 20px;\n    transform: translateZ(0)\n  }\n\n  @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {\n    #wp-auth-check-form.loading:before {\n      background-image: url(../images/spinner-2x.gif)\n    }\n  }\n\n  #wp-auth-check-wrap #wp-auth-check-form iframe {\n    height: 98%;\n    width: 100%\n  }\n\n  #wp-auth-check-wrap .wp-auth-check-close {\n    position: absolute;\n    top: 5px;\n    right: 5px;\n    height: 22px;\n    width: 22px;\n    color: #787c82;\n    text-decoration: none;\n    text-align: center\n  }\n\n  #wp-auth-check-wrap .wp-auth-check-close:before {\n    content: \"\\f158\";\n    font: normal 20px/22px dashicons;\n    speak: never;\n    -webkit-font-smoothing: antialiased !important;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  #wp-auth-check-wrap .wp-auth-check-close:focus, #wp-auth-check-wrap .wp-auth-check-close:hover {\n    color: #2271b1\n  }\n\n  #wp-auth-check-wrap .wp-auth-fallback-expired {\n    outline: 0\n  }\n\n  #wp-auth-check-wrap .wp-auth-fallback {\n    font-size: 14px;\n    line-height: 1.5;\n    padding: 0 25px;\n    display: none\n  }\n\n  #wp-auth-check-wrap.fallback .wp-auth-check-close, #wp-auth-check-wrap.fallback .wp-auth-fallback {\n    display: block\n  }\n\n  /*! This file is auto-generated */\n  .media-modal * {\n    box-sizing: content-box\n  }\n\n  .media-modal input, .media-modal select, .media-modal textarea {\n    box-sizing: border-box\n  }\n\n  .media-frame, .media-modal {\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n    font-size: 12px;\n    -webkit-overflow-scrolling: touch\n  }\n\n  .media-modal legend {\n    padding: 0;\n    font-size: 13px\n  }\n\n  .media-modal label {\n    font-size: 13px\n  }\n\n  .media-modal .legend-inline {\n    position: absolute;\n    transform: translate(-100%, 50%);\n    margin-left: -1%;\n    line-height: 1.2\n  }\n\n  .media-frame a {\n    border-bottom: none;\n    color: #2271b1\n  }\n\n  .media-frame a:active, .media-frame a:hover {\n    color: #135e96\n  }\n\n  .media-frame a:focus {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8);\n    color: #043959;\n    outline: 1px solid transparent\n  }\n\n  .media-frame a.button {\n    color: #2c3338\n  }\n\n  .media-frame a.button:hover {\n    color: #1d2327\n  }\n\n  .media-frame a.button-primary, .media-frame a.button-primary:hover {\n    color: #fff\n  }\n\n  .media-frame input, .media-frame textarea {\n    padding: 6px 8px\n  }\n\n  .media-frame select, .wp-admin .media-frame select {\n    min-height: 30px;\n    vertical-align: middle\n  }\n\n  .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 {\n    box-shadow: 0 0 0 transparent;\n    border-radius: 4px;\n    border: 1px solid #8c8f94;\n    background-color: #fff;\n    color: #2c3338;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n    font-size: 13px\n  }\n\n  .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] {\n    padding: 0 8px;\n    line-height: 2.15384615\n  }\n\n  .media-frame.mode-grid .wp-filter input[type=search] {\n    font-size: 14px;\n    line-height: 2\n  }\n\n  .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 {\n    border-color: #3582c4;\n    box-shadow: 0 0 0 1px #3582c4;\n    outline: 2px solid transparent\n  }\n\n  .media-frame input:disabled, .media-frame input[readonly], .media-frame textarea:disabled, .media-frame textarea[readonly] {\n    background-color: #f0f0f1\n  }\n\n  .media-frame input[type=search] {\n    -webkit-appearance: textfield\n  }\n\n  .media-frame ::-webkit-input-placeholder {\n    color: #646970\n  }\n\n  .media-frame ::-moz-placeholder {\n    color: #646970;\n    opacity: 1\n  }\n\n  .media-frame :-ms-input-placeholder {\n    color: #646970\n  }\n\n  .media-frame .hidden, .media-frame .setting.hidden {\n    display: none\n  }\n\n  /*!\n * jQuery UI Draggable/Sortable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n  .ui-draggable-handle, .ui-sortable-handle {\n    touch-action: none\n  }\n\n  .media-modal {\n    position: fixed;\n    top: 30px;\n    left: 30px;\n    right: 30px;\n    bottom: 30px;\n    z-index: 160000\n  }\n\n  .wp-customizer .media-modal {\n    z-index: 560000\n  }\n\n  .media-modal-backdrop {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    min-height: 360px;\n    background: #000;\n    opacity: .7;\n    z-index: 159900\n  }\n\n  .wp-customizer .media-modal-backdrop {\n    z-index: 559900\n  }\n\n  .media-modal-close {\n    position: absolute;\n    top: 0;\n    right: 0;\n    width: 50px;\n    height: 50px;\n    margin: 0;\n    padding: 0;\n    border: 1px solid transparent;\n    background: 0 0;\n    color: #646970;\n    z-index: 1000;\n    cursor: pointer;\n    outline: 0;\n    transition: color .1s ease-in-out, background .1s ease-in-out\n  }\n\n  .media-modal-close:active, .media-modal-close:hover {\n    color: #135e96\n  }\n\n  .media-modal-close:focus {\n    color: #135e96;\n    border-color: #4f94d4;\n    box-shadow: 0 0 3px rgba(34, 113, 177, .8);\n    outline: 2px solid transparent\n  }\n\n  .media-modal-close span.media-modal-icon {\n    background-image: none\n  }\n\n  .media-modal-close .media-modal-icon:before {\n    content: \"\\f158\";\n    font: normal 20px/1 dashicons;\n    speak: never;\n    vertical-align: middle;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .media-modal-content {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    overflow: auto;\n    min-height: 300px;\n    box-shadow: 0 5px 15px rgba(0, 0, 0, .7);\n    background: #fff;\n    -webkit-font-smoothing: subpixel-antialiased\n  }\n\n  .media-modal-content .media-frame select.attachment-filters {\n    margin-top: 32px;\n    margin-right: 2%;\n    width: 42%;\n    width: calc(48% - 12px)\n  }\n\n  .media-modal-content .attachments-browser .search {\n    width: 100%\n  }\n\n  .wp-core-ui .media-modal-icon {\n    background-image: url(../images/uploader-icons.png);\n    background-repeat: no-repeat\n  }\n\n  .media-toolbar {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    z-index: 100;\n    height: 60px;\n    padding: 0 16px;\n    border: 0 solid #dcdcde;\n    overflow: hidden\n  }\n\n  .media-frame-toolbar .media-toolbar {\n    top: auto;\n    bottom: -47px;\n    height: auto;\n    overflow: visible;\n    border-top: 1px solid #dcdcde\n  }\n\n  .media-toolbar-primary {\n    float: right;\n    height: 100%;\n    position: relative\n  }\n\n  .media-toolbar-secondary {\n    float: left;\n    height: 100%\n  }\n\n  .media-toolbar-primary > .media-button, .media-toolbar-primary > .media-button-group {\n    margin-left: 10px;\n    float: left;\n    margin-top: 15px\n  }\n\n  .media-toolbar-secondary > .media-button, .media-toolbar-secondary > .media-button-group {\n    margin-right: 10px;\n    margin-top: 15px\n  }\n\n  .media-sidebar {\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    width: 267px;\n    padding: 0 16px;\n    z-index: 75;\n    background: #f6f7f7;\n    border-left: 1px solid #dcdcde;\n    overflow: auto;\n    -webkit-overflow-scrolling: touch\n  }\n\n  .media-sidebar::after {\n    content: \"\";\n    display: flex;\n    clear: both;\n    height: 24px\n  }\n\n  .hide-toolbar .media-sidebar {\n    bottom: 0\n  }\n\n  .image-details h2:not(.media-attachments-filter-heading), .media-sidebar h2 {\n    position: relative;\n    font-weight: 600;\n    text-transform: uppercase;\n    font-size: 12px;\n    color: #646970;\n    margin: 24px 0 8px\n  }\n\n  .attachment-details .setting, .media-sidebar .setting {\n    display: block;\n    float: left;\n    width: 100%;\n    margin: 0 0 10px\n  }\n\n  .media-sidebar .collection-settings .setting {\n    margin: 1px 0\n  }\n\n  .attachment-details .setting.has-description, .media-sidebar .setting.has-description {\n    margin-bottom: 5px\n  }\n\n  .media-sidebar .setting .link-to-custom {\n    margin: 3px 2px 0\n  }\n\n  .attachment-details .setting .name, .attachment-details .setting span, .media-sidebar .setting .name, .media-sidebar .setting .value, .media-sidebar .setting span {\n    min-width: 30%;\n    margin-right: 4%;\n    font-size: 12px;\n    text-align: right;\n    word-wrap: break-word\n  }\n\n  .media-sidebar .setting .name {\n    max-width: 80px\n  }\n\n  .media-sidebar .setting .value {\n    text-align: left\n  }\n\n  .media-sidebar .setting select {\n    max-width: 65%\n  }\n\n  .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] {\n    float: none;\n    margin: 8px 3px 0;\n    padding: 0\n  }\n\n  .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 {\n    float: left;\n    min-height: 22px;\n    padding-top: 8px;\n    line-height: 1.33333333;\n    font-weight: 400;\n    color: #646970\n  }\n\n  .media-sidebar .checkbox-label-inline {\n    font-size: 12px\n  }\n\n  .attachment-details .copy-to-clipboard-container, .media-sidebar .copy-to-clipboard-container {\n    flex-wrap: wrap;\n    margin-top: 10px;\n    margin-left: calc(35% - 1px);\n    padding-top: 10px\n  }\n\n  .attachment-details .attachment-info .copy-to-clipboard-container {\n    float: none\n  }\n\n  .attachment-details .copy-to-clipboard-container .success, .media-sidebar .copy-to-clipboard-container .success {\n    padding: 0;\n    min-height: 0;\n    line-height: 2.18181818;\n    text-align: left;\n    color: #008a20\n  }\n\n  .compat-item label span {\n    text-align: right\n  }\n\n  .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 {\n    box-sizing: border-box;\n    margin: 1px;\n    width: 65%;\n    float: right\n  }\n\n  .attachment-details .setting .value, .attachment-details .setting + .description, .media-sidebar .setting .value {\n    margin: 0 1px;\n    text-align: left\n  }\n\n  .attachment-details .setting + .description {\n    clear: both;\n    font-size: 12px;\n    font-style: normal;\n    margin-bottom: 10px\n  }\n\n  .attachment-details .setting textarea, .compat-item .field textarea, .media-sidebar .setting textarea {\n    height: 62px;\n    resize: vertical\n  }\n\n  .compat-item {\n    float: left;\n    width: 100%;\n    overflow: hidden\n  }\n\n  .compat-item table {\n    width: 100%;\n    table-layout: fixed;\n    border-spacing: 0;\n    border: 0\n  }\n\n  .compat-item tr {\n    padding: 2px 0;\n    display: block;\n    overflow: hidden\n  }\n\n  .compat-item .field, .compat-item .label {\n    display: block;\n    margin: 0;\n    padding: 0\n  }\n\n  .compat-item .label {\n    min-width: 30%;\n    margin-right: 4%;\n    float: left;\n    text-align: right\n  }\n\n  .compat-item .label span {\n    display: block;\n    width: 100%\n  }\n\n  .compat-item .field {\n    float: right;\n    width: 65%;\n    margin: 1px\n  }\n\n  .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 {\n    width: 100%;\n    margin: 0;\n    box-sizing: border-box\n  }\n\n  .sidebar-for-errors .attachment-details, .sidebar-for-errors .compat-item, .sidebar-for-errors .media-sidebar .media-progress-bar, .sidebar-for-errors .upload-details {\n    display: none !important\n  }\n\n  .media-menu {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    margin: 0;\n    padding: 50px 0 10px;\n    background: #f6f7f7;\n    border-right-width: 1px;\n    border-right-style: solid;\n    border-right-color: #c3c4c7;\n    -webkit-user-select: none;\n    user-select: none\n  }\n\n  .media-menu .media-menu-item {\n    display: block;\n    box-sizing: border-box;\n    width: 100%;\n    position: relative;\n    border: 0;\n    margin: 0;\n    padding: 8px 20px;\n    font-size: 14px;\n    line-height: 1.28571428;\n    background: 0 0;\n    color: #2271b1;\n    text-align: left;\n    text-decoration: none;\n    cursor: pointer\n  }\n\n  .media-menu .media-menu-item:hover {\n    background: rgba(0, 0, 0, .04)\n  }\n\n  .media-menu .media-menu-item:active {\n    color: #2271b1;\n    outline: 0\n  }\n\n  .media-menu .active, .media-menu .active:hover {\n    color: #1d2327;\n    font-weight: 600\n  }\n\n  .media-menu .media-menu-item:focus {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8);\n    color: #043959;\n    outline: 1px solid transparent\n  }\n\n  .media-menu .separator {\n    height: 0;\n    margin: 12px 20px;\n    padding: 0;\n    border-top: 1px solid #dcdcde\n  }\n\n  .media-router {\n    position: relative;\n    padding: 0 6px;\n    margin: 0;\n    clear: both\n  }\n\n  .media-router .media-menu-item {\n    position: relative;\n    float: left;\n    border: 0;\n    margin: 0;\n    padding: 8px 10px 9px;\n    height: 18px;\n    line-height: 1.28571428;\n    font-size: 14px;\n    text-decoration: none;\n    background: 0 0;\n    cursor: pointer;\n    transition: none\n  }\n\n  .media-router .media-menu-item:last-child {\n    border-right: 0\n  }\n\n  .media-router .media-menu-item:active, .media-router .media-menu-item:hover {\n    color: #2271b1\n  }\n\n  .media-router .active, .media-router .active:hover {\n    color: #1d2327\n  }\n\n  .media-router .media-menu-item:focus {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8);\n    color: #043959;\n    outline: 1px solid transparent\n  }\n\n  .media-router .active, .media-router .media-menu-item.active:last-child {\n    margin: -1px -1px 0;\n    background: #fff;\n    border: 1px solid #dcdcde;\n    border-bottom: none\n  }\n\n  .media-router .active:after {\n    display: none\n  }\n\n  .media-frame {\n    overflow: hidden;\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0\n  }\n\n  .media-frame-menu {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    width: 200px;\n    z-index: 150\n  }\n\n  .media-frame-title {\n    position: absolute;\n    top: 0;\n    left: 200px;\n    right: 0;\n    height: 50px;\n    z-index: 200\n  }\n\n  .media-frame-router {\n    position: absolute;\n    top: 50px;\n    left: 200px;\n    right: 0;\n    height: 36px;\n    z-index: 200\n  }\n\n  .media-frame-content {\n    position: absolute;\n    top: 84px;\n    left: 200px;\n    right: 0;\n    bottom: 61px;\n    height: auto;\n    width: auto;\n    margin: 0;\n    overflow: auto;\n    background: #fff;\n    border-top: 1px solid #dcdcde\n  }\n\n  .media-frame-toolbar {\n    position: absolute;\n    left: 200px;\n    right: 0;\n    z-index: 100;\n    bottom: 60px;\n    height: auto\n  }\n\n  .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 {\n    left: 0\n  }\n\n  .media-frame.hide-toolbar .media-frame-content {\n    bottom: 0\n  }\n\n  .media-frame.hide-router .media-frame-content {\n    top: 50px\n  }\n\n  .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 {\n    display: none\n  }\n\n  .media-frame-title h1 {\n    padding: 0 16px;\n    font-size: 22px;\n    line-height: 2.27272727;\n    margin: 0\n  }\n\n  .media-attachments-filter-heading, .media-frame-menu-heading {\n    position: absolute;\n    left: 20px;\n    top: 22px;\n    margin: 0;\n    font-size: 13px;\n    line-height: 1;\n    z-index: 151\n  }\n\n  .media-attachments-filter-heading {\n    top: 10px;\n    left: 16px\n  }\n\n  .mode-grid .media-attachments-filter-heading {\n    top: 0;\n    left: -9999px\n  }\n\n  .mode-grid .media-frame-actions-heading {\n    display: none\n  }\n\n  .wp-core-ui .button.media-frame-menu-toggle {\n    display: none\n  }\n\n  .media-frame-title .suggested-dimensions {\n    font-size: 14px;\n    float: right;\n    margin-right: 20px\n  }\n\n  .media-frame-content .crop-content {\n    height: 100%\n  }\n\n  .wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon {\n    margin-right: 300px\n  }\n\n  .media-frame-content .crop-content .crop-image {\n    display: block;\n    margin: auto;\n    max-width: 100%;\n    max-height: 100%\n  }\n\n  .media-frame-content .crop-content .upload-errors {\n    position: absolute;\n    width: 300px;\n    top: 50%;\n    left: 50%;\n    margin-left: -150px;\n    margin-right: -150px;\n    z-index: 600000\n  }\n\n  .media-frame .media-iframe {\n    overflow: hidden\n  }\n\n  .media-frame .media-iframe, .media-frame .media-iframe iframe {\n    height: 100%;\n    width: 100%;\n    border: 0\n  }\n\n  .media-frame select.attachment-filters {\n    margin-top: 11px;\n    margin-right: 2%;\n    max-width: 42%;\n    max-width: calc(48% - 12px)\n  }\n\n  .media-frame select.attachment-filters:last-of-type {\n    margin-right: 0;\n    width: auto;\n    max-width: 100%\n  }\n\n  .media-frame .search {\n    margin: 32px 0 0;\n    padding: 4px;\n    font-size: 13px;\n    color: #3c434a;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n    -webkit-appearance: none\n  }\n\n  .media-toolbar-primary .search {\n    max-width: 100%\n  }\n\n  .media-frame .media-search-input-label {\n    position: absolute;\n    left: 0;\n    top: 10px;\n    margin: 0;\n    line-height: 1\n  }\n\n  .wp-core-ui .attachments {\n    margin: 0;\n    -webkit-overflow-scrolling: touch\n  }\n\n  .wp-core-ui .attachment {\n    position: relative;\n    float: left;\n    padding: 8px;\n    margin: 0;\n    color: #3c434a;\n    cursor: pointer;\n    list-style: none;\n    text-align: center;\n    -webkit-user-select: none;\n    user-select: none;\n    width: 25%;\n    box-sizing: border-box\n  }\n\n  .wp-core-ui .attachment.details:focus, .wp-core-ui .attachment:focus, .wp-core-ui .selected.attachment:focus {\n    box-shadow: inset 0 0 2px 3px #fff, inset 0 0 0 7px #4f94d4;\n    outline: 2px solid transparent;\n    outline-offset: -6px\n  }\n\n  .wp-core-ui .selected.attachment {\n    box-shadow: inset 0 0 0 5px #fff, inset 0 0 0 7px #c3c4c7\n  }\n\n  .wp-core-ui .attachment.details {\n    box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #2271b1\n  }\n\n  .wp-core-ui .attachment-preview {\n    position: relative;\n    box-shadow: inset 0 0 15px rgba(0, 0, 0, .1), inset 0 0 0 1px rgba(0, 0, 0, .05);\n    background: #f0f0f1;\n    cursor: pointer\n  }\n\n  .wp-core-ui .attachment-preview:before {\n    content: \"\";\n    display: block;\n    padding-top: 100%\n  }\n\n  .wp-core-ui .attachment .icon {\n    margin: 0 auto;\n    overflow: hidden\n  }\n\n  .wp-core-ui .attachment .thumbnail {\n    overflow: hidden;\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    opacity: 1;\n    transition: opacity .1s\n  }\n\n  .wp-core-ui .attachment .portrait img {\n    max-width: 100%\n  }\n\n  .wp-core-ui .attachment .landscape img {\n    max-height: 100%\n  }\n\n  .wp-core-ui .attachment .thumbnail:after {\n    content: \"\";\n    display: block;\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .1);\n    overflow: hidden\n  }\n\n  .wp-core-ui .attachment .thumbnail img {\n    top: 0;\n    left: 0\n  }\n\n  .wp-core-ui .attachment .thumbnail .centered {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    transform: translate(50%, 50%)\n  }\n\n  .wp-core-ui .attachment .thumbnail .centered img {\n    transform: translate(-50%, -50%)\n  }\n\n  .wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon {\n    transform: translate(-50%, -70%)\n  }\n\n  .wp-core-ui .attachment .filename {\n    position: absolute;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    overflow: hidden;\n    max-height: 100%;\n    word-wrap: break-word;\n    text-align: center;\n    font-weight: 600;\n    background: rgba(255, 255, 255, .8);\n    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .15)\n  }\n\n  .wp-core-ui .attachment .filename div {\n    padding: 5px 10px\n  }\n\n  .wp-core-ui .attachment .thumbnail img {\n    position: absolute\n  }\n\n  .wp-core-ui .attachment-close {\n    display: block;\n    position: absolute;\n    top: 5px;\n    right: 5px;\n    height: 22px;\n    width: 22px;\n    padding: 0;\n    background-color: #fff;\n    background-position: -96px 4px;\n    border-radius: 3px;\n    box-shadow: 0 0 0 1px rgba(0, 0, 0, .3);\n    transition: none\n  }\n\n  .wp-core-ui .attachment-close:focus, .wp-core-ui .attachment-close:hover {\n    background-position: -36px 4px\n  }\n\n  .wp-core-ui .attachment .check {\n    display: none;\n    height: 24px;\n    width: 24px;\n    padding: 0;\n    border: 0;\n    position: absolute;\n    z-index: 10;\n    top: 0;\n    right: 0;\n    outline: 0;\n    background: #f0f0f1;\n    cursor: pointer;\n    box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba(0, 0, 0, .15)\n  }\n\n  .wp-core-ui .attachment .check .media-modal-icon {\n    display: block;\n    background-position: -1px 0;\n    height: 15px;\n    width: 15px;\n    margin: 5px\n  }\n\n  .wp-core-ui .attachment .check:hover .media-modal-icon {\n    background-position: -40px 0\n  }\n\n  .wp-core-ui .attachment.selected .check {\n    display: block\n  }\n\n  .wp-core-ui .attachment.details .check, .wp-core-ui .attachment.selected .check:focus, .wp-core-ui .media-frame.mode-grid .attachment.selected .check {\n    background-color: #2271b1;\n    box-shadow: 0 0 0 1px #fff, 0 0 0 2px #2271b1\n  }\n\n  .wp-core-ui .attachment.selected .check:focus {\n    outline: 2px solid transparent\n  }\n\n  .wp-core-ui .attachment.details .check .media-modal-icon, .wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon {\n    background-position: -21px 0\n  }\n\n  .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 {\n    background-position: -60px 0\n  }\n\n  .wp-core-ui .media-frame .attachment .describe {\n    position: relative;\n    display: block;\n    width: 100%;\n    margin: 0;\n    padding: 0 8px;\n    font-size: 12px;\n    border-radius: 0\n  }\n\n  .media-frame .attachments-browser {\n    position: relative;\n    width: 100%;\n    height: 100%;\n    overflow: hidden\n  }\n\n  .attachments-browser .media-toolbar {\n    right: 300px;\n    height: 72px;\n    background: #fff\n  }\n\n  .attachments-browser.hide-sidebar .media-toolbar {\n    right: 0\n  }\n\n  .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 {\n    margin: 10px 0\n  }\n\n  .attachments-browser .attachments {\n    padding: 2px 8px 8px\n  }\n\n  .attachments-browser .uploader-inline, .attachments-browser.has-load-more .attachments-wrapper, .attachments-browser:not(.has-load-more) .attachments {\n    position: absolute;\n    top: 72px;\n    left: 0;\n    right: 300px;\n    bottom: 0;\n    overflow: auto;\n    outline: 0\n  }\n\n  .attachments-browser .uploader-inline.hidden {\n    display: none\n  }\n\n  .attachments-browser .media-toolbar-primary {\n    max-width: 33%\n  }\n\n  .mode-grid .attachments-browser .media-toolbar-primary {\n    display: flex;\n    align-items: center\n  }\n\n  .mode-grid .attachments-browser .media-toolbar-mode-select .media-toolbar-primary {\n    display: none\n  }\n\n  .attachments-browser .media-toolbar-secondary {\n    max-width: 66%\n  }\n\n  .uploader-inline .close {\n    background-color: transparent;\n    border: 0;\n    cursor: pointer;\n    height: 48px;\n    outline: 0;\n    padding: 0;\n    position: absolute;\n    right: 2px;\n    text-align: center;\n    top: 2px;\n    width: 48px;\n    z-index: 1\n  }\n\n  .uploader-inline .close:before {\n    font: normal 30px/1 dashicons !important;\n    color: #50575e;\n    display: inline-block;\n    content: \"\\f335\";\n    font-weight: 300;\n    margin-top: 1px\n  }\n\n  .uploader-inline .close:focus {\n    outline: 1px solid #4f94d4;\n    box-shadow: 0 0 3px rgba(34, 113, 177, .8)\n  }\n\n  .attachments-browser.hide-sidebar .attachments, .attachments-browser.hide-sidebar .uploader-inline {\n    right: 0;\n    margin-right: 0\n  }\n\n  .attachments-browser .instructions {\n    display: inline-block;\n    margin-top: 16px;\n    line-height: 1.38461538;\n    font-size: 13px;\n    color: #646970\n  }\n\n  .attachments-browser .no-media {\n    padding: 2em 0 0 2em\n  }\n\n  .more-loaded .attachment:not(.found-media) {\n    background: #dcdcde\n  }\n\n  .load-more-wrapper {\n    clear: both;\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    justify-content: center;\n    padding: 1em 0\n  }\n\n  .load-more-wrapper .load-more-count {\n    min-width: 100%;\n    margin: 0 0 1em;\n    text-align: center\n  }\n\n  .load-more-wrapper .load-more {\n    margin: 0\n  }\n\n  .media-frame .load-more-wrapper .load-more + .spinner {\n    float: none;\n    margin: 0 -30px 0 10px\n  }\n\n  .media-frame .load-more-wrapper .load-more.hidden + .spinner {\n    margin: 0\n  }\n\n  .load-more-wrapper::after {\n    content: \"\";\n    min-width: 100%;\n    order: 1\n  }\n\n  .load-more-wrapper .load-more-jump {\n    margin: 0 0 0 12px\n  }\n\n  .attachment.new-media {\n    outline: 2px dotted #c3c4c7\n  }\n\n  .load-more-wrapper {\n    clear: both;\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    justify-content: center;\n    padding: 1em 0\n  }\n\n  .load-more-wrapper .load-more-count {\n    min-width: 100%;\n    margin: 0 0 1em;\n    text-align: center\n  }\n\n  .load-more-wrapper .load-more {\n    margin: 0\n  }\n\n  .media-frame .load-more-wrapper .load-more + .spinner {\n    float: none;\n    margin: 0 -30px 0 10px\n  }\n\n  .media-frame .load-more-wrapper .load-more.hidden + .spinner {\n    margin: 0\n  }\n\n  .load-more-wrapper::after {\n    content: \"\";\n    min-width: 100%;\n    order: 1\n  }\n\n  .load-more-wrapper .load-more-jump {\n    margin: 0 0 0 12px\n  }\n\n  .media-progress-bar {\n    position: relative;\n    height: 10px;\n    width: 70%;\n    margin: 10px auto;\n    border-radius: 10px;\n    background: #dcdcde;\n    background: rgba(0, 0, 0, .1)\n  }\n\n  .media-progress-bar div {\n    height: 10px;\n    min-width: 20px;\n    width: 0;\n    background: #2271b1;\n    border-radius: 10px;\n    transition: width .3s\n  }\n\n  .media-uploader-status .media-progress-bar {\n    display: none;\n    width: 100%\n  }\n\n  .uploading.media-uploader-status .media-progress-bar {\n    display: block\n  }\n\n  .attachment-preview .media-progress-bar {\n    position: absolute;\n    top: 50%;\n    left: 15%;\n    width: 70%;\n    margin: -5px 0 0\n  }\n\n  .media-uploader-status {\n    position: relative;\n    margin: 0 auto;\n    padding-bottom: 10px;\n    max-width: 400px\n  }\n\n  .uploader-inline .media-uploader-status h2 {\n    display: none\n  }\n\n  .media-uploader-status .upload-details {\n    display: none;\n    font-size: 12px;\n    color: #646970\n  }\n\n  .uploading.media-uploader-status .upload-details {\n    display: block\n  }\n\n  .media-uploader-status .upload-detail-separator {\n    padding: 0 4px\n  }\n\n  .media-uploader-status .upload-count {\n    color: #3c434a\n  }\n\n  .media-uploader-status .upload-dismiss-errors, .media-uploader-status .upload-errors {\n    display: none\n  }\n\n  .errors.media-uploader-status .upload-dismiss-errors, .errors.media-uploader-status .upload-errors {\n    display: block\n  }\n\n  .media-uploader-status .upload-dismiss-errors {\n    transition: none;\n    text-decoration: none\n  }\n\n  .upload-errors .upload-error {\n    padding: 12px;\n    margin-bottom: 12px;\n    background: #fff;\n    border-left: 4px solid #d63638;\n    box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1)\n  }\n\n  .uploader-inline .upload-errors .upload-error {\n    padding: 12px 30px;\n    background-color: #fcf0f1;\n    box-shadow: none\n  }\n\n  .upload-errors .upload-error-filename {\n    font-weight: 600\n  }\n\n  .upload-errors .upload-error-message {\n    display: block;\n    padding-top: 8px;\n    word-wrap: break-word\n  }\n\n  .uploader-window, .wp-editor-wrap .uploader-editor {\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    text-align: center;\n    display: none\n  }\n\n  .uploader-window {\n    position: fixed;\n    z-index: 250000;\n    opacity: 0;\n    transition: opacity 250ms\n  }\n\n  .wp-editor-wrap .uploader-editor {\n    position: absolute;\n    z-index: 99998;\n    background: rgba(140, 143, 148, .9)\n  }\n\n  .uploader-window, .wp-editor-wrap .uploader-editor.droppable {\n    background: rgba(10, 75, 120, .9)\n  }\n\n  .uploader-window-content, .wp-editor-wrap .uploader-editor-content {\n    position: absolute;\n    top: 10px;\n    left: 10px;\n    right: 10px;\n    bottom: 10px;\n    border: 1px dashed #fff\n  }\n\n  .uploader-window .uploader-editor-title, .uploader-window h1, .wp-editor-wrap .uploader-editor .uploader-editor-title {\n    position: absolute;\n    top: 50%;\n    left: 0;\n    right: 0;\n    transform: translateY(-50%);\n    font-size: 3em;\n    line-height: 1.3;\n    font-weight: 600;\n    color: #fff;\n    margin: 0;\n    padding: 0 10px\n  }\n\n  .wp-editor-wrap .uploader-editor .uploader-editor-title {\n    display: none\n  }\n\n  .wp-editor-wrap .uploader-editor.droppable .uploader-editor-title {\n    display: block\n  }\n\n  .uploader-window .media-progress-bar {\n    margin-top: 20px;\n    max-width: 300px;\n    background: 0 0;\n    border-color: #fff;\n    display: none\n  }\n\n  .uploader-window .media-progress-bar div {\n    background: #fff\n  }\n\n  .uploading .uploader-window .media-progress-bar {\n    display: block\n  }\n\n  .media-frame .uploader-inline {\n    margin-bottom: 20px;\n    padding: 0;\n    text-align: center\n  }\n\n  .uploader-inline-content {\n    position: absolute;\n    top: 30%;\n    left: 0;\n    right: 0\n  }\n\n  .uploader-inline-content .upload-ui {\n    margin: 2em 0\n  }\n\n  .uploader-inline-content .post-upload-ui {\n    margin-bottom: 2em\n  }\n\n  .uploader-inline .has-upload-message .upload-ui {\n    margin: 0 0 4em\n  }\n\n  .uploader-inline h2 {\n    font-size: 20px;\n    line-height: 1.4;\n    font-weight: 400;\n    margin: 0\n  }\n\n  .uploader-inline .has-upload-message .upload-instructions {\n    font-size: 14px;\n    color: #3c434a;\n    font-weight: 400\n  }\n\n  .uploader-inline .drop-instructions {\n    display: none\n  }\n\n  .supports-drag-drop .uploader-inline .drop-instructions {\n    display: block\n  }\n\n  .uploader-inline p {\n    margin: .5em 0\n  }\n\n  .uploader-inline .media-progress-bar {\n    display: none\n  }\n\n  .uploading.uploader-inline .media-progress-bar {\n    display: block\n  }\n\n  .uploader-inline .browser {\n    display: inline-block !important\n  }\n\n  .media-selection {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 350px;\n    height: 60px;\n    padding: 0 0 0 16px;\n    overflow: hidden;\n    white-space: nowrap\n  }\n\n  .media-selection .selection-info {\n    display: inline-block;\n    font-size: 12px;\n    height: 60px;\n    margin-right: 10px;\n    vertical-align: top\n  }\n\n  .media-selection.editing, .media-selection.empty {\n    display: none\n  }\n\n  .media-selection.one .edit-selection {\n    display: none\n  }\n\n  .media-selection .count {\n    display: block;\n    padding-top: 12px;\n    font-size: 14px;\n    line-height: 1.42857142;\n    font-weight: 600\n  }\n\n  .media-selection .button-link {\n    float: left;\n    padding: 1px 8px;\n    margin: 1px 8px 1px -8px;\n    line-height: 1.4;\n    border-right: 1px solid #dcdcde;\n    color: #2271b1;\n    text-decoration: none\n  }\n\n  .media-selection .button-link:focus, .media-selection .button-link:hover {\n    color: #135e96\n  }\n\n  .media-selection .button-link:last-child {\n    border-right: 0;\n    margin-right: 0\n  }\n\n  .selection-info .clear-selection {\n    color: #d63638\n  }\n\n  .selection-info .clear-selection:focus, .selection-info .clear-selection:hover {\n    color: #d63638\n  }\n\n  .media-selection .selection-view {\n    display: inline-block;\n    vertical-align: top\n  }\n\n  .media-selection .attachments {\n    display: inline-block;\n    height: 48px;\n    margin: 6px;\n    padding: 0;\n    overflow: hidden;\n    vertical-align: top\n  }\n\n  .media-selection .attachment {\n    width: 40px;\n    padding: 0;\n    margin: 4px\n  }\n\n  .media-selection .attachment .thumbnail {\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0\n  }\n\n  .media-selection .attachment .icon {\n    width: 50%\n  }\n\n  .media-selection .attachment-preview {\n    box-shadow: none;\n    background: 0 0\n  }\n\n  .wp-core-ui .media-selection .attachment.details:focus, .wp-core-ui .media-selection .attachment:focus, .wp-core-ui .media-selection .selected.attachment:focus {\n    box-shadow: 0 0 0 1px #fff, 0 0 2px 3px #4f94d4;\n    outline: 2px solid transparent\n  }\n\n  .wp-core-ui .media-selection .selected.attachment {\n    box-shadow: none\n  }\n\n  .wp-core-ui .media-selection .attachment.details {\n    box-shadow: 0 0 0 1px #fff, 0 0 0 3px #2271b1\n  }\n\n  .media-selection:after {\n    content: \"\";\n    display: block;\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    width: 25px;\n    background-image: linear-gradient(to left, #fff, rgba(255, 255, 255, 0))\n  }\n\n  .media-selection .attachment .filename {\n    display: none\n  }\n\n  .media-frame .spinner {\n    background: url(../images/spinner.gif) no-repeat;\n    background-size: 20px 20px;\n    float: right;\n    display: inline-block;\n    visibility: hidden;\n    opacity: .7;\n    width: 20px;\n    height: 20px;\n    margin: 0;\n    vertical-align: middle\n  }\n\n  .media-frame.mode-grid .spinner {\n    margin: 0;\n    float: none;\n    vertical-align: middle\n  }\n\n  .media-modal .media-toolbar .spinner {\n    float: none;\n    vertical-align: bottom;\n    margin: 0 0 5px 5px\n  }\n\n  .media-frame .instructions + .spinner.is-active {\n    vertical-align: middle\n  }\n\n  .media-frame .spinner.is-active {\n    visibility: visible\n  }\n\n  .attachment-details {\n    position: relative;\n    overflow: auto\n  }\n\n  .attachment-details .settings-save-status {\n    float: right;\n    text-transform: none;\n    font-weight: 400\n  }\n\n  .attachment-details .settings-save-status .spinner {\n    float: none;\n    margin-left: 5px\n  }\n\n  .attachment-details .settings-save-status .saved {\n    display: none\n  }\n\n  .attachment-details.save-waiting .settings-save-status .spinner {\n    visibility: visible\n  }\n\n  .attachment-details.save-complete .settings-save-status .saved {\n    display: inline-block\n  }\n\n  .attachment-info {\n    overflow: hidden;\n    min-height: 60px;\n    margin-bottom: 16px;\n    line-height: 1.5;\n    color: #646970;\n    border-bottom: 1px solid #dcdcde;\n    padding-bottom: 11px\n  }\n\n  .attachment-info .wp-media-wrapper {\n    margin-bottom: 8px\n  }\n\n  .attachment-info .wp-media-wrapper.wp-audio {\n    margin-top: 13px\n  }\n\n  .attachment-info .filename {\n    font-weight: 600;\n    color: #3c434a;\n    word-wrap: break-word\n  }\n\n  .attachment-info .thumbnail {\n    position: relative;\n    float: left;\n    max-width: 120px;\n    max-height: 120px;\n    margin-top: 5px;\n    margin-right: 10px;\n    margin-bottom: 5px\n  }\n\n  .uploading .attachment-info .thumbnail {\n    width: 120px;\n    height: 80px;\n    box-shadow: inset 0 0 15px rgba(0, 0, 0, .1)\n  }\n\n  .uploading .attachment-info .media-progress-bar {\n    margin-top: 35px\n  }\n\n  .attachment-info .thumbnail-image:after {\n    content: \"\";\n    display: block;\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .15);\n    overflow: hidden\n  }\n\n  .attachment-info .thumbnail img {\n    display: block;\n    max-width: 120px;\n    max-height: 120px;\n    margin: 0 auto\n  }\n\n  .attachment-info .details {\n    float: left;\n    font-size: 12px;\n    max-width: 100%\n  }\n\n  .attachment-info .delete-attachment, .attachment-info .edit-attachment, .attachment-info .trash-attachment, .attachment-info .untrash-attachment {\n    display: block;\n    text-decoration: none;\n    white-space: nowrap\n  }\n\n  .attachment-details.needs-refresh .attachment-info .edit-attachment {\n    display: none\n  }\n\n  .attachment-info .edit-attachment {\n    display: block\n  }\n\n  .media-modal .delete-attachment, .media-modal .trash-attachment, .media-modal .untrash-attachment {\n    display: inline;\n    padding: 0;\n    color: #d63638\n  }\n\n  .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 {\n    color: #d63638\n  }\n\n  .attachment-display-settings {\n    width: 100%;\n    float: left;\n    overflow: hidden\n  }\n\n  .collection-settings {\n    overflow: hidden\n  }\n\n  .collection-settings .setting input[type=checkbox] {\n    float: left;\n    margin-right: 8px\n  }\n\n  .collection-settings .setting .name, .collection-settings .setting span {\n    min-width: inherit\n  }\n\n  .media-modal .imgedit-wrap {\n    position: static\n  }\n\n  .media-modal .imgedit-wrap .imgedit-panel-content {\n    padding: 16px 16px 0;\n    position: absolute;\n    top: 0;\n    right: 282px;\n    bottom: 0;\n    left: 0;\n    overflow: auto\n  }\n\n  .media-modal .imgedit-wrap .imgedit-submit {\n    margin-bottom: 16px\n  }\n\n  .media-modal .imgedit-wrap .imgedit-settings {\n    background: #f6f7f7;\n    border-left: 1px solid #dcdcde;\n    padding: 20px 16px 0;\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    width: 250px;\n    overflow: auto\n  }\n\n  .media-modal .imgedit-wrap .imgedit-save-target {\n    margin: 8px 0 24px\n  }\n\n  .media-modal .imgedit-group {\n    background: 0 0;\n    border: none;\n    border-bottom: 1px solid #dcdcde;\n    box-shadow: none;\n    margin: 0;\n    margin-bottom: 16px;\n    padding: 0;\n    padding-bottom: 16px;\n    position: relative\n  }\n\n  .media-modal .imgedit-group:last-of-type {\n    border: none;\n    margin: 0;\n    padding: 0\n  }\n\n  .media-modal .imgedit-group-top {\n    margin: 0\n  }\n\n  .media-modal .imgedit-group-top h2, .media-modal .imgedit-group-top h2 .button-link {\n    display: inline-block;\n    text-transform: uppercase;\n    font-size: 12px;\n    color: #646970;\n    margin: 0;\n    margin-top: 3px\n  }\n\n  .media-modal .imgedit-group-top h2 .button-link, .media-modal .imgedit-group-top h2 a {\n    text-decoration: none;\n    color: #646970\n  }\n\n  .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 {\n    border: 1px solid transparent;\n    margin: 0;\n    padding: 0;\n    background: 0 0;\n    color: #2271b1;\n    font-size: 20px;\n    line-height: 1;\n    cursor: pointer;\n    box-sizing: content-box;\n    box-shadow: none\n  }\n\n  .wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus {\n    color: #2271b1;\n    border-color: #4f94d4;\n    box-shadow: 0 0 3px rgba(34, 113, 177, .8);\n    outline: 2px solid transparent\n  }\n\n  .wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle {\n    margin-top: -3px\n  }\n\n  .wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle {\n    margin-top: -2px\n  }\n\n  .media-modal .imgedit-help-toggled span.dashicons:before {\n    content: \"\\f142\"\n  }\n\n  .media-modal .imgedit-thumbnail-preview {\n    margin: 10px 8px 0 0\n  }\n\n  .imgedit-thumbnail-preview-caption {\n    display: block\n  }\n\n  .media-modal .imgedit-wrap .notice, .media-modal .imgedit-wrap div.updated {\n    margin: 0;\n    margin-bottom: 16px\n  }\n\n  .embed-url {\n    display: block;\n    position: relative;\n    padding: 16px;\n    margin: 0;\n    z-index: 250;\n    background: #fff;\n    font-size: 18px\n  }\n\n  .media-frame .embed-url input {\n    font-size: 18px;\n    line-height: 1.22222222;\n    padding: 12px 40px 12px 14px;\n    width: 100%;\n    min-width: 200px;\n    box-shadow: inset 2px 2px 4px -2px rgba(0, 0, 0, .1)\n  }\n\n  .media-frame .embed-url input::-ms-clear {\n    display: none\n  }\n\n  .media-frame .embed-url .spinner {\n    position: absolute;\n    top: 32px;\n    right: 26px\n  }\n\n  .media-frame .embed-loading .embed-url .spinner {\n    visibility: visible\n  }\n\n  .embed-link-settings, .embed-media-settings {\n    position: absolute;\n    top: 82px;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    padding: 0 16px;\n    overflow: auto\n  }\n\n  .media-embed .embed-link-settings .link-text {\n    margin-top: 0\n  }\n\n  .embed-link-settings::after, .embed-media-settings::after {\n    content: \"\";\n    display: flex;\n    clear: both;\n    height: 24px\n  }\n\n  .media-embed .embed-link-settings {\n    overflow: visible\n  }\n\n  .embed-preview embed, .embed-preview iframe, .embed-preview img, .mejs-container video {\n    max-width: 100%;\n    vertical-align: middle\n  }\n\n  .embed-preview a {\n    display: inline-block\n  }\n\n  .embed-preview img {\n    display: block;\n    height: auto\n  }\n\n  .mejs-container:focus {\n    outline: 1px solid #4f94d4;\n    box-shadow: 0 0 2px 1px rgba(79, 148, 212, .8)\n  }\n\n  .image-details .media-modal {\n    left: 140px;\n    right: 140px\n  }\n\n  .image-details .media-frame-content, .image-details .media-frame-router, .image-details .media-frame-title {\n    left: 0\n  }\n\n  .image-details .embed-media-settings {\n    top: 0;\n    overflow: visible;\n    padding: 0\n  }\n\n  .image-details .embed-media-settings::after {\n    content: none\n  }\n\n  .image-details .embed-media-settings, .image-details .embed-media-settings div {\n    box-sizing: border-box\n  }\n\n  .image-details .column-settings {\n    background: #f6f7f7;\n    border-right: 1px solid #dcdcde;\n    min-height: 100%;\n    width: 55%;\n    position: absolute;\n    top: 0;\n    left: 0\n  }\n\n  .image-details .column-settings h2 {\n    margin: 20px;\n    padding-top: 20px;\n    border-top: 1px solid #dcdcde;\n    color: #1d2327\n  }\n\n  .image-details .column-image {\n    width: 45%;\n    position: absolute;\n    left: 55%;\n    top: 0\n  }\n\n  .image-details .image {\n    margin: 20px\n  }\n\n  .image-details .image img {\n    max-width: 100%;\n    max-height: 500px\n  }\n\n  .image-details .advanced-toggle {\n    padding: 0;\n    color: #646970;\n    text-transform: uppercase;\n    text-decoration: none\n  }\n\n  .image-details .advanced-toggle:active, .image-details .advanced-toggle:hover {\n    color: #646970\n  }\n\n  .image-details .advanced-toggle:after {\n    font: normal 20px/1 dashicons;\n    speak: never;\n    vertical-align: top;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    content: \"\\f140\";\n    display: inline-block;\n    margin-top: -2px\n  }\n\n  .image-details .advanced-visible .advanced-toggle:after {\n    content: \"\\f142\"\n  }\n\n  .image-details .custom-size .custom-size-setting, .image-details .custom-size label {\n    display: block;\n    float: left\n  }\n\n  .image-details .custom-size .custom-size-setting label {\n    float: none\n  }\n\n  .image-details .custom-size input {\n    width: 5em\n  }\n\n  .image-details .custom-size .sep {\n    float: left;\n    margin: 26px 6px 0\n  }\n\n  .image-details .custom-size .description {\n    margin-left: 0\n  }\n\n  .media-embed .thumbnail {\n    max-width: 100%;\n    max-height: 200px;\n    position: relative;\n    float: left\n  }\n\n  .media-embed .thumbnail img {\n    max-height: 200px;\n    display: block\n  }\n\n  .media-embed .thumbnail:after {\n    content: \"\";\n    display: block;\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .1);\n    overflow: hidden\n  }\n\n  .media-embed .setting, .media-embed .setting-group {\n    width: 100%;\n    margin: 10px 0;\n    float: left;\n    display: block;\n    clear: both\n  }\n\n  .media-embed .setting-group .setting:not(.checkbox-setting) {\n    margin: 0\n  }\n\n  .media-embed .setting.has-description {\n    margin-bottom: 5px\n  }\n\n  .media-embed .description {\n    clear: both;\n    font-style: normal\n  }\n\n  .media-embed .content-track + .description {\n    line-height: 1.4;\n    max-width: none !important\n  }\n\n  .media-embed .remove-track {\n    margin-bottom: 10px\n  }\n\n  .image-details .embed-media-settings .setting, .image-details .embed-media-settings .setting-group {\n    float: none;\n    width: auto\n  }\n\n  .image-details .actions {\n    margin: 10px 0\n  }\n\n  .image-details .hidden {\n    display: none\n  }\n\n  .media-embed .setting input[type=text], .media-embed .setting textarea, .media-embed fieldset {\n    display: block;\n    width: 100%;\n    max-width: 400px\n  }\n\n  .image-details .embed-media-settings .setting input[type=text], .image-details .embed-media-settings .setting textarea {\n    max-width: inherit;\n    width: 70%\n  }\n\n  .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 {\n    margin-left: 27%;\n    width: 70%\n  }\n\n  .image-details .description {\n    font-style: normal;\n    margin-top: 0\n  }\n\n  .image-details .embed-media-settings .link-target {\n    margin-top: 16px\n  }\n\n  .audio-details .checkbox-label, .image-details .checkbox-label, .video-details .checkbox-label {\n    vertical-align: baseline\n  }\n\n  .media-embed .setting input.hidden, .media-embed .setting textarea.hidden {\n    display: none\n  }\n\n  .media-embed .setting .name, .media-embed .setting span, .media-embed .setting-group .name {\n    display: inline-block;\n    font-size: 13px;\n    line-height: 1.84615384;\n    color: #646970\n  }\n\n  .media-embed .setting span {\n    display: block;\n    width: 200px\n  }\n\n  .image-details .embed-media-settings .setting .name, .image-details .embed-media-settings .setting span {\n    float: left;\n    width: 25%;\n    text-align: right;\n    margin: 8px 1% 0;\n    line-height: 1.1\n  }\n\n  .image-details .embed-media-settings .setting .button-group, .media-frame .setting-group .button-group {\n    width: auto\n  }\n\n  .media-embed-sidebar {\n    position: absolute;\n    top: 0;\n    left: 440px\n  }\n\n  .advanced-section, .link-settings {\n    margin-top: 10px\n  }\n\n  .media-frame .setting .button-group {\n    display: flex;\n    margin: 0 !important;\n    max-width: none !important\n  }\n\n  .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 {\n    font-family: Tahoma, sans-serif\n  }\n\n  :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 {\n    font-family: Arial, sans-serif\n  }\n\n  @media only screen and (max-width: 900px) {\n    .media-modal .media-frame-title {\n      height: 40px\n    }\n    .media-modal .media-frame-title h1 {\n      line-height: 2.22222222;\n      font-size: 18px\n    }\n    .media-modal-close {\n      width: 42px;\n      height: 42px\n    }\n    .media-frame .media-frame-title {\n      position: static;\n      padding: 0 44px;\n      text-align: center\n    }\n    .media-frame:not(.hide-menu) .media-frame-content, .media-frame:not(.hide-menu) .media-frame-router, .media-frame:not(.hide-menu) .media-frame-toolbar {\n      left: 0\n    }\n    .media-frame:not(.hide-menu) .media-frame-router {\n      top: 80px\n    }\n    .media-frame:not(.hide-menu) .media-frame-content {\n      top: 114px\n    }\n    .media-frame.hide-router .media-frame-content {\n      top: 80px\n    }\n    .media-frame:not(.hide-menu) .media-frame-menu {\n      position: static;\n      width: 0\n    }\n    .media-frame:not(.hide-menu) .media-menu {\n      display: none;\n      width: auto;\n      max-width: 80%;\n      overflow: auto;\n      z-index: 2000;\n      top: 75px;\n      left: 50%;\n      transform: translateX(-50%);\n      right: auto;\n      bottom: auto;\n      padding: 5px 0;\n      border: 1px solid #c3c4c7\n    }\n    .media-frame:not(.hide-menu) .media-menu.visible {\n      display: block\n    }\n    .media-frame:not(.hide-menu) .media-menu > a {\n      padding: 12px 16px;\n      font-size: 16px\n    }\n    .media-frame:not(.hide-menu) .media-menu .separator {\n      margin: 5px 10px\n    }\n    .media-frame-menu-heading {\n      clip: rect(1px, 1px, 1px, 1px);\n      -webkit-clip-path: inset(50%);\n      clip-path: inset(50%);\n      height: 1px;\n      overflow: hidden;\n      padding: 0;\n      width: 1px;\n      word-wrap: normal !important\n    }\n    .wp-core-ui .media-frame:not(.hide-menu) .button.media-frame-menu-toggle {\n      display: inline-flex;\n      align-items: center;\n      position: absolute;\n      left: 50%;\n      transform: translateX(-50%);\n      margin: -6px 0 0;\n      padding: 0 2px 0 12px;\n      font-size: .875rem;\n      font-weight: 600;\n      text-decoration: none;\n      background: 0 0;\n      height: .1%;\n      min-height: 40px\n    }\n    .wp-core-ui .button.media-frame-menu-toggle:active, .wp-core-ui .button.media-frame-menu-toggle:hover {\n      background: 0 0;\n      transform: none\n    }\n    .wp-core-ui .button.media-frame-menu-toggle:focus {\n      outline: 1px solid transparent\n    }\n    .media-sidebar {\n      width: 230px\n    }\n    .attachments-browser .attachments, .attachments-browser .attachments-wrapper, .attachments-browser .media-toolbar, .attachments-browser .uploader-inline, .attachments-browser.has-load-more .attachments-wrapper {\n      right: 262px\n    }\n    .attachment-details .setting, .media-sidebar .setting {\n      margin: 6px 0\n    }\n    .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 {\n      float: none;\n      display: inline-block\n    }\n    .attachment-details .setting span, .media-sidebar .checkbox-label-inline, .media-sidebar .setting span {\n      float: none\n    }\n    .media-sidebar .setting .select-label-inline {\n      display: inline\n    }\n    .attachment-details .setting .name, .compat-item label span, .media-sidebar .checkbox-label-inline, .media-sidebar .setting .name {\n      text-align: inherit;\n      min-height: 16px;\n      margin: 0;\n      padding: 8px 2px 2px\n    }\n    .attachment-details .attachment-info .copy-to-clipboard-container, .media-sidebar .setting .copy-to-clipboard-container {\n      margin-left: 0;\n      padding-top: 0\n    }\n    .attachment-details .attachment-info .copy-attachment-url, .media-sidebar .setting .copy-attachment-url {\n      margin: 0 1px\n    }\n    .attachment-details .setting .value, .media-sidebar .setting .value {\n      float: none;\n      width: auto\n    }\n    .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 {\n      float: none;\n      width: 98%;\n      max-width: none;\n      height: auto\n    }\n    .media-frame .media-toolbar input[type=search] {\n      line-height: 2.25\n    }\n    .attachment-details .setting select.columns, .media-sidebar .setting select.columns {\n      width: auto\n    }\n    .media-frame .search, .media-frame input, .media-frame textarea {\n      padding: 3px 6px\n    }\n    .wp-admin .media-frame select {\n      min-height: 40px;\n      font-size: 16px;\n      line-height: 1.625;\n      padding: 5px 24px 5px 8px\n    }\n    .image-details .column-image {\n      width: 30%;\n      left: 70%\n    }\n    .image-details .column-settings {\n      width: 70%\n    }\n    .image-details .media-modal {\n      left: 30px;\n      right: 30px\n    }\n    .image-details .embed-media-settings .setting, .image-details .embed-media-settings .setting-group {\n      margin: 20px\n    }\n    .image-details .embed-media-settings .setting .name, .image-details .embed-media-settings .setting span {\n      float: none;\n      text-align: left;\n      width: 100%;\n      margin-bottom: 4px;\n      margin-left: 0\n    }\n    .media-modal .legend-inline {\n      position: static;\n      transform: none;\n      margin-left: 0;\n      margin-bottom: 6px\n    }\n    .image-details .embed-media-settings .setting-group .setting {\n      margin-bottom: 0\n    }\n    .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 {\n      width: 100%;\n      margin-left: 0\n    }\n    .image-details .embed-media-settings .setting.has-description {\n      margin-bottom: 5px\n    }\n    .image-details .description {\n      width: auto;\n      margin: 0 20px\n    }\n    .image-details .embed-media-settings .custom-size {\n      margin-left: 20px\n    }\n    .collection-settings .setting input[type=checkbox] {\n      float: none;\n      margin-top: 0\n    }\n    .media-selection {\n      min-width: 120px\n    }\n    .media-selection:after {\n      background: 0 0\n    }\n    .media-selection .attachments {\n      display: none\n    }\n    .media-modal .attachments-browser .media-toolbar .search {\n      max-width: 100%;\n      height: auto;\n      float: right\n    }\n    .media-modal .attachments-browser .media-toolbar .attachment-filters {\n      height: auto\n    }\n    .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 {\n      font-size: 16px\n    }\n    .media-frame .media-toolbar input[type=search] {\n      line-height: 2.3755\n    }\n    .media-modal .media-toolbar .spinner {\n      margin-bottom: 10px\n    }\n  }\n  @media screen and (max-width: 782px) {\n    .attachments-browser .media-toolbar {\n      height: 82px\n    }\n    .attachments-browser .attachments, .attachments-browser .uploader-inline {\n      top: 82px\n    }\n    .media-frame-toolbar .media-toolbar {\n      bottom: -54px\n    }\n    .mode-grid .attachments-browser .media-toolbar-primary {\n      display: block\n    }\n    .attachment-details .copy-to-clipboard-container .success, .media-sidebar .copy-to-clipboard-container .success {\n      font-size: 14px;\n      line-height: 2.71428571\n    }\n  }\n  @media only screen and (max-width: 640px), screen and (max-height: 400px) {\n    .image-details .media-modal, .media-modal {\n      position: fixed;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0\n    }\n    .media-modal-backdrop {\n      position: fixed\n    }\n    .media-sidebar {\n      z-index: 1900;\n      max-width: 70%;\n      bottom: 120%;\n      box-sizing: border-box;\n      padding-bottom: 0\n    }\n    .media-sidebar.visible {\n      bottom: 0\n    }\n    .attachments-browser .attachments, .attachments-browser .media-toolbar, .attachments-browser .uploader-inline, .media-frame-content .attachments-browser .attachments-wrapper {\n      right: 0\n    }\n    .attachments-browser .attachments-wrapper {\n      padding-top: 12px\n    }\n    .image-details .media-frame-title {\n      display: block;\n      top: 0;\n      font-size: 14px\n    }\n    .image-details .column-image, .image-details .column-settings {\n      width: 100%;\n      position: relative;\n      left: 0\n    }\n    .image-details .column-settings {\n      padding: 4px 0\n    }\n    .media-frame-content .media-toolbar .instructions {\n      display: none\n    }\n    .load-more-wrapper .load-more-jump {\n      margin: 12px 0 0\n    }\n  }\n  @media only screen and (min-width: 901px) and (max-height: 400px) {\n    .media-frame:not(.hide-menu) .media-menu, .media-menu {\n      top: 0;\n      padding-top: 44px\n    }\n    .load-more-wrapper .load-more-jump {\n      margin: 12px 0 0\n    }\n  }\n  @media only screen and (max-width: 480px) {\n    .wp-core-ui.wp-customizer .media-button {\n      margin-top: 13px\n    }\n  }\n  @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {\n    .wp-core-ui .media-modal-icon {\n      background-image: url(./images/uploader-icons-2x.png);\n      background-size: 134px 15px\n    }\n    .media-frame .spinner {\n      background-image: url(../images/spinner-2x.gif)\n    }\n  }\n\n  .media-frame-content[data-columns=\"1\"] .attachment {\n    width: 100%\n  }\n\n  .media-frame-content[data-columns=\"2\"] .attachment {\n    width: 50%\n  }\n\n  .media-frame-content[data-columns=\"3\"] .attachment {\n    width: 33.33%\n  }\n\n  .media-frame-content[data-columns=\"4\"] .attachment {\n    width: 25%\n  }\n\n  .media-frame-content[data-columns=\"5\"] .attachment {\n    width: 20%\n  }\n\n  .media-frame-content[data-columns=\"6\"] .attachment {\n    width: 16.66%\n  }\n\n  .media-frame-content[data-columns=\"7\"] .attachment {\n    width: 14.28%\n  }\n\n  .media-frame-content[data-columns=\"8\"] .attachment {\n    width: 12.5%\n  }\n\n  .media-frame-content[data-columns=\"9\"] .attachment {\n    width: 11.11%\n  }\n\n  .media-frame-content[data-columns=\"10\"] .attachment {\n    width: 10%\n  }\n\n  .media-frame-content[data-columns=\"11\"] .attachment {\n    width: 9.09%\n  }\n\n  .media-frame-content[data-columns=\"12\"] .attachment {\n    width: 8.33%\n  }\n\n  /*! This file is auto-generated */\n  .wp-color-picker {\n    width: 80px;\n    direction: ltr\n  }\n\n  .wp-picker-container .hidden {\n    display: none\n  }\n\n  .wp-picker-container .wp-color-result.button {\n    min-height: 30px;\n    margin: 0 6px 6px 0;\n    padding: 0 0 0 30px;\n    font-size: 11px\n  }\n\n  .wp-color-result-text {\n    background: #f6f7f7;\n    border-radius: 0 2px 2px 0;\n    border-left: 1px solid #c3c4c7;\n    color: #50575e;\n    display: block;\n    line-height: 2.54545455;\n    padding: 0 6px;\n    text-align: center\n  }\n\n  .wp-color-result:focus, .wp-color-result:hover {\n    background: #f6f7f7;\n    border-color: #8c8f94;\n    color: #1d2327\n  }\n\n  .wp-color-result:focus:after, .wp-color-result:hover:after {\n    color: #1d2327;\n    border-color: #a7aaad;\n    border-left: 1px solid #8c8f94\n  }\n\n  .wp-picker-container {\n    display: inline-block\n  }\n\n  .wp-color-result:focus {\n    border-color: #4f94d4;\n    box-shadow: 0 0 3px rgba(34, 113, 177, .8)\n  }\n\n  .wp-color-result:active {\n    transform: none !important\n  }\n\n  .wp-picker-open + .wp-picker-input-wrap {\n    display: inline-block;\n    vertical-align: top\n  }\n\n  .wp-picker-input-wrap label {\n    display: inline-block;\n    vertical-align: top\n  }\n\n  .form-table .wp-picker-input-wrap label {\n    margin: 0 !important\n  }\n\n  .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 {\n    margin-left: 6px;\n    padding: 0 8px;\n    line-height: 2.54545455;\n    min-height: 30px\n  }\n\n  .wp-picker-container .iris-square-slider .ui-slider-handle:focus {\n    background-color: #50575e\n  }\n\n  .wp-picker-container .iris-picker {\n    border-radius: 0;\n    border-color: #dcdcde;\n    margin-top: 6px\n  }\n\n  .wp-picker-container input[type=text].wp-color-picker {\n    width: 4rem;\n    font-size: 12px;\n    font-family: monospace;\n    line-height: 2.33333333;\n    margin: 0;\n    padding: 0 5px;\n    vertical-align: top;\n    min-height: 30px\n  }\n\n  .wp-color-picker::-webkit-input-placeholder {\n    color: #646970\n  }\n\n  .wp-color-picker::-moz-placeholder {\n    color: #646970;\n    opacity: 1\n  }\n\n  .wp-color-picker:-ms-input-placeholder {\n    color: #646970\n  }\n\n  .wp-picker-container input[type=text].iris-error {\n    background-color: #fcf0f1;\n    border-color: #d63638;\n    color: #000\n  }\n\n  .iris-picker .iris-strip .ui-slider-handle:focus, .iris-picker .ui-square-handle:focus {\n    border-color: #3582c4;\n    border-style: solid;\n    box-shadow: 0 0 0 1px #3582c4;\n    outline: 2px solid transparent\n  }\n\n  .iris-picker .iris-palette:focus {\n    box-shadow: 0 0 0 2px #3582c4\n  }\n\n  @media screen and (max-width: 782px) {\n    .wp-picker-container input[type=text].wp-color-picker {\n      width: 5rem;\n      font-size: 16px;\n      line-height: 1.875;\n      min-height: 32px\n    }\n    .wp-customizer .wp-picker-container input[type=text].wp-color-picker {\n      padding: 0 5px\n    }\n    .wp-picker-input-wrap .button.wp-picker-clear, .wp-picker-input-wrap .button.wp-picker-default {\n      padding: 0 8px;\n      line-height: 2.14285714;\n      min-height: 32px\n    }\n    .wp-customizer .wp-picker-input-wrap .button.wp-picker-clear, .wp-customizer .wp-picker-input-wrap .button.wp-picker-default {\n      padding: 0 8px;\n      font-size: 14px;\n      line-height: 2.14285714;\n      min-height: 32px\n    }\n    .wp-picker-container .wp-color-result.button {\n      padding: 0 0 0 40px;\n      font-size: 14px;\n      line-height: 2.14285714\n    }\n    .wp-customizer .wp-picker-container .wp-color-result.button {\n      font-size: 14px;\n      line-height: 2.14285714\n    }\n    .wp-picker-container .wp-color-result-text {\n      padding: 0 14px;\n      font-size: inherit;\n      line-height: inherit\n    }\n    .wp-customizer .wp-picker-container .wp-color-result-text {\n      padding: 0 10px\n    }\n  }\n  /*! This file is auto-generated */\n  .mce-tinymce {\n    box-shadow: none\n  }\n\n  .mce-container, .mce-container *, .mce-widget, .mce-widget * {\n    color: inherit;\n    font-family: inherit\n  }\n\n  .mce-container .mce-monospace, .mce-widget .mce-monospace {\n    font-family: Consolas, Monaco, monospace;\n    font-size: 13px;\n    line-height: 150%\n  }\n\n  #mce-modal-block, #mce-modal-block.mce-fade {\n    opacity: .7;\n    transition: none;\n    background: #000\n  }\n\n  .mce-window {\n    border-radius: 0;\n    box-shadow: 0 3px 6px rgba(0, 0, 0, .3);\n    -webkit-font-smoothing: subpixel-antialiased;\n    transition: none\n  }\n\n  .mce-window .mce-container-body.mce-abs-layout {\n    overflow: visible\n  }\n\n  .mce-window .mce-window-head {\n    background: #fff;\n    border-bottom: 1px solid #dcdcde;\n    padding: 0;\n    min-height: 36px\n  }\n\n  .mce-window .mce-window-head .mce-title {\n    color: #3c434a;\n    font-size: 18px;\n    font-weight: 600;\n    line-height: 36px;\n    margin: 0;\n    padding: 0 36px 0 16px\n  }\n\n  .mce-window .mce-window-head .mce-close, .mce-window-head .mce-close .mce-i-remove {\n    color: transparent;\n    top: 0;\n    right: 0;\n    width: 36px;\n    height: 36px;\n    padding: 0;\n    line-height: 36px;\n    text-align: center\n  }\n\n  .mce-window-head .mce-close .mce-i-remove:before {\n    font: normal 20px/36px dashicons;\n    text-align: center;\n    color: #646970;\n    width: 36px;\n    height: 36px;\n    display: block\n  }\n\n  .mce-window-head .mce-close:focus .mce-i-remove:before, .mce-window-head .mce-close:hover .mce-i-remove:before {\n    color: #135e96\n  }\n\n  .mce-window-head .mce-close:focus .mce-i-remove, div.mce-tab:focus {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8)\n  }\n\n  .mce-window .mce-window-head .mce-dragh {\n    width: calc(100% - 36px)\n  }\n\n  .mce-window .mce-foot {\n    border-top: 1px solid #dcdcde\n  }\n\n  #wp-link .query-results, .mce-checkbox i.mce-i-checkbox, .mce-textbox {\n    border: 1px solid #dcdcde;\n    border-radius: 0;\n    box-shadow: inset 0 1px 2px rgba(0, 0, 0, .07);\n    transition: .05s all ease-in-out\n  }\n\n  #wp-link .query-results:focus, .mce-checkbox:focus i.mce-i-checkbox, .mce-textbox.mce-focus, .mce-textbox:focus {\n    border-color: #4f94d4;\n    box-shadow: 0 0 2px rgba(79, 148, 212, .8)\n  }\n\n  .mce-window .mce-wp-help {\n    height: 360px;\n    width: 460px;\n    overflow: auto\n  }\n\n  .mce-window .mce-wp-help * {\n    box-sizing: border-box\n  }\n\n  .mce-window .mce-wp-help > .mce-container-body {\n    width: auto !important\n  }\n\n  .mce-window .wp-editor-help {\n    padding: 10px 10px 0 20px\n  }\n\n  .mce-window .wp-editor-help h2, .mce-window .wp-editor-help p {\n    margin: 8px 0;\n    white-space: normal;\n    font-size: 14px;\n    font-weight: 400\n  }\n\n  .mce-window .wp-editor-help table {\n    width: 100%;\n    margin-bottom: 20px\n  }\n\n  .mce-window .wp-editor-help table.wp-help-single {\n    margin: 0 8px 20px\n  }\n\n  .mce-window .wp-editor-help table.fixed {\n    table-layout: fixed\n  }\n\n  .mce-window .wp-editor-help table.fixed td:nth-child(odd), .mce-window .wp-editor-help table.fixed th:nth-child(odd) {\n    width: 12%\n  }\n\n  .mce-window .wp-editor-help table.fixed td:nth-child(even), .mce-window .wp-editor-help table.fixed th:nth-child(even) {\n    width: 38%\n  }\n\n  .mce-window .wp-editor-help table.fixed th:nth-child(odd) {\n    padding: 5px 0 0\n  }\n\n  .mce-window .wp-editor-help td, .mce-window .wp-editor-help th {\n    font-size: 13px;\n    padding: 5px;\n    vertical-align: middle;\n    word-wrap: break-word;\n    white-space: normal\n  }\n\n  .mce-window .wp-editor-help th {\n    font-weight: 600;\n    padding-bottom: 0\n  }\n\n  .mce-window .wp-editor-help kbd {\n    font-family: monospace;\n    padding: 2px 7px 3px;\n    font-weight: 600;\n    margin: 0;\n    background: #f0f0f1;\n    background: rgba(0, 0, 0, .08)\n  }\n\n  .mce-window .wp-help-th-center td:nth-child(odd), .mce-window .wp-help-th-center th:nth-child(odd) {\n    text-align: center\n  }\n\n  .mce-floatpanel.mce-popover, .mce-menu {\n    border-color: rgba(0, 0, 0, .15);\n    border-radius: 0;\n    box-shadow: 0 3px 5px rgba(0, 0, 0, .2)\n  }\n\n  .mce-floatpanel.mce-popover.mce-bottom, .mce-menu {\n    margin-top: 2px\n  }\n\n  .mce-floatpanel .mce-arrow {\n    display: none\n  }\n\n  .mce-menu .mce-container-body {\n    min-width: 160px\n  }\n\n  .mce-menu-item {\n    border: none;\n    margin-bottom: 2px;\n    padding: 6px 15px 6px 12px\n  }\n\n  .mce-menu-has-icons i.mce-ico {\n    line-height: 20px\n  }\n\n  div.mce-panel {\n    border: 0;\n    background: #fff\n  }\n\n  .mce-panel.mce-menu {\n    border: 1px solid #dcdcde\n  }\n\n  div.mce-tab {\n    line-height: 13px\n  }\n\n  div.mce-toolbar-grp {\n    border-bottom: 1px solid #dcdcde;\n    background: #f6f7f7;\n    padding: 0;\n    position: relative\n  }\n\n  div.mce-inline-toolbar-grp {\n    border: 1px solid #a7aaad;\n    border-radius: 2px;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, .15);\n    box-sizing: border-box;\n    margin-bottom: 8px;\n    position: absolute;\n    -webkit-user-select: none;\n    user-select: none;\n    max-width: 98%;\n    z-index: 100100\n  }\n\n  div.mce-inline-toolbar-grp > div.mce-stack-layout {\n    padding: 1px\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-up {\n    margin-bottom: 0;\n    margin-top: 8px\n  }\n\n  div.mce-inline-toolbar-grp:after, div.mce-inline-toolbar-grp:before {\n    position: absolute;\n    left: 50%;\n    display: block;\n    width: 0;\n    height: 0;\n    border-style: solid;\n    border-color: transparent;\n    content: \"\"\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-up:before {\n    top: -9px;\n    border-bottom-color: #a7aaad;\n    border-width: 0 9px 9px;\n    margin-left: -9px\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-down:before {\n    bottom: -9px;\n    border-top-color: #a7aaad;\n    border-width: 9px 9px 0;\n    margin-left: -9px\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-up:after {\n    top: -8px;\n    border-bottom-color: #f6f7f7;\n    border-width: 0 8px 8px;\n    margin-left: -8px\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-down:after {\n    bottom: -8px;\n    border-top-color: #f6f7f7;\n    border-width: 8px 8px 0;\n    margin-left: -8px\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-left:after, div.mce-inline-toolbar-grp.mce-arrow-left:before {\n    margin: 0\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-left:before {\n    left: 20px\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-left:after {\n    left: 21px\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-right:after, div.mce-inline-toolbar-grp.mce-arrow-right:before {\n    left: auto;\n    margin: 0\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-right:before {\n    right: 20px\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-right:after {\n    right: 21px\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-full {\n    right: 0\n  }\n\n  div.mce-inline-toolbar-grp.mce-arrow-full > div {\n    width: 100%;\n    overflow-x: auto\n  }\n\n  div.mce-toolbar-grp > div {\n    padding: 3px\n  }\n\n  .has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first {\n    padding-right: 32px\n  }\n\n  .mce-toolbar .mce-btn-group {\n    margin: 0\n  }\n\n  .block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child) {\n    display: none\n  }\n\n  .block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar {\n    display: block\n  }\n\n  div.mce-statusbar {\n    border-top: 1px solid #dcdcde\n  }\n\n  div.mce-path {\n    padding: 2px 10px;\n    margin: 0\n  }\n\n  .mce-path, .mce-path .mce-divider, .mce-path-item {\n    font-size: 12px\n  }\n\n  .mce-toolbar .mce-btn, .qt-dfw {\n    border-color: transparent;\n    background: 0 0;\n    box-shadow: none;\n    text-shadow: none;\n    cursor: pointer\n  }\n\n  .mce-btn .mce-txt {\n    direction: inherit;\n    text-align: inherit\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn, .qt-dfw {\n    border: 1px solid transparent;\n    margin: 2px;\n    border-radius: 2px\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn:focus, .mce-toolbar .mce-btn-group .mce-btn:hover, .qt-dfw:focus, .qt-dfw:hover {\n    background: #f6f7f7;\n    border-color: #50575e;\n    color: #1d2327;\n    box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0, 0, 0, .08);\n    outline: 0\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-active, .mce-toolbar .mce-btn-group .mce-btn:active, .qt-dfw.active {\n    background: #f0f0f1;\n    border-color: #50575e;\n    box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .3)\n  }\n\n  .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 {\n    color: inherit\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-active:focus, .mce-toolbar .mce-btn-group .mce-btn.mce-active:hover {\n    border-color: #1d2327\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus, .mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover {\n    color: #a7aaad;\n    background: 0 0;\n    border-color: #dcdcde;\n    text-shadow: 0 1px 0 #fff;\n    box-shadow: none\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus {\n    border-color: #50575e\n  }\n\n  .mce-toolbar .mce-btn-group .mce-first, .mce-toolbar .mce-btn-group .mce-last {\n    border-color: transparent\n  }\n\n  .mce-toolbar .mce-btn button, .qt-dfw {\n    padding: 2px 3px;\n    line-height: normal\n  }\n\n  .mce-toolbar .mce-listbox button {\n    font-size: 13px;\n    line-height: 1.53846153;\n    padding-left: 6px;\n    padding-right: 20px\n  }\n\n  .mce-toolbar .mce-btn i {\n    text-shadow: none\n  }\n\n  .mce-toolbar .mce-btn-group > div {\n    white-space: normal\n  }\n\n  .mce-toolbar .mce-colorbutton .mce-open {\n    border-right: 0\n  }\n\n  .mce-toolbar .mce-colorbutton .mce-preview {\n    margin: 0;\n    padding: 0;\n    top: auto;\n    bottom: 2px;\n    left: 3px;\n    height: 3px;\n    width: 20px;\n    background: #50575e\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-primary {\n    min-width: 0;\n    background: #3582c4;\n    border-color: #2271b1 #135e96 #135e96;\n    box-shadow: 0 1px 0 #135e96;\n    color: #fff;\n    text-decoration: none;\n    text-shadow: none\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-primary button {\n    padding: 2px 3px 1px\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico {\n    color: #fff\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus, .mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover {\n    background: #4f94d4;\n    border-color: #135e96;\n    color: #fff\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus {\n    box-shadow: 0 0 1px 1px #72aee6\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-primary:active {\n    background: #2271b1;\n    border-color: #135e96;\n    box-shadow: inset 0 2px 0 #135e96\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-listbox {\n    border-radius: 0;\n    direction: ltr;\n    background: #fff;\n    border: 1px solid #dcdcde;\n    box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, .2)\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus, .mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover {\n    border-color: #c3c4c7\n  }\n\n  .mce-panel .mce-btn i.mce-caret {\n    border-top: 6px solid #50575e;\n    margin-left: 2px;\n    margin-right: 2px\n  }\n\n  .mce-listbox i.mce-caret {\n    right: 4px\n  }\n\n  .mce-panel .mce-btn:focus i.mce-caret, .mce-panel .mce-btn:hover i.mce-caret {\n    border-top-color: #1d2327\n  }\n\n  .mce-panel .mce-active i.mce-caret {\n    border-top: 0;\n    border-bottom: 6px solid #1d2327;\n    margin-top: 7px\n  }\n\n  .mce-listbox.mce-active i.mce-caret {\n    margin-top: -3px\n  }\n\n  .mce-toolbar .mce-splitbtn:hover .mce-open {\n    border-right-color: transparent\n  }\n\n  .mce-toolbar .mce-splitbtn .mce-open.mce-active {\n    background: 0 0;\n    outline: 0\n  }\n\n  .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 {\n    background: #2271b1;\n    color: #fff\n  }\n\n  .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 {\n    border-left-color: #fff\n  }\n\n  .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 {\n    border-left-color: inherit;\n    border-right-color: #fff\n  }\n\n  .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 {\n    color: inherit\n  }\n\n  .mce-menu .mce-menu-item.mce-disabled {\n    cursor: default\n  }\n\n  .mce-menu .mce-menu-item.mce-disabled:hover {\n    background: #c3c4c7\n  }\n\n  div.mce-menubar {\n    border-color: #dcdcde;\n    background: #fff;\n    border-width: 0 0 1px\n  }\n\n  .mce-menubar .mce-menubtn.mce-active, .mce-menubar .mce-menubtn:focus, .mce-menubar .mce-menubtn:hover {\n    border-color: transparent;\n    background: 0 0\n  }\n\n  .mce-menubar .mce-menubtn:focus {\n    color: #043959;\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8)\n  }\n\n  .mce-menu-item-sep:hover, div.mce-menu .mce-menu-item-sep {\n    border-bottom: 1px solid #dcdcde;\n    height: 0;\n    margin: 5px 0\n  }\n\n  .mce-menubtn span {\n    margin-right: 0;\n    padding-left: 3px\n  }\n\n  .mce-menu-has-icons i.mce-ico:before {\n    margin-left: -2px\n  }\n\n  .mce-menu.mce-menu-align .mce-menu-item-normal {\n    position: relative\n  }\n\n  .mce-menu.mce-menu-align .mce-menu-shortcut {\n    bottom: .6em;\n    font-size: .9em\n  }\n\n  .mce-primary button, .mce-primary button i {\n    text-align: center;\n    color: #fff;\n    text-shadow: none;\n    padding: 0;\n    line-height: 1.85714285\n  }\n\n  .mce-window .mce-btn {\n    color: #50575e;\n    background: #f6f7f7;\n    text-decoration: none;\n    font-size: 13px;\n    line-height: 26px;\n    height: 28px;\n    margin: 0;\n    padding: 0;\n    cursor: pointer;\n    border: 1px solid #c3c4c7;\n    -webkit-appearance: none;\n    border-radius: 3px;\n    white-space: nowrap;\n    box-shadow: 0 1px 0 #c3c4c7\n  }\n\n  .mce-window .mce-btn::-moz-focus-inner {\n    border-width: 0;\n    border-style: none;\n    padding: 0\n  }\n\n  .mce-window .mce-btn:focus, .mce-window .mce-btn:hover {\n    background: #f6f7f7;\n    border-color: #8c8f94;\n    color: #1d2327\n  }\n\n  .mce-window .mce-btn:focus {\n    border-color: #4f94d4;\n    box-shadow: 0 0 3px rgba(34, 113, 177, .8)\n  }\n\n  .mce-window .mce-btn:active {\n    background: #f0f0f1;\n    border-color: #8c8f94;\n    box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .5);\n    transform: translateY(1px)\n  }\n\n  .mce-window .mce-btn.mce-disabled {\n    color: #a7aaad !important;\n    border-color: #dcdcde !important;\n    background: #f6f7f7 !important;\n    box-shadow: none !important;\n    text-shadow: 0 1px 0 #fff !important;\n    cursor: default;\n    transform: none !important\n  }\n\n  .mce-window .mce-btn.mce-primary {\n    background: #3582c4;\n    border-color: #2271b1 #135e96 #135e96;\n    box-shadow: 0 1px 0 #135e96;\n    color: #fff;\n    text-decoration: none;\n    text-shadow: 0 -1px 1px #135e96, 1px 0 1px #135e96, 0 1px 1px #135e96, -1px 0 1px #135e96\n  }\n\n  .mce-window .mce-btn.mce-primary:focus, .mce-window .mce-btn.mce-primary:hover {\n    background: #4f94d4;\n    border-color: #135e96;\n    color: #fff\n  }\n\n  .mce-window .mce-btn.mce-primary:focus {\n    box-shadow: 0 1px 0 #2271b1, 0 0 2px 1px #72aee6\n  }\n\n  .mce-window .mce-btn.mce-primary:active {\n    background: #2271b1;\n    border-color: #135e96;\n    box-shadow: inset 0 2px 0 #135e96;\n    vertical-align: top\n  }\n\n  .mce-window .mce-btn.mce-primary.mce-disabled {\n    color: #9ec2e6 !important;\n    background: #4f94d4 !important;\n    border-color: #3582c4 !important;\n    box-shadow: none !important;\n    text-shadow: 0 -1px 0 rgba(0, 0, 0, .1) !important;\n    cursor: default\n  }\n\n  .mce-menubtn.mce-fixed-width span {\n    overflow-x: hidden;\n    text-overflow: ellipsis;\n    width: 82px\n  }\n\n  .mce-charmap {\n    margin: 3px\n  }\n\n  .mce-charmap td {\n    padding: 0;\n    border-color: #dcdcde;\n    cursor: pointer\n  }\n\n  .mce-charmap td:hover {\n    background: #f6f7f7\n  }\n\n  .mce-charmap td div {\n    width: 18px;\n    height: 22px;\n    line-height: 1.57142857\n  }\n\n  .mce-tooltip {\n    margin-top: 2px\n  }\n\n  .mce-tooltip-inner {\n    border-radius: 3px;\n    box-shadow: 0 3px 5px rgba(0, 0, 0, .2);\n    color: #fff;\n    font-size: 12px\n  }\n\n  .mce-ico {\n    font-family: tinymce, Arial\n  }\n\n  .mce-btn-small .mce-ico {\n    font-family: tinymce-small, Arial\n  }\n\n  .mce-toolbar .mce-ico {\n    color: #50575e;\n    line-height: 1;\n    width: 20px;\n    height: 20px;\n    text-align: center;\n    text-shadow: none;\n    margin: 0;\n    padding: 0\n  }\n\n  .qt-dfw {\n    color: #50575e;\n    line-height: 1;\n    width: 28px;\n    height: 26px;\n    text-align: center;\n    text-shadow: none\n  }\n\n  .mce-toolbar .mce-btn .mce-open {\n    line-height: 20px\n  }\n\n  .mce-toolbar .mce-btn.mce-active .mce-open, .mce-toolbar .mce-btn:focus .mce-open, .mce-toolbar .mce-btn:hover .mce-open {\n    border-left-color: #1d2327\n  }\n\n  div.mce-notification {\n    left: 10% !important;\n    right: 10%\n  }\n\n  .mce-notification button.mce-close {\n    right: 6px;\n    top: 3px;\n    font-weight: 400;\n    color: #50575e\n  }\n\n  .mce-notification button.mce-close:focus, .mce-notification button.mce-close:hover {\n    color: #000\n  }\n\n  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 {\n    font: normal 20px/1 dashicons;\n    padding: 0;\n    vertical-align: top;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    margin-left: -2px;\n    padding-right: 2px\n  }\n\n  .qt-dfw {\n    font: normal 20px/1 dashicons;\n    vertical-align: top;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  i.mce-i-bold:before {\n    content: \"\\f200\"\n  }\n\n  i.mce-i-italic:before {\n    content: \"\\f201\"\n  }\n\n  i.mce-i-bullist:before {\n    content: \"\\f203\"\n  }\n\n  i.mce-i-numlist:before {\n    content: \"\\f204\"\n  }\n\n  i.mce-i-blockquote:before {\n    content: \"\\f205\"\n  }\n\n  i.mce-i-alignleft:before {\n    content: \"\\f206\"\n  }\n\n  i.mce-i-aligncenter:before {\n    content: \"\\f207\"\n  }\n\n  i.mce-i-alignright:before {\n    content: \"\\f208\"\n  }\n\n  i.mce-i-link:before {\n    content: \"\\f103\"\n  }\n\n  i.mce-i-unlink:before {\n    content: \"\\f225\"\n  }\n\n  i.mce-i-wp_more:before {\n    content: \"\\f209\"\n  }\n\n  i.mce-i-strikethrough:before {\n    content: \"\\f224\"\n  }\n\n  i.mce-i-spellchecker:before {\n    content: \"\\f210\"\n  }\n\n  .qt-dfw:before, i.mce-i-dfw:before, i.mce-i-fullscreen:before, i.mce-i-wp_fullscreen:before {\n    content: \"\\f211\"\n  }\n\n  i.mce-i-wp_adv:before {\n    content: \"\\f212\"\n  }\n\n  i.mce-i-underline:before {\n    content: \"\\f213\"\n  }\n\n  i.mce-i-alignjustify:before {\n    content: \"\\f214\"\n  }\n\n  i.mce-i-backcolor:before, i.mce-i-forecolor:before {\n    content: \"\\f215\"\n  }\n\n  i.mce-i-pastetext:before {\n    content: \"\\f217\"\n  }\n\n  i.mce-i-removeformat:before {\n    content: \"\\f218\"\n  }\n\n  i.mce-i-charmap:before {\n    content: \"\\f220\"\n  }\n\n  i.mce-i-outdent:before {\n    content: \"\\f221\"\n  }\n\n  i.mce-i-indent:before {\n    content: \"\\f222\"\n  }\n\n  i.mce-i-undo:before {\n    content: \"\\f171\"\n  }\n\n  i.mce-i-redo:before {\n    content: \"\\f172\"\n  }\n\n  i.mce-i-help:before, i.mce-i-wp_help:before {\n    content: \"\\f223\"\n  }\n\n  i.mce-i-wp-media-library:before {\n    content: \"\\f104\"\n  }\n\n  i.mce-i-ltr:before {\n    content: \"\\f320\"\n  }\n\n  i.mce-i-wp_page:before {\n    content: \"\\f105\"\n  }\n\n  i.mce-i-hr:before {\n    content: \"\\f460\"\n  }\n\n  i.mce-i-remove:before {\n    content: \"\\f158\"\n  }\n\n  i.mce-i-wp_code:before {\n    content: \"\\f475\"\n  }\n\n  .rtl i.mce-i-outdent:before {\n    content: \"\\f222\"\n  }\n\n  .rtl i.mce-i-indent:before {\n    content: \"\\f221\"\n  }\n\n  .wp-editor-wrap {\n    position: relative\n  }\n\n  .wp-editor-tools {\n    position: relative;\n    z-index: 1\n  }\n\n  .wp-editor-tools:after {\n    clear: both;\n    content: \"\";\n    display: table\n  }\n\n  .wp-editor-container {\n    clear: both;\n    border: 1px solid #dcdcde\n  }\n\n  .wp-editor-area {\n    font-family: Consolas, Monaco, monospace;\n    font-size: 13px;\n    padding: 10px;\n    margin: 1px 0 0;\n    line-height: 150%;\n    border: 0;\n    outline: 0;\n    display: block;\n    resize: vertical;\n    box-sizing: border-box\n  }\n\n  .rtl .wp-editor-area {\n    font-family: Tahoma, Monaco, monospace\n  }\n\n  .locale-he-il .wp-editor-area {\n    font-family: Arial, Monaco, monospace\n  }\n\n  .wp-editor-container textarea.wp-editor-area {\n    width: 100%;\n    margin: 0;\n    box-shadow: none\n  }\n\n  .wp-editor-tabs {\n    float: right\n  }\n\n  .wp-switch-editor {\n    float: left;\n    box-sizing: content-box;\n    position: relative;\n    top: 1px;\n    background: #f0f0f1;\n    color: #646970;\n    cursor: pointer;\n    font-size: 13px;\n    line-height: 1.46153846;\n    height: 20px;\n    margin: 5px 0 0 5px;\n    padding: 3px 8px 4px;\n    border: 1px solid #dcdcde\n  }\n\n  .wp-switch-editor:focus {\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8);\n    outline: 0;\n    color: #1d2327\n  }\n\n  .html-active .switch-html:focus, .tmce-active .switch-tmce:focus, .wp-switch-editor:active {\n    box-shadow: none\n  }\n\n  .wp-switch-editor:active {\n    background-color: #f6f7f7;\n    box-shadow: none\n  }\n\n  .js .tmce-active .wp-editor-area {\n    color: #fff\n  }\n\n  .tmce-active .quicktags-toolbar {\n    display: none\n  }\n\n  .html-active .switch-html, .tmce-active .switch-tmce {\n    background: #f6f7f7;\n    color: #50575e;\n    border-bottom-color: #f6f7f7\n  }\n\n  .wp-media-buttons {\n    float: left\n  }\n\n  .wp-media-buttons .button {\n    margin-right: 5px;\n    margin-bottom: 4px;\n    padding-left: 7px;\n    padding-right: 7px\n  }\n\n  .wp-media-buttons .button:active {\n    position: relative;\n    top: 1px;\n    margin-top: -1px;\n    margin-bottom: 1px\n  }\n\n  .wp-media-buttons .insert-media {\n    padding-left: 5px\n  }\n\n  .wp-media-buttons a {\n    text-decoration: none;\n    color: #3c434a;\n    font-size: 12px\n  }\n\n  .wp-media-buttons img {\n    padding: 0 4px;\n    vertical-align: middle\n  }\n\n  .wp-media-buttons span.wp-media-buttons-icon {\n    display: inline-block;\n    width: 20px;\n    height: 20px;\n    line-height: 1;\n    vertical-align: middle;\n    margin: 0 2px\n  }\n\n  .wp-media-buttons .add_media span.wp-media-buttons-icon {\n    background: 0 0\n  }\n\n  .wp-media-buttons .add_media span.wp-media-buttons-icon:before {\n    font: normal 18px/1 dashicons;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .wp-media-buttons .add_media span.wp-media-buttons-icon:before {\n    content: \"\\f104\"\n  }\n\n  .mce-content-body dl.wp-caption {\n    max-width: 100%\n  }\n\n  .quicktags-toolbar {\n    padding: 3px;\n    position: relative;\n    border-bottom: 1px solid #dcdcde;\n    background: #f6f7f7;\n    min-height: 30px\n  }\n\n  .has-dfw .quicktags-toolbar {\n    padding-right: 35px\n  }\n\n  .wp-core-ui .quicktags-toolbar input.button.button-small {\n    margin: 2px\n  }\n\n  .quicktags-toolbar input[value=link] {\n    text-decoration: underline\n  }\n\n  .quicktags-toolbar input[value=del] {\n    text-decoration: line-through\n  }\n\n  .quicktags-toolbar input[value=\"i\"] {\n    font-style: italic\n  }\n\n  .quicktags-toolbar input[value=\"b\"] {\n    font-weight: 600\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw, .qt-dfw {\n    position: absolute;\n    top: 0;\n    right: 0\n  }\n\n  .mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw {\n    margin: 7px 7px 0 0\n  }\n\n  .qt-dfw {\n    margin: 5px 5px 0 0\n  }\n\n  .qt-fullscreen {\n    position: static;\n    margin: 2px\n  }\n\n  @media screen and (max-width: 782px) {\n    .mce-toolbar .mce-btn button, .qt-dfw {\n      padding: 6px 7px\n    }\n    .mce-toolbar .mce-btn-group .mce-btn.mce-primary button {\n      padding: 6px 7px 5px\n    }\n    .mce-toolbar .mce-btn-group .mce-btn {\n      margin: 1px\n    }\n    .qt-dfw {\n      width: 36px;\n      height: 34px\n    }\n    .mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw {\n      margin: 4px 4px 0 0\n    }\n    .mce-toolbar .mce-colorbutton .mce-preview {\n      left: 8px;\n      bottom: 6px\n    }\n    .mce-window .mce-btn {\n      padding: 2px 0\n    }\n    .has-dfw .quicktags-toolbar, .has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first {\n      padding-right: 40px\n    }\n  }\n  @media screen and (min-width: 782px) {\n    .wp-core-ui .quicktags-toolbar input.button.button-small {\n      font-size: 12px;\n      min-height: 26px;\n      line-height: 2\n    }\n  }\n\n  #wp_editbtns, #wp_gallerybtns {\n    padding: 2px;\n    position: absolute;\n    display: none;\n    z-index: 100020\n  }\n\n  #wp_delgallery, #wp_delimgbtn, #wp_editgallery, #wp_editimgbtn {\n    background-color: #f0f0f1;\n    margin: 2px;\n    padding: 2px;\n    border: 1px solid #8c8f94;\n    border-radius: 3px\n  }\n\n  #wp_delgallery:hover, #wp_delimgbtn:hover, #wp_editgallery:hover, #wp_editimgbtn:hover {\n    border-color: #50575e;\n    background-color: #c3c4c7\n  }\n\n  #wp-link-wrap {\n    display: none;\n    background-color: #fff;\n    box-shadow: 0 3px 6px rgba(0, 0, 0, .3);\n    width: 500px;\n    overflow: hidden;\n    margin-left: -250px;\n    margin-top: -125px;\n    position: fixed;\n    top: 50%;\n    left: 50%;\n    z-index: 100105;\n    transition: height .2s, margin-top .2s\n  }\n\n  #wp-link-backdrop {\n    display: none;\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    min-height: 360px;\n    background: #000;\n    opacity: .7;\n    z-index: 100100\n  }\n\n  #wp-link {\n    position: relative;\n    height: 100%\n  }\n\n  #wp-link-wrap {\n    height: 500px;\n    margin-top: -250px\n  }\n\n  #wp-link-wrap .wp-link-text-field {\n    display: none\n  }\n\n  #wp-link-wrap.has-text-field .wp-link-text-field {\n    display: block\n  }\n\n  #link-modal-title {\n    background: #fff;\n    border-bottom: 1px solid #dcdcde;\n    height: 36px;\n    font-size: 18px;\n    font-weight: 600;\n    line-height: 2;\n    margin: 0;\n    padding: 0 36px 0 16px\n  }\n\n  #wp-link-close {\n    color: #646970;\n    padding: 0;\n    position: absolute;\n    top: 0;\n    right: 0;\n    width: 36px;\n    height: 36px;\n    text-align: center;\n    background: 0 0;\n    border: none;\n    cursor: pointer\n  }\n\n  #wp-link-close:before {\n    font: normal 20px/36px dashicons;\n    vertical-align: top;\n    speak: never;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    width: 36px;\n    height: 36px;\n    content: \"\\f158\"\n  }\n\n  #wp-link-close:focus, #wp-link-close:hover {\n    color: #135e96\n  }\n\n  #wp-link-close:focus {\n    outline: 0;\n    box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8);\n    outline: 2px solid transparent;\n    outline-offset: -2px\n  }\n\n  #wp-link-wrap #link-selector {\n    -webkit-overflow-scrolling: touch;\n    padding: 0 16px;\n    position: absolute;\n    top: 37px;\n    left: 0;\n    right: 0;\n    bottom: 44px\n  }\n\n  #wp-link ol, #wp-link ul {\n    list-style: none;\n    margin: 0;\n    padding: 0\n  }\n\n  #wp-link input[type=text] {\n    box-sizing: border-box\n  }\n\n  #wp-link #link-options {\n    padding: 8px 0 12px\n  }\n\n  #wp-link p.howto {\n    margin: 3px 0\n  }\n\n  #wp-link p.howto a {\n    text-decoration: none;\n    color: inherit\n  }\n\n  #wp-link label input[type=text] {\n    margin-top: 5px;\n    width: 70%\n  }\n\n  #wp-link #link-options label span, #wp-link #search-panel label span.search-label {\n    display: inline-block;\n    width: 80px;\n    text-align: right;\n    padding-right: 5px;\n    max-width: 24%;\n    vertical-align: middle;\n    word-wrap: break-word\n  }\n\n  #wp-link .link-search-field {\n    width: 250px;\n    max-width: 70%\n  }\n\n  #wp-link .link-search-wrapper {\n    margin: 5px 0 9px;\n    display: block;\n    overflow: hidden\n  }\n\n  #wp-link .link-search-wrapper .spinner {\n    float: none;\n    margin: -3px 0 0 4px\n  }\n\n  #wp-link .link-target {\n    padding: 3px 0 0;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis\n  }\n\n  #wp-link .link-target label {\n    max-width: 70%\n  }\n\n  #wp-link .query-results {\n    border: 1px #dcdcde solid;\n    margin: 0 0 12px;\n    background: #fff;\n    overflow: auto;\n    position: absolute;\n    left: 16px;\n    right: 16px;\n    bottom: 0;\n    top: 166px\n  }\n\n  .has-text-field #wp-link .query-results {\n    top: 210px\n  }\n\n  #wp-link li {\n    clear: both;\n    margin-bottom: 0;\n    border-bottom: 1px solid #f0f0f1;\n    color: #2c3338;\n    padding: 4px 6px 4px 10px;\n    cursor: pointer;\n    position: relative\n  }\n\n  #wp-link .query-notice {\n    padding: 0;\n    border-bottom: 1px solid #dcdcde;\n    background-color: #fff;\n    color: #000\n  }\n\n  #wp-link .query-notice .query-notice-default, #wp-link .query-notice .query-notice-hint {\n    display: block;\n    padding: 6px;\n    border-left: 4px solid #72aee6\n  }\n\n  #wp-link .unselectable.no-matches-found {\n    padding: 0;\n    border-bottom: 1px solid #dcdcde;\n    background-color: #f6f7f7\n  }\n\n  #wp-link .no-matches-found .item-title {\n    display: block;\n    padding: 6px;\n    border-left: 4px solid #d63638\n  }\n\n  #wp-link .query-results em {\n    font-style: normal\n  }\n\n  #wp-link li:hover {\n    background: #f0f6fc;\n    color: #101517\n  }\n\n  #wp-link li.unselectable {\n    border-bottom: 1px solid #dcdcde\n  }\n\n  #wp-link li.unselectable:hover {\n    background: #fff;\n    cursor: auto;\n    color: #2c3338\n  }\n\n  #wp-link li.selected {\n    background: #dcdcde;\n    color: #2c3338\n  }\n\n  #wp-link li.selected .item-title {\n    font-weight: 600\n  }\n\n  #wp-link li:last-child {\n    border: none\n  }\n\n  #wp-link .item-title {\n    display: inline-block;\n    width: 80%;\n    width: calc(100% - 68px);\n    word-wrap: break-word\n  }\n\n  #wp-link .item-info {\n    text-transform: uppercase;\n    color: #646970;\n    font-size: 11px;\n    position: absolute;\n    right: 5px;\n    top: 5px\n  }\n\n  #wp-link .river-waiting {\n    display: none;\n    padding: 10px 0\n  }\n\n  #wp-link .submitbox {\n    padding: 8px 16px;\n    background: #fff;\n    border-top: 1px solid #dcdcde;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    right: 0\n  }\n\n  #wp-link-cancel {\n    line-height: 1.92307692;\n    float: left\n  }\n\n  #wp-link-update {\n    line-height: 1.76923076;\n    float: right\n  }\n\n  #wp-link-submit {\n    float: right\n  }\n\n  @media screen and (max-width: 782px) {\n    #wp-link-wrap {\n      margin-top: -140px\n    }\n    #wp-link-wrap .query-results {\n      top: 195px\n    }\n    #wp-link-wrap.has-text-field .query-results {\n      top: 235px\n    }\n    #link-selector {\n      padding: 0 16px 60px\n    }\n    #wp-link-wrap #link-selector {\n      bottom: 52px\n    }\n    #wp-link-cancel {\n      line-height: 2.46153846\n    }\n    #wp-link .link-target {\n      padding-top: 10px\n    }\n    #wp-link .submitbox .button {\n      margin-bottom: 0\n    }\n  }\n  @media screen and (max-width: 520px) {\n    #wp-link-wrap {\n      width: auto;\n      margin-left: 0;\n      left: 10px;\n      right: 10px;\n      max-width: 500px\n    }\n  }\n  @media screen and (max-height: 520px) {\n    #wp-link-wrap {\n      transition: none;\n      height: auto;\n      margin-top: 0;\n      top: 10px;\n      bottom: 10px\n    }\n    #link-selector {\n      overflow: auto\n    }\n    #search-panel .query-results {\n      position: static\n    }\n  }\n  @media screen and (max-height: 290px) {\n    #wp-link-wrap {\n      height: auto;\n      margin-top: 0;\n      top: 10px;\n      bottom: 10px\n    }\n    #link-selector {\n      overflow: auto;\n      height: calc(100% - 92px);\n      padding-bottom: 2px\n    }\n    #search-panel .query-results {\n      position: static\n    }\n  }\n\n  div.wp-link-preview {\n    float: left;\n    margin: 5px;\n    max-width: 694px;\n    overflow: hidden;\n    text-overflow: ellipsis\n  }\n\n  div.wp-link-preview a {\n    color: #2271b1;\n    text-decoration: underline;\n    transition-property: border, background, color;\n    transition-duration: .05s;\n    transition-timing-function: ease-in-out;\n    cursor: pointer\n  }\n\n  div.wp-link-preview a.wplink-url-error {\n    color: #d63638\n  }\n\n  div.wp-link-input {\n    float: left;\n    margin: 2px;\n    max-width: 694px\n  }\n\n  div.wp-link-input input {\n    width: 300px;\n    padding: 3px;\n    box-sizing: border-box;\n    line-height: 1.28571429;\n    min-height: 26px\n  }\n\n  .mce-toolbar div.wp-link-input ~ .mce-btn, .mce-toolbar div.wp-link-preview ~ .mce-btn {\n    margin: 2px 1px\n  }\n\n  .mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child {\n    margin-right: 2px\n  }\n\n  .ui-autocomplete.wplink-autocomplete {\n    z-index: 100110;\n    max-height: 200px;\n    overflow-y: auto;\n    padding: 0;\n    margin: 0;\n    list-style: none;\n    position: absolute;\n    border: 1px solid #4f94d4;\n    box-shadow: 0 1px 2px rgba(79, 148, 212, .8);\n    background-color: #fff\n  }\n\n  .ui-autocomplete.wplink-autocomplete li {\n    margin-bottom: 0;\n    padding: 4px 10px;\n    clear: both;\n    white-space: normal;\n    text-align: left\n  }\n\n  .ui-autocomplete.wplink-autocomplete li .wp-editor-float-right {\n    float: right\n  }\n\n  .ui-autocomplete.wplink-autocomplete li.ui-state-focus {\n    background-color: #dcdcde;\n    cursor: pointer\n  }\n\n  @media screen and (max-width: 782px) {\n    div.wp-link-input, div.wp-link-preview {\n      max-width: 70%;\n      max-width: calc(100% - 86px)\n    }\n    div.wp-link-preview {\n      margin: 8px 0 8px 5px\n    }\n    div.wp-link-input {\n      width: 300px\n    }\n    div.wp-link-input input {\n      width: 100%;\n      font-size: 16px;\n      padding: 5px\n    }\n  }\n\n  .mce-fullscreen {\n    z-index: 100010\n  }\n\n  .rtl .quicktags-toolbar input, .rtl .wp-switch-editor {\n    font-family: Tahoma, sans-serif\n  }\n\n  .mce-rtl .mce-flow-layout .mce-flow-layout-item > div {\n    direction: rtl\n  }\n\n  .mce-rtl .mce-listbox i.mce-caret {\n    left: 6px\n  }\n\n  html:lang(he-il) .rtl .quicktags-toolbar input, html:lang(he-il) .rtl .wp-switch-editor {\n    font-family: Arial, sans-serif\n  }\n\n  @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {\n    .wp-media-buttons .add_media span.wp-media-buttons-icon {\n      background: 0 0\n    }\n  }\n\n  ul {\n    padding: 0;\n    margin-block-start: 0;\n    margin-block-end: 0px\n  }\n\n  .clear {\n    clear: both\n  }\n\n  .csf {\n    position: relative\n  }\n\n  .csf label {\n    padding: 0;\n    margin: 0;\n    display: inline-block\n  }\n\n  .csf-ab-icon {\n    top: 2px\n  }\n\n  #screen-meta-links + .csf-options {\n    margin-top: 40px\n  }\n\n  .csf-options {\n    margin-top: 20px;\n    margin-right: 20px\n  }\n\n  .csf-header {\n    position: relative\n  }\n\n  .csf-header-inner {\n    padding: 25px;\n    transition: box-shadow .3s ease\n  }\n\n  .csf-header-inner h1 {\n    float: left;\n    font-size: 1.5em;\n    line-height: 26px;\n    font-weight: 400;\n    margin: 0\n  }\n\n  .csf-header-inner h1 small {\n    font-size: 11px;\n    font-weight: 500\n  }\n\n  .csf-sticky .csf-header-inner {\n    position: fixed;\n    z-index: 99;\n    top: 0;\n    box-shadow: 0 5px 10px rgba(0, 0, 0, .1)\n  }\n\n  .csf-buttons {\n    float: right\n  }\n\n  .csf-buttons .button {\n    margin: 0 2px;\n    line-height: 26px\n  }\n\n  .csf-buttons .button:focus {\n    outline: 0 !important;\n    box-shadow: none !important\n  }\n\n  .csf-buttons .csf-save {\n    min-width: 72px\n  }\n\n  .csf-header-left {\n    float: left\n  }\n\n  .csf-header-right {\n    float: right\n  }\n\n  .csf-nav {\n    display: block;\n    position: relative;\n    z-index: 10;\n    float: left\n  }\n\n  .csf-nav ul {\n    clear: left;\n    margin: 0;\n    list-style-type: none\n  }\n\n  .csf-nav ul li {\n    margin-bottom: 0\n  }\n\n  .csf-nav ul li a {\n    font-size: 13px;\n    position: relative;\n    display: block;\n    padding: 14px 12px;\n    text-decoration: none;\n    transition-property: color, background;\n    transition-duration: .2s;\n    transition-timing-function: ease\n  }\n\n  .csf-nav ul li a:focus {\n    outline: 0;\n    box-shadow: none\n  }\n\n  .csf-nav ul li .csf-arrow:after {\n    content: \"\\f054\";\n    display: inline-block;\n    font-family: \"Font Awesome 5 Pro\", \"Font Awesome 5 Free\", FontAwesome;\n    font-weight: 900;\n    font-size: 9px;\n    line-height: 1;\n    position: absolute;\n    right: 10px;\n    top: 50%;\n    margin-top: -4px\n  }\n\n  .csf-nav ul li.csf-tab-expanded .csf-arrow:after {\n    transform: rotate(90deg)\n  }\n\n  .csf-nav ul li.csf-tab-expanded ul {\n    display: block\n  }\n\n  .csf-nav ul ul {\n    display: none;\n    position: relative\n  }\n\n  .csf-nav ul ul li a {\n    font-size: 12px;\n    padding: 12px 14px 12px 24px\n  }\n\n  .csf-nav .csf-tab-icon {\n    width: 20px;\n    margin-right: 5px;\n    font-size: 13px;\n    text-align: center\n  }\n\n  .csf-nav .csf-label-error {\n    margin-left: 4px;\n    vertical-align: top\n  }\n\n  .csf-nav-normal {\n    width: 225px\n  }\n\n  .csf-nav-normal + .csf-content {\n    margin-left: 225px\n  }\n\n  .csf-nav-inline {\n    width: 100%\n  }\n\n  .csf-nav-inline ul li {\n    display: inline-block;\n    vertical-align: top\n  }\n\n  .csf-nav-background {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    z-index: 9;\n    width: 225px\n  }\n\n  .csf-wrapper {\n    position: relative\n  }\n\n  .csf-content {\n    position: relative;\n    background-color: #fff\n  }\n\n  .csf-sections {\n    float: left;\n    width: 100%\n  }\n\n  .csf-section-title {\n    display: none;\n    padding: 20px 30px;\n    background-color: #f5f5f5;\n    border-top: 1px solid #eee;\n    border-bottom: 1px solid #eee\n  }\n\n  .csf-section-title h3 {\n    margin: 0;\n    padding: 0;\n    font-size: 13px;\n    font-weight: 700;\n    text-transform: uppercase\n  }\n\n  .csf-section-title .csf-section-icon {\n    margin-right: 5px\n  }\n\n  .csf-footer {\n    padding: 20px;\n    font-size: 11px\n  }\n\n  .csf-copyright {\n    float: left;\n    margin-top: 5px\n  }\n\n  .csf-search-all .csf-nav, .csf-search-all .csf-nav-background, .csf-show-all .csf-nav, .csf-show-all .csf-nav-background {\n    display: none\n  }\n\n  .csf-search-all .csf-content, .csf-show-all .csf-content {\n    margin-left: 0\n  }\n\n  .csf-search-all .csf-section, .csf-search-all .csf-section-title, .csf-show-all .csf-section, .csf-show-all .csf-section-title {\n    display: block !important\n  }\n\n  .csf-search-all .csf-section-title {\n    display: none !important\n  }\n\n  .csf-expand-all {\n    float: left;\n    padding: 0 8px;\n    margin-right: 4px;\n    z-index: 1;\n    font-size: 13px;\n    line-height: 30px;\n    cursor: pointer;\n    user-select: none;\n    border-radius: 2px;\n    transition: all .2s\n  }\n\n  .csf-expand-all span {\n    font-size: 11px;\n    vertical-align: middle\n  }\n\n  .csf-search {\n    float: left\n  }\n\n  .csf-search input {\n    margin: 0 2px 0 0;\n    border: none;\n    font-size: 12px;\n    line-height: 30px;\n    min-height: 30px;\n    text-align: inherit;\n    padding: 0 10px;\n    border-radius: 2px;\n    box-shadow: none\n  }\n\n  .csf-search input:focus {\n    box-shadow: none\n  }\n\n  .csf-saving .csf-buttons, .csf-saving .csf-content {\n    cursor: default;\n    pointer-events: none;\n    opacity: .5\n  }\n\n  .csf-metabox {\n    margin: -6px -12px -12px -12px\n  }\n\n  .csf-metabox .csf-field {\n    padding: 20px\n  }\n\n  .csf-metabox .csf-section-title {\n    padding: 20px\n  }\n\n  .block-editor-page .csf-metabox {\n    margin: -6px -14px -14px -14px\n  }\n\n  .block-editor-editor-skeleton__content .csf-metabox {\n    border-left: 1px solid #e2e4e7;\n    border-right: 1px solid #e2e4e7\n  }\n\n  .csf-sections-reset {\n    float: left;\n    width: 100%;\n    text-align: right;\n    border-top: 1px solid #eee\n  }\n\n  .csf-sections-reset .csf-button-cancel, .csf-sections-reset input {\n    display: none\n  }\n\n  .csf-sections-reset label {\n    padding: 10px\n  }\n\n  .csf-sections-reset span {\n    -webkit-user-select: none;\n    user-select: none\n  }\n\n  .csf-sections-reset input:checked ~ .csf-button-reset {\n    display: none\n  }\n\n  .csf-sections-reset input:checked ~ .csf-button-cancel {\n    display: inline-block\n  }\n\n  #side-sortables .csf-section-title {\n    padding: 12px\n  }\n\n  #side-sortables .csf-field {\n    padding: 10px 15px\n  }\n\n  #side-sortables .csf-field .csf-title {\n    float: none;\n    width: 100%;\n    margin-bottom: 6px\n  }\n\n  #side-sortables .csf-field .csf-fieldset {\n    float: none;\n    width: 100%\n  }\n\n  #side-sortables .csf-field-text input {\n    width: 100%\n  }\n\n  #side-sortables .csf-notice {\n    padding: 10px 15px\n  }\n\n  .csf-comment-metabox {\n    margin: -6px -12px -12px -12px\n  }\n\n  .csf-comment-metabox .csf-field {\n    padding: 20px\n  }\n\n  .csf-comment-metabox .csf-section-title {\n    padding: 20px\n  }\n\n  .csf-tooltip {\n    position: absolute;\n    z-index: 5000001;\n    font-size: 12px;\n    line-height: 1.4;\n    text-align: center;\n    text-decoration: none;\n    padding: 6px 12px;\n    max-width: 200px;\n    color: #fff;\n    background-color: #000;\n    background-color: rgba(0, 0, 0, .85);\n    border-radius: 4px\n  }\n\n  .csf-theme-dark .csf-header-inner {\n    background-color: #050505\n  }\n\n  .csf-theme-dark .csf-header-inner h1 {\n    color: #fff\n  }\n\n  .csf-theme-dark .csf-header-inner h1 small {\n    color: #555\n  }\n\n  .csf-theme-dark .csf-expand-all {\n    color: #999;\n    background-color: #222\n  }\n\n  .csf-theme-dark .csf-expand-all:hover {\n    color: #fff;\n    background-color: #333\n  }\n\n  .csf-theme-dark .csf-search input {\n    color: #fff;\n    background-color: #222\n  }\n\n  .csf-theme-dark .csf-search:focus {\n    background-color: #444\n  }\n\n  .csf-theme-dark .csf-search::-webkit-input-placeholder {\n    color: #666\n  }\n\n  .csf-theme-dark .csf-nav ul li a {\n    color: #999;\n    border-color: #2f2f2f;\n    background-color: #222\n  }\n\n  .csf-theme-dark .csf-nav ul li a:hover {\n    color: #fff\n  }\n\n  .csf-theme-dark .csf-nav ul li .csf-active {\n    color: #fff;\n    background-color: #111\n  }\n\n  .csf-theme-dark .csf-nav ul ul li a {\n    border-color: #2f2f2f;\n    background-color: #191919\n  }\n\n  .csf-theme-dark .csf-nav ul ul li .csf-active {\n    background-color: #101010\n  }\n\n  .csf-theme-dark .csf-nav ul ul:before {\n    background-color: rgba(34, 34, 34, .75)\n  }\n\n  .csf-theme-dark .csf-nav > ul > li:last-child > a {\n    border: none\n  }\n\n  .csf-theme-dark .csf-nav-normal ul li a {\n    border-bottom-width: 1px;\n    border-bottom-style: solid\n  }\n\n  .csf-theme-dark .csf-nav-normal ul li .csf-active:after {\n    content: \" \";\n    position: absolute;\n    right: 0;\n    top: 50%;\n    height: 0;\n    width: 0;\n    pointer-events: none;\n    border: solid transparent;\n    border-right-color: #fff;\n    border-width: 4px;\n    margin-top: -4px\n  }\n\n  .csf-theme-dark .csf-nav-inline {\n    background-color: #222\n  }\n\n  .csf-theme-dark .csf-nav-inline ul li a {\n    text-align: center;\n    border-right-width: 1px;\n    border-right-style: solid\n  }\n\n  .csf-theme-dark .csf-nav-inline ul li .csf-active:after {\n    content: \" \";\n    position: absolute;\n    left: 50%;\n    bottom: 0;\n    height: 0;\n    width: 0;\n    pointer-events: none;\n    border: solid transparent;\n    border-bottom-color: #fff;\n    border-width: 4px;\n    margin-left: -4px\n  }\n\n  .csf-theme-dark .csf-nav-background {\n    background-color: #222\n  }\n\n  .csf-theme-dark .csf-footer {\n    color: #555;\n    background-color: #050505\n  }\n\n  .csf-theme-light .csf-container {\n    border: 1px solid #ccd0d4;\n    box-shadow: 0 0 15 rgba(0, 0, 0, .04)\n  }\n\n  .csf-theme-light .csf-header-inner {\n    border-bottom: 1px solid #ccd0d4;\n    background-color: #f5f5f5;\n    background: linear-gradient(#fefefe, #f5f5f5)\n  }\n\n  .csf-theme-light .csf-header-inner h1 small {\n    color: #999\n  }\n\n  .csf-theme-light .csf-expand-all {\n    color: #999;\n    background-color: #eee\n  }\n\n  .csf-theme-light .csf-expand-all:hover {\n    color: #555\n  }\n\n  .csf-theme-light .csf-search input {\n    color: #555;\n    background-color: #eee\n  }\n\n  .csf-theme-light .csf-search input::-webkit-input-placeholder {\n    color: #999\n  }\n\n  .csf-theme-light .csf-nav ul li a {\n    font-weight: 500;\n    color: #444;\n    background-color: #f5f5f5\n  }\n\n  .csf-theme-light .csf-nav ul li a:hover {\n    color: #111;\n    background-color: #fff\n  }\n\n  .csf-theme-light .csf-nav ul li .csf-active {\n    color: #111;\n    background-color: #fff\n  }\n\n  .csf-theme-light .csf-nav ul ul li a {\n    background-color: #eee\n  }\n\n  .csf-theme-light .csf-nav-normal > ul {\n    margin-right: -1px;\n    margin-bottom: -1px\n  }\n\n  .csf-theme-light .csf-nav-normal > ul li a {\n    border-bottom: 1px solid #ccd0d4;\n    border-right: 1px solid #ccd0d4\n  }\n\n  .csf-theme-light .csf-nav-normal > ul li .csf-active {\n    border-right-color: #fff\n  }\n\n  .csf-theme-light .csf-nav-inline {\n    background-color: #f5f5f5;\n    border-bottom: 1px solid #ccd0d4\n  }\n\n  .csf-theme-light .csf-nav-inline > ul {\n    margin-bottom: -1px\n  }\n\n  .csf-theme-light .csf-nav-inline > ul li a {\n    text-align: center;\n    border-right: 1px solid #ccd0d4;\n    border-bottom: 1px solid #ccd0d4\n  }\n\n  .csf-theme-light .csf-nav-inline > ul li .csf-active {\n    border-bottom-color: #fff\n  }\n\n  .csf-theme-light .csf-nav-inline > ul ul {\n    display: none !important\n  }\n\n  .csf-theme-light .csf-nav-inline .csf-arrow:after {\n    display: none\n  }\n\n  .csf-theme-light .csf-nav-background {\n    background-color: #f5f5f5;\n    border-right: 1px solid #ccd0d4\n  }\n\n  .csf-theme-light .csf-footer {\n    color: #555;\n    border-top: 1px solid #ccd0d4;\n    background-color: #f5f5f5;\n    background: linear-gradient(#fafafa, #f5f5f5)\n  }\n\n  .csf-field {\n    position: relative;\n    padding: 30px\n  }\n\n  .csf-field + .csf-field {\n    border-top: 1px solid #eee\n  }\n\n  .csf-field p:first-child {\n    margin-top: 0\n  }\n\n  .csf-field p:last-child {\n    margin-bottom: 0\n  }\n\n  .csf-field:after, .csf-field:before {\n    content: \" \";\n    display: table\n  }\n\n  .csf-field:after {\n    clear: both\n  }\n\n  .csf-field h4 {\n    margin-top: 0\n  }\n\n  .csf-field .csf-title {\n    position: relative;\n    width: 20%;\n    float: left\n  }\n\n  .csf-field .csf-title h4 {\n    margin: 0;\n    color: #23282d\n  }\n\n  .csf-field .csf-fieldset {\n    float: right;\n    width: calc(80% - 20px)\n  }\n\n  .csf-pseudo-field {\n    padding: 0 5px 0 0 !important;\n    display: inline-block\n  }\n\n  .csf-pseudo-field + .csf-pseudo-field {\n    border: 0\n  }\n\n  .csf-pseudo-field pre {\n    display: none\n  }\n\n  .csf-field-accordion .csf-accordion-item {\n    position: relative;\n    margin-bottom: 5px\n  }\n\n  .csf-field-accordion .csf-accordion-item:last-child {\n    margin-bottom: 0\n  }\n\n  .csf-field-accordion .csf-accordion-item h4 {\n    font-size: 1em\n  }\n\n  .csf-field-accordion .csf-accordion-title {\n    display: block;\n    cursor: pointer;\n    position: relative;\n    margin: 0;\n    padding: 15px;\n    min-height: 0;\n    font-size: 100%;\n    user-select: none;\n    border: 1px solid #ccd0d4;\n    background-color: #fafafa;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04);\n    transition: border-color .15s\n  }\n\n  .csf-field-accordion .csf-accordion-title:active, .csf-field-accordion .csf-accordion-title:focus, .csf-field-accordion .csf-accordion-title:hover {\n    outline: 0;\n    border-color: #999\n  }\n\n  .csf-field-accordion .csf-accordion-title .csf--icon {\n    width: 20px;\n    text-align: center;\n    margin-right: 2px\n  }\n\n  .csf-field-accordion .csf-accordion-icon {\n    width: 16px;\n    text-align: center\n  }\n\n  .csf-field-accordion .csf-accordion-content {\n    display: none;\n    padding: 0;\n    border: 1px solid #ccd0d4;\n    border-top: none;\n    background-color: #fff;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04)\n  }\n\n  .csf-field-accordion .csf-accordion-content > .csf-field {\n    padding: 15px\n  }\n\n  .csf-field-accordion .csf-accordion-open {\n    display: block\n  }\n\n  .csf-field-background .csf-field {\n    border: 0 !important;\n    padding: 0;\n    margin-bottom: 6px;\n    margin-right: 6px\n  }\n\n  .csf-field-background .csf--title {\n    color: #777;\n    font-size: 12px\n  }\n\n  .csf-field-background .csf--background-colors {\n    display: flex;\n    flex-wrap: wrap\n  }\n\n  .csf-field-background .csf--background-attributes {\n    display: flex;\n    flex-wrap: wrap\n  }\n\n  .csf-field-background .csf--background-attributes select {\n    min-width: 100%;\n    margin: 0\n  }\n\n  .csf-field-background .csf--background-attributes .csf-field {\n    flex: 1\n  }\n\n  .csf-field-background .csf--attributes-hidden {\n    display: none\n  }\n\n  .csf-field-backup textarea {\n    width: 100%;\n    min-height: 200px;\n    margin-bottom: 5px\n  }\n\n  .csf-field-backup small {\n    display: inline-block;\n    margin: 5px\n  }\n\n  .csf-field-backup hr {\n    margin: 20px 0;\n    border: none;\n    border-bottom: 1px solid #e5e5e5\n  }\n\n  .csf-field-border .csf--inputs, .csf-field-dimensions .csf--inputs, .csf-field-spacing .csf--inputs {\n    float: left;\n    display: flex;\n    flex-wrap: wrap\n  }\n\n  .csf-field-border .csf--input, .csf-field-dimensions .csf--input, .csf-field-spacing .csf--input {\n    display: flex;\n    padding-right: 6px;\n    padding-bottom: 4px;\n    box-sizing: border-box\n  }\n\n  .csf-field-border .csf--input select, .csf-field-dimensions .csf--input select, .csf-field-spacing .csf--input select {\n    margin: 0\n  }\n\n  .csf-field-border .csf--input input, .csf-field-dimensions .csf--input input, .csf-field-spacing .csf--input input {\n    position: relative;\n    z-index: 1;\n    margin: 0;\n    width: 65px;\n    max-width: 100%;\n    text-align: center\n  }\n\n  .csf-field-border .csf--color, .csf-field-dimensions .csf--color, .csf-field-spacing .csf--color {\n    float: left\n  }\n\n  .csf-field-border .csf--label, .csf-field-dimensions .csf--label, .csf-field-spacing .csf--label {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    user-select: none;\n    min-width: 20px;\n    max-width: 100%;\n    padding: 0 4px;\n    font-size: 12px;\n    text-align: center;\n    color: #555;\n    border: 1px solid #7b776c;\n    background-color: #f5f5f5\n  }\n\n  .csf-field-border .csf--icon, .csf-field-dimensions .csf--icon, .csf-field-spacing .csf--icon {\n    border-right: 0;\n    border-radius: 4px 0 0 4px\n  }\n\n  .csf-field-border .csf--icon + input, .csf-field-dimensions .csf--icon + input, .csf-field-spacing .csf--icon + input {\n    border-top-left-radius: 0 !important;\n    border-bottom-left-radius: 0 !important\n  }\n\n  .csf-field-border .csf--unit, .csf-field-dimensions .csf--unit, .csf-field-spacing .csf--unit {\n    border-left: 0;\n    border-radius: 0 4px 4px 0\n  }\n\n  .csf-field-border .csf--is-unit, .csf-field-dimensions .csf--is-unit, .csf-field-spacing .csf--is-unit {\n    border-top-right-radius: 0 !important;\n    border-bottom-right-radius: 0 !important\n  }\n\n  .csf-field-button_set .csf--buttons {\n    display: inline-block\n  }\n\n  .csf-field-button_set .csf--button {\n    position: relative;\n    z-index: 1;\n    float: left;\n    cursor: pointer;\n    padding: 7px 14px;\n    min-width: 16px;\n    text-align: center;\n    color: #555;\n    border: 1px solid #ccc;\n    background-color: #f7f7f7;\n    user-select: none;\n    box-shadow: 0 1px 0 rgba(0, 0, 0, .1)\n  }\n\n  .csf-field-button_set .csf--button:first-child {\n    border-radius: 4px 0 0 4px\n  }\n\n  .csf-field-button_set .csf--button:last-child {\n    border-radius: 0 4px 4px 0\n  }\n\n  .csf-field-button_set .csf--button:not(:first-child) {\n    margin-left: -1px\n  }\n\n  .csf-field-button_set .csf--button:hover {\n    background-color: #eee\n  }\n\n  .csf-field-button_set .csf--active, .csf-field-button_set .csf--active:hover {\n    z-index: 2;\n    color: #fff;\n    border-color: #006799;\n    background-color: #0085ba\n  }\n\n  .csf-field-button_set input {\n    display: none\n  }\n\n  .csf-field-checkbox ul, .csf-field-radio ul {\n    margin: 0;\n    padding: 0;\n    list-style-type: none;\n    overflow-y: auto;\n    max-height: 305px\n  }\n\n  .csf-field-checkbox ul li, .csf-field-radio ul li {\n    margin-bottom: 6px\n  }\n\n  .csf-field-checkbox ul ul, .csf-field-radio ul ul {\n    max-height: none\n  }\n\n  .csf-field-checkbox ul ul li, .csf-field-radio ul ul li {\n    margin-left: 8px\n  }\n\n  .csf-field-checkbox ul ul li:first-child, .csf-field-radio ul ul li:first-child {\n    margin-left: 0\n  }\n\n  .csf-field-checkbox input, .csf-field-radio input {\n    margin: 0 1px\n  }\n\n  .csf-field-checkbox .csf--inline-list li, .csf-field-radio .csf--inline-list li {\n    display: inline-block;\n    margin-right: 15px\n  }\n\n  .csf-field-checkbox .csf--text, .csf-field-radio .csf--text {\n    margin-left: 5px;\n    vertical-align: middle\n  }\n\n  .csf-field-checkbox .csf-checker, .csf-field-radio .csf-checker {\n    cursor: pointer\n  }\n\n  .csf-field-code_editor .CodeMirror {\n    width: 100%;\n    height: 400px\n  }\n\n  .csf-field-code_editor .cm-s-default {\n    border: 1px solid #ccd0d4\n  }\n\n  .csf-field-code_editor textarea {\n    width: 100%;\n    height: 400px\n  }\n\n  .csf-field-color > input {\n    opacity: .75;\n    width: 115px;\n    max-width: 100%\n  }\n\n  .csf-field-color .button.wp-picker-clear {\n    padding: 0 8px;\n    margin-left: 6px;\n    line-height: 2.54545455;\n    min-height: 30px\n  }\n\n  .csf-field-color_group .csf--left {\n    float: left;\n    margin-right: 10px;\n    margin-bottom: 5px\n  }\n\n  .csf-field-color_group .csf--title {\n    color: #999;\n    margin-bottom: 5px\n  }\n\n  .csf-field-fieldset .csf-fieldset-content {\n    border: 1px solid #ccd0d4;\n    background-color: #fff;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04)\n  }\n\n  .csf-field-fieldset .csf-fieldset-content > .csf-field {\n    padding: 15px\n  }\n\n  .csf-field-fieldset .csf-field-subheading {\n    font-size: 13px\n  }\n\n  .csf-field-date input {\n    margin: 0\n  }\n\n  .csf-field-date .csf--to {\n    margin-left: 7px\n  }\n\n  .csf-datepicker-wrapper {\n    margin-top: 5px;\n    width: auto;\n    background-color: #fff;\n    z-index: 9999999 !important;\n    box-shadow: 0 0 30px rgba(0, 0, 0, .15)\n  }\n\n  .csf-datepicker-wrapper * {\n    float: none;\n    margin: 0;\n    padding: 0;\n    font-family: inherit;\n    font-weight: 400;\n    font-style: normal;\n    text-decoration: none;\n    border: 0;\n    border-radius: 0;\n    box-shadow: none\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-header, .csf-datepicker-wrapper .ui-widget-header {\n    color: #fff;\n    background: #00a0d2\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-header .ui-state-hover {\n    cursor: pointer\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-title {\n    font-size: 14px;\n    line-height: 40px;\n    height: 40px;\n    text-align: center\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-next, .csf-datepicker-wrapper .ui-datepicker-prev {\n    position: static;\n    top: auto;\n    left: auto;\n    right: auto;\n    font-family: \"Font Awesome 5 Pro\", \"Font Awesome 5 Free\", FontAwesome;\n    font-weight: 900;\n    font-size: 12px;\n    text-align: center;\n    width: 41px;\n    height: 40px;\n    line-height: 40px;\n    color: #fff;\n    background-color: rgba(255, 255, 255, .1);\n    text-rendering: auto;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-next span, .csf-datepicker-wrapper .ui-datepicker-prev span {\n    display: none\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-prev {\n    float: left\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-next {\n    float: right\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-prev:before {\n    content: '\\f053'\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-next:before {\n    content: '\\f054'\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-next-hover, .csf-datepicker-wrapper .ui-datepicker-prev-hover {\n    opacity: .75\n  }\n\n  .csf-datepicker-wrapper tbody .ui-datepicker-week-col {\n    background-color: #f7f7f7\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-buttonpane {\n    padding: 10px;\n    text-align: center;\n    background-color: #f7f7f7\n  }\n\n  .csf-datepicker-wrapper .ui-datepicker-buttonpane button {\n    cursor: pointer;\n    margin: 0 5px;\n    padding: 7px 14px;\n    border: 1px solid #eee;\n    background-color: #fff\n  }\n\n  .csf-datepicker-wrapper select {\n    margin: 5px 5px\n  }\n\n  .csf-datepicker-wrapper select option {\n    color: #555\n  }\n\n  .csf-datepicker-wrapper table {\n    font-size: 13px;\n    border-collapse: collapse;\n    width: 100%\n  }\n\n  .csf-datepicker-wrapper thead {\n    color: #fff;\n    background: #32373c\n  }\n\n  .csf-datepicker-wrapper th {\n    text-align: center;\n    padding: 7px;\n    border: 1px solid #444\n  }\n\n  .csf-datepicker-wrapper td {\n    text-align: center;\n    border: 1px solid #f4f4f4\n  }\n\n  .csf-datepicker-wrapper td.ui-datepicker-other-month {\n    border: transparent\n  }\n\n  .csf-datepicker-wrapper td .ui-state-default {\n    color: #555;\n    width: auto;\n    display: block;\n    padding: 6px 12px\n  }\n\n  .csf-datepicker-wrapper td .ui-state-active, .csf-datepicker-wrapper td .ui-state-hover {\n    color: #fff;\n    background-color: #0073aa\n  }\n\n  .csf-datepicker-wrapper td.ui-state-disabled .ui-state-default {\n    opacity: .5\n  }\n\n  .csf-field-datetime input {\n    margin: 0\n  }\n\n  .csf-field-datetime .csf--to {\n    margin-left: 7px\n  }\n\n  .csf-flatpickr input, .csf-flatpickr select {\n    min-height: auto\n  }\n\n  .csf-flatpickr input:focus, .csf-flatpickr select:focus {\n    box-shadow: none\n  }\n\n  .csf-flatpickr.open {\n    z-index: 9999999 !important\n  }\n\n  .csf-field-gallery ul {\n    margin: 0;\n    padding: 0;\n    list-style-type: none\n  }\n\n  .csf-field-gallery ul li {\n    display: inline-block;\n    position: relative;\n    padding: 4px;\n    margin: 0 5px 10px 0;\n    border: 1px solid #ccc;\n    background-color: #f9f9f9;\n    border-radius: 2px;\n    box-shadow: 0 1px 0 rgba(0, 0, 0, .08)\n  }\n\n  .csf-field-gallery ul li img {\n    max-height: 60px;\n    display: inline-block;\n    vertical-align: middle\n  }\n\n  .csf-field-gallery .button {\n    margin-right: 5px;\n    margin-bottom: 5px\n  }\n\n  .csf-field-group .csf-cloneable-hidden {\n    display: none !important\n  }\n\n  .csf-field-group .csf-cloneable-wrapper {\n    position: relative\n  }\n\n  .csf-field-group .csf-cloneable-item {\n    display: none;\n    position: relative;\n    margin-bottom: 5px\n  }\n\n  .csf-field-group .csf-cloneable-item h4 {\n    font-size: 1em\n  }\n\n  .csf-field-group .ui-accordion .csf-cloneable-item {\n    display: block\n  }\n\n  .csf-field-group .csf-cloneable-content {\n    border: 1px solid #ccd0d4;\n    background-color: #fff;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04)\n  }\n\n  .csf-field-group .csf-cloneable-content > .csf-field {\n    padding: 15px\n  }\n\n  .csf-field-group .csf-cloneable-title {\n    display: block;\n    cursor: pointer;\n    position: relative;\n    user-select: none;\n    margin: 0;\n    padding: 15px 65px 15px 10px;\n    min-height: 0;\n    font-size: 100%;\n    border: 1px solid #ccd0d4;\n    background-color: #fafafa;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04);\n    transition: border-color .15s\n  }\n\n  .csf-field-group .csf-cloneable-title:active, .csf-field-group .csf-cloneable-title:focus, .csf-field-group .csf-cloneable-title:hover {\n    border-color: #999;\n    outline: 0\n  }\n\n  .csf-field-group .csf-cloneable-helper {\n    position: absolute;\n    top: 12px;\n    right: 10px;\n    z-index: 1;\n    font-size: 14px;\n    line-height: 1em\n  }\n\n  .csf-field-group .csf-cloneable-helper i {\n    display: inline-block;\n    cursor: pointer;\n    padding: 5px;\n    color: #999\n  }\n\n  .csf-field-group .csf-cloneable-helper i:hover {\n    color: #555\n  }\n\n  .csf-field-group .csf-cloneable-content {\n    padding: 0;\n    border-top: 0\n  }\n\n  .csf-field-group .csf-cloneable-title-number, .csf-field-group .csf-cloneable-title-prefix {\n    margin-right: 5px\n  }\n\n  .csf-field-group .csf-cloneable-alert {\n    display: none;\n    margin-bottom: 5px;\n    padding: 10px 20px;\n    color: #a94442;\n    border: 1px solid #ebccd1;\n    background-color: #f2dede\n  }\n\n  .csf-field-group .widget-placeholder {\n    margin-bottom: 10px;\n    border: 1px dashed #f1c40f;\n    background-color: #fffae4\n  }\n\n  .csf-field-group .csf-cloneable-header-icon {\n    display: inline-block;\n    text-align: center;\n    font-size: 14px;\n    width: 17px;\n    text-indent: 0;\n    vertical-align: text-top\n  }\n\n  .csf-field-group .csf-cloneable-placeholder {\n    background-color: #ddd;\n    margin-top: 4px;\n    width: 100px;\n    height: 10px;\n    font-size: 10px;\n    line-height: 10px;\n    display: inline-block;\n    vertical-align: top;\n    border-radius: 2px\n  }\n\n  .csf-field-icon .csf-icon-select {\n    display: flex;\n    grid-gap: 5px\n  }\n\n  .csf-field-icon .csf-icon-preview:not(.hidden) {\n    display: flex\n  }\n\n  .csf-field-icon .csf-icon-preview i {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    width: 30px;\n    font-size: 14px;\n    text-align: center;\n    vertical-align: top;\n    color: #555;\n    border: 1px solid #ccc;\n    background-color: #f7f7f7;\n    border-radius: 3px;\n    box-shadow: 0 1px 0 rgba(0, 0, 0, .08)\n  }\n\n  .csf-field-image_select .csf--image {\n    display: inline-block;\n    margin: 0 5px 5px 0\n  }\n\n  .csf-field-image_select .csf--inline-list .csf--image {\n    display: block\n  }\n\n  .csf-field-image_select figure {\n    cursor: pointer;\n    position: relative;\n    display: inline-block;\n    max-width: 100%;\n    margin: 0;\n    vertical-align: bottom;\n    border: 2px solid transparent;\n    background-color: #fff;\n    user-select: none;\n    transition: all .2s\n  }\n\n  .csf-field-image_select figure:before {\n    position: absolute;\n    top: 0;\n    left: 0;\n    text-align: center;\n    font-size: 10px;\n    font-family: \"Font Awesome 5 Pro\", \"Font Awesome 5 Free\", FontAwesome;\n    font-weight: 900;\n    content: \"\\f00c\";\n    width: 16px;\n    height: 16px;\n    line-height: 14px;\n    opacity: 0;\n    color: #fff;\n    background-color: #222;\n    transition: opacity .2s\n  }\n\n  .csf-field-image_select .csf--active figure {\n    border-color: #222;\n    box-shadow: 0 0 20px rgba(0, 0, 0, .2)\n  }\n\n  .csf-field-image_select .csf--active figure:before {\n    opacity: 1\n  }\n\n  .csf-field-image_select img {\n    max-width: 100%;\n    height: auto;\n    vertical-align: top\n  }\n\n  .csf-field-image_select input {\n    display: none\n  }\n\n  .csf-field-link_color .csf--left {\n    float: left;\n    margin-right: 10px;\n    margin-bottom: 5px\n  }\n\n  .csf-field-link_color .csf--title {\n    color: #777;\n    margin-bottom: 5px\n  }\n\n  .csf-field-map input {\n    width: 100%\n  }\n\n  .csf-field-map input[type=text].ui-autocomplete-loading {\n    background-position-x: calc(100% - 5px)\n  }\n\n  .csf-field-map .csf--map-search + .csf--map-osm-wrap {\n    margin-top: 10px\n  }\n\n  .csf-field-map .csf--map-osm-wrap {\n    position: relative;\n    padding: 5px;\n    border: 1px solid #eee;\n    background-color: #fff;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04)\n  }\n\n  .csf-field-map .csf--map-osm {\n    position: relative;\n    z-index: 1;\n    min-height: 250px\n  }\n\n  .csf-field-map .csf--map-inputs {\n    margin-top: 10px;\n    display: flex;\n    justify-content: space-between\n  }\n\n  .csf-field-map .csf--map-input {\n    flex: 1\n  }\n\n  .csf-field-map .csf--map-input:last-child {\n    padding-left: 10px\n  }\n\n  .csf-field-map label {\n    display: block;\n    color: #777;\n    font-size: 12px;\n    margin: 0 0 2px 0\n  }\n\n  .csf-map-ui-autocomplate {\n    z-index: 999999;\n    border-radius: 4px;\n    overflow: hidden\n  }\n\n  .csf-field-media .csf--placeholder {\n    display: flex;\n    align-items: flex-start\n  }\n\n  .csf-field-media .csf--placeholder input {\n    width: 100%;\n    margin: 0\n  }\n\n  .csf-field-media .button {\n    margin-left: 5px\n  }\n\n  .csf-field-media .hidden + .button {\n    margin-left: 0\n  }\n\n  .csf-field-media .csf--preview {\n    position: relative\n  }\n\n  .csf-field-palette .csf--palette {\n    position: relative;\n    display: inline-block;\n    cursor: pointer;\n    border: 2px solid #ddd;\n    margin-right: 10px;\n    margin-bottom: 10px;\n    user-select: none;\n    -webkit-user-select: none;\n    transition: all .2s\n  }\n\n  .csf-field-palette .csf--palette span {\n    vertical-align: middle;\n    display: inline-block;\n    width: 22px;\n    height: 60px;\n    line-height: 60px;\n    overflow: hidden;\n    text-indent: -999px\n  }\n\n  .csf-field-palette .csf--palette:before {\n    position: absolute;\n    top: 0;\n    left: 0;\n    text-align: center;\n    font-size: 10px;\n    font-family: \"Font Awesome 5 Pro\", \"Font Awesome 5 Free\", FontAwesome;\n    font-weight: 900;\n    content: \"\\f00c\";\n    width: 16px;\n    height: 16px;\n    line-height: 14px;\n    opacity: 0;\n    color: #fff;\n    background-color: #222;\n    transition: opacity .2s\n  }\n\n  .csf-field-palette .csf--active {\n    border-color: #222;\n    box-shadow: 0 0 20px rgba(0, 0, 0, .2)\n  }\n\n  .csf-field-palette .csf--active:before {\n    opacity: 1\n  }\n\n  .csf-field-palette input {\n    display: none\n  }\n\n  .csf-field-repeater .csf-field-text input {\n    width: 100%\n  }\n\n  .csf-field-repeater .csf-repeater-hidden {\n    display: none !important\n  }\n\n  .csf-field-repeater .csf-repeater-wrapper .csf-repeater-item {\n    display: table;\n    width: 100%;\n    margin-bottom: 5px;\n    border: 1px solid #eee\n  }\n\n  .csf-field-repeater .csf-repeater-wrapper .csf-repeater-item h4 {\n    font-size: 1em\n  }\n\n  .csf-field-repeater .csf-repeater-content {\n    width: 100%;\n    display: table-cell;\n    vertical-align: middle;\n    background-color: #fff\n  }\n\n  .csf-field-repeater .csf-repeater-content > .csf-field {\n    padding: 15px\n  }\n\n  .csf-field-repeater .csf-repeater-helper {\n    width: 100%;\n    display: table-cell;\n    vertical-align: middle;\n    text-align: center;\n    font-size: 14px;\n    line-height: 1em;\n    border-left: 1px solid #eee;\n    background-color: #f7f7f7\n  }\n\n  .csf-field-repeater .csf-repeater-helper i {\n    display: inline-block;\n    cursor: pointer;\n    color: #999;\n    padding: 5px\n  }\n\n  .csf-field-repeater .csf-repeater-helper i:hover {\n    color: #555\n  }\n\n  .csf-field-repeater .csf-repeater-helper-inner {\n    width: 75px\n  }\n\n  .csf-field-repeater .csf-repeater-alert {\n    display: none;\n    margin-bottom: 5px;\n    padding: 10px 20px;\n    color: #a94442;\n    border: 1px solid #ebccd1;\n    background-color: #f2dede\n  }\n\n  .csf-field-repeater .widget-placeholder {\n    height: 50px;\n    margin-bottom: 3px;\n    border: 1px dashed #f1c40f;\n    background-color: #fffae4\n  }\n\n  .csf-field-repeater .ui-sortable-helper {\n    height: 50px !important;\n    overflow: hidden !important;\n    border-color: #ccc !important;\n    background-color: #eee !important;\n    opacity: .5\n  }\n\n  .csf-field-repeater .ui-sortable-helper .csf-repeater-content, .csf-field-repeater .ui-sortable-helper .csf-repeater-helper {\n    display: none\n  }\n\n  .csf-field-select .csf-fieldset {\n    min-height: 30px\n  }\n\n  .csf-field-select .csf-chosen {\n    display: none\n  }\n\n  .csf-field-select select {\n    max-width: 100%;\n    margin: 0\n  }\n\n  .csf-field-select .csf-hide-select {\n    display: none !important\n  }\n\n  .csf-field-slider .csf--wrap {\n    display: flex;\n    align-items: center\n  }\n\n  .csf-field-slider .csf--input {\n    display: flex\n  }\n\n  .csf-field-slider .csf--unit {\n    display: flex;\n    justify-content: center;\n    flex-direction: column;\n    user-select: none;\n    padding: 0 6px;\n    font-size: 11px;\n    line-height: 1;\n    border-radius: 0 4px 4px 0;\n    color: #555;\n    border: 1px solid #7e8993;\n    border-left: 0;\n    background-color: #f5f5f5\n  }\n\n  .csf-field-slider .csf-slider-ui {\n    margin-right: 15px\n  }\n\n  .csf-field-slider input[type=number] {\n    position: relative;\n    z-index: 1;\n    margin: 0;\n    width: 50px;\n    text-align: center\n  }\n\n  .csf-field-slider .csf--is-unit {\n    border-top-right-radius: 0 !important;\n    border-bottom-right-radius: 0 !important\n  }\n\n  .csf-field-slider .ui-slider {\n    position: relative;\n    width: 100%;\n    height: 3px;\n    border: none;\n    background: #ddd;\n    border-radius: 2px\n  }\n\n  .csf-field-slider .ui-slider-range {\n    height: 3px;\n    border: none;\n    background: #333;\n    border-radius: 2px\n  }\n\n  .csf-field-slider .ui-slider-handle {\n    position: absolute;\n    width: 16px;\n    height: 16px;\n    top: -7px;\n    margin-left: -8px;\n    border: none;\n    background: #333;\n    border-radius: 2px\n  }\n\n  .csf-field-slider .ui-slider-handle:hover, .csf-field-slider .ui-state-active {\n    cursor: pointer;\n    background: #111\n  }\n\n  .csf-field-sortable .csf-field-text input {\n    width: 100%;\n    max-width: 100%\n  }\n\n  .csf-field-sortable .csf-sortable .csf-sortable-item {\n    display: table;\n    width: 100%;\n    margin-bottom: 5px;\n    border: 1px solid #eee\n  }\n\n  .csf-field-sortable .csf-sortable .csf-sortable-item h4 {\n    font-size: 1em\n  }\n\n  .csf-field-sortable .csf-sortable-content {\n    width: 100%;\n    display: table-cell;\n    vertical-align: middle;\n    background-color: #fff\n  }\n\n  .csf-field-sortable .csf-sortable-content > .csf-field {\n    padding: 15px\n  }\n\n  .csf-field-sortable .csf-sortable-helper {\n    width: 100%;\n    display: table-cell;\n    vertical-align: middle;\n    text-align: center;\n    font-size: 14px;\n    line-height: 1em;\n    border-left: 1px solid #eee;\n    background-color: #f7f7f7\n  }\n\n  .csf-field-sortable .csf-sortable-helper i {\n    display: inline-block;\n    cursor: pointer;\n    width: 50px;\n    color: #555\n  }\n\n  .csf-field-sortable .csf-sortable-helper i:hover {\n    opacity: .5\n  }\n\n  .csf-field-sortable .widget-placeholder {\n    height: 50px;\n    margin-bottom: 3px;\n    border: 1px dashed #f1c40f;\n    background-color: #fffae4\n  }\n\n  .csf-field-sortable .ui-sortable-helper {\n    height: 50px !important;\n    overflow: hidden !important;\n    border-color: #ccc !important;\n    background-color: #eee !important;\n    opacity: .5\n  }\n\n  .csf-field-sortable .ui-sortable-helper .csf-sortable-content, .csf-field-sortable .ui-sortable-helper .csf-sortable-helper {\n    display: none\n  }\n\n  .csf-field-sorter .ui-sortable-placeholder {\n    height: 20px;\n    border: 1px dashed #f1c40f;\n    background-color: #fffae4\n  }\n\n  .csf-field-sorter .csf-modules {\n    float: left;\n    width: 50%;\n    box-sizing: border-box\n  }\n\n  .csf-field-sorter .csf-modules:first-child {\n    padding-right: 15px\n  }\n\n  .csf-field-sorter .csf-modules:last-child {\n    padding-left: 15px\n  }\n\n  .csf-field-sorter .csf-disabled, .csf-field-sorter .csf-enabled {\n    padding: 5px 15px;\n    border: 1px dashed #ddd;\n    background-color: #fff\n  }\n\n  .csf-field-sorter .csf-disabled li {\n    opacity: .5;\n    transition: opacity .15s\n  }\n\n  .csf-field-sorter .csf-disabled .ui-sortable-helper {\n    opacity: 1\n  }\n\n  .csf-field-sorter .csf-sorter-title {\n    font-size: 13px;\n    font-weight: 600;\n    padding: 10px;\n    text-align: center;\n    border: 1px dashed #ddd;\n    border-bottom: none;\n    background-color: #f8f8f8;\n    text-transform: uppercase\n  }\n\n  .csf-field-sorter ul {\n    list-style-type: none;\n    margin: 0;\n    padding: 0;\n    min-height: 62px\n  }\n\n  .csf-field-sorter ul li {\n    margin: 10px 0;\n    padding: 10px 15px;\n    cursor: move;\n    font-weight: 700;\n    text-align: center;\n    border: 1px solid #e5e5e5;\n    background-color: #fafafa;\n    transition: border-color .15s\n  }\n\n  .csf-field-sorter ul li:hover {\n    border-color: #bbb\n  }\n\n  .csf-field-spinner .csf--spin {\n    display: flex\n  }\n\n  .csf-field-spinner .ui-widget {\n    font-family: inherit\n  }\n\n  .csf-field-spinner .ui-spinner {\n    display: flex;\n    align-items: stretch;\n    overflow: unset;\n    border: none;\n    background: 0 0;\n    border-radius: 0\n  }\n\n  .csf-field-spinner .ui-spinner .ui-button {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    text-align: center;\n    min-width: 20px;\n    padding: 0 4px;\n    margin: 0;\n    color: #555;\n    background-color: #f5f5f5;\n    border: 1px solid #7e8993\n  }\n\n  .csf-field-spinner .ui-spinner .ui-spinner-button {\n    position: relative;\n    cursor: pointer;\n    height: auto\n  }\n\n  .csf-field-spinner .ui-spinner .ui-spinner-button:hover {\n    background-color: #e7e7e7\n  }\n\n  .csf-field-spinner .ui-spinner .ui-spinner-button:active {\n    background-color: #ddd\n  }\n\n  .csf-field-spinner .ui-spinner .ui-spinner-button:before {\n    font-family: \"Font Awesome 5 Pro\", \"Font Awesome 5 Free\", FontAwesome;\n    font-weight: 900;\n    font-size: 14px;\n    line-height: 14px\n  }\n\n  .csf-field-spinner .ui-spinner .ui-spinner-down {\n    border-right: 0;\n    border-radius: 4px 0 0 4px\n  }\n\n  .csf-field-spinner .ui-spinner .ui-spinner-down:before {\n    content: \"\\f0d9\"\n  }\n\n  .csf-field-spinner .ui-spinner .ui-spinner-up {\n    border-left: 0;\n    border-radius: 0 4px 4px 0\n  }\n\n  .csf-field-spinner .ui-spinner .ui-spinner-up:before {\n    content: \"\\f0da\"\n  }\n\n  .csf-field-spinner .ui-spinner .csf--unit {\n    border-left: 0;\n    user-select: none\n  }\n\n  .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 {\n    display: none\n  }\n\n  .csf-field-spinner .ui-spinner input {\n    font-family: inherit;\n    font-size: inherit;\n    position: relative;\n    z-index: 1;\n    width: 50px;\n    text-align: center;\n    margin: 0;\n    padding: 0 8px;\n    border-radius: 0\n  }\n\n  .csf-field-spinner .ui-spinner-down {\n    order: 1\n  }\n\n  .csf-field-spinner .ui-spinner-input {\n    order: 2\n  }\n\n  .csf-field-spinner .csf--unit {\n    order: 3\n  }\n\n  .csf-field-spinner .ui-spinner-up {\n    order: 4\n  }\n\n  .csf-field-switcher .csf--switcher {\n    float: left;\n    cursor: pointer;\n    position: relative;\n    width: 60px;\n    height: 26px;\n    padding: 0;\n    margin: 0;\n    overflow: hidden;\n    border-radius: 4px;\n    background-color: #ed6f6f;\n    user-select: none;\n    -webkit-user-select: none\n  }\n\n  .csf-field-switcher .csf--ball {\n    position: absolute;\n    top: 4px;\n    left: 4px;\n    width: 24px;\n    height: 18px;\n    background-color: #fff;\n    border-radius: 4px;\n    transition: all .1s;\n    box-shadow: 1px 1px 1px rgba(0, 0, 0, .15)\n  }\n\n  .csf-field-switcher .csf--off, .csf-field-switcher .csf--on {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    font-size: 11px;\n    line-height: 26px;\n    font-weight: 500;\n    font-style: normal;\n    text-align: center;\n    text-transform: uppercase;\n    color: #fff;\n    padding-right: 28px;\n    opacity: 0;\n    transition: all .1s\n  }\n\n  .csf-field-switcher .csf--off {\n    padding-right: 0;\n    padding-left: 28px;\n    opacity: 1\n  }\n\n  .csf-field-switcher .csf--active {\n    background: #4fb845\n  }\n\n  .csf-field-switcher .csf--active .csf--on {\n    opacity: 1\n  }\n\n  .csf-field-switcher .csf--active .csf--off {\n    opacity: 0\n  }\n\n  .csf-field-switcher .csf--active .csf--ball {\n    left: 100%;\n    margin-left: -28px\n  }\n\n  .csf-field-switcher .csf--label {\n    float: left;\n    margin-top: 4px;\n    margin-left: 8px;\n    font-weight: 400;\n    color: #999\n  }\n\n  .csf-field-tabbed .csf-tabbed-content {\n    border: 1px solid #ccd0d4;\n    background-color: #fff;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04)\n  }\n\n  .csf-field-tabbed .csf-tabbed-content > .csf-field {\n    padding: 15px\n  }\n\n  .csf-field-tabbed .csf-tabbed-nav .csf--icon {\n    padding-right: 5px\n  }\n\n  .csf-field-tabbed .csf-tabbed-nav a {\n    display: inline-block;\n    padding: 12px 15px;\n    margin-top: 1px;\n    margin-right: 5px;\n    margin-bottom: -1px;\n    position: relative;\n    text-decoration: none;\n    color: #444;\n    font-weight: 600;\n    border: 1px solid #ccd0d4;\n    background-color: #f3f3f3;\n    transition: all .2s\n  }\n\n  .csf-field-tabbed .csf-tabbed-nav a:hover {\n    background-color: #f9f9f9\n  }\n\n  .csf-field-tabbed .csf-tabbed-nav a.csf-tabbed-active {\n    background-color: #fff;\n    border-bottom-color: #fff\n  }\n\n  .csf-field-tabbed .csf-tabbed-nav a:focus {\n    outline: 0;\n    box-shadow: none\n  }\n\n  .csf-field-text input {\n    width: 50%;\n    max-width: 100%;\n    margin: 0\n  }\n\n  .csf-field-textarea textarea {\n    width: 100%;\n    max-width: 100%;\n    min-height: 125px\n  }\n\n  .csf-field-textarea .csf-shortcode-button {\n    margin-bottom: 10px;\n    margin-right: 5px\n  }\n\n  .csf-field-typography select, .csf-field-typography textarea {\n    margin: 0;\n    min-width: 100%;\n    max-width: 100%\n  }\n\n  .csf-field-typography .csf--title {\n    color: #777;\n    margin: 0 0 2px 0;\n    font-size: 12px\n  }\n\n  .csf-field-typography .csf--title small {\n    vertical-align: top\n  }\n\n  .csf-field-typography .csf--blocks {\n    display: flex;\n    flex-wrap: wrap\n  }\n\n  .csf-field-typography .csf--block {\n    flex: 1;\n    max-width: 100%;\n    padding-right: 6px;\n    padding-bottom: 6px\n  }\n\n  .csf-field-typography .csf--input {\n    margin: 0;\n    min-width: 100%\n  }\n\n  .csf-field-typography .csf--input-wrap {\n    position: relative\n  }\n\n  .csf-field-typography .csf--unit {\n    position: absolute;\n    z-index: 1;\n    right: 4px;\n    top: 4px;\n    bottom: 4px;\n    padding: 2px 6px;\n    color: #666;\n    font-size: 11px;\n    line-height: 1;\n    border-radius: 2px;\n    background: #eee;\n    user-select: none;\n    display: flex;\n    justify-content: center;\n    flex-direction: column\n  }\n\n  .csf-field-typography .csf--preview {\n    font-size: 16px;\n    line-height: 20px;\n    padding: 20px;\n    color: #222;\n    border: 1px solid #eee;\n    background-color: #fff;\n    border-radius: 2.5px;\n    user-select: none;\n    -webkit-user-select: none;\n    transition: background-color .2s, border-color .2s\n  }\n\n  .csf-field-typography .csf--block-preview {\n    cursor: pointer;\n    position: relative;\n    overflow: hidden;\n    margin-top: 10px;\n    max-width: 100%\n  }\n\n  .csf-field-typography .csf--black-background {\n    border-color: #000;\n    background-color: #000\n  }\n\n  .csf-field-typography .csf--toggle {\n    position: absolute;\n    top: 5px;\n    right: 10px;\n    color: #999\n  }\n\n  .csf-field-typography .csf--block-extra-styles {\n    margin-top: 5px\n  }\n\n  .csf-field-upload input {\n    width: 100%;\n    margin: 0\n  }\n\n  .csf-field-upload .csf--wrap {\n    display: flex;\n    align-items: flex-start\n  }\n\n  .csf-field-upload .button {\n    margin-left: 5px\n  }\n\n  .csf-field-upload .csf--preview {\n    position: relative\n  }\n\n  .csf-field-wp_editor .csf-wp-editor {\n    float: left;\n    width: 100%\n  }\n\n  .csf-field-wp_editor .mce-toolbar-grp {\n    border: none\n  }\n\n  .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 {\n    color: #23282d\n  }\n\n  .csf-field-wp_editor .wp-media-buttons {\n    position: relative;\n    z-index: 2\n  }\n\n  .csf-field-wp_editor .wp-editor-tabs {\n    position: relative;\n    z-index: 1\n  }\n\n  .csf-field-wp_editor .csf-no-tinymce {\n    border: 1px solid #e5e5e5\n  }\n\n  .csf-field-wp_editor .csf-no-quicktags .wp-media-buttons {\n    float: none;\n    display: block\n  }\n\n  .csf-field-wp_editor .csf-no-quicktags .mce-tinymce {\n    box-shadow: none;\n    border: 1px solid #e5e5e5\n  }\n\n  .csf-field-wp_editor textarea {\n    width: 100%;\n    max-width: 100%;\n    margin: 0;\n    box-shadow: none\n  }\n\n  .csf-field-heading {\n    font-size: 1.5em;\n    font-weight: 700;\n    color: #23282d;\n    background-color: #f5f5f5\n  }\n\n  .csf-field-subheading {\n    font-size: 14px;\n    font-weight: 700;\n    padding-top: 17px;\n    padding-bottom: 17px;\n    color: #23282d;\n    background-color: #f7f7f7\n  }\n\n  .csf-field-submessage {\n    padding: 0 !important;\n    border: 0 !important\n  }\n\n  .csf-field-submessage + .csf-field {\n    border-top: 0 !important\n  }\n\n  .csf-submessage {\n    font-size: 12px;\n    padding: 17px 30px;\n    border-top: 1px solid transparent;\n    border-bottom: 1px solid transparent\n  }\n\n  .csf-submessage-success {\n    color: #3c763d;\n    border-color: #d6e9c6;\n    background-color: #dff0d8\n  }\n\n  .csf-submessage-info {\n    color: #31708f;\n    border-color: #bce8f1;\n    background-color: #d9edf7\n  }\n\n  .csf-submessage-warning {\n    color: #8a6d3b;\n    border-color: #faebcc;\n    background-color: #fcf8e3\n  }\n\n  .csf-submessage-danger {\n    color: #a94442;\n    border-color: #ebccd1;\n    background-color: #f2dede\n  }\n\n  .csf-submessage-normal {\n    color: #23282d;\n    border-color: #eee;\n    background-color: #f7f7f7\n  }\n\n  .csf-field-notice {\n    background-color: #f7f7f7\n  }\n\n  .csf-notice {\n    padding: 12px;\n    background-color: #fff;\n    border-left-style: solid;\n    border-left-width: 4px;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .1)\n  }\n\n  .csf-notice-success {\n    border-color: #46b450\n  }\n\n  .csf-notice-info {\n    border-color: #339fd4\n  }\n\n  .csf-notice-warning {\n    border-color: #ffbc00\n  }\n\n  .csf-notice-danger {\n    border-color: #dc3232\n  }\n\n  .csf-notice-normal {\n    border-color: #222\n  }\n\n  .csf-field-number input {\n    width: 100%;\n    margin: 0\n  }\n\n  .csf-field-number .csf--wrap {\n    position: relative;\n    float: left;\n    width: 100px\n  }\n\n  .csf-field-number .csf--unit {\n    position: absolute;\n    z-index: 1;\n    right: 4px;\n    top: 4px;\n    bottom: 4px;\n    padding: 2px 6px;\n    color: #666;\n    font-size: 11px;\n    line-height: 1;\n    border-radius: 2px;\n    background: #eee;\n    user-select: none;\n    display: flex;\n    justify-content: center;\n    flex-direction: column\n  }\n\n  .csf-field-link .csf--result {\n    display: inline-block;\n    font-size: 12px;\n    line-height: 16px;\n    padding: 7px 10px;\n    margin-bottom: 7px;\n    color: #777;\n    border: 1px solid #e5e5e5;\n    background-color: #f5f5f5;\n    border-radius: 2px;\n    world-break: break-word\n  }\n\n  .csf-field-link .csf--wrap {\n    position: relative;\n    float: left;\n    width: 100px\n  }\n\n  .csf-field-link .csf--unit {\n    position: absolute;\n    z-index: 1;\n    right: 4px;\n    top: 4px;\n    bottom: 4px;\n    padding: 2px 6px;\n    color: #666;\n    font-size: 11px;\n    line-height: 1;\n    border-radius: 2px;\n    background: #eee;\n    user-select: none;\n    display: flex;\n    justify-content: center;\n    flex-direction: column\n  }\n\n  .csf-help {\n    cursor: help;\n    position: absolute;\n    top: 0;\n    right: 0;\n    padding: 5px;\n    font-size: 13px;\n    color: #aaa\n  }\n\n  .csf-help .csf-help-text {\n    display: none\n  }\n\n  .csf--preview {\n    max-width: 100%\n  }\n\n  .csf-image-preview {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    flex-direction: column;\n    position: relative;\n    padding: 6px;\n    max-width: 120px;\n    max-height: 120px;\n    min-width: 40px;\n    min-height: 40px;\n    margin-bottom: 10px;\n    text-align: center;\n    border-radius: 2px;\n    border: 1px solid #ccc;\n    background-color: #f9f9f9;\n    box-shadow: 0 1px 0 rgba(0, 0, 0, .08)\n  }\n\n  .csf-image-preview i {\n    cursor: pointer;\n    position: absolute;\n    z-index: 1;\n    right: 4px;\n    top: 4px;\n    font-size: 14px;\n    width: 22px;\n    height: 22px;\n    line-height: 22px;\n    text-align: center;\n    text-decoration: none;\n    color: #fff;\n    background-color: #d33;\n    opacity: .75;\n    border-radius: 2px;\n    transition: all .2s\n  }\n\n  .csf-image-preview i:hover {\n    opacity: 1\n  }\n\n  .csf-image-preview i:focus {\n    box-shadow: none\n  }\n\n  .csf-image-preview span {\n    position: relative;\n    overflow: hidden;\n    display: flex;\n    height: 100%;\n    width: 100%\n  }\n\n  .csf-image-preview img {\n    max-width: 100%;\n    height: auto;\n    object-fit: contain\n  }\n\n  .csf-field-custom .csf-field {\n    padding: 0\n  }\n\n  .csf-field .chosen-container-single .chosen-single {\n    height: 28px;\n    line-height: 26px\n  }\n\n  .csf-field .chosen-container-single .chosen-single abbr {\n    top: 0;\n    right: 20px;\n    font-family: \"Font Awesome 5 Pro\", \"Font Awesome 5 Free\", FontAwesome;\n    font-weight: 900;\n    font-size: 12px;\n    height: 100%;\n    width: 18px;\n    color: #aaa;\n    text-align: center;\n    background: 0 0\n  }\n\n  .csf-field .chosen-container-single .chosen-single abbr:before {\n    content: \"\\f00d\"\n  }\n\n  .csf-field .chosen-container-single .chosen-single abbr:hover {\n    color: #555\n  }\n\n  .csf-field .chosen-container-multi .chosen-choices li.search-choice .search-choice-close {\n    font-family: \"Font Awesome 5 Pro\", \"Font Awesome 5 Free\", FontAwesome;\n    font-weight: 900;\n    font-size: 12px;\n    height: 100%;\n    width: 18px;\n    color: #aaa;\n    text-align: center;\n    background: 0 0\n  }\n\n  .csf-field .chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before {\n    content: \"\\f00d\";\n    display: inline-block;\n    padding-top: 3px\n  }\n\n  .csf-field .chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {\n    color: #555\n  }\n\n  .csf-field .chosen-container-single .chosen-single div b {\n    font-family: \"Font Awesome 5 Pro\", \"Font Awesome 5 Free\", FontAwesome;\n    font-weight: 900;\n    font-size: 14px;\n    color: #aaa;\n    background: 0 0\n  }\n\n  .csf-field .chosen-container-single .chosen-single div b:before {\n    content: \"\\f107\"\n  }\n\n  .csf-field .chosen-container-single .chosen-single div b:hover {\n    color: #555\n  }\n\n  .csf-field .chosen-container-multi .chosen-choices li.search-choice-placeholder {\n    border: 1px dashed #aaa;\n    margin: 3px 5px 3px 0\n  }\n\n  .csf-field .chosen-container-multi .ui-sortable li.search-choice span {\n    cursor: move\n  }\n\n  .csf-field .chosen-container-active.chosen-with-drop .chosen-single div b:before {\n    content: \"\\f106\"\n  }\n\n  .csf-field .chosen-container-single .chosen-single-with-deselect span {\n    margin-right: 40px\n  }\n\n  .csf-field .chosen-container-single .chosen-search input[type=text] {\n    background: 0 0\n  }\n\n  .csf-field .chosen-container-single .chosen-search:before {\n    font-family: \"Font Awesome 5 Pro\", \"Font Awesome 5 Free\", FontAwesome;\n    font-weight: 900;\n    font-size: 11px;\n    content: \"\\f002\";\n    position: absolute;\n    right: 12px;\n    top: 10px;\n    color: #aaa\n  }\n\n  .csf-field .wp-picker-container {\n    display: inline-block\n  }\n\n  .csf-field .wp-picker-container .wp-color-result.button {\n    margin-bottom: 0\n  }\n\n  .csf-field .csf--transparent-wrap {\n    display: none;\n    position: relative;\n    top: -1px;\n    width: 235px;\n    padding: 9px 10px;\n    border: 1px solid #dfdfdf;\n    border-top: none;\n    background-color: #fff\n  }\n\n  .csf-field .wp-picker-active .csf--transparent-wrap {\n    display: block\n  }\n\n  .csf-field .csf--transparent-slider {\n    position: absolute;\n    width: 190px;\n    margin-left: 2px;\n    height: 18px\n  }\n\n  .csf-field .csf--transparent-slider .ui-slider-handle {\n    position: absolute;\n    top: -3px;\n    bottom: -3px;\n    z-index: 5;\n    border-color: #aaa;\n    border-style: solid;\n    border-width: 4px 3px;\n    width: 10px;\n    height: 16px;\n    margin: 0 -5px;\n    background: 0 0;\n    cursor: ew-resize;\n    opacity: .9;\n    border-radius: 4px;\n    box-shadow: 0 1px 2px rgba(0, 0, 0, .2)\n  }\n\n  .csf-field .csf--transparent-slider .ui-slider-handle:before {\n    content: \" \";\n    position: absolute;\n    left: -2px;\n    right: -2px;\n    top: -3px;\n    bottom: -3px;\n    border: 2px solid #fff;\n    border-radius: 3px\n  }\n\n  .csf-field .csf--transparent-offset {\n    height: 18px;\n    width: 200px;\n    background: url(../images/checkerboard.png) repeat-y center left scroll #fff;\n    border-radius: 2px;\n    box-shadow: inset 0 0 5px rgba(0, 0, 0, .4)\n  }\n\n  .csf-field .csf--transparent-text {\n    position: absolute;\n    top: 12px;\n    right: 10px;\n    width: 30px;\n    font-size: 12px;\n    line-height: 12px;\n    text-align: center;\n    color: #999\n  }\n\n  .csf-field .csf--transparent-button {\n    cursor: pointer;\n    user-select: none;\n    margin-top: 10px;\n    font-size: 11px;\n    text-align: center;\n    border-radius: 2px;\n    padding: 3px 7px;\n    box-shadow: 0 1px 0 rgba(0, 0, 0, .1);\n    letter-spacing: .2px;\n    color: #777;\n    border: 1px solid #ccc;\n    background-color: #f7f7f7;\n    transition: background-color .2s, border-color .2s, color .2s\n  }\n\n  .csf-field .csf--transparent-active .wp-color-result {\n    background-image: url(../images/checkerboard.png);\n    background-size: 135px;\n    background-position: center left;\n    background-color: transparent !important\n  }\n\n  .csf-field .csf--transparent-active .csf--transparent-button {\n    color: #fff;\n    border-color: #3ea032;\n    background-color: #4fb845\n  }\n\n  .csf-field .csf--transparent-active .fa:before {\n    content: \"\\f205\"\n  }\n\n  .csf-widgets > .csf-field {\n    position: relative;\n    top: -1px;\n    margin-left: -15px;\n    margin-right: -15px;\n    padding: 12px 15px\n  }\n\n  .csf-widgets > .csf-field .csf-title {\n    float: none;\n    width: 100%;\n    margin-bottom: 5px\n  }\n\n  .csf-widgets > .csf-field .csf-fieldset {\n    float: none;\n    width: 100%\n  }\n\n  .csf-widgets .csf-field-text input {\n    width: 100%\n  }\n\n  .csf-widgets .csf-field-notice .csf-notice {\n    padding: 15px\n  }\n\n  .control-section .csf-widgets > .csf-field {\n    margin-left: -10px;\n    margin-right: -10px;\n    padding: 10px 12px\n  }\n\n  .wp-block .csf-widgets {\n    font-size: 13px\n  }\n\n  .wp-block .csf-widgets > .csf-field {\n    margin-left: -10px;\n    margin-right: -10px\n  }\n\n  .wp-block .csf-widgets > .csf-field .button-primary {\n    color: #fff\n  }\n\n  .wp-block .csf-widgets > .csf-field > .csf-title > h4 {\n    font-size: 13px\n  }\n\n  .control-section .csf-field {\n    padding: 0\n  }\n\n  .control-section .csf-field .csf-title {\n    float: none;\n    width: 100%;\n    margin-bottom: 6px\n  }\n\n  .control-section .csf-field .csf-title h4 {\n    display: block;\n    font-size: 13px;\n    line-height: 1;\n    font-weight: 600;\n    color: inherit\n  }\n\n  .control-section .csf-field .csf-fieldset {\n    float: none;\n    width: 100%\n  }\n\n  .control-section .csf-help {\n    top: -5px;\n    right: -5px\n  }\n\n  .control-section .csf-field-select select {\n    width: 100%\n  }\n\n  .control-section .csf-field-heading {\n    color: inherit;\n    font-size: 14px;\n    line-height: 1em;\n    margin-right: -15px;\n    margin-left: -15px;\n    padding: 15px\n  }\n\n  .control-section .csf-field-subheading {\n    color: inherit;\n    font-size: 11px;\n    margin-right: -15px;\n    margin-left: -15px;\n    padding: 10px 15px\n  }\n\n  .control-section .csf-subtitle-text {\n    margin-top: 4px;\n    font-size: 12px\n  }\n\n  .control-section .csf-field-submessage .csf-submessage {\n    margin-right: -15px;\n    margin-left: -15px;\n    padding: 15px\n  }\n\n  .control-section .csf-fieldset .csf-field-heading, .control-section .csf-fieldset .csf-field-subheading, .control-section .csf-fieldset .csf-field-submessage .csf-submessage {\n    margin-left: 0;\n    margin-right: 0\n  }\n\n  .control-section .csf-field-date label, .control-section .csf-field-datetime label {\n    display: block\n  }\n\n  .control-section .csf-field-date .csf--to, .control-section .csf-field-datetime .csf--to {\n    margin-top: 4px;\n    margin-left: 0\n  }\n\n  .control-section .csf-field-sorter ul li {\n    padding: 5px\n  }\n\n  .control-section .csf-field-sorter .csf-modules {\n    float: none;\n    width: 100%\n  }\n\n  .control-section .csf-field-sorter .csf-modules:first-child {\n    padding-right: 0;\n    padding-bottom: 15px\n  }\n\n  .control-section .csf-field-background .csf--background-attributes {\n    flex-direction: column\n  }\n\n  .control-section .csf-field-spacing input {\n    width: 90px\n  }\n\n  .control-section .csf-field-border .csf--input {\n    flex: 1 50%\n  }\n\n  .control-section .csf-field-border input, .control-section .csf-field-border select {\n    width: 100%\n  }\n\n  .control-section .csf-field-spinner input {\n    width: 50px\n  }\n\n  .control-section .csf-field-number .csf--wrap {\n    width: 100%\n  }\n\n  .control-section .csf-field-backup .csf-export-data {\n    display: none\n  }\n\n  .control-section .csf-field-fieldset .csf-fieldset-content {\n    border-color: #e5e5e5\n  }\n\n  .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 {\n    padding: 10px\n  }\n\n  .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 {\n    margin-bottom: 5px\n  }\n\n  .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 {\n    font-size: 12px\n  }\n\n  .control-section .csf-depend-hidden.csf-depend-on {\n    display: none !important\n  }\n\n  .control-section .csf-depend-visible.csf-depend-on {\n    border-top: 0 !important\n  }\n\n  .csf-taxonomy {\n    max-width: 95%\n  }\n\n  .csf-taxonomy > .csf-field {\n    border-top: none !important\n  }\n\n  .csf-taxonomy > .csf-field-heading {\n    font-size: 1.1em;\n    padding: 20px !important;\n    border: 1px solid #ddd\n  }\n\n  .csf-taxonomy > .csf-field-subheading {\n    font-size: 12px;\n    padding: 15px !important;\n    border: 1px solid #ddd\n  }\n\n  .csf-taxonomy > .csf-field-submessage .csf-submessage {\n    padding: 15px;\n    border-left-width: 1px;\n    border-left-style: solid;\n    border-right-width: 1px;\n    border-right-style: solid\n  }\n\n  .csf-taxonomy > .csf-field-notice {\n    background-color: transparent\n  }\n\n  .csf-taxonomy .csf-section-title {\n    display: block;\n    padding: 15px;\n    background-color: #f9f9f9;\n    border: 1px solid #e5e5e5;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .04)\n  }\n\n  .csf-taxonomy-add-fields > .csf-field {\n    padding: 8px 0\n  }\n\n  .csf-taxonomy-add-fields > .csf-field > .csf-title {\n    float: none;\n    width: 100%;\n    padding: 2px 2px 4px 0\n  }\n\n  .csf-taxonomy-add-fields > .csf-field > .csf-title h4 {\n    font-size: 12px;\n    font-weight: 400\n  }\n\n  .csf-taxonomy-add-fields > .csf-field > .csf-fieldset {\n    float: none;\n    width: 100%\n  }\n\n  .csf-taxonomy-add-fields > .csf-field > .csf-fieldset > .csf-help {\n    right: -5px\n  }\n\n  .csf-taxonomy-add-fields + p.submit {\n    margin-top: 0\n  }\n\n  .csf-taxonomy-edit-fields > .csf-field {\n    padding: 20px 0\n  }\n\n  .csf-taxonomy-edit-fields > .csf-field > .csf-title {\n    width: 200px\n  }\n\n  .csf-taxonomy-edit-fields > .csf-field > .csf-title h4 {\n    font-size: 14px;\n    font-weight: 600;\n    line-height: 1.3;\n    display: inline-block;\n    vertical-align: middle\n  }\n\n  .csf-taxonomy-edit-fields > .csf-field > .csf-fieldset {\n    width: calc(100% - 220px)\n  }\n\n  .csf-taxonomy-edit-fields > .csf-field > .csf-fieldset > .csf-help {\n    top: -5px;\n    right: -5px\n  }\n\n  .csf-taxonomy-edit-fields > .csf-field-submessage {\n    margin: 20px 0\n  }\n\n  .csf-taxonomy-edit-fields > .csf-field-heading, .csf-taxonomy-edit-fields > .csf-field-subheading {\n    margin: 20px 0;\n    border: 1px solid #ddd\n  }\n\n  .csf-nav-menu-options {\n    clear: both;\n    float: left;\n    width: 100%\n  }\n\n  .csf-nav-menu-options > .csf-fields {\n    margin: 10px -10px;\n    border-top: 1px solid #eee;\n    border-bottom: 1px solid #eee\n  }\n\n  .csf-nav-menu-options > .csf-fields > .csf-field {\n    padding: 12px\n  }\n\n  .csf-nav-menu-options > .csf-fields > .csf-field .csf-title {\n    float: none;\n    width: 100%;\n    margin-bottom: 5px\n  }\n\n  .csf-nav-menu-options > .csf-fields > .csf-field .csf-fieldset {\n    float: none;\n    width: 100%\n  }\n\n  .csf-nav-menu-options .csf-field-text input {\n    width: 100%\n  }\n\n  .csf-nav-menu-options .csf-field-notice .csf-notice {\n    padding: 15px\n  }\n\n  .csf-nav-menu-title {\n    padding: 12px;\n    background-color: #f5f5f5;\n    border-top: 1px solid #eee;\n    border-bottom: 1px solid #eee\n  }\n\n  .csf-nav-menu-title:first-child {\n    border-top: 0\n  }\n\n  .csf-nav-menu-title h4 {\n    margin: 0;\n    padding: 0;\n    color: #23282d\n  }\n\n  .csf-nav-menu-icon {\n    margin-right: 5px\n  }\n\n  .csf-profile-options > h2 > .fa {\n    padding-right: 7px\n  }\n\n  .csf-profile-options > .csf-field {\n    max-width: 750px;\n    padding: 15px 0;\n    border-top: none !important\n  }\n\n  .csf-profile-options > .csf-field > .csf-title {\n    width: 200px\n  }\n\n  .csf-profile-options > .csf-field > .csf-title h4 {\n    font-size: 14px;\n    font-weight: 600;\n    line-height: 1.3;\n    display: inline-block;\n    vertical-align: middle\n  }\n\n  .csf-profile-options > .csf-field > .csf-fieldset {\n    width: calc(100% - 220px)\n  }\n\n  .csf-profile-options > .csf-field > .csf-fieldset > .csf-help {\n    top: -15px;\n    right: -5px\n  }\n\n  .csf-profile-options > .csf-field-heading {\n    font-size: 1.1em\n  }\n\n  .csf-profile-options > .csf-field-subheading {\n    font-size: 12px\n  }\n\n  .csf-profile-options > .csf-field-heading, .csf-profile-options > .csf-field-subheading {\n    margin: 10px 0;\n    padding: 15px !important;\n    border: 1px solid #ddd\n  }\n\n  .csf-profile-options > .csf-field-submessage {\n    margin: 20px 0\n  }\n\n  .csf-profile-options > .csf-field-submessage .csf-submessage {\n    padding: 10px;\n    border-left-width: 1px;\n    border-left-style: solid;\n    border-right-width: 1px;\n    border-right-style: solid\n  }\n\n  .csf-profile-options > .csf-field-notice {\n    background-color: transparent\n  }\n\n  .csf-modal {\n    position: fixed;\n    z-index: 100101;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%\n  }\n\n  .csf-modal.hidden {\n    display: none\n  }\n\n  .csf-modal-icon {\n    z-index: 100102\n  }\n\n  .csf-modal-table {\n    display: table;\n    width: 100%;\n    height: 100%\n  }\n\n  .csf-modal-table-cell {\n    display: table-cell;\n    vertical-align: middle;\n    margin: 100px 0\n  }\n\n  .csf-modal-inner {\n    position: relative;\n    z-index: 10;\n    width: 760px;\n    height: 750px;\n    margin: 0 auto;\n    background-color: #fff\n  }\n\n  .csf-modal-content {\n    position: relative;\n    overflow: hidden;\n    overflow-y: auto;\n    height: 595px\n  }\n\n  .csf-modal-content .csf-shortcode-button {\n    display: none\n  }\n\n  .csf-modal-content .csf-field {\n    padding: 15px 30px 15px 15px\n  }\n\n  .csf-modal-content a:active, .csf-modal-content a:focus {\n    outline: 0;\n    box-shadow: none\n  }\n\n  .csf-modal-content h4 {\n    font-size: 13px\n  }\n\n  .csf-modal-content h4 small {\n    font-style: italic;\n    font-weight: 400;\n    color: #aaa\n  }\n\n  .csf-modal-title {\n    position: relative;\n    background-color: #fcfcfc;\n    border-bottom: 1px solid #ddd;\n    height: 36px;\n    font-size: 16px;\n    font-weight: 600;\n    line-height: 36px;\n    margin: 0;\n    padding: 0 36px 0 16px\n  }\n\n  .csf-modal-header {\n    width: 100%;\n    padding: 14px 0;\n    background-color: #f5f5f5;\n    border-bottom: 1px solid #ddd\n  }\n\n  .csf-modal-header select {\n    display: block;\n    width: 250px;\n    margin: 0 auto;\n    font-size: 13px;\n    line-height: 1;\n    height: 30px;\n    min-height: 30px;\n    background-color: #fff\n  }\n\n  .csf-modal-close {\n    color: #666;\n    padding: 0;\n    position: absolute;\n    top: 0;\n    right: 0;\n    width: 36px;\n    height: 36px;\n    text-align: center;\n    background: 0 0;\n    border: none;\n    cursor: pointer\n  }\n\n  .csf-modal-close:before {\n    font: normal 20px/36px dashicons;\n    content: \"\\f158\";\n    vertical-align: top;\n    width: 36px;\n    height: 36px\n  }\n\n  .csf-modal-close:hover {\n    opacity: .5\n  }\n\n  .csf-modal-insert-wrapper {\n    text-align: center;\n    width: 100%;\n    padding: 15px 0;\n    background-color: #f5f5f5;\n    border-top: 1px solid #ddd\n  }\n\n  .csf-modal-overlay {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    background-color: #000;\n    opacity: .5\n  }\n\n  .csf--repeatable {\n    padding: 15px 15px 0 15px\n  }\n\n  .csf--repeat-button-block {\n    text-align: center;\n    padding-bottom: 15px\n  }\n\n  .csf--repeat-shortcode {\n    position: relative;\n    margin-bottom: 15px;\n    border: 1px dashed #ddd\n  }\n\n  .csf--repeat-shortcode:first-child .csf-repeat-remove {\n    display: none\n  }\n\n  .csf--repeat-shortcode .csf-repeat-remove {\n    position: absolute;\n    right: 10px;\n    top: 10px;\n    z-index: 10;\n    cursor: pointer;\n    display: inline-block;\n    font-size: 11px;\n    width: 18px;\n    height: 18px;\n    line-height: 18px;\n    text-align: center;\n    border-radius: 2px;\n    color: #fff;\n    background-color: #e14d43;\n    opacity: .5\n  }\n\n  .csf--repeat-shortcode .csf-repeat-remove:hover {\n    opacity: .5\n  }\n\n  .csf-shortcode-single .csf-modal-inner {\n    height: 750px\n  }\n\n  .csf-shortcode-single .csf-modal-content {\n    height: 652px\n  }\n\n  .elementor-editor-active .csf-shortcode-button {\n    margin-left: 5px\n  }\n\n  .elementor-editor-active .csf-modal .hidden {\n    display: none !important\n  }\n\n  .csf-shortcode-block {\n    text-align: center;\n    padding: 14px;\n    font-size: 13px;\n    background-color: #f5f5f5;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif\n  }\n\n  .csf-shortcode-block .components-button {\n    margin-bottom: 10px\n  }\n\n  .csf-modal-icon .csf-icon-title {\n    padding: 15px 0;\n    margin: 4px;\n    font-size: 14px;\n    font-weight: 700;\n    text-align: center;\n    border: 1px solid #eee;\n    background-color: #f7f7f7\n  }\n\n  .csf-modal-icon .csf-modal-header {\n    text-align: center\n  }\n\n  .csf-modal-icon .csf-icon-search {\n    width: 50%;\n    height: 40px;\n    line-height: 40px\n  }\n\n  .csf-modal-icon i {\n    cursor: pointer;\n    display: inline-block;\n    margin: 4px;\n    width: 35px;\n    height: 35px;\n    line-height: 35px;\n    font-size: 16px;\n    color: #555;\n    text-align: center;\n    border: 1px solid #ccc;\n    background-color: #f7f7f7;\n    border-radius: 2px;\n    box-shadow: 1px 1px 0 rgba(0, 0, 0, .05)\n  }\n\n  .csf-modal-icon i:hover {\n    color: #fff;\n    border-color: #222;\n    background-color: #222\n  }\n\n  .csf-modal-icon .csf-modal-content {\n    padding: 10px;\n    height: 618px\n  }\n\n  .csf-modal-icon .csf-error-text {\n    padding: 10px\n  }\n\n  .csf-modal-loading {\n    display: none;\n    position: absolute;\n    left: 15px;\n    top: 15px\n  }\n\n  .csf-loading {\n    position: relative;\n    width: 20px;\n    height: 20px;\n    background: #ccc;\n    border-radius: 20px;\n    box-shadow: 0 2px 5px rgba(0, 0, 0, .07)\n  }\n\n  .csf-loading:after {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    width: 4px;\n    height: 4px;\n    content: \"\";\n    margin-top: -2px;\n    margin-left: -2px;\n    background-color: #fff;\n    animation-duration: .5s;\n    animation-iteration-count: infinite;\n    animation-timing-function: linear;\n    animation-name: csfLoader;\n    border-radius: 4px\n  }\n\n  @keyframes csfLoader {\n    0% {\n      transform: rotate(0) translateX(-6px) rotate(0)\n    }\n    100% {\n      transform: rotate(360deg) translateX(-6px) rotate(-360deg)\n    }\n  }\n\n  .csf-subtitle-text {\n    margin-top: 6px;\n    font-weight: 400;\n    color: #999\n  }\n\n  .csf-desc-text {\n    clear: both;\n    float: left;\n    width: 100%;\n    margin-top: 6px;\n    font-weight: 400;\n    color: #999\n  }\n\n  .csf-error-text {\n    margin-top: 6px;\n    color: #d02c21\n  }\n\n  .csf-before-text {\n    margin-bottom: 6px\n  }\n\n  .csf-after-text {\n    margin-top: 6px\n  }\n\n  .csf-metabox-hide {\n    display: none !important\n  }\n\n  .csf-metabox-show {\n    display: block !important\n  }\n\n  .csf-depend-hidden.csf-depend-on {\n    display: none\n  }\n\n  .csf-depend-visible.csf-depend-on {\n    display: block;\n    opacity: .75;\n    filter: grayscale(1);\n    user-select: none;\n    border-top: 1px solid #eee\n  }\n\n  .csf-depend-visible.csf-depend-on .clear:before {\n    content: \"\";\n    left: 0;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    position: absolute;\n    background-color: #eee;\n    opacity: .25;\n    z-index: 10\n  }\n\n  .csf-warning-primary {\n    color: #fff !important;\n    border-color: #dc3545 !important;\n    background: #dc3545 !important\n  }\n\n  .csf-warning-primary:focus, .csf-warning-primary:hover {\n    border-color: #bd2130 !important;\n    background: #bd2130 !important\n  }\n\n  .csf-warning-primary:focus {\n    box-shadow: 0 0 0 1px #fff, 0 0 0 3px #bd2130 !important\n  }\n\n  .csf-warning-primary:active {\n    border-color: #bd2130 !important;\n    background: #bd2130 !important\n  }\n\n  .csf-form-result {\n    display: none;\n    float: left;\n    padding: 0 8px;\n    margin-right: 4px;\n    font-size: 11px;\n    line-height: 30px;\n    user-select: none;\n    border-radius: 2px\n  }\n\n  .csf-form-show {\n    display: block\n  }\n\n  .csf-form-success {\n    color: #fff;\n    background-color: #46b450\n  }\n\n  .csf-form-warning {\n    color: #8a6d3b;\n    background-color: #faebcc\n  }\n\n  .csf-label-error {\n    position: relative;\n    top: -2px;\n    display: inline-block;\n    font-size: 10px;\n    line-height: 10px;\n    height: 10px;\n    width: 10px;\n    padding: 1px;\n    font-style: normal;\n    text-align: center;\n    color: #fff;\n    vertical-align: middle;\n    background-color: #e10000;\n    border-radius: 2px\n  }\n\n  .csf-no-option {\n    padding: 30px\n  }\n\n  .csf-input-number {\n    -moz-appearance: textfield\n  }\n\n  .csf-input-number::-webkit-inner-spin-button, .csf-input-number::-webkit-outer-spin-button {\n    -webkit-appearance: none;\n    margin: 0\n  }\n\n  .csf-fa5-shims .csf .fab, .csf-fa5-shims .csf .far, .csf-fa5-shims .csf .fas {\n    font-family: FontAwesome;\n    font-style: normal\n  }\n\n  .csf-welcome-wrap {\n    position: relative;\n    margin: 25px 40px 0 20px;\n    font-size: 15px;\n    max-width: 1200px\n  }\n\n  .csf-welcome-wrap p {\n    font-size: 14px;\n    line-height: 1.5\n  }\n\n  .csf-welcome-wrap h1 {\n    margin: .2em 200px 0 0;\n    padding: 0;\n    color: #32373c;\n    line-height: 1.2em;\n    font-size: 2.8em;\n    font-weight: 400\n  }\n\n  .csf-welcome-wrap .csf-logo {\n    position: absolute;\n    overflow: hidden;\n    top: 0;\n    right: 0;\n    height: 160px;\n    width: 140px;\n    background-image: linear-gradient(45deg, #2d67cb, #ad19f3);\n    box-shadow: 0 1px 4px rgba(0, 0, 0, .25), inset 0 0 0 4px rgba(0, 0, 0, .25)\n  }\n\n  .csf-welcome-wrap .csf-logo .csf--effects i {\n    position: absolute;\n    width: 200px;\n    height: 100px;\n    background-color: rgba(0, 0, 0, .15);\n    transform: rotate(-45deg)\n  }\n\n  .csf-welcome-wrap .csf-logo .csf--effects i:nth-child(1) {\n    bottom: -20px;\n    right: -70px\n  }\n\n  .csf-welcome-wrap .csf-logo .csf--effects i:nth-child(2) {\n    bottom: -35px;\n    right: -80px\n  }\n\n  .csf-welcome-wrap .csf-logo .csf--effects i:nth-child(3) {\n    bottom: -50px;\n    right: -90px\n  }\n\n  .csf-welcome-wrap .csf-logo .csf--effects i:nth-child(4) {\n    bottom: -65px;\n    right: -100px\n  }\n\n  .csf-welcome-wrap .csf-logo .csf--wp-logos {\n    position: relative;\n    padding-top: 25px;\n    text-align: center\n  }\n\n  .csf-welcome-wrap .csf-logo .csf--wp-logo {\n    position: absolute;\n    left: 20px;\n    width: 20px;\n    height: 20px;\n    background-repeat: no-repeat;\n    background-position: center center;\n    background-image: url(../images/wp-logo.svg)\n  }\n\n  .csf-welcome-wrap .csf-logo .csf--wp-plugin-logo {\n    display: inline-block;\n    width: 50px;\n    height: 50px;\n    border: 3px solid #fff;\n    background-size: 40px;\n    background-repeat: no-repeat;\n    background-position: center center;\n    background-image: url(../images/wp-plugin-logo.svg);\n    border-radius: 100%;\n    vertical-align: middle\n  }\n\n  .csf-welcome-wrap .csf-logo .csf--text {\n    position: absolute;\n    left: 0;\n    right: 0;\n    top: 90px;\n    color: #fff;\n    font-size: 13px;\n    line-height: 1.2em;\n    font-weight: 600;\n    text-align: center;\n    text-transform: uppercase;\n    text-shadow: 1px 1px 0 rgba(0, 0, 0, .25)\n  }\n\n  .csf-welcome-wrap .csf-logo .csf--version {\n    top: auto;\n    left: auto;\n    right: 8px;\n    bottom: 4px;\n    font-size: 11px;\n    text-transform: lowercase\n  }\n\n  .csf-welcome-wrap .csf-about-text {\n    font-weight: 400;\n    line-height: 1.6em;\n    font-size: 19px;\n    margin: 1em 200px 1em 0;\n    color: #555d66\n  }\n\n  .csf-welcome-wrap .csf-demo-button {\n    margin: 1em 200px 2em 0\n  }\n\n  .csf-welcome-wrap .nav-tab-wrapper {\n    margin-bottom: 20px\n  }\n\n  .csf-welcome-wrap ul {\n    list-style-type: disc;\n    padding-left: 15px\n  }\n\n  .csf-welcome-wrap .csf--col {\n    float: left;\n    padding-right: 20px;\n    box-sizing: border-box\n  }\n\n  .csf-welcome-wrap .csf--col-2 {\n    width: 50%\n  }\n\n  .csf-welcome-wrap .csf--col-3 {\n    width: 33.333%\n  }\n\n  .csf-welcome-wrap .csf--col-4 {\n    width: 25%\n  }\n\n  .csf-welcome-wrap .csf--col-5 {\n    width: 20%\n  }\n\n  .csf-welcome-wrap .csf--col-last {\n    padding-right: 0\n  }\n\n  .csf-welcome-wrap .csf--col-upgrade {\n    padding: 10px 0;\n    text-align: center;\n    border-top: 1px solid #e5e5e5\n  }\n\n  .csf--table-compare tfoot td, .csf--table-compare thead td {\n    text-align: center\n  }\n\n  .csf--table-compare td {\n    font-size: 14px;\n    text-align: center;\n    vertical-align: middle;\n    padding: 10px\n  }\n\n  .csf--table-compare td:first-child {\n    text-align: left\n  }\n\n  .csf--table-compare tfoot td {\n    padding: 15px 0\n  }\n\n  .csf--table-compare .fa {\n    font-size: 18px\n  }\n\n  .csf--table-compare .fa-check-circle {\n    color: #46b450\n  }\n\n  .csf--table-compare .fa-times-circle {\n    color: #dc3232\n  }\n\n  .csf-welcome-cols {\n    clear: both;\n    margin: 20px 0;\n    background-color: #fff;\n    padding: 0 0;\n    border-radius: 2px;\n    border: 1px solid #e5e5e5\n  }\n\n  .csf-welcome-cols .csf--col {\n    width: 33.333%;\n    float: left;\n    padding: 20px;\n    text-align: center;\n    box-sizing: border-box;\n    min-height: 200px;\n    border-right: 1px solid #e5e5e5\n  }\n\n  .csf-welcome-cols .csf--block, .csf-welcome-cols .csf--left {\n    float: left;\n    width: 20%;\n    padding: 0 30px;\n    text-align: center;\n    box-sizing: border-box\n  }\n\n  .csf-welcome-cols .csf--block {\n    width: 80%\n  }\n\n  .csf-welcome-cols .csf--col-first {\n    border-bottom: 1px solid #e5e5e5\n  }\n\n  .csf-welcome-cols .csf--last {\n    border-right: none\n  }\n\n  .csf-welcome-cols .csf--space {\n    height: 20px\n  }\n\n  .csf-welcome-cols .csf--icon {\n    display: inline-block;\n    font-size: 20px;\n    width: 30px;\n    height: 30px;\n    line-height: 30px;\n    text-align: center;\n    margin-bottom: 10px;\n    color: #fff;\n    background-color: #555;\n    border-radius: 30px\n  }\n\n  .csf-welcome-cols .csf--active {\n    background-color: #5cb85c\n  }\n\n  .csf-welcome-cols .csf--deactive {\n    background-color: #e14d43\n  }\n\n  .csf-welcome-cols .csf--title {\n    font-weight: 700;\n    display: block\n  }\n\n  .csf-welcome-cols p:last-child {\n    margin-bottom: 0\n  }\n\n  .csf-features-cols .csf--key-features {\n    width: 30%\n  }\n\n  .csf-features-cols .csf--available-fields {\n    width: 70%\n  }\n\n  .csf-code-block {\n    margin: 20px 0;\n    padding: 5px 20px;\n    background-color: #fff;\n    border-radius: 2px;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, .15)\n  }\n\n  .csf-code-block pre {\n    font-size: 13px;\n    color: #0073aa\n  }\n\n  .csf-code-block pre span {\n    color: #999\n  }\n\n  .csf--table-fields td {\n    font-size: 14px\n  }\n\n  .csf--upgrade a {\n    color: #5cb85c;\n    font-weight: 700\n  }\n\n  .csf--upgrade a:focus, .csf--upgrade a:hover {\n    color: #4aa14a;\n    outline: 0;\n    box-shadow: none\n  }\n\n  @media only screen and (max-width: 782px) {\n    .csf-welcome-cols .csf--col {\n      width: 100%;\n      min-height: auto;\n      border-right: none;\n      border-bottom: 1px solid #e5e5e5\n    }\n    .csf-features-cols .csf--key-features {\n      width: 100%\n    }\n    .csf-features-cols .csf--available-fields {\n      width: 100%\n    }\n  }\n  @media only screen and (max-width: 1200px) {\n    .csf-metabox .csf-field .csf-title {\n      float: none;\n      width: 100%;\n      margin-bottom: 10px\n    }\n    .csf-metabox .csf-field .csf-fieldset {\n      float: none;\n      width: 100%\n    }\n  }\n  @media only screen and (max-width: 782px) {\n    .csf-header-inner {\n      text-align: center\n    }\n    .csf-header-inner h1 {\n      width: 100%;\n      margin-bottom: 10px\n    }\n    .csf-form-result {\n      float: none;\n      margin-right: 0;\n      margin-bottom: 10px\n    }\n    .csf-header-left, .csf-header-right, .csf-search {\n      width: 100%\n    }\n    .csf-search {\n      text-align: center;\n      margin-bottom: 15px\n    }\n    .csf-footer {\n      text-align: center\n    }\n    .csf-buttons {\n      float: none\n    }\n    .csf-copyright {\n      float: none;\n      margin-top: 10px\n    }\n    .csf-expand-all, .csf-nav, .csf-nav-background, .csf-reset-section {\n      display: none !important\n    }\n    .csf-nav-normal + .csf-content {\n      margin-left: 0\n    }\n    .csf-section, .csf-section-title {\n      display: block !important\n    }\n    .csf-field .csf-title {\n      float: none;\n      width: 100%;\n      margin-bottom: 10px\n    }\n    .csf-field .csf-fieldset {\n      float: none;\n      width: 100%\n    }\n    .csf-field-color .button.wp-picker-clear {\n      padding: 0 8px;\n      line-height: 2.14285714;\n      min-height: 32px\n    }\n    .csf-profile-options > .csf-field > .csf-title, .csf-taxonomy-edit-fields > .csf-field > .csf-title {\n      float: none;\n      width: 100%;\n      margin-bottom: 10px\n    }\n    .csf-profile-options > .csf-field > .csf-fieldset, .csf-taxonomy-edit-fields > .csf-field > .csf-fieldset {\n      float: none;\n      width: 100%\n    }\n    .csf-nav-menu-options > .csf-fields {\n      margin-left: -10px;\n      margin-right: -10px\n    }\n    .csf-nav-menu-options > .csf-fields > .csf-field {\n      padding: 10px\n    }\n  }\n  @media only screen and (max-width: 782px) {\n    .csf-modal .csf-modal-inner {\n      width: 90%\n    }\n  }\n  @media only screen and (max-height: 750px) {\n    .csf-modal .csf-modal-inner {\n      height: auto\n    }\n    .csf-modal .csf-modal-content {\n      height: calc(100vh - 200px)\n    }\n  }\n\n  .chosen-container {\n    position: relative;\n    display: inline-block;\n    vertical-align: middle;\n    font-size: 13px;\n    user-select: none\n  }\n\n  .chosen-container * {\n    box-sizing: border-box\n  }\n\n  .chosen-container .chosen-drop {\n    position: absolute;\n    top: 100%;\n    z-index: 1010;\n    width: 100%;\n    border: 1px solid #aaa;\n    border-top: 0;\n    background: #fff;\n    box-shadow: 0 4px 5px rgba(0, 0, 0, .15);\n    clip: rect(0, 0, 0, 0);\n    clip-path: inset(100% 100%)\n  }\n\n  .chosen-container.chosen-with-drop .chosen-drop {\n    clip: auto;\n    clip-path: none\n  }\n\n  .chosen-container a {\n    cursor: pointer\n  }\n\n  .chosen-container .chosen-single .group-name, .chosen-container .search-choice .group-name {\n    margin-right: 4px;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    font-weight: 400;\n    color: #999\n  }\n\n  .chosen-container .chosen-single .group-name:after, .chosen-container .search-choice .group-name:after {\n    content: \":\";\n    padding-left: 2px;\n    vertical-align: top\n  }\n\n  .chosen-container-single .chosen-single {\n    position: relative;\n    display: block;\n    overflow: hidden;\n    padding: 0 0 0 8px;\n    height: 25px;\n    border: 1px solid #aaa;\n    border-radius: 5px;\n    background-color: #fff;\n    background: linear-gradient(#fff 20%, #f6f6f6 50%, #eee 52%, #f4f4f4 100%);\n    background-clip: padding-box;\n    box-shadow: 0 0 3px #fff inset, 0 1px 1px rgba(0, 0, 0, .1);\n    color: #444;\n    text-decoration: none;\n    white-space: nowrap;\n    line-height: 24px\n  }\n\n  .chosen-container-single .chosen-default {\n    color: #999\n  }\n\n  .chosen-container-single .chosen-single span {\n    display: block;\n    overflow: hidden;\n    margin-right: 26px;\n    text-overflow: ellipsis;\n    white-space: nowrap\n  }\n\n  .chosen-container-single .chosen-single-with-deselect span {\n    margin-right: 38px\n  }\n\n  .chosen-container-single .chosen-single abbr {\n    position: absolute;\n    top: 6px;\n    right: 26px;\n    display: block;\n    width: 12px;\n    height: 12px;\n    font-size: 1px\n  }\n\n  .chosen-container-single .chosen-single div {\n    position: absolute;\n    top: 0;\n    right: 0;\n    display: block;\n    width: 18px;\n    height: 100%\n  }\n\n  .chosen-container-single .chosen-single div b {\n    display: block;\n    width: 100%;\n    height: 100%\n  }\n\n  .chosen-container-single .chosen-search {\n    position: relative;\n    z-index: 1010;\n    margin: 0;\n    padding: 3px 4px;\n    white-space: nowrap\n  }\n\n  .chosen-container-single .chosen-search input[type=text] {\n    margin: 1px 0;\n    padding: 4px 20px 4px 5px;\n    width: 100%;\n    height: auto;\n    outline: 0;\n    border: 1px solid #aaa;\n    font-size: 1em;\n    font-family: sans-serif;\n    line-height: normal;\n    border-radius: 0\n  }\n\n  .chosen-container-single .chosen-drop {\n    margin-top: -1px;\n    border-radius: 0 0 4px 4px;\n    background-clip: padding-box\n  }\n\n  .chosen-container-single.chosen-container-single-nosearch .chosen-search {\n    position: absolute;\n    clip: rect(0, 0, 0, 0);\n    clip-path: inset(100% 100%)\n  }\n\n  .chosen-container .chosen-results {\n    color: #444;\n    position: relative;\n    overflow-x: hidden;\n    overflow-y: auto;\n    margin: 0 4px 4px 0;\n    padding: 0 0 0 4px;\n    max-height: 240px;\n    -webkit-overflow-scrolling: touch\n  }\n\n  .chosen-container .chosen-results li {\n    display: none;\n    margin: 0;\n    padding: 5px 6px;\n    list-style: none;\n    line-height: 15px;\n    word-wrap: break-word;\n    -webkit-touch-callout: none\n  }\n\n  .chosen-container .chosen-results li.active-result {\n    display: list-item;\n    cursor: pointer\n  }\n\n  .chosen-container .chosen-results li.disabled-result {\n    display: list-item;\n    color: #ccc;\n    cursor: default\n  }\n\n  .chosen-container .chosen-results li.highlighted {\n    background-color: #3875d7;\n    background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);\n    color: #fff\n  }\n\n  .chosen-container .chosen-results li.no-results {\n    color: #777;\n    display: list-item;\n    background: #f4f4f4\n  }\n\n  .chosen-container .chosen-results li.group-result {\n    display: list-item;\n    font-weight: 700;\n    cursor: default\n  }\n\n  .chosen-container .chosen-results li.group-option {\n    padding-left: 15px\n  }\n\n  .chosen-container .chosen-results li em {\n    font-style: normal;\n    text-decoration: underline\n  }\n\n  .chosen-container-multi .chosen-choices {\n    position: relative;\n    overflow: hidden;\n    margin: 0;\n    padding: 0 5px;\n    width: 100%;\n    height: auto;\n    border: 1px solid #aaa;\n    background-color: #fff;\n    background-image: linear-gradient(#eee 1%, #fff 15%);\n    cursor: text\n  }\n\n  .chosen-container-multi .chosen-choices li {\n    float: left;\n    list-style: none\n  }\n\n  .chosen-container-multi .chosen-choices li.search-field {\n    margin: 0;\n    padding: 0;\n    white-space: nowrap\n  }\n\n  .chosen-container-multi .chosen-choices li.search-field input[type=text] {\n    margin: 1px 0;\n    padding: 0;\n    outline: 0;\n    border: 0 !important;\n    background: 0 0 !important;\n    box-shadow: none;\n    color: #999;\n    font-size: 100%;\n    font-family: sans-serif;\n    line-height: normal;\n    border-radius: 0;\n    width: 25px;\n    height: 25px;\n    min-height: 25px\n  }\n\n  .chosen-container-multi .chosen-choices li.search-choice {\n    position: relative;\n    margin: 3px 5px 3px 0;\n    padding: 3px 20px 3px 6px;\n    border: 1px solid #aaa;\n    max-width: 100%;\n    border-radius: 3px;\n    background-color: #eee;\n    background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);\n    background-size: 100% 19px;\n    background-repeat: repeat-x;\n    background-clip: padding-box;\n    box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, .05);\n    color: #333;\n    line-height: 13px;\n    cursor: default\n  }\n\n  .chosen-container-multi .chosen-choices li.search-choice span {\n    word-wrap: break-word;\n    white-space: nowrap\n  }\n\n  .chosen-container-multi .chosen-choices li.search-choice .search-choice-close {\n    position: absolute;\n    top: 0;\n    right: 0;\n    display: block;\n    width: 12px;\n    height: 12px;\n    font-size: 1px\n  }\n\n  .chosen-container-multi .chosen-choices li.search-choice-disabled {\n    padding-right: 5px;\n    border: 1px solid #ccc;\n    background-color: #e4e4e4;\n    background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);\n    color: #666\n  }\n\n  .chosen-container-multi .chosen-choices li.search-choice-focus {\n    background: #d4d4d4\n  }\n\n  .chosen-container-multi .chosen-results {\n    margin: 0;\n    padding: 0\n  }\n\n  .chosen-container-multi .chosen-drop .result-selected {\n    display: list-item;\n    color: #ccc;\n    cursor: default\n  }\n\n  .chosen-container-active .chosen-single {\n    border: 1px solid #5897fb;\n    box-shadow: 0 0 5px rgba(0, 0, 0, .3)\n  }\n\n  .chosen-container-active.chosen-with-drop .chosen-single {\n    border: 1px solid #aaa;\n    border-bottom-right-radius: 0;\n    border-bottom-left-radius: 0;\n    background-image: linear-gradient(#eee 20%, #fff 80%);\n    box-shadow: 0 1px 0 #fff inset\n  }\n\n  .chosen-container-active.chosen-with-drop .chosen-single div {\n    border-left: none;\n    background: 0 0\n  }\n\n  .chosen-container-active .chosen-choices {\n    border: 1px solid #5897fb;\n    box-shadow: 0 0 5px rgba(0, 0, 0, .3)\n  }\n\n  .chosen-container-active .chosen-choices li.search-field input[type=text] {\n    color: #222 !important\n  }\n\n  .chosen-disabled {\n    opacity: .5 !important;\n    cursor: default\n  }\n\n  .chosen-disabled .chosen-single {\n    cursor: default\n  }\n\n  .chosen-disabled .chosen-choices .search-choice .search-choice-close {\n    cursor: default\n  }\n\n  .chosen-rtl {\n    text-align: right\n  }\n\n  .chosen-rtl .chosen-single {\n    overflow: visible;\n    padding: 0 8px 0 0\n  }\n\n  .chosen-rtl .chosen-single span {\n    margin-right: 0;\n    margin-left: 26px;\n    direction: rtl\n  }\n\n  .chosen-rtl .chosen-single-with-deselect span {\n    margin-left: 38px\n  }\n\n  .chosen-rtl .chosen-single div {\n    right: auto;\n    left: 3px\n  }\n\n  .chosen-rtl .chosen-single abbr {\n    right: auto;\n    left: 26px\n  }\n\n  .chosen-rtl .chosen-choices li {\n    float: right\n  }\n\n  .chosen-rtl .chosen-choices li.search-field input[type=text] {\n    direction: rtl\n  }\n\n  .chosen-rtl .chosen-choices li.search-choice {\n    margin: 3px 5px 3px 0;\n    padding: 3px 5px 3px 19px\n  }\n\n  .chosen-rtl .chosen-choices li.search-choice .search-choice-close {\n    right: auto;\n    left: 4px\n  }\n\n  .chosen-rtl.chosen-container-single .chosen-results {\n    margin: 0 0 4px 4px;\n    padding: 0 4px 0 0\n  }\n\n  .chosen-rtl .chosen-results li.group-option {\n    padding-right: 15px;\n    padding-left: 0\n  }\n\n  .chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {\n    border-right: none\n  }\n\n  .chosen-rtl .chosen-search input[type=text] {\n    padding: 4px 5px 4px 20px;\n    direction: rtl\n  }\n\n  .flatpickr-calendar {\n    background: 0 0;\n    opacity: 0;\n    display: none;\n    text-align: center;\n    visibility: hidden;\n    padding: 0;\n    -webkit-animation: none;\n    animation: none;\n    direction: ltr;\n    border: 0;\n    font-size: 14px;\n    line-height: 24px;\n    border-radius: 5px;\n    position: absolute;\n    width: 307.875px;\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box;\n    -ms-touch-action: manipulation;\n    touch-action: manipulation;\n    background: #fff;\n    -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);\n    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)\n  }\n\n  .flatpickr-calendar.inline, .flatpickr-calendar.open {\n    opacity: 1;\n    max-height: 640px;\n    visibility: visible\n  }\n\n  .flatpickr-calendar.open {\n    display: inline-block;\n    z-index: 99999\n  }\n\n  .flatpickr-calendar.animate.open {\n    -webkit-animation: fpFadeInDown .3s cubic-bezier(.23, 1, .32, 1);\n    animation: fpFadeInDown .3s cubic-bezier(.23, 1, .32, 1)\n  }\n\n  .flatpickr-calendar.inline {\n    display: block;\n    position: relative;\n    top: 2px\n  }\n\n  .flatpickr-calendar.static {\n    position: absolute;\n    top: calc(100% + 2px)\n  }\n\n  .flatpickr-calendar.static.open {\n    z-index: 999;\n    display: block\n  }\n\n  .flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7) {\n    -webkit-box-shadow: none !important;\n    box-shadow: none !important\n  }\n\n  .flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1) {\n    -webkit-box-shadow: -2px 0 0 #e6e6e6, 5px 0 0 #e6e6e6;\n    box-shadow: -2px 0 0 #e6e6e6, 5px 0 0 #e6e6e6\n  }\n\n  .flatpickr-calendar .hasTime .dayContainer, .flatpickr-calendar .hasWeeks .dayContainer {\n    border-bottom: 0;\n    border-bottom-right-radius: 0;\n    border-bottom-left-radius: 0\n  }\n\n  .flatpickr-calendar .hasWeeks .dayContainer {\n    border-left: 0\n  }\n\n  .flatpickr-calendar.hasTime .flatpickr-time {\n    height: 40px;\n    border-top: 1px solid #e6e6e6\n  }\n\n  .flatpickr-calendar.noCalendar.hasTime .flatpickr-time {\n    height: auto\n  }\n\n  .flatpickr-calendar:after, .flatpickr-calendar:before {\n    position: absolute;\n    display: block;\n    pointer-events: none;\n    border: solid transparent;\n    content: '';\n    height: 0;\n    width: 0;\n    left: 22px\n  }\n\n  .flatpickr-calendar.arrowRight:after, .flatpickr-calendar.arrowRight:before, .flatpickr-calendar.rightMost:after, .flatpickr-calendar.rightMost:before {\n    left: auto;\n    right: 22px\n  }\n\n  .flatpickr-calendar.arrowCenter:after, .flatpickr-calendar.arrowCenter:before {\n    left: 50%;\n    right: 50%\n  }\n\n  .flatpickr-calendar:before {\n    border-width: 5px;\n    margin: 0 -5px\n  }\n\n  .flatpickr-calendar:after {\n    border-width: 4px;\n    margin: 0 -4px\n  }\n\n  .flatpickr-calendar.arrowTop:after, .flatpickr-calendar.arrowTop:before {\n    bottom: 100%\n  }\n\n  .flatpickr-calendar.arrowTop:before {\n    border-bottom-color: #e6e6e6\n  }\n\n  .flatpickr-calendar.arrowTop:after {\n    border-bottom-color: #fff\n  }\n\n  .flatpickr-calendar.arrowBottom:after, .flatpickr-calendar.arrowBottom:before {\n    top: 100%\n  }\n\n  .flatpickr-calendar.arrowBottom:before {\n    border-top-color: #e6e6e6\n  }\n\n  .flatpickr-calendar.arrowBottom:after {\n    border-top-color: #fff\n  }\n\n  .flatpickr-calendar:focus {\n    outline: 0\n  }\n\n  .flatpickr-wrapper {\n    position: relative;\n    display: inline-block\n  }\n\n  .flatpickr-months {\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex\n  }\n\n  .flatpickr-months .flatpickr-month {\n    background: 0 0;\n    color: rgba(0, 0, 0, .9);\n    fill: rgba(0, 0, 0, .9);\n    height: 34px;\n    line-height: 1;\n    text-align: center;\n    position: relative;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    overflow: hidden;\n    -webkit-box-flex: 1;\n    -webkit-flex: 1;\n    -ms-flex: 1;\n    flex: 1\n  }\n\n  .flatpickr-months .flatpickr-next-month, .flatpickr-months .flatpickr-prev-month {\n    text-decoration: none;\n    cursor: pointer;\n    position: absolute;\n    top: 0;\n    height: 34px;\n    padding: 10px;\n    z-index: 3;\n    color: rgba(0, 0, 0, .9);\n    fill: rgba(0, 0, 0, .9)\n  }\n\n  .flatpickr-months .flatpickr-next-month.flatpickr-disabled, .flatpickr-months .flatpickr-prev-month.flatpickr-disabled {\n    display: none\n  }\n\n  .flatpickr-months .flatpickr-next-month i, .flatpickr-months .flatpickr-prev-month i {\n    position: relative\n  }\n\n  .flatpickr-months .flatpickr-next-month.flatpickr-prev-month, .flatpickr-months .flatpickr-prev-month.flatpickr-prev-month {\n    left: 0\n  }\n\n  .flatpickr-months .flatpickr-next-month.flatpickr-next-month, .flatpickr-months .flatpickr-prev-month.flatpickr-next-month {\n    right: 0\n  }\n\n  .flatpickr-months .flatpickr-next-month:hover, .flatpickr-months .flatpickr-prev-month:hover {\n    color: #959ea9\n  }\n\n  .flatpickr-months .flatpickr-next-month:hover svg, .flatpickr-months .flatpickr-prev-month:hover svg {\n    fill: #f64747\n  }\n\n  .flatpickr-months .flatpickr-next-month svg, .flatpickr-months .flatpickr-prev-month svg {\n    width: 14px;\n    height: 14px\n  }\n\n  .flatpickr-months .flatpickr-next-month svg path, .flatpickr-months .flatpickr-prev-month svg path {\n    -webkit-transition: fill .1s;\n    transition: fill .1s;\n    fill: inherit\n  }\n\n  .numInputWrapper {\n    position: relative;\n    height: auto\n  }\n\n  .numInputWrapper input, .numInputWrapper span {\n    display: inline-block\n  }\n\n  .numInputWrapper input {\n    width: 100%\n  }\n\n  .numInputWrapper input::-ms-clear {\n    display: none\n  }\n\n  .numInputWrapper input::-webkit-inner-spin-button, .numInputWrapper input::-webkit-outer-spin-button {\n    margin: 0;\n    -webkit-appearance: none\n  }\n\n  .numInputWrapper span {\n    position: absolute;\n    right: 0;\n    width: 14px;\n    padding: 0 4px 0 2px;\n    height: 50%;\n    line-height: 50%;\n    opacity: 0;\n    cursor: pointer;\n    border: 1px solid rgba(57, 57, 57, .15);\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box\n  }\n\n  .numInputWrapper span:hover {\n    background: rgba(0, 0, 0, .1)\n  }\n\n  .numInputWrapper span:active {\n    background: rgba(0, 0, 0, .2)\n  }\n\n  .numInputWrapper span:after {\n    display: block;\n    content: \"\";\n    position: absolute\n  }\n\n  .numInputWrapper span.arrowUp {\n    top: 0;\n    border-bottom: 0\n  }\n\n  .numInputWrapper span.arrowUp:after {\n    border-left: 4px solid transparent;\n    border-right: 4px solid transparent;\n    border-bottom: 4px solid rgba(57, 57, 57, .6);\n    top: 26%\n  }\n\n  .numInputWrapper span.arrowDown {\n    top: 50%\n  }\n\n  .numInputWrapper span.arrowDown:after {\n    border-left: 4px solid transparent;\n    border-right: 4px solid transparent;\n    border-top: 4px solid rgba(57, 57, 57, .6);\n    top: 40%\n  }\n\n  .numInputWrapper span svg {\n    width: inherit;\n    height: auto\n  }\n\n  .numInputWrapper span svg path {\n    fill: rgba(0, 0, 0, .5)\n  }\n\n  .numInputWrapper:hover {\n    background: rgba(0, 0, 0, .05)\n  }\n\n  .numInputWrapper:hover span {\n    opacity: 1\n  }\n\n  .flatpickr-current-month {\n    font-size: 135%;\n    line-height: inherit;\n    font-weight: 300;\n    color: inherit;\n    position: absolute;\n    width: 75%;\n    left: 12.5%;\n    padding: 7.48px 0 0 0;\n    line-height: 1;\n    height: 34px;\n    display: inline-block;\n    text-align: center;\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0)\n  }\n\n  .flatpickr-current-month span.cur-month {\n    font-family: inherit;\n    font-weight: 700;\n    color: inherit;\n    display: inline-block;\n    margin-left: .5ch;\n    padding: 0\n  }\n\n  .flatpickr-current-month span.cur-month:hover {\n    background: rgba(0, 0, 0, .05)\n  }\n\n  .flatpickr-current-month .numInputWrapper {\n    width: 6ch;\n    display: inline-block\n  }\n\n  .flatpickr-current-month .numInputWrapper span.arrowUp:after {\n    border-bottom-color: rgba(0, 0, 0, .9)\n  }\n\n  .flatpickr-current-month .numInputWrapper span.arrowDown:after {\n    border-top-color: rgba(0, 0, 0, .9)\n  }\n\n  .flatpickr-current-month input.cur-year {\n    background: 0 0;\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box;\n    color: inherit;\n    cursor: text;\n    padding: 0 0 0 .5ch;\n    margin: 0;\n    display: inline-block;\n    font-size: inherit;\n    font-family: inherit;\n    font-weight: 300;\n    line-height: inherit;\n    height: auto;\n    border: 0;\n    border-radius: 0;\n    vertical-align: initial;\n    -webkit-appearance: textfield;\n    -moz-appearance: textfield;\n    appearance: textfield\n  }\n\n  .flatpickr-current-month input.cur-year:focus {\n    outline: 0\n  }\n\n  .flatpickr-current-month input.cur-year[disabled], .flatpickr-current-month input.cur-year[disabled]:hover {\n    font-size: 100%;\n    color: rgba(0, 0, 0, .5);\n    background: 0 0;\n    pointer-events: none\n  }\n\n  .flatpickr-current-month .flatpickr-monthDropdown-months {\n    appearance: menulist;\n    background: 0 0;\n    border: none;\n    border-radius: 0;\n    box-sizing: border-box;\n    color: inherit;\n    cursor: pointer;\n    font-size: inherit;\n    font-family: inherit;\n    font-weight: 300;\n    height: auto;\n    line-height: inherit;\n    margin: -1px 0 0 0;\n    outline: 0;\n    padding: 0 0 0 .5ch;\n    position: relative;\n    vertical-align: initial;\n    -webkit-box-sizing: border-box;\n    -webkit-appearance: menulist;\n    -moz-appearance: menulist;\n    width: auto\n  }\n\n  .flatpickr-current-month .flatpickr-monthDropdown-months:active, .flatpickr-current-month .flatpickr-monthDropdown-months:focus {\n    outline: 0\n  }\n\n  .flatpickr-current-month .flatpickr-monthDropdown-months:hover {\n    background: rgba(0, 0, 0, .05)\n  }\n\n  .flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month {\n    background-color: transparent;\n    outline: 0;\n    padding: 0\n  }\n\n  .flatpickr-weekdays {\n    background: 0 0;\n    text-align: center;\n    overflow: hidden;\n    width: 100%;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-align: center;\n    -webkit-align-items: center;\n    -ms-flex-align: center;\n    align-items: center;\n    height: 28px\n  }\n\n  .flatpickr-weekdays .flatpickr-weekdaycontainer {\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-flex: 1;\n    -webkit-flex: 1;\n    -ms-flex: 1;\n    flex: 1\n  }\n\n  span.flatpickr-weekday {\n    cursor: default;\n    font-size: 90%;\n    background: 0 0;\n    color: rgba(0, 0, 0, .54);\n    line-height: 1;\n    margin: 0;\n    text-align: center;\n    display: block;\n    -webkit-box-flex: 1;\n    -webkit-flex: 1;\n    -ms-flex: 1;\n    flex: 1;\n    font-weight: bolder\n  }\n\n  .dayContainer, .flatpickr-weeks {\n    padding: 1px 0 0 0\n  }\n\n  .flatpickr-days {\n    position: relative;\n    overflow: hidden;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-align: start;\n    -webkit-align-items: flex-start;\n    -ms-flex-align: start;\n    align-items: flex-start;\n    width: 307.875px\n  }\n\n  .flatpickr-days:focus {\n    outline: 0\n  }\n\n  .dayContainer {\n    padding: 0;\n    outline: 0;\n    text-align: left;\n    width: 307.875px;\n    min-width: 307.875px;\n    max-width: 307.875px;\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box;\n    display: inline-block;\n    display: -ms-flexbox;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: flex;\n    -webkit-flex-wrap: wrap;\n    flex-wrap: wrap;\n    -ms-flex-wrap: wrap;\n    -ms-flex-pack: justify;\n    -webkit-justify-content: space-around;\n    justify-content: space-around;\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n    opacity: 1\n  }\n\n  .dayContainer + .dayContainer {\n    -webkit-box-shadow: -1px 0 0 #e6e6e6;\n    box-shadow: -1px 0 0 #e6e6e6\n  }\n\n  .flatpickr-day {\n    background: 0 0;\n    border: 1px solid transparent;\n    border-radius: 150px;\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box;\n    color: #393939;\n    cursor: pointer;\n    font-weight: 400;\n    width: 14.2857143%;\n    -webkit-flex-basis: 14.2857143%;\n    -ms-flex-preferred-size: 14.2857143%;\n    flex-basis: 14.2857143%;\n    max-width: 39px;\n    height: 39px;\n    line-height: 39px;\n    margin: 0;\n    display: inline-block;\n    position: relative;\n    -webkit-box-pack: center;\n    -webkit-justify-content: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    text-align: center\n  }\n\n  .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 {\n    cursor: pointer;\n    outline: 0;\n    background: #e6e6e6;\n    border-color: #e6e6e6\n  }\n\n  .flatpickr-day.today {\n    border-color: #959ea9\n  }\n\n  .flatpickr-day.today:focus, .flatpickr-day.today:hover {\n    border-color: #959ea9;\n    background: #959ea9;\n    color: #fff\n  }\n\n  .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 {\n    background: #569ff7;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n    color: #fff;\n    border-color: #569ff7\n  }\n\n  .flatpickr-day.endRange.startRange, .flatpickr-day.selected.startRange, .flatpickr-day.startRange.startRange {\n    border-radius: 50px 0 0 50px\n  }\n\n  .flatpickr-day.endRange.endRange, .flatpickr-day.selected.endRange, .flatpickr-day.startRange.endRange {\n    border-radius: 0 50px 50px 0\n  }\n\n  .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)) {\n    -webkit-box-shadow: -10px 0 0 #569ff7;\n    box-shadow: -10px 0 0 #569ff7\n  }\n\n  .flatpickr-day.endRange.startRange.endRange, .flatpickr-day.selected.startRange.endRange, .flatpickr-day.startRange.startRange.endRange {\n    border-radius: 50px\n  }\n\n  .flatpickr-day.inRange {\n    border-radius: 0;\n    -webkit-box-shadow: -5px 0 0 #e6e6e6, 5px 0 0 #e6e6e6;\n    box-shadow: -5px 0 0 #e6e6e6, 5px 0 0 #e6e6e6\n  }\n\n  .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 {\n    color: rgba(57, 57, 57, .3);\n    background: 0 0;\n    border-color: transparent;\n    cursor: default\n  }\n\n  .flatpickr-day.flatpickr-disabled, .flatpickr-day.flatpickr-disabled:hover {\n    cursor: not-allowed;\n    color: rgba(57, 57, 57, .1)\n  }\n\n  .flatpickr-day.week.selected {\n    border-radius: 0;\n    -webkit-box-shadow: -5px 0 0 #569ff7, 5px 0 0 #569ff7;\n    box-shadow: -5px 0 0 #569ff7, 5px 0 0 #569ff7\n  }\n\n  .flatpickr-day.hidden {\n    visibility: hidden\n  }\n\n  .rangeMode .flatpickr-day {\n    margin-top: 1px\n  }\n\n  .flatpickr-weekwrapper {\n    float: left\n  }\n\n  .flatpickr-weekwrapper .flatpickr-weeks {\n    padding: 0 12px;\n    -webkit-box-shadow: 1px 0 0 #e6e6e6;\n    box-shadow: 1px 0 0 #e6e6e6\n  }\n\n  .flatpickr-weekwrapper .flatpickr-weekday {\n    float: none;\n    width: 100%;\n    line-height: 28px\n  }\n\n  .flatpickr-weekwrapper span.flatpickr-day, .flatpickr-weekwrapper span.flatpickr-day:hover {\n    display: block;\n    width: 100%;\n    max-width: none;\n    color: rgba(57, 57, 57, .3);\n    background: 0 0;\n    cursor: default;\n    border: none\n  }\n\n  .flatpickr-innerContainer {\n    display: block;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box;\n    overflow: hidden\n  }\n\n  .flatpickr-rContainer {\n    display: inline-block;\n    padding: 0;\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box\n  }\n\n  .flatpickr-time {\n    text-align: center;\n    outline: 0;\n    display: block;\n    height: 0;\n    line-height: 40px;\n    max-height: 40px;\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box;\n    overflow: hidden;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex\n  }\n\n  .flatpickr-time:after {\n    content: \"\";\n    display: table;\n    clear: both\n  }\n\n  .flatpickr-time .numInputWrapper {\n    -webkit-box-flex: 1;\n    -webkit-flex: 1;\n    -ms-flex: 1;\n    flex: 1;\n    width: 40%;\n    height: 40px;\n    float: left\n  }\n\n  .flatpickr-time .numInputWrapper span.arrowUp:after {\n    border-bottom-color: #393939\n  }\n\n  .flatpickr-time .numInputWrapper span.arrowDown:after {\n    border-top-color: #393939\n  }\n\n  .flatpickr-time.hasSeconds .numInputWrapper {\n    width: 26%\n  }\n\n  .flatpickr-time.time24hr .numInputWrapper {\n    width: 49%\n  }\n\n  .flatpickr-time input {\n    background: 0 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n    border: 0;\n    border-radius: 0;\n    text-align: center;\n    margin: 0;\n    padding: 0;\n    height: inherit;\n    line-height: inherit;\n    color: #393939;\n    font-size: 14px;\n    position: relative;\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box;\n    -webkit-appearance: textfield;\n    -moz-appearance: textfield;\n    appearance: textfield\n  }\n\n  .flatpickr-time input.flatpickr-hour {\n    font-weight: 700\n  }\n\n  .flatpickr-time input.flatpickr-minute, .flatpickr-time input.flatpickr-second {\n    font-weight: 400\n  }\n\n  .flatpickr-time input:focus {\n    outline: 0;\n    border: 0\n  }\n\n  .flatpickr-time .flatpickr-am-pm, .flatpickr-time .flatpickr-time-separator {\n    height: inherit;\n    float: left;\n    line-height: inherit;\n    color: #393939;\n    font-weight: 700;\n    width: 2%;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    -webkit-align-self: center;\n    -ms-flex-item-align: center;\n    align-self: center\n  }\n\n  .flatpickr-time .flatpickr-am-pm {\n    outline: 0;\n    width: 18%;\n    cursor: pointer;\n    text-align: center;\n    font-weight: 400\n  }\n\n  .flatpickr-time .flatpickr-am-pm:focus, .flatpickr-time .flatpickr-am-pm:hover, .flatpickr-time input:focus, .flatpickr-time input:hover {\n    background: #eee\n  }\n\n  .flatpickr-input[readonly] {\n    cursor: pointer\n  }\n\n  @-webkit-keyframes fpFadeInDown {\n    from {\n      opacity: 0;\n      -webkit-transform: translate3d(0, -20px, 0);\n      transform: translate3d(0, -20px, 0)\n    }\n    to {\n      opacity: 1;\n      -webkit-transform: translate3d(0, 0, 0);\n      transform: translate3d(0, 0, 0)\n    }\n  }\n  @keyframes fpFadeInDown {\n    from {\n      opacity: 0;\n      -webkit-transform: translate3d(0, -20px, 0);\n      transform: translate3d(0, -20px, 0)\n    }\n    to {\n      opacity: 1;\n      -webkit-transform: translate3d(0, 0, 0);\n      transform: translate3d(0, 0, 0)\n    }\n  }\n\n  .disabled {\n    pointer-events: none;\n    filter: grayscale(100%);\n    -webkit-filter: grayscale(100%);\n    -moz-filter: grayscale(100%);\n    -ms-filter: grayscale(100%);\n    -o-filter: grayscale(100%);\n    filter: url(\"data:image/svg+xml;utf8,#grayscale\");\n    filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);\n    -webkit-filter: grayscale(1)\n  }\n\n  .compact {\n    padding-top: 0 !important;\n    border-top: none !important;\n    margin-top: -10px !important\n  }\n\n  i.added::after {\n    content: 'HOT';\n    position: absolute;\n    background: #ff0006;\n    border-radius: 10px;\n    padding: 1px 10px;\n    font-size: 12px;\n    color: #fff;\n    right: 10px\n  }\n\n  .authorization-form, .vip-certificate {\n    position: relative;\n    overflow: hidden;\n    background: #ffffff;\n    border-radius: 10px;\n    box-shadow: 0px 5px 20px rgba(0, 0, 0, .2)\n  }\n\n  .authorization-form {\n    text-align: center\n  }\n\n  .aut-title {\n    color: #fff;\n    padding: 10px;\n    background-color: #6b3bbc;\n    background-image: linear-gradient(43deg, #6b3bbc 0%, #cd12be 46%, #ff0006 100%)\n  }\n\n  .aut-content {\n    padding: 20px\n  }\n\n  .vip-certificate {\n    display: flex;\n    padding: 10px 20px;\n    color: #fff;\n    background-color: #6b3bbc;\n    background-image: linear-gradient(43deg, #6b3bbc 0%, #cd12be 46%, #ff0006 100%);\n    align-items: center\n  }\n\n  .vip-certificate .ok-icon {\n    background: rgba(255, 255, 255, 0.2);\n    border-radius: 50%;\n    width: 50px;\n    height: 50px;\n    font-size: 30px;\n    line-height: 45px;\n    text-align: center;\n    margin-right: 10px\n  }\n\n  .bnt-svg {\n    width: 20px;\n    height: 20px;\n    margin-left: auto\n  }\n\n  .ajax-notice {\n    margin-top: 10px\n  }\n\n  .csf-container {\n    border: none !important;\n    border-radius: 10px;\n    overflow: hidden;\n    box-shadow: 0 0 20px rgba(82,82,82, 10%)\n  }\n\n  .new > .csf-title {\n    position: relative\n  }\n\n  .new > .csf-title::after {\n    content: \"new\" !important;\n    position: absolute;\n    color: #fff;\n    font-size: 10px;\n    background-color: rgba(255, 0, 0, .7);\n    padding: 0px 4px;\n    border-radius: 6px;\n    left: -15px;\n    top: -15px\n  }\n\n  .csf-tab-item .new-item::before {\n    content: \"\";\n    width: 6px;\n    height: 6px;\n    position: absolute;\n    color: #fff;\n    font-size: 10px;\n    background-color: rgb(255, 0, 0);\n    border-radius: 6px;\n    left: 5px;\n    top: 5px\n  }\n\n  .progress {\n    background: #e6e6e6;\n    padding: 2px;\n    border-radius: 20px;\n    position: relative;\n    opacity: 0;\n    transition: .5s\n  }\n\n  .progress .progress-bar {\n    width: 1%;\n    background-color: #ff4c76;\n    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);\n    animation: reverse progress-bar 1s linear infinite;\n    background-size: 40px 40px;\n    position: absolute;\n    left: 0;\n    height: 100%;\n    top: 0;\n    bottom: 0;\n    border-radius: 20px\n  }\n\n  @keyframes progress-bar {\n    0% {\n      background-position: 40px 0\n    }\n    100% {\n      background-position: 0 0\n    }\n  }\n\n  .but {\n    border-radius: 4px;\n    display: inline-block;\n    border-radius: 4px;\n    -webkit-transition: .15s !important;\n    transition: .15s !important;\n    vertical-align: middle;\n    font-size: 14px;\n    padding: 5px 20px;\n    text-align: center;\n    box-shadow: none;\n    background: rgba(136, 136, 136, .1);\n    color: #888;\n    border: 1px solid transparent;\n    line-height: 1.44;\n    margin: 2px;\n    min-height: unset;\n    text-decoration: none\n  }\n\n  .but a {\n    color: inherit\n  }\n\n  .but svg.icon, .but > .fa {\n    margin-right: .25em\n  }\n\n  .but.radius, .radius > .but {\n    border-radius: 50px;\n    padding: .3em .8em\n  }\n\n  .but.hollow {\n    background: transparent;\n    --this-border: var(--this-color)\n  }\n\n  .but:focus, .but:hover {\n    opacity: .8;\n    background: var(--this-bg);\n    color: var(--this-color)\n  }\n\n  .but:focus {\n    --this-shadow: inset 0 2px 3px rgba(0, 0, 0, .08)\n  }\n\n  .but:active {\n    --this-shadow: inset 0 2px 3px rgba(0, 0, 0, .08);\n    background: var(--this-bg);\n    color: var(--this-color)\n  }\n\n  .but.hollow:hover {\n    background: var(--this-color);\n    color: #fff\n  }\n\n  [disabled] {\n    opacity: .6 !important;\n    filter: grayscale(40%);\n    cursor: no-drop\n  }\n\n  .padding-lg, .but.padding-lg {\n    padding: .5em 2em\n  }\n\n  .b-theme, .b-red, .b-yellow, .b-blue, .b-green, .b-purple, .jb-red, .jb-yellow, .jb-blue, .jb-green, .jb-purple {\n    color: #fff;\n    background: var(--this-bg);\n    --this-color: #fff\n  }\n\n  .jb-red, .jb-yellow, .jb-blue, .jb-green, .jb-purple {\n    border: none\n  }\n\n  .b-theme {\n    --this-bg: var(--focus-color)\n  }\n\n  .b-red {\n    --this-bg: #ff5473\n  }\n\n  .b-yellow {\n    --this-bg: #ff6f06\n  }\n\n  .b-blue {\n    --this-bg: #2997f7\n  }\n\n  .b-green {\n    --this-bg: #12b928\n  }\n\n  .b-purple {\n    --this-bg: #d448f5\n  }\n\n  .c-red, .c-yellow, .c-blue, .c-green, .c-purple {\n    color: var(--this-color)\n  }\n\n  .c-red {\n    --this-color: #ff5473;\n    --this-bg: rgba(255, 84, 115, .1)\n  }\n\n  .c-yellow {\n    --this-color: #ff6f06;\n    --this-bg: rgba(255, 111, 6, 0.1)\n  }\n\n  .c-blue {\n    --this-color: #2997f7;\n    --this-bg: rgba(41, 151, 247, .1)\n  }\n\n  .c-green {\n    --this-color: #12b928;\n    --this-bg: rgba(18, 185, 40, .1)\n  }\n\n  .c-purple {\n    --this-color: #d448f5;\n    --this-bg: rgba(213, 72, 245, 0.1)\n  }\n\n  .hide-box {\n    display: none\n  }\n\n  .hide {\n    display: none !important\n  }\n\n  .flex {\n    display: flex\n  }\n\n  .flex.ac {\n    align-items: center\n  }\n\n  .flex.jsb {\n    justify-content: space-between\n  }\n\n  .shrink-0 {\n    flex-shrink: 0\n  }\n\n  .card-box {\n    background: rgba(255, 255, 255, 0.5);\n    border-radius: 4px;\n    padding: 6px 15px\n  }\n\n  .backup-box {\n    max-height: 350px;\n    overflow-y: auto;\n    max-width: 600px;\n    font-size: 13px\n  }\n\n  .backup-box .backup-item {\n    border-bottom: 1px solid rgba(0, 0, 0, 0.04);\n    padding: 5px 0\n  }\n\n  .backup-box .backup-item:last-of-type {\n    border-bottom: unset\n  }\n\n  .backup-item .item-left > div {\n    display: inline-block;\n    margin-right: 6px\n  }\n\n  .backup-box .but {\n    font-size: 13px;\n    padding: 1px 10px\n  }\n\n  @media (min-width: 783px) {\n    .csf-field.compact:not(.min) > .csf-title > h4 {\n      margin-left: 15px;\n      color: #343537\n    }\n  }\n  @media (max-width: 782px) {\n    .csf-image-preview img {\n      max-height: 50px\n    }\n    .csf-options {\n      margin-right: 10px\n    }\n    .csf-after-text {\n      word-wrap: break-word\n    }\n  }\n\n  .text-help {\n    color: #ad8a43\n  }\n\n  .text-help:link {\n    text-decoration: none\n  }\n\n  .text-help:active {\n    text-decoration: none\n  }\n\n  .text-help:hover {\n    text-decoration: none;\n    color: #fdce75\n  }\n\n  .csf-field.io-horizontal .csf-title {\n    position: relative !important;\n    width: 20% !important;\n    float: left !important\n  }\n\n  .csf-field.io-horizontal .csf-fieldset {\n    float: right !important;\n    width: calc(80% - 20px) !important\n  }\n}"
  },
  {
    "path": "配套插件/BsCore/assets/js/IndexNowViewScript.js",
    "content": "var uuid = uuidv4.call().split('-').join('');\nvar guid = document.getElementsByClassName(\"guid\");\nfunction handleGenerate() {\n    uuid = uuidv4.call().split('-').join('');\n    for (var i = 0; i < guid.length; i++) {\n        var processedGuid = uuid\n            .split('')\n            .map(tranformGuidText)\n            .join('');\n        guid[i].innerHTML = `${processedGuid}`;\n    }\n    var keys = document.getElementsByClassName(\"key\");\n    for (var i = 0; i < keys.length; i++) {\n        keys[i].innerHTML = uuid;\n    }\n\n    setUrlHref();\n}\n\nfunction tranformGuidText(character) {\n    if (character >= '0' && character <= '9') {\n        return `<text class=\"blue\">${character}</text>`;\n    } else {\n        return `<text class=\"black\">${character}</text>`;\n    }\n}\n\n\n\nvar downloadIcon = document.getElementById(\"download-icon\");\ndownloadIcon.addEventListener(\"click\", function () {\n    var downloadMessage = \"确认是否下载IndexNow密钥到本地?\";\n    if (confirm(downloadMessage)) {\n        var filename = uuid + \".txt\";\n        var text = uuid;\n        download(filename, text);\n    }\n})\n\nfunction download(filename, text) {\n    var element = document.createElement('a');\n    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n    element.setAttribute('download', filename);\n\n    element.style.display = 'none';\n    document.body.appendChild(element);\n\n    element.click();\n\n    document.body.removeChild(element);\n}\n\nfunction setUrlHref() {\n    var urlWithKeys = document.getElementsByClassName(\"has-key\");\n    for (var i = 0; i < urlWithKeys.length; i++) {\n        urlWithKeys[i].href = urlWithKeys[i].innerText;\n    }\n}\n\nhandleGenerate();\n\n\nlet accordion = document.getElementsByClassName(\"custom-accordion-header\");\nfor (let i = 0; i < accordion.length; i++) {\n    accordion[i].addEventListener(\"click\", () => {\n        if (accordion[i].classList.contains(\"show\")) {\n            accordion[i].classList.remove(\"show\");\n        } else {\n            accordion[i].classList.add(\"show\");\n        }\n\n        let accordionBody = accordion[i].nextElementSibling;\n        if (accordionBody.classList.contains(\"d-none\")) {\n            accordionBody.classList.remove(\"d-none\");\n        } else {\n            accordionBody.classList.add(\"d-none\");\n        }\n    });\n}\n\nfunction toggleHamburger() {\n    var mobileMenuList = document.getElementById(\"mobileMenu\");\n    if (mobileMenuList.classList.contains(\"d-none\")) {\n        mobileMenuList.classList.remove(\"d-none\");\n    } else {\n        mobileMenuList.classList.add(\"d-none\");\n    }\n}\n\nfunction redirectToIndexNowFaq() {\n    var faqUrl = \"https://www.indexnow.org/faq\"\n    window.location.assign(faqUrl);\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/backend.js",
    "content": "$(function() {\n  getwaitingdata();\n  getapproveddata();\n  getrejectdata();\n$('#getLskyToken').on('click',function(){\n        const extensionId = $(this).attr('data-id');\n        layer.confirm('是否确认获取Token？注意：本主题不会保存您的账号密码信息，仅用于向站点发送以获取Token', {\n  btn: ['确认获取','取消'],\n  title:'获取LskyPro Token',\n}, function(){\n    layer.prompt({title: '填写LskyPro 账号', formType: 3}, function(username, index){\n        layer.close(index);\n        layer.prompt({title: '填写LskyPro 密码', formType: 1}, function(password, index){\n            layer.close(index);\n    layer.msg('正在获取Token，请勿刷新', {icon: 1});\n    layer.msg('Token获取中...', {\n  icon: 16\n  ,shade: 0.01,\n  time: 9999999\n});\n    $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: siteUrl+\"index.php/bUserAction\",\n                        data: {\n                            \"type\": 'getLskyProToken',\n                            \"lskypro_username\":username,\n                            \"lskypro_password\":password,\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\n                             if(json.code == 0){\n                             layer.msg(json.msg, {icon: 2});\n                             }\n                             else if(json.code == 1){\n                                 $('input[name=\"bearsimple[lskypro_token]\"]').val(json.msg);\n                             layer.msg(\"Token获取完毕，已自动填入。\", {icon: 1});  \n                             }\n                             else{\n                             layer.msg('操作出错', {icon: 2});    \n                             }\n                        },\n                        error: function() {\n                            layer.msg('操作出错，请稍后再试', {icon: 2});    \n                        }\n                    });\n        });\n    });\n  \n});\n    });\n    \n$('#rebuildCron').on('click',function(){\n        const extensionId = $(this).attr('data-id');\n        layer.confirm('当自动检查任务执行失败时可尝试重建此表，是否确认重建？', {\n  btn: ['确认重建','取消'],\n  title:'重建扩展表',\n}, function(){\n    layer.msg('正在重建计划任务表，请勿刷新', {icon: 1});\n    layer.msg('计划任务表重建中...', {\n  icon: 16\n  ,shade: 0.01,\n  time: 9999999\n});\n    $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: siteUrl+\"index.php/bsBackendAction\",\n                        data: {\n                            \"type\": 'rebuildCron'\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                             json = JSON.parse(data);\n                             if(json.code == 0){\n                             layer.msg(json.message, {icon: 2});\n                             }\n                             else if(json.code == 1){\n                             layer.msg(json.message, {icon: 1});  \n                             }\n                             else{\n                             layer.msg('重建中出现错误，请稍后再试', {icon: 2});    \n                             }\n                        },\n                        error: function() {\n                            layer.msg('重建中出现错误，请稍后再试', {icon: 2});    \n                        }\n                    });\n  \n});\n    });\n    \n\n\n$('#fixTable').on('click',function(){\n        const extensionId = $(this).attr('data-id');\n        layer.confirm('若使用微信公众号的朋友圈模式无法正常发表朋友圈，可尝试修复数据表，是否确认修复？', {\n  btn: ['确认修复','取消'],\n  title:'修复数据表',\n}, function(){\n    layer.msg('正在修复数据表，请勿刷新', {icon: 1});\n    layer.msg('数据表修复中...', {\n  icon: 16\n  ,shade: 0.01,\n  time: 9999999\n});\n    $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: siteUrl+\"index.php/bsBackendAction\",\n                        data: {\n                            \"type\": 'fixTable'\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                             json = JSON.parse(data);\n                             if(json.code == 0){\n                             layer.msg(json.message, {icon: 2});\n                             }\n                             else if(json.code == 1){\n                             layer.msg(json.message, {icon: 1});  \n                             }\n                             else{\n                             layer.msg('修复中出现错误，请稍后再试', {icon: 2});    \n                             }\n                        },\n                        error: function() {\n                            layer.msg('修复中出现错误，请稍后再试', {icon: 2});    \n                        }\n                    });\n  \n});\n    });\n    \n    \n});\n function isbMobile () {\n    let isMobile = false;\n    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))) {\n        isMobile = true;\n    }\n    if (document.body.clientWidth < 800) {\n        isMobile = true;\n    }\n    return isMobile\n}\n\n $(function(){\n        \n        $(\"#driver_open\").on('click',function(){\n            if(isbMobile() == true){\n                toastr.warning(\"抱歉，功能引导不支持手机端，请在电脑端查看\");\n                return false;\n            }\n        const driver = window.driver.js.driver;\n\nconst driverObj = driver({\n    nextBtnText: '前进',\n  prevBtnText: '后退',\n  doneBtnText: '✕',\n  showProgress: true,\n  popoverClass: \"driverjs-theme\",\n   allowKeyboardControl: true,\n  steps: [\n      { element: '#wpwrap', popover: { title: '欢迎来到BearSimple主题控制中心😄', description: '接下来由我来引导您熟悉主题的各项功能，点击区域外或者本框右上角的X按钮可退出引导并不再显示。', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(1)', popover: { title: '这里是使用说明', description: '使用主题前请先注意看使用说明，像申请站点展示、获取邀请码等都在这里', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(2)', popover: { title: '这里是基础设置', description: '基础设置中包含站点LOGO、Favicon图标以及一些全局性的设置', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(3)', popover: { title: '这里是首页及分类', description: '这里包含文章置顶、分类加密等功能', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(4)', popover: { title: '这里是顶部设置', description: '像要对导航栏进行设置或要添加顶部自定义代码都是在这里完成', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(5)', popover: { title: '这里是底部设置', description: '在这里对网站底部进行设置，如添加ICP备案和公安备案以及添加底部自定义代码等', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(6)', popover: { title: '这里是幻灯片设置', description: '您可以在这里添加幻灯片，会在导航栏下边显示', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(7)', popover: { title: '这里是公告栏设置', description: '您可以在这里添加网站公告，如网站维护等，访客可以在访问网站时看到', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(8)', popover: { title: '这里是友链设置', description: '这个应该就不需要多说了吧🤔，友链相关的功能设置都在这里', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(9)', popover: { title: '这里是加载设置', description: '加载设置中包含Pjax、图片懒加载、HTML压缩等功能', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(10)', popover: { title: '这里是行为验证', description: '行为验证支持了对网站评论、友链提交等进行验证，支持了多种行为验证方式', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(11)', popover: { title: '这里是存储设置', description: '通过存储设置您可以将腾讯云COS、阿里云OSS等作为网站的存储方式', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(12)', popover: { title: '这里是缓存设置', description: '通过缓存设置可以加快您的站点访问速度，支持了多种缓存方式', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(13)', popover: { title: '这里是SEO管理', description: 'SEO管理中集成了Sitemap地图生成、收录推送等功能，方便您更快更有效率的优化网站SEO', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(14)', popover: { title: '这里是模块管理', description: '这里包含了文章优化、Memos、微语等多个模块，一些独立页面的创建过程也需要这里的参与', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(15)', popover: { title: '这里是用户中心设置', description: '本主题的用户中心目前包含了投稿、发动态等功能，可以通过本设置对用户中心进行设置与管理', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(16)', popover: { title: '这里是打赏设置', description: '您可以在这里添加打赏方式，它将显示在文章页面', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(17)', popover: { title: '这里是评论设置', description: '评论设置中可以操作电邮通知、评论过滤等功能，便于您对网站的评论进行统一管理', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(18)', popover: { title: '这里是SMTP设置', description: 'SMTP设置统一控制了网站的电邮通知通道，所有电邮通知都需要这里进行配合参与，若要用到需进行电邮通知的功能，都请先在这里填写好相关信息', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(19)', popover: { title: '这里是文章设置', description: '您可以在这里对文章组件进行设置，如第三方分享、文章目录树等功能也是在这里哦', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(20)', popover: { title: '这里是图片设置', description: '图片设置主要对网站图片进行控制，如添加水印等', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(21)', popover: { title: '这里是海报设置', description: '您可以通过该功能开启文章海报分享，访客可以保存海报分享给别人', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(22)', popover: { title: '这里是区块设置', description: '区块设置中包含了对侧边栏和广告等区块的管理', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(23)', popover: { title: '这里是博主信息设置', description: '您可以在这里添加您的个人信息，便于访客能够进一步认识您', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(24)', popover: { title: '这里是其他设置', description: '其他设置中包含了日夜切换、语言切换等功能，若在其他地方没找到的功能不妨来这里找找', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(25)', popover: { title: '这里是实验室', description: '实验室主要包含仍处于实验阶段或仍会进行大幅度调整的功能', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(26)', popover: { title: '这里是短代码', description: '您可以通过这里了解目前主题支持的所有短代码', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(27)', popover: { title: '这里是数据备份', description: '在进行升级操作或其他关键性操作时可先通过数据备份将备份文件下载到本地，防止因一些意外状况导致主题设置丢失', side: \"left\", align: 'start' }},\n    { element: '#wpwrap li:nth-child(28)', popover: { title: '这里是在线升级', description: '您可以通过这里对主题进行在线升级操作，免去一些繁琐性操作', side: \"left\", align: 'start' }},\n    { popover: { title: '功能引导已完成🥰', description: '您现在可以关闭引导框或者点击后退按钮重新进行引导' } }\n  ],\n  onDestroyStarted: () => {\n    if (!driverObj.hasNextStep() || confirm(\"确定退出功能引导?\")) {\n        localStorage.setItem('driver','true');\n      driverObj.destroy();\n    }\n  },\n});\n\ndriverObj.drive();\n});\n});\n\n\n\n\n\n  $(\"#linksearch\").bind(\"input propertychange\",function(event){\n       getsearchdata($(\"#linksearch\").val());\n});\n$(\"#usersearch\").bind(\"input propertychange\",function(event){\n       getsearchuserdata($(\"#usersearch\").val());\n});\n$(document).delegate(\".ui.gray.icon.label.delete\", \"click\", function() {\n  $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfriendaction\",\n                        data: {\n                            \"type\": 'delete',\n                            \"linkid\":$(this).attr('data-id')\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\ntoastr.success('该友链已成功删除');\ngetwaitingdata();\n  getapproveddata();\n  getrejectdata();\n  getsearchdata($(\"#linksearch\").val());\n                        },\n                        complete: function() {\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n\n});\n$(document).delegate(\"#createlink\", \"click\", function() {\nlayer.open({\n    type: 1 \n    ,btn:[\"确定新增\",\"取消新增\"]\n    ,title: '新增友链'\n    ,skin: 'layui-layer-prompt'\n    ,content: \"<div style='margin:-10px 0 10px 0'>友链名称</div><div><input id='friendname' type='text' class='layui-layer-input' value='' placeholder='友链名称'></div><div style='margin:10px 0 10px 0'>友链网址</div><div><input style='margin-top:10px;' id='friendurl' type='text' class='layui-layer-input' value='' placeholder='友链网址'></div><div style='margin:10px 0 10px 0'>友链图标</div><div><input style='margin-top:10px;' id='friendpic' type='text' class='layui-layer-input' value='' placeholder='友链图标'></div><div style='margin:10px 0 10px 0'>友链描述</div><div><input style='margin-top:10px;' id='frienddec' type='text' class='layui-layer-input' value='' placeholder='友链描述'></div><div style='margin:10px 0 10px 0'>联系邮箱</div><div><input style='margin-top:10px;' id='contactmail' type='text' class='layui-layer-input' value='' placeholder='联系邮箱，可为空'></div><div style='margin:10px 0 10px 0'>该站点的友链放置页面网址</div><div><input style='margin-top:10px;' id='checkurl' type='text' class='layui-layer-input' value='' placeholder='该站点的友链放置页面网址'></div><div style='margin:10px 0 10px 0'>友链添加至</div><div><select name='addtype' id='addtype'><option value='waiting' select=''>待审核</option><option value='approved'>已通过</option><option value='reject'>已驳回</option></select></div>\"\n    ,yes: function(index, callback){\n        if(!$(callback).find(\"#friendname\").val()){\n            layer.msg('友链名称不能为空哦~');\n            return false;\n        }\n        if(!$(callback).find(\"#friendurl\").val()){\n            layer.msg('友链网址不能为空哦~');\n            return false;\n        }\n        if(!$(callback).find(\"#friendpic\").val()){\n            layer.msg('友链图标不能为空哦~');\n            return false;\n        }\n        if(!$(callback).find(\"#frienddec\").val()){\n            layer.msg('友链描述不能为空哦~');\n            return false;\n        }\n      $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfriendaction\",\n                        data: {\n                            \"type\": 'add',\n                            \"addtype\": $(callback).find(\"#addtype\").val(),\n                            \"friendname\":$(callback).find(\"#friendname\").val(),\n                            \"friendurl\":$(callback).find(\"#friendurl\").val(),\n                            \"friendpic\":$(callback).find(\"#friendpic\").val(),\n                            \"frienddec\":$(callback).find(\"#frienddec\").val(),\n                            \"contactmail\":$(callback).find(\"#contactmail\").val(),\n                            \"checkurl\":$(callback).find(\"#checkurl\").val()\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\ntoastr.success('友链已成功新增，友链列表已自动刷新。');\nlayer.closeAll();\ngetwaitingdata();\n  getapproveddata();\n  getrejectdata();\n  getsearchdata($(\"#linksearch\").val());\n                        },\n                        complete: function() {\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n                    \n    }\n});\n});\n\n$(document).delegate(\".ui.yellow.icon.label.edit\", \"click\", function() {\n    if ($(this).data('checkurl') === undefined || $(this).data('checkurl') === \"\") {\n    $(this).data('checkurl', '暂无');\n}\nlayer.open({\n    type: 1 \n    ,btn:[\"确定修改\",\"取消修改\"]\n    ,title: '修改友链'\n    ,skin: 'layui-layer-prompt'\n    ,content: \"<div style='margin:-10px 0 10px 0'>友链ID</div><div><input id='friendid' type='text' class='layui-layer-input' value=\"+$(this).attr('data-id')+\" placeholder='友链ID' disabled></div><div style='margin:10px 0 10px 0'>友链网址</div><div><input style='margin-top:10px;' id='friendurl' type='text' class='layui-layer-input' value=\"+$(this).attr('data-friendurl')+\" placeholder='友链网址'></div><div style='margin:10px 0 10px 0'>友链名称</div><div><textarea style='width:100%' id='friendname' type='text' class='layui-layer-textarea' placeholder='友链名称'>\"+$(this).attr('data-friendname')+\"</textarea></div><div style='margin:10px 0 10px 0'>友链图标</div><div><input style='margin-top:10px;' id='friendpic' type='text' class='layui-layer-input' value=\"+$(this).attr('data-friendpic')+\" placeholder='友链图标'></div><div style='margin:10px 0 10px 0'>友链描述</div><div><input style='margin-top:10px;' id='frienddec' type='text' class='layui-layer-input' value=\"+$(this).attr('data-frienddec')+\" placeholder='友链描述'></div><div style='margin:10px 0 10px 0'>联系邮箱</div><div><input style='margin-top:10px;' id='contactmail' type='text' class='layui-layer-input' value=\"+$(this).attr('data-mail')+\" placeholder='联系邮箱'></div><div style='margin:10px 0 10px 0'>该站点的友链放置页面网址</div><div><input style='margin-top:10px;' id='checkurl' type='text' class='layui-layer-input' value=\"+$(this).data('checkurl')+\" placeholder='该站点的友链放置页面网址'></div><div style='margin:10px 0 10px 0'>友链状态</div><div><input style='margin-top:10px;' id='status' type='text' class='layui-layer-input' value=\"+$(this).attr('data-status')+\" placeholder='友链状态' disabled></div><div style='margin:10px 0 10px 0'>驳回原因</div><div><textarea style='width:100%' id='rejectreason' class='layui-layer-textarea'  placeholder='在友链为已驳回状态时可在此项填写驳回原因'>\"+$(this).attr('data-rejectreason')+\"</textarea></div>\"\n    ,yes: function(index, callback){\n        if(!$(callback).find(\"#friendname\").val()){\n            layer.msg('友链名称不能为空哦~');\n            return false;\n        }\n        if(!$(callback).find(\"#friendurl\").val()){\n            layer.msg('友链网址不能为空哦~');\n            return false;\n        }\n        if(!$(callback).find(\"#friendpic\").val()){\n            layer.msg('友链图标不能为空哦~');\n            return false;\n        }\n        if(!$(callback).find(\"#frienddec\").val()){\n            layer.msg('友链描述不能为空哦~');\n            return false;\n        }\n      $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfriendaction\",\n                        data: {\n                            \"type\": 'edit',\n                            \"id\":$(callback).find(\"#friendid\").val(),\n                            \"friendname\":$(callback).find(\"#friendname\").val(),\n                            \"friendurl\":$(callback).find(\"#friendurl\").val(),\n                            \"friendpic\":$(callback).find(\"#friendpic\").val(),\n                            \"frienddec\":$(callback).find(\"#frienddec\").val(),\n                            \"contactmail\":$(callback).find(\"#contactmail\").val(),\n                            \"checkurl\":$(callback).find(\"#checkurl\").val(),\n                            \"rejectreason\":$(callback).find(\"#rejectreason\").val(),\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\ntoastr.success('ID为'+$(callback).find(\"#friendid\").val()+'的友链已修改成功。');\nlayer.closeAll();\ngetwaitingdata();\n  getapproveddata();\n  getrejectdata();\n  getsearchdata($(\"#linksearch\").val());\n                        },\n                        complete: function() {\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n                    \n    }\n});\n});\n\n\n\n$(document).delegate(\".ui.blue.icon.label.approved\", \"click\", function() {\n    var loading = layer.load(2);\n    $(this).css(\"pointer-events\",\"none\");\n    $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfriendaction\",\n                        data: {\n                            \"type\": 'approved',\n                            \"linkid\":$(this).attr('data-id'),\n                            \"linkmail\":$(this).attr('data-mail'),\n                            \"linkname\":$(this).attr('data-friendname')\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            layer.close(loading);\n                            $(\".ui.blue.icon.label.approved\").css(\"pointer-events\",\"auto\");\n                            json = JSON.parse(data);\ntoastr.success('该友链已批准，已将其加入友链列表。');\ngetwaitingdata();\n  getapproveddata();\n  getrejectdata();\n                        },\n                        complete: function() {\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n    \n});\n\n$(document).delegate(\".ui.blue.icon.label.approved2\", \"click\", function() {\n    var loading = layer.load(2);\n    $(this).css(\"pointer-events\",\"none\");\n    $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfriendaction\",\n                        data: {\n                            \"type\": 'approved',\n                            \"linkid\":$(this).attr('data-id'),\n                            //\"linkmail\":$(this).attr('data-mail')\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            layer.close(loading);\n                            $(\".ui.blue.icon.label.approved2\").css(\"pointer-events\",\"auto\");\n                            json = JSON.parse(data);\ntoastr.success('该友链已重新获得批准，已将其加入友链列表。');\ngetwaitingdata();\n  getapproveddata();\n  getrejectdata();\n                        },\n                        complete: function() {\n                            \n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n    \n});\n\n$(document).delegate(\".ui.red.icon.label.reject\", \"click\", function() {\n    var loading = layer.load(2);\n    $(this).css(\"pointer-events\",\"none\");\n    $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfriendaction\",\n                        data: {\n                            \"type\": 'reject',\n                            \"linkid\":$(this).attr('data-id'),\n                            \"linkmail\":$(this).attr('data-mail'),\n                            \"linkname\":$(this).attr('data-friendname')\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            layer.close(loading);\n                            $(\".ui.red.icon.label.reject\").css(\"pointer-events\",\"auto\");\n                            json = JSON.parse(data);\ntoastr.success('该友链已驳回，已将其加入已驳回列表，可在已驳回列表中重新审核。');\ngetwaitingdata();\n  getapproveddata();\n  getrejectdata();\n                        },\n                        complete: function() {\n                            \n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n});\n\n$(document).delegate(\".ui.red.icon.label.reject2\", \"click\", function() {\n    var loading = layer.load(2);\n    $(this).css(\"pointer-events\",\"none\");\n    $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfriendaction\",\n                        data: {\n                            \"type\": 'reject',\n                            \"linkid\":$(this).attr('data-id'),\n                           // \"linkmail\":$(this).attr('data-mail')\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            layer.close(loading);\n                            $(\".ui.red.icon.label.reject2\").css(\"pointer-events\",\"auto\");\n                            json = JSON.parse(data);\ntoastr.success('该友链已重新驳回，已将其加入已驳回列表，可在已驳回列表中重新审核。');\ngetwaitingdata();\n  getapproveddata();\n  getrejectdata();\n                        },\n                        complete: function() {\n                            \n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n});\n\n//获取已经审批通过的友链数据\nvar approvedpage = 1;\n                var approvedn = 0;\n                var approvedmax = 1;\nfunction getapproveddata(){\n     $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfrienddata\",\n                        data: {\n                            \"type\": 'approved',\n                            \"page\": approvedpage\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\nif(json.list == ''){\n    approvedn = json.total;\n                            approvedmax = json.max;\n                                var strs = \" \";\n                                strs += '<tr></tr>'\n                                $(\"#approvedfl\").html(strs);\n                            }\n                            else{\n                                approvedn = json.total;\n                            approvedmax = json.max;\ncontent2(json.list);\n}\n\n                        },\n                        complete: function() {\n                            pageList();\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n                    function pageList() {\n                    approvedpage = Math.min(approvedpage, approvedmax);\n                    approvedpage = Math.max(approvedpage, 1);\n                    var html = \"<center><div class=\\\"ui circular labels\\\"><a class=\\\"ui label\\\" data-page=\"+ approvedpage +\">共\" + approvedn + \"条</a><a class=\\\"ui label\\\" data-page=\"+ approvedpage +\">第\" + approvedpage + \"/\" + approvedmax + \"页</a>\";\n                    html += '<a class=\\\"ui label\\\"  data-page=\"1\">首页</a>';\n                    html += (approvedpage > 1) ? '<a class=\\\"ui label\\\"  data-page=\"' + (approvedpage - 1) + '\">上一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"1\">上一页</a>';\n                    html += (approvedpage < approvedmax) ? '<a class=\\\"ui label\\\"  data-page=\"' + (approvedpage + 1) + '\">下一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"' + approvedmax + '\">下一页</a>';\n                    html += '<a class=\\\"ui label\\\"  data-page=\"' + approvedmax + '\">尾页</a><div class=\\\"ui mini input\\\"><input id=\\\"dipage\\\" type=\\\"number\\\" placeholder=\\\"输入跳转的页码\\\"></div><a id=\\\"gopage\\\" class=\\\"ui label\\\" >跳转到指定页</a></div></center>';\n                    var $html = $(html);\n                    \n                    $html.find(\"a\").click(function() {\n                        if($(this).attr(\"id\")!=='gopage'){\n                        approvedpage = $(this).attr(\"data-page\");\n                        }\n                        else{\n                            var dipage = document.getElementById(\"dipage\").value;\n                            switch(dipage){\n                            case dipage < 1 :\n                                approvedpage = 1;\n                            break;\n                            case dipage > approvedmax:\n                                approvedpage = approvedmax;\n                            break;\n                            default:\n                            approvedpage = dipage;\n                        };\n                        };\n                        getapproveddata();\n                    });\n                    \n                    \n                    $(\".approvedpagelist\").html($html);\n                }\n                \n                \n     function content2(lists) {\n                    var str2 = \" \";\n                    for(var i in lists) {\nif(lists[i]['status'] == 'approved'){\n    lists[i]['status'] = '已通过';\n}\nif(lists[i]['contactmail'] == null){\n    lists[i]['contactmail'] = '无';\n}\nstr2 += '<tr><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + lists[i]['friendname'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + lists[i]['friendurl'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + lists[i]['friendpic'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + lists[i]['frienddec'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + lists[i]['contactmail'] + '</font></font></td><td>' + lists[i]['status'] + '</td><td><div class=\"ui red icon label reject2\"  data-mail=\"' + lists[i]['contactmail'] + '\"data-id=\"' + lists[i]['id'] + '\"><i class=\"ban icon\"></i></div><div class=\"ui yellow icon label edit\"  style=\"margin-top:5px\" data-mail=\"' + lists[i]['contactmail'] + '\" data-id=\"' + lists[i]['id'] + '\" data-friendname=\"' + lists[i]['friendname'] + '\" data-friendurl=\"' + lists[i]['friendurl'] + '\" data-friendpic=\"' + lists[i]['friendpic'] + '\" data-frienddec=\"' + lists[i]['frienddec'] + '\" data-checkurl=\"' + lists[i]['checkurl'] + '\" data-status=\"' + lists[i]['status'] + '\" data-rejectreason=\"' + lists[i]['rejectreason'] + '\"><i class=\"edit icon\"></i></div><div class=\"ui black icon label check\" style=\"margin-top:5px\"  data-id=\"' + lists[i]['id'] + '\"  data-checkurl=\"' + lists[i]['checkurl'] + '\"  data-friendurl=\"' + lists[i]['friendurl'] + '\"  data-friendname=\"' + lists[i]['friendname'] + '\" data-mail=\"' + lists[i]['contactmail'] + '\"><i class=\"wrench icon\"></i></div><div class=\"ui gray icon label delete\" style=\"margin-top:5px\"  data-id=\"' + lists[i]['id'] + '\"><i class=\"trash icon\"></i></div></td></tr>'\n$(\"#approvedfl\").html(str2);\n}\n}\n}\n\n//获取审核中的友链数据\nvar waitingpage = 1;\n                var waitingn = 0;\n                var waitingmax = 1;\nfunction getwaitingdata(){\n    \n\n\n    $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfrienddata\",\n                        data: {\n                            \"type\": 'waiting',\n                            \"page\":waitingpage\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\n                            if(json.list == ''){\n                                waitingn = json.total;\n                            waitingmax = json.max;\n                                var strs = \" \";\n                                strs += '<tr></tr>'\n                                $(\"#waitingfl\").html(strs);\n                            }\n                            else{\n                                waitingn = json.total;\n                            waitingmax = json.max;\ncontent(json.list);\n}\n                        },\n                        complete: function() {\n                            pageList();\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    function pageList() {\n                    waitingpage = Math.min(waitingpage, waitingmax);\n                    waitingpage = Math.max(waitingpage, 1);\n                    var html = \"<center><div class=\\\"ui circular labels\\\"><a class=\\\"ui label\\\" data-page=\"+ waitingpage +\">共\" + waitingn + \"条</a><a class=\\\"ui label\\\" data-page=\"+ waitingpage +\">第\" + waitingpage + \"/\" + waitingmax + \"页</a>\";\n                    html += '<a class=\\\"ui label\\\"  data-page=\"1\">首页</a>';\n                    html += (waitingpage > 1) ? '<a class=\\\"ui label\\\"  data-page=\"' + (waitingpage - 1) + '\">上一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"1\">上一页</a>';\n                    html += (waitingpage < waitingmax) ? '<a class=\\\"ui label\\\"  data-page=\"' + (waitingpage + 1) + '\">下一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"' + waitingmax + '\">下一页</a>';\n                    html += '<a class=\\\"ui label\\\"  data-page=\"' + waitingmax + '\">尾页</a><div class=\\\"ui mini input\\\"><input id=\\\"dipage\\\" type=\\\"number\\\" placeholder=\\\"输入跳转的页码\\\"></div><a id=\\\"gopage\\\" class=\\\"ui label\\\" >跳转到指定页</a></div></center>';\n                    var $html = $(html);\n                    \n                    $html.find(\"a\").click(function() {\n                        if($(this).attr(\"id\")!=='gopage'){\n                        waitingpage = $(this).attr(\"data-page\");\n                        }\n                        else{\n                            var dipage = document.getElementById(\"dipage\").value;\n                            switch(dipage){\n                            case dipage < 1 :\n                                waitingpage = 1;\n                            break;\n                            case dipage > waitingmax:\n                                waitingpage = waitingmax;\n                            break;\n                            default:\n                            waitingpage = dipage;\n                        };\n                        };\n                        getwaitingdata();\n                    });\n                    \n                    \n                    $(\".waitingpagelist\").html($html);\n                }\n     function content(list) {\n                    var str = \" \";\n                    for(var i in list) {\nif(list[i]['status'] == 'waiting'){\n    list[i]['status'] = '待审核';\n}\nif(list[i]['contactmail'] == null){\n    list[i]['contactmail'] = '无';\n}\n\nstr += '<tr><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + list[i]['friendname'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + list[i]['friendurl'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + list[i]['friendpic'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + list[i]['frienddec'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + list[i]['contactmail'] + '</font></font></td><td>' + list[i]['status'] + '</td><td><div class=\"ui labels\"><div class=\"ui blue icon label approved\"  data-mail=\"' + list[i]['contactmail'] + '\" data-id=\"' + list[i]['id'] + '\" data-friendname=\"' + list[i]['friendname'] + '\"><i class=\"check icon\"></i></div><div class=\"ui red icon label reject\"  data-mail=\"' + list[i]['contactmail'] + '\" data-id=\"' + list[i]['id'] + '\" data-friendname=\"' + list[i]['friendname'] + '\"><i class=\"ban icon\"></i></div><div class=\"ui yellow icon label edit\"  style=\"display:inline;\" data-mail=\"' + list[i]['contactmail'] + '\" data-id=\"' + list[i]['id'] + '\" data-friendname=\"' + list[i]['friendname'] + '\" data-friendurl=\"' + list[i]['friendurl'] + '\" data-friendpic=\"' + list[i]['friendpic'] + '\" data-frienddec=\"' + list[i]['frienddec'] + '\" data-checkurl=\"' + list[i]['checkurl'] + '\" data-status=\"' + list[i]['status'] + '\" data-rejectreason=\"' + list[i]['rejectreason'] + '\"><i class=\"edit icon\"></i></div><div class=\"ui black icon label check\" style=\"margin-top:5px\"  data-id=\"' + list[i]['id'] + '\"  data-checkurl=\"' + list[i]['checkurl'] + '\"  data-friendurl=\"' + list[i]['friendurl'] + '\"  data-friendname=\"' + list[i]['friendname'] + '\" data-mail=\"' + list[i]['contactmail'] + '\"><i class=\"wrench icon\"></i></div><div class=\"ui gray icon label delete\" style=\"margin-top:10px\"  data-id=\"' + list[i]['id'] + '\"><i class=\"trash icon\"></i></div></div></td></tr>'\n$(\"#waitingfl\").html(str);\n\n}\n}\n}\n\n//获取已驳回的友链数据\nvar rejectpage = 1;\n                var rejectn = 0;\n                var rejectmax = 1;\nfunction getrejectdata(){\n     $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfrienddata\",\n                        data: {\n                            \"type\": 'reject',\n                            \"page\":rejectpage\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\nif(json.list == ''){\n    rejectn = json.total;\n                            rejectmax = json.max;\n                                var strs = \" \";\n                                strs += '<tr></tr>'\n                                $(\"#rejectfl\").html(strs);\n                            }\n                            else{\n                                rejectn = json.total;\n                            rejectmax = json.max;\ncontent3(json.list);\n}\n                        },\n                        complete: function() {\n                            pageList();\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                     function pageList() {\n                    rejectpage = Math.min(rejectpage, rejectmax);\n                    rejectpage = Math.max(rejectpage, 1);\n                    var html = \"<center><div class=\\\"ui circular labels\\\"><a class=\\\"ui label\\\" data-page=\"+ rejectpage +\">共\" + rejectn + \"条</a><a class=\\\"ui label\\\" data-page=\"+ rejectpage +\">第\" + rejectpage + \"/\" + rejectmax + \"页</a>\";\n                    html += '<a class=\\\"ui label\\\"  data-page=\"1\">首页</a>';\n                    html += (rejectpage > 1) ? '<a class=\\\"ui label\\\"  data-page=\"' + (rejectpage - 1) + '\">上一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"1\">上一页</a>';\n                    html += (rejectpage < rejectmax) ? '<a class=\\\"ui label\\\"  data-page=\"' + (rejectpage + 1) + '\">下一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"' + rejectmax + '\">下一页</a>';\n                    html += '<a class=\\\"ui label\\\"  data-page=\"' + rejectmax + '\">尾页</a><div class=\\\"ui mini input\\\"><input id=\\\"dipage\\\" type=\\\"number\\\" placeholder=\\\"输入跳转的页码\\\"></div><a id=\\\"gopage\\\" class=\\\"ui label\\\" >跳转到指定页</a></div></center>';\n                    var $html = $(html);\n                    \n                    $html.find(\"a\").click(function() {\n                        if($(this).attr(\"id\")!=='gopage'){\n                        rejectpage = $(this).attr(\"data-page\");\n                        }\n                        else{\n                            var dipage = document.getElementById(\"dipage\").value;\n                            switch(dipage){\n                            case dipage < 1 :\n                                rejectpage = 1;\n                            break;\n                            case dipage > rejectmax:\n                                rejectpage = rejectmax;\n                            break;\n                            default:\n                            rejectpage = dipage;\n                        };\n                        };\n                        getrejectdata();\n                    });\n                    \n                    \n                    $(\".rejectpagelist\").html($html);\n                }\n     function content3(listss) {\n                    var str3 = \" \";\n                    for(var i in listss) {\nif(listss[i]['status'] == 'reject'){\n    listss[i]['status'] = '已驳回';\n}\nif(listss[i]['contactmail'] == null){\n    listss[i]['contactmail'] = '无';\n}\nstr3 += '<tr><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listss[i]['friendname'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listss[i]['friendurl'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listss[i]['friendpic'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listss[i]['frienddec'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listss[i]['contactmail'] + '</font></font></td><td>' + listss[i]['status'] + '</td><td><div class=\"ui blue icon label approved2\" data-mail=\"' + listss[i]['contactmail'] + '\"data-id=\"' + listss[i]['id'] + '\"><i class=\"check icon\"></i></div><div class=\"ui yellow icon label edit\"  style=\"margin-top:5px\" data-mail=\"' + listss[i]['contactmail'] + '\" data-id=\"' + listss[i]['id'] + '\" data-friendname=\"' + listss[i]['friendname'] + '\" data-friendurl=\"' + listss[i]['friendurl'] + '\" data-friendpic=\"' + listss[i]['friendpic'] + '\" data-frienddec=\"' + listss[i]['frienddec'] + '\" data-checkurl=\"' + listss[i]['checkurl'] + '\" data-status=\"' + listss[i]['status'] + '\" data-rejectreason=\"' + listss[i]['rejectreason'] + '\"><i class=\"edit icon\"></i></div><div class=\"ui black icon label check\" style=\"margin-top:5px\"  data-id=\"' + listss[i]['id'] + '\"  data-checkurl=\"' + listss[i]['checkurl'] + '\"  data-friendurl=\"' + listss[i]['friendurl'] + '\"  data-friendname=\"' + listss[i]['friendname'] + '\" data-mail=\"' + listss[i]['contactmail'] + '\"><i class=\"wrench icon\"></i></div><div class=\"ui gray icon label delete\" style=\"margin-top:5px\" data-id=\"' + listss[i]['id'] + '\"><i class=\"trash icon\"></i></div></td></tr>'\n$(\"#rejectfl\").html(str3);\n}\n}\n}\n\n//搜索\nvar searchpage = 1;\n                var searchn = 0;\n                var searchmax = 1;\nfunction getsearchdata(val){\n          \n     $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfrienddata\",\n                        data: {\n                            \"type\": 'search',\n                            'searchval':val,\n                            \"page\": searchpage\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\nif(json.list == ''){\n                                var strs = \" \";\n                                strs += '<tr></tr>'\n                                $(\"#search\").html(strs);\n                                searchn = json.total;\n                            searchmax = json.max;\n                            }\n                            else{\n                                searchn = json.total;\n                            searchmax = json.max;\ncontent4(json.list);\n}\n                        },\n                        complete: function() {\n                            searchpageList();\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n              \n    function searchpageList() {\n                    searchpage = Math.min(searchpage, searchmax);\n                    searchpage = Math.max(searchpage, 1);\n                    var html = \"<center><div class=\\\"ui circular labels\\\"><a class=\\\"ui label\\\" data-page=\"+ searchpage +\">共\" + searchn + \"条</a><a class=\\\"ui label\\\" data-page=\"+ searchpage +\">第\" + searchpage + \"/\" + searchmax + \"页</a>\";\n                    html += '<a class=\\\"ui label\\\"  data-page=\"1\">首页</a>';\n                    html += (searchpage > 1) ? '<a class=\\\"ui label\\\"  data-page=\"' + (searchpage - 1) + '\">上一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"1\">上一页</a>';\n                    html += (searchpage < searchmax) ? '<a class=\\\"ui label\\\"  data-page=\"' + (searchpage + 1) + '\">下一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"' + searchmax + '\">下一页</a>';\n                    html += '<a class=\\\"ui label\\\"  data-page=\"' + searchmax + '\">尾页</a><div class=\\\"ui mini input\\\"><input id=\\\"dipage\\\" type=\\\"number\\\" placeholder=\\\"输入跳转的页码\\\"></div><a id=\\\"gopage\\\" class=\\\"ui label\\\" >跳转到指定页</a></div></center>';\n                    var $html = $(html);\n                    \n                    $html.find(\"a\").click(function() {\n                        if($(this).attr(\"id\")!=='gopage'){\n                        searchpage = $(this).attr(\"data-page\");\n                        }\n                        else{\n                            var dipage = document.getElementById(\"dipage\").value;\n                            switch(dipage){\n                            case dipage < 1 :\n                                searchpage = 1;\n                            break;\n                            case dipage > searchmax:\n                                searchpage = searchmax;\n                            break;\n                            default:\n                            searchpage = dipage;\n                        };\n                        };\n                        getsearchdata($(\"#linksearch\").val());\n                    });\n                    \n                    \n                    $(\".searchpagelist\").html($html);\n                }\n                \n     function content4(listsss) {\n                    var str4 = \" \";\n                    for(var i in listsss) {\n\nif(listsss[i]['contactmail'] == null){\n    listsss[i]['contactmail'] = '无';\n}\nif(listsss[i]['status'] == 'reject'){\n    listsss[i]['status'] = '已驳回';\n    str4 += '<tr><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['friendname'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['friendurl'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['friendpic'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['frienddec'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['contactmail'] + '</font></font></td><td>' + listsss[i]['status'] + '</td><td><div class=\"ui blue icon label approved2\" data-mail=\"' + listsss[i]['contactmail'] + '\" data-id=\"' + listsss[i]['id'] + '\"><i class=\"check icon\"></i></div><div class=\"ui yellow icon label edit\"  style=\"margin-top:5px\" data-mail=\"' + listsss[i]['contactmail'] + '\" data-id=\"' + listsss[i]['id'] + '\" data-friendname=\"' + listsss[i]['friendname'] + '\" data-friendurl=\"' + listsss[i]['friendurl'] + '\" data-friendpic=\"' + listsss[i]['friendpic'] + '\" data-frienddec=\"' + listsss[i]['frienddec'] + '\" data-checkurl=\"' + listsss[i]['checkurl'] + '\" data-status=\"' + listsss[i]['status'] + '\" data-rejectreason=\"' + listsss[i]['rejectreason'] + '\"><i class=\"edit icon\"></i></div><div class=\"ui black icon label check\" style=\"margin-top:5px\"  data-id=\"' + listsss[i]['id'] + '\"  data-checkurl=\"' + listsss[i]['checkurl'] + '\"  data-friendurl=\"' + listsss[i]['friendurl'] + '\"  data-friendname=\"' + listsss[i]['friendname'] + '\" data-mail=\"' + listsss[i]['contactmail'] + '\"><i class=\"wrench icon\"></i></div><div class=\"ui gray icon label delete\" style=\"margin-top:5px\" data-id=\"' + listsss[i]['id'] + '\"><i class=\"trash icon\"></i></div></td></tr>'\n}\nif(listsss[i]['status'] == 'waiting'){\n    listsss[i]['status'] = '待审核';\n    str4 += '<tr><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['friendname'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['friendurl'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['friendpic'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['frienddec'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['contactmail'] + '</font></font></td><td>' + listsss[i]['status'] + '</td><td><div class=\"ui labels\"><div class=\"ui blue icon label approved\"  data-mail=\"' + listsss[i]['contactmail'] + '\" data-id=\"' + listsss[i]['id'] + '\"><i class=\"check icon\"></i></div><div class=\"ui red icon label reject\"  data-mail=\"' + listsss[i]['contactmail'] + '\" data-id=\"' + listsss[i]['id'] + '\"><i class=\"ban icon\"></i></div><div class=\"ui yellow icon label edit\"  style=\"display:inline;\" data-mail=\"' + listsss[i]['contactmail'] + '\" data-id=\"' + listsss[i]['id'] + '\" data-friendname=\"' + listsss[i]['friendname'] + '\" data-friendurl=\"' + listsss[i]['friendurl'] + '\" data-friendpic=\"' + listsss[i]['friendpic'] + '\" data-frienddec=\"' + listsss[i]['frienddec'] + '\" data-checkurl=\"' + listsss[i]['checkurl'] + '\" data-status=\"' + listsss[i]['status'] + '\" data-rejectreason=\"' + listsss[i]['rejectreason'] + '\"><i class=\"edit icon\"></i></div><div class=\"ui black icon label check\" style=\"margin-top:5px\"  data-id=\"' + listsss[i]['id'] + '\"  data-checkurl=\"' + listsss[i]['checkurl'] + '\"  data-friendurl=\"' + listsss[i]['friendurl'] + '\"  data-friendname=\"' + listsss[i]['friendname'] + '\" data-mail=\"' + listsss[i]['contactmail'] + '\"><i class=\"wrench icon\"></i></div><div class=\"ui gray icon label delete\" style=\"margin-top:10px\"  data-id=\"' + listsss[i]['id'] + '\"><i class=\"trash icon\"></i></div></div></td></tr>'\n}\nif(listsss[i]['status'] == 'approved'){\n    listsss[i]['status'] = '已通过';\n    str4 += '<tr><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['friendname'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['friendurl'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['friendpic'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['frienddec'] + '</font></font></td><td><font style=\"vertical-align: inherit;\"><font style=\"vertical-align: inherit;\">' + listsss[i]['contactmail'] + '</font></font></td><td>' + listsss[i]['status'] + '</td><td><div class=\"ui red icon label reject2\"  data-mail=\"' + listsss[i]['contactmail'] + '\"data-id=\"' + listsss[i]['id'] + '\"><i class=\"ban icon\"></i></div><div class=\"ui yellow icon label edit\"  style=\"margin-top:5px\" data-mail=\"' + listsss[i]['contactmail'] + '\" data-id=\"' + listsss[i]['id'] + '\" data-friendname=\"' + listsss[i]['friendname'] + '\" data-friendurl=\"' + listsss[i]['friendurl'] + '\" data-friendpic=\"' + listsss[i]['friendpic'] + '\" data-frienddec=\"' + listsss[i]['frienddec'] + '\" data-checkurl=\"' + listsss[i]['checkurl'] + '\" data-status=\"' + listsss[i]['status'] + '\" data-rejectreason=\"' + listsss[i]['rejectreason'] + '\"><i class=\"edit icon\"></i></div><div class=\"ui black icon label check\" style=\"margin-top:5px\"  data-id=\"' + listsss[i]['id'] + '\"  data-checkurl=\"' + listsss[i]['checkurl'] + '\"  data-friendurl=\"' + listsss[i]['friendurl'] + '\"  data-friendname=\"' + listsss[i]['friendname'] + '\" data-mail=\"' + listsss[i]['contactmail'] + '\"><i class=\"wrench icon\"></i></div><div class=\"ui gray icon label delete\" style=\"margin-top:5px\"  data-id=\"' + listsss[i]['id'] + '\"><i class=\"trash icon\"></i></div></td></tr>'\n}\n\n$(\"#search\").html(str4);\n}\n}\n}\n\n\n//用户中心\n$(document).delegate(\"#sendtongzhi\", \"click\", function() {\nlayer.open({\n    type: 1 \n    ,btn:[\"确定发送\",\"取消发送\"]\n    ,title: '发送通知'\n    ,skin: 'layui-layer-prompt'\n    ,content: \"<div style='margin:-10px 0 10px 0' id='token-input-user'>搜索用户</div><div style='margin-left:-10px'><input id='searchUser' name='searchUser' type='text' class='layui-layer-input' ></div><div style='margin:10px 0 10px 0'>通知标题</div><div style='margin-left:-40px'><input style='margin-top:10px;' id='notifytitle' type='text' class='layui-layer-input' value='' placeholder='要发送的通知标题'></div><div style='margin:10px 0 10px 0'>通知内容</div><div><textarea style='margin-top:10px;' id='notifytext'  class='layui-layer-input'  placeholder='要发送的通知内容'></textarea></div><script>$(function(){var users=$('#searchUser'),usersPre=[];if(users.length>0){var items=users.val().split(','),result=[];for(var i=0;i<items.length;i++){var user=items[i];if(!user){continue;}usersPre.push({id:tag,name:tag});}users.tokenInput(document.location.protocol+'/index.php/getUsers',{propertyToSearch:'name',tokenValue:'id',searchDelay:0,preventDuplicates:true,animateDropdown:true,hintText:'请输入用户名',noResultsText:'啊哦~没有任何结果',searchingText:'熊宝正在搜寻中......',prePopulate:usersPre,onResult:function(result,query,val){if(!query){return result;}if(!result){result=[];}if(!result[0]||result[0]['id']!=query){result.unshift({id:val,name:val});}return result.slice(0,5);}});$('#token-input-user').focus(function(){var t=$('.token-input-dropdown'),offset=t.outerWidth()-t.width();t.width($('.token-input-list').outerWidth()-offset);});}});</script>\"\n    ,yes: function(index, callback){\n        if(!$(callback).find(\"#searchUser\").val()){\n            layer.msg('要发送通知的用户不能为空哦~');\n            return false;\n        }\n        if(!$(callback).find(\"#notifytitle\").val()){\n            layer.msg('要发送的通知标题不能为空哦~');\n            return false;\n        }\n        if(!$(callback).find(\"#notifytext\").val()){\n            layer.msg('要发送的通知内容不能为空哦~');\n            return false;\n        }\n      $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bs-usernotify\",\n                        data: {\n                            \"type\": 'notify',\n                            \"searchUser\": $(callback).find(\"#searchUser\").val(),\n                            \"notifytitle\":$(callback).find(\"#notifytitle\").val(),\n                            \"notifytext\":$(callback).find(\"#notifytext\").val(),\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\ntoastr.success('通知发送成功');\nlayer.closeAll();\n                        },\n                        complete: function() {\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n                    \n    }\n});\n});\n\n\n\n//搜索用户\nvar searchuserpage = 1;\n                var searchusern = 0;\n                var searchusermax = 1;\nfunction getsearchuserdata(val){\n          \n     $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bUserAction\",\n                        data: {\n                            \"type\": 'searchuser',\n                            'searchval':val,\n                            \"page\": searchuserpage\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\nif(json.list == ''){\n                                var strs = \" \";\n                                strs += '<tr></tr>'\n                                $(\"#searchuser\").html(strs);\n                                searchusern = json.total;\n                            searchusermax = json.max;\n                            }\n                            else{\n                                searchusern = json.total;\n                            searchusermax = json.max;\ncontent4(json.list);\n}\n                        },\n                        complete: function() {\n                            searchuserpageList();\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n              \n    function searchuserpageList() {\n                    searchuserpage = Math.min(searchuserpage, searchusermax);\n                    searchuserpage = Math.max(searchuserpage, 1);\n                    var html = \"<center><div class=\\\"ui circular labels\\\"><a class=\\\"ui label\\\" data-page=\"+ searchuserpage +\">共\" + searchusern + \"条</a><a class=\\\"ui label\\\" data-page=\"+ searchuserpage +\">第\" + searchuserpage + \"/\" + searchusermax + \"页</a>\";\n                    html += '<a class=\\\"ui label\\\"  data-page=\"1\">首页</a>';\n                    html += (searchuserpage > 1) ? '<a class=\\\"ui label\\\"  data-page=\"' + (searchuserpage - 1) + '\">上一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"1\">上一页</a>';\n                    html += (searchuserpage < searchusermax) ? '<a class=\\\"ui label\\\"  data-page=\"' + (searchuserpage + 1) + '\">下一页</a>' : '<a class=\\\"ui label\\\"  data-page=\"' + searchusermax + '\">下一页</a>';\n                    html += '<a class=\\\"ui label\\\"  data-page=\"' + searchusermax + '\">尾页</a><div class=\\\"ui mini input\\\"><input id=\\\"dipage\\\" type=\\\"number\\\" placeholder=\\\"输入跳转的页码\\\"></div><a id=\\\"gopage\\\" class=\\\"ui label\\\" >跳转到指定页</a></div></center>';\n                    var $html = $(html);\n                    \n                    $html.find(\"a\").click(function() {\n                        if($(this).attr(\"id\")!=='gopage'){\n                        searchuserpage = $(this).attr(\"data-page\");\n                        }\n                        else{\n                            var dipage = document.getElementById(\"dipage\").value;\n                            switch(dipage){\n                            case dipage < 1 :\n                                searchuserpage = 1;\n                            break;\n                            case dipage > searchusermax:\n                                searchuserpage = searchusermax;\n                            break;\n                            default:\n                            searchuserpage = dipage;\n                        };\n                        };\n                        getsearchuserdata($(\"#usersearch\").val());\n                    });\n                    \n                    \n                    $(\".searchuserlist\").html($html);\n                }\n                \n     function content4(listsss) {\n                    var str4 = \" \";\n                    for(var i in listsss) {\n    str4 += '<tr><td>' + listsss[i]['uid'] + '</td><td>' + listsss[i]['name'] + '</td><td>' + listsss[i]['screenName'] + '</td><td>' + listsss[i]['mail'] + '</td><td>' + listsss[i]['post_num'] + '</td>><td>' + listsss[i]['group'] + '</td><td>' + listsss[i]['coins'] + '</td><td>' + listsss[i]['submission'] + '</td><td><div class=\"ui yellow icon label edituser\"  style=\"margin-top:5px\" data-mail=\"' + listsss[i]['mail'] + '\" data-uid=\"' + listsss[i]['uid'] + '\" data-screenName=\"' + listsss[i]['screenName'] + '\" data-name=\"' + listsss[i]['name'] + '\" data-post_num=\"' + listsss[i]['post_num'] + '\" data-group=\"' + listsss[i]['group'] + '\" data-coins=\"' + listsss[i]['coins'] + '\"  data-submission=\"' + listsss[i]['submission'] + '\" data-coin_name=\"' + listsss[i]['coin_name'] + '\"><i class=\"edit icon\"></i></div></td></tr>'\n\n$(\"#searchuser\").html(str4);\n}\n}\n}\n\n\n$(document).delegate(\".ui.yellow.icon.label.edituser\", \"click\", function() {\n    var select = $(this).attr('data-submission');\n    if(select == '开启'){\n        select =  '<option value=\"open\" selected=\"selected\">开启</option><option value=\"close\">关闭</option>';\n    }\n    else{\n        select =  '<option value=\"open\">开启</option><option value=\"close\"  selected=\"selected\">关闭</option>';\n    }\nlayer.open({\n    type: 1 \n    ,btn:[\"确定修改\",\"取消修改\"]\n    ,title: '修改用户'\n    ,skin: 'layui-layer-prompt'\n    ,content: \"<div style='margin:-10px 0 10px 0'>UID</div><div><input id='uid' type='text' class='layui-layer-input' value=\"+$(this).attr('data-uid')+\" placeholder='用户UID' disabled></div><div style='margin:10px 0 10px 0'>账号</div><div><input style='margin-top:10px;' id='name' type='text' class='layui-layer-input' value=\"+$(this).attr('data-name')+\" placeholder='账号' disabled></div><div style='margin:10px 0 10px 0'>昵称</div><div><input style='margin-top:10px;' id='screenName' type='text' class='layui-layer-input' value=\"+$(this).attr('data-screenName')+\" placeholder='昵称' disabled></div><div style='margin:10px 0 10px 0'>电邮</div><div><input style='margin-top:10px;' id='mail' type='text' class='layui-layer-input' value=\"+$(this).attr('data-mail')+\" placeholder='邮箱' disabled></div><div style='margin:10px 0 10px 0'>\"+$(this).attr('data-coin_name')+\"</div><div><input style='margin-top:10px;' id='coins' type='text' class='layui-layer-input' value=\"+$(this).attr('data-coins')+\" placeholder=''></div><div style='margin:10px 0 10px 0'>投稿权限</div><div><select name='submission_type' id='submission_type'>\"+select+\"</select></div>\"\n    ,yes: function(index, callback){\n      $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bUserAction\",\n                        data: {\n                            \"type\": 'edituser',\n                            \"uid\":$(callback).find(\"#uid\").val(),\n                            \"coins\":$(callback).find(\"#coins\").val(),\n                            \"submission_type\":$(callback).find($(\"#submission_type\")).find(\"option:selected\").val()\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\ntoastr.success('UID为'+$(callback).find(\"#uid\").val()+'的用户信息已修改成功。');\nlayer.closeAll();\n  getsearchuserdata($(\"#usersearch\").val());\n                        },\n                        complete: function() {\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n                    \n    }\n});\n});\n\n$(document).delegate(\".ui.black.icon.label.check\", \"click\", function() {\n    var loading = layer.load(2);\n    $(this).css(\"pointer-events\",\"none\");\n    $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfriendaction\",\n                        data: {\n                            \"type\": 'check',\n                            \"friendurl\":$(this).attr('data-friendurl'),\n                            \"id\":$(this).attr('data-id'),\n                            \"checkurl\":$(this).attr('data-checkurl'),\n                            \"friendname\":$(this).attr('data-friendname')\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            layer.close(loading);\n                            $(\".ui.black.icon.label.check\").css(\"pointer-events\",\"auto\");\n                            json = JSON.parse(data);\n                            if(json.message == '友链正常'){\n             layer.open({\n    type: 1 \n    ,btn:[\"移动至已通过\",\"取消\"]\n    ,title: '友链检查'\n    ,skin: 'layui-layer-prompt'\n    ,content: \"<div style='margin:-10px 0 10px 0'>\"+json.message+\"</div><input style='display:none' id='friendid' type='text' class='layui-layer-input' value=\"+json.data.friendid+\" placeholder=''><input style='display:none' id='friendmail' type='text' class='layui-layer-input' value=\"+json.data.friendmail+\" placeholder=''>\"\n    ,yes: function(index, callback){\n        $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfriendaction\",\n                        data: {\n                            \"type\": 'approved',\n                            \"linkid\":$(callback).find(\"#friendid\").val(),\n                            \"linkmail\":$(callback).find(\"#friendmail\").val()\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\ntoastr.success('该友链已批准，已将其加入友链列表。');\nlayer.closeAll();\ngetwaitingdata();\n  getapproveddata();\n  getrejectdata();\n                        },\n                        complete: function() {\n                            \n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n\n                    \n                    \n    }\n});\n\n                            }\n                    else{        \n layer.open({\n    type: 1 \n    ,btn:[\"移动至已驳回\",\"取消\"]\n    ,title: '友链检查'\n    ,skin: 'layui-layer-prompt'\n    ,content: \"<div style='margin:-10px 0 10px 0'>\"+json.message+\"</div><input style='display:none' id='friendid' type='text' class='layui-layer-input' value=\"+json.data.friendid+\" placeholder=''><input style='display:none' id='friendmail' type='text' class='layui-layer-input' value=\"+json.data.friendmail+\" placeholder=''>\"\n    ,yes: function(index, callback){\n        $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsfriendaction\",\n                        data: {\n                            \"type\": 'reject',\n                            \"linkid\":$(callback).find(\"#friendid\").val(),\n                            \"linkmail\":$(callback).find(\"#friendmail\").val()\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\ntoastr.success('该友链已驳回，已将其加入已驳回列表，可在已驳回列表中重新审核。');\nlayer.closeAll();\ngetwaitingdata();\n  getapproveddata();\n  getrejectdata();\n                        },\n                        complete: function() {\n                            \n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n\n                    \n                    \n    }\n});\n\n}\n\n\n                        },\n                        complete: function() {\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n                    \n\n});"
  },
  {
    "path": "配套插件/BsCore/assets/js/color-picker.js",
    "content": "/**\n * @output wp-admin/js/color-picker.js\n */\n\n( function( $, undef ) {\n\n\tvar ColorPicker,\n\t\t_before = '<button type=\"button\" class=\"button wp-color-result\" aria-expanded=\"false\"><span class=\"wp-color-result-text\"></span></button>',\n\t\t_after = '<div class=\"wp-picker-holder\" />',\n\t\t_wrap = '<div class=\"wp-picker-container\" />',\n\t\t_button = '<input type=\"button\" class=\"button button-small\" />',\n\t\t_wrappingLabel = '<label></label>',\n\t\t_wrappingLabelText = '<span class=\"screen-reader-text\"></span>',\n\t\t__ = function (text){return text};\n\n\t/**\n\t * Creates a jQuery UI color picker that is used in the theme customizer.\n\t *\n\t * @class $.widget.wp.wpColorPicker\n\t *\n\t * @since 3.5.0\n\t */\n\tColorPicker = /** @lends $.widget.wp.wpColorPicker.prototype */{\n\t\toptions: {\n\t\t\tdefaultColor: false,\n\t\t\tchange: false,\n\t\t\tclear: false,\n\t\t\thide: true,\n\t\t\tpalettes: true,\n\t\t\twidth: 255,\n\t\t\tmode: 'hsv',\n\t\t\ttype: 'full',\n\t\t\tslider: 'horizontal'\n\t\t},\n\t\t/**\n\t\t * Creates a color picker that only allows you to adjust the hue.\n\t\t *\n\t\t * @since 3.5.0\n\t\t * @access private\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\t_createHueOnly: function() {\n\t\t\tvar self = this,\n\t\t\t\tel = self.element,\n\t\t\t\tcolor;\n\n\t\t\tel.hide();\n\n\t\t\t// Set the saturation to the maximum level.\n\t\t\tcolor = 'hsl(' + el.val() + ', 100, 50)';\n\n\t\t\t// Create an instance of the color picker, using the hsl mode.\n\t\t\tel.iris( {\n\t\t\t\tmode: 'hsl',\n\t\t\t\ttype: 'hue',\n\t\t\t\thide: false,\n\t\t\t\tcolor: color,\n\t\t\t\t/**\n\t\t\t\t * Handles the onChange event if one has been defined in the options.\n\t\t\t\t *\n\t\t\t\t * @ignore\n\t\t\t\t *\n\t\t\t\t * @param {Event} event    The event that's being called.\n\t\t\t\t * @param {HTMLElement} ui The HTMLElement containing the color picker.\n\t\t\t\t *\n\t\t\t\t * @return {void}\n\t\t\t\t */\n\t\t\t\tchange: function( event, ui ) {\n\t\t\t\t\tif ( typeof self.options.change === 'function' ) {\n\t\t\t\t\t\tself.options.change.call( this, event, ui );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twidth: self.options.width,\n\t\t\t\tslider: self.options.slider\n\t\t\t} );\n\t\t},\n\t\t/**\n\t\t * Creates the color picker, sets default values, css classes and wraps it all in HTML.\n\t\t *\n\t\t * @since 3.5.0\n\t\t * @access private\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\t_create: function() {\n\t\t\t// Return early if Iris support is missing.\n\t\t\tif ( ! $.support.iris ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar self = this,\n\t\t\t\tel = self.element;\n\n\t\t\t// Override default options with options bound to the element.\n\t\t\t$.extend( self.options, el.data() );\n\n\t\t\t// Create a color picker which only allows adjustments to the hue.\n\t\t\tif ( self.options.type === 'hue' ) {\n\t\t\t\treturn self._createHueOnly();\n\t\t\t}\n\n\t\t\t// Bind the close event.\n\t\t\tself.close = self.close.bind( self );\n\n\t\t\tself.initialValue = el.val();\n\n\t\t\t// Add a CSS class to the input field.\n\t\t\tel.addClass( 'wp-color-picker' );\n\n\t\t\t/*\n\t\t\t * Check if there's already a wrapping label, e.g. in the Customizer.\n\t\t\t * If there's no label, add a default one to match the Customizer template.\n\t\t\t */\n\t\t\tif ( ! el.parent( 'label' ).length ) {\n\t\t\t\t// Wrap the input field in the default label.\n\t\t\t\tel.wrap( _wrappingLabel );\n\t\t\t\t// Insert the default label text.\n\t\t\t\tself.wrappingLabelText = $( _wrappingLabelText )\n\t\t\t\t\t.insertBefore( el )\n\t\t\t\t\t.text( __( '颜色值' ) );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * At this point, either it's the standalone version or the Customizer\n\t\t\t * one, we have a wrapping label to use as hook in the DOM, let's store it.\n\t\t\t */\n\t\t\tself.wrappingLabel = el.parent();\n\n\t\t\t// Wrap the label in the main wrapper.\n\t\t\tself.wrappingLabel.wrap( _wrap );\n\t\t\t// Store a reference to the main wrapper.\n\t\t\tself.wrap = self.wrappingLabel.parent();\n\t\t\t// Set up the toggle button and insert it before the wrapping label.\n\t\t\tself.toggler = $( _before )\n\t\t\t\t.insertBefore( self.wrappingLabel )\n\t\t\t\t.css( { backgroundColor: self.initialValue } );\n\t\t\t// Set the toggle button span element text.\n\t\t\tself.toggler.find( '.wp-color-result-text' ).text( __( '选择颜色' ) );\n\t\t\t// Set up the Iris container and insert it after the wrapping label.\n\t\t\tself.pickerContainer = $( _after ).insertAfter( self.wrappingLabel );\n\t\t\t// Store a reference to the Clear/Default button.\n\t\t\tself.button = $( _button );\n\n\t\t\t// Set up the Clear/Default button.\n\t\t\tif ( self.options.defaultColor ) {\n\t\t\t\tself.button\n\t\t\t\t\t.addClass( 'wp-picker-default' )\n\t\t\t\t\t.val( __( '默认' ) )\n\t\t\t\t\t.attr( 'aria-label', __( 'Select default color' ) );\n\t\t\t} else {\n\t\t\t\tself.button\n\t\t\t\t\t.addClass( 'wp-picker-clear' )\n\t\t\t\t\t.val( __( '清除' ) )\n\t\t\t\t\t.attr( 'aria-label', __( '清除颜色' ) );\n\t\t\t}\n\n\t\t\t// Wrap the wrapping label in its wrapper and append the Clear/Default button.\n\t\t\tself.wrappingLabel\n\t\t\t\t.wrap( '<span class=\"wp-picker-input-wrap hidden\" />' )\n\t\t\t\t.after( self.button );\n\n\t\t\t/*\n\t\t\t * The input wrapper now contains the label+input+Clear/Default button.\n\t\t\t * Store a reference to the input wrapper: we'll use this to toggle\n\t\t\t * the controls visibility.\n\t\t\t */\n\t\t\tself.inputWrapper = el.closest( '.wp-picker-input-wrap' );\n\n\t\t\tel.iris( {\n\t\t\t\ttarget: self.pickerContainer,\n\t\t\t\thide: self.options.hide,\n\t\t\t\twidth: self.options.width,\n\t\t\t\tmode: self.options.mode,\n\t\t\t\tpalettes: self.options.palettes,\n\t\t\t\t/**\n\t\t\t\t * Handles the onChange event if one has been defined in the options and additionally\n\t\t\t\t * sets the background color for the toggler element.\n\t\t\t\t *\n\t\t\t\t * @since 3.5.0\n\t\t\t\t *\n\t\t\t\t * @ignore\n\t\t\t\t *\n\t\t\t\t * @param {Event} event    The event that's being called.\n\t\t\t\t * @param {HTMLElement} ui The HTMLElement containing the color picker.\n\t\t\t\t *\n\t\t\t\t * @return {void}\n\t\t\t\t */\n\t\t\t\tchange: function( event, ui ) {\n\t\t\t\t\tself.toggler.css( { backgroundColor: ui.color.toString() } );\n\n\t\t\t\t\tif ( typeof self.options.change === 'function' ) {\n\t\t\t\t\t\tself.options.change.call( this, event, ui );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tel.val( self.initialValue );\n\t\t\tself._addListeners();\n\n\t\t\t// Force the color picker to always be closed on initial load.\n\t\t\tif ( ! self.options.hide ) {\n\t\t\t\tself.toggler.click();\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Binds event listeners to the color picker.\n\t\t *\n\t\t * @since 3.5.0\n\t\t * @access private\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\t_addListeners: function() {\n\t\t\tvar self = this;\n\n\t\t\t/**\n\t\t\t * Prevent any clicks inside this widget from leaking to the top and closing it.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t *\n\t\t\t * @param {Event} event The event that's being called.\n\t\t\t *\n\t\t\t * @return {void}\n\t\t\t */\n\t\t\tself.wrap.on( 'click.wpcolorpicker', function( event ) {\n\t\t\t\tevent.stopPropagation();\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Open or close the color picker depending on the class.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t */\n\t\t\tself.toggler.on( 'click', function(){\n\t\t\t\tif ( self.toggler.hasClass( 'wp-picker-open' ) ) {\n\t\t\t\t\tself.close();\n\t\t\t\t} else {\n\t\t\t\t\tself.open();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Checks if value is empty when changing the color in the color picker.\n\t\t\t * If so, the background color is cleared.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t *\n\t\t\t * @param {Event} event The event that's being called.\n\t\t\t *\n\t\t\t * @return {void}\n\t\t\t */\n\t\t\tself.element.on( 'change', function( event ) {\n\t\t\t\tvar me = $( this ),\n\t\t\t\t\tval = me.val();\n\n\t\t\t\tif ( val === '' || val === '#' ) {\n\t\t\t\t\tself.toggler.css( 'backgroundColor', '' );\n\t\t\t\t\t// Fire clear callback if we have one.\n\t\t\t\t\tif ( typeof self.options.clear === 'function' ) {\n\t\t\t\t\t\tself.options.clear.call( this, event );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Enables the user to either clear the color in the color picker or revert back to the default color.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t *\n\t\t\t * @param {Event} event The event that's being called.\n\t\t\t *\n\t\t\t * @return {void}\n\t\t\t */\n\t\t\tself.button.on( 'click', function( event ) {\n\t\t\t\tvar me = $( this );\n\t\t\t\tif ( me.hasClass( 'wp-picker-clear' ) ) {\n\t\t\t\t\tself.element.val( '' );\n\t\t\t\t\tself.toggler.css( 'backgroundColor', '' );\n\t\t\t\t\tif ( typeof self.options.clear === 'function' ) {\n\t\t\t\t\t\tself.options.clear.call( this, event );\n\t\t\t\t\t}\n\t\t\t\t} else if ( me.hasClass( 'wp-picker-default' ) ) {\n\t\t\t\t\tself.element.val( self.options.defaultColor ).change();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * Opens the color picker dialog.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\topen: function() {\n\t\t\tthis.element.iris( 'toggle' );\n\t\t\tthis.inputWrapper.removeClass( 'hidden' );\n\t\t\tthis.wrap.addClass( 'wp-picker-active' );\n\t\t\tthis.toggler\n\t\t\t\t.addClass( 'wp-picker-open' )\n\t\t\t\t.attr( 'aria-expanded', 'true' );\n\t\t\t$( 'body' ).trigger( 'click.wpcolorpicker' ).on( 'click.wpcolorpicker', this.close );\n\t\t},\n\t\t/**\n\t\t * Closes the color picker dialog.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tclose: function() {\n\t\t\tthis.element.iris( 'toggle' );\n\t\t\tthis.inputWrapper.addClass( 'hidden' );\n\t\t\tthis.wrap.removeClass( 'wp-picker-active' );\n\t\t\tthis.toggler\n\t\t\t\t.removeClass( 'wp-picker-open' )\n\t\t\t\t.attr( 'aria-expanded', 'false' );\n\t\t\t$( 'body' ).off( 'click.wpcolorpicker', this.close );\n\t\t},\n\t\t/**\n\t\t * Returns the iris object if no new color is provided. If a new color is provided, it sets the new color.\n\t\t *\n\t\t * @param newColor {string|*} The new color to use. Can be undefined.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @return {string} The element's color.\n\t\t */\n\t\tcolor: function( newColor ) {\n\t\t\tif ( newColor === undef ) {\n\t\t\t\treturn this.element.iris( 'option', 'color' );\n\t\t\t}\n\t\t\tthis.element.iris( 'option', 'color', newColor );\n\t\t},\n\t\t/**\n\t\t * Returns the iris object if no new default color is provided.\n\t\t * If a new default color is provided, it sets the new default color.\n\t\t *\n\t\t * @param newDefaultColor {string|*} The new default color to use. Can be undefined.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @return {boolean|string} The element's color.\n\t\t */\n\t\tdefaultColor: function( newDefaultColor ) {\n\t\t\tif ( newDefaultColor === undef ) {\n\t\t\t\treturn this.options.defaultColor;\n\t\t\t}\n\n\t\t\tthis.options.defaultColor = newDefaultColor;\n\t\t}\n\t};\n\n\t// Register the color picker as a widget.\n\t$.widget( 'wp.wpColorPicker', ColorPicker );\n}( jQuery ) );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/iris.js",
    "content": "/*! This file is auto-generated */\n/*! Iris Color Picker - v1.1.1 - 2021-10-05\n* https://github.com/Automattic/Iris\n* Copyright (c) 2021 Matt Wiebe; Licensed GPLv2 */\n!function(a,b){function c(){var b,c,d=\"backgroundImage\";j?k=\"filter\":(b=a('<div id=\"iris-gradtest\" />'),c=\"linear-gradient(top,#fff,#000)\",a.each(l,function(a,e){if(b.css(d,e+c),b.css(d).match(\"gradient\"))return k=a,!1}),!1===k&&(b.css(\"background\",\"-webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#000))\"),b.css(d).match(\"gradient\")&&(k=\"webkit\")),b.remove())}function d(a,b){return a=\"top\"===a?\"top\":\"left\",b=Array.isArray(b)?b:Array.prototype.slice.call(arguments,1),\"webkit\"===k?f(a,b):l[k]+\"linear-gradient(\"+a+\", \"+b.join(\", \")+\")\"}function e(b,c){var d,e,f,h,i,j,k,l,m;b=\"top\"===b?\"top\":\"left\",c=Array.isArray(c)?c:Array.prototype.slice.call(arguments,1),d=\"top\"===b?0:1,e=a(this),f=c.length-1,h=\"filter\",i=1===d?\"left\":\"top\",j=1===d?\"right\":\"bottom\",k=1===d?\"height\":\"width\",l='<div class=\"iris-ie-gradient-shim\" style=\"position:absolute;'+k+\":100%;\"+i+\":%start%;\"+j+\":%end%;\"+h+':%filter%;\" data-color:\"%color%\"></div>',m=\"\",\"static\"===e.css(\"position\")&&e.css({position:\"relative\"}),c=g(c),a.each(c,function(a,b){var e,g,h;if(a===f)return!1;e=c[a+1],b.stop!==e.stop&&(g=100-parseFloat(e.stop)+\"%\",b.octoHex=new Color(b.color).toIEOctoHex(),e.octoHex=new Color(e.color).toIEOctoHex(),h=\"progid:DXImageTransform.Microsoft.Gradient(GradientType=\"+d+\", StartColorStr='\"+b.octoHex+\"', EndColorStr='\"+e.octoHex+\"')\",m+=l.replace(\"%start%\",b.stop).replace(\"%end%\",g).replace(\"%filter%\",h))}),e.find(\".iris-ie-gradient-shim\").remove(),a(m).prependTo(e)}function f(b,c){var d=[];return b=\"top\"===b?\"0% 0%,0% 100%,\":\"0% 100%,100% 100%,\",c=g(c),a.each(c,function(a,b){d.push(\"color-stop(\"+parseFloat(b.stop)/100+\", \"+b.color+\")\")}),\"-webkit-gradient(linear,\"+b+d.join(\",\")+\")\"}function g(b){var c=[],d=[],e=[],f=b.length-1;return a.each(b,function(a,b){var e=b,f=!1,g=b.match(/1?[0-9]{1,2}%$/);g&&(e=b.replace(/\\s?1?[0-9]{1,2}%$/,\"\"),f=g.shift()),c.push(e),d.push(f)}),!1===d[0]&&(d[0]=\"0%\"),!1===d[f]&&(d[f]=\"100%\"),d=h(d),a.each(d,function(a){e[a]={color:c[a],stop:d[a]}}),e}function h(b){var c,d,e,f,g=0,i=b.length-1,j=0,k=!1;if(b.length<=2||a.inArray(!1,b)<0)return b;for(;j<b.length-1;)k||!1!==b[j]?k&&!1!==b[j]&&(i=j,j=b.length):(g=j-1,k=!0),j++;for(d=i-g,f=parseInt(b[g].replace(\"%\"),10),c=(parseFloat(b[i].replace(\"%\"))-f)/d,j=g+1,e=1;j<i;)b[j]=f+e*c+\"%\",e++,j++;return h(b)}var i,j,k,l,m,n,o,p,q;if(i='<div class=\"iris-picker\"><div class=\"iris-picker-inner\"><div class=\"iris-square\"><a class=\"iris-square-value\" href=\"#\"><span class=\"iris-square-handle ui-slider-handle\"></span></a><div class=\"iris-square-inner iris-square-horiz\"></div><div class=\"iris-square-inner iris-square-vert\"></div></div><div class=\"iris-slider iris-strip\"><div class=\"iris-slider-offset\"></div></div></div></div>',m='.iris-picker{display:block;position:relative}.iris-picker,.iris-picker *{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input+.iris-picker{margin-top:4px}.iris-error{background-color:#ffafaf}.iris-border{border-radius:3px;border:1px solid #aaa;width:200px;background-color:#fff}.iris-picker-inner{position:absolute;top:0;right:0;left:0;bottom:0}.iris-border .iris-picker-inner{top:10px;right:10px;left:10px;bottom:10px}.iris-picker .iris-square-inner{position:absolute;left:0;right:0;top:0;bottom:0}.iris-picker .iris-square,.iris-picker .iris-slider,.iris-picker .iris-square-inner,.iris-picker .iris-palette{border-radius:3px;box-shadow:inset 0 0 5px rgba(0,0,0,.4);height:100%;width:12.5%;float:left;margin-right:5%}.iris-only-strip .iris-slider{width:100%}.iris-picker .iris-square{width:76%;margin-right:10%;position:relative}.iris-only-strip .iris-square{display:none}.iris-picker .iris-square-inner{width:auto;margin:0}.iris-ie-9 .iris-square,.iris-ie-9 .iris-slider,.iris-ie-9 .iris-square-inner,.iris-ie-9 .iris-palette{box-shadow:none;border-radius:0}.iris-ie-9 .iris-square,.iris-ie-9 .iris-slider,.iris-ie-9 .iris-palette{outline:1px solid rgba(0,0,0,.1)}.iris-ie-lt9 .iris-square,.iris-ie-lt9 .iris-slider,.iris-ie-lt9 .iris-square-inner,.iris-ie-lt9 .iris-palette{outline:1px solid #aaa}.iris-ie-lt9 .iris-square .ui-slider-handle{outline:1px solid #aaa;background-color:#fff;-ms-filter:\"alpha(Opacity=30)\"}.iris-ie-lt9 .iris-square .iris-square-handle{background:0 0;border:3px solid #fff;-ms-filter:\"alpha(Opacity=50)\"}.iris-picker .iris-strip{margin-right:0;position:relative}.iris-picker .iris-strip .ui-slider-handle{position:absolute;background:0 0;margin:0;right:-3px;left:-3px;border:4px solid #aaa;border-width:4px 3px;width:auto;height:6px;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.2);opacity:.9;z-index:5;cursor:ns-resize}.iris-strip-horiz .iris-strip .ui-slider-handle{right:auto;left:auto;bottom:-3px;top:-3px;height:auto;width:6px;cursor:ew-resize}.iris-strip .ui-slider-handle:before{content:\" \";position:absolute;left:-2px;right:-2px;top:-3px;bottom:-3px;border:2px solid #fff;border-radius:3px}.iris-picker .iris-slider-offset{position:absolute;top:11px;left:0;right:0;bottom:-3px;width:auto;height:auto;background:transparent;border:0;border-radius:0}.iris-strip-horiz .iris-slider-offset{top:0;bottom:0;right:11px;left:-3px}.iris-picker .iris-square-handle{background:transparent;border:5px solid #aaa;border-radius:50%;border-color:rgba(128,128,128,.5);box-shadow:none;width:12px;height:12px;position:absolute;left:-10px;top:-10px;cursor:move;opacity:1;z-index:10}.iris-picker .ui-state-focus .iris-square-handle{opacity:.8}.iris-picker .iris-square-handle:hover{border-color:#999}.iris-picker .iris-square-value:focus .iris-square-handle{box-shadow:0 0 2px rgba(0,0,0,.75);opacity:.8}.iris-picker .iris-square-handle:hover::after{border-color:#fff}.iris-picker .iris-square-handle::after{position:absolute;bottom:-4px;right:-4px;left:-4px;top:-4px;border:3px solid #f9f9f9;border-color:rgba(255,255,255,.8);border-radius:50%;content:\" \"}.iris-picker .iris-square-value{width:8px;height:8px;position:absolute}.iris-ie-lt9 .iris-square-value,.iris-mozilla .iris-square-value{width:1px;height:1px}.iris-palette-container{position:absolute;bottom:0;left:0;margin:0;padding:0}.iris-border .iris-palette-container{left:10px;bottom:10px}.iris-picker .iris-palette{margin:0;cursor:pointer}.iris-square-handle,.ui-slider-handle{border:0;outline:0}',o=navigator.userAgent.toLowerCase(),p=\"Microsoft Internet Explorer\"===navigator.appName,q=p?parseFloat(o.match(/msie ([0-9]{1,}[\\.0-9]{0,})/)[1]):0,j=p&&q<10,k=!1,l=[\"-moz-\",\"-webkit-\",\"-o-\",\"-ms-\"],j&&q<=7)return a.fn.iris=a.noop,void(a.support.iris=!1);a.support.iris=!0,a.fn.gradient=function(){var b=arguments;return this.each(function(){j?e.apply(this,b):a(this).css(\"backgroundImage\",d.apply(this,b))})},a.fn.rainbowGradient=function(b,c){var d,e,f,g;for(b=b||\"top\",d=a.extend({},{s:100,l:50},c),e=\"hsl(%h%,\"+d.s+\"%,\"+d.l+\"%)\",f=0,g=[];f<=360;)g.push(e.replace(\"%h%\",f)),f+=30;return this.each(function(){a(this).gradient(b,g)})},n={options:{color:!1,mode:\"hsl\",controls:{horiz:\"s\",vert:\"l\",strip:\"h\"},hide:!0,border:!0,target:!1,width:200,palettes:!1,type:\"full\",slider:\"horizontal\"},_color:\"\",_palettes:[\"#000\",\"#fff\",\"#d33\",\"#d93\",\"#ee2\",\"#81d742\",\"#1e73be\",\"#8224e3\"],_inited:!1,_defaultHSLControls:{horiz:\"s\",vert:\"l\",strip:\"h\"},_defaultHSVControls:{horiz:\"h\",vert:\"v\",strip:\"s\"},_scale:{h:360,s:100,l:100,v:100},_create:function(){var b=this,d=b.element,e=b.options.color||d.val();!1===k&&c(),d.is(\"input\")?(b.options.target?b.picker=a(i).appendTo(b.options.target):b.picker=a(i).insertAfter(d),b._addInputListeners(d)):(d.append(i),b.picker=d.find(\".iris-picker\")),p?9===q?b.picker.addClass(\"iris-ie-9\"):q<=8&&b.picker.addClass(\"iris-ie-lt9\"):o.indexOf(\"compatible\")<0&&o.indexOf(\"khtml\")<0&&o.match(/mozilla/)&&b.picker.addClass(\"iris-mozilla\"),b.options.palettes&&b._addPalettes(),b.onlySlider=\"hue\"===b.options.type,b.horizontalSlider=b.onlySlider&&\"horizontal\"===b.options.slider,b.onlySlider&&(b.options.controls.strip=\"h\",e||(e=\"hsl(10,100,50)\")),b._color=new Color(e).setHSpace(b.options.mode),b.options.color=b._color.toString(),b.controls={square:b.picker.find(\".iris-square\"),squareDrag:b.picker.find(\".iris-square-value\"),horiz:b.picker.find(\".iris-square-horiz\"),vert:b.picker.find(\".iris-square-vert\"),strip:b.picker.find(\".iris-strip\"),stripSlider:b.picker.find(\".iris-strip .iris-slider-offset\")},\"hsv\"===b.options.mode&&b._has(\"l\",b.options.controls)?b.options.controls=b._defaultHSVControls:\"hsl\"===b.options.mode&&b._has(\"v\",b.options.controls)&&(b.options.controls=b._defaultHSLControls),b.hue=b._color.h(),b.options.hide&&b.picker.hide(),b.options.border&&!b.onlySlider&&b.picker.addClass(\"iris-border\"),b._initControls(),b.active=\"external\",b._dimensions(),b._change()},_has:function(b,c){var d=!1;return a.each(c,function(a,c){if(b===c)return d=!0,!1}),d},_addPalettes:function(){var b=a('<div class=\"iris-palette-container\" />'),c=a('<a class=\"iris-palette\" tabindex=\"0\" />'),d=Array.isArray(this.options.palettes)?this.options.palettes:this._palettes;this.picker.find(\".iris-palette-container\").length&&(b=this.picker.find(\".iris-palette-container\").detach().html(\"\")),a.each(d,function(a,d){c.clone().data(\"color\",d).css(\"backgroundColor\",d).appendTo(b).height(10).width(10)}),this.picker.append(b)},_paint:function(){var a=this;a.horizontalSlider?a._paintDimension(\"left\",\"strip\"):a._paintDimension(\"top\",\"strip\"),a._paintDimension(\"top\",\"vert\"),a._paintDimension(\"left\",\"horiz\")},_paintDimension:function(a,b){var c,d=this,e=d._color,f=d.options.mode,g=d._getHSpaceColor(),h=d.controls[b],i=d.options.controls;if(b!==d.active&&(\"square\"!==d.active||\"strip\"===b))switch(i[b]){case\"h\":if(\"hsv\"===f){switch(g=e.clone(),b){case\"horiz\":g[i.vert](100);break;case\"vert\":g[i.horiz](100);break;case\"strip\":g.setHSpace(\"hsl\")}c=g.toHsl()}else c=\"strip\"===b?{s:g.s,l:g.l}:{s:100,l:g.l};h.rainbowGradient(a,c);break;case\"s\":\"hsv\"===f?\"vert\"===b?c=[e.clone().a(0).s(0).toCSS(\"rgba\"),e.clone().a(1).s(0).toCSS(\"rgba\")]:\"strip\"===b?c=[e.clone().s(100).toCSS(\"hsl\"),e.clone().s(0).toCSS(\"hsl\")]:\"horiz\"===b&&(c=[\"#fff\",\"hsl(\"+g.h+\",100%,50%)\"]):c=\"vert\"===b&&\"h\"===d.options.controls.horiz?[\"hsla(0, 0%, \"+g.l+\"%, 0)\",\"hsla(0, 0%, \"+g.l+\"%, 1)\"]:[\"hsl(\"+g.h+\",0%,50%)\",\"hsl(\"+g.h+\",100%,50%)\"],h.gradient(a,c);break;case\"l\":c=\"strip\"===b?[\"hsl(\"+g.h+\",100%,100%)\",\"hsl(\"+g.h+\", \"+g.s+\"%,50%)\",\"hsl(\"+g.h+\",100%,0%)\"]:[\"#fff\",\"rgba(255,255,255,0) 50%\",\"rgba(0,0,0,0) 50%\",\"rgba(0,0,0,1)\"],h.gradient(a,c);break;case\"v\":c=\"strip\"===b?[e.clone().v(100).toCSS(),e.clone().v(0).toCSS()]:[\"rgba(0,0,0,0)\",\"#000\"],h.gradient(a,c)}},_getHSpaceColor:function(){return\"hsv\"===this.options.mode?this._color.toHsv():this._color.toHsl()},_stripOnlyDimensions:function(){var a=this,b=this.options.width,c=.12*b;a.horizontalSlider?a.picker.css({width:b,height:c}).addClass(\"iris-only-strip iris-strip-horiz\"):a.picker.css({width:c,height:b}).addClass(\"iris-only-strip iris-strip-vert\")},_dimensions:function(b){if(\"hue\"===this.options.type)return this._stripOnlyDimensions();var c,d,e,f,g=this,h=g.options,i=g.controls,j=i.square,k=g.picker.find(\".iris-strip\"),l=\"77.5%\",m=\"12%\",n=20,o=h.border?h.width-n:h.width,p=Array.isArray(h.palettes)?h.palettes.length:g._palettes.length;if(b&&(j.css(\"width\",\"\"),k.css(\"width\",\"\"),g.picker.css({width:\"\",height:\"\"})),l=o*(parseFloat(l)/100),m=o*(parseFloat(m)/100),c=h.border?l+n:l,j.width(l).height(l),k.height(l).width(m),g.picker.css({width:h.width,height:c}),!h.palettes)return g.picker.css(\"paddingBottom\",\"\");d=2*l/100,f=l-(p-1)*d,e=f/p,g.picker.find(\".iris-palette\").each(function(b){var c=0===b?0:d;a(this).css({width:e,height:e,marginLeft:c})}),g.picker.css(\"paddingBottom\",e+d),k.height(e+d+l)},_addInputListeners:function(a){var b=this,c=function(c){var d=new Color(a.val()),e=a.val().replace(/^#/,\"\");a.removeClass(\"iris-error\"),d.error?\"\"!==e&&a.addClass(\"iris-error\"):d.toString()!==b._color.toString()&&(\"keyup\"===c.type&&e.match(/^[0-9a-fA-F]{3}$/)||b._setOption(\"color\",d.toString()))};a.on(\"change\",c).on(\"keyup\",b._debounce(c,100)),b.options.hide&&a.one(\"focus\",function(){b.show()})},_initControls:function(){var b=this,c=b.controls,d=c.square,e=b.options.controls,f=b._scale[e.strip],g=b.horizontalSlider?\"horizontal\":\"vertical\";c.stripSlider.slider({orientation:g,max:f,slide:function(a,c){b.active=\"strip\",\"h\"===e.strip&&\"vertical\"===g&&(c.value=f-c.value),b._color[e.strip](c.value),b._change.apply(b,arguments)}}),c.squareDrag.draggable({containment:c.square.find(\".iris-square-inner\"),zIndex:1e3,cursor:\"move\",drag:function(a,c){b._squareDrag(a,c)},start:function(){d.addClass(\"iris-dragging\"),a(this).addClass(\"ui-state-focus\")},stop:function(){d.removeClass(\"iris-dragging\"),a(this).removeClass(\"ui-state-focus\")}}).on(\"mousedown mouseup\",function(c){var d=\"ui-state-focus\";c.preventDefault(),\"mousedown\"===c.type?(b.picker.find(\".\"+d).removeClass(d).trigger(\"blur\"),a(this).addClass(d).trigger(\"focus\")):a(this).removeClass(d)}).on(\"keydown\",function(a){var d=c.square,e=c.squareDrag,f=e.position(),g=b.options.width/100;switch(a.altKey&&(g*=10),a.keyCode){case 37:f.left-=g;break;case 38:f.top-=g;break;case 39:f.left+=g;break;case 40:f.top+=g;break;default:return!0}f.left=Math.max(0,Math.min(f.left,d.width())),f.top=Math.max(0,Math.min(f.top,d.height())),e.css(f),b._squareDrag(a,{position:f}),a.preventDefault()}),d.on(\"mousedown\",function(c){var d,e;1===c.which&&a(c.target).is(\"div\")&&(d=b.controls.square.offset(),e={top:c.pageY-d.top,left:c.pageX-d.left},c.preventDefault(),b._squareDrag(c,{position:e}),c.target=b.controls.squareDrag.get(0),b.controls.squareDrag.css(e).trigger(c))}),b.options.palettes&&b._paletteListeners()},_paletteListeners:function(){var b=this;b.picker.find(\".iris-palette-container\").on(\"click.palette\",\".iris-palette\",function(){b._color.fromCSS(a(this).data(\"color\")),b.active=\"external\",b._change()}).on(\"keydown.palette\",\".iris-palette\",function(b){if(13!==b.keyCode&&32!==b.keyCode)return!0;b.stopPropagation(),a(this).trigger(\"click\")})},_squareDrag:function(a,b){var c=this,d=c.options.controls,e=c._squareDimensions(),f=Math.round((e.h-b.position.top)/e.h*c._scale[d.vert]),g=c._scale[d.horiz]-Math.round((e.w-b.position.left)/e.w*c._scale[d.horiz]);c._color[d.horiz](g)[d.vert](f),c.active=\"square\",c._change.apply(c,arguments)},_setOption:function(b,c){var d,e,f=this,g=f.options[b],h=!1;switch(f.options[b]=c,b){case\"color\":f.onlySlider?(c=parseInt(c,10),c=isNaN(c)||c<0||c>359?g:\"hsl(\"+c+\",100,50)\",f.options.color=f.options[b]=c,f._color=new Color(c).setHSpace(f.options.mode),f.active=\"external\",f._change()):(c=\"\"+c,c.replace(/^#/,\"\"),d=new Color(c).setHSpace(f.options.mode),d.error?f.options[b]=g:(f._color=d,f.options.color=f.options[b]=f._color.toString(),f.active=\"external\",f._change()));break;case\"palettes\":h=!0,c?f._addPalettes():f.picker.find(\".iris-palette-container\").remove(),g||f._paletteListeners();break;case\"width\":h=!0;break;case\"border\":h=!0,e=c?\"addClass\":\"removeClass\",f.picker[e](\"iris-border\");break;case\"mode\":case\"controls\":if(g===c)return;return e=f.element,g=f.options,g.hide=!f.picker.is(\":visible\"),f.destroy(),f.picker.remove(),a(f.element).iris(g)}h&&f._dimensions(!0)},_squareDimensions:function(a){var c,d=this.controls.square;return a!==b&&d.data(\"dimensions\")?d.data(\"dimensions\"):(this.controls.squareDrag,c={w:d.width(),h:d.height()},d.data(\"dimensions\",c),c)},_isNonHueControl:function(a,b){return\"square\"===a&&\"h\"===this.options.controls.strip||\"external\"!==b&&(\"h\"!==b||\"strip\"!==a)},_change:function(){var b=this,c=b.controls,d=b._getHSpaceColor(),e=[\"square\",\"strip\"],f=b.options.controls,g=f[b.active]||\"external\",h=b.hue;\"strip\"===b.active?e=[]:\"external\"!==b.active&&e.pop(),a.each(e,function(a,e){var g,h,i;if(e!==b.active)switch(e){case\"strip\":g=\"h\"!==f.strip||b.horizontalSlider?d[f.strip]:b._scale[f.strip]-d[f.strip],c.stripSlider.slider(\"value\",g);break;case\"square\":h=b._squareDimensions(),i={left:d[f.horiz]/b._scale[f.horiz]*h.w,top:h.h-d[f.vert]/b._scale[f.vert]*h.h},b.controls.squareDrag.css(i)}}),d.h!==h&&b._isNonHueControl(b.active,g)&&b._color.h(h),b.hue=b._color.h(),b.options.color=b._color.toString(),b._inited&&b._trigger(\"change\",{type:b.active},{color:b._color}),b.element.is(\":input\")&&!b._color.error&&(b.element.removeClass(\"iris-error\"),b.onlySlider?b.element.val()!==b.hue&&b.element.val(b.hue):b.element.val()!==b._color.toString()&&b.element.val(b._color.toString())),b._paint(),b._inited=!0,b.active=!1},_debounce:function(a,b,c){var d,e;return function(){var f,g,h=this,i=arguments;return f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},show:function(){this.picker.show()},hide:function(){this.picker.hide()},toggle:function(){this.picker.toggle()},color:function(a){return!0===a?this._color.clone():a===b?this._color.toString():void this.option(\"color\",a)}},a.widget(\"a8c.iris\",n),a('<style id=\"iris-css\">'+m+\"</style>\").appendTo(\"head\")}(jQuery),function(a,b){var c=function(a,b){return this instanceof c?this._init(a,b):new c(a,b)};c.fn=c.prototype={_color:0,_alpha:1,error:!1,_hsl:{h:0,s:0,l:0},_hsv:{h:0,s:0,v:0},_hSpace:\"hsl\",_init:function(a){var c=\"noop\";switch(typeof a){case\"object\":return a.a!==b&&this.a(a.a),c=a.r!==b?\"fromRgb\":a.l!==b?\"fromHsl\":a.v!==b?\"fromHsv\":c,this[c](a);case\"string\":return this.fromCSS(a);case\"number\":return this.fromInt(parseInt(a,10))}return this},_error:function(){return this.error=!0,this},clone:function(){for(var a=new c(this.toInt()),b=[\"_alpha\",\"_hSpace\",\"_hsl\",\"_hsv\",\"error\"],d=b.length-1;d>=0;d--)a[b[d]]=this[b[d]];return a},setHSpace:function(a){return this._hSpace=\"hsv\"===a?a:\"hsl\",this},noop:function(){return this},fromCSS:function(a){var b,c=/^(rgb|hs(l|v))a?\\(/;if(this.error=!1,a=a.replace(/^\\s+/,\"\").replace(/\\s+$/,\"\").replace(/;$/,\"\"),a.match(c)&&a.match(/\\)$/)){if(b=a.replace(/(\\s|%)/g,\"\").replace(c,\"\").replace(/,?\\);?$/,\"\").split(\",\"),b.length<3)return this._error();if(4===b.length&&(this.a(parseFloat(b.pop())),this.error))return this;for(var d=b.length-1;d>=0;d--)if(b[d]=parseInt(b[d],10),isNaN(b[d]))return this._error();return a.match(/^rgb/)?this.fromRgb({r:b[0],g:b[1],b:b[2]}):a.match(/^hsv/)?this.fromHsv({h:b[0],s:b[1],v:b[2]}):this.fromHsl({h:b[0],s:b[1],l:b[2]})}return this.fromHex(a)},fromRgb:function(a,c){return\"object\"!=typeof a||a.r===b||a.g===b||a.b===b?this._error():(this.error=!1,this.fromInt(parseInt((a.r<<16)+(a.g<<8)+a.b,10),c))},fromHex:function(a){return a=a.replace(/^#/,\"\").replace(/^0x/,\"\"),3===a.length&&(a=a[0]+a[0]+a[1]+a[1]+a[2]+a[2]),this.error=!/^[0-9A-F]{6}$/i.test(a),this.fromInt(parseInt(a,16))},fromHsl:function(a){var c,d,e,f,g,h,i,j;return\"object\"!=typeof a||a.h===b||a.s===b||a.l===b?this._error():(this._hsl=a,this._hSpace=\"hsl\",h=a.h/360,i=a.s/100,j=a.l/100,0===i?c=d=e=j:(f=j<.5?j*(1+i):j+i-j*i,g=2*j-f,c=this.hue2rgb(g,f,h+1/3),d=this.hue2rgb(g,f,h),e=this.hue2rgb(g,f,h-1/3)),this.fromRgb({r:255*c,g:255*d,b:255*e},!0))},fromHsv:function(a){var c,d,e,f,g,h,i,j,k,l,m;if(\"object\"!=typeof a||a.h===b||a.s===b||a.v===b)return this._error();switch(this._hsv=a,this._hSpace=\"hsv\",c=a.h/360,d=a.s/100,e=a.v/100,i=Math.floor(6*c),j=6*c-i,k=e*(1-d),l=e*(1-j*d),m=e*(1-(1-j)*d),i%6){case 0:f=e,g=m,h=k;break;case 1:f=l,g=e,h=k;break;case 2:f=k,g=e,h=m;break;case 3:f=k,g=l,h=e;break;case 4:f=m,g=k,h=e;break;case 5:f=e,g=k,h=l}return this.fromRgb({r:255*f,g:255*g,b:255*h},!0)},fromInt:function(a,c){return this._color=parseInt(a,10),isNaN(this._color)&&(this._color=0),this._color>16777215?this._color=16777215:this._color<0&&(this._color=0),c===b&&(this._hsv.h=this._hsv.s=this._hsl.h=this._hsl.s=0),this},hue2rgb:function(a,b,c){return c<0&&(c+=1),c>1&&(c-=1),c<1/6?a+6*(b-a)*c:c<.5?b:c<2/3?a+(b-a)*(2/3-c)*6:a},toString:function(){var a=parseInt(this._color,10).toString(16);if(this.error)return\"\";if(a.length<6)for(var b=6-a.length-1;b>=0;b--)a=\"0\"+a;return\"#\"+a},toCSS:function(a,b){switch(a=a||\"hex\",b=parseFloat(b||this._alpha),a){case\"rgb\":case\"rgba\":var c=this.toRgb();return b<1?\"rgba( \"+c.r+\", \"+c.g+\", \"+c.b+\", \"+b+\" )\":\"rgb( \"+c.r+\", \"+c.g+\", \"+c.b+\" )\";case\"hsl\":case\"hsla\":var d=this.toHsl();return b<1?\"hsla( \"+d.h+\", \"+d.s+\"%, \"+d.l+\"%, \"+b+\" )\":\"hsl( \"+d.h+\", \"+d.s+\"%, \"+d.l+\"% )\";default:return this.toString()}},toRgb:function(){return{r:255&this._color>>16,g:255&this._color>>8,b:255&this._color}},toHsl:function(){var a,b,c=this.toRgb(),d=c.r/255,e=c.g/255,f=c.b/255,g=Math.max(d,e,f),h=Math.min(d,e,f),i=(g+h)/2;if(g===h)a=b=0;else{var j=g-h;switch(b=i>.5?j/(2-g-h):j/(g+h),g){case d:a=(e-f)/j+(e<f?6:0);break;case e:a=(f-d)/j+2;break;case f:a=(d-e)/j+4}a/=6}return a=Math.round(360*a),0===a&&this._hsl.h!==a&&(a=this._hsl.h),b=Math.round(100*b),0===b&&this._hsl.s&&(b=this._hsl.s),{h:a,s:b,l:Math.round(100*i)}},toHsv:function(){var a,b,c=this.toRgb(),d=c.r/255,e=c.g/255,f=c.b/255,g=Math.max(d,e,f),h=Math.min(d,e,f),i=g,j=g-h;if(b=0===g?0:j/g,g===h)a=b=0;else{switch(g){case d:a=(e-f)/j+(e<f?6:0);break;case e:a=(f-d)/j+2;break;case f:a=(d-e)/j+4}a/=6}return a=Math.round(360*a),0===a&&this._hsv.h!==a&&(a=this._hsv.h),b=Math.round(100*b),0===b&&this._hsv.s&&(b=this._hsv.s),{h:a,s:b,v:Math.round(100*i)}},toInt:function(){return this._color},toIEOctoHex:function(){var a=this.toString(),b=parseInt(255*this._alpha,10).toString(16);return 1===b.length&&(b=\"0\"+b),\"#\"+b+a.replace(/^#/,\"\")},toLuminosity:function(){var a=this.toRgb(),b={};for(var c in a)if(a.hasOwnProperty(c)){var d=a[c]/255;b[c]=d<=.03928?d/12.92:Math.pow((d+.055)/1.055,2.4)}return.2126*b.r+.7152*b.g+.0722*b.b},getDistanceLuminosityFrom:function(a){if(!(a instanceof c))throw\"getDistanceLuminosityFrom requires a Color object\";var b=this.toLuminosity(),d=a.toLuminosity();return b>d?(b+.05)/(d+.05):(d+.05)/(b+.05)},getMaxContrastColor:function(){var a=this.getDistanceLuminosityFrom(new c(\"#000\")),b=this.getDistanceLuminosityFrom(new c(\"#fff\"));return new c(a>=b?\"#000\":\"#fff\")},getReadableContrastingColor:function(a,d){if(!(a instanceof c))return this;var e,f,g=d===b?5:d,h=a.getDistanceLuminosityFrom(this);if(h>=g)return this;if(e=a.getMaxContrastColor(),e.getDistanceLuminosityFrom(a)<=g)return e;for(f=0===e.toInt()?-1:1;h<g&&(this.l(f,!0),h=this.getDistanceLuminosityFrom(a),0!==this._color&&16777215!==this._color););return this},a:function(a){if(a===b)return this._alpha;var c=parseFloat(a);return isNaN(c)?this._error():(this._alpha=c,this)},darken:function(a){return a=a||5,this.l(-a,!0)},lighten:function(a){return a=a||5,this.l(a,!0)},saturate:function(a){return a=a||15,this.s(a,!0)},desaturate:function(a){return a=a||15,this.s(-a,!0)},toGrayscale:function(){return this.setHSpace(\"hsl\").s(0)},getComplement:function(){return this.h(180,!0)},getSplitComplement:function(a){a=a||1;var b=180+30*a;return this.h(b,!0)},getAnalog:function(a){a=a||1;var b=30*a;return this.h(b,!0)},getTetrad:function(a){a=a||1;var b=60*a;return this.h(b,!0)},getTriad:function(a){a=a||1;var b=120*a;return this.h(b,!0)},_partial:function(a){var c=d[a];return function(d,e){var f=this._spaceFunc(\"to\",c.space);return d===b?f[a]:(!0===e&&(d=f[a]+d),c.mod&&(d%=c.mod),c.range&&(d=d<c.range[0]?c.range[0]:d>c.range[1]?c.range[1]:d),f[a]=d,this._spaceFunc(\"from\",c.space,f))}},_spaceFunc:function(a,b,c){var d=b||this._hSpace;return this[a+d.charAt(0).toUpperCase()+d.substr(1)](c)}};var d={h:{mod:360},s:{range:[0,100]},l:{space:\"hsl\",range:[0,100]},v:{space:\"hsv\",range:[0,100]},r:{space:\"rgb\",range:[0,255]},g:{space:\"rgb\",range:[0,255]},b:{space:\"rgb\",range:[0,255]}};for(var e in d)d.hasOwnProperty(e)&&(c.fn[e]=c.fn._partial(e));\"object\"==typeof exports?module.exports=c:a.Color=c}(this);"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/accordion.js",
    "content": "/*!\n * jQuery UI Accordion 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Accordion\n//>>group: Widgets\n/* eslint-disable max-len */\n//>>description: Displays collapsible content panels for presenting information in a limited amount of space.\n/* eslint-enable max-len */\n//>>docs: http://api.jqueryui.com/accordion/\n//>>demos: http://jqueryui.com/accordion/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/accordion.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.widget( \"ui.accordion\", {\n\tversion: \"1.13.0\",\n\toptions: {\n\t\tactive: 0,\n\t\tanimate: {},\n\t\tclasses: {\n\t\t\t\"ui-accordion-header\": \"ui-corner-top\",\n\t\t\t\"ui-accordion-header-collapsed\": \"ui-corner-all\",\n\t\t\t\"ui-accordion-content\": \"ui-corner-bottom\"\n\t\t},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theader: function( elem ) {\n\t\t\treturn elem.find( \"> li > :first-child\" ).add( elem.find( \"> :not(li)\" ).even() );\n\t\t},\n\t\theightStyle: \"auto\",\n\t\ticons: {\n\t\t\tactiveHeader: \"ui-icon-triangle-1-s\",\n\t\t\theader: \"ui-icon-triangle-1-e\"\n\t\t},\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null\n\t},\n\n\thideProps: {\n\t\tborderTopWidth: \"hide\",\n\t\tborderBottomWidth: \"hide\",\n\t\tpaddingTop: \"hide\",\n\t\tpaddingBottom: \"hide\",\n\t\theight: \"hide\"\n\t},\n\n\tshowProps: {\n\t\tborderTopWidth: \"show\",\n\t\tborderBottomWidth: \"show\",\n\t\tpaddingTop: \"show\",\n\t\tpaddingBottom: \"show\",\n\t\theight: \"show\"\n\t},\n\n\t_create: function() {\n\t\tvar options = this.options;\n\n\t\tthis.prevShow = this.prevHide = $();\n\t\tthis._addClass( \"ui-accordion\", \"ui-widget ui-helper-reset\" );\n\t\tthis.element.attr( \"role\", \"tablist\" );\n\n\t\t// Don't allow collapsible: false and active: false / null\n\t\tif ( !options.collapsible && ( options.active === false || options.active == null ) ) {\n\t\t\toptions.active = 0;\n\t\t}\n\n\t\tthis._processPanels();\n\n\t\t// handle negative values\n\t\tif ( options.active < 0 ) {\n\t\t\toptions.active += this.headers.length;\n\t\t}\n\t\tthis._refresh();\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\theader: this.active,\n\t\t\tpanel: !this.active.length ? $() : this.active.next()\n\t\t};\n\t},\n\n\t_createIcons: function() {\n\t\tvar icon, children,\n\t\t\ticons = this.options.icons;\n\n\t\tif ( icons ) {\n\t\t\ticon = $( \"<span>\" );\n\t\t\tthis._addClass( icon, \"ui-accordion-header-icon\", \"ui-icon \" + icons.header );\n\t\t\ticon.prependTo( this.headers );\n\t\t\tchildren = this.active.children( \".ui-accordion-header-icon\" );\n\t\t\tthis._removeClass( children, icons.header )\n\t\t\t\t._addClass( children, null, icons.activeHeader )\n\t\t\t\t._addClass( this.headers, \"ui-accordion-icons\" );\n\t\t}\n\t},\n\n\t_destroyIcons: function() {\n\t\tthis._removeClass( this.headers, \"ui-accordion-icons\" );\n\t\tthis.headers.children( \".ui-accordion-header-icon\" ).remove();\n\t},\n\n\t_destroy: function() {\n\t\tvar contents;\n\n\t\t// Clean up main element\n\t\tthis.element.removeAttr( \"role\" );\n\n\t\t// Clean up headers\n\t\tthis.headers\n\t\t\t.removeAttr( \"role aria-expanded aria-selected aria-controls tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis._destroyIcons();\n\n\t\t// Clean up content panels\n\t\tcontents = this.headers.next()\n\t\t\t.css( \"display\", \"\" )\n\t\t\t.removeAttr( \"role aria-hidden aria-labelledby\" )\n\t\t\t.removeUniqueId();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tcontents.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tif ( this.options.event ) {\n\t\t\t\tthis._off( this.headers, this.options.event );\n\t\t\t}\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\t// Setting collapsible: false while collapsed; open first panel\n\t\tif ( key === \"collapsible\" && !value && this.options.active === false ) {\n\t\t\tthis._activate( 0 );\n\t\t}\n\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis._destroyIcons();\n\t\t\tif ( value ) {\n\t\t\t\tthis._createIcons();\n\t\t\t}\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.element.attr( \"aria-disabled\", value );\n\n\t\t// Support: IE8 Only\n\t\t// #5332 / #6059 - opacity doesn't cascade to positioned elements in IE\n\t\t// so we need to add the disabled class to the headers and panels\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t\tthis._toggleClass( this.headers.add( this.headers.next() ), null, \"ui-state-disabled\",\n\t\t\t!!value );\n\t},\n\n\t_keydown: function( event ) {\n\t\tif ( event.altKey || event.ctrlKey ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar keyCode = $.ui.keyCode,\n\t\t\tlength = this.headers.length,\n\t\t\tcurrentIndex = this.headers.index( event.target ),\n\t\t\ttoFocus = false;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.RIGHT:\n\t\tcase keyCode.DOWN:\n\t\t\ttoFocus = this.headers[ ( currentIndex + 1 ) % length ];\n\t\t\tbreak;\n\t\tcase keyCode.LEFT:\n\t\tcase keyCode.UP:\n\t\t\ttoFocus = this.headers[ ( currentIndex - 1 + length ) % length ];\n\t\t\tbreak;\n\t\tcase keyCode.SPACE:\n\t\tcase keyCode.ENTER:\n\t\t\tthis._eventHandler( event );\n\t\t\tbreak;\n\t\tcase keyCode.HOME:\n\t\t\ttoFocus = this.headers[ 0 ];\n\t\t\tbreak;\n\t\tcase keyCode.END:\n\t\t\ttoFocus = this.headers[ length - 1 ];\n\t\t\tbreak;\n\t\t}\n\n\t\tif ( toFocus ) {\n\t\t\t$( event.target ).attr( \"tabIndex\", -1 );\n\t\t\t$( toFocus ).attr( \"tabIndex\", 0 );\n\t\t\t$( toFocus ).trigger( \"focus\" );\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_panelKeyDown: function( event ) {\n\t\tif ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {\n\t\t\t$( event.currentTarget ).prev().trigger( \"focus\" );\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options;\n\t\tthis._processPanels();\n\n\t\t// Was collapsed or no panel\n\t\tif ( ( options.active === false && options.collapsible === true ) ||\n\t\t\t\t!this.headers.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\n\t\t// active false only when collapsible is true\n\t\t} else if ( options.active === false ) {\n\t\t\tthis._activate( 0 );\n\n\t\t// was active, but active panel is gone\n\t\t} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\n\t\t\t// all remaining panel are disabled\n\t\t\tif ( this.headers.length === this.headers.find( \".ui-state-disabled\" ).length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\n\t\t\t// activate previous panel\n\t\t\t} else {\n\t\t\t\tthis._activate( Math.max( 0, options.active - 1 ) );\n\t\t\t}\n\n\t\t// was active, active panel still exists\n\t\t} else {\n\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.headers.index( this.active );\n\t\t}\n\n\t\tthis._destroyIcons();\n\n\t\tthis._refresh();\n\t},\n\n\t_processPanels: function() {\n\t\tvar prevHeaders = this.headers,\n\t\t\tprevPanels = this.panels;\n\n\t\tif ( typeof this.options.header === \"function\" ) {\n\t\t\tthis.headers = this.options.header( this.element );\n\t\t} else {\n\t\t\tthis.headers = this.element.find( this.options.header );\n\t\t}\n\t\tthis._addClass( this.headers, \"ui-accordion-header ui-accordion-header-collapsed\",\n\t\t\t\"ui-state-default\" );\n\n\t\tthis.panels = this.headers.next().filter( \":not(.ui-accordion-content-active)\" ).hide();\n\t\tthis._addClass( this.panels, \"ui-accordion-content\", \"ui-helper-reset ui-widget-content\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevPanels ) {\n\t\t\tthis._off( prevHeaders.not( this.headers ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t_refresh: function() {\n\t\tvar maxHeight,\n\t\t\toptions = this.options,\n\t\t\theightStyle = options.heightStyle,\n\t\t\tparent = this.element.parent();\n\n\t\tthis.active = this._findActive( options.active );\n\t\tthis._addClass( this.active, \"ui-accordion-header-active\", \"ui-state-active\" )\n\t\t\t._removeClass( this.active, \"ui-accordion-header-collapsed\" );\n\t\tthis._addClass( this.active.next(), \"ui-accordion-content-active\" );\n\t\tthis.active.next().show();\n\n\t\tthis.headers\n\t\t\t.attr( \"role\", \"tab\" )\n\t\t\t.each( function() {\n\t\t\t\tvar header = $( this ),\n\t\t\t\t\theaderId = header.uniqueId().attr( \"id\" ),\n\t\t\t\t\tpanel = header.next(),\n\t\t\t\t\tpanelId = panel.uniqueId().attr( \"id\" );\n\t\t\t\theader.attr( \"aria-controls\", panelId );\n\t\t\t\tpanel.attr( \"aria-labelledby\", headerId );\n\t\t\t} )\n\t\t\t.next()\n\t\t\t\t.attr( \"role\", \"tabpanel\" );\n\n\t\tthis.headers\n\t\t\t.not( this.active )\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"false\",\n\t\t\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\t\ttabIndex: -1\n\t\t\t\t} )\n\t\t\t\t.next()\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t\t\t} )\n\t\t\t\t\t.hide();\n\n\t\t// Make sure at least one header is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.headers.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active.attr( {\n\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\ttabIndex: 0\n\t\t\t} )\n\t\t\t\t.next()\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t\t} );\n\t\t}\n\n\t\tthis._createIcons();\n\n\t\tthis._setupEvents( options.event );\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tthis.element.siblings( \":visible\" ).each( function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.headers.each( function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.headers.next()\n\t\t\t\t.each( function() {\n\t\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t\t} )\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.headers.next()\n\t\t\t\t.each( function() {\n\t\t\t\t\tvar isVisible = $( this ).is( \":visible\" );\n\t\t\t\t\tif ( !isVisible ) {\n\t\t\t\t\t\t$( this ).show();\n\t\t\t\t\t}\n\t\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).css( \"height\", \"\" ).height() );\n\t\t\t\t\tif ( !isVisible ) {\n\t\t\t\t\t\t$( this ).hide();\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.height( maxHeight );\n\t\t}\n\t},\n\n\t_activate: function( index ) {\n\t\tvar active = this._findActive( index )[ 0 ];\n\n\t\t// Trying to activate the already active panel\n\t\tif ( active === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Trying to collapse, simulate a click on the currently active header\n\t\tactive = active || this.active[ 0 ];\n\n\t\tthis._eventHandler( {\n\t\t\ttarget: active,\n\t\t\tcurrentTarget: active,\n\t\t\tpreventDefault: $.noop\n\t\t} );\n\t},\n\n\t_findActive: function( selector ) {\n\t\treturn typeof selector === \"number\" ? this.headers.eq( selector ) : $();\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {\n\t\t\tkeydown: \"_keydown\"\n\t\t};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t} );\n\t\t}\n\n\t\tthis._off( this.headers.add( this.headers.next() ) );\n\t\tthis._on( this.headers, events );\n\t\tthis._on( this.headers.next(), { keydown: \"_panelKeyDown\" } );\n\t\tthis._hoverable( this.headers );\n\t\tthis._focusable( this.headers );\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar activeChildren, clickedChildren,\n\t\t\toptions = this.options,\n\t\t\tactive = this.active,\n\t\t\tclicked = $( event.currentTarget ),\n\t\t\tclickedIsActive = clicked[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : clicked.next(),\n\t\t\ttoHide = active.next(),\n\t\t\teventData = {\n\t\t\t\toldHeader: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewHeader: collapsing ? $() : clicked,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif (\n\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.headers.index( clicked );\n\n\t\t// When the call to ._toggle() comes after the class changes\n\t\t// it causes a very odd bug in IE 8 (see #6720)\n\t\tthis.active = clickedIsActive ? $() : clicked;\n\t\tthis._toggle( eventData );\n\n\t\t// Switch classes\n\t\t// corner classes on the previously active header stay after the animation\n\t\tthis._removeClass( active, \"ui-accordion-header-active\", \"ui-state-active\" );\n\t\tif ( options.icons ) {\n\t\t\tactiveChildren = active.children( \".ui-accordion-header-icon\" );\n\t\t\tthis._removeClass( activeChildren, null, options.icons.activeHeader )\n\t\t\t\t._addClass( activeChildren, null, options.icons.header );\n\t\t}\n\n\t\tif ( !clickedIsActive ) {\n\t\t\tthis._removeClass( clicked, \"ui-accordion-header-collapsed\" )\n\t\t\t\t._addClass( clicked, \"ui-accordion-header-active\", \"ui-state-active\" );\n\t\t\tif ( options.icons ) {\n\t\t\t\tclickedChildren = clicked.children( \".ui-accordion-header-icon\" );\n\t\t\t\tthis._removeClass( clickedChildren, null, options.icons.header )\n\t\t\t\t\t._addClass( clickedChildren, null, options.icons.activeHeader );\n\t\t\t}\n\n\t\t\tthis._addClass( clicked.next(), \"ui-accordion-content-active\" );\n\t\t}\n\t},\n\n\t_toggle: function( data ) {\n\t\tvar toShow = data.newPanel,\n\t\t\ttoHide = this.prevShow.length ? this.prevShow : data.oldPanel;\n\n\t\t// Handle activating a panel during the animation for another activation\n\t\tthis.prevShow.add( this.prevHide ).stop( true, true );\n\t\tthis.prevShow = toShow;\n\t\tthis.prevHide = toHide;\n\n\t\tif ( this.options.animate ) {\n\t\t\tthis._animate( toShow, toHide, data );\n\t\t} else {\n\t\t\ttoHide.hide();\n\t\t\ttoShow.show();\n\t\t\tthis._toggleComplete( data );\n\t\t}\n\n\t\ttoHide.attr( {\n\t\t\t\"aria-hidden\": \"true\"\n\t\t} );\n\t\ttoHide.prev().attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t} );\n\n\t\t// if we're switching panels, remove the old header from the tab order\n\t\t// if we're opening from collapsed state, remove the previous header from the tab order\n\t\t// if we're collapsing, then keep the collapsing header in the tab order\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\ttoHide.prev().attr( {\n\t\t\t\t\"tabIndex\": -1,\n\t\t\t\t\"aria-expanded\": \"false\"\n\t\t\t} );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.headers.filter( function() {\n\t\t\t\treturn parseInt( $( this ).attr( \"tabIndex\" ), 10 ) === 0;\n\t\t\t} )\n\t\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow\n\t\t\t.attr( \"aria-hidden\", \"false\" )\n\t\t\t.prev()\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t} );\n\t},\n\n\t_animate: function( toShow, toHide, data ) {\n\t\tvar total, easing, duration,\n\t\t\tthat = this,\n\t\t\tadjust = 0,\n\t\t\tboxSizing = toShow.css( \"box-sizing\" ),\n\t\t\tdown = toShow.length &&\n\t\t\t\t( !toHide.length || ( toShow.index() < toHide.index() ) ),\n\t\t\tanimate = this.options.animate || {},\n\t\t\toptions = down && animate.down || animate,\n\t\t\tcomplete = function() {\n\t\t\t\tthat._toggleComplete( data );\n\t\t\t};\n\n\t\tif ( typeof options === \"number\" ) {\n\t\t\tduration = options;\n\t\t}\n\t\tif ( typeof options === \"string\" ) {\n\t\t\teasing = options;\n\t\t}\n\n\t\t// fall back from options to animation in case of partial down settings\n\t\teasing = easing || options.easing || animate.easing;\n\t\tduration = duration || options.duration || animate.duration;\n\n\t\tif ( !toHide.length ) {\n\t\t\treturn toShow.animate( this.showProps, duration, easing, complete );\n\t\t}\n\t\tif ( !toShow.length ) {\n\t\t\treturn toHide.animate( this.hideProps, duration, easing, complete );\n\t\t}\n\n\t\ttotal = toShow.show().outerHeight();\n\t\ttoHide.animate( this.hideProps, {\n\t\t\tduration: duration,\n\t\t\teasing: easing,\n\t\t\tstep: function( now, fx ) {\n\t\t\t\tfx.now = Math.round( now );\n\t\t\t}\n\t\t} );\n\t\ttoShow\n\t\t\t.hide()\n\t\t\t.animate( this.showProps, {\n\t\t\t\tduration: duration,\n\t\t\t\teasing: easing,\n\t\t\t\tcomplete: complete,\n\t\t\t\tstep: function( now, fx ) {\n\t\t\t\t\tfx.now = Math.round( now );\n\t\t\t\t\tif ( fx.prop !== \"height\" ) {\n\t\t\t\t\t\tif ( boxSizing === \"content-box\" ) {\n\t\t\t\t\t\t\tadjust += fx.now;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( that.options.heightStyle !== \"content\" ) {\n\t\t\t\t\t\tfx.now = Math.round( total - toHide.outerHeight() - adjust );\n\t\t\t\t\t\tadjust = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t},\n\n\t_toggleComplete: function( data ) {\n\t\tvar toHide = data.oldPanel,\n\t\t\tprev = toHide.prev();\n\n\t\tthis._removeClass( toHide, \"ui-accordion-content-active\" );\n\t\tthis._removeClass( prev, \"ui-accordion-header-active\" )\n\t\t\t._addClass( prev, \"ui-accordion-header-collapsed\" );\n\n\t\t// Work around for rendering bug in IE (#5421)\n\t\tif ( toHide.length ) {\n\t\t\ttoHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;\n\t\t}\n\t\tthis._trigger( \"activate\", null, data );\n\t}\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/autocomplete.js",
    "content": "/*!\n * jQuery UI Autocomplete 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Autocomplete\n//>>group: Widgets\n//>>description: Lists suggested words as the user is typing.\n//>>docs: http://api.jqueryui.com/autocomplete/\n//>>demos: http://jqueryui.com/autocomplete/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/autocomplete.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./menu\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )\n( function( $ ) {\n\"use strict\";\n\n$.widget( \"ui.autocomplete\", {\n\tversion: \"1.13.0\",\n\tdefaultElement: \"<input>\",\n\toptions: {\n\t\tappendTo: null,\n\t\tautoFocus: false,\n\t\tdelay: 300,\n\t\tminLength: 1,\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"none\"\n\t\t},\n\t\tsource: null,\n\n\t\t// Callbacks\n\t\tchange: null,\n\t\tclose: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresponse: null,\n\t\tsearch: null,\n\t\tselect: null\n\t},\n\n\trequestIndex: 0,\n\tpending: 0,\n\n\t_create: function() {\n\n\t\t// Some browsers only repeat keydown events, not keypress events,\n\t\t// so we use the suppressKeyPress flag to determine if we've already\n\t\t// handled the keydown event. #7269\n\t\t// Unfortunately the code for & in keypress is the same as the up arrow,\n\t\t// so we use the suppressKeyPressRepeat flag to avoid handling keypress\n\t\t// events when we know the keydown event was used to modify the\n\t\t// search term. #7799\n\t\tvar suppressKeyPress, suppressKeyPressRepeat, suppressInput,\n\t\t\tnodeName = this.element[ 0 ].nodeName.toLowerCase(),\n\t\t\tisTextarea = nodeName === \"textarea\",\n\t\t\tisInput = nodeName === \"input\";\n\n\t\t// Textareas are always multi-line\n\t\t// Inputs are always single-line, even if inside a contentEditable element\n\t\t// IE also treats inputs as contentEditable\n\t\t// All other element types are determined by whether or not they're contentEditable\n\t\tthis.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element );\n\n\t\tthis.valueMethod = this.element[ isTextarea || isInput ? \"val\" : \"text\" ];\n\t\tthis.isNewMenu = true;\n\n\t\tthis._addClass( \"ui-autocomplete-input\" );\n\t\tthis.element.attr( \"autocomplete\", \"off\" );\n\n\t\tthis._on( this.element, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\tif ( this.element.prop( \"readOnly\" ) ) {\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tsuppressInput = true;\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsuppressKeyPress = false;\n\t\t\t\tsuppressInput = false;\n\t\t\t\tsuppressKeyPressRepeat = false;\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ENTER:\n\n\t\t\t\t\t// when menu is open and has focus\n\t\t\t\t\tif ( this.menu.active ) {\n\n\t\t\t\t\t\t// #6055 - Opera still allows the keypress to occur\n\t\t\t\t\t\t// which causes forms to submit\n\t\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.TAB:\n\t\t\t\t\tif ( this.menu.active ) {\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ESCAPE:\n\t\t\t\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\t\t\t\tif ( !this.isMultiLine ) {\n\t\t\t\t\t\t\tthis._value( this.term );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.close( event );\n\n\t\t\t\t\t\t// Different browsers have different default behavior for escape\n\t\t\t\t\t\t// Single press can mean undo or clear\n\t\t\t\t\t\t// Double press in IE means clear the whole form\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\n\t\t\t\t\t// search timeout should be triggered before the input value is changed\n\t\t\t\t\tthis._searchTimeout( event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tkeypress: function( event ) {\n\t\t\t\tif ( suppressKeyPress ) {\n\t\t\t\t\tsuppressKeyPress = false;\n\t\t\t\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( suppressKeyPressRepeat ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Replicate some key handlers to allow them to repeat in Firefox and Opera\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tinput: function( event ) {\n\t\t\t\tif ( suppressInput ) {\n\t\t\t\t\tsuppressInput = false;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis._searchTimeout( event );\n\t\t\t},\n\t\t\tfocus: function() {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.previous = this._value();\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tclearTimeout( this.searching );\n\t\t\t\tthis.close( event );\n\t\t\t\tthis._change( event );\n\t\t\t}\n\t\t} );\n\n\t\tthis._initSource();\n\t\tthis.menu = $( \"<ul>\" )\n\t\t\t.appendTo( this._appendTo() )\n\t\t\t.menu( {\n\n\t\t\t\t// disable ARIA support, the live region takes care of that\n\t\t\t\trole: null\n\t\t\t} )\n\t\t\t.hide()\n\n\t\t\t// Support: IE 11 only, Edge <= 14\n\t\t\t// For other browsers, we preventDefault() on the mousedown event\n\t\t\t// to keep the dropdown from taking focus from the input. This doesn't\n\t\t\t// work for IE/Edge, causing problems with selection and scrolling (#9638)\n\t\t\t// Happily, IE and Edge support an \"unselectable\" attribute that\n\t\t\t// prevents an element from receiving focus, exactly what we want here.\n\t\t\t.attr( {\n\t\t\t\t\"unselectable\": \"on\"\n\t\t\t} )\n\t\t\t.menu( \"instance\" );\n\n\t\tthis._addClass( this.menu.element, \"ui-autocomplete\", \"ui-front\" );\n\t\tthis._on( this.menu.element, {\n\t\t\tmousedown: function( event ) {\n\n\t\t\t\t// Prevent moving focus out of the text field\n\t\t\t\tevent.preventDefault();\n\t\t\t},\n\t\t\tmenufocus: function( event, ui ) {\n\t\t\t\tvar label, item;\n\n\t\t\t\t// support: Firefox\n\t\t\t\t// Prevent accidental activation of menu items in Firefox (#7024 #9118)\n\t\t\t\tif ( this.isNewMenu ) {\n\t\t\t\t\tthis.isNewMenu = false;\n\t\t\t\t\tif ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis.menu.blur();\n\n\t\t\t\t\t\tthis.document.one( \"mousemove\", function() {\n\t\t\t\t\t\t\t$( event.target ).trigger( event.originalEvent );\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\titem = ui.item.data( \"ui-autocomplete-item\" );\n\t\t\t\tif ( false !== this._trigger( \"focus\", event, { item: item } ) ) {\n\n\t\t\t\t\t// use value to match what will end up in the input, if it was a key event\n\t\t\t\t\tif ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis._value( item.value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Announce the value in the liveRegion\n\t\t\t\tlabel = ui.item.attr( \"aria-label\" ) || item.value;\n\t\t\t\tif ( label && String.prototype.trim.call( label ).length ) {\n\t\t\t\t\tthis.liveRegion.children().hide();\n\t\t\t\t\t$( \"<div>\" ).text( label ).appendTo( this.liveRegion );\n\t\t\t\t}\n\t\t\t},\n\t\t\tmenuselect: function( event, ui ) {\n\t\t\t\tvar item = ui.item.data( \"ui-autocomplete-item\" ),\n\t\t\t\t\tprevious = this.previous;\n\n\t\t\t\t// Only trigger when focus was lost (click on menu)\n\t\t\t\tif ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {\n\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\tthis.previous = previous;\n\n\t\t\t\t\t// #6109 - IE triggers two focus events and the second\n\t\t\t\t\t// is asynchronous, so we need to reset the previous\n\t\t\t\t\t// term synchronously and asynchronously :-(\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t\tthis.selectedItem = item;\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tif ( false !== this._trigger( \"select\", event, { item: item } ) ) {\n\t\t\t\t\tthis._value( item.value );\n\t\t\t\t}\n\n\t\t\t\t// reset the term after the select event\n\t\t\t\t// this allows custom select handling to work properly\n\t\t\t\tthis.term = this._value();\n\n\t\t\t\tthis.close( event );\n\t\t\t\tthis.selectedItem = item;\n\t\t\t}\n\t\t} );\n\n\t\tthis.liveRegion = $( \"<div>\", {\n\t\t\trole: \"status\",\n\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\"aria-relevant\": \"additions\"\n\t\t} )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\n\t\tthis._addClass( this.liveRegion, null, \"ui-helper-hidden-accessible\" );\n\n\t\t// Turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_destroy: function() {\n\t\tclearTimeout( this.searching );\n\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\tthis.menu.element.remove();\n\t\tthis.liveRegion.remove();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"source\" ) {\n\t\t\tthis._initSource();\n\t\t}\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.menu.element.appendTo( this._appendTo() );\n\t\t}\n\t\tif ( key === \"disabled\" && value && this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\t},\n\n\t_isEventTargetInWidget: function( event ) {\n\t\tvar menuElement = this.menu.element[ 0 ];\n\n\t\treturn event.target === this.element[ 0 ] ||\n\t\t\tevent.target === menuElement ||\n\t\t\t$.contains( menuElement, event.target );\n\t},\n\n\t_closeOnClickOutside: function( event ) {\n\t\tif ( !this._isEventTargetInWidget( event ) ) {\n\t\t\tthis.close();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\n\t\tif ( element ) {\n\t\t\telement = element.jquery || element.nodeType ?\n\t\t\t\t$( element ) :\n\t\t\t\tthis.document.find( element ).eq( 0 );\n\t\t}\n\n\t\tif ( !element || !element[ 0 ] ) {\n\t\t\telement = this.element.closest( \".ui-front, dialog\" );\n\t\t}\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_initSource: function() {\n\t\tvar array, url,\n\t\t\tthat = this;\n\t\tif ( Array.isArray( this.options.source ) ) {\n\t\t\tarray = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tresponse( $.ui.autocomplete.filter( array, request.term ) );\n\t\t\t};\n\t\t} else if ( typeof this.options.source === \"string\" ) {\n\t\t\turl = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tif ( that.xhr ) {\n\t\t\t\t\tthat.xhr.abort();\n\t\t\t\t}\n\t\t\t\tthat.xhr = $.ajax( {\n\t\t\t\t\turl: url,\n\t\t\t\t\tdata: request,\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\tsuccess: function( data ) {\n\t\t\t\t\t\tresponse( data );\n\t\t\t\t\t},\n\t\t\t\t\terror: function() {\n\t\t\t\t\t\tresponse( [] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t};\n\t\t} else {\n\t\t\tthis.source = this.options.source;\n\t\t}\n\t},\n\n\t_searchTimeout: function( event ) {\n\t\tclearTimeout( this.searching );\n\t\tthis.searching = this._delay( function() {\n\n\t\t\t// Search if the value has changed, or if the user retypes the same value (see #7434)\n\t\t\tvar equalValues = this.term === this._value(),\n\t\t\t\tmenuVisible = this.menu.element.is( \":visible\" ),\n\t\t\t\tmodifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;\n\n\t\t\tif ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.search( null, event );\n\t\t\t}\n\t\t}, this.options.delay );\n\t},\n\n\tsearch: function( value, event ) {\n\t\tvalue = value != null ? value : this._value();\n\n\t\t// Always save the actual value, not the one passed as an argument\n\t\tthis.term = this._value();\n\n\t\tif ( value.length < this.options.minLength ) {\n\t\t\treturn this.close( event );\n\t\t}\n\n\t\tif ( this._trigger( \"search\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._search( value );\n\t},\n\n\t_search: function( value ) {\n\t\tthis.pending++;\n\t\tthis._addClass( \"ui-autocomplete-loading\" );\n\t\tthis.cancelSearch = false;\n\n\t\tthis.source( { term: value }, this._response() );\n\t},\n\n\t_response: function() {\n\t\tvar index = ++this.requestIndex;\n\n\t\treturn function( content ) {\n\t\t\tif ( index === this.requestIndex ) {\n\t\t\t\tthis.__response( content );\n\t\t\t}\n\n\t\t\tthis.pending--;\n\t\t\tif ( !this.pending ) {\n\t\t\t\tthis._removeClass( \"ui-autocomplete-loading\" );\n\t\t\t}\n\t\t}.bind( this );\n\t},\n\n\t__response: function( content ) {\n\t\tif ( content ) {\n\t\t\tcontent = this._normalize( content );\n\t\t}\n\t\tthis._trigger( \"response\", null, { content: content } );\n\t\tif ( !this.options.disabled && content && content.length && !this.cancelSearch ) {\n\t\t\tthis._suggest( content );\n\t\t\tthis._trigger( \"open\" );\n\t\t} else {\n\n\t\t\t// use ._close() instead of .close() so we don't cancel future searches\n\t\t\tthis._close();\n\t\t}\n\t},\n\n\tclose: function( event ) {\n\t\tthis.cancelSearch = true;\n\t\tthis._close( event );\n\t},\n\n\t_close: function( event ) {\n\n\t\t// Remove the handler that closes the menu on outside clicks\n\t\tthis._off( this.document, \"mousedown\" );\n\n\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.menu.element.hide();\n\t\t\tthis.menu.blur();\n\t\t\tthis.isNewMenu = true;\n\t\t\tthis._trigger( \"close\", event );\n\t\t}\n\t},\n\n\t_change: function( event ) {\n\t\tif ( this.previous !== this._value() ) {\n\t\t\tthis._trigger( \"change\", event, { item: this.selectedItem } );\n\t\t}\n\t},\n\n\t_normalize: function( items ) {\n\n\t\t// assume all items have the right format when the first item is complete\n\t\tif ( items.length && items[ 0 ].label && items[ 0 ].value ) {\n\t\t\treturn items;\n\t\t}\n\t\treturn $.map( items, function( item ) {\n\t\t\tif ( typeof item === \"string\" ) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: item,\n\t\t\t\t\tvalue: item\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn $.extend( {}, item, {\n\t\t\t\tlabel: item.label || item.value,\n\t\t\t\tvalue: item.value || item.label\n\t\t\t} );\n\t\t} );\n\t},\n\n\t_suggest: function( items ) {\n\t\tvar ul = this.menu.element.empty();\n\t\tthis._renderMenu( ul, items );\n\t\tthis.isNewMenu = true;\n\t\tthis.menu.refresh();\n\n\t\t// Size and position menu\n\t\tul.show();\n\t\tthis._resizeMenu();\n\t\tul.position( $.extend( {\n\t\t\tof: this.element\n\t\t}, this.options.position ) );\n\n\t\tif ( this.options.autoFocus ) {\n\t\t\tthis.menu.next();\n\t\t}\n\n\t\t// Listen for interactions outside of the widget (#6642)\n\t\tthis._on( this.document, {\n\t\t\tmousedown: \"_closeOnClickOutside\"\n\t\t} );\n\t},\n\n\t_resizeMenu: function() {\n\t\tvar ul = this.menu.element;\n\t\tul.outerWidth( Math.max(\n\n\t\t\t// Firefox wraps long text (possibly a rounding bug)\n\t\t\t// so we add 1px to avoid the wrapping (#7513)\n\t\t\tul.width( \"\" ).outerWidth() + 1,\n\t\t\tthis.element.outerWidth()\n\t\t) );\n\t},\n\n\t_renderMenu: function( ul, items ) {\n\t\tvar that = this;\n\t\t$.each( items, function( index, item ) {\n\t\t\tthat._renderItemData( ul, item );\n\t\t} );\n\t},\n\n\t_renderItemData: function( ul, item ) {\n\t\treturn this._renderItem( ul, item ).data( \"ui-autocomplete-item\", item );\n\t},\n\n\t_renderItem: function( ul, item ) {\n\t\treturn $( \"<li>\" )\n\t\t\t.append( $( \"<div>\" ).text( item.label ) )\n\t\t\t.appendTo( ul );\n\t},\n\n\t_move: function( direction, event ) {\n\t\tif ( !this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.search( null, event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.menu.isFirstItem() && /^previous/.test( direction ) ||\n\t\t\t\tthis.menu.isLastItem() && /^next/.test( direction ) ) {\n\n\t\t\tif ( !this.isMultiLine ) {\n\t\t\t\tthis._value( this.term );\n\t\t\t}\n\n\t\t\tthis.menu.blur();\n\t\t\treturn;\n\t\t}\n\t\tthis.menu[ direction ]( event );\n\t},\n\n\twidget: function() {\n\t\treturn this.menu.element;\n\t},\n\n\t_value: function() {\n\t\treturn this.valueMethod.apply( this.element, arguments );\n\t},\n\n\t_keyEvent: function( keyEvent, event ) {\n\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis._move( keyEvent, event );\n\n\t\t\t// Prevents moving cursor to beginning/end of the text field in some browsers\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t// Support: Chrome <=50\n\t// We should be able to just use this.element.prop( \"isContentEditable\" )\n\t// but hidden elements always report false in Chrome.\n\t// https://code.google.com/p/chromium/issues/detail?id=313082\n\t_isContentEditable: function( element ) {\n\t\tif ( !element.length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar editable = element.prop( \"contentEditable\" );\n\n\t\tif ( editable === \"inherit\" ) {\n\t\t\treturn this._isContentEditable( element.parent() );\n\t\t}\n\n\t\treturn editable === \"true\";\n\t}\n} );\n\n$.extend( $.ui.autocomplete, {\n\tescapeRegex: function( value ) {\n\t\treturn value.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" );\n\t},\n\tfilter: function( array, term ) {\n\t\tvar matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), \"i\" );\n\t\treturn $.grep( array, function( value ) {\n\t\t\treturn matcher.test( value.label || value.value || value );\n\t\t} );\n\t}\n} );\n\n// Live region extension, adding a `messages` option\n// NOTE: This is an experimental API. We are still investigating\n// a full solution for string manipulation and internationalization.\n$.widget( \"ui.autocomplete\", $.ui.autocomplete, {\n\toptions: {\n\t\tmessages: {\n\t\t\tnoResults: \"No search results.\",\n\t\t\tresults: function( amount ) {\n\t\t\t\treturn amount + ( amount > 1 ? \" results are\" : \" result is\" ) +\n\t\t\t\t\t\" available, use up and down arrow keys to navigate.\";\n\t\t\t}\n\t\t}\n\t},\n\n\t__response: function( content ) {\n\t\tvar message;\n\t\tthis._superApply( arguments );\n\t\tif ( this.options.disabled || this.cancelSearch ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( content && content.length ) {\n\t\t\tmessage = this.options.messages.results( content.length );\n\t\t} else {\n\t\t\tmessage = this.options.messages.noResults;\n\t\t}\n\t\tthis.liveRegion.children().hide();\n\t\t$( \"<div>\" ).text( message ).appendTo( this.liveRegion );\n\t}\n} );\n\nreturn $.ui.autocomplete;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/button.js",
    "content": "/*!\n * jQuery UI Button 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Button\n//>>group: Widgets\n//>>description: Enhances a form with themeable buttons.\n//>>docs: http://api.jqueryui.com/button/\n//>>demos: http://jqueryui.com/button/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/button.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\n\t\t\t// These are only for backcompat\n\t\t\t// TODO: Remove after 1.12\n\t\t\t\"./controlgroup\",\n\t\t\t\"./checkboxradio\",\n\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.widget( \"ui.button\", {\n\tversion: \"1.13.0\",\n\tdefaultElement: \"<button>\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-button\": \"ui-corner-all\"\n\t\t},\n\t\tdisabled: null,\n\t\ticon: null,\n\t\ticonPosition: \"beginning\",\n\t\tlabel: null,\n\t\tshowLabel: true\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar disabled,\n\n\t\t\t// This is to support cases like in jQuery Mobile where the base widget does have\n\t\t\t// an implementation of _getCreateOptions\n\t\t\toptions = this._super() || {};\n\n\t\tthis.isInput = this.element.is( \"input\" );\n\n\t\tdisabled = this.element[ 0 ].disabled;\n\t\tif ( disabled != null ) {\n\t\t\toptions.disabled = disabled;\n\t\t}\n\n\t\tthis.originalLabel = this.isInput ? this.element.val() : this.element.html();\n\t\tif ( this.originalLabel ) {\n\t\t\toptions.label = this.originalLabel;\n\t\t}\n\n\t\treturn options;\n\t},\n\n\t_create: function() {\n\t\tif ( !this.option.showLabel & !this.options.icon ) {\n\t\t\tthis.options.showLabel = true;\n\t\t}\n\n\t\t// We have to check the option again here even though we did in _getCreateOptions,\n\t\t// because null may have been passed on init which would override what was set in\n\t\t// _getCreateOptions\n\t\tif ( this.options.disabled == null ) {\n\t\t\tthis.options.disabled = this.element[ 0 ].disabled || false;\n\t\t}\n\n\t\tthis.hasTitle = !!this.element.attr( \"title\" );\n\n\t\t// Check to see if the label needs to be set or if its already correct\n\t\tif ( this.options.label && this.options.label !== this.originalLabel ) {\n\t\t\tif ( this.isInput ) {\n\t\t\t\tthis.element.val( this.options.label );\n\t\t\t} else {\n\t\t\t\tthis.element.html( this.options.label );\n\t\t\t}\n\t\t}\n\t\tthis._addClass( \"ui-button\", \"ui-widget\" );\n\t\tthis._setOption( \"disabled\", this.options.disabled );\n\t\tthis._enhance();\n\n\t\tif ( this.element.is( \"a\" ) ) {\n\t\t\tthis._on( {\n\t\t\t\t\"keyup\": function( event ) {\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE ) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: PhantomJS <= 1.9, IE 8 Only\n\t\t\t\t\t\t// If a native click is available use it so we actually cause navigation\n\t\t\t\t\t\t// otherwise just trigger a click event\n\t\t\t\t\t\tif ( this.element[ 0 ].click ) {\n\t\t\t\t\t\t\tthis.element[ 0 ].click();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.element.trigger( \"click\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t},\n\n\t_enhance: function() {\n\t\tif ( !this.element.is( \"button\" ) ) {\n\t\t\tthis.element.attr( \"role\", \"button\" );\n\t\t}\n\n\t\tif ( this.options.icon ) {\n\t\t\tthis._updateIcon( \"icon\", this.options.icon );\n\t\t\tthis._updateTooltip();\n\t\t}\n\t},\n\n\t_updateTooltip: function() {\n\t\tthis.title = this.element.attr( \"title\" );\n\n\t\tif ( !this.options.showLabel && !this.title ) {\n\t\t\tthis.element.attr( \"title\", this.options.label );\n\t\t}\n\t},\n\n\t_updateIcon: function( option, value ) {\n\t\tvar icon = option !== \"iconPosition\",\n\t\t\tposition = icon ? this.options.iconPosition : value,\n\t\t\tdisplayBlock = position === \"top\" || position === \"bottom\";\n\n\t\t// Create icon\n\t\tif ( !this.icon ) {\n\t\t\tthis.icon = $( \"<span>\" );\n\n\t\t\tthis._addClass( this.icon, \"ui-button-icon\", \"ui-icon\" );\n\n\t\t\tif ( !this.options.showLabel ) {\n\t\t\t\tthis._addClass( \"ui-button-icon-only\" );\n\t\t\t}\n\t\t} else if ( icon ) {\n\n\t\t\t// If we are updating the icon remove the old icon class\n\t\t\tthis._removeClass( this.icon, null, this.options.icon );\n\t\t}\n\n\t\t// If we are updating the icon add the new icon class\n\t\tif ( icon ) {\n\t\t\tthis._addClass( this.icon, null, value );\n\t\t}\n\n\t\tthis._attachIcon( position );\n\n\t\t// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove\n\t\t// the iconSpace if there is one.\n\t\tif ( displayBlock ) {\n\t\t\tthis._addClass( this.icon, null, \"ui-widget-icon-block\" );\n\t\t\tif ( this.iconSpace ) {\n\t\t\t\tthis.iconSpace.remove();\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Position is beginning or end so remove the ui-widget-icon-block class and add the\n\t\t\t// space if it does not exist\n\t\t\tif ( !this.iconSpace ) {\n\t\t\t\tthis.iconSpace = $( \"<span> </span>\" );\n\t\t\t\tthis._addClass( this.iconSpace, \"ui-button-icon-space\" );\n\t\t\t}\n\t\t\tthis._removeClass( this.icon, null, \"ui-wiget-icon-block\" );\n\t\t\tthis._attachIconSpace( position );\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tthis.element.removeAttr( \"role\" );\n\n\t\tif ( this.icon ) {\n\t\t\tthis.icon.remove();\n\t\t}\n\t\tif ( this.iconSpace ) {\n\t\t\tthis.iconSpace.remove();\n\t\t}\n\t\tif ( !this.hasTitle ) {\n\t\t\tthis.element.removeAttr( \"title\" );\n\t\t}\n\t},\n\n\t_attachIconSpace: function( iconPosition ) {\n\t\tthis.icon[ /^(?:end|bottom)/.test( iconPosition ) ? \"before\" : \"after\" ]( this.iconSpace );\n\t},\n\n\t_attachIcon: function( iconPosition ) {\n\t\tthis.element[ /^(?:end|bottom)/.test( iconPosition ) ? \"append\" : \"prepend\" ]( this.icon );\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar newShowLabel = options.showLabel === undefined ?\n\t\t\t\tthis.options.showLabel :\n\t\t\t\toptions.showLabel,\n\t\t\tnewIcon = options.icon === undefined ? this.options.icon : options.icon;\n\n\t\tif ( !newShowLabel && !newIcon ) {\n\t\t\toptions.showLabel = true;\n\t\t}\n\t\tthis._super( options );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icon\" ) {\n\t\t\tif ( value ) {\n\t\t\t\tthis._updateIcon( key, value );\n\t\t\t} else if ( this.icon ) {\n\t\t\t\tthis.icon.remove();\n\t\t\t\tif ( this.iconSpace ) {\n\t\t\t\t\tthis.iconSpace.remove();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"iconPosition\" ) {\n\t\t\tthis._updateIcon( key, value );\n\t\t}\n\n\t\t// Make sure we can't end up with a button that has neither text nor icon\n\t\tif ( key === \"showLabel\" ) {\n\t\t\t\tthis._toggleClass( \"ui-button-icon-only\", null, !value );\n\t\t\t\tthis._updateTooltip();\n\t\t}\n\n\t\tif ( key === \"label\" ) {\n\t\t\tif ( this.isInput ) {\n\t\t\t\tthis.element.val( value );\n\t\t\t} else {\n\n\t\t\t\t// If there is an icon, append it, else nothing then append the value\n\t\t\t\t// this avoids removal of the icon when setting label text\n\t\t\t\tthis.element.html( value );\n\t\t\t\tif ( this.icon ) {\n\t\t\t\t\tthis._attachIcon( this.options.iconPosition );\n\t\t\t\t\tthis._attachIconSpace( this.options.iconPosition );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._toggleClass( null, \"ui-state-disabled\", value );\n\t\t\tthis.element[ 0 ].disabled = value;\n\t\t\tif ( value ) {\n\t\t\t\tthis.element.trigger( \"blur\" );\n\t\t\t}\n\t\t}\n\t},\n\n\trefresh: function() {\n\n\t\t// Make sure to only check disabled if its an element that supports this otherwise\n\t\t// check for the disabled class to determine state\n\t\tvar isDisabled = this.element.is( \"input, button\" ) ?\n\t\t\tthis.element[ 0 ].disabled : this.element.hasClass( \"ui-button-disabled\" );\n\n\t\tif ( isDisabled !== this.options.disabled ) {\n\t\t\tthis._setOptions( { disabled: isDisabled } );\n\t\t}\n\n\t\tthis._updateTooltip();\n\t}\n} );\n\n// DEPRECATED\nif ( $.uiBackCompat !== false ) {\n\n\t// Text and Icons options\n\t$.widget( \"ui.button\", $.ui.button, {\n\t\toptions: {\n\t\t\ttext: true,\n\t\t\ticons: {\n\t\t\t\tprimary: null,\n\t\t\t\tsecondary: null\n\t\t\t}\n\t\t},\n\n\t\t_create: function() {\n\t\t\tif ( this.options.showLabel && !this.options.text ) {\n\t\t\t\tthis.options.showLabel = this.options.text;\n\t\t\t}\n\t\t\tif ( !this.options.showLabel && this.options.text ) {\n\t\t\t\tthis.options.text = this.options.showLabel;\n\t\t\t}\n\t\t\tif ( !this.options.icon && ( this.options.icons.primary ||\n\t\t\t\t\tthis.options.icons.secondary ) ) {\n\t\t\t\tif ( this.options.icons.primary ) {\n\t\t\t\t\tthis.options.icon = this.options.icons.primary;\n\t\t\t\t} else {\n\t\t\t\t\tthis.options.icon = this.options.icons.secondary;\n\t\t\t\t\tthis.options.iconPosition = \"end\";\n\t\t\t\t}\n\t\t\t} else if ( this.options.icon ) {\n\t\t\t\tthis.options.icons.primary = this.options.icon;\n\t\t\t}\n\t\t\tthis._super();\n\t\t},\n\n\t\t_setOption: function( key, value ) {\n\t\t\tif ( key === \"text\" ) {\n\t\t\t\tthis._super( \"showLabel\", value );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( key === \"showLabel\" ) {\n\t\t\t\tthis.options.text = value;\n\t\t\t}\n\t\t\tif ( key === \"icon\" ) {\n\t\t\t\tthis.options.icons.primary = value;\n\t\t\t}\n\t\t\tif ( key === \"icons\" ) {\n\t\t\t\tif ( value.primary ) {\n\t\t\t\t\tthis._super( \"icon\", value.primary );\n\t\t\t\t\tthis._super( \"iconPosition\", \"beginning\" );\n\t\t\t\t} else if ( value.secondary ) {\n\t\t\t\t\tthis._super( \"icon\", value.secondary );\n\t\t\t\t\tthis._super( \"iconPosition\", \"end\" );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._superApply( arguments );\n\t\t}\n\t} );\n\n\t$.fn.button = ( function( orig ) {\n\t\treturn function( options ) {\n\t\t\tvar isMethodCall = typeof options === \"string\";\n\t\t\tvar args = Array.prototype.slice.call( arguments, 1 );\n\t\t\tvar returnValue = this;\n\n\t\t\tif ( isMethodCall ) {\n\n\t\t\t\t// If this is an empty collection, we need to have the instance method\n\t\t\t\t// return undefined instead of the jQuery instance\n\t\t\t\tif ( !this.length && options === \"instance\" ) {\n\t\t\t\t\treturnValue = undefined;\n\t\t\t\t} else {\n\t\t\t\t\tthis.each( function() {\n\t\t\t\t\t\tvar methodValue;\n\t\t\t\t\t\tvar type = $( this ).attr( \"type\" );\n\t\t\t\t\t\tvar name = type !== \"checkbox\" && type !== \"radio\" ?\n\t\t\t\t\t\t\t\"button\" :\n\t\t\t\t\t\t\t\"checkboxradio\";\n\t\t\t\t\t\tvar instance = $.data( this, \"ui-\" + name );\n\n\t\t\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\t\t\treturnValue = instance;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\t\treturn $.error( \"cannot call methods on button\" +\n\t\t\t\t\t\t\t\t\" prior to initialization; \" +\n\t\t\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( typeof instance[ options ] !== \"function\" ||\n\t\t\t\t\t\t\toptions.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for button\" +\n\t\t\t\t\t\t\t\t\" widget instance\" );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\n\t\t\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\t\t\tmethodValue;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Allow multiple hashes to be passed on init\n\t\t\t\tif ( args.length ) {\n\t\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\n\t\t\t\t}\n\n\t\t\t\tthis.each( function() {\n\t\t\t\t\tvar type = $( this ).attr( \"type\" );\n\t\t\t\t\tvar name = type !== \"checkbox\" && type !== \"radio\" ? \"button\" : \"checkboxradio\";\n\t\t\t\t\tvar instance = $.data( this, \"ui-\" + name );\n\n\t\t\t\t\tif ( instance ) {\n\t\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( name === \"button\" ) {\n\t\t\t\t\t\t\torig.call( $( this ), options );\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$( this ).checkboxradio( $.extend( { icon: false }, options ) );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn returnValue;\n\t\t};\n\t} )( $.fn.button );\n\n\t$.fn.buttonset = function() {\n\t\tif ( !$.ui.controlgroup ) {\n\t\t\t$.error( \"Controlgroup widget missing\" );\n\t\t}\n\t\tif ( arguments[ 0 ] === \"option\" && arguments[ 1 ] === \"items\" && arguments[ 2 ] ) {\n\t\t\treturn this.controlgroup.apply( this,\n\t\t\t\t[ arguments[ 0 ], \"items.button\", arguments[ 2 ] ] );\n\t\t}\n\t\tif ( arguments[ 0 ] === \"option\" && arguments[ 1 ] === \"items\" ) {\n\t\t\treturn this.controlgroup.apply( this, [ arguments[ 0 ], \"items.button\" ] );\n\t\t}\n\t\tif ( typeof arguments[ 0 ] === \"object\" && arguments[ 0 ].items ) {\n\t\t\targuments[ 0 ].items = {\n\t\t\t\tbutton: arguments[ 0 ].items\n\t\t\t};\n\t\t}\n\t\treturn this.controlgroup.apply( this, arguments );\n\t};\n}\n\nreturn $.ui.button;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/checkboxradio.js",
    "content": "/*!\n * jQuery UI Checkboxradio 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Checkboxradio\n//>>group: Widgets\n//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.\n//>>docs: http://api.jqueryui.com/checkboxradio/\n//>>demos: http://jqueryui.com/checkboxradio/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/button.css\n//>>css.structure: ../../themes/base/checkboxradio.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.widget( \"ui.checkboxradio\", [ $.ui.formResetMixin, {\n\tversion: \"1.13.0\",\n\toptions: {\n\t\tdisabled: null,\n\t\tlabel: null,\n\t\ticon: true,\n\t\tclasses: {\n\t\t\t\"ui-checkboxradio-label\": \"ui-corner-all\",\n\t\t\t\"ui-checkboxradio-icon\": \"ui-corner-all\"\n\t\t}\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar disabled, labels;\n\t\tvar that = this;\n\t\tvar options = this._super() || {};\n\n\t\t// We read the type here, because it makes more sense to throw a element type error first,\n\t\t// rather then the error for lack of a label. Often if its the wrong type, it\n\t\t// won't have a label (e.g. calling on a div, btn, etc)\n\t\tthis._readType();\n\n\t\tlabels = this.element.labels();\n\n\t\t// If there are multiple labels, use the last one\n\t\tthis.label = $( labels[ labels.length - 1 ] );\n\t\tif ( !this.label.length ) {\n\t\t\t$.error( \"No label found for checkboxradio widget\" );\n\t\t}\n\n\t\tthis.originalLabel = \"\";\n\n\t\t// We need to get the label text but this may also need to make sure it does not contain the\n\t\t// input itself.\n\t\tthis.label.contents().not( this.element[ 0 ] ).each( function() {\n\n\t\t\t// The label contents could be text, html, or a mix. We concat each element to get a\n\t\t\t// string representation of the label, without the input as part of it.\n\t\t\tthat.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML;\n\t\t} );\n\n\t\t// Set the label option if we found label text\n\t\tif ( this.originalLabel ) {\n\t\t\toptions.label = this.originalLabel;\n\t\t}\n\n\t\tdisabled = this.element[ 0 ].disabled;\n\t\tif ( disabled != null ) {\n\t\t\toptions.disabled = disabled;\n\t\t}\n\t\treturn options;\n\t},\n\n\t_create: function() {\n\t\tvar checked = this.element[ 0 ].checked;\n\n\t\tthis._bindFormResetHandler();\n\n\t\tif ( this.options.disabled == null ) {\n\t\t\tthis.options.disabled = this.element[ 0 ].disabled;\n\t\t}\n\n\t\tthis._setOption( \"disabled\", this.options.disabled );\n\t\tthis._addClass( \"ui-checkboxradio\", \"ui-helper-hidden-accessible\" );\n\t\tthis._addClass( this.label, \"ui-checkboxradio-label\", \"ui-button ui-widget\" );\n\n\t\tif ( this.type === \"radio\" ) {\n\t\t\tthis._addClass( this.label, \"ui-checkboxradio-radio-label\" );\n\t\t}\n\n\t\tif ( this.options.label && this.options.label !== this.originalLabel ) {\n\t\t\tthis._updateLabel();\n\t\t} else if ( this.originalLabel ) {\n\t\t\tthis.options.label = this.originalLabel;\n\t\t}\n\n\t\tthis._enhance();\n\n\t\tif ( checked ) {\n\t\t\tthis._addClass( this.label, \"ui-checkboxradio-checked\", \"ui-state-active\" );\n\t\t}\n\n\t\tthis._on( {\n\t\t\tchange: \"_toggleClasses\",\n\t\t\tfocus: function() {\n\t\t\t\tthis._addClass( this.label, null, \"ui-state-focus ui-visual-focus\" );\n\t\t\t},\n\t\t\tblur: function() {\n\t\t\t\tthis._removeClass( this.label, null, \"ui-state-focus ui-visual-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_readType: function() {\n\t\tvar nodeName = this.element[ 0 ].nodeName.toLowerCase();\n\t\tthis.type = this.element[ 0 ].type;\n\t\tif ( nodeName !== \"input\" || !/radio|checkbox/.test( this.type ) ) {\n\t\t\t$.error( \"Can't create checkboxradio on element.nodeName=\" + nodeName +\n\t\t\t\t\" and element.type=\" + this.type );\n\t\t}\n\t},\n\n\t// Support jQuery Mobile enhanced option\n\t_enhance: function() {\n\t\tthis._updateIcon( this.element[ 0 ].checked );\n\t},\n\n\twidget: function() {\n\t\treturn this.label;\n\t},\n\n\t_getRadioGroup: function() {\n\t\tvar group;\n\t\tvar name = this.element[ 0 ].name;\n\t\tvar nameSelector = \"input[name='\" + $.escapeSelector( name ) + \"']\";\n\n\t\tif ( !name ) {\n\t\t\treturn $( [] );\n\t\t}\n\n\t\tif ( this.form.length ) {\n\t\t\tgroup = $( this.form[ 0 ].elements ).filter( nameSelector );\n\t\t} else {\n\n\t\t\t// Not inside a form, check all inputs that also are not inside a form\n\t\t\tgroup = $( nameSelector ).filter( function() {\n\t\t\t\treturn $( this )._form().length === 0;\n\t\t\t} );\n\t\t}\n\n\t\treturn group.not( this.element );\n\t},\n\n\t_toggleClasses: function() {\n\t\tvar checked = this.element[ 0 ].checked;\n\t\tthis._toggleClass( this.label, \"ui-checkboxradio-checked\", \"ui-state-active\", checked );\n\n\t\tif ( this.options.icon && this.type === \"checkbox\" ) {\n\t\t\tthis._toggleClass( this.icon, null, \"ui-icon-check ui-state-checked\", checked )\n\t\t\t\t._toggleClass( this.icon, null, \"ui-icon-blank\", !checked );\n\t\t}\n\n\t\tif ( this.type === \"radio\" ) {\n\t\t\tthis._getRadioGroup()\n\t\t\t\t.each( function() {\n\t\t\t\t\tvar instance = $( this ).checkboxradio( \"instance\" );\n\n\t\t\t\t\tif ( instance ) {\n\t\t\t\t\t\tinstance._removeClass( instance.label,\n\t\t\t\t\t\t\t\"ui-checkboxradio-checked\", \"ui-state-active\" );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tthis._unbindFormResetHandler();\n\n\t\tif ( this.icon ) {\n\t\t\tthis.icon.remove();\n\t\t\tthis.iconSpace.remove();\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\n\t\t// We don't allow the value to be set to nothing\n\t\tif ( key === \"label\" && !value ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._toggleClass( this.label, null, \"ui-state-disabled\", value );\n\t\t\tthis.element[ 0 ].disabled = value;\n\n\t\t\t// Don't refresh when setting disabled\n\t\t\treturn;\n\t\t}\n\t\tthis.refresh();\n\t},\n\n\t_updateIcon: function( checked ) {\n\t\tvar toAdd = \"ui-icon ui-icon-background \";\n\n\t\tif ( this.options.icon ) {\n\t\t\tif ( !this.icon ) {\n\t\t\t\tthis.icon = $( \"<span>\" );\n\t\t\t\tthis.iconSpace = $( \"<span> </span>\" );\n\t\t\t\tthis._addClass( this.iconSpace, \"ui-checkboxradio-icon-space\" );\n\t\t\t}\n\n\t\t\tif ( this.type === \"checkbox\" ) {\n\t\t\t\ttoAdd += checked ? \"ui-icon-check ui-state-checked\" : \"ui-icon-blank\";\n\t\t\t\tthis._removeClass( this.icon, null, checked ? \"ui-icon-blank\" : \"ui-icon-check\" );\n\t\t\t} else {\n\t\t\t\ttoAdd += \"ui-icon-blank\";\n\t\t\t}\n\t\t\tthis._addClass( this.icon, \"ui-checkboxradio-icon\", toAdd );\n\t\t\tif ( !checked ) {\n\t\t\t\tthis._removeClass( this.icon, null, \"ui-icon-check ui-state-checked\" );\n\t\t\t}\n\t\t\tthis.icon.prependTo( this.label ).after( this.iconSpace );\n\t\t} else if ( this.icon !== undefined ) {\n\t\t\tthis.icon.remove();\n\t\t\tthis.iconSpace.remove();\n\t\t\tdelete this.icon;\n\t\t}\n\t},\n\n\t_updateLabel: function() {\n\n\t\t// Remove the contents of the label ( minus the icon, icon space, and input )\n\t\tvar contents = this.label.contents().not( this.element[ 0 ] );\n\t\tif ( this.icon ) {\n\t\t\tcontents = contents.not( this.icon[ 0 ] );\n\t\t}\n\t\tif ( this.iconSpace ) {\n\t\t\tcontents = contents.not( this.iconSpace[ 0 ] );\n\t\t}\n\t\tcontents.remove();\n\n\t\tthis.label.append( this.options.label );\n\t},\n\n\trefresh: function() {\n\t\tvar checked = this.element[ 0 ].checked,\n\t\t\tisDisabled = this.element[ 0 ].disabled;\n\n\t\tthis._updateIcon( checked );\n\t\tthis._toggleClass( this.label, \"ui-checkboxradio-checked\", \"ui-state-active\", checked );\n\t\tif ( this.options.label !== null ) {\n\t\t\tthis._updateLabel();\n\t\t}\n\n\t\tif ( isDisabled !== this.options.disabled ) {\n\t\t\tthis._setOptions( { \"disabled\": isDisabled } );\n\t\t}\n\t}\n\n} ] );\n\nreturn $.ui.checkboxradio;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/controlgroup.js",
    "content": "/*!\n * jQuery UI Controlgroup 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Controlgroup\n//>>group: Widgets\n//>>description: Visually groups form control widgets\n//>>docs: http://api.jqueryui.com/controlgroup/\n//>>demos: http://jqueryui.com/controlgroup/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/controlgroup.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nvar controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;\n\nreturn $.widget( \"ui.controlgroup\", {\n\tversion: \"1.13.0\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdirection: \"horizontal\",\n\t\tdisabled: null,\n\t\tonlyVisible: true,\n\t\titems: {\n\t\t\t\"button\": \"input[type=button], input[type=submit], input[type=reset], button, a\",\n\t\t\t\"controlgroupLabel\": \".ui-controlgroup-label\",\n\t\t\t\"checkboxradio\": \"input[type='checkbox'], input[type='radio']\",\n\t\t\t\"selectmenu\": \"select\",\n\t\t\t\"spinner\": \".ui-spinner-input\"\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._enhance();\n\t},\n\n\t// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation\n\t_enhance: function() {\n\t\tthis.element.attr( \"role\", \"toolbar\" );\n\t\tthis.refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis._callChildMethod( \"destroy\" );\n\t\tthis.childWidgets.removeData( \"ui-controlgroup-data\" );\n\t\tthis.element.removeAttr( \"role\" );\n\t\tif ( this.options.items.controlgroupLabel ) {\n\t\t\tthis.element\n\t\t\t\t.find( this.options.items.controlgroupLabel )\n\t\t\t\t.find( \".ui-controlgroup-label-contents\" )\n\t\t\t\t.contents().unwrap();\n\t\t}\n\t},\n\n\t_initWidgets: function() {\n\t\tvar that = this,\n\t\t\tchildWidgets = [];\n\n\t\t// First we iterate over each of the items options\n\t\t$.each( this.options.items, function( widget, selector ) {\n\t\t\tvar labels;\n\t\t\tvar options = {};\n\n\t\t\t// Make sure the widget has a selector set\n\t\t\tif ( !selector ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( widget === \"controlgroupLabel\" ) {\n\t\t\t\tlabels = that.element.find( selector );\n\t\t\t\tlabels.each( function() {\n\t\t\t\t\tvar element = $( this );\n\n\t\t\t\t\tif ( element.children( \".ui-controlgroup-label-contents\" ).length ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telement.contents()\n\t\t\t\t\t\t.wrapAll( \"<span class='ui-controlgroup-label-contents'></span>\" );\n\t\t\t\t} );\n\t\t\t\tthat._addClass( labels, null, \"ui-widget ui-widget-content ui-state-default\" );\n\t\t\t\tchildWidgets = childWidgets.concat( labels.get() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Make sure the widget actually exists\n\t\t\tif ( !$.fn[ widget ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// We assume everything is in the middle to start because we can't determine\n\t\t\t// first / last elements until all enhancments are done.\n\t\t\tif ( that[ \"_\" + widget + \"Options\" ] ) {\n\t\t\t\toptions = that[ \"_\" + widget + \"Options\" ]( \"middle\" );\n\t\t\t} else {\n\t\t\t\toptions = { classes: {} };\n\t\t\t}\n\n\t\t\t// Find instances of this widget inside controlgroup and init them\n\t\t\tthat.element\n\t\t\t\t.find( selector )\n\t\t\t\t.each( function() {\n\t\t\t\t\tvar element = $( this );\n\t\t\t\t\tvar instance = element[ widget ]( \"instance\" );\n\n\t\t\t\t\t// We need to clone the default options for this type of widget to avoid\n\t\t\t\t\t// polluting the variable options which has a wider scope than a single widget.\n\t\t\t\t\tvar instanceOptions = $.widget.extend( {}, options );\n\n\t\t\t\t\t// If the button is the child of a spinner ignore it\n\t\t\t\t\t// TODO: Find a more generic solution\n\t\t\t\t\tif ( widget === \"button\" && element.parent( \".ui-spinner\" ).length ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Create the widget if it doesn't exist\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\tinstance = element[ widget ]()[ widget ]( \"instance\" );\n\t\t\t\t\t}\n\t\t\t\t\tif ( instance ) {\n\t\t\t\t\t\tinstanceOptions.classes =\n\t\t\t\t\t\t\tthat._resolveClassesValues( instanceOptions.classes, instance );\n\t\t\t\t\t}\n\t\t\t\t\telement[ widget ]( instanceOptions );\n\n\t\t\t\t\t// Store an instance of the controlgroup to be able to reference\n\t\t\t\t\t// from the outermost element for changing options and refresh\n\t\t\t\t\tvar widgetElement = element[ widget ]( \"widget\" );\n\t\t\t\t\t$.data( widgetElement[ 0 ], \"ui-controlgroup-data\",\n\t\t\t\t\t\tinstance ? instance : element[ widget ]( \"instance\" ) );\n\n\t\t\t\t\tchildWidgets.push( widgetElement[ 0 ] );\n\t\t\t\t} );\n\t\t} );\n\n\t\tthis.childWidgets = $( $.uniqueSort( childWidgets ) );\n\t\tthis._addClass( this.childWidgets, \"ui-controlgroup-item\" );\n\t},\n\n\t_callChildMethod: function( method ) {\n\t\tthis.childWidgets.each( function() {\n\t\t\tvar element = $( this ),\n\t\t\t\tdata = element.data( \"ui-controlgroup-data\" );\n\t\t\tif ( data && data[ method ] ) {\n\t\t\t\tdata[ method ]();\n\t\t\t}\n\t\t} );\n\t},\n\n\t_updateCornerClass: function( element, position ) {\n\t\tvar remove = \"ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all\";\n\t\tvar add = this._buildSimpleOptions( position, \"label\" ).classes.label;\n\n\t\tthis._removeClass( element, null, remove );\n\t\tthis._addClass( element, null, add );\n\t},\n\n\t_buildSimpleOptions: function( position, key ) {\n\t\tvar direction = this.options.direction === \"vertical\";\n\t\tvar result = {\n\t\t\tclasses: {}\n\t\t};\n\t\tresult.classes[ key ] = {\n\t\t\t\"middle\": \"\",\n\t\t\t\"first\": \"ui-corner-\" + ( direction ? \"top\" : \"left\" ),\n\t\t\t\"last\": \"ui-corner-\" + ( direction ? \"bottom\" : \"right\" ),\n\t\t\t\"only\": \"ui-corner-all\"\n\t\t}[ position ];\n\n\t\treturn result;\n\t},\n\n\t_spinnerOptions: function( position ) {\n\t\tvar options = this._buildSimpleOptions( position, \"ui-spinner\" );\n\n\t\toptions.classes[ \"ui-spinner-up\" ] = \"\";\n\t\toptions.classes[ \"ui-spinner-down\" ] = \"\";\n\n\t\treturn options;\n\t},\n\n\t_buttonOptions: function( position ) {\n\t\treturn this._buildSimpleOptions( position, \"ui-button\" );\n\t},\n\n\t_checkboxradioOptions: function( position ) {\n\t\treturn this._buildSimpleOptions( position, \"ui-checkboxradio-label\" );\n\t},\n\n\t_selectmenuOptions: function( position ) {\n\t\tvar direction = this.options.direction === \"vertical\";\n\t\treturn {\n\t\t\twidth: direction ? \"auto\" : false,\n\t\t\tclasses: {\n\t\t\t\tmiddle: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": \"\",\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"\"\n\t\t\t\t},\n\t\t\t\tfirst: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": \"ui-corner-\" + ( direction ? \"top\" : \"tl\" ),\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-\" + ( direction ? \"top\" : \"left\" )\n\t\t\t\t},\n\t\t\t\tlast: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": direction ? \"\" : \"ui-corner-tr\",\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-\" + ( direction ? \"bottom\" : \"right\" )\n\t\t\t\t},\n\t\t\t\tonly: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": \"ui-corner-top\",\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-all\"\n\t\t\t\t}\n\n\t\t\t}[ position ]\n\t\t};\n\t},\n\n\t_resolveClassesValues: function( classes, instance ) {\n\t\tvar result = {};\n\t\t$.each( classes, function( key ) {\n\t\t\tvar current = instance.options.classes[ key ] || \"\";\n\t\t\tcurrent = String.prototype.trim.call( current.replace( controlgroupCornerRegex, \"\" ) );\n\t\t\tresult[ key ] = ( current + \" \" + classes[ key ] ).replace( /\\s+/g, \" \" );\n\t\t} );\n\t\treturn result;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"direction\" ) {\n\t\t\tthis._removeClass( \"ui-controlgroup-\" + this.options.direction );\n\t\t}\n\n\t\tthis._super( key, value );\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._callChildMethod( value ? \"disable\" : \"enable\" );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.refresh();\n\t},\n\n\trefresh: function() {\n\t\tvar children,\n\t\t\tthat = this;\n\n\t\tthis._addClass( \"ui-controlgroup ui-controlgroup-\" + this.options.direction );\n\n\t\tif ( this.options.direction === \"horizontal\" ) {\n\t\t\tthis._addClass( null, \"ui-helper-clearfix\" );\n\t\t}\n\t\tthis._initWidgets();\n\n\t\tchildren = this.childWidgets;\n\n\t\t// We filter here because we need to track all childWidgets not just the visible ones\n\t\tif ( this.options.onlyVisible ) {\n\t\t\tchildren = children.filter( \":visible\" );\n\t\t}\n\n\t\tif ( children.length ) {\n\n\t\t\t// We do this last because we need to make sure all enhancment is done\n\t\t\t// before determining first and last\n\t\t\t$.each( [ \"first\", \"last\" ], function( index, value ) {\n\t\t\t\tvar instance = children[ value ]().data( \"ui-controlgroup-data\" );\n\n\t\t\t\tif ( instance && that[ \"_\" + instance.widgetName + \"Options\" ] ) {\n\t\t\t\t\tvar options = that[ \"_\" + instance.widgetName + \"Options\" ](\n\t\t\t\t\t\tchildren.length === 1 ? \"only\" : value\n\t\t\t\t\t);\n\t\t\t\t\toptions.classes = that._resolveClassesValues( options.classes, instance );\n\t\t\t\t\tinstance.element[ instance.widgetName ]( options );\n\t\t\t\t} else {\n\t\t\t\t\tthat._updateCornerClass( children[ value ](), value );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Finally call the refresh method on each of the child widgets.\n\t\t\tthis._callChildMethod( \"refresh\" );\n\t\t}\n\t}\n} );\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/core.js",
    "content": "/*! jQuery UI - v1.13.0 - 2021-10-07\n* http://jqueryui.com\n* Includes: data.js, disable-selection.js, escape-selector.js, focusable.js, form-reset-mixin.js, form.js, ie.js, jquery-1-7.js, keycode.js, labels.js, plugin.js, position.js, safe-active-element.js, safe-blur.js, scroll-parent.js, tabbable.js, unique-id.js, version.js, widget.js\n* Copyright jQuery Foundation and other contributors; Licensed  */\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} ( function( $ ) {\n\"use strict\";\n\n// Source: version.js\n$.ui = $.ui || {};\n\n$.ui.version = \"1.13.0\";\n\n// Source: data.js\n/*!\n * jQuery UI :data 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: :data Selector\n//>>group: Core\n//>>description: Selects elements which have data stored under the specified key.\n//>>docs: http://api.jqueryui.com/data-selector/\n\n$.extend( $.expr.pseudos, {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo( function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t} ) :\n\n\t\t// Support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t}\n} );\n\n// Source: disable-selection.js\n/*!\n * jQuery UI Disable Selection 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: disableSelection\n//>>group: Core\n//>>description: Disable selection of text content within the set of matched elements.\n//>>docs: http://api.jqueryui.com/disableSelection/\n\n// This file is deprecated\n$.fn.extend( {\n\tdisableSelection: ( function() {\n\t\tvar eventType = \"onselectstart\" in document.createElement( \"div\" ) ?\n\t\t\t\"selectstart\" :\n\t\t\t\"mousedown\";\n\n\t\treturn function() {\n\t\t\treturn this.on( eventType + \".ui-disableSelection\", function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t} );\n\t\t};\n\t} )(),\n\n\tenableSelection: function() {\n\t\treturn this.off( \".ui-disableSelection\" );\n\t}\n} );\n\n// Source: focusable.js\n/*!\n * jQuery UI Focusable 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: :focusable Selector\n//>>group: Core\n//>>description: Selects elements which can be focused.\n//>>docs: http://api.jqueryui.com/focusable-selector/\n\n// Selectors\n$.ui.focusable = function( element, hasTabindex ) {\n\tvar map, mapName, img, focusableIfVisible, fieldset,\n\t\tnodeName = element.nodeName.toLowerCase();\n\n\tif ( \"area\" === nodeName ) {\n\t\tmap = element.parentNode;\n\t\tmapName = map.name;\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\n\t\t\treturn false;\n\t\t}\n\t\timg = $( \"img[usemap='#\" + mapName + \"']\" );\n\t\treturn img.length > 0 && img.is( \":visible\" );\n\t}\n\n\tif ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {\n\t\tfocusableIfVisible = !element.disabled;\n\n\t\tif ( focusableIfVisible ) {\n\n\t\t\t// Form controls within a disabled fieldset are disabled.\n\t\t\t// However, controls within the fieldset's legend do not get disabled.\n\t\t\t// Since controls generally aren't placed inside legends, we skip\n\t\t\t// this portion of the check.\n\t\t\tfieldset = $( element ).closest( \"fieldset\" )[ 0 ];\n\t\t\tif ( fieldset ) {\n\t\t\t\tfocusableIfVisible = !fieldset.disabled;\n\t\t\t}\n\t\t}\n\t} else if ( \"a\" === nodeName ) {\n\t\tfocusableIfVisible = element.href || hasTabindex;\n\t} else {\n\t\tfocusableIfVisible = hasTabindex;\n\t}\n\n\treturn focusableIfVisible && $( element ).is( \":visible\" ) && visible( $( element ) );\n};\n\n// Support: IE 8 only\n// IE 8 doesn't resolve inherit to visible/hidden for computed values\nfunction visible( element ) {\n\tvar visibility = element.css( \"visibility\" );\n\twhile ( visibility === \"inherit\" ) {\n\t\telement = element.parent();\n\t\tvisibility = element.css( \"visibility\" );\n\t}\n\treturn visibility === \"visible\";\n}\n\n$.extend( $.expr.pseudos, {\n\tfocusable: function( element ) {\n\t\treturn $.ui.focusable( element, $.attr( element, \"tabindex\" ) != null );\n\t}\n} );\n\n// Source: form.js\n// Support: IE8 Only\n// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop\n// with a string, so we need to find the proper form.\n$.fn._form = function() {\n\treturn typeof this[ 0 ].form === \"string\" ? this.closest( \"form\" ) : $( this[ 0 ].form );\n};\n\n// Source: form-reset-mixin.js\n/*!\n * jQuery UI Form Reset Mixin 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Form Reset Mixin\n//>>group: Core\n//>>description: Refresh input widgets when their form is reset\n//>>docs: http://api.jqueryui.com/form-reset-mixin/\n\n$.ui.formResetMixin = {\n\t_formResetHandler: function() {\n\t\tvar form = $( this );\n\n\t\t// Wait for the form reset to actually happen before refreshing\n\t\tsetTimeout( function() {\n\t\t\tvar instances = form.data( \"ui-form-reset-instances\" );\n\t\t\t$.each( instances, function() {\n\t\t\t\tthis.refresh();\n\t\t\t} );\n\t\t} );\n\t},\n\n\t_bindFormResetHandler: function() {\n\t\tthis.form = this.element._form();\n\t\tif ( !this.form.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar instances = this.form.data( \"ui-form-reset-instances\" ) || [];\n\t\tif ( !instances.length ) {\n\n\t\t\t// We don't use _on() here because we use a single event handler per form\n\t\t\tthis.form.on( \"reset.ui-form-reset\", this._formResetHandler );\n\t\t}\n\t\tinstances.push( this );\n\t\tthis.form.data( \"ui-form-reset-instances\", instances );\n\t},\n\n\t_unbindFormResetHandler: function() {\n\t\tif ( !this.form.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar instances = this.form.data( \"ui-form-reset-instances\" );\n\t\tinstances.splice( $.inArray( this, instances ), 1 );\n\t\tif ( instances.length ) {\n\t\t\tthis.form.data( \"ui-form-reset-instances\", instances );\n\t\t} else {\n\t\t\tthis.form\n\t\t\t\t.removeData( \"ui-form-reset-instances\" )\n\t\t\t\t.off( \"reset.ui-form-reset\" );\n\t\t}\n\t}\n};\n\n// Source: ie.js\n// This file is deprecated\n$.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\n\n// Source: jquery-patch.js\n/*!\n * jQuery UI Support for jQuery core 1.8.x and newer 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n */\n\n//>>label: jQuery 1.8+ Support\n//>>group: Core\n//>>description: Support version 1.8.x and newer of jQuery core\n\n// Support: jQuery 1.9.x or older\n// $.expr[ \":\" ] is deprecated.\nif ( !$.expr.pseudos ) {\n\t$.expr.pseudos = $.expr[ \":\" ];\n}\n\n// Support: jQuery 1.11.x or older\n// $.unique has been renamed to $.uniqueSort\nif ( !$.uniqueSort ) {\n\t$.uniqueSort = $.unique;\n}\n\n// Support: jQuery 2.2.x or older.\n// This method has been defined in jQuery 3.0.0.\n// Code from https://github.com/jquery/jquery/blob/e539bac79e666bba95bba86d690b4e609dca2286/src/selector/escapeSelector.js\nif ( !$.escapeSelector ) {\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\tvar rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n\n\tvar fcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t};\n\n\t$.escapeSelector = function( sel ) {\n\t\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n\t};\n}\n\n// Support: jQuery 3.4.x or older\n// These methods have been defined in jQuery 3.5.0.\nif ( !$.fn.even || !$.fn.odd ) {\n\t$.fn.extend( {\n\t\teven: function() {\n\t\t\treturn this.filter( function( i ) {\n\t\t\t\treturn i % 2 === 0;\n\t\t\t} );\n\t\t},\n\t\todd: function() {\n\t\t\treturn this.filter( function( i ) {\n\t\t\t\treturn i % 2 === 1;\n\t\t\t} );\n\t\t}\n\t} );\n}\n\n// Source: keycode.js\n/*!\n * jQuery UI Keycode 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Keycode\n//>>group: Core\n//>>description: Provide keycodes as keynames\n//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/\n\n$.ui.keyCode = {\n\tBACKSPACE: 8,\n\tCOMMA: 188,\n\tDELETE: 46,\n\tDOWN: 40,\n\tEND: 35,\n\tENTER: 13,\n\tESCAPE: 27,\n\tHOME: 36,\n\tLEFT: 37,\n\tPAGE_DOWN: 34,\n\tPAGE_UP: 33,\n\tPERIOD: 190,\n\tRIGHT: 39,\n\tSPACE: 32,\n\tTAB: 9,\n\tUP: 38\n};\n\n// Source: labels.js\n/*!\n * jQuery UI Labels 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: labels\n//>>group: Core\n//>>description: Find all the labels associated with a given input\n//>>docs: http://api.jqueryui.com/labels/\n\n$.fn.labels = function() {\n\tvar ancestor, selector, id, labels, ancestors;\n\n\tif ( !this.length ) {\n\t\treturn this.pushStack( [] );\n\t}\n\n\t// Check control.labels first\n\tif ( this[ 0 ].labels && this[ 0 ].labels.length ) {\n\t\treturn this.pushStack( this[ 0 ].labels );\n\t}\n\n\t// Support: IE <= 11, FF <= 37, Android <= 2.3 only\n\t// Above browsers do not support control.labels. Everything below is to support them\n\t// as well as document fragments. control.labels does not work on document fragments\n\tlabels = this.eq( 0 ).parents( \"label\" );\n\n\t// Look for the label based on the id\n\tid = this.attr( \"id\" );\n\tif ( id ) {\n\n\t\t// We don't search against the document in case the element\n\t\t// is disconnected from the DOM\n\t\tancestor = this.eq( 0 ).parents().last();\n\n\t\t// Get a full set of top level ancestors\n\t\tancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );\n\n\t\t// Create a selector for the label based on the id\n\t\tselector = \"label[for='\" + $.escapeSelector( id ) + \"']\";\n\n\t\tlabels = labels.add( ancestors.find( selector ).addBack( selector ) );\n\n\t}\n\n\t// Return whatever we have found for labels\n\treturn this.pushStack( labels );\n};\n\n// Source: plugin.js\n// $.ui.plugin is deprecated. Use $.widget() extensions instead.\n$.ui.plugin = {\n\tadd: function( module, option, set ) {\n\t\tvar i,\n\t\t\tproto = $.ui[ module ].prototype;\n\t\tfor ( i in set ) {\n\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t}\n\t},\n\tcall: function( instance, name, args, allowDisconnected ) {\n\t\tvar i,\n\t\t\tset = instance.plugins[ name ];\n\n\t\tif ( !set ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||\n\t\t\t\tinstance.element[ 0 ].parentNode.nodeType === 11 ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Source: position.js\n/*!\n * jQuery UI Position 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/position/\n */\n\n//>>label: Position\n//>>group: Core\n//>>description: Positions elements relative to other elements.\n//>>docs: http://api.jqueryui.com/position/\n//>>demos: http://jqueryui.com/position/\n\n( function() {\nvar cachedScrollbarWidth,\n\tmax = Math.max,\n\tabs = Math.abs,\n\trhorizontal = /left|center|right/,\n\trvertical = /top|center|bottom/,\n\troffset = /[\\+\\-]\\d+(\\.[\\d]+)?%?/,\n\trposition = /^\\w+/,\n\trpercent = /%$/,\n\t_position = $.fn.position;\n\nfunction getOffsets( offsets, width, height ) {\n\treturn [\n\t\tparseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),\n\t\tparseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )\n\t];\n}\n\nfunction parseCss( element, property ) {\n\treturn parseInt( $.css( element, property ), 10 ) || 0;\n}\n\nfunction isWindow( obj ) {\n\treturn obj != null && obj === obj.window;\n}\n\nfunction getDimensions( elem ) {\n\tvar raw = elem[ 0 ];\n\tif ( raw.nodeType === 9 ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: 0, left: 0 }\n\t\t};\n\t}\n\tif ( isWindow( raw ) ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: elem.scrollTop(), left: elem.scrollLeft() }\n\t\t};\n\t}\n\tif ( raw.preventDefault ) {\n\t\treturn {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\toffset: { top: raw.pageY, left: raw.pageX }\n\t\t};\n\t}\n\treturn {\n\t\twidth: elem.outerWidth(),\n\t\theight: elem.outerHeight(),\n\t\toffset: elem.offset()\n\t};\n}\n\n$.position = {\n\tscrollbarWidth: function() {\n\t\tif ( cachedScrollbarWidth !== undefined ) {\n\t\t\treturn cachedScrollbarWidth;\n\t\t}\n\t\tvar w1, w2,\n\t\t\tdiv = $( \"<div style=\" +\n\t\t\t\t\"'display:block;position:absolute;width:200px;height:200px;overflow:hidden;'>\" +\n\t\t\t\t\"<div style='height:300px;width:auto;'></div></div>\" ),\n\t\t\tinnerDiv = div.children()[ 0 ];\n\n\t\t$( \"body\" ).append( div );\n\t\tw1 = innerDiv.offsetWidth;\n\t\tdiv.css( \"overflow\", \"scroll\" );\n\n\t\tw2 = innerDiv.offsetWidth;\n\n\t\tif ( w1 === w2 ) {\n\t\t\tw2 = div[ 0 ].clientWidth;\n\t\t}\n\n\t\tdiv.remove();\n\n\t\treturn ( cachedScrollbarWidth = w1 - w2 );\n\t},\n\tgetScrollInfo: function( within ) {\n\t\tvar overflowX = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-x\" ),\n\t\t\toverflowY = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-y\" ),\n\t\t\thasOverflowX = overflowX === \"scroll\" ||\n\t\t\t\t( overflowX === \"auto\" && within.width < within.element[ 0 ].scrollWidth ),\n\t\t\thasOverflowY = overflowY === \"scroll\" ||\n\t\t\t\t( overflowY === \"auto\" && within.height < within.element[ 0 ].scrollHeight );\n\t\treturn {\n\t\t\twidth: hasOverflowY ? $.position.scrollbarWidth() : 0,\n\t\t\theight: hasOverflowX ? $.position.scrollbarWidth() : 0\n\t\t};\n\t},\n\tgetWithinInfo: function( element ) {\n\t\tvar withinElement = $( element || window ),\n\t\t\tisElemWindow = isWindow( withinElement[ 0 ] ),\n\t\t\tisDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,\n\t\t\thasOffset = !isElemWindow && !isDocument;\n\t\treturn {\n\t\t\telement: withinElement,\n\t\t\tisWindow: isElemWindow,\n\t\t\tisDocument: isDocument,\n\t\t\toffset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },\n\t\t\tscrollLeft: withinElement.scrollLeft(),\n\t\t\tscrollTop: withinElement.scrollTop(),\n\t\t\twidth: withinElement.outerWidth(),\n\t\t\theight: withinElement.outerHeight()\n\t\t};\n\t}\n};\n\n$.fn.position = function( options ) {\n\tif ( !options || !options.of ) {\n\t\treturn _position.apply( this, arguments );\n\t}\n\n\t// Make a copy, we don't want to modify arguments\n\toptions = $.extend( {}, options );\n\n\tvar atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,\n\n\t\t// Make sure string options are treated as CSS selectors\n\t\ttarget = typeof options.of === \"string\" ?\n\t\t\t$( document ).find( options.of ) :\n\t\t\t$( options.of ),\n\n\t\twithin = $.position.getWithinInfo( options.within ),\n\t\tscrollInfo = $.position.getScrollInfo( within ),\n\t\tcollision = ( options.collision || \"flip\" ).split( \" \" ),\n\t\toffsets = {};\n\n\tdimensions = getDimensions( target );\n\tif ( target[ 0 ].preventDefault ) {\n\n\t\t// Force left top to allow flipping\n\t\toptions.at = \"left top\";\n\t}\n\ttargetWidth = dimensions.width;\n\ttargetHeight = dimensions.height;\n\ttargetOffset = dimensions.offset;\n\n\t// Clone to reuse original targetOffset later\n\tbasePosition = $.extend( {}, targetOffset );\n\n\t// Force my and at to have valid horizontal and vertical positions\n\t// if a value is missing or invalid, it will be converted to center\n\t$.each( [ \"my\", \"at\" ], function() {\n\t\tvar pos = ( options[ this ] || \"\" ).split( \" \" ),\n\t\t\thorizontalOffset,\n\t\t\tverticalOffset;\n\n\t\tif ( pos.length === 1 ) {\n\t\t\tpos = rhorizontal.test( pos[ 0 ] ) ?\n\t\t\t\tpos.concat( [ \"center\" ] ) :\n\t\t\t\trvertical.test( pos[ 0 ] ) ?\n\t\t\t\t\t[ \"center\" ].concat( pos ) :\n\t\t\t\t\t[ \"center\", \"center\" ];\n\t\t}\n\t\tpos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : \"center\";\n\t\tpos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : \"center\";\n\n\t\t// Calculate offsets\n\t\thorizontalOffset = roffset.exec( pos[ 0 ] );\n\t\tverticalOffset = roffset.exec( pos[ 1 ] );\n\t\toffsets[ this ] = [\n\t\t\thorizontalOffset ? horizontalOffset[ 0 ] : 0,\n\t\t\tverticalOffset ? verticalOffset[ 0 ] : 0\n\t\t];\n\n\t\t// Reduce to just the positions without the offsets\n\t\toptions[ this ] = [\n\t\t\trposition.exec( pos[ 0 ] )[ 0 ],\n\t\t\trposition.exec( pos[ 1 ] )[ 0 ]\n\t\t];\n\t} );\n\n\t// Normalize collision option\n\tif ( collision.length === 1 ) {\n\t\tcollision[ 1 ] = collision[ 0 ];\n\t}\n\n\tif ( options.at[ 0 ] === \"right\" ) {\n\t\tbasePosition.left += targetWidth;\n\t} else if ( options.at[ 0 ] === \"center\" ) {\n\t\tbasePosition.left += targetWidth / 2;\n\t}\n\n\tif ( options.at[ 1 ] === \"bottom\" ) {\n\t\tbasePosition.top += targetHeight;\n\t} else if ( options.at[ 1 ] === \"center\" ) {\n\t\tbasePosition.top += targetHeight / 2;\n\t}\n\n\tatOffset = getOffsets( offsets.at, targetWidth, targetHeight );\n\tbasePosition.left += atOffset[ 0 ];\n\tbasePosition.top += atOffset[ 1 ];\n\n\treturn this.each( function() {\n\t\tvar collisionPosition, using,\n\t\t\telem = $( this ),\n\t\t\telemWidth = elem.outerWidth(),\n\t\t\telemHeight = elem.outerHeight(),\n\t\t\tmarginLeft = parseCss( this, \"marginLeft\" ),\n\t\t\tmarginTop = parseCss( this, \"marginTop\" ),\n\t\t\tcollisionWidth = elemWidth + marginLeft + parseCss( this, \"marginRight\" ) +\n\t\t\t\tscrollInfo.width,\n\t\t\tcollisionHeight = elemHeight + marginTop + parseCss( this, \"marginBottom\" ) +\n\t\t\t\tscrollInfo.height,\n\t\t\tposition = $.extend( {}, basePosition ),\n\t\t\tmyOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );\n\n\t\tif ( options.my[ 0 ] === \"right\" ) {\n\t\t\tposition.left -= elemWidth;\n\t\t} else if ( options.my[ 0 ] === \"center\" ) {\n\t\t\tposition.left -= elemWidth / 2;\n\t\t}\n\n\t\tif ( options.my[ 1 ] === \"bottom\" ) {\n\t\t\tposition.top -= elemHeight;\n\t\t} else if ( options.my[ 1 ] === \"center\" ) {\n\t\t\tposition.top -= elemHeight / 2;\n\t\t}\n\n\t\tposition.left += myOffset[ 0 ];\n\t\tposition.top += myOffset[ 1 ];\n\n\t\tcollisionPosition = {\n\t\t\tmarginLeft: marginLeft,\n\t\t\tmarginTop: marginTop\n\t\t};\n\n\t\t$.each( [ \"left\", \"top\" ], function( i, dir ) {\n\t\t\tif ( $.ui.position[ collision[ i ] ] ) {\n\t\t\t\t$.ui.position[ collision[ i ] ][ dir ]( position, {\n\t\t\t\t\ttargetWidth: targetWidth,\n\t\t\t\t\ttargetHeight: targetHeight,\n\t\t\t\t\telemWidth: elemWidth,\n\t\t\t\t\telemHeight: elemHeight,\n\t\t\t\t\tcollisionPosition: collisionPosition,\n\t\t\t\t\tcollisionWidth: collisionWidth,\n\t\t\t\t\tcollisionHeight: collisionHeight,\n\t\t\t\t\toffset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],\n\t\t\t\t\tmy: options.my,\n\t\t\t\t\tat: options.at,\n\t\t\t\t\twithin: within,\n\t\t\t\t\telem: elem\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\tif ( options.using ) {\n\n\t\t\t// Adds feedback as second argument to using callback, if present\n\t\t\tusing = function( props ) {\n\t\t\t\tvar left = targetOffset.left - position.left,\n\t\t\t\t\tright = left + targetWidth - elemWidth,\n\t\t\t\t\ttop = targetOffset.top - position.top,\n\t\t\t\t\tbottom = top + targetHeight - elemHeight,\n\t\t\t\t\tfeedback = {\n\t\t\t\t\t\ttarget: {\n\t\t\t\t\t\t\telement: target,\n\t\t\t\t\t\t\tleft: targetOffset.left,\n\t\t\t\t\t\t\ttop: targetOffset.top,\n\t\t\t\t\t\t\twidth: targetWidth,\n\t\t\t\t\t\t\theight: targetHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\telement: {\n\t\t\t\t\t\t\telement: elem,\n\t\t\t\t\t\t\tleft: position.left,\n\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\twidth: elemWidth,\n\t\t\t\t\t\t\theight: elemHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\thorizontal: right < 0 ? \"left\" : left > 0 ? \"right\" : \"center\",\n\t\t\t\t\t\tvertical: bottom < 0 ? \"top\" : top > 0 ? \"bottom\" : \"middle\"\n\t\t\t\t\t};\n\t\t\t\tif ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {\n\t\t\t\t\tfeedback.horizontal = \"center\";\n\t\t\t\t}\n\t\t\t\tif ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {\n\t\t\t\t\tfeedback.vertical = \"middle\";\n\t\t\t\t}\n\t\t\t\tif ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {\n\t\t\t\t\tfeedback.important = \"horizontal\";\n\t\t\t\t} else {\n\t\t\t\t\tfeedback.important = \"vertical\";\n\t\t\t\t}\n\t\t\t\toptions.using.call( this, props, feedback );\n\t\t\t};\n\t\t}\n\n\t\telem.offset( $.extend( position, { using: using } ) );\n\t} );\n};\n\n$.ui.position = {\n\tfit: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\touterWidth = within.width,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = withinOffset - collisionPosLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,\n\t\t\t\tnewOverRight;\n\n\t\t\t// Element is wider than within\n\t\t\tif ( data.collisionWidth > outerWidth ) {\n\n\t\t\t\t// Element is initially over the left side of within\n\t\t\t\tif ( overLeft > 0 && overRight <= 0 ) {\n\t\t\t\t\tnewOverRight = position.left + overLeft + data.collisionWidth - outerWidth -\n\t\t\t\t\t\twithinOffset;\n\t\t\t\t\tposition.left += overLeft - newOverRight;\n\n\t\t\t\t// Element is initially over right side of within\n\t\t\t\t} else if ( overRight > 0 && overLeft <= 0 ) {\n\t\t\t\t\tposition.left = withinOffset;\n\n\t\t\t\t// Element is initially over both left and right sides of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overLeft > overRight ) {\n\t\t\t\t\t\tposition.left = withinOffset + outerWidth - data.collisionWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Too far left -> align with left edge\n\t\t\t} else if ( overLeft > 0 ) {\n\t\t\t\tposition.left += overLeft;\n\n\t\t\t// Too far right -> align with right edge\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tposition.left -= overRight;\n\n\t\t\t// Adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.left = max( position.left - collisionPosLeft, position.left );\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\touterHeight = data.within.height,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = withinOffset - collisionPosTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,\n\t\t\t\tnewOverBottom;\n\n\t\t\t// Element is taller than within\n\t\t\tif ( data.collisionHeight > outerHeight ) {\n\n\t\t\t\t// Element is initially over the top of within\n\t\t\t\tif ( overTop > 0 && overBottom <= 0 ) {\n\t\t\t\t\tnewOverBottom = position.top + overTop + data.collisionHeight - outerHeight -\n\t\t\t\t\t\twithinOffset;\n\t\t\t\t\tposition.top += overTop - newOverBottom;\n\n\t\t\t\t// Element is initially over bottom of within\n\t\t\t\t} else if ( overBottom > 0 && overTop <= 0 ) {\n\t\t\t\t\tposition.top = withinOffset;\n\n\t\t\t\t// Element is initially over both top and bottom of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overTop > overBottom ) {\n\t\t\t\t\t\tposition.top = withinOffset + outerHeight - data.collisionHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Too far up -> align with top\n\t\t\t} else if ( overTop > 0 ) {\n\t\t\t\tposition.top += overTop;\n\n\t\t\t// Too far down -> align with bottom edge\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tposition.top -= overBottom;\n\n\t\t\t// Adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.top = max( position.top - collisionPosTop, position.top );\n\t\t\t}\n\t\t}\n\t},\n\tflip: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.left + within.scrollLeft,\n\t\t\t\touterWidth = within.width,\n\t\t\t\toffsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = collisionPosLeft - offsetLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,\n\t\t\t\tmyOffset = data.my[ 0 ] === \"left\" ?\n\t\t\t\t\t-data.elemWidth :\n\t\t\t\t\tdata.my[ 0 ] === \"right\" ?\n\t\t\t\t\t\tdata.elemWidth :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 0 ] === \"left\" ?\n\t\t\t\t\tdata.targetWidth :\n\t\t\t\t\tdata.at[ 0 ] === \"right\" ?\n\t\t\t\t\t\t-data.targetWidth :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 0 ],\n\t\t\t\tnewOverRight,\n\t\t\t\tnewOverLeft;\n\n\t\t\tif ( overLeft < 0 ) {\n\t\t\t\tnewOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -\n\t\t\t\t\touterWidth - withinOffset;\n\t\t\t\tif ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tnewOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +\n\t\t\t\t\tatOffset + offset - offsetLeft;\n\t\t\t\tif ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.top + within.scrollTop,\n\t\t\t\touterHeight = within.height,\n\t\t\t\toffsetTop = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = collisionPosTop - offsetTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,\n\t\t\t\ttop = data.my[ 1 ] === \"top\",\n\t\t\t\tmyOffset = top ?\n\t\t\t\t\t-data.elemHeight :\n\t\t\t\t\tdata.my[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\tdata.elemHeight :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 1 ] === \"top\" ?\n\t\t\t\t\tdata.targetHeight :\n\t\t\t\t\tdata.at[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\t-data.targetHeight :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 1 ],\n\t\t\t\tnewOverTop,\n\t\t\t\tnewOverBottom;\n\t\t\tif ( overTop < 0 ) {\n\t\t\t\tnewOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -\n\t\t\t\t\touterHeight - withinOffset;\n\t\t\t\tif ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tnewOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +\n\t\t\t\t\toffset - offsetTop;\n\t\t\t\tif ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tflipfit: {\n\t\tleft: function() {\n\t\t\t$.ui.position.flip.left.apply( this, arguments );\n\t\t\t$.ui.position.fit.left.apply( this, arguments );\n\t\t},\n\t\ttop: function() {\n\t\t\t$.ui.position.flip.top.apply( this, arguments );\n\t\t\t$.ui.position.fit.top.apply( this, arguments );\n\t\t}\n\t}\n};\n\n} )();\n\n// Source: safe-active-element.js\n$.ui.safeActiveElement = function( document ) {\n\tvar activeElement;\n\n\t// Support: IE 9 only\n\t// IE9 throws an \"Unspecified error\" accessing document.activeElement from an <iframe>\n\ttry {\n\t\tactiveElement = document.activeElement;\n\t} catch ( error ) {\n\t\tactiveElement = document.body;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE may return null instead of an element\n\t// Interestingly, this only seems to occur when NOT in an iframe\n\tif ( !activeElement ) {\n\t\tactiveElement = document.body;\n\t}\n\n\t// Support: IE 11 only\n\t// IE11 returns a seemingly empty object in some cases when accessing\n\t// document.activeElement from an <iframe>\n\tif ( !activeElement.nodeName ) {\n\t\tactiveElement = document.body;\n\t}\n\n\treturn activeElement;\n};\n\n// Source: safe-blur.js\n$.ui.safeBlur = function( element ) {\n\n\t// Support: IE9 - 10 only\n\t// If the <body> is blurred, IE will switch windows, see #9420\n\tif ( element && element.nodeName.toLowerCase() !== \"body\" ) {\n\t\t$( element ).trigger( \"blur\" );\n\t}\n};\n\n// Source: scroll-parent.js\n/*!\n * jQuery UI Scroll Parent 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: scrollParent\n//>>group: Core\n//>>description: Get the closest ancestor element that is scrollable.\n//>>docs: http://api.jqueryui.com/scrollParent/\n\n$.fn.scrollParent = function( includeHidden ) {\n\tvar position = this.css( \"position\" ),\n\t\texcludeStaticParent = position === \"absolute\",\n\t\toverflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,\n\t\tscrollParent = this.parents().filter( function() {\n\t\t\tvar parent = $( this );\n\t\t\tif ( excludeStaticParent && parent.css( \"position\" ) === \"static\" ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn overflowRegex.test( parent.css( \"overflow\" ) + parent.css( \"overflow-y\" ) +\n\t\t\t\tparent.css( \"overflow-x\" ) );\n\t\t} ).eq( 0 );\n\n\treturn position === \"fixed\" || !scrollParent.length ?\n\t\t$( this[ 0 ].ownerDocument || document ) :\n\t\tscrollParent;\n};\n\n// Source: tabbable.js\n/*!\n * jQuery UI Tabbable 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: :tabbable Selector\n//>>group: Core\n//>>description: Selects elements which can be tabbed to.\n//>>docs: http://api.jqueryui.com/tabbable-selector/\n\n$.extend( $.expr.pseudos, {\n\ttabbable: function( element ) {\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\n\t\t\thasTabindex = tabIndex != null;\n\t\treturn ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );\n\t}\n} );\n\n// Source: unique-id.js\n/*!\n * jQuery UI Unique ID 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: uniqueId\n//>>group: Core\n//>>description: Functions to generate and remove uniqueId's\n//>>docs: http://api.jqueryui.com/uniqueId/\n\n$.fn.extend( {\n\tuniqueId: ( function() {\n\t\tvar uuid = 0;\n\n\t\treturn function() {\n\t\t\treturn this.each( function() {\n\t\t\t\tif ( !this.id ) {\n\t\t\t\t\tthis.id = \"ui-id-\" + ( ++uuid );\n\t\t\t\t}\n\t\t\t} );\n\t\t};\n\t} )(),\n\n\tremoveUniqueId: function() {\n\t\treturn this.each( function() {\n\t\t\tif ( /^ui-id-\\d+$/.test( this.id ) ) {\n\t\t\t\t$( this ).removeAttr( \"id\" );\n\t\t\t}\n\t\t} );\n\t}\n} );\n\n// Source: widget.js\n/*!\n * jQuery UI Widget 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Widget\n//>>group: Core\n//>>description: Provides a factory for creating stateful widgets with a common API.\n//>>docs: http://api.jqueryui.com/jQuery.widget/\n//>>demos: http://jqueryui.com/widget/\n\nvar widgetUuid = 0;\nvar widgetHasOwnProperty = Array.prototype.hasOwnProperty;\nvar widgetSlice = Array.prototype.slice;\n\n$.cleanData = ( function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\n\n\t\t\t// Only trigger remove when necessary to save time\n\t\t\tevents = $._data( elem, \"events\" );\n\t\t\tif ( events && events.remove ) {\n\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t}\n\t\t}\n\t\torig( elems );\n\t};\n} )( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar existingConstructor, constructor, basePrototype;\n\n\t// ProxiedPrototype allows the provided prototype to remain unmodified\n\t// so that it can be used as a mixin for multiple widgets (#8876)\n\tvar proxiedPrototype = {};\n\n\tvar namespace = name.split( \".\" )[ 0 ];\n\tname = name.split( \".\" )[ 1 ];\n\tvar fullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\tif ( Array.isArray( prototype ) ) {\n\t\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\n\t}\n\n\t// Create selector for plugin\n\t$.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\n\t\t// Allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// Allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\n\t// Extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\n\t\t// Copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\n\t\t// Track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t} );\n\n\tbasePrototype = new base();\n\n\t// We need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( typeof value !== \"function\" ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = ( function() {\n\t\t\tfunction _super() {\n\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t}\n\n\t\t\tfunction _superApply( args ) {\n\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t}\n\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super;\n\t\t\t\tvar __superApply = this._superApply;\n\t\t\t\tvar returnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t} )();\n\t} );\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t} );\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// Redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor,\n\t\t\t\tchild._proto );\n\t\t} );\n\n\t\t// Remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widgetSlice.call( arguments, 1 );\n\tvar inputIndex = 0;\n\tvar inputLength = input.length;\n\tvar key;\n\tvar value;\n\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( widgetHasOwnProperty.call( input[ inputIndex ], key ) && value !== undefined ) {\n\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\";\n\t\tvar args = widgetSlice.call( arguments, 1 );\n\t\tvar returnValue = this;\n\n\t\tif ( isMethodCall ) {\n\n\t\t\t// If this is an empty collection, we need to have the instance method\n\t\t\t// return undefined instead of the jQuery instance\n\t\t\tif ( !this.length && options === \"instance\" ) {\n\t\t\t\treturnValue = undefined;\n\t\t\t} else {\n\t\t\t\tthis.each( function() {\n\t\t\t\t\tvar methodValue;\n\t\t\t\t\tvar instance = $.data( this, fullName );\n\n\t\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\t\treturnValue = instance;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\treturn $.error( \"cannot call methods on \" + name +\n\t\t\t\t\t\t\t\" prior to initialization; \" +\n\t\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof instance[ options ] !== \"function\" ||\n\t\t\t\t\t\toptions.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name +\n\t\t\t\t\t\t\t\" widget instance\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\n\t\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\t\tmethodValue;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Allow multiple hashes to be passed on init\n\t\t\tif ( args.length ) {\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\n\t\t\t}\n\n\t\t\tthis.each( function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\n\toptions: {\n\t\tclasses: {},\n\t\tdisabled: false,\n\n\t\t// Callbacks\n\t\tcreate: null\n\t},\n\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widgetUuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\t\tthis.classesElementLookup = {};\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.document = $( element.style ?\n\n\t\t\t\t// Element within the document\n\t\t\t\telement.ownerDocument :\n\n\t\t\t\t// Element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\n\t\t}\n\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis._create();\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._setOptionDisabled( this.options.disabled );\n\t\t}\n\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\n\t_getCreateOptions: function() {\n\t\treturn {};\n\t},\n\n\t_getCreateEventData: $.noop,\n\n\t_create: $.noop,\n\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tvar that = this;\n\n\t\tthis._destroy();\n\t\t$.each( this.classesElementLookup, function( key, value ) {\n\t\t\tthat._removeClass( value, key );\n\t\t} );\n\n\t\t// We can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName );\n\t\tthis.widget()\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" );\n\n\t\t// Clean up events and states\n\t\tthis.bindings.off( this.eventNamespace );\n\t},\n\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key;\n\t\tvar parts;\n\t\tvar curOption;\n\t\tvar i;\n\n\t\tif ( arguments.length === 0 ) {\n\n\t\t\t// Don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\n\t\t\t// Handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"classes\" ) {\n\t\t\tthis._setOptionClasses( value );\n\t\t}\n\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._setOptionDisabled( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOptionClasses: function( value ) {\n\t\tvar classKey, elements, currentElements;\n\n\t\tfor ( classKey in value ) {\n\t\t\tcurrentElements = this.classesElementLookup[ classKey ];\n\t\t\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\n\t\t\t\t\t!currentElements ||\n\t\t\t\t\t!currentElements.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We are doing this to create a new jQuery object because the _removeClass() call\n\t\t\t// on the next line is going to destroy the reference to the current elements being\n\t\t\t// tracked. We need to save a copy of this collection so that we can add the new classes\n\t\t\t// below.\n\t\t\telements = $( currentElements.get() );\n\t\t\tthis._removeClass( currentElements, classKey );\n\n\t\t\t// We don't use _addClass() here, because that uses this.options.classes\n\t\t\t// for generating the string of classes. We want to use the value passed in from\n\t\t\t// _setOption(), this is the new value of the classes option which was passed to\n\t\t\t// _setOption(). We pass this value directly to _classes().\n\t\t\telements.addClass( this._classes( {\n\t\t\t\telement: elements,\n\t\t\t\tkeys: classKey,\n\t\t\t\tclasses: value,\n\t\t\t\tadd: true\n\t\t\t} ) );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null, !!value );\n\n\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\tif ( value ) {\n\t\t\tthis._removeClass( this.hoverable, null, \"ui-state-hover\" );\n\t\t\tthis._removeClass( this.focusable, null, \"ui-state-focus\" );\n\t\t}\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions( { disabled: false } );\n\t},\n\n\tdisable: function() {\n\t\treturn this._setOptions( { disabled: true } );\n\t},\n\n\t_classes: function( options ) {\n\t\tvar full = [];\n\t\tvar that = this;\n\n\t\toptions = $.extend( {\n\t\t\telement: this.element,\n\t\t\tclasses: this.options.classes || {}\n\t\t}, options );\n\n\t\tfunction bindRemoveEvent() {\n\t\t\toptions.element.each( function( _, element ) {\n\t\t\t\tvar isTracked = $.map( that.classesElementLookup, function( elements ) {\n\t\t\t\t\treturn elements;\n\t\t\t\t} )\n\t\t\t\t\t.some( function( elements ) {\n\t\t\t\t\t\treturn elements.is( element );\n\t\t\t\t\t} );\n\n\t\t\t\tif ( !isTracked ) {\n\t\t\t\t\tthat._on( $( element ), {\n\t\t\t\t\t\tremove: \"_untrackClassesElement\"\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tfunction processClassString( classes, checkOption ) {\n\t\t\tvar current, i;\n\t\t\tfor ( i = 0; i < classes.length; i++ ) {\n\t\t\t\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\n\t\t\t\tif ( options.add ) {\n\t\t\t\t\tbindRemoveEvent();\n\t\t\t\t\tcurrent = $( $.uniqueSort( current.get().concat( options.element.get() ) ) );\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = $( current.not( options.element ).get() );\n\t\t\t\t}\n\t\t\t\tthat.classesElementLookup[ classes[ i ] ] = current;\n\t\t\t\tfull.push( classes[ i ] );\n\t\t\t\tif ( checkOption && options.classes[ classes[ i ] ] ) {\n\t\t\t\t\tfull.push( options.classes[ classes[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( options.keys ) {\n\t\t\tprocessClassString( options.keys.match( /\\S+/g ) || [], true );\n\t\t}\n\t\tif ( options.extra ) {\n\t\t\tprocessClassString( options.extra.match( /\\S+/g ) || [] );\n\t\t}\n\n\t\treturn full.join( \" \" );\n\t},\n\n\t_untrackClassesElement: function( event ) {\n\t\tvar that = this;\n\t\t$.each( that.classesElementLookup, function( key, value ) {\n\t\t\tif ( $.inArray( event.target, value ) !== -1 ) {\n\t\t\t\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\n\t\t\t}\n\t\t} );\n\n\t\tthis._off( $( event.target ) );\n\t},\n\n\t_removeClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, false );\n\t},\n\n\t_addClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, true );\n\t},\n\n\t_toggleClass: function( element, keys, extra, add ) {\n\t\tadd = ( typeof add === \"boolean\" ) ? add : extra;\n\t\tvar shift = ( typeof element === \"string\" || element === null ),\n\t\t\toptions = {\n\t\t\t\textra: shift ? keys : extra,\n\t\t\t\tkeys: shift ? element : keys,\n\t\t\t\telement: shift ? this.element : element,\n\t\t\t\tadd: add\n\t\t\t};\n\t\toptions.element.toggleClass( this._classes( options ), add );\n\t\treturn this;\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement;\n\t\tvar instance = this;\n\n\t\t// No suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// No element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\n\t\t\t\t// Allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// Copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ );\n\t\t\tvar eventName = match[ 1 ] + instance.eventNamespace;\n\t\t\tvar selector = match[ 2 ];\n\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.on( eventName, selector, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.on( eventName, handlerProxy );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = ( eventName || \"\" ).split( \" \" ).join( this.eventNamespace + \" \" ) +\n\t\t\tthis.eventNamespace;\n\t\telement.off( eventName );\n\n\t\t// Clear the stack to avoid memory leaks (#10056)\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig;\n\t\tvar callback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\n\t\t// The original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// Copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( typeof callback === \"function\" &&\n\t\t\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\n\t\tvar hasOptions;\n\t\tvar effectName = !options ?\n\t\t\tmethod :\n\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\tdefaultEffect :\n\t\t\t\toptions.effect || defaultEffect;\n\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t} else if ( options === true ) {\n\t\t\toptions = {};\n\t\t}\n\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue( function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t} );\n\t\t}\n\t};\n} );\n\n\n} ) );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/datepicker.js",
    "content": "/* eslint-disable max-len, camelcase */\n/*!\n * jQuery UI Datepicker 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Datepicker\n//>>group: Widgets\n//>>description: Displays a calendar from an input or inline for selecting dates.\n//>>docs: http://api.jqueryui.com/datepicker/\n//>>demos: http://jqueryui.com/datepicker/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/datepicker.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.extend( $.ui, { datepicker: { version: \"1.13.0\" } } );\n\nvar datepicker_instActive;\n\nfunction datepicker_getZindex( elem ) {\n\tvar position, value;\n\twhile ( elem.length && elem[ 0 ] !== document ) {\n\n\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t// This makes behavior of this function consistent across browsers\n\t\t// WebKit always returns auto if the element is positioned\n\t\tposition = elem.css( \"position\" );\n\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\n\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t// other browsers return a string\n\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t\telem = elem.parent();\n\t}\n\n\treturn 0;\n}\n\n/* Date picker manager.\n   Use the singleton instance of this class, $.datepicker, to interact with the date picker.\n   Settings for (groups of) date pickers are maintained in an instance object,\n   allowing multiple different settings on the same page. */\n\nfunction Datepicker() {\n\tthis._curInst = null; // The current instance in use\n\tthis._keyEvent = false; // If the last event was a key event\n\tthis._disabledInputs = []; // List of date picker inputs that have been disabled\n\tthis._datepickerShowing = false; // True if the popup picker is showing , false if not\n\tthis._inDialog = false; // True if showing within a \"dialog\", false if not\n\tthis._mainDivId = \"ui-datepicker-div-ty\"; // The ID of the main datepicker division\n\tthis._inlineClass = \"ui-datepicker-inline\"; // The name of the inline marker class\n\tthis._appendClass = \"ui-datepicker-append\"; // The name of the append marker class\n\tthis._triggerClass = \"ui-datepicker-trigger\"; // The name of the trigger marker class\n\tthis._dialogClass = \"ui-datepicker-dialog\"; // The name of the dialog marker class\n\tthis._disableClass = \"ui-datepicker-disabled\"; // The name of the disabled covering marker class\n\tthis._unselectableClass = \"ui-datepicker-unselectable\"; // The name of the unselectable cell marker class\n\tthis._currentClass = \"ui-datepicker-current-day\"; // The name of the current day marker class\n\tthis._dayOverClass = \"ui-datepicker-days-cell-over\"; // The name of the day hover marker class\n\tthis.regional = []; // Available regional settings, indexed by language code\n\tthis.regional[ \"\" ] = { // Default regional settings\n\t\tcloseText: \"完成\", // Display text for close link\n\t\tprevText: \"Prev\", // Display text for previous month link\n\t\tnextText: \"Next\", // Display text for next month link\n\t\tcurrentText: \"今天\", // Display text for current month link\n\t\tmonthNames: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n\t\t\t\"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ], // Names of months for drop-down and formatting\n\t\tmonthNamesShort: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ], // For formatting\n\t\tdayNames: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ], // For formatting\n\t\tdayNamesShort: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ], // For formatting\n\t\tdayNamesMin: [ \"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\" ], // Column headings for days starting at Sunday\n\t\tweekHeader: \"Wk\", // Column header for week of the year\n\t\tdateFormat: \"mm/dd/yy\", // See format options on parseDate\n\t\tfirstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...\n\t\tisRTL: false, // True if right-to-left language, false if left-to-right\n\t\tshowMonthAfterYear: false, // True if the year select precedes month, false for month then year\n\t\tyearSuffix: \"\", // Additional text to append to the year in the month headers,\n\t\tselectMonthLabel: \"Select month\", // Invisible label for month selector\n\t\tselectYearLabel: \"Select year\" // Invisible label for year selector\n\t};\n\tthis._defaults = { // Global defaults for all the date picker instances\n\t\tshowOn: \"focus\", // \"focus\" for popup on focus,\n\t\t\t// \"button\" for trigger button, or \"both\" for either\n\t\tshowAnim: \"fadeIn\", // Name of jQuery animation for popup\n\t\tshowOptions: {}, // Options for enhanced animations\n\t\tdefaultDate: null, // Used when field is blank: actual date,\n\t\t\t// +/-number for offset from today, null for today\n\t\tappendText: \"\", // Display text following the input box, e.g. showing the format\n\t\tbuttonText: \"...\", // Text for trigger button\n\t\tbuttonImage: \"\", // URL for trigger button image\n\t\tbuttonImageOnly: false, // True if the image appears alone, false if it appears on a button\n\t\thideIfNoPrevNext: false, // True to hide next/previous month links\n\t\t\t// if not applicable, false to just disable them\n\t\tnavigationAsDateFormat: false, // True if date formatting applied to prev/today/next links\n\t\tgotoCurrent: false, // True if today link goes back to current selection instead\n\t\tchangeMonth: false, // True if month can be selected directly, false if only prev/next\n\t\tchangeYear: false, // True if year can be selected directly, false if only prev/next\n\t\tyearRange: \"c-10:c+10\", // Range of years to display in drop-down,\n\t\t\t// either relative to today's year (-nn:+nn), relative to currently displayed year\n\t\t\t// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)\n\t\tshowOtherMonths: false, // True to show dates in other months, false to leave blank\n\t\tselectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable\n\t\tshowWeek: false, // True to show week of the year, false to not show it\n\t\tcalculateWeek: this.iso8601Week, // How to calculate the week of the year,\n\t\t\t// takes a Date and returns the number of the week for it\n\t\tshortYearCutoff: \"+10\", // Short year values < this are in the current century,\n\t\t\t// > this are in the previous century,\n\t\t\t// string value starting with \"+\" for current year + value\n\t\tminDate: null, // The earliest selectable date, or null for no limit\n\t\tmaxDate: null, // The latest selectable date, or null for no limit\n\t\tduration: \"fast\", // Duration of display/closure\n\t\tbeforeShowDay: null, // Function that takes a date and returns an array with\n\t\t\t// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or \"\",\n\t\t\t// [2] = cell title (optional), e.g. $.datepicker.noWeekends\n\t\tbeforeShow: null, // Function that takes an input field and\n\t\t\t// returns a set of custom settings for the date picker\n\t\tonSelect: null, // Define a callback function when a date is selected\n\t\tonChangeMonthYear: null, // Define a callback function when the month or year is changed\n\t\tonClose: null, // Define a callback function when the datepicker is closed\n\t\tonUpdateDatepicker: null, // Define a callback function when the datepicker is updated\n\t\tnumberOfMonths: 1, // Number of months to show at a time\n\t\tshowCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)\n\t\tstepMonths: 1, // Number of months to step back/forward\n\t\tstepBigMonths: 12, // Number of months to step back/forward for the big links\n\t\taltField: \"\", // Selector for an alternate field to store selected dates into\n\t\taltFormat: \"\", // The date format to use for the alternate field\n\t\tconstrainInput: true, // The input is constrained by the current date format\n\t\tshowButtonPanel: false, // True to show button panel, false to not show it\n\t\tautoSize: false, // True to size the input for the date format, false to leave as is\n\t\tdisabled: false // The initial disabled state\n\t};\n\t$.extend( this._defaults, this.regional[ \"\" ] );\n\tthis.regional.en = $.extend( true, {}, this.regional[ \"\" ] );\n\tthis.regional[ \"en-US\" ] = $.extend( true, {}, this.regional.en );\n\tthis.dpDiv = datepicker_bindHover( $( \"<div id='\" + this._mainDivId + \"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\" ) );\n}\n\n$.extend( Datepicker.prototype, {\n\n\t/* Class name added to elements to indicate already configured with a date picker. */\n\tmarkerClassName: \"hasDatepicker\",\n\n\t//Keep track of the maximum number of rows displayed (see #7043)\n\tmaxRows: 4,\n\n\t// TODO rename to \"widget\" when switching to widget factory\n\t_widgetDatepicker: function() {\n\t\treturn this.dpDiv;\n\t},\n\n\t/* Override the default settings for all instances of the date picker.\n\t * @param  settings  object - the new settings to use as defaults (anonymous object)\n\t * @return the manager object\n\t */\n\tsetDefaults: function( settings ) {\n\t\tdatepicker_extendRemove( this._defaults, settings || {} );\n\t\treturn this;\n\t},\n\n\t/* Attach the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t * @param  settings  object - the new settings to use for this date picker instance (anonymous)\n\t */\n\t_attachDatepicker: function( target, settings ) {\n\t\tvar nodeName, inline, inst;\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tinline = ( nodeName === \"div\" || nodeName === \"span\" );\n\t\tif ( !target.id ) {\n\t\t\tthis.uuid += 1;\n\t\t\ttarget.id = \"dp\" + this.uuid;\n\t\t}\n\t\tinst = this._newInst( $( target ), inline );\n\t\tinst.settings = $.extend( {}, settings || {} );\n\t\tif ( nodeName === \"input\" ) {\n\t\t\tthis._connectDatepicker( target, inst );\n\t\t} else if ( inline ) {\n\t\t\tthis._inlineDatepicker( target, inst );\n\t\t}\n\t},\n\n\t/* Create a new instance object. */\n\t_newInst: function( target, inline ) {\n\t\tvar id = target[ 0 ].id.replace( /([^A-Za-z0-9_\\-])/g, \"\\\\\\\\$1\" ); // escape jQuery meta chars\n\t\treturn { id: id, input: target, // associated target\n\t\t\tselectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection\n\t\t\tdrawMonth: 0, drawYear: 0, // month being drawn\n\t\t\tinline: inline, // is datepicker inline or not\n\t\t\tdpDiv: ( !inline ? this.dpDiv : // presentation div\n\t\t\tdatepicker_bindHover( $( \"<div class='\" + this._inlineClass + \" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\" ) ) ) };\n\t},\n\n\t/* Attach the date picker to an input field. */\n\t_connectDatepicker: function( target, inst ) {\n\t\tvar input = $( target );\n\t\tinst.append = $( [] );\n\t\tinst.trigger = $( [] );\n\t\tif ( input.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis._attachments( input, inst );\n\t\tinput.addClass( this.markerClassName ).on( \"keydown\", this._doKeyDown ).\n\t\t\ton( \"keypress\", this._doKeyPress ).on( \"keyup\", this._doKeyUp );\n\t\tthis._autoSize( inst );\n\t\t$.data( target, \"datepicker\", inst );\n\n\t\t//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)\n\t\tif ( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\t},\n\n\t/* Make attachments based on settings. */\n\t_attachments: function( input, inst ) {\n\t\tvar showOn, buttonText, buttonImage,\n\t\t\tappendText = this._get( inst, \"appendText\" ),\n\t\t\tisRTL = this._get( inst, \"isRTL\" );\n\n\t\tif ( inst.append ) {\n\t\t\tinst.append.remove();\n\t\t}\n\t\tif ( appendText ) {\n\t\t\tinst.append = $( \"<span>\" )\n\t\t\t\t.addClass( this._appendClass )\n\t\t\t\t.text( appendText );\n\t\t\tinput[ isRTL ? \"before\" : \"after\" ]( inst.append );\n\t\t}\n\n\t\tinput.off( \"focus\", this._showDatepicker );\n\n\t\tif ( inst.trigger ) {\n\t\t\tinst.trigger.remove();\n\t\t}\n\n\t\tshowOn = this._get( inst, \"showOn\" );\n\t\tif ( showOn === \"focus\" || showOn === \"both\" ) { // pop-up date picker when in the marked field\n\t\t\tinput.on( \"focus\", this._showDatepicker );\n\t\t}\n\t\tif ( showOn === \"button\" || showOn === \"both\" ) { // pop-up date picker when button clicked\n\t\t\tbuttonText = this._get( inst, \"buttonText\" );\n\t\t\tbuttonImage = this._get( inst, \"buttonImage\" );\n\n\t\t\tif ( this._get( inst, \"buttonImageOnly\" ) ) {\n\t\t\t\tinst.trigger = $( \"<img>\" )\n\t\t\t\t\t.addClass( this._triggerClass )\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\tsrc: buttonImage,\n\t\t\t\t\t\talt: buttonText,\n\t\t\t\t\t\ttitle: buttonText\n\t\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tinst.trigger = $( \"<button type='button'>\" )\n\t\t\t\t\t.addClass( this._triggerClass );\n\t\t\t\tif ( buttonImage ) {\n\t\t\t\t\tinst.trigger.html(\n\t\t\t\t\t\t$( \"<img>\" )\n\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\tsrc: buttonImage,\n\t\t\t\t\t\t\t\talt: buttonText,\n\t\t\t\t\t\t\t\ttitle: buttonText\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tinst.trigger.text( buttonText );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinput[ isRTL ? \"before\" : \"after\" ]( inst.trigger );\n\t\t\tinst.trigger.on( \"click\", function() {\n\t\t\t\tif ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t} else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t$.datepicker._showDatepicker( input[ 0 ] );\n\t\t\t\t} else {\n\t\t\t\t\t$.datepicker._showDatepicker( input[ 0 ] );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t} );\n\t\t}\n\t},\n\n\t/* Apply the maximum length for the date format. */\n\t_autoSize: function( inst ) {\n\t\tif ( this._get( inst, \"autoSize\" ) && !inst.inline ) {\n\t\t\tvar findMax, max, maxI, i,\n\t\t\t\tdate = new Date( 2009, 12 - 1, 20 ), // Ensure double digits\n\t\t\t\tdateFormat = this._get( inst, \"dateFormat\" );\n\n\t\t\tif ( dateFormat.match( /[DM]/ ) ) {\n\t\t\t\tfindMax = function( names ) {\n\t\t\t\t\tmax = 0;\n\t\t\t\t\tmaxI = 0;\n\t\t\t\t\tfor ( i = 0; i < names.length; i++ ) {\n\t\t\t\t\t\tif ( names[ i ].length > max ) {\n\t\t\t\t\t\t\tmax = names[ i ].length;\n\t\t\t\t\t\t\tmaxI = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn maxI;\n\t\t\t\t};\n\t\t\t\tdate.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?\n\t\t\t\t\t\"monthNames\" : \"monthNamesShort\" ) ) ) );\n\t\t\t\tdate.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?\n\t\t\t\t\t\"dayNames\" : \"dayNamesShort\" ) ) ) + 20 - date.getDay() );\n\t\t\t}\n\t\t\tinst.input.attr( \"size\", this._formatDate( inst, date ).length );\n\t\t}\n\t},\n\n\t/* Attach an inline date picker to a div. */\n\t_inlineDatepicker: function( target, inst ) {\n\t\tvar divSpan = $( target );\n\t\tif ( divSpan.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\t\tdivSpan.addClass( this.markerClassName ).append( inst.dpDiv );\n\t\t$.data( target, \"datepicker\", inst );\n\t\tthis._setDate( inst, this._getDefaultDate( inst ), true );\n\t\tthis._updateDatepicker( inst );\n\t\tthis._updateAlternate( inst );\n\n\t\t//If disabled option is true, disable the datepicker before showing it (see ticket #5665)\n\t\tif ( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\n\t\t// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements\n\t\t// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height\n\t\tinst.dpDiv.css( \"display\", \"block\" );\n\t},\n\n\t/* Pop-up the date picker in a \"dialog\" box.\n\t * @param  input element - ignored\n\t * @param  date\tstring or Date - the initial date to display\n\t * @param  onSelect  function - the function to call when a date is selected\n\t * @param  settings  object - update the dialog date picker instance's settings (anonymous object)\n\t * @param  pos int[2] - coordinates for the dialog's position within the screen or\n\t *\t\t\t\t\tevent - with x/y coordinates or\n\t *\t\t\t\t\tleave empty for default (screen centre)\n\t * @return the manager object\n\t */\n\t_dialogDatepicker: function( input, date, onSelect, settings, pos ) {\n\t\tvar id, browserWidth, browserHeight, scrollX, scrollY,\n\t\t\tinst = this._dialogInst; // internal instance\n\n\t\tif ( !inst ) {\n\t\t\tthis.uuid += 1;\n\t\t\tid = \"dp\" + this.uuid;\n\t\t\tthis._dialogInput = $( \"<input type='text' id='\" + id +\n\t\t\t\t\"' style='position: absolute; top: -100px; width: 0px;'/>\" );\n\t\t\tthis._dialogInput.on( \"keydown\", this._doKeyDown );\n\t\t\t$( \"body\" ).append( this._dialogInput );\n\t\t\tinst = this._dialogInst = this._newInst( this._dialogInput, false );\n\t\t\tinst.settings = {};\n\t\t\t$.data( this._dialogInput[ 0 ], \"datepicker\", inst );\n\t\t}\n\t\tdatepicker_extendRemove( inst.settings, settings || {} );\n\t\tdate = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );\n\t\tthis._dialogInput.val( date );\n\n\t\tthis._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );\n\t\tif ( !this._pos ) {\n\t\t\tbrowserWidth = document.documentElement.clientWidth;\n\t\t\tbrowserHeight = document.documentElement.clientHeight;\n\t\t\tscrollX = document.documentElement.scrollLeft || document.body.scrollLeft;\n\t\t\tscrollY = document.documentElement.scrollTop || document.body.scrollTop;\n\t\t\tthis._pos = // should use actual width/height below\n\t\t\t\t[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];\n\t\t}\n\n\t\t// Move input on screen for focus, but hidden behind dialog\n\t\tthis._dialogInput.css( \"left\", ( this._pos[ 0 ] + 20 ) + \"px\" ).css( \"top\", this._pos[ 1 ] + \"px\" );\n\t\tinst.settings.onSelect = onSelect;\n\t\tthis._inDialog = true;\n\t\tthis.dpDiv.addClass( this._dialogClass );\n\t\tthis._showDatepicker( this._dialogInput[ 0 ] );\n\t\tif ( $.blockUI ) {\n\t\t\t$.blockUI( this.dpDiv );\n\t\t}\n\t\t$.data( this._dialogInput[ 0 ], \"datepicker\", inst );\n\t\treturn this;\n\t},\n\n\t/* Detach a datepicker from its control.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_destroyDatepicker: function( target ) {\n\t\tvar nodeName,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\t$.removeData( target, \"datepicker\" );\n\t\tif ( nodeName === \"input\" ) {\n\t\t\tinst.append.remove();\n\t\t\tinst.trigger.remove();\n\t\t\t$target.removeClass( this.markerClassName ).\n\t\t\t\toff( \"focus\", this._showDatepicker ).\n\t\t\t\toff( \"keydown\", this._doKeyDown ).\n\t\t\t\toff( \"keypress\", this._doKeyPress ).\n\t\t\t\toff( \"keyup\", this._doKeyUp );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\t$target.removeClass( this.markerClassName ).empty();\n\t\t}\n\n\t\tif ( datepicker_instActive === inst ) {\n\t\t\tdatepicker_instActive = null;\n\t\t\tthis._curInst = null;\n\t\t}\n\t},\n\n\t/* Enable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_enableDatepicker: function( target ) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif ( nodeName === \"input\" ) {\n\t\t\ttarget.disabled = false;\n\t\t\tinst.trigger.filter( \"button\" ).\n\t\t\t\teach( function() {\n\t\t\t\t\tthis.disabled = false;\n\t\t\t\t} ).end().\n\t\t\t\tfilter( \"img\" ).css( { opacity: \"1.0\", cursor: \"\" } );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\tinline = $target.children( \".\" + this._inlineClass );\n\t\t\tinline.children().removeClass( \"ui-state-disabled\" );\n\t\t\tinline.find( \"select.ui-datepicker-month, select.ui-datepicker-year\" ).\n\t\t\t\tprop( \"disabled\", false );\n\t\t}\n\t\tthis._disabledInputs = $.map( this._disabledInputs,\n\n\t\t\t// Delete entry\n\t\t\tfunction( value ) {\n\t\t\t\treturn ( value === target ? null : value );\n\t\t\t} );\n\t},\n\n\t/* Disable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_disableDatepicker: function( target ) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif ( nodeName === \"input\" ) {\n\t\t\ttarget.disabled = true;\n\t\t\tinst.trigger.filter( \"button\" ).\n\t\t\t\teach( function() {\n\t\t\t\t\tthis.disabled = true;\n\t\t\t\t} ).end().\n\t\t\t\tfilter( \"img\" ).css( { opacity: \"0.5\", cursor: \"default\" } );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\tinline = $target.children( \".\" + this._inlineClass );\n\t\t\tinline.children().addClass( \"ui-state-disabled\" );\n\t\t\tinline.find( \"select.ui-datepicker-month, select.ui-datepicker-year\" ).\n\t\t\t\tprop( \"disabled\", true );\n\t\t}\n\t\tthis._disabledInputs = $.map( this._disabledInputs,\n\n\t\t\t// Delete entry\n\t\t\tfunction( value ) {\n\t\t\t\treturn ( value === target ? null : value );\n\t\t\t} );\n\t\tthis._disabledInputs[ this._disabledInputs.length ] = target;\n\t},\n\n\t/* Is the first field in a jQuery collection disabled as a datepicker?\n\t * @param  target\telement - the target input field or division or span\n\t * @return boolean - true if disabled, false if enabled\n\t */\n\t_isDisabledDatepicker: function( target ) {\n\t\tif ( !target ) {\n\t\t\treturn false;\n\t\t}\n\t\tfor ( var i = 0; i < this._disabledInputs.length; i++ ) {\n\t\t\tif ( this._disabledInputs[ i ] === target ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t/* Retrieve the instance data for the target control.\n\t * @param  target  element - the target input field or division or span\n\t * @return  object - the associated instance data\n\t * @throws  error if a jQuery problem getting data\n\t */\n\t_getInst: function( target ) {\n\t\ttry {\n\t\t\treturn $.data( target, \"datepicker\" );\n\t\t} catch ( err ) {\n\t\t\tthrow \"Missing instance data for this datepicker\";\n\t\t}\n\t},\n\n\t/* Update or retrieve the settings for a date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t * @param  name\tobject - the new settings to update or\n\t *\t\t\t\tstring - the name of the setting to change or retrieve,\n\t *\t\t\t\twhen retrieving also \"all\" for all instance settings or\n\t *\t\t\t\t\"defaults\" for all global defaults\n\t * @param  value   any - the new value for the setting\n\t *\t\t\t\t(omit if above is an object or to retrieve a value)\n\t */\n\t_optionDatepicker: function( target, name, value ) {\n\t\tvar settings, date, minDate, maxDate,\n\t\t\tinst = this._getInst( target );\n\n\t\tif ( arguments.length === 2 && typeof name === \"string\" ) {\n\t\t\treturn ( name === \"defaults\" ? $.extend( {}, $.datepicker._defaults ) :\n\t\t\t\t( inst ? ( name === \"all\" ? $.extend( {}, inst.settings ) :\n\t\t\t\tthis._get( inst, name ) ) : null ) );\n\t\t}\n\n\t\tsettings = name || {};\n\t\tif ( typeof name === \"string\" ) {\n\t\t\tsettings = {};\n\t\t\tsettings[ name ] = value;\n\t\t}\n\n\t\tif ( inst ) {\n\t\t\tif ( this._curInst === inst ) {\n\t\t\t\tthis._hideDatepicker();\n\t\t\t}\n\n\t\t\tdate = this._getDateDatepicker( target, true );\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" );\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" );\n\t\t\tdatepicker_extendRemove( inst.settings, settings );\n\n\t\t\t// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided\n\t\t\tif ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {\n\t\t\t\tinst.settings.minDate = this._formatDate( inst, minDate );\n\t\t\t}\n\t\t\tif ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {\n\t\t\t\tinst.settings.maxDate = this._formatDate( inst, maxDate );\n\t\t\t}\n\t\t\tif ( \"disabled\" in settings ) {\n\t\t\t\tif ( settings.disabled ) {\n\t\t\t\t\tthis._disableDatepicker( target );\n\t\t\t\t} else {\n\t\t\t\t\tthis._enableDatepicker( target );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._attachments( $( target ), inst );\n\t\t\tthis._autoSize( inst );\n\t\t\tthis._setDate( inst, date );\n\t\t\tthis._updateAlternate( inst );\n\t\t\tthis._updateDatepicker( inst );\n\t\t}\n\t},\n\n\t// Change method deprecated\n\t_changeDatepicker: function( target, name, value ) {\n\t\tthis._optionDatepicker( target, name, value );\n\t},\n\n\t/* Redraw the date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t */\n\t_refreshDatepicker: function( target ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst ) {\n\t\t\tthis._updateDatepicker( inst );\n\t\t}\n\t},\n\n\t/* Set the dates for a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  date\tDate - the new date\n\t */\n\t_setDateDatepicker: function( target, date ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst ) {\n\t\t\tthis._setDate( inst, date );\n\t\t\tthis._updateDatepicker( inst );\n\t\t\tthis._updateAlternate( inst );\n\t\t}\n\t},\n\n\t/* Get the date(s) for the first entry in a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  noDefault boolean - true if no default date is to be used\n\t * @return Date - the current date\n\t */\n\t_getDateDatepicker: function( target, noDefault ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst && !inst.inline ) {\n\t\t\tthis._setDateFromField( inst, noDefault );\n\t\t}\n\t\treturn ( inst ? this._getDate( inst ) : null );\n\t},\n\n\t/* Handle keystrokes. */\n\t_doKeyDown: function( event ) {\n\t\tvar onSelect, dateStr, sel,\n\t\t\tinst = $.datepicker._getInst( event.target ),\n\t\t\thandled = true,\n\t\t\tisRTL = inst.dpDiv.is( \".ui-datepicker-rtl\" );\n\n\t\tinst._keyEvent = true;\n\t\tif ( $.datepicker._datepickerShowing ) {\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase 9: $.datepicker._hideDatepicker();\n\t\t\t\t\t\thandled = false;\n\t\t\t\t\t\tbreak; // hide on tab out\n\t\t\t\tcase 13: sel = $( \"td.\" + $.datepicker._dayOverClass + \":not(.\" +\n\t\t\t\t\t\t\t\t\t$.datepicker._currentClass + \")\", inst.dpDiv );\n\t\t\t\t\t\tif ( sel[ 0 ] ) {\n\t\t\t\t\t\t\t$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonSelect = $.datepicker._get( inst, \"onSelect\" );\n\t\t\t\t\t\tif ( onSelect ) {\n\t\t\t\t\t\t\tdateStr = $.datepicker._formatDate( inst );\n\n\t\t\t\t\t\t\t// Trigger custom callback\n\t\t\t\t\t\t\tonSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false; // don't submit the form\n\t\t\t\tcase 27: $.datepicker._hideDatepicker();\n\t\t\t\t\t\tbreak; // hide on escape\n\t\t\t\tcase 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\tbreak; // previous month/year on page up/+ ctrl\n\t\t\t\tcase 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\tbreak; // next month/year on page down/+ ctrl\n\t\t\t\tcase 35: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._clearDate( event.target );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // clear on ctrl or command +end\n\t\t\t\tcase 36: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._gotoToday( event.target );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // current on ctrl or command +home\n\t\t\t\tcase 37: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\n\t\t\t\t\t\t// -1 day on ctrl or command +left\n\t\t\t\t\t\tif ( event.originalEvent.altKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// next month/year on alt +left on Mac\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 38: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, -7, \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // -1 week on ctrl or command +up\n\t\t\t\tcase 39: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\n\t\t\t\t\t\t// +1 day on ctrl or command +right\n\t\t\t\t\t\tif ( event.originalEvent.altKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// next month/year on alt +right\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 40: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, +7, \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // +1 week on ctrl or command +down\n\t\t\t\tdefault: handled = false;\n\t\t\t}\n\t\t} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home\n\t\t\t$.datepicker._showDatepicker( this );\n\t\t} else {\n\t\t\thandled = false;\n\t\t}\n\n\t\tif ( handled ) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t},\n\n\t/* Filter entered characters - based on date format. */\n\t_doKeyPress: function( event ) {\n\t\tvar chars, chr,\n\t\t\tinst = $.datepicker._getInst( event.target );\n\n\t\tif ( $.datepicker._get( inst, \"constrainInput\" ) ) {\n\t\t\tchars = $.datepicker._possibleChars( $.datepicker._get( inst, \"dateFormat\" ) );\n\t\t\tchr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );\n\t\t\treturn event.ctrlKey || event.metaKey || ( chr < \" \" || !chars || chars.indexOf( chr ) > -1 );\n\t\t}\n\t},\n\n\t/* Synchronise manual entry and field/alternate field. */\n\t_doKeyUp: function( event ) {\n\t\tvar date,\n\t\t\tinst = $.datepicker._getInst( event.target );\n\n\t\tif ( inst.input.val() !== inst.lastVal ) {\n\t\t\ttry {\n\t\t\t\tdate = $.datepicker.parseDate( $.datepicker._get( inst, \"dateFormat\" ),\n\t\t\t\t\t( inst.input ? inst.input.val() : null ),\n\t\t\t\t\t$.datepicker._getFormatConfig( inst ) );\n\n\t\t\t\tif ( date ) { // only if valid\n\t\t\t\t\t$.datepicker._setDateFromField( inst );\n\t\t\t\t\t$.datepicker._updateAlternate( inst );\n\t\t\t\t\t$.datepicker._updateDatepicker( inst );\n\t\t\t\t}\n\t\t\t} catch ( err ) {\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t},\n\n\t/* Pop-up the date picker for a given input field.\n\t * If false returned from beforeShow event handler do not show.\n\t * @param  input  element - the input field attached to the date picker or\n\t *\t\t\t\t\tevent - if triggered by focus\n\t */\n\t_showDatepicker: function( input ) {\n\t\tinput = input.target || input;\n\t\tif ( input.nodeName.toLowerCase() !== \"input\" ) { // find from button/image trigger\n\t\t\tinput = $( \"input\", input.parentNode )[ 0 ];\n\t\t}\n\n\t\tif ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here\n\t\t\treturn;\n\t\t}\n\n\t\tvar inst, beforeShow, beforeShowSettings, isFixed,\n\t\t\toffset, showAnim, duration;\n\n\t\tinst = $.datepicker._getInst( input );\n\t\tif ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {\n\t\t\t$.datepicker._curInst.dpDiv.stop( true, true );\n\t\t\tif ( inst && $.datepicker._datepickerShowing ) {\n\t\t\t\t$.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );\n\t\t\t}\n\t\t}\n\n\t\tbeforeShow = $.datepicker._get( inst, \"beforeShow\" );\n\t\tbeforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};\n\t\tif ( beforeShowSettings === false ) {\n\t\t\treturn;\n\t\t}\n\t\tdatepicker_extendRemove( inst.settings, beforeShowSettings );\n\n\t\tinst.lastVal = null;\n\t\t$.datepicker._lastInput = input;\n\t\t$.datepicker._setDateFromField( inst );\n\n\t\tif ( $.datepicker._inDialog ) { // hide cursor\n\t\t\tinput.value = \"\";\n\t\t}\n\t\tif ( !$.datepicker._pos ) { // position below input\n\t\t\t$.datepicker._pos = $.datepicker._findPos( input );\n\t\t\t$.datepicker._pos[ 1 ] += input.offsetHeight; // add the height\n\t\t}\n\n\t\tisFixed = false;\n\t\t$( input ).parents().each( function() {\n\t\t\tisFixed |= $( this ).css( \"position\" ) === \"fixed\";\n\t\t\treturn !isFixed;\n\t\t} );\n\n\t\toffset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };\n\t\t$.datepicker._pos = null;\n\n\t\t//to avoid flashes on Firefox\n\t\tinst.dpDiv.empty();\n\n\t\t// determine sizing offscreen\n\t\tinst.dpDiv.css( { position: \"absolute\", display: \"block\", top: \"-1000px\" } );\n\t\t$.datepicker._updateDatepicker( inst );\n\n\t\t// fix width for dynamic number of date pickers\n\t\t// and adjust position before showing\n\t\toffset = $.datepicker._checkOffset( inst, offset, isFixed );\n\t\tinst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?\n\t\t\t\"static\" : ( isFixed ? \"fixed\" : \"absolute\" ) ), display: \"none\",\n\t\t\tleft: offset.left + \"px\", top: offset.top + \"px\" } );\n\n\t\tif ( !inst.inline ) {\n\t\t\tshowAnim = $.datepicker._get( inst, \"showAnim\" );\n\t\t\tduration = $.datepicker._get( inst, \"duration\" );\n\t\t\tinst.dpDiv.css( \"z-index\", datepicker_getZindex( $( input ) ) + 1 );\n\t\t\t$.datepicker._datepickerShowing = true;\n\n\t\t\tif ( $.effects && $.effects.effect[ showAnim ] ) {\n\t\t\t\tinst.dpDiv.show( showAnim, $.datepicker._get( inst, \"showOptions\" ), duration );\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[ showAnim || \"show\" ]( showAnim ? duration : null );\n\t\t\t}\n\n\t\t\tif ( $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\t\tinst.input.trigger( \"focus\" );\n\t\t\t}\n\n\t\t\t$.datepicker._curInst = inst;\n\t\t}\n\t},\n\n\t/* Generate the date picker content. */\n\t_updateDatepicker: function( inst ) {\n\t\tthis.maxRows = 4; //Reset the max number of rows being displayed (see #7043)\n\t\tdatepicker_instActive = inst; // for delegate hover events\n\t\tinst.dpDiv.empty().append( this._generateHTML( inst ) );\n\t\tthis._attachHandlers( inst );\n\n\t\tvar origyearshtml,\n\t\t\tnumMonths = this._getNumberOfMonths( inst ),\n\t\t\tcols = numMonths[ 1 ],\n\t\t\twidth = 17,\n\t\t\tactiveCell = inst.dpDiv.find( \".\" + this._dayOverClass + \" a\" ),\n\t\t\tonUpdateDatepicker = $.datepicker._get( inst, \"onUpdateDatepicker\" );\n\n\t\tif ( activeCell.length > 0 ) {\n\t\t\tdatepicker_handleMouseover.apply( activeCell.get( 0 ) );\n\t\t}\n\n\t\tinst.dpDiv.removeClass( \"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\" ).width( \"\" );\n\t\tif ( cols > 1 ) {\n\t\t\tinst.dpDiv.addClass( \"ui-datepicker-multi-\" + cols ).css( \"width\", ( width * cols ) + \"em\" );\n\t\t}\n\t\tinst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? \"add\" : \"remove\" ) +\n\t\t\t\"Class\" ]( \"ui-datepicker-multi\" );\n\t\tinst.dpDiv[ ( this._get( inst, \"isRTL\" ) ? \"add\" : \"remove\" ) +\n\t\t\t\"Class\" ]( \"ui-datepicker-rtl\" );\n\n\t\tif ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\tinst.input.trigger( \"focus\" );\n\t\t}\n\n\t\t// Deffered render of the years select (to avoid flashes on Firefox)\n\t\tif ( inst.yearshtml ) {\n\t\t\torigyearshtml = inst.yearshtml;\n\t\t\tsetTimeout( function() {\n\n\t\t\t\t//assure that inst.yearshtml didn't change.\n\t\t\t\tif ( origyearshtml === inst.yearshtml && inst.yearshtml ) {\n\t\t\t\t\tinst.dpDiv.find( \"select.ui-datepicker-year\" ).first().replaceWith( inst.yearshtml );\n\t\t\t\t}\n\t\t\t\torigyearshtml = inst.yearshtml = null;\n\t\t\t}, 0 );\n\t\t}\n\n\t\tif ( onUpdateDatepicker ) {\n\t\t\tonUpdateDatepicker.apply( ( inst.input ? inst.input[ 0 ] : null ), [ inst ] );\n\t\t}\n\t},\n\n\t// #6694 - don't focus the input if it's already focused\n\t// this breaks the change event in IE\n\t// Support: IE and jQuery <1.9\n\t_shouldFocusInput: function( inst ) {\n\t\treturn inst.input && inst.input.is( \":visible\" ) && !inst.input.is( \":disabled\" ) && !inst.input.is( \":focus\" );\n\t},\n\n\t/* Check positioning to remain on screen. */\n\t_checkOffset: function( inst, offset, isFixed ) {\n\t\tvar dpWidth = inst.dpDiv.outerWidth(),\n\t\t\tdpHeight = inst.dpDiv.outerHeight(),\n\t\t\tinputWidth = inst.input ? inst.input.outerWidth() : 0,\n\t\t\tinputHeight = inst.input ? inst.input.outerHeight() : 0,\n\t\t\tviewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),\n\t\t\tviewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );\n\n\t\toffset.left -= ( this._get( inst, \"isRTL\" ) ? ( dpWidth - inputWidth ) : 0 );\n\t\toffset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;\n\t\toffset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;\n\n\t\t// Now check if datepicker is showing outside window viewport - move to a better place if so.\n\t\toffset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?\n\t\t\tMath.abs( offset.left + dpWidth - viewWidth ) : 0 );\n\t\toffset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?\n\t\t\tMath.abs( dpHeight + inputHeight ) : 0 );\n\n\t\treturn offset;\n\t},\n\n\t/* Find an object's position on the screen. */\n\t_findPos: function( obj ) {\n\t\tvar position,\n\t\t\tinst = this._getInst( obj ),\n\t\t\tisRTL = this._get( inst, \"isRTL\" );\n\n\t\twhile ( obj && ( obj.type === \"hidden\" || obj.nodeType !== 1 || $.expr.pseudos.hidden( obj ) ) ) {\n\t\t\tobj = obj[ isRTL ? \"previousSibling\" : \"nextSibling\" ];\n\t\t}\n\n\t\tposition = $( obj ).offset();\n\t\treturn [ position.left, position.top ];\n\t},\n\n\t/* Hide the date picker from view.\n\t * @param  input  element - the input field attached to the date picker\n\t */\n\t_hideDatepicker: function( input ) {\n\t\tvar showAnim, duration, postProcess, onClose,\n\t\t\tinst = this._curInst;\n\n\t\tif ( !inst || ( input && inst !== $.data( input, \"datepicker\" ) ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this._datepickerShowing ) {\n\t\t\tshowAnim = this._get( inst, \"showAnim\" );\n\t\t\tduration = this._get( inst, \"duration\" );\n\t\t\tpostProcess = function() {\n\t\t\t\t$.datepicker._tidyDialog( inst );\n\t\t\t};\n\n\t\t\t// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed\n\t\t\tif ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {\n\t\t\t\tinst.dpDiv.hide( showAnim, $.datepicker._get( inst, \"showOptions\" ), duration, postProcess );\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[ ( showAnim === \"slideDown\" ? \"slideUp\" :\n\t\t\t\t\t( showAnim === \"fadeIn\" ? \"fadeOut\" : \"hide\" ) ) ]( ( showAnim ? duration : null ), postProcess );\n\t\t\t}\n\n\t\t\tif ( !showAnim ) {\n\t\t\t\tpostProcess();\n\t\t\t}\n\t\t\tthis._datepickerShowing = false;\n\n\t\t\tonClose = this._get( inst, \"onClose\" );\n\t\t\tif ( onClose ) {\n\t\t\t\tonClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : \"\" ), inst ] );\n\t\t\t}\n\n\t\t\tthis._lastInput = null;\n\t\t\tif ( this._inDialog ) {\n\t\t\t\tthis._dialogInput.css( { position: \"absolute\", left: \"0\", top: \"-100px\" } );\n\t\t\t\tif ( $.blockUI ) {\n\t\t\t\t\t$.unblockUI();\n\t\t\t\t\t$( \"body\" ).append( this.dpDiv );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._inDialog = false;\n\t\t}\n\t},\n\n\t/* Tidy up after a dialog display. */\n\t_tidyDialog: function( inst ) {\n\t\tinst.dpDiv.removeClass( this._dialogClass ).off( \".ui-datepicker-calendar\" );\n\t},\n\n\t/* Close date picker if clicked elsewhere. */\n\t_checkExternalClick: function( event ) {\n\t\tif ( !$.datepicker._curInst ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar $target = $( event.target ),\n\t\t\tinst = $.datepicker._getInst( $target[ 0 ] );\n\n\t\tif ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&\n\t\t\t\t$target.parents( \"#\" + $.datepicker._mainDivId ).length === 0 &&\n\t\t\t\t!$target.hasClass( $.datepicker.markerClassName ) &&\n\t\t\t\t!$target.closest( \".\" + $.datepicker._triggerClass ).length &&\n\t\t\t\t$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||\n\t\t\t( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {\n\t\t\t\t$.datepicker._hideDatepicker();\n\t\t}\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustDate: function( id, offset, period ) {\n\t\tvar target = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tif ( this._isDisabledDatepicker( target[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis._adjustInstDate( inst, offset, period );\n\t\tthis._updateDatepicker( inst );\n\t},\n\n\t/* Action for current link. */\n\t_gotoToday: function( id ) {\n\t\tvar date,\n\t\t\ttarget = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tif ( this._get( inst, \"gotoCurrent\" ) && inst.currentDay ) {\n\t\t\tinst.selectedDay = inst.currentDay;\n\t\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth;\n\t\t\tinst.drawYear = inst.selectedYear = inst.currentYear;\n\t\t} else {\n\t\t\tdate = new Date();\n\t\t\tinst.selectedDay = date.getDate();\n\t\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\t}\n\t\tthis._notifyChange( inst );\n\t\tthis._adjustDate( target );\n\t},\n\n\t/* Action for selecting a new month/year. */\n\t_selectMonthYear: function( id, select, period ) {\n\t\tvar target = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tinst[ \"selected\" + ( period === \"M\" ? \"Month\" : \"Year\" ) ] =\n\t\tinst[ \"draw\" + ( period === \"M\" ? \"Month\" : \"Year\" ) ] =\n\t\t\tparseInt( select.options[ select.selectedIndex ].value, 10 );\n\n\t\tthis._notifyChange( inst );\n\t\tthis._adjustDate( target );\n\t},\n\n\t/* Action for selecting a day. */\n\t_selectDay: function( id, month, year, td ) {\n\t\tvar inst,\n\t\t\ttarget = $( id );\n\n\t\tif ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tinst = this._getInst( target[ 0 ] );\n\t\tinst.selectedDay = inst.currentDay = parseInt( $( \"a\", td ).attr( \"data-date\" ) );\n\t\tinst.selectedMonth = inst.currentMonth = month;\n\t\tinst.selectedYear = inst.currentYear = year;\n\t\tthis._selectDate( id, this._formatDate( inst,\n\t\t\tinst.currentDay, inst.currentMonth, inst.currentYear ) );\n\t},\n\n\t/* Erase the input field and hide the date picker. */\n\t_clearDate: function( id ) {\n\t\tvar target = $( id );\n\t\tthis._selectDate( target, \"\" );\n\t},\n\n\t/* Update the input field with the selected date. */\n\t_selectDate: function( id, dateStr ) {\n\t\tvar onSelect,\n\t\t\ttarget = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tdateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );\n\t\tif ( inst.input ) {\n\t\t\tinst.input.val( dateStr );\n\t\t}\n\t\tthis._updateAlternate( inst );\n\n\t\tonSelect = this._get( inst, \"onSelect\" );\n\t\tif ( onSelect ) {\n\t\t\tonSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback\n\t\t} else if ( inst.input ) {\n\t\t\tinst.input.trigger( \"change\" ); // fire the change event\n\t\t}\n\n\t\tif ( inst.inline ) {\n\t\t\tthis._updateDatepicker( inst );\n\t\t} else {\n\t\t\tthis._hideDatepicker();\n\t\t\tthis._lastInput = inst.input[ 0 ];\n\t\t\tif ( typeof( inst.input[ 0 ] ) !== \"object\" ) {\n\t\t\t\tinst.input.trigger( \"focus\" ); // restore focus\n\t\t\t}\n\t\t\tthis._lastInput = null;\n\t\t}\n\t},\n\n\t/* Update any alternate field to synchronise with the main field. */\n\t_updateAlternate: function( inst ) {\n\t\tvar altFormat, date, dateStr,\n\t\t\taltField = this._get( inst, \"altField\" );\n\n\t\tif ( altField ) { // update alternate field too\n\t\t\taltFormat = this._get( inst, \"altFormat\" ) || this._get( inst, \"dateFormat\" );\n\t\t\tdate = this._getDate( inst );\n\t\t\tdateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );\n\t\t\t$( document ).find( altField ).val( dateStr );\n\t\t}\n\t},\n\n\t/* Set as beforeShowDay function to prevent selection of weekends.\n\t * @param  date  Date - the date to customise\n\t * @return [boolean, string] - is this date selectable?, what is its CSS class?\n\t */\n\tnoWeekends: function( date ) {\n\t\tvar day = date.getDay();\n\t\treturn [ ( day > 0 && day < 6 ), \"\" ];\n\t},\n\n\t/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.\n\t * @param  date  Date - the date to get the week for\n\t * @return  number - the number of the week within the year that contains this date\n\t */\n\tiso8601Week: function( date ) {\n\t\tvar time,\n\t\t\tcheckDate = new Date( date.getTime() );\n\n\t\t// Find Thursday of this week starting on Monday\n\t\tcheckDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );\n\n\t\ttime = checkDate.getTime();\n\t\tcheckDate.setMonth( 0 ); // Compare with Jan 1\n\t\tcheckDate.setDate( 1 );\n\t\treturn Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;\n\t},\n\n\t/* Parse a string value into a date object.\n\t * See formatDate below for the possible formats.\n\t *\n\t * @param  format string - the expected format of the date\n\t * @param  value string - the date in the above format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tshortYearCutoff  number - the cutoff year for determining the century (optional)\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  Date - the extracted date value or null if value is blank\n\t */\n\tparseDate: function( format, value, settings ) {\n\t\tif ( format == null || value == null ) {\n\t\t\tthrow \"Invalid arguments\";\n\t\t}\n\n\t\tvalue = ( typeof value === \"object\" ? value.toString() : value + \"\" );\n\t\tif ( value === \"\" ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar iFormat, dim, extra,\n\t\t\tiValue = 0,\n\t\t\tshortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,\n\t\t\tshortYearCutoff = ( typeof shortYearCutoffTemp !== \"string\" ? shortYearCutoffTemp :\n\t\t\t\tnew Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),\n\t\t\tdayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,\n\t\t\tdayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,\n\t\t\tyear = -1,\n\t\t\tmonth = -1,\n\t\t\tday = -1,\n\t\t\tdoy = -1,\n\t\t\tliteral = false,\n\t\t\tdate,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\n\t\t\t// Extract a number from the string value\n\t\t\tgetNumber = function( match ) {\n\t\t\t\tvar isDoubled = lookAhead( match ),\n\t\t\t\t\tsize = ( match === \"@\" ? 14 : ( match === \"!\" ? 20 :\n\t\t\t\t\t( match === \"y\" && isDoubled ? 4 : ( match === \"o\" ? 3 : 2 ) ) ) ),\n\t\t\t\t\tminSize = ( match === \"y\" ? size : 1 ),\n\t\t\t\t\tdigits = new RegExp( \"^\\\\d{\" + minSize + \",\" + size + \"}\" ),\n\t\t\t\t\tnum = value.substring( iValue ).match( digits );\n\t\t\t\tif ( !num ) {\n\t\t\t\t\tthrow \"Missing number at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue += num[ 0 ].length;\n\t\t\t\treturn parseInt( num[ 0 ], 10 );\n\t\t\t},\n\n\t\t\t// Extract a name from the string value and convert to an index\n\t\t\tgetName = function( match, shortNames, longNames ) {\n\t\t\t\tvar index = -1,\n\t\t\t\t\tnames = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {\n\t\t\t\t\t\treturn [ [ k, v ] ];\n\t\t\t\t\t} ).sort( function( a, b ) {\n\t\t\t\t\t\treturn -( a[ 1 ].length - b[ 1 ].length );\n\t\t\t\t\t} );\n\n\t\t\t\t$.each( names, function( i, pair ) {\n\t\t\t\t\tvar name = pair[ 1 ];\n\t\t\t\t\tif ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {\n\t\t\t\t\t\tindex = pair[ 0 ];\n\t\t\t\t\t\tiValue += name.length;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\treturn index + 1;\n\t\t\t\t} else {\n\t\t\t\t\tthrow \"Unknown name at position \" + iValue;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Confirm that a literal character matches the string value\n\t\t\tcheckLiteral = function() {\n\t\t\t\tif ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {\n\t\t\t\t\tthrow \"Unexpected literal at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue++;\n\t\t\t};\n\n\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\tif ( literal ) {\n\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\tday = getNumber( \"d\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\tgetName( \"D\", dayNamesShort, dayNames );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\tdoy = getNumber( \"o\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tmonth = getNumber( \"m\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\tmonth = getName( \"M\", monthNamesShort, monthNames );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\tyear = getNumber( \"y\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\tdate = new Date( getNumber( \"@\" ) );\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\tdate = new Date( ( getNumber( \"!\" ) - this._ticksTo1970 ) / 10000 );\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( iValue < value.length ) {\n\t\t\textra = value.substr( iValue );\n\t\t\tif ( !/^\\s+/.test( extra ) ) {\n\t\t\t\tthrow \"Extra/unparsed characters found in date: \" + extra;\n\t\t\t}\n\t\t}\n\n\t\tif ( year === -1 ) {\n\t\t\tyear = new Date().getFullYear();\n\t\t} else if ( year < 100 ) {\n\t\t\tyear += new Date().getFullYear() - new Date().getFullYear() % 100 +\n\t\t\t\t( year <= shortYearCutoff ? 0 : -100 );\n\t\t}\n\n\t\tif ( doy > -1 ) {\n\t\t\tmonth = 1;\n\t\t\tday = doy;\n\t\t\tdo {\n\t\t\t\tdim = this._getDaysInMonth( year, month - 1 );\n\t\t\t\tif ( day <= dim ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmonth++;\n\t\t\t\tday -= dim;\n\t\t\t} while ( true );\n\t\t}\n\n\t\tdate = this._daylightSavingAdjust( new Date( year, month - 1, day ) );\n\t\tif ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {\n\t\t\tthrow \"Invalid date\"; // E.g. 31/02/00\n\t\t}\n\t\treturn date;\n\t},\n\n\t/* Standard date formats. */\n\tATOM: \"yy-mm-dd\", // RFC 3339 (ISO 8601)\n\tCOOKIE: \"D, dd M yy\",\n\tISO_8601: \"yy-mm-dd\",\n\tRFC_822: \"D, d M y\",\n\tRFC_850: \"DD, dd-M-y\",\n\tRFC_1036: \"D, d M y\",\n\tRFC_1123: \"D, d M yy\",\n\tRFC_2822: \"D, d M yy\",\n\tRSS: \"D, d M y\", // RFC 822\n\tTICKS: \"!\",\n\tTIMESTAMP: \"@\",\n\tW3C: \"yy-mm-dd\", // ISO 8601\n\n\t_ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +\n\t\tMath.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),\n\n\t/* Format a date object into a string value.\n\t * The format can be combinations of the following:\n\t * d  - day of month (no leading zero)\n\t * dd - day of month (two digit)\n\t * o  - day of year (no leading zeros)\n\t * oo - day of year (three digit)\n\t * D  - day name short\n\t * DD - day name long\n\t * m  - month of year (no leading zero)\n\t * mm - month of year (two digit)\n\t * M  - month name short\n\t * MM - month name long\n\t * y  - year (two digit)\n\t * yy - year (four digit)\n\t * @ - Unix timestamp (ms since 01/01/1970)\n\t * ! - Windows ticks (100ns since 01/01/0001)\n\t * \"...\" - literal text\n\t * '' - single quote\n\t *\n\t * @param  format string - the desired format of the date\n\t * @param  date Date - the date value to format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  string - the date in the above format\n\t */\n\tformatDate: function( format, date, settings ) {\n\t\tif ( !date ) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tvar iFormat,\n\t\t\tdayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,\n\t\t\tdayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\n\t\t\t// Format a number, with leading zero if necessary\n\t\t\tformatNumber = function( match, value, len ) {\n\t\t\t\tvar num = \"\" + value;\n\t\t\t\tif ( lookAhead( match ) ) {\n\t\t\t\t\twhile ( num.length < len ) {\n\t\t\t\t\t\tnum = \"0\" + num;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn num;\n\t\t\t},\n\n\t\t\t// Format a name, short or long as requested\n\t\t\tformatName = function( match, value, shortNames, longNames ) {\n\t\t\t\treturn ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );\n\t\t\t},\n\t\t\toutput = \"\",\n\t\t\tliteral = false;\n\n\t\tif ( date ) {\n\t\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\t\tif ( literal ) {\n\t\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\t\tliteral = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += format.charAt( iFormat );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\t\toutput += formatNumber( \"d\", date.getDate(), 2 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\t\toutput += formatName( \"D\", date.getDay(), dayNamesShort, dayNames );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\t\toutput += formatNumber( \"o\",\n\t\t\t\t\t\t\t\tMath.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\t\toutput += formatNumber( \"m\", date.getMonth() + 1, 2 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\toutput += formatName( \"M\", date.getMonth(), monthNamesShort, monthNames );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\t\toutput += ( lookAhead( \"y\" ) ? date.getFullYear() :\n\t\t\t\t\t\t\t\t( date.getFullYear() % 100 < 10 ? \"0\" : \"\" ) + date.getFullYear() % 100 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\t\toutput += date.getTime();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\t\toutput += date.getTime() * 10000 + this._ticksTo1970;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\t\toutput += \"'\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\toutput += format.charAt( iFormat );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t},\n\n\t/* Extract all possible characters from the date format. */\n\t_possibleChars: function( format ) {\n\t\tvar iFormat,\n\t\t\tchars = \"\",\n\t\t\tliteral = false,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t};\n\n\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\tif ( literal ) {\n\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tchars += format.charAt( iFormat );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\tcase \"d\": case \"m\": case \"y\": case \"@\":\n\t\t\t\t\t\tchars += \"0123456789\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\": case \"M\":\n\t\t\t\t\t\treturn null; // Accept anything\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\tchars += \"'\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tchars += format.charAt( iFormat );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn chars;\n\t},\n\n\t/* Get a setting value, defaulting if necessary. */\n\t_get: function( inst, name ) {\n\t\treturn inst.settings[ name ] !== undefined ?\n\t\t\tinst.settings[ name ] : this._defaults[ name ];\n\t},\n\n\t/* Parse existing date and initialise date picker. */\n\t_setDateFromField: function( inst, noDefault ) {\n\t\tif ( inst.input.val() === inst.lastVal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar dateFormat = this._get( inst, \"dateFormat\" ),\n\t\t\tdates = inst.lastVal = inst.input ? inst.input.val() : null,\n\t\t\tdefaultDate = this._getDefaultDate( inst ),\n\t\t\tdate = defaultDate,\n\t\t\tsettings = this._getFormatConfig( inst );\n\n\t\ttry {\n\t\t\tdate = this.parseDate( dateFormat, dates, settings ) || defaultDate;\n\t\t} catch ( event ) {\n\t\t\tdates = ( noDefault ? \"\" : dates );\n\t\t}\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tinst.currentDay = ( dates ? date.getDate() : 0 );\n\t\tinst.currentMonth = ( dates ? date.getMonth() : 0 );\n\t\tinst.currentYear = ( dates ? date.getFullYear() : 0 );\n\t\tthis._adjustInstDate( inst );\n\t},\n\n\t/* Retrieve the default date shown on opening. */\n\t_getDefaultDate: function( inst ) {\n\t\treturn this._restrictMinMax( inst,\n\t\t\tthis._determineDate( inst, this._get( inst, \"defaultDate\" ), new Date() ) );\n\t},\n\n\t/* A date may be specified as an exact value or a relative one. */\n\t_determineDate: function( inst, date, defaultDate ) {\n\t\tvar offsetNumeric = function( offset ) {\n\t\t\t\tvar date = new Date();\n\t\t\t\tdate.setDate( date.getDate() + offset );\n\t\t\t\treturn date;\n\t\t\t},\n\t\t\toffsetString = function( offset ) {\n\t\t\t\ttry {\n\t\t\t\t\treturn $.datepicker.parseDate( $.datepicker._get( inst, \"dateFormat\" ),\n\t\t\t\t\t\toffset, $.datepicker._getFormatConfig( inst ) );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\n\t\t\t\tvar date = ( offset.toLowerCase().match( /^c/ ) ?\n\t\t\t\t\t$.datepicker._getDate( inst ) : null ) || new Date(),\n\t\t\t\t\tyear = date.getFullYear(),\n\t\t\t\t\tmonth = date.getMonth(),\n\t\t\t\t\tday = date.getDate(),\n\t\t\t\t\tpattern = /([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g,\n\t\t\t\t\tmatches = pattern.exec( offset );\n\n\t\t\t\twhile ( matches ) {\n\t\t\t\t\tswitch ( matches[ 2 ] || \"d\" ) {\n\t\t\t\t\t\tcase \"d\" : case \"D\" :\n\t\t\t\t\t\t\tday += parseInt( matches[ 1 ], 10 ); break;\n\t\t\t\t\t\tcase \"w\" : case \"W\" :\n\t\t\t\t\t\t\tday += parseInt( matches[ 1 ], 10 ) * 7; break;\n\t\t\t\t\t\tcase \"m\" : case \"M\" :\n\t\t\t\t\t\t\tmonth += parseInt( matches[ 1 ], 10 );\n\t\t\t\t\t\t\tday = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\": case \"Y\" :\n\t\t\t\t\t\t\tyear += parseInt( matches[ 1 ], 10 );\n\t\t\t\t\t\t\tday = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tmatches = pattern.exec( offset );\n\t\t\t\t}\n\t\t\t\treturn new Date( year, month, day );\n\t\t\t},\n\t\t\tnewDate = ( date == null || date === \"\" ? defaultDate : ( typeof date === \"string\" ? offsetString( date ) :\n\t\t\t\t( typeof date === \"number\" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );\n\n\t\tnewDate = ( newDate && newDate.toString() === \"Invalid Date\" ? defaultDate : newDate );\n\t\tif ( newDate ) {\n\t\t\tnewDate.setHours( 0 );\n\t\t\tnewDate.setMinutes( 0 );\n\t\t\tnewDate.setSeconds( 0 );\n\t\t\tnewDate.setMilliseconds( 0 );\n\t\t}\n\t\treturn this._daylightSavingAdjust( newDate );\n\t},\n\n\t/* Handle switch to/from daylight saving.\n\t * Hours may be non-zero on daylight saving cut-over:\n\t * > 12 when midnight changeover, but then cannot generate\n\t * midnight datetime, so jump to 1AM, otherwise reset.\n\t * @param  date  (Date) the date to check\n\t * @return  (Date) the corrected date\n\t */\n\t_daylightSavingAdjust: function( date ) {\n\t\tif ( !date ) {\n\t\t\treturn null;\n\t\t}\n\t\tdate.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );\n\t\treturn date;\n\t},\n\n\t/* Set the date(s) directly. */\n\t_setDate: function( inst, date, noChange ) {\n\t\tvar clear = !date,\n\t\t\torigMonth = inst.selectedMonth,\n\t\t\torigYear = inst.selectedYear,\n\t\t\tnewDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );\n\n\t\tinst.selectedDay = inst.currentDay = newDate.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();\n\t\tinst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();\n\t\tif ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {\n\t\t\tthis._notifyChange( inst );\n\t\t}\n\t\tthis._adjustInstDate( inst );\n\t\tif ( inst.input ) {\n\t\t\tinst.input.val( clear ? \"\" : this._formatDate( inst ) );\n\t\t}\n\t},\n\n\t/* Retrieve the date(s) directly. */\n\t_getDate: function( inst ) {\n\t\tvar startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === \"\" ) ? null :\n\t\t\tthis._daylightSavingAdjust( new Date(\n\t\t\tinst.currentYear, inst.currentMonth, inst.currentDay ) ) );\n\t\t\treturn startDate;\n\t},\n\n\t/* Attach the onxxx handlers.  These are declared statically so\n\t * they work with static code transformers like Caja.\n\t */\n\t_attachHandlers: function( inst ) {\n\t\tvar stepMonths = this._get( inst, \"stepMonths\" ),\n\t\t\tid = \"#\" + inst.id.replace( /\\\\\\\\/g, \"\\\\\" );\n\t\tinst.dpDiv.find( \"[data-handler]\" ).map( function() {\n\t\t\tvar handler = {\n\t\t\t\tprev: function() {\n\t\t\t\t\t$.datepicker._adjustDate( id, -stepMonths, \"M\" );\n\t\t\t\t},\n\t\t\t\tnext: function() {\n\t\t\t\t\t$.datepicker._adjustDate( id, +stepMonths, \"M\" );\n\t\t\t\t},\n\t\t\t\thide: function() {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t},\n\t\t\t\ttoday: function() {\n\t\t\t\t\t$.datepicker._gotoToday( id );\n\t\t\t\t},\n\t\t\t\tselectDay: function() {\n\t\t\t\t\t$.datepicker._selectDay( id, +this.getAttribute( \"data-month\" ), +this.getAttribute( \"data-year\" ), this );\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectMonth: function() {\n\t\t\t\t\t$.datepicker._selectMonthYear( id, this, \"M\" );\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectYear: function() {\n\t\t\t\t\t$.datepicker._selectMonthYear( id, this, \"Y\" );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t};\n\t\t\t$( this ).on( this.getAttribute( \"data-event\" ), handler[ this.getAttribute( \"data-handler\" ) ] );\n\t\t} );\n\t},\n\n\t/* Generate the HTML for the current state of the date picker. */\n\t_generateHTML: function( inst ) {\n\t\tvar maxDraw, prevText, prev, nextText, next, currentText, gotoDate,\n\t\t\tcontrols, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,\n\t\t\tmonthNames, monthNamesShort, beforeShowDay, showOtherMonths,\n\t\t\tselectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,\n\t\t\tcornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,\n\t\t\tprintDate, dRow, tbody, daySettings, otherMonth, unselectable,\n\t\t\ttempDate = new Date(),\n\t\t\ttoday = this._daylightSavingAdjust(\n\t\t\t\tnew Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time\n\t\t\tisRTL = this._get( inst, \"isRTL\" ),\n\t\t\tshowButtonPanel = this._get( inst, \"showButtonPanel\" ),\n\t\t\thideIfNoPrevNext = this._get( inst, \"hideIfNoPrevNext\" ),\n\t\t\tnavigationAsDateFormat = this._get( inst, \"navigationAsDateFormat\" ),\n\t\t\tnumMonths = this._getNumberOfMonths( inst ),\n\t\t\tshowCurrentAtPos = this._get( inst, \"showCurrentAtPos\" ),\n\t\t\tstepMonths = this._get( inst, \"stepMonths\" ),\n\t\t\tisMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),\n\t\t\tcurrentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :\n\t\t\t\tnew Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tdrawMonth = inst.drawMonth - showCurrentAtPos,\n\t\t\tdrawYear = inst.drawYear;\n\n\t\tif ( drawMonth < 0 ) {\n\t\t\tdrawMonth += 12;\n\t\t\tdrawYear--;\n\t\t}\n\t\tif ( maxDate ) {\n\t\t\tmaxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),\n\t\t\t\tmaxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );\n\t\t\tmaxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );\n\t\t\twhile ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {\n\t\t\t\tdrawMonth--;\n\t\t\t\tif ( drawMonth < 0 ) {\n\t\t\t\t\tdrawMonth = 11;\n\t\t\t\t\tdrawYear--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tinst.drawMonth = drawMonth;\n\t\tinst.drawYear = drawYear;\n\n\t\tprevText = this._get( inst, \"prevText\" );\n\t\tprevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,\n\t\t\tthis._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),\n\t\t\tthis._getFormatConfig( inst ) ) );\n\n\t\tif ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ) {\n\t\t\tprev = $( \"<a>\" )\n\t\t\t\t.attr( {\n\t\t\t\t\t\"class\": \"ui-datepicker-prev ui-corner-all\",\n\t\t\t\t\t\"data-handler\": \"prev\",\n\t\t\t\t\t\"data-event\": \"click\",\n\t\t\t\t\ttitle: prevText\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$( \"<span>\" )\n\t\t\t\t\t\t.addClass( \"ui-icon ui-icon-circle-triangle-\" +\n\t\t\t\t\t\t\t( isRTL ? \"e\" : \"w\" ) )\n\t\t\t\t\t\t.text( prevText )\n\t\t\t\t)[ 0 ].outerHTML;\n\t\t} else if ( hideIfNoPrevNext ) {\n\t\t\tprev = \"\";\n\t\t} else {\n\t\t\tprev = $( \"<a>\" )\n\t\t\t\t.attr( {\n\t\t\t\t\t\"class\": \"ui-datepicker-prev ui-corner-all ui-state-disabled\",\n\t\t\t\t\ttitle: prevText\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$( \"<span>\" )\n\t\t\t\t\t\t.addClass( \"ui-icon ui-icon-circle-triangle-\" +\n\t\t\t\t\t\t\t( isRTL ? \"e\" : \"w\" ) )\n\t\t\t\t\t\t.text( prevText )\n\t\t\t\t)[ 0 ].outerHTML;\n\t\t}\n\n\t\tnextText = this._get( inst, \"nextText\" );\n\t\tnextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,\n\t\t\tthis._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),\n\t\t\tthis._getFormatConfig( inst ) ) );\n\n\t\tif ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ) {\n\t\t\tnext = $( \"<a>\" )\n\t\t\t\t.attr( {\n\t\t\t\t\t\"class\": \"ui-datepicker-next ui-corner-all\",\n\t\t\t\t\t\"data-handler\": \"next\",\n\t\t\t\t\t\"data-event\": \"click\",\n\t\t\t\t\ttitle: nextText\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$( \"<span>\" )\n\t\t\t\t\t\t.addClass( \"ui-icon ui-icon-circle-triangle-\" +\n\t\t\t\t\t\t\t( isRTL ? \"w\" : \"e\" ) )\n\t\t\t\t\t\t.text( nextText )\n\t\t\t\t)[ 0 ].outerHTML;\n\t\t} else if ( hideIfNoPrevNext ) {\n\t\t\tnext = \"\";\n\t\t} else {\n\t\t\tnext = $( \"<a>\" )\n\t\t\t\t.attr( {\n\t\t\t\t\t\"class\": \"ui-datepicker-next ui-corner-all ui-state-disabled\",\n\t\t\t\t\ttitle: nextText\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$( \"<span>\" )\n\t\t\t\t\t\t.attr( \"class\", \"ui-icon ui-icon-circle-triangle-\" +\n\t\t\t\t\t\t\t( isRTL ? \"w\" : \"e\" ) )\n\t\t\t\t\t\t.text( nextText )\n\t\t\t\t)[ 0 ].outerHTML;\n\t\t}\n\n\t\tcurrentText = this._get( inst, \"currentText\" );\n\t\tgotoDate = ( this._get( inst, \"gotoCurrent\" ) && inst.currentDay ? currentDate : today );\n\t\tcurrentText = ( !navigationAsDateFormat ? currentText :\n\t\t\tthis.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );\n\n\t\tcontrols = \"\";\n\t\tif ( !inst.inline ) {\n\t\t\tcontrols = $( \"<button>\" )\n\t\t\t\t.attr( {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\"class\": \"ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all\",\n\t\t\t\t\t\"data-handler\": \"hide\",\n\t\t\t\t\t\"data-event\": \"click\"\n\t\t\t\t} )\n\t\t\t\t.text( this._get( inst, \"closeText\" ) )[ 0 ].outerHTML;\n\t\t}\n\n\t\tbuttonPanel = \"\";\n\t\tif ( showButtonPanel ) {\n\t\t\tbuttonPanel = $( \"<div class='ui-datepicker-buttonpane ui-widget-content'>\" )\n\t\t\t\t.append( isRTL ? controls : \"\" )\n\t\t\t\t.append( this._isInRange( inst, gotoDate ) ?\n\t\t\t\t\t$( \"<button>\" )\n\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\"class\": \"ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all\",\n\t\t\t\t\t\t\t\"data-handler\": \"today\",\n\t\t\t\t\t\t\t\"data-event\": \"click\"\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.text( currentText ) :\n\t\t\t\t\t\"\" )\n\t\t\t\t.append( isRTL ? \"\" : controls )[ 0 ].outerHTML;\n\t\t}\n\n\t\tfirstDay = parseInt( this._get( inst, \"firstDay\" ), 10 );\n\t\tfirstDay = ( isNaN( firstDay ) ? 0 : firstDay );\n\n\t\tshowWeek = this._get( inst, \"showWeek\" );\n\t\tdayNames = this._get( inst, \"dayNames\" );\n\t\tdayNamesMin = this._get( inst, \"dayNamesMin\" );\n\t\tmonthNames = this._get( inst, \"monthNames\" );\n\t\tmonthNamesShort = this._get( inst, \"monthNamesShort\" );\n\t\tbeforeShowDay = this._get( inst, \"beforeShowDay\" );\n\t\tshowOtherMonths = this._get( inst, \"showOtherMonths\" );\n\t\tselectOtherMonths = this._get( inst, \"selectOtherMonths\" );\n\t\tdefaultDate = this._getDefaultDate( inst );\n\t\thtml = \"\";\n\n\t\tfor ( row = 0; row < numMonths[ 0 ]; row++ ) {\n\t\t\tgroup = \"\";\n\t\t\tthis.maxRows = 4;\n\t\t\tfor ( col = 0; col < numMonths[ 1 ]; col++ ) {\n\t\t\t\tselectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );\n\t\t\t\tcornerClass = \" ui-corner-all\";\n\t\t\t\tcalender = \"\";\n\t\t\t\tif ( isMultiMonth ) {\n\t\t\t\t\tcalender += \"<div class='ui-datepicker-group\";\n\t\t\t\t\tif ( numMonths[ 1 ] > 1 ) {\n\t\t\t\t\t\tswitch ( col ) {\n\t\t\t\t\t\t\tcase 0: calender += \" ui-datepicker-group-first\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + ( isRTL ? \"right\" : \"left\" ); break;\n\t\t\t\t\t\t\tcase numMonths[ 1 ] - 1: calender += \" ui-datepicker-group-last\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + ( isRTL ? \"left\" : \"right\" ); break;\n\t\t\t\t\t\t\tdefault: calender += \" ui-datepicker-group-middle\"; cornerClass = \"\"; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcalender += \"'>\";\n\t\t\t\t}\n\t\t\t\tcalender += \"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix\" + cornerClass + \"'>\" +\n\t\t\t\t\t( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : \"\" ) +\n\t\t\t\t\t( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : \"\" ) +\n\t\t\t\t\tthis._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\t\t\trow > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers\n\t\t\t\t\t\"</div><table class='ui-datepicker-calendar'><thead>\" +\n\t\t\t\t\t\"<tr>\";\n\t\t\t\tthead = ( showWeek ? \"<th class='ui-datepicker-week-col'>\" + this._get( inst, \"weekHeader\" ) + \"</th>\" : \"\" );\n\t\t\t\tfor ( dow = 0; dow < 7; dow++ ) { // days of the week\n\t\t\t\t\tday = ( dow + firstDay ) % 7;\n\t\t\t\t\tthead += \"<th scope='col'\" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? \" class='ui-datepicker-week-end'\" : \"\" ) + \">\" +\n\t\t\t\t\t\t\"<span title='\" + dayNames[ day ] + \"'>\" + dayNamesMin[ day ] + \"</span></th>\";\n\t\t\t\t}\n\t\t\t\tcalender += thead + \"</tr></thead><tbody>\";\n\t\t\t\tdaysInMonth = this._getDaysInMonth( drawYear, drawMonth );\n\t\t\t\tif ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {\n\t\t\t\t\tinst.selectedDay = Math.min( inst.selectedDay, daysInMonth );\n\t\t\t\t}\n\t\t\t\tleadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;\n\t\t\t\tcurRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate\n\t\t\t\tnumRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)\n\t\t\t\tthis.maxRows = numRows;\n\t\t\t\tprintDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );\n\t\t\t\tfor ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows\n\t\t\t\t\tcalender += \"<tr>\";\n\t\t\t\t\ttbody = ( !showWeek ? \"\" : \"<td class='ui-datepicker-week-col'>\" +\n\t\t\t\t\t\tthis._get( inst, \"calculateWeek\" )( printDate ) + \"</td>\" );\n\t\t\t\t\tfor ( dow = 0; dow < 7; dow++ ) { // create date picker days\n\t\t\t\t\t\tdaySettings = ( beforeShowDay ?\n\t\t\t\t\t\t\tbeforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, \"\" ] );\n\t\t\t\t\t\totherMonth = ( printDate.getMonth() !== drawMonth );\n\t\t\t\t\t\tunselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||\n\t\t\t\t\t\t\t( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );\n\t\t\t\t\t\ttbody += \"<td class='\" +\n\t\t\t\t\t\t\t( ( dow + firstDay + 6 ) % 7 >= 5 ? \" ui-datepicker-week-end\" : \"\" ) + // highlight weekends\n\t\t\t\t\t\t\t( otherMonth ? \" ui-datepicker-other-month\" : \"\" ) + // highlight days from other months\n\t\t\t\t\t\t\t( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key\n\t\t\t\t\t\t\t( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?\n\n\t\t\t\t\t\t\t// or defaultDate is current printedDate and defaultDate is selectedDate\n\t\t\t\t\t\t\t\" \" + this._dayOverClass : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( unselectable ? \" \" + this._unselectableClass + \" ui-state-disabled\" : \"\" ) +  // highlight unselectable days\n\t\t\t\t\t\t\t( otherMonth && !showOtherMonths ? \"\" : \" \" + daySettings[ 1 ] + // highlight custom dates\n\t\t\t\t\t\t\t( printDate.getTime() === currentDate.getTime() ? \" \" + this._currentClass : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( printDate.getTime() === today.getTime() ? \" ui-datepicker-today\" : \"\" ) ) + \"'\" + // highlight today (if different)\n\t\t\t\t\t\t\t( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? \" title='\" + daySettings[ 2 ].replace( /'/g, \"&#39;\" ) + \"'\" : \"\" ) + // cell title\n\t\t\t\t\t\t\t( unselectable ? \"\" : \" data-handler='selectDay' data-event='click' data-month='\" + printDate.getMonth() + \"' data-year='\" + printDate.getFullYear() + \"'\" ) + \">\" + // actions\n\t\t\t\t\t\t\t( otherMonth && !showOtherMonths ? \"&#xa0;\" : // display for other months\n\t\t\t\t\t\t\t( unselectable ? \"<span class='ui-state-default'>\" + printDate.getDate() + \"</span>\" : \"<a class='ui-state-default\" +\n\t\t\t\t\t\t\t( printDate.getTime() === today.getTime() ? \" ui-state-highlight\" : \"\" ) +\n\t\t\t\t\t\t\t( printDate.getTime() === currentDate.getTime() ? \" ui-state-active\" : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( otherMonth ? \" ui-priority-secondary\" : \"\" ) + // distinguish dates from other months\n\t\t\t\t\t\t\t\"' href='#' aria-current='\" + ( printDate.getTime() === currentDate.getTime() ? \"true\" : \"false\" ) + // mark date as selected for screen reader\n\t\t\t\t\t\t\t\"' data-date='\" + printDate.getDate() + // store date as data\n\t\t\t\t\t\t\t\"'>\" + printDate.getDate() + \"</a>\" ) ) + \"</td>\"; // display selectable date\n\t\t\t\t\t\tprintDate.setDate( printDate.getDate() + 1 );\n\t\t\t\t\t\tprintDate = this._daylightSavingAdjust( printDate );\n\t\t\t\t\t}\n\t\t\t\t\tcalender += tbody + \"</tr>\";\n\t\t\t\t}\n\t\t\t\tdrawMonth++;\n\t\t\t\tif ( drawMonth > 11 ) {\n\t\t\t\t\tdrawMonth = 0;\n\t\t\t\t\tdrawYear++;\n\t\t\t\t}\n\t\t\t\tcalender += \"</tbody></table>\" + ( isMultiMonth ? \"</div>\" +\n\t\t\t\t\t\t\t( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? \"<div class='ui-datepicker-row-break'></div>\" : \"\" ) : \"\" );\n\t\t\t\tgroup += calender;\n\t\t\t}\n\t\t\thtml += group;\n\t\t}\n\t\thtml += buttonPanel;\n\t\tinst._keyEvent = false;\n\t\treturn html;\n\t},\n\n\t/* Generate the month and year header. */\n\t_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\tsecondary, monthNames, monthNamesShort ) {\n\n\t\tvar inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,\n\t\t\tchangeMonth = this._get( inst, \"changeMonth\" ),\n\t\t\tchangeYear = this._get( inst, \"changeYear\" ),\n\t\t\tshowMonthAfterYear = this._get( inst, \"showMonthAfterYear\" ),\n\t\t\tselectMonthLabel = this._get( inst, \"selectMonthLabel\" ),\n\t\t\tselectYearLabel = this._get( inst, \"selectYearLabel\" ),\n\t\t\thtml = \"<div class='ui-datepicker-title'>\",\n\t\t\tmonthHtml = \"\";\n\n\t\t// Month selection\n\t\tif ( secondary || !changeMonth ) {\n\t\t\tmonthHtml += \"<span class='ui-datepicker-month'>\" + monthNames[ drawMonth ] + \"</span>\";\n\t\t} else {\n\t\t\tinMinYear = ( minDate && minDate.getFullYear() === drawYear );\n\t\t\tinMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );\n\t\t\tmonthHtml += \"<select class='ui-datepicker-month' aria-label='\" + selectMonthLabel + \"' data-handler='selectMonth' data-event='change'>\";\n\t\t\tfor ( month = 0; month < 12; month++ ) {\n\t\t\t\tif ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {\n\t\t\t\t\tmonthHtml += \"<option value='\" + month + \"'\" +\n\t\t\t\t\t\t( month === drawMonth ? \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\">\" + monthNamesShort[ month ] + \"</option>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonthHtml += \"</select>\";\n\t\t}\n\n\t\tif ( !showMonthAfterYear ) {\n\t\t\thtml += monthHtml + ( secondary || !( changeMonth && changeYear ) ? \"&#xa0;\" : \"\" );\n\t\t}\n\n\t\t// Year selection\n\t\tif ( !inst.yearshtml ) {\n\t\t\tinst.yearshtml = \"\";\n\t\t\tif ( secondary || !changeYear ) {\n\t\t\t\thtml += \"<span class='ui-datepicker-year'>\" + drawYear + \"</span>\";\n\t\t\t} else {\n\n\t\t\t\t// determine range of years to display\n\t\t\t\tyears = this._get( inst, \"yearRange\" ).split( \":\" );\n\t\t\t\tthisYear = new Date().getFullYear();\n\t\t\t\tdetermineYear = function( value ) {\n\t\t\t\t\tvar year = ( value.match( /c[+\\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :\n\t\t\t\t\t\t( value.match( /[+\\-].*/ ) ? thisYear + parseInt( value, 10 ) :\n\t\t\t\t\t\tparseInt( value, 10 ) ) );\n\t\t\t\t\treturn ( isNaN( year ) ? thisYear : year );\n\t\t\t\t};\n\t\t\t\tyear = determineYear( years[ 0 ] );\n\t\t\t\tendYear = Math.max( year, determineYear( years[ 1 ] || \"\" ) );\n\t\t\t\tyear = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );\n\t\t\t\tendYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );\n\t\t\t\tinst.yearshtml += \"<select class='ui-datepicker-year' aria-label='\" + selectYearLabel + \"' data-handler='selectYear' data-event='change'>\";\n\t\t\t\tfor ( ; year <= endYear; year++ ) {\n\t\t\t\t\tinst.yearshtml += \"<option value='\" + year + \"'\" +\n\t\t\t\t\t\t( year === drawYear ? \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\">\" + year + \"</option>\";\n\t\t\t\t}\n\t\t\t\tinst.yearshtml += \"</select>\";\n\n\t\t\t\thtml += inst.yearshtml;\n\t\t\t\tinst.yearshtml = null;\n\t\t\t}\n\t\t}\n\n\t\thtml += this._get( inst, \"yearSuffix\" );\n\t\tif ( showMonthAfterYear ) {\n\t\t\thtml += ( secondary || !( changeMonth && changeYear ) ? \"&#xa0;\" : \"\" ) + monthHtml;\n\t\t}\n\t\thtml += \"</div>\"; // Close datepicker_header\n\t\treturn html;\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustInstDate: function( inst, offset, period ) {\n\t\tvar year = inst.selectedYear + ( period === \"Y\" ? offset : 0 ),\n\t\t\tmonth = inst.selectedMonth + ( period === \"M\" ? offset : 0 ),\n\t\t\tday = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === \"D\" ? offset : 0 ),\n\t\t\tdate = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );\n\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tif ( period === \"M\" || period === \"Y\" ) {\n\t\t\tthis._notifyChange( inst );\n\t\t}\n\t},\n\n\t/* Ensure a date is within any min/max bounds. */\n\t_restrictMinMax: function( inst, date ) {\n\t\tvar minDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tnewDate = ( minDate && date < minDate ? minDate : date );\n\t\treturn ( maxDate && newDate > maxDate ? maxDate : newDate );\n\t},\n\n\t/* Notify change of month/year. */\n\t_notifyChange: function( inst ) {\n\t\tvar onChange = this._get( inst, \"onChangeMonthYear\" );\n\t\tif ( onChange ) {\n\t\t\tonChange.apply( ( inst.input ? inst.input[ 0 ] : null ),\n\t\t\t\t[ inst.selectedYear, inst.selectedMonth + 1, inst ] );\n\t\t}\n\t},\n\n\t/* Determine the number of months to show. */\n\t_getNumberOfMonths: function( inst ) {\n\t\tvar numMonths = this._get( inst, \"numberOfMonths\" );\n\t\treturn ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === \"number\" ? [ 1, numMonths ] : numMonths ) );\n\t},\n\n\t/* Determine the current maximum date - ensure no time components are set. */\n\t_getMinMaxDate: function( inst, minMax ) {\n\t\treturn this._determineDate( inst, this._get( inst, minMax + \"Date\" ), null );\n\t},\n\n\t/* Find the number of days in a given month. */\n\t_getDaysInMonth: function( year, month ) {\n\t\treturn 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();\n\t},\n\n\t/* Find the day of the week of the first of a month. */\n\t_getFirstDayOfMonth: function( year, month ) {\n\t\treturn new Date( year, month, 1 ).getDay();\n\t},\n\n\t/* Determines if we should allow a \"next/prev\" month display change. */\n\t_canAdjustMonth: function( inst, offset, curYear, curMonth ) {\n\t\tvar numMonths = this._getNumberOfMonths( inst ),\n\t\t\tdate = this._daylightSavingAdjust( new Date( curYear,\n\t\t\tcurMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );\n\n\t\tif ( offset < 0 ) {\n\t\t\tdate.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );\n\t\t}\n\t\treturn this._isInRange( inst, date );\n\t},\n\n\t/* Is the given date in the accepted range? */\n\t_isInRange: function( inst, date ) {\n\t\tvar yearSplit, currentYear,\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tminYear = null,\n\t\t\tmaxYear = null,\n\t\t\tyears = this._get( inst, \"yearRange\" );\n\t\t\tif ( years ) {\n\t\t\t\tyearSplit = years.split( \":\" );\n\t\t\t\tcurrentYear = new Date().getFullYear();\n\t\t\t\tminYear = parseInt( yearSplit[ 0 ], 10 );\n\t\t\t\tmaxYear = parseInt( yearSplit[ 1 ], 10 );\n\t\t\t\tif ( yearSplit[ 0 ].match( /[+\\-].*/ ) ) {\n\t\t\t\t\tminYear += currentYear;\n\t\t\t\t}\n\t\t\t\tif ( yearSplit[ 1 ].match( /[+\\-].*/ ) ) {\n\t\t\t\t\tmaxYear += currentYear;\n\t\t\t\t}\n\t\t\t}\n\n\t\treturn ( ( !minDate || date.getTime() >= minDate.getTime() ) &&\n\t\t\t( !maxDate || date.getTime() <= maxDate.getTime() ) &&\n\t\t\t( !minYear || date.getFullYear() >= minYear ) &&\n\t\t\t( !maxYear || date.getFullYear() <= maxYear ) );\n\t},\n\n\t/* Provide the configuration settings for formatting/parsing. */\n\t_getFormatConfig: function( inst ) {\n\t\tvar shortYearCutoff = this._get( inst, \"shortYearCutoff\" );\n\t\tshortYearCutoff = ( typeof shortYearCutoff !== \"string\" ? shortYearCutoff :\n\t\t\tnew Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );\n\t\treturn { shortYearCutoff: shortYearCutoff,\n\t\t\tdayNamesShort: this._get( inst, \"dayNamesShort\" ), dayNames: this._get( inst, \"dayNames\" ),\n\t\t\tmonthNamesShort: this._get( inst, \"monthNamesShort\" ), monthNames: this._get( inst, \"monthNames\" ) };\n\t},\n\n\t/* Format the given date for display. */\n\t_formatDate: function( inst, day, month, year ) {\n\t\tif ( !day ) {\n\t\t\tinst.currentDay = inst.selectedDay;\n\t\t\tinst.currentMonth = inst.selectedMonth;\n\t\t\tinst.currentYear = inst.selectedYear;\n\t\t}\n\t\tvar date = ( day ? ( typeof day === \"object\" ? day :\n\t\t\tthis._daylightSavingAdjust( new Date( year, month, day ) ) ) :\n\t\t\tthis._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );\n\t\treturn this.formatDate( this._get( inst, \"dateFormat\" ), date, this._getFormatConfig( inst ) );\n\t}\n} );\n\n/*\n * Bind hover events for datepicker elements.\n * Done via delegate so the binding only occurs once in the lifetime of the parent div.\n * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.\n */\nfunction datepicker_bindHover( dpDiv ) {\n\tvar selector = \"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";\n\treturn dpDiv.on( \"mouseout\", selector, function() {\n\t\t\t$( this ).removeClass( \"ui-state-hover\" );\n\t\t\tif ( this.className.indexOf( \"ui-datepicker-prev\" ) !== -1 ) {\n\t\t\t\t$( this ).removeClass( \"ui-datepicker-prev-hover\" );\n\t\t\t}\n\t\t\tif ( this.className.indexOf( \"ui-datepicker-next\" ) !== -1 ) {\n\t\t\t\t$( this ).removeClass( \"ui-datepicker-next-hover\" );\n\t\t\t}\n\t\t} )\n\t\t.on( \"mouseover\", selector, datepicker_handleMouseover );\n}\n\nfunction datepicker_handleMouseover() {\n\tif ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {\n\t\t$( this ).parents( \".ui-datepicker-calendar\" ).find( \"a\" ).removeClass( \"ui-state-hover\" );\n\t\t$( this ).addClass( \"ui-state-hover\" );\n\t\tif ( this.className.indexOf( \"ui-datepicker-prev\" ) !== -1 ) {\n\t\t\t$( this ).addClass( \"ui-datepicker-prev-hover\" );\n\t\t}\n\t\tif ( this.className.indexOf( \"ui-datepicker-next\" ) !== -1 ) {\n\t\t\t$( this ).addClass( \"ui-datepicker-next-hover\" );\n\t\t}\n\t}\n}\n\n/* jQuery extend now ignores nulls! */\nfunction datepicker_extendRemove( target, props ) {\n\t$.extend( target, props );\n\tfor ( var name in props ) {\n\t\tif ( props[ name ] == null ) {\n\t\t\ttarget[ name ] = props[ name ];\n\t\t}\n\t}\n\treturn target;\n}\n\n/* Invoke the datepicker functionality.\n   @param  options  string - a command, optionally followed by additional parameters or\n\t\t\t\t\tObject - settings for attaching new datepicker functionality\n   @return  jQuery object */\n$.fn.datepicker = function( options ) {\n\n\t/* Verify an empty collection wasn't passed - Fixes #6976 */\n\tif ( !this.length ) {\n\t\treturn this;\n\t}\n\n\t/* Initialise the date picker. */\n\tif ( !$.datepicker.initialized ) {\n\t\t$( document ).on( \"mousedown\", $.datepicker._checkExternalClick );\n\t\t$.datepicker.initialized = true;\n\t}\n\n\t/* Append datepicker main container to body if not exist. */\n\tif ( $( \"#\" + $.datepicker._mainDivId ).length === 0 ) {\n\t\t$( \"body\" ).append( $.datepicker.dpDiv );\n\t}\n\n\tvar otherArgs = Array.prototype.slice.call( arguments, 1 );\n\tif ( typeof options === \"string\" && ( options === \"isDisabled\" || options === \"getDate\" || options === \"widget\" ) ) {\n\t\treturn $.datepicker[ \"_\" + options + \"Datepicker\" ].\n\t\t\tapply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );\n\t}\n\tif ( options === \"option\" && arguments.length === 2 && typeof arguments[ 1 ] === \"string\" ) {\n\t\treturn $.datepicker[ \"_\" + options + \"Datepicker\" ].\n\t\t\tapply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );\n\t}\n\treturn this.each( function() {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\t$.datepicker[ \"_\" + options + \"Datepicker\" ]\n\t\t\t\t.apply( $.datepicker, [ this ].concat( otherArgs ) );\n\t\t} else {\n\t\t\t$.datepicker._attachDatepicker( this, options );\n\t\t}\n\t} );\n};\n\n$.datepicker = new Datepicker(); // singleton instance\n$.datepicker.initialized = false;\n$.datepicker.uuid = new Date().getTime();\n$.datepicker.version = \"1.13.0\";\n\nreturn $.datepicker;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/dialog.js",
    "content": "/*!\n * jQuery UI Dialog 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Dialog\n//>>group: Widgets\n//>>description: Displays customizable dialog windows.\n//>>docs: http://api.jqueryui.com/dialog/\n//>>demos: http://jqueryui.com/dialog/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/dialog.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./button\",\n\t\t\t\"./draggable\",\n\t\t\t\"./mouse\",\n\t\t\t\"./resizable\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.widget( \"ui.dialog\", {\n\tversion: \"1.13.0\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoOpen: true,\n\t\tbuttons: [],\n\t\tclasses: {\n\t\t\t\"ui-dialog\": \"ui-corner-all\",\n\t\t\t\"ui-dialog-titlebar\": \"ui-corner-all\"\n\t\t},\n\t\tcloseOnEscape: true,\n\t\tcloseText: \"Close\",\n\t\tdraggable: true,\n\t\thide: null,\n\t\theight: \"auto\",\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 150,\n\t\tminWidth: 150,\n\t\tmodal: false,\n\t\tposition: {\n\t\t\tmy: \"center\",\n\t\t\tat: \"center\",\n\t\t\tof: window,\n\t\t\tcollision: \"fit\",\n\n\t\t\t// Ensure the titlebar is always visible\n\t\t\tusing: function( pos ) {\n\t\t\t\tvar topOffset = $( this ).css( pos ).offset().top;\n\t\t\t\tif ( topOffset < 0 ) {\n\t\t\t\t\t$( this ).css( \"top\", pos.top - topOffset );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tresizable: true,\n\t\tshow: null,\n\t\ttitle: null,\n\t\twidth: 300,\n\n\t\t// Callbacks\n\t\tbeforeClose: null,\n\t\tclose: null,\n\t\tdrag: null,\n\t\tdragStart: null,\n\t\tdragStop: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresize: null,\n\t\tresizeStart: null,\n\t\tresizeStop: null\n\t},\n\n\tsizeRelatedOptions: {\n\t\tbuttons: true,\n\t\theight: true,\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true,\n\t\twidth: true\n\t},\n\n\tresizableRelatedOptions: {\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true\n\t},\n\n\t_create: function() {\n\t\tthis.originalCss = {\n\t\t\tdisplay: this.element[ 0 ].style.display,\n\t\t\twidth: this.element[ 0 ].style.width,\n\t\t\tminHeight: this.element[ 0 ].style.minHeight,\n\t\t\tmaxHeight: this.element[ 0 ].style.maxHeight,\n\t\t\theight: this.element[ 0 ].style.height\n\t\t};\n\t\tthis.originalPosition = {\n\t\t\tparent: this.element.parent(),\n\t\t\tindex: this.element.parent().children().index( this.element )\n\t\t};\n\t\tthis.originalTitle = this.element.attr( \"title\" );\n\t\tif ( this.options.title == null && this.originalTitle != null ) {\n\t\t\tthis.options.title = this.originalTitle;\n\t\t}\n\n\t\t// Dialogs can't be disabled\n\t\tif ( this.options.disabled ) {\n\t\t\tthis.options.disabled = false;\n\t\t}\n\n\t\tthis._createWrapper();\n\n\t\tthis.element\n\t\t\t.show()\n\t\t\t.removeAttr( \"title\" )\n\t\t\t.appendTo( this.uiDialog );\n\n\t\tthis._addClass( \"ui-dialog-content\", \"ui-widget-content\" );\n\n\t\tthis._createTitlebar();\n\t\tthis._createButtonPane();\n\n\t\tif ( this.options.draggable && $.fn.draggable ) {\n\t\t\tthis._makeDraggable();\n\t\t}\n\t\tif ( this.options.resizable && $.fn.resizable ) {\n\t\t\tthis._makeResizable();\n\t\t}\n\n\t\tthis._isOpen = false;\n\n\t\tthis._trackFocus();\n\t},\n\n\t_init: function() {\n\t\tif ( this.options.autoOpen ) {\n\t\t\tthis.open();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\t\tif ( element && ( element.jquery || element.nodeType ) ) {\n\t\t\treturn $( element );\n\t\t}\n\t\treturn this.document.find( element || \"body\" ).eq( 0 );\n\t},\n\n\t_destroy: function() {\n\t\tvar next,\n\t\t\toriginalPosition = this.originalPosition;\n\n\t\tthis._untrackInstance();\n\t\tthis._destroyOverlay();\n\n\t\tthis.element\n\t\t\t.removeUniqueId()\n\t\t\t.css( this.originalCss )\n\n\t\t\t// Without detaching first, the following becomes really slow\n\t\t\t.detach();\n\n\t\tthis.uiDialog.remove();\n\n\t\tif ( this.originalTitle ) {\n\t\t\tthis.element.attr( \"title\", this.originalTitle );\n\t\t}\n\n\t\tnext = originalPosition.parent.children().eq( originalPosition.index );\n\n\t\t// Don't try to place the dialog next to itself (#8613)\n\t\tif ( next.length && next[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tnext.before( this.element );\n\t\t} else {\n\t\t\toriginalPosition.parent.append( this.element );\n\t\t}\n\t},\n\n\twidget: function() {\n\t\treturn this.uiDialog;\n\t},\n\n\tdisable: $.noop,\n\tenable: $.noop,\n\n\tclose: function( event ) {\n\t\tvar that = this;\n\n\t\tif ( !this._isOpen || this._trigger( \"beforeClose\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = false;\n\t\tthis._focusedElement = null;\n\t\tthis._destroyOverlay();\n\t\tthis._untrackInstance();\n\n\t\tif ( !this.opener.filter( \":focusable\" ).trigger( \"focus\" ).length ) {\n\n\t\t\t// Hiding a focused element doesn't trigger blur in WebKit\n\t\t\t// so in case we have nothing to focus on, explicitly blur the active element\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=47182\n\t\t\t$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );\n\t\t}\n\n\t\tthis._hide( this.uiDialog, this.options.hide, function() {\n\t\t\tthat._trigger( \"close\", event );\n\t\t} );\n\t},\n\n\tisOpen: function() {\n\t\treturn this._isOpen;\n\t},\n\n\tmoveToTop: function() {\n\t\tthis._moveToTop();\n\t},\n\n\t_moveToTop: function( event, silent ) {\n\t\tvar moved = false,\n\t\t\tzIndices = this.uiDialog.siblings( \".ui-front:visible\" ).map( function() {\n\t\t\t\treturn +$( this ).css( \"z-index\" );\n\t\t\t} ).get(),\n\t\t\tzIndexMax = Math.max.apply( null, zIndices );\n\n\t\tif ( zIndexMax >= +this.uiDialog.css( \"z-index\" ) ) {\n\t\t\tthis.uiDialog.css( \"z-index\", zIndexMax + 1 );\n\t\t\tmoved = true;\n\t\t}\n\n\t\tif ( moved && !silent ) {\n\t\t\tthis._trigger( \"focus\", event );\n\t\t}\n\t\treturn moved;\n\t},\n\n\topen: function() {\n\t\tvar that = this;\n\t\tif ( this._isOpen ) {\n\t\t\tif ( this._moveToTop() ) {\n\t\t\t\tthis._focusTabbable();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = true;\n\t\tthis.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );\n\n\t\tthis._size();\n\t\tthis._position();\n\t\tthis._createOverlay();\n\t\tthis._moveToTop( null, true );\n\n\t\t// Ensure the overlay is moved to the top with the dialog, but only when\n\t\t// opening. The overlay shouldn't move after the dialog is open so that\n\t\t// modeless dialogs opened after the modal dialog stack properly.\n\t\tif ( this.overlay ) {\n\t\t\tthis.overlay.css( \"z-index\", this.uiDialog.css( \"z-index\" ) - 1 );\n\t\t}\n\n\t\tthis._show( this.uiDialog, this.options.show, function() {\n\t\t\tthat._focusTabbable();\n\t\t\tthat._trigger( \"focus\" );\n\t\t} );\n\n\t\t// Track the dialog immediately upon opening in case a focus event\n\t\t// somehow occurs outside of the dialog before an element inside the\n\t\t// dialog is focused (#10152)\n\t\tthis._makeFocusTarget();\n\n\t\tthis._trigger( \"open\" );\n\t},\n\n\t_focusTabbable: function() {\n\n\t\t// Set focus to the first match:\n\t\t// 1. An element that was focused previously\n\t\t// 2. First element inside the dialog matching [autofocus]\n\t\t// 3. Tabbable element inside the content element\n\t\t// 4. Tabbable element inside the buttonpane\n\t\t// 5. The close button\n\t\t// 6. The dialog itself\n\t\tvar hasFocus = this._focusedElement;\n\t\tif ( !hasFocus ) {\n\t\t\thasFocus = this.element.find( \"[autofocus]\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.element.find( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogButtonPane.find( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogTitlebarClose.filter( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialog;\n\t\t}\n\t\thasFocus.eq( 0 ).trigger( \"focus\" );\n\t},\n\n\t_restoreTabbableFocus: function() {\n\t\tvar activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),\n\t\t\tisActive = this.uiDialog[ 0 ] === activeElement ||\n\t\t\t\t$.contains( this.uiDialog[ 0 ], activeElement );\n\t\tif ( !isActive ) {\n\t\t\tthis._focusTabbable();\n\t\t}\n\t},\n\n\t_keepFocus: function( event ) {\n\t\tevent.preventDefault();\n\t\tthis._restoreTabbableFocus();\n\n\t\t// support: IE\n\t\t// IE <= 8 doesn't prevent moving focus even with event.preventDefault()\n\t\t// so we check again later\n\t\tthis._delay( this._restoreTabbableFocus );\n\t},\n\n\t_createWrapper: function() {\n\t\tthis.uiDialog = $( \"<div>\" )\n\t\t\t.hide()\n\t\t\t.attr( {\n\n\t\t\t\t// Setting tabIndex makes the div focusable\n\t\t\t\ttabIndex: -1,\n\t\t\t\trole: \"dialog\"\n\t\t\t} )\n\t\t\t.appendTo( this._appendTo() );\n\n\t\tthis._addClass( this.uiDialog, \"ui-dialog\", \"ui-widget ui-widget-content ui-front\" );\n\t\tthis._on( this.uiDialog, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\tif ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&\n\t\t\t\t\t\tevent.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tthis.close( event );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Prevent tabbing out of dialogs\n\t\t\t\tif ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar tabbables = this.uiDialog.find( \":tabbable\" ),\n\t\t\t\t\tfirst = tabbables.first(),\n\t\t\t\t\tlast = tabbables.last();\n\n\t\t\t\tif ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&\n\t\t\t\t\t\t!event.shiftKey ) {\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tfirst.trigger( \"focus\" );\n\t\t\t\t\t} );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t} else if ( ( event.target === first[ 0 ] ||\n\t\t\t\t\t\tevent.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tlast.trigger( \"focus\" );\n\t\t\t\t\t} );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t},\n\t\t\tmousedown: function( event ) {\n\t\t\t\tif ( this._moveToTop( event ) ) {\n\t\t\t\t\tthis._focusTabbable();\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// We assume that any existing aria-describedby attribute means\n\t\t// that the dialog content is marked up properly\n\t\t// otherwise we brute force the content as the description\n\t\tif ( !this.element.find( \"[aria-describedby]\" ).length ) {\n\t\t\tthis.uiDialog.attr( {\n\t\t\t\t\"aria-describedby\": this.element.uniqueId().attr( \"id\" )\n\t\t\t} );\n\t\t}\n\t},\n\n\t_createTitlebar: function() {\n\t\tvar uiDialogTitle;\n\n\t\tthis.uiDialogTitlebar = $( \"<div>\" );\n\t\tthis._addClass( this.uiDialogTitlebar,\n\t\t\t\"ui-dialog-titlebar\", \"ui-widget-header ui-helper-clearfix\" );\n\t\tthis._on( this.uiDialogTitlebar, {\n\t\t\tmousedown: function( event ) {\n\n\t\t\t\t// Don't prevent click on close button (#8838)\n\t\t\t\t// Focusing a dialog that is partially scrolled out of view\n\t\t\t\t// causes the browser to scroll it into view, preventing the click event\n\t\t\t\tif ( !$( event.target ).closest( \".ui-dialog-titlebar-close\" ) ) {\n\n\t\t\t\t\t// Dialog isn't getting focus when dragging (#8063)\n\t\t\t\t\tthis.uiDialog.trigger( \"focus\" );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Support: IE\n\t\t// Use type=\"button\" to prevent enter keypresses in textboxes from closing the\n\t\t// dialog in IE (#9312)\n\t\tthis.uiDialogTitlebarClose = $( \"<button type='button'></button>\" )\n\t\t\t.button( {\n\t\t\t\tlabel: $( \"<a>\" ).text( this.options.closeText ).html(),\n\t\t\t\ticon: \"ui-icon-closethick\",\n\t\t\t\tshowLabel: false\n\t\t\t} )\n\t\t\t.appendTo( this.uiDialogTitlebar );\n\n\t\tthis._addClass( this.uiDialogTitlebarClose, \"ui-dialog-titlebar-close\" );\n\t\tthis._on( this.uiDialogTitlebarClose, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.close( event );\n\t\t\t}\n\t\t} );\n\n\t\tuiDialogTitle = $( \"<span>\" ).uniqueId().prependTo( this.uiDialogTitlebar );\n\t\tthis._addClass( uiDialogTitle, \"ui-dialog-title\" );\n\t\tthis._title( uiDialogTitle );\n\n\t\tthis.uiDialogTitlebar.prependTo( this.uiDialog );\n\n\t\tthis.uiDialog.attr( {\n\t\t\t\"aria-labelledby\": uiDialogTitle.attr( \"id\" )\n\t\t} );\n\t},\n\n\t_title: function( title ) {\n\t\tif ( this.options.title ) {\n\t\t\ttitle.text( this.options.title );\n\t\t} else {\n\t\t\ttitle.html( \"&#160;\" );\n\t\t}\n\t},\n\n\t_createButtonPane: function() {\n\t\tthis.uiDialogButtonPane = $( \"<div>\" );\n\t\tthis._addClass( this.uiDialogButtonPane, \"ui-dialog-buttonpane\",\n\t\t\t\"ui-widget-content ui-helper-clearfix\" );\n\n\t\tthis.uiButtonSet = $( \"<div>\" )\n\t\t\t.appendTo( this.uiDialogButtonPane );\n\t\tthis._addClass( this.uiButtonSet, \"ui-dialog-buttonset\" );\n\n\t\tthis._createButtons();\n\t},\n\n\t_createButtons: function() {\n\t\tvar that = this,\n\t\t\tbuttons = this.options.buttons;\n\n\t\t// If we already have a button pane, remove it\n\t\tthis.uiDialogButtonPane.remove();\n\t\tthis.uiButtonSet.empty();\n\n\t\tif ( $.isEmptyObject( buttons ) || ( Array.isArray( buttons ) && !buttons.length ) ) {\n\t\t\tthis._removeClass( this.uiDialog, \"ui-dialog-buttons\" );\n\t\t\treturn;\n\t\t}\n\n\t\t$.each( buttons, function( name, props ) {\n\t\t\tvar click, buttonOptions;\n\t\t\tprops = typeof props === \"function\" ?\n\t\t\t\t{ click: props, text: name } :\n\t\t\t\tprops;\n\n\t\t\t// Default to a non-submitting button\n\t\t\tprops = $.extend( { type: \"button\" }, props );\n\n\t\t\t// Change the context for the click callback to be the main element\n\t\t\tclick = props.click;\n\t\t\tbuttonOptions = {\n\t\t\t\ticon: props.icon,\n\t\t\t\ticonPosition: props.iconPosition,\n\t\t\t\tshowLabel: props.showLabel,\n\n\t\t\t\t// Deprecated options\n\t\t\t\ticons: props.icons,\n\t\t\t\ttext: props.text\n\t\t\t};\n\n\t\t\tdelete props.click;\n\t\t\tdelete props.icon;\n\t\t\tdelete props.iconPosition;\n\t\t\tdelete props.showLabel;\n\n\t\t\t// Deprecated options\n\t\t\tdelete props.icons;\n\t\t\tif ( typeof props.text === \"boolean\" ) {\n\t\t\t\tdelete props.text;\n\t\t\t}\n\n\t\t\t$( \"<button></button>\", props )\n\t\t\t\t.button( buttonOptions )\n\t\t\t\t.appendTo( that.uiButtonSet )\n\t\t\t\t.on( \"click\", function() {\n\t\t\t\t\tclick.apply( that.element[ 0 ], arguments );\n\t\t\t\t} );\n\t\t} );\n\t\tthis._addClass( this.uiDialog, \"ui-dialog-buttons\" );\n\t\tthis.uiDialogButtonPane.appendTo( this.uiDialog );\n\t},\n\n\t_makeDraggable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\tposition: ui.position,\n\t\t\t\toffset: ui.offset\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.draggable( {\n\t\t\tcancel: \".ui-dialog-content, .ui-dialog-titlebar-close\",\n\t\t\thandle: \".ui-dialog-titlebar\",\n\t\t\tcontainment: \"document\",\n\t\t\tstart: function( event, ui ) {\n\t\t\t\tthat._addClass( $( this ), \"ui-dialog-dragging\" );\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"dragStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tdrag: function( event, ui ) {\n\t\t\t\tthat._trigger( \"drag\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\tvar left = ui.offset.left - that.document.scrollLeft(),\n\t\t\t\t\ttop = ui.offset.top - that.document.scrollTop();\n\n\t\t\t\toptions.position = {\n\t\t\t\t\tmy: \"left top\",\n\t\t\t\t\tat: \"left\" + ( left >= 0 ? \"+\" : \"\" ) + left + \" \" +\n\t\t\t\t\t\t\"top\" + ( top >= 0 ? \"+\" : \"\" ) + top,\n\t\t\t\t\tof: that.window\n\t\t\t\t};\n\t\t\t\tthat._removeClass( $( this ), \"ui-dialog-dragging\" );\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"dragStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_makeResizable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options,\n\t\t\thandles = options.resizable,\n\n\t\t\t// .ui-resizable has position: relative defined in the stylesheet\n\t\t\t// but dialogs have to use absolute or fixed positioning\n\t\t\tposition = this.uiDialog.css( \"position\" ),\n\t\t\tresizeHandles = typeof handles === \"string\" ?\n\t\t\t\thandles :\n\t\t\t\t\"n,e,s,w,se,sw,ne,nw\";\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\toriginalPosition: ui.originalPosition,\n\t\t\t\toriginalSize: ui.originalSize,\n\t\t\t\tposition: ui.position,\n\t\t\t\tsize: ui.size\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.resizable( {\n\t\t\tcancel: \".ui-dialog-content\",\n\t\t\tcontainment: \"document\",\n\t\t\talsoResize: this.element,\n\t\t\tmaxWidth: options.maxWidth,\n\t\t\tmaxHeight: options.maxHeight,\n\t\t\tminWidth: options.minWidth,\n\t\t\tminHeight: this._minHeight(),\n\t\t\thandles: resizeHandles,\n\t\t\tstart: function( event, ui ) {\n\t\t\t\tthat._addClass( $( this ), \"ui-dialog-resizing\" );\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"resizeStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tresize: function( event, ui ) {\n\t\t\t\tthat._trigger( \"resize\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\tvar offset = that.uiDialog.offset(),\n\t\t\t\t\tleft = offset.left - that.document.scrollLeft(),\n\t\t\t\t\ttop = offset.top - that.document.scrollTop();\n\n\t\t\t\toptions.height = that.uiDialog.height();\n\t\t\t\toptions.width = that.uiDialog.width();\n\t\t\t\toptions.position = {\n\t\t\t\t\tmy: \"left top\",\n\t\t\t\t\tat: \"left\" + ( left >= 0 ? \"+\" : \"\" ) + left + \" \" +\n\t\t\t\t\t\t\"top\" + ( top >= 0 ? \"+\" : \"\" ) + top,\n\t\t\t\t\tof: that.window\n\t\t\t\t};\n\t\t\t\tthat._removeClass( $( this ), \"ui-dialog-resizing\" );\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"resizeStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t} )\n\t\t\t.css( \"position\", position );\n\t},\n\n\t_trackFocus: function() {\n\t\tthis._on( this.widget(), {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._makeFocusTarget();\n\t\t\t\tthis._focusedElement = $( event.target );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_makeFocusTarget: function() {\n\t\tthis._untrackInstance();\n\t\tthis._trackingInstances().unshift( this );\n\t},\n\n\t_untrackInstance: function() {\n\t\tvar instances = this._trackingInstances(),\n\t\t\texists = $.inArray( this, instances );\n\t\tif ( exists !== -1 ) {\n\t\t\tinstances.splice( exists, 1 );\n\t\t}\n\t},\n\n\t_trackingInstances: function() {\n\t\tvar instances = this.document.data( \"ui-dialog-instances\" );\n\t\tif ( !instances ) {\n\t\t\tinstances = [];\n\t\t\tthis.document.data( \"ui-dialog-instances\", instances );\n\t\t}\n\t\treturn instances;\n\t},\n\n\t_minHeight: function() {\n\t\tvar options = this.options;\n\n\t\treturn options.height === \"auto\" ?\n\t\t\toptions.minHeight :\n\t\t\tMath.min( options.minHeight, options.height );\n\t},\n\n\t_position: function() {\n\n\t\t// Need to show the dialog to get the actual offset in the position plugin\n\t\tvar isVisible = this.uiDialog.is( \":visible\" );\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.show();\n\t\t}\n\t\tthis.uiDialog.position( this.options.position );\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.hide();\n\t\t}\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar that = this,\n\t\t\tresize = false,\n\t\t\tresizableOptions = {};\n\n\t\t$.each( options, function( key, value ) {\n\t\t\tthat._setOption( key, value );\n\n\t\t\tif ( key in that.sizeRelatedOptions ) {\n\t\t\t\tresize = true;\n\t\t\t}\n\t\t\tif ( key in that.resizableRelatedOptions ) {\n\t\t\t\tresizableOptions[ key ] = value;\n\t\t\t}\n\t\t} );\n\n\t\tif ( resize ) {\n\t\t\tthis._size();\n\t\t\tthis._position();\n\t\t}\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\n\t\t\tthis.uiDialog.resizable( \"option\", resizableOptions );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar isDraggable, isResizable,\n\t\t\tuiDialog = this.uiDialog;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.uiDialog.appendTo( this._appendTo() );\n\t\t}\n\n\t\tif ( key === \"buttons\" ) {\n\t\t\tthis._createButtons();\n\t\t}\n\n\t\tif ( key === \"closeText\" ) {\n\t\t\tthis.uiDialogTitlebarClose.button( {\n\n\t\t\t\t// Ensure that we always pass a string\n\t\t\t\tlabel: $( \"<a>\" ).text( \"\" + this.options.closeText ).html()\n\t\t\t} );\n\t\t}\n\n\t\tif ( key === \"draggable\" ) {\n\t\t\tisDraggable = uiDialog.is( \":data(ui-draggable)\" );\n\t\t\tif ( isDraggable && !value ) {\n\t\t\t\tuiDialog.draggable( \"destroy\" );\n\t\t\t}\n\n\t\t\tif ( !isDraggable && value ) {\n\t\t\t\tthis._makeDraggable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"position\" ) {\n\t\t\tthis._position();\n\t\t}\n\n\t\tif ( key === \"resizable\" ) {\n\n\t\t\t// currently resizable, becoming non-resizable\n\t\t\tisResizable = uiDialog.is( \":data(ui-resizable)\" );\n\t\t\tif ( isResizable && !value ) {\n\t\t\t\tuiDialog.resizable( \"destroy\" );\n\t\t\t}\n\n\t\t\t// Currently resizable, changing handles\n\t\t\tif ( isResizable && typeof value === \"string\" ) {\n\t\t\t\tuiDialog.resizable( \"option\", \"handles\", value );\n\t\t\t}\n\n\t\t\t// Currently non-resizable, becoming resizable\n\t\t\tif ( !isResizable && value !== false ) {\n\t\t\t\tthis._makeResizable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"title\" ) {\n\t\t\tthis._title( this.uiDialogTitlebar.find( \".ui-dialog-title\" ) );\n\t\t}\n\t},\n\n\t_size: function() {\n\n\t\t// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content\n\t\t// divs will both have width and height set, so we need to reset them\n\t\tvar nonContentHeight, minContentHeight, maxContentHeight,\n\t\t\toptions = this.options;\n\n\t\t// Reset content sizing\n\t\tthis.element.show().css( {\n\t\t\twidth: \"auto\",\n\t\t\tminHeight: 0,\n\t\t\tmaxHeight: \"none\",\n\t\t\theight: 0\n\t\t} );\n\n\t\tif ( options.minWidth > options.width ) {\n\t\t\toptions.width = options.minWidth;\n\t\t}\n\n\t\t// Reset wrapper sizing\n\t\t// determine the height of all the non-content elements\n\t\tnonContentHeight = this.uiDialog.css( {\n\t\t\theight: \"auto\",\n\t\t\twidth: options.width\n\t\t} )\n\t\t\t.outerHeight();\n\t\tminContentHeight = Math.max( 0, options.minHeight - nonContentHeight );\n\t\tmaxContentHeight = typeof options.maxHeight === \"number\" ?\n\t\t\tMath.max( 0, options.maxHeight - nonContentHeight ) :\n\t\t\t\"none\";\n\n\t\tif ( options.height === \"auto\" ) {\n\t\t\tthis.element.css( {\n\t\t\t\tminHeight: minContentHeight,\n\t\t\t\tmaxHeight: maxContentHeight,\n\t\t\t\theight: \"auto\"\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.element.height( Math.max( 0, options.height - nonContentHeight ) );\n\t\t}\n\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\n\t\t\tthis.uiDialog.resizable( \"option\", \"minHeight\", this._minHeight() );\n\t\t}\n\t},\n\n\t_blockFrames: function() {\n\t\tthis.iframeBlocks = this.document.find( \"iframe\" ).map( function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css( {\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\twidth: iframe.outerWidth(),\n\t\t\t\t\theight: iframe.outerHeight()\n\t\t\t\t} )\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.offset( iframe.offset() )[ 0 ];\n\t\t} );\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_allowInteraction: function( event ) {\n\t\tif ( $( event.target ).closest( \".ui-dialog\" ).length ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: Remove hack when datepicker implements\n\t\t// the .ui-front logic (#8989)\n\t\treturn !!$( event.target ).closest( \".ui-datepicker\" ).length;\n\t},\n\n\t_createOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar jqMinor = $.fn.jquery.substring( 0, 4 );\n\n\t\t// We use a delay in case the overlay is created from an\n\t\t// event that we're going to be cancelling (#2804)\n\t\tvar isOpening = true;\n\t\tthis._delay( function() {\n\t\t\tisOpening = false;\n\t\t} );\n\n\t\tif ( !this.document.data( \"ui-dialog-overlays\" ) ) {\n\n\t\t\t// Prevent use of anchors and inputs\n\t\t\t// This doesn't use `_on()` because it is a shared event handler\n\t\t\t// across all open modal dialogs.\n\t\t\tthis.document.on( \"focusin.ui-dialog\", function( event ) {\n\t\t\t\tif ( isOpening ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar instance = this._trackingInstances()[ 0 ];\n\t\t\t\tif ( !instance._allowInteraction( event ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tinstance._focusTabbable();\n\n\t\t\t\t\t// Support: jQuery >=3.4 <3.6 only\n\t\t\t\t\t// Focus re-triggering in jQuery 3.4/3.5 makes the original element\n\t\t\t\t\t// have its focus event propagated last, breaking the re-targeting.\n\t\t\t\t\t// Trigger focus in a delay in addition if needed to avoid the issue\n\t\t\t\t\t// See https://github.com/jquery/jquery/issues/4382\n\t\t\t\t\tif ( jqMinor === \"3.4.\" || jqMinor === \"3.5.\" ) {\n\t\t\t\t\t\tinstance._delay( instance._restoreTabbableFocus );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}.bind( this ) );\n\t\t}\n\n\t\tthis.overlay = $( \"<div>\" )\n\t\t\t.appendTo( this._appendTo() );\n\n\t\tthis._addClass( this.overlay, null, \"ui-widget-overlay ui-front\" );\n\t\tthis._on( this.overlay, {\n\t\t\tmousedown: \"_keepFocus\"\n\t\t} );\n\t\tthis.document.data( \"ui-dialog-overlays\",\n\t\t\t( this.document.data( \"ui-dialog-overlays\" ) || 0 ) + 1 );\n\t},\n\n\t_destroyOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.overlay ) {\n\t\t\tvar overlays = this.document.data( \"ui-dialog-overlays\" ) - 1;\n\n\t\t\tif ( !overlays ) {\n\t\t\t\tthis.document.off( \"focusin.ui-dialog\" );\n\t\t\t\tthis.document.removeData( \"ui-dialog-overlays\" );\n\t\t\t} else {\n\t\t\t\tthis.document.data( \"ui-dialog-overlays\", overlays );\n\t\t\t}\n\n\t\t\tthis.overlay.remove();\n\t\t\tthis.overlay = null;\n\t\t}\n\t}\n} );\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for dialogClass option\n\t$.widget( \"ui.dialog\", $.ui.dialog, {\n\t\toptions: {\n\t\t\tdialogClass: \"\"\n\t\t},\n\t\t_createWrapper: function() {\n\t\t\tthis._super();\n\t\t\tthis.uiDialog.addClass( this.options.dialogClass );\n\t\t},\n\t\t_setOption: function( key, value ) {\n\t\t\tif ( key === \"dialogClass\" ) {\n\t\t\t\tthis.uiDialog\n\t\t\t\t\t.removeClass( this.options.dialogClass )\n\t\t\t\t\t.addClass( value );\n\t\t\t}\n\t\t\tthis._superApply( arguments );\n\t\t}\n\t} );\n}\n\nreturn $.ui.dialog;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/draggable.js",
    "content": "/*!\n * jQuery UI Draggable 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Draggable\n//>>group: Interactions\n//>>description: Enables dragging functionality for any element.\n//>>docs: http://api.jqueryui.com/draggable/\n//>>demos: http://jqueryui.com/draggable/\n//>>css.structure: ../../themes/base/draggable.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./mouse\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.widget( \"ui.draggable\", $.ui.mouse, {\n\tversion: \"1.13.0\",\n\twidgetEventPrefix: \"drag\",\n\toptions: {\n\t\taddClasses: true,\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectToSortable: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\tiframeFix: false,\n\t\topacity: false,\n\t\trefreshPositions: false,\n\t\trevert: false,\n\t\trevertDuration: 500,\n\t\tscope: \"default\",\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tsnap: false,\n\t\tsnapMode: \"both\",\n\t\tsnapTolerance: 20,\n\t\tstack: false,\n\t\tzIndex: false,\n\n\t\t// Callbacks\n\t\tdrag: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\t_create: function() {\n\n\t\tif ( this.options.helper === \"original\" ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\t\tif ( this.options.addClasses ) {\n\t\t\tthis._addClass( \"ui-draggable\" );\n\t\t}\n\t\tthis._setHandleClassName();\n\n\t\tthis._mouseInit();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._removeHandleClassName();\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tif ( ( this.helper || this.element ).is( \".ui-draggable-dragging\" ) ) {\n\t\t\tthis.destroyOnClear = true;\n\t\t\treturn;\n\t\t}\n\t\tthis._removeHandleClassName();\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar o = this.options;\n\n\t\t// Among others, prevent a drag on a resizable-handle\n\t\tif ( this.helper || o.disabled ||\n\t\t\t\t$( event.target ).closest( \".ui-resizable-handle\" ).length > 0 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//Quit if we're not on a valid handle\n\t\tthis.handle = this._getHandle( event );\n\t\tif ( !this.handle ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._blurActiveElement( event );\n\n\t\tthis._blockFrames( o.iframeFix === true ? \"iframe\" : o.iframeFix );\n\n\t\treturn true;\n\n\t},\n\n\t_blockFrames: function( selector ) {\n\t\tthis.iframeBlocks = this.document.find( selector ).map( function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css( \"position\", \"absolute\" )\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.outerWidth( iframe.outerWidth() )\n\t\t\t\t.outerHeight( iframe.outerHeight() )\n\t\t\t\t.offset( iframe.offset() )[ 0 ];\n\t\t} );\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_blurActiveElement: function( event ) {\n\t\tvar activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),\n\t\t\ttarget = $( event.target );\n\n\t\t// Don't blur if the event occurred on an element that is within\n\t\t// the currently focused element\n\t\t// See #10527, #12472\n\t\tif ( target.closest( activeElement ).length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Blur any element that currently has focus, see #4261\n\t\t$.ui.safeBlur( activeElement );\n\t},\n\n\t_mouseStart: function( event ) {\n\n\t\tvar o = this.options;\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper( event );\n\n\t\tthis._addClass( this.helper, \"ui-draggable-dragging\" );\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//If ddmanager is used for droppables, set the global draggable\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Store the helper's css position\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\t\tthis.scrollParent = this.helper.scrollParent( true );\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tthis.hasFixedAncestor = this.helper.parents().filter( function() {\n\t\t\t\treturn $( this ).css( \"position\" ) === \"fixed\";\n\t\t\t} ).length > 0;\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.positionAbs = this.element.offset();\n\t\tthis._refreshOffsets( event );\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this.position = this._generatePosition( event, false );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\tif ( o.cursorAt ) {\n\t\t\tthis._adjustOffsetFromHelper( o.cursorAt );\n\t\t}\n\n\t\t//Set a containment if given in the options\n\t\tthis._setContainment();\n\n\t\t//Trigger event + callbacks\n\t\tif ( this._trigger( \"start\", event ) === false ) {\n\t\t\tthis._clear();\n\t\t\treturn false;\n\t\t}\n\n\t\t//Recache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//Prepare the droppable offsets\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\t// Execute the drag once - this causes the helper not to be visible before getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event, true );\n\n\t\t// If the ddmanager is used for droppables, inform the manager that dragging has started\n\t\t// (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStart( this, event );\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t_refreshOffsets: function( event ) {\n\t\tthis.offset = {\n\t\t\ttop: this.positionAbs.top - this.margins.top,\n\t\t\tleft: this.positionAbs.left - this.margins.left,\n\t\t\tscroll: false,\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset()\n\t\t};\n\n\t\tthis.offset.click = {\n\t\t\tleft: event.pageX - this.offset.left,\n\t\t\ttop: event.pageY - this.offset.top\n\t\t};\n\t},\n\n\t_mouseDrag: function( event, noPropagation ) {\n\n\t\t// reset any necessary cached properties (see #5009)\n\t\tif ( this.hasFixedAncestor ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event, true );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Call plugins and callbacks and use the resulting position if something is returned\n\t\tif ( !noPropagation ) {\n\t\t\tvar ui = this._uiHash();\n\t\t\tif ( this._trigger( \"drag\", event, ui ) === false ) {\n\t\t\t\tthis._mouseUp( new $.Event( \"mouseup\", event ) );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.position = ui.position;\n\t\t}\n\n\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tvar that = this,\n\t\t\tdropped = false;\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\tdropped = $.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\t//if a drop comes from outside (a sortable)\n\t\tif ( this.dropped ) {\n\t\t\tdropped = this.dropped;\n\t\t\tthis.dropped = false;\n\t\t}\n\n\t\tif ( ( this.options.revert === \"invalid\" && !dropped ) ||\n\t\t\t\t( this.options.revert === \"valid\" && dropped ) ||\n\t\t\t\tthis.options.revert === true || ( typeof this.options.revert === \"function\" &&\n\t\t\t\tthis.options.revert.call( this.element, dropped ) )\n\t\t) {\n\t\t\t$( this.helper ).animate(\n\t\t\t\tthis.originalPosition,\n\t\t\t\tparseInt( this.options.revertDuration, 10 ),\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( that._trigger( \"stop\", event ) !== false ) {\n\t\t\t\t\t\tthat._clear();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tif ( this._trigger( \"stop\", event ) !== false ) {\n\t\t\t\tthis._clear();\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis._unblockFrames();\n\n\t\t// If the ddmanager is used for droppables, inform the manager that dragging has stopped\n\t\t// (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStop( this, event );\n\t\t}\n\n\t\t// Only need to focus if the event occurred on the draggable itself, see #10527\n\t\tif ( this.handleElement.is( event.target ) ) {\n\n\t\t\t// The interaction is over; whether or not the click resulted in a drag,\n\t\t\t// focus the element\n\t\t\tthis.element.trigger( \"focus\" );\n\t\t}\n\n\t\treturn $.ui.mouse.prototype._mouseUp.call( this, event );\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.helper.is( \".ui-draggable-dragging\" ) ) {\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: this.element[ 0 ] } ) );\n\t\t} else {\n\t\t\tthis._clear();\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t_getHandle: function( event ) {\n\t\treturn this.options.handle ?\n\t\t\t!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :\n\t\t\ttrue;\n\t},\n\n\t_setHandleClassName: function() {\n\t\tthis.handleElement = this.options.handle ?\n\t\t\tthis.element.find( this.options.handle ) : this.element;\n\t\tthis._addClass( this.handleElement, \"ui-draggable-handle\" );\n\t},\n\n\t_removeHandleClassName: function() {\n\t\tthis._removeClass( this.handleElement, \"ui-draggable-handle\" );\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelperIsFunction = typeof o.helper === \"function\",\n\t\t\thelper = helperIsFunction ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ?\n\t\t\t\t\tthis.element.clone().removeAttr( \"id\" ) :\n\t\t\t\t\tthis.element );\n\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\thelper.appendTo( ( o.appendTo === \"parent\" ?\n\t\t\t\tthis.element[ 0 ].parentNode :\n\t\t\t\to.appendTo ) );\n\t\t}\n\n\t\t// Http://bugs.jqueryui.com/ticket/9446\n\t\t// a helper function can return the original element\n\t\t// which wouldn't have been set to relative in _create\n\t\tif ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\n\t\tif ( helper[ 0 ] !== this.element[ 0 ] &&\n\t\t\t\t!( /(fixed|absolute)/ ).test( helper.css( \"position\" ) ) ) {\n\t\t\thelper.css( \"position\", \"absolute\" );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_setPositionRelative: function() {\n\t\tif ( !( /^(?:r|a|f)/ ).test( this.element.css( \"position\" ) ) ) {\n\t\t\tthis.element[ 0 ].style.position = \"relative\";\n\t\t}\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( Array.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_isRootNode: function( element ) {\n\t\treturn ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tvar po = this.offsetParent.offset(),\n\t\t\tdocument = this.document[ 0 ];\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== document &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\tif ( this._isRootNode( this.offsetParent[ 0 ] ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\t\tif ( this.cssPosition !== \"relative\" ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\tvar p = this.element.position(),\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),\n\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )\n\t\t};\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.element.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.element.css( \"marginTop\" ), 10 ) || 0 ),\n\t\t\tright: ( parseInt( this.element.css( \"marginRight\" ), 10 ) || 0 ),\n\t\t\tbottom: ( parseInt( this.element.css( \"marginBottom\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar isUserScrollable, c, ce,\n\t\t\to = this.options,\n\t\t\tdocument = this.document[ 0 ];\n\n\t\tthis.relativeContainer = null;\n\n\t\tif ( !o.containment ) {\n\t\t\tthis.containment = null;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\t$( window ).scrollLeft() + $( window ).width() -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\t$( window ).scrollTop() +\n\t\t\t\t\t( $( window ).height() || document.body.parentNode.scrollHeight ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"document\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t$( document ).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( $( document ).height() || document.body.parentNode.scrollHeight ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment.constructor === Array ) {\n\t\t\tthis.containment = o.containment;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\n\t\tc = $( o.containment );\n\t\tce = c[ 0 ];\n\n\t\tif ( !ce ) {\n\t\t\treturn;\n\t\t}\n\n\t\tisUserScrollable = /(scroll|auto)/.test( c.css( \"overflow\" ) );\n\n\t\tthis.containment = [\n\t\t\t( parseInt( c.css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t( parseInt( c.css( \"paddingLeft\" ), 10 ) || 0 ),\n\t\t\t( parseInt( c.css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t( parseInt( c.css( \"paddingTop\" ), 10 ) || 0 ),\n\t\t\t( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t( parseInt( c.css( \"borderRightWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.width -\n\t\t\t\tthis.margins.left -\n\t\t\t\tthis.margins.right,\n\t\t\t( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t( parseInt( c.css( \"borderBottomWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.height -\n\t\t\t\tthis.margins.top -\n\t\t\t\tthis.margins.bottom\n\t\t];\n\t\tthis.relativeContainer = c;\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.top :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.left :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event, constrainPosition ) {\n\n\t\tvar containment, co, top, left,\n\t\t\to = this.options,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY;\n\n\t\t// Cache the scroll\n\t\tif ( !scrollIsRootNode || !this.offset.scroll ) {\n\t\t\tthis.offset.scroll = {\n\t\t\t\ttop: this.scrollParent.scrollTop(),\n\t\t\t\tleft: this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\t// If we are not dragging yet, we won't check for options\n\t\tif ( constrainPosition ) {\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( this.relativeContainer ) {\n\t\t\t\t\tco = this.relativeContainer.offset();\n\t\t\t\t\tcontainment = [\n\t\t\t\t\t\tthis.containment[ 0 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 1 ] + co.top,\n\t\t\t\t\t\tthis.containment[ 2 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 3 ] + co.top\n\t\t\t\t\t];\n\t\t\t\t} else {\n\t\t\t\t\tcontainment = this.containment;\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.offset.click.left < containment[ 0 ] ) {\n\t\t\t\t\tpageX = containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < containment[ 1 ] ) {\n\t\t\t\t\tpageY = containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > containment[ 2 ] ) {\n\t\t\t\t\tpageX = containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > containment[ 3 ] ) {\n\t\t\t\t\tpageY = containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\n\t\t\t\t//Check for grid elements set to 0 to prevent divide by 0 error causing invalid\n\t\t\t\t// argument errors in IE (see ticket #6950)\n\t\t\t\ttop = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -\n\t\t\t\t\tthis.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;\n\t\t\t\tpageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||\n\t\t\t\t\ttop - this.offset.click.top > containment[ 3 ] ) ?\n\t\t\t\t\t\ttop :\n\t\t\t\t\t\t( ( top - this.offset.click.top >= containment[ 1 ] ) ?\n\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;\n\n\t\t\t\tleft = o.grid[ 0 ] ? this.originalPageX +\n\t\t\t\t\tMath.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :\n\t\t\t\t\tthis.originalPageX;\n\t\t\t\tpageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||\n\t\t\t\t\tleft - this.offset.click.left > containment[ 2 ] ) ?\n\t\t\t\t\t\tleft :\n\t\t\t\t\t\t( ( left - this.offset.click.left >= containment[ 0 ] ) ?\n\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"y\" ) {\n\t\t\t\tpageX = this.originalPageX;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"x\" ) {\n\t\t\t\tpageY = this.originalPageY;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.top :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.top ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.left :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.left ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_clear: function() {\n\t\tthis._removeClass( this.helper, \"ui-draggable-dragging\" );\n\t\tif ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {\n\t\t\tthis.helper.remove();\n\t\t}\n\t\tthis.helper = null;\n\t\tthis.cancelHelperRemoval = false;\n\t\tif ( this.destroyOnClear ) {\n\t\t\tthis.destroy();\n\t\t}\n\t},\n\n\t// From now on bulk stuff - mainly helpers\n\n\t_trigger: function( type, event, ui ) {\n\t\tui = ui || this._uiHash();\n\t\t$.ui.plugin.call( this, type, [ event, ui, this ], true );\n\n\t\t// Absolute position and offset (see #6884 ) have to be recalculated after plugins\n\t\tif ( /^(drag|start|stop)/.test( type ) ) {\n\t\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\t\t\tui.offset = this.positionAbs;\n\t\t}\n\t\treturn $.Widget.prototype._trigger.call( this, type, event, ui );\n\t},\n\n\tplugins: {},\n\n\t_uiHash: function() {\n\t\treturn {\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\toriginalPosition: this.originalPosition,\n\t\t\toffset: this.positionAbs\n\t\t};\n\t}\n\n} );\n\n$.ui.plugin.add( \"draggable\", \"connectToSortable\", {\n\tstart: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t} );\n\n\t\tdraggable.sortables = [];\n\t\t$( draggable.options.connectToSortable ).each( function() {\n\t\t\tvar sortable = $( this ).sortable( \"instance\" );\n\n\t\t\tif ( sortable && !sortable.options.disabled ) {\n\t\t\t\tdraggable.sortables.push( sortable );\n\n\t\t\t\t// RefreshPositions is called at drag start to refresh the containerCache\n\t\t\t\t// which is used in drag. This ensures it's initialized and synchronized\n\t\t\t\t// with any changes that might have happened on the page since initialization.\n\t\t\t\tsortable.refreshPositions();\n\t\t\t\tsortable._trigger( \"activate\", event, uiSortable );\n\t\t\t}\n\t\t} );\n\t},\n\tstop: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t} );\n\n\t\tdraggable.cancelHelperRemoval = false;\n\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar sortable = this;\n\n\t\t\tif ( sortable.isOver ) {\n\t\t\t\tsortable.isOver = 0;\n\n\t\t\t\t// Allow this sortable to handle removing the helper\n\t\t\t\tdraggable.cancelHelperRemoval = true;\n\t\t\t\tsortable.cancelHelperRemoval = false;\n\n\t\t\t\t// Use _storedCSS To restore properties in the sortable,\n\t\t\t\t// as this also handles revert (#9675) since the draggable\n\t\t\t\t// may have modified them in unexpected ways (#8809)\n\t\t\t\tsortable._storedCSS = {\n\t\t\t\t\tposition: sortable.placeholder.css( \"position\" ),\n\t\t\t\t\ttop: sortable.placeholder.css( \"top\" ),\n\t\t\t\t\tleft: sortable.placeholder.css( \"left\" )\n\t\t\t\t};\n\n\t\t\t\tsortable._mouseStop( event );\n\n\t\t\t\t// Once drag has ended, the sortable should return to using\n\t\t\t\t// its original helper, not the shared helper from draggable\n\t\t\t\tsortable.options.helper = sortable.options._helper;\n\t\t\t} else {\n\n\t\t\t\t// Prevent this Sortable from removing the helper.\n\t\t\t\t// However, don't set the draggable to remove the helper\n\t\t\t\t// either as another connected Sortable may yet handle the removal.\n\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\tsortable._trigger( \"deactivate\", event, uiSortable );\n\t\t\t}\n\t\t} );\n\t},\n\tdrag: function( event, ui, draggable ) {\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar innermostIntersecting = false,\n\t\t\t\tsortable = this;\n\n\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\tsortable.positionAbs = draggable.positionAbs;\n\t\t\tsortable.helperProportions = draggable.helperProportions;\n\t\t\tsortable.offset.click = draggable.offset.click;\n\n\t\t\tif ( sortable._intersectsWith( sortable.containerCache ) ) {\n\t\t\t\tinnermostIntersecting = true;\n\n\t\t\t\t$.each( draggable.sortables, function() {\n\n\t\t\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\t\t\tthis.positionAbs = draggable.positionAbs;\n\t\t\t\t\tthis.helperProportions = draggable.helperProportions;\n\t\t\t\t\tthis.offset.click = draggable.offset.click;\n\n\t\t\t\t\tif ( this !== sortable &&\n\t\t\t\t\t\t\tthis._intersectsWith( this.containerCache ) &&\n\t\t\t\t\t\t\t$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {\n\t\t\t\t\t\tinnermostIntersecting = false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn innermostIntersecting;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tif ( innermostIntersecting ) {\n\n\t\t\t\t// If it intersects, we use a little isOver variable and set it once,\n\t\t\t\t// so that the move-in stuff gets fired only once.\n\t\t\t\tif ( !sortable.isOver ) {\n\t\t\t\t\tsortable.isOver = 1;\n\n\t\t\t\t\t// Store draggable's parent in case we need to reappend to it later.\n\t\t\t\t\tdraggable._parent = ui.helper.parent();\n\n\t\t\t\t\tsortable.currentItem = ui.helper\n\t\t\t\t\t\t.appendTo( sortable.element )\n\t\t\t\t\t\t.data( \"ui-sortable-item\", true );\n\n\t\t\t\t\t// Store helper option to later restore it\n\t\t\t\t\tsortable.options._helper = sortable.options.helper;\n\n\t\t\t\t\tsortable.options.helper = function() {\n\t\t\t\t\t\treturn ui.helper[ 0 ];\n\t\t\t\t\t};\n\n\t\t\t\t\t// Fire the start events of the sortable with our passed browser event,\n\t\t\t\t\t// and our own helper (so it doesn't create a new one)\n\t\t\t\t\tevent.target = sortable.currentItem[ 0 ];\n\t\t\t\t\tsortable._mouseCapture( event, true );\n\t\t\t\t\tsortable._mouseStart( event, true, true );\n\n\t\t\t\t\t// Because the browser event is way off the new appended portlet,\n\t\t\t\t\t// modify necessary variables to reflect the changes\n\t\t\t\t\tsortable.offset.click.top = draggable.offset.click.top;\n\t\t\t\t\tsortable.offset.click.left = draggable.offset.click.left;\n\t\t\t\t\tsortable.offset.parent.left -= draggable.offset.parent.left -\n\t\t\t\t\t\tsortable.offset.parent.left;\n\t\t\t\t\tsortable.offset.parent.top -= draggable.offset.parent.top -\n\t\t\t\t\t\tsortable.offset.parent.top;\n\n\t\t\t\t\tdraggable._trigger( \"toSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is in a valid drop zone,\n\t\t\t\t\t// used solely in the revert option to handle \"valid/invalid\".\n\t\t\t\t\tdraggable.dropped = sortable.element;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables in the case that\n\t\t\t\t\t// adding to one sortable changes the location of the other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Hack so receive/update callbacks work (mostly)\n\t\t\t\t\tdraggable.currentItem = draggable.element;\n\t\t\t\t\tsortable.fromOutside = draggable;\n\t\t\t\t}\n\n\t\t\t\tif ( sortable.currentItem ) {\n\t\t\t\t\tsortable._mouseDrag( event );\n\n\t\t\t\t\t// Copy the sortable's position because the draggable's can potentially reflect\n\t\t\t\t\t// a relative position, while sortable is always absolute, which the dragged\n\t\t\t\t\t// element has now become. (#8809)\n\t\t\t\t\tui.position = sortable.position;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// If it doesn't intersect with the sortable, and it intersected before,\n\t\t\t\t// we fake the drag stop of the sortable, but make sure it doesn't remove\n\t\t\t\t// the helper by using cancelHelperRemoval.\n\t\t\t\tif ( sortable.isOver ) {\n\n\t\t\t\t\tsortable.isOver = 0;\n\t\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\t\t// Calling sortable's mouseStop would trigger a revert,\n\t\t\t\t\t// so revert must be temporarily false until after mouseStop is called.\n\t\t\t\t\tsortable.options._revert = sortable.options.revert;\n\t\t\t\t\tsortable.options.revert = false;\n\n\t\t\t\t\tsortable._trigger( \"out\", event, sortable._uiHash( sortable ) );\n\t\t\t\t\tsortable._mouseStop( event, true );\n\n\t\t\t\t\t// Restore sortable behaviors that were modfied\n\t\t\t\t\t// when the draggable entered the sortable area (#9481)\n\t\t\t\t\tsortable.options.revert = sortable.options._revert;\n\t\t\t\t\tsortable.options.helper = sortable.options._helper;\n\n\t\t\t\t\tif ( sortable.placeholder ) {\n\t\t\t\t\t\tsortable.placeholder.remove();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Restore and recalculate the draggable's offset considering the sortable\n\t\t\t\t\t// may have modified them in unexpected ways. (#8809, #10669)\n\t\t\t\t\tui.helper.appendTo( draggable._parent );\n\t\t\t\t\tdraggable._refreshOffsets( event );\n\t\t\t\t\tui.position = draggable._generatePosition( event, true );\n\n\t\t\t\t\tdraggable._trigger( \"fromSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is no longer in a valid drop zone\n\t\t\t\t\tdraggable.dropped = false;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables just in case removing\n\t\t\t\t\t// from one sortable changes the location of other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"cursor\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( \"body\" ),\n\t\t\to = instance.options;\n\n\t\tif ( t.css( \"cursor\" ) ) {\n\t\t\to._cursor = t.css( \"cursor\" );\n\t\t}\n\t\tt.css( \"cursor\", o.cursor );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif ( o._cursor ) {\n\t\t\t$( \"body\" ).css( \"cursor\", o._cursor );\n\t\t}\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"opacity\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\t\tif ( t.css( \"opacity\" ) ) {\n\t\t\to._opacity = t.css( \"opacity\" );\n\t\t}\n\t\tt.css( \"opacity\", o.opacity );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif ( o._opacity ) {\n\t\t\t$( ui.helper ).css( \"opacity\", o._opacity );\n\t\t}\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"scroll\", {\n\tstart: function( event, ui, i ) {\n\t\tif ( !i.scrollParentNotHidden ) {\n\t\t\ti.scrollParentNotHidden = i.helper.scrollParent( false );\n\t\t}\n\n\t\tif ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&\n\t\t\t\ti.scrollParentNotHidden[ 0 ].tagName !== \"HTML\" ) {\n\t\t\ti.overflowOffset = i.scrollParentNotHidden.offset();\n\t\t}\n\t},\n\tdrag: function( event, ui, i  ) {\n\n\t\tvar o = i.options,\n\t\t\tscrolled = false,\n\t\t\tscrollParent = i.scrollParentNotHidden[ 0 ],\n\t\t\tdocument = i.document[ 0 ];\n\n\t\tif ( scrollParent !== document && scrollParent.tagName !== \"HTML\" ) {\n\t\t\tif ( !o.axis || o.axis !== \"x\" ) {\n\t\t\t\tif ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !o.axis || o.axis !== \"y\" ) {\n\t\t\t\tif ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( !o.axis || o.axis !== \"x\" ) {\n\t\t\t\tif ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !o.axis || o.axis !== \"y\" ) {\n\t\t\t\tif ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollLeft(\n\t\t\t\t\t\t$( document ).scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollLeft(\n\t\t\t\t\t\t$( document ).scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( i, event );\n\t\t}\n\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"snap\", {\n\tstart: function( event, ui, i ) {\n\n\t\tvar o = i.options;\n\n\t\ti.snapElements = [];\n\n\t\t$( o.snap.constructor !== String ? ( o.snap.items || \":data(ui-draggable)\" ) : o.snap )\n\t\t\t.each( function() {\n\t\t\t\tvar $t = $( this ),\n\t\t\t\t\t$o = $t.offset();\n\t\t\t\tif ( this !== i.element[ 0 ] ) {\n\t\t\t\t\ti.snapElements.push( {\n\t\t\t\t\t\titem: this,\n\t\t\t\t\t\twidth: $t.outerWidth(), height: $t.outerHeight(),\n\t\t\t\t\t\ttop: $o.top, left: $o.left\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t},\n\tdrag: function( event, ui, inst ) {\n\n\t\tvar ts, bs, ls, rs, l, r, t, b, i, first,\n\t\t\to = inst.options,\n\t\t\td = o.snapTolerance,\n\t\t\tx1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,\n\t\t\ty1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;\n\n\t\tfor ( i = inst.snapElements.length - 1; i >= 0; i-- ) {\n\n\t\t\tl = inst.snapElements[ i ].left - inst.margins.left;\n\t\t\tr = l + inst.snapElements[ i ].width;\n\t\t\tt = inst.snapElements[ i ].top - inst.margins.top;\n\t\t\tb = t + inst.snapElements[ i ].height;\n\n\t\t\tif ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||\n\t\t\t\t\t!$.contains( inst.snapElements[ i ].item.ownerDocument,\n\t\t\t\t\tinst.snapElements[ i ].item ) ) {\n\t\t\t\tif ( inst.snapElements[ i ].snapping ) {\n\t\t\t\t\tif ( inst.options.snap.release ) {\n\t\t\t\t\t\tinst.options.snap.release.call(\n\t\t\t\t\t\t\tinst.element,\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tinst.snapElements[ i ].snapping = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( o.snapMode !== \"inner\" ) {\n\t\t\t\tts = Math.abs( t - y2 ) <= d;\n\t\t\t\tbs = Math.abs( b - y1 ) <= d;\n\t\t\t\tls = Math.abs( l - x2 ) <= d;\n\t\t\t\trs = Math.abs( r - x1 ) <= d;\n\t\t\t\tif ( ts ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: t - inst.helperProportions.height,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( bs ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: b,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( ls ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: l - inst.helperProportions.width\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: r\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirst = ( ts || bs || ls || rs );\n\n\t\t\tif ( o.snapMode !== \"outer\" ) {\n\t\t\t\tts = Math.abs( t - y1 ) <= d;\n\t\t\t\tbs = Math.abs( b - y2 ) <= d;\n\t\t\t\tls = Math.abs( l - x1 ) <= d;\n\t\t\t\trs = Math.abs( r - x2 ) <= d;\n\t\t\t\tif ( ts ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: t,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( bs ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: b - inst.helperProportions.height,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( ls ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: l\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: r - inst.helperProportions.width\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {\n\t\t\t\tif ( inst.options.snap.snap ) {\n\t\t\t\t\tinst.options.snap.snap.call(\n\t\t\t\t\t\tinst.element,\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\t$.extend( inst._uiHash(), {\n\t\t\t\t\t\t\tsnapItem: inst.snapElements[ i ].item\n\t\t\t\t\t\t} ) );\n\t\t\t\t}\n\t\t\t}\n\t\t\tinst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );\n\n\t\t}\n\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"stack\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar min,\n\t\t\to = instance.options,\n\t\t\tgroup = $.makeArray( $( o.stack ) ).sort( function( a, b ) {\n\t\t\t\treturn ( parseInt( $( a ).css( \"zIndex\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( b ).css( \"zIndex\" ), 10 ) || 0 );\n\t\t\t} );\n\n\t\tif ( !group.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tmin = parseInt( $( group[ 0 ] ).css( \"zIndex\" ), 10 ) || 0;\n\t\t$( group ).each( function( i ) {\n\t\t\t$( this ).css( \"zIndex\", min + i );\n\t\t} );\n\t\tthis.css( \"zIndex\", ( min + group.length ) );\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"zIndex\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\n\t\tif ( t.css( \"zIndex\" ) ) {\n\t\t\to._zIndex = t.css( \"zIndex\" );\n\t\t}\n\t\tt.css( \"zIndex\", o.zIndex );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\n\t\tif ( o._zIndex ) {\n\t\t\t$( ui.helper ).css( \"zIndex\", o._zIndex );\n\t\t}\n\t}\n} );\n\nreturn $.ui.draggable;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/droppable.js",
    "content": "/*!\n * jQuery UI Droppable 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Droppable\n//>>group: Interactions\n//>>description: Enables drop targets for draggable elements.\n//>>docs: http://api.jqueryui.com/droppable/\n//>>demos: http://jqueryui.com/droppable/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./draggable\",\n\t\t\t\"./mouse\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.widget( \"ui.droppable\", {\n\tversion: \"1.13.0\",\n\twidgetEventPrefix: \"drop\",\n\toptions: {\n\t\taccept: \"*\",\n\t\taddClasses: true,\n\t\tgreedy: false,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tdeactivate: null,\n\t\tdrop: null,\n\t\tout: null,\n\t\tover: null\n\t},\n\t_create: function() {\n\n\t\tvar proportions,\n\t\t\to = this.options,\n\t\t\taccept = o.accept;\n\n\t\tthis.isover = false;\n\t\tthis.isout = true;\n\n\t\tthis.accept = typeof accept === \"function\" ? accept : function( d ) {\n\t\t\treturn d.is( accept );\n\t\t};\n\n\t\tthis.proportions = function( /* valueToWrite */ ) {\n\t\t\tif ( arguments.length ) {\n\n\t\t\t\t// Store the droppable's proportions\n\t\t\t\tproportions = arguments[ 0 ];\n\t\t\t} else {\n\n\t\t\t\t// Retrieve or derive the droppable's proportions\n\t\t\t\treturn proportions ?\n\t\t\t\t\tproportions :\n\t\t\t\t\tproportions = {\n\t\t\t\t\t\twidth: this.element[ 0 ].offsetWidth,\n\t\t\t\t\t\theight: this.element[ 0 ].offsetHeight\n\t\t\t\t\t};\n\t\t\t}\n\t\t};\n\n\t\tthis._addToManager( o.scope );\n\n\t\tif ( o.addClasses ) {\n\t\t\tthis._addClass( \"ui-droppable\" );\n\t\t}\n\n\t},\n\n\t_addToManager: function( scope ) {\n\n\t\t// Add the reference and positions to the manager\n\t\t$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];\n\t\t$.ui.ddmanager.droppables[ scope ].push( this );\n\t},\n\n\t_splice: function( drop ) {\n\t\tvar i = 0;\n\t\tfor ( ; i < drop.length; i++ ) {\n\t\t\tif ( drop[ i ] === this ) {\n\t\t\t\tdrop.splice( i, 1 );\n\t\t\t}\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\n\n\t\tthis._splice( drop );\n\t},\n\n\t_setOption: function( key, value ) {\n\n\t\tif ( key === \"accept\" ) {\n\t\t\tthis.accept = typeof value === \"function\" ? value : function( d ) {\n\t\t\t\treturn d.is( value );\n\t\t\t};\n\t\t} else if ( key === \"scope\" ) {\n\t\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\n\n\t\t\tthis._splice( drop );\n\t\t\tthis._addToManager( value );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_activate: function( event ) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\tthis._addActiveClass();\n\t\tif ( draggable ) {\n\t\t\tthis._trigger( \"activate\", event, this.ui( draggable ) );\n\t\t}\n\t},\n\n\t_deactivate: function( event ) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\tthis._removeActiveClass();\n\t\tif ( draggable ) {\n\t\t\tthis._trigger( \"deactivate\", event, this.ui( draggable ) );\n\t\t}\n\t},\n\n\t_over: function( event ) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem ||\n\t\t\t\tdraggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||\n\t\t\t\tdraggable.element ) ) ) {\n\t\t\tthis._addHoverClass();\n\t\t\tthis._trigger( \"over\", event, this.ui( draggable ) );\n\t\t}\n\n\t},\n\n\t_out: function( event ) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem ||\n\t\t\t\tdraggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||\n\t\t\t\tdraggable.element ) ) ) {\n\t\t\tthis._removeHoverClass();\n\t\t\tthis._trigger( \"out\", event, this.ui( draggable ) );\n\t\t}\n\n\t},\n\n\t_drop: function( event, custom ) {\n\n\t\tvar draggable = custom || $.ui.ddmanager.current,\n\t\t\tchildrenIntersection = false;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem ||\n\t\t\t\tdraggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.element\n\t\t\t.find( \":data(ui-droppable)\" )\n\t\t\t.not( \".ui-draggable-dragging\" )\n\t\t\t.each( function() {\n\t\t\t\tvar inst = $( this ).droppable( \"instance\" );\n\t\t\t\tif (\n\t\t\t\t\tinst.options.greedy &&\n\t\t\t\t\t!inst.options.disabled &&\n\t\t\t\t\tinst.options.scope === draggable.options.scope &&\n\t\t\t\t\tinst.accept.call(\n\t\t\t\t\t\tinst.element[ 0 ], ( draggable.currentItem || draggable.element )\n\t\t\t\t\t) &&\n\t\t\t\t\t$.ui.intersect(\n\t\t\t\t\t\tdraggable,\n\t\t\t\t\t\t$.extend( inst, { offset: inst.element.offset() } ),\n\t\t\t\t\t\tinst.options.tolerance, event\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tchildrenIntersection = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\tif ( childrenIntersection ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ],\n\t\t\t\t( draggable.currentItem || draggable.element ) ) ) {\n\t\t\tthis._removeActiveClass();\n\t\t\tthis._removeHoverClass();\n\n\t\t\tthis._trigger( \"drop\", event, this.ui( draggable ) );\n\t\t\treturn this.element;\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tui: function( c ) {\n\t\treturn {\n\t\t\tdraggable: ( c.currentItem || c.element ),\n\t\t\thelper: c.helper,\n\t\t\tposition: c.position,\n\t\t\toffset: c.positionAbs\n\t\t};\n\t},\n\n\t// Extension points just to make backcompat sane and avoid duplicating logic\n\t// TODO: Remove in 1.14 along with call to it below\n\t_addHoverClass: function() {\n\t\tthis._addClass( \"ui-droppable-hover\" );\n\t},\n\n\t_removeHoverClass: function() {\n\t\tthis._removeClass( \"ui-droppable-hover\" );\n\t},\n\n\t_addActiveClass: function() {\n\t\tthis._addClass( \"ui-droppable-active\" );\n\t},\n\n\t_removeActiveClass: function() {\n\t\tthis._removeClass( \"ui-droppable-active\" );\n\t}\n} );\n\n$.ui.intersect = ( function() {\n\tfunction isOverAxis( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t}\n\n\treturn function( draggable, droppable, toleranceMode, event ) {\n\n\t\tif ( !droppable.offset ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar x1 = ( draggable.positionAbs ||\n\t\t\t\tdraggable.position.absolute ).left + draggable.margins.left,\n\t\t\ty1 = ( draggable.positionAbs ||\n\t\t\t\tdraggable.position.absolute ).top + draggable.margins.top,\n\t\t\tx2 = x1 + draggable.helperProportions.width,\n\t\t\ty2 = y1 + draggable.helperProportions.height,\n\t\t\tl = droppable.offset.left,\n\t\t\tt = droppable.offset.top,\n\t\t\tr = l + droppable.proportions().width,\n\t\t\tb = t + droppable.proportions().height;\n\n\t\tswitch ( toleranceMode ) {\n\t\tcase \"fit\":\n\t\t\treturn ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );\n\t\tcase \"intersect\":\n\t\t\treturn ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half\n\t\tcase \"pointer\":\n\t\t\treturn isOverAxis( event.pageY, t, droppable.proportions().height ) &&\n\t\t\t\tisOverAxis( event.pageX, l, droppable.proportions().width );\n\t\tcase \"touch\":\n\t\t\treturn (\n\t\t\t\t( y1 >= t && y1 <= b ) || // Top edge touching\n\t\t\t\t( y2 >= t && y2 <= b ) || // Bottom edge touching\n\t\t\t\t( y1 < t && y2 > b ) // Surrounded vertically\n\t\t\t) && (\n\t\t\t\t( x1 >= l && x1 <= r ) || // Left edge touching\n\t\t\t\t( x2 >= l && x2 <= r ) || // Right edge touching\n\t\t\t\t( x1 < l && x2 > r ) // Surrounded horizontally\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t};\n} )();\n\n/*\n\tThis manager tracks offsets of draggables and droppables\n*/\n$.ui.ddmanager = {\n\tcurrent: null,\n\tdroppables: { \"default\": [] },\n\tprepareOffsets: function( t, event ) {\n\n\t\tvar i, j,\n\t\t\tm = $.ui.ddmanager.droppables[ t.options.scope ] || [],\n\t\t\ttype = event ? event.type : null, // workaround for #2317\n\t\t\tlist = ( t.currentItem || t.element ).find( \":data(ui-droppable)\" ).addBack();\n\n\t\tdroppablesLoop: for ( i = 0; i < m.length; i++ ) {\n\n\t\t\t// No disabled and non-accepted\n\t\t\tif ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],\n\t\t\t\t\t( t.currentItem || t.element ) ) ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Filter out elements in the current dragged item\n\t\t\tfor ( j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === m[ i ].element[ 0 ] ) {\n\t\t\t\t\tm[ i ].proportions().height = 0;\n\t\t\t\t\tcontinue droppablesLoop;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tm[ i ].visible = m[ i ].element.css( \"display\" ) !== \"none\";\n\t\t\tif ( !m[ i ].visible ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Activate the droppable if used directly from draggables\n\t\t\tif ( type === \"mousedown\" ) {\n\t\t\t\tm[ i ]._activate.call( m[ i ], event );\n\t\t\t}\n\n\t\t\tm[ i ].offset = m[ i ].element.offset();\n\t\t\tm[ i ].proportions( {\n\t\t\t\twidth: m[ i ].element[ 0 ].offsetWidth,\n\t\t\t\theight: m[ i ].element[ 0 ].offsetHeight\n\t\t\t} );\n\n\t\t}\n\n\t},\n\tdrop: function( draggable, event ) {\n\n\t\tvar dropped = false;\n\n\t\t// Create a copy of the droppables in case the list changes during the drop (#9116)\n\t\t$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {\n\n\t\t\tif ( !this.options ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.options.disabled && this.visible &&\n\t\t\t\t\t$.ui.intersect( draggable, this, this.options.tolerance, event ) ) {\n\t\t\t\tdropped = this._drop.call( this, event ) || dropped;\n\t\t\t}\n\n\t\t\tif ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],\n\t\t\t\t\t( draggable.currentItem || draggable.element ) ) ) {\n\t\t\t\tthis.isout = true;\n\t\t\t\tthis.isover = false;\n\t\t\t\tthis._deactivate.call( this, event );\n\t\t\t}\n\n\t\t} );\n\t\treturn dropped;\n\n\t},\n\tdragStart: function( draggable, event ) {\n\n\t\t// Listen for scrolling so that if the dragging causes scrolling the position of the\n\t\t// droppables can be recalculated (see #5003)\n\t\tdraggable.element.parentsUntil( \"body\" ).on( \"scroll.droppable\", function() {\n\t\t\tif ( !draggable.options.refreshPositions ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t\t}\n\t\t} );\n\t},\n\tdrag: function( draggable, event ) {\n\n\t\t// If you have a highly dynamic page, you might try this option. It renders positions\n\t\t// every time you move the mouse.\n\t\tif ( draggable.options.refreshPositions ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t}\n\n\t\t// Run through all droppables and check their positions based on specific tolerance options\n\t\t$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {\n\n\t\t\tif ( this.options.disabled || this.greedyChild || !this.visible ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar parentInstance, scope, parent,\n\t\t\t\tintersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),\n\t\t\t\tc = !intersects && this.isover ?\n\t\t\t\t\t\"isout\" :\n\t\t\t\t\t( intersects && !this.isover ? \"isover\" : null );\n\t\t\tif ( !c ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.options.greedy ) {\n\n\t\t\t\t// find droppable parents with same scope\n\t\t\t\tscope = this.options.scope;\n\t\t\t\tparent = this.element.parents( \":data(ui-droppable)\" ).filter( function() {\n\t\t\t\t\treturn $( this ).droppable( \"instance\" ).options.scope === scope;\n\t\t\t\t} );\n\n\t\t\t\tif ( parent.length ) {\n\t\t\t\t\tparentInstance = $( parent[ 0 ] ).droppable( \"instance\" );\n\t\t\t\t\tparentInstance.greedyChild = ( c === \"isover\" );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We just moved into a greedy child\n\t\t\tif ( parentInstance && c === \"isover\" ) {\n\t\t\t\tparentInstance.isover = false;\n\t\t\t\tparentInstance.isout = true;\n\t\t\t\tparentInstance._out.call( parentInstance, event );\n\t\t\t}\n\n\t\t\tthis[ c ] = true;\n\t\t\tthis[ c === \"isout\" ? \"isover\" : \"isout\" ] = false;\n\t\t\tthis[ c === \"isover\" ? \"_over\" : \"_out\" ].call( this, event );\n\n\t\t\t// We just moved out of a greedy child\n\t\t\tif ( parentInstance && c === \"isout\" ) {\n\t\t\t\tparentInstance.isout = false;\n\t\t\t\tparentInstance.isover = true;\n\t\t\t\tparentInstance._over.call( parentInstance, event );\n\t\t\t}\n\t\t} );\n\n\t},\n\tdragStop: function( draggable, event ) {\n\t\tdraggable.element.parentsUntil( \"body\" ).off( \"scroll.droppable\" );\n\n\t\t// Call prepareOffsets one final time since IE does not fire return scroll events when\n\t\t// overflow was caused by drag (see #5003)\n\t\tif ( !draggable.options.refreshPositions ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t}\n\t}\n};\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for activeClass and hoverClass options\n\t$.widget( \"ui.droppable\", $.ui.droppable, {\n\t\toptions: {\n\t\t\thoverClass: false,\n\t\t\tactiveClass: false\n\t\t},\n\t\t_addActiveClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.activeClass ) {\n\t\t\t\tthis.element.addClass( this.options.activeClass );\n\t\t\t}\n\t\t},\n\t\t_removeActiveClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.activeClass ) {\n\t\t\t\tthis.element.removeClass( this.options.activeClass );\n\t\t\t}\n\t\t},\n\t\t_addHoverClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.addClass( this.options.hoverClass );\n\t\t\t}\n\t\t},\n\t\t_removeHoverClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.removeClass( this.options.hoverClass );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nreturn $.ui.droppable;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-blind.js",
    "content": "/*!\n * jQuery UI Effects Blind 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Blind Effect\n//>>group: Effects\n//>>description: Blinds the element.\n//>>docs: http://api.jqueryui.com/blind-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"blind\", \"hide\", function( options, done ) {\n\tvar map = {\n\t\t\tup: [ \"bottom\", \"top\" ],\n\t\t\tvertical: [ \"bottom\", \"top\" ],\n\t\t\tdown: [ \"top\", \"bottom\" ],\n\t\t\tleft: [ \"right\", \"left\" ],\n\t\t\thorizontal: [ \"right\", \"left\" ],\n\t\t\tright: [ \"left\", \"right\" ]\n\t\t},\n\t\telement = $( this ),\n\t\tdirection = options.direction || \"up\",\n\t\tstart = element.cssClip(),\n\t\tanimate = { clip: $.extend( {}, start ) },\n\t\tplaceholder = $.effects.createPlaceholder( element );\n\n\tanimate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ];\n\n\tif ( options.mode === \"show\" ) {\n\t\telement.cssClip( animate.clip );\n\t\tif ( placeholder ) {\n\t\t\tplaceholder.css( $.effects.clipToBox( animate ) );\n\t\t}\n\n\t\tanimate.clip = start;\n\t}\n\n\tif ( placeholder ) {\n\t\tplaceholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing );\n\t}\n\n\telement.animate( animate, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-bounce.js",
    "content": "/*!\n * jQuery UI Effects Bounce 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Bounce Effect\n//>>group: Effects\n//>>description: Bounces an element horizontally or vertically n times.\n//>>docs: http://api.jqueryui.com/bounce-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"bounce\", function( options, done ) {\n\tvar upAnim, downAnim, refValue,\n\t\telement = $( this ),\n\n\t\t// Defaults:\n\t\tmode = options.mode,\n\t\thide = mode === \"hide\",\n\t\tshow = mode === \"show\",\n\t\tdirection = options.direction || \"up\",\n\t\tdistance = options.distance,\n\t\ttimes = options.times || 5,\n\n\t\t// Number of internal animations\n\t\tanims = times * 2 + ( show || hide ? 1 : 0 ),\n\t\tspeed = options.duration / anims,\n\t\teasing = options.easing,\n\n\t\t// Utility:\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ),\n\t\ti = 0,\n\n\t\tqueuelen = element.queue().length;\n\n\t$.effects.createPlaceholder( element );\n\n\trefValue = element.css( ref );\n\n\t// Default distance for the BIGGEST bounce is the outer Distance / 3\n\tif ( !distance ) {\n\t\tdistance = element[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]() / 3;\n\t}\n\n\tif ( show ) {\n\t\tdownAnim = { opacity: 1 };\n\t\tdownAnim[ ref ] = refValue;\n\n\t\t// If we are showing, force opacity 0 and set the initial position\n\t\t// then do the \"first\" animation\n\t\telement\n\t\t\t.css( \"opacity\", 0 )\n\t\t\t.css( ref, motion ? -distance * 2 : distance * 2 )\n\t\t\t.animate( downAnim, speed, easing );\n\t}\n\n\t// Start at the smallest distance if we are hiding\n\tif ( hide ) {\n\t\tdistance = distance / Math.pow( 2, times - 1 );\n\t}\n\n\tdownAnim = {};\n\tdownAnim[ ref ] = refValue;\n\n\t// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here\n\tfor ( ; i < times; i++ ) {\n\t\tupAnim = {};\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\telement\n\t\t\t.animate( upAnim, speed, easing )\n\t\t\t.animate( downAnim, speed, easing );\n\n\t\tdistance = hide ? distance * 2 : distance / 2;\n\t}\n\n\t// Last Bounce when Hiding\n\tif ( hide ) {\n\t\tupAnim = { opacity: 0 };\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\telement.animate( upAnim, speed, easing );\n\t}\n\n\telement.queue( done );\n\n\t$.effects.unshift( element, queuelen, anims + 1 );\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-clip.js",
    "content": "/*!\n * jQuery UI Effects Clip 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Clip Effect\n//>>group: Effects\n//>>description: Clips the element on and off like an old TV.\n//>>docs: http://api.jqueryui.com/clip-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"clip\", \"hide\", function( options, done ) {\n\tvar start,\n\t\tanimate = {},\n\t\telement = $( this ),\n\t\tdirection = options.direction || \"vertical\",\n\t\tboth = direction === \"both\",\n\t\thorizontal = both || direction === \"horizontal\",\n\t\tvertical = both || direction === \"vertical\";\n\n\tstart = element.cssClip();\n\tanimate.clip = {\n\t\ttop: vertical ? ( start.bottom - start.top ) / 2 : start.top,\n\t\tright: horizontal ? ( start.right - start.left ) / 2 : start.right,\n\t\tbottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom,\n\t\tleft: horizontal ? ( start.right - start.left ) / 2 : start.left\n\t};\n\n\t$.effects.createPlaceholder( element );\n\n\tif ( options.mode === \"show\" ) {\n\t\telement.cssClip( animate.clip );\n\t\tanimate.clip = start;\n\t}\n\n\telement.animate( animate, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-drop.js",
    "content": "/*!\n * jQuery UI Effects Drop 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Drop Effect\n//>>group: Effects\n//>>description: Moves an element in one direction and hides it at the same time.\n//>>docs: http://api.jqueryui.com/drop-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"drop\", \"hide\", function( options, done ) {\n\n\tvar distance,\n\t\telement = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\t\tdirection = options.direction || \"left\",\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ) ? \"-=\" : \"+=\",\n\t\toppositeMotion = ( motion === \"+=\" ) ? \"-=\" : \"+=\",\n\t\tanimation = {\n\t\t\topacity: 0\n\t\t};\n\n\t$.effects.createPlaceholder( element );\n\n\tdistance = options.distance ||\n\t\telement[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true ) / 2;\n\n\tanimation[ ref ] = motion + distance;\n\n\tif ( show ) {\n\t\telement.css( animation );\n\n\t\tanimation[ ref ] = oppositeMotion + distance;\n\t\tanimation.opacity = 1;\n\t}\n\n\t// Animate\n\telement.animate( animation, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-explode.js",
    "content": "/*!\n * jQuery UI Effects Explode 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Explode Effect\n//>>group: Effects\n/* eslint-disable max-len */\n//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.\n/* eslint-enable max-len */\n//>>docs: http://api.jqueryui.com/explode-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"explode\", \"hide\", function( options, done ) {\n\n\tvar i, j, left, top, mx, my,\n\t\trows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,\n\t\tcells = rows,\n\t\telement = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\n\t\t// Show and then visibility:hidden the element before calculating offset\n\t\toffset = element.show().css( \"visibility\", \"hidden\" ).offset(),\n\n\t\t// Width and height of a piece\n\t\twidth = Math.ceil( element.outerWidth() / cells ),\n\t\theight = Math.ceil( element.outerHeight() / rows ),\n\t\tpieces = [];\n\n\t// Children animate complete:\n\tfunction childComplete() {\n\t\tpieces.push( this );\n\t\tif ( pieces.length === rows * cells ) {\n\t\t\tanimComplete();\n\t\t}\n\t}\n\n\t// Clone the element for each row and cell.\n\tfor ( i = 0; i < rows; i++ ) { // ===>\n\t\ttop = offset.top + i * height;\n\t\tmy = i - ( rows - 1 ) / 2;\n\n\t\tfor ( j = 0; j < cells; j++ ) { // |||\n\t\t\tleft = offset.left + j * width;\n\t\t\tmx = j - ( cells - 1 ) / 2;\n\n\t\t\t// Create a clone of the now hidden main element that will be absolute positioned\n\t\t\t// within a wrapper div off the -left and -top equal to size of our pieces\n\t\t\telement\n\t\t\t\t.clone()\n\t\t\t\t.appendTo( \"body\" )\n\t\t\t\t.wrap( \"<div></div>\" )\n\t\t\t\t.css( {\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tvisibility: \"visible\",\n\t\t\t\t\tleft: -j * width,\n\t\t\t\t\ttop: -i * height\n\t\t\t\t} )\n\n\t\t\t\t// Select the wrapper - make it overflow: hidden and absolute positioned based on\n\t\t\t\t// where the original was located +left and +top equal to the size of pieces\n\t\t\t\t.parent()\n\t\t\t\t\t.addClass( \"ui-effects-explode\" )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\theight: height,\n\t\t\t\t\t\tleft: left + ( show ? mx * width : 0 ),\n\t\t\t\t\t\ttop: top + ( show ? my * height : 0 ),\n\t\t\t\t\t\topacity: show ? 0 : 1\n\t\t\t\t\t} )\n\t\t\t\t\t.animate( {\n\t\t\t\t\t\tleft: left + ( show ? 0 : mx * width ),\n\t\t\t\t\t\ttop: top + ( show ? 0 : my * height ),\n\t\t\t\t\t\topacity: show ? 1 : 0\n\t\t\t\t\t}, options.duration || 500, options.easing, childComplete );\n\t\t}\n\t}\n\n\tfunction animComplete() {\n\t\telement.css( {\n\t\t\tvisibility: \"visible\"\n\t\t} );\n\t\t$( pieces ).remove();\n\t\tdone();\n\t}\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-fade.js",
    "content": "/*!\n * jQuery UI Effects Fade 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Fade Effect\n//>>group: Effects\n//>>description: Fades the element.\n//>>docs: http://api.jqueryui.com/fade-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"fade\", \"toggle\", function( options, done ) {\n\tvar show = options.mode === \"show\";\n\n\t$( this )\n\t\t.css( \"opacity\", show ? 0 : 1 )\n\t\t.animate( {\n\t\t\topacity: show ? 1 : 0\n\t\t}, {\n\t\t\tqueue: false,\n\t\t\tduration: options.duration,\n\t\t\teasing: options.easing,\n\t\t\tcomplete: done\n\t\t} );\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-fold.js",
    "content": "/*!\n * jQuery UI Effects Fold 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Fold Effect\n//>>group: Effects\n//>>description: Folds an element first horizontally and then vertically.\n//>>docs: http://api.jqueryui.com/fold-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"fold\", \"hide\", function( options, done ) {\n\n\t// Create element\n\tvar element = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tsize = options.size || 15,\n\t\tpercent = /([0-9]+)%/.exec( size ),\n\t\thorizFirst = !!options.horizFirst,\n\t\tref = horizFirst ? [ \"right\", \"bottom\" ] : [ \"bottom\", \"right\" ],\n\t\tduration = options.duration / 2,\n\n\t\tplaceholder = $.effects.createPlaceholder( element ),\n\n\t\tstart = element.cssClip(),\n\t\tanimation1 = { clip: $.extend( {}, start ) },\n\t\tanimation2 = { clip: $.extend( {}, start ) },\n\n\t\tdistance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ],\n\n\t\tqueuelen = element.queue().length;\n\n\tif ( percent ) {\n\t\tsize = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];\n\t}\n\tanimation1.clip[ ref[ 0 ] ] = size;\n\tanimation2.clip[ ref[ 0 ] ] = size;\n\tanimation2.clip[ ref[ 1 ] ] = 0;\n\n\tif ( show ) {\n\t\telement.cssClip( animation2.clip );\n\t\tif ( placeholder ) {\n\t\t\tplaceholder.css( $.effects.clipToBox( animation2 ) );\n\t\t}\n\n\t\tanimation2.clip = start;\n\t}\n\n\t// Animate\n\telement\n\t\t.queue( function( next ) {\n\t\t\tif ( placeholder ) {\n\t\t\t\tplaceholder\n\t\t\t\t\t.animate( $.effects.clipToBox( animation1 ), duration, options.easing )\n\t\t\t\t\t.animate( $.effects.clipToBox( animation2 ), duration, options.easing );\n\t\t\t}\n\n\t\t\tnext();\n\t\t} )\n\t\t.animate( animation1, duration, options.easing )\n\t\t.animate( animation2, duration, options.easing )\n\t\t.queue( done );\n\n\t$.effects.unshift( element, queuelen, 4 );\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-highlight.js",
    "content": "/*!\n * jQuery UI Effects Highlight 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Highlight Effect\n//>>group: Effects\n//>>description: Highlights the background of an element in a defined color for a custom duration.\n//>>docs: http://api.jqueryui.com/highlight-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"highlight\", \"show\", function( options, done ) {\n\tvar element = $( this ),\n\t\tanimation = {\n\t\t\tbackgroundColor: element.css( \"backgroundColor\" )\n\t\t};\n\n\tif ( options.mode === \"hide\" ) {\n\t\tanimation.opacity = 0;\n\t}\n\n\t$.effects.saveStyle( element );\n\n\telement\n\t\t.css( {\n\t\t\tbackgroundImage: \"none\",\n\t\t\tbackgroundColor: options.color || \"#ffff99\"\n\t\t} )\n\t\t.animate( animation, {\n\t\t\tqueue: false,\n\t\t\tduration: options.duration,\n\t\t\teasing: options.easing,\n\t\t\tcomplete: done\n\t\t} );\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-puff.js",
    "content": "/*!\n * jQuery UI Effects Puff 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Puff Effect\n//>>group: Effects\n//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.\n//>>docs: http://api.jqueryui.com/puff-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\",\n\t\t\t\"./effect-scale\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"puff\", \"hide\", function( options, done ) {\n\tvar newOptions = $.extend( true, {}, options, {\n\t\tfade: true,\n\t\tpercent: parseInt( options.percent, 10 ) || 150\n\t} );\n\n\t$.effects.effect.scale.call( this, newOptions, done );\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-pulsate.js",
    "content": "/*!\n * jQuery UI Effects Pulsate 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Pulsate Effect\n//>>group: Effects\n//>>description: Pulsates an element n times by changing the opacity to zero and back.\n//>>docs: http://api.jqueryui.com/pulsate-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"pulsate\", \"show\", function( options, done ) {\n\tvar element = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tshowhide = show || hide,\n\n\t\t// Showing or hiding leaves off the \"last\" animation\n\t\tanims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),\n\t\tduration = options.duration / anims,\n\t\tanimateTo = 0,\n\t\ti = 1,\n\t\tqueuelen = element.queue().length;\n\n\tif ( show || !element.is( \":visible\" ) ) {\n\t\telement.css( \"opacity\", 0 ).show();\n\t\tanimateTo = 1;\n\t}\n\n\t// Anims - 1 opacity \"toggles\"\n\tfor ( ; i < anims; i++ ) {\n\t\telement.animate( { opacity: animateTo }, duration, options.easing );\n\t\tanimateTo = 1 - animateTo;\n\t}\n\n\telement.animate( { opacity: animateTo }, duration, options.easing );\n\n\telement.queue( done );\n\n\t$.effects.unshift( element, queuelen, anims + 1 );\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-scale.js",
    "content": "/*!\n * jQuery UI Effects Scale 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Scale Effect\n//>>group: Effects\n//>>description: Grows or shrinks an element and its content.\n//>>docs: http://api.jqueryui.com/scale-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\",\n\t\t\t\"./effect-size\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"scale\", function( options, done ) {\n\n\t// Create element\n\tvar el = $( this ),\n\t\tmode = options.mode,\n\t\tpercent = parseInt( options.percent, 10 ) ||\n\t\t\t( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== \"effect\" ? 0 : 100 ) ),\n\n\t\tnewOptions = $.extend( true, {\n\t\t\tfrom: $.effects.scaledDimensions( el ),\n\t\t\tto: $.effects.scaledDimensions( el, percent, options.direction || \"both\" ),\n\t\t\torigin: options.origin || [ \"middle\", \"center\" ]\n\t\t}, options );\n\n\t// Fade option to support puff\n\tif ( options.fade ) {\n\t\tnewOptions.from.opacity = 1;\n\t\tnewOptions.to.opacity = 0;\n\t}\n\n\t$.effects.effect.size.call( this, newOptions, done );\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-shake.js",
    "content": "/*!\n * jQuery UI Effects Shake 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Shake Effect\n//>>group: Effects\n//>>description: Shakes an element horizontally or vertically n times.\n//>>docs: http://api.jqueryui.com/shake-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"shake\", function( options, done ) {\n\n\tvar i = 1,\n\t\telement = $( this ),\n\t\tdirection = options.direction || \"left\",\n\t\tdistance = options.distance || 20,\n\t\ttimes = options.times || 3,\n\t\tanims = times * 2 + 1,\n\t\tspeed = Math.round( options.duration / anims ),\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tpositiveMotion = ( direction === \"up\" || direction === \"left\" ),\n\t\tanimation = {},\n\t\tanimation1 = {},\n\t\tanimation2 = {},\n\n\t\tqueuelen = element.queue().length;\n\n\t$.effects.createPlaceholder( element );\n\n\t// Animation\n\tanimation[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance;\n\tanimation1[ ref ] = ( positiveMotion ? \"+=\" : \"-=\" ) + distance * 2;\n\tanimation2[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance * 2;\n\n\t// Animate\n\telement.animate( animation, speed, options.easing );\n\n\t// Shakes\n\tfor ( ; i < times; i++ ) {\n\t\telement\n\t\t\t.animate( animation1, speed, options.easing )\n\t\t\t.animate( animation2, speed, options.easing );\n\t}\n\n\telement\n\t\t.animate( animation1, speed, options.easing )\n\t\t.animate( animation, speed / 2, options.easing )\n\t\t.queue( done );\n\n\t$.effects.unshift( element, queuelen, anims + 1 );\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-size.js",
    "content": "/*!\n * jQuery UI Effects Size 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Size Effect\n//>>group: Effects\n//>>description: Resize an element to a specified width and height.\n//>>docs: http://api.jqueryui.com/size-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"size\", function( options, done ) {\n\n\t// Create element\n\tvar baseline, factor, temp,\n\t\telement = $( this ),\n\n\t\t// Copy for children\n\t\tcProps = [ \"fontSize\" ],\n\t\tvProps = [ \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\" ],\n\t\thProps = [ \"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\" ],\n\n\t\t// Set options\n\t\tmode = options.mode,\n\t\trestore = mode !== \"effect\",\n\t\tscale = options.scale || \"both\",\n\t\torigin = options.origin || [ \"middle\", \"center\" ],\n\t\tposition = element.css( \"position\" ),\n\t\tpos = element.position(),\n\t\toriginal = $.effects.scaledDimensions( element ),\n\t\tfrom = options.from || original,\n\t\tto = options.to || $.effects.scaledDimensions( element, 0 );\n\n\t$.effects.createPlaceholder( element );\n\n\tif ( mode === \"show\" ) {\n\t\ttemp = from;\n\t\tfrom = to;\n\t\tto = temp;\n\t}\n\n\t// Set scaling factor\n\tfactor = {\n\t\tfrom: {\n\t\t\ty: from.height / original.height,\n\t\t\tx: from.width / original.width\n\t\t},\n\t\tto: {\n\t\t\ty: to.height / original.height,\n\t\t\tx: to.width / original.width\n\t\t}\n\t};\n\n\t// Scale the css box\n\tif ( scale === \"box\" || scale === \"both\" ) {\n\n\t\t// Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tfrom = $.effects.setTransition( element, vProps, factor.from.y, from );\n\t\t\tto = $.effects.setTransition( element, vProps, factor.to.y, to );\n\t\t}\n\n\t\t// Horizontal props scaling\n\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\tfrom = $.effects.setTransition( element, hProps, factor.from.x, from );\n\t\t\tto = $.effects.setTransition( element, hProps, factor.to.x, to );\n\t\t}\n\t}\n\n\t// Scale the content\n\tif ( scale === \"content\" || scale === \"both\" ) {\n\n\t\t// Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tfrom = $.effects.setTransition( element, cProps, factor.from.y, from );\n\t\t\tto = $.effects.setTransition( element, cProps, factor.to.y, to );\n\t\t}\n\t}\n\n\t// Adjust the position properties based on the provided origin points\n\tif ( origin ) {\n\t\tbaseline = $.effects.getBaseline( origin, original );\n\t\tfrom.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top;\n\t\tfrom.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left;\n\t\tto.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top;\n\t\tto.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left;\n\t}\n\tdelete from.outerHeight;\n\tdelete from.outerWidth;\n\telement.css( from );\n\n\t// Animate the children if desired\n\tif ( scale === \"content\" || scale === \"both\" ) {\n\n\t\tvProps = vProps.concat( [ \"marginTop\", \"marginBottom\" ] ).concat( cProps );\n\t\thProps = hProps.concat( [ \"marginLeft\", \"marginRight\" ] );\n\n\t\t// Only animate children with width attributes specified\n\t\t// TODO: is this right? should we include anything with css width specified as well\n\t\telement.find( \"*[width]\" ).each( function() {\n\t\t\tvar child = $( this ),\n\t\t\t\tchildOriginal = $.effects.scaledDimensions( child ),\n\t\t\t\tchildFrom = {\n\t\t\t\t\theight: childOriginal.height * factor.from.y,\n\t\t\t\t\twidth: childOriginal.width * factor.from.x,\n\t\t\t\t\touterHeight: childOriginal.outerHeight * factor.from.y,\n\t\t\t\t\touterWidth: childOriginal.outerWidth * factor.from.x\n\t\t\t\t},\n\t\t\t\tchildTo = {\n\t\t\t\t\theight: childOriginal.height * factor.to.y,\n\t\t\t\t\twidth: childOriginal.width * factor.to.x,\n\t\t\t\t\touterHeight: childOriginal.height * factor.to.y,\n\t\t\t\t\touterWidth: childOriginal.width * factor.to.x\n\t\t\t\t};\n\n\t\t\t// Vertical props scaling\n\t\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\t\tchildFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom );\n\t\t\t\tchildTo = $.effects.setTransition( child, vProps, factor.to.y, childTo );\n\t\t\t}\n\n\t\t\t// Horizontal props scaling\n\t\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\t\tchildFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom );\n\t\t\t\tchildTo = $.effects.setTransition( child, hProps, factor.to.x, childTo );\n\t\t\t}\n\n\t\t\tif ( restore ) {\n\t\t\t\t$.effects.saveStyle( child );\n\t\t\t}\n\n\t\t\t// Animate children\n\t\t\tchild.css( childFrom );\n\t\t\tchild.animate( childTo, options.duration, options.easing, function() {\n\n\t\t\t\t// Restore children\n\t\t\t\tif ( restore ) {\n\t\t\t\t\t$.effects.restoreStyle( child );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Animate\n\telement.animate( to, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: function() {\n\n\t\t\tvar offset = element.offset();\n\n\t\t\tif ( to.opacity === 0 ) {\n\t\t\t\telement.css( \"opacity\", from.opacity );\n\t\t\t}\n\n\t\t\tif ( !restore ) {\n\t\t\t\telement\n\t\t\t\t\t.css( \"position\", position === \"static\" ? \"relative\" : position )\n\t\t\t\t\t.offset( offset );\n\n\t\t\t\t// Need to save style here so that automatic style restoration\n\t\t\t\t// doesn't restore to the original styles from before the animation.\n\t\t\t\t$.effects.saveStyle( element );\n\t\t\t}\n\n\t\t\tdone();\n\t\t}\n\t} );\n\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-slide.js",
    "content": "/*!\n * jQuery UI Effects Slide 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Slide Effect\n//>>group: Effects\n//>>description: Slides an element in and out of the viewport.\n//>>docs: http://api.jqueryui.com/slide-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.effects.define( \"slide\", \"show\", function( options, done ) {\n\tvar startClip, startRef,\n\t\telement = $( this ),\n\t\tmap = {\n\t\t\tup: [ \"bottom\", \"top\" ],\n\t\t\tdown: [ \"top\", \"bottom\" ],\n\t\t\tleft: [ \"right\", \"left\" ],\n\t\t\tright: [ \"left\", \"right\" ]\n\t\t},\n\t\tmode = options.mode,\n\t\tdirection = options.direction || \"left\",\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tpositiveMotion = ( direction === \"up\" || direction === \"left\" ),\n\t\tdistance = options.distance ||\n\t\t\telement[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true ),\n\t\tanimation = {};\n\n\t$.effects.createPlaceholder( element );\n\n\tstartClip = element.cssClip();\n\tstartRef = element.position()[ ref ];\n\n\t// Define hide animation\n\tanimation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef;\n\tanimation.clip = element.cssClip();\n\tanimation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ];\n\n\t// Reverse the animation if we're showing\n\tif ( mode === \"show\" ) {\n\t\telement.cssClip( animation.clip );\n\t\telement.css( ref, animation[ ref ] );\n\t\tanimation.clip = startClip;\n\t\tanimation[ ref ] = startRef;\n\t}\n\n\t// Actually animate\n\telement.animate( animation, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect-transfer.js",
    "content": "/*!\n * jQuery UI Effects Transfer 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Transfer Effect\n//>>group: Effects\n//>>description: Displays a transfer effect from one element to another.\n//>>docs: http://api.jqueryui.com/transfer-effect/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./effect\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nvar effect;\nif ( $.uiBackCompat !== false ) {\n\teffect = $.effects.define( \"transfer\", function( options, done ) {\n\t\t$( this ).transfer( options, done );\n\t} );\n}\nreturn effect;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/effect.js",
    "content": "/*!\n * jQuery UI Effects 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Effects Core\n//>>group: Effects\n/* eslint-disable max-len */\n//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.\n/* eslint-enable max-len */\n//>>docs: http://api.jqueryui.com/category/effects-core/\n//>>demos: http://jqueryui.com/effect/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n// Include version.js\n$.ui = $.ui || {};\n$.ui.version = \"1.13.0\";\n\n// Source: jquery-var-for-color.js\n// Create a local jQuery because jQuery Color relies on it and the\n// global may not exist with AMD and a custom build (#10199).\n// This module is a noop if used as a regular AMD module.\n// eslint-disable-next-line no-unused-vars\nvar jQuery = $;\n\n\n/*!\n * jQuery Color Animations v2.2.0\n * https://github.com/jquery/jquery-color\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * Date: Sun May 10 09:02:36 2020 +0200\n */\n\n\tvar stepHooks = \"backgroundColor borderBottomColor borderLeftColor borderRightColor \" +\n\t\t\"borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\",\n\n\tclass2type = {},\n\ttoString = class2type.toString,\n\n\t// plusequals test for += 100 -= 100\n\trplusequals = /^([\\-+])=\\s*(\\d+\\.?\\d*)/,\n\n\t// a set of RE's that can match strings and generate color tuples.\n\tstringParsers = [ {\n\t\t\tre: /rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ],\n\t\t\t\t\texecResult[ 3 ],\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ] * 2.55,\n\t\t\t\t\texecResult[ 2 ] * 2.55,\n\t\t\t\t\texecResult[ 3 ] * 2.55,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\n\t\t\t// this regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ], 16 ),\n\t\t\t\t\texecResult[ 4 ] ?\n\t\t\t\t\t\t( parseInt( execResult[ 4 ], 16 ) / 255 ).toFixed( 2 ) :\n\t\t\t\t\t\t1\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\n\t\t\t// this regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ] + execResult[ 3 ], 16 ),\n\t\t\t\t\texecResult[ 4 ] ?\n\t\t\t\t\t\t( parseInt( execResult[ 4 ] + execResult[ 4 ], 16 ) / 255 )\n\t\t\t\t\t\t\t.toFixed( 2 ) :\n\t\t\t\t\t\t1\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tspace: \"hsla\",\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ] / 100,\n\t\t\t\t\texecResult[ 3 ] / 100,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t} ],\n\n\t// jQuery.Color( )\n\tcolor = jQuery.Color = function( color, green, blue, alpha ) {\n\t\treturn new jQuery.Color.fn.parse( color, green, blue, alpha );\n\t},\n\tspaces = {\n\t\trgba: {\n\t\t\tprops: {\n\t\t\t\tred: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tgreen: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tblue: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\thsla: {\n\t\t\tprops: {\n\t\t\t\thue: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"degrees\"\n\t\t\t\t},\n\t\t\t\tsaturation: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t},\n\t\t\t\tlightness: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tpropTypes = {\n\t\t\"byte\": {\n\t\t\tfloor: true,\n\t\t\tmax: 255\n\t\t},\n\t\t\"percent\": {\n\t\t\tmax: 1\n\t\t},\n\t\t\"degrees\": {\n\t\t\tmod: 360,\n\t\t\tfloor: true\n\t\t}\n\t},\n\tsupport = color.support = {},\n\n\t// element for support tests\n\tsupportElem = jQuery( \"<p>\" )[ 0 ],\n\n\t// colors = jQuery.Color.names\n\tcolors,\n\n\t// local aliases of functions called often\n\teach = jQuery.each;\n\n// determine rgba support immediately\nsupportElem.style.cssText = \"background-color:rgba(1,1,1,.5)\";\nsupport.rgba = supportElem.style.backgroundColor.indexOf( \"rgba\" ) > -1;\n\n// define cache name and alpha properties\n// for rgba and hsla spaces\neach( spaces, function( spaceName, space ) {\n\tspace.cache = \"_\" + spaceName;\n\tspace.props.alpha = {\n\t\tidx: 3,\n\t\ttype: \"percent\",\n\t\tdef: 1\n\t};\n} );\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction getType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\treturn typeof obj === \"object\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n\nfunction clamp( value, prop, allowEmpty ) {\n\tvar type = propTypes[ prop.type ] || {};\n\n\tif ( value == null ) {\n\t\treturn ( allowEmpty || !prop.def ) ? null : prop.def;\n\t}\n\n\t// ~~ is an short way of doing floor for positive numbers\n\tvalue = type.floor ? ~~value : parseFloat( value );\n\n\t// IE will pass in empty strings as value for alpha,\n\t// which will hit this case\n\tif ( isNaN( value ) ) {\n\t\treturn prop.def;\n\t}\n\n\tif ( type.mod ) {\n\n\t\t// we add mod before modding to make sure that negatives values\n\t\t// get converted properly: -10 -> 350\n\t\treturn ( value + type.mod ) % type.mod;\n\t}\n\n\t// for now all property types without mod have min and max\n\treturn Math.min( type.max, Math.max( 0, value ) );\n}\n\nfunction stringParse( string ) {\n\tvar inst = color(),\n\t\trgba = inst._rgba = [];\n\n\tstring = string.toLowerCase();\n\n\teach( stringParsers, function( _i, parser ) {\n\t\tvar parsed,\n\t\t\tmatch = parser.re.exec( string ),\n\t\t\tvalues = match && parser.parse( match ),\n\t\t\tspaceName = parser.space || \"rgba\";\n\n\t\tif ( values ) {\n\t\t\tparsed = inst[ spaceName ]( values );\n\n\t\t\t// if this was an rgba parse the assignment might happen twice\n\t\t\t// oh well....\n\t\t\tinst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];\n\t\t\trgba = inst._rgba = parsed._rgba;\n\n\t\t\t// exit each( stringParsers ) here because we matched\n\t\t\treturn false;\n\t\t}\n\t} );\n\n\t// Found a stringParser that handled it\n\tif ( rgba.length ) {\n\n\t\t// if this came from a parsed string, force \"transparent\" when alpha is 0\n\t\t// chrome, (and maybe others) return \"transparent\" as rgba(0,0,0,0)\n\t\tif ( rgba.join() === \"0,0,0,0\" ) {\n\t\t\tjQuery.extend( rgba, colors.transparent );\n\t\t}\n\t\treturn inst;\n\t}\n\n\t// named colors\n\treturn colors[ string ];\n}\n\ncolor.fn = jQuery.extend( color.prototype, {\n\tparse: function( red, green, blue, alpha ) {\n\t\tif ( red === undefined ) {\n\t\t\tthis._rgba = [ null, null, null, null ];\n\t\t\treturn this;\n\t\t}\n\t\tif ( red.jquery || red.nodeType ) {\n\t\t\tred = jQuery( red ).css( green );\n\t\t\tgreen = undefined;\n\t\t}\n\n\t\tvar inst = this,\n\t\t\ttype = getType( red ),\n\t\t\trgba = this._rgba = [];\n\n\t\t// more than 1 argument specified - assume ( red, green, blue, alpha )\n\t\tif ( green !== undefined ) {\n\t\t\tred = [ red, green, blue, alpha ];\n\t\t\ttype = \"array\";\n\t\t}\n\n\t\tif ( type === \"string\" ) {\n\t\t\treturn this.parse( stringParse( red ) || colors._default );\n\t\t}\n\n\t\tif ( type === \"array\" ) {\n\t\t\teach( spaces.rgba.props, function( _key, prop ) {\n\t\t\t\trgba[ prop.idx ] = clamp( red[ prop.idx ], prop );\n\t\t\t} );\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( type === \"object\" ) {\n\t\t\tif ( red instanceof color ) {\n\t\t\t\teach( spaces, function( _spaceName, space ) {\n\t\t\t\t\tif ( red[ space.cache ] ) {\n\t\t\t\t\t\tinst[ space.cache ] = red[ space.cache ].slice();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\teach( spaces, function( _spaceName, space ) {\n\t\t\t\t\tvar cache = space.cache;\n\t\t\t\t\teach( space.props, function( key, prop ) {\n\n\t\t\t\t\t\t// if the cache doesn't exist, and we know how to convert\n\t\t\t\t\t\tif ( !inst[ cache ] && space.to ) {\n\n\t\t\t\t\t\t\t// if the value was null, we don't need to copy it\n\t\t\t\t\t\t\t// if the key was alpha, we don't need to copy it either\n\t\t\t\t\t\t\tif ( key === \"alpha\" || red[ key ] == null ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tinst[ cache ] = space.to( inst._rgba );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// this is the only case where we allow nulls for ALL properties.\n\t\t\t\t\t\t// call clamp with alwaysAllowEmpty\n\t\t\t\t\t\tinst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );\n\t\t\t\t\t} );\n\n\t\t\t\t\t// everything defined but alpha?\n\t\t\t\t\tif ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {\n\n\t\t\t\t\t\t// use the default of 1\n\t\t\t\t\t\tif ( inst[ cache ][ 3 ] == null ) {\n\t\t\t\t\t\t\tinst[ cache ][ 3 ] = 1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( space.from ) {\n\t\t\t\t\t\t\tinst._rgba = space.from( inst[ cache ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t},\n\tis: function( compare ) {\n\t\tvar is = color( compare ),\n\t\t\tsame = true,\n\t\t\tinst = this;\n\n\t\teach( spaces, function( _, space ) {\n\t\t\tvar localCache,\n\t\t\t\tisCache = is[ space.cache ];\n\t\t\tif ( isCache ) {\n\t\t\t\tlocalCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];\n\t\t\t\teach( space.props, function( _, prop ) {\n\t\t\t\t\tif ( isCache[ prop.idx ] != null ) {\n\t\t\t\t\t\tsame = ( isCache[ prop.idx ] === localCache[ prop.idx ] );\n\t\t\t\t\t\treturn same;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn same;\n\t\t} );\n\t\treturn same;\n\t},\n\t_space: function() {\n\t\tvar used = [],\n\t\t\tinst = this;\n\t\teach( spaces, function( spaceName, space ) {\n\t\t\tif ( inst[ space.cache ] ) {\n\t\t\t\tused.push( spaceName );\n\t\t\t}\n\t\t} );\n\t\treturn used.pop();\n\t},\n\ttransition: function( other, distance ) {\n\t\tvar end = color( other ),\n\t\t\tspaceName = end._space(),\n\t\t\tspace = spaces[ spaceName ],\n\t\t\tstartColor = this.alpha() === 0 ? color( \"transparent\" ) : this,\n\t\t\tstart = startColor[ space.cache ] || space.to( startColor._rgba ),\n\t\t\tresult = start.slice();\n\n\t\tend = end[ space.cache ];\n\t\teach( space.props, function( _key, prop ) {\n\t\t\tvar index = prop.idx,\n\t\t\t\tstartValue = start[ index ],\n\t\t\t\tendValue = end[ index ],\n\t\t\t\ttype = propTypes[ prop.type ] || {};\n\n\t\t\t// if null, don't override start value\n\t\t\tif ( endValue === null ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// if null - use end\n\t\t\tif ( startValue === null ) {\n\t\t\t\tresult[ index ] = endValue;\n\t\t\t} else {\n\t\t\t\tif ( type.mod ) {\n\t\t\t\t\tif ( endValue - startValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue += type.mod;\n\t\t\t\t\t} else if ( startValue - endValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue -= type.mod;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );\n\t\t\t}\n\t\t} );\n\t\treturn this[ spaceName ]( result );\n\t},\n\tblend: function( opaque ) {\n\n\t\t// if we are already opaque - return ourself\n\t\tif ( this._rgba[ 3 ] === 1 ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar rgb = this._rgba.slice(),\n\t\t\ta = rgb.pop(),\n\t\t\tblend = color( opaque )._rgba;\n\n\t\treturn color( jQuery.map( rgb, function( v, i ) {\n\t\t\treturn ( 1 - a ) * blend[ i ] + a * v;\n\t\t} ) );\n\t},\n\ttoRgbaString: function() {\n\t\tvar prefix = \"rgba(\",\n\t\t\trgba = jQuery.map( this._rgba, function( v, i ) {\n\t\t\t\tif ( v != null ) {\n\t\t\t\t\treturn v;\n\t\t\t\t}\n\t\t\t\treturn i > 2 ? 1 : 0;\n\t\t\t} );\n\n\t\tif ( rgba[ 3 ] === 1 ) {\n\t\t\trgba.pop();\n\t\t\tprefix = \"rgb(\";\n\t\t}\n\n\t\treturn prefix + rgba.join() + \")\";\n\t},\n\ttoHslaString: function() {\n\t\tvar prefix = \"hsla(\",\n\t\t\thsla = jQuery.map( this.hsla(), function( v, i ) {\n\t\t\t\tif ( v == null ) {\n\t\t\t\t\tv = i > 2 ? 1 : 0;\n\t\t\t\t}\n\n\t\t\t\t// catch 1 and 2\n\t\t\t\tif ( i && i < 3 ) {\n\t\t\t\t\tv = Math.round( v * 100 ) + \"%\";\n\t\t\t\t}\n\t\t\t\treturn v;\n\t\t\t} );\n\n\t\tif ( hsla[ 3 ] === 1 ) {\n\t\t\thsla.pop();\n\t\t\tprefix = \"hsl(\";\n\t\t}\n\t\treturn prefix + hsla.join() + \")\";\n\t},\n\ttoHexString: function( includeAlpha ) {\n\t\tvar rgba = this._rgba.slice(),\n\t\t\talpha = rgba.pop();\n\n\t\tif ( includeAlpha ) {\n\t\t\trgba.push( ~~( alpha * 255 ) );\n\t\t}\n\n\t\treturn \"#\" + jQuery.map( rgba, function( v ) {\n\n\t\t\t// default to 0 when nulls exist\n\t\t\tv = ( v || 0 ).toString( 16 );\n\t\t\treturn v.length === 1 ? \"0\" + v : v;\n\t\t} ).join( \"\" );\n\t},\n\ttoString: function() {\n\t\treturn this._rgba[ 3 ] === 0 ? \"transparent\" : this.toRgbaString();\n\t}\n} );\ncolor.fn.parse.prototype = color.fn;\n\n// hsla conversions adapted from:\n// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021\n\nfunction hue2rgb( p, q, h ) {\n\th = ( h + 1 ) % 1;\n\tif ( h * 6 < 1 ) {\n\t\treturn p + ( q - p ) * h * 6;\n\t}\n\tif ( h * 2 < 1 ) {\n\t\treturn q;\n\t}\n\tif ( h * 3 < 2 ) {\n\t\treturn p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;\n\t}\n\treturn p;\n}\n\nspaces.hsla.to = function( rgba ) {\n\tif ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {\n\t\treturn [ null, null, null, rgba[ 3 ] ];\n\t}\n\tvar r = rgba[ 0 ] / 255,\n\t\tg = rgba[ 1 ] / 255,\n\t\tb = rgba[ 2 ] / 255,\n\t\ta = rgba[ 3 ],\n\t\tmax = Math.max( r, g, b ),\n\t\tmin = Math.min( r, g, b ),\n\t\tdiff = max - min,\n\t\tadd = max + min,\n\t\tl = add * 0.5,\n\t\th, s;\n\n\tif ( min === max ) {\n\t\th = 0;\n\t} else if ( r === max ) {\n\t\th = ( 60 * ( g - b ) / diff ) + 360;\n\t} else if ( g === max ) {\n\t\th = ( 60 * ( b - r ) / diff ) + 120;\n\t} else {\n\t\th = ( 60 * ( r - g ) / diff ) + 240;\n\t}\n\n\t// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%\n\t// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)\n\tif ( diff === 0 ) {\n\t\ts = 0;\n\t} else if ( l <= 0.5 ) {\n\t\ts = diff / add;\n\t} else {\n\t\ts = diff / ( 2 - add );\n\t}\n\treturn [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];\n};\n\nspaces.hsla.from = function( hsla ) {\n\tif ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {\n\t\treturn [ null, null, null, hsla[ 3 ] ];\n\t}\n\tvar h = hsla[ 0 ] / 360,\n\t\ts = hsla[ 1 ],\n\t\tl = hsla[ 2 ],\n\t\ta = hsla[ 3 ],\n\t\tq = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,\n\t\tp = 2 * l - q;\n\n\treturn [\n\t\tMath.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),\n\t\ta\n\t];\n};\n\n\neach( spaces, function( spaceName, space ) {\n\tvar props = space.props,\n\t\tcache = space.cache,\n\t\tto = space.to,\n\t\tfrom = space.from;\n\n\t// makes rgba() and hsla()\n\tcolor.fn[ spaceName ] = function( value ) {\n\n\t\t// generate a cache for this space if it doesn't exist\n\t\tif ( to && !this[ cache ] ) {\n\t\t\tthis[ cache ] = to( this._rgba );\n\t\t}\n\t\tif ( value === undefined ) {\n\t\t\treturn this[ cache ].slice();\n\t\t}\n\n\t\tvar ret,\n\t\t\ttype = getType( value ),\n\t\t\tarr = ( type === \"array\" || type === \"object\" ) ? value : arguments,\n\t\t\tlocal = this[ cache ].slice();\n\n\t\teach( props, function( key, prop ) {\n\t\t\tvar val = arr[ type === \"object\" ? key : prop.idx ];\n\t\t\tif ( val == null ) {\n\t\t\t\tval = local[ prop.idx ];\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = clamp( val, prop );\n\t\t} );\n\n\t\tif ( from ) {\n\t\t\tret = color( from( local ) );\n\t\t\tret[ cache ] = local;\n\t\t\treturn ret;\n\t\t} else {\n\t\t\treturn color( local );\n\t\t}\n\t};\n\n\t// makes red() green() blue() alpha() hue() saturation() lightness()\n\teach( props, function( key, prop ) {\n\n\t\t// alpha is included in more than one space\n\t\tif ( color.fn[ key ] ) {\n\t\t\treturn;\n\t\t}\n\t\tcolor.fn[ key ] = function( value ) {\n\t\t\tvar local, cur, match, fn,\n\t\t\t\tvtype = getType( value );\n\n\t\t\tif ( key === \"alpha\" ) {\n\t\t\t\tfn = this._hsla ? \"hsla\" : \"rgba\";\n\t\t\t} else {\n\t\t\t\tfn = spaceName;\n\t\t\t}\n\t\t\tlocal = this[ fn ]();\n\t\t\tcur = local[ prop.idx ];\n\n\t\t\tif ( vtype === \"undefined\" ) {\n\t\t\t\treturn cur;\n\t\t\t}\n\n\t\t\tif ( vtype === \"function\" ) {\n\t\t\t\tvalue = value.call( this, cur );\n\t\t\t\tvtype = getType( value );\n\t\t\t}\n\t\t\tif ( value == null && prop.empty ) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif ( vtype === \"string\" ) {\n\t\t\t\tmatch = rplusequals.exec( value );\n\t\t\t\tif ( match ) {\n\t\t\t\t\tvalue = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === \"+\" ? 1 : -1 );\n\t\t\t\t}\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = value;\n\t\t\treturn this[ fn ]( local );\n\t\t};\n\t} );\n} );\n\n// add cssHook and .fx.step function for each named hook.\n// accept a space separated string of properties\ncolor.hook = function( hook ) {\n\tvar hooks = hook.split( \" \" );\n\teach( hooks, function( _i, hook ) {\n\t\tjQuery.cssHooks[ hook ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar parsed, curElem,\n\t\t\t\t\tbackgroundColor = \"\";\n\n\t\t\t\tif ( value !== \"transparent\" && ( getType( value ) !== \"string\" || ( parsed = stringParse( value ) ) ) ) {\n\t\t\t\t\tvalue = color( parsed || value );\n\t\t\t\t\tif ( !support.rgba && value._rgba[ 3 ] !== 1 ) {\n\t\t\t\t\t\tcurElem = hook === \"backgroundColor\" ? elem.parentNode : elem;\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\t( backgroundColor === \"\" || backgroundColor === \"transparent\" ) &&\n\t\t\t\t\t\t\tcurElem && curElem.style\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tbackgroundColor = jQuery.css( curElem, \"backgroundColor\" );\n\t\t\t\t\t\t\t\tcurElem = curElem.parentNode;\n\t\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalue = value.blend( backgroundColor && backgroundColor !== \"transparent\" ?\n\t\t\t\t\t\t\tbackgroundColor :\n\t\t\t\t\t\t\t\"_default\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = value.toRgbaString();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\telem.style[ hook ] = value;\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// wrapped to prevent IE from throwing errors on \"invalid\" values like 'auto' or 'inherit'\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tjQuery.fx.step[ hook ] = function( fx ) {\n\t\t\tif ( !fx.colorInit ) {\n\t\t\t\tfx.start = color( fx.elem, hook );\n\t\t\t\tfx.end = color( fx.end );\n\t\t\t\tfx.colorInit = true;\n\t\t\t}\n\t\t\tjQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );\n\t\t};\n\t} );\n\n};\n\ncolor.hook( stepHooks );\n\njQuery.cssHooks.borderColor = {\n\texpand: function( value ) {\n\t\tvar expanded = {};\n\n\t\teach( [ \"Top\", \"Right\", \"Bottom\", \"Left\" ], function( _i, part ) {\n\t\t\texpanded[ \"border\" + part + \"Color\" ] = value;\n\t\t} );\n\t\treturn expanded;\n\t}\n};\n\n// Basic color names only.\n// Usage of any of the other color names requires adding yourself or including\n// jquery.color.svg-names.js.\ncolors = jQuery.Color.names = {\n\n\t// 4.1. Basic color keywords\n\taqua: \"#00ffff\",\n\tblack: \"#000000\",\n\tblue: \"#0000ff\",\n\tfuchsia: \"#ff00ff\",\n\tgray: \"#808080\",\n\tgreen: \"#008000\",\n\tlime: \"#00ff00\",\n\tmaroon: \"#800000\",\n\tnavy: \"#000080\",\n\tolive: \"#808000\",\n\tpurple: \"#800080\",\n\tred: \"#ff0000\",\n\tsilver: \"#c0c0c0\",\n\tteal: \"#008080\",\n\twhite: \"#ffffff\",\n\tyellow: \"#ffff00\",\n\n\t// 4.2.3. \"transparent\" color keyword\n\ttransparent: [ null, null, null, 0 ],\n\n\t_default: \"#ffffff\"\n};\n\n\nvar dataSpace = \"ui-effects-\",\n\tdataSpaceStyle = \"ui-effects-style\",\n\tdataSpaceAnimated = \"ui-effects-animated\";\n\n$.effects = {\n\teffect: {}\n};\n\n/******************************************************************************/\n/****************************** CLASS ANIMATIONS ******************************/\n/******************************************************************************/\n( function() {\n\nvar classAnimationActions = [ \"add\", \"remove\", \"toggle\" ],\n\tshorthandStyles = {\n\t\tborder: 1,\n\t\tborderBottom: 1,\n\t\tborderColor: 1,\n\t\tborderLeft: 1,\n\t\tborderRight: 1,\n\t\tborderTop: 1,\n\t\tborderWidth: 1,\n\t\tmargin: 1,\n\t\tpadding: 1\n\t};\n\n$.each(\n\t[ \"borderLeftStyle\", \"borderRightStyle\", \"borderBottomStyle\", \"borderTopStyle\" ],\n\tfunction( _, prop ) {\n\t\t$.fx.step[ prop ] = function( fx ) {\n\t\t\tif ( fx.end !== \"none\" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {\n\t\t\t\tjQuery.style( fx.elem, prop, fx.end );\n\t\t\t\tfx.setAttr = true;\n\t\t\t}\n\t\t};\n\t}\n);\n\nfunction camelCase( string ) {\n\treturn string.replace( /-([\\da-z])/gi, function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t} );\n}\n\nfunction getElementStyles( elem ) {\n\tvar key, len,\n\t\tstyle = elem.ownerDocument.defaultView ?\n\t\t\telem.ownerDocument.defaultView.getComputedStyle( elem, null ) :\n\t\t\telem.currentStyle,\n\t\tstyles = {};\n\n\tif ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {\n\t\tlen = style.length;\n\t\twhile ( len-- ) {\n\t\t\tkey = style[ len ];\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ camelCase( key ) ] = style[ key ];\n\t\t\t}\n\t\t}\n\n\t// Support: Opera, IE <9\n\t} else {\n\t\tfor ( key in style ) {\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ key ] = style[ key ];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn styles;\n}\n\nfunction styleDifference( oldStyle, newStyle ) {\n\tvar diff = {},\n\t\tname, value;\n\n\tfor ( name in newStyle ) {\n\t\tvalue = newStyle[ name ];\n\t\tif ( oldStyle[ name ] !== value ) {\n\t\t\tif ( !shorthandStyles[ name ] ) {\n\t\t\t\tif ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {\n\t\t\t\t\tdiff[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn diff;\n}\n\n// Support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n$.effects.animateClass = function( value, duration, easing, callback ) {\n\tvar o = $.speed( duration, easing, callback );\n\n\treturn this.queue( function() {\n\t\tvar animated = $( this ),\n\t\t\tbaseClass = animated.attr( \"class\" ) || \"\",\n\t\t\tapplyClassChange,\n\t\t\tallAnimations = o.children ? animated.find( \"*\" ).addBack() : animated;\n\n\t\t// Map the animated objects to store the original styles.\n\t\tallAnimations = allAnimations.map( function() {\n\t\t\tvar el = $( this );\n\t\t\treturn {\n\t\t\t\tel: el,\n\t\t\t\tstart: getElementStyles( this )\n\t\t\t};\n\t\t} );\n\n\t\t// Apply class change\n\t\tapplyClassChange = function() {\n\t\t\t$.each( classAnimationActions, function( i, action ) {\n\t\t\t\tif ( value[ action ] ) {\n\t\t\t\t\tanimated[ action + \"Class\" ]( value[ action ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t};\n\t\tapplyClassChange();\n\n\t\t// Map all animated objects again - calculate new styles and diff\n\t\tallAnimations = allAnimations.map( function() {\n\t\t\tthis.end = getElementStyles( this.el[ 0 ] );\n\t\t\tthis.diff = styleDifference( this.start, this.end );\n\t\t\treturn this;\n\t\t} );\n\n\t\t// Apply original class\n\t\tanimated.attr( \"class\", baseClass );\n\n\t\t// Map all animated objects again - this time collecting a promise\n\t\tallAnimations = allAnimations.map( function() {\n\t\t\tvar styleInfo = this,\n\t\t\t\tdfd = $.Deferred(),\n\t\t\t\topts = $.extend( {}, o, {\n\t\t\t\t\tqueue: false,\n\t\t\t\t\tcomplete: function() {\n\t\t\t\t\t\tdfd.resolve( styleInfo );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\tthis.el.animate( this.diff, opts );\n\t\t\treturn dfd.promise();\n\t\t} );\n\n\t\t// Once all animations have completed:\n\t\t$.when.apply( $, allAnimations.get() ).done( function() {\n\n\t\t\t// Set the final class\n\t\t\tapplyClassChange();\n\n\t\t\t// For each animated element,\n\t\t\t// clear all css properties that were animated\n\t\t\t$.each( arguments, function() {\n\t\t\t\tvar el = this.el;\n\t\t\t\t$.each( this.diff, function( key ) {\n\t\t\t\t\tel.css( key, \"\" );\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\t// This is guarnteed to be there if you use jQuery.speed()\n\t\t\t// it also handles dequeuing the next anim...\n\t\t\to.complete.call( animated[ 0 ] );\n\t\t} );\n\t} );\n};\n\n$.fn.extend( {\n\taddClass: ( function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn speed ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ add: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t} )( $.fn.addClass ),\n\n\tremoveClass: ( function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn arguments.length > 1 ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ remove: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t} )( $.fn.removeClass ),\n\n\ttoggleClass: ( function( orig ) {\n\t\treturn function( classNames, force, speed, easing, callback ) {\n\t\t\tif ( typeof force === \"boolean\" || force === undefined ) {\n\t\t\t\tif ( !speed ) {\n\n\t\t\t\t\t// Without speed parameter\n\t\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t\t} else {\n\t\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t\t( force ? { add: classNames } : { remove: classNames } ),\n\t\t\t\t\t\tspeed, easing, callback );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Without force parameter\n\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t{ toggle: classNames }, force, speed, easing );\n\t\t\t}\n\t\t};\n\t} )( $.fn.toggleClass ),\n\n\tswitchClass: function( remove, add, speed, easing, callback ) {\n\t\treturn $.effects.animateClass.call( this, {\n\t\t\tadd: add,\n\t\t\tremove: remove\n\t\t}, speed, easing, callback );\n\t}\n} );\n\n} )();\n\n/******************************************************************************/\n/*********************************** EFFECTS **********************************/\n/******************************************************************************/\n\n( function() {\n\nif ( $.expr && $.expr.pseudos && $.expr.pseudos.animated ) {\n\t$.expr.pseudos.animated = ( function( orig ) {\n\t\treturn function( elem ) {\n\t\t\treturn !!$( elem ).data( dataSpaceAnimated ) || orig( elem );\n\t\t};\n\t} )( $.expr.pseudos.animated );\n}\n\nif ( $.uiBackCompat !== false ) {\n\t$.extend( $.effects, {\n\n\t\t// Saves a set of properties in a data storage\n\t\tsave: function( element, set ) {\n\t\t\tvar i = 0, length = set.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\t\telement.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Restores a set of previously saved properties from a data storage\n\t\trestore: function( element, set ) {\n\t\t\tvar val, i = 0, length = set.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\t\tval = element.data( dataSpace + set[ i ] );\n\t\t\t\t\telement.css( set[ i ], val );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tsetMode: function( el, mode ) {\n\t\t\tif ( mode === \"toggle\" ) {\n\t\t\t\tmode = el.is( \":hidden\" ) ? \"show\" : \"hide\";\n\t\t\t}\n\t\t\treturn mode;\n\t\t},\n\n\t\t// Wraps the element around a wrapper that copies position properties\n\t\tcreateWrapper: function( element ) {\n\n\t\t\t// If the element is already wrapped, return it\n\t\t\tif ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t\t\treturn element.parent();\n\t\t\t}\n\n\t\t\t// Wrap the element\n\t\t\tvar props = {\n\t\t\t\t\twidth: element.outerWidth( true ),\n\t\t\t\t\theight: element.outerHeight( true ),\n\t\t\t\t\t\"float\": element.css( \"float\" )\n\t\t\t\t},\n\t\t\t\twrapper = $( \"<div></div>\" )\n\t\t\t\t\t.addClass( \"ui-effects-wrapper\" )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tfontSize: \"100%\",\n\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tpadding: 0\n\t\t\t\t\t} ),\n\n\t\t\t\t// Store the size in case width/height are defined in % - Fixes #5245\n\t\t\t\tsize = {\n\t\t\t\t\twidth: element.width(),\n\t\t\t\t\theight: element.height()\n\t\t\t\t},\n\t\t\t\tactive = document.activeElement;\n\n\t\t\t// Support: Firefox\n\t\t\t// Firefox incorrectly exposes anonymous content\n\t\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=561664\n\t\t\ttry {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\tactive.id;\n\t\t\t} catch ( e ) {\n\t\t\t\tactive = document.body;\n\t\t\t}\n\n\t\t\telement.wrap( wrapper );\n\n\t\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t\t$( active ).trigger( \"focus\" );\n\t\t\t}\n\n\t\t\t// Hotfix for jQuery 1.4 since some change in wrap() seems to actually\n\t\t\t// lose the reference to the wrapped element\n\t\t\twrapper = element.parent();\n\n\t\t\t// Transfer positioning properties to the wrapper\n\t\t\tif ( element.css( \"position\" ) === \"static\" ) {\n\t\t\t\twrapper.css( { position: \"relative\" } );\n\t\t\t\telement.css( { position: \"relative\" } );\n\t\t\t} else {\n\t\t\t\t$.extend( props, {\n\t\t\t\t\tposition: element.css( \"position\" ),\n\t\t\t\t\tzIndex: element.css( \"z-index\" )\n\t\t\t\t} );\n\t\t\t\t$.each( [ \"top\", \"left\", \"bottom\", \"right\" ], function( i, pos ) {\n\t\t\t\t\tprops[ pos ] = element.css( pos );\n\t\t\t\t\tif ( isNaN( parseInt( props[ pos ], 10 ) ) ) {\n\t\t\t\t\t\tprops[ pos ] = \"auto\";\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\telement.css( {\n\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: \"auto\",\n\t\t\t\t\tbottom: \"auto\"\n\t\t\t\t} );\n\t\t\t}\n\t\t\telement.css( size );\n\n\t\t\treturn wrapper.css( props ).show();\n\t\t},\n\n\t\tremoveWrapper: function( element ) {\n\t\t\tvar active = document.activeElement;\n\n\t\t\tif ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t\t\telement.parent().replaceWith( element );\n\n\t\t\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\t\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t\t\t$( active ).trigger( \"focus\" );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn element;\n\t\t}\n\t} );\n}\n\n$.extend( $.effects, {\n\tversion: \"1.13.0\",\n\n\tdefine: function( name, mode, effect ) {\n\t\tif ( !effect ) {\n\t\t\teffect = mode;\n\t\t\tmode = \"effect\";\n\t\t}\n\n\t\t$.effects.effect[ name ] = effect;\n\t\t$.effects.effect[ name ].mode = mode;\n\n\t\treturn effect;\n\t},\n\n\tscaledDimensions: function( element, percent, direction ) {\n\t\tif ( percent === 0 ) {\n\t\t\treturn {\n\t\t\t\theight: 0,\n\t\t\t\twidth: 0,\n\t\t\t\touterHeight: 0,\n\t\t\t\touterWidth: 0\n\t\t\t};\n\t\t}\n\n\t\tvar x = direction !== \"horizontal\" ? ( ( percent || 100 ) / 100 ) : 1,\n\t\t\ty = direction !== \"vertical\" ? ( ( percent || 100 ) / 100 ) : 1;\n\n\t\treturn {\n\t\t\theight: element.height() * y,\n\t\t\twidth: element.width() * x,\n\t\t\touterHeight: element.outerHeight() * y,\n\t\t\touterWidth: element.outerWidth() * x\n\t\t};\n\n\t},\n\n\tclipToBox: function( animation ) {\n\t\treturn {\n\t\t\twidth: animation.clip.right - animation.clip.left,\n\t\t\theight: animation.clip.bottom - animation.clip.top,\n\t\t\tleft: animation.clip.left,\n\t\t\ttop: animation.clip.top\n\t\t};\n\t},\n\n\t// Injects recently queued functions to be first in line (after \"inprogress\")\n\tunshift: function( element, queueLength, count ) {\n\t\tvar queue = element.queue();\n\n\t\tif ( queueLength > 1 ) {\n\t\t\tqueue.splice.apply( queue,\n\t\t\t\t[ 1, 0 ].concat( queue.splice( queueLength, count ) ) );\n\t\t}\n\t\telement.dequeue();\n\t},\n\n\tsaveStyle: function( element ) {\n\t\telement.data( dataSpaceStyle, element[ 0 ].style.cssText );\n\t},\n\n\trestoreStyle: function( element ) {\n\t\telement[ 0 ].style.cssText = element.data( dataSpaceStyle ) || \"\";\n\t\telement.removeData( dataSpaceStyle );\n\t},\n\n\tmode: function( element, mode ) {\n\t\tvar hidden = element.is( \":hidden\" );\n\n\t\tif ( mode === \"toggle\" ) {\n\t\t\tmode = hidden ? \"show\" : \"hide\";\n\t\t}\n\t\tif ( hidden ? mode === \"hide\" : mode === \"show\" ) {\n\t\t\tmode = \"none\";\n\t\t}\n\t\treturn mode;\n\t},\n\n\t// Translates a [top,left] array into a baseline value\n\tgetBaseline: function( origin, original ) {\n\t\tvar y, x;\n\n\t\tswitch ( origin[ 0 ] ) {\n\t\tcase \"top\":\n\t\t\ty = 0;\n\t\t\tbreak;\n\t\tcase \"middle\":\n\t\t\ty = 0.5;\n\t\t\tbreak;\n\t\tcase \"bottom\":\n\t\t\ty = 1;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\ty = origin[ 0 ] / original.height;\n\t\t}\n\n\t\tswitch ( origin[ 1 ] ) {\n\t\tcase \"left\":\n\t\t\tx = 0;\n\t\t\tbreak;\n\t\tcase \"center\":\n\t\t\tx = 0.5;\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tx = 1;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tx = origin[ 1 ] / original.width;\n\t\t}\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t},\n\n\t// Creates a placeholder element so that the original element can be made absolute\n\tcreatePlaceholder: function( element ) {\n\t\tvar placeholder,\n\t\t\tcssPosition = element.css( \"position\" ),\n\t\t\tposition = element.position();\n\n\t\t// Lock in margins first to account for form elements, which\n\t\t// will change margin if you explicitly set height\n\t\t// see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380\n\t\t// Support: Safari\n\t\telement.css( {\n\t\t\tmarginTop: element.css( \"marginTop\" ),\n\t\t\tmarginBottom: element.css( \"marginBottom\" ),\n\t\t\tmarginLeft: element.css( \"marginLeft\" ),\n\t\t\tmarginRight: element.css( \"marginRight\" )\n\t\t} )\n\t\t.outerWidth( element.outerWidth() )\n\t\t.outerHeight( element.outerHeight() );\n\n\t\tif ( /^(static|relative)/.test( cssPosition ) ) {\n\t\t\tcssPosition = \"absolute\";\n\n\t\t\tplaceholder = $( \"<\" + element[ 0 ].nodeName + \">\" ).insertAfter( element ).css( {\n\n\t\t\t\t// Convert inline to inline block to account for inline elements\n\t\t\t\t// that turn to inline block based on content (like img)\n\t\t\t\tdisplay: /^(inline|ruby)/.test( element.css( \"display\" ) ) ?\n\t\t\t\t\t\"inline-block\" :\n\t\t\t\t\t\"block\",\n\t\t\t\tvisibility: \"hidden\",\n\n\t\t\t\t// Margins need to be set to account for margin collapse\n\t\t\t\tmarginTop: element.css( \"marginTop\" ),\n\t\t\t\tmarginBottom: element.css( \"marginBottom\" ),\n\t\t\t\tmarginLeft: element.css( \"marginLeft\" ),\n\t\t\t\tmarginRight: element.css( \"marginRight\" ),\n\t\t\t\t\"float\": element.css( \"float\" )\n\t\t\t} )\n\t\t\t.outerWidth( element.outerWidth() )\n\t\t\t.outerHeight( element.outerHeight() )\n\t\t\t.addClass( \"ui-effects-placeholder\" );\n\n\t\t\telement.data( dataSpace + \"placeholder\", placeholder );\n\t\t}\n\n\t\telement.css( {\n\t\t\tposition: cssPosition,\n\t\t\tleft: position.left,\n\t\t\ttop: position.top\n\t\t} );\n\n\t\treturn placeholder;\n\t},\n\n\tremovePlaceholder: function( element ) {\n\t\tvar dataKey = dataSpace + \"placeholder\",\n\t\t\t\tplaceholder = element.data( dataKey );\n\n\t\tif ( placeholder ) {\n\t\t\tplaceholder.remove();\n\t\t\telement.removeData( dataKey );\n\t\t}\n\t},\n\n\t// Removes a placeholder if it exists and restores\n\t// properties that were modified during placeholder creation\n\tcleanUp: function( element ) {\n\t\t$.effects.restoreStyle( element );\n\t\t$.effects.removePlaceholder( element );\n\t},\n\n\tsetTransition: function( element, list, factor, value ) {\n\t\tvalue = value || {};\n\t\t$.each( list, function( i, x ) {\n\t\t\tvar unit = element.cssUnit( x );\n\t\t\tif ( unit[ 0 ] > 0 ) {\n\t\t\t\tvalue[ x ] = unit[ 0 ] * factor + unit[ 1 ];\n\t\t\t}\n\t\t} );\n\t\treturn value;\n\t}\n} );\n\n// Return an effect options object for the given parameters:\nfunction _normalizeArguments( effect, options, speed, callback ) {\n\n\t// Allow passing all options as the first parameter\n\tif ( $.isPlainObject( effect ) ) {\n\t\toptions = effect;\n\t\teffect = effect.effect;\n\t}\n\n\t// Convert to an object\n\teffect = { effect: effect };\n\n\t// Catch (effect, null, ...)\n\tif ( options == null ) {\n\t\toptions = {};\n\t}\n\n\t// Catch (effect, callback)\n\tif ( typeof options === \"function\" ) {\n\t\tcallback = options;\n\t\tspeed = null;\n\t\toptions = {};\n\t}\n\n\t// Catch (effect, speed, ?)\n\tif ( typeof options === \"number\" || $.fx.speeds[ options ] ) {\n\t\tcallback = speed;\n\t\tspeed = options;\n\t\toptions = {};\n\t}\n\n\t// Catch (effect, options, callback)\n\tif ( typeof speed === \"function\" ) {\n\t\tcallback = speed;\n\t\tspeed = null;\n\t}\n\n\t// Add options to effect\n\tif ( options ) {\n\t\t$.extend( effect, options );\n\t}\n\n\tspeed = speed || options.duration;\n\teffect.duration = $.fx.off ? 0 :\n\t\ttypeof speed === \"number\" ? speed :\n\t\tspeed in $.fx.speeds ? $.fx.speeds[ speed ] :\n\t\t$.fx.speeds._default;\n\n\teffect.complete = callback || options.complete;\n\n\treturn effect;\n}\n\nfunction standardAnimationOption( option ) {\n\n\t// Valid standard speeds (nothing, number, named speed)\n\tif ( !option || typeof option === \"number\" || $.fx.speeds[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Invalid strings - treat as \"normal\" speed\n\tif ( typeof option === \"string\" && !$.effects.effect[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Complete callback\n\tif ( typeof option === \"function\" ) {\n\t\treturn true;\n\t}\n\n\t// Options hash (but not naming an effect)\n\tif ( typeof option === \"object\" && !option.effect ) {\n\t\treturn true;\n\t}\n\n\t// Didn't match any standard API\n\treturn false;\n}\n\n$.fn.extend( {\n\teffect: function( /* effect, options, speed, callback */ ) {\n\t\tvar args = _normalizeArguments.apply( this, arguments ),\n\t\t\teffectMethod = $.effects.effect[ args.effect ],\n\t\t\tdefaultMode = effectMethod.mode,\n\t\t\tqueue = args.queue,\n\t\t\tqueueName = queue || \"fx\",\n\t\t\tcomplete = args.complete,\n\t\t\tmode = args.mode,\n\t\t\tmodes = [],\n\t\t\tprefilter = function( next ) {\n\t\t\t\tvar el = $( this ),\n\t\t\t\t\tnormalizedMode = $.effects.mode( el, mode ) || defaultMode;\n\n\t\t\t\t// Sentinel for duck-punching the :animated pseudo-selector\n\t\t\t\tel.data( dataSpaceAnimated, true );\n\n\t\t\t\t// Save effect mode for later use,\n\t\t\t\t// we can't just call $.effects.mode again later,\n\t\t\t\t// as the .show() below destroys the initial state\n\t\t\t\tmodes.push( normalizedMode );\n\n\t\t\t\t// See $.uiBackCompat inside of run() for removal of defaultMode in 1.14\n\t\t\t\tif ( defaultMode && ( normalizedMode === \"show\" ||\n\t\t\t\t\t\t( normalizedMode === defaultMode && normalizedMode === \"hide\" ) ) ) {\n\t\t\t\t\tel.show();\n\t\t\t\t}\n\n\t\t\t\tif ( !defaultMode || normalizedMode !== \"none\" ) {\n\t\t\t\t\t$.effects.saveStyle( el );\n\t\t\t\t}\n\n\t\t\t\tif ( typeof next === \"function\" ) {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( $.fx.off || !effectMethod ) {\n\n\t\t\t// Delegate to the original method (e.g., .show()) if possible\n\t\t\tif ( mode ) {\n\t\t\t\treturn this[ mode ]( args.duration, complete );\n\t\t\t} else {\n\t\t\t\treturn this.each( function() {\n\t\t\t\t\tif ( complete ) {\n\t\t\t\t\t\tcomplete.call( this );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\tfunction run( next ) {\n\t\t\tvar elem = $( this );\n\n\t\t\tfunction cleanup() {\n\t\t\t\telem.removeData( dataSpaceAnimated );\n\n\t\t\t\t$.effects.cleanUp( elem );\n\n\t\t\t\tif ( args.mode === \"hide\" ) {\n\t\t\t\t\telem.hide();\n\t\t\t\t}\n\n\t\t\t\tdone();\n\t\t\t}\n\n\t\t\tfunction done() {\n\t\t\t\tif ( typeof complete === \"function\" ) {\n\t\t\t\t\tcomplete.call( elem[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\tif ( typeof next === \"function\" ) {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override mode option on a per element basis,\n\t\t\t// as toggle can be either show or hide depending on element state\n\t\t\targs.mode = modes.shift();\n\n\t\t\tif ( $.uiBackCompat !== false && !defaultMode ) {\n\t\t\t\tif ( elem.is( \":hidden\" ) ? mode === \"hide\" : mode === \"show\" ) {\n\n\t\t\t\t\t// Call the core method to track \"olddisplay\" properly\n\t\t\t\t\telem[ mode ]();\n\t\t\t\t\tdone();\n\t\t\t\t} else {\n\t\t\t\t\teffectMethod.call( elem[ 0 ], args, done );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( args.mode === \"none\" ) {\n\n\t\t\t\t\t// Call the core method to track \"olddisplay\" properly\n\t\t\t\t\telem[ mode ]();\n\t\t\t\t\tdone();\n\t\t\t\t} else {\n\t\t\t\t\teffectMethod.call( elem[ 0 ], args, cleanup );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Run prefilter on all elements first to ensure that\n\t\t// any showing or hiding happens before placeholder creation,\n\t\t// which ensures that any layout changes are correctly captured.\n\t\treturn queue === false ?\n\t\t\tthis.each( prefilter ).each( run ) :\n\t\t\tthis.queue( queueName, prefilter ).queue( queueName, run );\n\t},\n\n\tshow: ( function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"show\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t} )( $.fn.show ),\n\n\thide: ( function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"hide\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t} )( $.fn.hide ),\n\n\ttoggle: ( function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) || typeof option === \"boolean\" ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"toggle\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t} )( $.fn.toggle ),\n\n\tcssUnit: function( key ) {\n\t\tvar style = this.css( key ),\n\t\t\tval = [];\n\n\t\t$.each( [ \"em\", \"px\", \"%\", \"pt\" ], function( i, unit ) {\n\t\t\tif ( style.indexOf( unit ) > 0 ) {\n\t\t\t\tval = [ parseFloat( style ), unit ];\n\t\t\t}\n\t\t} );\n\t\treturn val;\n\t},\n\n\tcssClip: function( clipObj ) {\n\t\tif ( clipObj ) {\n\t\t\treturn this.css( \"clip\", \"rect(\" + clipObj.top + \"px \" + clipObj.right + \"px \" +\n\t\t\t\tclipObj.bottom + \"px \" + clipObj.left + \"px)\" );\n\t\t}\n\t\treturn parseClip( this.css( \"clip\" ), this );\n\t},\n\n\ttransfer: function( options, done ) {\n\t\tvar element = $( this ),\n\t\t\ttarget = $( options.to ),\n\t\t\ttargetFixed = target.css( \"position\" ) === \"fixed\",\n\t\t\tbody = $( \"body\" ),\n\t\t\tfixTop = targetFixed ? body.scrollTop() : 0,\n\t\t\tfixLeft = targetFixed ? body.scrollLeft() : 0,\n\t\t\tendPosition = target.offset(),\n\t\t\tanimation = {\n\t\t\t\ttop: endPosition.top - fixTop,\n\t\t\t\tleft: endPosition.left - fixLeft,\n\t\t\t\theight: target.innerHeight(),\n\t\t\t\twidth: target.innerWidth()\n\t\t\t},\n\t\t\tstartPosition = element.offset(),\n\t\t\ttransfer = $( \"<div class='ui-effects-transfer'></div>\" );\n\n\t\ttransfer\n\t\t\t.appendTo( \"body\" )\n\t\t\t.addClass( options.className )\n\t\t\t.css( {\n\t\t\t\ttop: startPosition.top - fixTop,\n\t\t\t\tleft: startPosition.left - fixLeft,\n\t\t\t\theight: element.innerHeight(),\n\t\t\t\twidth: element.innerWidth(),\n\t\t\t\tposition: targetFixed ? \"fixed\" : \"absolute\"\n\t\t\t} )\n\t\t\t.animate( animation, options.duration, options.easing, function() {\n\t\t\t\ttransfer.remove();\n\t\t\t\tif ( typeof done === \"function\" ) {\n\t\t\t\t\tdone();\n\t\t\t\t}\n\t\t\t} );\n\t}\n} );\n\nfunction parseClip( str, element ) {\n\t\tvar outerWidth = element.outerWidth(),\n\t\t\touterHeight = element.outerHeight(),\n\t\t\tclipRegex = /^rect\\((-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto)\\)$/,\n\t\t\tvalues = clipRegex.exec( str ) || [ \"\", 0, outerWidth, outerHeight, 0 ];\n\n\t\treturn {\n\t\t\ttop: parseFloat( values[ 1 ] ) || 0,\n\t\t\tright: values[ 2 ] === \"auto\" ? outerWidth : parseFloat( values[ 2 ] ),\n\t\t\tbottom: values[ 3 ] === \"auto\" ? outerHeight : parseFloat( values[ 3 ] ),\n\t\t\tleft: parseFloat( values[ 4 ] ) || 0\n\t\t};\n}\n\n$.fx.step.clip = function( fx ) {\n\tif ( !fx.clipInit ) {\n\t\tfx.start = $( fx.elem ).cssClip();\n\t\tif ( typeof fx.end === \"string\" ) {\n\t\t\tfx.end = parseClip( fx.end, fx.elem );\n\t\t}\n\t\tfx.clipInit = true;\n\t}\n\n\t$( fx.elem ).cssClip( {\n\t\ttop: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top,\n\t\tright: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right,\n\t\tbottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom,\n\t\tleft: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left\n\t} );\n};\n\n} )();\n\n/******************************************************************************/\n/*********************************** EASING ***********************************/\n/******************************************************************************/\n\n( function() {\n\n// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing)\n\nvar baseEasings = {};\n\n$.each( [ \"Quad\", \"Cubic\", \"Quart\", \"Quint\", \"Expo\" ], function( i, name ) {\n\tbaseEasings[ name ] = function( p ) {\n\t\treturn Math.pow( p, i + 2 );\n\t};\n} );\n\n$.extend( baseEasings, {\n\tSine: function( p ) {\n\t\treturn 1 - Math.cos( p * Math.PI / 2 );\n\t},\n\tCirc: function( p ) {\n\t\treturn 1 - Math.sqrt( 1 - p * p );\n\t},\n\tElastic: function( p ) {\n\t\treturn p === 0 || p === 1 ? p :\n\t\t\t-Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 );\n\t},\n\tBack: function( p ) {\n\t\treturn p * p * ( 3 * p - 2 );\n\t},\n\tBounce: function( p ) {\n\t\tvar pow2,\n\t\t\tbounce = 4;\n\n\t\twhile ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}\n\t\treturn 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );\n\t}\n} );\n\n$.each( baseEasings, function( name, easeIn ) {\n\t$.easing[ \"easeIn\" + name ] = easeIn;\n\t$.easing[ \"easeOut\" + name ] = function( p ) {\n\t\treturn 1 - easeIn( 1 - p );\n\t};\n\t$.easing[ \"easeInOut\" + name ] = function( p ) {\n\t\treturn p < 0.5 ?\n\t\t\teaseIn( p * 2 ) / 2 :\n\t\t\t1 - easeIn( p * -2 + 2 ) / 2;\n\t};\n} );\n\n} )();\n\nreturn $.effects;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/menu.js",
    "content": "/*!\n * jQuery UI Menu 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Menu\n//>>group: Widgets\n//>>description: Creates nestable menus.\n//>>docs: http://api.jqueryui.com/menu/\n//>>demos: http://jqueryui.com/menu/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/menu.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.widget( \"ui.menu\", {\n\tversion: \"1.13.0\",\n\tdefaultElement: \"<ul>\",\n\tdelay: 300,\n\toptions: {\n\t\ticons: {\n\t\t\tsubmenu: \"ui-icon-caret-1-e\"\n\t\t},\n\t\titems: \"> *\",\n\t\tmenus: \"ul\",\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"right top\"\n\t\t},\n\t\trole: \"menu\",\n\n\t\t// Callbacks\n\t\tblur: null,\n\t\tfocus: null,\n\t\tselect: null\n\t},\n\n\t_create: function() {\n\t\tthis.activeMenu = this.element;\n\n\t\t// Flag used to prevent firing of the click handler\n\t\t// as the event bubbles up through nested menus\n\t\tthis.mouseHandled = false;\n\t\tthis.lastMousePosition = { x: null, y: null };\n\t\tthis.element\n\t\t\t.uniqueId()\n\t\t\t.attr( {\n\t\t\t\trole: this.options.role,\n\t\t\t\ttabIndex: 0\n\t\t\t} );\n\n\t\tthis._addClass( \"ui-menu\", \"ui-widget ui-widget-content\" );\n\t\tthis._on( {\n\n\t\t\t// Prevent focus from sticking to links inside menu after clicking\n\t\t\t// them (focus should always stay on UL during navigation).\n\t\t\t\"mousedown .ui-menu-item\": function( event ) {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tthis._activateItem( event );\n\t\t\t},\n\t\t\t\"click .ui-menu-item\": function( event ) {\n\t\t\t\tvar target = $( event.target );\n\t\t\t\tvar active = $( $.ui.safeActiveElement( this.document[ 0 ] ) );\n\t\t\t\tif ( !this.mouseHandled && target.not( \".ui-state-disabled\" ).length ) {\n\t\t\t\t\tthis.select( event );\n\n\t\t\t\t\t// Only set the mouseHandled flag if the event will bubble, see #9469.\n\t\t\t\t\tif ( !event.isPropagationStopped() ) {\n\t\t\t\t\t\tthis.mouseHandled = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Open submenu on click\n\t\t\t\t\tif ( target.has( \".ui-menu\" ).length ) {\n\t\t\t\t\t\tthis.expand( event );\n\t\t\t\t\t} else if ( !this.element.is( \":focus\" ) &&\n\t\t\t\t\t\t\tactive.closest( \".ui-menu\" ).length ) {\n\n\t\t\t\t\t\t// Redirect focus to the menu\n\t\t\t\t\t\tthis.element.trigger( \"focus\", [ true ] );\n\n\t\t\t\t\t\t// If the active item is on the top level, let it stay active.\n\t\t\t\t\t\t// Otherwise, blur the active item since it is no longer visible.\n\t\t\t\t\t\tif ( this.active && this.active.parents( \".ui-menu\" ).length === 1 ) {\n\t\t\t\t\t\t\tclearTimeout( this.timer );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mouseenter .ui-menu-item\": \"_activateItem\",\n\t\t\t\"mousemove .ui-menu-item\": \"_activateItem\",\n\t\t\tmouseleave: \"collapseAll\",\n\t\t\t\"mouseleave .ui-menu\": \"collapseAll\",\n\t\t\tfocus: function( event, keepActiveItem ) {\n\n\t\t\t\t// If there's already an active item, keep it active\n\t\t\t\t// If not, activate the first item\n\t\t\t\tvar item = this.active || this._menuItems().first();\n\n\t\t\t\tif ( !keepActiveItem ) {\n\t\t\t\t\tthis.focus( event, item );\n\t\t\t\t}\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tthis._delay( function() {\n\t\t\t\t\tvar notContained = !$.contains(\n\t\t\t\t\t\tthis.element[ 0 ],\n\t\t\t\t\t\t$.ui.safeActiveElement( this.document[ 0 ] )\n\t\t\t\t\t);\n\t\t\t\t\tif ( notContained ) {\n\t\t\t\t\t\tthis.collapseAll( event );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t},\n\t\t\tkeydown: \"_keydown\"\n\t\t} );\n\n\t\tthis.refresh();\n\n\t\t// Clicks outside of a menu collapse any open menus\n\t\tthis._on( this.document, {\n\t\t\tclick: function( event ) {\n\t\t\t\tif ( this._closeOnDocumentClick( event ) ) {\n\t\t\t\t\tthis.collapseAll( event, true );\n\t\t\t\t}\n\n\t\t\t\t// Reset the mouseHandled flag\n\t\t\t\tthis.mouseHandled = false;\n\t\t\t}\n\t\t} );\n\t},\n\n\t_activateItem: function( event ) {\n\n\t\t// Ignore mouse events while typeahead is active, see #10458.\n\t\t// Prevents focusing the wrong item when typeahead causes a scroll while the mouse\n\t\t// is over an item in the menu\n\t\tif ( this.previousFilter ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356)\n\t\tif ( event.clientX === this.lastMousePosition.x &&\n\t\t\t\tevent.clientY === this.lastMousePosition.y ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.lastMousePosition = {\n\t\t\tx: event.clientX,\n\t\t\ty: event.clientY\n\t\t};\n\n\t\tvar actualTarget = $( event.target ).closest( \".ui-menu-item\" ),\n\t\t\ttarget = $( event.currentTarget );\n\n\t\t// Ignore bubbled events on parent items, see #11641\n\t\tif ( actualTarget[ 0 ] !== target[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If the item is already active, there's nothing to do\n\t\tif ( target.is( \".ui-state-active\" ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove ui-state-active class from siblings of the newly focused menu item\n\t\t// to avoid a jump caused by adjacent elements both having a class with a border\n\t\tthis._removeClass( target.siblings().children( \".ui-state-active\" ),\n\t\t\tnull, \"ui-state-active\" );\n\t\tthis.focus( event, target );\n\t},\n\n\t_destroy: function() {\n\t\tvar items = this.element.find( \".ui-menu-item\" )\n\t\t\t\t.removeAttr( \"role aria-disabled\" ),\n\t\t\tsubmenus = items.children( \".ui-menu-item-wrapper\" )\n\t\t\t\t.removeUniqueId()\n\t\t\t\t.removeAttr( \"tabIndex role aria-haspopup\" );\n\n\t\t// Destroy (sub)menus\n\t\tthis.element\n\t\t\t.removeAttr( \"aria-activedescendant\" )\n\t\t\t.find( \".ui-menu\" ).addBack()\n\t\t\t\t.removeAttr( \"role aria-labelledby aria-expanded aria-hidden aria-disabled \" +\n\t\t\t\t\t\"tabIndex\" )\n\t\t\t\t.removeUniqueId()\n\t\t\t\t.show();\n\n\t\tsubmenus.children().each( function() {\n\t\t\tvar elem = $( this );\n\t\t\tif ( elem.data( \"ui-menu-submenu-caret\" ) ) {\n\t\t\t\telem.remove();\n\t\t\t}\n\t\t} );\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar match, prev, character, skip,\n\t\t\tpreventDefault = true;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\tthis.previousPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\tthis.nextPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tthis._move( \"first\", \"first\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tthis._move( \"last\", \"last\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\t\tthis.previous( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tthis.next( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.RIGHT:\n\t\t\tif ( this.active && !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\t\tthis.expand( event );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ENTER:\n\t\tcase $.ui.keyCode.SPACE:\n\t\t\tthis._activate( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpreventDefault = false;\n\t\t\tprev = this.previousFilter || \"\";\n\t\t\tskip = false;\n\n\t\t\t// Support number pad values\n\t\t\tcharacter = event.keyCode >= 96 && event.keyCode <= 105 ?\n\t\t\t\t( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );\n\n\t\t\tclearTimeout( this.filterTimer );\n\n\t\t\tif ( character === prev ) {\n\t\t\t\tskip = true;\n\t\t\t} else {\n\t\t\t\tcharacter = prev + character;\n\t\t\t}\n\n\t\t\tmatch = this._filterMenuItems( character );\n\t\t\tmatch = skip && match.index( this.active.next() ) !== -1 ?\n\t\t\t\tthis.active.nextAll( \".ui-menu-item\" ) :\n\t\t\t\tmatch;\n\n\t\t\t// If no matches on the current filter, reset to the last character pressed\n\t\t\t// to move down the menu to the first item that starts with that character\n\t\t\tif ( !match.length ) {\n\t\t\t\tcharacter = String.fromCharCode( event.keyCode );\n\t\t\t\tmatch = this._filterMenuItems( character );\n\t\t\t}\n\n\t\t\tif ( match.length ) {\n\t\t\t\tthis.focus( event, match );\n\t\t\t\tthis.previousFilter = character;\n\t\t\t\tthis.filterTimer = this._delay( function() {\n\t\t\t\t\tdelete this.previousFilter;\n\t\t\t\t}, 1000 );\n\t\t\t} else {\n\t\t\t\tdelete this.previousFilter;\n\t\t\t}\n\t\t}\n\n\t\tif ( preventDefault ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_activate: function( event ) {\n\t\tif ( this.active && !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\tif ( this.active.children( \"[aria-haspopup='true']\" ).length ) {\n\t\t\t\tthis.expand( event );\n\t\t\t} else {\n\t\t\t\tthis.select( event );\n\t\t\t}\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar menus, items, newSubmenus, newItems, newWrappers,\n\t\t\tthat = this,\n\t\t\ticon = this.options.icons.submenu,\n\t\t\tsubmenus = this.element.find( this.options.menus );\n\n\t\tthis._toggleClass( \"ui-menu-icons\", null, !!this.element.find( \".ui-icon\" ).length );\n\n\t\t// Initialize nested menus\n\t\tnewSubmenus = submenus.filter( \":not(.ui-menu)\" )\n\t\t\t.hide()\n\t\t\t.attr( {\n\t\t\t\trole: this.options.role,\n\t\t\t\t\"aria-hidden\": \"true\",\n\t\t\t\t\"aria-expanded\": \"false\"\n\t\t\t} )\n\t\t\t.each( function() {\n\t\t\t\tvar menu = $( this ),\n\t\t\t\t\titem = menu.prev(),\n\t\t\t\t\tsubmenuCaret = $( \"<span>\" ).data( \"ui-menu-submenu-caret\", true );\n\n\t\t\t\tthat._addClass( submenuCaret, \"ui-menu-icon\", \"ui-icon \" + icon );\n\t\t\t\titem\n\t\t\t\t\t.attr( \"aria-haspopup\", \"true\" )\n\t\t\t\t\t.prepend( submenuCaret );\n\t\t\t\tmenu.attr( \"aria-labelledby\", item.attr( \"id\" ) );\n\t\t\t} );\n\n\t\tthis._addClass( newSubmenus, \"ui-menu\", \"ui-widget ui-widget-content ui-front\" );\n\n\t\tmenus = submenus.add( this.element );\n\t\titems = menus.find( this.options.items );\n\n\t\t// Initialize menu-items containing spaces and/or dashes only as dividers\n\t\titems.not( \".ui-menu-item\" ).each( function() {\n\t\t\tvar item = $( this );\n\t\t\tif ( that._isDivider( item ) ) {\n\t\t\t\tthat._addClass( item, \"ui-menu-divider\", \"ui-widget-content\" );\n\t\t\t}\n\t\t} );\n\n\t\t// Don't refresh list items that are already adapted\n\t\tnewItems = items.not( \".ui-menu-item, .ui-menu-divider\" );\n\t\tnewWrappers = newItems.children()\n\t\t\t.not( \".ui-menu\" )\n\t\t\t\t.uniqueId()\n\t\t\t\t.attr( {\n\t\t\t\t\ttabIndex: -1,\n\t\t\t\t\trole: this._itemRole()\n\t\t\t\t} );\n\t\tthis._addClass( newItems, \"ui-menu-item\" )\n\t\t\t._addClass( newWrappers, \"ui-menu-item-wrapper\" );\n\n\t\t// Add aria-disabled attribute to any disabled menu item\n\t\titems.filter( \".ui-state-disabled\" ).attr( \"aria-disabled\", \"true\" );\n\n\t\t// If the active item has been removed, blur the menu\n\t\tif ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\t\t\tthis.blur();\n\t\t}\n\t},\n\n\t_itemRole: function() {\n\t\treturn {\n\t\t\tmenu: \"menuitem\",\n\t\t\tlistbox: \"option\"\n\t\t}[ this.options.role ];\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icons\" ) {\n\t\t\tvar icons = this.element.find( \".ui-menu-icon\" );\n\t\t\tthis._removeClass( icons, null, this.options.icons.submenu )\n\t\t\t\t._addClass( icons, null, value.submenu );\n\t\t}\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.element.attr( \"aria-disabled\", String( value ) );\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t},\n\n\tfocus: function( event, item ) {\n\t\tvar nested, focused, activeParent;\n\t\tthis.blur( event, event && event.type === \"focus\" );\n\n\t\tthis._scrollIntoView( item );\n\n\t\tthis.active = item.first();\n\n\t\tfocused = this.active.children( \".ui-menu-item-wrapper\" );\n\t\tthis._addClass( focused, null, \"ui-state-active\" );\n\n\t\t// Only update aria-activedescendant if there's a role\n\t\t// otherwise we assume focus is managed elsewhere\n\t\tif ( this.options.role ) {\n\t\t\tthis.element.attr( \"aria-activedescendant\", focused.attr( \"id\" ) );\n\t\t}\n\n\t\t// Highlight active parent menu item, if any\n\t\tactiveParent = this.active\n\t\t\t.parent()\n\t\t\t\t.closest( \".ui-menu-item\" )\n\t\t\t\t\t.children( \".ui-menu-item-wrapper\" );\n\t\tthis._addClass( activeParent, null, \"ui-state-active\" );\n\n\t\tif ( event && event.type === \"keydown\" ) {\n\t\t\tthis._close();\n\t\t} else {\n\t\t\tthis.timer = this._delay( function() {\n\t\t\t\tthis._close();\n\t\t\t}, this.delay );\n\t\t}\n\n\t\tnested = item.children( \".ui-menu\" );\n\t\tif ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {\n\t\t\tthis._startOpening( nested );\n\t\t}\n\t\tthis.activeMenu = item.parent();\n\n\t\tthis._trigger( \"focus\", event, { item: item } );\n\t},\n\n\t_scrollIntoView: function( item ) {\n\t\tvar borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;\n\t\tif ( this._hasScroll() ) {\n\t\t\tborderTop = parseFloat( $.css( this.activeMenu[ 0 ], \"borderTopWidth\" ) ) || 0;\n\t\t\tpaddingTop = parseFloat( $.css( this.activeMenu[ 0 ], \"paddingTop\" ) ) || 0;\n\t\t\toffset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;\n\t\t\tscroll = this.activeMenu.scrollTop();\n\t\t\telementHeight = this.activeMenu.height();\n\t\t\titemHeight = item.outerHeight();\n\n\t\t\tif ( offset < 0 ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset );\n\t\t\t} else if ( offset + itemHeight > elementHeight ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );\n\t\t\t}\n\t\t}\n\t},\n\n\tblur: function( event, fromFocus ) {\n\t\tif ( !fromFocus ) {\n\t\t\tclearTimeout( this.timer );\n\t\t}\n\n\t\tif ( !this.active ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._removeClass( this.active.children( \".ui-menu-item-wrapper\" ),\n\t\t\tnull, \"ui-state-active\" );\n\n\t\tthis._trigger( \"blur\", event, { item: this.active } );\n\t\tthis.active = null;\n\t},\n\n\t_startOpening: function( submenu ) {\n\t\tclearTimeout( this.timer );\n\n\t\t// Don't open if already open fixes a Firefox bug that caused a .5 pixel\n\t\t// shift in the submenu position when mousing over the caret icon\n\t\tif ( submenu.attr( \"aria-hidden\" ) !== \"true\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.timer = this._delay( function() {\n\t\t\tthis._close();\n\t\t\tthis._open( submenu );\n\t\t}, this.delay );\n\t},\n\n\t_open: function( submenu ) {\n\t\tvar position = $.extend( {\n\t\t\tof: this.active\n\t\t}, this.options.position );\n\n\t\tclearTimeout( this.timer );\n\t\tthis.element.find( \".ui-menu\" ).not( submenu.parents( \".ui-menu\" ) )\n\t\t\t.hide()\n\t\t\t.attr( \"aria-hidden\", \"true\" );\n\n\t\tsubmenu\n\t\t\t.show()\n\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t.attr( \"aria-expanded\", \"true\" )\n\t\t\t.position( position );\n\t},\n\n\tcollapseAll: function( event, all ) {\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay( function() {\n\n\t\t\t// If we were passed an event, look for the submenu that contains the event\n\t\t\tvar currentMenu = all ? this.element :\n\t\t\t\t$( event && event.target ).closest( this.element.find( \".ui-menu\" ) );\n\n\t\t\t// If we found no valid submenu ancestor, use the main menu to close all\n\t\t\t// sub menus anyway\n\t\t\tif ( !currentMenu.length ) {\n\t\t\t\tcurrentMenu = this.element;\n\t\t\t}\n\n\t\t\tthis._close( currentMenu );\n\n\t\t\tthis.blur( event );\n\n\t\t\t// Work around active item staying active after menu is blurred\n\t\t\tthis._removeClass( currentMenu.find( \".ui-state-active\" ), null, \"ui-state-active\" );\n\n\t\t\tthis.activeMenu = currentMenu;\n\t\t}, all ? 0 : this.delay );\n\t},\n\n\t// With no arguments, closes the currently active menu - if nothing is active\n\t// it closes all menus.  If passed an argument, it will search for menus BELOW\n\t_close: function( startMenu ) {\n\t\tif ( !startMenu ) {\n\t\t\tstartMenu = this.active ? this.active.parent() : this.element;\n\t\t}\n\n\t\tstartMenu.find( \".ui-menu\" )\n\t\t\t.hide()\n\t\t\t.attr( \"aria-hidden\", \"true\" )\n\t\t\t.attr( \"aria-expanded\", \"false\" );\n\t},\n\n\t_closeOnDocumentClick: function( event ) {\n\t\treturn !$( event.target ).closest( \".ui-menu\" ).length;\n\t},\n\n\t_isDivider: function( item ) {\n\n\t\t// Match hyphen, em dash, en dash\n\t\treturn !/[^\\-\\u2014\\u2013\\s]/.test( item.text() );\n\t},\n\n\tcollapse: function( event ) {\n\t\tvar newItem = this.active &&\n\t\t\tthis.active.parent().closest( \".ui-menu-item\", this.element );\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._close();\n\t\t\tthis.focus( event, newItem );\n\t\t}\n\t},\n\n\texpand: function( event ) {\n\t\tvar newItem = this.active && this._menuItems( this.active.children( \".ui-menu\" ) ).first();\n\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._open( newItem.parent() );\n\n\t\t\t// Delay so Firefox will not hide activedescendant change in expanding submenu from AT\n\t\t\tthis._delay( function() {\n\t\t\t\tthis.focus( event, newItem );\n\t\t\t} );\n\t\t}\n\t},\n\n\tnext: function( event ) {\n\t\tthis._move( \"next\", \"first\", event );\n\t},\n\n\tprevious: function( event ) {\n\t\tthis._move( \"prev\", \"last\", event );\n\t},\n\n\tisFirstItem: function() {\n\t\treturn this.active && !this.active.prevAll( \".ui-menu-item\" ).length;\n\t},\n\n\tisLastItem: function() {\n\t\treturn this.active && !this.active.nextAll( \".ui-menu-item\" ).length;\n\t},\n\n\t_menuItems: function( menu ) {\n\t\treturn ( menu || this.element )\n\t\t\t.find( this.options.items )\n\t\t\t.filter( \".ui-menu-item\" );\n\t},\n\n\t_move: function( direction, filter, event ) {\n\t\tvar next;\n\t\tif ( this.active ) {\n\t\t\tif ( direction === \"first\" || direction === \"last\" ) {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.last();\n\t\t\t} else {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction + \"All\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.first();\n\t\t\t}\n\t\t}\n\t\tif ( !next || !next.length || !this.active ) {\n\t\t\tnext = this._menuItems( this.activeMenu )[ filter ]();\n\t\t}\n\n\t\tthis.focus( event, next );\n\t},\n\n\tnextPage: function( event ) {\n\t\tvar item, base, height;\n\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isLastItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.innerHeight();\n\n\t\t\t// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.\n\t\t\tif ( $.fn.jquery.indexOf( \"3.2.\" ) === 0 ) {\n\t\t\t\theight += this.element[ 0 ].offsetHeight - this.element.outerHeight();\n\t\t\t}\n\n\t\t\tthis.active.nextAll( \".ui-menu-item\" ).each( function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base - height < 0;\n\t\t\t} );\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this._menuItems( this.activeMenu )\n\t\t\t\t[ !this.active ? \"first\" : \"last\" ]() );\n\t\t}\n\t},\n\n\tpreviousPage: function( event ) {\n\t\tvar item, base, height;\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isFirstItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.innerHeight();\n\n\t\t\t// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.\n\t\t\tif ( $.fn.jquery.indexOf( \"3.2.\" ) === 0 ) {\n\t\t\t\theight += this.element[ 0 ].offsetHeight - this.element.outerHeight();\n\t\t\t}\n\n\t\t\tthis.active.prevAll( \".ui-menu-item\" ).each( function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base + height > 0;\n\t\t\t} );\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this._menuItems( this.activeMenu ).first() );\n\t\t}\n\t},\n\n\t_hasScroll: function() {\n\t\treturn this.element.outerHeight() < this.element.prop( \"scrollHeight\" );\n\t},\n\n\tselect: function( event ) {\n\n\t\t// TODO: It should never be possible to not have an active item at this\n\t\t// point, but the tests don't trigger mouseenter before click.\n\t\tthis.active = this.active || $( event.target ).closest( \".ui-menu-item\" );\n\t\tvar ui = { item: this.active };\n\t\tif ( !this.active.has( \".ui-menu\" ).length ) {\n\t\t\tthis.collapseAll( event, true );\n\t\t}\n\t\tthis._trigger( \"select\", event, ui );\n\t},\n\n\t_filterMenuItems: function( character ) {\n\t\tvar escapedCharacter = character.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" ),\n\t\t\tregex = new RegExp( \"^\" + escapedCharacter, \"i\" );\n\n\t\treturn this.activeMenu\n\t\t\t.find( this.options.items )\n\n\t\t\t\t// Only match on items, not dividers or other content (#10571)\n\t\t\t\t.filter( \".ui-menu-item\" )\n\t\t\t\t\t.filter( function() {\n\t\t\t\t\t\treturn regex.test(\n\t\t\t\t\t\t\tString.prototype.trim.call(\n\t\t\t\t\t\t\t\t$( this ).children( \".ui-menu-item-wrapper\" ).text() ) );\n\t\t\t\t\t} );\n\t}\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/mouse.js",
    "content": "/*!\n * jQuery UI Mouse 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Mouse\n//>>group: Widgets\n//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.\n//>>docs: http://api.jqueryui.com/mouse/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nvar mouseHandled = false;\n$( document ).on( \"mouseup\", function() {\n\tmouseHandled = false;\n} );\n\nreturn $.widget( \"ui.mouse\", {\n\tversion: \"1.13.0\",\n\toptions: {\n\t\tcancel: \"input, textarea, button, select, option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.on( \"mousedown.\" + this.widgetName, function( event ) {\n\t\t\t\treturn that._mouseDown( event );\n\t\t\t} )\n\t\t\t.on( \"click.\" + this.widgetName, function( event ) {\n\t\t\t\tif ( true === $.data( event.target, that.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t\t\t$.removeData( event.target, that.widgetName + \".preventClickEvent\" );\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.off( \".\" + this.widgetName );\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\tthis.document\n\t\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\t\t}\n\t},\n\n\t_mouseDown: function( event ) {\n\n\t\t// don't let more than one widget handle mouseStart\n\t\tif ( mouseHandled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._mouseMoved = false;\n\n\t\t// We may have missed mouseup (out of window)\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseUp( event );\n\t\t}\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = ( event.which === 1 ),\n\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\n\t\t\t// disabled inputs (#7620)\n\t\t\telIsCancel = ( typeof this.options.cancel === \"string\" && event.target.nodeName ?\n\t\t\t\t$( event.target ).closest( this.options.cancel ).length : false );\n\t\tif ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif ( !this.mouseDelayMet ) {\n\t\t\tthis._mouseDelayTimer = setTimeout( function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay );\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted = ( this._mouseStart( event ) !== false );\n\t\t\tif ( !this._mouseStarted ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif ( true === $.data( event.target, this.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t$.removeData( event.target, this.widgetName + \".preventClickEvent\" );\n\t\t}\n\n\t\t// These delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function( event ) {\n\t\t\treturn that._mouseMove( event );\n\t\t};\n\t\tthis._mouseUpDelegate = function( event ) {\n\t\t\treturn that._mouseUp( event );\n\t\t};\n\n\t\tthis.document\n\t\t\t.on( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.on( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tevent.preventDefault();\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function( event ) {\n\n\t\t// Only check for mouseups outside the document if you've moved inside the document\n\t\t// at least once. This prevents the firing of mouseup in the case of IE<9, which will\n\t\t// fire a mousemove event if content is placed under the cursor. See #7778\n\t\t// Support: IE <9\n\t\tif ( this._mouseMoved ) {\n\n\t\t\t// IE mouseup check - mouseup happened when mouse was out of window\n\t\t\tif ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&\n\t\t\t\t\t!event.button ) {\n\t\t\t\treturn this._mouseUp( event );\n\n\t\t\t// Iframe mouseup check - mouseup occurred in another document\n\t\t\t} else if ( !event.which ) {\n\n\t\t\t\t// Support: Safari <=8 - 9\n\t\t\t\t// Safari sets which to 0 if you press any of the following keys\n\t\t\t\t// during a drag (#14461)\n\t\t\t\tif ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||\n\t\t\t\t\t\tevent.originalEvent.metaKey || event.originalEvent.shiftKey ) {\n\t\t\t\t\tthis.ignoreMissingWhich = true;\n\t\t\t\t} else if ( !this.ignoreMissingWhich ) {\n\t\t\t\t\treturn this._mouseUp( event );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( event.which || event.button ) {\n\t\t\tthis._mouseMoved = true;\n\t\t}\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseDrag( event );\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t( this._mouseStart( this._mouseDownEvent, event ) !== false );\n\t\t\tif ( this._mouseStarted ) {\n\t\t\t\tthis._mouseDrag( event );\n\t\t\t} else {\n\t\t\t\tthis._mouseUp( event );\n\t\t\t}\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis.document\n\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif ( event.target === this._mouseDownEvent.target ) {\n\t\t\t\t$.data( event.target, this.widgetName + \".preventClickEvent\", true );\n\t\t\t}\n\n\t\t\tthis._mouseStop( event );\n\t\t}\n\n\t\tif ( this._mouseDelayTimer ) {\n\t\t\tclearTimeout( this._mouseDelayTimer );\n\t\t\tdelete this._mouseDelayTimer;\n\t\t}\n\n\t\tthis.ignoreMissingWhich = false;\n\t\tmouseHandled = false;\n\t\tevent.preventDefault();\n\t},\n\n\t_mouseDistanceMet: function( event ) {\n\t\treturn ( Math.max(\n\t\t\t\tMath.abs( this._mouseDownEvent.pageX - event.pageX ),\n\t\t\t\tMath.abs( this._mouseDownEvent.pageY - event.pageY )\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function( /* event */ ) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function( /* event */ ) {},\n\t_mouseDrag: function( /* event */ ) {},\n\t_mouseStop: function( /* event */ ) {},\n\t_mouseCapture: function( /* event */ ) {\n\t\treturn true;\n\t}\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/progressbar.js",
    "content": "/*!\n * jQuery UI Progressbar 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Progressbar\n//>>group: Widgets\n/* eslint-disable max-len */\n//>>description: Displays a status indicator for loading state, standard percentage, and other progress indicators.\n/* eslint-enable max-len */\n//>>docs: http://api.jqueryui.com/progressbar/\n//>>demos: http://jqueryui.com/progressbar/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/progressbar.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.widget( \"ui.progressbar\", {\n\tversion: \"1.13.0\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-progressbar\": \"ui-corner-all\",\n\t\t\t\"ui-progressbar-value\": \"ui-corner-left\",\n\t\t\t\"ui-progressbar-complete\": \"ui-corner-right\"\n\t\t},\n\t\tmax: 100,\n\t\tvalue: 0,\n\n\t\tchange: null,\n\t\tcomplete: null\n\t},\n\n\tmin: 0,\n\n\t_create: function() {\n\n\t\t// Constrain initial value\n\t\tthis.oldValue = this.options.value = this._constrainedValue();\n\n\t\tthis.element.attr( {\n\n\t\t\t// Only set static values; aria-valuenow and aria-valuemax are\n\t\t\t// set inside _refreshValue()\n\t\t\trole: \"progressbar\",\n\t\t\t\"aria-valuemin\": this.min\n\t\t} );\n\t\tthis._addClass( \"ui-progressbar\", \"ui-widget ui-widget-content\" );\n\n\t\tthis.valueDiv = $( \"<div>\" ).appendTo( this.element );\n\t\tthis._addClass( this.valueDiv, \"ui-progressbar-value\", \"ui-widget-header\" );\n\t\tthis._refreshValue();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element.removeAttr( \"role aria-valuemin aria-valuemax aria-valuenow\" );\n\n\t\tthis.valueDiv.remove();\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\treturn this.options.value;\n\t\t}\n\n\t\tthis.options.value = this._constrainedValue( newValue );\n\t\tthis._refreshValue();\n\t},\n\n\t_constrainedValue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\tnewValue = this.options.value;\n\t\t}\n\n\t\tthis.indeterminate = newValue === false;\n\n\t\t// Sanitize value\n\t\tif ( typeof newValue !== \"number\" ) {\n\t\t\tnewValue = 0;\n\t\t}\n\n\t\treturn this.indeterminate ? false :\n\t\t\tMath.min( this.options.max, Math.max( this.min, newValue ) );\n\t},\n\n\t_setOptions: function( options ) {\n\n\t\t// Ensure \"value\" option is set after other values (like max)\n\t\tvar value = options.value;\n\t\tdelete options.value;\n\n\t\tthis._super( options );\n\n\t\tthis.options.value = this._constrainedValue( value );\n\t\tthis._refreshValue();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"max\" ) {\n\n\t\t\t// Don't allow a max less than min\n\t\t\tvalue = Math.max( this.min, value );\n\t\t}\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.element.attr( \"aria-disabled\", value );\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t},\n\n\t_percentage: function() {\n\t\treturn this.indeterminate ?\n\t\t\t100 :\n\t\t\t100 * ( this.options.value - this.min ) / ( this.options.max - this.min );\n\t},\n\n\t_refreshValue: function() {\n\t\tvar value = this.options.value,\n\t\t\tpercentage = this._percentage();\n\n\t\tthis.valueDiv\n\t\t\t.toggle( this.indeterminate || value > this.min )\n\t\t\t.width( percentage.toFixed( 0 ) + \"%\" );\n\n\t\tthis\n\t\t\t._toggleClass( this.valueDiv, \"ui-progressbar-complete\", null,\n\t\t\t\tvalue === this.options.max )\n\t\t\t._toggleClass( \"ui-progressbar-indeterminate\", null, this.indeterminate );\n\n\t\tif ( this.indeterminate ) {\n\t\t\tthis.element.removeAttr( \"aria-valuenow\" );\n\t\t\tif ( !this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv = $( \"<div>\" ).appendTo( this.valueDiv );\n\t\t\t\tthis._addClass( this.overlayDiv, \"ui-progressbar-overlay\" );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.element.attr( {\n\t\t\t\t\"aria-valuemax\": this.options.max,\n\t\t\t\t\"aria-valuenow\": value\n\t\t\t} );\n\t\t\tif ( this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv.remove();\n\t\t\t\tthis.overlayDiv = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( this.oldValue !== value ) {\n\t\t\tthis.oldValue = value;\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t\tif ( value === this.options.max ) {\n\t\t\tthis._trigger( \"complete\" );\n\t\t}\n\t}\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/resizable.js",
    "content": "/*!\n * jQuery UI Resizable 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Resizable\n//>>group: Interactions\n//>>description: Enables resize functionality for any element.\n//>>docs: http://api.jqueryui.com/resizable/\n//>>demos: http://jqueryui.com/resizable/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/resizable.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./mouse\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.widget( \"ui.resizable\", $.ui.mouse, {\n\tversion: \"1.13.0\",\n\twidgetEventPrefix: \"resize\",\n\toptions: {\n\t\talsoResize: false,\n\t\tanimate: false,\n\t\tanimateDuration: \"slow\",\n\t\tanimateEasing: \"swing\",\n\t\taspectRatio: false,\n\t\tautoHide: false,\n\t\tclasses: {\n\t\t\t\"ui-resizable-se\": \"ui-icon ui-icon-gripsmall-diagonal-se\"\n\t\t},\n\t\tcontainment: false,\n\t\tghost: false,\n\t\tgrid: false,\n\t\thandles: \"e,s,se\",\n\t\thelper: false,\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 10,\n\t\tminWidth: 10,\n\n\t\t// See #7960\n\t\tzIndex: 90,\n\n\t\t// Callbacks\n\t\tresize: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_num: function( value ) {\n\t\treturn parseFloat( value ) || 0;\n\t},\n\n\t_isNumber: function( value ) {\n\t\treturn !isNaN( parseFloat( value ) );\n\t},\n\n\t_hasScroll: function( el, a ) {\n\n\t\tif ( $( el ).css( \"overflow\" ) === \"hidden\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar scroll = ( a && a === \"left\" ) ? \"scrollLeft\" : \"scrollTop\",\n\t\t\thas = false;\n\n\t\tif ( el[ scroll ] > 0 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: determine which cases actually cause this to happen\n\t\t// if the element doesn't have the scroll set, see if it's possible to\n\t\t// set the scroll\n\t\ttry {\n\t\t\tel[ scroll ] = 1;\n\t\t\thas = ( el[ scroll ] > 0 );\n\t\t\tel[ scroll ] = 0;\n\t\t} catch ( e ) {\n\n\t\t\t// `el` might be a string, then setting `scroll` will throw\n\t\t\t// an error in strict mode; ignore it.\n\t\t}\n\t\treturn has;\n\t},\n\n\t_create: function() {\n\n\t\tvar margins,\n\t\t\to = this.options,\n\t\t\tthat = this;\n\t\tthis._addClass( \"ui-resizable\" );\n\n\t\t$.extend( this, {\n\t\t\t_aspectRatio: !!( o.aspectRatio ),\n\t\t\taspectRatio: o.aspectRatio,\n\t\t\toriginalElement: this.element,\n\t\t\t_proportionallyResizeElements: [],\n\t\t\t_helper: o.helper || o.ghost || o.animate ? o.helper || \"ui-resizable-helper\" : null\n\t\t} );\n\n\t\t// Wrap the element if it cannot hold child nodes\n\t\tif ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {\n\n\t\t\tthis.element.wrap(\n\t\t\t\t$( \"<div class='ui-wrapper'></div>\" ).css( {\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\tposition: this.element.css( \"position\" ),\n\t\t\t\t\twidth: this.element.outerWidth(),\n\t\t\t\t\theight: this.element.outerHeight(),\n\t\t\t\t\ttop: this.element.css( \"top\" ),\n\t\t\t\t\tleft: this.element.css( \"left\" )\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\tthis.element = this.element.parent().data(\n\t\t\t\t\"ui-resizable\", this.element.resizable( \"instance\" )\n\t\t\t);\n\n\t\t\tthis.elementIsWrapper = true;\n\n\t\t\tmargins = {\n\t\t\t\tmarginTop: this.originalElement.css( \"marginTop\" ),\n\t\t\t\tmarginRight: this.originalElement.css( \"marginRight\" ),\n\t\t\t\tmarginBottom: this.originalElement.css( \"marginBottom\" ),\n\t\t\t\tmarginLeft: this.originalElement.css( \"marginLeft\" )\n\t\t\t};\n\n\t\t\tthis.element.css( margins );\n\t\t\tthis.originalElement.css( \"margin\", 0 );\n\n\t\t\t// support: Safari\n\t\t\t// Prevent Safari textarea resize\n\t\t\tthis.originalResizeStyle = this.originalElement.css( \"resize\" );\n\t\t\tthis.originalElement.css( \"resize\", \"none\" );\n\n\t\t\tthis._proportionallyResizeElements.push( this.originalElement.css( {\n\t\t\t\tposition: \"static\",\n\t\t\t\tzoom: 1,\n\t\t\t\tdisplay: \"block\"\n\t\t\t} ) );\n\n\t\t\t// Support: IE9\n\t\t\t// avoid IE jump (hard set the margin)\n\t\t\tthis.originalElement.css( margins );\n\n\t\t\tthis._proportionallyResize();\n\t\t}\n\n\t\tthis._setupHandles();\n\n\t\tif ( o.autoHide ) {\n\t\t\t$( this.element )\n\t\t\t\t.on( \"mouseenter\", function() {\n\t\t\t\t\tif ( o.disabled ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthat._removeClass( \"ui-resizable-autohide\" );\n\t\t\t\t\tthat._handles.show();\n\t\t\t\t} )\n\t\t\t\t.on( \"mouseleave\", function() {\n\t\t\t\t\tif ( o.disabled ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif ( !that.resizing ) {\n\t\t\t\t\t\tthat._addClass( \"ui-resizable-autohide\" );\n\t\t\t\t\t\tthat._handles.hide();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}\n\n\t\tthis._mouseInit();\n\t},\n\n\t_destroy: function() {\n\n\t\tthis._mouseDestroy();\n\t\tthis._addedHandles.remove();\n\n\t\tvar wrapper,\n\t\t\t_destroy = function( exp ) {\n\t\t\t\t$( exp )\n\t\t\t\t\t.removeData( \"resizable\" )\n\t\t\t\t\t.removeData( \"ui-resizable\" )\n\t\t\t\t\t.off( \".resizable\" );\n\t\t\t};\n\n\t\t// TODO: Unwrap at same DOM position\n\t\tif ( this.elementIsWrapper ) {\n\t\t\t_destroy( this.element );\n\t\t\twrapper = this.element;\n\t\t\tthis.originalElement.css( {\n\t\t\t\tposition: wrapper.css( \"position\" ),\n\t\t\t\twidth: wrapper.outerWidth(),\n\t\t\t\theight: wrapper.outerHeight(),\n\t\t\t\ttop: wrapper.css( \"top\" ),\n\t\t\t\tleft: wrapper.css( \"left\" )\n\t\t\t} ).insertAfter( wrapper );\n\t\t\twrapper.remove();\n\t\t}\n\n\t\tthis.originalElement.css( \"resize\", this.originalResizeStyle );\n\t\t_destroy( this.originalElement );\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tswitch ( key ) {\n\t\tcase \"handles\":\n\t\t\tthis._removeHandles();\n\t\t\tthis._setupHandles();\n\t\t\tbreak;\n\t\tcase \"aspectRatio\":\n\t\t\tthis._aspectRatio = !!value;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t},\n\n\t_setupHandles: function() {\n\t\tvar o = this.options, handle, i, n, hname, axis, that = this;\n\t\tthis.handles = o.handles ||\n\t\t\t( !$( \".ui-resizable-handle\", this.element ).length ?\n\t\t\t\t\"e,s,se\" : {\n\t\t\t\t\tn: \".ui-resizable-n\",\n\t\t\t\t\te: \".ui-resizable-e\",\n\t\t\t\t\ts: \".ui-resizable-s\",\n\t\t\t\t\tw: \".ui-resizable-w\",\n\t\t\t\t\tse: \".ui-resizable-se\",\n\t\t\t\t\tsw: \".ui-resizable-sw\",\n\t\t\t\t\tne: \".ui-resizable-ne\",\n\t\t\t\t\tnw: \".ui-resizable-nw\"\n\t\t\t\t} );\n\n\t\tthis._handles = $();\n\t\tthis._addedHandles = $();\n\t\tif ( this.handles.constructor === String ) {\n\n\t\t\tif ( this.handles === \"all\" ) {\n\t\t\t\tthis.handles = \"n,e,s,w,se,sw,ne,nw\";\n\t\t\t}\n\n\t\t\tn = this.handles.split( \",\" );\n\t\t\tthis.handles = {};\n\n\t\t\tfor ( i = 0; i < n.length; i++ ) {\n\n\t\t\t\thandle = String.prototype.trim.call( n[ i ] );\n\t\t\t\thname = \"ui-resizable-\" + handle;\n\t\t\t\taxis = $( \"<div>\" );\n\t\t\t\tthis._addClass( axis, \"ui-resizable-handle \" + hname );\n\n\t\t\t\taxis.css( { zIndex: o.zIndex } );\n\n\t\t\t\tthis.handles[ handle ] = \".ui-resizable-\" + handle;\n\t\t\t\tif ( !this.element.children( this.handles[ handle ] ).length ) {\n\t\t\t\t\tthis.element.append( axis );\n\t\t\t\t\tthis._addedHandles = this._addedHandles.add( axis );\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tthis._renderAxis = function( target ) {\n\n\t\t\tvar i, axis, padPos, padWrapper;\n\n\t\t\ttarget = target || this.element;\n\n\t\t\tfor ( i in this.handles ) {\n\n\t\t\t\tif ( this.handles[ i ].constructor === String ) {\n\t\t\t\t\tthis.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();\n\t\t\t\t} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {\n\t\t\t\t\tthis.handles[ i ] = $( this.handles[ i ] );\n\t\t\t\t\tthis._on( this.handles[ i ], { \"mousedown\": that._mouseDown } );\n\t\t\t\t}\n\n\t\t\t\tif ( this.elementIsWrapper &&\n\t\t\t\t\t\tthis.originalElement[ 0 ]\n\t\t\t\t\t\t\t.nodeName\n\t\t\t\t\t\t\t.match( /^(textarea|input|select|button)$/i ) ) {\n\t\t\t\t\taxis = $( this.handles[ i ], this.element );\n\n\t\t\t\t\tpadWrapper = /sw|ne|nw|se|n|s/.test( i ) ?\n\t\t\t\t\t\taxis.outerHeight() :\n\t\t\t\t\t\taxis.outerWidth();\n\n\t\t\t\t\tpadPos = [ \"padding\",\n\t\t\t\t\t\t/ne|nw|n/.test( i ) ? \"Top\" :\n\t\t\t\t\t\t/se|sw|s/.test( i ) ? \"Bottom\" :\n\t\t\t\t\t\t/^e$/.test( i ) ? \"Right\" : \"Left\" ].join( \"\" );\n\n\t\t\t\t\ttarget.css( padPos, padWrapper );\n\n\t\t\t\t\tthis._proportionallyResize();\n\t\t\t\t}\n\n\t\t\t\tthis._handles = this._handles.add( this.handles[ i ] );\n\t\t\t}\n\t\t};\n\n\t\t// TODO: make renderAxis a prototype function\n\t\tthis._renderAxis( this.element );\n\n\t\tthis._handles = this._handles.add( this.element.find( \".ui-resizable-handle\" ) );\n\t\tthis._handles.disableSelection();\n\n\t\tthis._handles.on( \"mouseover\", function() {\n\t\t\tif ( !that.resizing ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\taxis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );\n\t\t\t\t}\n\t\t\t\tthat.axis = axis && axis[ 1 ] ? axis[ 1 ] : \"se\";\n\t\t\t}\n\t\t} );\n\n\t\tif ( o.autoHide ) {\n\t\t\tthis._handles.hide();\n\t\t\tthis._addClass( \"ui-resizable-autohide\" );\n\t\t}\n\t},\n\n\t_removeHandles: function() {\n\t\tthis._addedHandles.remove();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar i, handle,\n\t\t\tcapture = false;\n\n\t\tfor ( i in this.handles ) {\n\t\t\thandle = $( this.handles[ i ] )[ 0 ];\n\t\t\tif ( handle === event.target || $.contains( handle, event.target ) ) {\n\t\t\t\tcapture = true;\n\t\t\t}\n\t\t}\n\n\t\treturn !this.options.disabled && capture;\n\t},\n\n\t_mouseStart: function( event ) {\n\n\t\tvar curleft, curtop, cursor,\n\t\t\to = this.options,\n\t\t\tel = this.element;\n\n\t\tthis.resizing = true;\n\n\t\tthis._renderProxy();\n\n\t\tcurleft = this._num( this.helper.css( \"left\" ) );\n\t\tcurtop = this._num( this.helper.css( \"top\" ) );\n\n\t\tif ( o.containment ) {\n\t\t\tcurleft += $( o.containment ).scrollLeft() || 0;\n\t\t\tcurtop += $( o.containment ).scrollTop() || 0;\n\t\t}\n\n\t\tthis.offset = this.helper.offset();\n\t\tthis.position = { left: curleft, top: curtop };\n\n\t\tthis.size = this._helper ? {\n\t\t\t\twidth: this.helper.width(),\n\t\t\t\theight: this.helper.height()\n\t\t\t} : {\n\t\t\t\twidth: el.width(),\n\t\t\t\theight: el.height()\n\t\t\t};\n\n\t\tthis.originalSize = this._helper ? {\n\t\t\t\twidth: el.outerWidth(),\n\t\t\t\theight: el.outerHeight()\n\t\t\t} : {\n\t\t\t\twidth: el.width(),\n\t\t\t\theight: el.height()\n\t\t\t};\n\n\t\tthis.sizeDiff = {\n\t\t\twidth: el.outerWidth() - el.width(),\n\t\t\theight: el.outerHeight() - el.height()\n\t\t};\n\n\t\tthis.originalPosition = { left: curleft, top: curtop };\n\t\tthis.originalMousePosition = { left: event.pageX, top: event.pageY };\n\n\t\tthis.aspectRatio = ( typeof o.aspectRatio === \"number\" ) ?\n\t\t\to.aspectRatio :\n\t\t\t( ( this.originalSize.width / this.originalSize.height ) || 1 );\n\n\t\tcursor = $( \".ui-resizable-\" + this.axis ).css( \"cursor\" );\n\t\t$( \"body\" ).css( \"cursor\", cursor === \"auto\" ? this.axis + \"-resize\" : cursor );\n\n\t\tthis._addClass( \"ui-resizable-resizing\" );\n\t\tthis._propagate( \"start\", event );\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function( event ) {\n\n\t\tvar data, props,\n\t\t\tsmp = this.originalMousePosition,\n\t\t\ta = this.axis,\n\t\t\tdx = ( event.pageX - smp.left ) || 0,\n\t\t\tdy = ( event.pageY - smp.top ) || 0,\n\t\t\ttrigger = this._change[ a ];\n\n\t\tthis._updatePrevProperties();\n\n\t\tif ( !trigger ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tdata = trigger.apply( this, [ event, dx, dy ] );\n\n\t\tthis._updateVirtualBoundaries( event.shiftKey );\n\t\tif ( this._aspectRatio || event.shiftKey ) {\n\t\t\tdata = this._updateRatio( data, event );\n\t\t}\n\n\t\tdata = this._respectSize( data, event );\n\n\t\tthis._updateCache( data );\n\n\t\tthis._propagate( \"resize\", event );\n\n\t\tprops = this._applyChanges();\n\n\t\tif ( !this._helper && this._proportionallyResizeElements.length ) {\n\t\t\tthis._proportionallyResize();\n\t\t}\n\n\t\tif ( !$.isEmptyObject( props ) ) {\n\t\t\tthis._updatePrevProperties();\n\t\t\tthis._trigger( \"resize\", event, this.ui() );\n\t\t\tthis._applyChanges();\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\n\t\tthis.resizing = false;\n\t\tvar pr, ista, soffseth, soffsetw, s, left, top,\n\t\t\to = this.options, that = this;\n\n\t\tif ( this._helper ) {\n\n\t\t\tpr = this._proportionallyResizeElements;\n\t\t\tista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );\n\t\t\tsoffseth = ista && this._hasScroll( pr[ 0 ], \"left\" ) ? 0 : that.sizeDiff.height;\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width;\n\n\t\t\ts = {\n\t\t\t\twidth: ( that.helper.width()  - soffsetw ),\n\t\t\t\theight: ( that.helper.height() - soffseth )\n\t\t\t};\n\t\t\tleft = ( parseFloat( that.element.css( \"left\" ) ) +\n\t\t\t\t( that.position.left - that.originalPosition.left ) ) || null;\n\t\t\ttop = ( parseFloat( that.element.css( \"top\" ) ) +\n\t\t\t\t( that.position.top - that.originalPosition.top ) ) || null;\n\n\t\t\tif ( !o.animate ) {\n\t\t\t\tthis.element.css( $.extend( s, { top: top, left: left } ) );\n\t\t\t}\n\n\t\t\tthat.helper.height( that.size.height );\n\t\t\tthat.helper.width( that.size.width );\n\n\t\t\tif ( this._helper && !o.animate ) {\n\t\t\t\tthis._proportionallyResize();\n\t\t\t}\n\t\t}\n\n\t\t$( \"body\" ).css( \"cursor\", \"auto\" );\n\n\t\tthis._removeClass( \"ui-resizable-resizing\" );\n\n\t\tthis._propagate( \"stop\", event );\n\n\t\tif ( this._helper ) {\n\t\t\tthis.helper.remove();\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\t_updatePrevProperties: function() {\n\t\tthis.prevPosition = {\n\t\t\ttop: this.position.top,\n\t\t\tleft: this.position.left\n\t\t};\n\t\tthis.prevSize = {\n\t\t\twidth: this.size.width,\n\t\t\theight: this.size.height\n\t\t};\n\t},\n\n\t_applyChanges: function() {\n\t\tvar props = {};\n\n\t\tif ( this.position.top !== this.prevPosition.top ) {\n\t\t\tprops.top = this.position.top + \"px\";\n\t\t}\n\t\tif ( this.position.left !== this.prevPosition.left ) {\n\t\t\tprops.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( this.size.width !== this.prevSize.width ) {\n\t\t\tprops.width = this.size.width + \"px\";\n\t\t}\n\t\tif ( this.size.height !== this.prevSize.height ) {\n\t\t\tprops.height = this.size.height + \"px\";\n\t\t}\n\n\t\tthis.helper.css( props );\n\n\t\treturn props;\n\t},\n\n\t_updateVirtualBoundaries: function( forceAspectRatio ) {\n\t\tvar pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,\n\t\t\to = this.options;\n\n\t\tb = {\n\t\t\tminWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,\n\t\t\tmaxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,\n\t\t\tminHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,\n\t\t\tmaxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity\n\t\t};\n\n\t\tif ( this._aspectRatio || forceAspectRatio ) {\n\t\t\tpMinWidth = b.minHeight * this.aspectRatio;\n\t\t\tpMinHeight = b.minWidth / this.aspectRatio;\n\t\t\tpMaxWidth = b.maxHeight * this.aspectRatio;\n\t\t\tpMaxHeight = b.maxWidth / this.aspectRatio;\n\n\t\t\tif ( pMinWidth > b.minWidth ) {\n\t\t\t\tb.minWidth = pMinWidth;\n\t\t\t}\n\t\t\tif ( pMinHeight > b.minHeight ) {\n\t\t\t\tb.minHeight = pMinHeight;\n\t\t\t}\n\t\t\tif ( pMaxWidth < b.maxWidth ) {\n\t\t\t\tb.maxWidth = pMaxWidth;\n\t\t\t}\n\t\t\tif ( pMaxHeight < b.maxHeight ) {\n\t\t\t\tb.maxHeight = pMaxHeight;\n\t\t\t}\n\t\t}\n\t\tthis._vBoundaries = b;\n\t},\n\n\t_updateCache: function( data ) {\n\t\tthis.offset = this.helper.offset();\n\t\tif ( this._isNumber( data.left ) ) {\n\t\t\tthis.position.left = data.left;\n\t\t}\n\t\tif ( this._isNumber( data.top ) ) {\n\t\t\tthis.position.top = data.top;\n\t\t}\n\t\tif ( this._isNumber( data.height ) ) {\n\t\t\tthis.size.height = data.height;\n\t\t}\n\t\tif ( this._isNumber( data.width ) ) {\n\t\t\tthis.size.width = data.width;\n\t\t}\n\t},\n\n\t_updateRatio: function( data ) {\n\n\t\tvar cpos = this.position,\n\t\t\tcsize = this.size,\n\t\t\ta = this.axis;\n\n\t\tif ( this._isNumber( data.height ) ) {\n\t\t\tdata.width = ( data.height * this.aspectRatio );\n\t\t} else if ( this._isNumber( data.width ) ) {\n\t\t\tdata.height = ( data.width / this.aspectRatio );\n\t\t}\n\n\t\tif ( a === \"sw\" ) {\n\t\t\tdata.left = cpos.left + ( csize.width - data.width );\n\t\t\tdata.top = null;\n\t\t}\n\t\tif ( a === \"nw\" ) {\n\t\t\tdata.top = cpos.top + ( csize.height - data.height );\n\t\t\tdata.left = cpos.left + ( csize.width - data.width );\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_respectSize: function( data ) {\n\n\t\tvar o = this._vBoundaries,\n\t\t\ta = this.axis,\n\t\t\tismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),\n\t\t\tismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),\n\t\t\tisminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),\n\t\t\tisminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),\n\t\t\tdw = this.originalPosition.left + this.originalSize.width,\n\t\t\tdh = this.originalPosition.top + this.originalSize.height,\n\t\t\tcw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );\n\t\tif ( isminw ) {\n\t\t\tdata.width = o.minWidth;\n\t\t}\n\t\tif ( isminh ) {\n\t\t\tdata.height = o.minHeight;\n\t\t}\n\t\tif ( ismaxw ) {\n\t\t\tdata.width = o.maxWidth;\n\t\t}\n\t\tif ( ismaxh ) {\n\t\t\tdata.height = o.maxHeight;\n\t\t}\n\n\t\tif ( isminw && cw ) {\n\t\t\tdata.left = dw - o.minWidth;\n\t\t}\n\t\tif ( ismaxw && cw ) {\n\t\t\tdata.left = dw - o.maxWidth;\n\t\t}\n\t\tif ( isminh && ch ) {\n\t\t\tdata.top = dh - o.minHeight;\n\t\t}\n\t\tif ( ismaxh && ch ) {\n\t\t\tdata.top = dh - o.maxHeight;\n\t\t}\n\n\t\t// Fixing jump error on top/left - bug #2330\n\t\tif ( !data.width && !data.height && !data.left && data.top ) {\n\t\t\tdata.top = null;\n\t\t} else if ( !data.width && !data.height && !data.top && data.left ) {\n\t\t\tdata.left = null;\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_getPaddingPlusBorderDimensions: function( element ) {\n\t\tvar i = 0,\n\t\t\twidths = [],\n\t\t\tborders = [\n\t\t\t\telement.css( \"borderTopWidth\" ),\n\t\t\t\telement.css( \"borderRightWidth\" ),\n\t\t\t\telement.css( \"borderBottomWidth\" ),\n\t\t\t\telement.css( \"borderLeftWidth\" )\n\t\t\t],\n\t\t\tpaddings = [\n\t\t\t\telement.css( \"paddingTop\" ),\n\t\t\t\telement.css( \"paddingRight\" ),\n\t\t\t\telement.css( \"paddingBottom\" ),\n\t\t\t\telement.css( \"paddingLeft\" )\n\t\t\t];\n\n\t\tfor ( ; i < 4; i++ ) {\n\t\t\twidths[ i ] = ( parseFloat( borders[ i ] ) || 0 );\n\t\t\twidths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );\n\t\t}\n\n\t\treturn {\n\t\t\theight: widths[ 0 ] + widths[ 2 ],\n\t\t\twidth: widths[ 1 ] + widths[ 3 ]\n\t\t};\n\t},\n\n\t_proportionallyResize: function() {\n\n\t\tif ( !this._proportionallyResizeElements.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar prel,\n\t\t\ti = 0,\n\t\t\telement = this.helper || this.element;\n\n\t\tfor ( ; i < this._proportionallyResizeElements.length; i++ ) {\n\n\t\t\tprel = this._proportionallyResizeElements[ i ];\n\n\t\t\t// TODO: Seems like a bug to cache this.outerDimensions\n\t\t\t// considering that we are in a loop.\n\t\t\tif ( !this.outerDimensions ) {\n\t\t\t\tthis.outerDimensions = this._getPaddingPlusBorderDimensions( prel );\n\t\t\t}\n\n\t\t\tprel.css( {\n\t\t\t\theight: ( element.height() - this.outerDimensions.height ) || 0,\n\t\t\t\twidth: ( element.width() - this.outerDimensions.width ) || 0\n\t\t\t} );\n\n\t\t}\n\n\t},\n\n\t_renderProxy: function() {\n\n\t\tvar el = this.element, o = this.options;\n\t\tthis.elementOffset = el.offset();\n\n\t\tif ( this._helper ) {\n\n\t\t\tthis.helper = this.helper || $( \"<div></div>\" ).css( { overflow: \"hidden\" } );\n\n\t\t\tthis._addClass( this.helper, this._helper );\n\t\t\tthis.helper.css( {\n\t\t\t\twidth: this.element.outerWidth(),\n\t\t\t\theight: this.element.outerHeight(),\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: this.elementOffset.left + \"px\",\n\t\t\t\ttop: this.elementOffset.top + \"px\",\n\t\t\t\tzIndex: ++o.zIndex //TODO: Don't modify option\n\t\t\t} );\n\n\t\t\tthis.helper\n\t\t\t\t.appendTo( \"body\" )\n\t\t\t\t.disableSelection();\n\n\t\t} else {\n\t\t\tthis.helper = this.element;\n\t\t}\n\n\t},\n\n\t_change: {\n\t\te: function( event, dx ) {\n\t\t\treturn { width: this.originalSize.width + dx };\n\t\t},\n\t\tw: function( event, dx ) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { left: sp.left + dx, width: cs.width - dx };\n\t\t},\n\t\tn: function( event, dx, dy ) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { top: sp.top + dy, height: cs.height - dy };\n\t\t},\n\t\ts: function( event, dx, dy ) {\n\t\t\treturn { height: this.originalSize.height + dy };\n\t\t},\n\t\tse: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.s.apply( this, arguments ),\n\t\t\t\tthis._change.e.apply( this, [ event, dx, dy ] ) );\n\t\t},\n\t\tsw: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.s.apply( this, arguments ),\n\t\t\t\tthis._change.w.apply( this, [ event, dx, dy ] ) );\n\t\t},\n\t\tne: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.n.apply( this, arguments ),\n\t\t\t\tthis._change.e.apply( this, [ event, dx, dy ] ) );\n\t\t},\n\t\tnw: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.n.apply( this, arguments ),\n\t\t\t\tthis._change.w.apply( this, [ event, dx, dy ] ) );\n\t\t}\n\t},\n\n\t_propagate: function( n, event ) {\n\t\t$.ui.plugin.call( this, n, [ event, this.ui() ] );\n\t\tif ( n !== \"resize\" ) {\n\t\t\tthis._trigger( n, event, this.ui() );\n\t\t}\n\t},\n\n\tplugins: {},\n\n\tui: function() {\n\t\treturn {\n\t\t\toriginalElement: this.originalElement,\n\t\t\telement: this.element,\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\tsize: this.size,\n\t\t\toriginalSize: this.originalSize,\n\t\t\toriginalPosition: this.originalPosition\n\t\t};\n\t}\n\n} );\n\n/*\n * Resizable Extensions\n */\n\n$.ui.plugin.add( \"resizable\", \"animate\", {\n\n\tstop: function( event ) {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tpr = that._proportionallyResizeElements,\n\t\t\tista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),\n\t\t\tsoffseth = ista && that._hasScroll( pr[ 0 ], \"left\" ) ? 0 : that.sizeDiff.height,\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width,\n\t\t\tstyle = {\n\t\t\t\twidth: ( that.size.width - soffsetw ),\n\t\t\t\theight: ( that.size.height - soffseth )\n\t\t\t},\n\t\t\tleft = ( parseFloat( that.element.css( \"left\" ) ) +\n\t\t\t\t( that.position.left - that.originalPosition.left ) ) || null,\n\t\t\ttop = ( parseFloat( that.element.css( \"top\" ) ) +\n\t\t\t\t( that.position.top - that.originalPosition.top ) ) || null;\n\n\t\tthat.element.animate(\n\t\t\t$.extend( style, top && left ? { top: top, left: left } : {} ), {\n\t\t\t\tduration: o.animateDuration,\n\t\t\t\teasing: o.animateEasing,\n\t\t\t\tstep: function() {\n\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\twidth: parseFloat( that.element.css( \"width\" ) ),\n\t\t\t\t\t\theight: parseFloat( that.element.css( \"height\" ) ),\n\t\t\t\t\t\ttop: parseFloat( that.element.css( \"top\" ) ),\n\t\t\t\t\t\tleft: parseFloat( that.element.css( \"left\" ) )\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( pr && pr.length ) {\n\t\t\t\t\t\t$( pr[ 0 ] ).css( { width: data.width, height: data.height } );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Propagating resize, and updating values for each animation step\n\t\t\t\t\tthat._updateCache( data );\n\t\t\t\t\tthat._propagate( \"resize\", event );\n\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n} );\n\n$.ui.plugin.add( \"resizable\", \"containment\", {\n\n\tstart: function() {\n\t\tvar element, p, co, ch, cw, width, height,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tel = that.element,\n\t\t\toc = o.containment,\n\t\t\tce = ( oc instanceof $ ) ?\n\t\t\t\toc.get( 0 ) :\n\t\t\t\t( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;\n\n\t\tif ( !ce ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthat.containerElement = $( ce );\n\n\t\tif ( /document/.test( oc ) || oc === document ) {\n\t\t\tthat.containerOffset = {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t};\n\t\t\tthat.containerPosition = {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t};\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: $( document ),\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: $( document ).width(),\n\t\t\t\theight: $( document ).height() || document.body.parentNode.scrollHeight\n\t\t\t};\n\t\t} else {\n\t\t\telement = $( ce );\n\t\t\tp = [];\n\t\t\t$( [ \"Top\", \"Right\", \"Left\", \"Bottom\" ] ).each( function( i, name ) {\n\t\t\t\tp[ i ] = that._num( element.css( \"padding\" + name ) );\n\t\t\t} );\n\n\t\t\tthat.containerOffset = element.offset();\n\t\t\tthat.containerPosition = element.position();\n\t\t\tthat.containerSize = {\n\t\t\t\theight: ( element.innerHeight() - p[ 3 ] ),\n\t\t\t\twidth: ( element.innerWidth() - p[ 1 ] )\n\t\t\t};\n\n\t\t\tco = that.containerOffset;\n\t\t\tch = that.containerSize.height;\n\t\t\tcw = that.containerSize.width;\n\t\t\twidth = ( that._hasScroll( ce, \"left\" ) ? ce.scrollWidth : cw );\n\t\t\theight = ( that._hasScroll( ce ) ? ce.scrollHeight : ch );\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: ce,\n\t\t\t\tleft: co.left,\n\t\t\t\ttop: co.top,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\t\t}\n\t},\n\n\tresize: function( event ) {\n\t\tvar woset, hoset, isParent, isOffsetRelative,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset,\n\t\t\tcp = that.position,\n\t\t\tpRatio = that._aspectRatio || event.shiftKey,\n\t\t\tcop = {\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t},\n\t\t\tce = that.containerElement,\n\t\t\tcontinueResize = true;\n\n\t\tif ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\tcop = co;\n\t\t}\n\n\t\tif ( cp.left < ( that._helper ? co.left : 0 ) ) {\n\t\t\tthat.size.width = that.size.width +\n\t\t\t\t( that._helper ?\n\t\t\t\t\t( that.position.left - co.left ) :\n\t\t\t\t\t( that.position.left - cop.left ) );\n\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t\tthat.position.left = o.helper ? co.left : 0;\n\t\t}\n\n\t\tif ( cp.top < ( that._helper ? co.top : 0 ) ) {\n\t\t\tthat.size.height = that.size.height +\n\t\t\t\t( that._helper ?\n\t\t\t\t\t( that.position.top - co.top ) :\n\t\t\t\t\tthat.position.top );\n\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t\tthat.position.top = that._helper ? co.top : 0;\n\t\t}\n\n\t\tisParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );\n\t\tisOffsetRelative = /relative|absolute/.test( that.containerElement.css( \"position\" ) );\n\n\t\tif ( isParent && isOffsetRelative ) {\n\t\t\tthat.offset.left = that.parentData.left + that.position.left;\n\t\t\tthat.offset.top = that.parentData.top + that.position.top;\n\t\t} else {\n\t\t\tthat.offset.left = that.element.offset().left;\n\t\t\tthat.offset.top = that.element.offset().top;\n\t\t}\n\n\t\twoset = Math.abs( that.sizeDiff.width +\n\t\t\t( that._helper ?\n\t\t\t\tthat.offset.left - cop.left :\n\t\t\t\t( that.offset.left - co.left ) ) );\n\n\t\thoset = Math.abs( that.sizeDiff.height +\n\t\t\t( that._helper ?\n\t\t\t\tthat.offset.top - cop.top :\n\t\t\t\t( that.offset.top - co.top ) ) );\n\n\t\tif ( woset + that.size.width >= that.parentData.width ) {\n\t\t\tthat.size.width = that.parentData.width - woset;\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( hoset + that.size.height >= that.parentData.height ) {\n\t\t\tthat.size.height = that.parentData.height - hoset;\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( !continueResize ) {\n\t\t\tthat.position.left = that.prevPosition.left;\n\t\t\tthat.position.top = that.prevPosition.top;\n\t\t\tthat.size.width = that.prevSize.width;\n\t\t\tthat.size.height = that.prevSize.height;\n\t\t}\n\t},\n\n\tstop: function() {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset,\n\t\t\tcop = that.containerPosition,\n\t\t\tce = that.containerElement,\n\t\t\thelper = $( that.helper ),\n\t\t\tho = helper.offset(),\n\t\t\tw = helper.outerWidth() - that.sizeDiff.width,\n\t\t\th = helper.outerHeight() - that.sizeDiff.height;\n\n\t\tif ( that._helper && !o.animate && ( /relative/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\t$( this ).css( {\n\t\t\t\tleft: ho.left - cop.left - co.left,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t} );\n\t\t}\n\n\t\tif ( that._helper && !o.animate && ( /static/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\t$( this ).css( {\n\t\t\t\tleft: ho.left - cop.left - co.left,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t} );\n\t\t}\n\t}\n} );\n\n$.ui.plugin.add( \"resizable\", \"alsoResize\", {\n\n\tstart: function() {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options;\n\n\t\t$( o.alsoResize ).each( function() {\n\t\t\tvar el = $( this );\n\t\t\tel.data( \"ui-resizable-alsoresize\", {\n\t\t\t\twidth: parseFloat( el.width() ), height: parseFloat( el.height() ),\n\t\t\t\tleft: parseFloat( el.css( \"left\" ) ), top: parseFloat( el.css( \"top\" ) )\n\t\t\t} );\n\t\t} );\n\t},\n\n\tresize: function( event, ui ) {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\tdelta = {\n\t\t\t\theight: ( that.size.height - os.height ) || 0,\n\t\t\t\twidth: ( that.size.width - os.width ) || 0,\n\t\t\t\ttop: ( that.position.top - op.top ) || 0,\n\t\t\t\tleft: ( that.position.left - op.left ) || 0\n\t\t\t};\n\n\t\t\t$( o.alsoResize ).each( function() {\n\t\t\t\tvar el = $( this ), start = $( this ).data( \"ui-resizable-alsoresize\" ), style = {},\n\t\t\t\t\tcss = el.parents( ui.originalElement[ 0 ] ).length ?\n\t\t\t\t\t\t\t[ \"width\", \"height\" ] :\n\t\t\t\t\t\t\t[ \"width\", \"height\", \"top\", \"left\" ];\n\n\t\t\t\t$.each( css, function( i, prop ) {\n\t\t\t\t\tvar sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );\n\t\t\t\t\tif ( sum && sum >= 0 ) {\n\t\t\t\t\t\tstyle[ prop ] = sum || null;\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tel.css( style );\n\t\t\t} );\n\t},\n\n\tstop: function() {\n\t\t$( this ).removeData( \"ui-resizable-alsoresize\" );\n\t}\n} );\n\n$.ui.plugin.add( \"resizable\", \"ghost\", {\n\n\tstart: function() {\n\n\t\tvar that = $( this ).resizable( \"instance\" ), cs = that.size;\n\n\t\tthat.ghost = that.originalElement.clone();\n\t\tthat.ghost.css( {\n\t\t\topacity: 0.25,\n\t\t\tdisplay: \"block\",\n\t\t\tposition: \"relative\",\n\t\t\theight: cs.height,\n\t\t\twidth: cs.width,\n\t\t\tmargin: 0,\n\t\t\tleft: 0,\n\t\t\ttop: 0\n\t\t} );\n\n\t\tthat._addClass( that.ghost, \"ui-resizable-ghost\" );\n\n\t\t// DEPRECATED\n\t\t// TODO: remove after 1.12\n\t\tif ( $.uiBackCompat !== false && typeof that.options.ghost === \"string\" ) {\n\n\t\t\t// Ghost option\n\t\t\tthat.ghost.addClass( this.options.ghost );\n\t\t}\n\n\t\tthat.ghost.appendTo( that.helper );\n\n\t},\n\n\tresize: function() {\n\t\tvar that = $( this ).resizable( \"instance\" );\n\t\tif ( that.ghost ) {\n\t\t\tthat.ghost.css( {\n\t\t\t\tposition: \"relative\",\n\t\t\t\theight: that.size.height,\n\t\t\t\twidth: that.size.width\n\t\t\t} );\n\t\t}\n\t},\n\n\tstop: function() {\n\t\tvar that = $( this ).resizable( \"instance\" );\n\t\tif ( that.ghost && that.helper ) {\n\t\t\tthat.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );\n\t\t}\n\t}\n\n} );\n\n$.ui.plugin.add( \"resizable\", \"grid\", {\n\n\tresize: function() {\n\t\tvar outerDimensions,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tcs = that.size,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\ta = that.axis,\n\t\t\tgrid = typeof o.grid === \"number\" ? [ o.grid, o.grid ] : o.grid,\n\t\t\tgridX = ( grid[ 0 ] || 1 ),\n\t\t\tgridY = ( grid[ 1 ] || 1 ),\n\t\t\tox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,\n\t\t\toy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,\n\t\t\tnewWidth = os.width + ox,\n\t\t\tnewHeight = os.height + oy,\n\t\t\tisMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),\n\t\t\tisMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),\n\t\t\tisMinWidth = o.minWidth && ( o.minWidth > newWidth ),\n\t\t\tisMinHeight = o.minHeight && ( o.minHeight > newHeight );\n\n\t\to.grid = grid;\n\n\t\tif ( isMinWidth ) {\n\t\t\tnewWidth += gridX;\n\t\t}\n\t\tif ( isMinHeight ) {\n\t\t\tnewHeight += gridY;\n\t\t}\n\t\tif ( isMaxWidth ) {\n\t\t\tnewWidth -= gridX;\n\t\t}\n\t\tif ( isMaxHeight ) {\n\t\t\tnewHeight -= gridY;\n\t\t}\n\n\t\tif ( /^(se|s|e)$/.test( a ) ) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t} else if ( /^(ne)$/.test( a ) ) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.top = op.top - oy;\n\t\t} else if ( /^(sw)$/.test( a ) ) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.left = op.left - ox;\n\t\t} else {\n\t\t\tif ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {\n\t\t\t\touterDimensions = that._getPaddingPlusBorderDimensions( this );\n\t\t\t}\n\n\t\t\tif ( newHeight - gridY > 0 ) {\n\t\t\t\tthat.size.height = newHeight;\n\t\t\t\tthat.position.top = op.top - oy;\n\t\t\t} else {\n\t\t\t\tnewHeight = gridY - outerDimensions.height;\n\t\t\t\tthat.size.height = newHeight;\n\t\t\t\tthat.position.top = op.top + os.height - newHeight;\n\t\t\t}\n\t\t\tif ( newWidth - gridX > 0 ) {\n\t\t\t\tthat.size.width = newWidth;\n\t\t\t\tthat.position.left = op.left - ox;\n\t\t\t} else {\n\t\t\t\tnewWidth = gridX - outerDimensions.width;\n\t\t\t\tthat.size.width = newWidth;\n\t\t\t\tthat.position.left = op.left + os.width - newWidth;\n\t\t\t}\n\t\t}\n\t}\n\n} );\n\nreturn $.ui.resizable;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/selectable.js",
    "content": "/*!\n * jQuery UI Selectable 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Selectable\n//>>group: Interactions\n//>>description: Allows groups of elements to be selected with the mouse.\n//>>docs: http://api.jqueryui.com/selectable/\n//>>demos: http://jqueryui.com/selectable/\n//>>css.structure: ../../themes/base/selectable.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./mouse\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.widget( \"ui.selectable\", $.ui.mouse, {\n\tversion: \"1.13.0\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoRefresh: true,\n\t\tdistance: 0,\n\t\tfilter: \"*\",\n\t\ttolerance: \"touch\",\n\n\t\t// Callbacks\n\t\tselected: null,\n\t\tselecting: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tunselected: null,\n\t\tunselecting: null\n\t},\n\t_create: function() {\n\t\tvar that = this;\n\n\t\tthis._addClass( \"ui-selectable\" );\n\n\t\tthis.dragged = false;\n\n\t\t// Cache selectee children based on filter\n\t\tthis.refresh = function() {\n\t\t\tthat.elementPos = $( that.element[ 0 ] ).offset();\n\t\t\tthat.selectees = $( that.options.filter, that.element[ 0 ] );\n\t\t\tthat._addClass( that.selectees, \"ui-selectee\" );\n\t\t\tthat.selectees.each( function() {\n\t\t\t\tvar $this = $( this ),\n\t\t\t\t\tselecteeOffset = $this.offset(),\n\t\t\t\t\tpos = {\n\t\t\t\t\t\tleft: selecteeOffset.left - that.elementPos.left,\n\t\t\t\t\t\ttop: selecteeOffset.top - that.elementPos.top\n\t\t\t\t\t};\n\t\t\t\t$.data( this, \"selectable-item\", {\n\t\t\t\t\telement: this,\n\t\t\t\t\t$element: $this,\n\t\t\t\t\tleft: pos.left,\n\t\t\t\t\ttop: pos.top,\n\t\t\t\t\tright: pos.left + $this.outerWidth(),\n\t\t\t\t\tbottom: pos.top + $this.outerHeight(),\n\t\t\t\t\tstartselected: false,\n\t\t\t\t\tselected: $this.hasClass( \"ui-selected\" ),\n\t\t\t\t\tselecting: $this.hasClass( \"ui-selecting\" ),\n\t\t\t\t\tunselecting: $this.hasClass( \"ui-unselecting\" )\n\t\t\t\t} );\n\t\t\t} );\n\t\t};\n\t\tthis.refresh();\n\n\t\tthis._mouseInit();\n\n\t\tthis.helper = $( \"<div>\" );\n\t\tthis._addClass( this.helper, \"ui-selectable-helper\" );\n\t},\n\n\t_destroy: function() {\n\t\tthis.selectees.removeData( \"selectable-item\" );\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseStart: function( event ) {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.opos = [ event.pageX, event.pageY ];\n\t\tthis.elementPos = $( this.element[ 0 ] ).offset();\n\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.selectees = $( options.filter, this.element[ 0 ] );\n\n\t\tthis._trigger( \"start\", event );\n\n\t\t$( options.appendTo ).append( this.helper );\n\n\t\t// position helper (lasso)\n\t\tthis.helper.css( {\n\t\t\t\"left\": event.pageX,\n\t\t\t\"top\": event.pageY,\n\t\t\t\"width\": 0,\n\t\t\t\"height\": 0\n\t\t} );\n\n\t\tif ( options.autoRefresh ) {\n\t\t\tthis.refresh();\n\t\t}\n\n\t\tthis.selectees.filter( \".ui-selected\" ).each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" );\n\t\t\tselectee.startselected = true;\n\t\t\tif ( !event.metaKey && !event.ctrlKey ) {\n\t\t\t\tthat._removeClass( selectee.$element, \"ui-selected\" );\n\t\t\t\tselectee.selected = false;\n\t\t\t\tthat._addClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\tselectee.unselecting = true;\n\n\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\t$( event.target ).parents().addBack().each( function() {\n\t\t\tvar doSelect,\n\t\t\t\tselectee = $.data( this, \"selectable-item\" );\n\t\t\tif ( selectee ) {\n\t\t\t\tdoSelect = ( !event.metaKey && !event.ctrlKey ) ||\n\t\t\t\t\t!selectee.$element.hasClass( \"ui-selected\" );\n\t\t\t\tthat._removeClass( selectee.$element, doSelect ? \"ui-unselecting\" : \"ui-selected\" )\n\t\t\t\t\t._addClass( selectee.$element, doSelect ? \"ui-selecting\" : \"ui-unselecting\" );\n\t\t\t\tselectee.unselecting = !doSelect;\n\t\t\t\tselectee.selecting = doSelect;\n\t\t\t\tselectee.selected = doSelect;\n\n\t\t\t\t// selectable (UN)SELECTING callback\n\t\t\t\tif ( doSelect ) {\n\t\t\t\t\tthat._trigger( \"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_mouseDrag: function( event ) {\n\n\t\tthis.dragged = true;\n\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tmp,\n\t\t\tthat = this,\n\t\t\toptions = this.options,\n\t\t\tx1 = this.opos[ 0 ],\n\t\t\ty1 = this.opos[ 1 ],\n\t\t\tx2 = event.pageX,\n\t\t\ty2 = event.pageY;\n\n\t\tif ( x1 > x2 ) {\n\t\t\ttmp = x2; x2 = x1; x1 = tmp;\n\t\t}\n\t\tif ( y1 > y2 ) {\n\t\t\ttmp = y2; y2 = y1; y1 = tmp;\n\t\t}\n\t\tthis.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } );\n\n\t\tthis.selectees.each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" ),\n\t\t\t\thit = false,\n\t\t\t\toffset = {};\n\n\t\t\t//prevent helper from being selected if appendTo: selectable\n\t\t\tif ( !selectee || selectee.element === that.element[ 0 ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\toffset.left   = selectee.left   + that.elementPos.left;\n\t\t\toffset.right  = selectee.right  + that.elementPos.left;\n\t\t\toffset.top    = selectee.top    + that.elementPos.top;\n\t\t\toffset.bottom = selectee.bottom + that.elementPos.top;\n\n\t\t\tif ( options.tolerance === \"touch\" ) {\n\t\t\t\thit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||\n                    offset.bottom < y1 ) );\n\t\t\t} else if ( options.tolerance === \"fit\" ) {\n\t\t\t\thit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&\n                    offset.bottom < y2 );\n\t\t\t}\n\n\t\t\tif ( hit ) {\n\n\t\t\t\t// SELECT\n\t\t\t\tif ( selectee.selected ) {\n\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selected\" );\n\t\t\t\t\tselectee.selected = false;\n\t\t\t\t}\n\t\t\t\tif ( selectee.unselecting ) {\n\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\t\tselectee.unselecting = false;\n\t\t\t\t}\n\t\t\t\tif ( !selectee.selecting ) {\n\t\t\t\t\tthat._addClass( selectee.$element, \"ui-selecting\" );\n\t\t\t\t\tselectee.selecting = true;\n\n\t\t\t\t\t// selectable SELECTING callback\n\t\t\t\t\tthat._trigger( \"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// UNSELECT\n\t\t\t\tif ( selectee.selecting ) {\n\t\t\t\t\tif ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) {\n\t\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selecting\" );\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tthat._addClass( selectee.$element, \"ui-selected\" );\n\t\t\t\t\t\tselectee.selected = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selecting\" );\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tif ( selectee.startselected ) {\n\t\t\t\t\t\t\tthat._addClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\t\t\t\tselectee.unselecting = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( selectee.selected ) {\n\t\t\t\t\tif ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) {\n\t\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selected\" );\n\t\t\t\t\t\tselectee.selected = false;\n\n\t\t\t\t\t\tthat._addClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\t\t\tselectee.unselecting = true;\n\n\t\t\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\t\tvar that = this;\n\n\t\tthis.dragged = false;\n\n\t\t$( \".ui-unselecting\", this.element[ 0 ] ).each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" );\n\t\t\tthat._removeClass( selectee.$element, \"ui-unselecting\" );\n\t\t\tselectee.unselecting = false;\n\t\t\tselectee.startselected = false;\n\t\t\tthat._trigger( \"unselected\", event, {\n\t\t\t\tunselected: selectee.element\n\t\t\t} );\n\t\t} );\n\t\t$( \".ui-selecting\", this.element[ 0 ] ).each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" );\n\t\t\tthat._removeClass( selectee.$element, \"ui-selecting\" )\n\t\t\t\t._addClass( selectee.$element, \"ui-selected\" );\n\t\t\tselectee.selecting = false;\n\t\t\tselectee.selected = true;\n\t\t\tselectee.startselected = true;\n\t\t\tthat._trigger( \"selected\", event, {\n\t\t\t\tselected: selectee.element\n\t\t\t} );\n\t\t} );\n\t\tthis._trigger( \"stop\", event );\n\n\t\tthis.helper.remove();\n\n\t\treturn false;\n\t}\n\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/selectmenu.js",
    "content": "/*!\n * jQuery UI Selectmenu 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Selectmenu\n//>>group: Widgets\n/* eslint-disable max-len */\n//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.\n/* eslint-enable max-len */\n//>>docs: http://api.jqueryui.com/selectmenu/\n//>>demos: http://jqueryui.com/selectmenu/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./menu\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.widget( \"ui.selectmenu\", [ $.ui.formResetMixin, {\n\tversion: \"1.13.0\",\n\tdefaultElement: \"<select>\",\n\toptions: {\n\t\tappendTo: null,\n\t\tclasses: {\n\t\t\t\"ui-selectmenu-button-open\": \"ui-corner-top\",\n\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-all\"\n\t\t},\n\t\tdisabled: null,\n\t\ticons: {\n\t\t\tbutton: \"ui-icon-triangle-1-s\"\n\t\t},\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"none\"\n\t\t},\n\t\twidth: false,\n\n\t\t// Callbacks\n\t\tchange: null,\n\t\tclose: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tselect: null\n\t},\n\n\t_create: function() {\n\t\tvar selectmenuId = this.element.uniqueId().attr( \"id\" );\n\t\tthis.ids = {\n\t\t\telement: selectmenuId,\n\t\t\tbutton: selectmenuId + \"-button\",\n\t\t\tmenu: selectmenuId + \"-menu\"\n\t\t};\n\n\t\tthis._drawButton();\n\t\tthis._drawMenu();\n\t\tthis._bindFormResetHandler();\n\n\t\tthis._rendered = false;\n\t\tthis.menuItems = $();\n\t},\n\n\t_drawButton: function() {\n\t\tvar icon,\n\t\t\tthat = this,\n\t\t\titem = this._parseOption(\n\t\t\t\tthis.element.find( \"option:selected\" ),\n\t\t\t\tthis.element[ 0 ].selectedIndex\n\t\t\t);\n\n\t\t// Associate existing label with the new button\n\t\tthis.labels = this.element.labels().attr( \"for\", this.ids.button );\n\t\tthis._on( this.labels, {\n\t\t\tclick: function( event ) {\n\t\t\t\tthis.button.trigger( \"focus\" );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} );\n\n\t\t// Hide original select element\n\t\tthis.element.hide();\n\n\t\t// Create button\n\t\tthis.button = $( \"<span>\", {\n\t\t\ttabindex: this.options.disabled ? -1 : 0,\n\t\t\tid: this.ids.button,\n\t\t\trole: \"combobox\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\"aria-autocomplete\": \"list\",\n\t\t\t\"aria-owns\": this.ids.menu,\n\t\t\t\"aria-haspopup\": \"true\",\n\t\t\ttitle: this.element.attr( \"title\" )\n\t\t} )\n\t\t\t.insertAfter( this.element );\n\n\t\tthis._addClass( this.button, \"ui-selectmenu-button ui-selectmenu-button-closed\",\n\t\t\t\"ui-button ui-widget\" );\n\n\t\ticon = $( \"<span>\" ).appendTo( this.button );\n\t\tthis._addClass( icon, \"ui-selectmenu-icon\", \"ui-icon \" + this.options.icons.button );\n\t\tthis.buttonItem = this._renderButtonItem( item )\n\t\t\t.appendTo( this.button );\n\n\t\tif ( this.options.width !== false ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\n\t\tthis._on( this.button, this._buttonEvents );\n\t\tthis.button.one( \"focusin\", function() {\n\n\t\t\t// Delay rendering the menu items until the button receives focus.\n\t\t\t// The menu may have already been rendered via a programmatic open.\n\t\t\tif ( !that._rendered ) {\n\t\t\t\tthat._refreshMenu();\n\t\t\t}\n\t\t} );\n\t},\n\n\t_drawMenu: function() {\n\t\tvar that = this;\n\n\t\t// Create menu\n\t\tthis.menu = $( \"<ul>\", {\n\t\t\t\"aria-hidden\": \"true\",\n\t\t\t\"aria-labelledby\": this.ids.button,\n\t\t\tid: this.ids.menu\n\t\t} );\n\n\t\t// Wrap menu\n\t\tthis.menuWrap = $( \"<div>\" ).append( this.menu );\n\t\tthis._addClass( this.menuWrap, \"ui-selectmenu-menu\", \"ui-front\" );\n\t\tthis.menuWrap.appendTo( this._appendTo() );\n\n\t\t// Initialize menu widget\n\t\tthis.menuInstance = this.menu\n\t\t\t.menu( {\n\t\t\t\tclasses: {\n\t\t\t\t\t\"ui-menu\": \"ui-corner-bottom\"\n\t\t\t\t},\n\t\t\t\trole: \"listbox\",\n\t\t\t\tselect: function( event, ui ) {\n\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t// Support: IE8\n\t\t\t\t\t// If the item was selected via a click, the text selection\n\t\t\t\t\t// will be destroyed in IE\n\t\t\t\t\tthat._setSelection();\n\n\t\t\t\t\tthat._select( ui.item.data( \"ui-selectmenu-item\" ), event );\n\t\t\t\t},\n\t\t\t\tfocus: function( event, ui ) {\n\t\t\t\t\tvar item = ui.item.data( \"ui-selectmenu-item\" );\n\n\t\t\t\t\t// Prevent inital focus from firing and check if its a newly focused item\n\t\t\t\t\tif ( that.focusIndex != null && item.index !== that.focusIndex ) {\n\t\t\t\t\t\tthat._trigger( \"focus\", event, { item: item } );\n\t\t\t\t\t\tif ( !that.isOpen ) {\n\t\t\t\t\t\t\tthat._select( item, event );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthat.focusIndex = item.index;\n\n\t\t\t\t\tthat.button.attr( \"aria-activedescendant\",\n\t\t\t\t\t\tthat.menuItems.eq( item.index ).attr( \"id\" ) );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.menu( \"instance\" );\n\n\t\t// Don't close the menu on mouseleave\n\t\tthis.menuInstance._off( this.menu, \"mouseleave\" );\n\n\t\t// Cancel the menu's collapseAll on document click\n\t\tthis.menuInstance._closeOnDocumentClick = function() {\n\t\t\treturn false;\n\t\t};\n\n\t\t// Selects often contain empty items, but never contain dividers\n\t\tthis.menuInstance._isDivider = function() {\n\t\t\treturn false;\n\t\t};\n\t},\n\n\trefresh: function() {\n\t\tthis._refreshMenu();\n\t\tthis.buttonItem.replaceWith(\n\t\t\tthis.buttonItem = this._renderButtonItem(\n\n\t\t\t\t// Fall back to an empty object in case there are no options\n\t\t\t\tthis._getSelectedItem().data( \"ui-selectmenu-item\" ) || {}\n\t\t\t)\n\t\t);\n\t\tif ( this.options.width === null ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\t},\n\n\t_refreshMenu: function() {\n\t\tvar item,\n\t\t\toptions = this.element.find( \"option\" );\n\n\t\tthis.menu.empty();\n\n\t\tthis._parseOptions( options );\n\t\tthis._renderMenu( this.menu, this.items );\n\n\t\tthis.menuInstance.refresh();\n\t\tthis.menuItems = this.menu.find( \"li\" )\n\t\t\t.not( \".ui-selectmenu-optgroup\" )\n\t\t\t\t.find( \".ui-menu-item-wrapper\" );\n\n\t\tthis._rendered = true;\n\n\t\tif ( !options.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\titem = this._getSelectedItem();\n\n\t\t// Update the menu to have the correct item focused\n\t\tthis.menuInstance.focus( null, item );\n\t\tthis._setAria( item.data( \"ui-selectmenu-item\" ) );\n\n\t\t// Set disabled state\n\t\tthis._setOption( \"disabled\", this.element.prop( \"disabled\" ) );\n\t},\n\n\topen: function( event ) {\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If this is the first time the menu is being opened, render the items\n\t\tif ( !this._rendered ) {\n\t\t\tthis._refreshMenu();\n\t\t} else {\n\n\t\t\t// Menu clears focus on close, reset focus to selected item\n\t\t\tthis._removeClass( this.menu.find( \".ui-state-active\" ), null, \"ui-state-active\" );\n\t\t\tthis.menuInstance.focus( null, this._getSelectedItem() );\n\t\t}\n\n\t\t// If there are no options, don't open the menu\n\t\tif ( !this.menuItems.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOpen = true;\n\t\tthis._toggleAttr();\n\t\tthis._resizeMenu();\n\t\tthis._position();\n\n\t\tthis._on( this.document, this._documentClick );\n\n\t\tthis._trigger( \"open\", event );\n\t},\n\n\t_position: function() {\n\t\tthis.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );\n\t},\n\n\tclose: function( event ) {\n\t\tif ( !this.isOpen ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOpen = false;\n\t\tthis._toggleAttr();\n\n\t\tthis.range = null;\n\t\tthis._off( this.document );\n\n\t\tthis._trigger( \"close\", event );\n\t},\n\n\twidget: function() {\n\t\treturn this.button;\n\t},\n\n\tmenuWidget: function() {\n\t\treturn this.menu;\n\t},\n\n\t_renderButtonItem: function( item ) {\n\t\tvar buttonItem = $( \"<span>\" );\n\n\t\tthis._setText( buttonItem, item.label );\n\t\tthis._addClass( buttonItem, \"ui-selectmenu-text\" );\n\n\t\treturn buttonItem;\n\t},\n\n\t_renderMenu: function( ul, items ) {\n\t\tvar that = this,\n\t\t\tcurrentOptgroup = \"\";\n\n\t\t$.each( items, function( index, item ) {\n\t\t\tvar li;\n\n\t\t\tif ( item.optgroup !== currentOptgroup ) {\n\t\t\t\tli = $( \"<li>\", {\n\t\t\t\t\ttext: item.optgroup\n\t\t\t\t} );\n\t\t\t\tthat._addClass( li, \"ui-selectmenu-optgroup\", \"ui-menu-divider\" +\n\t\t\t\t\t( item.element.parent( \"optgroup\" ).prop( \"disabled\" ) ?\n\t\t\t\t\t\t\" ui-state-disabled\" :\n\t\t\t\t\t\t\"\" ) );\n\n\t\t\t\tli.appendTo( ul );\n\n\t\t\t\tcurrentOptgroup = item.optgroup;\n\t\t\t}\n\n\t\t\tthat._renderItemData( ul, item );\n\t\t} );\n\t},\n\n\t_renderItemData: function( ul, item ) {\n\t\treturn this._renderItem( ul, item ).data( \"ui-selectmenu-item\", item );\n\t},\n\n\t_renderItem: function( ul, item ) {\n\t\tvar li = $( \"<li>\" ),\n\t\t\twrapper = $( \"<div>\", {\n\t\t\t\ttitle: item.element.attr( \"title\" )\n\t\t\t} );\n\n\t\tif ( item.disabled ) {\n\t\t\tthis._addClass( li, null, \"ui-state-disabled\" );\n\t\t}\n\t\tthis._setText( wrapper, item.label );\n\n\t\treturn li.append( wrapper ).appendTo( ul );\n\t},\n\n\t_setText: function( element, value ) {\n\t\tif ( value ) {\n\t\t\telement.text( value );\n\t\t} else {\n\t\t\telement.html( \"&#160;\" );\n\t\t}\n\t},\n\n\t_move: function( direction, event ) {\n\t\tvar item, next,\n\t\t\tfilter = \".ui-menu-item\";\n\n\t\tif ( this.isOpen ) {\n\t\t\titem = this.menuItems.eq( this.focusIndex ).parent( \"li\" );\n\t\t} else {\n\t\t\titem = this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( \"li\" );\n\t\t\tfilter += \":not(.ui-state-disabled)\";\n\t\t}\n\n\t\tif ( direction === \"first\" || direction === \"last\" ) {\n\t\t\tnext = item[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( filter ).eq( -1 );\n\t\t} else {\n\t\t\tnext = item[ direction + \"All\" ]( filter ).eq( 0 );\n\t\t}\n\n\t\tif ( next.length ) {\n\t\t\tthis.menuInstance.focus( event, next );\n\t\t}\n\t},\n\n\t_getSelectedItem: function() {\n\t\treturn this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( \"li\" );\n\t},\n\n\t_toggle: function( event ) {\n\t\tthis[ this.isOpen ? \"close\" : \"open\" ]( event );\n\t},\n\n\t_setSelection: function() {\n\t\tvar selection;\n\n\t\tif ( !this.range ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( window.getSelection ) {\n\t\t\tselection = window.getSelection();\n\t\t\tselection.removeAllRanges();\n\t\t\tselection.addRange( this.range );\n\n\t\t// Support: IE8\n\t\t} else {\n\t\t\tthis.range.select();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Setting the text selection kills the button focus in IE, but\n\t\t// restoring the focus doesn't kill the selection.\n\t\tthis.button.focus();\n\t},\n\n\t_documentClick: {\n\t\tmousedown: function( event ) {\n\t\t\tif ( !this.isOpen ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( !$( event.target ).closest( \".ui-selectmenu-menu, #\" +\n\t\t\t\t$.escapeSelector( this.ids.button ) ).length ) {\n\t\t\t\tthis.close( event );\n\t\t\t}\n\t\t}\n\t},\n\n\t_buttonEvents: {\n\n\t\t// Prevent text selection from being reset when interacting with the selectmenu (#10144)\n\t\tmousedown: function() {\n\t\t\tvar selection;\n\n\t\t\tif ( window.getSelection ) {\n\t\t\t\tselection = window.getSelection();\n\t\t\t\tif ( selection.rangeCount ) {\n\t\t\t\t\tthis.range = selection.getRangeAt( 0 );\n\t\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t} else {\n\t\t\t\tthis.range = document.selection.createRange();\n\t\t\t}\n\t\t},\n\n\t\tclick: function( event ) {\n\t\t\tthis._setSelection();\n\t\t\tthis._toggle( event );\n\t\t},\n\n\t\tkeydown: function( event ) {\n\t\t\tvar preventDefault = true;\n\t\t\tswitch ( event.keyCode ) {\n\t\t\tcase $.ui.keyCode.TAB:\n\t\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\t\tthis.close( event );\n\t\t\t\tpreventDefault = false;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.ENTER:\n\t\t\t\tif ( this.isOpen ) {\n\t\t\t\t\tthis._selectFocusedItem( event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tif ( event.altKey ) {\n\t\t\t\t\tthis._toggle( event );\n\t\t\t\t} else {\n\t\t\t\t\tthis._move( \"prev\", event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tif ( event.altKey ) {\n\t\t\t\t\tthis._toggle( event );\n\t\t\t\t} else {\n\t\t\t\t\tthis._move( \"next\", event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.SPACE:\n\t\t\t\tif ( this.isOpen ) {\n\t\t\t\t\tthis._selectFocusedItem( event );\n\t\t\t\t} else {\n\t\t\t\t\tthis._toggle( event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\tthis._move( \"prev\", event );\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\tthis._move( \"next\", event );\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.HOME:\n\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\tthis._move( \"first\", event );\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.END:\n\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\tthis._move( \"last\", event );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.menu.trigger( event );\n\t\t\t\tpreventDefault = false;\n\t\t\t}\n\n\t\t\tif ( preventDefault ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t},\n\n\t_selectFocusedItem: function( event ) {\n\t\tvar item = this.menuItems.eq( this.focusIndex ).parent( \"li\" );\n\t\tif ( !item.hasClass( \"ui-state-disabled\" ) ) {\n\t\t\tthis._select( item.data( \"ui-selectmenu-item\" ), event );\n\t\t}\n\t},\n\n\t_select: function( item, event ) {\n\t\tvar oldIndex = this.element[ 0 ].selectedIndex;\n\n\t\t// Change native select element\n\t\tthis.element[ 0 ].selectedIndex = item.index;\n\t\tthis.buttonItem.replaceWith( this.buttonItem = this._renderButtonItem( item ) );\n\t\tthis._setAria( item );\n\t\tthis._trigger( \"select\", event, { item: item } );\n\n\t\tif ( item.index !== oldIndex ) {\n\t\t\tthis._trigger( \"change\", event, { item: item } );\n\t\t}\n\n\t\tthis.close( event );\n\t},\n\n\t_setAria: function( item ) {\n\t\tvar id = this.menuItems.eq( item.index ).attr( \"id\" );\n\n\t\tthis.button.attr( {\n\t\t\t\"aria-labelledby\": id,\n\t\t\t\"aria-activedescendant\": id\n\t\t} );\n\t\tthis.menu.attr( \"aria-activedescendant\", id );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icons\" ) {\n\t\t\tvar icon = this.button.find( \"span.ui-icon\" );\n\t\t\tthis._removeClass( icon, null, this.options.icons.button )\n\t\t\t\t._addClass( icon, null, value.button );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.menuWrap.appendTo( this._appendTo() );\n\t\t}\n\n\t\tif ( key === \"width\" ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.menuInstance.option( \"disabled\", value );\n\t\tthis.button.attr( \"aria-disabled\", value );\n\t\tthis._toggleClass( this.button, null, \"ui-state-disabled\", value );\n\n\t\tthis.element.prop( \"disabled\", value );\n\t\tif ( value ) {\n\t\t\tthis.button.attr( \"tabindex\", -1 );\n\t\t\tthis.close();\n\t\t} else {\n\t\t\tthis.button.attr( \"tabindex\", 0 );\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\n\t\tif ( element ) {\n\t\t\telement = element.jquery || element.nodeType ?\n\t\t\t\t$( element ) :\n\t\t\t\tthis.document.find( element ).eq( 0 );\n\t\t}\n\n\t\tif ( !element || !element[ 0 ] ) {\n\t\t\telement = this.element.closest( \".ui-front, dialog\" );\n\t\t}\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_toggleAttr: function() {\n\t\tthis.button.attr( \"aria-expanded\", this.isOpen );\n\n\t\t// We can't use two _toggleClass() calls here, because we need to make sure\n\t\t// we always remove classes first and add them second, otherwise if both classes have the\n\t\t// same theme class, it will be removed after we add it.\n\t\tthis._removeClass( this.button, \"ui-selectmenu-button-\" +\n\t\t\t( this.isOpen ? \"closed\" : \"open\" ) )\n\t\t\t._addClass( this.button, \"ui-selectmenu-button-\" +\n\t\t\t\t( this.isOpen ? \"open\" : \"closed\" ) )\n\t\t\t._toggleClass( this.menuWrap, \"ui-selectmenu-open\", null, this.isOpen );\n\n\t\tthis.menu.attr( \"aria-hidden\", !this.isOpen );\n\t},\n\n\t_resizeButton: function() {\n\t\tvar width = this.options.width;\n\n\t\t// For `width: false`, just remove inline style and stop\n\t\tif ( width === false ) {\n\t\t\tthis.button.css( \"width\", \"\" );\n\t\t\treturn;\n\t\t}\n\n\t\t// For `width: null`, match the width of the original element\n\t\tif ( width === null ) {\n\t\t\twidth = this.element.show().outerWidth();\n\t\t\tthis.element.hide();\n\t\t}\n\n\t\tthis.button.outerWidth( width );\n\t},\n\n\t_resizeMenu: function() {\n\t\tthis.menu.outerWidth( Math.max(\n\t\t\tthis.button.outerWidth(),\n\n\t\t\t// Support: IE10\n\t\t\t// IE10 wraps long text (possibly a rounding bug)\n\t\t\t// so we add 1px to avoid the wrapping\n\t\t\tthis.menu.width( \"\" ).outerWidth() + 1\n\t\t) );\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = this._super();\n\n\t\toptions.disabled = this.element.prop( \"disabled\" );\n\n\t\treturn options;\n\t},\n\n\t_parseOptions: function( options ) {\n\t\tvar that = this,\n\t\t\tdata = [];\n\t\toptions.each( function( index, item ) {\n\t\t\tif ( item.hidden ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdata.push( that._parseOption( $( item ), index ) );\n\t\t} );\n\t\tthis.items = data;\n\t},\n\n\t_parseOption: function( option, index ) {\n\t\tvar optgroup = option.parent( \"optgroup\" );\n\n\t\treturn {\n\t\t\telement: option,\n\t\t\tindex: index,\n\t\t\tvalue: option.val(),\n\t\t\tlabel: option.text(),\n\t\t\toptgroup: optgroup.attr( \"label\" ) || \"\",\n\t\t\tdisabled: optgroup.prop( \"disabled\" ) || option.prop( \"disabled\" )\n\t\t};\n\t},\n\n\t_destroy: function() {\n\t\tthis._unbindFormResetHandler();\n\t\tthis.menuWrap.remove();\n\t\tthis.button.remove();\n\t\tthis.element.show();\n\t\tthis.element.removeUniqueId();\n\t\tthis.labels.attr( \"for\", this.ids.element );\n\t}\n} ] );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/slider.js",
    "content": "/*!\n * jQuery UI Slider 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Slider\n//>>group: Widgets\n//>>description: Displays a flexible slider with ranges and accessibility via keyboard.\n//>>docs: http://api.jqueryui.com/slider/\n//>>demos: http://jqueryui.com/slider/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/slider.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./mouse\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.widget( \"ui.slider\", $.ui.mouse, {\n\tversion: \"1.13.0\",\n\twidgetEventPrefix: \"slide\",\n\n\toptions: {\n\t\tanimate: false,\n\t\tclasses: {\n\t\t\t\"ui-slider\": \"ui-corner-all\",\n\t\t\t\"ui-slider-handle\": \"ui-corner-all\",\n\n\t\t\t// Note: ui-widget-header isn't the most fittingly semantic framework class for this\n\t\t\t// element, but worked best visually with a variety of themes\n\t\t\t\"ui-slider-range\": \"ui-corner-all ui-widget-header\"\n\t\t},\n\t\tdistance: 0,\n\t\tmax: 100,\n\t\tmin: 0,\n\t\torientation: \"horizontal\",\n\t\trange: false,\n\t\tstep: 1,\n\t\tvalue: 0,\n\t\tvalues: null,\n\n\t\t// Callbacks\n\t\tchange: null,\n\t\tslide: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t// Number of pages in a slider\n\t// (how many times can you page up/down to go through the whole range)\n\tnumPages: 5,\n\n\t_create: function() {\n\t\tthis._keySliding = false;\n\t\tthis._mouseSliding = false;\n\t\tthis._animateOff = true;\n\t\tthis._handleIndex = null;\n\t\tthis._detectOrientation();\n\t\tthis._mouseInit();\n\t\tthis._calculateNewMax();\n\n\t\tthis._addClass( \"ui-slider ui-slider-\" + this.orientation,\n\t\t\t\"ui-widget ui-widget-content\" );\n\n\t\tthis._refresh();\n\n\t\tthis._animateOff = false;\n\t},\n\n\t_refresh: function() {\n\t\tthis._createRange();\n\t\tthis._createHandles();\n\t\tthis._setupEvents();\n\t\tthis._refreshValue();\n\t},\n\n\t_createHandles: function() {\n\t\tvar i, handleCount,\n\t\t\toptions = this.options,\n\t\t\texistingHandles = this.element.find( \".ui-slider-handle\" ),\n\t\t\thandle = \"<span tabindex='0'></span>\",\n\t\t\thandles = [];\n\n\t\thandleCount = ( options.values && options.values.length ) || 1;\n\n\t\tif ( existingHandles.length > handleCount ) {\n\t\t\texistingHandles.slice( handleCount ).remove();\n\t\t\texistingHandles = existingHandles.slice( 0, handleCount );\n\t\t}\n\n\t\tfor ( i = existingHandles.length; i < handleCount; i++ ) {\n\t\t\thandles.push( handle );\n\t\t}\n\n\t\tthis.handles = existingHandles.add( $( handles.join( \"\" ) ).appendTo( this.element ) );\n\n\t\tthis._addClass( this.handles, \"ui-slider-handle\", \"ui-state-default\" );\n\n\t\tthis.handle = this.handles.eq( 0 );\n\n\t\tthis.handles.each( function( i ) {\n\t\t\t$( this )\n\t\t\t\t.data( \"ui-slider-handle-index\", i )\n\t\t\t\t.attr( \"tabIndex\", 0 );\n\t\t} );\n\t},\n\n\t_createRange: function() {\n\t\tvar options = this.options;\n\n\t\tif ( options.range ) {\n\t\t\tif ( options.range === true ) {\n\t\t\t\tif ( !options.values ) {\n\t\t\t\t\toptions.values = [ this._valueMin(), this._valueMin() ];\n\t\t\t\t} else if ( options.values.length && options.values.length !== 2 ) {\n\t\t\t\t\toptions.values = [ options.values[ 0 ], options.values[ 0 ] ];\n\t\t\t\t} else if ( Array.isArray( options.values ) ) {\n\t\t\t\t\toptions.values = options.values.slice( 0 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !this.range || !this.range.length ) {\n\t\t\t\tthis.range = $( \"<div>\" )\n\t\t\t\t\t.appendTo( this.element );\n\n\t\t\t\tthis._addClass( this.range, \"ui-slider-range\" );\n\t\t\t} else {\n\t\t\t\tthis._removeClass( this.range, \"ui-slider-range-min ui-slider-range-max\" );\n\n\t\t\t\t// Handle range switching from true to min/max\n\t\t\t\tthis.range.css( {\n\t\t\t\t\t\"left\": \"\",\n\t\t\t\t\t\"bottom\": \"\"\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( options.range === \"min\" || options.range === \"max\" ) {\n\t\t\t\tthis._addClass( this.range, \"ui-slider-range-\" + options.range );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( this.range ) {\n\t\t\t\tthis.range.remove();\n\t\t\t}\n\t\t\tthis.range = null;\n\t\t}\n\t},\n\n\t_setupEvents: function() {\n\t\tthis._off( this.handles );\n\t\tthis._on( this.handles, this._handleEvents );\n\t\tthis._hoverable( this.handles );\n\t\tthis._focusable( this.handles );\n\t},\n\n\t_destroy: function() {\n\t\tthis.handles.remove();\n\t\tif ( this.range ) {\n\t\t\tthis.range.remove();\n\t\t}\n\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,\n\t\t\tthat = this,\n\t\t\to = this.options;\n\n\t\tif ( o.disabled ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.elementSize = {\n\t\t\twidth: this.element.outerWidth(),\n\t\t\theight: this.element.outerHeight()\n\t\t};\n\t\tthis.elementOffset = this.element.offset();\n\n\t\tposition = { x: event.pageX, y: event.pageY };\n\t\tnormValue = this._normValueFromMouse( position );\n\t\tdistance = this._valueMax() - this._valueMin() + 1;\n\t\tthis.handles.each( function( i ) {\n\t\t\tvar thisDistance = Math.abs( normValue - that.values( i ) );\n\t\t\tif ( ( distance > thisDistance ) ||\n\t\t\t\t( distance === thisDistance &&\n\t\t\t\t\t( i === that._lastChangedValue || that.values( i ) === o.min ) ) ) {\n\t\t\t\tdistance = thisDistance;\n\t\t\t\tclosestHandle = $( this );\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t} );\n\n\t\tallowed = this._start( event, index );\n\t\tif ( allowed === false ) {\n\t\t\treturn false;\n\t\t}\n\t\tthis._mouseSliding = true;\n\n\t\tthis._handleIndex = index;\n\n\t\tthis._addClass( closestHandle, null, \"ui-state-active\" );\n\t\tclosestHandle.trigger( \"focus\" );\n\n\t\toffset = closestHandle.offset();\n\t\tmouseOverHandle = !$( event.target ).parents().addBack().is( \".ui-slider-handle\" );\n\t\tthis._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {\n\t\t\tleft: event.pageX - offset.left - ( closestHandle.width() / 2 ),\n\t\t\ttop: event.pageY - offset.top -\n\t\t\t\t( closestHandle.height() / 2 ) -\n\t\t\t\t( parseInt( closestHandle.css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( closestHandle.css( \"borderBottomWidth\" ), 10 ) || 0 ) +\n\t\t\t\t( parseInt( closestHandle.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\n\t\tif ( !this.handles.hasClass( \"ui-state-hover\" ) ) {\n\t\t\tthis._slide( event, index, normValue );\n\t\t}\n\t\tthis._animateOff = true;\n\t\treturn true;\n\t},\n\n\t_mouseStart: function() {\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar position = { x: event.pageX, y: event.pageY },\n\t\t\tnormValue = this._normValueFromMouse( position );\n\n\t\tthis._slide( event, this._handleIndex, normValue );\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\t\tthis._removeClass( this.handles, null, \"ui-state-active\" );\n\t\tthis._mouseSliding = false;\n\n\t\tthis._stop( event, this._handleIndex );\n\t\tthis._change( event, this._handleIndex );\n\n\t\tthis._handleIndex = null;\n\t\tthis._clickOffset = null;\n\t\tthis._animateOff = false;\n\n\t\treturn false;\n\t},\n\n\t_detectOrientation: function() {\n\t\tthis.orientation = ( this.options.orientation === \"vertical\" ) ? \"vertical\" : \"horizontal\";\n\t},\n\n\t_normValueFromMouse: function( position ) {\n\t\tvar pixelTotal,\n\t\t\tpixelMouse,\n\t\t\tpercentMouse,\n\t\t\tvalueTotal,\n\t\t\tvalueMouse;\n\n\t\tif ( this.orientation === \"horizontal\" ) {\n\t\t\tpixelTotal = this.elementSize.width;\n\t\t\tpixelMouse = position.x - this.elementOffset.left -\n\t\t\t\t( this._clickOffset ? this._clickOffset.left : 0 );\n\t\t} else {\n\t\t\tpixelTotal = this.elementSize.height;\n\t\t\tpixelMouse = position.y - this.elementOffset.top -\n\t\t\t\t( this._clickOffset ? this._clickOffset.top : 0 );\n\t\t}\n\n\t\tpercentMouse = ( pixelMouse / pixelTotal );\n\t\tif ( percentMouse > 1 ) {\n\t\t\tpercentMouse = 1;\n\t\t}\n\t\tif ( percentMouse < 0 ) {\n\t\t\tpercentMouse = 0;\n\t\t}\n\t\tif ( this.orientation === \"vertical\" ) {\n\t\t\tpercentMouse = 1 - percentMouse;\n\t\t}\n\n\t\tvalueTotal = this._valueMax() - this._valueMin();\n\t\tvalueMouse = this._valueMin() + percentMouse * valueTotal;\n\n\t\treturn this._trimAlignValue( valueMouse );\n\t},\n\n\t_uiHash: function( index, value, values ) {\n\t\tvar uiHash = {\n\t\t\thandle: this.handles[ index ],\n\t\t\thandleIndex: index,\n\t\t\tvalue: value !== undefined ? value : this.value()\n\t\t};\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\tuiHash.value = value !== undefined ? value : this.values( index );\n\t\t\tuiHash.values = values || this.values();\n\t\t}\n\n\t\treturn uiHash;\n\t},\n\n\t_hasMultipleValues: function() {\n\t\treturn this.options.values && this.options.values.length;\n\t},\n\n\t_start: function( event, index ) {\n\t\treturn this._trigger( \"start\", event, this._uiHash( index ) );\n\t},\n\n\t_slide: function( event, index, newVal ) {\n\t\tvar allowed, otherVal,\n\t\t\tcurrentValue = this.value(),\n\t\t\tnewValues = this.values();\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\totherVal = this.values( index ? 0 : 1 );\n\t\t\tcurrentValue = this.values( index );\n\n\t\t\tif ( this.options.values.length === 2 && this.options.range === true ) {\n\t\t\t\tnewVal =  index === 0 ? Math.min( otherVal, newVal ) : Math.max( otherVal, newVal );\n\t\t\t}\n\n\t\t\tnewValues[ index ] = newVal;\n\t\t}\n\n\t\tif ( newVal === currentValue ) {\n\t\t\treturn;\n\t\t}\n\n\t\tallowed = this._trigger( \"slide\", event, this._uiHash( index, newVal, newValues ) );\n\n\t\t// A slide can be canceled by returning false from the slide callback\n\t\tif ( allowed === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\tthis.values( index, newVal );\n\t\t} else {\n\t\t\tthis.value( newVal );\n\t\t}\n\t},\n\n\t_stop: function( event, index ) {\n\t\tthis._trigger( \"stop\", event, this._uiHash( index ) );\n\t},\n\n\t_change: function( event, index ) {\n\t\tif ( !this._keySliding && !this._mouseSliding ) {\n\n\t\t\t//store the last changed value index for reference when handles overlap\n\t\t\tthis._lastChangedValue = index;\n\t\t\tthis._trigger( \"change\", event, this._uiHash( index ) );\n\t\t}\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( arguments.length ) {\n\t\t\tthis.options.value = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, 0 );\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._value();\n\t},\n\n\tvalues: function( index, newValue ) {\n\t\tvar vals,\n\t\t\tnewValues,\n\t\t\ti;\n\n\t\tif ( arguments.length > 1 ) {\n\t\t\tthis.options.values[ index ] = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, index );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tif ( Array.isArray( arguments[ 0 ] ) ) {\n\t\t\t\tvals = this.options.values;\n\t\t\t\tnewValues = arguments[ 0 ];\n\t\t\t\tfor ( i = 0; i < vals.length; i += 1 ) {\n\t\t\t\t\tvals[ i ] = this._trimAlignValue( newValues[ i ] );\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._refreshValue();\n\t\t\t} else {\n\t\t\t\tif ( this._hasMultipleValues() ) {\n\t\t\t\t\treturn this._values( index );\n\t\t\t\t} else {\n\t\t\t\t\treturn this.value();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn this._values();\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar i,\n\t\t\tvalsLength = 0;\n\n\t\tif ( key === \"range\" && this.options.range === true ) {\n\t\t\tif ( value === \"min\" ) {\n\t\t\t\tthis.options.value = this._values( 0 );\n\t\t\t\tthis.options.values = null;\n\t\t\t} else if ( value === \"max\" ) {\n\t\t\t\tthis.options.value = this._values( this.options.values.length - 1 );\n\t\t\t\tthis.options.values = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( Array.isArray( this.options.values ) ) {\n\t\t\tvalsLength = this.options.values.length;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tswitch ( key ) {\n\t\t\tcase \"orientation\":\n\t\t\t\tthis._detectOrientation();\n\t\t\t\tthis._removeClass( \"ui-slider-horizontal ui-slider-vertical\" )\n\t\t\t\t\t._addClass( \"ui-slider-\" + this.orientation );\n\t\t\t\tthis._refreshValue();\n\t\t\t\tif ( this.options.range ) {\n\t\t\t\t\tthis._refreshRange( value );\n\t\t\t\t}\n\n\t\t\t\t// Reset positioning from previous orientation\n\t\t\t\tthis.handles.css( value === \"horizontal\" ? \"bottom\" : \"left\", \"\" );\n\t\t\t\tbreak;\n\t\t\tcase \"value\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._change( null, 0 );\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"values\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\n\t\t\t\t// Start from the last handle to prevent unreachable handles (#9046)\n\t\t\t\tfor ( i = valsLength - 1; i >= 0; i-- ) {\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"step\":\n\t\t\tcase \"min\":\n\t\t\tcase \"max\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._calculateNewMax();\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"range\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refresh();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t},\n\n\t//internal value getter\n\t// _value() returns value trimmed by min and max, aligned by step\n\t_value: function() {\n\t\tvar val = this.options.value;\n\t\tval = this._trimAlignValue( val );\n\n\t\treturn val;\n\t},\n\n\t//internal values getter\n\t// _values() returns array of values trimmed by min and max, aligned by step\n\t// _values( index ) returns single value trimmed by min and max, aligned by step\n\t_values: function( index ) {\n\t\tvar val,\n\t\t\tvals,\n\t\t\ti;\n\n\t\tif ( arguments.length ) {\n\t\t\tval = this.options.values[ index ];\n\t\t\tval = this._trimAlignValue( val );\n\n\t\t\treturn val;\n\t\t} else if ( this._hasMultipleValues() ) {\n\n\t\t\t// .slice() creates a copy of the array\n\t\t\t// this copy gets trimmed by min and max and then returned\n\t\t\tvals = this.options.values.slice();\n\t\t\tfor ( i = 0; i < vals.length; i += 1 ) {\n\t\t\t\tvals[ i ] = this._trimAlignValue( vals[ i ] );\n\t\t\t}\n\n\t\t\treturn vals;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t},\n\n\t// Returns the step-aligned value that val is closest to, between (inclusive) min and max\n\t_trimAlignValue: function( val ) {\n\t\tif ( val <= this._valueMin() ) {\n\t\t\treturn this._valueMin();\n\t\t}\n\t\tif ( val >= this._valueMax() ) {\n\t\t\treturn this._valueMax();\n\t\t}\n\t\tvar step = ( this.options.step > 0 ) ? this.options.step : 1,\n\t\t\tvalModStep = ( val - this._valueMin() ) % step,\n\t\t\talignValue = val - valModStep;\n\n\t\tif ( Math.abs( valModStep ) * 2 >= step ) {\n\t\t\talignValue += ( valModStep > 0 ) ? step : ( -step );\n\t\t}\n\n\t\t// Since JavaScript has problems with large floats, round\n\t\t// the final value to 5 digits after the decimal point (see #4124)\n\t\treturn parseFloat( alignValue.toFixed( 5 ) );\n\t},\n\n\t_calculateNewMax: function() {\n\t\tvar max = this.options.max,\n\t\t\tmin = this._valueMin(),\n\t\t\tstep = this.options.step,\n\t\t\taboveMin = Math.round( ( max - min ) / step ) * step;\n\t\tmax = aboveMin + min;\n\t\tif ( max > this.options.max ) {\n\n\t\t\t//If max is not divisible by step, rounding off may increase its value\n\t\t\tmax -= step;\n\t\t}\n\t\tthis.max = parseFloat( max.toFixed( this._precision() ) );\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_valueMin: function() {\n\t\treturn this.options.min;\n\t},\n\n\t_valueMax: function() {\n\t\treturn this.max;\n\t},\n\n\t_refreshRange: function( orientation ) {\n\t\tif ( orientation === \"vertical\" ) {\n\t\t\tthis.range.css( { \"width\": \"\", \"left\": \"\" } );\n\t\t}\n\t\tif ( orientation === \"horizontal\" ) {\n\t\t\tthis.range.css( { \"height\": \"\", \"bottom\": \"\" } );\n\t\t}\n\t},\n\n\t_refreshValue: function() {\n\t\tvar lastValPercent, valPercent, value, valueMin, valueMax,\n\t\t\toRange = this.options.range,\n\t\t\to = this.options,\n\t\t\tthat = this,\n\t\t\tanimate = ( !this._animateOff ) ? o.animate : false,\n\t\t\t_set = {};\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\tthis.handles.each( function( i ) {\n\t\t\t\tvalPercent = ( that.values( i ) - that._valueMin() ) / ( that._valueMax() -\n\t\t\t\t\tthat._valueMin() ) * 100;\n\t\t\t\t_set[ that.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\t\t$( this ).stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\t\t\t\tif ( that.options.range === true ) {\n\t\t\t\t\tif ( that.orientation === \"horizontal\" ) {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\tleft: valPercent + \"%\"\n\t\t\t\t\t\t\t}, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\twidth: ( valPercent - lastValPercent ) + \"%\"\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tqueue: false,\n\t\t\t\t\t\t\t\tduration: o.animate\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\tbottom: ( valPercent ) + \"%\"\n\t\t\t\t\t\t\t}, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\theight: ( valPercent - lastValPercent ) + \"%\"\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tqueue: false,\n\t\t\t\t\t\t\t\tduration: o.animate\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlastValPercent = valPercent;\n\t\t\t} );\n\t\t} else {\n\t\t\tvalue = this.value();\n\t\t\tvalueMin = this._valueMin();\n\t\t\tvalueMax = this._valueMax();\n\t\t\tvalPercent = ( valueMax !== valueMin ) ?\n\t\t\t\t\t( value - valueMin ) / ( valueMax - valueMin ) * 100 :\n\t\t\t\t\t0;\n\t\t\t_set[ this.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\tthis.handle.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\n\t\t\tif ( oRange === \"min\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\twidth: valPercent + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\twidth: ( 100 - valPercent ) + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"min\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\theight: valPercent + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\theight: ( 100 - valPercent ) + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t}\n\t},\n\n\t_handleEvents: {\n\t\tkeydown: function( event ) {\n\t\t\tvar allowed, curVal, newVal, step,\n\t\t\t\tindex = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif ( !this._keySliding ) {\n\t\t\t\t\t\tthis._keySliding = true;\n\t\t\t\t\t\tthis._addClass( $( event.target ), null, \"ui-state-active\" );\n\t\t\t\t\t\tallowed = this._start( event, index );\n\t\t\t\t\t\tif ( allowed === false ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tstep = this.options.step;\n\t\t\tif ( this._hasMultipleValues() ) {\n\t\t\t\tcurVal = newVal = this.values( index );\n\t\t\t} else {\n\t\t\t\tcurVal = newVal = this.value();\n\t\t\t}\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\t\tnewVal = this._valueMin();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\t\tnewVal = this._valueMax();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\t\tnewVal = this._trimAlignValue(\n\t\t\t\t\t\tcurVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\t\tnewVal = this._trimAlignValue(\n\t\t\t\t\t\tcurVal - ( ( this._valueMax() - this._valueMin() ) / this.numPages ) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\t\tif ( curVal === this._valueMax() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal + step );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tif ( curVal === this._valueMin() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal - step );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis._slide( event, index, newVal );\n\t\t},\n\t\tkeyup: function( event ) {\n\t\t\tvar index = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tif ( this._keySliding ) {\n\t\t\t\tthis._keySliding = false;\n\t\t\t\tthis._stop( event, index );\n\t\t\t\tthis._change( event, index );\n\t\t\t\tthis._removeClass( $( event.target ), null, \"ui-state-active\" );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/sortable.js",
    "content": "/*!\n * jQuery UI Sortable 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Sortable\n//>>group: Interactions\n//>>description: Enables items in a list to be sorted using the mouse.\n//>>docs: http://api.jqueryui.com/sortable/\n//>>demos: http://jqueryui.com/sortable/\n//>>css.structure: ../../themes/base/sortable.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./mouse\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.widget( \"ui.sortable\", $.ui.mouse, {\n\tversion: \"1.13.0\",\n\twidgetEventPrefix: \"sort\",\n\tready: false,\n\toptions: {\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectWith: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tdropOnEmpty: true,\n\t\tforcePlaceholderSize: false,\n\t\tforceHelperSize: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\titems: \"> *\",\n\t\topacity: false,\n\t\tplaceholder: false,\n\t\trevert: false,\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\t\tzIndex: 1000,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeStop: null,\n\t\tchange: null,\n\t\tdeactivate: null,\n\t\tout: null,\n\t\tover: null,\n\t\treceive: null,\n\t\tremove: null,\n\t\tsort: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tupdate: null\n\t},\n\n\t_isOverAxis: function( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t},\n\n\t_isFloating: function( item ) {\n\t\treturn ( /left|right/ ).test( item.css( \"float\" ) ) ||\n\t\t\t( /inline|table-cell/ ).test( item.css( \"display\" ) );\n\t},\n\n\t_create: function() {\n\t\tthis.containerCache = {};\n\t\tthis._addClass( \"ui-sortable\" );\n\n\t\t//Get the items\n\t\tthis.refresh();\n\n\t\t//Let's determine the parent's offset\n\t\tthis.offset = this.element.offset();\n\n\t\t//Initialize mouse events for interaction\n\t\tthis._mouseInit();\n\n\t\tthis._setHandleClassName();\n\n\t\t//We're ready to go\n\t\tthis.ready = true;\n\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_setHandleClassName: function() {\n\t\tvar that = this;\n\t\tthis._removeClass( this.element.find( \".ui-sortable-handle\" ), \"ui-sortable-handle\" );\n\t\t$.each( this.items, function() {\n\t\t\tthat._addClass(\n\t\t\t\tthis.instance.options.handle ?\n\t\t\t\t\tthis.item.find( this.instance.options.handle ) :\n\t\t\t\t\tthis.item,\n\t\t\t\t\"ui-sortable-handle\"\n\t\t\t);\n\t\t} );\n\t},\n\n\t_destroy: function() {\n\t\tthis._mouseDestroy();\n\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\tthis.items[ i ].item.removeData( this.widgetName + \"-item\" );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function( event, overrideHandle ) {\n\t\tvar currentItem = null,\n\t\t\tvalidHandle = false,\n\t\t\tthat = this;\n\n\t\tif ( this.reverting ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.options.disabled || this.options.type === \"static\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//We have to refresh the items data once first\n\t\tthis._refreshItems( event );\n\n\t\t//Find out if the clicked node (or one of its parents) is a actual item in this.items\n\t\t$( event.target ).parents().each( function() {\n\t\t\tif ( $.data( this, that.widgetName + \"-item\" ) === that ) {\n\t\t\t\tcurrentItem = $( this );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\t\tif ( $.data( event.target, that.widgetName + \"-item\" ) === that ) {\n\t\t\tcurrentItem = $( event.target );\n\t\t}\n\n\t\tif ( !currentItem ) {\n\t\t\treturn false;\n\t\t}\n\t\tif ( this.options.handle && !overrideHandle ) {\n\t\t\t$( this.options.handle, currentItem ).find( \"*\" ).addBack().each( function() {\n\t\t\t\tif ( this === event.target ) {\n\t\t\t\t\tvalidHandle = true;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( !validHandle ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentItem = currentItem;\n\t\tthis._removeCurrentsFromItems();\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function( event, overrideHandle, noActivation ) {\n\n\t\tvar i, body,\n\t\t\to = this.options;\n\n\t\tthis.currentContainer = this;\n\n\t\t//We only need to call refreshPositions, because the refreshItems call has been moved to\n\t\t// mouseCapture\n\t\tthis.refreshPositions();\n\n\t\t//Prepare the dragged items parent\n\t\tthis.appendTo = $( o.appendTo !== \"parent\" ?\n\t\t\t\to.appendTo :\n\t\t\t\tthis.currentItem.parent() );\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper( event );\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.offset = this.currentItem.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend( this.offset, {\n\t\t\tclick: { //Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\n\t\t\t// This is a relative to absolute position minus the actual position calculation -\n\t\t\t// only used for relative positioned helper\n\t\t\trelative: this._getRelativeOffset()\n\t\t} );\n\n\t\t// After we get the helper offset, but before we get the parent offset we can\n\t\t// change the helper's position to absolute\n\t\t// TODO: Still need to figure out a way to make relative sorting possible\n\t\tthis.helper.css( \"position\", \"absolute\" );\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\tif ( o.cursorAt ) {\n\t\t\tthis._adjustOffsetFromHelper( o.cursorAt );\n\t\t}\n\n\t\t//Cache the former DOM position\n\t\tthis.domPosition = {\n\t\t\tprev: this.currentItem.prev()[ 0 ],\n\t\t\tparent: this.currentItem.parent()[ 0 ]\n\t\t};\n\n\t\t// If the helper is not the original, hide the original so it's not playing any role during\n\t\t// the drag, won't cause anything bad this way\n\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\tthis.currentItem.hide();\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthis._createPlaceholder();\n\n\t\t//Get the next scrolling parent\n\t\tthis.scrollParent = this.placeholder.scrollParent();\n\n\t\t$.extend( this.offset, {\n\t\t\tparent: this._getParentOffset()\n\t\t} );\n\n\t\t//Set a containment if given in the options\n\t\tif ( o.containment ) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\tif ( o.cursor && o.cursor !== \"auto\" ) { // cursor option\n\t\t\tbody = this.document.find( \"body\" );\n\n\t\t\t// Support: IE\n\t\t\tthis.storedCursor = body.css( \"cursor\" );\n\t\t\tbody.css( \"cursor\", o.cursor );\n\n\t\t\tthis.storedStylesheet =\n\t\t\t\t$( \"<style>*{ cursor: \" + o.cursor + \" !important; }</style>\" ).appendTo( body );\n\t\t}\n\n\t\t// We need to make sure to grab the zIndex before setting the\n\t\t// opacity, because setting the opacity to anything lower than 1\n\t\t// causes the zIndex to change from \"auto\" to 0.\n\t\tif ( o.zIndex ) { // zIndex option\n\t\t\tif ( this.helper.css( \"zIndex\" ) ) {\n\t\t\t\tthis._storedZIndex = this.helper.css( \"zIndex\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"zIndex\", o.zIndex );\n\t\t}\n\n\t\tif ( o.opacity ) { // opacity option\n\t\t\tif ( this.helper.css( \"opacity\" ) ) {\n\t\t\t\tthis._storedOpacity = this.helper.css( \"opacity\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"opacity\", o.opacity );\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"start\", event, this._uiHash() );\n\n\t\t//Recache the helper size\n\t\tif ( !this._preserveHelperProportions ) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif ( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis._addClass( this.helper, \"ui-sortable-helper\" );\n\n\t\t//Move the helper, if needed\n\t\tif ( !this.helper.parent().is( this.appendTo ) ) {\n\t\t\tthis.helper.detach().appendTo( this.appendTo );\n\n\t\t\t//Update position\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\t//Generate the original position\n\t\tthis.position = this.originalPosition = this._generatePosition( event );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\t\tthis.lastPositionAbs = this.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\tthis._mouseDrag( event );\n\n\t\treturn true;\n\n\t},\n\n\t_scroll: function( event ) {\n\t\tvar o = this.options,\n\t\t\tscrolled = false;\n\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\n\t\t\tif ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -\n\t\t\t\t\tevent.pageY < o.scrollSensitivity ) {\n\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;\n\t\t\t} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;\n\t\t\t}\n\n\t\t\tif ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -\n\t\t\t\t\tevent.pageX < o.scrollSensitivity ) {\n\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;\n\t\t\t} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {\n\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );\n\t\t\t} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <\n\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );\n\t\t\t}\n\n\t\t\tif ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\tthis.document.scrollLeft() - o.scrollSpeed\n\t\t\t\t);\n\t\t\t} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <\n\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\tthis.document.scrollLeft() + o.scrollSpeed\n\t\t\t\t);\n\t\t\t}\n\n\t\t}\n\n\t\treturn scrolled;\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Set the helper position\n\t\tif ( !this.options.axis || this.options.axis !== \"y\" ) {\n\t\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( !this.options.axis || this.options.axis !== \"x\" ) {\n\t\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers( event );\n\n\t\tif ( this.innermostContainer !== null ) {\n\n\t\t\t//Do scrolling\n\t\t\tif ( o.scroll ) {\n\t\t\t\tif ( this._scroll( event ) !== false ) {\n\n\t\t\t\t\t//Update item positions used in position checks\n\t\t\t\t\tthis._refreshItemPositions( true );\n\n\t\t\t\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.dragDirection = {\n\t\t\t\tvertical: this._getDragVerticalDirection(),\n\t\t\t\thorizontal: this._getDragHorizontalDirection()\n\t\t\t};\n\n\t\t\t//Rearrange\n\t\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\n\t\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\t\titem = this.items[ i ];\n\t\t\t\titemElement = item.item[ 0 ];\n\t\t\t\tintersection = this._intersectsWithPointer( item );\n\t\t\t\tif ( !intersection ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t\t// items from other containers. This works because when moving\n\t\t\t\t// an item from one container to another the\n\t\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t\t//\n\t\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\t\tif ( item.instance !== this.currentContainer ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Cannot intersect with itself\n\t\t\t\t// no useless actions that have been done before\n\t\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\t\tif ( itemElement !== this.currentItem[ 0 ] &&\n\t\t\t\t\tthis.placeholder[ intersection === 1 ?\n\t\t\t\t\t\"next\" : \"prev\" ]()[ 0 ] !== itemElement &&\n\t\t\t\t\t!$.contains( this.placeholder[ 0 ], itemElement ) &&\n\t\t\t\t\t( this.options.type === \"semi-dynamic\" ?\n\t\t\t\t\t\t!$.contains( this.element[ 0 ], itemElement ) :\n\t\t\t\t\t\ttrue\n\t\t\t\t\t)\n\t\t\t\t) {\n\n\t\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\t\t\t\t\tthis._intersectsWithSides( item ) ) {\n\t\t\t\t\t\tthis._rearrange( event, item );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//Interconnect with droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"sort\", event, this._uiHash() );\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function( event, noPropagation ) {\n\n\t\tif ( !event ) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\tif ( this.options.revert ) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollLeft\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollTop\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$( this.helper ).animate(\n\t\t\t\tanimation,\n\t\t\t\tparseInt( this.options.revert, 10 ) || 500,\n\t\t\t\tfunction() {\n\t\t\t\t\tthat._clear( event );\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tthis._clear( event, noPropagation );\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: null } ) );\n\n\t\t\tif ( this.options.helper === \"original\" ) {\n\t\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor ( var i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"deactivate\", null, this._uiHash( this ) );\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", null, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.placeholder ) {\n\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t\t// it unbinds ALL events from the original node!\n\t\t\tif ( this.placeholder[ 0 ].parentNode ) {\n\t\t\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\t\t\t}\n\t\t\tif ( this.options.helper !== \"original\" && this.helper &&\n\t\t\t\t\tthis.helper[ 0 ].parentNode ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend( this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t} );\n\n\t\t\tif ( this.domPosition.prev ) {\n\t\t\t\t$( this.domPosition.prev ).after( this.currentItem );\n\t\t\t} else {\n\t\t\t\t$( this.domPosition.parent ).prepend( this.currentItem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$( items ).each( function() {\n\t\t\tvar res = ( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" )\n\t\t\t\t.match( o.expression || ( /(.+)[\\-=_](.+)/ ) );\n\t\t\tif ( res ) {\n\t\t\t\tstr.push(\n\t\t\t\t\t( o.key || res[ 1 ] + \"[]\" ) +\n\t\t\t\t\t\"=\" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );\n\t\t\t}\n\t\t} );\n\n\t\tif ( !str.length && o.key ) {\n\t\t\tstr.push( o.key + \"=\" );\n\t\t}\n\n\t\treturn str.join( \"&\" );\n\n\t},\n\n\ttoArray: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each( function() {\n\t\t\tret.push( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" );\n\t\t} );\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function( item ) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t &&\n\t\t\t\t( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l &&\n\t\t\t\t( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t( this.options.tolerance !== \"pointer\" &&\n\t\t\t\tthis.helperProportions[ this.floating ? \"width\" : \"height\" ] >\n\t\t\t\titem[ this.floating ? \"width\" : \"height\" ] )\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( this.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( this.helperProportions.height / 2 ) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function( item ) {\n\t\tvar verticalDirection, horizontalDirection,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.top + this.offset.click.top, item.top, item.height ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.left + this.offset.click.left, item.left, item.width ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( !isOverElement ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tverticalDirection = this.dragDirection.vertical;\n\t\thorizontalDirection = this.dragDirection.horizontal;\n\n\t\treturn this.floating ?\n\t\t\t( ( horizontalDirection === \"right\" || verticalDirection === \"down\" ) ? 2 : 1 ) :\n\t\t\t( verticalDirection && ( verticalDirection === \"down\" ? 2 : 1 ) );\n\n\t},\n\n\t_intersectsWithSides: function( item ) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis( this.positionAbs.top +\n\t\t\t\tthis.offset.click.top, item.top + ( item.height / 2 ), item.height ),\n\t\t\tisOverRightHalf = this._isOverAxis( this.positionAbs.left +\n\t\t\t\tthis.offset.click.left, item.left + ( item.width / 2 ), item.width ),\n\t\t\tverticalDirection = this.dragDirection.vertical,\n\t\t\thorizontalDirection = this.dragDirection.horizontal;\n\n\t\tif ( this.floating && horizontalDirection ) {\n\t\t\treturn ( ( horizontalDirection === \"right\" && isOverRightHalf ) ||\n\t\t\t\t( horizontalDirection === \"left\" && !isOverRightHalf ) );\n\t\t} else {\n\t\t\treturn verticalDirection && ( ( verticalDirection === \"down\" && isOverBottomHalf ) ||\n\t\t\t\t( verticalDirection === \"up\" && !isOverBottomHalf ) );\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && ( delta > 0 ? \"down\" : \"up\" );\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && ( delta > 0 ? \"right\" : \"left\" );\n\t},\n\n\trefresh: function( event ) {\n\t\tthis._refreshItems( event );\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ?\n\t\t\t[ options.connectWith ] :\n\t\t\toptions.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function( connected ) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif ( connectWith && connected ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ typeof inst.options.items === \"function\" ?\n\t\t\t\t\t\t\tinst.options.items.call( inst.element ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-placeholder\" ), inst ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push( [ typeof this.options.items === \"function\" ?\n\t\t\tthis.options.items\n\t\t\t\t.call( this.element, null, { options: this.options, item: this.currentItem } ) :\n\t\t\t$( this.options.items, this.element )\n\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t.not( \".ui-sortable-placeholder\" ), this ] );\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\tqueries[ i ][ 0 ].each( addItems );\n\t\t}\n\n\t\treturn $( items );\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find( \":data(\" + this.widgetName + \"-item)\" );\n\n\t\tthis.items = $.grep( this.items, function( item ) {\n\t\t\tfor ( var j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === item.item[ 0 ] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} );\n\n\t},\n\n\t_refreshItems: function( event ) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [ this ];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [ [ typeof this.options.items === \"function\" ?\n\t\t\t\tthis.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t$( this.options.items, this.element ), this ] ],\n\t\t\tconnectWith = this._connectWith();\n\n\t\t//Shouldn't be run the first time through due to massive slow-down\n\t\tif ( connectWith && this.ready ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ typeof inst.options.items === \"function\" ?\n\t\t\t\t\t\t\tinst.options.items\n\t\t\t\t\t\t\t\t.call( inst.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element ), inst ] );\n\t\t\t\t\t\tthis.containers.push( inst );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\ttargetData = queries[ i ][ 1 ];\n\t\t\t_queries = queries[ i ][ 0 ];\n\n\t\t\tfor ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {\n\t\t\t\titem = $( _queries[ j ] );\n\n\t\t\t\t// Data for target checking (mouse manager)\n\t\t\t\titem.data( this.widgetName + \"-item\", targetData );\n\n\t\t\t\titems.push( {\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t},\n\n\t_refreshItemPositions: function( fast ) {\n\t\tvar i, item, t, p;\n\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\titem = this.items[ i ];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif ( this.currentContainer && item.instance !== this.currentContainer &&\n\t\t\t\t\titem.item[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ?\n\t\t\t\t$( this.options.toleranceElement, item.item ) :\n\t\t\t\titem.item;\n\n\t\t\tif ( !fast ) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\t},\n\n\trefreshPositions: function( fast ) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\tif ( this.innermostContainer !== null ) {\n\t\t\tthis._refreshItemPositions( fast );\n\t\t}\n\n\t\tvar i, p;\n\n\t\tif ( this.options.custom && this.options.custom.refreshContainers ) {\n\t\t\tthis.options.custom.refreshContainers.call( this );\n\t\t} else {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tp = this.containers[ i ].element.offset();\n\t\t\t\tthis.containers[ i ].containerCache.left = p.left;\n\t\t\t\tthis.containers[ i ].containerCache.top = p.top;\n\t\t\t\tthis.containers[ i ].containerCache.width =\n\t\t\t\t\tthis.containers[ i ].element.outerWidth();\n\t\t\t\tthis.containers[ i ].containerCache.height =\n\t\t\t\t\tthis.containers[ i ].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function( that ) {\n\t\tthat = that || this;\n\t\tvar className, nodeName,\n\t\t\to = that.options;\n\n\t\tif ( !o.placeholder || o.placeholder.constructor === String ) {\n\t\t\tclassName = o.placeholder;\n\t\t\tnodeName = that.currentItem[ 0 ].nodeName.toLowerCase();\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar element = $( \"<\" + nodeName + \">\", that.document[ 0 ] );\n\n\t\t\t\t\tthat._addClass( element, \"ui-sortable-placeholder\",\n\t\t\t\t\t\t\tclassName || that.currentItem[ 0 ].className )\n\t\t\t\t\t\t._removeClass( element, \"ui-sortable-helper\" );\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"<tr>\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function( container, p ) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes -\n\t\t\t\t\t// the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a\n\t\t\t\t\t// class name is specified\n\t\t\t\t\tif ( className && !o.forcePlaceholderSize ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the element doesn't have a actual height or width by itself (without\n\t\t\t\t\t// styles coming from a stylesheet), it receives the inline height and width\n\t\t\t\t\t// from the dragged item. Or, if it's a tbody or tr, it's going to have a height\n\t\t\t\t\t// anyway since we're populating them with <td>s above, but they're unlikely to\n\t\t\t\t\t// be the correct height on their own if the row heights are dynamic, so we'll\n\t\t\t\t\t// always assign the height of the dragged item given forcePlaceholderSize\n\t\t\t\t\t// is true.\n\t\t\t\t\tif ( !p.height() || ( o.forcePlaceholderSize &&\n\t\t\t\t\t\t\t( nodeName === \"tbody\" || nodeName === \"tr\" ) ) ) {\n\t\t\t\t\t\tp.height(\n\t\t\t\t\t\t\tthat.currentItem.innerHeight() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingTop\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingBottom\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t\tif ( !p.width() ) {\n\t\t\t\t\t\tp.width(\n\t\t\t\t\t\t\tthat.currentItem.innerWidth() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingLeft\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingRight\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after( that.placeholder );\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update( that, that.placeholder );\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each( function() {\n\t\t\t$( \"<td>&#160;</td>\", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t} );\n\t},\n\n\t_contactContainers: function( event ) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,\n\t\t\tfloating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// Get innermost container that intersects with item\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\n\t\t\t// Never consider a container that's located within the item itself\n\t\t\tif ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( this._intersectsWith( this.containers[ i ].containerCache ) ) {\n\n\t\t\t\t// If we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif ( innermostContainer &&\n\t\t\t\t\t\t$.contains(\n\t\t\t\t\t\t\tthis.containers[ i ].element[ 0 ],\n\t\t\t\t\t\t\tinnermostContainer.element[ 0 ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[ i ];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", event, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tthis.innermostContainer = innermostContainer;\n\n\t\t// If no intersecting containers found, return\n\t\tif ( !innermostContainer ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Move the item into the container if it's not there already\n\t\tif ( this.containers.length === 1 ) {\n\t\t\tif ( !this.containers[ innermostIndex ].containerCache.over ) {\n\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// When entering a new container, we will find the item with the least distance and\n\t\t\t// append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating( this.currentItem );\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"pageX\" : \"pageY\";\n\n\t\t\tfor ( j = this.items.length - 1; j >= 0; j-- ) {\n\t\t\t\tif ( !$.contains(\n\t\t\t\t\t\tthis.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[ j ].item.offset()[ posProperty ];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\" : \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.currentContainer === this.containers[ innermostIndex ] ) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( itemWithLeastDistance ) {\n\t\t\t\tthis._rearrange( event, itemWithLeastDistance, null, true );\n\t\t\t} else {\n\t\t\t\tthis._rearrange( event, null, this.containers[ innermostIndex ].element, true );\n\t\t\t}\n\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"change\", event, this._uiHash( this ) );\n\t\t\tthis.currentContainer = this.containers[ innermostIndex ];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update( this.currentContainer, this.placeholder );\n\n\t\t\t//Update scrollParent\n\t\t\tthis.scrollParent = this.placeholder.scrollParent();\n\n\t\t\t//Update overflowOffset\n\t\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t\t}\n\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t}\n\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelper = typeof o.helper === \"function\" ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem );\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\tthis.appendTo[ 0 ].appendChild( helper[ 0 ] );\n\t\t}\n\n\t\tif ( helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tthis._storedCSS = {\n\t\t\t\twidth: this.currentItem[ 0 ].style.width,\n\t\t\t\theight: this.currentItem[ 0 ].style.height,\n\t\t\t\tposition: this.currentItem.css( \"position\" ),\n\t\t\t\ttop: this.currentItem.css( \"top\" ),\n\t\t\t\tleft: this.currentItem.css( \"left\" )\n\t\t\t};\n\t\t}\n\n\t\tif ( !helper[ 0 ].style.width || o.forceHelperSize ) {\n\t\t\thelper.width( this.currentItem.width() );\n\t\t}\n\t\tif ( !helper[ 0 ].style.height || o.forceHelperSize ) {\n\t\t\thelper.height( this.currentItem.height() );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( Array.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this\n\t\t// information with an ugly IE fix\n\t\tif ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||\n\t\t\t\t( this.offsetParent[ 0 ].tagName &&\n\t\t\t\tthis.offsetParent[ 0 ].tagName.toLowerCase() === \"html\" && $.ui.ie ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif ( this.cssPosition === \"relative\" ) {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.currentItem.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.currentItem.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\t\tif ( o.containment === \"document\" || o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ?\n\t\t\t\t\tthis.document.width() :\n\t\t\t\t\tthis.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( o.containment === \"document\" ?\n\t\t\t\t\t( this.document.height() || document.body.parentNode.scrollHeight ) :\n\t\t\t\t\tthis.window.height() || this.document[ 0 ].body.parentNode.scrollHeight\n\t\t\t\t) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {\n\t\t\tce = $( o.containment )[ 0 ];\n\t\t\tco = $( o.containment ).offset();\n\t\t\tover = ( $( ce ).css( \"overflow\" ) !== \"hidden\" );\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + ( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingLeft\" ), 10 ) || 0 ) - this.margins.left,\n\t\t\t\tco.top + ( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingTop\" ), 10 ) || 0 ) - this.margins.top,\n\t\t\t\tco.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\tco.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :\n\t\t\t\t\tscroll.scrollLeft() ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event ) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif ( this.cssPosition === \"relative\" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif ( this.originalPosition ) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {\n\t\t\t\t\tpageX = this.containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {\n\t\t\t\t\tpageY = this.containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {\n\t\t\t\t\tpageX = this.containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {\n\t\t\t\t\tpageY = this.containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\t\t\t\ttop = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /\n\t\t\t\t\to.grid[ 1 ] ) * o.grid[ 1 ];\n\t\t\t\tpageY = this.containment ?\n\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] &&\n\t\t\t\t\t\ttop - this.offset.click.top <= this.containment[ 3 ] ) ?\n\t\t\t\t\t\t\ttop :\n\t\t\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?\n\t\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :\n\t\t\t\t\t\t\t\ttop;\n\n\t\t\t\tleft = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /\n\t\t\t\t\to.grid[ 0 ] ) * o.grid[ 0 ];\n\t\t\t\tpageX = this.containment ?\n\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] &&\n\t\t\t\t\t\tleft - this.offset.click.left <= this.containment[ 2 ] ) ?\n\t\t\t\t\t\t\tleft :\n\t\t\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?\n\t\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :\n\t\t\t\t\t\t\t\tleft;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() :\n\t\t\t\t\tscrollIsRootNode ? 0 : scroll.scrollLeft() ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function( event, i, a, hardRefresh ) {\n\n\t\tif ( a ) {\n\t\t\ta[ 0 ].appendChild( this.placeholder[ 0 ] );\n\t\t} else {\n\t\t\ti.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],\n\t\t\t\t( this.direction === \"down\" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );\n\t\t}\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout,\n\t\t// if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay( function() {\n\t\t\tif ( counter === this.counter ) {\n\n\t\t\t\t//Precompute after each DOM insertion, NOT on mousemove\n\t\t\t\tthis.refreshPositions( !hardRefresh );\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_clear: function( event, noPropagation ) {\n\n\t\tthis.reverting = false;\n\n\t\t// We delay all events that have to be triggered to after the point where the placeholder\n\t\t// has been removed and everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets\n\t\t// reappended (see #4088)\n\t\tif ( !this._noFinalSort && this.currentItem.parent().length ) {\n\t\t\tthis.placeholder.before( this.currentItem );\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tfor ( i in this._storedCSS ) {\n\t\t\t\tif ( this._storedCSS[ i ] === \"auto\" || this._storedCSS[ i ] === \"static\" ) {\n\t\t\t\t\tthis._storedCSS[ i ] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif ( this.fromOutside && !noPropagation ) {\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"receive\", event, this._uiHash( this.fromOutside ) );\n\t\t\t} );\n\t\t}\n\t\tif ( ( this.fromOutside ||\n\t\t\t\tthis.domPosition.prev !==\n\t\t\t\tthis.currentItem.prev().not( \".ui-sortable-helper\" )[ 0 ] ||\n\t\t\t\tthis.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {\n\n\t\t\t// Trigger update callback if the DOM position has changed\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"update\", event, this._uiHash() );\n\t\t\t} );\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif ( this !== this.currentContainer ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\t\tthis._trigger( \"remove\", event, this._uiHash() );\n\t\t\t\t} );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"receive\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"update\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif ( this._storedOpacity ) {\n\t\t\tthis.helper.css( \"opacity\", this._storedOpacity );\n\t\t}\n\t\tif ( this._storedZIndex ) {\n\t\t\tthis.helper.css( \"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex );\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif ( !noPropagation ) {\n\t\t\tthis._trigger( \"beforeStop\", event, this._uiHash() );\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t// it unbinds ALL events from the original node!\n\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\n\t\tif ( !this.cancelHelperRemoval ) {\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\t\t\tthis.helper = null;\n\t\t}\n\n\t\tif ( !noPropagation ) {\n\t\t\tfor ( i = 0; i < delayedTriggers.length; i++ ) {\n\n\t\t\t\t// Trigger all delayed events\n\t\t\t\tdelayedTriggers[ i ].call( this, event );\n\t\t\t}\n\t\t\tthis._trigger( \"stop\", event, this._uiHash() );\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn !this.cancelHelperRemoval;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function( _inst ) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $( [] ),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n} );\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/spinner.js",
    "content": "/*!\n * jQuery UI Spinner 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Spinner\n//>>group: Widgets\n//>>description: Displays buttons to easily input numbers via the keyboard or mouse.\n//>>docs: http://api.jqueryui.com/spinner/\n//>>demos: http://jqueryui.com/spinner/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/spinner.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./button\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nfunction spinnerModifier( fn ) {\n\treturn function() {\n\t\tvar previous = this.element.val();\n\t\tfn.apply( this, arguments );\n\t\tthis._refresh();\n\t\tif ( previous !== this.element.val() ) {\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t};\n}\n\n$.widget( \"ui.spinner\", {\n\tversion: \"1.13.0\",\n\tdefaultElement: \"<input>\",\n\twidgetEventPrefix: \"spin\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-spinner\": \"ui-corner-all\",\n\t\t\t\"ui-spinner-down\": \"ui-corner-br\",\n\t\t\t\"ui-spinner-up\": \"ui-corner-tr\"\n\t\t},\n\t\tculture: null,\n\t\ticons: {\n\t\t\tdown: \"ui-icon-triangle-1-s\",\n\t\t\tup: \"ui-icon-triangle-1-n\"\n\t\t},\n\t\tincremental: true,\n\t\tmax: null,\n\t\tmin: null,\n\t\tnumberFormat: null,\n\t\tpage: 10,\n\t\tstep: 1,\n\n\t\tchange: null,\n\t\tspin: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\n\t\t// handle string values that need to be parsed\n\t\tthis._setOption( \"max\", this.options.max );\n\t\tthis._setOption( \"min\", this.options.min );\n\t\tthis._setOption( \"step\", this.options.step );\n\n\t\t// Only format if there is a value, prevents the field from being marked\n\t\t// as invalid in Firefox, see #9573.\n\t\tif ( this.value() !== \"\" ) {\n\n\t\t\t// Format the value, but don't constrain.\n\t\t\tthis._value( this.element.val(), true );\n\t\t}\n\n\t\tthis._draw();\n\t\tthis._on( this._events );\n\t\tthis._refresh();\n\n\t\t// Turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = this._super();\n\t\tvar element = this.element;\n\n\t\t$.each( [ \"min\", \"max\", \"step\" ], function( i, option ) {\n\t\t\tvar value = element.attr( option );\n\t\t\tif ( value != null && value.length ) {\n\t\t\t\toptions[ option ] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn options;\n\t},\n\n\t_events: {\n\t\tkeydown: function( event ) {\n\t\t\tif ( this._start( event ) && this._keydown( event ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\tkeyup: \"_stop\",\n\t\tfocus: function() {\n\t\t\tthis.previous = this.element.val();\n\t\t},\n\t\tblur: function( event ) {\n\t\t\tif ( this.cancelBlur ) {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._stop();\n\t\t\tthis._refresh();\n\t\t\tif ( this.previous !== this.element.val() ) {\n\t\t\t\tthis._trigger( \"change\", event );\n\t\t\t}\n\t\t},\n\t\tmousewheel: function( event, delta ) {\n\t\t\tvar activeElement = $.ui.safeActiveElement( this.document[ 0 ] );\n\t\t\tvar isActive = this.element[ 0 ] === activeElement;\n\n\t\t\tif ( !isActive || !delta ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( !this.spinning && !this._start( event ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );\n\t\t\tclearTimeout( this.mousewheelTimer );\n\t\t\tthis.mousewheelTimer = this._delay( function() {\n\t\t\t\tif ( this.spinning ) {\n\t\t\t\t\tthis._stop( event );\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t\tevent.preventDefault();\n\t\t},\n\t\t\"mousedown .ui-spinner-button\": function( event ) {\n\t\t\tvar previous;\n\n\t\t\t// We never want the buttons to have focus; whenever the user is\n\t\t\t// interacting with the spinner, the focus should be on the input.\n\t\t\t// If the input is focused then this.previous is properly set from\n\t\t\t// when the input first received focus. If the input is not focused\n\t\t\t// then we need to set this.previous based on the value before spinning.\n\t\t\tprevious = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?\n\t\t\t\tthis.previous : this.element.val();\n\t\t\tfunction checkFocus() {\n\t\t\t\tvar isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );\n\t\t\t\tif ( !isActive ) {\n\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\tthis.previous = previous;\n\n\t\t\t\t\t// support: IE\n\t\t\t\t\t// IE sets focus asynchronously, so we need to check if focus\n\t\t\t\t\t// moved off of the input because the user clicked on the button.\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ensure focus is on (or stays on) the text field\n\t\t\tevent.preventDefault();\n\t\t\tcheckFocus.call( this );\n\n\t\t\t// Support: IE\n\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t// and check (again) if focus moved off of the input.\n\t\t\tthis.cancelBlur = true;\n\t\t\tthis._delay( function() {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\tcheckFocus.call( this );\n\t\t\t} );\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t\"mouseup .ui-spinner-button\": \"_stop\",\n\t\t\"mouseenter .ui-spinner-button\": function( event ) {\n\n\t\t\t// button will add ui-state-active if mouse was down while mouseleave and kept down\n\t\t\tif ( !$( event.currentTarget ).hasClass( \"ui-state-active\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\n\t\t// TODO: do we really want to consider this a stop?\n\t\t// shouldn't we just stop the repeater and wait until mouseup before\n\t\t// we trigger the stop event?\n\t\t\"mouseleave .ui-spinner-button\": \"_stop\"\n\t},\n\n\t// Support mobile enhanced option and make backcompat more sane\n\t_enhance: function() {\n\t\tthis.uiSpinner = this.element\n\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t.wrap( \"<span>\" )\n\t\t\t.parent()\n\n\t\t\t\t// Add buttons\n\t\t\t\t.append(\n\t\t\t\t\t\"<a></a><a></a>\"\n\t\t\t\t);\n\t},\n\n\t_draw: function() {\n\t\tthis._enhance();\n\n\t\tthis._addClass( this.uiSpinner, \"ui-spinner\", \"ui-widget ui-widget-content\" );\n\t\tthis._addClass( \"ui-spinner-input\" );\n\n\t\tthis.element.attr( \"role\", \"spinbutton\" );\n\n\t\t// Button bindings\n\t\tthis.buttons = this.uiSpinner.children( \"a\" )\n\t\t\t.attr( \"tabIndex\", -1 )\n\t\t\t.attr( \"aria-hidden\", true )\n\t\t\t.button( {\n\t\t\t\tclasses: {\n\t\t\t\t\t\"ui-button\": \"\"\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// TODO: Right now button does not support classes this is already updated in button PR\n\t\tthis._removeClass( this.buttons, \"ui-corner-all\" );\n\n\t\tthis._addClass( this.buttons.first(), \"ui-spinner-button ui-spinner-up\" );\n\t\tthis._addClass( this.buttons.last(), \"ui-spinner-button ui-spinner-down\" );\n\t\tthis.buttons.first().button( {\n\t\t\t\"icon\": this.options.icons.up,\n\t\t\t\"showLabel\": false\n\t\t} );\n\t\tthis.buttons.last().button( {\n\t\t\t\"icon\": this.options.icons.down,\n\t\t\t\"showLabel\": false\n\t\t} );\n\n\t\t// IE 6 doesn't understand height: 50% for the buttons\n\t\t// unless the wrapper has an explicit height\n\t\tif ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&\n\t\t\t\tthis.uiSpinner.height() > 0 ) {\n\t\t\tthis.uiSpinner.height( this.uiSpinner.height() );\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar options = this.options,\n\t\t\tkeyCode = $.ui.keyCode;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.UP:\n\t\t\tthis._repeat( null, 1, event );\n\t\t\treturn true;\n\t\tcase keyCode.DOWN:\n\t\t\tthis._repeat( null, -1, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_UP:\n\t\t\tthis._repeat( null, options.page, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_DOWN:\n\t\t\tthis._repeat( null, -options.page, event );\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_start: function( event ) {\n\t\tif ( !this.spinning && this._trigger( \"start\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\t\tthis.spinning = true;\n\t\treturn true;\n\t},\n\n\t_repeat: function( i, steps, event ) {\n\t\ti = i || 500;\n\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay( function() {\n\t\t\tthis._repeat( 40, steps, event );\n\t\t}, i );\n\n\t\tthis._spin( steps * this.options.step, event );\n\t},\n\n\t_spin: function( step, event ) {\n\t\tvar value = this.value() || 0;\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\n\t\tvalue = this._adjustValue( value + step * this._increment( this.counter ) );\n\n\t\tif ( !this.spinning || this._trigger( \"spin\", event, { value: value } ) !== false ) {\n\t\t\tthis._value( value );\n\t\t\tthis.counter++;\n\t\t}\n\t},\n\n\t_increment: function( i ) {\n\t\tvar incremental = this.options.incremental;\n\n\t\tif ( incremental ) {\n\t\t\treturn typeof incremental === \"function\" ?\n\t\t\t\tincremental( i ) :\n\t\t\t\tMath.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_adjustValue: function( value ) {\n\t\tvar base, aboveMin,\n\t\t\toptions = this.options;\n\n\t\t// Make sure we're at a valid step\n\t\t// - find out where we are relative to the base (min or 0)\n\t\tbase = options.min !== null ? options.min : 0;\n\t\taboveMin = value - base;\n\n\t\t// - round to the nearest step\n\t\taboveMin = Math.round( aboveMin / options.step ) * options.step;\n\n\t\t// - rounding is based on 0, so adjust back to our base\n\t\tvalue = base + aboveMin;\n\n\t\t// Fix precision from bad JS floating point math\n\t\tvalue = parseFloat( value.toFixed( this._precision() ) );\n\n\t\t// Clamp the value\n\t\tif ( options.max !== null && value > options.max ) {\n\t\t\treturn options.max;\n\t\t}\n\t\tif ( options.min !== null && value < options.min ) {\n\t\t\treturn options.min;\n\t\t}\n\n\t\treturn value;\n\t},\n\n\t_stop: function( event ) {\n\t\tif ( !this.spinning ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( this.timer );\n\t\tclearTimeout( this.mousewheelTimer );\n\t\tthis.counter = 0;\n\t\tthis.spinning = false;\n\t\tthis._trigger( \"stop\", event );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar prevValue, first, last;\n\n\t\tif ( key === \"culture\" || key === \"numberFormat\" ) {\n\t\t\tprevValue = this._parse( this.element.val() );\n\t\t\tthis.options[ key ] = value;\n\t\t\tthis.element.val( this._format( prevValue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"max\" || key === \"min\" || key === \"step\" ) {\n\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\tvalue = this._parse( value );\n\t\t\t}\n\t\t}\n\t\tif ( key === \"icons\" ) {\n\t\t\tfirst = this.buttons.first().find( \".ui-icon\" );\n\t\t\tthis._removeClass( first, null, this.options.icons.up );\n\t\t\tthis._addClass( first, null, value.up );\n\t\t\tlast = this.buttons.last().find( \".ui-icon\" );\n\t\t\tthis._removeClass( last, null, this.options.icons.down );\n\t\t\tthis._addClass( last, null, value.down );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis._toggleClass( this.uiSpinner, null, \"ui-state-disabled\", !!value );\n\t\tthis.element.prop( \"disabled\", !!value );\n\t\tthis.buttons.button( value ? \"disable\" : \"enable\" );\n\t},\n\n\t_setOptions: spinnerModifier( function( options ) {\n\t\tthis._super( options );\n\t} ),\n\n\t_parse: function( val ) {\n\t\tif ( typeof val === \"string\" && val !== \"\" ) {\n\t\t\tval = window.Globalize && this.options.numberFormat ?\n\t\t\t\tGlobalize.parseFloat( val, 10, this.options.culture ) : +val;\n\t\t}\n\t\treturn val === \"\" || isNaN( val ) ? null : val;\n\t},\n\n\t_format: function( value ) {\n\t\tif ( value === \"\" ) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn window.Globalize && this.options.numberFormat ?\n\t\t\tGlobalize.format( value, this.options.numberFormat, this.options.culture ) :\n\t\t\tvalue;\n\t},\n\n\t_refresh: function() {\n\t\tthis.element.attr( {\n\t\t\t\"aria-valuemin\": this.options.min,\n\t\t\t\"aria-valuemax\": this.options.max,\n\n\t\t\t// TODO: what should we do with values that can't be parsed?\n\t\t\t\"aria-valuenow\": this._parse( this.element.val() )\n\t\t} );\n\t},\n\n\tisValid: function() {\n\t\tvar value = this.value();\n\n\t\t// Null is invalid\n\t\tif ( value === null ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If value gets adjusted, it's invalid\n\t\treturn value === this._adjustValue( value );\n\t},\n\n\t// Update the value without triggering change\n\t_value: function( value, allowAny ) {\n\t\tvar parsed;\n\t\tif ( value !== \"\" ) {\n\t\t\tparsed = this._parse( value );\n\t\t\tif ( parsed !== null ) {\n\t\t\t\tif ( !allowAny ) {\n\t\t\t\t\tparsed = this._adjustValue( parsed );\n\t\t\t\t}\n\t\t\t\tvalue = this._format( parsed );\n\t\t\t}\n\t\t}\n\t\tthis.element.val( value );\n\t\tthis._refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.prop( \"disabled\", false )\n\t\t\t.removeAttr( \"autocomplete role aria-valuemin aria-valuemax aria-valuenow\" );\n\n\t\tthis.uiSpinner.replaceWith( this.element );\n\t},\n\n\tstepUp: spinnerModifier( function( steps ) {\n\t\tthis._stepUp( steps );\n\t} ),\n\t_stepUp: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tstepDown: spinnerModifier( function( steps ) {\n\t\tthis._stepDown( steps );\n\t} ),\n\t_stepDown: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * -this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tpageUp: spinnerModifier( function( pages ) {\n\t\tthis._stepUp( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tpageDown: spinnerModifier( function( pages ) {\n\t\tthis._stepDown( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tvalue: function( newVal ) {\n\t\tif ( !arguments.length ) {\n\t\t\treturn this._parse( this.element.val() );\n\t\t}\n\t\tspinnerModifier( this._value ).call( this, newVal );\n\t},\n\n\twidget: function() {\n\t\treturn this.uiSpinner;\n\t}\n} );\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for spinner html extension points\n\t$.widget( \"ui.spinner\", $.ui.spinner, {\n\t\t_enhance: function() {\n\t\t\tthis.uiSpinner = this.element\n\t\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t\t.wrap( this._uiSpinnerHtml() )\n\t\t\t\t.parent()\n\n\t\t\t\t\t// Add buttons\n\t\t\t\t\t.append( this._buttonHtml() );\n\t\t},\n\t\t_uiSpinnerHtml: function() {\n\t\t\treturn \"<span>\";\n\t\t},\n\n\t\t_buttonHtml: function() {\n\t\t\treturn \"<a></a><a></a>\";\n\t\t}\n\t} );\n}\n\nreturn $.ui.spinner;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/tabs.js",
    "content": "/*!\n * jQuery UI Tabs 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tabs\n//>>group: Widgets\n//>>description: Transforms a set of container elements into a tab structure.\n//>>docs: http://api.jqueryui.com/tabs/\n//>>demos: http://jqueryui.com/tabs/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tabs.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.widget( \"ui.tabs\", {\n\tversion: \"1.13.0\",\n\tdelay: 300,\n\toptions: {\n\t\tactive: null,\n\t\tclasses: {\n\t\t\t\"ui-tabs\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-nav\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-panel\": \"ui-corner-bottom\",\n\t\t\t\"ui-tabs-tab\": \"ui-corner-top\"\n\t\t},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theightStyle: \"content\",\n\t\thide: null,\n\t\tshow: null,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null,\n\t\tbeforeLoad: null,\n\t\tload: null\n\t},\n\n\t_isLocal: ( function() {\n\t\tvar rhash = /#.*$/;\n\n\t\treturn function( anchor ) {\n\t\t\tvar anchorUrl, locationUrl;\n\n\t\t\tanchorUrl = anchor.href.replace( rhash, \"\" );\n\t\t\tlocationUrl = location.href.replace( rhash, \"\" );\n\n\t\t\t// Decoding may throw an error if the URL isn't UTF-8 (#9518)\n\t\t\ttry {\n\t\t\t\tanchorUrl = decodeURIComponent( anchorUrl );\n\t\t\t} catch ( error ) {}\n\t\t\ttry {\n\t\t\t\tlocationUrl = decodeURIComponent( locationUrl );\n\t\t\t} catch ( error ) {}\n\n\t\t\treturn anchor.hash.length > 1 && anchorUrl === locationUrl;\n\t\t};\n\t} )(),\n\n\t_create: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.running = false;\n\n\t\tthis._addClass( \"ui-tabs\", \"ui-widget ui-widget-content\" );\n\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, options.collapsible );\n\n\t\tthis._processTabs();\n\t\toptions.active = this._initialActive();\n\n\t\t// Take disabling tabs via class attribute from HTML\n\t\t// into account and update option properly.\n\t\tif ( Array.isArray( options.disabled ) ) {\n\t\t\toptions.disabled = $.uniqueSort( options.disabled.concat(\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\n\t\t\t\t\treturn that.tabs.index( li );\n\t\t\t\t} )\n\t\t\t) ).sort();\n\t\t}\n\n\t\t// Check for length avoids error when initializing empty list\n\t\tif ( this.options.active !== false && this.anchors.length ) {\n\t\t\tthis.active = this._findActive( options.active );\n\t\t} else {\n\t\t\tthis.active = $();\n\t\t}\n\n\t\tthis._refresh();\n\n\t\tif ( this.active.length ) {\n\t\t\tthis.load( options.active );\n\t\t}\n\t},\n\n\t_initialActive: function() {\n\t\tvar active = this.options.active,\n\t\t\tcollapsible = this.options.collapsible,\n\t\t\tlocationHash = location.hash.substring( 1 );\n\n\t\tif ( active === null ) {\n\n\t\t\t// check the fragment identifier in the URL\n\t\t\tif ( locationHash ) {\n\t\t\t\tthis.tabs.each( function( i, tab ) {\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\n\t\t\t\t\t\tactive = i;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Check for a tab marked active via a class\n\t\t\tif ( active === null ) {\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\n\t\t\t}\n\n\t\t\t// No active tab, set to false\n\t\t\tif ( active === null || active === -1 ) {\n\t\t\t\tactive = this.tabs.length ? 0 : false;\n\t\t\t}\n\t\t}\n\n\t\t// Handle numbers: negative, out of range\n\t\tif ( active !== false ) {\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\n\t\t\tif ( active === -1 ) {\n\t\t\t\tactive = collapsible ? false : 0;\n\t\t\t}\n\t\t}\n\n\t\t// Don't allow collapsible: false and active: false\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\n\t\t\tactive = 0;\n\t\t}\n\n\t\treturn active;\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\ttab: this.active,\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\n\t\t};\n\t},\n\n\t_tabKeydown: function( event ) {\n\t\tvar focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( \"li\" ),\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\n\t\t\tgoingForward = true;\n\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.RIGHT:\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tselectedIndex++;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tgoingForward = false;\n\t\t\tselectedIndex--;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tselectedIndex = this.anchors.length - 1;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tselectedIndex = 0;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.SPACE:\n\n\t\t\t// Activate only, no collapsing\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\t\t\tthis._activate( selectedIndex );\n\t\t\treturn;\n\t\tcase $.ui.keyCode.ENTER:\n\n\t\t\t// Toggle (cancel delayed activation, allow collapsing)\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\n\t\t\t// Determine if we should collapse or activate\n\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\n\t\t\treturn;\n\t\tdefault:\n\t\t\treturn;\n\t\t}\n\n\t\t// Focus the appropriate tab, based on which key was pressed\n\t\tevent.preventDefault();\n\t\tclearTimeout( this.activating );\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\n\n\t\t// Navigating with control/command key will prevent automatic activation\n\t\tif ( !event.ctrlKey && !event.metaKey ) {\n\n\t\t\t// Update aria-selected immediately so that AT think the tab is already selected.\n\t\t\t// Otherwise AT may confuse the user by stating that they need to activate the tab,\n\t\t\t// but the tab will already be activated by the time the announcement finishes.\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\n\n\t\t\tthis.activating = this._delay( function() {\n\t\t\t\tthis.option( \"active\", selectedIndex );\n\t\t\t}, this.delay );\n\t\t}\n\t},\n\n\t_panelKeydown: function( event ) {\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+up moves focus to the current tab\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.active.trigger( \"focus\" );\n\t\t}\n\t},\n\n\t// Alt+page up/down moves focus to the previous/next tab (and activates)\n\t_handlePageNav: function( event ) {\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\n\t\t\treturn true;\n\t\t}\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t_findNextTab: function( index, goingForward ) {\n\t\tvar lastTabIndex = this.tabs.length - 1;\n\n\t\tfunction constrain() {\n\t\t\tif ( index > lastTabIndex ) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\tif ( index < 0 ) {\n\t\t\t\tindex = lastTabIndex;\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\n\t\t\tindex = goingForward ? index + 1 : index - 1;\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_focusNextTab: function( index, goingForward ) {\n\t\tindex = this._findNextTab( index, goingForward );\n\t\tthis.tabs.eq( index ).trigger( \"focus\" );\n\t\treturn index;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"collapsible\" ) {\n\t\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, value );\n\n\t\t\t// Setting collapsible: false while collapsed; open first panel\n\t\t\tif ( !value && this.options.active === false ) {\n\t\t\t\tthis._activate( 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tif ( key === \"heightStyle\" ) {\n\t\t\tthis._setupHeightStyle( value );\n\t\t}\n\t},\n\n\t_sanitizeSelector: function( hash ) {\n\t\treturn hash ? hash.replace( /[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g, \"\\\\$&\" ) : \"\";\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options,\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\n\n\t\t// Get disabled tabs from class attribute from HTML\n\t\t// this will get converted to a boolean if needed in _refresh()\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\n\t\t\treturn lis.index( tab );\n\t\t} );\n\n\t\tthis._processTabs();\n\n\t\t// Was collapsed or no tabs\n\t\tif ( options.active === false || !this.anchors.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\n\t\t// was active, but active tab is gone\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\n\n\t\t\t// all remaining tabs are disabled\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\n\t\t\t// activate previous tab\n\t\t\t} else {\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\n\t\t\t}\n\n\t\t// was active, active tab still exists\n\t\t} else {\n\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.tabs.index( this.active );\n\t\t}\n\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tthis._setOptionDisabled( this.options.disabled );\n\t\tthis._setupEvents( this.options.event );\n\t\tthis._setupHeightStyle( this.options.heightStyle );\n\n\t\tthis.tabs.not( this.active ).attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\ttabIndex: -1\n\t\t} );\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\n\t\t\t.hide()\n\t\t\t.attr( {\n\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t} );\n\n\t\t// Make sure one tab is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t} );\n\t\t\tthis._addClass( this.active, \"ui-tabs-active\", \"ui-state-active\" );\n\t\t\tthis._getPanelForTab( this.active )\n\t\t\t\t.show()\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_processTabs: function() {\n\t\tvar that = this,\n\t\t\tprevTabs = this.tabs,\n\t\t\tprevAnchors = this.anchors,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.tablist = this._getList().attr( \"role\", \"tablist\" );\n\t\tthis._addClass( this.tablist, \"ui-tabs-nav\",\n\t\t\t\"ui-helper-reset ui-helper-clearfix ui-widget-header\" );\n\n\t\t// Prevent users from focusing disabled tabs via click\n\t\tthis.tablist\n\t\t\t.on( \"mousedown\" + this.eventNamespace, \"> li\", function( event ) {\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t} )\n\n\t\t\t// Support: IE <9\n\t\t\t// Preventing the default action in mousedown doesn't prevent IE\n\t\t\t// from focusing the element, so if the anchor gets focused, blur.\n\t\t\t// We don't have to worry about focusing the previously focused\n\t\t\t// element since clicking on a non-focusable element should focus\n\t\t\t// the body anyway.\n\t\t\t.on( \"focus\" + this.eventNamespace, \".ui-tabs-anchor\", function() {\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"tab\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.tabs, \"ui-tabs-tab\", \"ui-state-default\" );\n\n\t\tthis.anchors = this.tabs.map( function() {\n\t\t\treturn $( \"a\", this )[ 0 ];\n\t\t} )\n\t\t\t.attr( {\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.anchors, \"ui-tabs-anchor\" );\n\n\t\tthis.panels = $();\n\n\t\tthis.anchors.each( function( i, anchor ) {\n\t\t\tvar selector, panel, panelId,\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\n\n\t\t\t// Inline tab\n\t\t\tif ( that._isLocal( anchor ) ) {\n\t\t\t\tselector = anchor.hash;\n\t\t\t\tpanelId = selector.substring( 1 );\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\n\n\t\t\t// remote tab\n\t\t\t} else {\n\n\t\t\t\t// If the tab doesn't already have aria-controls,\n\t\t\t\t// generate an id by using a throw-away element\n\t\t\t\tpanelId = tab.attr( \"aria-controls\" ) || $( {} ).uniqueId()[ 0 ].id;\n\t\t\t\tselector = \"#\" + panelId;\n\t\t\t\tpanel = that.element.find( selector );\n\t\t\t\tif ( !panel.length ) {\n\t\t\t\t\tpanel = that._createPanel( panelId );\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\n\t\t\t\t}\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\n\t\t\t}\n\n\t\t\tif ( panel.length ) {\n\t\t\t\tthat.panels = that.panels.add( panel );\n\t\t\t}\n\t\t\tif ( originalAriaControls ) {\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\n\t\t\t}\n\t\t\ttab.attr( {\n\t\t\t\t\"aria-controls\": panelId,\n\t\t\t\t\"aria-labelledby\": anchorId\n\t\t\t} );\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\n\t\t} );\n\n\t\tthis.panels.attr( \"role\", \"tabpanel\" );\n\t\tthis._addClass( this.panels, \"ui-tabs-panel\", \"ui-widget-content\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevTabs ) {\n\t\t\tthis._off( prevTabs.not( this.tabs ) );\n\t\t\tthis._off( prevAnchors.not( this.anchors ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t// Allow overriding how to find the list for rare usage scenarios (#7715)\n\t_getList: function() {\n\t\treturn this.tablist || this.element.find( \"ol, ul\" ).eq( 0 );\n\t},\n\n\t_createPanel: function( id ) {\n\t\treturn $( \"<div>\" )\n\t\t\t.attr( \"id\", id )\n\t\t\t.data( \"ui-tabs-destroy\", true );\n\t},\n\n\t_setOptionDisabled: function( disabled ) {\n\t\tvar currentItem, li, i;\n\n\t\tif ( Array.isArray( disabled ) ) {\n\t\t\tif ( !disabled.length ) {\n\t\t\t\tdisabled = false;\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t}\n\n\t\t// Disable tabs\n\t\tfor ( i = 0; ( li = this.tabs[ i ] ); i++ ) {\n\t\t\tcurrentItem = $( li );\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\n\t\t\t\tcurrentItem.attr( \"aria-disabled\", \"true\" );\n\t\t\t\tthis._addClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t} else {\n\t\t\t\tcurrentItem.removeAttr( \"aria-disabled\" );\n\t\t\t\tthis._removeClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t}\n\t\t}\n\n\t\tthis.options.disabled = disabled;\n\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null,\n\t\t\tdisabled === true );\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t} );\n\t\t}\n\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\n\n\t\t// Always prevent the default action, even when disabled\n\t\tthis._on( true, this.anchors, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} );\n\t\tthis._on( this.anchors, events );\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\n\n\t\tthis._focusable( this.tabs );\n\t\tthis._hoverable( this.tabs );\n\t},\n\n\t_setupHeightStyle: function( heightStyle ) {\n\t\tvar maxHeight,\n\t\t\tparent = this.element.parent();\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\n\n\t\t\tthis.element.siblings( \":visible\" ).each( function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.element.children().not( this.panels ).each( function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.panels.each( function() {\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t} )\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.panels.each( function() {\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\n\t\t\t} ).height( maxHeight );\n\t\t}\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tanchor = $( event.currentTarget ),\n\t\t\ttab = anchor.closest( \"li\" ),\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\n\t\t\teventData = {\n\t\t\t\toldTab: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewTab: collapsing ? $() : tab,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\n\n\t\t\t\t// tab is already loading\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\n\n\t\t\t\t// can't switch durning an animation\n\t\t\t\tthis.running ||\n\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\n\n\t\tthis.active = clickedIsActive ? $() : tab;\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tif ( !toHide.length && !toShow.length ) {\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\n\t\t}\n\n\t\tif ( toShow.length ) {\n\t\t\tthis.load( this.tabs.index( tab ), event );\n\t\t}\n\t\tthis._toggle( event, eventData );\n\t},\n\n\t// Handles show/hide for selecting tabs\n\t_toggle: function( event, eventData ) {\n\t\tvar that = this,\n\t\t\ttoShow = eventData.newPanel,\n\t\t\ttoHide = eventData.oldPanel;\n\n\t\tthis.running = true;\n\n\t\tfunction complete() {\n\t\t\tthat.running = false;\n\t\t\tthat._trigger( \"activate\", event, eventData );\n\t\t}\n\n\t\tfunction show() {\n\t\t\tthat._addClass( eventData.newTab.closest( \"li\" ), \"ui-tabs-active\", \"ui-state-active\" );\n\n\t\t\tif ( toShow.length && that.options.show ) {\n\t\t\t\tthat._show( toShow, that.options.show, complete );\n\t\t\t} else {\n\t\t\t\ttoShow.show();\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\n\t\t// Start out by hiding, then showing, then completing\n\t\tif ( toHide.length && this.options.hide ) {\n\t\t\tthis._hide( toHide, this.options.hide, function() {\n\t\t\t\tthat._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\t\tshow();\n\t\t\t} );\n\t\t} else {\n\t\t\tthis._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\ttoHide.hide();\n\t\t\tshow();\n\t\t}\n\n\t\ttoHide.attr( \"aria-hidden\", \"true\" );\n\t\teventData.oldTab.attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t} );\n\n\t\t// If we're switching tabs, remove the old tab from the tab order.\n\t\t// If we're opening from collapsed state, remove the previous tab from the tab order.\n\t\t// If we're collapsing, then keep the collapsing tab in the tab order.\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.tabs.filter( function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t} )\n\t\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow.attr( \"aria-hidden\", \"false\" );\n\t\teventData.newTab.attr( {\n\t\t\t\"aria-selected\": \"true\",\n\t\t\t\"aria-expanded\": \"true\",\n\t\t\ttabIndex: 0\n\t\t} );\n\t},\n\n\t_activate: function( index ) {\n\t\tvar anchor,\n\t\t\tactive = this._findActive( index );\n\n\t\t// Trying to activate the already active panel\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Trying to collapse, simulate a click on the current active header\n\t\tif ( !active.length ) {\n\t\t\tactive = this.active;\n\t\t}\n\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\n\t\tthis._eventHandler( {\n\t\t\ttarget: anchor,\n\t\t\tcurrentTarget: anchor,\n\t\t\tpreventDefault: $.noop\n\t\t} );\n\t},\n\n\t_findActive: function( index ) {\n\t\treturn index === false ? $() : this.tabs.eq( index );\n\t},\n\n\t_getIndex: function( index ) {\n\n\t\t// meta-function to give users option to provide a href string instead of a numerical index.\n\t\tif ( typeof index === \"string\" ) {\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" +\n\t\t\t\t$.escapeSelector( index ) + \"']\" ) );\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tthis.tablist\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.off( this.eventNamespace );\n\n\t\tthis.anchors\n\t\t\t.removeAttr( \"role tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis.tabs.add( this.panels ).each( function() {\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\n\t\t\t\t$( this ).remove();\n\t\t\t} else {\n\t\t\t\t$( this ).removeAttr( \"role tabIndex \" +\n\t\t\t\t\t\"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.tabs.each( function() {\n\t\t\tvar li = $( this ),\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\n\t\t\tif ( prev ) {\n\t\t\t\tli\n\t\t\t\t\t.attr( \"aria-controls\", prev )\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\n\t\t\t} else {\n\t\t\t\tli.removeAttr( \"aria-controls\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.panels.show();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tthis.panels.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\tenable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = false;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( Array.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tdisable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = true;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( Array.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\n\t\t\t} else {\n\t\t\t\tdisabled = [ index ];\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tload: function( index, event ) {\n\t\tindex = this._getIndex( index );\n\t\tvar that = this,\n\t\t\ttab = this.tabs.eq( index ),\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\n\t\t\tpanel = this._getPanelForTab( tab ),\n\t\t\teventData = {\n\t\t\t\ttab: tab,\n\t\t\t\tpanel: panel\n\t\t\t},\n\t\t\tcomplete = function( jqXHR, status ) {\n\t\t\t\tif ( status === \"abort\" ) {\n\t\t\t\t\tthat.panels.stop( false, true );\n\t\t\t\t}\n\n\t\t\t\tthat._removeClass( tab, \"ui-tabs-loading\" );\n\t\t\t\tpanel.removeAttr( \"aria-busy\" );\n\n\t\t\t\tif ( jqXHR === that.xhr ) {\n\t\t\t\t\tdelete that.xhr;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Not remote\n\t\tif ( this._isLocal( anchor[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\n\n\t\t// Support: jQuery <1.8\n\t\t// jQuery <1.8 returns false if the request is canceled in beforeSend,\n\t\t// but as of 1.8, $.ajax() always returns a jqXHR object.\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\n\t\t\tthis._addClass( tab, \"ui-tabs-loading\" );\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\n\n\t\t\tthis.xhr\n\t\t\t\t.done( function( response, status, jqXHR ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tpanel.html( response );\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\n\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} )\n\t\t\t\t.fail( function( jqXHR, status ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_ajaxSettings: function( anchor, event, eventData ) {\n\t\tvar that = this;\n\t\treturn {\n\n\t\t\t// Support: IE <11 only\n\t\t\t// Strip any hash that exists to prevent errors with the Ajax request\n\t\t\turl: anchor.attr( \"href\" ).replace( /#.*$/, \"\" ),\n\t\t\tbeforeSend: function( jqXHR, settings ) {\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\n\t\t\t\t\t$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t_getPanelForTab: function( tab ) {\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for ui-tab class (now ui-tabs-tab)\n\t$.widget( \"ui.tabs\", $.ui.tabs, {\n\t\t_processTabs: function() {\n\t\t\tthis._superApply( arguments );\n\t\t\tthis._addClass( this.tabs, \"ui-tab\" );\n\t\t}\n\t} );\n}\n\nreturn $.ui.tabs;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/jquery/ui/tooltip.js",
    "content": "/*!\n * jQuery UI Tooltip 1.13.0\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tooltip\n//>>group: Widgets\n//>>description: Shows additional information for any element on hover or focus.\n//>>docs: http://api.jqueryui.com/tooltip/\n//>>demos: http://jqueryui.com/tooltip/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tooltip.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./core\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.widget( \"ui.tooltip\", {\n\tversion: \"1.13.0\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-tooltip\": \"ui-corner-all ui-widget-shadow\"\n\t\t},\n\t\tcontent: function() {\n\t\t\tvar title = $( this ).attr( \"title\" );\n\n\t\t\t// Escape title, since we're going from an attribute to raw HTML\n\t\t\treturn $( \"<a>\" ).text( title ).html();\n\t\t},\n\t\thide: true,\n\n\t\t// Disabled elements have inconsistent behavior across browsers (#8661)\n\t\titems: \"[title]:not([disabled])\",\n\t\tposition: {\n\t\t\tmy: \"left top+15\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"flipfit flip\"\n\t\t},\n\t\tshow: true,\n\t\ttrack: false,\n\n\t\t// Callbacks\n\t\tclose: null,\n\t\topen: null\n\t},\n\n\t_addDescribedBy: function( elem, id ) {\n\t\tvar describedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ );\n\t\tdescribedby.push( id );\n\t\telem\n\t\t\t.data( \"ui-tooltip-id\", id )\n\t\t\t.attr( \"aria-describedby\", String.prototype.trim.call( describedby.join( \" \" ) ) );\n\t},\n\n\t_removeDescribedBy: function( elem ) {\n\t\tvar id = elem.data( \"ui-tooltip-id\" ),\n\t\t\tdescribedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ ),\n\t\t\tindex = $.inArray( id, describedby );\n\n\t\tif ( index !== -1 ) {\n\t\t\tdescribedby.splice( index, 1 );\n\t\t}\n\n\t\telem.removeData( \"ui-tooltip-id\" );\n\t\tdescribedby = String.prototype.trim.call( describedby.join( \" \" ) );\n\t\tif ( describedby ) {\n\t\t\telem.attr( \"aria-describedby\", describedby );\n\t\t} else {\n\t\t\telem.removeAttr( \"aria-describedby\" );\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._on( {\n\t\t\tmouseover: \"open\",\n\t\t\tfocusin: \"open\"\n\t\t} );\n\n\t\t// IDs of generated tooltips, needed for destroy\n\t\tthis.tooltips = {};\n\n\t\t// IDs of parent tooltips where we removed the title attribute\n\t\tthis.parents = {};\n\n\t\t// Append the aria-live region so tooltips announce correctly\n\t\tthis.liveRegion = $( \"<div>\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"log\",\n\t\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\t\"aria-relevant\": \"additions\"\n\t\t\t} )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\t\tthis._addClass( this.liveRegion, null, \"ui-helper-hidden-accessible\" );\n\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar that = this;\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"content\" ) {\n\t\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\t\tthat._updateContent( tooltipData.element );\n\t\t\t} );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis[ value ? \"_disable\" : \"_enable\" ]();\n\t},\n\n\t_disable: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\tvar event = $.Event( \"blur\" );\n\t\t\tevent.target = event.currentTarget = tooltipData.element[ 0 ];\n\t\t\tthat.close( event, true );\n\t\t} );\n\n\t\t// Remove title attributes to prevent native tooltips\n\t\tthis.disabledTitles = this.disabledTitles.add(\n\t\t\tthis.element.find( this.options.items ).addBack()\n\t\t\t\t.filter( function() {\n\t\t\t\t\tvar element = $( this );\n\t\t\t\t\tif ( element.is( \"[title]\" ) ) {\n\t\t\t\t\t\treturn element\n\t\t\t\t\t\t\t.data( \"ui-tooltip-title\", element.attr( \"title\" ) )\n\t\t\t\t\t\t\t.removeAttr( \"title\" );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t);\n\t},\n\n\t_enable: function() {\n\n\t\t// restore title attributes\n\t\tthis.disabledTitles.each( function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t}\n\t\t} );\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\topen: function( event ) {\n\t\tvar that = this,\n\t\t\ttarget = $( event ? event.target : this.element )\n\n\t\t\t\t// we need closest here due to mouseover bubbling,\n\t\t\t\t// but always pointing at the same event target\n\t\t\t\t.closest( this.options.items );\n\n\t\t// No element to show a tooltip for or the tooltip is already open\n\t\tif ( !target.length || target.data( \"ui-tooltip-id\" ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( target.attr( \"title\" ) ) {\n\t\t\ttarget.data( \"ui-tooltip-title\", target.attr( \"title\" ) );\n\t\t}\n\n\t\ttarget.data( \"ui-tooltip-open\", true );\n\n\t\t// Kill parent tooltips, custom or native, for hover\n\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\ttarget.parents().each( function() {\n\t\t\t\tvar parent = $( this ),\n\t\t\t\t\tblurEvent;\n\t\t\t\tif ( parent.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\tblurEvent = $.Event( \"blur\" );\n\t\t\t\t\tblurEvent.target = blurEvent.currentTarget = this;\n\t\t\t\t\tthat.close( blurEvent, true );\n\t\t\t\t}\n\t\t\t\tif ( parent.attr( \"title\" ) ) {\n\t\t\t\t\tparent.uniqueId();\n\t\t\t\t\tthat.parents[ this.id ] = {\n\t\t\t\t\t\telement: this,\n\t\t\t\t\t\ttitle: parent.attr( \"title\" )\n\t\t\t\t\t};\n\t\t\t\t\tparent.attr( \"title\", \"\" );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tthis._registerCloseHandlers( event, target );\n\t\tthis._updateContent( target, event );\n\t},\n\n\t_updateContent: function( target, event ) {\n\t\tvar content,\n\t\t\tcontentOption = this.options.content,\n\t\t\tthat = this,\n\t\t\teventType = event ? event.type : null;\n\n\t\tif ( typeof contentOption === \"string\" || contentOption.nodeType ||\n\t\t\t\tcontentOption.jquery ) {\n\t\t\treturn this._open( event, target, contentOption );\n\t\t}\n\n\t\tcontent = contentOption.call( target[ 0 ], function( response ) {\n\n\t\t\t// IE may instantly serve a cached response for ajax requests\n\t\t\t// delay this call to _open so the other call to _open runs first\n\t\t\tthat._delay( function() {\n\n\t\t\t\t// Ignore async response if tooltip was closed already\n\t\t\t\tif ( !target.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// JQuery creates a special event for focusin when it doesn't\n\t\t\t\t// exist natively. To improve performance, the native event\n\t\t\t\t// object is reused and the type is changed. Therefore, we can't\n\t\t\t\t// rely on the type being correct after the event finished\n\t\t\t\t// bubbling, so we set it back to the previous value. (#8740)\n\t\t\t\tif ( event ) {\n\t\t\t\t\tevent.type = eventType;\n\t\t\t\t}\n\t\t\t\tthis._open( event, target, response );\n\t\t\t} );\n\t\t} );\n\t\tif ( content ) {\n\t\t\tthis._open( event, target, content );\n\t\t}\n\t},\n\n\t_open: function( event, target, content ) {\n\t\tvar tooltipData, tooltip, delayedShow, a11yContent,\n\t\t\tpositionOption = $.extend( {}, this.options.position );\n\n\t\tif ( !content ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Content can be updated multiple times. If the tooltip already\n\t\t// exists, then just update the content and bail.\n\t\ttooltipData = this._find( target );\n\t\tif ( tooltipData ) {\n\t\t\ttooltipData.tooltip.find( \".ui-tooltip-content\" ).html( content );\n\t\t\treturn;\n\t\t}\n\n\t\t// If we have a title, clear it to prevent the native tooltip\n\t\t// we have to check first to avoid defining a title if none exists\n\t\t// (we don't want to cause an element to start matching [title])\n\t\t//\n\t\t// We use removeAttr only for key events, to allow IE to export the correct\n\t\t// accessible attributes. For mouse events, set to empty string to avoid\n\t\t// native tooltip showing up (happens only when removing inside mouseover).\n\t\tif ( target.is( \"[title]\" ) ) {\n\t\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\t\ttarget.attr( \"title\", \"\" );\n\t\t\t} else {\n\t\t\t\ttarget.removeAttr( \"title\" );\n\t\t\t}\n\t\t}\n\n\t\ttooltipData = this._tooltip( target );\n\t\ttooltip = tooltipData.tooltip;\n\t\tthis._addDescribedBy( target, tooltip.attr( \"id\" ) );\n\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\n\n\t\t// Support: Voiceover on OS X, JAWS on IE <= 9\n\t\t// JAWS announces deletions even when aria-relevant=\"additions\"\n\t\t// Voiceover will sometimes re-read the entire log region's contents from the beginning\n\t\tthis.liveRegion.children().hide();\n\t\ta11yContent = $( \"<div>\" ).html( tooltip.find( \".ui-tooltip-content\" ).html() );\n\t\ta11yContent.removeAttr( \"name\" ).find( \"[name]\" ).removeAttr( \"name\" );\n\t\ta11yContent.removeAttr( \"id\" ).find( \"[id]\" ).removeAttr( \"id\" );\n\t\ta11yContent.appendTo( this.liveRegion );\n\n\t\tfunction position( event ) {\n\t\t\tpositionOption.of = event;\n\t\t\tif ( tooltip.is( \":hidden\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttooltip.position( positionOption );\n\t\t}\n\t\tif ( this.options.track && event && /^mouse/.test( event.type ) ) {\n\t\t\tthis._on( this.document, {\n\t\t\t\tmousemove: position\n\t\t\t} );\n\n\t\t\t// trigger once to override element-relative positioning\n\t\t\tposition( event );\n\t\t} else {\n\t\t\ttooltip.position( $.extend( {\n\t\t\t\tof: target\n\t\t\t}, this.options.position ) );\n\t\t}\n\n\t\ttooltip.hide();\n\n\t\tthis._show( tooltip, this.options.show );\n\n\t\t// Handle tracking tooltips that are shown with a delay (#8644). As soon\n\t\t// as the tooltip is visible, position the tooltip using the most recent\n\t\t// event.\n\t\t// Adds the check to add the timers only when both delay and track options are set (#14682)\n\t\tif ( this.options.track && this.options.show && this.options.show.delay ) {\n\t\t\tdelayedShow = this.delayedShow = setInterval( function() {\n\t\t\t\tif ( tooltip.is( \":visible\" ) ) {\n\t\t\t\t\tposition( positionOption.of );\n\t\t\t\t\tclearInterval( delayedShow );\n\t\t\t\t}\n\t\t\t}, 13 );\n\t\t}\n\n\t\tthis._trigger( \"open\", event, { tooltip: tooltip } );\n\t},\n\n\t_registerCloseHandlers: function( event, target ) {\n\t\tvar events = {\n\t\t\tkeyup: function( event ) {\n\t\t\t\tif ( event.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tvar fakeEvent = $.Event( event );\n\t\t\t\t\tfakeEvent.currentTarget = target[ 0 ];\n\t\t\t\t\tthis.close( fakeEvent, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Only bind remove handler for delegated targets. Non-delegated\n\t\t// tooltips will handle this in destroy.\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tevents.remove = function() {\n\t\t\t\tthis._removeTooltip( this._find( target ).tooltip );\n\t\t\t};\n\t\t}\n\n\t\tif ( !event || event.type === \"mouseover\" ) {\n\t\t\tevents.mouseleave = \"close\";\n\t\t}\n\t\tif ( !event || event.type === \"focusin\" ) {\n\t\t\tevents.focusout = \"close\";\n\t\t}\n\t\tthis._on( true, target, events );\n\t},\n\n\tclose: function( event ) {\n\t\tvar tooltip,\n\t\t\tthat = this,\n\t\t\ttarget = $( event ? event.currentTarget : this.element ),\n\t\t\ttooltipData = this._find( target );\n\n\t\t// The tooltip may already be closed\n\t\tif ( !tooltipData ) {\n\n\t\t\t// We set ui-tooltip-open immediately upon open (in open()), but only set the\n\t\t\t// additional data once there's actually content to show (in _open()). So even if the\n\t\t\t// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in\n\t\t\t// the period between open() and _open().\n\t\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\t\treturn;\n\t\t}\n\n\t\ttooltip = tooltipData.tooltip;\n\n\t\t// Disabling closes the tooltip, so we need to track when we're closing\n\t\t// to avoid an infinite loop in case the tooltip becomes disabled on close\n\t\tif ( tooltipData.closing ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear the interval for delayed tracking tooltips\n\t\tclearInterval( this.delayedShow );\n\n\t\t// Only set title if we had one before (see comment in _open())\n\t\t// If the title attribute has changed since open(), don't restore\n\t\tif ( target.data( \"ui-tooltip-title\" ) && !target.attr( \"title\" ) ) {\n\t\t\ttarget.attr( \"title\", target.data( \"ui-tooltip-title\" ) );\n\t\t}\n\n\t\tthis._removeDescribedBy( target );\n\n\t\ttooltipData.hiding = true;\n\t\ttooltip.stop( true );\n\t\tthis._hide( tooltip, this.options.hide, function() {\n\t\t\tthat._removeTooltip( $( this ) );\n\t\t} );\n\n\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\tthis._off( target, \"mouseleave focusout keyup\" );\n\n\t\t// Remove 'remove' binding only on delegated targets\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tthis._off( target, \"remove\" );\n\t\t}\n\t\tthis._off( this.document, \"mousemove\" );\n\n\t\tif ( event && event.type === \"mouseleave\" ) {\n\t\t\t$.each( this.parents, function( id, parent ) {\n\t\t\t\t$( parent.element ).attr( \"title\", parent.title );\n\t\t\t\tdelete that.parents[ id ];\n\t\t\t} );\n\t\t}\n\n\t\ttooltipData.closing = true;\n\t\tthis._trigger( \"close\", event, { tooltip: tooltip } );\n\t\tif ( !tooltipData.hiding ) {\n\t\t\ttooltipData.closing = false;\n\t\t}\n\t},\n\n\t_tooltip: function( element ) {\n\t\tvar tooltip = $( \"<div>\" ).attr( \"role\", \"tooltip\" ),\n\t\t\tcontent = $( \"<div>\" ).appendTo( tooltip ),\n\t\t\tid = tooltip.uniqueId().attr( \"id\" );\n\n\t\tthis._addClass( content, \"ui-tooltip-content\" );\n\t\tthis._addClass( tooltip, \"ui-tooltip\", \"ui-widget ui-widget-content\" );\n\n\t\ttooltip.appendTo( this._appendTo( element ) );\n\n\t\treturn this.tooltips[ id ] = {\n\t\t\telement: element,\n\t\t\ttooltip: tooltip\n\t\t};\n\t},\n\n\t_find: function( target ) {\n\t\tvar id = target.data( \"ui-tooltip-id\" );\n\t\treturn id ? this.tooltips[ id ] : null;\n\t},\n\n\t_removeTooltip: function( tooltip ) {\n\n\t\t// Clear the interval for delayed tracking tooltips\n\t\tclearInterval( this.delayedShow );\n\n\t\ttooltip.remove();\n\t\tdelete this.tooltips[ tooltip.attr( \"id\" ) ];\n\t},\n\n\t_appendTo: function( target ) {\n\t\tvar element = target.closest( \".ui-front, dialog\" );\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_destroy: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\n\t\t\t// Delegate to close method to handle common cleanup\n\t\t\tvar event = $.Event( \"blur\" ),\n\t\t\t\telement = tooltipData.element;\n\t\t\tevent.target = event.currentTarget = element[ 0 ];\n\t\t\tthat.close( event, true );\n\n\t\t\t// Remove immediately; destroying an open tooltip doesn't use the\n\t\t\t// hide animation\n\t\t\t$( \"#\" + id ).remove();\n\n\t\t\t// Restore the title\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\n\t\t\t\t// If the title attribute has changed since open(), don't restore\n\t\t\t\tif ( !element.attr( \"title\" ) ) {\n\t\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t\t}\n\t\t\t\telement.removeData( \"ui-tooltip-title\" );\n\t\t\t}\n\t\t} );\n\t\tthis.liveRegion.remove();\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for tooltipClass option\n\t$.widget( \"ui.tooltip\", $.ui.tooltip, {\n\t\toptions: {\n\t\t\ttooltipClass: null\n\t\t},\n\t\t_tooltip: function() {\n\t\t\tvar tooltipData = this._superApply( arguments );\n\t\t\tif ( this.options.tooltipClass ) {\n\t\t\t\ttooltipData.tooltip.addClass( this.options.tooltipClass );\n\t\t\t}\n\t\t\treturn tooltipData;\n\t\t}\n\t} );\n}\n\nreturn $.ui.tooltip;\n\n} );\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/lodash.js",
    "content": "/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.21';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            }\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/main.js",
    "content": "/* jkOptions Framework | A Simple and Lightweight Typecho Option Framework - v1.0.0*/\n/*! This file is auto-generated */\n// const _wpUtilSettings = {\n//     ajax:{\n//         url: ''\n//     }\n// }\n/**\n * @output wp-includes/js/wp-util.js\n */\n\n/* global _wpUtilSettings */\n\n/** @namespace wp */\nwindow.wp = window.wp || {};\n\n(function ($) {\n    // Check for the utility settings.\n    var settings = typeof _wpUtilSettings === 'undefined' ? {} : _wpUtilSettings;\n\n    /**\n     * wp.template( id )\n     *\n     * Fetch a JavaScript template for an id, and return a templating function for it.\n     *\n     * @param {string} id A string that corresponds to a DOM element with an id prefixed with \"tmpl-\".\n     *                    For example, \"attachment\" maps to \"tmpl-attachment\".\n     * @return {function} A function that lazily-compiles the template requested.\n     */\n    wp.template = _.memoize(function ( id ) {\n        var compiled,\n            /*\n             * Underscore's default ERB-style templates are incompatible with PHP\n             * when asp_tags is enabled, so WordPress uses Mustache-inspired templating syntax.\n             *\n             * @see trac ticket #22344.\n             */\n            options = {\n                evaluate:    /<#([\\s\\S]+?)#>/g,\n                interpolate: /\\{\\{\\{([\\s\\S]+?)\\}\\}\\}/g,\n                escape:      /\\{\\{([^\\}]+?)\\}\\}(?!\\})/g,\n                variable:    'data'\n            };\n\n        return function ( data ) {\n            compiled = compiled || _.template( $( '#tmpl-' + id ).html(),  options );\n            return compiled( data );\n        };\n    });\n\n    /*\n     * wp.ajax\n     * ------\n     *\n     * Tools for sending ajax requests with JSON responses and built in error handling.\n     * Mirrors and wraps jQuery's ajax APIs.\n     */\n    wp.ajax = {\n        settings: settings.ajax || {},\n\n        /**\n         * wp.ajax.post( [action], [data] )\n         *\n         * Sends a POST request to WordPress.\n         *\n         * @param {(string|Object)} action The slug of the action to fire in WordPress or options passed\n         *                                 to jQuery.ajax.\n         * @param {Object=}         data   Optional. The data to populate $_POST with.\n         * @return {$.promise} A jQuery promise that represents the request,\n         *                     decorated with an abort() method.\n         */\n        post: function( action, data ) {\n            return wp.ajax.send({\n                data: _.isObject( action ) ? action : _.extend( data || {}, { action: action })\n            });\n        },\n\n        /**\n         * wp.ajax.send( [action], [options] )\n         *\n         * Sends a POST request to WordPress.\n         *\n         * @param {(string|Object)} action  The slug of the action to fire in WordPress or options passed\n         *                                  to jQuery.ajax.\n         * @param {Object=}         options Optional. The options passed to jQuery.ajax.\n         * @return {$.promise} A jQuery promise that represents the request,\n         *                     decorated with an abort() method.\n         */\n        send: function( action, options ) {\n            var promise, deferred;\n            if ( _.isObject( action ) ) {\n                options = action;\n            } else {\n                options = options || {};\n                options.data = _.extend( options.data || {}, { action: action });\n            }\n\n            options = _.defaults( options || {}, {\n                type:    'POST',\n                url:     wp.ajax.settings.url,\n                context: this\n            });\n\n            deferred = $.Deferred( function( deferred ) {\n                // Transfer success/error callbacks.\n                if ( options.success ) {\n                    deferred.done( options.success );\n                }\n\n                if ( options.error ) {\n                    deferred.fail( options.error );\n                }\n\n                delete options.success;\n                delete options.error;\n\n                // Use with PHP's wp_send_json_success() and wp_send_json_error().\n                deferred.jqXHR = $.ajax( options ).done( function( response ) {\n                    // Treat a response of 1 as successful for backward compatibility with existing handlers.\n                    if ( response === '1' || response === 1 ) {\n                        response = { success: true };\n                    }\n                    console.log(response)\n                    if ( _.isObject( response ) && ! _.isUndefined( response.success ) ) {\n\n                        // When handling a media attachments request, get the total attachments from response headers.\n                        var context = this;\n                        deferred.done( function() {\n                            if (\n                                action &&\n                                action.data &&\n                                'query-attachments' === action.data.action &&\n                                deferred.jqXHR.hasOwnProperty( 'getResponseHeader' ) &&\n                                deferred.jqXHR.getResponseHeader( 'X-WP-Total' )\n                            ) {\n                                context.totalAttachments = parseInt( deferred.jqXHR.getResponseHeader( 'X-WP-Total' ), 10 );\n                            } else {\n                                context.totalAttachments = 0;\n                            }\n                        } );\n                        deferred[ response.success ? 'resolveWith' : 'rejectWith' ]( this, [response.data] );\n                    } else {\n                        deferred.rejectWith( this, [response] );\n                    }\n                }).fail( function() {\n                    deferred.rejectWith( this, arguments );\n                });\n            });\n\n            promise = deferred.promise();\n            promise.abort = function() {\n                deferred.jqXHR.abort();\n                return this;\n            };\n\n            return promise;\n        }\n    };\n\n    /*\n     *  onecircle ajax\n     */\n    function oc_empty(value = '') {\n        if (value === '' || value === null || value === undefined || value == 0) {\n            return true\n        }\n        else {\n            return false\n        }\n    }\n    function setNotice_(msg) {\n        $(\"#authorization_form .ajax-notice\").html('<p style=\"color:#fd4c73;\">'+msg+'</p>')\n    }\n    $(\"#authorization_submit\").on('click',function (e) {\n        e.preventDefault();\n        let url = $(\"#authorization_form\").data('ajaxurl')\n        let action = $(\"input[name='action']\").val()\n        if (action === \"get_ocpro_authorization\"){\n            let key_code = $(\"input[name='key_code']\").val()\n            if (oc_empty(key_code)){\n                setNotice_('缺少参数')\n                return false\n            }\n            $.post(url,{\n                do:action,\n                key:key_code\n            },function (res) {\n                if (res.code !== 1){\n                    setNotice_(res.msg)\n                } else {\n                    window.location.reload()\n                }\n            })\n        } else if (action === \"get_ocpro_delete_authorization\"){\n            const ret = confirm('是否删除授权？');\n            if (ret){\n                $.post(url,{\n                    do:action,\n                },function (res) {\n                    if (res.code !== 1){\n                        setNotice_(res.msg)\n                    } else {\n                        window.location.reload()\n                    }\n                })\n            }\n\n        }\n    })\n}(jQuery));\n\n\n!function (I, _, b, y) {\n    \"use strict\";\n    var T = T || {};\n\n    T.funcs = {}, T.vars = {\n        onloaded: !1,\n        $body: I(\"body\"),\n        $window: I(_),\n        $document: I(b),\n        $form_warning: null,\n        is_confirm: !1,\n        form_modified: !1,\n        code_themes: [],\n        is_rtl: I(\"body\").hasClass(\"rtl\")\n    }, T.helper = {\n        uid: function (e) {\n            return (e || \"\") + Math.random().toString(36).substr(2, 9)\n        }, preg_quote: function (e) {\n            return (e + \"\").replace(/(\\[|\\])/g, \"\\\\$1\")\n        }, name_nested_replace: function (e, t) {\n            var n = new RegExp(T.helper.preg_quote(t + \"[\\\\d+]\"), \"g\");\n            e.find(\":radio\").each(function () {\n                (this.checked || this.orginal_checked) && (this.orginal_checked = !0)\n            }), e.each(function (e) {\n                I(this).find(\":input\").each(function () {\n                    this.name = this.name.replace(n, t + \"[\" + e + \"]\"), this.orginal_checked && (this.checked = !0)\n                })\n            })\n        }, debounce: function (i, a, s) {\n            var c;\n            return function () {\n                var e = this, t = arguments, n = s && !c;\n                clearTimeout(c), c = setTimeout(function () {\n                    c = null, s || i.apply(e, t)\n                }, a), n && i.apply(e, t)\n            }\n        }\n    }, I.fn.csf_clone = function () {\n        for (var e = I.fn.clone.apply(this, arguments), t = this.find(\"select\").add(this.filter(\"select\")), n = e.find(\"select\").add(e.filter(\"select\")), i = 0; i < t.length; ++i) for (var a = 0; a < t[i].options.length; ++a) !0 === t[i].options[a].selected && (n[i].options[a].selected = !0);\n        return this.find(\":radio\").each(function () {\n            this.orginal_checked = this.checked\n        }), e\n    }, I.fn.csf_expand_all = function () {\n        return this.each(function () {\n            I(this).on(\"click\", function (e) {\n                e.preventDefault(), I(\".csf-wrapper\").toggleClass(\"csf-show-all\"), I(\".csf-section\").csf_reload_script(), I(this).find(\".fa\").toggleClass(\"fa-indent\").toggleClass(\"fa-outdent\")\n            })\n        })\n    }, I.fn.csf_nav_options = function () {\n        return this.each(function () {\n            var a, e = I(this), t = I(_), s = I(\"#wpwrap\"), c = e.find(\"a\");\n\n            t.on(\"hashchange csf.hashchange\", function () {\n\n                var e = _.location.hash.replace(\"#tab=\", \"\"),\n                    t = decodeURI(e || c.first().attr(\"href\").replace(\"#tab=\", \"\")),\n                    n = I('[data-tab-id=\"' + t + '\"]');\n                if (n.length) {\n                    n.closest(\".csf-tab-item\").addClass(\"csf-tab-expanded\").siblings().removeClass(\"csf-tab-expanded\"), n.next().is(\"ul\") && (t = (n = n.next().find(\"li\").first().find(\"a\")).data(\"tab-id\")), c.removeClass(\"csf-active\"), n.addClass(\"csf-active\"), a && a.addClass(\"hidden\");\n                    var i = I('[data-section-id=\"' + t + '\"]');\n                    i.removeClass(\"hidden\"), i.csf_reload_script(), I(\".csf-section-id\").val(i.index() + 1), a = i, s.hasClass(\"wp-responsive-open\") && (I(\"html, body\").animate({scrollTop: i.offset().top - 50}, 200), s.removeClass(\"wp-responsive-open\"))\n                }\n            }).trigger(\"csf.hashchange\")\n        })\n    }, I.fn.csf_nav_metabox = function () {\n        return this.each(function () {\n            var a, e = I(this), s = e.find(\"a\"), c = e.parent().find(\".csf-section\");\n            s.each(function (i) {\n                I(this).on(\"click\", function (e) {\n                    e.preventDefault();\n                    var t = I(this);\n                    s.removeClass(\"csf-active\"), t.addClass(\"csf-active\"), a !== y && a.addClass(\"hidden\");\n                    var n = c.eq(i);\n                    n.removeClass(\"hidden\"), n.csf_reload_script(), a = n\n                })\n            }), s.first().trigger(\"click\")\n        })\n    }, I.fn.csf_page_templates = function () {\n        this.length && I(b).on(\"change\", \".editor-page-attributes__template select, #page_template\", function () {\n            var e = I(this).val() || \"default\";\n            I(\".csf-page-templates\").removeClass(\"csf-metabox-show\").addClass(\"csf-metabox-hide\"), I(\".csf-page-\" + e.toLowerCase().replace(/[^a-zA-Z0-9]+/g, \"-\")).removeClass(\"csf-metabox-hide\").addClass(\"csf-metabox-show\")\n        })\n    }, I.fn.csf_post_formats = function () {\n        this.length && I(b).on(\"change\", '.editor-post-format select, #formatdiv input[name=\"post_format\"]', function () {\n            var e = I(this).val() || \"default\";\n            e = \"0\" === e ? \"default\" : e, I(\".csf-post-formats\").removeClass(\"csf-metabox-show\").addClass(\"csf-metabox-hide\"), I(\".csf-post-format-\" + e).removeClass(\"csf-metabox-hide\").addClass(\"csf-metabox-show\")\n        })\n    }, I.fn.csf_search = function () {\n        return this.each(function () {\n            var $this  = I(this),\n                $input = $this.find('input');\n\n            $input.on('change keyup', function() {\n\n                var value    = $(this).val(),\n                    $wrapper = $('.csf-wrapper'),\n                    $section = $wrapper.find('.csf-section'),\n                    $fields  = $section.find('> .csf-field:not(.csf-depend-on)'),\n                    $titles  = $fields.find('> .csf-title, .csf-search-tags');\n\n                if ( value.length > 1 ) { // 3 to 1 兼容中文\n\n                    $fields.addClass('csf-metabox-hide');\n                    $wrapper.addClass('csf-search-all');\n\n                    $titles.each( function() {\n\n                        var $title = $(this);\n\n                        if ( $title.text().match( new RegExp('.*?' + value + '.*?', 'i') ) ) {\n\n                            var $field = $title.closest('.csf-field');\n\n                            $field.removeClass('csf-metabox-hide');\n                            $field.parent().csf_reload_script();\n                        }\n                    });\n                } else {\n                    $fields.removeClass('csf-metabox-hide');\n                    $wrapper.removeClass('csf-search-all');\n                }\n            });\n\n        })\n    }, I.fn.csf_sticky = function () {\n        return this.each(function () {\n            // var i = I(this), a = I(_), s = i.find(\".csf-header-inner\"),\n            //     c = parseInt(s.css(\"padding-left\")) + parseInt(s.css(\"padding-right\")), r = 0, o = !1, e = function () {\n            //         o || requestAnimationFrame(function () {\n            //             var e, t, n;\n            //             e = i.offset().top, t = Math.max(8, e - r), n = a.innerWidth(), t <= 8 && 782 < n ? (s.css({width: i.outerWidth() - c}), i.css({height: i.outerHeight()}).addClass(\"csf-sticky\")) : (s.removeAttr(\"style\"), i.removeAttr(\"style\").removeClass(\"csf-sticky\")), o = !1\n            //         }), o = !0\n            //     }, t = function () {\n            //         r = a.scrollTop(), e()\n            //     };\n            // a.on(\"scroll resize\", t), t()\n\n            var $this     = I(this),\n                $window   = I(window),\n                $inner    = $this.find('.csf-header-inner'),\n                padding   = parseInt( $inner.css('padding-left') ) + parseInt( $inner.css('padding-right') ),\n                offset    = 8,\n                scrollTop = 0,\n                lastTop   = 0,\n                ticking   = false,\n                stickyUpdate = function() {\n\n                    var offsetTop = $this.offset().top,\n                        stickyTop = Math.max(offset, offsetTop - scrollTop ),\n                        winWidth  = $window.innerWidth();\n\n                    if ( stickyTop <= offset && winWidth > 782 ) {\n                        $inner.css({width: $this.outerWidth()});\n                        $this.css({height: $this.outerHeight()}).addClass( 'csf-sticky' );\n                    } else {\n                        $inner.removeAttr('style');\n                        $this.removeAttr('style').removeClass( 'csf-sticky' );\n                    }\n\n                },\n                requestTick = function() {\n\n                    if ( !ticking ) {\n                        requestAnimationFrame( function() {\n                            stickyUpdate();\n                            ticking = false;\n                        });\n                    }\n\n                    ticking = true;\n\n                },\n                onSticky  = function() {\n\n                    scrollTop = $window.scrollTop();\n                    requestTick();\n\n                };\n\n            $window.on( 'scroll resize', onSticky);\n\n            onSticky();\n        })\n    },\n    $.fn.csf_dependency = function() {\n        return this.each( function() {\n\n            var $this   = $(this),\n                $fields = $this.children('[data-controller]');\n\n            if( $fields.length ) {\n\n                var normal_ruleset = $.csf_deps.createRuleset(),\n                    global_ruleset = $.csf_deps.createRuleset(),\n                    normal_depends = [],\n                    global_depends = [];\n\n                $fields.each( function() {\n\n                    var $field      = $(this),\n                        controllers = $field.data('controller').split('|'),\n                        conditions  = $field.data('condition').split('|'),\n                        values      = $field.data('value').toString().split('|'),\n                        is_global   = $field.data('depend-global') ? true : false,\n                        ruleset     = ( is_global ) ? global_ruleset : normal_ruleset;\n\n                    $.each(controllers, function( index, depend_id ) {\n\n                        var value     = values[index] || '',\n                            condition = conditions[index] || conditions[0];\n\n                        ruleset = ruleset.createRule('[data-depend-id=\"'+ depend_id +'\"]', condition, value);\n\n                        ruleset.include($field);\n\n                        if ( is_global ) {\n                            global_depends.push(depend_id);\n                        } else {\n                            normal_depends.push(depend_id);\n                        }\n\n                    });\n\n                });\n\n                if ( normal_depends.length ) {\n                    $.csf_deps.enable($this, normal_ruleset, normal_depends);\n                }\n\n                if ( global_depends.length ) {\n                    $.csf_deps.enable(T.vars.$body, global_ruleset, global_depends);\n                }\n\n            }\n\n        });\n    }, I.fn.csf_field_accordion = function () {\n        return this.each(function () {\n            I(this).find(\".csf-accordion-title\").on(\"click\", function () {\n                var e = I(this), t = e.find(\".csf-accordion-icon\"), n = e.next();\n                t.hasClass(\"fa-angle-right\") ? t.removeClass(\"fa-angle-right\").addClass(\"fa-angle-down\") : t.removeClass(\"fa-angle-down\").addClass(\"fa-angle-right\"), n.data(\"opened\") || (n.csf_reload_script(), n.data(\"opened\", !0)), n.toggleClass(\"csf-accordion-open\")\n            })\n        })\n    }, I.fn.csf_field_backup = function () {\n        return this.each(function () {\n\n            var base    = this,\n                $this   = $(this),\n                $body   = $('body'),\n                $import = $this.find('.csf-import'),\n                $reset  = $this.find('.csf-reset');\n\n\n            $reset.on('click', function( e ) {\n                e.preventDefault();\n                if ( confirm('确定吗') ) {\n                    window.wp.ajax.post('csf-reset', {\n                        unique: $reset.data('unique'),\n                        nonce: $reset.data('nonce')\n                    })\n                        .done( function( response ) {\n                            window.location.reload(true);\n                        })\n                        .fail( function( response ) {\n                            alert( response.error );\n                            // wp.customize.notifications.remove('csf_field_backup_notification');\n                        });\n\n                }\n\n            });\n            $import.on('click', function( e ) {\n\n                e.preventDefault();\n                if (confirm('确定吗') ) {\n                    // base.notificationOverlay();\n                    window.wp.ajax.post( 'csf-import', {\n                        unique: $import.data('unique'),\n                        nonce: $import.data('nonce'),\n                        data: $this.find('.csf-import-data').val()\n                    }).done( function( response ) {\n                        window.location.reload(true);\n                    }).fail( function( response ) {\n                        alert( response.error );\n                        // wp.customize.notifications.remove('csf_field_backup_notification');\n                    });\n\n\n                }\n\n            });\n        })\n    }, I.fn.csf_field_background = function () {\n        return this.each(function () {\n            I(this).find(\".csf--background-image\").csf_reload_script()\n        })\n    }, I.fn.csf_field_code_editor = function () {\n        return this.each(function () {\n            if (\"function\" == typeof CodeMirror) {\n                var t = I(this), i = t.find(\"textarea\"), e = t.find(\".CodeMirror\"), a = i.data(\"editor\");\n                e.length && e.remove();\n                var s = setInterval(function () {\n                    if (t.is(\":visible\")) {\n                        var n = CodeMirror.fromTextArea(i[0], a);\n                        if (\"default\" !== a.theme && -1 === T.vars.code_themes.indexOf(a.theme)) {\n                            var e = I(\"<link>\");\n                            I(\"#csf-codemirror-css\").after(e), e.attr({\n                                rel: \"stylesheet\",\n                                id: \"csf-codemirror-\" + a.theme + \"-css\",\n                                href: a.cdnURL + \"/theme/\" + a.theme + \".min.css\",\n                                type: \"text/css\",\n                                media: \"all\"\n                            }), T.vars.code_themes.push(a.theme)\n                        }\n                        CodeMirror.modeURL = a.cdnURL + \"/mode/%N/%N.min.js\", CodeMirror.autoLoadMode(n, a.mode), n.on(\"change\", function (e, t) {\n                            i.val(n.getValue()).trigger(\"change\")\n                        }), clearInterval(s)\n                    }\n                })\n            }\n        })\n    }, I.fn.csf_field_date = function () {\n        return this.each(function () {\n            var e = I(this), i = e.find(\"input\"), a = e.find(\".csf-date-settings\").data(\"settings\"), t = {\n                showAnim: \"\", beforeShow: function (e, t) {\n                    I(t.dpDiv).addClass(\"csf-datepicker-wrapper\")\n                }, onClose: function (e, t) {\n                    I(t.dpDiv).removeClass(\"csf-datepicker-wrapper\")\n                }\n            };\n            a = I.extend({}, a, t), 2 === i.length && (a = I.extend({}, a, {\n                onSelect: function (e) {\n                    I(this), i.first();\n                    var t = i.first().attr(\"id\") === I(this).attr(\"id\") ? \"minDate\" : \"maxDate\",\n                        n = I.datepicker.parseDate(a.dateFormat, e);\n                    i.not(this).datepicker(\"option\", t, n)\n                }\n            })), i.each(function () {\n                var e = I(this);\n                e.hasClass(\"hasDatepicker\") && e.removeAttr(\"id\").removeClass(\"hasDatepicker\"), e.datepicker(a)\n            })\n        })\n    }, I.fn.csf_field_datetime = function () {\n        return this.each(function () {\n            var e = I(this), i = e.find(\"input\"), t = e.find(\".csf-datetime-settings\").data(\"settings\");\n            t = I.extend({}, t, {\n                onReady: function (e, t, n) {\n                    I(n.calendarContainer).addClass(\"csf-flatpickr\")\n                }\n            }), 2 === i.length && (t = I.extend({}, t, {\n                onChange: function (e, t, n) {\n                    \"from\" === I(n.element).data(\"type\") ? i.last().get(0)._flatpickr.set(\"minDate\", e[0]) : i.first().get(0)._flatpickr.set(\"maxDate\", e[0])\n                }\n            })), i.each(function () {\n                I(this).flatpickr(t)\n            })\n        })\n    }, I.fn.csf_field_fieldset = function () {\n        return this.each(function () {\n            I(this).find(\".csf-fieldset-content\").csf_reload_script()\n        })\n    }, I.fn.csf_field_gallery = function () {\n        return this.each(function () {\n\n        })\n    }, I.fn.csf_field_group = function () {\n        return this.each(function () {\n            var e = I(this), t = e.children(\".csf-fieldset\"), n = t.length ? t : e,\n                r = n.children(\".csf-cloneable-wrapper\"), i = n.children(\".csf-cloneable-hidden\"),\n                o = n.children(\".csf-cloneable-max\"), f = n.children(\".csf-cloneable-min\"), c = r.data(\"title-by\"),\n                l = r.data(\"title-by-prefix\"), d = r.data(\"field-id\"), h = Boolean(Number(r.data(\"title-number\"))),\n                p = parseInt(r.data(\"max\")), a = parseInt(r.data(\"min\"));\n            r.hasClass(\"ui-accordion\") && r.find(\".ui-accordion-header-icon\").remove();\n            var u = function (e) {\n                e.find(\".csf-cloneable-title-number\").each(function (e) {\n                    I(this).html(I(this).closest(\".csf-cloneable-item\").index() + 1 + \".\")\n                })\n            };\n            r.accordion({\n                header: \"> .csf-cloneable-item > .csf-cloneable-title\",\n                collapsible: !0,\n                active: !1,\n                animate: !1,\n                heightStyle: \"content\",\n                icons: {\n                    header: \"csf-cloneable-header-icon fas fa-angle-right\",\n                    activeHeader: \"csf-cloneable-header-icon fas fa-angle-down\"\n                },\n                activate: function (e, t) {\n                    var n = t.newPanel, i = t.newHeader;\n                    if (n.length && !n.data(\"opened\")) {\n                        var a = i.find(\".csf-cloneable-value\"), s = [];\n                        I.each(c, function (e, t) {\n                            s.push(n.find('[data-depend-id=\"' + t + '\"]'))\n                        }), I.each(s, function (e, t) {\n                            t.on(\"change keyup csf.keyup\", function () {\n                                var i = [];\n                                I.each(s, function (e, t) {\n                                    var n = t.val();\n                                    n && i.push(n)\n                                }), i.length && a.text(i.join(l))\n                            }).trigger(\"csf.keyup\")\n                        }), n.csf_reload_script(), n.data(\"opened\", !0), n.data(\"retry\", !1)\n                    } else n.data(\"retry\") && (n.csf_reload_script_retry(), n.data(\"retry\", !1))\n                }\n            }), r.sortable({\n                axis: \"y\",\n                handle: \".csf-cloneable-title,.csf-cloneable-sort\",\n                helper: \"original\",\n                cursor: \"move\",\n                placeholder: \"widget-placeholder\",\n                start: function (e, t) {\n                    r.accordion({active: !1}), r.sortable(\"refreshPositions\"), t.item.children(\".csf-cloneable-content\").data(\"retry\", !0)\n                },\n                update: function (e, t) {\n                    T.helper.name_nested_replace(r.children(\".csf-cloneable-item\"), d), r.csf_customizer_refresh(), h && u(r)\n                }\n            }), n.children(\".csf-cloneable-add\").on(\"click\", function (e) {\n                e.preventDefault();\n                var t = r.children(\".csf-cloneable-item\").length;\n                if (f.hide(), p && p < t + 1) o.show(); else {\n                    var n = i.csf_clone(!0);\n                    n.removeClass(\"csf-cloneable-hidden\"), n.find(':input[name!=\"_pseudo\"]').each(function () {\n                        this.name = this.name.replace(\"___\", \"\").replace(d + \"[0]\", d + \"[\" + t + \"]\")\n                    }), r.append(n), r.accordion(\"refresh\"), r.accordion({active: t}), r.csf_customizer_refresh(), r.csf_customizer_listen({closest: !0}), h && u(r)\n                }\n            });\n            var s = function (e) {\n                e.preventDefault();\n                var t = r.children(\".csf-cloneable-item\").length;\n                if (f.hide(), p && p < t + 1) o.show(); else {\n                    var n = I(this).parent().parent(), i = n.children(\".csf-cloneable-helper\").csf_clone(!0),\n                        a = n.children(\".csf-cloneable-title\").csf_clone(),\n                        s = n.children(\".csf-cloneable-content\").csf_clone(),\n                        c = I('<div class=\"csf-cloneable-item\" />');\n                    c.append(i), c.append(a), c.append(s), r.children().eq(n.index()).after(c), T.helper.name_nested_replace(r.children(\".csf-cloneable-item\"), d), r.accordion(\"refresh\"), r.csf_customizer_refresh(), r.csf_customizer_listen({closest: !0}), h && u(r)\n                }\n            };\n            r.children(\".csf-cloneable-item\").children(\".csf-cloneable-helper\").on(\"click\", \".csf-cloneable-clone\", s), n.children(\".csf-cloneable-hidden\").children(\".csf-cloneable-helper\").on(\"click\", \".csf-cloneable-clone\", s);\n            var v = function (e) {\n                e.preventDefault();\n                var t = r.children(\".csf-cloneable-item\").length;\n                o.hide(), f.hide(), a && t - 1 < a ? f.show() : (I(this).closest(\".csf-cloneable-item\").remove(), T.helper.name_nested_replace(r.children(\".csf-cloneable-item\"), d), r.csf_customizer_refresh(), h && u(r))\n            };\n            r.children(\".csf-cloneable-item\").children(\".csf-cloneable-helper\").on(\"click\", \".csf-cloneable-remove\", v), n.children(\".csf-cloneable-hidden\").children(\".csf-cloneable-helper\").on(\"click\", \".csf-cloneable-remove\", v)\n        })\n    }, I.fn.csf_field_icon = function () {\n        return this.each(function () {\n            var n = I(this);\n            n.on(\"click\", \".csf-icon-add\", function (e) {\n                e.preventDefault();\n                var t = I(this), i = I(\"#csf-modal-icon\");\n                i.removeClass(\"hidden\"), T.vars.$icon_target = n, T.vars.icon_modal_loaded || (i.find(\".csf-modal-loading\").show(), _.wp.ajax.post(\"csf-get-icons\", {nonce: t.data(\"nonce\")}).done(function (e) {\n                    i.find(\".csf-modal-loading\").hide(), T.vars.icon_modal_loaded = !0;\n                    var n = i.find(\".csf-modal-load\").html(e.content);\n                    n.on(\"click\", \"i\", function (e) {\n                        e.preventDefault();\n                        var t = I(this).attr(\"title\");\n                        T.vars.$icon_target.find(\".csf-icon-preview i\").removeAttr(\"class\").addClass(t), T.vars.$icon_target.find(\".csf-icon-preview\").removeClass(\"hidden\"), T.vars.$icon_target.find(\".csf-icon-remove\").removeClass(\"hidden\"), T.vars.$icon_target.find(\"input\").val(t).trigger(\"change\"), i.addClass(\"hidden\")\n                    }), i.on(\"change keyup\", \".csf-icon-search\", function () {\n                        var t = I(this).val();\n                        n.find(\"i\").each(function () {\n                            var e = I(this);\n                            e.attr(\"title\").search(new RegExp(t, \"i\")) < 0 ? e.hide() : e.show()\n                        })\n                    }), i.on(\"click\", \".csf-modal-close, .csf-modal-overlay\", function () {\n                        i.addClass(\"hidden\")\n                    })\n                }).fail(function (e) {\n                    i.find(\".csf-modal-loading\").hide(), i.find(\".csf-modal-load\").html(e.error), i.on(\"click\", function () {\n                        i.addClass(\"hidden\")\n                    })\n                }))\n            }), n.on(\"click\", \".csf-icon-remove\", function (e) {\n                e.preventDefault(), n.find(\".csf-icon-preview\").addClass(\"hidden\"), n.find(\"input\").val(\"\").trigger(\"change\"), I(this).addClass(\"hidden\")\n            })\n        })\n    }, I.fn.csf_field_map = function () {\n        return this.each(function () {\n            if (\"undefined\" != typeof L) {\n                var e = I(this), t = e.find(\".csf--map-osm\"), n = e.find(\".csf--map-search input\"),\n                    i = e.find(\".csf--latitude\"), a = e.find(\".csf--longitude\"), s = e.find(\".csf--zoom\"),\n                    c = t.data(\"map\"), r = L.map(t.get(0), c);\n                L.tileLayer(\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'}).addTo(r);\n                var o = L.marker(c.center, {draggable: !0}).addTo(r), f = function (e) {\n                    i.val(e.lat), a.val(e.lng), s.val(r.getZoom())\n                };\n                r.on(\"click\", function (e) {\n                    o.setLatLng(e.latlng), f(e.latlng)\n                }), r.on(\"zoom\", function () {\n                    f(o.getLatLng())\n                }), o.on(\"drag\", function () {\n                    f(o.getLatLng())\n                }), n.length || (n = I('[data-depend-id=\"' + e.find(\".csf--address-field\").data(\"address-field\") + '\"]'));\n                var l = {};\n                n.autocomplete({\n                    source: function (e, n) {\n                        var i = e.term;\n                        i in l ? n(l[i]) : I.get(\"https://nominatim.openstreetmap.org/search\", {\n                            format: \"json\",\n                            q: i\n                        }, function (e) {\n                            var t;\n                            t = e.length ? e.map(function (e) {\n                                return {value: e.display_name, label: e.display_name, lat: e.lat, lon: e.lon}\n                            }, \"json\") : [{value: \"no-data\", label: \"No Results.\"}], l[i] = t, n(t)\n                        })\n                    }, select: function (e, t) {\n                        if (\"no-data\" === t.item.value) return !1;\n                        var n = L.latLng(t.item.lat, t.item.lon);\n                        r.panTo(n), o.setLatLng(n), f(n)\n                    }, create: function (e, t) {\n                        I(this).autocomplete(\"widget\").addClass(\"csf-map-ui-autocomplate\")\n                    }\n                });\n                var d = function () {\n                    var e = L.latLng(i.val(), a.val());\n                    r.panTo(e), o.setLatLng(e)\n                };\n                i.on(\"change\", d), a.on(\"change\", d)\n            }\n        })\n    }, I.fn.csf_field_link = function () {\n        return this.each(function () {\n            var a = I(this), e = a.find(\".csf--link\"), s = a.find(\".csf--add\"), c = a.find(\".csf--edit\"),\n                r = a.find(\".csf--remove\"), o = a.find(\".csf--result\"), t = T.helper.uid(\"csf-wplink-textarea-\");\n            s.on(\"click\", function (e) {\n                e.preventDefault(), _.wpLink.open(t)\n            }), c.on(\"click\", function (e) {\n                e.preventDefault(), s.trigger(\"click\"), I(\"#wp-link-url\").val(a.find(\".csf--url\").val()), I(\"#wp-link-text\").val(a.find(\".csf--text\").val()), I(\"#wp-link-target\").prop(\"checked\", \"_blank\" === a.find(\".csf--target\").val())\n            }), r.on(\"click\", function (e) {\n                e.preventDefault(), a.find(\".csf--url\").val(\"\").trigger(\"change\"), a.find(\".csf--text\").val(\"\"), a.find(\".csf--target\").val(\"\"), s.removeClass(\"hidden\"), c.addClass(\"hidden\"), r.addClass(\"hidden\"), o.parent().addClass(\"hidden\")\n            }), e.attr(\"id\", t).on(\"change\", function () {\n                var e = _.wpLink.getAttrs(), t = e.href, n = I(\"#wp-link-text\").val(), i = e.target ? e.target : \"\";\n                a.find(\".csf--url\").val(t).trigger(\"change\"), a.find(\".csf--text\").val(n), a.find(\".csf--target\").val(i), o.html('{url:\"' + t + '\", text:\"' + n + '\", target:\"' + i + '\"}'), s.addClass(\"hidden\"), c.removeClass(\"hidden\"), r.removeClass(\"hidden\"), o.parent().removeClass(\"hidden\")\n            })\n        })\n    }, I.fn.csf_field_media = function () {\n        return this.each(function () {\n            var $this            = $(this),\n                $upload_button   = $this.find('.csf--button'),\n                $remove_button   = $this.find('.csf--remove'),\n                $close_modal = $('.media-modal-close'),\n                $library         = $upload_button.data('library') && $upload_button.data('library').split(',') || '',\n                $auto_attributes = ( $this.hasClass('csf-assign-field-background') ) ? $this.closest('.csf-field-background').find('.csf--auto-attributes') : false,\n                wp_media_frame;\n\n            var uploader = $('#__wp-uploader'),\n                upload_router = $('#menu-item-upload'),\n                upload_tab = $('#menu-item-upload-tab'),\n                media_lib_router = $('#menu-item-browse'),\n                media_lib_tab = $('#menu-item-browse-tab');\n\n            upload_router.on('click', function (e){\n                media_lib_tab.hide()\n                media_lib_router.removeClass('active')\n                upload_tab.show()\n                if (!upload_router.hasClass('active')){\n                    upload_router.addClass('active')\n                }\n            })\n            media_lib_router.on('click', function (e){\n                upload_tab.hide();\n                upload_router.removeClass('active')\n                media_lib_tab.show();\n                if (!media_lib_router.hasClass('active')){\n                    media_lib_router.addClass('active')\n                }\n            })\n\n            $upload_button.on('click', function( e ) {\n                e.preventDefault()\n                uploader.toggle()\n                window.cur_media_click_instance = $(this);\n            });\n            $close_modal.on('click', function (e){\n                uploader.hide();\n            });\n            $remove_button.on('click', function( e ) {\n\n                e.preventDefault();\n\n                if ( $auto_attributes ) {\n                    $auto_attributes.addClass('csf--attributes-hidden');\n                }\n\n                $remove_button.addClass('hidden');\n                $this.find('input').val('');\n                $this.find('.csf--preview').addClass('hidden');\n                $this.find('.csf--url').trigger('change');\n\n            });\n\n        })\n    }, I.fn.csf_field_repeater = function () {\n        return this.each(function () {\n            var e = I(this), t = e.children(\".csf-fieldset\"), n = t.length ? t : e,\n                c = n.children(\".csf-repeater-wrapper\"), i = n.children(\".csf-repeater-hidden\"),\n                r = n.children(\".csf-repeater-max\"), o = n.children(\".csf-repeater-min\"), f = c.data(\"field-id\"),\n                l = parseInt(c.data(\"max\")), a = parseInt(c.data(\"min\"));\n            c.children(\".csf-repeater-item\").children(\".csf-repeater-content\").csf_reload_script(), c.sortable({\n                axis: \"y\",\n                handle: \".csf-repeater-sort\",\n                helper: \"original\",\n                cursor: \"move\",\n                placeholder: \"widget-placeholder\",\n                update: function (e, t) {\n                    T.helper.name_nested_replace(c.children(\".csf-repeater-item\"), f), c.csf_customizer_refresh(), t.item.csf_reload_script_retry()\n                }\n            }), n.children(\".csf-repeater-add\").on(\"click\", function (e) {\n                e.preventDefault();\n                var t = c.children(\".csf-repeater-item\").length;\n                if (o.hide(), l && l < t + 1) r.show(); else {\n                    var n = i.csf_clone(!0);\n                    n.removeClass(\"csf-repeater-hidden\"), n.find(':input[name!=\"_pseudo\"]').each(function () {\n                        this.name = this.name.replace(\"___\", \"\").replace(f + \"[0]\", f + \"[\" + t + \"]\")\n                    }), c.append(n), n.children(\".csf-repeater-content\").csf_reload_script(), c.csf_customizer_refresh(), c.csf_customizer_listen({closest: !0})\n                }\n            });\n            var s = function (e) {\n                e.preventDefault();\n                var t = c.children(\".csf-repeater-item\").length;\n                if (o.hide(), l && l < t + 1) r.show(); else {\n                    var n = I(this).parent().parent().parent(), i = n.children(\".csf-repeater-content\").csf_clone(),\n                        a = n.children(\".csf-repeater-helper\").csf_clone(!0),\n                        s = I('<div class=\"csf-repeater-item\" />');\n                    s.append(i), s.append(a), c.children().eq(n.index()).after(s), s.children(\".csf-repeater-content\").csf_reload_script(), T.helper.name_nested_replace(c.children(\".csf-repeater-item\"), f), c.csf_customizer_refresh(), c.csf_customizer_listen({closest: !0})\n                }\n            };\n            c.children(\".csf-repeater-item\").children(\".csf-repeater-helper\").on(\"click\", \".csf-repeater-clone\", s), n.children(\".csf-repeater-hidden\").children(\".csf-repeater-helper\").on(\"click\", \".csf-repeater-clone\", s);\n            var d = function (e) {\n                e.preventDefault();\n                var t = c.children(\".csf-repeater-item\").length;\n                r.hide(), o.hide(), a && t - 1 < a ? o.show() : (I(this).closest(\".csf-repeater-item\").remove(), T.helper.name_nested_replace(c.children(\".csf-repeater-item\"), f), c.csf_customizer_refresh())\n            };\n            c.children(\".csf-repeater-item\").children(\".csf-repeater-helper\").on(\"click\", \".csf-repeater-remove\", d), n.children(\".csf-repeater-hidden\").children(\".csf-repeater-helper\").on(\"click\", \".csf-repeater-remove\", d)\n        })\n    }, I.fn.csf_field_slider = function () {\n        return this.each(function () {\n            var e = I(this), n = e.find(\"input\"), t = e.find(\".csf-slider-ui\"), i = n.data(), a = n.val() || 0;\n            t.hasClass(\"ui-slider\") && t.empty(), t.slider({\n                range: \"min\",\n                value: a,\n                min: i.min || 0,\n                max: i.max || 100,\n                step: i.step || 1,\n                slide: function (e, t) {\n                    n.val(t.value).trigger(\"change\")\n                }\n            }), n.on(\"keyup\", function () {\n                t.slider(\"value\", n.val())\n            })\n        })\n    }, I.fn.csf_field_sortable = function () {\n        return this.each(function () {\n            var n = I(this).find(\".csf-sortable\");\n            n.sortable({\n                axis: \"y\",\n                helper: \"original\",\n                cursor: \"move\",\n                placeholder: \"widget-placeholder\",\n                update: function (e, t) {\n                    n.csf_customizer_refresh()\n                }\n            }), n.find(\".csf-sortable-content\").csf_reload_script()\n        })\n    }, I.fn.csf_field_sorter = function () {\n        return this.each(function () {\n            var i = I(this), e = i.find(\".csf-enabled\"), t = i.find(\".csf-disabled\"), n = !!t.length && t;\n            e.sortable({\n                connectWith: n, placeholder: \"ui-sortable-placeholder\", update: function (e, t) {\n                    var n = t.item.find(\"input\");\n                    t.item.parent().hasClass(\"csf-enabled\") ? n.attr(\"name\", n.attr(\"name\").replace(\"disabled\", \"enabled\")) : n.attr(\"name\", n.attr(\"name\").replace(\"enabled\", \"disabled\")), i.csf_customizer_refresh()\n                }\n            }), n && n.sortable({\n                connectWith: e, placeholder: \"ui-sortable-placeholder\", update: function (e, t) {\n                    i.csf_customizer_refresh()\n                }\n            })\n        })\n    }, I.fn.csf_field_spinner = function () {\n        return this.each(function () {\n            var e = I(this), n = e.find(\"input\"), t = e.find(\".ui-button\"), i = n.data();\n            t.length && t.remove(), n.spinner({\n                min: i.min || 0,\n                max: i.max || 100,\n                step: i.step || 1,\n                create: function (e, t) {\n                    i.unit && n.after('<span class=\"ui-button csf--unit\">' + i.unit + \"</span>\")\n                },\n                spin: function (e, t) {\n                    n.val(t.value).trigger(\"change\")\n                }\n            })\n        })\n    }, I.fn.csf_field_switcher = function () {\n        return this.each(function () {\n            var n = I(this).find(\".csf--switcher\");\n            n.on(\"click\", function () {\n                var e = 0, t = n.find(\"input\");\n                n.hasClass(\"csf--active\") ? n.removeClass(\"csf--active\") : (e = 1, n.addClass(\"csf--active\")), t.val(e).trigger(\"change\")\n            })\n        })\n    }, I.fn.csf_field_tabbed = function () {\n        return this.each(function () {\n            var e = I(this), t = e.find(\".csf-tabbed-nav a\"), a = e.find(\".csf-tabbed-content\");\n            a.eq(0).csf_reload_script(), t.on(\"click\", function (e) {\n                e.preventDefault();\n                var t = I(this), n = t.index(), i = a.eq(n);\n                t.addClass(\"csf-tabbed-active\").siblings().removeClass(\"csf-tabbed-active\"), i.csf_reload_script(), i.removeClass(\"hidden\").siblings().addClass(\"hidden\")\n            })\n        })\n    }, I.fn.csf_field_typography = function () {\n        return this.each(function () {\n            var j = this, L = I(this), i = [], A = csf_typography_json.webfonts, t = csf_typography_json.googlestyles,\n                q = csf_typography_json.defaultstyles;\n            j.sanitize_subset = function (e) {\n                return e = (e = e.replace(\"-ext\", \" Extended\")).charAt(0).toUpperCase() + e.slice(1)\n            }, j.sanitize_style = function (e) {\n                return t[e] ? t[e] : e\n            }, j.load_google_font = function (e, t, n) {\n                e && \"object\" == typeof WebFont && (t = t ? t.replace(\"normal\", \"\") : \"\", n = n ? n.replace(\"normal\", \"\") : \"\", (t || n) && (e = e + \":\" + t + n), -1 === i.indexOf(e) && WebFont.load({google: {families: [e]}}), i.push(e))\n            }, j.append_select_options = function (e, t, a, s, c) {\n                e.find(\"option\").not(\":first\").remove();\n                var r = \"\";\n                I.each(t, function (e, t) {\n                    var n, i = t;\n                    n = c ? a && -1 !== a.indexOf(t) ? \" selected\" : \"\" : a && a === t ? \" selected\" : \"\", \"subset\" === s ? i = j.sanitize_subset(t) : \"style\" === s && (i = j.sanitize_style(t)), r += '<option value=\"' + t + '\"' + n + \">\" + i + \"</option>\"\n                }), e.append(r).trigger(\"csf.change\").trigger(\"chosen:updated\")\n            }, j.init = function () {\n                var l = [], e = L.find(\".csf--typography\"), d = L.find(\".csf--type\"),\n                    h = L.find(\".csf--block-font-style\"), v = e.data(\"unit\"), g = e.data(\"line-height-unit\"),\n                    t = e.data(\"exclude\") ? e.data(\"exclude\").split(\",\") : [];\n                L.find(\".csf--chosen\").length && L.find(\"select\").each(function () {\n                    var e = I(this), t = e.parent().find(\".chosen-container\");\n                    t.length && t.remove(), e.chosen({\n                        allow_single_deselect: !0,\n                        disable_search_threshold: 15,\n                        width: \"100%\"\n                    })\n                });\n                var m = L.find(\".csf--font-family\"), i = m.val();\n                m.find(\"option\").not(\":first-child\").remove();\n                var a = \"\";\n                I.each(A, function (n, e) {\n                    t && -1 !== t.indexOf(n) || (a += '<optgroup label=\"' + e.label + '\">', I.each(e.fonts, function (e, t) {\n                        a += '<option value=\"' + (t = \"object\" == typeof t ? e : t) + '\" data-type=\"' + n + '\"' + (t === i ? \" selected\" : \"\") + \">\" + t + \"</option>\"\n                    }), a += \"</optgroup>\")\n                }), m.append(a).trigger(\"chosen:updated\");\n                var p = L.find(\".csf--block-font-style\");\n                if (p.length) {\n                    var u = L.find(\".csf--font-style-select\"), _ = u.val() ? u.val().replace(/normal/g, \"\") : \"\";\n                    u.on(\"change csf.change\", function (e) {\n                        var t = u.val();\n                        !t && l && -1 === l.indexOf(\"normal\") && (t = l[0]);\n                        var n = t && \"italic\" !== t && \"normal\" === t ? \"normal\" : \"\",\n                            i = t && \"italic\" !== t && \"normal\" !== t ? t.replace(\"italic\", \"\") : n,\n                            a = t && \"italic\" === t.substr(-6) ? \"italic\" : \"\";\n                        L.find(\".csf--font-weight\").val(i), L.find(\".csf--font-style\").val(a)\n                    });\n                    var b = L.find(\".csf--block-extra-styles\");\n                    if (b.length) var y = L.find(\".csf--extra-styles\"), w = y.val()\n                }\n                var C = L.find(\".csf--block-subset\");\n                if (C.length) var k = L.find(\".csf--subset\"), x = k.val(), z = k.data(\"multiple\") || !1;\n                var D = L.find(\".csf--block-backup-font-family\");\n                m.on(\"change csf.change\", function (e) {\n                    C.length && C.addClass(\"hidden\"), b.length && b.addClass(\"hidden\"), D.length && D.addClass(\"hidden\");\n                    var t = m.find(\":selected\"), n = t.val(), i = t.data(\"type\");\n                    if (i && n) {\n                        if (\"google\" !== i && \"custom\" !== i || !D.length || D.removeClass(\"hidden\"), p.length) {\n                            var a = q;\n                            \"google\" === i && A[i].fonts[n][0] ? a = A[i].fonts[n][0] : \"custom\" === i && A[i].fonts[n] && (a = A[i].fonts[n]);\n                            var s = -1 !== (l = a).indexOf(\"normal\") ? \"normal\" : a[0],\n                                c = _ && -1 !== a.indexOf(_) ? _ : s;\n                            j.append_select_options(u, a, c, \"style\"), _ = !1, p.removeClass(\"hidden\"), \"google\" === i && b.length && 1 < a.length && (j.append_select_options(y, a, w, \"style\", !0), w = !1, b.removeClass(\"hidden\"))\n                        }\n                        if (\"google\" === i && C.length && A[i].fonts[n][1]) {\n                            var r = A[i].fonts[n][1], o = r.length < 2 && \"latin\" !== r[0] ? r[0] : \"\",\n                                f = x && -1 !== r.indexOf(x) ? x : o;\n                            f = z && x ? x : f, j.append_select_options(k, r, f, \"subset\", z), x = !1, C.removeClass(\"hidden\")\n                        }\n                    } else h.find(\":input\").val(\"\"), C.length && (k.find(\"option\").not(\":first-child\").remove(), k.trigger(\"chosen:updated\")), p.length && (u.find(\"option\").not(\":first-child\").remove(), u.trigger(\"chosen:updated\"));\n                    d.val(i)\n                }).trigger(\"csf.change\");\n                var O = L.find(\".csf--block-preview\");\n                if (O.length) {\n                    var S = L.find(\".csf--preview\");\n                    L.on(\"change\", T.helper.debounce(function (e) {\n                        O.removeClass(\"hidden\");\n                        var t = m.val(), n = L.find(\".csf--font-weight\").val(), i = L.find(\".csf--font-style\").val(),\n                            a = L.find(\".csf--font-size\").val(), s = L.find(\".csf--font-variant\").val(),\n                            c = L.find(\".csf--line-height\").val(), r = L.find(\".csf--text-align\").val(),\n                            o = L.find(\".csf--text-transform\").val(), f = L.find(\".csf--text-decoration\").val(),\n                            l = L.find(\".csf--color\").val(), d = L.find(\".csf--word-spacing\").val(),\n                            h = L.find(\".csf--letter-spacing\").val(), p = L.find(\".csf--custom-style\").val();\n                        \"google\" === L.find(\".csf--type\").val() && j.load_google_font(t, n, i);\n                        var u = {};\n                        t && (u.fontFamily = t), n && (u.fontWeight = n), i && (u.fontStyle = i), s && (u.fontVariant = s), a && (u.fontSize = a + v), c && (u.lineHeight = c + g), h && (u.letterSpacing = h + v), d && (u.wordSpacing = d + v), r && (u.textAlign = r), o && (u.textTransform = o), f && (u.textDecoration = f), l && (u.color = l), S.removeAttr(\"style\"), p && S.attr(\"style\", p), S.css(u)\n                    }, 100)), O.on(\"click\", function () {\n                        S.toggleClass(\"csf--black-background\");\n                        var e = O.find(\".csf--toggle\");\n                        e.hasClass(\"fa-toggle-off\") ? e.removeClass(\"fa-toggle-off\").addClass(\"fa-toggle-on\") : e.removeClass(\"fa-toggle-on\").addClass(\"fa-toggle-off\")\n                    }), O.hasClass(\"hidden\") || L.trigger(\"change\")\n                }\n            }, j.init()\n        })\n    },  I.fn.csf_field_wp_editor = function () {\n        return this.each(function () {\n            if (void 0 !== _.wp.editor && void 0 !== _.tinyMCEPreInit && void 0 !== _.tinyMCEPreInit.mceInit.csf_wp_editor) {\n                var e = I(this), t = e.find(\".csf-wp-editor\"), n = e.find(\"textarea\");\n                (e.find(\".wp-editor-wrap\").length || e.find(\".mce-container\").length) && (t.empty(), t.append(n), n.css(\"display\", \"\"));\n                var i = T.helper.uid(\"csf-editor-\");\n                n.attr(\"id\", i);\n                var a = {\n                    tinymce: _.tinyMCEPreInit.mceInit.csf_wp_editor,\n                    quicktags: _.tinyMCEPreInit.qtInit.csf_wp_editor\n                }, s = t.data(\"editor-settings\"), c = wp.oldEditor ? wp.oldEditor : wp.editor;\n                c && c.hasOwnProperty(\"autop\") && (wp.editor.autop = c.autop, wp.editor.removep = c.removep, wp.editor.initialize = c.initialize);\n                a.tinymce = I.extend({}, a.tinymce, {\n                    selector: \"#\" + i, setup: function (t) {\n                        t.on(\"change keyup\", function () {\n                            var e = s.wpautop ? t.getContent() : wp.editor.removep(t.getContent());\n                            n.val(e).trigger(\"change\")\n                        })\n                    }\n                }), !1 === s.tinymce && (a.tinymce = !1, t.addClass(\"csf-no-tinymce\")), !1 === s.quicktags && (a.quicktags = !1, t.addClass(\"csf-no-quicktags\"));\n                var r = setInterval(function () {\n                    e.is(\":visible\") && (_.wp.editor.initialize(i, a), clearInterval(r))\n                });\n                if (s.media_buttons && _.csf_media_buttons) {\n                    var o = t.find(\".wp-media-buttons\");\n                    if (o.length) o.find(\".csf-shortcode-button\").data(\"editor-id\", i); else {\n                        var f = I(_.csf_media_buttons);\n                        f.find(\".csf-shortcode-button\").data(\"editor-id\", i), t.prepend(f)\n                    }\n                }\n            }\n        })\n    }, I.fn.csf_confirm = function () {\n        return this.each(function () {\n            I(this).on(\"click\", function (e) {\n                var t = I(this).data(\"confirm\") || _.csf_vars.i18n.confirm;\n                if (!confirm(t)) return e.preventDefault(), !1;\n                T.vars.is_confirm = !0, T.vars.form_modified = !1\n            })\n        })\n    }, I.fn.serializeObject = function () {\n        var a = {};\n        return I.each(this.serializeArray(), function (e, t) {\n            var n = t.name, i = t.value;\n            a[n] = a[n] === y ? i : I.isArray(a[n]) ? a[n].concat(i) : [a[n], i]\n        }), a\n    }, I.fn.csf_save = function () {\n        return this.each(function () {\n            var i, a = I(this), c = I(\".csf-save\"), r = I(\".csf-options\"), o = !1;\n            a.on(\"click\", function (e) {\n                if (!o) {\n                    var t = a.data(\"save\"), n = a.val();\n                    c.attr(\"value\", t), a.hasClass(\"csf-save-ajax\") ? (e.preventDefault(), r.addClass(\"csf-saving\"), c.prop(\"disabled\", !0), _.wp.ajax.post(\"csf_\" + r.data(\"unique\") + \"_ajax_save\", {data: I(\"#csf-form\").serializeJSONCSF()}).done(function (e) {\n                        if (I(\".csf-error\").remove(), Object.keys(e.errors).length) {\n                            var s = '<i class=\"csf-label-error csf-error\">!</i>';\n                            I.each(e.errors, function (e, t) {\n                                var n = I('[data-depend-id=\"' + e + '\"]'),\n                                    i = I('a[href=\"#tab=' + n.closest(\".csf-section\").data(\"section-id\") + '\"]'),\n                                    a = i.closest(\".csf-tab-item\");\n                                n.closest(\".csf-fieldset\").append('<p class=\"csf-error csf-error-text\">' + t + \"</p>\"), i.find(\".csf-error\").length || i.append(s), a.find(\".csf-arrow .csf-error\").length || a.find(\".csf-arrow\").append(s)\n                            })\n                        }\n                        r.removeClass(\"csf-saving\"), c.prop(\"disabled\", !1).attr(\"value\", n), o = !1, T.vars.form_modified = !1, T.vars.$form_warning.hide(), clearTimeout(i);\n                        var t = I(\".csf-form-success\");\n                        t.empty().append(e.notice).fadeIn(\"fast\", function () {\n                            i = setTimeout(function () {\n                                t.fadeOut(\"fast\")\n                            }, 1e3)\n                        })\n                    }).fail(function (e) {\n                        alert(e.notice)\n                    })) : T.vars.form_modified = !1\n                }\n                o = !0\n            })\n        })\n    }, I.fn.OCF_Options = function () {\n        return this.each(function () {\n            var e = I(this), t = e.find(\".csf-content\"), n = e.find(\".csf-form-success\"),\n                i = e.find(\".csf-form-warning\"), a = e.find(\".csf-header .csf-save\");\n            (T.vars.$form_warning = i).length && (_.onbeforeunload = function () {\n                return !!T.vars.form_modified || y\n            }, t.on(\"change keypress\", \":input\", function () {\n                T.vars.form_modified || (n.hide(), i.fadeIn(\"fast\"), T.vars.form_modified = !0)\n            })), n.hasClass(\"csf-form-show\") && setTimeout(function () {\n                n.fadeOut(\"fast\")\n            }, 1e3), I(b).keydown(function (e) {\n                if ((e.ctrlKey || e.metaKey) && 83 === e.which) return a.trigger(\"click\"), e.preventDefault(), !1\n            })\n        })\n    }, I.fn.csf_taxonomy = function () {\n        return this.each(function () {\n            var e = I(this), t = e.parents(\"form\");\n            if (\"addtag\" === t.attr(\"id\")) {\n                var n = t.find(\"#submit\"), i = e.find(\".csf-field\").csf_clone();\n                n.on(\"click\", function () {\n                    t.find(\".form-required\").hasClass(\"form-invalid\") || (e.data(\"inited\", !1), e.empty(), e.html(i), i = i.csf_clone(), e.csf_reload_script())\n                })\n            }\n        })\n    }, I.fn.csf_shortcode = function () {\n        var m = this;\n        return m.shortcode_parse = function (e, n) {\n            var i = \"\";\n            return I.each(e, function (e, t) {\n                i += \"[\" + (n = n || e), I.each(t, function (e, t) {\n                    \"content\" === e ? (i += \"]\", i += t, i += \"[/\" + n) : i += m.shortcode_tags(e, t)\n                }), i += \"]\"\n            }), i\n        }, m.shortcode_tags = function (e, t) {\n            var n = \"\";\n            return \"\" !== t && (\"object\" != typeof t || I.isArray(t) ? n += \" \" + e + '=\"' + t.toString() + '\"' : I.each(t, function (e, t) {\n                switch (e) {\n                    case\"background-image\":\n                        t = t.url ? t.url : \"\"\n                }\n                \"\" !== t && (n += \" \" + e + '=\"' + t.toString() + '\"')\n            })), n\n        }, m.insertAtChars = function (e, t) {\n            var n = void 0 !== e[0].name ? e[0] : e;\n            return n.value.length && void 0 !== n.selectionStart ? (n.focus(), n.value.substring(0, n.selectionStart) + t + n.value.substring(n.selectionEnd, n.value.length)) : (n.focus(), t)\n        }, m.send_to_editor = function (e, t) {\n            var n;\n            if (\"undefined\" != typeof tinymce && (n = tinymce.get(t)), n && !n.isHidden()) n.execCommand(\"mceInsertContent\", !1, e); else {\n                var i = I(\"#\" + t);\n                i.val(m.insertAtChars(i, e)).trigger(\"change\")\n            }\n        }, this.each(function () {\n            var c, r, o, n, f, l, d, a, h, p = I(this), i = p.find(\".csf-modal-load\"),\n                u = (p.find(\".csf-modal-content\"), p.find(\".csf-modal-insert\")), s = p.find(\".csf-modal-loading\"),\n                t = p.find(\"select\"), v = p.data(\"modal-id\"), g = p.data(\"nonce\");\n            I(b).on(\"click\", '.csf-shortcode-button[data-modal-id=\"' + v + '\"]', function (e) {\n                e.preventDefault(), h = I(this), c = h.data(\"editor-id\") || !1, r = h.data(\"target-id\") || !1, o = h.data(\"gutenberg-id\") || !1, p.removeClass(\"hidden\"), p.hasClass(\"csf-shortcode-single\") && f === y && t.trigger(\"change\")\n            }), t.on(\"change\", function () {\n                var e = I(this), t = e.find(\":selected\");\n                n = e.val(), f = t.data(\"shortcode\"), l = t.data(\"view\") || \"normal\", d = t.data(\"group\") || f, i.empty(), n ? (s.show(), _.wp.ajax.post(\"csf-get-shortcode-\" + v, {\n                    shortcode_key: n,\n                    nonce: g\n                }).done(function (e) {\n                    s.hide();\n                    var t = I(e.content).appendTo(i);\n                    u.parent().removeClass(\"hidden\"), a = t.find(\".csf--repeat-shortcode\").csf_clone(), t.csf_reload_script(), t.find(\".csf-fields\").csf_reload_script()\n                })) : u.parent().addClass(\"hidden\")\n            }), u.on(\"click\", function (e) {\n                if (e.preventDefault(), !u.prop(\"disabled\") && !u.attr(\"disabled\")) {\n                    var i = \"\",\n                        t = p.find(\".csf-field:not(.csf-depend-on)\").find(\":input:not(.ignore)\").serializeObjectCSF();\n                    switch (l) {\n                        case\"contents\":\n                            var n = f ? t[f] : t;\n                            I.each(n, function (e, t) {\n                                var n = f || e;\n                                i += \"[\" + n + \"]\" + t + \"[/\" + n + \"]\"\n                            });\n                            break;\n                        case\"group\":\n                            i += \"[\" + f, I.each(t[f], function (e, t) {\n                                i += m.shortcode_tags(e, t)\n                            }), i += \"]\", i += m.shortcode_parse(t[d], d), i += \"[/\" + f + \"]\";\n                            break;\n                        case\"repeater\":\n                            i += m.shortcode_parse(t[d], d);\n                            break;\n                        default:\n                            i += m.shortcode_parse(t)\n                    }\n                    if (i = \"\" === i ? \"[\" + f + \"]\" : i, o) {\n                        var a = _.csf_gutenberg_props.attributes.hasOwnProperty(\"shortcode\") ? _.csf_gutenberg_props.attributes.shortcode : \"\";\n                        _.csf_gutenberg_props.setAttributes({shortcode: a + i})\n                    } else if (c) m.send_to_editor(i, c); else {\n                        var s = r ? I(r) : h.parent().find(\"textarea\");\n                        s.val(m.insertAtChars(s, i)).trigger(\"change\")\n                    }\n                    p.addClass(\"hidden\")\n                }\n            }), p.on(\"click\", \".csf--repeat-button\", function (e) {\n                e.preventDefault();\n                var t = p.find(\".csf--repeatable\"), n = a.csf_clone(), i = n.find(\".csf-repeat-remove\");\n                n.appendTo(t);\n                n.find(\".csf-fields\").csf_reload_script(), T.helper.name_nested_replace(p.find(\".csf--repeat-shortcode\"), d), i.on(\"click\", function () {\n                    n.remove(), T.helper.name_nested_replace(p.find(\".csf--repeat-shortcode\"), d)\n                })\n            }), p.on(\"click\", \".csf-modal-close, .csf-modal-overlay\", function () {\n                p.addClass(\"hidden\")\n            })\n        })\n    }, \"function\" == typeof Color && (Color.prototype.toString = function () {\n        if (this._alpha < 1) return this.toCSS(\"rgba\", this._alpha).replace(/\\s+/g, \"\");\n        var e = parseInt(this._color, 10).toString(16);\n        if (this.error) return \"\";\n        if (e.length < 6) for (var t = 6 - e.length - 1; 0 <= t; t--) e = \"0\" + e;\n        return \"#\" + e\n    }), T.funcs.parse_color = function (e) {\n        var t = e.replace(/\\s+/g, \"\"),\n            n = -1 !== t.indexOf(\"rgba\") ? parseFloat(100 * t.replace(/^.*,(.+)\\)/, \"$1\")) : 100;\n        return {value: t, transparent: n, rgba: n < 100}\n    }, I.fn.csf_color = function () {\n        return this.each(function () {\n            var c, r = I(this), o = T.funcs.parse_color(r.val()),\n                e = !_.csf_vars.color_palette.length || _.csf_vars.color_palette;\n\n            r.hasClass(\"wp-color-picker\") && r.closest(\".wp-picker-container\").after(r).remove(), r.wpColorPicker({\n                palettes: e, change: function (e, t) {\n                    var n = t.color.toString();\n                    c.removeClass(\"csf--transparent-active\"), c.find(\".csf--transparent-offset\").css(\"background-color\", n), r.val(n).trigger(\"change\")\n                }, create: function () {\n                    c = r.closest(\".wp-picker-container\");\n                    var i = r.data(\"a8cIris\"),\n                        e = I('<div class=\"csf--transparent-wrap\"><div class=\"csf--transparent-slider\"></div><div class=\"csf--transparent-offset\"></div><div class=\"csf--transparent-text\"></div><div class=\"csf--transparent-button\">transparent <i class=\"fas fa-toggle-off\"></i></div></div>').appendTo(c.find(\".wp-picker-holder\")),\n                        a = e.find(\".csf--transparent-slider\"), s = e.find(\".csf--transparent-text\"),\n                        n = e.find(\".csf--transparent-offset\"), t = e.find(\".csf--transparent-button\");\n                    \"transparent\" === r.val() && c.addClass(\"csf--transparent-active\"), t.on(\"click\", function () {\n                        \"transparent\" !== r.val() ? (r.val(\"transparent\").trigger(\"change\").removeClass(\"iris-error\"), c.addClass(\"csf--transparent-active\")) : (r.val(i._color.toString()).trigger(\"change\"), c.removeClass(\"csf--transparent-active\"))\n                    }), a.slider({\n                        value: o.transparent, step: 1, min: 0, max: 100, slide: function (e, t) {\n                            var n = parseFloat(t.value / 100);\n                            i._color._alpha = n, r.wpColorPicker(\"color\", i._color.toString()), s.text(1 === n || 0 === n ? \"\" : n)\n                        }, create: function () {\n                            var e = parseFloat(o.transparent / 100), t = e < 1 ? e : \"\";\n                            s.text(t), n.css(\"background-color\", o.value), c.on(\"click\", \".wp-picker-clear\", function () {\n                                i._color._alpha = 1, s.text(\"\"), a.slider(\"option\", \"value\", 100), c.removeClass(\"csf--transparent-active\"), r.trigger(\"change\")\n                            }), c.on(\"click\", \".wp-picker-default\", function () {\n                                var e = T.funcs.parse_color(r.data(\"default-color\")),\n                                    t = parseFloat(e.transparent / 100), n = t < 1 ? t : \"\";\n                                i._color._alpha = t, s.text(n), a.slider(\"option\", \"value\", e.transparent), \"transparent\" === e.value && (r.removeClass(\"iris-error\"), c.addClass(\"csf--transparent-active\"))\n                            })\n                        }\n                    })\n                }\n            })\n        })\n    }, I.fn.csf_chosen = function () {\n        return this.each(function () {\n            var s = I(this), e = s.parent().find(\".chosen-container\"), t = s.hasClass(\"csf-chosen-sortable\") || !1,\n                n = s.hasClass(\"csf-chosen-ajax\") || !1, i = s.attr(\"multiple\") || !1, a = i ? \"100%\" : \"auto\",\n                c = I.extend({\n                    allow_single_deselect: !0,\n                    disable_search_threshold: 10,\n                    width: a,\n                    no_results_text: _.csf_vars.i18n.no_results_text\n                }, s.data(\"chosen-settings\"));\n            if (e.length && e.remove(), n) {\n                var r = I.extend({\n                    data: {type: \"post\", nonce: \"\"},\n                    allow_single_deselect: !0,\n                    disable_search_threshold: -1,\n                    width: \"100%\",\n                    min_length: 2,\n                    type_delay: 500,\n                    typing_text: _.csf_vars.i18n.typing_text,\n                    searching_text: _.csf_vars.i18n.searching_text,\n                    no_results_text: _.csf_vars.i18n.no_results_text\n                }, s.data(\"chosen-settings\"));\n                s.CSFAjaxChosen(r)\n            } else s.chosen(c);\n            if (i) {\n                var o = s.parent().find(\".csf-hide-select\"), f = o.val() || [];\n                s.on(\"change\", function (e, t) {\n                    t && t.selected ? o.append('<option value=\"' + t.selected + '\" selected=\"selected\">' + t.selected + \"</option>\") : t && t.deselected && o.find('option[value=\"' + t.deselected + '\"]').remove(), _.wp.customize !== y && 0 === o.children().length && o.data(\"customize-setting-link\") && _.wp.customize.control(o.data(\"customize-setting-link\")).setting.set(\"\"), o.trigger(\"change\")\n                }), s.CSFChosenOrder(f, !0)\n            }\n            if (t) {\n                var l = s.parent().find(\".chosen-container\").find(\".chosen-choices\");\n                l.bind(\"mousedown\", function (e) {\n                    I(e.target).is(\"span\") && e.stopPropagation()\n                }), l.sortable({\n                    items: \"li:not(.search-field)\",\n                    helper: \"orginal\",\n                    cursor: \"move\",\n                    placeholder: \"search-choice-placeholder\",\n                    start: function (e, t) {\n                        t.placeholder.width(t.item.innerWidth()), t.placeholder.height(t.item.innerHeight())\n                    },\n                    update: function (e, t) {\n                        var i = \"\", a = s.data(\"chosen\"), n = s.parent().find(\".csf-hide-select\");\n                        l.find(\".search-choice-close\").each(function () {\n                            var n = I(this).data(\"option-array-index\");\n                            I.each(a.results_data, function (e, t) {\n                                t.array_index === n && (i += '<option value=\"' + t.value + '\" selected>' + t.value + \"</option>\")\n                            })\n                        }), n.children().remove(), n.append(i), n.trigger(\"change\")\n                    }\n                })\n            }\n        })\n    }, I.fn.csf_checkbox = function () {\n        return this.each(function () {\n            var e = I(this), t = e.find(\".csf--input\"), n = e.find(\".csf--checkbox\");\n            n.on(\"click\", function () {\n                t.val(Number(n.prop(\"checked\"))).trigger(\"change\")\n            })\n        })\n    }, I.fn.csf_siblings = function () {\n        return this.each(function () {\n            var t = I(this), e = t.find(\".csf--sibling\"), n = t.data(\"multiple\") || !1;\n            e.on(\"click\", function () {\n                var e = I(this);\n                n ? e.hasClass(\"csf--active\") ? (e.removeClass(\"csf--active\"), e.find(\"input\").prop(\"checked\", !1).trigger(\"change\")) : (e.addClass(\"csf--active\"), e.find(\"input\").prop(\"checked\", !0).trigger(\"change\")) : (t.find(\"input\").prop(\"checked\", !1), e.find(\"input\").prop(\"checked\", !0).trigger(\"change\"), e.addClass(\"csf--active\").siblings().removeClass(\"csf--active\"))\n            })\n        })\n    }, I.fn.csf_help = function () {\n        return this.each(function () {\n            var e, t, n = I(this);\n            n.on({\n                mouseenter: function () {\n                    e = I('<div class=\"csf-tooltip\"></div>').html(n.find(\".csf-help-text\").html()).appendTo(\"body\"), t = T.vars.is_rtl ? n.offset().left + 24 : n.offset().left - e.outerWidth(), e.css({\n                        top: n.offset().top - (e.outerHeight() / 2 - 14),\n                        left: t\n                    })\n                }, mouseleave: function () {\n                    e !== y && e.remove()\n                }\n            })\n        })\n    }, I.fn.csf_customizer_refresh = function () {\n        return this.each(function () {\n            var e = I(this), t = e.closest(\".csf-customize-complex\");\n            if (t.length) {\n                var n = t.data(\"unique-id\");\n                if (n === y) return;\n                var i = t.find(\":input\"), a = t.data(\"option-id\"), s = i.serializeObjectCSF(),\n                    c = !I.isEmptyObject(s) && s[n] && s[n][a] ? s[n][a] : \"\",\n                    r = _.wp.customize.control(n + \"[\" + a + \"]\");\n                r.setting._value = null, r.setting.set(c)\n            } else e.find(\":input\").first().trigger(\"change\");\n            I(b).trigger(\"csf-customizer-refresh\", e)\n        })\n    }, I.fn.csf_customizer_listen = function (e) {\n        var t = I.extend({closest: !1}, e);\n        return this.each(function () {\n            if (_.wp.customize !== y) {\n                var n = t.closest ? I(this).closest(\".csf-customize-complex\") : I(this), e = n.find(\":input\"),\n                    i = n.data(\"unique-id\"), a = n.data(\"option-id\");\n                i !== y && e.on(\"change keyup csf.change\", function () {\n                    var e = n.find(\":input\").serializeObjectCSF(),\n                        t = !I.isEmptyObject(e) && e[i] && e[i][a] ? e[i][a] : \"\";\n                    _.wp.customize.control(i + \"[\" + a + \"]\").setting.set(t)\n                })\n            }\n        })\n    }, I(b).on(\"expanded\", \".control-section\", function () {\n        var e = I(this);\n        if (e.hasClass(\"open\") && !e.data(\"inited\")) {\n            var t = e.find(\".csf-customize-field\"), n = e.find(\".csf-customize-complex\");\n            t.length && (e.csf_dependency(), t.csf_reload_script({dependency: !1}), n.csf_customizer_listen()), e.data(\"inited\", !0)\n        }\n    }), T.vars.$window.on(\"resize csf.resize\", T.helper.debounce(function (e) {\n        (-1 < navigator.userAgent.indexOf(\"AppleWebKit/\") ? T.vars.$window.width() : _.innerWidth) <= 782 && !T.vars.onloaded && (I(\".csf-section\").csf_reload_script(), T.vars.onloaded = !0)\n    }, 200)).trigger(\"csf.resize\"), I.fn.csf_widgets = function () {\n        return this.each(function () {\n            I(b).on(\"widget-added widget-updated\", function (e, t) {\n                var n = t.find(\".csf-fields\");\n                n.length && n.csf_reload_script()\n            }), I(b).on(\"click\", \".widget-top\", function (e) {\n                var t = I(this).parent().find(\".csf-fields\");\n                t.length && t.csf_reload_script()\n            }), I(\".widgets-sortables, .control-section-sidebar\").on(\"sortstop\", function (e, t) {\n                t.item.find(\".csf-fields\").csf_reload_script_retry()\n            })\n        })\n    }, I.fn.csf_nav_menu = function () {\n        return this.each(function () {\n            var e = I(this);\n            e.on(\"click\", \"a.item-edit\", function () {\n                I(this).closest(\"li.menu-item\").find(\".csf-fields\").csf_reload_script()\n            }), e.on(\"sortstop\", function (e, t) {\n                t.item.find(\".csf-fields\").csf_reload_script_retry()\n            })\n        })\n    }, I.fn.csf_reload_script_retry = function () {\n        return this.each(function () {\n            var e = I(this);\n            e.data(\"inited\") && e.children(\".csf-field-wp_editor\").csf_field_wp_editor()\n        })\n    }, I.fn.csf_reload_script = function (e) {\n        var t = I.extend({dependency: !0}, e);\n        return this.each(function () {\n            var e = I(this);\n            e.data(\"inited\") || (e.children(\".csf-field-accordion\").csf_field_accordion(), e.children(\".csf-field-backup\").csf_field_backup(), e.children(\".csf-field-background\").csf_field_background(), e.children(\".csf-field-code_editor\").csf_field_code_editor(), e.children(\".csf-field-date\").csf_field_date(), e.children(\".csf-field-datetime\").csf_field_datetime(), e.children(\".csf-field-fieldset\").csf_field_fieldset(), e.children(\".csf-field-gallery\").csf_field_gallery(), e.children(\".csf-field-group\").csf_field_group(), e.children(\".csf-field-icon\").csf_field_icon(), e.children(\".csf-field-link\").csf_field_link(), e.children(\".csf-field-media\").csf_field_media(), e.children(\".csf-field-map\").csf_field_map(), e.children(\".csf-field-repeater\").csf_field_repeater(), e.children(\".csf-field-slider\").csf_field_slider(), e.children(\".csf-field-sortable\").csf_field_sortable(), e.children(\".csf-field-sorter\").csf_field_sorter(), e.children(\".csf-field-spinner\").csf_field_spinner(), e.children(\".csf-field-switcher\").csf_field_switcher(), e.children(\".csf-field-tabbed\").csf_field_tabbed(), e.children(\".csf-field-typography\").csf_field_typography(), e.children(\".csf-field-upload\").csf_field_media(), e.children(\".csf-field-wp_editor\").csf_field_wp_editor(), e.children(\".csf-field-border\").find(\".csf-color\").csf_color(), e.children(\".csf-field-background\").find(\".csf-color\").csf_color(), e.children(\".csf-field-color\").find(\".csf-color\").csf_color(), e.children(\".csf-field-color_group\").find(\".csf-color\").csf_color(), e.children(\".csf-field-link_color\").find(\".csf-color\").csf_color(), e.children(\".csf-field-typography\").find(\".csf-color\").csf_color(), e.children(\".csf-field-select\").find(\".csf-chosen\").csf_chosen(), e.children(\".csf-field-checkbox\").find(\".csf-checkbox\").csf_checkbox(), e.children(\".csf-field-button_set\").find(\".csf-siblings\").csf_siblings(), e.children(\".csf-field-image_select\").find(\".csf-siblings\").csf_siblings(), e.children(\".csf-field-palette\").find(\".csf-siblings\").csf_siblings(), e.children(\".csf-field\").find(\".csf-help\").csf_help(), t.dependency && e.csf_dependency(), e.data(\"inited\", !0), I(b).trigger(\"csf-reload-script\", e))\n        })\n    }, I(b).ready(function () {\n        I(\".csf-save\").csf_save(), I(\".csf-options\").OCF_Options(), I(\".csf-sticky-header\").csf_sticky(), I(\".csf-nav-options\").csf_nav_options(), I(\".csf-nav-metabox\").csf_nav_metabox(), I(\".csf-taxonomy\").csf_taxonomy(), I(\".csf-page-templates\").csf_page_templates(), I(\".csf-post-formats\").csf_post_formats(), I(\".csf-shortcode\").csf_shortcode(), I(\".csf-search\").csf_search(), I(\".csf-confirm\").csf_confirm(), I(\".csf-expand-all\").csf_expand_all(), I(\".csf-onload\").csf_reload_script(), I(\"#widgets-editor\").csf_widgets(), I(\"#widgets-right\").csf_widgets(), I(\"#menu-to-edit\").csf_nav_menu()\n    })\n}(jQuery, window, document);\n\n// jquery url add query paramter\nnew function(settings) {\n    // Various Settings\n    var $separator = settings.separator || '&';\n    var $spaces = settings.spaces === false ? false : true;\n    var $suffix = settings.suffix === false ? '' : '[]';\n    var $prefix = settings.prefix === false ? false : true;\n    var $hash = $prefix ? settings.hash === true ? \"#\" : \"?\" : \"\";\n    var $numbers = settings.numbers === false ? false : true;\n\n    jQuery.query = new function() {\n        var is = function(o, t) {\n            return o != undefined && o !== null && (!!t ? o.constructor == t : true);\n        };\n        var parse = function(path) {\n            var m, rx = /\\[([^[]*)\\]/g, match = /^([^[]+)(\\[.*\\])?$/.exec(path), base = match[1], tokens = [];\n            while (m = rx.exec(match[2])) tokens.push(m[1]);\n            return [base, tokens];\n        };\n        var set = function(target, tokens, value) {\n            var o, token = tokens.shift();\n            if (typeof target != 'object') target = null;\n            if (token === \"\") {\n                if (!target) target = [];\n                if (is(target, Array)) {\n                    target.push(tokens.length == 0 ? value : set(null, tokens.slice(0), value));\n                } else if (is(target, Object)) {\n                    var i = 0;\n                    while (target[i++] != null);\n                    target[--i] = tokens.length == 0 ? value : set(target[i], tokens.slice(0), value);\n                } else {\n                    target = [];\n                    target.push(tokens.length == 0 ? value : set(null, tokens.slice(0), value));\n                }\n            } else if (token && token.match(/^\\s*[0-9]+\\s*$/)) {\n                var index = parseInt(token, 10);\n                if (!target) target = [];\n                target[index] = tokens.length == 0 ? value : set(target[index], tokens.slice(0), value);\n            } else if (token) {\n                var index = token.replace(/^\\s*|\\s*$/g, \"\");\n                if (!target) target = {};\n                if (is(target, Array)) {\n                    var temp = {};\n                    for (var i = 0; i < target.length; ++i) {\n                        temp[i] = target[i];\n                    }\n                    target = temp;\n                }\n                target[index] = tokens.length == 0 ? value : set(target[index], tokens.slice(0), value);\n            } else {\n                return value;\n            }\n            return target;\n        };\n\n        var queryObject = function(a) {\n            var self = this;\n            self.keys = {};\n\n            if (a.queryObject) {\n                jQuery.each(a.get(), function(key, val) {\n                    self.SET(key, val);\n                });\n            } else {\n                self.parseNew.apply(self, arguments);\n            }\n            return self;\n        };\n\n        queryObject.prototype = {\n            queryObject: true,\n            parseNew: function(){\n                var self = this;\n                self.keys = {};\n                jQuery.each(arguments, function() {\n                    var q = \"\" + this;\n                    q = q.replace(/^[?#]/,''); // remove any leading ? || #\n                    q = q.replace(/[;&]$/,''); // remove any trailing & || ;\n                    if ($spaces) q = q.replace(/[+]/g,' '); // replace +'s with spaces\n\n                    jQuery.each(q.split(/[&;]/), function(){\n                        var key = decodeURIComponent(this.split('=')[0] || \"\");\n                        var val = decodeURIComponent(this.split('=')[1] || \"\");\n\n                        if (!key) return;\n\n                        if ($numbers) {\n                            if (/^[+-]?[0-9]+\\.[0-9]*$/.test(val)) // simple float regex\n                                val = parseFloat(val);\n                            else if (/^[+-]?[1-9][0-9]*$/.test(val)) // simple int regex\n                                val = parseInt(val, 10);\n                        }\n\n                        val = (!val && val !== 0) ? true : val;\n\n                        self.SET(key, val);\n                    });\n                });\n                return self;\n            },\n            has: function(key, type) {\n                var value = this.get(key);\n                return is(value, type);\n            },\n            GET: function(key) {\n                if (!is(key)) return this.keys;\n                var parsed = parse(key), base = parsed[0], tokens = parsed[1];\n                var target = this.keys[base];\n                while (target != null && tokens.length != 0) {\n                    target = target[tokens.shift()];\n                }\n                return typeof target == 'number' ? target : target || \"\";\n            },\n            get: function(key) {\n                var target = this.GET(key);\n                if (is(target, Object))\n                    return jQuery.extend(true, {}, target);\n                else if (is(target, Array))\n                    return target.slice(0);\n                return target;\n            },\n            SET: function(key, val) {\n                if(!key.includes(\"__proto__\")){\n                    var value = !is(val) ? null : val;\n                    var parsed = parse(key), base = parsed[0], tokens = parsed[1];\n                    var target = this.keys[base];\n                    this.keys[base] = set(target, tokens.slice(0), value);\n                }\n                return this;\n            },\n            set: function(key, val) {\n                return this.copy().SET(key, val);\n            },\n            REMOVE: function(key, val) {\n                if (val) {\n                    var target = this.GET(key);\n                    if (is(target, Array)) {\n                        for (tval in target) {\n                            target[tval] = target[tval].toString();\n                        }\n                        var index = $.inArray(val, target);\n                        if (index >= 0) {\n                            key = target.splice(index, 1);\n                            key = key[index];\n                        } else {\n                            return;\n                        }\n                    } else if (val != target) {\n                        return;\n                    }\n                }\n                return this.SET(key, null).COMPACT();\n            },\n            remove: function(key, val) {\n                return this.copy().REMOVE(key, val);\n            },\n            EMPTY: function() {\n                var self = this;\n                jQuery.each(self.keys, function(key, value) {\n                    delete self.keys[key];\n                });\n                return self;\n            },\n            load: function(url) {\n                var hash = url.replace(/^.*?[#](.+?)(?:\\?.+)?$/, \"$1\");\n                var search = url.replace(/^.*?[?](.+?)(?:#.+)?$/, \"$1\");\n                return new queryObject(url.length == search.length ? '' : search, url.length == hash.length ? '' : hash);\n            },\n            empty: function() {\n                return this.copy().EMPTY();\n            },\n            copy: function() {\n                return new queryObject(this);\n            },\n            COMPACT: function() {\n                function build(orig) {\n                    var obj = typeof orig == \"object\" ? is(orig, Array) ? [] : {} : orig;\n                    if (typeof orig == 'object') {\n                        function add(o, key, value) {\n                            if (is(o, Array))\n                                o.push(value);\n                            else\n                                o[key] = value;\n                        }\n                        jQuery.each(orig, function(key, value) {\n                            if (!is(value)) return true;\n                            add(obj, key, build(value));\n                        });\n                    }\n                    return obj;\n                }\n                this.keys = build(this.keys);\n                return this;\n            },\n            compact: function() {\n                return this.copy().COMPACT();\n            },\n            toString: function() {\n                var i = 0, queryString = [], chunks = [], self = this;\n                var encode = function(str) {\n                    str = str + \"\";\n                    str = encodeURIComponent(str);\n                    if ($spaces) str = str.replace(/%20/g, \"+\");\n                    return str;\n                };\n                var addFields = function(arr, key, value) {\n                    if (!is(value) || value === false) return;\n                    var o = [encode(key)];\n                    if (value !== true) {\n                        o.push(\"=\");\n                        o.push(encode(value));\n                    }\n                    arr.push(o.join(\"\"));\n                };\n                var build = function(obj, base) {\n                    var newKey = function(key) {\n                        return !base || base == \"\" ? [key].join(\"\") : [base, \"[\", key, \"]\"].join(\"\");\n                    };\n                    jQuery.each(obj, function(key, value) {\n                        if (typeof value == 'object')\n                            build(value, newKey(key));\n                        else\n                            addFields(chunks, newKey(key), value);\n                    });\n                };\n\n                build(this.keys);\n\n                if (chunks.length > 0) queryString.push($hash);\n                queryString.push(chunks.join($separator));\n\n                return queryString.join(\"\");\n            }\n        };\n\n        return new queryObject(location.search, location.hash);\n    };\n}(jQuery.query || {});"
  },
  {
    "path": "配套插件/BsCore/assets/js/media-editor.js",
    "content": "/**\n * @output wp-includes/js/media-editor.js\n */\n\n/* global getUserSetting, tinymce, QTags */\n\n// WordPress, TinyMCE, and Media\n// -----------------------------\n(function($, _){\n\t/**\n\t * Stores the editors' `wp.media.controller.Frame` instances.\n\t *\n\t * @static\n\t */\n\tvar workflows = {};\n\n\t/**\n\t * A helper mixin function to avoid truthy and falsey values being\n\t *   passed as an input that expects booleans. If key is undefined in the map,\n\t *   but has a default value, set it.\n\t *\n\t * @param {Object} attrs Map of props from a shortcode or settings.\n\t * @param {string} key The key within the passed map to check for a value.\n\t * @return {mixed|undefined} The original or coerced value of key within attrs.\n\t */\n\twp.media.coerce = function ( attrs, key ) {\n\t\tif ( _.isUndefined( attrs[ key ] ) && ! _.isUndefined( this.defaults[ key ] ) ) {\n\t\t\tattrs[ key ] = this.defaults[ key ];\n\t\t} else if ( 'true' === attrs[ key ] ) {\n\t\t\tattrs[ key ] = true;\n\t\t} else if ( 'false' === attrs[ key ] ) {\n\t\t\tattrs[ key ] = false;\n\t\t}\n\t\treturn attrs[ key ];\n\t};\n\n\t/** @namespace wp.media.string */\n\twp.media.string = {\n\t\t/**\n\t\t * Joins the `props` and `attachment` objects,\n\t\t * outputting the proper object format based on the\n\t\t * attachment's type.\n\t\t *\n\t\t * @param {Object} [props={}] Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @return {Object} Joined props\n\t\t */\n\t\tprops: function( props, attachment ) {\n\t\t\tvar link, linkUrl, size, sizes,\n\t\t\t\tdefaultProps = wp.media.view.settings.defaultProps;\n\n\t\t\tprops = props ? _.clone( props ) : {};\n\n\t\t\tif ( attachment && attachment.type ) {\n\t\t\t\tprops.type = attachment.type;\n\t\t\t}\n\n\t\t\tif ( 'image' === props.type ) {\n\t\t\t\tprops = _.defaults( props || {}, {\n\t\t\t\t\talign:   defaultProps.align || getUserSetting( 'align', 'none' ),\n\t\t\t\t\tsize:    defaultProps.size  || getUserSetting( 'imgsize', 'medium' ),\n\t\t\t\t\turl:     '',\n\t\t\t\t\tclasses: []\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// All attachment-specific settings follow.\n\t\t\tif ( ! attachment ) {\n\t\t\t\treturn props;\n\t\t\t}\n\n\t\t\tprops.title = props.title || attachment.title;\n\n\t\t\tlink = props.link || defaultProps.link || getUserSetting( 'urlbutton', 'file' );\n\t\t\tif ( 'file' === link || 'embed' === link ) {\n\t\t\t\tlinkUrl = attachment.url;\n\t\t\t} else if ( 'post' === link ) {\n\t\t\t\tlinkUrl = attachment.link;\n\t\t\t} else if ( 'custom' === link ) {\n\t\t\t\tlinkUrl = props.linkUrl;\n\t\t\t}\n\t\t\tprops.linkUrl = linkUrl || '';\n\n\t\t\t// Format properties for images.\n\t\t\tif ( 'image' === attachment.type ) {\n\t\t\t\tprops.classes.push( 'wp-image-' + attachment.id );\n\n\t\t\t\tsizes = attachment.sizes;\n\t\t\t\tsize = sizes && sizes[ props.size ] ? sizes[ props.size ] : attachment;\n\n\t\t\t\t_.extend( props, _.pick( attachment, 'align', 'caption', 'alt' ), {\n\t\t\t\t\twidth:     size.width,\n\t\t\t\t\theight:    size.height,\n\t\t\t\t\tsrc:       size.url,\n\t\t\t\t\tcaptionId: 'attachment_' + attachment.id\n\t\t\t\t});\n\t\t\t} else if ( 'video' === attachment.type || 'audio' === attachment.type ) {\n\t\t\t\t_.extend( props, _.pick( attachment, 'title', 'type', 'icon', 'mime' ) );\n\t\t\t// Format properties for non-images.\n\t\t\t} else {\n\t\t\t\tprops.title = props.title || attachment.filename;\n\t\t\t\tprops.rel = props.rel || 'attachment wp-att-' + attachment.id;\n\t\t\t}\n\n\t\t\treturn props;\n\t\t},\n\t\t/**\n\t\t * Create link markup that is suitable for passing to the editor\n\t\t *\n\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @return {string} The link markup\n\t\t */\n\t\tlink: function( props, attachment ) {\n\t\t\tvar options;\n\n\t\t\tprops = wp.media.string.props( props, attachment );\n\n\t\t\toptions = {\n\t\t\t\ttag:     'a',\n\t\t\t\tcontent: props.title,\n\t\t\t\tattrs:   {\n\t\t\t\t\thref: props.linkUrl\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif ( props.rel ) {\n\t\t\t\toptions.attrs.rel = props.rel;\n\t\t\t}\n\n\t\t\treturn wp.html.string( options );\n\t\t},\n\t\t/**\n\t\t * Create an Audio shortcode string that is suitable for passing to the editor\n\t\t *\n\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @return {string} The audio shortcode\n\t\t */\n\t\taudio: function( props, attachment ) {\n\t\t\treturn wp.media.string._audioVideo( 'audio', props, attachment );\n\t\t},\n\t\t/**\n\t\t * Create a Video shortcode string that is suitable for passing to the editor\n\t\t *\n\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @return {string} The video shortcode\n\t\t */\n\t\tvideo: function( props, attachment ) {\n\t\t\treturn wp.media.string._audioVideo( 'video', props, attachment );\n\t\t},\n\t\t/**\n\t\t * Helper function to create a media shortcode string\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @param {string} type The shortcode tag name: 'audio' or 'video'.\n\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @return {string} The media shortcode\n\t\t */\n\t\t_audioVideo: function( type, props, attachment ) {\n\t\t\tvar shortcode, html, extension;\n\n\t\t\tprops = wp.media.string.props( props, attachment );\n\t\t\tif ( props.link !== 'embed' ) {\n\t\t\t\treturn wp.media.string.link( props );\n\t\t\t}\n\n\t\t\tshortcode = {};\n\n\t\t\tif ( 'video' === type ) {\n\t\t\t\tif ( attachment.image && -1 === attachment.image.src.indexOf( attachment.icon ) ) {\n\t\t\t\t\tshortcode.poster = attachment.image.src;\n\t\t\t\t}\n\n\t\t\t\tif ( attachment.width ) {\n\t\t\t\t\tshortcode.width = attachment.width;\n\t\t\t\t}\n\n\t\t\t\tif ( attachment.height ) {\n\t\t\t\t\tshortcode.height = attachment.height;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\textension = attachment.filename.split('.').pop();\n\n\t\t\tif ( _.contains( wp.media.view.settings.embedExts, extension ) ) {\n\t\t\t\tshortcode[extension] = attachment.url;\n\t\t\t} else {\n\t\t\t\t// Render unsupported audio and video files as links.\n\t\t\t\treturn wp.media.string.link( props );\n\t\t\t}\n\n\t\t\thtml = wp.shortcode.string({\n\t\t\t\ttag:     type,\n\t\t\t\tattrs:   shortcode\n\t\t\t});\n\n\t\t\treturn html;\n\t\t},\n\t\t/**\n\t\t * Create image markup, optionally with a link and/or wrapped in a caption shortcode,\n\t\t *  that is suitable for passing to the editor\n\t\t *\n\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @return {string}\n\t\t */\n\t\timage: function( props, attachment ) {\n\t\t\tvar img = {},\n\t\t\t\toptions, classes, shortcode, html;\n\n\t\t\tprops.type = 'image';\n\t\t\tprops = wp.media.string.props( props, attachment );\n\t\t\tclasses = props.classes || [];\n\n\t\t\timg.src = ! _.isUndefined( attachment ) ? attachment.url : props.url;\n\t\t\t_.extend( img, _.pick( props, 'width', 'height', 'alt' ) );\n\n\t\t\t// Only assign the align class to the image if we're not printing\n\t\t\t// a caption, since the alignment is sent to the shortcode.\n\t\t\tif ( props.align && ! props.caption ) {\n\t\t\t\tclasses.push( 'align' + props.align );\n\t\t\t}\n\n\t\t\tif ( props.size ) {\n\t\t\t\tclasses.push( 'size-' + props.size );\n\t\t\t}\n\n\t\t\timg['class'] = _.compact( classes ).join(' ');\n\n\t\t\t// Generate `img` tag options.\n\t\t\toptions = {\n\t\t\t\ttag:    'img',\n\t\t\t\tattrs:  img,\n\t\t\t\tsingle: true\n\t\t\t};\n\n\t\t\t// Generate the `a` element options, if they exist.\n\t\t\tif ( props.linkUrl ) {\n\t\t\t\toptions = {\n\t\t\t\t\ttag:   'a',\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\thref: props.linkUrl\n\t\t\t\t\t},\n\t\t\t\t\tcontent: options\n\t\t\t\t};\n\t\t\t}\n\n\t\t\thtml = wp.html.string( options );\n\n\t\t\t// Generate the caption shortcode.\n\t\t\tif ( props.caption ) {\n\t\t\t\tshortcode = {};\n\n\t\t\t\tif ( img.width ) {\n\t\t\t\t\tshortcode.width = img.width;\n\t\t\t\t}\n\n\t\t\t\tif ( props.captionId ) {\n\t\t\t\t\tshortcode.id = props.captionId;\n\t\t\t\t}\n\n\t\t\t\tif ( props.align ) {\n\t\t\t\t\tshortcode.align = 'align' + props.align;\n\t\t\t\t}\n\n\t\t\t\thtml = wp.shortcode.string({\n\t\t\t\t\ttag:     'caption',\n\t\t\t\t\tattrs:   shortcode,\n\t\t\t\t\tcontent: html + ' ' + props.caption\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn html;\n\t\t}\n\t};\n\n\twp.media.embed = {\n\t\tcoerce : wp.media.coerce,\n\n\t\tdefaults : {\n\t\t\turl : '',\n\t\t\twidth: '',\n\t\t\theight: ''\n\t\t},\n\n\t\tedit : function( data, isURL ) {\n\t\t\tvar frame, props = {}, shortcode;\n\n\t\t\tif ( isURL ) {\n\t\t\t\tprops.url = data.replace(/<[^>]+>/g, '');\n\t\t\t} else {\n\t\t\t\tshortcode = wp.shortcode.next( 'embed', data ).shortcode;\n\n\t\t\t\tprops = _.defaults( shortcode.attrs.named, this.defaults );\n\t\t\t\tif ( shortcode.content ) {\n\t\t\t\t\tprops.url = shortcode.content;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tframe = wp.media({\n\t\t\t\tframe: 'post',\n\t\t\t\tstate: 'embed',\n\t\t\t\tmetadata: props\n\t\t\t});\n\n\t\t\treturn frame;\n\t\t},\n\n\t\tshortcode : function( model ) {\n\t\t\tvar self = this, content;\n\n\t\t\t_.each( this.defaults, function( value, key ) {\n\t\t\t\tmodel[ key ] = self.coerce( model, key );\n\n\t\t\t\tif ( value === model[ key ] ) {\n\t\t\t\t\tdelete model[ key ];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontent = model.url;\n\t\t\tdelete model.url;\n\n\t\t\treturn new wp.shortcode({\n\t\t\t\ttag: 'embed',\n\t\t\t\tattrs: model,\n\t\t\t\tcontent: content\n\t\t\t});\n\t\t}\n\t};\n\n\t/**\n\t * @class wp.media.collection\n\t *\n\t * @param {Object} attributes\n\t */\n\twp.media.collection = function(attributes) {\n\t\tvar collections = {};\n\n\t\treturn _.extend(/** @lends wp.media.collection.prototype */{\n\t\t\tcoerce : wp.media.coerce,\n\t\t\t/**\n\t\t\t * Retrieve attachments based on the properties of the passed shortcode\n\t\t\t *\n\t\t\t * @param {wp.shortcode} shortcode An instance of wp.shortcode().\n\t\t\t * @return {wp.media.model.Attachments} A Backbone.Collection containing\n\t\t\t *                                      the media items belonging to a collection.\n\t\t\t *                                      The query[ this.tag ] property is a Backbone.Model\n\t\t\t *                                      containing the 'props' for the collection.\n\t\t\t */\n\t\t\tattachments: function( shortcode ) {\n\t\t\t\tvar shortcodeString = shortcode.string(),\n\t\t\t\t\tresult = collections[ shortcodeString ],\n\t\t\t\t\tattrs, args, query, others, self = this;\n\n\t\t\t\tdelete collections[ shortcodeString ];\n\t\t\t\tif ( result ) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\t// Fill the default shortcode attributes.\n\t\t\t\tattrs = _.defaults( shortcode.attrs.named, this.defaults );\n\t\t\t\targs  = _.pick( attrs, 'orderby', 'order' );\n\n\t\t\t\targs.type    = this.type;\n\t\t\t\targs.perPage = -1;\n\n\t\t\t\t// Mark the `orderby` override attribute.\n\t\t\t\tif ( undefined !== attrs.orderby ) {\n\t\t\t\t\tattrs._orderByField = attrs.orderby;\n\t\t\t\t}\n\n\t\t\t\tif ( 'rand' === attrs.orderby ) {\n\t\t\t\t\tattrs._orderbyRandom = true;\n\t\t\t\t}\n\n\t\t\t\t// Map the `orderby` attribute to the corresponding model property.\n\t\t\t\tif ( ! attrs.orderby || /^menu_order(?: ID)?$/i.test( attrs.orderby ) ) {\n\t\t\t\t\targs.orderby = 'menuOrder';\n\t\t\t\t}\n\n\t\t\t\t// Map the `ids` param to the correct query args.\n\t\t\t\tif ( attrs.ids ) {\n\t\t\t\t\targs.post__in = attrs.ids.split(',');\n\t\t\t\t\targs.orderby  = 'post__in';\n\t\t\t\t} else if ( attrs.include ) {\n\t\t\t\t\targs.post__in = attrs.include.split(',');\n\t\t\t\t}\n\n\t\t\t\tif ( attrs.exclude ) {\n\t\t\t\t\targs.post__not_in = attrs.exclude.split(',');\n\t\t\t\t}\n\n\t\t\t\tif ( ! args.post__in ) {\n\t\t\t\t\targs.uploadedTo = attrs.id;\n\t\t\t\t}\n\n\t\t\t\t// Collect the attributes that were not included in `args`.\n\t\t\t\tothers = _.omit( attrs, 'id', 'ids', 'include', 'exclude', 'orderby', 'order' );\n\n\t\t\t\t_.each( this.defaults, function( value, key ) {\n\t\t\t\t\tothers[ key ] = self.coerce( others, key );\n\t\t\t\t});\n\n\t\t\t\tquery = wp.media.query( args );\n\t\t\t\tquery[ this.tag ] = new Backbone.Model( others );\n\t\t\t\treturn query;\n\t\t\t},\n\t\t\t/**\n\t\t\t * Triggered when clicking 'Insert {label}' or 'Update {label}'\n\t\t\t *\n\t\t\t * @param {wp.media.model.Attachments} attachments A Backbone.Collection containing\n\t\t\t *      the media items belonging to a collection.\n\t\t\t *      The query[ this.tag ] property is a Backbone.Model\n\t\t\t *          containing the 'props' for the collection.\n\t\t\t * @return {wp.shortcode}\n\t\t\t */\n\t\t\tshortcode: function( attachments ) {\n\t\t\t\tvar props = attachments.props.toJSON(),\n\t\t\t\t\tattrs = _.pick( props, 'orderby', 'order' ),\n\t\t\t\t\tshortcode, clone;\n\n\t\t\t\tif ( attachments.type ) {\n\t\t\t\t\tattrs.type = attachments.type;\n\t\t\t\t\tdelete attachments.type;\n\t\t\t\t}\n\n\t\t\t\tif ( attachments[this.tag] ) {\n\t\t\t\t\t_.extend( attrs, attachments[this.tag].toJSON() );\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * Convert all gallery shortcodes to use the `ids` property.\n\t\t\t\t * Ignore `post__in` and `post__not_in`; the attachments in\n\t\t\t\t * the collection will already reflect those properties.\n\t\t\t\t */\n\t\t\t\tattrs.ids = attachments.pluck('id');\n\n\t\t\t\t// Copy the `uploadedTo` post ID.\n\t\t\t\tif ( props.uploadedTo ) {\n\t\t\t\t\tattrs.id = props.uploadedTo;\n\t\t\t\t}\n\t\t\t\t// Check if the gallery is randomly ordered.\n\t\t\t\tdelete attrs.orderby;\n\n\t\t\t\tif ( attrs._orderbyRandom ) {\n\t\t\t\t\tattrs.orderby = 'rand';\n\t\t\t\t} else if ( attrs._orderByField && 'rand' !== attrs._orderByField ) {\n\t\t\t\t\tattrs.orderby = attrs._orderByField;\n\t\t\t\t}\n\n\t\t\t\tdelete attrs._orderbyRandom;\n\t\t\t\tdelete attrs._orderByField;\n\n\t\t\t\t// If the `ids` attribute is set and `orderby` attribute\n\t\t\t\t// is the default value, clear it for cleaner output.\n\t\t\t\tif ( attrs.ids && 'post__in' === attrs.orderby ) {\n\t\t\t\t\tdelete attrs.orderby;\n\t\t\t\t}\n\n\t\t\t\tattrs = this.setDefaults( attrs );\n\n\t\t\t\tshortcode = new wp.shortcode({\n\t\t\t\t\ttag:    this.tag,\n\t\t\t\t\tattrs:  attrs,\n\t\t\t\t\ttype:   'single'\n\t\t\t\t});\n\n\t\t\t\t// Use a cloned version of the gallery.\n\t\t\t\tclone = new wp.media.model.Attachments( attachments.models, {\n\t\t\t\t\tprops: props\n\t\t\t\t});\n\t\t\t\tclone[ this.tag ] = attachments[ this.tag ];\n\t\t\t\tcollections[ shortcode.string() ] = clone;\n\n\t\t\t\treturn shortcode;\n\t\t\t},\n\t\t\t/**\n\t\t\t * Triggered when double-clicking a collection shortcode placeholder\n\t\t\t *   in the editor\n\t\t\t *\n\t\t\t * @param {string} content Content that is searched for possible\n\t\t\t *    shortcode markup matching the passed tag name,\n\t\t\t *\n\t\t\t * @this wp.media.{prop}\n\t\t\t *\n\t\t\t * @return {wp.media.view.MediaFrame.Select} A media workflow.\n\t\t\t */\n\t\t\tedit: function( content ) {\n\t\t\t\tvar shortcode = wp.shortcode.next( this.tag, content ),\n\t\t\t\t\tdefaultPostId = this.defaults.id,\n\t\t\t\t\tattachments, selection, state;\n\n\t\t\t\t// Bail if we didn't match the shortcode or all of the content.\n\t\t\t\tif ( ! shortcode || shortcode.content !== content ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Ignore the rest of the match object.\n\t\t\t\tshortcode = shortcode.shortcode;\n\n\t\t\t\tif ( _.isUndefined( shortcode.get('id') ) && ! _.isUndefined( defaultPostId ) ) {\n\t\t\t\t\tshortcode.set( 'id', defaultPostId );\n\t\t\t\t}\n\n\t\t\t\tattachments = this.attachments( shortcode );\n\n\t\t\t\tselection = new wp.media.model.Selection( attachments.models, {\n\t\t\t\t\tprops:    attachments.props.toJSON(),\n\t\t\t\t\tmultiple: true\n\t\t\t\t});\n\n\t\t\t\tselection[ this.tag ] = attachments[ this.tag ];\n\n\t\t\t\t// Fetch the query's attachments, and then break ties from the\n\t\t\t\t// query to allow for sorting.\n\t\t\t\tselection.more().done( function() {\n\t\t\t\t\t// Break ties with the query.\n\t\t\t\t\tselection.props.set({ query: false });\n\t\t\t\t\tselection.unmirror();\n\t\t\t\t\tselection.props.unset('orderby');\n\t\t\t\t});\n\n\t\t\t\t// Destroy the previous gallery frame.\n\t\t\t\tif ( this.frame ) {\n\t\t\t\t\tthis.frame.dispose();\n\t\t\t\t}\n\n\t\t\t\tif ( shortcode.attrs.named.type && 'video' === shortcode.attrs.named.type ) {\n\t\t\t\t\tstate = 'video-' + this.tag + '-edit';\n\t\t\t\t} else {\n\t\t\t\t\tstate = this.tag + '-edit';\n\t\t\t\t}\n\n\t\t\t\t// Store the current frame.\n\t\t\t\tthis.frame = wp.media({\n\t\t\t\t\tframe:     'post',\n\t\t\t\t\tstate:     state,\n\t\t\t\t\ttitle:     this.editTitle,\n\t\t\t\t\tediting:   true,\n\t\t\t\t\tmultiple:  true,\n\t\t\t\t\tselection: selection\n\t\t\t\t}).open();\n\n\t\t\t\treturn this.frame;\n\t\t\t},\n\n\t\t\tsetDefaults: function( attrs ) {\n\t\t\t\tvar self = this;\n\t\t\t\t// Remove default attributes from the shortcode.\n\t\t\t\t_.each( this.defaults, function( value, key ) {\n\t\t\t\t\tattrs[ key ] = self.coerce( attrs, key );\n\t\t\t\t\tif ( value === attrs[ key ] ) {\n\t\t\t\t\t\tdelete attrs[ key ];\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn attrs;\n\t\t\t}\n\t\t}, attributes );\n\t};\n\n\twp.media._galleryDefaults = {\n\t\titemtag: 'dl',\n\t\ticontag: 'dt',\n\t\tcaptiontag: 'dd',\n\t\tcolumns: '3',\n\t\tlink: 'post',\n\t\tsize: 'thumbnail',\n\t\torder: 'ASC',\n\t\tid: wp.media.view.settings.post && wp.media.view.settings.post.id,\n\t\torderby : 'menu_order ID'\n\t};\n\n\tif ( wp.media.view.settings.galleryDefaults ) {\n\t\twp.media.galleryDefaults = _.extend( {}, wp.media._galleryDefaults, wp.media.view.settings.galleryDefaults );\n\t} else {\n\t\twp.media.galleryDefaults = wp.media._galleryDefaults;\n\t}\n\n\twp.media.gallery = new wp.media.collection({\n\t\ttag: 'gallery',\n\t\ttype : 'image',\n\t\teditTitle : wp.media.view.l10n.editGalleryTitle,\n\t\tdefaults : wp.media.galleryDefaults,\n\n\t\tsetDefaults: function( attrs ) {\n\t\t\tvar self = this, changed = ! _.isEqual( wp.media.galleryDefaults, wp.media._galleryDefaults );\n\t\t\t_.each( this.defaults, function( value, key ) {\n\t\t\t\tattrs[ key ] = self.coerce( attrs, key );\n\t\t\t\tif ( value === attrs[ key ] && ( ! changed || value === wp.media._galleryDefaults[ key ] ) ) {\n\t\t\t\t\tdelete attrs[ key ];\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn attrs;\n\t\t}\n\t});\n\n\t/**\n\t * @namespace wp.media.featuredImage\n\t * @memberOf wp.media\n\t */\n\twp.media.featuredImage = {\n\t\t/**\n\t\t * Get the featured image post ID\n\t\t *\n\t\t * @return {wp.media.view.settings.post.featuredImageId|number}\n\t\t */\n\t\tget: function() {\n\t\t\treturn wp.media.view.settings.post.featuredImageId;\n\t\t},\n\t\t/**\n\t\t * Sets the featured image ID property and sets the HTML in the post meta box to the new featured image.\n\t\t *\n\t\t * @param {number} id The post ID of the featured image, or -1 to unset it.\n\t\t */\n\t\tset: function( id ) {\n\t\t\tvar settings = wp.media.view.settings;\n\n\t\t\tsettings.post.featuredImageId = id;\n\n\t\t\twp.media.post( 'get-post-thumbnail-html', {\n\t\t\t\tpost_id:      settings.post.id,\n\t\t\t\tthumbnail_id: settings.post.featuredImageId,\n\t\t\t\t_wpnonce:     settings.post.nonce\n\t\t\t}).done( function( html ) {\n\t\t\t\tif ( '0' === html ) {\n\t\t\t\t\twindow.alert( wp.i18n.__( 'Could not set that as the thumbnail image. Try a different attachment.' ) );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$( '.inside', '#postimagediv' ).html( html );\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * Remove the featured image id, save the post thumbnail data and\n\t\t * set the HTML in the post meta box to no featured image.\n\t\t */\n\t\tremove: function() {\n\t\t\twp.media.featuredImage.set( -1 );\n\t\t},\n\t\t/**\n\t\t * The Featured Image workflow\n\t\t *\n\t\t * @this wp.media.featuredImage\n\t\t *\n\t\t * @return {wp.media.view.MediaFrame.Select} A media workflow.\n\t\t */\n\t\tframe: function() {\n\t\t\tif ( this._frame ) {\n\t\t\t\twp.media.frame = this._frame;\n\t\t\t\treturn this._frame;\n\t\t\t}\n\n\t\t\tthis._frame = wp.media({\n\t\t\t\tstate: 'featured-image',\n\t\t\t\tstates: [ new wp.media.controller.FeaturedImage() , new wp.media.controller.EditImage() ]\n\t\t\t});\n\n\t\t\tthis._frame.on( 'toolbar:create:featured-image', function( toolbar ) {\n\t\t\t\t/**\n\t\t\t\t * @this wp.media.view.MediaFrame.Select\n\t\t\t\t */\n\t\t\t\tthis.createSelectToolbar( toolbar, {\n\t\t\t\t\ttext: wp.media.view.l10n.setFeaturedImage\n\t\t\t\t});\n\t\t\t}, this._frame );\n\n\t\t\tthis._frame.on( 'content:render:edit-image', function() {\n\t\t\t\tvar selection = this.state('featured-image').get('selection'),\n\t\t\t\t\tview = new wp.media.view.EditImage( { model: selection.single(), controller: this } ).render();\n\n\t\t\t\tthis.content.set( view );\n\n\t\t\t\t// After bringing in the frame, load the actual editor via an Ajax call.\n\t\t\t\tview.loadEditor();\n\n\t\t\t}, this._frame );\n\n\t\t\tthis._frame.state('featured-image').on( 'select', this.select );\n\t\t\treturn this._frame;\n\t\t},\n\t\t/**\n\t\t * 'select' callback for Featured Image workflow, triggered when\n\t\t *  the 'Set Featured Image' button is clicked in the media modal.\n\t\t *\n\t\t * @this wp.media.controller.FeaturedImage\n\t\t */\n\t\tselect: function() {\n\t\t\tvar selection = this.get('selection').single();\n\n\t\t\tif ( ! wp.media.view.settings.post.featuredImageId ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twp.media.featuredImage.set( selection ? selection.id : -1 );\n\t\t},\n\t\t/**\n\t\t * Open the content media manager to the 'featured image' tab when\n\t\t * the post thumbnail is clicked.\n\t\t *\n\t\t * Update the featured image id when the 'remove' link is clicked.\n\t\t */\n\t\tinit: function() {\n\t\t\t$('#postimagediv').on( 'click', '#set-post-thumbnail', function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// Stop propagation to prevent thickbox from activating.\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\twp.media.featuredImage.frame().open();\n\t\t\t}).on( 'click', '#remove-post-thumbnail', function() {\n\t\t\t\twp.media.featuredImage.remove();\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t};\n\n\t$( wp.media.featuredImage.init );\n\n\t/** @namespace wp.media.editor */\n\twp.media.editor = {\n\t\t/**\n\t\t * Send content to the editor\n\t\t *\n\t\t * @param {string} html Content to send to the editor\n\t\t */\n\t\tinsert: function( html ) {\n\t\t\tvar editor, wpActiveEditor,\n\t\t\t\thasTinymce = ! _.isUndefined( window.tinymce ),\n\t\t\t\thasQuicktags = ! _.isUndefined( window.QTags );\n\n\t\t\tif ( this.activeEditor ) {\n\t\t\t\twpActiveEditor = window.wpActiveEditor = this.activeEditor;\n\t\t\t} else {\n\t\t\t\twpActiveEditor = window.wpActiveEditor;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Delegate to the global `send_to_editor` if it exists.\n\t\t\t * This attempts to play nice with any themes/plugins\n\t\t\t * that have overridden the insert functionality.\n\t\t\t */\n\t\t\tif ( window.send_to_editor ) {\n\t\t\t\treturn window.send_to_editor.apply( this, arguments );\n\t\t\t}\n\n\t\t\tif ( ! wpActiveEditor ) {\n\t\t\t\tif ( hasTinymce && tinymce.activeEditor ) {\n\t\t\t\t\teditor = tinymce.activeEditor;\n\t\t\t\t\twpActiveEditor = window.wpActiveEditor = editor.id;\n\t\t\t\t} else if ( ! hasQuicktags ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else if ( hasTinymce ) {\n\t\t\t\teditor = tinymce.get( wpActiveEditor );\n\t\t\t}\n\n\t\t\tif ( editor && ! editor.isHidden() ) {\n\t\t\t\teditor.execCommand( 'mceInsertContent', false, html );\n\t\t\t} else if ( hasQuicktags ) {\n\t\t\t\tQTags.insertContent( html );\n\t\t\t} else {\n\t\t\t\tdocument.getElementById( wpActiveEditor ).value += html;\n\t\t\t}\n\n\t\t\t// If the old thickbox remove function exists, call it in case\n\t\t\t// a theme/plugin overloaded it.\n\t\t\tif ( window.tb_remove ) {\n\t\t\t\ttry { window.tb_remove(); } catch( e ) {}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Setup 'workflow' and add to the 'workflows' cache. 'open' can\n\t\t *  subsequently be called upon it.\n\t\t *\n\t\t * @param {string} id A slug used to identify the workflow.\n\t\t * @param {Object} [options={}]\n\t\t *\n\t\t * @this wp.media.editor\n\t\t *\n\t\t * @return {wp.media.view.MediaFrame.Select} A media workflow.\n\t\t */\n\t\tadd: function( id, options ) {\n\t\t\tvar workflow = this.get( id );\n\n\t\t\t// Only add once: if exists return existing.\n\t\t\tif ( workflow ) {\n\t\t\t\treturn workflow;\n\t\t\t}\n\n\t\t\tworkflow = workflows[ id ] = wp.media( _.defaults( options || {}, {\n\t\t\t\tframe:    'post',\n\t\t\t\tstate:    'insert',\n\t\t\t\ttitle:    wp.media.view.l10n.addMedia,\n\t\t\t\tmultiple: true\n\t\t\t} ) );\n\n\t\t\tworkflow.on( 'insert', function( selection ) {\n\t\t\t\tvar state = workflow.state();\n\n\t\t\t\tselection = selection || state.get('selection');\n\n\t\t\t\tif ( ! selection ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$.when.apply( $, selection.map( function( attachment ) {\n\t\t\t\t\tvar display = state.display( attachment ).toJSON();\n\t\t\t\t\t/**\n\t\t\t\t\t * @this wp.media.editor\n\t\t\t\t\t */\n\t\t\t\t\treturn this.send.attachment( display, attachment.toJSON() );\n\t\t\t\t}, this ) ).done( function() {\n\t\t\t\t\twp.media.editor.insert( _.toArray( arguments ).join('\\n\\n') );\n\t\t\t\t});\n\t\t\t}, this );\n\n\t\t\tworkflow.state('gallery-edit').on( 'update', function( selection ) {\n\t\t\t\t/**\n\t\t\t\t * @this wp.media.editor\n\t\t\t\t */\n\t\t\t\tthis.insert( wp.media.gallery.shortcode( selection ).string() );\n\t\t\t}, this );\n\n\t\t\tworkflow.state('playlist-edit').on( 'update', function( selection ) {\n\t\t\t\t/**\n\t\t\t\t * @this wp.media.editor\n\t\t\t\t */\n\t\t\t\tthis.insert( wp.media.playlist.shortcode( selection ).string() );\n\t\t\t}, this );\n\n\t\t\tworkflow.state('video-playlist-edit').on( 'update', function( selection ) {\n\t\t\t\t/**\n\t\t\t\t * @this wp.media.editor\n\t\t\t\t */\n\t\t\t\tthis.insert( wp.media.playlist.shortcode( selection ).string() );\n\t\t\t}, this );\n\n\t\t\tworkflow.state('embed').on( 'select', function() {\n\t\t\t\t/**\n\t\t\t\t * @this wp.media.editor\n\t\t\t\t */\n\t\t\t\tvar state = workflow.state(),\n\t\t\t\t\ttype = state.get('type'),\n\t\t\t\t\tembed = state.props.toJSON();\n\n\t\t\t\tembed.url = embed.url || '';\n\n\t\t\t\tif ( 'link' === type ) {\n\t\t\t\t\t_.defaults( embed, {\n\t\t\t\t\t\tlinkText: embed.url,\n\t\t\t\t\t\tlinkUrl: embed.url\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.send.link( embed ).done( function( resp ) {\n\t\t\t\t\t\twp.media.editor.insert( resp );\n\t\t\t\t\t});\n\n\t\t\t\t} else if ( 'image' === type ) {\n\t\t\t\t\t_.defaults( embed, {\n\t\t\t\t\t\ttitle:   embed.url,\n\t\t\t\t\t\tlinkUrl: '',\n\t\t\t\t\t\talign:   'none',\n\t\t\t\t\t\tlink:    'none'\n\t\t\t\t\t});\n\n\t\t\t\t\tif ( 'none' === embed.link ) {\n\t\t\t\t\t\tembed.linkUrl = '';\n\t\t\t\t\t} else if ( 'file' === embed.link ) {\n\t\t\t\t\t\tembed.linkUrl = embed.url;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.insert( wp.media.string.image( embed ) );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\tworkflow.state('featured-image').on( 'select', wp.media.featuredImage.select );\n\t\t\tworkflow.setState( workflow.options.state );\n\t\t\treturn workflow;\n\t\t},\n\t\t/**\n\t\t * Determines the proper current workflow id\n\t\t *\n\t\t * @param {string} [id=''] A slug used to identify the workflow.\n\t\t *\n\t\t * @return {wpActiveEditor|string|tinymce.activeEditor.id}\n\t\t */\n\t\tid: function( id ) {\n\t\t\tif ( id ) {\n\t\t\t\treturn id;\n\t\t\t}\n\n\t\t\t// If an empty `id` is provided, default to `wpActiveEditor`.\n\t\t\tid = window.wpActiveEditor;\n\n\t\t\t// If that doesn't work, fall back to `tinymce.activeEditor.id`.\n\t\t\tif ( ! id && ! _.isUndefined( window.tinymce ) && tinymce.activeEditor ) {\n\t\t\t\tid = tinymce.activeEditor.id;\n\t\t\t}\n\n\t\t\t// Last but not least, fall back to the empty string.\n\t\t\tid = id || '';\n\t\t\treturn id;\n\t\t},\n\t\t/**\n\t\t * Return the workflow specified by id\n\t\t *\n\t\t * @param {string} id A slug used to identify the workflow.\n\t\t *\n\t\t * @this wp.media.editor\n\t\t *\n\t\t * @return {wp.media.view.MediaFrame} A media workflow.\n\t\t */\n\t\tget: function( id ) {\n\t\t\tid = this.id( id );\n\t\t\treturn workflows[ id ];\n\t\t},\n\t\t/**\n\t\t * Remove the workflow represented by id from the workflow cache\n\t\t *\n\t\t * @param {string} id A slug used to identify the workflow.\n\t\t *\n\t\t * @this wp.media.editor\n\t\t */\n\t\tremove: function( id ) {\n\t\t\tid = this.id( id );\n\t\t\tdelete workflows[ id ];\n\t\t},\n\t\t/** @namespace wp.media.editor.send */\n\t\tsend: {\n\t\t\t/**\n\t\t\t * Called when sending an attachment to the editor\n\t\t\t *   from the medial modal.\n\t\t\t *\n\t\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t\t * @return {Promise}\n\t\t\t */\n\t\t\tattachment: function( props, attachment ) {\n\t\t\t\tvar caption = attachment.caption,\n\t\t\t\t\toptions, html;\n\n\t\t\t\t// If captions are disabled, clear the caption.\n\t\t\t\tif ( ! wp.media.view.settings.captions ) {\n\t\t\t\t\tdelete attachment.caption;\n\t\t\t\t}\n\n\t\t\t\tprops = wp.media.string.props( props, attachment );\n\n\t\t\t\toptions = {\n\t\t\t\t\tid:           attachment.id,\n\t\t\t\t\tpost_content: attachment.description,\n\t\t\t\t\tpost_excerpt: caption\n\t\t\t\t};\n\n\t\t\t\tif ( props.linkUrl ) {\n\t\t\t\t\toptions.url = props.linkUrl;\n\t\t\t\t}\n\n\t\t\t\tif ( 'image' === attachment.type ) {\n\t\t\t\t\thtml = wp.media.string.image( props );\n\n\t\t\t\t\t_.each({\n\t\t\t\t\t\talign: 'align',\n\t\t\t\t\t\tsize:  'image-size',\n\t\t\t\t\t\talt:   'image_alt'\n\t\t\t\t\t}, function( option, prop ) {\n\t\t\t\t\t\tif ( props[ prop ] ) {\n\t\t\t\t\t\t\toptions[ option ] = props[ prop ];\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else if ( 'video' === attachment.type ) {\n\t\t\t\t\thtml = wp.media.string.video( props, attachment );\n\t\t\t\t} else if ( 'audio' === attachment.type ) {\n\t\t\t\t\thtml = wp.media.string.audio( props, attachment );\n\t\t\t\t} else {\n\t\t\t\t\thtml = wp.media.string.link( props );\n\t\t\t\t\toptions.post_title = props.title;\n\t\t\t\t}\n\n\t\t\t\treturn wp.media.post( 'send-attachment-to-editor', {\n\t\t\t\t\tnonce:      wp.media.view.settings.nonce.sendToEditor,\n\t\t\t\t\tattachment: options,\n\t\t\t\t\thtml:       html,\n\t\t\t\t\tpost_id:    wp.media.view.settings.post.id\n\t\t\t\t});\n\t\t\t},\n\t\t\t/**\n\t\t\t * Called when 'Insert From URL' source is not an image. Example: YouTube url.\n\t\t\t *\n\t\t\t * @param {Object} embed\n\t\t\t * @return {Promise}\n\t\t\t */\n\t\t\tlink: function( embed ) {\n\t\t\t\treturn wp.media.post( 'send-link-to-editor', {\n\t\t\t\t\tnonce:     wp.media.view.settings.nonce.sendToEditor,\n\t\t\t\t\tsrc:       embed.linkUrl,\n\t\t\t\t\tlink_text: embed.linkText,\n\t\t\t\t\thtml:      wp.media.string.link( embed ),\n\t\t\t\t\tpost_id:   wp.media.view.settings.post.id\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Open a workflow\n\t\t *\n\t\t * @param {string} [id=undefined] Optional. A slug used to identify the workflow.\n\t\t * @param {Object} [options={}]\n\t\t *\n\t\t * @this wp.media.editor\n\t\t *\n\t\t * @return {wp.media.view.MediaFrame}\n\t\t */\n\t\topen: function( id, options ) {\n\t\t\tvar workflow;\n\n\t\t\toptions = options || {};\n\n\t\t\tid = this.id( id );\n\t\t\tthis.activeEditor = id;\n\n\t\t\tworkflow = this.get( id );\n\n\t\t\t// Redo workflow if state has changed.\n\t\t\tif ( ! workflow || ( workflow.options && options.state !== workflow.options.state ) ) {\n\t\t\t\tworkflow = this.add( id, options );\n\t\t\t}\n\n\t\t\twp.media.frame = workflow;\n\n\t\t\treturn workflow.open();\n\t\t},\n\n\t\t/**\n\t\t * Bind click event for .insert-media using event delegation\n\t\t */\n\t\tinit: function() {\n\t\t\t$(document.body)\n\t\t\t\t.on( 'click.add-media-button', '.insert-media', function( event ) {\n\t\t\t\t\tvar elem = $( event.currentTarget ),\n\t\t\t\t\t\teditor = elem.data('editor'),\n\t\t\t\t\t\toptions = {\n\t\t\t\t\t\t\tframe:    'post',\n\t\t\t\t\t\t\tstate:    'insert',\n\t\t\t\t\t\t\ttitle:    wp.media.view.l10n.addMedia,\n\t\t\t\t\t\t\tmultiple: true\n\t\t\t\t\t\t};\n\n\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\tif ( elem.hasClass( 'gallery' ) ) {\n\t\t\t\t\t\toptions.state = 'gallery';\n\t\t\t\t\t\toptions.title = wp.media.view.l10n.createGalleryTitle;\n\t\t\t\t\t}\n\n\t\t\t\t\twp.media.editor.open( editor, options );\n\t\t\t\t});\n\n\t\t\t// Initialize and render the Editor drag-and-drop uploader.\n\t\t\tnew wp.media.view.EditorUploader().render();\n\t\t}\n\t};\n\n\t_.bindAll( wp.media.editor, 'open' );\n\t$( wp.media.editor.init );\n}(jQuery, _));\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/media-models.js",
    "content": "/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 2);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"0Ym0\":\n/***/ (function(module, exports) {\n\nvar $ = Backbone.$,\n\tAttachment;\n\n/**\n * wp.media.model.Attachment\n *\n * @memberOf wp.media.model\n *\n * @class\n * @augments Backbone.Model\n */\nAttachment = Backbone.Model.extend(/** @lends wp.media.model.Attachment.prototype */{\n\t/**\n\t * Triggered when attachment details change\n\t * Overrides Backbone.Model.sync\n\t *\n\t * @param {string} method\n\t * @param {wp.media.model.Attachment} model\n\t * @param {Object} [options={}]\n\t *\n\t * @return {Promise}\n\t */\n\tsync: function( method, model, options ) {\n\t\t// If the attachment does not yet have an `id`, return an instantly\n\t\t// rejected promise. Otherwise, all of our requests will fail.\n\t\tif ( _.isUndefined( this.id ) ) {\n\t\t\treturn $.Deferred().rejectWith( this ).promise();\n\t\t}\n\n\t\t// Overload the `read` request so Attachment.fetch() functions correctly.\n\t\tif ( 'read' === method ) {\n\t\t\toptions = options || {};\n\t\t\toptions.context = this;\n\t\t\toptions.data = _.extend( options.data || {}, {\n\t\t\t\taction: 'get-attachment',\n\t\t\t\tid: this.id\n\t\t\t});\n\t\t\treturn wp.media.ajax( options );\n\n\t\t// Overload the `update` request so properties can be saved.\n\t\t} else if ( 'update' === method ) {\n\t\t\t// If we do not have the necessary nonce, fail immediately.\n\t\t\tif ( ! this.get('nonces') || ! this.get('nonces').update ) {\n\t\t\t\treturn $.Deferred().rejectWith( this ).promise();\n\t\t\t}\n\n\t\t\toptions = options || {};\n\t\t\toptions.context = this;\n\n\t\t\t// Set the action and ID.\n\t\t\toptions.data = _.extend( options.data || {}, {\n\t\t\t\taction:  'save-attachment',\n\t\t\t\tid:      this.id,\n\t\t\t\tnonce:   this.get('nonces').update,\n\t\t\t\tpost_id: wp.media.model.settings.post.id\n\t\t\t});\n\n\t\t\t// Record the values of the changed attributes.\n\t\t\tif ( model.hasChanged() ) {\n\t\t\t\toptions.data.changes = {};\n\n\t\t\t\t_.each( model.changed, function( value, key ) {\n\t\t\t\t\toptions.data.changes[ key ] = this.get( key );\n\t\t\t\t}, this );\n\t\t\t}\n\n\t\t\treturn wp.media.ajax( options );\n\n\t\t// Overload the `delete` request so attachments can be removed.\n\t\t// This will permanently delete an attachment.\n\t\t} else if ( 'delete' === method ) {\n\t\t\toptions = options || {};\n\n\t\t\tif ( ! options.wait ) {\n\t\t\t\tthis.destroyed = true;\n\t\t\t}\n\n\t\t\toptions.context = this;\n\t\t\toptions.data = _.extend( options.data || {}, {\n\t\t\t\taction:   'delete-post',\n\t\t\t\tid:       this.id,\n\t\t\t\t_wpnonce: this.get('nonces')['delete']\n\t\t\t});\n\n\t\t\treturn wp.media.ajax( options ).done( function() {\n\t\t\t\tthis.destroyed = true;\n\t\t\t}).fail( function() {\n\t\t\t\tthis.destroyed = false;\n\t\t\t});\n\n\t\t// Otherwise, fall back to `Backbone.sync()`.\n\t\t} else {\n\t\t\t/**\n\t\t\t * Call `sync` directly on Backbone.Model\n\t\t\t */\n\t\t\treturn Backbone.Model.prototype.sync.apply( this, arguments );\n\t\t}\n\t},\n\t/**\n\t * Convert date strings into Date objects.\n\t *\n\t * @param {Object} resp The raw response object, typically returned by fetch()\n\t * @return {Object} The modified response object, which is the attributes hash\n\t *                  to be set on the model.\n\t */\n\tparse: function( resp ) {\n\t\tif ( ! resp ) {\n\t\t\treturn resp;\n\t\t}\n\n\t\tresp.date = new Date( resp.date );\n\t\tresp.modified = new Date( resp.modified );\n\t\treturn resp;\n\t},\n\t/**\n\t * @param {Object} data The properties to be saved.\n\t * @param {Object} options Sync options. e.g. patch, wait, success, error.\n\t *\n\t * @this Backbone.Model\n\t *\n\t * @return {Promise}\n\t */\n\tsaveCompat: function( data, options ) {\n\t\tvar model = this;\n\n\t\t// If we do not have the necessary nonce, fail immediately.\n\t\tif ( ! this.get('nonces') || ! this.get('nonces').update ) {\n\t\t\treturn $.Deferred().rejectWith( this ).promise();\n\t\t}\n\n\t\treturn wp.media.post( 'save-attachment-compat', _.defaults({\n\t\t\tid:      this.id,\n\t\t\tnonce:   this.get('nonces').update,\n\t\t\tpost_id: wp.media.model.settings.post.id\n\t\t}, data ) ).done( function( resp, status, xhr ) {\n\t\t\tmodel.set( model.parse( resp, xhr ), options );\n\t\t});\n\t}\n},/** @lends wp.media.model.Attachment */{\n\t/**\n\t * Create a new model on the static 'all' attachments collection and return it.\n\t *\n\t * @static\n\t *\n\t * @param {Object} attrs\n\t * @return {wp.media.model.Attachment}\n\t */\n\tcreate: function( attrs ) {\n\t\tvar Attachments = wp.media.model.Attachments;\n\t\treturn Attachments.all.push( attrs );\n\t},\n\t/**\n\t * Create a new model on the static 'all' attachments collection and return it.\n\t *\n\t * If this function has already been called for the id,\n\t * it returns the specified attachment.\n\t *\n\t * @static\n\t * @param {string} id A string used to identify a model.\n\t * @param {Backbone.Model|undefined} attachment\n\t * @return {wp.media.model.Attachment}\n\t */\n\tget: _.memoize( function( id, attachment ) {\n\t\tvar Attachments = wp.media.model.Attachments;\n\t\treturn Attachments.all.push( attachment || { id: id } );\n\t})\n});\n\nmodule.exports = Attachment;\n\n\n/***/ }),\n\n/***/ 2:\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(\"dx5j\");\n\n\n/***/ }),\n\n/***/ \"Io+g\":\n/***/ (function(module, exports) {\n\nvar Attachments = wp.media.model.Attachments,\n\tSelection;\n\n/**\n * wp.media.model.Selection\n *\n * A selection of attachments.\n *\n * @memberOf wp.media.model\n *\n * @class\n * @augments wp.media.model.Attachments\n * @augments Backbone.Collection\n */\nSelection = Attachments.extend(/** @lends wp.media.model.Selection.prototype */{\n\t/**\n\t * Refresh the `single` model whenever the selection changes.\n\t * Binds `single` instead of using the context argument to ensure\n\t * it receives no parameters.\n\t *\n\t * @param {Array} [models=[]] Array of models used to populate the collection.\n\t * @param {Object} [options={}]\n\t */\n\tinitialize: function( models, options ) {\n\t\t/**\n\t\t * call 'initialize' directly on the parent class\n\t\t */\n\t\tAttachments.prototype.initialize.apply( this, arguments );\n\t\tthis.multiple = options && options.multiple;\n\n\t\tthis.on( 'add remove reset', _.bind( this.single, this, false ) );\n\t},\n\n\t/**\n\t * If the workflow does not support multi-select, clear out the selection\n\t * before adding a new attachment to it.\n\t *\n\t * @param {Array} models\n\t * @param {Object} options\n\t * @return {wp.media.model.Attachment[]}\n\t */\n\tadd: function( models, options ) {\n\t\tif ( ! this.multiple ) {\n\t\t\tthis.remove( this.models );\n\t\t}\n\t\t/**\n\t\t * call 'add' directly on the parent class\n\t\t */\n\t\treturn Attachments.prototype.add.call( this, models, options );\n\t},\n\n\t/**\n\t * Fired when toggling (clicking on) an attachment in the modal.\n\t *\n\t * @param {undefined|boolean|wp.media.model.Attachment} model\n\t *\n\t * @fires wp.media.model.Selection#selection:single\n\t * @fires wp.media.model.Selection#selection:unsingle\n\t *\n\t * @return {Backbone.Model}\n\t */\n\tsingle: function( model ) {\n\t\tvar previous = this._single;\n\n\t\t// If a `model` is provided, use it as the single model.\n\t\tif ( model ) {\n\t\t\tthis._single = model;\n\t\t}\n\t\t// If the single model isn't in the selection, remove it.\n\t\tif ( this._single && ! this.get( this._single.cid ) ) {\n\t\t\tdelete this._single;\n\t\t}\n\n\t\tthis._single = this._single || this.last();\n\n\t\t// If single has changed, fire an event.\n\t\tif ( this._single !== previous ) {\n\t\t\tif ( previous ) {\n\t\t\t\tprevious.trigger( 'selection:unsingle', previous, this );\n\n\t\t\t\t// If the model was already removed, trigger the collection\n\t\t\t\t// event manually.\n\t\t\t\tif ( ! this.get( previous.cid ) ) {\n\t\t\t\t\tthis.trigger( 'selection:unsingle', previous, this );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this._single ) {\n\t\t\t\tthis._single.trigger( 'selection:single', this._single, this );\n\t\t\t}\n\t\t}\n\n\t\t// Return the single model, or the last model as a fallback.\n\t\treturn this._single;\n\t}\n});\n\nmodule.exports = Selection;\n\n\n/***/ }),\n\n/***/ \"K0z/\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.model.Attachments\n *\n * A collection of attachments.\n *\n * This collection has no persistence with the server without supplying\n * 'options.props.query = true', which will mirror the collection\n * to an Attachments Query collection - @see wp.media.model.Attachments.mirror().\n *\n * @memberOf wp.media.model\n *\n * @class\n * @augments Backbone.Collection\n *\n * @param {array}  [models]                Models to initialize with the collection.\n * @param {object} [options]               Options hash for the collection.\n * @param {string} [options.props]         Options hash for the initial query properties.\n * @param {string} [options.props.order]   Initial order (ASC or DESC) for the collection.\n * @param {string} [options.props.orderby] Initial attribute key to order the collection by.\n * @param {string} [options.props.query]   Whether the collection is linked to an attachments query.\n * @param {string} [options.observe]\n * @param {string} [options.filters]\n *\n */\nvar Attachments = Backbone.Collection.extend(/** @lends wp.media.model.Attachments.prototype */{\n\t/**\n\t * @type {wp.media.model.Attachment}\n\t */\n\tmodel: wp.media.model.Attachment,\n\t/**\n\t * @param {Array} [models=[]] Array of models used to populate the collection.\n\t * @param {Object} [options={}]\n\t */\n\tinitialize: function( models, options ) {\n\t\toptions = options || {};\n\n\t\tthis.props   = new Backbone.Model();\n\t\tthis.filters = options.filters || {};\n\n\t\t// Bind default `change` events to the `props` model.\n\t\tthis.props.on( 'change', this._changeFilteredProps, this );\n\n\t\tthis.props.on( 'change:order',   this._changeOrder,   this );\n\t\tthis.props.on( 'change:orderby', this._changeOrderby, this );\n\t\tthis.props.on( 'change:query',   this._changeQuery,   this );\n\n\t\tthis.props.set( _.defaults( options.props || {} ) );\n\n\t\tif ( options.observe ) {\n\t\t\tthis.observe( options.observe );\n\t\t}\n\t},\n\t/**\n\t * Sort the collection when the order attribute changes.\n\t *\n\t * @access private\n\t */\n\t_changeOrder: function() {\n\t\tif ( this.comparator ) {\n\t\t\tthis.sort();\n\t\t}\n\t},\n\t/**\n\t * Set the default comparator only when the `orderby` property is set.\n\t *\n\t * @access private\n\t *\n\t * @param {Backbone.Model} model\n\t * @param {string} orderby\n\t */\n\t_changeOrderby: function( model, orderby ) {\n\t\t// If a different comparator is defined, bail.\n\t\tif ( this.comparator && this.comparator !== Attachments.comparator ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( orderby && 'post__in' !== orderby ) {\n\t\t\tthis.comparator = Attachments.comparator;\n\t\t} else {\n\t\t\tdelete this.comparator;\n\t\t}\n\t},\n\t/**\n\t * If the `query` property is set to true, query the server using\n\t * the `props` values, and sync the results to this collection.\n\t *\n\t * @access private\n\t *\n\t * @param {Backbone.Model} model\n\t * @param {boolean} query\n\t */\n\t_changeQuery: function( model, query ) {\n\t\tif ( query ) {\n\t\t\tthis.props.on( 'change', this._requery, this );\n\t\t\tthis._requery();\n\t\t} else {\n\t\t\tthis.props.off( 'change', this._requery, this );\n\t\t}\n\t},\n\t/**\n\t * @access private\n\t *\n\t * @param {Backbone.Model} model\n\t */\n\t_changeFilteredProps: function( model ) {\n\t\t// If this is a query, updating the collection will be handled by\n\t\t// `this._requery()`.\n\t\tif ( this.props.get('query') ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar changed = _.chain( model.changed ).map( function( t, prop ) {\n\t\t\tvar filter = Attachments.filters[ prop ],\n\t\t\t\tterm = model.get( prop );\n\n\t\t\tif ( ! filter ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( term && ! this.filters[ prop ] ) {\n\t\t\t\tthis.filters[ prop ] = filter;\n\t\t\t} else if ( ! term && this.filters[ prop ] === filter ) {\n\t\t\t\tdelete this.filters[ prop ];\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Record the change.\n\t\t\treturn true;\n\t\t}, this ).any().value();\n\n\t\tif ( ! changed ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If no `Attachments` model is provided to source the searches from,\n\t\t// then automatically generate a source from the existing models.\n\t\tif ( ! this._source ) {\n\t\t\tthis._source = new Attachments( this.models );\n\t\t}\n\n\t\tthis.reset( this._source.filter( this.validator, this ) );\n\t},\n\n\tvalidateDestroyed: false,\n\t/**\n\t * Checks whether an attachment is valid.\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @return {boolean}\n\t */\n\tvalidator: function( attachment ) {\n\n\t\tif ( ! this.validateDestroyed && attachment.destroyed ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn _.all( this.filters, function( filter ) {\n\t\t\treturn !! filter.call( this, attachment );\n\t\t}, this );\n\t},\n\t/**\n\t * Add or remove an attachment to the collection depending on its validity.\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @param {Object} options\n\t * @return {wp.media.model.Attachments} Returns itself to allow chaining.\n\t */\n\tvalidate: function( attachment, options ) {\n\t\tvar valid = this.validator( attachment ),\n\t\t\thasAttachment = !! this.get( attachment.cid );\n\n\t\tif ( ! valid && hasAttachment ) {\n\t\t\tthis.remove( attachment, options );\n\t\t} else if ( valid && ! hasAttachment ) {\n\t\t\tthis.add( attachment, options );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t/**\n\t * Add or remove all attachments from another collection depending on each one's validity.\n\t *\n\t * @param {wp.media.model.Attachments} attachments\n\t * @param {Object} [options={}]\n\t *\n\t * @fires wp.media.model.Attachments#reset\n\t *\n\t * @return {wp.media.model.Attachments} Returns itself to allow chaining.\n\t */\n\tvalidateAll: function( attachments, options ) {\n\t\toptions = options || {};\n\n\t\t_.each( attachments.models, function( attachment ) {\n\t\t\tthis.validate( attachment, { silent: true });\n\t\t}, this );\n\n\t\tif ( ! options.silent ) {\n\t\t\tthis.trigger( 'reset', this, options );\n\t\t}\n\t\treturn this;\n\t},\n\t/**\n\t * Start observing another attachments collection change events\n\t * and replicate them on this collection.\n\t *\n\t * @param {wp.media.model.Attachments} The attachments collection to observe.\n\t * @return {wp.media.model.Attachments} Returns itself to allow chaining.\n\t */\n\tobserve: function( attachments ) {\n\t\tthis.observers = this.observers || [];\n\t\tthis.observers.push( attachments );\n\n\t\tattachments.on( 'add change remove', this._validateHandler, this );\n\t\tattachments.on( 'add', this._addToTotalAttachments, this );\n\t\tattachments.on( 'remove', this._removeFromTotalAttachments, this );\n\t\tattachments.on( 'reset', this._validateAllHandler, this );\n\t\tthis.validateAll( attachments );\n\t\treturn this;\n\t},\n\t/**\n\t * Stop replicating collection change events from another attachments collection.\n\t *\n\t * @param {wp.media.model.Attachments} The attachments collection to stop observing.\n\t * @return {wp.media.model.Attachments} Returns itself to allow chaining.\n\t */\n\tunobserve: function( attachments ) {\n\t\tif ( attachments ) {\n\t\t\tattachments.off( null, null, this );\n\t\t\tthis.observers = _.without( this.observers, attachments );\n\n\t\t} else {\n\t\t\t_.each( this.observers, function( attachments ) {\n\t\t\t\tattachments.off( null, null, this );\n\t\t\t}, this );\n\t\t\tdelete this.observers;\n\t\t}\n\n\t\treturn this;\n\t},\n\t/**\n\t * Update total attachment count when items are added to a collection.\n\t *\n\t * @access private\n\t *\n\t * @since 5.8.0\n\t */\n\t_removeFromTotalAttachments: function() {\n\t\tif ( this.mirroring ) {\n\t\t\tthis.mirroring.totalAttachments = this.mirroring.totalAttachments - 1;\n\t\t}\n\t},\n\t/**\n\t * Update total attachment count when items are added to a collection.\n\t *\n\t * @access private\n\t *\n\t * @since 5.8.0\n\t */\n\t_addToTotalAttachments: function() {\n\t\tif ( this.mirroring ) {\n\t\t\tthis.mirroring.totalAttachments = this.mirroring.totalAttachments + 1;\n\t\t}\n\t},\n\t/**\n\t * @access private\n\t *\n\t * @param {wp.media.model.Attachments} attachment\n\t * @param {wp.media.model.Attachments} attachments\n\t * @param {Object} options\n\t *\n\t * @return {wp.media.model.Attachments} Returns itself to allow chaining.\n\t */\n\t_validateHandler: function( attachment, attachments, options ) {\n\t\t// If we're not mirroring this `attachments` collection,\n\t\t// only retain the `silent` option.\n\t\toptions = attachments === this.mirroring ? options : {\n\t\t\tsilent: options && options.silent\n\t\t};\n\n\t\treturn this.validate( attachment, options );\n\t},\n\t/**\n\t * @access private\n\t *\n\t * @param {wp.media.model.Attachments} attachments\n\t * @param {Object} options\n\t * @return {wp.media.model.Attachments} Returns itself to allow chaining.\n\t */\n\t_validateAllHandler: function( attachments, options ) {\n\t\treturn this.validateAll( attachments, options );\n\t},\n\t/**\n\t * Start mirroring another attachments collection, clearing out any models already\n\t * in the collection.\n\t *\n\t * @param {wp.media.model.Attachments} The attachments collection to mirror.\n\t * @return {wp.media.model.Attachments} Returns itself to allow chaining.\n\t */\n\tmirror: function( attachments ) {\n\t\tif ( this.mirroring && this.mirroring === attachments ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.unmirror();\n\t\tthis.mirroring = attachments;\n\n\t\t// Clear the collection silently. A `reset` event will be fired\n\t\t// when `observe()` calls `validateAll()`.\n\t\tthis.reset( [], { silent: true } );\n\t\tthis.observe( attachments );\n\n\t\t// Used for the search results.\n\t\tthis.trigger( 'attachments:received', this );\n\t\treturn this;\n\t},\n\t/**\n\t * Stop mirroring another attachments collection.\n\t */\n\tunmirror: function() {\n\t\tif ( ! this.mirroring ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.unobserve( this.mirroring );\n\t\tdelete this.mirroring;\n\t},\n\t/**\n\t * Retrieve more attachments from the server for the collection.\n\t *\n\t * Only works if the collection is mirroring a Query Attachments collection,\n\t * and forwards to its `more` method. This collection class doesn't have\n\t * server persistence by itself.\n\t *\n\t * @param {Object} options\n\t * @return {Promise}\n\t */\n\tmore: function( options ) {\n\t\tvar deferred = jQuery.Deferred(),\n\t\t\tmirroring = this.mirroring,\n\t\t\tattachments = this;\n\n\t\tif ( ! mirroring || ! mirroring.more ) {\n\t\t\treturn deferred.resolveWith( this ).promise();\n\t\t}\n\t\t/*\n\t\t * If we're mirroring another collection, forward `more` to\n\t\t * the mirrored collection. Account for a race condition by\n\t\t * checking if we're still mirroring that collection when\n\t\t * the request resolves.\n\t\t */\n\t\tmirroring.more( options ).done( function() {\n\t\t\tif ( this === attachments.mirroring ) {\n\t\t\t\tdeferred.resolveWith( this );\n\t\t\t}\n\n\t\t\t// Used for the search results.\n\t\t\tattachments.trigger( 'attachments:received', this );\n\t\t});\n\n\t\treturn deferred.promise();\n\t},\n\t/**\n\t * Whether there are more attachments that haven't been sync'd from the server\n\t * that match the collection's query.\n\t *\n\t * Only works if the collection is mirroring a Query Attachments collection,\n\t * and forwards to its `hasMore` method. This collection class doesn't have\n\t * server persistence by itself.\n\t *\n\t * @return {boolean}\n\t */\n\thasMore: function() {\n\t\treturn this.mirroring ? this.mirroring.hasMore() : false;\n\t},\n\t/**\n\t * Holds the total number of attachments.\n\t *\n\t * @since 5.8.0\n\t */\n\ttotalAttachments: 0,\n\n\t/**\n\t * Gets the total number of attachments.\n\t *\n\t * @since 5.8.0\n\t *\n\t * @return {number} The total number of attachments.\n\t */\n\tgetTotalAttachments: function() {\n\t\treturn this.mirroring ? this.mirroring.totalAttachments : 0;\n\t},\n\n\t/**\n\t * A custom Ajax-response parser.\n\t *\n\t * See trac ticket #24753.\n\t *\n\t * Called automatically by Backbone whenever a collection's models are returned\n\t * by the server, in fetch. The default implementation is a no-op, simply\n\t * passing through the JSON response. We override this to add attributes to\n\t * the collection items.\n\t *\n\t * @param {Object|Array} response The raw response Object/Array.\n\t * @param {Object} xhr\n\t * @return {Array} The array of model attributes to be added to the collection\n\t */\n\tparse: function( response, xhr ) {\n\t\tif ( ! _.isArray( response ) ) {\n\t\t\t  response = [response];\n\t\t}\n\t\treturn _.map( response, function( attrs ) {\n\t\t\tvar id, attachment, newAttributes;\n\n\t\t\tif ( attrs instanceof Backbone.Model ) {\n\t\t\t\tid = attrs.get( 'id' );\n\t\t\t\tattrs = attrs.attributes;\n\t\t\t} else {\n\t\t\t\tid = attrs.id;\n\t\t\t}\n\n\t\t\tattachment = wp.media.model.Attachment.get( id );\n\t\t\tnewAttributes = attachment.parse( attrs, xhr );\n\n\t\t\tif ( ! _.isEqual( attachment.attributes, newAttributes ) ) {\n\t\t\t\tattachment.set( newAttributes );\n\t\t\t}\n\n\t\t\treturn attachment;\n\t\t});\n\t},\n\n\t/**\n\t * If the collection is a query, create and mirror an Attachments Query collection.\n\t *\n\t * @access private\n\t * @param {Boolean} refresh Deprecated, refresh parameter no longer used.\n\t */\n\t_requery: function() {\n\t\tvar props;\n\t\tif ( this.props.get('query') ) {\n\t\t\tprops = this.props.toJSON();\n\t\t\tthis.mirror( wp.media.model.Query.get( props ) );\n\t\t}\n\t},\n\t/**\n\t * If this collection is sorted by `menuOrder`, recalculates and saves\n\t * the menu order to the database.\n\t *\n\t * @return {undefined|Promise}\n\t */\n\tsaveMenuOrder: function() {\n\t\tif ( 'menuOrder' !== this.props.get('orderby') ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/*\n\t\t * Removes any uploading attachments, updates each attachment's\n\t\t * menu order, and returns an object with an { id: menuOrder }\n\t\t * mapping to pass to the request.\n\t\t */\n\t\tvar attachments = this.chain().filter( function( attachment ) {\n\t\t\treturn ! _.isUndefined( attachment.id );\n\t\t}).map( function( attachment, index ) {\n\t\t\t// Indices start at 1.\n\t\t\tindex = index + 1;\n\t\t\tattachment.set( 'menuOrder', index );\n\t\t\treturn [ attachment.id, index ];\n\t\t}).object().value();\n\n\t\tif ( _.isEmpty( attachments ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn wp.media.post( 'save-attachment-order', {\n\t\t\tnonce:       wp.media.model.settings.post.nonce,\n\t\t\tpost_id:     wp.media.model.settings.post.id,\n\t\t\tattachments: attachments\n\t\t});\n\t}\n},/** @lends wp.media.model.Attachments */{\n\t/**\n\t * A function to compare two attachment models in an attachments collection.\n\t *\n\t * Used as the default comparator for instances of wp.media.model.Attachments\n\t * and its subclasses. @see wp.media.model.Attachments._changeOrderby().\n\t *\n\t * @param {Backbone.Model} a\n\t * @param {Backbone.Model} b\n\t * @param {Object} options\n\t * @return {number} -1 if the first model should come before the second,\n\t *                   0 if they are of the same rank and\n\t *                   1 if the first model should come after.\n\t */\n\tcomparator: function( a, b, options ) {\n\t\tvar key   = this.props.get('orderby'),\n\t\t\torder = this.props.get('order') || 'DESC',\n\t\t\tac    = a.cid,\n\t\t\tbc    = b.cid;\n\n\t\ta = a.get( key );\n\t\tb = b.get( key );\n\n\t\tif ( 'date' === key || 'modified' === key ) {\n\t\t\ta = a || new Date();\n\t\t\tb = b || new Date();\n\t\t}\n\n\t\t// If `options.ties` is set, don't enforce the `cid` tiebreaker.\n\t\tif ( options && options.ties ) {\n\t\t\tac = bc = null;\n\t\t}\n\n\t\treturn ( 'DESC' === order ) ? wp.media.compare( a, b, ac, bc ) : wp.media.compare( b, a, bc, ac );\n\t},\n\t/** @namespace wp.media.model.Attachments.filters */\n\tfilters: {\n\t\t/**\n\t\t * @static\n\t\t * Note that this client-side searching is *not* equivalent\n\t\t * to our server-side searching.\n\t\t *\n\t\t * @param {wp.media.model.Attachment} attachment\n\t\t *\n\t\t * @this wp.media.model.Attachments\n\t\t *\n\t\t * @return {Boolean}\n\t\t */\n\t\tsearch: function( attachment ) {\n\t\t\tif ( ! this.props.get('search') ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn _.any(['title','filename','description','caption','name'], function( key ) {\n\t\t\t\tvar value = attachment.get( key );\n\t\t\t\treturn value && -1 !== value.search( this.props.get('search') );\n\t\t\t}, this );\n\t\t},\n\t\t/**\n\t\t * @static\n\t\t * @param {wp.media.model.Attachment} attachment\n\t\t *\n\t\t * @this wp.media.model.Attachments\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\ttype: function( attachment ) {\n\t\t\tvar type = this.props.get('type'), atts = attachment.toJSON(), mime, found;\n\n\t\t\tif ( ! type || ( _.isArray( type ) && ! type.length ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tmime = atts.mime || ( atts.file && atts.file.type ) || '';\n\n\t\t\tif ( _.isArray( type ) ) {\n\t\t\t\tfound = _.find( type, function (t) {\n\t\t\t\t\treturn -1 !== mime.indexOf( t );\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tfound = -1 !== mime.indexOf( type );\n\t\t\t}\n\n\t\t\treturn found;\n\t\t},\n\t\t/**\n\t\t * @static\n\t\t * @param {wp.media.model.Attachment} attachment\n\t\t *\n\t\t * @this wp.media.model.Attachments\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tuploadedTo: function( attachment ) {\n\t\t\tvar uploadedTo = this.props.get('uploadedTo');\n\t\t\tif ( _.isUndefined( uploadedTo ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn uploadedTo === attachment.get('uploadedTo');\n\t\t},\n\t\t/**\n\t\t * @static\n\t\t * @param {wp.media.model.Attachment} attachment\n\t\t *\n\t\t * @this wp.media.model.Attachments\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tstatus: function( attachment ) {\n\t\t\tvar status = this.props.get('status');\n\t\t\tif ( _.isUndefined( status ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn status === attachment.get('status');\n\t\t}\n\t}\n});\n\nmodule.exports = Attachments;\n\n\n/***/ }),\n\n/***/ \"dx5j\":\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * @output wp-includes/js/media-models.js\n */\n\nvar $ = jQuery,\n\tAttachment, Attachments, l10n, media;\n\n/** @namespace wp */\nwindow.wp = window.wp || {};\n\n/**\n * Create and return a media frame.\n *\n * Handles the default media experience.\n *\n * @alias wp.media\n * @memberOf wp\n * @namespace\n *\n * @param {Object} attributes The properties passed to the main media controller.\n * @return {wp.media.view.MediaFrame} A media workflow.\n */\nmedia = wp.media = function( attributes ) {\n\tvar MediaFrame = media.view.MediaFrame,\n\t\tframe;\n\n\tif ( ! MediaFrame ) {\n\t\treturn;\n\t}\n\n\tattributes = _.defaults( attributes || {}, {\n\t\tframe: 'select'\n\t});\n\n\tif ( 'select' === attributes.frame && MediaFrame.Select ) {\n\t\tframe = new MediaFrame.Select( attributes );\n\t} else if ( 'post' === attributes.frame && MediaFrame.Post ) {\n\t\tframe = new MediaFrame.Post( attributes );\n\t} else if ( 'manage' === attributes.frame && MediaFrame.Manage ) {\n\t\tframe = new MediaFrame.Manage( attributes );\n\t} else if ( 'image' === attributes.frame && MediaFrame.ImageDetails ) {\n\t\tframe = new MediaFrame.ImageDetails( attributes );\n\t} else if ( 'audio' === attributes.frame && MediaFrame.AudioDetails ) {\n\t\tframe = new MediaFrame.AudioDetails( attributes );\n\t} else if ( 'video' === attributes.frame && MediaFrame.VideoDetails ) {\n\t\tframe = new MediaFrame.VideoDetails( attributes );\n\t} else if ( 'edit-attachments' === attributes.frame && MediaFrame.EditAttachments ) {\n\t\tframe = new MediaFrame.EditAttachments( attributes );\n\t}\n\n\tdelete attributes.frame;\n\n\tmedia.frame = frame;\n\n\treturn frame;\n};\n\n/** @namespace wp.media.model */\n/** @namespace wp.media.view */\n/** @namespace wp.media.controller */\n/** @namespace wp.media.frames */\n_.extend( media, { model: {}, view: {}, controller: {}, frames: {} });\n\n// Link any localized strings.\nl10n = media.model.l10n = window._wpMediaModelsL10n || {};\n\n// Link any settings.\nmedia.model.settings = l10n.settings || {};\ndelete l10n.settings;\n\nAttachment = media.model.Attachment = __webpack_require__( \"0Ym0\" );\nAttachments = media.model.Attachments = __webpack_require__( \"K0z/\" );\n\nmedia.model.Query = __webpack_require__( \"efdO\" );\nmedia.model.PostImage = __webpack_require__( \"r1z7\" );\nmedia.model.Selection = __webpack_require__( \"Io+g\" );\n\n/**\n * ========================================================================\n * UTILITIES\n * ========================================================================\n */\n\n/**\n * A basic equality comparator for Backbone models.\n *\n * Used to order models within a collection - @see wp.media.model.Attachments.comparator().\n *\n * @param {mixed}  a  The primary parameter to compare.\n * @param {mixed}  b  The primary parameter to compare.\n * @param {string} ac The fallback parameter to compare, a's cid.\n * @param {string} bc The fallback parameter to compare, b's cid.\n * @return {number} -1: a should come before b.\n *                   0: a and b are of the same rank.\n *                   1: b should come before a.\n */\nmedia.compare = function( a, b, ac, bc ) {\n\tif ( _.isEqual( a, b ) ) {\n\t\treturn ac === bc ? 0 : (ac > bc ? -1 : 1);\n\t} else {\n\t\treturn a > b ? -1 : 1;\n\t}\n};\n\n_.extend( media, /** @lends wp.media */{\n\t/**\n\t * media.template( id )\n\t *\n\t * Fetch a JavaScript template for an id, and return a templating function for it.\n\t *\n\t * See wp.template() in `wp-includes/js/wp-util.js`.\n\t *\n\t * @borrows wp.template as template\n\t */\n\ttemplate: wp.template,\n\n\t/**\n\t * media.post( [action], [data] )\n\t *\n\t * Sends a POST request to WordPress.\n\t * See wp.ajax.post() in `wp-includes/js/wp-util.js`.\n\t *\n\t * @borrows wp.ajax.post as post\n\t */\n\tpost: wp.ajax.post,\n\n\t/**\n\t * media.ajax( [action], [options] )\n\t *\n\t * Sends an XHR request to WordPress.\n\t * See wp.ajax.send() in `wp-includes/js/wp-util.js`.\n\t *\n\t * @borrows wp.ajax.send as ajax\n\t */\n\tajax: wp.ajax.send,\n\n\t/**\n\t * Scales a set of dimensions to fit within bounding dimensions.\n\t *\n\t * @param {Object} dimensions\n\t * @return {Object}\n\t */\n\tfit: function( dimensions ) {\n\t\tvar width     = dimensions.width,\n\t\t\theight    = dimensions.height,\n\t\t\tmaxWidth  = dimensions.maxWidth,\n\t\t\tmaxHeight = dimensions.maxHeight,\n\t\t\tconstraint;\n\n\t\t/*\n\t\t * Compare ratios between the two values to determine\n\t\t * which max to constrain by. If a max value doesn't exist,\n\t\t * then the opposite side is the constraint.\n\t\t */\n\t\tif ( ! _.isUndefined( maxWidth ) && ! _.isUndefined( maxHeight ) ) {\n\t\t\tconstraint = ( width / height > maxWidth / maxHeight ) ? 'width' : 'height';\n\t\t} else if ( _.isUndefined( maxHeight ) ) {\n\t\t\tconstraint = 'width';\n\t\t} else if (  _.isUndefined( maxWidth ) && height > maxHeight ) {\n\t\t\tconstraint = 'height';\n\t\t}\n\n\t\t// If the value of the constrained side is larger than the max,\n\t\t// then scale the values. Otherwise return the originals; they fit.\n\t\tif ( 'width' === constraint && width > maxWidth ) {\n\t\t\treturn {\n\t\t\t\twidth : maxWidth,\n\t\t\t\theight: Math.round( maxWidth * height / width )\n\t\t\t};\n\t\t} else if ( 'height' === constraint && height > maxHeight ) {\n\t\t\treturn {\n\t\t\t\twidth : Math.round( maxHeight * width / height ),\n\t\t\t\theight: maxHeight\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\twidth : width,\n\t\t\t\theight: height\n\t\t\t};\n\t\t}\n\t},\n\t/**\n\t * Truncates a string by injecting an ellipsis into the middle.\n\t * Useful for filenames.\n\t *\n\t * @param {string} string\n\t * @param {number} [length=30]\n\t * @param {string} [replacement=&hellip;]\n\t * @return {string} The string, unless length is greater than string.length.\n\t */\n\ttruncate: function( string, length, replacement ) {\n\t\tlength = length || 30;\n\t\treplacement = replacement || '&hellip;';\n\n\t\tif ( string.length <= length ) {\n\t\t\treturn string;\n\t\t}\n\n\t\treturn string.substr( 0, length / 2 ) + replacement + string.substr( -1 * length / 2 );\n\t}\n});\n\n/**\n * ========================================================================\n * MODELS\n * ========================================================================\n */\n/**\n * wp.media.attachment\n *\n * @static\n * @param {string} id A string used to identify a model.\n * @return {wp.media.model.Attachment}\n */\nmedia.attachment = function( id ) {\n\treturn Attachment.get( id );\n};\n\n/**\n * A collection of all attachments that have been fetched from the server.\n *\n * @static\n * @member {wp.media.model.Attachments}\n */\nAttachments.all = new Attachments();\n\n/**\n * wp.media.query\n *\n * Shorthand for creating a new Attachments Query.\n *\n * @param {Object} [props]\n * @return {wp.media.model.Attachments}\n */\nmedia.query = function( props ) {\n\treturn new Attachments( null, {\n\t\tprops: _.extend( _.defaults( props || {}, { orderby: 'date' } ), { query: true } )\n\t});\n};\n\n// Clean up. Prevents mobile browsers caching.\n$(window).on('unload', function(){\n\twindow.wp = null;\n});\n\n\n/***/ }),\n\n/***/ \"efdO\":\n/***/ (function(module, exports) {\n\nvar Attachments = wp.media.model.Attachments,\n\tQuery;\n\n/**\n * wp.media.model.Query\n *\n * A collection of attachments that match the supplied query arguments.\n *\n * Note: Do NOT change this.args after the query has been initialized.\n *       Things will break.\n *\n * @memberOf wp.media.model\n *\n * @class\n * @augments wp.media.model.Attachments\n * @augments Backbone.Collection\n *\n * @param {array}  [models]                      Models to initialize with the collection.\n * @param {object} [options]                     Options hash.\n * @param {object} [options.args]                Attachments query arguments.\n * @param {object} [options.args.posts_per_page]\n */\nQuery = Attachments.extend(/** @lends wp.media.model.Query.prototype */{\n\t/**\n\t * @param {Array}  [models=[]]  Array of initial models to populate the collection.\n\t * @param {Object} [options={}]\n\t */\n\tinitialize: function( models, options ) {\n\t\tvar allowed;\n\n\t\toptions = options || {};\n\t\tAttachments.prototype.initialize.apply( this, arguments );\n\n\t\tthis.args     = options.args;\n\t\tthis._hasMore = true;\n\t\tthis.created  = new Date();\n\n\t\tthis.filters.order = function( attachment ) {\n\t\t\tvar orderby = this.props.get('orderby'),\n\t\t\t\torder = this.props.get('order');\n\n\t\t\tif ( ! this.comparator ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * We want any items that can be placed before the last\n\t\t\t * item in the set. If we add any items after the last\n\t\t\t * item, then we can't guarantee the set is complete.\n\t\t\t */\n\t\t\tif ( this.length ) {\n\t\t\t\treturn 1 !== this.comparator( attachment, this.last(), { ties: true });\n\n\t\t\t/*\n\t\t\t * Handle the case where there are no items yet and\n\t\t\t * we're sorting for recent items. In that case, we want\n\t\t\t * changes that occurred after we created the query.\n\t\t\t */\n\t\t\t} else if ( 'DESC' === order && ( 'date' === orderby || 'modified' === orderby ) ) {\n\t\t\t\treturn attachment.get( orderby ) >= this.created;\n\n\t\t\t// If we're sorting by menu order and we have no items,\n\t\t\t// accept any items that have the default menu order (0).\n\t\t\t} else if ( 'ASC' === order && 'menuOrder' === orderby ) {\n\t\t\t\treturn attachment.get( orderby ) === 0;\n\t\t\t}\n\n\t\t\t// Otherwise, we don't want any items yet.\n\t\t\treturn false;\n\t\t};\n\n\t\t/*\n\t\t * Observe the central `wp.Uploader.queue` collection to watch for\n\t\t * new matches for the query.\n\t\t *\n\t\t * Only observe when a limited number of query args are set. There\n\t\t * are no filters for other properties, so observing will result in\n\t\t * false positives in those queries.\n\t\t */\n\t\tallowed = [ 's', 'order', 'orderby', 'posts_per_page', 'post_mime_type', 'post_parent', 'author' ];\n\t\tif ( wp.Uploader && _( this.args ).chain().keys().difference( allowed ).isEmpty().value() ) {\n\t\t\tthis.observe( wp.Uploader.queue );\n\t\t}\n\t},\n\t/**\n\t * Whether there are more attachments that haven't been sync'd from the server\n\t * that match the collection's query.\n\t *\n\t * @return {boolean}\n\t */\n\thasMore: function() {\n\t\treturn this._hasMore;\n\t},\n\t/**\n\t * Fetch more attachments from the server for the collection.\n\t *\n\t * @param {Object} [options={}]\n\t * @return {Promise}\n\t */\n\tmore: function( options ) {\n\t\tvar query = this;\n\n\t\t// If there is already a request pending, return early with the Deferred object.\n\t\tif ( this._more && 'pending' === this._more.state() ) {\n\t\t\treturn this._more;\n\t\t}\n\n\t\tif ( ! this.hasMore() ) {\n\t\t\treturn jQuery.Deferred().resolveWith( this ).promise();\n\t\t}\n\n\t\toptions = options || {};\n\t\toptions.remove = false;\n\n\t\treturn this._more = this.fetch( options ).done( function( response ) {\n\t\t\tif ( _.isEmpty( response ) || -1 === query.args.posts_per_page || response.length < query.args.posts_per_page ) {\n\t\t\t\tquery._hasMore = false;\n\t\t\t}\n\t\t});\n\t},\n\t/**\n\t * Overrides Backbone.Collection.sync\n\t * Overrides wp.media.model.Attachments.sync\n\t *\n\t * @param {string} method\n\t * @param {Backbone.Model} model\n\t * @param {Object} [options={}]\n\t * @return {Promise}\n\t */\n\tsync: function( method, model, options ) {\n\t\tvar args, fallback;\n\n\t\t// Overload the read method so Attachment.fetch() functions correctly.\n\t\tif ( 'read' === method ) {\n\t\t\toptions = options || {};\n\t\t\toptions.context = this;\n\t\t\toptions.data = _.extend( options.data || {}, {\n\t\t\t\taction:  'query-attachments',\n\t\t\t\tpost_id: wp.media.model.settings.post.id\n\t\t\t});\n\n\t\t\t// Clone the args so manipulation is non-destructive.\n\t\t\targs = _.clone( this.args );\n\n\t\t\t// Determine which page to query.\n\t\t\tif ( -1 !== args.posts_per_page ) {\n\t\t\t\targs.paged = Math.round( this.length / args.posts_per_page ) + 1;\n\t\t\t}\n\n\t\t\toptions.data.query = args;\n\t\t\treturn wp.media.ajax( options );\n\n\t\t// Otherwise, fall back to `Backbone.sync()`.\n\t\t} else {\n\t\t\t/**\n\t\t\t * Call wp.media.model.Attachments.sync or Backbone.sync\n\t\t\t */\n\t\t\tfallback = Attachments.prototype.sync ? Attachments.prototype : Backbone;\n\t\t\treturn fallback.sync.apply( this, arguments );\n\t\t}\n\t}\n}, /** @lends wp.media.model.Query */{\n\t/**\n\t * @readonly\n\t */\n\tdefaultProps: {\n\t\torderby: 'date',\n\t\torder:   'DESC'\n\t},\n\t/**\n\t * @readonly\n\t */\n\tdefaultArgs: {\n\t\tposts_per_page: 80\n\t},\n\t/**\n\t * @readonly\n\t */\n\torderby: {\n\t\tallowed:  [ 'name', 'author', 'date', 'title', 'modified', 'uploadedTo', 'id', 'post__in', 'menuOrder' ],\n\t\t/**\n\t\t * A map of JavaScript orderby values to their WP_Query equivalents.\n\t\t * @type {Object}\n\t\t */\n\t\tvaluemap: {\n\t\t\t'id':         'ID',\n\t\t\t'uploadedTo': 'parent',\n\t\t\t'menuOrder':  'menu_order ID'\n\t\t}\n\t},\n\t/**\n\t * A map of JavaScript query properties to their WP_Query equivalents.\n\t *\n\t * @readonly\n\t */\n\tpropmap: {\n\t\t'search':\t\t's',\n\t\t'type':\t\t\t'post_mime_type',\n\t\t'perPage':\t\t'posts_per_page',\n\t\t'menuOrder':\t'menu_order',\n\t\t'uploadedTo':\t'post_parent',\n\t\t'status':\t\t'post_status',\n\t\t'include':\t\t'post__in',\n\t\t'exclude':\t\t'post__not_in',\n\t\t'author':\t\t'author'\n\t},\n\t/**\n\t * Creates and returns an Attachments Query collection given the properties.\n\t *\n\t * Caches query objects and reuses where possible.\n\t *\n\t * @static\n\t * @method\n\t *\n\t * @param {object} [props]\n\t * @param {Object} [props.order]\n\t * @param {Object} [props.orderby]\n\t * @param {Object} [props.include]\n\t * @param {Object} [props.exclude]\n\t * @param {Object} [props.s]\n\t * @param {Object} [props.post_mime_type]\n\t * @param {Object} [props.posts_per_page]\n\t * @param {Object} [props.menu_order]\n\t * @param {Object} [props.post_parent]\n\t * @param {Object} [props.post_status]\n\t * @param {Object} [props.author]\n\t * @param {Object} [options]\n\t *\n\t * @return {wp.media.model.Query} A new Attachments Query collection.\n\t */\n\tget: (function(){\n\t\t/**\n\t\t * @static\n\t\t * @type Array\n\t\t */\n\t\tvar queries = [];\n\n\t\t/**\n\t\t * @return {Query}\n\t\t */\n\t\treturn function( props, options ) {\n\t\t\tvar args     = {},\n\t\t\t\torderby  = Query.orderby,\n\t\t\t\tdefaults = Query.defaultProps,\n\t\t\t\tquery;\n\n\t\t\t// Remove the `query` property. This isn't linked to a query,\n\t\t\t// this *is* the query.\n\t\t\tdelete props.query;\n\n\t\t\t// Fill default args.\n\t\t\t_.defaults( props, defaults );\n\n\t\t\t// Normalize the order.\n\t\t\tprops.order = props.order.toUpperCase();\n\t\t\tif ( 'DESC' !== props.order && 'ASC' !== props.order ) {\n\t\t\t\tprops.order = defaults.order.toUpperCase();\n\t\t\t}\n\n\t\t\t// Ensure we have a valid orderby value.\n\t\t\tif ( ! _.contains( orderby.allowed, props.orderby ) ) {\n\t\t\t\tprops.orderby = defaults.orderby;\n\t\t\t}\n\n\t\t\t_.each( [ 'include', 'exclude' ], function( prop ) {\n\t\t\t\tif ( props[ prop ] && ! _.isArray( props[ prop ] ) ) {\n\t\t\t\t\tprops[ prop ] = [ props[ prop ] ];\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Generate the query `args` object.\n\t\t\t// Correct any differing property names.\n\t\t\t_.each( props, function( value, prop ) {\n\t\t\t\tif ( _.isNull( value ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\targs[ Query.propmap[ prop ] || prop ] = value;\n\t\t\t});\n\n\t\t\t// Fill any other default query args.\n\t\t\t_.defaults( args, Query.defaultArgs );\n\n\t\t\t// `props.orderby` does not always map directly to `args.orderby`.\n\t\t\t// Substitute exceptions specified in orderby.keymap.\n\t\t\targs.orderby = orderby.valuemap[ props.orderby ] || props.orderby;\n\n\t\t\tqueries = [];\n\n\t\t\t// Otherwise, create a new query and add it to the cache.\n\t\t\tif ( ! query ) {\n\t\t\t\tquery = new Query( [], _.extend( options || {}, {\n\t\t\t\t\tprops: props,\n\t\t\t\t\targs:  args\n\t\t\t\t} ) );\n\t\t\t\tqueries.push( query );\n\t\t\t}\n\n\t\t\treturn query;\n\t\t};\n\t}())\n});\n\nmodule.exports = Query;\n\n\n/***/ }),\n\n/***/ \"r1z7\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.model.PostImage\n *\n * An instance of an image that's been embedded into a post.\n *\n * Used in the embedded image attachment display settings modal - @see wp.media.view.MediaFrame.ImageDetails.\n *\n * @memberOf wp.media.model\n *\n * @class\n * @augments Backbone.Model\n *\n * @param {int} [attributes]               Initial model attributes.\n * @param {int} [attributes.attachment_id] ID of the attachment.\n **/\nvar PostImage = Backbone.Model.extend(/** @lends wp.media.model.PostImage.prototype */{\n\n\tinitialize: function( attributes ) {\n\t\tvar Attachment = wp.media.model.Attachment;\n\t\tthis.attachment = false;\n\n\t\tif ( attributes.attachment_id ) {\n\t\t\tthis.attachment = Attachment.get( attributes.attachment_id );\n\t\t\tif ( this.attachment.get( 'url' ) ) {\n\t\t\t\tthis.dfd = jQuery.Deferred();\n\t\t\t\tthis.dfd.resolve();\n\t\t\t} else {\n\t\t\t\tthis.dfd = this.attachment.fetch();\n\t\t\t}\n\t\t\tthis.bindAttachmentListeners();\n\t\t}\n\n\t\t// Keep URL in sync with changes to the type of link.\n\t\tthis.on( 'change:link', this.updateLinkUrl, this );\n\t\tthis.on( 'change:size', this.updateSize, this );\n\n\t\tthis.setLinkTypeFromUrl();\n\t\tthis.setAspectRatio();\n\n\t\tthis.set( 'originalUrl', attributes.url );\n\t},\n\n\tbindAttachmentListeners: function() {\n\t\tthis.listenTo( this.attachment, 'sync', this.setLinkTypeFromUrl );\n\t\tthis.listenTo( this.attachment, 'sync', this.setAspectRatio );\n\t\tthis.listenTo( this.attachment, 'change', this.updateSize );\n\t},\n\n\tchangeAttachment: function( attachment, props ) {\n\t\tthis.stopListening( this.attachment );\n\t\tthis.attachment = attachment;\n\t\tthis.bindAttachmentListeners();\n\n\t\tthis.set( 'attachment_id', this.attachment.get( 'id' ) );\n\t\tthis.set( 'caption', this.attachment.get( 'caption' ) );\n\t\tthis.set( 'alt', this.attachment.get( 'alt' ) );\n\t\tthis.set( 'size', props.get( 'size' ) );\n\t\tthis.set( 'align', props.get( 'align' ) );\n\t\tthis.set( 'link', props.get( 'link' ) );\n\t\tthis.updateLinkUrl();\n\t\tthis.updateSize();\n\t},\n\n\tsetLinkTypeFromUrl: function() {\n\t\tvar linkUrl = this.get( 'linkUrl' ),\n\t\t\ttype;\n\n\t\tif ( ! linkUrl ) {\n\t\t\tthis.set( 'link', 'none' );\n\t\t\treturn;\n\t\t}\n\n\t\t// Default to custom if there is a linkUrl.\n\t\ttype = 'custom';\n\n\t\tif ( this.attachment ) {\n\t\t\tif ( this.attachment.get( 'url' ) === linkUrl ) {\n\t\t\t\ttype = 'file';\n\t\t\t} else if ( this.attachment.get( 'link' ) === linkUrl ) {\n\t\t\t\ttype = 'post';\n\t\t\t}\n\t\t} else {\n\t\t\tif ( this.get( 'url' ) === linkUrl ) {\n\t\t\t\ttype = 'file';\n\t\t\t}\n\t\t}\n\n\t\tthis.set( 'link', type );\n\t},\n\n\tupdateLinkUrl: function() {\n\t\tvar link = this.get( 'link' ),\n\t\t\turl;\n\n\t\tswitch( link ) {\n\t\t\tcase 'file':\n\t\t\t\tif ( this.attachment ) {\n\t\t\t\t\turl = this.attachment.get( 'url' );\n\t\t\t\t} else {\n\t\t\t\t\turl = this.get( 'url' );\n\t\t\t\t}\n\t\t\t\tthis.set( 'linkUrl', url );\n\t\t\t\tbreak;\n\t\t\tcase 'post':\n\t\t\t\tthis.set( 'linkUrl', this.attachment.get( 'link' ) );\n\t\t\t\tbreak;\n\t\t\tcase 'none':\n\t\t\t\tthis.set( 'linkUrl', '' );\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\tupdateSize: function() {\n\t\tvar size;\n\n\t\tif ( ! this.attachment ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.get( 'size' ) === 'custom' ) {\n\t\t\tthis.set( 'width', this.get( 'customWidth' ) );\n\t\t\tthis.set( 'height', this.get( 'customHeight' ) );\n\t\t\tthis.set( 'url', this.get( 'originalUrl' ) );\n\t\t\treturn;\n\t\t}\n\n\t\tsize = this.attachment.get( 'sizes' )[ this.get( 'size' ) ];\n\n\t\tif ( ! size ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.set( 'url', size.url );\n\t\tthis.set( 'width', size.width );\n\t\tthis.set( 'height', size.height );\n\t},\n\n\tsetAspectRatio: function() {\n\t\tvar full;\n\n\t\tif ( this.attachment && this.attachment.get( 'sizes' ) ) {\n\t\t\tfull = this.attachment.get( 'sizes' ).full;\n\n\t\t\tif ( full ) {\n\t\t\t\tthis.set( 'aspectRatio', full.width / full.height );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.set( 'aspectRatio', this.get( 'customWidth' ) / this.get( 'customHeight' ) );\n\t}\n});\n\nmodule.exports = PostImage;\n\n\n/***/ })\n\n/******/ });"
  },
  {
    "path": "配套插件/BsCore/assets/js/media-views.js",
    "content": "/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 3);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"+B8m\":\n/***/ (function(module, exports) {\n\nvar AttachmentDisplay = wp.media.view.Settings.AttachmentDisplay,\n\tEmbedImage;\n\n/**\n * wp.media.view.EmbedImage\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.view.Settings.AttachmentDisplay\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nEmbedImage = AttachmentDisplay.extend(/** @lends wp.media.view.EmbedImage.prototype */{\n\tclassName: 'embed-media-settings',\n\ttemplate:  wp.template('embed-image-settings'),\n\n\tinitialize: function() {\n\t\t/**\n\t\t * Call `initialize` directly on parent class with passed arguments\n\t\t */\n\t\tAttachmentDisplay.prototype.initialize.apply( this, arguments );\n\t\tthis.listenTo( this.model, 'change:url', this.updateImage );\n\t},\n\n\tupdateImage: function() {\n\t\tthis.$('img').attr( 'src', this.model.get('url') );\n\t}\n});\n\nmodule.exports = EmbedImage;\n\n\n/***/ }),\n\n/***/ \"+mQJ\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\t$ = jQuery,\n\tl10n = wp.media.view.l10n,\n\tEmbedUrl;\n\n/**\n * wp.media.view.EmbedUrl\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nEmbedUrl = View.extend(/** @lends wp.media.view.EmbedUrl.prototype */{\n\ttagName:   'span',\n\tclassName: 'embed-url',\n\n\tevents: {\n\t\t'input': 'url'\n\t},\n\n\tinitialize: function() {\n\t\tthis.$input = $( '<input id=\"embed-url-field\" type=\"url\" />' )\n\t\t\t.attr( 'aria-label', l10n.insertFromUrlTitle )\n\t\t\t.val( this.model.get('url') );\n\t\tthis.input = this.$input[0];\n\n\t\tthis.spinner = $('<span class=\"spinner\" />')[0];\n\t\tthis.$el.append([ this.input, this.spinner ]);\n\n\t\tthis.listenTo( this.model, 'change:url', this.render );\n\n\t\tif ( this.model.get( 'url' ) ) {\n\t\t\t_.delay( _.bind( function () {\n\t\t\t\tthis.model.trigger( 'change:url' );\n\t\t\t}, this ), 500 );\n\t\t}\n\t},\n\t/**\n\t * @return {wp.media.view.EmbedUrl} Returns itself to allow chaining.\n\t */\n\trender: function() {\n\t\tvar $input = this.$input;\n\n\t\tif ( $input.is(':focus') ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.input.value = this.model.get('url') || 'http://';\n\t\t/**\n\t\t * Call `render` directly on parent class with passed arguments\n\t\t */\n\t\tView.prototype.render.apply( this, arguments );\n\t\treturn this;\n\t},\n\n\turl: function( event ) {\n\t\tvar url = event.target.value || '';\n\t\tthis.model.set( 'url', url.trim() );\n\t}\n});\n\nmodule.exports = EmbedUrl;\n\n\n/***/ }),\n\n/***/ \"04Ix\":\n/***/ (function(module, exports) {\n\nvar _n = wp.i18n._n,\n\tsprintf = wp.i18n.sprintf,\n\tSelection;\n\n/**\n * wp.media.view.Selection\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nSelection = wp.media.View.extend(/** @lends wp.media.view.Selection.prototype */{\n\ttagName:   'div',\n\tclassName: 'media-selection',\n\ttemplate:  wp.template('media-selection'),\n\n\tevents: {\n\t\t'click .edit-selection':  'edit',\n\t\t'click .clear-selection': 'clear'\n\t},\n\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\teditable:  false,\n\t\t\tclearable: true\n\t\t});\n\n\t\t/**\n\t\t * @member {wp.media.view.Attachments.Selection}\n\t\t */\n\t\tthis.attachments = new wp.media.view.Attachments.Selection({\n\t\t\tcontroller: this.controller,\n\t\t\tcollection: this.collection,\n\t\t\tselection:  this.collection,\n\t\t\tmodel:      new Backbone.Model()\n\t\t});\n\n\t\tthis.views.set( '.selection-view', this.attachments );\n\t\tthis.collection.on( 'add remove reset', this.refresh, this );\n\t\tthis.controller.on( 'content:activate', this.refresh, this );\n\t},\n\n\tready: function() {\n\t\tthis.refresh();\n\t},\n\n\trefresh: function() {\n\t\t// If the selection hasn't been rendered, bail.\n\t\tif ( ! this.$el.children().length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar collection = this.collection,\n\t\t\tediting = 'edit-selection' === this.controller.content.mode();\n\n\t\t// If nothing is selected, display nothing.\n\t\tthis.$el.toggleClass( 'empty', ! collection.length );\n\t\tthis.$el.toggleClass( 'one', 1 === collection.length );\n\t\tthis.$el.toggleClass( 'editing', editing );\n\n\t\tthis.$( '.count' ).text(\n\t\t\t/* translators: %s: Number of selected media attachments. */\n\t\t\tsprintf( _n( '%s item selected', '%s items selected', collection.length ), collection.length )\n\t\t);\n\t},\n\n\tedit: function( event ) {\n\t\tevent.preventDefault();\n\t\tif ( this.options.editable ) {\n\t\t\tthis.options.editable.call( this, this.collection );\n\t\t}\n\t},\n\n\tclear: function( event ) {\n\t\tevent.preventDefault();\n\t\tthis.collection.reset();\n\n\t\t// Move focus to the modal.\n\t\tthis.controller.modal.focusManager.focus();\n\t}\n});\n\nmodule.exports = Selection;\n\n\n/***/ }),\n\n/***/ \"1S4+\":\n/***/ (function(module, exports) {\n\nvar $ = jQuery,\n\tAttachmentFilters;\n\n/**\n * wp.media.view.AttachmentFilters\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nAttachmentFilters = wp.media.View.extend(/** @lends wp.media.view.AttachmentFilters.prototype */{\n\ttagName:   'select',\n\tclassName: 'attachment-filters',\n\tid:        'media-attachment-filters',\n\n\tevents: {\n\t\tchange: 'change'\n\t},\n\n\tkeys: [],\n\n\tinitialize: function() {\n\t\tthis.createFilters();\n\t\t_.extend( this.filters, this.options.filters );\n\n\t\t// Build `<option>` elements.\n\t\tthis.$el.html( _.chain( this.filters ).map( function( filter, value ) {\n\t\t\treturn {\n\t\t\t\tel: $( '<option></option>' ).val( value ).html( filter.text )[0],\n\t\t\t\tpriority: filter.priority || 50\n\t\t\t};\n\t\t}, this ).sortBy('priority').pluck('el').value() );\n\n\t\tthis.listenTo( this.model, 'change', this.select );\n\t\tthis.select();\n\t},\n\n\t/**\n\t * @abstract\n\t */\n\tcreateFilters: function() {\n\t\tthis.filters = {};\n\t},\n\n\t/**\n\t * When the selected filter changes, update the Attachment Query properties to match.\n\t */\n\tchange: function() {\n\t\tvar filter = this.filters[ this.el.value ];\n\t\tif ( filter ) {\n\t\t\tthis.model.set( filter.props );\n\t\t}\n\t},\n\n\tselect: function() {\n\t\tvar model = this.model,\n\t\t\tvalue = 'all',\n\t\t\tprops = model.toJSON();\n\n\t\t_.find( this.filters, function( filter, id ) {\n\t\t\tvar equal = _.all( filter.props, function( prop, key ) {\n\t\t\t\treturn prop === ( _.isUndefined( props[ key ] ) ? null : props[ key ] );\n\t\t\t});\n\n\t\t\tif ( equal ) {\n\t\t\t\treturn value = id;\n\t\t\t}\n\t\t});\n\n\t\tthis.$el.val( value );\n\t}\n});\n\nmodule.exports = AttachmentFilters;\n\n\n/***/ }),\n\n/***/ \"2AvB\":\n/***/ (function(module, exports) {\n\nvar Settings = wp.media.view.Settings,\n\tAttachmentDisplay;\n\n/**\n * wp.media.view.Settings.AttachmentDisplay\n *\n * @memberOf wp.media.view.Settings\n *\n * @class\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nAttachmentDisplay = Settings.extend(/** @lends wp.media.view.Settings.AttachmentDisplay.prototype */{\n\tclassName: 'attachment-display-settings',\n\ttemplate:  wp.template('attachment-display-settings'),\n\n\tinitialize: function() {\n\t\tvar attachment = this.options.attachment;\n\n\t\t_.defaults( this.options, {\n\t\t\tuserSettings: false\n\t\t});\n\t\t// Call 'initialize' directly on the parent class.\n\t\tSettings.prototype.initialize.apply( this, arguments );\n\t\tthis.listenTo( this.model, 'change:link', this.updateLinkTo );\n\n\t\tif ( attachment ) {\n\t\t\tattachment.on( 'change:uploading', this.render, this );\n\t\t}\n\t},\n\n\tdispose: function() {\n\t\tvar attachment = this.options.attachment;\n\t\tif ( attachment ) {\n\t\t\tattachment.off( null, null, this );\n\t\t}\n\t\t/**\n\t\t * call 'dispose' directly on the parent class\n\t\t */\n\t\tSettings.prototype.dispose.apply( this, arguments );\n\t},\n\t/**\n\t * @return {wp.media.view.AttachmentDisplay} Returns itself to allow chaining.\n\t */\n\trender: function() {\n\t\tvar attachment = this.options.attachment;\n\t\tif ( attachment ) {\n\t\t\t_.extend( this.options, {\n\t\t\t\tsizes: attachment.get('sizes'),\n\t\t\t\ttype:  attachment.get('type')\n\t\t\t});\n\t\t}\n\t\t/**\n\t\t * call 'render' directly on the parent class\n\t\t */\n\t\tSettings.prototype.render.call( this );\n\t\tthis.updateLinkTo();\n\t\treturn this;\n\t},\n\n\tupdateLinkTo: function() {\n\t\tvar linkTo = this.model.get('link'),\n\t\t\t$input = this.$('.link-to-custom'),\n\t\t\tattachment = this.options.attachment;\n\n\t\tif ( 'none' === linkTo || 'embed' === linkTo || ( ! attachment && 'custom' !== linkTo ) ) {\n\t\t\t$input.closest( '.setting' ).addClass( 'hidden' );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( attachment ) {\n\t\t\tif ( 'post' === linkTo ) {\n\t\t\t\t$input.val( attachment.get('link') );\n\t\t\t} else if ( 'file' === linkTo ) {\n\t\t\t\t$input.val( attachment.get('url') );\n\t\t\t} else if ( ! this.model.get('linkUrl') ) {\n\t\t\t\t$input.val('http://');\n\t\t\t}\n\n\t\t\t$input.prop( 'readonly', 'custom' !== linkTo );\n\t\t}\n\n\t\t$input.closest( '.setting' ).removeClass( 'hidden' );\n\t\tif ( $input.length ) {\n\t\t\t$input[0].scrollIntoView();\n\t\t}\n\t}\n});\n\nmodule.exports = AttachmentDisplay;\n\n\n/***/ }),\n\n/***/ \"2NU8\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\tToolbar;\n\n/**\n * wp.media.view.Toolbar\n *\n * A toolbar which consists of a primary and a secondary section. Each sections\n * can be filled with views.\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nToolbar = View.extend(/** @lends wp.media.view.Toolbar.prototype */{\n\ttagName:   'div',\n\tclassName: 'media-toolbar',\n\n\tinitialize: function() {\n\t\tvar state = this.controller.state(),\n\t\t\tselection = this.selection = state.get('selection'),\n\t\t\tlibrary = this.library = state.get('library');\n\n\t\tthis._views = {};\n\n\t\t// The toolbar is composed of two `PriorityList` views.\n\t\tthis.primary   = new wp.media.view.PriorityList();\n\t\tthis.secondary = new wp.media.view.PriorityList();\n\t\tthis.primary.$el.addClass('media-toolbar-primary search-form');\n\t\tthis.secondary.$el.addClass('media-toolbar-secondary');\n\n\t\tthis.views.set([ this.secondary, this.primary ]);\n\n\t\tif ( this.options.items ) {\n\t\t\tthis.set( this.options.items, { silent: true });\n\t\t}\n\n\t\tif ( ! this.options.silent ) {\n\t\t\tthis.render();\n\t\t}\n\n\t\tif ( selection ) {\n\t\t\tselection.on( 'add remove reset', this.refresh, this );\n\t\t}\n\n\t\tif ( library ) {\n\t\t\tlibrary.on( 'add remove reset', this.refresh, this );\n\t\t}\n\t},\n\t/**\n\t * @return {wp.media.view.Toolbar} Returns itsef to allow chaining\n\t */\n\tdispose: function() {\n\t\tif ( this.selection ) {\n\t\t\tthis.selection.off( null, null, this );\n\t\t}\n\n\t\tif ( this.library ) {\n\t\t\tthis.library.off( null, null, this );\n\t\t}\n\t\t/**\n\t\t * call 'dispose' directly on the parent class\n\t\t */\n\t\treturn View.prototype.dispose.apply( this, arguments );\n\t},\n\n\tready: function() {\n\t\tthis.refresh();\n\t},\n\n\t/**\n\t * @param {string} id\n\t * @param {Backbone.View|Object} view\n\t * @param {Object} [options={}]\n\t * @return {wp.media.view.Toolbar} Returns itself to allow chaining.\n\t */\n\tset: function( id, view, options ) {\n\t\tvar list;\n\t\toptions = options || {};\n\n\t\t// Accept an object with an `id` : `view` mapping.\n\t\tif ( _.isObject( id ) ) {\n\t\t\t_.each( id, function( view, id ) {\n\t\t\t\tthis.set( id, view, { silent: true });\n\t\t\t}, this );\n\n\t\t} else {\n\t\t\tif ( ! ( view instanceof Backbone.View ) ) {\n\t\t\t\tview.classes = [ 'media-button-' + id ].concat( view.classes || [] );\n\t\t\t\tview = new wp.media.view.Button( view ).render();\n\t\t\t}\n\n\t\t\tview.controller = view.controller || this.controller;\n\n\t\t\tthis._views[ id ] = view;\n\n\t\t\tlist = view.options.priority < 0 ? 'secondary' : 'primary';\n\t\t\tthis[ list ].set( id, view, options );\n\t\t}\n\n\t\tif ( ! options.silent ) {\n\t\t\tthis.refresh();\n\t\t}\n\n\t\treturn this;\n\t},\n\t/**\n\t * @param {string} id\n\t * @return {wp.media.view.Button}\n\t */\n\tget: function( id ) {\n\t\treturn this._views[ id ];\n\t},\n\t/**\n\t * @param {string} id\n\t * @param {Object} options\n\t * @return {wp.media.view.Toolbar} Returns itself to allow chaining.\n\t */\n\tunset: function( id, options ) {\n\t\tdelete this._views[ id ];\n\t\tthis.primary.unset( id, options );\n\t\tthis.secondary.unset( id, options );\n\n\t\tif ( ! options || ! options.silent ) {\n\t\t\tthis.refresh();\n\t\t}\n\t\treturn this;\n\t},\n\n\trefresh: function() {\n\t\tvar state = this.controller.state(),\n\t\t\tlibrary = state.get('library'),\n\t\t\tselection = state.get('selection');\n\n\t\t_.each( this._views, function( button ) {\n\t\t\tif ( ! button.model || ! button.options || ! button.options.requires ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar requires = button.options.requires,\n\t\t\t\tdisabled = false;\n\n\t\t\t// Prevent insertion of attachments if any of them are still uploading.\n\t\t\tif ( selection && selection.models ) {\n\t\t\t\tdisabled = _.some( selection.models, function( attachment ) {\n\t\t\t\t\treturn attachment.get('uploading') === true;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( requires.selection && selection && ! selection.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t} else if ( requires.library && library && ! library.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t\tbutton.model.set( 'disabled', disabled );\n\t\t});\n\t}\n});\n\nmodule.exports = Toolbar;\n\n\n/***/ }),\n\n/***/ \"2jku\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Attachment.Library\n *\n * @memberOf wp.media.view.Attachment\n *\n * @class\n * @augments wp.media.view.Attachment\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Library = wp.media.view.Attachment.extend(/** @lends wp.media.view.Attachment.Library.prototype */{\n\tbuttons: {\n\t\tcheck: true\n\t}\n});\n\nmodule.exports = Library;\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(\"tg/Y\");\n\n\n/***/ }),\n\n/***/ \"3nJM\":\n/***/ (function(module, exports) {\n\nvar $ = jQuery;\n\n/**\n * wp.media.view.FocusManager\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar FocusManager = wp.media.View.extend(/** @lends wp.media.view.FocusManager.prototype */{\n\n\tevents: {\n\t\t'keydown': 'focusManagementMode'\n\t},\n\n\t/**\n\t * Initializes the Focus Manager.\n\t *\n\t * @param {Object} options The Focus Manager options.\n\t *\n\t * @since 5.3.0\n\t *\n\t * @return {void}\n\t */\n\tinitialize: function( options ) {\n\t\tthis.mode                    = options.mode || 'constrainTabbing';\n\t\tthis.tabsAutomaticActivation = options.tabsAutomaticActivation || false;\n\t},\n\n \t/**\n\t * Determines which focus management mode to use.\n\t *\n\t * @since 5.3.0\n\t *\n\t * @param {Object} event jQuery event object.\n\t *\n\t * @return {void}\n\t */\n\tfocusManagementMode: function( event ) {\n\t\tif ( this.mode === 'constrainTabbing' ) {\n\t\t\tthis.constrainTabbing( event );\n\t\t}\n\n\t\tif ( this.mode === 'tabsNavigation' ) {\n\t\t\tthis.tabsNavigation( event );\n\t\t}\n\t},\n\n\t/**\n\t * Gets all the tabbable elements.\n\t *\n\t * @since 5.3.0\n\t *\n\t * @return {Object} A jQuery collection of tabbable elements.\n\t */\n\tgetTabbables: function() {\n\t\t// Skip the file input added by Plupload.\n\t\treturn this.$( ':tabbable' ).not( '.moxie-shim input[type=\"file\"]' );\n\t},\n\n\t/**\n\t * Moves focus to the modal dialog.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {void}\n\t */\n\tfocus: function() {\n\t\tthis.$( '.media-modal' ).trigger( 'focus' );\n\t},\n\n\t/**\n\t * Constrains navigation with the Tab key within the media view element.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param {Object} event A keydown jQuery event.\n\t *\n\t * @return {void}\n\t */\n\tconstrainTabbing: function( event ) {\n\t\tvar tabbables;\n\n\t\t// Look for the tab key.\n\t\tif ( 9 !== event.keyCode ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttabbables = this.getTabbables();\n\n\t\t// Keep tab focus within media modal while it's open.\n\t\tif ( tabbables.last()[0] === event.target && ! event.shiftKey ) {\n\t\t\ttabbables.first().focus();\n\t\t\treturn false;\n\t\t} else if ( tabbables.first()[0] === event.target && event.shiftKey ) {\n\t\t\ttabbables.last().focus();\n\t\t\treturn false;\n\t\t}\n\t},\n\n\t/**\n\t * Hides from assistive technologies all the body children.\n\t *\n\t * Sets an `aria-hidden=\"true\"` attribute on all the body children except\n\t * the provided element and other elements that should not be hidden.\n\t *\n\t * The reason why we use `aria-hidden` is that `aria-modal=\"true\"` is buggy\n\t * in Safari 11.1 and support is spotty in other browsers. Also, `aria-modal=\"true\"`\n\t * prevents the `wp.a11y.speak()` ARIA live regions to work as they're outside\n\t * of the modal dialog and get hidden from assistive technologies.\n\t *\n\t * @since 5.2.3\n\t *\n\t * @param {Object} visibleElement The jQuery object representing the element that should not be hidden.\n\t *\n\t * @return {void}\n\t */\n\tsetAriaHiddenOnBodyChildren: function( visibleElement ) {\n\t\tvar bodyChildren,\n\t\t\tself = this;\n\n\t\tif ( this.isBodyAriaHidden ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get all the body children.\n\t\tbodyChildren = document.body.children;\n\n\t\t// Loop through the body children and hide the ones that should be hidden.\n\t\t_.each( bodyChildren, function( element ) {\n\t\t\t// Don't hide the modal element.\n\t\t\tif ( element === visibleElement[0] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Determine the body children to hide.\n\t\t\tif ( self.elementShouldBeHidden( element ) ) {\n\t\t\t\telement.setAttribute( 'aria-hidden', 'true' );\n\t\t\t\t// Store the hidden elements.\n\t\t\t\tself.ariaHiddenElements.push( element );\n\t\t\t}\n\t\t} );\n\n\t\tthis.isBodyAriaHidden = true;\n\t},\n\n\t/**\n\t * Unhides from assistive technologies all the body children.\n\t *\n\t * Makes visible again to assistive technologies all the body children\n\t * previously hidden and stored in this.ariaHiddenElements.\n\t *\n\t * @since 5.2.3\n\t *\n\t * @return {void}\n\t */\n\tremoveAriaHiddenFromBodyChildren: function() {\n\t\t_.each( this.ariaHiddenElements, function( element ) {\n\t\t\telement.removeAttribute( 'aria-hidden' );\n\t\t} );\n\n\t\tthis.ariaHiddenElements = [];\n\t\tthis.isBodyAriaHidden   = false;\n\t},\n\n\t/**\n\t * Determines if the passed element should not be hidden from assistive technologies.\n\t *\n\t * @since 5.2.3\n\t *\n\t * @param {Object} element The DOM element that should be checked.\n\t *\n\t * @return {boolean} Whether the element should not be hidden from assistive technologies.\n\t */\n\telementShouldBeHidden: function( element ) {\n\t\tvar role = element.getAttribute( 'role' ),\n\t\t\tliveRegionsRoles = [ 'alert', 'status', 'log', 'marquee', 'timer' ];\n\n\t\t/*\n\t\t * Don't hide scripts, elements that already have `aria-hidden`, and\n\t\t * ARIA live regions.\n\t\t */\n\t\treturn ! (\n\t\t\telement.tagName === 'SCRIPT' ||\n\t\t\telement.hasAttribute( 'aria-hidden' ) ||\n\t\t\telement.hasAttribute( 'aria-live' ) ||\n\t\t\tliveRegionsRoles.indexOf( role ) !== -1\n\t\t);\n\t},\n\n\t/**\n\t * Whether the body children are hidden from assistive technologies.\n\t *\n\t * @since 5.2.3\n\t */\n\tisBodyAriaHidden: false,\n\n\t/**\n\t * Stores an array of DOM elements that should be hidden from assistive\n\t * technologies, for example when the media modal dialog opens.\n\t *\n\t * @since 5.2.3\n\t */\n\tariaHiddenElements: [],\n\n\t/**\n\t * Holds the jQuery collection of ARIA tabs.\n\t *\n\t * @since 5.3.0\n\t */\n\ttabs: $(),\n\n\t/**\n\t * Sets up tabs in an ARIA tabbed interface.\n\t *\n\t * @since 5.3.0\n\t *\n\t * @param {Object} event jQuery event object.\n\t *\n\t * @return {void}\n\t */\n\tsetupAriaTabs: function() {\n\t\tthis.tabs = this.$( '[role=\"tab\"]' );\n\n\t\t// Set up initial attributes.\n\t\tthis.tabs.attr( {\n\t\t\t'aria-selected': 'false',\n\t\t\ttabIndex: '-1'\n\t\t} );\n\n\t\t// Set up attributes on the initially active tab.\n\t\tthis.tabs.filter( '.active' )\n\t\t\t.removeAttr( 'tabindex' )\n\t\t\t.attr( 'aria-selected', 'true' );\n\t},\n\n\t/**\n\t * Enables arrows navigation within the ARIA tabbed interface.\n\t *\n\t * @since 5.3.0\n\t *\n\t * @param {Object} event jQuery event object.\n\t *\n\t * @return {void}\n\t */\n\ttabsNavigation: function( event ) {\n\t\tvar orientation = 'horizontal',\n\t\t\tkeys = [ 32, 35, 36, 37, 38, 39, 40 ];\n\n\t\t// Return if not Spacebar, End, Home, or Arrow keys.\n\t\tif ( keys.indexOf( event.which ) === -1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine navigation direction.\n\t\tif ( this.$el.attr( 'aria-orientation' ) === 'vertical' ) {\n\t\t\torientation = 'vertical';\n\t\t}\n\n\t\t// Make Up and Down arrow keys do nothing with horizontal tabs.\n\t\tif ( orientation === 'horizontal' && [ 38, 40 ].indexOf( event.which ) !== -1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make Left and Right arrow keys do nothing with vertical tabs.\n\t\tif ( orientation === 'vertical' && [ 37, 39 ].indexOf( event.which ) !== -1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.switchTabs( event, this.tabs );\n\t},\n\n\t/**\n\t * Switches tabs in the ARIA tabbed interface.\n\t *\n\t * @since 5.3.0\n\t *\n\t * @param {Object} event jQuery event object.\n\t *\n\t * @return {void}\n\t */\n\tswitchTabs: function( event ) {\n\t\tvar key   = event.which,\n\t\t\tindex = this.tabs.index( $( event.target ) ),\n\t\t\tnewIndex;\n\n\t\tswitch ( key ) {\n\t\t\t// Space bar: Activate current targeted tab.\n\t\t\tcase 32: {\n\t\t\t\tthis.activateTab( this.tabs[ index ] );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// End key: Activate last tab.\n\t\t\tcase 35: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.activateTab( this.tabs[ this.tabs.length - 1 ] );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// Home key: Activate first tab.\n\t\t\tcase 36: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.activateTab( this.tabs[ 0 ] );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// Left and up keys: Activate previous tab.\n\t\t\tcase 37:\n\t\t\tcase 38: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = ( index - 1 ) < 0 ? this.tabs.length - 1 : index - 1;\n\t\t\t\tthis.activateTab( this.tabs[ newIndex ] );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// Right and down keys: Activate next tab.\n\t\t\tcase 39:\n\t\t\tcase 40: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = ( index + 1 ) === this.tabs.length ? 0 : index + 1;\n\t\t\t\tthis.activateTab( this.tabs[ newIndex ] );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Sets a single tab to be focusable and semantically selected.\n\t *\n\t * @since 5.3.0\n\t *\n\t * @param {Object} tab The tab DOM element.\n\t *\n\t * @return {void}\n\t */\n\tactivateTab: function( tab ) {\n\t\tif ( ! tab ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// The tab is a DOM element: no need for jQuery methods.\n\t\ttab.focus();\n\n\t\t// Handle automatic activation.\n\t\tif ( this.tabsAutomaticActivation ) {\n\t\t\ttab.removeAttribute( 'tabindex' );\n\t\t\ttab.setAttribute( 'aria-selected', 'true' );\n\t\t\ttab.click();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle manual activation.\n\t\t$( tab ).on( 'click', function() {\n\t\t\ttab.removeAttribute( 'tabindex' );\n\t\t\ttab.setAttribute( 'aria-selected', 'true' );\n\t\t} );\n \t}\n});\n\nmodule.exports = FocusManager;\n\n\n/***/ }),\n\n/***/ \"4jjk\":\n/***/ (function(module, exports) {\n\nvar l10n = wp.media.view.l10n,\n\tUploaded;\n\n/**\n * wp.media.view.AttachmentFilters.Uploaded\n *\n * @memberOf wp.media.view.AttachmentFilters\n *\n * @class\n * @augments wp.media.view.AttachmentFilters\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nUploaded = wp.media.view.AttachmentFilters.extend(/** @lends wp.media.view.AttachmentFilters.Uploaded.prototype */{\n\tcreateFilters: function() {\n\t\tvar type = this.model.get('type'),\n\t\t\ttypes = wp.media.view.settings.mimeTypes,\n\t\t\tuid = window.userSettings ? parseInt( window.userSettings.uid, 10 ) : 0,\n\t\t\ttext;\n\n\t\tif ( types && type ) {\n\t\t\ttext = types[ type ];\n\t\t}\n\n\t\tthis.filters = {\n\t\t\tall: {\n\t\t\t\ttext:  text || l10n.allMediaItems,\n\t\t\t\tprops: {\n\t\t\t\t\tuploadedTo: null,\n\t\t\t\t\torderby: 'date',\n\t\t\t\t\torder:   'DESC',\n\t\t\t\t\tauthor:\t null\n\t\t\t\t},\n\t\t\t\tpriority: 10\n\t\t\t},\n\n\t\t\tuploaded: {\n\t\t\t\ttext:  l10n.uploadedToThisPost,\n\t\t\t\tprops: {\n\t\t\t\t\tuploadedTo: wp.media.view.settings.post.id,\n\t\t\t\t\torderby: 'menuOrder',\n\t\t\t\t\torder:   'ASC',\n\t\t\t\t\tauthor:\t null\n\t\t\t\t},\n\t\t\t\tpriority: 20\n\t\t\t},\n\n\t\t\tunattached: {\n\t\t\t\ttext:  l10n.unattached,\n\t\t\t\tprops: {\n\t\t\t\t\tuploadedTo: 0,\n\t\t\t\t\torderby: 'menuOrder',\n\t\t\t\t\torder:   'ASC',\n\t\t\t\t\tauthor:\t null\n\t\t\t\t},\n\t\t\t\tpriority: 50\n\t\t\t}\n\t\t};\n\n\t\tif ( uid ) {\n\t\t\tthis.filters.mine = {\n\t\t\t\ttext:  l10n.mine,\n\t\t\t\tprops: {\n\t\t\t\t\torderby: 'date',\n\t\t\t\t\torder:   'DESC',\n\t\t\t\t\tauthor:  uid\n\t\t\t\t},\n\t\t\t\tpriority: 50\n\t\t\t};\n\t\t}\n\t}\n});\n\nmodule.exports = Uploaded;\n\n\n/***/ }),\n\n/***/ \"4tHu\":\n/***/ (function(module, exports) {\n\nvar l10n = wp.media.view.l10n,\n\tEditImage;\n\n/**\n * wp.media.controller.EditImage\n *\n * A state for editing (cropping, etc.) an image.\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                    attributes                      The attributes hash passed to the state.\n * @param {wp.media.model.Attachment} attributes.model                The attachment.\n * @param {string}                    [attributes.id=edit-image]      Unique identifier.\n * @param {string}                    [attributes.title=Edit Image]   Title for the state. Displays in the media menu and the frame's title region.\n * @param {string}                    [attributes.content=edit-image] Initial mode for the content region.\n * @param {string}                    [attributes.toolbar=edit-image] Initial mode for the toolbar region.\n * @param {string}                    [attributes.menu=false]         Initial mode for the menu region.\n * @param {string}                    [attributes.url]                Unused. @todo Consider removal.\n */\nEditImage = wp.media.controller.State.extend(/** @lends wp.media.controller.EditImage.prototype */{\n\tdefaults: {\n\t\tid:      'edit-image',\n\t\ttitle:   l10n.editImage,\n\t\tmenu:    false,\n\t\ttoolbar: 'edit-image',\n\t\tcontent: 'edit-image',\n\t\turl:     ''\n\t},\n\n\t/**\n\t * Activates a frame for editing a featured image.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @return {void}\n\t */\n\tactivate: function() {\n\t\tthis.frame.on( 'toolbar:render:edit-image', _.bind( this.toolbar, this ) );\n\t},\n\n\t/**\n\t * Deactivates a frame for editing a featured image.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @return {void}\n\t */\n\tdeactivate: function() {\n\t\tthis.frame.off( 'toolbar:render:edit-image' );\n\t},\n\n\t/**\n\t * Adds a toolbar with a back button.\n\t *\n\t * When the back button is pressed it checks whether there is a previous state.\n\t * In case there is a previous state it sets that previous state otherwise it\n\t * closes the frame.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @return {void}\n\t */\n\ttoolbar: function() {\n\t\tvar frame = this.frame,\n\t\t\tlastState = frame.lastState(),\n\t\t\tprevious = lastState && lastState.id;\n\n\t\tframe.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: frame,\n\t\t\titems: {\n\t\t\t\tback: {\n\t\t\t\t\tstyle: 'primary',\n\t\t\t\t\ttext:     l10n.back,\n\t\t\t\t\tpriority: 20,\n\t\t\t\t\tclick:    function() {\n\t\t\t\t\t\tif ( previous ) {\n\t\t\t\t\t\t\tframe.setState( previous );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tframe.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t}\n});\n\nmodule.exports = EditImage;\n\n\n/***/ }),\n\n/***/ \"6B7g\":\n/***/ (function(module, exports) {\n\nvar Select = wp.media.view.MediaFrame.Select,\n\tLibrary = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tPost;\n\n/**\n * wp.media.view.MediaFrame.Post\n *\n * The frame for manipulating media on the Edit Post page.\n *\n * @memberOf wp.media.view.MediaFrame\n *\n * @class\n * @augments wp.media.view.MediaFrame.Select\n * @augments wp.media.view.MediaFrame\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nPost = Select.extend(/** @lends wp.media.view.MediaFrame.Post.prototype */{\n\tinitialize: function() {\n\t\tthis.counts = {\n\t\t\taudio: {\n\t\t\t\tcount: wp.media.view.settings.attachmentCounts.audio,\n\t\t\t\tstate: 'playlist'\n\t\t\t},\n\t\t\tvideo: {\n\t\t\t\tcount: wp.media.view.settings.attachmentCounts.video,\n\t\t\t\tstate: 'video-playlist'\n\t\t\t}\n\t\t};\n\n\t\t_.defaults( this.options, {\n\t\t\tmultiple:  true,\n\t\t\tediting:   false,\n\t\t\tstate:    'insert',\n\t\t\tmetadata:  {}\n\t\t});\n\n\t\t// Call 'initialize' directly on the parent class.\n\t\tSelect.prototype.initialize.apply( this, arguments );\n\t\tthis.createIframeStates();\n\n\t},\n\n\t/**\n\t * Create the default states.\n\t */\n\tcreateStates: function() {\n\t\tvar options = this.options;\n\n\t\tthis.states.add([\n\t\t\t// Main states.\n\t\t\tnew Library({\n\t\t\t\tid:         'insert',\n\t\t\t\ttitle:      l10n.insertMediaTitle,\n\t\t\t\tpriority:   20,\n\t\t\t\ttoolbar:    'main-insert',\n\t\t\t\tfilterable: 'all',\n\t\t\t\tlibrary:    wp.media.query( options.library ),\n\t\t\t\tmultiple:   options.multiple ? 'reset' : false,\n\t\t\t\teditable:   true,\n\n\t\t\t\t// If the user isn't allowed to edit fields,\n\t\t\t\t// can they still edit it locally?\n\t\t\t\tallowLocalEdits: true,\n\n\t\t\t\t// Show the attachment display settings.\n\t\t\t\tdisplaySettings: true,\n\t\t\t\t// Update user settings when users adjust the\n\t\t\t\t// attachment display settings.\n\t\t\t\tdisplayUserSettings: true\n\t\t\t}),\n\n\t\t\tnew Library({\n\t\t\t\tid:         'gallery',\n\t\t\t\ttitle:      l10n.createGalleryTitle,\n\t\t\t\tpriority:   40,\n\t\t\t\ttoolbar:    'main-gallery',\n\t\t\t\tfilterable: 'uploaded',\n\t\t\t\tmultiple:   'add',\n\t\t\t\teditable:   false,\n\n\t\t\t\tlibrary:  wp.media.query( _.defaults({\n\t\t\t\t\ttype: 'image'\n\t\t\t\t}, options.library ) )\n\t\t\t}),\n\n\t\t\t// Embed states.\n\t\t\tnew wp.media.controller.Embed( { metadata: options.metadata } ),\n\n\t\t\tnew wp.media.controller.EditImage( { model: options.editImage } ),\n\n\t\t\t// Gallery states.\n\t\t\tnew wp.media.controller.GalleryEdit({\n\t\t\t\tlibrary: options.selection,\n\t\t\t\tediting: options.editing,\n\t\t\t\tmenu:    'gallery'\n\t\t\t}),\n\n\t\t\tnew wp.media.controller.GalleryAdd(),\n\n\t\t\tnew Library({\n\t\t\t\tid:         'playlist',\n\t\t\t\ttitle:      l10n.createPlaylistTitle,\n\t\t\t\tpriority:   60,\n\t\t\t\ttoolbar:    'main-playlist',\n\t\t\t\tfilterable: 'uploaded',\n\t\t\t\tmultiple:   'add',\n\t\t\t\teditable:   false,\n\n\t\t\t\tlibrary:  wp.media.query( _.defaults({\n\t\t\t\t\ttype: 'audio'\n\t\t\t\t}, options.library ) )\n\t\t\t}),\n\n\t\t\t// Playlist states.\n\t\t\tnew wp.media.controller.CollectionEdit({\n\t\t\t\ttype: 'audio',\n\t\t\t\tcollectionType: 'playlist',\n\t\t\t\ttitle:          l10n.editPlaylistTitle,\n\t\t\t\tSettingsView:   wp.media.view.Settings.Playlist,\n\t\t\t\tlibrary:        options.selection,\n\t\t\t\tediting:        options.editing,\n\t\t\t\tmenu:           'playlist',\n\t\t\t\tdragInfoText:   l10n.playlistDragInfo,\n\t\t\t\tdragInfo:       false\n\t\t\t}),\n\n\t\t\tnew wp.media.controller.CollectionAdd({\n\t\t\t\ttype: 'audio',\n\t\t\t\tcollectionType: 'playlist',\n\t\t\t\ttitle: l10n.addToPlaylistTitle\n\t\t\t}),\n\n\t\t\tnew Library({\n\t\t\t\tid:         'video-playlist',\n\t\t\t\ttitle:      l10n.createVideoPlaylistTitle,\n\t\t\t\tpriority:   60,\n\t\t\t\ttoolbar:    'main-video-playlist',\n\t\t\t\tfilterable: 'uploaded',\n\t\t\t\tmultiple:   'add',\n\t\t\t\teditable:   false,\n\n\t\t\t\tlibrary:  wp.media.query( _.defaults({\n\t\t\t\t\ttype: 'video'\n\t\t\t\t}, options.library ) )\n\t\t\t}),\n\n\t\t\tnew wp.media.controller.CollectionEdit({\n\t\t\t\ttype: 'video',\n\t\t\t\tcollectionType: 'playlist',\n\t\t\t\ttitle:          l10n.editVideoPlaylistTitle,\n\t\t\t\tSettingsView:   wp.media.view.Settings.Playlist,\n\t\t\t\tlibrary:        options.selection,\n\t\t\t\tediting:        options.editing,\n\t\t\t\tmenu:           'video-playlist',\n\t\t\t\tdragInfoText:   l10n.videoPlaylistDragInfo,\n\t\t\t\tdragInfo:       false\n\t\t\t}),\n\n\t\t\tnew wp.media.controller.CollectionAdd({\n\t\t\t\ttype: 'video',\n\t\t\t\tcollectionType: 'playlist',\n\t\t\t\ttitle: l10n.addToVideoPlaylistTitle\n\t\t\t})\n\t\t]);\n\n\t\tif ( wp.media.view.settings.post.featuredImageId ) {\n\t\t\tthis.states.add( new wp.media.controller.FeaturedImage() );\n\t\t}\n\t},\n\n\tbindHandlers: function() {\n\t\tvar handlers, checkCounts;\n\n\t\tSelect.prototype.bindHandlers.apply( this, arguments );\n\n\t\tthis.on( 'activate', this.activate, this );\n\n\t\t// Only bother checking media type counts if one of the counts is zero.\n\t\tcheckCounts = _.find( this.counts, function( type ) {\n\t\t\treturn type.count === 0;\n\t\t} );\n\n\t\tif ( typeof checkCounts !== 'undefined' ) {\n\t\t\tthis.listenTo( wp.media.model.Attachments.all, 'change:type', this.mediaTypeCounts );\n\t\t}\n\n\t\tthis.on( 'menu:create:gallery', this.createMenu, this );\n\t\tthis.on( 'menu:create:playlist', this.createMenu, this );\n\t\tthis.on( 'menu:create:video-playlist', this.createMenu, this );\n\t\tthis.on( 'toolbar:create:main-insert', this.createToolbar, this );\n\t\tthis.on( 'toolbar:create:main-gallery', this.createToolbar, this );\n\t\tthis.on( 'toolbar:create:main-playlist', this.createToolbar, this );\n\t\tthis.on( 'toolbar:create:main-video-playlist', this.createToolbar, this );\n\t\tthis.on( 'toolbar:create:featured-image', this.featuredImageToolbar, this );\n\t\tthis.on( 'toolbar:create:main-embed', this.mainEmbedToolbar, this );\n\n\t\thandlers = {\n\t\t\tmenu: {\n\t\t\t\t'default': 'mainMenu',\n\t\t\t\t'gallery': 'galleryMenu',\n\t\t\t\t'playlist': 'playlistMenu',\n\t\t\t\t'video-playlist': 'videoPlaylistMenu'\n\t\t\t},\n\n\t\t\tcontent: {\n\t\t\t\t'embed':          'embedContent',\n\t\t\t\t'edit-image':     'editImageContent',\n\t\t\t\t'edit-selection': 'editSelectionContent'\n\t\t\t},\n\n\t\t\ttoolbar: {\n\t\t\t\t'main-insert':      'mainInsertToolbar',\n\t\t\t\t'main-gallery':     'mainGalleryToolbar',\n\t\t\t\t'gallery-edit':     'galleryEditToolbar',\n\t\t\t\t'gallery-add':      'galleryAddToolbar',\n\t\t\t\t'main-playlist':\t'mainPlaylistToolbar',\n\t\t\t\t'playlist-edit':\t'playlistEditToolbar',\n\t\t\t\t'playlist-add':\t\t'playlistAddToolbar',\n\t\t\t\t'main-video-playlist': 'mainVideoPlaylistToolbar',\n\t\t\t\t'video-playlist-edit': 'videoPlaylistEditToolbar',\n\t\t\t\t'video-playlist-add': 'videoPlaylistAddToolbar'\n\t\t\t}\n\t\t};\n\n\t\t_.each( handlers, function( regionHandlers, region ) {\n\t\t\t_.each( regionHandlers, function( callback, handler ) {\n\t\t\t\tthis.on( region + ':render:' + handler, this[ callback ], this );\n\t\t\t}, this );\n\t\t}, this );\n\t},\n\n\tactivate: function() {\n\t\t// Hide menu items for states tied to particular media types if there are no items.\n\t\t_.each( this.counts, function( type ) {\n\t\t\tif ( type.count < 1 ) {\n\t\t\t\tthis.menuItemVisibility( type.state, 'hide' );\n\t\t\t}\n\t\t}, this );\n\t},\n\n\tmediaTypeCounts: function( model, attr ) {\n\t\tif ( typeof this.counts[ attr ] !== 'undefined' && this.counts[ attr ].count < 1 ) {\n\t\t\tthis.counts[ attr ].count++;\n\t\t\tthis.menuItemVisibility( this.counts[ attr ].state, 'show' );\n\t\t}\n\t},\n\n\t// Menus.\n\t/**\n\t * @param {wp.Backbone.View} view\n\t */\n\tmainMenu: function( view ) {\n\t\tview.set({\n\t\t\t'library-separator': new wp.media.View({\n\t\t\t\tclassName:  'separator',\n\t\t\t\tpriority:   100,\n\t\t\t\tattributes: {\n\t\t\t\t\trole: 'presentation'\n\t\t\t\t}\n\t\t\t})\n\t\t});\n\t},\n\n\tmenuItemVisibility: function( state, visibility ) {\n\t\tvar menu = this.menu.get();\n\t\tif ( visibility === 'hide' ) {\n\t\t\tmenu.hide( state );\n\t\t} else if ( visibility === 'show' ) {\n\t\t\tmenu.show( state );\n\t\t}\n\t},\n\t/**\n\t * @param {wp.Backbone.View} view\n\t */\n\tgalleryMenu: function( view ) {\n\t\tvar lastState = this.lastState(),\n\t\t\tprevious = lastState && lastState.id,\n\t\t\tframe = this;\n\n\t\tview.set({\n\t\t\tcancel: {\n\t\t\t\ttext:     l10n.cancelGalleryTitle,\n\t\t\t\tpriority: 20,\n\t\t\t\tclick:    function() {\n\t\t\t\t\tif ( previous ) {\n\t\t\t\t\t\tframe.setState( previous );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tframe.close();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Move focus to the modal after canceling a Gallery.\n\t\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t\t}\n\t\t\t},\n\t\t\tseparateCancel: new wp.media.View({\n\t\t\t\tclassName: 'separator',\n\t\t\t\tpriority: 40\n\t\t\t})\n\t\t});\n\t},\n\n\tplaylistMenu: function( view ) {\n\t\tvar lastState = this.lastState(),\n\t\t\tprevious = lastState && lastState.id,\n\t\t\tframe = this;\n\n\t\tview.set({\n\t\t\tcancel: {\n\t\t\t\ttext:     l10n.cancelPlaylistTitle,\n\t\t\t\tpriority: 20,\n\t\t\t\tclick:    function() {\n\t\t\t\t\tif ( previous ) {\n\t\t\t\t\t\tframe.setState( previous );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tframe.close();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Move focus to the modal after canceling an Audio Playlist.\n\t\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t\t}\n\t\t\t},\n\t\t\tseparateCancel: new wp.media.View({\n\t\t\t\tclassName: 'separator',\n\t\t\t\tpriority: 40\n\t\t\t})\n\t\t});\n\t},\n\n\tvideoPlaylistMenu: function( view ) {\n\t\tvar lastState = this.lastState(),\n\t\t\tprevious = lastState && lastState.id,\n\t\t\tframe = this;\n\n\t\tview.set({\n\t\t\tcancel: {\n\t\t\t\ttext:     l10n.cancelVideoPlaylistTitle,\n\t\t\t\tpriority: 20,\n\t\t\t\tclick:    function() {\n\t\t\t\t\tif ( previous ) {\n\t\t\t\t\t\tframe.setState( previous );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tframe.close();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Move focus to the modal after canceling a Video Playlist.\n\t\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t\t}\n\t\t\t},\n\t\t\tseparateCancel: new wp.media.View({\n\t\t\t\tclassName: 'separator',\n\t\t\t\tpriority: 40\n\t\t\t})\n\t\t});\n\t},\n\n\t// Content.\n\tembedContent: function() {\n\t\tvar view = new wp.media.view.Embed({\n\t\t\tcontroller: this,\n\t\t\tmodel:      this.state()\n\t\t}).render();\n\n\t\tthis.content.set( view );\n\t},\n\n\teditSelectionContent: function() {\n\t\tvar state = this.state(),\n\t\t\tselection = state.get('selection'),\n\t\t\tview;\n\n\t\tview = new wp.media.view.AttachmentsBrowser({\n\t\t\tcontroller: this,\n\t\t\tcollection: selection,\n\t\t\tselection:  selection,\n\t\t\tmodel:      state,\n\t\t\tsortable:   true,\n\t\t\tsearch:     false,\n\t\t\tdate:       false,\n\t\t\tdragInfo:   true,\n\n\t\t\tAttachmentView: wp.media.view.Attachments.EditSelection\n\t\t}).render();\n\n\t\tview.toolbar.set( 'backToLibrary', {\n\t\t\ttext:     l10n.returnToLibrary,\n\t\t\tpriority: -100,\n\n\t\t\tclick: function() {\n\t\t\t\tthis.controller.content.mode('browse');\n\t\t\t\t// Move focus to the modal when jumping back from Edit Selection to Add Media view.\n\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t}\n\t\t});\n\n\t\t// Browse our library of attachments.\n\t\tthis.content.set( view );\n\n\t\t// Trigger the controller to set focus.\n\t\tthis.trigger( 'edit:selection', this );\n\t},\n\n\teditImageContent: function() {\n\t\tvar image = this.state().get('image'),\n\t\t\tview = new wp.media.view.EditImage( { model: image, controller: this } ).render();\n\n\t\tthis.content.set( view );\n\n\t\t// After creating the wrapper view, load the actual editor via an Ajax call.\n\t\tview.loadEditor();\n\n\t},\n\n\t// Toolbars.\n\n\t/**\n\t * @param {wp.Backbone.View} view\n\t */\n\tselectionStatusToolbar: function( view ) {\n\t\tvar editable = this.state().get('editable');\n\n\t\tview.set( 'selection', new wp.media.view.Selection({\n\t\t\tcontroller: this,\n\t\t\tcollection: this.state().get('selection'),\n\t\t\tpriority:   -40,\n\n\t\t\t// If the selection is editable, pass the callback to\n\t\t\t// switch the content mode.\n\t\t\teditable: editable && function() {\n\t\t\t\tthis.controller.content.mode('edit-selection');\n\t\t\t}\n\t\t}).render() );\n\t},\n\n\t/**\n\t * @param {wp.Backbone.View} view\n\t */\n\tmainInsertToolbar: function( view ) {\n\t\tvar controller = this;\n\n\t\tthis.selectionStatusToolbar( view );\n\n\t\tview.set( 'insert', {\n\t\t\tstyle:    'primary',\n\t\t\tpriority: 80,\n\t\t\ttext:     l10n.insertIntoPost,\n\t\t\trequires: { selection: true },\n\n\t\t\t/**\n\t\t\t * @ignore\n\t\t\t *\n\t\t\t * @fires wp.media.controller.State#insert\n\t\t\t */\n\t\t\tclick: function() {\n\t\t\t\tvar state = controller.state(),\n\t\t\t\t\tselection = state.get('selection');\n\n\t\t\t\tcontroller.close();\n\t\t\t\tstate.trigger( 'insert', selection ).reset();\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * @param {wp.Backbone.View} view\n\t */\n\tmainGalleryToolbar: function( view ) {\n\t\tvar controller = this;\n\n\t\tthis.selectionStatusToolbar( view );\n\n\t\tview.set( 'gallery', {\n\t\t\tstyle:    'primary',\n\t\t\ttext:     l10n.createNewGallery,\n\t\t\tpriority: 60,\n\t\t\trequires: { selection: true },\n\n\t\t\tclick: function() {\n\t\t\t\tvar selection = controller.state().get('selection'),\n\t\t\t\t\tedit = controller.state('gallery-edit'),\n\t\t\t\t\tmodels = selection.where({ type: 'image' });\n\n\t\t\t\tedit.set( 'library', new wp.media.model.Selection( models, {\n\t\t\t\t\tprops:    selection.props.toJSON(),\n\t\t\t\t\tmultiple: true\n\t\t\t\t}) );\n\n\t\t\t\t// Jump to Edit Gallery view.\n\t\t\t\tthis.controller.setState( 'gallery-edit' );\n\n\t\t\t\t// Move focus to the modal after jumping to Edit Gallery view.\n\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t}\n\t\t});\n\t},\n\n\tmainPlaylistToolbar: function( view ) {\n\t\tvar controller = this;\n\n\t\tthis.selectionStatusToolbar( view );\n\n\t\tview.set( 'playlist', {\n\t\t\tstyle:    'primary',\n\t\t\ttext:     l10n.createNewPlaylist,\n\t\t\tpriority: 100,\n\t\t\trequires: { selection: true },\n\n\t\t\tclick: function() {\n\t\t\t\tvar selection = controller.state().get('selection'),\n\t\t\t\t\tedit = controller.state('playlist-edit'),\n\t\t\t\t\tmodels = selection.where({ type: 'audio' });\n\n\t\t\t\tedit.set( 'library', new wp.media.model.Selection( models, {\n\t\t\t\t\tprops:    selection.props.toJSON(),\n\t\t\t\t\tmultiple: true\n\t\t\t\t}) );\n\n\t\t\t\t// Jump to Edit Audio Playlist view.\n\t\t\t\tthis.controller.setState( 'playlist-edit' );\n\n\t\t\t\t// Move focus to the modal after jumping to Edit Audio Playlist view.\n\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t}\n\t\t});\n\t},\n\n\tmainVideoPlaylistToolbar: function( view ) {\n\t\tvar controller = this;\n\n\t\tthis.selectionStatusToolbar( view );\n\n\t\tview.set( 'video-playlist', {\n\t\t\tstyle:    'primary',\n\t\t\ttext:     l10n.createNewVideoPlaylist,\n\t\t\tpriority: 100,\n\t\t\trequires: { selection: true },\n\n\t\t\tclick: function() {\n\t\t\t\tvar selection = controller.state().get('selection'),\n\t\t\t\t\tedit = controller.state('video-playlist-edit'),\n\t\t\t\t\tmodels = selection.where({ type: 'video' });\n\n\t\t\t\tedit.set( 'library', new wp.media.model.Selection( models, {\n\t\t\t\t\tprops:    selection.props.toJSON(),\n\t\t\t\t\tmultiple: true\n\t\t\t\t}) );\n\n\t\t\t\t// Jump to Edit Video Playlist view.\n\t\t\t\tthis.controller.setState( 'video-playlist-edit' );\n\n\t\t\t\t// Move focus to the modal after jumping to Edit Video Playlist view.\n\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t}\n\t\t});\n\t},\n\n\tfeaturedImageToolbar: function( toolbar ) {\n\t\tthis.createSelectToolbar( toolbar, {\n\t\t\ttext:  l10n.setFeaturedImage,\n\t\t\tstate: this.options.state\n\t\t});\n\t},\n\n\tmainEmbedToolbar: function( toolbar ) {\n\t\ttoolbar.view = new wp.media.view.Toolbar.Embed({\n\t\t\tcontroller: this\n\t\t});\n\t},\n\n\tgalleryEditToolbar: function() {\n\t\tvar editing = this.state().get('editing');\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     editing ? l10n.updateGallery : l10n.insertGallery,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\trequires: { library: true },\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @fires wp.media.controller.State#update\n\t\t\t\t\t */\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state();\n\n\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\tstate.trigger( 'update', state.get('library') );\n\n\t\t\t\t\t\t// Restore and reset the default state.\n\t\t\t\t\t\tcontroller.setState( controller.options.state );\n\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\tgalleryAddToolbar: function() {\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.addToGallery,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\trequires: { selection: true },\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @fires wp.media.controller.State#reset\n\t\t\t\t\t */\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state(),\n\t\t\t\t\t\t\tedit = controller.state('gallery-edit');\n\n\t\t\t\t\t\tedit.get('library').add( state.get('selection').models );\n\t\t\t\t\t\tstate.trigger('reset');\n\t\t\t\t\t\tcontroller.setState('gallery-edit');\n\t\t\t\t\t\t// Move focus to the modal when jumping back from Add to Gallery to Edit Gallery view.\n\t\t\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\tplaylistEditToolbar: function() {\n\t\tvar editing = this.state().get('editing');\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     editing ? l10n.updatePlaylist : l10n.insertPlaylist,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\trequires: { library: true },\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @fires wp.media.controller.State#update\n\t\t\t\t\t */\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state();\n\n\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\tstate.trigger( 'update', state.get('library') );\n\n\t\t\t\t\t\t// Restore and reset the default state.\n\t\t\t\t\t\tcontroller.setState( controller.options.state );\n\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\tplaylistAddToolbar: function() {\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.addToPlaylist,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\trequires: { selection: true },\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @fires wp.media.controller.State#reset\n\t\t\t\t\t */\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state(),\n\t\t\t\t\t\t\tedit = controller.state('playlist-edit');\n\n\t\t\t\t\t\tedit.get('library').add( state.get('selection').models );\n\t\t\t\t\t\tstate.trigger('reset');\n\t\t\t\t\t\tcontroller.setState('playlist-edit');\n\t\t\t\t\t\t// Move focus to the modal when jumping back from Add to Audio Playlist to Edit Audio Playlist view.\n\t\t\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\tvideoPlaylistEditToolbar: function() {\n\t\tvar editing = this.state().get('editing');\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     editing ? l10n.updateVideoPlaylist : l10n.insertVideoPlaylist,\n\t\t\t\t\tpriority: 140,\n\t\t\t\t\trequires: { library: true },\n\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state(),\n\t\t\t\t\t\t\tlibrary = state.get('library');\n\n\t\t\t\t\t\tlibrary.type = 'video';\n\n\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\tstate.trigger( 'update', library );\n\n\t\t\t\t\t\t// Restore and reset the default state.\n\t\t\t\t\t\tcontroller.setState( controller.options.state );\n\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\tvideoPlaylistAddToolbar: function() {\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.addToVideoPlaylist,\n\t\t\t\t\tpriority: 140,\n\t\t\t\t\trequires: { selection: true },\n\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state(),\n\t\t\t\t\t\t\tedit = controller.state('video-playlist-edit');\n\n\t\t\t\t\t\tedit.get('library').add( state.get('selection').models );\n\t\t\t\t\t\tstate.trigger('reset');\n\t\t\t\t\t\tcontroller.setState('video-playlist-edit');\n\t\t\t\t\t\t// Move focus to the modal when jumping back from Add to Video Playlist to Edit Video Playlist view.\n\t\t\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t}\n});\n\nmodule.exports = Post;\n\n\n/***/ }),\n\n/***/ \"72mI\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\tmediaTrash = wp.media.view.settings.mediaTrash,\n\tl10n = wp.media.view.l10n,\n\t$ = jQuery,\n\tAttachmentsBrowser,\n\tinfiniteScrolling = wp.media.view.settings.infiniteScrolling,\n\t__ = wp.i18n.__,\n\tsprintf = wp.i18n.sprintf;\n\n/**\n * wp.media.view.AttachmentsBrowser\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n *\n * @param {object}         [options]               The options hash passed to the view.\n * @param {boolean|string} [options.filters=false] Which filters to show in the browser's toolbar.\n *                                                 Accepts 'uploaded' and 'all'.\n * @param {boolean}        [options.search=true]   Whether to show the search interface in the\n *                                                 browser's toolbar.\n * @param {boolean}        [options.date=true]     Whether to show the date filter in the\n *                                                 browser's toolbar.\n * @param {boolean}        [options.display=false] Whether to show the attachments display settings\n *                                                 view in the sidebar.\n * @param {boolean|string} [options.sidebar=true]  Whether to create a sidebar for the browser.\n *                                                 Accepts true, false, and 'errors'.\n */\nAttachmentsBrowser = View.extend(/** @lends wp.media.view.AttachmentsBrowser.prototype */{\n\ttagName:   'div',\n\tclassName: 'attachments-browser',\n\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\tfilters: false,\n\t\t\tsearch:  true,\n\t\t\tdate:    true,\n\t\t\tdisplay: false,\n\t\t\tsidebar: true,\n\t\t\tAttachmentView: wp.media.view.Attachment.Library\n\t\t});\n\n\t\tthis.controller.on( 'toggle:upload:attachment', this.toggleUploader, this );\n\t\tthis.controller.on( 'edit:selection', this.editSelection );\n\n\t\t// In the Media Library, the sidebar is used to display errors before the attachments grid.\n\t\tif ( this.options.sidebar && 'errors' === this.options.sidebar ) {\n\t\t\tthis.createSidebar();\n\t\t}\n\n\t\t/*\n\t\t * In the grid mode (the Media Library), place the Inline Uploader before\n\t\t * other sections so that the visual order and the DOM order match. This way,\n\t\t * the Inline Uploader in the Media Library is right after the \"Add New\"\n\t\t * button, see ticket #37188.\n\t\t */\n\t\tif ( this.controller.isModeActive( 'grid' ) ) {\n\t\t\tthis.createUploader();\n\n\t\t\t/*\n\t\t\t * Create a multi-purpose toolbar. Used as main toolbar in the Media Library\n\t\t\t * and also for other things, for example the \"Drag and drop to reorder\" and\n\t\t\t * \"Suggested dimensions\" info in the media modal.\n\t\t\t */\n\t\t\tthis.createToolbar();\n\t\t} else {\n\t\t\tthis.createToolbar();\n\t\t\tthis.createUploader();\n\t\t}\n\n\t\t// Add a heading before the attachments list.\n\t\tthis.createAttachmentsHeading();\n\n\t\t// Create the attachments wrapper view.\n\t\tthis.createAttachmentsWrapperView();\n\n\t\tif ( ! infiniteScrolling ) {\n\t\t\tthis.$el.addClass( 'has-load-more' );\n\t\t\tthis.createLoadMoreView();\n\t\t}\n\n\t\t// For accessibility reasons, place the normal sidebar after the attachments, see ticket #36909.\n\t\tif ( this.options.sidebar && 'errors' !== this.options.sidebar ) {\n\t\t\tthis.createSidebar();\n\t\t}\n\n\t\tthis.updateContent();\n\n\t\tif ( ! infiniteScrolling ) {\n\t\t\tthis.updateLoadMoreView();\n\t\t}\n\n\t\tif ( ! this.options.sidebar || 'errors' === this.options.sidebar ) {\n\t\t\tthis.$el.addClass( 'hide-sidebar' );\n\n\t\t\tif ( 'errors' === this.options.sidebar ) {\n\t\t\t\tthis.$el.addClass( 'sidebar-for-errors' );\n\t\t\t}\n\t\t}\n\n\t\tthis.collection.on( 'add remove reset', this.updateContent, this );\n\n\t\tif ( ! infiniteScrolling ) {\n\t\t\tthis.collection.on( 'add remove reset', this.updateLoadMoreView, this );\n\t\t}\n\n\t\t// The non-cached or cached attachments query has completed.\n\t\tthis.collection.on( 'attachments:received', this.announceSearchResults, this );\n\t},\n\n\t/**\n\t * Updates the `wp.a11y.speak()` ARIA live region with a message to communicate\n\t * the number of search results to screen reader users. This function is\n\t * debounced because the collection updates multiple times.\n\t *\n\t * @since 5.3.0\n\t *\n\t * @return {void}\n\t */\n\tannounceSearchResults: _.debounce( function() {\n\t\tvar count,\n\t\t\t/* translators: Accessibility text. %d: Number of attachments found in a search. */\n\t\t\tmediaFoundHasMoreResultsMessage = __( 'Number of media items displayed: %d. Click load more for more results.' );\n\n\t\tif ( infiniteScrolling ) {\n\t\t\t/* translators: Accessibility text. %d: Number of attachments found in a search. */\n\t\t\tmediaFoundHasMoreResultsMessage = __( 'Number of media items displayed: %d. Scroll the page for more results.' );\n\t\t}\n\n\t\tif ( this.collection.mirroring.args.s ) {\n\t\t\tcount = this.collection.length;\n\n\t\t\tif ( 0 === count ) {\n\t\t\t\twp.a11y.speak( l10n.noMediaTryNewSearch );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.collection.hasMore() ) {\n\t\t\t\twp.a11y.speak( mediaFoundHasMoreResultsMessage.replace( '%d', count ) );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twp.a11y.speak( l10n.mediaFound.replace( '%d', count ) );\n\t\t}\n\t}, 200 ),\n\n\teditSelection: function( modal ) {\n\t\t// When editing a selection, move focus to the \"Go to library\" button.\n\t\tmodal.$( '.media-button-backToLibrary' ).focus();\n\t},\n\n\t/**\n\t * @return {wp.media.view.AttachmentsBrowser} Returns itself to allow chaining.\n\t */\n\tdispose: function() {\n\t\tthis.options.selection.off( null, null, this );\n\t\tView.prototype.dispose.apply( this, arguments );\n\t\treturn this;\n\t},\n\n\tcreateToolbar: function() {\n\t\tvar LibraryViewSwitcher, Filters, toolbarOptions,\n\t\t\tshowFilterByType = -1 !== $.inArray( this.options.filters, [ 'uploaded', 'all' ] );\n\n\t\ttoolbarOptions = {\n\t\t\tcontroller: this.controller\n\t\t};\n\n\t\tif ( this.controller.isModeActive( 'grid' ) ) {\n\t\t\ttoolbarOptions.className = 'media-toolbar wp-filter';\n\t\t}\n\n\t\t/**\n\t\t* @member {wp.media.view.Toolbar}\n\t\t*/\n\t\tthis.toolbar = new wp.media.view.Toolbar( toolbarOptions );\n\n\t\tthis.views.add( this.toolbar );\n\n\t\tthis.toolbar.set( 'spinner', new wp.media.view.Spinner({\n\t\t\tpriority: -20\n\t\t}) );\n\n\t\tif ( showFilterByType || this.options.date ) {\n\t\t\t/*\n\t\t\t * Create a h2 heading before the select elements that filter attachments.\n\t\t\t * This heading is visible in the modal and visually hidden in the grid.\n\t\t\t */\n\t\t\tthis.toolbar.set( 'filters-heading', new wp.media.view.Heading( {\n\t\t\t\tpriority:   -100,\n\t\t\t\ttext:       l10n.filterAttachments,\n\t\t\t\tlevel:      'h2',\n\t\t\t\tclassName:  'media-attachments-filter-heading'\n\t\t\t}).render() );\n\t\t}\n\n\t\tif ( showFilterByType ) {\n\t\t\t// \"Filters\" is a <select>, a visually hidden label element needs to be rendered before.\n\t\t\tthis.toolbar.set( 'filtersLabel', new wp.media.view.Label({\n\t\t\t\tvalue: l10n.filterByType,\n\t\t\t\tattributes: {\n\t\t\t\t\t'for':  'media-attachment-filters'\n\t\t\t\t},\n\t\t\t\tpriority:   -80\n\t\t\t}).render() );\n\n\t\t\tif ( 'uploaded' === this.options.filters ) {\n\t\t\t\tthis.toolbar.set( 'filters', new wp.media.view.AttachmentFilters.Uploaded({\n\t\t\t\t\tcontroller: this.controller,\n\t\t\t\t\tmodel:      this.collection.props,\n\t\t\t\t\tpriority:   -80\n\t\t\t\t}).render() );\n\t\t\t} else {\n\t\t\t\tFilters = new wp.media.view.AttachmentFilters.All({\n\t\t\t\t\tcontroller: this.controller,\n\t\t\t\t\tmodel:      this.collection.props,\n\t\t\t\t\tpriority:   -80\n\t\t\t\t});\n\n\t\t\t\tthis.toolbar.set( 'filters', Filters.render() );\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Feels odd to bring the global media library switcher into the Attachment browser view.\n\t\t * Is this a use case for doAction( 'add:toolbar-items:attachments-browser', this.toolbar );\n\t\t * which the controller can tap into and add this view?\n\t\t */\n\t\tif ( this.controller.isModeActive( 'grid' ) ) {\n\t\t\tLibraryViewSwitcher = View.extend({\n\t\t\t\tclassName: 'view-switch media-grid-view-switch',\n\t\t\t\ttemplate: wp.template( 'media-library-view-switcher')\n\t\t\t});\n\n\t\t\tthis.toolbar.set( 'libraryViewSwitcher', new LibraryViewSwitcher({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tpriority: -90\n\t\t\t}).render() );\n\n\t\t\t// DateFilter is a <select>, a visually hidden label element needs to be rendered before.\n\t\t\tthis.toolbar.set( 'dateFilterLabel', new wp.media.view.Label({\n\t\t\t\tvalue: l10n.filterByDate,\n\t\t\t\tattributes: {\n\t\t\t\t\t'for': 'media-attachment-date-filters'\n\t\t\t\t},\n\t\t\t\tpriority: -75\n\t\t\t}).render() );\n\t\t\tthis.toolbar.set( 'dateFilter', new wp.media.view.DateFilter({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tmodel:      this.collection.props,\n\t\t\t\tpriority: -75\n\t\t\t}).render() );\n\n\t\t\t// BulkSelection is a <div> with subviews, including screen reader text.\n\t\t\tthis.toolbar.set( 'selectModeToggleButton', new wp.media.view.SelectModeToggleButton({\n\t\t\t\ttext: l10n.bulkSelect,\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tpriority: -70\n\t\t\t}).render() );\n\n\t\t\tthis.toolbar.set( 'deleteSelectedButton', new wp.media.view.DeleteSelectedButton({\n\t\t\t\tfilters: Filters,\n\t\t\t\tstyle: 'primary',\n\t\t\t\tdisabled: true,\n\t\t\t\ttext: mediaTrash ? l10n.trashSelected : l10n.deletePermanently,\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tpriority: -80,\n\t\t\t\tclick: function() {\n\t\t\t\t\tvar changed = [], removed = [],\n\t\t\t\t\t\tselection = this.controller.state().get( 'selection' ),\n\t\t\t\t\t\tlibrary = this.controller.state().get( 'library' );\n\n\t\t\t\t\tif ( ! selection.length ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! mediaTrash && ! window.confirm( l10n.warnBulkDelete ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( mediaTrash &&\n\t\t\t\t\t\t'trash' !== selection.at( 0 ).get( 'status' ) &&\n\t\t\t\t\t\t! window.confirm( l10n.warnBulkTrash ) ) {\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tselection.each( function( model ) {\n\t\t\t\t\t\tif ( ! model.get( 'nonces' )['delete'] ) {\n\t\t\t\t\t\t\tremoved.push( model );\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( mediaTrash && 'trash' === model.get( 'status' ) ) {\n\t\t\t\t\t\t\tmodel.set( 'status', 'inherit' );\n\t\t\t\t\t\t\tchanged.push( model.save() );\n\t\t\t\t\t\t\tremoved.push( model );\n\t\t\t\t\t\t} else if ( mediaTrash ) {\n\t\t\t\t\t\t\tmodel.set( 'status', 'trash' );\n\t\t\t\t\t\t\tchanged.push( model.save() );\n\t\t\t\t\t\t\tremoved.push( model );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmodel.destroy({wait: true});\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( changed.length ) {\n\t\t\t\t\t\tselection.remove( removed );\n\n\t\t\t\t\t\t$.when.apply( null, changed ).then( _.bind( function() {\n\t\t\t\t\t\t\tlibrary._requery( true );\n\t\t\t\t\t\t\tthis.controller.trigger( 'selection:action:done' );\n\t\t\t\t\t\t}, this ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.controller.trigger( 'selection:action:done' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}).render() );\n\n\t\t\tif ( mediaTrash ) {\n\t\t\t\tthis.toolbar.set( 'deleteSelectedPermanentlyButton', new wp.media.view.DeleteSelectedPermanentlyButton({\n\t\t\t\t\tfilters: Filters,\n\t\t\t\t\tstyle: 'link button-link-delete',\n\t\t\t\t\tdisabled: true,\n\t\t\t\t\ttext: l10n.deletePermanently,\n\t\t\t\t\tcontroller: this.controller,\n\t\t\t\t\tpriority: -55,\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar removed = [],\n\t\t\t\t\t\t\tdestroy = [],\n\t\t\t\t\t\t\tselection = this.controller.state().get( 'selection' );\n\n\t\t\t\t\t\tif ( ! selection.length || ! window.confirm( l10n.warnBulkDelete ) ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tselection.each( function( model ) {\n\t\t\t\t\t\t\tif ( ! model.get( 'nonces' )['delete'] ) {\n\t\t\t\t\t\t\t\tremoved.push( model );\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tdestroy.push( model );\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tif ( removed.length ) {\n\t\t\t\t\t\t\tselection.remove( removed );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( destroy.length ) {\n\t\t\t\t\t\t\t$.when.apply( null, destroy.map( function (item) {\n\t\t\t\t\t\t\t\treturn item.destroy();\n\t\t\t\t\t\t\t} ) ).then( _.bind( function() {\n\t\t\t\t\t\t\t\tthis.controller.trigger( 'selection:action:done' );\n\t\t\t\t\t\t\t}, this ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}).render() );\n\t\t\t}\n\n\t\t} else if ( this.options.date ) {\n\t\t\t// DateFilter is a <select>, a visually hidden label element needs to be rendered before.\n\t\t\tthis.toolbar.set( 'dateFilterLabel', new wp.media.view.Label({\n\t\t\t\tvalue: l10n.filterByDate,\n\t\t\t\tattributes: {\n\t\t\t\t\t'for': 'media-attachment-date-filters'\n\t\t\t\t},\n\t\t\t\tpriority: -75\n\t\t\t}).render() );\n\t\t\tthis.toolbar.set( 'dateFilter', new wp.media.view.DateFilter({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tmodel:      this.collection.props,\n\t\t\t\tpriority: -75\n\t\t\t}).render() );\n\t\t}\n\n\t\tif ( this.options.search ) {\n\t\t\t// Search is an input, a visually hidden label element needs to be rendered before.\n\t\t\tthis.toolbar.set( 'searchLabel', new wp.media.view.Label({\n\t\t\t\tvalue: l10n.searchLabel,\n\t\t\t\tclassName: 'media-search-input-label',\n\t\t\t\tattributes: {\n\t\t\t\t\t'for': 'media-search-input'\n\t\t\t\t},\n\t\t\t\tpriority:   60\n\t\t\t}).render() );\n\t\t\tthis.toolbar.set( 'search', new wp.media.view.Search({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tmodel:      this.collection.props,\n\t\t\t\tpriority:   60\n\t\t\t}).render() );\n\t\t}\n\n\t\tif ( this.options.dragInfo ) {\n\t\t\tthis.toolbar.set( 'dragInfo', new View({\n\t\t\t\tel: $( '<div class=\"instructions\">' + l10n.dragInfo + '</div>' )[0],\n\t\t\t\tpriority: -40\n\t\t\t}) );\n\t\t}\n\n\t\tif ( this.options.suggestedWidth && this.options.suggestedHeight ) {\n\t\t\tthis.toolbar.set( 'suggestedDimensions', new View({\n\t\t\t\tel: $( '<div class=\"instructions\">' + l10n.suggestedDimensions.replace( '%1$s', this.options.suggestedWidth ).replace( '%2$s', this.options.suggestedHeight ) + '</div>' )[0],\n\t\t\t\tpriority: -40\n\t\t\t}) );\n\t\t}\n\t},\n\n\tupdateContent: function() {\n\t\tvar view = this,\n\t\t\tnoItemsView;\n\n\t\tif ( this.controller.isModeActive( 'grid' ) ) {\n\t\t\t// Usually the media library.\n\t\t\tnoItemsView = view.attachmentsNoResults;\n\t\t} else {\n\t\t\t// Usually the media modal.\n\t\t\tnoItemsView = view.uploader;\n\t\t}\n\n\t\tif ( ! this.collection.length ) {\n\t\t\tthis.toolbar.get( 'spinner' ).show();\n\t\t\tthis.dfd = this.collection.more().done( function() {\n\t\t\t\tif ( ! view.collection.length ) {\n\t\t\t\t\tnoItemsView.$el.removeClass( 'hidden' );\n\t\t\t\t} else {\n\t\t\t\t\tnoItemsView.$el.addClass( 'hidden' );\n\t\t\t\t}\n\t\t\t\tview.toolbar.get( 'spinner' ).hide();\n\t\t\t} );\n\t\t} else {\n\t\t\tnoItemsView.$el.addClass( 'hidden' );\n\t\t\tview.toolbar.get( 'spinner' ).hide();\n\t\t}\n\t},\n\n\tcreateUploader: function() {\n\t\tthis.uploader = new wp.media.view.UploaderInline({\n\t\t\tcontroller: this.controller,\n\t\t\tstatus:     false,\n\t\t\tmessage:    this.controller.isModeActive( 'grid' ) ? '' : l10n.noItemsFound,\n\t\t\tcanClose:   this.controller.isModeActive( 'grid' )\n\t\t});\n\n\t\tthis.uploader.$el.addClass( 'hidden' );\n\t\tthis.views.add( this.uploader );\n\t},\n\n\ttoggleUploader: function() {\n\t\tif ( this.uploader.$el.hasClass( 'hidden' ) ) {\n\t\t\tthis.uploader.show();\n\t\t} else {\n\t\t\tthis.uploader.hide();\n\t\t}\n\t},\n\n\t/**\n\t * Creates the Attachments wrapper view.\n\t *\n\t * @since 5.8.0\n\t *\n\t * @return {void}\n\t */\n\tcreateAttachmentsWrapperView: function() {\n\t\tthis.attachmentsWrapper = new wp.media.View( {\n\t\t\tclassName: 'attachments-wrapper'\n\t\t} );\n\n\t\t// Create the list of attachments.\n\t\tthis.views.add( this.attachmentsWrapper );\n\t\tthis.createAttachments();\n\t},\n\n\tcreateAttachments: function() {\n\t\tthis.attachments = new wp.media.view.Attachments({\n\t\t\tcontroller:           this.controller,\n\t\t\tcollection:           this.collection,\n\t\t\tselection:            this.options.selection,\n\t\t\tmodel:                this.model,\n\t\t\tsortable:             this.options.sortable,\n\t\t\tscrollElement:        this.options.scrollElement,\n\t\t\tidealColumnWidth:     this.options.idealColumnWidth,\n\n\t\t\t// The single `Attachment` view to be used in the `Attachments` view.\n\t\t\tAttachmentView: this.options.AttachmentView\n\t\t});\n\n\t\t// Add keydown listener to the instance of the Attachments view.\n\t\tthis.controller.on( 'attachment:keydown:arrow',     _.bind( this.attachments.arrowEvent, this.attachments ) );\n\t\tthis.controller.on( 'attachment:details:shift-tab', _.bind( this.attachments.restoreFocus, this.attachments ) );\n\n\t\tthis.views.add( '.attachments-wrapper', this.attachments );\n\n\t\tif ( this.controller.isModeActive( 'grid' ) ) {\n\t\t\tthis.attachmentsNoResults = new View({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\ttagName: 'p'\n\t\t\t});\n\n\t\t\tthis.attachmentsNoResults.$el.addClass( 'hidden no-media' );\n\t\t\tthis.attachmentsNoResults.$el.html( l10n.noMedia );\n\n\t\t\tthis.views.add( this.attachmentsNoResults );\n\t\t}\n\t},\n\n\t/**\n\t * Creates the load more button and attachments counter view.\n\t *\n\t * @since 5.8.0\n\t *\n\t * @return {void}\n\t */\n\tcreateLoadMoreView: function() {\n\t\tvar view = this;\n\n\t\tthis.loadMoreWrapper = new View( {\n\t\t\tcontroller: this.controller,\n\t\t\tclassName: 'load-more-wrapper'\n\t\t} );\n\n\t\tthis.loadMoreCount = new View( {\n\t\t\tcontroller: this.controller,\n\t\t\ttagName: 'p',\n\t\t\tclassName: 'load-more-count hidden'\n\t\t} );\n\n\t\tthis.loadMoreButton = new wp.media.view.Button( {\n\t\t\ttext: __( 'Load more' ),\n\t\t\tclassName: 'load-more hidden',\n\t\t\tstyle: 'primary',\n\t\t\tsize: '',\n\t\t\tclick: function() {\n\t\t\t\tview.loadMoreAttachments();\n\t\t\t}\n\t\t} );\n\n\t\tthis.loadMoreSpinner = new wp.media.view.Spinner();\n\n\t\tthis.loadMoreJumpToFirst = new wp.media.view.Button( {\n\t\t\ttext: __( 'Jump to first loaded item' ),\n\t\t\tclassName: 'load-more-jump hidden',\n\t\t\tsize: '',\n\t\t\tclick: function() {\n\t\t\t\tview.jumpToFirstAddedItem();\n\t\t\t}\n\t\t} );\n\n\t\tthis.views.add( '.attachments-wrapper', this.loadMoreWrapper );\n\t\tthis.views.add( '.load-more-wrapper', this.loadMoreSpinner );\n\t\tthis.views.add( '.load-more-wrapper', this.loadMoreCount );\n\t\tthis.views.add( '.load-more-wrapper', this.loadMoreButton );\n\t\tthis.views.add( '.load-more-wrapper', this.loadMoreJumpToFirst );\n\t},\n\n\t/**\n\t * Updates the Load More view. This function is debounced because the\n\t * collection updates multiple times at the add, remove, and reset events.\n\t * We need it to run only once, after all attachments are added or removed.\n\t *\n\t * @since 5.8.0\n\t *\n\t * @return {void}\n\t */\n\tupdateLoadMoreView: _.debounce( function() {\n\t\t// Ensure the load more view elements are initially hidden at each update.\n\t\tthis.loadMoreButton.$el.addClass( 'hidden' );\n\t\tthis.loadMoreCount.$el.addClass( 'hidden' );\n\t\tthis.loadMoreJumpToFirst.$el.addClass( 'hidden' ).prop( 'disabled', true );\n\n\t\tif ( ! this.collection.getTotalAttachments() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.collection.length ) {\n\t\t\tthis.loadMoreCount.$el.text(\n\t\t\t\t/* translators: 1: Number of displayed attachments, 2: Number of total attachments. */\n\t\t\t\tsprintf(\n\t\t\t\t\t__( 'Showing %1$s of %2$s media items' ),\n\t\t\t\t\tthis.collection.length,\n\t\t\t\t\tthis.collection.getTotalAttachments()\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tthis.loadMoreCount.$el.removeClass( 'hidden' );\n\t\t}\n\n\t\t/*\n\t\t * Notice that while the collection updates multiple times hasMore() may\n\t\t * return true when it's actually not true.\n\t\t */\n\t\tif ( this.collection.hasMore() ) {\n\t\t\tthis.loadMoreButton.$el.removeClass( 'hidden' );\n\t\t}\n\n\t\t// Find the media item to move focus to. The jQuery `eq()` index is zero-based.\n\t\tthis.firstAddedMediaItem = this.$el.find( '.attachment' ).eq( this.firstAddedMediaItemIndex );\n\n\t\t// If there's a media item to move focus to, make the \"Jump to\" button available.\n\t\tif ( this.firstAddedMediaItem.length ) {\n\t\t\tthis.firstAddedMediaItem.addClass( 'new-media' );\n\t\t\tthis.loadMoreJumpToFirst.$el.removeClass( 'hidden' ).prop( 'disabled', false );\n\t\t}\n\n\t\t// If there are new items added, but no more to be added, move focus to Jump button.\n\t\tif ( this.firstAddedMediaItem.length && ! this.collection.hasMore() ) {\n\t\t\tthis.loadMoreJumpToFirst.$el.trigger( 'focus' );\n\t\t}\n\t}, 10 ),\n\n\t/**\n\t * Loads more attachments.\n\t *\n\t * @since 5.8.0\n\t *\n\t * @return {void}\n\t */\n\tloadMoreAttachments: function() {\n\t\tvar view = this;\n\n\t\tif ( ! this.collection.hasMore() ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/*\n\t\t * The collection index is zero-based while the length counts the actual\n\t\t * amount of items. Thus the length is equivalent to the position of the\n\t\t * first added item.\n\t\t */\n\t\tthis.firstAddedMediaItemIndex = this.collection.length;\n\n\t\tthis.$el.addClass( 'more-loaded' );\n\t\tthis.collection.each( function( attachment ) {\n\t\t\tvar attach_id = attachment.attributes.id;\n\t\t\t$( '[data-id=\"' + attach_id + '\"]' ).addClass( 'found-media' );\n\t\t});\n\n\t\tview.loadMoreSpinner.show();\n\t\tthis.collection.once( 'attachments:received', function() {\n\t\t\tview.loadMoreSpinner.hide();\n\t\t} );\n\t\tthis.collection.more();\n\t},\n\n\t/**\n\t * Moves focus to the first new added item.\t.\n\t *\n\t * @since 5.8.0\n\t *\n\t * @return {void}\n\t */\n\tjumpToFirstAddedItem: function() {\n\t\t// Set focus on first added item.\n\t\tthis.firstAddedMediaItem.focus();\n\t},\n\n\tcreateAttachmentsHeading: function() {\n\t\tthis.attachmentsHeading = new wp.media.view.Heading( {\n\t\t\ttext: l10n.attachmentsList,\n\t\t\tlevel: 'h2',\n\t\t\tclassName: 'media-views-heading screen-reader-text'\n\t\t} );\n\t\tthis.views.add( this.attachmentsHeading );\n\t},\n\n\tcreateSidebar: function() {\n\t\tvar options = this.options,\n\t\t\tselection = options.selection,\n\t\t\tsidebar = this.sidebar = new wp.media.view.Sidebar({\n\t\t\t\tcontroller: this.controller\n\t\t\t});\n\n\t\tthis.views.add( sidebar );\n\n\t\tif ( this.controller.uploader ) {\n\t\t\tsidebar.set( 'uploads', new wp.media.view.UploaderStatus({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tpriority:   40\n\t\t\t}) );\n\t\t}\n\n\t\tselection.on( 'selection:single', this.createSingle, this );\n\t\tselection.on( 'selection:unsingle', this.disposeSingle, this );\n\n\t\tif ( selection.single() ) {\n\t\t\tthis.createSingle();\n\t\t}\n\t},\n\n\tcreateSingle: function() {\n\t\tvar sidebar = this.sidebar,\n\t\t\tsingle = this.options.selection.single();\n\n\t\tsidebar.set( 'details', new wp.media.view.Attachment.Details({\n\t\t\tcontroller: this.controller,\n\t\t\tmodel:      single,\n\t\t\tpriority:   80\n\t\t}) );\n\n\t\tsidebar.set( 'compat', new wp.media.view.AttachmentCompat({\n\t\t\tcontroller: this.controller,\n\t\t\tmodel:      single,\n\t\t\tpriority:   120\n\t\t}) );\n\n\t\tif ( this.options.display ) {\n\t\t\tsidebar.set( 'display', new wp.media.view.Settings.AttachmentDisplay({\n\t\t\t\tcontroller:   this.controller,\n\t\t\t\tmodel:        this.model.display( single ),\n\t\t\t\tattachment:   single,\n\t\t\t\tpriority:     160,\n\t\t\t\tuserSettings: this.model.get('displayUserSettings')\n\t\t\t}) );\n\t\t}\n\n\t\t// Show the sidebar on mobile.\n\t\tif ( this.model.id === 'insert' ) {\n\t\t\tsidebar.$el.addClass( 'visible' );\n\t\t}\n\t},\n\n\tdisposeSingle: function() {\n\t\tvar sidebar = this.sidebar;\n\t\tsidebar.unset('details');\n\t\tsidebar.unset('compat');\n\t\tsidebar.unset('display');\n\t\t// Hide the sidebar on mobile.\n\t\tsidebar.$el.removeClass( 'visible' );\n\t}\n});\n\nmodule.exports = AttachmentsBrowser;\n\n\n/***/ }),\n\n/***/ \"76BF\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Settings.Playlist\n *\n * @memberOf wp.media.view.Settings\n *\n * @class\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Playlist = wp.media.view.Settings.extend(/** @lends wp.media.view.Settings.Playlist.prototype */{\n\tclassName: 'collection-settings playlist-settings',\n\ttemplate:  wp.template('playlist-settings')\n});\n\nmodule.exports = Playlist;\n\n\n/***/ }),\n\n/***/ \"7Bpz\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\tUploaderInline;\n\n/**\n * wp.media.view.UploaderInline\n *\n * The inline uploader that shows up in the 'Upload Files' tab.\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nUploaderInline = View.extend(/** @lends wp.media.view.UploaderInline.prototype */{\n\ttagName:   'div',\n\tclassName: 'uploader-inline',\n\ttemplate:  wp.template('uploader-inline'),\n\n\tevents: {\n\t\t'click .close': 'hide'\n\t},\n\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\tmessage: '',\n\t\t\tstatus:  true,\n\t\t\tcanClose: false\n\t\t});\n\n\t\tif ( ! this.options.$browser && this.controller.uploader ) {\n\t\t\tthis.options.$browser = this.controller.uploader.$browser;\n\t\t}\n\n\t\tif ( _.isUndefined( this.options.postId ) ) {\n\t\t\tthis.options.postId = wp.media.view.settings.post.id;\n\t\t}\n\n\t\tif ( this.options.status ) {\n\t\t\tthis.views.set( '.upload-inline-status', new wp.media.view.UploaderStatus({\n\t\t\t\tcontroller: this.controller\n\t\t\t}) );\n\t\t}\n\t},\n\n\tprepare: function() {\n\t\tvar suggestedWidth = this.controller.state().get('suggestedWidth'),\n\t\t\tsuggestedHeight = this.controller.state().get('suggestedHeight'),\n\t\t\tdata = {};\n\n\t\tdata.message = this.options.message;\n\t\tdata.canClose = this.options.canClose;\n\n\t\tif ( suggestedWidth && suggestedHeight ) {\n\t\t\tdata.suggestedWidth = suggestedWidth;\n\t\t\tdata.suggestedHeight = suggestedHeight;\n\t\t}\n\n\t\treturn data;\n\t},\n\t/**\n\t * @return {wp.media.view.UploaderInline} Returns itself to allow chaining.\n\t */\n\tdispose: function() {\n\t\tif ( this.disposing ) {\n\t\t\t/**\n\t\t\t * call 'dispose' directly on the parent class\n\t\t\t */\n\t\t\treturn View.prototype.dispose.apply( this, arguments );\n\t\t}\n\n\t\t/*\n\t\t * Run remove on `dispose`, so we can be sure to refresh the\n\t\t * uploader with a view-less DOM. Track whether we're disposing\n\t\t * so we don't trigger an infinite loop.\n\t\t */\n\t\tthis.disposing = true;\n\t\treturn this.remove();\n\t},\n\t/**\n\t * @return {wp.media.view.UploaderInline} Returns itself to allow chaining.\n\t */\n\tremove: function() {\n\t\t/**\n\t\t * call 'remove' directly on the parent class\n\t\t */\n\t\tvar result = View.prototype.remove.apply( this, arguments );\n\n\t\t_.defer( _.bind( this.refresh, this ) );\n\t\treturn result;\n\t},\n\n\trefresh: function() {\n\t\tvar uploader = this.controller.uploader;\n\n\t\tif ( uploader ) {\n\t\t\tuploader.refresh();\n\t\t}\n\t},\n\t/**\n\t * @return {wp.media.view.UploaderInline}\n\t */\n\tready: function() {\n\t\tvar $browser = this.options.$browser,\n\t\t\t$placeholder;\n\n\t\tif ( this.controller.uploader ) {\n\t\t\t$placeholder = this.$('.browser');\n\n\t\t\t// Check if we've already replaced the placeholder.\n\t\t\tif ( $placeholder[0] === $browser[0] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$browser.detach().text( $placeholder.text() );\n\t\t\t$browser[0].className = $placeholder[0].className;\n\t\t\t$browser[0].setAttribute( 'aria-labelledby', $browser[0].id + ' ' + $placeholder[0].getAttribute('aria-labelledby') );\n\t\t\t$placeholder.replaceWith( $browser.show() );\n\t\t}\n\n\t\tthis.refresh();\n\t\treturn this;\n\t},\n\tshow: function() {\n\t\tthis.$el.removeClass( 'hidden' );\n\t\tif ( this.controller.$uploaderToggler && this.controller.$uploaderToggler.length ) {\n\t\t\tthis.controller.$uploaderToggler.attr( 'aria-expanded', 'true' );\n\t\t}\n\t},\n\thide: function() {\n\t\tthis.$el.addClass( 'hidden' );\n\t\tif ( this.controller.$uploaderToggler && this.controller.$uploaderToggler.length ) {\n\t\t\tthis.controller.$uploaderToggler\n\t\t\t\t.attr( 'aria-expanded', 'false' )\n\t\t\t\t// Move focus back to the toggle button when closing the uploader.\n\t\t\t\t.trigger( 'focus' );\n\t\t}\n\t}\n\n});\n\nmodule.exports = UploaderInline;\n\n\n/***/ }),\n\n/***/ \"99yY\":\n/***/ (function(module, exports) {\n\nvar Library = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tGalleryEdit;\n\n/**\n * wp.media.controller.GalleryEdit\n *\n * A state for editing a gallery's images and settings.\n *\n * @since 3.5.0\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @memberOf wp.media.controller\n *\n * @param {Object}                     [attributes]                       The attributes hash passed to the state.\n * @param {string}                     [attributes.id=gallery-edit]       Unique identifier.\n * @param {string}                     [attributes.title=Edit Gallery]    Title for the state. Displays in the frame's title region.\n * @param {wp.media.model.Attachments} [attributes.library]               The collection of attachments in the gallery.\n *                                                                        If one is not supplied, an empty media.model.Selection collection is created.\n * @param {boolean}                    [attributes.multiple=false]        Whether multi-select is enabled.\n * @param {boolean}                    [attributes.searchable=false]      Whether the library is searchable.\n * @param {boolean}                    [attributes.sortable=true]         Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.date=true]             Whether to show the date filter in the browser's toolbar.\n * @param {string|false}               [attributes.content=browse]        Initial mode for the content region.\n * @param {string|false}               [attributes.toolbar=image-details] Initial mode for the toolbar region.\n * @param {boolean}                    [attributes.describe=true]         Whether to offer UI to describe attachments - e.g. captioning images in a gallery.\n * @param {boolean}                    [attributes.displaySettings=true]  Whether to show the attachment display settings interface.\n * @param {boolean}                    [attributes.dragInfo=true]         Whether to show instructional text about the attachments being sortable.\n * @param {number}                     [attributes.idealColumnWidth=170]  The ideal column width in pixels for attachments.\n * @param {boolean}                    [attributes.editing=false]         Whether the gallery is being created, or editing an existing instance.\n * @param {number}                     [attributes.priority=60]           The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.syncSelection=false]   Whether the Attachments selection should be persisted from the last state.\n *                                                                        Defaults to false for this state, because the library passed in  *is* the selection.\n * @param {view}                       [attributes.AttachmentView]        The single `Attachment` view to be used in the `Attachments`.\n *                                                                        If none supplied, defaults to wp.media.view.Attachment.EditLibrary.\n */\nGalleryEdit = Library.extend(/** @lends wp.media.controller.GalleryEdit.prototype */{\n\tdefaults: {\n\t\tid:               'gallery-edit',\n\t\ttitle:            l10n.editGalleryTitle,\n\t\tmultiple:         false,\n\t\tsearchable:       false,\n\t\tsortable:         true,\n\t\tdate:             false,\n\t\tdisplay:          false,\n\t\tcontent:          'browse',\n\t\ttoolbar:          'gallery-edit',\n\t\tdescribe:         true,\n\t\tdisplaySettings:  true,\n\t\tdragInfo:         true,\n\t\tidealColumnWidth: 170,\n\t\tediting:          false,\n\t\tpriority:         60,\n\t\tsyncSelection:    false\n\t},\n\n\t/**\n\t * Initializes the library.\n\t *\n\t * Creates a selection if a library isn't supplied and creates an attachment\n\t * view if no attachment view is supplied.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {void}\n\t */\n\tinitialize: function() {\n\t\t// If we haven't been provided a `library`, create a `Selection`.\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', new wp.media.model.Selection() );\n\t\t}\n\n\t\t// The single `Attachment` view to be used in the `Attachments` view.\n\t\tif ( ! this.get('AttachmentView') ) {\n\t\t\tthis.set( 'AttachmentView', wp.media.view.Attachment.EditLibrary );\n\t\t}\n\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * Activates the library.\n\t *\n\t * Limits the library to images, watches for uploaded attachments. Watches for\n\t * the browse event on the frame and binds it to gallerySettings.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {void}\n\t */\n\tactivate: function() {\n\t\tvar library = this.get('library');\n\n\t\t// Limit the library to images only.\n\t\tlibrary.props.set( 'type', 'image' );\n\n\t\t// Watch for uploaded attachments.\n\t\tthis.get('library').observe( wp.Uploader.queue );\n\n\t\tthis.frame.on( 'content:render:browse', this.gallerySettings, this );\n\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t},\n\n\t/**\n\t * Deactivates the library.\n\t *\n\t * Stops watching for uploaded attachments and browse events.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {void}\n\t */\n\tdeactivate: function() {\n\t\t// Stop watching for uploaded attachments.\n\t\tthis.get('library').unobserve( wp.Uploader.queue );\n\n\t\tthis.frame.off( 'content:render:browse', this.gallerySettings, this );\n\n\t\tLibrary.prototype.deactivate.apply( this, arguments );\n\t},\n\n\t/**\n\t * Adds the gallery settings to the sidebar and adds a reverse button to the\n\t * toolbar.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {wp.media.view.Frame} browser The file browser.\n\t *\n\t * @return {void}\n\t */\n\tgallerySettings: function( browser ) {\n\t\tif ( ! this.get('displaySettings') ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar library = this.get('library');\n\n\t\tif ( ! library || ! browser ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlibrary.gallery = library.gallery || new Backbone.Model();\n\n\t\tbrowser.sidebar.set({\n\t\t\tgallery: new wp.media.view.Settings.Gallery({\n\t\t\t\tcontroller: this,\n\t\t\t\tmodel:      library.gallery,\n\t\t\t\tpriority:   40\n\t\t\t})\n\t\t});\n\n\t\tbrowser.toolbar.set( 'reverse', {\n\t\t\ttext:     l10n.reverseOrder,\n\t\t\tpriority: 80,\n\n\t\t\tclick: function() {\n\t\t\t\tlibrary.reset( library.toArray().reverse() );\n\t\t\t}\n\t\t});\n\t}\n});\n\nmodule.exports = GalleryEdit;\n\n\n/***/ }),\n\n/***/ \"9ARG\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Sidebar\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.view.PriorityList\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Sidebar = wp.media.view.PriorityList.extend(/** @lends wp.media.view.Sidebar.prototype */{\n\tclassName: 'media-sidebar'\n});\n\nmodule.exports = Sidebar;\n\n\n/***/ }),\n\n/***/ \"Bbnu\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.View\n *\n * The base view class for media.\n *\n * Undelegating events, removing events from the model, and\n * removing events from the controller mirror the code for\n * `Backbone.View.dispose` in Backbone 0.9.8 development.\n *\n * This behavior has since been removed, and should not be used\n * outside of the media manager.\n *\n * @memberOf wp.media\n *\n * @class\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.Backbone.View.extend(/** @lends wp.media.View.prototype */{\n\tconstructor: function( options ) {\n\t\tif ( options && options.controller ) {\n\t\t\tthis.controller = options.controller;\n\t\t}\n\t\twp.Backbone.View.apply( this, arguments );\n\t},\n\t/**\n\t * @todo The internal comment mentions this might have been a stop-gap\n\t *       before Backbone 0.9.8 came out. Figure out if Backbone core takes\n\t *       care of this in Backbone.View now.\n\t *\n\t * @return {wp.media.View} Returns itself to allow chaining.\n\t */\n\tdispose: function() {\n\t\t/*\n\t\t * Undelegating events, removing events from the model, and\n\t\t * removing events from the controller mirror the code for\n\t\t * `Backbone.View.dispose` in Backbone 0.9.8 development.\n\t\t */\n\t\tthis.undelegateEvents();\n\n\t\tif ( this.model && this.model.off ) {\n\t\t\tthis.model.off( null, null, this );\n\t\t}\n\n\t\tif ( this.collection && this.collection.off ) {\n\t\t\tthis.collection.off( null, null, this );\n\t\t}\n\n\t\t// Unbind controller events.\n\t\tif ( this.controller && this.controller.off ) {\n\t\t\tthis.controller.off( null, null, this );\n\t\t}\n\n\t\treturn this;\n\t},\n\t/**\n\t * @return {wp.media.View} Returns itself to allow chaining.\n\t */\n\tremove: function() {\n\t\tthis.dispose();\n\t\t/**\n\t\t * call 'remove' directly on the parent class\n\t\t */\n\t\treturn wp.Backbone.View.prototype.remove.apply( this, arguments );\n\t}\n});\n\nmodule.exports = View;\n\n\n/***/ }),\n\n/***/ \"EVvK\":\n/***/ (function(module, exports) {\n\nvar Menu = wp.media.view.Menu,\n\tRouter;\n\n/**\n * wp.media.view.Router\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.view.Menu\n * @augments wp.media.view.PriorityList\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nRouter = Menu.extend(/** @lends wp.media.view.Router.prototype */{\n\ttagName:   'div',\n\tclassName: 'media-router',\n\tproperty:  'contentMode',\n\tItemView:  wp.media.view.RouterItem,\n\tregion:    'router',\n\n\tattributes: {\n\t\trole:               'tablist',\n\t\t'aria-orientation': 'horizontal'\n\t},\n\n\tinitialize: function() {\n\t\tthis.controller.on( 'content:render', this.update, this );\n\t\t// Call 'initialize' directly on the parent class.\n\t\tMenu.prototype.initialize.apply( this, arguments );\n\t},\n\n\tupdate: function() {\n\t\tvar mode = this.controller.content.mode();\n\t\tif ( mode ) {\n\t\t\tthis.select( mode );\n\t\t}\n\t}\n});\n\nmodule.exports = Router;\n\n\n/***/ }),\n\n/***/ \"EvXF\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Attachment.EditLibrary\n *\n * @memberOf wp.media.view.Attachment\n *\n * @class\n * @augments wp.media.view.Attachment\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar EditLibrary = wp.media.view.Attachment.extend(/** @lends wp.media.view.Attachment.EditLibrary.prototype */{\n\tbuttons: {\n\t\tclose: true\n\t}\n});\n\nmodule.exports = EditLibrary;\n\n\n/***/ }),\n\n/***/ \"F/kE\":\n/***/ (function(module, exports) {\n\nvar l10n = wp.media.view.l10n,\n\tgetUserSetting = window.getUserSetting,\n\tsetUserSetting = window.setUserSetting,\n\tLibrary;\n\n/**\n * wp.media.controller.Library\n *\n * A state for choosing an attachment or group of attachments from the media library.\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n * @mixes media.selectionSync\n *\n * @param {object}                          [attributes]                         The attributes hash passed to the state.\n * @param {string}                          [attributes.id=library]              Unique identifier.\n * @param {string}                          [attributes.title=Media library]     Title for the state. Displays in the media menu and the frame's title region.\n * @param {wp.media.model.Attachments}      [attributes.library]                 The attachments collection to browse.\n *                                                                               If one is not supplied, a collection of all attachments will be created.\n * @param {wp.media.model.Selection|object} [attributes.selection]               A collection to contain attachment selections within the state.\n *                                                                               If the 'selection' attribute is a plain JS object,\n *                                                                               a Selection will be created using its values as the selection instance's `props` model.\n *                                                                               Otherwise, it will copy the library's `props` model.\n * @param {boolean}                         [attributes.multiple=false]          Whether multi-select is enabled.\n * @param {string}                          [attributes.content=upload]          Initial mode for the content region.\n *                                                                               Overridden by persistent user setting if 'contentUserSetting' is true.\n * @param {string}                          [attributes.menu=default]            Initial mode for the menu region.\n * @param {string}                          [attributes.router=browse]           Initial mode for the router region.\n * @param {string}                          [attributes.toolbar=select]          Initial mode for the toolbar region.\n * @param {boolean}                         [attributes.searchable=true]         Whether the library is searchable.\n * @param {boolean|string}                  [attributes.filterable=false]        Whether the library is filterable, and if so what filters should be shown.\n *                                                                               Accepts 'all', 'uploaded', or 'unattached'.\n * @param {boolean}                         [attributes.sortable=true]           Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                         [attributes.autoSelect=true]         Whether an uploaded attachment should be automatically added to the selection.\n * @param {boolean}                         [attributes.describe=false]          Whether to offer UI to describe attachments - e.g. captioning images in a gallery.\n * @param {boolean}                         [attributes.contentUserSetting=true] Whether the content region's mode should be set and persisted per user.\n * @param {boolean}                         [attributes.syncSelection=true]      Whether the Attachments selection should be persisted from the last state.\n */\nLibrary = wp.media.controller.State.extend(/** @lends wp.media.controller.Library.prototype */{\n\tdefaults: {\n\t\tid:                 'library',\n\t\ttitle:              l10n.mediaLibraryTitle,\n\t\tmultiple:           false,\n\t\tcontent:            'upload',\n\t\tmenu:               'default',\n\t\trouter:             'browse',\n\t\ttoolbar:            'select',\n\t\tsearchable:         true,\n\t\tfilterable:         false,\n\t\tsortable:           true,\n\t\tautoSelect:         true,\n\t\tdescribe:           false,\n\t\tcontentUserSetting: true,\n\t\tsyncSelection:      true\n\t},\n\n\t/**\n\t * If a library isn't provided, query all media items.\n\t * If a selection instance isn't provided, create one.\n\t *\n\t * @since 3.5.0\n\t */\n\tinitialize: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tprops;\n\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', wp.media.query() );\n\t\t}\n\n\t\tif ( ! ( selection instanceof wp.media.model.Selection ) ) {\n\t\t\tprops = selection;\n\n\t\t\tif ( ! props ) {\n\t\t\t\tprops = this.get('library').props.toJSON();\n\t\t\t\tprops = _.omit( props, 'orderby', 'query' );\n\t\t\t}\n\n\t\t\tthis.set( 'selection', new wp.media.model.Selection( null, {\n\t\t\t\tmultiple: this.get('multiple'),\n\t\t\t\tprops: props\n\t\t\t}) );\n\t\t}\n\n\t\tthis.resetDisplays();\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tactivate: function() {\n\t\tthis.syncSelection();\n\n\t\twp.Uploader.queue.on( 'add', this.uploading, this );\n\n\t\tthis.get('selection').on( 'add remove reset', this.refreshContent, this );\n\n\t\tif ( this.get( 'router' ) && this.get('contentUserSetting') ) {\n\t\t\tthis.frame.on( 'content:activate', this.saveContentMode, this );\n\t\t\tthis.set( 'content', getUserSetting( 'libraryContent', this.get('content') ) );\n\t\t}\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tdeactivate: function() {\n\t\tthis.recordSelection();\n\n\t\tthis.frame.off( 'content:activate', this.saveContentMode, this );\n\n\t\t// Unbind all event handlers that use this state as the context\n\t\t// from the selection.\n\t\tthis.get('selection').off( null, null, this );\n\n\t\twp.Uploader.queue.off( null, null, this );\n\t},\n\n\t/**\n\t * Reset the library to its initial state.\n\t *\n\t * @since 3.5.0\n\t */\n\treset: function() {\n\t\tthis.get('selection').reset();\n\t\tthis.resetDisplays();\n\t\tthis.refreshContent();\n\t},\n\n\t/**\n\t * Reset the attachment display settings defaults to the site options.\n\t *\n\t * If site options don't define them, fall back to a persistent user setting.\n\t *\n\t * @since 3.5.0\n\t */\n\tresetDisplays: function() {\n\t\tvar defaultProps = wp.media.view.settings.defaultProps;\n\t\tthis._displays = [];\n\t\tthis._defaultDisplaySettings = {\n\t\t\talign: getUserSetting( 'align', defaultProps.align ) || 'none',\n\t\t\tsize:  getUserSetting( 'imgsize', defaultProps.size ) || 'medium',\n\t\t\tlink:  getUserSetting( 'urlbutton', defaultProps.link ) || 'none'\n\t\t};\n\t},\n\n\t/**\n\t * Create a model to represent display settings (alignment, etc.) for an attachment.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @return {Backbone.Model}\n\t */\n\tdisplay: function( attachment ) {\n\t\tvar displays = this._displays;\n\n\t\tif ( ! displays[ attachment.cid ] ) {\n\t\t\tdisplays[ attachment.cid ] = new Backbone.Model( this.defaultDisplaySettings( attachment ) );\n\t\t}\n\t\treturn displays[ attachment.cid ];\n\t},\n\n\t/**\n\t * Given an attachment, create attachment display settings properties.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @return {Object}\n\t */\n\tdefaultDisplaySettings: function( attachment ) {\n\t\tvar settings = _.clone( this._defaultDisplaySettings );\n\n\t\tsettings.canEmbed = this.canEmbed( attachment );\n\t\tif ( settings.canEmbed ) {\n\t\t\tsettings.link = 'embed';\n\t\t} else if ( ! this.isImageAttachment( attachment ) && settings.link === 'none' ) {\n\t\t\tsettings.link = 'file';\n\t\t}\n\n\t\treturn settings;\n\t},\n\n\t/**\n\t * Whether an attachment is image.\n\t *\n\t * @since 4.4.1\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @return {boolean}\n\t */\n\tisImageAttachment: function( attachment ) {\n\t\t// If uploading, we know the filename but not the mime type.\n\t\tif ( attachment.get('uploading') ) {\n\t\t\treturn /\\.(jpe?g|png|gif|webp)$/i.test( attachment.get('filename') );\n\t\t}\n\n\t\treturn attachment.get('type') === 'image';\n\t},\n\n\t/**\n\t * Whether an attachment can be embedded (audio or video).\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @return {boolean}\n\t */\n\tcanEmbed: function( attachment ) {\n\t\t// If uploading, we know the filename but not the mime type.\n\t\tif ( ! attachment.get('uploading') ) {\n\t\t\tvar type = attachment.get('type');\n\t\t\tif ( type !== 'audio' && type !== 'video' ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn _.contains( wp.media.view.settings.embedExts, attachment.get('filename').split('.').pop() );\n\t},\n\n\n\t/**\n\t * If the state is active, no items are selected, and the current\n\t * content mode is not an option in the state's router (provided\n\t * the state has a router), reset the content mode to the default.\n\t *\n\t * @since 3.5.0\n\t */\n\trefreshContent: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tframe = this.frame,\n\t\t\trouter = frame.router.get(),\n\t\t\tmode = frame.content.mode();\n\n\t\tif ( this.active && ! selection.length && router && ! router.get( mode ) ) {\n\t\t\tthis.frame.content.render( this.get('content') );\n\t\t}\n\t},\n\n\t/**\n\t * Callback handler when an attachment is uploaded.\n\t *\n\t * Switch to the Media Library if uploaded from the 'Upload Files' tab.\n\t *\n\t * Adds any uploading attachments to the selection.\n\t *\n\t * If the state only supports one attachment to be selected and multiple\n\t * attachments are uploaded, the last attachment in the upload queue will\n\t * be selected.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t */\n\tuploading: function( attachment ) {\n\t\tvar content = this.frame.content;\n\n\t\tif ( 'upload' === content.mode() ) {\n\t\t\tthis.frame.content.mode('browse');\n\t\t}\n\n\t\tif ( this.get( 'autoSelect' ) ) {\n\t\t\tthis.get('selection').add( attachment );\n\t\t\tthis.frame.trigger( 'library:selection:add' );\n\t\t}\n\t},\n\n\t/**\n\t * Persist the mode of the content region as a user setting.\n\t *\n\t * @since 3.5.0\n\t */\n\tsaveContentMode: function() {\n\t\tif ( 'browse' !== this.get('router') ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar mode = this.frame.content.mode(),\n\t\t\tview = this.frame.router.get();\n\n\t\tif ( view && view.get( mode ) ) {\n\t\t\tsetUserSetting( 'libraryContent', mode );\n\t\t}\n\t}\n\n});\n\n// Make selectionSync available on any Media Library state.\n_.extend( Library.prototype, wp.media.selectionSync );\n\nmodule.exports = Library;\n\n\n/***/ }),\n\n/***/ \"GXJ6\":\n/***/ (function(module, exports) {\n\nvar AttachmentDisplay = wp.media.view.Settings.AttachmentDisplay,\n\t$ = jQuery,\n\tImageDetails;\n\n/**\n * wp.media.view.ImageDetails\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.view.Settings.AttachmentDisplay\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nImageDetails = AttachmentDisplay.extend(/** @lends wp.media.view.ImageDetails.prototype */{\n\tclassName: 'image-details',\n\ttemplate:  wp.template('image-details'),\n\tevents: _.defaults( AttachmentDisplay.prototype.events, {\n\t\t'click .edit-attachment': 'editAttachment',\n\t\t'click .replace-attachment': 'replaceAttachment',\n\t\t'click .advanced-toggle': 'onToggleAdvanced',\n\t\t'change [data-setting=\"customWidth\"]': 'onCustomSize',\n\t\t'change [data-setting=\"customHeight\"]': 'onCustomSize',\n\t\t'keyup [data-setting=\"customWidth\"]': 'onCustomSize',\n\t\t'keyup [data-setting=\"customHeight\"]': 'onCustomSize'\n\t} ),\n\tinitialize: function() {\n\t\t// Used in AttachmentDisplay.prototype.updateLinkTo.\n\t\tthis.options.attachment = this.model.attachment;\n\t\tthis.listenTo( this.model, 'change:url', this.updateUrl );\n\t\tthis.listenTo( this.model, 'change:link', this.toggleLinkSettings );\n\t\tthis.listenTo( this.model, 'change:size', this.toggleCustomSize );\n\n\t\tAttachmentDisplay.prototype.initialize.apply( this, arguments );\n\t},\n\n\tprepare: function() {\n\t\tvar attachment = false;\n\n\t\tif ( this.model.attachment ) {\n\t\t\tattachment = this.model.attachment.toJSON();\n\t\t}\n\t\treturn _.defaults({\n\t\t\tmodel: this.model.toJSON(),\n\t\t\tattachment: attachment\n\t\t}, this.options );\n\t},\n\n\trender: function() {\n\t\tvar args = arguments;\n\n\t\tif ( this.model.attachment && 'pending' === this.model.dfd.state() ) {\n\t\t\tthis.model.dfd\n\t\t\t\t.done( _.bind( function() {\n\t\t\t\t\tAttachmentDisplay.prototype.render.apply( this, args );\n\t\t\t\t\tthis.postRender();\n\t\t\t\t}, this ) )\n\t\t\t\t.fail( _.bind( function() {\n\t\t\t\t\tthis.model.attachment = false;\n\t\t\t\t\tAttachmentDisplay.prototype.render.apply( this, args );\n\t\t\t\t\tthis.postRender();\n\t\t\t\t}, this ) );\n\t\t} else {\n\t\t\tAttachmentDisplay.prototype.render.apply( this, arguments );\n\t\t\tthis.postRender();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tpostRender: function() {\n\t\tsetTimeout( _.bind( this.scrollToTop, this ), 10 );\n\t\tthis.toggleLinkSettings();\n\t\tif ( window.getUserSetting( 'advImgDetails' ) === 'show' ) {\n\t\t\tthis.toggleAdvanced( true );\n\t\t}\n\t\tthis.trigger( 'post-render' );\n\t},\n\n\tscrollToTop: function() {\n\t\tthis.$( '.embed-media-settings' ).scrollTop( 0 );\n\t},\n\n\tupdateUrl: function() {\n\t\tthis.$( '.image img' ).attr( 'src', this.model.get( 'url' ) );\n\t\tthis.$( '.url' ).val( this.model.get( 'url' ) );\n\t},\n\n\ttoggleLinkSettings: function() {\n\t\tif ( this.model.get( 'link' ) === 'none' ) {\n\t\t\tthis.$( '.link-settings' ).addClass('hidden');\n\t\t} else {\n\t\t\tthis.$( '.link-settings' ).removeClass('hidden');\n\t\t}\n\t},\n\n\ttoggleCustomSize: function() {\n\t\tif ( this.model.get( 'size' ) !== 'custom' ) {\n\t\t\tthis.$( '.custom-size' ).addClass('hidden');\n\t\t} else {\n\t\t\tthis.$( '.custom-size' ).removeClass('hidden');\n\t\t}\n\t},\n\n\tonCustomSize: function( event ) {\n\t\tvar dimension = $( event.target ).data('setting'),\n\t\t\tnum = $( event.target ).val(),\n\t\t\tvalue;\n\n\t\t// Ignore bogus input.\n\t\tif ( ! /^\\d+/.test( num ) || parseInt( num, 10 ) < 1 ) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( dimension === 'customWidth' ) {\n\t\t\tvalue = Math.round( 1 / this.model.get( 'aspectRatio' ) * num );\n\t\t\tthis.model.set( 'customHeight', value, { silent: true } );\n\t\t\tthis.$( '[data-setting=\"customHeight\"]' ).val( value );\n\t\t} else {\n\t\t\tvalue = Math.round( this.model.get( 'aspectRatio' ) * num );\n\t\t\tthis.model.set( 'customWidth', value, { silent: true  } );\n\t\t\tthis.$( '[data-setting=\"customWidth\"]' ).val( value );\n\t\t}\n\t},\n\n\tonToggleAdvanced: function( event ) {\n\t\tevent.preventDefault();\n\t\tthis.toggleAdvanced();\n\t},\n\n\ttoggleAdvanced: function( show ) {\n\t\tvar $advanced = this.$el.find( '.advanced-section' ),\n\t\t\tmode;\n\n\t\tif ( $advanced.hasClass('advanced-visible') || show === false ) {\n\t\t\t$advanced.removeClass('advanced-visible');\n\t\t\t$advanced.find('.advanced-settings').addClass('hidden');\n\t\t\tmode = 'hide';\n\t\t} else {\n\t\t\t$advanced.addClass('advanced-visible');\n\t\t\t$advanced.find('.advanced-settings').removeClass('hidden');\n\t\t\tmode = 'show';\n\t\t}\n\n\t\twindow.setUserSetting( 'advImgDetails', mode );\n\t},\n\n\teditAttachment: function( event ) {\n\t\tvar editState = this.controller.states.get( 'edit-image' );\n\n\t\tif ( window.imageEdit && editState ) {\n\t\t\tevent.preventDefault();\n\t\t\teditState.set( 'image', this.model.attachment );\n\t\t\tthis.controller.setState( 'edit-image' );\n\t\t}\n\t},\n\n\treplaceAttachment: function( event ) {\n\t\tevent.preventDefault();\n\t\tthis.controller.setState( 'replace-image' );\n\t}\n});\n\nmodule.exports = ImageDetails;\n\n\n/***/ }),\n\n/***/ \"GXkx\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\tl10n = wp.media.view.l10n,\n\t$ = jQuery,\n\tEditorUploader;\n\n/**\n * Creates a dropzone on WP editor instances (elements with .wp-editor-wrap)\n * and relays drag'n'dropped files to a media workflow.\n *\n * wp.media.view.EditorUploader\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nEditorUploader = View.extend(/** @lends wp.media.view.EditorUploader.prototype */{\n\ttagName:   'div',\n\tclassName: 'uploader-editor',\n\ttemplate:  wp.template( 'uploader-editor' ),\n\n\tlocalDrag: false,\n\toverContainer: false,\n\toverDropzone: false,\n\tdraggingFile: null,\n\n\t/**\n\t * Bind drag'n'drop events to callbacks.\n\t */\n\tinitialize: function() {\n\t\tthis.initialized = false;\n\n\t\t// Bail if not enabled or UA does not support drag'n'drop or File API.\n\t\tif ( ! window.tinyMCEPreInit || ! window.tinyMCEPreInit.dragDropUpload || ! this.browserSupport() ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.$document = $(document);\n\t\tthis.dropzones = [];\n\t\tthis.files = [];\n\n\t\tthis.$document.on( 'drop', '.uploader-editor', _.bind( this.drop, this ) );\n\t\tthis.$document.on( 'dragover', '.uploader-editor', _.bind( this.dropzoneDragover, this ) );\n\t\tthis.$document.on( 'dragleave', '.uploader-editor', _.bind( this.dropzoneDragleave, this ) );\n\t\tthis.$document.on( 'click', '.uploader-editor', _.bind( this.click, this ) );\n\n\t\tthis.$document.on( 'dragover', _.bind( this.containerDragover, this ) );\n\t\tthis.$document.on( 'dragleave', _.bind( this.containerDragleave, this ) );\n\n\t\tthis.$document.on( 'dragstart dragend drop', _.bind( function( event ) {\n\t\t\tthis.localDrag = event.type === 'dragstart';\n\n\t\t\tif ( event.type === 'drop' ) {\n\t\t\t\tthis.containerDragleave();\n\t\t\t}\n\t\t}, this ) );\n\n\t\tthis.initialized = true;\n\t\treturn this;\n\t},\n\n\t/**\n\t * Check browser support for drag'n'drop.\n\t *\n\t * @return {boolean}\n\t */\n\tbrowserSupport: function() {\n\t\tvar supports = false, div = document.createElement('div');\n\n\t\tsupports = ( 'draggable' in div ) || ( 'ondragstart' in div && 'ondrop' in div );\n\t\tsupports = supports && !! ( window.File && window.FileList && window.FileReader );\n\t\treturn supports;\n\t},\n\n\tisDraggingFile: function( event ) {\n\t\tif ( this.draggingFile !== null ) {\n\t\t\treturn this.draggingFile;\n\t\t}\n\n\t\tif ( _.isUndefined( event.originalEvent ) || _.isUndefined( event.originalEvent.dataTransfer ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.draggingFile = _.indexOf( event.originalEvent.dataTransfer.types, 'Files' ) > -1 &&\n\t\t\t_.indexOf( event.originalEvent.dataTransfer.types, 'text/plain' ) === -1;\n\n\t\treturn this.draggingFile;\n\t},\n\n\trefresh: function( e ) {\n\t\tvar dropzone_id;\n\t\tfor ( dropzone_id in this.dropzones ) {\n\t\t\t// Hide the dropzones only if dragging has left the screen.\n\t\t\tthis.dropzones[ dropzone_id ].toggle( this.overContainer || this.overDropzone );\n\t\t}\n\n\t\tif ( ! _.isUndefined( e ) ) {\n\t\t\t$( e.target ).closest( '.uploader-editor' ).toggleClass( 'droppable', this.overDropzone );\n\t\t}\n\n\t\tif ( ! this.overContainer && ! this.overDropzone ) {\n\t\t\tthis.draggingFile = null;\n\t\t}\n\n\t\treturn this;\n\t},\n\n\trender: function() {\n\t\tif ( ! this.initialized ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tView.prototype.render.apply( this, arguments );\n\t\t$( '.wp-editor-wrap' ).each( _.bind( this.attach, this ) );\n\t\treturn this;\n\t},\n\n\tattach: function( index, editor ) {\n\t\t// Attach a dropzone to an editor.\n\t\tvar dropzone = this.$el.clone();\n\t\tthis.dropzones.push( dropzone );\n\t\t$( editor ).append( dropzone );\n\t\treturn this;\n\t},\n\n\t/**\n\t * When a file is dropped on the editor uploader, open up an editor media workflow\n\t * and upload the file immediately.\n\t *\n\t * @param {jQuery.Event} event The 'drop' event.\n\t */\n\tdrop: function( event ) {\n\t\tvar $wrap, uploadView;\n\n\t\tthis.containerDragleave( event );\n\t\tthis.dropzoneDragleave( event );\n\n\t\tthis.files = event.originalEvent.dataTransfer.files;\n\t\tif ( this.files.length < 1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Set the active editor to the drop target.\n\t\t$wrap = $( event.target ).parents( '.wp-editor-wrap' );\n\t\tif ( $wrap.length > 0 && $wrap[0].id ) {\n\t\t\twindow.wpActiveEditor = $wrap[0].id.slice( 3, -5 );\n\t\t}\n\n\t\tif ( ! this.workflow ) {\n\t\t\tthis.workflow = wp.media.editor.open( window.wpActiveEditor, {\n\t\t\t\tframe:    'post',\n\t\t\t\tstate:    'insert',\n\t\t\t\ttitle:    l10n.addMedia,\n\t\t\t\tmultiple: true\n\t\t\t});\n\n\t\t\tuploadView = this.workflow.uploader;\n\n\t\t\tif ( uploadView.uploader && uploadView.uploader.ready ) {\n\t\t\t\tthis.addFiles.apply( this );\n\t\t\t} else {\n\t\t\t\tthis.workflow.on( 'uploader:ready', this.addFiles, this );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.workflow.state().reset();\n\t\t\tthis.addFiles.apply( this );\n\t\t\tthis.workflow.open();\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/**\n\t * Add the files to the uploader.\n\t */\n\taddFiles: function() {\n\t\tif ( this.files.length ) {\n\t\t\tthis.workflow.uploader.uploader.uploader.addFile( _.toArray( this.files ) );\n\t\t\tthis.files = [];\n\t\t}\n\t\treturn this;\n\t},\n\n\tcontainerDragover: function( event ) {\n\t\tif ( this.localDrag || ! this.isDraggingFile( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.overContainer = true;\n\t\tthis.refresh();\n\t},\n\n\tcontainerDragleave: function() {\n\t\tthis.overContainer = false;\n\n\t\t// Throttle dragleave because it's called when bouncing from some elements to others.\n\t\t_.delay( _.bind( this.refresh, this ), 50 );\n\t},\n\n\tdropzoneDragover: function( event ) {\n\t\tif ( this.localDrag || ! this.isDraggingFile( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.overDropzone = true;\n\t\tthis.refresh( event );\n\t\treturn false;\n\t},\n\n\tdropzoneDragleave: function( e ) {\n\t\tthis.overDropzone = false;\n\t\t_.delay( _.bind( this.refresh, this, e ), 50 );\n\t},\n\n\tclick: function( e ) {\n\t\t// In the rare case where the dropzone gets stuck, hide it on click.\n\t\tthis.containerDragleave( e );\n\t\tthis.dropzoneDragleave( e );\n\t\tthis.localDrag = false;\n\t}\n});\n\nmodule.exports = EditorUploader;\n\n\n/***/ }),\n\n/***/ \"I7TD\":\n/***/ (function(module, exports) {\n\nvar Attachment = wp.media.model.Attachment,\n\tLibrary = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tFeaturedImage;\n\n/**\n * wp.media.controller.FeaturedImage\n *\n * A state for selecting a featured image for a post.\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                     [attributes]                          The attributes hash passed to the state.\n * @param {string}                     [attributes.id=featured-image]        Unique identifier.\n * @param {string}                     [attributes.title=Set Featured Image] Title for the state. Displays in the media menu and the frame's title region.\n * @param {wp.media.model.Attachments} [attributes.library]                  The attachments collection to browse.\n *                                                                           If one is not supplied, a collection of all images will be created.\n * @param {boolean}                    [attributes.multiple=false]           Whether multi-select is enabled.\n * @param {string}                     [attributes.content=upload]           Initial mode for the content region.\n *                                                                           Overridden by persistent user setting if 'contentUserSetting' is true.\n * @param {string}                     [attributes.menu=default]             Initial mode for the menu region.\n * @param {string}                     [attributes.router=browse]            Initial mode for the router region.\n * @param {string}                     [attributes.toolbar=featured-image]   Initial mode for the toolbar region.\n * @param {int}                        [attributes.priority=60]              The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.searchable=true]          Whether the library is searchable.\n * @param {boolean|string}             [attributes.filterable=false]         Whether the library is filterable, and if so what filters should be shown.\n *                                                                           Accepts 'all', 'uploaded', or 'unattached'.\n * @param {boolean}                    [attributes.sortable=true]            Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.autoSelect=true]          Whether an uploaded attachment should be automatically added to the selection.\n * @param {boolean}                    [attributes.describe=false]           Whether to offer UI to describe attachments - e.g. captioning images in a gallery.\n * @param {boolean}                    [attributes.contentUserSetting=true]  Whether the content region's mode should be set and persisted per user.\n * @param {boolean}                    [attributes.syncSelection=true]       Whether the Attachments selection should be persisted from the last state.\n */\nFeaturedImage = Library.extend(/** @lends wp.media.controller.FeaturedImage.prototype */{\n\tdefaults: _.defaults({\n\t\tid:            'featured-image',\n\t\ttitle:         l10n.setFeaturedImageTitle,\n\t\tmultiple:      false,\n\t\tfilterable:    'uploaded',\n\t\ttoolbar:       'featured-image',\n\t\tpriority:      60,\n\t\tsyncSelection: true\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tinitialize: function() {\n\t\tvar library, comparator;\n\n\t\t// If we haven't been provided a `library`, create a `Selection`.\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', wp.media.query({ type: 'image' }) );\n\t\t}\n\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\n\t\tlibrary    = this.get('library');\n\t\tcomparator = library.comparator;\n\n\t\t// Overload the library's comparator to push items that are not in\n\t\t// the mirrored query to the front of the aggregate collection.\n\t\tlibrary.comparator = function( a, b ) {\n\t\t\tvar aInQuery = !! this.mirroring.get( a.cid ),\n\t\t\t\tbInQuery = !! this.mirroring.get( b.cid );\n\n\t\t\tif ( ! aInQuery && bInQuery ) {\n\t\t\t\treturn -1;\n\t\t\t} else if ( aInQuery && ! bInQuery ) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn comparator.apply( this, arguments );\n\t\t\t}\n\t\t};\n\n\t\t// Add all items in the selection to the library, so any featured\n\t\t// images that are not initially loaded still appear.\n\t\tlibrary.observe( this.get('selection') );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tactivate: function() {\n\t\tthis.frame.on( 'open', this.updateSelection, this );\n\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tdeactivate: function() {\n\t\tthis.frame.off( 'open', this.updateSelection, this );\n\n\t\tLibrary.prototype.deactivate.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tupdateSelection: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tid = wp.media.view.settings.post.featuredImageId,\n\t\t\tattachment;\n\n\t\tif ( '' !== id && -1 !== id ) {\n\t\t\tattachment = Attachment.get( id );\n\t\t\tattachment.fetch();\n\t\t}\n\n\t\tselection.reset( attachment ? [ attachment ] : [] );\n\t}\n});\n\nmodule.exports = FeaturedImage;\n\n\n/***/ }),\n\n/***/ \"IgEq\":\n/***/ (function(module, exports) {\n\nvar Toolbar = wp.media.view.Toolbar,\n\tl10n = wp.media.view.l10n,\n\tSelect;\n\n/**\n * wp.media.view.Toolbar.Select\n *\n * @memberOf wp.media.view.Toolbar\n *\n * @class\n * @augments wp.media.view.Toolbar\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nSelect = Toolbar.extend(/** @lends wp.media.view.Toolbar.Select.prototype */{\n\tinitialize: function() {\n\t\tvar options = this.options;\n\n\t\t_.bindAll( this, 'clickSelect' );\n\n\t\t_.defaults( options, {\n\t\t\tevent: 'select',\n\t\t\tstate: false,\n\t\t\treset: true,\n\t\t\tclose: true,\n\t\t\ttext:  l10n.select,\n\n\t\t\t// Does the button rely on the selection?\n\t\t\trequires: {\n\t\t\t\tselection: true\n\t\t\t}\n\t\t});\n\n\t\toptions.items = _.defaults( options.items || {}, {\n\t\t\tselect: {\n\t\t\t\tstyle:    'primary',\n\t\t\t\ttext:     options.text,\n\t\t\t\tpriority: 80,\n\t\t\t\tclick:    this.clickSelect,\n\t\t\t\trequires: options.requires\n\t\t\t}\n\t\t});\n\t\t// Call 'initialize' directly on the parent class.\n\t\tToolbar.prototype.initialize.apply( this, arguments );\n\t},\n\n\tclickSelect: function() {\n\t\tvar options = this.options,\n\t\t\tcontroller = this.controller;\n\n\t\tif ( options.close ) {\n\t\t\tcontroller.close();\n\t\t}\n\n\t\tif ( options.event ) {\n\t\t\tcontroller.state().trigger( options.event );\n\t\t}\n\n\t\tif ( options.state ) {\n\t\t\tcontroller.setState( options.state );\n\t\t}\n\n\t\tif ( options.reset ) {\n\t\t\tcontroller.reset();\n\t\t}\n\t}\n});\n\nmodule.exports = Select;\n\n\n/***/ }),\n\n/***/ \"IkWq\":\n/***/ (function(module, exports) {\n\nvar State = wp.media.controller.State,\n\tLibrary = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tImageDetails;\n\n/**\n * wp.media.controller.ImageDetails\n *\n * A state for editing the attachment display settings of an image that's been\n * inserted into the editor.\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                    [attributes]                       The attributes hash passed to the state.\n * @param {string}                    [attributes.id=image-details]      Unique identifier.\n * @param {string}                    [attributes.title=Image Details]   Title for the state. Displays in the frame's title region.\n * @param {wp.media.model.Attachment} attributes.image                   The image's model.\n * @param {string|false}              [attributes.content=image-details] Initial mode for the content region.\n * @param {string|false}              [attributes.menu=false]            Initial mode for the menu region.\n * @param {string|false}              [attributes.router=false]          Initial mode for the router region.\n * @param {string|false}              [attributes.toolbar=image-details] Initial mode for the toolbar region.\n * @param {boolean}                   [attributes.editing=false]         Unused.\n * @param {int}                       [attributes.priority=60]           Unused.\n *\n * @todo This state inherits some defaults from media.controller.Library.prototype.defaults,\n *       however this may not do anything.\n */\nImageDetails = State.extend(/** @lends wp.media.controller.ImageDetails.prototype */{\n\tdefaults: _.defaults({\n\t\tid:       'image-details',\n\t\ttitle:    l10n.imageDetailsTitle,\n\t\tcontent:  'image-details',\n\t\tmenu:     false,\n\t\trouter:   false,\n\t\ttoolbar:  'image-details',\n\t\tediting:  false,\n\t\tpriority: 60\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * @since 3.9.0\n\t *\n\t * @param options Attributes\n\t */\n\tinitialize: function( options ) {\n\t\tthis.image = options.image;\n\t\tState.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tactivate: function() {\n\t\tthis.frame.modal.$el.addClass('image-details');\n\t}\n});\n\nmodule.exports = ImageDetails;\n\n\n/***/ }),\n\n/***/ \"JecU\":\n/***/ (function(module, exports) {\n\nvar $ = jQuery,\n\tEmbedLink;\n\n/**\n * wp.media.view.EmbedLink\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nEmbedLink = wp.media.view.Settings.extend(/** @lends wp.media.view.EmbedLink.prototype */{\n\tclassName: 'embed-link-settings',\n\ttemplate:  wp.template('embed-link-settings'),\n\n\tinitialize: function() {\n\t\tthis.listenTo( this.model, 'change:url', this.updateoEmbed );\n\t},\n\n\tupdateoEmbed: _.debounce( function() {\n\t\tvar url = this.model.get( 'url' );\n\n\t\t// Clear out previous results.\n\t\tthis.$('.embed-container').hide().find('.embed-preview').empty();\n\t\tthis.$( '.setting' ).hide();\n\n\t\t// Only proceed with embed if the field contains more than 11 characters.\n\t\t// Example: http://a.io is 11 chars\n\t\tif ( url && ( url.length < 11 || ! url.match(/^http(s)?:\\/\\//) ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fetch();\n\t}, wp.media.controller.Embed.sensitivity ),\n\n\tfetch: function() {\n\t\tvar url = this.model.get( 'url' ), re, youTubeEmbedMatch;\n\n\t\t// Check if they haven't typed in 500 ms.\n\t\tif ( $('#embed-url-field').val() !== url ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.dfd && 'pending' === this.dfd.state() ) {\n\t\t\tthis.dfd.abort();\n\t\t}\n\n\t\t// Support YouTube embed urls, since they work once in the editor.\n\t\tre = /https?:\\/\\/www\\.youtube\\.com\\/embed\\/([^/]+)/;\n\t\tyouTubeEmbedMatch = re.exec( url );\n\t\tif ( youTubeEmbedMatch ) {\n\t\t\turl = 'https://www.youtube.com/watch?v=' + youTubeEmbedMatch[ 1 ];\n\t\t}\n\n\t\tthis.dfd = wp.apiRequest({\n\t\t\turl: wp.media.view.settings.oEmbedProxyUrl,\n\t\t\tdata: {\n\t\t\t\turl: url,\n\t\t\t\tmaxwidth: this.model.get( 'width' ),\n\t\t\t\tmaxheight: this.model.get( 'height' )\n\t\t\t},\n\t\t\ttype: 'GET',\n\t\t\tdataType: 'json',\n\t\t\tcontext: this\n\t\t})\n\t\t\t.done( function( response ) {\n\t\t\t\tthis.renderoEmbed( {\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tbody: response.html || ''\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} )\n\t\t\t.fail( this.renderFail );\n\t},\n\n\trenderFail: function ( response, status ) {\n\t\tif ( 'abort' === status ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.$( '.link-text' ).show();\n\t},\n\n\trenderoEmbed: function( response ) {\n\t\tvar html = ( response && response.data && response.data.body ) || '';\n\n\t\tif ( html ) {\n\t\t\tthis.$('.embed-container').show().find('.embed-preview').html( html );\n\t\t} else {\n\t\t\tthis.renderFail();\n\t\t}\n\t}\n});\n\nmodule.exports = EmbedLink;\n\n\n/***/ }),\n\n/***/ \"Ju2C\":\n/***/ (function(module, exports) {\n\nvar MenuItem = wp.media.view.MenuItem,\n\tPriorityList = wp.media.view.PriorityList,\n\tMenu;\n\n/**\n * wp.media.view.Menu\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.view.PriorityList\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nMenu = PriorityList.extend(/** @lends wp.media.view.Menu.prototype */{\n\ttagName:   'div',\n\tclassName: 'media-menu',\n\tproperty:  'state',\n\tItemView:  MenuItem,\n\tregion:    'menu',\n\n\tattributes: {\n\t\trole:               'tablist',\n\t\t'aria-orientation': 'horizontal'\n\t},\n\n\tinitialize: function() {\n\t\tthis._views = {};\n\n\t\tthis.set( _.extend( {}, this._views, this.options.views ), { silent: true });\n\t\tdelete this.options.views;\n\n\t\tif ( ! this.options.silent ) {\n\t\t\tthis.render();\n\t\t}\n\n\t\t// Initialize the Focus Manager.\n\t\tthis.focusManager = new wp.media.view.FocusManager( {\n\t\t\tel:   this.el,\n\t\t\tmode: 'tabsNavigation'\n\t\t} );\n\n\t\t// The menu is always rendered and can be visible or hidden on some frames.\n\t\tthis.isVisible = true;\n\t},\n\n\t/**\n\t * @param {Object} options\n\t * @param {string} id\n\t * @return {wp.media.View}\n\t */\n\ttoView: function( options, id ) {\n\t\toptions = options || {};\n\t\toptions[ this.property ] = options[ this.property ] || id;\n\t\treturn new this.ItemView( options ).render();\n\t},\n\n\tready: function() {\n\t\t/**\n\t\t * call 'ready' directly on the parent class\n\t\t */\n\t\tPriorityList.prototype.ready.apply( this, arguments );\n\t\tthis.visibility();\n\n\t\t// Set up aria tabs initial attributes.\n\t\tthis.focusManager.setupAriaTabs();\n\t},\n\n\tset: function() {\n\t\t/**\n\t\t * call 'set' directly on the parent class\n\t\t */\n\t\tPriorityList.prototype.set.apply( this, arguments );\n\t\tthis.visibility();\n\t},\n\n\tunset: function() {\n\t\t/**\n\t\t * call 'unset' directly on the parent class\n\t\t */\n\t\tPriorityList.prototype.unset.apply( this, arguments );\n\t\tthis.visibility();\n\t},\n\n\tvisibility: function() {\n\t\tvar region = this.region,\n\t\t\tview = this.controller[ region ].get(),\n\t\t\tviews = this.views.get(),\n\t\t\thide = ! views || views.length < 2;\n\n\t\tif ( this === view ) {\n\t\t\t// Flag this menu as hidden or visible.\n\t\t\tthis.isVisible = ! hide;\n\t\t\t// Set or remove a CSS class to hide the menu.\n\t\t\tthis.controller.$el.toggleClass( 'hide-' + region, hide );\n\t\t}\n\t},\n\t/**\n\t * @param {string} id\n\t */\n\tselect: function( id ) {\n\t\tvar view = this.get( id );\n\n\t\tif ( ! view ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.deselect();\n\t\tview.$el.addClass('active');\n\n\t\t// Set up again the aria tabs initial attributes after the menu updates.\n\t\tthis.focusManager.setupAriaTabs();\n\t},\n\n\tdeselect: function() {\n\t\tthis.$el.children().removeClass('active');\n\t},\n\n\thide: function( id ) {\n\t\tvar view = this.get( id );\n\n\t\tif ( ! view ) {\n\t\t\treturn;\n\t\t}\n\n\t\tview.$el.addClass('hidden');\n\t},\n\n\tshow: function( id ) {\n\t\tvar view = this.get( id );\n\n\t\tif ( ! view ) {\n\t\t\treturn;\n\t\t}\n\n\t\tview.$el.removeClass('hidden');\n\t}\n});\n\nmodule.exports = Menu;\n\n\n/***/ }),\n\n/***/ \"KerO\":\n/***/ (function(module, exports) {\n\nvar l10n = wp.media.view.l10n,\n\tAll;\n\n/**\n * wp.media.view.AttachmentFilters.All\n *\n * @memberOf wp.media.view.AttachmentFilters\n *\n * @class\n * @augments wp.media.view.AttachmentFilters\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nAll = wp.media.view.AttachmentFilters.extend(/** @lends wp.media.view.AttachmentFilters.All.prototype */{\n\tcreateFilters: function() {\n\t\tvar filters = {},\n\t\t\tuid = window.userSettings ? parseInt( window.userSettings.uid, 10 ) : 0;\n\n\t\t_.each( wp.media.view.settings.mimeTypes || {}, function( text, key ) {\n\t\t\tfilters[ key ] = {\n\t\t\t\ttext: text,\n\t\t\t\tprops: {\n\t\t\t\t\tstatus:  null,\n\t\t\t\t\ttype:    key,\n\t\t\t\t\tuploadedTo: null,\n\t\t\t\t\torderby: 'date',\n\t\t\t\t\torder:   'DESC',\n\t\t\t\t\tauthor:  null\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\n\t\tfilters.all = {\n\t\t\ttext:  l10n.allMediaItems,\n\t\t\tprops: {\n\t\t\t\tstatus:  null,\n\t\t\t\ttype:    null,\n\t\t\t\tuploadedTo: null,\n\t\t\t\torderby: 'date',\n\t\t\t\torder:   'DESC',\n\t\t\t\tauthor:  null\n\t\t\t},\n\t\t\tpriority: 10\n\t\t};\n\n\t\tif ( wp.media.view.settings.post.id ) {\n\t\t\tfilters.uploaded = {\n\t\t\t\ttext:  l10n.uploadedToThisPost,\n\t\t\t\tprops: {\n\t\t\t\t\tstatus:  null,\n\t\t\t\t\ttype:    null,\n\t\t\t\t\tuploadedTo: wp.media.view.settings.post.id,\n\t\t\t\t\torderby: 'menuOrder',\n\t\t\t\t\torder:   'ASC',\n\t\t\t\t\tauthor:  null\n\t\t\t\t},\n\t\t\t\tpriority: 20\n\t\t\t};\n\t\t}\n\n\t\tfilters.unattached = {\n\t\t\ttext:  l10n.unattached,\n\t\t\tprops: {\n\t\t\t\tstatus:     null,\n\t\t\t\tuploadedTo: 0,\n\t\t\t\ttype:       null,\n\t\t\t\torderby:    'menuOrder',\n\t\t\t\torder:      'ASC',\n\t\t\t\tauthor:     null\n\t\t\t},\n\t\t\tpriority: 50\n\t\t};\n\n\t\tif ( uid ) {\n\t\t\tfilters.mine = {\n\t\t\t\ttext:  l10n.mine,\n\t\t\t\tprops: {\n\t\t\t\t\tstatus:\t\tnull,\n\t\t\t\t\ttype:\t\tnull,\n\t\t\t\t\tuploadedTo:\tnull,\n\t\t\t\t\torderby:\t'date',\n\t\t\t\t\torder:\t\t'DESC',\n\t\t\t\t\tauthor:\t\tuid\n\t\t\t\t},\n\t\t\t\tpriority: 50\n\t\t\t};\n\t\t}\n\n\t\tif ( wp.media.view.settings.mediaTrash &&\n\t\t\tthis.controller.isModeActive( 'grid' ) ) {\n\n\t\t\tfilters.trash = {\n\t\t\t\ttext:  l10n.trash,\n\t\t\t\tprops: {\n\t\t\t\t\tuploadedTo: null,\n\t\t\t\t\tstatus:     'trash',\n\t\t\t\t\ttype:       null,\n\t\t\t\t\torderby:    'date',\n\t\t\t\t\torder:      'DESC',\n\t\t\t\t\tauthor:     null\n\t\t\t\t},\n\t\t\t\tpriority: 50\n\t\t\t};\n\t\t}\n\n\t\tthis.filters = filters;\n\t}\n});\n\nmodule.exports = All;\n\n\n/***/ }),\n\n/***/ \"LGdN\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Frame\n *\n * A frame is a composite view consisting of one or more regions and one or more\n * states.\n *\n * @memberOf wp.media.view\n *\n * @see wp.media.controller.State\n * @see wp.media.controller.Region\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nvar Frame = wp.media.View.extend(/** @lends wp.media.view.Frame.prototype */{\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\tmode: [ 'select' ]\n\t\t});\n\t\tthis._createRegions();\n\t\tthis._createStates();\n\t\tthis._createModes();\n\t},\n\n\t_createRegions: function() {\n\t\t// Clone the regions array.\n\t\tthis.regions = this.regions ? this.regions.slice() : [];\n\n\t\t// Initialize regions.\n\t\t_.each( this.regions, function( region ) {\n\t\t\tthis[ region ] = new wp.media.controller.Region({\n\t\t\t\tview:     this,\n\t\t\t\tid:       region,\n\t\t\t\tselector: '.media-frame-' + region\n\t\t\t});\n\t\t}, this );\n\t},\n\t/**\n\t * Create the frame's states.\n\t *\n\t * @see wp.media.controller.State\n\t * @see wp.media.controller.StateMachine\n\t *\n\t * @fires wp.media.controller.State#ready\n\t */\n\t_createStates: function() {\n\t\t// Create the default `states` collection.\n\t\tthis.states = new Backbone.Collection( null, {\n\t\t\tmodel: wp.media.controller.State\n\t\t});\n\n\t\t// Ensure states have a reference to the frame.\n\t\tthis.states.on( 'add', function( model ) {\n\t\t\tmodel.frame = this;\n\t\t\tmodel.trigger('ready');\n\t\t}, this );\n\n\t\tif ( this.options.states ) {\n\t\t\tthis.states.add( this.options.states );\n\t\t}\n\t},\n\n\t/**\n\t * A frame can be in a mode or multiple modes at one time.\n\t *\n\t * For example, the manage media frame can be in the `Bulk Select` or `Edit` mode.\n\t */\n\t_createModes: function() {\n\t\t// Store active \"modes\" that the frame is in. Unrelated to region modes.\n\t\tthis.activeModes = new Backbone.Collection();\n\t\tthis.activeModes.on( 'add remove reset', _.bind( this.triggerModeEvents, this ) );\n\n\t\t_.each( this.options.mode, function( mode ) {\n\t\t\tthis.activateMode( mode );\n\t\t}, this );\n\t},\n\t/**\n\t * Reset all states on the frame to their defaults.\n\t *\n\t * @return {wp.media.view.Frame} Returns itself to allow chaining.\n\t */\n\treset: function() {\n\t\tthis.states.invoke( 'trigger', 'reset' );\n\t\treturn this;\n\t},\n\t/**\n\t * Map activeMode collection events to the frame.\n\t */\n\ttriggerModeEvents: function( model, collection, options ) {\n\t\tvar collectionEvent,\n\t\t\tmodeEventMap = {\n\t\t\t\tadd: 'activate',\n\t\t\t\tremove: 'deactivate'\n\t\t\t},\n\t\t\teventToTrigger;\n\t\t// Probably a better way to do this.\n\t\t_.each( options, function( value, key ) {\n\t\t\tif ( value ) {\n\t\t\t\tcollectionEvent = key;\n\t\t\t}\n\t\t} );\n\n\t\tif ( ! _.has( modeEventMap, collectionEvent ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\teventToTrigger = model.get('id') + ':' + modeEventMap[collectionEvent];\n\t\tthis.trigger( eventToTrigger );\n\t},\n\t/**\n\t * Activate a mode on the frame.\n\t *\n\t * @param string mode Mode ID.\n\t * @return {this} Returns itself to allow chaining.\n\t */\n\tactivateMode: function( mode ) {\n\t\t// Bail if the mode is already active.\n\t\tif ( this.isModeActive( mode ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.activeModes.add( [ { id: mode } ] );\n\t\t// Add a CSS class to the frame so elements can be styled for the mode.\n\t\tthis.$el.addClass( 'mode-' + mode );\n\n\t\treturn this;\n\t},\n\t/**\n\t * Deactivate a mode on the frame.\n\t *\n\t * @param string mode Mode ID.\n\t * @return {this} Returns itself to allow chaining.\n\t */\n\tdeactivateMode: function( mode ) {\n\t\t// Bail if the mode isn't active.\n\t\tif ( ! this.isModeActive( mode ) ) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.activeModes.remove( this.activeModes.where( { id: mode } ) );\n\t\tthis.$el.removeClass( 'mode-' + mode );\n\t\t/**\n\t\t * Frame mode deactivation event.\n\t\t *\n\t\t * @event wp.media.view.Frame#{mode}:deactivate\n\t\t */\n\t\tthis.trigger( mode + ':deactivate' );\n\n\t\treturn this;\n\t},\n\t/**\n\t * Check if a mode is enabled on the frame.\n\t *\n\t * @param string mode Mode ID.\n\t * @return bool\n\t */\n\tisModeActive: function( mode ) {\n\t\treturn Boolean( this.activeModes.where( { id: mode } ).length );\n\t}\n});\n\n// Make the `Frame` a `StateMachine`.\n_.extend( Frame.prototype, wp.media.controller.StateMachine.prototype );\n\nmodule.exports = Frame;\n\n\n/***/ }),\n\n/***/ \"LND6\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\tAttachmentCompat;\n\n/**\n * wp.media.view.AttachmentCompat\n *\n * A view to display fields added via the `attachment_fields_to_edit` filter.\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nAttachmentCompat = View.extend(/** @lends wp.media.view.AttachmentCompat.prototype */{\n\ttagName:   'form',\n\tclassName: 'compat-item',\n\n\tevents: {\n\t\t'submit':          'preventDefault',\n\t\t'change input':    'save',\n\t\t'change select':   'save',\n\t\t'change textarea': 'save'\n\t},\n\n\tinitialize: function() {\n\t\tthis.listenTo( this.model, 'change:compat', this.render );\n\t},\n\t/**\n\t * @return {wp.media.view.AttachmentCompat} Returns itself to allow chaining.\n\t */\n\tdispose: function() {\n\t\tif ( this.$(':focus').length ) {\n\t\t\tthis.save();\n\t\t}\n\t\t/**\n\t\t * call 'dispose' directly on the parent class\n\t\t */\n\t\treturn View.prototype.dispose.apply( this, arguments );\n\t},\n\t/**\n\t * @return {wp.media.view.AttachmentCompat} Returns itself to allow chaining.\n\t */\n\trender: function() {\n\t\tvar compat = this.model.get('compat');\n\t\tif ( ! compat || ! compat.item ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.views.detach();\n\t\tthis.$el.html( compat.item );\n\t\tthis.views.render();\n\t\treturn this;\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tpreventDefault: function( event ) {\n\t\tevent.preventDefault();\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tsave: function( event ) {\n\t\tvar data = {};\n\n\t\tif ( event ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\t_.each( this.$el.serializeArray(), function( pair ) {\n\t\t\tdata[ pair.name ] = pair.value;\n\t\t});\n\n\t\tthis.controller.trigger( 'attachment:compat:waiting', ['waiting'] );\n\t\tthis.model.saveCompat( data ).always( _.bind( this.postSave, this ) );\n\t},\n\n\tpostSave: function() {\n\t\tthis.controller.trigger( 'attachment:compat:ready', ['ready'] );\n\t}\n});\n\nmodule.exports = AttachmentCompat;\n\n\n/***/ }),\n\n/***/ \"LZpE\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Button\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Button = wp.media.View.extend(/** @lends wp.media.view.Button.prototype */{\n\ttagName:    'button',\n\tclassName:  'media-button',\n\tattributes: { type: 'button' },\n\n\tevents: {\n\t\t'click': 'click'\n\t},\n\n\tdefaults: {\n\t\ttext:     '',\n\t\tstyle:    '',\n\t\tsize:     'large',\n\t\tdisabled: false\n\t},\n\n\tinitialize: function() {\n\t\t/**\n\t\t * Create a model with the provided `defaults`.\n\t\t *\n\t\t * @member {Backbone.Model}\n\t\t */\n\t\tthis.model = new Backbone.Model( this.defaults );\n\n\t\t// If any of the `options` have a key from `defaults`, apply its\n\t\t// value to the `model` and remove it from the `options object.\n\t\t_.each( this.defaults, function( def, key ) {\n\t\t\tvar value = this.options[ key ];\n\t\t\tif ( _.isUndefined( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.model.set( key, value );\n\t\t\tdelete this.options[ key ];\n\t\t}, this );\n\n\t\tthis.listenTo( this.model, 'change', this.render );\n\t},\n\t/**\n\t * @return {wp.media.view.Button} Returns itself to allow chaining.\n\t */\n\trender: function() {\n\t\tvar classes = [ 'button', this.className ],\n\t\t\tmodel = this.model.toJSON();\n\n\t\tif ( model.style ) {\n\t\t\tclasses.push( 'button-' + model.style );\n\t\t}\n\n\t\tif ( model.size ) {\n\t\t\tclasses.push( 'button-' + model.size );\n\t\t}\n\n\t\tclasses = _.uniq( classes.concat( this.options.classes ) );\n\t\tthis.el.className = classes.join(' ');\n\n\t\tthis.$el.attr( 'disabled', model.disabled );\n\t\tthis.$el.text( this.model.get('text') );\n\n\t\treturn this;\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tclick: function( event ) {\n\t\tif ( '#' === this.attributes.href ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\tif ( this.options.click && ! this.model.get('disabled') ) {\n\t\t\tthis.options.click.apply( this, arguments );\n\t\t}\n\t}\n});\n\nmodule.exports = Button;\n\n\n/***/ }),\n\n/***/ \"M+xU\":\n/***/ (function(module, exports) {\n\nvar l10n = wp.media.view.l10n,\n\tCropper;\n\n/**\n * wp.media.controller.Cropper\n *\n * A class for cropping an image when called from the header media customization panel.\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n */\nCropper = wp.media.controller.State.extend(/** @lends wp.media.controller.Cropper.prototype */{\n\tdefaults: {\n\t\tid:          'cropper',\n\t\ttitle:       l10n.cropImage,\n\t\t// Region mode defaults.\n\t\ttoolbar:     'crop',\n\t\tcontent:     'crop',\n\t\trouter:      false,\n\t\tcanSkipCrop: false,\n\n\t\t// Default doCrop Ajax arguments to allow the Customizer (for example) to inject state.\n\t\tdoCropArgs: {}\n\t},\n\n\t/**\n\t * Shows the crop image window when called from the Add new image button.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @return {void}\n\t */\n\tactivate: function() {\n\t\tthis.frame.on( 'content:create:crop', this.createCropContent, this );\n\t\tthis.frame.on( 'close', this.removeCropper, this );\n\t\tthis.set('selection', new Backbone.Collection(this.frame._selection.single));\n\t},\n\n\t/**\n\t * Changes the state of the toolbar window to browse mode.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @return {void}\n\t */\n\tdeactivate: function() {\n\t\tthis.frame.toolbar.mode('browse');\n\t},\n\n\t/**\n\t * Creates the crop image window.\n\t *\n\t * Initialized when clicking on the Select and Crop button.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @fires crop window\n\t *\n\t * @return {void}\n\t */\n\tcreateCropContent: function() {\n\t\tthis.cropperView = new wp.media.view.Cropper({\n\t\t\tcontroller: this,\n\t\t\tattachment: this.get('selection').first()\n\t\t});\n\t\tthis.cropperView.on('image-loaded', this.createCropToolbar, this);\n\t\tthis.frame.content.set(this.cropperView);\n\n\t},\n\n\t/**\n\t * Removes the image selection and closes the cropping window.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @return {void}\n\t */\n\tremoveCropper: function() {\n\t\tthis.imgSelect.cancelSelection();\n\t\tthis.imgSelect.setOptions({remove: true});\n\t\tthis.imgSelect.update();\n\t\tthis.cropperView.remove();\n\t},\n\n\t/**\n\t * Checks if cropping can be skipped and creates crop toolbar accordingly.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @return {void}\n\t */\n\tcreateCropToolbar: function() {\n\t\tvar canSkipCrop, toolbarOptions;\n\n\t\tcanSkipCrop = this.get('canSkipCrop') || false;\n\n\t\ttoolbarOptions = {\n\t\t\tcontroller: this.frame,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.cropImage,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\trequires: { library: false, selection: false },\n\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tselection;\n\n\t\t\t\t\t\tselection = controller.state().get('selection').first();\n\t\t\t\t\t\tselection.set({cropDetails: controller.state().imgSelect.getSelection()});\n\n\t\t\t\t\t\tthis.$el.text(l10n.cropping);\n\t\t\t\t\t\tthis.$el.attr('disabled', true);\n\n\t\t\t\t\t\tcontroller.state().doCrop( selection ).done( function( croppedImage ) {\n\t\t\t\t\t\t\tcontroller.trigger('cropped', croppedImage );\n\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t}).fail( function() {\n\t\t\t\t\t\t\tcontroller.trigger('content:error:crop');\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif ( canSkipCrop ) {\n\t\t\t_.extend( toolbarOptions.items, {\n\t\t\t\tskip: {\n\t\t\t\t\tstyle:      'secondary',\n\t\t\t\t\ttext:       l10n.skipCropping,\n\t\t\t\t\tpriority:   70,\n\t\t\t\t\trequires:   { library: false, selection: false },\n\t\t\t\t\tclick:      function() {\n\t\t\t\t\t\tvar selection = this.controller.state().get('selection').first();\n\t\t\t\t\t\tthis.controller.state().cropperView.remove();\n\t\t\t\t\t\tthis.controller.trigger('skippedcrop', selection);\n\t\t\t\t\t\tthis.controller.close();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.frame.toolbar.set( new wp.media.view.Toolbar(toolbarOptions) );\n\t},\n\n\t/**\n\t * Creates an object with the image attachment and crop properties.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @return {$.promise} A jQuery promise with the custom header crop details.\n\t */\n\tdoCrop: function( attachment ) {\n\t\treturn wp.ajax.post( 'custom-header-crop', _.extend(\n\t\t\t{},\n\t\t\tthis.defaults.doCropArgs,\n\t\t\t{\n\t\t\t\tnonce: attachment.get( 'nonces' ).edit,\n\t\t\t\tid: attachment.get( 'id' ),\n\t\t\t\tcropDetails: attachment.get( 'cropDetails' )\n\t\t\t}\n\t\t) );\n\t}\n});\n\nmodule.exports = Cropper;\n\n\n/***/ }),\n\n/***/ \"M5ZC\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.controller.State\n *\n * A state is a step in a workflow that when set will trigger the controllers\n * for the regions to be updated as specified in the frame.\n *\n * A state has an event-driven lifecycle:\n *\n *     'ready'      triggers when a state is added to a state machine's collection.\n *     'activate'   triggers when a state is activated by a state machine.\n *     'deactivate' triggers when a state is deactivated by a state machine.\n *     'reset'      is not triggered automatically. It should be invoked by the\n *                  proper controller to reset the state to its default.\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments Backbone.Model\n */\nvar State = Backbone.Model.extend(/** @lends wp.media.controller.State.prototype */{\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.5.0\n\t */\n\tconstructor: function() {\n\t\tthis.on( 'activate', this._preActivate, this );\n\t\tthis.on( 'activate', this.activate, this );\n\t\tthis.on( 'activate', this._postActivate, this );\n\t\tthis.on( 'deactivate', this._deactivate, this );\n\t\tthis.on( 'deactivate', this.deactivate, this );\n\t\tthis.on( 'reset', this.reset, this );\n\t\tthis.on( 'ready', this._ready, this );\n\t\tthis.on( 'ready', this.ready, this );\n\t\t/**\n\t\t * Call parent constructor with passed arguments\n\t\t */\n\t\tBackbone.Model.apply( this, arguments );\n\t\tthis.on( 'change:menu', this._updateMenu, this );\n\t},\n\t/**\n\t * Ready event callback.\n\t *\n\t * @abstract\n\t * @since 3.5.0\n\t */\n\tready: function() {},\n\n\t/**\n\t * Activate event callback.\n\t *\n\t * @abstract\n\t * @since 3.5.0\n\t */\n\tactivate: function() {},\n\n\t/**\n\t * Deactivate event callback.\n\t *\n\t * @abstract\n\t * @since 3.5.0\n\t */\n\tdeactivate: function() {},\n\n\t/**\n\t * Reset event callback.\n\t *\n\t * @abstract\n\t * @since 3.5.0\n\t */\n\treset: function() {},\n\n\t/**\n\t * @since 3.5.0\n\t * @access private\n\t */\n\t_ready: function() {\n\t\tthis._updateMenu();\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t * @access private\n\t*/\n\t_preActivate: function() {\n\t\tthis.active = true;\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t * @access private\n\t */\n\t_postActivate: function() {\n\t\tthis.on( 'change:menu', this._menu, this );\n\t\tthis.on( 'change:titleMode', this._title, this );\n\t\tthis.on( 'change:content', this._content, this );\n\t\tthis.on( 'change:toolbar', this._toolbar, this );\n\n\t\tthis.frame.on( 'title:render:default', this._renderTitle, this );\n\n\t\tthis._title();\n\t\tthis._menu();\n\t\tthis._toolbar();\n\t\tthis._content();\n\t\tthis._router();\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t * @access private\n\t */\n\t_deactivate: function() {\n\t\tthis.active = false;\n\n\t\tthis.frame.off( 'title:render:default', this._renderTitle, this );\n\n\t\tthis.off( 'change:menu', this._menu, this );\n\t\tthis.off( 'change:titleMode', this._title, this );\n\t\tthis.off( 'change:content', this._content, this );\n\t\tthis.off( 'change:toolbar', this._toolbar, this );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t * @access private\n\t */\n\t_title: function() {\n\t\tthis.frame.title.render( this.get('titleMode') || 'default' );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t * @access private\n\t */\n\t_renderTitle: function( view ) {\n\t\tview.$el.text( this.get('title') || '' );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t * @access private\n\t */\n\t_router: function() {\n\t\tvar router = this.frame.router,\n\t\t\tmode = this.get('router'),\n\t\t\tview;\n\n\t\tthis.frame.$el.toggleClass( 'hide-router', ! mode );\n\t\tif ( ! mode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.frame.router.render( mode );\n\n\t\tview = router.get();\n\t\tif ( view && view.select ) {\n\t\t\tview.select( this.frame.content.mode() );\n\t\t}\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t * @access private\n\t */\n\t_menu: function() {\n\t\tvar menu = this.frame.menu,\n\t\t\tmode = this.get('menu'),\n\t\t\tview;\n\n\t\tthis.frame.$el.toggleClass( 'hide-menu', ! mode );\n\t\tif ( ! mode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tmenu.mode( mode );\n\n\t\tview = menu.get();\n\t\tif ( view && view.select ) {\n\t\t\tview.select( this.id );\n\t\t}\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t * @access private\n\t */\n\t_updateMenu: function() {\n\t\tvar previous = this.previous('menu'),\n\t\t\tmenu = this.get('menu');\n\n\t\tif ( previous ) {\n\t\t\tthis.frame.off( 'menu:render:' + previous, this._renderMenu, this );\n\t\t}\n\n\t\tif ( menu ) {\n\t\t\tthis.frame.on( 'menu:render:' + menu, this._renderMenu, this );\n\t\t}\n\t},\n\n\t/**\n\t * Create a view in the media menu for the state.\n\t *\n\t * @since 3.5.0\n\t * @access private\n\t *\n\t * @param {media.view.Menu} view The menu view.\n\t */\n\t_renderMenu: function( view ) {\n\t\tvar menuItem = this.get('menuItem'),\n\t\t\ttitle = this.get('title'),\n\t\t\tpriority = this.get('priority');\n\n\t\tif ( ! menuItem && title ) {\n\t\t\tmenuItem = { text: title };\n\n\t\t\tif ( priority ) {\n\t\t\t\tmenuItem.priority = priority;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! menuItem ) {\n\t\t\treturn;\n\t\t}\n\n\t\tview.set( this.id, menuItem );\n\t}\n});\n\n_.each(['toolbar','content'], function( region ) {\n\t/**\n\t * @access private\n\t */\n\tState.prototype[ '_' + region ] = function() {\n\t\tvar mode = this.get( region );\n\t\tif ( mode ) {\n\t\t\tthis.frame[ region ].render( mode );\n\t\t}\n\t};\n});\n\nmodule.exports = State;\n\n\n/***/ }),\n\n/***/ \"Mt+m\":\n/***/ (function(module, exports) {\n\nvar Library = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\t$ = jQuery,\n\tCollectionEdit;\n\n/**\n * wp.media.controller.CollectionEdit\n *\n * A state for editing a collection, which is used by audio and video playlists,\n * and can be used for other collections.\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                     [attributes]                      The attributes hash passed to the state.\n * @param {string}                     attributes.title                  Title for the state. Displays in the media menu and the frame's title region.\n * @param {wp.media.model.Attachments} [attributes.library]              The attachments collection to edit.\n *                                                                       If one is not supplied, an empty media.model.Selection collection is created.\n * @param {boolean}                    [attributes.multiple=false]       Whether multi-select is enabled.\n * @param {string}                     [attributes.content=browse]       Initial mode for the content region.\n * @param {string}                     attributes.menu                   Initial mode for the menu region. @todo this needs a better explanation.\n * @param {boolean}                    [attributes.searchable=false]     Whether the library is searchable.\n * @param {boolean}                    [attributes.sortable=true]        Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.date=true]            Whether to show the date filter in the browser's toolbar.\n * @param {boolean}                    [attributes.describe=true]        Whether to offer UI to describe the attachments - e.g. captioning images in a gallery.\n * @param {boolean}                    [attributes.dragInfo=true]        Whether to show instructional text about the attachments being sortable.\n * @param {boolean}                    [attributes.dragInfoText]         Instructional text about the attachments being sortable.\n * @param {int}                        [attributes.idealColumnWidth=170] The ideal column width in pixels for attachments.\n * @param {boolean}                    [attributes.editing=false]        Whether the gallery is being created, or editing an existing instance.\n * @param {int}                        [attributes.priority=60]          The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.syncSelection=false]  Whether the Attachments selection should be persisted from the last state.\n *                                                                       Defaults to false for this state, because the library passed in  *is* the selection.\n * @param {view}                       [attributes.SettingsView]         The view to edit the collection instance settings (e.g. Playlist settings with \"Show tracklist\" checkbox).\n * @param {view}                       [attributes.AttachmentView]       The single `Attachment` view to be used in the `Attachments`.\n *                                                                       If none supplied, defaults to wp.media.view.Attachment.EditLibrary.\n * @param {string}                     attributes.type                   The collection's media type. (e.g. 'video').\n * @param {string}                     attributes.collectionType         The collection type. (e.g. 'playlist').\n */\nCollectionEdit = Library.extend(/** @lends wp.media.controller.CollectionEdit.prototype */{\n\tdefaults: {\n\t\tmultiple:         false,\n\t\tsortable:         true,\n\t\tdate:             false,\n\t\tsearchable:       false,\n\t\tcontent:          'browse',\n\t\tdescribe:         true,\n\t\tdragInfo:         true,\n\t\tidealColumnWidth: 170,\n\t\tediting:          false,\n\t\tpriority:         60,\n\t\tSettingsView:     false,\n\t\tsyncSelection:    false\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tinitialize: function() {\n\t\tvar collectionType = this.get('collectionType');\n\n\t\tif ( 'video' === this.get( 'type' ) ) {\n\t\t\tcollectionType = 'video-' + collectionType;\n\t\t}\n\n\t\tthis.set( 'id', collectionType + '-edit' );\n\t\tthis.set( 'toolbar', collectionType + '-edit' );\n\n\t\t// If we haven't been provided a `library`, create a `Selection`.\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', new wp.media.model.Selection() );\n\t\t}\n\t\t// The single `Attachment` view to be used in the `Attachments` view.\n\t\tif ( ! this.get('AttachmentView') ) {\n\t\t\tthis.set( 'AttachmentView', wp.media.view.Attachment.EditLibrary );\n\t\t}\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tactivate: function() {\n\t\tvar library = this.get('library');\n\n\t\t// Limit the library to images only.\n\t\tlibrary.props.set( 'type', this.get( 'type' ) );\n\n\t\t// Watch for uploaded attachments.\n\t\tthis.get('library').observe( wp.Uploader.queue );\n\n\t\tthis.frame.on( 'content:render:browse', this.renderSettings, this );\n\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tdeactivate: function() {\n\t\t// Stop watching for uploaded attachments.\n\t\tthis.get('library').unobserve( wp.Uploader.queue );\n\n\t\tthis.frame.off( 'content:render:browse', this.renderSettings, this );\n\n\t\tLibrary.prototype.deactivate.apply( this, arguments );\n\t},\n\n\t/**\n\t * Render the collection embed settings view in the browser sidebar.\n\t *\n\t * @todo This is against the pattern elsewhere in media. Typically the frame\n\t *       is responsible for adding region mode callbacks. Explain.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param {wp.media.view.attachmentsBrowser} The attachments browser view.\n\t */\n\trenderSettings: function( attachmentsBrowserView ) {\n\t\tvar library = this.get('library'),\n\t\t\tcollectionType = this.get('collectionType'),\n\t\t\tdragInfoText = this.get('dragInfoText'),\n\t\t\tSettingsView = this.get('SettingsView'),\n\t\t\tobj = {};\n\n\t\tif ( ! library || ! attachmentsBrowserView ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlibrary[ collectionType ] = library[ collectionType ] || new Backbone.Model();\n\n\t\tobj[ collectionType ] = new SettingsView({\n\t\t\tcontroller: this,\n\t\t\tmodel:      library[ collectionType ],\n\t\t\tpriority:   40\n\t\t});\n\n\t\tattachmentsBrowserView.sidebar.set( obj );\n\n\t\tif ( dragInfoText ) {\n\t\t\tattachmentsBrowserView.toolbar.set( 'dragInfo', new wp.media.View({\n\t\t\t\tel: $( '<div class=\"instructions\">' + dragInfoText + '</div>' )[0],\n\t\t\t\tpriority: -40\n\t\t\t}) );\n\t\t}\n\n\t\t// Add the 'Reverse order' button to the toolbar.\n\t\tattachmentsBrowserView.toolbar.set( 'reverse', {\n\t\t\ttext:     l10n.reverseOrder,\n\t\t\tpriority: 80,\n\n\t\t\tclick: function() {\n\t\t\t\tlibrary.reset( library.toArray().reverse() );\n\t\t\t}\n\t\t});\n\t}\n});\n\nmodule.exports = CollectionEdit;\n\n\n/***/ }),\n\n/***/ \"NguE\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\tUploaderStatus;\n\n/**\n * wp.media.view.UploaderStatus\n *\n * An uploader status for on-going uploads.\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nUploaderStatus = View.extend(/** @lends wp.media.view.UploaderStatus.prototype */{\n\tclassName: 'media-uploader-status',\n\ttemplate:  wp.template('uploader-status'),\n\n\tevents: {\n\t\t'click .upload-dismiss-errors': 'dismiss'\n\t},\n\n\tinitialize: function() {\n\t\tthis.queue = wp.Uploader.queue;\n\t\tthis.queue.on( 'add remove reset', this.visibility, this );\n\t\tthis.queue.on( 'add remove reset change:percent', this.progress, this );\n\t\tthis.queue.on( 'add remove reset change:uploading', this.info, this );\n\n\t\tthis.errors = wp.Uploader.errors;\n\t\tthis.errors.reset();\n\t\tthis.errors.on( 'add remove reset', this.visibility, this );\n\t\tthis.errors.on( 'add', this.error, this );\n\t},\n\t/**\n\t * @return {wp.media.view.UploaderStatus}\n\t */\n\tdispose: function() {\n\t\twp.Uploader.queue.off( null, null, this );\n\t\t/**\n\t\t * call 'dispose' directly on the parent class\n\t\t */\n\t\tView.prototype.dispose.apply( this, arguments );\n\t\treturn this;\n\t},\n\n\tvisibility: function() {\n\t\tthis.$el.toggleClass( 'uploading', !! this.queue.length );\n\t\tthis.$el.toggleClass( 'errors', !! this.errors.length );\n\t\tthis.$el.toggle( !! this.queue.length || !! this.errors.length );\n\t},\n\n\tready: function() {\n\t\t_.each({\n\t\t\t'$bar':      '.media-progress-bar div',\n\t\t\t'$index':    '.upload-index',\n\t\t\t'$total':    '.upload-total',\n\t\t\t'$filename': '.upload-filename'\n\t\t}, function( selector, key ) {\n\t\t\tthis[ key ] = this.$( selector );\n\t\t}, this );\n\n\t\tthis.visibility();\n\t\tthis.progress();\n\t\tthis.info();\n\t},\n\n\tprogress: function() {\n\t\tvar queue = this.queue,\n\t\t\t$bar = this.$bar;\n\n\t\tif ( ! $bar || ! queue.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$bar.width( ( queue.reduce( function( memo, attachment ) {\n\t\t\tif ( ! attachment.get('uploading') ) {\n\t\t\t\treturn memo + 100;\n\t\t\t}\n\n\t\t\tvar percent = attachment.get('percent');\n\t\t\treturn memo + ( _.isNumber( percent ) ? percent : 100 );\n\t\t}, 0 ) / queue.length ) + '%' );\n\t},\n\n\tinfo: function() {\n\t\tvar queue = this.queue,\n\t\t\tindex = 0, active;\n\n\t\tif ( ! queue.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tactive = this.queue.find( function( attachment, i ) {\n\t\t\tindex = i;\n\t\t\treturn attachment.get('uploading');\n\t\t});\n\n\t\tif ( this.$index && this.$total && this.$filename ) {\n\t\t\tthis.$index.text( index + 1 );\n\t\t\tthis.$total.text( queue.length );\n\t\t\tthis.$filename.html( active ? this.filename( active.get('filename') ) : '' );\n\t\t}\n\t},\n\t/**\n\t * @param {string} filename\n\t * @return {string}\n\t */\n\tfilename: function( filename ) {\n\t\treturn _.escape( filename );\n\t},\n\t/**\n\t * @param {Backbone.Model} error\n\t */\n\terror: function( error ) {\n\t\tvar statusError = new wp.media.view.UploaderStatusError( {\n\t\t\tfilename: this.filename( error.get( 'file' ).name ),\n\t\t\tmessage:  error.get( 'message' )\n\t\t} );\n\n\t\tvar buttonClose = this.$el.find( 'button' );\n\n\t\t// Can show additional info here while retrying to create image sub-sizes.\n\t\tthis.views.add( '.upload-errors', statusError, { at: 0 } );\n\t\t_.delay( function() {\n\t\t\tbuttonClose.trigger( 'focus' );\n\t\t\twp.a11y.speak( error.get( 'message' ), 'assertive' );\n\t\t}, 1000 );\n\t},\n\n\tdismiss: function() {\n\t\tvar errors = this.views.get('.upload-errors');\n\n\t\tif ( errors ) {\n\t\t\t_.invoke( errors, 'remove' );\n\t\t}\n\t\twp.Uploader.errors.reset();\n\t\t// Move focus to the modal after the dismiss button gets removed from the DOM.\n\t\tif ( this.controller.modal ) {\n\t\t\tthis.controller.modal.focusManager.focus();\n\t\t}\n\t}\n});\n\nmodule.exports = UploaderStatus;\n\n\n/***/ }),\n\n/***/ \"NjyZ\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.PriorityList\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar PriorityList = wp.media.View.extend(/** @lends wp.media.view.PriorityList.prototype */{\n\ttagName:   'div',\n\n\tinitialize: function() {\n\t\tthis._views = {};\n\n\t\tthis.set( _.extend( {}, this._views, this.options.views ), { silent: true });\n\t\tdelete this.options.views;\n\n\t\tif ( ! this.options.silent ) {\n\t\t\tthis.render();\n\t\t}\n\t},\n\t/**\n\t * @param {string} id\n\t * @param {wp.media.View|Object} view\n\t * @param {Object} options\n\t * @return {wp.media.view.PriorityList} Returns itself to allow chaining.\n\t */\n\tset: function( id, view, options ) {\n\t\tvar priority, views, index;\n\n\t\toptions = options || {};\n\n\t\t// Accept an object with an `id` : `view` mapping.\n\t\tif ( _.isObject( id ) ) {\n\t\t\t_.each( id, function( view, id ) {\n\t\t\t\tthis.set( id, view );\n\t\t\t}, this );\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( ! (view instanceof Backbone.View) ) {\n\t\t\tview = this.toView( view, id, options );\n\t\t}\n\t\tview.controller = view.controller || this.controller;\n\n\t\tthis.unset( id );\n\n\t\tpriority = view.options.priority || 10;\n\t\tviews = this.views.get() || [];\n\n\t\t_.find( views, function( existing, i ) {\n\t\t\tif ( existing.options.priority > priority ) {\n\t\t\t\tindex = i;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\n\t\tthis._views[ id ] = view;\n\t\tthis.views.add( view, {\n\t\t\tat: _.isNumber( index ) ? index : views.length || 0\n\t\t});\n\n\t\treturn this;\n\t},\n\t/**\n\t * @param {string} id\n\t * @return {wp.media.View}\n\t */\n\tget: function( id ) {\n\t\treturn this._views[ id ];\n\t},\n\t/**\n\t * @param {string} id\n\t * @return {wp.media.view.PriorityList}\n\t */\n\tunset: function( id ) {\n\t\tvar view = this.get( id );\n\n\t\tif ( view ) {\n\t\t\tview.remove();\n\t\t}\n\n\t\tdelete this._views[ id ];\n\t\treturn this;\n\t},\n\t/**\n\t * @param {Object} options\n\t * @return {wp.media.View}\n\t */\n\ttoView: function( options ) {\n\t\treturn new wp.media.View( options );\n\t}\n});\n\nmodule.exports = PriorityList;\n\n\n/***/ }),\n\n/***/ \"P6DV\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Attachment.EditSelection\n *\n * @memberOf wp.media.view.Attachment\n *\n * @class\n * @augments wp.media.view.Attachment.Selection\n * @augments wp.media.view.Attachment\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar EditSelection = wp.media.view.Attachment.Selection.extend(/** @lends wp.media.view.Attachment.EditSelection.prototype */{\n\tbuttons: {\n\t\tclose: true\n\t}\n});\n\nmodule.exports = EditSelection;\n\n\n/***/ }),\n\n/***/ \"PgTd\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.selectionSync\n *\n * Sync an attachments selection in a state with another state.\n *\n * Allows for selecting multiple images in the Add Media workflow, and then\n * switching to the Insert Gallery workflow while preserving the attachments selection.\n *\n * @memberOf wp.media\n *\n * @mixin\n */\nvar selectionSync = {\n\t/**\n\t * @since 3.5.0\n\t */\n\tsyncSelection: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tmanager = this.frame._selection;\n\n\t\tif ( ! this.get('syncSelection') || ! manager || ! selection ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/*\n\t\t * If the selection supports multiple items, validate the stored\n\t\t * attachments based on the new selection's conditions. Record\n\t\t * the attachments that are not included; we'll maintain a\n\t\t * reference to those. Other attachments are considered in flux.\n\t\t */\n\t\tif ( selection.multiple ) {\n\t\t\tselection.reset( [], { silent: true });\n\t\t\tselection.validateAll( manager.attachments );\n\t\t\tmanager.difference = _.difference( manager.attachments.models, selection.models );\n\t\t}\n\n\t\t// Sync the selection's single item with the master.\n\t\tselection.single( manager.single );\n\t},\n\n\t/**\n\t * Record the currently active attachments, which is a combination\n\t * of the selection's attachments and the set of selected\n\t * attachments that this specific selection considered invalid.\n\t * Reset the difference and record the single attachment.\n\t *\n\t * @since 3.5.0\n\t */\n\trecordSelection: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tmanager = this.frame._selection;\n\n\t\tif ( ! this.get('syncSelection') || ! manager || ! selection ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( selection.multiple ) {\n\t\t\tmanager.attachments.reset( selection.toArray().concat( manager.difference ) );\n\t\t\tmanager.difference = [];\n\t\t} else {\n\t\t\tmanager.attachments.add( selection.toArray() );\n\t\t}\n\n\t\tmanager.single = selection._single;\n\t}\n};\n\nmodule.exports = selectionSync;\n\n\n/***/ }),\n\n/***/ \"Pt9x\":\n/***/ (function(module, exports) {\n\nvar Frame = wp.media.view.Frame,\n\tl10n = wp.media.view.l10n,\n\t$ = jQuery,\n\tMediaFrame;\n\n/**\n * wp.media.view.MediaFrame\n *\n * The frame used to create the media modal.\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nMediaFrame = Frame.extend(/** @lends wp.media.view.MediaFrame.prototype */{\n\tclassName: 'media-frame',\n\ttemplate:  wp.template('media-frame'),\n\tregions:   ['menu','title','content','toolbar','router'],\n\n\tevents: {\n\t\t'click .media-frame-menu-toggle': 'toggleMenu'\n\t},\n\n\t/**\n\t * @constructs\n\t */\n\tinitialize: function() {\n\t\tFrame.prototype.initialize.apply( this, arguments );\n\n\t\t_.defaults( this.options, {\n\t\t\ttitle:    l10n.mediaFrameDefaultTitle,\n\t\t\tmodal:    true,\n\t\t\tuploader: true\n\t\t});\n\n\t\t// Ensure core UI is enabled.\n\t\tthis.$el.addClass('wp-core-ui');\n\n\t\t// Initialize modal container view.\n\t\tif ( this.options.modal ) {\n\t\t\tthis.modal = new wp.media.view.Modal({\n\t\t\t\tcontroller: this,\n\t\t\t\ttitle:      this.options.title\n\t\t\t});\n\n\t\t\tthis.modal.content( this );\n\t\t}\n\n\t\t// Force the uploader off if the upload limit has been exceeded or\n\t\t// if the browser isn't supported.\n\t\tif ( wp.Uploader.limitExceeded || ! wp.Uploader.browser.supported ) {\n\t\t\tthis.options.uploader = false;\n\t\t}\n\n\t\t// Initialize window-wide uploader.\n\t\tif ( this.options.uploader ) {\n\t\t\tthis.uploader = new wp.media.view.UploaderWindow({\n\t\t\t\tcontroller: this,\n\t\t\t\tuploader: {\n\t\t\t\t\tdropzone:  this.modal ? this.modal.$el : this.$el,\n\t\t\t\t\tcontainer: this.$el\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.views.set( '.media-frame-uploader', this.uploader );\n\t\t}\n\n\t\tthis.on( 'attach', _.bind( this.views.ready, this.views ), this );\n\n\t\t// Bind default title creation.\n\t\tthis.on( 'title:create:default', this.createTitle, this );\n\t\tthis.title.mode('default');\n\n\t\t// Bind default menu.\n\t\tthis.on( 'menu:create:default', this.createMenu, this );\n\n\t\t// Set the menu ARIA tab panel attributes when the modal opens.\n\t\tthis.on( 'open', this.setMenuTabPanelAriaAttributes, this );\n\t\t// Set the router ARIA tab panel attributes when the modal opens.\n\t\tthis.on( 'open', this.setRouterTabPanelAriaAttributes, this );\n\n\t\t// Update the menu ARIA tab panel attributes when the content updates.\n\t\tthis.on( 'content:render', this.setMenuTabPanelAriaAttributes, this );\n\t\t// Update the router ARIA tab panel attributes when the content updates.\n\t\tthis.on( 'content:render', this.setRouterTabPanelAriaAttributes, this );\n\t},\n\n\t/**\n\t * Sets the attributes to be used on the menu ARIA tab panel.\n\t *\n\t * @since 5.3.0\n\t *\n\t * @return {void}\n\t */\n\tsetMenuTabPanelAriaAttributes: function() {\n\t\tvar stateId = this.state().get( 'id' ),\n\t\t\ttabPanelEl = this.$el.find( '.media-frame-tab-panel' ),\n\t\t\tariaLabelledby;\n\n\t\ttabPanelEl.removeAttr( 'role aria-labelledby tabindex' );\n\n\t\tif ( this.state().get( 'menu' ) && this.menuView && this.menuView.isVisible ) {\n\t\t\tariaLabelledby = 'menu-item-' + stateId;\n\n\t\t\t// Set the tab panel attributes only if the tabs are visible.\n\t\t\ttabPanelEl\n\t\t\t\t.attr( {\n\t\t\t\t\trole: 'tabpanel',\n\t\t\t\t\t'aria-labelledby': ariaLabelledby,\n\t\t\t\t\ttabIndex: '0'\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t/**\n\t * Sets the attributes to be used on the router ARIA tab panel.\n\t *\n\t * @since 5.3.0\n\t *\n\t * @return {void}\n\t */\n\tsetRouterTabPanelAriaAttributes: function() {\n\t\tvar tabPanelEl = this.$el.find( '.media-frame-content' ),\n\t\t\tariaLabelledby;\n\n\t\ttabPanelEl.removeAttr( 'role aria-labelledby tabindex' );\n\n\t\t// Set the tab panel attributes only if the tabs are visible.\n\t\tif ( this.state().get( 'router' ) && this.routerView && this.routerView.isVisible && this.content._mode ) {\n\t\t\tariaLabelledby = 'menu-item-' + this.content._mode;\n\n\t\t\ttabPanelEl\n\t\t\t\t.attr( {\n\t\t\t\t\trole: 'tabpanel',\n\t\t\t\t\t'aria-labelledby': ariaLabelledby,\n\t\t\t\t\ttabIndex: '0'\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t/**\n\t * @return {wp.media.view.MediaFrame} Returns itself to allow chaining.\n\t */\n\trender: function() {\n\t\t// Activate the default state if no active state exists.\n\t\tif ( ! this.state() && this.options.state ) {\n\t\t\tthis.setState( this.options.state );\n\t\t}\n\t\t/**\n\t\t * call 'render' directly on the parent class\n\t\t */\n\t\treturn Frame.prototype.render.apply( this, arguments );\n\t},\n\t/**\n\t * @param {Object} title\n\t * @this wp.media.controller.Region\n\t */\n\tcreateTitle: function( title ) {\n\t\ttitle.view = new wp.media.View({\n\t\t\tcontroller: this,\n\t\t\ttagName: 'h1'\n\t\t});\n\t},\n\t/**\n\t * @param {Object} menu\n\t * @this wp.media.controller.Region\n\t */\n\tcreateMenu: function( menu ) {\n\t\tmenu.view = new wp.media.view.Menu({\n\t\t\tcontroller: this,\n\n\t\t\tattributes: {\n\t\t\t\trole:               'tablist',\n\t\t\t\t'aria-orientation': 'vertical'\n\t\t\t}\n\t\t});\n\n\t\tthis.menuView = menu.view;\n\t},\n\n\ttoggleMenu: function( event ) {\n\t\tvar menu = this.$el.find( '.media-menu' );\n\n\t\tmenu.toggleClass( 'visible' );\n\t\t$( event.target ).attr( 'aria-expanded', menu.hasClass( 'visible' ) );\n\t},\n\n\t/**\n\t * @param {Object} toolbar\n\t * @this wp.media.controller.Region\n\t */\n\tcreateToolbar: function( toolbar ) {\n\t\ttoolbar.view = new wp.media.view.Toolbar({\n\t\t\tcontroller: this\n\t\t});\n\t},\n\t/**\n\t * @param {Object} router\n\t * @this wp.media.controller.Region\n\t */\n\tcreateRouter: function( router ) {\n\t\trouter.view = new wp.media.view.Router({\n\t\t\tcontroller: this,\n\n\t\t\tattributes: {\n\t\t\t\trole:               'tablist',\n\t\t\t\t'aria-orientation': 'horizontal'\n\t\t\t}\n\t\t});\n\n\t\tthis.routerView = router.view;\n\t},\n\t/**\n\t * @param {Object} options\n\t */\n\tcreateIframeStates: function( options ) {\n\t\tvar settings = wp.media.view.settings,\n\t\t\ttabs = settings.tabs,\n\t\t\ttabUrl = settings.tabUrl,\n\t\t\t$postId;\n\n\t\tif ( ! tabs || ! tabUrl ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add the post ID to the tab URL if it exists.\n\t\t$postId = $('#post_ID');\n\t\tif ( $postId.length ) {\n\t\t\ttabUrl += '&post_id=' + $postId.val();\n\t\t}\n\n\t\t// Generate the tab states.\n\t\t_.each( tabs, function( title, id ) {\n\t\t\tthis.state( 'iframe:' + id ).set( _.defaults({\n\t\t\t\ttab:     id,\n\t\t\t\tsrc:     tabUrl + '&tab=' + id,\n\t\t\t\ttitle:   title,\n\t\t\t\tcontent: 'iframe',\n\t\t\t\tmenu:    'default'\n\t\t\t}, options ) );\n\t\t}, this );\n\n\t\tthis.on( 'content:create:iframe', this.iframeContent, this );\n\t\tthis.on( 'content:deactivate:iframe', this.iframeContentCleanup, this );\n\t\tthis.on( 'menu:render:default', this.iframeMenu, this );\n\t\tthis.on( 'open', this.hijackThickbox, this );\n\t\tthis.on( 'close', this.restoreThickbox, this );\n\t},\n\n\t/**\n\t * @param {Object} content\n\t * @this wp.media.controller.Region\n\t */\n\tiframeContent: function( content ) {\n\t\tthis.$el.addClass('hide-toolbar');\n\t\tcontent.view = new wp.media.view.Iframe({\n\t\t\tcontroller: this\n\t\t});\n\t},\n\n\tiframeContentCleanup: function() {\n\t\tthis.$el.removeClass('hide-toolbar');\n\t},\n\n\tiframeMenu: function( view ) {\n\t\tvar views = {};\n\n\t\tif ( ! view ) {\n\t\t\treturn;\n\t\t}\n\n\t\t_.each( wp.media.view.settings.tabs, function( title, id ) {\n\t\t\tviews[ 'iframe:' + id ] = {\n\t\t\t\ttext: this.state( 'iframe:' + id ).get('title'),\n\t\t\t\tpriority: 200\n\t\t\t};\n\t\t}, this );\n\n\t\tview.set( views );\n\t},\n\n\thijackThickbox: function() {\n\t\tvar frame = this;\n\n\t\tif ( ! window.tb_remove || this._tb_remove ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._tb_remove = window.tb_remove;\n\t\twindow.tb_remove = function() {\n\t\t\tframe.close();\n\t\t\tframe.reset();\n\t\t\tframe.setState( frame.options.state );\n\t\t\tframe._tb_remove.call( window );\n\t\t};\n\t},\n\n\trestoreThickbox: function() {\n\t\tif ( ! this._tb_remove ) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.tb_remove = this._tb_remove;\n\t\tdelete this._tb_remove;\n\t}\n});\n\n// Map some of the modal's methods to the frame.\n_.each(['open','close','attach','detach','escape'], function( method ) {\n\t/**\n\t * @function open\n\t * @memberOf wp.media.view.MediaFrame\n\t * @instance\n\t *\n\t * @return {wp.media.view.MediaFrame} Returns itself to allow chaining.\n\t */\n\t/**\n\t * @function close\n\t * @memberOf wp.media.view.MediaFrame\n\t * @instance\n\t *\n\t * @return {wp.media.view.MediaFrame} Returns itself to allow chaining.\n\t */\n\t/**\n\t * @function attach\n\t * @memberOf wp.media.view.MediaFrame\n\t * @instance\n\t *\n\t * @return {wp.media.view.MediaFrame} Returns itself to allow chaining.\n\t */\n\t/**\n\t * @function detach\n\t * @memberOf wp.media.view.MediaFrame\n\t * @instance\n\t *\n\t * @return {wp.media.view.MediaFrame} Returns itself to allow chaining.\n\t */\n\t/**\n\t * @function escape\n\t * @memberOf wp.media.view.MediaFrame\n\t * @instance\n\t *\n\t * @return {wp.media.view.MediaFrame} Returns itself to allow chaining.\n\t */\n\tMediaFrame.prototype[ method ] = function() {\n\t\tif ( this.modal ) {\n\t\t\tthis.modal[ method ].apply( this.modal, arguments );\n\t\t}\n\t\treturn this;\n\t};\n});\n\nmodule.exports = MediaFrame;\n\n\n/***/ }),\n\n/***/ \"Q9T/\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.RouterItem\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.view.MenuItem\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar RouterItem = wp.media.view.MenuItem.extend(/** @lends wp.media.view.RouterItem.prototype */{\n\t/**\n\t * On click handler to activate the content region's corresponding mode.\n\t */\n\tclick: function() {\n\t\tvar contentMode = this.options.contentMode;\n\t\tif ( contentMode ) {\n\t\t\tthis.controller.content.mode( contentMode );\n\t\t}\n\t}\n});\n\nmodule.exports = RouterItem;\n\n\n/***/ }),\n\n/***/ \"S4jH\":\n/***/ (function(module, exports) {\n\nvar $ = jQuery,\n\tUploaderWindow;\n\n/**\n * wp.media.view.UploaderWindow\n *\n * An uploader window that allows for dragging and dropping media.\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n *\n * @param {object} [options]                   Options hash passed to the view.\n * @param {object} [options.uploader]          Uploader properties.\n * @param {jQuery} [options.uploader.browser]\n * @param {jQuery} [options.uploader.dropzone] jQuery collection of the dropzone.\n * @param {object} [options.uploader.params]\n */\nUploaderWindow = wp.media.View.extend(/** @lends wp.media.view.UploaderWindow.prototype */{\n\ttagName:   'div',\n\tclassName: 'uploader-window',\n\ttemplate:  wp.template('uploader-window'),\n\n\tinitialize: function() {\n\t\tvar uploader;\n\n\t\tthis.$browser = $( '<button type=\"button\" class=\"browser\" />' ).hide().appendTo( 'body' );\n\n\t\tuploader = this.options.uploader = _.defaults( this.options.uploader || {}, {\n\t\t\tdropzone:  this.$el,\n\t\t\tbrowser:   this.$browser,\n\t\t\tparams:    {}\n\t\t});\n\n\t\t// Ensure the dropzone is a jQuery collection.\n\t\tif ( uploader.dropzone && ! (uploader.dropzone instanceof $) ) {\n\t\t\tuploader.dropzone = $( uploader.dropzone );\n\t\t}\n\n\t\tthis.controller.on( 'activate', this.refresh, this );\n\n\t\tthis.controller.on( 'detach', function() {\n\t\t\tthis.$browser.remove();\n\t\t}, this );\n\t},\n\n\trefresh: function() {\n\t\tif ( this.uploader ) {\n\t\t\tthis.uploader.refresh();\n\t\t}\n\t},\n\n\tready: function() {\n\t\tvar postId = wp.media.view.settings.post.id,\n\t\t\tdropzone;\n\n\t\t// If the uploader already exists, bail.\n\t\tif ( this.uploader ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( postId ) {\n\t\t\tthis.options.uploader.params.post_id = postId;\n\t\t}\n\t\tthis.uploader = new wp.Uploader( this.options.uploader );\n\n\t\tdropzone = this.uploader.dropzone;\n\t\tdropzone.on( 'dropzone:enter', _.bind( this.show, this ) );\n\t\tdropzone.on( 'dropzone:leave', _.bind( this.hide, this ) );\n\n\t\t$( this.uploader ).on( 'uploader:ready', _.bind( this._ready, this ) );\n\t},\n\n\t_ready: function() {\n\t\tthis.controller.trigger( 'uploader:ready' );\n\t},\n\n\tshow: function() {\n\t\tvar $el = this.$el.show();\n\n\t\t// Ensure that the animation is triggered by waiting until\n\t\t// the transparent element is painted into the DOM.\n\t\t_.defer( function() {\n\t\t\t$el.css({ opacity: 1 });\n\t\t});\n\t},\n\n\thide: function() {\n\t\tvar $el = this.$el.css({ opacity: 0 });\n\n\t\twp.media.transition( $el ).done( function() {\n\t\t\t// Transition end events are subject to race conditions.\n\t\t\t// Make sure that the value is set as intended.\n\t\t\tif ( '0' === $el.css('opacity') ) {\n\t\t\t\t$el.hide();\n\t\t\t}\n\t\t});\n\n\t\t// https://core.trac.wordpress.org/ticket/27341\n\t\t_.delay( function() {\n\t\t\tif ( '0' === $el.css('opacity') && $el.is(':visible') ) {\n\t\t\t\t$el.hide();\n\t\t\t}\n\t\t}, 500 );\n\t}\n});\n\nmodule.exports = UploaderWindow;\n\n\n/***/ }),\n\n/***/ \"U3Se\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.controller.StateMachine\n *\n * A state machine keeps track of state. It is in one state at a time,\n * and can change from one state to another.\n *\n * States are stored as models in a Backbone collection.\n *\n * @memberOf wp.media.controller\n *\n * @since 3.5.0\n *\n * @class\n * @augments Backbone.Model\n * @mixin\n * @mixes Backbone.Events\n */\nvar StateMachine = function() {\n\treturn {\n\t\t// Use Backbone's self-propagating `extend` inheritance method.\n\t\textend: Backbone.Model.extend\n\t};\n};\n\n_.extend( StateMachine.prototype, Backbone.Events,/** @lends wp.media.controller.StateMachine.prototype */{\n\t/**\n\t * Fetch a state.\n\t *\n\t * If no `id` is provided, returns the active state.\n\t *\n\t * Implicitly creates states.\n\t *\n\t * Ensure that the `states` collection exists so the `StateMachine`\n\t * can be used as a mixin.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {string} id\n\t * @return {wp.media.controller.State} Returns a State model from\n\t *                                     the StateMachine collection.\n\t */\n\tstate: function( id ) {\n\t\tthis.states = this.states || new Backbone.Collection();\n\n\t\t// Default to the active state.\n\t\tid = id || this._state;\n\n\t\tif ( id && ! this.states.get( id ) ) {\n\t\t\tthis.states.add({ id: id });\n\t\t}\n\t\treturn this.states.get( id );\n\t},\n\n\t/**\n\t * Sets the active state.\n\t *\n\t * Bail if we're trying to select the current state, if we haven't\n\t * created the `states` collection, or are trying to select a state\n\t * that does not exist.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {string} id\n\t *\n\t * @fires wp.media.controller.State#deactivate\n\t * @fires wp.media.controller.State#activate\n\t *\n\t * @return {wp.media.controller.StateMachine} Returns itself to allow chaining.\n\t */\n\tsetState: function( id ) {\n\t\tvar previous = this.state();\n\n\t\tif ( ( previous && id === previous.id ) || ! this.states || ! this.states.get( id ) ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( previous ) {\n\t\t\tprevious.trigger('deactivate');\n\t\t\tthis._lastState = previous.id;\n\t\t}\n\n\t\tthis._state = id;\n\t\tthis.state().trigger('activate');\n\n\t\treturn this;\n\t},\n\n\t/**\n\t * Returns the previous active state.\n\t *\n\t * Call the `state()` method with no parameters to retrieve the current\n\t * active state.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {wp.media.controller.State} Returns a State model from\n\t *                                     the StateMachine collection.\n\t */\n\tlastState: function() {\n\t\tif ( this._lastState ) {\n\t\t\treturn this.state( this._lastState );\n\t\t}\n\t}\n});\n\n// Map all event binding and triggering on a StateMachine to its `states` collection.\n_.each([ 'on', 'off', 'trigger' ], function( method ) {\n\t/**\n\t * @function on\n\t * @memberOf wp.media.controller.StateMachine\n\t * @instance\n\t * @return {wp.media.controller.StateMachine} Returns itself to allow chaining.\n\t */\n\t/**\n\t * @function off\n\t * @memberOf wp.media.controller.StateMachine\n\t * @instance\n\t * @return {wp.media.controller.StateMachine} Returns itself to allow chaining.\n\t */\n\t/**\n\t * @function trigger\n\t * @memberOf wp.media.controller.StateMachine\n\t * @instance\n\t * @return {wp.media.controller.StateMachine} Returns itself to allow chaining.\n\t */\n\tStateMachine.prototype[ method ] = function() {\n\t\t// Ensure that the `states` collection exists so the `StateMachine`\n\t\t// can be used as a mixin.\n\t\tthis.states = this.states || new Backbone.Collection();\n\t\t// Forward the method to the `states` collection.\n\t\tthis.states[ method ].apply( this.states, arguments );\n\t\treturn this;\n\t};\n});\n\nmodule.exports = StateMachine;\n\n\n/***/ }),\n\n/***/ \"UmHM\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.view,\n\tSiteIconCropper;\n\n/**\n * wp.media.view.SiteIconCropper\n *\n * Uses the imgAreaSelect plugin to allow a user to crop a Site Icon.\n *\n * Takes imgAreaSelect options from\n * wp.customize.SiteIconControl.calculateImageSelectOptions.\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.view.Cropper\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nSiteIconCropper = View.Cropper.extend(/** @lends wp.media.view.SiteIconCropper.prototype */{\n\tclassName: 'crop-content site-icon',\n\n\tready: function () {\n\t\tView.Cropper.prototype.ready.apply( this, arguments );\n\n\t\tthis.$( '.crop-image' ).on( 'load', _.bind( this.addSidebar, this ) );\n\t},\n\n\taddSidebar: function() {\n\t\tthis.sidebar = new wp.media.view.Sidebar({\n\t\t\tcontroller: this.controller\n\t\t});\n\n\t\tthis.sidebar.set( 'preview', new wp.media.view.SiteIconPreview({\n\t\t\tcontroller: this.controller,\n\t\t\tattachment: this.options.attachment\n\t\t}) );\n\n\t\tthis.controller.cropperView.views.add( this.sidebar );\n\t}\n});\n\nmodule.exports = SiteIconCropper;\n\n\n/***/ }),\n\n/***/ \"V6sy\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Label\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Label = wp.media.View.extend(/** @lends wp.media.view.Label.prototype */{\n\ttagName: 'label',\n\tclassName: 'screen-reader-text',\n\n\tinitialize: function() {\n\t\tthis.value = this.options.value;\n\t},\n\n\trender: function() {\n\t\tthis.$el.html( this.value );\n\n\t\treturn this;\n\t}\n});\n\nmodule.exports = Label;\n\n\n/***/ }),\n\n/***/ \"VIJ9\":\n/***/ (function(module, exports) {\n\nvar Select = wp.media.view.MediaFrame.Select,\n\tl10n = wp.media.view.l10n,\n\tImageDetails;\n\n/**\n * wp.media.view.MediaFrame.ImageDetails\n *\n * A media frame for manipulating an image that's already been inserted\n * into a post.\n *\n * @memberOf wp.media.view.MediaFrame\n *\n * @class\n * @augments wp.media.view.MediaFrame.Select\n * @augments wp.media.view.MediaFrame\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nImageDetails = Select.extend(/** @lends wp.media.view.MediaFrame.ImageDetails.prototype */{\n\tdefaults: {\n\t\tid:      'image',\n\t\turl:     '',\n\t\tmenu:    'image-details',\n\t\tcontent: 'image-details',\n\t\ttoolbar: 'image-details',\n\t\ttype:    'link',\n\t\ttitle:    l10n.imageDetailsTitle,\n\t\tpriority: 120\n\t},\n\n\tinitialize: function( options ) {\n\t\tthis.image = new wp.media.model.PostImage( options.metadata );\n\t\tthis.options.selection = new wp.media.model.Selection( this.image.attachment, { multiple: false } );\n\t\tSelect.prototype.initialize.apply( this, arguments );\n\t},\n\n\tbindHandlers: function() {\n\t\tSelect.prototype.bindHandlers.apply( this, arguments );\n\t\tthis.on( 'menu:create:image-details', this.createMenu, this );\n\t\tthis.on( 'content:create:image-details', this.imageDetailsContent, this );\n\t\tthis.on( 'content:render:edit-image', this.editImageContent, this );\n\t\tthis.on( 'toolbar:render:image-details', this.renderImageDetailsToolbar, this );\n\t\t// Override the select toolbar.\n\t\tthis.on( 'toolbar:render:replace', this.renderReplaceImageToolbar, this );\n\t},\n\n\tcreateStates: function() {\n\t\tthis.states.add([\n\t\t\tnew wp.media.controller.ImageDetails({\n\t\t\t\timage: this.image,\n\t\t\t\teditable: false\n\t\t\t}),\n\t\t\tnew wp.media.controller.ReplaceImage({\n\t\t\t\tid: 'replace-image',\n\t\t\t\tlibrary: wp.media.query( { type: 'image' } ),\n\t\t\t\timage: this.image,\n\t\t\t\tmultiple:  false,\n\t\t\t\ttitle:     l10n.imageReplaceTitle,\n\t\t\t\ttoolbar: 'replace',\n\t\t\t\tpriority:  80,\n\t\t\t\tdisplaySettings: true\n\t\t\t}),\n\t\t\tnew wp.media.controller.EditImage( {\n\t\t\t\timage: this.image,\n\t\t\t\tselection: this.options.selection\n\t\t\t} )\n\t\t]);\n\t},\n\n\timageDetailsContent: function( options ) {\n\t\toptions.view = new wp.media.view.ImageDetails({\n\t\t\tcontroller: this,\n\t\t\tmodel: this.state().image,\n\t\t\tattachment: this.state().image.attachment\n\t\t});\n\t},\n\n\teditImageContent: function() {\n\t\tvar state = this.state(),\n\t\t\tmodel = state.get('image'),\n\t\t\tview;\n\n\t\tif ( ! model ) {\n\t\t\treturn;\n\t\t}\n\n\t\tview = new wp.media.view.EditImage( { model: model, controller: this } ).render();\n\n\t\tthis.content.set( view );\n\n\t\t// After bringing in the frame, load the actual editor via an Ajax call.\n\t\tview.loadEditor();\n\n\t},\n\n\trenderImageDetailsToolbar: function() {\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tselect: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.update,\n\t\t\t\t\tpriority: 80,\n\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state();\n\n\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t// Not sure if we want to use wp.media.string.image which will create a shortcode or\n\t\t\t\t\t\t// perhaps wp.html.string to at least to build the <img />.\n\t\t\t\t\t\tstate.trigger( 'update', controller.image.toJSON() );\n\n\t\t\t\t\t\t// Restore and reset the default state.\n\t\t\t\t\t\tcontroller.setState( controller.options.state );\n\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\trenderReplaceImageToolbar: function() {\n\t\tvar frame = this,\n\t\t\tlastState = frame.lastState(),\n\t\t\tprevious = lastState && lastState.id;\n\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tback: {\n\t\t\t\t\ttext:     l10n.back,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\tclick:    function() {\n\t\t\t\t\t\tif ( previous ) {\n\t\t\t\t\t\t\tframe.setState( previous );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tframe.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\treplace: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.replace,\n\t\t\t\t\tpriority: 20,\n\t\t\t\t\trequires: { selection: true },\n\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state(),\n\t\t\t\t\t\t\tselection = state.get( 'selection' ),\n\t\t\t\t\t\t\tattachment = selection.single();\n\n\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\tcontroller.image.changeAttachment( attachment, state.display( attachment ) );\n\n\t\t\t\t\t\t// Not sure if we want to use wp.media.string.image which will create a shortcode or\n\t\t\t\t\t\t// perhaps wp.html.string to at least to build the <img />.\n\t\t\t\t\t\tstate.trigger( 'replace', controller.image.toJSON() );\n\n\t\t\t\t\t\t// Restore and reset the default state.\n\t\t\t\t\t\tcontroller.setState( controller.options.state );\n\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t}\n\n});\n\nmodule.exports = ImageDetails;\n\n\n/***/ }),\n\n/***/ \"VMHs\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Embed\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Embed = wp.media.View.extend(/** @lends wp.media.view.Ember.prototype */{\n\tclassName: 'media-embed',\n\n\tinitialize: function() {\n\t\t/**\n\t\t * @member {wp.media.view.EmbedUrl}\n\t\t */\n\t\tthis.url = new wp.media.view.EmbedUrl({\n\t\t\tcontroller: this.controller,\n\t\t\tmodel:      this.model.props\n\t\t}).render();\n\n\t\tthis.views.set([ this.url ]);\n\t\tthis.refresh();\n\t\tthis.listenTo( this.model, 'change:type', this.refresh );\n\t\tthis.listenTo( this.model, 'change:loading', this.loading );\n\t},\n\n\t/**\n\t * @param {Object} view\n\t */\n\tsettings: function( view ) {\n\t\tif ( this._settings ) {\n\t\t\tthis._settings.remove();\n\t\t}\n\t\tthis._settings = view;\n\t\tthis.views.add( view );\n\t},\n\n\trefresh: function() {\n\t\tvar type = this.model.get('type'),\n\t\t\tconstructor;\n\n\t\tif ( 'image' === type ) {\n\t\t\tconstructor = wp.media.view.EmbedImage;\n\t\t} else if ( 'link' === type ) {\n\t\t\tconstructor = wp.media.view.EmbedLink;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.settings( new constructor({\n\t\t\tcontroller: this.controller,\n\t\t\tmodel:      this.model.props,\n\t\t\tpriority:   40\n\t\t}) );\n\t},\n\n\tloading: function() {\n\t\tthis.$el.toggleClass( 'embed-loading', this.model.get('loading') );\n\t}\n});\n\nmodule.exports = Embed;\n\n\n/***/ }),\n\n/***/ \"Vh02\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\tUploaderStatus = wp.media.view.UploaderStatus,\n\tl10n = wp.media.view.l10n,\n\t$ = jQuery,\n\tCropper;\n\n/**\n * wp.media.view.Cropper\n *\n * Uses the imgAreaSelect plugin to allow a user to crop an image.\n *\n * Takes imgAreaSelect options from\n * wp.customize.HeaderControl.calculateImageSelectOptions via\n * wp.customize.HeaderControl.openMM.\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nCropper = View.extend(/** @lends wp.media.view.Cropper.prototype */{\n\tclassName: 'crop-content',\n\ttemplate: wp.template('crop-content'),\n\tinitialize: function() {\n\t\t_.bindAll(this, 'onImageLoad');\n\t},\n\tready: function() {\n\t\tthis.controller.frame.on('content:error:crop', this.onError, this);\n\t\tthis.$image = this.$el.find('.crop-image');\n\t\tthis.$image.on('load', this.onImageLoad);\n\t\t$(window).on('resize.cropper', _.debounce(this.onImageLoad, 250));\n\t},\n\tremove: function() {\n\t\t$(window).off('resize.cropper');\n\t\tthis.$el.remove();\n\t\tthis.$el.off();\n\t\tView.prototype.remove.apply(this, arguments);\n\t},\n\tprepare: function() {\n\t\treturn {\n\t\t\ttitle: l10n.cropYourImage,\n\t\t\turl: this.options.attachment.get('url')\n\t\t};\n\t},\n\tonImageLoad: function() {\n\t\tvar imgOptions = this.controller.get('imgSelectOptions'),\n\t\t\timgSelect;\n\n\t\tif (typeof imgOptions === 'function') {\n\t\t\timgOptions = imgOptions(this.options.attachment, this.controller);\n\t\t}\n\n\t\timgOptions = _.extend(imgOptions, {\n\t\t\tparent: this.$el,\n\t\t\tonInit: function() {\n\n\t\t\t\t// Store the set ratio.\n\t\t\t\tvar setRatio = imgSelect.getOptions().aspectRatio;\n\n\t\t\t\t// On mousedown, if no ratio is set and the Shift key is down, use a 1:1 ratio.\n\t\t\t\tthis.parent.children().on( 'mousedown touchstart', function( e ) {\n\n\t\t\t\t\t// If no ratio is set and the shift key is down, use a 1:1 ratio.\n\t\t\t\t\tif ( ! setRatio && e.shiftKey ) {\n\t\t\t\t\t\timgSelect.setOptions( {\n\t\t\t\t\t\t\taspectRatio: '1:1'\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.parent.children().on( 'mouseup touchend', function() {\n\n\t\t\t\t\t// Restore the set ratio.\n\t\t\t\t\timgSelect.setOptions( {\n\t\t\t\t\t\taspectRatio: setRatio ? setRatio : false\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t\tthis.trigger('image-loaded');\n\t\timgSelect = this.controller.imgSelect = this.$image.imgAreaSelect(imgOptions);\n\t},\n\tonError: function() {\n\t\tvar filename = this.options.attachment.get('filename');\n\n\t\tthis.views.add( '.upload-errors', new wp.media.view.UploaderStatusError({\n\t\t\tfilename: UploaderStatus.prototype.filename(filename),\n\t\t\tmessage: window._wpMediaViewsL10n.cropError\n\t\t}), { at: 0 });\n\t}\n});\n\nmodule.exports = Cropper;\n\n\n/***/ }),\n\n/***/ \"VkcK\":\n/***/ (function(module, exports) {\n\nvar l10n = wp.media.view.l10n,\n\tDateFilter;\n\n/**\n * A filter dropdown for month/dates.\n *\n * @memberOf wp.media.view.AttachmentFilters\n *\n * @class\n * @augments wp.media.view.AttachmentFilters\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nDateFilter = wp.media.view.AttachmentFilters.extend(/** @lends wp.media.view.AttachmentFilters.Date.prototype */{\n\tid: 'media-attachment-date-filters',\n\n\tcreateFilters: function() {\n\t\tvar filters = {};\n\t\t_.each( wp.media.view.settings.months || {}, function( value, index ) {\n\t\t\tfilters[ index ] = {\n\t\t\t\ttext: value.text,\n\t\t\t\tprops: {\n\t\t\t\t\tyear: value.year,\n\t\t\t\t\tmonthnum: value.month\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t\tfilters.all = {\n\t\t\ttext:  l10n.allDates,\n\t\t\tprops: {\n\t\t\t\tmonthnum: false,\n\t\t\t\tyear:  false\n\t\t\t},\n\t\t\tpriority: 10\n\t\t};\n\t\tthis.filters = filters;\n\t}\n});\n\nmodule.exports = DateFilter;\n\n\n/***/ }),\n\n/***/ \"W+32\":\n/***/ (function(module, exports) {\n\nvar Controller = wp.media.controller,\n\tSiteIconCropper;\n\n/**\n * wp.media.controller.SiteIconCropper\n *\n * A state for cropping a Site Icon.\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments wp.media.controller.Cropper\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n */\nSiteIconCropper = Controller.Cropper.extend(/** @lends wp.media.controller.SiteIconCropper.prototype */{\n\tactivate: function() {\n\t\tthis.frame.on( 'content:create:crop', this.createCropContent, this );\n\t\tthis.frame.on( 'close', this.removeCropper, this );\n\t\tthis.set('selection', new Backbone.Collection(this.frame._selection.single));\n\t},\n\n\tcreateCropContent: function() {\n\t\tthis.cropperView = new wp.media.view.SiteIconCropper({\n\t\t\tcontroller: this,\n\t\t\tattachment: this.get('selection').first()\n\t\t});\n\t\tthis.cropperView.on('image-loaded', this.createCropToolbar, this);\n\t\tthis.frame.content.set(this.cropperView);\n\n\t},\n\n\tdoCrop: function( attachment ) {\n\t\tvar cropDetails = attachment.get( 'cropDetails' ),\n\t\t\tcontrol = this.get( 'control' );\n\n\t\tcropDetails.dst_width  = control.params.width;\n\t\tcropDetails.dst_height = control.params.height;\n\n\t\treturn wp.ajax.post( 'crop-image', {\n\t\t\tnonce: attachment.get( 'nonces' ).edit,\n\t\t\tid: attachment.get( 'id' ),\n\t\t\tcontext: 'site-icon',\n\t\t\tcropDetails: cropDetails\n\t\t} );\n\t}\n});\n\nmodule.exports = SiteIconCropper;\n\n\n/***/ }),\n\n/***/ \"WiNq\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.controller.Region\n *\n * A region is a persistent application layout area.\n *\n * A region assumes one mode at any time, and can be switched to another.\n *\n * When mode changes, events are triggered on the region's parent view.\n * The parent view will listen to specific events and fill the region with an\n * appropriate view depending on mode. For example, a frame listens for the\n * 'browse' mode t be activated on the 'content' view and then fills the region\n * with an AttachmentsBrowser view.\n *\n * @memberOf wp.media.controller\n *\n * @class\n *\n * @param {Object}        options          Options hash for the region.\n * @param {string}        options.id       Unique identifier for the region.\n * @param {Backbone.View} options.view     A parent view the region exists within.\n * @param {string}        options.selector jQuery selector for the region within the parent view.\n */\nvar Region = function( options ) {\n\t_.extend( this, _.pick( options || {}, 'id', 'view', 'selector' ) );\n};\n\n// Use Backbone's self-propagating `extend` inheritance method.\nRegion.extend = Backbone.Model.extend;\n\n_.extend( Region.prototype,/** @lends wp.media.controller.Region.prototype */{\n\t/**\n\t * Activate a mode.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {string} mode\n\t *\n\t * @fires Region#activate\n\t * @fires Region#deactivate\n\t *\n\t * @return {wp.media.controller.Region} Returns itself to allow chaining.\n\t */\n\tmode: function( mode ) {\n\t\tif ( ! mode ) {\n\t\t\treturn this._mode;\n\t\t}\n\t\t// Bail if we're trying to change to the current mode.\n\t\tif ( mode === this._mode ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Region mode deactivation event.\n\t\t *\n\t\t * @event wp.media.controller.Region#deactivate\n\t\t */\n\t\tthis.trigger('deactivate');\n\n\t\tthis._mode = mode;\n\t\tthis.render( mode );\n\n\t\t/**\n\t\t * Region mode activation event.\n\t\t *\n\t\t * @event wp.media.controller.Region#activate\n\t\t */\n\t\tthis.trigger('activate');\n\t\treturn this;\n\t},\n\t/**\n\t * Render a mode.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {string} mode\n\t *\n\t * @fires Region#create\n\t * @fires Region#render\n\t *\n\t * @return {wp.media.controller.Region} Returns itself to allow chaining.\n\t */\n\trender: function( mode ) {\n\t\t// If the mode isn't active, activate it.\n\t\tif ( mode && mode !== this._mode ) {\n\t\t\treturn this.mode( mode );\n\t\t}\n\n\t\tvar set = { view: null },\n\t\t\tview;\n\n\t\t/**\n\t\t * Create region view event.\n\t\t *\n\t\t * Region view creation takes place in an event callback on the frame.\n\t\t *\n\t\t * @event wp.media.controller.Region#create\n\t\t * @type {object}\n\t\t * @property {object} view\n\t\t */\n\t\tthis.trigger( 'create', set );\n\t\tview = set.view;\n\n\t\t/**\n\t\t * Render region view event.\n\t\t *\n\t\t * Region view creation takes place in an event callback on the frame.\n\t\t *\n\t\t * @event wp.media.controller.Region#render\n\t\t * @type {object}\n\t\t */\n\t\tthis.trigger( 'render', view );\n\t\tif ( view ) {\n\t\t\tthis.set( view );\n\t\t}\n\t\treturn this;\n\t},\n\n\t/**\n\t * Get the region's view.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {wp.media.View}\n\t */\n\tget: function() {\n\t\treturn this.view.views.first( this.selector );\n\t},\n\n\t/**\n\t * Set the region's view as a subview of the frame.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {Array|Object} views\n\t * @param {Object} [options={}]\n\t * @return {wp.Backbone.Subviews} Subviews is returned to allow chaining.\n\t */\n\tset: function( views, options ) {\n\t\tif ( options ) {\n\t\t\toptions.add = false;\n\t\t}\n\t\treturn this.view.views.set( this.selector, views, options );\n\t},\n\n\t/**\n\t * Trigger regional view events on the frame.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {string} event\n\t * @return {undefined|wp.media.controller.Region} Returns itself to allow chaining.\n\t */\n\ttrigger: function( event ) {\n\t\tvar base, args;\n\n\t\tif ( ! this._mode ) {\n\t\t\treturn;\n\t\t}\n\n\t\targs = _.toArray( arguments );\n\t\tbase = this.id + ':' + event;\n\n\t\t// Trigger `{this.id}:{event}:{this._mode}` event on the frame.\n\t\targs[0] = base + ':' + this._mode;\n\t\tthis.view.trigger.apply( this.view, args );\n\n\t\t// Trigger `{this.id}:{event}` event on the frame.\n\t\targs[0] = base;\n\t\tthis.view.trigger.apply( this.view, args );\n\t\treturn this;\n\t}\n});\n\nmodule.exports = Region;\n\n\n/***/ }),\n\n/***/ \"ZeG4\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.UploaderStatusError\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar UploaderStatusError = wp.media.View.extend(/** @lends wp.media.view.UploaderStatusError.prototype */{\n\tclassName: 'upload-error',\n\ttemplate:  wp.template('uploader-status-error')\n});\n\nmodule.exports = UploaderStatusError;\n\n\n/***/ }),\n\n/***/ \"ZgZ7\":\n/***/ (function(module, exports) {\n\nvar Search;\n\n/**\n * wp.media.view.Search\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nSearch = wp.media.View.extend(/** @lends wp.media.view.Search.prototype */{\n\ttagName:   'input',\n\tclassName: 'search',\n\tid:        'media-search-input',\n\n\tattributes: {\n\t\ttype: 'search'\n\t},\n\n\tevents: {\n\t\t'input': 'search'\n\t},\n\n\t/**\n\t * @return {wp.media.view.Search} Returns itself to allow chaining.\n\t */\n\trender: function() {\n\t\tthis.el.value = this.model.escape('search');\n\t\treturn this;\n\t},\n\n\tsearch: _.debounce( function( event ) {\n\t\tvar searchTerm = event.target.value.trim();\n\n\t\t// Trigger the search only after 2 ASCII characters.\n\t\tif ( searchTerm && searchTerm.length > 1 ) {\n\t\t\tthis.model.set( 'search', searchTerm );\n\t\t} else {\n\t\t\tthis.model.unset( 'search' );\n\t\t}\n\t}, 500 )\n});\n\nmodule.exports = Search;\n\n\n/***/ }),\n\n/***/ \"aBqq\":\n/***/ (function(module, exports) {\n\nvar Library = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tReplaceImage;\n\n/**\n * wp.media.controller.ReplaceImage\n *\n * A state for replacing an image.\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                     [attributes]                         The attributes hash passed to the state.\n * @param {string}                     [attributes.id=replace-image]        Unique identifier.\n * @param {string}                     [attributes.title=Replace Image]     Title for the state. Displays in the media menu and the frame's title region.\n * @param {wp.media.model.Attachments} [attributes.library]                 The attachments collection to browse.\n *                                                                          If one is not supplied, a collection of all images will be created.\n * @param {boolean}                    [attributes.multiple=false]          Whether multi-select is enabled.\n * @param {string}                     [attributes.content=upload]          Initial mode for the content region.\n *                                                                          Overridden by persistent user setting if 'contentUserSetting' is true.\n * @param {string}                     [attributes.menu=default]            Initial mode for the menu region.\n * @param {string}                     [attributes.router=browse]           Initial mode for the router region.\n * @param {string}                     [attributes.toolbar=replace]         Initial mode for the toolbar region.\n * @param {int}                        [attributes.priority=60]             The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.searchable=true]         Whether the library is searchable.\n * @param {boolean|string}             [attributes.filterable=uploaded]     Whether the library is filterable, and if so what filters should be shown.\n *                                                                          Accepts 'all', 'uploaded', or 'unattached'.\n * @param {boolean}                    [attributes.sortable=true]           Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.autoSelect=true]         Whether an uploaded attachment should be automatically added to the selection.\n * @param {boolean}                    [attributes.describe=false]          Whether to offer UI to describe attachments - e.g. captioning images in a gallery.\n * @param {boolean}                    [attributes.contentUserSetting=true] Whether the content region's mode should be set and persisted per user.\n * @param {boolean}                    [attributes.syncSelection=true]      Whether the Attachments selection should be persisted from the last state.\n */\nReplaceImage = Library.extend(/** @lends wp.media.controller.ReplaceImage.prototype */{\n\tdefaults: _.defaults({\n\t\tid:            'replace-image',\n\t\ttitle:         l10n.replaceImageTitle,\n\t\tmultiple:      false,\n\t\tfilterable:    'uploaded',\n\t\ttoolbar:       'replace',\n\t\tmenu:          false,\n\t\tpriority:      60,\n\t\tsyncSelection: true\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * @since 3.9.0\n\t *\n\t * @param options\n\t */\n\tinitialize: function( options ) {\n\t\tvar library, comparator;\n\n\t\tthis.image = options.image;\n\t\t// If we haven't been provided a `library`, create a `Selection`.\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', wp.media.query({ type: 'image' }) );\n\t\t}\n\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\n\t\tlibrary    = this.get('library');\n\t\tcomparator = library.comparator;\n\n\t\t// Overload the library's comparator to push items that are not in\n\t\t// the mirrored query to the front of the aggregate collection.\n\t\tlibrary.comparator = function( a, b ) {\n\t\t\tvar aInQuery = !! this.mirroring.get( a.cid ),\n\t\t\t\tbInQuery = !! this.mirroring.get( b.cid );\n\n\t\t\tif ( ! aInQuery && bInQuery ) {\n\t\t\t\treturn -1;\n\t\t\t} else if ( aInQuery && ! bInQuery ) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn comparator.apply( this, arguments );\n\t\t\t}\n\t\t};\n\n\t\t// Add all items in the selection to the library, so any featured\n\t\t// images that are not initially loaded still appear.\n\t\tlibrary.observe( this.get('selection') );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tactivate: function() {\n\t\tthis.frame.on( 'content:render:browse', this.updateSelection, this );\n\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 5.9.0\n\t */\n\tdeactivate: function() {\n\t\tthis.frame.off( 'content:render:browse', this.updateSelection, this );\n\n\t\tLibrary.prototype.deactivate.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tupdateSelection: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tattachment = this.image.attachment;\n\n\t\tselection.reset( attachment ? [ attachment ] : [] );\n\t}\n});\n\nmodule.exports = ReplaceImage;\n\n\n/***/ }),\n\n/***/ \"cH3P\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Spinner\n *\n * Represents a spinner in the Media Library.\n *\n * @since 3.9.0\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Spinner = wp.media.View.extend(/** @lends wp.media.view.Spinner.prototype */{\n\ttagName:   'span',\n\tclassName: 'spinner',\n\tspinnerTimeout: false,\n\tdelay: 400,\n\n\t/**\n\t * Shows the spinner. Delays the visibility by the configured amount.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @return {wp.media.view.Spinner} The spinner.\n\t */\n\tshow: function() {\n\t\tif ( ! this.spinnerTimeout ) {\n\t\t\tthis.spinnerTimeout = _.delay(function( $el ) {\n\t\t\t\t$el.addClass( 'is-active' );\n\t\t\t}, this.delay, this.$el );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t/**\n\t * Hides the spinner.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @return {wp.media.view.Spinner} The spinner.\n\t */\n\thide: function() {\n\t\tthis.$el.removeClass( 'is-active' );\n\t\tthis.spinnerTimeout = clearTimeout( this.spinnerTimeout );\n\n\t\treturn this;\n\t}\n});\n\nmodule.exports = Spinner;\n\n\n/***/ }),\n\n/***/ \"d3xu\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\t$ = jQuery,\n\tSiteIconPreview;\n\n/**\n * wp.media.view.SiteIconPreview\n *\n * Shows a preview of the Site Icon as a favicon and app icon while cropping.\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nSiteIconPreview = View.extend(/** @lends wp.media.view.SiteIconPreview.prototype */{\n\tclassName: 'site-icon-preview',\n\ttemplate: wp.template( 'site-icon-preview' ),\n\n\tready: function() {\n\t\tthis.controller.imgSelect.setOptions({\n\t\t\tonInit: this.updatePreview,\n\t\t\tonSelectChange: this.updatePreview\n\t\t});\n\t},\n\n\tprepare: function() {\n\t\treturn {\n\t\t\turl: this.options.attachment.get( 'url' )\n\t\t};\n\t},\n\n\tupdatePreview: function( img, coords ) {\n\t\tvar rx = 64 / coords.width,\n\t\t\try = 64 / coords.height,\n\t\t\tpreview_rx = 16 / coords.width,\n\t\t\tpreview_ry = 16 / coords.height;\n\n\t\t$( '#preview-app-icon' ).css({\n\t\t\twidth: Math.round(rx * this.imageWidth ) + 'px',\n\t\t\theight: Math.round(ry * this.imageHeight ) + 'px',\n\t\t\tmarginLeft: '-' + Math.round(rx * coords.x1) + 'px',\n\t\t\tmarginTop: '-' + Math.round(ry * coords.y1) + 'px'\n\t\t});\n\n\t\t$( '#preview-favicon' ).css({\n\t\t\twidth: Math.round( preview_rx * this.imageWidth ) + 'px',\n\t\t\theight: Math.round( preview_ry * this.imageHeight ) + 'px',\n\t\t\tmarginLeft: '-' + Math.round( preview_rx * coords.x1 ) + 'px',\n\t\t\tmarginTop: '-' + Math.floor( preview_ry* coords.y1 ) + 'px'\n\t\t});\n\t}\n});\n\nmodule.exports = SiteIconPreview;\n\n\n/***/ }),\n\n/***/ \"dpRc\":\n/***/ (function(module, exports) {\n\nvar MenuItem;\n\n/**\n * wp.media.view.MenuItem\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nMenuItem = wp.media.View.extend(/** @lends wp.media.view.MenuItem.prototype */{\n\ttagName:   'button',\n\tclassName: 'media-menu-item',\n\n\tattributes: {\n\t\ttype: 'button',\n\t\trole: 'tab'\n\t},\n\n\tevents: {\n\t\t'click': '_click'\n\t},\n\n\t/**\n\t * Allows to override the click event.\n\t */\n\t_click: function() {\n\t\tvar clickOverride = this.options.click;\n\n\t\tif ( clickOverride ) {\n\t\t\tclickOverride.call( this );\n\t\t} else {\n\t\t\tthis.click();\n\t\t}\n\t},\n\n\tclick: function() {\n\t\tvar state = this.options.state;\n\n\t\tif ( state ) {\n\t\t\tthis.controller.setState( state );\n\t\t\t// Toggle the menu visibility in the responsive view.\n\t\t\tthis.views.parent.$el.removeClass( 'visible' ); // @todo Or hide on any click, see below.\n\t\t}\n\t},\n\n\t/**\n\t * @return {wp.media.view.MenuItem} returns itself to allow chaining.\n\t */\n\trender: function() {\n\t\tvar options = this.options,\n\t\t\tmenuProperty = options.state || options.contentMode;\n\n\t\tif ( options.text ) {\n\t\t\tthis.$el.text( options.text );\n\t\t} else if ( options.html ) {\n\t\t\tthis.$el.html( options.html );\n\t\t}\n\n\t\t// Set the menu item ID based on the frame state associated to the menu item.\n\t\tthis.$el.attr( 'id', 'menu-item-' + menuProperty );\n\n\t\treturn this;\n\t}\n});\n\nmodule.exports = MenuItem;\n\n\n/***/ }),\n\n/***/ \"eqTc\":\n/***/ (function(module, exports) {\n\nvar Controller = wp.media.controller,\n\tCustomizeImageCropper;\n\n/**\n * A state for cropping an image in the customizer.\n *\n * @since 4.3.0\n *\n * @constructs wp.media.controller.CustomizeImageCropper\n * @memberOf wp.media.controller\n * @augments wp.media.controller.CustomizeImageCropper.Cropper\n * @inheritDoc\n */\nCustomizeImageCropper = Controller.Cropper.extend(/** @lends wp.media.controller.CustomizeImageCropper.prototype */{\n\t/**\n\t * Posts the crop details to the admin.\n\t *\n\t * Uses crop measurements when flexible in both directions.\n\t * Constrains flexible side based on image ratio and size of the fixed side.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param {Object} attachment The attachment to crop.\n\t *\n\t * @return {$.promise} A jQuery promise that represents the crop image request.\n\t */\n\tdoCrop: function( attachment ) {\n\t\tvar cropDetails = attachment.get( 'cropDetails' ),\n\t\t\tcontrol = this.get( 'control' ),\n\t\t\tratio = cropDetails.width / cropDetails.height;\n\n\t\t// Use crop measurements when flexible in both directions.\n\t\tif ( control.params.flex_width && control.params.flex_height ) {\n\t\t\tcropDetails.dst_width  = cropDetails.width;\n\t\t\tcropDetails.dst_height = cropDetails.height;\n\n\t\t// Constrain flexible side based on image ratio and size of the fixed side.\n\t\t} else {\n\t\t\tcropDetails.dst_width  = control.params.flex_width  ? control.params.height * ratio : control.params.width;\n\t\t\tcropDetails.dst_height = control.params.flex_height ? control.params.width  / ratio : control.params.height;\n\t\t}\n\n\t\treturn wp.ajax.post( 'crop-image', {\n\t\t\twp_customize: 'on',\n\t\t\tnonce: attachment.get( 'nonces' ).edit,\n\t\t\tid: attachment.get( 'id' ),\n\t\t\tcontext: control.id,\n\t\t\tcropDetails: cropDetails\n\t\t} );\n\t}\n});\n\nmodule.exports = CustomizeImageCropper;\n\n\n/***/ }),\n\n/***/ \"fYN4\":\n/***/ (function(module, exports) {\n\nvar MediaFrame = wp.media.view.MediaFrame,\n\tl10n = wp.media.view.l10n,\n\tSelect;\n\n/**\n * wp.media.view.MediaFrame.Select\n *\n * A frame for selecting an item or items from the media library.\n *\n * @memberOf wp.media.view.MediaFrame\n *\n * @class\n * @augments wp.media.view.MediaFrame\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nSelect = MediaFrame.extend(/** @lends wp.media.view.MediaFrame.Select.prototype */{\n\tinitialize: function() {\n\t\t// Call 'initialize' directly on the parent class.\n\t\tMediaFrame.prototype.initialize.apply( this, arguments );\n\n\t\t_.defaults( this.options, {\n\t\t\tselection: [],\n\t\t\tlibrary:   {},\n\t\t\tmultiple:  false,\n\t\t\tstate:    'library'\n\t\t});\n\n\t\tthis.createSelection();\n\t\tthis.createStates();\n\t\tthis.bindHandlers();\n\t},\n\n\t/**\n\t * Attach a selection collection to the frame.\n\t *\n\t * A selection is a collection of attachments used for a specific purpose\n\t * by a media frame. e.g. Selecting an attachment (or many) to insert into\n\t * post content.\n\t *\n\t * @see media.model.Selection\n\t */\n\tcreateSelection: function() {\n\t\tvar selection = this.options.selection;\n\n\t\tif ( ! (selection instanceof wp.media.model.Selection) ) {\n\t\t\tthis.options.selection = new wp.media.model.Selection( selection, {\n\t\t\t\tmultiple: this.options.multiple\n\t\t\t});\n\t\t}\n\n\t\tthis._selection = {\n\t\t\tattachments: new wp.media.model.Attachments(),\n\t\t\tdifference: []\n\t\t};\n\t},\n\n\teditImageContent: function() {\n\t\tvar image = this.state().get('image'),\n\t\t\tview = new wp.media.view.EditImage( { model: image, controller: this } ).render();\n\n\t\tthis.content.set( view );\n\n\t\t// After creating the wrapper view, load the actual editor via an Ajax call.\n\t\tview.loadEditor();\n\t},\n\n\t/**\n\t * Create the default states on the frame.\n\t */\n\tcreateStates: function() {\n\t\tvar options = this.options;\n\n\t\tif ( this.options.states ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add the default states.\n\t\tthis.states.add([\n\t\t\t// Main states.\n\t\t\tnew wp.media.controller.Library({\n\t\t\t\tlibrary:   wp.media.query( options.library ),\n\t\t\t\tmultiple:  options.multiple,\n\t\t\t\ttitle:     options.title,\n\t\t\t\tpriority:  20\n\t\t\t}),\n\t\t\tnew wp.media.controller.EditImage( { model: options.editImage } )\n\t\t]);\n\t},\n\n\t/**\n\t * Bind region mode event callbacks.\n\t *\n\t * @see media.controller.Region.render\n\t */\n\tbindHandlers: function() {\n\t\tthis.on( 'router:create:browse', this.createRouter, this );\n\t\tthis.on( 'router:render:browse', this.browseRouter, this );\n\t\tthis.on( 'content:create:browse', this.browseContent, this );\n\t\tthis.on( 'content:render:upload', this.uploadContent, this );\n\t\tthis.on( 'toolbar:create:select', this.createSelectToolbar, this );\n\t\tthis.on( 'content:render:edit-image', this.editImageContent, this );\n\t},\n\n\t/**\n\t * Render callback for the router region in the `browse` mode.\n\t *\n\t * @param {wp.media.view.Router} routerView\n\t */\n\tbrowseRouter: function( routerView ) {\n\t\trouterView.set({\n\t\t\tupload: {\n\t\t\t\ttext:     l10n.uploadFilesTitle,\n\t\t\t\tpriority: 20\n\t\t\t},\n\t\t\tbrowse: {\n\t\t\t\ttext:     l10n.mediaLibraryTitle,\n\t\t\t\tpriority: 40\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Render callback for the content region in the `browse` mode.\n\t *\n\t * @param {wp.media.controller.Region} contentRegion\n\t */\n\tbrowseContent: function( contentRegion ) {\n\t\tvar state = this.state();\n\n\t\tthis.$el.removeClass('hide-toolbar');\n\n\t\t// Browse our library of attachments.\n\t\tcontentRegion.view = new wp.media.view.AttachmentsBrowser({\n\t\t\tcontroller: this,\n\t\t\tcollection: state.get('library'),\n\t\t\tselection:  state.get('selection'),\n\t\t\tmodel:      state,\n\t\t\tsortable:   state.get('sortable'),\n\t\t\tsearch:     state.get('searchable'),\n\t\t\tfilters:    state.get('filterable'),\n\t\t\tdate:       state.get('date'),\n\t\t\tdisplay:    state.has('display') ? state.get('display') : state.get('displaySettings'),\n\t\t\tdragInfo:   state.get('dragInfo'),\n\n\t\t\tidealColumnWidth: state.get('idealColumnWidth'),\n\t\t\tsuggestedWidth:   state.get('suggestedWidth'),\n\t\t\tsuggestedHeight:  state.get('suggestedHeight'),\n\n\t\t\tAttachmentView: state.get('AttachmentView')\n\t\t});\n\t},\n\n\t/**\n\t * Render callback for the content region in the `upload` mode.\n\t */\n\tuploadContent: function() {\n\t\tthis.$el.removeClass( 'hide-toolbar' );\n\t\tthis.content.set( new wp.media.view.UploaderInline({\n\t\t\tcontroller: this\n\t\t}) );\n\t},\n\n\t/**\n\t * Toolbars\n\t *\n\t * @param {Object} toolbar\n\t * @param {Object} [options={}]\n\t * @this wp.media.controller.Region\n\t */\n\tcreateSelectToolbar: function( toolbar, options ) {\n\t\toptions = options || this.options.button || {};\n\t\toptions.controller = this;\n\n\t\ttoolbar.view = new wp.media.view.Toolbar.Select( options );\n\t}\n});\n\nmodule.exports = Select;\n\n\n/***/ }),\n\n/***/ \"gOpb\":\n/***/ (function(module, exports) {\n\nvar $ = jQuery,\n\tModal;\n\n/**\n * wp.media.view.Modal\n *\n * A modal view, which the media modal uses as its default container.\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nModal = wp.media.View.extend(/** @lends wp.media.view.Modal.prototype */{\n\ttagName:  'div',\n\ttemplate: wp.template('media-modal'),\n\n\tevents: {\n\t\t'click .media-modal-backdrop, .media-modal-close': 'escapeHandler',\n\t\t'keydown': 'keydown'\n\t},\n\n\tclickedOpenerEl: null,\n\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\tcontainer:      document.body,\n\t\t\ttitle:          '',\n\t\t\tpropagate:      true,\n\t\t\thasCloseButton: true\n\t\t});\n\n\t\tthis.focusManager = new wp.media.view.FocusManager({\n\t\t\tel: this.el\n\t\t});\n\t},\n\t/**\n\t * @return {Object}\n\t */\n\tprepare: function() {\n\t\treturn {\n\t\t\ttitle:          this.options.title,\n\t\t\thasCloseButton: this.options.hasCloseButton\n\t\t};\n\t},\n\n\t/**\n\t * @return {wp.media.view.Modal} Returns itself to allow chaining.\n\t */\n\tattach: function() {\n\t\tif ( this.views.attached ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( ! this.views.rendered ) {\n\t\t\tthis.render();\n\t\t}\n\n\t\tthis.$el.appendTo( this.options.container );\n\n\t\t// Manually mark the view as attached and trigger ready.\n\t\tthis.views.attached = true;\n\t\tthis.views.ready();\n\n\t\treturn this.propagate('attach');\n\t},\n\n\t/**\n\t * @return {wp.media.view.Modal} Returns itself to allow chaining.\n\t */\n\tdetach: function() {\n\t\tif ( this.$el.is(':visible') ) {\n\t\t\tthis.close();\n\t\t}\n\n\t\tthis.$el.detach();\n\t\tthis.views.attached = false;\n\t\treturn this.propagate('detach');\n\t},\n\n\t/**\n\t * @return {wp.media.view.Modal} Returns itself to allow chaining.\n\t */\n\topen: function() {\n\t\tvar $el = this.$el,\n\t\t\tmceEditor;\n\n\t\tif ( $el.is(':visible') ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.clickedOpenerEl = document.activeElement;\n\n\t\tif ( ! this.views.attached ) {\n\t\t\tthis.attach();\n\t\t}\n\n\t\t// Disable page scrolling.\n\t\t$( 'body' ).addClass( 'modal-open' );\n\n\t\t$el.show();\n\n\t\t// Try to close the onscreen keyboard.\n\t\tif ( 'ontouchend' in document ) {\n\t\t\tif ( ( mceEditor = window.tinymce && window.tinymce.activeEditor ) && ! mceEditor.isHidden() && mceEditor.iframeElement ) {\n\t\t\t\tmceEditor.iframeElement.focus();\n\t\t\t\tmceEditor.iframeElement.blur();\n\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\tmceEditor.iframeElement.blur();\n\t\t\t\t}, 100 );\n\t\t\t}\n\t\t}\n\n\t\t// Set initial focus on the content instead of this view element, to avoid page scrolling.\n\t\tthis.$( '.media-modal' ).trigger( 'focus' );\n\n\t\t// Hide the page content from assistive technologies.\n\t\tthis.focusManager.setAriaHiddenOnBodyChildren( $el );\n\n\t\treturn this.propagate('open');\n\t},\n\n\t/**\n\t * @param {Object} options\n\t * @return {wp.media.view.Modal} Returns itself to allow chaining.\n\t */\n\tclose: function( options ) {\n\t\tif ( ! this.views.attached || ! this.$el.is(':visible') ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Pause current audio/video even after closing the modal.\n\t\t$( '.mejs-pause button' ).trigger( 'click' );\n\n\t\t// Enable page scrolling.\n\t\t$( 'body' ).removeClass( 'modal-open' );\n\n\t\t// Hide the modal element by adding display:none.\n\t\tthis.$el.hide();\n\n\t\t/*\n\t\t * Make visible again to assistive technologies all body children that\n\t\t * have been made hidden when the modal opened.\n\t\t */\n\t\tthis.focusManager.removeAriaHiddenFromBodyChildren();\n\n\t\t// Move focus back in useful location once modal is closed.\n\t\tif ( null !== this.clickedOpenerEl ) {\n\t\t\t// Move focus back to the element that opened the modal.\n\t\t\tthis.clickedOpenerEl.focus();\n\t\t} else {\n\t\t\t// Fallback to the admin page main element.\n\t\t\t$( '#wpbody-content' )\n\t\t\t\t.attr( 'tabindex', '-1' )\n\t\t\t\t.trigger( 'focus' );\n\t\t}\n\n\t\tthis.propagate('close');\n\n\t\tif ( options && options.escape ) {\n\t\t\tthis.propagate('escape');\n\t\t}\n\n\t\treturn this;\n\t},\n\t/**\n\t * @return {wp.media.view.Modal} Returns itself to allow chaining.\n\t */\n\tescape: function() {\n\t\treturn this.close({ escape: true });\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tescapeHandler: function( event ) {\n\t\tevent.preventDefault();\n\t\tthis.escape();\n\t},\n\n\t/**\n\t * @param {Array|Object} content Views to register to '.media-modal-content'\n\t * @return {wp.media.view.Modal} Returns itself to allow chaining.\n\t */\n\tcontent: function( content ) {\n\t\tthis.views.set( '.media-modal-content', content );\n\t\treturn this;\n\t},\n\n\t/**\n\t * Triggers a modal event and if the `propagate` option is set,\n\t * forwards events to the modal's controller.\n\t *\n\t * @param {string} id\n\t * @return {wp.media.view.Modal} Returns itself to allow chaining.\n\t */\n\tpropagate: function( id ) {\n\t\tthis.trigger( id );\n\n\t\tif ( this.options.propagate ) {\n\t\t\tthis.controller.trigger( id );\n\t\t}\n\n\t\treturn this;\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tkeydown: function( event ) {\n\t\t// Close the modal when escape is pressed.\n\t\tif ( 27 === event.which && this.$el.is(':visible') ) {\n\t\t\tthis.escape();\n\t\t\tevent.stopImmediatePropagation();\n\t\t}\n\t}\n});\n\nmodule.exports = Modal;\n\n\n/***/ }),\n\n/***/ \"ibOK\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\tEditImage;\n\n/**\n * wp.media.view.EditImage\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nEditImage = View.extend(/** @lends wp.media.view.EditImage.prototype */{\n\tclassName: 'image-editor',\n\ttemplate: wp.template('image-editor'),\n\n\tinitialize: function( options ) {\n\t\tthis.editor = window.imageEdit;\n\t\tthis.controller = options.controller;\n\t\tView.prototype.initialize.apply( this, arguments );\n\t},\n\n\tprepare: function() {\n\t\treturn this.model.toJSON();\n\t},\n\n\tloadEditor: function() {\n\t\tthis.editor.open( this.model.get( 'id' ), this.model.get( 'nonces' ).edit, this );\n\t},\n\n\tback: function() {\n\t\tvar lastState = this.controller.lastState();\n\t\tthis.controller.setState( lastState );\n\t},\n\n\trefresh: function() {\n\t\tthis.model.fetch();\n\t},\n\n\tsave: function() {\n\t\tvar lastState = this.controller.lastState();\n\n\t\tthis.model.fetch().done( _.bind( function() {\n\t\t\tthis.controller.setState( lastState );\n\t\t}, this ) );\n\t}\n\n});\n\nmodule.exports = EditImage;\n\n\n/***/ }),\n\n/***/ \"iipZ\":\n/***/ (function(module, exports) {\n\nvar Selection = wp.media.model.Selection,\n\tLibrary = wp.media.controller.Library,\n\tCollectionAdd;\n\n/**\n * wp.media.controller.CollectionAdd\n *\n * A state for adding attachments to a collection (e.g. video playlist).\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                     [attributes]                         The attributes hash passed to the state.\n * @param {string}                     [attributes.id=library]              Unique identifier.\n * @param {string}                     attributes.title                     Title for the state. Displays in the frame's title region.\n * @param {boolean}                    [attributes.multiple=add]            Whether multi-select is enabled. @todo 'add' doesn't seem do anything special, and gets used as a boolean.\n * @param {wp.media.model.Attachments} [attributes.library]                 The attachments collection to browse.\n *                                                                          If one is not supplied, a collection of attachments of the specified type will be created.\n * @param {boolean|string}             [attributes.filterable=uploaded]     Whether the library is filterable, and if so what filters should be shown.\n *                                                                          Accepts 'all', 'uploaded', or 'unattached'.\n * @param {string}                     [attributes.menu=gallery]            Initial mode for the menu region.\n * @param {string}                     [attributes.content=upload]          Initial mode for the content region.\n *                                                                          Overridden by persistent user setting if 'contentUserSetting' is true.\n * @param {string}                     [attributes.router=browse]           Initial mode for the router region.\n * @param {string}                     [attributes.toolbar=gallery-add]     Initial mode for the toolbar region.\n * @param {boolean}                    [attributes.searchable=true]         Whether the library is searchable.\n * @param {boolean}                    [attributes.sortable=true]           Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.autoSelect=true]         Whether an uploaded attachment should be automatically added to the selection.\n * @param {boolean}                    [attributes.contentUserSetting=true] Whether the content region's mode should be set and persisted per user.\n * @param {int}                        [attributes.priority=100]            The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.syncSelection=false]     Whether the Attachments selection should be persisted from the last state.\n *                                                                          Defaults to false because for this state, because the library of the Edit Gallery state is the selection.\n * @param {string}                     attributes.type                      The collection's media type. (e.g. 'video').\n * @param {string}                     attributes.collectionType            The collection type. (e.g. 'playlist').\n */\nCollectionAdd = Library.extend(/** @lends wp.media.controller.CollectionAdd.prototype */{\n\tdefaults: _.defaults( {\n\t\t// Selection defaults. @see media.model.Selection\n\t\tmultiple:      'add',\n\t\t// Attachments browser defaults. @see media.view.AttachmentsBrowser\n\t\tfilterable:    'uploaded',\n\n\t\tpriority:      100,\n\t\tsyncSelection: false\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tinitialize: function() {\n\t\tvar collectionType = this.get('collectionType');\n\n\t\tif ( 'video' === this.get( 'type' ) ) {\n\t\t\tcollectionType = 'video-' + collectionType;\n\t\t}\n\n\t\tthis.set( 'id', collectionType + '-library' );\n\t\tthis.set( 'toolbar', collectionType + '-add' );\n\t\tthis.set( 'menu', collectionType );\n\n\t\t// If we haven't been provided a `library`, create a `Selection`.\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', wp.media.query({ type: this.get('type') }) );\n\t\t}\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tactivate: function() {\n\t\tvar library = this.get('library'),\n\t\t\teditLibrary = this.get('editLibrary'),\n\t\t\tedit = this.frame.state( this.get('collectionType') + '-edit' ).get('library');\n\n\t\tif ( editLibrary && editLibrary !== edit ) {\n\t\t\tlibrary.unobserve( editLibrary );\n\t\t}\n\n\t\t// Accepts attachments that exist in the original library and\n\t\t// that do not exist in gallery's library.\n\t\tlibrary.validator = function( attachment ) {\n\t\t\treturn !! this.mirroring.get( attachment.cid ) && ! edit.get( attachment.cid ) && Selection.prototype.validator.apply( this, arguments );\n\t\t};\n\n\t\t/*\n\t\t * Reset the library to ensure that all attachments are re-added\n\t\t * to the collection. Do so silently, as calling `observe` will\n\t\t * trigger the `reset` event.\n\t\t */\n\t\tlibrary.reset( library.mirroring.models, { silent: true });\n\t\tlibrary.observe( edit );\n\t\tthis.set('editLibrary', edit);\n\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t}\n});\n\nmodule.exports = CollectionAdd;\n\n\n/***/ }),\n\n/***/ \"iupV\":\n/***/ (function(module, exports) {\n\n/* global ClipboardJS */\nvar Attachment = wp.media.view.Attachment,\n\tl10n = wp.media.view.l10n,\n\t$ = jQuery,\n\tDetails,\n\t__ = wp.i18n.__;\n\nDetails = Attachment.extend(/** @lends wp.media.view.Attachment.Details.prototype */{\n\ttagName:   'div',\n\tclassName: 'attachment-details',\n\ttemplate:  wp.template('attachment-details'),\n\n\t/*\n\t * Reset all the attributes inherited from Attachment including role=checkbox,\n\t * tabindex, etc., as they are inappropriate for this view. See #47458 and [30483] / #30390.\n\t */\n\tattributes: {},\n\n\tevents: {\n\t\t'change [data-setting]':          'updateSetting',\n\t\t'change [data-setting] input':    'updateSetting',\n\t\t'change [data-setting] select':   'updateSetting',\n\t\t'change [data-setting] textarea': 'updateSetting',\n\t\t'click .delete-attachment':       'deleteAttachment',\n\t\t'click .trash-attachment':        'trashAttachment',\n\t\t'click .untrash-attachment':      'untrashAttachment',\n\t\t'click .edit-attachment':         'editAttachment',\n\t\t'keydown':                        'toggleSelectionHandler'\n\t},\n\n\t/**\n\t * Copies the attachment URL to the clipboard.\n\t *\n\t * @since 5.5.0\n\t *\n\t * @param {MouseEvent} event A click event.\n\t *\n\t * @return {void}\n\t */\n\t copyAttachmentDetailsURLClipboard: function() {\n\t\tvar clipboard = new ClipboardJS( '.copy-attachment-url' ),\n\t\t\tsuccessTimeout;\n\n\t\tclipboard.on( 'success', function( event ) {\n\t\t\tvar triggerElement = $( event.trigger ),\n\t\t\t\tsuccessElement = $( '.success', triggerElement.closest( '.copy-to-clipboard-container' ) );\n\n\t\t\t// Clear the selection and move focus back to the trigger.\n\t\t\tevent.clearSelection();\n\t\t\t// Handle ClipboardJS focus bug, see https://github.com/zenorocha/clipboard.js/issues/680\n\t\t\ttriggerElement.trigger( 'focus' );\n\n\t\t\t// Show success visual feedback.\n\t\t\tclearTimeout( successTimeout );\n\t\t\tsuccessElement.removeClass( 'hidden' );\n\n\t\t\t// Hide success visual feedback after 3 seconds since last success.\n\t\t\tsuccessTimeout = setTimeout( function() {\n\t\t\t\tsuccessElement.addClass( 'hidden' );\n\t\t\t}, 3000 );\n\n\t\t\t// Handle success audible feedback.\n\t\t\twp.a11y.speak( __( 'The file URL has been copied to your clipboard' ) );\n\t\t} );\n\t },\n\n\t/**\n\t * Shows the details of an attachment.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @constructs wp.media.view.Attachment.Details\n\t * @augments wp.media.view.Attachment\n\t *\n\t * @return {void}\n\t */\n\tinitialize: function() {\n\t\tthis.options = _.defaults( this.options, {\n\t\t\trerenderOnModelChange: false\n\t\t});\n\n\t\t// Call 'initialize' directly on the parent class.\n\t\tAttachment.prototype.initialize.apply( this, arguments );\n\n\t\tthis.copyAttachmentDetailsURLClipboard();\n\t},\n\n\t/**\n\t * Gets the focusable elements to move focus to.\n\t *\n\t * @since 5.3.0\n\t */\n\tgetFocusableElements: function() {\n\t\tvar editedAttachment = $( 'li[data-id=\"' + this.model.id + '\"]' );\n\n\t\tthis.previousAttachment = editedAttachment.prev();\n\t\tthis.nextAttachment = editedAttachment.next();\n\t},\n\n\t/**\n\t * Moves focus to the previous or next attachment in the grid.\n\t * Fallbacks to the upload button or media frame when there are no attachments.\n\t *\n\t * @since 5.3.0\n\t */\n\tmoveFocus: function() {\n\t\tif ( this.previousAttachment.length ) {\n\t\t\tthis.previousAttachment.trigger( 'focus' );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.nextAttachment.length ) {\n\t\t\tthis.nextAttachment.trigger( 'focus' );\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback: move focus to the \"Select Files\" button in the media modal.\n\t\tif ( this.controller.uploader && this.controller.uploader.$browser ) {\n\t\t\tthis.controller.uploader.$browser.trigger( 'focus' );\n\t\t\treturn;\n\t\t}\n\n\t\t// Last fallback.\n\t\tthis.moveFocusToLastFallback();\n\t},\n\n\t/**\n\t * Moves focus to the media frame as last fallback.\n\t *\n\t * @since 5.3.0\n\t */\n\tmoveFocusToLastFallback: function() {\n\t\t// Last fallback: make the frame focusable and move focus to it.\n\t\t$( '.media-frame' )\n\t\t\t.attr( 'tabindex', '-1' )\n\t\t\t.trigger( 'focus' );\n\t},\n\n\t/**\n\t * Deletes an attachment.\n\t *\n\t * Deletes an attachment after asking for confirmation. After deletion,\n\t * keeps focus in the modal.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {MouseEvent} event A click event.\n\t *\n\t * @return {void}\n\t */\n\tdeleteAttachment: function( event ) {\n\t\tevent.preventDefault();\n\n\t\tthis.getFocusableElements();\n\n\t\tif ( window.confirm( l10n.warnDelete ) ) {\n\t\t\tthis.model.destroy();\n\t\t\tthis.moveFocus();\n\t\t}\n\t},\n\n\t/**\n\t * Sets the Trash state on an attachment, or destroys the model itself.\n\t *\n\t * If the mediaTrash setting is set to true, trashes the attachment.\n\t * Otherwise, the model itself is destroyed.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param {MouseEvent} event A click event.\n\t *\n\t * @return {void}\n\t */\n\ttrashAttachment: function( event ) {\n\t\tvar library = this.controller.library,\n\t\t\tself = this;\n\t\tevent.preventDefault();\n\n\t\tthis.getFocusableElements();\n\n\t\t// When in the Media Library and the Media Trash is enabled.\n\t\tif ( wp.media.view.settings.mediaTrash &&\n\t\t\t'edit-metadata' === this.controller.content.mode() ) {\n\n\t\t\tthis.model.set( 'status', 'trash' );\n\t\t\tthis.model.save().done( function() {\n\t\t\t\tlibrary._requery( true );\n\t\t\t\t/*\n\t\t\t\t * @todo We need to move focus back to the previous, next, or first\n\t\t\t\t * attachment but the library gets re-queried and refreshed.\n\t\t\t\t * Thus, the references to the previous attachments are lost.\n\t\t\t\t * We need an alternate method.\n\t\t\t\t */\n\t\t\t\tself.moveFocusToLastFallback();\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.model.destroy();\n\t\t\tthis.moveFocus();\n\t\t}\n\t},\n\n\t/**\n\t * Untrashes an attachment.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param {MouseEvent} event A click event.\n\t *\n\t * @return {void}\n\t */\n\tuntrashAttachment: function( event ) {\n\t\tvar library = this.controller.library;\n\t\tevent.preventDefault();\n\n\t\tthis.model.set( 'status', 'inherit' );\n\t\tthis.model.save().done( function() {\n\t\t\tlibrary._requery( true );\n\t\t} );\n\t},\n\n\t/**\n\t * Opens the edit page for a specific attachment.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {MouseEvent} event A click event.\n\t *\n\t * @return {void}\n\t */\n\teditAttachment: function( event ) {\n\t\tvar editState = this.controller.states.get( 'edit-image' );\n\t\tif ( window.imageEdit && editState ) {\n\t\t\tevent.preventDefault();\n\n\t\t\teditState.set( 'image', this.model );\n\t\t\tthis.controller.setState( 'edit-image' );\n\t\t} else {\n\t\t\tthis.$el.addClass('needs-refresh');\n\t\t}\n\t},\n\n\t/**\n\t * Triggers an event on the controller when reverse tabbing (shift+tab).\n\t *\n\t * This event can be used to make sure to move the focus correctly.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @fires wp.media.controller.MediaLibrary#attachment:details:shift-tab\n\t * @fires wp.media.controller.MediaLibrary#attachment:keydown:arrow\n\t *\n\t * @param {KeyboardEvent} event A keyboard event.\n\t *\n\t * @return {boolean|void} Returns false or undefined.\n\t */\n\ttoggleSelectionHandler: function( event ) {\n\t\tif ( 'keydown' === event.type && 9 === event.keyCode && event.shiftKey && event.target === this.$( ':tabbable' ).get( 0 ) ) {\n\t\t\tthis.controller.trigger( 'attachment:details:shift-tab', event );\n\t\t\treturn false;\n\t\t}\n\t},\n\n\trender: function() {\n\t\tAttachment.prototype.render.apply( this, arguments );\n\n\t\twp.media.mixin.removeAllPlayers();\n\t\tthis.$( 'audio, video' ).each( function (i, elem) {\n\t\t\tvar el = wp.media.view.MediaDetails.prepareSrc( elem );\n\t\t\tnew window.MediaElementPlayer( el, wp.media.mixin.mejsSettings );\n\t\t} );\n\t}\n});\n\nmodule.exports = Details;\n\n\n/***/ }),\n\n/***/ \"l2j4\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Heading\n *\n * A reusable heading component for the media library\n *\n * Used to add accessibility friendly headers in the media library/modal.\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Heading = wp.media.View.extend( {\n\ttagName: function() {\n\t\treturn this.options.level || 'h1';\n\t},\n\tclassName: 'media-views-heading',\n\n\tinitialize: function() {\n\n\t\tif ( this.options.className ) {\n\t\t\tthis.$el.addClass( this.options.className );\n\t\t}\n\n\t\tthis.text = this.options.text;\n\t},\n\n\trender: function() {\n\t\tthis.$el.html( this.text );\n\t\treturn this;\n\t}\n} );\n\nmodule.exports = Heading;\n\n\n/***/ }),\n\n/***/ \"mVaH\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.controller.MediaLibrary\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n */\nvar Library = wp.media.controller.Library,\n\tMediaLibrary;\n\nMediaLibrary = Library.extend(/** @lends wp.media.controller.MediaLibrary.prototype */{\n\tdefaults: _.defaults({\n\t\t// Attachments browser defaults. @see media.view.AttachmentsBrowser\n\t\tfilterable:      'uploaded',\n\n\t\tdisplaySettings: false,\n\t\tpriority:        80,\n\t\tsyncSelection:   false\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * @since 3.9.0\n\t *\n\t * @param options\n\t */\n\tinitialize: function( options ) {\n\t\tthis.media = options.media;\n\t\tthis.type = options.type;\n\t\tthis.set( 'library', wp.media.query({ type: this.type }) );\n\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tactivate: function() {\n\t\t// @todo this should use this.frame.\n\t\tif ( wp.media.frame.lastMime ) {\n\t\t\tthis.set( 'library', wp.media.query({ type: wp.media.frame.lastMime }) );\n\t\t\tdelete wp.media.frame.lastMime;\n\t\t}\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t}\n});\n\nmodule.exports = MediaLibrary;\n\n\n/***/ }),\n\n/***/ \"ng6N\":\n/***/ (function(module, exports) {\n\nvar Selection = wp.media.model.Selection,\n\tLibrary = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tGalleryAdd;\n\n/**\n * wp.media.controller.GalleryAdd\n *\n * A state for selecting more images to add to a gallery.\n *\n * @since 3.5.0\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @memberof wp.media.controller\n *\n * @param {Object}                     [attributes]                         The attributes hash passed to the state.\n * @param {string}                     [attributes.id=gallery-library]      Unique identifier.\n * @param {string}                     [attributes.title=Add to Gallery]    Title for the state. Displays in the frame's title region.\n * @param {boolean}                    [attributes.multiple=add]            Whether multi-select is enabled. @todo 'add' doesn't seem do anything special, and gets used as a boolean.\n * @param {wp.media.model.Attachments} [attributes.library]                 The attachments collection to browse.\n *                                                                          If one is not supplied, a collection of all images will be created.\n * @param {boolean|string}             [attributes.filterable=uploaded]     Whether the library is filterable, and if so what filters should be shown.\n *                                                                          Accepts 'all', 'uploaded', or 'unattached'.\n * @param {string}                     [attributes.menu=gallery]            Initial mode for the menu region.\n * @param {string}                     [attributes.content=upload]          Initial mode for the content region.\n *                                                                          Overridden by persistent user setting if 'contentUserSetting' is true.\n * @param {string}                     [attributes.router=browse]           Initial mode for the router region.\n * @param {string}                     [attributes.toolbar=gallery-add]     Initial mode for the toolbar region.\n * @param {boolean}                    [attributes.searchable=true]         Whether the library is searchable.\n * @param {boolean}                    [attributes.sortable=true]           Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.autoSelect=true]         Whether an uploaded attachment should be automatically added to the selection.\n * @param {boolean}                    [attributes.contentUserSetting=true] Whether the content region's mode should be set and persisted per user.\n * @param {number}                     [attributes.priority=100]            The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.syncSelection=false]     Whether the Attachments selection should be persisted from the last state.\n *                                                                          Defaults to false because for this state, because the library of the Edit Gallery state is the selection.\n */\nGalleryAdd = Library.extend(/** @lends wp.media.controller.GalleryAdd.prototype */{\n\tdefaults: _.defaults({\n\t\tid:            'gallery-library',\n\t\ttitle:         l10n.addToGalleryTitle,\n\t\tmultiple:      'add',\n\t\tfilterable:    'uploaded',\n\t\tmenu:          'gallery',\n\t\ttoolbar:       'gallery-add',\n\t\tpriority:      100,\n\t\tsyncSelection: false\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * Initializes the library. Creates a library of images if a library isn't supplied.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {void}\n\t */\n\tinitialize: function() {\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', wp.media.query({ type: 'image' }) );\n\t\t}\n\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * Activates the library.\n\t *\n\t * Removes all event listeners if in edit mode. Creates a validator to check an attachment.\n\t * Resets library and re-enables event listeners. Activates edit mode. Calls the parent's activate method.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {void}\n\t */\n\tactivate: function() {\n\t\tvar library = this.get('library'),\n\t\t\tedit    = this.frame.state('gallery-edit').get('library');\n\n\t\tif ( this.editLibrary && this.editLibrary !== edit ) {\n\t\t\tlibrary.unobserve( this.editLibrary );\n\t\t}\n\n\t\t/*\n\t\t * Accept attachments that exist in the original library but\n\t\t * that do not exist in gallery's library yet.\n\t\t */\n\t\tlibrary.validator = function( attachment ) {\n\t\t\treturn !! this.mirroring.get( attachment.cid ) && ! edit.get( attachment.cid ) && Selection.prototype.validator.apply( this, arguments );\n\t\t};\n\n\t\t/*\n\t\t * Reset the library to ensure that all attachments are re-added\n\t\t * to the collection. Do so silently, as calling `observe` will\n\t\t * trigger the `reset` event.\n\t\t */\n\t\tlibrary.reset( library.mirroring.models, { silent: true });\n\t\tlibrary.observe( edit );\n\t\tthis.editLibrary = edit;\n\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t}\n});\n\nmodule.exports = GalleryAdd;\n\n\n/***/ }),\n\n/***/ \"nwwF\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\t$ = Backbone.$,\n\tSettings;\n\n/**\n * wp.media.view.Settings\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nSettings = View.extend(/** @lends wp.media.view.Settings.prototype */{\n\tevents: {\n\t\t'click button':    'updateHandler',\n\t\t'change input':    'updateHandler',\n\t\t'change select':   'updateHandler',\n\t\t'change textarea': 'updateHandler'\n\t},\n\n\tinitialize: function() {\n\t\tthis.model = this.model || new Backbone.Model();\n\t\tthis.listenTo( this.model, 'change', this.updateChanges );\n\t},\n\n\tprepare: function() {\n\t\treturn _.defaults({\n\t\t\tmodel: this.model.toJSON()\n\t\t}, this.options );\n\t},\n\t/**\n\t * @return {wp.media.view.Settings} Returns itself to allow chaining.\n\t */\n\trender: function() {\n\t\tView.prototype.render.apply( this, arguments );\n\t\t// Select the correct values.\n\t\t_( this.model.attributes ).chain().keys().each( this.update, this );\n\t\treturn this;\n\t},\n\t/**\n\t * @param {string} key\n\t */\n\tupdate: function( key ) {\n\t\tvar value = this.model.get( key ),\n\t\t\t$setting = this.$('[data-setting=\"' + key + '\"]'),\n\t\t\t$buttons, $value;\n\n\t\t// Bail if we didn't find a matching setting.\n\t\tif ( ! $setting.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Attempt to determine how the setting is rendered and update\n\t\t// the selected value.\n\n\t\t// Handle dropdowns.\n\t\tif ( $setting.is('select') ) {\n\t\t\t$value = $setting.find('[value=\"' + value + '\"]');\n\n\t\t\tif ( $value.length ) {\n\t\t\t\t$setting.find('option').prop( 'selected', false );\n\t\t\t\t$value.prop( 'selected', true );\n\t\t\t} else {\n\t\t\t\t// If we can't find the desired value, record what *is* selected.\n\t\t\t\tthis.model.set( key, $setting.find(':selected').val() );\n\t\t\t}\n\n\t\t// Handle button groups.\n\t\t} else if ( $setting.hasClass('button-group') ) {\n\t\t\t$buttons = $setting.find( 'button' )\n\t\t\t\t.removeClass( 'active' )\n\t\t\t\t.attr( 'aria-pressed', 'false' );\n\t\t\t$buttons.filter( '[value=\"' + value + '\"]' )\n\t\t\t\t.addClass( 'active' )\n\t\t\t\t.attr( 'aria-pressed', 'true' );\n\n\t\t// Handle text inputs and textareas.\n\t\t} else if ( $setting.is('input[type=\"text\"], textarea') ) {\n\t\t\tif ( ! $setting.is(':focus') ) {\n\t\t\t\t$setting.val( value );\n\t\t\t}\n\t\t// Handle checkboxes.\n\t\t} else if ( $setting.is('input[type=\"checkbox\"]') ) {\n\t\t\t$setting.prop( 'checked', !! value && 'false' !== value );\n\t\t}\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tupdateHandler: function( event ) {\n\t\tvar $setting = $( event.target ).closest('[data-setting]'),\n\t\t\tvalue = event.target.value,\n\t\t\tuserSetting;\n\n\t\tevent.preventDefault();\n\n\t\tif ( ! $setting.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Use the correct value for checkboxes.\n\t\tif ( $setting.is('input[type=\"checkbox\"]') ) {\n\t\t\tvalue = $setting[0].checked;\n\t\t}\n\n\t\t// Update the corresponding setting.\n\t\tthis.model.set( $setting.data('setting'), value );\n\n\t\t// If the setting has a corresponding user setting,\n\t\t// update that as well.\n\t\tuserSetting = $setting.data('userSetting');\n\t\tif ( userSetting ) {\n\t\t\twindow.setUserSetting( userSetting, value );\n\t\t}\n\t},\n\n\tupdateChanges: function( model ) {\n\t\tif ( model.hasChanged() ) {\n\t\t\t_( model.changed ).chain().keys().each( this.update, this );\n\t\t}\n\t}\n});\n\nmodule.exports = Settings;\n\n\n/***/ }),\n\n/***/ \"ojD6\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\t$ = jQuery,\n\tAttachments,\n\tinfiniteScrolling = wp.media.view.settings.infiniteScrolling;\n\nAttachments = View.extend(/** @lends wp.media.view.Attachments.prototype */{\n\ttagName:   'ul',\n\tclassName: 'attachments',\n\n\tattributes: {\n\t\ttabIndex: -1\n\t},\n\n\t/**\n\t * Represents the overview of attachments in the Media Library.\n\t *\n\t * The constructor binds events to the collection this view represents when\n\t * adding or removing attachments or resetting the entire collection.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @constructs\n\t * @memberof wp.media.view\n\t *\n\t * @augments wp.media.View\n\t *\n\t * @listens collection:add\n\t * @listens collection:remove\n\t * @listens collection:reset\n\t * @listens controller:library:selection:add\n\t * @listens scrollElement:scroll\n\t * @listens this:ready\n\t * @listens controller:open\n\t */\n\tinitialize: function() {\n\t\tthis.el.id = _.uniqueId('__attachments-view-');\n\n\t\t/**\n\t\t * @since 5.8.0 Added the `infiniteScrolling` parameter.\n\t\t *\n\t\t * @param infiniteScrolling  Whether to enable infinite scrolling or use\n\t\t *                           the default \"load more\" button.\n\t\t * @param refreshSensitivity The time in milliseconds to throttle the scroll\n\t\t *                           handler.\n\t\t * @param refreshThreshold   The amount of pixels that should be scrolled before\n\t\t *                           loading more attachments from the server.\n\t\t * @param AttachmentView     The view class to be used for models in the\n\t\t *                           collection.\n\t\t * @param sortable           A jQuery sortable options object\n\t\t *                           ( http://api.jqueryui.com/sortable/ ).\n\t\t * @param resize             A boolean indicating whether or not to listen to\n\t\t *                           resize events.\n\t\t * @param idealColumnWidth   The width in pixels which a column should have when\n\t\t *                           calculating the total number of columns.\n\t\t */\n\t\t_.defaults( this.options, {\n\t\t\tinfiniteScrolling:  infiniteScrolling || false,\n\t\t\trefreshSensitivity: wp.media.isTouchDevice ? 300 : 200,\n\t\t\trefreshThreshold:   3,\n\t\t\tAttachmentView:     wp.media.view.Attachment,\n\t\t\tsortable:           false,\n\t\t\tresize:             true,\n\t\t\tidealColumnWidth:   $( window ).width() < 640 ? 135 : 150\n\t\t});\n\n\t\tthis._viewsByCid = {};\n\t\tthis.$window = $( window );\n\t\tthis.resizeEvent = 'resize.media-modal-columns';\n\n\t\tthis.collection.on( 'add', function( attachment ) {\n\t\t\tthis.views.add( this.createAttachmentView( attachment ), {\n\t\t\t\tat: this.collection.indexOf( attachment )\n\t\t\t});\n\t\t}, this );\n\n\t\t/*\n\t\t * Find the view to be removed, delete it and call the remove function to clear\n\t\t * any set event handlers.\n\t\t */\n\t\tthis.collection.on( 'remove', function( attachment ) {\n\t\t\tvar view = this._viewsByCid[ attachment.cid ];\n\t\t\tdelete this._viewsByCid[ attachment.cid ];\n\n\t\t\tif ( view ) {\n\t\t\t\tview.remove();\n\t\t\t}\n\t\t}, this );\n\n\t\tthis.collection.on( 'reset', this.render, this );\n\n\t\tthis.controller.on( 'library:selection:add', this.attachmentFocus, this );\n\n\t\tif ( this.options.infiniteScrolling ) {\n\t\t\t// Throttle the scroll handler and bind this.\n\t\t\tthis.scroll = _.chain( this.scroll ).bind( this ).throttle( this.options.refreshSensitivity ).value();\n\n\t\t\tthis.options.scrollElement = this.options.scrollElement || this.el;\n\t\t\t$( this.options.scrollElement ).on( 'scroll', this.scroll );\n\t\t}\n\n\t\tthis.initSortable();\n\n\t\t_.bindAll( this, 'setColumns' );\n\n\t\tif ( this.options.resize ) {\n\t\t\tthis.on( 'ready', this.bindEvents );\n\t\t\tthis.controller.on( 'open', this.setColumns );\n\n\t\t\t/*\n\t\t\t * Call this.setColumns() after this view has been rendered in the\n\t\t\t * DOM so attachments get proper width applied.\n\t\t\t */\n\t\t\t_.defer( this.setColumns, this );\n\t\t}\n\t},\n\n\t/**\n\t * Listens to the resizeEvent on the window.\n\t *\n\t * Adjusts the amount of columns accordingly. First removes any existing event\n\t * handlers to prevent duplicate listeners.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @listens window:resize\n\t *\n\t * @return {void}\n\t */\n\tbindEvents: function() {\n\t\tthis.$window.off( this.resizeEvent ).on( this.resizeEvent, _.debounce( this.setColumns, 50 ) );\n\t},\n\n\t/**\n\t * Focuses the first item in the collection.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @return {void}\n\t */\n\tattachmentFocus: function() {\n\t\t/*\n\t\t * @todo When uploading new attachments, this tries to move focus to\n\t\t * the attachments grid. Actually, a progress bar gets initially displayed\n\t\t * and then updated when uploading completes, so focus is lost.\n\t\t * Additionally: this view is used for both the attachments list and\n\t\t * the list of selected attachments in the bottom media toolbar. Thus, when\n\t\t * uploading attachments, it is called twice and returns two different `this`.\n\t\t * `this.columns` is truthy within the modal.\n\t\t */\n\t\tif ( this.columns ) {\n\t\t\t// Move focus to the grid list within the modal.\n\t\t\tthis.$el.focus();\n\t\t}\n\t},\n\n\t/**\n\t * Restores focus to the selected item in the collection.\n\t *\n\t * Moves focus back to the first selected attachment in the grid. Used when\n\t * tabbing backwards from the attachment details sidebar.\n\t * See media.view.AttachmentsBrowser.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @return {void}\n\t */\n\trestoreFocus: function() {\n\t\tthis.$( 'li.selected:first' ).focus();\n\t},\n\n\t/**\n\t * Handles events for arrow key presses.\n\t *\n\t * Focuses the attachment in the direction of the used arrow key if it exists.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param {KeyboardEvent} event The keyboard event that triggered this function.\n\t *\n\t * @return {void}\n\t */\n\tarrowEvent: function( event ) {\n\t\tvar attachments = this.$el.children( 'li' ),\n\t\t\tperRow = this.columns,\n\t\t\tindex = attachments.filter( ':focus' ).index(),\n\t\t\trow = ( index + 1 ) <= perRow ? 1 : Math.ceil( ( index + 1 ) / perRow );\n\n\t\tif ( index === -1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Left arrow = 37.\n\t\tif ( 37 === event.keyCode ) {\n\t\t\tif ( 0 === index ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tattachments.eq( index - 1 ).focus();\n\t\t}\n\n\t\t// Up arrow = 38.\n\t\tif ( 38 === event.keyCode ) {\n\t\t\tif ( 1 === row ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tattachments.eq( index - perRow ).focus();\n\t\t}\n\n\t\t// Right arrow = 39.\n\t\tif ( 39 === event.keyCode ) {\n\t\t\tif ( attachments.length === index ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tattachments.eq( index + 1 ).focus();\n\t\t}\n\n\t\t// Down arrow = 40.\n\t\tif ( 40 === event.keyCode ) {\n\t\t\tif ( Math.ceil( attachments.length / perRow ) === row ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tattachments.eq( index + perRow ).focus();\n\t\t}\n\t},\n\n\t/**\n\t * Clears any set event handlers.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {void}\n\t */\n\tdispose: function() {\n\t\tthis.collection.props.off( null, null, this );\n\t\tif ( this.options.resize ) {\n\t\t\tthis.$window.off( this.resizeEvent );\n\t\t}\n\n\t\t// Call 'dispose' directly on the parent class.\n\t\tView.prototype.dispose.apply( this, arguments );\n\t},\n\n\t/**\n\t * Calculates the amount of columns.\n\t *\n\t * Calculates the amount of columns and sets it on the data-columns attribute\n\t * of .media-frame-content.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @return {void}\n\t */\n\tsetColumns: function() {\n\t\tvar prev = this.columns,\n\t\t\twidth = this.$el.width();\n\n\t\tif ( width ) {\n\t\t\tthis.columns = Math.min( Math.round( width / this.options.idealColumnWidth ), 12 ) || 1;\n\n\t\t\tif ( ! prev || prev !== this.columns ) {\n\t\t\t\tthis.$el.closest( '.media-frame-content' ).attr( 'data-columns', this.columns );\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Initializes jQuery sortable on the attachment list.\n\t *\n\t * Fails gracefully if jQuery sortable doesn't exist or isn't passed\n\t * in the options.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @fires collection:reset\n\t *\n\t * @return {void}\n\t */\n\tinitSortable: function() {\n\t\tvar collection = this.collection;\n\n\t\tif ( ! this.options.sortable || ! $.fn.sortable ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.$el.sortable( _.extend({\n\t\t\t// If the `collection` has a `comparator`, disable sorting.\n\t\t\tdisabled: !! collection.comparator,\n\n\t\t\t/*\n\t\t\t * Change the position of the attachment as soon as the mouse pointer\n\t\t\t * overlaps a thumbnail.\n\t\t\t */\n\t\t\ttolerance: 'pointer',\n\n\t\t\t// Record the initial `index` of the dragged model.\n\t\t\tstart: function( event, ui ) {\n\t\t\t\tui.item.data('sortableIndexStart', ui.item.index());\n\t\t\t},\n\n\t\t\t/*\n\t\t\t * Update the model's index in the collection. Do so silently, as the view\n\t\t\t * is already accurate.\n\t\t\t */\n\t\t\tupdate: function( event, ui ) {\n\t\t\t\tvar model = collection.at( ui.item.data('sortableIndexStart') ),\n\t\t\t\t\tcomparator = collection.comparator;\n\n\t\t\t\t// Temporarily disable the comparator to prevent `add`\n\t\t\t\t// from re-sorting.\n\t\t\t\tdelete collection.comparator;\n\n\t\t\t\t// Silently shift the model to its new index.\n\t\t\t\tcollection.remove( model, {\n\t\t\t\t\tsilent: true\n\t\t\t\t});\n\t\t\t\tcollection.add( model, {\n\t\t\t\t\tsilent: true,\n\t\t\t\t\tat:     ui.item.index()\n\t\t\t\t});\n\n\t\t\t\t// Restore the comparator.\n\t\t\t\tcollection.comparator = comparator;\n\n\t\t\t\t// Fire the `reset` event to ensure other collections sync.\n\t\t\t\tcollection.trigger( 'reset', collection );\n\n\t\t\t\t// If the collection is sorted by menu order, update the menu order.\n\t\t\t\tcollection.saveMenuOrder();\n\t\t\t}\n\t\t}, this.options.sortable ) );\n\n\t\t/*\n\t\t * If the `orderby` property is changed on the `collection`,\n\t\t * check to see if we have a `comparator`. If so, disable sorting.\n\t\t */\n\t\tcollection.props.on( 'change:orderby', function() {\n\t\t\tthis.$el.sortable( 'option', 'disabled', !! collection.comparator );\n\t\t}, this );\n\n\t\tthis.collection.props.on( 'change:orderby', this.refreshSortable, this );\n\t\tthis.refreshSortable();\n\t},\n\n\t/**\n\t * Disables jQuery sortable if collection has a comparator or collection.orderby\n\t * equals menuOrder.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {void}\n\t */\n\trefreshSortable: function() {\n\t\tif ( ! this.options.sortable || ! $.fn.sortable ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar collection = this.collection,\n\t\t\torderby = collection.props.get('orderby'),\n\t\t\tenabled = 'menuOrder' === orderby || ! collection.comparator;\n\n\t\tthis.$el.sortable( 'option', 'disabled', ! enabled );\n\t},\n\n\t/**\n\t * Creates a new view for an attachment and adds it to _viewsByCid.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t *\n\t * @return {wp.media.View} The created view.\n\t */\n\tcreateAttachmentView: function( attachment ) {\n\t\tvar view = new this.options.AttachmentView({\n\t\t\tcontroller:           this.controller,\n\t\t\tmodel:                attachment,\n\t\t\tcollection:           this.collection,\n\t\t\tselection:            this.options.selection\n\t\t});\n\n\t\treturn this._viewsByCid[ attachment.cid ] = view;\n\t},\n\n\t/**\n\t * Prepares view for display.\n\t *\n\t * Creates views for every attachment in collection if the collection is not\n\t * empty, otherwise clears all views and loads more attachments.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {void}\n\t */\n\tprepare: function() {\n\t\tif ( this.collection.length ) {\n\t\t\tthis.views.set( this.collection.map( this.createAttachmentView, this ) );\n\t\t} else {\n\t\t\tthis.views.unset();\n\t\t\tif ( this.options.infiniteScrolling ) {\n\t\t\t\tthis.collection.more().done( this.scroll );\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Triggers the scroll function to check if we should query for additional\n\t * attachments right away.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {void}\n\t */\n\tready: function() {\n\t\tif ( this.options.infiniteScrolling ) {\n\t\t\tthis.scroll();\n\t\t}\n\t},\n\n\t/**\n\t * Handles scroll events.\n\t *\n\t * Shows the spinner if we're close to the bottom. Loads more attachments from\n\t * server if we're {refreshThreshold} times away from the bottom.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return {void}\n\t */\n\tscroll: function() {\n\t\tvar view = this,\n\t\t\tel = this.options.scrollElement,\n\t\t\tscrollTop = el.scrollTop,\n\t\t\ttoolbar;\n\n\t\t/*\n\t\t * The scroll event occurs on the document, but the element that should be\n\t\t * checked is the document body.\n\t\t */\n\t\tif ( el === document ) {\n\t\t\tel = document.body;\n\t\t\tscrollTop = $(document).scrollTop();\n\t\t}\n\n\t\tif ( ! $(el).is(':visible') || ! this.collection.hasMore() ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttoolbar = this.views.parent.toolbar;\n\n\t\t// Show the spinner only if we are close to the bottom.\n\t\tif ( el.scrollHeight - ( scrollTop + el.clientHeight ) < el.clientHeight / 3 ) {\n\t\t\ttoolbar.get('spinner').show();\n\t\t}\n\n\t\tif ( el.scrollHeight < scrollTop + ( el.clientHeight * this.options.refreshThreshold ) ) {\n\t\t\tthis.collection.more().done(function() {\n\t\t\t\tview.scroll();\n\t\t\t\ttoolbar.get('spinner').hide();\n\t\t\t});\n\t\t}\n\t}\n});\n\nmodule.exports = Attachments;\n\n\n/***/ }),\n\n/***/ \"qe5n\":\n/***/ (function(module, exports) {\n\nvar l10n = wp.media.view.l10n,\n\t$ = Backbone.$,\n\tEmbed;\n\n/**\n * wp.media.controller.Embed\n *\n * A state for embedding media from a URL.\n *\n * @memberOf wp.media.controller\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object} attributes                         The attributes hash passed to the state.\n * @param {string} [attributes.id=embed]              Unique identifier.\n * @param {string} [attributes.title=Insert From URL] Title for the state. Displays in the media menu and the frame's title region.\n * @param {string} [attributes.content=embed]         Initial mode for the content region.\n * @param {string} [attributes.menu=default]          Initial mode for the menu region.\n * @param {string} [attributes.toolbar=main-embed]    Initial mode for the toolbar region.\n * @param {string} [attributes.menu=false]            Initial mode for the menu region.\n * @param {int}    [attributes.priority=120]          The priority for the state link in the media menu.\n * @param {string} [attributes.type=link]             The type of embed. Currently only link is supported.\n * @param {string} [attributes.url]                   The embed URL.\n * @param {object} [attributes.metadata={}]           Properties of the embed, which will override attributes.url if set.\n */\nEmbed = wp.media.controller.State.extend(/** @lends wp.media.controller.Embed.prototype */{\n\tdefaults: {\n\t\tid:       'embed',\n\t\ttitle:    l10n.insertFromUrlTitle,\n\t\tcontent:  'embed',\n\t\tmenu:     'default',\n\t\ttoolbar:  'main-embed',\n\t\tpriority: 120,\n\t\ttype:     'link',\n\t\turl:      '',\n\t\tmetadata: {}\n\t},\n\n\t// The amount of time used when debouncing the scan.\n\tsensitivity: 400,\n\n\tinitialize: function(options) {\n\t\tthis.metadata = options.metadata;\n\t\tthis.debouncedScan = _.debounce( _.bind( this.scan, this ), this.sensitivity );\n\t\tthis.props = new Backbone.Model( this.metadata || { url: '' });\n\t\tthis.props.on( 'change:url', this.debouncedScan, this );\n\t\tthis.props.on( 'change:url', this.refresh, this );\n\t\tthis.on( 'scan', this.scanImage, this );\n\t},\n\n\t/**\n\t * Trigger a scan of the embedded URL's content for metadata required to embed.\n\t *\n\t * @fires wp.media.controller.Embed#scan\n\t */\n\tscan: function() {\n\t\tvar scanners,\n\t\t\tembed = this,\n\t\t\tattributes = {\n\t\t\t\ttype: 'link',\n\t\t\t\tscanners: []\n\t\t\t};\n\n\t\t/*\n\t\t * Scan is triggered with the list of `attributes` to set on the\n\t\t * state, useful for the 'type' attribute and 'scanners' attribute,\n\t\t * an array of promise objects for asynchronous scan operations.\n\t\t */\n\t\tif ( this.props.get('url') ) {\n\t\t\tthis.trigger( 'scan', attributes );\n\t\t}\n\n\t\tif ( attributes.scanners.length ) {\n\t\t\tscanners = attributes.scanners = $.when.apply( $, attributes.scanners );\n\t\t\tscanners.always( function() {\n\t\t\t\tif ( embed.get('scanners') === scanners ) {\n\t\t\t\t\tembed.set( 'loading', false );\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tattributes.scanners = null;\n\t\t}\n\n\t\tattributes.loading = !! attributes.scanners;\n\t\tthis.set( attributes );\n\t},\n\t/**\n\t * Try scanning the embed as an image to discover its dimensions.\n\t *\n\t * @param {Object} attributes\n\t */\n\tscanImage: function( attributes ) {\n\t\tvar frame = this.frame,\n\t\t\tstate = this,\n\t\t\turl = this.props.get('url'),\n\t\t\timage = new Image(),\n\t\t\tdeferred = $.Deferred();\n\n\t\tattributes.scanners.push( deferred.promise() );\n\n\t\t// Try to load the image and find its width/height.\n\t\timage.onload = function() {\n\t\t\tdeferred.resolve();\n\n\t\t\tif ( state !== frame.state() || url !== state.props.get('url') ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstate.set({\n\t\t\t\ttype: 'image'\n\t\t\t});\n\n\t\t\tstate.props.set({\n\t\t\t\twidth:  image.width,\n\t\t\t\theight: image.height\n\t\t\t});\n\t\t};\n\n\t\timage.onerror = deferred.reject;\n\t\timage.src = url;\n\t},\n\n\trefresh: function() {\n\t\tthis.frame.toolbar.get().refresh();\n\t},\n\n\treset: function() {\n\t\tthis.props.clear().set({ url: '' });\n\n\t\tif ( this.active ) {\n\t\t\tthis.refresh();\n\t\t}\n\t}\n});\n\nmodule.exports = Embed;\n\n\n/***/ }),\n\n/***/ \"sULL\":\n/***/ (function(module, exports) {\n\nvar View = wp.media.View,\n\t$ = jQuery,\n\tAttachment;\n\n/**\n * wp.media.view.Attachment\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nAttachment = View.extend(/** @lends wp.media.view.Attachment.prototype */{\n\ttagName:   'li',\n\tclassName: 'attachment',\n\ttemplate:  wp.template('attachment'),\n\n\tattributes: function() {\n\t\treturn {\n\t\t\t'tabIndex':     0,\n\t\t\t'role':         'checkbox',\n\t\t\t'aria-label':   this.model.get( 'title' ),\n\t\t\t'aria-checked': false,\n\t\t\t'data-id':      this.model.get( 'id' )\n\t\t};\n\t},\n\n\tevents: {\n\t\t'click':                          'toggleSelectionHandler',\n\t\t'change [data-setting]':          'updateSetting',\n\t\t'change [data-setting] input':    'updateSetting',\n\t\t'change [data-setting] select':   'updateSetting',\n\t\t'change [data-setting] textarea': 'updateSetting',\n\t\t'click .attachment-close':        'removeFromLibrary',\n\t\t'click .check':                   'checkClickHandler',\n\t\t'keydown':                        'toggleSelectionHandler'\n\t},\n\n\tbuttons: {},\n\n\tinitialize: function() {\n\t\tvar selection = this.options.selection,\n\t\t\toptions = _.defaults( this.options, {\n\t\t\t\trerenderOnModelChange: true\n\t\t\t} );\n\n\t\tif ( options.rerenderOnModelChange ) {\n\t\t\tthis.listenTo( this.model, 'change', this.render );\n\t\t} else {\n\t\t\tthis.listenTo( this.model, 'change:percent', this.progress );\n\t\t}\n\t\tthis.listenTo( this.model, 'change:title', this._syncTitle );\n\t\tthis.listenTo( this.model, 'change:caption', this._syncCaption );\n\t\tthis.listenTo( this.model, 'change:artist', this._syncArtist );\n\t\tthis.listenTo( this.model, 'change:album', this._syncAlbum );\n\n\t\t// Update the selection.\n\t\tthis.listenTo( this.model, 'add', this.select );\n\t\tthis.listenTo( this.model, 'remove', this.deselect );\n\t\tif ( selection ) {\n\t\t\tselection.on( 'reset', this.updateSelect, this );\n\t\t\t// Update the model's details view.\n\t\t\tthis.listenTo( this.model, 'selection:single selection:unsingle', this.details );\n\t\t\tthis.details( this.model, this.controller.state().get('selection') );\n\t\t}\n\n\t\tthis.listenTo( this.controller.states, 'attachment:compat:waiting attachment:compat:ready', this.updateSave );\n\t},\n\t/**\n\t * @return {wp.media.view.Attachment} Returns itself to allow chaining.\n\t */\n\tdispose: function() {\n\t\tvar selection = this.options.selection;\n\n\t\t// Make sure all settings are saved before removing the view.\n\t\tthis.updateAll();\n\n\t\tif ( selection ) {\n\t\t\tselection.off( null, null, this );\n\t\t}\n\t\t/**\n\t\t * call 'dispose' directly on the parent class\n\t\t */\n\t\tView.prototype.dispose.apply( this, arguments );\n\t\treturn this;\n\t},\n\t/**\n\t * @return {wp.media.view.Attachment} Returns itself to allow chaining.\n\t */\n\trender: function() {\n\t\tvar options = _.defaults( this.model.toJSON(), {\n\t\t\t\torientation:   'landscape',\n\t\t\t\tuploading:     false,\n\t\t\t\ttype:          '',\n\t\t\t\tsubtype:       '',\n\t\t\t\ticon:          '',\n\t\t\t\tfilename:      '',\n\t\t\t\tcaption:       '',\n\t\t\t\ttitle:         '',\n\t\t\t\tdateFormatted: '',\n\t\t\t\twidth:         '',\n\t\t\t\theight:        '',\n\t\t\t\tcompat:        false,\n\t\t\t\talt:           '',\n\t\t\t\tdescription:   ''\n\t\t\t}, this.options );\n\n\t\toptions.buttons  = this.buttons;\n\t\toptions.describe = this.controller.state().get('describe');\n\n\t\tif ( 'image' === options.type ) {\n\t\t\toptions.size = this.imageSize();\n\t\t}\n\n\t\toptions.can = {};\n\t\tif ( options.nonces ) {\n\t\t\toptions.can.remove = !! options.nonces['delete'];\n\t\t\toptions.can.save = !! options.nonces.update;\n\t\t}\n\n\t\tif ( this.controller.state().get('allowLocalEdits') ) {\n\t\t\toptions.allowLocalEdits = true;\n\t\t}\n\n\t\tif ( options.uploading && ! options.percent ) {\n\t\t\toptions.percent = 0;\n\t\t}\n\n\t\tthis.views.detach();\n\t\tthis.$el.html( this.template( options ) );\n\n\t\tthis.$el.toggleClass( 'uploading', options.uploading );\n\n\t\tif ( options.uploading ) {\n\t\t\tthis.$bar = this.$('.media-progress-bar div');\n\t\t} else {\n\t\t\tdelete this.$bar;\n\t\t}\n\n\t\t// Check if the model is selected.\n\t\tthis.updateSelect();\n\n\t\t// Update the save status.\n\t\tthis.updateSave();\n\n\t\tthis.views.render();\n\n\t\treturn this;\n\t},\n\n\tprogress: function() {\n\t\tif ( this.$bar && this.$bar.length ) {\n\t\t\tthis.$bar.width( this.model.get('percent') + '%' );\n\t\t}\n\t},\n\n\t/**\n\t * @param {Object} event\n\t */\n\ttoggleSelectionHandler: function( event ) {\n\t\tvar method;\n\n\t\t// Don't do anything inside inputs and on the attachment check and remove buttons.\n\t\tif ( 'INPUT' === event.target.nodeName || 'BUTTON' === event.target.nodeName ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Catch arrow events.\n\t\tif ( 37 === event.keyCode || 38 === event.keyCode || 39 === event.keyCode || 40 === event.keyCode ) {\n\t\t\tthis.controller.trigger( 'attachment:keydown:arrow', event );\n\t\t\treturn;\n\t\t}\n\n\t\t// Catch enter and space events.\n\t\tif ( 'keydown' === event.type && 13 !== event.keyCode && 32 !== event.keyCode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\t// In the grid view, bubble up an edit:attachment event to the controller.\n\t\tif ( this.controller.isModeActive( 'grid' ) ) {\n\t\t\tif ( this.controller.isModeActive( 'edit' ) ) {\n\t\t\t\t// Pass the current target to restore focus when closing.\n\t\t\t\tthis.controller.trigger( 'edit:attachment', this.model, event.currentTarget );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.controller.isModeActive( 'select' ) ) {\n\t\t\t\tmethod = 'toggle';\n\t\t\t}\n\t\t}\n\n\t\tif ( event.shiftKey ) {\n\t\t\tmethod = 'between';\n\t\t} else if ( event.ctrlKey || event.metaKey ) {\n\t\t\tmethod = 'toggle';\n\t\t}\n\n\t\tthis.toggleSelection({\n\t\t\tmethod: method\n\t\t});\n\n\t\tthis.controller.trigger( 'selection:toggle' );\n\t},\n\t/**\n\t * @param {Object} options\n\t */\n\ttoggleSelection: function( options ) {\n\t\tvar collection = this.collection,\n\t\t\tselection = this.options.selection,\n\t\t\tmodel = this.model,\n\t\t\tmethod = options && options.method,\n\t\t\tsingle, models, singleIndex, modelIndex;\n\n\t\tif ( ! selection ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsingle = selection.single();\n\t\tmethod = _.isUndefined( method ) ? selection.multiple : method;\n\n\t\t// If the `method` is set to `between`, select all models that\n\t\t// exist between the current and the selected model.\n\t\tif ( 'between' === method && single && selection.multiple ) {\n\t\t\t// If the models are the same, short-circuit.\n\t\t\tif ( single === model ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsingleIndex = collection.indexOf( single );\n\t\t\tmodelIndex  = collection.indexOf( this.model );\n\n\t\t\tif ( singleIndex < modelIndex ) {\n\t\t\t\tmodels = collection.models.slice( singleIndex, modelIndex + 1 );\n\t\t\t} else {\n\t\t\t\tmodels = collection.models.slice( modelIndex, singleIndex + 1 );\n\t\t\t}\n\n\t\t\tselection.add( models );\n\t\t\tselection.single( model );\n\t\t\treturn;\n\n\t\t// If the `method` is set to `toggle`, just flip the selection\n\t\t// status, regardless of whether the model is the single model.\n\t\t} else if ( 'toggle' === method ) {\n\t\t\tselection[ this.selected() ? 'remove' : 'add' ]( model );\n\t\t\tselection.single( model );\n\t\t\treturn;\n\t\t} else if ( 'add' === method ) {\n\t\t\tselection.add( model );\n\t\t\tselection.single( model );\n\t\t\treturn;\n\t\t}\n\n\t\t// Fixes bug that loses focus when selecting a featured image.\n\t\tif ( ! method ) {\n\t\t\tmethod = 'add';\n\t\t}\n\n\t\tif ( method !== 'add' ) {\n\t\t\tmethod = 'reset';\n\t\t}\n\n\t\tif ( this.selected() ) {\n\t\t\t/*\n\t\t\t * If the model is the single model, remove it.\n\t\t\t * If it is not the same as the single model,\n\t\t\t * it now becomes the single model.\n\t\t\t */\n\t\t\tselection[ single === model ? 'remove' : 'single' ]( model );\n\t\t} else {\n\t\t\t/*\n\t\t\t * If the model is not selected, run the `method` on the\n\t\t\t * selection. By default, we `reset` the selection, but the\n\t\t\t * `method` can be set to `add` the model to the selection.\n\t\t\t */\n\t\t\tselection[ method ]( model );\n\t\t\tselection.single( model );\n\t\t}\n\t},\n\n\tupdateSelect: function() {\n\t\tthis[ this.selected() ? 'select' : 'deselect' ]();\n\t},\n\t/**\n\t * @return {unresolved|boolean}\n\t */\n\tselected: function() {\n\t\tvar selection = this.options.selection;\n\t\tif ( selection ) {\n\t\t\treturn !! selection.get( this.model.cid );\n\t\t}\n\t},\n\t/**\n\t * @param {Backbone.Model} model\n\t * @param {Backbone.Collection} collection\n\t */\n\tselect: function( model, collection ) {\n\t\tvar selection = this.options.selection,\n\t\t\tcontroller = this.controller;\n\n\t\t/*\n\t\t * Check if a selection exists and if it's the collection provided.\n\t\t * If they're not the same collection, bail; we're in another\n\t\t * selection's event loop.\n\t\t */\n\t\tif ( ! selection || ( collection && collection !== selection ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Bail if the model is already selected.\n\t\tif ( this.$el.hasClass( 'selected' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add 'selected' class to model, set aria-checked to true.\n\t\tthis.$el.addClass( 'selected' ).attr( 'aria-checked', true );\n\t\t//  Make the checkbox tabable, except in media grid (bulk select mode).\n\t\tif ( ! ( controller.isModeActive( 'grid' ) && controller.isModeActive( 'select' ) ) ) {\n\t\t\tthis.$( '.check' ).attr( 'tabindex', '0' );\n\t\t}\n\t},\n\t/**\n\t * @param {Backbone.Model} model\n\t * @param {Backbone.Collection} collection\n\t */\n\tdeselect: function( model, collection ) {\n\t\tvar selection = this.options.selection;\n\n\t\t/*\n\t\t * Check if a selection exists and if it's the collection provided.\n\t\t * If they're not the same collection, bail; we're in another\n\t\t * selection's event loop.\n\t\t */\n\t\tif ( ! selection || ( collection && collection !== selection ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.$el.removeClass( 'selected' ).attr( 'aria-checked', false )\n\t\t\t.find( '.check' ).attr( 'tabindex', '-1' );\n\t},\n\t/**\n\t * @param {Backbone.Model} model\n\t * @param {Backbone.Collection} collection\n\t */\n\tdetails: function( model, collection ) {\n\t\tvar selection = this.options.selection,\n\t\t\tdetails;\n\n\t\tif ( selection !== collection ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdetails = selection.single();\n\t\tthis.$el.toggleClass( 'details', details === this.model );\n\t},\n\t/**\n\t * @param {string} size\n\t * @return {Object}\n\t */\n\timageSize: function( size ) {\n\t\tvar sizes = this.model.get('sizes'), matched = false;\n\n\t\tsize = size || 'medium';\n\n\t\t// Use the provided image size if possible.\n\t\tif ( sizes ) {\n\t\t\tif ( sizes[ size ] ) {\n\t\t\t\tmatched = sizes[ size ];\n\t\t\t} else if ( sizes.large ) {\n\t\t\t\tmatched = sizes.large;\n\t\t\t} else if ( sizes.thumbnail ) {\n\t\t\t\tmatched = sizes.thumbnail;\n\t\t\t} else if ( sizes.full ) {\n\t\t\t\tmatched = sizes.full;\n\t\t\t}\n\n\t\t\tif ( matched ) {\n\t\t\t\treturn _.clone( matched );\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\turl:         this.model.get('url'),\n\t\t\twidth:       this.model.get('width'),\n\t\t\theight:      this.model.get('height'),\n\t\t\torientation: this.model.get('orientation')\n\t\t};\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tupdateSetting: function( event ) {\n\t\tvar $setting = $( event.target ).closest('[data-setting]'),\n\t\t\tsetting, value;\n\n\t\tif ( ! $setting.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetting = $setting.data('setting');\n\t\tvalue   = event.target.value;\n\n\t\tif ( this.model.get( setting ) !== value ) {\n\t\t\tthis.save( setting, value );\n\t\t}\n\t},\n\n\t/**\n\t * Pass all the arguments to the model's save method.\n\t *\n\t * Records the aggregate status of all save requests and updates the\n\t * view's classes accordingly.\n\t */\n\tsave: function() {\n\t\tvar view = this,\n\t\t\tsave = this._save = this._save || { status: 'ready' },\n\t\t\trequest = this.model.save.apply( this.model, arguments ),\n\t\t\trequests = save.requests ? $.when( request, save.requests ) : request;\n\n\t\t// If we're waiting to remove 'Saved.', stop.\n\t\tif ( save.savedTimer ) {\n\t\t\tclearTimeout( save.savedTimer );\n\t\t}\n\n\t\tthis.updateSave('waiting');\n\t\tsave.requests = requests;\n\t\trequests.always( function() {\n\t\t\t// If we've performed another request since this one, bail.\n\t\t\tif ( save.requests !== requests ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tview.updateSave( requests.state() === 'resolved' ? 'complete' : 'error' );\n\t\t\tsave.savedTimer = setTimeout( function() {\n\t\t\t\tview.updateSave('ready');\n\t\t\t\tdelete save.savedTimer;\n\t\t\t}, 2000 );\n\t\t});\n\t},\n\t/**\n\t * @param {string} status\n\t * @return {wp.media.view.Attachment} Returns itself to allow chaining.\n\t */\n\tupdateSave: function( status ) {\n\t\tvar save = this._save = this._save || { status: 'ready' };\n\n\t\tif ( status && status !== save.status ) {\n\t\t\tthis.$el.removeClass( 'save-' + save.status );\n\t\t\tsave.status = status;\n\t\t}\n\n\t\tthis.$el.addClass( 'save-' + save.status );\n\t\treturn this;\n\t},\n\n\tupdateAll: function() {\n\t\tvar $settings = this.$('[data-setting]'),\n\t\t\tmodel = this.model,\n\t\t\tchanged;\n\n\t\tchanged = _.chain( $settings ).map( function( el ) {\n\t\t\tvar $input = $('input, textarea, select, [value]', el ),\n\t\t\t\tsetting, value;\n\n\t\t\tif ( ! $input.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetting = $(el).data('setting');\n\t\t\tvalue = $input.val();\n\n\t\t\t// Record the value if it changed.\n\t\t\tif ( model.get( setting ) !== value ) {\n\t\t\t\treturn [ setting, value ];\n\t\t\t}\n\t\t}).compact().object().value();\n\n\t\tif ( ! _.isEmpty( changed ) ) {\n\t\t\tmodel.save( changed );\n\t\t}\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tremoveFromLibrary: function( event ) {\n\t\t// Catch enter and space events.\n\t\tif ( 'keydown' === event.type && 13 !== event.keyCode && 32 !== event.keyCode ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Stop propagation so the model isn't selected.\n\t\tevent.stopPropagation();\n\n\t\tthis.collection.remove( this.model );\n\t},\n\n\t/**\n\t * Add the model if it isn't in the selection, if it is in the selection,\n\t * remove it.\n\t *\n\t * @param {[type]} event [description]\n\t * @return {[type]} [description]\n\t */\n\tcheckClickHandler: function ( event ) {\n\t\tvar selection = this.options.selection;\n\t\tif ( ! selection ) {\n\t\t\treturn;\n\t\t}\n\t\tevent.stopPropagation();\n\t\tif ( selection.where( { id: this.model.get( 'id' ) } ).length ) {\n\t\t\tselection.remove( this.model );\n\t\t\t// Move focus back to the attachment tile (from the check).\n\t\t\tthis.$el.focus();\n\t\t} else {\n\t\t\tselection.add( this.model );\n\t\t}\n\n\t\t// Trigger an action button update.\n\t\tthis.controller.trigger( 'selection:toggle' );\n\t}\n});\n\n// Ensure settings remain in sync between attachment views.\n_.each({\n\tcaption: '_syncCaption',\n\ttitle:   '_syncTitle',\n\tartist:  '_syncArtist',\n\talbum:   '_syncAlbum'\n}, function( method, setting ) {\n\t/**\n\t * @function _syncCaption\n\t * @memberOf wp.media.view.Attachment\n\t * @instance\n\t *\n\t * @param {Backbone.Model} model\n\t * @param {string} value\n\t * @return {wp.media.view.Attachment} Returns itself to allow chaining.\n\t */\n\t/**\n\t * @function _syncTitle\n\t * @memberOf wp.media.view.Attachment\n\t * @instance\n\t *\n\t * @param {Backbone.Model} model\n\t * @param {string} value\n\t * @return {wp.media.view.Attachment} Returns itself to allow chaining.\n\t */\n\t/**\n\t * @function _syncArtist\n\t * @memberOf wp.media.view.Attachment\n\t * @instance\n\t *\n\t * @param {Backbone.Model} model\n\t * @param {string} value\n\t * @return {wp.media.view.Attachment} Returns itself to allow chaining.\n\t */\n\t/**\n\t * @function _syncAlbum\n\t * @memberOf wp.media.view.Attachment\n\t * @instance\n\t *\n\t * @param {Backbone.Model} model\n\t * @param {string} value\n\t * @return {wp.media.view.Attachment} Returns itself to allow chaining.\n\t */\n\tAttachment.prototype[ method ] = function( model, value ) {\n\t\tvar $setting = this.$('[data-setting=\"' + setting + '\"]');\n\n\t\tif ( ! $setting.length ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t/*\n\t\t * If the updated value is in sync with the value in the DOM, there\n\t\t * is no need to re-render. If we're currently editing the value,\n\t\t * it will automatically be in sync, suppressing the re-render for\n\t\t * the view we're editing, while updating any others.\n\t\t */\n\t\tif ( value === $setting.find('input, textarea, select, [value]').val() ) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn this.render();\n\t};\n});\n\nmodule.exports = Attachment;\n\n\n/***/ }),\n\n/***/ \"t3nl\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Iframe\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Iframe = wp.media.View.extend(/** @lends wp.media.view.Iframe.prototype */{\n\tclassName: 'media-iframe',\n\t/**\n\t * @return {wp.media.view.Iframe} Returns itself to allow chaining.\n\t */\n\trender: function() {\n\t\tthis.views.detach();\n\t\tthis.$el.html( '<iframe src=\"' + this.controller.state().get('src') + '\" />' );\n\t\tthis.views.render();\n\t\treturn this;\n\t}\n});\n\nmodule.exports = Iframe;\n\n\n/***/ }),\n\n/***/ \"tg/Y\":\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * @output wp-includes/js/media-views.js\n */\n\nvar media = wp.media,\n\t$ = jQuery,\n\tl10n;\n\nmedia.isTouchDevice = ( 'ontouchend' in document );\n\n// Link any localized strings.\nl10n = media.view.l10n = window._wpMediaViewsL10n || {};\n\n// Link any settings.\nmedia.view.settings = l10n.settings || {};\ndelete l10n.settings;\n\n// Copy the `post` setting over to the model settings.\nmedia.model.settings.post = media.view.settings.post;\n\n// Check if the browser supports CSS 3.0 transitions.\n$.support.transition = (function(){\n\tvar style = document.documentElement.style,\n\t\ttransitions = {\n\t\t\tWebkitTransition: 'webkitTransitionEnd',\n\t\t\tMozTransition:    'transitionend',\n\t\t\tOTransition:      'oTransitionEnd otransitionend',\n\t\t\ttransition:       'transitionend'\n\t\t}, transition;\n\n\ttransition = _.find( _.keys( transitions ), function( transition ) {\n\t\treturn ! _.isUndefined( style[ transition ] );\n\t});\n\n\treturn transition && {\n\t\tend: transitions[ transition ]\n\t};\n}());\n\n/**\n * A shared event bus used to provide events into\n * the media workflows that 3rd-party devs can use to hook\n * in.\n */\nmedia.events = _.extend( {}, Backbone.Events );\n\n/**\n * Makes it easier to bind events using transitions.\n *\n * @param {string} selector\n * @param {number} sensitivity\n * @return {Promise}\n */\nmedia.transition = function( selector, sensitivity ) {\n\tvar deferred = $.Deferred();\n\n\tsensitivity = sensitivity || 2000;\n\n\tif ( $.support.transition ) {\n\t\tif ( ! (selector instanceof $) ) {\n\t\t\tselector = $( selector );\n\t\t}\n\n\t\t// Resolve the deferred when the first element finishes animating.\n\t\tselector.first().one( $.support.transition.end, deferred.resolve );\n\n\t\t// Just in case the event doesn't trigger, fire a callback.\n\t\t_.delay( deferred.resolve, sensitivity );\n\n\t// Otherwise, execute on the spot.\n\t} else {\n\t\tdeferred.resolve();\n\t}\n\n\treturn deferred.promise();\n};\n\nmedia.controller.Region = __webpack_require__( \"WiNq\" );\nmedia.controller.StateMachine = __webpack_require__( \"U3Se\" );\nmedia.controller.State = __webpack_require__( \"M5ZC\" );\n\nmedia.selectionSync = __webpack_require__( \"PgTd\" );\nmedia.controller.Library = __webpack_require__( \"F/kE\" );\nmedia.controller.ImageDetails = __webpack_require__( \"IkWq\" );\nmedia.controller.GalleryEdit = __webpack_require__( \"99yY\" );\nmedia.controller.GalleryAdd = __webpack_require__( \"ng6N\" );\nmedia.controller.CollectionEdit = __webpack_require__( \"Mt+m\" );\nmedia.controller.CollectionAdd = __webpack_require__( \"iipZ\" );\nmedia.controller.FeaturedImage = __webpack_require__( \"I7TD\" );\nmedia.controller.ReplaceImage = __webpack_require__( \"aBqq\" );\nmedia.controller.EditImage = __webpack_require__( \"4tHu\" );\nmedia.controller.MediaLibrary = __webpack_require__( \"mVaH\" );\nmedia.controller.Embed = __webpack_require__( \"qe5n\" );\nmedia.controller.Cropper = __webpack_require__( \"M+xU\" );\nmedia.controller.CustomizeImageCropper = __webpack_require__( \"eqTc\" );\nmedia.controller.SiteIconCropper = __webpack_require__( \"W+32\" );\n\nmedia.View = __webpack_require__( \"Bbnu\" );\nmedia.view.Frame = __webpack_require__( \"LGdN\" );\nmedia.view.MediaFrame = __webpack_require__( \"Pt9x\" );\nmedia.view.MediaFrame.Select = __webpack_require__( \"fYN4\" );\nmedia.view.MediaFrame.Post = __webpack_require__( \"6B7g\" );\nmedia.view.MediaFrame.ImageDetails = __webpack_require__( \"VIJ9\" );\nmedia.view.Modal = __webpack_require__( \"gOpb\" );\nmedia.view.FocusManager = __webpack_require__( \"3nJM\" );\nmedia.view.UploaderWindow = __webpack_require__( \"S4jH\" );\nmedia.view.EditorUploader = __webpack_require__( \"GXkx\" );\nmedia.view.UploaderInline = __webpack_require__( \"7Bpz\" );\nmedia.view.UploaderStatus = __webpack_require__( \"NguE\" );\nmedia.view.UploaderStatusError = __webpack_require__( \"ZeG4\" );\nmedia.view.Toolbar = __webpack_require__( \"2NU8\" );\nmedia.view.Toolbar.Select = __webpack_require__( \"IgEq\" );\nmedia.view.Toolbar.Embed = __webpack_require__( \"xQvM\" );\nmedia.view.Button = __webpack_require__( \"LZpE\" );\nmedia.view.ButtonGroup = __webpack_require__( \"z/+l\" );\nmedia.view.PriorityList = __webpack_require__( \"NjyZ\" );\nmedia.view.MenuItem = __webpack_require__( \"dpRc\" );\nmedia.view.Menu = __webpack_require__( \"Ju2C\" );\nmedia.view.RouterItem = __webpack_require__( \"Q9T/\" );\nmedia.view.Router = __webpack_require__( \"EVvK\" );\nmedia.view.Sidebar = __webpack_require__( \"9ARG\" );\nmedia.view.Attachment = __webpack_require__( \"sULL\" );\nmedia.view.Attachment.Library = __webpack_require__( \"2jku\" );\nmedia.view.Attachment.EditLibrary = __webpack_require__( \"EvXF\" );\nmedia.view.Attachments = __webpack_require__( \"ojD6\" );\nmedia.view.Search = __webpack_require__( \"ZgZ7\" );\nmedia.view.AttachmentFilters = __webpack_require__( \"1S4+\" );\nmedia.view.DateFilter = __webpack_require__( \"VkcK\" );\nmedia.view.AttachmentFilters.Uploaded = __webpack_require__( \"4jjk\" );\nmedia.view.AttachmentFilters.All = __webpack_require__( \"KerO\" );\nmedia.view.AttachmentsBrowser = __webpack_require__( \"72mI\" );\nmedia.view.Selection = __webpack_require__( \"04Ix\" );\nmedia.view.Attachment.Selection = __webpack_require__( \"yGM1\" );\nmedia.view.Attachments.Selection = __webpack_require__( \"wfCN\" );\nmedia.view.Attachment.EditSelection = __webpack_require__( \"P6DV\" );\nmedia.view.Settings = __webpack_require__( \"nwwF\" );\nmedia.view.Settings.AttachmentDisplay = __webpack_require__( \"2AvB\" );\nmedia.view.Settings.Gallery = __webpack_require__( \"umxe\" );\nmedia.view.Settings.Playlist = __webpack_require__( \"76BF\" );\nmedia.view.Attachment.Details = __webpack_require__( \"iupV\" );\nmedia.view.AttachmentCompat = __webpack_require__( \"LND6\" );\nmedia.view.Iframe = __webpack_require__( \"t3nl\" );\nmedia.view.Embed = __webpack_require__( \"VMHs\" );\nmedia.view.Label = __webpack_require__( \"V6sy\" );\nmedia.view.EmbedUrl = __webpack_require__( \"+mQJ\" );\nmedia.view.EmbedLink = __webpack_require__( \"JecU\" );\nmedia.view.EmbedImage = __webpack_require__( \"+B8m\" );\nmedia.view.ImageDetails = __webpack_require__( \"GXJ6\" );\nmedia.view.Cropper = __webpack_require__( \"Vh02\" );\nmedia.view.SiteIconCropper = __webpack_require__( \"UmHM\" );\nmedia.view.SiteIconPreview = __webpack_require__( \"d3xu\" );\nmedia.view.EditImage = __webpack_require__( \"ibOK\" );\nmedia.view.Spinner = __webpack_require__( \"cH3P\" );\nmedia.view.Heading = __webpack_require__( \"l2j4\" );\n\n\n/***/ }),\n\n/***/ \"umxe\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Settings.Gallery\n *\n * @memberOf wp.media.view.Settings\n *\n * @class\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Gallery = wp.media.view.Settings.extend(/** @lends wp.media.view.Settings.Gallery.prototype */{\n\tclassName: 'collection-settings gallery-settings',\n\ttemplate:  wp.template('gallery-settings')\n});\n\nmodule.exports = Gallery;\n\n\n/***/ }),\n\n/***/ \"wfCN\":\n/***/ (function(module, exports) {\n\nvar Attachments = wp.media.view.Attachments,\n\tSelection;\n\n/**\n * wp.media.view.Attachments.Selection\n *\n * @memberOf wp.media.view.Attachments\n *\n * @class\n * @augments wp.media.view.Attachments\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nSelection = Attachments.extend(/** @lends wp.media.view.Attachments.Selection.prototype */{\n\tevents: {},\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\tsortable:   false,\n\t\t\tresize:     false,\n\n\t\t\t// The single `Attachment` view to be used in the `Attachments` view.\n\t\t\tAttachmentView: wp.media.view.Attachment.Selection\n\t\t});\n\t\t// Call 'initialize' directly on the parent class.\n\t\treturn Attachments.prototype.initialize.apply( this, arguments );\n\t}\n});\n\nmodule.exports = Selection;\n\n\n/***/ }),\n\n/***/ \"xQvM\":\n/***/ (function(module, exports) {\n\nvar Select = wp.media.view.Toolbar.Select,\n\tl10n = wp.media.view.l10n,\n\tEmbed;\n\n/**\n * wp.media.view.Toolbar.Embed\n *\n * @memberOf wp.media.view.Toolbar\n *\n * @class\n * @augments wp.media.view.Toolbar.Select\n * @augments wp.media.view.Toolbar\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nEmbed = Select.extend(/** @lends wp.media.view.Toolbar.Embed.prototype */{\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\ttext: l10n.insertIntoPost,\n\t\t\trequires: false\n\t\t});\n\t\t// Call 'initialize' directly on the parent class.\n\t\tSelect.prototype.initialize.apply( this, arguments );\n\t},\n\n\trefresh: function() {\n\t\tvar url = this.controller.state().props.get('url');\n\t\tthis.get('select').model.set( 'disabled', ! url || url === 'http://' );\n\t\t/**\n\t\t * call 'refresh' directly on the parent class\n\t\t */\n\t\tSelect.prototype.refresh.apply( this, arguments );\n\t}\n});\n\nmodule.exports = Embed;\n\n\n/***/ }),\n\n/***/ \"yGM1\":\n/***/ (function(module, exports) {\n\n/**\n * wp.media.view.Attachment.Selection\n *\n * @memberOf wp.media.view.Attachment\n *\n * @class\n * @augments wp.media.view.Attachment\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Selection = wp.media.view.Attachment.extend(/** @lends wp.media.view.Attachment.Selection.prototype */{\n\tclassName: 'attachment selection',\n\n\t// On click, just select the model, instead of removing the model from\n\t// the selection.\n\ttoggleSelection: function() {\n\t\tthis.options.selection.single( this.model );\n\t}\n});\n\nmodule.exports = Selection;\n\n\n/***/ }),\n\n/***/ \"z/+l\":\n/***/ (function(module, exports) {\n\nvar $ = Backbone.$,\n\tButtonGroup;\n\n/**\n * wp.media.view.ButtonGroup\n *\n * @memberOf wp.media.view\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nButtonGroup = wp.media.View.extend(/** @lends wp.media.view.ButtonGroup.prototype */{\n\ttagName:   'div',\n\tclassName: 'button-group button-large media-button-group',\n\n\tinitialize: function() {\n\t\t/**\n\t\t * @member {wp.media.view.Button[]}\n\t\t */\n\t\tthis.buttons = _.map( this.options.buttons || [], function( button ) {\n\t\t\tif ( button instanceof Backbone.View ) {\n\t\t\t\treturn button;\n\t\t\t} else {\n\t\t\t\treturn new wp.media.view.Button( button ).render();\n\t\t\t}\n\t\t});\n\n\t\tdelete this.options.buttons;\n\n\t\tif ( this.options.classes ) {\n\t\t\tthis.$el.addClass( this.options.classes );\n\t\t}\n\t},\n\n\t/**\n\t * @return {wp.media.view.ButtonGroup}\n\t */\n\trender: function() {\n\t\tthis.$el.html( $( _.pluck( this.buttons, 'el' ) ).detach() );\n\t\treturn this;\n\t}\n});\n\nmodule.exports = ButtonGroup;\n\n\n/***/ })\n\n/******/ });"
  },
  {
    "path": "配套插件/BsCore/assets/js/moxie.js",
    "content": "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:&quot;&quot;\" 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);"
  },
  {
    "path": "配套插件/BsCore/assets/js/paste.js",
    "content": "\n/**\n * jQuery Paste Images\n * \n * Helper class for listening for the paste event on the document, extracting\n * out any possible blobs that were pasted in, and then triggering a custom\n * event handler with those blobs.\n * \n * @author  Oliver Nassar <onassar@gmail.com>\n * @link    https://github.com/onassar/jQuery-PasteImages\n * @see     https://caniuse.com/#feat=clipboard\n * @see     https://ourcodeworld.com/articles/read/491/how-to-retrieve-images-from-the-clipboard-with-javascript-in-the-browser\n * @see     https://www.sitepoint.com/jquery-custom-events/\n * @note    Doesn't currently work with Safari. I believe this is related to\n *          limitations with accessing clipboardData\n * @example\n *          $(document).on({\n *              'custom/paste/images': function(event, blobs) {\n *              }\n *          });\n */\n(function($) {\n\n    /**\n     * __getBlobs\n     * \n     * @access  private\n     * @param   jQuery event\n     * @return  Array\n     */\n    var __getBlobs = function(event) {\n        var items = event.originalEvent.clipboardData.items,\n            kind,\n            index,\n            items,\n            blobs = [],\n            blob;\n        for (index in items) {\n            item = items[index];\n            kind = item.kind;\n            if (kind === undefined || kind === null) {\n                continue;\n            }\n            if (kind.toLowerCase() !== 'file') {\n                continue;\n            }\n            if (item.getAsFile === undefined || item.getAsFile === null) {\n                continue;\n            }\n            blob = item.getAsFile();\n            if (blob === undefined || blob === null) {\n                continue;\n            }\n            blobs.push(blob);\n        }\n        return blobs;\n    };\n\n    /**\n     * __validBrowser\n     * \n     * @access  private\n     * @param   jQuery event\n     * @return  Boolean\n     */\n    var __validBrowser = function(event) {\n        var originalEvent = event.originalEvent;\n        if (originalEvent === undefined || originalEvent === null) {\n            return false;\n        }\n        var clipboardData = originalEvent.clipboardData;\n        if (clipboardData === undefined || clipboardData === null) {\n            return false;\n        }\n        var items = clipboardData.items;\n        if (items === undefined || items === null) {\n            return false;\n        }\n        return true;\n    };\n\n    /**\n     * __validPaste\n     * \n     * @access  private\n     * @param   jQuery event\n     * @return  Boolean\n     */\n    var __validPaste = function(event) {\n        var target = event.target;\n        if (target === undefined || target === null) {\n            return true;\n        }\n        var $target = $(target);\n        if ($target.is('input[type=\"date\"]') === true) {\n            return false;\n        }\n        if ($target.is('input[type=\"email\"]') === true) {\n            return false;\n        }\n        if ($target.is('input[type=\"number\"]') === true) {\n            return false;\n        }\n        if ($target.is('input[type=\"password\"]') === true) {\n            return false;\n        }\n        if ($target.is('input[type=\"search\"]') === true) {\n            return false;\n        }\n        if ($target.is('input[type=\"text\"]') === true) {\n            return false;\n        }\n        if ($target.is('textarea') === true) {\n            return false;\n        }\n        return true;\n    };\n\n    /**\n     * Listen for paste on the document\n     * \n     */\n    $(document).on({\n        'paste': function(event) {\n            if (__validBrowser(event) === true) {\n                if (__validPaste(event) === true) {\n                    var blobs = __getBlobs(event);\n                    if (blobs.length > 0) {\n                        var eventName = 'custom/paste/images';\n                        $(document).triggerHandler(eventName, [blobs]);\n                    }\n                }\n            }\n        }\n    });\n})(jQuery);\n"
  },
  {
    "path": "配套插件/BsCore/assets/js/plupload.js",
    "content": "!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);"
  },
  {
    "path": "配套插件/BsCore/assets/js/tokeninput.js",
    "content": "!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:\"&times;\",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);"
  },
  {
    "path": "配套插件/BsCore/assets/js/wplink.js",
    "content": "/**\n * @output wp-includes/js/wplink.js\n */\n\n /* global wpLink */\n\n( function( $, wpLinkL10n, wp ) {\n\tvar editor, searchTimer, River, Query, correctedURL,\n\t\temailRegexp = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,63}$/i,\n\t\turlRegexp = /^(https?|ftp):\\/\\/[A-Z0-9.-]+\\.[A-Z]{2,63}[^ \"]*$/i,\n\t\tinputs = {},\n\t\trivers = {},\n\t\tisTouch = ( 'ontouchend' in document );\n\n\tfunction getLink() {\n\t\tif ( editor ) {\n\t\t\treturn editor.$( 'a[data-wplink-edit=\"true\"]' );\n\t\t}\n\n\t\treturn null;\n\t}\n\n\twindow.wpLink = {\n\t\ttimeToTriggerRiver: 150,\n\t\tminRiverAJAXDuration: 200,\n\t\triverBottomThreshold: 5,\n\t\tkeySensitivity: 100,\n\t\tlastSearch: '',\n\t\ttextarea: '',\n\t\tmodalOpen: false,\n\n\t\tinit: function() {\n\t\t\tinputs.wrap = $('#wp-link-wrap');\n\t\t\tinputs.dialog = $( '#wp-link' );\n\t\t\tinputs.backdrop = $( '#wp-link-backdrop' );\n\t\t\tinputs.submit = $( '#wp-link-submit' );\n\t\t\tinputs.close = $( '#wp-link-close' );\n\n\t\t\t// Input.\n\t\t\tinputs.text = $( '#wp-link-text' );\n\t\t\tinputs.url = $( '#wp-link-url' );\n\t\t\tinputs.nonce = $( '#_ajax_linking_nonce' );\n\t\t\tinputs.openInNewTab = $( '#wp-link-target' );\n\t\t\tinputs.search = $( '#wp-link-search' );\n\n\t\t\t// Build rivers.\n\t\t\trivers.search = new River( $( '#search-results' ) );\n\t\t\trivers.recent = new River( $( '#most-recent-results' ) );\n\t\t\trivers.elements = inputs.dialog.find( '.query-results' );\n\n\t\t\t// Get search notice text.\n\t\t\tinputs.queryNotice = $( '#query-notice-message' );\n\t\t\tinputs.queryNoticeTextDefault = inputs.queryNotice.find( '.query-notice-default' );\n\t\t\tinputs.queryNoticeTextHint = inputs.queryNotice.find( '.query-notice-hint' );\n\n\t\t\t// Bind event handlers.\n\t\t\tinputs.dialog.on( 'keydown', wpLink.keydown );\n\t\t\tinputs.dialog.on( 'keyup', wpLink.keyup );\n\t\t\tinputs.submit.on( 'click', function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\twpLink.update();\n\t\t\t});\n\n\t\t\tinputs.close.add( inputs.backdrop ).add( '#wp-link-cancel button' ).on( 'click', function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\twpLink.close();\n\t\t\t});\n\n\t\t\trivers.elements.on( 'river-select', wpLink.updateFields );\n\n\t\t\t// Display 'hint' message when search field or 'query-results' box are focused.\n\t\t\tinputs.search.on( 'focus.wplink', function() {\n\t\t\t\tinputs.queryNoticeTextDefault.hide();\n\t\t\t\tinputs.queryNoticeTextHint.removeClass( 'screen-reader-text' ).show();\n\t\t\t} ).on( 'blur.wplink', function() {\n\t\t\t\tinputs.queryNoticeTextDefault.show();\n\t\t\t\tinputs.queryNoticeTextHint.addClass( 'screen-reader-text' ).hide();\n\t\t\t} );\n\n\t\t\tinputs.search.on( 'keyup input', function() {\n\t\t\t\twindow.clearTimeout( searchTimer );\n\t\t\t\tsearchTimer = window.setTimeout( function() {\n\t\t\t\t\twpLink.searchInternalLinks();\n\t\t\t\t}, 500 );\n\t\t\t});\n\n\t\t\tinputs.url.on( 'paste', function() {\n\t\t\t\tsetTimeout( wpLink.correctURL, 0 );\n\t\t\t} );\n\n\t\t\tinputs.url.on( 'blur', wpLink.correctURL );\n\t\t},\n\n\t\t// If URL wasn't corrected last time and doesn't start with http:, https:, ? # or /, prepend http://.\n\t\tcorrectURL: function () {\n\t\t\tvar url = inputs.url.val().trim();\n\n\t\t\tif ( url && correctedURL !== url && ! /^(?:[a-z]+:|#|\\?|\\.|\\/)/.test( url ) ) {\n\t\t\t\tinputs.url.val( 'http://' + url );\n\t\t\t\tcorrectedURL = url;\n\t\t\t}\n\t\t},\n\n\t\topen: function( editorId, url, text ) {\n\t\t\tvar ed,\n\t\t\t\t$body = $( document.body );\n\n\t\t\t$body.addClass( 'modal-open' );\n\t\t\twpLink.modalOpen = true;\n\n\t\t\twpLink.range = null;\n\n\t\t\tif ( editorId ) {\n\t\t\t\twindow.wpActiveEditor = editorId;\n\t\t\t}\n\n\t\t\tif ( ! window.wpActiveEditor ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.textarea = $( '#' + window.wpActiveEditor ).get( 0 );\n\n\t\t\tif ( typeof window.tinymce !== 'undefined' ) {\n\t\t\t\t// Make sure the link wrapper is the last element in the body,\n\t\t\t\t// or the inline editor toolbar may show above the backdrop.\n\t\t\t\t$body.append( inputs.backdrop, inputs.wrap );\n\n\t\t\t\ted = window.tinymce.get( window.wpActiveEditor );\n\n\t\t\t\tif ( ed && ! ed.isHidden() ) {\n\t\t\t\t\teditor = ed;\n\t\t\t\t} else {\n\t\t\t\t\teditor = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! wpLink.isMCE() && document.selection ) {\n\t\t\t\tthis.textarea.focus();\n\t\t\t\tthis.range = document.selection.createRange();\n\t\t\t}\n\n\t\t\tinputs.wrap.show();\n\t\t\tinputs.backdrop.show();\n\n\t\t\twpLink.refresh( url, text );\n\n\t\t\t$( document ).trigger( 'wplink-open', inputs.wrap );\n\t\t},\n\n\t\tisMCE: function() {\n\t\t\treturn editor && ! editor.isHidden();\n\t\t},\n\n\t\trefresh: function( url, text ) {\n\t\t\tvar linkText = '';\n\n\t\t\t// Refresh rivers (clear links, check visibility).\n\t\t\trivers.search.refresh();\n\t\t\trivers.recent.refresh();\n\n\t\t\tif ( wpLink.isMCE() ) {\n\t\t\t\twpLink.mceRefresh( url, text );\n\t\t\t} else {\n\t\t\t\t// For the Text editor the \"Link text\" field is always shown.\n\t\t\t\tif ( ! inputs.wrap.hasClass( 'has-text-field' ) ) {\n\t\t\t\t\tinputs.wrap.addClass( 'has-text-field' );\n\t\t\t\t}\n\n\t\t\t\tif ( document.selection ) {\n\t\t\t\t\t// Old IE.\n\t\t\t\t\tlinkText = document.selection.createRange().text || text || '';\n\t\t\t\t} else if ( typeof this.textarea.selectionStart !== 'undefined' &&\n\t\t\t\t\t( this.textarea.selectionStart !== this.textarea.selectionEnd ) ) {\n\t\t\t\t\t// W3C.\n\t\t\t\t\ttext = this.textarea.value.substring( this.textarea.selectionStart, this.textarea.selectionEnd ) || text || '';\n\t\t\t\t}\n\n\t\t\t\tinputs.text.val( text );\n\t\t\t\twpLink.setDefaultValues();\n\t\t\t}\n\n\t\t\tif ( isTouch ) {\n\t\t\t\t// Close the onscreen keyboard.\n\t\t\t\tinputs.url.trigger( 'focus' ).trigger( 'blur' );\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * Focus the URL field and highlight its contents.\n\t\t\t\t * If this is moved above the selection changes,\n\t\t\t\t * IE will show a flashing cursor over the dialog.\n\t\t\t\t */\n\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\tinputs.url[0].select();\n\t\t\t\t\tinputs.url.trigger( 'focus' );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Load the most recent results if this is the first time opening the panel.\n\t\t\tif ( ! rivers.recent.ul.children().length ) {\n\t\t\t\trivers.recent.ajax();\n\t\t\t}\n\n\t\t\tcorrectedURL = inputs.url.val().replace( /^http:\\/\\//, '' );\n\t\t},\n\n\t\thasSelectedText: function( linkNode ) {\n\t\t\tvar node, nodes, i, html = editor.selection.getContent();\n\n\t\t\t// Partial html and not a fully selected anchor element.\n\t\t\tif ( /</.test( html ) && ( ! /^<a [^>]+>[^<]+<\\/a>$/.test( html ) || html.indexOf('href=') === -1 ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( linkNode.length ) {\n\t\t\t\tnodes = linkNode[0].childNodes;\n\n\t\t\t\tif ( ! nodes || ! nodes.length ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tfor ( i = nodes.length - 1; i >= 0; i-- ) {\n\t\t\t\t\tnode = nodes[i];\n\n\t\t\t\t\tif ( node.nodeType != 3 && ! window.tinymce.dom.BookmarkManager.isBookmarkNode( node ) ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\tmceRefresh: function( searchStr, text ) {\n\t\t\tvar linkText, href,\n\t\t\t\tlinkNode = getLink(),\n\t\t\t\tonlyText = this.hasSelectedText( linkNode );\n\n\t\t\tif ( linkNode.length ) {\n\t\t\t\tlinkText = linkNode.text();\n\t\t\t\thref = linkNode.attr( 'href' );\n\n\t\t\t\tif ( ! linkText.trim() ) {\n\t\t\t\t\tlinkText = text || '';\n\t\t\t\t}\n\n\t\t\t\tif ( searchStr && ( urlRegexp.test( searchStr ) || emailRegexp.test( searchStr ) ) ) {\n\t\t\t\t\thref = searchStr;\n\t\t\t\t}\n\n\t\t\t\tif ( href !== '_wp_link_placeholder' ) {\n\t\t\t\t\tinputs.url.val( href );\n\t\t\t\t\tinputs.openInNewTab.prop( 'checked', '_blank' === linkNode.attr( 'target' ) );\n\t\t\t\t\tinputs.submit.val( wpLinkL10n.update );\n\t\t\t\t} else {\n\t\t\t\t\tthis.setDefaultValues( linkText );\n\t\t\t\t}\n\n\t\t\t\tif ( searchStr && searchStr !== href ) {\n\t\t\t\t\t// The user has typed something in the inline dialog. Trigger a search with it.\n\t\t\t\t\tinputs.search.val( searchStr );\n\t\t\t\t} else {\n\t\t\t\t\tinputs.search.val( '' );\n\t\t\t\t}\n\n\t\t\t\t// Always reset the search.\n\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\twpLink.searchInternalLinks();\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tlinkText = editor.selection.getContent({ format: 'text' }) || text || '';\n\t\t\t\tthis.setDefaultValues( linkText );\n\t\t\t}\n\n\t\t\tif ( onlyText ) {\n\t\t\t\tinputs.text.val( linkText );\n\t\t\t\tinputs.wrap.addClass( 'has-text-field' );\n\t\t\t} else {\n\t\t\t\tinputs.text.val( '' );\n\t\t\t\tinputs.wrap.removeClass( 'has-text-field' );\n\t\t\t}\n\t\t},\n\n\t\tclose: function( reset ) {\n\t\t\t$( document.body ).removeClass( 'modal-open' );\n\t\t\twpLink.modalOpen = false;\n\n\t\t\tif ( reset !== 'noReset' ) {\n\t\t\t\tif ( ! wpLink.isMCE() ) {\n\t\t\t\t\twpLink.textarea.focus();\n\n\t\t\t\t\tif ( wpLink.range ) {\n\t\t\t\t\t\twpLink.range.moveToBookmark( wpLink.range.getBookmark() );\n\t\t\t\t\t\twpLink.range.select();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( editor.plugins.wplink ) {\n\t\t\t\t\t\teditor.plugins.wplink.close();\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.focus();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinputs.backdrop.hide();\n\t\t\tinputs.wrap.hide();\n\n\t\t\tcorrectedURL = false;\n\n\t\t\t$( document ).trigger( 'wplink-close', inputs.wrap );\n\t\t},\n\n\t\tgetAttrs: function() {\n\t\t\twpLink.correctURL();\n\n\t\t\treturn {\n\t\t\t\thref: inputs.url.val().trim(),\n\t\t\t\ttarget: inputs.openInNewTab.prop( 'checked' ) ? '_blank' : null\n\t\t\t};\n\t\t},\n\n\t\tbuildHtml: function(attrs) {\n\t\t\tvar html = '<a href=\"' + attrs.href + '\"';\n\n\t\t\tif ( attrs.target ) {\n\t\t\t\thtml += ' rel=\"noopener\" target=\"' + attrs.target + '\"';\n\t\t\t}\n\n\t\t\treturn html + '>';\n\t\t},\n\n\t\tupdate: function() {\n\t\t\tif ( wpLink.isMCE() ) {\n\t\t\t\twpLink.mceUpdate();\n\t\t\t} else {\n\t\t\t\twpLink.htmlUpdate();\n\t\t\t}\n\t\t},\n\n\t\thtmlUpdate: function() {\n\t\t\tvar attrs, text, html, begin, end, cursor, selection,\n\t\t\t\ttextarea = wpLink.textarea;\n\n\t\t\tif ( ! textarea ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattrs = wpLink.getAttrs();\n\t\t\ttext = inputs.text.val();\n\n\t\t\tvar parser = document.createElement( 'a' );\n\t\t\tparser.href = attrs.href;\n\n\t\t\tif ( 'javascript:' === parser.protocol || 'data:' === parser.protocol ) { // jshint ignore:line\n\t\t\t\tattrs.href = '';\n\t\t\t}\n\n\t\t\t// If there's no href, return.\n\t\t\tif ( ! attrs.href ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thtml = wpLink.buildHtml(attrs);\n\n\t\t\t// Insert HTML.\n\t\t\tif ( document.selection && wpLink.range ) {\n\t\t\t\t// IE.\n\t\t\t\t// Note: If no text is selected, IE will not place the cursor\n\t\t\t\t// inside the closing tag.\n\t\t\t\ttextarea.focus();\n\t\t\t\twpLink.range.text = html + ( text || wpLink.range.text ) + '</a>';\n\t\t\t\twpLink.range.moveToBookmark( wpLink.range.getBookmark() );\n\t\t\t\twpLink.range.select();\n\n\t\t\t\twpLink.range = null;\n\t\t\t} else if ( typeof textarea.selectionStart !== 'undefined' ) {\n\t\t\t\t// W3C.\n\t\t\t\tbegin = textarea.selectionStart;\n\t\t\t\tend = textarea.selectionEnd;\n\t\t\t\tselection = text || textarea.value.substring( begin, end );\n\t\t\t\thtml = html + selection + '</a>';\n\t\t\t\tcursor = begin + html.length;\n\n\t\t\t\t// If no text is selected, place the cursor inside the closing tag.\n\t\t\t\tif ( begin === end && ! selection ) {\n\t\t\t\t\tcursor -= 4;\n\t\t\t\t}\n\n\t\t\t\ttextarea.value = (\n\t\t\t\t\ttextarea.value.substring( 0, begin ) +\n\t\t\t\t\thtml +\n\t\t\t\t\ttextarea.value.substring( end, textarea.value.length )\n\t\t\t\t);\n\n\t\t\t\t// Update cursor position.\n\t\t\t\ttextarea.selectionStart = textarea.selectionEnd = cursor;\n\t\t\t}\n\n\t\t\twpLink.close();\n\t\t\ttextarea.focus();\n\t\t\t$( textarea ).trigger( 'change' );\n\n\t\t\t// Audible confirmation message when a link has been inserted in the Editor.\n\t\t\t// wp.a11y.speak( wpLinkL10n.linkInserted );\n\t\t},\n\n\t\tmceUpdate: function() {\n\t\t\tvar attrs = wpLink.getAttrs(),\n\t\t\t\t$link, text, hasText;\n\n\t\t\tvar parser = document.createElement( 'a' );\n\t\t\tparser.href = attrs.href;\n\n\t\t\tif ( 'javascript:' === parser.protocol || 'data:' === parser.protocol ) { // jshint ignore:line\n\t\t\t\tattrs.href = '';\n\t\t\t}\n\n\t\t\tif ( ! attrs.href ) {\n\t\t\t\teditor.execCommand( 'unlink' );\n\t\t\t\twpLink.close();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$link = getLink();\n\n\t\t\teditor.undoManager.transact( function() {\n\t\t\t\tif ( ! $link.length ) {\n\t\t\t\t\teditor.execCommand( 'mceInsertLink', false, { href: '_wp_link_placeholder', 'data-wp-temp-link': 1 } );\n\t\t\t\t\t$link = editor.$( 'a[data-wp-temp-link=\"1\"]' ).removeAttr( 'data-wp-temp-link' );\n\t\t\t\t\thasText = $link.text().trim();\n\t\t\t\t}\n\n\t\t\t\tif ( ! $link.length ) {\n\t\t\t\t\teditor.execCommand( 'unlink' );\n\t\t\t\t} else {\n\t\t\t\t\tif ( inputs.wrap.hasClass( 'has-text-field' ) ) {\n\t\t\t\t\t\ttext = inputs.text.val();\n\n\t\t\t\t\t\tif ( text ) {\n\t\t\t\t\t\t\t$link.text( text );\n\t\t\t\t\t\t} else if ( ! hasText ) {\n\t\t\t\t\t\t\t$link.text( attrs.href );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tattrs['data-wplink-edit'] = null;\n\t\t\t\t\tattrs['data-mce-href'] = attrs.href;\n\t\t\t\t\t$link.attr( attrs );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\twpLink.close( 'noReset' );\n\t\t\teditor.focus();\n\n\t\t\tif ( $link.length ) {\n\t\t\t\teditor.selection.select( $link[0] );\n\n\t\t\t\tif ( editor.plugins.wplink ) {\n\t\t\t\t\teditor.plugins.wplink.checkLink( $link[0] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\teditor.nodeChanged();\n\n\t\t\t// Audible confirmation message when a link has been inserted in the Editor.\n\t\t\twp.a11y.speak( wpLinkL10n.linkInserted );\n\t\t},\n\n\t\tupdateFields: function( e, li ) {\n\t\t\tinputs.url.val( li.children( '.item-permalink' ).val() );\n\n\t\t\tif ( inputs.wrap.hasClass( 'has-text-field' ) && ! inputs.text.val() ) {\n\t\t\t\tinputs.text.val( li.children( '.item-title' ).text() );\n\t\t\t}\n\t\t},\n\n\t\tgetUrlFromSelection: function( selection ) {\n\t\t\tif ( ! selection ) {\n\t\t\t\tif ( this.isMCE() ) {\n\t\t\t\t\tselection = editor.selection.getContent({ format: 'text' });\n\t\t\t\t} else if ( document.selection && wpLink.range ) {\n\t\t\t\t\tselection = wpLink.range.text;\n\t\t\t\t} else if ( typeof this.textarea.selectionStart !== 'undefined' ) {\n\t\t\t\t\tselection = this.textarea.value.substring( this.textarea.selectionStart, this.textarea.selectionEnd );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tselection = selection || '';\n\t\t\tselection = selection.trim();\n\n\t\t\tif ( selection && emailRegexp.test( selection ) ) {\n\t\t\t\t// Selection is email address.\n\t\t\t\treturn 'mailto:' + selection;\n\t\t\t} else if ( selection && urlRegexp.test( selection ) ) {\n\t\t\t\t// Selection is URL.\n\t\t\t\treturn selection.replace( /&amp;|&#0?38;/gi, '&' );\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\n\t\tsetDefaultValues: function( selection ) {\n\t\t\tinputs.url.val( this.getUrlFromSelection( selection ) );\n\n\t\t\t// Empty the search field and swap the \"rivers\".\n\t\t\tinputs.search.val('');\n\t\t\twpLink.searchInternalLinks();\n\n\t\t\t// Update save prompt.\n\t\t\tinputs.submit.val( wpLinkL10n.save );\n\t\t},\n\n\t\tsearchInternalLinks: function() {\n\t\t\tvar waiting,\n\t\t\t\tsearch = inputs.search.val() || '',\n\t\t\t\tminInputLength = parseInt( wpLinkL10n.minInputLength, 10 ) || 3;\n\n\t\t\tif ( search.length >= minInputLength ) {\n\t\t\t\trivers.recent.hide();\n\t\t\t\trivers.search.show();\n\n\t\t\t\t// Don't search if the keypress didn't change the title.\n\t\t\t\tif ( wpLink.lastSearch == search )\n\t\t\t\t\treturn;\n\n\t\t\t\twpLink.lastSearch = search;\n\t\t\t\twaiting = inputs.search.parent().find( '.spinner' ).addClass( 'is-active' );\n\n\t\t\t\trivers.search.change( search );\n\t\t\t\trivers.search.ajax( function() {\n\t\t\t\t\twaiting.removeClass( 'is-active' );\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trivers.search.hide();\n\t\t\t\trivers.recent.show();\n\t\t\t}\n\t\t},\n\n\t\tnext: function() {\n\t\t\trivers.search.next();\n\t\t\trivers.recent.next();\n\t\t},\n\n\t\tprev: function() {\n\t\t\trivers.search.prev();\n\t\t\trivers.recent.prev();\n\t\t},\n\n\t\tkeydown: function( event ) {\n\t\t\tvar fn, id;\n\n\t\t\t// Escape key.\n\t\t\tif ( 27 === event.keyCode ) {\n\t\t\t\twpLink.close();\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t// Tab key.\n\t\t\t} else if ( 9 === event.keyCode ) {\n\t\t\t\tid = event.target.id;\n\n\t\t\t\t// wp-link-submit must always be the last focusable element in the dialog.\n\t\t\t\t// Following focusable elements will be skipped on keyboard navigation.\n\t\t\t\tif ( id === 'wp-link-submit' && ! event.shiftKey ) {\n\t\t\t\t\tinputs.close.trigger( 'focus' );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t} else if ( id === 'wp-link-close' && event.shiftKey ) {\n\t\t\t\t\tinputs.submit.trigger( 'focus' );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Up Arrow and Down Arrow keys.\n\t\t\tif ( event.shiftKey || ( 38 !== event.keyCode && 40 !== event.keyCode ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( document.activeElement &&\n\t\t\t\t( document.activeElement.id === 'link-title-field' || document.activeElement.id === 'url-field' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Up Arrow key.\n\t\t\tfn = 38 === event.keyCode ? 'prev' : 'next';\n\t\t\tclearInterval( wpLink.keyInterval );\n\t\t\twpLink[ fn ]();\n\t\t\twpLink.keyInterval = setInterval( wpLink[ fn ], wpLink.keySensitivity );\n\t\t\tevent.preventDefault();\n\t\t},\n\n\t\tkeyup: function( event ) {\n\t\t\t// Up Arrow and Down Arrow keys.\n\t\t\tif ( 38 === event.keyCode || 40 === event.keyCode ) {\n\t\t\t\tclearInterval( wpLink.keyInterval );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\n\t\tdelayedCallback: function( func, delay ) {\n\t\t\tvar timeoutTriggered, funcTriggered, funcArgs, funcContext;\n\n\t\t\tif ( ! delay )\n\t\t\t\treturn func;\n\n\t\t\tsetTimeout( function() {\n\t\t\t\tif ( funcTriggered )\n\t\t\t\t\treturn func.apply( funcContext, funcArgs );\n\t\t\t\t// Otherwise, wait.\n\t\t\t\ttimeoutTriggered = true;\n\t\t\t}, delay );\n\n\t\t\treturn function() {\n\t\t\t\tif ( timeoutTriggered )\n\t\t\t\t\treturn func.apply( this, arguments );\n\t\t\t\t// Otherwise, wait.\n\t\t\t\tfuncArgs = arguments;\n\t\t\t\tfuncContext = this;\n\t\t\t\tfuncTriggered = true;\n\t\t\t};\n\t\t}\n\t};\n\n\tRiver = function( element, search ) {\n\t\tvar self = this;\n\t\tthis.element = element;\n\t\tthis.ul = element.children( 'ul' );\n\t\tthis.contentHeight = element.children( '#link-selector-height' );\n\t\tthis.waiting = element.find('.river-waiting');\n\n\t\tthis.change( search );\n\t\tthis.refresh();\n\n\t\t$( '#wp-link .query-results, #wp-link #link-selector' ).on( 'scroll', function() {\n\t\t\tself.maybeLoad();\n\t\t});\n\t\telement.on( 'click', 'li', function( event ) {\n\t\t\tself.select( $( this ), event );\n\t\t});\n\t};\n\n\t$.extend( River.prototype, {\n\t\trefresh: function() {\n\t\t\tthis.deselect();\n\t\t\tthis.visible = this.element.is( ':visible' );\n\t\t},\n\t\tshow: function() {\n\t\t\tif ( ! this.visible ) {\n\t\t\t\tthis.deselect();\n\t\t\t\tthis.element.show();\n\t\t\t\tthis.visible = true;\n\t\t\t}\n\t\t},\n\t\thide: function() {\n\t\t\tthis.element.hide();\n\t\t\tthis.visible = false;\n\t\t},\n\t\t// Selects a list item and triggers the river-select event.\n\t\tselect: function( li, event ) {\n\t\t\tvar liHeight, elHeight, liTop, elTop;\n\n\t\t\tif ( li.hasClass( 'unselectable' ) || li == this.selected )\n\t\t\t\treturn;\n\n\t\t\tthis.deselect();\n\t\t\tthis.selected = li.addClass( 'selected' );\n\t\t\t// Make sure the element is visible.\n\t\t\tliHeight = li.outerHeight();\n\t\t\telHeight = this.element.height();\n\t\t\tliTop = li.position().top;\n\t\t\telTop = this.element.scrollTop();\n\n\t\t\tif ( liTop < 0 ) // Make first visible element.\n\t\t\t\tthis.element.scrollTop( elTop + liTop );\n\t\t\telse if ( liTop + liHeight > elHeight ) // Make last visible element.\n\t\t\t\tthis.element.scrollTop( elTop + liTop - elHeight + liHeight );\n\n\t\t\t// Trigger the river-select event.\n\t\t\tthis.element.trigger( 'river-select', [ li, event, this ] );\n\t\t},\n\t\tdeselect: function() {\n\t\t\tif ( this.selected )\n\t\t\t\tthis.selected.removeClass( 'selected' );\n\t\t\tthis.selected = false;\n\t\t},\n\t\tprev: function() {\n\t\t\tif ( ! this.visible )\n\t\t\t\treturn;\n\n\t\t\tvar to;\n\t\t\tif ( this.selected ) {\n\t\t\t\tto = this.selected.prev( 'li' );\n\t\t\t\tif ( to.length )\n\t\t\t\t\tthis.select( to );\n\t\t\t}\n\t\t},\n\t\tnext: function() {\n\t\t\tif ( ! this.visible )\n\t\t\t\treturn;\n\n\t\t\tvar to = this.selected ? this.selected.next( 'li' ) : $( 'li:not(.unselectable):first', this.element );\n\t\t\tif ( to.length )\n\t\t\t\tthis.select( to );\n\t\t},\n\t\tajax: function( callback ) {\n\t\t\tvar self = this,\n\t\t\t\tdelay = this.query.page == 1 ? 0 : wpLink.minRiverAJAXDuration,\n\t\t\t\tresponse = wpLink.delayedCallback( function( results, params ) {\n\t\t\t\t\tself.process( results, params );\n\t\t\t\t\tif ( callback )\n\t\t\t\t\t\tcallback( results, params );\n\t\t\t\t}, delay );\n\n\t\t\tthis.query.ajax( response );\n\t\t},\n\t\tchange: function( search ) {\n\t\t\tif ( this.query && this._search == search )\n\t\t\t\treturn;\n\n\t\t\tthis._search = search;\n\t\t\tthis.query = new Query( search );\n\t\t\tthis.element.scrollTop( 0 );\n\t\t},\n\t\tprocess: function( results, params ) {\n\t\t\tvar list = '', alt = true, classes = '',\n\t\t\t\tfirstPage = params.page == 1;\n\n\t\t\tif ( ! results ) {\n\t\t\t\tif ( firstPage ) {\n\t\t\t\t\tlist += '<li class=\"unselectable no-matches-found\"><span class=\"item-title\"><em>' +\n\t\t\t\t\t\twpLinkL10n.noMatchesFound + '</em></span></li>';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$.each( results, function() {\n\t\t\t\t\tclasses = alt ? 'alternate' : '';\n\t\t\t\t\tclasses += this.title ? '' : ' no-title';\n\t\t\t\t\tlist += classes ? '<li class=\"' + classes + '\">' : '<li>';\n\t\t\t\t\tlist += '<input type=\"hidden\" class=\"item-permalink\" value=\"' + this.permalink + '\" />';\n\t\t\t\t\tlist += '<span class=\"item-title\">';\n\t\t\t\t\tlist += this.title ? this.title : wpLinkL10n.noTitle;\n\t\t\t\t\tlist += '</span><span class=\"item-info\">' + this.info + '</span></li>';\n\t\t\t\t\talt = ! alt;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.ul[ firstPage ? 'html' : 'append' ]( list );\n\t\t},\n\t\tmaybeLoad: function() {\n\t\t\tvar self = this,\n\t\t\t\tel = this.element,\n\t\t\t\tbottom = el.scrollTop() + el.height();\n\n\t\t\tif ( ! this.query.ready() || bottom < this.contentHeight.height() - wpLink.riverBottomThreshold )\n\t\t\t\treturn;\n\n\t\t\tsetTimeout(function() {\n\t\t\t\tvar newTop = el.scrollTop(),\n\t\t\t\t\tnewBottom = newTop + el.height();\n\n\t\t\t\tif ( ! self.query.ready() || newBottom < self.contentHeight.height() - wpLink.riverBottomThreshold )\n\t\t\t\t\treturn;\n\n\t\t\t\tself.waiting.addClass( 'is-active' );\n\t\t\t\tel.scrollTop( newTop + self.waiting.outerHeight() );\n\n\t\t\t\tself.ajax( function() {\n\t\t\t\t\tself.waiting.removeClass( 'is-active' );\n\t\t\t\t});\n\t\t\t}, wpLink.timeToTriggerRiver );\n\t\t}\n\t});\n\n\tQuery = function( search ) {\n\t\tthis.page = 1;\n\t\tthis.allLoaded = false;\n\t\tthis.querying = false;\n\t\tthis.search = search;\n\t};\n\n\t$.extend( Query.prototype, {\n\t\tready: function() {\n\t\t\treturn ! ( this.querying || this.allLoaded );\n\t\t},\n\t\tajax: function( callback ) {\n\t\t\tvar self = this,\n\t\t\t\tquery = {\n\t\t\t\t\taction : 'wp-link-ajax',\n\t\t\t\t\tpage : this.page,\n\t\t\t\t\t'_ajax_linking_nonce' : inputs.nonce.val()\n\t\t\t\t};\n\n\t\t\tif ( this.search )\n\t\t\t\tquery.search = this.search;\n\n\t\t\tthis.querying = true;\n\n\t\t\t$.post( window.ajaxurl, query, function( r ) {\n\t\t\t\tself.page++;\n\t\t\t\tself.querying = false;\n\t\t\t\tself.allLoaded = ! r;\n\t\t\t\tcallback( r, query );\n\t\t\t}, 'json' );\n\t\t}\n\t});\n\n\t$( wpLink.init );\n})( jQuery, window.wpLinkL10n, window.wp );\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/comment/comment.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var noOptions = {};\n  var nonWS = /[^\\s\\u00a0]/;\n  var Pos = CodeMirror.Pos, cmp = CodeMirror.cmpPos;\n\n  function firstNonWS(str) {\n    var found = str.search(nonWS);\n    return found == -1 ? 0 : found;\n  }\n\n  CodeMirror.commands.toggleComment = function(cm) {\n    cm.toggleComment();\n  };\n\n  CodeMirror.defineExtension(\"toggleComment\", function(options) {\n    if (!options) options = noOptions;\n    var cm = this;\n    var minLine = Infinity, ranges = this.listSelections(), mode = null;\n    for (var i = ranges.length - 1; i >= 0; i--) {\n      var from = ranges[i].from(), to = ranges[i].to();\n      if (from.line >= minLine) continue;\n      if (to.line >= minLine) to = Pos(minLine, 0);\n      minLine = from.line;\n      if (mode == null) {\n        if (cm.uncomment(from, to, options)) mode = \"un\";\n        else { cm.lineComment(from, to, options); mode = \"line\"; }\n      } else if (mode == \"un\") {\n        cm.uncomment(from, to, options);\n      } else {\n        cm.lineComment(from, to, options);\n      }\n    }\n  });\n\n  // Rough heuristic to try and detect lines that are part of multi-line string\n  function probablyInsideString(cm, pos, line) {\n    return /\\bstring\\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\\'\\\"\\`]/.test(line)\n  }\n\n  function getMode(cm, pos) {\n    var mode = cm.getMode()\n    return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos)\n  }\n\n  CodeMirror.defineExtension(\"lineComment\", function(from, to, options) {\n    if (!options) options = noOptions;\n    var self = this, mode = getMode(self, from);\n    var firstLine = self.getLine(from.line);\n    if (firstLine == null || probablyInsideString(self, from, firstLine)) return;\n\n    var commentString = options.lineComment || mode.lineComment;\n    if (!commentString) {\n      if (options.blockCommentStart || mode.blockCommentStart) {\n        options.fullLines = true;\n        self.blockComment(from, to, options);\n      }\n      return;\n    }\n\n    var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);\n    var pad = options.padding == null ? \" \" : options.padding;\n    var blankLines = options.commentBlankLines || from.line == to.line;\n\n    self.operation(function() {\n      if (options.indent) {\n        var baseString = null;\n        for (var i = from.line; i < end; ++i) {\n          var line = self.getLine(i);\n          var whitespace = line.slice(0, firstNonWS(line));\n          if (baseString == null || baseString.length > whitespace.length) {\n            baseString = whitespace;\n          }\n        }\n        for (var i = from.line; i < end; ++i) {\n          var line = self.getLine(i), cut = baseString.length;\n          if (!blankLines && !nonWS.test(line)) continue;\n          if (line.slice(0, cut) != baseString) cut = firstNonWS(line);\n          self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut));\n        }\n      } else {\n        for (var i = from.line; i < end; ++i) {\n          if (blankLines || nonWS.test(self.getLine(i)))\n            self.replaceRange(commentString + pad, Pos(i, 0));\n        }\n      }\n    });\n  });\n\n  CodeMirror.defineExtension(\"blockComment\", function(from, to, options) {\n    if (!options) options = noOptions;\n    var self = this, mode = getMode(self, from);\n    var startString = options.blockCommentStart || mode.blockCommentStart;\n    var endString = options.blockCommentEnd || mode.blockCommentEnd;\n    if (!startString || !endString) {\n      if ((options.lineComment || mode.lineComment) && options.fullLines != false)\n        self.lineComment(from, to, options);\n      return;\n    }\n    if (/\\bcomment\\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return\n\n    var end = Math.min(to.line, self.lastLine());\n    if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end;\n\n    var pad = options.padding == null ? \" \" : options.padding;\n    if (from.line > end) return;\n\n    self.operation(function() {\n      if (options.fullLines != false) {\n        var lastLineHasText = nonWS.test(self.getLine(end));\n        self.replaceRange(pad + endString, Pos(end));\n        self.replaceRange(startString + pad, Pos(from.line, 0));\n        var lead = options.blockCommentLead || mode.blockCommentLead;\n        if (lead != null) for (var i = from.line + 1; i <= end; ++i)\n          if (i != end || lastLineHasText)\n            self.replaceRange(lead + pad, Pos(i, 0));\n      } else {\n        var atCursor = cmp(self.getCursor(\"to\"), to) == 0, empty = !self.somethingSelected()\n        self.replaceRange(endString, to);\n        if (atCursor) self.setSelection(empty ? to : self.getCursor(\"from\"), to)\n        self.replaceRange(startString, from);\n      }\n    });\n  });\n\n  CodeMirror.defineExtension(\"uncomment\", function(from, to, options) {\n    if (!options) options = noOptions;\n    var self = this, mode = getMode(self, from);\n    var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end);\n\n    // Try finding line comments\n    var lineString = options.lineComment || mode.lineComment, lines = [];\n    var pad = options.padding == null ? \" \" : options.padding, didSomething;\n    lineComment: {\n      if (!lineString) break lineComment;\n      for (var i = start; i <= end; ++i) {\n        var line = self.getLine(i);\n        var found = line.indexOf(lineString);\n        if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1;\n        if (found == -1 && nonWS.test(line)) break lineComment;\n        if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment;\n        lines.push(line);\n      }\n      self.operation(function() {\n        for (var i = start; i <= end; ++i) {\n          var line = lines[i - start];\n          var pos = line.indexOf(lineString), endPos = pos + lineString.length;\n          if (pos < 0) continue;\n          if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length;\n          didSomething = true;\n          self.replaceRange(\"\", Pos(i, pos), Pos(i, endPos));\n        }\n      });\n      if (didSomething) return true;\n    }\n\n    // Try block comments\n    var startString = options.blockCommentStart || mode.blockCommentStart;\n    var endString = options.blockCommentEnd || mode.blockCommentEnd;\n    if (!startString || !endString) return false;\n    var lead = options.blockCommentLead || mode.blockCommentLead;\n    var startLine = self.getLine(start), open = startLine.indexOf(startString)\n    if (open == -1) return false\n    var endLine = end == start ? startLine : self.getLine(end)\n    var close = endLine.indexOf(endString, end == start ? open + startString.length : 0);\n    var insideStart = Pos(start, open + 1), insideEnd = Pos(end, close + 1)\n    if (close == -1 ||\n        !/comment/.test(self.getTokenTypeAt(insideStart)) ||\n        !/comment/.test(self.getTokenTypeAt(insideEnd)) ||\n        self.getRange(insideStart, insideEnd, \"\\n\").indexOf(endString) > -1)\n      return false;\n\n    // Avoid killing block comments completely outside the selection.\n    // Positions of the last startString before the start of the selection, and the first endString after it.\n    var lastStart = startLine.lastIndexOf(startString, from.ch);\n    var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length);\n    if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false;\n    // Positions of the first endString after the end of the selection, and the last startString before it.\n    firstEnd = endLine.indexOf(endString, to.ch);\n    var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch);\n    lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart;\n    if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false;\n\n    self.operation(function() {\n      self.replaceRange(\"\", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)),\n                        Pos(end, close + endString.length));\n      var openEnd = open + startString.length;\n      if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length;\n      self.replaceRange(\"\", Pos(start, open), Pos(start, openEnd));\n      if (lead) for (var i = start + 1; i <= end; ++i) {\n        var line = self.getLine(i), found = line.indexOf(lead);\n        if (found == -1 || nonWS.test(line.slice(0, found))) continue;\n        var foundEnd = found + lead.length;\n        if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length;\n        self.replaceRange(\"\", Pos(i, found), Pos(i, foundEnd));\n      }\n    });\n    return true;\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/comment/continuecomment.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var nonspace = /\\S/g;\n  var repeat = String.prototype.repeat || function (n) { return Array(n + 1).join(this); };\n  function continueComment(cm) {\n    if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n    var ranges = cm.listSelections(), mode, inserts = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var pos = ranges[i].head\n      if (!/\\bcomment\\b/.test(cm.getTokenTypeAt(pos))) return CodeMirror.Pass;\n      var modeHere = cm.getModeAt(pos)\n      if (!mode) mode = modeHere;\n      else if (mode != modeHere) return CodeMirror.Pass;\n\n      var insert = null, line, found;\n      var blockStart = mode.blockCommentStart, lineCmt = mode.lineComment;\n      if (blockStart && mode.blockCommentContinue) {\n        line = cm.getLine(pos.line);\n        var end = line.lastIndexOf(mode.blockCommentEnd, pos.ch - mode.blockCommentEnd.length);\n        // 1. if this block comment ended\n        // 2. if this is actually inside a line comment\n        if (end != -1 && end == pos.ch - mode.blockCommentEnd.length ||\n            lineCmt && (found = line.lastIndexOf(lineCmt, pos.ch - 1)) > -1 &&\n            /\\bcomment\\b/.test(cm.getTokenTypeAt({line: pos.line, ch: found + 1}))) {\n          // ...then don't continue it\n        } else if (pos.ch >= blockStart.length &&\n                   (found = line.lastIndexOf(blockStart, pos.ch - blockStart.length)) > -1 &&\n                   found > end) {\n          // reuse the existing leading spaces/tabs/mixed\n          // or build the correct indent using CM's tab/indent options\n          if (nonspaceAfter(0, line) >= found) {\n            insert = line.slice(0, found);\n          } else {\n            var tabSize = cm.options.tabSize, numTabs;\n            found = CodeMirror.countColumn(line, found, tabSize);\n            insert = !cm.options.indentWithTabs ? repeat.call(\" \", found) :\n              repeat.call(\"\\t\", (numTabs = Math.floor(found / tabSize))) +\n              repeat.call(\" \", found - tabSize * numTabs);\n          }\n        } else if ((found = line.indexOf(mode.blockCommentContinue)) > -1 &&\n                   found <= pos.ch &&\n                   found <= nonspaceAfter(0, line)) {\n          insert = line.slice(0, found);\n        }\n        if (insert != null) insert += mode.blockCommentContinue\n      }\n      if (insert == null && lineCmt && continueLineCommentEnabled(cm)) {\n        if (line == null) line = cm.getLine(pos.line);\n        found = line.indexOf(lineCmt);\n        // cursor at pos 0, line comment also at pos 0 => shift it down, don't continue\n        if (!pos.ch && !found) insert = \"\";\n        // continue only if the line starts with an optional space + line comment\n        else if (found > -1 && nonspaceAfter(0, line) >= found) {\n          // don't continue if there's only space(s) after cursor or the end of the line\n          insert = nonspaceAfter(pos.ch, line) > -1;\n          // but always continue if the next line starts with a line comment too\n          if (!insert) {\n            var next = cm.getLine(pos.line + 1) || '',\n                nextFound = next.indexOf(lineCmt);\n            insert = nextFound > -1 && nonspaceAfter(0, next) >= nextFound || null;\n          }\n          if (insert) {\n            insert = line.slice(0, found) + lineCmt +\n                     line.slice(found + lineCmt.length).match(/^\\s*/)[0];\n          }\n        }\n      }\n      if (insert == null) return CodeMirror.Pass;\n      inserts[i] = \"\\n\" + insert;\n    }\n\n    cm.operation(function() {\n      for (var i = ranges.length - 1; i >= 0; i--)\n        cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), \"+insert\");\n    });\n  }\n\n  function nonspaceAfter(ch, str) {\n    nonspace.lastIndex = ch;\n    var m = nonspace.exec(str);\n    return m ? m.index : -1;\n  }\n\n  function continueLineCommentEnabled(cm) {\n    var opt = cm.getOption(\"continueComments\");\n    if (opt && typeof opt == \"object\")\n      return opt.continueLineComment !== false;\n    return true;\n  }\n\n  CodeMirror.defineOption(\"continueComments\", null, function(cm, val, prev) {\n    if (prev && prev != CodeMirror.Init)\n      cm.removeKeyMap(\"continueComment\");\n    if (val) {\n      var key = \"Enter\";\n      if (typeof val == \"string\")\n        key = val;\n      else if (typeof val == \"object\" && val.key)\n        key = val.key;\n      var map = {name: \"continueComment\"};\n      map[key] = continueComment;\n      cm.addKeyMap(map);\n    }\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/dialog/dialog.css",
    "content": ".CodeMirror-dialog {\n  position: absolute;\n  left: 0; right: 0;\n  background: inherit;\n  z-index: 15;\n  padding: .1em .8em;\n  overflow: hidden;\n  color: inherit;\n}\n\n.CodeMirror-dialog-top {\n  border-bottom: 1px solid #eee;\n  top: 0;\n}\n\n.CodeMirror-dialog-bottom {\n  border-top: 1px solid #eee;\n  bottom: 0;\n}\n\n.CodeMirror-dialog input {\n  border: none;\n  outline: none;\n  background: transparent;\n  width: 20em;\n  color: inherit;\n  font-family: monospace;\n}\n\n.CodeMirror-dialog button {\n  font-size: 70%;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/dialog/dialog.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Open simple dialogs on top of an editor. Relies on dialog.css.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  function dialogDiv(cm, template, bottom) {\n    var wrap = cm.getWrapperElement();\n    var dialog;\n    dialog = wrap.appendChild(document.createElement(\"div\"));\n    if (bottom)\n      dialog.className = \"CodeMirror-dialog CodeMirror-dialog-bottom\";\n    else\n      dialog.className = \"CodeMirror-dialog CodeMirror-dialog-top\";\n\n    if (typeof template == \"string\") {\n      dialog.innerHTML = template;\n    } else { // Assuming it's a detached DOM element.\n      dialog.appendChild(template);\n    }\n    CodeMirror.addClass(wrap, 'dialog-opened');\n    return dialog;\n  }\n\n  function closeNotification(cm, newVal) {\n    if (cm.state.currentNotificationClose)\n      cm.state.currentNotificationClose();\n    cm.state.currentNotificationClose = newVal;\n  }\n\n  CodeMirror.defineExtension(\"openDialog\", function(template, callback, options) {\n    if (!options) options = {};\n\n    closeNotification(this, null);\n\n    var dialog = dialogDiv(this, template, options.bottom);\n    var closed = false, me = this;\n    function close(newVal) {\n      if (typeof newVal == 'string') {\n        inp.value = newVal;\n      } else {\n        if (closed) return;\n        closed = true;\n        CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');\n        dialog.parentNode.removeChild(dialog);\n        me.focus();\n\n        if (options.onClose) options.onClose(dialog);\n      }\n    }\n\n    var inp = dialog.getElementsByTagName(\"input\")[0], button;\n    if (inp) {\n      inp.focus();\n\n      if (options.value) {\n        inp.value = options.value;\n        if (options.selectValueOnOpen !== false) {\n          inp.select();\n        }\n      }\n\n      if (options.onInput)\n        CodeMirror.on(inp, \"input\", function(e) { options.onInput(e, inp.value, close);});\n      if (options.onKeyUp)\n        CodeMirror.on(inp, \"keyup\", function(e) {options.onKeyUp(e, inp.value, close);});\n\n      CodeMirror.on(inp, \"keydown\", function(e) {\n        if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }\n        if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {\n          inp.blur();\n          CodeMirror.e_stop(e);\n          close();\n        }\n        if (e.keyCode == 13) callback(inp.value, e);\n      });\n\n      if (options.closeOnBlur !== false) CodeMirror.on(dialog, \"focusout\", function (evt) {\n        if (evt.relatedTarget !== null) close();\n      });\n    } else if (button = dialog.getElementsByTagName(\"button\")[0]) {\n      CodeMirror.on(button, \"click\", function() {\n        close();\n        me.focus();\n      });\n\n      if (options.closeOnBlur !== false) CodeMirror.on(button, \"blur\", close);\n\n      button.focus();\n    }\n    return close;\n  });\n\n  CodeMirror.defineExtension(\"openConfirm\", function(template, callbacks, options) {\n    closeNotification(this, null);\n    var dialog = dialogDiv(this, template, options && options.bottom);\n    var buttons = dialog.getElementsByTagName(\"button\");\n    var closed = false, me = this, blurring = 1;\n    function close() {\n      if (closed) return;\n      closed = true;\n      CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');\n      dialog.parentNode.removeChild(dialog);\n      me.focus();\n    }\n    buttons[0].focus();\n    for (var i = 0; i < buttons.length; ++i) {\n      var b = buttons[i];\n      (function(callback) {\n        CodeMirror.on(b, \"click\", function(e) {\n          CodeMirror.e_preventDefault(e);\n          close();\n          if (callback) callback(me);\n        });\n      })(callbacks[i]);\n      CodeMirror.on(b, \"blur\", function() {\n        --blurring;\n        setTimeout(function() { if (blurring <= 0) close(); }, 200);\n      });\n      CodeMirror.on(b, \"focus\", function() { ++blurring; });\n    }\n  });\n\n  /*\n   * openNotification\n   * Opens a notification, that can be closed with an optional timer\n   * (default 5000ms timer) and always closes on click.\n   *\n   * If a notification is opened while another is opened, it will close the\n   * currently opened one and open the new one immediately.\n   */\n  CodeMirror.defineExtension(\"openNotification\", function(template, options) {\n    closeNotification(this, close);\n    var dialog = dialogDiv(this, template, options && options.bottom);\n    var closed = false, doneTimer;\n    var duration = options && typeof options.duration !== \"undefined\" ? options.duration : 5000;\n\n    function close() {\n      if (closed) return;\n      closed = true;\n      clearTimeout(doneTimer);\n      CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');\n      dialog.parentNode.removeChild(dialog);\n    }\n\n    CodeMirror.on(dialog, 'click', function(e) {\n      CodeMirror.e_preventDefault(e);\n      close();\n    });\n\n    if (duration)\n      doneTimer = setTimeout(close, duration);\n\n    return close;\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/display/autorefresh.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n\n  CodeMirror.defineOption(\"autoRefresh\", false, function(cm, val) {\n    if (cm.state.autoRefresh) {\n      stopListening(cm, cm.state.autoRefresh)\n      cm.state.autoRefresh = null\n    }\n    if (val && cm.display.wrapper.offsetHeight == 0)\n      startListening(cm, cm.state.autoRefresh = {delay: val.delay || 250})\n  })\n\n  function startListening(cm, state) {\n    function check() {\n      if (cm.display.wrapper.offsetHeight) {\n        stopListening(cm, state)\n        if (cm.display.lastWrapHeight != cm.display.wrapper.clientHeight)\n          cm.refresh()\n      } else {\n        state.timeout = setTimeout(check, state.delay)\n      }\n    }\n    state.timeout = setTimeout(check, state.delay)\n    state.hurry = function() {\n      clearTimeout(state.timeout)\n      state.timeout = setTimeout(check, 50)\n    }\n    CodeMirror.on(window, \"mouseup\", state.hurry)\n    CodeMirror.on(window, \"keyup\", state.hurry)\n  }\n\n  function stopListening(_cm, state) {\n    clearTimeout(state.timeout)\n    CodeMirror.off(window, \"mouseup\", state.hurry)\n    CodeMirror.off(window, \"keyup\", state.hurry)\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/display/fullscreen.css",
    "content": ".CodeMirror-fullscreen {\n  position: fixed;\n  top: 0; left: 0; right: 0; bottom: 0;\n  height: auto;\n  z-index: 9;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/display/fullscreen.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"fullScreen\", false, function(cm, val, old) {\n    if (old == CodeMirror.Init) old = false;\n    if (!old == !val) return;\n    if (val) setFullscreen(cm);\n    else setNormal(cm);\n  });\n\n  function setFullscreen(cm) {\n    var wrap = cm.getWrapperElement();\n    cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,\n                                  width: wrap.style.width, height: wrap.style.height};\n    wrap.style.width = \"\";\n    wrap.style.height = \"auto\";\n    wrap.className += \" CodeMirror-fullscreen\";\n    document.documentElement.style.overflow = \"hidden\";\n    cm.refresh();\n  }\n\n  function setNormal(cm) {\n    var wrap = cm.getWrapperElement();\n    wrap.className = wrap.className.replace(/\\s*CodeMirror-fullscreen\\b/, \"\");\n    document.documentElement.style.overflow = \"\";\n    var info = cm.state.fullScreenRestore;\n    wrap.style.width = info.width; wrap.style.height = info.height;\n    window.scrollTo(info.scrollLeft, info.scrollTop);\n    cm.refresh();\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/display/panel.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function (mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function (CodeMirror) {\n  CodeMirror.defineExtension(\"addPanel\", function (node, options) {\n    options = options || {};\n\n    if (!this.state.panels) initPanels(this);\n\n    var info = this.state.panels;\n    var wrapper = info.wrapper;\n    var cmWrapper = this.getWrapperElement();\n    var replace = options.replace instanceof Panel && !options.replace.cleared;\n\n    if (options.after instanceof Panel && !options.after.cleared) {\n      wrapper.insertBefore(node, options.before.node.nextSibling);\n    } else if (options.before instanceof Panel && !options.before.cleared) {\n      wrapper.insertBefore(node, options.before.node);\n    } else if (replace) {\n      wrapper.insertBefore(node, options.replace.node);\n      options.replace.clear(true);\n    } else if (options.position == \"bottom\") {\n      wrapper.appendChild(node);\n    } else if (options.position == \"before-bottom\") {\n      wrapper.insertBefore(node, cmWrapper.nextSibling);\n    } else if (options.position == \"after-top\") {\n      wrapper.insertBefore(node, cmWrapper);\n    } else {\n      wrapper.insertBefore(node, wrapper.firstChild);\n    }\n\n    var height = (options && options.height) || node.offsetHeight;\n\n    var panel = new Panel(this, node, options, height);\n    info.panels.push(panel);\n\n    this.setSize();\n    if (options.stable && isAtTop(this, node))\n      this.scrollTo(null, this.getScrollInfo().top + height);\n\n    return panel;\n  });\n\n  function Panel(cm, node, options, height) {\n    this.cm = cm;\n    this.node = node;\n    this.options = options;\n    this.height = height;\n    this.cleared = false;\n  }\n\n  /* when skipRemove is true, clear() was called from addPanel().\n   * Thus removePanels() should not be called (issue 5518) */\n  Panel.prototype.clear = function (skipRemove) {\n    if (this.cleared) return;\n    this.cleared = true;\n    var info = this.cm.state.panels;\n    info.panels.splice(info.panels.indexOf(this), 1);\n    this.cm.setSize();\n    if (this.options.stable && isAtTop(this.cm, this.node))\n      this.cm.scrollTo(null, this.cm.getScrollInfo().top - this.height)\n    info.wrapper.removeChild(this.node);\n    if (info.panels.length == 0 && !skipRemove) removePanels(this.cm);\n  };\n\n  Panel.prototype.changed = function () {\n    this.height = this.node.getBoundingClientRect().height;\n    this.cm.setSize();\n  };\n\n  function initPanels(cm) {\n    var wrap = cm.getWrapperElement()\n    var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle;\n    var height = parseInt(style.height);\n    var info = cm.state.panels = {\n      setHeight: wrap.style.height,\n      panels: [],\n      wrapper: document.createElement(\"div\")\n    };\n    var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()\n    wrap.parentNode.insertBefore(info.wrapper, wrap);\n    info.wrapper.appendChild(wrap);\n    cm.scrollTo(scrollPos.left, scrollPos.top)\n    if (hasFocus) cm.focus();\n\n    cm._setSize = cm.setSize;\n    if (height != null) cm.setSize = function (width, newHeight) {\n      if (!newHeight) newHeight = info.wrapper.offsetHeight;\n      info.setHeight = newHeight;\n      if (typeof newHeight != \"number\") {\n        var px = /^(\\d+\\.?\\d*)px$/.exec(newHeight);\n        if (px) {\n          newHeight = Number(px[1]);\n        } else {\n          info.wrapper.style.height = newHeight;\n          newHeight = info.wrapper.offsetHeight;\n        }\n      }\n      var editorheight = newHeight - info.panels\n        .map(function (p) { return p.node.getBoundingClientRect().height; })\n        .reduce(function (a, b) { return a + b; }, 0);\n      cm._setSize(width, editorheight);\n      height = newHeight;\n    };\n  }\n\n  function removePanels(cm) {\n    var info = cm.state.panels;\n    cm.state.panels = null;\n\n    var wrap = cm.getWrapperElement()\n    var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()\n    info.wrapper.parentNode.replaceChild(wrap, info.wrapper);\n    cm.scrollTo(scrollPos.left, scrollPos.top)\n    if (hasFocus) cm.focus();\n    wrap.style.height = info.setHeight;\n    cm.setSize = cm._setSize;\n    cm.setSize();\n  }\n\n  function isAtTop(cm, dom) {\n    for (var sibling = dom.nextSibling; sibling; sibling = sibling.nextSibling)\n      if (sibling == cm.getWrapperElement()) return true\n    return false\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/display/placeholder.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  CodeMirror.defineOption(\"placeholder\", \"\", function(cm, val, old) {\n    var prev = old && old != CodeMirror.Init;\n    if (val && !prev) {\n      cm.on(\"blur\", onBlur);\n      cm.on(\"change\", onChange);\n      cm.on(\"swapDoc\", onChange);\n      CodeMirror.on(cm.getInputField(), \"compositionupdate\", cm.state.placeholderCompose = function() { onComposition(cm) })\n      onChange(cm);\n    } else if (!val && prev) {\n      cm.off(\"blur\", onBlur);\n      cm.off(\"change\", onChange);\n      cm.off(\"swapDoc\", onChange);\n      CodeMirror.off(cm.getInputField(), \"compositionupdate\", cm.state.placeholderCompose)\n      clearPlaceholder(cm);\n      var wrapper = cm.getWrapperElement();\n      wrapper.className = wrapper.className.replace(\" CodeMirror-empty\", \"\");\n    }\n\n    if (val && !cm.hasFocus()) onBlur(cm);\n  });\n\n  function clearPlaceholder(cm) {\n    if (cm.state.placeholder) {\n      cm.state.placeholder.parentNode.removeChild(cm.state.placeholder);\n      cm.state.placeholder = null;\n    }\n  }\n  function setPlaceholder(cm) {\n    clearPlaceholder(cm);\n    var elt = cm.state.placeholder = document.createElement(\"pre\");\n    elt.style.cssText = \"height: 0; overflow: visible\";\n    elt.style.direction = cm.getOption(\"direction\");\n    elt.className = \"CodeMirror-placeholder CodeMirror-line-like\";\n    var placeHolder = cm.getOption(\"placeholder\")\n    if (typeof placeHolder == \"string\") placeHolder = document.createTextNode(placeHolder)\n    elt.appendChild(placeHolder)\n    cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);\n  }\n\n  function onComposition(cm) {\n    setTimeout(function() {\n      var empty = false\n      if (cm.lineCount() == 1) {\n        var input = cm.getInputField()\n        empty = input.nodeName == \"TEXTAREA\" ? !cm.getLine(0).length\n          : !/[^\\u200b]/.test(input.querySelector(\".CodeMirror-line\").textContent)\n      }\n      if (empty) setPlaceholder(cm)\n      else clearPlaceholder(cm)\n    }, 20)\n  }\n\n  function onBlur(cm) {\n    if (isEmpty(cm)) setPlaceholder(cm);\n  }\n  function onChange(cm) {\n    var wrapper = cm.getWrapperElement(), empty = isEmpty(cm);\n    wrapper.className = wrapper.className.replace(\" CodeMirror-empty\", \"\") + (empty ? \" CodeMirror-empty\" : \"\");\n\n    if (empty) setPlaceholder(cm);\n    else clearPlaceholder(cm);\n  }\n\n  function isEmpty(cm) {\n    return (cm.lineCount() === 1) && (cm.getLine(0) === \"\");\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/display/rulers.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"rulers\", false, function(cm, val) {\n    if (cm.state.rulerDiv) {\n      cm.state.rulerDiv.parentElement.removeChild(cm.state.rulerDiv)\n      cm.state.rulerDiv = null\n      cm.off(\"refresh\", drawRulers)\n    }\n    if (val && val.length) {\n      cm.state.rulerDiv = cm.display.lineSpace.parentElement.insertBefore(document.createElement(\"div\"), cm.display.lineSpace)\n      cm.state.rulerDiv.className = \"CodeMirror-rulers\"\n      drawRulers(cm)\n      cm.on(\"refresh\", drawRulers)\n    }\n  });\n\n  function drawRulers(cm) {\n    cm.state.rulerDiv.textContent = \"\"\n    var val = cm.getOption(\"rulers\");\n    var cw = cm.defaultCharWidth();\n    var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), \"div\").left;\n    cm.state.rulerDiv.style.minHeight = (cm.display.scroller.offsetHeight + 30) + \"px\";\n    for (var i = 0; i < val.length; i++) {\n      var elt = document.createElement(\"div\");\n      elt.className = \"CodeMirror-ruler\";\n      var col, conf = val[i];\n      if (typeof conf == \"number\") {\n        col = conf;\n      } else {\n        col = conf.column;\n        if (conf.className) elt.className += \" \" + conf.className;\n        if (conf.color) elt.style.borderColor = conf.color;\n        if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle;\n        if (conf.width) elt.style.borderLeftWidth = conf.width;\n      }\n      elt.style.left = (left + col * cw) + \"px\";\n      cm.state.rulerDiv.appendChild(elt)\n    }\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/edit/closebrackets.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var defaults = {\n    pairs: \"()[]{}''\\\"\\\"\",\n    closeBefore: \")]}'\\\":;>\",\n    triples: \"\",\n    explode: \"[]{}\"\n  };\n\n  var Pos = CodeMirror.Pos;\n\n  CodeMirror.defineOption(\"autoCloseBrackets\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.removeKeyMap(keyMap);\n      cm.state.closeBrackets = null;\n    }\n    if (val) {\n      ensureBound(getOption(val, \"pairs\"))\n      cm.state.closeBrackets = val;\n      cm.addKeyMap(keyMap);\n    }\n  });\n\n  function getOption(conf, name) {\n    if (name == \"pairs\" && typeof conf == \"string\") return conf;\n    if (typeof conf == \"object\" && conf[name] != null) return conf[name];\n    return defaults[name];\n  }\n\n  var keyMap = {Backspace: handleBackspace, Enter: handleEnter};\n  function ensureBound(chars) {\n    for (var i = 0; i < chars.length; i++) {\n      var ch = chars.charAt(i), key = \"'\" + ch + \"'\"\n      if (!keyMap[key]) keyMap[key] = handler(ch)\n    }\n  }\n  ensureBound(defaults.pairs + \"`\")\n\n  function handler(ch) {\n    return function(cm) { return handleChar(cm, ch); };\n  }\n\n  function getConfig(cm) {\n    var deflt = cm.state.closeBrackets;\n    if (!deflt || deflt.override) return deflt;\n    var mode = cm.getModeAt(cm.getCursor());\n    return mode.closeBrackets || deflt;\n  }\n\n  function handleBackspace(cm) {\n    var conf = getConfig(cm);\n    if (!conf || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n    var pairs = getOption(conf, \"pairs\");\n    var ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) return CodeMirror.Pass;\n      var around = charsAround(cm, ranges[i].head);\n      if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;\n    }\n    for (var i = ranges.length - 1; i >= 0; i--) {\n      var cur = ranges[i].head;\n      cm.replaceRange(\"\", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), \"+delete\");\n    }\n  }\n\n  function handleEnter(cm) {\n    var conf = getConfig(cm);\n    var explode = conf && getOption(conf, \"explode\");\n    if (!explode || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n    var ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) return CodeMirror.Pass;\n      var around = charsAround(cm, ranges[i].head);\n      if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;\n    }\n    cm.operation(function() {\n      var linesep = cm.lineSeparator() || \"\\n\";\n      cm.replaceSelection(linesep + linesep, null);\n      moveSel(cm, -1)\n      ranges = cm.listSelections();\n      for (var i = 0; i < ranges.length; i++) {\n        var line = ranges[i].head.line;\n        cm.indentLine(line, null, true);\n        cm.indentLine(line + 1, null, true);\n      }\n    });\n  }\n\n  function moveSel(cm, dir) {\n    var newRanges = [], ranges = cm.listSelections(), primary = 0\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i]\n      if (range.head == cm.getCursor()) primary = i\n      var pos = range.head.ch || dir > 0 ? {line: range.head.line, ch: range.head.ch + dir} : {line: range.head.line - 1}\n      newRanges.push({anchor: pos, head: pos})\n    }\n    cm.setSelections(newRanges, primary)\n  }\n\n  function contractSelection(sel) {\n    var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0;\n    return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)),\n            head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))};\n  }\n\n  function handleChar(cm, ch) {\n    var conf = getConfig(cm);\n    if (!conf || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n    var pairs = getOption(conf, \"pairs\");\n    var pos = pairs.indexOf(ch);\n    if (pos == -1) return CodeMirror.Pass;\n\n    var closeBefore = getOption(conf,\"closeBefore\");\n\n    var triples = getOption(conf, \"triples\");\n\n    var identical = pairs.charAt(pos + 1) == ch;\n    var ranges = cm.listSelections();\n    var opening = pos % 2 == 0;\n\n    var type;\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i], cur = range.head, curType;\n      var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));\n      if (opening && !range.empty()) {\n        curType = \"surround\";\n      } else if ((identical || !opening) && next == ch) {\n        if (identical && stringStartsAfter(cm, cur))\n          curType = \"both\";\n        else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch)\n          curType = \"skipThree\";\n        else\n          curType = \"skip\";\n      } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 &&\n                 cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) {\n        if (cur.ch > 2 && /\\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass;\n        curType = \"addFour\";\n      } else if (identical) {\n        var prev = cur.ch == 0 ? \" \" : cm.getRange(Pos(cur.line, cur.ch - 1), cur)\n        if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = \"both\";\n        else return CodeMirror.Pass;\n      } else if (opening && (next.length === 0 || /\\s/.test(next) || closeBefore.indexOf(next) > -1)) {\n        curType = \"both\";\n      } else {\n        return CodeMirror.Pass;\n      }\n      if (!type) type = curType;\n      else if (type != curType) return CodeMirror.Pass;\n    }\n\n    var left = pos % 2 ? pairs.charAt(pos - 1) : ch;\n    var right = pos % 2 ? ch : pairs.charAt(pos + 1);\n    cm.operation(function() {\n      if (type == \"skip\") {\n        moveSel(cm, 1)\n      } else if (type == \"skipThree\") {\n        moveSel(cm, 3)\n      } else if (type == \"surround\") {\n        var sels = cm.getSelections();\n        for (var i = 0; i < sels.length; i++)\n          sels[i] = left + sels[i] + right;\n        cm.replaceSelections(sels, \"around\");\n        sels = cm.listSelections().slice();\n        for (var i = 0; i < sels.length; i++)\n          sels[i] = contractSelection(sels[i]);\n        cm.setSelections(sels);\n      } else if (type == \"both\") {\n        cm.replaceSelection(left + right, null);\n        cm.triggerElectric(left + right);\n        moveSel(cm, -1)\n      } else if (type == \"addFour\") {\n        cm.replaceSelection(left + left + left + left, \"before\");\n        moveSel(cm, 1)\n      }\n    });\n  }\n\n  function charsAround(cm, pos) {\n    var str = cm.getRange(Pos(pos.line, pos.ch - 1),\n                          Pos(pos.line, pos.ch + 1));\n    return str.length == 2 ? str : null;\n  }\n\n  function stringStartsAfter(cm, pos) {\n    var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1))\n    return /\\bstring/.test(token.type) && token.start == pos.ch &&\n      (pos.ch == 0 || !/\\bstring/.test(cm.getTokenTypeAt(pos)))\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/edit/closetag.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Tag-closer extension for CodeMirror.\n *\n * This extension adds an \"autoCloseTags\" option that can be set to\n * either true to get the default behavior, or an object to further\n * configure its behavior.\n *\n * These are supported options:\n *\n * `whenClosing` (default true)\n *   Whether to autoclose when the '/' of a closing tag is typed.\n * `whenOpening` (default true)\n *   Whether to autoclose the tag when the final '>' of an opening\n *   tag is typed.\n * `dontCloseTags` (default is empty tags for HTML, none for XML)\n *   An array of tag names that should not be autoclosed.\n * `indentTags` (default is block tags for HTML, none for XML)\n *   An array of tag names that should, when opened, cause a\n *   blank line to be added inside the tag, and the blank line and\n *   closing line to be indented.\n * `emptyTags` (default is none)\n *   An array of XML tag names that should be autoclosed with '/>'.\n *\n * See demos/closetag.html for a usage example.\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../fold/xml-fold\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../fold/xml-fold\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  CodeMirror.defineOption(\"autoCloseTags\", false, function(cm, val, old) {\n    if (old != CodeMirror.Init && old)\n      cm.removeKeyMap(\"autoCloseTags\");\n    if (!val) return;\n    var map = {name: \"autoCloseTags\"};\n    if (typeof val != \"object\" || val.whenClosing !== false)\n      map[\"'/'\"] = function(cm) { return autoCloseSlash(cm); };\n    if (typeof val != \"object\" || val.whenOpening !== false)\n      map[\"'>'\"] = function(cm) { return autoCloseGT(cm); };\n    cm.addKeyMap(map);\n  });\n\n  var htmlDontClose = [\"area\", \"base\", \"br\", \"col\", \"command\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"param\",\n                       \"source\", \"track\", \"wbr\"];\n  var htmlIndent = [\"applet\", \"blockquote\", \"body\", \"button\", \"div\", \"dl\", \"fieldset\", \"form\", \"frameset\", \"h1\", \"h2\", \"h3\", \"h4\",\n                    \"h5\", \"h6\", \"head\", \"html\", \"iframe\", \"layer\", \"legend\", \"object\", \"ol\", \"p\", \"select\", \"table\", \"ul\"];\n\n  function autoCloseGT(cm) {\n    if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n    var ranges = cm.listSelections(), replacements = [];\n    var opt = cm.getOption(\"autoCloseTags\");\n    for (var i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) return CodeMirror.Pass;\n      var pos = ranges[i].head, tok = cm.getTokenAt(pos);\n      var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;\n      var tagInfo = inner.mode.xmlCurrentTag && inner.mode.xmlCurrentTag(state)\n      var tagName = tagInfo && tagInfo.name\n      if (!tagName) return CodeMirror.Pass\n\n      var html = inner.mode.configuration == \"html\";\n      var dontCloseTags = (typeof opt == \"object\" && opt.dontCloseTags) || (html && htmlDontClose);\n      var indentTags = (typeof opt == \"object\" && opt.indentTags) || (html && htmlIndent);\n\n      if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);\n      var lowerTagName = tagName.toLowerCase();\n      // Don't process the '>' at the end of an end-tag or self-closing tag\n      if (!tagName ||\n          tok.type == \"string\" && (tok.end != pos.ch || !/[\\\"\\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) ||\n          tok.type == \"tag\" && tagInfo.close ||\n          tok.string.indexOf(\"/\") == (pos.ch - tok.start - 1) || // match something like <someTagName />\n          dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 ||\n          closingTagExists(cm, inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state) || [], tagName, pos, true))\n        return CodeMirror.Pass;\n\n      var emptyTags = typeof opt == \"object\" && opt.emptyTags;\n      if (emptyTags && indexOf(emptyTags, tagName) > -1) {\n        replacements[i] = { text: \"/>\", newPos: CodeMirror.Pos(pos.line, pos.ch + 2) };\n        continue;\n      }\n\n      var indent = indentTags && indexOf(indentTags, lowerTagName) > -1;\n      replacements[i] = {indent: indent,\n                         text: \">\" + (indent ? \"\\n\\n\" : \"\") + \"</\" + tagName + \">\",\n                         newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)};\n    }\n\n    var dontIndentOnAutoClose = (typeof opt == \"object\" && opt.dontIndentOnAutoClose);\n    for (var i = ranges.length - 1; i >= 0; i--) {\n      var info = replacements[i];\n      cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, \"+insert\");\n      var sel = cm.listSelections().slice(0);\n      sel[i] = {head: info.newPos, anchor: info.newPos};\n      cm.setSelections(sel);\n      if (!dontIndentOnAutoClose && info.indent) {\n        cm.indentLine(info.newPos.line, null, true);\n        cm.indentLine(info.newPos.line + 1, null, true);\n      }\n    }\n  }\n\n  function autoCloseCurrent(cm, typingSlash) {\n    var ranges = cm.listSelections(), replacements = [];\n    var head = typingSlash ? \"/\" : \"</\";\n    var opt = cm.getOption(\"autoCloseTags\");\n    var dontIndentOnAutoClose = (typeof opt == \"object\" && opt.dontIndentOnSlash);\n    for (var i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) return CodeMirror.Pass;\n      var pos = ranges[i].head, tok = cm.getTokenAt(pos);\n      var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;\n      if (typingSlash && (tok.type == \"string\" || tok.string.charAt(0) != \"<\" ||\n                          tok.start != pos.ch - 1))\n        return CodeMirror.Pass;\n      // Kludge to get around the fact that we are not in XML mode\n      // when completing in JS/CSS snippet in htmlmixed mode. Does not\n      // work for other XML embedded languages (there is no general\n      // way to go from a mixed mode to its current XML state).\n      var replacement, mixed = inner.mode.name != \"xml\" && cm.getMode().name == \"htmlmixed\"\n      if (mixed && inner.mode.name == \"javascript\") {\n        replacement = head + \"script\";\n      } else if (mixed && inner.mode.name == \"css\") {\n        replacement = head + \"style\";\n      } else {\n        var context = inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state)\n        var top = context.length ? context[context.length - 1] : \"\"\n        if (!context || (context.length && closingTagExists(cm, context, top, pos)))\n          return CodeMirror.Pass;\n        replacement = head + top\n      }\n      if (cm.getLine(pos.line).charAt(tok.end) != \">\") replacement += \">\";\n      replacements[i] = replacement;\n    }\n    cm.replaceSelections(replacements);\n    ranges = cm.listSelections();\n    if (!dontIndentOnAutoClose) {\n        for (var i = 0; i < ranges.length; i++)\n            if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line)\n                cm.indentLine(ranges[i].head.line);\n    }\n  }\n\n  function autoCloseSlash(cm) {\n    if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n    return autoCloseCurrent(cm, true);\n  }\n\n  CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); };\n\n  function indexOf(collection, elt) {\n    if (collection.indexOf) return collection.indexOf(elt);\n    for (var i = 0, e = collection.length; i < e; ++i)\n      if (collection[i] == elt) return i;\n    return -1;\n  }\n\n  // If xml-fold is loaded, we use its functionality to try and verify\n  // whether a given tag is actually unclosed.\n  function closingTagExists(cm, context, tagName, pos, newTag) {\n    if (!CodeMirror.scanForClosingTag) return false;\n    var end = Math.min(cm.lastLine() + 1, pos.line + 500);\n    var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end);\n    if (!nextClose || nextClose.tag != tagName) return false;\n    // If the immediate wrapping context contains onCx instances of\n    // the same tag, a closing tag only exists if there are at least\n    // that many closing tags of that type following.\n    var onCx = newTag ? 1 : 0\n    for (var i = context.length - 1; i >= 0; i--) {\n      if (context[i] == tagName) ++onCx\n      else break\n    }\n    pos = nextClose.to;\n    for (var i = 1; i < onCx; i++) {\n      var next = CodeMirror.scanForClosingTag(cm, pos, null, end);\n      if (!next || next.tag != tagName) return false;\n      pos = next.to;\n    }\n    return true;\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/edit/continuelist.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var listRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]\\s|[*+-]\\s|(\\d+)([.)]))(\\s*)/,\n      emptyListRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]|[*+-]|(\\d+)[.)])(\\s*)$/,\n      unorderedListRE = /[*+-]\\s/;\n\n  CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {\n    if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n    var ranges = cm.listSelections(), replacements = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var pos = ranges[i].head;\n\n      // If we're not in Markdown mode, fall back to normal newlineAndIndent\n      var eolState = cm.getStateAfter(pos.line);\n      var inner = CodeMirror.innerMode(cm.getMode(), eolState);\n      if (inner.mode.name !== \"markdown\" && inner.mode.helperType !== \"markdown\") {\n        cm.execCommand(\"newlineAndIndent\");\n        return;\n      } else {\n        eolState = inner.state;\n      }\n\n      var inList = eolState.list !== false;\n      var inQuote = eolState.quote !== 0;\n\n      var line = cm.getLine(pos.line), match = listRE.exec(line);\n      var cursorBeforeBullet = /^\\s*$/.test(line.slice(0, pos.ch));\n      if (!ranges[i].empty() || (!inList && !inQuote) || !match || cursorBeforeBullet) {\n        cm.execCommand(\"newlineAndIndent\");\n        return;\n      }\n      if (emptyListRE.test(line)) {\n        var endOfQuote = inQuote && />\\s*$/.test(line)\n        var endOfList = !/>\\s*$/.test(line)\n        if (endOfQuote || endOfList) cm.replaceRange(\"\", {\n          line: pos.line, ch: 0\n        }, {\n          line: pos.line, ch: pos.ch + 1\n        });\n        replacements[i] = \"\\n\";\n      } else {\n        var indent = match[1], after = match[5];\n        var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(\">\") >= 0);\n        var bullet = numbered ? (parseInt(match[3], 10) + 1) + match[4] : match[2].replace(\"x\", \" \");\n        replacements[i] = \"\\n\" + indent + bullet + after;\n\n        if (numbered) incrementRemainingMarkdownListNumbers(cm, pos);\n      }\n    }\n\n    cm.replaceSelections(replacements);\n  };\n\n  // Auto-updating Markdown list numbers when a new item is added to the\n  // middle of a list\n  function incrementRemainingMarkdownListNumbers(cm, pos) {\n    var startLine = pos.line, lookAhead = 0, skipCount = 0;\n    var startItem = listRE.exec(cm.getLine(startLine)), startIndent = startItem[1];\n\n    do {\n      lookAhead += 1;\n      var nextLineNumber = startLine + lookAhead;\n      var nextLine = cm.getLine(nextLineNumber), nextItem = listRE.exec(nextLine);\n\n      if (nextItem) {\n        var nextIndent = nextItem[1];\n        var newNumber = (parseInt(startItem[3], 10) + lookAhead - skipCount);\n        var nextNumber = (parseInt(nextItem[3], 10)), itemNumber = nextNumber;\n\n        if (startIndent === nextIndent && !isNaN(nextNumber)) {\n          if (newNumber === nextNumber) itemNumber = nextNumber + 1;\n          if (newNumber > nextNumber) itemNumber = newNumber + 1;\n          cm.replaceRange(\n            nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]),\n          {\n            line: nextLineNumber, ch: 0\n          }, {\n            line: nextLineNumber, ch: nextLine.length\n          });\n        } else {\n          if (startIndent.length > nextIndent.length) return;\n          // This doesn't run if the next line immediately indents, as it is\n          // not clear of the users intention (new indented item or same level)\n          if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return;\n          skipCount += 1;\n        }\n      }\n    } while (nextItem);\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/edit/matchbrackets.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var ie_lt8 = /MSIE \\d/.test(navigator.userAgent) &&\n    (document.documentMode == null || document.documentMode < 8);\n\n  var Pos = CodeMirror.Pos;\n\n  var matching = {\"(\": \")>\", \")\": \"(<\", \"[\": \"]>\", \"]\": \"[<\", \"{\": \"}>\", \"}\": \"{<\", \"<\": \">>\", \">\": \"<<\"};\n\n  function bracketRegex(config) {\n    return config && config.bracketRegex || /[(){}[\\]]/\n  }\n\n  function findMatchingBracket(cm, where, config) {\n    var line = cm.getLineHandle(where.line), pos = where.ch - 1;\n    var afterCursor = config && config.afterCursor\n    if (afterCursor == null)\n      afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className)\n    var re = bracketRegex(config)\n\n    // A cursor is defined as between two characters, but in in vim command mode\n    // (i.e. not insert mode), the cursor is visually represented as a\n    // highlighted box on top of the 2nd character. Otherwise, we allow matches\n    // from before or after the cursor.\n    var match = (!afterCursor && pos >= 0 && re.test(line.text.charAt(pos)) && matching[line.text.charAt(pos)]) ||\n        re.test(line.text.charAt(pos + 1)) && matching[line.text.charAt(++pos)];\n    if (!match) return null;\n    var dir = match.charAt(1) == \">\" ? 1 : -1;\n    if (config && config.strict && (dir > 0) != (pos == where.ch)) return null;\n    var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));\n\n    var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style, config);\n    if (found == null) return null;\n    return {from: Pos(where.line, pos), to: found && found.pos,\n            match: found && found.ch == match.charAt(0), forward: dir > 0};\n  }\n\n  // bracketRegex is used to specify which type of bracket to scan\n  // should be a regexp, e.g. /[[\\]]/\n  //\n  // Note: If \"where\" is on an open bracket, then this bracket is ignored.\n  //\n  // Returns false when no bracket was found, null when it reached\n  // maxScanLines and gave up\n  function scanForBracket(cm, where, dir, style, config) {\n    var maxScanLen = (config && config.maxScanLineLength) || 10000;\n    var maxScanLines = (config && config.maxScanLines) || 1000;\n\n    var stack = [];\n    var re = bracketRegex(config)\n    var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)\n                          : Math.max(cm.firstLine() - 1, where.line - maxScanLines);\n    for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {\n      var line = cm.getLine(lineNo);\n      if (!line) continue;\n      var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;\n      if (line.length > maxScanLen) continue;\n      if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);\n      for (; pos != end; pos += dir) {\n        var ch = line.charAt(pos);\n        if (re.test(ch) && (style === undefined ||\n                            (cm.getTokenTypeAt(Pos(lineNo, pos + 1)) || \"\") == (style || \"\"))) {\n          var match = matching[ch];\n          if (match && (match.charAt(1) == \">\") == (dir > 0)) stack.push(ch);\n          else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};\n          else stack.pop();\n        }\n      }\n    }\n    return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;\n  }\n\n  function matchBrackets(cm, autoclear, config) {\n    // Disable brace matching in long lines, since it'll cause hugely slow updates\n    var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000,\n      highlightNonMatching = config && config.highlightNonMatching;\n    var marks = [], ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config);\n      if (match && (match.match || highlightNonMatching !== false) && cm.getLine(match.from.line).length <= maxHighlightLen) {\n        var style = match.match ? \"CodeMirror-matchingbracket\" : \"CodeMirror-nonmatchingbracket\";\n        marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));\n        if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)\n          marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));\n      }\n    }\n\n    if (marks.length) {\n      // Kludge to work around the IE bug from issue #1193, where text\n      // input stops going to the textarea whenever this fires.\n      if (ie_lt8 && cm.state.focused) cm.focus();\n\n      var clear = function() {\n        cm.operation(function() {\n          for (var i = 0; i < marks.length; i++) marks[i].clear();\n        });\n      };\n      if (autoclear) setTimeout(clear, 800);\n      else return clear;\n    }\n  }\n\n  function doMatchBrackets(cm) {\n    cm.operation(function() {\n      if (cm.state.matchBrackets.currentlyHighlighted) {\n        cm.state.matchBrackets.currentlyHighlighted();\n        cm.state.matchBrackets.currentlyHighlighted = null;\n      }\n      cm.state.matchBrackets.currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);\n    });\n  }\n\n  function clearHighlighted(cm) {\n    if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) {\n      cm.state.matchBrackets.currentlyHighlighted();\n      cm.state.matchBrackets.currentlyHighlighted = null;\n    }\n  }\n\n  CodeMirror.defineOption(\"matchBrackets\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.off(\"cursorActivity\", doMatchBrackets);\n      cm.off(\"focus\", doMatchBrackets)\n      cm.off(\"blur\", clearHighlighted)\n      clearHighlighted(cm);\n    }\n    if (val) {\n      cm.state.matchBrackets = typeof val == \"object\" ? val : {};\n      cm.on(\"cursorActivity\", doMatchBrackets);\n      cm.on(\"focus\", doMatchBrackets)\n      cm.on(\"blur\", clearHighlighted)\n    }\n  });\n\n  CodeMirror.defineExtension(\"matchBrackets\", function() {matchBrackets(this, true);});\n  CodeMirror.defineExtension(\"findMatchingBracket\", function(pos, config, oldConfig){\n    // Backwards-compatibility kludge\n    if (oldConfig || typeof config == \"boolean\") {\n      if (!oldConfig) {\n        config = config ? {strict: true} : null\n      } else {\n        oldConfig.strict = config\n        config = oldConfig\n      }\n    }\n    return findMatchingBracket(this, pos, config)\n  });\n  CodeMirror.defineExtension(\"scanForBracket\", function(pos, dir, style, config){\n    return scanForBracket(this, pos, dir, style, config);\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/edit/matchtags.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../fold/xml-fold\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../fold/xml-fold\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"matchTags\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.off(\"cursorActivity\", doMatchTags);\n      cm.off(\"viewportChange\", maybeUpdateMatch);\n      clear(cm);\n    }\n    if (val) {\n      cm.state.matchBothTags = typeof val == \"object\" && val.bothTags;\n      cm.on(\"cursorActivity\", doMatchTags);\n      cm.on(\"viewportChange\", maybeUpdateMatch);\n      doMatchTags(cm);\n    }\n  });\n\n  function clear(cm) {\n    if (cm.state.tagHit) cm.state.tagHit.clear();\n    if (cm.state.tagOther) cm.state.tagOther.clear();\n    cm.state.tagHit = cm.state.tagOther = null;\n  }\n\n  function doMatchTags(cm) {\n    cm.state.failedTagMatch = false;\n    cm.operation(function() {\n      clear(cm);\n      if (cm.somethingSelected()) return;\n      var cur = cm.getCursor(), range = cm.getViewport();\n      range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to);\n      var match = CodeMirror.findMatchingTag(cm, cur, range);\n      if (!match) return;\n      if (cm.state.matchBothTags) {\n        var hit = match.at == \"open\" ? match.open : match.close;\n        if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: \"CodeMirror-matchingtag\"});\n      }\n      var other = match.at == \"close\" ? match.open : match.close;\n      if (other)\n        cm.state.tagOther = cm.markText(other.from, other.to, {className: \"CodeMirror-matchingtag\"});\n      else\n        cm.state.failedTagMatch = true;\n    });\n  }\n\n  function maybeUpdateMatch(cm) {\n    if (cm.state.failedTagMatch) doMatchTags(cm);\n  }\n\n  CodeMirror.commands.toMatchingTag = function(cm) {\n    var found = CodeMirror.findMatchingTag(cm, cm.getCursor());\n    if (found) {\n      var other = found.at == \"close\" ? found.open : found.close;\n      if (other) cm.extendSelection(other.to, other.from);\n    }\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/edit/trailingspace.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  CodeMirror.defineOption(\"showTrailingSpace\", false, function(cm, val, prev) {\n    if (prev == CodeMirror.Init) prev = false;\n    if (prev && !val)\n      cm.removeOverlay(\"trailingspace\");\n    else if (!prev && val)\n      cm.addOverlay({\n        token: function(stream) {\n          for (var l = stream.string.length, i = l; i && /\\s/.test(stream.string.charAt(i - 1)); --i) {}\n          if (i > stream.pos) { stream.pos = i; return null; }\n          stream.pos = l;\n          return \"trailingspace\";\n        },\n        name: \"trailingspace\"\n      });\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/fold/brace-fold.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction bracketFolding(pairs) {\n  return function(cm, start) {\n    var line = start.line, lineText = cm.getLine(line);\n\n    function findOpening(pair) {\n      var tokenType;\n      for (var at = start.ch, pass = 0;;) {\n        var found = at <= 0 ? -1 : lineText.lastIndexOf(pair[0], at - 1);\n        if (found == -1) {\n          if (pass == 1) break;\n          pass = 1;\n          at = lineText.length;\n          continue;\n        }\n        if (pass == 1 && found < start.ch) break;\n        tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));\n        if (!/^(comment|string)/.test(tokenType)) return {ch: found + 1, tokenType: tokenType, pair: pair};\n        at = found - 1;\n      }\n    }\n\n    function findRange(found) {\n      var count = 1, lastLine = cm.lastLine(), end, startCh = found.ch, endCh\n      outer: for (var i = line; i <= lastLine; ++i) {\n        var text = cm.getLine(i), pos = i == line ? startCh : 0;\n        for (;;) {\n          var nextOpen = text.indexOf(found.pair[0], pos), nextClose = text.indexOf(found.pair[1], pos);\n          if (nextOpen < 0) nextOpen = text.length;\n          if (nextClose < 0) nextClose = text.length;\n          pos = Math.min(nextOpen, nextClose);\n          if (pos == text.length) break;\n          if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == found.tokenType) {\n            if (pos == nextOpen) ++count;\n            else if (!--count) { end = i; endCh = pos; break outer; }\n          }\n          ++pos;\n        }\n      }\n\n      if (end == null || line == end) return null\n      return {from: CodeMirror.Pos(line, startCh),\n              to: CodeMirror.Pos(end, endCh)};\n    }\n\n    var found = []\n    for (var i = 0; i < pairs.length; i++) {\n      var open = findOpening(pairs[i])\n      if (open) found.push(open)\n    }\n    found.sort(function(a, b) { return a.ch - b.ch })\n    for (var i = 0; i < found.length; i++) {\n      var range = findRange(found[i])\n      if (range) return range\n    }\n    return null\n  }\n}\n\nCodeMirror.registerHelper(\"fold\", \"brace\", bracketFolding([[\"{\", \"}\"], [\"[\", \"]\"]]));\n\nCodeMirror.registerHelper(\"fold\", \"brace-paren\", bracketFolding([[\"{\", \"}\"], [\"[\", \"]\"], [\"(\", \")\"]]));\n\nCodeMirror.registerHelper(\"fold\", \"import\", function(cm, start) {\n  function hasImport(line) {\n    if (line < cm.firstLine() || line > cm.lastLine()) return null;\n    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));\n    if (!/\\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));\n    if (start.type != \"keyword\" || start.string != \"import\") return null;\n    // Now find closing semicolon, return its position\n    for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {\n      var text = cm.getLine(i), semi = text.indexOf(\";\");\n      if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};\n    }\n  }\n\n  var startLine = start.line, has = hasImport(startLine), prev;\n  if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))\n    return null;\n  for (var end = has.end;;) {\n    var next = hasImport(end.line + 1);\n    if (next == null) break;\n    end = next.end;\n  }\n  return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};\n});\n\nCodeMirror.registerHelper(\"fold\", \"include\", function(cm, start) {\n  function hasInclude(line) {\n    if (line < cm.firstLine() || line > cm.lastLine()) return null;\n    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));\n    if (!/\\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));\n    if (start.type == \"meta\" && start.string.slice(0, 8) == \"#include\") return start.start + 8;\n  }\n\n  var startLine = start.line, has = hasInclude(startLine);\n  if (has == null || hasInclude(startLine - 1) != null) return null;\n  for (var end = startLine;;) {\n    var next = hasInclude(end + 1);\n    if (next == null) break;\n    ++end;\n  }\n  return {from: CodeMirror.Pos(startLine, has + 1),\n          to: cm.clipPos(CodeMirror.Pos(end))};\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/fold/comment-fold.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerGlobalHelper(\"fold\", \"comment\", function(mode) {\n  return mode.blockCommentStart && mode.blockCommentEnd;\n}, function(cm, start) {\n  var mode = cm.getModeAt(start), startToken = mode.blockCommentStart, endToken = mode.blockCommentEnd;\n  if (!startToken || !endToken) return;\n  var line = start.line, lineText = cm.getLine(line);\n\n  var startCh;\n  for (var at = start.ch, pass = 0;;) {\n    var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1);\n    if (found == -1) {\n      if (pass == 1) return;\n      pass = 1;\n      at = lineText.length;\n      continue;\n    }\n    if (pass == 1 && found < start.ch) return;\n    if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1))) &&\n        (found == 0 || lineText.slice(found - endToken.length, found) == endToken ||\n         !/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found))))) {\n      startCh = found + startToken.length;\n      break;\n    }\n    at = found - 1;\n  }\n\n  var depth = 1, lastLine = cm.lastLine(), end, endCh;\n  outer: for (var i = line; i <= lastLine; ++i) {\n    var text = cm.getLine(i), pos = i == line ? startCh : 0;\n    for (;;) {\n      var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);\n      if (nextOpen < 0) nextOpen = text.length;\n      if (nextClose < 0) nextClose = text.length;\n      pos = Math.min(nextOpen, nextClose);\n      if (pos == text.length) break;\n      if (pos == nextOpen) ++depth;\n      else if (!--depth) { end = i; endCh = pos; break outer; }\n      ++pos;\n    }\n  }\n  if (end == null || line == end && endCh == startCh) return;\n  return {from: CodeMirror.Pos(line, startCh),\n          to: CodeMirror.Pos(end, endCh)};\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/fold/foldcode.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function doFold(cm, pos, options, force) {\n    if (options && options.call) {\n      var finder = options;\n      options = null;\n    } else {\n      var finder = getOption(cm, options, \"rangeFinder\");\n    }\n    if (typeof pos == \"number\") pos = CodeMirror.Pos(pos, 0);\n    var minSize = getOption(cm, options, \"minFoldSize\");\n\n    function getRange(allowFolded) {\n      var range = finder(cm, pos);\n      if (!range || range.to.line - range.from.line < minSize) return null;\n      if (force === \"fold\") return range;\n\n      var marks = cm.findMarksAt(range.from);\n      for (var i = 0; i < marks.length; ++i) {\n        if (marks[i].__isFold) {\n          if (!allowFolded) return null;\n          range.cleared = true;\n          marks[i].clear();\n        }\n      }\n      return range;\n    }\n\n    var range = getRange(true);\n    if (getOption(cm, options, \"scanUp\")) while (!range && pos.line > cm.firstLine()) {\n      pos = CodeMirror.Pos(pos.line - 1, 0);\n      range = getRange(false);\n    }\n    if (!range || range.cleared || force === \"unfold\") return;\n\n    var myWidget = makeWidget(cm, options, range);\n    CodeMirror.on(myWidget, \"mousedown\", function(e) {\n      myRange.clear();\n      CodeMirror.e_preventDefault(e);\n    });\n    var myRange = cm.markText(range.from, range.to, {\n      replacedWith: myWidget,\n      clearOnEnter: getOption(cm, options, \"clearOnEnter\"),\n      __isFold: true\n    });\n    myRange.on(\"clear\", function(from, to) {\n      CodeMirror.signal(cm, \"unfold\", cm, from, to);\n    });\n    CodeMirror.signal(cm, \"fold\", cm, range.from, range.to);\n  }\n\n  function makeWidget(cm, options, range) {\n    var widget = getOption(cm, options, \"widget\");\n\n    if (typeof widget == \"function\") {\n      widget = widget(range.from, range.to);\n    }\n\n    if (typeof widget == \"string\") {\n      var text = document.createTextNode(widget);\n      widget = document.createElement(\"span\");\n      widget.appendChild(text);\n      widget.className = \"CodeMirror-foldmarker\";\n    } else if (widget) {\n      widget = widget.cloneNode(true)\n    }\n    return widget;\n  }\n\n  // Clumsy backwards-compatible interface\n  CodeMirror.newFoldFunction = function(rangeFinder, widget) {\n    return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };\n  };\n\n  // New-style interface\n  CodeMirror.defineExtension(\"foldCode\", function(pos, options, force) {\n    doFold(this, pos, options, force);\n  });\n\n  CodeMirror.defineExtension(\"isFolded\", function(pos) {\n    var marks = this.findMarksAt(pos);\n    for (var i = 0; i < marks.length; ++i)\n      if (marks[i].__isFold) return true;\n  });\n\n  CodeMirror.commands.toggleFold = function(cm) {\n    cm.foldCode(cm.getCursor());\n  };\n  CodeMirror.commands.fold = function(cm) {\n    cm.foldCode(cm.getCursor(), null, \"fold\");\n  };\n  CodeMirror.commands.unfold = function(cm) {\n    cm.foldCode(cm.getCursor(), { scanUp: false }, \"unfold\");\n  };\n  CodeMirror.commands.foldAll = function(cm) {\n    cm.operation(function() {\n      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)\n        cm.foldCode(CodeMirror.Pos(i, 0), { scanUp: false }, \"fold\");\n    });\n  };\n  CodeMirror.commands.unfoldAll = function(cm) {\n    cm.operation(function() {\n      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)\n        cm.foldCode(CodeMirror.Pos(i, 0), { scanUp: false }, \"unfold\");\n    });\n  };\n\n  CodeMirror.registerHelper(\"fold\", \"combine\", function() {\n    var funcs = Array.prototype.slice.call(arguments, 0);\n    return function(cm, start) {\n      for (var i = 0; i < funcs.length; ++i) {\n        var found = funcs[i](cm, start);\n        if (found) return found;\n      }\n    };\n  });\n\n  CodeMirror.registerHelper(\"fold\", \"auto\", function(cm, start) {\n    var helpers = cm.getHelpers(start, \"fold\");\n    for (var i = 0; i < helpers.length; i++) {\n      var cur = helpers[i](cm, start);\n      if (cur) return cur;\n    }\n  });\n\n  var defaultOptions = {\n    rangeFinder: CodeMirror.fold.auto,\n    widget: \"\\u2194\",\n    minFoldSize: 0,\n    scanUp: false,\n    clearOnEnter: true\n  };\n\n  CodeMirror.defineOption(\"foldOptions\", null);\n\n  function getOption(cm, options, name) {\n    if (options && options[name] !== undefined)\n      return options[name];\n    var editorOptions = cm.options.foldOptions;\n    if (editorOptions && editorOptions[name] !== undefined)\n      return editorOptions[name];\n    return defaultOptions[name];\n  }\n\n  CodeMirror.defineExtension(\"foldOption\", function(options, name) {\n    return getOption(this, options, name);\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/fold/foldgutter.css",
    "content": ".CodeMirror-foldmarker {\n  color: blue;\n  text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px;\n  font-family: arial;\n  line-height: .3;\n  cursor: pointer;\n}\n.CodeMirror-foldgutter {\n  width: .7em;\n}\n.CodeMirror-foldgutter-open,\n.CodeMirror-foldgutter-folded {\n  cursor: pointer;\n}\n.CodeMirror-foldgutter-open:after {\n  content: \"\\25BE\";\n}\n.CodeMirror-foldgutter-folded:after {\n  content: \"\\25B8\";\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/fold/foldgutter.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./foldcode\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./foldcode\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"foldGutter\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.clearGutter(cm.state.foldGutter.options.gutter);\n      cm.state.foldGutter = null;\n      cm.off(\"gutterClick\", onGutterClick);\n      cm.off(\"changes\", onChange);\n      cm.off(\"viewportChange\", onViewportChange);\n      cm.off(\"fold\", onFold);\n      cm.off(\"unfold\", onFold);\n      cm.off(\"swapDoc\", onChange);\n    }\n    if (val) {\n      cm.state.foldGutter = new State(parseOptions(val));\n      updateInViewport(cm);\n      cm.on(\"gutterClick\", onGutterClick);\n      cm.on(\"changes\", onChange);\n      cm.on(\"viewportChange\", onViewportChange);\n      cm.on(\"fold\", onFold);\n      cm.on(\"unfold\", onFold);\n      cm.on(\"swapDoc\", onChange);\n    }\n  });\n\n  var Pos = CodeMirror.Pos;\n\n  function State(options) {\n    this.options = options;\n    this.from = this.to = 0;\n  }\n\n  function parseOptions(opts) {\n    if (opts === true) opts = {};\n    if (opts.gutter == null) opts.gutter = \"CodeMirror-foldgutter\";\n    if (opts.indicatorOpen == null) opts.indicatorOpen = \"CodeMirror-foldgutter-open\";\n    if (opts.indicatorFolded == null) opts.indicatorFolded = \"CodeMirror-foldgutter-folded\";\n    return opts;\n  }\n\n  function isFolded(cm, line) {\n    var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0));\n    for (var i = 0; i < marks.length; ++i) {\n      if (marks[i].__isFold) {\n        var fromPos = marks[i].find(-1);\n        if (fromPos && fromPos.line === line)\n          return marks[i];\n      }\n    }\n  }\n\n  function marker(spec) {\n    if (typeof spec == \"string\") {\n      var elt = document.createElement(\"div\");\n      elt.className = spec + \" CodeMirror-guttermarker-subtle\";\n      return elt;\n    } else {\n      return spec.cloneNode(true);\n    }\n  }\n\n  function updateFoldInfo(cm, from, to) {\n    var opts = cm.state.foldGutter.options, cur = from - 1;\n    var minSize = cm.foldOption(opts, \"minFoldSize\");\n    var func = cm.foldOption(opts, \"rangeFinder\");\n    // we can reuse the built-in indicator element if its className matches the new state\n    var clsFolded = typeof opts.indicatorFolded == \"string\" && classTest(opts.indicatorFolded);\n    var clsOpen = typeof opts.indicatorOpen == \"string\" && classTest(opts.indicatorOpen);\n    cm.eachLine(from, to, function(line) {\n      ++cur;\n      var mark = null;\n      var old = line.gutterMarkers;\n      if (old) old = old[opts.gutter];\n      if (isFolded(cm, cur)) {\n        if (clsFolded && old && clsFolded.test(old.className)) return;\n        mark = marker(opts.indicatorFolded);\n      } else {\n        var pos = Pos(cur, 0);\n        var range = func && func(cm, pos);\n        if (range && range.to.line - range.from.line >= minSize) {\n          if (clsOpen && old && clsOpen.test(old.className)) return;\n          mark = marker(opts.indicatorOpen);\n        }\n      }\n      if (!mark && !old) return;\n      cm.setGutterMarker(line, opts.gutter, mark);\n    });\n  }\n\n  // copied from CodeMirror/src/util/dom.js\n  function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\n  function updateInViewport(cm) {\n    var vp = cm.getViewport(), state = cm.state.foldGutter;\n    if (!state) return;\n    cm.operation(function() {\n      updateFoldInfo(cm, vp.from, vp.to);\n    });\n    state.from = vp.from; state.to = vp.to;\n  }\n\n  function onGutterClick(cm, line, gutter) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    if (gutter != opts.gutter) return;\n    var folded = isFolded(cm, line);\n    if (folded) folded.clear();\n    else cm.foldCode(Pos(line, 0), opts);\n  }\n\n  function onChange(cm) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    state.from = state.to = 0;\n    clearTimeout(state.changeUpdate);\n    state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);\n  }\n\n  function onViewportChange(cm) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    clearTimeout(state.changeUpdate);\n    state.changeUpdate = setTimeout(function() {\n      var vp = cm.getViewport();\n      if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {\n        updateInViewport(cm);\n      } else {\n        cm.operation(function() {\n          if (vp.from < state.from) {\n            updateFoldInfo(cm, vp.from, state.from);\n            state.from = vp.from;\n          }\n          if (vp.to > state.to) {\n            updateFoldInfo(cm, state.to, vp.to);\n            state.to = vp.to;\n          }\n        });\n      }\n    }, opts.updateViewportTimeSpan || 400);\n  }\n\n  function onFold(cm, from) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var line = from.line;\n    if (line >= state.from && line < state.to)\n      updateFoldInfo(cm, line, line + 1);\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/fold/indent-fold.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction lineIndent(cm, lineNo) {\n  var text = cm.getLine(lineNo)\n  var spaceTo = text.search(/\\S/)\n  if (spaceTo == -1 || /\\bcomment\\b/.test(cm.getTokenTypeAt(CodeMirror.Pos(lineNo, spaceTo + 1))))\n    return -1\n  return CodeMirror.countColumn(text, null, cm.getOption(\"tabSize\"))\n}\n\nCodeMirror.registerHelper(\"fold\", \"indent\", function(cm, start) {\n  var myIndent = lineIndent(cm, start.line)\n  if (myIndent < 0) return\n  var lastLineInFold = null\n\n  // Go through lines until we find a line that definitely doesn't belong in\n  // the block we're folding, or to the end.\n  for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) {\n    var indent = lineIndent(cm, i)\n    if (indent == -1) {\n    } else if (indent > myIndent) {\n      // Lines with a greater indent are considered part of the block.\n      lastLineInFold = i;\n    } else {\n      // If this line has non-space, non-comment content, and is\n      // indented less or equal to the start line, it is the start of\n      // another block.\n      break;\n    }\n  }\n  if (lastLineInFold) return {\n    from: CodeMirror.Pos(start.line, cm.getLine(start.line).length),\n    to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length)\n  };\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/fold/markdown-fold.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"fold\", \"markdown\", function(cm, start) {\n  var maxDepth = 100;\n\n  function isHeader(lineNo) {\n    var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0));\n    return tokentype && /\\bheader\\b/.test(tokentype);\n  }\n\n  function headerLevel(lineNo, line, nextLine) {\n    var match = line && line.match(/^#+/);\n    if (match && isHeader(lineNo)) return match[0].length;\n    match = nextLine && nextLine.match(/^[=\\-]+\\s*$/);\n    if (match && isHeader(lineNo + 1)) return nextLine[0] == \"=\" ? 1 : 2;\n    return maxDepth;\n  }\n\n  var firstLine = cm.getLine(start.line), nextLine = cm.getLine(start.line + 1);\n  var level = headerLevel(start.line, firstLine, nextLine);\n  if (level === maxDepth) return undefined;\n\n  var lastLineNo = cm.lastLine();\n  var end = start.line, nextNextLine = cm.getLine(end + 2);\n  while (end < lastLineNo) {\n    if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break;\n    ++end;\n    nextLine = nextNextLine;\n    nextNextLine = cm.getLine(end + 2);\n  }\n\n  return {\n    from: CodeMirror.Pos(start.line, firstLine.length),\n    to: CodeMirror.Pos(end, cm.getLine(end).length)\n  };\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/fold/xml-fold.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var Pos = CodeMirror.Pos;\n  function cmp(a, b) { return a.line - b.line || a.ch - b.ch; }\n\n  var nameStartChar = \"A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n  var nameChar = nameStartChar + \"\\-\\:\\.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\n  var xmlTagStart = new RegExp(\"<(/?)([\" + nameStartChar + \"][\" + nameChar + \"]*)\", \"g\");\n\n  function Iter(cm, line, ch, range) {\n    this.line = line; this.ch = ch;\n    this.cm = cm; this.text = cm.getLine(line);\n    this.min = range ? Math.max(range.from, cm.firstLine()) : cm.firstLine();\n    this.max = range ? Math.min(range.to - 1, cm.lastLine()) : cm.lastLine();\n  }\n\n  function tagAt(iter, ch) {\n    var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch));\n    return type && /\\btag\\b/.test(type);\n  }\n\n  function nextLine(iter) {\n    if (iter.line >= iter.max) return;\n    iter.ch = 0;\n    iter.text = iter.cm.getLine(++iter.line);\n    return true;\n  }\n  function prevLine(iter) {\n    if (iter.line <= iter.min) return;\n    iter.text = iter.cm.getLine(--iter.line);\n    iter.ch = iter.text.length;\n    return true;\n  }\n\n  function toTagEnd(iter) {\n    for (;;) {\n      var gt = iter.text.indexOf(\">\", iter.ch);\n      if (gt == -1) { if (nextLine(iter)) continue; else return; }\n      if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; }\n      var lastSlash = iter.text.lastIndexOf(\"/\", gt);\n      var selfClose = lastSlash > -1 && !/\\S/.test(iter.text.slice(lastSlash + 1, gt));\n      iter.ch = gt + 1;\n      return selfClose ? \"selfClose\" : \"regular\";\n    }\n  }\n  function toTagStart(iter) {\n    for (;;) {\n      var lt = iter.ch ? iter.text.lastIndexOf(\"<\", iter.ch - 1) : -1;\n      if (lt == -1) { if (prevLine(iter)) continue; else return; }\n      if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; }\n      xmlTagStart.lastIndex = lt;\n      iter.ch = lt;\n      var match = xmlTagStart.exec(iter.text);\n      if (match && match.index == lt) return match;\n    }\n  }\n\n  function toNextTag(iter) {\n    for (;;) {\n      xmlTagStart.lastIndex = iter.ch;\n      var found = xmlTagStart.exec(iter.text);\n      if (!found) { if (nextLine(iter)) continue; else return; }\n      if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; }\n      iter.ch = found.index + found[0].length;\n      return found;\n    }\n  }\n  function toPrevTag(iter) {\n    for (;;) {\n      var gt = iter.ch ? iter.text.lastIndexOf(\">\", iter.ch - 1) : -1;\n      if (gt == -1) { if (prevLine(iter)) continue; else return; }\n      if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; }\n      var lastSlash = iter.text.lastIndexOf(\"/\", gt);\n      var selfClose = lastSlash > -1 && !/\\S/.test(iter.text.slice(lastSlash + 1, gt));\n      iter.ch = gt + 1;\n      return selfClose ? \"selfClose\" : \"regular\";\n    }\n  }\n\n  function findMatchingClose(iter, tag) {\n    var stack = [];\n    for (;;) {\n      var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0);\n      if (!next || !(end = toTagEnd(iter))) return;\n      if (end == \"selfClose\") continue;\n      if (next[1]) { // closing tag\n        for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) {\n          stack.length = i;\n          break;\n        }\n        if (i < 0 && (!tag || tag == next[2])) return {\n          tag: next[2],\n          from: Pos(startLine, startCh),\n          to: Pos(iter.line, iter.ch)\n        };\n      } else { // opening tag\n        stack.push(next[2]);\n      }\n    }\n  }\n  function findMatchingOpen(iter, tag) {\n    var stack = [];\n    for (;;) {\n      var prev = toPrevTag(iter);\n      if (!prev) return;\n      if (prev == \"selfClose\") { toTagStart(iter); continue; }\n      var endLine = iter.line, endCh = iter.ch;\n      var start = toTagStart(iter);\n      if (!start) return;\n      if (start[1]) { // closing tag\n        stack.push(start[2]);\n      } else { // opening tag\n        for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) {\n          stack.length = i;\n          break;\n        }\n        if (i < 0 && (!tag || tag == start[2])) return {\n          tag: start[2],\n          from: Pos(iter.line, iter.ch),\n          to: Pos(endLine, endCh)\n        };\n      }\n    }\n  }\n\n  CodeMirror.registerHelper(\"fold\", \"xml\", function(cm, start) {\n    var iter = new Iter(cm, start.line, 0);\n    for (;;) {\n      var openTag = toNextTag(iter)\n      if (!openTag || iter.line != start.line) return\n      var end = toTagEnd(iter)\n      if (!end) return\n      if (!openTag[1] && end != \"selfClose\") {\n        var startPos = Pos(iter.line, iter.ch);\n        var endPos = findMatchingClose(iter, openTag[2]);\n        return endPos && cmp(endPos.from, startPos) > 0 ? {from: startPos, to: endPos.from} : null\n      }\n    }\n  });\n  CodeMirror.findMatchingTag = function(cm, pos, range) {\n    var iter = new Iter(cm, pos.line, pos.ch, range);\n    if (iter.text.indexOf(\">\") == -1 && iter.text.indexOf(\"<\") == -1) return;\n    var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);\n    var start = end && toTagStart(iter);\n    if (!end || !start || cmp(iter, pos) > 0) return;\n    var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};\n    if (end == \"selfClose\") return {open: here, close: null, at: \"open\"};\n\n    if (start[1]) { // closing tag\n      return {open: findMatchingOpen(iter, start[2]), close: here, at: \"close\"};\n    } else { // opening tag\n      iter = new Iter(cm, to.line, to.ch, range);\n      return {open: here, close: findMatchingClose(iter, start[2]), at: \"open\"};\n    }\n  };\n\n  CodeMirror.findEnclosingTag = function(cm, pos, range, tag) {\n    var iter = new Iter(cm, pos.line, pos.ch, range);\n    for (;;) {\n      var open = findMatchingOpen(iter, tag);\n      if (!open) break;\n      var forward = new Iter(cm, pos.line, pos.ch, range);\n      var close = findMatchingClose(forward, open.tag);\n      if (close) return {open: open, close: close};\n    }\n  };\n\n  // Used by addon/edit/closetag.js\n  CodeMirror.scanForClosingTag = function(cm, pos, name, end) {\n    var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null);\n    return findMatchingClose(iter, name);\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/hint/anyword-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var WORD = /[\\w$]+/, RANGE = 500;\n\n  CodeMirror.registerHelper(\"hint\", \"anyword\", function(editor, options) {\n    var word = options && options.word || WORD;\n    var range = options && options.range || RANGE;\n    var cur = editor.getCursor(), curLine = editor.getLine(cur.line);\n    var end = cur.ch, start = end;\n    while (start && word.test(curLine.charAt(start - 1))) --start;\n    var curWord = start != end && curLine.slice(start, end);\n\n    var list = options && options.list || [], seen = {};\n    var re = new RegExp(word.source, \"g\");\n    for (var dir = -1; dir <= 1; dir += 2) {\n      var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir;\n      for (; line != endLine; line += dir) {\n        var text = editor.getLine(line), m;\n        while (m = re.exec(text)) {\n          if (line == cur.line && m[0] === curWord) continue;\n          if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) {\n            seen[m[0]] = true;\n            list.push(m[0]);\n          }\n        }\n      }\n    }\n    return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)};\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/hint/css-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../mode/css/css\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../mode/css/css\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var pseudoClasses = {\"active\":1, \"after\":1, \"before\":1, \"checked\":1, \"default\":1,\n    \"disabled\":1, \"empty\":1, \"enabled\":1, \"first-child\":1, \"first-letter\":1,\n    \"first-line\":1, \"first-of-type\":1, \"focus\":1, \"hover\":1, \"in-range\":1,\n    \"indeterminate\":1, \"invalid\":1, \"lang\":1, \"last-child\":1, \"last-of-type\":1,\n    \"link\":1, \"not\":1, \"nth-child\":1, \"nth-last-child\":1, \"nth-last-of-type\":1,\n    \"nth-of-type\":1, \"only-of-type\":1, \"only-child\":1, \"optional\":1, \"out-of-range\":1,\n    \"placeholder\":1, \"read-only\":1, \"read-write\":1, \"required\":1, \"root\":1,\n    \"selection\":1, \"target\":1, \"valid\":1, \"visited\":1\n  };\n\n  CodeMirror.registerHelper(\"hint\", \"css\", function(cm) {\n    var cur = cm.getCursor(), token = cm.getTokenAt(cur);\n    var inner = CodeMirror.innerMode(cm.getMode(), token.state);\n    if (inner.mode.name != \"css\") return;\n\n    if (token.type == \"keyword\" && \"!important\".indexOf(token.string) == 0)\n      return {list: [\"!important\"], from: CodeMirror.Pos(cur.line, token.start),\n              to: CodeMirror.Pos(cur.line, token.end)};\n\n    var start = token.start, end = cur.ch, word = token.string.slice(0, end - start);\n    if (/[^\\w$_-]/.test(word)) {\n      word = \"\"; start = end = cur.ch;\n    }\n\n    var spec = CodeMirror.resolveMode(\"text/css\");\n\n    var result = [];\n    function add(keywords) {\n      for (var name in keywords)\n        if (!word || name.lastIndexOf(word, 0) == 0)\n          result.push(name);\n    }\n\n    var st = inner.state.state;\n    if (st == \"pseudo\" || token.type == \"variable-3\") {\n      add(pseudoClasses);\n    } else if (st == \"block\" || st == \"maybeprop\") {\n      add(spec.propertyKeywords);\n    } else if (st == \"prop\" || st == \"parens\" || st == \"at\" || st == \"params\") {\n      add(spec.valueKeywords);\n      add(spec.colorKeywords);\n    } else if (st == \"media\" || st == \"media_parens\") {\n      add(spec.mediaTypes);\n      add(spec.mediaFeatures);\n    }\n\n    if (result.length) return {\n      list: result,\n      from: CodeMirror.Pos(cur.line, start),\n      to: CodeMirror.Pos(cur.line, end)\n    };\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/hint/html-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./xml-hint\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./xml-hint\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var langs = \"ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu\".split(\" \");\n  var targets = [\"_blank\", \"_self\", \"_top\", \"_parent\"];\n  var charsets = [\"ascii\", \"utf-8\", \"utf-16\", \"latin1\", \"latin1\"];\n  var methods = [\"get\", \"post\", \"put\", \"delete\"];\n  var encs = [\"application/x-www-form-urlencoded\", \"multipart/form-data\", \"text/plain\"];\n  var media = [\"all\", \"screen\", \"print\", \"embossed\", \"braille\", \"handheld\", \"print\", \"projection\", \"screen\", \"tty\", \"tv\", \"speech\",\n               \"3d-glasses\", \"resolution [>][<][=] [X]\", \"device-aspect-ratio: X/Y\", \"orientation:portrait\",\n               \"orientation:landscape\", \"device-height: [X]\", \"device-width: [X]\"];\n  var s = { attrs: {} }; // Simple tag, reused for a whole lot of tags\n\n  var data = {\n    a: {\n      attrs: {\n        href: null, ping: null, type: null,\n        media: media,\n        target: targets,\n        hreflang: langs\n      }\n    },\n    abbr: s,\n    acronym: s,\n    address: s,\n    applet: s,\n    area: {\n      attrs: {\n        alt: null, coords: null, href: null, target: null, ping: null,\n        media: media, hreflang: langs, type: null,\n        shape: [\"default\", \"rect\", \"circle\", \"poly\"]\n      }\n    },\n    article: s,\n    aside: s,\n    audio: {\n      attrs: {\n        src: null, mediagroup: null,\n        crossorigin: [\"anonymous\", \"use-credentials\"],\n        preload: [\"none\", \"metadata\", \"auto\"],\n        autoplay: [\"\", \"autoplay\"],\n        loop: [\"\", \"loop\"],\n        controls: [\"\", \"controls\"]\n      }\n    },\n    b: s,\n    base: { attrs: { href: null, target: targets } },\n    basefont: s,\n    bdi: s,\n    bdo: s,\n    big: s,\n    blockquote: { attrs: { cite: null } },\n    body: s,\n    br: s,\n    button: {\n      attrs: {\n        form: null, formaction: null, name: null, value: null,\n        autofocus: [\"\", \"autofocus\"],\n        disabled: [\"\", \"autofocus\"],\n        formenctype: encs,\n        formmethod: methods,\n        formnovalidate: [\"\", \"novalidate\"],\n        formtarget: targets,\n        type: [\"submit\", \"reset\", \"button\"]\n      }\n    },\n    canvas: { attrs: { width: null, height: null } },\n    caption: s,\n    center: s,\n    cite: s,\n    code: s,\n    col: { attrs: { span: null } },\n    colgroup: { attrs: { span: null } },\n    command: {\n      attrs: {\n        type: [\"command\", \"checkbox\", \"radio\"],\n        label: null, icon: null, radiogroup: null, command: null, title: null,\n        disabled: [\"\", \"disabled\"],\n        checked: [\"\", \"checked\"]\n      }\n    },\n    data: { attrs: { value: null } },\n    datagrid: { attrs: { disabled: [\"\", \"disabled\"], multiple: [\"\", \"multiple\"] } },\n    datalist: { attrs: { data: null } },\n    dd: s,\n    del: { attrs: { cite: null, datetime: null } },\n    details: { attrs: { open: [\"\", \"open\"] } },\n    dfn: s,\n    dir: s,\n    div: s,\n    dialog: { attrs: { open: null } },\n    dl: s,\n    dt: s,\n    em: s,\n    embed: { attrs: { src: null, type: null, width: null, height: null } },\n    eventsource: { attrs: { src: null } },\n    fieldset: { attrs: { disabled: [\"\", \"disabled\"], form: null, name: null } },\n    figcaption: s,\n    figure: s,\n    font: s,\n    footer: s,\n    form: {\n      attrs: {\n        action: null, name: null,\n        \"accept-charset\": charsets,\n        autocomplete: [\"on\", \"off\"],\n        enctype: encs,\n        method: methods,\n        novalidate: [\"\", \"novalidate\"],\n        target: targets\n      }\n    },\n    frame: s,\n    frameset: s,\n    h1: s, h2: s, h3: s, h4: s, h5: s, h6: s,\n    head: {\n      attrs: {},\n      children: [\"title\", \"base\", \"link\", \"style\", \"meta\", \"script\", \"noscript\", \"command\"]\n    },\n    header: s,\n    hgroup: s,\n    hr: s,\n    html: {\n      attrs: { manifest: null },\n      children: [\"head\", \"body\"]\n    },\n    i: s,\n    iframe: {\n      attrs: {\n        src: null, srcdoc: null, name: null, width: null, height: null,\n        sandbox: [\"allow-top-navigation\", \"allow-same-origin\", \"allow-forms\", \"allow-scripts\"],\n        seamless: [\"\", \"seamless\"]\n      }\n    },\n    img: {\n      attrs: {\n        alt: null, src: null, ismap: null, usemap: null, width: null, height: null,\n        crossorigin: [\"anonymous\", \"use-credentials\"]\n      }\n    },\n    input: {\n      attrs: {\n        alt: null, dirname: null, form: null, formaction: null,\n        height: null, list: null, max: null, maxlength: null, min: null,\n        name: null, pattern: null, placeholder: null, size: null, src: null,\n        step: null, value: null, width: null,\n        accept: [\"audio/*\", \"video/*\", \"image/*\"],\n        autocomplete: [\"on\", \"off\"],\n        autofocus: [\"\", \"autofocus\"],\n        checked: [\"\", \"checked\"],\n        disabled: [\"\", \"disabled\"],\n        formenctype: encs,\n        formmethod: methods,\n        formnovalidate: [\"\", \"novalidate\"],\n        formtarget: targets,\n        multiple: [\"\", \"multiple\"],\n        readonly: [\"\", \"readonly\"],\n        required: [\"\", \"required\"],\n        type: [\"hidden\", \"text\", \"search\", \"tel\", \"url\", \"email\", \"password\", \"datetime\", \"date\", \"month\",\n               \"week\", \"time\", \"datetime-local\", \"number\", \"range\", \"color\", \"checkbox\", \"radio\",\n               \"file\", \"submit\", \"image\", \"reset\", \"button\"]\n      }\n    },\n    ins: { attrs: { cite: null, datetime: null } },\n    kbd: s,\n    keygen: {\n      attrs: {\n        challenge: null, form: null, name: null,\n        autofocus: [\"\", \"autofocus\"],\n        disabled: [\"\", \"disabled\"],\n        keytype: [\"RSA\"]\n      }\n    },\n    label: { attrs: { \"for\": null, form: null } },\n    legend: s,\n    li: { attrs: { value: null } },\n    link: {\n      attrs: {\n        href: null, type: null,\n        hreflang: langs,\n        media: media,\n        sizes: [\"all\", \"16x16\", \"16x16 32x32\", \"16x16 32x32 64x64\"]\n      }\n    },\n    map: { attrs: { name: null } },\n    mark: s,\n    menu: { attrs: { label: null, type: [\"list\", \"context\", \"toolbar\"] } },\n    meta: {\n      attrs: {\n        content: null,\n        charset: charsets,\n        name: [\"viewport\", \"application-name\", \"author\", \"description\", \"generator\", \"keywords\"],\n        \"http-equiv\": [\"content-language\", \"content-type\", \"default-style\", \"refresh\"]\n      }\n    },\n    meter: { attrs: { value: null, min: null, low: null, high: null, max: null, optimum: null } },\n    nav: s,\n    noframes: s,\n    noscript: s,\n    object: {\n      attrs: {\n        data: null, type: null, name: null, usemap: null, form: null, width: null, height: null,\n        typemustmatch: [\"\", \"typemustmatch\"]\n      }\n    },\n    ol: { attrs: { reversed: [\"\", \"reversed\"], start: null, type: [\"1\", \"a\", \"A\", \"i\", \"I\"] } },\n    optgroup: { attrs: { disabled: [\"\", \"disabled\"], label: null } },\n    option: { attrs: { disabled: [\"\", \"disabled\"], label: null, selected: [\"\", \"selected\"], value: null } },\n    output: { attrs: { \"for\": null, form: null, name: null } },\n    p: s,\n    param: { attrs: { name: null, value: null } },\n    pre: s,\n    progress: { attrs: { value: null, max: null } },\n    q: { attrs: { cite: null } },\n    rp: s,\n    rt: s,\n    ruby: s,\n    s: s,\n    samp: s,\n    script: {\n      attrs: {\n        type: [\"text/javascript\"],\n        src: null,\n        async: [\"\", \"async\"],\n        defer: [\"\", \"defer\"],\n        charset: charsets\n      }\n    },\n    section: s,\n    select: {\n      attrs: {\n        form: null, name: null, size: null,\n        autofocus: [\"\", \"autofocus\"],\n        disabled: [\"\", \"disabled\"],\n        multiple: [\"\", \"multiple\"]\n      }\n    },\n    small: s,\n    source: { attrs: { src: null, type: null, media: null } },\n    span: s,\n    strike: s,\n    strong: s,\n    style: {\n      attrs: {\n        type: [\"text/css\"],\n        media: media,\n        scoped: null\n      }\n    },\n    sub: s,\n    summary: s,\n    sup: s,\n    table: s,\n    tbody: s,\n    td: { attrs: { colspan: null, rowspan: null, headers: null } },\n    textarea: {\n      attrs: {\n        dirname: null, form: null, maxlength: null, name: null, placeholder: null,\n        rows: null, cols: null,\n        autofocus: [\"\", \"autofocus\"],\n        disabled: [\"\", \"disabled\"],\n        readonly: [\"\", \"readonly\"],\n        required: [\"\", \"required\"],\n        wrap: [\"soft\", \"hard\"]\n      }\n    },\n    tfoot: s,\n    th: { attrs: { colspan: null, rowspan: null, headers: null, scope: [\"row\", \"col\", \"rowgroup\", \"colgroup\"] } },\n    thead: s,\n    time: { attrs: { datetime: null } },\n    title: s,\n    tr: s,\n    track: {\n      attrs: {\n        src: null, label: null, \"default\": null,\n        kind: [\"subtitles\", \"captions\", \"descriptions\", \"chapters\", \"metadata\"],\n        srclang: langs\n      }\n    },\n    tt: s,\n    u: s,\n    ul: s,\n    \"var\": s,\n    video: {\n      attrs: {\n        src: null, poster: null, width: null, height: null,\n        crossorigin: [\"anonymous\", \"use-credentials\"],\n        preload: [\"auto\", \"metadata\", \"none\"],\n        autoplay: [\"\", \"autoplay\"],\n        mediagroup: [\"movie\"],\n        muted: [\"\", \"muted\"],\n        controls: [\"\", \"controls\"]\n      }\n    },\n    wbr: s\n  };\n\n  var globalAttrs = {\n    accesskey: [\"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\"],\n    \"class\": null,\n    contenteditable: [\"true\", \"false\"],\n    contextmenu: null,\n    dir: [\"ltr\", \"rtl\", \"auto\"],\n    draggable: [\"true\", \"false\", \"auto\"],\n    dropzone: [\"copy\", \"move\", \"link\", \"string:\", \"file:\"],\n    hidden: [\"hidden\"],\n    id: null,\n    inert: [\"inert\"],\n    itemid: null,\n    itemprop: null,\n    itemref: null,\n    itemscope: [\"itemscope\"],\n    itemtype: null,\n    lang: [\"en\", \"es\"],\n    spellcheck: [\"true\", \"false\"],\n    autocorrect: [\"true\", \"false\"],\n    autocapitalize: [\"true\", \"false\"],\n    style: null,\n    tabindex: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"],\n    title: null,\n    translate: [\"yes\", \"no\"],\n    onclick: null,\n    rel: [\"stylesheet\", \"alternate\", \"author\", \"bookmark\", \"help\", \"license\", \"next\", \"nofollow\", \"noreferrer\", \"prefetch\", \"prev\", \"search\", \"tag\"]\n  };\n  function populate(obj) {\n    for (var attr in globalAttrs) if (globalAttrs.hasOwnProperty(attr))\n      obj.attrs[attr] = globalAttrs[attr];\n  }\n\n  populate(s);\n  for (var tag in data) if (data.hasOwnProperty(tag) && data[tag] != s)\n    populate(data[tag]);\n\n  CodeMirror.htmlSchema = data;\n  function htmlHint(cm, options) {\n    var local = {schemaInfo: data};\n    if (options) for (var opt in options) local[opt] = options[opt];\n    return CodeMirror.hint.xml(cm, local);\n  }\n  CodeMirror.registerHelper(\"hint\", \"html\", htmlHint);\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/hint/javascript-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var Pos = CodeMirror.Pos;\n\n  function forEach(arr, f) {\n    for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);\n  }\n\n  function arrayContains(arr, item) {\n    if (!Array.prototype.indexOf) {\n      var i = arr.length;\n      while (i--) {\n        if (arr[i] === item) {\n          return true;\n        }\n      }\n      return false;\n    }\n    return arr.indexOf(item) != -1;\n  }\n\n  function scriptHint(editor, keywords, getToken, options) {\n    // Find the token at the cursor\n    var cur = editor.getCursor(), token = getToken(editor, cur);\n    if (/\\b(?:string|comment)\\b/.test(token.type)) return;\n    var innerMode = CodeMirror.innerMode(editor.getMode(), token.state);\n    if (innerMode.mode.helperType === \"json\") return;\n    token.state = innerMode.state;\n\n    // If it's not a 'word-style' token, ignore the token.\n    if (!/^[\\w$_]*$/.test(token.string)) {\n      token = {start: cur.ch, end: cur.ch, string: \"\", state: token.state,\n               type: token.string == \".\" ? \"property\" : null};\n    } else if (token.end > cur.ch) {\n      token.end = cur.ch;\n      token.string = token.string.slice(0, cur.ch - token.start);\n    }\n\n    var tprop = token;\n    // If it is a property, find out what it is a property of.\n    while (tprop.type == \"property\") {\n      tprop = getToken(editor, Pos(cur.line, tprop.start));\n      if (tprop.string != \".\") return;\n      tprop = getToken(editor, Pos(cur.line, tprop.start));\n      if (!context) var context = [];\n      context.push(tprop);\n    }\n    return {list: getCompletions(token, context, keywords, options),\n            from: Pos(cur.line, token.start),\n            to: Pos(cur.line, token.end)};\n  }\n\n  function javascriptHint(editor, options) {\n    return scriptHint(editor, javascriptKeywords,\n                      function (e, cur) {return e.getTokenAt(cur);},\n                      options);\n  };\n  CodeMirror.registerHelper(\"hint\", \"javascript\", javascriptHint);\n\n  function getCoffeeScriptToken(editor, cur) {\n  // This getToken, it is for coffeescript, imitates the behavior of\n  // getTokenAt method in javascript.js, that is, returning \"property\"\n  // type and treat \".\" as independent token.\n    var token = editor.getTokenAt(cur);\n    if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {\n      token.end = token.start;\n      token.string = '.';\n      token.type = \"property\";\n    }\n    else if (/^\\.[\\w$_]*$/.test(token.string)) {\n      token.type = \"property\";\n      token.start++;\n      token.string = token.string.replace(/\\./, '');\n    }\n    return token;\n  }\n\n  function coffeescriptHint(editor, options) {\n    return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);\n  }\n  CodeMirror.registerHelper(\"hint\", \"coffeescript\", coffeescriptHint);\n\n  var stringProps = (\"charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight \" +\n                     \"toUpperCase toLowerCase split concat match replace search\").split(\" \");\n  var arrayProps = (\"length concat join splice push pop shift unshift slice reverse sort indexOf \" +\n                    \"lastIndexOf every some filter forEach map reduce reduceRight \").split(\" \");\n  var funcProps = \"prototype apply call bind\".split(\" \");\n  var javascriptKeywords = (\"break case catch class const continue debugger default delete do else export extends false finally for function \" +\n                  \"if in import instanceof new null return super switch this throw true try typeof var void while with yield\").split(\" \");\n  var coffeescriptKeywords = (\"and break catch class continue delete do else extends false finally for \" +\n                  \"if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes\").split(\" \");\n\n  function forAllProps(obj, callback) {\n    if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) {\n      for (var name in obj) callback(name)\n    } else {\n      for (var o = obj; o; o = Object.getPrototypeOf(o))\n        Object.getOwnPropertyNames(o).forEach(callback)\n    }\n  }\n\n  function getCompletions(token, context, keywords, options) {\n    var found = [], start = token.string, global = options && options.globalScope || window;\n    function maybeAdd(str) {\n      if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str);\n    }\n    function gatherCompletions(obj) {\n      if (typeof obj == \"string\") forEach(stringProps, maybeAdd);\n      else if (obj instanceof Array) forEach(arrayProps, maybeAdd);\n      else if (obj instanceof Function) forEach(funcProps, maybeAdd);\n      forAllProps(obj, maybeAdd)\n    }\n\n    if (context && context.length) {\n      // If this is a property, see if it belongs to some object we can\n      // find in the current environment.\n      var obj = context.pop(), base;\n      if (obj.type && obj.type.indexOf(\"variable\") === 0) {\n        if (options && options.additionalContext)\n          base = options.additionalContext[obj.string];\n        if (!options || options.useGlobalScope !== false)\n          base = base || global[obj.string];\n      } else if (obj.type == \"string\") {\n        base = \"\";\n      } else if (obj.type == \"atom\") {\n        base = 1;\n      } else if (obj.type == \"function\") {\n        if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&\n            (typeof global.jQuery == 'function'))\n          base = global.jQuery();\n        else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function'))\n          base = global._();\n      }\n      while (base != null && context.length)\n        base = base[context.pop().string];\n      if (base != null) gatherCompletions(base);\n    } else {\n      // If not, just look in the global object, any local scope, and optional additional-context\n      // (reading into JS mode internals to get at the local and global variables)\n      for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);\n      for (var c = token.state.context; c; c = c.prev)\n        for (var v = c.vars; v; v = v.next) maybeAdd(v.name)\n      for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);\n      if (options && options.additionalContext != null)\n        for (var key in options.additionalContext)\n          maybeAdd(key);\n      if (!options || options.useGlobalScope !== false)\n        gatherCompletions(global);\n      forEach(keywords, maybeAdd);\n    }\n    return found;\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/hint/show-hint.css",
    "content": ".CodeMirror-hints {\n  position: absolute;\n  z-index: 10;\n  overflow: hidden;\n  list-style: none;\n\n  margin: 0;\n  padding: 2px;\n\n  -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  border-radius: 3px;\n  border: 1px solid silver;\n\n  background: white;\n  font-size: 90%;\n  font-family: monospace;\n\n  max-height: 20em;\n  overflow-y: auto;\n}\n\n.CodeMirror-hint {\n  margin: 0;\n  padding: 0 4px;\n  border-radius: 2px;\n  white-space: pre;\n  color: black;\n  cursor: pointer;\n}\n\nli.CodeMirror-hint-active {\n  background: #08f;\n  color: white;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/hint/show-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// declare global: DOMRect\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var HINT_ELEMENT_CLASS        = \"CodeMirror-hint\";\n  var ACTIVE_HINT_ELEMENT_CLASS = \"CodeMirror-hint-active\";\n\n  // This is the old interface, kept around for now to stay\n  // backwards-compatible.\n  CodeMirror.showHint = function(cm, getHints, options) {\n    if (!getHints) return cm.showHint(options);\n    if (options && options.async) getHints.async = true;\n    var newOpts = {hint: getHints};\n    if (options) for (var prop in options) newOpts[prop] = options[prop];\n    return cm.showHint(newOpts);\n  };\n\n  CodeMirror.defineExtension(\"showHint\", function(options) {\n    options = parseOptions(this, this.getCursor(\"start\"), options);\n    var selections = this.listSelections()\n    if (selections.length > 1) return;\n    // By default, don't allow completion when something is selected.\n    // A hint function can have a `supportsSelection` property to\n    // indicate that it can handle selections.\n    if (this.somethingSelected()) {\n      if (!options.hint.supportsSelection) return;\n      // Don't try with cross-line selections\n      for (var i = 0; i < selections.length; i++)\n        if (selections[i].head.line != selections[i].anchor.line) return;\n    }\n\n    if (this.state.completionActive) this.state.completionActive.close();\n    var completion = this.state.completionActive = new Completion(this, options);\n    if (!completion.options.hint) return;\n\n    CodeMirror.signal(this, \"startCompletion\", this);\n    completion.update(true);\n  });\n\n  CodeMirror.defineExtension(\"closeHint\", function() {\n    if (this.state.completionActive) this.state.completionActive.close()\n  })\n\n  function Completion(cm, options) {\n    this.cm = cm;\n    this.options = options;\n    this.widget = null;\n    this.debounce = 0;\n    this.tick = 0;\n    this.startPos = this.cm.getCursor(\"start\");\n    this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length;\n\n    if (this.options.updateOnCursorActivity) {\n      var self = this;\n      cm.on(\"cursorActivity\", this.activityFunc = function() { self.cursorActivity(); });\n    }\n  }\n\n  var requestAnimationFrame = window.requestAnimationFrame || function(fn) {\n    return setTimeout(fn, 1000/60);\n  };\n  var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;\n\n  Completion.prototype = {\n    close: function() {\n      if (!this.active()) return;\n      this.cm.state.completionActive = null;\n      this.tick = null;\n      if (this.options.updateOnCursorActivity) {\n        this.cm.off(\"cursorActivity\", this.activityFunc);\n      }\n\n      if (this.widget && this.data) CodeMirror.signal(this.data, \"close\");\n      if (this.widget) this.widget.close();\n      CodeMirror.signal(this.cm, \"endCompletion\", this.cm);\n    },\n\n    active: function() {\n      return this.cm.state.completionActive == this;\n    },\n\n    pick: function(data, i) {\n      var completion = data.list[i], self = this;\n      this.cm.operation(function() {\n        if (completion.hint)\n          completion.hint(self.cm, data, completion);\n        else\n          self.cm.replaceRange(getText(completion), completion.from || data.from,\n                               completion.to || data.to, \"complete\");\n        CodeMirror.signal(data, \"pick\", completion);\n        self.cm.scrollIntoView();\n      });\n      if (this.options.closeOnPick) {\n        this.close();\n      }\n    },\n\n    cursorActivity: function() {\n      if (this.debounce) {\n        cancelAnimationFrame(this.debounce);\n        this.debounce = 0;\n      }\n\n      var identStart = this.startPos;\n      if(this.data) {\n        identStart = this.data.from;\n      }\n\n      var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line);\n      if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch ||\n          pos.ch < identStart.ch || this.cm.somethingSelected() ||\n          (!pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {\n        this.close();\n      } else {\n        var self = this;\n        this.debounce = requestAnimationFrame(function() {self.update();});\n        if (this.widget) this.widget.disable();\n      }\n    },\n\n    update: function(first) {\n      if (this.tick == null) return\n      var self = this, myTick = ++this.tick\n      fetchHints(this.options.hint, this.cm, this.options, function(data) {\n        if (self.tick == myTick) self.finishUpdate(data, first)\n      })\n    },\n\n    finishUpdate: function(data, first) {\n      if (this.data) CodeMirror.signal(this.data, \"update\");\n\n      var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle);\n      if (this.widget) this.widget.close();\n\n      this.data = data;\n\n      if (data && data.list.length) {\n        if (picked && data.list.length == 1) {\n          this.pick(data, 0);\n        } else {\n          this.widget = new Widget(this, data);\n          CodeMirror.signal(data, \"shown\");\n        }\n      }\n    }\n  };\n\n  function parseOptions(cm, pos, options) {\n    var editor = cm.options.hintOptions;\n    var out = {};\n    for (var prop in defaultOptions) out[prop] = defaultOptions[prop];\n    if (editor) for (var prop in editor)\n      if (editor[prop] !== undefined) out[prop] = editor[prop];\n    if (options) for (var prop in options)\n      if (options[prop] !== undefined) out[prop] = options[prop];\n    if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos)\n    return out;\n  }\n\n  function getText(completion) {\n    if (typeof completion == \"string\") return completion;\n    else return completion.text;\n  }\n\n  function buildKeyMap(completion, handle) {\n    var baseMap = {\n      Up: function() {handle.moveFocus(-1);},\n      Down: function() {handle.moveFocus(1);},\n      PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);},\n      PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);},\n      Home: function() {handle.setFocus(0);},\n      End: function() {handle.setFocus(handle.length - 1);},\n      Enter: handle.pick,\n      Tab: handle.pick,\n      Esc: handle.close\n    };\n\n    var mac = /Mac/.test(navigator.platform);\n\n    if (mac) {\n      baseMap[\"Ctrl-P\"] = function() {handle.moveFocus(-1);};\n      baseMap[\"Ctrl-N\"] = function() {handle.moveFocus(1);};\n    }\n\n    var custom = completion.options.customKeys;\n    var ourMap = custom ? {} : baseMap;\n    function addBinding(key, val) {\n      var bound;\n      if (typeof val != \"string\")\n        bound = function(cm) { return val(cm, handle); };\n      // This mechanism is deprecated\n      else if (baseMap.hasOwnProperty(val))\n        bound = baseMap[val];\n      else\n        bound = val;\n      ourMap[key] = bound;\n    }\n    if (custom)\n      for (var key in custom) if (custom.hasOwnProperty(key))\n        addBinding(key, custom[key]);\n    var extra = completion.options.extraKeys;\n    if (extra)\n      for (var key in extra) if (extra.hasOwnProperty(key))\n        addBinding(key, extra[key]);\n    return ourMap;\n  }\n\n  function getHintElement(hintsElement, el) {\n    while (el && el != hintsElement) {\n      if (el.nodeName.toUpperCase() === \"LI\" && el.parentNode == hintsElement) return el;\n      el = el.parentNode;\n    }\n  }\n\n  function Widget(completion, data) {\n    this.id = \"cm-complete-\" + Math.floor(Math.random(1e6))\n    this.completion = completion;\n    this.data = data;\n    this.picked = false;\n    var widget = this, cm = completion.cm;\n    var ownerDocument = cm.getInputField().ownerDocument;\n    var parentWindow = ownerDocument.defaultView || ownerDocument.parentWindow;\n\n    var hints = this.hints = ownerDocument.createElement(\"ul\");\n    hints.setAttribute(\"role\", \"listbox\")\n    hints.setAttribute(\"aria-expanded\", \"true\")\n    hints.id = this.id\n    var theme = completion.cm.options.theme;\n    hints.className = \"CodeMirror-hints \" + theme;\n    this.selectedHint = data.selectedHint || 0;\n\n    var completions = data.list;\n    for (var i = 0; i < completions.length; ++i) {\n      var elt = hints.appendChild(ownerDocument.createElement(\"li\")), cur = completions[i];\n      var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? \"\" : \" \" + ACTIVE_HINT_ELEMENT_CLASS);\n      if (cur.className != null) className = cur.className + \" \" + className;\n      elt.className = className;\n      if (i == this.selectedHint) elt.setAttribute(\"aria-selected\", \"true\")\n      elt.id = this.id + \"-\" + i\n      elt.setAttribute(\"role\", \"option\")\n      if (cur.render) cur.render(elt, data, cur);\n      else elt.appendChild(ownerDocument.createTextNode(cur.displayText || getText(cur)));\n      elt.hintId = i;\n    }\n\n    var container = completion.options.container || ownerDocument.body;\n    var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null);\n    var left = pos.left, top = pos.bottom, below = true;\n    var offsetLeft = 0, offsetTop = 0;\n    if (container !== ownerDocument.body) {\n      // We offset the cursor position because left and top are relative to the offsetParent's top left corner.\n      var isContainerPositioned = ['absolute', 'relative', 'fixed'].indexOf(parentWindow.getComputedStyle(container).position) !== -1;\n      var offsetParent = isContainerPositioned ? container : container.offsetParent;\n      var offsetParentPosition = offsetParent.getBoundingClientRect();\n      var bodyPosition = ownerDocument.body.getBoundingClientRect();\n      offsetLeft = (offsetParentPosition.left - bodyPosition.left - offsetParent.scrollLeft);\n      offsetTop = (offsetParentPosition.top - bodyPosition.top - offsetParent.scrollTop);\n    }\n    hints.style.left = (left - offsetLeft) + \"px\";\n    hints.style.top = (top - offsetTop) + \"px\";\n\n    // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.\n    var winW = parentWindow.innerWidth || Math.max(ownerDocument.body.offsetWidth, ownerDocument.documentElement.offsetWidth);\n    var winH = parentWindow.innerHeight || Math.max(ownerDocument.body.offsetHeight, ownerDocument.documentElement.offsetHeight);\n    container.appendChild(hints);\n    cm.getInputField().setAttribute(\"aria-autocomplete\", \"list\")\n    cm.getInputField().setAttribute(\"aria-owns\", this.id)\n    cm.getInputField().setAttribute(\"aria-activedescendant\", this.id + \"-\" + this.selectedHint)\n\n    var box = completion.options.moveOnOverlap ? hints.getBoundingClientRect() : new DOMRect();\n    var scrolls = completion.options.paddingForScrollbar ? hints.scrollHeight > hints.clientHeight + 1 : false;\n\n    // Compute in the timeout to avoid reflow on init\n    var startScroll;\n    setTimeout(function() { startScroll = cm.getScrollInfo(); });\n\n    var overlapY = box.bottom - winH;\n    if (overlapY > 0) {\n      var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top);\n      if (curTop - height > 0) { // Fits above cursor\n        hints.style.top = (top = pos.top - height - offsetTop) + \"px\";\n        below = false;\n      } else if (height > winH) {\n        hints.style.height = (winH - 5) + \"px\";\n        hints.style.top = (top = pos.bottom - box.top - offsetTop) + \"px\";\n        var cursor = cm.getCursor();\n        if (data.from.ch != cursor.ch) {\n          pos = cm.cursorCoords(cursor);\n          hints.style.left = (left = pos.left - offsetLeft) + \"px\";\n          box = hints.getBoundingClientRect();\n        }\n      }\n    }\n    var overlapX = box.right - winW;\n    if (scrolls) overlapX += cm.display.nativeBarWidth;\n    if (overlapX > 0) {\n      if (box.right - box.left > winW) {\n        hints.style.width = (winW - 5) + \"px\";\n        overlapX -= (box.right - box.left) - winW;\n      }\n      hints.style.left = (left = pos.left - overlapX - offsetLeft) + \"px\";\n    }\n    if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling)\n      node.style.paddingRight = cm.display.nativeBarWidth + \"px\"\n\n    cm.addKeyMap(this.keyMap = buildKeyMap(completion, {\n      moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); },\n      setFocus: function(n) { widget.changeActive(n); },\n      menuSize: function() { return widget.screenAmount(); },\n      length: completions.length,\n      close: function() { completion.close(); },\n      pick: function() { widget.pick(); },\n      data: data\n    }));\n\n    if (completion.options.closeOnUnfocus) {\n      var closingOnBlur;\n      cm.on(\"blur\", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); });\n      cm.on(\"focus\", this.onFocus = function() { clearTimeout(closingOnBlur); });\n    }\n\n    cm.on(\"scroll\", this.onScroll = function() {\n      var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect();\n      if (!startScroll) startScroll = cm.getScrollInfo();\n      var newTop = top + startScroll.top - curScroll.top;\n      var point = newTop - (parentWindow.pageYOffset || (ownerDocument.documentElement || ownerDocument.body).scrollTop);\n      if (!below) point += hints.offsetHeight;\n      if (point <= editor.top || point >= editor.bottom) return completion.close();\n      hints.style.top = newTop + \"px\";\n      hints.style.left = (left + startScroll.left - curScroll.left) + \"px\";\n    });\n\n    CodeMirror.on(hints, \"dblclick\", function(e) {\n      var t = getHintElement(hints, e.target || e.srcElement);\n      if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();}\n    });\n\n    CodeMirror.on(hints, \"click\", function(e) {\n      var t = getHintElement(hints, e.target || e.srcElement);\n      if (t && t.hintId != null) {\n        widget.changeActive(t.hintId);\n        if (completion.options.completeOnSingleClick) widget.pick();\n      }\n    });\n\n    CodeMirror.on(hints, \"mousedown\", function() {\n      setTimeout(function(){cm.focus();}, 20);\n    });\n\n    // The first hint doesn't need to be scrolled to on init\n    var selectedHintRange = this.getSelectedHintRange();\n    if (selectedHintRange.from !== 0 || selectedHintRange.to !== 0) {\n      this.scrollToActive();\n    }\n\n    CodeMirror.signal(data, \"select\", completions[this.selectedHint], hints.childNodes[this.selectedHint]);\n    return true;\n  }\n\n  Widget.prototype = {\n    close: function() {\n      if (this.completion.widget != this) return;\n      this.completion.widget = null;\n      if (this.hints.parentNode) this.hints.parentNode.removeChild(this.hints);\n      this.completion.cm.removeKeyMap(this.keyMap);\n      var input = this.completion.cm.getInputField()\n      input.removeAttribute(\"aria-activedescendant\")\n      input.removeAttribute(\"aria-owns\")\n\n      var cm = this.completion.cm;\n      if (this.completion.options.closeOnUnfocus) {\n        cm.off(\"blur\", this.onBlur);\n        cm.off(\"focus\", this.onFocus);\n      }\n      cm.off(\"scroll\", this.onScroll);\n    },\n\n    disable: function() {\n      this.completion.cm.removeKeyMap(this.keyMap);\n      var widget = this;\n      this.keyMap = {Enter: function() { widget.picked = true; }};\n      this.completion.cm.addKeyMap(this.keyMap);\n    },\n\n    pick: function() {\n      this.completion.pick(this.data, this.selectedHint);\n    },\n\n    changeActive: function(i, avoidWrap) {\n      if (i >= this.data.list.length)\n        i = avoidWrap ? this.data.list.length - 1 : 0;\n      else if (i < 0)\n        i = avoidWrap ? 0  : this.data.list.length - 1;\n      if (this.selectedHint == i) return;\n      var node = this.hints.childNodes[this.selectedHint];\n      if (node) {\n        node.className = node.className.replace(\" \" + ACTIVE_HINT_ELEMENT_CLASS, \"\");\n        node.removeAttribute(\"aria-selected\")\n      }\n      node = this.hints.childNodes[this.selectedHint = i];\n      node.className += \" \" + ACTIVE_HINT_ELEMENT_CLASS;\n      node.setAttribute(\"aria-selected\", \"true\")\n      this.completion.cm.getInputField().setAttribute(\"aria-activedescendant\", node.id)\n      this.scrollToActive()\n      CodeMirror.signal(this.data, \"select\", this.data.list[this.selectedHint], node);\n    },\n\n    scrollToActive: function() {\n      var selectedHintRange = this.getSelectedHintRange();\n      var node1 = this.hints.childNodes[selectedHintRange.from];\n      var node2 = this.hints.childNodes[selectedHintRange.to];\n      var firstNode = this.hints.firstChild;\n      if (node1.offsetTop < this.hints.scrollTop)\n        this.hints.scrollTop = node1.offsetTop - firstNode.offsetTop;\n      else if (node2.offsetTop + node2.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)\n        this.hints.scrollTop = node2.offsetTop + node2.offsetHeight - this.hints.clientHeight + firstNode.offsetTop;\n    },\n\n    screenAmount: function() {\n      return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1;\n    },\n\n    getSelectedHintRange: function() {\n      var margin = this.completion.options.scrollMargin || 0;\n      return {\n        from: Math.max(0, this.selectedHint - margin),\n        to: Math.min(this.data.list.length - 1, this.selectedHint + margin),\n      };\n    }\n  };\n\n  function applicableHelpers(cm, helpers) {\n    if (!cm.somethingSelected()) return helpers\n    var result = []\n    for (var i = 0; i < helpers.length; i++)\n      if (helpers[i].supportsSelection) result.push(helpers[i])\n    return result\n  }\n\n  function fetchHints(hint, cm, options, callback) {\n    if (hint.async) {\n      hint(cm, callback, options)\n    } else {\n      var result = hint(cm, options)\n      if (result && result.then) result.then(callback)\n      else callback(result)\n    }\n  }\n\n  function resolveAutoHints(cm, pos) {\n    var helpers = cm.getHelpers(pos, \"hint\"), words\n    if (helpers.length) {\n      var resolved = function(cm, callback, options) {\n        var app = applicableHelpers(cm, helpers);\n        function run(i) {\n          if (i == app.length) return callback(null)\n          fetchHints(app[i], cm, options, function(result) {\n            if (result && result.list.length > 0) callback(result)\n            else run(i + 1)\n          })\n        }\n        run(0)\n      }\n      resolved.async = true\n      resolved.supportsSelection = true\n      return resolved\n    } else if (words = cm.getHelper(cm.getCursor(), \"hintWords\")) {\n      return function(cm) { return CodeMirror.hint.fromList(cm, {words: words}) }\n    } else if (CodeMirror.hint.anyword) {\n      return function(cm, options) { return CodeMirror.hint.anyword(cm, options) }\n    } else {\n      return function() {}\n    }\n  }\n\n  CodeMirror.registerHelper(\"hint\", \"auto\", {\n    resolve: resolveAutoHints\n  });\n\n  CodeMirror.registerHelper(\"hint\", \"fromList\", function(cm, options) {\n    var cur = cm.getCursor(), token = cm.getTokenAt(cur)\n    var term, from = CodeMirror.Pos(cur.line, token.start), to = cur\n    if (token.start < cur.ch && /\\w/.test(token.string.charAt(cur.ch - token.start - 1))) {\n      term = token.string.substr(0, cur.ch - token.start)\n    } else {\n      term = \"\"\n      from = cur\n    }\n    var found = [];\n    for (var i = 0; i < options.words.length; i++) {\n      var word = options.words[i];\n      if (word.slice(0, term.length) == term)\n        found.push(word);\n    }\n\n    if (found.length) return {list: found, from: from, to: to};\n  });\n\n  CodeMirror.commands.autocomplete = CodeMirror.showHint;\n\n  var defaultOptions = {\n    hint: CodeMirror.hint.auto,\n    completeSingle: true,\n    alignWithWord: true,\n    closeCharacters: /[\\s()\\[\\]{};:>,]/,\n    closeOnPick: true,\n    closeOnUnfocus: true,\n    updateOnCursorActivity: true,\n    completeOnSingleClick: true,\n    container: null,\n    customKeys: null,\n    extraKeys: null,\n    paddingForScrollbar: true,\n    moveOnOverlap: true,\n  };\n\n  CodeMirror.defineOption(\"hintOptions\", null);\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/hint/sql-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../mode/sql/sql\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../mode/sql/sql\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var tables;\n  var defaultTable;\n  var keywords;\n  var identifierQuote;\n  var CONS = {\n    QUERY_DIV: \";\",\n    ALIAS_KEYWORD: \"AS\"\n  };\n  var Pos = CodeMirror.Pos, cmpPos = CodeMirror.cmpPos;\n\n  function isArray(val) { return Object.prototype.toString.call(val) == \"[object Array]\" }\n\n  function getKeywords(editor) {\n    var mode = editor.doc.modeOption;\n    if (mode === \"sql\") mode = \"text/x-sql\";\n    return CodeMirror.resolveMode(mode).keywords;\n  }\n\n  function getIdentifierQuote(editor) {\n    var mode = editor.doc.modeOption;\n    if (mode === \"sql\") mode = \"text/x-sql\";\n    return CodeMirror.resolveMode(mode).identifierQuote || \"`\";\n  }\n\n  function getText(item) {\n    return typeof item == \"string\" ? item : item.text;\n  }\n\n  function wrapTable(name, value) {\n    if (isArray(value)) value = {columns: value}\n    if (!value.text) value.text = name\n    return value\n  }\n\n  function parseTables(input) {\n    var result = {}\n    if (isArray(input)) {\n      for (var i = input.length - 1; i >= 0; i--) {\n        var item = input[i]\n        result[getText(item).toUpperCase()] = wrapTable(getText(item), item)\n      }\n    } else if (input) {\n      for (var name in input)\n        result[name.toUpperCase()] = wrapTable(name, input[name])\n    }\n    return result\n  }\n\n  function getTable(name) {\n    return tables[name.toUpperCase()]\n  }\n\n  function shallowClone(object) {\n    var result = {};\n    for (var key in object) if (object.hasOwnProperty(key))\n      result[key] = object[key];\n    return result;\n  }\n\n  function match(string, word) {\n    var len = string.length;\n    var sub = getText(word).substr(0, len);\n    return string.toUpperCase() === sub.toUpperCase();\n  }\n\n  function addMatches(result, search, wordlist, formatter) {\n    if (isArray(wordlist)) {\n      for (var i = 0; i < wordlist.length; i++)\n        if (match(search, wordlist[i])) result.push(formatter(wordlist[i]))\n    } else {\n      for (var word in wordlist) if (wordlist.hasOwnProperty(word)) {\n        var val = wordlist[word]\n        if (!val || val === true)\n          val = word\n        else\n          val = val.displayText ? {text: val.text, displayText: val.displayText} : val.text\n        if (match(search, val)) result.push(formatter(val))\n      }\n    }\n  }\n\n  function cleanName(name) {\n    // Get rid name from identifierQuote and preceding dot(.)\n    if (name.charAt(0) == \".\") {\n      name = name.substr(1);\n    }\n    // replace duplicated identifierQuotes with single identifierQuotes\n    // and remove single identifierQuotes\n    var nameParts = name.split(identifierQuote+identifierQuote);\n    for (var i = 0; i < nameParts.length; i++)\n      nameParts[i] = nameParts[i].replace(new RegExp(identifierQuote,\"g\"), \"\");\n    return nameParts.join(identifierQuote);\n  }\n\n  function insertIdentifierQuotes(name) {\n    var nameParts = getText(name).split(\".\");\n    for (var i = 0; i < nameParts.length; i++)\n      nameParts[i] = identifierQuote +\n        // duplicate identifierQuotes\n        nameParts[i].replace(new RegExp(identifierQuote,\"g\"), identifierQuote+identifierQuote) +\n        identifierQuote;\n    var escaped = nameParts.join(\".\");\n    if (typeof name == \"string\") return escaped;\n    name = shallowClone(name);\n    name.text = escaped;\n    return name;\n  }\n\n  function nameCompletion(cur, token, result, editor) {\n    // Try to complete table, column names and return start position of completion\n    var useIdentifierQuotes = false;\n    var nameParts = [];\n    var start = token.start;\n    var cont = true;\n    while (cont) {\n      cont = (token.string.charAt(0) == \".\");\n      useIdentifierQuotes = useIdentifierQuotes || (token.string.charAt(0) == identifierQuote);\n\n      start = token.start;\n      nameParts.unshift(cleanName(token.string));\n\n      token = editor.getTokenAt(Pos(cur.line, token.start));\n      if (token.string == \".\") {\n        cont = true;\n        token = editor.getTokenAt(Pos(cur.line, token.start));\n      }\n    }\n\n    // Try to complete table names\n    var string = nameParts.join(\".\");\n    addMatches(result, string, tables, function(w) {\n      return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;\n    });\n\n    // Try to complete columns from defaultTable\n    addMatches(result, string, defaultTable, function(w) {\n      return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;\n    });\n\n    // Try to complete columns\n    string = nameParts.pop();\n    var table = nameParts.join(\".\");\n\n    var alias = false;\n    var aliasTable = table;\n    // Check if table is available. If not, find table by Alias\n    if (!getTable(table)) {\n      var oldTable = table;\n      table = findTableByAlias(table, editor);\n      if (table !== oldTable) alias = true;\n    }\n\n    var columns = getTable(table);\n    if (columns && columns.columns)\n      columns = columns.columns;\n\n    if (columns) {\n      addMatches(result, string, columns, function(w) {\n        var tableInsert = table;\n        if (alias == true) tableInsert = aliasTable;\n        if (typeof w == \"string\") {\n          w = tableInsert + \".\" + w;\n        } else {\n          w = shallowClone(w);\n          w.text = tableInsert + \".\" + w.text;\n        }\n        return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;\n      });\n    }\n\n    return start;\n  }\n\n  function eachWord(lineText, f) {\n    var words = lineText.split(/\\s+/)\n    for (var i = 0; i < words.length; i++)\n      if (words[i]) f(words[i].replace(/[`,;]/g, ''))\n  }\n\n  function findTableByAlias(alias, editor) {\n    var doc = editor.doc;\n    var fullQuery = doc.getValue();\n    var aliasUpperCase = alias.toUpperCase();\n    var previousWord = \"\";\n    var table = \"\";\n    var separator = [];\n    var validRange = {\n      start: Pos(0, 0),\n      end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length)\n    };\n\n    //add separator\n    var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV);\n    while(indexOfSeparator != -1) {\n      separator.push(doc.posFromIndex(indexOfSeparator));\n      indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1);\n    }\n    separator.unshift(Pos(0, 0));\n    separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length));\n\n    //find valid range\n    var prevItem = null;\n    var current = editor.getCursor()\n    for (var i = 0; i < separator.length; i++) {\n      if ((prevItem == null || cmpPos(current, prevItem) > 0) && cmpPos(current, separator[i]) <= 0) {\n        validRange = {start: prevItem, end: separator[i]};\n        break;\n      }\n      prevItem = separator[i];\n    }\n\n    if (validRange.start) {\n      var query = doc.getRange(validRange.start, validRange.end, false);\n\n      for (var i = 0; i < query.length; i++) {\n        var lineText = query[i];\n        eachWord(lineText, function(word) {\n          var wordUpperCase = word.toUpperCase();\n          if (wordUpperCase === aliasUpperCase && getTable(previousWord))\n            table = previousWord;\n          if (wordUpperCase !== CONS.ALIAS_KEYWORD)\n            previousWord = word;\n        });\n        if (table) break;\n      }\n    }\n    return table;\n  }\n\n  CodeMirror.registerHelper(\"hint\", \"sql\", function(editor, options) {\n    tables = parseTables(options && options.tables)\n    var defaultTableName = options && options.defaultTable;\n    var disableKeywords = options && options.disableKeywords;\n    defaultTable = defaultTableName && getTable(defaultTableName);\n    keywords = getKeywords(editor);\n    identifierQuote = getIdentifierQuote(editor);\n\n    if (defaultTableName && !defaultTable)\n      defaultTable = findTableByAlias(defaultTableName, editor);\n\n    defaultTable = defaultTable || [];\n\n    if (defaultTable.columns)\n      defaultTable = defaultTable.columns;\n\n    var cur = editor.getCursor();\n    var result = [];\n    var token = editor.getTokenAt(cur), start, end, search;\n    if (token.end > cur.ch) {\n      token.end = cur.ch;\n      token.string = token.string.slice(0, cur.ch - token.start);\n    }\n\n    if (token.string.match(/^[.`\"'\\w@][\\w$#]*$/g)) {\n      search = token.string;\n      start = token.start;\n      end = token.end;\n    } else {\n      start = end = cur.ch;\n      search = \"\";\n    }\n    if (search.charAt(0) == \".\" || search.charAt(0) == identifierQuote) {\n      start = nameCompletion(cur, token, result, editor);\n    } else {\n      var objectOrClass = function(w, className) {\n        if (typeof w === \"object\") {\n          w.className = className;\n        } else {\n          w = { text: w, className: className };\n        }\n        return w;\n      };\n    addMatches(result, search, defaultTable, function(w) {\n        return objectOrClass(w, \"CodeMirror-hint-table CodeMirror-hint-default-table\");\n    });\n    addMatches(\n        result,\n        search,\n        tables, function(w) {\n          return objectOrClass(w, \"CodeMirror-hint-table\");\n        }\n    );\n    if (!disableKeywords)\n      addMatches(result, search, keywords, function(w) {\n          return objectOrClass(w.toUpperCase(), \"CodeMirror-hint-keyword\");\n      });\n  }\n\n    return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)};\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/hint/xml-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var Pos = CodeMirror.Pos;\n\n  function matches(hint, typed, matchInMiddle) {\n    if (matchInMiddle) return hint.indexOf(typed) >= 0;\n    else return hint.lastIndexOf(typed, 0) == 0;\n  }\n\n  function getHints(cm, options) {\n    var tags = options && options.schemaInfo;\n    var quote = (options && options.quoteChar) || '\"';\n    var matchInMiddle = options && options.matchInMiddle;\n    if (!tags) return;\n    var cur = cm.getCursor(), token = cm.getTokenAt(cur);\n    if (token.end > cur.ch) {\n      token.end = cur.ch;\n      token.string = token.string.slice(0, cur.ch - token.start);\n    }\n    var inner = CodeMirror.innerMode(cm.getMode(), token.state);\n    if (!inner.mode.xmlCurrentTag) return\n    var result = [], replaceToken = false, prefix;\n    var tag = /\\btag\\b/.test(token.type) && !/>$/.test(token.string);\n    var tagName = tag && /^\\w/.test(token.string), tagStart;\n\n    if (tagName) {\n      var before = cm.getLine(cur.line).slice(Math.max(0, token.start - 2), token.start);\n      var tagType = /<\\/$/.test(before) ? \"close\" : /<$/.test(before) ? \"open\" : null;\n      if (tagType) tagStart = token.start - (tagType == \"close\" ? 2 : 1);\n    } else if (tag && token.string == \"<\") {\n      tagType = \"open\";\n    } else if (tag && token.string == \"</\") {\n      tagType = \"close\";\n    }\n\n    var tagInfo = inner.mode.xmlCurrentTag(inner.state)\n    if (!tag && !tagInfo || tagType) {\n      if (tagName)\n        prefix = token.string;\n      replaceToken = tagType;\n      var context = inner.mode.xmlCurrentContext ? inner.mode.xmlCurrentContext(inner.state) : []\n      var inner = context.length && context[context.length - 1]\n      var curTag = inner && tags[inner]\n      var childList = inner ? curTag && curTag.children : tags[\"!top\"];\n      if (childList && tagType != \"close\") {\n        for (var i = 0; i < childList.length; ++i) if (!prefix || matches(childList[i], prefix, matchInMiddle))\n          result.push(\"<\" + childList[i]);\n      } else if (tagType != \"close\") {\n        for (var name in tags)\n          if (tags.hasOwnProperty(name) && name != \"!top\" && name != \"!attrs\" && (!prefix || matches(name, prefix, matchInMiddle)))\n            result.push(\"<\" + name);\n      }\n      if (inner && (!prefix || tagType == \"close\" && matches(inner, prefix, matchInMiddle)))\n        result.push(\"</\" + inner + \">\");\n    } else {\n      // Attribute completion\n      var curTag = tagInfo && tags[tagInfo.name], attrs = curTag && curTag.attrs;\n      var globalAttrs = tags[\"!attrs\"];\n      if (!attrs && !globalAttrs) return;\n      if (!attrs) {\n        attrs = globalAttrs;\n      } else if (globalAttrs) { // Combine tag-local and global attributes\n        var set = {};\n        for (var nm in globalAttrs) if (globalAttrs.hasOwnProperty(nm)) set[nm] = globalAttrs[nm];\n        for (var nm in attrs) if (attrs.hasOwnProperty(nm)) set[nm] = attrs[nm];\n        attrs = set;\n      }\n      if (token.type == \"string\" || token.string == \"=\") { // A value\n        var before = cm.getRange(Pos(cur.line, Math.max(0, cur.ch - 60)),\n                                 Pos(cur.line, token.type == \"string\" ? token.start : token.end));\n        var atName = before.match(/([^\\s\\u00a0=<>\\\"\\']+)=$/), atValues;\n        if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return;\n        if (typeof atValues == 'function') atValues = atValues.call(this, cm); // Functions can be used to supply values for autocomplete widget\n        if (token.type == \"string\") {\n          prefix = token.string;\n          var n = 0;\n          if (/['\"]/.test(token.string.charAt(0))) {\n            quote = token.string.charAt(0);\n            prefix = token.string.slice(1);\n            n++;\n          }\n          var len = token.string.length;\n          if (/['\"]/.test(token.string.charAt(len - 1))) {\n            quote = token.string.charAt(len - 1);\n            prefix = token.string.substr(n, len - 2);\n          }\n          if (n) { // an opening quote\n            var line = cm.getLine(cur.line);\n            if (line.length > token.end && line.charAt(token.end) == quote) token.end++; // include a closing quote\n          }\n          replaceToken = true;\n        }\n        var returnHintsFromAtValues = function(atValues) {\n          if (atValues)\n            for (var i = 0; i < atValues.length; ++i) if (!prefix || matches(atValues[i], prefix, matchInMiddle))\n              result.push(quote + atValues[i] + quote);\n          return returnHints();\n        };\n        if (atValues && atValues.then) return atValues.then(returnHintsFromAtValues);\n        return returnHintsFromAtValues(atValues);\n      } else { // An attribute name\n        if (token.type == \"attribute\") {\n          prefix = token.string;\n          replaceToken = true;\n        }\n        for (var attr in attrs) if (attrs.hasOwnProperty(attr) && (!prefix || matches(attr, prefix, matchInMiddle)))\n          result.push(attr);\n      }\n    }\n    function returnHints() {\n      return {\n        list: result,\n        from: replaceToken ? Pos(cur.line, tagStart == null ? token.start : tagStart) : cur,\n        to: replaceToken ? Pos(cur.line, token.end) : cur\n      };\n    }\n    return returnHints();\n  }\n\n  CodeMirror.registerHelper(\"hint\", \"xml\", getHints);\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/lint/coffeescript-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js\n\n// declare global: coffeelint\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"lint\", \"coffeescript\", function(text) {\n  var found = [];\n  if (!window.coffeelint) {\n    if (window.console) {\n      window.console.error(\"Error: window.coffeelint not defined, CodeMirror CoffeeScript linting cannot run.\");\n    }\n    return found;\n  }\n  var parseError = function(err) {\n    var loc = err.lineNumber;\n    found.push({from: CodeMirror.Pos(loc-1, 0),\n                to: CodeMirror.Pos(loc, 0),\n                severity: err.level,\n                message: err.message});\n  };\n  try {\n    var res = coffeelint.lint(text);\n    for(var i = 0; i < res.length; i++) {\n      parseError(res[i]);\n    }\n  } catch(e) {\n    found.push({from: CodeMirror.Pos(e.location.first_line, 0),\n                to: CodeMirror.Pos(e.location.last_line, e.location.last_column),\n                severity: 'error',\n                message: e.message});\n  }\n  return found;\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/lint/css-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Depends on csslint.js from https://github.com/stubbornella/csslint\n\n// declare global: CSSLint\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"lint\", \"css\", function(text, options) {\n  var found = [];\n  if (!window.CSSLint) {\n    if (window.console) {\n        window.console.error(\"Error: window.CSSLint not defined, CodeMirror CSS linting cannot run.\");\n    }\n    return found;\n  }\n  var results = CSSLint.verify(text, options), messages = results.messages, message = null;\n  for ( var i = 0; i < messages.length; i++) {\n    message = messages[i];\n    var startLine = message.line -1, endLine = message.line -1, startCol = message.col -1, endCol = message.col;\n    found.push({\n      from: CodeMirror.Pos(startLine, startCol),\n      to: CodeMirror.Pos(endLine, endCol),\n      message: message.message,\n      severity : message.type\n    });\n  }\n  return found;\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/lint/html-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Depends on htmlhint.js from http://htmlhint.com/js/htmlhint.js\n\n// declare global: HTMLHint\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"htmlhint\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"htmlhint\"], mod);\n  else // Plain browser env\n    mod(CodeMirror, window.HTMLHint);\n})(function(CodeMirror, HTMLHint) {\n  \"use strict\";\n\n  var defaultRules = {\n    \"tagname-lowercase\": true,\n    \"attr-lowercase\": true,\n    \"attr-value-double-quotes\": true,\n    \"doctype-first\": false,\n    \"tag-pair\": true,\n    \"spec-char-escape\": true,\n    \"id-unique\": true,\n    \"src-not-empty\": true,\n    \"attr-no-duplication\": true\n  };\n\n  CodeMirror.registerHelper(\"lint\", \"html\", function(text, options) {\n    var found = [];\n    if (HTMLHint && !HTMLHint.verify) {\n      if(typeof HTMLHint.default !== 'undefined') {\n        HTMLHint = HTMLHint.default;\n      } else {\n        HTMLHint = HTMLHint.HTMLHint;\n      }\n    }\n    if (!HTMLHint) HTMLHint = window.HTMLHint;\n    if (!HTMLHint) {\n      if (window.console) {\n          window.console.error(\"Error: HTMLHint not found, not defined on window, or not available through define/require, CodeMirror HTML linting cannot run.\");\n      }\n      return found;\n    }\n    var messages = HTMLHint.verify(text, options && options.rules || defaultRules);\n    for (var i = 0; i < messages.length; i++) {\n      var message = messages[i];\n      var startLine = message.line - 1, endLine = message.line - 1, startCol = message.col - 1, endCol = message.col;\n      found.push({\n        from: CodeMirror.Pos(startLine, startCol),\n        to: CodeMirror.Pos(endLine, endCol),\n        message: message.message,\n        severity : message.type\n      });\n    }\n    return found;\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/lint/javascript-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Depends on jshint.js from https://github.com/jshint/jshint\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  // declare global: JSHINT\n\n  function validator(text, options) {\n    if (!window.JSHINT) {\n      if (window.console) {\n        window.console.error(\"Error: window.JSHINT not defined, CodeMirror JavaScript linting cannot run.\");\n      }\n      return [];\n    }\n    if (!options.indent) // JSHint error.character actually is a column index, this fixes underlining on lines using tabs for indentation\n      options.indent = 1; // JSHint default value is 4\n    JSHINT(text, options, options.globals);\n    var errors = JSHINT.data().errors, result = [];\n    if (errors) parseErrors(errors, result);\n    return result;\n  }\n\n  CodeMirror.registerHelper(\"lint\", \"javascript\", validator);\n\n  function parseErrors(errors, output) {\n    for ( var i = 0; i < errors.length; i++) {\n      var error = errors[i];\n      if (error) {\n        if (error.line <= 0) {\n          if (window.console) {\n            window.console.warn(\"Cannot display JSHint error (invalid line \" + error.line + \")\", error);\n          }\n          continue;\n        }\n\n        var start = error.character - 1, end = start + 1;\n        if (error.evidence) {\n          var index = error.evidence.substring(start).search(/.\\b/);\n          if (index > -1) {\n            end += index;\n          }\n        }\n\n        // Convert to format expected by validation service\n        var hint = {\n          message: error.reason,\n          severity: error.code ? (error.code.startsWith('W') ? \"warning\" : \"error\") : \"error\",\n          from: CodeMirror.Pos(error.line - 1, start),\n          to: CodeMirror.Pos(error.line - 1, end)\n        };\n\n        output.push(hint);\n      }\n    }\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/lint/json-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Depends on jsonlint.js from https://github.com/zaach/jsonlint\n\n// declare global: jsonlint\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"lint\", \"json\", function(text) {\n  var found = [];\n  if (!window.jsonlint) {\n    if (window.console) {\n      window.console.error(\"Error: window.jsonlint not defined, CodeMirror JSON linting cannot run.\");\n    }\n    return found;\n  }\n  // for jsonlint's web dist jsonlint is exported as an object with a single property parser, of which parseError\n  // is a subproperty\n  var jsonlint = window.jsonlint.parser || window.jsonlint\n  jsonlint.parseError = function(str, hash) {\n    var loc = hash.loc;\n    found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column),\n                to: CodeMirror.Pos(loc.last_line - 1, loc.last_column),\n                message: str});\n  };\n  try { jsonlint.parse(text); }\n  catch(e) {}\n  return found;\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/lint/lint.css",
    "content": "/* The lint marker gutter */\n.CodeMirror-lint-markers {\n  width: 16px;\n}\n\n.CodeMirror-lint-tooltip {\n  background-color: #ffd;\n  border: 1px solid black;\n  border-radius: 4px 4px 4px 4px;\n  color: black;\n  font-family: monospace;\n  font-size: 10pt;\n  overflow: hidden;\n  padding: 2px 5px;\n  position: fixed;\n  white-space: pre;\n  white-space: pre-wrap;\n  z-index: 100;\n  max-width: 600px;\n  opacity: 0;\n  transition: opacity .4s;\n  -moz-transition: opacity .4s;\n  -webkit-transition: opacity .4s;\n  -o-transition: opacity .4s;\n  -ms-transition: opacity .4s;\n}\n\n.CodeMirror-lint-mark {\n  background-position: left bottom;\n  background-repeat: repeat-x;\n}\n\n.CodeMirror-lint-mark-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=\");\n}\n\n.CodeMirror-lint-mark-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==\");\n}\n\n.CodeMirror-lint-marker {\n  background-position: center center;\n  background-repeat: no-repeat;\n  cursor: pointer;\n  display: inline-block;\n  height: 16px;\n  width: 16px;\n  vertical-align: middle;\n  position: relative;\n}\n\n.CodeMirror-lint-message {\n  padding-left: 18px;\n  background-position: top left;\n  background-repeat: no-repeat;\n}\n\n.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=\");\n}\n\n.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=\");\n}\n\n.CodeMirror-lint-marker-multiple {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC\");\n  background-repeat: no-repeat;\n  background-position: right bottom;\n  width: 100%; height: 100%;\n}\n\n.CodeMirror-lint-line-error {\n  background-color: rgba(183, 76, 81, 0.08);\n}\n\n.CodeMirror-lint-line-warning {\n  background-color: rgba(255, 211, 0, 0.1);\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/lint/lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  var GUTTER_ID = \"CodeMirror-lint-markers\";\n  var LINT_LINE_ID = \"CodeMirror-lint-line-\";\n\n  function showTooltip(cm, e, content) {\n    var tt = document.createElement(\"div\");\n    tt.className = \"CodeMirror-lint-tooltip cm-s-\" + cm.options.theme;\n    tt.appendChild(content.cloneNode(true));\n    if (cm.state.lint.options.selfContain)\n      cm.getWrapperElement().appendChild(tt);\n    else\n      document.body.appendChild(tt);\n\n    function position(e) {\n      if (!tt.parentNode) return CodeMirror.off(document, \"mousemove\", position);\n      tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + \"px\";\n      tt.style.left = (e.clientX + 5) + \"px\";\n    }\n    CodeMirror.on(document, \"mousemove\", position);\n    position(e);\n    if (tt.style.opacity != null) tt.style.opacity = 1;\n    return tt;\n  }\n  function rm(elt) {\n    if (elt.parentNode) elt.parentNode.removeChild(elt);\n  }\n  function hideTooltip(tt) {\n    if (!tt.parentNode) return;\n    if (tt.style.opacity == null) rm(tt);\n    tt.style.opacity = 0;\n    setTimeout(function() { rm(tt); }, 600);\n  }\n\n  function showTooltipFor(cm, e, content, node) {\n    var tooltip = showTooltip(cm, e, content);\n    function hide() {\n      CodeMirror.off(node, \"mouseout\", hide);\n      if (tooltip) { hideTooltip(tooltip); tooltip = null; }\n    }\n    var poll = setInterval(function() {\n      if (tooltip) for (var n = node;; n = n.parentNode) {\n        if (n && n.nodeType == 11) n = n.host;\n        if (n == document.body) return;\n        if (!n) { hide(); break; }\n      }\n      if (!tooltip) return clearInterval(poll);\n    }, 400);\n    CodeMirror.on(node, \"mouseout\", hide);\n  }\n\n  function LintState(cm, conf, hasGutter) {\n    this.marked = [];\n    if (conf instanceof Function) conf = {getAnnotations: conf};\n    if (!conf || conf === true) conf = {};\n    this.options = {};\n    this.linterOptions = conf.options || {};\n    for (var prop in defaults) this.options[prop] = defaults[prop];\n    for (var prop in conf) {\n      if (defaults.hasOwnProperty(prop)) {\n        if (conf[prop] != null) this.options[prop] = conf[prop];\n      } else if (!conf.options) {\n        this.linterOptions[prop] = conf[prop];\n      }\n    }\n    this.timeout = null;\n    this.hasGutter = hasGutter;\n    this.onMouseOver = function(e) { onMouseOver(cm, e); };\n    this.waitingFor = 0\n  }\n\n  var defaults = {\n    highlightLines: false,\n    tooltips: true,\n    delay: 500,\n    lintOnChange: true,\n    getAnnotations: null,\n    async: false,\n    selfContain: null,\n    formatAnnotation: null,\n    onUpdateLinting: null\n  }\n\n  function clearMarks(cm) {\n    var state = cm.state.lint;\n    if (state.hasGutter) cm.clearGutter(GUTTER_ID);\n    if (state.options.highlightLines) clearErrorLines(cm);\n    for (var i = 0; i < state.marked.length; ++i)\n      state.marked[i].clear();\n    state.marked.length = 0;\n  }\n\n  function clearErrorLines(cm) {\n    cm.eachLine(function(line) {\n      var has = line.wrapClass && /\\bCodeMirror-lint-line-\\w+\\b/.exec(line.wrapClass);\n      if (has) cm.removeLineClass(line, \"wrap\", has[0]);\n    })\n  }\n\n  function makeMarker(cm, labels, severity, multiple, tooltips) {\n    var marker = document.createElement(\"div\"), inner = marker;\n    marker.className = \"CodeMirror-lint-marker CodeMirror-lint-marker-\" + severity;\n    if (multiple) {\n      inner = marker.appendChild(document.createElement(\"div\"));\n      inner.className = \"CodeMirror-lint-marker CodeMirror-lint-marker-multiple\";\n    }\n\n    if (tooltips != false) CodeMirror.on(inner, \"mouseover\", function(e) {\n      showTooltipFor(cm, e, labels, inner);\n    });\n\n    return marker;\n  }\n\n  function getMaxSeverity(a, b) {\n    if (a == \"error\") return a;\n    else return b;\n  }\n\n  function groupByLine(annotations) {\n    var lines = [];\n    for (var i = 0; i < annotations.length; ++i) {\n      var ann = annotations[i], line = ann.from.line;\n      (lines[line] || (lines[line] = [])).push(ann);\n    }\n    return lines;\n  }\n\n  function annotationTooltip(ann) {\n    var severity = ann.severity;\n    if (!severity) severity = \"error\";\n    var tip = document.createElement(\"div\");\n    tip.className = \"CodeMirror-lint-message CodeMirror-lint-message-\" + severity;\n    if (typeof ann.messageHTML != 'undefined') {\n      tip.innerHTML = ann.messageHTML;\n    } else {\n      tip.appendChild(document.createTextNode(ann.message));\n    }\n    return tip;\n  }\n\n  function lintAsync(cm, getAnnotations) {\n    var state = cm.state.lint\n    var id = ++state.waitingFor\n    function abort() {\n      id = -1\n      cm.off(\"change\", abort)\n    }\n    cm.on(\"change\", abort)\n    getAnnotations(cm.getValue(), function(annotations, arg2) {\n      cm.off(\"change\", abort)\n      if (state.waitingFor != id) return\n      if (arg2 && annotations instanceof CodeMirror) annotations = arg2\n      cm.operation(function() {updateLinting(cm, annotations)})\n    }, state.linterOptions, cm);\n  }\n\n  function startLinting(cm) {\n    var state = cm.state.lint;\n    if (!state) return;\n    var options = state.options;\n    /*\n     * Passing rules in `options` property prevents JSHint (and other linters) from complaining\n     * about unrecognized rules like `onUpdateLinting`, `delay`, `lintOnChange`, etc.\n     */\n    var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), \"lint\");\n    if (!getAnnotations) return;\n    if (options.async || getAnnotations.async) {\n      lintAsync(cm, getAnnotations)\n    } else {\n      var annotations = getAnnotations(cm.getValue(), state.linterOptions, cm);\n      if (!annotations) return;\n      if (annotations.then) annotations.then(function(issues) {\n        cm.operation(function() {updateLinting(cm, issues)})\n      });\n      else cm.operation(function() {updateLinting(cm, annotations)})\n    }\n  }\n\n  function updateLinting(cm, annotationsNotSorted) {\n    var state = cm.state.lint;\n    if (!state) return;\n    var options = state.options;\n    clearMarks(cm);\n\n    var annotations = groupByLine(annotationsNotSorted);\n\n    for (var line = 0; line < annotations.length; ++line) {\n      var anns = annotations[line];\n      if (!anns) continue;\n\n      // filter out duplicate messages\n      var message = [];\n      anns = anns.filter(function(item) { return message.indexOf(item.message) > -1 ? false : message.push(item.message) });\n\n      var maxSeverity = null;\n      var tipLabel = state.hasGutter && document.createDocumentFragment();\n\n      for (var i = 0; i < anns.length; ++i) {\n        var ann = anns[i];\n        var severity = ann.severity;\n        if (!severity) severity = \"error\";\n        maxSeverity = getMaxSeverity(maxSeverity, severity);\n\n        if (options.formatAnnotation) ann = options.formatAnnotation(ann);\n        if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));\n\n        if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {\n          className: \"CodeMirror-lint-mark CodeMirror-lint-mark-\" + severity,\n          __annotation: ann\n        }));\n      }\n      // use original annotations[line] to show multiple messages\n      if (state.hasGutter)\n        cm.setGutterMarker(line, GUTTER_ID, makeMarker(cm, tipLabel, maxSeverity, annotations[line].length > 1,\n                                                       options.tooltips));\n\n      if (options.highlightLines)\n        cm.addLineClass(line, \"wrap\", LINT_LINE_ID + maxSeverity);\n    }\n    if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);\n  }\n\n  function onChange(cm) {\n    var state = cm.state.lint;\n    if (!state) return;\n    clearTimeout(state.timeout);\n    state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay);\n  }\n\n  function popupTooltips(cm, annotations, e) {\n    var target = e.target || e.srcElement;\n    var tooltip = document.createDocumentFragment();\n    for (var i = 0; i < annotations.length; i++) {\n      var ann = annotations[i];\n      tooltip.appendChild(annotationTooltip(ann));\n    }\n    showTooltipFor(cm, e, tooltip, target);\n  }\n\n  function onMouseOver(cm, e) {\n    var target = e.target || e.srcElement;\n    if (!/\\bCodeMirror-lint-mark-/.test(target.className)) return;\n    var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2;\n    var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, \"client\"));\n\n    var annotations = [];\n    for (var i = 0; i < spans.length; ++i) {\n      var ann = spans[i].__annotation;\n      if (ann) annotations.push(ann);\n    }\n    if (annotations.length) popupTooltips(cm, annotations, e);\n  }\n\n  CodeMirror.defineOption(\"lint\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      clearMarks(cm);\n      if (cm.state.lint.options.lintOnChange !== false)\n        cm.off(\"change\", onChange);\n      CodeMirror.off(cm.getWrapperElement(), \"mouseover\", cm.state.lint.onMouseOver);\n      clearTimeout(cm.state.lint.timeout);\n      delete cm.state.lint;\n    }\n\n    if (val) {\n      var gutters = cm.getOption(\"gutters\"), hasLintGutter = false;\n      for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;\n      var state = cm.state.lint = new LintState(cm, val, hasLintGutter);\n      if (state.options.lintOnChange)\n        cm.on(\"change\", onChange);\n      if (state.options.tooltips != false && state.options.tooltips != \"gutter\")\n        CodeMirror.on(cm.getWrapperElement(), \"mouseover\", state.onMouseOver);\n\n      startLinting(cm);\n    }\n  });\n\n  CodeMirror.defineExtension(\"performLint\", function() {\n    startLinting(this);\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/lint/yaml-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\n// Depends on js-yaml.js from https://github.com/nodeca/js-yaml\n\n// declare global: jsyaml\n\nCodeMirror.registerHelper(\"lint\", \"yaml\", function(text) {\n  var found = [];\n  if (!window.jsyaml) {\n    if (window.console) {\n      window.console.error(\"Error: window.jsyaml not defined, CodeMirror YAML linting cannot run.\");\n    }\n    return found;\n  }\n  try { jsyaml.loadAll(text); }\n  catch(e) {\n      var loc = e.mark,\n          // js-yaml YAMLException doesn't always provide an accurate lineno\n          // e.g., when there are multiple yaml docs\n          // ---\n          // ---\n          // foo:bar\n          from = loc ? CodeMirror.Pos(loc.line, loc.column) : CodeMirror.Pos(0, 0),\n          to = from;\n      found.push({ from: from, to: to, message: e.message });\n  }\n  return found;\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/merge/merge.css",
    "content": ".CodeMirror-merge {\n  position: relative;\n  border: 1px solid #ddd;\n  white-space: pre;\n}\n\n.CodeMirror-merge, .CodeMirror-merge .CodeMirror {\n  height: 350px;\n}\n\n.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; }\n.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; }\n.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; }\n.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; }\n\n.CodeMirror-merge-pane {\n  display: inline-block;\n  white-space: normal;\n  vertical-align: top;\n}\n.CodeMirror-merge-pane-rightmost {\n  position: absolute;\n  right: 0px;\n  z-index: 1;\n}\n\n.CodeMirror-merge-gap {\n  z-index: 2;\n  display: inline-block;\n  height: 100%;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  overflow: hidden;\n  border-left: 1px solid #ddd;\n  border-right: 1px solid #ddd;\n  position: relative;\n  background: #f8f8f8;\n}\n\n.CodeMirror-merge-scrolllock-wrap {\n  position: absolute;\n  bottom: 0; left: 50%;\n}\n.CodeMirror-merge-scrolllock {\n  position: relative;\n  left: -50%;\n  cursor: pointer;\n  color: #555;\n  line-height: 1;\n}\n.CodeMirror-merge-scrolllock:after {\n  content: \"\\21db\\00a0\\00a0\\21da\";\n}\n.CodeMirror-merge-scrolllock.CodeMirror-merge-scrolllock-enabled:after {\n  content: \"\\21db\\21da\";\n}\n\n.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right {\n  position: absolute;\n  left: 0; top: 0;\n  right: 0; bottom: 0;\n  line-height: 1;\n}\n\n.CodeMirror-merge-copy {\n  position: absolute;\n  cursor: pointer;\n  color: #44c;\n  z-index: 3;\n}\n\n.CodeMirror-merge-copy-reverse {\n  position: absolute;\n  cursor: pointer;\n  color: #44c;\n}\n\n.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; }\n.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; }\n\n.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==);\n  background-position: bottom left;\n  background-repeat: repeat-x;\n}\n\n.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==);\n  background-position: bottom left;\n  background-repeat: repeat-x;\n}\n\n.CodeMirror-merge-r-chunk { background: #ffffe0; }\n.CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; }\n.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; }\n.CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; }\n\n.CodeMirror-merge-l-chunk { background: #eef; }\n.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; }\n.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; }\n.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; }\n\n.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; }\n.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; }\n.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; }\n\n.CodeMirror-merge-collapsed-widget:before {\n  content: \"(...)\";\n}\n.CodeMirror-merge-collapsed-widget {\n  cursor: pointer;\n  color: #88b;\n  background: #eef;\n  border: 1px solid #ddf;\n  font-size: 90%;\n  padding: 0 3px;\n  border-radius: 4px;\n}\n.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/merge/merge.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// declare global: diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\")); // Note non-packaged dependency diff_match_patch\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"diff_match_patch\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  var Pos = CodeMirror.Pos;\n  var svgNS = \"http://www.w3.org/2000/svg\";\n\n  function DiffView(mv, type) {\n    this.mv = mv;\n    this.type = type;\n    this.classes = type == \"left\"\n      ? {chunk: \"CodeMirror-merge-l-chunk\",\n         start: \"CodeMirror-merge-l-chunk-start\",\n         end: \"CodeMirror-merge-l-chunk-end\",\n         insert: \"CodeMirror-merge-l-inserted\",\n         del: \"CodeMirror-merge-l-deleted\",\n         connect: \"CodeMirror-merge-l-connect\"}\n      : {chunk: \"CodeMirror-merge-r-chunk\",\n         start: \"CodeMirror-merge-r-chunk-start\",\n         end: \"CodeMirror-merge-r-chunk-end\",\n         insert: \"CodeMirror-merge-r-inserted\",\n         del: \"CodeMirror-merge-r-deleted\",\n         connect: \"CodeMirror-merge-r-connect\"};\n  }\n\n  DiffView.prototype = {\n    constructor: DiffView,\n    init: function(pane, orig, options) {\n      this.edit = this.mv.edit;\n      ;(this.edit.state.diffViews || (this.edit.state.diffViews = [])).push(this);\n      this.orig = CodeMirror(pane, copyObj({value: orig, readOnly: !this.mv.options.allowEditingOriginals}, copyObj(options)));\n      if (this.mv.options.connect == \"align\") {\n        if (!this.edit.state.trackAlignable) this.edit.state.trackAlignable = new TrackAlignable(this.edit)\n        this.orig.state.trackAlignable = new TrackAlignable(this.orig)\n      }\n      this.lockButton.title = this.edit.phrase(\"Toggle locked scrolling\");\n\n      this.orig.state.diffViews = [this];\n      var classLocation = options.chunkClassLocation || \"background\";\n      if (Object.prototype.toString.call(classLocation) != \"[object Array]\") classLocation = [classLocation]\n      this.classes.classLocation = classLocation\n\n      this.diff = getDiff(asString(orig), asString(options.value), this.mv.options.ignoreWhitespace);\n      this.chunks = getChunks(this.diff);\n      this.diffOutOfDate = this.dealigned = false;\n      this.needsScrollSync = null\n\n      this.showDifferences = options.showDifferences !== false;\n    },\n    registerEvents: function(otherDv) {\n      this.forceUpdate = registerUpdate(this);\n      setScrollLock(this, true, false);\n      registerScroll(this, otherDv);\n    },\n    setShowDifferences: function(val) {\n      val = val !== false;\n      if (val != this.showDifferences) {\n        this.showDifferences = val;\n        this.forceUpdate(\"full\");\n      }\n    }\n  };\n\n  function ensureDiff(dv) {\n    if (dv.diffOutOfDate) {\n      dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue(), dv.mv.options.ignoreWhitespace);\n      dv.chunks = getChunks(dv.diff);\n      dv.diffOutOfDate = false;\n      CodeMirror.signal(dv.edit, \"updateDiff\", dv.diff);\n    }\n  }\n\n  var updating = false;\n  function registerUpdate(dv) {\n    var edit = {from: 0, to: 0, marked: []};\n    var orig = {from: 0, to: 0, marked: []};\n    var debounceChange, updatingFast = false;\n    function update(mode) {\n      updating = true;\n      updatingFast = false;\n      if (mode == \"full\") {\n        if (dv.svg) clear(dv.svg);\n        if (dv.copyButtons) clear(dv.copyButtons);\n        clearMarks(dv.edit, edit.marked, dv.classes);\n        clearMarks(dv.orig, orig.marked, dv.classes);\n        edit.from = edit.to = orig.from = orig.to = 0;\n      }\n      ensureDiff(dv);\n      if (dv.showDifferences) {\n        updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes);\n        updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes);\n      }\n\n      if (dv.mv.options.connect == \"align\")\n        alignChunks(dv);\n      makeConnections(dv);\n      if (dv.needsScrollSync != null) syncScroll(dv, dv.needsScrollSync)\n\n      updating = false;\n    }\n    function setDealign(fast) {\n      if (updating) return;\n      dv.dealigned = true;\n      set(fast);\n    }\n    function set(fast) {\n      if (updating || updatingFast) return;\n      clearTimeout(debounceChange);\n      if (fast === true) updatingFast = true;\n      debounceChange = setTimeout(update, fast === true ? 20 : 250);\n    }\n    function change(_cm, change) {\n      if (!dv.diffOutOfDate) {\n        dv.diffOutOfDate = true;\n        edit.from = edit.to = orig.from = orig.to = 0;\n      }\n      // Update faster when a line was added/removed\n      setDealign(change.text.length - 1 != change.to.line - change.from.line);\n    }\n    function swapDoc() {\n      dv.diffOutOfDate = true;\n      dv.dealigned = true;\n      update(\"full\");\n    }\n    dv.edit.on(\"change\", change);\n    dv.orig.on(\"change\", change);\n    dv.edit.on(\"swapDoc\", swapDoc);\n    dv.orig.on(\"swapDoc\", swapDoc);\n    if (dv.mv.options.connect == \"align\") {\n      CodeMirror.on(dv.edit.state.trackAlignable, \"realign\", setDealign)\n      CodeMirror.on(dv.orig.state.trackAlignable, \"realign\", setDealign)\n    }\n    dv.edit.on(\"viewportChange\", function() { set(false); });\n    dv.orig.on(\"viewportChange\", function() { set(false); });\n    update();\n    return update;\n  }\n\n  function registerScroll(dv, otherDv) {\n    dv.edit.on(\"scroll\", function() {\n      syncScroll(dv, true) && makeConnections(dv);\n    });\n    dv.orig.on(\"scroll\", function() {\n      syncScroll(dv, false) && makeConnections(dv);\n      if (otherDv) syncScroll(otherDv, true) && makeConnections(otherDv);\n    });\n  }\n\n  function syncScroll(dv, toOrig) {\n    // Change handler will do a refresh after a timeout when diff is out of date\n    if (dv.diffOutOfDate) {\n      if (dv.lockScroll && dv.needsScrollSync == null) dv.needsScrollSync = toOrig\n      return false\n    }\n    dv.needsScrollSync = null\n    if (!dv.lockScroll) return true;\n    var editor, other, now = +new Date;\n    if (toOrig) { editor = dv.edit; other = dv.orig; }\n    else { editor = dv.orig; other = dv.edit; }\n    // Don't take action if the position of this editor was recently set\n    // (to prevent feedback loops)\n    if (editor.state.scrollSetBy == dv && (editor.state.scrollSetAt || 0) + 250 > now) return false;\n\n    var sInfo = editor.getScrollInfo();\n    if (dv.mv.options.connect == \"align\") {\n      targetPos = sInfo.top;\n    } else {\n      var halfScreen = .5 * sInfo.clientHeight, midY = sInfo.top + halfScreen;\n      var mid = editor.lineAtHeight(midY, \"local\");\n      var around = chunkBoundariesAround(dv.chunks, mid, toOrig);\n      var off = getOffsets(editor, toOrig ? around.edit : around.orig);\n      var offOther = getOffsets(other, toOrig ? around.orig : around.edit);\n      var ratio = (midY - off.top) / (off.bot - off.top);\n      var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top);\n\n      var botDist, mix;\n      // Some careful tweaking to make sure no space is left out of view\n      // when scrolling to top or bottom.\n      if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) {\n        targetPos = targetPos * mix + sInfo.top * (1 - mix);\n      } else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) {\n        var otherInfo = other.getScrollInfo();\n        var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos;\n        if (botDistOther > botDist && (mix = botDist / halfScreen) < 1)\n          targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix);\n      }\n    }\n\n    other.scrollTo(sInfo.left, targetPos);\n    other.state.scrollSetAt = now;\n    other.state.scrollSetBy = dv;\n    return true;\n  }\n\n  function getOffsets(editor, around) {\n    var bot = around.after;\n    if (bot == null) bot = editor.lastLine() + 1;\n    return {top: editor.heightAtLine(around.before || 0, \"local\"),\n            bot: editor.heightAtLine(bot, \"local\")};\n  }\n\n  function setScrollLock(dv, val, action) {\n    dv.lockScroll = val;\n    if (val && action != false) syncScroll(dv, DIFF_INSERT) && makeConnections(dv);\n    (val ? CodeMirror.addClass : CodeMirror.rmClass)(dv.lockButton, \"CodeMirror-merge-scrolllock-enabled\");\n  }\n\n  // Updating the marks for editor content\n\n  function removeClass(editor, line, classes) {\n    var locs = classes.classLocation\n    for (var i = 0; i < locs.length; i++) {\n      editor.removeLineClass(line, locs[i], classes.chunk);\n      editor.removeLineClass(line, locs[i], classes.start);\n      editor.removeLineClass(line, locs[i], classes.end);\n    }\n  }\n\n  function clearMarks(editor, arr, classes) {\n    for (var i = 0; i < arr.length; ++i) {\n      var mark = arr[i];\n      if (mark instanceof CodeMirror.TextMarker)\n        mark.clear();\n      else if (mark.parent)\n        removeClass(editor, mark, classes);\n    }\n    arr.length = 0;\n  }\n\n  // FIXME maybe add a margin around viewport to prevent too many updates\n  function updateMarks(editor, diff, state, type, classes) {\n    var vp = editor.getViewport();\n    editor.operation(function() {\n      if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {\n        clearMarks(editor, state.marked, classes);\n        markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes);\n        state.from = vp.from; state.to = vp.to;\n      } else {\n        if (vp.from < state.from) {\n          markChanges(editor, diff, type, state.marked, vp.from, state.from, classes);\n          state.from = vp.from;\n        }\n        if (vp.to > state.to) {\n          markChanges(editor, diff, type, state.marked, state.to, vp.to, classes);\n          state.to = vp.to;\n        }\n      }\n    });\n  }\n\n  function addClass(editor, lineNr, classes, main, start, end) {\n    var locs = classes.classLocation, line = editor.getLineHandle(lineNr);\n    for (var i = 0; i < locs.length; i++) {\n      if (main) editor.addLineClass(line, locs[i], classes.chunk);\n      if (start) editor.addLineClass(line, locs[i], classes.start);\n      if (end) editor.addLineClass(line, locs[i], classes.end);\n    }\n    return line;\n  }\n\n  function markChanges(editor, diff, type, marks, from, to, classes) {\n    var pos = Pos(0, 0);\n    var top = Pos(from, 0), bot = editor.clipPos(Pos(to - 1));\n    var cls = type == DIFF_DELETE ? classes.del : classes.insert;\n    function markChunk(start, end) {\n      var bfrom = Math.max(from, start), bto = Math.min(to, end);\n      for (var i = bfrom; i < bto; ++i)\n        marks.push(addClass(editor, i, classes, true, i == start, i == end - 1));\n      // When the chunk is empty, make sure a horizontal line shows up\n      if (start == end && bfrom == end && bto == end) {\n        if (bfrom)\n          marks.push(addClass(editor, bfrom - 1, classes, false, false, true));\n        else\n          marks.push(addClass(editor, bfrom, classes, false, true, false));\n      }\n    }\n\n    var chunkStart = 0, pending = false;\n    for (var i = 0; i < diff.length; ++i) {\n      var part = diff[i], tp = part[0], str = part[1];\n      if (tp == DIFF_EQUAL) {\n        var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1);\n        moveOver(pos, str);\n        var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0);\n        if (cleanTo > cleanFrom) {\n          if (pending) { markChunk(chunkStart, cleanFrom); pending = false }\n          chunkStart = cleanTo;\n        }\n      } else {\n        pending = true\n        if (tp == type) {\n          var end = moveOver(pos, str, true);\n          var a = posMax(top, pos), b = posMin(bot, end);\n          if (!posEq(a, b))\n            marks.push(editor.markText(a, b, {className: cls}));\n          pos = end;\n        }\n      }\n    }\n    if (pending) markChunk(chunkStart, pos.line + 1);\n  }\n\n  // Updating the gap between editor and original\n\n  function makeConnections(dv) {\n    if (!dv.showDifferences) return;\n\n    if (dv.svg) {\n      clear(dv.svg);\n      var w = dv.gap.offsetWidth;\n      attrs(dv.svg, \"width\", w, \"height\", dv.gap.offsetHeight);\n    }\n    if (dv.copyButtons) clear(dv.copyButtons);\n\n    var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport();\n    var outerTop = dv.mv.wrap.getBoundingClientRect().top\n    var sTopEdit = outerTop - dv.edit.getScrollerElement().getBoundingClientRect().top + dv.edit.getScrollInfo().top\n    var sTopOrig = outerTop - dv.orig.getScrollerElement().getBoundingClientRect().top + dv.orig.getScrollInfo().top;\n    for (var i = 0; i < dv.chunks.length; i++) {\n      var ch = dv.chunks[i];\n      if (ch.editFrom <= vpEdit.to && ch.editTo >= vpEdit.from &&\n          ch.origFrom <= vpOrig.to && ch.origTo >= vpOrig.from)\n        drawConnectorsForChunk(dv, ch, sTopOrig, sTopEdit, w);\n    }\n  }\n\n  function getMatchingOrigLine(editLine, chunks) {\n    var editStart = 0, origStart = 0;\n    for (var i = 0; i < chunks.length; i++) {\n      var chunk = chunks[i];\n      if (chunk.editTo > editLine && chunk.editFrom <= editLine) return null;\n      if (chunk.editFrom > editLine) break;\n      editStart = chunk.editTo;\n      origStart = chunk.origTo;\n    }\n    return origStart + (editLine - editStart);\n  }\n\n  // Combines information about chunks and widgets/markers to return\n  // an array of lines, in a single editor, that probably need to be\n  // aligned with their counterparts in the editor next to it.\n  function alignableFor(cm, chunks, isOrig) {\n    var tracker = cm.state.trackAlignable\n    var start = cm.firstLine(), trackI = 0\n    var result = []\n    for (var i = 0;; i++) {\n      var chunk = chunks[i]\n      var chunkStart = !chunk ? 1e9 : isOrig ? chunk.origFrom : chunk.editFrom\n      for (; trackI < tracker.alignable.length; trackI += 2) {\n        var n = tracker.alignable[trackI] + 1\n        if (n <= start) continue\n        if (n <= chunkStart) result.push(n)\n        else break\n      }\n      if (!chunk) break\n      result.push(start = isOrig ? chunk.origTo : chunk.editTo)\n    }\n    return result\n  }\n\n  // Given information about alignable lines in two editors, fill in\n  // the result (an array of three-element arrays) to reflect the\n  // lines that need to be aligned with each other.\n  function mergeAlignable(result, origAlignable, chunks, setIndex) {\n    var rI = 0, origI = 0, chunkI = 0, diff = 0\n    outer: for (;; rI++) {\n      var nextR = result[rI], nextO = origAlignable[origI]\n      if (!nextR && nextO == null) break\n\n      var rLine = nextR ? nextR[0] : 1e9, oLine = nextO == null ? 1e9 : nextO\n      while (chunkI < chunks.length) {\n        var chunk = chunks[chunkI]\n        if (chunk.origFrom <= oLine && chunk.origTo > oLine) {\n          origI++\n          rI--\n          continue outer;\n        }\n        if (chunk.editTo > rLine) {\n          if (chunk.editFrom <= rLine) continue outer;\n          break\n        }\n        diff += (chunk.origTo - chunk.origFrom) - (chunk.editTo - chunk.editFrom)\n        chunkI++\n      }\n      if (rLine == oLine - diff) {\n        nextR[setIndex] = oLine\n        origI++\n      } else if (rLine < oLine - diff) {\n        nextR[setIndex] = rLine + diff\n      } else {\n        var record = [oLine - diff, null, null]\n        record[setIndex] = oLine\n        result.splice(rI, 0, record)\n        origI++\n      }\n    }\n  }\n\n  function findAlignedLines(dv, other) {\n    var alignable = alignableFor(dv.edit, dv.chunks, false), result = []\n    if (other) for (var i = 0, j = 0; i < other.chunks.length; i++) {\n      var n = other.chunks[i].editTo\n      while (j < alignable.length && alignable[j] < n) j++\n      if (j == alignable.length || alignable[j] != n) alignable.splice(j++, 0, n)\n    }\n    for (var i = 0; i < alignable.length; i++)\n      result.push([alignable[i], null, null])\n\n    mergeAlignable(result, alignableFor(dv.orig, dv.chunks, true), dv.chunks, 1)\n    if (other)\n      mergeAlignable(result, alignableFor(other.orig, other.chunks, true), other.chunks, 2)\n\n    return result\n  }\n\n  function alignChunks(dv, force) {\n    if (!dv.dealigned && !force) return;\n    if (!dv.orig.curOp) return dv.orig.operation(function() {\n      alignChunks(dv, force);\n    });\n\n    dv.dealigned = false;\n    var other = dv.mv.left == dv ? dv.mv.right : dv.mv.left;\n    if (other) {\n      ensureDiff(other);\n      other.dealigned = false;\n    }\n    var linesToAlign = findAlignedLines(dv, other);\n\n    // Clear old aligners\n    var aligners = dv.mv.aligners;\n    for (var i = 0; i < aligners.length; i++)\n      aligners[i].clear();\n    aligners.length = 0;\n\n    var cm = [dv.edit, dv.orig], scroll = [], offset = []\n    if (other) cm.push(other.orig);\n    for (var i = 0; i < cm.length; i++) {\n      scroll.push(cm[i].getScrollInfo().top);\n      offset.push(-cm[i].getScrollerElement().getBoundingClientRect().top)\n    }\n\n    if (offset[0] != offset[1] || cm.length == 3 && offset[1] != offset[2])\n      alignLines(cm, offset, [0, 0, 0], aligners)\n    for (var ln = 0; ln < linesToAlign.length; ln++)\n      alignLines(cm, offset, linesToAlign[ln], aligners);\n\n    for (var i = 0; i < cm.length; i++)\n      cm[i].scrollTo(null, scroll[i]);\n  }\n\n  function alignLines(cm, cmOffset, lines, aligners) {\n    var maxOffset = -1e8, offset = [];\n    for (var i = 0; i < cm.length; i++) if (lines[i] != null) {\n      var off = cm[i].heightAtLine(lines[i], \"local\") - cmOffset[i];\n      offset[i] = off;\n      maxOffset = Math.max(maxOffset, off);\n    }\n    for (var i = 0; i < cm.length; i++) if (lines[i] != null) {\n      var diff = maxOffset - offset[i];\n      if (diff > 1)\n        aligners.push(padAbove(cm[i], lines[i], diff));\n    }\n  }\n\n  function padAbove(cm, line, size) {\n    var above = true;\n    if (line > cm.lastLine()) {\n      line--;\n      above = false;\n    }\n    var elt = document.createElement(\"div\");\n    elt.className = \"CodeMirror-merge-spacer\";\n    elt.style.height = size + \"px\"; elt.style.minWidth = \"1px\";\n    return cm.addLineWidget(line, elt, {height: size, above: above, mergeSpacer: true, handleMouseEvents: true});\n  }\n\n  function drawConnectorsForChunk(dv, chunk, sTopOrig, sTopEdit, w) {\n    var flip = dv.type == \"left\";\n    var top = dv.orig.heightAtLine(chunk.origFrom, \"local\", true) - sTopOrig;\n    if (dv.svg) {\n      var topLpx = top;\n      var topRpx = dv.edit.heightAtLine(chunk.editFrom, \"local\", true) - sTopEdit;\n      if (flip) { var tmp = topLpx; topLpx = topRpx; topRpx = tmp; }\n      var botLpx = dv.orig.heightAtLine(chunk.origTo, \"local\", true) - sTopOrig;\n      var botRpx = dv.edit.heightAtLine(chunk.editTo, \"local\", true) - sTopEdit;\n      if (flip) { var tmp = botLpx; botLpx = botRpx; botRpx = tmp; }\n      var curveTop = \" C \" + w/2 + \" \" + topRpx + \" \" + w/2 + \" \" + topLpx + \" \" + (w + 2) + \" \" + topLpx;\n      var curveBot = \" C \" + w/2 + \" \" + botLpx + \" \" + w/2 + \" \" + botRpx + \" -1 \" + botRpx;\n      attrs(dv.svg.appendChild(document.createElementNS(svgNS, \"path\")),\n            \"d\", \"M -1 \" + topRpx + curveTop + \" L \" + (w + 2) + \" \" + botLpx + curveBot + \" z\",\n            \"class\", dv.classes.connect);\n    }\n    if (dv.copyButtons) {\n      var copy = dv.copyButtons.appendChild(elt(\"div\", dv.type == \"left\" ? \"\\u21dd\" : \"\\u21dc\",\n                                                \"CodeMirror-merge-copy\"));\n      var editOriginals = dv.mv.options.allowEditingOriginals;\n      copy.title = dv.edit.phrase(editOriginals ? \"Push to left\" : \"Revert chunk\");\n      copy.chunk = chunk;\n      copy.style.top = (chunk.origTo > chunk.origFrom ? top : dv.edit.heightAtLine(chunk.editFrom, \"local\") - sTopEdit) + \"px\";\n      copy.setAttribute(\"role\", \"button\");\n\n      if (editOriginals) {\n        var topReverse = dv.edit.heightAtLine(chunk.editFrom, \"local\") - sTopEdit;\n        var copyReverse = dv.copyButtons.appendChild(elt(\"div\", dv.type == \"right\" ? \"\\u21dd\" : \"\\u21dc\",\n                                                         \"CodeMirror-merge-copy-reverse\"));\n        copyReverse.title = \"Push to right\";\n        copyReverse.chunk = {editFrom: chunk.origFrom, editTo: chunk.origTo,\n                             origFrom: chunk.editFrom, origTo: chunk.editTo};\n        copyReverse.style.top = topReverse + \"px\";\n        dv.type == \"right\" ? copyReverse.style.left = \"2px\" : copyReverse.style.right = \"2px\";\n        copyReverse.setAttribute(\"role\", \"button\");\n      }\n    }\n  }\n\n  function copyChunk(dv, to, from, chunk) {\n    if (dv.diffOutOfDate) return;\n    var origStart = chunk.origTo > from.lastLine() ? Pos(chunk.origFrom - 1) : Pos(chunk.origFrom, 0)\n    var origEnd = Pos(chunk.origTo, 0)\n    var editStart = chunk.editTo > to.lastLine() ? Pos(chunk.editFrom - 1) : Pos(chunk.editFrom, 0)\n    var editEnd = Pos(chunk.editTo, 0)\n    var handler = dv.mv.options.revertChunk\n    if (handler)\n      handler(dv.mv, from, origStart, origEnd, to, editStart, editEnd)\n    else\n      to.replaceRange(from.getRange(origStart, origEnd), editStart, editEnd)\n  }\n\n  // Merge view, containing 0, 1, or 2 diff views.\n\n  var MergeView = CodeMirror.MergeView = function(node, options) {\n    if (!(this instanceof MergeView)) return new MergeView(node, options);\n\n    this.options = options;\n    var origLeft = options.origLeft, origRight = options.origRight == null ? options.orig : options.origRight;\n\n    var hasLeft = origLeft != null, hasRight = origRight != null;\n    var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0);\n    var wrap = [], left = this.left = null, right = this.right = null;\n    var self = this;\n\n    if (hasLeft) {\n      left = this.left = new DiffView(this, \"left\");\n      var leftPane = elt(\"div\", null, \"CodeMirror-merge-pane CodeMirror-merge-left\");\n      wrap.push(leftPane);\n      wrap.push(buildGap(left));\n    }\n\n    var editPane = elt(\"div\", null, \"CodeMirror-merge-pane CodeMirror-merge-editor\");\n    wrap.push(editPane);\n\n    if (hasRight) {\n      right = this.right = new DiffView(this, \"right\");\n      wrap.push(buildGap(right));\n      var rightPane = elt(\"div\", null, \"CodeMirror-merge-pane CodeMirror-merge-right\");\n      wrap.push(rightPane);\n    }\n\n    (hasRight ? rightPane : editPane).className += \" CodeMirror-merge-pane-rightmost\";\n\n    wrap.push(elt(\"div\", null, null, \"height: 0; clear: both;\"));\n\n    var wrapElt = this.wrap = node.appendChild(elt(\"div\", wrap, \"CodeMirror-merge CodeMirror-merge-\" + panes + \"pane\"));\n    this.edit = CodeMirror(editPane, copyObj(options));\n\n    if (left) left.init(leftPane, origLeft, options);\n    if (right) right.init(rightPane, origRight, options);\n    if (options.collapseIdentical)\n      this.editor().operation(function() {\n        collapseIdenticalStretches(self, options.collapseIdentical);\n      });\n    if (options.connect == \"align\") {\n      this.aligners = [];\n      alignChunks(this.left || this.right, true);\n    }\n    if (left) left.registerEvents(right)\n    if (right) right.registerEvents(left)\n\n\n    var onResize = function() {\n      if (left) makeConnections(left);\n      if (right) makeConnections(right);\n    };\n    CodeMirror.on(window, \"resize\", onResize);\n    var resizeInterval = setInterval(function() {\n      for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {}\n      if (!p) { clearInterval(resizeInterval); CodeMirror.off(window, \"resize\", onResize); }\n    }, 5000);\n  };\n\n  function buildGap(dv) {\n    var lock = dv.lockButton = elt(\"div\", null, \"CodeMirror-merge-scrolllock\");\n    lock.setAttribute(\"role\", \"button\");\n    var lockWrap = elt(\"div\", [lock], \"CodeMirror-merge-scrolllock-wrap\");\n    CodeMirror.on(lock, \"click\", function() { setScrollLock(dv, !dv.lockScroll); });\n    var gapElts = [lockWrap];\n    if (dv.mv.options.revertButtons !== false) {\n      dv.copyButtons = elt(\"div\", null, \"CodeMirror-merge-copybuttons-\" + dv.type);\n      CodeMirror.on(dv.copyButtons, \"click\", function(e) {\n        var node = e.target || e.srcElement;\n        if (!node.chunk) return;\n        if (node.className == \"CodeMirror-merge-copy-reverse\") {\n          copyChunk(dv, dv.orig, dv.edit, node.chunk);\n          return;\n        }\n        copyChunk(dv, dv.edit, dv.orig, node.chunk);\n      });\n      gapElts.unshift(dv.copyButtons);\n    }\n    if (dv.mv.options.connect != \"align\") {\n      var svg = document.createElementNS && document.createElementNS(svgNS, \"svg\");\n      if (svg && !svg.createSVGRect) svg = null;\n      dv.svg = svg;\n      if (svg) gapElts.push(svg);\n    }\n\n    return dv.gap = elt(\"div\", gapElts, \"CodeMirror-merge-gap\");\n  }\n\n  MergeView.prototype = {\n    constructor: MergeView,\n    editor: function() { return this.edit; },\n    rightOriginal: function() { return this.right && this.right.orig; },\n    leftOriginal: function() { return this.left && this.left.orig; },\n    setShowDifferences: function(val) {\n      if (this.right) this.right.setShowDifferences(val);\n      if (this.left) this.left.setShowDifferences(val);\n    },\n    rightChunks: function() {\n      if (this.right) { ensureDiff(this.right); return this.right.chunks; }\n    },\n    leftChunks: function() {\n      if (this.left) { ensureDiff(this.left); return this.left.chunks; }\n    }\n  };\n\n  function asString(obj) {\n    if (typeof obj == \"string\") return obj;\n    else return obj.getValue();\n  }\n\n  // Operations on diffs\n  var dmp;\n  function getDiff(a, b, ignoreWhitespace) {\n    if (!dmp) dmp = new diff_match_patch();\n\n    var diff = dmp.diff_main(a, b);\n    // The library sometimes leaves in empty parts, which confuse the algorithm\n    for (var i = 0; i < diff.length; ++i) {\n      var part = diff[i];\n      if (ignoreWhitespace ? !/[^ \\t]/.test(part[1]) : !part[1]) {\n        diff.splice(i--, 1);\n      } else if (i && diff[i - 1][0] == part[0]) {\n        diff.splice(i--, 1);\n        diff[i][1] += part[1];\n      }\n    }\n    return diff;\n  }\n\n  function getChunks(diff) {\n    var chunks = [];\n    if (!diff.length) return chunks;\n    var startEdit = 0, startOrig = 0;\n    var edit = Pos(0, 0), orig = Pos(0, 0);\n    for (var i = 0; i < diff.length; ++i) {\n      var part = diff[i], tp = part[0];\n      if (tp == DIFF_EQUAL) {\n        var startOff = !startOfLineClean(diff, i) || edit.line < startEdit || orig.line < startOrig ? 1 : 0;\n        var cleanFromEdit = edit.line + startOff, cleanFromOrig = orig.line + startOff;\n        moveOver(edit, part[1], null, orig);\n        var endOff = endOfLineClean(diff, i) ? 1 : 0;\n        var cleanToEdit = edit.line + endOff, cleanToOrig = orig.line + endOff;\n        if (cleanToEdit > cleanFromEdit) {\n          if (i) chunks.push({origFrom: startOrig, origTo: cleanFromOrig,\n                              editFrom: startEdit, editTo: cleanFromEdit});\n          startEdit = cleanToEdit; startOrig = cleanToOrig;\n        }\n      } else {\n        moveOver(tp == DIFF_INSERT ? edit : orig, part[1]);\n      }\n    }\n    if (startEdit <= edit.line || startOrig <= orig.line)\n      chunks.push({origFrom: startOrig, origTo: orig.line + 1,\n                   editFrom: startEdit, editTo: edit.line + 1});\n    return chunks;\n  }\n\n  function endOfLineClean(diff, i) {\n    if (i == diff.length - 1) return true;\n    var next = diff[i + 1][1];\n    if ((next.length == 1 && i < diff.length - 2) || next.charCodeAt(0) != 10) return false;\n    if (i == diff.length - 2) return true;\n    next = diff[i + 2][1];\n    return (next.length > 1 || i == diff.length - 3) && next.charCodeAt(0) == 10;\n  }\n\n  function startOfLineClean(diff, i) {\n    if (i == 0) return true;\n    var last = diff[i - 1][1];\n    if (last.charCodeAt(last.length - 1) != 10) return false;\n    if (i == 1) return true;\n    last = diff[i - 2][1];\n    return last.charCodeAt(last.length - 1) == 10;\n  }\n\n  function chunkBoundariesAround(chunks, n, nInEdit) {\n    var beforeE, afterE, beforeO, afterO;\n    for (var i = 0; i < chunks.length; i++) {\n      var chunk = chunks[i];\n      var fromLocal = nInEdit ? chunk.editFrom : chunk.origFrom;\n      var toLocal = nInEdit ? chunk.editTo : chunk.origTo;\n      if (afterE == null) {\n        if (fromLocal > n) { afterE = chunk.editFrom; afterO = chunk.origFrom; }\n        else if (toLocal > n) { afterE = chunk.editTo; afterO = chunk.origTo; }\n      }\n      if (toLocal <= n) { beforeE = chunk.editTo; beforeO = chunk.origTo; }\n      else if (fromLocal <= n) { beforeE = chunk.editFrom; beforeO = chunk.origFrom; }\n    }\n    return {edit: {before: beforeE, after: afterE}, orig: {before: beforeO, after: afterO}};\n  }\n\n  function collapseSingle(cm, from, to) {\n    cm.addLineClass(from, \"wrap\", \"CodeMirror-merge-collapsed-line\");\n    var widget = document.createElement(\"span\");\n    widget.className = \"CodeMirror-merge-collapsed-widget\";\n    widget.title = cm.phrase(\"Identical text collapsed. Click to expand.\");\n    var mark = cm.markText(Pos(from, 0), Pos(to - 1), {\n      inclusiveLeft: true,\n      inclusiveRight: true,\n      replacedWith: widget,\n      clearOnEnter: true\n    });\n    function clear() {\n      mark.clear();\n      cm.removeLineClass(from, \"wrap\", \"CodeMirror-merge-collapsed-line\");\n    }\n    if (mark.explicitlyCleared) clear();\n    CodeMirror.on(widget, \"click\", clear);\n    mark.on(\"clear\", clear);\n    CodeMirror.on(widget, \"click\", clear);\n    return {mark: mark, clear: clear};\n  }\n\n  function collapseStretch(size, editors) {\n    var marks = [];\n    function clear() {\n      for (var i = 0; i < marks.length; i++) marks[i].clear();\n    }\n    for (var i = 0; i < editors.length; i++) {\n      var editor = editors[i];\n      var mark = collapseSingle(editor.cm, editor.line, editor.line + size);\n      marks.push(mark);\n      mark.mark.on(\"clear\", clear);\n    }\n    return marks[0].mark;\n  }\n\n  function unclearNearChunks(dv, margin, off, clear) {\n    for (var i = 0; i < dv.chunks.length; i++) {\n      var chunk = dv.chunks[i];\n      for (var l = chunk.editFrom - margin; l < chunk.editTo + margin; l++) {\n        var pos = l + off;\n        if (pos >= 0 && pos < clear.length) clear[pos] = false;\n      }\n    }\n  }\n\n  function collapseIdenticalStretches(mv, margin) {\n    if (typeof margin != \"number\") margin = 2;\n    var clear = [], edit = mv.editor(), off = edit.firstLine();\n    for (var l = off, e = edit.lastLine(); l <= e; l++) clear.push(true);\n    if (mv.left) unclearNearChunks(mv.left, margin, off, clear);\n    if (mv.right) unclearNearChunks(mv.right, margin, off, clear);\n\n    for (var i = 0; i < clear.length; i++) {\n      if (clear[i]) {\n        var line = i + off;\n        for (var size = 1; i < clear.length - 1 && clear[i + 1]; i++, size++) {}\n        if (size > margin) {\n          var editors = [{line: line, cm: edit}];\n          if (mv.left) editors.push({line: getMatchingOrigLine(line, mv.left.chunks), cm: mv.left.orig});\n          if (mv.right) editors.push({line: getMatchingOrigLine(line, mv.right.chunks), cm: mv.right.orig});\n          var mark = collapseStretch(size, editors);\n          if (mv.options.onCollapse) mv.options.onCollapse(mv, line, size, mark);\n        }\n      }\n    }\n  }\n\n  // General utilities\n\n  function elt(tag, content, className, style) {\n    var e = document.createElement(tag);\n    if (className) e.className = className;\n    if (style) e.style.cssText = style;\n    if (typeof content == \"string\") e.appendChild(document.createTextNode(content));\n    else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);\n    return e;\n  }\n\n  function clear(node) {\n    for (var count = node.childNodes.length; count > 0; --count)\n      node.removeChild(node.firstChild);\n  }\n\n  function attrs(elt) {\n    for (var i = 1; i < arguments.length; i += 2)\n      elt.setAttribute(arguments[i], arguments[i+1]);\n  }\n\n  function copyObj(obj, target) {\n    if (!target) target = {};\n    for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop];\n    return target;\n  }\n\n  function moveOver(pos, str, copy, other) {\n    var out = copy ? Pos(pos.line, pos.ch) : pos, at = 0;\n    for (;;) {\n      var nl = str.indexOf(\"\\n\", at);\n      if (nl == -1) break;\n      ++out.line;\n      if (other) ++other.line;\n      at = nl + 1;\n    }\n    out.ch = (at ? 0 : out.ch) + (str.length - at);\n    if (other) other.ch = (at ? 0 : other.ch) + (str.length - at);\n    return out;\n  }\n\n  // Tracks collapsed markers and line widgets, in order to be able to\n  // accurately align the content of two editors.\n\n  var F_WIDGET = 1, F_WIDGET_BELOW = 2, F_MARKER = 4\n\n  function TrackAlignable(cm) {\n    this.cm = cm\n    this.alignable = []\n    this.height = cm.doc.height\n    var self = this\n    cm.on(\"markerAdded\", function(_, marker) {\n      if (!marker.collapsed) return\n      var found = marker.find(1)\n      if (found != null) self.set(found.line, F_MARKER)\n    })\n    cm.on(\"markerCleared\", function(_, marker, _min, max) {\n      if (max != null && marker.collapsed)\n        self.check(max, F_MARKER, self.hasMarker)\n    })\n    cm.on(\"markerChanged\", this.signal.bind(this))\n    cm.on(\"lineWidgetAdded\", function(_, widget, lineNo) {\n      if (widget.mergeSpacer) return\n      if (widget.above) self.set(lineNo - 1, F_WIDGET_BELOW)\n      else self.set(lineNo, F_WIDGET)\n    })\n    cm.on(\"lineWidgetCleared\", function(_, widget, lineNo) {\n      if (widget.mergeSpacer) return\n      if (widget.above) self.check(lineNo - 1, F_WIDGET_BELOW, self.hasWidgetBelow)\n      else self.check(lineNo, F_WIDGET, self.hasWidget)\n    })\n    cm.on(\"lineWidgetChanged\", this.signal.bind(this))\n    cm.on(\"change\", function(_, change) {\n      var start = change.from.line, nBefore = change.to.line - change.from.line\n      var nAfter = change.text.length - 1, end = start + nAfter\n      if (nBefore || nAfter) self.map(start, nBefore, nAfter)\n      self.check(end, F_MARKER, self.hasMarker)\n      if (nBefore || nAfter) self.check(change.from.line, F_MARKER, self.hasMarker)\n    })\n    cm.on(\"viewportChange\", function() {\n      if (self.cm.doc.height != self.height) self.signal()\n    })\n  }\n\n  TrackAlignable.prototype = {\n    signal: function() {\n      CodeMirror.signal(this, \"realign\")\n      this.height = this.cm.doc.height\n    },\n\n    set: function(n, flags) {\n      var pos = -1\n      for (; pos < this.alignable.length; pos += 2) {\n        var diff = this.alignable[pos] - n\n        if (diff == 0) {\n          if ((this.alignable[pos + 1] & flags) == flags) return\n          this.alignable[pos + 1] |= flags\n          this.signal()\n          return\n        }\n        if (diff > 0) break\n      }\n      this.signal()\n      this.alignable.splice(pos, 0, n, flags)\n    },\n\n    find: function(n) {\n      for (var i = 0; i < this.alignable.length; i += 2)\n        if (this.alignable[i] == n) return i\n      return -1\n    },\n\n    check: function(n, flag, pred) {\n      var found = this.find(n)\n      if (found == -1 || !(this.alignable[found + 1] & flag)) return\n      if (!pred.call(this, n)) {\n        this.signal()\n        var flags = this.alignable[found + 1] & ~flag\n        if (flags) this.alignable[found + 1] = flags\n        else this.alignable.splice(found, 2)\n      }\n    },\n\n    hasMarker: function(n) {\n      var handle = this.cm.getLineHandle(n)\n      if (handle.markedSpans) for (var i = 0; i < handle.markedSpans.length; i++)\n        if (handle.markedSpans[i].marker.collapsed && handle.markedSpans[i].to != null)\n          return true\n      return false\n    },\n\n    hasWidget: function(n) {\n      var handle = this.cm.getLineHandle(n)\n      if (handle.widgets) for (var i = 0; i < handle.widgets.length; i++)\n        if (!handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true\n      return false\n    },\n\n    hasWidgetBelow: function(n) {\n      if (n == this.cm.lastLine()) return false\n      var handle = this.cm.getLineHandle(n + 1)\n      if (handle.widgets) for (var i = 0; i < handle.widgets.length; i++)\n        if (handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true\n      return false\n    },\n\n    map: function(from, nBefore, nAfter) {\n      var diff = nAfter - nBefore, to = from + nBefore, widgetFrom = -1, widgetTo = -1\n      for (var i = 0; i < this.alignable.length; i += 2) {\n        var n = this.alignable[i]\n        if (n == from && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetFrom = i\n        if (n == to && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetTo = i\n        if (n <= from) continue\n        else if (n < to) this.alignable.splice(i--, 2)\n        else this.alignable[i] += diff\n      }\n      if (widgetFrom > -1) {\n        var flags = this.alignable[widgetFrom + 1]\n        if (flags == F_WIDGET_BELOW) this.alignable.splice(widgetFrom, 2)\n        else this.alignable[widgetFrom + 1] = flags & ~F_WIDGET_BELOW\n      }\n      if (widgetTo > -1 && nAfter)\n        this.set(from + nAfter, F_WIDGET_BELOW)\n    }\n  }\n\n  function posMin(a, b) { return (a.line - b.line || a.ch - b.ch) < 0 ? a : b; }\n  function posMax(a, b) { return (a.line - b.line || a.ch - b.ch) > 0 ? a : b; }\n  function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }\n\n  function findPrevDiff(chunks, start, isOrig) {\n    for (var i = chunks.length - 1; i >= 0; i--) {\n      var chunk = chunks[i];\n      var to = (isOrig ? chunk.origTo : chunk.editTo) - 1;\n      if (to < start) return to;\n    }\n  }\n\n  function findNextDiff(chunks, start, isOrig) {\n    for (var i = 0; i < chunks.length; i++) {\n      var chunk = chunks[i];\n      var from = (isOrig ? chunk.origFrom : chunk.editFrom);\n      if (from > start) return from;\n    }\n  }\n\n  function goNearbyDiff(cm, dir) {\n    var found = null, views = cm.state.diffViews, line = cm.getCursor().line;\n    if (views) for (var i = 0; i < views.length; i++) {\n      var dv = views[i], isOrig = cm == dv.orig;\n      ensureDiff(dv);\n      var pos = dir < 0 ? findPrevDiff(dv.chunks, line, isOrig) : findNextDiff(dv.chunks, line, isOrig);\n      if (pos != null && (found == null || (dir < 0 ? pos > found : pos < found)))\n        found = pos;\n    }\n    if (found != null)\n      cm.setCursor(found, 0);\n    else\n      return CodeMirror.Pass;\n  }\n\n  CodeMirror.commands.goNextDiff = function(cm) {\n    return goNearbyDiff(cm, 1);\n  };\n  CodeMirror.commands.goPrevDiff = function(cm) {\n    return goNearbyDiff(cm, -1);\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/mode/loadmode.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), \"cjs\");\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], function(CM) { mod(CM, \"amd\"); });\n  else // Plain browser env\n    mod(CodeMirror, \"plain\");\n})(function(CodeMirror, env) {\n  if (!CodeMirror.modeURL) CodeMirror.modeURL = \"../mode/%N/%N.js\";\n\n  var loading = {};\n  function splitCallback(cont, n) {\n    var countDown = n;\n    return function() { if (--countDown == 0) cont(); };\n  }\n  function ensureDeps(mode, cont, options) {\n    var modeObj = CodeMirror.modes[mode], deps = modeObj && modeObj.dependencies;\n    if (!deps) return cont();\n    var missing = [];\n    for (var i = 0; i < deps.length; ++i) {\n      if (!CodeMirror.modes.hasOwnProperty(deps[i]))\n        missing.push(deps[i]);\n    }\n    if (!missing.length) return cont();\n    var split = splitCallback(cont, missing.length);\n    for (var i = 0; i < missing.length; ++i)\n      CodeMirror.requireMode(missing[i], split, options);\n  }\n\n  CodeMirror.requireMode = function(mode, cont, options) {\n    if (typeof mode != \"string\") mode = mode.name;\n    if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont, options);\n    if (loading.hasOwnProperty(mode)) return loading[mode].push(cont);\n\n    var file = options && options.path ? options.path(mode) : CodeMirror.modeURL.replace(/%N/g, mode);\n    if (!options || !options.path) {\n        file = file.replace('.min.js', '.js');\n    }\n    if (options && options.loadMode) {\n      options.loadMode(file, function() { ensureDeps(mode, cont, options) })\n    } else if (env == \"plain\") {\n      var script = document.createElement(\"script\");\n      script.src = file;\n      var others = document.getElementsByTagName(\"script\")[0];\n      var list = loading[mode] = [cont];\n      CodeMirror.on(script, \"load\", function() {\n        ensureDeps(mode, function() {\n          for (var i = 0; i < list.length; ++i) list[i]();\n        }, options);\n      });\n      others.parentNode.insertBefore(script, others);\n    } else if (env == \"cjs\") {\n      require(file);\n      cont();\n    } else if (env == \"amd\") {\n      requirejs([file], cont);\n    }\n  };\n\n  CodeMirror.autoLoadMode = function(instance, mode, options) {\n    if (!CodeMirror.modes.hasOwnProperty(mode))\n      CodeMirror.requireMode(mode, function() {\n        instance.setOption(\"mode\", instance.getOption(\"mode\"));\n      }, options);\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/mode/multiplex.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.multiplexingMode = function(outer /*, others */) {\n  // Others should be {open, close, mode [, delimStyle] [, innerStyle] [, parseDelimiters]} objects\n  var others = Array.prototype.slice.call(arguments, 1);\n\n  function indexOf(string, pattern, from, returnEnd) {\n    if (typeof pattern == \"string\") {\n      var found = string.indexOf(pattern, from);\n      return returnEnd && found > -1 ? found + pattern.length : found;\n    }\n    var m = pattern.exec(from ? string.slice(from) : string);\n    return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1;\n  }\n\n  return {\n    startState: function() {\n      return {\n        outer: CodeMirror.startState(outer),\n        innerActive: null,\n        inner: null,\n        startingInner: false\n      };\n    },\n\n    copyState: function(state) {\n      return {\n        outer: CodeMirror.copyState(outer, state.outer),\n        innerActive: state.innerActive,\n        inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner),\n        startingInner: state.startingInner\n      };\n    },\n\n    token: function(stream, state) {\n      if (!state.innerActive) {\n        var cutOff = Infinity, oldContent = stream.string;\n        for (var i = 0; i < others.length; ++i) {\n          var other = others[i];\n          var found = indexOf(oldContent, other.open, stream.pos);\n          if (found == stream.pos) {\n            if (!other.parseDelimiters) stream.match(other.open);\n            state.startingInner = !!other.parseDelimiters\n            state.innerActive = other;\n\n            // Get the outer indent, making sure to handle CodeMirror.Pass\n            var outerIndent = 0;\n            if (outer.indent) {\n              var possibleOuterIndent = outer.indent(state.outer, \"\", \"\");\n              if (possibleOuterIndent !== CodeMirror.Pass) outerIndent = possibleOuterIndent;\n            }\n\n            state.inner = CodeMirror.startState(other.mode, outerIndent);\n            return other.delimStyle && (other.delimStyle + \" \" + other.delimStyle + \"-open\");\n          } else if (found != -1 && found < cutOff) {\n            cutOff = found;\n          }\n        }\n        if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);\n        var outerToken = outer.token(stream, state.outer);\n        if (cutOff != Infinity) stream.string = oldContent;\n        return outerToken;\n      } else {\n        var curInner = state.innerActive, oldContent = stream.string;\n        if (!curInner.close && stream.sol()) {\n          state.innerActive = state.inner = null;\n          return this.token(stream, state);\n        }\n        var found = curInner.close && !state.startingInner ?\n            indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;\n        if (found == stream.pos && !curInner.parseDelimiters) {\n          stream.match(curInner.close);\n          state.innerActive = state.inner = null;\n          return curInner.delimStyle && (curInner.delimStyle + \" \" + curInner.delimStyle + \"-close\");\n        }\n        if (found > -1) stream.string = oldContent.slice(0, found);\n        var innerToken = curInner.mode.token(stream, state.inner);\n        if (found > -1) stream.string = oldContent;\n        else if (stream.pos > stream.start) state.startingInner = false\n\n        if (found == stream.pos && curInner.parseDelimiters)\n          state.innerActive = state.inner = null;\n\n        if (curInner.innerStyle) {\n          if (innerToken) innerToken = innerToken + \" \" + curInner.innerStyle;\n          else innerToken = curInner.innerStyle;\n        }\n\n        return innerToken;\n      }\n    },\n\n    indent: function(state, textAfter, line) {\n      var mode = state.innerActive ? state.innerActive.mode : outer;\n      if (!mode.indent) return CodeMirror.Pass;\n      return mode.indent(state.innerActive ? state.inner : state.outer, textAfter, line);\n    },\n\n    blankLine: function(state) {\n      var mode = state.innerActive ? state.innerActive.mode : outer;\n      if (mode.blankLine) {\n        mode.blankLine(state.innerActive ? state.inner : state.outer);\n      }\n      if (!state.innerActive) {\n        for (var i = 0; i < others.length; ++i) {\n          var other = others[i];\n          if (other.open === \"\\n\") {\n            state.innerActive = other;\n            state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, \"\", \"\") : 0);\n          }\n        }\n      } else if (state.innerActive.close === \"\\n\") {\n        state.innerActive = state.inner = null;\n      }\n    },\n\n    electricChars: outer.electricChars,\n\n    innerMode: function(state) {\n      return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};\n    }\n  };\n};\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/mode/multiplex_test.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function() {\n  CodeMirror.defineMode(\"markdown_with_stex\", function(){\n    var inner = CodeMirror.getMode({}, \"stex\");\n    var outer = CodeMirror.getMode({}, \"markdown\");\n\n    var innerOptions = {\n      open: '$',\n      close: '$',\n      mode: inner,\n      delimStyle: 'delim',\n      innerStyle: 'inner'\n    };\n\n    return CodeMirror.multiplexingMode(outer, innerOptions);\n  });\n\n  var mode = CodeMirror.getMode({}, \"markdown_with_stex\");\n\n  function MT(name) {\n    test.mode(\n      name,\n      mode,\n      Array.prototype.slice.call(arguments, 1),\n      'multiplexing');\n  }\n\n  MT(\n    \"stexInsideMarkdown\",\n    \"[strong **Equation:**] [delim&delim-open $][inner&tag \\\\pi][delim&delim-close $]\");\n\n  CodeMirror.defineMode(\"identical_delim_multiplex\", function() {\n    return CodeMirror.multiplexingMode(CodeMirror.getMode({indentUnit: 2}, \"javascript\"), {\n      open: \"#\",\n      close: \"#\",\n      mode: CodeMirror.getMode({}, \"markdown\"),\n      parseDelimiters: true,\n      innerStyle: \"q\"\n    });\n  });\n\n  var mode2 = CodeMirror.getMode({}, \"identical_delim_multiplex\");\n\n  test.mode(\"identical_delimiters_with_parseDelimiters\", mode2, [\n    \"[keyword let] [def x] [operator =] [q #foo][q&em *bar*][q #];\"\n  ], \"multiplexing\")\n})();\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/mode/overlay.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Utility function that allows modes to be combined. The mode given\n// as the base argument takes care of most of the normal mode\n// functionality, but a second (typically simple) mode is used, which\n// can override the style of text. Both modes get to parse all of the\n// text, but when both assign a non-null style to a piece of code, the\n// overlay wins, unless the combine argument was true and not overridden,\n// or state.overlay.combineTokens was true, in which case the styles are\n// combined.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.overlayMode = function(base, overlay, combine) {\n  return {\n    startState: function() {\n      return {\n        base: CodeMirror.startState(base),\n        overlay: CodeMirror.startState(overlay),\n        basePos: 0, baseCur: null,\n        overlayPos: 0, overlayCur: null,\n        streamSeen: null\n      };\n    },\n    copyState: function(state) {\n      return {\n        base: CodeMirror.copyState(base, state.base),\n        overlay: CodeMirror.copyState(overlay, state.overlay),\n        basePos: state.basePos, baseCur: null,\n        overlayPos: state.overlayPos, overlayCur: null\n      };\n    },\n\n    token: function(stream, state) {\n      if (stream != state.streamSeen ||\n          Math.min(state.basePos, state.overlayPos) < stream.start) {\n        state.streamSeen = stream;\n        state.basePos = state.overlayPos = stream.start;\n      }\n\n      if (stream.start == state.basePos) {\n        state.baseCur = base.token(stream, state.base);\n        state.basePos = stream.pos;\n      }\n      if (stream.start == state.overlayPos) {\n        stream.pos = stream.start;\n        state.overlayCur = overlay.token(stream, state.overlay);\n        state.overlayPos = stream.pos;\n      }\n      stream.pos = Math.min(state.basePos, state.overlayPos);\n\n      // state.overlay.combineTokens always takes precedence over combine,\n      // unless set to null\n      if (state.overlayCur == null) return state.baseCur;\n      else if (state.baseCur != null &&\n               state.overlay.combineTokens ||\n               combine && state.overlay.combineTokens == null)\n        return state.baseCur + \" \" + state.overlayCur;\n      else return state.overlayCur;\n    },\n\n    indent: base.indent && function(state, textAfter, line) {\n      return base.indent(state.base, textAfter, line);\n    },\n    electricChars: base.electricChars,\n\n    innerMode: function(state) { return {state: state.base, mode: base}; },\n\n    blankLine: function(state) {\n      var baseToken, overlayToken;\n      if (base.blankLine) baseToken = base.blankLine(state.base);\n      if (overlay.blankLine) overlayToken = overlay.blankLine(state.overlay);\n\n      return overlayToken == null ?\n        baseToken :\n        (combine && baseToken != null ? baseToken + \" \" + overlayToken : overlayToken);\n    }\n  };\n};\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/mode/simple.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineSimpleMode = function(name, states) {\n    CodeMirror.defineMode(name, function(config) {\n      return CodeMirror.simpleMode(config, states);\n    });\n  };\n\n  CodeMirror.simpleMode = function(config, states) {\n    ensureState(states, \"start\");\n    var states_ = {}, meta = states.meta || {}, hasIndentation = false;\n    for (var state in states) if (state != meta && states.hasOwnProperty(state)) {\n      var list = states_[state] = [], orig = states[state];\n      for (var i = 0; i < orig.length; i++) {\n        var data = orig[i];\n        list.push(new Rule(data, states));\n        if (data.indent || data.dedent) hasIndentation = true;\n      }\n    }\n    var mode = {\n      startState: function() {\n        return {state: \"start\", pending: null,\n                local: null, localState: null,\n                indent: hasIndentation ? [] : null};\n      },\n      copyState: function(state) {\n        var s = {state: state.state, pending: state.pending,\n                 local: state.local, localState: null,\n                 indent: state.indent && state.indent.slice(0)};\n        if (state.localState)\n          s.localState = CodeMirror.copyState(state.local.mode, state.localState);\n        if (state.stack)\n          s.stack = state.stack.slice(0);\n        for (var pers = state.persistentStates; pers; pers = pers.next)\n          s.persistentStates = {mode: pers.mode,\n                                spec: pers.spec,\n                                state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state),\n                                next: s.persistentStates};\n        return s;\n      },\n      token: tokenFunction(states_, config),\n      innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; },\n      indent: indentFunction(states_, meta)\n    };\n    if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop))\n      mode[prop] = meta[prop];\n    return mode;\n  };\n\n  function ensureState(states, name) {\n    if (!states.hasOwnProperty(name))\n      throw new Error(\"Undefined state \" + name + \" in simple mode\");\n  }\n\n  function toRegex(val, caret) {\n    if (!val) return /(?:)/;\n    var flags = \"\";\n    if (val instanceof RegExp) {\n      if (val.ignoreCase) flags = \"i\";\n      if (val.unicode) flags += \"u\"\n      val = val.source;\n    } else {\n      val = String(val);\n    }\n    return new RegExp((caret === false ? \"\" : \"^\") + \"(?:\" + val + \")\", flags);\n  }\n\n  function asToken(val) {\n    if (!val) return null;\n    if (val.apply) return val\n    if (typeof val == \"string\") return val.replace(/\\./g, \" \");\n    var result = [];\n    for (var i = 0; i < val.length; i++)\n      result.push(val[i] && val[i].replace(/\\./g, \" \"));\n    return result;\n  }\n\n  function Rule(data, states) {\n    if (data.next || data.push) ensureState(states, data.next || data.push);\n    this.regex = toRegex(data.regex);\n    this.token = asToken(data.token);\n    this.data = data;\n  }\n\n  function tokenFunction(states, config) {\n    return function(stream, state) {\n      if (state.pending) {\n        var pend = state.pending.shift();\n        if (state.pending.length == 0) state.pending = null;\n        stream.pos += pend.text.length;\n        return pend.token;\n      }\n\n      if (state.local) {\n        if (state.local.end && stream.match(state.local.end)) {\n          var tok = state.local.endToken || null;\n          state.local = state.localState = null;\n          return tok;\n        } else {\n          var tok = state.local.mode.token(stream, state.localState), m;\n          if (state.local.endScan && (m = state.local.endScan.exec(stream.current())))\n            stream.pos = stream.start + m.index;\n          return tok;\n        }\n      }\n\n      var curState = states[state.state];\n      for (var i = 0; i < curState.length; i++) {\n        var rule = curState[i];\n        var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex);\n        if (matches) {\n          if (rule.data.next) {\n            state.state = rule.data.next;\n          } else if (rule.data.push) {\n            (state.stack || (state.stack = [])).push(state.state);\n            state.state = rule.data.push;\n          } else if (rule.data.pop && state.stack && state.stack.length) {\n            state.state = state.stack.pop();\n          }\n\n          if (rule.data.mode)\n            enterLocalMode(config, state, rule.data.mode, rule.token);\n          if (rule.data.indent)\n            state.indent.push(stream.indentation() + config.indentUnit);\n          if (rule.data.dedent)\n            state.indent.pop();\n          var token = rule.token\n          if (token && token.apply) token = token(matches)\n          if (matches.length > 2 && rule.token && typeof rule.token != \"string\") {\n            for (var j = 2; j < matches.length; j++)\n              if (matches[j])\n                (state.pending || (state.pending = [])).push({text: matches[j], token: rule.token[j - 1]});\n            stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));\n            return token[0];\n          } else if (token && token.join) {\n            return token[0];\n          } else {\n            return token;\n          }\n        }\n      }\n      stream.next();\n      return null;\n    };\n  }\n\n  function cmp(a, b) {\n    if (a === b) return true;\n    if (!a || typeof a != \"object\" || !b || typeof b != \"object\") return false;\n    var props = 0;\n    for (var prop in a) if (a.hasOwnProperty(prop)) {\n      if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false;\n      props++;\n    }\n    for (var prop in b) if (b.hasOwnProperty(prop)) props--;\n    return props == 0;\n  }\n\n  function enterLocalMode(config, state, spec, token) {\n    var pers;\n    if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next)\n      if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p;\n    var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec);\n    var lState = pers ? pers.state : CodeMirror.startState(mode);\n    if (spec.persistent && !pers)\n      state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates};\n\n    state.localState = lState;\n    state.local = {mode: mode,\n                   end: spec.end && toRegex(spec.end),\n                   endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false),\n                   endToken: token && token.join ? token[token.length - 1] : token};\n  }\n\n  function indexOf(val, arr) {\n    for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true;\n  }\n\n  function indentFunction(states, meta) {\n    return function(state, textAfter, line) {\n      if (state.local && state.local.mode.indent)\n        return state.local.mode.indent(state.localState, textAfter, line);\n      if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1)\n        return CodeMirror.Pass;\n\n      var pos = state.indent.length - 1, rules = states[state.state];\n      scan: for (;;) {\n        for (var i = 0; i < rules.length; i++) {\n          var rule = rules[i];\n          if (rule.data.dedent && rule.data.dedentIfLineStart !== false) {\n            var m = rule.regex.exec(textAfter);\n            if (m && m[0]) {\n              pos--;\n              if (rule.next || rule.push) rules = states[rule.next || rule.push];\n              textAfter = textAfter.slice(m[0].length);\n              continue scan;\n            }\n          }\n        }\n        break;\n      }\n      return pos < 0 ? 0 : state.indent[pos];\n    };\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/runmode/colorize.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./runmode\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./runmode\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var isBlock = /^(p|li|div|h\\\\d|pre|blockquote|td)$/;\n\n  function textContent(node, out) {\n    if (node.nodeType == 3) return out.push(node.nodeValue);\n    for (var ch = node.firstChild; ch; ch = ch.nextSibling) {\n      textContent(ch, out);\n      if (isBlock.test(node.nodeType)) out.push(\"\\n\");\n    }\n  }\n\n  CodeMirror.colorize = function(collection, defaultMode) {\n    if (!collection) collection = document.body.getElementsByTagName(\"pre\");\n\n    for (var i = 0; i < collection.length; ++i) {\n      var node = collection[i];\n      var mode = node.getAttribute(\"data-lang\") || defaultMode;\n      if (!mode) continue;\n\n      var text = [];\n      textContent(node, text);\n      node.innerHTML = \"\";\n      CodeMirror.runMode(text.join(\"\"), mode, node);\n\n      node.className += \" cm-s-default\";\n    }\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/runmode/runmode-standalone.js",
    "content": "(function () {\n  'use strict';\n\n  function copyObj(obj, target, overwrite) {\n    if (!target) { target = {}; }\n    for (var prop in obj)\n      { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n        { target[prop] = obj[prop]; } }\n    return target\n  }\n\n  // Counts the column offset in a string, taking tabs into account.\n  // Used mostly to find indentation.\n  function countColumn(string, end, tabSize, startIndex, startValue) {\n    if (end == null) {\n      end = string.search(/[^\\s\\u00a0]/);\n      if (end == -1) { end = string.length; }\n    }\n    for (var i = startIndex || 0, n = startValue || 0;;) {\n      var nextTab = string.indexOf(\"\\t\", i);\n      if (nextTab < 0 || nextTab >= end)\n        { return n + (end - i) }\n      n += nextTab - i;\n      n += tabSize - (n % tabSize);\n      i = nextTab + 1;\n    }\n  }\n\n  function nothing() {}\n\n  function createObj(base, props) {\n    var inst;\n    if (Object.create) {\n      inst = Object.create(base);\n    } else {\n      nothing.prototype = base;\n      inst = new nothing();\n    }\n    if (props) { copyObj(props, inst); }\n    return inst\n  }\n\n  // STRING STREAM\n\n  // Fed to the mode parsers, provides helper functions to make\n  // parsers more succinct.\n\n  var StringStream = function(string, tabSize, lineOracle) {\n    this.pos = this.start = 0;\n    this.string = string;\n    this.tabSize = tabSize || 8;\n    this.lastColumnPos = this.lastColumnValue = 0;\n    this.lineStart = 0;\n    this.lineOracle = lineOracle;\n  };\n\n  StringStream.prototype.eol = function () {return this.pos >= this.string.length};\n  StringStream.prototype.sol = function () {return this.pos == this.lineStart};\n  StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\n  StringStream.prototype.next = function () {\n    if (this.pos < this.string.length)\n      { return this.string.charAt(this.pos++) }\n  };\n  StringStream.prototype.eat = function (match) {\n    var ch = this.string.charAt(this.pos);\n    var ok;\n    if (typeof match == \"string\") { ok = ch == match; }\n    else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n    if (ok) {++this.pos; return ch}\n  };\n  StringStream.prototype.eatWhile = function (match) {\n    var start = this.pos;\n    while (this.eat(match)){}\n    return this.pos > start\n  };\n  StringStream.prototype.eatSpace = function () {\n    var start = this.pos;\n    while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }\n    return this.pos > start\n  };\n  StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\n  StringStream.prototype.skipTo = function (ch) {\n    var found = this.string.indexOf(ch, this.pos);\n    if (found > -1) {this.pos = found; return true}\n  };\n  StringStream.prototype.backUp = function (n) {this.pos -= n;};\n  StringStream.prototype.column = function () {\n    if (this.lastColumnPos < this.start) {\n      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n      this.lastColumnPos = this.start;\n    }\n    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.indentation = function () {\n    return countColumn(this.string, null, this.tabSize) -\n      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n    if (typeof pattern == \"string\") {\n      var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n      var substr = this.string.substr(this.pos, pattern.length);\n      if (cased(substr) == cased(pattern)) {\n        if (consume !== false) { this.pos += pattern.length; }\n        return true\n      }\n    } else {\n      var match = this.string.slice(this.pos).match(pattern);\n      if (match && match.index > 0) { return null }\n      if (match && consume !== false) { this.pos += match[0].length; }\n      return match\n    }\n  };\n  StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\n  StringStream.prototype.hideFirstChars = function (n, inner) {\n    this.lineStart += n;\n    try { return inner() }\n    finally { this.lineStart -= n; }\n  };\n  StringStream.prototype.lookAhead = function (n) {\n    var oracle = this.lineOracle;\n    return oracle && oracle.lookAhead(n)\n  };\n  StringStream.prototype.baseToken = function () {\n    var oracle = this.lineOracle;\n    return oracle && oracle.baseToken(this.pos)\n  };\n\n  // Known modes, by name and by MIME\n  var modes = {}, mimeModes = {};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  function defineMode(name, mode) {\n    if (arguments.length > 2)\n      { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n    modes[name] = mode;\n  }\n\n  function defineMIME(mime, spec) {\n    mimeModes[mime] = spec;\n  }\n\n  // Given a MIME type, a {name, ...options} config object, or a name\n  // string, return a mode config object.\n  function resolveMode(spec) {\n    if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n      spec = mimeModes[spec];\n    } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n      var found = mimeModes[spec.name];\n      if (typeof found == \"string\") { found = {name: found}; }\n      spec = createObj(found, spec);\n      spec.name = found.name;\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n      return resolveMode(\"application/xml\")\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n      return resolveMode(\"application/json\")\n    }\n    if (typeof spec == \"string\") { return {name: spec} }\n    else { return spec || {name: \"null\"} }\n  }\n\n  // Given a mode spec (anything that resolveMode accepts), find and\n  // initialize an actual mode object.\n  function getMode(options, spec) {\n    spec = resolveMode(spec);\n    var mfactory = modes[spec.name];\n    if (!mfactory) { return getMode(options, \"text/plain\") }\n    var modeObj = mfactory(options, spec);\n    if (modeExtensions.hasOwnProperty(spec.name)) {\n      var exts = modeExtensions[spec.name];\n      for (var prop in exts) {\n        if (!exts.hasOwnProperty(prop)) { continue }\n        if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n        modeObj[prop] = exts[prop];\n      }\n    }\n    modeObj.name = spec.name;\n    if (spec.helperType) { modeObj.helperType = spec.helperType; }\n    if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n      { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n    return modeObj\n  }\n\n  // This can be used to attach properties to mode objects from\n  // outside the actual mode definition.\n  var modeExtensions = {};\n  function extendMode(mode, properties) {\n    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n    copyObj(properties, exts);\n  }\n\n  function copyState(mode, state) {\n    if (state === true) { return state }\n    if (mode.copyState) { return mode.copyState(state) }\n    var nstate = {};\n    for (var n in state) {\n      var val = state[n];\n      if (val instanceof Array) { val = val.concat([]); }\n      nstate[n] = val;\n    }\n    return nstate\n  }\n\n  // Given a mode and a state (for that mode), find the inner mode and\n  // state at the position that the state refers to.\n  function innerMode(mode, state) {\n    var info;\n    while (mode.innerMode) {\n      info = mode.innerMode(state);\n      if (!info || info.mode == mode) { break }\n      state = info.state;\n      mode = info.mode;\n    }\n    return info || {mode: mode, state: state}\n  }\n\n  function startState(mode, a1, a2) {\n    return mode.startState ? mode.startState(a1, a2) : true\n  }\n\n  var modeMethods = {\n    __proto__: null,\n    modes: modes,\n    mimeModes: mimeModes,\n    defineMode: defineMode,\n    defineMIME: defineMIME,\n    resolveMode: resolveMode,\n    getMode: getMode,\n    modeExtensions: modeExtensions,\n    extendMode: extendMode,\n    copyState: copyState,\n    innerMode: innerMode,\n    startState: startState\n  };\n\n  // declare global: globalThis, CodeMirror\n\n  // Create a minimal CodeMirror needed to use runMode, and assign to root.\n  var root = typeof globalThis !== 'undefined' ? globalThis : window;\n  root.CodeMirror = {};\n\n  // Copy StringStream and mode methods into CodeMirror object.\n  CodeMirror.StringStream = StringStream;\n  for (var exported in modeMethods) { CodeMirror[exported] = modeMethods[exported]; }\n\n  // Minimal default mode.\n  CodeMirror.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\n  CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n  CodeMirror.registerHelper = CodeMirror.registerGlobalHelper = Math.min;\n  CodeMirror.splitLines = function(string) { return string.split(/\\r?\\n|\\r/) };\n  CodeMirror.countColumn = countColumn;\n\n  CodeMirror.defaults = { indentUnit: 2 };\n\n  // CodeMirror, copyright (c) by Marijn Haverbeke and others\n  // Distributed under an MIT license: https://codemirror.net/LICENSE\n\n  (function(mod) {\n    if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n      { mod(require(\"../../lib/codemirror\")); }\n    else if (typeof define == \"function\" && define.amd) // AMD\n      { define([\"../../lib/codemirror\"], mod); }\n    else // Plain browser env\n      { mod(CodeMirror); }\n  })(function(CodeMirror) {\n\n  CodeMirror.runMode = function(string, modespec, callback, options) {\n    var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);\n    var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;\n\n    // Create a tokenizing callback function if passed-in callback is a DOM element.\n    if (callback.appendChild) {\n      var ie = /MSIE \\d/.test(navigator.userAgent);\n      var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);\n      var node = callback, col = 0;\n      node.innerHTML = \"\";\n      callback = function(text, style) {\n        if (text == \"\\n\") {\n          // Emitting LF or CRLF on IE8 or earlier results in an incorrect display.\n          // Emitting a carriage return makes everything ok.\n          node.appendChild(document.createTextNode(ie_lt9 ? '\\r' : text));\n          col = 0;\n          return;\n        }\n        var content = \"\";\n        // replace tabs\n        for (var pos = 0;;) {\n          var idx = text.indexOf(\"\\t\", pos);\n          if (idx == -1) {\n            content += text.slice(pos);\n            col += text.length - pos;\n            break;\n          } else {\n            col += idx - pos;\n            content += text.slice(pos, idx);\n            var size = tabSize - col % tabSize;\n            col += size;\n            for (var i = 0; i < size; ++i) { content += \" \"; }\n            pos = idx + 1;\n          }\n        }\n        // Create a node with token style and append it to the callback DOM element.\n        if (style) {\n          var sp = node.appendChild(document.createElement(\"span\"));\n          sp.className = \"cm-\" + style.replace(/ +/g, \" cm-\");\n          sp.appendChild(document.createTextNode(content));\n        } else {\n          node.appendChild(document.createTextNode(content));\n        }\n      };\n    }\n\n    var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode);\n    for (var i = 0, e = lines.length; i < e; ++i) {\n      if (i) { callback(\"\\n\"); }\n      var stream = new CodeMirror.StringStream(lines[i], null, {\n        lookAhead: function(n) { return lines[i + n] },\n        baseToken: function() {}\n      });\n      if (!stream.string && mode.blankLine) { mode.blankLine(state); }\n      while (!stream.eol()) {\n        var style = mode.token(stream, state);\n        callback(stream.current(), style, i, stream.start, state, mode);\n        stream.start = stream.pos;\n      }\n    }\n  };\n\n  });\n\n}());\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/runmode/runmode.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.runMode = function(string, modespec, callback, options) {\n  var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);\n  var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;\n\n  // Create a tokenizing callback function if passed-in callback is a DOM element.\n  if (callback.appendChild) {\n    var ie = /MSIE \\d/.test(navigator.userAgent);\n    var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);\n    var node = callback, col = 0;\n    node.innerHTML = \"\";\n    callback = function(text, style) {\n      if (text == \"\\n\") {\n        // Emitting LF or CRLF on IE8 or earlier results in an incorrect display.\n        // Emitting a carriage return makes everything ok.\n        node.appendChild(document.createTextNode(ie_lt9 ? '\\r' : text));\n        col = 0;\n        return;\n      }\n      var content = \"\";\n      // replace tabs\n      for (var pos = 0;;) {\n        var idx = text.indexOf(\"\\t\", pos);\n        if (idx == -1) {\n          content += text.slice(pos);\n          col += text.length - pos;\n          break;\n        } else {\n          col += idx - pos;\n          content += text.slice(pos, idx);\n          var size = tabSize - col % tabSize;\n          col += size;\n          for (var i = 0; i < size; ++i) content += \" \";\n          pos = idx + 1;\n        }\n      }\n      // Create a node with token style and append it to the callback DOM element.\n      if (style) {\n        var sp = node.appendChild(document.createElement(\"span\"));\n        sp.className = \"cm-\" + style.replace(/ +/g, \" cm-\");\n        sp.appendChild(document.createTextNode(content));\n      } else {\n        node.appendChild(document.createTextNode(content));\n      }\n    };\n  }\n\n  var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode);\n  for (var i = 0, e = lines.length; i < e; ++i) {\n    if (i) callback(\"\\n\");\n    var stream = new CodeMirror.StringStream(lines[i], null, {\n      lookAhead: function(n) { return lines[i + n] },\n      baseToken: function() {}\n    });\n    if (!stream.string && mode.blankLine) mode.blankLine(state);\n    while (!stream.eol()) {\n      var style = mode.token(stream, state);\n      callback(stream.current(), style, i, stream.start, state, mode);\n      stream.start = stream.pos;\n    }\n  }\n};\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/runmode/runmode.node.js",
    "content": "'use strict';\n\nfunction copyObj(obj, target, overwrite) {\n  if (!target) { target = {}; }\n  for (var prop in obj)\n    { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n      { target[prop] = obj[prop]; } }\n  return target\n}\n\n// Counts the column offset in a string, taking tabs into account.\n// Used mostly to find indentation.\nfunction countColumn(string, end, tabSize, startIndex, startValue) {\n  if (end == null) {\n    end = string.search(/[^\\s\\u00a0]/);\n    if (end == -1) { end = string.length; }\n  }\n  for (var i = startIndex || 0, n = startValue || 0;;) {\n    var nextTab = string.indexOf(\"\\t\", i);\n    if (nextTab < 0 || nextTab >= end)\n      { return n + (end - i) }\n    n += nextTab - i;\n    n += tabSize - (n % tabSize);\n    i = nextTab + 1;\n  }\n}\n\nfunction nothing() {}\n\nfunction createObj(base, props) {\n  var inst;\n  if (Object.create) {\n    inst = Object.create(base);\n  } else {\n    nothing.prototype = base;\n    inst = new nothing();\n  }\n  if (props) { copyObj(props, inst); }\n  return inst\n}\n\n// STRING STREAM\n\n// Fed to the mode parsers, provides helper functions to make\n// parsers more succinct.\n\nvar StringStream = function(string, tabSize, lineOracle) {\n  this.pos = this.start = 0;\n  this.string = string;\n  this.tabSize = tabSize || 8;\n  this.lastColumnPos = this.lastColumnValue = 0;\n  this.lineStart = 0;\n  this.lineOracle = lineOracle;\n};\n\nStringStream.prototype.eol = function () {return this.pos >= this.string.length};\nStringStream.prototype.sol = function () {return this.pos == this.lineStart};\nStringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\nStringStream.prototype.next = function () {\n  if (this.pos < this.string.length)\n    { return this.string.charAt(this.pos++) }\n};\nStringStream.prototype.eat = function (match) {\n  var ch = this.string.charAt(this.pos);\n  var ok;\n  if (typeof match == \"string\") { ok = ch == match; }\n  else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n  if (ok) {++this.pos; return ch}\n};\nStringStream.prototype.eatWhile = function (match) {\n  var start = this.pos;\n  while (this.eat(match)){}\n  return this.pos > start\n};\nStringStream.prototype.eatSpace = function () {\n  var start = this.pos;\n  while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }\n  return this.pos > start\n};\nStringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\nStringStream.prototype.skipTo = function (ch) {\n  var found = this.string.indexOf(ch, this.pos);\n  if (found > -1) {this.pos = found; return true}\n};\nStringStream.prototype.backUp = function (n) {this.pos -= n;};\nStringStream.prototype.column = function () {\n  if (this.lastColumnPos < this.start) {\n    this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n    this.lastColumnPos = this.start;\n  }\n  return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n};\nStringStream.prototype.indentation = function () {\n  return countColumn(this.string, null, this.tabSize) -\n    (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n};\nStringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n  if (typeof pattern == \"string\") {\n    var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n    var substr = this.string.substr(this.pos, pattern.length);\n    if (cased(substr) == cased(pattern)) {\n      if (consume !== false) { this.pos += pattern.length; }\n      return true\n    }\n  } else {\n    var match = this.string.slice(this.pos).match(pattern);\n    if (match && match.index > 0) { return null }\n    if (match && consume !== false) { this.pos += match[0].length; }\n    return match\n  }\n};\nStringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\nStringStream.prototype.hideFirstChars = function (n, inner) {\n  this.lineStart += n;\n  try { return inner() }\n  finally { this.lineStart -= n; }\n};\nStringStream.prototype.lookAhead = function (n) {\n  var oracle = this.lineOracle;\n  return oracle && oracle.lookAhead(n)\n};\nStringStream.prototype.baseToken = function () {\n  var oracle = this.lineOracle;\n  return oracle && oracle.baseToken(this.pos)\n};\n\n// Known modes, by name and by MIME\nvar modes = {}, mimeModes = {};\n\n// Extra arguments are stored as the mode's dependencies, which is\n// used by (legacy) mechanisms like loadmode.js to automatically\n// load a mode. (Preferred mechanism is the require/define calls.)\nfunction defineMode(name, mode) {\n  if (arguments.length > 2)\n    { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n  modes[name] = mode;\n}\n\nfunction defineMIME(mime, spec) {\n  mimeModes[mime] = spec;\n}\n\n// Given a MIME type, a {name, ...options} config object, or a name\n// string, return a mode config object.\nfunction resolveMode(spec) {\n  if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n    spec = mimeModes[spec];\n  } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n    var found = mimeModes[spec.name];\n    if (typeof found == \"string\") { found = {name: found}; }\n    spec = createObj(found, spec);\n    spec.name = found.name;\n  } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n    return resolveMode(\"application/xml\")\n  } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n    return resolveMode(\"application/json\")\n  }\n  if (typeof spec == \"string\") { return {name: spec} }\n  else { return spec || {name: \"null\"} }\n}\n\n// Given a mode spec (anything that resolveMode accepts), find and\n// initialize an actual mode object.\nfunction getMode(options, spec) {\n  spec = resolveMode(spec);\n  var mfactory = modes[spec.name];\n  if (!mfactory) { return getMode(options, \"text/plain\") }\n  var modeObj = mfactory(options, spec);\n  if (modeExtensions.hasOwnProperty(spec.name)) {\n    var exts = modeExtensions[spec.name];\n    for (var prop in exts) {\n      if (!exts.hasOwnProperty(prop)) { continue }\n      if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n      modeObj[prop] = exts[prop];\n    }\n  }\n  modeObj.name = spec.name;\n  if (spec.helperType) { modeObj.helperType = spec.helperType; }\n  if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n    { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n  return modeObj\n}\n\n// This can be used to attach properties to mode objects from\n// outside the actual mode definition.\nvar modeExtensions = {};\nfunction extendMode(mode, properties) {\n  var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n  copyObj(properties, exts);\n}\n\nfunction copyState(mode, state) {\n  if (state === true) { return state }\n  if (mode.copyState) { return mode.copyState(state) }\n  var nstate = {};\n  for (var n in state) {\n    var val = state[n];\n    if (val instanceof Array) { val = val.concat([]); }\n    nstate[n] = val;\n  }\n  return nstate\n}\n\n// Given a mode and a state (for that mode), find the inner mode and\n// state at the position that the state refers to.\nfunction innerMode(mode, state) {\n  var info;\n  while (mode.innerMode) {\n    info = mode.innerMode(state);\n    if (!info || info.mode == mode) { break }\n    state = info.state;\n    mode = info.mode;\n  }\n  return info || {mode: mode, state: state}\n}\n\nfunction startState(mode, a1, a2) {\n  return mode.startState ? mode.startState(a1, a2) : true\n}\n\nvar modeMethods = {\n  __proto__: null,\n  modes: modes,\n  mimeModes: mimeModes,\n  defineMode: defineMode,\n  defineMIME: defineMIME,\n  resolveMode: resolveMode,\n  getMode: getMode,\n  modeExtensions: modeExtensions,\n  extendMode: extendMode,\n  copyState: copyState,\n  innerMode: innerMode,\n  startState: startState\n};\n\n// Copy StringStream and mode methods into exports (CodeMirror) object.\nexports.StringStream = StringStream;\nexports.countColumn = countColumn;\nfor (var exported in modeMethods) { exports[exported] = modeMethods[exported]; }\n\n// Shim library CodeMirror with the minimal CodeMirror defined above.\nrequire.cache[require.resolve(\"../../lib/codemirror\")] = require.cache[require.resolve(\"./runmode.node\")];\nrequire.cache[require.resolve(\"../../addon/runmode/runmode\")] = require.cache[require.resolve(\"./runmode.node\")];\n\n// Minimal default mode.\nexports.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\nexports.defineMIME(\"text/plain\", \"null\");\n\nexports.registerHelper = exports.registerGlobalHelper = Math.min;\nexports.splitLines = function(string) { return string.split(/\\r?\\n|\\r/) };\n\nexports.defaults = { indentUnit: 2 };\n\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    { mod(require(\"../../lib/codemirror\")); }\n  else if (typeof define == \"function\" && define.amd) // AMD\n    { define([\"../../lib/codemirror\"], mod); }\n  else // Plain browser env\n    { mod(CodeMirror); }\n})(function(CodeMirror) {\n\nCodeMirror.runMode = function(string, modespec, callback, options) {\n  var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);\n  var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;\n\n  // Create a tokenizing callback function if passed-in callback is a DOM element.\n  if (callback.appendChild) {\n    var ie = /MSIE \\d/.test(navigator.userAgent);\n    var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);\n    var node = callback, col = 0;\n    node.innerHTML = \"\";\n    callback = function(text, style) {\n      if (text == \"\\n\") {\n        // Emitting LF or CRLF on IE8 or earlier results in an incorrect display.\n        // Emitting a carriage return makes everything ok.\n        node.appendChild(document.createTextNode(ie_lt9 ? '\\r' : text));\n        col = 0;\n        return;\n      }\n      var content = \"\";\n      // replace tabs\n      for (var pos = 0;;) {\n        var idx = text.indexOf(\"\\t\", pos);\n        if (idx == -1) {\n          content += text.slice(pos);\n          col += text.length - pos;\n          break;\n        } else {\n          col += idx - pos;\n          content += text.slice(pos, idx);\n          var size = tabSize - col % tabSize;\n          col += size;\n          for (var i = 0; i < size; ++i) { content += \" \"; }\n          pos = idx + 1;\n        }\n      }\n      // Create a node with token style and append it to the callback DOM element.\n      if (style) {\n        var sp = node.appendChild(document.createElement(\"span\"));\n        sp.className = \"cm-\" + style.replace(/ +/g, \" cm-\");\n        sp.appendChild(document.createTextNode(content));\n      } else {\n        node.appendChild(document.createTextNode(content));\n      }\n    };\n  }\n\n  var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode);\n  for (var i = 0, e = lines.length; i < e; ++i) {\n    if (i) { callback(\"\\n\"); }\n    var stream = new CodeMirror.StringStream(lines[i], null, {\n      lookAhead: function(n) { return lines[i + n] },\n      baseToken: function() {}\n    });\n    if (!stream.string && mode.blankLine) { mode.blankLine(state); }\n    while (!stream.eol()) {\n      var style = mode.token(stream, state);\n      callback(stream.current(), style, i, stream.start, state, mode);\n      stream.start = stream.pos;\n    }\n  }\n};\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/scroll/annotatescrollbar.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineExtension(\"annotateScrollbar\", function(options) {\n    if (typeof options == \"string\") options = {className: options};\n    return new Annotation(this, options);\n  });\n\n  CodeMirror.defineOption(\"scrollButtonHeight\", 0);\n\n  function Annotation(cm, options) {\n    this.cm = cm;\n    this.options = options;\n    this.buttonHeight = options.scrollButtonHeight || cm.getOption(\"scrollButtonHeight\");\n    this.annotations = [];\n    this.doRedraw = this.doUpdate = null;\n    this.div = cm.getWrapperElement().appendChild(document.createElement(\"div\"));\n    this.div.style.cssText = \"position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none\";\n    this.computeScale();\n\n    function scheduleRedraw(delay) {\n      clearTimeout(self.doRedraw);\n      self.doRedraw = setTimeout(function() { self.redraw(); }, delay);\n    }\n\n    var self = this;\n    cm.on(\"refresh\", this.resizeHandler = function() {\n      clearTimeout(self.doUpdate);\n      self.doUpdate = setTimeout(function() {\n        if (self.computeScale()) scheduleRedraw(20);\n      }, 100);\n    });\n    cm.on(\"markerAdded\", this.resizeHandler);\n    cm.on(\"markerCleared\", this.resizeHandler);\n    if (options.listenForChanges !== false)\n      cm.on(\"changes\", this.changeHandler = function() {\n        scheduleRedraw(250);\n      });\n  }\n\n  Annotation.prototype.computeScale = function() {\n    var cm = this.cm;\n    var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight - this.buttonHeight * 2) /\n      cm.getScrollerElement().scrollHeight\n    if (hScale != this.hScale) {\n      this.hScale = hScale;\n      return true;\n    }\n  };\n\n  Annotation.prototype.update = function(annotations) {\n    this.annotations = annotations;\n    this.redraw();\n  };\n\n  Annotation.prototype.redraw = function(compute) {\n    if (compute !== false) this.computeScale();\n    var cm = this.cm, hScale = this.hScale;\n\n    var frag = document.createDocumentFragment(), anns = this.annotations;\n\n    var wrapping = cm.getOption(\"lineWrapping\");\n    var singleLineH = wrapping && cm.defaultTextHeight() * 1.5;\n    var curLine = null, curLineObj = null;\n\n    function getY(pos, top) {\n      if (curLine != pos.line) {\n        curLine = pos.line\n        curLineObj = cm.getLineHandle(pos.line)\n        var visual = cm.getLineHandleVisualStart(curLineObj)\n        if (visual != curLineObj) {\n          curLine = cm.getLineNumber(visual)\n          curLineObj = visual\n        }\n      }\n      if ((curLineObj.widgets && curLineObj.widgets.length) ||\n          (wrapping && curLineObj.height > singleLineH))\n        return cm.charCoords(pos, \"local\")[top ? \"top\" : \"bottom\"];\n      var topY = cm.heightAtLine(curLineObj, \"local\");\n      return topY + (top ? 0 : curLineObj.height);\n    }\n\n    var lastLine = cm.lastLine()\n    if (cm.display.barWidth) for (var i = 0, nextTop; i < anns.length; i++) {\n      var ann = anns[i];\n      if (ann.to.line > lastLine) continue;\n      var top = nextTop || getY(ann.from, true) * hScale;\n      var bottom = getY(ann.to, false) * hScale;\n      while (i < anns.length - 1) {\n        if (anns[i + 1].to.line > lastLine) break;\n        nextTop = getY(anns[i + 1].from, true) * hScale;\n        if (nextTop > bottom + .9) break;\n        ann = anns[++i];\n        bottom = getY(ann.to, false) * hScale;\n      }\n      if (bottom == top) continue;\n      var height = Math.max(bottom - top, 3);\n\n      var elt = frag.appendChild(document.createElement(\"div\"));\n      elt.style.cssText = \"position: absolute; right: 0px; width: \" + Math.max(cm.display.barWidth - 1, 2) + \"px; top: \"\n        + (top + this.buttonHeight) + \"px; height: \" + height + \"px\";\n      elt.className = this.options.className;\n      if (ann.id) {\n        elt.setAttribute(\"annotation-id\", ann.id);\n      }\n    }\n    this.div.textContent = \"\";\n    this.div.appendChild(frag);\n  };\n\n  Annotation.prototype.clear = function() {\n    this.cm.off(\"refresh\", this.resizeHandler);\n    this.cm.off(\"markerAdded\", this.resizeHandler);\n    this.cm.off(\"markerCleared\", this.resizeHandler);\n    if (this.changeHandler) this.cm.off(\"changes\", this.changeHandler);\n    this.div.parentNode.removeChild(this.div);\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/scroll/scrollpastend.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"scrollPastEnd\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.off(\"change\", onChange);\n      cm.off(\"refresh\", updateBottomMargin);\n      cm.display.lineSpace.parentNode.style.paddingBottom = \"\";\n      cm.state.scrollPastEndPadding = null;\n    }\n    if (val) {\n      cm.on(\"change\", onChange);\n      cm.on(\"refresh\", updateBottomMargin);\n      updateBottomMargin(cm);\n    }\n  });\n\n  function onChange(cm, change) {\n    if (CodeMirror.changeEnd(change).line == cm.lastLine())\n      updateBottomMargin(cm);\n  }\n\n  function updateBottomMargin(cm) {\n    var padding = \"\";\n    if (cm.lineCount() > 1) {\n      var totalH = cm.display.scroller.clientHeight - 30,\n          lastLineH = cm.getLineHandle(cm.lastLine()).height;\n      padding = (totalH - lastLineH) + \"px\";\n    }\n    if (cm.state.scrollPastEndPadding != padding) {\n      cm.state.scrollPastEndPadding = padding;\n      cm.display.lineSpace.parentNode.style.paddingBottom = padding;\n      cm.off(\"refresh\", updateBottomMargin);\n      cm.setSize();\n      cm.on(\"refresh\", updateBottomMargin);\n    }\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/scroll/simplescrollbars.css",
    "content": ".CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div {\n  position: absolute;\n  background: #ccc;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  border: 1px solid #bbb;\n  border-radius: 2px;\n}\n\n.CodeMirror-simplescroll-horizontal, .CodeMirror-simplescroll-vertical {\n  position: absolute;\n  z-index: 6;\n  background: #eee;\n}\n\n.CodeMirror-simplescroll-horizontal {\n  bottom: 0; left: 0;\n  height: 8px;\n}\n.CodeMirror-simplescroll-horizontal div {\n  bottom: 0;\n  height: 100%;\n}\n\n.CodeMirror-simplescroll-vertical {\n  right: 0; top: 0;\n  width: 8px;\n}\n.CodeMirror-simplescroll-vertical div {\n  right: 0;\n  width: 100%;\n}\n\n\n.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler, .CodeMirror-overlayscroll .CodeMirror-gutter-filler {\n  display: none;\n}\n\n.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div {\n  position: absolute;\n  background: #bcd;\n  border-radius: 3px;\n}\n\n.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical {\n  position: absolute;\n  z-index: 6;\n}\n\n.CodeMirror-overlayscroll-horizontal {\n  bottom: 0; left: 0;\n  height: 6px;\n}\n.CodeMirror-overlayscroll-horizontal div {\n  bottom: 0;\n  height: 100%;\n}\n\n.CodeMirror-overlayscroll-vertical {\n  right: 0; top: 0;\n  width: 6px;\n}\n.CodeMirror-overlayscroll-vertical div {\n  right: 0;\n  width: 100%;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/scroll/simplescrollbars.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function Bar(cls, orientation, scroll) {\n    this.orientation = orientation;\n    this.scroll = scroll;\n    this.screen = this.total = this.size = 1;\n    this.pos = 0;\n\n    this.node = document.createElement(\"div\");\n    this.node.className = cls + \"-\" + orientation;\n    this.inner = this.node.appendChild(document.createElement(\"div\"));\n\n    var self = this;\n    CodeMirror.on(this.inner, \"mousedown\", function(e) {\n      if (e.which != 1) return;\n      CodeMirror.e_preventDefault(e);\n      var axis = self.orientation == \"horizontal\" ? \"pageX\" : \"pageY\";\n      var start = e[axis], startpos = self.pos;\n      function done() {\n        CodeMirror.off(document, \"mousemove\", move);\n        CodeMirror.off(document, \"mouseup\", done);\n      }\n      function move(e) {\n        if (e.which != 1) return done();\n        self.moveTo(startpos + (e[axis] - start) * (self.total / self.size));\n      }\n      CodeMirror.on(document, \"mousemove\", move);\n      CodeMirror.on(document, \"mouseup\", done);\n    });\n\n    CodeMirror.on(this.node, \"click\", function(e) {\n      CodeMirror.e_preventDefault(e);\n      var innerBox = self.inner.getBoundingClientRect(), where;\n      if (self.orientation == \"horizontal\")\n        where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0;\n      else\n        where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0;\n      self.moveTo(self.pos + where * self.screen);\n    });\n\n    function onWheel(e) {\n      var moved = CodeMirror.wheelEventPixels(e)[self.orientation == \"horizontal\" ? \"x\" : \"y\"];\n      var oldPos = self.pos;\n      self.moveTo(self.pos + moved);\n      if (self.pos != oldPos) CodeMirror.e_preventDefault(e);\n    }\n    CodeMirror.on(this.node, \"mousewheel\", onWheel);\n    CodeMirror.on(this.node, \"DOMMouseScroll\", onWheel);\n  }\n\n  Bar.prototype.setPos = function(pos, force) {\n    if (pos < 0) pos = 0;\n    if (pos > this.total - this.screen) pos = this.total - this.screen;\n    if (!force && pos == this.pos) return false;\n    this.pos = pos;\n    this.inner.style[this.orientation == \"horizontal\" ? \"left\" : \"top\"] =\n      (pos * (this.size / this.total)) + \"px\";\n    return true\n  };\n\n  Bar.prototype.moveTo = function(pos) {\n    if (this.setPos(pos)) this.scroll(pos, this.orientation);\n  }\n\n  var minButtonSize = 10;\n\n  Bar.prototype.update = function(scrollSize, clientSize, barSize) {\n    var sizeChanged = this.screen != clientSize || this.total != scrollSize || this.size != barSize\n    if (sizeChanged) {\n      this.screen = clientSize;\n      this.total = scrollSize;\n      this.size = barSize;\n    }\n\n    var buttonSize = this.screen * (this.size / this.total);\n    if (buttonSize < minButtonSize) {\n      this.size -= minButtonSize - buttonSize;\n      buttonSize = minButtonSize;\n    }\n    this.inner.style[this.orientation == \"horizontal\" ? \"width\" : \"height\"] =\n      buttonSize + \"px\";\n    this.setPos(this.pos, sizeChanged);\n  };\n\n  function SimpleScrollbars(cls, place, scroll) {\n    this.addClass = cls;\n    this.horiz = new Bar(cls, \"horizontal\", scroll);\n    place(this.horiz.node);\n    this.vert = new Bar(cls, \"vertical\", scroll);\n    place(this.vert.node);\n    this.width = null;\n  }\n\n  SimpleScrollbars.prototype.update = function(measure) {\n    if (this.width == null) {\n      var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle;\n      if (style) this.width = parseInt(style.height);\n    }\n    var width = this.width || 0;\n\n    var needsH = measure.scrollWidth > measure.clientWidth + 1;\n    var needsV = measure.scrollHeight > measure.clientHeight + 1;\n    this.vert.node.style.display = needsV ? \"block\" : \"none\";\n    this.horiz.node.style.display = needsH ? \"block\" : \"none\";\n\n    if (needsV) {\n      this.vert.update(measure.scrollHeight, measure.clientHeight,\n                       measure.viewHeight - (needsH ? width : 0));\n      this.vert.node.style.bottom = needsH ? width + \"px\" : \"0\";\n    }\n    if (needsH) {\n      this.horiz.update(measure.scrollWidth, measure.clientWidth,\n                        measure.viewWidth - (needsV ? width : 0) - measure.barLeft);\n      this.horiz.node.style.right = needsV ? width + \"px\" : \"0\";\n      this.horiz.node.style.left = measure.barLeft + \"px\";\n    }\n\n    return {right: needsV ? width : 0, bottom: needsH ? width : 0};\n  };\n\n  SimpleScrollbars.prototype.setScrollTop = function(pos) {\n    this.vert.setPos(pos);\n  };\n\n  SimpleScrollbars.prototype.setScrollLeft = function(pos) {\n    this.horiz.setPos(pos);\n  };\n\n  SimpleScrollbars.prototype.clear = function() {\n    var parent = this.horiz.node.parentNode;\n    parent.removeChild(this.horiz.node);\n    parent.removeChild(this.vert.node);\n  };\n\n  CodeMirror.scrollbarModel.simple = function(place, scroll) {\n    return new SimpleScrollbars(\"CodeMirror-simplescroll\", place, scroll);\n  };\n  CodeMirror.scrollbarModel.overlay = function(place, scroll) {\n    return new SimpleScrollbars(\"CodeMirror-overlayscroll\", place, scroll);\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/search/jump-to-line.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Defines jumpToLine command. Uses dialog.js if present.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../dialog/dialog\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../dialog/dialog\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  // default search panel location\n  CodeMirror.defineOption(\"search\", {bottom: false});\n\n  function dialog(cm, text, shortText, deflt, f) {\n    if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom});\n    else f(prompt(shortText, deflt));\n  }\n\n  function getJumpDialog(cm) {\n    return cm.phrase(\"Jump to line:\") + ' <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">' + cm.phrase(\"(Use line:column or scroll% syntax)\") + '</span>';\n  }\n\n  function interpretLine(cm, string) {\n    var num = Number(string)\n    if (/^[-+]/.test(string)) return cm.getCursor().line + num\n    else return num - 1\n  }\n\n  CodeMirror.commands.jumpToLine = function(cm) {\n    var cur = cm.getCursor();\n    dialog(cm, getJumpDialog(cm), cm.phrase(\"Jump to line:\"), (cur.line + 1) + \":\" + cur.ch, function(posStr) {\n      if (!posStr) return;\n\n      var match;\n      if (match = /^\\s*([\\+\\-]?\\d+)\\s*\\:\\s*(\\d+)\\s*$/.exec(posStr)) {\n        cm.setCursor(interpretLine(cm, match[1]), Number(match[2]))\n      } else if (match = /^\\s*([\\+\\-]?\\d+(\\.\\d+)?)\\%\\s*/.exec(posStr)) {\n        var line = Math.round(cm.lineCount() * Number(match[1]) / 100);\n        if (/^[-+]/.test(match[1])) line = cur.line + line + 1;\n        cm.setCursor(line - 1, cur.ch);\n      } else if (match = /^\\s*\\:?\\s*([\\+\\-]?\\d+)\\s*/.exec(posStr)) {\n        cm.setCursor(interpretLine(cm, match[1]), cur.ch);\n      }\n    });\n  };\n\n  CodeMirror.keyMap[\"default\"][\"Alt-G\"] = \"jumpToLine\";\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/search/match-highlighter.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Highlighting text that matches the selection\n//\n// Defines an option highlightSelectionMatches, which, when enabled,\n// will style strings that match the selection throughout the\n// document.\n//\n// The option can be set to true to simply enable it, or to a\n// {minChars, style, wordsOnly, showToken, delay} object to explicitly\n// configure it. minChars is the minimum amount of characters that should be\n// selected for the behavior to occur, and style is the token style to\n// apply to the matches. This will be prefixed by \"cm-\" to create an\n// actual CSS class name. If wordsOnly is enabled, the matches will be\n// highlighted only if the selected text is a word. showToken, when enabled,\n// will cause the current token to be highlighted when nothing is selected.\n// delay is used to specify how much time to wait, in milliseconds, before\n// highlighting the matches. If annotateScrollbar is enabled, the occurrences\n// will be highlighted on the scrollbar via the matchesonscrollbar addon.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./matchesonscrollbar\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./matchesonscrollbar\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var defaults = {\n    style: \"matchhighlight\",\n    minChars: 2,\n    delay: 100,\n    wordsOnly: false,\n    annotateScrollbar: false,\n    showToken: false,\n    trim: true\n  }\n\n  function State(options) {\n    this.options = {}\n    for (var name in defaults)\n      this.options[name] = (options && options.hasOwnProperty(name) ? options : defaults)[name]\n    this.overlay = this.timeout = null;\n    this.matchesonscroll = null;\n    this.active = false;\n  }\n\n  CodeMirror.defineOption(\"highlightSelectionMatches\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      removeOverlay(cm);\n      clearTimeout(cm.state.matchHighlighter.timeout);\n      cm.state.matchHighlighter = null;\n      cm.off(\"cursorActivity\", cursorActivity);\n      cm.off(\"focus\", onFocus)\n    }\n    if (val) {\n      var state = cm.state.matchHighlighter = new State(val);\n      if (cm.hasFocus()) {\n        state.active = true\n        highlightMatches(cm)\n      } else {\n        cm.on(\"focus\", onFocus)\n      }\n      cm.on(\"cursorActivity\", cursorActivity);\n    }\n  });\n\n  function cursorActivity(cm) {\n    var state = cm.state.matchHighlighter;\n    if (state.active || cm.hasFocus()) scheduleHighlight(cm, state)\n  }\n\n  function onFocus(cm) {\n    var state = cm.state.matchHighlighter\n    if (!state.active) {\n      state.active = true\n      scheduleHighlight(cm, state)\n    }\n  }\n\n  function scheduleHighlight(cm, state) {\n    clearTimeout(state.timeout);\n    state.timeout = setTimeout(function() {highlightMatches(cm);}, state.options.delay);\n  }\n\n  function addOverlay(cm, query, hasBoundary, style) {\n    var state = cm.state.matchHighlighter;\n    cm.addOverlay(state.overlay = makeOverlay(query, hasBoundary, style));\n    if (state.options.annotateScrollbar && cm.showMatchesOnScrollbar) {\n      var searchFor = hasBoundary ? new RegExp((/\\w/.test(query.charAt(0)) ? \"\\\\b\" : \"\") +\n                                               query.replace(/[\\\\\\[.+*?(){|^$]/g, \"\\\\$&\") +\n                                               (/\\w/.test(query.charAt(query.length - 1)) ? \"\\\\b\" : \"\")) : query;\n      state.matchesonscroll = cm.showMatchesOnScrollbar(searchFor, false,\n        {className: \"CodeMirror-selection-highlight-scrollbar\"});\n    }\n  }\n\n  function removeOverlay(cm) {\n    var state = cm.state.matchHighlighter;\n    if (state.overlay) {\n      cm.removeOverlay(state.overlay);\n      state.overlay = null;\n      if (state.matchesonscroll) {\n        state.matchesonscroll.clear();\n        state.matchesonscroll = null;\n      }\n    }\n  }\n\n  function highlightMatches(cm) {\n    cm.operation(function() {\n      var state = cm.state.matchHighlighter;\n      removeOverlay(cm);\n      if (!cm.somethingSelected() && state.options.showToken) {\n        var re = state.options.showToken === true ? /[\\w$]/ : state.options.showToken;\n        var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start;\n        while (start && re.test(line.charAt(start - 1))) --start;\n        while (end < line.length && re.test(line.charAt(end))) ++end;\n        if (start < end)\n          addOverlay(cm, line.slice(start, end), re, state.options.style);\n        return;\n      }\n      var from = cm.getCursor(\"from\"), to = cm.getCursor(\"to\");\n      if (from.line != to.line) return;\n      if (state.options.wordsOnly && !isWord(cm, from, to)) return;\n      var selection = cm.getRange(from, to)\n      if (state.options.trim) selection = selection.replace(/^\\s+|\\s+$/g, \"\")\n      if (selection.length >= state.options.minChars)\n        addOverlay(cm, selection, false, state.options.style);\n    });\n  }\n\n  function isWord(cm, from, to) {\n    var str = cm.getRange(from, to);\n    if (str.match(/^\\w+$/) !== null) {\n        if (from.ch > 0) {\n            var pos = {line: from.line, ch: from.ch - 1};\n            var chr = cm.getRange(pos, from);\n            if (chr.match(/\\W/) === null) return false;\n        }\n        if (to.ch < cm.getLine(from.line).length) {\n            var pos = {line: to.line, ch: to.ch + 1};\n            var chr = cm.getRange(to, pos);\n            if (chr.match(/\\W/) === null) return false;\n        }\n        return true;\n    } else return false;\n  }\n\n  function boundariesAround(stream, re) {\n    return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) &&\n      (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos)));\n  }\n\n  function makeOverlay(query, hasBoundary, style) {\n    return {token: function(stream) {\n      if (stream.match(query) &&\n          (!hasBoundary || boundariesAround(stream, hasBoundary)))\n        return style;\n      stream.next();\n      stream.skipTo(query.charAt(0)) || stream.skipToEnd();\n    }};\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/search/matchesonscrollbar.css",
    "content": ".CodeMirror-search-match {\n  background: gold;\n  border-top: 1px solid orange;\n  border-bottom: 1px solid orange;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  opacity: .5;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/search/matchesonscrollbar.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./searchcursor\"), require(\"../scroll/annotatescrollbar\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./searchcursor\", \"../scroll/annotatescrollbar\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineExtension(\"showMatchesOnScrollbar\", function(query, caseFold, options) {\n    if (typeof options == \"string\") options = {className: options};\n    if (!options) options = {};\n    return new SearchAnnotation(this, query, caseFold, options);\n  });\n\n  function SearchAnnotation(cm, query, caseFold, options) {\n    this.cm = cm;\n    this.options = options;\n    var annotateOptions = {listenForChanges: false};\n    for (var prop in options) annotateOptions[prop] = options[prop];\n    if (!annotateOptions.className) annotateOptions.className = \"CodeMirror-search-match\";\n    this.annotation = cm.annotateScrollbar(annotateOptions);\n    this.query = query;\n    this.caseFold = caseFold;\n    this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1};\n    this.matches = [];\n    this.update = null;\n\n    this.findMatches();\n    this.annotation.update(this.matches);\n\n    var self = this;\n    cm.on(\"change\", this.changeHandler = function(_cm, change) { self.onChange(change); });\n  }\n\n  var MAX_MATCHES = 1000;\n\n  SearchAnnotation.prototype.findMatches = function() {\n    if (!this.gap) return;\n    for (var i = 0; i < this.matches.length; i++) {\n      var match = this.matches[i];\n      if (match.from.line >= this.gap.to) break;\n      if (match.to.line >= this.gap.from) this.matches.splice(i--, 1);\n    }\n    var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), {caseFold: this.caseFold, multiline: this.options.multiline});\n    var maxMatches = this.options && this.options.maxMatches || MAX_MATCHES;\n    while (cursor.findNext()) {\n      var match = {from: cursor.from(), to: cursor.to()};\n      if (match.from.line >= this.gap.to) break;\n      this.matches.splice(i++, 0, match);\n      if (this.matches.length > maxMatches) break;\n    }\n    this.gap = null;\n  };\n\n  function offsetLine(line, changeStart, sizeChange) {\n    if (line <= changeStart) return line;\n    return Math.max(changeStart, line + sizeChange);\n  }\n\n  SearchAnnotation.prototype.onChange = function(change) {\n    var startLine = change.from.line;\n    var endLine = CodeMirror.changeEnd(change).line;\n    var sizeChange = endLine - change.to.line;\n    if (this.gap) {\n      this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line);\n      this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line);\n    } else {\n      this.gap = {from: change.from.line, to: endLine + 1};\n    }\n\n    if (sizeChange) for (var i = 0; i < this.matches.length; i++) {\n      var match = this.matches[i];\n      var newFrom = offsetLine(match.from.line, startLine, sizeChange);\n      if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch);\n      var newTo = offsetLine(match.to.line, startLine, sizeChange);\n      if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch);\n    }\n    clearTimeout(this.update);\n    var self = this;\n    this.update = setTimeout(function() { self.updateAfterChange(); }, 250);\n  };\n\n  SearchAnnotation.prototype.updateAfterChange = function() {\n    this.findMatches();\n    this.annotation.update(this.matches);\n  };\n\n  SearchAnnotation.prototype.clear = function() {\n    this.cm.off(\"change\", this.changeHandler);\n    this.annotation.clear();\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/search/search.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Define search commands. Depends on dialog.js or another\n// implementation of the openDialog method.\n\n// Replace works a little oddly -- it will do the replace on the next\n// Ctrl-G (or whatever is bound to findNext) press. You prevent a\n// replace by making sure the match is no longer selected when hitting\n// Ctrl-G.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./searchcursor\"), require(\"../dialog/dialog\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./searchcursor\", \"../dialog/dialog\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  // default search panel location\n  CodeMirror.defineOption(\"search\", {bottom: false});\n\n  function searchOverlay(query, caseInsensitive) {\n    if (typeof query == \"string\")\n      query = new RegExp(query.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\"), caseInsensitive ? \"gi\" : \"g\");\n    else if (!query.global)\n      query = new RegExp(query.source, query.ignoreCase ? \"gi\" : \"g\");\n\n    return {token: function(stream) {\n      query.lastIndex = stream.pos;\n      var match = query.exec(stream.string);\n      if (match && match.index == stream.pos) {\n        stream.pos += match[0].length || 1;\n        return \"searching\";\n      } else if (match) {\n        stream.pos = match.index;\n      } else {\n        stream.skipToEnd();\n      }\n    }};\n  }\n\n  function SearchState() {\n    this.posFrom = this.posTo = this.lastQuery = this.query = null;\n    this.overlay = null;\n  }\n\n  function getSearchState(cm) {\n    return cm.state.search || (cm.state.search = new SearchState());\n  }\n\n  function queryCaseInsensitive(query) {\n    return typeof query == \"string\" && query == query.toLowerCase();\n  }\n\n  function getSearchCursor(cm, query, pos) {\n    // Heuristic: if the query string is all lowercase, do a case insensitive search.\n    return cm.getSearchCursor(query, pos, {caseFold: queryCaseInsensitive(query), multiline: true});\n  }\n\n  function persistentDialog(cm, text, deflt, onEnter, onKeyDown) {\n    cm.openDialog(text, onEnter, {\n      value: deflt,\n      selectValueOnOpen: true,\n      closeOnEnter: false,\n      onClose: function() { clearSearch(cm); },\n      onKeyDown: onKeyDown,\n      bottom: cm.options.search.bottom\n    });\n  }\n\n  function dialog(cm, text, shortText, deflt, f) {\n    if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom});\n    else f(prompt(shortText, deflt));\n  }\n\n  function confirmDialog(cm, text, shortText, fs) {\n    if (cm.openConfirm) cm.openConfirm(text, fs);\n    else if (confirm(shortText)) fs[0]();\n  }\n\n  function parseString(string) {\n    return string.replace(/\\\\([nrt\\\\])/g, function(match, ch) {\n      if (ch == \"n\") return \"\\n\"\n      if (ch == \"r\") return \"\\r\"\n      if (ch == \"t\") return \"\\t\"\n      if (ch == \"\\\\\") return \"\\\\\"\n      return match\n    })\n  }\n\n  function parseQuery(query) {\n    var isRE = query.match(/^\\/(.*)\\/([a-z]*)$/);\n    if (isRE) {\n      try { query = new RegExp(isRE[1], isRE[2].indexOf(\"i\") == -1 ? \"\" : \"i\"); }\n      catch(e) {} // Not a regular expression after all, do a string search\n    } else {\n      query = parseString(query)\n    }\n    if (typeof query == \"string\" ? query == \"\" : query.test(\"\"))\n      query = /x^/;\n    return query;\n  }\n\n  function startSearch(cm, state, query) {\n    state.queryText = query;\n    state.query = parseQuery(query);\n    cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query));\n    state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query));\n    cm.addOverlay(state.overlay);\n    if (cm.showMatchesOnScrollbar) {\n      if (state.annotate) { state.annotate.clear(); state.annotate = null; }\n      state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query));\n    }\n  }\n\n  function doSearch(cm, rev, persistent, immediate) {\n    var state = getSearchState(cm);\n    if (state.query) return findNext(cm, rev);\n    var q = cm.getSelection() || state.lastQuery;\n    if (q instanceof RegExp && q.source == \"x^\") q = null\n    if (persistent && cm.openDialog) {\n      var hiding = null\n      var searchNext = function(query, event) {\n        CodeMirror.e_stop(event);\n        if (!query) return;\n        if (query != state.queryText) {\n          startSearch(cm, state, query);\n          state.posFrom = state.posTo = cm.getCursor();\n        }\n        if (hiding) hiding.style.opacity = 1\n        findNext(cm, event.shiftKey, function(_, to) {\n          var dialog\n          if (to.line < 3 && document.querySelector &&\n              (dialog = cm.display.wrapper.querySelector(\".CodeMirror-dialog\")) &&\n              dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, \"window\").top)\n            (hiding = dialog).style.opacity = .4\n        })\n      };\n      persistentDialog(cm, getQueryDialog(cm), q, searchNext, function(event, query) {\n        var keyName = CodeMirror.keyName(event)\n        var extra = cm.getOption('extraKeys'), cmd = (extra && extra[keyName]) || CodeMirror.keyMap[cm.getOption(\"keyMap\")][keyName]\n        if (cmd == \"findNext\" || cmd == \"findPrev\" ||\n          cmd == \"findPersistentNext\" || cmd == \"findPersistentPrev\") {\n          CodeMirror.e_stop(event);\n          startSearch(cm, getSearchState(cm), query);\n          cm.execCommand(cmd);\n        } else if (cmd == \"find\" || cmd == \"findPersistent\") {\n          CodeMirror.e_stop(event);\n          searchNext(query, event);\n        }\n      });\n      if (immediate && q) {\n        startSearch(cm, state, q);\n        findNext(cm, rev);\n      }\n    } else {\n      dialog(cm, getQueryDialog(cm), \"Search for:\", q, function(query) {\n        if (query && !state.query) cm.operation(function() {\n          startSearch(cm, state, query);\n          state.posFrom = state.posTo = cm.getCursor();\n          findNext(cm, rev);\n        });\n      });\n    }\n  }\n\n  function findNext(cm, rev, callback) {cm.operation(function() {\n    var state = getSearchState(cm);\n    var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo);\n    if (!cursor.find(rev)) {\n      cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0));\n      if (!cursor.find(rev)) return;\n    }\n    cm.setSelection(cursor.from(), cursor.to());\n    cm.scrollIntoView({from: cursor.from(), to: cursor.to()}, 20);\n    state.posFrom = cursor.from(); state.posTo = cursor.to();\n    if (callback) callback(cursor.from(), cursor.to())\n  });}\n\n  function clearSearch(cm) {cm.operation(function() {\n    var state = getSearchState(cm);\n    state.lastQuery = state.query;\n    if (!state.query) return;\n    state.query = state.queryText = null;\n    cm.removeOverlay(state.overlay);\n    if (state.annotate) { state.annotate.clear(); state.annotate = null; }\n  });}\n\n  function el(tag, attrs) {\n    var element = tag ? document.createElement(tag) : document.createDocumentFragment();\n    for (var key in attrs) {\n      element[key] = attrs[key];\n    }\n    for (var i = 2; i < arguments.length; i++) {\n      var child = arguments[i]\n      element.appendChild(typeof child == \"string\" ? document.createTextNode(child) : child);\n    }\n    return element;\n  }\n\n  function getQueryDialog(cm)  {\n    return el(\"\", null,\n              el(\"span\", {className: \"CodeMirror-search-label\"}, cm.phrase(\"Search:\")), \" \",\n              el(\"input\", {type: \"text\", \"style\": \"width: 10em\", className: \"CodeMirror-search-field\"}), \" \",\n              el(\"span\", {style: \"color: #888\", className: \"CodeMirror-search-hint\"},\n                 cm.phrase(\"(Use /re/ syntax for regexp search)\")));\n  }\n  function getReplaceQueryDialog(cm) {\n    return el(\"\", null, \" \",\n              el(\"input\", {type: \"text\", \"style\": \"width: 10em\", className: \"CodeMirror-search-field\"}), \" \",\n              el(\"span\", {style: \"color: #888\", className: \"CodeMirror-search-hint\"},\n                 cm.phrase(\"(Use /re/ syntax for regexp search)\")));\n  }\n  function getReplacementQueryDialog(cm) {\n    return el(\"\", null,\n              el(\"span\", {className: \"CodeMirror-search-label\"}, cm.phrase(\"With:\")), \" \",\n              el(\"input\", {type: \"text\", \"style\": \"width: 10em\", className: \"CodeMirror-search-field\"}));\n  }\n  function getDoReplaceConfirm(cm) {\n    return el(\"\", null,\n              el(\"span\", {className: \"CodeMirror-search-label\"}, cm.phrase(\"Replace?\")), \" \",\n              el(\"button\", {}, cm.phrase(\"Yes\")), \" \",\n              el(\"button\", {}, cm.phrase(\"No\")), \" \",\n              el(\"button\", {}, cm.phrase(\"All\")), \" \",\n              el(\"button\", {}, cm.phrase(\"Stop\")));\n  }\n\n  function replaceAll(cm, query, text) {\n    cm.operation(function() {\n      for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {\n        if (typeof query != \"string\") {\n          var match = cm.getRange(cursor.from(), cursor.to()).match(query);\n          cursor.replace(text.replace(/\\$(\\d)/g, function(_, i) {return match[i];}));\n        } else cursor.replace(text);\n      }\n    });\n  }\n\n  function replace(cm, all) {\n    if (cm.getOption(\"readOnly\")) return;\n    var query = cm.getSelection() || getSearchState(cm).lastQuery;\n    var dialogText = all ? cm.phrase(\"Replace all:\") : cm.phrase(\"Replace:\")\n    var fragment = el(\"\", null,\n                      el(\"span\", {className: \"CodeMirror-search-label\"}, dialogText),\n                      getReplaceQueryDialog(cm))\n    dialog(cm, fragment, dialogText, query, function(query) {\n      if (!query) return;\n      query = parseQuery(query);\n      dialog(cm, getReplacementQueryDialog(cm), cm.phrase(\"Replace with:\"), \"\", function(text) {\n        text = parseString(text)\n        if (all) {\n          replaceAll(cm, query, text)\n        } else {\n          clearSearch(cm);\n          var cursor = getSearchCursor(cm, query, cm.getCursor(\"from\"));\n          var advance = function() {\n            var start = cursor.from(), match;\n            if (!(match = cursor.findNext())) {\n              cursor = getSearchCursor(cm, query);\n              if (!(match = cursor.findNext()) ||\n                  (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return;\n            }\n            cm.setSelection(cursor.from(), cursor.to());\n            cm.scrollIntoView({from: cursor.from(), to: cursor.to()});\n            confirmDialog(cm, getDoReplaceConfirm(cm), cm.phrase(\"Replace?\"),\n                          [function() {doReplace(match);}, advance,\n                           function() {replaceAll(cm, query, text)}]);\n          };\n          var doReplace = function(match) {\n            cursor.replace(typeof query == \"string\" ? text :\n                           text.replace(/\\$(\\d)/g, function(_, i) {return match[i];}));\n            advance();\n          };\n          advance();\n        }\n      });\n    });\n  }\n\n  CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);};\n  CodeMirror.commands.findPersistent = function(cm) {clearSearch(cm); doSearch(cm, false, true);};\n  CodeMirror.commands.findPersistentNext = function(cm) {doSearch(cm, false, true, true);};\n  CodeMirror.commands.findPersistentPrev = function(cm) {doSearch(cm, true, true, true);};\n  CodeMirror.commands.findNext = doSearch;\n  CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);};\n  CodeMirror.commands.clearSearch = clearSearch;\n  CodeMirror.commands.replace = replace;\n  CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);};\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/search/searchcursor.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n  var Pos = CodeMirror.Pos\n\n  function regexpFlags(regexp) {\n    var flags = regexp.flags\n    return flags != null ? flags : (regexp.ignoreCase ? \"i\" : \"\")\n      + (regexp.global ? \"g\" : \"\")\n      + (regexp.multiline ? \"m\" : \"\")\n  }\n\n  function ensureFlags(regexp, flags) {\n    var current = regexpFlags(regexp), target = current\n    for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1)\n      target += flags.charAt(i)\n    return current == target ? regexp : new RegExp(regexp.source, target)\n  }\n\n  function maybeMultiline(regexp) {\n    return /\\\\s|\\\\n|\\n|\\\\W|\\\\D|\\[\\^/.test(regexp.source)\n  }\n\n  function searchRegexpForward(doc, regexp, start) {\n    regexp = ensureFlags(regexp, \"g\")\n    for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) {\n      regexp.lastIndex = ch\n      var string = doc.getLine(line), match = regexp.exec(string)\n      if (match)\n        return {from: Pos(line, match.index),\n                to: Pos(line, match.index + match[0].length),\n                match: match}\n    }\n  }\n\n  function searchRegexpForwardMultiline(doc, regexp, start) {\n    if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start)\n\n    regexp = ensureFlags(regexp, \"gm\")\n    var string, chunk = 1\n    for (var line = start.line, last = doc.lastLine(); line <= last;) {\n      // This grows the search buffer in exponentially-sized chunks\n      // between matches, so that nearby matches are fast and don't\n      // require concatenating the whole document (in case we're\n      // searching for something that has tons of matches), but at the\n      // same time, the amount of retries is limited.\n      for (var i = 0; i < chunk; i++) {\n        if (line > last) break\n        var curLine = doc.getLine(line++)\n        string = string == null ? curLine : string + \"\\n\" + curLine\n      }\n      chunk = chunk * 2\n      regexp.lastIndex = start.ch\n      var match = regexp.exec(string)\n      if (match) {\n        var before = string.slice(0, match.index).split(\"\\n\"), inside = match[0].split(\"\\n\")\n        var startLine = start.line + before.length - 1, startCh = before[before.length - 1].length\n        return {from: Pos(startLine, startCh),\n                to: Pos(startLine + inside.length - 1,\n                        inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),\n                match: match}\n      }\n    }\n  }\n\n  function lastMatchIn(string, regexp, endMargin) {\n    var match, from = 0\n    while (from <= string.length) {\n      regexp.lastIndex = from\n      var newMatch = regexp.exec(string)\n      if (!newMatch) break\n      var end = newMatch.index + newMatch[0].length\n      if (end > string.length - endMargin) break\n      if (!match || end > match.index + match[0].length)\n        match = newMatch\n      from = newMatch.index + 1\n    }\n    return match\n  }\n\n  function searchRegexpBackward(doc, regexp, start) {\n    regexp = ensureFlags(regexp, \"g\")\n    for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) {\n      var string = doc.getLine(line)\n      var match = lastMatchIn(string, regexp, ch < 0 ? 0 : string.length - ch)\n      if (match)\n        return {from: Pos(line, match.index),\n                to: Pos(line, match.index + match[0].length),\n                match: match}\n    }\n  }\n\n  function searchRegexpBackwardMultiline(doc, regexp, start) {\n    if (!maybeMultiline(regexp)) return searchRegexpBackward(doc, regexp, start)\n    regexp = ensureFlags(regexp, \"gm\")\n    var string, chunkSize = 1, endMargin = doc.getLine(start.line).length - start.ch\n    for (var line = start.line, first = doc.firstLine(); line >= first;) {\n      for (var i = 0; i < chunkSize && line >= first; i++) {\n        var curLine = doc.getLine(line--)\n        string = string == null ? curLine : curLine + \"\\n\" + string\n      }\n      chunkSize *= 2\n\n      var match = lastMatchIn(string, regexp, endMargin)\n      if (match) {\n        var before = string.slice(0, match.index).split(\"\\n\"), inside = match[0].split(\"\\n\")\n        var startLine = line + before.length, startCh = before[before.length - 1].length\n        return {from: Pos(startLine, startCh),\n                to: Pos(startLine + inside.length - 1,\n                        inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),\n                match: match}\n      }\n    }\n  }\n\n  var doFold, noFold\n  if (String.prototype.normalize) {\n    doFold = function(str) { return str.normalize(\"NFD\").toLowerCase() }\n    noFold = function(str) { return str.normalize(\"NFD\") }\n  } else {\n    doFold = function(str) { return str.toLowerCase() }\n    noFold = function(str) { return str }\n  }\n\n  // Maps a position in a case-folded line back to a position in the original line\n  // (compensating for codepoints increasing in number during folding)\n  function adjustPos(orig, folded, pos, foldFunc) {\n    if (orig.length == folded.length) return pos\n    for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) {\n      if (min == max) return min\n      var mid = (min + max) >> 1\n      var len = foldFunc(orig.slice(0, mid)).length\n      if (len == pos) return mid\n      else if (len > pos) max = mid\n      else min = mid + 1\n    }\n  }\n\n  function searchStringForward(doc, query, start, caseFold) {\n    // Empty string would match anything and never progress, so we\n    // define it to match nothing instead.\n    if (!query.length) return null\n    var fold = caseFold ? doFold : noFold\n    var lines = fold(query).split(/\\r|\\n\\r?/)\n\n    search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) {\n      var orig = doc.getLine(line).slice(ch), string = fold(orig)\n      if (lines.length == 1) {\n        var found = string.indexOf(lines[0])\n        if (found == -1) continue search\n        var start = adjustPos(orig, string, found, fold) + ch\n        return {from: Pos(line, adjustPos(orig, string, found, fold) + ch),\n                to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch)}\n      } else {\n        var cutFrom = string.length - lines[0].length\n        if (string.slice(cutFrom) != lines[0]) continue search\n        for (var i = 1; i < lines.length - 1; i++)\n          if (fold(doc.getLine(line + i)) != lines[i]) continue search\n        var end = doc.getLine(line + lines.length - 1), endString = fold(end), lastLine = lines[lines.length - 1]\n        if (endString.slice(0, lastLine.length) != lastLine) continue search\n        return {from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch),\n                to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold))}\n      }\n    }\n  }\n\n  function searchStringBackward(doc, query, start, caseFold) {\n    if (!query.length) return null\n    var fold = caseFold ? doFold : noFold\n    var lines = fold(query).split(/\\r|\\n\\r?/)\n\n    search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) {\n      var orig = doc.getLine(line)\n      if (ch > -1) orig = orig.slice(0, ch)\n      var string = fold(orig)\n      if (lines.length == 1) {\n        var found = string.lastIndexOf(lines[0])\n        if (found == -1) continue search\n        return {from: Pos(line, adjustPos(orig, string, found, fold)),\n                to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold))}\n      } else {\n        var lastLine = lines[lines.length - 1]\n        if (string.slice(0, lastLine.length) != lastLine) continue search\n        for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++)\n          if (fold(doc.getLine(start + i)) != lines[i]) continue search\n        var top = doc.getLine(line + 1 - lines.length), topString = fold(top)\n        if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search\n        return {from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)),\n                to: Pos(line, adjustPos(orig, string, lastLine.length, fold))}\n      }\n    }\n  }\n\n  function SearchCursor(doc, query, pos, options) {\n    this.atOccurrence = false\n    this.afterEmptyMatch = false\n    this.doc = doc\n    pos = pos ? doc.clipPos(pos) : Pos(0, 0)\n    this.pos = {from: pos, to: pos}\n\n    var caseFold\n    if (typeof options == \"object\") {\n      caseFold = options.caseFold\n    } else { // Backwards compat for when caseFold was the 4th argument\n      caseFold = options\n      options = null\n    }\n\n    if (typeof query == \"string\") {\n      if (caseFold == null) caseFold = false\n      this.matches = function(reverse, pos) {\n        return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos, caseFold)\n      }\n    } else {\n      query = ensureFlags(query, \"gm\")\n      if (!options || options.multiline !== false)\n        this.matches = function(reverse, pos) {\n          return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos)\n        }\n      else\n        this.matches = function(reverse, pos) {\n          return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos)\n        }\n    }\n  }\n\n  SearchCursor.prototype = {\n    findNext: function() {return this.find(false)},\n    findPrevious: function() {return this.find(true)},\n\n    find: function(reverse) {\n      var head = this.doc.clipPos(reverse ? this.pos.from : this.pos.to);\n      if (this.afterEmptyMatch && this.atOccurrence) {\n        // do not return the same 0 width match twice\n        head = Pos(head.line, head.ch)\n        if (reverse) {\n          head.ch--;\n          if (head.ch < 0) {\n            head.line--;\n            head.ch = (this.doc.getLine(head.line) || \"\").length;\n          }\n        } else {\n          head.ch++;\n          if (head.ch > (this.doc.getLine(head.line) || \"\").length) {\n            head.ch = 0;\n            head.line++;\n          }\n        }\n        if (CodeMirror.cmpPos(head, this.doc.clipPos(head)) != 0) {\n           return this.atOccurrence = false\n        }\n      }\n      var result = this.matches(reverse, head)\n      this.afterEmptyMatch = result && CodeMirror.cmpPos(result.from, result.to) == 0\n\n      if (result) {\n        this.pos = result\n        this.atOccurrence = true\n        return this.pos.match || true\n      } else {\n        var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0)\n        this.pos = {from: end, to: end}\n        return this.atOccurrence = false\n      }\n    },\n\n    from: function() {if (this.atOccurrence) return this.pos.from},\n    to: function() {if (this.atOccurrence) return this.pos.to},\n\n    replace: function(newText, origin) {\n      if (!this.atOccurrence) return\n      var lines = CodeMirror.splitLines(newText)\n      this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin)\n      this.pos.to = Pos(this.pos.from.line + lines.length - 1,\n                        lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0))\n    }\n  }\n\n  CodeMirror.defineExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n    return new SearchCursor(this.doc, query, pos, caseFold)\n  })\n  CodeMirror.defineDocExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n    return new SearchCursor(this, query, pos, caseFold)\n  })\n\n  CodeMirror.defineExtension(\"selectMatches\", function(query, caseFold) {\n    var ranges = []\n    var cur = this.getSearchCursor(query, this.getCursor(\"from\"), caseFold)\n    while (cur.findNext()) {\n      if (CodeMirror.cmpPos(cur.to(), this.getCursor(\"to\")) > 0) break\n      ranges.push({anchor: cur.from(), head: cur.to()})\n    }\n    if (ranges.length)\n      this.setSelections(ranges, 0)\n  })\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/selection/active-line.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  var WRAP_CLASS = \"CodeMirror-activeline\";\n  var BACK_CLASS = \"CodeMirror-activeline-background\";\n  var GUTT_CLASS = \"CodeMirror-activeline-gutter\";\n\n  CodeMirror.defineOption(\"styleActiveLine\", false, function(cm, val, old) {\n    var prev = old == CodeMirror.Init ? false : old;\n    if (val == prev) return\n    if (prev) {\n      cm.off(\"beforeSelectionChange\", selectionChange);\n      clearActiveLines(cm);\n      delete cm.state.activeLines;\n    }\n    if (val) {\n      cm.state.activeLines = [];\n      updateActiveLines(cm, cm.listSelections());\n      cm.on(\"beforeSelectionChange\", selectionChange);\n    }\n  });\n\n  function clearActiveLines(cm) {\n    for (var i = 0; i < cm.state.activeLines.length; i++) {\n      cm.removeLineClass(cm.state.activeLines[i], \"wrap\", WRAP_CLASS);\n      cm.removeLineClass(cm.state.activeLines[i], \"background\", BACK_CLASS);\n      cm.removeLineClass(cm.state.activeLines[i], \"gutter\", GUTT_CLASS);\n    }\n  }\n\n  function sameArray(a, b) {\n    if (a.length != b.length) return false;\n    for (var i = 0; i < a.length; i++)\n      if (a[i] != b[i]) return false;\n    return true;\n  }\n\n  function updateActiveLines(cm, ranges) {\n    var active = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i];\n      var option = cm.getOption(\"styleActiveLine\");\n      if (typeof option == \"object\" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty())\n        continue\n      var line = cm.getLineHandleVisualStart(range.head.line);\n      if (active[active.length - 1] != line) active.push(line);\n    }\n    if (sameArray(cm.state.activeLines, active)) return;\n    cm.operation(function() {\n      clearActiveLines(cm);\n      for (var i = 0; i < active.length; i++) {\n        cm.addLineClass(active[i], \"wrap\", WRAP_CLASS);\n        cm.addLineClass(active[i], \"background\", BACK_CLASS);\n        cm.addLineClass(active[i], \"gutter\", GUTT_CLASS);\n      }\n      cm.state.activeLines = active;\n    });\n  }\n\n  function selectionChange(cm, sel) {\n    updateActiveLines(cm, sel.ranges);\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/selection/mark-selection.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Because sometimes you need to mark the selected *text*.\n//\n// Adds an option 'styleSelectedText' which, when enabled, gives\n// selected text the CSS class given as option value, or\n// \"CodeMirror-selectedtext\" when the value is not a string.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"styleSelectedText\", false, function(cm, val, old) {\n    var prev = old && old != CodeMirror.Init;\n    if (val && !prev) {\n      cm.state.markedSelection = [];\n      cm.state.markedSelectionStyle = typeof val == \"string\" ? val : \"CodeMirror-selectedtext\";\n      reset(cm);\n      cm.on(\"cursorActivity\", onCursorActivity);\n      cm.on(\"change\", onChange);\n    } else if (!val && prev) {\n      cm.off(\"cursorActivity\", onCursorActivity);\n      cm.off(\"change\", onChange);\n      clear(cm);\n      cm.state.markedSelection = cm.state.markedSelectionStyle = null;\n    }\n  });\n\n  function onCursorActivity(cm) {\n    if (cm.state.markedSelection)\n      cm.operation(function() { update(cm); });\n  }\n\n  function onChange(cm) {\n    if (cm.state.markedSelection && cm.state.markedSelection.length)\n      cm.operation(function() { clear(cm); });\n  }\n\n  var CHUNK_SIZE = 8;\n  var Pos = CodeMirror.Pos;\n  var cmp = CodeMirror.cmpPos;\n\n  function coverRange(cm, from, to, addAt) {\n    if (cmp(from, to) == 0) return;\n    var array = cm.state.markedSelection;\n    var cls = cm.state.markedSelectionStyle;\n    for (var line = from.line;;) {\n      var start = line == from.line ? from : Pos(line, 0);\n      var endLine = line + CHUNK_SIZE, atEnd = endLine >= to.line;\n      var end = atEnd ? to : Pos(endLine, 0);\n      var mark = cm.markText(start, end, {className: cls});\n      if (addAt == null) array.push(mark);\n      else array.splice(addAt++, 0, mark);\n      if (atEnd) break;\n      line = endLine;\n    }\n  }\n\n  function clear(cm) {\n    var array = cm.state.markedSelection;\n    for (var i = 0; i < array.length; ++i) array[i].clear();\n    array.length = 0;\n  }\n\n  function reset(cm) {\n    clear(cm);\n    var ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++)\n      coverRange(cm, ranges[i].from(), ranges[i].to());\n  }\n\n  function update(cm) {\n    if (!cm.somethingSelected()) return clear(cm);\n    if (cm.listSelections().length > 1) return reset(cm);\n\n    var from = cm.getCursor(\"start\"), to = cm.getCursor(\"end\");\n\n    var array = cm.state.markedSelection;\n    if (!array.length) return coverRange(cm, from, to);\n\n    var coverStart = array[0].find(), coverEnd = array[array.length - 1].find();\n    if (!coverStart || !coverEnd || to.line - from.line <= CHUNK_SIZE ||\n        cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0)\n      return reset(cm);\n\n    while (cmp(from, coverStart.from) > 0) {\n      array.shift().clear();\n      coverStart = array[0].find();\n    }\n    if (cmp(from, coverStart.from) < 0) {\n      if (coverStart.to.line - from.line < CHUNK_SIZE) {\n        array.shift().clear();\n        coverRange(cm, from, coverStart.to, 0);\n      } else {\n        coverRange(cm, from, coverStart.from, 0);\n      }\n    }\n\n    while (cmp(to, coverEnd.to) < 0) {\n      array.pop().clear();\n      coverEnd = array[array.length - 1].find();\n    }\n    if (cmp(to, coverEnd.to) > 0) {\n      if (to.line - coverEnd.from.line < CHUNK_SIZE) {\n        array.pop().clear();\n        coverRange(cm, coverEnd.from, to);\n      } else {\n        coverRange(cm, coverEnd.to, to);\n      }\n    }\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/selection/selection-pointer.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"selectionPointer\", false, function(cm, val) {\n    var data = cm.state.selectionPointer;\n    if (data) {\n      CodeMirror.off(cm.getWrapperElement(), \"mousemove\", data.mousemove);\n      CodeMirror.off(cm.getWrapperElement(), \"mouseout\", data.mouseout);\n      CodeMirror.off(window, \"scroll\", data.windowScroll);\n      cm.off(\"cursorActivity\", reset);\n      cm.off(\"scroll\", reset);\n      cm.state.selectionPointer = null;\n      cm.display.lineDiv.style.cursor = \"\";\n    }\n    if (val) {\n      data = cm.state.selectionPointer = {\n        value: typeof val == \"string\" ? val : \"default\",\n        mousemove: function(event) { mousemove(cm, event); },\n        mouseout: function(event) { mouseout(cm, event); },\n        windowScroll: function() { reset(cm); },\n        rects: null,\n        mouseX: null, mouseY: null,\n        willUpdate: false\n      };\n      CodeMirror.on(cm.getWrapperElement(), \"mousemove\", data.mousemove);\n      CodeMirror.on(cm.getWrapperElement(), \"mouseout\", data.mouseout);\n      CodeMirror.on(window, \"scroll\", data.windowScroll);\n      cm.on(\"cursorActivity\", reset);\n      cm.on(\"scroll\", reset);\n    }\n  });\n\n  function mousemove(cm, event) {\n    var data = cm.state.selectionPointer;\n    if (event.buttons == null ? event.which : event.buttons) {\n      data.mouseX = data.mouseY = null;\n    } else {\n      data.mouseX = event.clientX;\n      data.mouseY = event.clientY;\n    }\n    scheduleUpdate(cm);\n  }\n\n  function mouseout(cm, event) {\n    if (!cm.getWrapperElement().contains(event.relatedTarget)) {\n      var data = cm.state.selectionPointer;\n      data.mouseX = data.mouseY = null;\n      scheduleUpdate(cm);\n    }\n  }\n\n  function reset(cm) {\n    cm.state.selectionPointer.rects = null;\n    scheduleUpdate(cm);\n  }\n\n  function scheduleUpdate(cm) {\n    if (!cm.state.selectionPointer.willUpdate) {\n      cm.state.selectionPointer.willUpdate = true;\n      setTimeout(function() {\n        update(cm);\n        cm.state.selectionPointer.willUpdate = false;\n      }, 50);\n    }\n  }\n\n  function update(cm) {\n    var data = cm.state.selectionPointer;\n    if (!data) return;\n    if (data.rects == null && data.mouseX != null) {\n      data.rects = [];\n      if (cm.somethingSelected()) {\n        for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling)\n          data.rects.push(sel.getBoundingClientRect());\n      }\n    }\n    var inside = false;\n    if (data.mouseX != null) for (var i = 0; i < data.rects.length; i++) {\n      var rect = data.rects[i];\n      if (rect.left <= data.mouseX && rect.right >= data.mouseX &&\n          rect.top <= data.mouseY && rect.bottom >= data.mouseY)\n        inside = true;\n    }\n    var cursor = inside ? data.value : \"\";\n    if (cm.display.lineDiv.style.cursor != cursor)\n      cm.display.lineDiv.style.cursor = cursor;\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/tern/tern.css",
    "content": ".CodeMirror-Tern-completion {\n  padding-left: 22px;\n  position: relative;\n  line-height: 1.5;\n}\n.CodeMirror-Tern-completion:before {\n  position: absolute;\n  left: 2px;\n  bottom: 2px;\n  border-radius: 50%;\n  font-size: 12px;\n  font-weight: bold;\n  height: 15px;\n  width: 15px;\n  line-height: 16px;\n  text-align: center;\n  color: white;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.CodeMirror-Tern-completion-unknown:before {\n  content: \"?\";\n  background: #4bb;\n}\n.CodeMirror-Tern-completion-object:before {\n  content: \"O\";\n  background: #77c;\n}\n.CodeMirror-Tern-completion-fn:before {\n  content: \"F\";\n  background: #7c7;\n}\n.CodeMirror-Tern-completion-array:before {\n  content: \"A\";\n  background: #c66;\n}\n.CodeMirror-Tern-completion-number:before {\n  content: \"1\";\n  background: #999;\n}\n.CodeMirror-Tern-completion-string:before {\n  content: \"S\";\n  background: #999;\n}\n.CodeMirror-Tern-completion-bool:before {\n  content: \"B\";\n  background: #999;\n}\n\n.CodeMirror-Tern-completion-guess {\n  color: #999;\n}\n\n.CodeMirror-Tern-tooltip {\n  border: 1px solid silver;\n  border-radius: 3px;\n  color: #444;\n  padding: 2px 5px;\n  font-size: 90%;\n  font-family: monospace;\n  background-color: white;\n  white-space: pre-wrap;\n\n  max-width: 40em;\n  position: absolute;\n  z-index: 10;\n  -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n\n  transition: opacity 1s;\n  -moz-transition: opacity 1s;\n  -webkit-transition: opacity 1s;\n  -o-transition: opacity 1s;\n  -ms-transition: opacity 1s;\n}\n\n.CodeMirror-Tern-hint-doc {\n  max-width: 25em;\n  margin-top: -3px;\n}\n\n.CodeMirror-Tern-fname { color: black; }\n.CodeMirror-Tern-farg { color: #70a; }\n.CodeMirror-Tern-farg-current { text-decoration: underline; }\n.CodeMirror-Tern-type { color: #07c; }\n.CodeMirror-Tern-fhint-guess { opacity: .7; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/tern/tern.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Glue code between CodeMirror and Tern.\n//\n// Create a CodeMirror.TernServer to wrap an actual Tern server,\n// register open documents (CodeMirror.Doc instances) with it, and\n// call its methods to activate the assisting functions that Tern\n// provides.\n//\n// Options supported (all optional):\n// * defs: An array of JSON definition data structures.\n// * plugins: An object mapping plugin names to configuration\n//   options.\n// * getFile: A function(name, c) that can be used to access files in\n//   the project that haven't been loaded yet. Simply do c(null) to\n//   indicate that a file is not available.\n// * fileFilter: A function(value, docName, doc) that will be applied\n//   to documents before passing them on to Tern.\n// * switchToDoc: A function(name, doc) that should, when providing a\n//   multi-file view, switch the view or focus to the named file.\n// * showError: A function(editor, message) that can be used to\n//   override the way errors are displayed.\n// * completionTip: Customize the content in tooltips for completions.\n//   Is passed a single argument—the completion's data as returned by\n//   Tern—and may return a string, DOM node, or null to indicate that\n//   no tip should be shown. By default the docstring is shown.\n// * typeTip: Like completionTip, but for the tooltips shown for type\n//   queries.\n// * responseFilter: A function(doc, query, request, error, data) that\n//   will be applied to the Tern responses before treating them\n//\n//\n// It is possible to run the Tern server in a web worker by specifying\n// these additional options:\n// * useWorker: Set to true to enable web worker mode. You'll probably\n//   want to feature detect the actual value you use here, for example\n//   !!window.Worker.\n// * workerScript: The main script of the worker. Point this to\n//   wherever you are hosting worker.js from this directory.\n// * workerDeps: An array of paths pointing (relative to workerScript)\n//   to the Acorn and Tern libraries and any Tern plugins you want to\n//   load. Or, if you minified those into a single script and included\n//   them in the workerScript, simply leave this undefined.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  // declare global: tern\n\n  CodeMirror.TernServer = function(options) {\n    var self = this;\n    this.options = options || {};\n    var plugins = this.options.plugins || (this.options.plugins = {});\n    if (!plugins.doc_comment) plugins.doc_comment = true;\n    this.docs = Object.create(null);\n    if (this.options.useWorker) {\n      this.server = new WorkerServer(this);\n    } else {\n      this.server = new tern.Server({\n        getFile: function(name, c) { return getFile(self, name, c); },\n        async: true,\n        defs: this.options.defs || [],\n        plugins: plugins\n      });\n    }\n    this.trackChange = function(doc, change) { trackChange(self, doc, change); };\n\n    this.cachedArgHints = null;\n    this.activeArgHints = null;\n    this.jumpStack = [];\n\n    this.getHint = function(cm, c) { return hint(self, cm, c); };\n    this.getHint.async = true;\n  };\n\n  CodeMirror.TernServer.prototype = {\n    addDoc: function(name, doc) {\n      var data = {doc: doc, name: name, changed: null};\n      this.server.addFile(name, docValue(this, data));\n      CodeMirror.on(doc, \"change\", this.trackChange);\n      return this.docs[name] = data;\n    },\n\n    delDoc: function(id) {\n      var found = resolveDoc(this, id);\n      if (!found) return;\n      CodeMirror.off(found.doc, \"change\", this.trackChange);\n      delete this.docs[found.name];\n      this.server.delFile(found.name);\n    },\n\n    hideDoc: function(id) {\n      closeArgHints(this);\n      var found = resolveDoc(this, id);\n      if (found && found.changed) sendDoc(this, found);\n    },\n\n    complete: function(cm) {\n      cm.showHint({hint: this.getHint});\n    },\n\n    showType: function(cm, pos, c) { showContextInfo(this, cm, pos, \"type\", c); },\n\n    showDocs: function(cm, pos, c) { showContextInfo(this, cm, pos, \"documentation\", c); },\n\n    updateArgHints: function(cm) { updateArgHints(this, cm); },\n\n    jumpToDef: function(cm) { jumpToDef(this, cm); },\n\n    jumpBack: function(cm) { jumpBack(this, cm); },\n\n    rename: function(cm) { rename(this, cm); },\n\n    selectName: function(cm) { selectName(this, cm); },\n\n    request: function (cm, query, c, pos) {\n      var self = this;\n      var doc = findDoc(this, cm.getDoc());\n      var request = buildRequest(this, doc, query, pos);\n      var extraOptions = request.query && this.options.queryOptions && this.options.queryOptions[request.query.type]\n      if (extraOptions) for (var prop in extraOptions) request.query[prop] = extraOptions[prop];\n\n      this.server.request(request, function (error, data) {\n        if (!error && self.options.responseFilter)\n          data = self.options.responseFilter(doc, query, request, error, data);\n        c(error, data);\n      });\n    },\n\n    destroy: function () {\n      closeArgHints(this)\n      if (this.worker) {\n        this.worker.terminate();\n        this.worker = null;\n      }\n    }\n  };\n\n  var Pos = CodeMirror.Pos;\n  var cls = \"CodeMirror-Tern-\";\n  var bigDoc = 250;\n\n  function getFile(ts, name, c) {\n    var buf = ts.docs[name];\n    if (buf)\n      c(docValue(ts, buf));\n    else if (ts.options.getFile)\n      ts.options.getFile(name, c);\n    else\n      c(null);\n  }\n\n  function findDoc(ts, doc, name) {\n    for (var n in ts.docs) {\n      var cur = ts.docs[n];\n      if (cur.doc == doc) return cur;\n    }\n    if (!name) for (var i = 0;; ++i) {\n      n = \"[doc\" + (i || \"\") + \"]\";\n      if (!ts.docs[n]) { name = n; break; }\n    }\n    return ts.addDoc(name, doc);\n  }\n\n  function resolveDoc(ts, id) {\n    if (typeof id == \"string\") return ts.docs[id];\n    if (id instanceof CodeMirror) id = id.getDoc();\n    if (id instanceof CodeMirror.Doc) return findDoc(ts, id);\n  }\n\n  function trackChange(ts, doc, change) {\n    var data = findDoc(ts, doc);\n\n    var argHints = ts.cachedArgHints;\n    if (argHints && argHints.doc == doc && cmpPos(argHints.start, change.to) >= 0)\n      ts.cachedArgHints = null;\n\n    var changed = data.changed;\n    if (changed == null)\n      data.changed = changed = {from: change.from.line, to: change.from.line};\n    var end = change.from.line + (change.text.length - 1);\n    if (change.from.line < changed.to) changed.to = changed.to - (change.to.line - end);\n    if (end >= changed.to) changed.to = end + 1;\n    if (changed.from > change.from.line) changed.from = change.from.line;\n\n    if (doc.lineCount() > bigDoc && change.to - changed.from > 100) setTimeout(function() {\n      if (data.changed && data.changed.to - data.changed.from > 100) sendDoc(ts, data);\n    }, 200);\n  }\n\n  function sendDoc(ts, doc) {\n    ts.server.request({files: [{type: \"full\", name: doc.name, text: docValue(ts, doc)}]}, function(error) {\n      if (error) window.console.error(error);\n      else doc.changed = null;\n    });\n  }\n\n  // Completion\n\n  function hint(ts, cm, c) {\n    ts.request(cm, {type: \"completions\", types: true, docs: true, urls: true}, function(error, data) {\n      if (error) return showError(ts, cm, error);\n      var completions = [], after = \"\";\n      var from = data.start, to = data.end;\n      if (cm.getRange(Pos(from.line, from.ch - 2), from) == \"[\\\"\" &&\n          cm.getRange(to, Pos(to.line, to.ch + 2)) != \"\\\"]\")\n        after = \"\\\"]\";\n\n      for (var i = 0; i < data.completions.length; ++i) {\n        var completion = data.completions[i], className = typeToIcon(completion.type);\n        if (data.guess) className += \" \" + cls + \"guess\";\n        completions.push({text: completion.name + after,\n                          displayText: completion.displayName || completion.name,\n                          className: className,\n                          data: completion});\n      }\n\n      var obj = {from: from, to: to, list: completions};\n      var tooltip = null;\n      CodeMirror.on(obj, \"close\", function() { remove(tooltip); });\n      CodeMirror.on(obj, \"update\", function() { remove(tooltip); });\n      CodeMirror.on(obj, \"select\", function(cur, node) {\n        remove(tooltip);\n        var content = ts.options.completionTip ? ts.options.completionTip(cur.data) : cur.data.doc;\n        if (content) {\n          tooltip = makeTooltip(node.parentNode.getBoundingClientRect().right + window.pageXOffset,\n                                node.getBoundingClientRect().top + window.pageYOffset, content, cm, cls + \"hint-doc\");\n        }\n      });\n      c(obj);\n    });\n  }\n\n  function typeToIcon(type) {\n    var suffix;\n    if (type == \"?\") suffix = \"unknown\";\n    else if (type == \"number\" || type == \"string\" || type == \"bool\") suffix = type;\n    else if (/^fn\\(/.test(type)) suffix = \"fn\";\n    else if (/^\\[/.test(type)) suffix = \"array\";\n    else suffix = \"object\";\n    return cls + \"completion \" + cls + \"completion-\" + suffix;\n  }\n\n  // Type queries\n\n  function showContextInfo(ts, cm, pos, queryName, c) {\n    ts.request(cm, queryName, function(error, data) {\n      if (error) return showError(ts, cm, error);\n      if (ts.options.typeTip) {\n        var tip = ts.options.typeTip(data);\n      } else {\n        var tip = elt(\"span\", null, elt(\"strong\", null, data.type || \"not found\"));\n        if (data.doc)\n          tip.appendChild(document.createTextNode(\" — \" + data.doc));\n        if (data.url) {\n          tip.appendChild(document.createTextNode(\" \"));\n          var child = tip.appendChild(elt(\"a\", null, \"[docs]\"));\n          child.href = data.url;\n          child.target = \"_blank\";\n        }\n      }\n      tempTooltip(cm, tip, ts);\n      if (c) c();\n    }, pos);\n  }\n\n  // Maintaining argument hints\n\n  function updateArgHints(ts, cm) {\n    closeArgHints(ts);\n\n    if (cm.somethingSelected()) return;\n    var state = cm.getTokenAt(cm.getCursor()).state;\n    var inner = CodeMirror.innerMode(cm.getMode(), state);\n    if (inner.mode.name != \"javascript\") return;\n    var lex = inner.state.lexical;\n    if (lex.info != \"call\") return;\n\n    var ch, argPos = lex.pos || 0, tabSize = cm.getOption(\"tabSize\");\n    for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) {\n      var str = cm.getLine(line), extra = 0;\n      for (var pos = 0;;) {\n        var tab = str.indexOf(\"\\t\", pos);\n        if (tab == -1) break;\n        extra += tabSize - (tab + extra) % tabSize - 1;\n        pos = tab + 1;\n      }\n      ch = lex.column - extra;\n      if (str.charAt(ch) == \"(\") {found = true; break;}\n    }\n    if (!found) return;\n\n    var start = Pos(line, ch);\n    var cache = ts.cachedArgHints;\n    if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0)\n      return showArgHints(ts, cm, argPos);\n\n    ts.request(cm, {type: \"type\", preferFunction: true, end: start}, function(error, data) {\n      if (error || !data.type || !(/^fn\\(/).test(data.type)) return;\n      ts.cachedArgHints = {\n        start: start,\n        type: parseFnType(data.type),\n        name: data.exprName || data.name || \"fn\",\n        guess: data.guess,\n        doc: cm.getDoc()\n      };\n      showArgHints(ts, cm, argPos);\n    });\n  }\n\n  function showArgHints(ts, cm, pos) {\n    closeArgHints(ts);\n\n    var cache = ts.cachedArgHints, tp = cache.type;\n    var tip = elt(\"span\", cache.guess ? cls + \"fhint-guess\" : null,\n                  elt(\"span\", cls + \"fname\", cache.name), \"(\");\n    for (var i = 0; i < tp.args.length; ++i) {\n      if (i) tip.appendChild(document.createTextNode(\", \"));\n      var arg = tp.args[i];\n      tip.appendChild(elt(\"span\", cls + \"farg\" + (i == pos ? \" \" + cls + \"farg-current\" : \"\"), arg.name || \"?\"));\n      if (arg.type != \"?\") {\n        tip.appendChild(document.createTextNode(\":\\u00a0\"));\n        tip.appendChild(elt(\"span\", cls + \"type\", arg.type));\n      }\n    }\n    tip.appendChild(document.createTextNode(tp.rettype ? \") ->\\u00a0\" : \")\"));\n    if (tp.rettype) tip.appendChild(elt(\"span\", cls + \"type\", tp.rettype));\n    var place = cm.cursorCoords(null, \"page\");\n    var tooltip = ts.activeArgHints = makeTooltip(place.right + 1, place.bottom, tip, cm)\n    setTimeout(function() {\n      tooltip.clear = onEditorActivity(cm, function() {\n        if (ts.activeArgHints == tooltip) closeArgHints(ts) })\n    }, 20)\n  }\n\n  function parseFnType(text) {\n    var args = [], pos = 3;\n\n    function skipMatching(upto) {\n      var depth = 0, start = pos;\n      for (;;) {\n        var next = text.charAt(pos);\n        if (upto.test(next) && !depth) return text.slice(start, pos);\n        if (/[{\\[\\(]/.test(next)) ++depth;\n        else if (/[}\\]\\)]/.test(next)) --depth;\n        ++pos;\n      }\n    }\n\n    // Parse arguments\n    if (text.charAt(pos) != \")\") for (;;) {\n      var name = text.slice(pos).match(/^([^, \\(\\[\\{]+): /);\n      if (name) {\n        pos += name[0].length;\n        name = name[1];\n      }\n      args.push({name: name, type: skipMatching(/[\\),]/)});\n      if (text.charAt(pos) == \")\") break;\n      pos += 2;\n    }\n\n    var rettype = text.slice(pos).match(/^\\) -> (.*)$/);\n\n    return {args: args, rettype: rettype && rettype[1]};\n  }\n\n  // Moving to the definition of something\n\n  function jumpToDef(ts, cm) {\n    function inner(varName) {\n      var req = {type: \"definition\", variable: varName || null};\n      var doc = findDoc(ts, cm.getDoc());\n      ts.server.request(buildRequest(ts, doc, req), function(error, data) {\n        if (error) return showError(ts, cm, error);\n        if (!data.file && data.url) { window.open(data.url); return; }\n\n        if (data.file) {\n          var localDoc = ts.docs[data.file], found;\n          if (localDoc && (found = findContext(localDoc.doc, data))) {\n            ts.jumpStack.push({file: doc.name,\n                               start: cm.getCursor(\"from\"),\n                               end: cm.getCursor(\"to\")});\n            moveTo(ts, doc, localDoc, found.start, found.end);\n            return;\n          }\n        }\n        showError(ts, cm, \"Could not find a definition.\");\n      });\n    }\n\n    if (!atInterestingExpression(cm))\n      dialog(cm, \"Jump to variable\", function(name) { if (name) inner(name); });\n    else\n      inner();\n  }\n\n  function jumpBack(ts, cm) {\n    var pos = ts.jumpStack.pop(), doc = pos && ts.docs[pos.file];\n    if (!doc) return;\n    moveTo(ts, findDoc(ts, cm.getDoc()), doc, pos.start, pos.end);\n  }\n\n  function moveTo(ts, curDoc, doc, start, end) {\n    doc.doc.setSelection(start, end);\n    if (curDoc != doc && ts.options.switchToDoc) {\n      closeArgHints(ts);\n      ts.options.switchToDoc(doc.name, doc.doc);\n    }\n  }\n\n  // The {line,ch} representation of positions makes this rather awkward.\n  function findContext(doc, data) {\n    var before = data.context.slice(0, data.contextOffset).split(\"\\n\");\n    var startLine = data.start.line - (before.length - 1);\n    var start = Pos(startLine, (before.length == 1 ? data.start.ch : doc.getLine(startLine).length) - before[0].length);\n\n    var text = doc.getLine(startLine).slice(start.ch);\n    for (var cur = startLine + 1; cur < doc.lineCount() && text.length < data.context.length; ++cur)\n      text += \"\\n\" + doc.getLine(cur);\n    if (text.slice(0, data.context.length) == data.context) return data;\n\n    var cursor = doc.getSearchCursor(data.context, 0, false);\n    var nearest, nearestDist = Infinity;\n    while (cursor.findNext()) {\n      var from = cursor.from(), dist = Math.abs(from.line - start.line) * 10000;\n      if (!dist) dist = Math.abs(from.ch - start.ch);\n      if (dist < nearestDist) { nearest = from; nearestDist = dist; }\n    }\n    if (!nearest) return null;\n\n    if (before.length == 1)\n      nearest.ch += before[0].length;\n    else\n      nearest = Pos(nearest.line + (before.length - 1), before[before.length - 1].length);\n    if (data.start.line == data.end.line)\n      var end = Pos(nearest.line, nearest.ch + (data.end.ch - data.start.ch));\n    else\n      var end = Pos(nearest.line + (data.end.line - data.start.line), data.end.ch);\n    return {start: nearest, end: end};\n  }\n\n  function atInterestingExpression(cm) {\n    var pos = cm.getCursor(\"end\"), tok = cm.getTokenAt(pos);\n    if (tok.start < pos.ch && tok.type == \"comment\") return false;\n    return /[\\w)\\]]/.test(cm.getLine(pos.line).slice(Math.max(pos.ch - 1, 0), pos.ch + 1));\n  }\n\n  // Variable renaming\n\n  function rename(ts, cm) {\n    var token = cm.getTokenAt(cm.getCursor());\n    if (!/\\w/.test(token.string)) return showError(ts, cm, \"Not at a variable\");\n    dialog(cm, \"New name for \" + token.string, function(newName) {\n      ts.request(cm, {type: \"rename\", newName: newName, fullDocs: true}, function(error, data) {\n        if (error) return showError(ts, cm, error);\n        applyChanges(ts, data.changes);\n      });\n    });\n  }\n\n  function selectName(ts, cm) {\n    var name = findDoc(ts, cm.doc).name;\n    ts.request(cm, {type: \"refs\"}, function(error, data) {\n      if (error) return showError(ts, cm, error);\n      var ranges = [], cur = 0;\n      var curPos = cm.getCursor();\n      for (var i = 0; i < data.refs.length; i++) {\n        var ref = data.refs[i];\n        if (ref.file == name) {\n          ranges.push({anchor: ref.start, head: ref.end});\n          if (cmpPos(curPos, ref.start) >= 0 && cmpPos(curPos, ref.end) <= 0)\n            cur = ranges.length - 1;\n        }\n      }\n      cm.setSelections(ranges, cur);\n    });\n  }\n\n  var nextChangeOrig = 0;\n  function applyChanges(ts, changes) {\n    var perFile = Object.create(null);\n    for (var i = 0; i < changes.length; ++i) {\n      var ch = changes[i];\n      (perFile[ch.file] || (perFile[ch.file] = [])).push(ch);\n    }\n    for (var file in perFile) {\n      var known = ts.docs[file], chs = perFile[file];;\n      if (!known) continue;\n      chs.sort(function(a, b) { return cmpPos(b.start, a.start); });\n      var origin = \"*rename\" + (++nextChangeOrig);\n      for (var i = 0; i < chs.length; ++i) {\n        var ch = chs[i];\n        known.doc.replaceRange(ch.text, ch.start, ch.end, origin);\n      }\n    }\n  }\n\n  // Generic request-building helper\n\n  function buildRequest(ts, doc, query, pos) {\n    var files = [], offsetLines = 0, allowFragments = !query.fullDocs;\n    if (!allowFragments) delete query.fullDocs;\n    if (typeof query == \"string\") query = {type: query};\n    query.lineCharPositions = true;\n    if (query.end == null) {\n      query.end = pos || doc.doc.getCursor(\"end\");\n      if (doc.doc.somethingSelected())\n        query.start = doc.doc.getCursor(\"start\");\n    }\n    var startPos = query.start || query.end;\n\n    if (doc.changed) {\n      if (doc.doc.lineCount() > bigDoc && allowFragments !== false &&\n          doc.changed.to - doc.changed.from < 100 &&\n          doc.changed.from <= startPos.line && doc.changed.to > query.end.line) {\n        files.push(getFragmentAround(doc, startPos, query.end));\n        query.file = \"#0\";\n        var offsetLines = files[0].offsetLines;\n        if (query.start != null) query.start = Pos(query.start.line - -offsetLines, query.start.ch);\n        query.end = Pos(query.end.line - offsetLines, query.end.ch);\n      } else {\n        files.push({type: \"full\",\n                    name: doc.name,\n                    text: docValue(ts, doc)});\n        query.file = doc.name;\n        doc.changed = null;\n      }\n    } else {\n      query.file = doc.name;\n    }\n    for (var name in ts.docs) {\n      var cur = ts.docs[name];\n      if (cur.changed && cur != doc) {\n        files.push({type: \"full\", name: cur.name, text: docValue(ts, cur)});\n        cur.changed = null;\n      }\n    }\n\n    return {query: query, files: files};\n  }\n\n  function getFragmentAround(data, start, end) {\n    var doc = data.doc;\n    var minIndent = null, minLine = null, endLine, tabSize = 4;\n    for (var p = start.line - 1, min = Math.max(0, p - 50); p >= min; --p) {\n      var line = doc.getLine(p), fn = line.search(/\\bfunction\\b/);\n      if (fn < 0) continue;\n      var indent = CodeMirror.countColumn(line, null, tabSize);\n      if (minIndent != null && minIndent <= indent) continue;\n      minIndent = indent;\n      minLine = p;\n    }\n    if (minLine == null) minLine = min;\n    var max = Math.min(doc.lastLine(), end.line + 20);\n    if (minIndent == null || minIndent == CodeMirror.countColumn(doc.getLine(start.line), null, tabSize))\n      endLine = max;\n    else for (endLine = end.line + 1; endLine < max; ++endLine) {\n      var indent = CodeMirror.countColumn(doc.getLine(endLine), null, tabSize);\n      if (indent <= minIndent) break;\n    }\n    var from = Pos(minLine, 0);\n\n    return {type: \"part\",\n            name: data.name,\n            offsetLines: from.line,\n            text: doc.getRange(from, Pos(endLine, end.line == endLine ? null : 0))};\n  }\n\n  // Generic utilities\n\n  var cmpPos = CodeMirror.cmpPos;\n\n  function elt(tagname, cls /*, ... elts*/) {\n    var e = document.createElement(tagname);\n    if (cls) e.className = cls;\n    for (var i = 2; i < arguments.length; ++i) {\n      var elt = arguments[i];\n      if (typeof elt == \"string\") elt = document.createTextNode(elt);\n      e.appendChild(elt);\n    }\n    return e;\n  }\n\n  function dialog(cm, text, f) {\n    if (cm.openDialog)\n      cm.openDialog(text + \": <input type=text>\", f);\n    else\n      f(prompt(text, \"\"));\n  }\n\n  // Tooltips\n\n  function tempTooltip(cm, content, ts) {\n    if (cm.state.ternTooltip) remove(cm.state.ternTooltip);\n    var where = cm.cursorCoords();\n    var tip = cm.state.ternTooltip = makeTooltip(where.right + 1, where.bottom, content, cm);\n    function maybeClear() {\n      old = true;\n      if (!mouseOnTip) clear();\n    }\n    function clear() {\n      cm.state.ternTooltip = null;\n      if (tip.parentNode) fadeOut(tip)\n      clearActivity()\n    }\n    var mouseOnTip = false, old = false;\n    CodeMirror.on(tip, \"mousemove\", function() { mouseOnTip = true; });\n    CodeMirror.on(tip, \"mouseout\", function(e) {\n      var related = e.relatedTarget || e.toElement\n      if (!related || !CodeMirror.contains(tip, related)) {\n        if (old) clear();\n        else mouseOnTip = false;\n      }\n    });\n    setTimeout(maybeClear, ts.options.hintDelay ? ts.options.hintDelay : 1700);\n    var clearActivity = onEditorActivity(cm, clear)\n  }\n\n  function onEditorActivity(cm, f) {\n    cm.on(\"cursorActivity\", f)\n    cm.on(\"blur\", f)\n    cm.on(\"scroll\", f)\n    cm.on(\"setDoc\", f)\n    return function() {\n      cm.off(\"cursorActivity\", f)\n      cm.off(\"blur\", f)\n      cm.off(\"scroll\", f)\n      cm.off(\"setDoc\", f)\n    }\n  }\n\n  function makeTooltip(x, y, content, cm, className) {\n    var node = elt(\"div\", cls + \"tooltip\" + \" \" + (className || \"\"), content);\n    node.style.left = x + \"px\";\n    node.style.top = y + \"px\";\n    var container = ((cm.options || {}).hintOptions || {}).container || document.body;\n    container.appendChild(node);\n\n    var pos = cm.cursorCoords();\n    var winW = window.innerWidth;\n    var winH = window.innerHeight;\n    var box = node.getBoundingClientRect();\n    var hints = document.querySelector(\".CodeMirror-hints\");\n    var overlapY = box.bottom - winH;\n    var overlapX = box.right - winW;\n\n    if (hints && overlapX > 0) {\n      node.style.left = 0;\n      var box = node.getBoundingClientRect();\n      node.style.left = (x = x - hints.offsetWidth - box.width) + \"px\";\n      overlapX = box.right - winW;\n    }\n    if (overlapY > 0) {\n      var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top);\n      if (curTop - height > 0) { // Fits above cursor\n        node.style.top = (pos.top - height) + \"px\";\n      } else if (height > winH) {\n        node.style.height = (winH - 5) + \"px\";\n        node.style.top = (pos.bottom - box.top) + \"px\";\n      }\n    }\n    if (overlapX > 0) {\n      if (box.right - box.left > winW) {\n        node.style.width = (winW - 5) + \"px\";\n        overlapX -= (box.right - box.left) - winW;\n      }\n      node.style.left = (x - overlapX) + \"px\";\n    }\n\n    return node;\n  }\n\n  function remove(node) {\n    var p = node && node.parentNode;\n    if (p) p.removeChild(node);\n  }\n\n  function fadeOut(tooltip) {\n    tooltip.style.opacity = \"0\";\n    setTimeout(function() { remove(tooltip); }, 1100);\n  }\n\n  function showError(ts, cm, msg) {\n    if (ts.options.showError)\n      ts.options.showError(cm, msg);\n    else\n      tempTooltip(cm, String(msg), ts);\n  }\n\n  function closeArgHints(ts) {\n    if (ts.activeArgHints) {\n      if (ts.activeArgHints.clear) ts.activeArgHints.clear()\n      remove(ts.activeArgHints)\n      ts.activeArgHints = null\n    }\n  }\n\n  function docValue(ts, doc) {\n    var val = doc.doc.getValue();\n    if (ts.options.fileFilter) val = ts.options.fileFilter(val, doc.name, doc.doc);\n    return val;\n  }\n\n  // Worker wrapper\n\n  function WorkerServer(ts) {\n    var worker = ts.worker = new Worker(ts.options.workerScript);\n    worker.postMessage({type: \"init\",\n                        defs: ts.options.defs,\n                        plugins: ts.options.plugins,\n                        scripts: ts.options.workerDeps});\n    var msgId = 0, pending = {};\n\n    function send(data, c) {\n      if (c) {\n        data.id = ++msgId;\n        pending[msgId] = c;\n      }\n      worker.postMessage(data);\n    }\n    worker.onmessage = function(e) {\n      var data = e.data;\n      if (data.type == \"getFile\") {\n        getFile(ts, data.name, function(err, text) {\n          send({type: \"getFile\", err: String(err), text: text, id: data.id});\n        });\n      } else if (data.type == \"debug\") {\n        window.console.log(data.message);\n      } else if (data.id && pending[data.id]) {\n        pending[data.id](data.err, data.body);\n        delete pending[data.id];\n      }\n    };\n    worker.onerror = function(e) {\n      for (var id in pending) pending[id](e);\n      pending = {};\n    };\n\n    this.addFile = function(name, text) { send({type: \"add\", name: name, text: text}); };\n    this.delFile = function(name) { send({type: \"del\", name: name}); };\n    this.request = function(body, c) { send({type: \"req\", body: body}, c); };\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/tern/worker.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// declare global: tern, server\n\nvar server;\n\nthis.onmessage = function(e) {\n  var data = e.data;\n  switch (data.type) {\n  case \"init\": return startServer(data.defs, data.plugins, data.scripts);\n  case \"add\": return server.addFile(data.name, data.text);\n  case \"del\": return server.delFile(data.name);\n  case \"req\": return server.request(data.body, function(err, reqData) {\n    postMessage({id: data.id, body: reqData, err: err && String(err)});\n  });\n  case \"getFile\":\n    var c = pending[data.id];\n    delete pending[data.id];\n    return c(data.err, data.text);\n  default: throw new Error(\"Unknown message type: \" + data.type);\n  }\n};\n\nvar nextId = 0, pending = {};\nfunction getFile(file, c) {\n  postMessage({type: \"getFile\", name: file, id: ++nextId});\n  pending[nextId] = c;\n}\n\nfunction startServer(defs, plugins, scripts) {\n  if (scripts) importScripts.apply(null, scripts);\n\n  server = new tern.Server({\n    getFile: getFile,\n    async: true,\n    defs: defs,\n    plugins: plugins\n  });\n}\n\nthis.console = {\n  log: function(v) { postMessage({type: \"debug\", message: v}); }\n};\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/addon/wrap/hardwrap.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var Pos = CodeMirror.Pos;\n\n  function findParagraph(cm, pos, options) {\n    var startRE = options.paragraphStart || cm.getHelper(pos, \"paragraphStart\");\n    for (var start = pos.line, first = cm.firstLine(); start > first; --start) {\n      var line = cm.getLine(start);\n      if (startRE && startRE.test(line)) break;\n      if (!/\\S/.test(line)) { ++start; break; }\n    }\n    var endRE = options.paragraphEnd || cm.getHelper(pos, \"paragraphEnd\");\n    for (var end = pos.line + 1, last = cm.lastLine(); end <= last; ++end) {\n      var line = cm.getLine(end);\n      if (endRE && endRE.test(line)) { ++end; break; }\n      if (!/\\S/.test(line)) break;\n    }\n    return {from: start, to: end};\n  }\n\n  function findBreakPoint(text, column, wrapOn, killTrailingSpace, forceBreak) {\n    var at = column\n    while (at < text.length && text.charAt(at) == \" \") at++\n    for (; at > 0; --at)\n      if (wrapOn.test(text.slice(at - 1, at + 1))) break;\n\n    if (!forceBreak && at <= text.match(/^[ \\t]*/)[0].length) {\n      // didn't find a break point before column, in non-forceBreak mode try to\n      // find one after 'column'.\n      for (at = column + 1; at < text.length - 1; ++at) {\n        if (wrapOn.test(text.slice(at - 1, at + 1))) break;\n      }\n    }\n\n    for (var first = true;; first = false) {\n      var endOfText = at;\n      if (killTrailingSpace)\n        while (text.charAt(endOfText - 1) == \" \") --endOfText;\n      if (endOfText == 0 && first) at = column;\n      else return {from: endOfText, to: at};\n    }\n  }\n\n  function wrapRange(cm, from, to, options) {\n    from = cm.clipPos(from); to = cm.clipPos(to);\n    var column = options.column || 80;\n    var wrapOn = options.wrapOn || /\\s\\S|-[^\\.\\d]/;\n    var forceBreak = options.forceBreak !== false;\n    var killTrailing = options.killTrailingSpace !== false;\n    var changes = [], curLine = \"\", curNo = from.line;\n    var lines = cm.getRange(from, to, false);\n    if (!lines.length) return null;\n    var leadingSpace = lines[0].match(/^[ \\t]*/)[0];\n    if (leadingSpace.length >= column) column = leadingSpace.length + 1\n\n    for (var i = 0; i < lines.length; ++i) {\n      var text = lines[i], oldLen = curLine.length, spaceInserted = 0;\n      if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) {\n        curLine += \" \";\n        spaceInserted = 1;\n      }\n      var spaceTrimmed = \"\";\n      if (i) {\n        spaceTrimmed = text.match(/^\\s*/)[0];\n        text = text.slice(spaceTrimmed.length);\n      }\n      curLine += text;\n      if (i) {\n        var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed &&\n          findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak);\n        // If this isn't broken, or is broken at a different point, remove old break\n        if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) {\n          changes.push({text: [spaceInserted ? \" \" : \"\"],\n                        from: Pos(curNo, oldLen),\n                        to: Pos(curNo + 1, spaceTrimmed.length)});\n        } else {\n          curLine = leadingSpace + text;\n          ++curNo;\n        }\n      }\n      while (curLine.length > column) {\n        var bp = findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak);\n        if (bp.from != bp.to ||\n            forceBreak && leadingSpace !== curLine.slice(0, bp.to)) {\n          changes.push({text: [\"\", leadingSpace],\n                        from: Pos(curNo, bp.from),\n                        to: Pos(curNo, bp.to)});\n          curLine = leadingSpace + curLine.slice(bp.to);\n          ++curNo;\n        } else {\n          break;\n        }\n      }\n    }\n    if (changes.length) cm.operation(function() {\n      for (var i = 0; i < changes.length; ++i) {\n        var change = changes[i];\n        if (change.text || CodeMirror.cmpPos(change.from, change.to))\n          cm.replaceRange(change.text, change.from, change.to);\n      }\n    });\n    return changes.length ? {from: changes[0].from, to: CodeMirror.changeEnd(changes[changes.length - 1])} : null;\n  }\n\n  CodeMirror.defineExtension(\"wrapParagraph\", function(pos, options) {\n    options = options || {};\n    if (!pos) pos = this.getCursor();\n    var para = findParagraph(this, pos, options);\n    return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options);\n  });\n\n  CodeMirror.commands.wrapLines = function(cm) {\n    cm.operation(function() {\n      var ranges = cm.listSelections(), at = cm.lastLine() + 1;\n      for (var i = ranges.length - 1; i >= 0; i--) {\n        var range = ranges[i], span;\n        if (range.empty()) {\n          var para = findParagraph(cm, range.head, {});\n          span = {from: Pos(para.from, 0), to: Pos(para.to - 1)};\n        } else {\n          span = {from: range.from(), to: range.to()};\n        }\n        if (span.to.line >= at) continue;\n        at = span.from.line;\n        wrapRange(cm, span.from, span.to, {});\n      }\n    });\n  };\n\n  CodeMirror.defineExtension(\"wrapRange\", function(from, to, options) {\n    return wrapRange(this, from, to, options || {});\n  });\n\n  CodeMirror.defineExtension(\"wrapParagraphsInRange\", function(from, to, options) {\n    options = options || {};\n    var cm = this, paras = [];\n    for (var line = from.line; line <= to.line;) {\n      var para = findParagraph(cm, Pos(line, 0), options);\n      paras.push(para);\n      line = para.to;\n    }\n    var madeChange = false;\n    if (paras.length) cm.operation(function() {\n      for (var i = paras.length - 1; i >= 0; --i)\n        madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options);\n    });\n    return madeChange;\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/bin/source-highlight",
    "content": "#!/usr/bin/env node\n\n// Simple command-line code highlighting tool. Reads code from stdin,\n// spits html to stdout. For example:\n//\n//   echo 'function foo(a) { return a; }' | bin/source-highlight -s javascript\n//   bin/source-highlight -s \n\nvar fs = require(\"fs\");\n\nvar CodeMirror = require(\"../addon/runmode/runmode.node.js\");\nrequire(\"../mode/meta.js\");\n\nvar sPos = process.argv.indexOf(\"-s\");\nif (sPos == -1 || sPos == process.argv.length - 1) {\n   console.error(\"Usage: source-highlight -s language\");\n   process.exit(1);\n}\nvar lang = process.argv[sPos + 1].toLowerCase(), modeName = lang;\nvar found = CodeMirror.findModeByMIME(lang) || CodeMirror.findModeByName(lang)\nif (found) {\n  modeName = found.mode\n  lang = found.mime\n}\n\nif (!CodeMirror.modes[modeName])\n  require(\"../mode/\" + modeName + \"/\" + modeName + \".js\");\n\nfunction esc(str) {\n  return str.replace(/[<&]/g, function(ch) { return ch == \"&\" ? \"&amp;\" : \"&lt;\"; });\n}\n\nvar code = fs.readFileSync(\"/dev/stdin\", \"utf8\");\nvar curStyle = null, accum = \"\";\nfunction flush() {\n  if (curStyle) process.stdout.write(\"<span class=\\\"\" + curStyle.replace(/(^|\\s+)/g, \"$1cm-\") + \"\\\">\" + esc(accum) + \"</span>\");\n  else process.stdout.write(esc(accum));\n}\n\nCodeMirror.runMode(code, lang, function(text, style) {\n  if (style != curStyle) {\n    flush();\n    curStyle = style; accum = text;\n  } else {\n    accum += text;\n  }\n});\nflush();\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/keymap/emacs.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var cmds = CodeMirror.commands;\n  var Pos = CodeMirror.Pos;\n  function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }\n\n  // Kill 'ring'\n\n  var killRing = [];\n  function addToRing(str) {\n    killRing.push(str);\n    if (killRing.length > 50) killRing.shift();\n  }\n  function growRingTop(str) {\n    if (!killRing.length) return addToRing(str);\n    killRing[killRing.length - 1] += str;\n  }\n  function getFromRing(n) { return killRing[killRing.length - (n ? Math.min(n, 1) : 1)] || \"\"; }\n  function popFromRing() { if (killRing.length > 1) killRing.pop(); return getFromRing(); }\n\n  var lastKill = null;\n\n  // Internal generic kill function, used by several mapped kill \"family\" functions.\n  function _kill(cm, from, to, ring, text) {\n    if (text == null) text = cm.getRange(from, to);\n\n    if (ring == \"grow\" && lastKill && lastKill.cm == cm && posEq(from, lastKill.pos) && cm.isClean(lastKill.gen))\n      growRingTop(text);\n    else if (ring !== false)\n      addToRing(text);\n    cm.replaceRange(\"\", from, to, \"+delete\");\n\n    if (ring == \"grow\") lastKill = {cm: cm, pos: from, gen: cm.changeGeneration()};\n    else lastKill = null;\n  }\n\n  // Boundaries of various units\n\n  function byChar(cm, pos, dir) {\n    return cm.findPosH(pos, dir, \"char\", true);\n  }\n\n  function byWord(cm, pos, dir) {\n    return cm.findPosH(pos, dir, \"word\", true);\n  }\n\n  function byLine(cm, pos, dir) {\n    return cm.findPosV(pos, dir, \"line\", cm.doc.sel.goalColumn);\n  }\n\n  function byPage(cm, pos, dir) {\n    return cm.findPosV(pos, dir, \"page\", cm.doc.sel.goalColumn);\n  }\n\n  function byParagraph(cm, pos, dir) {\n    var no = pos.line, line = cm.getLine(no);\n    var sawText = /\\S/.test(dir < 0 ? line.slice(0, pos.ch) : line.slice(pos.ch));\n    var fst = cm.firstLine(), lst = cm.lastLine();\n    for (;;) {\n      no += dir;\n      if (no < fst || no > lst)\n        return cm.clipPos(Pos(no - dir, dir < 0 ? 0 : null));\n      line = cm.getLine(no);\n      var hasText = /\\S/.test(line);\n      if (hasText) sawText = true;\n      else if (sawText) return Pos(no, 0);\n    }\n  }\n\n  function bySentence(cm, pos, dir) {\n    var line = pos.line, ch = pos.ch;\n    var text = cm.getLine(pos.line), sawWord = false;\n    for (;;) {\n      var next = text.charAt(ch + (dir < 0 ? -1 : 0));\n      if (!next) { // End/beginning of line reached\n        if (line == (dir < 0 ? cm.firstLine() : cm.lastLine())) return Pos(line, ch);\n        text = cm.getLine(line + dir);\n        if (!/\\S/.test(text)) return Pos(line, ch);\n        line += dir;\n        ch = dir < 0 ? text.length : 0;\n        continue;\n      }\n      if (sawWord && /[!?.]/.test(next)) return Pos(line, ch + (dir > 0 ? 1 : 0));\n      if (!sawWord) sawWord = /\\w/.test(next);\n      ch += dir;\n    }\n  }\n\n  function byExpr(cm, pos, dir) {\n    var wrap;\n    if (cm.findMatchingBracket && (wrap = cm.findMatchingBracket(pos, {strict: true}))\n        && wrap.match && (wrap.forward ? 1 : -1) == dir)\n      return dir > 0 ? Pos(wrap.to.line, wrap.to.ch + 1) : wrap.to;\n\n    for (var first = true;; first = false) {\n      var token = cm.getTokenAt(pos);\n      var after = Pos(pos.line, dir < 0 ? token.start : token.end);\n      if (first && dir > 0 && token.end == pos.ch || !/\\w/.test(token.string)) {\n        var newPos = cm.findPosH(after, dir, \"char\");\n        if (posEq(after, newPos)) return pos;\n        else pos = newPos;\n      } else {\n        return after;\n      }\n    }\n  }\n\n  // Prefixes (only crudely supported)\n\n  function getPrefix(cm, precise) {\n    var digits = cm.state.emacsPrefix;\n    if (!digits) return precise ? null : 1;\n    clearPrefix(cm);\n    return digits == \"-\" ? -1 : Number(digits);\n  }\n\n  function repeated(cmd) {\n    var f = typeof cmd == \"string\" ? function(cm) { cm.execCommand(cmd); } : cmd;\n    return function(cm) {\n      var prefix = getPrefix(cm);\n      f(cm);\n      for (var i = 1; i < prefix; ++i) f(cm);\n    };\n  }\n\n  function findEnd(cm, pos, by, dir) {\n    var prefix = getPrefix(cm);\n    if (prefix < 0) { dir = -dir; prefix = -prefix; }\n    for (var i = 0; i < prefix; ++i) {\n      var newPos = by(cm, pos, dir);\n      if (posEq(newPos, pos)) break;\n      pos = newPos;\n    }\n    return pos;\n  }\n\n  function move(by, dir) {\n    var f = function(cm) {\n      cm.extendSelection(findEnd(cm, cm.getCursor(), by, dir));\n    };\n    f.motion = true;\n    return f;\n  }\n\n  function killTo(cm, by, dir, ring) {\n    var selections = cm.listSelections(), cursor;\n    var i = selections.length;\n    while (i--) {\n      cursor = selections[i].head;\n      _kill(cm, cursor, findEnd(cm, cursor, by, dir), ring);\n    }\n  }\n\n  function _killRegion(cm, ring) {\n    if (cm.somethingSelected()) {\n      var selections = cm.listSelections(), selection;\n      var i = selections.length;\n      while (i--) {\n        selection = selections[i];\n        _kill(cm, selection.anchor, selection.head, ring);\n      }\n      return true;\n    }\n  }\n\n  function addPrefix(cm, digit) {\n    if (cm.state.emacsPrefix) {\n      if (digit != \"-\") cm.state.emacsPrefix += digit;\n      return;\n    }\n    // Not active yet\n    cm.state.emacsPrefix = digit;\n    cm.on(\"keyHandled\", maybeClearPrefix);\n    cm.on(\"inputRead\", maybeDuplicateInput);\n  }\n\n  var prefixPreservingKeys = {\"Alt-G\": true, \"Ctrl-X\": true, \"Ctrl-Q\": true, \"Ctrl-U\": true};\n\n  function maybeClearPrefix(cm, arg) {\n    if (!cm.state.emacsPrefixMap && !prefixPreservingKeys.hasOwnProperty(arg))\n      clearPrefix(cm);\n  }\n\n  function clearPrefix(cm) {\n    cm.state.emacsPrefix = null;\n    cm.off(\"keyHandled\", maybeClearPrefix);\n    cm.off(\"inputRead\", maybeDuplicateInput);\n  }\n\n  function maybeDuplicateInput(cm, event) {\n    var dup = getPrefix(cm);\n    if (dup > 1 && event.origin == \"+input\") {\n      var one = event.text.join(\"\\n\"), txt = \"\";\n      for (var i = 1; i < dup; ++i) txt += one;\n      cm.replaceSelection(txt);\n    }\n  }\n\n  function maybeRemovePrefixMap(cm, arg) {\n    if (typeof arg == \"string\" && (/^\\d$/.test(arg) || arg == \"Ctrl-U\")) return;\n    cm.removeKeyMap(prefixMap);\n    cm.state.emacsPrefixMap = false;\n    cm.off(\"keyHandled\", maybeRemovePrefixMap);\n    cm.off(\"inputRead\", maybeRemovePrefixMap);\n  }\n\n  // Utilities\n\n  cmds.setMark = function (cm) {\n    cm.setCursor(cm.getCursor());\n    cm.setExtending(!cm.getExtending());\n    cm.on(\"change\", function() { cm.setExtending(false); });\n  }\n\n  function clearMark(cm) {\n    cm.setExtending(false);\n    cm.setCursor(cm.getCursor());\n  }\n\n  function makePrompt(msg) {\n    var fragment = document.createDocumentFragment();\n    var input = document.createElement(\"input\");\n    input.setAttribute(\"type\", \"text\");\n    input.style.width = \"10em\";\n    fragment.appendChild(document.createTextNode(msg + \": \"));\n    fragment.appendChild(input);\n    return fragment;\n  }\n\n  function getInput(cm, msg, f) {\n    if (cm.openDialog)\n      cm.openDialog(makePrompt(msg), f, {bottom: true});\n    else\n      f(prompt(msg, \"\"));\n  }\n\n  function operateOnWord(cm, op) {\n    var start = cm.getCursor(), end = cm.findPosH(start, 1, \"word\");\n    cm.replaceRange(op(cm.getRange(start, end)), start, end);\n    cm.setCursor(end);\n  }\n\n  function toEnclosingExpr(cm) {\n    var pos = cm.getCursor(), line = pos.line, ch = pos.ch;\n    var stack = [];\n    while (line >= cm.firstLine()) {\n      var text = cm.getLine(line);\n      for (var i = ch == null ? text.length : ch; i > 0;) {\n        var ch = text.charAt(--i);\n        if (ch == \")\")\n          stack.push(\"(\");\n        else if (ch == \"]\")\n          stack.push(\"[\");\n        else if (ch == \"}\")\n          stack.push(\"{\");\n        else if (/[\\(\\{\\[]/.test(ch) && (!stack.length || stack.pop() != ch))\n          return cm.extendSelection(Pos(line, i));\n      }\n      --line; ch = null;\n    }\n  }\n\n  // Commands. Names should match emacs function names (albeit in camelCase)\n  // except where emacs function names collide with code mirror core commands.\n\n  cmds.killRegion = function(cm) {\n    _kill(cm, cm.getCursor(\"start\"), cm.getCursor(\"end\"), true);\n  };\n\n  // Maps to emacs kill-line\n  cmds.killLineEmacs = repeated(function(cm) {\n    var start = cm.getCursor(), end = cm.clipPos(Pos(start.line));\n    var text = cm.getRange(start, end);\n    if (!/\\S/.test(text)) {\n      text += \"\\n\";\n      end = Pos(start.line + 1, 0);\n    }\n    _kill(cm, start, end, \"grow\", text);\n  });\n\n  cmds.killRingSave = function(cm) {\n    addToRing(cm.getSelection());\n    clearMark(cm);\n  };\n\n  cmds.yank = function(cm) {\n    var start = cm.getCursor();\n    cm.replaceRange(getFromRing(getPrefix(cm)), start, start, \"paste\");\n    cm.setSelection(start, cm.getCursor());\n  };\n\n  cmds.yankPop = function(cm) {\n    cm.replaceSelection(popFromRing(), \"around\", \"paste\");\n  };\n\n  cmds.forwardChar = move(byChar, 1);\n\n  cmds.backwardChar = move(byChar, -1)\n\n  cmds.deleteChar = function(cm) { killTo(cm, byChar, 1, false); };\n\n  cmds.deleteForwardChar = function(cm) {\n    _killRegion(cm, false) || killTo(cm, byChar, 1, false);\n  };\n\n  cmds.deleteBackwardChar = function(cm) {\n    _killRegion(cm, false) || killTo(cm, byChar, -1, false);\n  };\n\n  cmds.forwardWord = move(byWord, 1);\n\n  cmds.backwardWord = move(byWord, -1);\n\n  cmds.killWord = function(cm) { killTo(cm, byWord, 1, \"grow\"); };\n\n  cmds.backwardKillWord = function(cm) { killTo(cm, byWord, -1, \"grow\"); };\n\n  cmds.nextLine = move(byLine, 1);\n\n  cmds.previousLine = move(byLine, -1);\n\n  cmds.scrollDownCommand = move(byPage, -1);\n\n  cmds.scrollUpCommand = move(byPage, 1);\n\n  cmds.backwardParagraph = move(byParagraph, -1);\n\n  cmds.forwardParagraph = move(byParagraph, 1);\n\n  cmds.backwardSentence = move(bySentence, -1);\n\n  cmds.forwardSentence = move(bySentence, 1);\n\n  cmds.killSentence = function(cm) { killTo(cm, bySentence, 1, \"grow\"); };\n\n  cmds.backwardKillSentence = function(cm) {\n    _kill(cm, cm.getCursor(), bySentence(cm, cm.getCursor(), 1), \"grow\");\n  };\n\n  cmds.killSexp = function(cm) { killTo(cm, byExpr, 1, \"grow\"); };\n\n  cmds.backwardKillSexp = function(cm) { killTo(cm, byExpr, -1, \"grow\"); };\n\n  cmds.forwardSexp = move(byExpr, 1);\n\n  cmds.backwardSexp = move(byExpr, -1);\n\n  cmds.markSexp = function(cm) {\n    var cursor = cm.getCursor();\n    cm.setSelection(findEnd(cm, cursor, byExpr, 1), cursor);\n  };\n\n  cmds.transposeSexps = function(cm) {\n    var leftStart = byExpr(cm, cm.getCursor(), -1);\n    var leftEnd = byExpr(cm, leftStart, 1);\n    var rightEnd = byExpr(cm, leftEnd, 1);\n    var rightStart = byExpr(cm, rightEnd, -1);\n    cm.replaceRange(cm.getRange(rightStart, rightEnd) +\n                    cm.getRange(leftEnd, rightStart) +\n                    cm.getRange(leftStart, leftEnd), leftStart, rightEnd);\n  };\n\n  cmds.backwardUpList = repeated(toEnclosingExpr);\n\n  cmds.justOneSpace = function(cm) {\n    var pos = cm.getCursor(), from = pos.ch;\n    var to = pos.ch, text = cm.getLine(pos.line);\n    while (from && /\\s/.test(text.charAt(from - 1))) --from;\n    while (to < text.length && /\\s/.test(text.charAt(to))) ++to;\n    cm.replaceRange(\" \", Pos(pos.line, from), Pos(pos.line, to));\n  };\n\n  cmds.openLine = repeated(function(cm) {\n    cm.replaceSelection(\"\\n\", \"start\");\n  });\n\n  // maps to emacs 'transpose-chars'\n  cmds.transposeCharsRepeatable = repeated(function(cm) {\n    cm.execCommand(\"transposeChars\");\n  });\n\n  cmds.capitalizeWord = repeated(function(cm) {\n    operateOnWord(cm, function(w) {\n      var letter = w.search(/\\w/);\n      if (letter == -1) return w;\n      return w.slice(0, letter) + w.charAt(letter).toUpperCase() +\n          w.slice(letter + 1).toLowerCase();\n    });\n  });\n\n  cmds.upcaseWord = repeated(function(cm) {\n    operateOnWord(cm, function(w) { return w.toUpperCase(); });\n  });\n\n  cmds.downcaseWord = repeated(function(cm) {\n    operateOnWord(cm, function(w) { return w.toLowerCase(); });\n  });\n\n  // maps to emacs 'undo'\n  cmds.undoRepeatable = repeated(\"undo\");\n\n  cmds.keyboardQuit = function(cm) {\n    cm.execCommand(\"clearSearch\");\n    clearMark(cm);\n  }\n\n  cmds.newline = repeated(function(cm) { cm.replaceSelection(\"\\n\", \"end\"); });\n\n  cmds.gotoLine = function(cm) {\n    var prefix = getPrefix(cm, true);\n    if (prefix != null && prefix > 0) return cm.setCursor(prefix - 1);\n\n    getInput(cm, \"Goto line\", function(str) {\n      var num;\n      if (str && !isNaN(num = Number(str)) && num == (num|0) && num > 0)\n      cm.setCursor(num - 1);\n    });\n  };\n\n  cmds.indentRigidly = function(cm) {\n    cm.indentSelection(getPrefix(cm, true) || cm.getOption(\"indentUnit\"));\n  };\n\n  cmds.exchangePointAndMark = function(cm) {\n    cm.setSelection(cm.getCursor(\"head\"), cm.getCursor(\"anchor\"));\n  };\n\n  cmds.quotedInsertTab = repeated(\"insertTab\");\n\n  cmds.universalArgument = function addPrefixMap(cm) {\n    cm.state.emacsPrefixMap = true;\n    cm.addKeyMap(prefixMap);\n    cm.on(\"keyHandled\", maybeRemovePrefixMap);\n    cm.on(\"inputRead\", maybeRemovePrefixMap);\n  };\n\n  CodeMirror.emacs = {kill: _kill, killRegion: _killRegion, repeated: repeated};\n\n  // Actual keymap\n  var keyMap = CodeMirror.keyMap.emacs = CodeMirror.normalizeKeyMap({\n    \"Ctrl-W\": \"killRegion\",\n    \"Ctrl-K\": \"killLineEmacs\",\n    \"Alt-W\": \"killRingSave\",\n    \"Ctrl-Y\": \"yank\",\n    \"Alt-Y\": \"yankPop\",\n    \"Ctrl-Space\": \"setMark\",\n    \"Ctrl-Shift-2\": \"setMark\",\n    \"Ctrl-F\": \"forwardChar\",\n    \"Ctrl-B\": \"backwardChar\",\n    \"Right\": \"forwardChar\",\n    \"Left\": \"backwardChar\",\n    \"Ctrl-D\": \"deleteChar\",\n    \"Delete\": \"deleteForwardChar\",\n    \"Ctrl-H\": \"deleteBackwardChar\",\n    \"Backspace\": \"deleteBackwardChar\",\n    \"Alt-F\": \"forwardWord\",\n    \"Alt-B\": \"backwardWord\",\n    \"Alt-Right\": \"forwardWord\",\n    \"Alt-Left\": \"backwardWord\",\n    \"Alt-D\": \"killWord\",\n    \"Alt-Backspace\": \"backwardKillWord\",\n    \"Ctrl-N\": \"nextLine\",\n    \"Ctrl-P\": \"previousLine\",\n    \"Down\": \"nextLine\",\n    \"Up\": \"previousLine\",\n    \"Ctrl-A\": \"goLineStart\",\n    \"Ctrl-E\": \"goLineEnd\",\n    \"End\": \"goLineEnd\",\n    \"Home\": \"goLineStart\",\n    \"Alt-V\": \"scrollDownCommand\",\n    \"Ctrl-V\": \"scrollUpCommand\",\n    \"PageUp\": \"scrollDownCommand\",\n    \"PageDown\": \"scrollUpCommand\",\n    \"Ctrl-Up\": \"backwardParagraph\",\n    \"Ctrl-Down\": \"forwardParagraph\",\n    \"Alt-{\": \"backwardParagraph\",\n    \"Alt-}\": \"forwardParagraph\",\n    \"Alt-A\": \"backwardSentence\",\n    \"Alt-E\": \"forwardSentence\",\n    \"Alt-K\": \"killSentence\",\n    \"Ctrl-X Delete\": \"backwardKillSentence\",\n    \"Ctrl-Alt-K\": \"killSexp\",\n    \"Ctrl-Alt-Backspace\": \"backwardKillSexp\",\n    \"Ctrl-Alt-F\": \"forwardSexp\",\n    \"Ctrl-Alt-B\": \"backwardSexp\",\n    \"Shift-Ctrl-Alt-2\": \"markSexp\",\n    \"Ctrl-Alt-T\": \"transposeSexps\",\n    \"Ctrl-Alt-U\": \"backwardUpList\",\n    \"Alt-Space\": \"justOneSpace\",\n    \"Ctrl-O\": \"openLine\",\n    \"Ctrl-T\": \"transposeCharsRepeatable\",\n    \"Alt-C\": \"capitalizeWord\",\n    \"Alt-U\": \"upcaseWord\",\n    \"Alt-L\": \"downcaseWord\",\n    \"Alt-;\": \"toggleComment\",\n    \"Ctrl-/\": \"undoRepeatable\",\n    \"Shift-Ctrl--\": \"undoRepeatable\",\n    \"Ctrl-Z\": \"undoRepeatable\",\n    \"Cmd-Z\": \"undoRepeatable\",\n    \"Ctrl-X U\": \"undoRepeatable\",\n    \"Shift-Ctrl-Z\": \"redo\",\n    \"Shift-Alt-,\": \"goDocStart\",\n    \"Shift-Alt-.\": \"goDocEnd\",\n    \"Ctrl-S\": \"findPersistentNext\",\n    \"Ctrl-R\": \"findPersistentPrev\",\n    \"Ctrl-G\": \"keyboardQuit\",\n    \"Shift-Alt-5\": \"replace\",\n    \"Alt-/\": \"autocomplete\",\n    \"Enter\": \"newlineAndIndent\",\n    \"Ctrl-J\": \"newline\",\n    \"Tab\": \"indentAuto\",\n    \"Alt-G G\": \"gotoLine\",\n    \"Ctrl-X Tab\": \"indentRigidly\",\n    \"Ctrl-X Ctrl-X\": \"exchangePointAndMark\",\n    \"Ctrl-X Ctrl-S\": \"save\",\n    \"Ctrl-X Ctrl-W\": \"save\",\n    \"Ctrl-X S\": \"saveAll\",\n    \"Ctrl-X F\": \"open\",\n    \"Ctrl-X K\": \"close\",\n    \"Ctrl-X H\": \"selectAll\",\n    \"Ctrl-Q Tab\": \"quotedInsertTab\",\n    \"Ctrl-U\": \"universalArgument\",\n    \"fallthrough\": \"default\"\n  });\n\n  var prefixMap = {\"Ctrl-G\": clearPrefix};\n  function regPrefix(d) {\n    prefixMap[d] = function(cm) { addPrefix(cm, d); };\n    keyMap[\"Ctrl-\" + d] = function(cm) { addPrefix(cm, d); };\n    prefixPreservingKeys[\"Ctrl-\" + d] = true;\n  }\n  for (var i = 0; i < 10; ++i) regPrefix(String(i));\n  regPrefix(\"-\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/keymap/sublime.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// A rough approximation of Sublime Text's keybindings\n// Depends on addon/search/searchcursor.js and optionally addon/dialog/dialogs.js\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"), require(\"../addon/search/searchcursor\"), require(\"../addon/edit/matchbrackets\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\", \"../addon/search/searchcursor\", \"../addon/edit/matchbrackets\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var cmds = CodeMirror.commands;\n  var Pos = CodeMirror.Pos;\n\n  // This is not exactly Sublime's algorithm. I couldn't make heads or tails of that.\n  function findPosSubword(doc, start, dir) {\n    if (dir < 0 && start.ch == 0) return doc.clipPos(Pos(start.line - 1));\n    var line = doc.getLine(start.line);\n    if (dir > 0 && start.ch >= line.length) return doc.clipPos(Pos(start.line + 1, 0));\n    var state = \"start\", type, startPos = start.ch;\n    for (var pos = startPos, e = dir < 0 ? 0 : line.length, i = 0; pos != e; pos += dir, i++) {\n      var next = line.charAt(dir < 0 ? pos - 1 : pos);\n      var cat = next != \"_\" && CodeMirror.isWordChar(next) ? \"w\" : \"o\";\n      if (cat == \"w\" && next.toUpperCase() == next) cat = \"W\";\n      if (state == \"start\") {\n        if (cat != \"o\") { state = \"in\"; type = cat; }\n        else startPos = pos + dir\n      } else if (state == \"in\") {\n        if (type != cat) {\n          if (type == \"w\" && cat == \"W\" && dir < 0) pos--;\n          if (type == \"W\" && cat == \"w\" && dir > 0) { // From uppercase to lowercase\n            if (pos == startPos + 1) { type = \"w\"; continue; }\n            else pos--;\n          }\n          break;\n        }\n      }\n    }\n    return Pos(start.line, pos);\n  }\n\n  function moveSubword(cm, dir) {\n    cm.extendSelectionsBy(function(range) {\n      if (cm.display.shift || cm.doc.extend || range.empty())\n        return findPosSubword(cm.doc, range.head, dir);\n      else\n        return dir < 0 ? range.from() : range.to();\n    });\n  }\n\n  cmds.goSubwordLeft = function(cm) { moveSubword(cm, -1); };\n  cmds.goSubwordRight = function(cm) { moveSubword(cm, 1); };\n\n  cmds.scrollLineUp = function(cm) {\n    var info = cm.getScrollInfo();\n    if (!cm.somethingSelected()) {\n      var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, \"local\");\n      if (cm.getCursor().line >= visibleBottomLine)\n        cm.execCommand(\"goLineUp\");\n    }\n    cm.scrollTo(null, info.top - cm.defaultTextHeight());\n  };\n  cmds.scrollLineDown = function(cm) {\n    var info = cm.getScrollInfo();\n    if (!cm.somethingSelected()) {\n      var visibleTopLine = cm.lineAtHeight(info.top, \"local\")+1;\n      if (cm.getCursor().line <= visibleTopLine)\n        cm.execCommand(\"goLineDown\");\n    }\n    cm.scrollTo(null, info.top + cm.defaultTextHeight());\n  };\n\n  cmds.splitSelectionByLine = function(cm) {\n    var ranges = cm.listSelections(), lineRanges = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var from = ranges[i].from(), to = ranges[i].to();\n      for (var line = from.line; line <= to.line; ++line)\n        if (!(to.line > from.line && line == to.line && to.ch == 0))\n          lineRanges.push({anchor: line == from.line ? from : Pos(line, 0),\n                           head: line == to.line ? to : Pos(line)});\n    }\n    cm.setSelections(lineRanges, 0);\n  };\n\n  cmds.singleSelectionTop = function(cm) {\n    var range = cm.listSelections()[0];\n    cm.setSelection(range.anchor, range.head, {scroll: false});\n  };\n\n  cmds.selectLine = function(cm) {\n    var ranges = cm.listSelections(), extended = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i];\n      extended.push({anchor: Pos(range.from().line, 0),\n                     head: Pos(range.to().line + 1, 0)});\n    }\n    cm.setSelections(extended);\n  };\n\n  function insertLine(cm, above) {\n    if (cm.isReadOnly()) return CodeMirror.Pass\n    cm.operation(function() {\n      var len = cm.listSelections().length, newSelection = [], last = -1;\n      for (var i = 0; i < len; i++) {\n        var head = cm.listSelections()[i].head;\n        if (head.line <= last) continue;\n        var at = Pos(head.line + (above ? 0 : 1), 0);\n        cm.replaceRange(\"\\n\", at, null, \"+insertLine\");\n        cm.indentLine(at.line, null, true);\n        newSelection.push({head: at, anchor: at});\n        last = head.line + 1;\n      }\n      cm.setSelections(newSelection);\n    });\n    cm.execCommand(\"indentAuto\");\n  }\n\n  cmds.insertLineAfter = function(cm) { return insertLine(cm, false); };\n\n  cmds.insertLineBefore = function(cm) { return insertLine(cm, true); };\n\n  function wordAt(cm, pos) {\n    var start = pos.ch, end = start, line = cm.getLine(pos.line);\n    while (start && CodeMirror.isWordChar(line.charAt(start - 1))) --start;\n    while (end < line.length && CodeMirror.isWordChar(line.charAt(end))) ++end;\n    return {from: Pos(pos.line, start), to: Pos(pos.line, end), word: line.slice(start, end)};\n  }\n\n  cmds.selectNextOccurrence = function(cm) {\n    var from = cm.getCursor(\"from\"), to = cm.getCursor(\"to\");\n    var fullWord = cm.state.sublimeFindFullWord == cm.doc.sel;\n    if (CodeMirror.cmpPos(from, to) == 0) {\n      var word = wordAt(cm, from);\n      if (!word.word) return;\n      cm.setSelection(word.from, word.to);\n      fullWord = true;\n    } else {\n      var text = cm.getRange(from, to);\n      var query = fullWord ? new RegExp(\"\\\\b\" + text + \"\\\\b\") : text;\n      var cur = cm.getSearchCursor(query, to);\n      var found = cur.findNext();\n      if (!found) {\n        cur = cm.getSearchCursor(query, Pos(cm.firstLine(), 0));\n        found = cur.findNext();\n      }\n      if (!found || isSelectedRange(cm.listSelections(), cur.from(), cur.to())) return\n      cm.addSelection(cur.from(), cur.to());\n    }\n    if (fullWord)\n      cm.state.sublimeFindFullWord = cm.doc.sel;\n  };\n\n  cmds.skipAndSelectNextOccurrence = function(cm) {\n    var prevAnchor = cm.getCursor(\"anchor\"), prevHead = cm.getCursor(\"head\");\n    cmds.selectNextOccurrence(cm);\n    if (CodeMirror.cmpPos(prevAnchor, prevHead) != 0) {\n      cm.doc.setSelections(cm.doc.listSelections()\n          .filter(function (sel) {\n            return sel.anchor != prevAnchor || sel.head != prevHead;\n          }));\n    }\n  }\n\n  function addCursorToSelection(cm, dir) {\n    var ranges = cm.listSelections(), newRanges = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i];\n      var newAnchor = cm.findPosV(\n          range.anchor, dir, \"line\", range.anchor.goalColumn);\n      var newHead = cm.findPosV(\n          range.head, dir, \"line\", range.head.goalColumn);\n      newAnchor.goalColumn = range.anchor.goalColumn != null ?\n          range.anchor.goalColumn : cm.cursorCoords(range.anchor, \"div\").left;\n      newHead.goalColumn = range.head.goalColumn != null ?\n          range.head.goalColumn : cm.cursorCoords(range.head, \"div\").left;\n      var newRange = {anchor: newAnchor, head: newHead};\n      newRanges.push(range);\n      newRanges.push(newRange);\n    }\n    cm.setSelections(newRanges);\n  }\n  cmds.addCursorToPrevLine = function(cm) { addCursorToSelection(cm, -1); };\n  cmds.addCursorToNextLine = function(cm) { addCursorToSelection(cm, 1); };\n\n  function isSelectedRange(ranges, from, to) {\n    for (var i = 0; i < ranges.length; i++)\n      if (CodeMirror.cmpPos(ranges[i].from(), from) == 0 &&\n          CodeMirror.cmpPos(ranges[i].to(), to) == 0) return true\n    return false\n  }\n\n  var mirror = \"(){}[]\";\n  function selectBetweenBrackets(cm) {\n    var ranges = cm.listSelections(), newRanges = []\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i], pos = range.head, opening = cm.scanForBracket(pos, -1);\n      if (!opening) return false;\n      for (;;) {\n        var closing = cm.scanForBracket(pos, 1);\n        if (!closing) return false;\n        if (closing.ch == mirror.charAt(mirror.indexOf(opening.ch) + 1)) {\n          var startPos = Pos(opening.pos.line, opening.pos.ch + 1);\n          if (CodeMirror.cmpPos(startPos, range.from()) == 0 &&\n              CodeMirror.cmpPos(closing.pos, range.to()) == 0) {\n            opening = cm.scanForBracket(opening.pos, -1);\n            if (!opening) return false;\n          } else {\n            newRanges.push({anchor: startPos, head: closing.pos});\n            break;\n          }\n        }\n        pos = Pos(closing.pos.line, closing.pos.ch + 1);\n      }\n    }\n    cm.setSelections(newRanges);\n    return true;\n  }\n\n  cmds.selectScope = function(cm) {\n    selectBetweenBrackets(cm) || cm.execCommand(\"selectAll\");\n  };\n  cmds.selectBetweenBrackets = function(cm) {\n    if (!selectBetweenBrackets(cm)) return CodeMirror.Pass;\n  };\n\n  function puncType(type) {\n    return !type ? null : /\\bpunctuation\\b/.test(type) ? type : undefined\n  }\n\n  cmds.goToBracket = function(cm) {\n    cm.extendSelectionsBy(function(range) {\n      var next = cm.scanForBracket(range.head, 1, puncType(cm.getTokenTypeAt(range.head)));\n      if (next && CodeMirror.cmpPos(next.pos, range.head) != 0) return next.pos;\n      var prev = cm.scanForBracket(range.head, -1, puncType(cm.getTokenTypeAt(Pos(range.head.line, range.head.ch + 1))));\n      return prev && Pos(prev.pos.line, prev.pos.ch + 1) || range.head;\n    });\n  };\n\n  cmds.swapLineUp = function(cm) {\n    if (cm.isReadOnly()) return CodeMirror.Pass\n    var ranges = cm.listSelections(), linesToMove = [], at = cm.firstLine() - 1, newSels = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i], from = range.from().line - 1, to = range.to().line;\n      newSels.push({anchor: Pos(range.anchor.line - 1, range.anchor.ch),\n                    head: Pos(range.head.line - 1, range.head.ch)});\n      if (range.to().ch == 0 && !range.empty()) --to;\n      if (from > at) linesToMove.push(from, to);\n      else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;\n      at = to;\n    }\n    cm.operation(function() {\n      for (var i = 0; i < linesToMove.length; i += 2) {\n        var from = linesToMove[i], to = linesToMove[i + 1];\n        var line = cm.getLine(from);\n        cm.replaceRange(\"\", Pos(from, 0), Pos(from + 1, 0), \"+swapLine\");\n        if (to > cm.lastLine())\n          cm.replaceRange(\"\\n\" + line, Pos(cm.lastLine()), null, \"+swapLine\");\n        else\n          cm.replaceRange(line + \"\\n\", Pos(to, 0), null, \"+swapLine\");\n      }\n      cm.setSelections(newSels);\n      cm.scrollIntoView();\n    });\n  };\n\n  cmds.swapLineDown = function(cm) {\n    if (cm.isReadOnly()) return CodeMirror.Pass\n    var ranges = cm.listSelections(), linesToMove = [], at = cm.lastLine() + 1;\n    for (var i = ranges.length - 1; i >= 0; i--) {\n      var range = ranges[i], from = range.to().line + 1, to = range.from().line;\n      if (range.to().ch == 0 && !range.empty()) from--;\n      if (from < at) linesToMove.push(from, to);\n      else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;\n      at = to;\n    }\n    cm.operation(function() {\n      for (var i = linesToMove.length - 2; i >= 0; i -= 2) {\n        var from = linesToMove[i], to = linesToMove[i + 1];\n        var line = cm.getLine(from);\n        if (from == cm.lastLine())\n          cm.replaceRange(\"\", Pos(from - 1), Pos(from), \"+swapLine\");\n        else\n          cm.replaceRange(\"\", Pos(from, 0), Pos(from + 1, 0), \"+swapLine\");\n        cm.replaceRange(line + \"\\n\", Pos(to, 0), null, \"+swapLine\");\n      }\n      cm.scrollIntoView();\n    });\n  };\n\n  cmds.toggleCommentIndented = function(cm) {\n    cm.toggleComment({ indent: true });\n  }\n\n  cmds.joinLines = function(cm) {\n    var ranges = cm.listSelections(), joined = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i], from = range.from();\n      var start = from.line, end = range.to().line;\n      while (i < ranges.length - 1 && ranges[i + 1].from().line == end)\n        end = ranges[++i].to().line;\n      joined.push({start: start, end: end, anchor: !range.empty() && from});\n    }\n    cm.operation(function() {\n      var offset = 0, ranges = [];\n      for (var i = 0; i < joined.length; i++) {\n        var obj = joined[i];\n        var anchor = obj.anchor && Pos(obj.anchor.line - offset, obj.anchor.ch), head;\n        for (var line = obj.start; line <= obj.end; line++) {\n          var actual = line - offset;\n          if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1);\n          if (actual < cm.lastLine()) {\n            cm.replaceRange(\" \", Pos(actual), Pos(actual + 1, /^\\s*/.exec(cm.getLine(actual + 1))[0].length));\n            ++offset;\n          }\n        }\n        ranges.push({anchor: anchor || head, head: head});\n      }\n      cm.setSelections(ranges, 0);\n    });\n  };\n\n  cmds.duplicateLine = function(cm) {\n    cm.operation(function() {\n      var rangeCount = cm.listSelections().length;\n      for (var i = 0; i < rangeCount; i++) {\n        var range = cm.listSelections()[i];\n        if (range.empty())\n          cm.replaceRange(cm.getLine(range.head.line) + \"\\n\", Pos(range.head.line, 0));\n        else\n          cm.replaceRange(cm.getRange(range.from(), range.to()), range.from());\n      }\n      cm.scrollIntoView();\n    });\n  };\n\n\n  function sortLines(cm, caseSensitive, direction) {\n    if (cm.isReadOnly()) return CodeMirror.Pass\n    var ranges = cm.listSelections(), toSort = [], selected;\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i];\n      if (range.empty()) continue;\n      var from = range.from().line, to = range.to().line;\n      while (i < ranges.length - 1 && ranges[i + 1].from().line == to)\n        to = ranges[++i].to().line;\n      if (!ranges[i].to().ch) to--;\n      toSort.push(from, to);\n    }\n    if (toSort.length) selected = true;\n    else toSort.push(cm.firstLine(), cm.lastLine());\n\n    cm.operation(function() {\n      var ranges = [];\n      for (var i = 0; i < toSort.length; i += 2) {\n        var from = toSort[i], to = toSort[i + 1];\n        var start = Pos(from, 0), end = Pos(to);\n        var lines = cm.getRange(start, end, false);\n        if (caseSensitive)\n          lines.sort(function(a, b) { return a < b ? -direction : a == b ? 0 : direction; });\n        else\n          lines.sort(function(a, b) {\n            var au = a.toUpperCase(), bu = b.toUpperCase();\n            if (au != bu) { a = au; b = bu; }\n            return a < b ? -direction : a == b ? 0 : direction;\n          });\n        cm.replaceRange(lines, start, end);\n        if (selected) ranges.push({anchor: start, head: Pos(to + 1, 0)});\n      }\n      if (selected) cm.setSelections(ranges, 0);\n    });\n  }\n\n  cmds.sortLines = function(cm) { sortLines(cm, true, 1); };\n  cmds.reverseSortLines = function(cm) { sortLines(cm, true, -1); };\n  cmds.sortLinesInsensitive = function(cm) { sortLines(cm, false, 1); };\n  cmds.reverseSortLinesInsensitive = function(cm) { sortLines(cm, false, -1); };\n\n  cmds.nextBookmark = function(cm) {\n    var marks = cm.state.sublimeBookmarks;\n    if (marks) while (marks.length) {\n      var current = marks.shift();\n      var found = current.find();\n      if (found) {\n        marks.push(current);\n        return cm.setSelection(found.from, found.to);\n      }\n    }\n  };\n\n  cmds.prevBookmark = function(cm) {\n    var marks = cm.state.sublimeBookmarks;\n    if (marks) while (marks.length) {\n      marks.unshift(marks.pop());\n      var found = marks[marks.length - 1].find();\n      if (!found)\n        marks.pop();\n      else\n        return cm.setSelection(found.from, found.to);\n    }\n  };\n\n  cmds.toggleBookmark = function(cm) {\n    var ranges = cm.listSelections();\n    var marks = cm.state.sublimeBookmarks || (cm.state.sublimeBookmarks = []);\n    for (var i = 0; i < ranges.length; i++) {\n      var from = ranges[i].from(), to = ranges[i].to();\n      var found = ranges[i].empty() ? cm.findMarksAt(from) : cm.findMarks(from, to);\n      for (var j = 0; j < found.length; j++) {\n        if (found[j].sublimeBookmark) {\n          found[j].clear();\n          for (var k = 0; k < marks.length; k++)\n            if (marks[k] == found[j])\n              marks.splice(k--, 1);\n          break;\n        }\n      }\n      if (j == found.length)\n        marks.push(cm.markText(from, to, {sublimeBookmark: true, clearWhenEmpty: false}));\n    }\n  };\n\n  cmds.clearBookmarks = function(cm) {\n    var marks = cm.state.sublimeBookmarks;\n    if (marks) for (var i = 0; i < marks.length; i++) marks[i].clear();\n    marks.length = 0;\n  };\n\n  cmds.selectBookmarks = function(cm) {\n    var marks = cm.state.sublimeBookmarks, ranges = [];\n    if (marks) for (var i = 0; i < marks.length; i++) {\n      var found = marks[i].find();\n      if (!found)\n        marks.splice(i--, 0);\n      else\n        ranges.push({anchor: found.from, head: found.to});\n    }\n    if (ranges.length)\n      cm.setSelections(ranges, 0);\n  };\n\n  function modifyWordOrSelection(cm, mod) {\n    cm.operation(function() {\n      var ranges = cm.listSelections(), indices = [], replacements = [];\n      for (var i = 0; i < ranges.length; i++) {\n        var range = ranges[i];\n        if (range.empty()) { indices.push(i); replacements.push(\"\"); }\n        else replacements.push(mod(cm.getRange(range.from(), range.to())));\n      }\n      cm.replaceSelections(replacements, \"around\", \"case\");\n      for (var i = indices.length - 1, at; i >= 0; i--) {\n        var range = ranges[indices[i]];\n        if (at && CodeMirror.cmpPos(range.head, at) > 0) continue;\n        var word = wordAt(cm, range.head);\n        at = word.from;\n        cm.replaceRange(mod(word.word), word.from, word.to);\n      }\n    });\n  }\n\n  cmds.smartBackspace = function(cm) {\n    if (cm.somethingSelected()) return CodeMirror.Pass;\n\n    cm.operation(function() {\n      var cursors = cm.listSelections();\n      var indentUnit = cm.getOption(\"indentUnit\");\n\n      for (var i = cursors.length - 1; i >= 0; i--) {\n        var cursor = cursors[i].head;\n        var toStartOfLine = cm.getRange({line: cursor.line, ch: 0}, cursor);\n        var column = CodeMirror.countColumn(toStartOfLine, null, cm.getOption(\"tabSize\"));\n\n        // Delete by one character by default\n        var deletePos = cm.findPosH(cursor, -1, \"char\", false);\n\n        if (toStartOfLine && !/\\S/.test(toStartOfLine) && column % indentUnit == 0) {\n          var prevIndent = new Pos(cursor.line,\n            CodeMirror.findColumn(toStartOfLine, column - indentUnit, indentUnit));\n\n          // Smart delete only if we found a valid prevIndent location\n          if (prevIndent.ch != cursor.ch) deletePos = prevIndent;\n        }\n\n        cm.replaceRange(\"\", deletePos, cursor, \"+delete\");\n      }\n    });\n  };\n\n  cmds.delLineRight = function(cm) {\n    cm.operation(function() {\n      var ranges = cm.listSelections();\n      for (var i = ranges.length - 1; i >= 0; i--)\n        cm.replaceRange(\"\", ranges[i].anchor, Pos(ranges[i].to().line), \"+delete\");\n      cm.scrollIntoView();\n    });\n  };\n\n  cmds.upcaseAtCursor = function(cm) {\n    modifyWordOrSelection(cm, function(str) { return str.toUpperCase(); });\n  };\n  cmds.downcaseAtCursor = function(cm) {\n    modifyWordOrSelection(cm, function(str) { return str.toLowerCase(); });\n  };\n\n  cmds.setSublimeMark = function(cm) {\n    if (cm.state.sublimeMark) cm.state.sublimeMark.clear();\n    cm.state.sublimeMark = cm.setBookmark(cm.getCursor());\n  };\n  cmds.selectToSublimeMark = function(cm) {\n    var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n    if (found) cm.setSelection(cm.getCursor(), found);\n  };\n  cmds.deleteToSublimeMark = function(cm) {\n    var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n    if (found) {\n      var from = cm.getCursor(), to = found;\n      if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; }\n      cm.state.sublimeKilled = cm.getRange(from, to);\n      cm.replaceRange(\"\", from, to);\n    }\n  };\n  cmds.swapWithSublimeMark = function(cm) {\n    var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n    if (found) {\n      cm.state.sublimeMark.clear();\n      cm.state.sublimeMark = cm.setBookmark(cm.getCursor());\n      cm.setCursor(found);\n    }\n  };\n  cmds.sublimeYank = function(cm) {\n    if (cm.state.sublimeKilled != null)\n      cm.replaceSelection(cm.state.sublimeKilled, null, \"paste\");\n  };\n\n  cmds.showInCenter = function(cm) {\n    var pos = cm.cursorCoords(null, \"local\");\n    cm.scrollTo(null, (pos.top + pos.bottom) / 2 - cm.getScrollInfo().clientHeight / 2);\n  };\n\n  function getTarget(cm) {\n    var from = cm.getCursor(\"from\"), to = cm.getCursor(\"to\");\n    if (CodeMirror.cmpPos(from, to) == 0) {\n      var word = wordAt(cm, from);\n      if (!word.word) return;\n      from = word.from;\n      to = word.to;\n    }\n    return {from: from, to: to, query: cm.getRange(from, to), word: word};\n  }\n\n  function findAndGoTo(cm, forward) {\n    var target = getTarget(cm);\n    if (!target) return;\n    var query = target.query;\n    var cur = cm.getSearchCursor(query, forward ? target.to : target.from);\n\n    if (forward ? cur.findNext() : cur.findPrevious()) {\n      cm.setSelection(cur.from(), cur.to());\n    } else {\n      cur = cm.getSearchCursor(query, forward ? Pos(cm.firstLine(), 0)\n                                              : cm.clipPos(Pos(cm.lastLine())));\n      if (forward ? cur.findNext() : cur.findPrevious())\n        cm.setSelection(cur.from(), cur.to());\n      else if (target.word)\n        cm.setSelection(target.from, target.to);\n    }\n  };\n  cmds.findUnder = function(cm) { findAndGoTo(cm, true); };\n  cmds.findUnderPrevious = function(cm) { findAndGoTo(cm,false); };\n  cmds.findAllUnder = function(cm) {\n    var target = getTarget(cm);\n    if (!target) return;\n    var cur = cm.getSearchCursor(target.query);\n    var matches = [];\n    var primaryIndex = -1;\n    while (cur.findNext()) {\n      matches.push({anchor: cur.from(), head: cur.to()});\n      if (cur.from().line <= target.from.line && cur.from().ch <= target.from.ch)\n        primaryIndex++;\n    }\n    cm.setSelections(matches, primaryIndex);\n  };\n\n\n  var keyMap = CodeMirror.keyMap;\n  keyMap.macSublime = {\n    \"Cmd-Left\": \"goLineStartSmart\",\n    \"Shift-Tab\": \"indentLess\",\n    \"Shift-Ctrl-K\": \"deleteLine\",\n    \"Alt-Q\": \"wrapLines\",\n    \"Ctrl-Left\": \"goSubwordLeft\",\n    \"Ctrl-Right\": \"goSubwordRight\",\n    \"Ctrl-Alt-Up\": \"scrollLineUp\",\n    \"Ctrl-Alt-Down\": \"scrollLineDown\",\n    \"Cmd-L\": \"selectLine\",\n    \"Shift-Cmd-L\": \"splitSelectionByLine\",\n    \"Esc\": \"singleSelectionTop\",\n    \"Cmd-Enter\": \"insertLineAfter\",\n    \"Shift-Cmd-Enter\": \"insertLineBefore\",\n    \"Cmd-D\": \"selectNextOccurrence\",\n    \"Shift-Cmd-Space\": \"selectScope\",\n    \"Shift-Cmd-M\": \"selectBetweenBrackets\",\n    \"Cmd-M\": \"goToBracket\",\n    \"Cmd-Ctrl-Up\": \"swapLineUp\",\n    \"Cmd-Ctrl-Down\": \"swapLineDown\",\n    \"Cmd-/\": \"toggleCommentIndented\",\n    \"Cmd-J\": \"joinLines\",\n    \"Shift-Cmd-D\": \"duplicateLine\",\n    \"F5\": \"sortLines\",\n    \"Shift-F5\": \"reverseSortLines\",\n    \"Cmd-F5\": \"sortLinesInsensitive\",\n    \"Shift-Cmd-F5\": \"reverseSortLinesInsensitive\",\n    \"F2\": \"nextBookmark\",\n    \"Shift-F2\": \"prevBookmark\",\n    \"Cmd-F2\": \"toggleBookmark\",\n    \"Shift-Cmd-F2\": \"clearBookmarks\",\n    \"Alt-F2\": \"selectBookmarks\",\n    \"Backspace\": \"smartBackspace\",\n    \"Cmd-K Cmd-D\": \"skipAndSelectNextOccurrence\",\n    \"Cmd-K Cmd-K\": \"delLineRight\",\n    \"Cmd-K Cmd-U\": \"upcaseAtCursor\",\n    \"Cmd-K Cmd-L\": \"downcaseAtCursor\",\n    \"Cmd-K Cmd-Space\": \"setSublimeMark\",\n    \"Cmd-K Cmd-A\": \"selectToSublimeMark\",\n    \"Cmd-K Cmd-W\": \"deleteToSublimeMark\",\n    \"Cmd-K Cmd-X\": \"swapWithSublimeMark\",\n    \"Cmd-K Cmd-Y\": \"sublimeYank\",\n    \"Cmd-K Cmd-C\": \"showInCenter\",\n    \"Cmd-K Cmd-G\": \"clearBookmarks\",\n    \"Cmd-K Cmd-Backspace\": \"delLineLeft\",\n    \"Cmd-K Cmd-1\": \"foldAll\",\n    \"Cmd-K Cmd-0\": \"unfoldAll\",\n    \"Cmd-K Cmd-J\": \"unfoldAll\",\n    \"Ctrl-Shift-Up\": \"addCursorToPrevLine\",\n    \"Ctrl-Shift-Down\": \"addCursorToNextLine\",\n    \"Cmd-F3\": \"findUnder\",\n    \"Shift-Cmd-F3\": \"findUnderPrevious\",\n    \"Alt-F3\": \"findAllUnder\",\n    \"Shift-Cmd-[\": \"fold\",\n    \"Shift-Cmd-]\": \"unfold\",\n    \"Cmd-I\": \"findIncremental\",\n    \"Shift-Cmd-I\": \"findIncrementalReverse\",\n    \"Cmd-H\": \"replace\",\n    \"F3\": \"findNext\",\n    \"Shift-F3\": \"findPrev\",\n    \"fallthrough\": \"macDefault\"\n  };\n  CodeMirror.normalizeKeyMap(keyMap.macSublime);\n\n  keyMap.pcSublime = {\n    \"Shift-Tab\": \"indentLess\",\n    \"Shift-Ctrl-K\": \"deleteLine\",\n    \"Alt-Q\": \"wrapLines\",\n    \"Ctrl-T\": \"transposeChars\",\n    \"Alt-Left\": \"goSubwordLeft\",\n    \"Alt-Right\": \"goSubwordRight\",\n    \"Ctrl-Up\": \"scrollLineUp\",\n    \"Ctrl-Down\": \"scrollLineDown\",\n    \"Ctrl-L\": \"selectLine\",\n    \"Shift-Ctrl-L\": \"splitSelectionByLine\",\n    \"Esc\": \"singleSelectionTop\",\n    \"Ctrl-Enter\": \"insertLineAfter\",\n    \"Shift-Ctrl-Enter\": \"insertLineBefore\",\n    \"Ctrl-D\": \"selectNextOccurrence\",\n    \"Shift-Ctrl-Space\": \"selectScope\",\n    \"Shift-Ctrl-M\": \"selectBetweenBrackets\",\n    \"Ctrl-M\": \"goToBracket\",\n    \"Shift-Ctrl-Up\": \"swapLineUp\",\n    \"Shift-Ctrl-Down\": \"swapLineDown\",\n    \"Ctrl-/\": \"toggleCommentIndented\",\n    \"Ctrl-J\": \"joinLines\",\n    \"Shift-Ctrl-D\": \"duplicateLine\",\n    \"F9\": \"sortLines\",\n    \"Shift-F9\": \"reverseSortLines\",\n    \"Ctrl-F9\": \"sortLinesInsensitive\",\n    \"Shift-Ctrl-F9\": \"reverseSortLinesInsensitive\",\n    \"F2\": \"nextBookmark\",\n    \"Shift-F2\": \"prevBookmark\",\n    \"Ctrl-F2\": \"toggleBookmark\",\n    \"Shift-Ctrl-F2\": \"clearBookmarks\",\n    \"Alt-F2\": \"selectBookmarks\",\n    \"Backspace\": \"smartBackspace\",\n    \"Ctrl-K Ctrl-D\": \"skipAndSelectNextOccurrence\",\n    \"Ctrl-K Ctrl-K\": \"delLineRight\",\n    \"Ctrl-K Ctrl-U\": \"upcaseAtCursor\",\n    \"Ctrl-K Ctrl-L\": \"downcaseAtCursor\",\n    \"Ctrl-K Ctrl-Space\": \"setSublimeMark\",\n    \"Ctrl-K Ctrl-A\": \"selectToSublimeMark\",\n    \"Ctrl-K Ctrl-W\": \"deleteToSublimeMark\",\n    \"Ctrl-K Ctrl-X\": \"swapWithSublimeMark\",\n    \"Ctrl-K Ctrl-Y\": \"sublimeYank\",\n    \"Ctrl-K Ctrl-C\": \"showInCenter\",\n    \"Ctrl-K Ctrl-G\": \"clearBookmarks\",\n    \"Ctrl-K Ctrl-Backspace\": \"delLineLeft\",\n    \"Ctrl-K Ctrl-1\": \"foldAll\",\n    \"Ctrl-K Ctrl-0\": \"unfoldAll\",\n    \"Ctrl-K Ctrl-J\": \"unfoldAll\",\n    \"Ctrl-Alt-Up\": \"addCursorToPrevLine\",\n    \"Ctrl-Alt-Down\": \"addCursorToNextLine\",\n    \"Ctrl-F3\": \"findUnder\",\n    \"Shift-Ctrl-F3\": \"findUnderPrevious\",\n    \"Alt-F3\": \"findAllUnder\",\n    \"Shift-Ctrl-[\": \"fold\",\n    \"Shift-Ctrl-]\": \"unfold\",\n    \"Ctrl-I\": \"findIncremental\",\n    \"Shift-Ctrl-I\": \"findIncrementalReverse\",\n    \"Ctrl-H\": \"replace\",\n    \"F3\": \"findNext\",\n    \"Shift-F3\": \"findPrev\",\n    \"fallthrough\": \"pcDefault\"\n  };\n  CodeMirror.normalizeKeyMap(keyMap.pcSublime);\n\n  var mac = keyMap.default == keyMap.macDefault;\n  keyMap.sublime = mac ? keyMap.macSublime : keyMap.pcSublime;\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/keymap/vim.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Supported keybindings:\n *   Too many to list. Refer to defaultKeymap below.\n *\n * Supported Ex commands:\n *   Refer to defaultExCommandMap below.\n *\n * Registers: unnamed, -, ., :, /, _, a-z, A-Z, 0-9\n *   (Does not respect the special case for number registers when delete\n *    operator is made with these commands: %, (, ),  , /, ?, n, N, {, } )\n *   TODO: Implement the remaining registers.\n *\n * Marks: a-z, A-Z, and 0-9\n *   TODO: Implement the remaining special marks. They have more complex\n *       behavior.\n *\n * Events:\n *  'vim-mode-change' - raised on the editor anytime the current mode changes,\n *                      Event object: {mode: \"visual\", subMode: \"linewise\"}\n *\n * Code structure:\n *  1. Default keymap\n *  2. Variable declarations and short basic helpers\n *  3. Instance (External API) implementation\n *  4. Internal state tracking objects (input state, counter) implementation\n *     and instantiation\n *  5. Key handler (the main command dispatcher) implementation\n *  6. Motion, operator, and action implementations\n *  7. Helper functions for the key handler, motions, operators, and actions\n *  8. Set up Vim to work as a keymap for CodeMirror.\n *  9. Ex command implementations.\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"), require(\"../addon/search/searchcursor\"), require(\"../addon/dialog/dialog\"), require(\"../addon/edit/matchbrackets.js\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\", \"../addon/search/searchcursor\", \"../addon/dialog/dialog\", \"../addon/edit/matchbrackets\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  'use strict';\n\n  var Pos = CodeMirror.Pos;\n\n  function transformCursor(cm, range) {\n    var vim = cm.state.vim;\n    if (!vim || vim.insertMode) return range.head;\n    var head = vim.sel.head;\n    if (!head)  return range.head;\n\n    if (vim.visualBlock) {\n      if (range.head.line != head.line) {\n        return;\n      }\n    }\n    if (range.from() == range.anchor && !range.empty()) {\n      if (range.head.line == head.line && range.head.ch != head.ch)\n        return new Pos(range.head.line, range.head.ch - 1);\n    }\n\n    return range.head;\n  }\n\n  var defaultKeymap = [\n    // Key to key mapping. This goes first to make it possible to override\n    // existing mappings.\n    { keys: '<Left>', type: 'keyToKey', toKeys: 'h' },\n    { keys: '<Right>', type: 'keyToKey', toKeys: 'l' },\n    { keys: '<Up>', type: 'keyToKey', toKeys: 'k' },\n    { keys: '<Down>', type: 'keyToKey', toKeys: 'j' },\n    { keys: 'g<Up>', type: 'keyToKey', toKeys: 'gk' },\n    { keys: 'g<Down>', type: 'keyToKey', toKeys: 'gj' },\n    { keys: '<Space>', type: 'keyToKey', toKeys: 'l' },\n    { keys: '<BS>', type: 'keyToKey', toKeys: 'h', context: 'normal'},\n    { keys: '<Del>', type: 'keyToKey', toKeys: 'x', context: 'normal'},\n    { keys: '<C-Space>', type: 'keyToKey', toKeys: 'W' },\n    { keys: '<C-BS>', type: 'keyToKey', toKeys: 'B', context: 'normal' },\n    { keys: '<S-Space>', type: 'keyToKey', toKeys: 'w' },\n    { keys: '<S-BS>', type: 'keyToKey', toKeys: 'b', context: 'normal' },\n    { keys: '<C-n>', type: 'keyToKey', toKeys: 'j' },\n    { keys: '<C-p>', type: 'keyToKey', toKeys: 'k' },\n    { keys: '<C-[>', type: 'keyToKey', toKeys: '<Esc>' },\n    { keys: '<C-c>', type: 'keyToKey', toKeys: '<Esc>' },\n    { keys: '<C-[>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },\n    { keys: '<C-c>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },\n    { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' },\n    { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual'},\n    { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' },\n    { keys: 'S', type: 'keyToKey', toKeys: 'VdO', context: 'visual' },\n    { keys: '<Home>', type: 'keyToKey', toKeys: '0' },\n    { keys: '<End>', type: 'keyToKey', toKeys: '$' },\n    { keys: '<PageUp>', type: 'keyToKey', toKeys: '<C-b>' },\n    { keys: '<PageDown>', type: 'keyToKey', toKeys: '<C-f>' },\n    { keys: '<CR>', type: 'keyToKey', toKeys: 'j^', context: 'normal' },\n    { keys: '<Ins>', type: 'keyToKey', toKeys: 'i', context: 'normal'},\n    { keys: '<Ins>', type: 'action', action: 'toggleOverwrite', context: 'insert' },\n    // Motions\n    { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }},\n    { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }},\n    { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }},\n    { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false }},\n    { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true }},\n    { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true }},\n    { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true }},\n    { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true }},\n    { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false }},\n    { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false }},\n    { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true }},\n    { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true }},\n    { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true }},\n    { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }},\n    { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true }},\n    { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true }},\n    { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }},\n    { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }},\n    { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }},\n    { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false }},\n    { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true }},\n    { keys: '<C-f>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }},\n    { keys: '<C-b>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }},\n    { keys: '<C-d>', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }},\n    { keys: '<C-u>', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true }},\n    { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }},\n    { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }},\n    {keys: \"g$\", type: \"motion\", motion: \"moveToEndOfDisplayLine\"},\n    {keys: \"g^\", type: \"motion\", motion: \"moveToStartOfDisplayLine\"},\n    {keys: \"g0\", type: \"motion\", motion: \"moveToStartOfDisplayLine\"},\n    { keys: '0', type: 'motion', motion: 'moveToStartOfLine' },\n    { keys: '^', type: 'motion', motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true }},\n    { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar:true }},\n    { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }},\n    { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true }},\n    { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true }},\n    { keys: 'f<character>', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true , inclusive: true }},\n    { keys: 'F<character>', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false }},\n    { keys: 't<character>', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true }},\n    { keys: 'T<character>', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false }},\n    { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true }},\n    { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false }},\n    { keys: '\\'<character>', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true, linewise: true}},\n    { keys: '`<character>', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true}},\n    { keys: ']`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } },\n    { keys: '[`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } },\n    { keys: ']\\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } },\n    { keys: '[\\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } },\n    // the next two aren't motions but must come before more general motion declarations\n    { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true}},\n    { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true}},\n    { keys: ']<character>', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true}},\n    { keys: '[<character>', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true}},\n    { keys: '|', type: 'motion', motion: 'moveToColumn'},\n    { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context:'visual'},\n    { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: {sameLine: true}, context:'visual'},\n    // Operators\n    { keys: 'd', type: 'operator', operator: 'delete' },\n    { keys: 'y', type: 'operator', operator: 'yank' },\n    { keys: 'c', type: 'operator', operator: 'change' },\n    { keys: '=', type: 'operator', operator: 'indentAuto' },\n    { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true }},\n    { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false }},\n    { keys: 'g~', type: 'operator', operator: 'changeCase' },\n    { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, isEdit: true },\n    { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true },\n    { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }},\n    { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }},\n    { keys: 'gn', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: true }},\n    { keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false }},\n    // Operator-Motion dual commands\n    { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }},\n    { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }},\n    { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},\n    { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual'},\n    { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'expandToLine', motionArgs: { linewise: true }, context: 'normal'},\n    { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual'},\n    { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},\n    { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual'},\n    { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal'},\n    { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual'},\n    { keys: '<C-u>', type: 'operatorMotion', operator: 'delete', motion: 'moveToStartOfLine', context: 'insert' },\n    { keys: '<C-w>', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' },\n    //ignore C-w in normal mode\n    { keys: '<C-w>', type: 'idle', context: 'normal' },\n    // Actions\n    { keys: '<C-i>', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true }},\n    { keys: '<C-o>', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false }},\n    { keys: '<C-e>', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true }},\n    { keys: '<C-y>', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true }},\n    { keys: 'a', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'charAfter' }, context: 'normal' },\n    { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' },\n    { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' },\n    { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' },\n    { keys: 'gi', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'lastEdit' }, context: 'normal' },\n    { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank'}, context: 'normal' },\n    { keys: 'gI', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'bol'}, context: 'normal' },\n    { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' },\n    { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' },\n    { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' },\n    { keys: 'v', type: 'action', action: 'toggleVisualMode' },\n    { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true }},\n    { keys: '<C-v>', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }},\n    { keys: '<C-q>', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }},\n    { keys: 'gv', type: 'action', action: 'reselectLastSelection' },\n    { keys: 'J', type: 'action', action: 'joinLines', isEdit: true },\n    { keys: 'gJ', type: 'action', action: 'joinLines', actionArgs: { keepSpaces: true }, isEdit: true },\n    { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true }},\n    { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true }},\n    { keys: 'r<character>', type: 'action', action: 'replace', isEdit: true },\n    { keys: '@<character>', type: 'action', action: 'replayMacro' },\n    { keys: 'q<character>', type: 'action', action: 'enterMacroRecordMode' },\n    // Handle Replace-mode as a special case of insert mode.\n    { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }, context: 'normal'},\n    { keys: 'R', type: 'operator', operator: 'change', operatorArgs: { linewise: true, fullLine: true }, context: 'visual', exitVisualBlock: true},\n    { keys: 'u', type: 'action', action: 'undo', context: 'normal' },\n    { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true },\n    { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true },\n    { keys: '<C-r>', type: 'action', action: 'redo' },\n    { keys: 'm<character>', type: 'action', action: 'setMark' },\n    { keys: '\"<character>', type: 'action', action: 'setRegister' },\n    { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }},\n    { keys: 'z.', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }},\n    { keys: 'z<CR>', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }},\n    { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: '.', type: 'action', action: 'repeatLastEdit' },\n    { keys: '<C-a>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}},\n    { keys: '<C-x>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}},\n    { keys: '<C-t>', type: 'action', action: 'indent', actionArgs: { indentRight: true }, context: 'insert' },\n    { keys: '<C-d>', type: 'action', action: 'indent', actionArgs: { indentRight: false }, context: 'insert' },\n    // Text object motions\n    { keys: 'a<character>', type: 'motion', motion: 'textObjectManipulation' },\n    { keys: 'i<character>', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }},\n    // Search\n    { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }},\n    { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }},\n    { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n    { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n    { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }},\n    { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }},\n    // Ex command\n    { keys: ':', type: 'ex' }\n  ];\n  var defaultKeymapLength = defaultKeymap.length;\n\n  /**\n   * Ex commands\n   * Care must be taken when adding to the default Ex command map. For any\n   * pair of commands that have a shared prefix, at least one of their\n   * shortNames must not match the prefix of the other command.\n   */\n  var defaultExCommandMap = [\n    { name: 'colorscheme', shortName: 'colo' },\n    { name: 'map' },\n    { name: 'imap', shortName: 'im' },\n    { name: 'nmap', shortName: 'nm' },\n    { name: 'vmap', shortName: 'vm' },\n    { name: 'unmap' },\n    { name: 'write', shortName: 'w' },\n    { name: 'undo', shortName: 'u' },\n    { name: 'redo', shortName: 'red' },\n    { name: 'set', shortName: 'se' },\n    { name: 'setlocal', shortName: 'setl' },\n    { name: 'setglobal', shortName: 'setg' },\n    { name: 'sort', shortName: 'sor' },\n    { name: 'substitute', shortName: 's', possiblyAsync: true },\n    { name: 'nohlsearch', shortName: 'noh' },\n    { name: 'yank', shortName: 'y' },\n    { name: 'delmarks', shortName: 'delm' },\n    { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true },\n    { name: 'vglobal', shortName: 'v' },\n    { name: 'global', shortName: 'g' }\n  ];\n\n  var Vim = function() {\n    function enterVimMode(cm) {\n      cm.setOption('disableInput', true);\n      cm.setOption('showCursorWhenSelecting', false);\n      CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n      cm.on('cursorActivity', onCursorActivity);\n      maybeInitVimState(cm);\n      CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm));\n    }\n\n    function leaveVimMode(cm) {\n      cm.setOption('disableInput', false);\n      cm.off('cursorActivity', onCursorActivity);\n      CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm));\n      cm.state.vim = null;\n      if (highlightTimeout) clearTimeout(highlightTimeout);\n    }\n\n    function detachVimMap(cm, next) {\n      if (this == CodeMirror.keyMap.vim) {\n        cm.options.$customCursor = null;\n        CodeMirror.rmClass(cm.getWrapperElement(), \"cm-fat-cursor\");\n      }\n\n      if (!next || next.attach != attachVimMap)\n        leaveVimMode(cm);\n    }\n    function attachVimMap(cm, prev) {\n      if (this == CodeMirror.keyMap.vim) {\n        if (cm.curOp) cm.curOp.selectionChanged = true;\n        cm.options.$customCursor = transformCursor;\n        CodeMirror.addClass(cm.getWrapperElement(), \"cm-fat-cursor\");\n      }\n\n      if (!prev || prev.attach != attachVimMap)\n        enterVimMode(cm);\n    }\n\n    // Deprecated, simply setting the keymap works again.\n    CodeMirror.defineOption('vimMode', false, function(cm, val, prev) {\n      if (val && cm.getOption(\"keyMap\") != \"vim\")\n        cm.setOption(\"keyMap\", \"vim\");\n      else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption(\"keyMap\")))\n        cm.setOption(\"keyMap\", \"default\");\n    });\n\n    function cmKey(key, cm) {\n      if (!cm) { return undefined; }\n      if (this[key]) { return this[key]; }\n      var vimKey = cmKeyToVimKey(key);\n      if (!vimKey) {\n        return false;\n      }\n      var cmd = vimApi.findKey(cm, vimKey);\n      if (typeof cmd == 'function') {\n        CodeMirror.signal(cm, 'vim-keypress', vimKey);\n      }\n      return cmd;\n    }\n\n    var modifiers = {Shift:'S',Ctrl:'C',Alt:'A',Cmd:'D',Mod:'A',CapsLock:''};\n    var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del',Insert:'Ins'};\n    function cmKeyToVimKey(key) {\n      if (key.charAt(0) == '\\'') {\n        // Keypress character binding of format \"'a'\"\n        return key.charAt(1);\n      }\n      var pieces = key.split(/-(?!$)/);\n      var lastPiece = pieces[pieces.length - 1];\n      if (pieces.length == 1 && pieces[0].length == 1) {\n        // No-modifier bindings use literal character bindings above. Skip.\n        return false;\n      } else if (pieces.length == 2 && pieces[0] == 'Shift' && lastPiece.length == 1) {\n        // Ignore Shift+char bindings as they should be handled by literal character.\n        return false;\n      }\n      var hasCharacter = false;\n      for (var i = 0; i < pieces.length; i++) {\n        var piece = pieces[i];\n        if (piece in modifiers) { pieces[i] = modifiers[piece]; }\n        else { hasCharacter = true; }\n        if (piece in specialKeys) { pieces[i] = specialKeys[piece]; }\n      }\n      if (!hasCharacter) {\n        // Vim does not support modifier only keys.\n        return false;\n      }\n      // TODO: Current bindings expect the character to be lower case, but\n      // it looks like vim key notation uses upper case.\n      if (isUpperCase(lastPiece)) {\n        pieces[pieces.length - 1] = lastPiece.toLowerCase();\n      }\n      return '<' + pieces.join('-') + '>';\n    }\n\n    function getOnPasteFn(cm) {\n      var vim = cm.state.vim;\n      if (!vim.onPasteFn) {\n        vim.onPasteFn = function() {\n          if (!vim.insertMode) {\n            cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));\n            actions.enterInsertMode(cm, {}, vim);\n          }\n        };\n      }\n      return vim.onPasteFn;\n    }\n\n    var numberRegex = /[\\d]/;\n    var wordCharTest = [CodeMirror.isWordChar, function(ch) {\n      return ch && !CodeMirror.isWordChar(ch) && !/\\s/.test(ch);\n    }], bigWordCharTest = [function(ch) {\n      return /\\S/.test(ch);\n    }];\n    function makeKeyRange(start, size) {\n      var keys = [];\n      for (var i = start; i < start + size; i++) {\n        keys.push(String.fromCharCode(i));\n      }\n      return keys;\n    }\n    var upperCaseAlphabet = makeKeyRange(65, 26);\n    var lowerCaseAlphabet = makeKeyRange(97, 26);\n    var numbers = makeKeyRange(48, 10);\n    var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']);\n    var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '\"', '.', ':', '_', '/']);\n    var upperCaseChars;\n    try { upperCaseChars = new RegExp(\"^[\\\\p{Lu}]$\", \"u\"); }\n    catch (_) { upperCaseChars = /^[A-Z]$/; }\n\n    function isLine(cm, line) {\n      return line >= cm.firstLine() && line <= cm.lastLine();\n    }\n    function isLowerCase(k) {\n      return (/^[a-z]$/).test(k);\n    }\n    function isMatchableSymbol(k) {\n      return '()[]{}'.indexOf(k) != -1;\n    }\n    function isNumber(k) {\n      return numberRegex.test(k);\n    }\n    function isUpperCase(k) {\n      return upperCaseChars.test(k);\n    }\n    function isWhiteSpaceString(k) {\n      return (/^\\s*$/).test(k);\n    }\n    function isEndOfSentenceSymbol(k) {\n      return '.?!'.indexOf(k) != -1;\n    }\n    function inArray(val, arr) {\n      for (var i = 0; i < arr.length; i++) {\n        if (arr[i] == val) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    var options = {};\n    function defineOption(name, defaultValue, type, aliases, callback) {\n      if (defaultValue === undefined && !callback) {\n        throw Error('defaultValue is required unless callback is provided');\n      }\n      if (!type) { type = 'string'; }\n      options[name] = {\n        type: type,\n        defaultValue: defaultValue,\n        callback: callback\n      };\n      if (aliases) {\n        for (var i = 0; i < aliases.length; i++) {\n          options[aliases[i]] = options[name];\n        }\n      }\n      if (defaultValue) {\n        setOption(name, defaultValue);\n      }\n    }\n\n    function setOption(name, value, cm, cfg) {\n      var option = options[name];\n      cfg = cfg || {};\n      var scope = cfg.scope;\n      if (!option) {\n        return new Error('Unknown option: ' + name);\n      }\n      if (option.type == 'boolean') {\n        if (value && value !== true) {\n          return new Error('Invalid argument: ' + name + '=' + value);\n        } else if (value !== false) {\n          // Boolean options are set to true if value is not defined.\n          value = true;\n        }\n      }\n      if (option.callback) {\n        if (scope !== 'local') {\n          option.callback(value, undefined);\n        }\n        if (scope !== 'global' && cm) {\n          option.callback(value, cm);\n        }\n      } else {\n        if (scope !== 'local') {\n          option.value = option.type == 'boolean' ? !!value : value;\n        }\n        if (scope !== 'global' && cm) {\n          cm.state.vim.options[name] = {value: value};\n        }\n      }\n    }\n\n    function getOption(name, cm, cfg) {\n      var option = options[name];\n      cfg = cfg || {};\n      var scope = cfg.scope;\n      if (!option) {\n        return new Error('Unknown option: ' + name);\n      }\n      if (option.callback) {\n        var local = cm && option.callback(undefined, cm);\n        if (scope !== 'global' && local !== undefined) {\n          return local;\n        }\n        if (scope !== 'local') {\n          return option.callback();\n        }\n        return;\n      } else {\n        var local = (scope !== 'global') && (cm && cm.state.vim.options[name]);\n        return (local || (scope !== 'local') && option || {}).value;\n      }\n    }\n\n    defineOption('filetype', undefined, 'string', ['ft'], function(name, cm) {\n      // Option is local. Do nothing for global.\n      if (cm === undefined) {\n        return;\n      }\n      // The 'filetype' option proxies to the CodeMirror 'mode' option.\n      if (name === undefined) {\n        var mode = cm.getOption('mode');\n        return mode == 'null' ? '' : mode;\n      } else {\n        var mode = name == '' ? 'null' : name;\n        cm.setOption('mode', mode);\n      }\n    });\n\n    var createCircularJumpList = function() {\n      var size = 100;\n      var pointer = -1;\n      var head = 0;\n      var tail = 0;\n      var buffer = new Array(size);\n      function add(cm, oldCur, newCur) {\n        var current = pointer % size;\n        var curMark = buffer[current];\n        function useNextSlot(cursor) {\n          var next = ++pointer % size;\n          var trashMark = buffer[next];\n          if (trashMark) {\n            trashMark.clear();\n          }\n          buffer[next] = cm.setBookmark(cursor);\n        }\n        if (curMark) {\n          var markPos = curMark.find();\n          // avoid recording redundant cursor position\n          if (markPos && !cursorEqual(markPos, oldCur)) {\n            useNextSlot(oldCur);\n          }\n        } else {\n          useNextSlot(oldCur);\n        }\n        useNextSlot(newCur);\n        head = pointer;\n        tail = pointer - size + 1;\n        if (tail < 0) {\n          tail = 0;\n        }\n      }\n      function move(cm, offset) {\n        pointer += offset;\n        if (pointer > head) {\n          pointer = head;\n        } else if (pointer < tail) {\n          pointer = tail;\n        }\n        var mark = buffer[(size + pointer) % size];\n        // skip marks that are temporarily removed from text buffer\n        if (mark && !mark.find()) {\n          var inc = offset > 0 ? 1 : -1;\n          var newCur;\n          var oldCur = cm.getCursor();\n          do {\n            pointer += inc;\n            mark = buffer[(size + pointer) % size];\n            // skip marks that are the same as current position\n            if (mark &&\n                (newCur = mark.find()) &&\n                !cursorEqual(oldCur, newCur)) {\n              break;\n            }\n          } while (pointer < head && pointer > tail);\n        }\n        return mark;\n      }\n      function find(cm, offset) {\n        var oldPointer = pointer;\n        var mark = move(cm, offset);\n        pointer = oldPointer;\n        return mark && mark.find();\n      }\n      return {\n        cachedCursor: undefined, //used for # and * jumps\n        add: add,\n        find: find,\n        move: move\n      };\n    };\n\n    // Returns an object to track the changes associated insert mode.  It\n    // clones the object that is passed in, or creates an empty object one if\n    // none is provided.\n    var createInsertModeChanges = function(c) {\n      if (c) {\n        // Copy construction\n        return {\n          changes: c.changes,\n          expectCursorActivityForChange: c.expectCursorActivityForChange\n        };\n      }\n      return {\n        // Change list\n        changes: [],\n        // Set to true on change, false on cursorActivity.\n        expectCursorActivityForChange: false\n      };\n    };\n\n    function MacroModeState() {\n      this.latestRegister = undefined;\n      this.isPlaying = false;\n      this.isRecording = false;\n      this.replaySearchQueries = [];\n      this.onRecordingDone = undefined;\n      this.lastInsertModeChanges = createInsertModeChanges();\n    }\n    MacroModeState.prototype = {\n      exitMacroRecordMode: function() {\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.onRecordingDone) {\n          macroModeState.onRecordingDone(); // close dialog\n        }\n        macroModeState.onRecordingDone = undefined;\n        macroModeState.isRecording = false;\n      },\n      enterMacroRecordMode: function(cm, registerName) {\n        var register =\n            vimGlobalState.registerController.getRegister(registerName);\n        if (register) {\n          register.clear();\n          this.latestRegister = registerName;\n          if (cm.openDialog) {\n            this.onRecordingDone = cm.openDialog(\n                document.createTextNode('(recording)['+registerName+']'), null, {bottom:true});\n          }\n          this.isRecording = true;\n        }\n      }\n    };\n\n    function maybeInitVimState(cm) {\n      if (!cm.state.vim) {\n        // Store instance state in the CodeMirror object.\n        cm.state.vim = {\n          inputState: new InputState(),\n          // Vim's input state that triggered the last edit, used to repeat\n          // motions and operators with '.'.\n          lastEditInputState: undefined,\n          // Vim's action command before the last edit, used to repeat actions\n          // with '.' and insert mode repeat.\n          lastEditActionCommand: undefined,\n          // When using jk for navigation, if you move from a longer line to a\n          // shorter line, the cursor may clip to the end of the shorter line.\n          // If j is pressed again and cursor goes to the next line, the\n          // cursor should go back to its horizontal position on the longer\n          // line if it can. This is to keep track of the horizontal position.\n          lastHPos: -1,\n          // Doing the same with screen-position for gj/gk\n          lastHSPos: -1,\n          // The last motion command run. Cleared if a non-motion command gets\n          // executed in between.\n          lastMotion: null,\n          marks: {},\n          insertMode: false,\n          // Repeat count for changes made in insert mode, triggered by key\n          // sequences like 3,i. Only exists when insertMode is true.\n          insertModeRepeat: undefined,\n          visualMode: false,\n          // If we are in visual line mode. No effect if visualMode is false.\n          visualLine: false,\n          visualBlock: false,\n          lastSelection: null,\n          lastPastedText: null,\n          sel: {},\n          // Buffer-local/window-local values of vim options.\n          options: {}\n        };\n      }\n      return cm.state.vim;\n    }\n    var vimGlobalState;\n    function resetVimGlobalState() {\n      vimGlobalState = {\n        // The current search query.\n        searchQuery: null,\n        // Whether we are searching backwards.\n        searchIsReversed: false,\n        // Replace part of the last substituted pattern\n        lastSubstituteReplacePart: undefined,\n        jumpList: createCircularJumpList(),\n        macroModeState: new MacroModeState,\n        // Recording latest f, t, F or T motion command.\n        lastCharacterSearch: {increment:0, forward:true, selectedCharacter:''},\n        registerController: new RegisterController({}),\n        // search history buffer\n        searchHistoryController: new HistoryController(),\n        // ex Command history buffer\n        exCommandHistoryController : new HistoryController()\n      };\n      for (var optionName in options) {\n        var option = options[optionName];\n        option.value = option.defaultValue;\n      }\n    }\n\n    var lastInsertModeKeyTimer;\n    var vimApi= {\n      buildKeyMap: function() {\n        // TODO: Convert keymap into dictionary format for fast lookup.\n      },\n      // Testing hook, though it might be useful to expose the register\n      // controller anyway.\n      getRegisterController: function() {\n        return vimGlobalState.registerController;\n      },\n      // Testing hook.\n      resetVimGlobalState_: resetVimGlobalState,\n\n      // Testing hook.\n      getVimGlobalState_: function() {\n        return vimGlobalState;\n      },\n\n      // Testing hook.\n      maybeInitVimState_: maybeInitVimState,\n\n      suppressErrorLogging: false,\n\n      InsertModeKey: InsertModeKey,\n      map: function(lhs, rhs, ctx) {\n        // Add user defined key bindings.\n        exCommandDispatcher.map(lhs, rhs, ctx);\n      },\n      unmap: function(lhs, ctx) {\n        return exCommandDispatcher.unmap(lhs, ctx);\n      },\n      // Non-recursive map function.\n      // NOTE: This will not create mappings to key maps that aren't present\n      // in the default key map. See TODO at bottom of function.\n      noremap: function(lhs, rhs, ctx) {\n        function toCtxArray(ctx) {\n          return ctx ? [ctx] : ['normal', 'insert', 'visual'];\n        }\n        var ctxsToMap = toCtxArray(ctx);\n        // Look through all actual defaults to find a map candidate.\n        var actualLength = defaultKeymap.length, origLength = defaultKeymapLength;\n        for (var i = actualLength - origLength;\n             i < actualLength && ctxsToMap.length;\n             i++) {\n          var mapping = defaultKeymap[i];\n          // Omit mappings that operate in the wrong context(s) and those of invalid type.\n          if (mapping.keys == rhs &&\n              (!ctx || !mapping.context || mapping.context === ctx) &&\n              mapping.type.substr(0, 2) !== 'ex' &&\n              mapping.type.substr(0, 3) !== 'key') {\n            // Make a shallow copy of the original keymap entry.\n            var newMapping = {};\n            for (var key in mapping) {\n              newMapping[key] = mapping[key];\n            }\n            // Modify it point to the new mapping with the proper context.\n            newMapping.keys = lhs;\n            if (ctx && !newMapping.context) {\n              newMapping.context = ctx;\n            }\n            // Add it to the keymap with a higher priority than the original.\n            this._mapCommand(newMapping);\n            // Record the mapped contexts as complete.\n            var mappedCtxs = toCtxArray(mapping.context);\n            ctxsToMap = ctxsToMap.filter(function(el) { return mappedCtxs.indexOf(el) === -1; });\n          }\n        }\n        // TODO: Create non-recursive keyToKey mappings for the unmapped contexts once those exist.\n      },\n      // Remove all user-defined mappings for the provided context.\n      mapclear: function(ctx) {\n        // Partition the existing keymap into user-defined and true defaults.\n        var actualLength = defaultKeymap.length,\n            origLength = defaultKeymapLength;\n        var userKeymap = defaultKeymap.slice(0, actualLength - origLength);\n        defaultKeymap = defaultKeymap.slice(actualLength - origLength);\n        if (ctx) {\n          // If a specific context is being cleared, we need to keep mappings\n          // from all other contexts.\n          for (var i = userKeymap.length - 1; i >= 0; i--) {\n            var mapping = userKeymap[i];\n            if (ctx !== mapping.context) {\n              if (mapping.context) {\n                this._mapCommand(mapping);\n              } else {\n                // `mapping` applies to all contexts so create keymap copies\n                // for each context except the one being cleared.\n                var contexts = ['normal', 'insert', 'visual'];\n                for (var j in contexts) {\n                  if (contexts[j] !== ctx) {\n                    var newMapping = {};\n                    for (var key in mapping) {\n                      newMapping[key] = mapping[key];\n                    }\n                    newMapping.context = contexts[j];\n                    this._mapCommand(newMapping);\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      // TODO: Expose setOption and getOption as instance methods. Need to decide how to namespace\n      // them, or somehow make them work with the existing CodeMirror setOption/getOption API.\n      setOption: setOption,\n      getOption: getOption,\n      defineOption: defineOption,\n      defineEx: function(name, prefix, func){\n        if (!prefix) {\n          prefix = name;\n        } else if (name.indexOf(prefix) !== 0) {\n          throw new Error('(Vim.defineEx) \"'+prefix+'\" is not a prefix of \"'+name+'\", command not registered');\n        }\n        exCommands[name]=func;\n        exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'};\n      },\n      handleKey: function (cm, key, origin) {\n        var command = this.findKey(cm, key, origin);\n        if (typeof command === 'function') {\n          return command();\n        }\n      },\n      /**\n       * This is the outermost function called by CodeMirror, after keys have\n       * been mapped to their Vim equivalents.\n       *\n       * Finds a command based on the key (and cached keys if there is a\n       * multi-key sequence). Returns `undefined` if no key is matched, a noop\n       * function if a partial match is found (multi-key), and a function to\n       * execute the bound command if a a key is matched. The function always\n       * returns true.\n       */\n      findKey: function(cm, key, origin) {\n        var vim = maybeInitVimState(cm);\n        function handleMacroRecording() {\n          var macroModeState = vimGlobalState.macroModeState;\n          if (macroModeState.isRecording) {\n            if (key == 'q') {\n              macroModeState.exitMacroRecordMode();\n              clearInputState(cm);\n              return true;\n            }\n            if (origin != 'mapping') {\n              logKey(macroModeState, key);\n            }\n          }\n        }\n        function handleEsc() {\n          if (key == '<Esc>') {\n            if (vim.visualMode) {\n              // Get back to normal mode.\n              exitVisualMode(cm);\n            } else if (vim.insertMode) {\n              // Get back to normal mode.\n              exitInsertMode(cm);\n            } else {\n              // We're already in normal mode. Let '<Esc>' be handled normally.\n              return;\n            }\n            clearInputState(cm);\n            return true;\n          }\n        }\n        function doKeyToKey(keys) {\n          // TODO: prevent infinite recursion.\n          var match;\n          while (keys) {\n            // Pull off one command key, which is either a single character\n            // or a special sequence wrapped in '<' and '>', e.g. '<Space>'.\n            match = (/<\\w+-.+?>|<\\w+>|./).exec(keys);\n            key = match[0];\n            keys = keys.substring(match.index + key.length);\n            vimApi.handleKey(cm, key, 'mapping');\n          }\n        }\n\n        function handleKeyInsertMode() {\n          if (handleEsc()) { return true; }\n          var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key;\n          var keysAreChars = key.length == 1;\n          var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert');\n          // Need to check all key substrings in insert mode.\n          while (keys.length > 1 && match.type != 'full') {\n            var keys = vim.inputState.keyBuffer = keys.slice(1);\n            var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert');\n            if (thisMatch.type != 'none') { match = thisMatch; }\n          }\n          if (match.type == 'none') { clearInputState(cm); return false; }\n          else if (match.type == 'partial') {\n            if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); }\n            lastInsertModeKeyTimer = window.setTimeout(\n              function() { if (vim.insertMode && vim.inputState.keyBuffer) { clearInputState(cm); } },\n              getOption('insertModeEscKeysTimeout'));\n            return !keysAreChars;\n          }\n\n          if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); }\n          if (keysAreChars) {\n            var selections = cm.listSelections();\n            for (var i = 0; i < selections.length; i++) {\n              var here = selections[i].head;\n              cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input');\n            }\n            vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop();\n          }\n          clearInputState(cm);\n          return match.command;\n        }\n\n        function handleKeyNonInsertMode() {\n          if (handleMacroRecording() || handleEsc()) { return true; }\n\n          var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key;\n          if (/^[1-9]\\d*$/.test(keys)) { return true; }\n\n          var keysMatcher = /^(\\d*)(.*)$/.exec(keys);\n          if (!keysMatcher) { clearInputState(cm); return false; }\n          var context = vim.visualMode ? 'visual' :\n                                         'normal';\n          var mainKey = keysMatcher[2] || keysMatcher[1];\n          if (vim.inputState.operatorShortcut && vim.inputState.operatorShortcut.slice(-1) == mainKey) {\n            // multikey operators act linewise by repeating only the last character\n            mainKey = vim.inputState.operatorShortcut;\n          }\n          var match = commandDispatcher.matchCommand(mainKey, defaultKeymap, vim.inputState, context);\n          if (match.type == 'none') { clearInputState(cm); return false; }\n          else if (match.type == 'partial') { return true; }\n\n          vim.inputState.keyBuffer = '';\n          var keysMatcher = /^(\\d*)(.*)$/.exec(keys);\n          if (keysMatcher[1] && keysMatcher[1] != '0') {\n            vim.inputState.pushRepeatDigit(keysMatcher[1]);\n          }\n          return match.command;\n        }\n\n        var command;\n        if (vim.insertMode) { command = handleKeyInsertMode(); }\n        else { command = handleKeyNonInsertMode(); }\n        if (command === false) {\n          return !vim.insertMode && key.length === 1 ? function() { return true; } : undefined;\n        } else if (command === true) {\n          // TODO: Look into using CodeMirror's multi-key handling.\n          // Return no-op since we are caching the key. Counts as handled, but\n          // don't want act on it just yet.\n          return function() { return true; };\n        } else {\n          return function() {\n            return cm.operation(function() {\n              cm.curOp.isVimOp = true;\n              try {\n                if (command.type == 'keyToKey') {\n                  doKeyToKey(command.toKeys);\n                } else {\n                  commandDispatcher.processCommand(cm, vim, command);\n                }\n              } catch (e) {\n                // clear VIM state in case it's in a bad state.\n                cm.state.vim = undefined;\n                maybeInitVimState(cm);\n                if (!vimApi.suppressErrorLogging) {\n                  console['log'](e);\n                }\n                throw e;\n              }\n              return true;\n            });\n          };\n        }\n      },\n      handleEx: function(cm, input) {\n        exCommandDispatcher.processCommand(cm, input);\n      },\n\n      defineMotion: defineMotion,\n      defineAction: defineAction,\n      defineOperator: defineOperator,\n      mapCommand: mapCommand,\n      _mapCommand: _mapCommand,\n\n      defineRegister: defineRegister,\n\n      exitVisualMode: exitVisualMode,\n      exitInsertMode: exitInsertMode\n    };\n\n    // Represents the current input state.\n    function InputState() {\n      this.prefixRepeat = [];\n      this.motionRepeat = [];\n\n      this.operator = null;\n      this.operatorArgs = null;\n      this.motion = null;\n      this.motionArgs = null;\n      this.keyBuffer = []; // For matching multi-key commands.\n      this.registerName = null; // Defaults to the unnamed register.\n    }\n    InputState.prototype.pushRepeatDigit = function(n) {\n      if (!this.operator) {\n        this.prefixRepeat = this.prefixRepeat.concat(n);\n      } else {\n        this.motionRepeat = this.motionRepeat.concat(n);\n      }\n    };\n    InputState.prototype.getRepeat = function() {\n      var repeat = 0;\n      if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) {\n        repeat = 1;\n        if (this.prefixRepeat.length > 0) {\n          repeat *= parseInt(this.prefixRepeat.join(''), 10);\n        }\n        if (this.motionRepeat.length > 0) {\n          repeat *= parseInt(this.motionRepeat.join(''), 10);\n        }\n      }\n      return repeat;\n    };\n\n    function clearInputState(cm, reason) {\n      cm.state.vim.inputState = new InputState();\n      CodeMirror.signal(cm, 'vim-command-done', reason);\n    }\n\n    /*\n     * Register stores information about copy and paste registers.  Besides\n     * text, a register must store whether it is linewise (i.e., when it is\n     * pasted, should it insert itself into a new line, or should the text be\n     * inserted at the cursor position.)\n     */\n    function Register(text, linewise, blockwise) {\n      this.clear();\n      this.keyBuffer = [text || ''];\n      this.insertModeChanges = [];\n      this.searchQueries = [];\n      this.linewise = !!linewise;\n      this.blockwise = !!blockwise;\n    }\n    Register.prototype = {\n      setText: function(text, linewise, blockwise) {\n        this.keyBuffer = [text || ''];\n        this.linewise = !!linewise;\n        this.blockwise = !!blockwise;\n      },\n      pushText: function(text, linewise) {\n        // if this register has ever been set to linewise, use linewise.\n        if (linewise) {\n          if (!this.linewise) {\n            this.keyBuffer.push('\\n');\n          }\n          this.linewise = true;\n        }\n        this.keyBuffer.push(text);\n      },\n      pushInsertModeChanges: function(changes) {\n        this.insertModeChanges.push(createInsertModeChanges(changes));\n      },\n      pushSearchQuery: function(query) {\n        this.searchQueries.push(query);\n      },\n      clear: function() {\n        this.keyBuffer = [];\n        this.insertModeChanges = [];\n        this.searchQueries = [];\n        this.linewise = false;\n      },\n      toString: function() {\n        return this.keyBuffer.join('');\n      }\n    };\n\n    /**\n     * Defines an external register.\n     *\n     * The name should be a single character that will be used to reference the register.\n     * The register should support setText, pushText, clear, and toString(). See Register\n     * for a reference implementation.\n     */\n    function defineRegister(name, register) {\n      var registers = vimGlobalState.registerController.registers;\n      if (!name || name.length != 1) {\n        throw Error('Register name must be 1 character');\n      }\n      if (registers[name]) {\n        throw Error('Register already defined ' + name);\n      }\n      registers[name] = register;\n      validRegisters.push(name);\n    }\n\n    /*\n     * vim registers allow you to keep many independent copy and paste buffers.\n     * See http://usevim.com/2012/04/13/registers/ for an introduction.\n     *\n     * RegisterController keeps the state of all the registers.  An initial\n     * state may be passed in.  The unnamed register '\"' will always be\n     * overridden.\n     */\n    function RegisterController(registers) {\n      this.registers = registers;\n      this.unnamedRegister = registers['\"'] = new Register();\n      registers['.'] = new Register();\n      registers[':'] = new Register();\n      registers['/'] = new Register();\n    }\n    RegisterController.prototype = {\n      pushText: function(registerName, operator, text, linewise, blockwise) {\n        // The black hole register, \"_, means delete/yank to nowhere.\n        if (registerName === '_') return;\n        if (linewise && text.charAt(text.length - 1) !== '\\n'){\n          text += '\\n';\n        }\n        // Lowercase and uppercase registers refer to the same register.\n        // Uppercase just means append.\n        var register = this.isValidRegister(registerName) ?\n            this.getRegister(registerName) : null;\n        // if no register/an invalid register was specified, things go to the\n        // default registers\n        if (!register) {\n          switch (operator) {\n            case 'yank':\n              // The 0 register contains the text from the most recent yank.\n              this.registers['0'] = new Register(text, linewise, blockwise);\n              break;\n            case 'delete':\n            case 'change':\n              if (text.indexOf('\\n') == -1) {\n                // Delete less than 1 line. Update the small delete register.\n                this.registers['-'] = new Register(text, linewise);\n              } else {\n                // Shift down the contents of the numbered registers and put the\n                // deleted text into register 1.\n                this.shiftNumericRegisters_();\n                this.registers['1'] = new Register(text, linewise);\n              }\n              break;\n          }\n          // Make sure the unnamed register is set to what just happened\n          this.unnamedRegister.setText(text, linewise, blockwise);\n          return;\n        }\n\n        // If we've gotten to this point, we've actually specified a register\n        var append = isUpperCase(registerName);\n        if (append) {\n          register.pushText(text, linewise);\n        } else {\n          register.setText(text, linewise, blockwise);\n        }\n        // The unnamed register always has the same value as the last used\n        // register.\n        this.unnamedRegister.setText(register.toString(), linewise);\n      },\n      // Gets the register named @name.  If one of @name doesn't already exist,\n      // create it.  If @name is invalid, return the unnamedRegister.\n      getRegister: function(name) {\n        if (!this.isValidRegister(name)) {\n          return this.unnamedRegister;\n        }\n        name = name.toLowerCase();\n        if (!this.registers[name]) {\n          this.registers[name] = new Register();\n        }\n        return this.registers[name];\n      },\n      isValidRegister: function(name) {\n        return name && inArray(name, validRegisters);\n      },\n      shiftNumericRegisters_: function() {\n        for (var i = 9; i >= 2; i--) {\n          this.registers[i] = this.getRegister('' + (i - 1));\n        }\n      }\n    };\n    function HistoryController() {\n        this.historyBuffer = [];\n        this.iterator = 0;\n        this.initialPrefix = null;\n    }\n    HistoryController.prototype = {\n      // the input argument here acts a user entered prefix for a small time\n      // until we start autocompletion in which case it is the autocompleted.\n      nextMatch: function (input, up) {\n        var historyBuffer = this.historyBuffer;\n        var dir = up ? -1 : 1;\n        if (this.initialPrefix === null) this.initialPrefix = input;\n        for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i+= dir) {\n          var element = historyBuffer[i];\n          for (var j = 0; j <= element.length; j++) {\n            if (this.initialPrefix == element.substring(0, j)) {\n              this.iterator = i;\n              return element;\n            }\n          }\n        }\n        // should return the user input in case we reach the end of buffer.\n        if (i >= historyBuffer.length) {\n          this.iterator = historyBuffer.length;\n          return this.initialPrefix;\n        }\n        // return the last autocompleted query or exCommand as it is.\n        if (i < 0 ) return input;\n      },\n      pushInput: function(input) {\n        var index = this.historyBuffer.indexOf(input);\n        if (index > -1) this.historyBuffer.splice(index, 1);\n        if (input.length) this.historyBuffer.push(input);\n      },\n      reset: function() {\n        this.initialPrefix = null;\n        this.iterator = this.historyBuffer.length;\n      }\n    };\n    var commandDispatcher = {\n      matchCommand: function(keys, keyMap, inputState, context) {\n        var matches = commandMatches(keys, keyMap, context, inputState);\n        if (!matches.full && !matches.partial) {\n          return {type: 'none'};\n        } else if (!matches.full && matches.partial) {\n          return {type: 'partial'};\n        }\n\n        var bestMatch;\n        for (var i = 0; i < matches.full.length; i++) {\n          var match = matches.full[i];\n          if (!bestMatch) {\n            bestMatch = match;\n          }\n        }\n        if (bestMatch.keys.slice(-11) == '<character>') {\n          var character = lastChar(keys);\n          if (!character) return {type: 'none'};\n          inputState.selectedCharacter = character;\n        }\n        return {type: 'full', command: bestMatch};\n      },\n      processCommand: function(cm, vim, command) {\n        vim.inputState.repeatOverride = command.repeatOverride;\n        switch (command.type) {\n          case 'motion':\n            this.processMotion(cm, vim, command);\n            break;\n          case 'operator':\n            this.processOperator(cm, vim, command);\n            break;\n          case 'operatorMotion':\n            this.processOperatorMotion(cm, vim, command);\n            break;\n          case 'action':\n            this.processAction(cm, vim, command);\n            break;\n          case 'search':\n            this.processSearch(cm, vim, command);\n            break;\n          case 'ex':\n          case 'keyToEx':\n            this.processEx(cm, vim, command);\n            break;\n          default:\n            break;\n        }\n      },\n      processMotion: function(cm, vim, command) {\n        vim.inputState.motion = command.motion;\n        vim.inputState.motionArgs = copyArgs(command.motionArgs);\n        this.evalInput(cm, vim);\n      },\n      processOperator: function(cm, vim, command) {\n        var inputState = vim.inputState;\n        if (inputState.operator) {\n          if (inputState.operator == command.operator) {\n            // Typing an operator twice like 'dd' makes the operator operate\n            // linewise\n            inputState.motion = 'expandToLine';\n            inputState.motionArgs = { linewise: true };\n            this.evalInput(cm, vim);\n            return;\n          } else {\n            // 2 different operators in a row doesn't make sense.\n            clearInputState(cm);\n          }\n        }\n        inputState.operator = command.operator;\n        inputState.operatorArgs = copyArgs(command.operatorArgs);\n        if (command.keys.length > 1) {\n          inputState.operatorShortcut = command.keys;\n        }\n        if (command.exitVisualBlock) {\n            vim.visualBlock = false;\n            updateCmSelection(cm);\n        }\n        if (vim.visualMode) {\n          // Operating on a selection in visual mode. We don't need a motion.\n          this.evalInput(cm, vim);\n        }\n      },\n      processOperatorMotion: function(cm, vim, command) {\n        var visualMode = vim.visualMode;\n        var operatorMotionArgs = copyArgs(command.operatorMotionArgs);\n        if (operatorMotionArgs) {\n          // Operator motions may have special behavior in visual mode.\n          if (visualMode && operatorMotionArgs.visualLine) {\n            vim.visualLine = true;\n          }\n        }\n        this.processOperator(cm, vim, command);\n        if (!visualMode) {\n          this.processMotion(cm, vim, command);\n        }\n      },\n      processAction: function(cm, vim, command) {\n        var inputState = vim.inputState;\n        var repeat = inputState.getRepeat();\n        var repeatIsExplicit = !!repeat;\n        var actionArgs = copyArgs(command.actionArgs) || {};\n        if (inputState.selectedCharacter) {\n          actionArgs.selectedCharacter = inputState.selectedCharacter;\n        }\n        // Actions may or may not have motions and operators. Do these first.\n        if (command.operator) {\n          this.processOperator(cm, vim, command);\n        }\n        if (command.motion) {\n          this.processMotion(cm, vim, command);\n        }\n        if (command.motion || command.operator) {\n          this.evalInput(cm, vim);\n        }\n        actionArgs.repeat = repeat || 1;\n        actionArgs.repeatIsExplicit = repeatIsExplicit;\n        actionArgs.registerName = inputState.registerName;\n        clearInputState(cm);\n        vim.lastMotion = null;\n        if (command.isEdit) {\n          this.recordLastEdit(vim, inputState, command);\n        }\n        actions[command.action](cm, actionArgs, vim);\n      },\n      processSearch: function(cm, vim, command) {\n        if (!cm.getSearchCursor) {\n          // Search depends on SearchCursor.\n          return;\n        }\n        var forward = command.searchArgs.forward;\n        var wholeWordOnly = command.searchArgs.wholeWordOnly;\n        getSearchState(cm).setReversed(!forward);\n        var promptPrefix = (forward) ? '/' : '?';\n        var originalQuery = getSearchState(cm).getQuery();\n        var originalScrollPos = cm.getScrollInfo();\n        function handleQuery(query, ignoreCase, smartCase) {\n          vimGlobalState.searchHistoryController.pushInput(query);\n          vimGlobalState.searchHistoryController.reset();\n          try {\n            updateSearchQuery(cm, query, ignoreCase, smartCase);\n          } catch (e) {\n            showConfirm(cm, 'Invalid regex: ' + query);\n            clearInputState(cm);\n            return;\n          }\n          commandDispatcher.processMotion(cm, vim, {\n            type: 'motion',\n            motion: 'findNext',\n            motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist }\n          });\n        }\n        function onPromptClose(query) {\n          cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n          handleQuery(query, true /** ignoreCase */, true /** smartCase */);\n          var macroModeState = vimGlobalState.macroModeState;\n          if (macroModeState.isRecording) {\n            logSearchQuery(macroModeState, query);\n          }\n        }\n        function onPromptKeyUp(e, query, close) {\n          var keyName = CodeMirror.keyName(e), up, offset;\n          if (keyName == 'Up' || keyName == 'Down') {\n            up = keyName == 'Up' ? true : false;\n            offset = e.target ? e.target.selectionEnd : 0;\n            query = vimGlobalState.searchHistoryController.nextMatch(query, up) || '';\n            close(query);\n            if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);\n          } else {\n            if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift')\n              vimGlobalState.searchHistoryController.reset();\n          }\n          var parsedQuery;\n          try {\n            parsedQuery = updateSearchQuery(cm, query,\n                true /** ignoreCase */, true /** smartCase */);\n          } catch (e) {\n            // Swallow bad regexes for incremental search.\n          }\n          if (parsedQuery) {\n            cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30);\n          } else {\n            clearSearchHighlight(cm);\n            cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n          }\n        }\n        function onPromptKeyDown(e, query, close) {\n          var keyName = CodeMirror.keyName(e);\n          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' ||\n              (keyName == 'Backspace' && query == '')) {\n            vimGlobalState.searchHistoryController.pushInput(query);\n            vimGlobalState.searchHistoryController.reset();\n            updateSearchQuery(cm, originalQuery);\n            clearSearchHighlight(cm);\n            cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n            CodeMirror.e_stop(e);\n            clearInputState(cm);\n            close();\n            cm.focus();\n          } else if (keyName == 'Up' || keyName == 'Down') {\n            CodeMirror.e_stop(e);\n          } else if (keyName == 'Ctrl-U') {\n            // Ctrl-U clears input.\n            CodeMirror.e_stop(e);\n            close('');\n          }\n        }\n        switch (command.searchArgs.querySrc) {\n          case 'prompt':\n            var macroModeState = vimGlobalState.macroModeState;\n            if (macroModeState.isPlaying) {\n              var query = macroModeState.replaySearchQueries.shift();\n              handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n            } else {\n              showPrompt(cm, {\n                  onClose: onPromptClose,\n                  prefix: promptPrefix,\n                  desc: '(JavaScript regexp)',\n                  onKeyUp: onPromptKeyUp,\n                  onKeyDown: onPromptKeyDown\n              });\n            }\n            break;\n          case 'wordUnderCursor':\n            var word = expandWordUnderCursor(cm, false /** inclusive */,\n                true /** forward */, false /** bigWord */,\n                true /** noSymbol */);\n            var isKeyword = true;\n            if (!word) {\n              word = expandWordUnderCursor(cm, false /** inclusive */,\n                  true /** forward */, false /** bigWord */,\n                  false /** noSymbol */);\n              isKeyword = false;\n            }\n            if (!word) {\n              return;\n            }\n            var query = cm.getLine(word.start.line).substring(word.start.ch,\n                word.end.ch);\n            if (isKeyword && wholeWordOnly) {\n                query = '\\\\b' + query + '\\\\b';\n            } else {\n              query = escapeRegex(query);\n            }\n\n            // cachedCursor is used to save the old position of the cursor\n            // when * or # causes vim to seek for the nearest word and shift\n            // the cursor before entering the motion.\n            vimGlobalState.jumpList.cachedCursor = cm.getCursor();\n            cm.setCursor(word.start);\n\n            handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n            break;\n        }\n      },\n      processEx: function(cm, vim, command) {\n        function onPromptClose(input) {\n          // Give the prompt some time to close so that if processCommand shows\n          // an error, the elements don't overlap.\n          vimGlobalState.exCommandHistoryController.pushInput(input);\n          vimGlobalState.exCommandHistoryController.reset();\n          exCommandDispatcher.processCommand(cm, input);\n        }\n        function onPromptKeyDown(e, input, close) {\n          var keyName = CodeMirror.keyName(e), up, offset;\n          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' ||\n              (keyName == 'Backspace' && input == '')) {\n            vimGlobalState.exCommandHistoryController.pushInput(input);\n            vimGlobalState.exCommandHistoryController.reset();\n            CodeMirror.e_stop(e);\n            clearInputState(cm);\n            close();\n            cm.focus();\n          }\n          if (keyName == 'Up' || keyName == 'Down') {\n            CodeMirror.e_stop(e);\n            up = keyName == 'Up' ? true : false;\n            offset = e.target ? e.target.selectionEnd : 0;\n            input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || '';\n            close(input);\n            if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);\n          } else if (keyName == 'Ctrl-U') {\n            // Ctrl-U clears input.\n            CodeMirror.e_stop(e);\n            close('');\n          } else {\n            if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift')\n              vimGlobalState.exCommandHistoryController.reset();\n          }\n        }\n        if (command.type == 'keyToEx') {\n          // Handle user defined Ex to Ex mappings\n          exCommandDispatcher.processCommand(cm, command.exArgs.input);\n        } else {\n          if (vim.visualMode) {\n            showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\\'<,\\'>',\n                onKeyDown: onPromptKeyDown, selectValueOnOpen: false});\n          } else {\n            showPrompt(cm, { onClose: onPromptClose, prefix: ':',\n                onKeyDown: onPromptKeyDown});\n          }\n        }\n      },\n      evalInput: function(cm, vim) {\n        // If the motion command is set, execute both the operator and motion.\n        // Otherwise return.\n        var inputState = vim.inputState;\n        var motion = inputState.motion;\n        var motionArgs = inputState.motionArgs || {};\n        var operator = inputState.operator;\n        var operatorArgs = inputState.operatorArgs || {};\n        var registerName = inputState.registerName;\n        var sel = vim.sel;\n        // TODO: Make sure cm and vim selections are identical outside visual mode.\n        var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head): cm.getCursor('head'));\n        var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor'));\n        var oldHead = copyCursor(origHead);\n        var oldAnchor = copyCursor(origAnchor);\n        var newHead, newAnchor;\n        var repeat;\n        if (operator) {\n          this.recordLastEdit(vim, inputState);\n        }\n        if (inputState.repeatOverride !== undefined) {\n          // If repeatOverride is specified, that takes precedence over the\n          // input state's repeat. Used by Ex mode and can be user defined.\n          repeat = inputState.repeatOverride;\n        } else {\n          repeat = inputState.getRepeat();\n        }\n        if (repeat > 0 && motionArgs.explicitRepeat) {\n          motionArgs.repeatIsExplicit = true;\n        } else if (motionArgs.noRepeat ||\n            (!motionArgs.explicitRepeat && repeat === 0)) {\n          repeat = 1;\n          motionArgs.repeatIsExplicit = false;\n        }\n        if (inputState.selectedCharacter) {\n          // If there is a character input, stick it in all of the arg arrays.\n          motionArgs.selectedCharacter = operatorArgs.selectedCharacter =\n              inputState.selectedCharacter;\n        }\n        motionArgs.repeat = repeat;\n        clearInputState(cm);\n        if (motion) {\n          var motionResult = motions[motion](cm, origHead, motionArgs, vim, inputState);\n          vim.lastMotion = motions[motion];\n          if (!motionResult) {\n            return;\n          }\n          if (motionArgs.toJumplist) {\n            var jumpList = vimGlobalState.jumpList;\n            // if the current motion is # or *, use cachedCursor\n            var cachedCursor = jumpList.cachedCursor;\n            if (cachedCursor) {\n              recordJumpPosition(cm, cachedCursor, motionResult);\n              delete jumpList.cachedCursor;\n            } else {\n              recordJumpPosition(cm, origHead, motionResult);\n            }\n          }\n          if (motionResult instanceof Array) {\n            newAnchor = motionResult[0];\n            newHead = motionResult[1];\n          } else {\n            newHead = motionResult;\n          }\n          // TODO: Handle null returns from motion commands better.\n          if (!newHead) {\n            newHead = copyCursor(origHead);\n          }\n          if (vim.visualMode) {\n            if (!(vim.visualBlock && newHead.ch === Infinity)) {\n              newHead = clipCursorToContent(cm, newHead);\n            }\n            if (newAnchor) {\n              newAnchor = clipCursorToContent(cm, newAnchor);\n            }\n            newAnchor = newAnchor || oldAnchor;\n            sel.anchor = newAnchor;\n            sel.head = newHead;\n            updateCmSelection(cm);\n            updateMark(cm, vim, '<',\n                cursorIsBefore(newAnchor, newHead) ? newAnchor\n                    : newHead);\n            updateMark(cm, vim, '>',\n                cursorIsBefore(newAnchor, newHead) ? newHead\n                    : newAnchor);\n          } else if (!operator) {\n            newHead = clipCursorToContent(cm, newHead);\n            cm.setCursor(newHead.line, newHead.ch);\n          }\n        }\n        if (operator) {\n          if (operatorArgs.lastSel) {\n            // Replaying a visual mode operation\n            newAnchor = oldAnchor;\n            var lastSel = operatorArgs.lastSel;\n            var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line);\n            var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch);\n            if (lastSel.visualLine) {\n              // Linewise Visual mode: The same number of lines.\n              newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch);\n            } else if (lastSel.visualBlock) {\n              // Blockwise Visual mode: The same number of lines and columns.\n              newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset);\n            } else if (lastSel.head.line == lastSel.anchor.line) {\n              // Normal Visual mode within one line: The same number of characters.\n              newHead = new Pos(oldAnchor.line, oldAnchor.ch + chOffset);\n            } else {\n              // Normal Visual mode with several lines: The same number of lines, in the\n              // last line the same number of characters as in the last line the last time.\n              newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch);\n            }\n            vim.visualMode = true;\n            vim.visualLine = lastSel.visualLine;\n            vim.visualBlock = lastSel.visualBlock;\n            sel = vim.sel = {\n              anchor: newAnchor,\n              head: newHead\n            };\n            updateCmSelection(cm);\n          } else if (vim.visualMode) {\n            operatorArgs.lastSel = {\n              anchor: copyCursor(sel.anchor),\n              head: copyCursor(sel.head),\n              visualBlock: vim.visualBlock,\n              visualLine: vim.visualLine\n            };\n          }\n          var curStart, curEnd, linewise, mode;\n          var cmSel;\n          if (vim.visualMode) {\n            // Init visual op\n            curStart = cursorMin(sel.head, sel.anchor);\n            curEnd = cursorMax(sel.head, sel.anchor);\n            linewise = vim.visualLine || operatorArgs.linewise;\n            mode = vim.visualBlock ? 'block' :\n                   linewise ? 'line' :\n                   'char';\n            cmSel = makeCmSelection(cm, {\n              anchor: curStart,\n              head: curEnd\n            }, mode);\n            if (linewise) {\n              var ranges = cmSel.ranges;\n              if (mode == 'block') {\n                // Linewise operators in visual block mode extend to end of line\n                for (var i = 0; i < ranges.length; i++) {\n                  ranges[i].head.ch = lineLength(cm, ranges[i].head.line);\n                }\n              } else if (mode == 'line') {\n                ranges[0].head = new Pos(ranges[0].head.line + 1, 0);\n              }\n            }\n          } else {\n            // Init motion op\n            curStart = copyCursor(newAnchor || oldAnchor);\n            curEnd = copyCursor(newHead || oldHead);\n            if (cursorIsBefore(curEnd, curStart)) {\n              var tmp = curStart;\n              curStart = curEnd;\n              curEnd = tmp;\n            }\n            linewise = motionArgs.linewise || operatorArgs.linewise;\n            if (linewise) {\n              // Expand selection to entire line.\n              expandSelectionToLine(cm, curStart, curEnd);\n            } else if (motionArgs.forward) {\n              // Clip to trailing newlines only if the motion goes forward.\n              clipToLine(cm, curStart, curEnd);\n            }\n            mode = 'char';\n            var exclusive = !motionArgs.inclusive || linewise;\n            cmSel = makeCmSelection(cm, {\n              anchor: curStart,\n              head: curEnd\n            }, mode, exclusive);\n          }\n          cm.setSelections(cmSel.ranges, cmSel.primary);\n          vim.lastMotion = null;\n          operatorArgs.repeat = repeat; // For indent in visual mode.\n          operatorArgs.registerName = registerName;\n          // Keep track of linewise as it affects how paste and change behave.\n          operatorArgs.linewise = linewise;\n          var operatorMoveTo = operators[operator](\n            cm, operatorArgs, cmSel.ranges, oldAnchor, newHead);\n          if (vim.visualMode) {\n            exitVisualMode(cm, operatorMoveTo != null);\n          }\n          if (operatorMoveTo) {\n            cm.setCursor(operatorMoveTo);\n          }\n        }\n      },\n      recordLastEdit: function(vim, inputState, actionCommand) {\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.isPlaying) { return; }\n        vim.lastEditInputState = inputState;\n        vim.lastEditActionCommand = actionCommand;\n        macroModeState.lastInsertModeChanges.changes = [];\n        macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false;\n        macroModeState.lastInsertModeChanges.visualBlock = vim.visualBlock ? vim.sel.head.line - vim.sel.anchor.line : 0;\n      }\n    };\n\n    /**\n     * typedef {Object{line:number,ch:number}} Cursor An object containing the\n     *     position of the cursor.\n     */\n    // All of the functions below return Cursor objects.\n    var motions = {\n      moveToTopLine: function(cm, _head, motionArgs) {\n        var line = getUserVisibleLines(cm).top + motionArgs.repeat -1;\n        return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      moveToMiddleLine: function(cm) {\n        var range = getUserVisibleLines(cm);\n        var line = Math.floor((range.top + range.bottom) * 0.5);\n        return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      moveToBottomLine: function(cm, _head, motionArgs) {\n        var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1;\n        return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      expandToLine: function(_cm, head, motionArgs) {\n        // Expands forward to end of line, and then to next line if repeat is\n        // >1. Does not handle backward motion!\n        var cur = head;\n        return new Pos(cur.line + motionArgs.repeat - 1, Infinity);\n      },\n      findNext: function(cm, _head, motionArgs) {\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n        if (!query) {\n          return;\n        }\n        var prev = !motionArgs.forward;\n        // If search is initiated with ? instead of /, negate direction.\n        prev = (state.isReversed()) ? !prev : prev;\n        highlightSearchMatches(cm, query);\n        return findNext(cm, prev/** prev */, query, motionArgs.repeat);\n      },\n      /**\n       * Find and select the next occurrence of the search query. If the cursor is currently\n       * within a match, then find and select the current match. Otherwise, find the next occurrence in the\n       * appropriate direction.\n       *\n       * This differs from `findNext` in the following ways:\n       *\n       * 1. Instead of only returning the \"from\", this returns a \"from\", \"to\" range.\n       * 2. If the cursor is currently inside a search match, this selects the current match\n       *    instead of the next match.\n       * 3. If there is no associated operator, this will turn on visual mode.\n       */\n      findAndSelectNextInclusive: function(cm, _head, motionArgs, vim, prevInputState) {\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n\n        if (!query) {\n          return;\n        }\n\n        var prev = !motionArgs.forward;\n        prev = (state.isReversed()) ? !prev : prev;\n\n        // next: [from, to] | null\n        var next = findNextFromAndToInclusive(cm, prev, query, motionArgs.repeat, vim);\n\n        // No matches.\n        if (!next) {\n          return;\n        }\n\n        // If there's an operator that will be executed, return the selection.\n        if (prevInputState.operator) {\n          return next;\n        }\n\n        // At this point, we know that there is no accompanying operator -- let's\n        // deal with visual mode in order to select an appropriate match.\n\n        var from = next[0];\n        // For whatever reason, when we use the \"to\" as returned by searchcursor.js directly,\n        // the resulting selection is extended by 1 char. Let's shrink it so that only the\n        // match is selected.\n        var to = new Pos(next[1].line, next[1].ch - 1);\n\n        if (vim.visualMode) {\n          // If we were in visualLine or visualBlock mode, get out of it.\n          if (vim.visualLine || vim.visualBlock) {\n            vim.visualLine = false;\n            vim.visualBlock = false;\n            CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: \"\"});\n          }\n\n          // If we're currently in visual mode, we should extend the selection to include\n          // the search result.\n          var anchor = vim.sel.anchor;\n          if (anchor) {\n            if (state.isReversed()) {\n              if (motionArgs.forward) {\n                return [anchor, from];\n              }\n\n              return [anchor, to];\n            } else {\n              if (motionArgs.forward) {\n                return [anchor, to];\n              }\n\n              return [anchor, from];\n            }\n          }\n        } else {\n          // Let's turn visual mode on.\n          vim.visualMode = true;\n          vim.visualLine = false;\n          vim.visualBlock = false;\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: \"\"});\n        }\n\n        return prev ? [to, from] : [from, to];\n      },\n      goToMark: function(cm, _head, motionArgs, vim) {\n        var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter);\n        if (pos) {\n          return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos;\n        }\n        return null;\n      },\n      moveToOtherHighlightedEnd: function(cm, _head, motionArgs, vim) {\n        if (vim.visualBlock && motionArgs.sameLine) {\n          var sel = vim.sel;\n          return [\n            clipCursorToContent(cm, new Pos(sel.anchor.line, sel.head.ch)),\n            clipCursorToContent(cm, new Pos(sel.head.line, sel.anchor.ch))\n          ];\n        } else {\n          return ([vim.sel.head, vim.sel.anchor]);\n        }\n      },\n      jumpToMark: function(cm, head, motionArgs, vim) {\n        var best = head;\n        for (var i = 0; i < motionArgs.repeat; i++) {\n          var cursor = best;\n          for (var key in vim.marks) {\n            if (!isLowerCase(key)) {\n              continue;\n            }\n            var mark = vim.marks[key].find();\n            var isWrongDirection = (motionArgs.forward) ?\n              cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark);\n\n            if (isWrongDirection) {\n              continue;\n            }\n            if (motionArgs.linewise && (mark.line == cursor.line)) {\n              continue;\n            }\n\n            var equal = cursorEqual(cursor, best);\n            var between = (motionArgs.forward) ?\n              cursorIsBetween(cursor, mark, best) :\n              cursorIsBetween(best, mark, cursor);\n\n            if (equal || between) {\n              best = mark;\n            }\n          }\n        }\n\n        if (motionArgs.linewise) {\n          // Vim places the cursor on the first non-whitespace character of\n          // the line if there is one, else it places the cursor at the end\n          // of the line, regardless of whether a mark was found.\n          best = new Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line)));\n        }\n        return best;\n      },\n      moveByCharacters: function(_cm, head, motionArgs) {\n        var cur = head;\n        var repeat = motionArgs.repeat;\n        var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat;\n        return new Pos(cur.line, ch);\n      },\n      moveByLines: function(cm, head, motionArgs, vim) {\n        var cur = head;\n        var endCh = cur.ch;\n        // Depending what our last motion was, we may want to do different\n        // things. If our last motion was moving vertically, we want to\n        // preserve the HPos from our last horizontal move.  If our last motion\n        // was going to the end of a line, moving vertically we should go to\n        // the end of the line, etc.\n        switch (vim.lastMotion) {\n          case this.moveByLines:\n          case this.moveByDisplayLines:\n          case this.moveByScroll:\n          case this.moveToColumn:\n          case this.moveToEol:\n            endCh = vim.lastHPos;\n            break;\n          default:\n            vim.lastHPos = endCh;\n        }\n        var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0);\n        var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;\n        var first = cm.firstLine();\n        var last = cm.lastLine();\n        var posV = cm.findPosV(cur, (motionArgs.forward ? repeat : -repeat), 'line', vim.lastHSPos);\n        var hasMarkedText = motionArgs.forward ? posV.line > line : posV.line < line;\n        if (hasMarkedText) {\n          line = posV.line;\n          endCh = posV.ch;\n        }\n        // Vim go to line begin or line end when cursor at first/last line and\n        // move to previous/next line is triggered.\n        if (line < first && cur.line == first){\n          return this.moveToStartOfLine(cm, head, motionArgs, vim);\n        } else if (line > last && cur.line == last){\n            return moveToEol(cm, head, motionArgs, vim, true);\n        }\n        if (motionArgs.toFirstChar){\n          endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));\n          vim.lastHPos = endCh;\n        }\n        vim.lastHSPos = cm.charCoords(new Pos(line, endCh),'div').left;\n        return new Pos(line, endCh);\n      },\n      moveByDisplayLines: function(cm, head, motionArgs, vim) {\n        var cur = head;\n        switch (vim.lastMotion) {\n          case this.moveByDisplayLines:\n          case this.moveByScroll:\n          case this.moveByLines:\n          case this.moveToColumn:\n          case this.moveToEol:\n            break;\n          default:\n            vim.lastHSPos = cm.charCoords(cur,'div').left;\n        }\n        var repeat = motionArgs.repeat;\n        var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos);\n        if (res.hitSide) {\n          if (motionArgs.forward) {\n            var lastCharCoords = cm.charCoords(res, 'div');\n            var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos };\n            var res = cm.coordsChar(goalCoords, 'div');\n          } else {\n            var resCoords = cm.charCoords(new Pos(cm.firstLine(), 0), 'div');\n            resCoords.left = vim.lastHSPos;\n            res = cm.coordsChar(resCoords, 'div');\n          }\n        }\n        vim.lastHPos = res.ch;\n        return res;\n      },\n      moveByPage: function(cm, head, motionArgs) {\n        // CodeMirror only exposes functions that move the cursor page down, so\n        // doing this bad hack to move the cursor and move it back. evalInput\n        // will move the cursor to where it should be in the end.\n        var curStart = head;\n        var repeat = motionArgs.repeat;\n        return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page');\n      },\n      moveByParagraph: function(cm, head, motionArgs) {\n        var dir = motionArgs.forward ? 1 : -1;\n        return findParagraph(cm, head, motionArgs.repeat, dir);\n      },\n      moveBySentence: function(cm, head, motionArgs) {\n        var dir = motionArgs.forward ? 1 : -1;\n        return findSentence(cm, head, motionArgs.repeat, dir);\n      },\n      moveByScroll: function(cm, head, motionArgs, vim) {\n        var scrollbox = cm.getScrollInfo();\n        var curEnd = null;\n        var repeat = motionArgs.repeat;\n        if (!repeat) {\n          repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight());\n        }\n        var orig = cm.charCoords(head, 'local');\n        motionArgs.repeat = repeat;\n        var curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim);\n        if (!curEnd) {\n          return null;\n        }\n        var dest = cm.charCoords(curEnd, 'local');\n        cm.scrollTo(null, scrollbox.top + dest.top - orig.top);\n        return curEnd;\n      },\n      moveByWords: function(cm, head, motionArgs) {\n        return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward,\n            !!motionArgs.wordEnd, !!motionArgs.bigWord);\n      },\n      moveTillCharacter: function(cm, _head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        var curEnd = moveToCharacter(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter);\n        var increment = motionArgs.forward ? -1 : 1;\n        recordLastCharacterSearch(increment, motionArgs);\n        if (!curEnd) return null;\n        curEnd.ch += increment;\n        return curEnd;\n      },\n      moveToCharacter: function(cm, head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        recordLastCharacterSearch(0, motionArgs);\n        return moveToCharacter(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter) || head;\n      },\n      moveToSymbol: function(cm, head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        return findSymbol(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter) || head;\n      },\n      moveToColumn: function(cm, head, motionArgs, vim) {\n        var repeat = motionArgs.repeat;\n        // repeat is equivalent to which column we want to move to!\n        vim.lastHPos = repeat - 1;\n        vim.lastHSPos = cm.charCoords(head,'div').left;\n        return moveToColumn(cm, repeat);\n      },\n      moveToEol: function(cm, head, motionArgs, vim) {\n        return moveToEol(cm, head, motionArgs, vim, false);\n      },\n      moveToFirstNonWhiteSpaceCharacter: function(cm, head) {\n        // Go to the start of the line where the text begins, or the end for\n        // whitespace-only lines\n        var cursor = head;\n        return new Pos(cursor.line,\n                   findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line)));\n      },\n      moveToMatchedSymbol: function(cm, head) {\n        var cursor = head;\n        var line = cursor.line;\n        var ch = cursor.ch;\n        var lineText = cm.getLine(line);\n        var symbol;\n        for (; ch < lineText.length; ch++) {\n          symbol = lineText.charAt(ch);\n          if (symbol && isMatchableSymbol(symbol)) {\n            var style = cm.getTokenTypeAt(new Pos(line, ch + 1));\n            if (style !== \"string\" && style !== \"comment\") {\n              break;\n            }\n          }\n        }\n        if (ch < lineText.length) {\n          // Only include angle brackets in analysis if they are being matched.\n          var re = (ch === '<' || ch === '>') ? /[(){}[\\]<>]/ : /[(){}[\\]]/;\n          var matched = cm.findMatchingBracket(new Pos(line, ch), {bracketRegex: re});\n          return matched.to;\n        } else {\n          return cursor;\n        }\n      },\n      moveToStartOfLine: function(_cm, head) {\n        return new Pos(head.line, 0);\n      },\n      moveToLineOrEdgeOfDocument: function(cm, _head, motionArgs) {\n        var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine();\n        if (motionArgs.repeatIsExplicit) {\n          lineNum = motionArgs.repeat - cm.getOption('firstLineNumber');\n        }\n        return new Pos(lineNum,\n                   findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum)));\n      },\n      moveToStartOfDisplayLine: function(cm) {\n        cm.execCommand(\"goLineLeft\");\n        return cm.getCursor();\n      },\n      moveToEndOfDisplayLine: function(cm) {\n        cm.execCommand(\"goLineRight\");\n        var head = cm.getCursor();\n        if (head.sticky == \"before\") head.ch--;\n        return head;\n      },\n      textObjectManipulation: function(cm, head, motionArgs, vim) {\n        // TODO: lots of possible exceptions that can be thrown here. Try da(\n        //     outside of a () block.\n        var mirroredPairs = {'(': ')', ')': '(',\n                             '{': '}', '}': '{',\n                             '[': ']', ']': '[',\n                             '<': '>', '>': '<'};\n        var selfPaired = {'\\'': true, '\"': true, '`': true};\n\n        var character = motionArgs.selectedCharacter;\n        // 'b' refers to  '()' block.\n        // 'B' refers to  '{}' block.\n        if (character == 'b') {\n          character = '(';\n        } else if (character == 'B') {\n          character = '{';\n        }\n\n        // Inclusive is the difference between a and i\n        // TODO: Instead of using the additional text object map to perform text\n        //     object operations, merge the map into the defaultKeyMap and use\n        //     motionArgs to define behavior. Define separate entries for 'aw',\n        //     'iw', 'a[', 'i[', etc.\n        var inclusive = !motionArgs.textObjectInner;\n\n        var tmp;\n        if (mirroredPairs[character]) {\n          tmp = selectCompanionObject(cm, head, character, inclusive);\n        } else if (selfPaired[character]) {\n          tmp = findBeginningAndEnd(cm, head, character, inclusive);\n        } else if (character === 'W') {\n          tmp = expandWordUnderCursor(cm, inclusive, true /** forward */,\n                                                     true /** bigWord */);\n        } else if (character === 'w') {\n          tmp = expandWordUnderCursor(cm, inclusive, true /** forward */,\n                                                     false /** bigWord */);\n        } else if (character === 'p') {\n          tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive);\n          motionArgs.linewise = true;\n          if (vim.visualMode) {\n            if (!vim.visualLine) { vim.visualLine = true; }\n          } else {\n            var operatorArgs = vim.inputState.operatorArgs;\n            if (operatorArgs) { operatorArgs.linewise = true; }\n            tmp.end.line--;\n          }\n        } else if (character === 't') {\n          tmp = expandTagUnderCursor(cm, head, inclusive);\n        } else {\n          // No text object defined for this, don't move.\n          return null;\n        }\n\n        if (!cm.state.vim.visualMode) {\n          return [tmp.start, tmp.end];\n        } else {\n          return expandSelection(cm, tmp.start, tmp.end);\n        }\n      },\n\n      repeatLastCharacterSearch: function(cm, head, motionArgs) {\n        var lastSearch = vimGlobalState.lastCharacterSearch;\n        var repeat = motionArgs.repeat;\n        var forward = motionArgs.forward === lastSearch.forward;\n        var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);\n        cm.moveH(-increment, 'char');\n        motionArgs.inclusive = forward ? true : false;\n        var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter);\n        if (!curEnd) {\n          cm.moveH(increment, 'char');\n          return head;\n        }\n        curEnd.ch += increment;\n        return curEnd;\n      }\n    };\n\n    function defineMotion(name, fn) {\n      motions[name] = fn;\n    }\n\n    function fillArray(val, times) {\n      var arr = [];\n      for (var i = 0; i < times; i++) {\n        arr.push(val);\n      }\n      return arr;\n    }\n    /**\n     * An operator acts on a text selection. It receives the list of selections\n     * as input. The corresponding CodeMirror selection is guaranteed to\n    * match the input selection.\n     */\n    var operators = {\n      change: function(cm, args, ranges) {\n        var finalHead, text;\n        var vim = cm.state.vim;\n        var anchor = ranges[0].anchor,\n            head = ranges[0].head;\n        if (!vim.visualMode) {\n          text = cm.getRange(anchor, head);\n          var lastState = vim.lastEditInputState || {};\n          if (lastState.motion == \"moveByWords\" && !isWhiteSpaceString(text)) {\n            // Exclude trailing whitespace if the range is not all whitespace.\n            var match = (/\\s+$/).exec(text);\n            if (match && lastState.motionArgs && lastState.motionArgs.forward) {\n              head = offsetCursor(head, 0, - match[0].length);\n              text = text.slice(0, - match[0].length);\n            }\n          }\n          var prevLineEnd = new Pos(anchor.line - 1, Number.MAX_VALUE);\n          var wasLastLine = cm.firstLine() == cm.lastLine();\n          if (head.line > cm.lastLine() && args.linewise && !wasLastLine) {\n            cm.replaceRange('', prevLineEnd, head);\n          } else {\n            cm.replaceRange('', anchor, head);\n          }\n          if (args.linewise) {\n            // Push the next line back down, if there is a next line.\n            if (!wasLastLine) {\n              cm.setCursor(prevLineEnd);\n              CodeMirror.commands.newlineAndIndent(cm);\n            }\n            // make sure cursor ends up at the end of the line.\n            anchor.ch = Number.MAX_VALUE;\n          }\n          finalHead = anchor;\n        } else if (args.fullLine) {\n            head.ch = Number.MAX_VALUE;\n            head.line--;\n            cm.setSelection(anchor, head)\n            text = cm.getSelection();\n            cm.replaceSelection(\"\");\n            finalHead = anchor;\n        } else {\n          text = cm.getSelection();\n          var replacement = fillArray('', ranges.length);\n          cm.replaceSelections(replacement);\n          finalHead = cursorMin(ranges[0].head, ranges[0].anchor);\n        }\n        vimGlobalState.registerController.pushText(\n            args.registerName, 'change', text,\n            args.linewise, ranges.length > 1);\n        actions.enterInsertMode(cm, {head: finalHead}, cm.state.vim);\n      },\n      // delete is a javascript keyword.\n      'delete': function(cm, args, ranges) {\n        var finalHead, text;\n        var vim = cm.state.vim;\n        if (!vim.visualBlock) {\n          var anchor = ranges[0].anchor,\n              head = ranges[0].head;\n          if (args.linewise &&\n              head.line != cm.firstLine() &&\n              anchor.line == cm.lastLine() &&\n              anchor.line == head.line - 1) {\n            // Special case for dd on last line (and first line).\n            if (anchor.line == cm.firstLine()) {\n              anchor.ch = 0;\n            } else {\n              anchor = new Pos(anchor.line - 1, lineLength(cm, anchor.line - 1));\n            }\n          }\n          text = cm.getRange(anchor, head);\n          cm.replaceRange('', anchor, head);\n          finalHead = anchor;\n          if (args.linewise) {\n            finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor);\n          }\n        } else {\n          text = cm.getSelection();\n          var replacement = fillArray('', ranges.length);\n          cm.replaceSelections(replacement);\n          finalHead = cursorMin(ranges[0].head, ranges[0].anchor);\n        }\n        vimGlobalState.registerController.pushText(\n            args.registerName, 'delete', text,\n            args.linewise, vim.visualBlock);\n        return clipCursorToContent(cm, finalHead);\n      },\n      indent: function(cm, args, ranges) {\n        var vim = cm.state.vim;\n        var startLine = ranges[0].anchor.line;\n        var endLine = vim.visualBlock ?\n          ranges[ranges.length - 1].anchor.line :\n          ranges[0].head.line;\n        // In visual mode, n> shifts the selection right n times, instead of\n        // shifting n lines right once.\n        var repeat = (vim.visualMode) ? args.repeat : 1;\n        if (args.linewise) {\n          // The only way to delete a newline is to delete until the start of\n          // the next line, so in linewise mode evalInput will include the next\n          // line. We don't want this in indent, so we go back a line.\n          endLine--;\n        }\n        for (var i = startLine; i <= endLine; i++) {\n          for (var j = 0; j < repeat; j++) {\n            cm.indentLine(i, args.indentRight);\n          }\n        }\n        return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor);\n      },\n      indentAuto: function(cm, _args, ranges) {\n        cm.execCommand(\"indentAuto\");\n        return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor);\n      },\n      changeCase: function(cm, args, ranges, oldAnchor, newHead) {\n        var selections = cm.getSelections();\n        var swapped = [];\n        var toLower = args.toLower;\n        for (var j = 0; j < selections.length; j++) {\n          var toSwap = selections[j];\n          var text = '';\n          if (toLower === true) {\n            text = toSwap.toLowerCase();\n          } else if (toLower === false) {\n            text = toSwap.toUpperCase();\n          } else {\n            for (var i = 0; i < toSwap.length; i++) {\n              var character = toSwap.charAt(i);\n              text += isUpperCase(character) ? character.toLowerCase() :\n                  character.toUpperCase();\n            }\n          }\n          swapped.push(text);\n        }\n        cm.replaceSelections(swapped);\n        if (args.shouldMoveCursor){\n          return newHead;\n        } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) {\n          return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor);\n        } else if (args.linewise){\n          return oldAnchor;\n        } else {\n          return cursorMin(ranges[0].anchor, ranges[0].head);\n        }\n      },\n      yank: function(cm, args, ranges, oldAnchor) {\n        var vim = cm.state.vim;\n        var text = cm.getSelection();\n        var endPos = vim.visualMode\n          ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor)\n          : oldAnchor;\n        vimGlobalState.registerController.pushText(\n            args.registerName, 'yank',\n            text, args.linewise, vim.visualBlock);\n        return endPos;\n      }\n    };\n\n    function defineOperator(name, fn) {\n      operators[name] = fn;\n    }\n\n    var actions = {\n      jumpListWalk: function(cm, actionArgs, vim) {\n        if (vim.visualMode) {\n          return;\n        }\n        var repeat = actionArgs.repeat;\n        var forward = actionArgs.forward;\n        var jumpList = vimGlobalState.jumpList;\n\n        var mark = jumpList.move(cm, forward ? repeat : -repeat);\n        var markPos = mark ? mark.find() : undefined;\n        markPos = markPos ? markPos : cm.getCursor();\n        cm.setCursor(markPos);\n      },\n      scroll: function(cm, actionArgs, vim) {\n        if (vim.visualMode) {\n          return;\n        }\n        var repeat = actionArgs.repeat || 1;\n        var lineHeight = cm.defaultTextHeight();\n        var top = cm.getScrollInfo().top;\n        var delta = lineHeight * repeat;\n        var newPos = actionArgs.forward ? top + delta : top - delta;\n        var cursor = copyCursor(cm.getCursor());\n        var cursorCoords = cm.charCoords(cursor, 'local');\n        if (actionArgs.forward) {\n          if (newPos > cursorCoords.top) {\n             cursor.line += (newPos - cursorCoords.top) / lineHeight;\n             cursor.line = Math.ceil(cursor.line);\n             cm.setCursor(cursor);\n             cursorCoords = cm.charCoords(cursor, 'local');\n             cm.scrollTo(null, cursorCoords.top);\n          } else {\n             // Cursor stays within bounds.  Just reposition the scroll window.\n             cm.scrollTo(null, newPos);\n          }\n        } else {\n          var newBottom = newPos + cm.getScrollInfo().clientHeight;\n          if (newBottom < cursorCoords.bottom) {\n             cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight;\n             cursor.line = Math.floor(cursor.line);\n             cm.setCursor(cursor);\n             cursorCoords = cm.charCoords(cursor, 'local');\n             cm.scrollTo(\n                 null, cursorCoords.bottom - cm.getScrollInfo().clientHeight);\n          } else {\n             // Cursor stays within bounds.  Just reposition the scroll window.\n             cm.scrollTo(null, newPos);\n          }\n        }\n      },\n      scrollToCursor: function(cm, actionArgs) {\n        var lineNum = cm.getCursor().line;\n        var charCoords = cm.charCoords(new Pos(lineNum, 0), 'local');\n        var height = cm.getScrollInfo().clientHeight;\n        var y = charCoords.top;\n        var lineHeight = charCoords.bottom - y;\n        switch (actionArgs.position) {\n          case 'center': y = y - (height / 2) + lineHeight;\n            break;\n          case 'bottom': y = y - height + lineHeight;\n            break;\n        }\n        cm.scrollTo(null, y);\n      },\n      replayMacro: function(cm, actionArgs, vim) {\n        var registerName = actionArgs.selectedCharacter;\n        var repeat = actionArgs.repeat;\n        var macroModeState = vimGlobalState.macroModeState;\n        if (registerName == '@') {\n          registerName = macroModeState.latestRegister;\n        } else {\n          macroModeState.latestRegister = registerName;\n        }\n        while(repeat--){\n          executeMacroRegister(cm, vim, macroModeState, registerName);\n        }\n      },\n      enterMacroRecordMode: function(cm, actionArgs) {\n        var macroModeState = vimGlobalState.macroModeState;\n        var registerName = actionArgs.selectedCharacter;\n        if (vimGlobalState.registerController.isValidRegister(registerName)) {\n          macroModeState.enterMacroRecordMode(cm, registerName);\n        }\n      },\n      toggleOverwrite: function(cm) {\n        if (!cm.state.overwrite) {\n          cm.toggleOverwrite(true);\n          cm.setOption('keyMap', 'vim-replace');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"replace\"});\n        } else {\n          cm.toggleOverwrite(false);\n          cm.setOption('keyMap', 'vim-insert');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"insert\"});\n        }\n      },\n      enterInsertMode: function(cm, actionArgs, vim) {\n        if (cm.getOption('readOnly')) { return; }\n        vim.insertMode = true;\n        vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1;\n        var insertAt = (actionArgs) ? actionArgs.insertAt : null;\n        var sel = vim.sel;\n        var head = actionArgs.head || cm.getCursor('head');\n        var height = cm.listSelections().length;\n        if (insertAt == 'eol') {\n          head = new Pos(head.line, lineLength(cm, head.line));\n        } else if (insertAt == 'bol') {\n          head = new Pos(head.line, 0);\n        } else if (insertAt == 'charAfter') {\n          head = offsetCursor(head, 0, 1);\n        } else if (insertAt == 'firstNonBlank') {\n          head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head);\n        } else if (insertAt == 'startOfSelectedArea') {\n          if (!vim.visualMode)\n              return;\n          if (!vim.visualBlock) {\n            if (sel.head.line < sel.anchor.line) {\n              head = sel.head;\n            } else {\n              head = new Pos(sel.anchor.line, 0);\n            }\n          } else {\n            head = new Pos(\n                Math.min(sel.head.line, sel.anchor.line),\n                Math.min(sel.head.ch, sel.anchor.ch));\n            height = Math.abs(sel.head.line - sel.anchor.line) + 1;\n          }\n        } else if (insertAt == 'endOfSelectedArea') {\n            if (!vim.visualMode)\n              return;\n          if (!vim.visualBlock) {\n            if (sel.head.line >= sel.anchor.line) {\n              head = offsetCursor(sel.head, 0, 1);\n            } else {\n              head = new Pos(sel.anchor.line, 0);\n            }\n          } else {\n            head = new Pos(\n                Math.min(sel.head.line, sel.anchor.line),\n                Math.max(sel.head.ch, sel.anchor.ch) + 1);\n            height = Math.abs(sel.head.line - sel.anchor.line) + 1;\n          }\n        } else if (insertAt == 'inplace') {\n          if (vim.visualMode){\n            return;\n          }\n        } else if (insertAt == 'lastEdit') {\n          head = getLastEditPos(cm) || head;\n        }\n        cm.setOption('disableInput', false);\n        if (actionArgs && actionArgs.replace) {\n          // Handle Replace-mode as a special case of insert mode.\n          cm.toggleOverwrite(true);\n          cm.setOption('keyMap', 'vim-replace');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"replace\"});\n        } else {\n          cm.toggleOverwrite(false);\n          cm.setOption('keyMap', 'vim-insert');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"insert\"});\n        }\n        if (!vimGlobalState.macroModeState.isPlaying) {\n          // Only record if not replaying.\n          cm.on('change', onChange);\n          CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n        }\n        if (vim.visualMode) {\n          exitVisualMode(cm);\n        }\n        selectForInsert(cm, head, height);\n      },\n      toggleVisualMode: function(cm, actionArgs, vim) {\n        var repeat = actionArgs.repeat;\n        var anchor = cm.getCursor();\n        var head;\n        // TODO: The repeat should actually select number of characters/lines\n        //     equal to the repeat times the size of the previous visual\n        //     operation.\n        if (!vim.visualMode) {\n          // Entering visual mode\n          vim.visualMode = true;\n          vim.visualLine = !!actionArgs.linewise;\n          vim.visualBlock = !!actionArgs.blockwise;\n          head = clipCursorToContent(\n              cm, new Pos(anchor.line, anchor.ch + repeat - 1));\n          vim.sel = {\n            anchor: anchor,\n            head: head\n          };\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : vim.visualBlock ? \"blockwise\" : \"\"});\n          updateCmSelection(cm);\n          updateMark(cm, vim, '<', cursorMin(anchor, head));\n          updateMark(cm, vim, '>', cursorMax(anchor, head));\n        } else if (vim.visualLine ^ actionArgs.linewise ||\n            vim.visualBlock ^ actionArgs.blockwise) {\n          // Toggling between modes\n          vim.visualLine = !!actionArgs.linewise;\n          vim.visualBlock = !!actionArgs.blockwise;\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : vim.visualBlock ? \"blockwise\" : \"\"});\n          updateCmSelection(cm);\n        } else {\n          exitVisualMode(cm);\n        }\n      },\n      reselectLastSelection: function(cm, _actionArgs, vim) {\n        var lastSelection = vim.lastSelection;\n        if (vim.visualMode) {\n          updateLastSelection(cm, vim);\n        }\n        if (lastSelection) {\n          var anchor = lastSelection.anchorMark.find();\n          var head = lastSelection.headMark.find();\n          if (!anchor || !head) {\n            // If the marks have been destroyed due to edits, do nothing.\n            return;\n          }\n          vim.sel = {\n            anchor: anchor,\n            head: head\n          };\n          vim.visualMode = true;\n          vim.visualLine = lastSelection.visualLine;\n          vim.visualBlock = lastSelection.visualBlock;\n          updateCmSelection(cm);\n          updateMark(cm, vim, '<', cursorMin(anchor, head));\n          updateMark(cm, vim, '>', cursorMax(anchor, head));\n          CodeMirror.signal(cm, 'vim-mode-change', {\n            mode: 'visual',\n            subMode: vim.visualLine ? 'linewise' :\n                     vim.visualBlock ? 'blockwise' : ''});\n        }\n      },\n      joinLines: function(cm, actionArgs, vim) {\n        var curStart, curEnd;\n        if (vim.visualMode) {\n          curStart = cm.getCursor('anchor');\n          curEnd = cm.getCursor('head');\n          if (cursorIsBefore(curEnd, curStart)) {\n            var tmp = curEnd;\n            curEnd = curStart;\n            curStart = tmp;\n          }\n          curEnd.ch = lineLength(cm, curEnd.line) - 1;\n        } else {\n          // Repeat is the number of lines to join. Minimum 2 lines.\n          var repeat = Math.max(actionArgs.repeat, 2);\n          curStart = cm.getCursor();\n          curEnd = clipCursorToContent(cm, new Pos(curStart.line + repeat - 1,\n                                               Infinity));\n        }\n        var finalCh = 0;\n        for (var i = curStart.line; i < curEnd.line; i++) {\n          finalCh = lineLength(cm, curStart.line);\n          var tmp = new Pos(curStart.line + 1,\n                        lineLength(cm, curStart.line + 1));\n          var text = cm.getRange(curStart, tmp);\n          text = actionArgs.keepSpaces\n            ? text.replace(/\\n\\r?/g, '')\n            : text.replace(/\\n\\s*/g, ' ');\n          cm.replaceRange(text, curStart, tmp);\n        }\n        var curFinalPos = new Pos(curStart.line, finalCh);\n        if (vim.visualMode) {\n          exitVisualMode(cm, false);\n        }\n        cm.setCursor(curFinalPos);\n      },\n      newLineAndEnterInsertMode: function(cm, actionArgs, vim) {\n        vim.insertMode = true;\n        var insertAt = copyCursor(cm.getCursor());\n        if (insertAt.line === cm.firstLine() && !actionArgs.after) {\n          // Special case for inserting newline before start of document.\n          cm.replaceRange('\\n', new Pos(cm.firstLine(), 0));\n          cm.setCursor(cm.firstLine(), 0);\n        } else {\n          insertAt.line = (actionArgs.after) ? insertAt.line :\n              insertAt.line - 1;\n          insertAt.ch = lineLength(cm, insertAt.line);\n          cm.setCursor(insertAt);\n          var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment ||\n              CodeMirror.commands.newlineAndIndent;\n          newlineFn(cm);\n        }\n        this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim);\n      },\n      paste: function(cm, actionArgs, vim) {\n        var cur = copyCursor(cm.getCursor());\n        var register = vimGlobalState.registerController.getRegister(\n            actionArgs.registerName);\n        var text = register.toString();\n        if (!text) {\n          return;\n        }\n        if (actionArgs.matchIndent) {\n          var tabSize = cm.getOption(\"tabSize\");\n          // length that considers tabs and tabSize\n          var whitespaceLength = function(str) {\n            var tabs = (str.split(\"\\t\").length - 1);\n            var spaces = (str.split(\" \").length - 1);\n            return tabs * tabSize + spaces * 1;\n          };\n          var currentLine = cm.getLine(cm.getCursor().line);\n          var indent = whitespaceLength(currentLine.match(/^\\s*/)[0]);\n          // chomp last newline b/c don't want it to match /^\\s*/gm\n          var chompedText = text.replace(/\\n$/, '');\n          var wasChomped = text !== chompedText;\n          var firstIndent = whitespaceLength(text.match(/^\\s*/)[0]);\n          var text = chompedText.replace(/^\\s*/gm, function(wspace) {\n            var newIndent = indent + (whitespaceLength(wspace) - firstIndent);\n            if (newIndent < 0) {\n              return \"\";\n            }\n            else if (cm.getOption(\"indentWithTabs\")) {\n              var quotient = Math.floor(newIndent / tabSize);\n              return Array(quotient + 1).join('\\t');\n            }\n            else {\n              return Array(newIndent + 1).join(' ');\n            }\n          });\n          text += wasChomped ? \"\\n\" : \"\";\n        }\n        if (actionArgs.repeat > 1) {\n          var text = Array(actionArgs.repeat + 1).join(text);\n        }\n        var linewise = register.linewise;\n        var blockwise = register.blockwise;\n        if (blockwise) {\n          text = text.split('\\n');\n          if (linewise) {\n              text.pop();\n          }\n          for (var i = 0; i < text.length; i++) {\n            text[i] = (text[i] == '') ? ' ' : text[i];\n          }\n          cur.ch += actionArgs.after ? 1 : 0;\n          cur.ch = Math.min(lineLength(cm, cur.line), cur.ch);\n        } else if (linewise) {\n          if(vim.visualMode) {\n            text = vim.visualLine ? text.slice(0, -1) : '\\n' + text.slice(0, text.length - 1) + '\\n';\n          } else if (actionArgs.after) {\n            // Move the newline at the end to the start instead, and paste just\n            // before the newline character of the line we are on right now.\n            text = '\\n' + text.slice(0, text.length - 1);\n            cur.ch = lineLength(cm, cur.line);\n          } else {\n            cur.ch = 0;\n          }\n        } else {\n          cur.ch += actionArgs.after ? 1 : 0;\n        }\n        var curPosFinal;\n        var idx;\n        if (vim.visualMode) {\n          //  save the pasted text for reselection if the need arises\n          vim.lastPastedText = text;\n          var lastSelectionCurEnd;\n          var selectedArea = getSelectedAreaRange(cm, vim);\n          var selectionStart = selectedArea[0];\n          var selectionEnd = selectedArea[1];\n          var selectedText = cm.getSelection();\n          var selections = cm.listSelections();\n          var emptyStrings = new Array(selections.length).join('1').split('1');\n          // save the curEnd marker before it get cleared due to cm.replaceRange.\n          if (vim.lastSelection) {\n            lastSelectionCurEnd = vim.lastSelection.headMark.find();\n          }\n          // push the previously selected text to unnamed register\n          vimGlobalState.registerController.unnamedRegister.setText(selectedText);\n          if (blockwise) {\n            // first delete the selected text\n            cm.replaceSelections(emptyStrings);\n            // Set new selections as per the block length of the yanked text\n            selectionEnd = new Pos(selectionStart.line + text.length-1, selectionStart.ch);\n            cm.setCursor(selectionStart);\n            selectBlock(cm, selectionEnd);\n            cm.replaceSelections(text);\n            curPosFinal = selectionStart;\n          } else if (vim.visualBlock) {\n            cm.replaceSelections(emptyStrings);\n            cm.setCursor(selectionStart);\n            cm.replaceRange(text, selectionStart, selectionStart);\n            curPosFinal = selectionStart;\n          } else {\n            cm.replaceRange(text, selectionStart, selectionEnd);\n            curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1);\n          }\n          // restore the the curEnd marker\n          if(lastSelectionCurEnd) {\n            vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd);\n          }\n          if (linewise) {\n            curPosFinal.ch=0;\n          }\n        } else {\n          if (blockwise) {\n            cm.setCursor(cur);\n            for (var i = 0; i < text.length; i++) {\n              var line = cur.line+i;\n              if (line > cm.lastLine()) {\n                cm.replaceRange('\\n',  new Pos(line, 0));\n              }\n              var lastCh = lineLength(cm, line);\n              if (lastCh < cur.ch) {\n                extendLineToColumn(cm, line, cur.ch);\n              }\n            }\n            cm.setCursor(cur);\n            selectBlock(cm, new Pos(cur.line + text.length-1, cur.ch));\n            cm.replaceSelections(text);\n            curPosFinal = cur;\n          } else {\n            cm.replaceRange(text, cur);\n            // Now fine tune the cursor to where we want it.\n            if (linewise && actionArgs.after) {\n              curPosFinal = new Pos(\n              cur.line + 1,\n              findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1)));\n            } else if (linewise && !actionArgs.after) {\n              curPosFinal = new Pos(\n                cur.line,\n                findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line)));\n            } else if (!linewise && actionArgs.after) {\n              idx = cm.indexFromPos(cur);\n              curPosFinal = cm.posFromIndex(idx + text.length - 1);\n            } else {\n              idx = cm.indexFromPos(cur);\n              curPosFinal = cm.posFromIndex(idx + text.length);\n            }\n          }\n        }\n        if (vim.visualMode) {\n          exitVisualMode(cm, false);\n        }\n        cm.setCursor(curPosFinal);\n      },\n      undo: function(cm, actionArgs) {\n        cm.operation(function() {\n          repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)();\n          cm.setCursor(cm.getCursor('anchor'));\n        });\n      },\n      redo: function(cm, actionArgs) {\n        repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)();\n      },\n      setRegister: function(_cm, actionArgs, vim) {\n        vim.inputState.registerName = actionArgs.selectedCharacter;\n      },\n      setMark: function(cm, actionArgs, vim) {\n        var markName = actionArgs.selectedCharacter;\n        updateMark(cm, vim, markName, cm.getCursor());\n      },\n      replace: function(cm, actionArgs, vim) {\n        var replaceWith = actionArgs.selectedCharacter;\n        var curStart = cm.getCursor();\n        var replaceTo;\n        var curEnd;\n        var selections = cm.listSelections();\n        if (vim.visualMode) {\n          curStart = cm.getCursor('start');\n          curEnd = cm.getCursor('end');\n        } else {\n          var line = cm.getLine(curStart.line);\n          replaceTo = curStart.ch + actionArgs.repeat;\n          if (replaceTo > line.length) {\n            replaceTo=line.length;\n          }\n          curEnd = new Pos(curStart.line, replaceTo);\n        }\n        if (replaceWith=='\\n') {\n          if (!vim.visualMode) cm.replaceRange('', curStart, curEnd);\n          // special case, where vim help says to replace by just one line-break\n          (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm);\n        } else {\n          var replaceWithStr = cm.getRange(curStart, curEnd);\n          //replace all characters in range by selected, but keep linebreaks\n          replaceWithStr = replaceWithStr.replace(/[^\\n]/g, replaceWith);\n          if (vim.visualBlock) {\n            // Tabs are split in visua block before replacing\n            var spaces = new Array(cm.getOption(\"tabSize\")+1).join(' ');\n            replaceWithStr = cm.getSelection();\n            replaceWithStr = replaceWithStr.replace(/\\t/g, spaces).replace(/[^\\n]/g, replaceWith).split('\\n');\n            cm.replaceSelections(replaceWithStr);\n          } else {\n            cm.replaceRange(replaceWithStr, curStart, curEnd);\n          }\n          if (vim.visualMode) {\n            curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ?\n                         selections[0].anchor : selections[0].head;\n            cm.setCursor(curStart);\n            exitVisualMode(cm, false);\n          } else {\n            cm.setCursor(offsetCursor(curEnd, 0, -1));\n          }\n        }\n      },\n      incrementNumberToken: function(cm, actionArgs) {\n        var cur = cm.getCursor();\n        var lineStr = cm.getLine(cur.line);\n        var re = /(-?)(?:(0x)([\\da-f]+)|(0b|0|)(\\d+))/gi;\n        var match;\n        var start;\n        var end;\n        var numberStr;\n        while ((match = re.exec(lineStr)) !== null) {\n          start = match.index;\n          end = start + match[0].length;\n          if (cur.ch < end)break;\n        }\n        if (!actionArgs.backtrack && (end <= cur.ch))return;\n        if (match) {\n          var baseStr = match[2] || match[4]\n          var digits = match[3] || match[5]\n          var increment = actionArgs.increase ? 1 : -1;\n          var base = {'0b': 2, '0': 8, '': 10, '0x': 16}[baseStr.toLowerCase()];\n          var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat);\n          numberStr = number.toString(base);\n          var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : ''\n          if (numberStr.charAt(0) === '-') {\n            numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1);\n          } else {\n            numberStr = baseStr + zeroPadding + numberStr;\n          }\n          var from = new Pos(cur.line, start);\n          var to = new Pos(cur.line, end);\n          cm.replaceRange(numberStr, from, to);\n        } else {\n          return;\n        }\n        cm.setCursor(new Pos(cur.line, start + numberStr.length - 1));\n      },\n      repeatLastEdit: function(cm, actionArgs, vim) {\n        var lastEditInputState = vim.lastEditInputState;\n        if (!lastEditInputState) { return; }\n        var repeat = actionArgs.repeat;\n        if (repeat && actionArgs.repeatIsExplicit) {\n          vim.lastEditInputState.repeatOverride = repeat;\n        } else {\n          repeat = vim.lastEditInputState.repeatOverride || repeat;\n        }\n        repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */);\n      },\n      indent: function(cm, actionArgs) {\n        cm.indentLine(cm.getCursor().line, actionArgs.indentRight);\n      },\n      exitInsertMode: exitInsertMode\n    };\n\n    function defineAction(name, fn) {\n      actions[name] = fn;\n    }\n\n    /*\n     * Below are miscellaneous utility functions used by vim.js\n     */\n\n    /**\n     * Clips cursor to ensure that line is within the buffer's range\n     * If includeLineBreak is true, then allow cur.ch == lineLength.\n     */\n    function clipCursorToContent(cm, cur) {\n      var vim = cm.state.vim;\n      var includeLineBreak = vim.insertMode || vim.visualMode;\n      var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() );\n      var maxCh = lineLength(cm, line) - 1 + !!includeLineBreak;\n      var ch = Math.min(Math.max(0, cur.ch), maxCh);\n      return new Pos(line, ch);\n    }\n    function copyArgs(args) {\n      var ret = {};\n      for (var prop in args) {\n        if (args.hasOwnProperty(prop)) {\n          ret[prop] = args[prop];\n        }\n      }\n      return ret;\n    }\n    function offsetCursor(cur, offsetLine, offsetCh) {\n      if (typeof offsetLine === 'object') {\n        offsetCh = offsetLine.ch;\n        offsetLine = offsetLine.line;\n      }\n      return new Pos(cur.line + offsetLine, cur.ch + offsetCh);\n    }\n    function commandMatches(keys, keyMap, context, inputState) {\n      // Partial matches are not applied. They inform the key handler\n      // that the current key sequence is a subsequence of a valid key\n      // sequence, so that the key buffer is not cleared.\n      var match, partial = [], full = [];\n      for (var i = 0; i < keyMap.length; i++) {\n        var command = keyMap[i];\n        if (context == 'insert' && command.context != 'insert' ||\n            command.context && command.context != context ||\n            inputState.operator && command.type == 'action' ||\n            !(match = commandMatch(keys, command.keys))) { continue; }\n        if (match == 'partial') { partial.push(command); }\n        if (match == 'full') { full.push(command); }\n      }\n      return {\n        partial: partial.length && partial,\n        full: full.length && full\n      };\n    }\n    function commandMatch(pressed, mapped) {\n      if (mapped.slice(-11) == '<character>') {\n        // Last character matches anything.\n        var prefixLen = mapped.length - 11;\n        var pressedPrefix = pressed.slice(0, prefixLen);\n        var mappedPrefix = mapped.slice(0, prefixLen);\n        return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' :\n               mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false;\n      } else {\n        return pressed == mapped ? 'full' :\n               mapped.indexOf(pressed) == 0 ? 'partial' : false;\n      }\n    }\n    function lastChar(keys) {\n      var match = /^.*(<[^>]+>)$/.exec(keys);\n      var selectedCharacter = match ? match[1] : keys.slice(-1);\n      if (selectedCharacter.length > 1){\n        switch(selectedCharacter){\n          case '<CR>':\n            selectedCharacter='\\n';\n            break;\n          case '<Space>':\n            selectedCharacter=' ';\n            break;\n          default:\n            selectedCharacter='';\n            break;\n        }\n      }\n      return selectedCharacter;\n    }\n    function repeatFn(cm, fn, repeat) {\n      return function() {\n        for (var i = 0; i < repeat; i++) {\n          fn(cm);\n        }\n      };\n    }\n    function copyCursor(cur) {\n      return new Pos(cur.line, cur.ch);\n    }\n    function cursorEqual(cur1, cur2) {\n      return cur1.ch == cur2.ch && cur1.line == cur2.line;\n    }\n    function cursorIsBefore(cur1, cur2) {\n      if (cur1.line < cur2.line) {\n        return true;\n      }\n      if (cur1.line == cur2.line && cur1.ch < cur2.ch) {\n        return true;\n      }\n      return false;\n    }\n    function cursorMin(cur1, cur2) {\n      if (arguments.length > 2) {\n        cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1));\n      }\n      return cursorIsBefore(cur1, cur2) ? cur1 : cur2;\n    }\n    function cursorMax(cur1, cur2) {\n      if (arguments.length > 2) {\n        cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1));\n      }\n      return cursorIsBefore(cur1, cur2) ? cur2 : cur1;\n    }\n    function cursorIsBetween(cur1, cur2, cur3) {\n      // returns true if cur2 is between cur1 and cur3.\n      var cur1before2 = cursorIsBefore(cur1, cur2);\n      var cur2before3 = cursorIsBefore(cur2, cur3);\n      return cur1before2 && cur2before3;\n    }\n    function lineLength(cm, lineNum) {\n      return cm.getLine(lineNum).length;\n    }\n    function trim(s) {\n      if (s.trim) {\n        return s.trim();\n      }\n      return s.replace(/^\\s+|\\s+$/g, '');\n    }\n    function escapeRegex(s) {\n      return s.replace(/([.?*+$\\[\\]\\/\\\\(){}|\\-])/g, '\\\\$1');\n    }\n    function extendLineToColumn(cm, lineNum, column) {\n      var endCh = lineLength(cm, lineNum);\n      var spaces = new Array(column-endCh+1).join(' ');\n      cm.setCursor(new Pos(lineNum, endCh));\n      cm.replaceRange(spaces, cm.getCursor());\n    }\n    // This functions selects a rectangular block\n    // of text with selectionEnd as any of its corner\n    // Height of block:\n    // Difference in selectionEnd.line and first/last selection.line\n    // Width of the block:\n    // Distance between selectionEnd.ch and any(first considered here) selection.ch\n    function selectBlock(cm, selectionEnd) {\n      var selections = [], ranges = cm.listSelections();\n      var head = copyCursor(cm.clipPos(selectionEnd));\n      var isClipped = !cursorEqual(selectionEnd, head);\n      var curHead = cm.getCursor('head');\n      var primIndex = getIndex(ranges, curHead);\n      var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor);\n      var max = ranges.length - 1;\n      var index = max - primIndex > primIndex ? max : 0;\n      var base = ranges[index].anchor;\n\n      var firstLine = Math.min(base.line, head.line);\n      var lastLine = Math.max(base.line, head.line);\n      var baseCh = base.ch, headCh = head.ch;\n\n      var dir = ranges[index].head.ch - baseCh;\n      var newDir = headCh - baseCh;\n      if (dir > 0 && newDir <= 0) {\n        baseCh++;\n        if (!isClipped) { headCh--; }\n      } else if (dir < 0 && newDir >= 0) {\n        baseCh--;\n        if (!wasClipped) { headCh++; }\n      } else if (dir < 0 && newDir == -1) {\n        baseCh--;\n        headCh++;\n      }\n      for (var line = firstLine; line <= lastLine; line++) {\n        var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)};\n        selections.push(range);\n      }\n      cm.setSelections(selections);\n      selectionEnd.ch = headCh;\n      base.ch = baseCh;\n      return base;\n    }\n    function selectForInsert(cm, head, height) {\n      var sel = [];\n      for (var i = 0; i < height; i++) {\n        var lineHead = offsetCursor(head, i, 0);\n        sel.push({anchor: lineHead, head: lineHead});\n      }\n      cm.setSelections(sel, 0);\n    }\n    // getIndex returns the index of the cursor in the selections.\n    function getIndex(ranges, cursor, end) {\n      for (var i = 0; i < ranges.length; i++) {\n        var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor);\n        var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor);\n        if (atAnchor || atHead) {\n          return i;\n        }\n      }\n      return -1;\n    }\n    function getSelectedAreaRange(cm, vim) {\n      var lastSelection = vim.lastSelection;\n      var getCurrentSelectedAreaRange = function() {\n        var selections = cm.listSelections();\n        var start =  selections[0];\n        var end = selections[selections.length-1];\n        var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head;\n        var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor;\n        return [selectionStart, selectionEnd];\n      };\n      var getLastSelectedAreaRange = function() {\n        var selectionStart = cm.getCursor();\n        var selectionEnd = cm.getCursor();\n        var block = lastSelection.visualBlock;\n        if (block) {\n          var width = block.width;\n          var height = block.height;\n          selectionEnd = new Pos(selectionStart.line + height, selectionStart.ch + width);\n          var selections = [];\n          // selectBlock creates a 'proper' rectangular block.\n          // We do not want that in all cases, so we manually set selections.\n          for (var i = selectionStart.line; i < selectionEnd.line; i++) {\n            var anchor = new Pos(i, selectionStart.ch);\n            var head = new Pos(i, selectionEnd.ch);\n            var range = {anchor: anchor, head: head};\n            selections.push(range);\n          }\n          cm.setSelections(selections);\n        } else {\n          var start = lastSelection.anchorMark.find();\n          var end = lastSelection.headMark.find();\n          var line = end.line - start.line;\n          var ch = end.ch - start.ch;\n          selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch};\n          if (lastSelection.visualLine) {\n            selectionStart = new Pos(selectionStart.line, 0);\n            selectionEnd = new Pos(selectionEnd.line, lineLength(cm, selectionEnd.line));\n          }\n          cm.setSelection(selectionStart, selectionEnd);\n        }\n        return [selectionStart, selectionEnd];\n      };\n      if (!vim.visualMode) {\n      // In case of replaying the action.\n        return getLastSelectedAreaRange();\n      } else {\n        return getCurrentSelectedAreaRange();\n      }\n    }\n    // Updates the previous selection with the current selection's values. This\n    // should only be called in visual mode.\n    function updateLastSelection(cm, vim) {\n      var anchor = vim.sel.anchor;\n      var head = vim.sel.head;\n      // To accommodate the effect of lastPastedText in the last selection\n      if (vim.lastPastedText) {\n        head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length);\n        vim.lastPastedText = null;\n      }\n      vim.lastSelection = {'anchorMark': cm.setBookmark(anchor),\n                           'headMark': cm.setBookmark(head),\n                           'anchor': copyCursor(anchor),\n                           'head': copyCursor(head),\n                           'visualMode': vim.visualMode,\n                           'visualLine': vim.visualLine,\n                           'visualBlock': vim.visualBlock};\n    }\n    function expandSelection(cm, start, end) {\n      var sel = cm.state.vim.sel;\n      var head = sel.head;\n      var anchor = sel.anchor;\n      var tmp;\n      if (cursorIsBefore(end, start)) {\n        tmp = end;\n        end = start;\n        start = tmp;\n      }\n      if (cursorIsBefore(head, anchor)) {\n        head = cursorMin(start, head);\n        anchor = cursorMax(anchor, end);\n      } else {\n        anchor = cursorMin(start, anchor);\n        head = cursorMax(head, end);\n        head = offsetCursor(head, 0, -1);\n        if (head.ch == -1 && head.line != cm.firstLine()) {\n          head = new Pos(head.line - 1, lineLength(cm, head.line - 1));\n        }\n      }\n      return [anchor, head];\n    }\n    /**\n     * Updates the CodeMirror selection to match the provided vim selection.\n     * If no arguments are given, it uses the current vim selection state.\n     */\n    function updateCmSelection(cm, sel, mode) {\n      var vim = cm.state.vim;\n      sel = sel || vim.sel;\n      var mode = mode ||\n        vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char';\n      var cmSel = makeCmSelection(cm, sel, mode);\n      cm.setSelections(cmSel.ranges, cmSel.primary);\n    }\n    function makeCmSelection(cm, sel, mode, exclusive) {\n      var head = copyCursor(sel.head);\n      var anchor = copyCursor(sel.anchor);\n      if (mode == 'char') {\n        var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0;\n        var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0;\n        head = offsetCursor(sel.head, 0, headOffset);\n        anchor = offsetCursor(sel.anchor, 0, anchorOffset);\n        return {\n          ranges: [{anchor: anchor, head: head}],\n          primary: 0\n        };\n      } else if (mode == 'line') {\n        if (!cursorIsBefore(sel.head, sel.anchor)) {\n          anchor.ch = 0;\n\n          var lastLine = cm.lastLine();\n          if (head.line > lastLine) {\n            head.line = lastLine;\n          }\n          head.ch = lineLength(cm, head.line);\n        } else {\n          head.ch = 0;\n          anchor.ch = lineLength(cm, anchor.line);\n        }\n        return {\n          ranges: [{anchor: anchor, head: head}],\n          primary: 0\n        };\n      } else if (mode == 'block') {\n        var top = Math.min(anchor.line, head.line),\n            fromCh = anchor.ch,\n            bottom = Math.max(anchor.line, head.line),\n            toCh = head.ch;\n        if (fromCh < toCh) { toCh += 1 }\n        else { fromCh += 1 };\n        var height = bottom - top + 1;\n        var primary = head.line == top ? 0 : height - 1;\n        var ranges = [];\n        for (var i = 0; i < height; i++) {\n          ranges.push({\n            anchor: new Pos(top + i, fromCh),\n            head: new Pos(top + i, toCh)\n          });\n        }\n        return {\n          ranges: ranges,\n          primary: primary\n        };\n      }\n    }\n    function getHead(cm) {\n      var cur = cm.getCursor('head');\n      if (cm.getSelection().length == 1) {\n        // Small corner case when only 1 character is selected. The \"real\"\n        // head is the left of head and anchor.\n        cur = cursorMin(cur, cm.getCursor('anchor'));\n      }\n      return cur;\n    }\n\n    /**\n     * If moveHead is set to false, the CodeMirror selection will not be\n     * touched. The caller assumes the responsibility of putting the cursor\n    * in the right place.\n     */\n    function exitVisualMode(cm, moveHead) {\n      var vim = cm.state.vim;\n      if (moveHead !== false) {\n        cm.setCursor(clipCursorToContent(cm, vim.sel.head));\n      }\n      updateLastSelection(cm, vim);\n      vim.visualMode = false;\n      vim.visualLine = false;\n      vim.visualBlock = false;\n      if (!vim.insertMode) CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n    }\n\n    // Remove any trailing newlines from the selection. For\n    // example, with the caret at the start of the last word on the line,\n    // 'dw' should word, but not the newline, while 'w' should advance the\n    // caret to the first character of the next line.\n    function clipToLine(cm, curStart, curEnd) {\n      var selection = cm.getRange(curStart, curEnd);\n      // Only clip if the selection ends with trailing newline + whitespace\n      if (/\\n\\s*$/.test(selection)) {\n        var lines = selection.split('\\n');\n        // We know this is all whitespace.\n        lines.pop();\n\n        // Cases:\n        // 1. Last word is an empty line - do not clip the trailing '\\n'\n        // 2. Last word is not an empty line - clip the trailing '\\n'\n        var line;\n        // Find the line containing the last word, and clip all whitespace up\n        // to it.\n        for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) {\n          curEnd.line--;\n          curEnd.ch = 0;\n        }\n        // If the last word is not an empty line, clip an additional newline\n        if (line) {\n          curEnd.line--;\n          curEnd.ch = lineLength(cm, curEnd.line);\n        } else {\n          curEnd.ch = 0;\n        }\n      }\n    }\n\n    // Expand the selection to line ends.\n    function expandSelectionToLine(_cm, curStart, curEnd) {\n      curStart.ch = 0;\n      curEnd.ch = 0;\n      curEnd.line++;\n    }\n\n    function findFirstNonWhiteSpaceCharacter(text) {\n      if (!text) {\n        return 0;\n      }\n      var firstNonWS = text.search(/\\S/);\n      return firstNonWS == -1 ? text.length : firstNonWS;\n    }\n\n    function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) {\n      var cur = getHead(cm);\n      var line = cm.getLine(cur.line);\n      var idx = cur.ch;\n\n      // Seek to first word or non-whitespace character, depending on if\n      // noSymbol is true.\n      var test = noSymbol ? wordCharTest[0] : bigWordCharTest [0];\n      while (!test(line.charAt(idx))) {\n        idx++;\n        if (idx >= line.length) { return null; }\n      }\n\n      if (bigWord) {\n        test = bigWordCharTest[0];\n      } else {\n        test = wordCharTest[0];\n        if (!test(line.charAt(idx))) {\n          test = wordCharTest[1];\n        }\n      }\n\n      var end = idx, start = idx;\n      while (test(line.charAt(end)) && end < line.length) { end++; }\n      while (test(line.charAt(start)) && start >= 0) { start--; }\n      start++;\n\n      if (inclusive) {\n        // If present, include all whitespace after word.\n        // Otherwise, include all whitespace before word, except indentation.\n        var wordEnd = end;\n        while (/\\s/.test(line.charAt(end)) && end < line.length) { end++; }\n        if (wordEnd == end) {\n          var wordStart = start;\n          while (/\\s/.test(line.charAt(start - 1)) && start > 0) { start--; }\n          if (!start) { start = wordStart; }\n        }\n      }\n      return { start: new Pos(cur.line, start), end: new Pos(cur.line, end) };\n    }\n\n    /**\n     * Depends on the following:\n     *\n     * - editor mode should be htmlmixedmode / xml\n     * - mode/xml/xml.js should be loaded\n     * - addon/fold/xml-fold.js should be loaded\n     *\n     * If any of the above requirements are not true, this function noops.\n     *\n     * This is _NOT_ a 100% accurate implementation of vim tag text objects.\n     * The following caveats apply (based off cursory testing, I'm sure there\n     * are other discrepancies):\n     *\n     * - Does not work inside comments:\n     *   ```\n     *   <!-- <div>broken</div> -->\n     *   ```\n     * - Does not work when tags have different cases:\n     *   ```\n     *   <div>broken</DIV>\n     *   ```\n     * - Does not work when cursor is inside a broken tag:\n     *   ```\n     *   <div><brok><en></div>\n     *   ```\n     */\n    function expandTagUnderCursor(cm, head, inclusive) {\n      var cur = head;\n      if (!CodeMirror.findMatchingTag || !CodeMirror.findEnclosingTag) {\n        return { start: cur, end: cur };\n      }\n\n      var tags = CodeMirror.findMatchingTag(cm, head) || CodeMirror.findEnclosingTag(cm, head);\n      if (!tags || !tags.open || !tags.close) {\n        return { start: cur, end: cur };\n      }\n\n      if (inclusive) {\n        return { start: tags.open.from, end: tags.close.to };\n      }\n      return { start: tags.open.to, end: tags.close.from };\n    }\n\n    function recordJumpPosition(cm, oldCur, newCur) {\n      if (!cursorEqual(oldCur, newCur)) {\n        vimGlobalState.jumpList.add(cm, oldCur, newCur);\n      }\n    }\n\n    function recordLastCharacterSearch(increment, args) {\n        vimGlobalState.lastCharacterSearch.increment = increment;\n        vimGlobalState.lastCharacterSearch.forward = args.forward;\n        vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter;\n    }\n\n    var symbolToMode = {\n        '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket',\n        '[': 'section', ']': 'section',\n        '*': 'comment', '/': 'comment',\n        'm': 'method', 'M': 'method',\n        '#': 'preprocess'\n    };\n    var findSymbolModes = {\n      bracket: {\n        isComplete: function(state) {\n          if (state.nextCh === state.symb) {\n            state.depth++;\n            if (state.depth >= 1)return true;\n          } else if (state.nextCh === state.reverseSymb) {\n            state.depth--;\n          }\n          return false;\n        }\n      },\n      section: {\n        init: function(state) {\n          state.curMoveThrough = true;\n          state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}';\n        },\n        isComplete: function(state) {\n          return state.index === 0 && state.nextCh === state.symb;\n        }\n      },\n      comment: {\n        isComplete: function(state) {\n          var found = state.lastCh === '*' && state.nextCh === '/';\n          state.lastCh = state.nextCh;\n          return found;\n        }\n      },\n      // TODO: The original Vim implementation only operates on level 1 and 2.\n      // The current implementation doesn't check for code block level and\n      // therefore it operates on any levels.\n      method: {\n        init: function(state) {\n          state.symb = (state.symb === 'm' ? '{' : '}');\n          state.reverseSymb = state.symb === '{' ? '}' : '{';\n        },\n        isComplete: function(state) {\n          if (state.nextCh === state.symb)return true;\n          return false;\n        }\n      },\n      preprocess: {\n        init: function(state) {\n          state.index = 0;\n        },\n        isComplete: function(state) {\n          if (state.nextCh === '#') {\n            var token = state.lineText.match(/^#(\\w+)/)[1];\n            if (token === 'endif') {\n              if (state.forward && state.depth === 0) {\n                return true;\n              }\n              state.depth++;\n            } else if (token === 'if') {\n              if (!state.forward && state.depth === 0) {\n                return true;\n              }\n              state.depth--;\n            }\n            if (token === 'else' && state.depth === 0)return true;\n          }\n          return false;\n        }\n      }\n    };\n    function findSymbol(cm, repeat, forward, symb) {\n      var cur = copyCursor(cm.getCursor());\n      var increment = forward ? 1 : -1;\n      var endLine = forward ? cm.lineCount() : -1;\n      var curCh = cur.ch;\n      var line = cur.line;\n      var lineText = cm.getLine(line);\n      var state = {\n        lineText: lineText,\n        nextCh: lineText.charAt(curCh),\n        lastCh: null,\n        index: curCh,\n        symb: symb,\n        reverseSymb: (forward ?  { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb],\n        forward: forward,\n        depth: 0,\n        curMoveThrough: false\n      };\n      var mode = symbolToMode[symb];\n      if (!mode)return cur;\n      var init = findSymbolModes[mode].init;\n      var isComplete = findSymbolModes[mode].isComplete;\n      if (init) { init(state); }\n      while (line !== endLine && repeat) {\n        state.index += increment;\n        state.nextCh = state.lineText.charAt(state.index);\n        if (!state.nextCh) {\n          line += increment;\n          state.lineText = cm.getLine(line) || '';\n          if (increment > 0) {\n            state.index = 0;\n          } else {\n            var lineLen = state.lineText.length;\n            state.index = (lineLen > 0) ? (lineLen-1) : 0;\n          }\n          state.nextCh = state.lineText.charAt(state.index);\n        }\n        if (isComplete(state)) {\n          cur.line = line;\n          cur.ch = state.index;\n          repeat--;\n        }\n      }\n      if (state.nextCh || state.curMoveThrough) {\n        return new Pos(line, state.index);\n      }\n      return cur;\n    }\n\n    /*\n     * Returns the boundaries of the next word. If the cursor in the middle of\n     * the word, then returns the boundaries of the current word, starting at\n     * the cursor. If the cursor is at the start/end of a word, and we are going\n     * forward/backward, respectively, find the boundaries of the next word.\n     *\n     * @param {CodeMirror} cm CodeMirror object.\n     * @param {Cursor} cur The cursor position.\n     * @param {boolean} forward True to search forward. False to search\n     *     backward.\n     * @param {boolean} bigWord True if punctuation count as part of the word.\n     *     False if only [a-zA-Z0-9] characters count as part of the word.\n     * @param {boolean} emptyLineIsWord True if empty lines should be treated\n     *     as words.\n     * @return {Object{from:number, to:number, line: number}} The boundaries of\n     *     the word, or null if there are no more words.\n     */\n    function findWord(cm, cur, forward, bigWord, emptyLineIsWord) {\n      var lineNum = cur.line;\n      var pos = cur.ch;\n      var line = cm.getLine(lineNum);\n      var dir = forward ? 1 : -1;\n      var charTests = bigWord ? bigWordCharTest: wordCharTest;\n\n      if (emptyLineIsWord && line == '') {\n        lineNum += dir;\n        line = cm.getLine(lineNum);\n        if (!isLine(cm, lineNum)) {\n          return null;\n        }\n        pos = (forward) ? 0 : line.length;\n      }\n\n      while (true) {\n        if (emptyLineIsWord && line == '') {\n          return { from: 0, to: 0, line: lineNum };\n        }\n        var stop = (dir > 0) ? line.length : -1;\n        var wordStart = stop, wordEnd = stop;\n        // Find bounds of next word.\n        while (pos != stop) {\n          var foundWord = false;\n          for (var i = 0; i < charTests.length && !foundWord; ++i) {\n            if (charTests[i](line.charAt(pos))) {\n              wordStart = pos;\n              // Advance to end of word.\n              while (pos != stop && charTests[i](line.charAt(pos))) {\n                pos += dir;\n              }\n              wordEnd = pos;\n              foundWord = wordStart != wordEnd;\n              if (wordStart == cur.ch && lineNum == cur.line &&\n                  wordEnd == wordStart + dir) {\n                // We started at the end of a word. Find the next one.\n                continue;\n              } else {\n                return {\n                  from: Math.min(wordStart, wordEnd + 1),\n                  to: Math.max(wordStart, wordEnd),\n                  line: lineNum };\n              }\n            }\n          }\n          if (!foundWord) {\n            pos += dir;\n          }\n        }\n        // Advance to next/prev line.\n        lineNum += dir;\n        if (!isLine(cm, lineNum)) {\n          return null;\n        }\n        line = cm.getLine(lineNum);\n        pos = (dir > 0) ? 0 : line.length;\n      }\n    }\n\n    /**\n     * @param {CodeMirror} cm CodeMirror object.\n     * @param {Pos} cur The position to start from.\n     * @param {int} repeat Number of words to move past.\n     * @param {boolean} forward True to search forward. False to search\n     *     backward.\n     * @param {boolean} wordEnd True to move to end of word. False to move to\n     *     beginning of word.\n     * @param {boolean} bigWord True if punctuation count as part of the word.\n     *     False if only alphabet characters count as part of the word.\n     * @return {Cursor} The position the cursor should move to.\n     */\n    function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) {\n      var curStart = copyCursor(cur);\n      var words = [];\n      if (forward && !wordEnd || !forward && wordEnd) {\n        repeat++;\n      }\n      // For 'e', empty lines are not considered words, go figure.\n      var emptyLineIsWord = !(forward && wordEnd);\n      for (var i = 0; i < repeat; i++) {\n        var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord);\n        if (!word) {\n          var eodCh = lineLength(cm, cm.lastLine());\n          words.push(forward\n              ? {line: cm.lastLine(), from: eodCh, to: eodCh}\n              : {line: 0, from: 0, to: 0});\n          break;\n        }\n        words.push(word);\n        cur = new Pos(word.line, forward ? (word.to - 1) : word.from);\n      }\n      var shortCircuit = words.length != repeat;\n      var firstWord = words[0];\n      var lastWord = words.pop();\n      if (forward && !wordEnd) {\n        // w\n        if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) {\n          // We did not start in the middle of a word. Discard the extra word at the end.\n          lastWord = words.pop();\n        }\n        return new Pos(lastWord.line, lastWord.from);\n      } else if (forward && wordEnd) {\n        return new Pos(lastWord.line, lastWord.to - 1);\n      } else if (!forward && wordEnd) {\n        // ge\n        if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) {\n          // We did not start in the middle of a word. Discard the extra word at the end.\n          lastWord = words.pop();\n        }\n        return new Pos(lastWord.line, lastWord.to);\n      } else {\n        // b\n        return new Pos(lastWord.line, lastWord.from);\n      }\n    }\n\n    function moveToEol(cm, head, motionArgs, vim, keepHPos) {\n      var cur = head;\n      var retval= new Pos(cur.line + motionArgs.repeat - 1, Infinity);\n      var end=cm.clipPos(retval);\n      end.ch--;\n      if (!keepHPos) {\n        vim.lastHPos = Infinity;\n        vim.lastHSPos = cm.charCoords(end,'div').left;\n      }\n      return retval;\n    }\n\n    function moveToCharacter(cm, repeat, forward, character) {\n      var cur = cm.getCursor();\n      var start = cur.ch;\n      var idx;\n      for (var i = 0; i < repeat; i ++) {\n        var line = cm.getLine(cur.line);\n        idx = charIdxInLine(start, line, character, forward, true);\n        if (idx == -1) {\n          return null;\n        }\n        start = idx;\n      }\n      return new Pos(cm.getCursor().line, idx);\n    }\n\n    function moveToColumn(cm, repeat) {\n      // repeat is always >= 1, so repeat - 1 always corresponds\n      // to the column we want to go to.\n      var line = cm.getCursor().line;\n      return clipCursorToContent(cm, new Pos(line, repeat - 1));\n    }\n\n    function updateMark(cm, vim, markName, pos) {\n      if (!inArray(markName, validMarks)) {\n        return;\n      }\n      if (vim.marks[markName]) {\n        vim.marks[markName].clear();\n      }\n      vim.marks[markName] = cm.setBookmark(pos);\n    }\n\n    function charIdxInLine(start, line, character, forward, includeChar) {\n      // Search for char in line.\n      // motion_options: {forward, includeChar}\n      // If includeChar = true, include it too.\n      // If forward = true, search forward, else search backwards.\n      // If char is not found on this line, do nothing\n      var idx;\n      if (forward) {\n        idx = line.indexOf(character, start + 1);\n        if (idx != -1 && !includeChar) {\n          idx -= 1;\n        }\n      } else {\n        idx = line.lastIndexOf(character, start - 1);\n        if (idx != -1 && !includeChar) {\n          idx += 1;\n        }\n      }\n      return idx;\n    }\n\n    function findParagraph(cm, head, repeat, dir, inclusive) {\n      var line = head.line;\n      var min = cm.firstLine();\n      var max = cm.lastLine();\n      var start, end, i = line;\n      function isEmpty(i) { return !cm.getLine(i); }\n      function isBoundary(i, dir, any) {\n        if (any) { return isEmpty(i) != isEmpty(i + dir); }\n        return !isEmpty(i) && isEmpty(i + dir);\n      }\n      if (dir) {\n        while (min <= i && i <= max && repeat > 0) {\n          if (isBoundary(i, dir)) { repeat--; }\n          i += dir;\n        }\n        return new Pos(i, 0);\n      }\n\n      var vim = cm.state.vim;\n      if (vim.visualLine && isBoundary(line, 1, true)) {\n        var anchor = vim.sel.anchor;\n        if (isBoundary(anchor.line, -1, true)) {\n          if (!inclusive || anchor.line != line) {\n            line += 1;\n          }\n        }\n      }\n      var startState = isEmpty(line);\n      for (i = line; i <= max && repeat; i++) {\n        if (isBoundary(i, 1, true)) {\n          if (!inclusive || isEmpty(i) != startState) {\n            repeat--;\n          }\n        }\n      }\n      end = new Pos(i, 0);\n      // select boundary before paragraph for the last one\n      if (i > max && !startState) { startState = true; }\n      else { inclusive = false; }\n      for (i = line; i > min; i--) {\n        if (!inclusive || isEmpty(i) == startState || i == line) {\n          if (isBoundary(i, -1, true)) { break; }\n        }\n      }\n      start = new Pos(i, 0);\n      return { start: start, end: end };\n    }\n\n    function findSentence(cm, cur, repeat, dir) {\n\n      /*\n        Takes an index object\n        {\n          line: the line string,\n          ln: line number,\n          pos: index in line,\n          dir: direction of traversal (-1 or 1)\n        }\n        and modifies the line, ln, and pos members to represent the\n        next valid position or sets them to null if there are\n        no more valid positions.\n       */\n      function nextChar(cm, idx) {\n        if (idx.pos + idx.dir < 0 || idx.pos + idx.dir >= idx.line.length) {\n          idx.ln += idx.dir;\n          if (!isLine(cm, idx.ln)) {\n            idx.line = null;\n            idx.ln = null;\n            idx.pos = null;\n            return;\n          }\n          idx.line = cm.getLine(idx.ln);\n          idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1;\n        }\n        else {\n          idx.pos += idx.dir;\n        }\n      }\n\n      /*\n        Performs one iteration of traversal in forward direction\n        Returns an index object of the new location\n       */\n      function forward(cm, ln, pos, dir) {\n        var line = cm.getLine(ln);\n        var stop = (line === \"\");\n\n        var curr = {\n          line: line,\n          ln: ln,\n          pos: pos,\n          dir: dir,\n        }\n\n        var last_valid = {\n          ln: curr.ln,\n          pos: curr.pos,\n        }\n\n        var skip_empty_lines = (curr.line === \"\");\n\n        // Move one step to skip character we start on\n        nextChar(cm, curr);\n\n        while (curr.line !== null) {\n          last_valid.ln = curr.ln;\n          last_valid.pos = curr.pos;\n\n          if (curr.line === \"\" && !skip_empty_lines) {\n            return { ln: curr.ln, pos: curr.pos, };\n          }\n          else if (stop && curr.line !== \"\" && !isWhiteSpaceString(curr.line[curr.pos])) {\n            return { ln: curr.ln, pos: curr.pos, };\n          }\n          else if (isEndOfSentenceSymbol(curr.line[curr.pos])\n            && !stop\n            && (curr.pos === curr.line.length - 1\n              || isWhiteSpaceString(curr.line[curr.pos + 1]))) {\n            stop = true;\n          }\n\n          nextChar(cm, curr);\n        }\n\n        /*\n          Set the position to the last non whitespace character on the last\n          valid line in the case that we reach the end of the document.\n        */\n        var line = cm.getLine(last_valid.ln);\n        last_valid.pos = 0;\n        for(var i = line.length - 1; i >= 0; --i) {\n          if (!isWhiteSpaceString(line[i])) {\n            last_valid.pos = i;\n            break;\n          }\n        }\n\n        return last_valid;\n\n      }\n\n      /*\n        Performs one iteration of traversal in reverse direction\n        Returns an index object of the new location\n       */\n      function reverse(cm, ln, pos, dir) {\n        var line = cm.getLine(ln);\n\n        var curr = {\n          line: line,\n          ln: ln,\n          pos: pos,\n          dir: dir,\n        }\n\n        var last_valid = {\n          ln: curr.ln,\n          pos: null,\n        };\n\n        var skip_empty_lines = (curr.line === \"\");\n\n        // Move one step to skip character we start on\n        nextChar(cm, curr);\n\n        while (curr.line !== null) {\n\n          if (curr.line === \"\" && !skip_empty_lines) {\n            if (last_valid.pos !== null) {\n              return last_valid;\n            }\n            else {\n              return { ln: curr.ln, pos: curr.pos };\n            }\n          }\n          else if (isEndOfSentenceSymbol(curr.line[curr.pos])\n              && last_valid.pos !== null\n              && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) {\n            return last_valid;\n          }\n          else if (curr.line !== \"\" && !isWhiteSpaceString(curr.line[curr.pos])) {\n            skip_empty_lines = false;\n            last_valid = { ln: curr.ln, pos: curr.pos }\n          }\n\n          nextChar(cm, curr);\n        }\n\n        /*\n          Set the position to the first non whitespace character on the last\n          valid line in the case that we reach the beginning of the document.\n        */\n        var line = cm.getLine(last_valid.ln);\n        last_valid.pos = 0;\n        for(var i = 0; i < line.length; ++i) {\n          if (!isWhiteSpaceString(line[i])) {\n            last_valid.pos = i;\n            break;\n          }\n        }\n        return last_valid;\n      }\n\n      var curr_index = {\n        ln: cur.line,\n        pos: cur.ch,\n      };\n\n      while (repeat > 0) {\n        if (dir < 0) {\n          curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir);\n        }\n        else {\n          curr_index = forward(cm, curr_index.ln, curr_index.pos, dir);\n        }\n        repeat--;\n      }\n\n      return new Pos(curr_index.ln, curr_index.pos);\n    }\n\n    // TODO: perhaps this finagling of start and end positions belongs\n    // in codemirror/replaceRange?\n    function selectCompanionObject(cm, head, symb, inclusive) {\n      var cur = head, start, end;\n\n      var bracketRegexp = ({\n        '(': /[()]/, ')': /[()]/,\n        '[': /[[\\]]/, ']': /[[\\]]/,\n        '{': /[{}]/, '}': /[{}]/,\n        '<': /[<>]/, '>': /[<>]/})[symb];\n      var openSym = ({\n        '(': '(', ')': '(',\n        '[': '[', ']': '[',\n        '{': '{', '}': '{',\n        '<': '<', '>': '<'})[symb];\n      var curChar = cm.getLine(cur.line).charAt(cur.ch);\n      // Due to the behavior of scanForBracket, we need to add an offset if the\n      // cursor is on a matching open bracket.\n      var offset = curChar === openSym ? 1 : 0;\n\n      start = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), -1, undefined, {'bracketRegex': bracketRegexp});\n      end = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), 1, undefined, {'bracketRegex': bracketRegexp});\n\n      if (!start || !end) {\n        return { start: cur, end: cur };\n      }\n\n      start = start.pos;\n      end = end.pos;\n\n      if ((start.line == end.line && start.ch > end.ch)\n          || (start.line > end.line)) {\n        var tmp = start;\n        start = end;\n        end = tmp;\n      }\n\n      if (inclusive) {\n        end.ch += 1;\n      } else {\n        start.ch += 1;\n      }\n\n      return { start: start, end: end };\n    }\n\n    // Takes in a symbol and a cursor and tries to simulate text objects that\n    // have identical opening and closing symbols\n    // TODO support across multiple lines\n    function findBeginningAndEnd(cm, head, symb, inclusive) {\n      var cur = copyCursor(head);\n      var line = cm.getLine(cur.line);\n      var chars = line.split('');\n      var start, end, i, len;\n      var firstIndex = chars.indexOf(symb);\n\n      // the decision tree is to always look backwards for the beginning first,\n      // but if the cursor is in front of the first instance of the symb,\n      // then move the cursor forward\n      if (cur.ch < firstIndex) {\n        cur.ch = firstIndex;\n        // Why is this line even here???\n        // cm.setCursor(cur.line, firstIndex+1);\n      }\n      // otherwise if the cursor is currently on the closing symbol\n      else if (firstIndex < cur.ch && chars[cur.ch] == symb) {\n        end = cur.ch; // assign end to the current cursor\n        --cur.ch; // make sure to look backwards\n      }\n\n      // if we're currently on the symbol, we've got a start\n      if (chars[cur.ch] == symb && !end) {\n        start = cur.ch + 1; // assign start to ahead of the cursor\n      } else {\n        // go backwards to find the start\n        for (i = cur.ch; i > -1 && !start; i--) {\n          if (chars[i] == symb) {\n            start = i + 1;\n          }\n        }\n      }\n\n      // look forwards for the end symbol\n      if (start && !end) {\n        for (i = start, len = chars.length; i < len && !end; i++) {\n          if (chars[i] == symb) {\n            end = i;\n          }\n        }\n      }\n\n      // nothing found\n      if (!start || !end) {\n        return { start: cur, end: cur };\n      }\n\n      // include the symbols\n      if (inclusive) {\n        --start; ++end;\n      }\n\n      return {\n        start: new Pos(cur.line, start),\n        end: new Pos(cur.line, end)\n      };\n    }\n\n    // Search functions\n    defineOption('pcre', true, 'boolean');\n    function SearchState() {}\n    SearchState.prototype = {\n      getQuery: function() {\n        return vimGlobalState.query;\n      },\n      setQuery: function(query) {\n        vimGlobalState.query = query;\n      },\n      getOverlay: function() {\n        return this.searchOverlay;\n      },\n      setOverlay: function(overlay) {\n        this.searchOverlay = overlay;\n      },\n      isReversed: function() {\n        return vimGlobalState.isReversed;\n      },\n      setReversed: function(reversed) {\n        vimGlobalState.isReversed = reversed;\n      },\n      getScrollbarAnnotate: function() {\n        return this.annotate;\n      },\n      setScrollbarAnnotate: function(annotate) {\n        this.annotate = annotate;\n      }\n    };\n    function getSearchState(cm) {\n      var vim = cm.state.vim;\n      return vim.searchState_ || (vim.searchState_ = new SearchState());\n    }\n    function splitBySlash(argString) {\n      return splitBySeparator(argString, '/');\n    }\n\n    function findUnescapedSlashes(argString) {\n      return findUnescapedSeparators(argString, '/');\n    }\n\n    function splitBySeparator(argString, separator) {\n      var slashes = findUnescapedSeparators(argString, separator) || [];\n      if (!slashes.length) return [];\n      var tokens = [];\n      // in case of strings like foo/bar\n      if (slashes[0] !== 0) return;\n      for (var i = 0; i < slashes.length; i++) {\n        if (typeof slashes[i] == 'number')\n          tokens.push(argString.substring(slashes[i] + 1, slashes[i+1]));\n      }\n      return tokens;\n    }\n\n    function findUnescapedSeparators(str, separator) {\n      if (!separator)\n        separator = '/';\n\n      var escapeNextChar = false;\n      var slashes = [];\n      for (var i = 0; i < str.length; i++) {\n        var c = str.charAt(i);\n        if (!escapeNextChar && c == separator) {\n          slashes.push(i);\n        }\n        escapeNextChar = !escapeNextChar && (c == '\\\\');\n      }\n      return slashes;\n    }\n\n    // Translates a search string from ex (vim) syntax into javascript form.\n    function translateRegex(str) {\n      // When these match, add a '\\' if unescaped or remove one if escaped.\n      var specials = '|(){';\n      // Remove, but never add, a '\\' for these.\n      var unescape = '}';\n      var escapeNextChar = false;\n      var out = [];\n      for (var i = -1; i < str.length; i++) {\n        var c = str.charAt(i) || '';\n        var n = str.charAt(i+1) || '';\n        var specialComesNext = (n && specials.indexOf(n) != -1);\n        if (escapeNextChar) {\n          if (c !== '\\\\' || !specialComesNext) {\n            out.push(c);\n          }\n          escapeNextChar = false;\n        } else {\n          if (c === '\\\\') {\n            escapeNextChar = true;\n            // Treat the unescape list as special for removing, but not adding '\\'.\n            if (n && unescape.indexOf(n) != -1) {\n              specialComesNext = true;\n            }\n            // Not passing this test means removing a '\\'.\n            if (!specialComesNext || n === '\\\\') {\n              out.push(c);\n            }\n          } else {\n            out.push(c);\n            if (specialComesNext && n !== '\\\\') {\n              out.push('\\\\');\n            }\n          }\n        }\n      }\n      return out.join('');\n    }\n\n    // Translates the replace part of a search and replace from ex (vim) syntax into\n    // javascript form.  Similar to translateRegex, but additionally fixes back references\n    // (translates '\\[0..9]' to '$[0..9]') and follows different rules for escaping '$'.\n    var charUnescapes = {'\\\\n': '\\n', '\\\\r': '\\r', '\\\\t': '\\t'};\n    function translateRegexReplace(str) {\n      var escapeNextChar = false;\n      var out = [];\n      for (var i = -1; i < str.length; i++) {\n        var c = str.charAt(i) || '';\n        var n = str.charAt(i+1) || '';\n        if (charUnescapes[c + n]) {\n          out.push(charUnescapes[c+n]);\n          i++;\n        } else if (escapeNextChar) {\n          // At any point in the loop, escapeNextChar is true if the previous\n          // character was a '\\' and was not escaped.\n          out.push(c);\n          escapeNextChar = false;\n        } else {\n          if (c === '\\\\') {\n            escapeNextChar = true;\n            if ((isNumber(n) || n === '$')) {\n              out.push('$');\n            } else if (n !== '/' && n !== '\\\\') {\n              out.push('\\\\');\n            }\n          } else {\n            if (c === '$') {\n              out.push('$');\n            }\n            out.push(c);\n            if (n === '/') {\n              out.push('\\\\');\n            }\n          }\n        }\n      }\n      return out.join('');\n    }\n\n    // Unescape \\ and / in the replace part, for PCRE mode.\n    var unescapes = {'\\\\/': '/', '\\\\\\\\': '\\\\', '\\\\n': '\\n', '\\\\r': '\\r', '\\\\t': '\\t', '\\\\&':'&'};\n    function unescapeRegexReplace(str) {\n      var stream = new CodeMirror.StringStream(str);\n      var output = [];\n      while (!stream.eol()) {\n        // Search for \\.\n        while (stream.peek() && stream.peek() != '\\\\') {\n          output.push(stream.next());\n        }\n        var matched = false;\n        for (var matcher in unescapes) {\n          if (stream.match(matcher, true)) {\n            matched = true;\n            output.push(unescapes[matcher]);\n            break;\n          }\n        }\n        if (!matched) {\n          // Don't change anything\n          output.push(stream.next());\n        }\n      }\n      return output.join('');\n    }\n\n    /**\n     * Extract the regular expression from the query and return a Regexp object.\n     * Returns null if the query is blank.\n     * If ignoreCase is passed in, the Regexp object will have the 'i' flag set.\n     * If smartCase is passed in, and the query contains upper case letters,\n     *   then ignoreCase is overridden, and the 'i' flag will not be set.\n     * If the query contains the /i in the flag part of the regular expression,\n     *   then both ignoreCase and smartCase are ignored, and 'i' will be passed\n     *   through to the Regex object.\n     */\n    function parseQuery(query, ignoreCase, smartCase) {\n      // First update the last search register\n      var lastSearchRegister = vimGlobalState.registerController.getRegister('/');\n      lastSearchRegister.setText(query);\n      // Check if the query is already a regex.\n      if (query instanceof RegExp) { return query; }\n      // First try to extract regex + flags from the input. If no flags found,\n      // extract just the regex. IE does not accept flags directly defined in\n      // the regex string in the form /regex/flags\n      var slashes = findUnescapedSlashes(query);\n      var regexPart;\n      var forceIgnoreCase;\n      if (!slashes.length) {\n        // Query looks like 'regexp'\n        regexPart = query;\n      } else {\n        // Query looks like 'regexp/...'\n        regexPart = query.substring(0, slashes[0]);\n        var flagsPart = query.substring(slashes[0]);\n        forceIgnoreCase = (flagsPart.indexOf('i') != -1);\n      }\n      if (!regexPart) {\n        return null;\n      }\n      if (!getOption('pcre')) {\n        regexPart = translateRegex(regexPart);\n      }\n      if (smartCase) {\n        ignoreCase = (/^[^A-Z]*$/).test(regexPart);\n      }\n      var regexp = new RegExp(regexPart,\n          (ignoreCase || forceIgnoreCase) ? 'im' : 'm');\n      return regexp;\n    }\n\n    /**\n     * dom - Document Object Manipulator\n     * Usage:\n     *   dom('<tag>'|<node>[, ...{<attributes>|<$styles>}|<child-node>|'<text>'])\n     * Examples:\n     *   dom('div', {id:'xyz'}, dom('p', 'CM rocks!', {$color:'red'}))\n     *   dom(document.head, dom('script', 'alert(\"hello!\")'))\n     * Not supported:\n     *   dom('p', ['arrays are objects'], Error('objects specify attributes'))\n     */\n    function dom(n) {\n      if (typeof n === 'string') n = document.createElement(n);\n      for (var a, i = 1; i < arguments.length; i++) {\n        if (!(a = arguments[i])) continue;\n        if (typeof a !== 'object') a = document.createTextNode(a);\n        if (a.nodeType) n.appendChild(a);\n        else for (var key in a) {\n          if (!Object.prototype.hasOwnProperty.call(a, key)) continue;\n          if (key[0] === '$') n.style[key.slice(1)] = a[key];\n          else n.setAttribute(key, a[key]);\n        }\n      }\n      return n;\n    }\n\n    function showConfirm(cm, template) {\n      var pre = dom('pre', {$color: 'red', class: 'cm-vim-message'}, template);\n      if (cm.openNotification) {\n        cm.openNotification(pre, {bottom: true, duration: 5000});\n      } else {\n        alert(pre.innerText);\n      }\n    }\n\n    function makePrompt(prefix, desc) {\n      return dom(document.createDocumentFragment(),\n               dom('span', {$fontFamily: 'monospace', $whiteSpace: 'pre'},\n                 prefix,\n                 dom('input', {type: 'text', autocorrect: 'off',\n                               autocapitalize: 'off', spellcheck: 'false'})),\n               desc && dom('span', {$color: '#888'}, desc));\n    }\n\n    function showPrompt(cm, options) {\n      var template = makePrompt(options.prefix, options.desc);\n      if (cm.openDialog) {\n        cm.openDialog(template, options.onClose, {\n          onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp,\n          bottom: true, selectValueOnOpen: false, value: options.value\n        });\n      }\n      else {\n        var shortText = '';\n        if (typeof options.prefix != \"string\" && options.prefix) shortText += options.prefix.textContent;\n        if (options.desc) shortText += \" \" + options.desc;\n        options.onClose(prompt(shortText, ''));\n      }\n    }\n\n    function regexEqual(r1, r2) {\n      if (r1 instanceof RegExp && r2 instanceof RegExp) {\n          var props = ['global', 'multiline', 'ignoreCase', 'source'];\n          for (var i = 0; i < props.length; i++) {\n              var prop = props[i];\n              if (r1[prop] !== r2[prop]) {\n                  return false;\n              }\n          }\n          return true;\n      }\n      return false;\n    }\n    // Returns true if the query is valid.\n    function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) {\n      if (!rawQuery) {\n        return;\n      }\n      var state = getSearchState(cm);\n      var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase);\n      if (!query) {\n        return;\n      }\n      highlightSearchMatches(cm, query);\n      if (regexEqual(query, state.getQuery())) {\n        return query;\n      }\n      state.setQuery(query);\n      return query;\n    }\n    function searchOverlay(query) {\n      if (query.source.charAt(0) == '^') {\n        var matchSol = true;\n      }\n      return {\n        token: function(stream) {\n          if (matchSol && !stream.sol()) {\n            stream.skipToEnd();\n            return;\n          }\n          var match = stream.match(query, false);\n          if (match) {\n            if (match[0].length == 0) {\n              // Matched empty string, skip to next.\n              stream.next();\n              return 'searching';\n            }\n            if (!stream.sol()) {\n              // Backtrack 1 to match \\b\n              stream.backUp(1);\n              if (!query.exec(stream.next() + match[0])) {\n                stream.next();\n                return null;\n              }\n            }\n            stream.match(query);\n            return 'searching';\n          }\n          while (!stream.eol()) {\n            stream.next();\n            if (stream.match(query, false)) break;\n          }\n        },\n        query: query\n      };\n    }\n    var highlightTimeout = 0;\n    function highlightSearchMatches(cm, query) {\n      clearTimeout(highlightTimeout);\n      highlightTimeout = setTimeout(function() {\n        if (!cm.state.vim) return;\n        var searchState = getSearchState(cm);\n        var overlay = searchState.getOverlay();\n        if (!overlay || query != overlay.query) {\n          if (overlay) {\n            cm.removeOverlay(overlay);\n          }\n          overlay = searchOverlay(query);\n          cm.addOverlay(overlay);\n          if (cm.showMatchesOnScrollbar) {\n            if (searchState.getScrollbarAnnotate()) {\n              searchState.getScrollbarAnnotate().clear();\n            }\n            searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query));\n          }\n          searchState.setOverlay(overlay);\n        }\n      }, 50);\n    }\n    function findNext(cm, prev, query, repeat) {\n      if (repeat === undefined) { repeat = 1; }\n      return cm.operation(function() {\n        var pos = cm.getCursor();\n        var cursor = cm.getSearchCursor(query, pos);\n        for (var i = 0; i < repeat; i++) {\n          var found = cursor.find(prev);\n          if (i == 0 && found && cursorEqual(cursor.from(), pos)) {\n            var lastEndPos = prev ? cursor.from() : cursor.to();\n            found = cursor.find(prev);\n            if (found && !found[0] && cursorEqual(cursor.from(), lastEndPos)) {\n              if (cm.getLine(lastEndPos.line).length == lastEndPos.ch)\n                found = cursor.find(prev);\n            }\n          }\n          if (!found) {\n            // SearchCursor may have returned null because it hit EOF, wrap\n            // around and try again.\n            cursor = cm.getSearchCursor(query,\n                (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) );\n            if (!cursor.find(prev)) {\n              return;\n            }\n          }\n        }\n        return cursor.from();\n      });\n    }\n    /**\n     * Pretty much the same as `findNext`, except for the following differences:\n     *\n     * 1. Before starting the search, move to the previous search. This way if our cursor is\n     * already inside a match, we should return the current match.\n     * 2. Rather than only returning the cursor's from, we return the cursor's from and to as a tuple.\n     */\n    function findNextFromAndToInclusive(cm, prev, query, repeat, vim) {\n      if (repeat === undefined) { repeat = 1; }\n      return cm.operation(function() {\n        var pos = cm.getCursor();\n        var cursor = cm.getSearchCursor(query, pos);\n\n        // Go back one result to ensure that if the cursor is currently a match, we keep it.\n        var found = cursor.find(!prev);\n\n        // If we haven't moved, go back one more (similar to if i==0 logic in findNext).\n        if (!vim.visualMode && found && cursorEqual(cursor.from(), pos)) {\n          cursor.find(!prev);\n        }\n\n        for (var i = 0; i < repeat; i++) {\n          found = cursor.find(prev);\n          if (!found) {\n            // SearchCursor may have returned null because it hit EOF, wrap\n            // around and try again.\n            cursor = cm.getSearchCursor(query,\n                (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) );\n            if (!cursor.find(prev)) {\n              return;\n            }\n          }\n        }\n        return [cursor.from(), cursor.to()];\n      });\n    }\n    function clearSearchHighlight(cm) {\n      var state = getSearchState(cm);\n      cm.removeOverlay(getSearchState(cm).getOverlay());\n      state.setOverlay(null);\n      if (state.getScrollbarAnnotate()) {\n        state.getScrollbarAnnotate().clear();\n        state.setScrollbarAnnotate(null);\n      }\n    }\n    /**\n     * Check if pos is in the specified range, INCLUSIVE.\n     * Range can be specified with 1 or 2 arguments.\n     * If the first range argument is an array, treat it as an array of line\n     * numbers. Match pos against any of the lines.\n     * If the first range argument is a number,\n     *   if there is only 1 range argument, check if pos has the same line\n     *       number\n     *   if there are 2 range arguments, then check if pos is in between the two\n     *       range arguments.\n     */\n    function isInRange(pos, start, end) {\n      if (typeof pos != 'number') {\n        // Assume it is a cursor position. Get the line number.\n        pos = pos.line;\n      }\n      if (start instanceof Array) {\n        return inArray(pos, start);\n      } else {\n        if (typeof end == 'number') {\n          return (pos >= start && pos <= end);\n        } else {\n          return pos == start;\n        }\n      }\n    }\n    function getUserVisibleLines(cm) {\n      var scrollInfo = cm.getScrollInfo();\n      var occludeToleranceTop = 6;\n      var occludeToleranceBottom = 10;\n      var from = cm.coordsChar({left:0, top: occludeToleranceTop + scrollInfo.top}, 'local');\n      var bottomY = scrollInfo.clientHeight - occludeToleranceBottom + scrollInfo.top;\n      var to = cm.coordsChar({left:0, top: bottomY}, 'local');\n      return {top: from.line, bottom: to.line};\n    }\n\n    function getMarkPos(cm, vim, markName) {\n      if (markName == '\\'' || markName == '`') {\n        return vimGlobalState.jumpList.find(cm, -1) || new Pos(0, 0);\n      } else if (markName == '.') {\n        return getLastEditPos(cm);\n      }\n\n      var mark = vim.marks[markName];\n      return mark && mark.find();\n    }\n\n    function getLastEditPos(cm) {\n      var done = cm.doc.history.done;\n      for (var i = done.length; i--;) {\n        if (done[i].changes) {\n          return copyCursor(done[i].changes[0].to);\n        }\n      }\n    }\n\n    var ExCommandDispatcher = function() {\n      this.buildCommandMap_();\n    };\n    ExCommandDispatcher.prototype = {\n      processCommand: function(cm, input, opt_params) {\n        var that = this;\n        cm.operation(function () {\n          cm.curOp.isVimOp = true;\n          that._processCommand(cm, input, opt_params);\n        });\n      },\n      _processCommand: function(cm, input, opt_params) {\n        var vim = cm.state.vim;\n        var commandHistoryRegister = vimGlobalState.registerController.getRegister(':');\n        var previousCommand = commandHistoryRegister.toString();\n        if (vim.visualMode) {\n          exitVisualMode(cm);\n        }\n        var inputStream = new CodeMirror.StringStream(input);\n        // update \": with the latest command whether valid or invalid\n        commandHistoryRegister.setText(input);\n        var params = opt_params || {};\n        params.input = input;\n        try {\n          this.parseInput_(cm, inputStream, params);\n        } catch(e) {\n          showConfirm(cm, e.toString());\n          throw e;\n        }\n        var command;\n        var commandName;\n        if (!params.commandName) {\n          // If only a line range is defined, move to the line.\n          if (params.line !== undefined) {\n            commandName = 'move';\n          }\n        } else {\n          command = this.matchCommand_(params.commandName);\n          if (command) {\n            commandName = command.name;\n            if (command.excludeFromCommandHistory) {\n              commandHistoryRegister.setText(previousCommand);\n            }\n            this.parseCommandArgs_(inputStream, params, command);\n            if (command.type == 'exToKey') {\n              // Handle Ex to Key mapping.\n              for (var i = 0; i < command.toKeys.length; i++) {\n                vimApi.handleKey(cm, command.toKeys[i], 'mapping');\n              }\n              return;\n            } else if (command.type == 'exToEx') {\n              // Handle Ex to Ex mapping.\n              this.processCommand(cm, command.toInput);\n              return;\n            }\n          }\n        }\n        if (!commandName) {\n          showConfirm(cm, 'Not an editor command \":' + input + '\"');\n          return;\n        }\n        try {\n          exCommands[commandName](cm, params);\n          // Possibly asynchronous commands (e.g. substitute, which might have a\n          // user confirmation), are responsible for calling the callback when\n          // done. All others have it taken care of for them here.\n          if ((!command || !command.possiblyAsync) && params.callback) {\n            params.callback();\n          }\n        } catch(e) {\n          showConfirm(cm, e.toString());\n          throw e;\n        }\n      },\n      parseInput_: function(cm, inputStream, result) {\n        inputStream.eatWhile(':');\n        // Parse range.\n        if (inputStream.eat('%')) {\n          result.line = cm.firstLine();\n          result.lineEnd = cm.lastLine();\n        } else {\n          result.line = this.parseLineSpec_(cm, inputStream);\n          if (result.line !== undefined && inputStream.eat(',')) {\n            result.lineEnd = this.parseLineSpec_(cm, inputStream);\n          }\n        }\n\n        // Parse command name.\n        var commandMatch = inputStream.match(/^(\\w+|!!|@@|[!#&*<=>@~])/);\n        if (commandMatch) {\n          result.commandName = commandMatch[1];\n        } else {\n          result.commandName = inputStream.match(/.*/)[0];\n        }\n\n        return result;\n      },\n      parseLineSpec_: function(cm, inputStream) {\n        var numberMatch = inputStream.match(/^(\\d+)/);\n        if (numberMatch) {\n          // Absolute line number plus offset (N+M or N-M) is probably a typo,\n          // not something the user actually wanted. (NB: vim does allow this.)\n          return parseInt(numberMatch[1], 10) - 1;\n        }\n        switch (inputStream.next()) {\n          case '.':\n            return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);\n          case '$':\n            return this.parseLineSpecOffset_(inputStream, cm.lastLine());\n          case '\\'':\n            var markName = inputStream.next();\n            var markPos = getMarkPos(cm, cm.state.vim, markName);\n            if (!markPos) throw new Error('Mark not set');\n            return this.parseLineSpecOffset_(inputStream, markPos.line);\n          case '-':\n          case '+':\n            inputStream.backUp(1);\n            // Offset is relative to current line if not otherwise specified.\n            return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);\n          default:\n            inputStream.backUp(1);\n            return undefined;\n        }\n      },\n      parseLineSpecOffset_: function(inputStream, line) {\n        var offsetMatch = inputStream.match(/^([+-])?(\\d+)/);\n        if (offsetMatch) {\n          var offset = parseInt(offsetMatch[2], 10);\n          if (offsetMatch[1] == \"-\") {\n            line -= offset;\n          } else {\n            line += offset;\n          }\n        }\n        return line;\n      },\n      parseCommandArgs_: function(inputStream, params, command) {\n        if (inputStream.eol()) {\n          return;\n        }\n        params.argString = inputStream.match(/.*/)[0];\n        // Parse command-line arguments\n        var delim = command.argDelimiter || /\\s+/;\n        var args = trim(params.argString).split(delim);\n        if (args.length && args[0]) {\n          params.args = args;\n        }\n      },\n      matchCommand_: function(commandName) {\n        // Return the command in the command map that matches the shortest\n        // prefix of the passed in command name. The match is guaranteed to be\n        // unambiguous if the defaultExCommandMap's shortNames are set up\n        // correctly. (see @code{defaultExCommandMap}).\n        for (var i = commandName.length; i > 0; i--) {\n          var prefix = commandName.substring(0, i);\n          if (this.commandMap_[prefix]) {\n            var command = this.commandMap_[prefix];\n            if (command.name.indexOf(commandName) === 0) {\n              return command;\n            }\n          }\n        }\n        return null;\n      },\n      buildCommandMap_: function() {\n        this.commandMap_ = {};\n        for (var i = 0; i < defaultExCommandMap.length; i++) {\n          var command = defaultExCommandMap[i];\n          var key = command.shortName || command.name;\n          this.commandMap_[key] = command;\n        }\n      },\n      map: function(lhs, rhs, ctx) {\n        if (lhs != ':' && lhs.charAt(0) == ':') {\n          if (ctx) { throw Error('Mode not supported for ex mappings'); }\n          var commandName = lhs.substring(1);\n          if (rhs != ':' && rhs.charAt(0) == ':') {\n            // Ex to Ex mapping\n            this.commandMap_[commandName] = {\n              name: commandName,\n              type: 'exToEx',\n              toInput: rhs.substring(1),\n              user: true\n            };\n          } else {\n            // Ex to key mapping\n            this.commandMap_[commandName] = {\n              name: commandName,\n              type: 'exToKey',\n              toKeys: rhs,\n              user: true\n            };\n          }\n        } else {\n          if (rhs != ':' && rhs.charAt(0) == ':') {\n            // Key to Ex mapping.\n            var mapping = {\n              keys: lhs,\n              type: 'keyToEx',\n              exArgs: { input: rhs.substring(1) }\n            };\n            if (ctx) { mapping.context = ctx; }\n            defaultKeymap.unshift(mapping);\n          } else {\n            // Key to key mapping\n            var mapping = {\n              keys: lhs,\n              type: 'keyToKey',\n              toKeys: rhs\n            };\n            if (ctx) { mapping.context = ctx; }\n            defaultKeymap.unshift(mapping);\n          }\n        }\n      },\n      unmap: function(lhs, ctx) {\n        if (lhs != ':' && lhs.charAt(0) == ':') {\n          // Ex to Ex or Ex to key mapping\n          if (ctx) { throw Error('Mode not supported for ex mappings'); }\n          var commandName = lhs.substring(1);\n          if (this.commandMap_[commandName] && this.commandMap_[commandName].user) {\n            delete this.commandMap_[commandName];\n            return true;\n          }\n        } else {\n          // Key to Ex or key to key mapping\n          var keys = lhs;\n          for (var i = 0; i < defaultKeymap.length; i++) {\n            if (keys == defaultKeymap[i].keys\n                && defaultKeymap[i].context === ctx) {\n              defaultKeymap.splice(i, 1);\n              return true;\n            }\n          }\n        }\n      }\n    };\n\n    var exCommands = {\n      colorscheme: function(cm, params) {\n        if (!params.args || params.args.length < 1) {\n          showConfirm(cm, cm.getOption('theme'));\n          return;\n        }\n        cm.setOption('theme', params.args[0]);\n      },\n      map: function(cm, params, ctx) {\n        var mapArgs = params.args;\n        if (!mapArgs || mapArgs.length < 2) {\n          if (cm) {\n            showConfirm(cm, 'Invalid mapping: ' + params.input);\n          }\n          return;\n        }\n        exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx);\n      },\n      imap: function(cm, params) { this.map(cm, params, 'insert'); },\n      nmap: function(cm, params) { this.map(cm, params, 'normal'); },\n      vmap: function(cm, params) { this.map(cm, params, 'visual'); },\n      unmap: function(cm, params, ctx) {\n        var mapArgs = params.args;\n        if (!mapArgs || mapArgs.length < 1 || !exCommandDispatcher.unmap(mapArgs[0], ctx)) {\n          if (cm) {\n            showConfirm(cm, 'No such mapping: ' + params.input);\n          }\n        }\n      },\n      move: function(cm, params) {\n        commandDispatcher.processCommand(cm, cm.state.vim, {\n            type: 'motion',\n            motion: 'moveToLineOrEdgeOfDocument',\n            motionArgs: { forward: false, explicitRepeat: true,\n              linewise: true },\n            repeatOverride: params.line+1});\n      },\n      set: function(cm, params) {\n        var setArgs = params.args;\n        // Options passed through to the setOption/getOption calls. May be passed in by the\n        // local/global versions of the set command\n        var setCfg = params.setCfg || {};\n        if (!setArgs || setArgs.length < 1) {\n          if (cm) {\n            showConfirm(cm, 'Invalid mapping: ' + params.input);\n          }\n          return;\n        }\n        var expr = setArgs[0].split('=');\n        var optionName = expr[0];\n        var value = expr[1];\n        var forceGet = false;\n\n        if (optionName.charAt(optionName.length - 1) == '?') {\n          // If post-fixed with ?, then the set is actually a get.\n          if (value) { throw Error('Trailing characters: ' + params.argString); }\n          optionName = optionName.substring(0, optionName.length - 1);\n          forceGet = true;\n        }\n        if (value === undefined && optionName.substring(0, 2) == 'no') {\n          // To set boolean options to false, the option name is prefixed with\n          // 'no'.\n          optionName = optionName.substring(2);\n          value = false;\n        }\n\n        var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean';\n        if (optionIsBoolean && value == undefined) {\n          // Calling set with a boolean option sets it to true.\n          value = true;\n        }\n        // If no value is provided, then we assume this is a get.\n        if (!optionIsBoolean && value === undefined || forceGet) {\n          var oldValue = getOption(optionName, cm, setCfg);\n          if (oldValue instanceof Error) {\n            showConfirm(cm, oldValue.message);\n          } else if (oldValue === true || oldValue === false) {\n            showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName);\n          } else {\n            showConfirm(cm, '  ' + optionName + '=' + oldValue);\n          }\n        } else {\n          var setOptionReturn = setOption(optionName, value, cm, setCfg);\n          if (setOptionReturn instanceof Error) {\n            showConfirm(cm, setOptionReturn.message);\n          }\n        }\n      },\n      setlocal: function (cm, params) {\n        // setCfg is passed through to setOption\n        params.setCfg = {scope: 'local'};\n        this.set(cm, params);\n      },\n      setglobal: function (cm, params) {\n        // setCfg is passed through to setOption\n        params.setCfg = {scope: 'global'};\n        this.set(cm, params);\n      },\n      registers: function(cm, params) {\n        var regArgs = params.args;\n        var registers = vimGlobalState.registerController.registers;\n        var regInfo = '----------Registers----------\\n\\n';\n        if (!regArgs) {\n          for (var registerName in registers) {\n            var text = registers[registerName].toString();\n            if (text.length) {\n              regInfo += '\"' + registerName + '    ' + text + '\\n'\n            }\n          }\n        } else {\n          var registerName;\n          regArgs = regArgs.join('');\n          for (var i = 0; i < regArgs.length; i++) {\n            registerName = regArgs.charAt(i);\n            if (!vimGlobalState.registerController.isValidRegister(registerName)) {\n              continue;\n            }\n            var register = registers[registerName] || new Register();\n            regInfo += '\"' + registerName + '    ' + register.toString() + '\\n'\n          }\n        }\n        showConfirm(cm, regInfo);\n      },\n      sort: function(cm, params) {\n        var reverse, ignoreCase, unique, number, pattern;\n        function parseArgs() {\n          if (params.argString) {\n            var args = new CodeMirror.StringStream(params.argString);\n            if (args.eat('!')) { reverse = true; }\n            if (args.eol()) { return; }\n            if (!args.eatSpace()) { return 'Invalid arguments'; }\n            var opts = args.match(/([dinuox]+)?\\s*(\\/.+\\/)?\\s*/);\n            if (!opts && !args.eol()) { return 'Invalid arguments'; }\n            if (opts[1]) {\n              ignoreCase = opts[1].indexOf('i') != -1;\n              unique = opts[1].indexOf('u') != -1;\n              var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1;\n              var hex = opts[1].indexOf('x') != -1 && 1;\n              var octal = opts[1].indexOf('o') != -1 && 1;\n              if (decimal + hex + octal > 1) { return 'Invalid arguments'; }\n              number = decimal && 'decimal' || hex && 'hex' || octal && 'octal';\n            }\n            if (opts[2]) {\n              pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : '');\n            }\n          }\n        }\n        var err = parseArgs();\n        if (err) {\n          showConfirm(cm, err + ': ' + params.argString);\n          return;\n        }\n        var lineStart = params.line || cm.firstLine();\n        var lineEnd = params.lineEnd || params.line || cm.lastLine();\n        if (lineStart == lineEnd) { return; }\n        var curStart = new Pos(lineStart, 0);\n        var curEnd = new Pos(lineEnd, lineLength(cm, lineEnd));\n        var text = cm.getRange(curStart, curEnd).split('\\n');\n        var numberRegex = pattern ? pattern :\n           (number == 'decimal') ? /(-?)([\\d]+)/ :\n           (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i :\n           (number == 'octal') ? /([0-7]+)/ : null;\n        var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null;\n        var numPart = [], textPart = [];\n        if (number || pattern) {\n          for (var i = 0; i < text.length; i++) {\n            var matchPart = pattern ? text[i].match(pattern) : null;\n            if (matchPart && matchPart[0] != '') {\n              numPart.push(matchPart);\n            } else if (!pattern && numberRegex.exec(text[i])) {\n              numPart.push(text[i]);\n            } else {\n              textPart.push(text[i]);\n            }\n          }\n        } else {\n          textPart = text;\n        }\n        function compareFn(a, b) {\n          if (reverse) { var tmp; tmp = a; a = b; b = tmp; }\n          if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); }\n          var anum = number && numberRegex.exec(a);\n          var bnum = number && numberRegex.exec(b);\n          if (!anum) { return a < b ? -1 : 1; }\n          anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix);\n          bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix);\n          return anum - bnum;\n        }\n        function comparePatternFn(a, b) {\n          if (reverse) { var tmp; tmp = a; a = b; b = tmp; }\n          if (ignoreCase) { a[0] = a[0].toLowerCase(); b[0] = b[0].toLowerCase(); }\n          return (a[0] < b[0]) ? -1 : 1;\n        }\n        numPart.sort(pattern ? comparePatternFn : compareFn);\n        if (pattern) {\n          for (var i = 0; i < numPart.length; i++) {\n            numPart[i] = numPart[i].input;\n          }\n        } else if (!number) { textPart.sort(compareFn); }\n        text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart);\n        if (unique) { // Remove duplicate lines\n          var textOld = text;\n          var lastLine;\n          text = [];\n          for (var i = 0; i < textOld.length; i++) {\n            if (textOld[i] != lastLine) {\n              text.push(textOld[i]);\n            }\n            lastLine = textOld[i];\n          }\n        }\n        cm.replaceRange(text.join('\\n'), curStart, curEnd);\n      },\n      vglobal: function(cm, params) {\n        // global inspects params.commandName\n        this.global(cm, params);\n      },\n      global: function(cm, params) {\n        // a global command is of the form\n        // :[range]g/pattern/[cmd]\n        // argString holds the string /pattern/[cmd]\n        var argString = params.argString;\n        if (!argString) {\n          showConfirm(cm, 'Regular Expression missing from global');\n          return;\n        }\n        var inverted = params.commandName[0] === 'v';\n        // range is specified here\n        var lineStart = (params.line !== undefined) ? params.line : cm.firstLine();\n        var lineEnd = params.lineEnd || params.line || cm.lastLine();\n        // get the tokens from argString\n        var tokens = splitBySlash(argString);\n        var regexPart = argString, cmd;\n        if (tokens.length) {\n          regexPart = tokens[0];\n          cmd = tokens.slice(1, tokens.length).join('/');\n        }\n        if (regexPart) {\n          // If regex part is empty, then use the previous query. Otherwise\n          // use the regex part as the new query.\n          try {\n           updateSearchQuery(cm, regexPart, true /** ignoreCase */,\n             true /** smartCase */);\n          } catch (e) {\n           showConfirm(cm, 'Invalid regex: ' + regexPart);\n           return;\n          }\n        }\n        // now that we have the regexPart, search for regex matches in the\n        // specified range of lines\n        var query = getSearchState(cm).getQuery();\n        var matchedLines = [];\n        for (var i = lineStart; i <= lineEnd; i++) {\n          var line = cm.getLineHandle(i);\n          var matched = query.test(line.text);\n          if (matched !== inverted) {\n            matchedLines.push(cmd ? line : line.text);\n          }\n        }\n        // if there is no [cmd], just display the list of matched lines\n        if (!cmd) {\n          showConfirm(cm, matchedLines.join('\\n'));\n          return;\n        }\n        var index = 0;\n        var nextCommand = function() {\n          if (index < matchedLines.length) {\n            var line = matchedLines[index++];\n            var lineNum = cm.getLineNumber(line);\n            if (lineNum == null) {\n              nextCommand();\n              return;\n            }\n            var command = (lineNum + 1) + cmd;\n            exCommandDispatcher.processCommand(cm, command, {\n              callback: nextCommand\n            });\n          }\n        };\n        nextCommand();\n      },\n      substitute: function(cm, params) {\n        if (!cm.getSearchCursor) {\n          throw new Error('Search feature not available. Requires searchcursor.js or ' +\n              'any other getSearchCursor implementation.');\n        }\n        var argString = params.argString;\n        var tokens = argString ? splitBySeparator(argString, argString[0]) : [];\n        var regexPart, replacePart = '', trailing, flagsPart, count;\n        var confirm = false; // Whether to confirm each replace.\n        var global = false; // True to replace all instances on a line, false to replace only 1.\n        if (tokens.length) {\n          regexPart = tokens[0];\n          if (getOption('pcre') && regexPart !== '') {\n              regexPart = new RegExp(regexPart).source; //normalize not escaped characters\n          }\n          replacePart = tokens[1];\n          if (replacePart !== undefined) {\n            if (getOption('pcre')) {\n              replacePart = unescapeRegexReplace(replacePart.replace(/([^\\\\])&/g,\"$1$$&\"));\n            } else {\n              replacePart = translateRegexReplace(replacePart);\n            }\n            vimGlobalState.lastSubstituteReplacePart = replacePart;\n          }\n          trailing = tokens[2] ? tokens[2].split(' ') : [];\n        } else {\n          // either the argString is empty or its of the form ' hello/world'\n          // actually splitBySlash returns a list of tokens\n          // only if the string starts with a '/'\n          if (argString && argString.length) {\n            showConfirm(cm, 'Substitutions should be of the form ' +\n                ':s/pattern/replace/');\n            return;\n          }\n        }\n        // After the 3rd slash, we can have flags followed by a space followed\n        // by count.\n        if (trailing) {\n          flagsPart = trailing[0];\n          count = parseInt(trailing[1]);\n          if (flagsPart) {\n            if (flagsPart.indexOf('c') != -1) {\n              confirm = true;\n            }\n            if (flagsPart.indexOf('g') != -1) {\n              global = true;\n            }\n            if (getOption('pcre')) {\n               regexPart = regexPart + '/' + flagsPart;\n            } else {\n               regexPart = regexPart.replace(/\\//g, \"\\\\/\") + '/' + flagsPart;\n            }\n          }\n        }\n        if (regexPart) {\n          // If regex part is empty, then use the previous query. Otherwise use\n          // the regex part as the new query.\n          try {\n            updateSearchQuery(cm, regexPart, true /** ignoreCase */,\n              true /** smartCase */);\n          } catch (e) {\n            showConfirm(cm, 'Invalid regex: ' + regexPart);\n            return;\n          }\n        }\n        replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart;\n        if (replacePart === undefined) {\n          showConfirm(cm, 'No previous substitute regular expression');\n          return;\n        }\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n        var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line;\n        var lineEnd = params.lineEnd || lineStart;\n        if (lineStart == cm.firstLine() && lineEnd == cm.lastLine()) {\n          lineEnd = Infinity;\n        }\n        if (count) {\n          lineStart = lineEnd;\n          lineEnd = lineStart + count - 1;\n        }\n        var startPos = clipCursorToContent(cm, new Pos(lineStart, 0));\n        var cursor = cm.getSearchCursor(query, startPos);\n        doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback);\n      },\n      redo: CodeMirror.commands.redo,\n      undo: CodeMirror.commands.undo,\n      write: function(cm) {\n        if (CodeMirror.commands.save) {\n          // If a save command is defined, call it.\n          CodeMirror.commands.save(cm);\n        } else if (cm.save) {\n          // Saves to text area if no save command is defined and cm.save() is available.\n          cm.save();\n        }\n      },\n      nohlsearch: function(cm) {\n        clearSearchHighlight(cm);\n      },\n      yank: function (cm) {\n        var cur = copyCursor(cm.getCursor());\n        var line = cur.line;\n        var lineText = cm.getLine(line);\n        vimGlobalState.registerController.pushText(\n          '0', 'yank', lineText, true, true);\n      },\n      delmarks: function(cm, params) {\n        if (!params.argString || !trim(params.argString)) {\n          showConfirm(cm, 'Argument required');\n          return;\n        }\n\n        var state = cm.state.vim;\n        var stream = new CodeMirror.StringStream(trim(params.argString));\n        while (!stream.eol()) {\n          stream.eatSpace();\n\n          // Record the streams position at the beginning of the loop for use\n          // in error messages.\n          var count = stream.pos;\n\n          if (!stream.match(/[a-zA-Z]/, false)) {\n            showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n            return;\n          }\n\n          var sym = stream.next();\n          // Check if this symbol is part of a range\n          if (stream.match('-', true)) {\n            // This symbol is part of a range.\n\n            // The range must terminate at an alphabetic character.\n            if (!stream.match(/[a-zA-Z]/, false)) {\n              showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n              return;\n            }\n\n            var startMark = sym;\n            var finishMark = stream.next();\n            // The range must terminate at an alphabetic character which\n            // shares the same case as the start of the range.\n            if (isLowerCase(startMark) && isLowerCase(finishMark) ||\n                isUpperCase(startMark) && isUpperCase(finishMark)) {\n              var start = startMark.charCodeAt(0);\n              var finish = finishMark.charCodeAt(0);\n              if (start >= finish) {\n                showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n                return;\n              }\n\n              // Because marks are always ASCII values, and we have\n              // determined that they are the same case, we can use\n              // their char codes to iterate through the defined range.\n              for (var j = 0; j <= finish - start; j++) {\n                var mark = String.fromCharCode(start + j);\n                delete state.marks[mark];\n              }\n            } else {\n              showConfirm(cm, 'Invalid argument: ' + startMark + '-');\n              return;\n            }\n          } else {\n            // This symbol is a valid mark, and is not part of a range.\n            delete state.marks[sym];\n          }\n        }\n      }\n    };\n\n    var exCommandDispatcher = new ExCommandDispatcher();\n\n    /**\n    * @param {CodeMirror} cm CodeMirror instance we are in.\n    * @param {boolean} confirm Whether to confirm each replace.\n    * @param {Cursor} lineStart Line to start replacing from.\n    * @param {Cursor} lineEnd Line to stop replacing at.\n    * @param {RegExp} query Query for performing matches with.\n    * @param {string} replaceWith Text to replace matches with. May contain $1,\n    *     $2, etc for replacing captured groups using JavaScript replace.\n    * @param {function()} callback A callback for when the replace is done.\n    */\n    function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query,\n        replaceWith, callback) {\n      // Set up all the functions.\n      cm.state.vim.exMode = true;\n      var done = false;\n      var lastPos, modifiedLineNumber, joined;\n      function replaceAll() {\n        cm.operation(function() {\n          while (!done) {\n            replace();\n            next();\n          }\n          stop();\n        });\n      }\n      function replace() {\n        var text = cm.getRange(searchCursor.from(), searchCursor.to());\n        var newText = text.replace(query, replaceWith);\n        var unmodifiedLineNumber = searchCursor.to().line;\n        searchCursor.replace(newText);\n        modifiedLineNumber = searchCursor.to().line;\n        lineEnd += modifiedLineNumber - unmodifiedLineNumber;\n        joined = modifiedLineNumber < unmodifiedLineNumber;\n      }\n      function findNextValidMatch() {\n        var lastMatchTo = lastPos && copyCursor(searchCursor.to());\n        var match = searchCursor.findNext();\n        if (match && !match[0] && lastMatchTo && cursorEqual(searchCursor.from(), lastMatchTo)) {\n          match = searchCursor.findNext();\n        }\n        return match;\n      }\n      function next() {\n        // The below only loops to skip over multiple occurrences on the same\n        // line when 'global' is not true.\n        while(findNextValidMatch() &&\n              isInRange(searchCursor.from(), lineStart, lineEnd)) {\n          if (!global && searchCursor.from().line == modifiedLineNumber && !joined) {\n            continue;\n          }\n          cm.scrollIntoView(searchCursor.from(), 30);\n          cm.setSelection(searchCursor.from(), searchCursor.to());\n          lastPos = searchCursor.from();\n          done = false;\n          return;\n        }\n        done = true;\n      }\n      function stop(close) {\n        if (close) { close(); }\n        cm.focus();\n        if (lastPos) {\n          cm.setCursor(lastPos);\n          var vim = cm.state.vim;\n          vim.exMode = false;\n          vim.lastHPos = vim.lastHSPos = lastPos.ch;\n        }\n        if (callback) { callback(); }\n      }\n      function onPromptKeyDown(e, _value, close) {\n        // Swallow all keys.\n        CodeMirror.e_stop(e);\n        var keyName = CodeMirror.keyName(e);\n        switch (keyName) {\n          case 'Y':\n            replace(); next(); break;\n          case 'N':\n            next(); break;\n          case 'A':\n            // replaceAll contains a call to close of its own. We don't want it\n            // to fire too early or multiple times.\n            var savedCallback = callback;\n            callback = undefined;\n            cm.operation(replaceAll);\n            callback = savedCallback;\n            break;\n          case 'L':\n            replace();\n            // fall through and exit.\n          case 'Q':\n          case 'Esc':\n          case 'Ctrl-C':\n          case 'Ctrl-[':\n            stop(close);\n            break;\n        }\n        if (done) { stop(close); }\n        return true;\n      }\n\n      // Actually do replace.\n      next();\n      if (done) {\n        showConfirm(cm, 'No matches for ' + query.source);\n        return;\n      }\n      if (!confirm) {\n        replaceAll();\n        if (callback) { callback(); }\n        return;\n      }\n      showPrompt(cm, {\n        prefix: dom('span', 'replace with ', dom('strong', replaceWith), ' (y/n/a/q/l)'),\n        onKeyDown: onPromptKeyDown\n      });\n    }\n\n    CodeMirror.keyMap.vim = {\n      attach: attachVimMap,\n      detach: detachVimMap,\n      call: cmKey\n    };\n\n    function exitInsertMode(cm) {\n      var vim = cm.state.vim;\n      var macroModeState = vimGlobalState.macroModeState;\n      var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.');\n      var isPlaying = macroModeState.isPlaying;\n      var lastChange = macroModeState.lastInsertModeChanges;\n      if (!isPlaying) {\n        cm.off('change', onChange);\n        CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n      }\n      if (!isPlaying && vim.insertModeRepeat > 1) {\n        // Perform insert mode repeat for commands like 3,a and 3,o.\n        repeatLastEdit(cm, vim, vim.insertModeRepeat - 1,\n            true /** repeatForInsert */);\n        vim.lastEditInputState.repeatOverride = vim.insertModeRepeat;\n      }\n      delete vim.insertModeRepeat;\n      vim.insertMode = false;\n      cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1);\n      cm.setOption('keyMap', 'vim');\n      cm.setOption('disableInput', true);\n      cm.toggleOverwrite(false); // exit replace mode if we were in it.\n      // update the \". register before exiting insert mode\n      insertModeChangeRegister.setText(lastChange.changes.join(''));\n      CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n      if (macroModeState.isRecording) {\n        logInsertModeChange(macroModeState);\n      }\n    }\n\n    function _mapCommand(command) {\n      defaultKeymap.unshift(command);\n    }\n\n    function mapCommand(keys, type, name, args, extra) {\n      var command = {keys: keys, type: type};\n      command[type] = name;\n      command[type + \"Args\"] = args;\n      for (var key in extra)\n        command[key] = extra[key];\n      _mapCommand(command);\n    }\n\n    // The timeout in milliseconds for the two-character ESC keymap should be\n    // adjusted according to your typing speed to prevent false positives.\n    defineOption('insertModeEscKeysTimeout', 200, 'number');\n\n    CodeMirror.keyMap['vim-insert'] = {\n      // TODO: override navigation keys so that Esc will cancel automatic\n      // indentation from o, O, i_<CR>\n      fallthrough: ['default'],\n      attach: attachVimMap,\n      detach: detachVimMap,\n      call: cmKey\n    };\n\n    CodeMirror.keyMap['vim-replace'] = {\n      'Backspace': 'goCharLeft',\n      fallthrough: ['vim-insert'],\n      attach: attachVimMap,\n      detach: detachVimMap,\n      call: cmKey\n    };\n\n    function executeMacroRegister(cm, vim, macroModeState, registerName) {\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (registerName == ':') {\n        // Read-only register containing last Ex command.\n        if (register.keyBuffer[0]) {\n          exCommandDispatcher.processCommand(cm, register.keyBuffer[0]);\n        }\n        macroModeState.isPlaying = false;\n        return;\n      }\n      var keyBuffer = register.keyBuffer;\n      var imc = 0;\n      macroModeState.isPlaying = true;\n      macroModeState.replaySearchQueries = register.searchQueries.slice(0);\n      for (var i = 0; i < keyBuffer.length; i++) {\n        var text = keyBuffer[i];\n        var match, key;\n        while (text) {\n          // Pull off one command key, which is either a single character\n          // or a special sequence wrapped in '<' and '>', e.g. '<Space>'.\n          match = (/<\\w+-.+?>|<\\w+>|./).exec(text);\n          key = match[0];\n          text = text.substring(match.index + key.length);\n          vimApi.handleKey(cm, key, 'macro');\n          if (vim.insertMode) {\n            var changes = register.insertModeChanges[imc++].changes;\n            vimGlobalState.macroModeState.lastInsertModeChanges.changes =\n                changes;\n            repeatInsertModeChanges(cm, changes, 1);\n            exitInsertMode(cm);\n          }\n        }\n      }\n      macroModeState.isPlaying = false;\n    }\n\n    function logKey(macroModeState, key) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register) {\n        register.pushText(key);\n      }\n    }\n\n    function logInsertModeChange(macroModeState) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register && register.pushInsertModeChanges) {\n        register.pushInsertModeChanges(macroModeState.lastInsertModeChanges);\n      }\n    }\n\n    function logSearchQuery(macroModeState, query) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register && register.pushSearchQuery) {\n        register.pushSearchQuery(query);\n      }\n    }\n\n    /**\n     * Listens for changes made in insert mode.\n     * Should only be active in insert mode.\n     */\n    function onChange(cm, changeObj) {\n      var macroModeState = vimGlobalState.macroModeState;\n      var lastChange = macroModeState.lastInsertModeChanges;\n      if (!macroModeState.isPlaying) {\n        while(changeObj) {\n          lastChange.expectCursorActivityForChange = true;\n          if (lastChange.ignoreCount > 1) {\n            lastChange.ignoreCount--;\n          } else if (changeObj.origin == '+input' || changeObj.origin == 'paste'\n              || changeObj.origin === undefined /* only in testing */) {\n            var selectionCount = cm.listSelections().length;\n            if (selectionCount > 1)\n              lastChange.ignoreCount = selectionCount;\n            var text = changeObj.text.join('\\n');\n            if (lastChange.maybeReset) {\n              lastChange.changes = [];\n              lastChange.maybeReset = false;\n            }\n            if (text) {\n              if (cm.state.overwrite && !/\\n/.test(text)) {\n                lastChange.changes.push([text]);\n              } else {\n                lastChange.changes.push(text);\n              }\n            }\n          }\n          // Change objects may be chained with next.\n          changeObj = changeObj.next;\n        }\n      }\n    }\n\n    /**\n    * Listens for any kind of cursor activity on CodeMirror.\n    */\n    function onCursorActivity(cm) {\n      var vim = cm.state.vim;\n      if (vim.insertMode) {\n        // Tracking cursor activity in insert mode (for macro support).\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.isPlaying) { return; }\n        var lastChange = macroModeState.lastInsertModeChanges;\n        if (lastChange.expectCursorActivityForChange) {\n          lastChange.expectCursorActivityForChange = false;\n        } else {\n          // Cursor moved outside the context of an edit. Reset the change.\n          lastChange.maybeReset = true;\n        }\n      } else if (!cm.curOp.isVimOp) {\n        handleExternalSelection(cm, vim);\n      }\n    }\n    function handleExternalSelection(cm, vim) {\n      var anchor = cm.getCursor('anchor');\n      var head = cm.getCursor('head');\n      // Enter or exit visual mode to match mouse selection.\n      if (vim.visualMode && !cm.somethingSelected()) {\n        exitVisualMode(cm, false);\n      } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) {\n        vim.visualMode = true;\n        vim.visualLine = false;\n        CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\"});\n      }\n      if (vim.visualMode) {\n        // Bind CodeMirror selection model to vim selection model.\n        // Mouse selections are considered visual characterwise.\n        var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0;\n        var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0;\n        head = offsetCursor(head, 0, headOffset);\n        anchor = offsetCursor(anchor, 0, anchorOffset);\n        vim.sel = {\n          anchor: anchor,\n          head: head\n        };\n        updateMark(cm, vim, '<', cursorMin(head, anchor));\n        updateMark(cm, vim, '>', cursorMax(head, anchor));\n      } else if (!vim.insertMode) {\n        // Reset lastHPos if selection was modified by something outside of vim mode e.g. by mouse.\n        vim.lastHPos = cm.getCursor().ch;\n      }\n    }\n\n    /** Wrapper for special keys pressed in insert mode */\n    function InsertModeKey(keyName) {\n      this.keyName = keyName;\n    }\n\n    /**\n    * Handles raw key down events from the text area.\n    * - Should only be active in insert mode.\n    * - For recording deletes in insert mode.\n    */\n    function onKeyEventTargetKeyDown(e) {\n      var macroModeState = vimGlobalState.macroModeState;\n      var lastChange = macroModeState.lastInsertModeChanges;\n      var keyName = CodeMirror.keyName(e);\n      if (!keyName) { return; }\n      function onKeyFound() {\n        if (lastChange.maybeReset) {\n          lastChange.changes = [];\n          lastChange.maybeReset = false;\n        }\n        lastChange.changes.push(new InsertModeKey(keyName));\n        return true;\n      }\n      if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) {\n        CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound);\n      }\n    }\n\n    /**\n     * Repeats the last edit, which includes exactly 1 command and at most 1\n     * insert. Operator and motion commands are read from lastEditInputState,\n     * while action commands are read from lastEditActionCommand.\n     *\n     * If repeatForInsert is true, then the function was called by\n     * exitInsertMode to repeat the insert mode changes the user just made. The\n     * corresponding enterInsertMode call was made with a count.\n     */\n    function repeatLastEdit(cm, vim, repeat, repeatForInsert) {\n      var macroModeState = vimGlobalState.macroModeState;\n      macroModeState.isPlaying = true;\n      var isAction = !!vim.lastEditActionCommand;\n      var cachedInputState = vim.inputState;\n      function repeatCommand() {\n        if (isAction) {\n          commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand);\n        } else {\n          commandDispatcher.evalInput(cm, vim);\n        }\n      }\n      function repeatInsert(repeat) {\n        if (macroModeState.lastInsertModeChanges.changes.length > 0) {\n          // For some reason, repeat cw in desktop VIM does not repeat\n          // insert mode changes. Will conform to that behavior.\n          repeat = !vim.lastEditActionCommand ? 1 : repeat;\n          var changeObject = macroModeState.lastInsertModeChanges;\n          repeatInsertModeChanges(cm, changeObject.changes, repeat);\n        }\n      }\n      vim.inputState = vim.lastEditInputState;\n      if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) {\n        // o and O repeat have to be interlaced with insert repeats so that the\n        // insertions appear on separate lines instead of the last line.\n        for (var i = 0; i < repeat; i++) {\n          repeatCommand();\n          repeatInsert(1);\n        }\n      } else {\n        if (!repeatForInsert) {\n          // Hack to get the cursor to end up at the right place. If I is\n          // repeated in insert mode repeat, cursor will be 1 insert\n          // change set left of where it should be.\n          repeatCommand();\n        }\n        repeatInsert(repeat);\n      }\n      vim.inputState = cachedInputState;\n      if (vim.insertMode && !repeatForInsert) {\n        // Don't exit insert mode twice. If repeatForInsert is set, then we\n        // were called by an exitInsertMode call lower on the stack.\n        exitInsertMode(cm);\n      }\n      macroModeState.isPlaying = false;\n    }\n\n    function repeatInsertModeChanges(cm, changes, repeat) {\n      function keyHandler(binding) {\n        if (typeof binding == 'string') {\n          CodeMirror.commands[binding](cm);\n        } else {\n          binding(cm);\n        }\n        return true;\n      }\n      var head = cm.getCursor('head');\n      var visualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.visualBlock;\n      if (visualBlock) {\n        // Set up block selection again for repeating the changes.\n        selectForInsert(cm, head, visualBlock + 1);\n        repeat = cm.listSelections().length;\n        cm.setCursor(head);\n      }\n      for (var i = 0; i < repeat; i++) {\n        if (visualBlock) {\n          cm.setCursor(offsetCursor(head, i, 0));\n        }\n        for (var j = 0; j < changes.length; j++) {\n          var change = changes[j];\n          if (change instanceof InsertModeKey) {\n            CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler);\n          } else if (typeof change == \"string\") {\n            cm.replaceSelection(change);\n          } else {\n            var start = cm.getCursor();\n            var end = offsetCursor(start, 0, change[0].length);\n            cm.replaceRange(change[0], start, end);\n            cm.setCursor(end);\n          }\n        }\n      }\n      if (visualBlock) {\n        cm.setCursor(offsetCursor(head, 0, 1));\n      }\n    }\n\n    resetVimGlobalState();\n    return vimApi;\n  };\n  // Initialize Vim and make it available as an API.\n  CodeMirror.Vim = Vim();\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/lib/codemirror.css",
    "content": "/* BASICS */\n\n.CodeMirror {\n  /* Set height, width, borders, and global font properties here */\n  font-family: monospace;\n  height: 300px;\n  color: black;\n  direction: ltr;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n  padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre.CodeMirror-line,\n.CodeMirror pre.CodeMirror-line-like {\n  padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n  border-right: 1px solid #ddd;\n  background-color: #f7f7f7;\n  white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n  padding: 0 3px 0 5px;\n  min-width: 20px;\n  text-align: right;\n  color: #999;\n  white-space: nowrap;\n}\n\n.CodeMirror-guttermarker { color: black; }\n.CodeMirror-guttermarker-subtle { color: #999; }\n\n/* CURSOR */\n\n.CodeMirror-cursor {\n  border-left: 1px solid black;\n  border-right: none;\n  width: 0;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n  border-left: 1px solid silver;\n}\n.cm-fat-cursor .CodeMirror-cursor {\n  width: auto;\n  border: 0 !important;\n  background: #7e7;\n}\n.cm-fat-cursor div.CodeMirror-cursors {\n  z-index: 1;\n}\n.cm-fat-cursor .CodeMirror-line::selection,\n.cm-fat-cursor .CodeMirror-line > span::selection, \n.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; }\n.cm-fat-cursor .CodeMirror-line::-moz-selection,\n.cm-fat-cursor .CodeMirror-line > span::-moz-selection,\n.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; }\n.cm-fat-cursor { caret-color: transparent; }\n@-moz-keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n@-webkit-keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n@keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n\n/* Can style cursor different in overwrite (non-insert) mode */\n.CodeMirror-overwrite .CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; text-decoration: inherit; }\n\n.CodeMirror-rulers {\n  position: absolute;\n  left: 0; right: 0; top: -50px; bottom: 0;\n  overflow: hidden;\n}\n.CodeMirror-ruler {\n  border-left: 1px solid #ccc;\n  top: 0; bottom: 0;\n  position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.cm-s-default .cm-header {color: blue;}\n.cm-s-default .cm-quote {color: #090;}\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n.cm-strikethrough {text-decoration: line-through;}\n\n.cm-s-default .cm-keyword {color: #708;}\n.cm-s-default .cm-atom {color: #219;}\n.cm-s-default .cm-number {color: #164;}\n.cm-s-default .cm-def {color: #00f;}\n.cm-s-default .cm-variable,\n.cm-s-default .cm-punctuation,\n.cm-s-default .cm-property,\n.cm-s-default .cm-operator {}\n.cm-s-default .cm-variable-2 {color: #05a;}\n.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}\n.cm-s-default .cm-comment {color: #a50;}\n.cm-s-default .cm-string {color: #a11;}\n.cm-s-default .cm-string-2 {color: #f50;}\n.cm-s-default .cm-meta {color: #555;}\n.cm-s-default .cm-qualifier {color: #555;}\n.cm-s-default .cm-builtin {color: #30a;}\n.cm-s-default .cm-bracket {color: #997;}\n.cm-s-default .cm-tag {color: #170;}\n.cm-s-default .cm-attribute {color: #00c;}\n.cm-s-default .cm-hr {color: #999;}\n.cm-s-default .cm-link {color: #00c;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\n.CodeMirror-composing { border-bottom: 2px solid; }\n\n/* Default styles for common addons */\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}\n.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n   the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n  position: relative;\n  overflow: hidden;\n  background: white;\n}\n\n.CodeMirror-scroll {\n  overflow: scroll !important; /* Things will break if this is overridden */\n  /* 50px is the magic margin used to hide the element's real scrollbars */\n  /* See overflow: hidden in .CodeMirror */\n  margin-bottom: -50px; margin-right: -50px;\n  padding-bottom: 50px;\n  height: 100%;\n  outline: none; /* Prevent dragging from highlighting the element */\n  position: relative;\n  z-index: 0;\n}\n.CodeMirror-sizer {\n  position: relative;\n  border-right: 50px solid transparent;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n   before actual scrolling happens, thus preventing shaking and\n   flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  position: absolute;\n  z-index: 6;\n  display: none;\n  outline: none;\n}\n.CodeMirror-vscrollbar {\n  right: 0; top: 0;\n  overflow-x: hidden;\n  overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n  bottom: 0; left: 0;\n  overflow-y: hidden;\n  overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n  right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n  left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n  position: absolute; left: 0; top: 0;\n  min-height: 100%;\n  z-index: 3;\n}\n.CodeMirror-gutter {\n  white-space: normal;\n  height: 100%;\n  display: inline-block;\n  vertical-align: top;\n  margin-bottom: -50px;\n}\n.CodeMirror-gutter-wrapper {\n  position: absolute;\n  z-index: 4;\n  background: none !important;\n  border: none !important;\n}\n.CodeMirror-gutter-background {\n  position: absolute;\n  top: 0; bottom: 0;\n  z-index: 4;\n}\n.CodeMirror-gutter-elt {\n  position: absolute;\n  cursor: default;\n  z-index: 4;\n}\n.CodeMirror-gutter-wrapper ::selection { background-color: transparent }\n.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }\n\n.CodeMirror-lines {\n  cursor: text;\n  min-height: 1px; /* prevents collapsing before first draw */\n}\n.CodeMirror pre.CodeMirror-line,\n.CodeMirror pre.CodeMirror-line-like {\n  /* Reset some styles that the rest of the page might have set */\n  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n  border-width: 0;\n  background: transparent;\n  font-family: inherit;\n  font-size: inherit;\n  margin: 0;\n  white-space: pre;\n  word-wrap: normal;\n  line-height: inherit;\n  color: inherit;\n  z-index: 2;\n  position: relative;\n  overflow: visible;\n  -webkit-tap-highlight-color: transparent;\n  -webkit-font-variant-ligatures: contextual;\n  font-variant-ligatures: contextual;\n}\n.CodeMirror-wrap pre.CodeMirror-line,\n.CodeMirror-wrap pre.CodeMirror-line-like {\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  word-break: normal;\n}\n\n.CodeMirror-linebackground {\n  position: absolute;\n  left: 0; right: 0; top: 0; bottom: 0;\n  z-index: 0;\n}\n\n.CodeMirror-linewidget {\n  position: relative;\n  z-index: 2;\n  padding: 0.1px; /* Force widget margins to stay inside of the container */\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-rtl pre { direction: rtl; }\n\n.CodeMirror-code {\n  outline: none;\n}\n\n/* Force content-box sizing for the elements where we expect it */\n.CodeMirror-scroll,\n.CodeMirror-sizer,\n.CodeMirror-gutter,\n.CodeMirror-gutters,\n.CodeMirror-linenumber {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n.CodeMirror-measure {\n  position: absolute;\n  width: 100%;\n  height: 0;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n.CodeMirror-cursor {\n  position: absolute;\n  pointer-events: none;\n}\n.CodeMirror-measure pre { position: static; }\n\ndiv.CodeMirror-cursors {\n  visibility: hidden;\n  position: relative;\n  z-index: 3;\n}\ndiv.CodeMirror-dragcursors {\n  visibility: visible;\n}\n\n.CodeMirror-focused div.CodeMirror-cursors {\n  visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }\n.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }\n\n.cm-searching {\n  background-color: #ffa;\n  background-color: rgba(255, 255, 0, .4);\n}\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n  /* Hide the cursor when printing */\n  .CodeMirror div.CodeMirror-cursors {\n    visibility: hidden;\n  }\n}\n\n/* See issue #2901 */\n.cm-tab-wrap-hack:after { content: ''; }\n\n/* Help users use markselection to safely style text background */\nspan.CodeMirror-selectedtext { background: none; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/lib/codemirror.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// This is CodeMirror (https://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = global || self, global.CodeMirror = factory());\n}(this, (function () { 'use strict';\n\n  // Kludges for bugs and behavior differences that can't be feature\n  // detected are enabled based on userAgent etc sniffing.\n  var userAgent = navigator.userAgent;\n  var platform = navigator.platform;\n\n  var gecko = /gecko\\/\\d/i.test(userAgent);\n  var ie_upto10 = /MSIE \\d/.test(userAgent);\n  var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent);\n  var edge = /Edge\\/(\\d+)/.exec(userAgent);\n  var ie = ie_upto10 || ie_11up || edge;\n  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);\n  var webkit = !edge && /WebKit\\//.test(userAgent);\n  var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent);\n  var chrome = !edge && /Chrome\\//.test(userAgent);\n  var presto = /Opera\\//.test(userAgent);\n  var safari = /Apple Computer/.test(navigator.vendor);\n  var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent);\n  var phantom = /PhantomJS/.test(userAgent);\n\n  var ios = safari && (/Mobile\\/\\w+/.test(userAgent) || navigator.maxTouchPoints > 2);\n  var android = /Android/.test(userAgent);\n  // This is woefully incomplete. Suggestions for alternative methods welcome.\n  var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);\n  var mac = ios || /Mac/.test(platform);\n  var chromeOS = /\\bCrOS\\b/.test(userAgent);\n  var windows = /win/i.test(platform);\n\n  var presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n  if (presto_version) { presto_version = Number(presto_version[1]); }\n  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n  var captureRightClick = gecko || (ie && ie_version >= 9);\n\n  function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\n  var rmClass = function(node, cls) {\n    var current = node.className;\n    var match = classTest(cls).exec(current);\n    if (match) {\n      var after = current.slice(match.index + match[0].length);\n      node.className = current.slice(0, match.index) + (after ? match[1] + after : \"\");\n    }\n  };\n\n  function removeChildren(e) {\n    for (var count = e.childNodes.length; count > 0; --count)\n      { e.removeChild(e.firstChild); }\n    return e\n  }\n\n  function removeChildrenAndAdd(parent, e) {\n    return removeChildren(parent).appendChild(e)\n  }\n\n  function elt(tag, content, className, style) {\n    var e = document.createElement(tag);\n    if (className) { e.className = className; }\n    if (style) { e.style.cssText = style; }\n    if (typeof content == \"string\") { e.appendChild(document.createTextNode(content)); }\n    else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }\n    return e\n  }\n  // wrapper for elt, which removes the elt from the accessibility tree\n  function eltP(tag, content, className, style) {\n    var e = elt(tag, content, className, style);\n    e.setAttribute(\"role\", \"presentation\");\n    return e\n  }\n\n  var range;\n  if (document.createRange) { range = function(node, start, end, endNode) {\n    var r = document.createRange();\n    r.setEnd(endNode || node, end);\n    r.setStart(node, start);\n    return r\n  }; }\n  else { range = function(node, start, end) {\n    var r = document.body.createTextRange();\n    try { r.moveToElementText(node.parentNode); }\n    catch(e) { return r }\n    r.collapse(true);\n    r.moveEnd(\"character\", end);\n    r.moveStart(\"character\", start);\n    return r\n  }; }\n\n  function contains(parent, child) {\n    if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n      { child = child.parentNode; }\n    if (parent.contains)\n      { return parent.contains(child) }\n    do {\n      if (child.nodeType == 11) { child = child.host; }\n      if (child == parent) { return true }\n    } while (child = child.parentNode)\n  }\n\n  function activeElt() {\n    // IE and Edge may throw an \"Unspecified Error\" when accessing document.activeElement.\n    // IE < 10 will throw when accessed while the page is loading or in an iframe.\n    // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.\n    var activeElement;\n    try {\n      activeElement = document.activeElement;\n    } catch(e) {\n      activeElement = document.body || null;\n    }\n    while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)\n      { activeElement = activeElement.shadowRoot.activeElement; }\n    return activeElement\n  }\n\n  function addClass(node, cls) {\n    var current = node.className;\n    if (!classTest(cls).test(current)) { node.className += (current ? \" \" : \"\") + cls; }\n  }\n  function joinClasses(a, b) {\n    var as = a.split(\" \");\n    for (var i = 0; i < as.length; i++)\n      { if (as[i] && !classTest(as[i]).test(b)) { b += \" \" + as[i]; } }\n    return b\n  }\n\n  var selectInput = function(node) { node.select(); };\n  if (ios) // Mobile Safari apparently has a bug where select() is broken.\n    { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }\n  else if (ie) // Suppress mysterious IE10 errors\n    { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }\n\n  function bind(f) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function(){return f.apply(null, args)}\n  }\n\n  function copyObj(obj, target, overwrite) {\n    if (!target) { target = {}; }\n    for (var prop in obj)\n      { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n        { target[prop] = obj[prop]; } }\n    return target\n  }\n\n  // Counts the column offset in a string, taking tabs into account.\n  // Used mostly to find indentation.\n  function countColumn(string, end, tabSize, startIndex, startValue) {\n    if (end == null) {\n      end = string.search(/[^\\s\\u00a0]/);\n      if (end == -1) { end = string.length; }\n    }\n    for (var i = startIndex || 0, n = startValue || 0;;) {\n      var nextTab = string.indexOf(\"\\t\", i);\n      if (nextTab < 0 || nextTab >= end)\n        { return n + (end - i) }\n      n += nextTab - i;\n      n += tabSize - (n % tabSize);\n      i = nextTab + 1;\n    }\n  }\n\n  var Delayed = function() {\n    this.id = null;\n    this.f = null;\n    this.time = 0;\n    this.handler = bind(this.onTimeout, this);\n  };\n  Delayed.prototype.onTimeout = function (self) {\n    self.id = 0;\n    if (self.time <= +new Date) {\n      self.f();\n    } else {\n      setTimeout(self.handler, self.time - +new Date);\n    }\n  };\n  Delayed.prototype.set = function (ms, f) {\n    this.f = f;\n    var time = +new Date + ms;\n    if (!this.id || time < this.time) {\n      clearTimeout(this.id);\n      this.id = setTimeout(this.handler, ms);\n      this.time = time;\n    }\n  };\n\n  function indexOf(array, elt) {\n    for (var i = 0; i < array.length; ++i)\n      { if (array[i] == elt) { return i } }\n    return -1\n  }\n\n  // Number of pixels added to scroller and sizer to hide scrollbar\n  var scrollerGap = 50;\n\n  // Returned or thrown by various protocols to signal 'I'm not\n  // handling this'.\n  var Pass = {toString: function(){return \"CodeMirror.Pass\"}};\n\n  // Reused option objects for setSelection & friends\n  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n  // The inverse of countColumn -- find the offset that corresponds to\n  // a particular column.\n  function findColumn(string, goal, tabSize) {\n    for (var pos = 0, col = 0;;) {\n      var nextTab = string.indexOf(\"\\t\", pos);\n      if (nextTab == -1) { nextTab = string.length; }\n      var skipped = nextTab - pos;\n      if (nextTab == string.length || col + skipped >= goal)\n        { return pos + Math.min(skipped, goal - col) }\n      col += nextTab - pos;\n      col += tabSize - (col % tabSize);\n      pos = nextTab + 1;\n      if (col >= goal) { return pos }\n    }\n  }\n\n  var spaceStrs = [\"\"];\n  function spaceStr(n) {\n    while (spaceStrs.length <= n)\n      { spaceStrs.push(lst(spaceStrs) + \" \"); }\n    return spaceStrs[n]\n  }\n\n  function lst(arr) { return arr[arr.length-1] }\n\n  function map(array, f) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }\n    return out\n  }\n\n  function insertSorted(array, value, score) {\n    var pos = 0, priority = score(value);\n    while (pos < array.length && score(array[pos]) <= priority) { pos++; }\n    array.splice(pos, 0, value);\n  }\n\n  function nothing() {}\n\n  function createObj(base, props) {\n    var inst;\n    if (Object.create) {\n      inst = Object.create(base);\n    } else {\n      nothing.prototype = base;\n      inst = new nothing();\n    }\n    if (props) { copyObj(props, inst); }\n    return inst\n  }\n\n  var nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n  function isWordCharBasic(ch) {\n    return /\\w/.test(ch) || ch > \"\\x80\" &&\n      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))\n  }\n  function isWordChar(ch, helper) {\n    if (!helper) { return isWordCharBasic(ch) }\n    if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) { return true }\n    return helper.test(ch)\n  }\n\n  function isEmpty(obj) {\n    for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }\n    return true\n  }\n\n  // Extending unicode characters. A series of a non-extending char +\n  // any number of extending chars is treated as a single unit as far\n  // as editing and measuring is concerned. This is not fully correct,\n  // since some scripts/fonts/browsers also treat other configurations\n  // of code points as a group.\n  var extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\n  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }\n\n  // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.\n  function skipExtendingChars(str, pos, dir) {\n    while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }\n    return pos\n  }\n\n  // Returns the value from the range [`from`; `to`] that satisfies\n  // `pred` and is closest to `from`. Assumes that at least `to`\n  // satisfies `pred`. Supports `from` being greater than `to`.\n  function findFirst(pred, from, to) {\n    // At any point we are certain `to` satisfies `pred`, don't know\n    // whether `from` does.\n    var dir = from > to ? -1 : 1;\n    for (;;) {\n      if (from == to) { return from }\n      var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);\n      if (mid == from) { return pred(mid) ? from : to }\n      if (pred(mid)) { to = mid; }\n      else { from = mid + dir; }\n    }\n  }\n\n  // BIDI HELPERS\n\n  function iterateBidiSections(order, from, to, f) {\n    if (!order) { return f(from, to, \"ltr\", 0) }\n    var found = false;\n    for (var i = 0; i < order.length; ++i) {\n      var part = order[i];\n      if (part.from < to && part.to > from || from == to && part.to == from) {\n        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\", i);\n        found = true;\n      }\n    }\n    if (!found) { f(from, to, \"ltr\"); }\n  }\n\n  var bidiOther = null;\n  function getBidiPartAt(order, ch, sticky) {\n    var found;\n    bidiOther = null;\n    for (var i = 0; i < order.length; ++i) {\n      var cur = order[i];\n      if (cur.from < ch && cur.to > ch) { return i }\n      if (cur.to == ch) {\n        if (cur.from != cur.to && sticky == \"before\") { found = i; }\n        else { bidiOther = i; }\n      }\n      if (cur.from == ch) {\n        if (cur.from != cur.to && sticky != \"before\") { found = i; }\n        else { bidiOther = i; }\n      }\n    }\n    return found != null ? found : bidiOther\n  }\n\n  // Bidirectional ordering algorithm\n  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n  // that this (partially) implements.\n\n  // One-char codes used for character types:\n  // L (L):   Left-to-Right\n  // R (R):   Right-to-Left\n  // r (AL):  Right-to-Left Arabic\n  // 1 (EN):  European Number\n  // + (ES):  European Number Separator\n  // % (ET):  European Number Terminator\n  // n (AN):  Arabic Number\n  // , (CS):  Common Number Separator\n  // m (NSM): Non-Spacing Mark\n  // b (BN):  Boundary Neutral\n  // s (B):   Paragraph Separator\n  // t (S):   Segment Separator\n  // w (WS):  Whitespace\n  // N (ON):  Other Neutrals\n\n  // Returns null if characters are ordered as they appear\n  // (left-to-right), or an array of sections ({from, to, level}\n  // objects) in the order in which they occur visually.\n  var bidiOrdering = (function() {\n    // Character types for codepoints 0 to 0xff\n    var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n    // Character types for codepoints 0x600 to 0x6f9\n    var arabicTypes = \"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";\n    function charType(code) {\n      if (code <= 0xf7) { return lowTypes.charAt(code) }\n      else if (0x590 <= code && code <= 0x5f4) { return \"R\" }\n      else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }\n      else if (0x6ee <= code && code <= 0x8ac) { return \"r\" }\n      else if (0x2000 <= code && code <= 0x200b) { return \"w\" }\n      else if (code == 0x200c) { return \"b\" }\n      else { return \"L\" }\n    }\n\n    var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n\n    function BidiSpan(level, from, to) {\n      this.level = level;\n      this.from = from; this.to = to;\n    }\n\n    return function(str, direction) {\n      var outerType = direction == \"ltr\" ? \"L\" : \"R\";\n\n      if (str.length == 0 || direction == \"ltr\" && !bidiRE.test(str)) { return false }\n      var len = str.length, types = [];\n      for (var i = 0; i < len; ++i)\n        { types.push(charType(str.charCodeAt(i))); }\n\n      // W1. Examine each non-spacing mark (NSM) in the level run, and\n      // change the type of the NSM to the type of the previous\n      // character. If the NSM is at the start of the level run, it will\n      // get the type of sor.\n      for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {\n        var type = types[i$1];\n        if (type == \"m\") { types[i$1] = prev; }\n        else { prev = type; }\n      }\n\n      // W2. Search backwards from each instance of a European number\n      // until the first strong type (R, L, AL, or sor) is found. If an\n      // AL is found, change the type of the European number to Arabic\n      // number.\n      // W3. Change all ALs to R.\n      for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {\n        var type$1 = types[i$2];\n        if (type$1 == \"1\" && cur == \"r\") { types[i$2] = \"n\"; }\n        else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == \"r\") { types[i$2] = \"R\"; } }\n      }\n\n      // W4. A single European separator between two European numbers\n      // changes to a European number. A single common separator between\n      // two numbers of the same type changes to that type.\n      for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {\n        var type$2 = types[i$3];\n        if (type$2 == \"+\" && prev$1 == \"1\" && types[i$3+1] == \"1\") { types[i$3] = \"1\"; }\n        else if (type$2 == \",\" && prev$1 == types[i$3+1] &&\n                 (prev$1 == \"1\" || prev$1 == \"n\")) { types[i$3] = prev$1; }\n        prev$1 = type$2;\n      }\n\n      // W5. A sequence of European terminators adjacent to European\n      // numbers changes to all European numbers.\n      // W6. Otherwise, separators and terminators change to Other\n      // Neutral.\n      for (var i$4 = 0; i$4 < len; ++i$4) {\n        var type$3 = types[i$4];\n        if (type$3 == \",\") { types[i$4] = \"N\"; }\n        else if (type$3 == \"%\") {\n          var end = (void 0);\n          for (end = i$4 + 1; end < len && types[end] == \"%\"; ++end) {}\n          var replace = (i$4 && types[i$4-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n          for (var j = i$4; j < end; ++j) { types[j] = replace; }\n          i$4 = end - 1;\n        }\n      }\n\n      // W7. Search backwards from each instance of a European number\n      // until the first strong type (R, L, or sor) is found. If an L is\n      // found, then change the type of the European number to L.\n      for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {\n        var type$4 = types[i$5];\n        if (cur$1 == \"L\" && type$4 == \"1\") { types[i$5] = \"L\"; }\n        else if (isStrong.test(type$4)) { cur$1 = type$4; }\n      }\n\n      // N1. A sequence of neutrals takes the direction of the\n      // surrounding strong text if the text on both sides has the same\n      // direction. European and Arabic numbers act as if they were R in\n      // terms of their influence on neutrals. Start-of-level-run (sor)\n      // and end-of-level-run (eor) are used at level run boundaries.\n      // N2. Any remaining neutrals take the embedding direction.\n      for (var i$6 = 0; i$6 < len; ++i$6) {\n        if (isNeutral.test(types[i$6])) {\n          var end$1 = (void 0);\n          for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}\n          var before = (i$6 ? types[i$6-1] : outerType) == \"L\";\n          var after = (end$1 < len ? types[end$1] : outerType) == \"L\";\n          var replace$1 = before == after ? (before ? \"L\" : \"R\") : outerType;\n          for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }\n          i$6 = end$1 - 1;\n        }\n      }\n\n      // Here we depart from the documented algorithm, in order to avoid\n      // building up an actual levels array. Since there are only three\n      // levels (0, 1, 2) in an implementation that doesn't take\n      // explicit embedding into account, we can build up the order on\n      // the fly, without following the level-based algorithm.\n      var order = [], m;\n      for (var i$7 = 0; i$7 < len;) {\n        if (countsAsLeft.test(types[i$7])) {\n          var start = i$7;\n          for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}\n          order.push(new BidiSpan(0, start, i$7));\n        } else {\n          var pos = i$7, at = order.length, isRTL = direction == \"rtl\" ? 1 : 0;\n          for (++i$7; i$7 < len && types[i$7] != \"L\"; ++i$7) {}\n          for (var j$2 = pos; j$2 < i$7;) {\n            if (countsAsNum.test(types[j$2])) {\n              if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }\n              var nstart = j$2;\n              for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}\n              order.splice(at, 0, new BidiSpan(2, nstart, j$2));\n              at += isRTL;\n              pos = j$2;\n            } else { ++j$2; }\n          }\n          if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }\n        }\n      }\n      if (direction == \"ltr\") {\n        if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n          order[0].from = m[0].length;\n          order.unshift(new BidiSpan(0, 0, m[0].length));\n        }\n        if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n          lst(order).to -= m[0].length;\n          order.push(new BidiSpan(0, len - m[0].length, len));\n        }\n      }\n\n      return direction == \"rtl\" ? order.reverse() : order\n    }\n  })();\n\n  // Get the bidi ordering for the given line (and cache it). Returns\n  // false for lines that are fully left-to-right, and an array of\n  // BidiSpan objects otherwise.\n  function getOrder(line, direction) {\n    var order = line.order;\n    if (order == null) { order = line.order = bidiOrdering(line.text, direction); }\n    return order\n  }\n\n  // EVENT HANDLING\n\n  // Lightweight event framework. on/off also work on DOM nodes,\n  // registering native DOM handlers.\n\n  var noHandlers = [];\n\n  var on = function(emitter, type, f) {\n    if (emitter.addEventListener) {\n      emitter.addEventListener(type, f, false);\n    } else if (emitter.attachEvent) {\n      emitter.attachEvent(\"on\" + type, f);\n    } else {\n      var map = emitter._handlers || (emitter._handlers = {});\n      map[type] = (map[type] || noHandlers).concat(f);\n    }\n  };\n\n  function getHandlers(emitter, type) {\n    return emitter._handlers && emitter._handlers[type] || noHandlers\n  }\n\n  function off(emitter, type, f) {\n    if (emitter.removeEventListener) {\n      emitter.removeEventListener(type, f, false);\n    } else if (emitter.detachEvent) {\n      emitter.detachEvent(\"on\" + type, f);\n    } else {\n      var map = emitter._handlers, arr = map && map[type];\n      if (arr) {\n        var index = indexOf(arr, f);\n        if (index > -1)\n          { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }\n      }\n    }\n  }\n\n  function signal(emitter, type /*, values...*/) {\n    var handlers = getHandlers(emitter, type);\n    if (!handlers.length) { return }\n    var args = Array.prototype.slice.call(arguments, 2);\n    for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }\n  }\n\n  // The DOM events that CodeMirror handles can be overridden by\n  // registering a (non-DOM) handler on the editor for the event name,\n  // and preventDefault-ing the event in that handler.\n  function signalDOMEvent(cm, e, override) {\n    if (typeof e == \"string\")\n      { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }\n    signal(cm, override || e.type, cm, e);\n    return e_defaultPrevented(e) || e.codemirrorIgnore\n  }\n\n  function signalCursorActivity(cm) {\n    var arr = cm._handlers && cm._handlers.cursorActivity;\n    if (!arr) { return }\n    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n    for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)\n      { set.push(arr[i]); } }\n  }\n\n  function hasHandler(emitter, type) {\n    return getHandlers(emitter, type).length > 0\n  }\n\n  // Add on and off methods to a constructor's prototype, to make\n  // registering events on such objects more convenient.\n  function eventMixin(ctor) {\n    ctor.prototype.on = function(type, f) {on(this, type, f);};\n    ctor.prototype.off = function(type, f) {off(this, type, f);};\n  }\n\n  // Due to the fact that we still support jurassic IE versions, some\n  // compatibility wrappers are needed.\n\n  function e_preventDefault(e) {\n    if (e.preventDefault) { e.preventDefault(); }\n    else { e.returnValue = false; }\n  }\n  function e_stopPropagation(e) {\n    if (e.stopPropagation) { e.stopPropagation(); }\n    else { e.cancelBubble = true; }\n  }\n  function e_defaultPrevented(e) {\n    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false\n  }\n  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}\n\n  function e_target(e) {return e.target || e.srcElement}\n  function e_button(e) {\n    var b = e.which;\n    if (b == null) {\n      if (e.button & 1) { b = 1; }\n      else if (e.button & 2) { b = 3; }\n      else if (e.button & 4) { b = 2; }\n    }\n    if (mac && e.ctrlKey && b == 1) { b = 3; }\n    return b\n  }\n\n  // Detect drag-and-drop\n  var dragAndDrop = function() {\n    // There is *some* kind of drag-and-drop support in IE6-8, but I\n    // couldn't get it to work yet.\n    if (ie && ie_version < 9) { return false }\n    var div = elt('div');\n    return \"draggable\" in div || \"dragDrop\" in div\n  }();\n\n  var zwspSupported;\n  function zeroWidthElement(measure) {\n    if (zwspSupported == null) {\n      var test = elt(\"span\", \"\\u200b\");\n      removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n      if (measure.firstChild.offsetHeight != 0)\n        { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }\n    }\n    var node = zwspSupported ? elt(\"span\", \"\\u200b\") :\n      elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n    node.setAttribute(\"cm-text\", \"\");\n    return node\n  }\n\n  // Feature-detect IE's crummy client rect reporting for bidi text\n  var badBidiRects;\n  function hasBadBidiRects(measure) {\n    if (badBidiRects != null) { return badBidiRects }\n    var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n    var r0 = range(txt, 0, 1).getBoundingClientRect();\n    var r1 = range(txt, 1, 2).getBoundingClientRect();\n    removeChildren(measure);\n    if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)\n    return badBidiRects = (r1.right - r0.right < 3)\n  }\n\n  // See if \"\".split is the broken IE version, if so, provide an\n  // alternative way to split lines.\n  var splitLinesAuto = \"\\n\\nb\".split(/\\n/).length != 3 ? function (string) {\n    var pos = 0, result = [], l = string.length;\n    while (pos <= l) {\n      var nl = string.indexOf(\"\\n\", pos);\n      if (nl == -1) { nl = string.length; }\n      var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n      var rt = line.indexOf(\"\\r\");\n      if (rt != -1) {\n        result.push(line.slice(0, rt));\n        pos += rt + 1;\n      } else {\n        result.push(line);\n        pos = nl + 1;\n      }\n    }\n    return result\n  } : function (string) { return string.split(/\\r\\n?|\\n/); };\n\n  var hasSelection = window.getSelection ? function (te) {\n    try { return te.selectionStart != te.selectionEnd }\n    catch(e) { return false }\n  } : function (te) {\n    var range;\n    try {range = te.ownerDocument.selection.createRange();}\n    catch(e) {}\n    if (!range || range.parentElement() != te) { return false }\n    return range.compareEndPoints(\"StartToEnd\", range) != 0\n  };\n\n  var hasCopyEvent = (function () {\n    var e = elt(\"div\");\n    if (\"oncopy\" in e) { return true }\n    e.setAttribute(\"oncopy\", \"return;\");\n    return typeof e.oncopy == \"function\"\n  })();\n\n  var badZoomedRects = null;\n  function hasBadZoomedRects(measure) {\n    if (badZoomedRects != null) { return badZoomedRects }\n    var node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"));\n    var normal = node.getBoundingClientRect();\n    var fromRange = range(node, 0, 1).getBoundingClientRect();\n    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1\n  }\n\n  // Known modes, by name and by MIME\n  var modes = {}, mimeModes = {};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  function defineMode(name, mode) {\n    if (arguments.length > 2)\n      { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n    modes[name] = mode;\n  }\n\n  function defineMIME(mime, spec) {\n    mimeModes[mime] = spec;\n  }\n\n  // Given a MIME type, a {name, ...options} config object, or a name\n  // string, return a mode config object.\n  function resolveMode(spec) {\n    if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n      spec = mimeModes[spec];\n    } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n      var found = mimeModes[spec.name];\n      if (typeof found == \"string\") { found = {name: found}; }\n      spec = createObj(found, spec);\n      spec.name = found.name;\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n      return resolveMode(\"application/xml\")\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n      return resolveMode(\"application/json\")\n    }\n    if (typeof spec == \"string\") { return {name: spec} }\n    else { return spec || {name: \"null\"} }\n  }\n\n  // Given a mode spec (anything that resolveMode accepts), find and\n  // initialize an actual mode object.\n  function getMode(options, spec) {\n    spec = resolveMode(spec);\n    var mfactory = modes[spec.name];\n    if (!mfactory) { return getMode(options, \"text/plain\") }\n    var modeObj = mfactory(options, spec);\n    if (modeExtensions.hasOwnProperty(spec.name)) {\n      var exts = modeExtensions[spec.name];\n      for (var prop in exts) {\n        if (!exts.hasOwnProperty(prop)) { continue }\n        if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n        modeObj[prop] = exts[prop];\n      }\n    }\n    modeObj.name = spec.name;\n    if (spec.helperType) { modeObj.helperType = spec.helperType; }\n    if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n      { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n    return modeObj\n  }\n\n  // This can be used to attach properties to mode objects from\n  // outside the actual mode definition.\n  var modeExtensions = {};\n  function extendMode(mode, properties) {\n    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n    copyObj(properties, exts);\n  }\n\n  function copyState(mode, state) {\n    if (state === true) { return state }\n    if (mode.copyState) { return mode.copyState(state) }\n    var nstate = {};\n    for (var n in state) {\n      var val = state[n];\n      if (val instanceof Array) { val = val.concat([]); }\n      nstate[n] = val;\n    }\n    return nstate\n  }\n\n  // Given a mode and a state (for that mode), find the inner mode and\n  // state at the position that the state refers to.\n  function innerMode(mode, state) {\n    var info;\n    while (mode.innerMode) {\n      info = mode.innerMode(state);\n      if (!info || info.mode == mode) { break }\n      state = info.state;\n      mode = info.mode;\n    }\n    return info || {mode: mode, state: state}\n  }\n\n  function startState(mode, a1, a2) {\n    return mode.startState ? mode.startState(a1, a2) : true\n  }\n\n  // STRING STREAM\n\n  // Fed to the mode parsers, provides helper functions to make\n  // parsers more succinct.\n\n  var StringStream = function(string, tabSize, lineOracle) {\n    this.pos = this.start = 0;\n    this.string = string;\n    this.tabSize = tabSize || 8;\n    this.lastColumnPos = this.lastColumnValue = 0;\n    this.lineStart = 0;\n    this.lineOracle = lineOracle;\n  };\n\n  StringStream.prototype.eol = function () {return this.pos >= this.string.length};\n  StringStream.prototype.sol = function () {return this.pos == this.lineStart};\n  StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\n  StringStream.prototype.next = function () {\n    if (this.pos < this.string.length)\n      { return this.string.charAt(this.pos++) }\n  };\n  StringStream.prototype.eat = function (match) {\n    var ch = this.string.charAt(this.pos);\n    var ok;\n    if (typeof match == \"string\") { ok = ch == match; }\n    else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n    if (ok) {++this.pos; return ch}\n  };\n  StringStream.prototype.eatWhile = function (match) {\n    var start = this.pos;\n    while (this.eat(match)){}\n    return this.pos > start\n  };\n  StringStream.prototype.eatSpace = function () {\n    var start = this.pos;\n    while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }\n    return this.pos > start\n  };\n  StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\n  StringStream.prototype.skipTo = function (ch) {\n    var found = this.string.indexOf(ch, this.pos);\n    if (found > -1) {this.pos = found; return true}\n  };\n  StringStream.prototype.backUp = function (n) {this.pos -= n;};\n  StringStream.prototype.column = function () {\n    if (this.lastColumnPos < this.start) {\n      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n      this.lastColumnPos = this.start;\n    }\n    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.indentation = function () {\n    return countColumn(this.string, null, this.tabSize) -\n      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n    if (typeof pattern == \"string\") {\n      var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n      var substr = this.string.substr(this.pos, pattern.length);\n      if (cased(substr) == cased(pattern)) {\n        if (consume !== false) { this.pos += pattern.length; }\n        return true\n      }\n    } else {\n      var match = this.string.slice(this.pos).match(pattern);\n      if (match && match.index > 0) { return null }\n      if (match && consume !== false) { this.pos += match[0].length; }\n      return match\n    }\n  };\n  StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\n  StringStream.prototype.hideFirstChars = function (n, inner) {\n    this.lineStart += n;\n    try { return inner() }\n    finally { this.lineStart -= n; }\n  };\n  StringStream.prototype.lookAhead = function (n) {\n    var oracle = this.lineOracle;\n    return oracle && oracle.lookAhead(n)\n  };\n  StringStream.prototype.baseToken = function () {\n    var oracle = this.lineOracle;\n    return oracle && oracle.baseToken(this.pos)\n  };\n\n  // Find the line object corresponding to the given line number.\n  function getLine(doc, n) {\n    n -= doc.first;\n    if (n < 0 || n >= doc.size) { throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\") }\n    var chunk = doc;\n    while (!chunk.lines) {\n      for (var i = 0;; ++i) {\n        var child = chunk.children[i], sz = child.chunkSize();\n        if (n < sz) { chunk = child; break }\n        n -= sz;\n      }\n    }\n    return chunk.lines[n]\n  }\n\n  // Get the part of a document between two positions, as an array of\n  // strings.\n  function getBetween(doc, start, end) {\n    var out = [], n = start.line;\n    doc.iter(start.line, end.line + 1, function (line) {\n      var text = line.text;\n      if (n == end.line) { text = text.slice(0, end.ch); }\n      if (n == start.line) { text = text.slice(start.ch); }\n      out.push(text);\n      ++n;\n    });\n    return out\n  }\n  // Get the lines between from and to, as array of strings.\n  function getLines(doc, from, to) {\n    var out = [];\n    doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value\n    return out\n  }\n\n  // Update the height of a line, propagating the height change\n  // upwards to parent nodes.\n  function updateLineHeight(line, height) {\n    var diff = height - line.height;\n    if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }\n  }\n\n  // Given a line object, find its line number by walking up through\n  // its parent links.\n  function lineNo(line) {\n    if (line.parent == null) { return null }\n    var cur = line.parent, no = indexOf(cur.lines, line);\n    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n      for (var i = 0;; ++i) {\n        if (chunk.children[i] == cur) { break }\n        no += chunk.children[i].chunkSize();\n      }\n    }\n    return no + cur.first\n  }\n\n  // Find the line at the given vertical position, using the height\n  // information in the document tree.\n  function lineAtHeight(chunk, h) {\n    var n = chunk.first;\n    outer: do {\n      for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {\n        var child = chunk.children[i$1], ch = child.height;\n        if (h < ch) { chunk = child; continue outer }\n        h -= ch;\n        n += child.chunkSize();\n      }\n      return n\n    } while (!chunk.lines)\n    var i = 0;\n    for (; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i], lh = line.height;\n      if (h < lh) { break }\n      h -= lh;\n    }\n    return n + i\n  }\n\n  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}\n\n  function lineNumberFor(options, i) {\n    return String(options.lineNumberFormatter(i + options.firstLineNumber))\n  }\n\n  // A Pos instance represents a position within the text.\n  function Pos(line, ch, sticky) {\n    if ( sticky === void 0 ) sticky = null;\n\n    if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }\n    this.line = line;\n    this.ch = ch;\n    this.sticky = sticky;\n  }\n\n  // Compare two positions, return 0 if they are the same, a negative\n  // number when a is less, and a positive number otherwise.\n  function cmp(a, b) { return a.line - b.line || a.ch - b.ch }\n\n  function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }\n\n  function copyPos(x) {return Pos(x.line, x.ch)}\n  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }\n  function minPos(a, b) { return cmp(a, b) < 0 ? a : b }\n\n  // Most of the external API clips given positions to make sure they\n  // actually exist within the document.\n  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}\n  function clipPos(doc, pos) {\n    if (pos.line < doc.first) { return Pos(doc.first, 0) }\n    var last = doc.first + doc.size - 1;\n    if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }\n    return clipToLen(pos, getLine(doc, pos.line).text.length)\n  }\n  function clipToLen(pos, linelen) {\n    var ch = pos.ch;\n    if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }\n    else if (ch < 0) { return Pos(pos.line, 0) }\n    else { return pos }\n  }\n  function clipPosArray(doc, array) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }\n    return out\n  }\n\n  var SavedContext = function(state, lookAhead) {\n    this.state = state;\n    this.lookAhead = lookAhead;\n  };\n\n  var Context = function(doc, state, line, lookAhead) {\n    this.state = state;\n    this.doc = doc;\n    this.line = line;\n    this.maxLookAhead = lookAhead || 0;\n    this.baseTokens = null;\n    this.baseTokenPos = 1;\n  };\n\n  Context.prototype.lookAhead = function (n) {\n    var line = this.doc.getLine(this.line + n);\n    if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }\n    return line\n  };\n\n  Context.prototype.baseToken = function (n) {\n    if (!this.baseTokens) { return null }\n    while (this.baseTokens[this.baseTokenPos] <= n)\n      { this.baseTokenPos += 2; }\n    var type = this.baseTokens[this.baseTokenPos + 1];\n    return {type: type && type.replace(/( |^)overlay .*/, \"\"),\n            size: this.baseTokens[this.baseTokenPos] - n}\n  };\n\n  Context.prototype.nextLine = function () {\n    this.line++;\n    if (this.maxLookAhead > 0) { this.maxLookAhead--; }\n  };\n\n  Context.fromSaved = function (doc, saved, line) {\n    if (saved instanceof SavedContext)\n      { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }\n    else\n      { return new Context(doc, copyState(doc.mode, saved), line) }\n  };\n\n  Context.prototype.save = function (copy) {\n    var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;\n    return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state\n  };\n\n\n  // Compute a style array (an array starting with a mode generation\n  // -- for invalidation -- followed by pairs of end positions and\n  // style strings), which is used to highlight the tokens on the\n  // line.\n  function highlightLine(cm, line, context, forceToEnd) {\n    // A styles array always starts with a number identifying the\n    // mode/overlays that it is based on (for easy invalidation).\n    var st = [cm.state.modeGen], lineClasses = {};\n    // Compute the base array of styles\n    runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },\n            lineClasses, forceToEnd);\n    var state = context.state;\n\n    // Run overlays, adjust style array.\n    var loop = function ( o ) {\n      context.baseTokens = st;\n      var overlay = cm.state.overlays[o], i = 1, at = 0;\n      context.state = true;\n      runMode(cm, line.text, overlay.mode, context, function (end, style) {\n        var start = i;\n        // Ensure there's a token end at the current position, and that i points at it\n        while (at < end) {\n          var i_end = st[i];\n          if (i_end > end)\n            { st.splice(i, 1, end, st[i+1], i_end); }\n          i += 2;\n          at = Math.min(end, i_end);\n        }\n        if (!style) { return }\n        if (overlay.opaque) {\n          st.splice(start, i - start, end, \"overlay \" + style);\n          i = start + 2;\n        } else {\n          for (; start < i; start += 2) {\n            var cur = st[start+1];\n            st[start+1] = (cur ? cur + \" \" : \"\") + \"overlay \" + style;\n          }\n        }\n      }, lineClasses);\n      context.state = state;\n      context.baseTokens = null;\n      context.baseTokenPos = 1;\n    };\n\n    for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );\n\n    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}\n  }\n\n  function getLineStyles(cm, line, updateFrontier) {\n    if (!line.styles || line.styles[0] != cm.state.modeGen) {\n      var context = getContextBefore(cm, lineNo(line));\n      var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);\n      var result = highlightLine(cm, line, context);\n      if (resetState) { context.state = resetState; }\n      line.stateAfter = context.save(!resetState);\n      line.styles = result.styles;\n      if (result.classes) { line.styleClasses = result.classes; }\n      else if (line.styleClasses) { line.styleClasses = null; }\n      if (updateFrontier === cm.doc.highlightFrontier)\n        { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }\n    }\n    return line.styles\n  }\n\n  function getContextBefore(cm, n, precise) {\n    var doc = cm.doc, display = cm.display;\n    if (!doc.mode.startState) { return new Context(doc, true, n) }\n    var start = findStartLine(cm, n, precise);\n    var saved = start > doc.first && getLine(doc, start - 1).stateAfter;\n    var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);\n\n    doc.iter(start, n, function (line) {\n      processLine(cm, line.text, context);\n      var pos = context.line;\n      line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;\n      context.nextLine();\n    });\n    if (precise) { doc.modeFrontier = context.line; }\n    return context\n  }\n\n  // Lightweight form of highlight -- proceed over this line and\n  // update state, but don't save a style array. Used for lines that\n  // aren't currently visible.\n  function processLine(cm, text, context, startAt) {\n    var mode = cm.doc.mode;\n    var stream = new StringStream(text, cm.options.tabSize, context);\n    stream.start = stream.pos = startAt || 0;\n    if (text == \"\") { callBlankLine(mode, context.state); }\n    while (!stream.eol()) {\n      readToken(mode, stream, context.state);\n      stream.start = stream.pos;\n    }\n  }\n\n  function callBlankLine(mode, state) {\n    if (mode.blankLine) { return mode.blankLine(state) }\n    if (!mode.innerMode) { return }\n    var inner = innerMode(mode, state);\n    if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }\n  }\n\n  function readToken(mode, stream, state, inner) {\n    for (var i = 0; i < 10; i++) {\n      if (inner) { inner[0] = innerMode(mode, state).mode; }\n      var style = mode.token(stream, state);\n      if (stream.pos > stream.start) { return style }\n    }\n    throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\")\n  }\n\n  var Token = function(stream, type, state) {\n    this.start = stream.start; this.end = stream.pos;\n    this.string = stream.current();\n    this.type = type || null;\n    this.state = state;\n  };\n\n  // Utility for getTokenAt and getLineTokens\n  function takeToken(cm, pos, precise, asArray) {\n    var doc = cm.doc, mode = doc.mode, style;\n    pos = clipPos(doc, pos);\n    var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);\n    var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;\n    if (asArray) { tokens = []; }\n    while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n      stream.start = stream.pos;\n      style = readToken(mode, stream, context.state);\n      if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }\n    }\n    return asArray ? tokens : new Token(stream, style, context.state)\n  }\n\n  function extractLineClasses(type, output) {\n    if (type) { for (;;) {\n      var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n      if (!lineClass) { break }\n      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n      var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n      if (output[prop] == null)\n        { output[prop] = lineClass[2]; }\n      else if (!(new RegExp(\"(?:^|\\\\s)\" + lineClass[2] + \"(?:$|\\\\s)\")).test(output[prop]))\n        { output[prop] += \" \" + lineClass[2]; }\n    } }\n    return type\n  }\n\n  // Run the given mode's parser over a line, calling f for each token.\n  function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {\n    var flattenSpans = mode.flattenSpans;\n    if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }\n    var curStart = 0, curStyle = null;\n    var stream = new StringStream(text, cm.options.tabSize, context), style;\n    var inner = cm.options.addModeClass && [null];\n    if (text == \"\") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }\n    while (!stream.eol()) {\n      if (stream.pos > cm.options.maxHighlightLength) {\n        flattenSpans = false;\n        if (forceToEnd) { processLine(cm, text, context, stream.pos); }\n        stream.pos = text.length;\n        style = null;\n      } else {\n        style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);\n      }\n      if (inner) {\n        var mName = inner[0].name;\n        if (mName) { style = \"m-\" + (style ? mName + \" \" + style : mName); }\n      }\n      if (!flattenSpans || curStyle != style) {\n        while (curStart < stream.start) {\n          curStart = Math.min(stream.start, curStart + 5000);\n          f(curStart, curStyle);\n        }\n        curStyle = style;\n      }\n      stream.start = stream.pos;\n    }\n    while (curStart < stream.pos) {\n      // Webkit seems to refuse to render text nodes longer than 57444\n      // characters, and returns inaccurate measurements in nodes\n      // starting around 5000 chars.\n      var pos = Math.min(stream.pos, curStart + 5000);\n      f(pos, curStyle);\n      curStart = pos;\n    }\n  }\n\n  // Finds the line to start with when starting a parse. Tries to\n  // find a line with a stateAfter, so that it can start with a\n  // valid state. If that fails, it returns the line with the\n  // smallest indentation, which tends to need the least context to\n  // parse correctly.\n  function findStartLine(cm, n, precise) {\n    var minindent, minline, doc = cm.doc;\n    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n    for (var search = n; search > lim; --search) {\n      if (search <= doc.first) { return doc.first }\n      var line = getLine(doc, search - 1), after = line.stateAfter;\n      if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))\n        { return search }\n      var indented = countColumn(line.text, null, cm.options.tabSize);\n      if (minline == null || minindent > indented) {\n        minline = search - 1;\n        minindent = indented;\n      }\n    }\n    return minline\n  }\n\n  function retreatFrontier(doc, n) {\n    doc.modeFrontier = Math.min(doc.modeFrontier, n);\n    if (doc.highlightFrontier < n - 10) { return }\n    var start = doc.first;\n    for (var line = n - 1; line > start; line--) {\n      var saved = getLine(doc, line).stateAfter;\n      // change is on 3\n      // state on line 1 looked ahead 2 -- so saw 3\n      // test 1 + 2 < 3 should cover this\n      if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {\n        start = line + 1;\n        break\n      }\n    }\n    doc.highlightFrontier = Math.min(doc.highlightFrontier, start);\n  }\n\n  // Optimize some code when these features are not used.\n  var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n  function seeReadOnlySpans() {\n    sawReadOnlySpans = true;\n  }\n\n  function seeCollapsedSpans() {\n    sawCollapsedSpans = true;\n  }\n\n  // TEXTMARKER SPANS\n\n  function MarkedSpan(marker, from, to) {\n    this.marker = marker;\n    this.from = from; this.to = to;\n  }\n\n  // Search an array of spans for a span matching the given marker.\n  function getMarkedSpanFor(spans, marker) {\n    if (spans) { for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.marker == marker) { return span }\n    } }\n  }\n\n  // Remove a span from an array, returning undefined if no spans are\n  // left (we don't store arrays for lines without spans).\n  function removeMarkedSpan(spans, span) {\n    var r;\n    for (var i = 0; i < spans.length; ++i)\n      { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }\n    return r\n  }\n\n  // Add a span to a line.\n  function addMarkedSpan(line, span, op) {\n    var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet));\n    if (inThisOp && inThisOp.has(line.markedSpans)) {\n      line.markedSpans.push(span);\n    } else {\n      line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n      if (inThisOp) { inThisOp.add(line.markedSpans); }\n    }\n    span.marker.attachLine(line);\n  }\n\n  // Used for the algorithm that adjusts markers for a change in the\n  // document. These functions cut an array of spans at a given\n  // character position, returning an array of remaining chunks (or\n  // undefined if nothing remains).\n  function markedSpansBefore(old, startCh, isInsert) {\n    var nw;\n    if (old) { for (var i = 0; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n      if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)\n        ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n      }\n    } }\n    return nw\n  }\n  function markedSpansAfter(old, endCh, isInsert) {\n    var nw;\n    if (old) { for (var i = 0; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n      if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)\n        ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n                                              span.to == null ? null : span.to - endCh));\n      }\n    } }\n    return nw\n  }\n\n  // Given a change object, compute the new set of marker spans that\n  // cover the line in which the change took place. Removes spans\n  // entirely within the change, reconnects spans belonging to the\n  // same marker that appear on both sides of the change, and cuts off\n  // spans partially within the change. Returns an array of span\n  // arrays with one element for each line in (after) the change.\n  function stretchSpansOverChange(doc, change) {\n    if (change.full) { return null }\n    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n    if (!oldFirst && !oldLast) { return null }\n\n    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n    // Get the spans that 'stick out' on both sides\n    var first = markedSpansBefore(oldFirst, startCh, isInsert);\n    var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n    // Next, merge those two ends\n    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n    if (first) {\n      // Fix up .to properties of first\n      for (var i = 0; i < first.length; ++i) {\n        var span = first[i];\n        if (span.to == null) {\n          var found = getMarkedSpanFor(last, span.marker);\n          if (!found) { span.to = startCh; }\n          else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }\n        }\n      }\n    }\n    if (last) {\n      // Fix up .from in last (or move them into first in case of sameLine)\n      for (var i$1 = 0; i$1 < last.length; ++i$1) {\n        var span$1 = last[i$1];\n        if (span$1.to != null) { span$1.to += offset; }\n        if (span$1.from == null) {\n          var found$1 = getMarkedSpanFor(first, span$1.marker);\n          if (!found$1) {\n            span$1.from = offset;\n            if (sameLine) { (first || (first = [])).push(span$1); }\n          }\n        } else {\n          span$1.from += offset;\n          if (sameLine) { (first || (first = [])).push(span$1); }\n        }\n      }\n    }\n    // Make sure we didn't create any zero-length spans\n    if (first) { first = clearEmptySpans(first); }\n    if (last && last != first) { last = clearEmptySpans(last); }\n\n    var newMarkers = [first];\n    if (!sameLine) {\n      // Fill gap with whole-line-spans\n      var gap = change.text.length - 2, gapMarkers;\n      if (gap > 0 && first)\n        { for (var i$2 = 0; i$2 < first.length; ++i$2)\n          { if (first[i$2].to == null)\n            { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }\n      for (var i$3 = 0; i$3 < gap; ++i$3)\n        { newMarkers.push(gapMarkers); }\n      newMarkers.push(last);\n    }\n    return newMarkers\n  }\n\n  // Remove spans that are empty and don't have a clearWhenEmpty\n  // option of false.\n  function clearEmptySpans(spans) {\n    for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n        { spans.splice(i--, 1); }\n    }\n    if (!spans.length) { return null }\n    return spans\n  }\n\n  // Used to 'clip' out readOnly ranges when making a change.\n  function removeReadOnlyRanges(doc, from, to) {\n    var markers = null;\n    doc.iter(from.line, to.line + 1, function (line) {\n      if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n        var mark = line.markedSpans[i].marker;\n        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n          { (markers || (markers = [])).push(mark); }\n      } }\n    });\n    if (!markers) { return null }\n    var parts = [{from: from, to: to}];\n    for (var i = 0; i < markers.length; ++i) {\n      var mk = markers[i], m = mk.find(0);\n      for (var j = 0; j < parts.length; ++j) {\n        var p = parts[j];\n        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }\n        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n          { newParts.push({from: p.from, to: m.from}); }\n        if (dto > 0 || !mk.inclusiveRight && !dto)\n          { newParts.push({from: m.to, to: p.to}); }\n        parts.splice.apply(parts, newParts);\n        j += newParts.length - 3;\n      }\n    }\n    return parts\n  }\n\n  // Connect or disconnect spans from a line.\n  function detachMarkedSpans(line) {\n    var spans = line.markedSpans;\n    if (!spans) { return }\n    for (var i = 0; i < spans.length; ++i)\n      { spans[i].marker.detachLine(line); }\n    line.markedSpans = null;\n  }\n  function attachMarkedSpans(line, spans) {\n    if (!spans) { return }\n    for (var i = 0; i < spans.length; ++i)\n      { spans[i].marker.attachLine(line); }\n    line.markedSpans = spans;\n  }\n\n  // Helpers used when computing which overlapping collapsed span\n  // counts as the larger one.\n  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }\n  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }\n\n  // Returns a number indicating which of two overlapping collapsed\n  // spans is larger (and thus includes the other). Falls back to\n  // comparing ids when the spans cover exactly the same range.\n  function compareCollapsedMarkers(a, b) {\n    var lenDiff = a.lines.length - b.lines.length;\n    if (lenDiff != 0) { return lenDiff }\n    var aPos = a.find(), bPos = b.find();\n    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n    if (fromCmp) { return -fromCmp }\n    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n    if (toCmp) { return toCmp }\n    return b.id - a.id\n  }\n\n  // Find out whether a line ends or starts in a collapsed span. If\n  // so, return the marker for that span.\n  function collapsedSpanAtSide(line, start) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n        { found = sp.marker; }\n    } }\n    return found\n  }\n  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }\n  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }\n\n  function collapsedSpanAround(line, ch) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) { for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }\n    } }\n    return found\n  }\n\n  // Test whether there exists a collapsed span that partially\n  // overlaps (covers the start or end, but not both) of a new span.\n  // Such overlap is not allowed.\n  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n    var line = getLine(doc, lineNo);\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) { for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (!sp.marker.collapsed) { continue }\n      var found = sp.marker.find(0);\n      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }\n      if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||\n          fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))\n        { return true }\n    } }\n  }\n\n  // A visual line is a line as drawn on the screen. Folding, for\n  // example, can cause multiple logical lines to appear on the same\n  // visual line. This finds the start of the visual line that the\n  // given line is part of (usually that is the line itself).\n  function visualLine(line) {\n    var merged;\n    while (merged = collapsedSpanAtStart(line))\n      { line = merged.find(-1, true).line; }\n    return line\n  }\n\n  function visualLineEnd(line) {\n    var merged;\n    while (merged = collapsedSpanAtEnd(line))\n      { line = merged.find(1, true).line; }\n    return line\n  }\n\n  // Returns an array of logical lines that continue the visual line\n  // started by the argument, or undefined if there are no such lines.\n  function visualLineContinued(line) {\n    var merged, lines;\n    while (merged = collapsedSpanAtEnd(line)) {\n      line = merged.find(1, true).line\n      ;(lines || (lines = [])).push(line);\n    }\n    return lines\n  }\n\n  // Get the line number of the start of the visual line that the\n  // given line number is part of.\n  function visualLineNo(doc, lineN) {\n    var line = getLine(doc, lineN), vis = visualLine(line);\n    if (line == vis) { return lineN }\n    return lineNo(vis)\n  }\n\n  // Get the line number of the start of the next visual line after\n  // the given line.\n  function visualLineEndNo(doc, lineN) {\n    if (lineN > doc.lastLine()) { return lineN }\n    var line = getLine(doc, lineN), merged;\n    if (!lineIsHidden(doc, line)) { return lineN }\n    while (merged = collapsedSpanAtEnd(line))\n      { line = merged.find(1, true).line; }\n    return lineNo(line) + 1\n  }\n\n  // Compute whether a line is hidden. Lines count as hidden when they\n  // are part of a visual line that starts with another line, or when\n  // they are entirely covered by collapsed, non-widget span.\n  function lineIsHidden(doc, line) {\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (!sp.marker.collapsed) { continue }\n      if (sp.from == null) { return true }\n      if (sp.marker.widgetNode) { continue }\n      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n        { return true }\n    } }\n  }\n  function lineIsHiddenInner(doc, line, span) {\n    if (span.to == null) {\n      var end = span.marker.find(1, true);\n      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))\n    }\n    if (span.marker.inclusiveRight && span.to == line.text.length)\n      { return true }\n    for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {\n      sp = line.markedSpans[i];\n      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n          (sp.to == null || sp.to != span.from) &&\n          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n          lineIsHiddenInner(doc, line, sp)) { return true }\n    }\n  }\n\n  // Find the height above the given line.\n  function heightAtLine(lineObj) {\n    lineObj = visualLine(lineObj);\n\n    var h = 0, chunk = lineObj.parent;\n    for (var i = 0; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i];\n      if (line == lineObj) { break }\n      else { h += line.height; }\n    }\n    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n      for (var i$1 = 0; i$1 < p.children.length; ++i$1) {\n        var cur = p.children[i$1];\n        if (cur == chunk) { break }\n        else { h += cur.height; }\n      }\n    }\n    return h\n  }\n\n  // Compute the character length of a line, taking into account\n  // collapsed ranges (see markText) that might hide parts, and join\n  // other lines onto it.\n  function lineLength(line) {\n    if (line.height == 0) { return 0 }\n    var len = line.text.length, merged, cur = line;\n    while (merged = collapsedSpanAtStart(cur)) {\n      var found = merged.find(0, true);\n      cur = found.from.line;\n      len += found.from.ch - found.to.ch;\n    }\n    cur = line;\n    while (merged = collapsedSpanAtEnd(cur)) {\n      var found$1 = merged.find(0, true);\n      len -= cur.text.length - found$1.from.ch;\n      cur = found$1.to.line;\n      len += cur.text.length - found$1.to.ch;\n    }\n    return len\n  }\n\n  // Find the longest line in the document.\n  function findMaxLine(cm) {\n    var d = cm.display, doc = cm.doc;\n    d.maxLine = getLine(doc, doc.first);\n    d.maxLineLength = lineLength(d.maxLine);\n    d.maxLineChanged = true;\n    doc.iter(function (line) {\n      var len = lineLength(line);\n      if (len > d.maxLineLength) {\n        d.maxLineLength = len;\n        d.maxLine = line;\n      }\n    });\n  }\n\n  // LINE DATA STRUCTURE\n\n  // Line objects. These hold state related to a line, including\n  // highlighting info (the styles array).\n  var Line = function(text, markedSpans, estimateHeight) {\n    this.text = text;\n    attachMarkedSpans(this, markedSpans);\n    this.height = estimateHeight ? estimateHeight(this) : 1;\n  };\n\n  Line.prototype.lineNo = function () { return lineNo(this) };\n  eventMixin(Line);\n\n  // Change the content (text, markers) of a line. Automatically\n  // invalidates cached information and tries to re-estimate the\n  // line's height.\n  function updateLine(line, text, markedSpans, estimateHeight) {\n    line.text = text;\n    if (line.stateAfter) { line.stateAfter = null; }\n    if (line.styles) { line.styles = null; }\n    if (line.order != null) { line.order = null; }\n    detachMarkedSpans(line);\n    attachMarkedSpans(line, markedSpans);\n    var estHeight = estimateHeight ? estimateHeight(line) : 1;\n    if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n  }\n\n  // Detach a line from the document tree and its markers.\n  function cleanUpLine(line) {\n    line.parent = null;\n    detachMarkedSpans(line);\n  }\n\n  // Convert a style as returned by a mode (either null, or a string\n  // containing one or more styles) to a CSS style. This is cached,\n  // and also looks for line-wide styles.\n  var styleToClassCache = {}, styleToClassCacheWithMode = {};\n  function interpretTokenStyle(style, options) {\n    if (!style || /^\\s*$/.test(style)) { return null }\n    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n    return cache[style] ||\n      (cache[style] = style.replace(/\\S+/g, \"cm-$&\"))\n  }\n\n  // Render the DOM representation of the text of a line. Also builds\n  // up a 'line map', which points at the DOM nodes that represent\n  // specific stretches of text, and is used by the measuring code.\n  // The returned object contains the DOM node, this map, and\n  // information about line-wide styles that were set by the mode.\n  function buildLineContent(cm, lineView) {\n    // The padding-right forces the element to have a 'border', which\n    // is needed on Webkit to be able to get line-level bounding\n    // rectangles for it (in measureChar).\n    var content = eltP(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n    var builder = {pre: eltP(\"pre\", [content], \"CodeMirror-line\"), content: content,\n                   col: 0, pos: 0, cm: cm,\n                   trailingSpace: false,\n                   splitSpaces: cm.getOption(\"lineWrapping\")};\n    lineView.measure = {};\n\n    // Iterate over the logical lines that make up this visual line.\n    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n      var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);\n      builder.pos = 0;\n      builder.addToken = buildToken;\n      // Optionally wire in some hacks into the token-rendering\n      // algorithm, to deal with browser quirks.\n      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))\n        { builder.addToken = buildTokenBadBidi(builder.addToken, order); }\n      builder.map = [];\n      var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);\n      insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));\n      if (line.styleClasses) {\n        if (line.styleClasses.bgClass)\n          { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\"); }\n        if (line.styleClasses.textClass)\n          { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\"); }\n      }\n\n      // Ensure at least a single node is present, for measuring.\n      if (builder.map.length == 0)\n        { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }\n\n      // Store the map and a cache object for the current logical line\n      if (i == 0) {\n        lineView.measure.map = builder.map;\n        lineView.measure.cache = {};\n      } else {\n  (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)\n        ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});\n      }\n    }\n\n    // See issue #2901\n    if (webkit) {\n      var last = builder.content.lastChild;\n      if (/\\bcm-tab\\b/.test(last.className) || (last.querySelector && last.querySelector(\".cm-tab\")))\n        { builder.content.className = \"cm-tab-wrap-hack\"; }\n    }\n\n    signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n    if (builder.pre.className)\n      { builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\"); }\n\n    return builder\n  }\n\n  function defaultSpecialCharPlaceholder(ch) {\n    var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n    token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n    token.setAttribute(\"aria-label\", token.title);\n    return token\n  }\n\n  // Build up the DOM representation for a single token, and add it to\n  // the line map. Takes care to render special characters separately.\n  function buildToken(builder, text, style, startStyle, endStyle, css, attributes) {\n    if (!text) { return }\n    var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;\n    var special = builder.cm.state.specialChars, mustWrap = false;\n    var content;\n    if (!special.test(text)) {\n      builder.col += text.length;\n      content = document.createTextNode(displayText);\n      builder.map.push(builder.pos, builder.pos + text.length, content);\n      if (ie && ie_version < 9) { mustWrap = true; }\n      builder.pos += text.length;\n    } else {\n      content = document.createDocumentFragment();\n      var pos = 0;\n      while (true) {\n        special.lastIndex = pos;\n        var m = special.exec(text);\n        var skipped = m ? m.index - pos : text.length - pos;\n        if (skipped) {\n          var txt = document.createTextNode(displayText.slice(pos, pos + skipped));\n          if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt])); }\n          else { content.appendChild(txt); }\n          builder.map.push(builder.pos, builder.pos + skipped, txt);\n          builder.col += skipped;\n          builder.pos += skipped;\n        }\n        if (!m) { break }\n        pos += skipped + 1;\n        var txt$1 = (void 0);\n        if (m[0] == \"\\t\") {\n          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n          txt$1 = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n          txt$1.setAttribute(\"role\", \"presentation\");\n          txt$1.setAttribute(\"cm-text\", \"\\t\");\n          builder.col += tabWidth;\n        } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n          txt$1 = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"));\n          txt$1.setAttribute(\"cm-text\", m[0]);\n          builder.col += 1;\n        } else {\n          txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);\n          txt$1.setAttribute(\"cm-text\", m[0]);\n          if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt$1])); }\n          else { content.appendChild(txt$1); }\n          builder.col += 1;\n        }\n        builder.map.push(builder.pos, builder.pos + 1, txt$1);\n        builder.pos++;\n      }\n    }\n    builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;\n    if (style || startStyle || endStyle || mustWrap || css || attributes) {\n      var fullStyle = style || \"\";\n      if (startStyle) { fullStyle += startStyle; }\n      if (endStyle) { fullStyle += endStyle; }\n      var token = elt(\"span\", [content], fullStyle, css);\n      if (attributes) {\n        for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != \"style\" && attr != \"class\")\n          { token.setAttribute(attr, attributes[attr]); } }\n      }\n      return builder.content.appendChild(token)\n    }\n    builder.content.appendChild(content);\n  }\n\n  // Change some spaces to NBSP to prevent the browser from collapsing\n  // trailing spaces at the end of a line when rendering text (issue #1362).\n  function splitSpaces(text, trailingBefore) {\n    if (text.length > 1 && !/  /.test(text)) { return text }\n    var spaceBefore = trailingBefore, result = \"\";\n    for (var i = 0; i < text.length; i++) {\n      var ch = text.charAt(i);\n      if (ch == \" \" && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))\n        { ch = \"\\u00a0\"; }\n      result += ch;\n      spaceBefore = ch == \" \";\n    }\n    return result\n  }\n\n  // Work around nonsense dimensions being reported for stretches of\n  // right-to-left text.\n  function buildTokenBadBidi(inner, order) {\n    return function (builder, text, style, startStyle, endStyle, css, attributes) {\n      style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n      var start = builder.pos, end = start + text.length;\n      for (;;) {\n        // Find the part that overlaps with the start of this text\n        var part = (void 0);\n        for (var i = 0; i < order.length; i++) {\n          part = order[i];\n          if (part.to > start && part.from <= start) { break }\n        }\n        if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }\n        inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);\n        startStyle = null;\n        text = text.slice(part.to - start);\n        start = part.to;\n      }\n    }\n  }\n\n  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n    var widget = !ignoreWidget && marker.widgetNode;\n    if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }\n    if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {\n      if (!widget)\n        { widget = builder.content.appendChild(document.createElement(\"span\")); }\n      widget.setAttribute(\"cm-marker\", marker.id);\n    }\n    if (widget) {\n      builder.cm.display.input.setUneditable(widget);\n      builder.content.appendChild(widget);\n    }\n    builder.pos += size;\n    builder.trailingSpace = false;\n  }\n\n  // Outputs a number of spans to make up a line, taking highlighting\n  // and marked text into account.\n  function insertLineContent(line, builder, styles) {\n    var spans = line.markedSpans, allText = line.text, at = 0;\n    if (!spans) {\n      for (var i$1 = 1; i$1 < styles.length; i$1+=2)\n        { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }\n      return\n    }\n\n    var len = allText.length, pos = 0, i = 1, text = \"\", style, css;\n    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;\n    for (;;) {\n      if (nextChange == pos) { // Update current marker set\n        spanStyle = spanEndStyle = spanStartStyle = css = \"\";\n        attributes = null;\n        collapsed = null; nextChange = Infinity;\n        var foundBookmarks = [], endStyles = (void 0);\n        for (var j = 0; j < spans.length; ++j) {\n          var sp = spans[j], m = sp.marker;\n          if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n            foundBookmarks.push(m);\n          } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n            if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n              nextChange = sp.to;\n              spanEndStyle = \"\";\n            }\n            if (m.className) { spanStyle += \" \" + m.className; }\n            if (m.css) { css = (css ? css + \";\" : \"\") + m.css; }\n            if (m.startStyle && sp.from == pos) { spanStartStyle += \" \" + m.startStyle; }\n            if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }\n            // support for the old title property\n            // https://github.com/codemirror/CodeMirror/pull/5673\n            if (m.title) { (attributes || (attributes = {})).title = m.title; }\n            if (m.attributes) {\n              for (var attr in m.attributes)\n                { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }\n            }\n            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n              { collapsed = sp; }\n          } else if (sp.from > pos && nextChange > sp.from) {\n            nextChange = sp.from;\n          }\n        }\n        if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)\n          { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += \" \" + endStyles[j$1]; } } }\n\n        if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)\n          { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }\n        if (collapsed && (collapsed.from || 0) == pos) {\n          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n                             collapsed.marker, collapsed.from == null);\n          if (collapsed.to == null) { return }\n          if (collapsed.to == pos) { collapsed = false; }\n        }\n      }\n      if (pos >= len) { break }\n\n      var upto = Math.min(len, nextChange);\n      while (true) {\n        if (text) {\n          var end = pos + text.length;\n          if (!collapsed) {\n            var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", css, attributes);\n          }\n          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}\n          pos = end;\n          spanStartStyle = \"\";\n        }\n        text = allText.slice(at, at = styles[i++]);\n        style = interpretTokenStyle(styles[i++], builder.cm.options);\n      }\n    }\n  }\n\n\n  // These objects are used to represent the visible (currently drawn)\n  // part of the document. A LineView may correspond to multiple\n  // logical lines, if those are connected by collapsed ranges.\n  function LineView(doc, line, lineN) {\n    // The starting line\n    this.line = line;\n    // Continuing lines, if any\n    this.rest = visualLineContinued(line);\n    // Number of logical lines in this visual line\n    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n    this.node = this.text = null;\n    this.hidden = lineIsHidden(doc, line);\n  }\n\n  // Create a range of LineView objects for the given lines.\n  function buildViewArray(cm, from, to) {\n    var array = [], nextPos;\n    for (var pos = from; pos < to; pos = nextPos) {\n      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n      nextPos = pos + view.size;\n      array.push(view);\n    }\n    return array\n  }\n\n  var operationGroup = null;\n\n  function pushOperation(op) {\n    if (operationGroup) {\n      operationGroup.ops.push(op);\n    } else {\n      op.ownsGroup = operationGroup = {\n        ops: [op],\n        delayedCallbacks: []\n      };\n    }\n  }\n\n  function fireCallbacksForOps(group) {\n    // Calls delayed callbacks and cursorActivity handlers until no\n    // new ones appear\n    var callbacks = group.delayedCallbacks, i = 0;\n    do {\n      for (; i < callbacks.length; i++)\n        { callbacks[i].call(null); }\n      for (var j = 0; j < group.ops.length; j++) {\n        var op = group.ops[j];\n        if (op.cursorActivityHandlers)\n          { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n            { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }\n      }\n    } while (i < callbacks.length)\n  }\n\n  function finishOperation(op, endCb) {\n    var group = op.ownsGroup;\n    if (!group) { return }\n\n    try { fireCallbacksForOps(group); }\n    finally {\n      operationGroup = null;\n      endCb(group);\n    }\n  }\n\n  var orphanDelayedCallbacks = null;\n\n  // Often, we want to signal events at a point where we are in the\n  // middle of some work, but don't want the handler to start calling\n  // other methods on the editor, which might be in an inconsistent\n  // state or simply not expect any other events to happen.\n  // signalLater looks whether there are any handlers, and schedules\n  // them to be executed when the last operation ends, or, if no\n  // operation is active, when a timeout fires.\n  function signalLater(emitter, type /*, values...*/) {\n    var arr = getHandlers(emitter, type);\n    if (!arr.length) { return }\n    var args = Array.prototype.slice.call(arguments, 2), list;\n    if (operationGroup) {\n      list = operationGroup.delayedCallbacks;\n    } else if (orphanDelayedCallbacks) {\n      list = orphanDelayedCallbacks;\n    } else {\n      list = orphanDelayedCallbacks = [];\n      setTimeout(fireOrphanDelayed, 0);\n    }\n    var loop = function ( i ) {\n      list.push(function () { return arr[i].apply(null, args); });\n    };\n\n    for (var i = 0; i < arr.length; ++i)\n      loop( i );\n  }\n\n  function fireOrphanDelayed() {\n    var delayed = orphanDelayedCallbacks;\n    orphanDelayedCallbacks = null;\n    for (var i = 0; i < delayed.length; ++i) { delayed[i](); }\n  }\n\n  // When an aspect of a line changes, a string is added to\n  // lineView.changes. This updates the relevant part of the line's\n  // DOM structure.\n  function updateLineForChanges(cm, lineView, lineN, dims) {\n    for (var j = 0; j < lineView.changes.length; j++) {\n      var type = lineView.changes[j];\n      if (type == \"text\") { updateLineText(cm, lineView); }\n      else if (type == \"gutter\") { updateLineGutter(cm, lineView, lineN, dims); }\n      else if (type == \"class\") { updateLineClasses(cm, lineView); }\n      else if (type == \"widget\") { updateLineWidgets(cm, lineView, dims); }\n    }\n    lineView.changes = null;\n  }\n\n  // Lines with gutter elements, widgets or a background class need to\n  // be wrapped, and have the extra elements added to the wrapper div\n  function ensureLineWrapped(lineView) {\n    if (lineView.node == lineView.text) {\n      lineView.node = elt(\"div\", null, null, \"position: relative\");\n      if (lineView.text.parentNode)\n        { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }\n      lineView.node.appendChild(lineView.text);\n      if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }\n    }\n    return lineView.node\n  }\n\n  function updateLineBackground(cm, lineView) {\n    var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n    if (cls) { cls += \" CodeMirror-linebackground\"; }\n    if (lineView.background) {\n      if (cls) { lineView.background.className = cls; }\n      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n    } else if (cls) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n      cm.display.input.setUneditable(lineView.background);\n    }\n  }\n\n  // Wrapper around buildLineContent which will reuse the structure\n  // in display.externalMeasured when possible.\n  function getLineContent(cm, lineView) {\n    var ext = cm.display.externalMeasured;\n    if (ext && ext.line == lineView.line) {\n      cm.display.externalMeasured = null;\n      lineView.measure = ext.measure;\n      return ext.built\n    }\n    return buildLineContent(cm, lineView)\n  }\n\n  // Redraw the line's text. Interacts with the background and text\n  // classes because the mode may output tokens that influence these\n  // classes.\n  function updateLineText(cm, lineView) {\n    var cls = lineView.text.className;\n    var built = getLineContent(cm, lineView);\n    if (lineView.text == lineView.node) { lineView.node = built.pre; }\n    lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n    lineView.text = built.pre;\n    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n      lineView.bgClass = built.bgClass;\n      lineView.textClass = built.textClass;\n      updateLineClasses(cm, lineView);\n    } else if (cls) {\n      lineView.text.className = cls;\n    }\n  }\n\n  function updateLineClasses(cm, lineView) {\n    updateLineBackground(cm, lineView);\n    if (lineView.line.wrapClass)\n      { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }\n    else if (lineView.node != lineView.text)\n      { lineView.node.className = \"\"; }\n    var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n    lineView.text.className = textClass || \"\";\n  }\n\n  function updateLineGutter(cm, lineView, lineN, dims) {\n    if (lineView.gutter) {\n      lineView.node.removeChild(lineView.gutter);\n      lineView.gutter = null;\n    }\n    if (lineView.gutterBackground) {\n      lineView.node.removeChild(lineView.gutterBackground);\n      lineView.gutterBackground = null;\n    }\n    if (lineView.line.gutterClass) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.gutterBackground = elt(\"div\", null, \"CodeMirror-gutter-background \" + lineView.line.gutterClass,\n                                      (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px; width: \" + (dims.gutterTotalWidth) + \"px\"));\n      cm.display.input.setUneditable(lineView.gutterBackground);\n      wrap.insertBefore(lineView.gutterBackground, lineView.text);\n    }\n    var markers = lineView.line.gutterMarkers;\n    if (cm.options.lineNumbers || markers) {\n      var wrap$1 = ensureLineWrapped(lineView);\n      var gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"));\n      gutterWrap.setAttribute(\"aria-hidden\", \"true\");\n      cm.display.input.setUneditable(gutterWrap);\n      wrap$1.insertBefore(gutterWrap, lineView.text);\n      if (lineView.line.gutterClass)\n        { gutterWrap.className += \" \" + lineView.line.gutterClass; }\n      if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n        { lineView.lineNumber = gutterWrap.appendChild(\n          elt(\"div\", lineNumberFor(cm.options, lineN),\n              \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n              (\"left: \" + (dims.gutterLeft[\"CodeMirror-linenumbers\"]) + \"px; width: \" + (cm.display.lineNumInnerWidth) + \"px\"))); }\n      if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {\n        var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];\n        if (found)\n          { gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\",\n                                     (\"left: \" + (dims.gutterLeft[id]) + \"px; width: \" + (dims.gutterWidth[id]) + \"px\"))); }\n      } }\n    }\n  }\n\n  function updateLineWidgets(cm, lineView, dims) {\n    if (lineView.alignable) { lineView.alignable = null; }\n    var isWidget = classTest(\"CodeMirror-linewidget\");\n    for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {\n      next = node.nextSibling;\n      if (isWidget.test(node.className)) { lineView.node.removeChild(node); }\n    }\n    insertLineWidgets(cm, lineView, dims);\n  }\n\n  // Build a line's DOM representation from scratch\n  function buildLineElement(cm, lineView, lineN, dims) {\n    var built = getLineContent(cm, lineView);\n    lineView.text = lineView.node = built.pre;\n    if (built.bgClass) { lineView.bgClass = built.bgClass; }\n    if (built.textClass) { lineView.textClass = built.textClass; }\n\n    updateLineClasses(cm, lineView);\n    updateLineGutter(cm, lineView, lineN, dims);\n    insertLineWidgets(cm, lineView, dims);\n    return lineView.node\n  }\n\n  // A lineView may contain multiple logical lines (when merged by\n  // collapsed spans). The widgets for all of them need to be drawn.\n  function insertLineWidgets(cm, lineView, dims) {\n    insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);\n    if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n      { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }\n  }\n\n  function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {\n    if (!line.widgets) { return }\n    var wrap = ensureLineWrapped(lineView);\n    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n      var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\" + (widget.className ? \" \" + widget.className : \"\"));\n      if (!widget.handleMouseEvents) { node.setAttribute(\"cm-ignore-events\", \"true\"); }\n      positionLineWidget(widget, node, lineView, dims);\n      cm.display.input.setUneditable(node);\n      if (allowAbove && widget.above)\n        { wrap.insertBefore(node, lineView.gutter || lineView.text); }\n      else\n        { wrap.appendChild(node); }\n      signalLater(widget, \"redraw\");\n    }\n  }\n\n  function positionLineWidget(widget, node, lineView, dims) {\n    if (widget.noHScroll) {\n  (lineView.alignable || (lineView.alignable = [])).push(node);\n      var width = dims.wrapperWidth;\n      node.style.left = dims.fixedPos + \"px\";\n      if (!widget.coverGutter) {\n        width -= dims.gutterTotalWidth;\n        node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n      }\n      node.style.width = width + \"px\";\n    }\n    if (widget.coverGutter) {\n      node.style.zIndex = 5;\n      node.style.position = \"relative\";\n      if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + \"px\"; }\n    }\n  }\n\n  function widgetHeight(widget) {\n    if (widget.height != null) { return widget.height }\n    var cm = widget.doc.cm;\n    if (!cm) { return 0 }\n    if (!contains(document.body, widget.node)) {\n      var parentStyle = \"position: relative;\";\n      if (widget.coverGutter)\n        { parentStyle += \"margin-left: -\" + cm.display.gutters.offsetWidth + \"px;\"; }\n      if (widget.noHScroll)\n        { parentStyle += \"width: \" + cm.display.wrapper.clientWidth + \"px;\"; }\n      removeChildrenAndAdd(cm.display.measure, elt(\"div\", [widget.node], null, parentStyle));\n    }\n    return widget.height = widget.node.parentNode.offsetHeight\n  }\n\n  // Return true when the given mouse event happened in a widget\n  function eventInWidget(display, e) {\n    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n      if (!n || (n.nodeType == 1 && n.getAttribute(\"cm-ignore-events\") == \"true\") ||\n          (n.parentNode == display.sizer && n != display.mover))\n        { return true }\n    }\n  }\n\n  // POSITION MEASUREMENT\n\n  function paddingTop(display) {return display.lineSpace.offsetTop}\n  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}\n  function paddingH(display) {\n    if (display.cachedPaddingH) { return display.cachedPaddingH }\n    var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\", \"CodeMirror-line-like\"));\n    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n    if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }\n    return data\n  }\n\n  function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }\n  function displayWidth(cm) {\n    return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth\n  }\n  function displayHeight(cm) {\n    return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight\n  }\n\n  // Ensure the lineView.wrapping.heights array is populated. This is\n  // an array of bottom offsets for the lines that make up a drawn\n  // line. When lineWrapping is on, there might be more than one\n  // height.\n  function ensureLineHeights(cm, lineView, rect) {\n    var wrapping = cm.options.lineWrapping;\n    var curWidth = wrapping && displayWidth(cm);\n    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n      var heights = lineView.measure.heights = [];\n      if (wrapping) {\n        lineView.measure.width = curWidth;\n        var rects = lineView.text.firstChild.getClientRects();\n        for (var i = 0; i < rects.length - 1; i++) {\n          var cur = rects[i], next = rects[i + 1];\n          if (Math.abs(cur.bottom - next.bottom) > 2)\n            { heights.push((cur.bottom + next.top) / 2 - rect.top); }\n        }\n      }\n      heights.push(rect.bottom - rect.top);\n    }\n  }\n\n  // Find a line map (mapping character offsets to text nodes) and a\n  // measurement cache for the given line number. (A line view might\n  // contain multiple lines when collapsed ranges are present.)\n  function mapFromLineView(lineView, line, lineN) {\n    if (lineView.line == line)\n      { return {map: lineView.measure.map, cache: lineView.measure.cache} }\n    if (lineView.rest) {\n      for (var i = 0; i < lineView.rest.length; i++)\n        { if (lineView.rest[i] == line)\n          { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }\n      for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)\n        { if (lineNo(lineView.rest[i$1]) > lineN)\n          { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }\n    }\n  }\n\n  // Render a line into the hidden node display.externalMeasured. Used\n  // when measurement is needed for a line that's not in the viewport.\n  function updateExternalMeasurement(cm, line) {\n    line = visualLine(line);\n    var lineN = lineNo(line);\n    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n    view.lineN = lineN;\n    var built = view.built = buildLineContent(cm, view);\n    view.text = built.pre;\n    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n    return view\n  }\n\n  // Get a {top, bottom, left, right} box (in line-local coordinates)\n  // for a given character.\n  function measureChar(cm, line, ch, bias) {\n    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)\n  }\n\n  // Find a line view that corresponds to the given line number.\n  function findViewForLine(cm, lineN) {\n    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n      { return cm.display.view[findViewIndex(cm, lineN)] }\n    var ext = cm.display.externalMeasured;\n    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n      { return ext }\n  }\n\n  // Measurement can be split in two steps, the set-up work that\n  // applies to the whole line, and the measurement of the actual\n  // character. Functions like coordsChar, that need to do a lot of\n  // measurements in a row, can thus ensure that the set-up work is\n  // only done once.\n  function prepareMeasureForLine(cm, line) {\n    var lineN = lineNo(line);\n    var view = findViewForLine(cm, lineN);\n    if (view && !view.text) {\n      view = null;\n    } else if (view && view.changes) {\n      updateLineForChanges(cm, view, lineN, getDimensions(cm));\n      cm.curOp.forceUpdate = true;\n    }\n    if (!view)\n      { view = updateExternalMeasurement(cm, line); }\n\n    var info = mapFromLineView(view, line, lineN);\n    return {\n      line: line, view: view, rect: null,\n      map: info.map, cache: info.cache, before: info.before,\n      hasHeights: false\n    }\n  }\n\n  // Given a prepared measurement object, measures the position of an\n  // actual character (or fetches it from the cache).\n  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n    if (prepared.before) { ch = -1; }\n    var key = ch + (bias || \"\"), found;\n    if (prepared.cache.hasOwnProperty(key)) {\n      found = prepared.cache[key];\n    } else {\n      if (!prepared.rect)\n        { prepared.rect = prepared.view.text.getBoundingClientRect(); }\n      if (!prepared.hasHeights) {\n        ensureLineHeights(cm, prepared.view, prepared.rect);\n        prepared.hasHeights = true;\n      }\n      found = measureCharInner(cm, prepared, ch, bias);\n      if (!found.bogus) { prepared.cache[key] = found; }\n    }\n    return {left: found.left, right: found.right,\n            top: varHeight ? found.rtop : found.top,\n            bottom: varHeight ? found.rbottom : found.bottom}\n  }\n\n  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n  function nodeAndOffsetInLineMap(map, ch, bias) {\n    var node, start, end, collapse, mStart, mEnd;\n    // First, search the line map for the text node corresponding to,\n    // or closest to, the target character.\n    for (var i = 0; i < map.length; i += 3) {\n      mStart = map[i];\n      mEnd = map[i + 1];\n      if (ch < mStart) {\n        start = 0; end = 1;\n        collapse = \"left\";\n      } else if (ch < mEnd) {\n        start = ch - mStart;\n        end = start + 1;\n      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n        end = mEnd - mStart;\n        start = end - 1;\n        if (ch >= mEnd) { collapse = \"right\"; }\n      }\n      if (start != null) {\n        node = map[i + 2];\n        if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n          { collapse = bias; }\n        if (bias == \"left\" && start == 0)\n          { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n            node = map[(i -= 3) + 2];\n            collapse = \"left\";\n          } }\n        if (bias == \"right\" && start == mEnd - mStart)\n          { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n            node = map[(i += 3) + 2];\n            collapse = \"right\";\n          } }\n        break\n      }\n    }\n    return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}\n  }\n\n  function getUsefulRect(rects, bias) {\n    var rect = nullRect;\n    if (bias == \"left\") { for (var i = 0; i < rects.length; i++) {\n      if ((rect = rects[i]).left != rect.right) { break }\n    } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {\n      if ((rect = rects[i$1]).left != rect.right) { break }\n    } }\n    return rect\n  }\n\n  function measureCharInner(cm, prepared, ch, bias) {\n    var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);\n    var node = place.node, start = place.start, end = place.end, collapse = place.collapse;\n\n    var rect;\n    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n      for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n        while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }\n        while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }\n        if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)\n          { rect = node.parentNode.getBoundingClientRect(); }\n        else\n          { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }\n        if (rect.left || rect.right || start == 0) { break }\n        end = start;\n        start = start - 1;\n        collapse = \"right\";\n      }\n      if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }\n    } else { // If it is a widget, simply get the box for the whole widget.\n      if (start > 0) { collapse = bias = \"right\"; }\n      var rects;\n      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n        { rect = rects[bias == \"right\" ? rects.length - 1 : 0]; }\n      else\n        { rect = node.getBoundingClientRect(); }\n    }\n    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n      var rSpan = node.parentNode.getClientRects()[0];\n      if (rSpan)\n        { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }\n      else\n        { rect = nullRect; }\n    }\n\n    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;\n    var mid = (rtop + rbot) / 2;\n    var heights = prepared.view.measure.heights;\n    var i = 0;\n    for (; i < heights.length - 1; i++)\n      { if (mid < heights[i]) { break } }\n    var top = i ? heights[i - 1] : 0, bot = heights[i];\n    var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n                  right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n                  top: top, bottom: bot};\n    if (!rect.left && !rect.right) { result.bogus = true; }\n    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }\n\n    return result\n  }\n\n  // Work around problem with bounding client rects on ranges being\n  // returned incorrectly when zoomed on IE10 and below.\n  function maybeUpdateRectForZooming(measure, rect) {\n    if (!window.screen || screen.logicalXDPI == null ||\n        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n      { return rect }\n    var scaleX = screen.logicalXDPI / screen.deviceXDPI;\n    var scaleY = screen.logicalYDPI / screen.deviceYDPI;\n    return {left: rect.left * scaleX, right: rect.right * scaleX,\n            top: rect.top * scaleY, bottom: rect.bottom * scaleY}\n  }\n\n  function clearLineMeasurementCacheFor(lineView) {\n    if (lineView.measure) {\n      lineView.measure.cache = {};\n      lineView.measure.heights = null;\n      if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n        { lineView.measure.caches[i] = {}; } }\n    }\n  }\n\n  function clearLineMeasurementCache(cm) {\n    cm.display.externalMeasure = null;\n    removeChildren(cm.display.lineMeasure);\n    for (var i = 0; i < cm.display.view.length; i++)\n      { clearLineMeasurementCacheFor(cm.display.view[i]); }\n  }\n\n  function clearCaches(cm) {\n    clearLineMeasurementCache(cm);\n    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n    if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }\n    cm.display.lineNumChars = null;\n  }\n\n  function pageScrollX() {\n    // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206\n    // which causes page_Offset and bounding client rects to use\n    // different reference viewports and invalidate our calculations.\n    if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }\n    return window.pageXOffset || (document.documentElement || document.body).scrollLeft\n  }\n  function pageScrollY() {\n    if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }\n    return window.pageYOffset || (document.documentElement || document.body).scrollTop\n  }\n\n  function widgetTopHeight(lineObj) {\n    var ref = visualLine(lineObj);\n    var widgets = ref.widgets;\n    var height = 0;\n    if (widgets) { for (var i = 0; i < widgets.length; ++i) { if (widgets[i].above)\n      { height += widgetHeight(widgets[i]); } } }\n    return height\n  }\n\n  // Converts a {top, bottom, left, right} box from line-local\n  // coordinates into another coordinate system. Context may be one of\n  // \"line\", \"div\" (display.lineDiv), \"local\"./null (editor), \"window\",\n  // or \"page\".\n  function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {\n    if (!includeWidgets) {\n      var height = widgetTopHeight(lineObj);\n      rect.top += height; rect.bottom += height;\n    }\n    if (context == \"line\") { return rect }\n    if (!context) { context = \"local\"; }\n    var yOff = heightAtLine(lineObj);\n    if (context == \"local\") { yOff += paddingTop(cm.display); }\n    else { yOff -= cm.display.viewOffset; }\n    if (context == \"page\" || context == \"window\") {\n      var lOff = cm.display.lineSpace.getBoundingClientRect();\n      yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY());\n      var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX());\n      rect.left += xOff; rect.right += xOff;\n    }\n    rect.top += yOff; rect.bottom += yOff;\n    return rect\n  }\n\n  // Coverts a box from \"div\" coords to another coordinate system.\n  // Context may be \"window\", \"page\", \"div\", or \"local\"./null.\n  function fromCoordSystem(cm, coords, context) {\n    if (context == \"div\") { return coords }\n    var left = coords.left, top = coords.top;\n    // First move into \"page\" coordinate system\n    if (context == \"page\") {\n      left -= pageScrollX();\n      top -= pageScrollY();\n    } else if (context == \"local\" || !context) {\n      var localBox = cm.display.sizer.getBoundingClientRect();\n      left += localBox.left;\n      top += localBox.top;\n    }\n\n    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}\n  }\n\n  function charCoords(cm, pos, context, lineObj, bias) {\n    if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }\n    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)\n  }\n\n  // Returns a box for a given cursor position, which may have an\n  // 'other' property containing the position of the secondary cursor\n  // on a bidi boundary.\n  // A cursor Pos(line, char, \"before\") is on the same visual line as `char - 1`\n  // and after `char - 1` in writing order of `char - 1`\n  // A cursor Pos(line, char, \"after\") is on the same visual line as `char`\n  // and before `char` in writing order of `char`\n  // Examples (upper-case letters are RTL, lower-case are LTR):\n  //     Pos(0, 1, ...)\n  //     before   after\n  // ab     a|b     a|b\n  // aB     a|B     aB|\n  // Ab     |Ab     A|b\n  // AB     B|A     B|A\n  // Every position after the last character on a line is considered to stick\n  // to the last character on the line.\n  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n    lineObj = lineObj || getLine(cm.doc, pos.line);\n    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n    function get(ch, right) {\n      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight);\n      if (right) { m.left = m.right; } else { m.right = m.left; }\n      return intoCoordSystem(cm, lineObj, m, context)\n    }\n    var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;\n    if (ch >= lineObj.text.length) {\n      ch = lineObj.text.length;\n      sticky = \"before\";\n    } else if (ch <= 0) {\n      ch = 0;\n      sticky = \"after\";\n    }\n    if (!order) { return get(sticky == \"before\" ? ch - 1 : ch, sticky == \"before\") }\n\n    function getBidi(ch, partPos, invert) {\n      var part = order[partPos], right = part.level == 1;\n      return get(invert ? ch - 1 : ch, right != invert)\n    }\n    var partPos = getBidiPartAt(order, ch, sticky);\n    var other = bidiOther;\n    var val = getBidi(ch, partPos, sticky == \"before\");\n    if (other != null) { val.other = getBidi(ch, other, sticky != \"before\"); }\n    return val\n  }\n\n  // Used to cheaply estimate the coordinates for a position. Used for\n  // intermediate scroll updates.\n  function estimateCoords(cm, pos) {\n    var left = 0;\n    pos = clipPos(cm.doc, pos);\n    if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }\n    var lineObj = getLine(cm.doc, pos.line);\n    var top = heightAtLine(lineObj) + paddingTop(cm.display);\n    return {left: left, right: left, top: top, bottom: top + lineObj.height}\n  }\n\n  // Positions returned by coordsChar contain some extra information.\n  // xRel is the relative x position of the input coordinates compared\n  // to the found position (so xRel > 0 means the coordinates are to\n  // the right of the character position, for example). When outside\n  // is true, that means the coordinates lie outside the line's\n  // vertical range.\n  function PosWithInfo(line, ch, sticky, outside, xRel) {\n    var pos = Pos(line, ch, sticky);\n    pos.xRel = xRel;\n    if (outside) { pos.outside = outside; }\n    return pos\n  }\n\n  // Compute the character position closest to the given coordinates.\n  // Input must be lineSpace-local (\"div\" coordinate system).\n  function coordsChar(cm, x, y) {\n    var doc = cm.doc;\n    y += cm.display.viewOffset;\n    if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) }\n    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n    if (lineN > last)\n      { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) }\n    if (x < 0) { x = 0; }\n\n    var lineObj = getLine(doc, lineN);\n    for (;;) {\n      var found = coordsCharInner(cm, lineObj, lineN, x, y);\n      var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));\n      if (!collapsed) { return found }\n      var rangeEnd = collapsed.find(1);\n      if (rangeEnd.line == lineN) { return rangeEnd }\n      lineObj = getLine(doc, lineN = rangeEnd.line);\n    }\n  }\n\n  function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {\n    y -= widgetTopHeight(lineObj);\n    var end = lineObj.text.length;\n    var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);\n    end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);\n    return {begin: begin, end: end}\n  }\n\n  function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {\n    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n    var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), \"line\").top;\n    return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)\n  }\n\n  // Returns true if the given side of a box is after the given\n  // coordinates, in top-to-bottom, left-to-right order.\n  function boxIsAfter(box, x, y, left) {\n    return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x\n  }\n\n  function coordsCharInner(cm, lineObj, lineNo, x, y) {\n    // Move y into line-local coordinate space\n    y -= heightAtLine(lineObj);\n    var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n    // When directly calling `measureCharPrepared`, we have to adjust\n    // for the widgets at this line.\n    var widgetHeight = widgetTopHeight(lineObj);\n    var begin = 0, end = lineObj.text.length, ltr = true;\n\n    var order = getOrder(lineObj, cm.doc.direction);\n    // If the line isn't plain left-to-right text, first figure out\n    // which bidi section the coordinates fall into.\n    if (order) {\n      var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)\n                   (cm, lineObj, lineNo, preparedMeasure, order, x, y);\n      ltr = part.level != 1;\n      // The awkward -1 offsets are needed because findFirst (called\n      // on these below) will treat its first bound as inclusive,\n      // second as exclusive, but we want to actually address the\n      // characters in the part's range\n      begin = ltr ? part.from : part.to - 1;\n      end = ltr ? part.to : part.from - 1;\n    }\n\n    // A binary search to find the first character whose bounding box\n    // starts after the coordinates. If we run across any whose box wrap\n    // the coordinates, store that.\n    var chAround = null, boxAround = null;\n    var ch = findFirst(function (ch) {\n      var box = measureCharPrepared(cm, preparedMeasure, ch);\n      box.top += widgetHeight; box.bottom += widgetHeight;\n      if (!boxIsAfter(box, x, y, false)) { return false }\n      if (box.top <= y && box.left <= x) {\n        chAround = ch;\n        boxAround = box;\n      }\n      return true\n    }, begin, end);\n\n    var baseX, sticky, outside = false;\n    // If a box around the coordinates was found, use that\n    if (boxAround) {\n      // Distinguish coordinates nearer to the left or right side of the box\n      var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;\n      ch = chAround + (atStart ? 0 : 1);\n      sticky = atStart ? \"after\" : \"before\";\n      baseX = atLeft ? boxAround.left : boxAround.right;\n    } else {\n      // (Adjust for extended bound, if necessary.)\n      if (!ltr && (ch == end || ch == begin)) { ch++; }\n      // To determine which side to associate with, get the box to the\n      // left of the character and compare it's vertical position to the\n      // coordinates\n      sticky = ch == 0 ? \"after\" : ch == lineObj.text.length ? \"before\" :\n        (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?\n        \"after\" : \"before\";\n      // Now get accurate coordinates for this place, in order to get a\n      // base X position\n      var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), \"line\", lineObj, preparedMeasure);\n      baseX = coords.left;\n      outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0;\n    }\n\n    ch = skipExtendingChars(lineObj.text, ch, 1);\n    return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)\n  }\n\n  function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {\n    // Bidi parts are sorted left-to-right, and in a non-line-wrapping\n    // situation, we can take this ordering to correspond to the visual\n    // ordering. This finds the first part whose end is after the given\n    // coordinates.\n    var index = findFirst(function (i) {\n      var part = order[i], ltr = part.level != 1;\n      return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? \"before\" : \"after\"),\n                                     \"line\", lineObj, preparedMeasure), x, y, true)\n    }, 0, order.length - 1);\n    var part = order[index];\n    // If this isn't the first part, the part's start is also after\n    // the coordinates, and the coordinates aren't on the same line as\n    // that start, move one part back.\n    if (index > 0) {\n      var ltr = part.level != 1;\n      var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? \"after\" : \"before\"),\n                               \"line\", lineObj, preparedMeasure);\n      if (boxIsAfter(start, x, y, true) && start.top > y)\n        { part = order[index - 1]; }\n    }\n    return part\n  }\n\n  function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {\n    // In a wrapped line, rtl text on wrapping boundaries can do things\n    // that don't correspond to the ordering in our `order` array at\n    // all, so a binary search doesn't work, and we want to return a\n    // part that only spans one line so that the binary search in\n    // coordsCharInner is safe. As such, we first find the extent of the\n    // wrapped line, and then do a flat search in which we discard any\n    // spans that aren't on the line.\n    var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);\n    var begin = ref.begin;\n    var end = ref.end;\n    if (/\\s/.test(lineObj.text.charAt(end - 1))) { end--; }\n    var part = null, closestDist = null;\n    for (var i = 0; i < order.length; i++) {\n      var p = order[i];\n      if (p.from >= end || p.to <= begin) { continue }\n      var ltr = p.level != 1;\n      var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;\n      // Weigh against spans ending before this, so that they are only\n      // picked if nothing ends after\n      var dist = endX < x ? x - endX + 1e9 : endX - x;\n      if (!part || closestDist > dist) {\n        part = p;\n        closestDist = dist;\n      }\n    }\n    if (!part) { part = order[order.length - 1]; }\n    // Clip the part to the wrapped line.\n    if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }\n    if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }\n    return part\n  }\n\n  var measureText;\n  // Compute the default text height.\n  function textHeight(display) {\n    if (display.cachedTextHeight != null) { return display.cachedTextHeight }\n    if (measureText == null) {\n      measureText = elt(\"pre\", null, \"CodeMirror-line-like\");\n      // Measure a bunch of lines, for browsers that compute\n      // fractional heights.\n      for (var i = 0; i < 49; ++i) {\n        measureText.appendChild(document.createTextNode(\"x\"));\n        measureText.appendChild(elt(\"br\"));\n      }\n      measureText.appendChild(document.createTextNode(\"x\"));\n    }\n    removeChildrenAndAdd(display.measure, measureText);\n    var height = measureText.offsetHeight / 50;\n    if (height > 3) { display.cachedTextHeight = height; }\n    removeChildren(display.measure);\n    return height || 1\n  }\n\n  // Compute the default character width.\n  function charWidth(display) {\n    if (display.cachedCharWidth != null) { return display.cachedCharWidth }\n    var anchor = elt(\"span\", \"xxxxxxxxxx\");\n    var pre = elt(\"pre\", [anchor], \"CodeMirror-line-like\");\n    removeChildrenAndAdd(display.measure, pre);\n    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n    if (width > 2) { display.cachedCharWidth = width; }\n    return width || 10\n  }\n\n  // Do a bulk-read of the DOM positions and sizes needed to draw the\n  // view, so that we don't interleave reading and writing to the DOM.\n  function getDimensions(cm) {\n    var d = cm.display, left = {}, width = {};\n    var gutterLeft = d.gutters.clientLeft;\n    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n      var id = cm.display.gutterSpecs[i].className;\n      left[id] = n.offsetLeft + n.clientLeft + gutterLeft;\n      width[id] = n.clientWidth;\n    }\n    return {fixedPos: compensateForHScroll(d),\n            gutterTotalWidth: d.gutters.offsetWidth,\n            gutterLeft: left,\n            gutterWidth: width,\n            wrapperWidth: d.wrapper.clientWidth}\n  }\n\n  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n  // but using getBoundingClientRect to get a sub-pixel-accurate\n  // result.\n  function compensateForHScroll(display) {\n    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left\n  }\n\n  // Returns a function that estimates the height of a line, to use as\n  // first approximation until the line becomes visible (and is thus\n  // properly measurable).\n  function estimateHeight(cm) {\n    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n    return function (line) {\n      if (lineIsHidden(cm.doc, line)) { return 0 }\n\n      var widgetsHeight = 0;\n      if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {\n        if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }\n      } }\n\n      if (wrapping)\n        { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }\n      else\n        { return widgetsHeight + th }\n    }\n  }\n\n  function estimateLineHeights(cm) {\n    var doc = cm.doc, est = estimateHeight(cm);\n    doc.iter(function (line) {\n      var estHeight = est(line);\n      if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n    });\n  }\n\n  // Given a mouse event, find the corresponding position. If liberal\n  // is false, it checks whether a gutter or scrollbar was clicked,\n  // and returns null if it was. forRect is used by rectangular\n  // selections, and tries to estimate a character position even for\n  // coordinates beyond the right of the text.\n  function posFromMouse(cm, e, liberal, forRect) {\n    var display = cm.display;\n    if (!liberal && e_target(e).getAttribute(\"cm-not-content\") == \"true\") { return null }\n\n    var x, y, space = display.lineSpace.getBoundingClientRect();\n    // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n    try { x = e.clientX - space.left; y = e.clientY - space.top; }\n    catch (e$1) { return null }\n    var coords = coordsChar(cm, x, y), line;\n    if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n    }\n    return coords\n  }\n\n  // Find the view element corresponding to a given line. Return null\n  // when the line isn't visible.\n  function findViewIndex(cm, n) {\n    if (n >= cm.display.viewTo) { return null }\n    n -= cm.display.viewFrom;\n    if (n < 0) { return null }\n    var view = cm.display.view;\n    for (var i = 0; i < view.length; i++) {\n      n -= view[i].size;\n      if (n < 0) { return i }\n    }\n  }\n\n  // Updates the display.view data structure for a given change to the\n  // document. From and to are in pre-change coordinates. Lendiff is\n  // the amount of lines added or subtracted by the change. This is\n  // used for changes that span multiple lines, or change the way\n  // lines are divided into visual lines. regLineChange (below)\n  // registers single-line changes.\n  function regChange(cm, from, to, lendiff) {\n    if (from == null) { from = cm.doc.first; }\n    if (to == null) { to = cm.doc.first + cm.doc.size; }\n    if (!lendiff) { lendiff = 0; }\n\n    var display = cm.display;\n    if (lendiff && to < display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers > from))\n      { display.updateLineNumbers = from; }\n\n    cm.curOp.viewChanged = true;\n\n    if (from >= display.viewTo) { // Change after\n      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n        { resetView(cm); }\n    } else if (to <= display.viewFrom) { // Change before\n      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n        resetView(cm);\n      } else {\n        display.viewFrom += lendiff;\n        display.viewTo += lendiff;\n      }\n    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n      resetView(cm);\n    } else if (from <= display.viewFrom) { // Top overlap\n      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cut) {\n        display.view = display.view.slice(cut.index);\n        display.viewFrom = cut.lineN;\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    } else if (to >= display.viewTo) { // Bottom overlap\n      var cut$1 = viewCuttingPoint(cm, from, from, -1);\n      if (cut$1) {\n        display.view = display.view.slice(0, cut$1.index);\n        display.viewTo = cut$1.lineN;\n      } else {\n        resetView(cm);\n      }\n    } else { // Gap in the middle\n      var cutTop = viewCuttingPoint(cm, from, from, -1);\n      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cutTop && cutBot) {\n        display.view = display.view.slice(0, cutTop.index)\n          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n          .concat(display.view.slice(cutBot.index));\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    }\n\n    var ext = display.externalMeasured;\n    if (ext) {\n      if (to < ext.lineN)\n        { ext.lineN += lendiff; }\n      else if (from < ext.lineN + ext.size)\n        { display.externalMeasured = null; }\n    }\n  }\n\n  // Register a change to a single line. Type must be one of \"text\",\n  // \"gutter\", \"class\", \"widget\"\n  function regLineChange(cm, line, type) {\n    cm.curOp.viewChanged = true;\n    var display = cm.display, ext = cm.display.externalMeasured;\n    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n      { display.externalMeasured = null; }\n\n    if (line < display.viewFrom || line >= display.viewTo) { return }\n    var lineView = display.view[findViewIndex(cm, line)];\n    if (lineView.node == null) { return }\n    var arr = lineView.changes || (lineView.changes = []);\n    if (indexOf(arr, type) == -1) { arr.push(type); }\n  }\n\n  // Clear the view.\n  function resetView(cm) {\n    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n    cm.display.view = [];\n    cm.display.viewOffset = 0;\n  }\n\n  function viewCuttingPoint(cm, oldN, newN, dir) {\n    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n      { return {index: index, lineN: newN} }\n    var n = cm.display.viewFrom;\n    for (var i = 0; i < index; i++)\n      { n += view[i].size; }\n    if (n != oldN) {\n      if (dir > 0) {\n        if (index == view.length - 1) { return null }\n        diff = (n + view[index].size) - oldN;\n        index++;\n      } else {\n        diff = n - oldN;\n      }\n      oldN += diff; newN += diff;\n    }\n    while (visualLineNo(cm.doc, newN) != newN) {\n      if (index == (dir < 0 ? 0 : view.length - 1)) { return null }\n      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n      index += dir;\n    }\n    return {index: index, lineN: newN}\n  }\n\n  // Force the view to cover a given range, adding empty view element\n  // or clipping off existing ones as needed.\n  function adjustView(cm, from, to) {\n    var display = cm.display, view = display.view;\n    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n      display.view = buildViewArray(cm, from, to);\n      display.viewFrom = from;\n    } else {\n      if (display.viewFrom > from)\n        { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }\n      else if (display.viewFrom < from)\n        { display.view = display.view.slice(findViewIndex(cm, from)); }\n      display.viewFrom = from;\n      if (display.viewTo < to)\n        { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }\n      else if (display.viewTo > to)\n        { display.view = display.view.slice(0, findViewIndex(cm, to)); }\n    }\n    display.viewTo = to;\n  }\n\n  // Count the number of lines in the view whose DOM representation is\n  // out of date (or nonexistent).\n  function countDirtyView(cm) {\n    var view = cm.display.view, dirty = 0;\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }\n    }\n    return dirty\n  }\n\n  function updateSelection(cm) {\n    cm.display.input.showSelection(cm.display.input.prepareSelection());\n  }\n\n  function prepareSelection(cm, primary) {\n    if ( primary === void 0 ) primary = true;\n\n    var doc = cm.doc, result = {};\n    var curFragment = result.cursors = document.createDocumentFragment();\n    var selFragment = result.selection = document.createDocumentFragment();\n\n    var customCursor = cm.options.$customCursor;\n    if (customCursor) { primary = true; }\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      if (!primary && i == doc.sel.primIndex) { continue }\n      var range = doc.sel.ranges[i];\n      if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue }\n      var collapsed = range.empty();\n      if (customCursor) {\n        var head = customCursor(cm, range);\n        if (head) { drawSelectionCursor(cm, head, curFragment); }\n      } else if (collapsed || cm.options.showCursorWhenSelecting) {\n        drawSelectionCursor(cm, range.head, curFragment);\n      }\n      if (!collapsed)\n        { drawSelectionRange(cm, range, selFragment); }\n    }\n    return result\n  }\n\n  // Draws a cursor for the given range\n  function drawSelectionCursor(cm, head, output) {\n    var pos = cursorCoords(cm, head, \"div\", null, null, !cm.options.singleCursorHeightPerLine);\n\n    var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n    cursor.style.left = pos.left + \"px\";\n    cursor.style.top = pos.top + \"px\";\n    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n    if (/\\bcm-fat-cursor\\b/.test(cm.getWrapperElement().className)) {\n      var charPos = charCoords(cm, head, \"div\", null, null);\n      var width = charPos.right - charPos.left;\n      cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + \"px\";\n    }\n\n    if (pos.other) {\n      // Secondary cursor, shown when on a 'jump' in bi-directional text\n      var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n      otherCursor.style.display = \"\";\n      otherCursor.style.left = pos.other.left + \"px\";\n      otherCursor.style.top = pos.other.top + \"px\";\n      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n    }\n  }\n\n  function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }\n\n  // Draws the given range as a highlighted selection\n  function drawSelectionRange(cm, range, output) {\n    var display = cm.display, doc = cm.doc;\n    var fragment = document.createDocumentFragment();\n    var padding = paddingH(cm.display), leftSide = padding.left;\n    var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;\n    var docLTR = doc.direction == \"ltr\";\n\n    function add(left, top, width, bottom) {\n      if (top < 0) { top = 0; }\n      top = Math.round(top);\n      bottom = Math.round(bottom);\n      fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", (\"position: absolute; left: \" + left + \"px;\\n                             top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) + \"px;\\n                             height: \" + (bottom - top) + \"px\")));\n    }\n\n    function drawForLine(line, fromArg, toArg) {\n      var lineObj = getLine(doc, line);\n      var lineLen = lineObj.text.length;\n      var start, end;\n      function coords(ch, bias) {\n        return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias)\n      }\n\n      function wrapX(pos, dir, side) {\n        var extent = wrappedLineExtentChar(cm, lineObj, null, pos);\n        var prop = (dir == \"ltr\") == (side == \"after\") ? \"left\" : \"right\";\n        var ch = side == \"after\" ? extent.begin : extent.end - (/\\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);\n        return coords(ch, prop)[prop]\n      }\n\n      var order = getOrder(lineObj, doc.direction);\n      iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {\n        var ltr = dir == \"ltr\";\n        var fromPos = coords(from, ltr ? \"left\" : \"right\");\n        var toPos = coords(to - 1, ltr ? \"right\" : \"left\");\n\n        var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;\n        var first = i == 0, last = !order || i == order.length - 1;\n        if (toPos.top - fromPos.top <= 3) { // Single line\n          var openLeft = (docLTR ? openStart : openEnd) && first;\n          var openRight = (docLTR ? openEnd : openStart) && last;\n          var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;\n          var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;\n          add(left, fromPos.top, right - left, fromPos.bottom);\n        } else { // Multiple lines\n          var topLeft, topRight, botLeft, botRight;\n          if (ltr) {\n            topLeft = docLTR && openStart && first ? leftSide : fromPos.left;\n            topRight = docLTR ? rightSide : wrapX(from, dir, \"before\");\n            botLeft = docLTR ? leftSide : wrapX(to, dir, \"after\");\n            botRight = docLTR && openEnd && last ? rightSide : toPos.right;\n          } else {\n            topLeft = !docLTR ? leftSide : wrapX(from, dir, \"before\");\n            topRight = !docLTR && openStart && first ? rightSide : fromPos.right;\n            botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;\n            botRight = !docLTR ? rightSide : wrapX(to, dir, \"after\");\n          }\n          add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);\n          if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }\n          add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);\n        }\n\n        if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }\n        if (cmpCoords(toPos, start) < 0) { start = toPos; }\n        if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }\n        if (cmpCoords(toPos, end) < 0) { end = toPos; }\n      });\n      return {start: start, end: end}\n    }\n\n    var sFrom = range.from(), sTo = range.to();\n    if (sFrom.line == sTo.line) {\n      drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n    } else {\n      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n      var singleVLine = visualLine(fromLine) == visualLine(toLine);\n      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n      if (singleVLine) {\n        if (leftEnd.top < rightStart.top - 2) {\n          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n        } else {\n          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n        }\n      }\n      if (leftEnd.bottom < rightStart.top)\n        { add(leftSide, leftEnd.bottom, null, rightStart.top); }\n    }\n\n    output.appendChild(fragment);\n  }\n\n  // Cursor-blinking\n  function restartBlink(cm) {\n    if (!cm.state.focused) { return }\n    var display = cm.display;\n    clearInterval(display.blinker);\n    var on = true;\n    display.cursorDiv.style.visibility = \"\";\n    if (cm.options.cursorBlinkRate > 0)\n      { display.blinker = setInterval(function () {\n        if (!cm.hasFocus()) { onBlur(cm); }\n        display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\";\n      }, cm.options.cursorBlinkRate); }\n    else if (cm.options.cursorBlinkRate < 0)\n      { display.cursorDiv.style.visibility = \"hidden\"; }\n  }\n\n  function ensureFocus(cm) {\n    if (!cm.hasFocus()) {\n      cm.display.input.focus();\n      if (!cm.state.focused) { onFocus(cm); }\n    }\n  }\n\n  function delayBlurEvent(cm) {\n    cm.state.delayingBlurEvent = true;\n    setTimeout(function () { if (cm.state.delayingBlurEvent) {\n      cm.state.delayingBlurEvent = false;\n      if (cm.state.focused) { onBlur(cm); }\n    } }, 100);\n  }\n\n  function onFocus(cm, e) {\n    if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; }\n\n    if (cm.options.readOnly == \"nocursor\") { return }\n    if (!cm.state.focused) {\n      signal(cm, \"focus\", cm, e);\n      cm.state.focused = true;\n      addClass(cm.display.wrapper, \"CodeMirror-focused\");\n      // This test prevents this from firing when a context\n      // menu is closed (since the input reset would kill the\n      // select-all detection hack)\n      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n        cm.display.input.reset();\n        if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730\n      }\n      cm.display.input.receivedFocus();\n    }\n    restartBlink(cm);\n  }\n  function onBlur(cm, e) {\n    if (cm.state.delayingBlurEvent) { return }\n\n    if (cm.state.focused) {\n      signal(cm, \"blur\", cm, e);\n      cm.state.focused = false;\n      rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n    }\n    clearInterval(cm.display.blinker);\n    setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);\n  }\n\n  // Read the actual heights of the rendered lines, and update their\n  // stored heights to match.\n  function updateHeightsInViewport(cm) {\n    var display = cm.display;\n    var prevBottom = display.lineDiv.offsetTop;\n    var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top);\n    var oldHeight = display.lineDiv.getBoundingClientRect().top;\n    var mustScroll = 0;\n    for (var i = 0; i < display.view.length; i++) {\n      var cur = display.view[i], wrapping = cm.options.lineWrapping;\n      var height = (void 0), width = 0;\n      if (cur.hidden) { continue }\n      oldHeight += cur.line.height;\n      if (ie && ie_version < 8) {\n        var bot = cur.node.offsetTop + cur.node.offsetHeight;\n        height = bot - prevBottom;\n        prevBottom = bot;\n      } else {\n        var box = cur.node.getBoundingClientRect();\n        height = box.bottom - box.top;\n        // Check that lines don't extend past the right of the current\n        // editor width\n        if (!wrapping && cur.text.firstChild)\n          { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; }\n      }\n      var diff = cur.line.height - height;\n      if (diff > .005 || diff < -.005) {\n        if (oldHeight < viewTop) { mustScroll -= diff; }\n        updateLineHeight(cur.line, height);\n        updateWidgetHeight(cur.line);\n        if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)\n          { updateWidgetHeight(cur.rest[j]); } }\n      }\n      if (width > cm.display.sizerWidth) {\n        var chWidth = Math.ceil(width / charWidth(cm.display));\n        if (chWidth > cm.display.maxLineLength) {\n          cm.display.maxLineLength = chWidth;\n          cm.display.maxLine = cur.line;\n          cm.display.maxLineChanged = true;\n        }\n      }\n    }\n    if (Math.abs(mustScroll) > 2) { display.scroller.scrollTop += mustScroll; }\n  }\n\n  // Read and store the height of line widgets associated with the\n  // given line.\n  function updateWidgetHeight(line) {\n    if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) {\n      var w = line.widgets[i], parent = w.node.parentNode;\n      if (parent) { w.height = parent.offsetHeight; }\n    } }\n  }\n\n  // Compute the lines that are visible in a given viewport (defaults\n  // the the current scroll position). viewport may contain top,\n  // height, and ensure (see op.scrollToPos) properties.\n  function visibleLines(display, doc, viewport) {\n    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;\n    top = Math.floor(top - paddingTop(display));\n    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;\n\n    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n    // forces those lines into the viewport (if possible).\n    if (viewport && viewport.ensure) {\n      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;\n      if (ensureFrom < from) {\n        from = ensureFrom;\n        to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);\n      } else if (Math.min(ensureTo, doc.lastLine()) >= to) {\n        from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);\n        to = ensureTo;\n      }\n    }\n    return {from: from, to: Math.max(to, from + 1)}\n  }\n\n  // SCROLLING THINGS INTO VIEW\n\n  // If an editor sits on the top or bottom of the window, partially\n  // scrolled out of view, this ensures that the cursor is visible.\n  function maybeScrollWindow(cm, rect) {\n    if (signalDOMEvent(cm, \"scrollCursorIntoView\")) { return }\n\n    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n    if (rect.top + box.top < 0) { doScroll = true; }\n    else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; }\n    if (doScroll != null && !phantom) {\n      var scrollNode = elt(\"div\", \"\\u200b\", null, (\"position: absolute;\\n                         top: \" + (rect.top - display.viewOffset - paddingTop(cm.display)) + \"px;\\n                         height: \" + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + \"px;\\n                         left: \" + (rect.left) + \"px; width: \" + (Math.max(2, rect.right - rect.left)) + \"px;\"));\n      cm.display.lineSpace.appendChild(scrollNode);\n      scrollNode.scrollIntoView(doScroll);\n      cm.display.lineSpace.removeChild(scrollNode);\n    }\n  }\n\n  // Scroll a given position into view (immediately), verifying that\n  // it actually became visible (as line heights are accurately\n  // measured, the position of something may 'drift' during drawing).\n  function scrollPosIntoView(cm, pos, end, margin) {\n    if (margin == null) { margin = 0; }\n    var rect;\n    if (!cm.options.lineWrapping && pos == end) {\n      // Set pos and end to the cursor positions around the character pos sticks to\n      // If pos.sticky == \"before\", that is around pos.ch - 1, otherwise around pos.ch\n      // If pos == Pos(_, 0, \"before\"), pos and end are unchanged\n      end = pos.sticky == \"before\" ? Pos(pos.line, pos.ch + 1, \"before\") : pos;\n      pos = pos.ch ? Pos(pos.line, pos.sticky == \"before\" ? pos.ch - 1 : pos.ch, \"after\") : pos;\n    }\n    for (var limit = 0; limit < 5; limit++) {\n      var changed = false;\n      var coords = cursorCoords(cm, pos);\n      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n      rect = {left: Math.min(coords.left, endCoords.left),\n              top: Math.min(coords.top, endCoords.top) - margin,\n              right: Math.max(coords.left, endCoords.left),\n              bottom: Math.max(coords.bottom, endCoords.bottom) + margin};\n      var scrollPos = calculateScrollPos(cm, rect);\n      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n      if (scrollPos.scrollTop != null) {\n        updateScrollTop(cm, scrollPos.scrollTop);\n        if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }\n      }\n      if (scrollPos.scrollLeft != null) {\n        setScrollLeft(cm, scrollPos.scrollLeft);\n        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }\n      }\n      if (!changed) { break }\n    }\n    return rect\n  }\n\n  // Scroll a given set of coordinates into view (immediately).\n  function scrollIntoView(cm, rect) {\n    var scrollPos = calculateScrollPos(cm, rect);\n    if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }\n    if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }\n  }\n\n  // Calculate a new scroll position needed to scroll the given\n  // rectangle into view. Returns an object with scrollTop and\n  // scrollLeft properties. When these are undefined, the\n  // vertical/horizontal position does not need to be adjusted.\n  function calculateScrollPos(cm, rect) {\n    var display = cm.display, snapMargin = textHeight(cm.display);\n    if (rect.top < 0) { rect.top = 0; }\n    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n    var screen = displayHeight(cm), result = {};\n    if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }\n    var docBottom = cm.doc.height + paddingVert(display);\n    var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;\n    if (rect.top < screentop) {\n      result.scrollTop = atTop ? 0 : rect.top;\n    } else if (rect.bottom > screentop + screen) {\n      var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);\n      if (newTop != screentop) { result.scrollTop = newTop; }\n    }\n\n    var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth;\n    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace;\n    var screenw = displayWidth(cm) - display.gutters.offsetWidth;\n    var tooWide = rect.right - rect.left > screenw;\n    if (tooWide) { rect.right = rect.left + screenw; }\n    if (rect.left < 10)\n      { result.scrollLeft = 0; }\n    else if (rect.left < screenleft)\n      { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); }\n    else if (rect.right > screenw + screenleft - 3)\n      { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }\n    return result\n  }\n\n  // Store a relative adjustment to the scroll position in the current\n  // operation (to be applied when the operation finishes).\n  function addToScrollTop(cm, top) {\n    if (top == null) { return }\n    resolveScrollToPos(cm);\n    cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n  }\n\n  // Make sure that at the end of the operation the current cursor is\n  // shown.\n  function ensureCursorVisible(cm) {\n    resolveScrollToPos(cm);\n    var cur = cm.getCursor();\n    cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};\n  }\n\n  function scrollToCoords(cm, x, y) {\n    if (x != null || y != null) { resolveScrollToPos(cm); }\n    if (x != null) { cm.curOp.scrollLeft = x; }\n    if (y != null) { cm.curOp.scrollTop = y; }\n  }\n\n  function scrollToRange(cm, range) {\n    resolveScrollToPos(cm);\n    cm.curOp.scrollToPos = range;\n  }\n\n  // When an operation has its scrollToPos property set, and another\n  // scroll action is applied before the end of the operation, this\n  // 'simulates' scrolling that position into view in a cheap way, so\n  // that the effect of intermediate scroll commands is not ignored.\n  function resolveScrollToPos(cm) {\n    var range = cm.curOp.scrollToPos;\n    if (range) {\n      cm.curOp.scrollToPos = null;\n      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);\n      scrollToCoordsRange(cm, from, to, range.margin);\n    }\n  }\n\n  function scrollToCoordsRange(cm, from, to, margin) {\n    var sPos = calculateScrollPos(cm, {\n      left: Math.min(from.left, to.left),\n      top: Math.min(from.top, to.top) - margin,\n      right: Math.max(from.right, to.right),\n      bottom: Math.max(from.bottom, to.bottom) + margin\n    });\n    scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);\n  }\n\n  // Sync the scrollable area and scrollbars, ensure the viewport\n  // covers the visible area.\n  function updateScrollTop(cm, val) {\n    if (Math.abs(cm.doc.scrollTop - val) < 2) { return }\n    if (!gecko) { updateDisplaySimple(cm, {top: val}); }\n    setScrollTop(cm, val, true);\n    if (gecko) { updateDisplaySimple(cm); }\n    startWorker(cm, 100);\n  }\n\n  function setScrollTop(cm, val, forceScroll) {\n    val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val));\n    if (cm.display.scroller.scrollTop == val && !forceScroll) { return }\n    cm.doc.scrollTop = val;\n    cm.display.scrollbars.setScrollTop(val);\n    if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }\n  }\n\n  // Sync scroller and scrollbar, ensure the gutter elements are\n  // aligned.\n  function setScrollLeft(cm, val, isScroller, forceScroll) {\n    val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth));\n    if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }\n    cm.doc.scrollLeft = val;\n    alignHorizontally(cm);\n    if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }\n    cm.display.scrollbars.setScrollLeft(val);\n  }\n\n  // SCROLLBARS\n\n  // Prepare DOM reads needed to update the scrollbars. Done in one\n  // shot to minimize update/measure roundtrips.\n  function measureForScrollbars(cm) {\n    var d = cm.display, gutterW = d.gutters.offsetWidth;\n    var docH = Math.round(cm.doc.height + paddingVert(cm.display));\n    return {\n      clientHeight: d.scroller.clientHeight,\n      viewHeight: d.wrapper.clientHeight,\n      scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,\n      viewWidth: d.wrapper.clientWidth,\n      barLeft: cm.options.fixedGutter ? gutterW : 0,\n      docHeight: docH,\n      scrollHeight: docH + scrollGap(cm) + d.barHeight,\n      nativeBarWidth: d.nativeBarWidth,\n      gutterWidth: gutterW\n    }\n  }\n\n  var NativeScrollbars = function(place, scroll, cm) {\n    this.cm = cm;\n    var vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n    var horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n    vert.tabIndex = horiz.tabIndex = -1;\n    place(vert); place(horiz);\n\n    on(vert, \"scroll\", function () {\n      if (vert.clientHeight) { scroll(vert.scrollTop, \"vertical\"); }\n    });\n    on(horiz, \"scroll\", function () {\n      if (horiz.clientWidth) { scroll(horiz.scrollLeft, \"horizontal\"); }\n    });\n\n    this.checkedZeroWidth = false;\n    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n    if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = \"18px\"; }\n  };\n\n  NativeScrollbars.prototype.update = function (measure) {\n    var needsH = measure.scrollWidth > measure.clientWidth + 1;\n    var needsV = measure.scrollHeight > measure.clientHeight + 1;\n    var sWidth = measure.nativeBarWidth;\n\n    if (needsV) {\n      this.vert.style.display = \"block\";\n      this.vert.style.bottom = needsH ? sWidth + \"px\" : \"0\";\n      var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);\n      // A bug in IE8 can cause this value to be negative, so guard it.\n      this.vert.firstChild.style.height =\n        Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + \"px\";\n    } else {\n      this.vert.scrollTop = 0;\n      this.vert.style.display = \"\";\n      this.vert.firstChild.style.height = \"0\";\n    }\n\n    if (needsH) {\n      this.horiz.style.display = \"block\";\n      this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\";\n      this.horiz.style.left = measure.barLeft + \"px\";\n      var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);\n      this.horiz.firstChild.style.width =\n        Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\";\n    } else {\n      this.horiz.style.display = \"\";\n      this.horiz.firstChild.style.width = \"0\";\n    }\n\n    if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n      if (sWidth == 0) { this.zeroWidthHack(); }\n      this.checkedZeroWidth = true;\n    }\n\n    return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}\n  };\n\n  NativeScrollbars.prototype.setScrollLeft = function (pos) {\n    if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }\n    if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, \"horiz\"); }\n  };\n\n  NativeScrollbars.prototype.setScrollTop = function (pos) {\n    if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }\n    if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, \"vert\"); }\n  };\n\n  NativeScrollbars.prototype.zeroWidthHack = function () {\n    var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n    this.horiz.style.height = this.vert.style.width = w;\n    this.horiz.style.pointerEvents = this.vert.style.pointerEvents = \"none\";\n    this.disableHoriz = new Delayed;\n    this.disableVert = new Delayed;\n  };\n\n  NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {\n    bar.style.pointerEvents = \"auto\";\n    function maybeDisable() {\n      // To find out whether the scrollbar is still visible, we\n      // check whether the element under the pixel in the bottom\n      // right corner of the scrollbar box is the scrollbar box\n      // itself (when the bar is still visible) or its filler child\n      // (when the bar is hidden). If it is still visible, we keep\n      // it enabled, if it's hidden, we disable pointer events.\n      var box = bar.getBoundingClientRect();\n      var elt = type == \"vert\" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)\n          : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);\n      if (elt != bar) { bar.style.pointerEvents = \"none\"; }\n      else { delay.set(1000, maybeDisable); }\n    }\n    delay.set(1000, maybeDisable);\n  };\n\n  NativeScrollbars.prototype.clear = function () {\n    var parent = this.horiz.parentNode;\n    parent.removeChild(this.horiz);\n    parent.removeChild(this.vert);\n  };\n\n  var NullScrollbars = function () {};\n\n  NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };\n  NullScrollbars.prototype.setScrollLeft = function () {};\n  NullScrollbars.prototype.setScrollTop = function () {};\n  NullScrollbars.prototype.clear = function () {};\n\n  function updateScrollbars(cm, measure) {\n    if (!measure) { measure = measureForScrollbars(cm); }\n    var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;\n    updateScrollbarsInner(cm, measure);\n    for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {\n      if (startWidth != cm.display.barWidth && cm.options.lineWrapping)\n        { updateHeightsInViewport(cm); }\n      updateScrollbarsInner(cm, measureForScrollbars(cm));\n      startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;\n    }\n  }\n\n  // Re-synchronize the fake scrollbars with the actual size of the\n  // content.\n  function updateScrollbarsInner(cm, measure) {\n    var d = cm.display;\n    var sizes = d.scrollbars.update(measure);\n\n    d.sizer.style.paddingRight = (d.barWidth = sizes.right) + \"px\";\n    d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + \"px\";\n    d.heightForcer.style.borderBottom = sizes.bottom + \"px solid transparent\";\n\n    if (sizes.right && sizes.bottom) {\n      d.scrollbarFiller.style.display = \"block\";\n      d.scrollbarFiller.style.height = sizes.bottom + \"px\";\n      d.scrollbarFiller.style.width = sizes.right + \"px\";\n    } else { d.scrollbarFiller.style.display = \"\"; }\n    if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n      d.gutterFiller.style.display = \"block\";\n      d.gutterFiller.style.height = sizes.bottom + \"px\";\n      d.gutterFiller.style.width = measure.gutterWidth + \"px\";\n    } else { d.gutterFiller.style.display = \"\"; }\n  }\n\n  var scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars};\n\n  function initScrollbars(cm) {\n    if (cm.display.scrollbars) {\n      cm.display.scrollbars.clear();\n      if (cm.display.scrollbars.addClass)\n        { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n    }\n\n    cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {\n      cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);\n      // Prevent clicks in the scrollbars from killing focus\n      on(node, \"mousedown\", function () {\n        if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }\n      });\n      node.setAttribute(\"cm-not-content\", \"true\");\n    }, function (pos, axis) {\n      if (axis == \"horizontal\") { setScrollLeft(cm, pos); }\n      else { updateScrollTop(cm, pos); }\n    }, cm);\n    if (cm.display.scrollbars.addClass)\n      { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n  }\n\n  // Operations are used to wrap a series of changes to the editor\n  // state in such a way that each change won't have to update the\n  // cursor and display (which would be awkward, slow, and\n  // error-prone). Instead, display updates are batched and then all\n  // combined and executed at once.\n\n  var nextOpId = 0;\n  // Start a new operation.\n  function startOperation(cm) {\n    cm.curOp = {\n      cm: cm,\n      viewChanged: false,      // Flag that indicates that lines might need to be redrawn\n      startHeight: cm.doc.height, // Used to detect need to update scrollbar\n      forceUpdate: false,      // Used to force a redraw\n      updateInput: 0,       // Whether to reset the input textarea\n      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)\n      changeObjs: null,        // Accumulated changes, for firing change events\n      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n      selectionChanged: false, // Whether the selection needs to be redrawn\n      updateMaxLine: false,    // Set when the widest line needs to be determined anew\n      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n      scrollToPos: null,       // Used to scroll to a specific position\n      focus: false,\n      id: ++nextOpId,          // Unique ID\n      markArrays: null         // Used by addMarkedSpan\n    };\n    pushOperation(cm.curOp);\n  }\n\n  // Finish an operation, updating the display and signalling delayed events\n  function endOperation(cm) {\n    var op = cm.curOp;\n    if (op) { finishOperation(op, function (group) {\n      for (var i = 0; i < group.ops.length; i++)\n        { group.ops[i].cm.curOp = null; }\n      endOperations(group);\n    }); }\n  }\n\n  // The DOM updates done when an operation finishes are batched so\n  // that the minimum number of relayouts are required.\n  function endOperations(group) {\n    var ops = group.ops;\n    for (var i = 0; i < ops.length; i++) // Read DOM\n      { endOperation_R1(ops[i]); }\n    for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)\n      { endOperation_W1(ops[i$1]); }\n    for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM\n      { endOperation_R2(ops[i$2]); }\n    for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)\n      { endOperation_W2(ops[i$3]); }\n    for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM\n      { endOperation_finish(ops[i$4]); }\n  }\n\n  function endOperation_R1(op) {\n    var cm = op.cm, display = cm.display;\n    maybeClipScrollbars(cm);\n    if (op.updateMaxLine) { findMaxLine(cm); }\n\n    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n                         op.scrollToPos.to.line >= display.viewTo) ||\n      display.maxLineChanged && cm.options.lineWrapping;\n    op.update = op.mustUpdate &&\n      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n  }\n\n  function endOperation_W1(op) {\n    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);\n  }\n\n  function endOperation_R2(op) {\n    var cm = op.cm, display = cm.display;\n    if (op.updatedDisplay) { updateHeightsInViewport(cm); }\n\n    op.barMeasure = measureForScrollbars(cm);\n\n    // If the max line changed since it was last measured, measure it,\n    // and ensure the document's width matches it.\n    // updateDisplay_W2 will use these properties to do the actual resizing\n    if (display.maxLineChanged && !cm.options.lineWrapping) {\n      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;\n      cm.display.sizerWidth = op.adjustWidthTo;\n      op.barMeasure.scrollWidth =\n        Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);\n      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));\n    }\n\n    if (op.updatedDisplay || op.selectionChanged)\n      { op.preparedSelection = display.input.prepareSelection(); }\n  }\n\n  function endOperation_W2(op) {\n    var cm = op.cm;\n\n    if (op.adjustWidthTo != null) {\n      cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\";\n      if (op.maxScrollLeft < cm.doc.scrollLeft)\n        { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }\n      cm.display.maxLineChanged = false;\n    }\n\n    var takeFocus = op.focus && op.focus == activeElt();\n    if (op.preparedSelection)\n      { cm.display.input.showSelection(op.preparedSelection, takeFocus); }\n    if (op.updatedDisplay || op.startHeight != cm.doc.height)\n      { updateScrollbars(cm, op.barMeasure); }\n    if (op.updatedDisplay)\n      { setDocumentHeight(cm, op.barMeasure); }\n\n    if (op.selectionChanged) { restartBlink(cm); }\n\n    if (cm.state.focused && op.updateInput)\n      { cm.display.input.reset(op.typing); }\n    if (takeFocus) { ensureFocus(op.cm); }\n  }\n\n  function endOperation_finish(op) {\n    var cm = op.cm, display = cm.display, doc = cm.doc;\n\n    if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }\n\n    // Abort mouse wheel delta measurement, when scrolling explicitly\n    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n      { display.wheelStartX = display.wheelStartY = null; }\n\n    // Propagate the scroll position to the actual DOM scroller\n    if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }\n\n    if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }\n    // If we need to scroll a specific position into view, do so.\n    if (op.scrollToPos) {\n      var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n                                   clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n      maybeScrollWindow(cm, rect);\n    }\n\n    // Fire events for markers that are hidden/unidden by editing or\n    // undoing\n    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n    if (hidden) { for (var i = 0; i < hidden.length; ++i)\n      { if (!hidden[i].lines.length) { signal(hidden[i], \"hide\"); } } }\n    if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)\n      { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], \"unhide\"); } } }\n\n    if (display.wrapper.offsetHeight)\n      { doc.scrollTop = cm.display.scroller.scrollTop; }\n\n    // Fire change events, and delayed event handlers\n    if (op.changeObjs)\n      { signal(cm, \"changes\", cm, op.changeObjs); }\n    if (op.update)\n      { op.update.finish(); }\n  }\n\n  // Run the given function in an operation\n  function runInOp(cm, f) {\n    if (cm.curOp) { return f() }\n    startOperation(cm);\n    try { return f() }\n    finally { endOperation(cm); }\n  }\n  // Wraps a function in an operation. Returns the wrapped function.\n  function operation(cm, f) {\n    return function() {\n      if (cm.curOp) { return f.apply(cm, arguments) }\n      startOperation(cm);\n      try { return f.apply(cm, arguments) }\n      finally { endOperation(cm); }\n    }\n  }\n  // Used to add methods to editor and doc instances, wrapping them in\n  // operations.\n  function methodOp(f) {\n    return function() {\n      if (this.curOp) { return f.apply(this, arguments) }\n      startOperation(this);\n      try { return f.apply(this, arguments) }\n      finally { endOperation(this); }\n    }\n  }\n  function docMethodOp(f) {\n    return function() {\n      var cm = this.cm;\n      if (!cm || cm.curOp) { return f.apply(this, arguments) }\n      startOperation(cm);\n      try { return f.apply(this, arguments) }\n      finally { endOperation(cm); }\n    }\n  }\n\n  // HIGHLIGHT WORKER\n\n  function startWorker(cm, time) {\n    if (cm.doc.highlightFrontier < cm.display.viewTo)\n      { cm.state.highlight.set(time, bind(highlightWorker, cm)); }\n  }\n\n  function highlightWorker(cm) {\n    var doc = cm.doc;\n    if (doc.highlightFrontier >= cm.display.viewTo) { return }\n    var end = +new Date + cm.options.workTime;\n    var context = getContextBefore(cm, doc.highlightFrontier);\n    var changedLines = [];\n\n    doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {\n      if (context.line >= cm.display.viewFrom) { // Visible\n        var oldStyles = line.styles;\n        var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;\n        var highlighted = highlightLine(cm, line, context, true);\n        if (resetState) { context.state = resetState; }\n        line.styles = highlighted.styles;\n        var oldCls = line.styleClasses, newCls = highlighted.classes;\n        if (newCls) { line.styleClasses = newCls; }\n        else if (oldCls) { line.styleClasses = null; }\n        var ischange = !oldStyles || oldStyles.length != line.styles.length ||\n          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);\n        for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }\n        if (ischange) { changedLines.push(context.line); }\n        line.stateAfter = context.save();\n        context.nextLine();\n      } else {\n        if (line.text.length <= cm.options.maxHighlightLength)\n          { processLine(cm, line.text, context); }\n        line.stateAfter = context.line % 5 == 0 ? context.save() : null;\n        context.nextLine();\n      }\n      if (+new Date > end) {\n        startWorker(cm, cm.options.workDelay);\n        return true\n      }\n    });\n    doc.highlightFrontier = context.line;\n    doc.modeFrontier = Math.max(doc.modeFrontier, context.line);\n    if (changedLines.length) { runInOp(cm, function () {\n      for (var i = 0; i < changedLines.length; i++)\n        { regLineChange(cm, changedLines[i], \"text\"); }\n    }); }\n  }\n\n  // DISPLAY DRAWING\n\n  var DisplayUpdate = function(cm, viewport, force) {\n    var display = cm.display;\n\n    this.viewport = viewport;\n    // Store some values that we'll need later (but don't want to force a relayout for)\n    this.visible = visibleLines(display, cm.doc, viewport);\n    this.editorIsHidden = !display.wrapper.offsetWidth;\n    this.wrapperHeight = display.wrapper.clientHeight;\n    this.wrapperWidth = display.wrapper.clientWidth;\n    this.oldDisplayWidth = displayWidth(cm);\n    this.force = force;\n    this.dims = getDimensions(cm);\n    this.events = [];\n  };\n\n  DisplayUpdate.prototype.signal = function (emitter, type) {\n    if (hasHandler(emitter, type))\n      { this.events.push(arguments); }\n  };\n  DisplayUpdate.prototype.finish = function () {\n    for (var i = 0; i < this.events.length; i++)\n      { signal.apply(null, this.events[i]); }\n  };\n\n  function maybeClipScrollbars(cm) {\n    var display = cm.display;\n    if (!display.scrollbarsClipped && display.scroller.offsetWidth) {\n      display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;\n      display.heightForcer.style.height = scrollGap(cm) + \"px\";\n      display.sizer.style.marginBottom = -display.nativeBarWidth + \"px\";\n      display.sizer.style.borderRightWidth = scrollGap(cm) + \"px\";\n      display.scrollbarsClipped = true;\n    }\n  }\n\n  function selectionSnapshot(cm) {\n    if (cm.hasFocus()) { return null }\n    var active = activeElt();\n    if (!active || !contains(cm.display.lineDiv, active)) { return null }\n    var result = {activeElt: active};\n    if (window.getSelection) {\n      var sel = window.getSelection();\n      if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {\n        result.anchorNode = sel.anchorNode;\n        result.anchorOffset = sel.anchorOffset;\n        result.focusNode = sel.focusNode;\n        result.focusOffset = sel.focusOffset;\n      }\n    }\n    return result\n  }\n\n  function restoreSelection(snapshot) {\n    if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return }\n    snapshot.activeElt.focus();\n    if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&\n        snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {\n      var sel = window.getSelection(), range = document.createRange();\n      range.setEnd(snapshot.anchorNode, snapshot.anchorOffset);\n      range.collapse(false);\n      sel.removeAllRanges();\n      sel.addRange(range);\n      sel.extend(snapshot.focusNode, snapshot.focusOffset);\n    }\n  }\n\n  // Does the actual updating of the line display. Bails out\n  // (returning false) when there is nothing to be done and forced is\n  // false.\n  function updateDisplayIfNeeded(cm, update) {\n    var display = cm.display, doc = cm.doc;\n\n    if (update.editorIsHidden) {\n      resetView(cm);\n      return false\n    }\n\n    // Bail out if the visible area is already rendered and nothing changed.\n    if (!update.force &&\n        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n        display.renderedView == display.view && countDirtyView(cm) == 0)\n      { return false }\n\n    if (maybeUpdateLineNumberWidth(cm)) {\n      resetView(cm);\n      update.dims = getDimensions(cm);\n    }\n\n    // Compute a suitable new viewport (from & to)\n    var end = doc.first + doc.size;\n    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);\n    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);\n    if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }\n    if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }\n    if (sawCollapsedSpans) {\n      from = visualLineNo(cm.doc, from);\n      to = visualLineEndNo(cm.doc, to);\n    }\n\n    var different = from != display.viewFrom || to != display.viewTo ||\n      display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;\n    adjustView(cm, from, to);\n\n    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n    // Position the mover div to align with the current scroll position\n    cm.display.mover.style.top = display.viewOffset + \"px\";\n\n    var toUpdate = countDirtyView(cm);\n    if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n      { return false }\n\n    // For big changes, we hide the enclosing element during the\n    // update, since that speeds up the operations on most browsers.\n    var selSnapshot = selectionSnapshot(cm);\n    if (toUpdate > 4) { display.lineDiv.style.display = \"none\"; }\n    patchDisplay(cm, display.updateLineNumbers, update.dims);\n    if (toUpdate > 4) { display.lineDiv.style.display = \"\"; }\n    display.renderedView = display.view;\n    // There might have been a widget with a focused element that got\n    // hidden or updated, if so re-focus it.\n    restoreSelection(selSnapshot);\n\n    // Prevent selection and cursors from interfering with the scroll\n    // width and height.\n    removeChildren(display.cursorDiv);\n    removeChildren(display.selectionDiv);\n    display.gutters.style.height = display.sizer.style.minHeight = 0;\n\n    if (different) {\n      display.lastWrapHeight = update.wrapperHeight;\n      display.lastWrapWidth = update.wrapperWidth;\n      startWorker(cm, 400);\n    }\n\n    display.updateLineNumbers = null;\n\n    return true\n  }\n\n  function postUpdateDisplay(cm, update) {\n    var viewport = update.viewport;\n\n    for (var first = true;; first = false) {\n      if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {\n        // Clip forced viewport to actual scrollable area.\n        if (viewport && viewport.top != null)\n          { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }\n        // Updated line heights might result in the drawn area not\n        // actually covering the viewport. Keep looping until it does.\n        update.visible = visibleLines(cm.display, cm.doc, viewport);\n        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n          { break }\n      } else if (first) {\n        update.visible = visibleLines(cm.display, cm.doc, viewport);\n      }\n      if (!updateDisplayIfNeeded(cm, update)) { break }\n      updateHeightsInViewport(cm);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      updateScrollbars(cm, barMeasure);\n      setDocumentHeight(cm, barMeasure);\n      update.force = false;\n    }\n\n    update.signal(cm, \"update\", cm);\n    if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n      update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n      cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;\n    }\n  }\n\n  function updateDisplaySimple(cm, viewport) {\n    var update = new DisplayUpdate(cm, viewport);\n    if (updateDisplayIfNeeded(cm, update)) {\n      updateHeightsInViewport(cm);\n      postUpdateDisplay(cm, update);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      updateScrollbars(cm, barMeasure);\n      setDocumentHeight(cm, barMeasure);\n      update.finish();\n    }\n  }\n\n  // Sync the actual display DOM structure with display.view, removing\n  // nodes for lines that are no longer in view, and creating the ones\n  // that are not there yet, and updating the ones that are out of\n  // date.\n  function patchDisplay(cm, updateNumbersFrom, dims) {\n    var display = cm.display, lineNumbers = cm.options.lineNumbers;\n    var container = display.lineDiv, cur = container.firstChild;\n\n    function rm(node) {\n      var next = node.nextSibling;\n      // Works around a throw-scroll bug in OS X Webkit\n      if (webkit && mac && cm.display.currentWheelTarget == node)\n        { node.style.display = \"none\"; }\n      else\n        { node.parentNode.removeChild(node); }\n      return next\n    }\n\n    var view = display.view, lineN = display.viewFrom;\n    // Loop over the elements in the view, syncing cur (the DOM nodes\n    // in display.lineDiv) with the view as we go.\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet\n        var node = buildLineElement(cm, lineView, lineN, dims);\n        container.insertBefore(node, cur);\n      } else { // Already drawn\n        while (cur != lineView.node) { cur = rm(cur); }\n        var updateNumber = lineNumbers && updateNumbersFrom != null &&\n          updateNumbersFrom <= lineN && lineView.lineNumber;\n        if (lineView.changes) {\n          if (indexOf(lineView.changes, \"gutter\") > -1) { updateNumber = false; }\n          updateLineForChanges(cm, lineView, lineN, dims);\n        }\n        if (updateNumber) {\n          removeChildren(lineView.lineNumber);\n          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n        }\n        cur = lineView.node.nextSibling;\n      }\n      lineN += lineView.size;\n    }\n    while (cur) { cur = rm(cur); }\n  }\n\n  function updateGutterSpace(display) {\n    var width = display.gutters.offsetWidth;\n    display.sizer.style.marginLeft = width + \"px\";\n    // Send an event to consumers responding to changes in gutter width.\n    signalLater(display, \"gutterChanged\", display);\n  }\n\n  function setDocumentHeight(cm, measure) {\n    cm.display.sizer.style.minHeight = measure.docHeight + \"px\";\n    cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n    cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + \"px\";\n  }\n\n  // Re-align line numbers and gutter marks to compensate for\n  // horizontal scrolling.\n  function alignHorizontally(cm) {\n    var display = cm.display, view = display.view;\n    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }\n    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n    var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n    for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {\n      if (cm.options.fixedGutter) {\n        if (view[i].gutter)\n          { view[i].gutter.style.left = left; }\n        if (view[i].gutterBackground)\n          { view[i].gutterBackground.style.left = left; }\n      }\n      var align = view[i].alignable;\n      if (align) { for (var j = 0; j < align.length; j++)\n        { align[j].style.left = left; } }\n    } }\n    if (cm.options.fixedGutter)\n      { display.gutters.style.left = (comp + gutterW) + \"px\"; }\n  }\n\n  // Used to ensure that the line number gutter is still the right\n  // size for the current document size. Returns true when an update\n  // is needed.\n  function maybeUpdateLineNumberWidth(cm) {\n    if (!cm.options.lineNumbers) { return false }\n    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n    if (last.length != display.lineNumChars) {\n      var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n                                                 \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n      display.lineGutter.style.width = \"\";\n      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;\n      display.lineNumWidth = display.lineNumInnerWidth + padding;\n      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n      display.lineGutter.style.width = display.lineNumWidth + \"px\";\n      updateGutterSpace(cm.display);\n      return true\n    }\n    return false\n  }\n\n  function getGutters(gutters, lineNumbers) {\n    var result = [], sawLineNumbers = false;\n    for (var i = 0; i < gutters.length; i++) {\n      var name = gutters[i], style = null;\n      if (typeof name != \"string\") { style = name.style; name = name.className; }\n      if (name == \"CodeMirror-linenumbers\") {\n        if (!lineNumbers) { continue }\n        else { sawLineNumbers = true; }\n      }\n      result.push({className: name, style: style});\n    }\n    if (lineNumbers && !sawLineNumbers) { result.push({className: \"CodeMirror-linenumbers\", style: null}); }\n    return result\n  }\n\n  // Rebuild the gutter elements, ensure the margin to the left of the\n  // code matches their width.\n  function renderGutters(display) {\n    var gutters = display.gutters, specs = display.gutterSpecs;\n    removeChildren(gutters);\n    display.lineGutter = null;\n    for (var i = 0; i < specs.length; ++i) {\n      var ref = specs[i];\n      var className = ref.className;\n      var style = ref.style;\n      var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + className));\n      if (style) { gElt.style.cssText = style; }\n      if (className == \"CodeMirror-linenumbers\") {\n        display.lineGutter = gElt;\n        gElt.style.width = (display.lineNumWidth || 1) + \"px\";\n      }\n    }\n    gutters.style.display = specs.length ? \"\" : \"none\";\n    updateGutterSpace(display);\n  }\n\n  function updateGutters(cm) {\n    renderGutters(cm.display);\n    regChange(cm);\n    alignHorizontally(cm);\n  }\n\n  // The display handles the DOM integration, both for input reading\n  // and content drawing. It holds references to DOM nodes and\n  // display-related state.\n\n  function Display(place, doc, input, options) {\n    var d = this;\n    this.input = input;\n\n    // Covers bottom-right square when both scrollbars are present.\n    d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n    d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\");\n    // Covers bottom of gutter when coverGutterNextToScrollbar is on\n    // and h scrollbar is present.\n    d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n    d.gutterFiller.setAttribute(\"cm-not-content\", \"true\");\n    // Will contain the actual code, positioned to cover the viewport.\n    d.lineDiv = eltP(\"div\", null, \"CodeMirror-code\");\n    // Elements are added to these to represent selection and cursors.\n    d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n    d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n    // A visibility: hidden element used to find the size of things.\n    d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n    // When lines outside of the viewport are measured, they are drawn in this.\n    d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n    // Wraps everything that needs to exist inside the vertically-padded coordinate system\n    d.lineSpace = eltP(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n                      null, \"position: relative; outline: none\");\n    var lines = eltP(\"div\", [d.lineSpace], \"CodeMirror-lines\");\n    // Moved around its parent to cover visible view.\n    d.mover = elt(\"div\", [lines], null, \"position: relative\");\n    // Set to the height of the document, allowing scrolling.\n    d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n    d.sizerWidth = null;\n    // Behavior of elts with overflow: auto and padding is\n    // inconsistent across browsers. This is used to ensure the\n    // scrollable area is big enough.\n    d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\");\n    // Will contain the gutters, if any.\n    d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n    d.lineGutter = null;\n    // Actual scrollable element.\n    d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n    d.scroller.setAttribute(\"tabIndex\", \"-1\");\n    // The element in which the editor lives.\n    d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n\n    // This attribute is respected by automatic translation systems such as Google Translate,\n    // and may also be respected by tools used by human translators.\n    d.wrapper.setAttribute('translate', 'no');\n\n    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n    if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }\n\n    if (place) {\n      if (place.appendChild) { place.appendChild(d.wrapper); }\n      else { place(d.wrapper); }\n    }\n\n    // Current rendered range (may be bigger than the view window).\n    d.viewFrom = d.viewTo = doc.first;\n    d.reportedViewFrom = d.reportedViewTo = doc.first;\n    // Information about the rendered lines.\n    d.view = [];\n    d.renderedView = null;\n    // Holds info about a single rendered line when it was rendered\n    // for measurement, while not in view.\n    d.externalMeasured = null;\n    // Empty space (in pixels) above the view\n    d.viewOffset = 0;\n    d.lastWrapHeight = d.lastWrapWidth = 0;\n    d.updateLineNumbers = null;\n\n    d.nativeBarWidth = d.barHeight = d.barWidth = 0;\n    d.scrollbarsClipped = false;\n\n    // Used to only resize the line number gutter when necessary (when\n    // the amount of lines crosses a boundary that makes its width change)\n    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n    // Set to true when a non-horizontal-scrolling line widget is\n    // added. As an optimization, line widget aligning is skipped when\n    // this is false.\n    d.alignWidgets = false;\n\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n    // Tracks the maximum line length so that the horizontal scrollbar\n    // can be kept static when scrolling.\n    d.maxLine = null;\n    d.maxLineLength = 0;\n    d.maxLineChanged = false;\n\n    // Used for measuring wheel scrolling granularity\n    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n    // True when shift is held down.\n    d.shift = false;\n\n    // Used to track whether anything happened since the context menu\n    // was opened.\n    d.selForContextMenu = null;\n\n    d.activeTouch = null;\n\n    d.gutterSpecs = getGutters(options.gutters, options.lineNumbers);\n    renderGutters(d);\n\n    input.init(d);\n  }\n\n  // Since the delta values reported on mouse wheel events are\n  // unstandardized between browsers and even browser versions, and\n  // generally horribly unpredictable, this code starts by measuring\n  // the scroll effect that the first few mouse wheel events have,\n  // and, from that, detects the way it can convert deltas to pixel\n  // offsets afterwards.\n  //\n  // The reason we want to know the amount a wheel event will scroll\n  // is that it gives us a chance to update the display before the\n  // actual scrolling happens, reducing flickering.\n\n  var wheelSamples = 0, wheelPixelsPerUnit = null;\n  // Fill in a browser-detected starting value on browsers where we\n  // know one. These don't have to be accurate -- the result of them\n  // being wrong would just be a slight flicker on the first wheel\n  // scroll (if it is large enough).\n  if (ie) { wheelPixelsPerUnit = -.53; }\n  else if (gecko) { wheelPixelsPerUnit = 15; }\n  else if (chrome) { wheelPixelsPerUnit = -.7; }\n  else if (safari) { wheelPixelsPerUnit = -1/3; }\n\n  function wheelEventDelta(e) {\n    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }\n    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }\n    else if (dy == null) { dy = e.wheelDelta; }\n    return {x: dx, y: dy}\n  }\n  function wheelEventPixels(e) {\n    var delta = wheelEventDelta(e);\n    delta.x *= wheelPixelsPerUnit;\n    delta.y *= wheelPixelsPerUnit;\n    return delta\n  }\n\n  function onScrollWheel(cm, e) {\n    var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;\n    var pixelsPerUnit = wheelPixelsPerUnit;\n    if (e.deltaMode === 0) {\n      dx = e.deltaX;\n      dy = e.deltaY;\n      pixelsPerUnit = 1;\n    }\n\n    var display = cm.display, scroll = display.scroller;\n    // Quit if there's nothing to scroll here\n    var canScrollX = scroll.scrollWidth > scroll.clientWidth;\n    var canScrollY = scroll.scrollHeight > scroll.clientHeight;\n    if (!(dx && canScrollX || dy && canScrollY)) { return }\n\n    // Webkit browsers on OS X abort momentum scrolls when the target\n    // of the scroll event is removed from the scrollable element.\n    // This hack (see related code in patchDisplay) makes sure the\n    // element is kept around.\n    if (dy && mac && webkit) {\n      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n        for (var i = 0; i < view.length; i++) {\n          if (view[i].node == cur) {\n            cm.display.currentWheelTarget = cur;\n            break outer\n          }\n        }\n      }\n    }\n\n    // On some browsers, horizontal scrolling will cause redraws to\n    // happen before the gutter has been realigned, causing it to\n    // wriggle around in a most unseemly way. When we have an\n    // estimated pixels/delta value, we just handle horizontal\n    // scrolling entirely here. It'll be slightly off from native, but\n    // better than glitching out.\n    if (dx && !gecko && !presto && pixelsPerUnit != null) {\n      if (dy && canScrollY)\n        { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); }\n      setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit));\n      // Only prevent default scrolling if vertical scrolling is\n      // actually possible. Otherwise, it causes vertical scroll\n      // jitter on OSX trackpads when deltaX is small and deltaY\n      // is large (issue #3579)\n      if (!dy || (dy && canScrollY))\n        { e_preventDefault(e); }\n      display.wheelStartX = null; // Abort measurement, if in progress\n      return\n    }\n\n    // 'Project' the visible viewport to cover the area that is being\n    // scrolled into view (if we know enough to estimate it).\n    if (dy && pixelsPerUnit != null) {\n      var pixels = dy * pixelsPerUnit;\n      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n      if (pixels < 0) { top = Math.max(0, top + pixels - 50); }\n      else { bot = Math.min(cm.doc.height, bot + pixels + 50); }\n      updateDisplaySimple(cm, {top: top, bottom: bot});\n    }\n\n    if (wheelSamples < 20 && e.deltaMode !== 0) {\n      if (display.wheelStartX == null) {\n        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n        display.wheelDX = dx; display.wheelDY = dy;\n        setTimeout(function () {\n          if (display.wheelStartX == null) { return }\n          var movedX = scroll.scrollLeft - display.wheelStartX;\n          var movedY = scroll.scrollTop - display.wheelStartY;\n          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n            (movedX && display.wheelDX && movedX / display.wheelDX);\n          display.wheelStartX = display.wheelStartY = null;\n          if (!sample) { return }\n          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n          ++wheelSamples;\n        }, 200);\n      } else {\n        display.wheelDX += dx; display.wheelDY += dy;\n      }\n    }\n  }\n\n  // Selection objects are immutable. A new one is created every time\n  // the selection changes. A selection is one or more non-overlapping\n  // (and non-touching) ranges, sorted, and an integer that indicates\n  // which one is the primary selection (the one that's scrolled into\n  // view, that getCursor returns, etc).\n  var Selection = function(ranges, primIndex) {\n    this.ranges = ranges;\n    this.primIndex = primIndex;\n  };\n\n  Selection.prototype.primary = function () { return this.ranges[this.primIndex] };\n\n  Selection.prototype.equals = function (other) {\n    if (other == this) { return true }\n    if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }\n    for (var i = 0; i < this.ranges.length; i++) {\n      var here = this.ranges[i], there = other.ranges[i];\n      if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }\n    }\n    return true\n  };\n\n  Selection.prototype.deepCopy = function () {\n    var out = [];\n    for (var i = 0; i < this.ranges.length; i++)\n      { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); }\n    return new Selection(out, this.primIndex)\n  };\n\n  Selection.prototype.somethingSelected = function () {\n    for (var i = 0; i < this.ranges.length; i++)\n      { if (!this.ranges[i].empty()) { return true } }\n    return false\n  };\n\n  Selection.prototype.contains = function (pos, end) {\n    if (!end) { end = pos; }\n    for (var i = 0; i < this.ranges.length; i++) {\n      var range = this.ranges[i];\n      if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n        { return i }\n    }\n    return -1\n  };\n\n  var Range = function(anchor, head) {\n    this.anchor = anchor; this.head = head;\n  };\n\n  Range.prototype.from = function () { return minPos(this.anchor, this.head) };\n  Range.prototype.to = function () { return maxPos(this.anchor, this.head) };\n  Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };\n\n  // Take an unsorted, potentially overlapping set of ranges, and\n  // build a selection out of it. 'Consumes' ranges array (modifying\n  // it).\n  function normalizeSelection(cm, ranges, primIndex) {\n    var mayTouch = cm && cm.options.selectionsMayTouch;\n    var prim = ranges[primIndex];\n    ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });\n    primIndex = indexOf(ranges, prim);\n    for (var i = 1; i < ranges.length; i++) {\n      var cur = ranges[i], prev = ranges[i - 1];\n      var diff = cmp(prev.to(), cur.from());\n      if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {\n        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n        if (i <= primIndex) { --primIndex; }\n        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n      }\n    }\n    return new Selection(ranges, primIndex)\n  }\n\n  function simpleSelection(anchor, head) {\n    return new Selection([new Range(anchor, head || anchor)], 0)\n  }\n\n  // Compute the position of the end of a change (its 'to' property\n  // refers to the pre-change end).\n  function changeEnd(change) {\n    if (!change.text) { return change.to }\n    return Pos(change.from.line + change.text.length - 1,\n               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))\n  }\n\n  // Adjust a position to refer to the post-change position of the\n  // same text, or the end of the change if the change covers it.\n  function adjustForChange(pos, change) {\n    if (cmp(pos, change.from) < 0) { return pos }\n    if (cmp(pos, change.to) <= 0) { return changeEnd(change) }\n\n    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n    if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }\n    return Pos(line, ch)\n  }\n\n  function computeSelAfterChange(doc, change) {\n    var out = [];\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      var range = doc.sel.ranges[i];\n      out.push(new Range(adjustForChange(range.anchor, change),\n                         adjustForChange(range.head, change)));\n    }\n    return normalizeSelection(doc.cm, out, doc.sel.primIndex)\n  }\n\n  function offsetPos(pos, old, nw) {\n    if (pos.line == old.line)\n      { return Pos(nw.line, pos.ch - old.ch + nw.ch) }\n    else\n      { return Pos(nw.line + (pos.line - old.line), pos.ch) }\n  }\n\n  // Used by replaceSelections to allow moving the selection to the\n  // start or around the replaced test. Hint may be \"start\" or \"around\".\n  function computeReplacedSel(doc, changes, hint) {\n    var out = [];\n    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n    for (var i = 0; i < changes.length; i++) {\n      var change = changes[i];\n      var from = offsetPos(change.from, oldPrev, newPrev);\n      var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n      oldPrev = change.to;\n      newPrev = to;\n      if (hint == \"around\") {\n        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n        out[i] = new Range(inv ? to : from, inv ? from : to);\n      } else {\n        out[i] = new Range(from, from);\n      }\n    }\n    return new Selection(out, doc.sel.primIndex)\n  }\n\n  // Used to get the editor into a consistent state again when options change.\n\n  function loadMode(cm) {\n    cm.doc.mode = getMode(cm.options, cm.doc.modeOption);\n    resetModeState(cm);\n  }\n\n  function resetModeState(cm) {\n    cm.doc.iter(function (line) {\n      if (line.stateAfter) { line.stateAfter = null; }\n      if (line.styles) { line.styles = null; }\n    });\n    cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;\n    startWorker(cm, 100);\n    cm.state.modeGen++;\n    if (cm.curOp) { regChange(cm); }\n  }\n\n  // DOCUMENT DATA STRUCTURE\n\n  // By default, updates that start and end at the beginning of a line\n  // are treated specially, in order to make the association of line\n  // widgets and marker elements with the text behave more intuitive.\n  function isWholeLineUpdate(doc, change) {\n    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n      (!doc.cm || doc.cm.options.wholeLineUpdateBefore)\n  }\n\n  // Perform a change on the document data structure.\n  function updateDoc(doc, change, markedSpans, estimateHeight) {\n    function spansFor(n) {return markedSpans ? markedSpans[n] : null}\n    function update(line, text, spans) {\n      updateLine(line, text, spans, estimateHeight);\n      signalLater(line, \"change\", line, change);\n    }\n    function linesFor(start, end) {\n      var result = [];\n      for (var i = start; i < end; ++i)\n        { result.push(new Line(text[i], spansFor(i), estimateHeight)); }\n      return result\n    }\n\n    var from = change.from, to = change.to, text = change.text;\n    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n    // Adjust the line structure\n    if (change.full) {\n      doc.insert(0, linesFor(0, text.length));\n      doc.remove(text.length, doc.size - text.length);\n    } else if (isWholeLineUpdate(doc, change)) {\n      // This is a whole-line replace. Treated specially to make\n      // sure line objects move the way they are supposed to.\n      var added = linesFor(0, text.length - 1);\n      update(lastLine, lastLine.text, lastSpans);\n      if (nlines) { doc.remove(from.line, nlines); }\n      if (added.length) { doc.insert(from.line, added); }\n    } else if (firstLine == lastLine) {\n      if (text.length == 1) {\n        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n      } else {\n        var added$1 = linesFor(1, text.length - 1);\n        added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));\n        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n        doc.insert(from.line + 1, added$1);\n      }\n    } else if (text.length == 1) {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n      doc.remove(from.line + 1, nlines);\n    } else {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n      var added$2 = linesFor(1, text.length - 1);\n      if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }\n      doc.insert(from.line + 1, added$2);\n    }\n\n    signalLater(doc, \"change\", doc, change);\n  }\n\n  // Call f for all linked documents.\n  function linkedDocs(doc, f, sharedHistOnly) {\n    function propagate(doc, skip, sharedHist) {\n      if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {\n        var rel = doc.linked[i];\n        if (rel.doc == skip) { continue }\n        var shared = sharedHist && rel.sharedHist;\n        if (sharedHistOnly && !shared) { continue }\n        f(rel.doc, shared);\n        propagate(rel.doc, doc, shared);\n      } }\n    }\n    propagate(doc, null, true);\n  }\n\n  // Attach a document to an editor.\n  function attachDoc(cm, doc) {\n    if (doc.cm) { throw new Error(\"This document is already in use.\") }\n    cm.doc = doc;\n    doc.cm = cm;\n    estimateLineHeights(cm);\n    loadMode(cm);\n    setDirectionClass(cm);\n    cm.options.direction = doc.direction;\n    if (!cm.options.lineWrapping) { findMaxLine(cm); }\n    cm.options.mode = doc.modeOption;\n    regChange(cm);\n  }\n\n  function setDirectionClass(cm) {\n  (cm.doc.direction == \"rtl\" ? addClass : rmClass)(cm.display.lineDiv, \"CodeMirror-rtl\");\n  }\n\n  function directionChanged(cm) {\n    runInOp(cm, function () {\n      setDirectionClass(cm);\n      regChange(cm);\n    });\n  }\n\n  function History(prev) {\n    // Arrays of change events and selections. Doing something adds an\n    // event to done and clears undo. Undoing moves events from done\n    // to undone, redoing moves them in the other direction.\n    this.done = []; this.undone = [];\n    this.undoDepth = prev ? prev.undoDepth : Infinity;\n    // Used to track when changes can be merged into a single undo\n    // event\n    this.lastModTime = this.lastSelTime = 0;\n    this.lastOp = this.lastSelOp = null;\n    this.lastOrigin = this.lastSelOrigin = null;\n    // Used by the isClean() method\n    this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1;\n  }\n\n  // Create a history change event from an updateDoc-style change\n  // object.\n  function historyChangeFromChange(doc, change) {\n    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n    linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);\n    return histChange\n  }\n\n  // Pop all selection events off the end of a history array. Stop at\n  // a change event.\n  function clearSelectionEvents(array) {\n    while (array.length) {\n      var last = lst(array);\n      if (last.ranges) { array.pop(); }\n      else { break }\n    }\n  }\n\n  // Find the top change event in the history. Pop off selection\n  // events that are in the way.\n  function lastChangeEvent(hist, force) {\n    if (force) {\n      clearSelectionEvents(hist.done);\n      return lst(hist.done)\n    } else if (hist.done.length && !lst(hist.done).ranges) {\n      return lst(hist.done)\n    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n      hist.done.pop();\n      return lst(hist.done)\n    }\n  }\n\n  // Register a change in the history. Merges changes that are within\n  // a single operation, or are close together with an origin that\n  // allows merging (starting with \"+\") into a single event.\n  function addChangeToHistory(doc, change, selAfter, opId) {\n    var hist = doc.history;\n    hist.undone.length = 0;\n    var time = +new Date, cur;\n    var last;\n\n    if ((hist.lastOp == opId ||\n         hist.lastOrigin == change.origin && change.origin &&\n         ((change.origin.charAt(0) == \"+\" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||\n          change.origin.charAt(0) == \"*\")) &&\n        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n      // Merge this change into the last event\n      last = lst(cur.changes);\n      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n        // Optimized case for simple insertion -- don't want to add\n        // new changesets for every character typed\n        last.to = changeEnd(change);\n      } else {\n        // Add new sub-event\n        cur.changes.push(historyChangeFromChange(doc, change));\n      }\n    } else {\n      // Can not be merged, start a new event.\n      var before = lst(hist.done);\n      if (!before || !before.ranges)\n        { pushSelectionToHistory(doc.sel, hist.done); }\n      cur = {changes: [historyChangeFromChange(doc, change)],\n             generation: hist.generation};\n      hist.done.push(cur);\n      while (hist.done.length > hist.undoDepth) {\n        hist.done.shift();\n        if (!hist.done[0].ranges) { hist.done.shift(); }\n      }\n    }\n    hist.done.push(selAfter);\n    hist.generation = ++hist.maxGeneration;\n    hist.lastModTime = hist.lastSelTime = time;\n    hist.lastOp = hist.lastSelOp = opId;\n    hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n    if (!last) { signal(doc, \"historyAdded\"); }\n  }\n\n  function selectionEventCanBeMerged(doc, origin, prev, sel) {\n    var ch = origin.charAt(0);\n    return ch == \"*\" ||\n      ch == \"+\" &&\n      prev.ranges.length == sel.ranges.length &&\n      prev.somethingSelected() == sel.somethingSelected() &&\n      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)\n  }\n\n  // Called whenever the selection changes, sets the new selection as\n  // the pending selection in the history, and pushes the old pending\n  // selection into the 'done' array when it was significantly\n  // different (in number of selected ranges, emptiness, or time).\n  function addSelectionToHistory(doc, sel, opId, options) {\n    var hist = doc.history, origin = options && options.origin;\n\n    // A new event is started when the previous origin does not match\n    // the current, or the origins don't allow matching. Origins\n    // starting with * are always merged, those starting with + are\n    // merged when similar and close together in time.\n    if (opId == hist.lastSelOp ||\n        (origin && hist.lastSelOrigin == origin &&\n         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n      { hist.done[hist.done.length - 1] = sel; }\n    else\n      { pushSelectionToHistory(sel, hist.done); }\n\n    hist.lastSelTime = +new Date;\n    hist.lastSelOrigin = origin;\n    hist.lastSelOp = opId;\n    if (options && options.clearRedo !== false)\n      { clearSelectionEvents(hist.undone); }\n  }\n\n  function pushSelectionToHistory(sel, dest) {\n    var top = lst(dest);\n    if (!(top && top.ranges && top.equals(sel)))\n      { dest.push(sel); }\n  }\n\n  // Used to store marked span information in the history.\n  function attachLocalSpans(doc, change, from, to) {\n    var existing = change[\"spans_\" + doc.id], n = 0;\n    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {\n      if (line.markedSpans)\n        { (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans; }\n      ++n;\n    });\n  }\n\n  // When un/re-doing restores text containing marked spans, those\n  // that have been explicitly cleared should not be restored.\n  function removeClearedSpans(spans) {\n    if (!spans) { return null }\n    var out;\n    for (var i = 0; i < spans.length; ++i) {\n      if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }\n      else if (out) { out.push(spans[i]); }\n    }\n    return !out ? spans : out.length ? out : null\n  }\n\n  // Retrieve and filter the old marked spans stored in a change event.\n  function getOldSpans(doc, change) {\n    var found = change[\"spans_\" + doc.id];\n    if (!found) { return null }\n    var nw = [];\n    for (var i = 0; i < change.text.length; ++i)\n      { nw.push(removeClearedSpans(found[i])); }\n    return nw\n  }\n\n  // Used for un/re-doing changes from the history. Combines the\n  // result of computing the existing spans with the set of spans that\n  // existed in the history (so that deleting around a span and then\n  // undoing brings back the span).\n  function mergeOldSpans(doc, change) {\n    var old = getOldSpans(doc, change);\n    var stretched = stretchSpansOverChange(doc, change);\n    if (!old) { return stretched }\n    if (!stretched) { return old }\n\n    for (var i = 0; i < old.length; ++i) {\n      var oldCur = old[i], stretchCur = stretched[i];\n      if (oldCur && stretchCur) {\n        spans: for (var j = 0; j < stretchCur.length; ++j) {\n          var span = stretchCur[j];\n          for (var k = 0; k < oldCur.length; ++k)\n            { if (oldCur[k].marker == span.marker) { continue spans } }\n          oldCur.push(span);\n        }\n      } else if (stretchCur) {\n        old[i] = stretchCur;\n      }\n    }\n    return old\n  }\n\n  // Used both to provide a JSON-safe object in .getHistory, and, when\n  // detaching a document, to split the history in two\n  function copyHistoryArray(events, newGroup, instantiateSel) {\n    var copy = [];\n    for (var i = 0; i < events.length; ++i) {\n      var event = events[i];\n      if (event.ranges) {\n        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n        continue\n      }\n      var changes = event.changes, newChanges = [];\n      copy.push({changes: newChanges});\n      for (var j = 0; j < changes.length; ++j) {\n        var change = changes[j], m = (void 0);\n        newChanges.push({from: change.from, to: change.to, text: change.text});\n        if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\\d+)$/)) {\n          if (indexOf(newGroup, Number(m[1])) > -1) {\n            lst(newChanges)[prop] = change[prop];\n            delete change[prop];\n          }\n        } } }\n      }\n    }\n    return copy\n  }\n\n  // The 'scroll' parameter given to many of these indicated whether\n  // the new cursor position should be scrolled into view after\n  // modifying the selection.\n\n  // If shift is held or the extend flag is set, extends a range to\n  // include a given position (and optionally a second position).\n  // Otherwise, simply returns the range between the given positions.\n  // Used for cursor motion and such.\n  function extendRange(range, head, other, extend) {\n    if (extend) {\n      var anchor = range.anchor;\n      if (other) {\n        var posBefore = cmp(head, anchor) < 0;\n        if (posBefore != (cmp(other, anchor) < 0)) {\n          anchor = head;\n          head = other;\n        } else if (posBefore != (cmp(head, other) < 0)) {\n          head = other;\n        }\n      }\n      return new Range(anchor, head)\n    } else {\n      return new Range(other || head, head)\n    }\n  }\n\n  // Extend the primary selection range, discard the rest.\n  function extendSelection(doc, head, other, options, extend) {\n    if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }\n    setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);\n  }\n\n  // Extend all selections (pos is an array of selections with length\n  // equal the number of selections)\n  function extendSelections(doc, heads, options) {\n    var out = [];\n    var extend = doc.cm && (doc.cm.display.shift || doc.extend);\n    for (var i = 0; i < doc.sel.ranges.length; i++)\n      { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }\n    var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex);\n    setSelection(doc, newSel, options);\n  }\n\n  // Updates a single range in the selection.\n  function replaceOneSelection(doc, i, range, options) {\n    var ranges = doc.sel.ranges.slice(0);\n    ranges[i] = range;\n    setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options);\n  }\n\n  // Reset the selection to a single range.\n  function setSimpleSelection(doc, anchor, head, options) {\n    setSelection(doc, simpleSelection(anchor, head), options);\n  }\n\n  // Give beforeSelectionChange handlers a change to influence a\n  // selection update.\n  function filterSelectionChange(doc, sel, options) {\n    var obj = {\n      ranges: sel.ranges,\n      update: function(ranges) {\n        this.ranges = [];\n        for (var i = 0; i < ranges.length; i++)\n          { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n                                     clipPos(doc, ranges[i].head)); }\n      },\n      origin: options && options.origin\n    };\n    signal(doc, \"beforeSelectionChange\", doc, obj);\n    if (doc.cm) { signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj); }\n    if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) }\n    else { return sel }\n  }\n\n  function setSelectionReplaceHistory(doc, sel, options) {\n    var done = doc.history.done, last = lst(done);\n    if (last && last.ranges) {\n      done[done.length - 1] = sel;\n      setSelectionNoUndo(doc, sel, options);\n    } else {\n      setSelection(doc, sel, options);\n    }\n  }\n\n  // Set a new selection.\n  function setSelection(doc, sel, options) {\n    setSelectionNoUndo(doc, sel, options);\n    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n  }\n\n  function setSelectionNoUndo(doc, sel, options) {\n    if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n      { sel = filterSelectionChange(doc, sel, options); }\n\n    var bias = options && options.bias ||\n      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);\n    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n    if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption(\"readOnly\") != \"nocursor\")\n      { ensureCursorVisible(doc.cm); }\n  }\n\n  function setSelectionInner(doc, sel) {\n    if (sel.equals(doc.sel)) { return }\n\n    doc.sel = sel;\n\n    if (doc.cm) {\n      doc.cm.curOp.updateInput = 1;\n      doc.cm.curOp.selectionChanged = true;\n      signalCursorActivity(doc.cm);\n    }\n    signalLater(doc, \"cursorActivity\", doc);\n  }\n\n  // Verify that the selection does not partially select any atomic\n  // marked ranges.\n  function reCheckSelection(doc) {\n    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));\n  }\n\n  // Return a selection that does not partially select any atomic\n  // ranges.\n  function skipAtomicInSelection(doc, sel, bias, mayClear) {\n    var out;\n    for (var i = 0; i < sel.ranges.length; i++) {\n      var range = sel.ranges[i];\n      var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];\n      var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);\n      var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);\n      if (out || newAnchor != range.anchor || newHead != range.head) {\n        if (!out) { out = sel.ranges.slice(0, i); }\n        out[i] = new Range(newAnchor, newHead);\n      }\n    }\n    return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel\n  }\n\n  function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {\n    var line = getLine(doc, pos.line);\n    if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n      var sp = line.markedSpans[i], m = sp.marker;\n\n      // Determine if we should prevent the cursor being placed to the left/right of an atomic marker\n      // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it\n      // is with selectLeft/Right\n      var preventCursorLeft = (\"selectLeft\" in m) ? !m.selectLeft : m.inclusiveLeft;\n      var preventCursorRight = (\"selectRight\" in m) ? !m.selectRight : m.inclusiveRight;\n\n      if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n          (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n        if (mayClear) {\n          signal(m, \"beforeCursorEnter\");\n          if (m.explicitlyCleared) {\n            if (!line.markedSpans) { break }\n            else {--i; continue}\n          }\n        }\n        if (!m.atomic) { continue }\n\n        if (oldPos) {\n          var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);\n          if (dir < 0 ? preventCursorRight : preventCursorLeft)\n            { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }\n          if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))\n            { return skipAtomicInner(doc, near, pos, dir, mayClear) }\n        }\n\n        var far = m.find(dir < 0 ? -1 : 1);\n        if (dir < 0 ? preventCursorLeft : preventCursorRight)\n          { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }\n        return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null\n      }\n    } }\n    return pos\n  }\n\n  // Ensure a given position is not inside an atomic range.\n  function skipAtomic(doc, pos, oldPos, bias, mayClear) {\n    var dir = bias || 1;\n    var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||\n        (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||\n        skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||\n        (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));\n    if (!found) {\n      doc.cantEdit = true;\n      return Pos(doc.first, 0)\n    }\n    return found\n  }\n\n  function movePos(doc, pos, dir, line) {\n    if (dir < 0 && pos.ch == 0) {\n      if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }\n      else { return null }\n    } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {\n      if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }\n      else { return null }\n    } else {\n      return new Pos(pos.line, pos.ch + dir)\n    }\n  }\n\n  function selectAll(cm) {\n    cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);\n  }\n\n  // UPDATING\n\n  // Allow \"beforeChange\" event handlers to influence a change\n  function filterChange(doc, change, update) {\n    var obj = {\n      canceled: false,\n      from: change.from,\n      to: change.to,\n      text: change.text,\n      origin: change.origin,\n      cancel: function () { return obj.canceled = true; }\n    };\n    if (update) { obj.update = function (from, to, text, origin) {\n      if (from) { obj.from = clipPos(doc, from); }\n      if (to) { obj.to = clipPos(doc, to); }\n      if (text) { obj.text = text; }\n      if (origin !== undefined) { obj.origin = origin; }\n    }; }\n    signal(doc, \"beforeChange\", doc, obj);\n    if (doc.cm) { signal(doc.cm, \"beforeChange\", doc.cm, obj); }\n\n    if (obj.canceled) {\n      if (doc.cm) { doc.cm.curOp.updateInput = 2; }\n      return null\n    }\n    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}\n  }\n\n  // Apply a change to a document, and add it to the document's\n  // history, and propagating it to all linked documents.\n  function makeChange(doc, change, ignoreReadOnly) {\n    if (doc.cm) {\n      if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }\n      if (doc.cm.state.suppressEdits) { return }\n    }\n\n    if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n      change = filterChange(doc, change, true);\n      if (!change) { return }\n    }\n\n    // Possibly split or suppress the update based on the presence\n    // of read-only spans in its range.\n    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n    if (split) {\n      for (var i = split.length - 1; i >= 0; --i)\n        { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text, origin: change.origin}); }\n    } else {\n      makeChangeInner(doc, change);\n    }\n  }\n\n  function makeChangeInner(doc, change) {\n    if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) { return }\n    var selAfter = computeSelAfterChange(doc, change);\n    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n    var rebased = [];\n\n    linkedDocs(doc, function (doc, sharedHist) {\n      if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n        rebaseHist(doc.history, change);\n        rebased.push(doc.history);\n      }\n      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n    });\n  }\n\n  // Revert a change stored in a document's history.\n  function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n    var suppress = doc.cm && doc.cm.state.suppressEdits;\n    if (suppress && !allowSelectionOnly) { return }\n\n    var hist = doc.history, event, selAfter = doc.sel;\n    var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n    // Verify that there is a useable event (so that ctrl-z won't\n    // needlessly clear selection events)\n    var i = 0;\n    for (; i < source.length; i++) {\n      event = source[i];\n      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n        { break }\n    }\n    if (i == source.length) { return }\n    hist.lastOrigin = hist.lastSelOrigin = null;\n\n    for (;;) {\n      event = source.pop();\n      if (event.ranges) {\n        pushSelectionToHistory(event, dest);\n        if (allowSelectionOnly && !event.equals(doc.sel)) {\n          setSelection(doc, event, {clearRedo: false});\n          return\n        }\n        selAfter = event;\n      } else if (suppress) {\n        source.push(event);\n        return\n      } else { break }\n    }\n\n    // Build up a reverse change object to add to the opposite history\n    // stack (redo when undoing, and vice versa).\n    var antiChanges = [];\n    pushSelectionToHistory(selAfter, dest);\n    dest.push({changes: antiChanges, generation: hist.generation});\n    hist.generation = event.generation || ++hist.maxGeneration;\n\n    var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n    var loop = function ( i ) {\n      var change = event.changes[i];\n      change.origin = type;\n      if (filter && !filterChange(doc, change, false)) {\n        source.length = 0;\n        return {}\n      }\n\n      antiChanges.push(historyChangeFromChange(doc, change));\n\n      var after = i ? computeSelAfterChange(doc, change) : lst(source);\n      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n      if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }\n      var rebased = [];\n\n      // Propagate to the linked documents\n      linkedDocs(doc, function (doc, sharedHist) {\n        if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n          rebaseHist(doc.history, change);\n          rebased.push(doc.history);\n        }\n        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n      });\n    };\n\n    for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {\n      var returned = loop( i$1 );\n\n      if ( returned ) return returned.v;\n    }\n  }\n\n  // Sub-views need their line numbers shifted when text is added\n  // above or below them in the parent document.\n  function shiftDoc(doc, distance) {\n    if (distance == 0) { return }\n    doc.first += distance;\n    doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(\n      Pos(range.anchor.line + distance, range.anchor.ch),\n      Pos(range.head.line + distance, range.head.ch)\n    ); }), doc.sel.primIndex);\n    if (doc.cm) {\n      regChange(doc.cm, doc.first, doc.first - distance, distance);\n      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n        { regLineChange(doc.cm, l, \"gutter\"); }\n    }\n  }\n\n  // More lower-level change function, handling only a single document\n  // (not linked ones).\n  function makeChangeSingleDoc(doc, change, selAfter, spans) {\n    if (doc.cm && !doc.cm.curOp)\n      { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }\n\n    if (change.to.line < doc.first) {\n      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n      return\n    }\n    if (change.from.line > doc.lastLine()) { return }\n\n    // Clip the change to the size of this doc\n    if (change.from.line < doc.first) {\n      var shift = change.text.length - 1 - (doc.first - change.from.line);\n      shiftDoc(doc, shift);\n      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n                text: [lst(change.text)], origin: change.origin};\n    }\n    var last = doc.lastLine();\n    if (change.to.line > last) {\n      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n                text: [change.text[0]], origin: change.origin};\n    }\n\n    change.removed = getBetween(doc, change.from, change.to);\n\n    if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }\n    if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }\n    else { updateDoc(doc, change, spans); }\n    setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n\n    if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))\n      { doc.cantEdit = false; }\n  }\n\n  // Handle the interaction of a change to a document with the editor\n  // that this document is part of.\n  function makeChangeSingleDocInEditor(cm, change, spans) {\n    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n    var recomputeMaxLength = false, checkWidthStart = from.line;\n    if (!cm.options.lineWrapping) {\n      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n      doc.iter(checkWidthStart, to.line + 1, function (line) {\n        if (line == display.maxLine) {\n          recomputeMaxLength = true;\n          return true\n        }\n      });\n    }\n\n    if (doc.sel.contains(change.from, change.to) > -1)\n      { signalCursorActivity(cm); }\n\n    updateDoc(doc, change, spans, estimateHeight(cm));\n\n    if (!cm.options.lineWrapping) {\n      doc.iter(checkWidthStart, from.line + change.text.length, function (line) {\n        var len = lineLength(line);\n        if (len > display.maxLineLength) {\n          display.maxLine = line;\n          display.maxLineLength = len;\n          display.maxLineChanged = true;\n          recomputeMaxLength = false;\n        }\n      });\n      if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }\n    }\n\n    retreatFrontier(doc, from.line);\n    startWorker(cm, 400);\n\n    var lendiff = change.text.length - (to.line - from.line) - 1;\n    // Remember that these lines changed, for updating the display\n    if (change.full)\n      { regChange(cm); }\n    else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n      { regLineChange(cm, from.line, \"text\"); }\n    else\n      { regChange(cm, from.line, to.line + 1, lendiff); }\n\n    var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n    if (changeHandler || changesHandler) {\n      var obj = {\n        from: from, to: to,\n        text: change.text,\n        removed: change.removed,\n        origin: change.origin\n      };\n      if (changeHandler) { signalLater(cm, \"change\", cm, obj); }\n      if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }\n    }\n    cm.display.selForContextMenu = null;\n  }\n\n  function replaceRange(doc, code, from, to, origin) {\n    var assign;\n\n    if (!to) { to = from; }\n    if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); }\n    if (typeof code == \"string\") { code = doc.splitLines(code); }\n    makeChange(doc, {from: from, to: to, text: code, origin: origin});\n  }\n\n  // Rebasing/resetting history to deal with externally-sourced changes\n\n  function rebaseHistSelSingle(pos, from, to, diff) {\n    if (to < pos.line) {\n      pos.line += diff;\n    } else if (from < pos.line) {\n      pos.line = from;\n      pos.ch = 0;\n    }\n  }\n\n  // Tries to rebase an array of history events given a change in the\n  // document. If the change touches the same lines as the event, the\n  // event, and everything 'behind' it, is discarded. If the change is\n  // before the event, the event's positions are updated. Uses a\n  // copy-on-write scheme for the positions, to avoid having to\n  // reallocate them all on every rebase, but also avoid problems with\n  // shared position objects being unsafely updated.\n  function rebaseHistArray(array, from, to, diff) {\n    for (var i = 0; i < array.length; ++i) {\n      var sub = array[i], ok = true;\n      if (sub.ranges) {\n        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n        for (var j = 0; j < sub.ranges.length; j++) {\n          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n        }\n        continue\n      }\n      for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {\n        var cur = sub.changes[j$1];\n        if (to < cur.from.line) {\n          cur.from = Pos(cur.from.line + diff, cur.from.ch);\n          cur.to = Pos(cur.to.line + diff, cur.to.ch);\n        } else if (from <= cur.to.line) {\n          ok = false;\n          break\n        }\n      }\n      if (!ok) {\n        array.splice(0, i + 1);\n        i = 0;\n      }\n    }\n  }\n\n  function rebaseHist(hist, change) {\n    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n    rebaseHistArray(hist.done, from, to, diff);\n    rebaseHistArray(hist.undone, from, to, diff);\n  }\n\n  // Utility for applying a change to a line by handle or number,\n  // returning the number and optionally registering the line as\n  // changed.\n  function changeLine(doc, handle, changeType, op) {\n    var no = handle, line = handle;\n    if (typeof handle == \"number\") { line = getLine(doc, clipLine(doc, handle)); }\n    else { no = lineNo(handle); }\n    if (no == null) { return null }\n    if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }\n    return line\n  }\n\n  // The document is represented as a BTree consisting of leaves, with\n  // chunk of lines in them, and branches, with up to ten leaves or\n  // other branch nodes below them. The top node is always a branch\n  // node, and is the document object itself (meaning it has\n  // additional methods and properties).\n  //\n  // All nodes have parent links. The tree is used both to go from\n  // line numbers to line objects, and to go from objects to numbers.\n  // It also indexes by height, and is used to convert between height\n  // and line object, and to find the total height of the document.\n  //\n  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\n  function LeafChunk(lines) {\n    this.lines = lines;\n    this.parent = null;\n    var height = 0;\n    for (var i = 0; i < lines.length; ++i) {\n      lines[i].parent = this;\n      height += lines[i].height;\n    }\n    this.height = height;\n  }\n\n  LeafChunk.prototype = {\n    chunkSize: function() { return this.lines.length },\n\n    // Remove the n lines at offset 'at'.\n    removeInner: function(at, n) {\n      for (var i = at, e = at + n; i < e; ++i) {\n        var line = this.lines[i];\n        this.height -= line.height;\n        cleanUpLine(line);\n        signalLater(line, \"delete\");\n      }\n      this.lines.splice(at, n);\n    },\n\n    // Helper used to collapse a small branch into a single leaf.\n    collapse: function(lines) {\n      lines.push.apply(lines, this.lines);\n    },\n\n    // Insert the given array of lines at offset 'at', count them as\n    // having the given height.\n    insertInner: function(at, lines, height) {\n      this.height += height;\n      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n      for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; }\n    },\n\n    // Used to iterate over a part of the tree.\n    iterN: function(at, n, op) {\n      for (var e = at + n; at < e; ++at)\n        { if (op(this.lines[at])) { return true } }\n    }\n  };\n\n  function BranchChunk(children) {\n    this.children = children;\n    var size = 0, height = 0;\n    for (var i = 0; i < children.length; ++i) {\n      var ch = children[i];\n      size += ch.chunkSize(); height += ch.height;\n      ch.parent = this;\n    }\n    this.size = size;\n    this.height = height;\n    this.parent = null;\n  }\n\n  BranchChunk.prototype = {\n    chunkSize: function() { return this.size },\n\n    removeInner: function(at, n) {\n      this.size -= n;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var rm = Math.min(n, sz - at), oldHeight = child.height;\n          child.removeInner(at, rm);\n          this.height -= oldHeight - child.height;\n          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }\n          if ((n -= rm) == 0) { break }\n          at = 0;\n        } else { at -= sz; }\n      }\n      // If the result is smaller than 25 lines, ensure that it is a\n      // single leaf node.\n      if (this.size - n < 25 &&\n          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n        var lines = [];\n        this.collapse(lines);\n        this.children = [new LeafChunk(lines)];\n        this.children[0].parent = this;\n      }\n    },\n\n    collapse: function(lines) {\n      for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); }\n    },\n\n    insertInner: function(at, lines, height) {\n      this.size += lines.length;\n      this.height += height;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at <= sz) {\n          child.insertInner(at, lines, height);\n          if (child.lines && child.lines.length > 50) {\n            // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.\n            // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.\n            var remaining = child.lines.length % 25 + 25;\n            for (var pos = remaining; pos < child.lines.length;) {\n              var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));\n              child.height -= leaf.height;\n              this.children.splice(++i, 0, leaf);\n              leaf.parent = this;\n            }\n            child.lines = child.lines.slice(0, remaining);\n            this.maybeSpill();\n          }\n          break\n        }\n        at -= sz;\n      }\n    },\n\n    // When a node has grown, check whether it should be split.\n    maybeSpill: function() {\n      if (this.children.length <= 10) { return }\n      var me = this;\n      do {\n        var spilled = me.children.splice(me.children.length - 5, 5);\n        var sibling = new BranchChunk(spilled);\n        if (!me.parent) { // Become the parent node\n          var copy = new BranchChunk(me.children);\n          copy.parent = me;\n          me.children = [copy, sibling];\n          me = copy;\n       } else {\n          me.size -= sibling.size;\n          me.height -= sibling.height;\n          var myIndex = indexOf(me.parent.children, me);\n          me.parent.children.splice(myIndex + 1, 0, sibling);\n        }\n        sibling.parent = me.parent;\n      } while (me.children.length > 10)\n      me.parent.maybeSpill();\n    },\n\n    iterN: function(at, n, op) {\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var used = Math.min(n, sz - at);\n          if (child.iterN(at, used, op)) { return true }\n          if ((n -= used) == 0) { break }\n          at = 0;\n        } else { at -= sz; }\n      }\n    }\n  };\n\n  // Line widgets are block elements displayed above or below a line.\n\n  var LineWidget = function(doc, node, options) {\n    if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))\n      { this[opt] = options[opt]; } } }\n    this.doc = doc;\n    this.node = node;\n  };\n\n  LineWidget.prototype.clear = function () {\n    var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n    if (no == null || !ws) { return }\n    for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } }\n    if (!ws.length) { line.widgets = null; }\n    var height = widgetHeight(this);\n    updateLineHeight(line, Math.max(0, line.height - height));\n    if (cm) {\n      runInOp(cm, function () {\n        adjustScrollWhenAboveVisible(cm, line, -height);\n        regLineChange(cm, no, \"widget\");\n      });\n      signalLater(cm, \"lineWidgetCleared\", cm, this, no);\n    }\n  };\n\n  LineWidget.prototype.changed = function () {\n      var this$1 = this;\n\n    var oldH = this.height, cm = this.doc.cm, line = this.line;\n    this.height = null;\n    var diff = widgetHeight(this) - oldH;\n    if (!diff) { return }\n    if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); }\n    if (cm) {\n      runInOp(cm, function () {\n        cm.curOp.forceUpdate = true;\n        adjustScrollWhenAboveVisible(cm, line, diff);\n        signalLater(cm, \"lineWidgetChanged\", cm, this$1, lineNo(line));\n      });\n    }\n  };\n  eventMixin(LineWidget);\n\n  function adjustScrollWhenAboveVisible(cm, line, diff) {\n    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n      { addToScrollTop(cm, diff); }\n  }\n\n  function addLineWidget(doc, handle, node, options) {\n    var widget = new LineWidget(doc, node, options);\n    var cm = doc.cm;\n    if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }\n    changeLine(doc, handle, \"widget\", function (line) {\n      var widgets = line.widgets || (line.widgets = []);\n      if (widget.insertAt == null) { widgets.push(widget); }\n      else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); }\n      widget.line = line;\n      if (cm && !lineIsHidden(doc, line)) {\n        var aboveVisible = heightAtLine(line) < doc.scrollTop;\n        updateLineHeight(line, line.height + widgetHeight(widget));\n        if (aboveVisible) { addToScrollTop(cm, widget.height); }\n        cm.curOp.forceUpdate = true;\n      }\n      return true\n    });\n    if (cm) { signalLater(cm, \"lineWidgetAdded\", cm, widget, typeof handle == \"number\" ? handle : lineNo(handle)); }\n    return widget\n  }\n\n  // TEXTMARKERS\n\n  // Created with markText and setBookmark methods. A TextMarker is a\n  // handle that can be used to clear or find a marked position in the\n  // document. Line objects hold arrays (markedSpans) containing\n  // {from, to, marker} object pointing to such marker objects, and\n  // indicating that such a marker is present on that line. Multiple\n  // lines may point to the same marker when it spans across lines.\n  // The spans will have null for their from/to properties when the\n  // marker continues beyond the start/end of the line. Markers have\n  // links back to the lines they currently touch.\n\n  // Collapsed markers have unique ids, in order to be able to order\n  // them, which is needed for uniquely determining an outer marker\n  // when they overlap (they may nest, but not partially overlap).\n  var nextMarkerId = 0;\n\n  var TextMarker = function(doc, type) {\n    this.lines = [];\n    this.type = type;\n    this.doc = doc;\n    this.id = ++nextMarkerId;\n  };\n\n  // Clear the marker.\n  TextMarker.prototype.clear = function () {\n    if (this.explicitlyCleared) { return }\n    var cm = this.doc.cm, withOp = cm && !cm.curOp;\n    if (withOp) { startOperation(cm); }\n    if (hasHandler(this, \"clear\")) {\n      var found = this.find();\n      if (found) { signalLater(this, \"clear\", found.from, found.to); }\n    }\n    var min = null, max = null;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), \"text\"); }\n      else if (cm) {\n        if (span.to != null) { max = lineNo(line); }\n        if (span.from != null) { min = lineNo(line); }\n      }\n      line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n        { updateLineHeight(line, textHeight(cm.display)); }\n    }\n    if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {\n      var visual = visualLine(this.lines[i$1]), len = lineLength(visual);\n      if (len > cm.display.maxLineLength) {\n        cm.display.maxLine = visual;\n        cm.display.maxLineLength = len;\n        cm.display.maxLineChanged = true;\n      }\n    } }\n\n    if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }\n    this.lines.length = 0;\n    this.explicitlyCleared = true;\n    if (this.atomic && this.doc.cantEdit) {\n      this.doc.cantEdit = false;\n      if (cm) { reCheckSelection(cm.doc); }\n    }\n    if (cm) { signalLater(cm, \"markerCleared\", cm, this, min, max); }\n    if (withOp) { endOperation(cm); }\n    if (this.parent) { this.parent.clear(); }\n  };\n\n  // Find the position of the marker in the document. Returns a {from,\n  // to} object by default. Side can be passed to get a specific side\n  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n  // Pos objects returned contain a line object, rather than a line\n  // number (used to prevent looking up the same line twice).\n  TextMarker.prototype.find = function (side, lineObj) {\n    if (side == null && this.type == \"bookmark\") { side = 1; }\n    var from, to;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (span.from != null) {\n        from = Pos(lineObj ? line : lineNo(line), span.from);\n        if (side == -1) { return from }\n      }\n      if (span.to != null) {\n        to = Pos(lineObj ? line : lineNo(line), span.to);\n        if (side == 1) { return to }\n      }\n    }\n    return from && {from: from, to: to}\n  };\n\n  // Signals that the marker's widget changed, and surrounding layout\n  // should be recomputed.\n  TextMarker.prototype.changed = function () {\n      var this$1 = this;\n\n    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n    if (!pos || !cm) { return }\n    runInOp(cm, function () {\n      var line = pos.line, lineN = lineNo(pos.line);\n      var view = findViewForLine(cm, lineN);\n      if (view) {\n        clearLineMeasurementCacheFor(view);\n        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n      }\n      cm.curOp.updateMaxLine = true;\n      if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n        var oldHeight = widget.height;\n        widget.height = null;\n        var dHeight = widgetHeight(widget) - oldHeight;\n        if (dHeight)\n          { updateLineHeight(line, line.height + dHeight); }\n      }\n      signalLater(cm, \"markerChanged\", cm, this$1);\n    });\n  };\n\n  TextMarker.prototype.attachLine = function (line) {\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp;\n      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n        { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }\n    }\n    this.lines.push(line);\n  };\n\n  TextMarker.prototype.detachLine = function (line) {\n    this.lines.splice(indexOf(this.lines, line), 1);\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp\n      ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n    }\n  };\n  eventMixin(TextMarker);\n\n  // Create a marker, wire it up to the right lines, and\n  function markText(doc, from, to, options, type) {\n    // Shared markers (across linked documents) are handled separately\n    // (markTextShared will call out to this again, once per\n    // document).\n    if (options && options.shared) { return markTextShared(doc, from, to, options, type) }\n    // Ensure we are in an operation.\n    if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }\n\n    var marker = new TextMarker(doc, type), diff = cmp(from, to);\n    if (options) { copyObj(options, marker, false); }\n    // Don't connect empty markers unless clearWhenEmpty is false\n    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n      { return marker }\n    if (marker.replacedWith) {\n      // Showing up as a widget implies collapsed (widget replaces text)\n      marker.collapsed = true;\n      marker.widgetNode = eltP(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n      if (!options.handleMouseEvents) { marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\"); }\n      if (options.insertLeft) { marker.widgetNode.insertLeft = true; }\n    }\n    if (marker.collapsed) {\n      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n        { throw new Error(\"Inserting collapsed marker partially overlapping an existing one\") }\n      seeCollapsedSpans();\n    }\n\n    if (marker.addToHistory)\n      { addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN); }\n\n    var curLine = from.line, cm = doc.cm, updateMaxLine;\n    doc.iter(curLine, to.line + 1, function (line) {\n      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n        { updateMaxLine = true; }\n      if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }\n      addMarkedSpan(line, new MarkedSpan(marker,\n                                         curLine == from.line ? from.ch : null,\n                                         curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp);\n      ++curLine;\n    });\n    // lineIsHidden depends on the presence of the spans, so needs a second pass\n    if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {\n      if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }\n    }); }\n\n    if (marker.clearOnEnter) { on(marker, \"beforeCursorEnter\", function () { return marker.clear(); }); }\n\n    if (marker.readOnly) {\n      seeReadOnlySpans();\n      if (doc.history.done.length || doc.history.undone.length)\n        { doc.clearHistory(); }\n    }\n    if (marker.collapsed) {\n      marker.id = ++nextMarkerId;\n      marker.atomic = true;\n    }\n    if (cm) {\n      // Sync editor state\n      if (updateMaxLine) { cm.curOp.updateMaxLine = true; }\n      if (marker.collapsed)\n        { regChange(cm, from.line, to.line + 1); }\n      else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||\n               marker.attributes || marker.title)\n        { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, \"text\"); } }\n      if (marker.atomic) { reCheckSelection(cm.doc); }\n      signalLater(cm, \"markerAdded\", cm, marker);\n    }\n    return marker\n  }\n\n  // SHARED TEXTMARKERS\n\n  // A shared marker spans multiple linked documents. It is\n  // implemented as a meta-marker-object controlling multiple normal\n  // markers.\n  var SharedTextMarker = function(markers, primary) {\n    this.markers = markers;\n    this.primary = primary;\n    for (var i = 0; i < markers.length; ++i)\n      { markers[i].parent = this; }\n  };\n\n  SharedTextMarker.prototype.clear = function () {\n    if (this.explicitlyCleared) { return }\n    this.explicitlyCleared = true;\n    for (var i = 0; i < this.markers.length; ++i)\n      { this.markers[i].clear(); }\n    signalLater(this, \"clear\");\n  };\n\n  SharedTextMarker.prototype.find = function (side, lineObj) {\n    return this.primary.find(side, lineObj)\n  };\n  eventMixin(SharedTextMarker);\n\n  function markTextShared(doc, from, to, options, type) {\n    options = copyObj(options);\n    options.shared = false;\n    var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n    var widget = options.widgetNode;\n    linkedDocs(doc, function (doc) {\n      if (widget) { options.widgetNode = widget.cloneNode(true); }\n      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n      for (var i = 0; i < doc.linked.length; ++i)\n        { if (doc.linked[i].isParent) { return } }\n      primary = lst(markers);\n    });\n    return new SharedTextMarker(markers, primary)\n  }\n\n  function findSharedMarkers(doc) {\n    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })\n  }\n\n  function copySharedMarkers(doc, markers) {\n    for (var i = 0; i < markers.length; i++) {\n      var marker = markers[i], pos = marker.find();\n      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n      if (cmp(mFrom, mTo)) {\n        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n        marker.markers.push(subMark);\n        subMark.parent = marker;\n      }\n    }\n  }\n\n  function detachSharedMarkers(markers) {\n    var loop = function ( i ) {\n      var marker = markers[i], linked = [marker.primary.doc];\n      linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });\n      for (var j = 0; j < marker.markers.length; j++) {\n        var subMarker = marker.markers[j];\n        if (indexOf(linked, subMarker.doc) == -1) {\n          subMarker.parent = null;\n          marker.markers.splice(j--, 1);\n        }\n      }\n    };\n\n    for (var i = 0; i < markers.length; i++) loop( i );\n  }\n\n  var nextDocId = 0;\n  var Doc = function(text, mode, firstLine, lineSep, direction) {\n    if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }\n    if (firstLine == null) { firstLine = 0; }\n\n    BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n    this.first = firstLine;\n    this.scrollTop = this.scrollLeft = 0;\n    this.cantEdit = false;\n    this.cleanGeneration = 1;\n    this.modeFrontier = this.highlightFrontier = firstLine;\n    var start = Pos(firstLine, 0);\n    this.sel = simpleSelection(start);\n    this.history = new History(null);\n    this.id = ++nextDocId;\n    this.modeOption = mode;\n    this.lineSep = lineSep;\n    this.direction = (direction == \"rtl\") ? \"rtl\" : \"ltr\";\n    this.extend = false;\n\n    if (typeof text == \"string\") { text = this.splitLines(text); }\n    updateDoc(this, {from: start, to: start, text: text});\n    setSelection(this, simpleSelection(start), sel_dontScroll);\n  };\n\n  Doc.prototype = createObj(BranchChunk.prototype, {\n    constructor: Doc,\n    // Iterate over the document. Supports two forms -- with only one\n    // argument, it calls that for each line in the document. With\n    // three, it iterates over the range given by the first two (with\n    // the second being non-inclusive).\n    iter: function(from, to, op) {\n      if (op) { this.iterN(from - this.first, to - from, op); }\n      else { this.iterN(this.first, this.first + this.size, from); }\n    },\n\n    // Non-public interface for adding and removing lines.\n    insert: function(at, lines) {\n      var height = 0;\n      for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }\n      this.insertInner(at - this.first, lines, height);\n    },\n    remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n    // From here, the methods are part of the public interface. Most\n    // are also available from CodeMirror (editor) instances.\n\n    getValue: function(lineSep) {\n      var lines = getLines(this, this.first, this.first + this.size);\n      if (lineSep === false) { return lines }\n      return lines.join(lineSep || this.lineSeparator())\n    },\n    setValue: docMethodOp(function(code) {\n      var top = Pos(this.first, 0), last = this.first + this.size - 1;\n      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n                        text: this.splitLines(code), origin: \"setValue\", full: true}, true);\n      if (this.cm) { scrollToCoords(this.cm, 0, 0); }\n      setSelection(this, simpleSelection(top), sel_dontScroll);\n    }),\n    replaceRange: function(code, from, to, origin) {\n      from = clipPos(this, from);\n      to = to ? clipPos(this, to) : from;\n      replaceRange(this, code, from, to, origin);\n    },\n    getRange: function(from, to, lineSep) {\n      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n      if (lineSep === false) { return lines }\n      if (lineSep === '') { return lines.join('') }\n      return lines.join(lineSep || this.lineSeparator())\n    },\n\n    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},\n\n    getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},\n    getLineNumber: function(line) {return lineNo(line)},\n\n    getLineHandleVisualStart: function(line) {\n      if (typeof line == \"number\") { line = getLine(this, line); }\n      return visualLine(line)\n    },\n\n    lineCount: function() {return this.size},\n    firstLine: function() {return this.first},\n    lastLine: function() {return this.first + this.size - 1},\n\n    clipPos: function(pos) {return clipPos(this, pos)},\n\n    getCursor: function(start) {\n      var range = this.sel.primary(), pos;\n      if (start == null || start == \"head\") { pos = range.head; }\n      else if (start == \"anchor\") { pos = range.anchor; }\n      else if (start == \"end\" || start == \"to\" || start === false) { pos = range.to(); }\n      else { pos = range.from(); }\n      return pos\n    },\n    listSelections: function() { return this.sel.ranges },\n    somethingSelected: function() {return this.sel.somethingSelected()},\n\n    setCursor: docMethodOp(function(line, ch, options) {\n      setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n    }),\n    setSelection: docMethodOp(function(anchor, head, options) {\n      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n    }),\n    extendSelection: docMethodOp(function(head, other, options) {\n      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n    }),\n    extendSelections: docMethodOp(function(heads, options) {\n      extendSelections(this, clipPosArray(this, heads), options);\n    }),\n    extendSelectionsBy: docMethodOp(function(f, options) {\n      var heads = map(this.sel.ranges, f);\n      extendSelections(this, clipPosArray(this, heads), options);\n    }),\n    setSelections: docMethodOp(function(ranges, primary, options) {\n      if (!ranges.length) { return }\n      var out = [];\n      for (var i = 0; i < ranges.length; i++)\n        { out[i] = new Range(clipPos(this, ranges[i].anchor),\n                           clipPos(this, ranges[i].head || ranges[i].anchor)); }\n      if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }\n      setSelection(this, normalizeSelection(this.cm, out, primary), options);\n    }),\n    addSelection: docMethodOp(function(anchor, head, options) {\n      var ranges = this.sel.ranges.slice(0);\n      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n      setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options);\n    }),\n\n    getSelection: function(lineSep) {\n      var ranges = this.sel.ranges, lines;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        lines = lines ? lines.concat(sel) : sel;\n      }\n      if (lineSep === false) { return lines }\n      else { return lines.join(lineSep || this.lineSeparator()) }\n    },\n    getSelections: function(lineSep) {\n      var parts = [], ranges = this.sel.ranges;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); }\n        parts[i] = sel;\n      }\n      return parts\n    },\n    replaceSelection: function(code, collapse, origin) {\n      var dup = [];\n      for (var i = 0; i < this.sel.ranges.length; i++)\n        { dup[i] = code; }\n      this.replaceSelections(dup, collapse, origin || \"+input\");\n    },\n    replaceSelections: docMethodOp(function(code, collapse, origin) {\n      var changes = [], sel = this.sel;\n      for (var i = 0; i < sel.ranges.length; i++) {\n        var range = sel.ranges[i];\n        changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};\n      }\n      var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n      for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)\n        { makeChange(this, changes[i$1]); }\n      if (newSel) { setSelectionReplaceHistory(this, newSel); }\n      else if (this.cm) { ensureCursorVisible(this.cm); }\n    }),\n    undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n    redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n    setExtending: function(val) {this.extend = val;},\n    getExtending: function() {return this.extend},\n\n    historySize: function() {\n      var hist = this.history, done = 0, undone = 0;\n      for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }\n      for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }\n      return {undo: done, redo: undone}\n    },\n    clearHistory: function() {\n      var this$1 = this;\n\n      this.history = new History(this.history);\n      linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);\n    },\n\n    markClean: function() {\n      this.cleanGeneration = this.changeGeneration(true);\n    },\n    changeGeneration: function(forceSplit) {\n      if (forceSplit)\n        { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }\n      return this.history.generation\n    },\n    isClean: function (gen) {\n      return this.history.generation == (gen || this.cleanGeneration)\n    },\n\n    getHistory: function() {\n      return {done: copyHistoryArray(this.history.done),\n              undone: copyHistoryArray(this.history.undone)}\n    },\n    setHistory: function(histData) {\n      var hist = this.history = new History(this.history);\n      hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n    },\n\n    setGutterMarker: docMethodOp(function(line, gutterID, value) {\n      return changeLine(this, line, \"gutter\", function (line) {\n        var markers = line.gutterMarkers || (line.gutterMarkers = {});\n        markers[gutterID] = value;\n        if (!value && isEmpty(markers)) { line.gutterMarkers = null; }\n        return true\n      })\n    }),\n\n    clearGutter: docMethodOp(function(gutterID) {\n      var this$1 = this;\n\n      this.iter(function (line) {\n        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n          changeLine(this$1, line, \"gutter\", function () {\n            line.gutterMarkers[gutterID] = null;\n            if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }\n            return true\n          });\n        }\n      });\n    }),\n\n    lineInfo: function(line) {\n      var n;\n      if (typeof line == \"number\") {\n        if (!isLine(this, line)) { return null }\n        n = line;\n        line = getLine(this, line);\n        if (!line) { return null }\n      } else {\n        n = lineNo(line);\n        if (n == null) { return null }\n      }\n      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n              widgets: line.widgets}\n    },\n\n    addLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n        var prop = where == \"text\" ? \"textClass\"\n                 : where == \"background\" ? \"bgClass\"\n                 : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n        if (!line[prop]) { line[prop] = cls; }\n        else if (classTest(cls).test(line[prop])) { return false }\n        else { line[prop] += \" \" + cls; }\n        return true\n      })\n    }),\n    removeLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n        var prop = where == \"text\" ? \"textClass\"\n                 : where == \"background\" ? \"bgClass\"\n                 : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n        var cur = line[prop];\n        if (!cur) { return false }\n        else if (cls == null) { line[prop] = null; }\n        else {\n          var found = cur.match(classTest(cls));\n          if (!found) { return false }\n          var end = found.index + found[0].length;\n          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n        }\n        return true\n      })\n    }),\n\n    addLineWidget: docMethodOp(function(handle, node, options) {\n      return addLineWidget(this, handle, node, options)\n    }),\n    removeLineWidget: function(widget) { widget.clear(); },\n\n    markText: function(from, to, options) {\n      return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\")\n    },\n    setBookmark: function(pos, options) {\n      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n                      insertLeft: options && options.insertLeft,\n                      clearWhenEmpty: false, shared: options && options.shared,\n                      handleMouseEvents: options && options.handleMouseEvents};\n      pos = clipPos(this, pos);\n      return markText(this, pos, pos, realOpts, \"bookmark\")\n    },\n    findMarksAt: function(pos) {\n      pos = clipPos(this, pos);\n      var markers = [], spans = getLine(this, pos.line).markedSpans;\n      if (spans) { for (var i = 0; i < spans.length; ++i) {\n        var span = spans[i];\n        if ((span.from == null || span.from <= pos.ch) &&\n            (span.to == null || span.to >= pos.ch))\n          { markers.push(span.marker.parent || span.marker); }\n      } }\n      return markers\n    },\n    findMarks: function(from, to, filter) {\n      from = clipPos(this, from); to = clipPos(this, to);\n      var found = [], lineNo = from.line;\n      this.iter(from.line, to.line + 1, function (line) {\n        var spans = line.markedSpans;\n        if (spans) { for (var i = 0; i < spans.length; i++) {\n          var span = spans[i];\n          if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||\n                span.from == null && lineNo != from.line ||\n                span.from != null && lineNo == to.line && span.from >= to.ch) &&\n              (!filter || filter(span.marker)))\n            { found.push(span.marker.parent || span.marker); }\n        } }\n        ++lineNo;\n      });\n      return found\n    },\n    getAllMarks: function() {\n      var markers = [];\n      this.iter(function (line) {\n        var sps = line.markedSpans;\n        if (sps) { for (var i = 0; i < sps.length; ++i)\n          { if (sps[i].from != null) { markers.push(sps[i].marker); } } }\n      });\n      return markers\n    },\n\n    posFromIndex: function(off) {\n      var ch, lineNo = this.first, sepSize = this.lineSeparator().length;\n      this.iter(function (line) {\n        var sz = line.text.length + sepSize;\n        if (sz > off) { ch = off; return true }\n        off -= sz;\n        ++lineNo;\n      });\n      return clipPos(this, Pos(lineNo, ch))\n    },\n    indexFromPos: function (coords) {\n      coords = clipPos(this, coords);\n      var index = coords.ch;\n      if (coords.line < this.first || coords.ch < 0) { return 0 }\n      var sepSize = this.lineSeparator().length;\n      this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value\n        index += line.text.length + sepSize;\n      });\n      return index\n    },\n\n    copy: function(copyHistory) {\n      var doc = new Doc(getLines(this, this.first, this.first + this.size),\n                        this.modeOption, this.first, this.lineSep, this.direction);\n      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n      doc.sel = this.sel;\n      doc.extend = false;\n      if (copyHistory) {\n        doc.history.undoDepth = this.history.undoDepth;\n        doc.setHistory(this.getHistory());\n      }\n      return doc\n    },\n\n    linkedDoc: function(options) {\n      if (!options) { options = {}; }\n      var from = this.first, to = this.first + this.size;\n      if (options.from != null && options.from > from) { from = options.from; }\n      if (options.to != null && options.to < to) { to = options.to; }\n      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);\n      if (options.sharedHist) { copy.history = this.history\n      ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n      copySharedMarkers(copy, findSharedMarkers(this));\n      return copy\n    },\n    unlinkDoc: function(other) {\n      if (other instanceof CodeMirror) { other = other.doc; }\n      if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {\n        var link = this.linked[i];\n        if (link.doc != other) { continue }\n        this.linked.splice(i, 1);\n        other.unlinkDoc(this);\n        detachSharedMarkers(findSharedMarkers(this));\n        break\n      } }\n      // If the histories were shared, split them again\n      if (other.history == this.history) {\n        var splitIds = [other.id];\n        linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);\n        other.history = new History(null);\n        other.history.done = copyHistoryArray(this.history.done, splitIds);\n        other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n      }\n    },\n    iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n    getMode: function() {return this.mode},\n    getEditor: function() {return this.cm},\n\n    splitLines: function(str) {\n      if (this.lineSep) { return str.split(this.lineSep) }\n      return splitLinesAuto(str)\n    },\n    lineSeparator: function() { return this.lineSep || \"\\n\" },\n\n    setDirection: docMethodOp(function (dir) {\n      if (dir != \"rtl\") { dir = \"ltr\"; }\n      if (dir == this.direction) { return }\n      this.direction = dir;\n      this.iter(function (line) { return line.order = null; });\n      if (this.cm) { directionChanged(this.cm); }\n    })\n  });\n\n  // Public alias.\n  Doc.prototype.eachLine = Doc.prototype.iter;\n\n  // Kludge to work around strange IE behavior where it'll sometimes\n  // re-fire a series of drag-related events right after the drop (#1551)\n  var lastDrop = 0;\n\n  function onDrop(e) {\n    var cm = this;\n    clearDragCursor(cm);\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n      { return }\n    e_preventDefault(e);\n    if (ie) { lastDrop = +new Date; }\n    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n    if (!pos || cm.isReadOnly()) { return }\n    // Might be a file drop, in which case we simply extract the text\n    // and insert it.\n    if (files && files.length && window.FileReader && window.File) {\n      var n = files.length, text = Array(n), read = 0;\n      var markAsReadAndPasteIfAllFilesAreRead = function () {\n        if (++read == n) {\n          operation(cm, function () {\n            pos = clipPos(cm.doc, pos);\n            var change = {from: pos, to: pos,\n                          text: cm.doc.splitLines(\n                              text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())),\n                          origin: \"paste\"};\n            makeChange(cm.doc, change);\n            setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))));\n          })();\n        }\n      };\n      var readTextFromFile = function (file, i) {\n        if (cm.options.allowDropFileTypes &&\n            indexOf(cm.options.allowDropFileTypes, file.type) == -1) {\n          markAsReadAndPasteIfAllFilesAreRead();\n          return\n        }\n        var reader = new FileReader;\n        reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); };\n        reader.onload = function () {\n          var content = reader.result;\n          if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) {\n            markAsReadAndPasteIfAllFilesAreRead();\n            return\n          }\n          text[i] = content;\n          markAsReadAndPasteIfAllFilesAreRead();\n        };\n        reader.readAsText(file);\n      };\n      for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); }\n    } else { // Normal drop\n      // Don't do a replace if the drop happened inside of the selected text.\n      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n        cm.state.draggingText(e);\n        // Ensure the editor is re-focused\n        setTimeout(function () { return cm.display.input.focus(); }, 20);\n        return\n      }\n      try {\n        var text$1 = e.dataTransfer.getData(\"Text\");\n        if (text$1) {\n          var selected;\n          if (cm.state.draggingText && !cm.state.draggingText.copy)\n            { selected = cm.listSelections(); }\n          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n          if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)\n            { replaceRange(cm.doc, \"\", selected[i$1].anchor, selected[i$1].head, \"drag\"); } }\n          cm.replaceSelection(text$1, \"around\", \"paste\");\n          cm.display.input.focus();\n        }\n      }\n      catch(e$1){}\n    }\n  }\n\n  function onDragStart(cm, e) {\n    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }\n\n    e.dataTransfer.setData(\"Text\", cm.getSelection());\n    e.dataTransfer.effectAllowed = \"copyMove\";\n\n    // Use dummy image instead of default browsers image.\n    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n    if (e.dataTransfer.setDragImage && !safari) {\n      var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n      img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n      if (presto) {\n        img.width = img.height = 1;\n        cm.display.wrapper.appendChild(img);\n        // Force a relayout, or Opera won't use our image for some obscure reason\n        img._top = img.offsetTop;\n      }\n      e.dataTransfer.setDragImage(img, 0, 0);\n      if (presto) { img.parentNode.removeChild(img); }\n    }\n  }\n\n  function onDragOver(cm, e) {\n    var pos = posFromMouse(cm, e);\n    if (!pos) { return }\n    var frag = document.createDocumentFragment();\n    drawSelectionCursor(cm, pos, frag);\n    if (!cm.display.dragCursor) {\n      cm.display.dragCursor = elt(\"div\", null, \"CodeMirror-cursors CodeMirror-dragcursors\");\n      cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);\n    }\n    removeChildrenAndAdd(cm.display.dragCursor, frag);\n  }\n\n  function clearDragCursor(cm) {\n    if (cm.display.dragCursor) {\n      cm.display.lineSpace.removeChild(cm.display.dragCursor);\n      cm.display.dragCursor = null;\n    }\n  }\n\n  // These must be handled carefully, because naively registering a\n  // handler for each editor will cause the editors to never be\n  // garbage collected.\n\n  function forEachCodeMirror(f) {\n    if (!document.getElementsByClassName) { return }\n    var byClass = document.getElementsByClassName(\"CodeMirror\"), editors = [];\n    for (var i = 0; i < byClass.length; i++) {\n      var cm = byClass[i].CodeMirror;\n      if (cm) { editors.push(cm); }\n    }\n    if (editors.length) { editors[0].operation(function () {\n      for (var i = 0; i < editors.length; i++) { f(editors[i]); }\n    }); }\n  }\n\n  var globalsRegistered = false;\n  function ensureGlobalHandlers() {\n    if (globalsRegistered) { return }\n    registerGlobalHandlers();\n    globalsRegistered = true;\n  }\n  function registerGlobalHandlers() {\n    // When the window resizes, we need to refresh active editors.\n    var resizeTimer;\n    on(window, \"resize\", function () {\n      if (resizeTimer == null) { resizeTimer = setTimeout(function () {\n        resizeTimer = null;\n        forEachCodeMirror(onResize);\n      }, 100); }\n    });\n    // When the window loses focus, we want to show the editor as blurred\n    on(window, \"blur\", function () { return forEachCodeMirror(onBlur); });\n  }\n  // Called when the window resizes\n  function onResize(cm) {\n    var d = cm.display;\n    // Might be a text scaling operation, clear size caches.\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n    d.scrollbarsClipped = false;\n    cm.setSize();\n  }\n\n  var keyNames = {\n    3: \"Pause\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n    19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n    36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n    46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\",\n    106: \"*\", 107: \"=\", 109: \"-\", 110: \".\", 111: \"/\", 145: \"ScrollLock\",\n    173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n    221: \"]\", 222: \"'\", 224: \"Mod\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n    63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n  };\n\n  // Number keys\n  for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }\n  // Alphabetic keys\n  for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }\n  // Function keys\n  for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = \"F\" + i$2; }\n\n  var keyMap = {};\n\n  keyMap.basic = {\n    \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n    \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n    \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n    \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n    \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n    \"Esc\": \"singleSelection\"\n  };\n  // Note that the save and find-related commands aren't defined by\n  // default. User code or addons can define them. Unknown commands\n  // are simply ignored.\n  keyMap.pcDefault = {\n    \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n    \"Ctrl-Home\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n    \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n    \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n    \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n    \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n    \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n    \"fallthrough\": \"basic\"\n  };\n  // Very basic readline/emacs-style bindings, which are standard on Mac.\n  keyMap.emacsy = {\n    \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n    \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\", \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\",\n    \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\",\n    \"Ctrl-T\": \"transposeChars\", \"Ctrl-O\": \"openLine\"\n  };\n  keyMap.macDefault = {\n    \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n    \"Cmd-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n    \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n    \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n    \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n    \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n    \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n    \"fallthrough\": [\"basic\", \"emacsy\"]\n  };\n  keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n  // KEYMAP DISPATCH\n\n  function normalizeKeyName(name) {\n    var parts = name.split(/-(?!$)/);\n    name = parts[parts.length - 1];\n    var alt, ctrl, shift, cmd;\n    for (var i = 0; i < parts.length - 1; i++) {\n      var mod = parts[i];\n      if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }\n      else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n      else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n      else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n      else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n    }\n    if (alt) { name = \"Alt-\" + name; }\n    if (ctrl) { name = \"Ctrl-\" + name; }\n    if (cmd) { name = \"Cmd-\" + name; }\n    if (shift) { name = \"Shift-\" + name; }\n    return name\n  }\n\n  // This is a kludge to keep keymaps mostly working as raw objects\n  // (backwards compatibility) while at the same time support features\n  // like normalization and multi-stroke key bindings. It compiles a\n  // new normalized keymap, and then updates the old object to reflect\n  // this.\n  function normalizeKeyMap(keymap) {\n    var copy = {};\n    for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {\n      var value = keymap[keyname];\n      if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }\n      if (value == \"...\") { delete keymap[keyname]; continue }\n\n      var keys = map(keyname.split(\" \"), normalizeKeyName);\n      for (var i = 0; i < keys.length; i++) {\n        var val = (void 0), name = (void 0);\n        if (i == keys.length - 1) {\n          name = keys.join(\" \");\n          val = value;\n        } else {\n          name = keys.slice(0, i + 1).join(\" \");\n          val = \"...\";\n        }\n        var prev = copy[name];\n        if (!prev) { copy[name] = val; }\n        else if (prev != val) { throw new Error(\"Inconsistent bindings for \" + name) }\n      }\n      delete keymap[keyname];\n    } }\n    for (var prop in copy) { keymap[prop] = copy[prop]; }\n    return keymap\n  }\n\n  function lookupKey(key, map, handle, context) {\n    map = getKeyMap(map);\n    var found = map.call ? map.call(key, context) : map[key];\n    if (found === false) { return \"nothing\" }\n    if (found === \"...\") { return \"multi\" }\n    if (found != null && handle(found)) { return \"handled\" }\n\n    if (map.fallthrough) {\n      if (Object.prototype.toString.call(map.fallthrough) != \"[object Array]\")\n        { return lookupKey(key, map.fallthrough, handle, context) }\n      for (var i = 0; i < map.fallthrough.length; i++) {\n        var result = lookupKey(key, map.fallthrough[i], handle, context);\n        if (result) { return result }\n      }\n    }\n  }\n\n  // Modifier key presses don't count as 'real' key presses for the\n  // purpose of keymap fallthrough.\n  function isModifierKey(value) {\n    var name = typeof value == \"string\" ? value : keyNames[value.keyCode];\n    return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\"\n  }\n\n  function addModifierNames(name, event, noShift) {\n    var base = name;\n    if (event.altKey && base != \"Alt\") { name = \"Alt-\" + name; }\n    if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") { name = \"Ctrl-\" + name; }\n    if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Mod\") { name = \"Cmd-\" + name; }\n    if (!noShift && event.shiftKey && base != \"Shift\") { name = \"Shift-\" + name; }\n    return name\n  }\n\n  // Look up the name of a key as indicated by an event object.\n  function keyName(event, noShift) {\n    if (presto && event.keyCode == 34 && event[\"char\"]) { return false }\n    var name = keyNames[event.keyCode];\n    if (name == null || event.altGraphKey) { return false }\n    // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,\n    // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)\n    if (event.keyCode == 3 && event.code) { name = event.code; }\n    return addModifierNames(name, event, noShift)\n  }\n\n  function getKeyMap(val) {\n    return typeof val == \"string\" ? keyMap[val] : val\n  }\n\n  // Helper for deleting text near the selection(s), used to implement\n  // backspace, delete, and similar functionality.\n  function deleteNearSelection(cm, compute) {\n    var ranges = cm.doc.sel.ranges, kill = [];\n    // Build up a set of ranges to kill first, merging overlapping\n    // ranges.\n    for (var i = 0; i < ranges.length; i++) {\n      var toKill = compute(ranges[i]);\n      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n        var replaced = kill.pop();\n        if (cmp(replaced.from, toKill.from) < 0) {\n          toKill.from = replaced.from;\n          break\n        }\n      }\n      kill.push(toKill);\n    }\n    // Next, remove those actual ranges.\n    runInOp(cm, function () {\n      for (var i = kill.length - 1; i >= 0; i--)\n        { replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\"); }\n      ensureCursorVisible(cm);\n    });\n  }\n\n  function moveCharLogically(line, ch, dir) {\n    var target = skipExtendingChars(line.text, ch + dir, dir);\n    return target < 0 || target > line.text.length ? null : target\n  }\n\n  function moveLogically(line, start, dir) {\n    var ch = moveCharLogically(line, start.ch, dir);\n    return ch == null ? null : new Pos(start.line, ch, dir < 0 ? \"after\" : \"before\")\n  }\n\n  function endOfLine(visually, cm, lineObj, lineNo, dir) {\n    if (visually) {\n      if (cm.doc.direction == \"rtl\") { dir = -dir; }\n      var order = getOrder(lineObj, cm.doc.direction);\n      if (order) {\n        var part = dir < 0 ? lst(order) : order[0];\n        var moveInStorageOrder = (dir < 0) == (part.level == 1);\n        var sticky = moveInStorageOrder ? \"after\" : \"before\";\n        var ch;\n        // With a wrapped rtl chunk (possibly spanning multiple bidi parts),\n        // it could be that the last bidi part is not on the last visual line,\n        // since visual lines contain content order-consecutive chunks.\n        // Thus, in rtl, we are looking for the first (content-order) character\n        // in the rtl chunk that is on the last line (that is, the same line\n        // as the last (content-order) character).\n        if (part.level > 0 || cm.doc.direction == \"rtl\") {\n          var prep = prepareMeasureForLine(cm, lineObj);\n          ch = dir < 0 ? lineObj.text.length - 1 : 0;\n          var targetTop = measureCharPrepared(cm, prep, ch).top;\n          ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);\n          if (sticky == \"before\") { ch = moveCharLogically(lineObj, ch, 1); }\n        } else { ch = dir < 0 ? part.to : part.from; }\n        return new Pos(lineNo, ch, sticky)\n      }\n    }\n    return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? \"before\" : \"after\")\n  }\n\n  function moveVisually(cm, line, start, dir) {\n    var bidi = getOrder(line, cm.doc.direction);\n    if (!bidi) { return moveLogically(line, start, dir) }\n    if (start.ch >= line.text.length) {\n      start.ch = line.text.length;\n      start.sticky = \"before\";\n    } else if (start.ch <= 0) {\n      start.ch = 0;\n      start.sticky = \"after\";\n    }\n    var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];\n    if (cm.doc.direction == \"ltr\" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {\n      // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,\n      // nothing interesting happens.\n      return moveLogically(line, start, dir)\n    }\n\n    var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };\n    var prep;\n    var getWrappedLineExtent = function (ch) {\n      if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }\n      prep = prep || prepareMeasureForLine(cm, line);\n      return wrappedLineExtentChar(cm, line, prep, ch)\n    };\n    var wrappedLineExtent = getWrappedLineExtent(start.sticky == \"before\" ? mv(start, -1) : start.ch);\n\n    if (cm.doc.direction == \"rtl\" || part.level == 1) {\n      var moveInStorageOrder = (part.level == 1) == (dir < 0);\n      var ch = mv(start, moveInStorageOrder ? 1 : -1);\n      if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {\n        // Case 2: We move within an rtl part or in an rtl editor on the same visual line\n        var sticky = moveInStorageOrder ? \"before\" : \"after\";\n        return new Pos(start.line, ch, sticky)\n      }\n    }\n\n    // Case 3: Could not move within this bidi part in this visual line, so leave\n    // the current bidi part\n\n    var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {\n      var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder\n        ? new Pos(start.line, mv(ch, 1), \"before\")\n        : new Pos(start.line, ch, \"after\"); };\n\n      for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {\n        var part = bidi[partPos];\n        var moveInStorageOrder = (dir > 0) == (part.level != 1);\n        var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);\n        if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }\n        ch = moveInStorageOrder ? part.from : mv(part.to, -1);\n        if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }\n      }\n    };\n\n    // Case 3a: Look for other bidi parts on the same visual line\n    var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);\n    if (res) { return res }\n\n    // Case 3b: Look for other bidi parts on the next visual line\n    var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);\n    if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {\n      res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));\n      if (res) { return res }\n    }\n\n    // Case 4: Nowhere to move\n    return null\n  }\n\n  // Commands are parameter-less actions that can be performed on an\n  // editor, mostly used for keybindings.\n  var commands = {\n    selectAll: selectAll,\n    singleSelection: function (cm) { return cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll); },\n    killLine: function (cm) { return deleteNearSelection(cm, function (range) {\n      if (range.empty()) {\n        var len = getLine(cm.doc, range.head.line).text.length;\n        if (range.head.ch == len && range.head.line < cm.lastLine())\n          { return {from: range.head, to: Pos(range.head.line + 1, 0)} }\n        else\n          { return {from: range.head, to: Pos(range.head.line, len)} }\n      } else {\n        return {from: range.from(), to: range.to()}\n      }\n    }); },\n    deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n      from: Pos(range.from().line, 0),\n      to: clipPos(cm.doc, Pos(range.to().line + 1, 0))\n    }); }); },\n    delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n      from: Pos(range.from().line, 0), to: range.from()\n    }); }); },\n    delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {\n      var top = cm.charCoords(range.head, \"div\").top + 5;\n      var leftPos = cm.coordsChar({left: 0, top: top}, \"div\");\n      return {from: leftPos, to: range.from()}\n    }); },\n    delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {\n      var top = cm.charCoords(range.head, \"div\").top + 5;\n      var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n      return {from: range.from(), to: rightPos }\n    }); },\n    undo: function (cm) { return cm.undo(); },\n    redo: function (cm) { return cm.redo(); },\n    undoSelection: function (cm) { return cm.undoSelection(); },\n    redoSelection: function (cm) { return cm.redoSelection(); },\n    goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },\n    goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },\n    goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },\n      {origin: \"+move\", bias: 1}\n    ); },\n    goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },\n      {origin: \"+move\", bias: 1}\n    ); },\n    goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },\n      {origin: \"+move\", bias: -1}\n    ); },\n    goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n    }, sel_move); },\n    goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      return cm.coordsChar({left: 0, top: top}, \"div\")\n    }, sel_move); },\n    goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      var pos = cm.coordsChar({left: 0, top: top}, \"div\");\n      if (pos.ch < cm.getLine(pos.line).search(/\\S/)) { return lineStartSmart(cm, range.head) }\n      return pos\n    }, sel_move); },\n    goLineUp: function (cm) { return cm.moveV(-1, \"line\"); },\n    goLineDown: function (cm) { return cm.moveV(1, \"line\"); },\n    goPageUp: function (cm) { return cm.moveV(-1, \"page\"); },\n    goPageDown: function (cm) { return cm.moveV(1, \"page\"); },\n    goCharLeft: function (cm) { return cm.moveH(-1, \"char\"); },\n    goCharRight: function (cm) { return cm.moveH(1, \"char\"); },\n    goColumnLeft: function (cm) { return cm.moveH(-1, \"column\"); },\n    goColumnRight: function (cm) { return cm.moveH(1, \"column\"); },\n    goWordLeft: function (cm) { return cm.moveH(-1, \"word\"); },\n    goGroupRight: function (cm) { return cm.moveH(1, \"group\"); },\n    goGroupLeft: function (cm) { return cm.moveH(-1, \"group\"); },\n    goWordRight: function (cm) { return cm.moveH(1, \"word\"); },\n    delCharBefore: function (cm) { return cm.deleteH(-1, \"codepoint\"); },\n    delCharAfter: function (cm) { return cm.deleteH(1, \"char\"); },\n    delWordBefore: function (cm) { return cm.deleteH(-1, \"word\"); },\n    delWordAfter: function (cm) { return cm.deleteH(1, \"word\"); },\n    delGroupBefore: function (cm) { return cm.deleteH(-1, \"group\"); },\n    delGroupAfter: function (cm) { return cm.deleteH(1, \"group\"); },\n    indentAuto: function (cm) { return cm.indentSelection(\"smart\"); },\n    indentMore: function (cm) { return cm.indentSelection(\"add\"); },\n    indentLess: function (cm) { return cm.indentSelection(\"subtract\"); },\n    insertTab: function (cm) { return cm.replaceSelection(\"\\t\"); },\n    insertSoftTab: function (cm) {\n      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n      for (var i = 0; i < ranges.length; i++) {\n        var pos = ranges[i].from();\n        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n        spaces.push(spaceStr(tabSize - col % tabSize));\n      }\n      cm.replaceSelections(spaces);\n    },\n    defaultTab: function (cm) {\n      if (cm.somethingSelected()) { cm.indentSelection(\"add\"); }\n      else { cm.execCommand(\"insertTab\"); }\n    },\n    // Swap the two chars left and right of each selection's head.\n    // Move cursor behind the two swapped characters afterwards.\n    //\n    // Doesn't consider line feeds a character.\n    // Doesn't scan more than one line above to find a character.\n    // Doesn't do anything on an empty line.\n    // Doesn't do anything with non-empty selections.\n    transposeChars: function (cm) { return runInOp(cm, function () {\n      var ranges = cm.listSelections(), newSel = [];\n      for (var i = 0; i < ranges.length; i++) {\n        if (!ranges[i].empty()) { continue }\n        var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n        if (line) {\n          if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }\n          if (cur.ch > 0) {\n            cur = new Pos(cur.line, cur.ch + 1);\n            cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n                            Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n          } else if (cur.line > cm.doc.first) {\n            var prev = getLine(cm.doc, cur.line - 1).text;\n            if (prev) {\n              cur = new Pos(cur.line, 1);\n              cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n                              prev.charAt(prev.length - 1),\n                              Pos(cur.line - 1, prev.length - 1), cur, \"+transpose\");\n            }\n          }\n        }\n        newSel.push(new Range(cur, cur));\n      }\n      cm.setSelections(newSel);\n    }); },\n    newlineAndIndent: function (cm) { return runInOp(cm, function () {\n      var sels = cm.listSelections();\n      for (var i = sels.length - 1; i >= 0; i--)\n        { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, \"+input\"); }\n      sels = cm.listSelections();\n      for (var i$1 = 0; i$1 < sels.length; i$1++)\n        { cm.indentLine(sels[i$1].from().line, null, true); }\n      ensureCursorVisible(cm);\n    }); },\n    openLine: function (cm) { return cm.replaceSelection(\"\\n\", \"start\"); },\n    toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }\n  };\n\n\n  function lineStart(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLine(line);\n    if (visual != line) { lineN = lineNo(visual); }\n    return endOfLine(true, cm, visual, lineN, 1)\n  }\n  function lineEnd(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLineEnd(line);\n    if (visual != line) { lineN = lineNo(visual); }\n    return endOfLine(true, cm, line, lineN, -1)\n  }\n  function lineStartSmart(cm, pos) {\n    var start = lineStart(cm, pos.line);\n    var line = getLine(cm.doc, start.line);\n    var order = getOrder(line, cm.doc.direction);\n    if (!order || order[0].level == 0) {\n      var firstNonWS = Math.max(start.ch, line.text.search(/\\S/));\n      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;\n      return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)\n    }\n    return start\n  }\n\n  // Run a handler that was bound to a key.\n  function doHandleBinding(cm, bound, dropShift) {\n    if (typeof bound == \"string\") {\n      bound = commands[bound];\n      if (!bound) { return false }\n    }\n    // Ensure previous input has been read, so that the handler sees a\n    // consistent view of the document\n    cm.display.input.ensurePolled();\n    var prevShift = cm.display.shift, done = false;\n    try {\n      if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n      if (dropShift) { cm.display.shift = false; }\n      done = bound(cm) != Pass;\n    } finally {\n      cm.display.shift = prevShift;\n      cm.state.suppressEdits = false;\n    }\n    return done\n  }\n\n  function lookupKeyForEditor(cm, name, handle) {\n    for (var i = 0; i < cm.state.keyMaps.length; i++) {\n      var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);\n      if (result) { return result }\n    }\n    return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))\n      || lookupKey(name, cm.options.keyMap, handle, cm)\n  }\n\n  // Note that, despite the name, this function is also used to check\n  // for bound mouse clicks.\n\n  var stopSeq = new Delayed;\n\n  function dispatchKey(cm, name, e, handle) {\n    var seq = cm.state.keySeq;\n    if (seq) {\n      if (isModifierKey(name)) { return \"handled\" }\n      if (/\\'$/.test(name))\n        { cm.state.keySeq = null; }\n      else\n        { stopSeq.set(50, function () {\n          if (cm.state.keySeq == seq) {\n            cm.state.keySeq = null;\n            cm.display.input.reset();\n          }\n        }); }\n      if (dispatchKeyInner(cm, seq + \" \" + name, e, handle)) { return true }\n    }\n    return dispatchKeyInner(cm, name, e, handle)\n  }\n\n  function dispatchKeyInner(cm, name, e, handle) {\n    var result = lookupKeyForEditor(cm, name, handle);\n\n    if (result == \"multi\")\n      { cm.state.keySeq = name; }\n    if (result == \"handled\")\n      { signalLater(cm, \"keyHandled\", cm, name, e); }\n\n    if (result == \"handled\" || result == \"multi\") {\n      e_preventDefault(e);\n      restartBlink(cm);\n    }\n\n    return !!result\n  }\n\n  // Handle a key from the keydown event.\n  function handleKeyBinding(cm, e) {\n    var name = keyName(e, true);\n    if (!name) { return false }\n\n    if (e.shiftKey && !cm.state.keySeq) {\n      // First try to resolve full name (including 'Shift-'). Failing\n      // that, see if there is a cursor-motion command (starting with\n      // 'go') bound to the keyname without 'Shift-'.\n      return dispatchKey(cm, \"Shift-\" + name, e, function (b) { return doHandleBinding(cm, b, true); })\n          || dispatchKey(cm, name, e, function (b) {\n               if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n                 { return doHandleBinding(cm, b) }\n             })\n    } else {\n      return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })\n    }\n  }\n\n  // Handle a key from the keypress event\n  function handleCharBinding(cm, e, ch) {\n    return dispatchKey(cm, \"'\" + ch + \"'\", e, function (b) { return doHandleBinding(cm, b, true); })\n  }\n\n  var lastStoppedKey = null;\n  function onKeyDown(e) {\n    var cm = this;\n    if (e.target && e.target != cm.display.input.getField()) { return }\n    cm.curOp.focus = activeElt();\n    if (signalDOMEvent(cm, e)) { return }\n    // IE does strange things with escape.\n    if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }\n    var code = e.keyCode;\n    cm.display.shift = code == 16 || e.shiftKey;\n    var handled = handleKeyBinding(cm, e);\n    if (presto) {\n      lastStoppedKey = handled ? code : null;\n      // Opera has no cut event... we try to at least catch the key combo\n      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n        { cm.replaceSelection(\"\", null, \"cut\"); }\n    }\n    if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)\n      { document.execCommand(\"cut\"); }\n\n    // Turn mouse into crosshair when Alt is held on Mac.\n    if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n      { showCrossHair(cm); }\n  }\n\n  function showCrossHair(cm) {\n    var lineDiv = cm.display.lineDiv;\n    addClass(lineDiv, \"CodeMirror-crosshair\");\n\n    function up(e) {\n      if (e.keyCode == 18 || !e.altKey) {\n        rmClass(lineDiv, \"CodeMirror-crosshair\");\n        off(document, \"keyup\", up);\n        off(document, \"mouseover\", up);\n      }\n    }\n    on(document, \"keyup\", up);\n    on(document, \"mouseover\", up);\n  }\n\n  function onKeyUp(e) {\n    if (e.keyCode == 16) { this.doc.sel.shift = false; }\n    signalDOMEvent(this, e);\n  }\n\n  function onKeyPress(e) {\n    var cm = this;\n    if (e.target && e.target != cm.display.input.getField()) { return }\n    if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }\n    var keyCode = e.keyCode, charCode = e.charCode;\n    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}\n    if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }\n    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n    // Some browsers fire keypress events for backspace\n    if (ch == \"\\x08\") { return }\n    if (handleCharBinding(cm, e, ch)) { return }\n    cm.display.input.onKeyPress(e);\n  }\n\n  var DOUBLECLICK_DELAY = 400;\n\n  var PastClick = function(time, pos, button) {\n    this.time = time;\n    this.pos = pos;\n    this.button = button;\n  };\n\n  PastClick.prototype.compare = function (time, pos, button) {\n    return this.time + DOUBLECLICK_DELAY > time &&\n      cmp(pos, this.pos) == 0 && button == this.button\n  };\n\n  var lastClick, lastDoubleClick;\n  function clickRepeat(pos, button) {\n    var now = +new Date;\n    if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {\n      lastClick = lastDoubleClick = null;\n      return \"triple\"\n    } else if (lastClick && lastClick.compare(now, pos, button)) {\n      lastDoubleClick = new PastClick(now, pos, button);\n      lastClick = null;\n      return \"double\"\n    } else {\n      lastClick = new PastClick(now, pos, button);\n      lastDoubleClick = null;\n      return \"single\"\n    }\n  }\n\n  // A mouse down can be a single click, double click, triple click,\n  // start of selection drag, start of text drag, new cursor\n  // (ctrl-click), rectangle drag (alt-drag), or xwin\n  // middle-click-paste. Or it might be a click on something we should\n  // not interfere with, such as a scrollbar or widget.\n  function onMouseDown(e) {\n    var cm = this, display = cm.display;\n    if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }\n    display.input.ensurePolled();\n    display.shift = e.shiftKey;\n\n    if (eventInWidget(display, e)) {\n      if (!webkit) {\n        // Briefly turn off draggability, to allow widgets to do\n        // normal dragging things.\n        display.scroller.draggable = false;\n        setTimeout(function () { return display.scroller.draggable = true; }, 100);\n      }\n      return\n    }\n    if (clickInGutter(cm, e)) { return }\n    var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : \"single\";\n    window.focus();\n\n    // #3261: make sure, that we're not starting a second selection\n    if (button == 1 && cm.state.selectingText)\n      { cm.state.selectingText(e); }\n\n    if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }\n\n    if (button == 1) {\n      if (pos) { leftButtonDown(cm, pos, repeat, e); }\n      else if (e_target(e) == display.scroller) { e_preventDefault(e); }\n    } else if (button == 2) {\n      if (pos) { extendSelection(cm.doc, pos); }\n      setTimeout(function () { return display.input.focus(); }, 20);\n    } else if (button == 3) {\n      if (captureRightClick) { cm.display.input.onContextMenu(e); }\n      else { delayBlurEvent(cm); }\n    }\n  }\n\n  function handleMappedButton(cm, button, pos, repeat, event) {\n    var name = \"Click\";\n    if (repeat == \"double\") { name = \"Double\" + name; }\n    else if (repeat == \"triple\") { name = \"Triple\" + name; }\n    name = (button == 1 ? \"Left\" : button == 2 ? \"Middle\" : \"Right\") + name;\n\n    return dispatchKey(cm,  addModifierNames(name, event), event, function (bound) {\n      if (typeof bound == \"string\") { bound = commands[bound]; }\n      if (!bound) { return false }\n      var done = false;\n      try {\n        if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n        done = bound(cm, pos) != Pass;\n      } finally {\n        cm.state.suppressEdits = false;\n      }\n      return done\n    })\n  }\n\n  function configureMouse(cm, repeat, event) {\n    var option = cm.getOption(\"configureMouse\");\n    var value = option ? option(cm, repeat, event) : {};\n    if (value.unit == null) {\n      var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;\n      value.unit = rect ? \"rectangle\" : repeat == \"single\" ? \"char\" : repeat == \"double\" ? \"word\" : \"line\";\n    }\n    if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }\n    if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }\n    if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }\n    return value\n  }\n\n  function leftButtonDown(cm, pos, repeat, event) {\n    if (ie) { setTimeout(bind(ensureFocus, cm), 0); }\n    else { cm.curOp.focus = activeElt(); }\n\n    var behavior = configureMouse(cm, repeat, event);\n\n    var sel = cm.doc.sel, contained;\n    if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n        repeat == \"single\" && (contained = sel.contains(pos)) > -1 &&\n        (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&\n        (cmp(contained.to(), pos) > 0 || pos.xRel < 0))\n      { leftButtonStartDrag(cm, event, pos, behavior); }\n    else\n      { leftButtonSelect(cm, event, pos, behavior); }\n  }\n\n  // Start a text drag. When it ends, see if any dragging actually\n  // happen, and treat as a click if it didn't.\n  function leftButtonStartDrag(cm, event, pos, behavior) {\n    var display = cm.display, moved = false;\n    var dragEnd = operation(cm, function (e) {\n      if (webkit) { display.scroller.draggable = false; }\n      cm.state.draggingText = false;\n      if (cm.state.delayingBlurEvent) {\n        if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; }\n        else { delayBlurEvent(cm); }\n      }\n      off(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n      off(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n      off(display.scroller, \"dragstart\", dragStart);\n      off(display.scroller, \"drop\", dragEnd);\n      if (!moved) {\n        e_preventDefault(e);\n        if (!behavior.addNew)\n          { extendSelection(cm.doc, pos, null, null, behavior.extend); }\n        // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n        if ((webkit && !safari) || ie && ie_version == 9)\n          { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); }\n        else\n          { display.input.focus(); }\n      }\n    });\n    var mouseMove = function(e2) {\n      moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;\n    };\n    var dragStart = function () { return moved = true; };\n    // Let the drag handler handle this.\n    if (webkit) { display.scroller.draggable = true; }\n    cm.state.draggingText = dragEnd;\n    dragEnd.copy = !behavior.moveOnDrag;\n    on(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n    on(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n    on(display.scroller, \"dragstart\", dragStart);\n    on(display.scroller, \"drop\", dragEnd);\n\n    cm.state.delayingBlurEvent = true;\n    setTimeout(function () { return display.input.focus(); }, 20);\n    // IE's approach to draggable\n    if (display.scroller.dragDrop) { display.scroller.dragDrop(); }\n  }\n\n  function rangeForUnit(cm, pos, unit) {\n    if (unit == \"char\") { return new Range(pos, pos) }\n    if (unit == \"word\") { return cm.findWordAt(pos) }\n    if (unit == \"line\") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }\n    var result = unit(cm, pos);\n    return new Range(result.from, result.to)\n  }\n\n  // Normal selection, as opposed to text dragging.\n  function leftButtonSelect(cm, event, start, behavior) {\n    if (ie) { delayBlurEvent(cm); }\n    var display = cm.display, doc = cm.doc;\n    e_preventDefault(event);\n\n    var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;\n    if (behavior.addNew && !behavior.extend) {\n      ourIndex = doc.sel.contains(start);\n      if (ourIndex > -1)\n        { ourRange = ranges[ourIndex]; }\n      else\n        { ourRange = new Range(start, start); }\n    } else {\n      ourRange = doc.sel.primary();\n      ourIndex = doc.sel.primIndex;\n    }\n\n    if (behavior.unit == \"rectangle\") {\n      if (!behavior.addNew) { ourRange = new Range(start, start); }\n      start = posFromMouse(cm, event, true, true);\n      ourIndex = -1;\n    } else {\n      var range = rangeForUnit(cm, start, behavior.unit);\n      if (behavior.extend)\n        { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); }\n      else\n        { ourRange = range; }\n    }\n\n    if (!behavior.addNew) {\n      ourIndex = 0;\n      setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n      startSel = doc.sel;\n    } else if (ourIndex == -1) {\n      ourIndex = ranges.length;\n      setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),\n                   {scroll: false, origin: \"*mouse\"});\n    } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == \"char\" && !behavior.extend) {\n      setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n                   {scroll: false, origin: \"*mouse\"});\n      startSel = doc.sel;\n    } else {\n      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n    }\n\n    var lastPos = start;\n    function extendTo(pos) {\n      if (cmp(lastPos, pos) == 0) { return }\n      lastPos = pos;\n\n      if (behavior.unit == \"rectangle\") {\n        var ranges = [], tabSize = cm.options.tabSize;\n        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n             line <= end; line++) {\n          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n          if (left == right)\n            { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }\n          else if (text.length > leftPos)\n            { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }\n        }\n        if (!ranges.length) { ranges.push(new Range(start, start)); }\n        setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n                     {origin: \"*mouse\", scroll: false});\n        cm.scrollIntoView(pos);\n      } else {\n        var oldRange = ourRange;\n        var range = rangeForUnit(cm, pos, behavior.unit);\n        var anchor = oldRange.anchor, head;\n        if (cmp(range.anchor, anchor) > 0) {\n          head = range.head;\n          anchor = minPos(oldRange.from(), range.anchor);\n        } else {\n          head = range.anchor;\n          anchor = maxPos(oldRange.to(), range.head);\n        }\n        var ranges$1 = startSel.ranges.slice(0);\n        ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));\n        setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse);\n      }\n    }\n\n    var editorSize = display.wrapper.getBoundingClientRect();\n    // Used to ensure timeout re-tries don't fire when another extend\n    // happened in the meantime (clearTimeout isn't reliable -- at\n    // least on Chrome, the timeouts still happen even when cleared,\n    // if the clear happens after their scheduled firing time).\n    var counter = 0;\n\n    function extend(e) {\n      var curCount = ++counter;\n      var cur = posFromMouse(cm, e, true, behavior.unit == \"rectangle\");\n      if (!cur) { return }\n      if (cmp(cur, lastPos) != 0) {\n        cm.curOp.focus = activeElt();\n        extendTo(cur);\n        var visible = visibleLines(display, doc);\n        if (cur.line >= visible.to || cur.line < visible.from)\n          { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }\n      } else {\n        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n        if (outside) { setTimeout(operation(cm, function () {\n          if (counter != curCount) { return }\n          display.scroller.scrollTop += outside;\n          extend(e);\n        }), 50); }\n      }\n    }\n\n    function done(e) {\n      cm.state.selectingText = false;\n      counter = Infinity;\n      // If e is null or undefined we interpret this as someone trying\n      // to explicitly cancel the selection rather than the user\n      // letting go of the mouse button.\n      if (e) {\n        e_preventDefault(e);\n        display.input.focus();\n      }\n      off(display.wrapper.ownerDocument, \"mousemove\", move);\n      off(display.wrapper.ownerDocument, \"mouseup\", up);\n      doc.history.lastSelOrigin = null;\n    }\n\n    var move = operation(cm, function (e) {\n      if (e.buttons === 0 || !e_button(e)) { done(e); }\n      else { extend(e); }\n    });\n    var up = operation(cm, done);\n    cm.state.selectingText = up;\n    on(display.wrapper.ownerDocument, \"mousemove\", move);\n    on(display.wrapper.ownerDocument, \"mouseup\", up);\n  }\n\n  // Used when mouse-selecting to adjust the anchor to the proper side\n  // of a bidi jump depending on the visual position of the head.\n  function bidiSimplify(cm, range) {\n    var anchor = range.anchor;\n    var head = range.head;\n    var anchorLine = getLine(cm.doc, anchor.line);\n    if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range }\n    var order = getOrder(anchorLine);\n    if (!order) { return range }\n    var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];\n    if (part.from != anchor.ch && part.to != anchor.ch) { return range }\n    var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);\n    if (boundary == 0 || boundary == order.length) { return range }\n\n    // Compute the relative visual position of the head compared to the\n    // anchor (<0 is to the left, >0 to the right)\n    var leftSide;\n    if (head.line != anchor.line) {\n      leftSide = (head.line - anchor.line) * (cm.doc.direction == \"ltr\" ? 1 : -1) > 0;\n    } else {\n      var headIndex = getBidiPartAt(order, head.ch, head.sticky);\n      var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);\n      if (headIndex == boundary - 1 || headIndex == boundary)\n        { leftSide = dir < 0; }\n      else\n        { leftSide = dir > 0; }\n    }\n\n    var usePart = order[boundary + (leftSide ? -1 : 0)];\n    var from = leftSide == (usePart.level == 1);\n    var ch = from ? usePart.from : usePart.to, sticky = from ? \"after\" : \"before\";\n    return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)\n  }\n\n\n  // Determines whether an event happened in the gutter, and fires the\n  // handlers for the corresponding event.\n  function gutterEvent(cm, e, type, prevent) {\n    var mX, mY;\n    if (e.touches) {\n      mX = e.touches[0].clientX;\n      mY = e.touches[0].clientY;\n    } else {\n      try { mX = e.clientX; mY = e.clientY; }\n      catch(e$1) { return false }\n    }\n    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }\n    if (prevent) { e_preventDefault(e); }\n\n    var display = cm.display;\n    var lineBox = display.lineDiv.getBoundingClientRect();\n\n    if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }\n    mY -= lineBox.top - display.viewOffset;\n\n    for (var i = 0; i < cm.display.gutterSpecs.length; ++i) {\n      var g = display.gutters.childNodes[i];\n      if (g && g.getBoundingClientRect().right >= mX) {\n        var line = lineAtHeight(cm.doc, mY);\n        var gutter = cm.display.gutterSpecs[i];\n        signal(cm, type, cm, line, gutter.className, e);\n        return e_defaultPrevented(e)\n      }\n    }\n  }\n\n  function clickInGutter(cm, e) {\n    return gutterEvent(cm, e, \"gutterClick\", true)\n  }\n\n  // CONTEXT MENU HANDLING\n\n  // To make the context menu work, we need to briefly unhide the\n  // textarea (making it as unobtrusive as possible) to let the\n  // right-click take effect on it.\n  function onContextMenu(cm, e) {\n    if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }\n    if (signalDOMEvent(cm, e, \"contextmenu\")) { return }\n    if (!captureRightClick) { cm.display.input.onContextMenu(e); }\n  }\n\n  function contextMenuInGutter(cm, e) {\n    if (!hasHandler(cm, \"gutterContextMenu\")) { return false }\n    return gutterEvent(cm, e, \"gutterContextMenu\", false)\n  }\n\n  function themeChanged(cm) {\n    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n      cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n    clearCaches(cm);\n  }\n\n  var Init = {toString: function(){return \"CodeMirror.Init\"}};\n\n  var defaults = {};\n  var optionHandlers = {};\n\n  function defineOptions(CodeMirror) {\n    var optionHandlers = CodeMirror.optionHandlers;\n\n    function option(name, deflt, handle, notOnInit) {\n      CodeMirror.defaults[name] = deflt;\n      if (handle) { optionHandlers[name] =\n        notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }\n    }\n\n    CodeMirror.defineOption = option;\n\n    // Passed to option handlers when there is no old value.\n    CodeMirror.Init = Init;\n\n    // These two are, on init, called from the constructor because they\n    // have to be initialized before the editor can start at all.\n    option(\"value\", \"\", function (cm, val) { return cm.setValue(val); }, true);\n    option(\"mode\", null, function (cm, val) {\n      cm.doc.modeOption = val;\n      loadMode(cm);\n    }, true);\n\n    option(\"indentUnit\", 2, loadMode, true);\n    option(\"indentWithTabs\", false);\n    option(\"smartIndent\", true);\n    option(\"tabSize\", 4, function (cm) {\n      resetModeState(cm);\n      clearCaches(cm);\n      regChange(cm);\n    }, true);\n\n    option(\"lineSeparator\", null, function (cm, val) {\n      cm.doc.lineSep = val;\n      if (!val) { return }\n      var newBreaks = [], lineNo = cm.doc.first;\n      cm.doc.iter(function (line) {\n        for (var pos = 0;;) {\n          var found = line.text.indexOf(val, pos);\n          if (found == -1) { break }\n          pos = found + val.length;\n          newBreaks.push(Pos(lineNo, found));\n        }\n        lineNo++;\n      });\n      for (var i = newBreaks.length - 1; i >= 0; i--)\n        { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }\n    });\n    option(\"specialChars\", /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b\\u200e\\u200f\\u2028\\u2029\\ufeff\\ufff9-\\ufffc]/g, function (cm, val, old) {\n      cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n      if (old != Init) { cm.refresh(); }\n    });\n    option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);\n    option(\"electricChars\", true);\n    option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", function () {\n      throw new Error(\"inputStyle can not (yet) be changed in a running editor\") // FIXME\n    }, true);\n    option(\"spellcheck\", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);\n    option(\"autocorrect\", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true);\n    option(\"autocapitalize\", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true);\n    option(\"rtlMoveVisually\", !windows);\n    option(\"wholeLineUpdateBefore\", true);\n\n    option(\"theme\", \"default\", function (cm) {\n      themeChanged(cm);\n      updateGutters(cm);\n    }, true);\n    option(\"keyMap\", \"default\", function (cm, val, old) {\n      var next = getKeyMap(val);\n      var prev = old != Init && getKeyMap(old);\n      if (prev && prev.detach) { prev.detach(cm, next); }\n      if (next.attach) { next.attach(cm, prev || null); }\n    });\n    option(\"extraKeys\", null);\n    option(\"configureMouse\", null);\n\n    option(\"lineWrapping\", false, wrappingChanged, true);\n    option(\"gutters\", [], function (cm, val) {\n      cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers);\n      updateGutters(cm);\n    }, true);\n    option(\"fixedGutter\", true, function (cm, val) {\n      cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n      cm.refresh();\n    }, true);\n    option(\"coverGutterNextToScrollbar\", false, function (cm) { return updateScrollbars(cm); }, true);\n    option(\"scrollbarStyle\", \"native\", function (cm) {\n      initScrollbars(cm);\n      updateScrollbars(cm);\n      cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);\n      cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);\n    }, true);\n    option(\"lineNumbers\", false, function (cm, val) {\n      cm.display.gutterSpecs = getGutters(cm.options.gutters, val);\n      updateGutters(cm);\n    }, true);\n    option(\"firstLineNumber\", 1, updateGutters, true);\n    option(\"lineNumberFormatter\", function (integer) { return integer; }, updateGutters, true);\n    option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n    option(\"resetSelectionOnContextMenu\", true);\n    option(\"lineWiseCopyCut\", true);\n    option(\"pasteLinesPerSelection\", true);\n    option(\"selectionsMayTouch\", false);\n\n    option(\"readOnly\", false, function (cm, val) {\n      if (val == \"nocursor\") {\n        onBlur(cm);\n        cm.display.input.blur();\n      }\n      cm.display.input.readOnlyChanged(val);\n    });\n\n    option(\"screenReaderLabel\", null, function (cm, val) {\n      val = (val === '') ? null : val;\n      cm.display.input.screenReaderLabelChanged(val);\n    });\n\n    option(\"disableInput\", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);\n    option(\"dragDrop\", true, dragDropChanged);\n    option(\"allowDropFileTypes\", null);\n\n    option(\"cursorBlinkRate\", 530);\n    option(\"cursorScrollMargin\", 0);\n    option(\"cursorHeight\", 1, updateSelection, true);\n    option(\"singleCursorHeightPerLine\", true, updateSelection, true);\n    option(\"workTime\", 100);\n    option(\"workDelay\", 100);\n    option(\"flattenSpans\", true, resetModeState, true);\n    option(\"addModeClass\", false, resetModeState, true);\n    option(\"pollInterval\", 100);\n    option(\"undoDepth\", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });\n    option(\"historyEventDelay\", 1250);\n    option(\"viewportMargin\", 10, function (cm) { return cm.refresh(); }, true);\n    option(\"maxHighlightLength\", 10000, resetModeState, true);\n    option(\"moveInputWithCursor\", true, function (cm, val) {\n      if (!val) { cm.display.input.resetPosition(); }\n    });\n\n    option(\"tabindex\", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || \"\"; });\n    option(\"autofocus\", null);\n    option(\"direction\", \"ltr\", function (cm, val) { return cm.doc.setDirection(val); }, true);\n    option(\"phrases\", null);\n  }\n\n  function dragDropChanged(cm, value, old) {\n    var wasOn = old && old != Init;\n    if (!value != !wasOn) {\n      var funcs = cm.display.dragFunctions;\n      var toggle = value ? on : off;\n      toggle(cm.display.scroller, \"dragstart\", funcs.start);\n      toggle(cm.display.scroller, \"dragenter\", funcs.enter);\n      toggle(cm.display.scroller, \"dragover\", funcs.over);\n      toggle(cm.display.scroller, \"dragleave\", funcs.leave);\n      toggle(cm.display.scroller, \"drop\", funcs.drop);\n    }\n  }\n\n  function wrappingChanged(cm) {\n    if (cm.options.lineWrapping) {\n      addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      cm.display.sizer.style.minWidth = \"\";\n      cm.display.sizerWidth = null;\n    } else {\n      rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      findMaxLine(cm);\n    }\n    estimateLineHeights(cm);\n    regChange(cm);\n    clearCaches(cm);\n    setTimeout(function () { return updateScrollbars(cm); }, 100);\n  }\n\n  // A CodeMirror instance represents an editor. This is the object\n  // that user code is usually dealing with.\n\n  function CodeMirror(place, options) {\n    var this$1 = this;\n\n    if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) }\n\n    this.options = options = options ? copyObj(options) : {};\n    // Determine effective options based on given values and defaults.\n    copyObj(defaults, options, false);\n\n    var doc = options.value;\n    if (typeof doc == \"string\") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }\n    else if (options.mode) { doc.modeOption = options.mode; }\n    this.doc = doc;\n\n    var input = new CodeMirror.inputStyles[options.inputStyle](this);\n    var display = this.display = new Display(place, doc, input, options);\n    display.wrapper.CodeMirror = this;\n    themeChanged(this);\n    if (options.lineWrapping)\n      { this.display.wrapper.className += \" CodeMirror-wrap\"; }\n    initScrollbars(this);\n\n    this.state = {\n      keyMaps: [],  // stores maps added by addKeyMap\n      overlays: [], // highlighting overlays, as added by addOverlay\n      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info\n      overwrite: false,\n      delayingBlurEvent: false,\n      focused: false,\n      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n      pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll\n      selectingText: false,\n      draggingText: false,\n      highlight: new Delayed(), // stores highlight worker timeout\n      keySeq: null,  // Unfinished key sequence\n      specialChars: null\n    };\n\n    if (options.autofocus && !mobile) { display.input.focus(); }\n\n    // Override magic textarea content restore that IE sometimes does\n    // on our hidden textarea on reload\n    if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }\n\n    registerEventHandlers(this);\n    ensureGlobalHandlers();\n\n    startOperation(this);\n    this.curOp.forceUpdate = true;\n    attachDoc(this, doc);\n\n    if ((options.autofocus && !mobile) || this.hasFocus())\n      { setTimeout(function () {\n        if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); }\n      }, 20); }\n    else\n      { onBlur(this); }\n\n    for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))\n      { optionHandlers[opt](this, options[opt], Init); } }\n    maybeUpdateLineNumberWidth(this);\n    if (options.finishInit) { options.finishInit(this); }\n    for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); }\n    endOperation(this);\n    // Suppress optimizelegibility in Webkit, since it breaks text\n    // measuring on line wrapping boundaries.\n    if (webkit && options.lineWrapping &&\n        getComputedStyle(display.lineDiv).textRendering == \"optimizelegibility\")\n      { display.lineDiv.style.textRendering = \"auto\"; }\n  }\n\n  // The default configuration options.\n  CodeMirror.defaults = defaults;\n  // Functions to run when options are changed.\n  CodeMirror.optionHandlers = optionHandlers;\n\n  // Attach the necessary event handlers when initializing the editor\n  function registerEventHandlers(cm) {\n    var d = cm.display;\n    on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n    // Older IE's will not fire a second mousedown for a double click\n    if (ie && ie_version < 11)\n      { on(d.scroller, \"dblclick\", operation(cm, function (e) {\n        if (signalDOMEvent(cm, e)) { return }\n        var pos = posFromMouse(cm, e);\n        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }\n        e_preventDefault(e);\n        var word = cm.findWordAt(pos);\n        extendSelection(cm.doc, word.anchor, word.head);\n      })); }\n    else\n      { on(d.scroller, \"dblclick\", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }\n    // Some browsers fire contextmenu *after* opening the menu, at\n    // which point we can't mess with it anymore. Context menu is\n    // handled in onMouseDown for these browsers.\n    on(d.scroller, \"contextmenu\", function (e) { return onContextMenu(cm, e); });\n    on(d.input.getField(), \"contextmenu\", function (e) {\n      if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); }\n    });\n\n    // Used to suppress mouse event handling when a touch happens\n    var touchFinished, prevTouch = {end: 0};\n    function finishTouch() {\n      if (d.activeTouch) {\n        touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);\n        prevTouch = d.activeTouch;\n        prevTouch.end = +new Date;\n      }\n    }\n    function isMouseLikeTouchEvent(e) {\n      if (e.touches.length != 1) { return false }\n      var touch = e.touches[0];\n      return touch.radiusX <= 1 && touch.radiusY <= 1\n    }\n    function farAway(touch, other) {\n      if (other.left == null) { return true }\n      var dx = other.left - touch.left, dy = other.top - touch.top;\n      return dx * dx + dy * dy > 20 * 20\n    }\n    on(d.scroller, \"touchstart\", function (e) {\n      if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {\n        d.input.ensurePolled();\n        clearTimeout(touchFinished);\n        var now = +new Date;\n        d.activeTouch = {start: now, moved: false,\n                         prev: now - prevTouch.end <= 300 ? prevTouch : null};\n        if (e.touches.length == 1) {\n          d.activeTouch.left = e.touches[0].pageX;\n          d.activeTouch.top = e.touches[0].pageY;\n        }\n      }\n    });\n    on(d.scroller, \"touchmove\", function () {\n      if (d.activeTouch) { d.activeTouch.moved = true; }\n    });\n    on(d.scroller, \"touchend\", function (e) {\n      var touch = d.activeTouch;\n      if (touch && !eventInWidget(d, e) && touch.left != null &&\n          !touch.moved && new Date - touch.start < 300) {\n        var pos = cm.coordsChar(d.activeTouch, \"page\"), range;\n        if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n          { range = new Range(pos, pos); }\n        else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n          { range = cm.findWordAt(pos); }\n        else // Triple tap\n          { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }\n        cm.setSelection(range.anchor, range.head);\n        cm.focus();\n        e_preventDefault(e);\n      }\n      finishTouch();\n    });\n    on(d.scroller, \"touchcancel\", finishTouch);\n\n    // Sync scrolling between fake scrollbars and real scrollable\n    // area, ensure viewport is updated when scrolling.\n    on(d.scroller, \"scroll\", function () {\n      if (d.scroller.clientHeight) {\n        updateScrollTop(cm, d.scroller.scrollTop);\n        setScrollLeft(cm, d.scroller.scrollLeft, true);\n        signal(cm, \"scroll\", cm);\n      }\n    });\n\n    // Listen to wheel events in order to try and update the viewport on time.\n    on(d.scroller, \"mousewheel\", function (e) { return onScrollWheel(cm, e); });\n    on(d.scroller, \"DOMMouseScroll\", function (e) { return onScrollWheel(cm, e); });\n\n    // Prevent wrapper from ever scrolling\n    on(d.wrapper, \"scroll\", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n    d.dragFunctions = {\n      enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},\n      over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},\n      start: function (e) { return onDragStart(cm, e); },\n      drop: operation(cm, onDrop),\n      leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}\n    };\n\n    var inp = d.input.getField();\n    on(inp, \"keyup\", function (e) { return onKeyUp.call(cm, e); });\n    on(inp, \"keydown\", operation(cm, onKeyDown));\n    on(inp, \"keypress\", operation(cm, onKeyPress));\n    on(inp, \"focus\", function (e) { return onFocus(cm, e); });\n    on(inp, \"blur\", function (e) { return onBlur(cm, e); });\n  }\n\n  var initHooks = [];\n  CodeMirror.defineInitHook = function (f) { return initHooks.push(f); };\n\n  // Indent the given line. The how parameter can be \"smart\",\n  // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n  // (typically set to true for forced single-line indents), empty\n  // lines are not indented, and places where the mode returns Pass\n  // are left alone.\n  function indentLine(cm, n, how, aggressive) {\n    var doc = cm.doc, state;\n    if (how == null) { how = \"add\"; }\n    if (how == \"smart\") {\n      // Fall back to \"prev\" when the mode doesn't have an indentation\n      // method.\n      if (!doc.mode.indent) { how = \"prev\"; }\n      else { state = getContextBefore(cm, n).state; }\n    }\n\n    var tabSize = cm.options.tabSize;\n    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n    if (line.stateAfter) { line.stateAfter = null; }\n    var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n    if (!aggressive && !/\\S/.test(line.text)) {\n      indentation = 0;\n      how = \"not\";\n    } else if (how == \"smart\") {\n      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n      if (indentation == Pass || indentation > 150) {\n        if (!aggressive) { return }\n        how = \"prev\";\n      }\n    }\n    if (how == \"prev\") {\n      if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }\n      else { indentation = 0; }\n    } else if (how == \"add\") {\n      indentation = curSpace + cm.options.indentUnit;\n    } else if (how == \"subtract\") {\n      indentation = curSpace - cm.options.indentUnit;\n    } else if (typeof how == \"number\") {\n      indentation = curSpace + how;\n    }\n    indentation = Math.max(0, indentation);\n\n    var indentString = \"\", pos = 0;\n    if (cm.options.indentWithTabs)\n      { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";} }\n    if (pos < indentation) { indentString += spaceStr(indentation - pos); }\n\n    if (indentString != curSpaceString) {\n      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n      line.stateAfter = null;\n      return true\n    } else {\n      // Ensure that, if the cursor was in the whitespace at the start\n      // of the line, it is moved to the end of that space.\n      for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {\n        var range = doc.sel.ranges[i$1];\n        if (range.head.line == n && range.head.ch < curSpaceString.length) {\n          var pos$1 = Pos(n, curSpaceString.length);\n          replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));\n          break\n        }\n      }\n    }\n  }\n\n  // This will be set to a {lineWise: bool, text: [string]} object, so\n  // that, when pasting, we know what kind of selections the copied\n  // text was made out of.\n  var lastCopied = null;\n\n  function setLastCopied(newLastCopied) {\n    lastCopied = newLastCopied;\n  }\n\n  function applyTextInput(cm, inserted, deleted, sel, origin) {\n    var doc = cm.doc;\n    cm.display.shift = false;\n    if (!sel) { sel = doc.sel; }\n\n    var recent = +new Date - 200;\n    var paste = origin == \"paste\" || cm.state.pasteIncoming > recent;\n    var textLines = splitLinesAuto(inserted), multiPaste = null;\n    // When pasting N lines into N selections, insert one line per selection\n    if (paste && sel.ranges.length > 1) {\n      if (lastCopied && lastCopied.text.join(\"\\n\") == inserted) {\n        if (sel.ranges.length % lastCopied.text.length == 0) {\n          multiPaste = [];\n          for (var i = 0; i < lastCopied.text.length; i++)\n            { multiPaste.push(doc.splitLines(lastCopied.text[i])); }\n        }\n      } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {\n        multiPaste = map(textLines, function (l) { return [l]; });\n      }\n    }\n\n    var updateInput = cm.curOp.updateInput;\n    // Normal behavior is to insert the new text into every selection\n    for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {\n      var range = sel.ranges[i$1];\n      var from = range.from(), to = range.to();\n      if (range.empty()) {\n        if (deleted && deleted > 0) // Handle deletion\n          { from = Pos(from.line, from.ch - deleted); }\n        else if (cm.state.overwrite && !paste) // Handle overwrite\n          { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }\n        else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join(\"\\n\") == textLines.join(\"\\n\"))\n          { from = to = Pos(from.line, 0); }\n      }\n      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,\n                         origin: origin || (paste ? \"paste\" : cm.state.cutIncoming > recent ? \"cut\" : \"+input\")};\n      makeChange(cm.doc, changeEvent);\n      signalLater(cm, \"inputRead\", cm, changeEvent);\n    }\n    if (inserted && !paste)\n      { triggerElectric(cm, inserted); }\n\n    ensureCursorVisible(cm);\n    if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; }\n    cm.curOp.typing = true;\n    cm.state.pasteIncoming = cm.state.cutIncoming = -1;\n  }\n\n  function handlePaste(e, cm) {\n    var pasted = e.clipboardData && e.clipboardData.getData(\"Text\");\n    if (pasted) {\n      e.preventDefault();\n      if (!cm.isReadOnly() && !cm.options.disableInput)\n        { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, \"paste\"); }); }\n      return true\n    }\n  }\n\n  function triggerElectric(cm, inserted) {\n    // When an 'electric' character is inserted, immediately trigger a reindent\n    if (!cm.options.electricChars || !cm.options.smartIndent) { return }\n    var sel = cm.doc.sel;\n\n    for (var i = sel.ranges.length - 1; i >= 0; i--) {\n      var range = sel.ranges[i];\n      if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue }\n      var mode = cm.getModeAt(range.head);\n      var indented = false;\n      if (mode.electricChars) {\n        for (var j = 0; j < mode.electricChars.length; j++)\n          { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n            indented = indentLine(cm, range.head.line, \"smart\");\n            break\n          } }\n      } else if (mode.electricInput) {\n        if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))\n          { indented = indentLine(cm, range.head.line, \"smart\"); }\n      }\n      if (indented) { signalLater(cm, \"electricInput\", cm, range.head.line); }\n    }\n  }\n\n  function copyableRanges(cm) {\n    var text = [], ranges = [];\n    for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n      var line = cm.doc.sel.ranges[i].head.line;\n      var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n      ranges.push(lineRange);\n      text.push(cm.getRange(lineRange.anchor, lineRange.head));\n    }\n    return {text: text, ranges: ranges}\n  }\n\n  function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) {\n    field.setAttribute(\"autocorrect\", autocorrect ? \"\" : \"off\");\n    field.setAttribute(\"autocapitalize\", autocapitalize ? \"\" : \"off\");\n    field.setAttribute(\"spellcheck\", !!spellcheck);\n  }\n\n  function hiddenTextarea() {\n    var te = elt(\"textarea\", null, null, \"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none\");\n    var div = elt(\"div\", [te], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n    // The textarea is kept positioned near the cursor to prevent the\n    // fact that it'll be scrolled into view on input from scrolling\n    // our fake cursor out of view. On webkit, when wrap=off, paste is\n    // very slow. So make the area wide instead.\n    if (webkit) { te.style.width = \"1000px\"; }\n    else { te.setAttribute(\"wrap\", \"off\"); }\n    // If border: 0; -- iOS fails to open keyboard (issue #1287)\n    if (ios) { te.style.border = \"1px solid black\"; }\n    disableBrowserMagic(te);\n    return div\n  }\n\n  // The publicly visible API. Note that methodOp(f) means\n  // 'wrap f in an operation, performed on its `this` parameter'.\n\n  // This is not the complete set of editor methods. Most of the\n  // methods defined on the Doc type are also injected into\n  // CodeMirror.prototype, for backwards compatibility and\n  // convenience.\n\n  function addEditorMethods(CodeMirror) {\n    var optionHandlers = CodeMirror.optionHandlers;\n\n    var helpers = CodeMirror.helpers = {};\n\n    CodeMirror.prototype = {\n      constructor: CodeMirror,\n      focus: function(){window.focus(); this.display.input.focus();},\n\n      setOption: function(option, value) {\n        var options = this.options, old = options[option];\n        if (options[option] == value && option != \"mode\") { return }\n        options[option] = value;\n        if (optionHandlers.hasOwnProperty(option))\n          { operation(this, optionHandlers[option])(this, value, old); }\n        signal(this, \"optionChange\", this, option);\n      },\n\n      getOption: function(option) {return this.options[option]},\n      getDoc: function() {return this.doc},\n\n      addKeyMap: function(map, bottom) {\n        this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map));\n      },\n      removeKeyMap: function(map) {\n        var maps = this.state.keyMaps;\n        for (var i = 0; i < maps.length; ++i)\n          { if (maps[i] == map || maps[i].name == map) {\n            maps.splice(i, 1);\n            return true\n          } }\n      },\n\n      addOverlay: methodOp(function(spec, options) {\n        var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n        if (mode.startState) { throw new Error(\"Overlays may not be stateful.\") }\n        insertSorted(this.state.overlays,\n                     {mode: mode, modeSpec: spec, opaque: options && options.opaque,\n                      priority: (options && options.priority) || 0},\n                     function (overlay) { return overlay.priority; });\n        this.state.modeGen++;\n        regChange(this);\n      }),\n      removeOverlay: methodOp(function(spec) {\n        var overlays = this.state.overlays;\n        for (var i = 0; i < overlays.length; ++i) {\n          var cur = overlays[i].modeSpec;\n          if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n            overlays.splice(i, 1);\n            this.state.modeGen++;\n            regChange(this);\n            return\n          }\n        }\n      }),\n\n      indentLine: methodOp(function(n, dir, aggressive) {\n        if (typeof dir != \"string\" && typeof dir != \"number\") {\n          if (dir == null) { dir = this.options.smartIndent ? \"smart\" : \"prev\"; }\n          else { dir = dir ? \"add\" : \"subtract\"; }\n        }\n        if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }\n      }),\n      indentSelection: methodOp(function(how) {\n        var ranges = this.doc.sel.ranges, end = -1;\n        for (var i = 0; i < ranges.length; i++) {\n          var range = ranges[i];\n          if (!range.empty()) {\n            var from = range.from(), to = range.to();\n            var start = Math.max(end, from.line);\n            end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n            for (var j = start; j < end; ++j)\n              { indentLine(this, j, how); }\n            var newRanges = this.doc.sel.ranges;\n            if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n              { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }\n          } else if (range.head.line > end) {\n            indentLine(this, range.head.line, how, true);\n            end = range.head.line;\n            if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); }\n          }\n        }\n      }),\n\n      // Fetch the parser token for a given character. Useful for hacks\n      // that want to inspect the mode state (say, for completion).\n      getTokenAt: function(pos, precise) {\n        return takeToken(this, pos, precise)\n      },\n\n      getLineTokens: function(line, precise) {\n        return takeToken(this, Pos(line), precise, true)\n      },\n\n      getTokenTypeAt: function(pos) {\n        pos = clipPos(this.doc, pos);\n        var styles = getLineStyles(this, getLine(this.doc, pos.line));\n        var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n        var type;\n        if (ch == 0) { type = styles[2]; }\n        else { for (;;) {\n          var mid = (before + after) >> 1;\n          if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }\n          else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }\n          else { type = styles[mid * 2 + 2]; break }\n        } }\n        var cut = type ? type.indexOf(\"overlay \") : -1;\n        return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)\n      },\n\n      getModeAt: function(pos) {\n        var mode = this.doc.mode;\n        if (!mode.innerMode) { return mode }\n        return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode\n      },\n\n      getHelper: function(pos, type) {\n        return this.getHelpers(pos, type)[0]\n      },\n\n      getHelpers: function(pos, type) {\n        var found = [];\n        if (!helpers.hasOwnProperty(type)) { return found }\n        var help = helpers[type], mode = this.getModeAt(pos);\n        if (typeof mode[type] == \"string\") {\n          if (help[mode[type]]) { found.push(help[mode[type]]); }\n        } else if (mode[type]) {\n          for (var i = 0; i < mode[type].length; i++) {\n            var val = help[mode[type][i]];\n            if (val) { found.push(val); }\n          }\n        } else if (mode.helperType && help[mode.helperType]) {\n          found.push(help[mode.helperType]);\n        } else if (help[mode.name]) {\n          found.push(help[mode.name]);\n        }\n        for (var i$1 = 0; i$1 < help._global.length; i$1++) {\n          var cur = help._global[i$1];\n          if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n            { found.push(cur.val); }\n        }\n        return found\n      },\n\n      getStateAfter: function(line, precise) {\n        var doc = this.doc;\n        line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n        return getContextBefore(this, line + 1, precise).state\n      },\n\n      cursorCoords: function(start, mode) {\n        var pos, range = this.doc.sel.primary();\n        if (start == null) { pos = range.head; }\n        else if (typeof start == \"object\") { pos = clipPos(this.doc, start); }\n        else { pos = start ? range.from() : range.to(); }\n        return cursorCoords(this, pos, mode || \"page\")\n      },\n\n      charCoords: function(pos, mode) {\n        return charCoords(this, clipPos(this.doc, pos), mode || \"page\")\n      },\n\n      coordsChar: function(coords, mode) {\n        coords = fromCoordSystem(this, coords, mode || \"page\");\n        return coordsChar(this, coords.left, coords.top)\n      },\n\n      lineAtHeight: function(height, mode) {\n        height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n        return lineAtHeight(this.doc, height + this.display.viewOffset)\n      },\n      heightAtLine: function(line, mode, includeWidgets) {\n        var end = false, lineObj;\n        if (typeof line == \"number\") {\n          var last = this.doc.first + this.doc.size - 1;\n          if (line < this.doc.first) { line = this.doc.first; }\n          else if (line > last) { line = last; end = true; }\n          lineObj = getLine(this.doc, line);\n        } else {\n          lineObj = line;\n        }\n        return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\", includeWidgets || end).top +\n          (end ? this.doc.height - heightAtLine(lineObj) : 0)\n      },\n\n      defaultTextHeight: function() { return textHeight(this.display) },\n      defaultCharWidth: function() { return charWidth(this.display) },\n\n      getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},\n\n      addWidget: function(pos, node, scroll, vert, horiz) {\n        var display = this.display;\n        pos = cursorCoords(this, clipPos(this.doc, pos));\n        var top = pos.bottom, left = pos.left;\n        node.style.position = \"absolute\";\n        node.setAttribute(\"cm-ignore-events\", \"true\");\n        this.display.input.setUneditable(node);\n        display.sizer.appendChild(node);\n        if (vert == \"over\") {\n          top = pos.top;\n        } else if (vert == \"above\" || vert == \"near\") {\n          var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n          hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n          // Default to positioning above (if specified and possible); otherwise default to positioning below\n          if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n            { top = pos.top - node.offsetHeight; }\n          else if (pos.bottom + node.offsetHeight <= vspace)\n            { top = pos.bottom; }\n          if (left + node.offsetWidth > hspace)\n            { left = hspace - node.offsetWidth; }\n        }\n        node.style.top = top + \"px\";\n        node.style.left = node.style.right = \"\";\n        if (horiz == \"right\") {\n          left = display.sizer.clientWidth - node.offsetWidth;\n          node.style.right = \"0px\";\n        } else {\n          if (horiz == \"left\") { left = 0; }\n          else if (horiz == \"middle\") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }\n          node.style.left = left + \"px\";\n        }\n        if (scroll)\n          { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }\n      },\n\n      triggerOnKeyDown: methodOp(onKeyDown),\n      triggerOnKeyPress: methodOp(onKeyPress),\n      triggerOnKeyUp: onKeyUp,\n      triggerOnMouseDown: methodOp(onMouseDown),\n\n      execCommand: function(cmd) {\n        if (commands.hasOwnProperty(cmd))\n          { return commands[cmd].call(null, this) }\n      },\n\n      triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),\n\n      findPosH: function(from, amount, unit, visually) {\n        var dir = 1;\n        if (amount < 0) { dir = -1; amount = -amount; }\n        var cur = clipPos(this.doc, from);\n        for (var i = 0; i < amount; ++i) {\n          cur = findPosH(this.doc, cur, dir, unit, visually);\n          if (cur.hitSide) { break }\n        }\n        return cur\n      },\n\n      moveH: methodOp(function(dir, unit) {\n        var this$1 = this;\n\n        this.extendSelectionsBy(function (range) {\n          if (this$1.display.shift || this$1.doc.extend || range.empty())\n            { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) }\n          else\n            { return dir < 0 ? range.from() : range.to() }\n        }, sel_move);\n      }),\n\n      deleteH: methodOp(function(dir, unit) {\n        var sel = this.doc.sel, doc = this.doc;\n        if (sel.somethingSelected())\n          { doc.replaceSelection(\"\", null, \"+delete\"); }\n        else\n          { deleteNearSelection(this, function (range) {\n            var other = findPosH(doc, range.head, dir, unit, false);\n            return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}\n          }); }\n      }),\n\n      findPosV: function(from, amount, unit, goalColumn) {\n        var dir = 1, x = goalColumn;\n        if (amount < 0) { dir = -1; amount = -amount; }\n        var cur = clipPos(this.doc, from);\n        for (var i = 0; i < amount; ++i) {\n          var coords = cursorCoords(this, cur, \"div\");\n          if (x == null) { x = coords.left; }\n          else { coords.left = x; }\n          cur = findPosV(this, coords, dir, unit);\n          if (cur.hitSide) { break }\n        }\n        return cur\n      },\n\n      moveV: methodOp(function(dir, unit) {\n        var this$1 = this;\n\n        var doc = this.doc, goals = [];\n        var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();\n        doc.extendSelectionsBy(function (range) {\n          if (collapse)\n            { return dir < 0 ? range.from() : range.to() }\n          var headPos = cursorCoords(this$1, range.head, \"div\");\n          if (range.goalColumn != null) { headPos.left = range.goalColumn; }\n          goals.push(headPos.left);\n          var pos = findPosV(this$1, headPos, dir, unit);\n          if (unit == \"page\" && range == doc.sel.primary())\n            { addToScrollTop(this$1, charCoords(this$1, pos, \"div\").top - headPos.top); }\n          return pos\n        }, sel_move);\n        if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)\n          { doc.sel.ranges[i].goalColumn = goals[i]; } }\n      }),\n\n      // Find the word at the given position (as returned by coordsChar).\n      findWordAt: function(pos) {\n        var doc = this.doc, line = getLine(doc, pos.line).text;\n        var start = pos.ch, end = pos.ch;\n        if (line) {\n          var helper = this.getHelper(pos, \"wordChars\");\n          if ((pos.sticky == \"before\" || end == line.length) && start) { --start; } else { ++end; }\n          var startChar = line.charAt(start);\n          var check = isWordChar(startChar, helper)\n            ? function (ch) { return isWordChar(ch, helper); }\n            : /\\s/.test(startChar) ? function (ch) { return /\\s/.test(ch); }\n            : function (ch) { return (!/\\s/.test(ch) && !isWordChar(ch)); };\n          while (start > 0 && check(line.charAt(start - 1))) { --start; }\n          while (end < line.length && check(line.charAt(end))) { ++end; }\n        }\n        return new Range(Pos(pos.line, start), Pos(pos.line, end))\n      },\n\n      toggleOverwrite: function(value) {\n        if (value != null && value == this.state.overwrite) { return }\n        if (this.state.overwrite = !this.state.overwrite)\n          { addClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n        else\n          { rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n\n        signal(this, \"overwriteToggle\", this, this.state.overwrite);\n      },\n      hasFocus: function() { return this.display.input.getField() == activeElt() },\n      isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },\n\n      scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),\n      getScrollInfo: function() {\n        var scroller = this.display.scroller;\n        return {left: scroller.scrollLeft, top: scroller.scrollTop,\n                height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n                width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n                clientHeight: displayHeight(this), clientWidth: displayWidth(this)}\n      },\n\n      scrollIntoView: methodOp(function(range, margin) {\n        if (range == null) {\n          range = {from: this.doc.sel.primary().head, to: null};\n          if (margin == null) { margin = this.options.cursorScrollMargin; }\n        } else if (typeof range == \"number\") {\n          range = {from: Pos(range, 0), to: null};\n        } else if (range.from == null) {\n          range = {from: range, to: null};\n        }\n        if (!range.to) { range.to = range.from; }\n        range.margin = margin || 0;\n\n        if (range.from.line != null) {\n          scrollToRange(this, range);\n        } else {\n          scrollToCoordsRange(this, range.from, range.to, range.margin);\n        }\n      }),\n\n      setSize: methodOp(function(width, height) {\n        var this$1 = this;\n\n        var interpret = function (val) { return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val; };\n        if (width != null) { this.display.wrapper.style.width = interpret(width); }\n        if (height != null) { this.display.wrapper.style.height = interpret(height); }\n        if (this.options.lineWrapping) { clearLineMeasurementCache(this); }\n        var lineNo = this.display.viewFrom;\n        this.doc.iter(lineNo, this.display.viewTo, function (line) {\n          if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)\n            { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, \"widget\"); break } } }\n          ++lineNo;\n        });\n        this.curOp.forceUpdate = true;\n        signal(this, \"refresh\", this);\n      }),\n\n      operation: function(f){return runInOp(this, f)},\n      startOperation: function(){return startOperation(this)},\n      endOperation: function(){return endOperation(this)},\n\n      refresh: methodOp(function() {\n        var oldHeight = this.display.cachedTextHeight;\n        regChange(this);\n        this.curOp.forceUpdate = true;\n        clearCaches(this);\n        scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);\n        updateGutterSpace(this.display);\n        if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)\n          { estimateLineHeights(this); }\n        signal(this, \"refresh\", this);\n      }),\n\n      swapDoc: methodOp(function(doc) {\n        var old = this.doc;\n        old.cm = null;\n        // Cancel the current text selection if any (#5821)\n        if (this.state.selectingText) { this.state.selectingText(); }\n        attachDoc(this, doc);\n        clearCaches(this);\n        this.display.input.reset();\n        scrollToCoords(this, doc.scrollLeft, doc.scrollTop);\n        this.curOp.forceScroll = true;\n        signalLater(this, \"swapDoc\", this, old);\n        return old\n      }),\n\n      phrase: function(phraseText) {\n        var phrases = this.options.phrases;\n        return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText\n      },\n\n      getInputField: function(){return this.display.input.getField()},\n      getWrapperElement: function(){return this.display.wrapper},\n      getScrollerElement: function(){return this.display.scroller},\n      getGutterElement: function(){return this.display.gutters}\n    };\n    eventMixin(CodeMirror);\n\n    CodeMirror.registerHelper = function(type, name, value) {\n      if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }\n      helpers[type][name] = value;\n    };\n    CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n      CodeMirror.registerHelper(type, name, value);\n      helpers[type]._global.push({pred: predicate, val: value});\n    };\n  }\n\n  // Used for horizontal relative motion. Dir is -1 or 1 (left or\n  // right), unit can be \"codepoint\", \"char\", \"column\" (like char, but\n  // doesn't cross line boundaries), \"word\" (across next word), or\n  // \"group\" (to the start of next group of word or\n  // non-word-non-whitespace chars). The visually param controls\n  // whether, in right-to-left text, direction 1 means to move towards\n  // the next index in the string, or towards the character to the right\n  // of the current position. The resulting position will have a\n  // hitSide=true property if it reached the end of the document.\n  function findPosH(doc, pos, dir, unit, visually) {\n    var oldPos = pos;\n    var origDir = dir;\n    var lineObj = getLine(doc, pos.line);\n    var lineDir = visually && doc.direction == \"rtl\" ? -dir : dir;\n    function findNextLine() {\n      var l = pos.line + lineDir;\n      if (l < doc.first || l >= doc.first + doc.size) { return false }\n      pos = new Pos(l, pos.ch, pos.sticky);\n      return lineObj = getLine(doc, l)\n    }\n    function moveOnce(boundToLine) {\n      var next;\n      if (unit == \"codepoint\") {\n        var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1));\n        if (isNaN(ch)) {\n          next = null;\n        } else {\n          var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF;\n          next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir);\n        }\n      } else if (visually) {\n        next = moveVisually(doc.cm, lineObj, pos, dir);\n      } else {\n        next = moveLogically(lineObj, pos, dir);\n      }\n      if (next == null) {\n        if (!boundToLine && findNextLine())\n          { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); }\n        else\n          { return false }\n      } else {\n        pos = next;\n      }\n      return true\n    }\n\n    if (unit == \"char\" || unit == \"codepoint\") {\n      moveOnce();\n    } else if (unit == \"column\") {\n      moveOnce(true);\n    } else if (unit == \"word\" || unit == \"group\") {\n      var sawType = null, group = unit == \"group\";\n      var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n      for (var first = true;; first = false) {\n        if (dir < 0 && !moveOnce(!first)) { break }\n        var cur = lineObj.text.charAt(pos.ch) || \"\\n\";\n        var type = isWordChar(cur, helper) ? \"w\"\n          : group && cur == \"\\n\" ? \"n\"\n          : !group || /\\s/.test(cur) ? null\n          : \"p\";\n        if (group && !first && !type) { type = \"s\"; }\n        if (sawType && sawType != type) {\n          if (dir < 0) {dir = 1; moveOnce(); pos.sticky = \"after\";}\n          break\n        }\n\n        if (type) { sawType = type; }\n        if (dir > 0 && !moveOnce(!first)) { break }\n      }\n    }\n    var result = skipAtomic(doc, pos, oldPos, origDir, true);\n    if (equalCursorPos(oldPos, result)) { result.hitSide = true; }\n    return result\n  }\n\n  // For relative vertical movement. Dir may be -1 or 1. Unit can be\n  // \"page\" or \"line\". The resulting position will have a hitSide=true\n  // property if it reached the end of the document.\n  function findPosV(cm, pos, dir, unit) {\n    var doc = cm.doc, x = pos.left, y;\n    if (unit == \"page\") {\n      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);\n      var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);\n      y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;\n\n    } else if (unit == \"line\") {\n      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n    }\n    var target;\n    for (;;) {\n      target = coordsChar(cm, x, y);\n      if (!target.outside) { break }\n      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }\n      y += dir * 5;\n    }\n    return target\n  }\n\n  // CONTENTEDITABLE INPUT STYLE\n\n  var ContentEditableInput = function(cm) {\n    this.cm = cm;\n    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;\n    this.polling = new Delayed();\n    this.composing = null;\n    this.gracePeriod = false;\n    this.readDOMTimeout = null;\n  };\n\n  ContentEditableInput.prototype.init = function (display) {\n      var this$1 = this;\n\n    var input = this, cm = input.cm;\n    var div = input.div = display.lineDiv;\n    div.contentEditable = true;\n    disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);\n\n    function belongsToInput(e) {\n      for (var t = e.target; t; t = t.parentNode) {\n        if (t == div) { return true }\n        if (/\\bCodeMirror-(?:line)?widget\\b/.test(t.className)) { break }\n      }\n      return false\n    }\n\n    on(div, \"paste\", function (e) {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n      // IE doesn't fire input events, so we schedule a read for the pasted content in this way\n      if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }\n    });\n\n    on(div, \"compositionstart\", function (e) {\n      this$1.composing = {data: e.data, done: false};\n    });\n    on(div, \"compositionupdate\", function (e) {\n      if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }\n    });\n    on(div, \"compositionend\", function (e) {\n      if (this$1.composing) {\n        if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }\n        this$1.composing.done = true;\n      }\n    });\n\n    on(div, \"touchstart\", function () { return input.forceCompositionEnd(); });\n\n    on(div, \"input\", function () {\n      if (!this$1.composing) { this$1.readFromDOMSoon(); }\n    });\n\n    function onCopyCut(e) {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return }\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()});\n        if (e.type == \"cut\") { cm.replaceSelection(\"\", null, \"cut\"); }\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        var ranges = copyableRanges(cm);\n        setLastCopied({lineWise: true, text: ranges.text});\n        if (e.type == \"cut\") {\n          cm.operation(function () {\n            cm.setSelections(ranges.ranges, 0, sel_dontScroll);\n            cm.replaceSelection(\"\", null, \"cut\");\n          });\n        }\n      }\n      if (e.clipboardData) {\n        e.clipboardData.clearData();\n        var content = lastCopied.text.join(\"\\n\");\n        // iOS exposes the clipboard API, but seems to discard content inserted into it\n        e.clipboardData.setData(\"Text\", content);\n        if (e.clipboardData.getData(\"Text\") == content) {\n          e.preventDefault();\n          return\n        }\n      }\n      // Old-fashioned briefly-focus-a-textarea hack\n      var kludge = hiddenTextarea(), te = kludge.firstChild;\n      cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);\n      te.value = lastCopied.text.join(\"\\n\");\n      var hadFocus = activeElt();\n      selectInput(te);\n      setTimeout(function () {\n        cm.display.lineSpace.removeChild(kludge);\n        hadFocus.focus();\n        if (hadFocus == div) { input.showPrimarySelection(); }\n      }, 50);\n    }\n    on(div, \"copy\", onCopyCut);\n    on(div, \"cut\", onCopyCut);\n  };\n\n  ContentEditableInput.prototype.screenReaderLabelChanged = function (label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.div.setAttribute('aria-label', label);\n    } else {\n      this.div.removeAttribute('aria-label');\n    }\n  };\n\n  ContentEditableInput.prototype.prepareSelection = function () {\n    var result = prepareSelection(this.cm, false);\n    result.focus = activeElt() == this.div;\n    return result\n  };\n\n  ContentEditableInput.prototype.showSelection = function (info, takeFocus) {\n    if (!info || !this.cm.display.view.length) { return }\n    if (info.focus || takeFocus) { this.showPrimarySelection(); }\n    this.showMultipleSelections(info);\n  };\n\n  ContentEditableInput.prototype.getSelection = function () {\n    return this.cm.display.wrapper.ownerDocument.getSelection()\n  };\n\n  ContentEditableInput.prototype.showPrimarySelection = function () {\n    var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();\n    var from = prim.from(), to = prim.to();\n\n    if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {\n      sel.removeAllRanges();\n      return\n    }\n\n    var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n    var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);\n    if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n        cmp(minPos(curAnchor, curFocus), from) == 0 &&\n        cmp(maxPos(curAnchor, curFocus), to) == 0)\n      { return }\n\n    var view = cm.display.view;\n    var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||\n        {node: view[0].measure.map[2], offset: 0};\n    var end = to.line < cm.display.viewTo && posToDOM(cm, to);\n    if (!end) {\n      var measure = view[view.length - 1].measure;\n      var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;\n      end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};\n    }\n\n    if (!start || !end) {\n      sel.removeAllRanges();\n      return\n    }\n\n    var old = sel.rangeCount && sel.getRangeAt(0), rng;\n    try { rng = range(start.node, start.offset, end.offset, end.node); }\n    catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n    if (rng) {\n      if (!gecko && cm.state.focused) {\n        sel.collapse(start.node, start.offset);\n        if (!rng.collapsed) {\n          sel.removeAllRanges();\n          sel.addRange(rng);\n        }\n      } else {\n        sel.removeAllRanges();\n        sel.addRange(rng);\n      }\n      if (old && sel.anchorNode == null) { sel.addRange(old); }\n      else if (gecko) { this.startGracePeriod(); }\n    }\n    this.rememberSelection();\n  };\n\n  ContentEditableInput.prototype.startGracePeriod = function () {\n      var this$1 = this;\n\n    clearTimeout(this.gracePeriod);\n    this.gracePeriod = setTimeout(function () {\n      this$1.gracePeriod = false;\n      if (this$1.selectionChanged())\n        { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }\n    }, 20);\n  };\n\n  ContentEditableInput.prototype.showMultipleSelections = function (info) {\n    removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);\n    removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);\n  };\n\n  ContentEditableInput.prototype.rememberSelection = function () {\n    var sel = this.getSelection();\n    this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;\n    this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;\n  };\n\n  ContentEditableInput.prototype.selectionInEditor = function () {\n    var sel = this.getSelection();\n    if (!sel.rangeCount) { return false }\n    var node = sel.getRangeAt(0).commonAncestorContainer;\n    return contains(this.div, node)\n  };\n\n  ContentEditableInput.prototype.focus = function () {\n    if (this.cm.options.readOnly != \"nocursor\") {\n      if (!this.selectionInEditor() || activeElt() != this.div)\n        { this.showSelection(this.prepareSelection(), true); }\n      this.div.focus();\n    }\n  };\n  ContentEditableInput.prototype.blur = function () { this.div.blur(); };\n  ContentEditableInput.prototype.getField = function () { return this.div };\n\n  ContentEditableInput.prototype.supportsTouch = function () { return true };\n\n  ContentEditableInput.prototype.receivedFocus = function () {\n      var this$1 = this;\n\n    var input = this;\n    if (this.selectionInEditor())\n      { setTimeout(function () { return this$1.pollSelection(); }, 20); }\n    else\n      { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }\n\n    function poll() {\n      if (input.cm.state.focused) {\n        input.pollSelection();\n        input.polling.set(input.cm.options.pollInterval, poll);\n      }\n    }\n    this.polling.set(this.cm.options.pollInterval, poll);\n  };\n\n  ContentEditableInput.prototype.selectionChanged = function () {\n    var sel = this.getSelection();\n    return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n      sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset\n  };\n\n  ContentEditableInput.prototype.pollSelection = function () {\n    if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }\n    var sel = this.getSelection(), cm = this.cm;\n    // On Android Chrome (version 56, at least), backspacing into an\n    // uneditable block element will put the cursor in that element,\n    // and then, because it's not editable, hide the virtual keyboard.\n    // Because Android doesn't allow us to actually detect backspace\n    // presses in a sane way, this code checks for when that happens\n    // and simulates a backspace press in this case.\n    if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {\n      this.cm.triggerOnKeyDown({type: \"keydown\", keyCode: 8, preventDefault: Math.abs});\n      this.blur();\n      this.focus();\n      return\n    }\n    if (this.composing) { return }\n    this.rememberSelection();\n    var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n    var head = domToPos(cm, sel.focusNode, sel.focusOffset);\n    if (anchor && head) { runInOp(cm, function () {\n      setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);\n      if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }\n    }); }\n  };\n\n  ContentEditableInput.prototype.pollContent = function () {\n    if (this.readDOMTimeout != null) {\n      clearTimeout(this.readDOMTimeout);\n      this.readDOMTimeout = null;\n    }\n\n    var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();\n    var from = sel.from(), to = sel.to();\n    if (from.ch == 0 && from.line > cm.firstLine())\n      { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }\n    if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())\n      { to = Pos(to.line + 1, 0); }\n    if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }\n\n    var fromIndex, fromLine, fromNode;\n    if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n      fromLine = lineNo(display.view[0].line);\n      fromNode = display.view[0].node;\n    } else {\n      fromLine = lineNo(display.view[fromIndex].line);\n      fromNode = display.view[fromIndex - 1].node.nextSibling;\n    }\n    var toIndex = findViewIndex(cm, to.line);\n    var toLine, toNode;\n    if (toIndex == display.view.length - 1) {\n      toLine = display.viewTo - 1;\n      toNode = display.lineDiv.lastChild;\n    } else {\n      toLine = lineNo(display.view[toIndex + 1].line) - 1;\n      toNode = display.view[toIndex + 1].node.previousSibling;\n    }\n\n    if (!fromNode) { return false }\n    var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));\n    var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));\n    while (newText.length > 1 && oldText.length > 1) {\n      if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }\n      else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }\n      else { break }\n    }\n\n    var cutFront = 0, cutEnd = 0;\n    var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);\n    while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n      { ++cutFront; }\n    var newBot = lst(newText), oldBot = lst(oldText);\n    var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n                             oldBot.length - (oldText.length == 1 ? cutFront : 0));\n    while (cutEnd < maxCutEnd &&\n           newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n      { ++cutEnd; }\n    // Try to move start of change to start of selection if ambiguous\n    if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {\n      while (cutFront && cutFront > from.ch &&\n             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {\n        cutFront--;\n        cutEnd++;\n      }\n    }\n\n    newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\\u200b+/, \"\");\n    newText[0] = newText[0].slice(cutFront).replace(/\\u200b+$/, \"\");\n\n    var chFrom = Pos(fromLine, cutFront);\n    var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);\n    if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n      replaceRange(cm.doc, newText, chFrom, chTo, \"+input\");\n      return true\n    }\n  };\n\n  ContentEditableInput.prototype.ensurePolled = function () {\n    this.forceCompositionEnd();\n  };\n  ContentEditableInput.prototype.reset = function () {\n    this.forceCompositionEnd();\n  };\n  ContentEditableInput.prototype.forceCompositionEnd = function () {\n    if (!this.composing) { return }\n    clearTimeout(this.readDOMTimeout);\n    this.composing = null;\n    this.updateFromDOM();\n    this.div.blur();\n    this.div.focus();\n  };\n  ContentEditableInput.prototype.readFromDOMSoon = function () {\n      var this$1 = this;\n\n    if (this.readDOMTimeout != null) { return }\n    this.readDOMTimeout = setTimeout(function () {\n      this$1.readDOMTimeout = null;\n      if (this$1.composing) {\n        if (this$1.composing.done) { this$1.composing = null; }\n        else { return }\n      }\n      this$1.updateFromDOM();\n    }, 80);\n  };\n\n  ContentEditableInput.prototype.updateFromDOM = function () {\n      var this$1 = this;\n\n    if (this.cm.isReadOnly() || !this.pollContent())\n      { runInOp(this.cm, function () { return regChange(this$1.cm); }); }\n  };\n\n  ContentEditableInput.prototype.setUneditable = function (node) {\n    node.contentEditable = \"false\";\n  };\n\n  ContentEditableInput.prototype.onKeyPress = function (e) {\n    if (e.charCode == 0 || this.composing) { return }\n    e.preventDefault();\n    if (!this.cm.isReadOnly())\n      { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }\n  };\n\n  ContentEditableInput.prototype.readOnlyChanged = function (val) {\n    this.div.contentEditable = String(val != \"nocursor\");\n  };\n\n  ContentEditableInput.prototype.onContextMenu = function () {};\n  ContentEditableInput.prototype.resetPosition = function () {};\n\n  ContentEditableInput.prototype.needsContentAttribute = true;\n\n  function posToDOM(cm, pos) {\n    var view = findViewForLine(cm, pos.line);\n    if (!view || view.hidden) { return null }\n    var line = getLine(cm.doc, pos.line);\n    var info = mapFromLineView(view, line, pos.line);\n\n    var order = getOrder(line, cm.doc.direction), side = \"left\";\n    if (order) {\n      var partPos = getBidiPartAt(order, pos.ch);\n      side = partPos % 2 ? \"right\" : \"left\";\n    }\n    var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);\n    result.offset = result.collapse == \"right\" ? result.end : result.start;\n    return result\n  }\n\n  function isInGutter(node) {\n    for (var scan = node; scan; scan = scan.parentNode)\n      { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }\n    return false\n  }\n\n  function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }\n\n  function domTextBetween(cm, from, to, fromLine, toLine) {\n    var text = \"\", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;\n    function recognizeMarker(id) { return function (marker) { return marker.id == id; } }\n    function close() {\n      if (closing) {\n        text += lineSep;\n        if (extraLinebreak) { text += lineSep; }\n        closing = extraLinebreak = false;\n      }\n    }\n    function addText(str) {\n      if (str) {\n        close();\n        text += str;\n      }\n    }\n    function walk(node) {\n      if (node.nodeType == 1) {\n        var cmText = node.getAttribute(\"cm-text\");\n        if (cmText) {\n          addText(cmText);\n          return\n        }\n        var markerID = node.getAttribute(\"cm-marker\"), range;\n        if (markerID) {\n          var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));\n          if (found.length && (range = found[0].find(0)))\n            { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); }\n          return\n        }\n        if (node.getAttribute(\"contenteditable\") == \"false\") { return }\n        var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);\n        if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }\n\n        if (isBlock) { close(); }\n        for (var i = 0; i < node.childNodes.length; i++)\n          { walk(node.childNodes[i]); }\n\n        if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }\n        if (isBlock) { closing = true; }\n      } else if (node.nodeType == 3) {\n        addText(node.nodeValue.replace(/\\u200b/g, \"\").replace(/\\u00a0/g, \" \"));\n      }\n    }\n    for (;;) {\n      walk(from);\n      if (from == to) { break }\n      from = from.nextSibling;\n      extraLinebreak = false;\n    }\n    return text\n  }\n\n  function domToPos(cm, node, offset) {\n    var lineNode;\n    if (node == cm.display.lineDiv) {\n      lineNode = cm.display.lineDiv.childNodes[offset];\n      if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }\n      node = null; offset = 0;\n    } else {\n      for (lineNode = node;; lineNode = lineNode.parentNode) {\n        if (!lineNode || lineNode == cm.display.lineDiv) { return null }\n        if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }\n      }\n    }\n    for (var i = 0; i < cm.display.view.length; i++) {\n      var lineView = cm.display.view[i];\n      if (lineView.node == lineNode)\n        { return locateNodeInLineView(lineView, node, offset) }\n    }\n  }\n\n  function locateNodeInLineView(lineView, node, offset) {\n    var wrapper = lineView.text.firstChild, bad = false;\n    if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }\n    if (node == wrapper) {\n      bad = true;\n      node = wrapper.childNodes[offset];\n      offset = 0;\n      if (!node) {\n        var line = lineView.rest ? lst(lineView.rest) : lineView.line;\n        return badPos(Pos(lineNo(line), line.text.length), bad)\n      }\n    }\n\n    var textNode = node.nodeType == 3 ? node : null, topNode = node;\n    if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {\n      textNode = node.firstChild;\n      if (offset) { offset = textNode.nodeValue.length; }\n    }\n    while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }\n    var measure = lineView.measure, maps = measure.maps;\n\n    function find(textNode, topNode, offset) {\n      for (var i = -1; i < (maps ? maps.length : 0); i++) {\n        var map = i < 0 ? measure.map : maps[i];\n        for (var j = 0; j < map.length; j += 3) {\n          var curNode = map[j + 2];\n          if (curNode == textNode || curNode == topNode) {\n            var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);\n            var ch = map[j] + offset;\n            if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; }\n            return Pos(line, ch)\n          }\n        }\n      }\n    }\n    var found = find(textNode, topNode, offset);\n    if (found) { return badPos(found, bad) }\n\n    // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems\n    for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {\n      found = find(after, after.firstChild, 0);\n      if (found)\n        { return badPos(Pos(found.line, found.ch - dist), bad) }\n      else\n        { dist += after.textContent.length; }\n    }\n    for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {\n      found = find(before, before.firstChild, -1);\n      if (found)\n        { return badPos(Pos(found.line, found.ch + dist$1), bad) }\n      else\n        { dist$1 += before.textContent.length; }\n    }\n  }\n\n  // TEXTAREA INPUT STYLE\n\n  var TextareaInput = function(cm) {\n    this.cm = cm;\n    // See input.poll and input.reset\n    this.prevInput = \"\";\n\n    // Flag that indicates whether we expect input to appear real soon\n    // now (after some event like 'keypress' or 'input') and are\n    // polling intensively.\n    this.pollingFast = false;\n    // Self-resetting timeout for the poller\n    this.polling = new Delayed();\n    // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n    this.hasSelection = false;\n    this.composing = null;\n  };\n\n  TextareaInput.prototype.init = function (display) {\n      var this$1 = this;\n\n    var input = this, cm = this.cm;\n    this.createField(display);\n    var te = this.textarea;\n\n    display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild);\n\n    // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n    if (ios) { te.style.width = \"0px\"; }\n\n    on(te, \"input\", function () {\n      if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }\n      input.poll();\n    });\n\n    on(te, \"paste\", function (e) {\n      if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n\n      cm.state.pasteIncoming = +new Date;\n      input.fastPoll();\n    });\n\n    function prepareCopyCut(e) {\n      if (signalDOMEvent(cm, e)) { return }\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()});\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        var ranges = copyableRanges(cm);\n        setLastCopied({lineWise: true, text: ranges.text});\n        if (e.type == \"cut\") {\n          cm.setSelections(ranges.ranges, null, sel_dontScroll);\n        } else {\n          input.prevInput = \"\";\n          te.value = ranges.text.join(\"\\n\");\n          selectInput(te);\n        }\n      }\n      if (e.type == \"cut\") { cm.state.cutIncoming = +new Date; }\n    }\n    on(te, \"cut\", prepareCopyCut);\n    on(te, \"copy\", prepareCopyCut);\n\n    on(display.scroller, \"paste\", function (e) {\n      if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }\n      if (!te.dispatchEvent) {\n        cm.state.pasteIncoming = +new Date;\n        input.focus();\n        return\n      }\n\n      // Pass the `paste` event to the textarea so it's handled by its event listener.\n      var event = new Event(\"paste\");\n      event.clipboardData = e.clipboardData;\n      te.dispatchEvent(event);\n    });\n\n    // Prevent normal selection in the editor (we handle our own)\n    on(display.lineSpace, \"selectstart\", function (e) {\n      if (!eventInWidget(display, e)) { e_preventDefault(e); }\n    });\n\n    on(te, \"compositionstart\", function () {\n      var start = cm.getCursor(\"from\");\n      if (input.composing) { input.composing.range.clear(); }\n      input.composing = {\n        start: start,\n        range: cm.markText(start, cm.getCursor(\"to\"), {className: \"CodeMirror-composing\"})\n      };\n    });\n    on(te, \"compositionend\", function () {\n      if (input.composing) {\n        input.poll();\n        input.composing.range.clear();\n        input.composing = null;\n      }\n    });\n  };\n\n  TextareaInput.prototype.createField = function (_display) {\n    // Wraps and hides input textarea\n    this.wrapper = hiddenTextarea();\n    // The semihidden textarea that is focused when the editor is\n    // focused, and receives input.\n    this.textarea = this.wrapper.firstChild;\n  };\n\n  TextareaInput.prototype.screenReaderLabelChanged = function (label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.textarea.setAttribute('aria-label', label);\n    } else {\n      this.textarea.removeAttribute('aria-label');\n    }\n  };\n\n  TextareaInput.prototype.prepareSelection = function () {\n    // Redraw the selection and/or cursor\n    var cm = this.cm, display = cm.display, doc = cm.doc;\n    var result = prepareSelection(cm);\n\n    // Move the hidden textarea near the cursor to prevent scrolling artifacts\n    if (cm.options.moveInputWithCursor) {\n      var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n      var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n                                          headPos.top + lineOff.top - wrapOff.top));\n      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n                                           headPos.left + lineOff.left - wrapOff.left));\n    }\n\n    return result\n  };\n\n  TextareaInput.prototype.showSelection = function (drawn) {\n    var cm = this.cm, display = cm.display;\n    removeChildrenAndAdd(display.cursorDiv, drawn.cursors);\n    removeChildrenAndAdd(display.selectionDiv, drawn.selection);\n    if (drawn.teTop != null) {\n      this.wrapper.style.top = drawn.teTop + \"px\";\n      this.wrapper.style.left = drawn.teLeft + \"px\";\n    }\n  };\n\n  // Reset the input to correspond to the selection (or to be empty,\n  // when not typing and nothing is selected)\n  TextareaInput.prototype.reset = function (typing) {\n    if (this.contextMenuPending || this.composing) { return }\n    var cm = this.cm;\n    if (cm.somethingSelected()) {\n      this.prevInput = \"\";\n      var content = cm.getSelection();\n      this.textarea.value = content;\n      if (cm.state.focused) { selectInput(this.textarea); }\n      if (ie && ie_version >= 9) { this.hasSelection = content; }\n    } else if (!typing) {\n      this.prevInput = this.textarea.value = \"\";\n      if (ie && ie_version >= 9) { this.hasSelection = null; }\n    }\n  };\n\n  TextareaInput.prototype.getField = function () { return this.textarea };\n\n  TextareaInput.prototype.supportsTouch = function () { return false };\n\n  TextareaInput.prototype.focus = function () {\n    if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != this.textarea)) {\n      try { this.textarea.focus(); }\n      catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM\n    }\n  };\n\n  TextareaInput.prototype.blur = function () { this.textarea.blur(); };\n\n  TextareaInput.prototype.resetPosition = function () {\n    this.wrapper.style.top = this.wrapper.style.left = 0;\n  };\n\n  TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };\n\n  // Poll for input changes, using the normal rate of polling. This\n  // runs as long as the editor is focused.\n  TextareaInput.prototype.slowPoll = function () {\n      var this$1 = this;\n\n    if (this.pollingFast) { return }\n    this.polling.set(this.cm.options.pollInterval, function () {\n      this$1.poll();\n      if (this$1.cm.state.focused) { this$1.slowPoll(); }\n    });\n  };\n\n  // When an event has just come in that is likely to add or change\n  // something in the input textarea, we poll faster, to ensure that\n  // the change appears on the screen quickly.\n  TextareaInput.prototype.fastPoll = function () {\n    var missed = false, input = this;\n    input.pollingFast = true;\n    function p() {\n      var changed = input.poll();\n      if (!changed && !missed) {missed = true; input.polling.set(60, p);}\n      else {input.pollingFast = false; input.slowPoll();}\n    }\n    input.polling.set(20, p);\n  };\n\n  // Read input from the textarea, and update the document to match.\n  // When something is selected, it is present in the textarea, and\n  // selected (unless it is huge, in which case a placeholder is\n  // used). When nothing is selected, the cursor sits after previously\n  // seen text (can be empty), which is stored in prevInput (we must\n  // not reset the textarea when typing, because that breaks IME).\n  TextareaInput.prototype.poll = function () {\n      var this$1 = this;\n\n    var cm = this.cm, input = this.textarea, prevInput = this.prevInput;\n    // Since this is called a *lot*, try to bail out as cheaply as\n    // possible when it is clear that nothing happened. hasSelection\n    // will be the case when there is a lot of text in the textarea,\n    // in which case reading its value would be expensive.\n    if (this.contextMenuPending || !cm.state.focused ||\n        (hasSelection(input) && !prevInput && !this.composing) ||\n        cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n      { return false }\n\n    var text = input.value;\n    // If nothing changed, bail.\n    if (text == prevInput && !cm.somethingSelected()) { return false }\n    // Work around nonsensical selection resetting in IE9/10, and\n    // inexplicable appearance of private area unicode characters on\n    // some key combos in Mac (#2689).\n    if (ie && ie_version >= 9 && this.hasSelection === text ||\n        mac && /[\\uf700-\\uf7ff]/.test(text)) {\n      cm.display.input.reset();\n      return false\n    }\n\n    if (cm.doc.sel == cm.display.selForContextMenu) {\n      var first = text.charCodeAt(0);\n      if (first == 0x200b && !prevInput) { prevInput = \"\\u200b\"; }\n      if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\") }\n    }\n    // Find the part of the input that is actually new\n    var same = 0, l = Math.min(prevInput.length, text.length);\n    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }\n\n    runInOp(cm, function () {\n      applyTextInput(cm, text.slice(same), prevInput.length - same,\n                     null, this$1.composing ? \"*compose\" : null);\n\n      // Don't leave long text in the textarea, since it makes further polling slow\n      if (text.length > 1000 || text.indexOf(\"\\n\") > -1) { input.value = this$1.prevInput = \"\"; }\n      else { this$1.prevInput = text; }\n\n      if (this$1.composing) {\n        this$1.composing.range.clear();\n        this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor(\"to\"),\n                                           {className: \"CodeMirror-composing\"});\n      }\n    });\n    return true\n  };\n\n  TextareaInput.prototype.ensurePolled = function () {\n    if (this.pollingFast && this.poll()) { this.pollingFast = false; }\n  };\n\n  TextareaInput.prototype.onKeyPress = function () {\n    if (ie && ie_version >= 9) { this.hasSelection = null; }\n    this.fastPoll();\n  };\n\n  TextareaInput.prototype.onContextMenu = function (e) {\n    var input = this, cm = input.cm, display = cm.display, te = input.textarea;\n    if (input.contextMenuPending) { input.contextMenuPending(); }\n    var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n    if (!pos || presto) { return } // Opera is difficult.\n\n    // Reset the current text selection only if the click is done outside of the selection\n    // and 'resetSelectionOnContextMenu' option is true.\n    var reset = cm.options.resetSelectionOnContextMenu;\n    if (reset && cm.doc.sel.contains(pos) == -1)\n      { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }\n\n    var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;\n    var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect();\n    input.wrapper.style.cssText = \"position: static\";\n    te.style.cssText = \"position: absolute; width: 30px; height: 30px;\\n      top: \" + (e.clientY - wrapperBox.top - 5) + \"px; left: \" + (e.clientX - wrapperBox.left - 5) + \"px;\\n      z-index: 1000; background: \" + (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") + \";\\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n    var oldScrollY;\n    if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712)\n    display.input.focus();\n    if (webkit) { window.scrollTo(null, oldScrollY); }\n    display.input.reset();\n    // Adds \"Select all\" to context menu in FF\n    if (!cm.somethingSelected()) { te.value = input.prevInput = \" \"; }\n    input.contextMenuPending = rehide;\n    display.selForContextMenu = cm.doc.sel;\n    clearTimeout(display.detectingSelectAll);\n\n    // Select-all will be greyed out if there's nothing to select, so\n    // this adds a zero-width space so that we can later check whether\n    // it got selected.\n    function prepareSelectAllHack() {\n      if (te.selectionStart != null) {\n        var selected = cm.somethingSelected();\n        var extval = \"\\u200b\" + (selected ? te.value : \"\");\n        te.value = \"\\u21da\"; // Used to catch context-menu undo\n        te.value = extval;\n        input.prevInput = selected ? \"\" : \"\\u200b\";\n        te.selectionStart = 1; te.selectionEnd = extval.length;\n        // Re-set this, in case some other handler touched the\n        // selection in the meantime.\n        display.selForContextMenu = cm.doc.sel;\n      }\n    }\n    function rehide() {\n      if (input.contextMenuPending != rehide) { return }\n      input.contextMenuPending = false;\n      input.wrapper.style.cssText = oldWrapperCSS;\n      te.style.cssText = oldCSS;\n      if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }\n\n      // Try to detect the user choosing select-all\n      if (te.selectionStart != null) {\n        if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }\n        var i = 0, poll = function () {\n          if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n              te.selectionEnd > 0 && input.prevInput == \"\\u200b\") {\n            operation(cm, selectAll)(cm);\n          } else if (i++ < 10) {\n            display.detectingSelectAll = setTimeout(poll, 500);\n          } else {\n            display.selForContextMenu = null;\n            display.input.reset();\n          }\n        };\n        display.detectingSelectAll = setTimeout(poll, 200);\n      }\n    }\n\n    if (ie && ie_version >= 9) { prepareSelectAllHack(); }\n    if (captureRightClick) {\n      e_stop(e);\n      var mouseup = function () {\n        off(window, \"mouseup\", mouseup);\n        setTimeout(rehide, 20);\n      };\n      on(window, \"mouseup\", mouseup);\n    } else {\n      setTimeout(rehide, 50);\n    }\n  };\n\n  TextareaInput.prototype.readOnlyChanged = function (val) {\n    if (!val) { this.reset(); }\n    this.textarea.disabled = val == \"nocursor\";\n    this.textarea.readOnly = !!val;\n  };\n\n  TextareaInput.prototype.setUneditable = function () {};\n\n  TextareaInput.prototype.needsContentAttribute = false;\n\n  function fromTextArea(textarea, options) {\n    options = options ? copyObj(options) : {};\n    options.value = textarea.value;\n    if (!options.tabindex && textarea.tabIndex)\n      { options.tabindex = textarea.tabIndex; }\n    if (!options.placeholder && textarea.placeholder)\n      { options.placeholder = textarea.placeholder; }\n    // Set autofocus to true if this textarea is focused, or if it has\n    // autofocus and no other element is focused.\n    if (options.autofocus == null) {\n      var hasFocus = activeElt();\n      options.autofocus = hasFocus == textarea ||\n        textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n    }\n\n    function save() {textarea.value = cm.getValue();}\n\n    var realSubmit;\n    if (textarea.form) {\n      on(textarea.form, \"submit\", save);\n      // Deplorable hack to make the submit method do the right thing.\n      if (!options.leaveSubmitMethodAlone) {\n        var form = textarea.form;\n        realSubmit = form.submit;\n        try {\n          var wrappedSubmit = form.submit = function () {\n            save();\n            form.submit = realSubmit;\n            form.submit();\n            form.submit = wrappedSubmit;\n          };\n        } catch(e) {}\n      }\n    }\n\n    options.finishInit = function (cm) {\n      cm.save = save;\n      cm.getTextArea = function () { return textarea; };\n      cm.toTextArea = function () {\n        cm.toTextArea = isNaN; // Prevent this from being ran twice\n        save();\n        textarea.parentNode.removeChild(cm.getWrapperElement());\n        textarea.style.display = \"\";\n        if (textarea.form) {\n          off(textarea.form, \"submit\", save);\n          if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == \"function\")\n            { textarea.form.submit = realSubmit; }\n        }\n      };\n    };\n\n    textarea.style.display = \"none\";\n    var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },\n      options);\n    return cm\n  }\n\n  function addLegacyProps(CodeMirror) {\n    CodeMirror.off = off;\n    CodeMirror.on = on;\n    CodeMirror.wheelEventPixels = wheelEventPixels;\n    CodeMirror.Doc = Doc;\n    CodeMirror.splitLines = splitLinesAuto;\n    CodeMirror.countColumn = countColumn;\n    CodeMirror.findColumn = findColumn;\n    CodeMirror.isWordChar = isWordCharBasic;\n    CodeMirror.Pass = Pass;\n    CodeMirror.signal = signal;\n    CodeMirror.Line = Line;\n    CodeMirror.changeEnd = changeEnd;\n    CodeMirror.scrollbarModel = scrollbarModel;\n    CodeMirror.Pos = Pos;\n    CodeMirror.cmpPos = cmp;\n    CodeMirror.modes = modes;\n    CodeMirror.mimeModes = mimeModes;\n    CodeMirror.resolveMode = resolveMode;\n    CodeMirror.getMode = getMode;\n    CodeMirror.modeExtensions = modeExtensions;\n    CodeMirror.extendMode = extendMode;\n    CodeMirror.copyState = copyState;\n    CodeMirror.startState = startState;\n    CodeMirror.innerMode = innerMode;\n    CodeMirror.commands = commands;\n    CodeMirror.keyMap = keyMap;\n    CodeMirror.keyName = keyName;\n    CodeMirror.isModifierKey = isModifierKey;\n    CodeMirror.lookupKey = lookupKey;\n    CodeMirror.normalizeKeyMap = normalizeKeyMap;\n    CodeMirror.StringStream = StringStream;\n    CodeMirror.SharedTextMarker = SharedTextMarker;\n    CodeMirror.TextMarker = TextMarker;\n    CodeMirror.LineWidget = LineWidget;\n    CodeMirror.e_preventDefault = e_preventDefault;\n    CodeMirror.e_stopPropagation = e_stopPropagation;\n    CodeMirror.e_stop = e_stop;\n    CodeMirror.addClass = addClass;\n    CodeMirror.contains = contains;\n    CodeMirror.rmClass = rmClass;\n    CodeMirror.keyNames = keyNames;\n  }\n\n  // EDITOR CONSTRUCTOR\n\n  defineOptions(CodeMirror);\n\n  addEditorMethods(CodeMirror);\n\n  // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n  var dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \");\n  for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n    { CodeMirror.prototype[prop] = (function(method) {\n      return function() {return method.apply(this.doc, arguments)}\n    })(Doc.prototype[prop]); } }\n\n  eventMixin(Doc);\n  CodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  CodeMirror.defineMode = function(name/*, mode, …*/) {\n    if (!CodeMirror.defaults.mode && name != \"null\") { CodeMirror.defaults.mode = name; }\n    defineMode.apply(this, arguments);\n  };\n\n  CodeMirror.defineMIME = defineMIME;\n\n  // Minimal default mode.\n  CodeMirror.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\n  CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n  // EXTENSIONS\n\n  CodeMirror.defineExtension = function (name, func) {\n    CodeMirror.prototype[name] = func;\n  };\n  CodeMirror.defineDocExtension = function (name, func) {\n    Doc.prototype[name] = func;\n  };\n\n  CodeMirror.fromTextArea = fromTextArea;\n\n  addLegacyProps(CodeMirror);\n\n  CodeMirror.version = \"5.65.2\";\n\n  return CodeMirror;\n\n})));\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/apl/apl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"apl\", function() {\n  var builtInOps = {\n    \".\": \"innerProduct\",\n    \"\\\\\": \"scan\",\n    \"/\": \"reduce\",\n    \"⌿\": \"reduce1Axis\",\n    \"⍀\": \"scan1Axis\",\n    \"¨\": \"each\",\n    \"⍣\": \"power\"\n  };\n  var builtInFuncs = {\n    \"+\": [\"conjugate\", \"add\"],\n    \"−\": [\"negate\", \"subtract\"],\n    \"×\": [\"signOf\", \"multiply\"],\n    \"÷\": [\"reciprocal\", \"divide\"],\n    \"⌈\": [\"ceiling\", \"greaterOf\"],\n    \"⌊\": [\"floor\", \"lesserOf\"],\n    \"∣\": [\"absolute\", \"residue\"],\n    \"⍳\": [\"indexGenerate\", \"indexOf\"],\n    \"?\": [\"roll\", \"deal\"],\n    \"⋆\": [\"exponentiate\", \"toThePowerOf\"],\n    \"⍟\": [\"naturalLog\", \"logToTheBase\"],\n    \"○\": [\"piTimes\", \"circularFuncs\"],\n    \"!\": [\"factorial\", \"binomial\"],\n    \"⌹\": [\"matrixInverse\", \"matrixDivide\"],\n    \"<\": [null, \"lessThan\"],\n    \"≤\": [null, \"lessThanOrEqual\"],\n    \"=\": [null, \"equals\"],\n    \">\": [null, \"greaterThan\"],\n    \"≥\": [null, \"greaterThanOrEqual\"],\n    \"≠\": [null, \"notEqual\"],\n    \"≡\": [\"depth\", \"match\"],\n    \"≢\": [null, \"notMatch\"],\n    \"∈\": [\"enlist\", \"membership\"],\n    \"⍷\": [null, \"find\"],\n    \"∪\": [\"unique\", \"union\"],\n    \"∩\": [null, \"intersection\"],\n    \"∼\": [\"not\", \"without\"],\n    \"∨\": [null, \"or\"],\n    \"∧\": [null, \"and\"],\n    \"⍱\": [null, \"nor\"],\n    \"⍲\": [null, \"nand\"],\n    \"⍴\": [\"shapeOf\", \"reshape\"],\n    \",\": [\"ravel\", \"catenate\"],\n    \"⍪\": [null, \"firstAxisCatenate\"],\n    \"⌽\": [\"reverse\", \"rotate\"],\n    \"⊖\": [\"axis1Reverse\", \"axis1Rotate\"],\n    \"⍉\": [\"transpose\", null],\n    \"↑\": [\"first\", \"take\"],\n    \"↓\": [null, \"drop\"],\n    \"⊂\": [\"enclose\", \"partitionWithAxis\"],\n    \"⊃\": [\"diclose\", \"pick\"],\n    \"⌷\": [null, \"index\"],\n    \"⍋\": [\"gradeUp\", null],\n    \"⍒\": [\"gradeDown\", null],\n    \"⊤\": [\"encode\", null],\n    \"⊥\": [\"decode\", null],\n    \"⍕\": [\"format\", \"formatByExample\"],\n    \"⍎\": [\"execute\", null],\n    \"⊣\": [\"stop\", \"left\"],\n    \"⊢\": [\"pass\", \"right\"]\n  };\n\n  var isOperator = /[\\.\\/⌿⍀¨⍣]/;\n  var isNiladic = /⍬/;\n  var isFunction = /[\\+−×÷⌈⌊∣⍳\\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/;\n  var isArrow = /←/;\n  var isComment = /[⍝#].*$/;\n\n  var stringEater = function(type) {\n    var prev;\n    prev = false;\n    return function(c) {\n      prev = c;\n      if (c === type) {\n        return prev === \"\\\\\";\n      }\n      return true;\n    };\n  };\n  return {\n    startState: function() {\n      return {\n        prev: false,\n        func: false,\n        op: false,\n        string: false,\n        escape: false\n      };\n    },\n    token: function(stream, state) {\n      var ch, funcName;\n      if (stream.eatSpace()) {\n        return null;\n      }\n      ch = stream.next();\n      if (ch === '\"' || ch === \"'\") {\n        stream.eatWhile(stringEater(ch));\n        stream.next();\n        state.prev = true;\n        return \"string\";\n      }\n      if (/[\\[{\\(]/.test(ch)) {\n        state.prev = false;\n        return null;\n      }\n      if (/[\\]}\\)]/.test(ch)) {\n        state.prev = true;\n        return null;\n      }\n      if (isNiladic.test(ch)) {\n        state.prev = false;\n        return \"niladic\";\n      }\n      if (/[¯\\d]/.test(ch)) {\n        if (state.func) {\n          state.func = false;\n          state.prev = false;\n        } else {\n          state.prev = true;\n        }\n        stream.eatWhile(/[\\w\\.]/);\n        return \"number\";\n      }\n      if (isOperator.test(ch)) {\n        return \"operator apl-\" + builtInOps[ch];\n      }\n      if (isArrow.test(ch)) {\n        return \"apl-arrow\";\n      }\n      if (isFunction.test(ch)) {\n        funcName = \"apl-\";\n        if (builtInFuncs[ch] != null) {\n          if (state.prev) {\n            funcName += builtInFuncs[ch][1];\n          } else {\n            funcName += builtInFuncs[ch][0];\n          }\n        }\n        state.func = true;\n        state.prev = false;\n        return \"function \" + funcName;\n      }\n      if (isComment.test(ch)) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      if (ch === \"∘\" && stream.peek() === \".\") {\n        stream.next();\n        return \"function jot-dot\";\n      }\n      stream.eatWhile(/[\\w\\$_]/);\n      state.prev = true;\n      return \"keyword\";\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/apl\", \"apl\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/asciiarmor/asciiarmor.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function errorIfNotEmpty(stream) {\n    var nonWS = stream.match(/^\\s*\\S/);\n    stream.skipToEnd();\n    return nonWS ? \"error\" : null;\n  }\n\n  CodeMirror.defineMode(\"asciiarmor\", function() {\n    return {\n      token: function(stream, state) {\n        var m;\n        if (state.state == \"top\") {\n          if (stream.sol() && (m = stream.match(/^-----BEGIN (.*)?-----\\s*$/))) {\n            state.state = \"headers\";\n            state.type = m[1];\n            return \"tag\";\n          }\n          return errorIfNotEmpty(stream);\n        } else if (state.state == \"headers\") {\n          if (stream.sol() && stream.match(/^\\w+:/)) {\n            state.state = \"header\";\n            return \"atom\";\n          } else {\n            var result = errorIfNotEmpty(stream);\n            if (result) state.state = \"body\";\n            return result;\n          }\n        } else if (state.state == \"header\") {\n          stream.skipToEnd();\n          state.state = \"headers\";\n          return \"string\";\n        } else if (state.state == \"body\") {\n          if (stream.sol() && (m = stream.match(/^-----END (.*)?-----\\s*$/))) {\n            if (m[1] != state.type) return \"error\";\n            state.state = \"end\";\n            return \"tag\";\n          } else {\n            if (stream.eatWhile(/[A-Za-z0-9+\\/=]/)) {\n              return null;\n            } else {\n              stream.next();\n              return \"error\";\n            }\n          }\n        } else if (state.state == \"end\") {\n          return errorIfNotEmpty(stream);\n        }\n      },\n      blankLine: function(state) {\n        if (state.state == \"headers\") state.state = \"body\";\n      },\n      startState: function() {\n        return {state: \"top\", type: null};\n      }\n    };\n  });\n\n  CodeMirror.defineMIME(\"application/pgp\", \"asciiarmor\");\n  CodeMirror.defineMIME(\"application/pgp-encrypted\", \"asciiarmor\");\n  CodeMirror.defineMIME(\"application/pgp-keys\", \"asciiarmor\");\n  CodeMirror.defineMIME(\"application/pgp-signature\", \"asciiarmor\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/asn.1/asn.1.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"asn.1\", function(config, parserConfig) {\n    var indentUnit = config.indentUnit,\n        keywords = parserConfig.keywords || {},\n        cmipVerbs = parserConfig.cmipVerbs || {},\n        compareTypes = parserConfig.compareTypes || {},\n        status = parserConfig.status || {},\n        tags = parserConfig.tags || {},\n        storage = parserConfig.storage || {},\n        modifier = parserConfig.modifier || {},\n        accessTypes = parserConfig.accessTypes|| {},\n        multiLineStrings = parserConfig.multiLineStrings,\n        indentStatements = parserConfig.indentStatements !== false;\n    var isOperatorChar = /[\\|\\^]/;\n    var curPunc;\n\n    function tokenBase(stream, state) {\n      var ch = stream.next();\n      if (ch == '\"' || ch == \"'\") {\n        state.tokenize = tokenString(ch);\n        return state.tokenize(stream, state);\n      }\n      if (/[\\[\\]\\(\\){}:=,;]/.test(ch)) {\n        curPunc = ch;\n        return \"punctuation\";\n      }\n      if (ch == \"-\"){\n        if (stream.eat(\"-\")) {\n          stream.skipToEnd();\n          return \"comment\";\n        }\n      }\n      if (/\\d/.test(ch)) {\n        stream.eatWhile(/[\\w\\.]/);\n        return \"number\";\n      }\n      if (isOperatorChar.test(ch)) {\n        stream.eatWhile(isOperatorChar);\n        return \"operator\";\n      }\n\n      stream.eatWhile(/[\\w\\-]/);\n      var cur = stream.current();\n      if (keywords.propertyIsEnumerable(cur)) return \"keyword\";\n      if (cmipVerbs.propertyIsEnumerable(cur)) return \"variable cmipVerbs\";\n      if (compareTypes.propertyIsEnumerable(cur)) return \"atom compareTypes\";\n      if (status.propertyIsEnumerable(cur)) return \"comment status\";\n      if (tags.propertyIsEnumerable(cur)) return \"variable-3 tags\";\n      if (storage.propertyIsEnumerable(cur)) return \"builtin storage\";\n      if (modifier.propertyIsEnumerable(cur)) return \"string-2 modifier\";\n      if (accessTypes.propertyIsEnumerable(cur)) return \"atom accessTypes\";\n\n      return \"variable\";\n    }\n\n    function tokenString(quote) {\n      return function(stream, state) {\n        var escaped = false, next, end = false;\n        while ((next = stream.next()) != null) {\n          if (next == quote && !escaped){\n            var afterNext = stream.peek();\n            //look if the character if the quote is like the B in '10100010'B\n            if (afterNext){\n              afterNext = afterNext.toLowerCase();\n              if(afterNext == \"b\" || afterNext == \"h\" || afterNext == \"o\")\n                stream.next();\n            }\n            end = true; break;\n          }\n          escaped = !escaped && next == \"\\\\\";\n        }\n        if (end || !(escaped || multiLineStrings))\n          state.tokenize = null;\n        return \"string\";\n      };\n    }\n\n    function Context(indented, column, type, align, prev) {\n      this.indented = indented;\n      this.column = column;\n      this.type = type;\n      this.align = align;\n      this.prev = prev;\n    }\n    function pushContext(state, col, type) {\n      var indent = state.indented;\n      if (state.context && state.context.type == \"statement\")\n        indent = state.context.indented;\n      return state.context = new Context(indent, col, type, null, state.context);\n    }\n    function popContext(state) {\n      var t = state.context.type;\n      if (t == \")\" || t == \"]\" || t == \"}\")\n        state.indented = state.context.indented;\n      return state.context = state.context.prev;\n    }\n\n    //Interface\n    return {\n      startState: function(basecolumn) {\n        return {\n          tokenize: null,\n          context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n          indented: 0,\n          startOfLine: true\n        };\n      },\n\n      token: function(stream, state) {\n        var ctx = state.context;\n        if (stream.sol()) {\n          if (ctx.align == null) ctx.align = false;\n          state.indented = stream.indentation();\n          state.startOfLine = true;\n        }\n        if (stream.eatSpace()) return null;\n        curPunc = null;\n        var style = (state.tokenize || tokenBase)(stream, state);\n        if (style == \"comment\") return style;\n        if (ctx.align == null) ctx.align = true;\n\n        if ((curPunc == \";\" || curPunc == \":\" || curPunc == \",\")\n            && ctx.type == \"statement\"){\n          popContext(state);\n        }\n        else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n        else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n        else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n        else if (curPunc == \"}\") {\n          while (ctx.type == \"statement\") ctx = popContext(state);\n          if (ctx.type == \"}\") ctx = popContext(state);\n          while (ctx.type == \"statement\") ctx = popContext(state);\n        }\n        else if (curPunc == ctx.type) popContext(state);\n        else if (indentStatements && (((ctx.type == \"}\" || ctx.type == \"top\")\n            && curPunc != ';') || (ctx.type == \"statement\"\n            && curPunc == \"newstatement\")))\n          pushContext(state, stream.column(), \"statement\");\n\n        state.startOfLine = false;\n        return style;\n      },\n\n      electricChars: \"{}\",\n      lineComment: \"--\",\n      fold: \"brace\"\n    };\n  });\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  CodeMirror.defineMIME(\"text/x-ttcn-asn\", {\n    name: \"asn.1\",\n    keywords: words(\"DEFINITIONS OBJECTS IF DERIVED INFORMATION ACTION\" +\n    \" REPLY ANY NAMED CHARACTERIZED BEHAVIOUR REGISTERED\" +\n    \" WITH AS IDENTIFIED CONSTRAINED BY PRESENT BEGIN\" +\n    \" IMPORTS FROM UNITS SYNTAX MIN-ACCESS MAX-ACCESS\" +\n    \" MINACCESS MAXACCESS REVISION STATUS DESCRIPTION\" +\n    \" SEQUENCE SET COMPONENTS OF CHOICE DistinguishedName\" +\n    \" ENUMERATED SIZE MODULE END INDEX AUGMENTS EXTENSIBILITY\" +\n    \" IMPLIED EXPORTS\"),\n    cmipVerbs: words(\"ACTIONS ADD GET NOTIFICATIONS REPLACE REMOVE\"),\n    compareTypes: words(\"OPTIONAL DEFAULT MANAGED MODULE-TYPE MODULE_IDENTITY\" +\n    \" MODULE-COMPLIANCE OBJECT-TYPE OBJECT-IDENTITY\" +\n    \" OBJECT-COMPLIANCE MODE CONFIRMED CONDITIONAL\" +\n    \" SUBORDINATE SUPERIOR CLASS TRUE FALSE NULL\" +\n    \" TEXTUAL-CONVENTION\"),\n    status: words(\"current deprecated mandatory obsolete\"),\n    tags: words(\"APPLICATION AUTOMATIC EXPLICIT IMPLICIT PRIVATE TAGS\" +\n    \" UNIVERSAL\"),\n    storage: words(\"BOOLEAN INTEGER OBJECT IDENTIFIER BIT OCTET STRING\" +\n    \" UTCTime InterfaceIndex IANAifType CMIP-Attribute\" +\n    \" REAL PACKAGE PACKAGES IpAddress PhysAddress\" +\n    \" NetworkAddress BITS BMPString TimeStamp TimeTicks\" +\n    \" TruthValue RowStatus DisplayString GeneralString\" +\n    \" GraphicString IA5String NumericString\" +\n    \" PrintableString SnmpAdminString TeletexString\" +\n    \" UTF8String VideotexString VisibleString StringStore\" +\n    \" ISO646String T61String UniversalString Unsigned32\" +\n    \" Integer32 Gauge Gauge32 Counter Counter32 Counter64\"),\n    modifier: words(\"ATTRIBUTE ATTRIBUTES MANDATORY-GROUP MANDATORY-GROUPS\" +\n    \" GROUP GROUPS ELEMENTS EQUALITY ORDERING SUBSTRINGS\" +\n    \" DEFINED\"),\n    accessTypes: words(\"not-accessible accessible-for-notify read-only\" +\n    \" read-create read-write\"),\n    multiLineStrings: true\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/asterisk/asterisk.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\n * =====================================================================================\n *\n *       Filename:  mode/asterisk/asterisk.js\n *\n *    Description:  CodeMirror mode for Asterisk dialplan\n *\n *        Created:  05/17/2012 09:20:25 PM\n *       Revision:  08/05/2019 AstLinux Project: Support block-comments\n *\n *         Author:  Stas Kobzar (stas@modulis.ca),\n *        Company:  Modulis.ca Inc.\n *\n * =====================================================================================\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"asterisk\", function() {\n  var atoms    = [\"exten\", \"same\", \"include\",\"ignorepat\",\"switch\"],\n      dpcmd    = [\"#include\",\"#exec\"],\n      apps     = [\n                  \"addqueuemember\",\"adsiprog\",\"aelsub\",\"agentlogin\",\"agentmonitoroutgoing\",\"agi\",\n                  \"alarmreceiver\",\"amd\",\"answer\",\"authenticate\",\"background\",\"backgrounddetect\",\n                  \"bridge\",\"busy\",\"callcompletioncancel\",\"callcompletionrequest\",\"celgenuserevent\",\n                  \"changemonitor\",\"chanisavail\",\"channelredirect\",\"chanspy\",\"clearhash\",\"confbridge\",\n                  \"congestion\",\"continuewhile\",\"controlplayback\",\"dahdiacceptr2call\",\"dahdibarge\",\n                  \"dahdiras\",\"dahdiscan\",\"dahdisendcallreroutingfacility\",\"dahdisendkeypadfacility\",\n                  \"datetime\",\"dbdel\",\"dbdeltree\",\"deadagi\",\"dial\",\"dictate\",\"directory\",\"disa\",\n                  \"dumpchan\",\"eagi\",\"echo\",\"endwhile\",\"exec\",\"execif\",\"execiftime\",\"exitwhile\",\"extenspy\",\n                  \"externalivr\",\"festival\",\"flash\",\"followme\",\"forkcdr\",\"getcpeid\",\"gosub\",\"gosubif\",\n                  \"goto\",\"gotoif\",\"gotoiftime\",\"hangup\",\"iax2provision\",\"ices\",\"importvar\",\"incomplete\",\n                  \"ivrdemo\",\"jabberjoin\",\"jabberleave\",\"jabbersend\",\"jabbersendgroup\",\"jabberstatus\",\n                  \"jack\",\"log\",\"macro\",\"macroexclusive\",\"macroexit\",\"macroif\",\"mailboxexists\",\"meetme\",\n                  \"meetmeadmin\",\"meetmechanneladmin\",\"meetmecount\",\"milliwatt\",\"minivmaccmess\",\"minivmdelete\",\n                  \"minivmgreet\",\"minivmmwi\",\"minivmnotify\",\"minivmrecord\",\"mixmonitor\",\"monitor\",\"morsecode\",\n                  \"mp3player\",\"mset\",\"musiconhold\",\"nbscat\",\"nocdr\",\"noop\",\"odbc\",\"odbc\",\"odbcfinish\",\n                  \"originate\",\"ospauth\",\"ospfinish\",\"osplookup\",\"ospnext\",\"page\",\"park\",\"parkandannounce\",\n                  \"parkedcall\",\"pausemonitor\",\"pausequeuemember\",\"pickup\",\"pickupchan\",\"playback\",\"playtones\",\n                  \"privacymanager\",\"proceeding\",\"progress\",\"queue\",\"queuelog\",\"raiseexception\",\"read\",\"readexten\",\n                  \"readfile\",\"receivefax\",\"receivefax\",\"receivefax\",\"record\",\"removequeuemember\",\n                  \"resetcdr\",\"retrydial\",\"return\",\"ringing\",\"sayalpha\",\"saycountedadj\",\"saycountednoun\",\n                  \"saycountpl\",\"saydigits\",\"saynumber\",\"sayphonetic\",\"sayunixtime\",\"senddtmf\",\"sendfax\",\n                  \"sendfax\",\"sendfax\",\"sendimage\",\"sendtext\",\"sendurl\",\"set\",\"setamaflags\",\n                  \"setcallerpres\",\"setmusiconhold\",\"sipaddheader\",\"sipdtmfmode\",\"sipremoveheader\",\"skel\",\n                  \"slastation\",\"slatrunk\",\"sms\",\"softhangup\",\"speechactivategrammar\",\"speechbackground\",\n                  \"speechcreate\",\"speechdeactivategrammar\",\"speechdestroy\",\"speechloadgrammar\",\"speechprocessingsound\",\n                  \"speechstart\",\"speechunloadgrammar\",\"stackpop\",\"startmusiconhold\",\"stopmixmonitor\",\"stopmonitor\",\n                  \"stopmusiconhold\",\"stopplaytones\",\"system\",\"testclient\",\"testserver\",\"transfer\",\"tryexec\",\n                  \"trysystem\",\"unpausemonitor\",\"unpausequeuemember\",\"userevent\",\"verbose\",\"vmauthenticate\",\n                  \"vmsayname\",\"voicemail\",\"voicemailmain\",\"wait\",\"waitexten\",\"waitfornoise\",\"waitforring\",\n                  \"waitforsilence\",\"waitmusiconhold\",\"waituntil\",\"while\",\"zapateller\"\n                 ];\n\n  function basicToken(stream,state){\n    var cur = '';\n    var ch = stream.next();\n    // comment\n    if (state.blockComment) {\n      if (ch == \"-\" && stream.match(\"-;\", true)) {\n        state.blockComment = false;\n      } else if (stream.skipTo(\"--;\")) {\n        stream.next();\n        stream.next();\n        stream.next();\n        state.blockComment = false;\n      } else {\n        stream.skipToEnd();\n      }\n      return \"comment\";\n    }\n    if(ch == \";\") {\n      if (stream.match(\"--\", true)) {\n        if (!stream.match(\"-\", false)) {  // Except ;--- is not a block comment\n          state.blockComment = true;\n          return \"comment\";\n        }\n      }\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    // context\n    if(ch == '[') {\n      stream.skipTo(']');\n      stream.eat(']');\n      return \"header\";\n    }\n    // string\n    if(ch == '\"') {\n      stream.skipTo('\"');\n      return \"string\";\n    }\n    if(ch == \"'\") {\n      stream.skipTo(\"'\");\n      return \"string-2\";\n    }\n    // dialplan commands\n    if(ch == '#') {\n      stream.eatWhile(/\\w/);\n      cur = stream.current();\n      if(dpcmd.indexOf(cur) !== -1) {\n        stream.skipToEnd();\n        return \"strong\";\n      }\n    }\n    // application args\n    if(ch == '$'){\n      var ch1 = stream.peek();\n      if(ch1 == '{'){\n        stream.skipTo('}');\n        stream.eat('}');\n        return \"variable-3\";\n      }\n    }\n    // extension\n    stream.eatWhile(/\\w/);\n    cur = stream.current();\n    if(atoms.indexOf(cur) !== -1) {\n      state.extenStart = true;\n      switch(cur) {\n        case 'same': state.extenSame = true; break;\n        case 'include':\n        case 'switch':\n        case 'ignorepat':\n          state.extenInclude = true;break;\n        default:break;\n      }\n      return \"atom\";\n    }\n  }\n\n  return {\n    startState: function() {\n      return {\n        blockComment: false,\n        extenStart: false,\n        extenSame:  false,\n        extenInclude: false,\n        extenExten: false,\n        extenPriority: false,\n        extenApplication: false\n      };\n    },\n    token: function(stream, state) {\n\n      var cur = '';\n      if(stream.eatSpace()) return null;\n      // extension started\n      if(state.extenStart){\n        stream.eatWhile(/[^\\s]/);\n        cur = stream.current();\n        if(/^=>?$/.test(cur)){\n          state.extenExten = true;\n          state.extenStart = false;\n          return \"strong\";\n        } else {\n          state.extenStart = false;\n          stream.skipToEnd();\n          return \"error\";\n        }\n      } else if(state.extenExten) {\n        // set exten and priority\n        state.extenExten = false;\n        state.extenPriority = true;\n        stream.eatWhile(/[^,]/);\n        if(state.extenInclude) {\n          stream.skipToEnd();\n          state.extenPriority = false;\n          state.extenInclude = false;\n        }\n        if(state.extenSame) {\n          state.extenPriority = false;\n          state.extenSame = false;\n          state.extenApplication = true;\n        }\n        return \"tag\";\n      } else if(state.extenPriority) {\n        state.extenPriority = false;\n        state.extenApplication = true;\n        stream.next(); // get comma\n        if(state.extenSame) return null;\n        stream.eatWhile(/[^,]/);\n        return \"number\";\n      } else if(state.extenApplication) {\n        stream.eatWhile(/,/);\n        cur = stream.current();\n        if(cur === ',') return null;\n        stream.eatWhile(/\\w/);\n        cur = stream.current().toLowerCase();\n        state.extenApplication = false;\n        if(apps.indexOf(cur) !== -1){\n          return \"def strong\";\n        }\n      } else{\n        return basicToken(stream,state);\n      }\n\n      return null;\n    },\n\n    blockCommentStart: \";--\",\n    blockCommentEnd: \"--;\",\n    lineComment: \";\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-asterisk\", \"asterisk\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/brainfuck/brainfuck.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Brainfuck mode created by Michael Kaminsky https://github.com/mkaminsky11\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\")\n    mod(require(\"../../lib/codemirror\"))\n  else if (typeof define == \"function\" && define.amd)\n    define([\"../../lib/codemirror\"], mod)\n  else\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n  var reserve = \"><+-.,[]\".split(\"\");\n  /*\n  comments can be either:\n  placed behind lines\n\n        +++    this is a comment\n\n  where reserved characters cannot be used\n  or in a loop\n  [\n    this is ok to use [ ] and stuff\n  ]\n  or preceded by #\n  */\n  CodeMirror.defineMode(\"brainfuck\", function() {\n    return {\n      startState: function() {\n        return {\n          commentLine: false,\n          left: 0,\n          right: 0,\n          commentLoop: false\n        }\n      },\n      token: function(stream, state) {\n        if (stream.eatSpace()) return null\n        if(stream.sol()){\n          state.commentLine = false;\n        }\n        var ch = stream.next().toString();\n        if(reserve.indexOf(ch) !== -1){\n          if(state.commentLine === true){\n            if(stream.eol()){\n              state.commentLine = false;\n            }\n            return \"comment\";\n          }\n          if(ch === \"]\" || ch === \"[\"){\n            if(ch === \"[\"){\n              state.left++;\n            }\n            else{\n              state.right++;\n            }\n            return \"bracket\";\n          }\n          else if(ch === \"+\" || ch === \"-\"){\n            return \"keyword\";\n          }\n          else if(ch === \"<\" || ch === \">\"){\n            return \"atom\";\n          }\n          else if(ch === \".\" || ch === \",\"){\n            return \"def\";\n          }\n        }\n        else{\n          state.commentLine = true;\n          if(stream.eol()){\n            state.commentLine = false;\n          }\n          return \"comment\";\n        }\n        if(stream.eol()){\n          state.commentLine = false;\n        }\n      }\n    };\n  });\nCodeMirror.defineMIME(\"text/x-brainfuck\",\"brainfuck\")\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/clike/clike.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction Context(indented, column, type, info, align, prev) {\n  this.indented = indented;\n  this.column = column;\n  this.type = type;\n  this.info = info;\n  this.align = align;\n  this.prev = prev;\n}\nfunction pushContext(state, col, type, info) {\n  var indent = state.indented;\n  if (state.context && state.context.type == \"statement\" && type != \"statement\")\n    indent = state.context.indented;\n  return state.context = new Context(indent, col, type, info, null, state.context);\n}\nfunction popContext(state) {\n  var t = state.context.type;\n  if (t == \")\" || t == \"]\" || t == \"}\")\n    state.indented = state.context.indented;\n  return state.context = state.context.prev;\n}\n\nfunction typeBefore(stream, state, pos) {\n  if (state.prevToken == \"variable\" || state.prevToken == \"type\") return true;\n  if (/\\S(?:[^- ]>|[*\\]])\\s*$|\\*$/.test(stream.string.slice(0, pos))) return true;\n  if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true;\n}\n\nfunction isTopScope(context) {\n  for (;;) {\n    if (!context || context.type == \"top\") return true;\n    if (context.type == \"}\" && context.prev.info != \"namespace\") return false;\n    context = context.prev;\n  }\n}\n\nCodeMirror.defineMode(\"clike\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit,\n      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,\n      dontAlignCalls = parserConfig.dontAlignCalls,\n      keywords = parserConfig.keywords || {},\n      types = parserConfig.types || {},\n      builtin = parserConfig.builtin || {},\n      blockKeywords = parserConfig.blockKeywords || {},\n      defKeywords = parserConfig.defKeywords || {},\n      atoms = parserConfig.atoms || {},\n      hooks = parserConfig.hooks || {},\n      multiLineStrings = parserConfig.multiLineStrings,\n      indentStatements = parserConfig.indentStatements !== false,\n      indentSwitch = parserConfig.indentSwitch !== false,\n      namespaceSeparator = parserConfig.namespaceSeparator,\n      isPunctuationChar = parserConfig.isPunctuationChar || /[\\[\\]{}\\(\\),;\\:\\.]/,\n      numberStart = parserConfig.numberStart || /[\\d\\.]/,\n      number = parserConfig.number || /^(?:0x[a-f\\d]+|0b[01]+|(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)(u|ll?|l|f)?/i,\n      isOperatorChar = parserConfig.isOperatorChar || /[+\\-*&%=<>!?|\\/]/,\n      isIdentifierChar = parserConfig.isIdentifierChar || /[\\w\\$_\\xa1-\\uffff]/,\n      // An optional function that takes a {string} token and returns true if it\n      // should be treated as a builtin.\n      isReservedIdentifier = parserConfig.isReservedIdentifier || false;\n\n  var curPunc, isDefKeyword;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (hooks[ch]) {\n      var result = hooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (numberStart.test(ch)) {\n      stream.backUp(1)\n      if (stream.match(number)) return \"number\"\n      stream.next()\n    }\n    if (isPunctuationChar.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      while (!stream.match(/^\\/[\\/*]/, false) && stream.eat(isOperatorChar)) {}\n      return \"operator\";\n    }\n    stream.eatWhile(isIdentifierChar);\n    if (namespaceSeparator) while (stream.match(namespaceSeparator))\n      stream.eatWhile(isIdentifierChar);\n\n    var cur = stream.current();\n    if (contains(keywords, cur)) {\n      if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n      if (contains(defKeywords, cur)) isDefKeyword = true;\n      return \"keyword\";\n    }\n    if (contains(types, cur)) return \"type\";\n    if (contains(builtin, cur)\n        || (isReservedIdentifier && isReservedIdentifier(cur))) {\n      if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n      return \"builtin\";\n    }\n    if (contains(atoms, cur)) return \"atom\";\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = null;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function maybeEOL(stream, state) {\n    if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context))\n      state.typeAtEndOfLine = typeBefore(stream, state, stream.pos)\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", null, false),\n        indented: 0,\n        startOfLine: true,\n        prevToken: null\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n      }\n      if (stream.eatSpace()) { maybeEOL(stream, state); return null; }\n      curPunc = isDefKeyword = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if (curPunc == \";\" || curPunc == \":\" || (curPunc == \",\" && stream.match(/^\\s*(?:\\/\\/.*)?$/, false)))\n        while (state.context.type == \"statement\") popContext(state);\n      else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"}\") {\n        while (ctx.type == \"statement\") ctx = popContext(state);\n        if (ctx.type == \"}\") ctx = popContext(state);\n        while (ctx.type == \"statement\") ctx = popContext(state);\n      }\n      else if (curPunc == ctx.type) popContext(state);\n      else if (indentStatements &&\n               (((ctx.type == \"}\" || ctx.type == \"top\") && curPunc != \";\") ||\n                (ctx.type == \"statement\" && curPunc == \"newstatement\"))) {\n        pushContext(state, stream.column(), \"statement\", stream.current());\n      }\n\n      if (style == \"variable\" &&\n          ((state.prevToken == \"def\" ||\n            (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) &&\n             isTopScope(state.context) && stream.match(/^\\s*\\(/, false)))))\n        style = \"def\";\n\n      if (hooks.token) {\n        var result = hooks.token(stream, state, style);\n        if (result !== undefined) style = result;\n      }\n\n      if (style == \"def\" && parserConfig.styleDefs === false) style = \"variable\";\n\n      state.startOfLine = false;\n      state.prevToken = isDefKeyword ? \"def\" : style || curPunc;\n      maybeEOL(stream, state);\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass;\n      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n      var closing = firstChar == ctx.type;\n      if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n      if (parserConfig.dontIndentStatements)\n        while (ctx.type == \"statement\" && parserConfig.dontIndentStatements.test(ctx.info))\n          ctx = ctx.prev\n      if (hooks.indent) {\n        var hook = hooks.indent(state, ctx, textAfter, indentUnit);\n        if (typeof hook == \"number\") return hook\n      }\n      var switchBlock = ctx.prev && ctx.prev.info == \"switch\";\n      if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) {\n        while (ctx.type != \"top\" && ctx.type != \"}\") ctx = ctx.prev\n        return ctx.indented\n      }\n      if (ctx.type == \"statement\")\n        return ctx.indented + (firstChar == \"{\" ? 0 : statementIndentUnit);\n      if (ctx.align && (!dontAlignCalls || ctx.type != \")\"))\n        return ctx.column + (closing ? 0 : 1);\n      if (ctx.type == \")\" && !closing)\n        return ctx.indented + statementIndentUnit;\n\n      return ctx.indented + (closing ? 0 : indentUnit) +\n        (!closing && switchBlock && !/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 0);\n    },\n\n    electricInput: indentSwitch ? /^\\s*(?:case .*?:|default:|\\{\\}?|\\})$/ : /^\\s*[{}]$/,\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    blockCommentContinue: \" * \",\n    lineComment: \"//\",\n    fold: \"brace\"\n  };\n});\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  function contains(words, word) {\n    if (typeof words === \"function\") {\n      return words(word);\n    } else {\n      return words.propertyIsEnumerable(word);\n    }\n  }\n  var cKeywords = \"auto if break case register continue return default do sizeof \" +\n    \"static else struct switch extern typedef union for goto while enum const \" +\n    \"volatile inline restrict asm fortran\";\n\n  // Keywords from https://en.cppreference.com/w/cpp/keyword includes C++20.\n  var cppKeywords = \"alignas alignof and and_eq audit axiom bitand bitor catch \" +\n  \"class compl concept constexpr const_cast decltype delete dynamic_cast \" +\n  \"explicit export final friend import module mutable namespace new noexcept \" +\n  \"not not_eq operator or or_eq override private protected public \" +\n  \"reinterpret_cast requires static_assert static_cast template this \" +\n  \"thread_local throw try typeid typename using virtual xor xor_eq\";\n\n  var objCKeywords = \"bycopy byref in inout oneway out self super atomic nonatomic retain copy \" +\n  \"readwrite readonly strong weak assign typeof nullable nonnull null_resettable _cmd \" +\n  \"@interface @implementation @end @protocol @encode @property @synthesize @dynamic @class \" +\n  \"@public @package @private @protected @required @optional @try @catch @finally @import \" +\n  \"@selector @encode @defs @synchronized @autoreleasepool @compatibility_alias @available\";\n\n  var objCBuiltins = \"FOUNDATION_EXPORT FOUNDATION_EXTERN NS_INLINE NS_FORMAT_FUNCTION \" +\n  \" NS_RETURNS_RETAINEDNS_ERROR_ENUM NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER \" +\n  \"NS_DESIGNATED_INITIALIZER NS_ENUM NS_OPTIONS NS_REQUIRES_NIL_TERMINATION \" +\n  \"NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_SWIFT_NAME NS_REFINED_FOR_SWIFT\"\n\n  // Do not use this. Use the cTypes function below. This is global just to avoid\n  // excessive calls when cTypes is being called multiple times during a parse.\n  var basicCTypes = words(\"int long char short double float unsigned signed \" +\n    \"void bool\");\n\n  // Do not use this. Use the objCTypes function below. This is global just to avoid\n  // excessive calls when objCTypes is being called multiple times during a parse.\n  var basicObjCTypes = words(\"SEL instancetype id Class Protocol BOOL\");\n\n  // Returns true if identifier is a \"C\" type.\n  // C type is defined as those that are reserved by the compiler (basicTypes),\n  // and those that end in _t (Reserved by POSIX for types)\n  // http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html\n  function cTypes(identifier) {\n    return contains(basicCTypes, identifier) || /.+_t$/.test(identifier);\n  }\n\n  // Returns true if identifier is a \"Objective C\" type.\n  function objCTypes(identifier) {\n    return cTypes(identifier) || contains(basicObjCTypes, identifier);\n  }\n\n  var cBlockKeywords = \"case do else for if switch while struct enum union\";\n  var cDefKeywords = \"struct enum union\";\n\n  function cppHook(stream, state) {\n    if (!state.startOfLine) return false\n    for (var ch, next = null; ch = stream.peek();) {\n      if (ch == \"\\\\\" && stream.match(/^.$/)) {\n        next = cppHook\n        break\n      } else if (ch == \"/\" && stream.match(/^\\/[\\/\\*]/, false)) {\n        break\n      }\n      stream.next()\n    }\n    state.tokenize = next\n    return \"meta\"\n  }\n\n  function pointerHook(_stream, state) {\n    if (state.prevToken == \"type\") return \"type\";\n    return false;\n  }\n\n  // For C and C++ (and ObjC): identifiers starting with __\n  // or _ followed by a capital letter are reserved for the compiler.\n  function cIsReservedIdentifier(token) {\n    if (!token || token.length < 2) return false;\n    if (token[0] != '_') return false;\n    return (token[1] == '_') || (token[1] !== token[1].toLowerCase());\n  }\n\n  function cpp14Literal(stream) {\n    stream.eatWhile(/[\\w\\.']/);\n    return \"number\";\n  }\n\n  function cpp11StringHook(stream, state) {\n    stream.backUp(1);\n    // Raw strings.\n    if (stream.match(/^(?:R|u8R|uR|UR|LR)/)) {\n      var match = stream.match(/^\"([^\\s\\\\()]{0,16})\\(/);\n      if (!match) {\n        return false;\n      }\n      state.cpp11RawStringDelim = match[1];\n      state.tokenize = tokenRawString;\n      return tokenRawString(stream, state);\n    }\n    // Unicode strings/chars.\n    if (stream.match(/^(?:u8|u|U|L)/)) {\n      if (stream.match(/^[\"']/, /* eat */ false)) {\n        return \"string\";\n      }\n      return false;\n    }\n    // Ignore this hook.\n    stream.next();\n    return false;\n  }\n\n  function cppLooksLikeConstructor(word) {\n    var lastTwo = /(\\w+)::~?(\\w+)$/.exec(word);\n    return lastTwo && lastTwo[1] == lastTwo[2];\n  }\n\n  // C#-style strings where \"\" escapes a quote.\n  function tokenAtString(stream, state) {\n    var next;\n    while ((next = stream.next()) != null) {\n      if (next == '\"' && !stream.eat('\"')) {\n        state.tokenize = null;\n        break;\n      }\n    }\n    return \"string\";\n  }\n\n  // C++11 raw string literal is <prefix>\"<delim>( anything )<delim>\", where\n  // <delim> can be a string up to 16 characters long.\n  function tokenRawString(stream, state) {\n    // Escape characters that have special regex meanings.\n    var delim = state.cpp11RawStringDelim.replace(/[^\\w\\s]/g, '\\\\$&');\n    var match = stream.match(new RegExp(\".*?\\\\)\" + delim + '\"'));\n    if (match)\n      state.tokenize = null;\n    else\n      stream.skipToEnd();\n    return \"string\";\n  }\n\n  function def(mimes, mode) {\n    if (typeof mimes == \"string\") mimes = [mimes];\n    var words = [];\n    function add(obj) {\n      if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))\n        words.push(prop);\n    }\n    add(mode.keywords);\n    add(mode.types);\n    add(mode.builtin);\n    add(mode.atoms);\n    if (words.length) {\n      mode.helperType = mimes[0];\n      CodeMirror.registerHelper(\"hintWords\", mimes[0], words);\n    }\n\n    for (var i = 0; i < mimes.length; ++i)\n      CodeMirror.defineMIME(mimes[i], mode);\n  }\n\n  def([\"text/x-csrc\", \"text/x-c\", \"text/x-chdr\"], {\n    name: \"clike\",\n    keywords: words(cKeywords),\n    types: cTypes,\n    blockKeywords: words(cBlockKeywords),\n    defKeywords: words(cDefKeywords),\n    typeFirstDefinitions: true,\n    atoms: words(\"NULL true false\"),\n    isReservedIdentifier: cIsReservedIdentifier,\n    hooks: {\n      \"#\": cppHook,\n      \"*\": pointerHook,\n    },\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def([\"text/x-c++src\", \"text/x-c++hdr\"], {\n    name: \"clike\",\n    keywords: words(cKeywords + \" \" + cppKeywords),\n    types: cTypes,\n    blockKeywords: words(cBlockKeywords + \" class try catch\"),\n    defKeywords: words(cDefKeywords + \" class namespace\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false NULL nullptr\"),\n    dontIndentStatements: /^template$/,\n    isIdentifierChar: /[\\w\\$_~\\xa1-\\uffff]/,\n    isReservedIdentifier: cIsReservedIdentifier,\n    hooks: {\n      \"#\": cppHook,\n      \"*\": pointerHook,\n      \"u\": cpp11StringHook,\n      \"U\": cpp11StringHook,\n      \"L\": cpp11StringHook,\n      \"R\": cpp11StringHook,\n      \"0\": cpp14Literal,\n      \"1\": cpp14Literal,\n      \"2\": cpp14Literal,\n      \"3\": cpp14Literal,\n      \"4\": cpp14Literal,\n      \"5\": cpp14Literal,\n      \"6\": cpp14Literal,\n      \"7\": cpp14Literal,\n      \"8\": cpp14Literal,\n      \"9\": cpp14Literal,\n      token: function(stream, state, style) {\n        if (style == \"variable\" && stream.peek() == \"(\" &&\n            (state.prevToken == \";\" || state.prevToken == null ||\n             state.prevToken == \"}\") &&\n            cppLooksLikeConstructor(stream.current()))\n          return \"def\";\n      }\n    },\n    namespaceSeparator: \"::\",\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-java\", {\n    name: \"clike\",\n    keywords: words(\"abstract assert break case catch class const continue default \" +\n                    \"do else enum extends final finally for goto if implements import \" +\n                    \"instanceof interface native new package private protected public \" +\n                    \"return static strictfp super switch synchronized this throw throws transient \" +\n                    \"try volatile while @interface\"),\n    types: words(\"var byte short int long float double boolean char void Boolean Byte Character Double Float \" +\n                 \"Integer Long Number Object Short String StringBuffer StringBuilder Void\"),\n    blockKeywords: words(\"catch class do else finally for if switch try while\"),\n    defKeywords: words(\"class interface enum @interface\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null\"),\n    number: /^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+\\.?\\d*|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,\n    hooks: {\n      \"@\": function(stream) {\n        // Don't match the @interface keyword.\n        if (stream.match('interface', false)) return false;\n\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      },\n      '\"': function(stream, state) {\n        if (!stream.match('\"\"\\n')) return false;\n        state.tokenize = tokenTripleString;\n        return state.tokenize(stream, state);\n      }\n    },\n    modeProps: {fold: [\"brace\", \"import\"]}\n  });\n\n  def(\"text/x-csharp\", {\n    name: \"clike\",\n    keywords: words(\"abstract as async await base break case catch checked class const continue\" +\n                    \" default delegate do else enum event explicit extern finally fixed for\" +\n                    \" foreach goto if implicit in interface internal is lock namespace new\" +\n                    \" operator out override params private protected public readonly ref return sealed\" +\n                    \" sizeof stackalloc static struct switch this throw try typeof unchecked\" +\n                    \" unsafe using virtual void volatile while add alias ascending descending dynamic from get\" +\n                    \" global group into join let orderby partial remove select set value var yield\"),\n    types: words(\"Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func\" +\n                 \" Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32\" +\n                 \" UInt64 bool byte char decimal double short int long object\"  +\n                 \" sbyte float string ushort uint ulong\"),\n    blockKeywords: words(\"catch class do else finally for foreach if struct switch try while\"),\n    defKeywords: words(\"class interface namespace struct var\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null\"),\n    hooks: {\n      \"@\": function(stream, state) {\n        if (stream.eat('\"')) {\n          state.tokenize = tokenAtString;\n          return tokenAtString(stream, state);\n        }\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      }\n    }\n  });\n\n  function tokenTripleString(stream, state) {\n    var escaped = false;\n    while (!stream.eol()) {\n      if (!escaped && stream.match('\"\"\"')) {\n        state.tokenize = null;\n        break;\n      }\n      escaped = stream.next() == \"\\\\\" && !escaped;\n    }\n    return \"string\";\n  }\n\n  function tokenNestedComment(depth) {\n    return function (stream, state) {\n      var ch\n      while (ch = stream.next()) {\n        if (ch == \"*\" && stream.eat(\"/\")) {\n          if (depth == 1) {\n            state.tokenize = null\n            break\n          } else {\n            state.tokenize = tokenNestedComment(depth - 1)\n            return state.tokenize(stream, state)\n          }\n        } else if (ch == \"/\" && stream.eat(\"*\")) {\n          state.tokenize = tokenNestedComment(depth + 1)\n          return state.tokenize(stream, state)\n        }\n      }\n      return \"comment\"\n    }\n  }\n\n  def(\"text/x-scala\", {\n    name: \"clike\",\n    keywords: words(\n      /* scala */\n      \"abstract case catch class def do else extends final finally for forSome if \" +\n      \"implicit import lazy match new null object override package private protected return \" +\n      \"sealed super this throw trait try type val var while with yield _ \" +\n\n      /* package scala */\n      \"assert assume require print println printf readLine readBoolean readByte readShort \" +\n      \"readChar readInt readLong readFloat readDouble\"\n    ),\n    types: words(\n      \"AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either \" +\n      \"Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable \" +\n      \"Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering \" +\n      \"Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder \" +\n      \"StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector \" +\n\n      /* package java.lang */\n      \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n      \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n      \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n      \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void\"\n    ),\n    multiLineStrings: true,\n    blockKeywords: words(\"catch class enum do else finally for forSome if match switch try while\"),\n    defKeywords: words(\"class enum def object package trait type val var\"),\n    atoms: words(\"true false null\"),\n    indentStatements: false,\n    indentSwitch: false,\n    isOperatorChar: /[+\\-*&%=<>!?|\\/#:@]/,\n    hooks: {\n      \"@\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      },\n      '\"': function(stream, state) {\n        if (!stream.match('\"\"')) return false;\n        state.tokenize = tokenTripleString;\n        return state.tokenize(stream, state);\n      },\n      \"'\": function(stream) {\n        stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n        return \"atom\";\n      },\n      \"=\": function(stream, state) {\n        var cx = state.context\n        if (cx.type == \"}\" && cx.align && stream.eat(\">\")) {\n          state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev)\n          return \"operator\"\n        } else {\n          return false\n        }\n      },\n\n      \"/\": function(stream, state) {\n        if (!stream.eat(\"*\")) return false\n        state.tokenize = tokenNestedComment(1)\n        return state.tokenize(stream, state)\n      }\n    },\n    modeProps: {closeBrackets: {pairs: '()[]{}\"\"', triples: '\"'}}\n  });\n\n  function tokenKotlinString(tripleString){\n    return function (stream, state) {\n      var escaped = false, next, end = false;\n      while (!stream.eol()) {\n        if (!tripleString && !escaped && stream.match('\"') ) {end = true; break;}\n        if (tripleString && stream.match('\"\"\"')) {end = true; break;}\n        next = stream.next();\n        if(!escaped && next == \"$\" && stream.match('{'))\n          stream.skipTo(\"}\");\n        escaped = !escaped && next == \"\\\\\" && !tripleString;\n      }\n      if (end || !tripleString)\n        state.tokenize = null;\n      return \"string\";\n    }\n  }\n\n  def(\"text/x-kotlin\", {\n    name: \"clike\",\n    keywords: words(\n      /*keywords*/\n      \"package as typealias class interface this super val operator \" +\n      \"var fun for is in This throw return annotation \" +\n      \"break continue object if else while do try when !in !is as? \" +\n\n      /*soft keywords*/\n      \"file import where by get set abstract enum open inner override private public internal \" +\n      \"protected catch finally out final vararg reified dynamic companion constructor init \" +\n      \"sealed field property receiver param sparam lateinit data inline noinline tailrec \" +\n      \"external annotation crossinline const operator infix suspend actual expect setparam value\"\n    ),\n    types: words(\n      /* package java.lang */\n      \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n      \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n      \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n      \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray \" +\n      \"ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy \" +\n      \"LazyThreadSafetyMode LongArray Nothing ShortArray Unit\"\n    ),\n    intendSwitch: false,\n    indentStatements: false,\n    multiLineStrings: true,\n    number: /^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+(\\.\\d+)?|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,\n    blockKeywords: words(\"catch class do else finally for if where try while enum\"),\n    defKeywords: words(\"class val var object interface fun\"),\n    atoms: words(\"true false null this\"),\n    hooks: {\n      \"@\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      },\n      '*': function(_stream, state) {\n        return state.prevToken == '.' ? 'variable' : 'operator';\n      },\n      '\"': function(stream, state) {\n        state.tokenize = tokenKotlinString(stream.match('\"\"'));\n        return state.tokenize(stream, state);\n      },\n      \"/\": function(stream, state) {\n        if (!stream.eat(\"*\")) return false;\n        state.tokenize = tokenNestedComment(1);\n        return state.tokenize(stream, state)\n      },\n      indent: function(state, ctx, textAfter, indentUnit) {\n        var firstChar = textAfter && textAfter.charAt(0);\n        if ((state.prevToken == \"}\" || state.prevToken == \")\") && textAfter == \"\")\n          return state.indented;\n        if ((state.prevToken == \"operator\" && textAfter != \"}\" && state.context.type != \"}\") ||\n          state.prevToken == \"variable\" && firstChar == \".\" ||\n          (state.prevToken == \"}\" || state.prevToken == \")\") && firstChar == \".\")\n          return indentUnit * 2 + ctx.indented;\n        if (ctx.align && ctx.type == \"}\")\n          return ctx.indented + (state.context.type == (textAfter || \"\").charAt(0) ? 0 : indentUnit);\n      }\n    },\n    modeProps: {closeBrackets: {triples: '\"'}}\n  });\n\n  def([\"x-shader/x-vertex\", \"x-shader/x-fragment\"], {\n    name: \"clike\",\n    keywords: words(\"sampler1D sampler2D sampler3D samplerCube \" +\n                    \"sampler1DShadow sampler2DShadow \" +\n                    \"const attribute uniform varying \" +\n                    \"break continue discard return \" +\n                    \"for while do if else struct \" +\n                    \"in out inout\"),\n    types: words(\"float int bool void \" +\n                 \"vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 \" +\n                 \"mat2 mat3 mat4\"),\n    blockKeywords: words(\"for while do if else struct\"),\n    builtin: words(\"radians degrees sin cos tan asin acos atan \" +\n                    \"pow exp log exp2 sqrt inversesqrt \" +\n                    \"abs sign floor ceil fract mod min max clamp mix step smoothstep \" +\n                    \"length distance dot cross normalize ftransform faceforward \" +\n                    \"reflect refract matrixCompMult \" +\n                    \"lessThan lessThanEqual greaterThan greaterThanEqual \" +\n                    \"equal notEqual any all not \" +\n                    \"texture1D texture1DProj texture1DLod texture1DProjLod \" +\n                    \"texture2D texture2DProj texture2DLod texture2DProjLod \" +\n                    \"texture3D texture3DProj texture3DLod texture3DProjLod \" +\n                    \"textureCube textureCubeLod \" +\n                    \"shadow1D shadow2D shadow1DProj shadow2DProj \" +\n                    \"shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod \" +\n                    \"dFdx dFdy fwidth \" +\n                    \"noise1 noise2 noise3 noise4\"),\n    atoms: words(\"true false \" +\n                \"gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex \" +\n                \"gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 \" +\n                \"gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 \" +\n                \"gl_FogCoord gl_PointCoord \" +\n                \"gl_Position gl_PointSize gl_ClipVertex \" +\n                \"gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor \" +\n                \"gl_TexCoord gl_FogFragCoord \" +\n                \"gl_FragCoord gl_FrontFacing \" +\n                \"gl_FragData gl_FragDepth \" +\n                \"gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix \" +\n                \"gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse \" +\n                \"gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse \" +\n                \"gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose \" +\n                \"gl_ProjectionMatrixInverseTranspose \" +\n                \"gl_ModelViewProjectionMatrixInverseTranspose \" +\n                \"gl_TextureMatrixInverseTranspose \" +\n                \"gl_NormalScale gl_DepthRange gl_ClipPlane \" +\n                \"gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel \" +\n                \"gl_FrontLightModelProduct gl_BackLightModelProduct \" +\n                \"gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ \" +\n                \"gl_FogParameters \" +\n                \"gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords \" +\n                \"gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats \" +\n                \"gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits \" +\n                \"gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits \" +\n                \"gl_MaxDrawBuffers\"),\n    indentSwitch: false,\n    hooks: {\"#\": cppHook},\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-nesc\", {\n    name: \"clike\",\n    keywords: words(cKeywords + \" as atomic async call command component components configuration event generic \" +\n                    \"implementation includes interface module new norace nx_struct nx_union post provides \" +\n                    \"signal task uses abstract extends\"),\n    types: cTypes,\n    blockKeywords: words(cBlockKeywords),\n    atoms: words(\"null true false\"),\n    hooks: {\"#\": cppHook},\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-objectivec\", {\n    name: \"clike\",\n    keywords: words(cKeywords + \" \" + objCKeywords),\n    types: objCTypes,\n    builtin: words(objCBuiltins),\n    blockKeywords: words(cBlockKeywords + \" @synthesize @try @catch @finally @autoreleasepool @synchronized\"),\n    defKeywords: words(cDefKeywords + \" @interface @implementation @protocol @class\"),\n    dontIndentStatements: /^@.*$/,\n    typeFirstDefinitions: true,\n    atoms: words(\"YES NO NULL Nil nil true false nullptr\"),\n    isReservedIdentifier: cIsReservedIdentifier,\n    hooks: {\n      \"#\": cppHook,\n      \"*\": pointerHook,\n    },\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-objectivec++\", {\n    name: \"clike\",\n    keywords: words(cKeywords + \" \" + objCKeywords + \" \" + cppKeywords),\n    types: objCTypes,\n    builtin: words(objCBuiltins),\n    blockKeywords: words(cBlockKeywords + \" @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch\"),\n    defKeywords: words(cDefKeywords + \" @interface @implementation @protocol @class class namespace\"),\n    dontIndentStatements: /^@.*$|^template$/,\n    typeFirstDefinitions: true,\n    atoms: words(\"YES NO NULL Nil nil true false nullptr\"),\n    isReservedIdentifier: cIsReservedIdentifier,\n    hooks: {\n      \"#\": cppHook,\n      \"*\": pointerHook,\n      \"u\": cpp11StringHook,\n      \"U\": cpp11StringHook,\n      \"L\": cpp11StringHook,\n      \"R\": cpp11StringHook,\n      \"0\": cpp14Literal,\n      \"1\": cpp14Literal,\n      \"2\": cpp14Literal,\n      \"3\": cpp14Literal,\n      \"4\": cpp14Literal,\n      \"5\": cpp14Literal,\n      \"6\": cpp14Literal,\n      \"7\": cpp14Literal,\n      \"8\": cpp14Literal,\n      \"9\": cpp14Literal,\n      token: function(stream, state, style) {\n        if (style == \"variable\" && stream.peek() == \"(\" &&\n            (state.prevToken == \";\" || state.prevToken == null ||\n             state.prevToken == \"}\") &&\n            cppLooksLikeConstructor(stream.current()))\n          return \"def\";\n      }\n    },\n    namespaceSeparator: \"::\",\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-squirrel\", {\n    name: \"clike\",\n    keywords: words(\"base break clone continue const default delete enum extends function in class\" +\n                    \" foreach local resume return this throw typeof yield constructor instanceof static\"),\n    types: cTypes,\n    blockKeywords: words(\"case catch class else for foreach if switch try while\"),\n    defKeywords: words(\"function local class\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null\"),\n    hooks: {\"#\": cppHook},\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  // Ceylon Strings need to deal with interpolation\n  var stringTokenizer = null;\n  function tokenCeylonString(type) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while (!stream.eol()) {\n        if (!escaped && stream.match('\"') &&\n              (type == \"single\" || stream.match('\"\"'))) {\n          end = true;\n          break;\n        }\n        if (!escaped && stream.match('``')) {\n          stringTokenizer = tokenCeylonString(type);\n          end = true;\n          break;\n        }\n        next = stream.next();\n        escaped = type == \"single\" && !escaped && next == \"\\\\\";\n      }\n      if (end)\n          state.tokenize = null;\n      return \"string\";\n    }\n  }\n\n  def(\"text/x-ceylon\", {\n    name: \"clike\",\n    keywords: words(\"abstracts alias assembly assert assign break case catch class continue dynamic else\" +\n                    \" exists extends finally for function given if import in interface is let module new\" +\n                    \" nonempty object of out outer package return satisfies super switch then this throw\" +\n                    \" try value void while\"),\n    types: function(word) {\n        // In Ceylon all identifiers that start with an uppercase are types\n        var first = word.charAt(0);\n        return (first === first.toUpperCase() && first !== first.toLowerCase());\n    },\n    blockKeywords: words(\"case catch class dynamic else finally for function if interface module new object switch try while\"),\n    defKeywords: words(\"class dynamic function interface module object package value\"),\n    builtin: words(\"abstract actual aliased annotation by default deprecated doc final formal late license\" +\n                   \" native optional sealed see serializable shared suppressWarnings tagged throws variable\"),\n    isPunctuationChar: /[\\[\\]{}\\(\\),;\\:\\.`]/,\n    isOperatorChar: /[+\\-*&%=<>!?|^~:\\/]/,\n    numberStart: /[\\d#$]/,\n    number: /^(?:#[\\da-fA-F_]+|\\$[01_]+|[\\d_]+[kMGTPmunpf]?|[\\d_]+\\.[\\d_]+(?:[eE][-+]?\\d+|[kMGTPmunpf]|)|)/i,\n    multiLineStrings: true,\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null larger smaller equal empty finished\"),\n    indentSwitch: false,\n    styleDefs: false,\n    hooks: {\n      \"@\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      },\n      '\"': function(stream, state) {\n          state.tokenize = tokenCeylonString(stream.match('\"\"') ? \"triple\" : \"single\");\n          return state.tokenize(stream, state);\n        },\n      '`': function(stream, state) {\n          if (!stringTokenizer || !stream.match('`')) return false;\n          state.tokenize = stringTokenizer;\n          stringTokenizer = null;\n          return state.tokenize(stream, state);\n        },\n      \"'\": function(stream) {\n        stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n        return \"atom\";\n      },\n      token: function(_stream, state, style) {\n          if ((style == \"variable\" || style == \"type\") &&\n              state.prevToken == \".\") {\n            return \"variable-2\";\n          }\n        }\n    },\n    modeProps: {\n        fold: [\"brace\", \"import\"],\n        closeBrackets: {triples: '\"'}\n    }\n  });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/clojure/clojure.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports === \"object\" && typeof module === \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define === \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"clojure\", function (options) {\n  var atoms = [\"false\", \"nil\", \"true\"];\n  var specialForms = [\".\", \"catch\", \"def\", \"do\", \"if\", \"monitor-enter\",\n      \"monitor-exit\", \"new\", \"quote\", \"recur\", \"set!\", \"throw\", \"try\", \"var\"];\n  var coreSymbols = [\"*\", \"*'\", \"*1\", \"*2\", \"*3\", \"*agent*\",\n      \"*allow-unresolved-vars*\", \"*assert*\", \"*clojure-version*\",\n      \"*command-line-args*\", \"*compile-files*\", \"*compile-path*\",\n      \"*compiler-options*\", \"*data-readers*\", \"*default-data-reader-fn*\", \"*e\",\n      \"*err*\", \"*file*\", \"*flush-on-newline*\", \"*fn-loader*\", \"*in*\",\n      \"*math-context*\", \"*ns*\", \"*out*\", \"*print-dup*\", \"*print-length*\",\n      \"*print-level*\", \"*print-meta*\", \"*print-namespace-maps*\",\n      \"*print-readably*\", \"*read-eval*\", \"*reader-resolver*\", \"*source-path*\",\n      \"*suppress-read*\", \"*unchecked-math*\", \"*use-context-classloader*\",\n      \"*verbose-defrecords*\", \"*warn-on-reflection*\", \"+\", \"+'\", \"-\", \"-'\",\n      \"->\", \"->>\", \"->ArrayChunk\", \"->Eduction\", \"->Vec\", \"->VecNode\",\n      \"->VecSeq\", \"-cache-protocol-fn\", \"-reset-methods\", \"..\", \"/\", \"<\", \"<=\",\n      \"=\", \"==\", \">\", \">=\", \"EMPTY-NODE\", \"Inst\", \"StackTraceElement->vec\",\n      \"Throwable->map\", \"accessor\", \"aclone\", \"add-classpath\", \"add-watch\",\n      \"agent\", \"agent-error\", \"agent-errors\", \"aget\", \"alength\", \"alias\",\n      \"all-ns\", \"alter\", \"alter-meta!\", \"alter-var-root\", \"amap\", \"ancestors\",\n      \"and\", \"any?\", \"apply\", \"areduce\", \"array-map\", \"as->\", \"aset\",\n      \"aset-boolean\", \"aset-byte\", \"aset-char\", \"aset-double\", \"aset-float\",\n      \"aset-int\", \"aset-long\", \"aset-short\", \"assert\", \"assoc\", \"assoc!\",\n      \"assoc-in\", \"associative?\", \"atom\", \"await\", \"await-for\", \"await1\",\n      \"bases\", \"bean\", \"bigdec\", \"bigint\", \"biginteger\", \"binding\", \"bit-and\",\n      \"bit-and-not\", \"bit-clear\", \"bit-flip\", \"bit-not\", \"bit-or\", \"bit-set\",\n      \"bit-shift-left\", \"bit-shift-right\", \"bit-test\", \"bit-xor\", \"boolean\",\n      \"boolean-array\", \"boolean?\", \"booleans\", \"bound-fn\", \"bound-fn*\",\n      \"bound?\", \"bounded-count\", \"butlast\", \"byte\", \"byte-array\", \"bytes\",\n      \"bytes?\", \"case\", \"cast\", \"cat\", \"char\", \"char-array\",\n      \"char-escape-string\", \"char-name-string\", \"char?\", \"chars\", \"chunk\",\n      \"chunk-append\", \"chunk-buffer\", \"chunk-cons\", \"chunk-first\", \"chunk-next\",\n      \"chunk-rest\", \"chunked-seq?\", \"class\", \"class?\", \"clear-agent-errors\",\n      \"clojure-version\", \"coll?\", \"comment\", \"commute\", \"comp\", \"comparator\",\n      \"compare\", \"compare-and-set!\", \"compile\", \"complement\", \"completing\",\n      \"concat\", \"cond\", \"cond->\", \"cond->>\", \"condp\", \"conj\", \"conj!\", \"cons\",\n      \"constantly\", \"construct-proxy\", \"contains?\", \"count\", \"counted?\",\n      \"create-ns\", \"create-struct\", \"cycle\", \"dec\", \"dec'\", \"decimal?\",\n      \"declare\", \"dedupe\", \"default-data-readers\", \"definline\", \"definterface\",\n      \"defmacro\", \"defmethod\", \"defmulti\", \"defn\", \"defn-\", \"defonce\",\n      \"defprotocol\", \"defrecord\", \"defstruct\", \"deftype\", \"delay\", \"delay?\",\n      \"deliver\", \"denominator\", \"deref\", \"derive\", \"descendants\", \"destructure\",\n      \"disj\", \"disj!\", \"dissoc\", \"dissoc!\", \"distinct\", \"distinct?\", \"doall\",\n      \"dorun\", \"doseq\", \"dosync\", \"dotimes\", \"doto\", \"double\", \"double-array\",\n      \"double?\", \"doubles\", \"drop\", \"drop-last\", \"drop-while\", \"eduction\",\n      \"empty\", \"empty?\", \"ensure\", \"ensure-reduced\", \"enumeration-seq\",\n      \"error-handler\", \"error-mode\", \"eval\", \"even?\", \"every-pred\", \"every?\",\n      \"ex-data\", \"ex-info\", \"extend\", \"extend-protocol\", \"extend-type\",\n      \"extenders\", \"extends?\", \"false?\", \"ffirst\", \"file-seq\", \"filter\",\n      \"filterv\", \"find\", \"find-keyword\", \"find-ns\", \"find-protocol-impl\",\n      \"find-protocol-method\", \"find-var\", \"first\", \"flatten\", \"float\",\n      \"float-array\", \"float?\", \"floats\", \"flush\", \"fn\", \"fn?\", \"fnext\", \"fnil\",\n      \"for\", \"force\", \"format\", \"frequencies\", \"future\", \"future-call\",\n      \"future-cancel\", \"future-cancelled?\", \"future-done?\", \"future?\",\n      \"gen-class\", \"gen-interface\", \"gensym\", \"get\", \"get-in\", \"get-method\",\n      \"get-proxy-class\", \"get-thread-bindings\", \"get-validator\", \"group-by\",\n      \"halt-when\", \"hash\", \"hash-combine\", \"hash-map\", \"hash-ordered-coll\",\n      \"hash-set\", \"hash-unordered-coll\", \"ident?\", \"identical?\", \"identity\",\n      \"if-let\", \"if-not\", \"if-some\", \"ifn?\", \"import\", \"in-ns\", \"inc\", \"inc'\",\n      \"indexed?\", \"init-proxy\", \"inst-ms\", \"inst-ms*\", \"inst?\", \"instance?\",\n      \"int\", \"int-array\", \"int?\", \"integer?\", \"interleave\", \"intern\",\n      \"interpose\", \"into\", \"into-array\", \"ints\", \"io!\", \"isa?\", \"iterate\",\n      \"iterator-seq\", \"juxt\", \"keep\", \"keep-indexed\", \"key\", \"keys\", \"keyword\",\n      \"keyword?\", \"last\", \"lazy-cat\", \"lazy-seq\", \"let\", \"letfn\", \"line-seq\",\n      \"list\", \"list*\", \"list?\", \"load\", \"load-file\", \"load-reader\",\n      \"load-string\", \"loaded-libs\", \"locking\", \"long\", \"long-array\", \"longs\",\n      \"loop\", \"macroexpand\", \"macroexpand-1\", \"make-array\", \"make-hierarchy\",\n      \"map\", \"map-entry?\", \"map-indexed\", \"map?\", \"mapcat\", \"mapv\", \"max\",\n      \"max-key\", \"memfn\", \"memoize\", \"merge\", \"merge-with\", \"meta\",\n      \"method-sig\", \"methods\", \"min\", \"min-key\", \"mix-collection-hash\", \"mod\",\n      \"munge\", \"name\", \"namespace\", \"namespace-munge\", \"nat-int?\", \"neg-int?\",\n      \"neg?\", \"newline\", \"next\", \"nfirst\", \"nil?\", \"nnext\", \"not\", \"not-any?\",\n      \"not-empty\", \"not-every?\", \"not=\", \"ns\", \"ns-aliases\", \"ns-imports\",\n      \"ns-interns\", \"ns-map\", \"ns-name\", \"ns-publics\", \"ns-refers\",\n      \"ns-resolve\", \"ns-unalias\", \"ns-unmap\", \"nth\", \"nthnext\", \"nthrest\",\n      \"num\", \"number?\", \"numerator\", \"object-array\", \"odd?\", \"or\", \"parents\",\n      \"partial\", \"partition\", \"partition-all\", \"partition-by\", \"pcalls\", \"peek\",\n      \"persistent!\", \"pmap\", \"pop\", \"pop!\", \"pop-thread-bindings\", \"pos-int?\",\n      \"pos?\", \"pr\", \"pr-str\", \"prefer-method\", \"prefers\",\n      \"primitives-classnames\", \"print\", \"print-ctor\", \"print-dup\",\n      \"print-method\", \"print-simple\", \"print-str\", \"printf\", \"println\",\n      \"println-str\", \"prn\", \"prn-str\", \"promise\", \"proxy\",\n      \"proxy-call-with-super\", \"proxy-mappings\", \"proxy-name\", \"proxy-super\",\n      \"push-thread-bindings\", \"pvalues\", \"qualified-ident?\",\n      \"qualified-keyword?\", \"qualified-symbol?\", \"quot\", \"rand\", \"rand-int\",\n      \"rand-nth\", \"random-sample\", \"range\", \"ratio?\", \"rational?\",\n      \"rationalize\", \"re-find\", \"re-groups\", \"re-matcher\", \"re-matches\",\n      \"re-pattern\", \"re-seq\", \"read\", \"read-line\", \"read-string\",\n      \"reader-conditional\", \"reader-conditional?\", \"realized?\", \"record?\",\n      \"reduce\", \"reduce-kv\", \"reduced\", \"reduced?\", \"reductions\", \"ref\",\n      \"ref-history-count\", \"ref-max-history\", \"ref-min-history\", \"ref-set\",\n      \"refer\", \"refer-clojure\", \"reify\", \"release-pending-sends\", \"rem\",\n      \"remove\", \"remove-all-methods\", \"remove-method\", \"remove-ns\",\n      \"remove-watch\", \"repeat\", \"repeatedly\", \"replace\", \"replicate\", \"require\",\n      \"reset!\", \"reset-meta!\", \"reset-vals!\", \"resolve\", \"rest\",\n      \"restart-agent\", \"resultset-seq\", \"reverse\", \"reversible?\", \"rseq\",\n      \"rsubseq\", \"run!\", \"satisfies?\", \"second\", \"select-keys\", \"send\",\n      \"send-off\", \"send-via\", \"seq\", \"seq?\", \"seqable?\", \"seque\", \"sequence\",\n      \"sequential?\", \"set\", \"set-agent-send-executor!\",\n      \"set-agent-send-off-executor!\", \"set-error-handler!\", \"set-error-mode!\",\n      \"set-validator!\", \"set?\", \"short\", \"short-array\", \"shorts\", \"shuffle\",\n      \"shutdown-agents\", \"simple-ident?\", \"simple-keyword?\", \"simple-symbol?\",\n      \"slurp\", \"some\", \"some->\", \"some->>\", \"some-fn\", \"some?\", \"sort\",\n      \"sort-by\", \"sorted-map\", \"sorted-map-by\", \"sorted-set\", \"sorted-set-by\",\n      \"sorted?\", \"special-symbol?\", \"spit\", \"split-at\", \"split-with\", \"str\",\n      \"string?\", \"struct\", \"struct-map\", \"subs\", \"subseq\", \"subvec\", \"supers\",\n      \"swap!\", \"swap-vals!\", \"symbol\", \"symbol?\", \"sync\", \"tagged-literal\",\n      \"tagged-literal?\", \"take\", \"take-last\", \"take-nth\", \"take-while\", \"test\",\n      \"the-ns\", \"thread-bound?\", \"time\", \"to-array\", \"to-array-2d\",\n      \"trampoline\", \"transduce\", \"transient\", \"tree-seq\", \"true?\", \"type\",\n      \"unchecked-add\", \"unchecked-add-int\", \"unchecked-byte\", \"unchecked-char\",\n      \"unchecked-dec\", \"unchecked-dec-int\", \"unchecked-divide-int\",\n      \"unchecked-double\", \"unchecked-float\", \"unchecked-inc\",\n      \"unchecked-inc-int\", \"unchecked-int\", \"unchecked-long\",\n      \"unchecked-multiply\", \"unchecked-multiply-int\", \"unchecked-negate\",\n      \"unchecked-negate-int\", \"unchecked-remainder-int\", \"unchecked-short\",\n      \"unchecked-subtract\", \"unchecked-subtract-int\", \"underive\", \"unquote\",\n      \"unquote-splicing\", \"unreduced\", \"unsigned-bit-shift-right\", \"update\",\n      \"update-in\", \"update-proxy\", \"uri?\", \"use\", \"uuid?\", \"val\", \"vals\",\n      \"var-get\", \"var-set\", \"var?\", \"vary-meta\", \"vec\", \"vector\", \"vector-of\",\n      \"vector?\", \"volatile!\", \"volatile?\", \"vreset!\", \"vswap!\", \"when\",\n      \"when-first\", \"when-let\", \"when-not\", \"when-some\", \"while\",\n      \"with-bindings\", \"with-bindings*\", \"with-in-str\", \"with-loading-context\",\n      \"with-local-vars\", \"with-meta\", \"with-open\", \"with-out-str\",\n      \"with-precision\", \"with-redefs\", \"with-redefs-fn\", \"xml-seq\", \"zero?\",\n      \"zipmap\"];\n  var haveBodyParameter = [\n      \"->\", \"->>\", \"as->\", \"binding\", \"bound-fn\", \"case\", \"catch\", \"comment\",\n      \"cond\", \"cond->\", \"cond->>\", \"condp\", \"def\", \"definterface\", \"defmethod\",\n      \"defn\", \"defmacro\", \"defprotocol\", \"defrecord\", \"defstruct\", \"deftype\",\n      \"do\", \"doseq\", \"dotimes\", \"doto\", \"extend\", \"extend-protocol\",\n      \"extend-type\", \"fn\", \"for\", \"future\", \"if\", \"if-let\", \"if-not\", \"if-some\",\n      \"let\", \"letfn\", \"locking\", \"loop\", \"ns\", \"proxy\", \"reify\", \"struct-map\",\n      \"some->\", \"some->>\", \"try\", \"when\", \"when-first\", \"when-let\", \"when-not\",\n      \"when-some\", \"while\", \"with-bindings\", \"with-bindings*\", \"with-in-str\",\n      \"with-loading-context\", \"with-local-vars\", \"with-meta\", \"with-open\",\n      \"with-out-str\", \"with-precision\", \"with-redefs\", \"with-redefs-fn\"];\n\n  CodeMirror.registerHelper(\"hintWords\", \"clojure\",\n    [].concat(atoms, specialForms, coreSymbols));\n\n  var atom = createLookupMap(atoms);\n  var specialForm = createLookupMap(specialForms);\n  var coreSymbol = createLookupMap(coreSymbols);\n  var hasBodyParameter = createLookupMap(haveBodyParameter);\n  var delimiter = /^(?:[\\\\\\[\\]\\s\"(),;@^`{}~]|$)/;\n  var numberLiteral = /^(?:[+\\-]?\\d+(?:(?:N|(?:[eE][+\\-]?\\d+))|(?:\\.?\\d*(?:M|(?:[eE][+\\-]?\\d+))?)|\\/\\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\\\\[\\]\\s\"#'(),;@^`{}~]|$))/;\n  var characterLiteral = /^(?:\\\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\\\\[\\]\\s\"(),;@^`{}~]|$))/;\n\n  // simple-namespace := /^[^\\\\\\/\\[\\]\\d\\s\"#'(),;@^`{}~.][^\\\\\\[\\]\\s\"(),;@^`{}~.\\/]*/\n  // simple-symbol    := /^(?:\\/|[^\\\\\\/\\[\\]\\d\\s\"#'(),;@^`{}~][^\\\\\\[\\]\\s\"(),;@^`{}~]*)/\n  // qualified-symbol := (<simple-namespace>(<.><simple-namespace>)*</>)?<simple-symbol>\n  var qualifiedSymbol = /^(?:(?:[^\\\\\\/\\[\\]\\d\\s\"#'(),;@^`{}~.][^\\\\\\[\\]\\s\"(),;@^`{}~.\\/]*(?:\\.[^\\\\\\/\\[\\]\\d\\s\"#'(),;@^`{}~.][^\\\\\\[\\]\\s\"(),;@^`{}~.\\/]*)*\\/)?(?:\\/|[^\\\\\\/\\[\\]\\d\\s\"#'(),;@^`{}~][^\\\\\\[\\]\\s\"(),;@^`{}~]*)*(?=[\\\\\\[\\]\\s\"(),;@^`{}~]|$))/;\n\n  function base(stream, state) {\n    if (stream.eatSpace() || stream.eat(\",\")) return [\"space\", null];\n    if (stream.match(numberLiteral)) return [null, \"number\"];\n    if (stream.match(characterLiteral)) return [null, \"string-2\"];\n    if (stream.eat(/^\"/)) return (state.tokenize = inString)(stream, state);\n    if (stream.eat(/^[(\\[{]/)) return [\"open\", \"bracket\"];\n    if (stream.eat(/^[)\\]}]/)) return [\"close\", \"bracket\"];\n    if (stream.eat(/^;/)) {stream.skipToEnd(); return [\"space\", \"comment\"];}\n    if (stream.eat(/^[#'@^`~]/)) return [null, \"meta\"];\n\n    var matches = stream.match(qualifiedSymbol);\n    var symbol = matches && matches[0];\n\n    if (!symbol) {\n      // advance stream by at least one character so we don't get stuck.\n      stream.next();\n      stream.eatWhile(function (c) {return !is(c, delimiter);});\n      return [null, \"error\"];\n    }\n\n    if (symbol === \"comment\" && state.lastToken === \"(\")\n      return (state.tokenize = inComment)(stream, state);\n    if (is(symbol, atom) || symbol.charAt(0) === \":\") return [\"symbol\", \"atom\"];\n    if (is(symbol, specialForm) || is(symbol, coreSymbol)) return [\"symbol\", \"keyword\"];\n    if (state.lastToken === \"(\") return [\"symbol\", \"builtin\"]; // other operator\n\n    return [\"symbol\", \"variable\"];\n  }\n\n  function inString(stream, state) {\n    var escaped = false, next;\n\n    while (next = stream.next()) {\n      if (next === \"\\\"\" && !escaped) {state.tokenize = base; break;}\n      escaped = !escaped && next === \"\\\\\";\n    }\n\n    return [null, \"string\"];\n  }\n\n  function inComment(stream, state) {\n    var parenthesisCount = 1;\n    var next;\n\n    while (next = stream.next()) {\n      if (next === \")\") parenthesisCount--;\n      if (next === \"(\") parenthesisCount++;\n      if (parenthesisCount === 0) {\n        stream.backUp(1);\n        state.tokenize = base;\n        break;\n      }\n    }\n\n    return [\"space\", \"comment\"];\n  }\n\n  function createLookupMap(words) {\n    var obj = {};\n\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n\n    return obj;\n  }\n\n  function is(value, test) {\n    if (test instanceof RegExp) return test.test(value);\n    if (test instanceof Object) return test.propertyIsEnumerable(value);\n  }\n\n  return {\n    startState: function () {\n      return {\n        ctx: {prev: null, start: 0, indentTo: 0},\n        lastToken: null,\n        tokenize: base\n      };\n    },\n\n    token: function (stream, state) {\n      if (stream.sol() && (typeof state.ctx.indentTo !== \"number\"))\n        state.ctx.indentTo = state.ctx.start + 1;\n\n      var typeStylePair = state.tokenize(stream, state);\n      var type = typeStylePair[0];\n      var style = typeStylePair[1];\n      var current = stream.current();\n\n      if (type !== \"space\") {\n        if (state.lastToken === \"(\" && state.ctx.indentTo === null) {\n          if (type === \"symbol\" && is(current, hasBodyParameter))\n            state.ctx.indentTo = state.ctx.start + options.indentUnit;\n          else state.ctx.indentTo = \"next\";\n        } else if (state.ctx.indentTo === \"next\") {\n          state.ctx.indentTo = stream.column();\n        }\n\n        state.lastToken = current;\n      }\n\n      if (type === \"open\")\n        state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null};\n      else if (type === \"close\") state.ctx = state.ctx.prev || state.ctx;\n\n      return style;\n    },\n\n    indent: function (state) {\n      var i = state.ctx.indentTo;\n\n      return (typeof i === \"number\") ?\n        i :\n        state.ctx.start + 1;\n    },\n\n    closeBrackets: {pairs: \"()[]{}\\\"\\\"\"},\n    lineComment: \";;\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-clojure\", \"clojure\");\nCodeMirror.defineMIME(\"text/x-clojurescript\", \"clojure\");\nCodeMirror.defineMIME(\"application/edn\", \"clojure\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/cmake/cmake.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\")\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd)\n    define([\"../../lib/codemirror\"], mod);\n  else\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"cmake\", function () {\n  var variable_regex = /({)?[a-zA-Z0-9_]+(})?/;\n\n  function tokenString(stream, state) {\n    var current, prev, found_var = false;\n    while (!stream.eol() && (current = stream.next()) != state.pending) {\n      if (current === '$' && prev != '\\\\' && state.pending == '\"') {\n        found_var = true;\n        break;\n      }\n      prev = current;\n    }\n    if (found_var) {\n      stream.backUp(1);\n    }\n    if (current == state.pending) {\n      state.continueString = false;\n    } else {\n      state.continueString = true;\n    }\n    return \"string\";\n  }\n\n  function tokenize(stream, state) {\n    var ch = stream.next();\n\n    // Have we found a variable?\n    if (ch === '$') {\n      if (stream.match(variable_regex)) {\n        return 'variable-2';\n      }\n      return 'variable';\n    }\n    // Should we still be looking for the end of a string?\n    if (state.continueString) {\n      // If so, go through the loop again\n      stream.backUp(1);\n      return tokenString(stream, state);\n    }\n    // Do we just have a function on our hands?\n    // In 'cmake_minimum_required (VERSION 2.8.8)', 'cmake_minimum_required' is matched\n    if (stream.match(/(\\s+)?\\w+\\(/) || stream.match(/(\\s+)?\\w+\\ \\(/)) {\n      stream.backUp(1);\n      return 'def';\n    }\n    if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    // Have we found a string?\n    if (ch == \"'\" || ch == '\"') {\n      // Store the type (single or double)\n      state.pending = ch;\n      // Perform the looping function to find the end\n      return tokenString(stream, state);\n    }\n    if (ch == '(' || ch == ')') {\n      return 'bracket';\n    }\n    if (ch.match(/[0-9]/)) {\n      return 'number';\n    }\n    stream.eatWhile(/[\\w-]/);\n    return null;\n  }\n  return {\n    startState: function () {\n      var state = {};\n      state.inDefinition = false;\n      state.inInclude = false;\n      state.continueString = false;\n      state.pending = false;\n      return state;\n    },\n    token: function (stream, state) {\n      if (stream.eatSpace()) return null;\n      return tokenize(stream, state);\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-cmake\", \"cmake\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/cobol/cobol.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Author: Gautam Mehta\n * Branched from CodeMirror's Scheme mode\n */\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"cobol\", function () {\n  var BUILTIN = \"builtin\", COMMENT = \"comment\", STRING = \"string\",\n      ATOM = \"atom\", NUMBER = \"number\", KEYWORD = \"keyword\", MODTAG = \"header\",\n      COBOLLINENUM = \"def\", PERIOD = \"link\";\n  function makeKeywords(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  var atoms = makeKeywords(\"TRUE FALSE ZEROES ZEROS ZERO SPACES SPACE LOW-VALUE LOW-VALUES \");\n  var keywords = makeKeywords(\n      \"ACCEPT ACCESS ACQUIRE ADD ADDRESS \" +\n      \"ADVANCING AFTER ALIAS ALL ALPHABET \" +\n      \"ALPHABETIC ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED \" +\n      \"ALSO ALTER ALTERNATE AND ANY \" +\n      \"ARE AREA AREAS ARITHMETIC ASCENDING \" +\n      \"ASSIGN AT ATTRIBUTE AUTHOR AUTO \" +\n      \"AUTO-SKIP AUTOMATIC B-AND B-EXOR B-LESS \" +\n      \"B-NOT B-OR BACKGROUND-COLOR BACKGROUND-COLOUR BEEP \" +\n      \"BEFORE BELL BINARY BIT BITS \" +\n      \"BLANK BLINK BLOCK BOOLEAN BOTTOM \" +\n      \"BY CALL CANCEL CD CF \" +\n      \"CH CHARACTER CHARACTERS CLASS CLOCK-UNITS \" +\n      \"CLOSE COBOL CODE CODE-SET COL \" +\n      \"COLLATING COLUMN COMMA COMMIT COMMITMENT \" +\n      \"COMMON COMMUNICATION COMP COMP-0 COMP-1 \" +\n      \"COMP-2 COMP-3 COMP-4 COMP-5 COMP-6 \" +\n      \"COMP-7 COMP-8 COMP-9 COMPUTATIONAL COMPUTATIONAL-0 \" +\n      \"COMPUTATIONAL-1 COMPUTATIONAL-2 COMPUTATIONAL-3 COMPUTATIONAL-4 COMPUTATIONAL-5 \" +\n      \"COMPUTATIONAL-6 COMPUTATIONAL-7 COMPUTATIONAL-8 COMPUTATIONAL-9 COMPUTE \" +\n      \"CONFIGURATION CONNECT CONSOLE CONTAINED CONTAINS \" +\n      \"CONTENT CONTINUE CONTROL CONTROL-AREA CONTROLS \" +\n      \"CONVERTING COPY CORR CORRESPONDING COUNT \" +\n      \"CRT CRT-UNDER CURRENCY CURRENT CURSOR \" +\n      \"DATA DATE DATE-COMPILED DATE-WRITTEN DAY \" +\n      \"DAY-OF-WEEK DB DB-ACCESS-CONTROL-KEY DB-DATA-NAME DB-EXCEPTION \" +\n      \"DB-FORMAT-NAME DB-RECORD-NAME DB-SET-NAME DB-STATUS DBCS \" +\n      \"DBCS-EDITED DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE \" +\n      \"DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING \" +\n      \"DECIMAL-POINT DECLARATIVES DEFAULT DELETE DELIMITED \" +\n      \"DELIMITER DEPENDING DESCENDING DESCRIBED DESTINATION \" +\n      \"DETAIL DISABLE DISCONNECT DISPLAY DISPLAY-1 \" +\n      \"DISPLAY-2 DISPLAY-3 DISPLAY-4 DISPLAY-5 DISPLAY-6 \" +\n      \"DISPLAY-7 DISPLAY-8 DISPLAY-9 DIVIDE DIVISION \" +\n      \"DOWN DROP DUPLICATE DUPLICATES DYNAMIC \" +\n      \"EBCDIC EGI EJECT ELSE EMI \" +\n      \"EMPTY EMPTY-CHECK ENABLE END END. END-ACCEPT END-ACCEPT. \" +\n      \"END-ADD END-CALL END-COMPUTE END-DELETE END-DISPLAY \" +\n      \"END-DIVIDE END-EVALUATE END-IF END-INVOKE END-MULTIPLY \" +\n      \"END-OF-PAGE END-PERFORM END-READ END-RECEIVE END-RETURN \" +\n      \"END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT \" +\n      \"END-UNSTRING END-WRITE END-XML ENTER ENTRY \" +\n      \"ENVIRONMENT EOP EQUAL EQUALS ERASE \" +\n      \"ERROR ESI EVALUATE EVERY EXCEEDS \" +\n      \"EXCEPTION EXCLUSIVE EXIT EXTEND EXTERNAL \" +\n      \"EXTERNALLY-DESCRIBED-KEY FD FETCH FILE FILE-CONTROL \" +\n      \"FILE-STREAM FILES FILLER FINAL FIND \" +\n      \"FINISH FIRST FOOTING FOR FOREGROUND-COLOR \" +\n      \"FOREGROUND-COLOUR FORMAT FREE FROM FULL \" +\n      \"FUNCTION GENERATE GET GIVING GLOBAL \" +\n      \"GO GOBACK GREATER GROUP HEADING \" +\n      \"HIGH-VALUE HIGH-VALUES HIGHLIGHT I-O I-O-CONTROL \" +\n      \"ID IDENTIFICATION IF IN INDEX \" +\n      \"INDEX-1 INDEX-2 INDEX-3 INDEX-4 INDEX-5 \" +\n      \"INDEX-6 INDEX-7 INDEX-8 INDEX-9 INDEXED \" +\n      \"INDIC INDICATE INDICATOR INDICATORS INITIAL \" +\n      \"INITIALIZE INITIATE INPUT INPUT-OUTPUT INSPECT \" +\n      \"INSTALLATION INTO INVALID INVOKE IS \" +\n      \"JUST JUSTIFIED KANJI KEEP KEY \" +\n      \"LABEL LAST LD LEADING LEFT \" +\n      \"LEFT-JUSTIFY LENGTH LENGTH-CHECK LESS LIBRARY \" +\n      \"LIKE LIMIT LIMITS LINAGE LINAGE-COUNTER \" +\n      \"LINE LINE-COUNTER LINES LINKAGE LOCAL-STORAGE \" +\n      \"LOCALE LOCALLY LOCK \" +\n      \"MEMBER MEMORY MERGE MESSAGE METACLASS \" +\n      \"MODE MODIFIED MODIFY MODULES MOVE \" +\n      \"MULTIPLE MULTIPLY NATIONAL NATIVE NEGATIVE \" +\n      \"NEXT NO NO-ECHO NONE NOT \" +\n      \"NULL NULL-KEY-MAP NULL-MAP NULLS NUMBER \" +\n      \"NUMERIC NUMERIC-EDITED OBJECT OBJECT-COMPUTER OCCURS \" +\n      \"OF OFF OMITTED ON ONLY \" +\n      \"OPEN OPTIONAL OR ORDER ORGANIZATION \" +\n      \"OTHER OUTPUT OVERFLOW OWNER PACKED-DECIMAL \" +\n      \"PADDING PAGE PAGE-COUNTER PARSE PERFORM \" +\n      \"PF PH PIC PICTURE PLUS \" +\n      \"POINTER POSITION POSITIVE PREFIX PRESENT \" +\n      \"PRINTING PRIOR PROCEDURE PROCEDURE-POINTER PROCEDURES \" +\n      \"PROCEED PROCESS PROCESSING PROGRAM PROGRAM-ID \" +\n      \"PROMPT PROTECTED PURGE QUEUE QUOTE \" +\n      \"QUOTES RANDOM RD READ READY \" +\n      \"REALM RECEIVE RECONNECT RECORD RECORD-NAME \" +\n      \"RECORDS RECURSIVE REDEFINES REEL REFERENCE \" +\n      \"REFERENCE-MONITOR REFERENCES RELATION RELATIVE RELEASE \" +\n      \"REMAINDER REMOVAL RENAMES REPEATED REPLACE \" +\n      \"REPLACING REPORT REPORTING REPORTS REPOSITORY \" +\n      \"REQUIRED RERUN RESERVE RESET RETAINING \" +\n      \"RETRIEVAL RETURN RETURN-CODE RETURNING REVERSE-VIDEO \" +\n      \"REVERSED REWIND REWRITE RF RH \" +\n      \"RIGHT RIGHT-JUSTIFY ROLLBACK ROLLING ROUNDED \" +\n      \"RUN SAME SCREEN SD SEARCH \" +\n      \"SECTION SECURE SECURITY SEGMENT SEGMENT-LIMIT \" +\n      \"SELECT SEND SENTENCE SEPARATE SEQUENCE \" +\n      \"SEQUENTIAL SET SHARED SIGN SIZE \" +\n      \"SKIP1 SKIP2 SKIP3 SORT SORT-MERGE \" +\n      \"SORT-RETURN SOURCE SOURCE-COMPUTER SPACE-FILL \" +\n      \"SPECIAL-NAMES STANDARD STANDARD-1 STANDARD-2 \" +\n      \"START STARTING STATUS STOP STORE \" +\n      \"STRING SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUB-SCHEMA \" +\n      \"SUBFILE SUBSTITUTE SUBTRACT SUM SUPPRESS \" +\n      \"SYMBOLIC SYNC SYNCHRONIZED SYSIN SYSOUT \" +\n      \"TABLE TALLYING TAPE TENANT TERMINAL \" +\n      \"TERMINATE TEST TEXT THAN THEN \" +\n      \"THROUGH THRU TIME TIMES TITLE \" +\n      \"TO TOP TRAILING TRAILING-SIGN TRANSACTION \" +\n      \"TYPE TYPEDEF UNDERLINE UNEQUAL UNIT \" +\n      \"UNSTRING UNTIL UP UPDATE UPON \" +\n      \"USAGE USAGE-MODE USE USING VALID \" +\n      \"VALIDATE VALUE VALUES VARYING VLR \" +\n      \"WAIT WHEN WHEN-COMPILED WITH WITHIN \" +\n      \"WORDS WORKING-STORAGE WRITE XML XML-CODE \" +\n      \"XML-EVENT XML-NTEXT XML-TEXT ZERO ZERO-FILL \" );\n\n  var builtins = makeKeywords(\"- * ** / + < <= = > >= \");\n  var tests = {\n    digit: /\\d/,\n    digit_or_colon: /[\\d:]/,\n    hex: /[0-9a-f]/i,\n    sign: /[+-]/,\n    exponent: /e/i,\n    keyword_char: /[^\\s\\(\\[\\;\\)\\]]/,\n    symbol: /[\\w*+\\-]/\n  };\n  function isNumber(ch, stream){\n    // hex\n    if ( ch === '0' && stream.eat(/x/i) ) {\n      stream.eatWhile(tests.hex);\n      return true;\n    }\n    // leading sign\n    if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) {\n      stream.eat(tests.sign);\n      ch = stream.next();\n    }\n    if ( tests.digit.test(ch) ) {\n      stream.eat(ch);\n      stream.eatWhile(tests.digit);\n      if ( '.' == stream.peek()) {\n        stream.eat('.');\n        stream.eatWhile(tests.digit);\n      }\n      if ( stream.eat(tests.exponent) ) {\n        stream.eat(tests.sign);\n        stream.eatWhile(tests.digit);\n      }\n      return true;\n    }\n    return false;\n  }\n  return {\n    startState: function () {\n      return {\n        indentStack: null,\n        indentation: 0,\n        mode: false\n      };\n    },\n    token: function (stream, state) {\n      if (state.indentStack == null && stream.sol()) {\n        // update indentation, but only if indentStack is empty\n        state.indentation = 6 ; //stream.indentation();\n      }\n      // skip spaces\n      if (stream.eatSpace()) {\n        return null;\n      }\n      var returnType = null;\n      switch(state.mode){\n      case \"string\": // multi-line string parsing mode\n        var next = false;\n        while ((next = stream.next()) != null) {\n          if ((next == \"\\\"\" || next == \"\\'\") && !stream.match(/['\"]/, false)) {\n            state.mode = false;\n            break;\n          }\n        }\n        returnType = STRING; // continue on in string mode\n        break;\n      default: // default parsing mode\n        var ch = stream.next();\n        var col = stream.column();\n        if (col >= 0 && col <= 5) {\n          returnType = COBOLLINENUM;\n        } else if (col >= 72 && col <= 79) {\n          stream.skipToEnd();\n          returnType = MODTAG;\n        } else if (ch == \"*\" && col == 6) { // comment\n          stream.skipToEnd(); // rest of the line is a comment\n          returnType = COMMENT;\n        } else if (ch == \"\\\"\" || ch == \"\\'\") {\n          state.mode = \"string\";\n          returnType = STRING;\n        } else if (ch == \"'\" && !( tests.digit_or_colon.test(stream.peek()) )) {\n          returnType = ATOM;\n        } else if (ch == \".\") {\n          returnType = PERIOD;\n        } else if (isNumber(ch,stream)){\n          returnType = NUMBER;\n        } else {\n          if (stream.current().match(tests.symbol)) {\n            while (col < 71) {\n              if (stream.eat(tests.symbol) === undefined) {\n                break;\n              } else {\n                col++;\n              }\n            }\n          }\n          if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) {\n            returnType = KEYWORD;\n          } else if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) {\n            returnType = BUILTIN;\n          } else if (atoms && atoms.propertyIsEnumerable(stream.current().toUpperCase())) {\n            returnType = ATOM;\n          } else returnType = null;\n        }\n      }\n      return returnType;\n    },\n    indent: function (state) {\n      if (state.indentStack == null) return state.indentation;\n      return state.indentStack.indent;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-cobol\", \"cobol\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/coffeescript/coffeescript.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Link to the project's GitHub page:\n * https://github.com/pickhardt/coffeescript-codemirror-mode\n */\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"coffeescript\", function(conf, parserConf) {\n  var ERRORCLASS = \"error\";\n\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  var operators = /^(?:->|=>|\\+[+=]?|-[\\-=]?|\\*[\\*=]?|\\/[\\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\\|=?|\\^=?|\\~|!|\\?|(or|and|\\|\\||&&|\\?)=)/;\n  var delimiters = /^(?:[()\\[\\]{},:`=;]|\\.\\.?\\.?)/;\n  var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/;\n  var atProp = /^@[_A-Za-z$][_A-Za-z$0-9]*/;\n\n  var wordOperators = wordRegexp([\"and\", \"or\", \"not\",\n                                  \"is\", \"isnt\", \"in\",\n                                  \"instanceof\", \"typeof\"]);\n  var indentKeywords = [\"for\", \"while\", \"loop\", \"if\", \"unless\", \"else\",\n                        \"switch\", \"try\", \"catch\", \"finally\", \"class\"];\n  var commonKeywords = [\"break\", \"by\", \"continue\", \"debugger\", \"delete\",\n                        \"do\", \"in\", \"of\", \"new\", \"return\", \"then\",\n                        \"this\", \"@\", \"throw\", \"when\", \"until\", \"extends\"];\n\n  var keywords = wordRegexp(indentKeywords.concat(commonKeywords));\n\n  indentKeywords = wordRegexp(indentKeywords);\n\n\n  var stringPrefixes = /^('{3}|\\\"{3}|['\\\"])/;\n  var regexPrefixes = /^(\\/{3}|\\/)/;\n  var commonConstants = [\"Infinity\", \"NaN\", \"undefined\", \"null\", \"true\", \"false\", \"on\", \"off\", \"yes\", \"no\"];\n  var constants = wordRegexp(commonConstants);\n\n  // Tokenizers\n  function tokenBase(stream, state) {\n    // Handle scope changes\n    if (stream.sol()) {\n      if (state.scope.align === null) state.scope.align = false;\n      var scopeOffset = state.scope.offset;\n      if (stream.eatSpace()) {\n        var lineOffset = stream.indentation();\n        if (lineOffset > scopeOffset && state.scope.type == \"coffee\") {\n          return \"indent\";\n        } else if (lineOffset < scopeOffset) {\n          return \"dedent\";\n        }\n        return null;\n      } else {\n        if (scopeOffset > 0) {\n          dedent(stream, state);\n        }\n      }\n    }\n    if (stream.eatSpace()) {\n      return null;\n    }\n\n    var ch = stream.peek();\n\n    // Handle docco title comment (single line)\n    if (stream.match(\"####\")) {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n\n    // Handle multi line comments\n    if (stream.match(\"###\")) {\n      state.tokenize = longComment;\n      return state.tokenize(stream, state);\n    }\n\n    // Single line comment\n    if (ch === \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n\n    // Handle number literals\n    if (stream.match(/^-?[0-9\\.]/, false)) {\n      var floatLiteral = false;\n      // Floats\n      if (stream.match(/^-?\\d*\\.\\d+(e[\\+\\-]?\\d+)?/i)) {\n        floatLiteral = true;\n      }\n      if (stream.match(/^-?\\d+\\.\\d*/)) {\n        floatLiteral = true;\n      }\n      if (stream.match(/^-?\\.\\d+/)) {\n        floatLiteral = true;\n      }\n\n      if (floatLiteral) {\n        // prevent from getting extra . on 1..\n        if (stream.peek() == \".\"){\n          stream.backUp(1);\n        }\n        return \"number\";\n      }\n      // Integers\n      var intLiteral = false;\n      // Hex\n      if (stream.match(/^-?0x[0-9a-f]+/i)) {\n        intLiteral = true;\n      }\n      // Decimal\n      if (stream.match(/^-?[1-9]\\d*(e[\\+\\-]?\\d+)?/)) {\n        intLiteral = true;\n      }\n      // Zero by itself with no other piece of number.\n      if (stream.match(/^-?0(?![\\dx])/i)) {\n        intLiteral = true;\n      }\n      if (intLiteral) {\n        return \"number\";\n      }\n    }\n\n    // Handle strings\n    if (stream.match(stringPrefixes)) {\n      state.tokenize = tokenFactory(stream.current(), false, \"string\");\n      return state.tokenize(stream, state);\n    }\n    // Handle regex literals\n    if (stream.match(regexPrefixes)) {\n      if (stream.current() != \"/\" || stream.match(/^.*\\//, false)) { // prevent highlight of division\n        state.tokenize = tokenFactory(stream.current(), true, \"string-2\");\n        return state.tokenize(stream, state);\n      } else {\n        stream.backUp(1);\n      }\n    }\n\n\n\n    // Handle operators and delimiters\n    if (stream.match(operators) || stream.match(wordOperators)) {\n      return \"operator\";\n    }\n    if (stream.match(delimiters)) {\n      return \"punctuation\";\n    }\n\n    if (stream.match(constants)) {\n      return \"atom\";\n    }\n\n    if (stream.match(atProp) || state.prop && stream.match(identifiers)) {\n      return \"property\";\n    }\n\n    if (stream.match(keywords)) {\n      return \"keyword\";\n    }\n\n    if (stream.match(identifiers)) {\n      return \"variable\";\n    }\n\n    // Handle non-detected items\n    stream.next();\n    return ERRORCLASS;\n  }\n\n  function tokenFactory(delimiter, singleline, outclass) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        stream.eatWhile(/[^'\"\\/\\\\]/);\n        if (stream.eat(\"\\\\\")) {\n          stream.next();\n          if (singleline && stream.eol()) {\n            return outclass;\n          }\n        } else if (stream.match(delimiter)) {\n          state.tokenize = tokenBase;\n          return outclass;\n        } else {\n          stream.eat(/['\"\\/]/);\n        }\n      }\n      if (singleline) {\n        if (parserConf.singleLineStringErrors) {\n          outclass = ERRORCLASS;\n        } else {\n          state.tokenize = tokenBase;\n        }\n      }\n      return outclass;\n    };\n  }\n\n  function longComment(stream, state) {\n    while (!stream.eol()) {\n      stream.eatWhile(/[^#]/);\n      if (stream.match(\"###\")) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      stream.eatWhile(\"#\");\n    }\n    return \"comment\";\n  }\n\n  function indent(stream, state, type) {\n    type = type || \"coffee\";\n    var offset = 0, align = false, alignOffset = null;\n    for (var scope = state.scope; scope; scope = scope.prev) {\n      if (scope.type === \"coffee\" || scope.type == \"}\") {\n        offset = scope.offset + conf.indentUnit;\n        break;\n      }\n    }\n    if (type !== \"coffee\") {\n      align = null;\n      alignOffset = stream.column() + stream.current().length;\n    } else if (state.scope.align) {\n      state.scope.align = false;\n    }\n    state.scope = {\n      offset: offset,\n      type: type,\n      prev: state.scope,\n      align: align,\n      alignOffset: alignOffset\n    };\n  }\n\n  function dedent(stream, state) {\n    if (!state.scope.prev) return;\n    if (state.scope.type === \"coffee\") {\n      var _indent = stream.indentation();\n      var matched = false;\n      for (var scope = state.scope; scope; scope = scope.prev) {\n        if (_indent === scope.offset) {\n          matched = true;\n          break;\n        }\n      }\n      if (!matched) {\n        return true;\n      }\n      while (state.scope.prev && state.scope.offset !== _indent) {\n        state.scope = state.scope.prev;\n      }\n      return false;\n    } else {\n      state.scope = state.scope.prev;\n      return false;\n    }\n  }\n\n  function tokenLexer(stream, state) {\n    var style = state.tokenize(stream, state);\n    var current = stream.current();\n\n    // Handle scope changes.\n    if (current === \"return\") {\n      state.dedent = true;\n    }\n    if (((current === \"->\" || current === \"=>\") && stream.eol())\n        || style === \"indent\") {\n      indent(stream, state);\n    }\n    var delimiter_index = \"[({\".indexOf(current);\n    if (delimiter_index !== -1) {\n      indent(stream, state, \"])}\".slice(delimiter_index, delimiter_index+1));\n    }\n    if (indentKeywords.exec(current)){\n      indent(stream, state);\n    }\n    if (current == \"then\"){\n      dedent(stream, state);\n    }\n\n\n    if (style === \"dedent\") {\n      if (dedent(stream, state)) {\n        return ERRORCLASS;\n      }\n    }\n    delimiter_index = \"])}\".indexOf(current);\n    if (delimiter_index !== -1) {\n      while (state.scope.type == \"coffee\" && state.scope.prev)\n        state.scope = state.scope.prev;\n      if (state.scope.type == current)\n        state.scope = state.scope.prev;\n    }\n    if (state.dedent && stream.eol()) {\n      if (state.scope.type == \"coffee\" && state.scope.prev)\n        state.scope = state.scope.prev;\n      state.dedent = false;\n    }\n\n    return style;\n  }\n\n  var external = {\n    startState: function(basecolumn) {\n      return {\n        tokenize: tokenBase,\n        scope: {offset:basecolumn || 0, type:\"coffee\", prev: null, align: false},\n        prop: false,\n        dedent: 0\n      };\n    },\n\n    token: function(stream, state) {\n      var fillAlign = state.scope.align === null && state.scope;\n      if (fillAlign && stream.sol()) fillAlign.align = false;\n\n      var style = tokenLexer(stream, state);\n      if (style && style != \"comment\") {\n        if (fillAlign) fillAlign.align = true;\n        state.prop = style == \"punctuation\" && stream.current() == \".\"\n      }\n\n      return style;\n    },\n\n    indent: function(state, text) {\n      if (state.tokenize != tokenBase) return 0;\n      var scope = state.scope;\n      var closer = text && \"])}\".indexOf(text.charAt(0)) > -1;\n      if (closer) while (scope.type == \"coffee\" && scope.prev) scope = scope.prev;\n      var closes = closer && scope.type === text.charAt(0);\n      if (scope.align)\n        return scope.alignOffset - (closes ? 1 : 0);\n      else\n        return (closes ? scope.prev : scope).offset;\n    },\n\n    lineComment: \"#\",\n    fold: \"indent\"\n  };\n  return external;\n});\n\n// IANA registered media type\n// https://www.iana.org/assignments/media-types/\nCodeMirror.defineMIME(\"application/vnd.coffeescript\", \"coffeescript\");\n\nCodeMirror.defineMIME(\"text/x-coffeescript\", \"coffeescript\");\nCodeMirror.defineMIME(\"text/coffeescript\", \"coffeescript\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/commonlisp/commonlisp.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"commonlisp\", function (config) {\n  var specialForm = /^(block|let*|return-from|catch|load-time-value|setq|eval-when|locally|symbol-macrolet|flet|macrolet|tagbody|function|multiple-value-call|the|go|multiple-value-prog1|throw|if|progn|unwind-protect|labels|progv|let|quote)$/;\n  var assumeBody = /^with|^def|^do|^prog|case$|^cond$|bind$|when$|unless$/;\n  var numLiteral = /^(?:[+\\-]?(?:\\d+|\\d*\\.\\d+)(?:[efd][+\\-]?\\d+)?|[+\\-]?\\d+(?:\\/[+\\-]?\\d+)?|#b[+\\-]?[01]+|#o[+\\-]?[0-7]+|#x[+\\-]?[\\da-f]+)/;\n  var symbol = /[^\\s'`,@()\\[\\]\";]/;\n  var type;\n\n  function readSym(stream) {\n    var ch;\n    while (ch = stream.next()) {\n      if (ch == \"\\\\\") stream.next();\n      else if (!symbol.test(ch)) { stream.backUp(1); break; }\n    }\n    return stream.current();\n  }\n\n  function base(stream, state) {\n    if (stream.eatSpace()) {type = \"ws\"; return null;}\n    if (stream.match(numLiteral)) return \"number\";\n    var ch = stream.next();\n    if (ch == \"\\\\\") ch = stream.next();\n\n    if (ch == '\"') return (state.tokenize = inString)(stream, state);\n    else if (ch == \"(\") { type = \"open\"; return \"bracket\"; }\n    else if (ch == \")\" || ch == \"]\") { type = \"close\"; return \"bracket\"; }\n    else if (ch == \";\") { stream.skipToEnd(); type = \"ws\"; return \"comment\"; }\n    else if (/['`,@]/.test(ch)) return null;\n    else if (ch == \"|\") {\n      if (stream.skipTo(\"|\")) { stream.next(); return \"symbol\"; }\n      else { stream.skipToEnd(); return \"error\"; }\n    } else if (ch == \"#\") {\n      var ch = stream.next();\n      if (ch == \"(\") { type = \"open\"; return \"bracket\"; }\n      else if (/[+\\-=\\.']/.test(ch)) return null;\n      else if (/\\d/.test(ch) && stream.match(/^\\d*#/)) return null;\n      else if (ch == \"|\") return (state.tokenize = inComment)(stream, state);\n      else if (ch == \":\") { readSym(stream); return \"meta\"; }\n      else if (ch == \"\\\\\") { stream.next(); readSym(stream); return \"string-2\" }\n      else return \"error\";\n    } else {\n      var name = readSym(stream);\n      if (name == \".\") return null;\n      type = \"symbol\";\n      if (name == \"nil\" || name == \"t\" || name.charAt(0) == \":\") return \"atom\";\n      if (state.lastType == \"open\" && (specialForm.test(name) || assumeBody.test(name))) return \"keyword\";\n      if (name.charAt(0) == \"&\") return \"variable-2\";\n      return \"variable\";\n    }\n  }\n\n  function inString(stream, state) {\n    var escaped = false, next;\n    while (next = stream.next()) {\n      if (next == '\"' && !escaped) { state.tokenize = base; break; }\n      escaped = !escaped && next == \"\\\\\";\n    }\n    return \"string\";\n  }\n\n  function inComment(stream, state) {\n    var next, last;\n    while (next = stream.next()) {\n      if (next == \"#\" && last == \"|\") { state.tokenize = base; break; }\n      last = next;\n    }\n    type = \"ws\";\n    return \"comment\";\n  }\n\n  return {\n    startState: function () {\n      return {ctx: {prev: null, start: 0, indentTo: 0}, lastType: null, tokenize: base};\n    },\n\n    token: function (stream, state) {\n      if (stream.sol() && typeof state.ctx.indentTo != \"number\")\n        state.ctx.indentTo = state.ctx.start + 1;\n\n      type = null;\n      var style = state.tokenize(stream, state);\n      if (type != \"ws\") {\n        if (state.ctx.indentTo == null) {\n          if (type == \"symbol\" && assumeBody.test(stream.current()))\n            state.ctx.indentTo = state.ctx.start + config.indentUnit;\n          else\n            state.ctx.indentTo = \"next\";\n        } else if (state.ctx.indentTo == \"next\") {\n          state.ctx.indentTo = stream.column();\n        }\n        state.lastType = type;\n      }\n      if (type == \"open\") state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null};\n      else if (type == \"close\") state.ctx = state.ctx.prev || state.ctx;\n      return style;\n    },\n\n    indent: function (state, _textAfter) {\n      var i = state.ctx.indentTo;\n      return typeof i == \"number\" ? i : state.ctx.start + 1;\n    },\n\n    closeBrackets: {pairs: \"()[]{}\\\"\\\"\"},\n    lineComment: \";;\",\n    fold: \"brace-paren\",\n    blockCommentStart: \"#|\",\n    blockCommentEnd: \"|#\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-common-lisp\", \"commonlisp\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/crystal/crystal.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"crystal\", function(config) {\n    function wordRegExp(words, end) {\n      return new RegExp((end ? \"\" : \"^\") + \"(?:\" + words.join(\"|\") + \")\" + (end ? \"$\" : \"\\\\b\"));\n    }\n\n    function chain(tokenize, stream, state) {\n      state.tokenize.push(tokenize);\n      return tokenize(stream, state);\n    }\n\n    var operators = /^(?:[-+/%|&^]|\\*\\*?|[<>]{2})/;\n    var conditionalOperators = /^(?:[=!]~|===|<=>|[<>=!]=?|[|&]{2}|~)/;\n    var indexingOperators = /^(?:\\[\\][?=]?)/;\n    var anotherOperators = /^(?:\\.(?:\\.{2})?|->|[?:])/;\n    var idents = /^[a-z_\\u009F-\\uFFFF][a-zA-Z0-9_\\u009F-\\uFFFF]*/;\n    var types = /^[A-Z_\\u009F-\\uFFFF][a-zA-Z0-9_\\u009F-\\uFFFF]*/;\n    var keywords = wordRegExp([\n      \"abstract\", \"alias\", \"as\", \"asm\", \"begin\", \"break\", \"case\", \"class\", \"def\", \"do\",\n      \"else\", \"elsif\", \"end\", \"ensure\", \"enum\", \"extend\", \"for\", \"fun\", \"if\",\n      \"include\", \"instance_sizeof\", \"lib\", \"macro\", \"module\", \"next\", \"of\", \"out\", \"pointerof\",\n      \"private\", \"protected\", \"rescue\", \"return\", \"require\", \"select\", \"sizeof\", \"struct\",\n      \"super\", \"then\", \"type\", \"typeof\", \"uninitialized\", \"union\", \"unless\", \"until\", \"when\", \"while\", \"with\",\n      \"yield\", \"__DIR__\", \"__END_LINE__\", \"__FILE__\", \"__LINE__\"\n    ]);\n    var atomWords = wordRegExp([\"true\", \"false\", \"nil\", \"self\"]);\n    var indentKeywordsArray = [\n      \"def\", \"fun\", \"macro\",\n      \"class\", \"module\", \"struct\", \"lib\", \"enum\", \"union\",\n      \"do\", \"for\"\n    ];\n    var indentKeywords = wordRegExp(indentKeywordsArray);\n    var indentExpressionKeywordsArray = [\"if\", \"unless\", \"case\", \"while\", \"until\", \"begin\", \"then\"];\n    var indentExpressionKeywords = wordRegExp(indentExpressionKeywordsArray);\n    var dedentKeywordsArray = [\"end\", \"else\", \"elsif\", \"rescue\", \"ensure\"];\n    var dedentKeywords = wordRegExp(dedentKeywordsArray);\n    var dedentPunctualsArray = [\"\\\\)\", \"\\\\}\", \"\\\\]\"];\n    var dedentPunctuals = new RegExp(\"^(?:\" + dedentPunctualsArray.join(\"|\") + \")$\");\n    var nextTokenizer = {\n      \"def\": tokenFollowIdent, \"fun\": tokenFollowIdent, \"macro\": tokenMacroDef,\n      \"class\": tokenFollowType, \"module\": tokenFollowType, \"struct\": tokenFollowType,\n      \"lib\": tokenFollowType, \"enum\": tokenFollowType, \"union\": tokenFollowType\n    };\n    var matching = {\"[\": \"]\", \"{\": \"}\", \"(\": \")\", \"<\": \">\"};\n\n    function tokenBase(stream, state) {\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      // Macros\n      if (state.lastToken != \"\\\\\" && stream.match(\"{%\", false)) {\n        return chain(tokenMacro(\"%\", \"%\"), stream, state);\n      }\n\n      if (state.lastToken != \"\\\\\" && stream.match(\"{{\", false)) {\n        return chain(tokenMacro(\"{\", \"}\"), stream, state);\n      }\n\n      // Comments\n      if (stream.peek() == \"#\") {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n\n      // Variables and keywords\n      var matched;\n      if (stream.match(idents)) {\n        stream.eat(/[?!]/);\n\n        matched = stream.current();\n        if (stream.eat(\":\")) {\n          return \"atom\";\n        } else if (state.lastToken == \".\") {\n          return \"property\";\n        } else if (keywords.test(matched)) {\n          if (indentKeywords.test(matched)) {\n            if (!(matched == \"fun\" && state.blocks.indexOf(\"lib\") >= 0) && !(matched == \"def\" && state.lastToken == \"abstract\")) {\n              state.blocks.push(matched);\n              state.currentIndent += 1;\n            }\n          } else if ((state.lastStyle == \"operator\" || !state.lastStyle) && indentExpressionKeywords.test(matched)) {\n            state.blocks.push(matched);\n            state.currentIndent += 1;\n          } else if (matched == \"end\") {\n            state.blocks.pop();\n            state.currentIndent -= 1;\n          }\n\n          if (nextTokenizer.hasOwnProperty(matched)) {\n            state.tokenize.push(nextTokenizer[matched]);\n          }\n\n          return \"keyword\";\n        } else if (atomWords.test(matched)) {\n          return \"atom\";\n        }\n\n        return \"variable\";\n      }\n\n      // Class variables and instance variables\n      // or attributes\n      if (stream.eat(\"@\")) {\n        if (stream.peek() == \"[\") {\n          return chain(tokenNest(\"[\", \"]\", \"meta\"), stream, state);\n        }\n\n        stream.eat(\"@\");\n        stream.match(idents) || stream.match(types);\n        return \"variable-2\";\n      }\n\n      // Constants and types\n      if (stream.match(types)) {\n        return \"tag\";\n      }\n\n      // Symbols or ':' operator\n      if (stream.eat(\":\")) {\n        if (stream.eat(\"\\\"\")) {\n          return chain(tokenQuote(\"\\\"\", \"atom\", false), stream, state);\n        } else if (stream.match(idents) || stream.match(types) ||\n                   stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators)) {\n          return \"atom\";\n        }\n        stream.eat(\":\");\n        return \"operator\";\n      }\n\n      // Strings\n      if (stream.eat(\"\\\"\")) {\n        return chain(tokenQuote(\"\\\"\", \"string\", true), stream, state);\n      }\n\n      // Strings or regexps or macro variables or '%' operator\n      if (stream.peek() == \"%\") {\n        var style = \"string\";\n        var embed = true;\n        var delim;\n\n        if (stream.match(\"%r\")) {\n          // Regexps\n          style = \"string-2\";\n          delim = stream.next();\n        } else if (stream.match(\"%w\")) {\n          embed = false;\n          delim = stream.next();\n        } else if (stream.match(\"%q\")) {\n          embed = false;\n          delim = stream.next();\n        } else {\n          if(delim = stream.match(/^%([^\\w\\s=])/)) {\n            delim = delim[1];\n          } else if (stream.match(/^%[a-zA-Z_\\u009F-\\uFFFF][\\w\\u009F-\\uFFFF]*/)) {\n            // Macro variables\n            return \"meta\";\n          } else if (stream.eat('%')) {\n            // '%' operator\n            return \"operator\";\n          }\n        }\n\n        if (matching.hasOwnProperty(delim)) {\n          delim = matching[delim];\n        }\n        return chain(tokenQuote(delim, style, embed), stream, state);\n      }\n\n      // Here Docs\n      if (matched = stream.match(/^<<-('?)([A-Z]\\w*)\\1/)) {\n        return chain(tokenHereDoc(matched[2], !matched[1]), stream, state)\n      }\n\n      // Characters\n      if (stream.eat(\"'\")) {\n        stream.match(/^(?:[^']|\\\\(?:[befnrtv0'\"]|[0-7]{3}|u(?:[0-9a-fA-F]{4}|\\{[0-9a-fA-F]{1,6}\\})))/);\n        stream.eat(\"'\");\n        return \"atom\";\n      }\n\n      // Numbers\n      if (stream.eat(\"0\")) {\n        if (stream.eat(\"x\")) {\n          stream.match(/^[0-9a-fA-F_]+/);\n        } else if (stream.eat(\"o\")) {\n          stream.match(/^[0-7_]+/);\n        } else if (stream.eat(\"b\")) {\n          stream.match(/^[01_]+/);\n        }\n        return \"number\";\n      }\n\n      if (stream.eat(/^\\d/)) {\n        stream.match(/^[\\d_]*(?:\\.[\\d_]+)?(?:[eE][+-]?\\d+)?/);\n        return \"number\";\n      }\n\n      // Operators\n      if (stream.match(operators)) {\n        stream.eat(\"=\"); // Operators can follow assign symbol.\n        return \"operator\";\n      }\n\n      if (stream.match(conditionalOperators) || stream.match(anotherOperators)) {\n        return \"operator\";\n      }\n\n      // Parens and braces\n      if (matched = stream.match(/[({[]/, false)) {\n        matched = matched[0];\n        return chain(tokenNest(matched, matching[matched], null), stream, state);\n      }\n\n      // Escapes\n      if (stream.eat(\"\\\\\")) {\n        stream.next();\n        return \"meta\";\n      }\n\n      stream.next();\n      return null;\n    }\n\n    function tokenNest(begin, end, style, started) {\n      return function (stream, state) {\n        if (!started && stream.match(begin)) {\n          state.tokenize[state.tokenize.length - 1] = tokenNest(begin, end, style, true);\n          state.currentIndent += 1;\n          return style;\n        }\n\n        var nextStyle = tokenBase(stream, state);\n        if (stream.current() === end) {\n          state.tokenize.pop();\n          state.currentIndent -= 1;\n          nextStyle = style;\n        }\n\n        return nextStyle;\n      };\n    }\n\n    function tokenMacro(begin, end, started) {\n      return function (stream, state) {\n        if (!started && stream.match(\"{\" + begin)) {\n          state.currentIndent += 1;\n          state.tokenize[state.tokenize.length - 1] = tokenMacro(begin, end, true);\n          return \"meta\";\n        }\n\n        if (stream.match(end + \"}\")) {\n          state.currentIndent -= 1;\n          state.tokenize.pop();\n          return \"meta\";\n        }\n\n        return tokenBase(stream, state);\n      };\n    }\n\n    function tokenMacroDef(stream, state) {\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      var matched;\n      if (matched = stream.match(idents)) {\n        if (matched == \"def\") {\n          return \"keyword\";\n        }\n        stream.eat(/[?!]/);\n      }\n\n      state.tokenize.pop();\n      return \"def\";\n    }\n\n    function tokenFollowIdent(stream, state) {\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      if (stream.match(idents)) {\n        stream.eat(/[!?]/);\n      } else {\n        stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators);\n      }\n      state.tokenize.pop();\n      return \"def\";\n    }\n\n    function tokenFollowType(stream, state) {\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      stream.match(types);\n      state.tokenize.pop();\n      return \"def\";\n    }\n\n    function tokenQuote(end, style, embed) {\n      return function (stream, state) {\n        var escaped = false;\n\n        while (stream.peek()) {\n          if (!escaped) {\n            if (stream.match(\"{%\", false)) {\n              state.tokenize.push(tokenMacro(\"%\", \"%\"));\n              return style;\n            }\n\n            if (stream.match(\"{{\", false)) {\n              state.tokenize.push(tokenMacro(\"{\", \"}\"));\n              return style;\n            }\n\n            if (embed && stream.match(\"#{\", false)) {\n              state.tokenize.push(tokenNest(\"#{\", \"}\", \"meta\"));\n              return style;\n            }\n\n            var ch = stream.next();\n\n            if (ch == end) {\n              state.tokenize.pop();\n              return style;\n            }\n\n            escaped = embed && ch == \"\\\\\";\n          } else {\n            stream.next();\n            escaped = false;\n          }\n        }\n\n        return style;\n      };\n    }\n\n    function tokenHereDoc(phrase, embed) {\n      return function (stream, state) {\n        if (stream.sol()) {\n          stream.eatSpace()\n          if (stream.match(phrase)) {\n            state.tokenize.pop();\n            return \"string\";\n          }\n        }\n\n        var escaped = false;\n        while (stream.peek()) {\n          if (!escaped) {\n            if (stream.match(\"{%\", false)) {\n              state.tokenize.push(tokenMacro(\"%\", \"%\"));\n              return \"string\";\n            }\n\n            if (stream.match(\"{{\", false)) {\n              state.tokenize.push(tokenMacro(\"{\", \"}\"));\n              return \"string\";\n            }\n\n            if (embed && stream.match(\"#{\", false)) {\n              state.tokenize.push(tokenNest(\"#{\", \"}\", \"meta\"));\n              return \"string\";\n            }\n\n            escaped = embed && stream.next() == \"\\\\\";\n          } else {\n            stream.next();\n            escaped = false;\n          }\n        }\n\n        return \"string\";\n      }\n    }\n\n    return {\n      startState: function () {\n        return {\n          tokenize: [tokenBase],\n          currentIndent: 0,\n          lastToken: null,\n          lastStyle: null,\n          blocks: []\n        };\n      },\n\n      token: function (stream, state) {\n        var style = state.tokenize[state.tokenize.length - 1](stream, state);\n        var token = stream.current();\n\n        if (style && style != \"comment\") {\n          state.lastToken = token;\n          state.lastStyle = style;\n        }\n\n        return style;\n      },\n\n      indent: function (state, textAfter) {\n        textAfter = textAfter.replace(/^\\s*(?:\\{%)?\\s*|\\s*(?:%\\})?\\s*$/g, \"\");\n\n        if (dedentKeywords.test(textAfter) || dedentPunctuals.test(textAfter)) {\n          return config.indentUnit * (state.currentIndent - 1);\n        }\n\n        return config.indentUnit * state.currentIndent;\n      },\n\n      fold: \"indent\",\n      electricInput: wordRegExp(dedentPunctualsArray.concat(dedentKeywordsArray), true),\n      lineComment: '#'\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-crystal\", \"crystal\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/css/css.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"css\", function(config, parserConfig) {\n  var inline = parserConfig.inline\n  if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode(\"text/css\");\n\n  var indentUnit = config.indentUnit,\n      tokenHooks = parserConfig.tokenHooks,\n      documentTypes = parserConfig.documentTypes || {},\n      mediaTypes = parserConfig.mediaTypes || {},\n      mediaFeatures = parserConfig.mediaFeatures || {},\n      mediaValueKeywords = parserConfig.mediaValueKeywords || {},\n      propertyKeywords = parserConfig.propertyKeywords || {},\n      nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},\n      fontProperties = parserConfig.fontProperties || {},\n      counterDescriptors = parserConfig.counterDescriptors || {},\n      colorKeywords = parserConfig.colorKeywords || {},\n      valueKeywords = parserConfig.valueKeywords || {},\n      allowNested = parserConfig.allowNested,\n      lineComment = parserConfig.lineComment,\n      supportsAtComponent = parserConfig.supportsAtComponent === true,\n      highlightNonStandardPropertyKeywords = config.highlightNonStandardPropertyKeywords !== false;\n\n  var type, override;\n  function ret(style, tp) { type = tp; return style; }\n\n  // Tokenizers\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (tokenHooks[ch]) {\n      var result = tokenHooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n    if (ch == \"@\") {\n      stream.eatWhile(/[\\w\\\\\\-]/);\n      return ret(\"def\", stream.current());\n    } else if (ch == \"=\" || (ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) {\n      return ret(null, \"compare\");\n    } else if (ch == \"\\\"\" || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    } else if (ch == \"#\") {\n      stream.eatWhile(/[\\w\\\\\\-]/);\n      return ret(\"atom\", \"hash\");\n    } else if (ch == \"!\") {\n      stream.match(/^\\s*\\w*/);\n      return ret(\"keyword\", \"important\");\n    } else if (/\\d/.test(ch) || ch == \".\" && stream.eat(/\\d/)) {\n      stream.eatWhile(/[\\w.%]/);\n      return ret(\"number\", \"unit\");\n    } else if (ch === \"-\") {\n      if (/[\\d.]/.test(stream.peek())) {\n        stream.eatWhile(/[\\w.%]/);\n        return ret(\"number\", \"unit\");\n      } else if (stream.match(/^-[\\w\\\\\\-]*/)) {\n        stream.eatWhile(/[\\w\\\\\\-]/);\n        if (stream.match(/^\\s*:/, false))\n          return ret(\"variable-2\", \"variable-definition\");\n        return ret(\"variable-2\", \"variable\");\n      } else if (stream.match(/^\\w+-/)) {\n        return ret(\"meta\", \"meta\");\n      }\n    } else if (/[,+>*\\/]/.test(ch)) {\n      return ret(null, \"select-op\");\n    } else if (ch == \".\" && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {\n      return ret(\"qualifier\", \"qualifier\");\n    } else if (/[:;{}\\[\\]\\(\\)]/.test(ch)) {\n      return ret(null, ch);\n    } else if (stream.match(/^[\\w-.]+(?=\\()/)) {\n      if (/^(url(-prefix)?|domain|regexp)$/i.test(stream.current())) {\n        state.tokenize = tokenParenthesized;\n      }\n      return ret(\"variable callee\", \"variable\");\n    } else if (/[\\w\\\\\\-]/.test(ch)) {\n      stream.eatWhile(/[\\w\\\\\\-]/);\n      return ret(\"property\", \"word\");\n    } else {\n      return ret(null, null);\n    }\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) {\n          if (quote == \")\") stream.backUp(1);\n          break;\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      if (ch == quote || !escaped && quote != \")\") state.tokenize = null;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  function tokenParenthesized(stream, state) {\n    stream.next(); // Must be '('\n    if (!stream.match(/^\\s*[\\\"\\')]/, false))\n      state.tokenize = tokenString(\")\");\n    else\n      state.tokenize = null;\n    return ret(null, \"(\");\n  }\n\n  // Context management\n\n  function Context(type, indent, prev) {\n    this.type = type;\n    this.indent = indent;\n    this.prev = prev;\n  }\n\n  function pushContext(state, stream, type, indent) {\n    state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context);\n    return type;\n  }\n\n  function popContext(state) {\n    if (state.context.prev)\n      state.context = state.context.prev;\n    return state.context.type;\n  }\n\n  function pass(type, stream, state) {\n    return states[state.context.type](type, stream, state);\n  }\n  function popAndPass(type, stream, state, n) {\n    for (var i = n || 1; i > 0; i--)\n      state.context = state.context.prev;\n    return pass(type, stream, state);\n  }\n\n  // Parser\n\n  function wordAsValue(stream) {\n    var word = stream.current().toLowerCase();\n    if (valueKeywords.hasOwnProperty(word))\n      override = \"atom\";\n    else if (colorKeywords.hasOwnProperty(word))\n      override = \"keyword\";\n    else\n      override = \"variable\";\n  }\n\n  var states = {};\n\n  states.top = function(type, stream, state) {\n    if (type == \"{\") {\n      return pushContext(state, stream, \"block\");\n    } else if (type == \"}\" && state.context.prev) {\n      return popContext(state);\n    } else if (supportsAtComponent && /@component/i.test(type)) {\n      return pushContext(state, stream, \"atComponentBlock\");\n    } else if (/^@(-moz-)?document$/i.test(type)) {\n      return pushContext(state, stream, \"documentTypes\");\n    } else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type)) {\n      return pushContext(state, stream, \"atBlock\");\n    } else if (/^@(font-face|counter-style)/i.test(type)) {\n      state.stateArg = type;\n      return \"restricted_atBlock_before\";\n    } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type)) {\n      return \"keyframes\";\n    } else if (type && type.charAt(0) == \"@\") {\n      return pushContext(state, stream, \"at\");\n    } else if (type == \"hash\") {\n      override = \"builtin\";\n    } else if (type == \"word\") {\n      override = \"tag\";\n    } else if (type == \"variable-definition\") {\n      return \"maybeprop\";\n    } else if (type == \"interpolation\") {\n      return pushContext(state, stream, \"interpolation\");\n    } else if (type == \":\") {\n      return \"pseudo\";\n    } else if (allowNested && type == \"(\") {\n      return pushContext(state, stream, \"parens\");\n    }\n    return state.context.type;\n  };\n\n  states.block = function(type, stream, state) {\n    if (type == \"word\") {\n      var word = stream.current().toLowerCase();\n      if (propertyKeywords.hasOwnProperty(word)) {\n        override = \"property\";\n        return \"maybeprop\";\n      } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {\n        override = highlightNonStandardPropertyKeywords ? \"string-2\" : \"property\";\n        return \"maybeprop\";\n      } else if (allowNested) {\n        override = stream.match(/^\\s*:(?:\\s|$)/, false) ? \"property\" : \"tag\";\n        return \"block\";\n      } else {\n        override += \" error\";\n        return \"maybeprop\";\n      }\n    } else if (type == \"meta\") {\n      return \"block\";\n    } else if (!allowNested && (type == \"hash\" || type == \"qualifier\")) {\n      override = \"error\";\n      return \"block\";\n    } else {\n      return states.top(type, stream, state);\n    }\n  };\n\n  states.maybeprop = function(type, stream, state) {\n    if (type == \":\") return pushContext(state, stream, \"prop\");\n    return pass(type, stream, state);\n  };\n\n  states.prop = function(type, stream, state) {\n    if (type == \";\") return popContext(state);\n    if (type == \"{\" && allowNested) return pushContext(state, stream, \"propBlock\");\n    if (type == \"}\" || type == \"{\") return popAndPass(type, stream, state);\n    if (type == \"(\") return pushContext(state, stream, \"parens\");\n\n    if (type == \"hash\" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) {\n      override += \" error\";\n    } else if (type == \"word\") {\n      wordAsValue(stream);\n    } else if (type == \"interpolation\") {\n      return pushContext(state, stream, \"interpolation\");\n    }\n    return \"prop\";\n  };\n\n  states.propBlock = function(type, _stream, state) {\n    if (type == \"}\") return popContext(state);\n    if (type == \"word\") { override = \"property\"; return \"maybeprop\"; }\n    return state.context.type;\n  };\n\n  states.parens = function(type, stream, state) {\n    if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n    if (type == \")\") return popContext(state);\n    if (type == \"(\") return pushContext(state, stream, \"parens\");\n    if (type == \"interpolation\") return pushContext(state, stream, \"interpolation\");\n    if (type == \"word\") wordAsValue(stream);\n    return \"parens\";\n  };\n\n  states.pseudo = function(type, stream, state) {\n    if (type == \"meta\") return \"pseudo\";\n\n    if (type == \"word\") {\n      override = \"variable-3\";\n      return state.context.type;\n    }\n    return pass(type, stream, state);\n  };\n\n  states.documentTypes = function(type, stream, state) {\n    if (type == \"word\" && documentTypes.hasOwnProperty(stream.current())) {\n      override = \"tag\";\n      return state.context.type;\n    } else {\n      return states.atBlock(type, stream, state);\n    }\n  };\n\n  states.atBlock = function(type, stream, state) {\n    if (type == \"(\") return pushContext(state, stream, \"atBlock_parens\");\n    if (type == \"}\" || type == \";\") return popAndPass(type, stream, state);\n    if (type == \"{\") return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\");\n\n    if (type == \"interpolation\") return pushContext(state, stream, \"interpolation\");\n\n    if (type == \"word\") {\n      var word = stream.current().toLowerCase();\n      if (word == \"only\" || word == \"not\" || word == \"and\" || word == \"or\")\n        override = \"keyword\";\n      else if (mediaTypes.hasOwnProperty(word))\n        override = \"attribute\";\n      else if (mediaFeatures.hasOwnProperty(word))\n        override = \"property\";\n      else if (mediaValueKeywords.hasOwnProperty(word))\n        override = \"keyword\";\n      else if (propertyKeywords.hasOwnProperty(word))\n        override = \"property\";\n      else if (nonStandardPropertyKeywords.hasOwnProperty(word))\n        override = highlightNonStandardPropertyKeywords ? \"string-2\" : \"property\";\n      else if (valueKeywords.hasOwnProperty(word))\n        override = \"atom\";\n      else if (colorKeywords.hasOwnProperty(word))\n        override = \"keyword\";\n      else\n        override = \"error\";\n    }\n    return state.context.type;\n  };\n\n  states.atComponentBlock = function(type, stream, state) {\n    if (type == \"}\")\n      return popAndPass(type, stream, state);\n    if (type == \"{\")\n      return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\", false);\n    if (type == \"word\")\n      override = \"error\";\n    return state.context.type;\n  };\n\n  states.atBlock_parens = function(type, stream, state) {\n    if (type == \")\") return popContext(state);\n    if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state, 2);\n    return states.atBlock(type, stream, state);\n  };\n\n  states.restricted_atBlock_before = function(type, stream, state) {\n    if (type == \"{\")\n      return pushContext(state, stream, \"restricted_atBlock\");\n    if (type == \"word\" && state.stateArg == \"@counter-style\") {\n      override = \"variable\";\n      return \"restricted_atBlock_before\";\n    }\n    return pass(type, stream, state);\n  };\n\n  states.restricted_atBlock = function(type, stream, state) {\n    if (type == \"}\") {\n      state.stateArg = null;\n      return popContext(state);\n    }\n    if (type == \"word\") {\n      if ((state.stateArg == \"@font-face\" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) ||\n          (state.stateArg == \"@counter-style\" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase())))\n        override = \"error\";\n      else\n        override = \"property\";\n      return \"maybeprop\";\n    }\n    return \"restricted_atBlock\";\n  };\n\n  states.keyframes = function(type, stream, state) {\n    if (type == \"word\") { override = \"variable\"; return \"keyframes\"; }\n    if (type == \"{\") return pushContext(state, stream, \"top\");\n    return pass(type, stream, state);\n  };\n\n  states.at = function(type, stream, state) {\n    if (type == \";\") return popContext(state);\n    if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n    if (type == \"word\") override = \"tag\";\n    else if (type == \"hash\") override = \"builtin\";\n    return \"at\";\n  };\n\n  states.interpolation = function(type, stream, state) {\n    if (type == \"}\") return popContext(state);\n    if (type == \"{\" || type == \";\") return popAndPass(type, stream, state);\n    if (type == \"word\") override = \"variable\";\n    else if (type != \"variable\" && type != \"(\" && type != \")\") override = \"error\";\n    return \"interpolation\";\n  };\n\n  return {\n    startState: function(base) {\n      return {tokenize: null,\n              state: inline ? \"block\" : \"top\",\n              stateArg: null,\n              context: new Context(inline ? \"block\" : \"top\", base || 0, null)};\n    },\n\n    token: function(stream, state) {\n      if (!state.tokenize && stream.eatSpace()) return null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style && typeof style == \"object\") {\n        type = style[1];\n        style = style[0];\n      }\n      override = style;\n      if (type != \"comment\")\n        state.state = states[state.state](type, stream, state);\n      return override;\n    },\n\n    indent: function(state, textAfter) {\n      var cx = state.context, ch = textAfter && textAfter.charAt(0);\n      var indent = cx.indent;\n      if (cx.type == \"prop\" && (ch == \"}\" || ch == \")\")) cx = cx.prev;\n      if (cx.prev) {\n        if (ch == \"}\" && (cx.type == \"block\" || cx.type == \"top\" ||\n                          cx.type == \"interpolation\" || cx.type == \"restricted_atBlock\")) {\n          // Resume indentation from parent context.\n          cx = cx.prev;\n          indent = cx.indent;\n        } else if (ch == \")\" && (cx.type == \"parens\" || cx.type == \"atBlock_parens\") ||\n            ch == \"{\" && (cx.type == \"at\" || cx.type == \"atBlock\")) {\n          // Dedent relative to current context.\n          indent = Math.max(0, cx.indent - indentUnit);\n        }\n      }\n      return indent;\n    },\n\n    electricChars: \"}\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    blockCommentContinue: \" * \",\n    lineComment: lineComment,\n    fold: \"brace\"\n  };\n});\n\n  function keySet(array) {\n    var keys = {};\n    for (var i = 0; i < array.length; ++i) {\n      keys[array[i].toLowerCase()] = true;\n    }\n    return keys;\n  }\n\n  var documentTypes_ = [\n    \"domain\", \"regexp\", \"url\", \"url-prefix\"\n  ], documentTypes = keySet(documentTypes_);\n\n  var mediaTypes_ = [\n    \"all\", \"aural\", \"braille\", \"handheld\", \"print\", \"projection\", \"screen\",\n    \"tty\", \"tv\", \"embossed\"\n  ], mediaTypes = keySet(mediaTypes_);\n\n  var mediaFeatures_ = [\n    \"width\", \"min-width\", \"max-width\", \"height\", \"min-height\", \"max-height\",\n    \"device-width\", \"min-device-width\", \"max-device-width\", \"device-height\",\n    \"min-device-height\", \"max-device-height\", \"aspect-ratio\",\n    \"min-aspect-ratio\", \"max-aspect-ratio\", \"device-aspect-ratio\",\n    \"min-device-aspect-ratio\", \"max-device-aspect-ratio\", \"color\", \"min-color\",\n    \"max-color\", \"color-index\", \"min-color-index\", \"max-color-index\",\n    \"monochrome\", \"min-monochrome\", \"max-monochrome\", \"resolution\",\n    \"min-resolution\", \"max-resolution\", \"scan\", \"grid\", \"orientation\",\n    \"device-pixel-ratio\", \"min-device-pixel-ratio\", \"max-device-pixel-ratio\",\n    \"pointer\", \"any-pointer\", \"hover\", \"any-hover\", \"prefers-color-scheme\",\n    \"dynamic-range\", \"video-dynamic-range\"\n  ], mediaFeatures = keySet(mediaFeatures_);\n\n  var mediaValueKeywords_ = [\n    \"landscape\", \"portrait\", \"none\", \"coarse\", \"fine\", \"on-demand\", \"hover\",\n    \"interlace\", \"progressive\",\n    \"dark\", \"light\",\n    \"standard\", \"high\"\n  ], mediaValueKeywords = keySet(mediaValueKeywords_);\n\n  var propertyKeywords_ = [\n    \"align-content\", \"align-items\", \"align-self\", \"alignment-adjust\",\n    \"alignment-baseline\", \"all\", \"anchor-point\", \"animation\", \"animation-delay\",\n    \"animation-direction\", \"animation-duration\", \"animation-fill-mode\",\n    \"animation-iteration-count\", \"animation-name\", \"animation-play-state\",\n    \"animation-timing-function\", \"appearance\", \"azimuth\", \"backdrop-filter\",\n    \"backface-visibility\", \"background\", \"background-attachment\",\n    \"background-blend-mode\", \"background-clip\", \"background-color\",\n    \"background-image\", \"background-origin\", \"background-position\",\n    \"background-position-x\", \"background-position-y\", \"background-repeat\",\n    \"background-size\", \"baseline-shift\", \"binding\", \"bleed\", \"block-size\",\n    \"bookmark-label\", \"bookmark-level\", \"bookmark-state\", \"bookmark-target\",\n    \"border\", \"border-bottom\", \"border-bottom-color\", \"border-bottom-left-radius\",\n    \"border-bottom-right-radius\", \"border-bottom-style\", \"border-bottom-width\",\n    \"border-collapse\", \"border-color\", \"border-image\", \"border-image-outset\",\n    \"border-image-repeat\", \"border-image-slice\", \"border-image-source\",\n    \"border-image-width\", \"border-left\", \"border-left-color\", \"border-left-style\",\n    \"border-left-width\", \"border-radius\", \"border-right\", \"border-right-color\",\n    \"border-right-style\", \"border-right-width\", \"border-spacing\", \"border-style\",\n    \"border-top\", \"border-top-color\", \"border-top-left-radius\",\n    \"border-top-right-radius\", \"border-top-style\", \"border-top-width\",\n    \"border-width\", \"bottom\", \"box-decoration-break\", \"box-shadow\", \"box-sizing\",\n    \"break-after\", \"break-before\", \"break-inside\", \"caption-side\", \"caret-color\",\n    \"clear\", \"clip\", \"color\", \"color-profile\", \"column-count\", \"column-fill\",\n    \"column-gap\", \"column-rule\", \"column-rule-color\", \"column-rule-style\",\n    \"column-rule-width\", \"column-span\", \"column-width\", \"columns\", \"contain\",\n    \"content\", \"counter-increment\", \"counter-reset\", \"crop\", \"cue\", \"cue-after\",\n    \"cue-before\", \"cursor\", \"direction\", \"display\", \"dominant-baseline\",\n    \"drop-initial-after-adjust\", \"drop-initial-after-align\",\n    \"drop-initial-before-adjust\", \"drop-initial-before-align\", \"drop-initial-size\",\n    \"drop-initial-value\", \"elevation\", \"empty-cells\", \"fit\", \"fit-content\", \"fit-position\",\n    \"flex\", \"flex-basis\", \"flex-direction\", \"flex-flow\", \"flex-grow\",\n    \"flex-shrink\", \"flex-wrap\", \"float\", \"float-offset\", \"flow-from\", \"flow-into\",\n    \"font\", \"font-family\", \"font-feature-settings\", \"font-kerning\",\n    \"font-language-override\", \"font-optical-sizing\", \"font-size\",\n    \"font-size-adjust\", \"font-stretch\", \"font-style\", \"font-synthesis\",\n    \"font-variant\", \"font-variant-alternates\", \"font-variant-caps\",\n    \"font-variant-east-asian\", \"font-variant-ligatures\", \"font-variant-numeric\",\n    \"font-variant-position\", \"font-variation-settings\", \"font-weight\", \"gap\",\n    \"grid\", \"grid-area\", \"grid-auto-columns\", \"grid-auto-flow\", \"grid-auto-rows\",\n    \"grid-column\", \"grid-column-end\", \"grid-column-gap\", \"grid-column-start\",\n    \"grid-gap\", \"grid-row\", \"grid-row-end\", \"grid-row-gap\", \"grid-row-start\",\n    \"grid-template\", \"grid-template-areas\", \"grid-template-columns\",\n    \"grid-template-rows\", \"hanging-punctuation\", \"height\", \"hyphens\", \"icon\",\n    \"image-orientation\", \"image-rendering\", \"image-resolution\", \"inline-box-align\",\n    \"inset\", \"inset-block\", \"inset-block-end\", \"inset-block-start\", \"inset-inline\",\n    \"inset-inline-end\", \"inset-inline-start\", \"isolation\", \"justify-content\",\n    \"justify-items\", \"justify-self\", \"left\", \"letter-spacing\", \"line-break\",\n    \"line-height\", \"line-height-step\", \"line-stacking\", \"line-stacking-ruby\",\n    \"line-stacking-shift\", \"line-stacking-strategy\", \"list-style\",\n    \"list-style-image\", \"list-style-position\", \"list-style-type\", \"margin\",\n    \"margin-bottom\", \"margin-left\", \"margin-right\", \"margin-top\", \"marks\",\n    \"marquee-direction\", \"marquee-loop\", \"marquee-play-count\", \"marquee-speed\",\n    \"marquee-style\", \"mask-clip\", \"mask-composite\", \"mask-image\", \"mask-mode\",\n    \"mask-origin\", \"mask-position\", \"mask-repeat\", \"mask-size\",\"mask-type\",\n    \"max-block-size\", \"max-height\", \"max-inline-size\",\n    \"max-width\", \"min-block-size\", \"min-height\", \"min-inline-size\", \"min-width\",\n    \"mix-blend-mode\", \"move-to\", \"nav-down\", \"nav-index\", \"nav-left\", \"nav-right\",\n    \"nav-up\", \"object-fit\", \"object-position\", \"offset\", \"offset-anchor\",\n    \"offset-distance\", \"offset-path\", \"offset-position\", \"offset-rotate\",\n    \"opacity\", \"order\", \"orphans\", \"outline\", \"outline-color\", \"outline-offset\",\n    \"outline-style\", \"outline-width\", \"overflow\", \"overflow-style\",\n    \"overflow-wrap\", \"overflow-x\", \"overflow-y\", \"padding\", \"padding-bottom\",\n    \"padding-left\", \"padding-right\", \"padding-top\", \"page\", \"page-break-after\",\n    \"page-break-before\", \"page-break-inside\", \"page-policy\", \"pause\",\n    \"pause-after\", \"pause-before\", \"perspective\", \"perspective-origin\", \"pitch\",\n    \"pitch-range\", \"place-content\", \"place-items\", \"place-self\", \"play-during\",\n    \"position\", \"presentation-level\", \"punctuation-trim\", \"quotes\",\n    \"region-break-after\", \"region-break-before\", \"region-break-inside\",\n    \"region-fragment\", \"rendering-intent\", \"resize\", \"rest\", \"rest-after\",\n    \"rest-before\", \"richness\", \"right\", \"rotate\", \"rotation\", \"rotation-point\",\n    \"row-gap\", \"ruby-align\", \"ruby-overhang\", \"ruby-position\", \"ruby-span\",\n    \"scale\", \"scroll-behavior\", \"scroll-margin\", \"scroll-margin-block\",\n    \"scroll-margin-block-end\", \"scroll-margin-block-start\", \"scroll-margin-bottom\",\n    \"scroll-margin-inline\", \"scroll-margin-inline-end\",\n    \"scroll-margin-inline-start\", \"scroll-margin-left\", \"scroll-margin-right\",\n    \"scroll-margin-top\", \"scroll-padding\", \"scroll-padding-block\",\n    \"scroll-padding-block-end\", \"scroll-padding-block-start\",\n    \"scroll-padding-bottom\", \"scroll-padding-inline\", \"scroll-padding-inline-end\",\n    \"scroll-padding-inline-start\", \"scroll-padding-left\", \"scroll-padding-right\",\n    \"scroll-padding-top\", \"scroll-snap-align\", \"scroll-snap-type\",\n    \"shape-image-threshold\", \"shape-inside\", \"shape-margin\", \"shape-outside\",\n    \"size\", \"speak\", \"speak-as\", \"speak-header\", \"speak-numeral\",\n    \"speak-punctuation\", \"speech-rate\", \"stress\", \"string-set\", \"tab-size\",\n    \"table-layout\", \"target\", \"target-name\", \"target-new\", \"target-position\",\n    \"text-align\", \"text-align-last\", \"text-combine-upright\", \"text-decoration\",\n    \"text-decoration-color\", \"text-decoration-line\", \"text-decoration-skip\",\n    \"text-decoration-skip-ink\", \"text-decoration-style\", \"text-emphasis\",\n    \"text-emphasis-color\", \"text-emphasis-position\", \"text-emphasis-style\",\n    \"text-height\", \"text-indent\", \"text-justify\", \"text-orientation\",\n    \"text-outline\", \"text-overflow\", \"text-rendering\", \"text-shadow\",\n    \"text-size-adjust\", \"text-space-collapse\", \"text-transform\",\n    \"text-underline-position\", \"text-wrap\", \"top\", \"touch-action\", \"transform\", \"transform-origin\",\n    \"transform-style\", \"transition\", \"transition-delay\", \"transition-duration\",\n    \"transition-property\", \"transition-timing-function\", \"translate\",\n    \"unicode-bidi\", \"user-select\", \"vertical-align\", \"visibility\", \"voice-balance\",\n    \"voice-duration\", \"voice-family\", \"voice-pitch\", \"voice-range\", \"voice-rate\",\n    \"voice-stress\", \"voice-volume\", \"volume\", \"white-space\", \"widows\", \"width\",\n    \"will-change\", \"word-break\", \"word-spacing\", \"word-wrap\", \"writing-mode\", \"z-index\",\n    // SVG-specific\n    \"clip-path\", \"clip-rule\", \"mask\", \"enable-background\", \"filter\", \"flood-color\",\n    \"flood-opacity\", \"lighting-color\", \"stop-color\", \"stop-opacity\", \"pointer-events\",\n    \"color-interpolation\", \"color-interpolation-filters\",\n    \"color-rendering\", \"fill\", \"fill-opacity\", \"fill-rule\", \"image-rendering\",\n    \"marker\", \"marker-end\", \"marker-mid\", \"marker-start\", \"paint-order\", \"shape-rendering\", \"stroke\",\n    \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\",\n    \"stroke-miterlimit\", \"stroke-opacity\", \"stroke-width\", \"text-rendering\",\n    \"baseline-shift\", \"dominant-baseline\", \"glyph-orientation-horizontal\",\n    \"glyph-orientation-vertical\", \"text-anchor\", \"writing-mode\",\n  ], propertyKeywords = keySet(propertyKeywords_);\n\n  var nonStandardPropertyKeywords_ = [\n    \"accent-color\", \"aspect-ratio\", \"border-block\", \"border-block-color\", \"border-block-end\",\n    \"border-block-end-color\", \"border-block-end-style\", \"border-block-end-width\",\n    \"border-block-start\", \"border-block-start-color\", \"border-block-start-style\",\n    \"border-block-start-width\", \"border-block-style\", \"border-block-width\",\n    \"border-inline\", \"border-inline-color\", \"border-inline-end\",\n    \"border-inline-end-color\", \"border-inline-end-style\",\n    \"border-inline-end-width\", \"border-inline-start\", \"border-inline-start-color\",\n    \"border-inline-start-style\", \"border-inline-start-width\",\n    \"border-inline-style\", \"border-inline-width\", \"content-visibility\", \"margin-block\",\n    \"margin-block-end\", \"margin-block-start\", \"margin-inline\", \"margin-inline-end\",\n    \"margin-inline-start\", \"overflow-anchor\", \"overscroll-behavior\", \"padding-block\", \"padding-block-end\",\n    \"padding-block-start\", \"padding-inline\", \"padding-inline-end\",\n    \"padding-inline-start\", \"scroll-snap-stop\", \"scrollbar-3d-light-color\",\n    \"scrollbar-arrow-color\", \"scrollbar-base-color\", \"scrollbar-dark-shadow-color\",\n    \"scrollbar-face-color\", \"scrollbar-highlight-color\", \"scrollbar-shadow-color\",\n    \"scrollbar-track-color\", \"searchfield-cancel-button\", \"searchfield-decoration\",\n    \"searchfield-results-button\", \"searchfield-results-decoration\", \"shape-inside\", \"zoom\"\n  ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);\n\n  var fontProperties_ = [\n    \"font-display\", \"font-family\", \"src\", \"unicode-range\", \"font-variant\",\n     \"font-feature-settings\", \"font-stretch\", \"font-weight\", \"font-style\"\n  ], fontProperties = keySet(fontProperties_);\n\n  var counterDescriptors_ = [\n    \"additive-symbols\", \"fallback\", \"negative\", \"pad\", \"prefix\", \"range\",\n    \"speak-as\", \"suffix\", \"symbols\", \"system\"\n  ], counterDescriptors = keySet(counterDescriptors_);\n\n  var colorKeywords_ = [\n    \"aliceblue\", \"antiquewhite\", \"aqua\", \"aquamarine\", \"azure\", \"beige\",\n    \"bisque\", \"black\", \"blanchedalmond\", \"blue\", \"blueviolet\", \"brown\",\n    \"burlywood\", \"cadetblue\", \"chartreuse\", \"chocolate\", \"coral\", \"cornflowerblue\",\n    \"cornsilk\", \"crimson\", \"cyan\", \"darkblue\", \"darkcyan\", \"darkgoldenrod\",\n    \"darkgray\", \"darkgreen\", \"darkgrey\", \"darkkhaki\", \"darkmagenta\", \"darkolivegreen\",\n    \"darkorange\", \"darkorchid\", \"darkred\", \"darksalmon\", \"darkseagreen\",\n    \"darkslateblue\", \"darkslategray\", \"darkslategrey\", \"darkturquoise\", \"darkviolet\",\n    \"deeppink\", \"deepskyblue\", \"dimgray\", \"dimgrey\", \"dodgerblue\", \"firebrick\",\n    \"floralwhite\", \"forestgreen\", \"fuchsia\", \"gainsboro\", \"ghostwhite\",\n    \"gold\", \"goldenrod\", \"gray\", \"grey\", \"green\", \"greenyellow\", \"honeydew\",\n    \"hotpink\", \"indianred\", \"indigo\", \"ivory\", \"khaki\", \"lavender\",\n    \"lavenderblush\", \"lawngreen\", \"lemonchiffon\", \"lightblue\", \"lightcoral\",\n    \"lightcyan\", \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightgrey\", \"lightpink\",\n    \"lightsalmon\", \"lightseagreen\", \"lightskyblue\", \"lightslategray\", \"lightslategrey\",\n    \"lightsteelblue\", \"lightyellow\", \"lime\", \"limegreen\", \"linen\", \"magenta\",\n    \"maroon\", \"mediumaquamarine\", \"mediumblue\", \"mediumorchid\", \"mediumpurple\",\n    \"mediumseagreen\", \"mediumslateblue\", \"mediumspringgreen\", \"mediumturquoise\",\n    \"mediumvioletred\", \"midnightblue\", \"mintcream\", \"mistyrose\", \"moccasin\",\n    \"navajowhite\", \"navy\", \"oldlace\", \"olive\", \"olivedrab\", \"orange\", \"orangered\",\n    \"orchid\", \"palegoldenrod\", \"palegreen\", \"paleturquoise\", \"palevioletred\",\n    \"papayawhip\", \"peachpuff\", \"peru\", \"pink\", \"plum\", \"powderblue\",\n    \"purple\", \"rebeccapurple\", \"red\", \"rosybrown\", \"royalblue\", \"saddlebrown\",\n    \"salmon\", \"sandybrown\", \"seagreen\", \"seashell\", \"sienna\", \"silver\", \"skyblue\",\n    \"slateblue\", \"slategray\", \"slategrey\", \"snow\", \"springgreen\", \"steelblue\", \"tan\",\n    \"teal\", \"thistle\", \"tomato\", \"turquoise\", \"violet\", \"wheat\", \"white\",\n    \"whitesmoke\", \"yellow\", \"yellowgreen\"\n  ], colorKeywords = keySet(colorKeywords_);\n\n  var valueKeywords_ = [\n    \"above\", \"absolute\", \"activeborder\", \"additive\", \"activecaption\", \"afar\",\n    \"after-white-space\", \"ahead\", \"alias\", \"all\", \"all-scroll\", \"alphabetic\", \"alternate\",\n    \"always\", \"amharic\", \"amharic-abegede\", \"antialiased\", \"appworkspace\",\n    \"arabic-indic\", \"armenian\", \"asterisks\", \"attr\", \"auto\", \"auto-flow\", \"avoid\", \"avoid-column\", \"avoid-page\",\n    \"avoid-region\", \"axis-pan\", \"background\", \"backwards\", \"baseline\", \"below\", \"bidi-override\", \"binary\",\n    \"bengali\", \"blink\", \"block\", \"block-axis\", \"blur\", \"bold\", \"bolder\", \"border\", \"border-box\",\n    \"both\", \"bottom\", \"break\", \"break-all\", \"break-word\", \"brightness\", \"bullets\", \"button\", \"button-bevel\",\n    \"buttonface\", \"buttonhighlight\", \"buttonshadow\", \"buttontext\", \"calc\", \"cambodian\",\n    \"capitalize\", \"caps-lock-indicator\", \"caption\", \"captiontext\", \"caret\",\n    \"cell\", \"center\", \"checkbox\", \"circle\", \"cjk-decimal\", \"cjk-earthly-branch\",\n    \"cjk-heavenly-stem\", \"cjk-ideographic\", \"clear\", \"clip\", \"close-quote\",\n    \"col-resize\", \"collapse\", \"color\", \"color-burn\", \"color-dodge\", \"column\", \"column-reverse\",\n    \"compact\", \"condensed\", \"conic-gradient\", \"contain\", \"content\", \"contents\",\n    \"content-box\", \"context-menu\", \"continuous\", \"contrast\", \"copy\", \"counter\", \"counters\", \"cover\", \"crop\",\n    \"cross\", \"crosshair\", \"cubic-bezier\", \"currentcolor\", \"cursive\", \"cyclic\", \"darken\", \"dashed\", \"decimal\",\n    \"decimal-leading-zero\", \"default\", \"default-button\", \"dense\", \"destination-atop\",\n    \"destination-in\", \"destination-out\", \"destination-over\", \"devanagari\", \"difference\",\n    \"disc\", \"discard\", \"disclosure-closed\", \"disclosure-open\", \"document\",\n    \"dot-dash\", \"dot-dot-dash\",\n    \"dotted\", \"double\", \"down\", \"drop-shadow\", \"e-resize\", \"ease\", \"ease-in\", \"ease-in-out\", \"ease-out\",\n    \"element\", \"ellipse\", \"ellipsis\", \"embed\", \"end\", \"ethiopic\", \"ethiopic-abegede\",\n    \"ethiopic-abegede-am-et\", \"ethiopic-abegede-gez\", \"ethiopic-abegede-ti-er\",\n    \"ethiopic-abegede-ti-et\", \"ethiopic-halehame-aa-er\",\n    \"ethiopic-halehame-aa-et\", \"ethiopic-halehame-am-et\",\n    \"ethiopic-halehame-gez\", \"ethiopic-halehame-om-et\",\n    \"ethiopic-halehame-sid-et\", \"ethiopic-halehame-so-et\",\n    \"ethiopic-halehame-ti-er\", \"ethiopic-halehame-ti-et\", \"ethiopic-halehame-tig\",\n    \"ethiopic-numeric\", \"ew-resize\", \"exclusion\", \"expanded\", \"extends\", \"extra-condensed\",\n    \"extra-expanded\", \"fantasy\", \"fast\", \"fill\", \"fill-box\", \"fixed\", \"flat\", \"flex\", \"flex-end\", \"flex-start\", \"footnotes\",\n    \"forwards\", \"from\", \"geometricPrecision\", \"georgian\", \"grayscale\", \"graytext\", \"grid\", \"groove\",\n    \"gujarati\", \"gurmukhi\", \"hand\", \"hangul\", \"hangul-consonant\", \"hard-light\", \"hebrew\",\n    \"help\", \"hidden\", \"hide\", \"higher\", \"highlight\", \"highlighttext\",\n    \"hiragana\", \"hiragana-iroha\", \"horizontal\", \"hsl\", \"hsla\", \"hue\", \"hue-rotate\", \"icon\", \"ignore\",\n    \"inactiveborder\", \"inactivecaption\", \"inactivecaptiontext\", \"infinite\",\n    \"infobackground\", \"infotext\", \"inherit\", \"initial\", \"inline\", \"inline-axis\",\n    \"inline-block\", \"inline-flex\", \"inline-grid\", \"inline-table\", \"inset\", \"inside\", \"intrinsic\", \"invert\",\n    \"italic\", \"japanese-formal\", \"japanese-informal\", \"justify\", \"kannada\",\n    \"katakana\", \"katakana-iroha\", \"keep-all\", \"khmer\",\n    \"korean-hangul-formal\", \"korean-hanja-formal\", \"korean-hanja-informal\",\n    \"landscape\", \"lao\", \"large\", \"larger\", \"left\", \"level\", \"lighter\", \"lighten\",\n    \"line-through\", \"linear\", \"linear-gradient\", \"lines\", \"list-item\", \"listbox\", \"listitem\",\n    \"local\", \"logical\", \"loud\", \"lower\", \"lower-alpha\", \"lower-armenian\",\n    \"lower-greek\", \"lower-hexadecimal\", \"lower-latin\", \"lower-norwegian\",\n    \"lower-roman\", \"lowercase\", \"ltr\", \"luminosity\", \"malayalam\", \"manipulation\", \"match\", \"matrix\", \"matrix3d\",\n    \"media-controls-background\", \"media-current-time-display\",\n    \"media-fullscreen-button\", \"media-mute-button\", \"media-play-button\",\n    \"media-return-to-realtime-button\", \"media-rewind-button\",\n    \"media-seek-back-button\", \"media-seek-forward-button\", \"media-slider\",\n    \"media-sliderthumb\", \"media-time-remaining-display\", \"media-volume-slider\",\n    \"media-volume-slider-container\", \"media-volume-sliderthumb\", \"medium\",\n    \"menu\", \"menulist\", \"menulist-button\", \"menulist-text\",\n    \"menulist-textfield\", \"menutext\", \"message-box\", \"middle\", \"min-intrinsic\",\n    \"mix\", \"mongolian\", \"monospace\", \"move\", \"multiple\", \"multiple_mask_images\", \"multiply\", \"myanmar\", \"n-resize\",\n    \"narrower\", \"ne-resize\", \"nesw-resize\", \"no-close-quote\", \"no-drop\",\n    \"no-open-quote\", \"no-repeat\", \"none\", \"normal\", \"not-allowed\", \"nowrap\",\n    \"ns-resize\", \"numbers\", \"numeric\", \"nw-resize\", \"nwse-resize\", \"oblique\", \"octal\", \"opacity\", \"open-quote\",\n    \"optimizeLegibility\", \"optimizeSpeed\", \"oriya\", \"oromo\", \"outset\",\n    \"outside\", \"outside-shape\", \"overlay\", \"overline\", \"padding\", \"padding-box\",\n    \"painted\", \"page\", \"paused\", \"persian\", \"perspective\", \"pinch-zoom\", \"plus-darker\", \"plus-lighter\",\n    \"pointer\", \"polygon\", \"portrait\", \"pre\", \"pre-line\", \"pre-wrap\", \"preserve-3d\",\n    \"progress\", \"push-button\", \"radial-gradient\", \"radio\", \"read-only\",\n    \"read-write\", \"read-write-plaintext-only\", \"rectangle\", \"region\",\n    \"relative\", \"repeat\", \"repeating-linear-gradient\", \"repeating-radial-gradient\",\n    \"repeating-conic-gradient\", \"repeat-x\", \"repeat-y\", \"reset\", \"reverse\",\n    \"rgb\", \"rgba\", \"ridge\", \"right\", \"rotate\", \"rotate3d\", \"rotateX\", \"rotateY\",\n    \"rotateZ\", \"round\", \"row\", \"row-resize\", \"row-reverse\", \"rtl\", \"run-in\", \"running\",\n    \"s-resize\", \"sans-serif\", \"saturate\", \"saturation\", \"scale\", \"scale3d\", \"scaleX\", \"scaleY\", \"scaleZ\", \"screen\",\n    \"scroll\", \"scrollbar\", \"scroll-position\", \"se-resize\", \"searchfield\",\n    \"searchfield-cancel-button\", \"searchfield-decoration\",\n    \"searchfield-results-button\", \"searchfield-results-decoration\", \"self-start\", \"self-end\",\n    \"semi-condensed\", \"semi-expanded\", \"separate\", \"sepia\", \"serif\", \"show\", \"sidama\",\n    \"simp-chinese-formal\", \"simp-chinese-informal\", \"single\",\n    \"skew\", \"skewX\", \"skewY\", \"skip-white-space\", \"slide\", \"slider-horizontal\",\n    \"slider-vertical\", \"sliderthumb-horizontal\", \"sliderthumb-vertical\", \"slow\",\n    \"small\", \"small-caps\", \"small-caption\", \"smaller\", \"soft-light\", \"solid\", \"somali\",\n    \"source-atop\", \"source-in\", \"source-out\", \"source-over\", \"space\", \"space-around\", \"space-between\", \"space-evenly\", \"spell-out\", \"square\",\n    \"square-button\", \"start\", \"static\", \"status-bar\", \"stretch\", \"stroke\", \"stroke-box\", \"sub\",\n    \"subpixel-antialiased\", \"svg_masks\", \"super\", \"sw-resize\", \"symbolic\", \"symbols\", \"system-ui\", \"table\",\n    \"table-caption\", \"table-cell\", \"table-column\", \"table-column-group\",\n    \"table-footer-group\", \"table-header-group\", \"table-row\", \"table-row-group\",\n    \"tamil\",\n    \"telugu\", \"text\", \"text-bottom\", \"text-top\", \"textarea\", \"textfield\", \"thai\",\n    \"thick\", \"thin\", \"threeddarkshadow\", \"threedface\", \"threedhighlight\",\n    \"threedlightshadow\", \"threedshadow\", \"tibetan\", \"tigre\", \"tigrinya-er\",\n    \"tigrinya-er-abegede\", \"tigrinya-et\", \"tigrinya-et-abegede\", \"to\", \"top\",\n    \"trad-chinese-formal\", \"trad-chinese-informal\", \"transform\",\n    \"translate\", \"translate3d\", \"translateX\", \"translateY\", \"translateZ\",\n    \"transparent\", \"ultra-condensed\", \"ultra-expanded\", \"underline\", \"unidirectional-pan\", \"unset\", \"up\",\n    \"upper-alpha\", \"upper-armenian\", \"upper-greek\", \"upper-hexadecimal\",\n    \"upper-latin\", \"upper-norwegian\", \"upper-roman\", \"uppercase\", \"urdu\", \"url\",\n    \"var\", \"vertical\", \"vertical-text\", \"view-box\", \"visible\", \"visibleFill\", \"visiblePainted\",\n    \"visibleStroke\", \"visual\", \"w-resize\", \"wait\", \"wave\", \"wider\",\n    \"window\", \"windowframe\", \"windowtext\", \"words\", \"wrap\", \"wrap-reverse\", \"x-large\", \"x-small\", \"xor\",\n    \"xx-large\", \"xx-small\"\n  ], valueKeywords = keySet(valueKeywords_);\n\n  var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_)\n    .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_)\n    .concat(valueKeywords_);\n  CodeMirror.registerHelper(\"hintWords\", \"css\", allWords);\n\n  function tokenCComment(stream, state) {\n    var maybeEnd = false, ch;\n    while ((ch = stream.next()) != null) {\n      if (maybeEnd && ch == \"/\") {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return [\"comment\", \"comment\"];\n  }\n\n  CodeMirror.defineMIME(\"text/css\", {\n    documentTypes: documentTypes,\n    mediaTypes: mediaTypes,\n    mediaFeatures: mediaFeatures,\n    mediaValueKeywords: mediaValueKeywords,\n    propertyKeywords: propertyKeywords,\n    nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n    fontProperties: fontProperties,\n    counterDescriptors: counterDescriptors,\n    colorKeywords: colorKeywords,\n    valueKeywords: valueKeywords,\n    tokenHooks: {\n      \"/\": function(stream, state) {\n        if (!stream.eat(\"*\")) return false;\n        state.tokenize = tokenCComment;\n        return tokenCComment(stream, state);\n      }\n    },\n    name: \"css\"\n  });\n\n  CodeMirror.defineMIME(\"text/x-scss\", {\n    mediaTypes: mediaTypes,\n    mediaFeatures: mediaFeatures,\n    mediaValueKeywords: mediaValueKeywords,\n    propertyKeywords: propertyKeywords,\n    nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n    colorKeywords: colorKeywords,\n    valueKeywords: valueKeywords,\n    fontProperties: fontProperties,\n    allowNested: true,\n    lineComment: \"//\",\n    tokenHooks: {\n      \"/\": function(stream, state) {\n        if (stream.eat(\"/\")) {\n          stream.skipToEnd();\n          return [\"comment\", \"comment\"];\n        } else if (stream.eat(\"*\")) {\n          state.tokenize = tokenCComment;\n          return tokenCComment(stream, state);\n        } else {\n          return [\"operator\", \"operator\"];\n        }\n      },\n      \":\": function(stream) {\n        if (stream.match(/^\\s*\\{/, false))\n          return [null, null]\n        return false;\n      },\n      \"$\": function(stream) {\n        stream.match(/^[\\w-]+/);\n        if (stream.match(/^\\s*:/, false))\n          return [\"variable-2\", \"variable-definition\"];\n        return [\"variable-2\", \"variable\"];\n      },\n      \"#\": function(stream) {\n        if (!stream.eat(\"{\")) return false;\n        return [null, \"interpolation\"];\n      }\n    },\n    name: \"css\",\n    helperType: \"scss\"\n  });\n\n  CodeMirror.defineMIME(\"text/x-less\", {\n    mediaTypes: mediaTypes,\n    mediaFeatures: mediaFeatures,\n    mediaValueKeywords: mediaValueKeywords,\n    propertyKeywords: propertyKeywords,\n    nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n    colorKeywords: colorKeywords,\n    valueKeywords: valueKeywords,\n    fontProperties: fontProperties,\n    allowNested: true,\n    lineComment: \"//\",\n    tokenHooks: {\n      \"/\": function(stream, state) {\n        if (stream.eat(\"/\")) {\n          stream.skipToEnd();\n          return [\"comment\", \"comment\"];\n        } else if (stream.eat(\"*\")) {\n          state.tokenize = tokenCComment;\n          return tokenCComment(stream, state);\n        } else {\n          return [\"operator\", \"operator\"];\n        }\n      },\n      \"@\": function(stream) {\n        if (stream.eat(\"{\")) return [null, \"interpolation\"];\n        if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\\b/i, false)) return false;\n        stream.eatWhile(/[\\w\\\\\\-]/);\n        if (stream.match(/^\\s*:/, false))\n          return [\"variable-2\", \"variable-definition\"];\n        return [\"variable-2\", \"variable\"];\n      },\n      \"&\": function() {\n        return [\"atom\", \"atom\"];\n      }\n    },\n    name: \"css\",\n    helperType: \"less\"\n  });\n\n  CodeMirror.defineMIME(\"text/x-gss\", {\n    documentTypes: documentTypes,\n    mediaTypes: mediaTypes,\n    mediaFeatures: mediaFeatures,\n    propertyKeywords: propertyKeywords,\n    nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n    fontProperties: fontProperties,\n    counterDescriptors: counterDescriptors,\n    colorKeywords: colorKeywords,\n    valueKeywords: valueKeywords,\n    supportsAtComponent: true,\n    tokenHooks: {\n      \"/\": function(stream, state) {\n        if (!stream.eat(\"*\")) return false;\n        state.tokenize = tokenCComment;\n        return tokenCComment(stream, state);\n      }\n    },\n    name: \"css\",\n    helperType: \"gss\"\n  });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/cypher/cypher.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// By the Neo4j Team and contributors.\n// https://github.com/neo4j-contrib/CodeMirror\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  var wordRegexp = function(words) {\n    return new RegExp(\"^(?:\" + words.join(\"|\") + \")$\", \"i\");\n  };\n\n  CodeMirror.defineMode(\"cypher\", function(config) {\n    var tokenBase = function(stream/*, state*/) {\n      curPunc = null\n      var ch = stream.next();\n      if (ch ==='\"') {\n        stream.match(/^[^\"]*\"/);\n        return \"string\";\n      }\n      if (ch === \"'\") {\n        stream.match(/^[^']*'/);\n        return \"string\";\n      }\n      if (/[{}\\(\\),\\.;\\[\\]]/.test(ch)) {\n        curPunc = ch;\n        return \"node\";\n      } else if (ch === \"/\" && stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      } else if (operatorChars.test(ch)) {\n        stream.eatWhile(operatorChars);\n        return null;\n      } else {\n        stream.eatWhile(/[_\\w\\d]/);\n        if (stream.eat(\":\")) {\n          stream.eatWhile(/[\\w\\d_\\-]/);\n          return \"atom\";\n        }\n        var word = stream.current();\n        if (funcs.test(word)) return \"builtin\";\n        if (preds.test(word)) return \"def\";\n        if (keywords.test(word) || systemKeywords.test(word)) return \"keyword\";\n        return \"variable\";\n      }\n    };\n    var pushContext = function(state, type, col) {\n      return state.context = {\n        prev: state.context,\n        indent: state.indent,\n        col: col,\n        type: type\n      };\n    };\n    var popContext = function(state) {\n      state.indent = state.context.indent;\n      return state.context = state.context.prev;\n    };\n    var indentUnit = config.indentUnit;\n    var curPunc;\n    var funcs = wordRegexp([\"abs\", \"acos\", \"allShortestPaths\", \"asin\", \"atan\", \"atan2\", \"avg\", \"ceil\", \"coalesce\", \"collect\", \"cos\", \"cot\", \"count\", \"degrees\", \"e\", \"endnode\", \"exp\", \"extract\", \"filter\", \"floor\", \"haversin\", \"head\", \"id\", \"keys\", \"labels\", \"last\", \"left\", \"length\", \"log\", \"log10\", \"lower\", \"ltrim\", \"max\", \"min\", \"node\", \"nodes\", \"percentileCont\", \"percentileDisc\", \"pi\", \"radians\", \"rand\", \"range\", \"reduce\", \"rel\", \"relationship\", \"relationships\", \"replace\", \"reverse\", \"right\", \"round\", \"rtrim\", \"shortestPath\", \"sign\", \"sin\", \"size\", \"split\", \"sqrt\", \"startnode\", \"stdev\", \"stdevp\", \"str\", \"substring\", \"sum\", \"tail\", \"tan\", \"timestamp\", \"toFloat\", \"toInt\", \"toString\", \"trim\", \"type\", \"upper\"]);\n    var preds = wordRegexp([\"all\", \"and\", \"any\", \"contains\", \"exists\", \"has\", \"in\", \"none\", \"not\", \"or\", \"single\", \"xor\"]);\n    var keywords = wordRegexp([\"as\", \"asc\", \"ascending\", \"assert\", \"by\", \"case\", \"commit\", \"constraint\", \"create\", \"csv\", \"cypher\", \"delete\", \"desc\", \"descending\", \"detach\", \"distinct\", \"drop\", \"else\", \"end\", \"ends\", \"explain\", \"false\", \"fieldterminator\", \"foreach\", \"from\", \"headers\", \"in\", \"index\", \"is\", \"join\", \"limit\", \"load\", \"match\", \"merge\", \"null\", \"on\", \"optional\", \"order\", \"periodic\", \"profile\", \"remove\", \"return\", \"scan\", \"set\", \"skip\", \"start\", \"starts\", \"then\", \"true\", \"union\", \"unique\", \"unwind\", \"using\", \"when\", \"where\", \"with\", \"call\", \"yield\"]);\n    var systemKeywords = wordRegexp([\"access\", \"active\", \"assign\", \"all\", \"alter\", \"as\", \"catalog\", \"change\", \"copy\", \"create\", \"constraint\", \"constraints\", \"current\", \"database\", \"databases\", \"dbms\", \"default\", \"deny\", \"drop\", \"element\", \"elements\", \"exists\", \"from\", \"grant\", \"graph\", \"graphs\", \"if\", \"index\", \"indexes\", \"label\", \"labels\", \"management\", \"match\", \"name\", \"names\", \"new\", \"node\", \"nodes\", \"not\", \"of\", \"on\", \"or\", \"password\", \"populated\", \"privileges\", \"property\", \"read\", \"relationship\", \"relationships\", \"remove\", \"replace\", \"required\", \"revoke\", \"role\", \"roles\", \"set\", \"show\", \"start\", \"status\", \"stop\", \"suspended\", \"to\", \"traverse\", \"type\", \"types\", \"user\", \"users\", \"with\", \"write\"]);\n    var operatorChars = /[*+\\-<>=&|~%^]/;\n\n    return {\n      startState: function(/*base*/) {\n        return {\n          tokenize: tokenBase,\n          context: null,\n          indent: 0,\n          col: 0\n        };\n      },\n      token: function(stream, state) {\n        if (stream.sol()) {\n          if (state.context && (state.context.align == null)) {\n            state.context.align = false;\n          }\n          state.indent = stream.indentation();\n        }\n        if (stream.eatSpace()) {\n          return null;\n        }\n        var style = state.tokenize(stream, state);\n        if (style !== \"comment\" && state.context && (state.context.align == null) && state.context.type !== \"pattern\") {\n          state.context.align = true;\n        }\n        if (curPunc === \"(\") {\n          pushContext(state, \")\", stream.column());\n        } else if (curPunc === \"[\") {\n          pushContext(state, \"]\", stream.column());\n        } else if (curPunc === \"{\") {\n          pushContext(state, \"}\", stream.column());\n        } else if (/[\\]\\}\\)]/.test(curPunc)) {\n          while (state.context && state.context.type === \"pattern\") {\n            popContext(state);\n          }\n          if (state.context && curPunc === state.context.type) {\n            popContext(state);\n          }\n        } else if (curPunc === \".\" && state.context && state.context.type === \"pattern\") {\n          popContext(state);\n        } else if (/atom|string|variable/.test(style) && state.context) {\n          if (/[\\}\\]]/.test(state.context.type)) {\n            pushContext(state, \"pattern\", stream.column());\n          } else if (state.context.type === \"pattern\" && !state.context.align) {\n            state.context.align = true;\n            state.context.col = stream.column();\n          }\n        }\n        return style;\n      },\n      indent: function(state, textAfter) {\n        var firstChar = textAfter && textAfter.charAt(0);\n        var context = state.context;\n        if (/[\\]\\}]/.test(firstChar)) {\n          while (context && context.type === \"pattern\") {\n            context = context.prev;\n          }\n        }\n        var closing = context && firstChar === context.type;\n        if (!context) return 0;\n        if (context.type === \"keywords\") return CodeMirror.commands.newlineAndIndent;\n        if (context.align) return context.col + (closing ? 0 : 1);\n        return context.indent + (closing ? 0 : indentUnit);\n      }\n    };\n  });\n\n  CodeMirror.modeExtensions[\"cypher\"] = {\n    autoFormatLineBreaks: function(text) {\n      var i, lines, reProcessedPortion;\n      var lines = text.split(\"\\n\");\n      var reProcessedPortion = /\\s+\\b(return|where|order by|match|with|skip|limit|create|delete|set)\\b\\s/g;\n      for (var i = 0; i < lines.length; i++)\n        lines[i] = lines[i].replace(reProcessedPortion, \" \\n$1 \").trim();\n      return lines.join(\"\\n\");\n    }\n  };\n\n  CodeMirror.defineMIME(\"application/x-cypher-query\", \"cypher\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/d/d.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"d\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit,\n      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,\n      keywords = parserConfig.keywords || {},\n      builtin = parserConfig.builtin || {},\n      blockKeywords = parserConfig.blockKeywords || {},\n      atoms = parserConfig.atoms || {},\n      hooks = parserConfig.hooks || {},\n      multiLineStrings = parserConfig.multiLineStrings;\n  var isOperatorChar = /[+\\-*&%=<>!?|\\/]/;\n\n  var curPunc;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (hooks[ch]) {\n      var result = hooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n    if (ch == '\"' || ch == \"'\" || ch == \"`\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"+\")) {\n        state.tokenize = tokenNestedComment;\n        return tokenNestedComment(stream, state);\n      }\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n    var cur = stream.current();\n    if (keywords.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"keyword\";\n    }\n    if (builtin.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"builtin\";\n    }\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = null;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function tokenNestedComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch == \"+\");\n    }\n    return \"comment\";\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type) {\n    var indent = state.indented;\n    if (state.context && state.context.type == \"statement\")\n      indent = state.context.indented;\n    return state.context = new Context(indent, col, type, null, state.context);\n  }\n  function popContext(state) {\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if ((curPunc == \";\" || curPunc == \":\" || curPunc == \",\") && ctx.type == \"statement\") popContext(state);\n      else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"}\") {\n        while (ctx.type == \"statement\") ctx = popContext(state);\n        if (ctx.type == \"}\") ctx = popContext(state);\n        while (ctx.type == \"statement\") ctx = popContext(state);\n      }\n      else if (curPunc == ctx.type) popContext(state);\n      else if (((ctx.type == \"}\" || ctx.type == \"top\") && curPunc != ';') || (ctx.type == \"statement\" && curPunc == \"newstatement\"))\n        pushContext(state, stream.column(), \"statement\");\n      state.startOfLine = false;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;\n      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n      if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n      var closing = firstChar == ctx.type;\n      if (ctx.type == \"statement\") return ctx.indented + (firstChar == \"{\" ? 0 : statementIndentUnit);\n      else if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"{}\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    blockCommentContinue: \" * \",\n    lineComment: \"//\",\n    fold: \"brace\"\n  };\n});\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  var blockKeywords = \"body catch class do else enum for foreach foreach_reverse if in interface mixin \" +\n                      \"out scope struct switch try union unittest version while with\";\n\n  CodeMirror.defineMIME(\"text/x-d\", {\n    name: \"d\",\n    keywords: words(\"abstract alias align asm assert auto break case cast cdouble cent cfloat const continue \" +\n                    \"debug default delegate delete deprecated export extern final finally function goto immutable \" +\n                    \"import inout invariant is lazy macro module new nothrow override package pragma private \" +\n                    \"protected public pure ref return shared short static super synchronized template this \" +\n                    \"throw typedef typeid typeof volatile __FILE__ __LINE__ __gshared __traits __vector __parameters \" +\n                    blockKeywords),\n    blockKeywords: words(blockKeywords),\n    builtin: words(\"bool byte char creal dchar double float idouble ifloat int ireal long real short ubyte \" +\n                   \"ucent uint ulong ushort wchar wstring void size_t sizediff_t\"),\n    atoms: words(\"exit failure success true false null\"),\n    hooks: {\n      \"@\": function(stream, _state) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      }\n    }\n  });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/dart/dart.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../clike/clike\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../clike/clike\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var keywords = (\"this super static final const abstract class extends external factory \" +\n    \"implements mixin get native set typedef with enum throw rethrow \" +\n    \"assert break case continue default in return new deferred async await covariant \" +\n    \"try catch finally do else for if switch while import library export \" +\n    \"part of show hide is as extension on yield late required\").split(\" \");\n  var blockKeywords = \"try catch finally do else for if switch while\".split(\" \");\n  var atoms = \"true false null\".split(\" \");\n  var builtins = \"void bool num int double dynamic var String Null Never\".split(\" \");\n\n  function set(words) {\n    var obj = {};\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  function pushInterpolationStack(state) {\n    (state.interpolationStack || (state.interpolationStack = [])).push(state.tokenize);\n  }\n\n  function popInterpolationStack(state) {\n    return (state.interpolationStack || (state.interpolationStack = [])).pop();\n  }\n\n  function sizeInterpolationStack(state) {\n    return state.interpolationStack ? state.interpolationStack.length : 0;\n  }\n\n  CodeMirror.defineMIME(\"application/dart\", {\n    name: \"clike\",\n    keywords: set(keywords),\n    blockKeywords: set(blockKeywords),\n    builtin: set(builtins),\n    atoms: set(atoms),\n    hooks: {\n      \"@\": function(stream) {\n        stream.eatWhile(/[\\w\\$_\\.]/);\n        return \"meta\";\n      },\n\n      // custom string handling to deal with triple-quoted strings and string interpolation\n      \"'\": function(stream, state) {\n        return tokenString(\"'\", stream, state, false);\n      },\n      \"\\\"\": function(stream, state) {\n        return tokenString(\"\\\"\", stream, state, false);\n      },\n      \"r\": function(stream, state) {\n        var peek = stream.peek();\n        if (peek == \"'\" || peek == \"\\\"\") {\n          return tokenString(stream.next(), stream, state, true);\n        }\n        return false;\n      },\n\n      \"}\": function(_stream, state) {\n        // \"}\" is end of interpolation, if interpolation stack is non-empty\n        if (sizeInterpolationStack(state) > 0) {\n          state.tokenize = popInterpolationStack(state);\n          return null;\n        }\n        return false;\n      },\n\n      \"/\": function(stream, state) {\n        if (!stream.eat(\"*\")) return false\n        state.tokenize = tokenNestedComment(1)\n        return state.tokenize(stream, state)\n      },\n      token: function(stream, _, style) {\n        if (style == \"variable\") {\n          // Assume uppercase symbols are classes using variable-2\n          var isUpper = RegExp('^[_$]*[A-Z][a-zA-Z0-9_$]*$','g');\n          if (isUpper.test(stream.current())) {\n            return 'variable-2';\n          }\n        }\n      }\n    }\n  });\n\n  function tokenString(quote, stream, state, raw) {\n    var tripleQuoted = false;\n    if (stream.eat(quote)) {\n      if (stream.eat(quote)) tripleQuoted = true;\n      else return \"string\"; //empty string\n    }\n    function tokenStringHelper(stream, state) {\n      var escaped = false;\n      while (!stream.eol()) {\n        if (!raw && !escaped && stream.peek() == \"$\") {\n          pushInterpolationStack(state);\n          state.tokenize = tokenInterpolation;\n          return \"string\";\n        }\n        var next = stream.next();\n        if (next == quote && !escaped && (!tripleQuoted || stream.match(quote + quote))) {\n          state.tokenize = null;\n          break;\n        }\n        escaped = !raw && !escaped && next == \"\\\\\";\n      }\n      return \"string\";\n    }\n    state.tokenize = tokenStringHelper;\n    return tokenStringHelper(stream, state);\n  }\n\n  function tokenInterpolation(stream, state) {\n    stream.eat(\"$\");\n    if (stream.eat(\"{\")) {\n      // let clike handle the content of ${...},\n      // we take over again when \"}\" appears (see hooks).\n      state.tokenize = null;\n    } else {\n      state.tokenize = tokenInterpolationIdentifier;\n    }\n    return null;\n  }\n\n  function tokenInterpolationIdentifier(stream, state) {\n    stream.eatWhile(/[\\w_]/);\n    state.tokenize = popInterpolationStack(state);\n    return \"variable\";\n  }\n\n  function tokenNestedComment(depth) {\n    return function (stream, state) {\n      var ch\n      while (ch = stream.next()) {\n        if (ch == \"*\" && stream.eat(\"/\")) {\n          if (depth == 1) {\n            state.tokenize = null\n            break\n          } else {\n            state.tokenize = tokenNestedComment(depth - 1)\n            return state.tokenize(stream, state)\n          }\n        } else if (ch == \"/\" && stream.eat(\"*\")) {\n          state.tokenize = tokenNestedComment(depth + 1)\n          return state.tokenize(stream, state)\n        }\n      }\n      return \"comment\"\n    }\n  }\n\n  CodeMirror.registerHelper(\"hintWords\", \"application/dart\", keywords.concat(atoms).concat(builtins));\n\n  // This is needed to make loading through meta.js work.\n  CodeMirror.defineMode(\"dart\", function(conf) {\n    return CodeMirror.getMode(conf, \"application/dart\");\n  }, \"clike\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/diff/diff.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"diff\", function() {\n\n  var TOKEN_NAMES = {\n    '+': 'positive',\n    '-': 'negative',\n    '@': 'meta'\n  };\n\n  return {\n    token: function(stream) {\n      var tw_pos = stream.string.search(/[\\t ]+?$/);\n\n      if (!stream.sol() || tw_pos === 0) {\n        stream.skipToEnd();\n        return (\"error \" + (\n          TOKEN_NAMES[stream.string.charAt(0)] || '')).replace(/ $/, '');\n      }\n\n      var token_name = TOKEN_NAMES[stream.peek()] || stream.skipToEnd();\n\n      if (tw_pos === -1) {\n        stream.skipToEnd();\n      } else {\n        stream.pos = tw_pos;\n      }\n\n      return token_name;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-diff\", \"diff\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/django/django.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"),\n        require(\"../../addon/mode/overlay\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\",\n            \"../../addon/mode/overlay\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"django:inner\", function() {\n    var keywords = [\"block\", \"endblock\", \"for\", \"endfor\", \"true\", \"false\", \"filter\", \"endfilter\",\n                    \"loop\", \"none\", \"self\", \"super\", \"if\", \"elif\", \"endif\", \"as\", \"else\", \"import\",\n                    \"with\", \"endwith\", \"without\", \"context\", \"ifequal\", \"endifequal\", \"ifnotequal\",\n                    \"endifnotequal\", \"extends\", \"include\", \"load\", \"comment\", \"endcomment\",\n                    \"empty\", \"url\", \"static\", \"trans\", \"blocktrans\", \"endblocktrans\", \"now\",\n                    \"regroup\", \"lorem\", \"ifchanged\", \"endifchanged\", \"firstof\", \"debug\", \"cycle\",\n                    \"csrf_token\", \"autoescape\", \"endautoescape\", \"spaceless\", \"endspaceless\",\n                    \"ssi\", \"templatetag\", \"verbatim\", \"endverbatim\", \"widthratio\"],\n        filters = [\"add\", \"addslashes\", \"capfirst\", \"center\", \"cut\", \"date\",\n                   \"default\", \"default_if_none\", \"dictsort\",\n                   \"dictsortreversed\", \"divisibleby\", \"escape\", \"escapejs\",\n                   \"filesizeformat\", \"first\", \"floatformat\", \"force_escape\",\n                   \"get_digit\", \"iriencode\", \"join\", \"last\", \"length\",\n                   \"length_is\", \"linebreaks\", \"linebreaksbr\", \"linenumbers\",\n                   \"ljust\", \"lower\", \"make_list\", \"phone2numeric\", \"pluralize\",\n                   \"pprint\", \"random\", \"removetags\", \"rjust\", \"safe\",\n                   \"safeseq\", \"slice\", \"slugify\", \"stringformat\", \"striptags\",\n                   \"time\", \"timesince\", \"timeuntil\", \"title\", \"truncatechars\",\n                   \"truncatechars_html\", \"truncatewords\", \"truncatewords_html\",\n                   \"unordered_list\", \"upper\", \"urlencode\", \"urlize\",\n                   \"urlizetrunc\", \"wordcount\", \"wordwrap\", \"yesno\"],\n        operators = [\"==\", \"!=\", \"<\", \">\", \"<=\", \">=\"],\n        wordOperators = [\"in\", \"not\", \"or\", \"and\"];\n\n    keywords = new RegExp(\"^\\\\b(\" + keywords.join(\"|\") + \")\\\\b\");\n    filters = new RegExp(\"^\\\\b(\" + filters.join(\"|\") + \")\\\\b\");\n    operators = new RegExp(\"^\\\\b(\" + operators.join(\"|\") + \")\\\\b\");\n    wordOperators = new RegExp(\"^\\\\b(\" + wordOperators.join(\"|\") + \")\\\\b\");\n\n    // We have to return \"null\" instead of null, in order to avoid string\n    // styling as the default, when using Django templates inside HTML\n    // element attributes\n    function tokenBase (stream, state) {\n      // Attempt to identify a variable, template or comment tag respectively\n      if (stream.match(\"{{\")) {\n        state.tokenize = inVariable;\n        return \"tag\";\n      } else if (stream.match(\"{%\")) {\n        state.tokenize = inTag;\n        return \"tag\";\n      } else if (stream.match(\"{#\")) {\n        state.tokenize = inComment;\n        return \"comment\";\n      }\n\n      // Ignore completely any stream series that do not match the\n      // Django template opening tags.\n      while (stream.next() != null && !stream.match(/\\{[{%#]/, false)) {}\n      return null;\n    }\n\n    // A string can be included in either single or double quotes (this is\n    // the delimiter). Mark everything as a string until the start delimiter\n    // occurs again.\n    function inString (delimiter, previousTokenizer) {\n      return function (stream, state) {\n        if (!state.escapeNext && stream.eat(delimiter)) {\n          state.tokenize = previousTokenizer;\n        } else {\n          if (state.escapeNext) {\n            state.escapeNext = false;\n          }\n\n          var ch = stream.next();\n\n          // Take into account the backslash for escaping characters, such as\n          // the string delimiter.\n          if (ch == \"\\\\\") {\n            state.escapeNext = true;\n          }\n        }\n\n        return \"string\";\n      };\n    }\n\n    // Apply Django template variable syntax highlighting\n    function inVariable (stream, state) {\n      // Attempt to match a dot that precedes a property\n      if (state.waitDot) {\n        state.waitDot = false;\n\n        if (stream.peek() != \".\") {\n          return \"null\";\n        }\n\n        // Dot followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\".\")) {\n          state.waitProperty = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for property.\");\n        }\n      }\n\n      // Attempt to match a pipe that precedes a filter\n      if (state.waitPipe) {\n        state.waitPipe = false;\n\n        if (stream.peek() != \"|\") {\n          return \"null\";\n        }\n\n        // Pipe followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\"|\")) {\n          state.waitFilter = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for filter.\");\n        }\n      }\n\n      // Highlight properties\n      if (state.waitProperty) {\n        state.waitProperty = false;\n        if (stream.match(/\\b(\\w+)\\b/)) {\n          state.waitDot = true;  // A property can be followed by another property\n          state.waitPipe = true;  // A property can be followed by a filter\n          return \"property\";\n        }\n      }\n\n      // Highlight filters\n      if (state.waitFilter) {\n          state.waitFilter = false;\n        if (stream.match(filters)) {\n          return \"variable-2\";\n        }\n      }\n\n      // Ignore all white spaces\n      if (stream.eatSpace()) {\n        state.waitProperty = false;\n        return \"null\";\n      }\n\n      // Identify numbers\n      if (stream.match(/\\b\\d+(\\.\\d+)?\\b/)) {\n        return \"number\";\n      }\n\n      // Identify strings\n      if (stream.match(\"'\")) {\n        state.tokenize = inString(\"'\", state.tokenize);\n        return \"string\";\n      } else if (stream.match('\"')) {\n        state.tokenize = inString('\"', state.tokenize);\n        return \"string\";\n      }\n\n      // Attempt to find the variable\n      if (stream.match(/\\b(\\w+)\\b/) && !state.foundVariable) {\n        state.waitDot = true;\n        state.waitPipe = true;  // A property can be followed by a filter\n        return \"variable\";\n      }\n\n      // If found closing tag reset\n      if (stream.match(\"}}\")) {\n        state.waitProperty = null;\n        state.waitFilter = null;\n        state.waitDot = null;\n        state.waitPipe = null;\n        state.tokenize = tokenBase;\n        return \"tag\";\n      }\n\n      // If nothing was found, advance to the next character\n      stream.next();\n      return \"null\";\n    }\n\n    function inTag (stream, state) {\n      // Attempt to match a dot that precedes a property\n      if (state.waitDot) {\n        state.waitDot = false;\n\n        if (stream.peek() != \".\") {\n          return \"null\";\n        }\n\n        // Dot followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\".\")) {\n          state.waitProperty = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for property.\");\n        }\n      }\n\n      // Attempt to match a pipe that precedes a filter\n      if (state.waitPipe) {\n        state.waitPipe = false;\n\n        if (stream.peek() != \"|\") {\n          return \"null\";\n        }\n\n        // Pipe followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\"|\")) {\n          state.waitFilter = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for filter.\");\n        }\n      }\n\n      // Highlight properties\n      if (state.waitProperty) {\n        state.waitProperty = false;\n        if (stream.match(/\\b(\\w+)\\b/)) {\n          state.waitDot = true;  // A property can be followed by another property\n          state.waitPipe = true;  // A property can be followed by a filter\n          return \"property\";\n        }\n      }\n\n      // Highlight filters\n      if (state.waitFilter) {\n          state.waitFilter = false;\n        if (stream.match(filters)) {\n          return \"variable-2\";\n        }\n      }\n\n      // Ignore all white spaces\n      if (stream.eatSpace()) {\n        state.waitProperty = false;\n        return \"null\";\n      }\n\n      // Identify numbers\n      if (stream.match(/\\b\\d+(\\.\\d+)?\\b/)) {\n        return \"number\";\n      }\n\n      // Identify strings\n      if (stream.match(\"'\")) {\n        state.tokenize = inString(\"'\", state.tokenize);\n        return \"string\";\n      } else if (stream.match('\"')) {\n        state.tokenize = inString('\"', state.tokenize);\n        return \"string\";\n      }\n\n      // Attempt to match an operator\n      if (stream.match(operators)) {\n        return \"operator\";\n      }\n\n      // Attempt to match a word operator\n      if (stream.match(wordOperators)) {\n        return \"keyword\";\n      }\n\n      // Attempt to match a keyword\n      var keywordMatch = stream.match(keywords);\n      if (keywordMatch) {\n        if (keywordMatch[0] == \"comment\") {\n          state.blockCommentTag = true;\n        }\n        return \"keyword\";\n      }\n\n      // Attempt to match a variable\n      if (stream.match(/\\b(\\w+)\\b/)) {\n        state.waitDot = true;\n        state.waitPipe = true;  // A property can be followed by a filter\n        return \"variable\";\n      }\n\n      // If found closing tag reset\n      if (stream.match(\"%}\")) {\n        state.waitProperty = null;\n        state.waitFilter = null;\n        state.waitDot = null;\n        state.waitPipe = null;\n        // If the tag that closes is a block comment tag, we want to mark the\n        // following code as comment, until the tag closes.\n        if (state.blockCommentTag) {\n          state.blockCommentTag = false;  // Release the \"lock\"\n          state.tokenize = inBlockComment;\n        } else {\n          state.tokenize = tokenBase;\n        }\n        return \"tag\";\n      }\n\n      // If nothing was found, advance to the next character\n      stream.next();\n      return \"null\";\n    }\n\n    // Mark everything as comment inside the tag and the tag itself.\n    function inComment (stream, state) {\n      if (stream.match(/^.*?#\\}/)) state.tokenize = tokenBase\n      else stream.skipToEnd()\n      return \"comment\";\n    }\n\n    // Mark everything as a comment until the `blockcomment` tag closes.\n    function inBlockComment (stream, state) {\n      if (stream.match(/\\{%\\s*endcomment\\s*%\\}/, false)) {\n        state.tokenize = inTag;\n        stream.match(\"{%\");\n        return \"tag\";\n      } else {\n        stream.next();\n        return \"comment\";\n      }\n    }\n\n    return {\n      startState: function () {\n        return {tokenize: tokenBase};\n      },\n      token: function (stream, state) {\n        return state.tokenize(stream, state);\n      },\n      blockCommentStart: \"{% comment %}\",\n      blockCommentEnd: \"{% endcomment %}\"\n    };\n  });\n\n  CodeMirror.defineMode(\"django\", function(config) {\n    var htmlBase = CodeMirror.getMode(config, \"text/html\");\n    var djangoInner = CodeMirror.getMode(config, \"django:inner\");\n    return CodeMirror.overlayMode(htmlBase, djangoInner);\n  });\n\n  CodeMirror.defineMIME(\"text/x-django\", \"django\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/dockerfile/dockerfile.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var from = \"from\";\n  var fromRegex = new RegExp(\"^(\\\\s*)\\\\b(\" + from + \")\\\\b\", \"i\");\n\n  var shells = [\"run\", \"cmd\", \"entrypoint\", \"shell\"];\n  var shellsAsArrayRegex = new RegExp(\"^(\\\\s*)(\" + shells.join('|') + \")(\\\\s+\\\\[)\", \"i\");\n\n  var expose = \"expose\";\n  var exposeRegex = new RegExp(\"^(\\\\s*)(\" + expose + \")(\\\\s+)\", \"i\");\n\n  var others = [\n    \"arg\", \"from\", \"maintainer\", \"label\", \"env\",\n    \"add\", \"copy\", \"volume\", \"user\",\n    \"workdir\", \"onbuild\", \"stopsignal\", \"healthcheck\", \"shell\"\n  ];\n\n  // Collect all Dockerfile directives\n  var instructions = [from, expose].concat(shells).concat(others),\n      instructionRegex = \"(\" + instructions.join('|') + \")\",\n      instructionOnlyLine = new RegExp(\"^(\\\\s*)\" + instructionRegex + \"(\\\\s*)(#.*)?$\", \"i\"),\n      instructionWithArguments = new RegExp(\"^(\\\\s*)\" + instructionRegex + \"(\\\\s+)\", \"i\");\n\n  CodeMirror.defineSimpleMode(\"dockerfile\", {\n    start: [\n      // Block comment: This is a line starting with a comment\n      {\n        regex: /^\\s*#.*$/,\n        sol: true,\n        token: \"comment\"\n      },\n      {\n        regex: fromRegex,\n        token: [null, \"keyword\"],\n        sol: true,\n        next: \"from\"\n      },\n      // Highlight an instruction without any arguments (for convenience)\n      {\n        regex: instructionOnlyLine,\n        token: [null, \"keyword\", null, \"error\"],\n        sol: true\n      },\n      {\n        regex: shellsAsArrayRegex,\n        token: [null, \"keyword\", null],\n        sol: true,\n        next: \"array\"\n      },\n      {\n        regex: exposeRegex,\n        token: [null, \"keyword\", null],\n        sol: true,\n        next: \"expose\"\n      },\n      // Highlight an instruction followed by arguments\n      {\n        regex: instructionWithArguments,\n        token: [null, \"keyword\", null],\n        sol: true,\n        next: \"arguments\"\n      },\n      {\n        regex: /./,\n        token: null\n      }\n    ],\n    from: [\n      {\n        regex: /\\s*$/,\n        token: null,\n        next: \"start\"\n      },\n      {\n        // Line comment without instruction arguments is an error\n        regex: /(\\s*)(#.*)$/,\n        token: [null, \"error\"],\n        next: \"start\"\n      },\n      {\n        regex: /(\\s*\\S+\\s+)(as)/i,\n        token: [null, \"keyword\"],\n        next: \"start\"\n      },\n      // Fail safe return to start\n      {\n        token: null,\n        next: \"start\"\n      }\n    ],\n    single: [\n      {\n        regex: /(?:[^\\\\']|\\\\.)/,\n        token: \"string\"\n      },\n      {\n        regex: /'/,\n        token: \"string\",\n        pop: true\n      }\n    ],\n    double: [\n      {\n        regex: /(?:[^\\\\\"]|\\\\.)/,\n        token: \"string\"\n      },\n      {\n        regex: /\"/,\n        token: \"string\",\n        pop: true\n      }\n    ],\n    array: [\n      {\n        regex: /\\]/,\n        token: null,\n        next: \"start\"\n      },\n      {\n        regex: /\"(?:[^\\\\\"]|\\\\.)*\"?/,\n        token: \"string\"\n      }\n    ],\n    expose: [\n      {\n        regex: /\\d+$/,\n        token: \"number\",\n        next: \"start\"\n      },\n      {\n        regex: /[^\\d]+$/,\n        token: null,\n        next: \"start\"\n      },\n      {\n        regex: /\\d+/,\n        token: \"number\"\n      },\n      {\n        regex: /[^\\d]+/,\n        token: null\n      },\n      // Fail safe return to start\n      {\n        token: null,\n        next: \"start\"\n      }\n    ],\n    arguments: [\n      {\n        regex: /^\\s*#.*$/,\n        sol: true,\n        token: \"comment\"\n      },\n      {\n        regex: /\"(?:[^\\\\\"]|\\\\.)*\"?$/,\n        token: \"string\",\n        next: \"start\"\n      },\n      {\n        regex: /\"/,\n        token: \"string\",\n        push: \"double\"\n      },\n      {\n        regex: /'(?:[^\\\\']|\\\\.)*'?$/,\n        token: \"string\",\n        next: \"start\"\n      },\n      {\n        regex: /'/,\n        token: \"string\",\n        push: \"single\"\n      },\n      {\n        regex: /[^#\"']+[\\\\`]$/,\n        token: null\n      },\n      {\n        regex: /[^#\"']+$/,\n        token: null,\n        next: \"start\"\n      },\n      {\n        regex: /[^#\"']+/,\n        token: null\n      },\n      // Fail safe return to start\n      {\n        token: null,\n        next: \"start\"\n      }\n    ],\n    meta: {\n      lineComment: \"#\"\n    }\n  });\n\n  CodeMirror.defineMIME(\"text/x-dockerfile\", \"dockerfile\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/dtd/dtd.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\n  DTD mode\n  Ported to CodeMirror by Peter Kroon <plakroon@gmail.com>\n  Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues\n  GitHub: @peterkroon\n*/\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"dtd\", function(config) {\n  var indentUnit = config.indentUnit, type;\n  function ret(style, tp) {type = tp; return style;}\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n\n    if (ch == \"<\" && stream.eat(\"!\") ) {\n      if (stream.eatWhile(/[\\-]/)) {\n        state.tokenize = tokenSGMLComment;\n        return tokenSGMLComment(stream, state);\n      } else if (stream.eatWhile(/[\\w]/)) return ret(\"keyword\", \"doindent\");\n    } else if (ch == \"<\" && stream.eat(\"?\")) { //xml declaration\n      state.tokenize = inBlock(\"meta\", \"?>\");\n      return ret(\"meta\", ch);\n    } else if (ch == \"#\" && stream.eatWhile(/[\\w]/)) return ret(\"atom\", \"tag\");\n    else if (ch == \"|\") return ret(\"keyword\", \"separator\");\n    else if (ch.match(/[\\(\\)\\[\\]\\-\\.,\\+\\?>]/)) return ret(null, ch);//if(ch === \">\") return ret(null, \"endtag\"); else\n    else if (ch.match(/[\\[\\]]/)) return ret(\"rule\", ch);\n    else if (ch == \"\\\"\" || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    } else if (stream.eatWhile(/[a-zA-Z\\?\\+\\d]/)) {\n      var sc = stream.current();\n      if( sc.substr(sc.length-1,sc.length).match(/\\?|\\+/) !== null )stream.backUp(1);\n      return ret(\"tag\", \"tag\");\n    } else if (ch == \"%\" || ch == \"*\" ) return ret(\"number\", \"number\");\n    else {\n      stream.eatWhile(/[\\w\\\\\\-_%.{,]/);\n      return ret(null, null);\n    }\n  }\n\n  function tokenSGMLComment(stream, state) {\n    var dashes = 0, ch;\n    while ((ch = stream.next()) != null) {\n      if (dashes >= 2 && ch == \">\") {\n        state.tokenize = tokenBase;\n        break;\n      }\n      dashes = (ch == \"-\") ? dashes + 1 : 0;\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      return ret(\"string\", \"tag\");\n    };\n  }\n\n  function inBlock(style, terminator) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.match(terminator)) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        stream.next();\n      }\n      return style;\n    };\n  }\n\n  return {\n    startState: function(base) {\n      return {tokenize: tokenBase,\n              baseIndent: base || 0,\n              stack: []};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n\n      var context = state.stack[state.stack.length-1];\n      if (stream.current() == \"[\" || type === \"doindent\" || type == \"[\") state.stack.push(\"rule\");\n      else if (type === \"endtag\") state.stack[state.stack.length-1] = \"endtag\";\n      else if (stream.current() == \"]\" || type == \"]\" || (type == \">\" && context == \"rule\")) state.stack.pop();\n      else if (type == \"[\") state.stack.push(\"[\");\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var n = state.stack.length;\n\n      if( textAfter.charAt(0) === ']' )n--;\n      else if(textAfter.substr(textAfter.length-1, textAfter.length) === \">\"){\n        if(textAfter.substr(0,1) === \"<\") {}\n        else if( type == \"doindent\" && textAfter.length > 1 ) {}\n        else if( type == \"doindent\")n--;\n        else if( type == \">\" && textAfter.length > 1) {}\n        else if( type == \"tag\" && textAfter !== \">\") {}\n        else if( type == \"tag\" && state.stack[state.stack.length-1] == \"rule\")n--;\n        else if( type == \"tag\")n++;\n        else if( textAfter === \">\" && state.stack[state.stack.length-1] == \"rule\" && type === \">\")n--;\n        else if( textAfter === \">\" && state.stack[state.stack.length-1] == \"rule\") {}\n        else if( textAfter.substr(0,1) !== \"<\" && textAfter.substr(0,1) === \">\" )n=n-1;\n        else if( textAfter === \">\") {}\n        else n=n-1;\n        //over rule them all\n        if(type == null || type == \"]\")n--;\n      }\n\n      return state.baseIndent + n * indentUnit;\n    },\n\n    electricChars: \"]>\"\n  };\n});\n\nCodeMirror.defineMIME(\"application/xml-dtd\", \"dtd\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/dylan/dylan.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction forEach(arr, f) {\n  for (var i = 0; i < arr.length; i++) f(arr[i], i)\n}\nfunction some(arr, f) {\n  for (var i = 0; i < arr.length; i++) if (f(arr[i], i)) return true\n  return false\n}\n\nCodeMirror.defineMode(\"dylan\", function(_config) {\n  // Words\n  var words = {\n    // Words that introduce unnamed definitions like \"define interface\"\n    unnamedDefinition: [\"interface\"],\n\n    // Words that introduce simple named definitions like \"define library\"\n    namedDefinition: [\"module\", \"library\", \"macro\",\n                      \"C-struct\", \"C-union\",\n                      \"C-function\", \"C-callable-wrapper\"\n                     ],\n\n    // Words that introduce type definitions like \"define class\".\n    // These are also parameterized like \"define method\" and are\n    // appended to otherParameterizedDefinitionWords\n    typeParameterizedDefinition: [\"class\", \"C-subtype\", \"C-mapped-subtype\"],\n\n    // Words that introduce trickier definitions like \"define method\".\n    // These require special definitions to be added to startExpressions\n    otherParameterizedDefinition: [\"method\", \"function\",\n                                   \"C-variable\", \"C-address\"\n                                  ],\n\n    // Words that introduce module constant definitions.\n    // These must also be simple definitions and are\n    // appended to otherSimpleDefinitionWords\n    constantSimpleDefinition: [\"constant\"],\n\n    // Words that introduce module variable definitions.\n    // These must also be simple definitions and are\n    // appended to otherSimpleDefinitionWords\n    variableSimpleDefinition: [\"variable\"],\n\n    // Other words that introduce simple definitions\n    // (without implicit bodies).\n    otherSimpleDefinition: [\"generic\", \"domain\",\n                            \"C-pointer-type\",\n                            \"table\"\n                           ],\n\n    // Words that begin statements with implicit bodies.\n    statement: [\"if\", \"block\", \"begin\", \"method\", \"case\",\n                \"for\", \"select\", \"when\", \"unless\", \"until\",\n                \"while\", \"iterate\", \"profiling\", \"dynamic-bind\"\n               ],\n\n    // Patterns that act as separators in compound statements.\n    // This may include any general pattern that must be indented\n    // specially.\n    separator: [\"finally\", \"exception\", \"cleanup\", \"else\",\n                \"elseif\", \"afterwards\"\n               ],\n\n    // Keywords that do not require special indentation handling,\n    // but which should be highlighted\n    other: [\"above\", \"below\", \"by\", \"from\", \"handler\", \"in\",\n            \"instance\", \"let\", \"local\", \"otherwise\", \"slot\",\n            \"subclass\", \"then\", \"to\", \"keyed-by\", \"virtual\"\n           ],\n\n    // Condition signaling function calls\n    signalingCalls: [\"signal\", \"error\", \"cerror\",\n                     \"break\", \"check-type\", \"abort\"\n                    ]\n  };\n\n  words[\"otherDefinition\"] =\n    words[\"unnamedDefinition\"]\n    .concat(words[\"namedDefinition\"])\n    .concat(words[\"otherParameterizedDefinition\"]);\n\n  words[\"definition\"] =\n    words[\"typeParameterizedDefinition\"]\n    .concat(words[\"otherDefinition\"]);\n\n  words[\"parameterizedDefinition\"] =\n    words[\"typeParameterizedDefinition\"]\n    .concat(words[\"otherParameterizedDefinition\"]);\n\n  words[\"simpleDefinition\"] =\n    words[\"constantSimpleDefinition\"]\n    .concat(words[\"variableSimpleDefinition\"])\n    .concat(words[\"otherSimpleDefinition\"]);\n\n  words[\"keyword\"] =\n    words[\"statement\"]\n    .concat(words[\"separator\"])\n    .concat(words[\"other\"]);\n\n  // Patterns\n  var symbolPattern = \"[-_a-zA-Z?!*@<>$%]+\";\n  var symbol = new RegExp(\"^\" + symbolPattern);\n  var patterns = {\n    // Symbols with special syntax\n    symbolKeyword: symbolPattern + \":\",\n    symbolClass: \"<\" + symbolPattern + \">\",\n    symbolGlobal: \"\\\\*\" + symbolPattern + \"\\\\*\",\n    symbolConstant: \"\\\\$\" + symbolPattern\n  };\n  var patternStyles = {\n    symbolKeyword: \"atom\",\n    symbolClass: \"tag\",\n    symbolGlobal: \"variable-2\",\n    symbolConstant: \"variable-3\"\n  };\n\n  // Compile all patterns to regular expressions\n  for (var patternName in patterns)\n    if (patterns.hasOwnProperty(patternName))\n      patterns[patternName] = new RegExp(\"^\" + patterns[patternName]);\n\n  // Names beginning \"with-\" and \"without-\" are commonly\n  // used as statement macro\n  patterns[\"keyword\"] = [/^with(?:out)?-[-_a-zA-Z?!*@<>$%]+/];\n\n  var styles = {};\n  styles[\"keyword\"] = \"keyword\";\n  styles[\"definition\"] = \"def\";\n  styles[\"simpleDefinition\"] = \"def\";\n  styles[\"signalingCalls\"] = \"builtin\";\n\n  // protected words lookup table\n  var wordLookup = {};\n  var styleLookup = {};\n\n  forEach([\n    \"keyword\",\n    \"definition\",\n    \"simpleDefinition\",\n    \"signalingCalls\"\n  ], function(type) {\n    forEach(words[type], function(word) {\n      wordLookup[word] = type;\n      styleLookup[word] = styles[type];\n    });\n  });\n\n\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n\n  function tokenBase(stream, state) {\n    // String\n    var ch = stream.peek();\n    if (ch == \"'\" || ch == '\"') {\n      stream.next();\n      return chain(stream, state, tokenString(ch, \"string\"));\n    }\n    // Comment\n    else if (ch == \"/\") {\n      stream.next();\n      if (stream.eat(\"*\")) {\n        return chain(stream, state, tokenComment);\n      } else if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      stream.backUp(1);\n    }\n    // Decimal\n    else if (/[+\\-\\d\\.]/.test(ch)) {\n      if (stream.match(/^[+-]?[0-9]*\\.[0-9]*([esdx][+-]?[0-9]+)?/i) ||\n          stream.match(/^[+-]?[0-9]+([esdx][+-]?[0-9]+)/i) ||\n          stream.match(/^[+-]?\\d+/)) {\n        return \"number\";\n      }\n    }\n    // Hash\n    else if (ch == \"#\") {\n      stream.next();\n      // Symbol with string syntax\n      ch = stream.peek();\n      if (ch == '\"') {\n        stream.next();\n        return chain(stream, state, tokenString('\"', \"string\"));\n      }\n      // Binary number\n      else if (ch == \"b\") {\n        stream.next();\n        stream.eatWhile(/[01]/);\n        return \"number\";\n      }\n      // Hex number\n      else if (ch == \"x\") {\n        stream.next();\n        stream.eatWhile(/[\\da-f]/i);\n        return \"number\";\n      }\n      // Octal number\n      else if (ch == \"o\") {\n        stream.next();\n        stream.eatWhile(/[0-7]/);\n        return \"number\";\n      }\n      // Token concatenation in macros\n      else if (ch == '#') {\n        stream.next();\n        return \"punctuation\";\n      }\n      // Sequence literals\n      else if ((ch == '[') || (ch == '(')) {\n        stream.next();\n        return \"bracket\";\n      // Hash symbol\n      } else if (stream.match(/f|t|all-keys|include|key|next|rest/i)) {\n        return \"atom\";\n      } else {\n        stream.eatWhile(/[-a-zA-Z]/);\n        return \"error\";\n      }\n    } else if (ch == \"~\") {\n      stream.next();\n      ch = stream.peek();\n      if (ch == \"=\") {\n        stream.next();\n        ch = stream.peek();\n        if (ch == \"=\") {\n          stream.next();\n          return \"operator\";\n        }\n        return \"operator\";\n      }\n      return \"operator\";\n    } else if (ch == \":\") {\n      stream.next();\n      ch = stream.peek();\n      if (ch == \"=\") {\n        stream.next();\n        return \"operator\";\n      } else if (ch == \":\") {\n        stream.next();\n        return \"punctuation\";\n      }\n    } else if (\"[](){}\".indexOf(ch) != -1) {\n      stream.next();\n      return \"bracket\";\n    } else if (\".,\".indexOf(ch) != -1) {\n      stream.next();\n      return \"punctuation\";\n    } else if (stream.match(\"end\")) {\n      return \"keyword\";\n    }\n    for (var name in patterns) {\n      if (patterns.hasOwnProperty(name)) {\n        var pattern = patterns[name];\n        if ((pattern instanceof Array && some(pattern, function(p) {\n          return stream.match(p);\n        })) || stream.match(pattern))\n          return patternStyles[name];\n      }\n    }\n    if (/[+\\-*\\/^=<>&|]/.test(ch)) {\n      stream.next();\n      return \"operator\";\n    }\n    if (stream.match(\"define\")) {\n      return \"def\";\n    } else {\n      stream.eatWhile(/[\\w\\-]/);\n      // Keyword\n      if (wordLookup.hasOwnProperty(stream.current())) {\n        return styleLookup[stream.current()];\n      } else if (stream.current().match(symbol)) {\n        return \"variable\";\n      } else {\n        stream.next();\n        return \"variable-2\";\n      }\n    }\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, maybeNested = false, nestedCount = 0, ch;\n    while ((ch = stream.next())) {\n      if (ch == \"/\" && maybeEnd) {\n        if (nestedCount > 0) {\n          nestedCount--;\n        } else {\n          state.tokenize = tokenBase;\n          break;\n        }\n      } else if (ch == \"*\" && maybeNested) {\n        nestedCount++;\n      }\n      maybeEnd = (ch == \"*\");\n      maybeNested = (ch == \"/\");\n    }\n    return \"comment\";\n  }\n\n  function tokenString(quote, style) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n          end = true;\n          break;\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !escaped) {\n        state.tokenize = tokenBase;\n      }\n      return style;\n    };\n  }\n\n  // Interface\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        currentIndent: 0\n      };\n    },\n    token: function(stream, state) {\n      if (stream.eatSpace())\n        return null;\n      var style = state.tokenize(stream, state);\n      return style;\n    },\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-dylan\", \"dylan\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/ebnf/ebnf.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"ebnf\", function (config) {\n    var commentType = {slash: 0, parenthesis: 1};\n    var stateType = {comment: 0, _string: 1, characterClass: 2};\n    var bracesMode = null;\n\n    if (config.bracesMode)\n      bracesMode = CodeMirror.getMode(config, config.bracesMode);\n\n    return {\n      startState: function () {\n        return {\n          stringType: null,\n          commentType: null,\n          braced: 0,\n          lhs: true,\n          localState: null,\n          stack: [],\n          inDefinition: false\n        };\n      },\n      token: function (stream, state) {\n        if (!stream) return;\n\n        //check for state changes\n        if (state.stack.length === 0) {\n          //strings\n          if ((stream.peek() == '\"') || (stream.peek() == \"'\")) {\n            state.stringType = stream.peek();\n            stream.next(); // Skip quote\n            state.stack.unshift(stateType._string);\n          } else if (stream.match('/*')) { //comments starting with /*\n            state.stack.unshift(stateType.comment);\n            state.commentType = commentType.slash;\n          } else if (stream.match('(*')) { //comments starting with (*\n            state.stack.unshift(stateType.comment);\n            state.commentType = commentType.parenthesis;\n          }\n        }\n\n        //return state\n        //stack has\n        switch (state.stack[0]) {\n        case stateType._string:\n          while (state.stack[0] === stateType._string && !stream.eol()) {\n            if (stream.peek() === state.stringType) {\n              stream.next(); // Skip quote\n              state.stack.shift(); // Clear flag\n            } else if (stream.peek() === \"\\\\\") {\n              stream.next();\n              stream.next();\n            } else {\n              stream.match(/^.[^\\\\\\\"\\']*/);\n            }\n          }\n          return state.lhs ? \"property string\" : \"string\"; // Token style\n\n        case stateType.comment:\n          while (state.stack[0] === stateType.comment && !stream.eol()) {\n            if (state.commentType === commentType.slash && stream.match('*/')) {\n              state.stack.shift(); // Clear flag\n              state.commentType = null;\n            } else if (state.commentType === commentType.parenthesis && stream.match('*)')) {\n              state.stack.shift(); // Clear flag\n              state.commentType = null;\n            } else {\n              stream.match(/^.[^\\*]*/);\n            }\n          }\n          return \"comment\";\n\n        case stateType.characterClass:\n          while (state.stack[0] === stateType.characterClass && !stream.eol()) {\n            if (!(stream.match(/^[^\\]\\\\]+/) || stream.match('.'))) {\n              state.stack.shift();\n            }\n          }\n          return \"operator\";\n        }\n\n        var peek = stream.peek();\n\n        if (bracesMode !== null && (state.braced || peek === \"{\")) {\n          if (state.localState === null)\n            state.localState = CodeMirror.startState(bracesMode);\n\n          var token = bracesMode.token(stream, state.localState),\n          text = stream.current();\n\n          if (!token) {\n            for (var i = 0; i < text.length; i++) {\n              if (text[i] === \"{\") {\n                if (state.braced === 0) {\n                  token = \"matchingbracket\";\n                }\n                state.braced++;\n              } else if (text[i] === \"}\") {\n                state.braced--;\n                if (state.braced === 0) {\n                  token = \"matchingbracket\";\n                }\n              }\n            }\n          }\n          return token;\n        }\n\n        //no stack\n        switch (peek) {\n        case \"[\":\n          stream.next();\n          state.stack.unshift(stateType.characterClass);\n          return \"bracket\";\n        case \":\":\n        case \"|\":\n        case \";\":\n          stream.next();\n          return \"operator\";\n        case \"%\":\n          if (stream.match(\"%%\")) {\n            return \"header\";\n          } else if (stream.match(/[%][A-Za-z]+/)) {\n            return \"keyword\";\n          } else if (stream.match(/[%][}]/)) {\n            return \"matchingbracket\";\n          }\n          break;\n        case \"/\":\n          if (stream.match(/[\\/][A-Za-z]+/)) {\n          return \"keyword\";\n        }\n        case \"\\\\\":\n          if (stream.match(/[\\][a-z]+/)) {\n            return \"string-2\";\n          }\n        case \".\":\n          if (stream.match(\".\")) {\n            return \"atom\";\n          }\n        case \"*\":\n        case \"-\":\n        case \"+\":\n        case \"^\":\n          if (stream.match(peek)) {\n            return \"atom\";\n          }\n        case \"$\":\n          if (stream.match(\"$$\")) {\n            return \"builtin\";\n          } else if (stream.match(/[$][0-9]+/)) {\n            return \"variable-3\";\n          }\n        case \"<\":\n          if (stream.match(/<<[a-zA-Z_]+>>/)) {\n            return \"builtin\";\n          }\n        }\n\n        if (stream.match('//')) {\n          stream.skipToEnd();\n          return \"comment\";\n        } else if (stream.match('return')) {\n          return \"operator\";\n        } else if (stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)) {\n          if (stream.match(/(?=[\\(.])/)) {\n            return \"variable\";\n          } else if (stream.match(/(?=[\\s\\n]*[:=])/)) {\n            return \"def\";\n          }\n          return \"variable-2\";\n        } else if ([\"[\", \"]\", \"(\", \")\"].indexOf(stream.peek()) != -1) {\n          stream.next();\n          return \"bracket\";\n        } else if (!stream.eatSpace()) {\n          stream.next();\n        }\n        return null;\n      }\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-ebnf\", \"ebnf\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/ecl/ecl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"ecl\", function(config) {\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  function metaHook(stream, state) {\n    if (!state.startOfLine) return false;\n    stream.skipToEnd();\n    return \"meta\";\n  }\n\n  var indentUnit = config.indentUnit;\n  var keyword = words(\"abs acos allnodes ascii asin asstring atan atan2 ave case choose choosen choosesets clustersize combine correlation cos cosh count covariance cron dataset dedup define denormalize distribute distributed distribution ebcdic enth error evaluate event eventextra eventname exists exp failcode failmessage fetch fromunicode getisvalid global graph group hash hash32 hash64 hashcrc hashmd5 having if index intformat isvalid iterate join keyunicode length library limit ln local log loop map matched matchlength matchposition matchtext matchunicode max merge mergejoin min nolocal nonempty normalize parse pipe power preload process project pull random range rank ranked realformat recordof regexfind regexreplace regroup rejected rollup round roundup row rowdiff sample set sin sinh sizeof soapcall sort sorted sqrt stepped stored sum table tan tanh thisnode topn tounicode transfer trim truncate typeof ungroup unicodeorder variance which workunit xmldecode xmlencode xmltext xmlunicode\");\n  var variable = words(\"apply assert build buildindex evaluate fail keydiff keypatch loadxml nothor notify output parallel sequential soapcall wait\");\n  var variable_2 = words(\"__compressed__ all and any as atmost before beginc++ best between case const counter csv descend encrypt end endc++ endmacro except exclusive expire export extend false few first flat from full function group header heading hole ifblock import in interface joined keep keyed last left limit load local locale lookup macro many maxcount maxlength min skew module named nocase noroot noscan nosort not of only opt or outer overwrite packed partition penalty physicallength pipe quote record relationship repeat return right scan self separator service shared skew skip sql store terminator thor threshold token transform trim true type unicodeorder unsorted validate virtual whole wild within xml xpath\");\n  var variable_3 = words(\"ascii big_endian boolean data decimal ebcdic integer pattern qstring real record rule set of string token udecimal unicode unsigned varstring varunicode\");\n  var builtin = words(\"checkpoint deprecated failcode failmessage failure global independent onwarning persist priority recovery stored success wait when\");\n  var blockKeywords = words(\"catch class do else finally for if switch try while\");\n  var atoms = words(\"true false null\");\n  var hooks = {\"#\": metaHook};\n  var isOperatorChar = /[+\\-*&%=<>!?|\\/]/;\n\n  var curPunc;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (hooks[ch]) {\n      var result = hooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_]/);\n    var cur = stream.current().toLowerCase();\n    if (keyword.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"keyword\";\n    } else if (variable.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"variable\";\n    } else if (variable_2.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"variable-2\";\n    } else if (variable_3.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"variable-3\";\n    } else if (builtin.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"builtin\";\n    } else { //Data types are of from KEYWORD##\n                var i = cur.length - 1;\n                while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_'))\n                        --i;\n\n                if (i > 0) {\n                        var cur2 = cur.substr(0, i + 1);\n                if (variable_3.propertyIsEnumerable(cur2)) {\n                        if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = \"newstatement\";\n                        return \"variable-3\";\n                }\n            }\n    }\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return null;\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !escaped)\n        state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type) {\n    return state.context = new Context(state.indented, col, type, null, state.context);\n  }\n  function popContext(state) {\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if ((curPunc == \";\" || curPunc == \":\") && ctx.type == \"statement\") popContext(state);\n      else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"}\") {\n        while (ctx.type == \"statement\") ctx = popContext(state);\n        if (ctx.type == \"}\") ctx = popContext(state);\n        while (ctx.type == \"statement\") ctx = popContext(state);\n      }\n      else if (curPunc == ctx.type) popContext(state);\n      else if (ctx.type == \"}\" || ctx.type == \"top\" || (ctx.type == \"statement\" && curPunc == \"newstatement\"))\n        pushContext(state, stream.column(), \"statement\");\n      state.startOfLine = false;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return 0;\n      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n      if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n      var closing = firstChar == ctx.type;\n      if (ctx.type == \"statement\") return ctx.indented + (firstChar == \"{\" ? 0 : indentUnit);\n      else if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"{}\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-ecl\", \"ecl\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/eiffel/eiffel.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"eiffel\", function() {\n  function wordObj(words) {\n    var o = {};\n    for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true;\n    return o;\n  }\n  var keywords = wordObj([\n    'note',\n    'across',\n    'when',\n    'variant',\n    'until',\n    'unique',\n    'undefine',\n    'then',\n    'strip',\n    'select',\n    'retry',\n    'rescue',\n    'require',\n    'rename',\n    'reference',\n    'redefine',\n    'prefix',\n    'once',\n    'old',\n    'obsolete',\n    'loop',\n    'local',\n    'like',\n    'is',\n    'inspect',\n    'infix',\n    'include',\n    'if',\n    'frozen',\n    'from',\n    'external',\n    'export',\n    'ensure',\n    'end',\n    'elseif',\n    'else',\n    'do',\n    'creation',\n    'create',\n    'check',\n    'alias',\n    'agent',\n    'separate',\n    'invariant',\n    'inherit',\n    'indexing',\n    'feature',\n    'expanded',\n    'deferred',\n    'class',\n    'Void',\n    'True',\n    'Result',\n    'Precursor',\n    'False',\n    'Current',\n    'create',\n    'attached',\n    'detachable',\n    'as',\n    'and',\n    'implies',\n    'not',\n    'or'\n  ]);\n  var operators = wordObj([\":=\", \"and then\",\"and\", \"or\",\"<<\",\">>\"]);\n\n  function chain(newtok, stream, state) {\n    state.tokenize.push(newtok);\n    return newtok(stream, state);\n  }\n\n  function tokenBase(stream, state) {\n    if (stream.eatSpace()) return null;\n    var ch = stream.next();\n    if (ch == '\"'||ch == \"'\") {\n      return chain(readQuoted(ch, \"string\"), stream, state);\n    } else if (ch == \"-\"&&stream.eat(\"-\")) {\n      stream.skipToEnd();\n      return \"comment\";\n    } else if (ch == \":\"&&stream.eat(\"=\")) {\n      return \"operator\";\n    } else if (/[0-9]/.test(ch)) {\n      stream.eatWhile(/[xXbBCc0-9\\.]/);\n      stream.eat(/[\\?\\!]/);\n      return \"ident\";\n    } else if (/[a-zA-Z_0-9]/.test(ch)) {\n      stream.eatWhile(/[a-zA-Z_0-9]/);\n      stream.eat(/[\\?\\!]/);\n      return \"ident\";\n    } else if (/[=+\\-\\/*^%<>~]/.test(ch)) {\n      stream.eatWhile(/[=+\\-\\/*^%<>~]/);\n      return \"operator\";\n    } else {\n      return null;\n    }\n  }\n\n  function readQuoted(quote, style,  unescaped) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && (unescaped || !escaped)) {\n          state.tokenize.pop();\n          break;\n        }\n        escaped = !escaped && ch == \"%\";\n      }\n      return style;\n    };\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: [tokenBase]};\n    },\n\n    token: function(stream, state) {\n      var style = state.tokenize[state.tokenize.length-1](stream, state);\n      if (style == \"ident\") {\n        var word = stream.current();\n        style = keywords.propertyIsEnumerable(stream.current()) ? \"keyword\"\n          : operators.propertyIsEnumerable(stream.current()) ? \"operator\"\n          : /^[A-Z][A-Z_0-9]*$/g.test(word) ? \"tag\"\n          : /^0[bB][0-1]+$/g.test(word) ? \"number\"\n          : /^0[cC][0-7]+$/g.test(word) ? \"number\"\n          : /^0[xX][a-fA-F0-9]+$/g.test(word) ? \"number\"\n          : /^([0-9]+\\.[0-9]*)|([0-9]*\\.[0-9]+)$/g.test(word) ? \"number\"\n          : /^[0-9]+$/g.test(word) ? \"number\"\n          : \"variable\";\n      }\n      return style;\n    },\n    lineComment: \"--\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-eiffel\", \"eiffel\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/elm/elm.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"elm\", function() {\n\n    function switchState(source, setState, f)\n    {\n      setState(f);\n      return f(source, setState);\n    }\n\n    var lowerRE = /[a-z]/;\n    var upperRE = /[A-Z]/;\n    var innerRE = /[a-zA-Z0-9_]/;\n\n    var digitRE = /[0-9]/;\n    var hexRE = /[0-9A-Fa-f]/;\n    var symbolRE = /[-&*+.\\\\/<>=?^|:]/;\n    var specialRE = /[(),[\\]{}]/;\n    var spacesRE = /[ \\v\\f]/; // newlines are handled in tokenizer\n\n    function normal()\n    {\n      return function(source, setState)\n      {\n        if (source.eatWhile(spacesRE))\n        {\n          return null;\n        }\n\n        var char = source.next();\n\n        if (specialRE.test(char))\n        {\n          return (char === '{' && source.eat('-'))\n            ? switchState(source, setState, chompMultiComment(1))\n            : (char === '[' && source.match('glsl|'))\n                ? switchState(source, setState, chompGlsl)\n                : 'builtin';\n        }\n\n        if (char === '\\'')\n        {\n          return switchState(source, setState, chompChar);\n        }\n\n        if (char === '\"')\n        {\n          return source.eat('\"')\n            ? source.eat('\"')\n                ? switchState(source, setState, chompMultiString)\n                : 'string'\n            : switchState(source, setState, chompSingleString);\n        }\n\n        if (upperRE.test(char))\n        {\n          source.eatWhile(innerRE);\n          return 'variable-2';\n        }\n\n        if (lowerRE.test(char))\n        {\n          var isDef = source.pos === 1;\n          source.eatWhile(innerRE);\n          return isDef ? \"def\" : \"variable\";\n        }\n\n        if (digitRE.test(char))\n        {\n          if (char === '0')\n          {\n            if (source.eat(/[xX]/))\n            {\n              source.eatWhile(hexRE); // should require at least 1\n              return \"number\";\n            }\n          }\n          else\n          {\n            source.eatWhile(digitRE);\n          }\n          if (source.eat('.'))\n          {\n            source.eatWhile(digitRE); // should require at least 1\n          }\n          if (source.eat(/[eE]/))\n          {\n            source.eat(/[-+]/);\n            source.eatWhile(digitRE); // should require at least 1\n          }\n          return \"number\";\n        }\n\n        if (symbolRE.test(char))\n        {\n          if (char === '-' && source.eat('-'))\n          {\n            source.skipToEnd();\n            return \"comment\";\n          }\n          source.eatWhile(symbolRE);\n          return \"keyword\";\n        }\n\n        if (char === '_')\n        {\n          return \"keyword\";\n        }\n\n        return \"error\";\n      }\n    }\n\n    function chompMultiComment(nest)\n    {\n      if (nest == 0)\n      {\n        return normal();\n      }\n      return function(source, setState)\n      {\n        while (!source.eol())\n        {\n          var char = source.next();\n          if (char == '{' && source.eat('-'))\n          {\n            ++nest;\n          }\n          else if (char == '-' && source.eat('}'))\n          {\n            --nest;\n            if (nest === 0)\n            {\n              setState(normal());\n              return 'comment';\n            }\n          }\n        }\n        setState(chompMultiComment(nest));\n        return 'comment';\n      }\n    }\n\n    function chompMultiString(source, setState)\n    {\n      while (!source.eol())\n      {\n        var char = source.next();\n        if (char === '\"' && source.eat('\"') && source.eat('\"'))\n        {\n          setState(normal());\n          return 'string';\n        }\n      }\n      return 'string';\n    }\n\n    function chompSingleString(source, setState)\n    {\n      while (source.skipTo('\\\\\"')) { source.next(); source.next(); }\n      if (source.skipTo('\"'))\n      {\n        source.next();\n        setState(normal());\n        return 'string';\n      }\n      source.skipToEnd();\n      setState(normal());\n      return 'error';\n    }\n\n    function chompChar(source, setState)\n    {\n      while (source.skipTo(\"\\\\'\")) { source.next(); source.next(); }\n      if (source.skipTo(\"'\"))\n      {\n        source.next();\n        setState(normal());\n        return 'string';\n      }\n      source.skipToEnd();\n      setState(normal());\n      return 'error';\n    }\n\n    function chompGlsl(source, setState)\n    {\n      while (!source.eol())\n      {\n        var char = source.next();\n        if (char === '|' && source.eat(']'))\n        {\n          setState(normal());\n          return 'string';\n        }\n      }\n      return 'string';\n    }\n\n    var wellKnownWords = {\n      case: 1,\n      of: 1,\n      as: 1,\n      if: 1,\n      then: 1,\n      else: 1,\n      let: 1,\n      in: 1,\n      type: 1,\n      alias: 1,\n      module: 1,\n      where: 1,\n      import: 1,\n      exposing: 1,\n      port: 1\n    };\n\n    return {\n      startState: function ()  { return { f: normal() }; },\n      copyState:  function (s) { return { f: s.f }; },\n\n      token: function(stream, state) {\n        var type = state.f(stream, function(s) { state.f = s; });\n        var word = stream.current();\n        return (wellKnownWords.hasOwnProperty(word)) ? 'keyword' : type;\n      }\n    };\n\n  });\n\n  CodeMirror.defineMIME(\"text/x-elm\", \"elm\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/erlang/erlang.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*jshint unused:true, eqnull:true, curly:true, bitwise:true */\n/*jshint undef:true, latedef:true, trailing:true */\n/*global CodeMirror:true */\n\n// erlang mode.\n// tokenizer -> token types -> CodeMirror styles\n// tokenizer maintains a parse stack\n// indenter uses the parse stack\n\n// TODO indenter:\n//   bit syntax\n//   old guard/bif/conversion clashes (e.g. \"float/1\")\n//   type/spec/opaque\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMIME(\"text/x-erlang\", \"erlang\");\n\nCodeMirror.defineMode(\"erlang\", function(cmCfg) {\n  \"use strict\";\n\n/////////////////////////////////////////////////////////////////////////////\n// constants\n\n  var typeWords = [\n    \"-type\", \"-spec\", \"-export_type\", \"-opaque\"];\n\n  var keywordWords = [\n    \"after\",\"begin\",\"catch\",\"case\",\"cond\",\"end\",\"fun\",\"if\",\n    \"let\",\"of\",\"query\",\"receive\",\"try\",\"when\"];\n\n  var separatorRE    = /[\\->,;]/;\n  var separatorWords = [\n    \"->\",\";\",\",\"];\n\n  var operatorAtomWords = [\n    \"and\",\"andalso\",\"band\",\"bnot\",\"bor\",\"bsl\",\"bsr\",\"bxor\",\n    \"div\",\"not\",\"or\",\"orelse\",\"rem\",\"xor\"];\n\n  var operatorSymbolRE    = /[\\+\\-\\*\\/<>=\\|:!]/;\n  var operatorSymbolWords = [\n    \"=\",\"+\",\"-\",\"*\",\"/\",\">\",\">=\",\"<\",\"=<\",\"=:=\",\"==\",\"=/=\",\"/=\",\"||\",\"<-\",\"!\"];\n\n  var openParenRE    = /[<\\(\\[\\{]/;\n  var openParenWords = [\n    \"<<\",\"(\",\"[\",\"{\"];\n\n  var closeParenRE    = /[>\\)\\]\\}]/;\n  var closeParenWords = [\n    \"}\",\"]\",\")\",\">>\"];\n\n  var guardWords = [\n    \"is_atom\",\"is_binary\",\"is_bitstring\",\"is_boolean\",\"is_float\",\n    \"is_function\",\"is_integer\",\"is_list\",\"is_number\",\"is_pid\",\n    \"is_port\",\"is_record\",\"is_reference\",\"is_tuple\",\n    \"atom\",\"binary\",\"bitstring\",\"boolean\",\"function\",\"integer\",\"list\",\n    \"number\",\"pid\",\"port\",\"record\",\"reference\",\"tuple\"];\n\n  var bifWords = [\n    \"abs\",\"adler32\",\"adler32_combine\",\"alive\",\"apply\",\"atom_to_binary\",\n    \"atom_to_list\",\"binary_to_atom\",\"binary_to_existing_atom\",\n    \"binary_to_list\",\"binary_to_term\",\"bit_size\",\"bitstring_to_list\",\n    \"byte_size\",\"check_process_code\",\"contact_binary\",\"crc32\",\n    \"crc32_combine\",\"date\",\"decode_packet\",\"delete_module\",\n    \"disconnect_node\",\"element\",\"erase\",\"exit\",\"float\",\"float_to_list\",\n    \"garbage_collect\",\"get\",\"get_keys\",\"group_leader\",\"halt\",\"hd\",\n    \"integer_to_list\",\"internal_bif\",\"iolist_size\",\"iolist_to_binary\",\n    \"is_alive\",\"is_atom\",\"is_binary\",\"is_bitstring\",\"is_boolean\",\n    \"is_float\",\"is_function\",\"is_integer\",\"is_list\",\"is_number\",\"is_pid\",\n    \"is_port\",\"is_process_alive\",\"is_record\",\"is_reference\",\"is_tuple\",\n    \"length\",\"link\",\"list_to_atom\",\"list_to_binary\",\"list_to_bitstring\",\n    \"list_to_existing_atom\",\"list_to_float\",\"list_to_integer\",\n    \"list_to_pid\",\"list_to_tuple\",\"load_module\",\"make_ref\",\"module_loaded\",\n    \"monitor_node\",\"node\",\"node_link\",\"node_unlink\",\"nodes\",\"notalive\",\n    \"now\",\"open_port\",\"pid_to_list\",\"port_close\",\"port_command\",\n    \"port_connect\",\"port_control\",\"pre_loaded\",\"process_flag\",\n    \"process_info\",\"processes\",\"purge_module\",\"put\",\"register\",\n    \"registered\",\"round\",\"self\",\"setelement\",\"size\",\"spawn\",\"spawn_link\",\n    \"spawn_monitor\",\"spawn_opt\",\"split_binary\",\"statistics\",\n    \"term_to_binary\",\"time\",\"throw\",\"tl\",\"trunc\",\"tuple_size\",\n    \"tuple_to_list\",\"unlink\",\"unregister\",\"whereis\"];\n\n// upper case: [A-Z] [Ø-Þ] [À-Ö]\n// lower case: [a-z] [ß-ö] [ø-ÿ]\n  var anumRE       = /[\\w@Ø-ÞÀ-Öß-öø-ÿ]/;\n  var escapesRE    =\n    /[0-7]{1,3}|[bdefnrstv\\\\\"']|\\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/;\n\n/////////////////////////////////////////////////////////////////////////////\n// tokenizer\n\n  function tokenizer(stream,state) {\n    // in multi-line string\n    if (state.in_string) {\n      state.in_string = (!doubleQuote(stream));\n      return rval(state,stream,\"string\");\n    }\n\n    // in multi-line atom\n    if (state.in_atom) {\n      state.in_atom = (!singleQuote(stream));\n      return rval(state,stream,\"atom\");\n    }\n\n    // whitespace\n    if (stream.eatSpace()) {\n      return rval(state,stream,\"whitespace\");\n    }\n\n    // attributes and type specs\n    if (!peekToken(state) &&\n        stream.match(/-\\s*[a-zß-öø-ÿ][\\wØ-ÞÀ-Öß-öø-ÿ]*/)) {\n      if (is_member(stream.current(),typeWords)) {\n        return rval(state,stream,\"type\");\n      }else{\n        return rval(state,stream,\"attribute\");\n      }\n    }\n\n    var ch = stream.next();\n\n    // comment\n    if (ch == '%') {\n      stream.skipToEnd();\n      return rval(state,stream,\"comment\");\n    }\n\n    // colon\n    if (ch == \":\") {\n      return rval(state,stream,\"colon\");\n    }\n\n    // macro\n    if (ch == '?') {\n      stream.eatSpace();\n      stream.eatWhile(anumRE);\n      return rval(state,stream,\"macro\");\n    }\n\n    // record\n    if (ch == \"#\") {\n      stream.eatSpace();\n      stream.eatWhile(anumRE);\n      return rval(state,stream,\"record\");\n    }\n\n    // dollar escape\n    if (ch == \"$\") {\n      if (stream.next() == \"\\\\\" && !stream.match(escapesRE)) {\n        return rval(state,stream,\"error\");\n      }\n      return rval(state,stream,\"number\");\n    }\n\n    // dot\n    if (ch == \".\") {\n      return rval(state,stream,\"dot\");\n    }\n\n    // quoted atom\n    if (ch == '\\'') {\n      if (!(state.in_atom = (!singleQuote(stream)))) {\n        if (stream.match(/\\s*\\/\\s*[0-9]/,false)) {\n          stream.match(/\\s*\\/\\s*[0-9]/,true);\n          return rval(state,stream,\"fun\");      // 'f'/0 style fun\n        }\n        if (stream.match(/\\s*\\(/,false) || stream.match(/\\s*:/,false)) {\n          return rval(state,stream,\"function\");\n        }\n      }\n      return rval(state,stream,\"atom\");\n    }\n\n    // string\n    if (ch == '\"') {\n      state.in_string = (!doubleQuote(stream));\n      return rval(state,stream,\"string\");\n    }\n\n    // variable\n    if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) {\n      stream.eatWhile(anumRE);\n      return rval(state,stream,\"variable\");\n    }\n\n    // atom/keyword/BIF/function\n    if (/[a-z_ß-öø-ÿ]/.test(ch)) {\n      stream.eatWhile(anumRE);\n\n      if (stream.match(/\\s*\\/\\s*[0-9]/,false)) {\n        stream.match(/\\s*\\/\\s*[0-9]/,true);\n        return rval(state,stream,\"fun\");      // f/0 style fun\n      }\n\n      var w = stream.current();\n\n      if (is_member(w,keywordWords)) {\n        return rval(state,stream,\"keyword\");\n      }else if (is_member(w,operatorAtomWords)) {\n        return rval(state,stream,\"operator\");\n      }else if (stream.match(/\\s*\\(/,false)) {\n        // 'put' and 'erlang:put' are bifs, 'foo:put' is not\n        if (is_member(w,bifWords) &&\n            ((peekToken(state).token != \":\") ||\n             (peekToken(state,2).token == \"erlang\"))) {\n          return rval(state,stream,\"builtin\");\n        }else if (is_member(w,guardWords)) {\n          return rval(state,stream,\"guard\");\n        }else{\n          return rval(state,stream,\"function\");\n        }\n      }else if (lookahead(stream) == \":\") {\n        if (w == \"erlang\") {\n          return rval(state,stream,\"builtin\");\n        } else {\n          return rval(state,stream,\"function\");\n        }\n      }else if (is_member(w,[\"true\",\"false\"])) {\n        return rval(state,stream,\"boolean\");\n      }else{\n        return rval(state,stream,\"atom\");\n      }\n    }\n\n    // number\n    var digitRE      = /[0-9]/;\n    var radixRE      = /[0-9a-zA-Z]/;         // 36#zZ style int\n    if (digitRE.test(ch)) {\n      stream.eatWhile(digitRE);\n      if (stream.eat('#')) {                // 36#aZ  style integer\n        if (!stream.eatWhile(radixRE)) {\n          stream.backUp(1);                 //\"36#\" - syntax error\n        }\n      } else if (stream.eat('.')) {       // float\n        if (!stream.eatWhile(digitRE)) {\n          stream.backUp(1);        // \"3.\" - probably end of function\n        } else {\n          if (stream.eat(/[eE]/)) {        // float with exponent\n            if (stream.eat(/[-+]/)) {\n              if (!stream.eatWhile(digitRE)) {\n                stream.backUp(2);            // \"2e-\" - syntax error\n              }\n            } else {\n              if (!stream.eatWhile(digitRE)) {\n                stream.backUp(1);            // \"2e\" - syntax error\n              }\n            }\n          }\n        }\n      }\n      return rval(state,stream,\"number\");   // normal integer\n    }\n\n    // open parens\n    if (nongreedy(stream,openParenRE,openParenWords)) {\n      return rval(state,stream,\"open_paren\");\n    }\n\n    // close parens\n    if (nongreedy(stream,closeParenRE,closeParenWords)) {\n      return rval(state,stream,\"close_paren\");\n    }\n\n    // separators\n    if (greedy(stream,separatorRE,separatorWords)) {\n      return rval(state,stream,\"separator\");\n    }\n\n    // operators\n    if (greedy(stream,operatorSymbolRE,operatorSymbolWords)) {\n      return rval(state,stream,\"operator\");\n    }\n\n    return rval(state,stream,null);\n  }\n\n/////////////////////////////////////////////////////////////////////////////\n// utilities\n  function nongreedy(stream,re,words) {\n    if (stream.current().length == 1 && re.test(stream.current())) {\n      stream.backUp(1);\n      while (re.test(stream.peek())) {\n        stream.next();\n        if (is_member(stream.current(),words)) {\n          return true;\n        }\n      }\n      stream.backUp(stream.current().length-1);\n    }\n    return false;\n  }\n\n  function greedy(stream,re,words) {\n    if (stream.current().length == 1 && re.test(stream.current())) {\n      while (re.test(stream.peek())) {\n        stream.next();\n      }\n      while (0 < stream.current().length) {\n        if (is_member(stream.current(),words)) {\n          return true;\n        }else{\n          stream.backUp(1);\n        }\n      }\n      stream.next();\n    }\n    return false;\n  }\n\n  function doubleQuote(stream) {\n    return quote(stream, '\"', '\\\\');\n  }\n\n  function singleQuote(stream) {\n    return quote(stream,'\\'','\\\\');\n  }\n\n  function quote(stream,quoteChar,escapeChar) {\n    while (!stream.eol()) {\n      var ch = stream.next();\n      if (ch == quoteChar) {\n        return true;\n      }else if (ch == escapeChar) {\n        stream.next();\n      }\n    }\n    return false;\n  }\n\n  function lookahead(stream) {\n    var m = stream.match(/^\\s*([^\\s%])/, false)\n    return m ? m[1] : \"\";\n  }\n\n  function is_member(element,list) {\n    return (-1 < list.indexOf(element));\n  }\n\n  function rval(state,stream,type) {\n\n    // parse stack\n    pushToken(state,realToken(type,stream));\n\n    // map erlang token type to CodeMirror style class\n    //     erlang             -> CodeMirror tag\n    switch (type) {\n      case \"atom\":        return \"atom\";\n      case \"attribute\":   return \"attribute\";\n      case \"boolean\":     return \"atom\";\n      case \"builtin\":     return \"builtin\";\n      case \"close_paren\": return null;\n      case \"colon\":       return null;\n      case \"comment\":     return \"comment\";\n      case \"dot\":         return null;\n      case \"error\":       return \"error\";\n      case \"fun\":         return \"meta\";\n      case \"function\":    return \"tag\";\n      case \"guard\":       return \"property\";\n      case \"keyword\":     return \"keyword\";\n      case \"macro\":       return \"variable-2\";\n      case \"number\":      return \"number\";\n      case \"open_paren\":  return null;\n      case \"operator\":    return \"operator\";\n      case \"record\":      return \"bracket\";\n      case \"separator\":   return null;\n      case \"string\":      return \"string\";\n      case \"type\":        return \"def\";\n      case \"variable\":    return \"variable\";\n      default:            return null;\n    }\n  }\n\n  function aToken(tok,col,ind,typ) {\n    return {token:  tok,\n            column: col,\n            indent: ind,\n            type:   typ};\n  }\n\n  function realToken(type,stream) {\n    return aToken(stream.current(),\n                 stream.column(),\n                 stream.indentation(),\n                 type);\n  }\n\n  function fakeToken(type) {\n    return aToken(type,0,0,type);\n  }\n\n  function peekToken(state,depth) {\n    var len = state.tokenStack.length;\n    var dep = (depth ? depth : 1);\n\n    if (len < dep) {\n      return false;\n    }else{\n      return state.tokenStack[len-dep];\n    }\n  }\n\n  function pushToken(state,token) {\n\n    if (!(token.type == \"comment\" || token.type == \"whitespace\")) {\n      state.tokenStack = maybe_drop_pre(state.tokenStack,token);\n      state.tokenStack = maybe_drop_post(state.tokenStack);\n    }\n  }\n\n  function maybe_drop_pre(s,token) {\n    var last = s.length-1;\n\n    if (0 < last && s[last].type === \"record\" && token.type === \"dot\") {\n      s.pop();\n    }else if (0 < last && s[last].type === \"group\") {\n      s.pop();\n      s.push(token);\n    }else{\n      s.push(token);\n    }\n    return s;\n  }\n\n  function maybe_drop_post(s) {\n    if (!s.length) return s\n    var last = s.length-1;\n\n    if (s[last].type === \"dot\") {\n      return [];\n    }\n    if (last > 1 && s[last].type === \"fun\" && s[last-1].token === \"fun\") {\n      return s.slice(0,last-1);\n    }\n    switch (s[last].token) {\n      case \"}\":    return d(s,{g:[\"{\"]});\n      case \"]\":    return d(s,{i:[\"[\"]});\n      case \")\":    return d(s,{i:[\"(\"]});\n      case \">>\":   return d(s,{i:[\"<<\"]});\n      case \"end\":  return d(s,{i:[\"begin\",\"case\",\"fun\",\"if\",\"receive\",\"try\"]});\n      case \",\":    return d(s,{e:[\"begin\",\"try\",\"when\",\"->\",\n                                  \",\",\"(\",\"[\",\"{\",\"<<\"]});\n      case \"->\":   return d(s,{r:[\"when\"],\n                               m:[\"try\",\"if\",\"case\",\"receive\"]});\n      case \";\":    return d(s,{E:[\"case\",\"fun\",\"if\",\"receive\",\"try\",\"when\"]});\n      case \"catch\":return d(s,{e:[\"try\"]});\n      case \"of\":   return d(s,{e:[\"case\"]});\n      case \"after\":return d(s,{e:[\"receive\",\"try\"]});\n      default:     return s;\n    }\n  }\n\n  function d(stack,tt) {\n    // stack is a stack of Token objects.\n    // tt is an object; {type:tokens}\n    // type is a char, tokens is a list of token strings.\n    // The function returns (possibly truncated) stack.\n    // It will descend the stack, looking for a Token such that Token.token\n    //  is a member of tokens. If it does not find that, it will normally (but\n    //  see \"E\" below) return stack. If it does find a match, it will remove\n    //  all the Tokens between the top and the matched Token.\n    // If type is \"m\", that is all it does.\n    // If type is \"i\", it will also remove the matched Token and the top Token.\n    // If type is \"g\", like \"i\", but add a fake \"group\" token at the top.\n    // If type is \"r\", it will remove the matched Token, but not the top Token.\n    // If type is \"e\", it will keep the matched Token but not the top Token.\n    // If type is \"E\", it behaves as for type \"e\", except if there is no match,\n    //  in which case it will return an empty stack.\n\n    for (var type in tt) {\n      var len = stack.length-1;\n      var tokens = tt[type];\n      for (var i = len-1; -1 < i ; i--) {\n        if (is_member(stack[i].token,tokens)) {\n          var ss = stack.slice(0,i);\n          switch (type) {\n              case \"m\": return ss.concat(stack[i]).concat(stack[len]);\n              case \"r\": return ss.concat(stack[len]);\n              case \"i\": return ss;\n              case \"g\": return ss.concat(fakeToken(\"group\"));\n              case \"E\": return ss.concat(stack[i]);\n              case \"e\": return ss.concat(stack[i]);\n          }\n        }\n      }\n    }\n    return (type == \"E\" ? [] : stack);\n  }\n\n/////////////////////////////////////////////////////////////////////////////\n// indenter\n\n  function indenter(state,textAfter) {\n    var t;\n    var unit = cmCfg.indentUnit;\n    var wordAfter = wordafter(textAfter);\n    var currT = peekToken(state,1);\n    var prevT = peekToken(state,2);\n\n    if (state.in_string || state.in_atom) {\n      return CodeMirror.Pass;\n    }else if (!prevT) {\n      return 0;\n    }else if (currT.token == \"when\") {\n      return currT.column+unit;\n    }else if (wordAfter === \"when\" && prevT.type === \"function\") {\n      return prevT.indent+unit;\n    }else if (wordAfter === \"(\" && currT.token === \"fun\") {\n      return  currT.column+3;\n    }else if (wordAfter === \"catch\" && (t = getToken(state,[\"try\"]))) {\n      return t.column;\n    }else if (is_member(wordAfter,[\"end\",\"after\",\"of\"])) {\n      t = getToken(state,[\"begin\",\"case\",\"fun\",\"if\",\"receive\",\"try\"]);\n      return t ? t.column : CodeMirror.Pass;\n    }else if (is_member(wordAfter,closeParenWords)) {\n      t = getToken(state,openParenWords);\n      return t ? t.column : CodeMirror.Pass;\n    }else if (is_member(currT.token,[\",\",\"|\",\"||\"]) ||\n              is_member(wordAfter,[\",\",\"|\",\"||\"])) {\n      t = postcommaToken(state);\n      return t ? t.column+t.token.length : unit;\n    }else if (currT.token == \"->\") {\n      if (is_member(prevT.token, [\"receive\",\"case\",\"if\",\"try\"])) {\n        return prevT.column+unit+unit;\n      }else{\n        return prevT.column+unit;\n      }\n    }else if (is_member(currT.token,openParenWords)) {\n      return currT.column+currT.token.length;\n    }else{\n      t = defaultToken(state);\n      return truthy(t) ? t.column+unit : 0;\n    }\n  }\n\n  function wordafter(str) {\n    var m = str.match(/,|[a-z]+|\\}|\\]|\\)|>>|\\|+|\\(/);\n\n    return truthy(m) && (m.index === 0) ? m[0] : \"\";\n  }\n\n  function postcommaToken(state) {\n    var objs = state.tokenStack.slice(0,-1);\n    var i = getTokenIndex(objs,\"type\",[\"open_paren\"]);\n\n    return truthy(objs[i]) ? objs[i] : false;\n  }\n\n  function defaultToken(state) {\n    var objs = state.tokenStack;\n    var stop = getTokenIndex(objs,\"type\",[\"open_paren\",\"separator\",\"keyword\"]);\n    var oper = getTokenIndex(objs,\"type\",[\"operator\"]);\n\n    if (truthy(stop) && truthy(oper) && stop < oper) {\n      return objs[stop+1];\n    } else if (truthy(stop)) {\n      return objs[stop];\n    } else {\n      return false;\n    }\n  }\n\n  function getToken(state,tokens) {\n    var objs = state.tokenStack;\n    var i = getTokenIndex(objs,\"token\",tokens);\n\n    return truthy(objs[i]) ? objs[i] : false;\n  }\n\n  function getTokenIndex(objs,propname,propvals) {\n\n    for (var i = objs.length-1; -1 < i ; i--) {\n      if (is_member(objs[i][propname],propvals)) {\n        return i;\n      }\n    }\n    return false;\n  }\n\n  function truthy(x) {\n    return (x !== false) && (x != null);\n  }\n\n/////////////////////////////////////////////////////////////////////////////\n// this object defines the mode\n\n  return {\n    startState:\n      function() {\n        return {tokenStack: [],\n                in_string:  false,\n                in_atom:    false};\n      },\n\n    token:\n      function(stream, state) {\n        return tokenizer(stream, state);\n      },\n\n    indent:\n      function(state, textAfter) {\n        return indenter(state,textAfter);\n      },\n\n    lineComment: \"%\"\n  };\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/factor/factor.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Factor syntax highlight - simple mode\n//\n// by Dimage Sapelkin (https://github.com/kerabromsmu)\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineSimpleMode(\"factor\", {\n    // The start state contains the rules that are initially used\n    start: [\n      // comments\n      {regex: /#?!.*/, token: \"comment\"},\n      // strings \"\"\", multiline --> state\n      {regex: /\"\"\"/, token: \"string\", next: \"string3\"},\n      {regex: /(STRING:)(\\s)/, token: [\"keyword\", null], next: \"string2\"},\n      {regex: /\\S*?\"/, token: \"string\", next: \"string\"},\n      // numbers: dec, hex, unicode, bin, fractional, complex\n      {regex: /(?:0x[\\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\\-?\\d+.?\\d*)(?=\\s)/, token: \"number\"},\n      //{regex: /[+-]?/} //fractional\n      // definition: defining word, defined word, etc\n      {regex: /((?:GENERIC)|\\:?\\:)(\\s+)(\\S+)(\\s+)(\\()/, token: [\"keyword\", null, \"def\", null, \"bracket\"], next: \"stack\"},\n      // method definition: defining word, type, defined word, etc\n      {regex: /(M\\:)(\\s+)(\\S+)(\\s+)(\\S+)/, token: [\"keyword\", null, \"def\", null, \"tag\"]},\n      // vocabulary using --> state\n      {regex: /USING\\:/, token: \"keyword\", next: \"vocabulary\"},\n      // vocabulary definition/use\n      {regex: /(USE\\:|IN\\:)(\\s+)(\\S+)(?=\\s|$)/, token: [\"keyword\", null, \"tag\"]},\n      // definition: a defining word, defined word\n      {regex: /(\\S+\\:)(\\s+)(\\S+)(?=\\s|$)/, token: [\"keyword\", null, \"def\"]},\n      // \"keywords\", incl. ; t f . [ ] { } defining words\n      {regex: /(?:;|\\\\|t|f|if|loop|while|until|do|PRIVATE>|<PRIVATE|\\.|\\S*\\[|\\]|\\S*\\{|\\})(?=\\s|$)/, token: \"keyword\"},\n      // <constructors> and the like\n      {regex: /\\S+[\\)>\\.\\*\\?]+(?=\\s|$)/, token: \"builtin\"},\n      {regex: /[\\)><]+\\S+(?=\\s|$)/, token: \"builtin\"},\n      // operators\n      {regex: /(?:[\\+\\-\\=\\/\\*<>])(?=\\s|$)/, token: \"keyword\"},\n      // any id (?)\n      {regex: /\\S+/, token: \"variable\"},\n      {regex: /\\s+|./, token: null}\n    ],\n    vocabulary: [\n      {regex: /;/, token: \"keyword\", next: \"start\"},\n      {regex: /\\S+/, token: \"tag\"},\n      {regex: /\\s+|./, token: null}\n    ],\n    string: [\n      {regex: /(?:[^\\\\]|\\\\.)*?\"/, token: \"string\", next: \"start\"},\n      {regex: /.*/, token: \"string\"}\n    ],\n    string2: [\n      {regex: /^;/, token: \"keyword\", next: \"start\"},\n      {regex: /.*/, token: \"string\"}\n    ],\n    string3: [\n      {regex: /(?:[^\\\\]|\\\\.)*?\"\"\"/, token: \"string\", next: \"start\"},\n      {regex: /.*/, token: \"string\"}\n    ],\n    stack: [\n      {regex: /\\)/, token: \"bracket\", next: \"start\"},\n      {regex: /--/, token: \"bracket\"},\n      {regex: /\\S+/, token: \"meta\"},\n      {regex: /\\s+|./, token: null}\n    ],\n    // The meta property contains global information about the mode. It\n    // can contain properties like lineComment, which are supported by\n    // all modes, and also directives like dontIndentStates, which are\n    // specific to simple modes.\n    meta: {\n      dontIndentStates: [\"start\", \"vocabulary\", \"string\", \"string3\", \"stack\"],\n      lineComment: \"!\"\n    }\n  });\n\n  CodeMirror.defineMIME(\"text/x-factor\", \"factor\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/fcl/fcl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"fcl\", function(config) {\n  var indentUnit = config.indentUnit;\n\n  var keywords = {\n      \"term\": true,\n      \"method\": true, \"accu\": true,\n      \"rule\": true, \"then\": true, \"is\": true, \"and\": true, \"or\": true,\n      \"if\": true, \"default\": true\n  };\n\n  var start_blocks = {\n      \"var_input\": true,\n      \"var_output\": true,\n      \"fuzzify\": true,\n      \"defuzzify\": true,\n      \"function_block\": true,\n      \"ruleblock\": true\n  };\n\n  var end_blocks = {\n      \"end_ruleblock\": true,\n      \"end_defuzzify\": true,\n      \"end_function_block\": true,\n      \"end_fuzzify\": true,\n      \"end_var\": true\n  };\n\n  var atoms = {\n      \"true\": true, \"false\": true, \"nan\": true,\n      \"real\": true, \"min\": true, \"max\": true, \"cog\": true, \"cogs\": true\n  };\n\n  var isOperatorChar = /[+\\-*&^%:=<>!|\\/]/;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n\n    if (/[\\d\\.]/.test(ch)) {\n      if (ch == \".\") {\n        stream.match(/^[0-9]+([eE][\\-+]?[0-9]+)?/);\n      } else if (ch == \"0\") {\n        stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/);\n      } else {\n        stream.match(/^[0-9]*\\.?[0-9]*([eE][\\-+]?[0-9]+)?/);\n      }\n      return \"number\";\n    }\n\n    if (ch == \"/\" || ch == \"(\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n\n    var cur = stream.current().toLowerCase();\n    if (keywords.propertyIsEnumerable(cur) ||\n        start_blocks.propertyIsEnumerable(cur) ||\n        end_blocks.propertyIsEnumerable(cur)) {\n      return \"keyword\";\n    }\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return \"variable\";\n  }\n\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if ((ch == \"/\" || ch == \")\") && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n\n  function pushContext(state, col, type) {\n    return state.context = new Context(state.indented, col, type, null, state.context);\n  }\n\n  function popContext(state) {\n    if (!state.context.prev) return;\n    var t = state.context.type;\n    if (t == \"end_block\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n        var ctx = state.context;\n        if (stream.sol()) {\n            if (ctx.align == null) ctx.align = false;\n            state.indented = stream.indentation();\n            state.startOfLine = true;\n        }\n        if (stream.eatSpace()) return null;\n\n        var style = (state.tokenize || tokenBase)(stream, state);\n        if (style == \"comment\") return style;\n        if (ctx.align == null) ctx.align = true;\n\n        var cur = stream.current().toLowerCase();\n\n        if (start_blocks.propertyIsEnumerable(cur)) pushContext(state, stream.column(), \"end_block\");\n        else if (end_blocks.propertyIsEnumerable(cur))  popContext(state);\n\n        state.startOfLine = false;\n        return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return 0;\n      var ctx = state.context;\n\n      var closing = end_blocks.propertyIsEnumerable(textAfter);\n      if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"ryk\",\n    fold: \"brace\",\n    blockCommentStart: \"(*\",\n    blockCommentEnd: \"*)\",\n    lineComment: \"//\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-fcl\", \"fcl\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/forth/forth.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Author: Aliaksei Chapyzhenka\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function toWordList(words) {\n    var ret = [];\n    words.split(' ').forEach(function(e){\n      ret.push({name: e});\n    });\n    return ret;\n  }\n\n  var coreWordList = toWordList(\n'INVERT AND OR XOR\\\n 2* 2/ LSHIFT RSHIFT\\\n 0= = 0< < > U< MIN MAX\\\n 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP\\\n >R R> R@\\\n + - 1+ 1- ABS NEGATE\\\n S>D * M* UM*\\\n FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD\\\n HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2!\\\n ALIGN ALIGNED +! ALLOT\\\n CHAR [CHAR] [ ] BL\\\n FIND EXECUTE IMMEDIATE COUNT LITERAL STATE\\\n ; DOES> >BODY\\\n EVALUATE\\\n SOURCE >IN\\\n <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL\\\n FILL MOVE\\\n . CR EMIT SPACE SPACES TYPE U. .R U.R\\\n ACCEPT\\\n TRUE FALSE\\\n <> U> 0<> 0>\\\n NIP TUCK ROLL PICK\\\n 2>R 2R@ 2R>\\\n WITHIN UNUSED MARKER\\\n I J\\\n TO\\\n COMPILE, [COMPILE]\\\n SAVE-INPUT RESTORE-INPUT\\\n PAD ERASE\\\n 2LITERAL DNEGATE\\\n D- D+ D0< D0= D2* D2/ D< D= DMAX DMIN D>S DABS\\\n M+ M*/ D. D.R 2ROT DU<\\\n CATCH THROW\\\n FREE RESIZE ALLOCATE\\\n CS-PICK CS-ROLL\\\n GET-CURRENT SET-CURRENT FORTH-WORDLIST GET-ORDER SET-ORDER\\\n PREVIOUS SEARCH-WORDLIST WORDLIST FIND ALSO ONLY FORTH DEFINITIONS ORDER\\\n -TRAILING /STRING SEARCH COMPARE CMOVE CMOVE> BLANK SLITERAL');\n\n  var immediateWordList = toWordList('IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE [IF] [ELSE] [THEN] ?DO DO LOOP +LOOP UNLOOP LEAVE EXIT AGAIN CASE OF ENDOF ENDCASE');\n\n  CodeMirror.defineMode('forth', function() {\n    function searchWordList (wordList, word) {\n      var i;\n      for (i = wordList.length - 1; i >= 0; i--) {\n        if (wordList[i].name === word.toUpperCase()) {\n          return wordList[i];\n        }\n      }\n      return undefined;\n    }\n  return {\n    startState: function() {\n      return {\n        state: '',\n        base: 10,\n        coreWordList: coreWordList,\n        immediateWordList: immediateWordList,\n        wordList: []\n      };\n    },\n    token: function (stream, stt) {\n      var mat;\n      if (stream.eatSpace()) {\n        return null;\n      }\n      if (stt.state === '') { // interpretation\n        if (stream.match(/^(\\]|:NONAME)(\\s|$)/i)) {\n          stt.state = ' compilation';\n          return 'builtin compilation';\n        }\n        mat = stream.match(/^(\\:)\\s+(\\S+)(\\s|$)+/);\n        if (mat) {\n          stt.wordList.push({name: mat[2].toUpperCase()});\n          stt.state = ' compilation';\n          return 'def' + stt.state;\n        }\n        mat = stream.match(/^(VARIABLE|2VARIABLE|CONSTANT|2CONSTANT|CREATE|POSTPONE|VALUE|WORD)\\s+(\\S+)(\\s|$)+/i);\n        if (mat) {\n          stt.wordList.push({name: mat[2].toUpperCase()});\n          return 'def' + stt.state;\n        }\n        mat = stream.match(/^(\\'|\\[\\'\\])\\s+(\\S+)(\\s|$)+/);\n        if (mat) {\n          return 'builtin' + stt.state;\n        }\n        } else { // compilation\n        // ; [\n        if (stream.match(/^(\\;|\\[)(\\s)/)) {\n          stt.state = '';\n          stream.backUp(1);\n          return 'builtin compilation';\n        }\n        if (stream.match(/^(\\;|\\[)($)/)) {\n          stt.state = '';\n          return 'builtin compilation';\n        }\n        if (stream.match(/^(POSTPONE)\\s+\\S+(\\s|$)+/)) {\n          return 'builtin';\n        }\n      }\n\n      // dynamic wordlist\n      mat = stream.match(/^(\\S+)(\\s+|$)/);\n      if (mat) {\n        if (searchWordList(stt.wordList, mat[1]) !== undefined) {\n          return 'variable' + stt.state;\n        }\n\n        // comments\n        if (mat[1] === '\\\\') {\n          stream.skipToEnd();\n            return 'comment' + stt.state;\n          }\n\n          // core words\n          if (searchWordList(stt.coreWordList, mat[1]) !== undefined) {\n            return 'builtin' + stt.state;\n          }\n          if (searchWordList(stt.immediateWordList, mat[1]) !== undefined) {\n            return 'keyword' + stt.state;\n          }\n\n          if (mat[1] === '(') {\n            stream.eatWhile(function (s) { return s !== ')'; });\n            stream.eat(')');\n            return 'comment' + stt.state;\n          }\n\n          // // strings\n          if (mat[1] === '.(') {\n            stream.eatWhile(function (s) { return s !== ')'; });\n            stream.eat(')');\n            return 'string' + stt.state;\n          }\n          if (mat[1] === 'S\"' || mat[1] === '.\"' || mat[1] === 'C\"') {\n            stream.eatWhile(function (s) { return s !== '\"'; });\n            stream.eat('\"');\n            return 'string' + stt.state;\n          }\n\n          // numbers\n          if (mat[1] - 0xfffffffff) {\n            return 'number' + stt.state;\n          }\n          // if (mat[1].match(/^[-+]?[0-9]+\\.[0-9]*/)) {\n          //     return 'number' + stt.state;\n          // }\n\n          return 'atom' + stt.state;\n        }\n      }\n    };\n  });\n  CodeMirror.defineMIME(\"text/x-forth\", \"forth\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/fortran/fortran.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"fortran\", function() {\n  function words(array) {\n    var keys = {};\n    for (var i = 0; i < array.length; ++i) {\n      keys[array[i]] = true;\n    }\n    return keys;\n  }\n\n  var keywords = words([\n                  \"abstract\", \"accept\", \"allocatable\", \"allocate\",\n                  \"array\", \"assign\", \"asynchronous\", \"backspace\",\n                  \"bind\", \"block\", \"byte\", \"call\", \"case\",\n                  \"class\", \"close\", \"common\", \"contains\",\n                  \"continue\", \"cycle\", \"data\", \"deallocate\",\n                  \"decode\", \"deferred\", \"dimension\", \"do\",\n                  \"elemental\", \"else\", \"encode\", \"end\",\n                  \"endif\", \"entry\", \"enumerator\", \"equivalence\",\n                  \"exit\", \"external\", \"extrinsic\", \"final\",\n                  \"forall\", \"format\", \"function\", \"generic\",\n                  \"go\", \"goto\", \"if\", \"implicit\", \"import\", \"include\",\n                  \"inquire\", \"intent\", \"interface\", \"intrinsic\",\n                  \"module\", \"namelist\", \"non_intrinsic\",\n                  \"non_overridable\", \"none\", \"nopass\",\n                  \"nullify\", \"open\", \"optional\", \"options\",\n                  \"parameter\", \"pass\", \"pause\", \"pointer\",\n                  \"print\", \"private\", \"program\", \"protected\",\n                  \"public\", \"pure\", \"read\", \"recursive\", \"result\",\n                  \"return\", \"rewind\", \"save\", \"select\", \"sequence\",\n                  \"stop\", \"subroutine\", \"target\", \"then\", \"to\", \"type\",\n                  \"use\", \"value\", \"volatile\", \"where\", \"while\",\n                  \"write\"]);\n  var builtins = words([\"abort\", \"abs\", \"access\", \"achar\", \"acos\",\n                          \"adjustl\", \"adjustr\", \"aimag\", \"aint\", \"alarm\",\n                          \"all\", \"allocated\", \"alog\", \"amax\", \"amin\",\n                          \"amod\", \"and\", \"anint\", \"any\", \"asin\",\n                          \"associated\", \"atan\", \"besj\", \"besjn\", \"besy\",\n                          \"besyn\", \"bit_size\", \"btest\", \"cabs\", \"ccos\",\n                          \"ceiling\", \"cexp\", \"char\", \"chdir\", \"chmod\",\n                          \"clog\", \"cmplx\", \"command_argument_count\",\n                          \"complex\", \"conjg\", \"cos\", \"cosh\", \"count\",\n                          \"cpu_time\", \"cshift\", \"csin\", \"csqrt\", \"ctime\",\n                          \"c_funloc\", \"c_loc\", \"c_associated\", \"c_null_ptr\",\n                          \"c_null_funptr\", \"c_f_pointer\", \"c_null_char\",\n                          \"c_alert\", \"c_backspace\", \"c_form_feed\",\n                          \"c_new_line\", \"c_carriage_return\",\n                          \"c_horizontal_tab\", \"c_vertical_tab\", \"dabs\",\n                          \"dacos\", \"dasin\", \"datan\", \"date_and_time\",\n                          \"dbesj\", \"dbesj\", \"dbesjn\", \"dbesy\", \"dbesy\",\n                          \"dbesyn\", \"dble\", \"dcos\", \"dcosh\", \"ddim\", \"derf\",\n                          \"derfc\", \"dexp\", \"digits\", \"dim\", \"dint\", \"dlog\",\n                          \"dlog\", \"dmax\", \"dmin\", \"dmod\", \"dnint\",\n                          \"dot_product\", \"dprod\", \"dsign\", \"dsinh\",\n                          \"dsin\", \"dsqrt\", \"dtanh\", \"dtan\", \"dtime\",\n                          \"eoshift\", \"epsilon\", \"erf\", \"erfc\", \"etime\",\n                          \"exit\", \"exp\", \"exponent\", \"extends_type_of\",\n                          \"fdate\", \"fget\", \"fgetc\", \"float\", \"floor\",\n                          \"flush\", \"fnum\", \"fputc\", \"fput\", \"fraction\",\n                          \"fseek\", \"fstat\", \"ftell\", \"gerror\", \"getarg\",\n                          \"get_command\", \"get_command_argument\",\n                          \"get_environment_variable\", \"getcwd\",\n                          \"getenv\", \"getgid\", \"getlog\", \"getpid\",\n                          \"getuid\", \"gmtime\", \"hostnm\", \"huge\", \"iabs\",\n                          \"iachar\", \"iand\", \"iargc\", \"ibclr\", \"ibits\",\n                          \"ibset\", \"ichar\", \"idate\", \"idim\", \"idint\",\n                          \"idnint\", \"ieor\", \"ierrno\", \"ifix\", \"imag\",\n                          \"imagpart\", \"index\", \"int\", \"ior\", \"irand\",\n                          \"isatty\", \"ishft\", \"ishftc\", \"isign\",\n                          \"iso_c_binding\", \"is_iostat_end\", \"is_iostat_eor\",\n                          \"itime\", \"kill\", \"kind\", \"lbound\", \"len\", \"len_trim\",\n                          \"lge\", \"lgt\", \"link\", \"lle\", \"llt\", \"lnblnk\", \"loc\",\n                          \"log\", \"logical\", \"long\", \"lshift\", \"lstat\", \"ltime\",\n                          \"matmul\", \"max\", \"maxexponent\", \"maxloc\", \"maxval\",\n                          \"mclock\", \"merge\", \"move_alloc\", \"min\", \"minexponent\",\n                          \"minloc\", \"minval\", \"mod\", \"modulo\", \"mvbits\",\n                          \"nearest\", \"new_line\", \"nint\", \"not\", \"or\", \"pack\",\n                          \"perror\", \"precision\", \"present\", \"product\", \"radix\",\n                          \"rand\", \"random_number\", \"random_seed\", \"range\",\n                          \"real\", \"realpart\", \"rename\", \"repeat\", \"reshape\",\n                          \"rrspacing\", \"rshift\", \"same_type_as\", \"scale\",\n                          \"scan\", \"second\", \"selected_int_kind\",\n                          \"selected_real_kind\", \"set_exponent\", \"shape\",\n                          \"short\", \"sign\", \"signal\", \"sinh\", \"sin\", \"sleep\",\n                          \"sngl\", \"spacing\", \"spread\", \"sqrt\", \"srand\", \"stat\",\n                          \"sum\", \"symlnk\", \"system\", \"system_clock\", \"tan\",\n                          \"tanh\", \"time\", \"tiny\", \"transfer\", \"transpose\",\n                          \"trim\", \"ttynam\", \"ubound\", \"umask\", \"unlink\",\n                          \"unpack\", \"verify\", \"xor\", \"zabs\", \"zcos\", \"zexp\",\n                          \"zlog\", \"zsin\", \"zsqrt\"]);\n\n    var dataTypes =  words([\"c_bool\", \"c_char\", \"c_double\", \"c_double_complex\",\n                     \"c_float\", \"c_float_complex\", \"c_funptr\", \"c_int\",\n                     \"c_int16_t\", \"c_int32_t\", \"c_int64_t\", \"c_int8_t\",\n                     \"c_int_fast16_t\", \"c_int_fast32_t\", \"c_int_fast64_t\",\n                     \"c_int_fast8_t\", \"c_int_least16_t\", \"c_int_least32_t\",\n                     \"c_int_least64_t\", \"c_int_least8_t\", \"c_intmax_t\",\n                     \"c_intptr_t\", \"c_long\", \"c_long_double\",\n                     \"c_long_double_complex\", \"c_long_long\", \"c_ptr\",\n                     \"c_short\", \"c_signed_char\", \"c_size_t\", \"character\",\n                     \"complex\", \"double\", \"integer\", \"logical\", \"real\"]);\n  var isOperatorChar = /[+\\-*&=<>\\/\\:]/;\n  var litOperator = /^\\.(and|or|eq|lt|le|gt|ge|ne|not|eqv|neqv)\\./i;\n\n  function tokenBase(stream, state) {\n\n    if (stream.match(litOperator)){\n        return 'operator';\n    }\n\n    var ch = stream.next();\n    if (ch == \"!\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (/[\\[\\]\\(\\),]/.test(ch)) {\n      return null;\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_]/);\n    var word = stream.current().toLowerCase();\n\n    if (keywords.hasOwnProperty(word)){\n            return 'keyword';\n    }\n    if (builtins.hasOwnProperty(word) || dataTypes.hasOwnProperty(word)) {\n            return 'builtin';\n    }\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n            end = true;\n            break;\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !escaped) state.tokenize = null;\n      return \"string\";\n    };\n  }\n\n  // Interface\n\n  return {\n    startState: function() {\n      return {tokenize: null};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      return style;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-fortran\", \"fortran\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/gas/gas.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"gas\", function(_config, parserConfig) {\n  'use strict';\n\n  // If an architecture is specified, its initialization function may\n  // populate this array with custom parsing functions which will be\n  // tried in the event that the standard functions do not find a match.\n  var custom = [];\n\n  // The symbol used to start a line comment changes based on the target\n  // architecture.\n  // If no architecture is pased in \"parserConfig\" then only multiline\n  // comments will have syntax support.\n  var lineCommentStartSymbol = \"\";\n\n  // These directives are architecture independent.\n  // Machine specific directives should go in their respective\n  // architecture initialization function.\n  // Reference:\n  // http://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops\n  var directives = {\n    \".abort\" : \"builtin\",\n    \".align\" : \"builtin\",\n    \".altmacro\" : \"builtin\",\n    \".ascii\" : \"builtin\",\n    \".asciz\" : \"builtin\",\n    \".balign\" : \"builtin\",\n    \".balignw\" : \"builtin\",\n    \".balignl\" : \"builtin\",\n    \".bundle_align_mode\" : \"builtin\",\n    \".bundle_lock\" : \"builtin\",\n    \".bundle_unlock\" : \"builtin\",\n    \".byte\" : \"builtin\",\n    \".cfi_startproc\" : \"builtin\",\n    \".comm\" : \"builtin\",\n    \".data\" : \"builtin\",\n    \".def\" : \"builtin\",\n    \".desc\" : \"builtin\",\n    \".dim\" : \"builtin\",\n    \".double\" : \"builtin\",\n    \".eject\" : \"builtin\",\n    \".else\" : \"builtin\",\n    \".elseif\" : \"builtin\",\n    \".end\" : \"builtin\",\n    \".endef\" : \"builtin\",\n    \".endfunc\" : \"builtin\",\n    \".endif\" : \"builtin\",\n    \".equ\" : \"builtin\",\n    \".equiv\" : \"builtin\",\n    \".eqv\" : \"builtin\",\n    \".err\" : \"builtin\",\n    \".error\" : \"builtin\",\n    \".exitm\" : \"builtin\",\n    \".extern\" : \"builtin\",\n    \".fail\" : \"builtin\",\n    \".file\" : \"builtin\",\n    \".fill\" : \"builtin\",\n    \".float\" : \"builtin\",\n    \".func\" : \"builtin\",\n    \".global\" : \"builtin\",\n    \".gnu_attribute\" : \"builtin\",\n    \".hidden\" : \"builtin\",\n    \".hword\" : \"builtin\",\n    \".ident\" : \"builtin\",\n    \".if\" : \"builtin\",\n    \".incbin\" : \"builtin\",\n    \".include\" : \"builtin\",\n    \".int\" : \"builtin\",\n    \".internal\" : \"builtin\",\n    \".irp\" : \"builtin\",\n    \".irpc\" : \"builtin\",\n    \".lcomm\" : \"builtin\",\n    \".lflags\" : \"builtin\",\n    \".line\" : \"builtin\",\n    \".linkonce\" : \"builtin\",\n    \".list\" : \"builtin\",\n    \".ln\" : \"builtin\",\n    \".loc\" : \"builtin\",\n    \".loc_mark_labels\" : \"builtin\",\n    \".local\" : \"builtin\",\n    \".long\" : \"builtin\",\n    \".macro\" : \"builtin\",\n    \".mri\" : \"builtin\",\n    \".noaltmacro\" : \"builtin\",\n    \".nolist\" : \"builtin\",\n    \".octa\" : \"builtin\",\n    \".offset\" : \"builtin\",\n    \".org\" : \"builtin\",\n    \".p2align\" : \"builtin\",\n    \".popsection\" : \"builtin\",\n    \".previous\" : \"builtin\",\n    \".print\" : \"builtin\",\n    \".protected\" : \"builtin\",\n    \".psize\" : \"builtin\",\n    \".purgem\" : \"builtin\",\n    \".pushsection\" : \"builtin\",\n    \".quad\" : \"builtin\",\n    \".reloc\" : \"builtin\",\n    \".rept\" : \"builtin\",\n    \".sbttl\" : \"builtin\",\n    \".scl\" : \"builtin\",\n    \".section\" : \"builtin\",\n    \".set\" : \"builtin\",\n    \".short\" : \"builtin\",\n    \".single\" : \"builtin\",\n    \".size\" : \"builtin\",\n    \".skip\" : \"builtin\",\n    \".sleb128\" : \"builtin\",\n    \".space\" : \"builtin\",\n    \".stab\" : \"builtin\",\n    \".string\" : \"builtin\",\n    \".struct\" : \"builtin\",\n    \".subsection\" : \"builtin\",\n    \".symver\" : \"builtin\",\n    \".tag\" : \"builtin\",\n    \".text\" : \"builtin\",\n    \".title\" : \"builtin\",\n    \".type\" : \"builtin\",\n    \".uleb128\" : \"builtin\",\n    \".val\" : \"builtin\",\n    \".version\" : \"builtin\",\n    \".vtable_entry\" : \"builtin\",\n    \".vtable_inherit\" : \"builtin\",\n    \".warning\" : \"builtin\",\n    \".weak\" : \"builtin\",\n    \".weakref\" : \"builtin\",\n    \".word\" : \"builtin\"\n  };\n\n  var registers = {};\n\n  function x86(_parserConfig) {\n    lineCommentStartSymbol = \"#\";\n\n    registers.al  = \"variable\";\n    registers.ah  = \"variable\";\n    registers.ax  = \"variable\";\n    registers.eax = \"variable-2\";\n    registers.rax = \"variable-3\";\n\n    registers.bl  = \"variable\";\n    registers.bh  = \"variable\";\n    registers.bx  = \"variable\";\n    registers.ebx = \"variable-2\";\n    registers.rbx = \"variable-3\";\n\n    registers.cl  = \"variable\";\n    registers.ch  = \"variable\";\n    registers.cx  = \"variable\";\n    registers.ecx = \"variable-2\";\n    registers.rcx = \"variable-3\";\n\n    registers.dl  = \"variable\";\n    registers.dh  = \"variable\";\n    registers.dx  = \"variable\";\n    registers.edx = \"variable-2\";\n    registers.rdx = \"variable-3\";\n\n    registers.si  = \"variable\";\n    registers.esi = \"variable-2\";\n    registers.rsi = \"variable-3\";\n\n    registers.di  = \"variable\";\n    registers.edi = \"variable-2\";\n    registers.rdi = \"variable-3\";\n\n    registers.sp  = \"variable\";\n    registers.esp = \"variable-2\";\n    registers.rsp = \"variable-3\";\n\n    registers.bp  = \"variable\";\n    registers.ebp = \"variable-2\";\n    registers.rbp = \"variable-3\";\n\n    registers.ip  = \"variable\";\n    registers.eip = \"variable-2\";\n    registers.rip = \"variable-3\";\n\n    registers.cs  = \"keyword\";\n    registers.ds  = \"keyword\";\n    registers.ss  = \"keyword\";\n    registers.es  = \"keyword\";\n    registers.fs  = \"keyword\";\n    registers.gs  = \"keyword\";\n  }\n\n  function armv6(_parserConfig) {\n    // Reference:\n    // http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf\n    // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf\n    lineCommentStartSymbol = \"@\";\n    directives.syntax = \"builtin\";\n\n    registers.r0  = \"variable\";\n    registers.r1  = \"variable\";\n    registers.r2  = \"variable\";\n    registers.r3  = \"variable\";\n    registers.r4  = \"variable\";\n    registers.r5  = \"variable\";\n    registers.r6  = \"variable\";\n    registers.r7  = \"variable\";\n    registers.r8  = \"variable\";\n    registers.r9  = \"variable\";\n    registers.r10 = \"variable\";\n    registers.r11 = \"variable\";\n    registers.r12 = \"variable\";\n\n    registers.sp  = \"variable-2\";\n    registers.lr  = \"variable-2\";\n    registers.pc  = \"variable-2\";\n    registers.r13 = registers.sp;\n    registers.r14 = registers.lr;\n    registers.r15 = registers.pc;\n\n    custom.push(function(ch, stream) {\n      if (ch === '#') {\n        stream.eatWhile(/\\w/);\n        return \"number\";\n      }\n    });\n  }\n\n  var arch = (parserConfig.architecture || \"x86\").toLowerCase();\n  if (arch === \"x86\") {\n    x86(parserConfig);\n  } else if (arch === \"arm\" || arch === \"armv6\") {\n    armv6(parserConfig);\n  }\n\n  function nextUntilUnescaped(stream, end) {\n    var escaped = false, next;\n    while ((next = stream.next()) != null) {\n      if (next === end && !escaped) {\n        return false;\n      }\n      escaped = !escaped && next === \"\\\\\";\n    }\n    return escaped;\n  }\n\n  function clikeComment(stream, state) {\n    var maybeEnd = false, ch;\n    while ((ch = stream.next()) != null) {\n      if (ch === \"/\" && maybeEnd) {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch === \"*\");\n    }\n    return \"comment\";\n  }\n\n  return {\n    startState: function() {\n      return {\n        tokenize: null\n      };\n    },\n\n    token: function(stream, state) {\n      if (state.tokenize) {\n        return state.tokenize(stream, state);\n      }\n\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      var style, cur, ch = stream.next();\n\n      if (ch === \"/\") {\n        if (stream.eat(\"*\")) {\n          state.tokenize = clikeComment;\n          return clikeComment(stream, state);\n        }\n      }\n\n      if (ch === lineCommentStartSymbol) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n\n      if (ch === '\"') {\n        nextUntilUnescaped(stream, '\"');\n        return \"string\";\n      }\n\n      if (ch === '.') {\n        stream.eatWhile(/\\w/);\n        cur = stream.current().toLowerCase();\n        style = directives[cur];\n        return style || null;\n      }\n\n      if (ch === '=') {\n        stream.eatWhile(/\\w/);\n        return \"tag\";\n      }\n\n      if (ch === '{') {\n        return \"bracket\";\n      }\n\n      if (ch === '}') {\n        return \"bracket\";\n      }\n\n      if (/\\d/.test(ch)) {\n        if (ch === \"0\" && stream.eat(\"x\")) {\n          stream.eatWhile(/[0-9a-fA-F]/);\n          return \"number\";\n        }\n        stream.eatWhile(/\\d/);\n        return \"number\";\n      }\n\n      if (/\\w/.test(ch)) {\n        stream.eatWhile(/\\w/);\n        if (stream.eat(\":\")) {\n          return 'tag';\n        }\n        cur = stream.current().toLowerCase();\n        style = registers[cur];\n        return style || null;\n      }\n\n      for (var i = 0; i < custom.length; i++) {\n        style = custom[i](ch, stream, state);\n        if (style) {\n          return style;\n        }\n      }\n    },\n\n    lineComment: lineCommentStartSymbol,\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\"\n  };\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/gfm/gfm.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../markdown/markdown\"), require(\"../../addon/mode/overlay\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../markdown/markdown\", \"../../addon/mode/overlay\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar urlRE = /^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\\.beep|\\.lwz|\\.xpc|\\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\\.beeps?|xmpp|xri|ymsgr|z39\\.50[rs]?):(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]|\\([^\\s()<>]*\\))+(?:\\([^\\s()<>]*\\)|[^\\s`*!()\\[\\]{};:'\".,<>?«»“”‘’]))/i\n\nCodeMirror.defineMode(\"gfm\", function(config, modeConfig) {\n  var codeDepth = 0;\n  function blankLine(state) {\n    state.code = false;\n    return null;\n  }\n  var gfmOverlay = {\n    startState: function() {\n      return {\n        code: false,\n        codeBlock: false,\n        ateSpace: false\n      };\n    },\n    copyState: function(s) {\n      return {\n        code: s.code,\n        codeBlock: s.codeBlock,\n        ateSpace: s.ateSpace\n      };\n    },\n    token: function(stream, state) {\n      state.combineTokens = null;\n\n      // Hack to prevent formatting override inside code blocks (block and inline)\n      if (state.codeBlock) {\n        if (stream.match(/^```+/)) {\n          state.codeBlock = false;\n          return null;\n        }\n        stream.skipToEnd();\n        return null;\n      }\n      if (stream.sol()) {\n        state.code = false;\n      }\n      if (stream.sol() && stream.match(/^```+/)) {\n        stream.skipToEnd();\n        state.codeBlock = true;\n        return null;\n      }\n      // If this block is changed, it may need to be updated in Markdown mode\n      if (stream.peek() === '`') {\n        stream.next();\n        var before = stream.pos;\n        stream.eatWhile('`');\n        var difference = 1 + stream.pos - before;\n        if (!state.code) {\n          codeDepth = difference;\n          state.code = true;\n        } else {\n          if (difference === codeDepth) { // Must be exact\n            state.code = false;\n          }\n        }\n        return null;\n      } else if (state.code) {\n        stream.next();\n        return null;\n      }\n      // Check if space. If so, links can be formatted later on\n      if (stream.eatSpace()) {\n        state.ateSpace = true;\n        return null;\n      }\n      if (stream.sol() || state.ateSpace) {\n        state.ateSpace = false;\n        if (modeConfig.gitHubSpice !== false) {\n          if(stream.match(/^(?:[a-zA-Z0-9\\-_]+\\/)?(?:[a-zA-Z0-9\\-_]+@)?(?=.{0,6}\\d)(?:[a-f0-9]{7,40}\\b)/)) {\n            // User/Project@SHA\n            // User@SHA\n            // SHA\n            state.combineTokens = true;\n            return \"link\";\n          } else if (stream.match(/^(?:[a-zA-Z0-9\\-_]+\\/)?(?:[a-zA-Z0-9\\-_]+)?#[0-9]+\\b/)) {\n            // User/Project#Num\n            // User#Num\n            // #Num\n            state.combineTokens = true;\n            return \"link\";\n          }\n        }\n      }\n      if (stream.match(urlRE) &&\n          stream.string.slice(stream.start - 2, stream.start) != \"](\" &&\n          (stream.start == 0 || /\\W/.test(stream.string.charAt(stream.start - 1)))) {\n        // URLs\n        // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls\n        // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine\n        // And then limited url schemes to the CommonMark list, so foo:bar isn't matched as a URL\n        state.combineTokens = true;\n        return \"link\";\n      }\n      stream.next();\n      return null;\n    },\n    blankLine: blankLine\n  };\n\n  var markdownConfig = {\n    taskLists: true,\n    strikethrough: true,\n    emoji: true\n  };\n  for (var attr in modeConfig) {\n    markdownConfig[attr] = modeConfig[attr];\n  }\n  markdownConfig.name = \"markdown\";\n  return CodeMirror.overlayMode(CodeMirror.getMode(config, markdownConfig), gfmOverlay);\n\n}, \"markdown\");\n\n  CodeMirror.defineMIME(\"text/x-gfm\", \"gfm\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/gherkin/gherkin.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\nGherkin mode - http://www.cukes.info/\nReport bugs/issues here: https://github.com/codemirror/CodeMirror/issues\n*/\n\n// Following Objs from Brackets implementation: https://github.com/tregusti/brackets-gherkin/blob/master/main.js\n//var Quotes = {\n//  SINGLE: 1,\n//  DOUBLE: 2\n//};\n\n//var regex = {\n//  keywords: /(Feature| {2}(Scenario|In order to|As|I)| {4}(Given|When|Then|And))/\n//};\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"gherkin\", function () {\n  return {\n    startState: function () {\n      return {\n        lineNumber: 0,\n        tableHeaderLine: false,\n        allowFeature: true,\n        allowBackground: false,\n        allowScenario: false,\n        allowSteps: false,\n        allowPlaceholders: false,\n        allowMultilineArgument: false,\n        inMultilineString: false,\n        inMultilineTable: false,\n        inKeywordLine: false\n      };\n    },\n    token: function (stream, state) {\n      if (stream.sol()) {\n        state.lineNumber++;\n        state.inKeywordLine = false;\n        if (state.inMultilineTable) {\n            state.tableHeaderLine = false;\n            if (!stream.match(/\\s*\\|/, false)) {\n              state.allowMultilineArgument = false;\n              state.inMultilineTable = false;\n            }\n        }\n      }\n\n      stream.eatSpace();\n\n      if (state.allowMultilineArgument) {\n\n        // STRING\n        if (state.inMultilineString) {\n          if (stream.match('\"\"\"')) {\n            state.inMultilineString = false;\n            state.allowMultilineArgument = false;\n          } else {\n            stream.match(/.*/);\n          }\n          return \"string\";\n        }\n\n        // TABLE\n        if (state.inMultilineTable) {\n          if (stream.match(/\\|\\s*/)) {\n            return \"bracket\";\n          } else {\n            stream.match(/[^\\|]*/);\n            return state.tableHeaderLine ? \"header\" : \"string\";\n          }\n        }\n\n        // DETECT START\n        if (stream.match('\"\"\"')) {\n          // String\n          state.inMultilineString = true;\n          return \"string\";\n        } else if (stream.match(\"|\")) {\n          // Table\n          state.inMultilineTable = true;\n          state.tableHeaderLine = true;\n          return \"bracket\";\n        }\n\n      }\n\n      // LINE COMMENT\n      if (stream.match(/#.*/)) {\n        return \"comment\";\n\n      // TAG\n      } else if (!state.inKeywordLine && stream.match(/@\\S+/)) {\n        return \"tag\";\n\n      // FEATURE\n      } else if (!state.inKeywordLine && state.allowFeature && stream.match(/(機能|功能|フィーチャ|기능|โครงหลัก|ความสามารถ|ความต้องการทางธุรกิจ|ಹೆಚ್ಚಳ|గుణము|ਮੁਹਾਂਦਰਾ|ਨਕਸ਼ ਨੁਹਾਰ|ਖਾਸੀਅਤ|रूप लेख|وِیژگی|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Үзенчәлеклелек|Свойство|Особина|Мөмкинлек|Могућност|Λειτουργία|Δυνατότητα|Właściwość|Vlastnosť|Trajto|Tính năng|Savybė|Pretty much|Požiadavka|Požadavek|Potrzeba biznesowa|Özellik|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Hwæt|Hwaet|Funzionalità|Funktionalitéit|Funktionalität|Funkcja|Funkcionalnost|Funkcionalitāte|Funkcia|Fungsi|Functionaliteit|Funcționalitate|Funcţionalitate|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Fīča|Feature|Eiginleiki|Egenskap|Egenskab|Característica|Caracteristica|Business Need|Aspekt|Arwedd|Ahoy matey!|Ability):/)) {\n        state.allowScenario = true;\n        state.allowBackground = true;\n        state.allowPlaceholders = false;\n        state.allowSteps = false;\n        state.allowMultilineArgument = false;\n        state.inKeywordLine = true;\n        return \"keyword\";\n\n      // BACKGROUND\n      } else if (!state.inKeywordLine && state.allowBackground && stream.match(/(背景|배경|แนวคิด|ಹಿನ್ನೆಲೆ|నేపథ్యం|ਪਿਛੋਕੜ|पृष्ठभूमि|زمینه|الخلفية|רקע|Тарих|Предыстория|Предистория|Позадина|Передумова|Основа|Контекст|Кереш|Υπόβαθρο|Założenia|Yo\\-ho\\-ho|Tausta|Taust|Situācija|Rerefons|Pozadina|Pozadie|Pozadí|Osnova|Latar Belakang|Kontext|Konteksts|Kontekstas|Kontekst|Háttér|Hannergrond|Grundlage|Geçmiş|Fundo|Fono|First off|Dis is what went down|Dasar|Contexto|Contexte|Context|Contesto|Cenário de Fundo|Cenario de Fundo|Cefndir|Bối cảnh|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|Ær|Aer|Achtergrond):/)) {\n        state.allowPlaceholders = false;\n        state.allowSteps = true;\n        state.allowBackground = false;\n        state.allowMultilineArgument = false;\n        state.inKeywordLine = true;\n        return \"keyword\";\n\n      // SCENARIO OUTLINE\n      } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景大綱|场景大纲|劇本大綱|剧本大纲|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|시나리오 개요|สรุปเหตุการณ์|โครงสร้างของเหตุการณ์|ವಿವರಣೆ|కథనం|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ|परिदृश्य रूपरेखा|سيناريو مخطط|الگوی سناریو|תבנית תרחיש|Сценарийның төзелеше|Сценарий структураси|Структура сценарію|Структура сценария|Структура сценарија|Скица|Рамка на сценарий|Концепт|Περιγραφή Σεναρίου|Wharrimean is|Template Situai|Template Senario|Template Keadaan|Tapausaihio|Szenariogrundriss|Szablon scenariusza|Swa hwær swa|Swa hwaer swa|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario konsep|Shiver me timbers|Senaryo taslağı|Schema dello scenario|Scenariomall|Scenariomal|Scenario Template|Scenario Outline|Scenario Amlinellol|Scenārijs pēc parauga|Scenarijaus šablonas|Reckon it's like|Raamstsenaarium|Plang vum Szenario|Plan du Scénario|Plan du scénario|Osnova scénáře|Osnova Scenára|Náčrt Scenáru|Náčrt Scénáře|Náčrt Scenára|MISHUN SRSLY|Menggariskan Senario|Lýsing Dæma|Lýsing Atburðarásar|Konturo de la scenaro|Koncept|Khung tình huống|Khung kịch bản|Forgatókönyv vázlat|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esbozo do escenario|Delineação do Cenário|Delineacao do Cenario|All y'all|Abstrakt Scenario|Abstract Scenario):/)) {\n        state.allowPlaceholders = true;\n        state.allowSteps = true;\n        state.allowMultilineArgument = false;\n        state.inKeywordLine = true;\n        return \"keyword\";\n\n      // EXAMPLES\n      } else if (state.allowScenario && stream.match(/(例子|例|サンプル|예|ชุดของเหตุการณ์|ชุดของตัวอย่าง|ಉದಾಹರಣೆಗಳು|ఉదాహరణలు|ਉਦਾਹਰਨਾਂ|उदाहरण|نمونه ها|امثلة|דוגמאות|Үрнәкләр|Сценарији|Примеры|Примери|Приклади|Мисоллар|Мисаллар|Σενάρια|Παραδείγματα|You'll wanna|Voorbeelden|Variantai|Tapaukset|Se þe|Se the|Se ðe|Scenarios|Scenariji|Scenarijai|Przykłady|Primjeri|Primeri|Příklady|Príklady|Piemēri|Példák|Pavyzdžiai|Paraugs|Örnekler|Juhtumid|Exemplos|Exemples|Exemple|Exempel|EXAMPLZ|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|Dữ liệu|Dead men tell no tales|Dæmi|Contoh|Cenários|Cenarios|Beispiller|Beispiele|Atburðarásir):/)) {\n        state.allowPlaceholders = false;\n        state.allowSteps = true;\n        state.allowBackground = false;\n        state.allowMultilineArgument = true;\n        return \"keyword\";\n\n      // SCENARIO\n      } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景|场景|劇本|剧本|シナリオ|시나리오|เหตุการณ์|ಕಥಾಸಾರಾಂಶ|సన్నివేశం|ਪਟਕਥਾ|परिदृश्य|سيناريو|سناریو|תרחיש|Сценарій|Сценарио|Сценарий|Пример|Σενάριο|Tình huống|The thing of it is|Tapaus|Szenario|Swa|Stsenaarium|Skenario|Situai|Senaryo|Senario|Scenaro|Scenariusz|Scenariu|Scénario|Scenario|Scenarijus|Scenārijs|Scenarij|Scenarie|Scénář|Scenár|Primer|MISHUN|Kịch bản|Keadaan|Heave to|Forgatókönyv|Escenario|Escenari|Cenário|Cenario|Awww, look mate|Atburðarás):/)) {\n        state.allowPlaceholders = false;\n        state.allowSteps = true;\n        state.allowBackground = false;\n        state.allowMultilineArgument = false;\n        state.inKeywordLine = true;\n        return \"keyword\";\n\n      // STEPS\n      } else if (!state.inKeywordLine && state.allowSteps && stream.match(/(那麼|那么|而且|當|当|并且|同時|同时|前提|假设|假設|假定|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|하지만|조건|먼저|만일|만약|단|그리고|그러면|และ |เมื่อ |แต่ |ดังนั้น |กำหนดให้ |ಸ್ಥಿತಿಯನ್ನು |ಮತ್ತು |ನೀಡಿದ |ನಂತರ |ಆದರೆ |మరియు |చెప్పబడినది |కాని |ఈ పరిస్థితిలో |అప్పుడు |ਪਰ |ਤਦ |ਜੇਕਰ |ਜਿਵੇਂ ਕਿ |ਜਦੋਂ |ਅਤੇ |यदि |परन्तु |पर |तब |तदा |तथा |जब |चूंकि |किन्तु |कदा |और |अगर |و |هنگامی |متى |لكن |عندما |ثم |بفرض |با فرض |اما |اذاً |آنگاه |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Һәм |Унда |Тоді |Тогда |То |Также |Та |Пусть |Припустимо, що |Припустимо |Онда |Но |Нехай |Нәтиҗәдә |Лекин |Ләкин |Коли |Когда |Когато |Када |Кад |К тому же |І |И |Задато |Задати |Задате |Если |Допустим |Дано |Дадено |Вә |Ва |Бирок |Әмма |Әйтик |Әгәр |Аммо |Али |Але |Агар |А також |А |Τότε |Όταν |Και |Δεδομένου |Αλλά |Þurh |Þegar |Þa þe |Þá |Þa |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Za předpokladu |Za predpokladu |Youse know when youse got |Youse know like when |Yna |Yeah nah |Y'know |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |wann |Ve |Và |Und |Un |ugeholl |Too right |Thurh |Thì |Then y'all |Then |Tha the |Tha |Tetapi |Tapi |Tak |Tada |Tad |Stel |Soit |Siis |Și |Şi |Si |Sed |Se |Så |Quando |Quand |Quan |Pryd |Potom |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Niin |Nhưng |När |Når |Mutta |Men |Mas |Maka |Majd |Mając |Mais |Maar |mä |Ma |Lorsque |Lorsqu'|Logo |Let go and haul |Kun |Kuid |Kui |Kiedy |Khi |Ketika |Kemudian |Keď |Když |Kaj |Kai |Kada |Kad |Jeżeli |Jeśli |Ja |It's just unbelievable |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben seien |Gegeben sei |Gdy |Gangway! |Fakat |Étant donnés |Etant donnés |Étant données |Etant données |Étant donnée |Etant donnée |Étant donné |Etant donné |Et |És |Entonces |Entón |Então |Entao |En |Eğer ki |Ef |Eeldades |E |Ðurh |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Diberi |Dengan |Den youse gotta |DEN |De |Dato |Dați fiind |Daţi fiind |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann |dann |Dan |Dados |Dado |Dadas |Dada |Ða ðe |Ða |Cuando |Cho |Cando |Când |Cand |Cal |But y'all |But at the end of the day I reckon |BUT |But |Buh |Blimey! |Biết |Bet |Bagi |Aye |awer |Avast! |Atunci |Atesa |Atès |Apabila |Anrhegedig a |Angenommen |And y'all |And |AN |An |an |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Ak |Adott |Ac |Aber |A zároveň |A tiež |A taktiež |A také |A |a |7 |\\* )/)) {\n        state.inStep = true;\n        state.allowPlaceholders = true;\n        state.allowMultilineArgument = true;\n        state.inKeywordLine = true;\n        return \"keyword\";\n\n      // INLINE STRING\n      } else if (stream.match(/\"[^\"]*\"?/)) {\n        return \"string\";\n\n      // PLACEHOLDER\n      } else if (state.allowPlaceholders && stream.match(/<[^>]*>?/)) {\n        return \"variable\";\n\n      // Fall through\n      } else {\n        stream.next();\n        stream.eatWhile(/[^@\"<#]/);\n        return null;\n      }\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-feature\", \"gherkin\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/go/go.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"go\", function(config) {\n  var indentUnit = config.indentUnit;\n\n  var keywords = {\n    \"break\":true, \"case\":true, \"chan\":true, \"const\":true, \"continue\":true,\n    \"default\":true, \"defer\":true, \"else\":true, \"fallthrough\":true, \"for\":true,\n    \"func\":true, \"go\":true, \"goto\":true, \"if\":true, \"import\":true,\n    \"interface\":true, \"map\":true, \"package\":true, \"range\":true, \"return\":true,\n    \"select\":true, \"struct\":true, \"switch\":true, \"type\":true, \"var\":true,\n    \"bool\":true, \"byte\":true, \"complex64\":true, \"complex128\":true,\n    \"float32\":true, \"float64\":true, \"int8\":true, \"int16\":true, \"int32\":true,\n    \"int64\":true, \"string\":true, \"uint8\":true, \"uint16\":true, \"uint32\":true,\n    \"uint64\":true, \"int\":true, \"uint\":true, \"uintptr\":true, \"error\": true,\n    \"rune\":true\n  };\n\n  var atoms = {\n    \"true\":true, \"false\":true, \"iota\":true, \"nil\":true, \"append\":true,\n    \"cap\":true, \"close\":true, \"complex\":true, \"copy\":true, \"delete\":true, \"imag\":true,\n    \"len\":true, \"make\":true, \"new\":true, \"panic\":true, \"print\":true,\n    \"println\":true, \"real\":true, \"recover\":true\n  };\n\n  var isOperatorChar = /[+\\-*&^%:=<>!|\\/]/;\n\n  var curPunc;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\" || ch == \"`\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (/[\\d\\.]/.test(ch)) {\n      if (ch == \".\") {\n        stream.match(/^[0-9]+([eE][\\-+]?[0-9]+)?/);\n      } else if (ch == \"0\") {\n        stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/);\n      } else {\n        stream.match(/^[0-9]*\\.?[0-9]*([eE][\\-+]?[0-9]+)?/);\n      }\n      return \"number\";\n    }\n    if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n    var cur = stream.current();\n    if (keywords.propertyIsEnumerable(cur)) {\n      if (cur == \"case\" || cur == \"default\") curPunc = \"case\";\n      return \"keyword\";\n    }\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && quote != \"`\" && next == \"\\\\\";\n      }\n      if (end || !(escaped || quote == \"`\"))\n        state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type) {\n    return state.context = new Context(state.indented, col, type, null, state.context);\n  }\n  function popContext(state) {\n    if (!state.context.prev) return;\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n        if (ctx.type == \"case\") ctx.type = \"}\";\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"case\") ctx.type = \"case\";\n      else if (curPunc == \"}\" && ctx.type == \"}\") popContext(state);\n      else if (curPunc == ctx.type) popContext(state);\n      state.startOfLine = false;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;\n      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n      if (ctx.type == \"case\" && /^(?:case|default)\\b/.test(textAfter)) {\n        state.context.type = \"}\";\n        return ctx.indented;\n      }\n      var closing = firstChar == ctx.type;\n      if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"{}):\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n    fold: \"brace\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-go\", \"go\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/groovy/groovy.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"groovy\", function(config) {\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  var keywords = words(\n    \"abstract as assert boolean break byte case catch char class const continue def default \" +\n    \"do double else enum extends final finally float for goto if implements import in \" +\n    \"instanceof int interface long native new package private protected public return \" +\n    \"short static strictfp super switch synchronized threadsafe throw throws trait transient \" +\n    \"try void volatile while\");\n  var blockKeywords = words(\"catch class def do else enum finally for if interface switch trait try while\");\n  var standaloneKeywords = words(\"return break continue\");\n  var atoms = words(\"null true false this\");\n\n  var curPunc;\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\") {\n      return startString(ch, stream, state);\n    }\n    if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      if (stream.eat(/eE/)) { stream.eat(/\\+\\-/); stream.eatWhile(/\\d/); }\n      return \"number\";\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize.push(tokenComment);\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      if (expectExpression(state.lastToken, false)) {\n        return startString(ch, stream, state);\n      }\n    }\n    if (ch == \"-\" && stream.eat(\">\")) {\n      curPunc = \"->\";\n      return null;\n    }\n    if (/[+\\-*&%=<>!?|\\/~]/.test(ch)) {\n      stream.eatWhile(/[+\\-*&%=<>|~]/);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_]/);\n    if (ch == \"@\") { stream.eatWhile(/[\\w\\$_\\.]/); return \"meta\"; }\n    if (state.lastToken == \".\") return \"property\";\n    if (stream.eat(\":\")) { curPunc = \"proplabel\"; return \"property\"; }\n    var cur = stream.current();\n    if (atoms.propertyIsEnumerable(cur)) { return \"atom\"; }\n    if (keywords.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      else if (standaloneKeywords.propertyIsEnumerable(cur)) curPunc = \"standalone\";\n      return \"keyword\";\n    }\n    return \"variable\";\n  }\n  tokenBase.isBase = true;\n\n  function startString(quote, stream, state) {\n    var tripleQuoted = false;\n    if (quote != \"/\" && stream.eat(quote)) {\n      if (stream.eat(quote)) tripleQuoted = true;\n      else return \"string\";\n    }\n    function t(stream, state) {\n      var escaped = false, next, end = !tripleQuoted;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n          if (!tripleQuoted) { break; }\n          if (stream.match(quote + quote)) { end = true; break; }\n        }\n        if (quote == '\"' && next == \"$\" && !escaped && stream.eat(\"{\")) {\n          state.tokenize.push(tokenBaseUntilBrace());\n          return \"string\";\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end) state.tokenize.pop();\n      return \"string\";\n    }\n    state.tokenize.push(t);\n    return t(stream, state);\n  }\n\n  function tokenBaseUntilBrace() {\n    var depth = 1;\n    function t(stream, state) {\n      if (stream.peek() == \"}\") {\n        depth--;\n        if (depth == 0) {\n          state.tokenize.pop();\n          return state.tokenize[state.tokenize.length-1](stream, state);\n        }\n      } else if (stream.peek() == \"{\") {\n        depth++;\n      }\n      return tokenBase(stream, state);\n    }\n    t.isBase = true;\n    return t;\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize.pop();\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function expectExpression(last, newline) {\n    return !last || last == \"operator\" || last == \"->\" || /[\\.\\[\\{\\(,;:]/.test(last) ||\n      last == \"newstatement\" || last == \"keyword\" || last == \"proplabel\" ||\n      (last == \"standalone\" && !newline);\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type) {\n    return state.context = new Context(state.indented, col, type, null, state.context);\n  }\n  function popContext(state) {\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: [tokenBase],\n        context: new Context((basecolumn || 0) - config.indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true,\n        lastToken: null\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n        // Automatic semicolon insertion\n        if (ctx.type == \"statement\" && !expectExpression(state.lastToken, true)) {\n          popContext(state); ctx = state.context;\n        }\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      var style = state.tokenize[state.tokenize.length-1](stream, state);\n      if (style == \"comment\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if ((curPunc == \";\" || curPunc == \":\") && ctx.type == \"statement\") popContext(state);\n      // Handle indentation for {x -> \\n ... }\n      else if (curPunc == \"->\" && ctx.type == \"statement\" && ctx.prev.type == \"}\") {\n        popContext(state);\n        state.context.align = false;\n      }\n      else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"}\") {\n        while (ctx.type == \"statement\") ctx = popContext(state);\n        if (ctx.type == \"}\") ctx = popContext(state);\n        while (ctx.type == \"statement\") ctx = popContext(state);\n      }\n      else if (curPunc == ctx.type) popContext(state);\n      else if (ctx.type == \"}\" || ctx.type == \"top\" || (ctx.type == \"statement\" && curPunc == \"newstatement\"))\n        pushContext(state, stream.column(), \"statement\");\n      state.startOfLine = false;\n      state.lastToken = curPunc || style;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (!state.tokenize[state.tokenize.length-1].isBase) return CodeMirror.Pass;\n      var firstChar = textAfter && textAfter.charAt(0), ctx = state.context;\n      if (ctx.type == \"statement\" && !expectExpression(state.lastToken, true)) ctx = ctx.prev;\n      var closing = firstChar == ctx.type;\n      if (ctx.type == \"statement\") return ctx.indented + (firstChar == \"{\" ? 0 : config.indentUnit);\n      else if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : config.indentUnit);\n    },\n\n    electricChars: \"{}\",\n    closeBrackets: {triples: \"'\\\"\"},\n    fold: \"brace\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-groovy\", \"groovy\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/haml/haml.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"), require(\"../ruby/ruby\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\", \"../ruby/ruby\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\n  // full haml mode. This handled embedded ruby and html fragments too\n  CodeMirror.defineMode(\"haml\", function(config) {\n    var htmlMode = CodeMirror.getMode(config, {name: \"htmlmixed\"});\n    var rubyMode = CodeMirror.getMode(config, \"ruby\");\n\n    function rubyInQuote(endQuote) {\n      return function(stream, state) {\n        var ch = stream.peek();\n        if (ch == endQuote && state.rubyState.tokenize.length == 1) {\n          // step out of ruby context as it seems to complete processing all the braces\n          stream.next();\n          state.tokenize = html;\n          return \"closeAttributeTag\";\n        } else {\n          return ruby(stream, state);\n        }\n      };\n    }\n\n    function ruby(stream, state) {\n      if (stream.match(\"-#\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      return rubyMode.token(stream, state.rubyState);\n    }\n\n    function html(stream, state) {\n      var ch = stream.peek();\n\n      // handle haml declarations. All declarations that cant be handled here\n      // will be passed to html mode\n      if (state.previousToken.style == \"comment\" ) {\n        if (state.indented > state.previousToken.indented) {\n          stream.skipToEnd();\n          return \"commentLine\";\n        }\n      }\n\n      if (state.startOfLine) {\n        if (ch == \"!\" && stream.match(\"!!\")) {\n          stream.skipToEnd();\n          return \"tag\";\n        } else if (stream.match(/^%[\\w:#\\.]+=/)) {\n          state.tokenize = ruby;\n          return \"hamlTag\";\n        } else if (stream.match(/^%[\\w:]+/)) {\n          return \"hamlTag\";\n        } else if (ch == \"/\" ) {\n          stream.skipToEnd();\n          return \"comment\";\n        }\n      }\n\n      if (state.startOfLine || state.previousToken.style == \"hamlTag\") {\n        if ( ch == \"#\" || ch == \".\") {\n          stream.match(/[\\w-#\\.]*/);\n          return \"hamlAttribute\";\n        }\n      }\n\n      // do not handle --> as valid ruby, make it HTML close comment instead\n      if (state.startOfLine && !stream.match(\"-->\", false) && (ch == \"=\" || ch == \"-\" )) {\n        state.tokenize = ruby;\n        return state.tokenize(stream, state);\n      }\n\n      if (state.previousToken.style == \"hamlTag\" ||\n          state.previousToken.style == \"closeAttributeTag\" ||\n          state.previousToken.style == \"hamlAttribute\") {\n        if (ch == \"(\") {\n          state.tokenize = rubyInQuote(\")\");\n          return state.tokenize(stream, state);\n        } else if (ch == \"{\") {\n          if (!stream.match(/^\\{%.*/)) {\n            state.tokenize = rubyInQuote(\"}\");\n            return state.tokenize(stream, state);\n          }\n        }\n      }\n\n      return htmlMode.token(stream, state.htmlState);\n    }\n\n    return {\n      // default to html mode\n      startState: function() {\n        var htmlState = CodeMirror.startState(htmlMode);\n        var rubyState = CodeMirror.startState(rubyMode);\n        return {\n          htmlState: htmlState,\n          rubyState: rubyState,\n          indented: 0,\n          previousToken: { style: null, indented: 0},\n          tokenize: html\n        };\n      },\n\n      copyState: function(state) {\n        return {\n          htmlState : CodeMirror.copyState(htmlMode, state.htmlState),\n          rubyState: CodeMirror.copyState(rubyMode, state.rubyState),\n          indented: state.indented,\n          previousToken: state.previousToken,\n          tokenize: state.tokenize\n        };\n      },\n\n      token: function(stream, state) {\n        if (stream.sol()) {\n          state.indented = stream.indentation();\n          state.startOfLine = true;\n        }\n        if (stream.eatSpace()) return null;\n        var style = state.tokenize(stream, state);\n        state.startOfLine = false;\n        // dont record comment line as we only want to measure comment line with\n        // the opening comment block\n        if (style && style != \"commentLine\") {\n          state.previousToken = { style: style, indented: state.indented };\n        }\n        // if current state is ruby and the previous token is not `,` reset the\n        // tokenize to html\n        if (stream.eol() && state.tokenize == ruby) {\n          stream.backUp(1);\n          var ch = stream.peek();\n          stream.next();\n          if (ch && ch != \",\") {\n            state.tokenize = html;\n          }\n        }\n        // reprocess some of the specific style tag when finish setting previousToken\n        if (style == \"hamlTag\") {\n          style = \"tag\";\n        } else if (style == \"commentLine\") {\n          style = \"comment\";\n        } else if (style == \"hamlAttribute\") {\n          style = \"attribute\";\n        } else if (style == \"closeAttributeTag\") {\n          style = null;\n        }\n        return style;\n      }\n    };\n  }, \"htmlmixed\", \"ruby\");\n\n  CodeMirror.defineMIME(\"text/x-haml\", \"haml\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/handlebars/handlebars.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"), require(\"../../addon/mode/multiplex\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\", \"../../addon/mode/multiplex\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineSimpleMode(\"handlebars-tags\", {\n    start: [\n      { regex: /\\{\\{\\{/, push: \"handlebars_raw\", token: \"tag\" },\n      { regex: /\\{\\{!--/, push: \"dash_comment\", token: \"comment\" },\n      { regex: /\\{\\{!/,   push: \"comment\", token: \"comment\" },\n      { regex: /\\{\\{/,    push: \"handlebars\", token: \"tag\" }\n    ],\n    handlebars_raw: [\n      { regex: /\\}\\}\\}/, pop: true, token: \"tag\" },\n    ],\n    handlebars: [\n      { regex: /\\}\\}/, pop: true, token: \"tag\" },\n\n      // Double and single quotes\n      { regex: /\"(?:[^\\\\\"]|\\\\.)*\"?/, token: \"string\" },\n      { regex: /'(?:[^\\\\']|\\\\.)*'?/, token: \"string\" },\n\n      // Handlebars keywords\n      { regex: />|[#\\/]([A-Za-z_]\\w*)/, token: \"keyword\" },\n      { regex: /(?:else|this)\\b/, token: \"keyword\" },\n\n      // Numeral\n      { regex: /\\d+/i, token: \"number\" },\n\n      // Atoms like = and .\n      { regex: /=|~|@|true|false/, token: \"atom\" },\n\n      // Paths\n      { regex: /(?:\\.\\.\\/)*(?:[A-Za-z_][\\w\\.]*)+/, token: \"variable-2\" }\n    ],\n    dash_comment: [\n      { regex: /--\\}\\}/, pop: true, token: \"comment\" },\n\n      // Commented code\n      { regex: /./, token: \"comment\"}\n    ],\n    comment: [\n      { regex: /\\}\\}/, pop: true, token: \"comment\" },\n      { regex: /./, token: \"comment\" }\n    ],\n    meta: {\n      blockCommentStart: \"{{--\",\n      blockCommentEnd: \"--}}\"\n    }\n  });\n\n  CodeMirror.defineMode(\"handlebars\", function(config, parserConfig) {\n    var handlebars = CodeMirror.getMode(config, \"handlebars-tags\");\n    if (!parserConfig || !parserConfig.base) return handlebars;\n    return CodeMirror.multiplexingMode(\n      CodeMirror.getMode(config, parserConfig.base),\n      {open: \"{{\", close: /\\}\\}\\}?/, mode: handlebars, parseDelimiters: true}\n    );\n  });\n\n  CodeMirror.defineMIME(\"text/x-handlebars-template\", \"handlebars\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/haskell/haskell.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"haskell\", function(_config, modeConfig) {\n\n  function switchState(source, setState, f) {\n    setState(f);\n    return f(source, setState);\n  }\n\n  // These should all be Unicode extended, as per the Haskell 2010 report\n  var smallRE = /[a-z_]/;\n  var largeRE = /[A-Z]/;\n  var digitRE = /\\d/;\n  var hexitRE = /[0-9A-Fa-f]/;\n  var octitRE = /[0-7]/;\n  var idRE = /[a-z_A-Z0-9'\\xa1-\\uffff]/;\n  var symbolRE = /[-!#$%&*+.\\/<=>?@\\\\^|~:]/;\n  var specialRE = /[(),;[\\]`{}]/;\n  var whiteCharRE = /[ \\t\\v\\f]/; // newlines are handled in tokenizer\n\n  function normal(source, setState) {\n    if (source.eatWhile(whiteCharRE)) {\n      return null;\n    }\n\n    var ch = source.next();\n    if (specialRE.test(ch)) {\n      if (ch == '{' && source.eat('-')) {\n        var t = \"comment\";\n        if (source.eat('#')) {\n          t = \"meta\";\n        }\n        return switchState(source, setState, ncomment(t, 1));\n      }\n      return null;\n    }\n\n    if (ch == '\\'') {\n      if (source.eat('\\\\')) {\n        source.next();  // should handle other escapes here\n      }\n      else {\n        source.next();\n      }\n      if (source.eat('\\'')) {\n        return \"string\";\n      }\n      return \"string error\";\n    }\n\n    if (ch == '\"') {\n      return switchState(source, setState, stringLiteral);\n    }\n\n    if (largeRE.test(ch)) {\n      source.eatWhile(idRE);\n      if (source.eat('.')) {\n        return \"qualifier\";\n      }\n      return \"variable-2\";\n    }\n\n    if (smallRE.test(ch)) {\n      source.eatWhile(idRE);\n      return \"variable\";\n    }\n\n    if (digitRE.test(ch)) {\n      if (ch == '0') {\n        if (source.eat(/[xX]/)) {\n          source.eatWhile(hexitRE); // should require at least 1\n          return \"integer\";\n        }\n        if (source.eat(/[oO]/)) {\n          source.eatWhile(octitRE); // should require at least 1\n          return \"number\";\n        }\n      }\n      source.eatWhile(digitRE);\n      var t = \"number\";\n      if (source.match(/^\\.\\d+/)) {\n        t = \"number\";\n      }\n      if (source.eat(/[eE]/)) {\n        t = \"number\";\n        source.eat(/[-+]/);\n        source.eatWhile(digitRE); // should require at least 1\n      }\n      return t;\n    }\n\n    if (ch == \".\" && source.eat(\".\"))\n      return \"keyword\";\n\n    if (symbolRE.test(ch)) {\n      if (ch == '-' && source.eat(/-/)) {\n        source.eatWhile(/-/);\n        if (!source.eat(symbolRE)) {\n          source.skipToEnd();\n          return \"comment\";\n        }\n      }\n      var t = \"variable\";\n      if (ch == ':') {\n        t = \"variable-2\";\n      }\n      source.eatWhile(symbolRE);\n      return t;\n    }\n\n    return \"error\";\n  }\n\n  function ncomment(type, nest) {\n    if (nest == 0) {\n      return normal;\n    }\n    return function(source, setState) {\n      var currNest = nest;\n      while (!source.eol()) {\n        var ch = source.next();\n        if (ch == '{' && source.eat('-')) {\n          ++currNest;\n        }\n        else if (ch == '-' && source.eat('}')) {\n          --currNest;\n          if (currNest == 0) {\n            setState(normal);\n            return type;\n          }\n        }\n      }\n      setState(ncomment(type, currNest));\n      return type;\n    };\n  }\n\n  function stringLiteral(source, setState) {\n    while (!source.eol()) {\n      var ch = source.next();\n      if (ch == '\"') {\n        setState(normal);\n        return \"string\";\n      }\n      if (ch == '\\\\') {\n        if (source.eol() || source.eat(whiteCharRE)) {\n          setState(stringGap);\n          return \"string\";\n        }\n        if (source.eat('&')) {\n        }\n        else {\n          source.next(); // should handle other escapes here\n        }\n      }\n    }\n    setState(normal);\n    return \"string error\";\n  }\n\n  function stringGap(source, setState) {\n    if (source.eat('\\\\')) {\n      return switchState(source, setState, stringLiteral);\n    }\n    source.next();\n    setState(normal);\n    return \"error\";\n  }\n\n\n  var wellKnownWords = (function() {\n    var wkw = {};\n    function setType(t) {\n      return function () {\n        for (var i = 0; i < arguments.length; i++)\n          wkw[arguments[i]] = t;\n      };\n    }\n\n    setType(\"keyword\")(\n      \"case\", \"class\", \"data\", \"default\", \"deriving\", \"do\", \"else\", \"foreign\",\n      \"if\", \"import\", \"in\", \"infix\", \"infixl\", \"infixr\", \"instance\", \"let\",\n      \"module\", \"newtype\", \"of\", \"then\", \"type\", \"where\", \"_\");\n\n    setType(\"keyword\")(\n      \"\\.\\.\", \":\", \"::\", \"=\", \"\\\\\", \"<-\", \"->\", \"@\", \"~\", \"=>\");\n\n    setType(\"builtin\")(\n      \"!!\", \"$!\", \"$\", \"&&\", \"+\", \"++\", \"-\", \".\", \"/\", \"/=\", \"<\", \"<*\", \"<=\",\n      \"<$>\", \"<*>\", \"=<<\", \"==\", \">\", \">=\", \">>\", \">>=\", \"^\", \"^^\", \"||\", \"*\",\n      \"*>\", \"**\");\n\n    setType(\"builtin\")(\n      \"Applicative\", \"Bool\", \"Bounded\", \"Char\", \"Double\", \"EQ\", \"Either\", \"Enum\",\n      \"Eq\", \"False\", \"FilePath\", \"Float\", \"Floating\", \"Fractional\", \"Functor\",\n      \"GT\", \"IO\", \"IOError\", \"Int\", \"Integer\", \"Integral\", \"Just\", \"LT\", \"Left\",\n      \"Maybe\", \"Monad\", \"Nothing\", \"Num\", \"Ord\", \"Ordering\", \"Rational\", \"Read\",\n      \"ReadS\", \"Real\", \"RealFloat\", \"RealFrac\", \"Right\", \"Show\", \"ShowS\",\n      \"String\", \"True\");\n\n    setType(\"builtin\")(\n      \"abs\", \"acos\", \"acosh\", \"all\", \"and\", \"any\", \"appendFile\", \"asTypeOf\",\n      \"asin\", \"asinh\", \"atan\", \"atan2\", \"atanh\", \"break\", \"catch\", \"ceiling\",\n      \"compare\", \"concat\", \"concatMap\", \"const\", \"cos\", \"cosh\", \"curry\",\n      \"cycle\", \"decodeFloat\", \"div\", \"divMod\", \"drop\", \"dropWhile\", \"either\",\n      \"elem\", \"encodeFloat\", \"enumFrom\", \"enumFromThen\", \"enumFromThenTo\",\n      \"enumFromTo\", \"error\", \"even\", \"exp\", \"exponent\", \"fail\", \"filter\",\n      \"flip\", \"floatDigits\", \"floatRadix\", \"floatRange\", \"floor\", \"fmap\",\n      \"foldl\", \"foldl1\", \"foldr\", \"foldr1\", \"fromEnum\", \"fromInteger\",\n      \"fromIntegral\", \"fromRational\", \"fst\", \"gcd\", \"getChar\", \"getContents\",\n      \"getLine\", \"head\", \"id\", \"init\", \"interact\", \"ioError\", \"isDenormalized\",\n      \"isIEEE\", \"isInfinite\", \"isNaN\", \"isNegativeZero\", \"iterate\", \"last\",\n      \"lcm\", \"length\", \"lex\", \"lines\", \"log\", \"logBase\", \"lookup\", \"map\",\n      \"mapM\", \"mapM_\", \"max\", \"maxBound\", \"maximum\", \"maybe\", \"min\", \"minBound\",\n      \"minimum\", \"mod\", \"negate\", \"not\", \"notElem\", \"null\", \"odd\", \"or\",\n      \"otherwise\", \"pi\", \"pred\", \"print\", \"product\", \"properFraction\", \"pure\",\n      \"putChar\", \"putStr\", \"putStrLn\", \"quot\", \"quotRem\", \"read\", \"readFile\",\n      \"readIO\", \"readList\", \"readLn\", \"readParen\", \"reads\", \"readsPrec\",\n      \"realToFrac\", \"recip\", \"rem\", \"repeat\", \"replicate\", \"return\", \"reverse\",\n      \"round\", \"scaleFloat\", \"scanl\", \"scanl1\", \"scanr\", \"scanr1\", \"seq\",\n      \"sequence\", \"sequence_\", \"show\", \"showChar\", \"showList\", \"showParen\",\n      \"showString\", \"shows\", \"showsPrec\", \"significand\", \"signum\", \"sin\",\n      \"sinh\", \"snd\", \"span\", \"splitAt\", \"sqrt\", \"subtract\", \"succ\", \"sum\",\n      \"tail\", \"take\", \"takeWhile\", \"tan\", \"tanh\", \"toEnum\", \"toInteger\",\n      \"toRational\", \"truncate\", \"uncurry\", \"undefined\", \"unlines\", \"until\",\n      \"unwords\", \"unzip\", \"unzip3\", \"userError\", \"words\", \"writeFile\", \"zip\",\n      \"zip3\", \"zipWith\", \"zipWith3\");\n\n    var override = modeConfig.overrideKeywords;\n    if (override) for (var word in override) if (override.hasOwnProperty(word))\n      wkw[word] = override[word];\n\n    return wkw;\n  })();\n\n\n\n  return {\n    startState: function ()  { return { f: normal }; },\n    copyState:  function (s) { return { f: s.f }; },\n\n    token: function(stream, state) {\n      var t = state.f(stream, function(s) { state.f = s; });\n      var w = stream.current();\n      return wellKnownWords.hasOwnProperty(w) ? wellKnownWords[w] : t;\n    },\n\n    blockCommentStart: \"{-\",\n    blockCommentEnd: \"-}\",\n    lineComment: \"--\"\n  };\n\n});\n\nCodeMirror.defineMIME(\"text/x-haskell\", \"haskell\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/haskell-literate/haskell-literate.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function (mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../haskell/haskell\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../haskell/haskell\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function (CodeMirror) {\n  \"use strict\"\n\n  CodeMirror.defineMode(\"haskell-literate\", function (config, parserConfig) {\n    var baseMode = CodeMirror.getMode(config, (parserConfig && parserConfig.base) || \"haskell\")\n\n    return {\n      startState: function () {\n        return {\n          inCode: false,\n          baseState: CodeMirror.startState(baseMode)\n        }\n      },\n      token: function (stream, state) {\n        if (stream.sol()) {\n          if (state.inCode = stream.eat(\">\"))\n            return \"meta\"\n        }\n        if (state.inCode) {\n          return baseMode.token(stream, state.baseState)\n        } else {\n          stream.skipToEnd()\n          return \"comment\"\n        }\n      },\n      innerMode: function (state) {\n        return state.inCode ? {state: state.baseState, mode: baseMode} : null\n      }\n    }\n  }, \"haskell\")\n\n  CodeMirror.defineMIME(\"text/x-literate-haskell\", \"haskell-literate\")\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/haxe/haxe.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"haxe\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit;\n\n  // Tokenizer\n\n  function kw(type) {return {type: type, style: \"keyword\"};}\n  var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\");\n  var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"}, attribute = {type:\"attribute\", style: \"attribute\"};\n  var type = kw(\"typedef\");\n  var keywords = {\n    \"if\": A, \"while\": A, \"else\": B, \"do\": B, \"try\": B,\n    \"return\": C, \"break\": C, \"continue\": C, \"new\": C, \"throw\": C,\n    \"var\": kw(\"var\"), \"inline\":attribute, \"static\": attribute, \"using\":kw(\"import\"),\n    \"public\": attribute, \"private\": attribute, \"cast\": kw(\"cast\"), \"import\": kw(\"import\"), \"macro\": kw(\"macro\"),\n    \"function\": kw(\"function\"), \"catch\": kw(\"catch\"), \"untyped\": kw(\"untyped\"), \"callback\": kw(\"cb\"),\n    \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n    \"in\": operator, \"never\": kw(\"property_access\"), \"trace\":kw(\"trace\"),\n    \"class\": type, \"abstract\":type, \"enum\":type, \"interface\":type, \"typedef\":type, \"extends\":type, \"implements\":type, \"dynamic\":type,\n    \"true\": atom, \"false\": atom, \"null\": atom\n  };\n\n  var isOperatorChar = /[+\\-*&%=<>!?|]/;\n\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n\n  function toUnescaped(stream, end) {\n    var escaped = false, next;\n    while ((next = stream.next()) != null) {\n      if (next == end && !escaped)\n        return true;\n      escaped = !escaped && next == \"\\\\\";\n    }\n  }\n\n  // Used as scratch variables to communicate multiple values without\n  // consing up tons of objects.\n  var type, content;\n  function ret(tp, style, cont) {\n    type = tp; content = cont;\n    return style;\n  }\n\n  function haxeTokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\") {\n      return chain(stream, state, haxeTokenString(ch));\n    } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      return ret(ch);\n    } else if (ch == \"0\" && stream.eat(/x/i)) {\n      stream.eatWhile(/[\\da-f]/i);\n      return ret(\"number\", \"number\");\n    } else if (/\\d/.test(ch) || ch == \"-\" && stream.eat(/\\d/)) {\n      stream.match(/^\\d*(?:\\.\\d*(?!\\.))?(?:[eE][+\\-]?\\d+)?/);\n      return ret(\"number\", \"number\");\n    } else if (state.reAllowed && (ch == \"~\" && stream.eat(/\\//))) {\n      toUnescaped(stream, \"/\");\n      stream.eatWhile(/[gimsu]/);\n      return ret(\"regexp\", \"string-2\");\n    } else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        return chain(stream, state, haxeTokenComment);\n      } else if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return ret(\"comment\", \"comment\");\n      } else {\n        stream.eatWhile(isOperatorChar);\n        return ret(\"operator\", null, stream.current());\n      }\n    } else if (ch == \"#\") {\n        stream.skipToEnd();\n        return ret(\"conditional\", \"meta\");\n    } else if (ch == \"@\") {\n      stream.eat(/:/);\n      stream.eatWhile(/[\\w_]/);\n      return ret (\"metadata\", \"meta\");\n    } else if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return ret(\"operator\", null, stream.current());\n    } else {\n      var word;\n      if(/[A-Z]/.test(ch)) {\n        stream.eatWhile(/[\\w_<>]/);\n        word = stream.current();\n        return ret(\"type\", \"variable-3\", word);\n      } else {\n        stream.eatWhile(/[\\w_]/);\n        var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];\n        return (known && state.kwAllowed) ? ret(known.type, known.style, word) :\n                       ret(\"variable\", \"variable\", word);\n      }\n    }\n  }\n\n  function haxeTokenString(quote) {\n    return function(stream, state) {\n      if (toUnescaped(stream, quote))\n        state.tokenize = haxeTokenBase;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  function haxeTokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = haxeTokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  // Parser\n\n  var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true};\n\n  function HaxeLexical(indented, column, type, align, prev, info) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.prev = prev;\n    this.info = info;\n    if (align != null) this.align = align;\n  }\n\n  function inScope(state, varname) {\n    for (var v = state.localVars; v; v = v.next)\n      if (v.name == varname) return true;\n  }\n\n  function parseHaxe(state, style, type, content, stream) {\n    var cc = state.cc;\n    // Communicate our context to the combinators.\n    // (Less wasteful than consing up a hundred closures on every call.)\n    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;\n\n    if (!state.lexical.hasOwnProperty(\"align\"))\n      state.lexical.align = true;\n\n    while(true) {\n      var combinator = cc.length ? cc.pop() : statement;\n      if (combinator(type, content)) {\n        while(cc.length && cc[cc.length - 1].lex)\n          cc.pop()();\n        if (cx.marked) return cx.marked;\n        if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n        if (type == \"variable\" && imported(state, content)) return \"variable-3\";\n        return style;\n      }\n    }\n  }\n\n  function imported(state, typename) {\n    if (/[a-z]/.test(typename.charAt(0)))\n      return false;\n    var len = state.importedtypes.length;\n    for (var i = 0; i<len; i++)\n      if(state.importedtypes[i]==typename) return true;\n  }\n\n  function registerimport(importname) {\n    var state = cx.state;\n    for (var t = state.importedtypes; t; t = t.next)\n      if(t.name == importname) return;\n    state.importedtypes = { name: importname, next: state.importedtypes };\n  }\n  // Combinator utils\n\n  var cx = {state: null, column: null, marked: null, cc: null};\n  function pass() {\n    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n  }\n  function cont() {\n    pass.apply(null, arguments);\n    return true;\n  }\n  function inList(name, list) {\n    for (var v = list; v; v = v.next)\n      if (v.name == name) return true;\n    return false;\n  }\n  function register(varname) {\n    var state = cx.state;\n    if (state.context) {\n      cx.marked = \"def\";\n      if (inList(varname, state.localVars)) return;\n      state.localVars = {name: varname, next: state.localVars};\n    } else if (state.globalVars) {\n      if (inList(varname, state.globalVars)) return;\n      state.globalVars = {name: varname, next: state.globalVars};\n    }\n  }\n\n  // Combinators\n\n  var defaultVars = {name: \"this\", next: null};\n  function pushcontext() {\n    if (!cx.state.context) cx.state.localVars = defaultVars;\n    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};\n  }\n  function popcontext() {\n    cx.state.localVars = cx.state.context.vars;\n    cx.state.context = cx.state.context.prev;\n  }\n  popcontext.lex = true;\n  function pushlex(type, info) {\n    var result = function() {\n      var state = cx.state;\n      state.lexical = new HaxeLexical(state.indented, cx.stream.column(), type, null, state.lexical, info);\n    };\n    result.lex = true;\n    return result;\n  }\n  function poplex() {\n    var state = cx.state;\n    if (state.lexical.prev) {\n      if (state.lexical.type == \")\")\n        state.indented = state.lexical.indented;\n      state.lexical = state.lexical.prev;\n    }\n  }\n  poplex.lex = true;\n\n  function expect(wanted) {\n    function f(type) {\n      if (type == wanted) return cont();\n      else if (wanted == \";\") return pass();\n      else return cont(f);\n    }\n    return f;\n  }\n\n  function statement(type) {\n    if (type == \"@\") return cont(metadef);\n    if (type == \"var\") return cont(pushlex(\"vardef\"), vardef1, expect(\";\"), poplex);\n    if (type == \"keyword a\") return cont(pushlex(\"form\"), expression, statement, poplex);\n    if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n    if (type == \"{\") return cont(pushlex(\"}\"), pushcontext, block, poplex, popcontext);\n    if (type == \";\") return cont();\n    if (type == \"attribute\") return cont(maybeattribute);\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"for\") return cont(pushlex(\"form\"), expect(\"(\"), pushlex(\")\"), forspec1, expect(\")\"),\n                                   poplex, statement, poplex);\n    if (type == \"variable\") return cont(pushlex(\"stat\"), maybelabel);\n    if (type == \"switch\") return cont(pushlex(\"form\"), expression, pushlex(\"}\", \"switch\"), expect(\"{\"),\n                                      block, poplex, poplex);\n    if (type == \"case\") return cont(expression, expect(\":\"));\n    if (type == \"default\") return cont(expect(\":\"));\n    if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, expect(\"(\"), funarg, expect(\")\"),\n                                     statement, poplex, popcontext);\n    if (type == \"import\") return cont(importdef, expect(\";\"));\n    if (type == \"typedef\") return cont(typedef);\n    return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n  }\n  function expression(type) {\n    if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);\n    if (type == \"type\" ) return cont(maybeoperator);\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"keyword c\") return cont(maybeexpression);\n    if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex, maybeoperator);\n    if (type == \"operator\") return cont(expression);\n    if (type == \"[\") return cont(pushlex(\"]\"), commasep(maybeexpression, \"]\"), poplex, maybeoperator);\n    if (type == \"{\") return cont(pushlex(\"}\"), commasep(objprop, \"}\"), poplex, maybeoperator);\n    return cont();\n  }\n  function maybeexpression(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expression);\n  }\n\n  function maybeoperator(type, value) {\n    if (type == \"operator\" && /\\+\\+|--/.test(value)) return cont(maybeoperator);\n    if (type == \"operator\" || type == \":\") return cont(expression);\n    if (type == \";\") return;\n    if (type == \"(\") return cont(pushlex(\")\"), commasep(expression, \")\"), poplex, maybeoperator);\n    if (type == \".\") return cont(property, maybeoperator);\n    if (type == \"[\") return cont(pushlex(\"]\"), expression, expect(\"]\"), poplex, maybeoperator);\n  }\n\n  function maybeattribute(type) {\n    if (type == \"attribute\") return cont(maybeattribute);\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"var\") return cont(vardef1);\n  }\n\n  function metadef(type) {\n    if(type == \":\") return cont(metadef);\n    if(type == \"variable\") return cont(metadef);\n    if(type == \"(\") return cont(pushlex(\")\"), commasep(metaargs, \")\"), poplex, statement);\n  }\n  function metaargs(type) {\n    if(type == \"variable\") return cont();\n  }\n\n  function importdef (type, value) {\n    if(type == \"variable\" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); }\n    else if(type == \"variable\" || type == \"property\" || type == \".\" || value == \"*\") return cont(importdef);\n  }\n\n  function typedef (type, value)\n  {\n    if(type == \"variable\" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); }\n    else if (type == \"type\" && /[A-Z]/.test(value.charAt(0))) { return cont(); }\n  }\n\n  function maybelabel(type) {\n    if (type == \":\") return cont(poplex, statement);\n    return pass(maybeoperator, expect(\";\"), poplex);\n  }\n  function property(type) {\n    if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n  }\n  function objprop(type) {\n    if (type == \"variable\") cx.marked = \"property\";\n    if (atomicTypes.hasOwnProperty(type)) return cont(expect(\":\"), expression);\n  }\n  function commasep(what, end) {\n    function proceed(type) {\n      if (type == \",\") return cont(what, proceed);\n      if (type == end) return cont();\n      return cont(expect(end));\n    }\n    return function(type) {\n      if (type == end) return cont();\n      else return pass(what, proceed);\n    };\n  }\n  function block(type) {\n    if (type == \"}\") return cont();\n    return pass(statement, block);\n  }\n  function vardef1(type, value) {\n    if (type == \"variable\"){register(value); return cont(typeuse, vardef2);}\n    return cont();\n  }\n  function vardef2(type, value) {\n    if (value == \"=\") return cont(expression, vardef2);\n    if (type == \",\") return cont(vardef1);\n  }\n  function forspec1(type, value) {\n    if (type == \"variable\") {\n      register(value);\n      return cont(forin, expression)\n    } else {\n      return pass()\n    }\n  }\n  function forin(_type, value) {\n    if (value == \"in\") return cont();\n  }\n  function functiondef(type, value) {\n    //function names starting with upper-case letters are recognised as types, so cludging them together here.\n    if (type == \"variable\" || type == \"type\") {register(value); return cont(functiondef);}\n    if (value == \"new\") return cont(functiondef);\n    if (type == \"(\") return cont(pushlex(\")\"), pushcontext, commasep(funarg, \")\"), poplex, typeuse, statement, popcontext);\n  }\n  function typeuse(type) {\n    if(type == \":\") return cont(typestring);\n  }\n  function typestring(type) {\n    if(type == \"type\") return cont();\n    if(type == \"variable\") return cont();\n    if(type == \"{\") return cont(pushlex(\"}\"), commasep(typeprop, \"}\"), poplex);\n  }\n  function typeprop(type) {\n    if(type == \"variable\") return cont(typeuse);\n  }\n  function funarg(type, value) {\n    if (type == \"variable\") {register(value); return cont(typeuse);}\n  }\n\n  // Interface\n  return {\n    startState: function(basecolumn) {\n      var defaulttypes = [\"Int\", \"Float\", \"String\", \"Void\", \"Std\", \"Bool\", \"Dynamic\", \"Array\"];\n      var state = {\n        tokenize: haxeTokenBase,\n        reAllowed: true,\n        kwAllowed: true,\n        cc: [],\n        lexical: new HaxeLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n        localVars: parserConfig.localVars,\n        importedtypes: defaulttypes,\n        context: parserConfig.localVars && {vars: parserConfig.localVars},\n        indented: 0\n      };\n      if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n        state.globalVars = parserConfig.globalVars;\n      return state;\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (!state.lexical.hasOwnProperty(\"align\"))\n          state.lexical.align = false;\n        state.indented = stream.indentation();\n      }\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      if (type == \"comment\") return style;\n      state.reAllowed = !!(type == \"operator\" || type == \"keyword c\" || type.match(/^[\\[{}\\(,;:]$/));\n      state.kwAllowed = type != '.';\n      return parseHaxe(state, style, type, content, stream);\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != haxeTokenBase) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;\n      if (lexical.type == \"stat\" && firstChar == \"}\") lexical = lexical.prev;\n      var type = lexical.type, closing = firstChar == type;\n      if (type == \"vardef\") return lexical.indented + 4;\n      else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n      else if (type == \"stat\" || type == \"form\") return lexical.indented + indentUnit;\n      else if (lexical.info == \"switch\" && !closing)\n        return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n      else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n      else return lexical.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"{}\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-haxe\", \"haxe\");\n\nCodeMirror.defineMode(\"hxml\", function () {\n\n  return {\n    startState: function () {\n      return {\n        define: false,\n        inString: false\n      };\n    },\n    token: function (stream, state) {\n      var ch = stream.peek();\n      var sol = stream.sol();\n\n      ///* comments */\n      if (ch == \"#\") {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      if (sol && ch == \"-\") {\n        var style = \"variable-2\";\n\n        stream.eat(/-/);\n\n        if (stream.peek() == \"-\") {\n          stream.eat(/-/);\n          style = \"keyword a\";\n        }\n\n        if (stream.peek() == \"D\") {\n          stream.eat(/[D]/);\n          style = \"keyword c\";\n          state.define = true;\n        }\n\n        stream.eatWhile(/[A-Z]/i);\n        return style;\n      }\n\n      var ch = stream.peek();\n\n      if (state.inString == false && ch == \"'\") {\n        state.inString = true;\n        stream.next();\n      }\n\n      if (state.inString == true) {\n        if (stream.skipTo(\"'\")) {\n\n        } else {\n          stream.skipToEnd();\n        }\n\n        if (stream.peek() == \"'\") {\n          stream.next();\n          state.inString = false;\n        }\n\n        return \"string\";\n      }\n\n      stream.next();\n      return null;\n    },\n    lineComment: \"#\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-hxml\", \"hxml\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/htmlembedded/htmlembedded.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"),\n        require(\"../../addon/mode/multiplex\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\",\n            \"../../addon/mode/multiplex\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"htmlembedded\", function(config, parserConfig) {\n    var closeComment = parserConfig.closeComment || \"--%>\"\n    return CodeMirror.multiplexingMode(CodeMirror.getMode(config, \"htmlmixed\"), {\n      open: parserConfig.openComment || \"<%--\",\n      close: closeComment,\n      delimStyle: \"comment\",\n      mode: {token: function(stream) {\n        stream.skipTo(closeComment) || stream.skipToEnd()\n        return \"comment\"\n      }}\n    }, {\n      open: parserConfig.open || parserConfig.scriptStartRegex || \"<%\",\n      close: parserConfig.close || parserConfig.scriptEndRegex || \"%>\",\n      mode: CodeMirror.getMode(config, parserConfig.scriptingModeSpec)\n    });\n  }, \"htmlmixed\");\n\n  CodeMirror.defineMIME(\"application/x-ejs\", {name: \"htmlembedded\", scriptingModeSpec:\"javascript\"});\n  CodeMirror.defineMIME(\"application/x-aspx\", {name: \"htmlembedded\", scriptingModeSpec:\"text/x-csharp\"});\n  CodeMirror.defineMIME(\"application/x-jsp\", {name: \"htmlembedded\", scriptingModeSpec:\"text/x-java\"});\n  CodeMirror.defineMIME(\"application/x-erb\", {name: \"htmlembedded\", scriptingModeSpec:\"ruby\"});\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/htmlmixed/htmlmixed.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../xml/xml\"), require(\"../javascript/javascript\"), require(\"../css/css\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../xml/xml\", \"../javascript/javascript\", \"../css/css\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var defaultTags = {\n    script: [\n      [\"lang\", /(javascript|babel)/i, \"javascript\"],\n      [\"type\", /^(?:text|application)\\/(?:x-)?(?:java|ecma)script$|^module$|^$/i, \"javascript\"],\n      [\"type\", /./, \"text/plain\"],\n      [null, null, \"javascript\"]\n    ],\n    style:  [\n      [\"lang\", /^css$/i, \"css\"],\n      [\"type\", /^(text\\/)?(x-)?(stylesheet|css)$/i, \"css\"],\n      [\"type\", /./, \"text/plain\"],\n      [null, null, \"css\"]\n    ]\n  };\n\n  function maybeBackup(stream, pat, style) {\n    var cur = stream.current(), close = cur.search(pat);\n    if (close > -1) {\n      stream.backUp(cur.length - close);\n    } else if (cur.match(/<\\/?$/)) {\n      stream.backUp(cur.length);\n      if (!stream.match(pat, false)) stream.match(cur);\n    }\n    return style;\n  }\n\n  var attrRegexpCache = {};\n  function getAttrRegexp(attr) {\n    var regexp = attrRegexpCache[attr];\n    if (regexp) return regexp;\n    return attrRegexpCache[attr] = new RegExp(\"\\\\s+\" + attr + \"\\\\s*=\\\\s*('|\\\")?([^'\\\"]+)('|\\\")?\\\\s*\");\n  }\n\n  function getAttrValue(text, attr) {\n    var match = text.match(getAttrRegexp(attr))\n    return match ? /^\\s*(.*?)\\s*$/.exec(match[2])[1] : \"\"\n  }\n\n  function getTagRegexp(tagName, anchored) {\n    return new RegExp((anchored ? \"^\" : \"\") + \"<\\/\\\\s*\" + tagName + \"\\\\s*>\", \"i\");\n  }\n\n  function addTags(from, to) {\n    for (var tag in from) {\n      var dest = to[tag] || (to[tag] = []);\n      var source = from[tag];\n      for (var i = source.length - 1; i >= 0; i--)\n        dest.unshift(source[i])\n    }\n  }\n\n  function findMatchingMode(tagInfo, tagText) {\n    for (var i = 0; i < tagInfo.length; i++) {\n      var spec = tagInfo[i];\n      if (!spec[0] || spec[1].test(getAttrValue(tagText, spec[0]))) return spec[2];\n    }\n  }\n\n  CodeMirror.defineMode(\"htmlmixed\", function (config, parserConfig) {\n    var htmlMode = CodeMirror.getMode(config, {\n      name: \"xml\",\n      htmlMode: true,\n      multilineTagIndentFactor: parserConfig.multilineTagIndentFactor,\n      multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag,\n      allowMissingTagName: parserConfig.allowMissingTagName,\n    });\n\n    var tags = {};\n    var configTags = parserConfig && parserConfig.tags, configScript = parserConfig && parserConfig.scriptTypes;\n    addTags(defaultTags, tags);\n    if (configTags) addTags(configTags, tags);\n    if (configScript) for (var i = configScript.length - 1; i >= 0; i--)\n      tags.script.unshift([\"type\", configScript[i].matches, configScript[i].mode])\n\n    function html(stream, state) {\n      var style = htmlMode.token(stream, state.htmlState), tag = /\\btag\\b/.test(style), tagName\n      if (tag && !/[<>\\s\\/]/.test(stream.current()) &&\n          (tagName = state.htmlState.tagName && state.htmlState.tagName.toLowerCase()) &&\n          tags.hasOwnProperty(tagName)) {\n        state.inTag = tagName + \" \"\n      } else if (state.inTag && tag && />$/.test(stream.current())) {\n        var inTag = /^([\\S]+) (.*)/.exec(state.inTag)\n        state.inTag = null\n        var modeSpec = stream.current() == \">\" && findMatchingMode(tags[inTag[1]], inTag[2])\n        var mode = CodeMirror.getMode(config, modeSpec)\n        var endTagA = getTagRegexp(inTag[1], true), endTag = getTagRegexp(inTag[1], false);\n        state.token = function (stream, state) {\n          if (stream.match(endTagA, false)) {\n            state.token = html;\n            state.localState = state.localMode = null;\n            return null;\n          }\n          return maybeBackup(stream, endTag, state.localMode.token(stream, state.localState));\n        };\n        state.localMode = mode;\n        state.localState = CodeMirror.startState(mode, htmlMode.indent(state.htmlState, \"\", \"\"));\n      } else if (state.inTag) {\n        state.inTag += stream.current()\n        if (stream.eol()) state.inTag += \" \"\n      }\n      return style;\n    };\n\n    return {\n      startState: function () {\n        var state = CodeMirror.startState(htmlMode);\n        return {token: html, inTag: null, localMode: null, localState: null, htmlState: state};\n      },\n\n      copyState: function (state) {\n        var local;\n        if (state.localState) {\n          local = CodeMirror.copyState(state.localMode, state.localState);\n        }\n        return {token: state.token, inTag: state.inTag,\n                localMode: state.localMode, localState: local,\n                htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};\n      },\n\n      token: function (stream, state) {\n        return state.token(stream, state);\n      },\n\n      indent: function (state, textAfter, line) {\n        if (!state.localMode || /^\\s*<\\//.test(textAfter))\n          return htmlMode.indent(state.htmlState, textAfter, line);\n        else if (state.localMode.indent)\n          return state.localMode.indent(state.localState, textAfter, line);\n        else\n          return CodeMirror.Pass;\n      },\n\n      innerMode: function (state) {\n        return {state: state.localState || state.htmlState, mode: state.localMode || htmlMode};\n      }\n    };\n  }, \"xml\", \"javascript\", \"css\");\n\n  CodeMirror.defineMIME(\"text/html\", \"htmlmixed\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/http/http.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"http\", function() {\n  function failFirstLine(stream, state) {\n    stream.skipToEnd();\n    state.cur = header;\n    return \"error\";\n  }\n\n  function start(stream, state) {\n    if (stream.match(/^HTTP\\/\\d\\.\\d/)) {\n      state.cur = responseStatusCode;\n      return \"keyword\";\n    } else if (stream.match(/^[A-Z]+/) && /[ \\t]/.test(stream.peek())) {\n      state.cur = requestPath;\n      return \"keyword\";\n    } else {\n      return failFirstLine(stream, state);\n    }\n  }\n\n  function responseStatusCode(stream, state) {\n    var code = stream.match(/^\\d+/);\n    if (!code) return failFirstLine(stream, state);\n\n    state.cur = responseStatusText;\n    var status = Number(code[0]);\n    if (status >= 100 && status < 200) {\n      return \"positive informational\";\n    } else if (status >= 200 && status < 300) {\n      return \"positive success\";\n    } else if (status >= 300 && status < 400) {\n      return \"positive redirect\";\n    } else if (status >= 400 && status < 500) {\n      return \"negative client-error\";\n    } else if (status >= 500 && status < 600) {\n      return \"negative server-error\";\n    } else {\n      return \"error\";\n    }\n  }\n\n  function responseStatusText(stream, state) {\n    stream.skipToEnd();\n    state.cur = header;\n    return null;\n  }\n\n  function requestPath(stream, state) {\n    stream.eatWhile(/\\S/);\n    state.cur = requestProtocol;\n    return \"string-2\";\n  }\n\n  function requestProtocol(stream, state) {\n    if (stream.match(/^HTTP\\/\\d\\.\\d$/)) {\n      state.cur = header;\n      return \"keyword\";\n    } else {\n      return failFirstLine(stream, state);\n    }\n  }\n\n  function header(stream) {\n    if (stream.sol() && !stream.eat(/[ \\t]/)) {\n      if (stream.match(/^.*?:/)) {\n        return \"atom\";\n      } else {\n        stream.skipToEnd();\n        return \"error\";\n      }\n    } else {\n      stream.skipToEnd();\n      return \"string\";\n    }\n  }\n\n  function body(stream) {\n    stream.skipToEnd();\n    return null;\n  }\n\n  return {\n    token: function(stream, state) {\n      var cur = state.cur;\n      if (cur != header && cur != body && stream.eatSpace()) return null;\n      return cur(stream, state);\n    },\n\n    blankLine: function(state) {\n      state.cur = body;\n    },\n\n    startState: function() {\n      return {cur: start};\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"message/http\", \"http\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/idl/idl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function wordRegexp(words) {\n    return new RegExp('^((' + words.join(')|(') + '))\\\\b', 'i');\n  };\n\n  var builtinArray = [\n    'a_correlate', 'abs', 'acos', 'adapt_hist_equal', 'alog',\n    'alog2', 'alog10', 'amoeba', 'annotate', 'app_user_dir',\n    'app_user_dir_query', 'arg_present', 'array_equal', 'array_indices',\n    'arrow', 'ascii_template', 'asin', 'assoc', 'atan',\n    'axis', 'axis', 'bandpass_filter', 'bandreject_filter', 'barplot',\n    'bar_plot', 'beseli', 'beselj', 'beselk', 'besely',\n    'beta', 'biginteger', 'bilinear', 'bin_date', 'binary_template',\n    'bindgen', 'binomial', 'bit_ffs', 'bit_population', 'blas_axpy',\n    'blk_con', 'boolarr', 'boolean', 'boxplot', 'box_cursor',\n    'breakpoint', 'broyden', 'bubbleplot', 'butterworth', 'bytarr',\n    'byte', 'byteorder', 'bytscl', 'c_correlate', 'calendar',\n    'caldat', 'call_external', 'call_function', 'call_method',\n    'call_procedure', 'canny', 'catch', 'cd', 'cdf', 'ceil',\n    'chebyshev', 'check_math', 'chisqr_cvf', 'chisqr_pdf', 'choldc',\n    'cholsol', 'cindgen', 'cir_3pnt', 'clipboard', 'close',\n    'clust_wts', 'cluster', 'cluster_tree', 'cmyk_convert', 'code_coverage',\n    'color_convert', 'color_exchange', 'color_quan', 'color_range_map',\n    'colorbar', 'colorize_sample', 'colormap_applicable',\n    'colormap_gradient', 'colormap_rotation', 'colortable',\n    'comfit', 'command_line_args', 'common', 'compile_opt', 'complex',\n    'complexarr', 'complexround', 'compute_mesh_normals', 'cond', 'congrid',\n    'conj', 'constrained_min', 'contour', 'contour', 'convert_coord',\n    'convol', 'convol_fft', 'coord2to3', 'copy_lun', 'correlate',\n    'cos', 'cosh', 'cpu', 'cramer', 'createboxplotdata',\n    'create_cursor', 'create_struct', 'create_view', 'crossp', 'crvlength',\n    'ct_luminance', 'cti_test', 'cursor', 'curvefit', 'cv_coord',\n    'cvttobm', 'cw_animate', 'cw_animate_getp', 'cw_animate_load',\n    'cw_animate_run', 'cw_arcball', 'cw_bgroup', 'cw_clr_index',\n    'cw_colorsel', 'cw_defroi', 'cw_field', 'cw_filesel', 'cw_form',\n    'cw_fslider', 'cw_light_editor', 'cw_light_editor_get',\n    'cw_light_editor_set', 'cw_orient', 'cw_palette_editor',\n    'cw_palette_editor_get', 'cw_palette_editor_set', 'cw_pdmenu',\n    'cw_rgbslider', 'cw_tmpl', 'cw_zoom', 'db_exists',\n    'dblarr', 'dcindgen', 'dcomplex', 'dcomplexarr', 'define_key',\n    'define_msgblk', 'define_msgblk_from_file', 'defroi', 'defsysv',\n    'delvar', 'dendro_plot', 'dendrogram', 'deriv', 'derivsig',\n    'determ', 'device', 'dfpmin', 'diag_matrix', 'dialog_dbconnect',\n    'dialog_message', 'dialog_pickfile', 'dialog_printersetup',\n    'dialog_printjob', 'dialog_read_image',\n    'dialog_write_image', 'dictionary', 'digital_filter', 'dilate', 'dindgen',\n    'dissolve', 'dist', 'distance_measure', 'dlm_load', 'dlm_register',\n    'doc_library', 'double', 'draw_roi', 'edge_dog', 'efont',\n    'eigenql', 'eigenvec', 'ellipse', 'elmhes', 'emboss',\n    'empty', 'enable_sysrtn', 'eof', 'eos', 'erase',\n    'erf', 'erfc', 'erfcx', 'erode', 'errorplot',\n    'errplot', 'estimator_filter', 'execute', 'exit', 'exp',\n    'expand', 'expand_path', 'expint', 'extract', 'extract_slice',\n    'f_cvf', 'f_pdf', 'factorial', 'fft', 'file_basename',\n    'file_chmod', 'file_copy', 'file_delete', 'file_dirname',\n    'file_expand_path', 'file_gunzip', 'file_gzip', 'file_info',\n    'file_lines', 'file_link', 'file_mkdir', 'file_move',\n    'file_poll_input', 'file_readlink', 'file_same',\n    'file_search', 'file_tar', 'file_test', 'file_untar', 'file_unzip',\n    'file_which', 'file_zip', 'filepath', 'findgen', 'finite',\n    'fix', 'flick', 'float', 'floor', 'flow3',\n    'fltarr', 'flush', 'format_axis_values', 'forward_function', 'free_lun',\n    'fstat', 'fulstr', 'funct', 'function', 'fv_test',\n    'fx_root', 'fz_roots', 'gamma', 'gamma_ct', 'gauss_cvf',\n    'gauss_pdf', 'gauss_smooth', 'gauss2dfit', 'gaussfit',\n    'gaussian_function', 'gaussint', 'get_drive_list', 'get_dxf_objects',\n    'get_kbrd', 'get_login_info',\n    'get_lun', 'get_screen_size', 'getenv', 'getwindows', 'greg2jul',\n    'grib', 'grid_input', 'grid_tps', 'grid3', 'griddata',\n    'gs_iter', 'h_eq_ct', 'h_eq_int', 'hanning', 'hash',\n    'hdf', 'hdf5', 'heap_free', 'heap_gc', 'heap_nosave',\n    'heap_refcount', 'heap_save', 'help', 'hilbert', 'hist_2d',\n    'hist_equal', 'histogram', 'hls', 'hough', 'hqr',\n    'hsv', 'i18n_multibytetoutf8',\n    'i18n_multibytetowidechar', 'i18n_utf8tomultibyte',\n    'i18n_widechartomultibyte',\n    'ibeta', 'icontour', 'iconvertcoord', 'idelete', 'identity',\n    'idl_base64', 'idl_container', 'idl_validname',\n    'idlexbr_assistant', 'idlitsys_createtool',\n    'idlunit', 'iellipse', 'igamma', 'igetcurrent', 'igetdata',\n    'igetid', 'igetproperty', 'iimage', 'image', 'image_cont',\n    'image_statistics', 'image_threshold', 'imaginary', 'imap', 'indgen',\n    'int_2d', 'int_3d', 'int_tabulated', 'intarr', 'interpol',\n    'interpolate', 'interval_volume', 'invert', 'ioctl', 'iopen',\n    'ir_filter', 'iplot', 'ipolygon', 'ipolyline', 'iputdata',\n    'iregister', 'ireset', 'iresolve', 'irotate', 'isa',\n    'isave', 'iscale', 'isetcurrent', 'isetproperty', 'ishft',\n    'isocontour', 'isosurface', 'isurface', 'itext', 'itranslate',\n    'ivector', 'ivolume', 'izoom', 'journal', 'json_parse',\n    'json_serialize', 'jul2greg', 'julday', 'keyword_set', 'krig2d',\n    'kurtosis', 'kw_test', 'l64indgen', 'la_choldc', 'la_cholmprove',\n    'la_cholsol', 'la_determ', 'la_eigenproblem', 'la_eigenql', 'la_eigenvec',\n    'la_elmhes', 'la_gm_linear_model', 'la_hqr', 'la_invert',\n    'la_least_square_equality', 'la_least_squares', 'la_linear_equation',\n    'la_ludc', 'la_lumprove', 'la_lusol',\n    'la_svd', 'la_tridc', 'la_trimprove', 'la_triql', 'la_trired',\n    'la_trisol', 'label_date', 'label_region', 'ladfit', 'laguerre',\n    'lambda', 'lambdap', 'lambertw', 'laplacian', 'least_squares_filter',\n    'leefilt', 'legend', 'legendre', 'linbcg', 'lindgen',\n    'linfit', 'linkimage', 'list', 'll_arc_distance', 'lmfit',\n    'lmgr', 'lngamma', 'lnp_test', 'loadct', 'locale_get',\n    'logical_and', 'logical_or', 'logical_true', 'lon64arr', 'lonarr',\n    'long', 'long64', 'lsode', 'lu_complex', 'ludc',\n    'lumprove', 'lusol', 'm_correlate', 'machar', 'make_array',\n    'make_dll', 'make_rt', 'map', 'mapcontinents', 'mapgrid',\n    'map_2points', 'map_continents', 'map_grid', 'map_image', 'map_patch',\n    'map_proj_forward', 'map_proj_image', 'map_proj_info',\n    'map_proj_init', 'map_proj_inverse',\n    'map_set', 'matrix_multiply', 'matrix_power', 'max', 'md_test',\n    'mean', 'meanabsdev', 'mean_filter', 'median', 'memory',\n    'mesh_clip', 'mesh_decimate', 'mesh_issolid',\n    'mesh_merge', 'mesh_numtriangles',\n    'mesh_obj', 'mesh_smooth', 'mesh_surfacearea',\n    'mesh_validate', 'mesh_volume',\n    'message', 'min', 'min_curve_surf', 'mk_html_help', 'modifyct',\n    'moment', 'morph_close', 'morph_distance',\n    'morph_gradient', 'morph_hitormiss',\n    'morph_open', 'morph_thin', 'morph_tophat', 'multi', 'n_elements',\n    'n_params', 'n_tags', 'ncdf', 'newton', 'noise_hurl',\n    'noise_pick', 'noise_scatter', 'noise_slur', 'norm', 'obj_class',\n    'obj_destroy', 'obj_hasmethod', 'obj_isa', 'obj_new', 'obj_valid',\n    'objarr', 'on_error', 'on_ioerror', 'online_help', 'openr',\n    'openu', 'openw', 'oplot', 'oploterr', 'orderedhash',\n    'p_correlate', 'parse_url', 'particle_trace', 'path_cache', 'path_sep',\n    'pcomp', 'plot', 'plot3d', 'plot', 'plot_3dbox',\n    'plot_field', 'ploterr', 'plots', 'polar_contour', 'polar_surface',\n    'polyfill', 'polyshade', 'pnt_line', 'point_lun', 'polarplot',\n    'poly', 'poly_2d', 'poly_area', 'poly_fit', 'polyfillv',\n    'polygon', 'polyline', 'polywarp', 'popd', 'powell',\n    'pref_commit', 'pref_get', 'pref_set', 'prewitt', 'primes',\n    'print', 'printf', 'printd', 'pro', 'product',\n    'profile', 'profiler', 'profiles', 'project_vol', 'ps_show_fonts',\n    'psafm', 'pseudo', 'ptr_free', 'ptr_new', 'ptr_valid',\n    'ptrarr', 'pushd', 'qgrid3', 'qhull', 'qromb',\n    'qromo', 'qsimp', 'query_*', 'query_ascii', 'query_bmp',\n    'query_csv', 'query_dicom', 'query_gif', 'query_image', 'query_jpeg',\n    'query_jpeg2000', 'query_mrsid', 'query_pict', 'query_png', 'query_ppm',\n    'query_srf', 'query_tiff', 'query_video', 'query_wav', 'r_correlate',\n    'r_test', 'radon', 'randomn', 'randomu', 'ranks',\n    'rdpix', 'read', 'readf', 'read_ascii', 'read_binary',\n    'read_bmp', 'read_csv', 'read_dicom', 'read_gif', 'read_image',\n    'read_interfile', 'read_jpeg', 'read_jpeg2000', 'read_mrsid', 'read_pict',\n    'read_png', 'read_ppm', 'read_spr', 'read_srf', 'read_sylk',\n    'read_tiff', 'read_video', 'read_wav', 'read_wave', 'read_x11_bitmap',\n    'read_xwd', 'reads', 'readu', 'real_part', 'rebin',\n    'recall_commands', 'recon3', 'reduce_colors', 'reform', 'region_grow',\n    'register_cursor', 'regress', 'replicate',\n    'replicate_inplace', 'resolve_all',\n    'resolve_routine', 'restore', 'retall', 'return', 'reverse',\n    'rk4', 'roberts', 'rot', 'rotate', 'round',\n    'routine_filepath', 'routine_info', 'rs_test', 's_test', 'save',\n    'savgol', 'scale3', 'scale3d', 'scatterplot', 'scatterplot3d',\n    'scope_level', 'scope_traceback', 'scope_varfetch',\n    'scope_varname', 'search2d',\n    'search3d', 'sem_create', 'sem_delete', 'sem_lock', 'sem_release',\n    'set_plot', 'set_shading', 'setenv', 'sfit', 'shade_surf',\n    'shade_surf_irr', 'shade_volume', 'shift', 'shift_diff', 'shmdebug',\n    'shmmap', 'shmunmap', 'shmvar', 'show3', 'showfont',\n    'signum', 'simplex', 'sin', 'sindgen', 'sinh',\n    'size', 'skewness', 'skip_lun', 'slicer3', 'slide_image',\n    'smooth', 'sobel', 'socket', 'sort', 'spawn',\n    'sph_4pnt', 'sph_scat', 'spher_harm', 'spl_init', 'spl_interp',\n    'spline', 'spline_p', 'sprsab', 'sprsax', 'sprsin',\n    'sprstp', 'sqrt', 'standardize', 'stddev', 'stop',\n    'strarr', 'strcmp', 'strcompress', 'streamline', 'streamline',\n    'stregex', 'stretch', 'string', 'strjoin', 'strlen',\n    'strlowcase', 'strmatch', 'strmessage', 'strmid', 'strpos',\n    'strput', 'strsplit', 'strtrim', 'struct_assign', 'struct_hide',\n    'strupcase', 'surface', 'surface', 'surfr', 'svdc',\n    'svdfit', 'svsol', 'swap_endian', 'swap_endian_inplace', 'symbol',\n    'systime', 't_cvf', 't_pdf', 't3d', 'tag_names',\n    'tan', 'tanh', 'tek_color', 'temporary', 'terminal_size',\n    'tetra_clip', 'tetra_surface', 'tetra_volume', 'text', 'thin',\n    'thread', 'threed', 'tic', 'time_test2', 'timegen',\n    'timer', 'timestamp', 'timestamptovalues', 'tm_test', 'toc',\n    'total', 'trace', 'transpose', 'tri_surf', 'triangulate',\n    'trigrid', 'triql', 'trired', 'trisol', 'truncate_lun',\n    'ts_coef', 'ts_diff', 'ts_fcast', 'ts_smooth', 'tv',\n    'tvcrs', 'tvlct', 'tvrd', 'tvscl', 'typename',\n    'uindgen', 'uint', 'uintarr', 'ul64indgen', 'ulindgen',\n    'ulon64arr', 'ulonarr', 'ulong', 'ulong64', 'uniq',\n    'unsharp_mask', 'usersym', 'value_locate', 'variance', 'vector',\n    'vector_field', 'vel', 'velovect', 'vert_t3d', 'voigt',\n    'volume', 'voronoi', 'voxel_proj', 'wait', 'warp_tri',\n    'watershed', 'wdelete', 'wf_draw', 'where', 'widget_base',\n    'widget_button', 'widget_combobox', 'widget_control',\n    'widget_displaycontextmenu', 'widget_draw',\n    'widget_droplist', 'widget_event', 'widget_info',\n    'widget_label', 'widget_list',\n    'widget_propertysheet', 'widget_slider', 'widget_tab',\n    'widget_table', 'widget_text',\n    'widget_tree', 'widget_tree_move', 'widget_window',\n    'wiener_filter', 'window',\n    'window', 'write_bmp', 'write_csv', 'write_gif', 'write_image',\n    'write_jpeg', 'write_jpeg2000', 'write_nrif', 'write_pict', 'write_png',\n    'write_ppm', 'write_spr', 'write_srf', 'write_sylk', 'write_tiff',\n    'write_video', 'write_wav', 'write_wave', 'writeu', 'wset',\n    'wshow', 'wtn', 'wv_applet', 'wv_cwt', 'wv_cw_wavelet',\n    'wv_denoise', 'wv_dwt', 'wv_fn_coiflet',\n    'wv_fn_daubechies', 'wv_fn_gaussian',\n    'wv_fn_haar', 'wv_fn_morlet', 'wv_fn_paul',\n    'wv_fn_symlet', 'wv_import_data',\n    'wv_import_wavelet', 'wv_plot3d_wps', 'wv_plot_multires',\n    'wv_pwt', 'wv_tool_denoise',\n    'xbm_edit', 'xdisplayfile', 'xdxf', 'xfont', 'xinteranimate',\n    'xloadct', 'xmanager', 'xmng_tmpl', 'xmtool', 'xobjview',\n    'xobjview_rotate', 'xobjview_write_image',\n    'xpalette', 'xpcolor', 'xplot3d',\n    'xregistered', 'xroi', 'xsq_test', 'xsurface', 'xvaredit',\n    'xvolume', 'xvolume_rotate', 'xvolume_write_image',\n    'xyouts', 'zlib_compress', 'zlib_uncompress', 'zoom', 'zoom_24'\n  ];\n  var builtins = wordRegexp(builtinArray);\n\n  var keywordArray = [\n    'begin', 'end', 'endcase', 'endfor',\n    'endwhile', 'endif', 'endrep', 'endforeach',\n    'break', 'case', 'continue', 'for',\n    'foreach', 'goto', 'if', 'then', 'else',\n    'repeat', 'until', 'switch', 'while',\n    'do', 'pro', 'function'\n  ];\n  var keywords = wordRegexp(keywordArray);\n\n  CodeMirror.registerHelper(\"hintWords\", \"idl\", builtinArray.concat(keywordArray));\n\n  var identifiers = new RegExp('^[_a-z\\xa1-\\uffff][_a-z0-9\\xa1-\\uffff]*', 'i');\n\n  var singleOperators = /[+\\-*&=<>\\/@#~$]/;\n  var boolOperators = new RegExp('(and|or|eq|lt|le|gt|ge|ne|not)', 'i');\n\n  function tokenBase(stream) {\n    // whitespaces\n    if (stream.eatSpace()) return null;\n\n    // Handle one line Comments\n    if (stream.match(';')) {\n      stream.skipToEnd();\n      return 'comment';\n    }\n\n    // Handle Number Literals\n    if (stream.match(/^[0-9\\.+-]/, false)) {\n      if (stream.match(/^[+-]?0x[0-9a-fA-F]+/))\n        return 'number';\n      if (stream.match(/^[+-]?\\d*\\.\\d+([EeDd][+-]?\\d+)?/))\n        return 'number';\n      if (stream.match(/^[+-]?\\d+([EeDd][+-]?\\d+)?/))\n        return 'number';\n    }\n\n    // Handle Strings\n    if (stream.match(/^\"([^\"]|(\"\"))*\"/)) { return 'string'; }\n    if (stream.match(/^'([^']|(''))*'/)) { return 'string'; }\n\n    // Handle words\n    if (stream.match(keywords)) { return 'keyword'; }\n    if (stream.match(builtins)) { return 'builtin'; }\n    if (stream.match(identifiers)) { return 'variable'; }\n\n    if (stream.match(singleOperators) || stream.match(boolOperators)) {\n      return 'operator'; }\n\n    // Handle non-detected items\n    stream.next();\n    return null;\n  };\n\n  CodeMirror.defineMode('idl', function() {\n    return {\n      token: function(stream) {\n        return tokenBase(stream);\n      }\n    };\n  });\n\n  CodeMirror.defineMIME('text/x-idl', 'idl');\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/javascript/javascript.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit;\n  var statementIndent = parserConfig.statementIndent;\n  var jsonldMode = parserConfig.jsonld;\n  var jsonMode = parserConfig.json || jsonldMode;\n  var trackScope = parserConfig.trackScope !== false\n  var isTS = parserConfig.typescript;\n  var wordRE = parserConfig.wordCharacters || /[\\w$\\xa1-\\uffff]/;\n\n  // Tokenizer\n\n  var keywords = function(){\n    function kw(type) {return {type: type, style: \"keyword\"};}\n    var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\"), D = kw(\"keyword d\");\n    var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n\n    return {\n      \"if\": kw(\"if\"), \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n      \"return\": D, \"break\": D, \"continue\": D, \"new\": kw(\"new\"), \"delete\": C, \"void\": C, \"throw\": C,\n      \"debugger\": kw(\"debugger\"), \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n      \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n      \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n      \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n      \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom,\n      \"this\": kw(\"this\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n      \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C,\n      \"await\": C\n    };\n  }();\n\n  var isOperatorChar = /[+\\-*&%=<>!?|~^@]/;\n  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n  function readRegexp(stream) {\n    var escaped = false, next, inSet = false;\n    while ((next = stream.next()) != null) {\n      if (!escaped) {\n        if (next == \"/\" && !inSet) return;\n        if (next == \"[\") inSet = true;\n        else if (inSet && next == \"]\") inSet = false;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n  }\n\n  // Used as scratch variables to communicate multiple values without\n  // consing up tons of objects.\n  var type, content;\n  function ret(tp, style, cont) {\n    type = tp; content = cont;\n    return style;\n  }\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    } else if (ch == \".\" && stream.match(/^\\d[\\d_]*(?:[eE][+\\-]?[\\d_]+)?/)) {\n      return ret(\"number\", \"number\");\n    } else if (ch == \".\" && stream.match(\"..\")) {\n      return ret(\"spread\", \"meta\");\n    } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      return ret(ch);\n    } else if (ch == \"=\" && stream.eat(\">\")) {\n      return ret(\"=>\", \"operator\");\n    } else if (ch == \"0\" && stream.match(/^(?:x[\\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) {\n      return ret(\"number\", \"number\");\n    } else if (/\\d/.test(ch)) {\n      stream.match(/^[\\d_]*(?:n|(?:\\.[\\d_]*)?(?:[eE][+\\-]?[\\d_]+)?)?/);\n      return ret(\"number\", \"number\");\n    } else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      } else if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return ret(\"comment\", \"comment\");\n      } else if (expressionAllowed(stream, state, 1)) {\n        readRegexp(stream);\n        stream.match(/^\\b(([gimyus])(?![gimyus]*\\2))+\\b/);\n        return ret(\"regexp\", \"string-2\");\n      } else {\n        stream.eat(\"=\");\n        return ret(\"operator\", \"operator\", stream.current());\n      }\n    } else if (ch == \"`\") {\n      state.tokenize = tokenQuasi;\n      return tokenQuasi(stream, state);\n    } else if (ch == \"#\" && stream.peek() == \"!\") {\n      stream.skipToEnd();\n      return ret(\"meta\", \"meta\");\n    } else if (ch == \"#\" && stream.eatWhile(wordRE)) {\n      return ret(\"variable\", \"property\")\n    } else if (ch == \"<\" && stream.match(\"!--\") ||\n               (ch == \"-\" && stream.match(\"->\") && !/\\S/.test(stream.string.slice(0, stream.start)))) {\n      stream.skipToEnd()\n      return ret(\"comment\", \"comment\")\n    } else if (isOperatorChar.test(ch)) {\n      if (ch != \">\" || !state.lexical || state.lexical.type != \">\") {\n        if (stream.eat(\"=\")) {\n          if (ch == \"!\" || ch == \"=\") stream.eat(\"=\")\n        } else if (/[<>*+\\-|&?]/.test(ch)) {\n          stream.eat(ch)\n          if (ch == \">\") stream.eat(ch)\n        }\n      }\n      if (ch == \"?\" && stream.eat(\".\")) return ret(\".\")\n      return ret(\"operator\", \"operator\", stream.current());\n    } else if (wordRE.test(ch)) {\n      stream.eatWhile(wordRE);\n      var word = stream.current()\n      if (state.lastType != \".\") {\n        if (keywords.propertyIsEnumerable(word)) {\n          var kw = keywords[word]\n          return ret(kw.type, kw.style, word)\n        }\n        if (word == \"async\" && stream.match(/^(\\s|\\/\\*([^*]|\\*(?!\\/))*?\\*\\/)*[\\[\\(\\w]/, false))\n          return ret(\"async\", \"keyword\", word)\n      }\n      return ret(\"variable\", \"variable\", word)\n    }\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next;\n      if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n        state.tokenize = tokenBase;\n        return ret(\"jsonld-keyword\", \"meta\");\n      }\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) break;\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (!escaped) state.tokenize = tokenBase;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenQuasi(stream, state) {\n    var escaped = false, next;\n    while ((next = stream.next()) != null) {\n      if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n    return ret(\"quasi\", \"string-2\", stream.current());\n  }\n\n  var brackets = \"([{}])\";\n  // This is a crude lookahead trick to try and notice that we're\n  // parsing the argument patterns for a fat-arrow function before we\n  // actually hit the arrow token. It only works if the arrow is on\n  // the same line as the arguments and there's no strange noise\n  // (comments) in between. Fallback is to only notice when we hit the\n  // arrow, and not declare the arguments as locals for the arrow\n  // body.\n  function findFatArrow(stream, state) {\n    if (state.fatArrowAt) state.fatArrowAt = null;\n    var arrow = stream.string.indexOf(\"=>\", stream.start);\n    if (arrow < 0) return;\n\n    if (isTS) { // Try to skip TypeScript return type declarations after the arguments\n      var m = /:\\s*(?:\\w+(?:<[^>]*>|\\[\\])?|\\{[^}]*\\})\\s*$/.exec(stream.string.slice(stream.start, arrow))\n      if (m) arrow = m.index\n    }\n\n    var depth = 0, sawSomething = false;\n    for (var pos = arrow - 1; pos >= 0; --pos) {\n      var ch = stream.string.charAt(pos);\n      var bracket = brackets.indexOf(ch);\n      if (bracket >= 0 && bracket < 3) {\n        if (!depth) { ++pos; break; }\n        if (--depth == 0) { if (ch == \"(\") sawSomething = true; break; }\n      } else if (bracket >= 3 && bracket < 6) {\n        ++depth;\n      } else if (wordRE.test(ch)) {\n        sawSomething = true;\n      } else if (/[\"'\\/`]/.test(ch)) {\n        for (;; --pos) {\n          if (pos == 0) return\n          var next = stream.string.charAt(pos - 1)\n          if (next == ch && stream.string.charAt(pos - 2) != \"\\\\\") { pos--; break }\n        }\n      } else if (sawSomething && !depth) {\n        ++pos;\n        break;\n      }\n    }\n    if (sawSomething && !depth) state.fatArrowAt = pos;\n  }\n\n  // Parser\n\n  var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true,\n                     \"regexp\": true, \"this\": true, \"import\": true, \"jsonld-keyword\": true};\n\n  function JSLexical(indented, column, type, align, prev, info) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.prev = prev;\n    this.info = info;\n    if (align != null) this.align = align;\n  }\n\n  function inScope(state, varname) {\n    if (!trackScope) return false\n    for (var v = state.localVars; v; v = v.next)\n      if (v.name == varname) return true;\n    for (var cx = state.context; cx; cx = cx.prev) {\n      for (var v = cx.vars; v; v = v.next)\n        if (v.name == varname) return true;\n    }\n  }\n\n  function parseJS(state, style, type, content, stream) {\n    var cc = state.cc;\n    // Communicate our context to the combinators.\n    // (Less wasteful than consing up a hundred closures on every call.)\n    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;\n\n    if (!state.lexical.hasOwnProperty(\"align\"))\n      state.lexical.align = true;\n\n    while(true) {\n      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n      if (combinator(type, content)) {\n        while(cc.length && cc[cc.length - 1].lex)\n          cc.pop()();\n        if (cx.marked) return cx.marked;\n        if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n        return style;\n      }\n    }\n  }\n\n  // Combinator utils\n\n  var cx = {state: null, column: null, marked: null, cc: null};\n  function pass() {\n    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n  }\n  function cont() {\n    pass.apply(null, arguments);\n    return true;\n  }\n  function inList(name, list) {\n    for (var v = list; v; v = v.next) if (v.name == name) return true\n    return false;\n  }\n  function register(varname) {\n    var state = cx.state;\n    cx.marked = \"def\";\n    if (!trackScope) return\n    if (state.context) {\n      if (state.lexical.info == \"var\" && state.context && state.context.block) {\n        // FIXME function decls are also not block scoped\n        var newContext = registerVarScoped(varname, state.context)\n        if (newContext != null) {\n          state.context = newContext\n          return\n        }\n      } else if (!inList(varname, state.localVars)) {\n        state.localVars = new Var(varname, state.localVars)\n        return\n      }\n    }\n    // Fall through means this is global\n    if (parserConfig.globalVars && !inList(varname, state.globalVars))\n      state.globalVars = new Var(varname, state.globalVars)\n  }\n  function registerVarScoped(varname, context) {\n    if (!context) {\n      return null\n    } else if (context.block) {\n      var inner = registerVarScoped(varname, context.prev)\n      if (!inner) return null\n      if (inner == context.prev) return context\n      return new Context(inner, context.vars, true)\n    } else if (inList(varname, context.vars)) {\n      return context\n    } else {\n      return new Context(context.prev, new Var(varname, context.vars), false)\n    }\n  }\n\n  function isModifier(name) {\n    return name == \"public\" || name == \"private\" || name == \"protected\" || name == \"abstract\" || name == \"readonly\"\n  }\n\n  // Combinators\n\n  function Context(prev, vars, block) { this.prev = prev; this.vars = vars; this.block = block }\n  function Var(name, next) { this.name = name; this.next = next }\n\n  var defaultVars = new Var(\"this\", new Var(\"arguments\", null))\n  function pushcontext() {\n    cx.state.context = new Context(cx.state.context, cx.state.localVars, false)\n    cx.state.localVars = defaultVars\n  }\n  function pushblockcontext() {\n    cx.state.context = new Context(cx.state.context, cx.state.localVars, true)\n    cx.state.localVars = null\n  }\n  pushcontext.lex = pushblockcontext.lex = true\n  function popcontext() {\n    cx.state.localVars = cx.state.context.vars\n    cx.state.context = cx.state.context.prev\n  }\n  popcontext.lex = true\n  function pushlex(type, info) {\n    var result = function() {\n      var state = cx.state, indent = state.indented;\n      if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n      else for (var outer = state.lexical; outer && outer.type == \")\" && outer.align; outer = outer.prev)\n        indent = outer.indented;\n      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);\n    };\n    result.lex = true;\n    return result;\n  }\n  function poplex() {\n    var state = cx.state;\n    if (state.lexical.prev) {\n      if (state.lexical.type == \")\")\n        state.indented = state.lexical.indented;\n      state.lexical = state.lexical.prev;\n    }\n  }\n  poplex.lex = true;\n\n  function expect(wanted) {\n    function exp(type) {\n      if (type == wanted) return cont();\n      else if (wanted == \";\" || type == \"}\" || type == \")\" || type == \"]\") return pass();\n      else return cont(exp);\n    };\n    return exp;\n  }\n\n  function statement(type, value) {\n    if (type == \"var\") return cont(pushlex(\"vardef\", value), vardef, expect(\";\"), poplex);\n    if (type == \"keyword a\") return cont(pushlex(\"form\"), parenExpr, statement, poplex);\n    if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n    if (type == \"keyword d\") return cx.stream.match(/^\\s*$/, false) ? cont() : cont(pushlex(\"stat\"), maybeexpression, expect(\";\"), poplex);\n    if (type == \"debugger\") return cont(expect(\";\"));\n    if (type == \"{\") return cont(pushlex(\"}\"), pushblockcontext, block, poplex, popcontext);\n    if (type == \";\") return cont();\n    if (type == \"if\") {\n      if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n        cx.state.cc.pop()();\n      return cont(pushlex(\"form\"), parenExpr, statement, poplex, maybeelse);\n    }\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"for\") return cont(pushlex(\"form\"), pushblockcontext, forspec, statement, popcontext, poplex);\n    if (type == \"class\" || (isTS && value == \"interface\")) {\n      cx.marked = \"keyword\"\n      return cont(pushlex(\"form\", type == \"class\" ? type : value), className, poplex)\n    }\n    if (type == \"variable\") {\n      if (isTS && value == \"declare\") {\n        cx.marked = \"keyword\"\n        return cont(statement)\n      } else if (isTS && (value == \"module\" || value == \"enum\" || value == \"type\") && cx.stream.match(/^\\s*\\w/, false)) {\n        cx.marked = \"keyword\"\n        if (value == \"enum\") return cont(enumdef);\n        else if (value == \"type\") return cont(typename, expect(\"operator\"), typeexpr, expect(\";\"));\n        else return cont(pushlex(\"form\"), pattern, expect(\"{\"), pushlex(\"}\"), block, poplex, poplex)\n      } else if (isTS && value == \"namespace\") {\n        cx.marked = \"keyword\"\n        return cont(pushlex(\"form\"), expression, statement, poplex)\n      } else if (isTS && value == \"abstract\") {\n        cx.marked = \"keyword\"\n        return cont(statement)\n      } else {\n        return cont(pushlex(\"stat\"), maybelabel);\n      }\n    }\n    if (type == \"switch\") return cont(pushlex(\"form\"), parenExpr, expect(\"{\"), pushlex(\"}\", \"switch\"), pushblockcontext,\n                                      block, poplex, poplex, popcontext);\n    if (type == \"case\") return cont(expression, expect(\":\"));\n    if (type == \"default\") return cont(expect(\":\"));\n    if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, maybeCatchBinding, statement, poplex, popcontext);\n    if (type == \"export\") return cont(pushlex(\"stat\"), afterExport, poplex);\n    if (type == \"import\") return cont(pushlex(\"stat\"), afterImport, poplex);\n    if (type == \"async\") return cont(statement)\n    if (value == \"@\") return cont(expression, statement)\n    return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n  }\n  function maybeCatchBinding(type) {\n    if (type == \"(\") return cont(funarg, expect(\")\"))\n  }\n  function expression(type, value) {\n    return expressionInner(type, value, false);\n  }\n  function expressionNoComma(type, value) {\n    return expressionInner(type, value, true);\n  }\n  function parenExpr(type) {\n    if (type != \"(\") return pass()\n    return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex)\n  }\n  function expressionInner(type, value, noComma) {\n    if (cx.state.fatArrowAt == cx.stream.start) {\n      var body = noComma ? arrowBodyNoComma : arrowBody;\n      if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, expect(\"=>\"), body, popcontext);\n      else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n    }\n\n    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n    if (type == \"function\") return cont(functiondef, maybeop);\n    if (type == \"class\" || (isTS && value == \"interface\")) { cx.marked = \"keyword\"; return cont(pushlex(\"form\"), classExpression, poplex); }\n    if (type == \"keyword c\" || type == \"async\") return cont(noComma ? expressionNoComma : expression);\n    if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex, maybeop);\n    if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n    if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n    if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n    if (type == \"quasi\") return pass(quasi, maybeop);\n    if (type == \"new\") return cont(maybeTarget(noComma));\n    return cont();\n  }\n  function maybeexpression(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expression);\n  }\n\n  function maybeoperatorComma(type, value) {\n    if (type == \",\") return cont(maybeexpression);\n    return maybeoperatorNoComma(type, value, false);\n  }\n  function maybeoperatorNoComma(type, value, noComma) {\n    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n    var expr = noComma == false ? expression : expressionNoComma;\n    if (type == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n    if (type == \"operator\") {\n      if (/\\+\\+|--/.test(value) || isTS && value == \"!\") return cont(me);\n      if (isTS && value == \"<\" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\\s*\\(/, false))\n        return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, me);\n      if (value == \"?\") return cont(expression, expect(\":\"), expr);\n      return cont(expr);\n    }\n    if (type == \"quasi\") { return pass(quasi, me); }\n    if (type == \";\") return;\n    if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n    if (type == \".\") return cont(property, me);\n    if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n    if (isTS && value == \"as\") { cx.marked = \"keyword\"; return cont(typeexpr, me) }\n    if (type == \"regexp\") {\n      cx.state.lastType = cx.marked = \"operator\"\n      cx.stream.backUp(cx.stream.pos - cx.stream.start - 1)\n      return cont(expr)\n    }\n  }\n  function quasi(type, value) {\n    if (type != \"quasi\") return pass();\n    if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n    return cont(maybeexpression, continueQuasi);\n  }\n  function continueQuasi(type) {\n    if (type == \"}\") {\n      cx.marked = \"string-2\";\n      cx.state.tokenize = tokenQuasi;\n      return cont(quasi);\n    }\n  }\n  function arrowBody(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expression);\n  }\n  function arrowBodyNoComma(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expressionNoComma);\n  }\n  function maybeTarget(noComma) {\n    return function(type) {\n      if (type == \".\") return cont(noComma ? targetNoComma : target);\n      else if (type == \"variable\" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma)\n      else return pass(noComma ? expressionNoComma : expression);\n    };\n  }\n  function target(_, value) {\n    if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorComma); }\n  }\n  function targetNoComma(_, value) {\n    if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorNoComma); }\n  }\n  function maybelabel(type) {\n    if (type == \":\") return cont(poplex, statement);\n    return pass(maybeoperatorComma, expect(\";\"), poplex);\n  }\n  function property(type) {\n    if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n  }\n  function objprop(type, value) {\n    if (type == \"async\") {\n      cx.marked = \"property\";\n      return cont(objprop);\n    } else if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\";\n      if (value == \"get\" || value == \"set\") return cont(getterSetter);\n      var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params\n      if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\\s*:\\s*/, false)))\n        cx.state.fatArrowAt = cx.stream.pos + m[0].length\n      return cont(afterprop);\n    } else if (type == \"number\" || type == \"string\") {\n      cx.marked = jsonldMode ? \"property\" : (cx.style + \" property\");\n      return cont(afterprop);\n    } else if (type == \"jsonld-keyword\") {\n      return cont(afterprop);\n    } else if (isTS && isModifier(value)) {\n      cx.marked = \"keyword\"\n      return cont(objprop)\n    } else if (type == \"[\") {\n      return cont(expression, maybetype, expect(\"]\"), afterprop);\n    } else if (type == \"spread\") {\n      return cont(expressionNoComma, afterprop);\n    } else if (value == \"*\") {\n      cx.marked = \"keyword\";\n      return cont(objprop);\n    } else if (type == \":\") {\n      return pass(afterprop)\n    }\n  }\n  function getterSetter(type) {\n    if (type != \"variable\") return pass(afterprop);\n    cx.marked = \"property\";\n    return cont(functiondef);\n  }\n  function afterprop(type) {\n    if (type == \":\") return cont(expressionNoComma);\n    if (type == \"(\") return pass(functiondef);\n  }\n  function commasep(what, end, sep) {\n    function proceed(type, value) {\n      if (sep ? sep.indexOf(type) > -1 : type == \",\") {\n        var lex = cx.state.lexical;\n        if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n        return cont(function(type, value) {\n          if (type == end || value == end) return pass()\n          return pass(what)\n        }, proceed);\n      }\n      if (type == end || value == end) return cont();\n      if (sep && sep.indexOf(\";\") > -1) return pass(what)\n      return cont(expect(end));\n    }\n    return function(type, value) {\n      if (type == end || value == end) return cont();\n      return pass(what, proceed);\n    };\n  }\n  function contCommasep(what, end, info) {\n    for (var i = 3; i < arguments.length; i++)\n      cx.cc.push(arguments[i]);\n    return cont(pushlex(end, info), commasep(what, end), poplex);\n  }\n  function block(type) {\n    if (type == \"}\") return cont();\n    return pass(statement, block);\n  }\n  function maybetype(type, value) {\n    if (isTS) {\n      if (type == \":\") return cont(typeexpr);\n      if (value == \"?\") return cont(maybetype);\n    }\n  }\n  function maybetypeOrIn(type, value) {\n    if (isTS && (type == \":\" || value == \"in\")) return cont(typeexpr)\n  }\n  function mayberettype(type) {\n    if (isTS && type == \":\") {\n      if (cx.stream.match(/^\\s*\\w+\\s+is\\b/, false)) return cont(expression, isKW, typeexpr)\n      else return cont(typeexpr)\n    }\n  }\n  function isKW(_, value) {\n    if (value == \"is\") {\n      cx.marked = \"keyword\"\n      return cont()\n    }\n  }\n  function typeexpr(type, value) {\n    if (value == \"keyof\" || value == \"typeof\" || value == \"infer\" || value == \"readonly\") {\n      cx.marked = \"keyword\"\n      return cont(value == \"typeof\" ? expressionNoComma : typeexpr)\n    }\n    if (type == \"variable\" || value == \"void\") {\n      cx.marked = \"type\"\n      return cont(afterType)\n    }\n    if (value == \"|\" || value == \"&\") return cont(typeexpr)\n    if (type == \"string\" || type == \"number\" || type == \"atom\") return cont(afterType);\n    if (type == \"[\") return cont(pushlex(\"]\"), commasep(typeexpr, \"]\", \",\"), poplex, afterType)\n    if (type == \"{\") return cont(pushlex(\"}\"), typeprops, poplex, afterType)\n    if (type == \"(\") return cont(commasep(typearg, \")\"), maybeReturnType, afterType)\n    if (type == \"<\") return cont(commasep(typeexpr, \">\"), typeexpr)\n    if (type == \"quasi\") { return pass(quasiType, afterType); }\n  }\n  function maybeReturnType(type) {\n    if (type == \"=>\") return cont(typeexpr)\n  }\n  function typeprops(type) {\n    if (type.match(/[\\}\\)\\]]/)) return cont()\n    if (type == \",\" || type == \";\") return cont(typeprops)\n    return pass(typeprop, typeprops)\n  }\n  function typeprop(type, value) {\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\"\n      return cont(typeprop)\n    } else if (value == \"?\" || type == \"number\" || type == \"string\") {\n      return cont(typeprop)\n    } else if (type == \":\") {\n      return cont(typeexpr)\n    } else if (type == \"[\") {\n      return cont(expect(\"variable\"), maybetypeOrIn, expect(\"]\"), typeprop)\n    } else if (type == \"(\") {\n      return pass(functiondecl, typeprop)\n    } else if (!type.match(/[;\\}\\)\\],]/)) {\n      return cont()\n    }\n  }\n  function quasiType(type, value) {\n    if (type != \"quasi\") return pass();\n    if (value.slice(value.length - 2) != \"${\") return cont(quasiType);\n    return cont(typeexpr, continueQuasiType);\n  }\n  function continueQuasiType(type) {\n    if (type == \"}\") {\n      cx.marked = \"string-2\";\n      cx.state.tokenize = tokenQuasi;\n      return cont(quasiType);\n    }\n  }\n  function typearg(type, value) {\n    if (type == \"variable\" && cx.stream.match(/^\\s*[?:]/, false) || value == \"?\") return cont(typearg)\n    if (type == \":\") return cont(typeexpr)\n    if (type == \"spread\") return cont(typearg)\n    return pass(typeexpr)\n  }\n  function afterType(type, value) {\n    if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n    if (value == \"|\" || type == \".\" || value == \"&\") return cont(typeexpr)\n    if (type == \"[\") return cont(typeexpr, expect(\"]\"), afterType)\n    if (value == \"extends\" || value == \"implements\") { cx.marked = \"keyword\"; return cont(typeexpr) }\n    if (value == \"?\") return cont(typeexpr, expect(\":\"), typeexpr)\n  }\n  function maybeTypeArgs(_, value) {\n    if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n  }\n  function typeparam() {\n    return pass(typeexpr, maybeTypeDefault)\n  }\n  function maybeTypeDefault(_, value) {\n    if (value == \"=\") return cont(typeexpr)\n  }\n  function vardef(_, value) {\n    if (value == \"enum\") {cx.marked = \"keyword\"; return cont(enumdef)}\n    return pass(pattern, maybetype, maybeAssign, vardefCont);\n  }\n  function pattern(type, value) {\n    if (isTS && isModifier(value)) { cx.marked = \"keyword\"; return cont(pattern) }\n    if (type == \"variable\") { register(value); return cont(); }\n    if (type == \"spread\") return cont(pattern);\n    if (type == \"[\") return contCommasep(eltpattern, \"]\");\n    if (type == \"{\") return contCommasep(proppattern, \"}\");\n  }\n  function proppattern(type, value) {\n    if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n      register(value);\n      return cont(maybeAssign);\n    }\n    if (type == \"variable\") cx.marked = \"property\";\n    if (type == \"spread\") return cont(pattern);\n    if (type == \"}\") return pass();\n    if (type == \"[\") return cont(expression, expect(']'), expect(':'), proppattern);\n    return cont(expect(\":\"), pattern, maybeAssign);\n  }\n  function eltpattern() {\n    return pass(pattern, maybeAssign)\n  }\n  function maybeAssign(_type, value) {\n    if (value == \"=\") return cont(expressionNoComma);\n  }\n  function vardefCont(type) {\n    if (type == \",\") return cont(vardef);\n  }\n  function maybeelse(type, value) {\n    if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n  }\n  function forspec(type, value) {\n    if (value == \"await\") return cont(forspec);\n    if (type == \"(\") return cont(pushlex(\")\"), forspec1, poplex);\n  }\n  function forspec1(type) {\n    if (type == \"var\") return cont(vardef, forspec2);\n    if (type == \"variable\") return cont(forspec2);\n    return pass(forspec2)\n  }\n  function forspec2(type, value) {\n    if (type == \")\") return cont()\n    if (type == \";\") return cont(forspec2)\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression, forspec2) }\n    return pass(expression, forspec2)\n  }\n  function functiondef(type, value) {\n    if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n    if (type == \"variable\") {register(value); return cont(functiondef);}\n    if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, mayberettype, statement, popcontext);\n    if (isTS && value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, functiondef)\n  }\n  function functiondecl(type, value) {\n    if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondecl);}\n    if (type == \"variable\") {register(value); return cont(functiondecl);}\n    if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, mayberettype, popcontext);\n    if (isTS && value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, functiondecl)\n  }\n  function typename(type, value) {\n    if (type == \"keyword\" || type == \"variable\") {\n      cx.marked = \"type\"\n      return cont(typename)\n    } else if (value == \"<\") {\n      return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex)\n    }\n  }\n  function funarg(type, value) {\n    if (value == \"@\") cont(expression, funarg)\n    if (type == \"spread\") return cont(funarg);\n    if (isTS && isModifier(value)) { cx.marked = \"keyword\"; return cont(funarg); }\n    if (isTS && type == \"this\") return cont(maybetype, maybeAssign)\n    return pass(pattern, maybetype, maybeAssign);\n  }\n  function classExpression(type, value) {\n    // Class expressions may have an optional name.\n    if (type == \"variable\") return className(type, value);\n    return classNameAfter(type, value);\n  }\n  function className(type, value) {\n    if (type == \"variable\") {register(value); return cont(classNameAfter);}\n  }\n  function classNameAfter(type, value) {\n    if (value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, classNameAfter)\n    if (value == \"extends\" || value == \"implements\" || (isTS && type == \",\")) {\n      if (value == \"implements\") cx.marked = \"keyword\";\n      return cont(isTS ? typeexpr : expression, classNameAfter);\n    }\n    if (type == \"{\") return cont(pushlex(\"}\"), classBody, poplex);\n  }\n  function classBody(type, value) {\n    if (type == \"async\" ||\n        (type == \"variable\" &&\n         (value == \"static\" || value == \"get\" || value == \"set\" || (isTS && isModifier(value))) &&\n         cx.stream.match(/^\\s+[\\w$\\xa1-\\uffff]/, false))) {\n      cx.marked = \"keyword\";\n      return cont(classBody);\n    }\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\";\n      return cont(classfield, classBody);\n    }\n    if (type == \"number\" || type == \"string\") return cont(classfield, classBody);\n    if (type == \"[\")\n      return cont(expression, maybetype, expect(\"]\"), classfield, classBody)\n    if (value == \"*\") {\n      cx.marked = \"keyword\";\n      return cont(classBody);\n    }\n    if (isTS && type == \"(\") return pass(functiondecl, classBody)\n    if (type == \";\" || type == \",\") return cont(classBody);\n    if (type == \"}\") return cont();\n    if (value == \"@\") return cont(expression, classBody)\n  }\n  function classfield(type, value) {\n    if (value == \"!\") return cont(classfield)\n    if (value == \"?\") return cont(classfield)\n    if (type == \":\") return cont(typeexpr, maybeAssign)\n    if (value == \"=\") return cont(expressionNoComma)\n    var context = cx.state.lexical.prev, isInterface = context && context.info == \"interface\"\n    return pass(isInterface ? functiondecl : functiondef)\n  }\n  function afterExport(type, value) {\n    if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n    if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n    if (type == \"{\") return cont(commasep(exportField, \"}\"), maybeFrom, expect(\";\"));\n    return pass(statement);\n  }\n  function exportField(type, value) {\n    if (value == \"as\") { cx.marked = \"keyword\"; return cont(expect(\"variable\")); }\n    if (type == \"variable\") return pass(expressionNoComma, exportField);\n  }\n  function afterImport(type) {\n    if (type == \"string\") return cont();\n    if (type == \"(\") return pass(expression);\n    if (type == \".\") return pass(maybeoperatorComma);\n    return pass(importSpec, maybeMoreImports, maybeFrom);\n  }\n  function importSpec(type, value) {\n    if (type == \"{\") return contCommasep(importSpec, \"}\");\n    if (type == \"variable\") register(value);\n    if (value == \"*\") cx.marked = \"keyword\";\n    return cont(maybeAs);\n  }\n  function maybeMoreImports(type) {\n    if (type == \",\") return cont(importSpec, maybeMoreImports)\n  }\n  function maybeAs(_type, value) {\n    if (value == \"as\") { cx.marked = \"keyword\"; return cont(importSpec); }\n  }\n  function maybeFrom(_type, value) {\n    if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n  }\n  function arrayLiteral(type) {\n    if (type == \"]\") return cont();\n    return pass(commasep(expressionNoComma, \"]\"));\n  }\n  function enumdef() {\n    return pass(pushlex(\"form\"), pattern, expect(\"{\"), pushlex(\"}\"), commasep(enummember, \"}\"), poplex, poplex)\n  }\n  function enummember() {\n    return pass(pattern, maybeAssign);\n  }\n\n  function isContinuedStatement(state, textAfter) {\n    return state.lastType == \"operator\" || state.lastType == \",\" ||\n      isOperatorChar.test(textAfter.charAt(0)) ||\n      /[,.]/.test(textAfter.charAt(0));\n  }\n\n  function expressionAllowed(stream, state, backUp) {\n    return state.tokenize == tokenBase &&\n      /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\\[{}\\(,;:]|=>)$/.test(state.lastType) ||\n      (state.lastType == \"quasi\" && /\\{\\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      var state = {\n        tokenize: tokenBase,\n        lastType: \"sof\",\n        cc: [],\n        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n        localVars: parserConfig.localVars,\n        context: parserConfig.localVars && new Context(null, null, false),\n        indented: basecolumn || 0\n      };\n      if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n        state.globalVars = parserConfig.globalVars;\n      return state;\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (!state.lexical.hasOwnProperty(\"align\"))\n          state.lexical.align = false;\n        state.indented = stream.indentation();\n        findFatArrow(stream, state);\n      }\n      if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      if (type == \"comment\") return style;\n      state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n      return parseJS(state, style, type, content, stream);\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass;\n      if (state.tokenize != tokenBase) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top\n      // Kludge to prevent 'maybelse' from blocking lexical scope pops\n      if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n        var c = state.cc[i];\n        if (c == poplex) lexical = lexical.prev;\n        else if (c != maybeelse && c != popcontext) break;\n      }\n      while ((lexical.type == \"stat\" || lexical.type == \"form\") &&\n             (firstChar == \"}\" || ((top = state.cc[state.cc.length - 1]) &&\n                                   (top == maybeoperatorComma || top == maybeoperatorNoComma) &&\n                                   !/^[,\\.=+\\-*:?[\\(]/.test(textAfter))))\n        lexical = lexical.prev;\n      if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n        lexical = lexical.prev;\n      var type = lexical.type, closing = firstChar == type;\n\n      if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info.length + 1 : 0);\n      else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n      else if (type == \"form\") return lexical.indented + indentUnit;\n      else if (type == \"stat\")\n        return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);\n      else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\n        return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n      else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n      else return lexical.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricInput: /^\\s*(?:case .*?:|default:|\\{|\\})$/,\n    blockCommentStart: jsonMode ? null : \"/*\",\n    blockCommentEnd: jsonMode ? null : \"*/\",\n    blockCommentContinue: jsonMode ? null : \" * \",\n    lineComment: jsonMode ? null : \"//\",\n    fold: \"brace\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n\n    helperType: jsonMode ? \"json\" : \"javascript\",\n    jsonldMode: jsonldMode,\n    jsonMode: jsonMode,\n\n    expressionAllowed: expressionAllowed,\n\n    skipExpression: function(state) {\n      parseJS(state, \"atom\", \"atom\", \"true\", new CodeMirror.StringStream(\"\", 2, null))\n    }\n  };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/x-javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", { name: \"javascript\", json: true });\nCodeMirror.defineMIME(\"application/x-json\", { name: \"javascript\", json: true });\nCodeMirror.defineMIME(\"application/manifest+json\", { name: \"javascript\", json: true })\nCodeMirror.defineMIME(\"application/ld+json\", { name: \"javascript\", jsonld: true });\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/jinja2/jinja2.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"jinja2\", function() {\n    var keywords = [\"and\", \"as\", \"block\", \"endblock\", \"by\", \"cycle\", \"debug\", \"else\", \"elif\",\n      \"extends\", \"filter\", \"endfilter\", \"firstof\", \"for\",\n      \"endfor\", \"if\", \"endif\", \"ifchanged\", \"endifchanged\",\n      \"ifequal\", \"endifequal\", \"ifnotequal\",\n      \"endifnotequal\", \"in\", \"include\", \"load\", \"not\", \"now\", \"or\",\n      \"parsed\", \"regroup\", \"reversed\", \"spaceless\",\n      \"endspaceless\", \"ssi\", \"templatetag\", \"openblock\",\n      \"closeblock\", \"openvariable\", \"closevariable\",\n      \"openbrace\", \"closebrace\", \"opencomment\",\n      \"closecomment\", \"widthratio\", \"url\", \"with\", \"endwith\",\n      \"get_current_language\", \"trans\", \"endtrans\", \"noop\", \"blocktrans\",\n      \"endblocktrans\", \"get_available_languages\",\n      \"get_current_language_bidi\", \"plural\"],\n    operator = /^[+\\-*&%=<>!?|~^]/,\n    sign = /^[:\\[\\(\\{]/,\n    atom = [\"true\", \"false\"],\n    number = /^(\\d[+\\-\\*\\/])?\\d+(\\.\\d+)?/;\n\n    keywords = new RegExp(\"((\" + keywords.join(\")|(\") + \"))\\\\b\");\n    atom = new RegExp(\"((\" + atom.join(\")|(\") + \"))\\\\b\");\n\n    function tokenBase (stream, state) {\n      var ch = stream.peek();\n\n      //Comment\n      if (state.incomment) {\n        if(!stream.skipTo(\"#}\")) {\n          stream.skipToEnd();\n        } else {\n          stream.eatWhile(/\\#|}/);\n          state.incomment = false;\n        }\n        return \"comment\";\n      //Tag\n      } else if (state.intag) {\n        //After operator\n        if(state.operator) {\n          state.operator = false;\n          if(stream.match(atom)) {\n            return \"atom\";\n          }\n          if(stream.match(number)) {\n            return \"number\";\n          }\n        }\n        //After sign\n        if(state.sign) {\n          state.sign = false;\n          if(stream.match(atom)) {\n            return \"atom\";\n          }\n          if(stream.match(number)) {\n            return \"number\";\n          }\n        }\n\n        if(state.instring) {\n          if(ch == state.instring) {\n            state.instring = false;\n          }\n          stream.next();\n          return \"string\";\n        } else if(ch == \"'\" || ch == '\"') {\n          state.instring = ch;\n          stream.next();\n          return \"string\";\n        } else if(stream.match(state.intag + \"}\") || stream.eat(\"-\") && stream.match(state.intag + \"}\")) {\n          state.intag = false;\n          return \"tag\";\n        } else if(stream.match(operator)) {\n          state.operator = true;\n          return \"operator\";\n        } else if(stream.match(sign)) {\n          state.sign = true;\n        } else {\n          if(stream.eat(\" \") || stream.sol()) {\n            if(stream.match(keywords)) {\n              return \"keyword\";\n            }\n            if(stream.match(atom)) {\n              return \"atom\";\n            }\n            if(stream.match(number)) {\n              return \"number\";\n            }\n            if(stream.sol()) {\n              stream.next();\n            }\n          } else {\n            stream.next();\n          }\n\n        }\n        return \"variable\";\n      } else if (stream.eat(\"{\")) {\n        if (stream.eat(\"#\")) {\n          state.incomment = true;\n          if(!stream.skipTo(\"#}\")) {\n            stream.skipToEnd();\n          } else {\n            stream.eatWhile(/\\#|}/);\n            state.incomment = false;\n          }\n          return \"comment\";\n        //Open tag\n        } else if (ch = stream.eat(/\\{|%/)) {\n          //Cache close tag\n          state.intag = ch;\n          if(ch == \"{\") {\n            state.intag = \"}\";\n          }\n          stream.eat(\"-\");\n          return \"tag\";\n        }\n      }\n      stream.next();\n    };\n\n    return {\n      startState: function () {\n        return {tokenize: tokenBase};\n      },\n      token: function (stream, state) {\n        return state.tokenize(stream, state);\n      },\n      blockCommentStart: \"{#\",\n      blockCommentEnd: \"#}\"\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/jinja2\", \"jinja2\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/jsx/jsx.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../xml/xml\"), require(\"../javascript/javascript\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../xml/xml\", \"../javascript/javascript\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n\n  // Depth means the amount of open braces in JS context, in XML\n  // context 0 means not in tag, 1 means in tag, and 2 means in tag\n  // and js block comment.\n  function Context(state, mode, depth, prev) {\n    this.state = state; this.mode = mode; this.depth = depth; this.prev = prev\n  }\n\n  function copyContext(context) {\n    return new Context(CodeMirror.copyState(context.mode, context.state),\n                       context.mode,\n                       context.depth,\n                       context.prev && copyContext(context.prev))\n  }\n\n  CodeMirror.defineMode(\"jsx\", function(config, modeConfig) {\n    var xmlMode = CodeMirror.getMode(config, {name: \"xml\", allowMissing: true, multilineTagIndentPastTag: false, allowMissingTagName: true})\n    var jsMode = CodeMirror.getMode(config, modeConfig && modeConfig.base || \"javascript\")\n\n    function flatXMLIndent(state) {\n      var tagName = state.tagName\n      state.tagName = null\n      var result = xmlMode.indent(state, \"\", \"\")\n      state.tagName = tagName\n      return result\n    }\n\n    function token(stream, state) {\n      if (state.context.mode == xmlMode)\n        return xmlToken(stream, state, state.context)\n      else\n        return jsToken(stream, state, state.context)\n    }\n\n    function xmlToken(stream, state, cx) {\n      if (cx.depth == 2) { // Inside a JS /* */ comment\n        if (stream.match(/^.*?\\*\\//)) cx.depth = 1\n        else stream.skipToEnd()\n        return \"comment\"\n      }\n\n      if (stream.peek() == \"{\") {\n        xmlMode.skipAttribute(cx.state)\n\n        var indent = flatXMLIndent(cx.state), xmlContext = cx.state.context\n        // If JS starts on same line as tag\n        if (xmlContext && stream.match(/^[^>]*>\\s*$/, false)) {\n          while (xmlContext.prev && !xmlContext.startOfLine)\n            xmlContext = xmlContext.prev\n          // If tag starts the line, use XML indentation level\n          if (xmlContext.startOfLine) indent -= config.indentUnit\n          // Else use JS indentation level\n          else if (cx.prev.state.lexical) indent = cx.prev.state.lexical.indented\n        // Else if inside of tag\n        } else if (cx.depth == 1) {\n          indent += config.indentUnit\n        }\n\n        state.context = new Context(CodeMirror.startState(jsMode, indent),\n                                    jsMode, 0, state.context)\n        return null\n      }\n\n      if (cx.depth == 1) { // Inside of tag\n        if (stream.peek() == \"<\") { // Tag inside of tag\n          xmlMode.skipAttribute(cx.state)\n          state.context = new Context(CodeMirror.startState(xmlMode, flatXMLIndent(cx.state)),\n                                      xmlMode, 0, state.context)\n          return null\n        } else if (stream.match(\"//\")) {\n          stream.skipToEnd()\n          return \"comment\"\n        } else if (stream.match(\"/*\")) {\n          cx.depth = 2\n          return token(stream, state)\n        }\n      }\n\n      var style = xmlMode.token(stream, cx.state), cur = stream.current(), stop\n      if (/\\btag\\b/.test(style)) {\n        if (/>$/.test(cur)) {\n          if (cx.state.context) cx.depth = 0\n          else state.context = state.context.prev\n        } else if (/^</.test(cur)) {\n          cx.depth = 1\n        }\n      } else if (!style && (stop = cur.indexOf(\"{\")) > -1) {\n        stream.backUp(cur.length - stop)\n      }\n      return style\n    }\n\n    function jsToken(stream, state, cx) {\n      if (stream.peek() == \"<\" && jsMode.expressionAllowed(stream, cx.state)) {\n        state.context = new Context(CodeMirror.startState(xmlMode, jsMode.indent(cx.state, \"\", \"\")),\n                                    xmlMode, 0, state.context)\n        jsMode.skipExpression(cx.state)\n        return null\n      }\n\n      var style = jsMode.token(stream, cx.state)\n      if (!style && cx.depth != null) {\n        var cur = stream.current()\n        if (cur == \"{\") {\n          cx.depth++\n        } else if (cur == \"}\") {\n          if (--cx.depth == 0) state.context = state.context.prev\n        }\n      }\n      return style\n    }\n\n    return {\n      startState: function() {\n        return {context: new Context(CodeMirror.startState(jsMode), jsMode)}\n      },\n\n      copyState: function(state) {\n        return {context: copyContext(state.context)}\n      },\n\n      token: token,\n\n      indent: function(state, textAfter, fullLine) {\n        return state.context.mode.indent(state.context.state, textAfter, fullLine)\n      },\n\n      innerMode: function(state) {\n        return state.context\n      }\n    }\n  }, \"xml\", \"javascript\")\n\n  CodeMirror.defineMIME(\"text/jsx\", \"jsx\")\n  CodeMirror.defineMIME(\"text/typescript-jsx\", {name: \"jsx\", base: {name: \"javascript\", typescript: true}})\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/julia/julia.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"julia\", function(config, parserConf) {\n  function wordRegexp(words, end, pre) {\n    if (typeof pre === \"undefined\") { pre = \"\"; }\n    if (typeof end === \"undefined\") { end = \"\\\\b\"; }\n    return new RegExp(\"^\" + pre + \"((\" + words.join(\")|(\") + \"))\" + end);\n  }\n\n  var octChar = \"\\\\\\\\[0-7]{1,3}\";\n  var hexChar = \"\\\\\\\\x[A-Fa-f0-9]{1,2}\";\n  var sChar = \"\\\\\\\\[abefnrtv0%?'\\\"\\\\\\\\]\";\n  var uChar = \"([^\\\\u0027\\\\u005C\\\\uD800-\\\\uDFFF]|[\\\\uD800-\\\\uDFFF][\\\\uDC00-\\\\uDFFF])\";\n\n  var asciiOperatorsList = [\n    \"[<>]:\", \"[<>=]=\", \"<<=?\", \">>>?=?\", \"=>\", \"--?>\", \"<--[->]?\", \"\\\\/\\\\/\",\n    \"\\\\.{2,3}\", \"[\\\\.\\\\\\\\%*+\\\\-<>!\\\\/^|&]=?\", \"\\\\?\", \"\\\\$\", \"~\", \":\"\n  ];\n  var operators = parserConf.operators || wordRegexp([\n    \"[<>]:\", \"[<>=]=\", \"<<=?\", \">>>?=?\", \"=>\", \"--?>\", \"<--[->]?\", \"\\\\/\\\\/\",\n    \"[\\\\\\\\%*+\\\\-<>!\\\\/^|&\\\\u00F7\\\\u22BB]=?\", \"\\\\?\", \"\\\\$\", \"~\", \":\",\n    \"\\\\u00D7\", \"\\\\u2208\", \"\\\\u2209\", \"\\\\u220B\", \"\\\\u220C\", \"\\\\u2218\",\n    \"\\\\u221A\", \"\\\\u221B\", \"\\\\u2229\", \"\\\\u222A\", \"\\\\u2260\", \"\\\\u2264\",\n    \"\\\\u2265\", \"\\\\u2286\", \"\\\\u2288\", \"\\\\u228A\", \"\\\\u22C5\",\n    \"\\\\b(in|isa)\\\\b(?!\\.?\\\\()\"\n  ], \"\");\n  var delimiters = parserConf.delimiters || /^[;,()[\\]{}]/;\n  var identifiers = parserConf.identifiers ||\n        /^[_A-Za-z\\u00A1-\\u2217\\u2219-\\uFFFF][\\w\\u00A1-\\u2217\\u2219-\\uFFFF]*!*/;\n\n  var chars = wordRegexp([octChar, hexChar, sChar, uChar], \"'\");\n\n  var openersList = [\"begin\", \"function\", \"type\", \"struct\", \"immutable\", \"let\",\n        \"macro\", \"for\", \"while\", \"quote\", \"if\", \"else\", \"elseif\", \"try\",\n        \"finally\", \"catch\", \"do\"];\n\n  var closersList = [\"end\", \"else\", \"elseif\", \"catch\", \"finally\"];\n\n  var keywordsList = [\"if\", \"else\", \"elseif\", \"while\", \"for\", \"begin\", \"let\",\n        \"end\", \"do\", \"try\", \"catch\", \"finally\", \"return\", \"break\", \"continue\",\n        \"global\", \"local\", \"const\", \"export\", \"import\", \"importall\", \"using\",\n        \"function\", \"where\", \"macro\", \"module\", \"baremodule\", \"struct\", \"type\",\n        \"mutable\", \"immutable\", \"quote\", \"typealias\", \"abstract\", \"primitive\",\n        \"bitstype\"];\n\n  var builtinsList = [\"true\", \"false\", \"nothing\", \"NaN\", \"Inf\"];\n\n  CodeMirror.registerHelper(\"hintWords\", \"julia\", keywordsList.concat(builtinsList));\n\n  var openers = wordRegexp(openersList);\n  var closers = wordRegexp(closersList);\n  var keywords = wordRegexp(keywordsList);\n  var builtins = wordRegexp(builtinsList);\n\n  var macro = /^@[_A-Za-z\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF]*!*/;\n  var symbol = /^:[_A-Za-z\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF]*!*/;\n  var stringPrefixes = /^(`|([_A-Za-z\\u00A1-\\uFFFF]*\"(\"\")?))/;\n\n  var macroOperators = wordRegexp(asciiOperatorsList, \"\", \"@\");\n  var symbolOperators = wordRegexp(asciiOperatorsList, \"\", \":\");\n\n  function inArray(state) {\n    return (state.nestedArrays > 0);\n  }\n\n  function inGenerator(state) {\n    return (state.nestedGenerators > 0);\n  }\n\n  function currentScope(state, n) {\n    if (typeof(n) === \"undefined\") { n = 0; }\n    if (state.scopes.length <= n) {\n      return null;\n    }\n    return state.scopes[state.scopes.length - (n + 1)];\n  }\n\n  // tokenizers\n  function tokenBase(stream, state) {\n    // Handle multiline comments\n    if (stream.match('#=', false)) {\n      state.tokenize = tokenComment;\n      return state.tokenize(stream, state);\n    }\n\n    // Handle scope changes\n    var leavingExpr = state.leavingExpr;\n    if (stream.sol()) {\n      leavingExpr = false;\n    }\n    state.leavingExpr = false;\n\n    if (leavingExpr) {\n      if (stream.match(/^'+/)) {\n        return \"operator\";\n      }\n    }\n\n    if (stream.match(/\\.{4,}/)) {\n      return \"error\";\n    } else if (stream.match(/\\.{1,3}/)) {\n      return \"operator\";\n    }\n\n    if (stream.eatSpace()) {\n      return null;\n    }\n\n    var ch = stream.peek();\n\n    // Handle single line comments\n    if (ch === '#') {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n\n    if (ch === '[') {\n      state.scopes.push('[');\n      state.nestedArrays++;\n    }\n\n    if (ch === '(') {\n      state.scopes.push('(');\n      state.nestedGenerators++;\n    }\n\n    if (inArray(state) && ch === ']') {\n      while (state.scopes.length && currentScope(state) !== \"[\") { state.scopes.pop(); }\n      state.scopes.pop();\n      state.nestedArrays--;\n      state.leavingExpr = true;\n    }\n\n    if (inGenerator(state) && ch === ')') {\n      while (state.scopes.length && currentScope(state) !== \"(\") { state.scopes.pop(); }\n      state.scopes.pop();\n      state.nestedGenerators--;\n      state.leavingExpr = true;\n    }\n\n    if (inArray(state)) {\n      if (state.lastToken == \"end\" && stream.match(':')) {\n        return \"operator\";\n      }\n      if (stream.match('end')) {\n        return \"number\";\n      }\n    }\n\n    var match;\n    if (match = stream.match(openers, false)) {\n      state.scopes.push(match[0]);\n    }\n\n    if (stream.match(closers, false)) {\n      state.scopes.pop();\n    }\n\n    // Handle type annotations\n    if (stream.match(/^::(?![:\\$])/)) {\n      state.tokenize = tokenAnnotation;\n      return state.tokenize(stream, state);\n    }\n\n    // Handle symbols\n    if (!leavingExpr && (stream.match(symbol) || stream.match(symbolOperators))) {\n      return \"builtin\";\n    }\n\n    // Handle parametric types\n    //if (stream.match(/^{[^}]*}(?=\\()/)) {\n    //  return \"builtin\";\n    //}\n\n    // Handle operators and Delimiters\n    if (stream.match(operators)) {\n      return \"operator\";\n    }\n\n    // Handle Number Literals\n    if (stream.match(/^\\.?\\d/, false)) {\n      var imMatcher = RegExp(/^im\\b/);\n      var numberLiteral = false;\n      if (stream.match(/^0x\\.[0-9a-f_]+p[\\+\\-]?[_\\d]+/i)) { numberLiteral = true; }\n      // Integers\n      if (stream.match(/^0x[0-9a-f_]+/i)) { numberLiteral = true; } // Hex\n      if (stream.match(/^0b[01_]+/i)) { numberLiteral = true; } // Binary\n      if (stream.match(/^0o[0-7_]+/i)) { numberLiteral = true; } // Octal\n      // Floats\n      if (stream.match(/^(?:(?:\\d[_\\d]*)?\\.(?!\\.)(?:\\d[_\\d]*)?|\\d[_\\d]*\\.(?!\\.)(?:\\d[_\\d]*))?([Eef][\\+\\-]?[_\\d]+)?/i)) { numberLiteral = true; }\n      if (stream.match(/^\\d[_\\d]*(e[\\+\\-]?\\d+)?/i)) { numberLiteral = true; } // Decimal\n      if (numberLiteral) {\n          // Integer literals may be \"long\"\n          stream.match(imMatcher);\n          state.leavingExpr = true;\n          return \"number\";\n      }\n    }\n\n    // Handle Chars\n    if (stream.match('\\'')) {\n      state.tokenize = tokenChar;\n      return state.tokenize(stream, state);\n    }\n\n    // Handle Strings\n    if (stream.match(stringPrefixes)) {\n      state.tokenize = tokenStringFactory(stream.current());\n      return state.tokenize(stream, state);\n    }\n\n    if (stream.match(macro) || stream.match(macroOperators)) {\n      return \"meta\";\n    }\n\n    if (stream.match(delimiters)) {\n      return null;\n    }\n\n    if (stream.match(keywords)) {\n      return \"keyword\";\n    }\n\n    if (stream.match(builtins)) {\n      return \"builtin\";\n    }\n\n    var isDefinition = state.isDefinition || state.lastToken == \"function\" ||\n                       state.lastToken == \"macro\" || state.lastToken == \"type\" ||\n                       state.lastToken == \"struct\" || state.lastToken == \"immutable\";\n\n    if (stream.match(identifiers)) {\n      if (isDefinition) {\n        if (stream.peek() === '.') {\n          state.isDefinition = true;\n          return \"variable\";\n        }\n        state.isDefinition = false;\n        return \"def\";\n      }\n      state.leavingExpr = true;\n      return \"variable\";\n    }\n\n    // Handle non-detected items\n    stream.next();\n    return \"error\";\n  }\n\n  function tokenAnnotation(stream, state) {\n    stream.match(/.*?(?=[,;{}()=\\s]|$)/);\n    if (stream.match('{')) {\n      state.nestedParameters++;\n    } else if (stream.match('}') && state.nestedParameters > 0) {\n      state.nestedParameters--;\n    }\n    if (state.nestedParameters > 0) {\n      stream.match(/.*?(?={|})/) || stream.next();\n    } else if (state.nestedParameters == 0) {\n      state.tokenize = tokenBase;\n    }\n    return \"builtin\";\n  }\n\n  function tokenComment(stream, state) {\n    if (stream.match('#=')) {\n      state.nestedComments++;\n    }\n    if (!stream.match(/.*?(?=(#=|=#))/)) {\n      stream.skipToEnd();\n    }\n    if (stream.match('=#')) {\n      state.nestedComments--;\n      if (state.nestedComments == 0)\n        state.tokenize = tokenBase;\n    }\n    return \"comment\";\n  }\n\n  function tokenChar(stream, state) {\n    var isChar = false, match;\n    if (stream.match(chars)) {\n      isChar = true;\n    } else if (match = stream.match(/\\\\u([a-f0-9]{1,4})(?=')/i)) {\n      var value = parseInt(match[1], 16);\n      if (value <= 55295 || value >= 57344) { // (U+0,U+D7FF), (U+E000,U+FFFF)\n        isChar = true;\n        stream.next();\n      }\n    } else if (match = stream.match(/\\\\U([A-Fa-f0-9]{5,8})(?=')/)) {\n      var value = parseInt(match[1], 16);\n      if (value <= 1114111) { // U+10FFFF\n        isChar = true;\n        stream.next();\n      }\n    }\n    if (isChar) {\n      state.leavingExpr = true;\n      state.tokenize = tokenBase;\n      return \"string\";\n    }\n    if (!stream.match(/^[^']+(?=')/)) { stream.skipToEnd(); }\n    if (stream.match('\\'')) { state.tokenize = tokenBase; }\n    return \"error\";\n  }\n\n  function tokenStringFactory(delimiter) {\n    if (delimiter.substr(-3) === '\"\"\"') {\n      delimiter = '\"\"\"';\n    } else if (delimiter.substr(-1) === '\"') {\n      delimiter = '\"';\n    }\n    function tokenString(stream, state) {\n      if (stream.eat('\\\\')) {\n        stream.next();\n      } else if (stream.match(delimiter)) {\n        state.tokenize = tokenBase;\n        state.leavingExpr = true;\n        return \"string\";\n      } else {\n        stream.eat(/[`\"]/);\n      }\n      stream.eatWhile(/[^\\\\`\"]/);\n      return \"string\";\n    }\n    return tokenString;\n  }\n\n  var external = {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        scopes: [],\n        lastToken: null,\n        leavingExpr: false,\n        isDefinition: false,\n        nestedArrays: 0,\n        nestedComments: 0,\n        nestedGenerators: 0,\n        nestedParameters: 0,\n        firstParenPos: -1\n      };\n    },\n\n    token: function(stream, state) {\n      var style = state.tokenize(stream, state);\n      var current = stream.current();\n\n      if (current && style) {\n        state.lastToken = current;\n      }\n\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var delta = 0;\n      if ( textAfter === ']' || textAfter === ')' || /^end\\b/.test(textAfter) ||\n           /^else/.test(textAfter) || /^catch\\b/.test(textAfter) || /^elseif\\b/.test(textAfter) ||\n           /^finally/.test(textAfter) ) {\n        delta = -1;\n      }\n      return (state.scopes.length + delta) * config.indentUnit;\n    },\n\n    electricInput: /\\b(end|else|catch|finally)\\b/,\n    blockCommentStart: \"#=\",\n    blockCommentEnd: \"=#\",\n    lineComment: \"#\",\n    closeBrackets: \"()[]{}\\\"\\\"\",\n    fold: \"indent\"\n  };\n  return external;\n});\n\n\nCodeMirror.defineMIME(\"text/x-julia\", \"julia\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/livescript/livescript.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Link to the project's GitHub page:\n * https://github.com/duralog/CodeMirror\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode('livescript', function(){\n    var tokenBase = function(stream, state) {\n      var next_rule = state.next || \"start\";\n      if (next_rule) {\n        state.next = state.next;\n        var nr = Rules[next_rule];\n        if (nr.splice) {\n          for (var i$ = 0; i$ < nr.length; ++i$) {\n            var r = nr[i$];\n            if (r.regex && stream.match(r.regex)) {\n              state.next = r.next || state.next;\n              return r.token;\n            }\n          }\n          stream.next();\n          return 'error';\n        }\n        if (stream.match(r = Rules[next_rule])) {\n          if (r.regex && stream.match(r.regex)) {\n            state.next = r.next;\n            return r.token;\n          } else {\n            stream.next();\n            return 'error';\n          }\n        }\n      }\n      stream.next();\n      return 'error';\n    };\n    var external = {\n      startState: function(){\n        return {\n          next: 'start',\n          lastToken: {style: null, indent: 0, content: \"\"}\n        };\n      },\n      token: function(stream, state){\n        while (stream.pos == stream.start)\n          var style = tokenBase(stream, state);\n        state.lastToken = {\n          style: style,\n          indent: stream.indentation(),\n          content: stream.current()\n        };\n        return style.replace(/\\./g, ' ');\n      },\n      indent: function(state){\n        var indentation = state.lastToken.indent;\n        if (state.lastToken.content.match(indenter)) {\n          indentation += 2;\n        }\n        return indentation;\n      }\n    };\n    return external;\n  });\n\n  var identifier = '(?![\\\\d\\\\s])[$\\\\w\\\\xAA-\\\\uFFDC](?:(?!\\\\s)[$\\\\w\\\\xAA-\\\\uFFDC]|-[A-Za-z])*';\n  var indenter = RegExp('(?:[({[=:]|[-~]>|\\\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\\\s*all)?|const|var|let|new|catch(?:\\\\s*' + identifier + ')?))\\\\s*$');\n  var keywordend = '(?![$\\\\w]|-[A-Za-z]|\\\\s*:(?![:=]))';\n  var stringfill = {\n    token: 'string',\n    regex: '.+'\n  };\n  var Rules = {\n    start: [\n      {\n        token: 'comment.doc',\n        regex: '/\\\\*',\n        next: 'comment'\n      }, {\n        token: 'comment',\n        regex: '#.*'\n      }, {\n        token: 'keyword',\n        regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend\n      }, {\n        token: 'constant.language',\n        regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend\n      }, {\n        token: 'invalid.illegal',\n        regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend\n      }, {\n        token: 'language.support.class',\n        regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend\n      }, {\n        token: 'language.support.function',\n        regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend\n      }, {\n        token: 'variable.language',\n        regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend\n      }, {\n        token: 'identifier',\n        regex: identifier + '\\\\s*:(?![:=])'\n      }, {\n        token: 'variable',\n        regex: identifier\n      }, {\n        token: 'keyword.operator',\n        regex: '(?:\\\\.{3}|\\\\s+\\\\?)'\n      }, {\n        token: 'keyword.variable',\n        regex: '(?:@+|::|\\\\.\\\\.)',\n        next: 'key'\n      }, {\n        token: 'keyword.operator',\n        regex: '\\\\.\\\\s*',\n        next: 'key'\n      }, {\n        token: 'string',\n        regex: '\\\\\\\\\\\\S[^\\\\s,;)}\\\\]]*'\n      }, {\n        token: 'string.doc',\n        regex: '\\'\\'\\'',\n        next: 'qdoc'\n      }, {\n        token: 'string.doc',\n        regex: '\"\"\"',\n        next: 'qqdoc'\n      }, {\n        token: 'string',\n        regex: '\\'',\n        next: 'qstring'\n      }, {\n        token: 'string',\n        regex: '\"',\n        next: 'qqstring'\n      }, {\n        token: 'string',\n        regex: '`',\n        next: 'js'\n      }, {\n        token: 'string',\n        regex: '<\\\\[',\n        next: 'words'\n      }, {\n        token: 'string.regex',\n        regex: '//',\n        next: 'heregex'\n      }, {\n        token: 'string.regex',\n        regex: '\\\\/(?:[^[\\\\/\\\\n\\\\\\\\]*(?:(?:\\\\\\\\.|\\\\[[^\\\\]\\\\n\\\\\\\\]*(?:\\\\\\\\.[^\\\\]\\\\n\\\\\\\\]*)*\\\\])[^[\\\\/\\\\n\\\\\\\\]*)*)\\\\/[gimy$]{0,4}',\n        next: 'key'\n      }, {\n        token: 'constant.numeric',\n        regex: '(?:0x[\\\\da-fA-F][\\\\da-fA-F_]*|(?:[2-9]|[12]\\\\d|3[0-6])r[\\\\da-zA-Z][\\\\da-zA-Z_]*|(?:\\\\d[\\\\d_]*(?:\\\\.\\\\d[\\\\d_]*)?|\\\\.\\\\d[\\\\d_]*)(?:e[+-]?\\\\d[\\\\d_]*)?[\\\\w$]*)'\n      }, {\n        token: 'lparen',\n        regex: '[({[]'\n      }, {\n        token: 'rparen',\n        regex: '[)}\\\\]]',\n        next: 'key'\n      }, {\n        token: 'keyword.operator',\n        regex: '\\\\S+'\n      }, {\n        token: 'text',\n        regex: '\\\\s+'\n      }\n    ],\n    heregex: [\n      {\n        token: 'string.regex',\n        regex: '.*?//[gimy$?]{0,4}',\n        next: 'start'\n      }, {\n        token: 'string.regex',\n        regex: '\\\\s*#{'\n      }, {\n        token: 'comment.regex',\n        regex: '\\\\s+(?:#.*)?'\n      }, {\n        token: 'string.regex',\n        regex: '\\\\S+'\n      }\n    ],\n    key: [\n      {\n        token: 'keyword.operator',\n        regex: '[.?@!]+'\n      }, {\n        token: 'identifier',\n        regex: identifier,\n        next: 'start'\n      }, {\n        token: 'text',\n        regex: '',\n        next: 'start'\n      }\n    ],\n    comment: [\n      {\n        token: 'comment.doc',\n        regex: '.*?\\\\*/',\n        next: 'start'\n      }, {\n        token: 'comment.doc',\n        regex: '.+'\n      }\n    ],\n    qdoc: [\n      {\n        token: 'string',\n        regex: \".*?'''\",\n        next: 'key'\n      }, stringfill\n    ],\n    qqdoc: [\n      {\n        token: 'string',\n        regex: '.*?\"\"\"',\n        next: 'key'\n      }, stringfill\n    ],\n    qstring: [\n      {\n        token: 'string',\n        regex: '[^\\\\\\\\\\']*(?:\\\\\\\\.[^\\\\\\\\\\']*)*\\'',\n        next: 'key'\n      }, stringfill\n    ],\n    qqstring: [\n      {\n        token: 'string',\n        regex: '[^\\\\\\\\\"]*(?:\\\\\\\\.[^\\\\\\\\\"]*)*\"',\n        next: 'key'\n      }, stringfill\n    ],\n    js: [\n      {\n        token: 'string',\n        regex: '[^\\\\\\\\`]*(?:\\\\\\\\.[^\\\\\\\\`]*)*`',\n        next: 'key'\n      }, stringfill\n    ],\n    words: [\n      {\n        token: 'string',\n        regex: '.*?\\\\]>',\n        next: 'key'\n      }, stringfill\n    ]\n  };\n  for (var idx in Rules) {\n    var r = Rules[idx];\n    if (r.splice) {\n      for (var i = 0, len = r.length; i < len; ++i) {\n        var rr = r[i];\n        if (typeof rr.regex === 'string') {\n          Rules[idx][i].regex = new RegExp('^' + rr.regex);\n        }\n      }\n    } else if (typeof rr.regex === 'string') {\n      Rules[idx].regex = new RegExp('^' + r.regex);\n    }\n  }\n\n  CodeMirror.defineMIME('text/x-livescript', 'livescript');\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/lua/lua.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// LUA mode. Ported to CodeMirror 2 from Franciszek Wawrzak's\n// CodeMirror 1 mode.\n// highlights keywords, strings, comments (no leveling supported! (\"[==[\")), tokens, basic indenting\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"lua\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit;\n\n  function prefixRE(words) {\n    return new RegExp(\"^(?:\" + words.join(\"|\") + \")\", \"i\");\n  }\n  function wordRE(words) {\n    return new RegExp(\"^(?:\" + words.join(\"|\") + \")$\", \"i\");\n  }\n  var specials = wordRE(parserConfig.specials || []);\n\n  // long list of standard functions from lua manual\n  var builtins = wordRE([\n    \"_G\",\"_VERSION\",\"assert\",\"collectgarbage\",\"dofile\",\"error\",\"getfenv\",\"getmetatable\",\"ipairs\",\"load\",\n    \"loadfile\",\"loadstring\",\"module\",\"next\",\"pairs\",\"pcall\",\"print\",\"rawequal\",\"rawget\",\"rawset\",\"require\",\n    \"select\",\"setfenv\",\"setmetatable\",\"tonumber\",\"tostring\",\"type\",\"unpack\",\"xpcall\",\n\n    \"coroutine.create\",\"coroutine.resume\",\"coroutine.running\",\"coroutine.status\",\"coroutine.wrap\",\"coroutine.yield\",\n\n    \"debug.debug\",\"debug.getfenv\",\"debug.gethook\",\"debug.getinfo\",\"debug.getlocal\",\"debug.getmetatable\",\n    \"debug.getregistry\",\"debug.getupvalue\",\"debug.setfenv\",\"debug.sethook\",\"debug.setlocal\",\"debug.setmetatable\",\n    \"debug.setupvalue\",\"debug.traceback\",\n\n    \"close\",\"flush\",\"lines\",\"read\",\"seek\",\"setvbuf\",\"write\",\n\n    \"io.close\",\"io.flush\",\"io.input\",\"io.lines\",\"io.open\",\"io.output\",\"io.popen\",\"io.read\",\"io.stderr\",\"io.stdin\",\n    \"io.stdout\",\"io.tmpfile\",\"io.type\",\"io.write\",\n\n    \"math.abs\",\"math.acos\",\"math.asin\",\"math.atan\",\"math.atan2\",\"math.ceil\",\"math.cos\",\"math.cosh\",\"math.deg\",\n    \"math.exp\",\"math.floor\",\"math.fmod\",\"math.frexp\",\"math.huge\",\"math.ldexp\",\"math.log\",\"math.log10\",\"math.max\",\n    \"math.min\",\"math.modf\",\"math.pi\",\"math.pow\",\"math.rad\",\"math.random\",\"math.randomseed\",\"math.sin\",\"math.sinh\",\n    \"math.sqrt\",\"math.tan\",\"math.tanh\",\n\n    \"os.clock\",\"os.date\",\"os.difftime\",\"os.execute\",\"os.exit\",\"os.getenv\",\"os.remove\",\"os.rename\",\"os.setlocale\",\n    \"os.time\",\"os.tmpname\",\n\n    \"package.cpath\",\"package.loaded\",\"package.loaders\",\"package.loadlib\",\"package.path\",\"package.preload\",\n    \"package.seeall\",\n\n    \"string.byte\",\"string.char\",\"string.dump\",\"string.find\",\"string.format\",\"string.gmatch\",\"string.gsub\",\n    \"string.len\",\"string.lower\",\"string.match\",\"string.rep\",\"string.reverse\",\"string.sub\",\"string.upper\",\n\n    \"table.concat\",\"table.insert\",\"table.maxn\",\"table.remove\",\"table.sort\"\n  ]);\n  var keywords = wordRE([\"and\",\"break\",\"elseif\",\"false\",\"nil\",\"not\",\"or\",\"return\",\n                         \"true\",\"function\", \"end\", \"if\", \"then\", \"else\", \"do\",\n                         \"while\", \"repeat\", \"until\", \"for\", \"in\", \"local\" ]);\n\n  var indentTokens = wordRE([\"function\", \"if\",\"repeat\",\"do\", \"\\\\(\", \"{\"]);\n  var dedentTokens = wordRE([\"end\", \"until\", \"\\\\)\", \"}\"]);\n  var dedentPartial = prefixRE([\"end\", \"until\", \"\\\\)\", \"}\", \"else\", \"elseif\"]);\n\n  function readBracket(stream) {\n    var level = 0;\n    while (stream.eat(\"=\")) ++level;\n    stream.eat(\"[\");\n    return level;\n  }\n\n  function normal(stream, state) {\n    var ch = stream.next();\n    if (ch == \"-\" && stream.eat(\"-\")) {\n      if (stream.eat(\"[\") && stream.eat(\"[\"))\n        return (state.cur = bracketed(readBracket(stream), \"comment\"))(stream, state);\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    if (ch == \"\\\"\" || ch == \"'\")\n      return (state.cur = string(ch))(stream, state);\n    if (ch == \"[\" && /[\\[=]/.test(stream.peek()))\n      return (state.cur = bracketed(readBracket(stream), \"string\"))(stream, state);\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w.%]/);\n      return \"number\";\n    }\n    if (/[\\w_]/.test(ch)) {\n      stream.eatWhile(/[\\w\\\\\\-_.]/);\n      return \"variable\";\n    }\n    return null;\n  }\n\n  function bracketed(level, style) {\n    return function(stream, state) {\n      var curlev = null, ch;\n      while ((ch = stream.next()) != null) {\n        if (curlev == null) {if (ch == \"]\") curlev = 0;}\n        else if (ch == \"=\") ++curlev;\n        else if (ch == \"]\" && curlev == level) { state.cur = normal; break; }\n        else curlev = null;\n      }\n      return style;\n    };\n  }\n\n  function string(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) break;\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      if (!escaped) state.cur = normal;\n      return \"string\";\n    };\n  }\n\n  return {\n    startState: function(basecol) {\n      return {basecol: basecol || 0, indentDepth: 0, cur: normal};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = state.cur(stream, state);\n      var word = stream.current();\n      if (style == \"variable\") {\n        if (keywords.test(word)) style = \"keyword\";\n        else if (builtins.test(word)) style = \"builtin\";\n        else if (specials.test(word)) style = \"variable-2\";\n      }\n      if ((style != \"comment\") && (style != \"string\")){\n        if (indentTokens.test(word)) ++state.indentDepth;\n        else if (dedentTokens.test(word)) --state.indentDepth;\n      }\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var closing = dedentPartial.test(textAfter);\n      return state.basecol + indentUnit * (state.indentDepth - (closing ? 1 : 0));\n    },\n\n    electricInput: /^\\s*(?:end|until|else|\\)|\\})$/,\n    lineComment: \"--\",\n    blockCommentStart: \"--[[\",\n    blockCommentEnd: \"]]\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-lua\", \"lua\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/markdown/markdown.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../xml/xml\"), require(\"../meta\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../xml/xml\", \"../meta\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"markdown\", function(cmCfg, modeCfg) {\n\n  var htmlMode = CodeMirror.getMode(cmCfg, \"text/html\");\n  var htmlModeMissing = htmlMode.name == \"null\"\n\n  function getMode(name) {\n    if (CodeMirror.findModeByName) {\n      var found = CodeMirror.findModeByName(name);\n      if (found) name = found.mime || found.mimes[0];\n    }\n    var mode = CodeMirror.getMode(cmCfg, name);\n    return mode.name == \"null\" ? null : mode;\n  }\n\n  // Should characters that affect highlighting be highlighted separate?\n  // Does not include characters that will be output (such as `1.` and `-` for lists)\n  if (modeCfg.highlightFormatting === undefined)\n    modeCfg.highlightFormatting = false;\n\n  // Maximum number of nested blockquotes. Set to 0 for infinite nesting.\n  // Excess `>` will emit `error` token.\n  if (modeCfg.maxBlockquoteDepth === undefined)\n    modeCfg.maxBlockquoteDepth = 0;\n\n  // Turn on task lists? (\"- [ ] \" and \"- [x] \")\n  if (modeCfg.taskLists === undefined) modeCfg.taskLists = false;\n\n  // Turn on strikethrough syntax\n  if (modeCfg.strikethrough === undefined)\n    modeCfg.strikethrough = false;\n\n  if (modeCfg.emoji === undefined)\n    modeCfg.emoji = false;\n\n  if (modeCfg.fencedCodeBlockHighlighting === undefined)\n    modeCfg.fencedCodeBlockHighlighting = true;\n\n  if (modeCfg.fencedCodeBlockDefaultMode === undefined)\n    modeCfg.fencedCodeBlockDefaultMode = 'text/plain';\n\n  if (modeCfg.xml === undefined)\n    modeCfg.xml = true;\n\n  // Allow token types to be overridden by user-provided token types.\n  if (modeCfg.tokenTypeOverrides === undefined)\n    modeCfg.tokenTypeOverrides = {};\n\n  var tokenTypes = {\n    header: \"header\",\n    code: \"comment\",\n    quote: \"quote\",\n    list1: \"variable-2\",\n    list2: \"variable-3\",\n    list3: \"keyword\",\n    hr: \"hr\",\n    image: \"image\",\n    imageAltText: \"image-alt-text\",\n    imageMarker: \"image-marker\",\n    formatting: \"formatting\",\n    linkInline: \"link\",\n    linkEmail: \"link\",\n    linkText: \"link\",\n    linkHref: \"string\",\n    em: \"em\",\n    strong: \"strong\",\n    strikethrough: \"strikethrough\",\n    emoji: \"builtin\"\n  };\n\n  for (var tokenType in tokenTypes) {\n    if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) {\n      tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType];\n    }\n  }\n\n  var hrRE = /^([*\\-_])(?:\\s*\\1){2,}\\s*$/\n  ,   listRE = /^(?:[*\\-+]|^[0-9]+([.)]))\\s+/\n  ,   taskListRE = /^\\[(x| )\\](?=\\s)/i // Must follow listRE\n  ,   atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/\n  ,   setextHeaderRE = /^ {0,3}(?:\\={1,}|-{2,})\\s*$/\n  ,   textRE = /^[^#!\\[\\]*_\\\\<>` \"'(~:]+/\n  ,   fencedCodeRE = /^(~~~+|```+)[ \\t]*([\\w\\/+#-]*)[^\\n`]*$/\n  ,   linkDefRE = /^\\s*\\[[^\\]]+?\\]:.*$/ // naive link-definition\n  ,   punctuation = /[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E42\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDF3C-\\uDF3E]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]/\n  ,   expandedTab = \"    \" // CommonMark specifies tab as 4 spaces\n\n  function switchInline(stream, state, f) {\n    state.f = state.inline = f;\n    return f(stream, state);\n  }\n\n  function switchBlock(stream, state, f) {\n    state.f = state.block = f;\n    return f(stream, state);\n  }\n\n  function lineIsEmpty(line) {\n    return !line || !/\\S/.test(line.string)\n  }\n\n  // Blocks\n\n  function blankLine(state) {\n    // Reset linkTitle state\n    state.linkTitle = false;\n    state.linkHref = false;\n    state.linkText = false;\n    // Reset EM state\n    state.em = false;\n    // Reset STRONG state\n    state.strong = false;\n    // Reset strikethrough state\n    state.strikethrough = false;\n    // Reset state.quote\n    state.quote = 0;\n    // Reset state.indentedCode\n    state.indentedCode = false;\n    if (state.f == htmlBlock) {\n      var exit = htmlModeMissing\n      if (!exit) {\n        var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n        exit = inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n          (!inner.state.context && inner.state.tokenize.isInText)\n      }\n      if (exit) {\n        state.f = inlineNormal;\n        state.block = blockNormal;\n        state.htmlState = null;\n      }\n    }\n    // Reset state.trailingSpace\n    state.trailingSpace = 0;\n    state.trailingSpaceNewLine = false;\n    // Mark this line as blank\n    state.prevLine = state.thisLine\n    state.thisLine = {stream: null}\n    return null;\n  }\n\n  function blockNormal(stream, state) {\n    var firstTokenOnLine = stream.column() === state.indentation;\n    var prevLineLineIsEmpty = lineIsEmpty(state.prevLine.stream);\n    var prevLineIsIndentedCode = state.indentedCode;\n    var prevLineIsHr = state.prevLine.hr;\n    var prevLineIsList = state.list !== false;\n    var maxNonCodeIndentation = (state.listStack[state.listStack.length - 1] || 0) + 3;\n\n    state.indentedCode = false;\n\n    var lineIndentation = state.indentation;\n    // compute once per line (on first token)\n    if (state.indentationDiff === null) {\n      state.indentationDiff = state.indentation;\n      if (prevLineIsList) {\n        state.list = null;\n        // While this list item's marker's indentation is less than the deepest\n        //  list item's content's indentation,pop the deepest list item\n        //  indentation off the stack, and update block indentation state\n        while (lineIndentation < state.listStack[state.listStack.length - 1]) {\n          state.listStack.pop();\n          if (state.listStack.length) {\n            state.indentation = state.listStack[state.listStack.length - 1];\n          // less than the first list's indent -> the line is no longer a list\n          } else {\n            state.list = false;\n          }\n        }\n        if (state.list !== false) {\n          state.indentationDiff = lineIndentation - state.listStack[state.listStack.length - 1]\n        }\n      }\n    }\n\n    // not comprehensive (currently only for setext detection purposes)\n    var allowsInlineContinuation = (\n        !prevLineLineIsEmpty && !prevLineIsHr && !state.prevLine.header &&\n        (!prevLineIsList || !prevLineIsIndentedCode) &&\n        !state.prevLine.fencedCodeEnd\n    );\n\n    var isHr = (state.list === false || prevLineIsHr || prevLineLineIsEmpty) &&\n      state.indentation <= maxNonCodeIndentation && stream.match(hrRE);\n\n    var match = null;\n    if (state.indentationDiff >= 4 && (prevLineIsIndentedCode || state.prevLine.fencedCodeEnd ||\n         state.prevLine.header || prevLineLineIsEmpty)) {\n      stream.skipToEnd();\n      state.indentedCode = true;\n      return tokenTypes.code;\n    } else if (stream.eatSpace()) {\n      return null;\n    } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(atxHeaderRE)) && match[1].length <= 6) {\n      state.quote = 0;\n      state.header = match[1].length;\n      state.thisLine.header = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      state.f = state.inline;\n      return getType(state);\n    } else if (state.indentation <= maxNonCodeIndentation && stream.eat('>')) {\n      state.quote = firstTokenOnLine ? 1 : state.quote + 1;\n      if (modeCfg.highlightFormatting) state.formatting = \"quote\";\n      stream.eatSpace();\n      return getType(state);\n    } else if (!isHr && !state.setext && firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(listRE))) {\n      var listType = match[1] ? \"ol\" : \"ul\";\n\n      state.indentation = lineIndentation + stream.current().length;\n      state.list = true;\n      state.quote = 0;\n\n      // Add this list item's content's indentation to the stack\n      state.listStack.push(state.indentation);\n      // Reset inline styles which shouldn't propagate across list items\n      state.em = false;\n      state.strong = false;\n      state.code = false;\n      state.strikethrough = false;\n\n      if (modeCfg.taskLists && stream.match(taskListRE, false)) {\n        state.taskList = true;\n      }\n      state.f = state.inline;\n      if (modeCfg.highlightFormatting) state.formatting = [\"list\", \"list-\" + listType];\n      return getType(state);\n    } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(fencedCodeRE, true))) {\n      state.quote = 0;\n      state.fencedEndRE = new RegExp(match[1] + \"+ *$\");\n      // try switching mode\n      state.localMode = modeCfg.fencedCodeBlockHighlighting && getMode(match[2] || modeCfg.fencedCodeBlockDefaultMode );\n      if (state.localMode) state.localState = CodeMirror.startState(state.localMode);\n      state.f = state.block = local;\n      if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n      state.code = -1\n      return getType(state);\n    // SETEXT has lowest block-scope precedence after HR, so check it after\n    //  the others (code, blockquote, list...)\n    } else if (\n      // if setext set, indicates line after ---/===\n      state.setext || (\n        // line before ---/===\n        (!allowsInlineContinuation || !prevLineIsList) && !state.quote && state.list === false &&\n        !state.code && !isHr && !linkDefRE.test(stream.string) &&\n        (match = stream.lookAhead(1)) && (match = match.match(setextHeaderRE))\n      )\n    ) {\n      if ( !state.setext ) {\n        state.header = match[0].charAt(0) == '=' ? 1 : 2;\n        state.setext = state.header;\n      } else {\n        state.header = state.setext;\n        // has no effect on type so we can reset it now\n        state.setext = 0;\n        stream.skipToEnd();\n        if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      }\n      state.thisLine.header = true;\n      state.f = state.inline;\n      return getType(state);\n    } else if (isHr) {\n      stream.skipToEnd();\n      state.hr = true;\n      state.thisLine.hr = true;\n      return tokenTypes.hr;\n    } else if (stream.peek() === '[') {\n      return switchInline(stream, state, footnoteLink);\n    }\n\n    return switchInline(stream, state, state.inline);\n  }\n\n  function htmlBlock(stream, state) {\n    var style = htmlMode.token(stream, state.htmlState);\n    if (!htmlModeMissing) {\n      var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n      if ((inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n           (!inner.state.context && inner.state.tokenize.isInText)) ||\n          (state.md_inside && stream.current().indexOf(\">\") > -1)) {\n        state.f = inlineNormal;\n        state.block = blockNormal;\n        state.htmlState = null;\n      }\n    }\n    return style;\n  }\n\n  function local(stream, state) {\n    var currListInd = state.listStack[state.listStack.length - 1] || 0;\n    var hasExitedList = state.indentation < currListInd;\n    var maxFencedEndInd = currListInd + 3;\n    if (state.fencedEndRE && state.indentation <= maxFencedEndInd && (hasExitedList || stream.match(state.fencedEndRE))) {\n      if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n      var returnType;\n      if (!hasExitedList) returnType = getType(state)\n      state.localMode = state.localState = null;\n      state.block = blockNormal;\n      state.f = inlineNormal;\n      state.fencedEndRE = null;\n      state.code = 0\n      state.thisLine.fencedCodeEnd = true;\n      if (hasExitedList) return switchBlock(stream, state, state.block);\n      return returnType;\n    } else if (state.localMode) {\n      return state.localMode.token(stream, state.localState);\n    } else {\n      stream.skipToEnd();\n      return tokenTypes.code;\n    }\n  }\n\n  // Inline\n  function getType(state) {\n    var styles = [];\n\n    if (state.formatting) {\n      styles.push(tokenTypes.formatting);\n\n      if (typeof state.formatting === \"string\") state.formatting = [state.formatting];\n\n      for (var i = 0; i < state.formatting.length; i++) {\n        styles.push(tokenTypes.formatting + \"-\" + state.formatting[i]);\n\n        if (state.formatting[i] === \"header\") {\n          styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.header);\n        }\n\n        // Add `formatting-quote` and `formatting-quote-#` for blockquotes\n        // Add `error` instead if the maximum blockquote nesting depth is passed\n        if (state.formatting[i] === \"quote\") {\n          if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n            styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.quote);\n          } else {\n            styles.push(\"error\");\n          }\n        }\n      }\n    }\n\n    if (state.taskOpen) {\n      styles.push(\"meta\");\n      return styles.length ? styles.join(' ') : null;\n    }\n    if (state.taskClosed) {\n      styles.push(\"property\");\n      return styles.length ? styles.join(' ') : null;\n    }\n\n    if (state.linkHref) {\n      styles.push(tokenTypes.linkHref, \"url\");\n    } else { // Only apply inline styles to non-url text\n      if (state.strong) { styles.push(tokenTypes.strong); }\n      if (state.em) { styles.push(tokenTypes.em); }\n      if (state.strikethrough) { styles.push(tokenTypes.strikethrough); }\n      if (state.emoji) { styles.push(tokenTypes.emoji); }\n      if (state.linkText) { styles.push(tokenTypes.linkText); }\n      if (state.code) { styles.push(tokenTypes.code); }\n      if (state.image) { styles.push(tokenTypes.image); }\n      if (state.imageAltText) { styles.push(tokenTypes.imageAltText, \"link\"); }\n      if (state.imageMarker) { styles.push(tokenTypes.imageMarker); }\n    }\n\n    if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + \"-\" + state.header); }\n\n    if (state.quote) {\n      styles.push(tokenTypes.quote);\n\n      // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth\n      if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n        styles.push(tokenTypes.quote + \"-\" + state.quote);\n      } else {\n        styles.push(tokenTypes.quote + \"-\" + modeCfg.maxBlockquoteDepth);\n      }\n    }\n\n    if (state.list !== false) {\n      var listMod = (state.listStack.length - 1) % 3;\n      if (!listMod) {\n        styles.push(tokenTypes.list1);\n      } else if (listMod === 1) {\n        styles.push(tokenTypes.list2);\n      } else {\n        styles.push(tokenTypes.list3);\n      }\n    }\n\n    if (state.trailingSpaceNewLine) {\n      styles.push(\"trailing-space-new-line\");\n    } else if (state.trailingSpace) {\n      styles.push(\"trailing-space-\" + (state.trailingSpace % 2 ? \"a\" : \"b\"));\n    }\n\n    return styles.length ? styles.join(' ') : null;\n  }\n\n  function handleText(stream, state) {\n    if (stream.match(textRE, true)) {\n      return getType(state);\n    }\n    return undefined;\n  }\n\n  function inlineNormal(stream, state) {\n    var style = state.text(stream, state);\n    if (typeof style !== 'undefined')\n      return style;\n\n    if (state.list) { // List marker (*, +, -, 1., etc)\n      state.list = null;\n      return getType(state);\n    }\n\n    if (state.taskList) {\n      var taskOpen = stream.match(taskListRE, true)[1] === \" \";\n      if (taskOpen) state.taskOpen = true;\n      else state.taskClosed = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"task\";\n      state.taskList = false;\n      return getType(state);\n    }\n\n    state.taskOpen = false;\n    state.taskClosed = false;\n\n    if (state.header && stream.match(/^#+$/, true)) {\n      if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      return getType(state);\n    }\n\n    var ch = stream.next();\n\n    // Matches link titles present on next line\n    if (state.linkTitle) {\n      state.linkTitle = false;\n      var matchCh = ch;\n      if (ch === '(') {\n        matchCh = ')';\n      }\n      matchCh = (matchCh+'').replace(/([.?*+^\\[\\]\\\\(){}|-])/g, \"\\\\$1\");\n      var regex = '^\\\\s*(?:[^' + matchCh + '\\\\\\\\]+|\\\\\\\\\\\\\\\\|\\\\\\\\.)' + matchCh;\n      if (stream.match(new RegExp(regex), true)) {\n        return tokenTypes.linkHref;\n      }\n    }\n\n    // If this block is changed, it may need to be updated in GFM mode\n    if (ch === '`') {\n      var previousFormatting = state.formatting;\n      if (modeCfg.highlightFormatting) state.formatting = \"code\";\n      stream.eatWhile('`');\n      var count = stream.current().length\n      if (state.code == 0 && (!state.quote || count == 1)) {\n        state.code = count\n        return getType(state)\n      } else if (count == state.code) { // Must be exact\n        var t = getType(state)\n        state.code = 0\n        return t\n      } else {\n        state.formatting = previousFormatting\n        return getType(state)\n      }\n    } else if (state.code) {\n      return getType(state);\n    }\n\n    if (ch === '\\\\') {\n      stream.next();\n      if (modeCfg.highlightFormatting) {\n        var type = getType(state);\n        var formattingEscape = tokenTypes.formatting + \"-escape\";\n        return type ? type + \" \" + formattingEscape : formattingEscape;\n      }\n    }\n\n    if (ch === '!' && stream.match(/\\[[^\\]]*\\] ?(?:\\(|\\[)/, false)) {\n      state.imageMarker = true;\n      state.image = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      return getType(state);\n    }\n\n    if (ch === '[' && state.imageMarker && stream.match(/[^\\]]*\\](\\(.*?\\)| ?\\[.*?\\])/, false)) {\n      state.imageMarker = false;\n      state.imageAltText = true\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      return getType(state);\n    }\n\n    if (ch === ']' && state.imageAltText) {\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      var type = getType(state);\n      state.imageAltText = false;\n      state.image = false;\n      state.inline = state.f = linkHref;\n      return type;\n    }\n\n    if (ch === '[' && !state.image) {\n      if (state.linkText && stream.match(/^.*?\\]/)) return getType(state)\n      state.linkText = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      return getType(state);\n    }\n\n    if (ch === ']' && state.linkText) {\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      state.linkText = false;\n      state.inline = state.f = stream.match(/\\(.*?\\)| ?\\[.*?\\]/, false) ? linkHref : inlineNormal\n      return type;\n    }\n\n    if (ch === '<' && stream.match(/^(https?|ftps?):\\/\\/(?:[^\\\\>]|\\\\.)+>/, false)) {\n      state.f = state.inline = linkInline;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkInline;\n    }\n\n    if (ch === '<' && stream.match(/^[^> \\\\]+@(?:[^\\\\>]|\\\\.)+>/, false)) {\n      state.f = state.inline = linkInline;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkEmail;\n    }\n\n    if (modeCfg.xml && ch === '<' && stream.match(/^(!--|\\?|!\\[CDATA\\[|[a-z][a-z0-9-]*(?:\\s+[a-z_:.\\-]+(?:\\s*=\\s*[^>]+)?)*\\s*(?:>|$))/i, false)) {\n      var end = stream.string.indexOf(\">\", stream.pos);\n      if (end != -1) {\n        var atts = stream.string.substring(stream.start, end);\n        if (/markdown\\s*=\\s*('|\"){0,1}1('|\"){0,1}/.test(atts)) state.md_inside = true;\n      }\n      stream.backUp(1);\n      state.htmlState = CodeMirror.startState(htmlMode);\n      return switchBlock(stream, state, htmlBlock);\n    }\n\n    if (modeCfg.xml && ch === '<' && stream.match(/^\\/\\w*?>/)) {\n      state.md_inside = false;\n      return \"tag\";\n    } else if (ch === \"*\" || ch === \"_\") {\n      var len = 1, before = stream.pos == 1 ? \" \" : stream.string.charAt(stream.pos - 2)\n      while (len < 3 && stream.eat(ch)) len++\n      var after = stream.peek() || \" \"\n      // See http://spec.commonmark.org/0.27/#emphasis-and-strong-emphasis\n      var leftFlanking = !/\\s/.test(after) && (!punctuation.test(after) || /\\s/.test(before) || punctuation.test(before))\n      var rightFlanking = !/\\s/.test(before) && (!punctuation.test(before) || /\\s/.test(after) || punctuation.test(after))\n      var setEm = null, setStrong = null\n      if (len % 2) { // Em\n        if (!state.em && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n          setEm = true\n        else if (state.em == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n          setEm = false\n      }\n      if (len > 1) { // Strong\n        if (!state.strong && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n          setStrong = true\n        else if (state.strong == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n          setStrong = false\n      }\n      if (setStrong != null || setEm != null) {\n        if (modeCfg.highlightFormatting) state.formatting = setEm == null ? \"strong\" : setStrong == null ? \"em\" : \"strong em\"\n        if (setEm === true) state.em = ch\n        if (setStrong === true) state.strong = ch\n        var t = getType(state)\n        if (setEm === false) state.em = false\n        if (setStrong === false) state.strong = false\n        return t\n      }\n    } else if (ch === ' ') {\n      if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces\n        if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n          return getType(state);\n        } else { // Not surrounded by spaces, back up pointer\n          stream.backUp(1);\n        }\n      }\n    }\n\n    if (modeCfg.strikethrough) {\n      if (ch === '~' && stream.eatWhile(ch)) {\n        if (state.strikethrough) {// Remove strikethrough\n          if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n          var t = getType(state);\n          state.strikethrough = false;\n          return t;\n        } else if (stream.match(/^[^\\s]/, false)) {// Add strikethrough\n          state.strikethrough = true;\n          if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n          return getType(state);\n        }\n      } else if (ch === ' ') {\n        if (stream.match('~~', true)) { // Probably surrounded by space\n          if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n            return getType(state);\n          } else { // Not surrounded by spaces, back up pointer\n            stream.backUp(2);\n          }\n        }\n      }\n    }\n\n    if (modeCfg.emoji && ch === \":\" && stream.match(/^(?:[a-z_\\d+][a-z_\\d+-]*|\\-[a-z_\\d+][a-z_\\d+-]*):/)) {\n      state.emoji = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"emoji\";\n      var retType = getType(state);\n      state.emoji = false;\n      return retType;\n    }\n\n    if (ch === ' ') {\n      if (stream.match(/^ +$/, false)) {\n        state.trailingSpace++;\n      } else if (state.trailingSpace) {\n        state.trailingSpaceNewLine = true;\n      }\n    }\n\n    return getType(state);\n  }\n\n  function linkInline(stream, state) {\n    var ch = stream.next();\n\n    if (ch === \">\") {\n      state.f = state.inline = inlineNormal;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkInline;\n    }\n\n    stream.match(/^[^>]+/, true);\n\n    return tokenTypes.linkInline;\n  }\n\n  function linkHref(stream, state) {\n    // Check if space, and return NULL if so (to avoid marking the space)\n    if(stream.eatSpace()){\n      return null;\n    }\n    var ch = stream.next();\n    if (ch === '(' || ch === '[') {\n      state.f = state.inline = getLinkHrefInside(ch === \"(\" ? \")\" : \"]\");\n      if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n      state.linkHref = true;\n      return getType(state);\n    }\n    return 'error';\n  }\n\n  var linkRE = {\n    \")\": /^(?:[^\\\\\\(\\)]|\\\\.|\\((?:[^\\\\\\(\\)]|\\\\.)*\\))*?(?=\\))/,\n    \"]\": /^(?:[^\\\\\\[\\]]|\\\\.|\\[(?:[^\\\\\\[\\]]|\\\\.)*\\])*?(?=\\])/\n  }\n\n  function getLinkHrefInside(endChar) {\n    return function(stream, state) {\n      var ch = stream.next();\n\n      if (ch === endChar) {\n        state.f = state.inline = inlineNormal;\n        if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n        var returnState = getType(state);\n        state.linkHref = false;\n        return returnState;\n      }\n\n      stream.match(linkRE[endChar])\n      state.linkHref = true;\n      return getType(state);\n    };\n  }\n\n  function footnoteLink(stream, state) {\n    if (stream.match(/^([^\\]\\\\]|\\\\.)*\\]:/, false)) {\n      state.f = footnoteLinkInside;\n      stream.next(); // Consume [\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      state.linkText = true;\n      return getType(state);\n    }\n    return switchInline(stream, state, inlineNormal);\n  }\n\n  function footnoteLinkInside(stream, state) {\n    if (stream.match(']:', true)) {\n      state.f = state.inline = footnoteUrl;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var returnType = getType(state);\n      state.linkText = false;\n      return returnType;\n    }\n\n    stream.match(/^([^\\]\\\\]|\\\\.)+/, true);\n\n    return tokenTypes.linkText;\n  }\n\n  function footnoteUrl(stream, state) {\n    // Check if space, and return NULL if so (to avoid marking the space)\n    if(stream.eatSpace()){\n      return null;\n    }\n    // Match URL\n    stream.match(/^[^\\s]+/, true);\n    // Check for link title\n    if (stream.peek() === undefined) { // End of line, set flag to check next line\n      state.linkTitle = true;\n    } else { // More content on line, check if link title\n      stream.match(/^(?:\\s+(?:\"(?:[^\"\\\\]|\\\\.)+\"|'(?:[^'\\\\]|\\\\.)+'|\\((?:[^)\\\\]|\\\\.)+\\)))?/, true);\n    }\n    state.f = state.inline = inlineNormal;\n    return tokenTypes.linkHref + \" url\";\n  }\n\n  var mode = {\n    startState: function() {\n      return {\n        f: blockNormal,\n\n        prevLine: {stream: null},\n        thisLine: {stream: null},\n\n        block: blockNormal,\n        htmlState: null,\n        indentation: 0,\n\n        inline: inlineNormal,\n        text: handleText,\n\n        formatting: false,\n        linkText: false,\n        linkHref: false,\n        linkTitle: false,\n        code: 0,\n        em: false,\n        strong: false,\n        header: 0,\n        setext: 0,\n        hr: false,\n        taskList: false,\n        list: false,\n        listStack: [],\n        quote: 0,\n        trailingSpace: 0,\n        trailingSpaceNewLine: false,\n        strikethrough: false,\n        emoji: false,\n        fencedEndRE: null\n      };\n    },\n\n    copyState: function(s) {\n      return {\n        f: s.f,\n\n        prevLine: s.prevLine,\n        thisLine: s.thisLine,\n\n        block: s.block,\n        htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState),\n        indentation: s.indentation,\n\n        localMode: s.localMode,\n        localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null,\n\n        inline: s.inline,\n        text: s.text,\n        formatting: false,\n        linkText: s.linkText,\n        linkTitle: s.linkTitle,\n        linkHref: s.linkHref,\n        code: s.code,\n        em: s.em,\n        strong: s.strong,\n        strikethrough: s.strikethrough,\n        emoji: s.emoji,\n        header: s.header,\n        setext: s.setext,\n        hr: s.hr,\n        taskList: s.taskList,\n        list: s.list,\n        listStack: s.listStack.slice(0),\n        quote: s.quote,\n        indentedCode: s.indentedCode,\n        trailingSpace: s.trailingSpace,\n        trailingSpaceNewLine: s.trailingSpaceNewLine,\n        md_inside: s.md_inside,\n        fencedEndRE: s.fencedEndRE\n      };\n    },\n\n    token: function(stream, state) {\n\n      // Reset state.formatting\n      state.formatting = false;\n\n      if (stream != state.thisLine.stream) {\n        state.header = 0;\n        state.hr = false;\n\n        if (stream.match(/^\\s*$/, true)) {\n          blankLine(state);\n          return null;\n        }\n\n        state.prevLine = state.thisLine\n        state.thisLine = {stream: stream}\n\n        // Reset state.taskList\n        state.taskList = false;\n\n        // Reset state.trailingSpace\n        state.trailingSpace = 0;\n        state.trailingSpaceNewLine = false;\n\n        if (!state.localState) {\n          state.f = state.block;\n          if (state.f != htmlBlock) {\n            var indentation = stream.match(/^\\s*/, true)[0].replace(/\\t/g, expandedTab).length;\n            state.indentation = indentation;\n            state.indentationDiff = null;\n            if (indentation > 0) return null;\n          }\n        }\n      }\n      return state.f(stream, state);\n    },\n\n    innerMode: function(state) {\n      if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode};\n      if (state.localState) return {state: state.localState, mode: state.localMode};\n      return {state: state, mode: mode};\n    },\n\n    indent: function(state, textAfter, line) {\n      if (state.block == htmlBlock && htmlMode.indent) return htmlMode.indent(state.htmlState, textAfter, line)\n      if (state.localState && state.localMode.indent) return state.localMode.indent(state.localState, textAfter, line)\n      return CodeMirror.Pass\n    },\n\n    blankLine: blankLine,\n\n    getType: getType,\n\n    blockCommentStart: \"<!--\",\n    blockCommentEnd: \"-->\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n    fold: \"markdown\"\n  };\n  return mode;\n}, \"xml\");\n\nCodeMirror.defineMIME(\"text/markdown\", \"markdown\");\n\nCodeMirror.defineMIME(\"text/x-markdown\", \"markdown\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/mathematica/mathematica.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Mathematica mode copyright (c) 2015 by Calin Barbat\n// Based on code by Patrick Scheibe (halirutan)\n// See: https://github.com/halirutan/Mathematica-Source-Highlighting/tree/master/src/lang-mma.js\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('mathematica', function(_config, _parserConfig) {\n\n  // used pattern building blocks\n  var Identifier = '[a-zA-Z\\\\$][a-zA-Z0-9\\\\$]*';\n  var pBase      = \"(?:\\\\d+)\";\n  var pFloat     = \"(?:\\\\.\\\\d+|\\\\d+\\\\.\\\\d*|\\\\d+)\";\n  var pFloatBase = \"(?:\\\\.\\\\w+|\\\\w+\\\\.\\\\w*|\\\\w+)\";\n  var pPrecision = \"(?:`(?:`?\"+pFloat+\")?)\";\n\n  // regular expressions\n  var reBaseForm        = new RegExp('(?:'+pBase+'(?:\\\\^\\\\^'+pFloatBase+pPrecision+'?(?:\\\\*\\\\^[+-]?\\\\d+)?))');\n  var reFloatForm       = new RegExp('(?:' + pFloat + pPrecision + '?(?:\\\\*\\\\^[+-]?\\\\d+)?)');\n  var reIdInContext     = new RegExp('(?:`?)(?:' + Identifier + ')(?:`(?:' + Identifier + '))*(?:`?)');\n\n  function tokenBase(stream, state) {\n    var ch;\n\n    // get next character\n    ch = stream.next();\n\n    // string\n    if (ch === '\"') {\n      state.tokenize = tokenString;\n      return state.tokenize(stream, state);\n    }\n\n    // comment\n    if (ch === '(') {\n      if (stream.eat('*')) {\n        state.commentLevel++;\n        state.tokenize = tokenComment;\n        return state.tokenize(stream, state);\n      }\n    }\n\n    // go back one character\n    stream.backUp(1);\n\n    // look for numbers\n    // Numbers in a baseform\n    if (stream.match(reBaseForm, true, false)) {\n      return 'number';\n    }\n\n    // Mathematica numbers. Floats (1.2, .2, 1.) can have optionally a precision (`float) or an accuracy definition\n    // (``float). Note: while 1.2` is possible 1.2`` is not. At the end an exponent (float*^+12) can follow.\n    if (stream.match(reFloatForm, true, false)) {\n      return 'number';\n    }\n\n    /* In[23] and Out[34] */\n    if (stream.match(/(?:In|Out)\\[[0-9]*\\]/, true, false)) {\n      return 'atom';\n    }\n\n    // usage\n    if (stream.match(/([a-zA-Z\\$][a-zA-Z0-9\\$]*(?:`[a-zA-Z0-9\\$]+)*::usage)/, true, false)) {\n      return 'meta';\n    }\n\n    // message\n    if (stream.match(/([a-zA-Z\\$][a-zA-Z0-9\\$]*(?:`[a-zA-Z0-9\\$]+)*::[a-zA-Z\\$][a-zA-Z0-9\\$]*):?/, true, false)) {\n      return 'string-2';\n    }\n\n    // this makes a look-ahead match for something like variable:{_Integer}\n    // the match is then forwarded to the mma-patterns tokenizer.\n    if (stream.match(/([a-zA-Z\\$][a-zA-Z0-9\\$]*\\s*:)(?:(?:[a-zA-Z\\$][a-zA-Z0-9\\$]*)|(?:[^:=>~@\\^\\&\\*\\)\\[\\]'\\?,\\|])).*/, true, false)) {\n      return 'variable-2';\n    }\n\n    // catch variables which are used together with Blank (_), BlankSequence (__) or BlankNullSequence (___)\n    // Cannot start with a number, but can have numbers at any other position. Examples\n    // blub__Integer, a1_, b34_Integer32\n    if (stream.match(/[a-zA-Z\\$][a-zA-Z0-9\\$]*_+[a-zA-Z\\$][a-zA-Z0-9\\$]*/, true, false)) {\n      return 'variable-2';\n    }\n    if (stream.match(/[a-zA-Z\\$][a-zA-Z0-9\\$]*_+/, true, false)) {\n      return 'variable-2';\n    }\n    if (stream.match(/_+[a-zA-Z\\$][a-zA-Z0-9\\$]*/, true, false)) {\n      return 'variable-2';\n    }\n\n    // Named characters in Mathematica, like \\[Gamma].\n    if (stream.match(/\\\\\\[[a-zA-Z\\$][a-zA-Z0-9\\$]*\\]/, true, false)) {\n      return 'variable-3';\n    }\n\n    // Match all braces separately\n    if (stream.match(/(?:\\[|\\]|{|}|\\(|\\))/, true, false)) {\n      return 'bracket';\n    }\n\n    // Catch Slots (#, ##, #3, ##9 and the V10 named slots #name). I have never seen someone using more than one digit after #, so we match\n    // only one.\n    if (stream.match(/(?:#[a-zA-Z\\$][a-zA-Z0-9\\$]*|#+[0-9]?)/, true, false)) {\n      return 'variable-2';\n    }\n\n    // Literals like variables, keywords, functions\n    if (stream.match(reIdInContext, true, false)) {\n      return 'keyword';\n    }\n\n    // operators. Note that operators like @@ or /; are matched separately for each symbol.\n    if (stream.match(/(?:\\\\|\\+|\\-|\\*|\\/|,|;|\\.|:|@|~|=|>|<|&|\\||_|`|'|\\^|\\?|!|%)/, true, false)) {\n      return 'operator';\n    }\n\n    // everything else is an error\n    stream.next(); // advance the stream.\n    return 'error';\n  }\n\n  function tokenString(stream, state) {\n    var next, end = false, escaped = false;\n    while ((next = stream.next()) != null) {\n      if (next === '\"' && !escaped) {\n        end = true;\n        break;\n      }\n      escaped = !escaped && next === '\\\\';\n    }\n    if (end && !escaped) {\n      state.tokenize = tokenBase;\n    }\n    return 'string';\n  };\n\n  function tokenComment(stream, state) {\n    var prev, next;\n    while(state.commentLevel > 0 && (next = stream.next()) != null) {\n      if (prev === '(' && next === '*') state.commentLevel++;\n      if (prev === '*' && next === ')') state.commentLevel--;\n      prev = next;\n    }\n    if (state.commentLevel <= 0) {\n      state.tokenize = tokenBase;\n    }\n    return 'comment';\n  }\n\n  return {\n    startState: function() {return {tokenize: tokenBase, commentLevel: 0};},\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      return state.tokenize(stream, state);\n    },\n    blockCommentStart: \"(*\",\n    blockCommentEnd: \"*)\"\n  };\n});\n\nCodeMirror.defineMIME('text/x-mathematica', {\n  name: 'mathematica'\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/mbox/mbox.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar rfc2822 = [\n  \"From\", \"Sender\", \"Reply-To\", \"To\", \"Cc\", \"Bcc\", \"Message-ID\",\n  \"In-Reply-To\", \"References\", \"Resent-From\", \"Resent-Sender\", \"Resent-To\",\n  \"Resent-Cc\", \"Resent-Bcc\", \"Resent-Message-ID\", \"Return-Path\", \"Received\"\n];\nvar rfc2822NoEmail = [\n  \"Date\", \"Subject\", \"Comments\", \"Keywords\", \"Resent-Date\"\n];\n\nCodeMirror.registerHelper(\"hintWords\", \"mbox\", rfc2822.concat(rfc2822NoEmail));\n\nvar whitespace = /^[ \\t]/;\nvar separator = /^From /; // See RFC 4155\nvar rfc2822Header = new RegExp(\"^(\" + rfc2822.join(\"|\") + \"): \");\nvar rfc2822HeaderNoEmail = new RegExp(\"^(\" + rfc2822NoEmail.join(\"|\") + \"): \");\nvar header = /^[^:]+:/; // Optional fields defined in RFC 2822\nvar email = /^[^ ]+@[^ ]+/;\nvar untilEmail = /^.*?(?=[^ ]+?@[^ ]+)/;\nvar bracketedEmail = /^<.*?>/;\nvar untilBracketedEmail = /^.*?(?=<.*>)/;\n\nfunction styleForHeader(header) {\n  if (header === \"Subject\") return \"header\";\n  return \"string\";\n}\n\nfunction readToken(stream, state) {\n  if (stream.sol()) {\n    // From last line\n    state.inSeparator = false;\n    if (state.inHeader && stream.match(whitespace)) {\n      // Header folding\n      return null;\n    } else {\n      state.inHeader = false;\n      state.header = null;\n    }\n\n    if (stream.match(separator)) {\n      state.inHeaders = true;\n      state.inSeparator = true;\n      return \"atom\";\n    }\n\n    var match;\n    var emailPermitted = false;\n    if ((match = stream.match(rfc2822HeaderNoEmail)) ||\n        (emailPermitted = true) && (match = stream.match(rfc2822Header))) {\n      state.inHeaders = true;\n      state.inHeader = true;\n      state.emailPermitted = emailPermitted;\n      state.header = match[1];\n      return \"atom\";\n    }\n\n    // Use vim's heuristics: recognize custom headers only if the line is in a\n    // block of legitimate headers.\n    if (state.inHeaders && (match = stream.match(header))) {\n      state.inHeader = true;\n      state.emailPermitted = true;\n      state.header = match[1];\n      return \"atom\";\n    }\n\n    state.inHeaders = false;\n    stream.skipToEnd();\n    return null;\n  }\n\n  if (state.inSeparator) {\n    if (stream.match(email)) return \"link\";\n    if (stream.match(untilEmail)) return \"atom\";\n    stream.skipToEnd();\n    return \"atom\";\n  }\n\n  if (state.inHeader) {\n    var style = styleForHeader(state.header);\n\n    if (state.emailPermitted) {\n      if (stream.match(bracketedEmail)) return style + \" link\";\n      if (stream.match(untilBracketedEmail)) return style;\n    }\n    stream.skipToEnd();\n    return style;\n  }\n\n  stream.skipToEnd();\n  return null;\n};\n\nCodeMirror.defineMode(\"mbox\", function() {\n  return {\n    startState: function() {\n      return {\n        // Is in a mbox separator\n        inSeparator: false,\n        // Is in a mail header\n        inHeader: false,\n        // If bracketed email is permitted. Only applicable when inHeader\n        emailPermitted: false,\n        // Name of current header\n        header: null,\n        // Is in a region of mail headers\n        inHeaders: false\n      };\n    },\n    token: readToken,\n    blankLine: function(state) {\n      state.inHeaders = state.inSeparator = state.inHeader = false;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"application/mbox\", \"mbox\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/meta.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.modeInfo = [\n    {name: \"APL\", mime: \"text/apl\", mode: \"apl\", ext: [\"dyalog\", \"apl\"]},\n    {name: \"PGP\", mimes: [\"application/pgp\", \"application/pgp-encrypted\", \"application/pgp-keys\", \"application/pgp-signature\"], mode: \"asciiarmor\", ext: [\"asc\", \"pgp\", \"sig\"]},\n    {name: \"ASN.1\", mime: \"text/x-ttcn-asn\", mode: \"asn.1\", ext: [\"asn\", \"asn1\"]},\n    {name: \"Asterisk\", mime: \"text/x-asterisk\", mode: \"asterisk\", file: /^extensions\\.conf$/i},\n    {name: \"Brainfuck\", mime: \"text/x-brainfuck\", mode: \"brainfuck\", ext: [\"b\", \"bf\"]},\n    {name: \"C\", mime: \"text/x-csrc\", mode: \"clike\", ext: [\"c\", \"h\", \"ino\"]},\n    {name: \"C++\", mime: \"text/x-c++src\", mode: \"clike\", ext: [\"cpp\", \"c++\", \"cc\", \"cxx\", \"hpp\", \"h++\", \"hh\", \"hxx\"], alias: [\"cpp\"]},\n    {name: \"Cobol\", mime: \"text/x-cobol\", mode: \"cobol\", ext: [\"cob\", \"cpy\", \"cbl\"]},\n    {name: \"C#\", mime: \"text/x-csharp\", mode: \"clike\", ext: [\"cs\"], alias: [\"csharp\", \"cs\"]},\n    {name: \"Clojure\", mime: \"text/x-clojure\", mode: \"clojure\", ext: [\"clj\", \"cljc\", \"cljx\"]},\n    {name: \"ClojureScript\", mime: \"text/x-clojurescript\", mode: \"clojure\", ext: [\"cljs\"]},\n    {name: \"Closure Stylesheets (GSS)\", mime: \"text/x-gss\", mode: \"css\", ext: [\"gss\"]},\n    {name: \"CMake\", mime: \"text/x-cmake\", mode: \"cmake\", ext: [\"cmake\", \"cmake.in\"], file: /^CMakeLists\\.txt$/},\n    {name: \"CoffeeScript\", mimes: [\"application/vnd.coffeescript\", \"text/coffeescript\", \"text/x-coffeescript\"], mode: \"coffeescript\", ext: [\"coffee\"], alias: [\"coffee\", \"coffee-script\"]},\n    {name: \"Common Lisp\", mime: \"text/x-common-lisp\", mode: \"commonlisp\", ext: [\"cl\", \"lisp\", \"el\"], alias: [\"lisp\"]},\n    {name: \"Cypher\", mime: \"application/x-cypher-query\", mode: \"cypher\", ext: [\"cyp\", \"cypher\"]},\n    {name: \"Cython\", mime: \"text/x-cython\", mode: \"python\", ext: [\"pyx\", \"pxd\", \"pxi\"]},\n    {name: \"Crystal\", mime: \"text/x-crystal\", mode: \"crystal\", ext: [\"cr\"]},\n    {name: \"CSS\", mime: \"text/css\", mode: \"css\", ext: [\"css\"]},\n    {name: \"CQL\", mime: \"text/x-cassandra\", mode: \"sql\", ext: [\"cql\"]},\n    {name: \"D\", mime: \"text/x-d\", mode: \"d\", ext: [\"d\"]},\n    {name: \"Dart\", mimes: [\"application/dart\", \"text/x-dart\"], mode: \"dart\", ext: [\"dart\"]},\n    {name: \"diff\", mime: \"text/x-diff\", mode: \"diff\", ext: [\"diff\", \"patch\"]},\n    {name: \"Django\", mime: \"text/x-django\", mode: \"django\"},\n    {name: \"Dockerfile\", mime: \"text/x-dockerfile\", mode: \"dockerfile\", file: /^Dockerfile$/},\n    {name: \"DTD\", mime: \"application/xml-dtd\", mode: \"dtd\", ext: [\"dtd\"]},\n    {name: \"Dylan\", mime: \"text/x-dylan\", mode: \"dylan\", ext: [\"dylan\", \"dyl\", \"intr\"]},\n    {name: \"EBNF\", mime: \"text/x-ebnf\", mode: \"ebnf\"},\n    {name: \"ECL\", mime: \"text/x-ecl\", mode: \"ecl\", ext: [\"ecl\"]},\n    {name: \"edn\", mime: \"application/edn\", mode: \"clojure\", ext: [\"edn\"]},\n    {name: \"Eiffel\", mime: \"text/x-eiffel\", mode: \"eiffel\", ext: [\"e\"]},\n    {name: \"Elm\", mime: \"text/x-elm\", mode: \"elm\", ext: [\"elm\"]},\n    {name: \"Embedded JavaScript\", mime: \"application/x-ejs\", mode: \"htmlembedded\", ext: [\"ejs\"]},\n    {name: \"Embedded Ruby\", mime: \"application/x-erb\", mode: \"htmlembedded\", ext: [\"erb\"]},\n    {name: \"Erlang\", mime: \"text/x-erlang\", mode: \"erlang\", ext: [\"erl\"]},\n    {name: \"Esper\", mime: \"text/x-esper\", mode: \"sql\"},\n    {name: \"Factor\", mime: \"text/x-factor\", mode: \"factor\", ext: [\"factor\"]},\n    {name: \"FCL\", mime: \"text/x-fcl\", mode: \"fcl\"},\n    {name: \"Forth\", mime: \"text/x-forth\", mode: \"forth\", ext: [\"forth\", \"fth\", \"4th\"]},\n    {name: \"Fortran\", mime: \"text/x-fortran\", mode: \"fortran\", ext: [\"f\", \"for\", \"f77\", \"f90\", \"f95\"]},\n    {name: \"F#\", mime: \"text/x-fsharp\", mode: \"mllike\", ext: [\"fs\"], alias: [\"fsharp\"]},\n    {name: \"Gas\", mime: \"text/x-gas\", mode: \"gas\", ext: [\"s\"]},\n    {name: \"Gherkin\", mime: \"text/x-feature\", mode: \"gherkin\", ext: [\"feature\"]},\n    {name: \"GitHub Flavored Markdown\", mime: \"text/x-gfm\", mode: \"gfm\", file: /^(readme|contributing|history)\\.md$/i},\n    {name: \"Go\", mime: \"text/x-go\", mode: \"go\", ext: [\"go\"]},\n    {name: \"Groovy\", mime: \"text/x-groovy\", mode: \"groovy\", ext: [\"groovy\", \"gradle\"], file: /^Jenkinsfile$/},\n    {name: \"HAML\", mime: \"text/x-haml\", mode: \"haml\", ext: [\"haml\"]},\n    {name: \"Haskell\", mime: \"text/x-haskell\", mode: \"haskell\", ext: [\"hs\"]},\n    {name: \"Haskell (Literate)\", mime: \"text/x-literate-haskell\", mode: \"haskell-literate\", ext: [\"lhs\"]},\n    {name: \"Haxe\", mime: \"text/x-haxe\", mode: \"haxe\", ext: [\"hx\"]},\n    {name: \"HXML\", mime: \"text/x-hxml\", mode: \"haxe\", ext: [\"hxml\"]},\n    {name: \"ASP.NET\", mime: \"application/x-aspx\", mode: \"htmlembedded\", ext: [\"aspx\"], alias: [\"asp\", \"aspx\"]},\n    {name: \"HTML\", mime: \"text/html\", mode: \"htmlmixed\", ext: [\"html\", \"htm\", \"handlebars\", \"hbs\"], alias: [\"xhtml\"]},\n    {name: \"HTTP\", mime: \"message/http\", mode: \"http\"},\n    {name: \"IDL\", mime: \"text/x-idl\", mode: \"idl\", ext: [\"pro\"]},\n    {name: \"Pug\", mime: \"text/x-pug\", mode: \"pug\", ext: [\"jade\", \"pug\"], alias: [\"jade\"]},\n    {name: \"Java\", mime: \"text/x-java\", mode: \"clike\", ext: [\"java\"]},\n    {name: \"Java Server Pages\", mime: \"application/x-jsp\", mode: \"htmlembedded\", ext: [\"jsp\"], alias: [\"jsp\"]},\n    {name: \"JavaScript\", mimes: [\"text/javascript\", \"text/ecmascript\", \"application/javascript\", \"application/x-javascript\", \"application/ecmascript\"],\n     mode: \"javascript\", ext: [\"js\"], alias: [\"ecmascript\", \"js\", \"node\"]},\n    {name: \"JSON\", mimes: [\"application/json\", \"application/x-json\"], mode: \"javascript\", ext: [\"json\", \"map\"], alias: [\"json5\"]},\n    {name: \"JSON-LD\", mime: \"application/ld+json\", mode: \"javascript\", ext: [\"jsonld\"], alias: [\"jsonld\"]},\n    {name: \"JSX\", mime: \"text/jsx\", mode: \"jsx\", ext: [\"jsx\"]},\n    {name: \"Jinja2\", mime: \"text/jinja2\", mode: \"jinja2\", ext: [\"j2\", \"jinja\", \"jinja2\"]},\n    {name: \"Julia\", mime: \"text/x-julia\", mode: \"julia\", ext: [\"jl\"], alias: [\"jl\"]},\n    {name: \"Kotlin\", mime: \"text/x-kotlin\", mode: \"clike\", ext: [\"kt\"]},\n    {name: \"LESS\", mime: \"text/x-less\", mode: \"css\", ext: [\"less\"]},\n    {name: \"LiveScript\", mime: \"text/x-livescript\", mode: \"livescript\", ext: [\"ls\"], alias: [\"ls\"]},\n    {name: \"Lua\", mime: \"text/x-lua\", mode: \"lua\", ext: [\"lua\"]},\n    {name: \"Markdown\", mime: \"text/x-markdown\", mode: \"markdown\", ext: [\"markdown\", \"md\", \"mkd\"]},\n    {name: \"mIRC\", mime: \"text/mirc\", mode: \"mirc\"},\n    {name: \"MariaDB SQL\", mime: \"text/x-mariadb\", mode: \"sql\"},\n    {name: \"Mathematica\", mime: \"text/x-mathematica\", mode: \"mathematica\", ext: [\"m\", \"nb\", \"wl\", \"wls\"]},\n    {name: \"Modelica\", mime: \"text/x-modelica\", mode: \"modelica\", ext: [\"mo\"]},\n    {name: \"MUMPS\", mime: \"text/x-mumps\", mode: \"mumps\", ext: [\"mps\"]},\n    {name: \"MS SQL\", mime: \"text/x-mssql\", mode: \"sql\"},\n    {name: \"mbox\", mime: \"application/mbox\", mode: \"mbox\", ext: [\"mbox\"]},\n    {name: \"MySQL\", mime: \"text/x-mysql\", mode: \"sql\"},\n    {name: \"Nginx\", mime: \"text/x-nginx-conf\", mode: \"nginx\", file: /nginx.*\\.conf$/i},\n    {name: \"NSIS\", mime: \"text/x-nsis\", mode: \"nsis\", ext: [\"nsh\", \"nsi\"]},\n    {name: \"NTriples\", mimes: [\"application/n-triples\", \"application/n-quads\", \"text/n-triples\"],\n     mode: \"ntriples\", ext: [\"nt\", \"nq\"]},\n    {name: \"Objective-C\", mime: \"text/x-objectivec\", mode: \"clike\", ext: [\"m\"], alias: [\"objective-c\", \"objc\"]},\n    {name: \"Objective-C++\", mime: \"text/x-objectivec++\", mode: \"clike\", ext: [\"mm\"], alias: [\"objective-c++\", \"objc++\"]},\n    {name: \"OCaml\", mime: \"text/x-ocaml\", mode: \"mllike\", ext: [\"ml\", \"mli\", \"mll\", \"mly\"]},\n    {name: \"Octave\", mime: \"text/x-octave\", mode: \"octave\", ext: [\"m\"]},\n    {name: \"Oz\", mime: \"text/x-oz\", mode: \"oz\", ext: [\"oz\"]},\n    {name: \"Pascal\", mime: \"text/x-pascal\", mode: \"pascal\", ext: [\"p\", \"pas\"]},\n    {name: \"PEG.js\", mime: \"null\", mode: \"pegjs\", ext: [\"jsonld\"]},\n    {name: \"Perl\", mime: \"text/x-perl\", mode: \"perl\", ext: [\"pl\", \"pm\"]},\n    {name: \"PHP\", mimes: [\"text/x-php\", \"application/x-httpd-php\", \"application/x-httpd-php-open\"], mode: \"php\", ext: [\"php\", \"php3\", \"php4\", \"php5\", \"php7\", \"phtml\"]},\n    {name: \"Pig\", mime: \"text/x-pig\", mode: \"pig\", ext: [\"pig\"]},\n    {name: \"Plain Text\", mime: \"text/plain\", mode: \"null\", ext: [\"txt\", \"text\", \"conf\", \"def\", \"list\", \"log\"]},\n    {name: \"PLSQL\", mime: \"text/x-plsql\", mode: \"sql\", ext: [\"pls\"]},\n    {name: \"PostgreSQL\", mime: \"text/x-pgsql\", mode: \"sql\"},\n    {name: \"PowerShell\", mime: \"application/x-powershell\", mode: \"powershell\", ext: [\"ps1\", \"psd1\", \"psm1\"]},\n    {name: \"Properties files\", mime: \"text/x-properties\", mode: \"properties\", ext: [\"properties\", \"ini\", \"in\"], alias: [\"ini\", \"properties\"]},\n    {name: \"ProtoBuf\", mime: \"text/x-protobuf\", mode: \"protobuf\", ext: [\"proto\"]},\n    {name: \"Python\", mime: \"text/x-python\", mode: \"python\", ext: [\"BUILD\", \"bzl\", \"py\", \"pyw\"], file: /^(BUCK|BUILD)$/},\n    {name: \"Puppet\", mime: \"text/x-puppet\", mode: \"puppet\", ext: [\"pp\"]},\n    {name: \"Q\", mime: \"text/x-q\", mode: \"q\", ext: [\"q\"]},\n    {name: \"R\", mime: \"text/x-rsrc\", mode: \"r\", ext: [\"r\", \"R\"], alias: [\"rscript\"]},\n    {name: \"reStructuredText\", mime: \"text/x-rst\", mode: \"rst\", ext: [\"rst\"], alias: [\"rst\"]},\n    {name: \"RPM Changes\", mime: \"text/x-rpm-changes\", mode: \"rpm\"},\n    {name: \"RPM Spec\", mime: \"text/x-rpm-spec\", mode: \"rpm\", ext: [\"spec\"]},\n    {name: \"Ruby\", mime: \"text/x-ruby\", mode: \"ruby\", ext: [\"rb\"], alias: [\"jruby\", \"macruby\", \"rake\", \"rb\", \"rbx\"]},\n    {name: \"Rust\", mime: \"text/x-rustsrc\", mode: \"rust\", ext: [\"rs\"]},\n    {name: \"SAS\", mime: \"text/x-sas\", mode: \"sas\", ext: [\"sas\"]},\n    {name: \"Sass\", mime: \"text/x-sass\", mode: \"sass\", ext: [\"sass\"]},\n    {name: \"Scala\", mime: \"text/x-scala\", mode: \"clike\", ext: [\"scala\"]},\n    {name: \"Scheme\", mime: \"text/x-scheme\", mode: \"scheme\", ext: [\"scm\", \"ss\"]},\n    {name: \"SCSS\", mime: \"text/x-scss\", mode: \"css\", ext: [\"scss\"]},\n    {name: \"Shell\", mimes: [\"text/x-sh\", \"application/x-sh\"], mode: \"shell\", ext: [\"sh\", \"ksh\", \"bash\"], alias: [\"bash\", \"sh\", \"zsh\"], file: /^PKGBUILD$/},\n    {name: \"Sieve\", mime: \"application/sieve\", mode: \"sieve\", ext: [\"siv\", \"sieve\"]},\n    {name: \"Slim\", mimes: [\"text/x-slim\", \"application/x-slim\"], mode: \"slim\", ext: [\"slim\"]},\n    {name: \"Smalltalk\", mime: \"text/x-stsrc\", mode: \"smalltalk\", ext: [\"st\"]},\n    {name: \"Smarty\", mime: \"text/x-smarty\", mode: \"smarty\", ext: [\"tpl\"]},\n    {name: \"Solr\", mime: \"text/x-solr\", mode: \"solr\"},\n    {name: \"SML\", mime: \"text/x-sml\", mode: \"mllike\", ext: [\"sml\", \"sig\", \"fun\", \"smackspec\"]},\n    {name: \"Soy\", mime: \"text/x-soy\", mode: \"soy\", ext: [\"soy\"], alias: [\"closure template\"]},\n    {name: \"SPARQL\", mime: \"application/sparql-query\", mode: \"sparql\", ext: [\"rq\", \"sparql\"], alias: [\"sparul\"]},\n    {name: \"Spreadsheet\", mime: \"text/x-spreadsheet\", mode: \"spreadsheet\", alias: [\"excel\", \"formula\"]},\n    {name: \"SQL\", mime: \"text/x-sql\", mode: \"sql\", ext: [\"sql\"]},\n    {name: \"SQLite\", mime: \"text/x-sqlite\", mode: \"sql\"},\n    {name: \"Squirrel\", mime: \"text/x-squirrel\", mode: \"clike\", ext: [\"nut\"]},\n    {name: \"Stylus\", mime: \"text/x-styl\", mode: \"stylus\", ext: [\"styl\"]},\n    {name: \"Swift\", mime: \"text/x-swift\", mode: \"swift\", ext: [\"swift\"]},\n    {name: \"sTeX\", mime: \"text/x-stex\", mode: \"stex\"},\n    {name: \"LaTeX\", mime: \"text/x-latex\", mode: \"stex\", ext: [\"text\", \"ltx\", \"tex\"], alias: [\"tex\"]},\n    {name: \"SystemVerilog\", mime: \"text/x-systemverilog\", mode: \"verilog\", ext: [\"v\", \"sv\", \"svh\"]},\n    {name: \"Tcl\", mime: \"text/x-tcl\", mode: \"tcl\", ext: [\"tcl\"]},\n    {name: \"Textile\", mime: \"text/x-textile\", mode: \"textile\", ext: [\"textile\"]},\n    {name: \"TiddlyWiki\", mime: \"text/x-tiddlywiki\", mode: \"tiddlywiki\"},\n    {name: \"Tiki wiki\", mime: \"text/tiki\", mode: \"tiki\"},\n    {name: \"TOML\", mime: \"text/x-toml\", mode: \"toml\", ext: [\"toml\"]},\n    {name: \"Tornado\", mime: \"text/x-tornado\", mode: \"tornado\"},\n    {name: \"troff\", mime: \"text/troff\", mode: \"troff\", ext: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"]},\n    {name: \"TTCN\", mime: \"text/x-ttcn\", mode: \"ttcn\", ext: [\"ttcn\", \"ttcn3\", \"ttcnpp\"]},\n    {name: \"TTCN_CFG\", mime: \"text/x-ttcn-cfg\", mode: \"ttcn-cfg\", ext: [\"cfg\"]},\n    {name: \"Turtle\", mime: \"text/turtle\", mode: \"turtle\", ext: [\"ttl\"]},\n    {name: \"TypeScript\", mime: \"application/typescript\", mode: \"javascript\", ext: [\"ts\"], alias: [\"ts\"]},\n    {name: \"TypeScript-JSX\", mime: \"text/typescript-jsx\", mode: \"jsx\", ext: [\"tsx\"], alias: [\"tsx\"]},\n    {name: \"Twig\", mime: \"text/x-twig\", mode: \"twig\"},\n    {name: \"Web IDL\", mime: \"text/x-webidl\", mode: \"webidl\", ext: [\"webidl\"]},\n    {name: \"VB.NET\", mime: \"text/x-vb\", mode: \"vb\", ext: [\"vb\"]},\n    {name: \"VBScript\", mime: \"text/vbscript\", mode: \"vbscript\", ext: [\"vbs\"]},\n    {name: \"Velocity\", mime: \"text/velocity\", mode: \"velocity\", ext: [\"vtl\"]},\n    {name: \"Verilog\", mime: \"text/x-verilog\", mode: \"verilog\", ext: [\"v\"]},\n    {name: \"VHDL\", mime: \"text/x-vhdl\", mode: \"vhdl\", ext: [\"vhd\", \"vhdl\"]},\n    {name: \"Vue.js Component\", mimes: [\"script/x-vue\", \"text/x-vue\"], mode: \"vue\", ext: [\"vue\"]},\n    {name: \"XML\", mimes: [\"application/xml\", \"text/xml\"], mode: \"xml\", ext: [\"xml\", \"xsl\", \"xsd\", \"svg\"], alias: [\"rss\", \"wsdl\", \"xsd\"]},\n    {name: \"XQuery\", mime: \"application/xquery\", mode: \"xquery\", ext: [\"xy\", \"xquery\"]},\n    {name: \"Yacas\", mime: \"text/x-yacas\", mode: \"yacas\", ext: [\"ys\"]},\n    {name: \"YAML\", mimes: [\"text/x-yaml\", \"text/yaml\"], mode: \"yaml\", ext: [\"yaml\", \"yml\"], alias: [\"yml\"]},\n    {name: \"Z80\", mime: \"text/x-z80\", mode: \"z80\", ext: [\"z80\"]},\n    {name: \"mscgen\", mime: \"text/x-mscgen\", mode: \"mscgen\", ext: [\"mscgen\", \"mscin\", \"msc\"]},\n    {name: \"xu\", mime: \"text/x-xu\", mode: \"mscgen\", ext: [\"xu\"]},\n    {name: \"msgenny\", mime: \"text/x-msgenny\", mode: \"mscgen\", ext: [\"msgenny\"]},\n    {name: \"WebAssembly\", mime: \"text/webassembly\", mode: \"wast\", ext: [\"wat\", \"wast\"]},\n  ];\n  // Ensure all modes have a mime property for backwards compatibility\n  for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n    var info = CodeMirror.modeInfo[i];\n    if (info.mimes) info.mime = info.mimes[0];\n  }\n\n  CodeMirror.findModeByMIME = function(mime) {\n    mime = mime.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.mime == mime) return info;\n      if (info.mimes) for (var j = 0; j < info.mimes.length; j++)\n        if (info.mimes[j] == mime) return info;\n    }\n    if (/\\+xml$/.test(mime)) return CodeMirror.findModeByMIME(\"application/xml\")\n    if (/\\+json$/.test(mime)) return CodeMirror.findModeByMIME(\"application/json\")\n  };\n\n  CodeMirror.findModeByExtension = function(ext) {\n    ext = ext.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.ext) for (var j = 0; j < info.ext.length; j++)\n        if (info.ext[j] == ext) return info;\n    }\n  };\n\n  CodeMirror.findModeByFileName = function(filename) {\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.file && info.file.test(filename)) return info;\n    }\n    var dot = filename.lastIndexOf(\".\");\n    var ext = dot > -1 && filename.substring(dot + 1, filename.length);\n    if (ext) return CodeMirror.findModeByExtension(ext);\n  };\n\n  CodeMirror.findModeByName = function(name) {\n    name = name.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.name.toLowerCase() == name) return info;\n      if (info.alias) for (var j = 0; j < info.alias.length; j++)\n        if (info.alias[j].toLowerCase() == name) return info;\n    }\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/mirc/mirc.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n//mIRC mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMIME(\"text/mirc\", \"mirc\");\nCodeMirror.defineMode(\"mirc\", function() {\n  function parseWords(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  var specials = parseWords(\"$! $$ $& $? $+ $abook $abs $active $activecid \" +\n                            \"$activewid $address $addtok $agent $agentname $agentstat $agentver \" +\n                            \"$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime \" +\n                            \"$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind \" +\n                            \"$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes \" +\n                            \"$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color \" +\n                            \"$com $comcall $comchan $comerr $compact $compress $comval $cos $count \" +\n                            \"$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight \" +\n                            \"$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress \" +\n                            \"$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll \" +\n                            \"$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error \" +\n                            \"$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir \" +\n                            \"$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve \" +\n                            \"$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt \" +\n                            \"$group $halted $hash $height $hfind $hget $highlight $hnick $hotline \" +\n                            \"$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil \" +\n                            \"$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect \" +\n                            \"$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile \" +\n                            \"$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive \" +\n                            \"$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock \" +\n                            \"$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer \" +\n                            \"$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext \" +\n                            \"$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode \" +\n                            \"$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile \" +\n                            \"$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly \" +\n                            \"$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree \" +\n                            \"$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo \" +\n                            \"$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex \" +\n                            \"$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline \" +\n                            \"$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin \" +\n                            \"$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname \" +\n                            \"$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped \" +\n                            \"$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp \" +\n                            \"$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel \" +\n                            \"$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver \" +\n                            \"$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor\");\n  var keywords = parseWords(\"abook ajinvite alias aline ame amsg anick aop auser autojoin avoice \" +\n                            \"away background ban bcopy beep bread break breplace bset btrunc bunset bwrite \" +\n                            \"channel clear clearall cline clipboard close cnick color comclose comopen \" +\n                            \"comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver \" +\n                            \"debug dec describe dialog did didtok disable disconnect dlevel dline dll \" +\n                            \"dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace \" +\n                            \"drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable \" +\n                            \"events exit fclose filter findtext finger firewall flash flist flood flush \" +\n                            \"flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove \" +\n                            \"gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd \" +\n                            \"halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear \" +\n                            \"ialmark identd if ignore iline inc invite iuser join kick linesep links list \" +\n                            \"load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice \" +\n                            \"notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice \" +\n                            \"qme qmsg query queryn quit raw reload remini remote remove rename renwin \" +\n                            \"reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini \" +\n                            \"say scid scon server set showmirc signam sline sockaccept sockclose socklist \" +\n                            \"socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite \" +\n                            \"sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize \" +\n                            \"toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho \" +\n                            \"var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum \" +\n                            \"isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower \" +\n                            \"isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs \" +\n                            \"elseif else goto menu nicklist status title icon size option text edit \" +\n                            \"button check radio box scroll list combo link tab item\");\n  var functions = parseWords(\"if elseif else and not or eq ne in ni for foreach while switch\");\n  var isOperatorChar = /[+\\-*&%=<>!?^\\/\\|]/;\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n  function tokenBase(stream, state) {\n    var beforeParams = state.beforeParams;\n    state.beforeParams = false;\n    var ch = stream.next();\n    if (/[\\[\\]{}\\(\\),\\.]/.test(ch)) {\n      if (ch == \"(\" && beforeParams) state.inParams = true;\n      else if (ch == \")\") state.inParams = false;\n      return null;\n    }\n    else if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    else if (ch == \"\\\\\") {\n      stream.eat(\"\\\\\");\n      stream.eat(/./);\n      return \"number\";\n    }\n    else if (ch == \"/\" && stream.eat(\"*\")) {\n      return chain(stream, state, tokenComment);\n    }\n    else if (ch == \";\" && stream.match(/ *\\( *\\(/)) {\n      return chain(stream, state, tokenUnparsed);\n    }\n    else if (ch == \";\" && !state.inParams) {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    else if (ch == '\"') {\n      stream.eat(/\"/);\n      return \"keyword\";\n    }\n    else if (ch == \"$\") {\n      stream.eatWhile(/[$_a-z0-9A-Z\\.:]/);\n      if (specials && specials.propertyIsEnumerable(stream.current().toLowerCase())) {\n        return \"keyword\";\n      }\n      else {\n        state.beforeParams = true;\n        return \"builtin\";\n      }\n    }\n    else if (ch == \"%\") {\n      stream.eatWhile(/[^,\\s()]/);\n      state.beforeParams = true;\n      return \"string\";\n    }\n    else if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    else {\n      stream.eatWhile(/[\\w\\$_{}]/);\n      var word = stream.current().toLowerCase();\n      if (keywords && keywords.propertyIsEnumerable(word))\n        return \"keyword\";\n      if (functions && functions.propertyIsEnumerable(word)) {\n        state.beforeParams = true;\n        return \"keyword\";\n      }\n      return null;\n    }\n  }\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n  function tokenUnparsed(stream, state) {\n    var maybeEnd = 0, ch;\n    while (ch = stream.next()) {\n      if (ch == \";\" && maybeEnd == 2) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      if (ch == \")\")\n        maybeEnd++;\n      else if (ch != \" \")\n        maybeEnd = 0;\n    }\n    return \"meta\";\n  }\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        beforeParams: false,\n        inParams: false\n      };\n    },\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      return state.tokenize(stream, state);\n    }\n  };\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/mllike/mllike.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('mllike', function(_config, parserConfig) {\n  var words = {\n    'as': 'keyword',\n    'do': 'keyword',\n    'else': 'keyword',\n    'end': 'keyword',\n    'exception': 'keyword',\n    'fun': 'keyword',\n    'functor': 'keyword',\n    'if': 'keyword',\n    'in': 'keyword',\n    'include': 'keyword',\n    'let': 'keyword',\n    'of': 'keyword',\n    'open': 'keyword',\n    'rec': 'keyword',\n    'struct': 'keyword',\n    'then': 'keyword',\n    'type': 'keyword',\n    'val': 'keyword',\n    'while': 'keyword',\n    'with': 'keyword'\n  };\n\n  var extraWords = parserConfig.extraWords || {};\n  for (var prop in extraWords) {\n    if (extraWords.hasOwnProperty(prop)) {\n      words[prop] = parserConfig.extraWords[prop];\n    }\n  }\n  var hintWords = [];\n  for (var k in words) { hintWords.push(k); }\n  CodeMirror.registerHelper(\"hintWords\", \"mllike\", hintWords);\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n\n    if (ch === '\"') {\n      state.tokenize = tokenString;\n      return state.tokenize(stream, state);\n    }\n    if (ch === '{') {\n      if (stream.eat('|')) {\n        state.longString = true;\n        state.tokenize = tokenLongString;\n        return state.tokenize(stream, state);\n      }\n    }\n    if (ch === '(') {\n      if (stream.match(/^\\*(?!\\))/)) {\n        state.commentLevel++;\n        state.tokenize = tokenComment;\n        return state.tokenize(stream, state);\n      }\n    }\n    if (ch === '~' || ch === '?') {\n      stream.eatWhile(/\\w/);\n      return 'variable-2';\n    }\n    if (ch === '`') {\n      stream.eatWhile(/\\w/);\n      return 'quote';\n    }\n    if (ch === '/' && parserConfig.slashComments && stream.eat('/')) {\n      stream.skipToEnd();\n      return 'comment';\n    }\n    if (/\\d/.test(ch)) {\n      if (ch === '0' && stream.eat(/[bB]/)) {\n        stream.eatWhile(/[01]/);\n      } if (ch === '0' && stream.eat(/[xX]/)) {\n        stream.eatWhile(/[0-9a-fA-F]/)\n      } if (ch === '0' && stream.eat(/[oO]/)) {\n        stream.eatWhile(/[0-7]/);\n      } else {\n        stream.eatWhile(/[\\d_]/);\n        if (stream.eat('.')) {\n          stream.eatWhile(/[\\d]/);\n        }\n        if (stream.eat(/[eE]/)) {\n          stream.eatWhile(/[\\d\\-+]/);\n        }\n      }\n      return 'number';\n    }\n    if ( /[+\\-*&%=<>!?|@\\.~:]/.test(ch)) {\n      return 'operator';\n    }\n    if (/[\\w\\xa1-\\uffff]/.test(ch)) {\n      stream.eatWhile(/[\\w\\xa1-\\uffff]/);\n      var cur = stream.current();\n      return words.hasOwnProperty(cur) ? words[cur] : 'variable';\n    }\n    return null\n  }\n\n  function tokenString(stream, state) {\n    var next, end = false, escaped = false;\n    while ((next = stream.next()) != null) {\n      if (next === '\"' && !escaped) {\n        end = true;\n        break;\n      }\n      escaped = !escaped && next === '\\\\';\n    }\n    if (end && !escaped) {\n      state.tokenize = tokenBase;\n    }\n    return 'string';\n  };\n\n  function tokenComment(stream, state) {\n    var prev, next;\n    while(state.commentLevel > 0 && (next = stream.next()) != null) {\n      if (prev === '(' && next === '*') state.commentLevel++;\n      if (prev === '*' && next === ')') state.commentLevel--;\n      prev = next;\n    }\n    if (state.commentLevel <= 0) {\n      state.tokenize = tokenBase;\n    }\n    return 'comment';\n  }\n\n  function tokenLongString(stream, state) {\n    var prev, next;\n    while (state.longString && (next = stream.next()) != null) {\n      if (prev === '|' && next === '}') state.longString = false;\n      prev = next;\n    }\n    if (!state.longString) {\n      state.tokenize = tokenBase;\n    }\n    return 'string';\n  }\n\n  return {\n    startState: function() {return {tokenize: tokenBase, commentLevel: 0, longString: false};},\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      return state.tokenize(stream, state);\n    },\n\n    blockCommentStart: \"(*\",\n    blockCommentEnd: \"*)\",\n    lineComment: parserConfig.slashComments ? \"//\" : null\n  };\n});\n\nCodeMirror.defineMIME('text/x-ocaml', {\n  name: 'mllike',\n  extraWords: {\n    'and': 'keyword',\n    'assert': 'keyword',\n    'begin': 'keyword',\n    'class': 'keyword',\n    'constraint': 'keyword',\n    'done': 'keyword',\n    'downto': 'keyword',\n    'external': 'keyword',\n    'function': 'keyword',\n    'initializer': 'keyword',\n    'lazy': 'keyword',\n    'match': 'keyword',\n    'method': 'keyword',\n    'module': 'keyword',\n    'mutable': 'keyword',\n    'new': 'keyword',\n    'nonrec': 'keyword',\n    'object': 'keyword',\n    'private': 'keyword',\n    'sig': 'keyword',\n    'to': 'keyword',\n    'try': 'keyword',\n    'value': 'keyword',\n    'virtual': 'keyword',\n    'when': 'keyword',\n\n    // builtins\n    'raise': 'builtin',\n    'failwith': 'builtin',\n    'true': 'builtin',\n    'false': 'builtin',\n\n    // Pervasives builtins\n    'asr': 'builtin',\n    'land': 'builtin',\n    'lor': 'builtin',\n    'lsl': 'builtin',\n    'lsr': 'builtin',\n    'lxor': 'builtin',\n    'mod': 'builtin',\n    'or': 'builtin',\n\n    // More Pervasives\n    'raise_notrace': 'builtin',\n    'trace': 'builtin',\n    'exit': 'builtin',\n    'print_string': 'builtin',\n    'print_endline': 'builtin',\n\n     'int': 'type',\n     'float': 'type',\n     'bool': 'type',\n     'char': 'type',\n     'string': 'type',\n     'unit': 'type',\n\n     // Modules\n     'List': 'builtin'\n  }\n});\n\nCodeMirror.defineMIME('text/x-fsharp', {\n  name: 'mllike',\n  extraWords: {\n    'abstract': 'keyword',\n    'assert': 'keyword',\n    'base': 'keyword',\n    'begin': 'keyword',\n    'class': 'keyword',\n    'default': 'keyword',\n    'delegate': 'keyword',\n    'do!': 'keyword',\n    'done': 'keyword',\n    'downcast': 'keyword',\n    'downto': 'keyword',\n    'elif': 'keyword',\n    'extern': 'keyword',\n    'finally': 'keyword',\n    'for': 'keyword',\n    'function': 'keyword',\n    'global': 'keyword',\n    'inherit': 'keyword',\n    'inline': 'keyword',\n    'interface': 'keyword',\n    'internal': 'keyword',\n    'lazy': 'keyword',\n    'let!': 'keyword',\n    'match': 'keyword',\n    'member': 'keyword',\n    'module': 'keyword',\n    'mutable': 'keyword',\n    'namespace': 'keyword',\n    'new': 'keyword',\n    'null': 'keyword',\n    'override': 'keyword',\n    'private': 'keyword',\n    'public': 'keyword',\n    'return!': 'keyword',\n    'return': 'keyword',\n    'select': 'keyword',\n    'static': 'keyword',\n    'to': 'keyword',\n    'try': 'keyword',\n    'upcast': 'keyword',\n    'use!': 'keyword',\n    'use': 'keyword',\n    'void': 'keyword',\n    'when': 'keyword',\n    'yield!': 'keyword',\n    'yield': 'keyword',\n\n    // Reserved words\n    'atomic': 'keyword',\n    'break': 'keyword',\n    'checked': 'keyword',\n    'component': 'keyword',\n    'const': 'keyword',\n    'constraint': 'keyword',\n    'constructor': 'keyword',\n    'continue': 'keyword',\n    'eager': 'keyword',\n    'event': 'keyword',\n    'external': 'keyword',\n    'fixed': 'keyword',\n    'method': 'keyword',\n    'mixin': 'keyword',\n    'object': 'keyword',\n    'parallel': 'keyword',\n    'process': 'keyword',\n    'protected': 'keyword',\n    'pure': 'keyword',\n    'sealed': 'keyword',\n    'tailcall': 'keyword',\n    'trait': 'keyword',\n    'virtual': 'keyword',\n    'volatile': 'keyword',\n\n    // builtins\n    'List': 'builtin',\n    'Seq': 'builtin',\n    'Map': 'builtin',\n    'Set': 'builtin',\n    'Option': 'builtin',\n    'int': 'builtin',\n    'string': 'builtin',\n    'not': 'builtin',\n    'true': 'builtin',\n    'false': 'builtin',\n\n    'raise': 'builtin',\n    'failwith': 'builtin'\n  },\n  slashComments: true\n});\n\n\nCodeMirror.defineMIME('text/x-sml', {\n  name: 'mllike',\n  extraWords: {\n    'abstype': 'keyword',\n    'and': 'keyword',\n    'andalso': 'keyword',\n    'case': 'keyword',\n    'datatype': 'keyword',\n    'fn': 'keyword',\n    'handle': 'keyword',\n    'infix': 'keyword',\n    'infixr': 'keyword',\n    'local': 'keyword',\n    'nonfix': 'keyword',\n    'op': 'keyword',\n    'orelse': 'keyword',\n    'raise': 'keyword',\n    'withtype': 'keyword',\n    'eqtype': 'keyword',\n    'sharing': 'keyword',\n    'sig': 'keyword',\n    'signature': 'keyword',\n    'structure': 'keyword',\n    'where': 'keyword',\n    'true': 'keyword',\n    'false': 'keyword',\n\n    // types\n    'int': 'builtin',\n    'real': 'builtin',\n    'string': 'builtin',\n    'char': 'builtin',\n    'bool': 'builtin'\n  },\n  slashComments: true\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/modelica/modelica.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Modelica support for CodeMirror, copyright (c) by Lennart Ochel\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})\n\n(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"modelica\", function(config, parserConfig) {\n\n    var indentUnit = config.indentUnit;\n    var keywords = parserConfig.keywords || {};\n    var builtin = parserConfig.builtin || {};\n    var atoms = parserConfig.atoms || {};\n\n    var isSingleOperatorChar = /[;=\\(:\\),{}.*<>+\\-\\/^\\[\\]]/;\n    var isDoubleOperatorChar = /(:=|<=|>=|==|<>|\\.\\+|\\.\\-|\\.\\*|\\.\\/|\\.\\^)/;\n    var isDigit = /[0-9]/;\n    var isNonDigit = /[_a-zA-Z]/;\n\n    function tokenLineComment(stream, state) {\n      stream.skipToEnd();\n      state.tokenize = null;\n      return \"comment\";\n    }\n\n    function tokenBlockComment(stream, state) {\n      var maybeEnd = false, ch;\n      while (ch = stream.next()) {\n        if (maybeEnd && ch == \"/\") {\n          state.tokenize = null;\n          break;\n        }\n        maybeEnd = (ch == \"*\");\n      }\n      return \"comment\";\n    }\n\n    function tokenString(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == '\"' && !escaped) {\n          state.tokenize = null;\n          state.sol = false;\n          break;\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n\n      return \"string\";\n    }\n\n    function tokenIdent(stream, state) {\n      stream.eatWhile(isDigit);\n      while (stream.eat(isDigit) || stream.eat(isNonDigit)) { }\n\n\n      var cur = stream.current();\n\n      if(state.sol && (cur == \"package\" || cur == \"model\" || cur == \"when\" || cur == \"connector\")) state.level++;\n      else if(state.sol && cur == \"end\" && state.level > 0) state.level--;\n\n      state.tokenize = null;\n      state.sol = false;\n\n      if (keywords.propertyIsEnumerable(cur)) return \"keyword\";\n      else if (builtin.propertyIsEnumerable(cur)) return \"builtin\";\n      else if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n      else return \"variable\";\n    }\n\n    function tokenQIdent(stream, state) {\n      while (stream.eat(/[^']/)) { }\n\n      state.tokenize = null;\n      state.sol = false;\n\n      if(stream.eat(\"'\"))\n        return \"variable\";\n      else\n        return \"error\";\n    }\n\n    function tokenUnsignedNumber(stream, state) {\n      stream.eatWhile(isDigit);\n      if (stream.eat('.')) {\n        stream.eatWhile(isDigit);\n      }\n      if (stream.eat('e') || stream.eat('E')) {\n        if (!stream.eat('-'))\n          stream.eat('+');\n        stream.eatWhile(isDigit);\n      }\n\n      state.tokenize = null;\n      state.sol = false;\n      return \"number\";\n    }\n\n    // Interface\n    return {\n      startState: function() {\n        return {\n          tokenize: null,\n          level: 0,\n          sol: true\n        };\n      },\n\n      token: function(stream, state) {\n        if(state.tokenize != null) {\n          return state.tokenize(stream, state);\n        }\n\n        if(stream.sol()) {\n          state.sol = true;\n        }\n\n        // WHITESPACE\n        if(stream.eatSpace()) {\n          state.tokenize = null;\n          return null;\n        }\n\n        var ch = stream.next();\n\n        // LINECOMMENT\n        if(ch == '/' && stream.eat('/')) {\n          state.tokenize = tokenLineComment;\n        }\n        // BLOCKCOMMENT\n        else if(ch == '/' && stream.eat('*')) {\n          state.tokenize = tokenBlockComment;\n        }\n        // TWO SYMBOL TOKENS\n        else if(isDoubleOperatorChar.test(ch+stream.peek())) {\n          stream.next();\n          state.tokenize = null;\n          return \"operator\";\n        }\n        // SINGLE SYMBOL TOKENS\n        else if(isSingleOperatorChar.test(ch)) {\n          state.tokenize = null;\n          return \"operator\";\n        }\n        // IDENT\n        else if(isNonDigit.test(ch)) {\n          state.tokenize = tokenIdent;\n        }\n        // Q-IDENT\n        else if(ch == \"'\" && stream.peek() && stream.peek() != \"'\") {\n          state.tokenize = tokenQIdent;\n        }\n        // STRING\n        else if(ch == '\"') {\n          state.tokenize = tokenString;\n        }\n        // UNSIGNED_NUMBER\n        else if(isDigit.test(ch)) {\n          state.tokenize = tokenUnsignedNumber;\n        }\n        // ERROR\n        else {\n          state.tokenize = null;\n          return \"error\";\n        }\n\n        return state.tokenize(stream, state);\n      },\n\n      indent: function(state, textAfter) {\n        if (state.tokenize != null) return CodeMirror.Pass;\n\n        var level = state.level;\n        if(/(algorithm)/.test(textAfter)) level--;\n        if(/(equation)/.test(textAfter)) level--;\n        if(/(initial algorithm)/.test(textAfter)) level--;\n        if(/(initial equation)/.test(textAfter)) level--;\n        if(/(end)/.test(textAfter)) level--;\n\n        if(level > 0)\n          return indentUnit*level;\n        else\n          return 0;\n      },\n\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      lineComment: \"//\"\n    };\n  });\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i=0; i<words.length; ++i)\n      obj[words[i]] = true;\n    return obj;\n  }\n\n  var modelicaKeywords = \"algorithm and annotation assert block break class connect connector constant constrainedby der discrete each else elseif elsewhen encapsulated end enumeration equation expandable extends external false final flow for function if import impure in initial inner input loop model not operator or outer output package parameter partial protected public pure record redeclare replaceable return stream then true type when while within\";\n  var modelicaBuiltin = \"abs acos actualStream asin atan atan2 cardinality ceil cos cosh delay div edge exp floor getInstanceName homotopy inStream integer log log10 mod pre reinit rem semiLinear sign sin sinh spatialDistribution sqrt tan tanh\";\n  var modelicaAtoms = \"Real Boolean Integer String\";\n\n  function def(mimes, mode) {\n    if (typeof mimes == \"string\")\n      mimes = [mimes];\n\n    var words = [];\n\n    function add(obj) {\n      if (obj)\n        for (var prop in obj)\n          if (obj.hasOwnProperty(prop))\n            words.push(prop);\n    }\n\n    add(mode.keywords);\n    add(mode.builtin);\n    add(mode.atoms);\n\n    if (words.length) {\n      mode.helperType = mimes[0];\n      CodeMirror.registerHelper(\"hintWords\", mimes[0], words);\n    }\n\n    for (var i=0; i<mimes.length; ++i)\n      CodeMirror.defineMIME(mimes[i], mode);\n  }\n\n  def([\"text/x-modelica\"], {\n    name: \"modelica\",\n    keywords: words(modelicaKeywords),\n    builtin: words(modelicaBuiltin),\n    atoms: words(modelicaAtoms)\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/mscgen/mscgen.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// mode(s) for the sequence chart dsl's mscgen, xù and msgenny\n// For more information on mscgen, see the site of the original author:\n// http://www.mcternan.me.uk/mscgen\n//\n// This mode for mscgen and the two derivative languages were\n// originally made for use in the mscgen_js interpreter\n// (https://sverweij.github.io/mscgen_js)\n\n(function(mod) {\n  if ( typeof exports == \"object\" && typeof module == \"object\")// CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if ( typeof define == \"function\" && define.amd)// AMD\n    define([\"../../lib/codemirror\"], mod);\n  else// Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var languages = {\n    mscgen: {\n      \"keywords\" : [\"msc\"],\n      \"options\" : [\"hscale\", \"width\", \"arcgradient\", \"wordwraparcs\"],\n      \"constants\" : [\"true\", \"false\", \"on\", \"off\"],\n      \"attributes\" : [\"label\", \"idurl\", \"id\", \"url\", \"linecolor\", \"linecolour\", \"textcolor\", \"textcolour\", \"textbgcolor\", \"textbgcolour\", \"arclinecolor\", \"arclinecolour\", \"arctextcolor\", \"arctextcolour\", \"arctextbgcolor\", \"arctextbgcolour\", \"arcskip\"],\n      \"brackets\" : [\"\\\\{\", \"\\\\}\"], // [ and  ] are brackets too, but these get handled in with lists\n      \"arcsWords\" : [\"note\", \"abox\", \"rbox\", \"box\"],\n      \"arcsOthers\" : [\"\\\\|\\\\|\\\\|\", \"\\\\.\\\\.\\\\.\", \"---\", \"--\", \"<->\", \"==\", \"<<=>>\", \"<=>\", \"\\\\.\\\\.\", \"<<>>\", \"::\", \"<:>\", \"->\", \"=>>\", \"=>\", \">>\", \":>\", \"<-\", \"<<=\", \"<=\", \"<<\", \"<:\", \"x-\", \"-x\"],\n      \"singlecomment\" : [\"//\", \"#\"],\n      \"operators\" : [\"=\"]\n    },\n    xu: {\n      \"keywords\" : [\"msc\", \"xu\"],\n      \"options\" : [\"hscale\", \"width\", \"arcgradient\", \"wordwraparcs\", \"wordwrapentities\", \"watermark\"],\n      \"constants\" : [\"true\", \"false\", \"on\", \"off\", \"auto\"],\n      \"attributes\" : [\"label\", \"idurl\", \"id\", \"url\", \"linecolor\", \"linecolour\", \"textcolor\", \"textcolour\", \"textbgcolor\", \"textbgcolour\", \"arclinecolor\", \"arclinecolour\", \"arctextcolor\", \"arctextcolour\", \"arctextbgcolor\", \"arctextbgcolour\", \"arcskip\", \"title\", \"deactivate\", \"activate\", \"activation\"],\n      \"brackets\" : [\"\\\\{\", \"\\\\}\"],  // [ and  ] are brackets too, but these get handled in with lists\n      \"arcsWords\" : [\"note\", \"abox\", \"rbox\", \"box\", \"alt\", \"else\", \"opt\", \"break\", \"par\", \"seq\", \"strict\", \"neg\", \"critical\", \"ignore\", \"consider\", \"assert\", \"loop\", \"ref\", \"exc\"],\n      \"arcsOthers\" : [\"\\\\|\\\\|\\\\|\", \"\\\\.\\\\.\\\\.\", \"---\", \"--\", \"<->\", \"==\", \"<<=>>\", \"<=>\", \"\\\\.\\\\.\", \"<<>>\", \"::\", \"<:>\", \"->\", \"=>>\", \"=>\", \">>\", \":>\", \"<-\", \"<<=\", \"<=\", \"<<\", \"<:\", \"x-\", \"-x\"],\n      \"singlecomment\" : [\"//\", \"#\"],\n      \"operators\" : [\"=\"]\n    },\n    msgenny: {\n      \"keywords\" : null,\n      \"options\" : [\"hscale\", \"width\", \"arcgradient\", \"wordwraparcs\", \"wordwrapentities\", \"watermark\"],\n      \"constants\" : [\"true\", \"false\", \"on\", \"off\", \"auto\"],\n      \"attributes\" : null,\n      \"brackets\" : [\"\\\\{\", \"\\\\}\"],\n      \"arcsWords\" : [\"note\", \"abox\", \"rbox\", \"box\", \"alt\", \"else\", \"opt\", \"break\", \"par\", \"seq\", \"strict\", \"neg\", \"critical\", \"ignore\", \"consider\", \"assert\", \"loop\", \"ref\", \"exc\"],\n      \"arcsOthers\" : [\"\\\\|\\\\|\\\\|\", \"\\\\.\\\\.\\\\.\", \"---\", \"--\", \"<->\", \"==\", \"<<=>>\", \"<=>\", \"\\\\.\\\\.\", \"<<>>\", \"::\", \"<:>\", \"->\", \"=>>\", \"=>\", \">>\", \":>\", \"<-\", \"<<=\", \"<=\", \"<<\", \"<:\", \"x-\", \"-x\"],\n      \"singlecomment\" : [\"//\", \"#\"],\n      \"operators\" : [\"=\"]\n    }\n  }\n\n  CodeMirror.defineMode(\"mscgen\", function(_, modeConfig) {\n    var language = languages[modeConfig && modeConfig.language || \"mscgen\"]\n    return {\n      startState: startStateFn,\n      copyState: copyStateFn,\n      token: produceTokenFunction(language),\n      lineComment : \"#\",\n      blockCommentStart : \"/*\",\n      blockCommentEnd : \"*/\"\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-mscgen\", \"mscgen\");\n  CodeMirror.defineMIME(\"text/x-xu\", {name: \"mscgen\", language: \"xu\"});\n  CodeMirror.defineMIME(\"text/x-msgenny\", {name: \"mscgen\", language: \"msgenny\"});\n\n  function wordRegexpBoundary(pWords) {\n    return new RegExp(\"^\\\\b(?:\" + pWords.join(\"|\") + \")\\\\b\", \"i\");\n  }\n\n  function wordRegexp(pWords) {\n    return new RegExp(\"^(?:\" + pWords.join(\"|\") + \")\", \"i\");\n  }\n\n  function startStateFn() {\n    return {\n      inComment : false,\n      inString : false,\n      inAttributeList : false,\n      inScript : false\n    };\n  }\n\n  function copyStateFn(pState) {\n    return {\n      inComment : pState.inComment,\n      inString : pState.inString,\n      inAttributeList : pState.inAttributeList,\n      inScript : pState.inScript\n    };\n  }\n\n  function produceTokenFunction(pConfig) {\n\n    return function(pStream, pState) {\n      if (pStream.match(wordRegexp(pConfig.brackets), true, true)) {\n        return \"bracket\";\n      }\n      /* comments */\n      if (!pState.inComment) {\n        if (pStream.match(/\\/\\*[^\\*\\/]*/, true, true)) {\n          pState.inComment = true;\n          return \"comment\";\n        }\n        if (pStream.match(wordRegexp(pConfig.singlecomment), true, true)) {\n          pStream.skipToEnd();\n          return \"comment\";\n        }\n      }\n      if (pState.inComment) {\n        if (pStream.match(/[^\\*\\/]*\\*\\//, true, true))\n          pState.inComment = false;\n        else\n          pStream.skipToEnd();\n        return \"comment\";\n      }\n      /* strings */\n      if (!pState.inString && pStream.match(/\\\"(\\\\\\\"|[^\\\"])*/, true, true)) {\n        pState.inString = true;\n        return \"string\";\n      }\n      if (pState.inString) {\n        if (pStream.match(/[^\\\"]*\\\"/, true, true))\n          pState.inString = false;\n        else\n          pStream.skipToEnd();\n        return \"string\";\n      }\n      /* keywords & operators */\n      if (!!pConfig.keywords && pStream.match(wordRegexpBoundary(pConfig.keywords), true, true))\n        return \"keyword\";\n\n      if (pStream.match(wordRegexpBoundary(pConfig.options), true, true))\n        return \"keyword\";\n\n      if (pStream.match(wordRegexpBoundary(pConfig.arcsWords), true, true))\n        return \"keyword\";\n\n      if (pStream.match(wordRegexp(pConfig.arcsOthers), true, true))\n        return \"keyword\";\n\n      if (!!pConfig.operators && pStream.match(wordRegexp(pConfig.operators), true, true))\n        return \"operator\";\n\n      if (!!pConfig.constants && pStream.match(wordRegexp(pConfig.constants), true, true))\n        return \"variable\";\n\n      /* attribute lists */\n      if (!pConfig.inAttributeList && !!pConfig.attributes && pStream.match('[', true, true)) {\n        pConfig.inAttributeList = true;\n        return \"bracket\";\n      }\n      if (pConfig.inAttributeList) {\n        if (pConfig.attributes !== null && pStream.match(wordRegexpBoundary(pConfig.attributes), true, true)) {\n          return \"attribute\";\n        }\n        if (pStream.match(']', true, true)) {\n          pConfig.inAttributeList = false;\n          return \"bracket\";\n        }\n      }\n\n      pStream.next();\n      return \"base\";\n    };\n  }\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/mumps/mumps.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\n  This MUMPS Language script was constructed using vbscript.js as a template.\n*/\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"mumps\", function() {\n    function wordRegexp(words) {\n      return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\", \"i\");\n    }\n\n    var singleOperators = new RegExp(\"^[\\\\+\\\\-\\\\*/&#!_?\\\\\\\\<>=\\\\'\\\\[\\\\]]\");\n    var doubleOperators = new RegExp(\"^(('=)|(<=)|(>=)|('>)|('<)|([[)|(]])|(^$))\");\n    var singleDelimiters = new RegExp(\"^[\\\\.,:]\");\n    var brackets = new RegExp(\"[()]\");\n    var identifiers = new RegExp(\"^[%A-Za-z][A-Za-z0-9]*\");\n    var commandKeywords = [\"break\",\"close\",\"do\",\"else\",\"for\",\"goto\", \"halt\", \"hang\", \"if\", \"job\",\"kill\",\"lock\",\"merge\",\"new\",\"open\", \"quit\", \"read\", \"set\", \"tcommit\", \"trollback\", \"tstart\", \"use\", \"view\", \"write\", \"xecute\", \"b\",\"c\",\"d\",\"e\",\"f\",\"g\", \"h\", \"i\", \"j\",\"k\",\"l\",\"m\",\"n\",\"o\", \"q\", \"r\", \"s\", \"tc\", \"tro\", \"ts\", \"u\", \"v\", \"w\", \"x\"];\n    // The following list includes intrinsic functions _and_ special variables\n    var intrinsicFuncsWords = [\"\\\\$ascii\", \"\\\\$char\", \"\\\\$data\", \"\\\\$ecode\", \"\\\\$estack\", \"\\\\$etrap\", \"\\\\$extract\", \"\\\\$find\", \"\\\\$fnumber\", \"\\\\$get\", \"\\\\$horolog\", \"\\\\$io\", \"\\\\$increment\", \"\\\\$job\", \"\\\\$justify\", \"\\\\$length\", \"\\\\$name\", \"\\\\$next\", \"\\\\$order\", \"\\\\$piece\", \"\\\\$qlength\", \"\\\\$qsubscript\", \"\\\\$query\", \"\\\\$quit\", \"\\\\$random\", \"\\\\$reverse\", \"\\\\$select\", \"\\\\$stack\", \"\\\\$test\", \"\\\\$text\", \"\\\\$translate\", \"\\\\$view\", \"\\\\$x\", \"\\\\$y\", \"\\\\$a\", \"\\\\$c\", \"\\\\$d\", \"\\\\$e\", \"\\\\$ec\", \"\\\\$es\", \"\\\\$et\", \"\\\\$f\", \"\\\\$fn\", \"\\\\$g\", \"\\\\$h\", \"\\\\$i\", \"\\\\$j\", \"\\\\$l\", \"\\\\$n\", \"\\\\$na\", \"\\\\$o\", \"\\\\$p\", \"\\\\$q\", \"\\\\$ql\", \"\\\\$qs\", \"\\\\$r\", \"\\\\$re\", \"\\\\$s\", \"\\\\$st\", \"\\\\$t\", \"\\\\$tr\", \"\\\\$v\", \"\\\\$z\"];\n    var intrinsicFuncs = wordRegexp(intrinsicFuncsWords);\n    var command = wordRegexp(commandKeywords);\n\n    function tokenBase(stream, state) {\n      if (stream.sol()) {\n        state.label = true;\n        state.commandMode = 0;\n      }\n\n      // The <space> character has meaning in MUMPS. Ignoring consecutive\n      // spaces would interfere with interpreting whether the next non-space\n      // character belongs to the command or argument context.\n\n      // Examine each character and update a mode variable whose interpretation is:\n      //   >0 => command    0 => argument    <0 => command post-conditional\n      var ch = stream.peek();\n\n      if (ch == \" \" || ch == \"\\t\") { // Pre-process <space>\n        state.label = false;\n        if (state.commandMode == 0)\n          state.commandMode = 1;\n        else if ((state.commandMode < 0) || (state.commandMode == 2))\n          state.commandMode = 0;\n      } else if ((ch != \".\") && (state.commandMode > 0)) {\n        if (ch == \":\")\n          state.commandMode = -1;   // SIS - Command post-conditional\n        else\n          state.commandMode = 2;\n      }\n\n      // Do not color parameter list as line tag\n      if ((ch === \"(\") || (ch === \"\\u0009\"))\n        state.label = false;\n\n      // MUMPS comment starts with \";\"\n      if (ch === \";\") {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n\n      // Number Literals // SIS/RLM - MUMPS permits canonic number followed by concatenate operator\n      if (stream.match(/^[-+]?\\d+(\\.\\d+)?([eE][-+]?\\d+)?/))\n        return \"number\";\n\n      // Handle Strings\n      if (ch == '\"') {\n        if (stream.skipTo('\"')) {\n          stream.next();\n          return \"string\";\n        } else {\n          stream.skipToEnd();\n          return \"error\";\n        }\n      }\n\n      // Handle operators and Delimiters\n      if (stream.match(doubleOperators) || stream.match(singleOperators))\n        return \"operator\";\n\n      // Prevents leading \".\" in DO block from falling through to error\n      if (stream.match(singleDelimiters))\n        return null;\n\n      if (brackets.test(ch)) {\n        stream.next();\n        return \"bracket\";\n      }\n\n      if (state.commandMode > 0 && stream.match(command))\n        return \"variable-2\";\n\n      if (stream.match(intrinsicFuncs))\n        return \"builtin\";\n\n      if (stream.match(identifiers))\n        return \"variable\";\n\n      // Detect dollar-sign when not a documented intrinsic function\n      // \"^\" may introduce a GVN or SSVN - Color same as function\n      if (ch === \"$\" || ch === \"^\") {\n        stream.next();\n        return \"builtin\";\n      }\n\n      // MUMPS Indirection\n      if (ch === \"@\") {\n        stream.next();\n        return \"string-2\";\n      }\n\n      if (/[\\w%]/.test(ch)) {\n        stream.eatWhile(/[\\w%]/);\n        return \"variable\";\n      }\n\n      // Handle non-detected items\n      stream.next();\n      return \"error\";\n    }\n\n    return {\n      startState: function() {\n        return {\n          label: false,\n          commandMode: 0\n        };\n      },\n\n      token: function(stream, state) {\n        var style = tokenBase(stream, state);\n        if (state.label) return \"tag\";\n        return style;\n      }\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-mumps\", \"mumps\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/nginx/nginx.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"nginx\", function(config) {\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  var keywords = words(\n    /* ngxDirectiveControl */ \"break return rewrite set\" +\n    /* ngxDirective */ \" accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_types aio alias allow ancient_browser ancient_browser_value auth_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types client_body_buffer_size client_body_in_file_only client_body_in_single_buffer client_body_temp_path client_body_timeout client_header_buffer_size client_header_timeout client_max_body_size connection_pool_size create_full_put_path daemon dav_access dav_methods debug_connection debug_points default_type degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect proxy_send_lowat proxy_send_timeout proxy_set_body proxy_set_header proxy_ssl_session_reuse proxy_store proxy_store_access proxy_temp_file_write_size proxy_temp_path proxy_timeout proxy_upstream_fail_timeout proxy_upstream_max_fails random_index read_ahead real_ip_header recursive_error_pages request_pool_size reset_timedout_connection resolver resolver_timeout rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk ssi_silent_errors ssi_types ssi_value_length ssl ssl_certificate ssl_certificate_key ssl_ciphers ssl_client_certificate ssl_crl ssl_dhparam ssl_engine ssl_prefer_server_ciphers ssl_protocols ssl_session_cache ssl_session_timeout ssl_verify_client ssl_verify_depth starttls stub_status sub_filter sub_filter_once sub_filter_types tcp_nodelay tcp_nopush thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark userid_name userid_p3p userid_path userid_service valid_referers variables_hash_bucket_size variables_hash_max_size worker_connections worker_cpu_affinity worker_priority worker_processes worker_rlimit_core worker_rlimit_nofile worker_rlimit_sigpending worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23\"\n    );\n\n  var keywords_block = words(\n    /* ngxDirectiveBlock */ \"http mail events server types location upstream charset_map limit_except if geo map\"\n    );\n\n  var keywords_important = words(\n    /* ngxDirectiveImportant */ \"include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files\"\n    );\n\n  var indentUnit = config.indentUnit, type;\n  function ret(style, tp) {type = tp; return style;}\n\n  function tokenBase(stream, state) {\n\n\n    stream.eatWhile(/[\\w\\$_]/);\n\n    var cur = stream.current();\n\n\n    if (keywords.propertyIsEnumerable(cur)) {\n      return \"keyword\";\n    }\n    else if (keywords_block.propertyIsEnumerable(cur)) {\n      return \"variable-2\";\n    }\n    else if (keywords_important.propertyIsEnumerable(cur)) {\n      return \"string-2\";\n    }\n    /**/\n\n    var ch = stream.next();\n    if (ch == \"@\") {stream.eatWhile(/[\\w\\\\\\-]/); return ret(\"meta\", stream.current());}\n    else if (ch == \"/\" && stream.eat(\"*\")) {\n      state.tokenize = tokenCComment;\n      return tokenCComment(stream, state);\n    }\n    else if (ch == \"<\" && stream.eat(\"!\")) {\n      state.tokenize = tokenSGMLComment;\n      return tokenSGMLComment(stream, state);\n    }\n    else if (ch == \"=\") ret(null, \"compare\");\n    else if ((ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) return ret(null, \"compare\");\n    else if (ch == \"\\\"\" || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    else if (ch == \"#\") {\n      stream.skipToEnd();\n      return ret(\"comment\", \"comment\");\n    }\n    else if (ch == \"!\") {\n      stream.match(/^\\s*\\w*/);\n      return ret(\"keyword\", \"important\");\n    }\n    else if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w.%]/);\n      return ret(\"number\", \"unit\");\n    }\n    else if (/[,.+>*\\/]/.test(ch)) {\n      return ret(null, \"select-op\");\n    }\n    else if (/[;{}:\\[\\]]/.test(ch)) {\n      return ret(null, ch);\n    }\n    else {\n      stream.eatWhile(/[\\w\\\\\\-]/);\n      return ret(\"variable\", \"variable\");\n    }\n  }\n\n  function tokenCComment(stream, state) {\n    var maybeEnd = false, ch;\n    while ((ch = stream.next()) != null) {\n      if (maybeEnd && ch == \"/\") {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenSGMLComment(stream, state) {\n    var dashes = 0, ch;\n    while ((ch = stream.next()) != null) {\n      if (dashes >= 2 && ch == \">\") {\n        state.tokenize = tokenBase;\n        break;\n      }\n      dashes = (ch == \"-\") ? dashes + 1 : 0;\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped)\n          break;\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      if (!escaped) state.tokenize = tokenBase;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  return {\n    startState: function(base) {\n      return {tokenize: tokenBase,\n              baseIndent: base || 0,\n              stack: []};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      type = null;\n      var style = state.tokenize(stream, state);\n\n      var context = state.stack[state.stack.length-1];\n      if (type == \"hash\" && context == \"rule\") style = \"atom\";\n      else if (style == \"variable\") {\n        if (context == \"rule\") style = \"number\";\n        else if (!context || context == \"@media{\") style = \"tag\";\n      }\n\n      if (context == \"rule\" && /^[\\{\\};]$/.test(type))\n        state.stack.pop();\n      if (type == \"{\") {\n        if (context == \"@media\") state.stack[state.stack.length-1] = \"@media{\";\n        else state.stack.push(\"{\");\n      }\n      else if (type == \"}\") state.stack.pop();\n      else if (type == \"@media\") state.stack.push(\"@media\");\n      else if (context == \"{\" && type != \"comment\") state.stack.push(\"rule\");\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var n = state.stack.length;\n      if (/^\\}/.test(textAfter))\n        n -= state.stack[state.stack.length-1] == \"rule\" ? 2 : 1;\n      return state.baseIndent + n * indentUnit;\n    },\n\n    electricChars: \"}\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-nginx-conf\", \"nginx\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/nsis/nsis.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Author: Jan T. Sott (http://github.com/idleberg)\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineSimpleMode(\"nsis\",{\n  start:[\n    // Numbers\n    {regex: /(?:[+-]?)(?:0x[\\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\\d+.?\\d*)/, token: \"number\"},\n\n    // Strings\n    { regex: /\"(?:[^\\\\\"]|\\\\.)*\"?/, token: \"string\" },\n    { regex: /'(?:[^\\\\']|\\\\.)*'?/, token: \"string\" },\n    { regex: /`(?:[^\\\\`]|\\\\.)*`?/, token: \"string\" },\n\n    // Compile Time Commands\n    {regex: /^\\s*(?:\\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|error|execute|finalize|getdllversion|gettlbversion|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|uninstfinalize|verbose|warning))\\b/i, token: \"keyword\"},\n\n    // Conditional Compilation\n    {regex: /^\\s*(?:\\!(if(?:n?def)?|ifmacron?def|macro))\\b/i, token: \"keyword\", indent: true},\n    {regex: /^\\s*(?:\\!(else|endif|macroend))\\b/i, token: \"keyword\", dedent: true},\n\n    // Runtime Commands\n    {regex: /^\\s*(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecShellWait|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetKnownFolderPath|GetLabelAddress|GetTempFileName|GetWinVer|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfRtlLanguage|IfShellVarContextAll|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|Int64Cmp|Int64CmpU|Int64Fmt|IntCmp|IntCmpU|IntFmt|IntOp|IntPtrCmp|IntPtrCmpU|IntPtrOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadAndSetImage|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestLongPathAware|ManifestMaxVersionTested|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|PEAddResource|PEDllCharacteristics|PERemoveResource|PESubsysVer|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegMultiStr|WriteRegNone|WriteRegStr|WriteUninstaller|XPStyle)\\b/i, token: \"keyword\"},\n    {regex: /^\\s*(?:Function|PageEx|Section(?:Group)?)\\b/i, token: \"keyword\", indent: true},\n    {regex: /^\\s*(?:(Function|PageEx|Section(?:Group)?)End)\\b/i, token: \"keyword\", dedent: true},\n\n    // Command Options\n    {regex: /\\b(?:ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HIDDEN|HKCC|HKCR(32|64)?|HKCU(32|64)?|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM(32|64)?|HKPD|HKU|IDABORT|IDCANCEL|IDD_DIR|IDD_INST|IDD_INSTFILES|IDD_LICENSE|IDD_SELCOM|IDD_UNINST|IDD_VERIFY|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|MB_YESNOCANCEL|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SW_HIDE|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWNORMAL|SYSTEM|TEMPORARY)\\b/i, token: \"atom\"},\n    {regex: /\\b(?:admin|all|auto|both|bottom|bzip2|components|current|custom|directory|false|force|hide|highest|ifdiff|ifnewer|instfiles|lastused|leave|left|license|listonly|lzma|nevershow|none|normal|notset|off|on|right|show|silent|silentlog|textonly|top|true|try|un\\.components|un\\.custom|un\\.directory|un\\.instfiles|un\\.license|uninstConfirm|user|Win10|Win7|Win8|WinVista|zlib)\\b/i, token: \"builtin\"},\n\n    // LogicLib.nsh\n    {regex: /\\$\\{(?:And(?:If(?:Not)?|Unless)|Break|Case(?:Else)?|Continue|Default|Do(?:Until|While)?|Else(?:If(?:Not)?|Unless)?|End(?:If|Select|Switch)|Exit(?:Do|For|While)|For(?:Each)?|If(?:Cmd|Not(?:Then)?|Then)?|Loop(?:Until|While)?|Or(?:If(?:Not)?|Unless)|Select|Switch|Unless|While)\\}/i, token: \"variable-2\", indent: true},\n\n    // FileFunc.nsh\n    {regex: /\\$\\{(?:BannerTrimPath|DirState|DriveSpace|Get(BaseName|Drives|ExeName|ExePath|FileAttributes|FileExt|FileName|FileVersion|Options|OptionsS|Parameters|Parent|Root|Size|Time)|Locate|RefreshShellIcons)\\}/i, token: \"variable-2\", dedent: true},\n\n    // Memento.nsh\n    {regex: /\\$\\{(?:Memento(?:Section(?:Done|End|Restore|Save)?|UnselectedSection))\\}/i, token: \"variable-2\", dedent: true},\n\n    // TextFunc.nsh\n    {regex: /\\$\\{(?:Config(?:Read|ReadS|Write|WriteS)|File(?:Join|ReadFromEnd|Recode)|Line(?:Find|Read|Sum)|Text(?:Compare|CompareS)|TrimNewLines)\\}/i, token: \"variable-2\", dedent: true},\n\n    // WinVer.nsh\n    {regex: /\\$\\{(?:(?:At(?:Least|Most)|Is)(?:ServicePack|Win(?:7|8|10|95|98|200(?:0|3|8(?:R2)?)|ME|NT4|Vista|XP))|Is(?:NT|Server))\\}/i, token: \"variable\", dedent: true},\n\n    // WordFunc.nsh\n    {regex: /\\$\\{(?:StrFilterS?|Version(?:Compare|Convert)|Word(?:AddS?|Find(?:(?:2|3)X)?S?|InsertS?|ReplaceS?))\\}/i, token: \"variable-2\", dedent: true},\n\n    // x64.nsh\n    {regex: /\\$\\{(?:RunningX64)\\}/i, token: \"variable\", dedent: true},\n    {regex: /\\$\\{(?:Disable|Enable)X64FSRedirection\\}/i, token: \"variable-2\", dedent: true},\n\n    // Line Comment\n    {regex: /(#|;).*/, token: \"comment\"},\n\n    // Block Comment\n    {regex: /\\/\\*/, token: \"comment\", next: \"comment\"},\n\n    // Operator\n    {regex: /[-+\\/*=<>!]+/, token: \"operator\"},\n\n    // Variable\n    {regex: /\\$\\w[\\w\\.]*/, token: \"variable\"},\n\n    // Constant\n    {regex: /\\${[\\!\\w\\.:-]+}/, token: \"variable-2\"},\n\n    // Language String\n    {regex: /\\$\\([\\!\\w\\.:-]+\\)/, token: \"variable-3\"}\n  ],\n  comment: [\n    {regex: /.*?\\*\\//, token: \"comment\", next: \"start\"},\n    {regex: /.*/, token: \"comment\"}\n  ],\n  meta: {\n    electricInput: /^\\s*((Function|PageEx|Section|Section(Group)?)End|(\\!(endif|macroend))|\\$\\{(End(If|Unless|While)|Loop(Until)|Next)\\})$/i,\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: [\"#\", \";\"]\n  }\n});\n\nCodeMirror.defineMIME(\"text/x-nsis\", \"nsis\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/ntriples/ntriples.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**********************************************************\n* This script provides syntax highlighting support for\n* the N-Triples format.\n* N-Triples format specification:\n*     https://www.w3.org/TR/n-triples/\n***********************************************************/\n\n/*\n    The following expression defines the defined ASF grammar transitions.\n\n    pre_subject ->\n        {\n        ( writing_subject_uri | writing_bnode_uri )\n            -> pre_predicate\n                -> writing_predicate_uri\n                    -> pre_object\n                        -> writing_object_uri | writing_object_bnode |\n                          (\n                            writing_object_literal\n                                -> writing_literal_lang | writing_literal_type\n                          )\n                            -> post_object\n                                -> BEGIN\n         } otherwise {\n             -> ERROR\n         }\n*/\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"ntriples\", function() {\n\n  var Location = {\n    PRE_SUBJECT         : 0,\n    WRITING_SUB_URI     : 1,\n    WRITING_BNODE_URI   : 2,\n    PRE_PRED            : 3,\n    WRITING_PRED_URI    : 4,\n    PRE_OBJ             : 5,\n    WRITING_OBJ_URI     : 6,\n    WRITING_OBJ_BNODE   : 7,\n    WRITING_OBJ_LITERAL : 8,\n    WRITING_LIT_LANG    : 9,\n    WRITING_LIT_TYPE    : 10,\n    POST_OBJ            : 11,\n    ERROR               : 12\n  };\n  function transitState(currState, c) {\n    var currLocation = currState.location;\n    var ret;\n\n    // Opening.\n    if     (currLocation == Location.PRE_SUBJECT && c == '<') ret = Location.WRITING_SUB_URI;\n    else if(currLocation == Location.PRE_SUBJECT && c == '_') ret = Location.WRITING_BNODE_URI;\n    else if(currLocation == Location.PRE_PRED    && c == '<') ret = Location.WRITING_PRED_URI;\n    else if(currLocation == Location.PRE_OBJ     && c == '<') ret = Location.WRITING_OBJ_URI;\n    else if(currLocation == Location.PRE_OBJ     && c == '_') ret = Location.WRITING_OBJ_BNODE;\n    else if(currLocation == Location.PRE_OBJ     && c == '\"') ret = Location.WRITING_OBJ_LITERAL;\n\n    // Closing.\n    else if(currLocation == Location.WRITING_SUB_URI     && c == '>') ret = Location.PRE_PRED;\n    else if(currLocation == Location.WRITING_BNODE_URI   && c == ' ') ret = Location.PRE_PRED;\n    else if(currLocation == Location.WRITING_PRED_URI    && c == '>') ret = Location.PRE_OBJ;\n    else if(currLocation == Location.WRITING_OBJ_URI     && c == '>') ret = Location.POST_OBJ;\n    else if(currLocation == Location.WRITING_OBJ_BNODE   && c == ' ') ret = Location.POST_OBJ;\n    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '\"') ret = Location.POST_OBJ;\n    else if(currLocation == Location.WRITING_LIT_LANG && c == ' ') ret = Location.POST_OBJ;\n    else if(currLocation == Location.WRITING_LIT_TYPE && c == '>') ret = Location.POST_OBJ;\n\n    // Closing typed and language literal.\n    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '@') ret = Location.WRITING_LIT_LANG;\n    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '^') ret = Location.WRITING_LIT_TYPE;\n\n    // Spaces.\n    else if( c == ' ' &&\n             (\n               currLocation == Location.PRE_SUBJECT ||\n               currLocation == Location.PRE_PRED    ||\n               currLocation == Location.PRE_OBJ     ||\n               currLocation == Location.POST_OBJ\n             )\n           ) ret = currLocation;\n\n    // Reset.\n    else if(currLocation == Location.POST_OBJ && c == '.') ret = Location.PRE_SUBJECT;\n\n    // Error\n    else ret = Location.ERROR;\n\n    currState.location=ret;\n  }\n\n  return {\n    startState: function() {\n       return {\n           location : Location.PRE_SUBJECT,\n           uris     : [],\n           anchors  : [],\n           bnodes   : [],\n           langs    : [],\n           types    : []\n       };\n    },\n    token: function(stream, state) {\n      var ch = stream.next();\n      if(ch == '<') {\n         transitState(state, ch);\n         var parsedURI = '';\n         stream.eatWhile( function(c) { if( c != '#' && c != '>' ) { parsedURI += c; return true; } return false;} );\n         state.uris.push(parsedURI);\n         if( stream.match('#', false) ) return 'variable';\n         stream.next();\n         transitState(state, '>');\n         return 'variable';\n      }\n      if(ch == '#') {\n        var parsedAnchor = '';\n        stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;});\n        state.anchors.push(parsedAnchor);\n        return 'variable-2';\n      }\n      if(ch == '>') {\n          transitState(state, '>');\n          return 'variable';\n      }\n      if(ch == '_') {\n          transitState(state, ch);\n          var parsedBNode = '';\n          stream.eatWhile(function(c) { if( c != ' ' ) { parsedBNode += c; return true; } return false;});\n          state.bnodes.push(parsedBNode);\n          stream.next();\n          transitState(state, ' ');\n          return 'builtin';\n      }\n      if(ch == '\"') {\n          transitState(state, ch);\n          stream.eatWhile( function(c) { return c != '\"'; } );\n          stream.next();\n          if( stream.peek() != '@' && stream.peek() != '^' ) {\n              transitState(state, '\"');\n          }\n          return 'string';\n      }\n      if( ch == '@' ) {\n          transitState(state, '@');\n          var parsedLang = '';\n          stream.eatWhile(function(c) { if( c != ' ' ) { parsedLang += c; return true; } return false;});\n          state.langs.push(parsedLang);\n          stream.next();\n          transitState(state, ' ');\n          return 'string-2';\n      }\n      if( ch == '^' ) {\n          stream.next();\n          transitState(state, '^');\n          var parsedType = '';\n          stream.eatWhile(function(c) { if( c != '>' ) { parsedType += c; return true; } return false;} );\n          state.types.push(parsedType);\n          stream.next();\n          transitState(state, '>');\n          return 'variable';\n      }\n      if( ch == ' ' ) {\n          transitState(state, ch);\n      }\n      if( ch == '.' ) {\n          transitState(state, ch);\n      }\n    }\n  };\n});\n\n// define the registered Media Type for n-triples:\n// https://www.w3.org/TR/n-triples/#n-triples-mediatype\nCodeMirror.defineMIME(\"application/n-triples\", \"ntriples\");\n\n// N-Quads is based on the N-Triples format (so same highlighting works)\n// https://www.w3.org/TR/n-quads/\nCodeMirror.defineMIME(\"application/n-quads\", \"ntriples\");\n\n// previously used, though technically incorrect media type for n-triples\nCodeMirror.defineMIME(\"text/n-triples\", \"ntriples\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/octave/octave.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"octave\", function() {\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  var singleOperators = new RegExp(\"^[\\\\+\\\\-\\\\*/&|\\\\^~<>!@'\\\\\\\\]\");\n  var singleDelimiters = new RegExp('^[\\\\(\\\\[\\\\{\\\\},:=;\\\\.]');\n  var doubleOperators = new RegExp(\"^((==)|(~=)|(<=)|(>=)|(<<)|(>>)|(\\\\.[\\\\+\\\\-\\\\*/\\\\^\\\\\\\\]))\");\n  var doubleDelimiters = new RegExp(\"^((!=)|(\\\\+=)|(\\\\-=)|(\\\\*=)|(/=)|(&=)|(\\\\|=)|(\\\\^=))\");\n  var tripleDelimiters = new RegExp(\"^((>>=)|(<<=))\");\n  var expressionEnd = new RegExp(\"^[\\\\]\\\\)]\");\n  var identifiers = new RegExp(\"^[_A-Za-z\\xa1-\\uffff][_A-Za-z0-9\\xa1-\\uffff]*\");\n\n  var builtins = wordRegexp([\n    'error', 'eval', 'function', 'abs', 'acos', 'atan', 'asin', 'cos',\n    'cosh', 'exp', 'log', 'prod', 'sum', 'log10', 'max', 'min', 'sign', 'sin', 'sinh',\n    'sqrt', 'tan', 'reshape', 'break', 'zeros', 'default', 'margin', 'round', 'ones',\n    'rand', 'syn', 'ceil', 'floor', 'size', 'clear', 'zeros', 'eye', 'mean', 'std', 'cov',\n    'det', 'eig', 'inv', 'norm', 'rank', 'trace', 'expm', 'logm', 'sqrtm', 'linspace', 'plot',\n    'title', 'xlabel', 'ylabel', 'legend', 'text', 'grid', 'meshgrid', 'mesh', 'num2str',\n    'fft', 'ifft', 'arrayfun', 'cellfun', 'input', 'fliplr', 'flipud', 'ismember'\n  ]);\n\n  var keywords = wordRegexp([\n    'return', 'case', 'switch', 'else', 'elseif', 'end', 'endif', 'endfunction',\n    'if', 'otherwise', 'do', 'for', 'while', 'try', 'catch', 'classdef', 'properties', 'events',\n    'methods', 'global', 'persistent', 'endfor', 'endwhile', 'printf', 'sprintf', 'disp', 'until',\n    'continue', 'pkg'\n  ]);\n\n\n  // tokenizers\n  function tokenTranspose(stream, state) {\n    if (!stream.sol() && stream.peek() === '\\'') {\n      stream.next();\n      state.tokenize = tokenBase;\n      return 'operator';\n    }\n    state.tokenize = tokenBase;\n    return tokenBase(stream, state);\n  }\n\n\n  function tokenComment(stream, state) {\n    if (stream.match(/^.*%}/)) {\n      state.tokenize = tokenBase;\n      return 'comment';\n    };\n    stream.skipToEnd();\n    return 'comment';\n  }\n\n  function tokenBase(stream, state) {\n    // whitespaces\n    if (stream.eatSpace()) return null;\n\n    // Handle one line Comments\n    if (stream.match('%{')){\n      state.tokenize = tokenComment;\n      stream.skipToEnd();\n      return 'comment';\n    }\n\n    if (stream.match(/^[%#]/)){\n      stream.skipToEnd();\n      return 'comment';\n    }\n\n    // Handle Number Literals\n    if (stream.match(/^[0-9\\.+-]/, false)) {\n      if (stream.match(/^[+-]?0x[0-9a-fA-F]+[ij]?/)) {\n        stream.tokenize = tokenBase;\n        return 'number'; };\n      if (stream.match(/^[+-]?\\d*\\.\\d+([EeDd][+-]?\\d+)?[ij]?/)) { return 'number'; };\n      if (stream.match(/^[+-]?\\d+([EeDd][+-]?\\d+)?[ij]?/)) { return 'number'; };\n    }\n    if (stream.match(wordRegexp(['nan','NaN','inf','Inf']))) { return 'number'; };\n\n    // Handle Strings\n    var m = stream.match(/^\"(?:[^\"]|\"\")*(\"|$)/) || stream.match(/^'(?:[^']|'')*('|$)/)\n    if (m) { return m[1] ? 'string' : \"string error\"; }\n\n    // Handle words\n    if (stream.match(keywords)) { return 'keyword'; } ;\n    if (stream.match(builtins)) { return 'builtin'; } ;\n    if (stream.match(identifiers)) { return 'variable'; } ;\n\n    if (stream.match(singleOperators) || stream.match(doubleOperators)) { return 'operator'; };\n    if (stream.match(singleDelimiters) || stream.match(doubleDelimiters) || stream.match(tripleDelimiters)) { return null; };\n\n    if (stream.match(expressionEnd)) {\n      state.tokenize = tokenTranspose;\n      return null;\n    };\n\n\n    // Handle non-detected items\n    stream.next();\n    return 'error';\n  };\n\n\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase\n      };\n    },\n\n    token: function(stream, state) {\n      var style = state.tokenize(stream, state);\n      if (style === 'number' || style === 'variable'){\n        state.tokenize = tokenTranspose;\n      }\n      return style;\n    },\n\n    lineComment: '%',\n\n    fold: 'indent'\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-octave\", \"octave\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/oz/oz.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"oz\", function (conf) {\n\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  var singleOperators = /[\\^@!\\|<>#~\\.\\*\\-\\+\\\\/,=]/;\n  var doubleOperators = /(<-)|(:=)|(=<)|(>=)|(<=)|(<:)|(>:)|(=:)|(\\\\=)|(\\\\=:)|(!!)|(==)|(::)/;\n  var tripleOperators = /(:::)|(\\.\\.\\.)|(=<:)|(>=:)/;\n\n  var middle = [\"in\", \"then\", \"else\", \"of\", \"elseof\", \"elsecase\", \"elseif\", \"catch\",\n    \"finally\", \"with\", \"require\", \"prepare\", \"import\", \"export\", \"define\", \"do\"];\n  var end = [\"end\"];\n\n  var atoms = wordRegexp([\"true\", \"false\", \"nil\", \"unit\"]);\n  var commonKeywords = wordRegexp([\"andthen\", \"at\", \"attr\", \"declare\", \"feat\", \"from\", \"lex\",\n    \"mod\", \"div\", \"mode\", \"orelse\", \"parser\", \"prod\", \"prop\", \"scanner\", \"self\", \"syn\", \"token\"]);\n  var openingKeywords = wordRegexp([\"local\", \"proc\", \"fun\", \"case\", \"class\", \"if\", \"cond\", \"or\", \"dis\",\n    \"choice\", \"not\", \"thread\", \"try\", \"raise\", \"lock\", \"for\", \"suchthat\", \"meth\", \"functor\"]);\n  var middleKeywords = wordRegexp(middle);\n  var endKeywords = wordRegexp(end);\n\n  // Tokenizers\n  function tokenBase(stream, state) {\n    if (stream.eatSpace()) {\n      return null;\n    }\n\n    // Brackets\n    if(stream.match(/[{}]/)) {\n      return \"bracket\";\n    }\n\n    // Special [] keyword\n    if (stream.match('[]')) {\n        return \"keyword\"\n    }\n\n    // Operators\n    if (stream.match(tripleOperators) || stream.match(doubleOperators)) {\n      return \"operator\";\n    }\n\n    // Atoms\n    if(stream.match(atoms)) {\n      return 'atom';\n    }\n\n    // Opening keywords\n    var matched = stream.match(openingKeywords);\n    if (matched) {\n      if (!state.doInCurrentLine)\n        state.currentIndent++;\n      else\n        state.doInCurrentLine = false;\n\n      // Special matching for signatures\n      if(matched[0] == \"proc\" || matched[0] == \"fun\")\n        state.tokenize = tokenFunProc;\n      else if(matched[0] == \"class\")\n        state.tokenize = tokenClass;\n      else if(matched[0] == \"meth\")\n        state.tokenize = tokenMeth;\n\n      return 'keyword';\n    }\n\n    // Middle and other keywords\n    if (stream.match(middleKeywords) || stream.match(commonKeywords)) {\n      return \"keyword\"\n    }\n\n    // End keywords\n    if (stream.match(endKeywords)) {\n      state.currentIndent--;\n      return 'keyword';\n    }\n\n    // Eat the next char for next comparisons\n    var ch = stream.next();\n\n    // Strings\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n\n    // Numbers\n    if (/[~\\d]/.test(ch)) {\n      if (ch == \"~\") {\n        if(! /^[0-9]/.test(stream.peek()))\n          return null;\n        else if (( stream.next() == \"0\" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\\.[0-9]+)?([eE][~+]?[0-9]+)?/))\n          return \"number\";\n      }\n\n      if ((ch == \"0\" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\\.[0-9]+)?([eE][~+]?[0-9]+)?/))\n        return \"number\";\n\n      return null;\n    }\n\n    // Comments\n    if (ch == \"%\") {\n      stream.skipToEnd();\n      return 'comment';\n    }\n    else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n    }\n\n    // Single operators\n    if(singleOperators.test(ch)) {\n      return \"operator\";\n    }\n\n    // If nothing match, we skip the entire alphanumeric block\n    stream.eatWhile(/\\w/);\n\n    return \"variable\";\n  }\n\n  function tokenClass(stream, state) {\n    if (stream.eatSpace()) {\n      return null;\n    }\n    stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)/);\n    state.tokenize = tokenBase;\n    return \"variable-3\"\n  }\n\n  function tokenMeth(stream, state) {\n    if (stream.eatSpace()) {\n      return null;\n    }\n    stream.match(/([a-zA-Z][A-Za-z0-9_]*)|(`.+`)/);\n    state.tokenize = tokenBase;\n    return \"def\"\n  }\n\n  function tokenFunProc(stream, state) {\n    if (stream.eatSpace()) {\n      return null;\n    }\n\n    if(!state.hasPassedFirstStage && stream.eat(\"{\")) {\n      state.hasPassedFirstStage = true;\n      return \"bracket\";\n    }\n    else if(state.hasPassedFirstStage) {\n      stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)|\\$/);\n      state.hasPassedFirstStage = false;\n      state.tokenize = tokenBase;\n      return \"def\"\n    }\n    else {\n      state.tokenize = tokenBase;\n      return null;\n    }\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function tokenString(quote) {\n    return function (stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n          end = true;\n          break;\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !escaped)\n        state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  function buildElectricInputRegEx() {\n    // Reindentation should occur on [] or on a match of any of\n    // the block closing keywords, at the end of a line.\n    var allClosings = middle.concat(end);\n    return new RegExp(\"[\\\\[\\\\]]|(\" + allClosings.join(\"|\") + \")$\");\n  }\n\n  return {\n\n    startState: function () {\n      return {\n        tokenize: tokenBase,\n        currentIndent: 0,\n        doInCurrentLine: false,\n        hasPassedFirstStage: false\n      };\n    },\n\n    token: function (stream, state) {\n      if (stream.sol())\n        state.doInCurrentLine = 0;\n\n      return state.tokenize(stream, state);\n    },\n\n    indent: function (state, textAfter) {\n      var trueText = textAfter.replace(/^\\s+|\\s+$/g, '');\n\n      if (trueText.match(endKeywords) || trueText.match(middleKeywords) || trueText.match(/(\\[])/))\n        return conf.indentUnit * (state.currentIndent - 1);\n\n      if (state.currentIndent < 0)\n        return 0;\n\n      return state.currentIndent * conf.indentUnit;\n    },\n    fold: \"indent\",\n    electricInput: buildElectricInputRegEx(),\n    lineComment: \"%\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-oz\", \"oz\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/pascal/pascal.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"pascal\", function() {\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  var keywords = words(\n    \"absolute and array asm begin case const constructor destructor div do \" +\n    \"downto else end file for function goto if implementation in inherited \" +\n    \"inline interface label mod nil not object of operator or packed procedure \" +\n    \"program record reintroduce repeat self set shl shr string then to type \" +\n    \"unit until uses var while with xor as class dispinterface except exports \" +\n    \"finalization finally initialization inline is library on out packed \" +\n    \"property raise resourcestring threadvar try absolute abstract alias \" +\n    \"assembler bitpacked break cdecl continue cppdecl cvar default deprecated \" +\n    \"dynamic enumerator experimental export external far far16 forward generic \" +\n    \"helper implements index interrupt iocheck local message name near \" +\n    \"nodefault noreturn nostackframe oldfpccall otherwise overload override \" +\n    \"pascal platform private protected public published read register \" +\n    \"reintroduce result safecall saveregisters softfloat specialize static \" +\n    \"stdcall stored strict unaligned unimplemented varargs virtual write\");\n  var atoms = {\"null\": true};\n\n  var isOperatorChar = /[+\\-*&%=<>!?|\\/]/;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == \"#\" && state.startOfLine) {\n      stream.skipToEnd();\n      return \"meta\";\n    }\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (ch == \"(\" && stream.eat(\"*\")) {\n      state.tokenize = tokenComment;\n      return tokenComment(stream, state);\n    }\n    if (ch == \"{\") {\n      state.tokenize = tokenCommentBraces;\n      return tokenCommentBraces(stream, state);\n    }\n    if (/[\\[\\]\\(\\),;\\:\\.]/.test(ch)) {\n      return null;\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_]/);\n    var cur = stream.current();\n    if (keywords.propertyIsEnumerable(cur)) return \"keyword\";\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !escaped) state.tokenize = null;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \")\" && maybeEnd) {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function tokenCommentBraces(stream, state) {\n    var ch;\n    while (ch = stream.next()) {\n      if (ch == \"}\") {\n        state.tokenize = null;\n        break;\n      }\n    }\n    return \"comment\";\n  }\n\n  // Interface\n\n  return {\n    startState: function() {\n      return {tokenize: null};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      return style;\n    },\n\n    electricChars: \"{}\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-pascal\", \"pascal\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/pegjs/pegjs.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../javascript/javascript\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../javascript/javascript\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"pegjs\", function (config) {\n  var jsMode = CodeMirror.getMode(config, \"javascript\");\n\n  function identifier(stream) {\n    return stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/);\n  }\n\n  return {\n    startState: function () {\n      return {\n        inString: false,\n        stringType: null,\n        inComment: false,\n        inCharacterClass: false,\n        braced: 0,\n        lhs: true,\n        localState: null\n      };\n    },\n    token: function (stream, state) {\n      if (stream)\n\n      //check for state changes\n      if (!state.inString && !state.inComment && ((stream.peek() == '\"') || (stream.peek() == \"'\"))) {\n        state.stringType = stream.peek();\n        stream.next(); // Skip quote\n        state.inString = true; // Update state\n      }\n      if (!state.inString && !state.inComment && stream.match('/*')) {\n        state.inComment = true;\n      }\n\n      //return state\n      if (state.inString) {\n        while (state.inString && !stream.eol()) {\n          if (stream.peek() === state.stringType) {\n            stream.next(); // Skip quote\n            state.inString = false; // Clear flag\n          } else if (stream.peek() === '\\\\') {\n            stream.next();\n            stream.next();\n          } else {\n            stream.match(/^.[^\\\\\\\"\\']*/);\n          }\n        }\n        return state.lhs ? \"property string\" : \"string\"; // Token style\n      } else if (state.inComment) {\n        while (state.inComment && !stream.eol()) {\n          if (stream.match('*/')) {\n            state.inComment = false; // Clear flag\n          } else {\n            stream.match(/^.[^\\*]*/);\n          }\n        }\n        return \"comment\";\n      } else if (state.inCharacterClass) {\n          while (state.inCharacterClass && !stream.eol()) {\n            if (!(stream.match(/^[^\\]\\\\]+/) || stream.match(/^\\\\./))) {\n              state.inCharacterClass = false;\n            }\n          }\n      } else if (stream.peek() === '[') {\n        stream.next();\n        state.inCharacterClass = true;\n        return 'bracket';\n      } else if (stream.match('//')) {\n        stream.skipToEnd();\n        return \"comment\";\n      } else if (state.braced || stream.peek() === '{') {\n        if (state.localState === null) {\n          state.localState = CodeMirror.startState(jsMode);\n        }\n        var token = jsMode.token(stream, state.localState);\n        var text = stream.current();\n        if (!token) {\n          for (var i = 0; i < text.length; i++) {\n            if (text[i] === '{') {\n              state.braced++;\n            } else if (text[i] === '}') {\n              state.braced--;\n            }\n          };\n        }\n        return token;\n      } else if (identifier(stream)) {\n        if (stream.peek() === ':') {\n          return 'variable';\n        }\n        return 'variable-2';\n      } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) {\n        stream.next();\n        return 'bracket';\n      } else if (!stream.eatSpace()) {\n        stream.next();\n      }\n      return null;\n    }\n  };\n}, \"javascript\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/perl/perl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// CodeMirror2 mode/perl/perl.js (text/x-perl) beta 0.10 (2011-11-08)\n// This is a part of CodeMirror from https://github.com/sabaca/CodeMirror_mode_perl (mail@sabaca.com)\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"perl\",function(){\n        // http://perldoc.perl.org\n        var PERL={                                      //   null - magic touch\n                                                        //   1 - keyword\n                                                        //   2 - def\n                                                        //   3 - atom\n                                                        //   4 - operator\n                                                        //   5 - variable-2 (predefined)\n                                                        //   [x,y] - x=1,2,3; y=must be defined if x{...}\n                                                //      PERL operators\n                '->'                            :   4,\n                '++'                            :   4,\n                '--'                            :   4,\n                '**'                            :   4,\n                                                        //   ! ~ \\ and unary + and -\n                '=~'                            :   4,\n                '!~'                            :   4,\n                '*'                             :   4,\n                '/'                             :   4,\n                '%'                             :   4,\n                'x'                             :   4,\n                '+'                             :   4,\n                '-'                             :   4,\n                '.'                             :   4,\n                '<<'                            :   4,\n                '>>'                            :   4,\n                                                        //   named unary operators\n                '<'                             :   4,\n                '>'                             :   4,\n                '<='                            :   4,\n                '>='                            :   4,\n                'lt'                            :   4,\n                'gt'                            :   4,\n                'le'                            :   4,\n                'ge'                            :   4,\n                '=='                            :   4,\n                '!='                            :   4,\n                '<=>'                           :   4,\n                'eq'                            :   4,\n                'ne'                            :   4,\n                'cmp'                           :   4,\n                '~~'                            :   4,\n                '&'                             :   4,\n                '|'                             :   4,\n                '^'                             :   4,\n                '&&'                            :   4,\n                '||'                            :   4,\n                '//'                            :   4,\n                '..'                            :   4,\n                '...'                           :   4,\n                '?'                             :   4,\n                ':'                             :   4,\n                '='                             :   4,\n                '+='                            :   4,\n                '-='                            :   4,\n                '*='                            :   4,  //   etc. ???\n                ','                             :   4,\n                '=>'                            :   4,\n                '::'                            :   4,\n                                                        //   list operators (rightward)\n                'not'                           :   4,\n                'and'                           :   4,\n                'or'                            :   4,\n                'xor'                           :   4,\n                                                //      PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;)\n                'BEGIN'                         :   [5,1],\n                'END'                           :   [5,1],\n                'PRINT'                         :   [5,1],\n                'PRINTF'                        :   [5,1],\n                'GETC'                          :   [5,1],\n                'READ'                          :   [5,1],\n                'READLINE'                      :   [5,1],\n                'DESTROY'                       :   [5,1],\n                'TIE'                           :   [5,1],\n                'TIEHANDLE'                     :   [5,1],\n                'UNTIE'                         :   [5,1],\n                'STDIN'                         :    5,\n                'STDIN_TOP'                     :    5,\n                'STDOUT'                        :    5,\n                'STDOUT_TOP'                    :    5,\n                'STDERR'                        :    5,\n                'STDERR_TOP'                    :    5,\n                '$ARG'                          :    5,\n                '$_'                            :    5,\n                '@ARG'                          :    5,\n                '@_'                            :    5,\n                '$LIST_SEPARATOR'               :    5,\n                '$\"'                            :    5,\n                '$PROCESS_ID'                   :    5,\n                '$PID'                          :    5,\n                '$$'                            :    5,\n                '$REAL_GROUP_ID'                :    5,\n                '$GID'                          :    5,\n                '$('                            :    5,\n                '$EFFECTIVE_GROUP_ID'           :    5,\n                '$EGID'                         :    5,\n                '$)'                            :    5,\n                '$PROGRAM_NAME'                 :    5,\n                '$0'                            :    5,\n                '$SUBSCRIPT_SEPARATOR'          :    5,\n                '$SUBSEP'                       :    5,\n                '$;'                            :    5,\n                '$REAL_USER_ID'                 :    5,\n                '$UID'                          :    5,\n                '$<'                            :    5,\n                '$EFFECTIVE_USER_ID'            :    5,\n                '$EUID'                         :    5,\n                '$>'                            :    5,\n                '$a'                            :    5,\n                '$b'                            :    5,\n                '$COMPILING'                    :    5,\n                '$^C'                           :    5,\n                '$DEBUGGING'                    :    5,\n                '$^D'                           :    5,\n                '${^ENCODING}'                  :    5,\n                '$ENV'                          :    5,\n                '%ENV'                          :    5,\n                '$SYSTEM_FD_MAX'                :    5,\n                '$^F'                           :    5,\n                '@F'                            :    5,\n                '${^GLOBAL_PHASE}'              :    5,\n                '$^H'                           :    5,\n                '%^H'                           :    5,\n                '@INC'                          :    5,\n                '%INC'                          :    5,\n                '$INPLACE_EDIT'                 :    5,\n                '$^I'                           :    5,\n                '$^M'                           :    5,\n                '$OSNAME'                       :    5,\n                '$^O'                           :    5,\n                '${^OPEN}'                      :    5,\n                '$PERLDB'                       :    5,\n                '$^P'                           :    5,\n                '$SIG'                          :    5,\n                '%SIG'                          :    5,\n                '$BASETIME'                     :    5,\n                '$^T'                           :    5,\n                '${^TAINT}'                     :    5,\n                '${^UNICODE}'                   :    5,\n                '${^UTF8CACHE}'                 :    5,\n                '${^UTF8LOCALE}'                :    5,\n                '$PERL_VERSION'                 :    5,\n                '$^V'                           :    5,\n                '${^WIN32_SLOPPY_STAT}'         :    5,\n                '$EXECUTABLE_NAME'              :    5,\n                '$^X'                           :    5,\n                '$1'                            :    5, // - regexp $1, $2...\n                '$MATCH'                        :    5,\n                '$&'                            :    5,\n                '${^MATCH}'                     :    5,\n                '$PREMATCH'                     :    5,\n                '$`'                            :    5,\n                '${^PREMATCH}'                  :    5,\n                '$POSTMATCH'                    :    5,\n                \"$'\"                            :    5,\n                '${^POSTMATCH}'                 :    5,\n                '$LAST_PAREN_MATCH'             :    5,\n                '$+'                            :    5,\n                '$LAST_SUBMATCH_RESULT'         :    5,\n                '$^N'                           :    5,\n                '@LAST_MATCH_END'               :    5,\n                '@+'                            :    5,\n                '%LAST_PAREN_MATCH'             :    5,\n                '%+'                            :    5,\n                '@LAST_MATCH_START'             :    5,\n                '@-'                            :    5,\n                '%LAST_MATCH_START'             :    5,\n                '%-'                            :    5,\n                '$LAST_REGEXP_CODE_RESULT'      :    5,\n                '$^R'                           :    5,\n                '${^RE_DEBUG_FLAGS}'            :    5,\n                '${^RE_TRIE_MAXBUF}'            :    5,\n                '$ARGV'                         :    5,\n                '@ARGV'                         :    5,\n                'ARGV'                          :    5,\n                'ARGVOUT'                       :    5,\n                '$OUTPUT_FIELD_SEPARATOR'       :    5,\n                '$OFS'                          :    5,\n                '$,'                            :    5,\n                '$INPUT_LINE_NUMBER'            :    5,\n                '$NR'                           :    5,\n                '$.'                            :    5,\n                '$INPUT_RECORD_SEPARATOR'       :    5,\n                '$RS'                           :    5,\n                '$/'                            :    5,\n                '$OUTPUT_RECORD_SEPARATOR'      :    5,\n                '$ORS'                          :    5,\n                '$\\\\'                           :    5,\n                '$OUTPUT_AUTOFLUSH'             :    5,\n                '$|'                            :    5,\n                '$ACCUMULATOR'                  :    5,\n                '$^A'                           :    5,\n                '$FORMAT_FORMFEED'              :    5,\n                '$^L'                           :    5,\n                '$FORMAT_PAGE_NUMBER'           :    5,\n                '$%'                            :    5,\n                '$FORMAT_LINES_LEFT'            :    5,\n                '$-'                            :    5,\n                '$FORMAT_LINE_BREAK_CHARACTERS' :    5,\n                '$:'                            :    5,\n                '$FORMAT_LINES_PER_PAGE'        :    5,\n                '$='                            :    5,\n                '$FORMAT_TOP_NAME'              :    5,\n                '$^'                            :    5,\n                '$FORMAT_NAME'                  :    5,\n                '$~'                            :    5,\n                '${^CHILD_ERROR_NATIVE}'        :    5,\n                '$EXTENDED_OS_ERROR'            :    5,\n                '$^E'                           :    5,\n                '$EXCEPTIONS_BEING_CAUGHT'      :    5,\n                '$^S'                           :    5,\n                '$WARNING'                      :    5,\n                '$^W'                           :    5,\n                '${^WARNING_BITS}'              :    5,\n                '$OS_ERROR'                     :    5,\n                '$ERRNO'                        :    5,\n                '$!'                            :    5,\n                '%OS_ERROR'                     :    5,\n                '%ERRNO'                        :    5,\n                '%!'                            :    5,\n                '$CHILD_ERROR'                  :    5,\n                '$?'                            :    5,\n                '$EVAL_ERROR'                   :    5,\n                '$@'                            :    5,\n                '$OFMT'                         :    5,\n                '$#'                            :    5,\n                '$*'                            :    5,\n                '$ARRAY_BASE'                   :    5,\n                '$['                            :    5,\n                '$OLD_PERL_VERSION'             :    5,\n                '$]'                            :    5,\n                                                //      PERL blocks\n                'if'                            :[1,1],\n                elsif                           :[1,1],\n                'else'                          :[1,1],\n                'while'                         :[1,1],\n                unless                          :[1,1],\n                'for'                           :[1,1],\n                foreach                         :[1,1],\n                                                //      PERL functions\n                'abs'                           :1,     // - absolute value function\n                accept                          :1,     // - accept an incoming socket connect\n                alarm                           :1,     // - schedule a SIGALRM\n                'atan2'                         :1,     // - arctangent of Y/X in the range -PI to PI\n                bind                            :1,     // - binds an address to a socket\n                binmode                         :1,     // - prepare binary files for I/O\n                bless                           :1,     // - create an object\n                bootstrap                       :1,     //\n                'break'                         :1,     // - break out of a \"given\" block\n                caller                          :1,     // - get context of the current subroutine call\n                chdir                           :1,     // - change your current working directory\n                chmod                           :1,     // - changes the permissions on a list of files\n                chomp                           :1,     // - remove a trailing record separator from a string\n                chop                            :1,     // - remove the last character from a string\n                chown                           :1,     // - change the ownership on a list of files\n                chr                             :1,     // - get character this number represents\n                chroot                          :1,     // - make directory new root for path lookups\n                close                           :1,     // - close file (or pipe or socket) handle\n                closedir                        :1,     // - close directory handle\n                connect                         :1,     // - connect to a remote socket\n                'continue'                      :[1,1], // - optional trailing block in a while or foreach\n                'cos'                           :1,     // - cosine function\n                crypt                           :1,     // - one-way passwd-style encryption\n                dbmclose                        :1,     // - breaks binding on a tied dbm file\n                dbmopen                         :1,     // - create binding on a tied dbm file\n                'default'                       :1,     //\n                defined                         :1,     // - test whether a value, variable, or function is defined\n                'delete'                        :1,     // - deletes a value from a hash\n                die                             :1,     // - raise an exception or bail out\n                'do'                            :1,     // - turn a BLOCK into a TERM\n                dump                            :1,     // - create an immediate core dump\n                each                            :1,     // - retrieve the next key/value pair from a hash\n                endgrent                        :1,     // - be done using group file\n                endhostent                      :1,     // - be done using hosts file\n                endnetent                       :1,     // - be done using networks file\n                endprotoent                     :1,     // - be done using protocols file\n                endpwent                        :1,     // - be done using passwd file\n                endservent                      :1,     // - be done using services file\n                eof                             :1,     // - test a filehandle for its end\n                'eval'                          :1,     // - catch exceptions or compile and run code\n                'exec'                          :1,     // - abandon this program to run another\n                exists                          :1,     // - test whether a hash key is present\n                exit                            :1,     // - terminate this program\n                'exp'                           :1,     // - raise I to a power\n                fcntl                           :1,     // - file control system call\n                fileno                          :1,     // - return file descriptor from filehandle\n                flock                           :1,     // - lock an entire file with an advisory lock\n                fork                            :1,     // - create a new process just like this one\n                format                          :1,     // - declare a picture format with use by the write() function\n                formline                        :1,     // - internal function used for formats\n                getc                            :1,     // - get the next character from the filehandle\n                getgrent                        :1,     // - get next group record\n                getgrgid                        :1,     // - get group record given group user ID\n                getgrnam                        :1,     // - get group record given group name\n                gethostbyaddr                   :1,     // - get host record given its address\n                gethostbyname                   :1,     // - get host record given name\n                gethostent                      :1,     // - get next hosts record\n                getlogin                        :1,     // - return who logged in at this tty\n                getnetbyaddr                    :1,     // - get network record given its address\n                getnetbyname                    :1,     // - get networks record given name\n                getnetent                       :1,     // - get next networks record\n                getpeername                     :1,     // - find the other end of a socket connection\n                getpgrp                         :1,     // - get process group\n                getppid                         :1,     // - get parent process ID\n                getpriority                     :1,     // - get current nice value\n                getprotobyname                  :1,     // - get protocol record given name\n                getprotobynumber                :1,     // - get protocol record numeric protocol\n                getprotoent                     :1,     // - get next protocols record\n                getpwent                        :1,     // - get next passwd record\n                getpwnam                        :1,     // - get passwd record given user login name\n                getpwuid                        :1,     // - get passwd record given user ID\n                getservbyname                   :1,     // - get services record given its name\n                getservbyport                   :1,     // - get services record given numeric port\n                getservent                      :1,     // - get next services record\n                getsockname                     :1,     // - retrieve the sockaddr for a given socket\n                getsockopt                      :1,     // - get socket options on a given socket\n                given                           :1,     //\n                glob                            :1,     // - expand filenames using wildcards\n                gmtime                          :1,     // - convert UNIX time into record or string using Greenwich time\n                'goto'                          :1,     // - create spaghetti code\n                grep                            :1,     // - locate elements in a list test true against a given criterion\n                hex                             :1,     // - convert a string to a hexadecimal number\n                'import'                        :1,     // - patch a module's namespace into your own\n                index                           :1,     // - find a substring within a string\n                'int'                           :1,     // - get the integer portion of a number\n                ioctl                           :1,     // - system-dependent device control system call\n                'join'                          :1,     // - join a list into a string using a separator\n                keys                            :1,     // - retrieve list of indices from a hash\n                kill                            :1,     // - send a signal to a process or process group\n                last                            :1,     // - exit a block prematurely\n                lc                              :1,     // - return lower-case version of a string\n                lcfirst                         :1,     // - return a string with just the next letter in lower case\n                length                          :1,     // - return the number of bytes in a string\n                'link'                          :1,     // - create a hard link in the filesystem\n                listen                          :1,     // - register your socket as a server\n                local                           : 2,    // - create a temporary value for a global variable (dynamic scoping)\n                localtime                       :1,     // - convert UNIX time into record or string using local time\n                lock                            :1,     // - get a thread lock on a variable, subroutine, or method\n                'log'                           :1,     // - retrieve the natural logarithm for a number\n                lstat                           :1,     // - stat a symbolic link\n                m                               :null,  // - match a string with a regular expression pattern\n                map                             :1,     // - apply a change to a list to get back a new list with the changes\n                mkdir                           :1,     // - create a directory\n                msgctl                          :1,     // - SysV IPC message control operations\n                msgget                          :1,     // - get SysV IPC message queue\n                msgrcv                          :1,     // - receive a SysV IPC message from a message queue\n                msgsnd                          :1,     // - send a SysV IPC message to a message queue\n                my                              : 2,    // - declare and assign a local variable (lexical scoping)\n                'new'                           :1,     //\n                next                            :1,     // - iterate a block prematurely\n                no                              :1,     // - unimport some module symbols or semantics at compile time\n                oct                             :1,     // - convert a string to an octal number\n                open                            :1,     // - open a file, pipe, or descriptor\n                opendir                         :1,     // - open a directory\n                ord                             :1,     // - find a character's numeric representation\n                our                             : 2,    // - declare and assign a package variable (lexical scoping)\n                pack                            :1,     // - convert a list into a binary representation\n                'package'                       :1,     // - declare a separate global namespace\n                pipe                            :1,     // - open a pair of connected filehandles\n                pop                             :1,     // - remove the last element from an array and return it\n                pos                             :1,     // - find or set the offset for the last/next m//g search\n                print                           :1,     // - output a list to a filehandle\n                printf                          :1,     // - output a formatted list to a filehandle\n                prototype                       :1,     // - get the prototype (if any) of a subroutine\n                push                            :1,     // - append one or more elements to an array\n                q                               :null,  // - singly quote a string\n                qq                              :null,  // - doubly quote a string\n                qr                              :null,  // - Compile pattern\n                quotemeta                       :null,  // - quote regular expression magic characters\n                qw                              :null,  // - quote a list of words\n                qx                              :null,  // - backquote quote a string\n                rand                            :1,     // - retrieve the next pseudorandom number\n                read                            :1,     // - fixed-length buffered input from a filehandle\n                readdir                         :1,     // - get a directory from a directory handle\n                readline                        :1,     // - fetch a record from a file\n                readlink                        :1,     // - determine where a symbolic link is pointing\n                readpipe                        :1,     // - execute a system command and collect standard output\n                recv                            :1,     // - receive a message over a Socket\n                redo                            :1,     // - start this loop iteration over again\n                ref                             :1,     // - find out the type of thing being referenced\n                rename                          :1,     // - change a filename\n                require                         :1,     // - load in external functions from a library at runtime\n                reset                           :1,     // - clear all variables of a given name\n                'return'                        :1,     // - get out of a function early\n                reverse                         :1,     // - flip a string or a list\n                rewinddir                       :1,     // - reset directory handle\n                rindex                          :1,     // - right-to-left substring search\n                rmdir                           :1,     // - remove a directory\n                s                               :null,  // - replace a pattern with a string\n                say                             :1,     // - print with newline\n                scalar                          :1,     // - force a scalar context\n                seek                            :1,     // - reposition file pointer for random-access I/O\n                seekdir                         :1,     // - reposition directory pointer\n                select                          :1,     // - reset default output or do I/O multiplexing\n                semctl                          :1,     // - SysV semaphore control operations\n                semget                          :1,     // - get set of SysV semaphores\n                semop                           :1,     // - SysV semaphore operations\n                send                            :1,     // - send a message over a socket\n                setgrent                        :1,     // - prepare group file for use\n                sethostent                      :1,     // - prepare hosts file for use\n                setnetent                       :1,     // - prepare networks file for use\n                setpgrp                         :1,     // - set the process group of a process\n                setpriority                     :1,     // - set a process's nice value\n                setprotoent                     :1,     // - prepare protocols file for use\n                setpwent                        :1,     // - prepare passwd file for use\n                setservent                      :1,     // - prepare services file for use\n                setsockopt                      :1,     // - set some socket options\n                shift                           :1,     // - remove the first element of an array, and return it\n                shmctl                          :1,     // - SysV shared memory operations\n                shmget                          :1,     // - get SysV shared memory segment identifier\n                shmread                         :1,     // - read SysV shared memory\n                shmwrite                        :1,     // - write SysV shared memory\n                shutdown                        :1,     // - close down just half of a socket connection\n                'sin'                           :1,     // - return the sine of a number\n                sleep                           :1,     // - block for some number of seconds\n                socket                          :1,     // - create a socket\n                socketpair                      :1,     // - create a pair of sockets\n                'sort'                          :1,     // - sort a list of values\n                splice                          :1,     // - add or remove elements anywhere in an array\n                'split'                         :1,     // - split up a string using a regexp delimiter\n                sprintf                         :1,     // - formatted print into a string\n                'sqrt'                          :1,     // - square root function\n                srand                           :1,     // - seed the random number generator\n                stat                            :1,     // - get a file's status information\n                state                           :1,     // - declare and assign a state variable (persistent lexical scoping)\n                study                           :1,     // - optimize input data for repeated searches\n                'sub'                           :1,     // - declare a subroutine, possibly anonymously\n                'substr'                        :1,     // - get or alter a portion of a string\n                symlink                         :1,     // - create a symbolic link to a file\n                syscall                         :1,     // - execute an arbitrary system call\n                sysopen                         :1,     // - open a file, pipe, or descriptor\n                sysread                         :1,     // - fixed-length unbuffered input from a filehandle\n                sysseek                         :1,     // - position I/O pointer on handle used with sysread and syswrite\n                system                          :1,     // - run a separate program\n                syswrite                        :1,     // - fixed-length unbuffered output to a filehandle\n                tell                            :1,     // - get current seekpointer on a filehandle\n                telldir                         :1,     // - get current seekpointer on a directory handle\n                tie                             :1,     // - bind a variable to an object class\n                tied                            :1,     // - get a reference to the object underlying a tied variable\n                time                            :1,     // - return number of seconds since 1970\n                times                           :1,     // - return elapsed time for self and child processes\n                tr                              :null,  // - transliterate a string\n                truncate                        :1,     // - shorten a file\n                uc                              :1,     // - return upper-case version of a string\n                ucfirst                         :1,     // - return a string with just the next letter in upper case\n                umask                           :1,     // - set file creation mode mask\n                undef                           :1,     // - remove a variable or function definition\n                unlink                          :1,     // - remove one link to a file\n                unpack                          :1,     // - convert binary structure into normal perl variables\n                unshift                         :1,     // - prepend more elements to the beginning of a list\n                untie                           :1,     // - break a tie binding to a variable\n                use                             :1,     // - load in a module at compile time\n                utime                           :1,     // - set a file's last access and modify times\n                values                          :1,     // - return a list of the values in a hash\n                vec                             :1,     // - test or set particular bits in a string\n                wait                            :1,     // - wait for any child process to die\n                waitpid                         :1,     // - wait for a particular child process to die\n                wantarray                       :1,     // - get void vs scalar vs list context of current subroutine call\n                warn                            :1,     // - print debugging info\n                when                            :1,     //\n                write                           :1,     // - print a picture record\n                y                               :null}; // - transliterate a string\n\n        var RXstyle=\"string-2\";\n        var RXmodifiers=/[goseximacplud]/;              // NOTE: \"m\", \"s\", \"y\" and \"tr\" need to correct real modifiers for each regexp type\n\n        function tokenChain(stream,state,chain,style,tail){     // NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;)\n                state.chain=null;                               //                                                          12   3tail\n                state.style=null;\n                state.tail=null;\n                state.tokenize=function(stream,state){\n                        var e=false,c,i=0;\n                        while(c=stream.next()){\n                                if(c===chain[i]&&!e){\n                                        if(chain[++i]!==undefined){\n                                                state.chain=chain[i];\n                                                state.style=style;\n                                                state.tail=tail;}\n                                        else if(tail)\n                                                stream.eatWhile(tail);\n                                        state.tokenize=tokenPerl;\n                                        return style;}\n                                e=!e&&c==\"\\\\\";}\n                        return style;};\n                return state.tokenize(stream,state);}\n\n        function tokenSOMETHING(stream,state,string){\n                state.tokenize=function(stream,state){\n                        if(stream.string==string)\n                                state.tokenize=tokenPerl;\n                        stream.skipToEnd();\n                        return \"string\";};\n                return state.tokenize(stream,state);}\n\n        function tokenPerl(stream,state){\n                if(stream.eatSpace())\n                        return null;\n                if(state.chain)\n                        return tokenChain(stream,state,state.chain,state.style,state.tail);\n                if(stream.match(/^(\\-?((\\d[\\d_]*)?\\.\\d+(e[+-]?\\d+)?|\\d+\\.\\d*)|0x[\\da-fA-F_]+|0b[01_]+|\\d[\\d_]*(e[+-]?\\d+)?)/))\n                        return 'number';\n                if(stream.match(/^<<(?=[_a-zA-Z])/)){                  // NOTE: <<SOMETHING\\n...\\nSOMETHING\\n\n                        stream.eatWhile(/\\w/);\n                        return tokenSOMETHING(stream,state,stream.current().substr(2));}\n                if(stream.sol()&&stream.match(/^\\=item(?!\\w)/)){// NOTE: \\n=item...\\n=cut\\n\n                        return tokenSOMETHING(stream,state,'=cut');}\n                var ch=stream.next();\n                if(ch=='\"'||ch==\"'\"){                           // NOTE: ' or \" or <<'SOMETHING'\\n...\\nSOMETHING\\n or <<\"SOMETHING\"\\n...\\nSOMETHING\\n\n                        if(prefix(stream, 3)==\"<<\"+ch){\n                                var p=stream.pos;\n                                stream.eatWhile(/\\w/);\n                                var n=stream.current().substr(1);\n                                if(n&&stream.eat(ch))\n                                        return tokenSOMETHING(stream,state,n);\n                                stream.pos=p;}\n                        return tokenChain(stream,state,[ch],\"string\");}\n                if(ch==\"q\"){\n                        var c=look(stream, -2);\n                        if(!(c&&/\\w/.test(c))){\n                                c=look(stream, 0);\n                                if(c==\"x\"){\n                                        c=look(stream, 1);\n                                        if(c==\"(\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\")\"],RXstyle,RXmodifiers);}\n                                        if(c==\"[\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"]\"],RXstyle,RXmodifiers);}\n                                        if(c==\"{\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"}\"],RXstyle,RXmodifiers);}\n                                        if(c==\"<\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\">\"],RXstyle,RXmodifiers);}\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}\n                                else if(c==\"q\"){\n                                        c=look(stream, 1);\n                                        if(c==\"(\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\")\"],\"string\");}\n                                        if(c==\"[\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"]\"],\"string\");}\n                                        if(c==\"{\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"}\"],\"string\");}\n                                        if(c==\"<\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\">\"],\"string\");}\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[stream.eat(c)],\"string\");}}\n                                else if(c==\"w\"){\n                                        c=look(stream, 1);\n                                        if(c==\"(\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\")\"],\"bracket\");}\n                                        if(c==\"[\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"]\"],\"bracket\");}\n                                        if(c==\"{\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"}\"],\"bracket\");}\n                                        if(c==\"<\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\">\"],\"bracket\");}\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[stream.eat(c)],\"bracket\");}}\n                                else if(c==\"r\"){\n                                        c=look(stream, 1);\n                                        if(c==\"(\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\")\"],RXstyle,RXmodifiers);}\n                                        if(c==\"[\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"]\"],RXstyle,RXmodifiers);}\n                                        if(c==\"{\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"}\"],RXstyle,RXmodifiers);}\n                                        if(c==\"<\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\">\"],RXstyle,RXmodifiers);}\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}\n                                else if(/[\\^'\"!~\\/(\\[{<]/.test(c)){\n                                        if(c==\"(\"){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[\")\"],\"string\");}\n                                        if(c==\"[\"){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[\"]\"],\"string\");}\n                                        if(c==\"{\"){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[\"}\"],\"string\");}\n                                        if(c==\"<\"){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[\">\"],\"string\");}\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                return tokenChain(stream,state,[stream.eat(c)],\"string\");}}}}\n                if(ch==\"m\"){\n                        var c=look(stream, -2);\n                        if(!(c&&/\\w/.test(c))){\n                                c=stream.eat(/[(\\[{<\\^'\"!~\\/]/);\n                                if(c){\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                return tokenChain(stream,state,[c],RXstyle,RXmodifiers);}\n                                        if(c==\"(\"){\n                                                return tokenChain(stream,state,[\")\"],RXstyle,RXmodifiers);}\n                                        if(c==\"[\"){\n                                                return tokenChain(stream,state,[\"]\"],RXstyle,RXmodifiers);}\n                                        if(c==\"{\"){\n                                                return tokenChain(stream,state,[\"}\"],RXstyle,RXmodifiers);}\n                                        if(c==\"<\"){\n                                                return tokenChain(stream,state,[\">\"],RXstyle,RXmodifiers);}}}}\n                if(ch==\"s\"){\n                        var c=/[\\/>\\]})\\w]/.test(look(stream, -2));\n                        if(!c){\n                                c=stream.eat(/[(\\[{<\\^'\"!~\\/]/);\n                                if(c){\n                                        if(c==\"[\")\n                                                return tokenChain(stream,state,[\"]\",\"]\"],RXstyle,RXmodifiers);\n                                        if(c==\"{\")\n                                                return tokenChain(stream,state,[\"}\",\"}\"],RXstyle,RXmodifiers);\n                                        if(c==\"<\")\n                                                return tokenChain(stream,state,[\">\",\">\"],RXstyle,RXmodifiers);\n                                        if(c==\"(\")\n                                                return tokenChain(stream,state,[\")\",\")\"],RXstyle,RXmodifiers);\n                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}\n                if(ch==\"y\"){\n                        var c=/[\\/>\\]})\\w]/.test(look(stream, -2));\n                        if(!c){\n                                c=stream.eat(/[(\\[{<\\^'\"!~\\/]/);\n                                if(c){\n                                        if(c==\"[\")\n                                                return tokenChain(stream,state,[\"]\",\"]\"],RXstyle,RXmodifiers);\n                                        if(c==\"{\")\n                                                return tokenChain(stream,state,[\"}\",\"}\"],RXstyle,RXmodifiers);\n                                        if(c==\"<\")\n                                                return tokenChain(stream,state,[\">\",\">\"],RXstyle,RXmodifiers);\n                                        if(c==\"(\")\n                                                return tokenChain(stream,state,[\")\",\")\"],RXstyle,RXmodifiers);\n                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}\n                if(ch==\"t\"){\n                        var c=/[\\/>\\]})\\w]/.test(look(stream, -2));\n                        if(!c){\n                                c=stream.eat(\"r\");if(c){\n                                c=stream.eat(/[(\\[{<\\^'\"!~\\/]/);\n                                if(c){\n                                        if(c==\"[\")\n                                                return tokenChain(stream,state,[\"]\",\"]\"],RXstyle,RXmodifiers);\n                                        if(c==\"{\")\n                                                return tokenChain(stream,state,[\"}\",\"}\"],RXstyle,RXmodifiers);\n                                        if(c==\"<\")\n                                                return tokenChain(stream,state,[\">\",\">\"],RXstyle,RXmodifiers);\n                                        if(c==\"(\")\n                                                return tokenChain(stream,state,[\")\",\")\"],RXstyle,RXmodifiers);\n                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}}\n                if(ch==\"`\"){\n                        return tokenChain(stream,state,[ch],\"variable-2\");}\n                if(ch==\"/\"){\n                        if(!/~\\s*$/.test(prefix(stream)))\n                                return \"operator\";\n                        else\n                                return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);}\n                if(ch==\"$\"){\n                        var p=stream.pos;\n                        if(stream.eatWhile(/\\d/)||stream.eat(\"{\")&&stream.eatWhile(/\\d/)&&stream.eat(\"}\"))\n                                return \"variable-2\";\n                        else\n                                stream.pos=p;}\n                if(/[$@%]/.test(ch)){\n                        var p=stream.pos;\n                        if(stream.eat(\"^\")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(look(stream, -2))&&stream.eat(/[=|\\\\\\-#?@;:&`~\\^!\\[\\]*'\"$+.,\\/<>()]/)){\n                                var c=stream.current();\n                                if(PERL[c])\n                                        return \"variable-2\";}\n                        stream.pos=p;}\n                if(/[$@%&]/.test(ch)){\n                        if(stream.eatWhile(/[\\w$]/)||stream.eat(\"{\")&&stream.eatWhile(/[\\w$]/)&&stream.eat(\"}\")){\n                                var c=stream.current();\n                                if(PERL[c])\n                                        return \"variable-2\";\n                                else\n                                        return \"variable\";}}\n                if(ch==\"#\"){\n                        if(look(stream, -2)!=\"$\"){\n                                stream.skipToEnd();\n                                return \"comment\";}}\n                if(/[:+\\-\\^*$&%@=<>!?|\\/~\\.]/.test(ch)){\n                        var p=stream.pos;\n                        stream.eatWhile(/[:+\\-\\^*$&%@=<>!?|\\/~\\.]/);\n                        if(PERL[stream.current()])\n                                return \"operator\";\n                        else\n                                stream.pos=p;}\n                if(ch==\"_\"){\n                        if(stream.pos==1){\n                                if(suffix(stream, 6)==\"_END__\"){\n                                        return tokenChain(stream,state,['\\0'],\"comment\");}\n                                else if(suffix(stream, 7)==\"_DATA__\"){\n                                        return tokenChain(stream,state,['\\0'],\"variable-2\");}\n                                else if(suffix(stream, 7)==\"_C__\"){\n                                        return tokenChain(stream,state,['\\0'],\"string\");}}}\n                if(/\\w/.test(ch)){\n                        var p=stream.pos;\n                        if(look(stream, -2)==\"{\"&&(look(stream, 0)==\"}\"||stream.eatWhile(/\\w/)&&look(stream, 0)==\"}\"))\n                                return \"string\";\n                        else\n                                stream.pos=p;}\n                if(/[A-Z]/.test(ch)){\n                        var l=look(stream, -2);\n                        var p=stream.pos;\n                        stream.eatWhile(/[A-Z_]/);\n                        if(/[\\da-z]/.test(look(stream, 0))){\n                                stream.pos=p;}\n                        else{\n                                var c=PERL[stream.current()];\n                                if(!c)\n                                        return \"meta\";\n                                if(c[1])\n                                        c=c[0];\n                                if(l!=\":\"){\n                                        if(c==1)\n                                                return \"keyword\";\n                                        else if(c==2)\n                                                return \"def\";\n                                        else if(c==3)\n                                                return \"atom\";\n                                        else if(c==4)\n                                                return \"operator\";\n                                        else if(c==5)\n                                                return \"variable-2\";\n                                        else\n                                                return \"meta\";}\n                                else\n                                        return \"meta\";}}\n                if(/[a-zA-Z_]/.test(ch)){\n                        var l=look(stream, -2);\n                        stream.eatWhile(/\\w/);\n                        var c=PERL[stream.current()];\n                        if(!c)\n                                return \"meta\";\n                        if(c[1])\n                                c=c[0];\n                        if(l!=\":\"){\n                                if(c==1)\n                                        return \"keyword\";\n                                else if(c==2)\n                                        return \"def\";\n                                else if(c==3)\n                                        return \"atom\";\n                                else if(c==4)\n                                        return \"operator\";\n                                else if(c==5)\n                                        return \"variable-2\";\n                                else\n                                        return \"meta\";}\n                        else\n                                return \"meta\";}\n                return null;}\n\n        return {\n            startState: function() {\n                return {\n                    tokenize: tokenPerl,\n                    chain: null,\n                    style: null,\n                    tail: null\n                };\n            },\n            token: function(stream, state) {\n                return (state.tokenize || tokenPerl)(stream, state);\n            },\n            lineComment: '#'\n        };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"perl\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/x-perl\", \"perl\");\n\n// it's like \"peek\", but need for look-ahead or look-behind if index < 0\nfunction look(stream, c){\n  return stream.string.charAt(stream.pos+(c||0));\n}\n\n// return a part of prefix of current stream from current position\nfunction prefix(stream, c){\n  if(c){\n    var x=stream.pos-c;\n    return stream.string.substr((x>=0?x:0),c);}\n  else{\n    return stream.string.substr(0,stream.pos-1);\n  }\n}\n\n// return a part of suffix of current stream from current position\nfunction suffix(stream, c){\n  var y=stream.string.length;\n  var x=y-stream.pos+1;\n  return stream.string.substr(stream.pos,(c&&c<y?c:x));\n}\n\n// eating and vomiting a part of stream from current position\nfunction eatSuffix(stream, c){\n  var x=stream.pos+c;\n  var y;\n  if(x<=0)\n    stream.pos=0;\n  else if(x>=(y=stream.string.length-1))\n    stream.pos=y;\n  else\n    stream.pos=x;\n}\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/php/php.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"), require(\"../clike/clike\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\", \"../clike/clike\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function keywords(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  // Helper for phpString\n  function matchSequence(list, end, escapes) {\n    if (list.length == 0) return phpString(end);\n    return function (stream, state) {\n      var patterns = list[0];\n      for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) {\n        state.tokenize = matchSequence(list.slice(1), end);\n        return patterns[i][1];\n      }\n      state.tokenize = phpString(end, escapes);\n      return \"string\";\n    };\n  }\n  function phpString(closing, escapes) {\n    return function(stream, state) { return phpString_(stream, state, closing, escapes); };\n  }\n  function phpString_(stream, state, closing, escapes) {\n    // \"Complex\" syntax\n    if (escapes !== false && stream.match(\"${\", false) || stream.match(\"{$\", false)) {\n      state.tokenize = null;\n      return \"string\";\n    }\n\n    // Simple syntax\n    if (escapes !== false && stream.match(/^\\$[a-zA-Z_][a-zA-Z0-9_]*/)) {\n      // After the variable name there may appear array or object operator.\n      if (stream.match(\"[\", false)) {\n        // Match array operator\n        state.tokenize = matchSequence([\n          [[\"[\", null]],\n          [[/\\d[\\w\\.]*/, \"number\"],\n           [/\\$[a-zA-Z_][a-zA-Z0-9_]*/, \"variable-2\"],\n           [/[\\w\\$]+/, \"variable\"]],\n          [[\"]\", null]]\n        ], closing, escapes);\n      }\n      if (stream.match(/^->\\w/, false)) {\n        // Match object operator\n        state.tokenize = matchSequence([\n          [[\"->\", null]],\n          [[/[\\w]+/, \"variable\"]]\n        ], closing, escapes);\n      }\n      return \"variable-2\";\n    }\n\n    var escaped = false;\n    // Normal string\n    while (!stream.eol() &&\n           (escaped || escapes === false ||\n            (!stream.match(\"{$\", false) &&\n             !stream.match(/^(\\$[a-zA-Z_][a-zA-Z0-9_]*|\\$\\{)/, false)))) {\n      if (!escaped && stream.match(closing)) {\n        state.tokenize = null;\n        state.tokStack.pop(); state.tokStack.pop();\n        break;\n      }\n      escaped = stream.next() == \"\\\\\" && !escaped;\n    }\n    return \"string\";\n  }\n\n  var phpKeywords = \"abstract and array as break case catch class clone const continue declare default \" +\n    \"do else elseif enddeclare endfor endforeach endif endswitch endwhile enum extends final \" +\n    \"for foreach function global goto if implements interface instanceof namespace \" +\n    \"new or private protected public static switch throw trait try use var while xor \" +\n    \"die echo empty exit eval include include_once isset list require require_once return \" +\n    \"print unset __halt_compiler self static parent yield insteadof finally readonly match\";\n  var phpAtoms = \"true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__\";\n  var phpBuiltin = \"func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage memory_get_peak_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count\";\n  CodeMirror.registerHelper(\"hintWords\", \"php\", [phpKeywords, phpAtoms, phpBuiltin].join(\" \").split(\" \"));\n  CodeMirror.registerHelper(\"wordChars\", \"php\", /[\\w$]/);\n\n  var phpConfig = {\n    name: \"clike\",\n    helperType: \"php\",\n    keywords: keywords(phpKeywords),\n    blockKeywords: keywords(\"catch do else elseif for foreach if switch try while finally\"),\n    defKeywords: keywords(\"class enum function interface namespace trait\"),\n    atoms: keywords(phpAtoms),\n    builtin: keywords(phpBuiltin),\n    multiLineStrings: true,\n    hooks: {\n      \"$\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"variable-2\";\n      },\n      \"<\": function(stream, state) {\n        var before;\n        if (before = stream.match(/^<<\\s*/)) {\n          var quoted = stream.eat(/['\"]/);\n          stream.eatWhile(/[\\w\\.]/);\n          var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1));\n          if (quoted) stream.eat(quoted);\n          if (delim) {\n            (state.tokStack || (state.tokStack = [])).push(delim, 0);\n            state.tokenize = phpString(delim, quoted != \"'\");\n            return \"string\";\n          }\n        }\n        return false;\n      },\n      \"#\": function(stream) {\n        while (!stream.eol() && !stream.match(\"?>\", false)) stream.next();\n        return \"comment\";\n      },\n      \"/\": function(stream) {\n        if (stream.eat(\"/\")) {\n          while (!stream.eol() && !stream.match(\"?>\", false)) stream.next();\n          return \"comment\";\n        }\n        return false;\n      },\n      '\"': function(_stream, state) {\n        (state.tokStack || (state.tokStack = [])).push('\"', 0);\n        state.tokenize = phpString('\"');\n        return \"string\";\n      },\n      \"{\": function(_stream, state) {\n        if (state.tokStack && state.tokStack.length)\n          state.tokStack[state.tokStack.length - 1]++;\n        return false;\n      },\n      \"}\": function(_stream, state) {\n        if (state.tokStack && state.tokStack.length > 0 &&\n            !--state.tokStack[state.tokStack.length - 1]) {\n          state.tokenize = phpString(state.tokStack[state.tokStack.length - 2]);\n        }\n        return false;\n      }\n    }\n  };\n\n  CodeMirror.defineMode(\"php\", function(config, parserConfig) {\n    var htmlMode = CodeMirror.getMode(config, (parserConfig && parserConfig.htmlMode) || \"text/html\");\n    var phpMode = CodeMirror.getMode(config, phpConfig);\n\n    function dispatch(stream, state) {\n      var isPHP = state.curMode == phpMode;\n      if (stream.sol() && state.pending && state.pending != '\"' && state.pending != \"'\") state.pending = null;\n      if (!isPHP) {\n        if (stream.match(/^<\\?\\w*/)) {\n          state.curMode = phpMode;\n          if (!state.php) state.php = CodeMirror.startState(phpMode, htmlMode.indent(state.html, \"\", \"\"))\n          state.curState = state.php;\n          return \"meta\";\n        }\n        if (state.pending == '\"' || state.pending == \"'\") {\n          while (!stream.eol() && stream.next() != state.pending) {}\n          var style = \"string\";\n        } else if (state.pending && stream.pos < state.pending.end) {\n          stream.pos = state.pending.end;\n          var style = state.pending.style;\n        } else {\n          var style = htmlMode.token(stream, state.curState);\n        }\n        if (state.pending) state.pending = null;\n        var cur = stream.current(), openPHP = cur.search(/<\\?/), m;\n        if (openPHP != -1) {\n          if (style == \"string\" && (m = cur.match(/[\\'\\\"]$/)) && !/\\?>/.test(cur)) state.pending = m[0];\n          else state.pending = {end: stream.pos, style: style};\n          stream.backUp(cur.length - openPHP);\n        }\n        return style;\n      } else if (isPHP && state.php.tokenize == null && stream.match(\"?>\")) {\n        state.curMode = htmlMode;\n        state.curState = state.html;\n        if (!state.php.context.prev) state.php = null;\n        return \"meta\";\n      } else {\n        return phpMode.token(stream, state.curState);\n      }\n    }\n\n    return {\n      startState: function() {\n        var html = CodeMirror.startState(htmlMode)\n        var php = parserConfig.startOpen ? CodeMirror.startState(phpMode) : null\n        return {html: html,\n                php: php,\n                curMode: parserConfig.startOpen ? phpMode : htmlMode,\n                curState: parserConfig.startOpen ? php : html,\n                pending: null};\n      },\n\n      copyState: function(state) {\n        var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html),\n            php = state.php, phpNew = php && CodeMirror.copyState(phpMode, php), cur;\n        if (state.curMode == htmlMode) cur = htmlNew;\n        else cur = phpNew;\n        return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur,\n                pending: state.pending};\n      },\n\n      token: dispatch,\n\n      indent: function(state, textAfter, line) {\n        if ((state.curMode != phpMode && /^\\s*<\\//.test(textAfter)) ||\n            (state.curMode == phpMode && /^\\?>/.test(textAfter)))\n          return htmlMode.indent(state.html, textAfter, line);\n        return state.curMode.indent(state.curState, textAfter, line);\n      },\n\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      lineComment: \"//\",\n\n      innerMode: function(state) { return {state: state.curState, mode: state.curMode}; }\n    };\n  }, \"htmlmixed\", \"clike\");\n\n  CodeMirror.defineMIME(\"application/x-httpd-php\", \"php\");\n  CodeMirror.defineMIME(\"application/x-httpd-php-open\", {name: \"php\", startOpen: true});\n  CodeMirror.defineMIME(\"text/x-php\", phpConfig);\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/pig/pig.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\n *      Pig Latin Mode for CodeMirror 2\n *      @author Prasanth Jayachandran\n *      @link   https://github.com/prasanthj/pig-codemirror-2\n *  This implementation is adapted from PL/SQL mode in CodeMirror 2.\n */\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"pig\", function(_config, parserConfig) {\n  var keywords = parserConfig.keywords,\n  builtins = parserConfig.builtins,\n  types = parserConfig.types,\n  multiLineStrings = parserConfig.multiLineStrings;\n\n  var isOperatorChar = /[*+\\-%<>=&?:\\/!|]/;\n\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n\n  function tokenComment(stream, state) {\n    var isEnd = false;\n    var ch;\n    while(ch = stream.next()) {\n      if(ch == \"/\" && isEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      isEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n          end = true; break;\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = tokenBase;\n      return \"error\";\n    };\n  }\n\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n\n    // is a start of string?\n    if (ch == '\"' || ch == \"'\")\n      return chain(stream, state, tokenString(ch));\n    // is it one of the special chars\n    else if(/[\\[\\]{}\\(\\),;\\.]/.test(ch))\n      return null;\n    // is it a number?\n    else if(/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    // multi line comment or operator\n    else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        return chain(stream, state, tokenComment);\n      }\n      else {\n        stream.eatWhile(isOperatorChar);\n        return \"operator\";\n      }\n    }\n    // single line comment or operator\n    else if (ch==\"-\") {\n      if(stream.eat(\"-\")){\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      else {\n        stream.eatWhile(isOperatorChar);\n        return \"operator\";\n      }\n    }\n    // is it an operator\n    else if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    else {\n      // get the while word\n      stream.eatWhile(/[\\w\\$_]/);\n      // is it one of the listed keywords?\n      if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) {\n        //keywords can be used as variables like flatten(group), group.$0 etc..\n        if (!stream.eat(\")\") && !stream.eat(\".\"))\n          return \"keyword\";\n      }\n      // is it one of the builtin functions?\n      if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase()))\n        return \"variable-2\";\n      // is it one of the listed types?\n      if (types && types.propertyIsEnumerable(stream.current().toUpperCase()))\n        return \"variable-3\";\n      // default is a 'variable'\n      return \"variable\";\n    }\n  }\n\n  // Interface\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n      if(stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      return style;\n    }\n  };\n});\n\n(function() {\n  function keywords(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  // builtin funcs taken from trunk revision 1303237\n  var pBuiltins = \"ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL \"\n    + \"CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS \"\n    + \"DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG \"\n    + \"FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN \"\n    + \"INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER \"\n    + \"ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS \"\n    + \"LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA  \"\n    + \"PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE \"\n    + \"SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG \"\n    + \"TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER \";\n\n  // taken from QueryLexer.g\n  var pKeywords = \"VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP \"\n    + \"JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL \"\n    + \"PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE \"\n    + \"SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE \"\n    + \"NEQ MATCHES TRUE FALSE DUMP\";\n\n  // data types\n  var pTypes = \"BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP \";\n\n  CodeMirror.defineMIME(\"text/x-pig\", {\n    name: \"pig\",\n    builtins: keywords(pBuiltins),\n    keywords: keywords(pKeywords),\n    types: keywords(pTypes)\n  });\n\n  CodeMirror.registerHelper(\"hintWords\", \"pig\", (pBuiltins + pTypes + pKeywords).split(\" \"));\n}());\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/powershell/powershell.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  'use strict';\n  if (typeof exports == 'object' && typeof module == 'object') // CommonJS\n    mod(require('../../lib/codemirror'));\n  else if (typeof define == 'function' && define.amd) // AMD\n    define(['../../lib/codemirror'], mod);\n  else // Plain browser env\n    mod(window.CodeMirror);\n})(function(CodeMirror) {\n'use strict';\n\nCodeMirror.defineMode('powershell', function() {\n  function buildRegexp(patterns, options) {\n    options = options || {};\n    var prefix = options.prefix !== undefined ? options.prefix : '^';\n    var suffix = options.suffix !== undefined ? options.suffix : '\\\\b';\n\n    for (var i = 0; i < patterns.length; i++) {\n      if (patterns[i] instanceof RegExp) {\n        patterns[i] = patterns[i].source;\n      }\n      else {\n        patterns[i] = patterns[i].replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n      }\n    }\n\n    return new RegExp(prefix + '(' + patterns.join('|') + ')' + suffix, 'i');\n  }\n\n  var notCharacterOrDash = '(?=[^A-Za-z\\\\d\\\\-_]|$)';\n  var varNames = /[\\w\\-:]/\n  var keywords = buildRegexp([\n    /begin|break|catch|continue|data|default|do|dynamicparam/,\n    /else|elseif|end|exit|filter|finally|for|foreach|from|function|if|in/,\n    /param|process|return|switch|throw|trap|try|until|where|while/\n  ], { suffix: notCharacterOrDash });\n\n  var punctuation = /[\\[\\]{},;`\\\\\\.]|@[({]/;\n  var wordOperators = buildRegexp([\n    'f',\n    /b?not/,\n    /[ic]?split/, 'join',\n    /is(not)?/, 'as',\n    /[ic]?(eq|ne|[gl][te])/,\n    /[ic]?(not)?(like|match|contains)/,\n    /[ic]?replace/,\n    /b?(and|or|xor)/\n  ], { prefix: '-' });\n  var symbolOperators = /[+\\-*\\/%]=|\\+\\+|--|\\.\\.|[+\\-*&^%:=!|\\/]|<(?!#)|(?!#)>/;\n  var operators = buildRegexp([wordOperators, symbolOperators], { suffix: '' });\n\n  var numbers = /^((0x[\\da-f]+)|((\\d+\\.\\d+|\\d\\.|\\.\\d+|\\d+)(e[\\+\\-]?\\d+)?))[ld]?([kmgtp]b)?/i;\n\n  var identifiers = /^[A-Za-z\\_][A-Za-z\\-\\_\\d]*\\b/;\n\n  var symbolBuiltins = /[A-Z]:|%|\\?/i;\n  var namedBuiltins = buildRegexp([\n    /Add-(Computer|Content|History|Member|PSSnapin|Type)/,\n    /Checkpoint-Computer/,\n    /Clear-(Content|EventLog|History|Host|Item(Property)?|Variable)/,\n    /Compare-Object/,\n    /Complete-Transaction/,\n    /Connect-PSSession/,\n    /ConvertFrom-(Csv|Json|SecureString|StringData)/,\n    /Convert-Path/,\n    /ConvertTo-(Csv|Html|Json|SecureString|Xml)/,\n    /Copy-Item(Property)?/,\n    /Debug-Process/,\n    /Disable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/,\n    /Disconnect-PSSession/,\n    /Enable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/,\n    /(Enter|Exit)-PSSession/,\n    /Export-(Alias|Clixml|Console|Counter|Csv|FormatData|ModuleMember|PSSession)/,\n    /ForEach-Object/,\n    /Format-(Custom|List|Table|Wide)/,\n    new RegExp('Get-(Acl|Alias|AuthenticodeSignature|ChildItem|Command|ComputerRestorePoint|Content|ControlPanelItem|Counter|Credential'\n      + '|Culture|Date|Event|EventLog|EventSubscriber|ExecutionPolicy|FormatData|Help|History|Host|HotFix|Item|ItemProperty|Job'\n      + '|Location|Member|Module|PfxCertificate|Process|PSBreakpoint|PSCallStack|PSDrive|PSProvider|PSSession|PSSessionConfiguration'\n      + '|PSSnapin|Random|Service|TraceSource|Transaction|TypeData|UICulture|Unique|Variable|Verb|WinEvent|WmiObject)'),\n    /Group-Object/,\n    /Import-(Alias|Clixml|Counter|Csv|LocalizedData|Module|PSSession)/,\n    /ImportSystemModules/,\n    /Invoke-(Command|Expression|History|Item|RestMethod|WebRequest|WmiMethod)/,\n    /Join-Path/,\n    /Limit-EventLog/,\n    /Measure-(Command|Object)/,\n    /Move-Item(Property)?/,\n    new RegExp('New-(Alias|Event|EventLog|Item(Property)?|Module|ModuleManifest|Object|PSDrive|PSSession|PSSessionConfigurationFile'\n      + '|PSSessionOption|PSTransportOption|Service|TimeSpan|Variable|WebServiceProxy|WinEvent)'),\n    /Out-(Default|File|GridView|Host|Null|Printer|String)/,\n    /Pause/,\n    /(Pop|Push)-Location/,\n    /Read-Host/,\n    /Receive-(Job|PSSession)/,\n    /Register-(EngineEvent|ObjectEvent|PSSessionConfiguration|WmiEvent)/,\n    /Remove-(Computer|Event|EventLog|Item(Property)?|Job|Module|PSBreakpoint|PSDrive|PSSession|PSSnapin|TypeData|Variable|WmiObject)/,\n    /Rename-(Computer|Item(Property)?)/,\n    /Reset-ComputerMachinePassword/,\n    /Resolve-Path/,\n    /Restart-(Computer|Service)/,\n    /Restore-Computer/,\n    /Resume-(Job|Service)/,\n    /Save-Help/,\n    /Select-(Object|String|Xml)/,\n    /Send-MailMessage/,\n    new RegExp('Set-(Acl|Alias|AuthenticodeSignature|Content|Date|ExecutionPolicy|Item(Property)?|Location|PSBreakpoint|PSDebug' +\n               '|PSSessionConfiguration|Service|StrictMode|TraceSource|Variable|WmiInstance)'),\n    /Show-(Command|ControlPanelItem|EventLog)/,\n    /Sort-Object/,\n    /Split-Path/,\n    /Start-(Job|Process|Service|Sleep|Transaction|Transcript)/,\n    /Stop-(Computer|Job|Process|Service|Transcript)/,\n    /Suspend-(Job|Service)/,\n    /TabExpansion2/,\n    /Tee-Object/,\n    /Test-(ComputerSecureChannel|Connection|ModuleManifest|Path|PSSessionConfigurationFile)/,\n    /Trace-Command/,\n    /Unblock-File/,\n    /Undo-Transaction/,\n    /Unregister-(Event|PSSessionConfiguration)/,\n    /Update-(FormatData|Help|List|TypeData)/,\n    /Use-Transaction/,\n    /Wait-(Event|Job|Process)/,\n    /Where-Object/,\n    /Write-(Debug|Error|EventLog|Host|Output|Progress|Verbose|Warning)/,\n    /cd|help|mkdir|more|oss|prompt/,\n    /ac|asnp|cat|cd|chdir|clc|clear|clhy|cli|clp|cls|clv|cnsn|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|dnsn|ebp/,\n    /echo|epal|epcsv|epsn|erase|etsn|exsn|fc|fl|foreach|ft|fw|gal|gbp|gc|gci|gcm|gcs|gdr|ghy|gi|gjb|gl|gm|gmo|gp|gps/,\n    /group|gsn|gsnp|gsv|gu|gv|gwmi|h|history|icm|iex|ihy|ii|ipal|ipcsv|ipmo|ipsn|irm|ise|iwmi|iwr|kill|lp|ls|man|md/,\n    /measure|mi|mount|move|mp|mv|nal|ndr|ni|nmo|npssc|nsn|nv|ogv|oh|popd|ps|pushd|pwd|r|rbp|rcjb|rcsn|rd|rdr|ren|ri/,\n    /rjb|rm|rmdir|rmo|rni|rnp|rp|rsn|rsnp|rujb|rv|rvpa|rwmi|sajb|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls/,\n    /sort|sp|spjb|spps|spsv|start|sujb|sv|swmi|tee|trcm|type|where|wjb|write/\n  ], { prefix: '', suffix: '' });\n  var variableBuiltins = buildRegexp([\n    /[$?^_]|Args|ConfirmPreference|ConsoleFileName|DebugPreference|Error|ErrorActionPreference|ErrorView|ExecutionContext/,\n    /FormatEnumerationLimit|Home|Host|Input|MaximumAliasCount|MaximumDriveCount|MaximumErrorCount|MaximumFunctionCount/,\n    /MaximumHistoryCount|MaximumVariableCount|MyInvocation|NestedPromptLevel|OutputEncoding|Pid|Profile|ProgressPreference/,\n    /PSBoundParameters|PSCommandPath|PSCulture|PSDefaultParameterValues|PSEmailServer|PSHome|PSScriptRoot|PSSessionApplicationName/,\n    /PSSessionConfigurationName|PSSessionOption|PSUICulture|PSVersionTable|Pwd|ShellId|StackTrace|VerbosePreference/,\n    /WarningPreference|WhatIfPreference/,\n\n    /Event|EventArgs|EventSubscriber|Sender/,\n    /Matches|Ofs|ForEach|LastExitCode|PSCmdlet|PSItem|PSSenderInfo|This/,\n    /true|false|null/\n  ], { prefix: '\\\\$', suffix: '' });\n\n  var builtins = buildRegexp([symbolBuiltins, namedBuiltins, variableBuiltins], { suffix: notCharacterOrDash });\n\n  var grammar = {\n    keyword: keywords,\n    number: numbers,\n    operator: operators,\n    builtin: builtins,\n    punctuation: punctuation,\n    identifier: identifiers\n  };\n\n  // tokenizers\n  function tokenBase(stream, state) {\n    // Handle Comments\n    //var ch = stream.peek();\n\n    var parent = state.returnStack[state.returnStack.length - 1];\n    if (parent && parent.shouldReturnFrom(state)) {\n      state.tokenize = parent.tokenize;\n      state.returnStack.pop();\n      return state.tokenize(stream, state);\n    }\n\n    if (stream.eatSpace()) {\n      return null;\n    }\n\n    if (stream.eat('(')) {\n      state.bracketNesting += 1;\n      return 'punctuation';\n    }\n\n    if (stream.eat(')')) {\n      state.bracketNesting -= 1;\n      return 'punctuation';\n    }\n\n    for (var key in grammar) {\n      if (stream.match(grammar[key])) {\n        return key;\n      }\n    }\n\n    var ch = stream.next();\n\n    // single-quote string\n    if (ch === \"'\") {\n      return tokenSingleQuoteString(stream, state);\n    }\n\n    if (ch === '$') {\n      return tokenVariable(stream, state);\n    }\n\n    // double-quote string\n    if (ch === '\"') {\n      return tokenDoubleQuoteString(stream, state);\n    }\n\n    if (ch === '<' && stream.eat('#')) {\n      state.tokenize = tokenComment;\n      return tokenComment(stream, state);\n    }\n\n    if (ch === '#') {\n      stream.skipToEnd();\n      return 'comment';\n    }\n\n    if (ch === '@') {\n      var quoteMatch = stream.eat(/[\"']/);\n      if (quoteMatch && stream.eol()) {\n        state.tokenize = tokenMultiString;\n        state.startQuote = quoteMatch[0];\n        return tokenMultiString(stream, state);\n      } else if (stream.eol()) {\n        return 'error';\n      } else if (stream.peek().match(/[({]/)) {\n        return 'punctuation';\n      } else if (stream.peek().match(varNames)) {\n        // splatted variable\n        return tokenVariable(stream, state);\n      }\n    }\n    return 'error';\n  }\n\n  function tokenSingleQuoteString(stream, state) {\n    var ch;\n    while ((ch = stream.peek()) != null) {\n      stream.next();\n\n      if (ch === \"'\" && !stream.eat(\"'\")) {\n        state.tokenize = tokenBase;\n        return 'string';\n      }\n    }\n\n    return 'error';\n  }\n\n  function tokenDoubleQuoteString(stream, state) {\n    var ch;\n    while ((ch = stream.peek()) != null) {\n      if (ch === '$') {\n        state.tokenize = tokenStringInterpolation;\n        return 'string';\n      }\n\n      stream.next();\n      if (ch === '`') {\n        stream.next();\n        continue;\n      }\n\n      if (ch === '\"' && !stream.eat('\"')) {\n        state.tokenize = tokenBase;\n        return 'string';\n      }\n    }\n\n    return 'error';\n  }\n\n  function tokenStringInterpolation(stream, state) {\n    return tokenInterpolation(stream, state, tokenDoubleQuoteString);\n  }\n\n  function tokenMultiStringReturn(stream, state) {\n    state.tokenize = tokenMultiString;\n    state.startQuote = '\"'\n    return tokenMultiString(stream, state);\n  }\n\n  function tokenHereStringInterpolation(stream, state) {\n    return tokenInterpolation(stream, state, tokenMultiStringReturn);\n  }\n\n  function tokenInterpolation(stream, state, parentTokenize) {\n    if (stream.match('$(')) {\n      var savedBracketNesting = state.bracketNesting;\n      state.returnStack.push({\n        /*jshint loopfunc:true */\n        shouldReturnFrom: function(state) {\n          return state.bracketNesting === savedBracketNesting;\n        },\n        tokenize: parentTokenize\n      });\n      state.tokenize = tokenBase;\n      state.bracketNesting += 1;\n      return 'punctuation';\n    } else {\n      stream.next();\n      state.returnStack.push({\n        shouldReturnFrom: function() { return true; },\n        tokenize: parentTokenize\n      });\n      state.tokenize = tokenVariable;\n      return state.tokenize(stream, state);\n    }\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while ((ch = stream.next()) != null) {\n      if (maybeEnd && ch == '>') {\n          state.tokenize = tokenBase;\n          break;\n      }\n      maybeEnd = (ch === '#');\n    }\n    return 'comment';\n  }\n\n  function tokenVariable(stream, state) {\n    var ch = stream.peek();\n    if (stream.eat('{')) {\n      state.tokenize = tokenVariableWithBraces;\n      return tokenVariableWithBraces(stream, state);\n    } else if (ch != undefined && ch.match(varNames)) {\n      stream.eatWhile(varNames);\n      state.tokenize = tokenBase;\n      return 'variable-2';\n    } else {\n      state.tokenize = tokenBase;\n      return 'error';\n    }\n  }\n\n  function tokenVariableWithBraces(stream, state) {\n    var ch;\n    while ((ch = stream.next()) != null) {\n      if (ch === '}') {\n        state.tokenize = tokenBase;\n        break;\n      }\n    }\n    return 'variable-2';\n  }\n\n  function tokenMultiString(stream, state) {\n    var quote = state.startQuote;\n    if (stream.sol() && stream.match(new RegExp(quote + '@'))) {\n      state.tokenize = tokenBase;\n    }\n    else if (quote === '\"') {\n      while (!stream.eol()) {\n        var ch = stream.peek();\n        if (ch === '$') {\n          state.tokenize = tokenHereStringInterpolation;\n          return 'string';\n        }\n\n        stream.next();\n        if (ch === '`') {\n          stream.next();\n        }\n      }\n    }\n    else {\n      stream.skipToEnd();\n    }\n\n    return 'string';\n  }\n\n  var external = {\n    startState: function() {\n      return {\n        returnStack: [],\n        bracketNesting: 0,\n        tokenize: tokenBase\n      };\n    },\n\n    token: function(stream, state) {\n      return state.tokenize(stream, state);\n    },\n\n    blockCommentStart: '<#',\n    blockCommentEnd: '#>',\n    lineComment: '#',\n    fold: 'brace'\n  };\n  return external;\n});\n\nCodeMirror.defineMIME('application/x-powershell', 'powershell');\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/properties/properties.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"properties\", function() {\n  return {\n    token: function(stream, state) {\n      var sol = stream.sol() || state.afterSection;\n      var eol = stream.eol();\n\n      state.afterSection = false;\n\n      if (sol) {\n        if (state.nextMultiline) {\n          state.inMultiline = true;\n          state.nextMultiline = false;\n        } else {\n          state.position = \"def\";\n        }\n      }\n\n      if (eol && ! state.nextMultiline) {\n        state.inMultiline = false;\n        state.position = \"def\";\n      }\n\n      if (sol) {\n        while(stream.eatSpace()) {}\n      }\n\n      var ch = stream.next();\n\n      if (sol && (ch === \"#\" || ch === \"!\" || ch === \";\")) {\n        state.position = \"comment\";\n        stream.skipToEnd();\n        return \"comment\";\n      } else if (sol && ch === \"[\") {\n        state.afterSection = true;\n        stream.skipTo(\"]\"); stream.eat(\"]\");\n        return \"header\";\n      } else if (ch === \"=\" || ch === \":\") {\n        state.position = \"quote\";\n        return null;\n      } else if (ch === \"\\\\\" && state.position === \"quote\") {\n        if (stream.eol()) {  // end of line?\n          // Multiline value\n          state.nextMultiline = true;\n        }\n      }\n\n      return state.position;\n    },\n\n    startState: function() {\n      return {\n        position : \"def\",       // Current position, \"def\", \"quote\" or \"comment\"\n        nextMultiline : false,  // Is the next line multiline value\n        inMultiline : false,    // Is the current line a multiline value\n        afterSection : false    // Did we just open a section\n      };\n    }\n\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-properties\", \"properties\");\nCodeMirror.defineMIME(\"text/x-ini\", \"properties\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/protobuf/protobuf.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\", \"i\");\n  };\n\n  var keywordArray = [\n    \"package\", \"message\", \"import\", \"syntax\",\n    \"required\", \"optional\", \"repeated\", \"reserved\", \"default\", \"extensions\", \"packed\",\n    \"bool\", \"bytes\", \"double\", \"enum\", \"float\", \"string\",\n    \"int32\", \"int64\", \"uint32\", \"uint64\", \"sint32\", \"sint64\", \"fixed32\", \"fixed64\", \"sfixed32\", \"sfixed64\",\n    \"option\", \"service\", \"rpc\", \"returns\"\n  ];\n  var keywords = wordRegexp(keywordArray);\n\n  CodeMirror.registerHelper(\"hintWords\", \"protobuf\", keywordArray);\n\n  var identifiers = new RegExp(\"^[_A-Za-z\\xa1-\\uffff][_A-Za-z0-9\\xa1-\\uffff]*\");\n\n  function tokenBase(stream) {\n    // whitespaces\n    if (stream.eatSpace()) return null;\n\n    // Handle one line Comments\n    if (stream.match(\"//\")) {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n\n    // Handle Number Literals\n    if (stream.match(/^[0-9\\.+-]/, false)) {\n      if (stream.match(/^[+-]?0x[0-9a-fA-F]+/))\n        return \"number\";\n      if (stream.match(/^[+-]?\\d*\\.\\d+([EeDd][+-]?\\d+)?/))\n        return \"number\";\n      if (stream.match(/^[+-]?\\d+([EeDd][+-]?\\d+)?/))\n        return \"number\";\n    }\n\n    // Handle Strings\n    if (stream.match(/^\"([^\"]|(\"\"))*\"/)) { return \"string\"; }\n    if (stream.match(/^'([^']|(''))*'/)) { return \"string\"; }\n\n    // Handle words\n    if (stream.match(keywords)) { return \"keyword\"; }\n    if (stream.match(identifiers)) { return \"variable\"; } ;\n\n    // Handle non-detected items\n    stream.next();\n    return null;\n  };\n\n  CodeMirror.defineMode(\"protobuf\", function() {\n    return {\n      token: tokenBase,\n      fold: \"brace\"\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-protobuf\", \"protobuf\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/pug/pug.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../javascript/javascript\"), require(\"../css/css\"), require(\"../htmlmixed/htmlmixed\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../javascript/javascript\", \"../css/css\", \"../htmlmixed/htmlmixed\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"pug\", function (config) {\n  // token types\n  var KEYWORD = 'keyword';\n  var DOCTYPE = 'meta';\n  var ID = 'builtin';\n  var CLASS = 'qualifier';\n\n  var ATTRS_NEST = {\n    '{': '}',\n    '(': ')',\n    '[': ']'\n  };\n\n  var jsMode = CodeMirror.getMode(config, 'javascript');\n\n  function State() {\n    this.javaScriptLine = false;\n    this.javaScriptLineExcludesColon = false;\n\n    this.javaScriptArguments = false;\n    this.javaScriptArgumentsDepth = 0;\n\n    this.isInterpolating = false;\n    this.interpolationNesting = 0;\n\n    this.jsState = CodeMirror.startState(jsMode);\n\n    this.restOfLine = '';\n\n    this.isIncludeFiltered = false;\n    this.isEach = false;\n\n    this.lastTag = '';\n    this.scriptType = '';\n\n    // Attributes Mode\n    this.isAttrs = false;\n    this.attrsNest = [];\n    this.inAttributeName = true;\n    this.attributeIsType = false;\n    this.attrValue = '';\n\n    // Indented Mode\n    this.indentOf = Infinity;\n    this.indentToken = '';\n\n    this.innerMode = null;\n    this.innerState = null;\n\n    this.innerModeForLine = false;\n  }\n  /**\n   * Safely copy a state\n   *\n   * @return {State}\n   */\n  State.prototype.copy = function () {\n    var res = new State();\n    res.javaScriptLine = this.javaScriptLine;\n    res.javaScriptLineExcludesColon = this.javaScriptLineExcludesColon;\n    res.javaScriptArguments = this.javaScriptArguments;\n    res.javaScriptArgumentsDepth = this.javaScriptArgumentsDepth;\n    res.isInterpolating = this.isInterpolating;\n    res.interpolationNesting = this.interpolationNesting;\n\n    res.jsState = CodeMirror.copyState(jsMode, this.jsState);\n\n    res.innerMode = this.innerMode;\n    if (this.innerMode && this.innerState) {\n      res.innerState = CodeMirror.copyState(this.innerMode, this.innerState);\n    }\n\n    res.restOfLine = this.restOfLine;\n\n    res.isIncludeFiltered = this.isIncludeFiltered;\n    res.isEach = this.isEach;\n    res.lastTag = this.lastTag;\n    res.scriptType = this.scriptType;\n    res.isAttrs = this.isAttrs;\n    res.attrsNest = this.attrsNest.slice();\n    res.inAttributeName = this.inAttributeName;\n    res.attributeIsType = this.attributeIsType;\n    res.attrValue = this.attrValue;\n    res.indentOf = this.indentOf;\n    res.indentToken = this.indentToken;\n\n    res.innerModeForLine = this.innerModeForLine;\n\n    return res;\n  };\n\n  function javaScript(stream, state) {\n    if (stream.sol()) {\n      // if javaScriptLine was set at end of line, ignore it\n      state.javaScriptLine = false;\n      state.javaScriptLineExcludesColon = false;\n    }\n    if (state.javaScriptLine) {\n      if (state.javaScriptLineExcludesColon && stream.peek() === ':') {\n        state.javaScriptLine = false;\n        state.javaScriptLineExcludesColon = false;\n        return;\n      }\n      var tok = jsMode.token(stream, state.jsState);\n      if (stream.eol()) state.javaScriptLine = false;\n      return tok || true;\n    }\n  }\n  function javaScriptArguments(stream, state) {\n    if (state.javaScriptArguments) {\n      if (state.javaScriptArgumentsDepth === 0 && stream.peek() !== '(') {\n        state.javaScriptArguments = false;\n        return;\n      }\n      if (stream.peek() === '(') {\n        state.javaScriptArgumentsDepth++;\n      } else if (stream.peek() === ')') {\n        state.javaScriptArgumentsDepth--;\n      }\n      if (state.javaScriptArgumentsDepth === 0) {\n        state.javaScriptArguments = false;\n        return;\n      }\n\n      var tok = jsMode.token(stream, state.jsState);\n      return tok || true;\n    }\n  }\n\n  function yieldStatement(stream) {\n    if (stream.match(/^yield\\b/)) {\n        return 'keyword';\n    }\n  }\n\n  function doctype(stream) {\n    if (stream.match(/^(?:doctype) *([^\\n]+)?/)) {\n        return DOCTYPE;\n    }\n  }\n\n  function interpolation(stream, state) {\n    if (stream.match('#{')) {\n      state.isInterpolating = true;\n      state.interpolationNesting = 0;\n      return 'punctuation';\n    }\n  }\n\n  function interpolationContinued(stream, state) {\n    if (state.isInterpolating) {\n      if (stream.peek() === '}') {\n        state.interpolationNesting--;\n        if (state.interpolationNesting < 0) {\n          stream.next();\n          state.isInterpolating = false;\n          return 'punctuation';\n        }\n      } else if (stream.peek() === '{') {\n        state.interpolationNesting++;\n      }\n      return jsMode.token(stream, state.jsState) || true;\n    }\n  }\n\n  function caseStatement(stream, state) {\n    if (stream.match(/^case\\b/)) {\n      state.javaScriptLine = true;\n      return KEYWORD;\n    }\n  }\n\n  function when(stream, state) {\n    if (stream.match(/^when\\b/)) {\n      state.javaScriptLine = true;\n      state.javaScriptLineExcludesColon = true;\n      return KEYWORD;\n    }\n  }\n\n  function defaultStatement(stream) {\n    if (stream.match(/^default\\b/)) {\n      return KEYWORD;\n    }\n  }\n\n  function extendsStatement(stream, state) {\n    if (stream.match(/^extends?\\b/)) {\n      state.restOfLine = 'string';\n      return KEYWORD;\n    }\n  }\n\n  function append(stream, state) {\n    if (stream.match(/^append\\b/)) {\n      state.restOfLine = 'variable';\n      return KEYWORD;\n    }\n  }\n  function prepend(stream, state) {\n    if (stream.match(/^prepend\\b/)) {\n      state.restOfLine = 'variable';\n      return KEYWORD;\n    }\n  }\n  function block(stream, state) {\n    if (stream.match(/^block\\b *(?:(prepend|append)\\b)?/)) {\n      state.restOfLine = 'variable';\n      return KEYWORD;\n    }\n  }\n\n  function include(stream, state) {\n    if (stream.match(/^include\\b/)) {\n      state.restOfLine = 'string';\n      return KEYWORD;\n    }\n  }\n\n  function includeFiltered(stream, state) {\n    if (stream.match(/^include:([a-zA-Z0-9\\-]+)/, false) && stream.match('include')) {\n      state.isIncludeFiltered = true;\n      return KEYWORD;\n    }\n  }\n\n  function includeFilteredContinued(stream, state) {\n    if (state.isIncludeFiltered) {\n      var tok = filter(stream, state);\n      state.isIncludeFiltered = false;\n      state.restOfLine = 'string';\n      return tok;\n    }\n  }\n\n  function mixin(stream, state) {\n    if (stream.match(/^mixin\\b/)) {\n      state.javaScriptLine = true;\n      return KEYWORD;\n    }\n  }\n\n  function call(stream, state) {\n    if (stream.match(/^\\+([-\\w]+)/)) {\n      if (!stream.match(/^\\( *[-\\w]+ *=/, false)) {\n        state.javaScriptArguments = true;\n        state.javaScriptArgumentsDepth = 0;\n      }\n      return 'variable';\n    }\n    if (stream.match('+#{', false)) {\n      stream.next();\n      state.mixinCallAfter = true;\n      return interpolation(stream, state);\n    }\n  }\n  function callArguments(stream, state) {\n    if (state.mixinCallAfter) {\n      state.mixinCallAfter = false;\n      if (!stream.match(/^\\( *[-\\w]+ *=/, false)) {\n        state.javaScriptArguments = true;\n        state.javaScriptArgumentsDepth = 0;\n      }\n      return true;\n    }\n  }\n\n  function conditional(stream, state) {\n    if (stream.match(/^(if|unless|else if|else)\\b/)) {\n      state.javaScriptLine = true;\n      return KEYWORD;\n    }\n  }\n\n  function each(stream, state) {\n    if (stream.match(/^(- *)?(each|for)\\b/)) {\n      state.isEach = true;\n      return KEYWORD;\n    }\n  }\n  function eachContinued(stream, state) {\n    if (state.isEach) {\n      if (stream.match(/^ in\\b/)) {\n        state.javaScriptLine = true;\n        state.isEach = false;\n        return KEYWORD;\n      } else if (stream.sol() || stream.eol()) {\n        state.isEach = false;\n      } else if (stream.next()) {\n        while (!stream.match(/^ in\\b/, false) && stream.next());\n        return 'variable';\n      }\n    }\n  }\n\n  function whileStatement(stream, state) {\n    if (stream.match(/^while\\b/)) {\n      state.javaScriptLine = true;\n      return KEYWORD;\n    }\n  }\n\n  function tag(stream, state) {\n    var captures;\n    if (captures = stream.match(/^(\\w(?:[-:\\w]*\\w)?)\\/?/)) {\n      state.lastTag = captures[1].toLowerCase();\n      if (state.lastTag === 'script') {\n        state.scriptType = 'application/javascript';\n      }\n      return 'tag';\n    }\n  }\n\n  function filter(stream, state) {\n    if (stream.match(/^:([\\w\\-]+)/)) {\n      var innerMode;\n      if (config && config.innerModes) {\n        innerMode = config.innerModes(stream.current().substring(1));\n      }\n      if (!innerMode) {\n        innerMode = stream.current().substring(1);\n      }\n      if (typeof innerMode === 'string') {\n        innerMode = CodeMirror.getMode(config, innerMode);\n      }\n      setInnerMode(stream, state, innerMode);\n      return 'atom';\n    }\n  }\n\n  function code(stream, state) {\n    if (stream.match(/^(!?=|-)/)) {\n      state.javaScriptLine = true;\n      return 'punctuation';\n    }\n  }\n\n  function id(stream) {\n    if (stream.match(/^#([\\w-]+)/)) {\n      return ID;\n    }\n  }\n\n  function className(stream) {\n    if (stream.match(/^\\.([\\w-]+)/)) {\n      return CLASS;\n    }\n  }\n\n  function attrs(stream, state) {\n    if (stream.peek() == '(') {\n      stream.next();\n      state.isAttrs = true;\n      state.attrsNest = [];\n      state.inAttributeName = true;\n      state.attrValue = '';\n      state.attributeIsType = false;\n      return 'punctuation';\n    }\n  }\n\n  function attrsContinued(stream, state) {\n    if (state.isAttrs) {\n      if (ATTRS_NEST[stream.peek()]) {\n        state.attrsNest.push(ATTRS_NEST[stream.peek()]);\n      }\n      if (state.attrsNest[state.attrsNest.length - 1] === stream.peek()) {\n        state.attrsNest.pop();\n      } else  if (stream.eat(')')) {\n        state.isAttrs = false;\n        return 'punctuation';\n      }\n      if (state.inAttributeName && stream.match(/^[^=,\\)!]+/)) {\n        if (stream.peek() === '=' || stream.peek() === '!') {\n          state.inAttributeName = false;\n          state.jsState = CodeMirror.startState(jsMode);\n          if (state.lastTag === 'script' && stream.current().trim().toLowerCase() === 'type') {\n            state.attributeIsType = true;\n          } else {\n            state.attributeIsType = false;\n          }\n        }\n        return 'attribute';\n      }\n\n      var tok = jsMode.token(stream, state.jsState);\n      if (state.attributeIsType && tok === 'string') {\n        state.scriptType = stream.current().toString();\n      }\n      if (state.attrsNest.length === 0 && (tok === 'string' || tok === 'variable' || tok === 'keyword')) {\n        try {\n          Function('', 'var x ' + state.attrValue.replace(/,\\s*$/, '').replace(/^!/, ''));\n          state.inAttributeName = true;\n          state.attrValue = '';\n          stream.backUp(stream.current().length);\n          return attrsContinued(stream, state);\n        } catch (ex) {\n          //not the end of an attribute\n        }\n      }\n      state.attrValue += stream.current();\n      return tok || true;\n    }\n  }\n\n  function attributesBlock(stream, state) {\n    if (stream.match(/^&attributes\\b/)) {\n      state.javaScriptArguments = true;\n      state.javaScriptArgumentsDepth = 0;\n      return 'keyword';\n    }\n  }\n\n  function indent(stream) {\n    if (stream.sol() && stream.eatSpace()) {\n      return 'indent';\n    }\n  }\n\n  function comment(stream, state) {\n    if (stream.match(/^ *\\/\\/(-)?([^\\n]*)/)) {\n      state.indentOf = stream.indentation();\n      state.indentToken = 'comment';\n      return 'comment';\n    }\n  }\n\n  function colon(stream) {\n    if (stream.match(/^: */)) {\n      return 'colon';\n    }\n  }\n\n  function text(stream, state) {\n    if (stream.match(/^(?:\\| ?| )([^\\n]+)/)) {\n      return 'string';\n    }\n    if (stream.match(/^(<[^\\n]*)/, false)) {\n      // html string\n      setInnerMode(stream, state, 'htmlmixed');\n      state.innerModeForLine = true;\n      return innerMode(stream, state, true);\n    }\n  }\n\n  function dot(stream, state) {\n    if (stream.eat('.')) {\n      var innerMode = null;\n      if (state.lastTag === 'script' && state.scriptType.toLowerCase().indexOf('javascript') != -1) {\n        innerMode = state.scriptType.toLowerCase().replace(/\"|'/g, '');\n      } else if (state.lastTag === 'style') {\n        innerMode = 'css';\n      }\n      setInnerMode(stream, state, innerMode);\n      return 'dot';\n    }\n  }\n\n  function fail(stream) {\n    stream.next();\n    return null;\n  }\n\n\n  function setInnerMode(stream, state, mode) {\n    mode = CodeMirror.mimeModes[mode] || mode;\n    mode = config.innerModes ? config.innerModes(mode) || mode : mode;\n    mode = CodeMirror.mimeModes[mode] || mode;\n    mode = CodeMirror.getMode(config, mode);\n    state.indentOf = stream.indentation();\n\n    if (mode && mode.name !== 'null') {\n      state.innerMode = mode;\n    } else {\n      state.indentToken = 'string';\n    }\n  }\n  function innerMode(stream, state, force) {\n    if (stream.indentation() > state.indentOf || (state.innerModeForLine && !stream.sol()) || force) {\n      if (state.innerMode) {\n        if (!state.innerState) {\n          state.innerState = state.innerMode.startState ? CodeMirror.startState(state.innerMode, stream.indentation()) : {};\n        }\n        return stream.hideFirstChars(state.indentOf + 2, function () {\n          return state.innerMode.token(stream, state.innerState) || true;\n        });\n      } else {\n        stream.skipToEnd();\n        return state.indentToken;\n      }\n    } else if (stream.sol()) {\n      state.indentOf = Infinity;\n      state.indentToken = null;\n      state.innerMode = null;\n      state.innerState = null;\n    }\n  }\n  function restOfLine(stream, state) {\n    if (stream.sol()) {\n      // if restOfLine was set at end of line, ignore it\n      state.restOfLine = '';\n    }\n    if (state.restOfLine) {\n      stream.skipToEnd();\n      var tok = state.restOfLine;\n      state.restOfLine = '';\n      return tok;\n    }\n  }\n\n\n  function startState() {\n    return new State();\n  }\n  function copyState(state) {\n    return state.copy();\n  }\n  /**\n   * Get the next token in the stream\n   *\n   * @param {Stream} stream\n   * @param {State} state\n   */\n  function nextToken(stream, state) {\n    var tok = innerMode(stream, state)\n      || restOfLine(stream, state)\n      || interpolationContinued(stream, state)\n      || includeFilteredContinued(stream, state)\n      || eachContinued(stream, state)\n      || attrsContinued(stream, state)\n      || javaScript(stream, state)\n      || javaScriptArguments(stream, state)\n      || callArguments(stream, state)\n\n      || yieldStatement(stream)\n      || doctype(stream)\n      || interpolation(stream, state)\n      || caseStatement(stream, state)\n      || when(stream, state)\n      || defaultStatement(stream)\n      || extendsStatement(stream, state)\n      || append(stream, state)\n      || prepend(stream, state)\n      || block(stream, state)\n      || include(stream, state)\n      || includeFiltered(stream, state)\n      || mixin(stream, state)\n      || call(stream, state)\n      || conditional(stream, state)\n      || each(stream, state)\n      || whileStatement(stream, state)\n      || tag(stream, state)\n      || filter(stream, state)\n      || code(stream, state)\n      || id(stream)\n      || className(stream)\n      || attrs(stream, state)\n      || attributesBlock(stream, state)\n      || indent(stream)\n      || text(stream, state)\n      || comment(stream, state)\n      || colon(stream)\n      || dot(stream, state)\n      || fail(stream);\n\n    return tok === true ? null : tok;\n  }\n  return {\n    startState: startState,\n    copyState: copyState,\n    token: nextToken\n  };\n}, 'javascript', 'css', 'htmlmixed');\n\nCodeMirror.defineMIME('text/x-pug', 'pug');\nCodeMirror.defineMIME('text/x-jade', 'pug');\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/puppet/puppet.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"puppet\", function () {\n  // Stores the words from the define method\n  var words = {};\n  // Taken, mostly, from the Puppet official variable standards regex\n  var variable_regex = /({)?([a-z][a-z0-9_]*)?((::[a-z][a-z0-9_]*)*::)?[a-zA-Z0-9_]+(})?/;\n\n  // Takes a string of words separated by spaces and adds them as\n  // keys with the value of the first argument 'style'\n  function define(style, string) {\n    var split = string.split(' ');\n    for (var i = 0; i < split.length; i++) {\n      words[split[i]] = style;\n    }\n  }\n\n  // Takes commonly known puppet types/words and classifies them to a style\n  define('keyword', 'class define site node include import inherits');\n  define('keyword', 'case if else in and elsif default or');\n  define('atom', 'false true running present absent file directory undef');\n  define('builtin', 'action augeas burst chain computer cron destination dport exec ' +\n    'file filebucket group host icmp iniface interface jump k5login limit log_level ' +\n    'log_prefix macauthorization mailalias maillist mcx mount nagios_command ' +\n    'nagios_contact nagios_contactgroup nagios_host nagios_hostdependency ' +\n    'nagios_hostescalation nagios_hostextinfo nagios_hostgroup nagios_service ' +\n    'nagios_servicedependency nagios_serviceescalation nagios_serviceextinfo ' +\n    'nagios_servicegroup nagios_timeperiod name notify outiface package proto reject ' +\n    'resources router schedule scheduled_task selboolean selmodule service source ' +\n    'sport ssh_authorized_key sshkey stage state table tidy todest toports tosource ' +\n    'user vlan yumrepo zfs zone zpool');\n\n  // After finding a start of a string ('|\") this function attempts to find the end;\n  // If a variable is encountered along the way, we display it differently when it\n  // is encapsulated in a double-quoted string.\n  function tokenString(stream, state) {\n    var current, prev, found_var = false;\n    while (!stream.eol() && (current = stream.next()) != state.pending) {\n      if (current === '$' && prev != '\\\\' && state.pending == '\"') {\n        found_var = true;\n        break;\n      }\n      prev = current;\n    }\n    if (found_var) {\n      stream.backUp(1);\n    }\n    if (current == state.pending) {\n      state.continueString = false;\n    } else {\n      state.continueString = true;\n    }\n    return \"string\";\n  }\n\n  // Main function\n  function tokenize(stream, state) {\n    // Matches one whole word\n    var word = stream.match(/[\\w]+/, false);\n    // Matches attributes (i.e. ensure => present ; 'ensure' would be matched)\n    var attribute = stream.match(/(\\s+)?\\w+\\s+=>.*/, false);\n    // Matches non-builtin resource declarations\n    // (i.e. \"apache::vhost {\" or \"mycustomclasss {\" would be matched)\n    var resource = stream.match(/(\\s+)?[\\w:_]+(\\s+)?{/, false);\n    // Matches virtual and exported resources (i.e. @@user { ; and the like)\n    var special_resource = stream.match(/(\\s+)?[@]{1,2}[\\w:_]+(\\s+)?{/, false);\n\n    // Finally advance the stream\n    var ch = stream.next();\n\n    // Have we found a variable?\n    if (ch === '$') {\n      if (stream.match(variable_regex)) {\n        // If so, and its in a string, assign it a different color\n        return state.continueString ? 'variable-2' : 'variable';\n      }\n      // Otherwise return an invalid variable\n      return \"error\";\n    }\n    // Should we still be looking for the end of a string?\n    if (state.continueString) {\n      // If so, go through the loop again\n      stream.backUp(1);\n      return tokenString(stream, state);\n    }\n    // Are we in a definition (class, node, define)?\n    if (state.inDefinition) {\n      // If so, return def (i.e. for 'class myclass {' ; 'myclass' would be matched)\n      if (stream.match(/(\\s+)?[\\w:_]+(\\s+)?/)) {\n        return 'def';\n      }\n      // Match the rest it the next time around\n      stream.match(/\\s+{/);\n      state.inDefinition = false;\n    }\n    // Are we in an 'include' statement?\n    if (state.inInclude) {\n      // Match and return the included class\n      stream.match(/(\\s+)?\\S+(\\s+)?/);\n      state.inInclude = false;\n      return 'def';\n    }\n    // Do we just have a function on our hands?\n    // In 'ensure_resource(\"myclass\")', 'ensure_resource' is matched\n    if (stream.match(/(\\s+)?\\w+\\(/)) {\n      stream.backUp(1);\n      return 'def';\n    }\n    // Have we matched the prior attribute regex?\n    if (attribute) {\n      stream.match(/(\\s+)?\\w+/);\n      return 'tag';\n    }\n    // Do we have Puppet specific words?\n    if (word && words.hasOwnProperty(word)) {\n      // Negates the initial next()\n      stream.backUp(1);\n      // rs move the stream\n      stream.match(/[\\w]+/);\n      // We want to process these words differently\n      // do to the importance they have in Puppet\n      if (stream.match(/\\s+\\S+\\s+{/, false)) {\n        state.inDefinition = true;\n      }\n      if (word == 'include') {\n        state.inInclude = true;\n      }\n      // Returns their value as state in the prior define methods\n      return words[word];\n    }\n    // Is there a match on a reference?\n    if (/(^|\\s+)[A-Z][\\w:_]+/.test(word)) {\n      // Negate the next()\n      stream.backUp(1);\n      // Match the full reference\n      stream.match(/(^|\\s+)[A-Z][\\w:_]+/);\n      return 'def';\n    }\n    // Have we matched the prior resource regex?\n    if (resource) {\n      stream.match(/(\\s+)?[\\w:_]+/);\n      return 'def';\n    }\n    // Have we matched the prior special_resource regex?\n    if (special_resource) {\n      stream.match(/(\\s+)?[@]{1,2}/);\n      return 'special';\n    }\n    // Match all the comments. All of them.\n    if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    // Have we found a string?\n    if (ch == \"'\" || ch == '\"') {\n      // Store the type (single or double)\n      state.pending = ch;\n      // Perform the looping function to find the end\n      return tokenString(stream, state);\n    }\n    // Match all the brackets\n    if (ch == '{' || ch == '}') {\n      return 'bracket';\n    }\n    // Match characters that we are going to assume\n    // are trying to be regex\n    if (ch == '/') {\n      stream.match(/^[^\\/]*\\//);\n      return 'variable-3';\n    }\n    // Match all the numbers\n    if (ch.match(/[0-9]/)) {\n      stream.eatWhile(/[0-9]+/);\n      return 'number';\n    }\n    // Match the '=' and '=>' operators\n    if (ch == '=') {\n      if (stream.peek() == '>') {\n          stream.next();\n      }\n      return \"operator\";\n    }\n    // Keep advancing through all the rest\n    stream.eatWhile(/[\\w-]/);\n    // Return a blank line for everything else\n    return null;\n  }\n  // Start it all\n  return {\n    startState: function () {\n      var state = {};\n      state.inDefinition = false;\n      state.inInclude = false;\n      state.continueString = false;\n      state.pending = false;\n      return state;\n    },\n    token: function (stream, state) {\n      // Strip the spaces, but regex will account for them eitherway\n      if (stream.eatSpace()) return null;\n      // Go through the main process\n      return tokenize(stream, state);\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-puppet\", \"puppet\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/python/python.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  var wordOperators = wordRegexp([\"and\", \"or\", \"not\", \"is\"]);\n  var commonKeywords = [\"as\", \"assert\", \"break\", \"class\", \"continue\",\n                        \"def\", \"del\", \"elif\", \"else\", \"except\", \"finally\",\n                        \"for\", \"from\", \"global\", \"if\", \"import\",\n                        \"lambda\", \"pass\", \"raise\", \"return\",\n                        \"try\", \"while\", \"with\", \"yield\", \"in\"];\n  var commonBuiltins = [\"abs\", \"all\", \"any\", \"bin\", \"bool\", \"bytearray\", \"callable\", \"chr\",\n                        \"classmethod\", \"compile\", \"complex\", \"delattr\", \"dict\", \"dir\", \"divmod\",\n                        \"enumerate\", \"eval\", \"filter\", \"float\", \"format\", \"frozenset\",\n                        \"getattr\", \"globals\", \"hasattr\", \"hash\", \"help\", \"hex\", \"id\",\n                        \"input\", \"int\", \"isinstance\", \"issubclass\", \"iter\", \"len\",\n                        \"list\", \"locals\", \"map\", \"max\", \"memoryview\", \"min\", \"next\",\n                        \"object\", \"oct\", \"open\", \"ord\", \"pow\", \"property\", \"range\",\n                        \"repr\", \"reversed\", \"round\", \"set\", \"setattr\", \"slice\",\n                        \"sorted\", \"staticmethod\", \"str\", \"sum\", \"super\", \"tuple\",\n                        \"type\", \"vars\", \"zip\", \"__import__\", \"NotImplemented\",\n                        \"Ellipsis\", \"__debug__\"];\n  CodeMirror.registerHelper(\"hintWords\", \"python\", commonKeywords.concat(commonBuiltins));\n\n  function top(state) {\n    return state.scopes[state.scopes.length - 1];\n  }\n\n  CodeMirror.defineMode(\"python\", function(conf, parserConf) {\n    var ERRORCLASS = \"error\";\n\n    var delimiters = parserConf.delimiters || parserConf.singleDelimiters || /^[\\(\\)\\[\\]\\{\\}@,:`=;\\.\\\\]/;\n    //               (Backwards-compatibility with old, cumbersome config system)\n    var operators = [parserConf.singleOperators, parserConf.doubleOperators, parserConf.doubleDelimiters, parserConf.tripleDelimiters,\n                     parserConf.operators || /^([-+*/%\\/&|^]=?|[<>=]+|\\/\\/=?|\\*\\*=?|!=|[~!@]|\\.\\.\\.)/]\n    for (var i = 0; i < operators.length; i++) if (!operators[i]) operators.splice(i--, 1)\n\n    var hangingIndent = parserConf.hangingIndent || conf.indentUnit;\n\n    var myKeywords = commonKeywords, myBuiltins = commonBuiltins;\n    if (parserConf.extra_keywords != undefined)\n      myKeywords = myKeywords.concat(parserConf.extra_keywords);\n\n    if (parserConf.extra_builtins != undefined)\n      myBuiltins = myBuiltins.concat(parserConf.extra_builtins);\n\n    var py3 = !(parserConf.version && Number(parserConf.version) < 3)\n    if (py3) {\n      // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator\n      var identifiers = parserConf.identifiers|| /^[_A-Za-z\\u00A1-\\uFFFF][_A-Za-z0-9\\u00A1-\\uFFFF]*/;\n      myKeywords = myKeywords.concat([\"nonlocal\", \"False\", \"True\", \"None\", \"async\", \"await\"]);\n      myBuiltins = myBuiltins.concat([\"ascii\", \"bytes\", \"exec\", \"print\"]);\n      var stringPrefixes = new RegExp(\"^(([rbuf]|(br)|(rb)|(fr)|(rf))?('{3}|\\\"{3}|['\\\"]))\", \"i\");\n    } else {\n      var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/;\n      myKeywords = myKeywords.concat([\"exec\", \"print\"]);\n      myBuiltins = myBuiltins.concat([\"apply\", \"basestring\", \"buffer\", \"cmp\", \"coerce\", \"execfile\",\n                                      \"file\", \"intern\", \"long\", \"raw_input\", \"reduce\", \"reload\",\n                                      \"unichr\", \"unicode\", \"xrange\", \"False\", \"True\", \"None\"]);\n      var stringPrefixes = new RegExp(\"^(([rubf]|(ur)|(br))?('{3}|\\\"{3}|['\\\"]))\", \"i\");\n    }\n    var keywords = wordRegexp(myKeywords);\n    var builtins = wordRegexp(myBuiltins);\n\n    // tokenizers\n    function tokenBase(stream, state) {\n      var sol = stream.sol() && state.lastToken != \"\\\\\"\n      if (sol) state.indent = stream.indentation()\n      // Handle scope changes\n      if (sol && top(state).type == \"py\") {\n        var scopeOffset = top(state).offset;\n        if (stream.eatSpace()) {\n          var lineOffset = stream.indentation();\n          if (lineOffset > scopeOffset)\n            pushPyScope(state);\n          else if (lineOffset < scopeOffset && dedent(stream, state) && stream.peek() != \"#\")\n            state.errorToken = true;\n          return null;\n        } else {\n          var style = tokenBaseInner(stream, state);\n          if (scopeOffset > 0 && dedent(stream, state))\n            style += \" \" + ERRORCLASS;\n          return style;\n        }\n      }\n      return tokenBaseInner(stream, state);\n    }\n\n    function tokenBaseInner(stream, state, inFormat) {\n      if (stream.eatSpace()) return null;\n\n      // Handle Comments\n      if (!inFormat && stream.match(/^#.*/)) return \"comment\";\n\n      // Handle Number Literals\n      if (stream.match(/^[0-9\\.]/, false)) {\n        var floatLiteral = false;\n        // Floats\n        if (stream.match(/^[\\d_]*\\.\\d+(e[\\+\\-]?\\d+)?/i)) { floatLiteral = true; }\n        if (stream.match(/^[\\d_]+\\.\\d*/)) { floatLiteral = true; }\n        if (stream.match(/^\\.\\d+/)) { floatLiteral = true; }\n        if (floatLiteral) {\n          // Float literals may be \"imaginary\"\n          stream.eat(/J/i);\n          return \"number\";\n        }\n        // Integers\n        var intLiteral = false;\n        // Hex\n        if (stream.match(/^0x[0-9a-f_]+/i)) intLiteral = true;\n        // Binary\n        if (stream.match(/^0b[01_]+/i)) intLiteral = true;\n        // Octal\n        if (stream.match(/^0o[0-7_]+/i)) intLiteral = true;\n        // Decimal\n        if (stream.match(/^[1-9][\\d_]*(e[\\+\\-]?[\\d_]+)?/)) {\n          // Decimal literals may be \"imaginary\"\n          stream.eat(/J/i);\n          // TODO - Can you have imaginary longs?\n          intLiteral = true;\n        }\n        // Zero by itself with no other piece of number.\n        if (stream.match(/^0(?![\\dx])/i)) intLiteral = true;\n        if (intLiteral) {\n          // Integer literals may be \"long\"\n          stream.eat(/L/i);\n          return \"number\";\n        }\n      }\n\n      // Handle Strings\n      if (stream.match(stringPrefixes)) {\n        var isFmtString = stream.current().toLowerCase().indexOf('f') !== -1;\n        if (!isFmtString) {\n          state.tokenize = tokenStringFactory(stream.current(), state.tokenize);\n          return state.tokenize(stream, state);\n        } else {\n          state.tokenize = formatStringFactory(stream.current(), state.tokenize);\n          return state.tokenize(stream, state);\n        }\n      }\n\n      for (var i = 0; i < operators.length; i++)\n        if (stream.match(operators[i])) return \"operator\"\n\n      if (stream.match(delimiters)) return \"punctuation\";\n\n      if (state.lastToken == \".\" && stream.match(identifiers))\n        return \"property\";\n\n      if (stream.match(keywords) || stream.match(wordOperators))\n        return \"keyword\";\n\n      if (stream.match(builtins))\n        return \"builtin\";\n\n      if (stream.match(/^(self|cls)\\b/))\n        return \"variable-2\";\n\n      if (stream.match(identifiers)) {\n        if (state.lastToken == \"def\" || state.lastToken == \"class\")\n          return \"def\";\n        return \"variable\";\n      }\n\n      // Handle non-detected items\n      stream.next();\n      return inFormat ? null :ERRORCLASS;\n    }\n\n    function formatStringFactory(delimiter, tokenOuter) {\n      while (\"rubf\".indexOf(delimiter.charAt(0).toLowerCase()) >= 0)\n        delimiter = delimiter.substr(1);\n\n      var singleline = delimiter.length == 1;\n      var OUTCLASS = \"string\";\n\n      function tokenNestedExpr(depth) {\n        return function(stream, state) {\n          var inner = tokenBaseInner(stream, state, true)\n          if (inner == \"punctuation\") {\n            if (stream.current() == \"{\") {\n              state.tokenize = tokenNestedExpr(depth + 1)\n            } else if (stream.current() == \"}\") {\n              if (depth > 1) state.tokenize = tokenNestedExpr(depth - 1)\n              else state.tokenize = tokenString\n            }\n          }\n          return inner\n        }\n      }\n\n      function tokenString(stream, state) {\n        while (!stream.eol()) {\n          stream.eatWhile(/[^'\"\\{\\}\\\\]/);\n          if (stream.eat(\"\\\\\")) {\n            stream.next();\n            if (singleline && stream.eol())\n              return OUTCLASS;\n          } else if (stream.match(delimiter)) {\n            state.tokenize = tokenOuter;\n            return OUTCLASS;\n          } else if (stream.match('{{')) {\n            // ignore {{ in f-str\n            return OUTCLASS;\n          } else if (stream.match('{', false)) {\n            // switch to nested mode\n            state.tokenize = tokenNestedExpr(0)\n            if (stream.current()) return OUTCLASS;\n            else return state.tokenize(stream, state)\n          } else if (stream.match('}}')) {\n            return OUTCLASS;\n          } else if (stream.match('}')) {\n            // single } in f-string is an error\n            return ERRORCLASS;\n          } else {\n            stream.eat(/['\"]/);\n          }\n        }\n        if (singleline) {\n          if (parserConf.singleLineStringErrors)\n            return ERRORCLASS;\n          else\n            state.tokenize = tokenOuter;\n        }\n        return OUTCLASS;\n      }\n      tokenString.isString = true;\n      return tokenString;\n    }\n\n    function tokenStringFactory(delimiter, tokenOuter) {\n      while (\"rubf\".indexOf(delimiter.charAt(0).toLowerCase()) >= 0)\n        delimiter = delimiter.substr(1);\n\n      var singleline = delimiter.length == 1;\n      var OUTCLASS = \"string\";\n\n      function tokenString(stream, state) {\n        while (!stream.eol()) {\n          stream.eatWhile(/[^'\"\\\\]/);\n          if (stream.eat(\"\\\\\")) {\n            stream.next();\n            if (singleline && stream.eol())\n              return OUTCLASS;\n          } else if (stream.match(delimiter)) {\n            state.tokenize = tokenOuter;\n            return OUTCLASS;\n          } else {\n            stream.eat(/['\"]/);\n          }\n        }\n        if (singleline) {\n          if (parserConf.singleLineStringErrors)\n            return ERRORCLASS;\n          else\n            state.tokenize = tokenOuter;\n        }\n        return OUTCLASS;\n      }\n      tokenString.isString = true;\n      return tokenString;\n    }\n\n    function pushPyScope(state) {\n      while (top(state).type != \"py\") state.scopes.pop()\n      state.scopes.push({offset: top(state).offset + conf.indentUnit,\n                         type: \"py\",\n                         align: null})\n    }\n\n    function pushBracketScope(stream, state, type) {\n      var align = stream.match(/^[\\s\\[\\{\\(]*(?:#|$)/, false) ? null : stream.column() + 1\n      state.scopes.push({offset: state.indent + hangingIndent,\n                         type: type,\n                         align: align})\n    }\n\n    function dedent(stream, state) {\n      var indented = stream.indentation();\n      while (state.scopes.length > 1 && top(state).offset > indented) {\n        if (top(state).type != \"py\") return true;\n        state.scopes.pop();\n      }\n      return top(state).offset != indented;\n    }\n\n    function tokenLexer(stream, state) {\n      if (stream.sol()) {\n        state.beginningOfLine = true;\n        state.dedent = false;\n      }\n\n      var style = state.tokenize(stream, state);\n      var current = stream.current();\n\n      // Handle decorators\n      if (state.beginningOfLine && current == \"@\")\n        return stream.match(identifiers, false) ? \"meta\" : py3 ? \"operator\" : ERRORCLASS;\n\n      if (/\\S/.test(current)) state.beginningOfLine = false;\n\n      if ((style == \"variable\" || style == \"builtin\")\n          && state.lastToken == \"meta\")\n        style = \"meta\";\n\n      // Handle scope changes.\n      if (current == \"pass\" || current == \"return\")\n        state.dedent = true;\n\n      if (current == \"lambda\") state.lambda = true;\n      if (current == \":\" && !state.lambda && top(state).type == \"py\" && stream.match(/^\\s*(?:#|$)/, false))\n        pushPyScope(state);\n\n      if (current.length == 1 && !/string|comment/.test(style)) {\n        var delimiter_index = \"[({\".indexOf(current);\n        if (delimiter_index != -1)\n          pushBracketScope(stream, state, \"])}\".slice(delimiter_index, delimiter_index+1));\n\n        delimiter_index = \"])}\".indexOf(current);\n        if (delimiter_index != -1) {\n          if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent\n          else return ERRORCLASS;\n        }\n      }\n      if (state.dedent && stream.eol() && top(state).type == \"py\" && state.scopes.length > 1)\n        state.scopes.pop();\n\n      return style;\n    }\n\n    var external = {\n      startState: function(basecolumn) {\n        return {\n          tokenize: tokenBase,\n          scopes: [{offset: basecolumn || 0, type: \"py\", align: null}],\n          indent: basecolumn || 0,\n          lastToken: null,\n          lambda: false,\n          dedent: 0\n        };\n      },\n\n      token: function(stream, state) {\n        var addErr = state.errorToken;\n        if (addErr) state.errorToken = false;\n        var style = tokenLexer(stream, state);\n\n        if (style && style != \"comment\")\n          state.lastToken = (style == \"keyword\" || style == \"punctuation\") ? stream.current() : style;\n        if (style == \"punctuation\") style = null;\n\n        if (stream.eol() && state.lambda)\n          state.lambda = false;\n        return addErr ? style + \" \" + ERRORCLASS : style;\n      },\n\n      indent: function(state, textAfter) {\n        if (state.tokenize != tokenBase)\n          return state.tokenize.isString ? CodeMirror.Pass : 0;\n\n        var scope = top(state)\n        var closing = scope.type == textAfter.charAt(0) ||\n            scope.type == \"py\" && !state.dedent && /^(else:|elif |except |finally:)/.test(textAfter)\n        if (scope.align != null)\n          return scope.align - (closing ? 1 : 0)\n        else\n          return scope.offset - (closing ? hangingIndent : 0)\n      },\n\n      electricInput: /^\\s*([\\}\\]\\)]|else:|elif |except |finally:)$/,\n      closeBrackets: {triples: \"'\\\"\"},\n      lineComment: \"#\",\n      fold: \"indent\"\n    };\n    return external;\n  });\n\n  CodeMirror.defineMIME(\"text/x-python\", \"python\");\n\n  var words = function(str) { return str.split(\" \"); };\n\n  CodeMirror.defineMIME(\"text/x-cython\", {\n    name: \"python\",\n    extra_keywords: words(\"by cdef cimport cpdef ctypedef enum except \"+\n                          \"extern gil include nogil property public \"+\n                          \"readonly struct union DEF IF ELIF ELSE\")\n  });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/q/q.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"q\",function(config){\n  var indentUnit=config.indentUnit,\n      curPunc,\n      keywords=buildRE([\"abs\",\"acos\",\"aj\",\"aj0\",\"all\",\"and\",\"any\",\"asc\",\"asin\",\"asof\",\"atan\",\"attr\",\"avg\",\"avgs\",\"bin\",\"by\",\"ceiling\",\"cols\",\"cor\",\"cos\",\"count\",\"cov\",\"cross\",\"csv\",\"cut\",\"delete\",\"deltas\",\"desc\",\"dev\",\"differ\",\"distinct\",\"div\",\"do\",\"each\",\"ej\",\"enlist\",\"eval\",\"except\",\"exec\",\"exit\",\"exp\",\"fby\",\"fills\",\"first\",\"fkeys\",\"flip\",\"floor\",\"from\",\"get\",\"getenv\",\"group\",\"gtime\",\"hclose\",\"hcount\",\"hdel\",\"hopen\",\"hsym\",\"iasc\",\"idesc\",\"if\",\"ij\",\"in\",\"insert\",\"inter\",\"inv\",\"key\",\"keys\",\"last\",\"like\",\"list\",\"lj\",\"load\",\"log\",\"lower\",\"lsq\",\"ltime\",\"ltrim\",\"mavg\",\"max\",\"maxs\",\"mcount\",\"md5\",\"mdev\",\"med\",\"meta\",\"min\",\"mins\",\"mmax\",\"mmin\",\"mmu\",\"mod\",\"msum\",\"neg\",\"next\",\"not\",\"null\",\"or\",\"over\",\"parse\",\"peach\",\"pj\",\"plist\",\"prd\",\"prds\",\"prev\",\"prior\",\"rand\",\"rank\",\"ratios\",\"raze\",\"read0\",\"read1\",\"reciprocal\",\"reverse\",\"rload\",\"rotate\",\"rsave\",\"rtrim\",\"save\",\"scan\",\"select\",\"set\",\"setenv\",\"show\",\"signum\",\"sin\",\"sqrt\",\"ss\",\"ssr\",\"string\",\"sublist\",\"sum\",\"sums\",\"sv\",\"system\",\"tables\",\"tan\",\"til\",\"trim\",\"txf\",\"type\",\"uj\",\"ungroup\",\"union\",\"update\",\"upper\",\"upsert\",\"value\",\"var\",\"view\",\"views\",\"vs\",\"wavg\",\"where\",\"where\",\"while\",\"within\",\"wj\",\"wj1\",\"wsum\",\"xasc\",\"xbar\",\"xcol\",\"xcols\",\"xdesc\",\"xexp\",\"xgroup\",\"xkey\",\"xlog\",\"xprev\",\"xrank\"]),\n      E=/[|/&^!+:\\\\\\-*%$=~#;@><,?_\\'\\\"\\[\\(\\]\\)\\s{}]/;\n  function buildRE(w){return new RegExp(\"^(\"+w.join(\"|\")+\")$\");}\n  function tokenBase(stream,state){\n    var sol=stream.sol(),c=stream.next();\n    curPunc=null;\n    if(sol)\n      if(c==\"/\")\n        return(state.tokenize=tokenLineComment)(stream,state);\n      else if(c==\"\\\\\"){\n        if(stream.eol()||/\\s/.test(stream.peek()))\n          return stream.skipToEnd(),/^\\\\\\s*$/.test(stream.current())?(state.tokenize=tokenCommentToEOF)(stream):state.tokenize=tokenBase,\"comment\";\n        else\n          return state.tokenize=tokenBase,\"builtin\";\n      }\n    if(/\\s/.test(c))\n      return stream.peek()==\"/\"?(stream.skipToEnd(),\"comment\"):\"whitespace\";\n    if(c=='\"')\n      return(state.tokenize=tokenString)(stream,state);\n    if(c=='`')\n      return stream.eatWhile(/[A-Za-z\\d_:\\/.]/),\"symbol\";\n    if((\".\"==c&&/\\d/.test(stream.peek()))||/\\d/.test(c)){\n      var t=null;\n      stream.backUp(1);\n      if(stream.match(/^\\d{4}\\.\\d{2}(m|\\.\\d{2}([DT](\\d{2}(:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?)?)?)?)/)\n      || stream.match(/^\\d+D(\\d{2}(:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?)?)/)\n      || stream.match(/^\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?/)\n      || stream.match(/^\\d+[ptuv]{1}/))\n        t=\"temporal\";\n      else if(stream.match(/^0[NwW]{1}/)\n      || stream.match(/^0x[\\da-fA-F]*/)\n      || stream.match(/^[01]+[b]{1}/)\n      || stream.match(/^\\d+[chijn]{1}/)\n      || stream.match(/-?\\d*(\\.\\d*)?(e[+\\-]?\\d+)?(e|f)?/))\n        t=\"number\";\n      return(t&&(!(c=stream.peek())||E.test(c)))?t:(stream.next(),\"error\");\n    }\n    if(/[A-Za-z]|\\./.test(c))\n      return stream.eatWhile(/[A-Za-z._\\d]/),keywords.test(stream.current())?\"keyword\":\"variable\";\n    if(/[|/&^!+:\\\\\\-*%$=~#;@><\\.,?_\\']/.test(c))\n      return null;\n    if(/[{}\\(\\[\\]\\)]/.test(c))\n      return null;\n    return\"error\";\n  }\n  function tokenLineComment(stream,state){\n    return stream.skipToEnd(),/\\/\\s*$/.test(stream.current())?(state.tokenize=tokenBlockComment)(stream,state):(state.tokenize=tokenBase),\"comment\";\n  }\n  function tokenBlockComment(stream,state){\n    var f=stream.sol()&&stream.peek()==\"\\\\\";\n    stream.skipToEnd();\n    if(f&&/^\\\\\\s*$/.test(stream.current()))\n      state.tokenize=tokenBase;\n    return\"comment\";\n  }\n  function tokenCommentToEOF(stream){return stream.skipToEnd(),\"comment\";}\n  function tokenString(stream,state){\n    var escaped=false,next,end=false;\n    while((next=stream.next())){\n      if(next==\"\\\"\"&&!escaped){end=true;break;}\n      escaped=!escaped&&next==\"\\\\\";\n    }\n    if(end)state.tokenize=tokenBase;\n    return\"string\";\n  }\n  function pushContext(state,type,col){state.context={prev:state.context,indent:state.indent,col:col,type:type};}\n  function popContext(state){state.indent=state.context.indent;state.context=state.context.prev;}\n  return{\n    startState:function(){\n      return{tokenize:tokenBase,\n             context:null,\n             indent:0,\n             col:0};\n    },\n    token:function(stream,state){\n      if(stream.sol()){\n        if(state.context&&state.context.align==null)\n          state.context.align=false;\n        state.indent=stream.indentation();\n      }\n      //if (stream.eatSpace()) return null;\n      var style=state.tokenize(stream,state);\n      if(style!=\"comment\"&&state.context&&state.context.align==null&&state.context.type!=\"pattern\"){\n        state.context.align=true;\n      }\n      if(curPunc==\"(\")pushContext(state,\")\",stream.column());\n      else if(curPunc==\"[\")pushContext(state,\"]\",stream.column());\n      else if(curPunc==\"{\")pushContext(state,\"}\",stream.column());\n      else if(/[\\]\\}\\)]/.test(curPunc)){\n        while(state.context&&state.context.type==\"pattern\")popContext(state);\n        if(state.context&&curPunc==state.context.type)popContext(state);\n      }\n      else if(curPunc==\".\"&&state.context&&state.context.type==\"pattern\")popContext(state);\n      else if(/atom|string|variable/.test(style)&&state.context){\n        if(/[\\}\\]]/.test(state.context.type))\n          pushContext(state,\"pattern\",stream.column());\n        else if(state.context.type==\"pattern\"&&!state.context.align){\n          state.context.align=true;\n          state.context.col=stream.column();\n        }\n      }\n      return style;\n    },\n    indent:function(state,textAfter){\n      var firstChar=textAfter&&textAfter.charAt(0);\n      var context=state.context;\n      if(/[\\]\\}]/.test(firstChar))\n        while (context&&context.type==\"pattern\")context=context.prev;\n      var closing=context&&firstChar==context.type;\n      if(!context)\n        return 0;\n      else if(context.type==\"pattern\")\n        return context.col;\n      else if(context.align)\n        return context.col+(closing?0:1);\n      else\n        return context.indent+(closing?0:indentUnit);\n    }\n  };\n});\nCodeMirror.defineMIME(\"text/x-q\",\"q\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/r/r.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"wordChars\", \"r\", /[\\w.]/);\n\nCodeMirror.defineMode(\"r\", function(config) {\n  function wordObj(words) {\n    var res = {};\n    for (var i = 0; i < words.length; ++i) res[words[i]] = true;\n    return res;\n  }\n  var commonAtoms = [\"NULL\", \"NA\", \"Inf\", \"NaN\", \"NA_integer_\", \"NA_real_\", \"NA_complex_\", \"NA_character_\", \"TRUE\", \"FALSE\"];\n  var commonBuiltins = [\"list\", \"quote\", \"bquote\", \"eval\", \"return\", \"call\", \"parse\", \"deparse\"];\n  var commonKeywords = [\"if\", \"else\", \"repeat\", \"while\", \"function\", \"for\", \"in\", \"next\", \"break\"];\n  var commonBlockKeywords = [\"if\", \"else\", \"repeat\", \"while\", \"function\", \"for\"];\n\n  CodeMirror.registerHelper(\"hintWords\", \"r\", commonAtoms.concat(commonBuiltins, commonKeywords));\n\n  var atoms = wordObj(commonAtoms);\n  var builtins = wordObj(commonBuiltins);\n  var keywords = wordObj(commonKeywords);\n  var blockkeywords = wordObj(commonBlockKeywords);\n  var opChars = /[+\\-*\\/^<>=!&|~$:]/;\n  var curPunc;\n\n  function tokenBase(stream, state) {\n    curPunc = null;\n    var ch = stream.next();\n    if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    } else if (ch == \"0\" && stream.eat(\"x\")) {\n      stream.eatWhile(/[\\da-f]/i);\n      return \"number\";\n    } else if (ch == \".\" && stream.eat(/\\d/)) {\n      stream.match(/\\d*(?:e[+\\-]?\\d+)?/);\n      return \"number\";\n    } else if (/\\d/.test(ch)) {\n      stream.match(/\\d*(?:\\.\\d+)?(?:e[+\\-]\\d+)?L?/);\n      return \"number\";\n    } else if (ch == \"'\" || ch == '\"') {\n      state.tokenize = tokenString(ch);\n      return \"string\";\n    } else if (ch == \"`\") {\n      stream.match(/[^`]+`/);\n      return \"variable-3\";\n    } else if (ch == \".\" && stream.match(/.(?:[.]|\\d+)/)) {\n      return \"keyword\";\n    } else if (/[a-zA-Z\\.]/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      var word = stream.current();\n      if (atoms.propertyIsEnumerable(word)) return \"atom\";\n      if (keywords.propertyIsEnumerable(word)) {\n        // Block keywords start new blocks, except 'else if', which only starts\n        // one new block for the 'if', no block for the 'else'.\n        if (blockkeywords.propertyIsEnumerable(word) &&\n            !stream.match(/\\s*if(\\s+|$)/, false))\n          curPunc = \"block\";\n        return \"keyword\";\n      }\n      if (builtins.propertyIsEnumerable(word)) return \"builtin\";\n      return \"variable\";\n    } else if (ch == \"%\") {\n      if (stream.skipTo(\"%\")) stream.next();\n      return \"operator variable-2\";\n    } else if (\n        (ch == \"<\" && stream.eat(\"-\")) ||\n        (ch == \"<\" && stream.match(\"<-\")) ||\n        (ch == \"-\" && stream.match(/>>?/))\n      ) {\n      return \"operator arrow\";\n    } else if (ch == \"=\" && state.ctx.argList) {\n      return \"arg-is\";\n    } else if (opChars.test(ch)) {\n      if (ch == \"$\") return \"operator dollar\";\n      stream.eatWhile(opChars);\n      return \"operator\";\n    } else if (/[\\(\\){}\\[\\];]/.test(ch)) {\n      curPunc = ch;\n      if (ch == \";\") return \"semi\";\n      return null;\n    } else {\n      return null;\n    }\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      if (stream.eat(\"\\\\\")) {\n        var ch = stream.next();\n        if (ch == \"x\") stream.match(/^[a-f0-9]{2}/i);\n        else if ((ch == \"u\" || ch == \"U\") && stream.eat(\"{\") && stream.skipTo(\"}\")) stream.next();\n        else if (ch == \"u\") stream.match(/^[a-f0-9]{4}/i);\n        else if (ch == \"U\") stream.match(/^[a-f0-9]{8}/i);\n        else if (/[0-7]/.test(ch)) stream.match(/^[0-7]{1,2}/);\n        return \"string-2\";\n      } else {\n        var next;\n        while ((next = stream.next()) != null) {\n          if (next == quote) { state.tokenize = tokenBase; break; }\n          if (next == \"\\\\\") { stream.backUp(1); break; }\n        }\n        return \"string\";\n      }\n    };\n  }\n\n  var ALIGN_YES = 1, ALIGN_NO = 2, BRACELESS = 4\n\n  function push(state, type, stream) {\n    state.ctx = {type: type,\n                 indent: state.indent,\n                 flags: 0,\n                 column: stream.column(),\n                 prev: state.ctx};\n  }\n  function setFlag(state, flag) {\n    var ctx = state.ctx\n    state.ctx = {type: ctx.type,\n                 indent: ctx.indent,\n                 flags: ctx.flags | flag,\n                 column: ctx.column,\n                 prev: ctx.prev}\n  }\n  function pop(state) {\n    state.indent = state.ctx.indent;\n    state.ctx = state.ctx.prev;\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: tokenBase,\n              ctx: {type: \"top\",\n                    indent: -config.indentUnit,\n                    flags: ALIGN_NO},\n              indent: 0,\n              afterIdent: false};\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if ((state.ctx.flags & 3) == 0) state.ctx.flags |= ALIGN_NO\n        if (state.ctx.flags & BRACELESS) pop(state)\n        state.indent = stream.indentation();\n      }\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      if (style != \"comment\" && (state.ctx.flags & ALIGN_NO) == 0) setFlag(state, ALIGN_YES)\n\n      if ((curPunc == \";\" || curPunc == \"{\" || curPunc == \"}\") && state.ctx.type == \"block\") pop(state);\n      if (curPunc == \"{\") push(state, \"}\", stream);\n      else if (curPunc == \"(\") {\n        push(state, \")\", stream);\n        if (state.afterIdent) state.ctx.argList = true;\n      }\n      else if (curPunc == \"[\") push(state, \"]\", stream);\n      else if (curPunc == \"block\") push(state, \"block\", stream);\n      else if (curPunc == state.ctx.type) pop(state);\n      else if (state.ctx.type == \"block\" && style != \"comment\") setFlag(state, BRACELESS)\n      state.afterIdent = style == \"variable\" || style == \"keyword\";\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), ctx = state.ctx,\n          closing = firstChar == ctx.type;\n      if (ctx.flags & BRACELESS) ctx = ctx.prev\n      if (ctx.type == \"block\") return ctx.indent + (firstChar == \"{\" ? 0 : config.indentUnit);\n      else if (ctx.flags & ALIGN_YES) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indent + (closing ? 0 : config.indentUnit);\n    },\n\n    lineComment: \"#\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-rsrc\", \"r\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/rpm/changes/index.html",
    "content": "<!doctype html>\n\n<title>CodeMirror: RPM changes mode</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../../doc/docs.css\">\n\n    <link rel=\"stylesheet\" href=\"../../../lib/codemirror.css\">\n    <script src=\"../../../lib/codemirror.js\"></script>\n    <script src=\"changes.js\"></script>\n    <link rel=\"stylesheet\" href=\"../../../doc/docs.css\">\n    <style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>\n\n<div id=nav>\n  <a href=\"https://codemirror.net\"><h1>CodeMirror</h1><img id=logo src=\"../../../doc/logo.png\"></a>\n\n  <ul>\n    <li><a href=\"../../../index.html\">Home</a>\n    <li><a href=\"../../../doc/manual.html\">Manual</a>\n    <li><a href=\"https://github.com/codemirror/codemirror\">Code</a>\n  </ul>\n  <ul>\n    <li><a href=\"../../index.html\">Language modes</a>\n    <li><a class=active href=\"#\">RPM changes</a>\n  </ul>\n</div>\n\n<article>\n<h2>RPM changes mode</h2>\n\n    <div><textarea id=\"code\" name=\"code\">\n-------------------------------------------------------------------\nTue Oct 18 13:58:40 UTC 2011 - misterx@example.com\n\n- Update to r60.3\n- Fixes bug in the reflect package\n  * disallow Interface method on Value obtained via unexported name\n\n-------------------------------------------------------------------\nThu Oct  6 08:14:24 UTC 2011 - misterx@example.com\n\n- Update to r60.2\n- Fixes memory leak in certain map types\n\n-------------------------------------------------------------------\nWed Oct  5 14:34:10 UTC 2011 - misterx@example.com\n\n- Tweaks for gdb debugging\n- go.spec changes:\n  - move %go_arch definition to %prep section\n  - pass correct location of go specific gdb pretty printer and\n    functions to cpp as HOST_EXTRA_CFLAGS macro\n  - install go gdb functions & printer\n- gdb-printer.patch\n  - patch linker (src/cmd/ld/dwarf.c) to emit correct location of go\n    gdb functions and pretty printer\n</textarea></div>\n    <script>\n      var editor = CodeMirror.fromTextArea(document.getElementById(\"code\"), {\n        mode: {name: \"changes\"},\n        lineNumbers: true,\n        indentUnit: 4\n      });\n    </script>\n\n    <p><strong>MIME types defined:</strong> <code>text/x-rpm-changes</code>.</p>\n</article>\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/rpm/rpm.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"rpm-changes\", function() {\n  var headerSeparator = /^-+$/;\n  var headerLine = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)  ?\\d{1,2} \\d{2}:\\d{2}(:\\d{2})? [A-Z]{3,4} \\d{4} - /;\n  var simpleEmail = /^[\\w+.-]+@[\\w.-]+/;\n\n  return {\n    token: function(stream) {\n      if (stream.sol()) {\n        if (stream.match(headerSeparator)) { return 'tag'; }\n        if (stream.match(headerLine)) { return 'tag'; }\n      }\n      if (stream.match(simpleEmail)) { return 'string'; }\n      stream.next();\n      return null;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-rpm-changes\", \"rpm-changes\");\n\n// Quick and dirty spec file highlighting\n\nCodeMirror.defineMode(\"rpm-spec\", function() {\n  var arch = /^(i386|i586|i686|x86_64|ppc64le|ppc64|ppc|ia64|s390x|s390|sparc64|sparcv9|sparc|noarch|alphaev6|alpha|hppa|mipsel)/;\n\n  var preamble = /^[a-zA-Z0-9()]+:/;\n  var section = /^%(debug_package|package|description|prep|build|install|files|clean|changelog|preinstall|preun|postinstall|postun|pretrans|posttrans|pre|post|triggerin|triggerun|verifyscript|check|triggerpostun|triggerprein|trigger)/;\n  var control_flow_complex = /^%(ifnarch|ifarch|if)/; // rpm control flow macros\n  var control_flow_simple = /^%(else|endif)/; // rpm control flow macros\n  var operators = /^(\\!|\\?|\\<\\=|\\<|\\>\\=|\\>|\\=\\=|\\&\\&|\\|\\|)/; // operators in control flow macros\n\n  return {\n    startState: function () {\n        return {\n          controlFlow: false,\n          macroParameters: false,\n          section: false\n        };\n    },\n    token: function (stream, state) {\n      var ch = stream.peek();\n      if (ch == \"#\") { stream.skipToEnd(); return \"comment\"; }\n\n      if (stream.sol()) {\n        if (stream.match(preamble)) { return \"header\"; }\n        if (stream.match(section)) { return \"atom\"; }\n      }\n\n      if (stream.match(/^\\$\\w+/)) { return \"def\"; } // Variables like '$RPM_BUILD_ROOT'\n      if (stream.match(/^\\$\\{\\w+\\}/)) { return \"def\"; } // Variables like '${RPM_BUILD_ROOT}'\n\n      if (stream.match(control_flow_simple)) { return \"keyword\"; }\n      if (stream.match(control_flow_complex)) {\n        state.controlFlow = true;\n        return \"keyword\";\n      }\n      if (state.controlFlow) {\n        if (stream.match(operators)) { return \"operator\"; }\n        if (stream.match(/^(\\d+)/)) { return \"number\"; }\n        if (stream.eol()) { state.controlFlow = false; }\n      }\n\n      if (stream.match(arch)) {\n        if (stream.eol()) { state.controlFlow = false; }\n        return \"number\";\n      }\n\n      // Macros like '%make_install' or '%attr(0775,root,root)'\n      if (stream.match(/^%[\\w]+/)) {\n        if (stream.match('(')) { state.macroParameters = true; }\n        return \"keyword\";\n      }\n      if (state.macroParameters) {\n        if (stream.match(/^\\d+/)) { return \"number\";}\n        if (stream.match(')')) {\n          state.macroParameters = false;\n          return \"keyword\";\n        }\n      }\n\n      // Macros like '%{defined fedora}'\n      if (stream.match(/^%\\{\\??[\\w \\-\\:\\!]+\\}/)) {\n        if (stream.eol()) { state.controlFlow = false; }\n        return \"def\";\n      }\n\n      //TODO: Include bash script sub-parser (CodeMirror supports that)\n      stream.next();\n      return null;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-rpm-spec\", \"rpm-spec\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/rst/rst.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../python/python\"), require(\"../stex/stex\"), require(\"../../addon/mode/overlay\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../python/python\", \"../stex/stex\", \"../../addon/mode/overlay\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('rst', function (config, options) {\n\n  var rx_strong = /^\\*\\*[^\\*\\s](?:[^\\*]*[^\\*\\s])?\\*\\*/;\n  var rx_emphasis = /^\\*[^\\*\\s](?:[^\\*]*[^\\*\\s])?\\*/;\n  var rx_literal = /^``[^`\\s](?:[^`]*[^`\\s])``/;\n\n  var rx_number = /^(?:[\\d]+(?:[\\.,]\\d+)*)/;\n  var rx_positive = /^(?:\\s\\+[\\d]+(?:[\\.,]\\d+)*)/;\n  var rx_negative = /^(?:\\s\\-[\\d]+(?:[\\.,]\\d+)*)/;\n\n  var rx_uri_protocol = \"[Hh][Tt][Tt][Pp][Ss]?://\";\n  var rx_uri_domain = \"(?:[\\\\d\\\\w.-]+)\\\\.(?:\\\\w{2,6})\";\n  var rx_uri_path = \"(?:/[\\\\d\\\\w\\\\#\\\\%\\\\&\\\\-\\\\.\\\\,\\\\/\\\\:\\\\=\\\\?\\\\~]+)*\";\n  var rx_uri = new RegExp(\"^\" + rx_uri_protocol + rx_uri_domain + rx_uri_path);\n\n  var overlay = {\n    token: function (stream) {\n\n      if (stream.match(rx_strong) && stream.match (/\\W+|$/, false))\n        return 'strong';\n      if (stream.match(rx_emphasis) && stream.match (/\\W+|$/, false))\n        return 'em';\n      if (stream.match(rx_literal) && stream.match (/\\W+|$/, false))\n        return 'string-2';\n      if (stream.match(rx_number))\n        return 'number';\n      if (stream.match(rx_positive))\n        return 'positive';\n      if (stream.match(rx_negative))\n        return 'negative';\n      if (stream.match(rx_uri))\n        return 'link';\n\n      while (stream.next() != null) {\n        if (stream.match(rx_strong, false)) break;\n        if (stream.match(rx_emphasis, false)) break;\n        if (stream.match(rx_literal, false)) break;\n        if (stream.match(rx_number, false)) break;\n        if (stream.match(rx_positive, false)) break;\n        if (stream.match(rx_negative, false)) break;\n        if (stream.match(rx_uri, false)) break;\n      }\n\n      return null;\n    }\n  };\n\n  var mode = CodeMirror.getMode(\n    config, options.backdrop || 'rst-base'\n  );\n\n  return CodeMirror.overlayMode(mode, overlay, true); // combine\n}, 'python', 'stex');\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n\nCodeMirror.defineMode('rst-base', function (config) {\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function format(string) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    return string.replace(/{(\\d+)}/g, function (match, n) {\n      return typeof args[n] != 'undefined' ? args[n] : match;\n    });\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  var mode_python = CodeMirror.getMode(config, 'python');\n  var mode_stex = CodeMirror.getMode(config, 'stex');\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  var SEPA = \"\\\\s+\";\n  var TAIL = \"(?:\\\\s*|\\\\W|$)\",\n  rx_TAIL = new RegExp(format('^{0}', TAIL));\n\n  var NAME =\n    \"(?:[^\\\\W\\\\d_](?:[\\\\w!\\\"#$%&'()\\\\*\\\\+,\\\\-\\\\.\\/:;<=>\\\\?]*[^\\\\W_])?)\",\n  rx_NAME = new RegExp(format('^{0}', NAME));\n  var NAME_WWS =\n    \"(?:[^\\\\W\\\\d_](?:[\\\\w\\\\s!\\\"#$%&'()\\\\*\\\\+,\\\\-\\\\.\\/:;<=>\\\\?]*[^\\\\W_])?)\";\n  var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS);\n\n  var TEXT1 = \"(?:[^\\\\s\\\\|](?:[^\\\\|]*[^\\\\s\\\\|])?)\";\n  var TEXT2 = \"(?:[^\\\\`]+)\",\n  rx_TEXT2 = new RegExp(format('^{0}', TEXT2));\n\n  var rx_section = new RegExp(\n    \"^([!'#$%&\\\"()*+,-./:;<=>?@\\\\[\\\\\\\\\\\\]^_`{|}~])\\\\1{3,}\\\\s*$\");\n  var rx_explicit = new RegExp(\n    format('^\\\\.\\\\.{0}', SEPA));\n  var rx_link = new RegExp(\n    format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL));\n  var rx_directive = new RegExp(\n    format('^{0}::{1}', REF_NAME, TAIL));\n  var rx_substitution = new RegExp(\n    format('^\\\\|{0}\\\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL));\n  var rx_footnote = new RegExp(\n    format('^\\\\[(?:\\\\d+|#{0}?|\\\\*)]{1}', REF_NAME, TAIL));\n  var rx_citation = new RegExp(\n    format('^\\\\[{0}\\\\]{1}', REF_NAME, TAIL));\n\n  var rx_substitution_ref = new RegExp(\n    format('^\\\\|{0}\\\\|', TEXT1));\n  var rx_footnote_ref = new RegExp(\n    format('^\\\\[(?:\\\\d+|#{0}?|\\\\*)]_', REF_NAME));\n  var rx_citation_ref = new RegExp(\n    format('^\\\\[{0}\\\\]_', REF_NAME));\n  var rx_link_ref1 = new RegExp(\n    format('^{0}__?', REF_NAME));\n  var rx_link_ref2 = new RegExp(\n    format('^`{0}`_', TEXT2));\n\n  var rx_role_pre = new RegExp(\n    format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL));\n  var rx_role_suf = new RegExp(\n    format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL));\n  var rx_role = new RegExp(\n    format('^:{0}:{1}', NAME, TAIL));\n\n  var rx_directive_name = new RegExp(format('^{0}', REF_NAME));\n  var rx_directive_tail = new RegExp(format('^::{0}', TAIL));\n  var rx_substitution_text = new RegExp(format('^\\\\|{0}\\\\|', TEXT1));\n  var rx_substitution_sepa = new RegExp(format('^{0}', SEPA));\n  var rx_substitution_name = new RegExp(format('^{0}', REF_NAME));\n  var rx_substitution_tail = new RegExp(format('^::{0}', TAIL));\n  var rx_link_head = new RegExp(\"^_\");\n  var rx_link_name = new RegExp(format('^{0}|_', REF_NAME));\n  var rx_link_tail = new RegExp(format('^:{0}', TAIL));\n\n  var rx_verbatim = new RegExp('^::\\\\s*$');\n  var rx_examples = new RegExp('^\\\\s+(?:>>>|In \\\\[\\\\d+\\\\]:)\\\\s');\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function to_normal(stream, state) {\n    var token = null;\n\n    if (stream.sol() && stream.match(rx_examples, false)) {\n      change(state, to_mode, {\n        mode: mode_python, local: CodeMirror.startState(mode_python)\n      });\n    } else if (stream.sol() && stream.match(rx_explicit)) {\n      change(state, to_explicit);\n      token = 'meta';\n    } else if (stream.sol() && stream.match(rx_section)) {\n      change(state, to_normal);\n      token = 'header';\n    } else if (phase(state) == rx_role_pre ||\n               stream.match(rx_role_pre, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_normal, context(rx_role_pre, 1));\n        stream.match(/^:/);\n        token = 'meta';\n        break;\n      case 1:\n        change(state, to_normal, context(rx_role_pre, 2));\n        stream.match(rx_NAME);\n        token = 'keyword';\n\n        if (stream.current().match(/^(?:math|latex)/)) {\n          state.tmp_stex = true;\n        }\n        break;\n      case 2:\n        change(state, to_normal, context(rx_role_pre, 3));\n        stream.match(/^:`/);\n        token = 'meta';\n        break;\n      case 3:\n        if (state.tmp_stex) {\n          state.tmp_stex = undefined; state.tmp = {\n            mode: mode_stex, local: CodeMirror.startState(mode_stex)\n          };\n        }\n\n        if (state.tmp) {\n          if (stream.peek() == '`') {\n            change(state, to_normal, context(rx_role_pre, 4));\n            state.tmp = undefined;\n            break;\n          }\n\n          token = state.tmp.mode.token(stream, state.tmp.local);\n          break;\n        }\n\n        change(state, to_normal, context(rx_role_pre, 4));\n        stream.match(rx_TEXT2);\n        token = 'string';\n        break;\n      case 4:\n        change(state, to_normal, context(rx_role_pre, 5));\n        stream.match(/^`/);\n        token = 'meta';\n        break;\n      case 5:\n        change(state, to_normal, context(rx_role_pre, 6));\n        stream.match(rx_TAIL);\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (phase(state) == rx_role_suf ||\n               stream.match(rx_role_suf, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_normal, context(rx_role_suf, 1));\n        stream.match(/^`/);\n        token = 'meta';\n        break;\n      case 1:\n        change(state, to_normal, context(rx_role_suf, 2));\n        stream.match(rx_TEXT2);\n        token = 'string';\n        break;\n      case 2:\n        change(state, to_normal, context(rx_role_suf, 3));\n        stream.match(/^`:/);\n        token = 'meta';\n        break;\n      case 3:\n        change(state, to_normal, context(rx_role_suf, 4));\n        stream.match(rx_NAME);\n        token = 'keyword';\n        break;\n      case 4:\n        change(state, to_normal, context(rx_role_suf, 5));\n        stream.match(/^:/);\n        token = 'meta';\n        break;\n      case 5:\n        change(state, to_normal, context(rx_role_suf, 6));\n        stream.match(rx_TAIL);\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (phase(state) == rx_role || stream.match(rx_role, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_normal, context(rx_role, 1));\n        stream.match(/^:/);\n        token = 'meta';\n        break;\n      case 1:\n        change(state, to_normal, context(rx_role, 2));\n        stream.match(rx_NAME);\n        token = 'keyword';\n        break;\n      case 2:\n        change(state, to_normal, context(rx_role, 3));\n        stream.match(/^:/);\n        token = 'meta';\n        break;\n      case 3:\n        change(state, to_normal, context(rx_role, 4));\n        stream.match(rx_TAIL);\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (phase(state) == rx_substitution_ref ||\n               stream.match(rx_substitution_ref, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_normal, context(rx_substitution_ref, 1));\n        stream.match(rx_substitution_text);\n        token = 'variable-2';\n        break;\n      case 1:\n        change(state, to_normal, context(rx_substitution_ref, 2));\n        if (stream.match(/^_?_?/)) token = 'link';\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (stream.match(rx_footnote_ref)) {\n      change(state, to_normal);\n      token = 'quote';\n    } else if (stream.match(rx_citation_ref)) {\n      change(state, to_normal);\n      token = 'quote';\n    } else if (stream.match(rx_link_ref1)) {\n      change(state, to_normal);\n      if (!stream.peek() || stream.peek().match(/^\\W$/)) {\n        token = 'link';\n      }\n    } else if (phase(state) == rx_link_ref2 ||\n               stream.match(rx_link_ref2, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        if (!stream.peek() || stream.peek().match(/^\\W$/)) {\n          change(state, to_normal, context(rx_link_ref2, 1));\n        } else {\n          stream.match(rx_link_ref2);\n        }\n        break;\n      case 1:\n        change(state, to_normal, context(rx_link_ref2, 2));\n        stream.match(/^`/);\n        token = 'link';\n        break;\n      case 2:\n        change(state, to_normal, context(rx_link_ref2, 3));\n        stream.match(rx_TEXT2);\n        break;\n      case 3:\n        change(state, to_normal, context(rx_link_ref2, 4));\n        stream.match(/^`_/);\n        token = 'link';\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (stream.match(rx_verbatim)) {\n      change(state, to_verbatim);\n    }\n\n    else {\n      if (stream.next()) change(state, to_normal);\n    }\n\n    return token;\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function to_explicit(stream, state) {\n    var token = null;\n\n    if (phase(state) == rx_substitution ||\n        stream.match(rx_substitution, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_explicit, context(rx_substitution, 1));\n        stream.match(rx_substitution_text);\n        token = 'variable-2';\n        break;\n      case 1:\n        change(state, to_explicit, context(rx_substitution, 2));\n        stream.match(rx_substitution_sepa);\n        break;\n      case 2:\n        change(state, to_explicit, context(rx_substitution, 3));\n        stream.match(rx_substitution_name);\n        token = 'keyword';\n        break;\n      case 3:\n        change(state, to_explicit, context(rx_substitution, 4));\n        stream.match(rx_substitution_tail);\n        token = 'meta';\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (phase(state) == rx_directive ||\n               stream.match(rx_directive, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_explicit, context(rx_directive, 1));\n        stream.match(rx_directive_name);\n        token = 'keyword';\n\n        if (stream.current().match(/^(?:math|latex)/))\n          state.tmp_stex = true;\n        else if (stream.current().match(/^python/))\n          state.tmp_py = true;\n        break;\n      case 1:\n        change(state, to_explicit, context(rx_directive, 2));\n        stream.match(rx_directive_tail);\n        token = 'meta';\n\n        if (stream.match(/^latex\\s*$/) || state.tmp_stex) {\n          state.tmp_stex = undefined; change(state, to_mode, {\n            mode: mode_stex, local: CodeMirror.startState(mode_stex)\n          });\n        }\n        break;\n      case 2:\n        change(state, to_explicit, context(rx_directive, 3));\n        if (stream.match(/^python\\s*$/) || state.tmp_py) {\n          state.tmp_py = undefined; change(state, to_mode, {\n            mode: mode_python, local: CodeMirror.startState(mode_python)\n          });\n        }\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (phase(state) == rx_link || stream.match(rx_link, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_explicit, context(rx_link, 1));\n        stream.match(rx_link_head);\n        stream.match(rx_link_name);\n        token = 'link';\n        break;\n      case 1:\n        change(state, to_explicit, context(rx_link, 2));\n        stream.match(rx_link_tail);\n        token = 'meta';\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (stream.match(rx_footnote)) {\n      change(state, to_normal);\n      token = 'quote';\n    } else if (stream.match(rx_citation)) {\n      change(state, to_normal);\n      token = 'quote';\n    }\n\n    else {\n      stream.eatSpace();\n      if (stream.eol()) {\n        change(state, to_normal);\n      } else {\n        stream.skipToEnd();\n        change(state, to_comment);\n        token = 'comment';\n      }\n    }\n\n    return token;\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function to_comment(stream, state) {\n    return as_block(stream, state, 'comment');\n  }\n\n  function to_verbatim(stream, state) {\n    return as_block(stream, state, 'meta');\n  }\n\n  function as_block(stream, state, token) {\n    if (stream.eol() || stream.eatSpace()) {\n      stream.skipToEnd();\n      return token;\n    } else {\n      change(state, to_normal);\n      return null;\n    }\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function to_mode(stream, state) {\n\n    if (state.ctx.mode && state.ctx.local) {\n\n      if (stream.sol()) {\n        if (!stream.eatSpace()) change(state, to_normal);\n        return null;\n      }\n\n      return state.ctx.mode.token(stream, state.ctx.local);\n    }\n\n    change(state, to_normal);\n    return null;\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function context(phase, stage, mode, local) {\n    return {phase: phase, stage: stage, mode: mode, local: local};\n  }\n\n  function change(state, tok, ctx) {\n    state.tok = tok;\n    state.ctx = ctx || {};\n  }\n\n  function stage(state) {\n    return state.ctx.stage || 0;\n  }\n\n  function phase(state) {\n    return state.ctx.phase;\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  return {\n    startState: function () {\n      return {tok: to_normal, ctx: context(undefined, 0)};\n    },\n\n    copyState: function (state) {\n      var ctx = state.ctx, tmp = state.tmp;\n      if (ctx.local)\n        ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)};\n      if (tmp)\n        tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)};\n      return {tok: state.tok, ctx: ctx, tmp: tmp};\n    },\n\n    innerMode: function (state) {\n      return state.tmp      ? {state: state.tmp.local, mode: state.tmp.mode}\n      : state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode}\n      : null;\n    },\n\n    token: function (stream, state) {\n      return state.tok(stream, state);\n    }\n  };\n}, 'python', 'stex');\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n\nCodeMirror.defineMIME('text/x-rst', 'rst');\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/ruby/ruby.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction wordObj(words) {\n  var o = {};\n  for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true;\n  return o;\n}\n\nvar keywordList = [\n  \"alias\", \"and\", \"BEGIN\", \"begin\", \"break\", \"case\", \"class\", \"def\", \"defined?\", \"do\", \"else\",\n  \"elsif\", \"END\", \"end\", \"ensure\", \"false\", \"for\", \"if\", \"in\", \"module\", \"next\", \"not\", \"or\",\n  \"redo\", \"rescue\", \"retry\", \"return\", \"self\", \"super\", \"then\", \"true\", \"undef\", \"unless\",\n  \"until\", \"when\", \"while\", \"yield\", \"nil\", \"raise\", \"throw\", \"catch\", \"fail\", \"loop\", \"callcc\",\n  \"caller\", \"lambda\", \"proc\", \"public\", \"protected\", \"private\", \"require\", \"load\",\n  \"require_relative\", \"extend\", \"autoload\", \"__END__\", \"__FILE__\", \"__LINE__\", \"__dir__\"\n], keywords = wordObj(keywordList);\n\nvar indentWords = wordObj([\"def\", \"class\", \"case\", \"for\", \"while\", \"until\", \"module\", \"then\",\n                           \"catch\", \"loop\", \"proc\", \"begin\"]);\nvar dedentWords = wordObj([\"end\", \"until\"]);\nvar opening = {\"[\": \"]\", \"{\": \"}\", \"(\": \")\"};\nvar closing = {\"]\": \"[\", \"}\": \"{\", \")\": \"(\"};\n\nCodeMirror.defineMode(\"ruby\", function(config) {\n  var curPunc;\n\n  function chain(newtok, stream, state) {\n    state.tokenize.push(newtok);\n    return newtok(stream, state);\n  }\n\n  function tokenBase(stream, state) {\n    if (stream.sol() && stream.match(\"=begin\") && stream.eol()) {\n      state.tokenize.push(readBlockComment);\n      return \"comment\";\n    }\n    if (stream.eatSpace()) return null;\n    var ch = stream.next(), m;\n    if (ch == \"`\" || ch == \"'\" || ch == '\"') {\n      return chain(readQuoted(ch, \"string\", ch == '\"' || ch == \"`\"), stream, state);\n    } else if (ch == \"/\") {\n      if (regexpAhead(stream))\n        return chain(readQuoted(ch, \"string-2\", true), stream, state);\n      else\n        return \"operator\";\n    } else if (ch == \"%\") {\n      var style = \"string\", embed = true;\n      if (stream.eat(\"s\")) style = \"atom\";\n      else if (stream.eat(/[WQ]/)) style = \"string\";\n      else if (stream.eat(/[r]/)) style = \"string-2\";\n      else if (stream.eat(/[wxq]/)) { style = \"string\"; embed = false; }\n      var delim = stream.eat(/[^\\w\\s=]/);\n      if (!delim) return \"operator\";\n      if (opening.propertyIsEnumerable(delim)) delim = opening[delim];\n      return chain(readQuoted(delim, style, embed, true), stream, state);\n    } else if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    } else if (ch == \"<\" && (m = stream.match(/^<([-~])[\\`\\\"\\']?([a-zA-Z_?]\\w*)[\\`\\\"\\']?(?:;|$)/))) {\n      return chain(readHereDoc(m[2], m[1]), stream, state);\n    } else if (ch == \"0\") {\n      if (stream.eat(\"x\")) stream.eatWhile(/[\\da-fA-F]/);\n      else if (stream.eat(\"b\")) stream.eatWhile(/[01]/);\n      else stream.eatWhile(/[0-7]/);\n      return \"number\";\n    } else if (/\\d/.test(ch)) {\n      stream.match(/^[\\d_]*(?:\\.[\\d_]+)?(?:[eE][+\\-]?[\\d_]+)?/);\n      return \"number\";\n    } else if (ch == \"?\") {\n      while (stream.match(/^\\\\[CM]-/)) {}\n      if (stream.eat(\"\\\\\")) stream.eatWhile(/\\w/);\n      else stream.next();\n      return \"string\";\n    } else if (ch == \":\") {\n      if (stream.eat(\"'\")) return chain(readQuoted(\"'\", \"atom\", false), stream, state);\n      if (stream.eat('\"')) return chain(readQuoted('\"', \"atom\", true), stream, state);\n\n      // :> :>> :< :<< are valid symbols\n      if (stream.eat(/[\\<\\>]/)) {\n        stream.eat(/[\\<\\>]/);\n        return \"atom\";\n      }\n\n      // :+ :- :/ :* :| :& :! are valid symbols\n      if (stream.eat(/[\\+\\-\\*\\/\\&\\|\\:\\!]/)) {\n        return \"atom\";\n      }\n\n      // Symbols can't start by a digit\n      if (stream.eat(/[a-zA-Z$@_\\xa1-\\uffff]/)) {\n        stream.eatWhile(/[\\w$\\xa1-\\uffff]/);\n        // Only one ? ! = is allowed and only as the last character\n        stream.eat(/[\\?\\!\\=]/);\n        return \"atom\";\n      }\n      return \"operator\";\n    } else if (ch == \"@\" && stream.match(/^@?[a-zA-Z_\\xa1-\\uffff]/)) {\n      stream.eat(\"@\");\n      stream.eatWhile(/[\\w\\xa1-\\uffff]/);\n      return \"variable-2\";\n    } else if (ch == \"$\") {\n      if (stream.eat(/[a-zA-Z_]/)) {\n        stream.eatWhile(/[\\w]/);\n      } else if (stream.eat(/\\d/)) {\n        stream.eat(/\\d/);\n      } else {\n        stream.next(); // Must be a special global like $: or $!\n      }\n      return \"variable-3\";\n    } else if (/[a-zA-Z_\\xa1-\\uffff]/.test(ch)) {\n      stream.eatWhile(/[\\w\\xa1-\\uffff]/);\n      stream.eat(/[\\?\\!]/);\n      if (stream.eat(\":\")) return \"atom\";\n      return \"ident\";\n    } else if (ch == \"|\" && (state.varList || state.lastTok == \"{\" || state.lastTok == \"do\")) {\n      curPunc = \"|\";\n      return null;\n    } else if (/[\\(\\)\\[\\]{}\\\\;]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    } else if (ch == \"-\" && stream.eat(\">\")) {\n      return \"arrow\";\n    } else if (/[=+\\-\\/*:\\.^%<>~|]/.test(ch)) {\n      var more = stream.eatWhile(/[=+\\-\\/*:\\.^%<>~|]/);\n      if (ch == \".\" && !more) curPunc = \".\";\n      return \"operator\";\n    } else {\n      return null;\n    }\n  }\n\n  function regexpAhead(stream) {\n    var start = stream.pos, depth = 0, next, found = false, escaped = false\n    while ((next = stream.next()) != null) {\n      if (!escaped) {\n        if (\"[{(\".indexOf(next) > -1) {\n          depth++\n        } else if (\"]})\".indexOf(next) > -1) {\n          depth--\n          if (depth < 0) break\n        } else if (next == \"/\" && depth == 0) {\n          found = true\n          break\n        }\n        escaped = next == \"\\\\\"\n      } else {\n        escaped = false\n      }\n    }\n    stream.backUp(stream.pos - start)\n    return found\n  }\n\n  function tokenBaseUntilBrace(depth) {\n    if (!depth) depth = 1;\n    return function(stream, state) {\n      if (stream.peek() == \"}\") {\n        if (depth == 1) {\n          state.tokenize.pop();\n          return state.tokenize[state.tokenize.length-1](stream, state);\n        } else {\n          state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth - 1);\n        }\n      } else if (stream.peek() == \"{\") {\n        state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth + 1);\n      }\n      return tokenBase(stream, state);\n    };\n  }\n  function tokenBaseOnce() {\n    var alreadyCalled = false;\n    return function(stream, state) {\n      if (alreadyCalled) {\n        state.tokenize.pop();\n        return state.tokenize[state.tokenize.length-1](stream, state);\n      }\n      alreadyCalled = true;\n      return tokenBase(stream, state);\n    };\n  }\n  function readQuoted(quote, style, embed, unescaped) {\n    return function(stream, state) {\n      var escaped = false, ch;\n\n      if (state.context.type === 'read-quoted-paused') {\n        state.context = state.context.prev;\n        stream.eat(\"}\");\n      }\n\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && (unescaped || !escaped)) {\n          state.tokenize.pop();\n          break;\n        }\n        if (embed && ch == \"#\" && !escaped) {\n          if (stream.eat(\"{\")) {\n            if (quote == \"}\") {\n              state.context = {prev: state.context, type: 'read-quoted-paused'};\n            }\n            state.tokenize.push(tokenBaseUntilBrace());\n            break;\n          } else if (/[@\\$]/.test(stream.peek())) {\n            state.tokenize.push(tokenBaseOnce());\n            break;\n          }\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      return style;\n    };\n  }\n  function readHereDoc(phrase, mayIndent) {\n    return function(stream, state) {\n      if (mayIndent) stream.eatSpace()\n      if (stream.match(phrase)) state.tokenize.pop();\n      else stream.skipToEnd();\n      return \"string\";\n    };\n  }\n  function readBlockComment(stream, state) {\n    if (stream.sol() && stream.match(\"=end\") && stream.eol())\n      state.tokenize.pop();\n    stream.skipToEnd();\n    return \"comment\";\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: [tokenBase],\n              indented: 0,\n              context: {type: \"top\", indented: -config.indentUnit},\n              continuedLine: false,\n              lastTok: null,\n              varList: false};\n    },\n\n    token: function(stream, state) {\n      curPunc = null;\n      if (stream.sol()) state.indented = stream.indentation();\n      var style = state.tokenize[state.tokenize.length-1](stream, state), kwtype;\n      var thisTok = curPunc;\n      if (style == \"ident\") {\n        var word = stream.current();\n        style = state.lastTok == \".\" ? \"property\"\n          : keywords.propertyIsEnumerable(stream.current()) ? \"keyword\"\n          : /^[A-Z]/.test(word) ? \"tag\"\n          : (state.lastTok == \"def\" || state.lastTok == \"class\" || state.varList) ? \"def\"\n          : \"variable\";\n        if (style == \"keyword\") {\n          thisTok = word;\n          if (indentWords.propertyIsEnumerable(word)) kwtype = \"indent\";\n          else if (dedentWords.propertyIsEnumerable(word)) kwtype = \"dedent\";\n          else if ((word == \"if\" || word == \"unless\") && stream.column() == stream.indentation())\n            kwtype = \"indent\";\n          else if (word == \"do\" && state.context.indented < state.indented)\n            kwtype = \"indent\";\n        }\n      }\n      if (curPunc || (style && style != \"comment\")) state.lastTok = thisTok;\n      if (curPunc == \"|\") state.varList = !state.varList;\n\n      if (kwtype == \"indent\" || /[\\(\\[\\{]/.test(curPunc))\n        state.context = {prev: state.context, type: curPunc || style, indented: state.indented};\n      else if ((kwtype == \"dedent\" || /[\\)\\]\\}]/.test(curPunc)) && state.context.prev)\n        state.context = state.context.prev;\n\n      if (stream.eol())\n        state.continuedLine = (curPunc == \"\\\\\" || style == \"operator\");\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize[state.tokenize.length-1] != tokenBase) return CodeMirror.Pass;\n      var firstChar = textAfter && textAfter.charAt(0);\n      var ct = state.context;\n      var closed = ct.type == closing[firstChar] ||\n        ct.type == \"keyword\" && /^(?:end|until|else|elsif|when|rescue)\\b/.test(textAfter);\n      return ct.indented + (closed ? 0 : config.indentUnit) +\n        (state.continuedLine ? config.indentUnit : 0);\n    },\n\n    electricInput: /^\\s*(?:end|rescue|elsif|else|\\})$/,\n    lineComment: \"#\",\n    fold: \"indent\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-ruby\", \"ruby\");\n\nCodeMirror.registerHelper(\"hintWords\", \"ruby\", keywordList);\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/rust/rust.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineSimpleMode(\"rust\",{\n  start: [\n    // string and byte string\n    {regex: /b?\"/, token: \"string\", next: \"string\"},\n    // raw string and raw byte string\n    {regex: /b?r\"/, token: \"string\", next: \"string_raw\"},\n    {regex: /b?r#+\"/, token: \"string\", next: \"string_raw_hash\"},\n    // character\n    {regex: /'(?:[^'\\\\]|\\\\(?:[nrt0'\"]|x[\\da-fA-F]{2}|u\\{[\\da-fA-F]{6}\\}))'/, token: \"string-2\"},\n    // byte\n    {regex: /b'(?:[^']|\\\\(?:['\\\\nrt0]|x[\\da-fA-F]{2}))'/, token: \"string-2\"},\n\n    {regex: /(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/,\n     token: \"number\"},\n    {regex: /(let(?:\\s+mut)?|fn|enum|mod|struct|type|union)(\\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, token: [\"keyword\", null, \"def\"]},\n    {regex: /(?:abstract|alignof|as|async|await|box|break|continue|const|crate|do|dyn|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\\b/, token: \"keyword\"},\n    {regex: /\\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\\b/, token: \"atom\"},\n    {regex: /\\b(?:true|false|Some|None|Ok|Err)\\b/, token: \"builtin\"},\n    {regex: /\\b(fn)(\\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,\n     token: [\"keyword\", null ,\"def\"]},\n    {regex: /#!?\\[.*\\]/, token: \"meta\"},\n    {regex: /\\/\\/.*/, token: \"comment\"},\n    {regex: /\\/\\*/, token: \"comment\", next: \"comment\"},\n    {regex: /[-+\\/*=<>!]+/, token: \"operator\"},\n    {regex: /[a-zA-Z_]\\w*!/,token: \"variable-3\"},\n    {regex: /[a-zA-Z_]\\w*/, token: \"variable\"},\n    {regex: /[\\{\\[\\(]/, indent: true},\n    {regex: /[\\}\\]\\)]/, dedent: true}\n  ],\n  string: [\n    {regex: /\"/, token: \"string\", next: \"start\"},\n    {regex: /(?:[^\\\\\"]|\\\\(?:.|$))*/, token: \"string\"}\n  ],\n  string_raw: [\n    {regex: /\"/, token: \"string\", next: \"start\"},\n    {regex: /[^\"]*/, token: \"string\"}\n  ],\n  string_raw_hash: [\n    {regex: /\"#+/, token: \"string\", next: \"start\"},\n    {regex: /(?:[^\"]|\"(?!#))*/, token: \"string\"}\n  ],\n  comment: [\n    {regex: /.*?\\*\\//, token: \"comment\", next: \"start\"},\n    {regex: /.*/, token: \"comment\"}\n  ],\n  meta: {\n    dontIndentStates: [\"comment\"],\n    electricInput: /^\\s*\\}$/,\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\",\n    fold: \"brace\"\n  }\n});\n\n\nCodeMirror.defineMIME(\"text/x-rustsrc\", \"rust\");\nCodeMirror.defineMIME(\"text/rust\", \"rust\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/sas/sas.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n\n// SAS mode copyright (c) 2016 Jared Dean, SAS Institute\n// Created by Jared Dean\n\n// TODO\n// indent and de-indent\n// identify macro variables\n\n\n//Definitions\n//  comment -- text within * ; or /* */\n//  keyword -- SAS language variable\n//  variable -- macro variables starts with '&' or variable formats\n//  variable-2 -- DATA Step, proc, or macro names\n//  string -- text within ' ' or \" \"\n//  operator -- numeric operator + / - * ** le eq ge ... and so on\n//  builtin -- proc %macro data run mend\n//  atom\n//  def\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"sas\", function () {\n    var words = {};\n    var isDoubleOperatorSym = {\n      eq: 'operator',\n      lt: 'operator',\n      le: 'operator',\n      gt: 'operator',\n      ge: 'operator',\n      \"in\": 'operator',\n      ne: 'operator',\n      or: 'operator'\n    };\n    var isDoubleOperatorChar = /(<=|>=|!=|<>)/;\n    var isSingleOperatorChar = /[=\\(:\\),{}.*<>+\\-\\/^\\[\\]]/;\n\n    // Takes a string of words separated by spaces and adds them as\n    // keys with the value of the first argument 'style'\n    function define(style, string, context) {\n      if (context) {\n        var split = string.split(' ');\n        for (var i = 0; i < split.length; i++) {\n          words[split[i]] = {style: style, state: context};\n        }\n      }\n    }\n    //datastep\n    define('def', 'stack pgm view source debug nesting nolist', ['inDataStep']);\n    define('def', 'if while until for do do; end end; then else cancel', ['inDataStep']);\n    define('def', 'label format _n_ _error_', ['inDataStep']);\n    define('def', 'ALTER BUFNO BUFSIZE CNTLLEV COMPRESS DLDMGACTION ENCRYPT ENCRYPTKEY EXTENDOBSCOUNTER GENMAX GENNUM INDEX LABEL OBSBUF OUTREP PW PWREQ READ REPEMPTY REPLACE REUSE ROLE SORTEDBY SPILL TOBSNO TYPE WRITE FILECLOSE FIRSTOBS IN OBS POINTOBS WHERE WHEREUP IDXNAME IDXWHERE DROP KEEP RENAME', ['inDataStep']);\n    define('def', 'filevar finfo finv fipname fipnamel fipstate first firstobs floor', ['inDataStep']);\n    define('def', 'varfmt varinfmt varlabel varlen varname varnum varray varrayx vartype verify vformat vformatd vformatdx vformatn vformatnx vformatw vformatwx vformatx vinarray vinarrayx vinformat vinformatd vinformatdx vinformatn vinformatnx vinformatw vinformatwx vinformatx vlabel vlabelx vlength vlengthx vname vnamex vnferr vtype vtypex weekday', ['inDataStep']);\n    define('def', 'zipfips zipname zipnamel zipstate', ['inDataStep']);\n    define('def', 'put putc putn', ['inDataStep']);\n    define('builtin', 'data run', ['inDataStep']);\n\n\n    //proc\n    define('def', 'data', ['inProc']);\n\n    // flow control for macros\n    define('def', '%if %end %end; %else %else; %do %do; %then', ['inMacro']);\n\n    //everywhere\n    define('builtin', 'proc run; quit; libname filename %macro %mend option options', ['ALL']);\n\n    define('def', 'footnote title libname ods', ['ALL']);\n    define('def', '%let %put %global %sysfunc %eval ', ['ALL']);\n    // automatic macro variables http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a003167023.htm\n    define('variable', '&sysbuffr &syscc &syscharwidth &syscmd &sysdate &sysdate9 &sysday &sysdevic &sysdmg &sysdsn &sysencoding &sysenv &syserr &syserrortext &sysfilrc &syshostname &sysindex &sysinfo &sysjobid &syslast &syslckrc &syslibrc &syslogapplname &sysmacroname &sysmenv &sysmsg &sysncpu &sysodspath &sysparm &syspbuff &sysprocessid &sysprocessname &sysprocname &sysrc &sysscp &sysscpl &sysscpl &syssite &sysstartid &sysstartname &systcpiphostname &systime &sysuserid &sysver &sysvlong &sysvlong4 &syswarningtext', ['ALL']);\n\n    //footnote[1-9]? title[1-9]?\n\n    //options statement\n    define('def', 'source2 nosource2 page pageno pagesize', ['ALL']);\n\n    //proc and datastep\n    define('def', '_all_ _character_ _cmd_ _freq_ _i_ _infile_ _last_ _msg_ _null_ _numeric_ _temporary_ _type_ abort abs addr adjrsq airy alpha alter altlog altprint and arcos array arsin as atan attrc attrib attrn authserver autoexec awscontrol awsdef awsmenu awsmenumerge awstitle backward band base betainv between blocksize blshift bnot bor brshift bufno bufsize bxor by byerr byline byte calculated call cards cards4 catcache cbufno cdf ceil center cexist change chisq cinv class cleanup close cnonct cntllev coalesce codegen col collate collin column comamid comaux1 comaux2 comdef compbl compound compress config continue convert cos cosh cpuid create cross crosstab css curobs cv daccdb daccdbsl daccsl daccsyd dacctab dairy datalines datalines4 datejul datepart datetime day dbcslang dbcstype dclose ddfm ddm delete delimiter depdb depdbsl depsl depsyd deptab dequote descending descript design= device dflang dhms dif digamma dim dinfo display distinct dkricond dkrocond dlm dnum do dopen doptname doptnum dread drop dropnote dsname dsnferr echo else emaildlg emailid emailpw emailserver emailsys encrypt end endsas engine eof eov erf erfc error errorcheck errors exist exp fappend fclose fcol fdelete feedback fetch fetchobs fexist fget file fileclose fileexist filefmt filename fileref  fmterr fmtsearch fnonct fnote font fontalias  fopen foptname foptnum force formatted formchar formdelim formdlim forward fpoint fpos fput fread frewind frlen from fsep fuzz fwrite gaminv gamma getoption getvarc getvarn go goto group gwindow hbar hbound helpenv helploc hms honorappearance hosthelp hostprint hour hpct html hvar ibessel ibr id if index indexc indexw initcmd initstmt inner input inputc inputn inr insert int intck intnx into intrr invaliddata irr is jbessel join juldate keep kentb kurtosis label lag last lbound leave left length levels lgamma lib  library libref line linesize link list log log10 log2 logpdf logpmf logsdf lostcard lowcase lrecl ls macro macrogen maps mautosource max maxdec maxr mdy mean measures median memtype merge merror min minute missing missover mlogic mod mode model modify month mopen mort mprint mrecall msglevel msymtabmax mvarsize myy n nest netpv new news nmiss no nobatch nobs nocaps nocardimage nocenter nocharcode nocmdmac nocol nocum nodate nodbcs nodetails nodmr nodms nodmsbatch nodup nodupkey noduplicates noechoauto noequals noerrorabend noexitwindows nofullstimer noicon noimplmac noint nolist noloadlist nomiss nomlogic nomprint nomrecall nomsgcase nomstored nomultenvappl nonotes nonumber noobs noovp nopad nopercent noprint noprintinit normal norow norsasuser nosetinit  nosplash nosymbolgen note notes notitle notitles notsorted noverbose noxsync noxwait npv null number numkeys nummousekeys nway obs  on open     order ordinal otherwise out outer outp= output over ovp p(1 5 10 25 50 75 90 95 99) pad pad2  paired parm parmcards path pathdll pathname pdf peek peekc pfkey pmf point poisson poke position printer probbeta probbnml probchi probf probgam probhypr probit probnegb probnorm probsig probt procleave prt ps  pw pwreq qtr quote r ranbin rancau random ranexp rangam range ranks rannor ranpoi rantbl rantri ranuni rcorr read recfm register regr remote remove rename repeat repeated replace resolve retain return reuse reverse rewind right round rsquare rtf rtrace rtraceloc s s2 samploc sasautos sascontrol sasfrscr sasmsg sasmstore sasscript sasuser saving scan sdf second select selection separated seq serror set setcomm setot sign simple sin sinh siteinfo skewness skip sle sls sortedby sortpgm sortseq sortsize soundex  spedis splashlocation split spool sqrt start std stderr stdin stfips stimer stname stnamel stop stopover sub subgroup subpopn substr sum sumwgt symbol symbolgen symget symput sysget sysin sysleave sysmsg sysparm sysprint sysprintfont sysprod sysrc system t table tables tan tanh tapeclose tbufsize terminal test then timepart tinv  tnonct to today tol tooldef totper transformout translate trantab tranwrd trigamma trim trimn trunc truncover type unformatted uniform union until upcase update user usericon uss validate value var  weight when where while wincharset window work workinit workterm write wsum xsync xwait yearcutoff yes yyq  min max', ['inDataStep', 'inProc']);\n    define('operator', 'and not ', ['inDataStep', 'inProc']);\n\n    // Main function\n    function tokenize(stream, state) {\n      // Finally advance the stream\n      var ch = stream.next();\n\n      // BLOCKCOMMENT\n      if (ch === '/' && stream.eat('*')) {\n        state.continueComment = true;\n        return \"comment\";\n      } else if (state.continueComment === true) { // in comment block\n        //comment ends at the beginning of the line\n        if (ch === '*' && stream.peek() === '/') {\n          stream.next();\n          state.continueComment = false;\n        } else if (stream.skipTo('*')) { //comment is potentially later in line\n          stream.skipTo('*');\n          stream.next();\n          if (stream.eat('/'))\n            state.continueComment = false;\n        } else {\n          stream.skipToEnd();\n        }\n        return \"comment\";\n      }\n\n      if (ch == \"*\" && stream.column() == stream.indentation()) {\n        stream.skipToEnd()\n        return \"comment\"\n      }\n\n      // DoubleOperator match\n      var doubleOperator = ch + stream.peek();\n\n      if ((ch === '\"' || ch === \"'\") && !state.continueString) {\n        state.continueString = ch\n        return \"string\"\n      } else if (state.continueString) {\n        if (state.continueString == ch) {\n          state.continueString = null;\n        } else if (stream.skipTo(state.continueString)) {\n          // quote found on this line\n          stream.next();\n          state.continueString = null;\n        } else {\n          stream.skipToEnd();\n        }\n        return \"string\";\n      } else if (state.continueString !== null && stream.eol()) {\n        stream.skipTo(state.continueString) || stream.skipToEnd();\n        return \"string\";\n      } else if (/[\\d\\.]/.test(ch)) { //find numbers\n        if (ch === \".\")\n          stream.match(/^[0-9]+([eE][\\-+]?[0-9]+)?/);\n        else if (ch === \"0\")\n          stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/);\n        else\n          stream.match(/^[0-9]*\\.?[0-9]*([eE][\\-+]?[0-9]+)?/);\n        return \"number\";\n      } else if (isDoubleOperatorChar.test(ch + stream.peek())) { // TWO SYMBOL TOKENS\n        stream.next();\n        return \"operator\";\n      } else if (isDoubleOperatorSym.hasOwnProperty(doubleOperator)) {\n        stream.next();\n        if (stream.peek() === ' ')\n          return isDoubleOperatorSym[doubleOperator.toLowerCase()];\n      } else if (isSingleOperatorChar.test(ch)) { // SINGLE SYMBOL TOKENS\n        return \"operator\";\n      }\n\n      // Matches one whole word -- even if the word is a character\n      var word;\n      if (stream.match(/[%&;\\w]+/, false) != null) {\n        word = ch + stream.match(/[%&;\\w]+/, true);\n        if (/&/.test(word)) return 'variable'\n      } else {\n        word = ch;\n      }\n      // the word after DATA PROC or MACRO\n      if (state.nextword) {\n        stream.match(/[\\w]+/);\n        // match memname.libname\n        if (stream.peek() === '.') stream.skipTo(' ');\n        state.nextword = false;\n        return 'variable-2';\n      }\n\n      word = word.toLowerCase()\n      // Are we in a DATA Step?\n      if (state.inDataStep) {\n        if (word === 'run;' || stream.match(/run\\s;/)) {\n          state.inDataStep = false;\n          return 'builtin';\n        }\n        // variable formats\n        if ((word) && stream.next() === '.') {\n          //either a format or libname.memname\n          if (/\\w/.test(stream.peek())) return 'variable-2';\n          else return 'variable';\n        }\n        // do we have a DATA Step keyword\n        if (word && words.hasOwnProperty(word) &&\n            (words[word].state.indexOf(\"inDataStep\") !== -1 ||\n             words[word].state.indexOf(\"ALL\") !== -1)) {\n          //backup to the start of the word\n          if (stream.start < stream.pos)\n            stream.backUp(stream.pos - stream.start);\n          //advance the length of the word and return\n          for (var i = 0; i < word.length; ++i) stream.next();\n          return words[word].style;\n        }\n      }\n      // Are we in an Proc statement?\n      if (state.inProc) {\n        if (word === 'run;' || word === 'quit;') {\n          state.inProc = false;\n          return 'builtin';\n        }\n        // do we have a proc keyword\n        if (word && words.hasOwnProperty(word) &&\n            (words[word].state.indexOf(\"inProc\") !== -1 ||\n             words[word].state.indexOf(\"ALL\") !== -1)) {\n          stream.match(/[\\w]+/);\n          return words[word].style;\n        }\n      }\n      // Are we in a Macro statement?\n      if (state.inMacro) {\n        if (word === '%mend') {\n          if (stream.peek() === ';') stream.next();\n          state.inMacro = false;\n          return 'builtin';\n        }\n        if (word && words.hasOwnProperty(word) &&\n            (words[word].state.indexOf(\"inMacro\") !== -1 ||\n             words[word].state.indexOf(\"ALL\") !== -1)) {\n          stream.match(/[\\w]+/);\n          return words[word].style;\n        }\n\n        return 'atom';\n      }\n      // Do we have Keywords specific words?\n      if (word && words.hasOwnProperty(word)) {\n        // Negates the initial next()\n        stream.backUp(1);\n        // Actually move the stream\n        stream.match(/[\\w]+/);\n        if (word === 'data' && /=/.test(stream.peek()) === false) {\n          state.inDataStep = true;\n          state.nextword = true;\n          return 'builtin';\n        }\n        if (word === 'proc') {\n          state.inProc = true;\n          state.nextword = true;\n          return 'builtin';\n        }\n        if (word === '%macro') {\n          state.inMacro = true;\n          state.nextword = true;\n          return 'builtin';\n        }\n        if (/title[1-9]/.test(word)) return 'def';\n\n        if (word === 'footnote') {\n          stream.eat(/[1-9]/);\n          return 'def';\n        }\n\n        // Returns their value as state in the prior define methods\n        if (state.inDataStep === true && words[word].state.indexOf(\"inDataStep\") !== -1)\n          return words[word].style;\n        if (state.inProc === true && words[word].state.indexOf(\"inProc\") !== -1)\n          return words[word].style;\n        if (state.inMacro === true && words[word].state.indexOf(\"inMacro\") !== -1)\n          return words[word].style;\n        if (words[word].state.indexOf(\"ALL\") !== -1)\n          return words[word].style;\n        return null;\n      }\n      // Unrecognized syntax\n      return null;\n    }\n\n    return {\n      startState: function () {\n        return {\n          inDataStep: false,\n          inProc: false,\n          inMacro: false,\n          nextword: false,\n          continueString: null,\n          continueComment: false\n        };\n      },\n      token: function (stream, state) {\n        // Strip the spaces, but regex will account for them either way\n        if (stream.eatSpace()) return null;\n        // Go through the main process\n        return tokenize(stream, state);\n      },\n\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\"\n    };\n\n  });\n\n  CodeMirror.defineMIME(\"text/x-sas\", \"sas\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/sass/sass.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../css/css\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../css/css\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"sass\", function(config) {\n  var cssMode = CodeMirror.mimeModes[\"text/css\"];\n  var propertyKeywords = cssMode.propertyKeywords || {},\n      colorKeywords = cssMode.colorKeywords || {},\n      valueKeywords = cssMode.valueKeywords || {},\n      fontProperties = cssMode.fontProperties || {};\n\n  function tokenRegexp(words) {\n    return new RegExp(\"^\" + words.join(\"|\"));\n  }\n\n  var keywords = [\"true\", \"false\", \"null\", \"auto\"];\n  var keywordsRegexp = new RegExp(\"^\" + keywords.join(\"|\"));\n\n  var operators = [\"\\\\(\", \"\\\\)\", \"=\", \">\", \"<\", \"==\", \">=\", \"<=\", \"\\\\+\", \"-\",\n                   \"\\\\!=\", \"/\", \"\\\\*\", \"%\", \"and\", \"or\", \"not\", \";\",\"\\\\{\",\"\\\\}\",\":\"];\n  var opRegexp = tokenRegexp(operators);\n\n  var pseudoElementsRegexp = /^::?[a-zA-Z_][\\w\\-]*/;\n\n  var word;\n\n  function isEndLine(stream) {\n    return !stream.peek() || stream.match(/\\s+$/, false);\n  }\n\n  function urlTokens(stream, state) {\n    var ch = stream.peek();\n\n    if (ch === \")\") {\n      stream.next();\n      state.tokenizer = tokenBase;\n      return \"operator\";\n    } else if (ch === \"(\") {\n      stream.next();\n      stream.eatSpace();\n\n      return \"operator\";\n    } else if (ch === \"'\" || ch === '\"') {\n      state.tokenizer = buildStringTokenizer(stream.next());\n      return \"string\";\n    } else {\n      state.tokenizer = buildStringTokenizer(\")\", false);\n      return \"string\";\n    }\n  }\n  function comment(indentation, multiLine) {\n    return function(stream, state) {\n      if (stream.sol() && stream.indentation() <= indentation) {\n        state.tokenizer = tokenBase;\n        return tokenBase(stream, state);\n      }\n\n      if (multiLine && stream.skipTo(\"*/\")) {\n        stream.next();\n        stream.next();\n        state.tokenizer = tokenBase;\n      } else {\n        stream.skipToEnd();\n      }\n\n      return \"comment\";\n    };\n  }\n\n  function buildStringTokenizer(quote, greedy) {\n    if (greedy == null) { greedy = true; }\n\n    function stringTokenizer(stream, state) {\n      var nextChar = stream.next();\n      var peekChar = stream.peek();\n      var previousChar = stream.string.charAt(stream.pos-2);\n\n      var endingString = ((nextChar !== \"\\\\\" && peekChar === quote) || (nextChar === quote && previousChar !== \"\\\\\"));\n\n      if (endingString) {\n        if (nextChar !== quote && greedy) { stream.next(); }\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        state.tokenizer = tokenBase;\n        return \"string\";\n      } else if (nextChar === \"#\" && peekChar === \"{\") {\n        state.tokenizer = buildInterpolationTokenizer(stringTokenizer);\n        stream.next();\n        return \"operator\";\n      } else {\n        return \"string\";\n      }\n    }\n\n    return stringTokenizer;\n  }\n\n  function buildInterpolationTokenizer(currentTokenizer) {\n    return function(stream, state) {\n      if (stream.peek() === \"}\") {\n        stream.next();\n        state.tokenizer = currentTokenizer;\n        return \"operator\";\n      } else {\n        return tokenBase(stream, state);\n      }\n    };\n  }\n\n  function indent(state) {\n    if (state.indentCount == 0) {\n      state.indentCount++;\n      var lastScopeOffset = state.scopes[0].offset;\n      var currentOffset = lastScopeOffset + config.indentUnit;\n      state.scopes.unshift({ offset:currentOffset });\n    }\n  }\n\n  function dedent(state) {\n    if (state.scopes.length == 1) return;\n\n    state.scopes.shift();\n  }\n\n  function tokenBase(stream, state) {\n    var ch = stream.peek();\n\n    // Comment\n    if (stream.match(\"/*\")) {\n      state.tokenizer = comment(stream.indentation(), true);\n      return state.tokenizer(stream, state);\n    }\n    if (stream.match(\"//\")) {\n      state.tokenizer = comment(stream.indentation(), false);\n      return state.tokenizer(stream, state);\n    }\n\n    // Interpolation\n    if (stream.match(\"#{\")) {\n      state.tokenizer = buildInterpolationTokenizer(tokenBase);\n      return \"operator\";\n    }\n\n    // Strings\n    if (ch === '\"' || ch === \"'\") {\n      stream.next();\n      state.tokenizer = buildStringTokenizer(ch);\n      return \"string\";\n    }\n\n    if(!state.cursorHalf){// state.cursorHalf === 0\n    // first half i.e. before : for key-value pairs\n    // including selectors\n\n      if (ch === \"-\") {\n        if (stream.match(/^-\\w+-/)) {\n          return \"meta\";\n        }\n      }\n\n      if (ch === \".\") {\n        stream.next();\n        if (stream.match(/^[\\w-]+/)) {\n          indent(state);\n          return \"qualifier\";\n        } else if (stream.peek() === \"#\") {\n          indent(state);\n          return \"tag\";\n        }\n      }\n\n      if (ch === \"#\") {\n        stream.next();\n        // ID selectors\n        if (stream.match(/^[\\w-]+/)) {\n          indent(state);\n          return \"builtin\";\n        }\n        if (stream.peek() === \"#\") {\n          indent(state);\n          return \"tag\";\n        }\n      }\n\n      // Variables\n      if (ch === \"$\") {\n        stream.next();\n        stream.eatWhile(/[\\w-]/);\n        return \"variable-2\";\n      }\n\n      // Numbers\n      if (stream.match(/^-?[0-9\\.]+/))\n        return \"number\";\n\n      // Units\n      if (stream.match(/^(px|em|in)\\b/))\n        return \"unit\";\n\n      if (stream.match(keywordsRegexp))\n        return \"keyword\";\n\n      if (stream.match(/^url/) && stream.peek() === \"(\") {\n        state.tokenizer = urlTokens;\n        return \"atom\";\n      }\n\n      if (ch === \"=\") {\n        // Match shortcut mixin definition\n        if (stream.match(/^=[\\w-]+/)) {\n          indent(state);\n          return \"meta\";\n        }\n      }\n\n      if (ch === \"+\") {\n        // Match shortcut mixin definition\n        if (stream.match(/^\\+[\\w-]+/)){\n          return \"variable-3\";\n        }\n      }\n\n      if(ch === \"@\"){\n        if(stream.match('@extend')){\n          if(!stream.match(/\\s*[\\w]/))\n            dedent(state);\n        }\n      }\n\n\n      // Indent Directives\n      if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) {\n        indent(state);\n        return \"def\";\n      }\n\n      // Other Directives\n      if (ch === \"@\") {\n        stream.next();\n        stream.eatWhile(/[\\w-]/);\n        return \"def\";\n      }\n\n      if (stream.eatWhile(/[\\w-]/)){\n        if(stream.match(/ *: *[\\w-\\+\\$#!\\(\"']/,false)){\n          word = stream.current().toLowerCase();\n          var prop = state.prevProp + \"-\" + word;\n          if (propertyKeywords.hasOwnProperty(prop)) {\n            return \"property\";\n          } else if (propertyKeywords.hasOwnProperty(word)) {\n            state.prevProp = word;\n            return \"property\";\n          } else if (fontProperties.hasOwnProperty(word)) {\n            return \"property\";\n          }\n          return \"tag\";\n        }\n        else if(stream.match(/ *:/,false)){\n          indent(state);\n          state.cursorHalf = 1;\n          state.prevProp = stream.current().toLowerCase();\n          return \"property\";\n        }\n        else if(stream.match(/ *,/,false)){\n          return \"tag\";\n        }\n        else{\n          indent(state);\n          return \"tag\";\n        }\n      }\n\n      if(ch === \":\"){\n        if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element\n          return \"variable-3\";\n        }\n        stream.next();\n        state.cursorHalf=1;\n        return \"operator\";\n      }\n\n    } // cursorHalf===0 ends here\n    else{\n\n      if (ch === \"#\") {\n        stream.next();\n        // Hex numbers\n        if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){\n          if (isEndLine(stream)) {\n            state.cursorHalf = 0;\n          }\n          return \"number\";\n        }\n      }\n\n      // Numbers\n      if (stream.match(/^-?[0-9\\.]+/)){\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"number\";\n      }\n\n      // Units\n      if (stream.match(/^(px|em|in)\\b/)){\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"unit\";\n      }\n\n      if (stream.match(keywordsRegexp)){\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"keyword\";\n      }\n\n      if (stream.match(/^url/) && stream.peek() === \"(\") {\n        state.tokenizer = urlTokens;\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"atom\";\n      }\n\n      // Variables\n      if (ch === \"$\") {\n        stream.next();\n        stream.eatWhile(/[\\w-]/);\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"variable-2\";\n      }\n\n      // bang character for !important, !default, etc.\n      if (ch === \"!\") {\n        stream.next();\n        state.cursorHalf = 0;\n        return stream.match(/^[\\w]+/) ? \"keyword\": \"operator\";\n      }\n\n      if (stream.match(opRegexp)){\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"operator\";\n      }\n\n      // attributes\n      if (stream.eatWhile(/[\\w-]/)) {\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        word = stream.current().toLowerCase();\n        if (valueKeywords.hasOwnProperty(word)) {\n          return \"atom\";\n        } else if (colorKeywords.hasOwnProperty(word)) {\n          return \"keyword\";\n        } else if (propertyKeywords.hasOwnProperty(word)) {\n          state.prevProp = stream.current().toLowerCase();\n          return \"property\";\n        } else {\n          return \"tag\";\n        }\n      }\n\n      //stream.eatSpace();\n      if (isEndLine(stream)) {\n        state.cursorHalf = 0;\n        return null;\n      }\n\n    } // else ends here\n\n    if (stream.match(opRegexp))\n      return \"operator\";\n\n    // If we haven't returned by now, we move 1 character\n    // and return an error\n    stream.next();\n    return null;\n  }\n\n  function tokenLexer(stream, state) {\n    if (stream.sol()) state.indentCount = 0;\n    var style = state.tokenizer(stream, state);\n    var current = stream.current();\n\n    if (current === \"@return\" || current === \"}\"){\n      dedent(state);\n    }\n\n    if (style !== null) {\n      var startOfToken = stream.pos - current.length;\n\n      var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount);\n\n      var newScopes = [];\n\n      for (var i = 0; i < state.scopes.length; i++) {\n        var scope = state.scopes[i];\n\n        if (scope.offset <= withCurrentIndent)\n          newScopes.push(scope);\n      }\n\n      state.scopes = newScopes;\n    }\n\n\n    return style;\n  }\n\n  return {\n    startState: function() {\n      return {\n        tokenizer: tokenBase,\n        scopes: [{offset: 0, type: \"sass\"}],\n        indentCount: 0,\n        cursorHalf: 0,  // cursor half tells us if cursor lies after (1)\n                        // or before (0) colon (well... more or less)\n        definedVars: [],\n        definedMixins: []\n      };\n    },\n    token: function(stream, state) {\n      var style = tokenLexer(stream, state);\n\n      state.lastToken = { style: style, content: stream.current() };\n\n      return style;\n    },\n\n    indent: function(state) {\n      return state.scopes[0].offset;\n    },\n\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\",\n    fold: \"indent\"\n  };\n}, \"css\");\n\nCodeMirror.defineMIME(\"text/x-sass\", \"sass\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/scheme/scheme.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Author: Koh Zi Han, based on implementation by Koh Zi Chun\n * Improved by: Jakub T. Jankiewicz\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"scheme\", function () {\n    var BUILTIN = \"builtin\", COMMENT = \"comment\", STRING = \"string\",\n        SYMBOL = \"symbol\", ATOM = \"atom\", NUMBER = \"number\", BRACKET = \"bracket\";\n    var INDENT_WORD_SKIP = 2;\n\n    function makeKeywords(str) {\n        var obj = {}, words = str.split(\" \");\n        for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n        return obj;\n    }\n\n    var keywords = makeKeywords(\"λ case-lambda call/cc class cond-expand define-class define-values exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax define-macro defmacro delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char<? char=? char>=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci<? string-ci=? string-ci>=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string<? string=? string>=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?\");\n    var indentKeys = makeKeywords(\"define let letrec let* lambda define-macro defmacro let-syntax letrec-syntax let-values let*-values define-syntax syntax-rules define-values when unless\");\n\n    function stateStack(indent, type, prev) { // represents a state stack object\n        this.indent = indent;\n        this.type = type;\n        this.prev = prev;\n    }\n\n    function pushStack(state, indent, type) {\n        state.indentStack = new stateStack(indent, type, state.indentStack);\n    }\n\n    function popStack(state) {\n        state.indentStack = state.indentStack.prev;\n    }\n\n    var binaryMatcher = new RegExp(/^(?:[-+]i|[-+][01]+#*(?:\\/[01]+#*)?i|[-+]?[01]+#*(?:\\/[01]+#*)?@[-+]?[01]+#*(?:\\/[01]+#*)?|[-+]?[01]+#*(?:\\/[01]+#*)?[-+](?:[01]+#*(?:\\/[01]+#*)?)?i|[-+]?[01]+#*(?:\\/[01]+#*)?)(?=[()\\s;\"]|$)/i);\n    var octalMatcher = new RegExp(/^(?:[-+]i|[-+][0-7]+#*(?:\\/[0-7]+#*)?i|[-+]?[0-7]+#*(?:\\/[0-7]+#*)?@[-+]?[0-7]+#*(?:\\/[0-7]+#*)?|[-+]?[0-7]+#*(?:\\/[0-7]+#*)?[-+](?:[0-7]+#*(?:\\/[0-7]+#*)?)?i|[-+]?[0-7]+#*(?:\\/[0-7]+#*)?)(?=[()\\s;\"]|$)/i);\n    var hexMatcher = new RegExp(/^(?:[-+]i|[-+][\\da-f]+#*(?:\\/[\\da-f]+#*)?i|[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?@[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?|[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?[-+](?:[\\da-f]+#*(?:\\/[\\da-f]+#*)?)?i|[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?)(?=[()\\s;\"]|$)/i);\n    var decimalMatcher = new RegExp(/^(?:[-+]i|[-+](?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)i|[-+]?(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)@[-+]?(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)|[-+]?(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)[-+](?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)?i|(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*))(?=[()\\s;\"]|$)/i);\n\n    function isBinaryNumber (stream) {\n        return stream.match(binaryMatcher);\n    }\n\n    function isOctalNumber (stream) {\n        return stream.match(octalMatcher);\n    }\n\n    function isDecimalNumber (stream, backup) {\n        if (backup === true) {\n            stream.backUp(1);\n        }\n        return stream.match(decimalMatcher);\n    }\n\n    function isHexNumber (stream) {\n        return stream.match(hexMatcher);\n    }\n\n    function processEscapedSequence(stream, options) {\n        var next, escaped = false;\n        while ((next = stream.next()) != null) {\n            if (next == options.token && !escaped) {\n\n                options.state.mode = false;\n                break;\n            }\n            escaped = !escaped && next == \"\\\\\";\n        }\n    }\n\n    return {\n        startState: function () {\n            return {\n                indentStack: null,\n                indentation: 0,\n                mode: false,\n                sExprComment: false,\n                sExprQuote: false\n            };\n        },\n\n        token: function (stream, state) {\n            if (state.indentStack == null && stream.sol()) {\n                // update indentation, but only if indentStack is empty\n                state.indentation = stream.indentation();\n            }\n\n            // skip spaces\n            if (stream.eatSpace()) {\n                return null;\n            }\n            var returnType = null;\n\n            switch(state.mode){\n                case \"string\": // multi-line string parsing mode\n                    processEscapedSequence(stream, {\n                        token: \"\\\"\",\n                        state: state\n                    });\n                    returnType = STRING; // continue on in scheme-string mode\n                    break;\n                case \"symbol\": // escape symbol\n                    processEscapedSequence(stream, {\n                        token: \"|\",\n                        state: state\n                    });\n                    returnType = SYMBOL; // continue on in scheme-symbol mode\n                    break;\n                case \"comment\": // comment parsing mode\n                    var next, maybeEnd = false;\n                    while ((next = stream.next()) != null) {\n                        if (next == \"#\" && maybeEnd) {\n\n                            state.mode = false;\n                            break;\n                        }\n                        maybeEnd = (next == \"|\");\n                    }\n                    returnType = COMMENT;\n                    break;\n                case \"s-expr-comment\": // s-expr commenting mode\n                    state.mode = false;\n                    if(stream.peek() == \"(\" || stream.peek() == \"[\"){\n                        // actually start scheme s-expr commenting mode\n                        state.sExprComment = 0;\n                    }else{\n                        // if not we just comment the entire of the next token\n                        stream.eatWhile(/[^\\s\\(\\)\\[\\]]/); // eat symbol atom\n                        returnType = COMMENT;\n                        break;\n                    }\n                default: // default parsing mode\n                    var ch = stream.next();\n\n                    if (ch == \"\\\"\") {\n                        state.mode = \"string\";\n                        returnType = STRING;\n\n                    } else if (ch == \"'\") {\n                        if (stream.peek() == \"(\" || stream.peek() == \"[\"){\n                            if (typeof state.sExprQuote != \"number\") {\n                                state.sExprQuote = 0;\n                            } // else already in a quoted expression\n                            returnType = ATOM;\n                        } else {\n                            stream.eatWhile(/[\\w_\\-!$%&*+\\.\\/:<=>?@\\^~]/);\n                            returnType = ATOM;\n                        }\n                    } else if (ch == '|') {\n                        state.mode = \"symbol\";\n                        returnType = SYMBOL;\n                    } else if (ch == '#') {\n                        if (stream.eat(\"|\")) {                    // Multi-line comment\n                            state.mode = \"comment\"; // toggle to comment mode\n                            returnType = COMMENT;\n                        } else if (stream.eat(/[tf]/i)) {            // #t/#f (atom)\n                            returnType = ATOM;\n                        } else if (stream.eat(';')) {                // S-Expr comment\n                            state.mode = \"s-expr-comment\";\n                            returnType = COMMENT;\n                        } else {\n                            var numTest = null, hasExactness = false, hasRadix = true;\n                            if (stream.eat(/[ei]/i)) {\n                                hasExactness = true;\n                            } else {\n                                stream.backUp(1);       // must be radix specifier\n                            }\n                            if (stream.match(/^#b/i)) {\n                                numTest = isBinaryNumber;\n                            } else if (stream.match(/^#o/i)) {\n                                numTest = isOctalNumber;\n                            } else if (stream.match(/^#x/i)) {\n                                numTest = isHexNumber;\n                            } else if (stream.match(/^#d/i)) {\n                                numTest = isDecimalNumber;\n                            } else if (stream.match(/^[-+0-9.]/, false)) {\n                                hasRadix = false;\n                                numTest = isDecimalNumber;\n                            // re-consume the initial # if all matches failed\n                            } else if (!hasExactness) {\n                                stream.eat('#');\n                            }\n                            if (numTest != null) {\n                                if (hasRadix && !hasExactness) {\n                                    // consume optional exactness after radix\n                                    stream.match(/^#[ei]/i);\n                                }\n                                if (numTest(stream))\n                                    returnType = NUMBER;\n                            }\n                        }\n                    } else if (/^[-+0-9.]/.test(ch) && isDecimalNumber(stream, true)) { // match non-prefixed number, must be decimal\n                        returnType = NUMBER;\n                    } else if (ch == \";\") { // comment\n                        stream.skipToEnd(); // rest of the line is a comment\n                        returnType = COMMENT;\n                    } else if (ch == \"(\" || ch == \"[\") {\n                      var keyWord = ''; var indentTemp = stream.column(), letter;\n                        /**\n                        Either\n                        (indent-word ..\n                        (non-indent-word ..\n                        (;something else, bracket, etc.\n                        */\n\n                        while ((letter = stream.eat(/[^\\s\\(\\[\\;\\)\\]]/)) != null) {\n                            keyWord += letter;\n                        }\n\n                        if (keyWord.length > 0 && indentKeys.propertyIsEnumerable(keyWord)) { // indent-word\n\n                            pushStack(state, indentTemp + INDENT_WORD_SKIP, ch);\n                        } else { // non-indent word\n                            // we continue eating the spaces\n                            stream.eatSpace();\n                            if (stream.eol() || stream.peek() == \";\") {\n                                // nothing significant after\n                                // we restart indentation 1 space after\n                                pushStack(state, indentTemp + 1, ch);\n                            } else {\n                                pushStack(state, indentTemp + stream.current().length, ch); // else we match\n                            }\n                        }\n                        stream.backUp(stream.current().length - 1); // undo all the eating\n\n                        if(typeof state.sExprComment == \"number\") state.sExprComment++;\n                        if(typeof state.sExprQuote == \"number\") state.sExprQuote++;\n\n                        returnType = BRACKET;\n                    } else if (ch == \")\" || ch == \"]\") {\n                        returnType = BRACKET;\n                        if (state.indentStack != null && state.indentStack.type == (ch == \")\" ? \"(\" : \"[\")) {\n                            popStack(state);\n\n                            if(typeof state.sExprComment == \"number\"){\n                                if(--state.sExprComment == 0){\n                                    returnType = COMMENT; // final closing bracket\n                                    state.sExprComment = false; // turn off s-expr commenting mode\n                                }\n                            }\n                            if(typeof state.sExprQuote == \"number\"){\n                                if(--state.sExprQuote == 0){\n                                    returnType = ATOM; // final closing bracket\n                                    state.sExprQuote = false; // turn off s-expr quote mode\n                                }\n                            }\n                        }\n                    } else {\n                        stream.eatWhile(/[\\w_\\-!$%&*+\\.\\/:<=>?@\\^~]/);\n\n                        if (keywords && keywords.propertyIsEnumerable(stream.current())) {\n                            returnType = BUILTIN;\n                        } else returnType = \"variable\";\n                    }\n            }\n            return (typeof state.sExprComment == \"number\") ? COMMENT : ((typeof state.sExprQuote == \"number\") ? ATOM : returnType);\n        },\n\n        indent: function (state) {\n            if (state.indentStack == null) return state.indentation;\n            return state.indentStack.indent;\n        },\n\n        fold: \"brace-paren\",\n        closeBrackets: {pairs: \"()[]{}\\\"\\\"\"},\n        lineComment: \";;\"\n    };\n});\n\nCodeMirror.defineMIME(\"text/x-scheme\", \"scheme\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/shell/shell.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('shell', function() {\n\n  var words = {};\n  function define(style, dict) {\n    for(var i = 0; i < dict.length; i++) {\n      words[dict[i]] = style;\n    }\n  };\n\n  var commonAtoms = [\"true\", \"false\"];\n  var commonKeywords = [\"if\", \"then\", \"do\", \"else\", \"elif\", \"while\", \"until\", \"for\", \"in\", \"esac\", \"fi\",\n    \"fin\", \"fil\", \"done\", \"exit\", \"set\", \"unset\", \"export\", \"function\"];\n  var commonCommands = [\"ab\", \"awk\", \"bash\", \"beep\", \"cat\", \"cc\", \"cd\", \"chown\", \"chmod\", \"chroot\", \"clear\",\n    \"cp\", \"curl\", \"cut\", \"diff\", \"echo\", \"find\", \"gawk\", \"gcc\", \"get\", \"git\", \"grep\", \"hg\", \"kill\", \"killall\",\n    \"ln\", \"ls\", \"make\", \"mkdir\", \"openssl\", \"mv\", \"nc\", \"nl\", \"node\", \"npm\", \"ping\", \"ps\", \"restart\", \"rm\",\n    \"rmdir\", \"sed\", \"service\", \"sh\", \"shopt\", \"shred\", \"source\", \"sort\", \"sleep\", \"ssh\", \"start\", \"stop\",\n    \"su\", \"sudo\", \"svn\", \"tee\", \"telnet\", \"top\", \"touch\", \"vi\", \"vim\", \"wall\", \"wc\", \"wget\", \"who\", \"write\",\n    \"yes\", \"zsh\"];\n\n  CodeMirror.registerHelper(\"hintWords\", \"shell\", commonAtoms.concat(commonKeywords, commonCommands));\n\n  define('atom', commonAtoms);\n  define('keyword', commonKeywords);\n  define('builtin', commonCommands);\n\n  function tokenBase(stream, state) {\n    if (stream.eatSpace()) return null;\n\n    var sol = stream.sol();\n    var ch = stream.next();\n\n    if (ch === '\\\\') {\n      stream.next();\n      return null;\n    }\n    if (ch === '\\'' || ch === '\"' || ch === '`') {\n      state.tokens.unshift(tokenString(ch, ch === \"`\" ? \"quote\" : \"string\"));\n      return tokenize(stream, state);\n    }\n    if (ch === '#') {\n      if (sol && stream.eat('!')) {\n        stream.skipToEnd();\n        return 'meta'; // 'comment'?\n      }\n      stream.skipToEnd();\n      return 'comment';\n    }\n    if (ch === '$') {\n      state.tokens.unshift(tokenDollar);\n      return tokenize(stream, state);\n    }\n    if (ch === '+' || ch === '=') {\n      return 'operator';\n    }\n    if (ch === '-') {\n      stream.eat('-');\n      stream.eatWhile(/\\w/);\n      return 'attribute';\n    }\n    if (ch == \"<\") {\n      if (stream.match(\"<<\")) return \"operator\"\n      var heredoc = stream.match(/^<-?\\s*['\"]?([^'\"]*)['\"]?/)\n      if (heredoc) {\n        state.tokens.unshift(tokenHeredoc(heredoc[1]))\n        return 'string-2'\n      }\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/\\d/);\n      if(stream.eol() || !/\\w/.test(stream.peek())) {\n        return 'number';\n      }\n    }\n    stream.eatWhile(/[\\w-]/);\n    var cur = stream.current();\n    if (stream.peek() === '=' && /\\w+/.test(cur)) return 'def';\n    return words.hasOwnProperty(cur) ? words[cur] : null;\n  }\n\n  function tokenString(quote, style) {\n    var close = quote == \"(\" ? \")\" : quote == \"{\" ? \"}\" : quote\n    return function(stream, state) {\n      var next, escaped = false;\n      while ((next = stream.next()) != null) {\n        if (next === close && !escaped) {\n          state.tokens.shift();\n          break;\n        } else if (next === '$' && !escaped && quote !== \"'\" && stream.peek() != close) {\n          escaped = true;\n          stream.backUp(1);\n          state.tokens.unshift(tokenDollar);\n          break;\n        } else if (!escaped && quote !== close && next === quote) {\n          state.tokens.unshift(tokenString(quote, style))\n          return tokenize(stream, state)\n        } else if (!escaped && /['\"]/.test(next) && !/['\"]/.test(quote)) {\n          state.tokens.unshift(tokenStringStart(next, \"string\"));\n          stream.backUp(1);\n          break;\n        }\n        escaped = !escaped && next === '\\\\';\n      }\n      return style;\n    };\n  };\n\n  function tokenStringStart(quote, style) {\n    return function(stream, state) {\n      state.tokens[0] = tokenString(quote, style)\n      stream.next()\n      return tokenize(stream, state)\n    }\n  }\n\n  var tokenDollar = function(stream, state) {\n    if (state.tokens.length > 1) stream.eat('$');\n    var ch = stream.next()\n    if (/['\"({]/.test(ch)) {\n      state.tokens[0] = tokenString(ch, ch == \"(\" ? \"quote\" : ch == \"{\" ? \"def\" : \"string\");\n      return tokenize(stream, state);\n    }\n    if (!/\\d/.test(ch)) stream.eatWhile(/\\w/);\n    state.tokens.shift();\n    return 'def';\n  };\n\n  function tokenHeredoc(delim) {\n    return function(stream, state) {\n      if (stream.sol() && stream.string == delim) state.tokens.shift()\n      stream.skipToEnd()\n      return \"string-2\"\n    }\n  }\n\n  function tokenize(stream, state) {\n    return (state.tokens[0] || tokenBase) (stream, state);\n  };\n\n  return {\n    startState: function() {return {tokens:[]};},\n    token: function(stream, state) {\n      return tokenize(stream, state);\n    },\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n    lineComment: '#',\n    fold: \"brace\"\n  };\n});\n\nCodeMirror.defineMIME('text/x-sh', 'shell');\n// Apache uses a slightly different Media Type for Shell scripts\n// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types\nCodeMirror.defineMIME('application/x-sh', 'shell');\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/sieve/sieve.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"sieve\", function(config) {\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  var keywords = words(\"if elsif else stop require\");\n  var atoms = words(\"true false not\");\n  var indentUnit = config.indentUnit;\n\n  function tokenBase(stream, state) {\n\n    var ch = stream.next();\n    if (ch == \"/\" && stream.eat(\"*\")) {\n      state.tokenize = tokenCComment;\n      return tokenCComment(stream, state);\n    }\n\n    if (ch === '#') {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n\n    if (ch == \"\\\"\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n\n    if (ch == \"(\") {\n      state._indent.push(\"(\");\n      // add virtual angel wings so that editor behaves...\n      // ...more sane in case of broken brackets\n      state._indent.push(\"{\");\n      return null;\n    }\n\n    if (ch === \"{\") {\n      state._indent.push(\"{\");\n      return null;\n    }\n\n    if (ch == \")\")  {\n      state._indent.pop();\n      state._indent.pop();\n    }\n\n    if (ch === \"}\") {\n      state._indent.pop();\n      return null;\n    }\n\n    if (ch == \",\")\n      return null;\n\n    if (ch == \";\")\n      return null;\n\n\n    if (/[{}\\(\\),;]/.test(ch))\n      return null;\n\n    // 1*DIGIT \"K\" / \"M\" / \"G\"\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\d]/);\n      stream.eat(/[KkMmGg]/);\n      return \"number\";\n    }\n\n    // \":\" (ALPHA / \"_\") *(ALPHA / DIGIT / \"_\")\n    if (ch == \":\") {\n      stream.eatWhile(/[a-zA-Z_]/);\n      stream.eatWhile(/[a-zA-Z0-9_]/);\n\n      return \"operator\";\n    }\n\n    stream.eatWhile(/\\w/);\n    var cur = stream.current();\n\n    // \"text:\" *(SP / HTAB) (hash-comment / CRLF)\n    // *(multiline-literal / multiline-dotstart)\n    // \".\" CRLF\n    if ((cur == \"text\") && stream.eat(\":\"))\n    {\n      state.tokenize = tokenMultiLineString;\n      return \"string\";\n    }\n\n    if (keywords.propertyIsEnumerable(cur))\n      return \"keyword\";\n\n    if (atoms.propertyIsEnumerable(cur))\n      return \"atom\";\n\n    return null;\n  }\n\n  function tokenMultiLineString(stream, state)\n  {\n    state._multiLineString = true;\n    // the first line is special it may contain a comment\n    if (!stream.sol()) {\n      stream.eatSpace();\n\n      if (stream.peek() == \"#\") {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n\n      stream.skipToEnd();\n      return \"string\";\n    }\n\n    if ((stream.next() == \".\")  && (stream.eol()))\n    {\n      state._multiLineString = false;\n      state.tokenize = tokenBase;\n    }\n\n    return \"string\";\n  }\n\n  function tokenCComment(stream, state) {\n    var maybeEnd = false, ch;\n    while ((ch = stream.next()) != null) {\n      if (maybeEnd && ch == \"/\") {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped)\n          break;\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      if (!escaped) state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  return {\n    startState: function(base) {\n      return {tokenize: tokenBase,\n              baseIndent: base || 0,\n              _indent: []};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace())\n        return null;\n\n      return (state.tokenize || tokenBase)(stream, state);\n    },\n\n    indent: function(state, _textAfter) {\n      var length = state._indent.length;\n      if (_textAfter && (_textAfter[0] == \"}\"))\n        length--;\n\n      if (length <0)\n        length = 0;\n\n      return length * indentUnit;\n    },\n\n    electricChars: \"}\"\n  };\n});\n\nCodeMirror.defineMIME(\"application/sieve\", \"sieve\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/slim/slim.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"), require(\"../ruby/ruby\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\", \"../ruby/ruby\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\n  CodeMirror.defineMode(\"slim\", function(config) {\n    var htmlMode = CodeMirror.getMode(config, {name: \"htmlmixed\"});\n    var rubyMode = CodeMirror.getMode(config, \"ruby\");\n    var modes = { html: htmlMode, ruby: rubyMode };\n    var embedded = {\n      ruby: \"ruby\",\n      javascript: \"javascript\",\n      css: \"text/css\",\n      sass: \"text/x-sass\",\n      scss: \"text/x-scss\",\n      less: \"text/x-less\",\n      styl: \"text/x-styl\", // no highlighting so far\n      coffee: \"coffeescript\",\n      asciidoc: \"text/x-asciidoc\",\n      markdown: \"text/x-markdown\",\n      textile: \"text/x-textile\", // no highlighting so far\n      creole: \"text/x-creole\", // no highlighting so far\n      wiki: \"text/x-wiki\", // no highlighting so far\n      mediawiki: \"text/x-mediawiki\", // no highlighting so far\n      rdoc: \"text/x-rdoc\", // no highlighting so far\n      builder: \"text/x-builder\", // no highlighting so far\n      nokogiri: \"text/x-nokogiri\", // no highlighting so far\n      erb: \"application/x-erb\"\n    };\n    var embeddedRegexp = function(map){\n      var arr = [];\n      for(var key in map) arr.push(key);\n      return new RegExp(\"^(\"+arr.join('|')+\"):\");\n    }(embedded);\n\n    var styleMap = {\n      \"commentLine\": \"comment\",\n      \"slimSwitch\": \"operator special\",\n      \"slimTag\": \"tag\",\n      \"slimId\": \"attribute def\",\n      \"slimClass\": \"attribute qualifier\",\n      \"slimAttribute\": \"attribute\",\n      \"slimSubmode\": \"keyword special\",\n      \"closeAttributeTag\": null,\n      \"slimDoctype\": null,\n      \"lineContinuation\": null\n    };\n    var closing = {\n      \"{\": \"}\",\n      \"[\": \"]\",\n      \"(\": \")\"\n    };\n\n    var nameStartChar = \"_a-zA-Z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\";\n    var nameChar = nameStartChar + \"\\\\-0-9\\xB7\\u0300-\\u036F\\u203F-\\u2040\";\n    var nameRegexp = new RegExp(\"^[:\"+nameStartChar+\"](?::[\"+nameChar+\"]|[\"+nameChar+\"]*)\");\n    var attributeNameRegexp = new RegExp(\"^[:\"+nameStartChar+\"][:\\\\.\"+nameChar+\"]*(?=\\\\s*=)\");\n    var wrappedAttributeNameRegexp = new RegExp(\"^[:\"+nameStartChar+\"][:\\\\.\"+nameChar+\"]*\");\n    var classNameRegexp = /^\\.-?[_a-zA-Z]+[\\w\\-]*/;\n    var classIdRegexp = /^#[_a-zA-Z]+[\\w\\-]*/;\n\n    function backup(pos, tokenize, style) {\n      var restore = function(stream, state) {\n        state.tokenize = tokenize;\n        if (stream.pos < pos) {\n          stream.pos = pos;\n          return style;\n        }\n        return state.tokenize(stream, state);\n      };\n      return function(stream, state) {\n        state.tokenize = restore;\n        return tokenize(stream, state);\n      };\n    }\n\n    function maybeBackup(stream, state, pat, offset, style) {\n      var cur = stream.current();\n      var idx = cur.search(pat);\n      if (idx > -1) {\n        state.tokenize = backup(stream.pos, state.tokenize, style);\n        stream.backUp(cur.length - idx - offset);\n      }\n      return style;\n    }\n\n    function continueLine(state, column) {\n      state.stack = {\n        parent: state.stack,\n        style: \"continuation\",\n        indented: column,\n        tokenize: state.line\n      };\n      state.line = state.tokenize;\n    }\n    function finishContinue(state) {\n      if (state.line == state.tokenize) {\n        state.line = state.stack.tokenize;\n        state.stack = state.stack.parent;\n      }\n    }\n\n    function lineContinuable(column, tokenize) {\n      return function(stream, state) {\n        finishContinue(state);\n        if (stream.match(/^\\\\$/)) {\n          continueLine(state, column);\n          return \"lineContinuation\";\n        }\n        var style = tokenize(stream, state);\n        if (stream.eol() && stream.current().match(/(?:^|[^\\\\])(?:\\\\\\\\)*\\\\$/)) {\n          stream.backUp(1);\n        }\n        return style;\n      };\n    }\n    function commaContinuable(column, tokenize) {\n      return function(stream, state) {\n        finishContinue(state);\n        var style = tokenize(stream, state);\n        if (stream.eol() && stream.current().match(/,$/)) {\n          continueLine(state, column);\n        }\n        return style;\n      };\n    }\n\n    function rubyInQuote(endQuote, tokenize) {\n      // TODO: add multi line support\n      return function(stream, state) {\n        var ch = stream.peek();\n        if (ch == endQuote && state.rubyState.tokenize.length == 1) {\n          // step out of ruby context as it seems to complete processing all the braces\n          stream.next();\n          state.tokenize = tokenize;\n          return \"closeAttributeTag\";\n        } else {\n          return ruby(stream, state);\n        }\n      };\n    }\n    function startRubySplat(tokenize) {\n      var rubyState;\n      var runSplat = function(stream, state) {\n        if (state.rubyState.tokenize.length == 1 && !state.rubyState.context.prev) {\n          stream.backUp(1);\n          if (stream.eatSpace()) {\n            state.rubyState = rubyState;\n            state.tokenize = tokenize;\n            return tokenize(stream, state);\n          }\n          stream.next();\n        }\n        return ruby(stream, state);\n      };\n      return function(stream, state) {\n        rubyState = state.rubyState;\n        state.rubyState = CodeMirror.startState(rubyMode);\n        state.tokenize = runSplat;\n        return ruby(stream, state);\n      };\n    }\n\n    function ruby(stream, state) {\n      return rubyMode.token(stream, state.rubyState);\n    }\n\n    function htmlLine(stream, state) {\n      if (stream.match(/^\\\\$/)) {\n        return \"lineContinuation\";\n      }\n      return html(stream, state);\n    }\n    function html(stream, state) {\n      if (stream.match(/^#\\{/)) {\n        state.tokenize = rubyInQuote(\"}\", state.tokenize);\n        return null;\n      }\n      return maybeBackup(stream, state, /[^\\\\]#\\{/, 1, htmlMode.token(stream, state.htmlState));\n    }\n\n    function startHtmlLine(lastTokenize) {\n      return function(stream, state) {\n        var style = htmlLine(stream, state);\n        if (stream.eol()) state.tokenize = lastTokenize;\n        return style;\n      };\n    }\n\n    function startHtmlMode(stream, state, offset) {\n      state.stack = {\n        parent: state.stack,\n        style: \"html\",\n        indented: stream.column() + offset, // pipe + space\n        tokenize: state.line\n      };\n      state.line = state.tokenize = html;\n      return null;\n    }\n\n    function comment(stream, state) {\n      stream.skipToEnd();\n      return state.stack.style;\n    }\n\n    function commentMode(stream, state) {\n      state.stack = {\n        parent: state.stack,\n        style: \"comment\",\n        indented: state.indented + 1,\n        tokenize: state.line\n      };\n      state.line = comment;\n      return comment(stream, state);\n    }\n\n    function attributeWrapper(stream, state) {\n      if (stream.eat(state.stack.endQuote)) {\n        state.line = state.stack.line;\n        state.tokenize = state.stack.tokenize;\n        state.stack = state.stack.parent;\n        return null;\n      }\n      if (stream.match(wrappedAttributeNameRegexp)) {\n        state.tokenize = attributeWrapperAssign;\n        return \"slimAttribute\";\n      }\n      stream.next();\n      return null;\n    }\n    function attributeWrapperAssign(stream, state) {\n      if (stream.match(/^==?/)) {\n        state.tokenize = attributeWrapperValue;\n        return null;\n      }\n      return attributeWrapper(stream, state);\n    }\n    function attributeWrapperValue(stream, state) {\n      var ch = stream.peek();\n      if (ch == '\"' || ch == \"\\'\") {\n        state.tokenize = readQuoted(ch, \"string\", true, false, attributeWrapper);\n        stream.next();\n        return state.tokenize(stream, state);\n      }\n      if (ch == '[') {\n        return startRubySplat(attributeWrapper)(stream, state);\n      }\n      if (stream.match(/^(true|false|nil)\\b/)) {\n        state.tokenize = attributeWrapper;\n        return \"keyword\";\n      }\n      return startRubySplat(attributeWrapper)(stream, state);\n    }\n\n    function startAttributeWrapperMode(state, endQuote, tokenize) {\n      state.stack = {\n        parent: state.stack,\n        style: \"wrapper\",\n        indented: state.indented + 1,\n        tokenize: tokenize,\n        line: state.line,\n        endQuote: endQuote\n      };\n      state.line = state.tokenize = attributeWrapper;\n      return null;\n    }\n\n    function sub(stream, state) {\n      if (stream.match(/^#\\{/)) {\n        state.tokenize = rubyInQuote(\"}\", state.tokenize);\n        return null;\n      }\n      var subStream = new CodeMirror.StringStream(stream.string.slice(state.stack.indented), stream.tabSize);\n      subStream.pos = stream.pos - state.stack.indented;\n      subStream.start = stream.start - state.stack.indented;\n      subStream.lastColumnPos = stream.lastColumnPos - state.stack.indented;\n      subStream.lastColumnValue = stream.lastColumnValue - state.stack.indented;\n      var style = state.subMode.token(subStream, state.subState);\n      stream.pos = subStream.pos + state.stack.indented;\n      return style;\n    }\n    function firstSub(stream, state) {\n      state.stack.indented = stream.column();\n      state.line = state.tokenize = sub;\n      return state.tokenize(stream, state);\n    }\n\n    function createMode(mode) {\n      var query = embedded[mode];\n      var spec = CodeMirror.mimeModes[query];\n      if (spec) {\n        return CodeMirror.getMode(config, spec);\n      }\n      var factory = CodeMirror.modes[query];\n      if (factory) {\n        return factory(config, {name: query});\n      }\n      return CodeMirror.getMode(config, \"null\");\n    }\n\n    function getMode(mode) {\n      if (!modes.hasOwnProperty(mode)) {\n        return modes[mode] = createMode(mode);\n      }\n      return modes[mode];\n    }\n\n    function startSubMode(mode, state) {\n      var subMode = getMode(mode);\n      var subState = CodeMirror.startState(subMode);\n\n      state.subMode = subMode;\n      state.subState = subState;\n\n      state.stack = {\n        parent: state.stack,\n        style: \"sub\",\n        indented: state.indented + 1,\n        tokenize: state.line\n      };\n      state.line = state.tokenize = firstSub;\n      return \"slimSubmode\";\n    }\n\n    function doctypeLine(stream, _state) {\n      stream.skipToEnd();\n      return \"slimDoctype\";\n    }\n\n    function startLine(stream, state) {\n      var ch = stream.peek();\n      if (ch == '<') {\n        return (state.tokenize = startHtmlLine(state.tokenize))(stream, state);\n      }\n      if (stream.match(/^[|']/)) {\n        return startHtmlMode(stream, state, 1);\n      }\n      if (stream.match(/^\\/(!|\\[\\w+])?/)) {\n        return commentMode(stream, state);\n      }\n      if (stream.match(/^(-|==?[<>]?)/)) {\n        state.tokenize = lineContinuable(stream.column(), commaContinuable(stream.column(), ruby));\n        return \"slimSwitch\";\n      }\n      if (stream.match(/^doctype\\b/)) {\n        state.tokenize = doctypeLine;\n        return \"keyword\";\n      }\n\n      var m = stream.match(embeddedRegexp);\n      if (m) {\n        return startSubMode(m[1], state);\n      }\n\n      return slimTag(stream, state);\n    }\n\n    function slim(stream, state) {\n      if (state.startOfLine) {\n        return startLine(stream, state);\n      }\n      return slimTag(stream, state);\n    }\n\n    function slimTag(stream, state) {\n      if (stream.eat('*')) {\n        state.tokenize = startRubySplat(slimTagExtras);\n        return null;\n      }\n      if (stream.match(nameRegexp)) {\n        state.tokenize = slimTagExtras;\n        return \"slimTag\";\n      }\n      return slimClass(stream, state);\n    }\n    function slimTagExtras(stream, state) {\n      if (stream.match(/^(<>?|><?)/)) {\n        state.tokenize = slimClass;\n        return null;\n      }\n      return slimClass(stream, state);\n    }\n    function slimClass(stream, state) {\n      if (stream.match(classIdRegexp)) {\n        state.tokenize = slimClass;\n        return \"slimId\";\n      }\n      if (stream.match(classNameRegexp)) {\n        state.tokenize = slimClass;\n        return \"slimClass\";\n      }\n      return slimAttribute(stream, state);\n    }\n    function slimAttribute(stream, state) {\n      if (stream.match(/^([\\[\\{\\(])/)) {\n        return startAttributeWrapperMode(state, closing[RegExp.$1], slimAttribute);\n      }\n      if (stream.match(attributeNameRegexp)) {\n        state.tokenize = slimAttributeAssign;\n        return \"slimAttribute\";\n      }\n      if (stream.peek() == '*') {\n        stream.next();\n        state.tokenize = startRubySplat(slimContent);\n        return null;\n      }\n      return slimContent(stream, state);\n    }\n    function slimAttributeAssign(stream, state) {\n      if (stream.match(/^==?/)) {\n        state.tokenize = slimAttributeValue;\n        return null;\n      }\n      // should never happen, because of forward lookup\n      return slimAttribute(stream, state);\n    }\n\n    function slimAttributeValue(stream, state) {\n      var ch = stream.peek();\n      if (ch == '\"' || ch == \"\\'\") {\n        state.tokenize = readQuoted(ch, \"string\", true, false, slimAttribute);\n        stream.next();\n        return state.tokenize(stream, state);\n      }\n      if (ch == '[') {\n        return startRubySplat(slimAttribute)(stream, state);\n      }\n      if (ch == ':') {\n        return startRubySplat(slimAttributeSymbols)(stream, state);\n      }\n      if (stream.match(/^(true|false|nil)\\b/)) {\n        state.tokenize = slimAttribute;\n        return \"keyword\";\n      }\n      return startRubySplat(slimAttribute)(stream, state);\n    }\n    function slimAttributeSymbols(stream, state) {\n      stream.backUp(1);\n      if (stream.match(/^[^\\s],(?=:)/)) {\n        state.tokenize = startRubySplat(slimAttributeSymbols);\n        return null;\n      }\n      stream.next();\n      return slimAttribute(stream, state);\n    }\n    function readQuoted(quote, style, embed, unescaped, nextTokenize) {\n      return function(stream, state) {\n        finishContinue(state);\n        var fresh = stream.current().length == 0;\n        if (stream.match(/^\\\\$/, fresh)) {\n          if (!fresh) return style;\n          continueLine(state, state.indented);\n          return \"lineContinuation\";\n        }\n        if (stream.match(/^#\\{/, fresh)) {\n          if (!fresh) return style;\n          state.tokenize = rubyInQuote(\"}\", state.tokenize);\n          return null;\n        }\n        var escaped = false, ch;\n        while ((ch = stream.next()) != null) {\n          if (ch == quote && (unescaped || !escaped)) {\n            state.tokenize = nextTokenize;\n            break;\n          }\n          if (embed && ch == \"#\" && !escaped) {\n            if (stream.eat(\"{\")) {\n              stream.backUp(2);\n              break;\n            }\n          }\n          escaped = !escaped && ch == \"\\\\\";\n        }\n        if (stream.eol() && escaped) {\n          stream.backUp(1);\n        }\n        return style;\n      };\n    }\n    function slimContent(stream, state) {\n      if (stream.match(/^==?/)) {\n        state.tokenize = ruby;\n        return \"slimSwitch\";\n      }\n      if (stream.match(/^\\/$/)) { // tag close hint\n        state.tokenize = slim;\n        return null;\n      }\n      if (stream.match(/^:/)) { // inline tag\n        state.tokenize = slimTag;\n        return \"slimSwitch\";\n      }\n      startHtmlMode(stream, state, 0);\n      return state.tokenize(stream, state);\n    }\n\n    var mode = {\n      // default to html mode\n      startState: function() {\n        var htmlState = CodeMirror.startState(htmlMode);\n        var rubyState = CodeMirror.startState(rubyMode);\n        return {\n          htmlState: htmlState,\n          rubyState: rubyState,\n          stack: null,\n          last: null,\n          tokenize: slim,\n          line: slim,\n          indented: 0\n        };\n      },\n\n      copyState: function(state) {\n        return {\n          htmlState : CodeMirror.copyState(htmlMode, state.htmlState),\n          rubyState: CodeMirror.copyState(rubyMode, state.rubyState),\n          subMode: state.subMode,\n          subState: state.subMode && CodeMirror.copyState(state.subMode, state.subState),\n          stack: state.stack,\n          last: state.last,\n          tokenize: state.tokenize,\n          line: state.line\n        };\n      },\n\n      token: function(stream, state) {\n        if (stream.sol()) {\n          state.indented = stream.indentation();\n          state.startOfLine = true;\n          state.tokenize = state.line;\n          while (state.stack && state.stack.indented > state.indented && state.last != \"slimSubmode\") {\n            state.line = state.tokenize = state.stack.tokenize;\n            state.stack = state.stack.parent;\n            state.subMode = null;\n            state.subState = null;\n          }\n        }\n        if (stream.eatSpace()) return null;\n        var style = state.tokenize(stream, state);\n        state.startOfLine = false;\n        if (style) state.last = style;\n        return styleMap.hasOwnProperty(style) ? styleMap[style] : style;\n      },\n\n      blankLine: function(state) {\n        if (state.subMode && state.subMode.blankLine) {\n          return state.subMode.blankLine(state.subState);\n        }\n      },\n\n      innerMode: function(state) {\n        if (state.subMode) return {state: state.subState, mode: state.subMode};\n        return {state: state, mode: mode};\n      }\n\n      //indent: function(state) {\n      //  return state.indented;\n      //}\n    };\n    return mode;\n  }, \"htmlmixed\", \"ruby\");\n\n  CodeMirror.defineMIME(\"text/x-slim\", \"slim\");\n  CodeMirror.defineMIME(\"application/x-slim\", \"slim\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/smalltalk/smalltalk.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('smalltalk', function(config) {\n\n  var specialChars = /[+\\-\\/\\\\*~<>=@%|&?!.,:;^]/;\n  var keywords = /true|false|nil|self|super|thisContext/;\n\n  var Context = function(tokenizer, parent) {\n    this.next = tokenizer;\n    this.parent = parent;\n  };\n\n  var Token = function(name, context, eos) {\n    this.name = name;\n    this.context = context;\n    this.eos = eos;\n  };\n\n  var State = function() {\n    this.context = new Context(next, null);\n    this.expectVariable = true;\n    this.indentation = 0;\n    this.userIndentationDelta = 0;\n  };\n\n  State.prototype.userIndent = function(indentation) {\n    this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0;\n  };\n\n  var next = function(stream, context, state) {\n    var token = new Token(null, context, false);\n    var aChar = stream.next();\n\n    if (aChar === '\"') {\n      token = nextComment(stream, new Context(nextComment, context));\n\n    } else if (aChar === '\\'') {\n      token = nextString(stream, new Context(nextString, context));\n\n    } else if (aChar === '#') {\n      if (stream.peek() === '\\'') {\n        stream.next();\n        token = nextSymbol(stream, new Context(nextSymbol, context));\n      } else {\n        if (stream.eatWhile(/[^\\s.{}\\[\\]()]/))\n          token.name = 'string-2';\n        else\n          token.name = 'meta';\n      }\n\n    } else if (aChar === '$') {\n      if (stream.next() === '<') {\n        stream.eatWhile(/[^\\s>]/);\n        stream.next();\n      }\n      token.name = 'string-2';\n\n    } else if (aChar === '|' && state.expectVariable) {\n      token.context = new Context(nextTemporaries, context);\n\n    } else if (/[\\[\\]{}()]/.test(aChar)) {\n      token.name = 'bracket';\n      token.eos = /[\\[{(]/.test(aChar);\n\n      if (aChar === '[') {\n        state.indentation++;\n      } else if (aChar === ']') {\n        state.indentation = Math.max(0, state.indentation - 1);\n      }\n\n    } else if (specialChars.test(aChar)) {\n      stream.eatWhile(specialChars);\n      token.name = 'operator';\n      token.eos = aChar !== ';'; // ; cascaded message expression\n\n    } else if (/\\d/.test(aChar)) {\n      stream.eatWhile(/[\\w\\d]/);\n      token.name = 'number';\n\n    } else if (/[\\w_]/.test(aChar)) {\n      stream.eatWhile(/[\\w\\d_]/);\n      token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null;\n\n    } else {\n      token.eos = state.expectVariable;\n    }\n\n    return token;\n  };\n\n  var nextComment = function(stream, context) {\n    stream.eatWhile(/[^\"]/);\n    return new Token('comment', stream.eat('\"') ? context.parent : context, true);\n  };\n\n  var nextString = function(stream, context) {\n    stream.eatWhile(/[^']/);\n    return new Token('string', stream.eat('\\'') ? context.parent : context, false);\n  };\n\n  var nextSymbol = function(stream, context) {\n    stream.eatWhile(/[^']/);\n    return new Token('string-2', stream.eat('\\'') ? context.parent : context, false);\n  };\n\n  var nextTemporaries = function(stream, context) {\n    var token = new Token(null, context, false);\n    var aChar = stream.next();\n\n    if (aChar === '|') {\n      token.context = context.parent;\n      token.eos = true;\n\n    } else {\n      stream.eatWhile(/[^|]/);\n      token.name = 'variable';\n    }\n\n    return token;\n  };\n\n  return {\n    startState: function() {\n      return new State;\n    },\n\n    token: function(stream, state) {\n      state.userIndent(stream.indentation());\n\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      var token = state.context.next(stream, state.context, state);\n      state.context = token.context;\n      state.expectVariable = token.eos;\n\n      return token.name;\n    },\n\n    blankLine: function(state) {\n      state.userIndent(0);\n    },\n\n    indent: function(state, textAfter) {\n      var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta;\n      return (state.indentation + i) * config.indentUnit;\n    },\n\n    electricChars: ']'\n  };\n\n});\n\nCodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/smarty/smarty.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Smarty 2 and 3 mode.\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"smarty\", function(config, parserConf) {\n    var rightDelimiter = parserConf.rightDelimiter || \"}\";\n    var leftDelimiter = parserConf.leftDelimiter || \"{\";\n    var version = parserConf.version || 2;\n    var baseMode = CodeMirror.getMode(config, parserConf.baseMode || \"null\");\n\n    var keyFunctions = [\"debug\", \"extends\", \"function\", \"include\", \"literal\"];\n    var regs = {\n      operatorChars: /[+\\-*&%=<>!?]/,\n      validIdentifier: /[a-zA-Z0-9_]/,\n      stringChar: /['\"]/\n    };\n\n    var last;\n    function cont(style, lastType) {\n      last = lastType;\n      return style;\n    }\n\n    function chain(stream, state, parser) {\n      state.tokenize = parser;\n      return parser(stream, state);\n    }\n\n    // Smarty 3 allows { and } surrounded by whitespace to NOT slip into Smarty mode\n    function doesNotCount(stream, pos) {\n      if (pos == null) pos = stream.pos;\n      return version === 3 && leftDelimiter == \"{\" &&\n        (pos == stream.string.length || /\\s/.test(stream.string.charAt(pos)));\n    }\n\n    function tokenTop(stream, state) {\n      var string = stream.string;\n      for (var scan = stream.pos;;) {\n        var nextMatch = string.indexOf(leftDelimiter, scan);\n        scan = nextMatch + leftDelimiter.length;\n        if (nextMatch == -1 || !doesNotCount(stream, nextMatch + leftDelimiter.length)) break;\n      }\n      if (nextMatch == stream.pos) {\n        stream.match(leftDelimiter);\n        if (stream.eat(\"*\")) {\n          return chain(stream, state, tokenBlock(\"comment\", \"*\" + rightDelimiter));\n        } else {\n          state.depth++;\n          state.tokenize = tokenSmarty;\n          last = \"startTag\";\n          return \"tag\";\n        }\n      }\n\n      if (nextMatch > -1) stream.string = string.slice(0, nextMatch);\n      var token = baseMode.token(stream, state.base);\n      if (nextMatch > -1) stream.string = string;\n      return token;\n    }\n\n    // parsing Smarty content\n    function tokenSmarty(stream, state) {\n      if (stream.match(rightDelimiter, true)) {\n        if (version === 3) {\n          state.depth--;\n          if (state.depth <= 0) {\n            state.tokenize = tokenTop;\n          }\n        } else {\n          state.tokenize = tokenTop;\n        }\n        return cont(\"tag\", null);\n      }\n\n      if (stream.match(leftDelimiter, true)) {\n        state.depth++;\n        return cont(\"tag\", \"startTag\");\n      }\n\n      var ch = stream.next();\n      if (ch == \"$\") {\n        stream.eatWhile(regs.validIdentifier);\n        return cont(\"variable-2\", \"variable\");\n      } else if (ch == \"|\") {\n        return cont(\"operator\", \"pipe\");\n      } else if (ch == \".\") {\n        return cont(\"operator\", \"property\");\n      } else if (regs.stringChar.test(ch)) {\n        state.tokenize = tokenAttribute(ch);\n        return cont(\"string\", \"string\");\n      } else if (regs.operatorChars.test(ch)) {\n        stream.eatWhile(regs.operatorChars);\n        return cont(\"operator\", \"operator\");\n      } else if (ch == \"[\" || ch == \"]\") {\n        return cont(\"bracket\", \"bracket\");\n      } else if (ch == \"(\" || ch == \")\") {\n        return cont(\"bracket\", \"operator\");\n      } else if (/\\d/.test(ch)) {\n        stream.eatWhile(/\\d/);\n        return cont(\"number\", \"number\");\n      } else {\n\n        if (state.last == \"variable\") {\n          if (ch == \"@\") {\n            stream.eatWhile(regs.validIdentifier);\n            return cont(\"property\", \"property\");\n          } else if (ch == \"|\") {\n            stream.eatWhile(regs.validIdentifier);\n            return cont(\"qualifier\", \"modifier\");\n          }\n        } else if (state.last == \"pipe\") {\n          stream.eatWhile(regs.validIdentifier);\n          return cont(\"qualifier\", \"modifier\");\n        } else if (state.last == \"whitespace\") {\n          stream.eatWhile(regs.validIdentifier);\n          return cont(\"attribute\", \"modifier\");\n        } if (state.last == \"property\") {\n          stream.eatWhile(regs.validIdentifier);\n          return cont(\"property\", null);\n        } else if (/\\s/.test(ch)) {\n          last = \"whitespace\";\n          return null;\n        }\n\n        var str = \"\";\n        if (ch != \"/\") {\n          str += ch;\n        }\n        var c = null;\n        while (c = stream.eat(regs.validIdentifier)) {\n          str += c;\n        }\n        for (var i=0, j=keyFunctions.length; i<j; i++) {\n          if (keyFunctions[i] == str) {\n            return cont(\"keyword\", \"keyword\");\n          }\n        }\n        if (/\\s/.test(ch)) {\n          return null;\n        }\n        return cont(\"tag\", \"tag\");\n      }\n    }\n\n    function tokenAttribute(quote) {\n      return function(stream, state) {\n        var prevChar = null;\n        var currChar = null;\n        while (!stream.eol()) {\n          currChar = stream.peek();\n          if (stream.next() == quote && prevChar !== '\\\\') {\n            state.tokenize = tokenSmarty;\n            break;\n          }\n          prevChar = currChar;\n        }\n        return \"string\";\n      };\n    }\n\n    function tokenBlock(style, terminator) {\n      return function(stream, state) {\n        while (!stream.eol()) {\n          if (stream.match(terminator)) {\n            state.tokenize = tokenTop;\n            break;\n          }\n          stream.next();\n        }\n        return style;\n      };\n    }\n\n    return {\n      startState: function() {\n        return {\n          base: CodeMirror.startState(baseMode),\n          tokenize: tokenTop,\n          last: null,\n          depth: 0\n        };\n      },\n      copyState: function(state) {\n        return {\n          base: CodeMirror.copyState(baseMode, state.base),\n          tokenize: state.tokenize,\n          last: state.last,\n          depth: state.depth\n        };\n      },\n      innerMode: function(state) {\n        if (state.tokenize == tokenTop)\n          return {mode: baseMode, state: state.base};\n      },\n      token: function(stream, state) {\n        var style = state.tokenize(stream, state);\n        state.last = last;\n        return style;\n      },\n      indent: function(state, text, line) {\n        if (state.tokenize == tokenTop && baseMode.indent)\n          return baseMode.indent(state.base, text, line);\n        else\n          return CodeMirror.Pass;\n      },\n      blockCommentStart: leftDelimiter + \"*\",\n      blockCommentEnd: \"*\" + rightDelimiter\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-smarty\", \"smarty\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/solr/solr.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"solr\", function() {\n  \"use strict\";\n\n  var isStringChar = /[^\\s\\|\\!\\+\\-\\*\\?\\~\\^\\&\\:\\(\\)\\[\\]\\{\\}\\\"\\\\]/;\n  var isOperatorChar = /[\\|\\!\\+\\-\\*\\?\\~\\^\\&]/;\n  var isOperatorString = /^(OR|AND|NOT|TO)$/i;\n\n  function isNumber(word) {\n    return parseFloat(word).toString() === word;\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) break;\n        escaped = !escaped && next == \"\\\\\";\n      }\n\n      if (!escaped) state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  function tokenOperator(operator) {\n    return function(stream, state) {\n      var style = \"operator\";\n      if (operator == \"+\")\n        style += \" positive\";\n      else if (operator == \"-\")\n        style += \" negative\";\n      else if (operator == \"|\")\n        stream.eat(/\\|/);\n      else if (operator == \"&\")\n        stream.eat(/\\&/);\n      else if (operator == \"^\")\n        style += \" boost\";\n\n      state.tokenize = tokenBase;\n      return style;\n    };\n  }\n\n  function tokenWord(ch) {\n    return function(stream, state) {\n      var word = ch;\n      while ((ch = stream.peek()) && ch.match(isStringChar) != null) {\n        word += stream.next();\n      }\n\n      state.tokenize = tokenBase;\n      if (isOperatorString.test(word))\n        return \"operator\";\n      else if (isNumber(word))\n        return \"number\";\n      else if (stream.peek() == \":\")\n        return \"field\";\n      else\n        return \"string\";\n    };\n  }\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"')\n      state.tokenize = tokenString(ch);\n    else if (isOperatorChar.test(ch))\n      state.tokenize = tokenOperator(ch);\n    else if (isStringChar.test(ch))\n      state.tokenize = tokenWord(ch);\n\n    return (state.tokenize != tokenBase) ? state.tokenize(stream, state) : null;\n  }\n\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase\n      };\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      return state.tokenize(stream, state);\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-solr\", \"solr\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/soy/soy.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var paramData = { noEndTag: true, soyState: \"param-def\" };\n  var tags = {\n    \"alias\": { noEndTag: true },\n    \"delpackage\": { noEndTag: true },\n    \"namespace\": { noEndTag: true, soyState: \"namespace-def\" },\n    \"@attribute\": paramData,\n    \"@attribute?\": paramData,\n    \"@param\": paramData,\n    \"@param?\": paramData,\n    \"@inject\": paramData,\n    \"@inject?\": paramData,\n    \"@state\": paramData,\n    \"template\": { soyState: \"templ-def\", variableScope: true},\n    \"extern\": {soyState: \"param-def\"},\n    \"export\": {soyState: \"export\"},\n    \"literal\": { },\n    \"msg\": {},\n    \"fallbackmsg\": { noEndTag: true, reduceIndent: true},\n    \"select\": {},\n    \"plural\": {},\n    \"let\": { soyState: \"var-def\" },\n    \"if\": {},\n    \"javaimpl\": {},\n    \"jsimpl\": {},\n    \"elseif\": { noEndTag: true, reduceIndent: true},\n    \"else\": { noEndTag: true, reduceIndent: true},\n    \"switch\": {},\n    \"case\": { noEndTag: true, reduceIndent: true},\n    \"default\": { noEndTag: true, reduceIndent: true},\n    \"foreach\": { variableScope: true, soyState: \"for-loop\" },\n    \"ifempty\": { noEndTag: true, reduceIndent: true},\n    \"for\": { variableScope: true, soyState: \"for-loop\" },\n    \"call\": { soyState: \"templ-ref\" },\n    \"param\": { soyState: \"param-ref\"},\n    \"print\": { noEndTag: true },\n    \"deltemplate\": { soyState: \"templ-def\", variableScope: true},\n    \"delcall\": { soyState: \"templ-ref\" },\n    \"log\": {},\n    \"element\": { variableScope: true },\n    \"velog\": {},\n    \"const\": { soyState: \"const-def\"},\n  };\n\n  var indentingTags = Object.keys(tags).filter(function(tag) {\n    return !tags[tag].noEndTag || tags[tag].reduceIndent;\n  });\n\n  CodeMirror.defineMode(\"soy\", function(config) {\n    var textMode = CodeMirror.getMode(config, \"text/plain\");\n    var modes = {\n      html: CodeMirror.getMode(config, {name: \"text/html\", multilineTagIndentFactor: 2, multilineTagIndentPastTag: false, allowMissingTagName: true}),\n      attributes: textMode,\n      text: textMode,\n      uri: textMode,\n      trusted_resource_uri: textMode,\n      css: CodeMirror.getMode(config, \"text/css\"),\n      js: CodeMirror.getMode(config, {name: \"text/javascript\", statementIndent: 2 * config.indentUnit})\n    };\n\n    function last(array) {\n      return array[array.length - 1];\n    }\n\n    function tokenUntil(stream, state, untilRegExp) {\n      if (stream.sol()) {\n        for (var indent = 0; indent < state.indent; indent++) {\n          if (!stream.eat(/\\s/)) break;\n        }\n        if (indent) return null;\n      }\n      var oldString = stream.string;\n      var match = untilRegExp.exec(oldString.substr(stream.pos));\n      if (match) {\n        // We don't use backUp because it backs up just the position, not the state.\n        // This uses an undocumented API.\n        stream.string = oldString.substr(0, stream.pos + match.index);\n      }\n      var result = stream.hideFirstChars(state.indent, function() {\n        var localState = last(state.localStates);\n        return localState.mode.token(stream, localState.state);\n      });\n      stream.string = oldString;\n      return result;\n    }\n\n    function contains(list, element) {\n      while (list) {\n        if (list.element === element) return true;\n        list = list.next;\n      }\n      return false;\n    }\n\n    function prepend(list, element) {\n      return {\n        element: element,\n        next: list\n      };\n    }\n\n    function popcontext(state) {\n      if (!state.context) return;\n      if (state.context.scope) {\n        state.variables = state.context.scope;\n      }\n      state.context = state.context.previousContext;\n    }\n\n    // Reference a variable `name` in `list`.\n    // Let `loose` be truthy to ignore missing identifiers.\n    function ref(list, name, loose) {\n      return contains(list, name) ? \"variable-2\" : (loose ? \"variable\" : \"variable-2 error\");\n    }\n\n    // Data for an open soy tag.\n    function Context(previousContext, tag, scope) {\n      this.previousContext = previousContext;\n      this.tag = tag;\n      this.kind = null;\n      this.scope = scope;\n    }\n\n    function expression(stream, state) {\n      var match;\n      if (stream.match(/[[]/)) {\n        state.soyState.push(\"list-literal\");\n        state.context = new Context(state.context, \"list-literal\", state.variables);\n        state.lookupVariables = false;\n        return null;\n      } else if (stream.match(/\\bmap(?=\\()/)) {\n        state.soyState.push(\"map-literal\");\n        return \"keyword\";\n      } else if (stream.match(/\\brecord(?=\\()/)) {\n        state.soyState.push(\"record-literal\");\n        return \"keyword\";\n      } else if (stream.match(/([\\w]+)(?=\\()/)) {\n        return \"variable callee\";\n      } else if (match = stream.match(/^[\"']/)) {\n        state.soyState.push(\"string\");\n        state.quoteKind = match[0];\n        return \"string\";\n      } else if (stream.match(/^[(]/)) {\n        state.soyState.push(\"open-parentheses\");\n        return null;\n      } else if (stream.match(/(null|true|false)(?!\\w)/) ||\n          stream.match(/0x([0-9a-fA-F]{2,})/) ||\n          stream.match(/-?([0-9]*[.])?[0-9]+(e[0-9]*)?/)) {\n        return \"atom\";\n      } else if (stream.match(/(\\||[+\\-*\\/%]|[=!]=|\\?:|[<>]=?)/)) {\n        // Tokenize filter, binary, null propagator, and equality operators.\n        return \"operator\";\n      } else if (match = stream.match(/^\\$([\\w]+)/)) {\n        return ref(state.variables, match[1], !state.lookupVariables);\n      } else if (match = stream.match(/^\\w+/)) {\n        return /^(?:as|and|or|not|in|if)$/.test(match[0]) ? \"keyword\" : null;\n      }\n\n      stream.next();\n      return null;\n    }\n\n    return {\n      startState: function() {\n        return {\n          soyState: [],\n          variables: prepend(null, 'ij'),\n          scopes: null,\n          indent: 0,\n          quoteKind: null,\n          context: null,\n          lookupVariables: true, // Is unknown variables considered an error\n          localStates: [{\n            mode: modes.html,\n            state: CodeMirror.startState(modes.html)\n          }]\n        };\n      },\n\n      copyState: function(state) {\n        return {\n          tag: state.tag, // Last seen Soy tag.\n          soyState: state.soyState.concat([]),\n          variables: state.variables,\n          context: state.context,\n          indent: state.indent, // Indentation of the following line.\n          quoteKind: state.quoteKind,\n          lookupVariables: state.lookupVariables,\n          localStates: state.localStates.map(function(localState) {\n            return {\n              mode: localState.mode,\n              state: CodeMirror.copyState(localState.mode, localState.state)\n            };\n          })\n        };\n      },\n\n      token: function(stream, state) {\n        var match;\n\n        switch (last(state.soyState)) {\n          case \"comment\":\n            if (stream.match(/^.*?\\*\\//)) {\n              state.soyState.pop();\n            } else {\n              stream.skipToEnd();\n            }\n            if (!state.context || !state.context.scope) {\n              var paramRe = /@param\\??\\s+(\\S+)/g;\n              var current = stream.current();\n              for (var match; (match = paramRe.exec(current)); ) {\n                state.variables = prepend(state.variables, match[1]);\n              }\n            }\n            return \"comment\";\n\n          case \"string\":\n            var match = stream.match(/^.*?([\"']|\\\\[\\s\\S])/);\n            if (!match) {\n              stream.skipToEnd();\n            } else if (match[1] == state.quoteKind) {\n              state.quoteKind = null;\n              state.soyState.pop();\n            }\n            return \"string\";\n        }\n\n        if (!state.soyState.length || last(state.soyState) != \"literal\") {\n          if (stream.match(/^\\/\\*/)) {\n            state.soyState.push(\"comment\");\n            return \"comment\";\n          } else if (stream.match(stream.sol() ? /^\\s*\\/\\/.*/ : /^\\s+\\/\\/.*/)) {\n            return \"comment\";\n          }\n        }\n\n        switch (last(state.soyState)) {\n          case \"templ-def\":\n            if (match = stream.match(/^\\.?([\\w]+(?!\\.[\\w]+)*)/)) {\n              state.soyState.pop();\n              return \"def\";\n            }\n            stream.next();\n            return null;\n\n          case \"templ-ref\":\n            if (match = stream.match(/(\\.?[a-zA-Z_][a-zA-Z_0-9]+)+/)) {\n              state.soyState.pop();\n              // If the first character is '.', it can only be a local template.\n              if (match[0][0] == '.') {\n                return \"variable-2\"\n              }\n              // Otherwise\n              return \"variable\";\n            }\n            if (match = stream.match(/^\\$([\\w]+)/)) {\n              state.soyState.pop();\n              return ref(state.variables, match[1], !state.lookupVariables);\n            }\n\n            stream.next();\n            return null;\n\n          case \"namespace-def\":\n            if (match = stream.match(/^\\.?([\\w\\.]+)/)) {\n              state.soyState.pop();\n              return \"variable\";\n            }\n            stream.next();\n            return null;\n\n          case \"param-def\":\n            if (match = stream.match(/^\\*/)) {\n              state.soyState.pop();\n              state.soyState.push(\"param-type\");\n              return \"type\";\n            }\n            if (match = stream.match(/^\\w+/)) {\n              state.variables = prepend(state.variables, match[0]);\n              state.soyState.pop();\n              state.soyState.push(\"param-type\");\n              return \"def\";\n            }\n            stream.next();\n            return null;\n\n          case \"param-ref\":\n            if (match = stream.match(/^\\w+/)) {\n              state.soyState.pop();\n              return \"property\";\n            }\n            stream.next();\n            return null;\n\n          case \"open-parentheses\":\n            if (stream.match(/[)]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            return expression(stream, state);\n\n          case \"param-type\":\n            var peekChar = stream.peek();\n            if (\"}]=>,\".indexOf(peekChar) != -1) {\n              state.soyState.pop();\n              return null;\n            } else if (peekChar == \"[\") {\n              state.soyState.push('param-type-record');\n              return null;\n            } else if (peekChar == \"(\") {\n              state.soyState.push('param-type-template');\n              return null;\n            } else if (peekChar == \"<\") {\n              state.soyState.push('param-type-parameter');\n              return null;\n            } else if (match = stream.match(/^([\\w]+|[?])/)) {\n              return \"type\";\n            }\n            stream.next();\n            return null;\n\n          case \"param-type-record\":\n            var peekChar = stream.peek();\n            if (peekChar == \"]\") {\n              state.soyState.pop();\n              return null;\n            }\n            if (stream.match(/^\\w+/)) {\n              state.soyState.push('param-type');\n              return \"property\";\n            }\n            stream.next();\n            return null;\n\n          case \"param-type-parameter\":\n            if (stream.match(/^[>]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            if (stream.match(/^[<,]/)) {\n              state.soyState.push('param-type');\n              return null;\n            }\n            stream.next();\n            return null;\n\n          case \"param-type-template\":\n            if (stream.match(/[>]/)) {\n              state.soyState.pop();\n              state.soyState.push('param-type');\n              return null;\n            }\n            if (stream.match(/^\\w+/)) {\n              state.soyState.push('param-type');\n              return \"def\";\n            }\n            stream.next();\n            return null;\n\n          case \"var-def\":\n            if (match = stream.match(/^\\$([\\w]+)/)) {\n              state.variables = prepend(state.variables, match[1]);\n              state.soyState.pop();\n              return \"def\";\n            }\n            stream.next();\n            return null;\n\n          case \"for-loop\":\n            if (stream.match(/\\bin\\b/)) {\n              state.soyState.pop();\n              return \"keyword\";\n            }\n            if (stream.peek() == \"$\") {\n              state.soyState.push('var-def');\n              return null;\n            }\n            stream.next();\n            return null;\n\n          case \"record-literal\":\n            if (stream.match(/^[)]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            if (stream.match(/[(,]/)) {\n              state.soyState.push(\"map-value\")\n              state.soyState.push(\"record-key\")\n              return null;\n            }\n            stream.next()\n            return null;\n\n          case \"map-literal\":\n            if (stream.match(/^[)]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            if (stream.match(/[(,]/)) {\n              state.soyState.push(\"map-value\")\n              state.soyState.push(\"map-value\")\n              return null;\n            }\n            stream.next()\n            return null;\n\n          case \"list-literal\":\n            if (stream.match(']')) {\n              state.soyState.pop();\n              state.lookupVariables = true;\n              popcontext(state);\n              return null;\n            }\n            if (stream.match(/\\bfor\\b/)) {\n              state.lookupVariables = true;\n              state.soyState.push('for-loop');\n              return \"keyword\";\n            }\n            return expression(stream, state);\n\n          case \"record-key\":\n            if (stream.match(/[\\w]+/)) {\n              return \"property\";\n            }\n            if (stream.match(/^[:]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            stream.next();\n            return null;\n\n          case \"map-value\":\n            if (stream.peek() == \")\" || stream.peek() == \",\" || stream.match(/^[:)]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            return expression(stream, state);\n\n          case \"import\":\n            if (stream.eat(\";\")) {\n              state.soyState.pop();\n              state.indent -= 2 * config.indentUnit;\n              return null;\n            }\n            if (stream.match(/\\w+(?=\\s+as\\b)/)) {\n              return \"variable\";\n            }\n            if (match = stream.match(/\\w+/)) {\n              return /\\b(from|as)\\b/.test(match[0]) ? \"keyword\" : \"def\";\n            }\n            if (match = stream.match(/^[\"']/)) {\n              state.soyState.push(\"string\");\n              state.quoteKind = match[0];\n              return \"string\";\n            }\n            stream.next();\n            return null;\n\n          case \"tag\":\n            var endTag;\n            var tagName;\n            if (state.tag === undefined) {\n              endTag = true;\n              tagName = '';\n            } else {\n              endTag = state.tag[0] == \"/\";\n              tagName = endTag ? state.tag.substring(1) : state.tag;\n            }\n            var tag = tags[tagName];\n            if (stream.match(/^\\/?}/)) {\n              var selfClosed = stream.current() == \"/}\";\n              if (selfClosed && !endTag) {\n                popcontext(state);\n              }\n              if (state.tag == \"/template\" || state.tag == \"/deltemplate\") {\n                state.variables = prepend(null, 'ij');\n                state.indent = 0;\n              } else {\n                state.indent -= config.indentUnit *\n                    (selfClosed || indentingTags.indexOf(state.tag) == -1 ? 2 : 1);\n              }\n              state.soyState.pop();\n              return \"keyword\";\n            } else if (stream.match(/^([\\w?]+)(?==)/)) {\n              if (state.context && state.context.tag == tagName && stream.current() == \"kind\" && (match = stream.match(/^=\"([^\"]+)/, false))) {\n                var kind = match[1];\n                state.context.kind = kind;\n                var mode = modes[kind] || modes.html;\n                var localState = last(state.localStates);\n                if (localState.mode.indent) {\n                  state.indent += localState.mode.indent(localState.state, \"\", \"\");\n                }\n                state.localStates.push({\n                  mode: mode,\n                  state: CodeMirror.startState(mode)\n                });\n              }\n              return \"attribute\";\n            }\n            return expression(stream, state);\n\n          case \"template-call-expression\":\n            if (stream.match(/^([\\w-?]+)(?==)/)) {\n              return \"attribute\";\n            } else if (stream.eat('>')) {\n              state.soyState.pop();\n              return \"keyword\";\n            } else if (stream.eat('/>')) {\n              state.soyState.pop();\n              return \"keyword\";\n            }\n            return expression(stream, state);\n          case \"literal\":\n            if (stream.match('{/literal}', false)) {\n              state.soyState.pop();\n              return this.token(stream, state);\n            }\n            return tokenUntil(stream, state, /\\{\\/literal}/);\n          case \"export\":\n            if (match = stream.match(/\\w+/)) {\n              state.soyState.pop();\n              if (match == \"const\") {\n                state.soyState.push(\"const-def\")\n                return \"keyword\";\n              } else if (match == \"extern\") {\n                state.soyState.push(\"param-def\")\n                return \"keyword\";\n              }\n            } else {\n              stream.next();\n            }\n            return null;\n          case \"const-def\":\n            if (stream.match(/^\\w+/)) {\n              state.soyState.pop();\n              return \"def\";\n            }\n            stream.next();\n            return null;\n        }\n\n        if (stream.match('{literal}')) {\n          state.indent += config.indentUnit;\n          state.soyState.push(\"literal\");\n          state.context = new Context(state.context, \"literal\", state.variables);\n          return \"keyword\";\n\n        // A tag-keyword must be followed by whitespace, comment or a closing tag.\n        } else if (match = stream.match(/^\\{([/@\\\\]?\\w+\\??)(?=$|[\\s}]|\\/[/*])/)) {\n          var prevTag = state.tag;\n          state.tag = match[1];\n          var endTag = state.tag[0] == \"/\";\n          var indentingTag = !!tags[state.tag];\n          var tagName = endTag ? state.tag.substring(1) : state.tag;\n          var tag = tags[tagName];\n          if (state.tag != \"/switch\")\n            state.indent += ((endTag || tag && tag.reduceIndent) && prevTag != \"switch\" ? 1 : 2) * config.indentUnit;\n\n          state.soyState.push(\"tag\");\n          var tagError = false;\n          if (tag) {\n            if (!endTag) {\n              if (tag.soyState) state.soyState.push(tag.soyState);\n            }\n            // If a new tag, open a new context.\n            if (!tag.noEndTag && (indentingTag || !endTag)) {\n              state.context = new Context(state.context, state.tag, tag.variableScope ? state.variables : null);\n            // Otherwise close the current context.\n            } else if (endTag) {\n              var isBalancedForExtern = tagName == 'extern' && (state.context && state.context.tag == 'export');\n              if (!state.context || ((state.context.tag != tagName) && !isBalancedForExtern)) {\n                tagError = true;\n              } else if (state.context) {\n                if (state.context.kind) {\n                  state.localStates.pop();\n                  var localState = last(state.localStates);\n                  if (localState.mode.indent) {\n                    state.indent -= localState.mode.indent(localState.state, \"\", \"\");\n                  }\n                }\n                popcontext(state);\n              }\n            }\n          } else if (endTag) {\n            // Assume all tags with a closing tag are defined in the config.\n            tagError = true;\n          }\n          return (tagError ? \"error \" : \"\") + \"keyword\";\n\n        // Not a tag-keyword; it's an implicit print tag.\n        } else if (stream.eat('{')) {\n          state.tag = \"print\";\n          state.indent += 2 * config.indentUnit;\n          state.soyState.push(\"tag\");\n          return \"keyword\";\n        } else if (!state.context && stream.sol() && stream.match(/import\\b/)) {\n          state.soyState.push(\"import\");\n          state.indent += 2 * config.indentUnit;\n          return \"keyword\";\n        } else if (match = stream.match('<{')) {\n          state.soyState.push(\"template-call-expression\");\n          state.indent += 2 * config.indentUnit;\n          state.soyState.push(\"tag\");\n          return \"keyword\";\n        } else if (match = stream.match('</>')) {\n          state.indent -= 1 * config.indentUnit;\n          return \"keyword\";\n        }\n\n        return tokenUntil(stream, state, /\\{|\\s+\\/\\/|\\/\\*/);\n      },\n\n      indent: function(state, textAfter, line) {\n        var indent = state.indent, top = last(state.soyState);\n        if (top == \"comment\") return CodeMirror.Pass;\n\n        if (top == \"literal\") {\n          if (/^\\{\\/literal}/.test(textAfter)) indent -= config.indentUnit;\n        } else {\n          if (/^\\s*\\{\\/(template|deltemplate)\\b/.test(textAfter)) return 0;\n          if (/^\\{(\\/|(fallbackmsg|elseif|else|ifempty)\\b)/.test(textAfter)) indent -= config.indentUnit;\n          if (state.tag != \"switch\" && /^\\{(case|default)\\b/.test(textAfter)) indent -= config.indentUnit;\n          if (/^\\{\\/switch\\b/.test(textAfter)) indent -= config.indentUnit;\n        }\n        var localState = last(state.localStates);\n        if (indent && localState.mode.indent) {\n          indent += localState.mode.indent(localState.state, textAfter, line);\n        }\n        return indent;\n      },\n\n      innerMode: function(state) {\n        if (state.soyState.length && last(state.soyState) != \"literal\") return null;\n        else return last(state.localStates);\n      },\n\n      electricInput: /^\\s*\\{(\\/|\\/template|\\/deltemplate|\\/switch|fallbackmsg|elseif|else|case|default|ifempty|\\/literal\\})$/,\n      lineComment: \"//\",\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      blockCommentContinue: \" * \",\n      useInnerComments: false,\n      fold: \"indent\"\n    };\n  }, \"htmlmixed\");\n\n  CodeMirror.registerHelper(\"wordChars\", \"soy\", /[\\w$]/);\n\n  CodeMirror.registerHelper(\"hintWords\", \"soy\", Object.keys(tags).concat(\n      [\"css\", \"debugger\"]));\n\n  CodeMirror.defineMIME(\"text/x-soy\", \"soy\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/sparql/sparql.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"sparql\", function(config) {\n  var indentUnit = config.indentUnit;\n  var curPunc;\n\n  function wordRegexp(words) {\n    return new RegExp(\"^(?:\" + words.join(\"|\") + \")$\", \"i\");\n  }\n  var ops = wordRegexp([\"str\", \"lang\", \"langmatches\", \"datatype\", \"bound\", \"sameterm\", \"isiri\", \"isuri\",\n                        \"iri\", \"uri\", \"bnode\", \"count\", \"sum\", \"min\", \"max\", \"avg\", \"sample\",\n                        \"group_concat\", \"rand\", \"abs\", \"ceil\", \"floor\", \"round\", \"concat\", \"substr\", \"strlen\",\n                        \"replace\", \"ucase\", \"lcase\", \"encode_for_uri\", \"contains\", \"strstarts\", \"strends\",\n                        \"strbefore\", \"strafter\", \"year\", \"month\", \"day\", \"hours\", \"minutes\", \"seconds\",\n                        \"timezone\", \"tz\", \"now\", \"uuid\", \"struuid\", \"md5\", \"sha1\", \"sha256\", \"sha384\",\n                        \"sha512\", \"coalesce\", \"if\", \"strlang\", \"strdt\", \"isnumeric\", \"regex\", \"exists\",\n                        \"isblank\", \"isliteral\", \"a\", \"bind\"]);\n  var keywords = wordRegexp([\"base\", \"prefix\", \"select\", \"distinct\", \"reduced\", \"construct\", \"describe\",\n                             \"ask\", \"from\", \"named\", \"where\", \"order\", \"limit\", \"offset\", \"filter\", \"optional\",\n                             \"graph\", \"by\", \"asc\", \"desc\", \"as\", \"having\", \"undef\", \"values\", \"group\",\n                             \"minus\", \"in\", \"not\", \"service\", \"silent\", \"using\", \"insert\", \"delete\", \"union\",\n                             \"true\", \"false\", \"with\",\n                             \"data\", \"copy\", \"to\", \"move\", \"add\", \"create\", \"drop\", \"clear\", \"load\"]);\n  var operatorChars = /[*+\\-<>=&|\\^\\/!\\?]/;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    curPunc = null;\n    if (ch == \"$\" || ch == \"?\") {\n      if(ch == \"?\" && stream.match(/\\s/, false)){\n        return \"operator\";\n      }\n      stream.match(/^[A-Za-z0-9_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][A-Za-z0-9_\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]*/);\n      return \"variable-2\";\n    }\n    else if (ch == \"<\" && !stream.match(/^[\\s\\u00a0=]/, false)) {\n      stream.match(/^[^\\s\\u00a0>]*>?/);\n      return \"atom\";\n    }\n    else if (ch == \"\\\"\" || ch == \"'\") {\n      state.tokenize = tokenLiteral(ch);\n      return state.tokenize(stream, state);\n    }\n    else if (/[{}\\(\\),\\.;\\[\\]]/.test(ch)) {\n      curPunc = ch;\n      return \"bracket\";\n    }\n    else if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    else if (ch === \"^\") {\n      ch = stream.peek();\n      if (ch === \"^\") stream.eat(\"^\");\n      else stream.eatWhile(operatorChars);\n      return \"operator\";\n    }\n    else if (operatorChars.test(ch)) {\n      stream.eatWhile(operatorChars);\n      return \"operator\";\n    }\n    else if (ch == \":\") {\n      eatPnLocal(stream);\n      return \"atom\";\n    }\n    else if (ch == \"@\") {\n      stream.eatWhile(/[a-z\\d\\-]/i);\n      return \"meta\";\n    }\n    else {\n      stream.eatWhile(/[_\\w\\d]/);\n      if (stream.eat(\":\")) {\n        eatPnLocal(stream);\n        return \"atom\";\n      }\n      var word = stream.current();\n      if (ops.test(word))\n        return \"builtin\";\n      else if (keywords.test(word))\n        return \"keyword\";\n      else\n        return \"variable\";\n    }\n  }\n\n  function eatPnLocal(stream) {\n    stream.match(/(\\.(?=[\\w_\\-\\\\%])|[:\\w_-]|\\\\[-\\\\_~.!$&'()*+,;=/?#@%]|%[a-f\\d][a-f\\d])+/i);\n  }\n\n  function tokenLiteral(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      return \"string\";\n    };\n  }\n\n  function pushContext(state, type, col) {\n    state.context = {prev: state.context, indent: state.indent, col: col, type: type};\n  }\n  function popContext(state) {\n    state.indent = state.context.indent;\n    state.context = state.context.prev;\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: tokenBase,\n              context: null,\n              indent: 0,\n              col: 0};\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (state.context && state.context.align == null) state.context.align = false;\n        state.indent = stream.indentation();\n      }\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n\n      if (style != \"comment\" && state.context && state.context.align == null && state.context.type != \"pattern\") {\n        state.context.align = true;\n      }\n\n      if (curPunc == \"(\") pushContext(state, \")\", stream.column());\n      else if (curPunc == \"[\") pushContext(state, \"]\", stream.column());\n      else if (curPunc == \"{\") pushContext(state, \"}\", stream.column());\n      else if (/[\\]\\}\\)]/.test(curPunc)) {\n        while (state.context && state.context.type == \"pattern\") popContext(state);\n        if (state.context && curPunc == state.context.type) {\n          popContext(state);\n          if (curPunc == \"}\" && state.context && state.context.type == \"pattern\")\n            popContext(state);\n        }\n      }\n      else if (curPunc == \".\" && state.context && state.context.type == \"pattern\") popContext(state);\n      else if (/atom|string|variable/.test(style) && state.context) {\n        if (/[\\}\\]]/.test(state.context.type))\n          pushContext(state, \"pattern\", stream.column());\n        else if (state.context.type == \"pattern\" && !state.context.align) {\n          state.context.align = true;\n          state.context.col = stream.column();\n        }\n      }\n\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var firstChar = textAfter && textAfter.charAt(0);\n      var context = state.context;\n      if (/[\\]\\}]/.test(firstChar))\n        while (context && context.type == \"pattern\") context = context.prev;\n\n      var closing = context && firstChar == context.type;\n      if (!context)\n        return 0;\n      else if (context.type == \"pattern\")\n        return context.col;\n      else if (context.align)\n        return context.col + (closing ? 0 : 1);\n      else\n        return context.indent + (closing ? 0 : indentUnit);\n    },\n\n    lineComment: \"#\"\n  };\n});\n\nCodeMirror.defineMIME(\"application/sparql-query\", \"sparql\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/spreadsheet/spreadsheet.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"spreadsheet\", function () {\n    return {\n      startState: function () {\n        return {\n          stringType: null,\n          stack: []\n        };\n      },\n      token: function (stream, state) {\n        if (!stream) return;\n\n        //check for state changes\n        if (state.stack.length === 0) {\n          //strings\n          if ((stream.peek() == '\"') || (stream.peek() == \"'\")) {\n            state.stringType = stream.peek();\n            stream.next(); // Skip quote\n            state.stack.unshift(\"string\");\n          }\n        }\n\n        //return state\n        //stack has\n        switch (state.stack[0]) {\n        case \"string\":\n          while (state.stack[0] === \"string\" && !stream.eol()) {\n            if (stream.peek() === state.stringType) {\n              stream.next(); // Skip quote\n              state.stack.shift(); // Clear flag\n            } else if (stream.peek() === \"\\\\\") {\n              stream.next();\n              stream.next();\n            } else {\n              stream.match(/^.[^\\\\\\\"\\']*/);\n            }\n          }\n          return \"string\";\n\n        case \"characterClass\":\n          while (state.stack[0] === \"characterClass\" && !stream.eol()) {\n            if (!(stream.match(/^[^\\]\\\\]+/) || stream.match(/^\\\\./)))\n              state.stack.shift();\n          }\n          return \"operator\";\n        }\n\n        var peek = stream.peek();\n\n        //no stack\n        switch (peek) {\n        case \"[\":\n          stream.next();\n          state.stack.unshift(\"characterClass\");\n          return \"bracket\";\n        case \":\":\n          stream.next();\n          return \"operator\";\n        case \"\\\\\":\n          if (stream.match(/\\\\[a-z]+/)) return \"string-2\";\n          else {\n            stream.next();\n            return \"atom\";\n          }\n        case \".\":\n        case \",\":\n        case \";\":\n        case \"*\":\n        case \"-\":\n        case \"+\":\n        case \"^\":\n        case \"<\":\n        case \"/\":\n        case \"=\":\n          stream.next();\n          return \"atom\";\n        case \"$\":\n          stream.next();\n          return \"builtin\";\n        }\n\n        if (stream.match(/\\d+/)) {\n          if (stream.match(/^\\w+/)) return \"error\";\n          return \"number\";\n        } else if (stream.match(/^[a-zA-Z_]\\w*/)) {\n          if (stream.match(/(?=[\\(.])/, false)) return \"keyword\";\n          return \"variable-2\";\n        } else if ([\"[\", \"]\", \"(\", \")\", \"{\", \"}\"].indexOf(peek) != -1) {\n          stream.next();\n          return \"bracket\";\n        } else if (!stream.eatSpace()) {\n          stream.next();\n        }\n        return null;\n      }\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-spreadsheet\", \"spreadsheet\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/sql/sql.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"sql\", function(config, parserConfig) {\n  var client         = parserConfig.client || {},\n      atoms          = parserConfig.atoms || {\"false\": true, \"true\": true, \"null\": true},\n      builtin        = parserConfig.builtin || set(defaultBuiltin),\n      keywords       = parserConfig.keywords || set(sqlKeywords),\n      operatorChars  = parserConfig.operatorChars || /^[*+\\-%<>!=&|~^\\/]/,\n      support        = parserConfig.support || {},\n      hooks          = parserConfig.hooks || {},\n      dateSQL        = parserConfig.dateSQL || {\"date\" : true, \"time\" : true, \"timestamp\" : true},\n      backslashStringEscapes = parserConfig.backslashStringEscapes !== false,\n      brackets       = parserConfig.brackets || /^[\\{}\\(\\)\\[\\]]/,\n      punctuation    = parserConfig.punctuation || /^[;.,:]/\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n\n    // call hooks from the mime type\n    if (hooks[ch]) {\n      var result = hooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n\n    if (support.hexNumber &&\n      ((ch == \"0\" && stream.match(/^[xX][0-9a-fA-F]+/))\n      || (ch == \"x\" || ch == \"X\") && stream.match(/^'[0-9a-fA-F]+'/))) {\n      // hex\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html\n      return \"number\";\n    } else if (support.binaryNumber &&\n      (((ch == \"b\" || ch == \"B\") && stream.match(/^'[01]+'/))\n      || (ch == \"0\" && stream.match(/^b[01]+/)))) {\n      // bitstring\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html\n      return \"number\";\n    } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) {\n      // numbers\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html\n      stream.match(/^[0-9]*(\\.[0-9]+)?([eE][-+]?[0-9]+)?/);\n      support.decimallessFloat && stream.match(/^\\.(?!\\.)/);\n      return \"number\";\n    } else if (ch == \"?\" && (stream.eatSpace() || stream.eol() || stream.eat(\";\"))) {\n      // placeholders\n      return \"variable-3\";\n    } else if (ch == \"'\" || (ch == '\"' && support.doubleQuote)) {\n      // strings\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html\n      state.tokenize = tokenLiteral(ch);\n      return state.tokenize(stream, state);\n    } else if ((((support.nCharCast && (ch == \"n\" || ch == \"N\"))\n        || (support.charsetCast && ch == \"_\" && stream.match(/[a-z][a-z0-9]*/i)))\n        && (stream.peek() == \"'\" || stream.peek() == '\"'))) {\n      // charset casting: _utf8'str', N'str', n'str'\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html\n      return \"keyword\";\n    } else if (support.escapeConstant && (ch == \"e\" || ch == \"E\")\n        && (stream.peek() == \"'\" || (stream.peek() == '\"' && support.doubleQuote))) {\n      // escape constant: E'str', e'str'\n      // ref: https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE\n      state.tokenize = function(stream, state) {\n        return (state.tokenize = tokenLiteral(stream.next(), true))(stream, state);\n      }\n      return \"keyword\";\n    } else if (support.commentSlashSlash && ch == \"/\" && stream.eat(\"/\")) {\n      // 1-line comment\n      stream.skipToEnd();\n      return \"comment\";\n    } else if ((support.commentHash && ch == \"#\")\n        || (ch == \"-\" && stream.eat(\"-\") && (!support.commentSpaceRequired || stream.eat(\" \")))) {\n      // 1-line comments\n      // ref: https://kb.askmonty.org/en/comment-syntax/\n      stream.skipToEnd();\n      return \"comment\";\n    } else if (ch == \"/\" && stream.eat(\"*\")) {\n      // multi-line comments\n      // ref: https://kb.askmonty.org/en/comment-syntax/\n      state.tokenize = tokenComment(1);\n      return state.tokenize(stream, state);\n    } else if (ch == \".\") {\n      // .1 for 0.1\n      if (support.zerolessFloat && stream.match(/^(?:\\d+(?:e[+-]?\\d+)?)/i))\n        return \"number\";\n      if (stream.match(/^\\.+/))\n        return null\n      // .table_name (ODBC)\n      // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html\n      if (support.ODBCdotTable && stream.match(/^[\\w\\d_$#]+/))\n        return \"variable-2\";\n    } else if (operatorChars.test(ch)) {\n      // operators\n      stream.eatWhile(operatorChars);\n      return \"operator\";\n    } else if (brackets.test(ch)) {\n      // brackets\n      return \"bracket\";\n    } else if (punctuation.test(ch)) {\n      // punctuation\n      stream.eatWhile(punctuation);\n      return \"punctuation\";\n    } else if (ch == '{' &&\n        (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*\"[^\"]*\"( )*}/))) {\n      // dates (weird ODBC syntax)\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html\n      return \"number\";\n    } else {\n      stream.eatWhile(/^[_\\w\\d]/);\n      var word = stream.current().toLowerCase();\n      // dates (standard SQL syntax)\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html\n      if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+\"[^\"]*\"/)))\n        return \"number\";\n      if (atoms.hasOwnProperty(word)) return \"atom\";\n      if (builtin.hasOwnProperty(word)) return \"type\";\n      if (keywords.hasOwnProperty(word)) return \"keyword\";\n      if (client.hasOwnProperty(word)) return \"builtin\";\n      return null;\n    }\n  }\n\n  // 'string', with char specified in quote escaped by '\\'\n  function tokenLiteral(quote, backslashEscapes) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        escaped = (backslashStringEscapes || backslashEscapes) && !escaped && ch == \"\\\\\";\n      }\n      return \"string\";\n    };\n  }\n  function tokenComment(depth) {\n    return function(stream, state) {\n      var m = stream.match(/^.*?(\\/\\*|\\*\\/)/)\n      if (!m) stream.skipToEnd()\n      else if (m[1] == \"/*\") state.tokenize = tokenComment(depth + 1)\n      else if (depth > 1) state.tokenize = tokenComment(depth - 1)\n      else state.tokenize = tokenBase\n      return \"comment\"\n    }\n  }\n\n  function pushContext(stream, state, type) {\n    state.context = {\n      prev: state.context,\n      indent: stream.indentation(),\n      col: stream.column(),\n      type: type\n    };\n  }\n\n  function popContext(state) {\n    state.indent = state.context.indent;\n    state.context = state.context.prev;\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: tokenBase, context: null};\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (state.context && state.context.align == null)\n          state.context.align = false;\n      }\n      if (state.tokenize == tokenBase && stream.eatSpace()) return null;\n\n      var style = state.tokenize(stream, state);\n      if (style == \"comment\") return style;\n\n      if (state.context && state.context.align == null)\n        state.context.align = true;\n\n      var tok = stream.current();\n      if (tok == \"(\")\n        pushContext(stream, state, \")\");\n      else if (tok == \"[\")\n        pushContext(stream, state, \"]\");\n      else if (state.context && state.context.type == tok)\n        popContext(state);\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var cx = state.context;\n      if (!cx) return CodeMirror.Pass;\n      var closing = textAfter.charAt(0) == cx.type;\n      if (cx.align) return cx.col + (closing ? 0 : 1);\n      else return cx.indent + (closing ? 0 : config.indentUnit);\n    },\n\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: support.commentSlashSlash ? \"//\" : support.commentHash ? \"#\" : \"--\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\"\n  };\n});\n\n  // `identifier`\n  function hookIdentifier(stream) {\n    // MySQL/MariaDB identifiers\n    // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html\n    var ch;\n    while ((ch = stream.next()) != null) {\n      if (ch == \"`\" && !stream.eat(\"`\")) return \"variable-2\";\n    }\n    stream.backUp(stream.current().length - 1);\n    return stream.eatWhile(/\\w/) ? \"variable-2\" : null;\n  }\n\n  // \"identifier\"\n  function hookIdentifierDoublequote(stream) {\n    // Standard SQL /SQLite identifiers\n    // ref: http://web.archive.org/web/20160813185132/http://savage.net.au/SQL/sql-99.bnf.html#delimited%20identifier\n    // ref: http://sqlite.org/lang_keywords.html\n    var ch;\n    while ((ch = stream.next()) != null) {\n      if (ch == \"\\\"\" && !stream.eat(\"\\\"\")) return \"variable-2\";\n    }\n    stream.backUp(stream.current().length - 1);\n    return stream.eatWhile(/\\w/) ? \"variable-2\" : null;\n  }\n\n  // variable token\n  function hookVar(stream) {\n    // variables\n    // @@prefix.varName @varName\n    // varName can be quoted with ` or ' or \"\n    // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html\n    if (stream.eat(\"@\")) {\n      stream.match('session.');\n      stream.match('local.');\n      stream.match('global.');\n    }\n\n    if (stream.eat(\"'\")) {\n      stream.match(/^.*'/);\n      return \"variable-2\";\n    } else if (stream.eat('\"')) {\n      stream.match(/^.*\"/);\n      return \"variable-2\";\n    } else if (stream.eat(\"`\")) {\n      stream.match(/^.*`/);\n      return \"variable-2\";\n    } else if (stream.match(/^[0-9a-zA-Z$\\.\\_]+/)) {\n      return \"variable-2\";\n    }\n    return null;\n  };\n\n  // short client keyword token\n  function hookClient(stream) {\n    // \\N means NULL\n    // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html\n    if (stream.eat(\"N\")) {\n        return \"atom\";\n    }\n    // \\g, etc\n    // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html\n    return stream.match(/^[a-zA-Z.#!?]/) ? \"variable-2\" : null;\n  }\n\n  // these keywords are used by all SQL dialects (however, a mode can still overwrite it)\n  var sqlKeywords = \"alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit \";\n\n  // turn a space-separated list into an array\n  function set(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  var defaultBuiltin = \"bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric\"\n\n  // A generic SQL Mode. It's not a standard, it just try to support what is generally supported\n  CodeMirror.defineMIME(\"text/x-sql\", {\n    name: \"sql\",\n    keywords: set(sqlKeywords + \"begin\"),\n    builtin: set(defaultBuiltin),\n    atoms: set(\"false true null unknown\"),\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable doubleQuote binaryNumber hexNumber\")\n  });\n\n  CodeMirror.defineMIME(\"text/x-mssql\", {\n    name: \"sql\",\n    client: set(\"$partition binary_checksum checksum connectionproperty context_info current_request_id error_line error_message error_number error_procedure error_severity error_state formatmessage get_filestream_transaction_context getansinull host_id host_name isnull isnumeric min_active_rowversion newid newsequentialid rowcount_big xact_state object_id\"),\n    keywords: set(sqlKeywords + \"begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare exec go if use index holdlock nolock nowait paglock readcommitted readcommittedlock readpast readuncommitted repeatableread rowlock serializable snapshot tablock tablockx updlock with\"),\n    builtin: set(\"bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table \"),\n    atoms: set(\"is not null like and or in left right between inner outer join all any some cross unpivot pivot exists\"),\n    operatorChars: /^[*+\\-%<>!=^\\&|\\/]/,\n    brackets: /^[\\{}\\(\\)]/,\n    punctuation: /^[;.,:/]/,\n    backslashStringEscapes: false,\n    dateSQL: set(\"date datetimeoffset datetime2 smalldatetime datetime time\"),\n    hooks: {\n      \"@\":   hookVar\n    }\n  });\n\n  CodeMirror.defineMIME(\"text/x-mysql\", {\n    name: \"sql\",\n    client: set(\"charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee\"),\n    keywords: set(sqlKeywords + \"accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat\"),\n    builtin: set(\"bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric\"),\n    atoms: set(\"false true null unknown\"),\n    operatorChars: /^[*+\\-%<>!=&|^]/,\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired\"),\n    hooks: {\n      \"@\":   hookVar,\n      \"`\":   hookIdentifier,\n      \"\\\\\":  hookClient\n    }\n  });\n\n  CodeMirror.defineMIME(\"text/x-mariadb\", {\n    name: \"sql\",\n    client: set(\"charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee\"),\n    keywords: set(sqlKeywords + \"accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group group_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat\"),\n    builtin: set(\"bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric\"),\n    atoms: set(\"false true null unknown\"),\n    operatorChars: /^[*+\\-%<>!=&|^]/,\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired\"),\n    hooks: {\n      \"@\":   hookVar,\n      \"`\":   hookIdentifier,\n      \"\\\\\":  hookClient\n    }\n  });\n\n  // provided by the phpLiteAdmin project - phpliteadmin.org\n  CodeMirror.defineMIME(\"text/x-sqlite\", {\n    name: \"sql\",\n    // commands of the official SQLite client, ref: https://www.sqlite.org/cli.html#dotcmd\n    client: set(\"auth backup bail binary changes check clone databases dbinfo dump echo eqp exit explain fullschema headers help import imposter indexes iotrace limit lint load log mode nullvalue once open output print prompt quit read restore save scanstats schema separator session shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width\"),\n    // ref: http://sqlite.org/lang_keywords.html\n    keywords: set(sqlKeywords + \"abort action add after all analyze attach autoincrement before begin cascade case cast check collate column commit conflict constraint cross current_date current_time current_timestamp database default deferrable deferred detach each else end escape except exclusive exists explain fail for foreign full glob if ignore immediate index indexed initially inner instead intersect isnull key left limit match natural no notnull null of offset outer plan pragma primary query raise recursive references regexp reindex release rename replace restrict right rollback row savepoint temp temporary then to transaction trigger unique using vacuum view virtual when with without\"),\n    // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types.\n    builtin: set(\"bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text clob bigint int int2 int8 integer float double char varchar date datetime year unsigned signed numeric real\"),\n    // ref: http://sqlite.org/syntax/literal-value.html\n    atoms: set(\"null current_date current_time current_timestamp\"),\n    // ref: http://sqlite.org/lang_expr.html#binaryops\n    operatorChars: /^[*+\\-%<>!=&|/~]/,\n    // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types.\n    dateSQL: set(\"date time timestamp datetime\"),\n    support: set(\"decimallessFloat zerolessFloat\"),\n    identifierQuote: \"\\\"\",  //ref: http://sqlite.org/lang_keywords.html\n    hooks: {\n      // bind-parameters ref:http://sqlite.org/lang_expr.html#varparam\n      \"@\":   hookVar,\n      \":\":   hookVar,\n      \"?\":   hookVar,\n      \"$\":   hookVar,\n      // The preferred way to escape Identifiers is using double quotes, ref: http://sqlite.org/lang_keywords.html\n      \"\\\"\":   hookIdentifierDoublequote,\n      // there is also support for backticks, ref: http://sqlite.org/lang_keywords.html\n      \"`\":   hookIdentifier\n    }\n  });\n\n  // the query language used by Apache Cassandra is called CQL, but this mime type\n  // is called Cassandra to avoid confusion with Contextual Query Language\n  CodeMirror.defineMIME(\"text/x-cassandra\", {\n    name: \"sql\",\n    client: { },\n    keywords: set(\"add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime\"),\n    builtin: set(\"ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint\"),\n    atoms: set(\"false true infinity NaN\"),\n    operatorChars: /^[<>=]/,\n    dateSQL: { },\n    support: set(\"commentSlashSlash decimallessFloat\"),\n    hooks: { }\n  });\n\n  // this is based on Peter Raganitsch's 'plsql' mode\n  CodeMirror.defineMIME(\"text/x-plsql\", {\n    name:       \"sql\",\n    client:     set(\"appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap\"),\n    keywords:   set(\"abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work\"),\n    builtin:    set(\"abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml\"),\n    operatorChars: /^[*\\/+\\-%<>!=~]/,\n    dateSQL:    set(\"date time timestamp\"),\n    support:    set(\"doubleQuote nCharCast zerolessFloat binaryNumber hexNumber\")\n  });\n\n  // Created to support specific hive keywords\n  CodeMirror.defineMIME(\"text/x-hive\", {\n    name: \"sql\",\n    keywords: set(\"select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with admin authorization char compact compactions conf cube current current_date current_timestamp day decimal defined dependency directories elem_type exchange file following for grouping hour ignore inner interval jar less logical macro minute month more none noscan over owner partialscan preceding pretty principals protection reload rewrite role roles rollup rows second server sets skewed transactions truncate unbounded unset uri user values window year\"),\n    builtin: set(\"bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype key_type utctimestamp value_type varchar\"),\n    atoms: set(\"false true null unknown\"),\n    operatorChars: /^[*+\\-%<>!=]/,\n    dateSQL: set(\"date timestamp\"),\n    support: set(\"ODBCdotTable doubleQuote binaryNumber hexNumber\")\n  });\n\n  CodeMirror.defineMIME(\"text/x-pgsql\", {\n    name: \"sql\",\n    client: set(\"source\"),\n    // For PostgreSQL - https://www.postgresql.org/docs/11/sql-keywords-appendix.html\n    // For pl/pgsql lang - https://github.com/postgres/postgres/blob/REL_11_2/src/pl/plpgsql/src/pl_scanner.c\n    keywords: set(sqlKeywords + \"a abort abs absent absolute access according action ada add admin after aggregate alias all allocate also alter always analyse analyze and any are array array_agg array_max_cardinality as asc asensitive assert assertion assignment asymmetric at atomic attach attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli between bigint binary bit bit_length blob blocked bom boolean both breadth by c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain char char_length character character_length character_set_catalog character_set_name character_set_schema characteristics characters check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column column_name columns command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constant constraint constraint_catalog constraint_name constraint_schema constraints constructor contains content continue control conversion convert copy corr corresponding cost count covar_pop covar_samp create cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datatype date datetime_interval_code datetime_interval_precision day db deallocate debug dec decimal declare default defaults deferrable deferred defined definer degree delete delimiter delimiters dense_rank depends depth deref derived desc describe descriptor detach detail deterministic diagnostics dictionary disable discard disconnect dispatch distinct dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain double drop dump dynamic dynamic_function dynamic_function_code each element else elseif elsif empty enable encoding encrypted end end_frame end_partition endexec enforced enum equals errcode error escape event every except exception exclude excluding exclusive exec execute exists exit exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreach foreign fortran forward found frame_row free freeze from fs full function functions fusion g general generated get global go goto grant granted greatest group grouping groups handler having header hex hierarchy hint hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import in include including increment indent index indexes indicator info inherit inherits initially inline inner inout input insensitive insert instance instantiable instead int integer integrity intersect intersection interval into invoker is isnull isolation join k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like like_regex limit link listen ln load local localtime localtimestamp location locator lock locked log logged loop lower m map mapping match matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized not nothing notice notify notnull nowait nth_value ntile null nullable nullif nulls number numeric object occurrences_regex octet_length octets of off offset oids old on only open operator option options or order ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parallel parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password path percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding precision prepare prepared preserve primary print_strict_params prior privileges procedural procedure procedures program public publication query quote raise range rank read reads real reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result result_oid return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns reverse revoke right role rollback rollup routine routine_catalog routine_name routine_schema routines row row_count row_number rows rowtype rule savepoint scale schema schema_name schemas scope scope_catalog scope_name scope_schema scroll search second section security select selective self sensitive sequence sequences serializable server server_name session session_user set setof sets share show similar simple size skip slice smallint snapshot some source space specific specific_name specifictype sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable stacked standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time system_user t table table_name tables tablesample tablespace temp template temporary text then ties time timestamp timezone_hour timezone_minute to token top_level_count trailing transaction transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted union unique unknown unlink unlisten unlogged unnamed unnest until untyped update upper uri usage use_column use_variable user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of values var_pop var_samp varbinary varchar variable_conflict variadic varying verbose version versioning view views volatile warning when whenever where while whitespace width_bucket window with within without work wrapper write xml xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes zone\"),\n    // https://www.postgresql.org/docs/11/datatype.html\n    builtin: set(\"bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml\"),\n    atoms: set(\"false true null unknown\"),\n    operatorChars: /^[*\\/+\\-%<>!=&|^\\/#@?~]/,\n    backslashStringEscapes: false,\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast escapeConstant\")\n  });\n\n  // Google's SQL-like query language, GQL\n  CodeMirror.defineMIME(\"text/x-gql\", {\n    name: \"sql\",\n    keywords: set(\"ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where\"),\n    atoms: set(\"false true\"),\n    builtin: set(\"blob datetime first key __key__ string integer double boolean null\"),\n    operatorChars: /^[*+\\-%<>!=]/\n  });\n\n  // Greenplum\n  CodeMirror.defineMIME(\"text/x-gpsql\", {\n    name: \"sql\",\n    client: set(\"source\"),\n    //https://github.com/greenplum-db/gpdb/blob/master/src/include/parser/kwlist.h\n    keywords: set(\"abort absolute access action active add admin after aggregate all also alter always analyse analyze and any array as asc assertion assignment asymmetric at authorization backward before begin between bigint binary bit boolean both by cache called cascade cascaded case cast chain char character characteristics check checkpoint class close cluster coalesce codegen collate column comment commit committed concurrency concurrently configuration connection constraint constraints contains content continue conversion copy cost cpu_rate_limit create createdb createexttable createrole createuser cross csv cube current current_catalog current_date current_role current_schema current_time current_timestamp current_user cursor cycle data database day deallocate dec decimal declare decode default defaults deferrable deferred definer delete delimiter delimiters deny desc dictionary disable discard distinct distributed do document domain double drop dxl each else enable encoding encrypted end enum errors escape every except exchange exclude excluding exclusive execute exists explain extension external extract false family fetch fields filespace fill filter first float following for force foreign format forward freeze from full function global grant granted greatest group group_id grouping handler hash having header hold host hour identity if ignore ilike immediate immutable implicit in including inclusive increment index indexes inherit inherits initially inline inner inout input insensitive insert instead int integer intersect interval into invoker is isnull isolation join key language large last leading least left level like limit list listen load local localtime localtimestamp location lock log login mapping master match maxvalue median merge minute minvalue missing mode modifies modify month move name names national natural nchar new newline next no nocreatedb nocreateexttable nocreaterole nocreateuser noinherit nologin none noovercommit nosuperuser not nothing notify notnull nowait null nullif nulls numeric object of off offset oids old on only operator option options or order ordered others out outer over overcommit overlaps overlay owned owner parser partial partition partitions passing password percent percentile_cont percentile_disc placing plans position preceding precision prepare prepared preserve primary prior privileges procedural procedure protocol queue quote randomly range read readable reads real reassign recheck recursive ref references reindex reject relative release rename repeatable replace replica reset resource restart restrict returning returns revoke right role rollback rollup rootpartition row rows rule savepoint scatter schema scroll search second security segment select sequence serializable session session_user set setof sets share show similar simple smallint some split sql stable standalone start statement statistics stdin stdout storage strict strip subpartition subpartitions substring superuser symmetric sysid system table tablespace temp template temporary text then threshold ties time timestamp to trailing transaction treat trigger trim true truncate trusted type unbounded uncommitted unencrypted union unique unknown unlisten until update user using vacuum valid validation validator value values varchar variadic varying verbose version view volatile web when where whitespace window with within without work writable write xml xmlattributes xmlconcat xmlelement xmlexists xmlforest xmlparse xmlpi xmlroot xmlserialize year yes zone\"),\n    builtin: set(\"bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml\"),\n    atoms: set(\"false true null unknown\"),\n    operatorChars: /^[*+\\-%<>!=&|^\\/#@?~]/,\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast\")\n  });\n\n  // Spark SQL\n  CodeMirror.defineMIME(\"text/x-sparksql\", {\n    name: \"sql\",\n    keywords: set(\"add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases data dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with\"),\n    builtin: set(\"abs acos acosh add_months aggregate and any approx_count_distinct approx_percentile array array_contains array_distinct array_except array_intersect array_join array_max array_min array_position array_remove array_repeat array_sort array_union arrays_overlap arrays_zip ascii asin asinh assert_true atan atan2 atanh avg base64 between bigint bin binary bit_and bit_count bit_get bit_length bit_or bit_xor bool_and bool_or boolean bround btrim cardinality case cast cbrt ceil ceiling char char_length character_length chr coalesce collect_list collect_set concat concat_ws conv corr cos cosh cot count count_if count_min_sketch covar_pop covar_samp crc32 cume_dist current_catalog current_database current_date current_timestamp current_timezone current_user date date_add date_format date_from_unix_date date_part date_sub date_trunc datediff day dayofmonth dayofweek dayofyear decimal decode degrees delimited dense_rank div double e element_at elt encode every exists exp explode explode_outer expm1 extract factorial filter find_in_set first first_value flatten float floor forall format_number format_string from_csv from_json from_unixtime from_utc_timestamp get_json_object getbit greatest grouping grouping_id hash hex hour hypot if ifnull in initcap inline inline_outer input_file_block_length input_file_block_start input_file_name inputformat instr int isnan isnotnull isnull java_method json_array_length json_object_keys json_tuple kurtosis lag last last_day last_value lcase lead least left length levenshtein like ln locate log log10 log1p log2 lower lpad ltrim make_date make_dt_interval make_interval make_timestamp make_ym_interval map map_concat map_entries map_filter map_from_arrays map_from_entries map_keys map_values map_zip_with max max_by md5 mean min min_by minute mod monotonically_increasing_id month months_between named_struct nanvl negative next_day not now nth_value ntile nullif nvl nvl2 octet_length or outputformat overlay parse_url percent_rank percentile percentile_approx pi pmod posexplode posexplode_outer position positive pow power printf quarter radians raise_error rand randn random rank rcfile reflect regexp regexp_extract regexp_extract_all regexp_like regexp_replace repeat replace reverse right rint rlike round row_number rpad rtrim schema_of_csv schema_of_json second sentences sequence sequencefile serde session_window sha sha1 sha2 shiftleft shiftright shiftrightunsigned shuffle sign signum sin sinh size skewness slice smallint some sort_array soundex space spark_partition_id split sqrt stack std stddev stddev_pop stddev_samp str_to_map string struct substr substring substring_index sum tan tanh textfile timestamp timestamp_micros timestamp_millis timestamp_seconds tinyint to_csv to_date to_json to_timestamp to_unix_timestamp to_utc_timestamp transform transform_keys transform_values translate trim trunc try_add try_divide typeof ucase unbase64 unhex uniontype unix_date unix_micros unix_millis unix_seconds unix_timestamp upper uuid var_pop var_samp variance version weekday weekofyear when width_bucket window xpath xpath_boolean xpath_double xpath_float xpath_int xpath_long xpath_number xpath_short xpath_string xxhash64 year zip_with\"),\n    atoms: set(\"false true null\"),\n    operatorChars: /^[*\\/+\\-%<>!=~&|^]/,\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable doubleQuote zerolessFloat\")\n  });\n\n  // Esper\n  CodeMirror.defineMIME(\"text/x-esper\", {\n    name: \"sql\",\n    client: set(\"source\"),\n    // http://www.espertech.com/esper/release-5.5.0/esper-reference/html/appendix_keywords.html\n    keywords: set(\"alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit after all and as at asc avedev avg between by case cast coalesce count create current_timestamp day days delete define desc distinct else end escape events every exists false first from full group having hour hours in inner insert instanceof into irstream is istream join last lastweekday left limit like max match_recognize matches median measures metadatasql min minute minutes msec millisecond milliseconds not null offset on or order outer output partition pattern prev prior regexp retain-union retain-intersection right rstream sec second seconds select set some snapshot sql stddev sum then true unidirectional until update variable weekday when where window\"),\n    builtin: {},\n    atoms: set(\"false true null\"),\n    operatorChars: /^[*+\\-%<>!=&|^\\/#@?~]/,\n    dateSQL: set(\"time\"),\n    support: set(\"decimallessFloat zerolessFloat binaryNumber hexNumber\")\n  });\n});\n\n/*\n  How Properties of Mime Types are used by SQL Mode\n  =================================================\n\n  keywords:\n    A list of keywords you want to be highlighted.\n  builtin:\n    A list of builtin types you want to be highlighted (if you want types to be of class \"builtin\" instead of \"keyword\").\n  operatorChars:\n    All characters that must be handled as operators.\n  client:\n    Commands parsed and executed by the client (not the server).\n  support:\n    A list of supported syntaxes which are not common, but are supported by more than 1 DBMS.\n    * ODBCdotTable: .tableName\n    * zerolessFloat: .1\n    * doubleQuote\n    * nCharCast: N'string'\n    * charsetCast: _utf8'string'\n    * commentHash: use # char for comments\n    * commentSlashSlash: use // for comments\n    * commentSpaceRequired: require a space after -- for comments\n  atoms:\n    Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others:\n    UNKNOWN, INFINITY, UNDERFLOW, NaN...\n  dateSQL:\n    Used for date/time SQL standard syntax, because not all DBMS's support same temporal types.\n*/\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/stex/stex.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\n * Author: Constantin Jucovschi (c.jucovschi@jacobs-university.de)\n * Licence: MIT\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"stex\", function(_config, parserConfig) {\n    \"use strict\";\n\n    function pushCommand(state, command) {\n      state.cmdState.push(command);\n    }\n\n    function peekCommand(state) {\n      if (state.cmdState.length > 0) {\n        return state.cmdState[state.cmdState.length - 1];\n      } else {\n        return null;\n      }\n    }\n\n    function popCommand(state) {\n      var plug = state.cmdState.pop();\n      if (plug) {\n        plug.closeBracket();\n      }\n    }\n\n    // returns the non-default plugin closest to the end of the list\n    function getMostPowerful(state) {\n      var context = state.cmdState;\n      for (var i = context.length - 1; i >= 0; i--) {\n        var plug = context[i];\n        if (plug.name == \"DEFAULT\") {\n          continue;\n        }\n        return plug;\n      }\n      return { styleIdentifier: function() { return null; } };\n    }\n\n    function addPluginPattern(pluginName, cmdStyle, styles) {\n      return function () {\n        this.name = pluginName;\n        this.bracketNo = 0;\n        this.style = cmdStyle;\n        this.styles = styles;\n        this.argument = null;   // \\begin and \\end have arguments that follow. These are stored in the plugin\n\n        this.styleIdentifier = function() {\n          return this.styles[this.bracketNo - 1] || null;\n        };\n        this.openBracket = function() {\n          this.bracketNo++;\n          return \"bracket\";\n        };\n        this.closeBracket = function() {};\n      };\n    }\n\n    var plugins = {};\n\n    plugins[\"importmodule\"] = addPluginPattern(\"importmodule\", \"tag\", [\"string\", \"builtin\"]);\n    plugins[\"documentclass\"] = addPluginPattern(\"documentclass\", \"tag\", [\"\", \"atom\"]);\n    plugins[\"usepackage\"] = addPluginPattern(\"usepackage\", \"tag\", [\"atom\"]);\n    plugins[\"begin\"] = addPluginPattern(\"begin\", \"tag\", [\"atom\"]);\n    plugins[\"end\"] = addPluginPattern(\"end\", \"tag\", [\"atom\"]);\n\n    plugins[\"label\"    ] = addPluginPattern(\"label\"    , \"tag\", [\"atom\"]);\n    plugins[\"ref\"      ] = addPluginPattern(\"ref\"      , \"tag\", [\"atom\"]);\n    plugins[\"eqref\"    ] = addPluginPattern(\"eqref\"    , \"tag\", [\"atom\"]);\n    plugins[\"cite\"     ] = addPluginPattern(\"cite\"     , \"tag\", [\"atom\"]);\n    plugins[\"bibitem\"  ] = addPluginPattern(\"bibitem\"  , \"tag\", [\"atom\"]);\n    plugins[\"Bibitem\"  ] = addPluginPattern(\"Bibitem\"  , \"tag\", [\"atom\"]);\n    plugins[\"RBibitem\" ] = addPluginPattern(\"RBibitem\" , \"tag\", [\"atom\"]);\n\n    plugins[\"DEFAULT\"] = function () {\n      this.name = \"DEFAULT\";\n      this.style = \"tag\";\n\n      this.styleIdentifier = this.openBracket = this.closeBracket = function() {};\n    };\n\n    function setState(state, f) {\n      state.f = f;\n    }\n\n    // called when in a normal (no environment) context\n    function normal(source, state) {\n      var plug;\n      // Do we look like '\\command' ?  If so, attempt to apply the plugin 'command'\n      if (source.match(/^\\\\[a-zA-Z@]+/)) {\n        var cmdName = source.current().slice(1);\n        plug = plugins.hasOwnProperty(cmdName) ? plugins[cmdName] : plugins[\"DEFAULT\"];\n        plug = new plug();\n        pushCommand(state, plug);\n        setState(state, beginParams);\n        return plug.style;\n      }\n\n      // escape characters\n      if (source.match(/^\\\\[$&%#{}_]/)) {\n        return \"tag\";\n      }\n\n      // white space control characters\n      if (source.match(/^\\\\[,;!\\/\\\\]/)) {\n        return \"tag\";\n      }\n\n      // find if we're starting various math modes\n      if (source.match(\"\\\\[\")) {\n        setState(state, function(source, state){ return inMathMode(source, state, \"\\\\]\"); });\n        return \"keyword\";\n      }\n      if (source.match(\"\\\\(\")) {\n        setState(state, function(source, state){ return inMathMode(source, state, \"\\\\)\"); });\n        return \"keyword\";\n      }\n      if (source.match(\"$$\")) {\n        setState(state, function(source, state){ return inMathMode(source, state, \"$$\"); });\n        return \"keyword\";\n      }\n      if (source.match(\"$\")) {\n        setState(state, function(source, state){ return inMathMode(source, state, \"$\"); });\n        return \"keyword\";\n      }\n\n      var ch = source.next();\n      if (ch == \"%\") {\n        source.skipToEnd();\n        return \"comment\";\n      } else if (ch == '}' || ch == ']') {\n        plug = peekCommand(state);\n        if (plug) {\n          plug.closeBracket(ch);\n          setState(state, beginParams);\n        } else {\n          return \"error\";\n        }\n        return \"bracket\";\n      } else if (ch == '{' || ch == '[') {\n        plug = plugins[\"DEFAULT\"];\n        plug = new plug();\n        pushCommand(state, plug);\n        return \"bracket\";\n      } else if (/\\d/.test(ch)) {\n        source.eatWhile(/[\\w.%]/);\n        return \"atom\";\n      } else {\n        source.eatWhile(/[\\w\\-_]/);\n        plug = getMostPowerful(state);\n        if (plug.name == 'begin') {\n          plug.argument = source.current();\n        }\n        return plug.styleIdentifier();\n      }\n    }\n\n    function inMathMode(source, state, endModeSeq) {\n      if (source.eatSpace()) {\n        return null;\n      }\n      if (endModeSeq && source.match(endModeSeq)) {\n        setState(state, normal);\n        return \"keyword\";\n      }\n      if (source.match(/^\\\\[a-zA-Z@]+/)) {\n        return \"tag\";\n      }\n      if (source.match(/^[a-zA-Z]+/)) {\n        return \"variable-2\";\n      }\n      // escape characters\n      if (source.match(/^\\\\[$&%#{}_]/)) {\n        return \"tag\";\n      }\n      // white space control characters\n      if (source.match(/^\\\\[,;!\\/]/)) {\n        return \"tag\";\n      }\n      // special math-mode characters\n      if (source.match(/^[\\^_&]/)) {\n        return \"tag\";\n      }\n      // non-special characters\n      if (source.match(/^[+\\-<>|=,\\/@!*:;'\"`~#?]/)) {\n        return null;\n      }\n      if (source.match(/^(\\d+\\.\\d*|\\d*\\.\\d+|\\d+)/)) {\n        return \"number\";\n      }\n      var ch = source.next();\n      if (ch == \"{\" || ch == \"}\" || ch == \"[\" || ch == \"]\" || ch == \"(\" || ch == \")\") {\n        return \"bracket\";\n      }\n\n      if (ch == \"%\") {\n        source.skipToEnd();\n        return \"comment\";\n      }\n      return \"error\";\n    }\n\n    function beginParams(source, state) {\n      var ch = source.peek(), lastPlug;\n      if (ch == '{' || ch == '[') {\n        lastPlug = peekCommand(state);\n        lastPlug.openBracket(ch);\n        source.eat(ch);\n        setState(state, normal);\n        return \"bracket\";\n      }\n      if (/[ \\t\\r]/.test(ch)) {\n        source.eat(ch);\n        return null;\n      }\n      setState(state, normal);\n      popCommand(state);\n\n      return normal(source, state);\n    }\n\n    return {\n      startState: function() {\n        var f = parserConfig.inMathMode ? function(source, state){ return inMathMode(source, state); } : normal;\n        return {\n          cmdState: [],\n          f: f\n        };\n      },\n      copyState: function(s) {\n        return {\n          cmdState: s.cmdState.slice(),\n          f: s.f\n        };\n      },\n      token: function(stream, state) {\n        return state.f(stream, state);\n      },\n      blankLine: function(state) {\n        state.f = normal;\n        state.cmdState.length = 0;\n      },\n      lineComment: \"%\"\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-stex\", \"stex\");\n  CodeMirror.defineMIME(\"text/x-latex\", \"stex\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/stylus/stylus.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Stylus mode created by Dmitry Kiselyov http://git.io/AaRB\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"stylus\", function(config) {\n    var indentUnit = config.indentUnit,\n        indentUnitString = '',\n        tagKeywords = keySet(tagKeywords_),\n        tagVariablesRegexp = /^(a|b|i|s|col|em)$/i,\n        propertyKeywords = keySet(propertyKeywords_),\n        nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_),\n        valueKeywords = keySet(valueKeywords_),\n        colorKeywords = keySet(colorKeywords_),\n        documentTypes = keySet(documentTypes_),\n        documentTypesRegexp = wordRegexp(documentTypes_),\n        mediaFeatures = keySet(mediaFeatures_),\n        mediaTypes = keySet(mediaTypes_),\n        fontProperties = keySet(fontProperties_),\n        operatorsRegexp = /^\\s*([.]{2,3}|&&|\\|\\||\\*\\*|[?!=:]?=|[-+*\\/%<>]=?|\\?:|\\~)/,\n        wordOperatorKeywordsRegexp = wordRegexp(wordOperatorKeywords_),\n        blockKeywords = keySet(blockKeywords_),\n        vendorPrefixesRegexp = new RegExp(/^\\-(moz|ms|o|webkit)-/i),\n        commonAtoms = keySet(commonAtoms_),\n        firstWordMatch = \"\",\n        states = {},\n        ch,\n        style,\n        type,\n        override;\n\n    while (indentUnitString.length < indentUnit) indentUnitString += ' ';\n\n    /**\n     * Tokenizers\n     */\n    function tokenBase(stream, state) {\n      firstWordMatch = stream.string.match(/(^[\\w-]+\\s*=\\s*$)|(^\\s*[\\w-]+\\s*=\\s*[\\w-])|(^\\s*(\\.|#|@|\\$|\\&|\\[|\\d|\\+|::?|\\{|\\>|~|\\/)?\\s*[\\w-]*([a-z0-9-]|\\*|\\/\\*)(\\(|,)?)/);\n      state.context.line.firstWord = firstWordMatch ? firstWordMatch[0].replace(/^\\s*/, \"\") : \"\";\n      state.context.line.indent = stream.indentation();\n      ch = stream.peek();\n\n      // Line comment\n      if (stream.match(\"//\")) {\n        stream.skipToEnd();\n        return [\"comment\", \"comment\"];\n      }\n      // Block comment\n      if (stream.match(\"/*\")) {\n        state.tokenize = tokenCComment;\n        return tokenCComment(stream, state);\n      }\n      // String\n      if (ch == \"\\\"\" || ch == \"'\") {\n        stream.next();\n        state.tokenize = tokenString(ch);\n        return state.tokenize(stream, state);\n      }\n      // Def\n      if (ch == \"@\") {\n        stream.next();\n        stream.eatWhile(/[\\w\\\\-]/);\n        return [\"def\", stream.current()];\n      }\n      // ID selector or Hex color\n      if (ch == \"#\") {\n        stream.next();\n        // Hex color\n        if (stream.match(/^[0-9a-f]{3}([0-9a-f]([0-9a-f]{2}){0,2})?\\b(?!-)/i)) {\n          return [\"atom\", \"atom\"];\n        }\n        // ID selector\n        if (stream.match(/^[a-z][\\w-]*/i)) {\n          return [\"builtin\", \"hash\"];\n        }\n      }\n      // Vendor prefixes\n      if (stream.match(vendorPrefixesRegexp)) {\n        return [\"meta\", \"vendor-prefixes\"];\n      }\n      // Numbers\n      if (stream.match(/^-?[0-9]?\\.?[0-9]/)) {\n        stream.eatWhile(/[a-z%]/i);\n        return [\"number\", \"unit\"];\n      }\n      // !important|optional\n      if (ch == \"!\") {\n        stream.next();\n        return [stream.match(/^(important|optional)/i) ? \"keyword\": \"operator\", \"important\"];\n      }\n      // Class\n      if (ch == \".\" && stream.match(/^\\.[a-z][\\w-]*/i)) {\n        return [\"qualifier\", \"qualifier\"];\n      }\n      // url url-prefix domain regexp\n      if (stream.match(documentTypesRegexp)) {\n        if (stream.peek() == \"(\") state.tokenize = tokenParenthesized;\n        return [\"property\", \"word\"];\n      }\n      // Mixins / Functions\n      if (stream.match(/^[a-z][\\w-]*\\(/i)) {\n        stream.backUp(1);\n        return [\"keyword\", \"mixin\"];\n      }\n      // Block mixins\n      if (stream.match(/^(\\+|-)[a-z][\\w-]*\\(/i)) {\n        stream.backUp(1);\n        return [\"keyword\", \"block-mixin\"];\n      }\n      // Parent Reference BEM naming\n      if (stream.string.match(/^\\s*&/) && stream.match(/^[-_]+[a-z][\\w-]*/)) {\n        return [\"qualifier\", \"qualifier\"];\n      }\n      // / Root Reference & Parent Reference\n      if (stream.match(/^(\\/|&)(-|_|:|\\.|#|[a-z])/)) {\n        stream.backUp(1);\n        return [\"variable-3\", \"reference\"];\n      }\n      if (stream.match(/^&{1}\\s*$/)) {\n        return [\"variable-3\", \"reference\"];\n      }\n      // Word operator\n      if (stream.match(wordOperatorKeywordsRegexp)) {\n        return [\"operator\", \"operator\"];\n      }\n      // Word\n      if (stream.match(/^\\$?[-_]*[a-z0-9]+[\\w-]*/i)) {\n        // Variable\n        if (stream.match(/^(\\.|\\[)[\\w-\\'\\\"\\]]+/i, false)) {\n          if (!wordIsTag(stream.current())) {\n            stream.match('.');\n            return [\"variable-2\", \"variable-name\"];\n          }\n        }\n        return [\"variable-2\", \"word\"];\n      }\n      // Operators\n      if (stream.match(operatorsRegexp)) {\n        return [\"operator\", stream.current()];\n      }\n      // Delimiters\n      if (/[:;,{}\\[\\]\\(\\)]/.test(ch)) {\n        stream.next();\n        return [null, ch];\n      }\n      // Non-detected items\n      stream.next();\n      return [null, null];\n    }\n\n    /**\n     * Token comment\n     */\n    function tokenCComment(stream, state) {\n      var maybeEnd = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (maybeEnd && ch == \"/\") {\n          state.tokenize = null;\n          break;\n        }\n        maybeEnd = (ch == \"*\");\n      }\n      return [\"comment\", \"comment\"];\n    }\n\n    /**\n     * Token string\n     */\n    function tokenString(quote) {\n      return function(stream, state) {\n        var escaped = false, ch;\n        while ((ch = stream.next()) != null) {\n          if (ch == quote && !escaped) {\n            if (quote == \")\") stream.backUp(1);\n            break;\n          }\n          escaped = !escaped && ch == \"\\\\\";\n        }\n        if (ch == quote || !escaped && quote != \")\") state.tokenize = null;\n        return [\"string\", \"string\"];\n      };\n    }\n\n    /**\n     * Token parenthesized\n     */\n    function tokenParenthesized(stream, state) {\n      stream.next(); // Must be \"(\"\n      if (!stream.match(/\\s*[\\\"\\')]/, false))\n        state.tokenize = tokenString(\")\");\n      else\n        state.tokenize = null;\n      return [null, \"(\"];\n    }\n\n    /**\n     * Context management\n     */\n    function Context(type, indent, prev, line) {\n      this.type = type;\n      this.indent = indent;\n      this.prev = prev;\n      this.line = line || {firstWord: \"\", indent: 0};\n    }\n\n    function pushContext(state, stream, type, indent) {\n      indent = indent >= 0 ? indent : indentUnit;\n      state.context = new Context(type, stream.indentation() + indent, state.context);\n      return type;\n    }\n\n    function popContext(state, currentIndent) {\n      var contextIndent = state.context.indent - indentUnit;\n      currentIndent = currentIndent || false;\n      state.context = state.context.prev;\n      if (currentIndent) state.context.indent = contextIndent;\n      return state.context.type;\n    }\n\n    function pass(type, stream, state) {\n      return states[state.context.type](type, stream, state);\n    }\n\n    function popAndPass(type, stream, state, n) {\n      for (var i = n || 1; i > 0; i--)\n        state.context = state.context.prev;\n      return pass(type, stream, state);\n    }\n\n\n    /**\n     * Parser\n     */\n    function wordIsTag(word) {\n      return word.toLowerCase() in tagKeywords;\n    }\n\n    function wordIsProperty(word) {\n      word = word.toLowerCase();\n      return word in propertyKeywords || word in fontProperties;\n    }\n\n    function wordIsBlock(word) {\n      return word.toLowerCase() in blockKeywords;\n    }\n\n    function wordIsVendorPrefix(word) {\n      return word.toLowerCase().match(vendorPrefixesRegexp);\n    }\n\n    function wordAsValue(word) {\n      var wordLC = word.toLowerCase();\n      var override = \"variable-2\";\n      if (wordIsTag(word)) override = \"tag\";\n      else if (wordIsBlock(word)) override = \"block-keyword\";\n      else if (wordIsProperty(word)) override = \"property\";\n      else if (wordLC in valueKeywords || wordLC in commonAtoms) override = \"atom\";\n      else if (wordLC == \"return\" || wordLC in colorKeywords) override = \"keyword\";\n\n      // Font family\n      else if (word.match(/^[A-Z]/)) override = \"string\";\n      return override;\n    }\n\n    function typeIsBlock(type, stream) {\n      return ((endOfLine(stream) && (type == \"{\" || type == \"]\" || type == \"hash\" || type == \"qualifier\")) || type == \"block-mixin\");\n    }\n\n    function typeIsInterpolation(type, stream) {\n      return type == \"{\" && stream.match(/^\\s*\\$?[\\w-]+/i, false);\n    }\n\n    function typeIsPseudo(type, stream) {\n      return type == \":\" && stream.match(/^[a-z-]+/, false);\n    }\n\n    function startOfLine(stream) {\n      return stream.sol() || stream.string.match(new RegExp(\"^\\\\s*\" + escapeRegExp(stream.current())));\n    }\n\n    function endOfLine(stream) {\n      return stream.eol() || stream.match(/^\\s*$/, false);\n    }\n\n    function firstWordOfLine(line) {\n      var re = /^\\s*[-_]*[a-z0-9]+[\\w-]*/i;\n      var result = typeof line == \"string\" ? line.match(re) : line.string.match(re);\n      return result ? result[0].replace(/^\\s*/, \"\") : \"\";\n    }\n\n\n    /**\n     * Block\n     */\n    states.block = function(type, stream, state) {\n      if ((type == \"comment\" && startOfLine(stream)) ||\n          (type == \",\" && endOfLine(stream)) ||\n          type == \"mixin\") {\n        return pushContext(state, stream, \"block\", 0);\n      }\n      if (typeIsInterpolation(type, stream)) {\n        return pushContext(state, stream, \"interpolation\");\n      }\n      if (endOfLine(stream) && type == \"]\") {\n        if (!/^\\s*(\\.|#|:|\\[|\\*|&)/.test(stream.string) && !wordIsTag(firstWordOfLine(stream))) {\n          return pushContext(state, stream, \"block\", 0);\n        }\n      }\n      if (typeIsBlock(type, stream)) {\n        return pushContext(state, stream, \"block\");\n      }\n      if (type == \"}\" && endOfLine(stream)) {\n        return pushContext(state, stream, \"block\", 0);\n      }\n      if (type == \"variable-name\") {\n        if (stream.string.match(/^\\s?\\$[\\w-\\.\\[\\]\\'\\\"]+$/) || wordIsBlock(firstWordOfLine(stream))) {\n          return pushContext(state, stream, \"variableName\");\n        }\n        else {\n          return pushContext(state, stream, \"variableName\", 0);\n        }\n      }\n      if (type == \"=\") {\n        if (!endOfLine(stream) && !wordIsBlock(firstWordOfLine(stream))) {\n          return pushContext(state, stream, \"block\", 0);\n        }\n        return pushContext(state, stream, \"block\");\n      }\n      if (type == \"*\") {\n        if (endOfLine(stream) || stream.match(/\\s*(,|\\.|#|\\[|:|{)/,false)) {\n          override = \"tag\";\n          return pushContext(state, stream, \"block\");\n        }\n      }\n      if (typeIsPseudo(type, stream)) {\n        return pushContext(state, stream, \"pseudo\");\n      }\n      if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) {\n        return pushContext(state, stream, endOfLine(stream) ? \"block\" : \"atBlock\");\n      }\n      if (/@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {\n        return pushContext(state, stream, \"keyframes\");\n      }\n      if (/@extends?/.test(type)) {\n        return pushContext(state, stream, \"extend\", 0);\n      }\n      if (type && type.charAt(0) == \"@\") {\n\n        // Property Lookup\n        if (stream.indentation() > 0 && wordIsProperty(stream.current().slice(1))) {\n          override = \"variable-2\";\n          return \"block\";\n        }\n        if (/(@import|@require|@charset)/.test(type)) {\n          return pushContext(state, stream, \"block\", 0);\n        }\n        return pushContext(state, stream, \"block\");\n      }\n      if (type == \"reference\" && endOfLine(stream)) {\n        return pushContext(state, stream, \"block\");\n      }\n      if (type == \"(\") {\n        return pushContext(state, stream, \"parens\");\n      }\n\n      if (type == \"vendor-prefixes\") {\n        return pushContext(state, stream, \"vendorPrefixes\");\n      }\n      if (type == \"word\") {\n        var word = stream.current();\n        override = wordAsValue(word);\n\n        if (override == \"property\") {\n          if (startOfLine(stream)) {\n            return pushContext(state, stream, \"block\", 0);\n          } else {\n            override = \"atom\";\n            return \"block\";\n          }\n        }\n\n        if (override == \"tag\") {\n\n          // tag is a css value\n          if (/embed|menu|pre|progress|sub|table/.test(word)) {\n            if (wordIsProperty(firstWordOfLine(stream))) {\n              override = \"atom\";\n              return \"block\";\n            }\n          }\n\n          // tag is an attribute\n          if (stream.string.match(new RegExp(\"\\\\[\\\\s*\" + word + \"|\" + word +\"\\\\s*\\\\]\"))) {\n            override = \"atom\";\n            return \"block\";\n          }\n\n          // tag is a variable\n          if (tagVariablesRegexp.test(word)) {\n            if ((startOfLine(stream) && stream.string.match(/=/)) ||\n                (!startOfLine(stream) &&\n                 !stream.string.match(/^(\\s*\\.|#|\\&|\\[|\\/|>|\\*)/) &&\n                 !wordIsTag(firstWordOfLine(stream)))) {\n              override = \"variable-2\";\n              if (wordIsBlock(firstWordOfLine(stream)))  return \"block\";\n              return pushContext(state, stream, \"block\", 0);\n            }\n          }\n\n          if (endOfLine(stream)) return pushContext(state, stream, \"block\");\n        }\n        if (override == \"block-keyword\") {\n          override = \"keyword\";\n\n          // Postfix conditionals\n          if (stream.current(/(if|unless)/) && !startOfLine(stream)) {\n            return \"block\";\n          }\n          return pushContext(state, stream, \"block\");\n        }\n        if (word == \"return\") return pushContext(state, stream, \"block\", 0);\n\n        // Placeholder selector\n        if (override == \"variable-2\" && stream.string.match(/^\\s?\\$[\\w-\\.\\[\\]\\'\\\"]+$/)) {\n          return pushContext(state, stream, \"block\");\n        }\n      }\n      return state.context.type;\n    };\n\n\n    /**\n     * Parens\n     */\n    states.parens = function(type, stream, state) {\n      if (type == \"(\") return pushContext(state, stream, \"parens\");\n      if (type == \")\") {\n        if (state.context.prev.type == \"parens\") {\n          return popContext(state);\n        }\n        if ((stream.string.match(/^[a-z][\\w-]*\\(/i) && endOfLine(stream)) ||\n            wordIsBlock(firstWordOfLine(stream)) ||\n            /(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/.test(firstWordOfLine(stream)) ||\n            (!stream.string.match(/^-?[a-z][\\w-\\.\\[\\]\\'\\\"]*\\s*=/) &&\n             wordIsTag(firstWordOfLine(stream)))) {\n          return pushContext(state, stream, \"block\");\n        }\n        if (stream.string.match(/^[\\$-]?[a-z][\\w-\\.\\[\\]\\'\\\"]*\\s*=/) ||\n            stream.string.match(/^\\s*(\\(|\\)|[0-9])/) ||\n            stream.string.match(/^\\s+[a-z][\\w-]*\\(/i) ||\n            stream.string.match(/^\\s+[\\$-]?[a-z]/i)) {\n          return pushContext(state, stream, \"block\", 0);\n        }\n        if (endOfLine(stream)) return pushContext(state, stream, \"block\");\n        else return pushContext(state, stream, \"block\", 0);\n      }\n      if (type && type.charAt(0) == \"@\" && wordIsProperty(stream.current().slice(1))) {\n        override = \"variable-2\";\n      }\n      if (type == \"word\") {\n        var word = stream.current();\n        override = wordAsValue(word);\n        if (override == \"tag\" && tagVariablesRegexp.test(word)) {\n          override = \"variable-2\";\n        }\n        if (override == \"property\" || word == \"to\") override = \"atom\";\n      }\n      if (type == \"variable-name\") {\n        return pushContext(state, stream, \"variableName\");\n      }\n      if (typeIsPseudo(type, stream)) {\n        return pushContext(state, stream, \"pseudo\");\n      }\n      return state.context.type;\n    };\n\n\n    /**\n     * Vendor prefixes\n     */\n    states.vendorPrefixes = function(type, stream, state) {\n      if (type == \"word\") {\n        override = \"property\";\n        return pushContext(state, stream, \"block\", 0);\n      }\n      return popContext(state);\n    };\n\n\n    /**\n     * Pseudo\n     */\n    states.pseudo = function(type, stream, state) {\n      if (!wordIsProperty(firstWordOfLine(stream.string))) {\n        stream.match(/^[a-z-]+/);\n        override = \"variable-3\";\n        if (endOfLine(stream)) return pushContext(state, stream, \"block\");\n        return popContext(state);\n      }\n      return popAndPass(type, stream, state);\n    };\n\n\n    /**\n     * atBlock\n     */\n    states.atBlock = function(type, stream, state) {\n      if (type == \"(\") return pushContext(state, stream, \"atBlock_parens\");\n      if (typeIsBlock(type, stream)) {\n        return pushContext(state, stream, \"block\");\n      }\n      if (typeIsInterpolation(type, stream)) {\n        return pushContext(state, stream, \"interpolation\");\n      }\n      if (type == \"word\") {\n        var word = stream.current().toLowerCase();\n        if (/^(only|not|and|or)$/.test(word))\n          override = \"keyword\";\n        else if (documentTypes.hasOwnProperty(word))\n          override = \"tag\";\n        else if (mediaTypes.hasOwnProperty(word))\n          override = \"attribute\";\n        else if (mediaFeatures.hasOwnProperty(word))\n          override = \"property\";\n        else if (nonStandardPropertyKeywords.hasOwnProperty(word))\n          override = \"string-2\";\n        else override = wordAsValue(stream.current());\n        if (override == \"tag\" && endOfLine(stream)) {\n          return pushContext(state, stream, \"block\");\n        }\n      }\n      if (type == \"operator\" && /^(not|and|or)$/.test(stream.current())) {\n        override = \"keyword\";\n      }\n      return state.context.type;\n    };\n\n    states.atBlock_parens = function(type, stream, state) {\n      if (type == \"{\" || type == \"}\") return state.context.type;\n      if (type == \")\") {\n        if (endOfLine(stream)) return pushContext(state, stream, \"block\");\n        else return pushContext(state, stream, \"atBlock\");\n      }\n      if (type == \"word\") {\n        var word = stream.current().toLowerCase();\n        override = wordAsValue(word);\n        if (/^(max|min)/.test(word)) override = \"property\";\n        if (override == \"tag\") {\n          tagVariablesRegexp.test(word) ? override = \"variable-2\" : override = \"atom\";\n        }\n        return state.context.type;\n      }\n      return states.atBlock(type, stream, state);\n    };\n\n\n    /**\n     * Keyframes\n     */\n    states.keyframes = function(type, stream, state) {\n      if (stream.indentation() == \"0\" && ((type == \"}\" && startOfLine(stream)) || type == \"]\" || type == \"hash\"\n                                          || type == \"qualifier\" || wordIsTag(stream.current()))) {\n        return popAndPass(type, stream, state);\n      }\n      if (type == \"{\") return pushContext(state, stream, \"keyframes\");\n      if (type == \"}\") {\n        if (startOfLine(stream)) return popContext(state, true);\n        else return pushContext(state, stream, \"keyframes\");\n      }\n      if (type == \"unit\" && /^[0-9]+\\%$/.test(stream.current())) {\n        return pushContext(state, stream, \"keyframes\");\n      }\n      if (type == \"word\") {\n        override = wordAsValue(stream.current());\n        if (override == \"block-keyword\") {\n          override = \"keyword\";\n          return pushContext(state, stream, \"keyframes\");\n        }\n      }\n      if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) {\n        return pushContext(state, stream, endOfLine(stream) ? \"block\" : \"atBlock\");\n      }\n      if (type == \"mixin\") {\n        return pushContext(state, stream, \"block\", 0);\n      }\n      return state.context.type;\n    };\n\n\n    /**\n     * Interpolation\n     */\n    states.interpolation = function(type, stream, state) {\n      if (type == \"{\") popContext(state) && pushContext(state, stream, \"block\");\n      if (type == \"}\") {\n        if (stream.string.match(/^\\s*(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/i) ||\n            (stream.string.match(/^\\s*[a-z]/i) && wordIsTag(firstWordOfLine(stream)))) {\n          return pushContext(state, stream, \"block\");\n        }\n        if (!stream.string.match(/^(\\{|\\s*\\&)/) ||\n            stream.match(/\\s*[\\w-]/,false)) {\n          return pushContext(state, stream, \"block\", 0);\n        }\n        return pushContext(state, stream, \"block\");\n      }\n      if (type == \"variable-name\") {\n        return pushContext(state, stream, \"variableName\", 0);\n      }\n      if (type == \"word\") {\n        override = wordAsValue(stream.current());\n        if (override == \"tag\") override = \"atom\";\n      }\n      return state.context.type;\n    };\n\n\n    /**\n     * Extend/s\n     */\n    states.extend = function(type, stream, state) {\n      if (type == \"[\" || type == \"=\") return \"extend\";\n      if (type == \"]\") return popContext(state);\n      if (type == \"word\") {\n        override = wordAsValue(stream.current());\n        return \"extend\";\n      }\n      return popContext(state);\n    };\n\n\n    /**\n     * Variable name\n     */\n    states.variableName = function(type, stream, state) {\n      if (type == \"string\" || type == \"[\" || type == \"]\" || stream.current().match(/^(\\.|\\$)/)) {\n        if (stream.current().match(/^\\.[\\w-]+/i)) override = \"variable-2\";\n        return \"variableName\";\n      }\n      return popAndPass(type, stream, state);\n    };\n\n\n    return {\n      startState: function(base) {\n        return {\n          tokenize: null,\n          state: \"block\",\n          context: new Context(\"block\", base || 0, null)\n        };\n      },\n      token: function(stream, state) {\n        if (!state.tokenize && stream.eatSpace()) return null;\n        style = (state.tokenize || tokenBase)(stream, state);\n        if (style && typeof style == \"object\") {\n          type = style[1];\n          style = style[0];\n        }\n        override = style;\n        state.state = states[state.state](type, stream, state);\n        return override;\n      },\n      indent: function(state, textAfter, line) {\n\n        var cx = state.context,\n            ch = textAfter && textAfter.charAt(0),\n            indent = cx.indent,\n            lineFirstWord = firstWordOfLine(textAfter),\n            lineIndent = line.match(/^\\s*/)[0].replace(/\\t/g, indentUnitString).length,\n            prevLineFirstWord = state.context.prev ? state.context.prev.line.firstWord : \"\",\n            prevLineIndent = state.context.prev ? state.context.prev.line.indent : lineIndent;\n\n        if (cx.prev &&\n            (ch == \"}\" && (cx.type == \"block\" || cx.type == \"atBlock\" || cx.type == \"keyframes\") ||\n             ch == \")\" && (cx.type == \"parens\" || cx.type == \"atBlock_parens\") ||\n             ch == \"{\" && (cx.type == \"at\"))) {\n          indent = cx.indent - indentUnit;\n        } else if (!(/(\\})/.test(ch))) {\n          if (/@|\\$|\\d/.test(ch) ||\n              /^\\{/.test(textAfter) ||\n/^\\s*\\/(\\/|\\*)/.test(textAfter) ||\n              /^\\s*\\/\\*/.test(prevLineFirstWord) ||\n              /^\\s*[\\w-\\.\\[\\]\\'\\\"]+\\s*(\\?|:|\\+)?=/i.test(textAfter) ||\n/^(\\+|-)?[a-z][\\w-]*\\(/i.test(textAfter) ||\n/^return/.test(textAfter) ||\n              wordIsBlock(lineFirstWord)) {\n            indent = lineIndent;\n          } else if (/(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/.test(ch) || wordIsTag(lineFirstWord)) {\n            if (/\\,\\s*$/.test(prevLineFirstWord)) {\n              indent = prevLineIndent;\n            } else if (/^\\s+/.test(line) && (/(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/.test(prevLineFirstWord) || wordIsTag(prevLineFirstWord))) {\n              indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit;\n            } else {\n              indent = lineIndent;\n            }\n          } else if (!/,\\s*$/.test(line) && (wordIsVendorPrefix(lineFirstWord) || wordIsProperty(lineFirstWord))) {\n            if (wordIsBlock(prevLineFirstWord)) {\n              indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit;\n            } else if (/^\\{/.test(prevLineFirstWord)) {\n              indent = lineIndent <= prevLineIndent ? lineIndent : prevLineIndent + indentUnit;\n            } else if (wordIsVendorPrefix(prevLineFirstWord) || wordIsProperty(prevLineFirstWord)) {\n              indent = lineIndent >= prevLineIndent ? prevLineIndent : lineIndent;\n            } else if (/^(\\.|#|:|\\[|\\*|&|@|\\+|\\-|>|~|\\/)/.test(prevLineFirstWord) ||\n                      /=\\s*$/.test(prevLineFirstWord) ||\n                      wordIsTag(prevLineFirstWord) ||\n                      /^\\$[\\w-\\.\\[\\]\\'\\\"]/.test(prevLineFirstWord)) {\n              indent = prevLineIndent + indentUnit;\n            } else {\n              indent = lineIndent;\n            }\n          }\n        }\n        return indent;\n      },\n      electricChars: \"}\",\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      blockCommentContinue: \" * \",\n      lineComment: \"//\",\n      fold: \"indent\"\n    };\n  });\n\n  // developer.mozilla.org/en-US/docs/Web/HTML/Element\n  var tagKeywords_ = [\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\", \"b\", \"base\",\"bdi\", \"bdo\",\"bgsound\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\", \"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"div\", \"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\", \"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\", \"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\", \"mark\",\"marquee\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"nobr\",\"noframes\", \"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"pre\", \"progress\",\"q\",\"rp\",\"rt\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\", \"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"tr\",\"track\", \"u\",\"ul\",\"var\",\"video\"];\n\n  // github.com/codemirror/CodeMirror/blob/master/mode/css/css.js\n  // Note, \"url-prefix\" should precede \"url\" in order to match correctly in documentTypesRegexp\n  var documentTypes_ = [\"domain\", \"regexp\", \"url-prefix\", \"url\"];\n  var mediaTypes_ = [\"all\",\"aural\",\"braille\",\"handheld\",\"print\",\"projection\",\"screen\",\"tty\",\"tv\",\"embossed\"];\n  var mediaFeatures_ = [\"width\",\"min-width\",\"max-width\",\"height\",\"min-height\",\"max-height\",\"device-width\",\"min-device-width\",\"max-device-width\",\"device-height\",\"min-device-height\",\"max-device-height\",\"aspect-ratio\",\"min-aspect-ratio\",\"max-aspect-ratio\",\"device-aspect-ratio\",\"min-device-aspect-ratio\",\"max-device-aspect-ratio\",\"color\",\"min-color\",\"max-color\",\"color-index\",\"min-color-index\",\"max-color-index\",\"monochrome\",\"min-monochrome\",\"max-monochrome\",\"resolution\",\"min-resolution\",\"max-resolution\",\"scan\",\"grid\",\"dynamic-range\",\"video-dynamic-range\"];\n  var propertyKeywords_ = [\"align-content\",\"align-items\",\"align-self\",\"alignment-adjust\",\"alignment-baseline\",\"anchor-point\",\"animation\",\"animation-delay\",\"animation-direction\",\"animation-duration\",\"animation-fill-mode\",\"animation-iteration-count\",\"animation-name\",\"animation-play-state\",\"animation-timing-function\",\"appearance\",\"azimuth\",\"backface-visibility\",\"background\",\"background-attachment\",\"background-clip\",\"background-color\",\"background-image\",\"background-origin\",\"background-position\",\"background-repeat\",\"background-size\",\"baseline-shift\",\"binding\",\"bleed\",\"bookmark-label\",\"bookmark-level\",\"bookmark-state\",\"bookmark-target\",\"border\",\"border-bottom\",\"border-bottom-color\",\"border-bottom-left-radius\",\"border-bottom-right-radius\",\"border-bottom-style\",\"border-bottom-width\",\"border-collapse\",\"border-color\",\"border-image\",\"border-image-outset\",\"border-image-repeat\",\"border-image-slice\",\"border-image-source\",\"border-image-width\",\"border-left\",\"border-left-color\",\"border-left-style\",\"border-left-width\",\"border-radius\",\"border-right\",\"border-right-color\",\"border-right-style\",\"border-right-width\",\"border-spacing\",\"border-style\",\"border-top\",\"border-top-color\",\"border-top-left-radius\",\"border-top-right-radius\",\"border-top-style\",\"border-top-width\",\"border-width\",\"bottom\",\"box-decoration-break\",\"box-shadow\",\"box-sizing\",\"break-after\",\"break-before\",\"break-inside\",\"caption-side\",\"clear\",\"clip\",\"color\",\"color-profile\",\"column-count\",\"column-fill\",\"column-gap\",\"column-rule\",\"column-rule-color\",\"column-rule-style\",\"column-rule-width\",\"column-span\",\"column-width\",\"columns\",\"content\",\"counter-increment\",\"counter-reset\",\"crop\",\"cue\",\"cue-after\",\"cue-before\",\"cursor\",\"direction\",\"display\",\"dominant-baseline\",\"drop-initial-after-adjust\",\"drop-initial-after-align\",\"drop-initial-before-adjust\",\"drop-initial-before-align\",\"drop-initial-size\",\"drop-initial-value\",\"elevation\",\"empty-cells\",\"fit\",\"fit-position\",\"flex\",\"flex-basis\",\"flex-direction\",\"flex-flow\",\"flex-grow\",\"flex-shrink\",\"flex-wrap\",\"float\",\"float-offset\",\"flow-from\",\"flow-into\",\"font\",\"font-feature-settings\",\"font-family\",\"font-kerning\",\"font-language-override\",\"font-size\",\"font-size-adjust\",\"font-stretch\",\"font-style\",\"font-synthesis\",\"font-variant\",\"font-variant-alternates\",\"font-variant-caps\",\"font-variant-east-asian\",\"font-variant-ligatures\",\"font-variant-numeric\",\"font-variant-position\",\"font-weight\",\"grid\",\"grid-area\",\"grid-auto-columns\",\"grid-auto-flow\",\"grid-auto-position\",\"grid-auto-rows\",\"grid-column\",\"grid-column-end\",\"grid-column-start\",\"grid-row\",\"grid-row-end\",\"grid-row-start\",\"grid-template\",\"grid-template-areas\",\"grid-template-columns\",\"grid-template-rows\",\"hanging-punctuation\",\"height\",\"hyphens\",\"icon\",\"image-orientation\",\"image-rendering\",\"image-resolution\",\"inline-box-align\",\"justify-content\",\"left\",\"letter-spacing\",\"line-break\",\"line-height\",\"line-stacking\",\"line-stacking-ruby\",\"line-stacking-shift\",\"line-stacking-strategy\",\"list-style\",\"list-style-image\",\"list-style-position\",\"list-style-type\",\"margin\",\"margin-bottom\",\"margin-left\",\"margin-right\",\"margin-top\",\"marker-offset\",\"marks\",\"marquee-direction\",\"marquee-loop\",\"marquee-play-count\",\"marquee-speed\",\"marquee-style\",\"max-height\",\"max-width\",\"min-height\",\"min-width\",\"move-to\",\"nav-down\",\"nav-index\",\"nav-left\",\"nav-right\",\"nav-up\",\"object-fit\",\"object-position\",\"opacity\",\"order\",\"orphans\",\"outline\",\"outline-color\",\"outline-offset\",\"outline-style\",\"outline-width\",\"overflow\",\"overflow-style\",\"overflow-wrap\",\"overflow-x\",\"overflow-y\",\"padding\",\"padding-bottom\",\"padding-left\",\"padding-right\",\"padding-top\",\"page\",\"page-break-after\",\"page-break-before\",\"page-break-inside\",\"page-policy\",\"pause\",\"pause-after\",\"pause-before\",\"perspective\",\"perspective-origin\",\"pitch\",\"pitch-range\",\"play-during\",\"position\",\"presentation-level\",\"punctuation-trim\",\"quotes\",\"region-break-after\",\"region-break-before\",\"region-break-inside\",\"region-fragment\",\"rendering-intent\",\"resize\",\"rest\",\"rest-after\",\"rest-before\",\"richness\",\"right\",\"rotation\",\"rotation-point\",\"ruby-align\",\"ruby-overhang\",\"ruby-position\",\"ruby-span\",\"shape-image-threshold\",\"shape-inside\",\"shape-margin\",\"shape-outside\",\"size\",\"speak\",\"speak-as\",\"speak-header\",\"speak-numeral\",\"speak-punctuation\",\"speech-rate\",\"stress\",\"string-set\",\"tab-size\",\"table-layout\",\"target\",\"target-name\",\"target-new\",\"target-position\",\"text-align\",\"text-align-last\",\"text-decoration\",\"text-decoration-color\",\"text-decoration-line\",\"text-decoration-skip\",\"text-decoration-style\",\"text-emphasis\",\"text-emphasis-color\",\"text-emphasis-position\",\"text-emphasis-style\",\"text-height\",\"text-indent\",\"text-justify\",\"text-outline\",\"text-overflow\",\"text-shadow\",\"text-size-adjust\",\"text-space-collapse\",\"text-transform\",\"text-underline-position\",\"text-wrap\",\"top\",\"transform\",\"transform-origin\",\"transform-style\",\"transition\",\"transition-delay\",\"transition-duration\",\"transition-property\",\"transition-timing-function\",\"unicode-bidi\",\"vertical-align\",\"visibility\",\"voice-balance\",\"voice-duration\",\"voice-family\",\"voice-pitch\",\"voice-range\",\"voice-rate\",\"voice-stress\",\"voice-volume\",\"volume\",\"white-space\",\"widows\",\"width\",\"will-change\",\"word-break\",\"word-spacing\",\"word-wrap\",\"z-index\",\"clip-path\",\"clip-rule\",\"mask\",\"enable-background\",\"filter\",\"flood-color\",\"flood-opacity\",\"lighting-color\",\"stop-color\",\"stop-opacity\",\"pointer-events\",\"color-interpolation\",\"color-interpolation-filters\",\"color-rendering\",\"fill\",\"fill-opacity\",\"fill-rule\",\"image-rendering\",\"marker\",\"marker-end\",\"marker-mid\",\"marker-start\",\"shape-rendering\",\"stroke\",\"stroke-dasharray\",\"stroke-dashoffset\",\"stroke-linecap\",\"stroke-linejoin\",\"stroke-miterlimit\",\"stroke-opacity\",\"stroke-width\",\"text-rendering\",\"baseline-shift\",\"dominant-baseline\",\"glyph-orientation-horizontal\",\"glyph-orientation-vertical\",\"text-anchor\",\"writing-mode\",\"font-smoothing\",\"osx-font-smoothing\"];\n  var nonStandardPropertyKeywords_ = [\"scrollbar-arrow-color\",\"scrollbar-base-color\",\"scrollbar-dark-shadow-color\",\"scrollbar-face-color\",\"scrollbar-highlight-color\",\"scrollbar-shadow-color\",\"scrollbar-3d-light-color\",\"scrollbar-track-color\",\"shape-inside\",\"searchfield-cancel-button\",\"searchfield-decoration\",\"searchfield-results-button\",\"searchfield-results-decoration\",\"zoom\"];\n  var fontProperties_ = [\"font-family\",\"src\",\"unicode-range\",\"font-variant\",\"font-feature-settings\",\"font-stretch\",\"font-weight\",\"font-style\"];\n  var colorKeywords_ = [\"aliceblue\",\"antiquewhite\",\"aqua\",\"aquamarine\",\"azure\",\"beige\",\"bisque\",\"black\",\"blanchedalmond\",\"blue\",\"blueviolet\",\"brown\",\"burlywood\",\"cadetblue\",\"chartreuse\",\"chocolate\",\"coral\",\"cornflowerblue\",\"cornsilk\",\"crimson\",\"cyan\",\"darkblue\",\"darkcyan\",\"darkgoldenrod\",\"darkgray\",\"darkgreen\",\"darkkhaki\",\"darkmagenta\",\"darkolivegreen\",\"darkorange\",\"darkorchid\",\"darkred\",\"darksalmon\",\"darkseagreen\",\"darkslateblue\",\"darkslategray\",\"darkturquoise\",\"darkviolet\",\"deeppink\",\"deepskyblue\",\"dimgray\",\"dodgerblue\",\"firebrick\",\"floralwhite\",\"forestgreen\",\"fuchsia\",\"gainsboro\",\"ghostwhite\",\"gold\",\"goldenrod\",\"gray\",\"grey\",\"green\",\"greenyellow\",\"honeydew\",\"hotpink\",\"indianred\",\"indigo\",\"ivory\",\"khaki\",\"lavender\",\"lavenderblush\",\"lawngreen\",\"lemonchiffon\",\"lightblue\",\"lightcoral\",\"lightcyan\",\"lightgoldenrodyellow\",\"lightgray\",\"lightgreen\",\"lightpink\",\"lightsalmon\",\"lightseagreen\",\"lightskyblue\",\"lightslategray\",\"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\",\"slategray\",\"snow\",\"springgreen\",\"steelblue\",\"tan\",\"teal\",\"thistle\",\"tomato\",\"turquoise\",\"violet\",\"wheat\",\"white\",\"whitesmoke\",\"yellow\",\"yellowgreen\"];\n  var valueKeywords_ = [\"above\",\"absolute\",\"activeborder\",\"additive\",\"activecaption\",\"afar\",\"after-white-space\",\"ahead\",\"alias\",\"all\",\"all-scroll\",\"alphabetic\",\"alternate\",\"always\",\"amharic\",\"amharic-abegede\",\"antialiased\",\"appworkspace\",\"arabic-indic\",\"armenian\",\"asterisks\",\"attr\",\"auto\",\"avoid\",\"avoid-column\",\"avoid-page\",\"avoid-region\",\"background\",\"backwards\",\"baseline\",\"below\",\"bidi-override\",\"binary\",\"bengali\",\"blink\",\"block\",\"block-axis\",\"bold\",\"bolder\",\"border\",\"border-box\",\"both\",\"bottom\",\"break\",\"break-all\",\"break-word\",\"bullets\",\"button\",\"button-bevel\",\"buttonface\",\"buttonhighlight\",\"buttonshadow\",\"buttontext\",\"calc\",\"cambodian\",\"capitalize\",\"caps-lock-indicator\",\"caption\",\"captiontext\",\"caret\",\"cell\",\"center\",\"checkbox\",\"circle\",\"cjk-decimal\",\"cjk-earthly-branch\",\"cjk-heavenly-stem\",\"cjk-ideographic\",\"clear\",\"clip\",\"close-quote\",\"col-resize\",\"collapse\",\"column\",\"compact\",\"condensed\",\"conic-gradient\",\"contain\",\"content\",\"contents\",\"content-box\",\"context-menu\",\"continuous\",\"copy\",\"counter\",\"counters\",\"cover\",\"crop\",\"cross\",\"crosshair\",\"currentcolor\",\"cursive\",\"cyclic\",\"dashed\",\"decimal\",\"decimal-leading-zero\",\"default\",\"default-button\",\"destination-atop\",\"destination-in\",\"destination-out\",\"destination-over\",\"devanagari\",\"disc\",\"discard\",\"disclosure-closed\",\"disclosure-open\",\"document\",\"dot-dash\",\"dot-dot-dash\",\"dotted\",\"double\",\"down\",\"e-resize\",\"ease\",\"ease-in\",\"ease-in-out\",\"ease-out\",\"element\",\"ellipse\",\"ellipsis\",\"embed\",\"end\",\"ethiopic\",\"ethiopic-abegede\",\"ethiopic-abegede-am-et\",\"ethiopic-abegede-gez\",\"ethiopic-abegede-ti-er\",\"ethiopic-abegede-ti-et\",\"ethiopic-halehame-aa-er\",\"ethiopic-halehame-aa-et\",\"ethiopic-halehame-am-et\",\"ethiopic-halehame-gez\",\"ethiopic-halehame-om-et\",\"ethiopic-halehame-sid-et\",\"ethiopic-halehame-so-et\",\"ethiopic-halehame-ti-er\",\"ethiopic-halehame-ti-et\",\"ethiopic-halehame-tig\",\"ethiopic-numeric\",\"ew-resize\",\"expanded\",\"extends\",\"extra-condensed\",\"extra-expanded\",\"fantasy\",\"fast\",\"fill\",\"fixed\",\"flat\",\"flex\",\"footnotes\",\"forwards\",\"from\",\"geometricPrecision\",\"georgian\",\"graytext\",\"groove\",\"gujarati\",\"gurmukhi\",\"hand\",\"hangul\",\"hangul-consonant\",\"hebrew\",\"help\",\"hidden\",\"hide\",\"high\",\"higher\",\"highlight\",\"highlighttext\",\"hiragana\",\"hiragana-iroha\",\"horizontal\",\"hsl\",\"hsla\",\"icon\",\"ignore\",\"inactiveborder\",\"inactivecaption\",\"inactivecaptiontext\",\"infinite\",\"infobackground\",\"infotext\",\"inherit\",\"initial\",\"inline\",\"inline-axis\",\"inline-block\",\"inline-flex\",\"inline-table\",\"inset\",\"inside\",\"intrinsic\",\"invert\",\"italic\",\"japanese-formal\",\"japanese-informal\",\"justify\",\"kannada\",\"katakana\",\"katakana-iroha\",\"keep-all\",\"khmer\",\"korean-hangul-formal\",\"korean-hanja-formal\",\"korean-hanja-informal\",\"landscape\",\"lao\",\"large\",\"larger\",\"left\",\"level\",\"lighter\",\"line-through\",\"linear\",\"linear-gradient\",\"lines\",\"list-item\",\"listbox\",\"listitem\",\"local\",\"logical\",\"loud\",\"lower\",\"lower-alpha\",\"lower-armenian\",\"lower-greek\",\"lower-hexadecimal\",\"lower-latin\",\"lower-norwegian\",\"lower-roman\",\"lowercase\",\"ltr\",\"malayalam\",\"match\",\"matrix\",\"matrix3d\",\"media-controls-background\",\"media-current-time-display\",\"media-fullscreen-button\",\"media-mute-button\",\"media-play-button\",\"media-return-to-realtime-button\",\"media-rewind-button\",\"media-seek-back-button\",\"media-seek-forward-button\",\"media-slider\",\"media-sliderthumb\",\"media-time-remaining-display\",\"media-volume-slider\",\"media-volume-slider-container\",\"media-volume-sliderthumb\",\"medium\",\"menu\",\"menulist\",\"menulist-button\",\"menulist-text\",\"menulist-textfield\",\"menutext\",\"message-box\",\"middle\",\"min-intrinsic\",\"mix\",\"mongolian\",\"monospace\",\"move\",\"multiple\",\"myanmar\",\"n-resize\",\"narrower\",\"ne-resize\",\"nesw-resize\",\"no-close-quote\",\"no-drop\",\"no-open-quote\",\"no-repeat\",\"none\",\"normal\",\"not-allowed\",\"nowrap\",\"ns-resize\",\"numbers\",\"numeric\",\"nw-resize\",\"nwse-resize\",\"oblique\",\"octal\",\"open-quote\",\"optimizeLegibility\",\"optimizeSpeed\",\"oriya\",\"oromo\",\"outset\",\"outside\",\"outside-shape\",\"overlay\",\"overline\",\"padding\",\"padding-box\",\"painted\",\"page\",\"paused\",\"persian\",\"perspective\",\"plus-darker\",\"plus-lighter\",\"pointer\",\"polygon\",\"portrait\",\"pre\",\"pre-line\",\"pre-wrap\",\"preserve-3d\",\"progress\",\"push-button\",\"radial-gradient\",\"radio\",\"read-only\",\"read-write\",\"read-write-plaintext-only\",\"rectangle\",\"region\",\"relative\",\"repeat\",\"repeating-linear-gradient\",\"repeating-radial-gradient\",\"repeating-conic-gradient\",\"repeat-x\",\"repeat-y\",\"reset\",\"reverse\",\"rgb\",\"rgba\",\"ridge\",\"right\",\"rotate\",\"rotate3d\",\"rotateX\",\"rotateY\",\"rotateZ\",\"round\",\"row-resize\",\"rtl\",\"run-in\",\"running\",\"s-resize\",\"sans-serif\",\"scale\",\"scale3d\",\"scaleX\",\"scaleY\",\"scaleZ\",\"scroll\",\"scrollbar\",\"scroll-position\",\"se-resize\",\"searchfield\",\"searchfield-cancel-button\",\"searchfield-decoration\",\"searchfield-results-button\",\"searchfield-results-decoration\",\"semi-condensed\",\"semi-expanded\",\"separate\",\"serif\",\"show\",\"sidama\",\"simp-chinese-formal\",\"simp-chinese-informal\",\"single\",\"skew\",\"skewX\",\"skewY\",\"skip-white-space\",\"slide\",\"slider-horizontal\",\"slider-vertical\",\"sliderthumb-horizontal\",\"sliderthumb-vertical\",\"slow\",\"small\",\"small-caps\",\"small-caption\",\"smaller\",\"solid\",\"somali\",\"source-atop\",\"source-in\",\"source-out\",\"source-over\",\"space\",\"spell-out\",\"square\",\"square-button\",\"standard\",\"start\",\"static\",\"status-bar\",\"stretch\",\"stroke\",\"sub\",\"subpixel-antialiased\",\"super\",\"sw-resize\",\"symbolic\",\"symbols\",\"table\",\"table-caption\",\"table-cell\",\"table-column\",\"table-column-group\",\"table-footer-group\",\"table-header-group\",\"table-row\",\"table-row-group\",\"tamil\",\"telugu\",\"text\",\"text-bottom\",\"text-top\",\"textarea\",\"textfield\",\"thai\",\"thick\",\"thin\",\"threeddarkshadow\",\"threedface\",\"threedhighlight\",\"threedlightshadow\",\"threedshadow\",\"tibetan\",\"tigre\",\"tigrinya-er\",\"tigrinya-er-abegede\",\"tigrinya-et\",\"tigrinya-et-abegede\",\"to\",\"top\",\"trad-chinese-formal\",\"trad-chinese-informal\",\"translate\",\"translate3d\",\"translateX\",\"translateY\",\"translateZ\",\"transparent\",\"ultra-condensed\",\"ultra-expanded\",\"underline\",\"up\",\"upper-alpha\",\"upper-armenian\",\"upper-greek\",\"upper-hexadecimal\",\"upper-latin\",\"upper-norwegian\",\"upper-roman\",\"uppercase\",\"urdu\",\"url\",\"var\",\"vertical\",\"vertical-text\",\"visible\",\"visibleFill\",\"visiblePainted\",\"visibleStroke\",\"visual\",\"w-resize\",\"wait\",\"wave\",\"wider\",\"window\",\"windowframe\",\"windowtext\",\"words\",\"x-large\",\"x-small\",\"xor\",\"xx-large\",\"xx-small\",\"bicubic\",\"optimizespeed\",\"grayscale\",\"row\",\"row-reverse\",\"wrap\",\"wrap-reverse\",\"column-reverse\",\"flex-start\",\"flex-end\",\"space-between\",\"space-around\", \"unset\"];\n\n  var wordOperatorKeywords_ = [\"in\",\"and\",\"or\",\"not\",\"is not\",\"is a\",\"is\",\"isnt\",\"defined\",\"if unless\"],\n      blockKeywords_ = [\"for\",\"if\",\"else\",\"unless\", \"from\", \"to\"],\n      commonAtoms_ = [\"null\",\"true\",\"false\",\"href\",\"title\",\"type\",\"not-allowed\",\"readonly\",\"disabled\"],\n      commonDef_ = [\"@font-face\", \"@keyframes\", \"@media\", \"@viewport\", \"@page\", \"@host\", \"@supports\", \"@block\", \"@css\"];\n\n  var hintWords = tagKeywords_.concat(documentTypes_,mediaTypes_,mediaFeatures_,\n                                      propertyKeywords_,nonStandardPropertyKeywords_,\n                                      colorKeywords_,valueKeywords_,fontProperties_,\n                                      wordOperatorKeywords_,blockKeywords_,\n                                      commonAtoms_,commonDef_);\n\n  function wordRegexp(words) {\n    words = words.sort(function(a,b){return b > a;});\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  function keySet(array) {\n    var keys = {};\n    for (var i = 0; i < array.length; ++i) keys[array[i]] = true;\n    return keys;\n  }\n\n  function escapeRegExp(text) {\n    return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n  }\n\n  CodeMirror.registerHelper(\"hintWords\", \"stylus\", hintWords);\n  CodeMirror.defineMIME(\"text/x-styl\", \"stylus\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/swift/swift.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Swift mode created by Michael Kaminsky https://github.com/mkaminsky11\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\")\n    mod(require(\"../../lib/codemirror\"))\n  else if (typeof define == \"function\" && define.amd)\n    define([\"../../lib/codemirror\"], mod)\n  else\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n\n  function wordSet(words) {\n    var set = {}\n    for (var i = 0; i < words.length; i++) set[words[i]] = true\n    return set\n  }\n\n  var keywords = wordSet([\"_\",\"var\",\"let\",\"class\",\"enum\",\"extension\",\"import\",\"protocol\",\"struct\",\"func\",\"typealias\",\"associatedtype\",\n                          \"open\",\"public\",\"internal\",\"fileprivate\",\"private\",\"deinit\",\"init\",\"new\",\"override\",\"self\",\"subscript\",\"super\",\n                          \"convenience\",\"dynamic\",\"final\",\"indirect\",\"lazy\",\"required\",\"static\",\"unowned\",\"unowned(safe)\",\"unowned(unsafe)\",\"weak\",\"as\",\"is\",\n                          \"break\",\"case\",\"continue\",\"default\",\"else\",\"fallthrough\",\"for\",\"guard\",\"if\",\"in\",\"repeat\",\"switch\",\"where\",\"while\",\n                          \"defer\",\"return\",\"inout\",\"mutating\",\"nonmutating\",\"catch\",\"do\",\"rethrows\",\"throw\",\"throws\",\"try\",\"didSet\",\"get\",\"set\",\"willSet\",\n                          \"assignment\",\"associativity\",\"infix\",\"left\",\"none\",\"operator\",\"postfix\",\"precedence\",\"precedencegroup\",\"prefix\",\"right\",\n                          \"Any\",\"AnyObject\",\"Type\",\"dynamicType\",\"Self\",\"Protocol\",\"__COLUMN__\",\"__FILE__\",\"__FUNCTION__\",\"__LINE__\"])\n  var definingKeywords = wordSet([\"var\",\"let\",\"class\",\"enum\",\"extension\",\"import\",\"protocol\",\"struct\",\"func\",\"typealias\",\"associatedtype\",\"for\"])\n  var atoms = wordSet([\"true\",\"false\",\"nil\",\"self\",\"super\",\"_\"])\n  var types = wordSet([\"Array\",\"Bool\",\"Character\",\"Dictionary\",\"Double\",\"Float\",\"Int\",\"Int8\",\"Int16\",\"Int32\",\"Int64\",\"Never\",\"Optional\",\"Set\",\"String\",\n                       \"UInt8\",\"UInt16\",\"UInt32\",\"UInt64\",\"Void\"])\n  var operators = \"+-/*%=|&<>~^?!\"\n  var punc = \":;,.(){}[]\"\n  var binary = /^\\-?0b[01][01_]*/\n  var octal = /^\\-?0o[0-7][0-7_]*/\n  var hexadecimal = /^\\-?0x[\\dA-Fa-f][\\dA-Fa-f_]*(?:(?:\\.[\\dA-Fa-f][\\dA-Fa-f_]*)?[Pp]\\-?\\d[\\d_]*)?/\n  var decimal = /^\\-?\\d[\\d_]*(?:\\.\\d[\\d_]*)?(?:[Ee]\\-?\\d[\\d_]*)?/\n  var identifier = /^\\$\\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\\1/\n  var property = /^\\.(?:\\$\\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\\1)/\n  var instruction = /^\\#[A-Za-z]+/\n  var attribute = /^@(?:\\$\\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\\1)/\n  //var regexp = /^\\/(?!\\s)(?:\\/\\/)?(?:\\\\.|[^\\/])+\\//\n\n  function tokenBase(stream, state, prev) {\n    if (stream.sol()) state.indented = stream.indentation()\n    if (stream.eatSpace()) return null\n\n    var ch = stream.peek()\n    if (ch == \"/\") {\n      if (stream.match(\"//\")) {\n        stream.skipToEnd()\n        return \"comment\"\n      }\n      if (stream.match(\"/*\")) {\n        state.tokenize.push(tokenComment)\n        return tokenComment(stream, state)\n      }\n    }\n    if (stream.match(instruction)) return \"builtin\"\n    if (stream.match(attribute)) return \"attribute\"\n    if (stream.match(binary)) return \"number\"\n    if (stream.match(octal)) return \"number\"\n    if (stream.match(hexadecimal)) return \"number\"\n    if (stream.match(decimal)) return \"number\"\n    if (stream.match(property)) return \"property\"\n    if (operators.indexOf(ch) > -1) {\n      stream.next()\n      return \"operator\"\n    }\n    if (punc.indexOf(ch) > -1) {\n      stream.next()\n      stream.match(\"..\")\n      return \"punctuation\"\n    }\n    var stringMatch\n    if (stringMatch = stream.match(/(\"\"\"|\"|')/)) {\n      var tokenize = tokenString.bind(null, stringMatch[0])\n      state.tokenize.push(tokenize)\n      return tokenize(stream, state)\n    }\n\n    if (stream.match(identifier)) {\n      var ident = stream.current()\n      if (types.hasOwnProperty(ident)) return \"variable-2\"\n      if (atoms.hasOwnProperty(ident)) return \"atom\"\n      if (keywords.hasOwnProperty(ident)) {\n        if (definingKeywords.hasOwnProperty(ident))\n          state.prev = \"define\"\n        return \"keyword\"\n      }\n      if (prev == \"define\") return \"def\"\n      return \"variable\"\n    }\n\n    stream.next()\n    return null\n  }\n\n  function tokenUntilClosingParen() {\n    var depth = 0\n    return function(stream, state, prev) {\n      var inner = tokenBase(stream, state, prev)\n      if (inner == \"punctuation\") {\n        if (stream.current() == \"(\") ++depth\n        else if (stream.current() == \")\") {\n          if (depth == 0) {\n            stream.backUp(1)\n            state.tokenize.pop()\n            return state.tokenize[state.tokenize.length - 1](stream, state)\n          }\n          else --depth\n        }\n      }\n      return inner\n    }\n  }\n\n  function tokenString(openQuote, stream, state) {\n    var singleLine = openQuote.length == 1\n    var ch, escaped = false\n    while (ch = stream.peek()) {\n      if (escaped) {\n        stream.next()\n        if (ch == \"(\") {\n          state.tokenize.push(tokenUntilClosingParen())\n          return \"string\"\n        }\n        escaped = false\n      } else if (stream.match(openQuote)) {\n        state.tokenize.pop()\n        return \"string\"\n      } else {\n        stream.next()\n        escaped = ch == \"\\\\\"\n      }\n    }\n    if (singleLine) {\n      state.tokenize.pop()\n    }\n    return \"string\"\n  }\n\n  function tokenComment(stream, state) {\n    var ch\n    while (true) {\n      stream.match(/^[^/*]+/, true)\n      ch = stream.next()\n      if (!ch) break\n      if (ch === \"/\" && stream.eat(\"*\")) {\n        state.tokenize.push(tokenComment)\n      } else if (ch === \"*\" && stream.eat(\"/\")) {\n        state.tokenize.pop()\n      }\n    }\n    return \"comment\"\n  }\n\n  function Context(prev, align, indented) {\n    this.prev = prev\n    this.align = align\n    this.indented = indented\n  }\n\n  function pushContext(state, stream) {\n    var align = stream.match(/^\\s*($|\\/[\\/\\*])/, false) ? null : stream.column() + 1\n    state.context = new Context(state.context, align, state.indented)\n  }\n\n  function popContext(state) {\n    if (state.context) {\n      state.indented = state.context.indented\n      state.context = state.context.prev\n    }\n  }\n\n  CodeMirror.defineMode(\"swift\", function(config) {\n    return {\n      startState: function() {\n        return {\n          prev: null,\n          context: null,\n          indented: 0,\n          tokenize: []\n        }\n      },\n\n      token: function(stream, state) {\n        var prev = state.prev\n        state.prev = null\n        var tokenize = state.tokenize[state.tokenize.length - 1] || tokenBase\n        var style = tokenize(stream, state, prev)\n        if (!style || style == \"comment\") state.prev = prev\n        else if (!state.prev) state.prev = style\n\n        if (style == \"punctuation\") {\n          var bracket = /[\\(\\[\\{]|([\\]\\)\\}])/.exec(stream.current())\n          if (bracket) (bracket[1] ? popContext : pushContext)(state, stream)\n        }\n\n        return style\n      },\n\n      indent: function(state, textAfter) {\n        var cx = state.context\n        if (!cx) return 0\n        var closing = /^[\\]\\}\\)]/.test(textAfter)\n        if (cx.align != null) return cx.align - (closing ? 1 : 0)\n        return cx.indented + (closing ? 0 : config.indentUnit)\n      },\n\n      electricInput: /^\\s*[\\)\\}\\]]$/,\n\n      lineComment: \"//\",\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      fold: \"brace\",\n      closeBrackets: \"()[]{}''\\\"\\\"``\"\n    }\n  })\n\n  CodeMirror.defineMIME(\"text/x-swift\",\"swift\")\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/tcl/tcl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n//tcl mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"tcl\", function() {\n  function parseWords(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  var keywords = parseWords(\"Tcl safe after append array auto_execok auto_import auto_load \" +\n        \"auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror \" +\n        \"binary break catch cd close concat continue dde eof encoding error \" +\n        \"eval exec exit expr fblocked fconfigure fcopy file fileevent filename \" +\n        \"filename flush for foreach format gets glob global history http if \" +\n        \"incr info interp join lappend lindex linsert list llength load lrange \" +\n        \"lreplace lsearch lset lsort memory msgcat namespace open package parray \" +\n        \"pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp \" +\n        \"registry regsub rename resource return scan seek set socket source split \" +\n        \"string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord \" +\n        \"tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest \" +\n        \"tclvars tell time trace unknown unset update uplevel upvar variable \" +\n    \"vwait\");\n    var functions = parseWords(\"if elseif else and not or eq ne in ni for foreach while switch\");\n    var isOperatorChar = /[+\\-*&%=<>!?^\\/\\|]/;\n    function chain(stream, state, f) {\n      state.tokenize = f;\n      return f(stream, state);\n    }\n    function tokenBase(stream, state) {\n      var beforeParams = state.beforeParams;\n      state.beforeParams = false;\n      var ch = stream.next();\n      if ((ch == '\"' || ch == \"'\") && state.inParams) {\n        return chain(stream, state, tokenString(ch));\n      } else if (/[\\[\\]{}\\(\\),;\\.]/.test(ch)) {\n        if (ch == \"(\" && beforeParams) state.inParams = true;\n        else if (ch == \")\") state.inParams = false;\n          return null;\n      } else if (/\\d/.test(ch)) {\n        stream.eatWhile(/[\\w\\.]/);\n        return \"number\";\n      } else if (ch == \"#\") {\n        if (stream.eat(\"*\"))\n          return chain(stream, state, tokenComment);\n        if (ch == \"#\" && stream.match(/ *\\[ *\\[/))\n          return chain(stream, state, tokenUnparsed);\n        stream.skipToEnd();\n        return \"comment\";\n      } else if (ch == '\"') {\n        stream.skipTo(/\"/);\n        return \"comment\";\n      } else if (ch == \"$\") {\n        stream.eatWhile(/[$_a-z0-9A-Z\\.{:]/);\n        stream.eatWhile(/}/);\n        state.beforeParams = true;\n        return \"builtin\";\n      } else if (isOperatorChar.test(ch)) {\n        stream.eatWhile(isOperatorChar);\n        return \"comment\";\n      } else {\n        stream.eatWhile(/[\\w\\$_{}\\xa1-\\uffff]/);\n        var word = stream.current().toLowerCase();\n        if (keywords && keywords.propertyIsEnumerable(word))\n          return \"keyword\";\n        if (functions && functions.propertyIsEnumerable(word)) {\n          state.beforeParams = true;\n          return \"keyword\";\n        }\n        return null;\n      }\n    }\n    function tokenString(quote) {\n      return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n          end = true;\n          break;\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end) state.tokenize = tokenBase;\n        return \"string\";\n      };\n    }\n    function tokenComment(stream, state) {\n      var maybeEnd = false, ch;\n      while (ch = stream.next()) {\n        if (ch == \"#\" && maybeEnd) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        maybeEnd = (ch == \"*\");\n      }\n      return \"comment\";\n    }\n    function tokenUnparsed(stream, state) {\n      var maybeEnd = 0, ch;\n      while (ch = stream.next()) {\n        if (ch == \"#\" && maybeEnd == 2) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        if (ch == \"]\")\n          maybeEnd++;\n        else if (ch != \" \")\n          maybeEnd = 0;\n      }\n      return \"meta\";\n    }\n    return {\n      startState: function() {\n        return {\n          tokenize: tokenBase,\n          beforeParams: false,\n          inParams: false\n        };\n      },\n      token: function(stream, state) {\n        if (stream.eatSpace()) return null;\n        return state.tokenize(stream, state);\n      },\n      lineComment: \"#\"\n    };\n});\nCodeMirror.defineMIME(\"text/x-tcl\", \"tcl\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/textile/textile.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") { // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  } else if (typeof define == \"function\" && define.amd) { // AMD\n    define([\"../../lib/codemirror\"], mod);\n  } else { // Plain browser env\n    mod(CodeMirror);\n  }\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var TOKEN_STYLES = {\n    addition: \"positive\",\n    attributes: \"attribute\",\n    bold: \"strong\",\n    cite: \"keyword\",\n    code: \"atom\",\n    definitionList: \"number\",\n    deletion: \"negative\",\n    div: \"punctuation\",\n    em: \"em\",\n    footnote: \"variable\",\n    footCite: \"qualifier\",\n    header: \"header\",\n    html: \"comment\",\n    image: \"string\",\n    italic: \"em\",\n    link: \"link\",\n    linkDefinition: \"link\",\n    list1: \"variable-2\",\n    list2: \"variable-3\",\n    list3: \"keyword\",\n    notextile: \"string-2\",\n    pre: \"operator\",\n    p: \"property\",\n    quote: \"bracket\",\n    span: \"quote\",\n    specialChar: \"tag\",\n    strong: \"strong\",\n    sub: \"builtin\",\n    sup: \"builtin\",\n    table: \"variable-3\",\n    tableHeading: \"operator\"\n  };\n\n  function startNewLine(stream, state) {\n    state.mode = Modes.newLayout;\n    state.tableHeading = false;\n\n    if (state.layoutType === \"definitionList\" && state.spanningLayout &&\n        stream.match(RE(\"definitionListEnd\"), false))\n      state.spanningLayout = false;\n  }\n\n  function handlePhraseModifier(stream, state, ch) {\n    if (ch === \"_\") {\n      if (stream.eat(\"_\"))\n        return togglePhraseModifier(stream, state, \"italic\", /__/, 2);\n      else\n        return togglePhraseModifier(stream, state, \"em\", /_/, 1);\n    }\n\n    if (ch === \"*\") {\n      if (stream.eat(\"*\")) {\n        return togglePhraseModifier(stream, state, \"bold\", /\\*\\*/, 2);\n      }\n      return togglePhraseModifier(stream, state, \"strong\", /\\*/, 1);\n    }\n\n    if (ch === \"[\") {\n      if (stream.match(/\\d+\\]/)) state.footCite = true;\n      return tokenStyles(state);\n    }\n\n    if (ch === \"(\") {\n      var spec = stream.match(/^(r|tm|c)\\)/);\n      if (spec)\n        return tokenStylesWith(state, TOKEN_STYLES.specialChar);\n    }\n\n    if (ch === \"<\" && stream.match(/(\\w+)[^>]+>[^<]+<\\/\\1>/))\n      return tokenStylesWith(state, TOKEN_STYLES.html);\n\n    if (ch === \"?\" && stream.eat(\"?\"))\n      return togglePhraseModifier(stream, state, \"cite\", /\\?\\?/, 2);\n\n    if (ch === \"=\" && stream.eat(\"=\"))\n      return togglePhraseModifier(stream, state, \"notextile\", /==/, 2);\n\n    if (ch === \"-\" && !stream.eat(\"-\"))\n      return togglePhraseModifier(stream, state, \"deletion\", /-/, 1);\n\n    if (ch === \"+\")\n      return togglePhraseModifier(stream, state, \"addition\", /\\+/, 1);\n\n    if (ch === \"~\")\n      return togglePhraseModifier(stream, state, \"sub\", /~/, 1);\n\n    if (ch === \"^\")\n      return togglePhraseModifier(stream, state, \"sup\", /\\^/, 1);\n\n    if (ch === \"%\")\n      return togglePhraseModifier(stream, state, \"span\", /%/, 1);\n\n    if (ch === \"@\")\n      return togglePhraseModifier(stream, state, \"code\", /@/, 1);\n\n    if (ch === \"!\") {\n      var type = togglePhraseModifier(stream, state, \"image\", /(?:\\([^\\)]+\\))?!/, 1);\n      stream.match(/^:\\S+/); // optional Url portion\n      return type;\n    }\n    return tokenStyles(state);\n  }\n\n  function togglePhraseModifier(stream, state, phraseModifier, closeRE, openSize) {\n    var charBefore = stream.pos > openSize ? stream.string.charAt(stream.pos - openSize - 1) : null;\n    var charAfter = stream.peek();\n    if (state[phraseModifier]) {\n      if ((!charAfter || /\\W/.test(charAfter)) && charBefore && /\\S/.test(charBefore)) {\n        var type = tokenStyles(state);\n        state[phraseModifier] = false;\n        return type;\n      }\n    } else if ((!charBefore || /\\W/.test(charBefore)) && charAfter && /\\S/.test(charAfter) &&\n               stream.match(new RegExp(\"^.*\\\\S\" + closeRE.source + \"(?:\\\\W|$)\"), false)) {\n      state[phraseModifier] = true;\n      state.mode = Modes.attributes;\n    }\n    return tokenStyles(state);\n  };\n\n  function tokenStyles(state) {\n    var disabled = textileDisabled(state);\n    if (disabled) return disabled;\n\n    var styles = [];\n    if (state.layoutType) styles.push(TOKEN_STYLES[state.layoutType]);\n\n    styles = styles.concat(activeStyles(\n      state, \"addition\", \"bold\", \"cite\", \"code\", \"deletion\", \"em\", \"footCite\",\n      \"image\", \"italic\", \"link\", \"span\", \"strong\", \"sub\", \"sup\", \"table\", \"tableHeading\"));\n\n    if (state.layoutType === \"header\")\n      styles.push(TOKEN_STYLES.header + \"-\" + state.header);\n\n    return styles.length ? styles.join(\" \") : null;\n  }\n\n  function textileDisabled(state) {\n    var type = state.layoutType;\n\n    switch(type) {\n    case \"notextile\":\n    case \"code\":\n    case \"pre\":\n      return TOKEN_STYLES[type];\n    default:\n      if (state.notextile)\n        return TOKEN_STYLES.notextile + (type ? (\" \" + TOKEN_STYLES[type]) : \"\");\n      return null;\n    }\n  }\n\n  function tokenStylesWith(state, extraStyles) {\n    var disabled = textileDisabled(state);\n    if (disabled) return disabled;\n\n    var type = tokenStyles(state);\n    if (extraStyles)\n      return type ? (type + \" \" + extraStyles) : extraStyles;\n    else\n      return type;\n  }\n\n  function activeStyles(state) {\n    var styles = [];\n    for (var i = 1; i < arguments.length; ++i) {\n      if (state[arguments[i]])\n        styles.push(TOKEN_STYLES[arguments[i]]);\n    }\n    return styles;\n  }\n\n  function blankLine(state) {\n    var spanningLayout = state.spanningLayout, type = state.layoutType;\n\n    for (var key in state) if (state.hasOwnProperty(key))\n      delete state[key];\n\n    state.mode = Modes.newLayout;\n    if (spanningLayout) {\n      state.layoutType = type;\n      state.spanningLayout = true;\n    }\n  }\n\n  var REs = {\n    cache: {},\n    single: {\n      bc: \"bc\",\n      bq: \"bq\",\n      definitionList: /- .*?:=+/,\n      definitionListEnd: /.*=:\\s*$/,\n      div: \"div\",\n      drawTable: /\\|.*\\|/,\n      foot: /fn\\d+/,\n      header: /h[1-6]/,\n      html: /\\s*<(?:\\/)?(\\w+)(?:[^>]+)?>(?:[^<]+<\\/\\1>)?/,\n      link: /[^\"]+\":\\S/,\n      linkDefinition: /\\[[^\\s\\]]+\\]\\S+/,\n      list: /(?:#+|\\*+)/,\n      notextile: \"notextile\",\n      para: \"p\",\n      pre: \"pre\",\n      table: \"table\",\n      tableCellAttributes: /[\\/\\\\]\\d+/,\n      tableHeading: /\\|_\\./,\n      tableText: /[^\"_\\*\\[\\(\\?\\+~\\^%@|-]+/,\n      text: /[^!\"_=\\*\\[\\(<\\?\\+~\\^%@-]+/\n    },\n    attributes: {\n      align: /(?:<>|<|>|=)/,\n      selector: /\\([^\\(][^\\)]+\\)/,\n      lang: /\\[[^\\[\\]]+\\]/,\n      pad: /(?:\\(+|\\)+){1,2}/,\n      css: /\\{[^\\}]+\\}/\n    },\n    createRe: function(name) {\n      switch (name) {\n      case \"drawTable\":\n        return REs.makeRe(\"^\", REs.single.drawTable, \"$\");\n      case \"html\":\n        return REs.makeRe(\"^\", REs.single.html, \"(?:\", REs.single.html, \")*\", \"$\");\n      case \"linkDefinition\":\n        return REs.makeRe(\"^\", REs.single.linkDefinition, \"$\");\n      case \"listLayout\":\n        return REs.makeRe(\"^\", REs.single.list, RE(\"allAttributes\"), \"*\\\\s+\");\n      case \"tableCellAttributes\":\n        return REs.makeRe(\"^\", REs.choiceRe(REs.single.tableCellAttributes,\n                                            RE(\"allAttributes\")), \"+\\\\.\");\n      case \"type\":\n        return REs.makeRe(\"^\", RE(\"allTypes\"));\n      case \"typeLayout\":\n        return REs.makeRe(\"^\", RE(\"allTypes\"), RE(\"allAttributes\"),\n                          \"*\\\\.\\\\.?\", \"(\\\\s+|$)\");\n      case \"attributes\":\n        return REs.makeRe(\"^\", RE(\"allAttributes\"), \"+\");\n\n      case \"allTypes\":\n        return REs.choiceRe(REs.single.div, REs.single.foot,\n                            REs.single.header, REs.single.bc, REs.single.bq,\n                            REs.single.notextile, REs.single.pre, REs.single.table,\n                            REs.single.para);\n\n      case \"allAttributes\":\n        return REs.choiceRe(REs.attributes.selector, REs.attributes.css,\n                            REs.attributes.lang, REs.attributes.align, REs.attributes.pad);\n\n      default:\n        return REs.makeRe(\"^\", REs.single[name]);\n      }\n    },\n    makeRe: function() {\n      var pattern = \"\";\n      for (var i = 0; i < arguments.length; ++i) {\n        var arg = arguments[i];\n        pattern += (typeof arg === \"string\") ? arg : arg.source;\n      }\n      return new RegExp(pattern);\n    },\n    choiceRe: function() {\n      var parts = [arguments[0]];\n      for (var i = 1; i < arguments.length; ++i) {\n        parts[i * 2 - 1] = \"|\";\n        parts[i * 2] = arguments[i];\n      }\n\n      parts.unshift(\"(?:\");\n      parts.push(\")\");\n      return REs.makeRe.apply(null, parts);\n    }\n  };\n\n  function RE(name) {\n    return (REs.cache[name] || (REs.cache[name] = REs.createRe(name)));\n  }\n\n  var Modes = {\n    newLayout: function(stream, state) {\n      if (stream.match(RE(\"typeLayout\"), false)) {\n        state.spanningLayout = false;\n        return (state.mode = Modes.blockType)(stream, state);\n      }\n      var newMode;\n      if (!textileDisabled(state)) {\n        if (stream.match(RE(\"listLayout\"), false))\n          newMode = Modes.list;\n        else if (stream.match(RE(\"drawTable\"), false))\n          newMode = Modes.table;\n        else if (stream.match(RE(\"linkDefinition\"), false))\n          newMode = Modes.linkDefinition;\n        else if (stream.match(RE(\"definitionList\")))\n          newMode = Modes.definitionList;\n        else if (stream.match(RE(\"html\"), false))\n          newMode = Modes.html;\n      }\n      return (state.mode = (newMode || Modes.text))(stream, state);\n    },\n\n    blockType: function(stream, state) {\n      var match, type;\n      state.layoutType = null;\n\n      if (match = stream.match(RE(\"type\")))\n        type = match[0];\n      else\n        return (state.mode = Modes.text)(stream, state);\n\n      if (match = type.match(RE(\"header\"))) {\n        state.layoutType = \"header\";\n        state.header = parseInt(match[0][1]);\n      } else if (type.match(RE(\"bq\"))) {\n        state.layoutType = \"quote\";\n      } else if (type.match(RE(\"bc\"))) {\n        state.layoutType = \"code\";\n      } else if (type.match(RE(\"foot\"))) {\n        state.layoutType = \"footnote\";\n      } else if (type.match(RE(\"notextile\"))) {\n        state.layoutType = \"notextile\";\n      } else if (type.match(RE(\"pre\"))) {\n        state.layoutType = \"pre\";\n      } else if (type.match(RE(\"div\"))) {\n        state.layoutType = \"div\";\n      } else if (type.match(RE(\"table\"))) {\n        state.layoutType = \"table\";\n      }\n\n      state.mode = Modes.attributes;\n      return tokenStyles(state);\n    },\n\n    text: function(stream, state) {\n      if (stream.match(RE(\"text\"))) return tokenStyles(state);\n\n      var ch = stream.next();\n      if (ch === '\"')\n        return (state.mode = Modes.link)(stream, state);\n      return handlePhraseModifier(stream, state, ch);\n    },\n\n    attributes: function(stream, state) {\n      state.mode = Modes.layoutLength;\n\n      if (stream.match(RE(\"attributes\")))\n        return tokenStylesWith(state, TOKEN_STYLES.attributes);\n      else\n        return tokenStyles(state);\n    },\n\n    layoutLength: function(stream, state) {\n      if (stream.eat(\".\") && stream.eat(\".\"))\n        state.spanningLayout = true;\n\n      state.mode = Modes.text;\n      return tokenStyles(state);\n    },\n\n    list: function(stream, state) {\n      var match = stream.match(RE(\"list\"));\n      state.listDepth = match[0].length;\n      var listMod = (state.listDepth - 1) % 3;\n      if (!listMod)\n        state.layoutType = \"list1\";\n      else if (listMod === 1)\n        state.layoutType = \"list2\";\n      else\n        state.layoutType = \"list3\";\n\n      state.mode = Modes.attributes;\n      return tokenStyles(state);\n    },\n\n    link: function(stream, state) {\n      state.mode = Modes.text;\n      if (stream.match(RE(\"link\"))) {\n        stream.match(/\\S+/);\n        return tokenStylesWith(state, TOKEN_STYLES.link);\n      }\n      return tokenStyles(state);\n    },\n\n    linkDefinition: function(stream, state) {\n      stream.skipToEnd();\n      return tokenStylesWith(state, TOKEN_STYLES.linkDefinition);\n    },\n\n    definitionList: function(stream, state) {\n      stream.match(RE(\"definitionList\"));\n\n      state.layoutType = \"definitionList\";\n\n      if (stream.match(/\\s*$/))\n        state.spanningLayout = true;\n      else\n        state.mode = Modes.attributes;\n\n      return tokenStyles(state);\n    },\n\n    html: function(stream, state) {\n      stream.skipToEnd();\n      return tokenStylesWith(state, TOKEN_STYLES.html);\n    },\n\n    table: function(stream, state) {\n      state.layoutType = \"table\";\n      return (state.mode = Modes.tableCell)(stream, state);\n    },\n\n    tableCell: function(stream, state) {\n      if (stream.match(RE(\"tableHeading\")))\n        state.tableHeading = true;\n      else\n        stream.eat(\"|\");\n\n      state.mode = Modes.tableCellAttributes;\n      return tokenStyles(state);\n    },\n\n    tableCellAttributes: function(stream, state) {\n      state.mode = Modes.tableText;\n\n      if (stream.match(RE(\"tableCellAttributes\")))\n        return tokenStylesWith(state, TOKEN_STYLES.attributes);\n      else\n        return tokenStyles(state);\n    },\n\n    tableText: function(stream, state) {\n      if (stream.match(RE(\"tableText\")))\n        return tokenStyles(state);\n\n      if (stream.peek() === \"|\") { // end of cell\n        state.mode = Modes.tableCell;\n        return tokenStyles(state);\n      }\n      return handlePhraseModifier(stream, state, stream.next());\n    }\n  };\n\n  CodeMirror.defineMode(\"textile\", function() {\n    return {\n      startState: function() {\n        return { mode: Modes.newLayout };\n      },\n      token: function(stream, state) {\n        if (stream.sol()) startNewLine(stream, state);\n        return state.mode(stream, state);\n      },\n      blankLine: blankLine\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-textile\", \"textile\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/tiddlywiki/tiddlywiki.css",
    "content": "span.cm-underlined {\n  text-decoration: underline;\n}\nspan.cm-strikethrough {\n  text-decoration: line-through;\n}\nspan.cm-brace {\n  color: #170;\n  font-weight: bold;\n}\nspan.cm-table {\n  color: blue;\n  font-weight: bold;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/tiddlywiki/tiddlywiki.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/***\n    |''Name''|tiddlywiki.js|\n    |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror|\n    |''Author''|PMario|\n    |''Version''|0.1.7|\n    |''Status''|''stable''|\n    |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]|\n    |''Documentation''|https://codemirror.tiddlyspace.com/|\n    |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]|\n    |''CoreVersion''|2.5.0|\n    |''Requires''|codemirror.js|\n    |''Keywords''|syntax highlighting color code mirror codemirror|\n    ! Info\n    CoreVersion parameter is needed for TiddlyWiki only!\n***/\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"tiddlywiki\", function () {\n  // Tokenizer\n  var textwords = {};\n\n  var keywords = {\n    \"allTags\": true, \"closeAll\": true, \"list\": true,\n    \"newJournal\": true, \"newTiddler\": true,\n    \"permaview\": true, \"saveChanges\": true,\n    \"search\": true, \"slider\": true, \"tabs\": true,\n    \"tag\": true, \"tagging\": true, \"tags\": true,\n    \"tiddler\": true, \"timeline\": true,\n    \"today\": true, \"version\": true, \"option\": true,\n    \"with\": true, \"filter\": true\n  };\n\n  var isSpaceName = /[\\w_\\-]/i,\n      reHR = /^\\-\\-\\-\\-+$/,                                 // <hr>\n      reWikiCommentStart = /^\\/\\*\\*\\*$/,            // /***\n      reWikiCommentStop = /^\\*\\*\\*\\/$/,             // ***/\n      reBlockQuote = /^<<<$/,\n\n      reJsCodeStart = /^\\/\\/\\{\\{\\{$/,                       // //{{{ js block start\n      reJsCodeStop = /^\\/\\/\\}\\}\\}$/,                        // //}}} js stop\n      reXmlCodeStart = /^<!--\\{\\{\\{-->$/,           // xml block start\n      reXmlCodeStop = /^<!--\\}\\}\\}-->$/,            // xml stop\n\n      reCodeBlockStart = /^\\{\\{\\{$/,                        // {{{ TW text div block start\n      reCodeBlockStop = /^\\}\\}\\}$/,                 // }}} TW text stop\n\n      reUntilCodeStop = /.*?\\}\\}\\}/;\n\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n\n  function tokenBase(stream, state) {\n    var sol = stream.sol(), ch = stream.peek();\n\n    state.block = false;        // indicates the start of a code block.\n\n    // check start of  blocks\n    if (sol && /[<\\/\\*{}\\-]/.test(ch)) {\n      if (stream.match(reCodeBlockStart)) {\n        state.block = true;\n        return chain(stream, state, twTokenCode);\n      }\n      if (stream.match(reBlockQuote))\n        return 'quote';\n      if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop))\n        return 'comment';\n      if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop))\n        return 'comment';\n      if (stream.match(reHR))\n        return 'hr';\n    }\n\n    stream.next();\n    if (sol && /[\\/\\*!#;:>|]/.test(ch)) {\n      if (ch == \"!\") { // tw header\n        stream.skipToEnd();\n        return \"header\";\n      }\n      if (ch == \"*\") { // tw list\n        stream.eatWhile('*');\n        return \"comment\";\n      }\n      if (ch == \"#\") { // tw numbered list\n        stream.eatWhile('#');\n        return \"comment\";\n      }\n      if (ch == \";\") { // definition list, term\n        stream.eatWhile(';');\n        return \"comment\";\n      }\n      if (ch == \":\") { // definition list, description\n        stream.eatWhile(':');\n        return \"comment\";\n      }\n      if (ch == \">\") { // single line quote\n        stream.eatWhile(\">\");\n        return \"quote\";\n      }\n      if (ch == '|')\n        return 'header';\n    }\n\n    if (ch == '{' && stream.match('{{'))\n      return chain(stream, state, twTokenCode);\n\n    // rudimentary html:// file:// link matching. TW knows much more ...\n    if (/[hf]/i.test(ch) &&\n        /[ti]/i.test(stream.peek()) &&\n        stream.match(/\\b(ttps?|tp|ile):\\/\\/[\\-A-Z0-9+&@#\\/%?=~_|$!:,.;]*[A-Z0-9+&@#\\/%=~_|$]/i))\n      return \"link\";\n\n    // just a little string indicator, don't want to have the whole string covered\n    if (ch == '\"')\n      return 'string';\n\n    if (ch == '~')    // _no_ CamelCase indicator should be bold\n      return 'brace';\n\n    if (/[\\[\\]]/.test(ch) && stream.match(ch)) // check for [[..]]\n      return 'brace';\n\n    if (ch == \"@\") {    // check for space link. TODO fix @@...@@ highlighting\n      stream.eatWhile(isSpaceName);\n      return \"link\";\n    }\n\n    if (/\\d/.test(ch)) {        // numbers\n      stream.eatWhile(/\\d/);\n      return \"number\";\n    }\n\n    if (ch == \"/\") { // tw invisible comment\n      if (stream.eat(\"%\")) {\n        return chain(stream, state, twTokenComment);\n      } else if (stream.eat(\"/\")) { //\n        return chain(stream, state, twTokenEm);\n      }\n    }\n\n    if (ch == \"_\" && stream.eat(\"_\")) // tw underline\n        return chain(stream, state, twTokenUnderline);\n\n    // strikethrough and mdash handling\n    if (ch == \"-\" && stream.eat(\"-\")) {\n      // if strikethrough looks ugly, change CSS.\n      if (stream.peek() != ' ')\n        return chain(stream, state, twTokenStrike);\n      // mdash\n      if (stream.peek() == ' ')\n        return 'brace';\n    }\n\n    if (ch == \"'\" && stream.eat(\"'\")) // tw bold\n      return chain(stream, state, twTokenStrong);\n\n    if (ch == \"<\" && stream.eat(\"<\")) // tw macro\n      return chain(stream, state, twTokenMacro);\n\n    // core macro handling\n    stream.eatWhile(/[\\w\\$_]/);\n    return textwords.propertyIsEnumerable(stream.current()) ? \"keyword\" : null\n  }\n\n  // tw invisible comment\n  function twTokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"%\");\n    }\n    return \"comment\";\n  }\n\n  // tw strong / bold\n  function twTokenStrong(stream, state) {\n    var maybeEnd = false,\n    ch;\n    while (ch = stream.next()) {\n      if (ch == \"'\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"'\");\n    }\n    return \"strong\";\n  }\n\n  // tw code\n  function twTokenCode(stream, state) {\n    var sb = state.block;\n\n    if (sb && stream.current()) {\n      return \"comment\";\n    }\n\n    if (!sb && stream.match(reUntilCodeStop)) {\n      state.tokenize = tokenBase;\n      return \"comment\";\n    }\n\n    if (sb && stream.sol() && stream.match(reCodeBlockStop)) {\n      state.tokenize = tokenBase;\n      return \"comment\";\n    }\n\n    stream.next();\n    return \"comment\";\n  }\n\n  // tw em / italic\n  function twTokenEm(stream, state) {\n    var maybeEnd = false,\n    ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"/\");\n    }\n    return \"em\";\n  }\n\n  // tw underlined text\n  function twTokenUnderline(stream, state) {\n    var maybeEnd = false,\n    ch;\n    while (ch = stream.next()) {\n      if (ch == \"_\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"_\");\n    }\n    return \"underlined\";\n  }\n\n  // tw strike through text looks ugly\n  // change CSS if needed\n  function twTokenStrike(stream, state) {\n    var maybeEnd = false, ch;\n\n    while (ch = stream.next()) {\n      if (ch == \"-\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"-\");\n    }\n    return \"strikethrough\";\n  }\n\n  // macro\n  function twTokenMacro(stream, state) {\n    if (stream.current() == '<<') {\n      return 'macro';\n    }\n\n    var ch = stream.next();\n    if (!ch) {\n      state.tokenize = tokenBase;\n      return null;\n    }\n    if (ch == \">\") {\n      if (stream.peek() == '>') {\n        stream.next();\n        state.tokenize = tokenBase;\n        return \"macro\";\n      }\n    }\n\n    stream.eatWhile(/[\\w\\$_]/);\n    return keywords.propertyIsEnumerable(stream.current()) ? \"keyword\" : null\n  }\n\n  // Interface\n  return {\n    startState: function () {\n      return {tokenize: tokenBase};\n    },\n\n    token: function (stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      return style;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-tiddlywiki\", \"tiddlywiki\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/tiki/tiki.css",
    "content": ".cm-tw-syntaxerror {\n\tcolor: #FFF;\n\tbackground-color: #900;\n}\n\n.cm-tw-deleted {\n\ttext-decoration: line-through;\n}\n\n.cm-tw-header5 {\n\tfont-weight: bold;\n}\n.cm-tw-listitem:first-child { /*Added first child to fix duplicate padding when highlighting*/\n\tpadding-left: 10px;\n}\n\n.cm-tw-box {\n\tborder-top-width: 0px !important;\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: inherit;\n}\n\n.cm-tw-underline {\n\ttext-decoration: underline;\n}"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/tiki/tiki.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('tiki', function(config) {\n  function inBlock(style, terminator, returnTokenizer) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.match(terminator)) {\n          state.tokenize = inText;\n          break;\n        }\n        stream.next();\n      }\n\n      if (returnTokenizer) state.tokenize = returnTokenizer;\n\n      return style;\n    };\n  }\n\n  function inLine(style) {\n    return function(stream, state) {\n      while(!stream.eol()) {\n        stream.next();\n      }\n      state.tokenize = inText;\n      return style;\n    };\n  }\n\n  function inText(stream, state) {\n    function chain(parser) {\n      state.tokenize = parser;\n      return parser(stream, state);\n    }\n\n    var sol = stream.sol();\n    var ch = stream.next();\n\n    //non start of line\n    switch (ch) { //switch is generally much faster than if, so it is used here\n    case \"{\": //plugin\n      stream.eat(\"/\");\n      stream.eatSpace();\n      stream.eatWhile(/[^\\s\\u00a0=\\\"\\'\\/?(}]/);\n      state.tokenize = inPlugin;\n      return \"tag\";\n    case \"_\": //bold\n      if (stream.eat(\"_\"))\n        return chain(inBlock(\"strong\", \"__\", inText));\n      break;\n    case \"'\": //italics\n      if (stream.eat(\"'\"))\n        return chain(inBlock(\"em\", \"''\", inText));\n      break;\n    case \"(\":// Wiki Link\n      if (stream.eat(\"(\"))\n        return chain(inBlock(\"variable-2\", \"))\", inText));\n      break;\n    case \"[\":// Weblink\n      return chain(inBlock(\"variable-3\", \"]\", inText));\n      break;\n    case \"|\": //table\n      if (stream.eat(\"|\"))\n        return chain(inBlock(\"comment\", \"||\"));\n      break;\n    case \"-\":\n      if (stream.eat(\"=\")) {//titleBar\n        return chain(inBlock(\"header string\", \"=-\", inText));\n      } else if (stream.eat(\"-\")) {//deleted\n        return chain(inBlock(\"error tw-deleted\", \"--\", inText));\n      }\n      break;\n    case \"=\": //underline\n      if (stream.match(\"==\"))\n        return chain(inBlock(\"tw-underline\", \"===\", inText));\n      break;\n    case \":\":\n      if (stream.eat(\":\"))\n        return chain(inBlock(\"comment\", \"::\"));\n      break;\n    case \"^\": //box\n      return chain(inBlock(\"tw-box\", \"^\"));\n      break;\n    case \"~\": //np\n      if (stream.match(\"np~\"))\n        return chain(inBlock(\"meta\", \"~/np~\"));\n      break;\n    }\n\n    //start of line types\n    if (sol) {\n      switch (ch) {\n      case \"!\": //header at start of line\n        if (stream.match('!!!!!')) {\n          return chain(inLine(\"header string\"));\n        } else if (stream.match('!!!!')) {\n          return chain(inLine(\"header string\"));\n        } else if (stream.match('!!!')) {\n          return chain(inLine(\"header string\"));\n        } else if (stream.match('!!')) {\n          return chain(inLine(\"header string\"));\n        } else {\n          return chain(inLine(\"header string\"));\n        }\n        break;\n      case \"*\": //unordered list line item, or <li /> at start of line\n      case \"#\": //ordered list line item, or <li /> at start of line\n      case \"+\": //ordered list line item, or <li /> at start of line\n        return chain(inLine(\"tw-listitem bracket\"));\n        break;\n      }\n    }\n\n    //stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki\n    return null;\n  }\n\n  var indentUnit = config.indentUnit;\n\n  // Return variables for tokenizers\n  var pluginName, type;\n  function inPlugin(stream, state) {\n    var ch = stream.next();\n    var peek = stream.peek();\n\n    if (ch == \"}\") {\n      state.tokenize = inText;\n      //type = ch == \")\" ? \"endPlugin\" : \"selfclosePlugin\"; inPlugin\n      return \"tag\";\n    } else if (ch == \"(\" || ch == \")\") {\n      return \"bracket\";\n    } else if (ch == \"=\") {\n      type = \"equals\";\n\n      if (peek == \">\") {\n        stream.next();\n        peek = stream.peek();\n      }\n\n      //here we detect values directly after equal character with no quotes\n      if (!/[\\'\\\"]/.test(peek)) {\n        state.tokenize = inAttributeNoQuote();\n      }\n      //end detect values\n\n      return \"operator\";\n    } else if (/[\\'\\\"]/.test(ch)) {\n      state.tokenize = inAttribute(ch);\n      return state.tokenize(stream, state);\n    } else {\n      stream.eatWhile(/[^\\s\\u00a0=\\\"\\'\\/?]/);\n      return \"keyword\";\n    }\n  }\n\n  function inAttribute(quote) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.next() == quote) {\n          state.tokenize = inPlugin;\n          break;\n        }\n      }\n      return \"string\";\n    };\n  }\n\n  function inAttributeNoQuote() {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        var ch = stream.next();\n        var peek = stream.peek();\n        if (ch == \" \" || ch == \",\" || /[ )}]/.test(peek)) {\n      state.tokenize = inPlugin;\n      break;\n    }\n  }\n  return \"string\";\n};\n                     }\n\nvar curState, setStyle;\nfunction pass() {\n  for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);\n}\n\nfunction cont() {\n  pass.apply(null, arguments);\n  return true;\n}\n\nfunction pushContext(pluginName, startOfLine) {\n  var noIndent = curState.context && curState.context.noIndent;\n  curState.context = {\n    prev: curState.context,\n    pluginName: pluginName,\n    indent: curState.indented,\n    startOfLine: startOfLine,\n    noIndent: noIndent\n  };\n}\n\nfunction popContext() {\n  if (curState.context) curState.context = curState.context.prev;\n}\n\nfunction element(type) {\n  if (type == \"openPlugin\") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));}\n  else if (type == \"closePlugin\") {\n    var err = false;\n    if (curState.context) {\n      err = curState.context.pluginName != pluginName;\n      popContext();\n    } else {\n      err = true;\n    }\n    if (err) setStyle = \"error\";\n    return cont(endcloseplugin(err));\n  }\n  else if (type == \"string\") {\n    if (!curState.context || curState.context.name != \"!cdata\") pushContext(\"!cdata\");\n    if (curState.tokenize == inText) popContext();\n    return cont();\n  }\n  else return cont();\n}\n\nfunction endplugin(startOfLine) {\n  return function(type) {\n    if (\n      type == \"selfclosePlugin\" ||\n        type == \"endPlugin\"\n    )\n      return cont();\n    if (type == \"endPlugin\") {pushContext(curState.pluginName, startOfLine); return cont();}\n    return cont();\n  };\n}\n\nfunction endcloseplugin(err) {\n  return function(type) {\n    if (err) setStyle = \"error\";\n    if (type == \"endPlugin\") return cont();\n    return pass();\n  };\n}\n\nfunction attributes(type) {\n  if (type == \"keyword\") {setStyle = \"attribute\"; return cont(attributes);}\n  if (type == \"equals\") return cont(attvalue, attributes);\n  return pass();\n}\nfunction attvalue(type) {\n  if (type == \"keyword\") {setStyle = \"string\"; return cont();}\n  if (type == \"string\") return cont(attvaluemaybe);\n  return pass();\n}\nfunction attvaluemaybe(type) {\n  if (type == \"string\") return cont(attvaluemaybe);\n  else return pass();\n}\nreturn {\n  startState: function() {\n    return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null};\n  },\n  token: function(stream, state) {\n    if (stream.sol()) {\n      state.startOfLine = true;\n      state.indented = stream.indentation();\n    }\n    if (stream.eatSpace()) return null;\n\n    setStyle = type = pluginName = null;\n    var style = state.tokenize(stream, state);\n    if ((style || type) && style != \"comment\") {\n      curState = state;\n      while (true) {\n        var comb = state.cc.pop() || element;\n        if (comb(type || style)) break;\n      }\n    }\n    state.startOfLine = false;\n    return setStyle || style;\n  },\n  indent: function(state, textAfter) {\n    var context = state.context;\n    if (context && context.noIndent) return 0;\n    if (context && /^{\\//.test(textAfter))\n        context = context.prev;\n    while (context && !context.startOfLine)\n        context = context.prev;\n    if (context) return context.indent + indentUnit;\n    else return 0;\n  },\n  electricChars: \"/\"\n};\n});\n\nCodeMirror.defineMIME(\"text/tiki\", \"tiki\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/toml/toml.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"toml\", function () {\n  return {\n    startState: function () {\n      return {\n        inString: false,\n        stringType: \"\",\n        lhs: true,\n        inArray: 0\n      };\n    },\n    token: function (stream, state) {\n      //check for state changes\n      if (!state.inString && ((stream.peek() == '\"') || (stream.peek() == \"'\"))) {\n        state.stringType = stream.peek();\n        stream.next(); // Skip quote\n        state.inString = true; // Update state\n      }\n      if (stream.sol() && state.inArray === 0) {\n        state.lhs = true;\n      }\n      //return state\n      if (state.inString) {\n        while (state.inString && !stream.eol()) {\n          if (stream.peek() === state.stringType) {\n            stream.next(); // Skip quote\n            state.inString = false; // Clear flag\n          } else if (stream.peek() === '\\\\') {\n            stream.next();\n            stream.next();\n          } else {\n            stream.match(/^.[^\\\\\\\"\\']*/);\n          }\n        }\n        return state.lhs ? \"property string\" : \"string\"; // Token style\n      } else if (state.inArray && stream.peek() === ']') {\n        stream.next();\n        state.inArray--;\n        return 'bracket';\n      } else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) {\n        stream.next();//skip closing ]\n        // array of objects has an extra open & close []\n        if (stream.peek() === ']') stream.next();\n        return \"atom\";\n      } else if (stream.peek() === \"#\") {\n        stream.skipToEnd();\n        return \"comment\";\n      } else if (stream.eatSpace()) {\n        return null;\n      } else if (state.lhs && stream.eatWhile(function (c) { return c != '=' && c != ' '; })) {\n        return \"property\";\n      } else if (state.lhs && stream.peek() === \"=\") {\n        stream.next();\n        state.lhs = false;\n        return null;\n      } else if (!state.lhs && stream.match(/^\\d\\d\\d\\d[\\d\\-\\:\\.T]*Z/)) {\n        return 'atom'; //date\n      } else if (!state.lhs && (stream.match('true') || stream.match('false'))) {\n        return 'atom';\n      } else if (!state.lhs && stream.peek() === '[') {\n        state.inArray++;\n        stream.next();\n        return 'bracket';\n      } else if (!state.lhs && stream.match(/^\\-?\\d+(?:\\.\\d+)?/)) {\n        return 'number';\n      } else if (!stream.eatSpace()) {\n        stream.next();\n      }\n      return null;\n    }\n  };\n});\n\nCodeMirror.defineMIME('text/x-toml', 'toml');\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/tornado/tornado.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"),\n        require(\"../../addon/mode/overlay\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\",\n            \"../../addon/mode/overlay\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"tornado:inner\", function() {\n    var keywords = [\"and\",\"as\",\"assert\",\"autoescape\",\"block\",\"break\",\"class\",\"comment\",\"context\",\n                    \"continue\",\"datetime\",\"def\",\"del\",\"elif\",\"else\",\"end\",\"escape\",\"except\",\n                    \"exec\",\"extends\",\"false\",\"finally\",\"for\",\"from\",\"global\",\"if\",\"import\",\"in\",\n                    \"include\",\"is\",\"json_encode\",\"lambda\",\"length\",\"linkify\",\"load\",\"module\",\n                    \"none\",\"not\",\"or\",\"pass\",\"print\",\"put\",\"raise\",\"raw\",\"return\",\"self\",\"set\",\n                    \"squeeze\",\"super\",\"true\",\"try\",\"url_escape\",\"while\",\"with\",\"without\",\"xhtml_escape\",\"yield\"];\n    keywords = new RegExp(\"^((\" + keywords.join(\")|(\") + \"))\\\\b\");\n\n    function tokenBase (stream, state) {\n      stream.eatWhile(/[^\\{]/);\n      var ch = stream.next();\n      if (ch == \"{\") {\n        if (ch = stream.eat(/\\{|%|#/)) {\n          state.tokenize = inTag(ch);\n          return \"tag\";\n        }\n      }\n    }\n    function inTag (close) {\n      if (close == \"{\") {\n        close = \"}\";\n      }\n      return function (stream, state) {\n        var ch = stream.next();\n        if ((ch == close) && stream.eat(\"}\")) {\n          state.tokenize = tokenBase;\n          return \"tag\";\n        }\n        if (stream.match(keywords)) {\n          return \"keyword\";\n        }\n        return close == \"#\" ? \"comment\" : \"string\";\n      };\n    }\n    return {\n      startState: function () {\n        return {tokenize: tokenBase};\n      },\n      token: function (stream, state) {\n        return state.tokenize(stream, state);\n      }\n    };\n  });\n\n  CodeMirror.defineMode(\"tornado\", function(config) {\n    var htmlBase = CodeMirror.getMode(config, \"text/html\");\n    var tornadoInner = CodeMirror.getMode(config, \"tornado:inner\");\n    return CodeMirror.overlayMode(htmlBase, tornadoInner);\n  });\n\n  CodeMirror.defineMIME(\"text/x-tornado\", \"tornado\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/troff/troff.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\")\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd)\n    define([\"../../lib/codemirror\"], mod);\n  else\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('troff', function() {\n\n  var words = {};\n\n  function tokenBase(stream) {\n    if (stream.eatSpace()) return null;\n\n    var sol = stream.sol();\n    var ch = stream.next();\n\n    if (ch === '\\\\') {\n      if (stream.match('fB') || stream.match('fR') || stream.match('fI') ||\n          stream.match('u')  || stream.match('d')  ||\n          stream.match('%')  || stream.match('&')) {\n        return 'string';\n      }\n      if (stream.match('m[')) {\n        stream.skipTo(']');\n        stream.next();\n        return 'string';\n      }\n      if (stream.match('s+') || stream.match('s-')) {\n        stream.eatWhile(/[\\d-]/);\n        return 'string';\n      }\n      if (stream.match('\\(') || stream.match('*\\(')) {\n        stream.eatWhile(/[\\w-]/);\n        return 'string';\n      }\n      return 'string';\n    }\n    if (sol && (ch === '.' || ch === '\\'')) {\n      if (stream.eat('\\\\') && stream.eat('\\\"')) {\n        stream.skipToEnd();\n        return 'comment';\n      }\n    }\n    if (sol && ch === '.') {\n      if (stream.match('B ') || stream.match('I ') || stream.match('R ')) {\n        return 'attribute';\n      }\n      if (stream.match('TH ') || stream.match('SH ') || stream.match('SS ') || stream.match('HP ')) {\n        stream.skipToEnd();\n        return 'quote';\n      }\n      if ((stream.match(/[A-Z]/) && stream.match(/[A-Z]/)) || (stream.match(/[a-z]/) && stream.match(/[a-z]/))) {\n        return 'attribute';\n      }\n    }\n    stream.eatWhile(/[\\w-]/);\n    var cur = stream.current();\n    return words.hasOwnProperty(cur) ? words[cur] : null;\n  }\n\n  function tokenize(stream, state) {\n    return (state.tokens[0] || tokenBase) (stream, state);\n  };\n\n  return {\n    startState: function() {return {tokens:[]};},\n    token: function(stream, state) {\n      return tokenize(stream, state);\n    }\n  };\n});\n\nCodeMirror.defineMIME('text/troff', 'troff');\nCodeMirror.defineMIME('text/x-troff', 'troff');\nCodeMirror.defineMIME('application/x-troff', 'troff');\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/ttcn/ttcn.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"ttcn\", function(config, parserConfig) {\n    var indentUnit = config.indentUnit,\n        keywords = parserConfig.keywords || {},\n        builtin = parserConfig.builtin || {},\n        timerOps = parserConfig.timerOps || {},\n        portOps  = parserConfig.portOps || {},\n        configOps = parserConfig.configOps || {},\n        verdictOps = parserConfig.verdictOps || {},\n        sutOps = parserConfig.sutOps || {},\n        functionOps = parserConfig.functionOps || {},\n\n        verdictConsts = parserConfig.verdictConsts || {},\n        booleanConsts = parserConfig.booleanConsts || {},\n        otherConsts   = parserConfig.otherConsts || {},\n\n        types = parserConfig.types || {},\n        visibilityModifiers = parserConfig.visibilityModifiers || {},\n        templateMatch = parserConfig.templateMatch || {},\n        multiLineStrings = parserConfig.multiLineStrings,\n        indentStatements = parserConfig.indentStatements !== false;\n    var isOperatorChar = /[+\\-*&@=<>!\\/]/;\n    var curPunc;\n\n    function tokenBase(stream, state) {\n      var ch = stream.next();\n\n      if (ch == '\"' || ch == \"'\") {\n        state.tokenize = tokenString(ch);\n        return state.tokenize(stream, state);\n      }\n      if (/[\\[\\]{}\\(\\),;\\\\:\\?\\.]/.test(ch)) {\n        curPunc = ch;\n        return \"punctuation\";\n      }\n      if (ch == \"#\"){\n        stream.skipToEnd();\n        return \"atom preprocessor\";\n      }\n      if (ch == \"%\"){\n        stream.eatWhile(/\\b/);\n        return \"atom ttcn3Macros\";\n      }\n      if (/\\d/.test(ch)) {\n        stream.eatWhile(/[\\w\\.]/);\n        return \"number\";\n      }\n      if (ch == \"/\") {\n        if (stream.eat(\"*\")) {\n          state.tokenize = tokenComment;\n          return tokenComment(stream, state);\n        }\n        if (stream.eat(\"/\")) {\n          stream.skipToEnd();\n          return \"comment\";\n        }\n      }\n      if (isOperatorChar.test(ch)) {\n        if(ch == \"@\"){\n          if(stream.match(\"try\") || stream.match(\"catch\")\n              || stream.match(\"lazy\")){\n            return \"keyword\";\n          }\n        }\n        stream.eatWhile(isOperatorChar);\n        return \"operator\";\n      }\n      stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n      var cur = stream.current();\n\n      if (keywords.propertyIsEnumerable(cur)) return \"keyword\";\n      if (builtin.propertyIsEnumerable(cur)) return \"builtin\";\n\n      if (timerOps.propertyIsEnumerable(cur)) return \"def timerOps\";\n      if (configOps.propertyIsEnumerable(cur)) return \"def configOps\";\n      if (verdictOps.propertyIsEnumerable(cur)) return \"def verdictOps\";\n      if (portOps.propertyIsEnumerable(cur)) return \"def portOps\";\n      if (sutOps.propertyIsEnumerable(cur)) return \"def sutOps\";\n      if (functionOps.propertyIsEnumerable(cur)) return \"def functionOps\";\n\n      if (verdictConsts.propertyIsEnumerable(cur)) return \"string verdictConsts\";\n      if (booleanConsts.propertyIsEnumerable(cur)) return \"string booleanConsts\";\n      if (otherConsts.propertyIsEnumerable(cur)) return \"string otherConsts\";\n\n      if (types.propertyIsEnumerable(cur)) return \"builtin types\";\n      if (visibilityModifiers.propertyIsEnumerable(cur))\n        return \"builtin visibilityModifiers\";\n      if (templateMatch.propertyIsEnumerable(cur)) return \"atom templateMatch\";\n\n      return \"variable\";\n    }\n\n    function tokenString(quote) {\n      return function(stream, state) {\n        var escaped = false, next, end = false;\n        while ((next = stream.next()) != null) {\n          if (next == quote && !escaped){\n            var afterQuote = stream.peek();\n            //look if the character after the quote is like the B in '10100010'B\n            if (afterQuote){\n              afterQuote = afterQuote.toLowerCase();\n              if(afterQuote == \"b\" || afterQuote == \"h\" || afterQuote == \"o\")\n                stream.next();\n            }\n            end = true; break;\n          }\n          escaped = !escaped && next == \"\\\\\";\n        }\n        if (end || !(escaped || multiLineStrings))\n          state.tokenize = null;\n        return \"string\";\n      };\n    }\n\n    function tokenComment(stream, state) {\n      var maybeEnd = false, ch;\n      while (ch = stream.next()) {\n        if (ch == \"/\" && maybeEnd) {\n          state.tokenize = null;\n          break;\n        }\n        maybeEnd = (ch == \"*\");\n      }\n      return \"comment\";\n    }\n\n    function Context(indented, column, type, align, prev) {\n      this.indented = indented;\n      this.column = column;\n      this.type = type;\n      this.align = align;\n      this.prev = prev;\n    }\n\n    function pushContext(state, col, type) {\n      var indent = state.indented;\n      if (state.context && state.context.type == \"statement\")\n        indent = state.context.indented;\n      return state.context = new Context(indent, col, type, null, state.context);\n    }\n\n    function popContext(state) {\n      var t = state.context.type;\n      if (t == \")\" || t == \"]\" || t == \"}\")\n        state.indented = state.context.indented;\n      return state.context = state.context.prev;\n    }\n\n    //Interface\n    return {\n      startState: function(basecolumn) {\n        return {\n          tokenize: null,\n          context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n          indented: 0,\n          startOfLine: true\n        };\n      },\n\n      token: function(stream, state) {\n        var ctx = state.context;\n        if (stream.sol()) {\n          if (ctx.align == null) ctx.align = false;\n          state.indented = stream.indentation();\n          state.startOfLine = true;\n        }\n        if (stream.eatSpace()) return null;\n        curPunc = null;\n        var style = (state.tokenize || tokenBase)(stream, state);\n        if (style == \"comment\") return style;\n        if (ctx.align == null) ctx.align = true;\n\n        if ((curPunc == \";\" || curPunc == \":\" || curPunc == \",\")\n            && ctx.type == \"statement\"){\n          popContext(state);\n        }\n        else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n        else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n        else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n        else if (curPunc == \"}\") {\n          while (ctx.type == \"statement\") ctx = popContext(state);\n          if (ctx.type == \"}\") ctx = popContext(state);\n          while (ctx.type == \"statement\") ctx = popContext(state);\n        }\n        else if (curPunc == ctx.type) popContext(state);\n        else if (indentStatements &&\n            (((ctx.type == \"}\" || ctx.type == \"top\") && curPunc != ';') ||\n            (ctx.type == \"statement\" && curPunc == \"newstatement\")))\n          pushContext(state, stream.column(), \"statement\");\n\n        state.startOfLine = false;\n\n        return style;\n      },\n\n      electricChars: \"{}\",\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      lineComment: \"//\",\n      fold: \"brace\"\n    };\n  });\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  function def(mimes, mode) {\n    if (typeof mimes == \"string\") mimes = [mimes];\n    var words = [];\n    function add(obj) {\n      if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))\n        words.push(prop);\n    }\n\n    add(mode.keywords);\n    add(mode.builtin);\n    add(mode.timerOps);\n    add(mode.portOps);\n\n    if (words.length) {\n      mode.helperType = mimes[0];\n      CodeMirror.registerHelper(\"hintWords\", mimes[0], words);\n    }\n\n    for (var i = 0; i < mimes.length; ++i)\n      CodeMirror.defineMIME(mimes[i], mode);\n  }\n\n  def([\"text/x-ttcn\", \"text/x-ttcn3\", \"text/x-ttcnpp\"], {\n    name: \"ttcn\",\n    keywords: words(\"activate address alive all alt altstep and and4b any\" +\n    \" break case component const continue control deactivate\" +\n    \" display do else encode enumerated except exception\" +\n    \" execute extends extension external for from function\" +\n    \" goto group if import in infinity inout interleave\" +\n    \" label language length log match message mixed mod\" +\n    \" modifies module modulepar mtc noblock not not4b nowait\" +\n    \" of on optional or or4b out override param pattern port\" +\n    \" procedure record recursive rem repeat return runs select\" +\n    \" self sender set signature system template testcase to\" +\n    \" type union value valueof var variant while with xor xor4b\"),\n    builtin: words(\"bit2hex bit2int bit2oct bit2str char2int char2oct encvalue\" +\n    \" decomp decvalue float2int float2str hex2bit hex2int\" +\n    \" hex2oct hex2str int2bit int2char int2float int2hex\" +\n    \" int2oct int2str int2unichar isbound ischosen ispresent\" +\n    \" isvalue lengthof log2str oct2bit oct2char oct2hex oct2int\" +\n    \" oct2str regexp replace rnd sizeof str2bit str2float\" +\n    \" str2hex str2int str2oct substr unichar2int unichar2char\" +\n    \" enum2int\"),\n    types: words(\"anytype bitstring boolean char charstring default float\" +\n    \" hexstring integer objid octetstring universal verdicttype timer\"),\n    timerOps: words(\"read running start stop timeout\"),\n    portOps: words(\"call catch check clear getcall getreply halt raise receive\" +\n    \" reply send trigger\"),\n    configOps: words(\"create connect disconnect done kill killed map unmap\"),\n    verdictOps: words(\"getverdict setverdict\"),\n    sutOps: words(\"action\"),\n    functionOps: words(\"apply derefers refers\"),\n\n    verdictConsts: words(\"error fail inconc none pass\"),\n    booleanConsts: words(\"true false\"),\n    otherConsts: words(\"null NULL omit\"),\n\n    visibilityModifiers: words(\"private public friend\"),\n    templateMatch: words(\"complement ifpresent subset superset permutation\"),\n    multiLineStrings: true\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/ttcn-cfg/ttcn-cfg.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"ttcn-cfg\", function(config, parserConfig) {\n    var indentUnit = config.indentUnit,\n        keywords = parserConfig.keywords || {},\n        fileNCtrlMaskOptions = parserConfig.fileNCtrlMaskOptions || {},\n        externalCommands = parserConfig.externalCommands || {},\n        multiLineStrings = parserConfig.multiLineStrings,\n        indentStatements = parserConfig.indentStatements !== false;\n    var isOperatorChar = /[\\|]/;\n    var curPunc;\n\n    function tokenBase(stream, state) {\n      var ch = stream.next();\n      if (ch == '\"' || ch == \"'\") {\n        state.tokenize = tokenString(ch);\n        return state.tokenize(stream, state);\n      }\n      if (/[:=]/.test(ch)) {\n        curPunc = ch;\n        return \"punctuation\";\n      }\n      if (ch == \"#\"){\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      if (/\\d/.test(ch)) {\n        stream.eatWhile(/[\\w\\.]/);\n        return \"number\";\n      }\n      if (isOperatorChar.test(ch)) {\n        stream.eatWhile(isOperatorChar);\n        return \"operator\";\n      }\n      if (ch == \"[\"){\n        stream.eatWhile(/[\\w_\\]]/);\n        return \"number sectionTitle\";\n      }\n\n      stream.eatWhile(/[\\w\\$_]/);\n      var cur = stream.current();\n      if (keywords.propertyIsEnumerable(cur)) return \"keyword\";\n      if (fileNCtrlMaskOptions.propertyIsEnumerable(cur))\n        return \"negative fileNCtrlMaskOptions\";\n      if (externalCommands.propertyIsEnumerable(cur)) return \"negative externalCommands\";\n\n      return \"variable\";\n    }\n\n    function tokenString(quote) {\n      return function(stream, state) {\n        var escaped = false, next, end = false;\n        while ((next = stream.next()) != null) {\n          if (next == quote && !escaped){\n            var afterNext = stream.peek();\n            //look if the character if the quote is like the B in '10100010'B\n            if (afterNext){\n              afterNext = afterNext.toLowerCase();\n              if(afterNext == \"b\" || afterNext == \"h\" || afterNext == \"o\")\n                stream.next();\n            }\n            end = true; break;\n          }\n          escaped = !escaped && next == \"\\\\\";\n        }\n        if (end || !(escaped || multiLineStrings))\n          state.tokenize = null;\n        return \"string\";\n      };\n    }\n\n    function Context(indented, column, type, align, prev) {\n      this.indented = indented;\n      this.column = column;\n      this.type = type;\n      this.align = align;\n      this.prev = prev;\n    }\n    function pushContext(state, col, type) {\n      var indent = state.indented;\n      if (state.context && state.context.type == \"statement\")\n        indent = state.context.indented;\n      return state.context = new Context(indent, col, type, null, state.context);\n    }\n    function popContext(state) {\n      var t = state.context.type;\n      if (t == \")\" || t == \"]\" || t == \"}\")\n        state.indented = state.context.indented;\n      return state.context = state.context.prev;\n    }\n\n    //Interface\n    return {\n      startState: function(basecolumn) {\n        return {\n          tokenize: null,\n          context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n          indented: 0,\n          startOfLine: true\n        };\n      },\n\n      token: function(stream, state) {\n        var ctx = state.context;\n        if (stream.sol()) {\n          if (ctx.align == null) ctx.align = false;\n          state.indented = stream.indentation();\n          state.startOfLine = true;\n        }\n        if (stream.eatSpace()) return null;\n        curPunc = null;\n        var style = (state.tokenize || tokenBase)(stream, state);\n        if (style == \"comment\") return style;\n        if (ctx.align == null) ctx.align = true;\n\n        if ((curPunc == \";\" || curPunc == \":\" || curPunc == \",\")\n            && ctx.type == \"statement\"){\n          popContext(state);\n        }\n        else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n        else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n        else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n        else if (curPunc == \"}\") {\n          while (ctx.type == \"statement\") ctx = popContext(state);\n          if (ctx.type == \"}\") ctx = popContext(state);\n          while (ctx.type == \"statement\") ctx = popContext(state);\n        }\n        else if (curPunc == ctx.type) popContext(state);\n        else if (indentStatements && (((ctx.type == \"}\" || ctx.type == \"top\")\n            && curPunc != ';') || (ctx.type == \"statement\"\n            && curPunc == \"newstatement\")))\n          pushContext(state, stream.column(), \"statement\");\n        state.startOfLine = false;\n        return style;\n      },\n\n      electricChars: \"{}\",\n      lineComment: \"#\",\n      fold: \"brace\"\n    };\n  });\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i)\n      obj[words[i]] = true;\n    return obj;\n  }\n\n  CodeMirror.defineMIME(\"text/x-ttcn-cfg\", {\n    name: \"ttcn-cfg\",\n    keywords: words(\"Yes No LogFile FileMask ConsoleMask AppendFile\" +\n    \" TimeStampFormat LogEventTypes SourceInfoFormat\" +\n    \" LogEntityName LogSourceInfo DiskFullAction\" +\n    \" LogFileNumber LogFileSize MatchingHints Detailed\" +\n    \" Compact SubCategories Stack Single None Seconds\" +\n    \" DateTime Time Stop Error Retry Delete TCPPort KillTimer\" +\n    \" NumHCs UnixSocketsEnabled LocalAddress\"),\n    fileNCtrlMaskOptions: words(\"TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING\" +\n    \" TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP\" +\n    \" TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION\" +\n    \" TTCN_USER TTCN_FUNCTION TTCN_STATISTICS\" +\n    \" TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG\" +\n    \" EXECUTOR ERROR WARNING PORTEVENT TIMEROP\" +\n    \" VERDICTOP DEFAULTOP TESTCASE ACTION USER\" +\n    \" FUNCTION STATISTICS PARALLEL MATCHING DEBUG\" +\n    \" LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED\" +\n    \" DEBUG_ENCDEC DEBUG_TESTPORT\" +\n    \" DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE\" +\n    \" DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT\" +\n    \" DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED\" +\n    \" EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA\" +\n    \" EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS\" +\n    \" EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED\" +\n    \" FUNCTION_RND FUNCTION_UNQUALIFIED\" +\n    \" MATCHING_DONE MATCHING_MCSUCCESS\" +\n    \" MATCHING_MCUNSUCC MATCHING_MMSUCCESS\" +\n    \" MATCHING_MMUNSUCC MATCHING_PCSUCCESS\" +\n    \" MATCHING_PCUNSUCC MATCHING_PMSUCCESS\" +\n    \" MATCHING_PMUNSUCC MATCHING_PROBLEM\" +\n    \" MATCHING_TIMEOUT MATCHING_UNQUALIFIED\" +\n    \" PARALLEL_PORTCONN PARALLEL_PORTMAP\" +\n    \" PARALLEL_PTC PARALLEL_UNQUALIFIED\" +\n    \" PORTEVENT_DUALRECV PORTEVENT_DUALSEND\" +\n    \" PORTEVENT_MCRECV PORTEVENT_MCSEND\" +\n    \" PORTEVENT_MMRECV PORTEVENT_MMSEND\" +\n    \" PORTEVENT_MQUEUE PORTEVENT_PCIN\" +\n    \" PORTEVENT_PCOUT PORTEVENT_PMIN\" +\n    \" PORTEVENT_PMOUT PORTEVENT_PQUEUE\" +\n    \" PORTEVENT_STATE PORTEVENT_UNQUALIFIED\" +\n    \" STATISTICS_UNQUALIFIED STATISTICS_VERDICT\" +\n    \" TESTCASE_FINISH TESTCASE_START\" +\n    \" TESTCASE_UNQUALIFIED TIMEROP_GUARD\" +\n    \" TIMEROP_READ TIMEROP_START TIMEROP_STOP\" +\n    \" TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED\" +\n    \" USER_UNQUALIFIED VERDICTOP_FINAL\" +\n    \" VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT\" +\n    \" VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED\"),\n    externalCommands: words(\"BeginControlPart EndControlPart BeginTestCase\" +\n    \" EndTestCase\"),\n    multiLineStrings: true\n  });\n});"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/turtle/turtle.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"turtle\", function(config) {\n  var indentUnit = config.indentUnit;\n  var curPunc;\n\n  function wordRegexp(words) {\n    return new RegExp(\"^(?:\" + words.join(\"|\") + \")$\", \"i\");\n  }\n  var ops = wordRegexp([]);\n  var keywords = wordRegexp([\"@prefix\", \"@base\", \"a\"]);\n  var operatorChars = /[*+\\-<>=&|]/;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    curPunc = null;\n    if (ch == \"<\" && !stream.match(/^[\\s\\u00a0=]/, false)) {\n      stream.match(/^[^\\s\\u00a0>]*>?/);\n      return \"atom\";\n    }\n    else if (ch == \"\\\"\" || ch == \"'\") {\n      state.tokenize = tokenLiteral(ch);\n      return state.tokenize(stream, state);\n    }\n    else if (/[{}\\(\\),\\.;\\[\\]]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    else if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    else if (operatorChars.test(ch)) {\n      stream.eatWhile(operatorChars);\n      return null;\n    }\n    else if (ch == \":\") {\n          return \"operator\";\n        } else {\n      stream.eatWhile(/[_\\w\\d]/);\n      if(stream.peek() == \":\") {\n        return \"variable-3\";\n      } else {\n             var word = stream.current();\n\n             if(keywords.test(word)) {\n                        return \"meta\";\n             }\n\n             if(ch >= \"A\" && ch <= \"Z\") {\n                    return \"comment\";\n                 } else {\n                        return \"keyword\";\n                 }\n      }\n      var word = stream.current();\n      if (ops.test(word))\n        return null;\n      else if (keywords.test(word))\n        return \"meta\";\n      else\n        return \"variable\";\n    }\n  }\n\n  function tokenLiteral(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      return \"string\";\n    };\n  }\n\n  function pushContext(state, type, col) {\n    state.context = {prev: state.context, indent: state.indent, col: col, type: type};\n  }\n  function popContext(state) {\n    state.indent = state.context.indent;\n    state.context = state.context.prev;\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: tokenBase,\n              context: null,\n              indent: 0,\n              col: 0};\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (state.context && state.context.align == null) state.context.align = false;\n        state.indent = stream.indentation();\n      }\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n\n      if (style != \"comment\" && state.context && state.context.align == null && state.context.type != \"pattern\") {\n        state.context.align = true;\n      }\n\n      if (curPunc == \"(\") pushContext(state, \")\", stream.column());\n      else if (curPunc == \"[\") pushContext(state, \"]\", stream.column());\n      else if (curPunc == \"{\") pushContext(state, \"}\", stream.column());\n      else if (/[\\]\\}\\)]/.test(curPunc)) {\n        while (state.context && state.context.type == \"pattern\") popContext(state);\n        if (state.context && curPunc == state.context.type) popContext(state);\n      }\n      else if (curPunc == \".\" && state.context && state.context.type == \"pattern\") popContext(state);\n      else if (/atom|string|variable/.test(style) && state.context) {\n        if (/[\\}\\]]/.test(state.context.type))\n          pushContext(state, \"pattern\", stream.column());\n        else if (state.context.type == \"pattern\" && !state.context.align) {\n          state.context.align = true;\n          state.context.col = stream.column();\n        }\n      }\n\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var firstChar = textAfter && textAfter.charAt(0);\n      var context = state.context;\n      if (/[\\]\\}]/.test(firstChar))\n        while (context && context.type == \"pattern\") context = context.prev;\n\n      var closing = context && firstChar == context.type;\n      if (!context)\n        return 0;\n      else if (context.type == \"pattern\")\n        return context.col;\n      else if (context.align)\n        return context.col + (closing ? 0 : 1);\n      else\n        return context.indent + (closing ? 0 : indentUnit);\n    },\n\n    lineComment: \"#\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/turtle\", \"turtle\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/twig/twig.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"),  require(\"../../addon/mode/multiplex\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/multiplex\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"twig:inner\", function() {\n    var keywords = [\"and\", \"as\", \"autoescape\", \"endautoescape\", \"block\", \"do\", \"endblock\", \"else\", \"elseif\", \"extends\", \"for\", \"endfor\", \"embed\", \"endembed\", \"filter\", \"endfilter\", \"flush\", \"from\", \"if\", \"endif\", \"in\", \"is\", \"include\", \"import\", \"not\", \"or\", \"set\", \"spaceless\", \"endspaceless\", \"with\", \"endwith\", \"trans\", \"endtrans\", \"blocktrans\", \"endblocktrans\", \"macro\", \"endmacro\", \"use\", \"verbatim\", \"endverbatim\"],\n        operator = /^[+\\-*&%=<>!?|~^]/,\n        sign = /^[:\\[\\(\\{]/,\n        atom = [\"true\", \"false\", \"null\", \"empty\", \"defined\", \"divisibleby\", \"divisible by\", \"even\", \"odd\", \"iterable\", \"sameas\", \"same as\"],\n        number = /^(\\d[+\\-\\*\\/])?\\d+(\\.\\d+)?/;\n\n    keywords = new RegExp(\"((\" + keywords.join(\")|(\") + \"))\\\\b\");\n    atom = new RegExp(\"((\" + atom.join(\")|(\") + \"))\\\\b\");\n\n    function tokenBase (stream, state) {\n      var ch = stream.peek();\n\n      //Comment\n      if (state.incomment) {\n        if (!stream.skipTo(\"#}\")) {\n          stream.skipToEnd();\n        } else {\n          stream.eatWhile(/\\#|}/);\n          state.incomment = false;\n        }\n        return \"comment\";\n      //Tag\n      } else if (state.intag) {\n        //After operator\n        if (state.operator) {\n          state.operator = false;\n          if (stream.match(atom)) {\n            return \"atom\";\n          }\n          if (stream.match(number)) {\n            return \"number\";\n          }\n        }\n        //After sign\n        if (state.sign) {\n          state.sign = false;\n          if (stream.match(atom)) {\n            return \"atom\";\n          }\n          if (stream.match(number)) {\n            return \"number\";\n          }\n        }\n\n        if (state.instring) {\n          if (ch == state.instring) {\n            state.instring = false;\n          }\n          stream.next();\n          return \"string\";\n        } else if (ch == \"'\" || ch == '\"') {\n          state.instring = ch;\n          stream.next();\n          return \"string\";\n        } else if (stream.match(state.intag + \"}\") || stream.eat(\"-\") && stream.match(state.intag + \"}\")) {\n          state.intag = false;\n          return \"tag\";\n        } else if (stream.match(operator)) {\n          state.operator = true;\n          return \"operator\";\n        } else if (stream.match(sign)) {\n          state.sign = true;\n        } else {\n          if (stream.eat(\" \") || stream.sol()) {\n            if (stream.match(keywords)) {\n              return \"keyword\";\n            }\n            if (stream.match(atom)) {\n              return \"atom\";\n            }\n            if (stream.match(number)) {\n              return \"number\";\n            }\n            if (stream.sol()) {\n              stream.next();\n            }\n          } else {\n            stream.next();\n          }\n\n        }\n        return \"variable\";\n      } else if (stream.eat(\"{\")) {\n        if (stream.eat(\"#\")) {\n          state.incomment = true;\n          if (!stream.skipTo(\"#}\")) {\n            stream.skipToEnd();\n          } else {\n            stream.eatWhile(/\\#|}/);\n            state.incomment = false;\n          }\n          return \"comment\";\n        //Open tag\n        } else if (ch = stream.eat(/\\{|%/)) {\n          //Cache close tag\n          state.intag = ch;\n          if (ch == \"{\") {\n            state.intag = \"}\";\n          }\n          stream.eat(\"-\");\n          return \"tag\";\n        }\n      }\n      stream.next();\n    };\n\n    return {\n      startState: function () {\n        return {};\n      },\n      token: function (stream, state) {\n        return tokenBase(stream, state);\n      }\n    };\n  });\n\n  CodeMirror.defineMode(\"twig\", function(config, parserConfig) {\n    var twigInner = CodeMirror.getMode(config, \"twig:inner\");\n    if (!parserConfig || !parserConfig.base) return twigInner;\n    return CodeMirror.multiplexingMode(\n      CodeMirror.getMode(config, parserConfig.base), {\n        open: /\\{[{#%]/, close: /[}#%]\\}/, mode: twigInner, parseDelimiters: true\n      }\n    );\n  });\n  CodeMirror.defineMIME(\"text/x-twig\", \"twig\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/vb/vb.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"vb\", function(conf, parserConf) {\n    var ERRORCLASS = 'error';\n\n    function wordRegexp(words) {\n        return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\", \"i\");\n    }\n\n    var singleOperators = new RegExp(\"^[\\\\+\\\\-\\\\*/%&\\\\\\\\|\\\\^~<>!]\");\n    var singleDelimiters = new RegExp('^[\\\\(\\\\)\\\\[\\\\]\\\\{\\\\}@,:`=;\\\\.]');\n    var doubleOperators = new RegExp(\"^((==)|(<>)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\\\*\\\\*))\");\n    var doubleDelimiters = new RegExp(\"^((\\\\+=)|(\\\\-=)|(\\\\*=)|(%=)|(/=)|(&=)|(\\\\|=)|(\\\\^=))\");\n    var tripleDelimiters = new RegExp(\"^((//=)|(>>=)|(<<=)|(\\\\*\\\\*=))\");\n    var identifiers = new RegExp(\"^[_A-Za-z][_A-Za-z0-9]*\");\n\n    var openingKeywords = ['class','module', 'sub','enum','select','while','if','function', 'get','set','property', 'try', 'structure', 'synclock', 'using', 'with'];\n    var middleKeywords = ['else','elseif','case', 'catch', 'finally'];\n    var endKeywords = ['next','loop'];\n\n    var operatorKeywords = ['and', \"andalso\", 'or', 'orelse', 'xor', 'in', 'not', 'is', 'isnot', 'like'];\n    var wordOperators = wordRegexp(operatorKeywords);\n\n    var commonKeywords = [\"#const\", \"#else\", \"#elseif\", \"#end\", \"#if\", \"#region\", \"addhandler\", \"addressof\", \"alias\", \"as\", \"byref\", \"byval\", \"cbool\", \"cbyte\", \"cchar\", \"cdate\", \"cdbl\", \"cdec\", \"cint\", \"clng\", \"cobj\", \"compare\", \"const\", \"continue\", \"csbyte\", \"cshort\", \"csng\", \"cstr\", \"cuint\", \"culng\", \"cushort\", \"declare\", \"default\", \"delegate\", \"dim\", \"directcast\", \"each\", \"erase\", \"error\", \"event\", \"exit\", \"explicit\", \"false\", \"for\", \"friend\", \"gettype\", \"goto\", \"handles\", \"implements\", \"imports\", \"infer\", \"inherits\", \"interface\", \"isfalse\", \"istrue\", \"lib\", \"me\", \"mod\", \"mustinherit\", \"mustoverride\", \"my\", \"mybase\", \"myclass\", \"namespace\", \"narrowing\", \"new\", \"nothing\", \"notinheritable\", \"notoverridable\", \"of\", \"off\", \"on\", \"operator\", \"option\", \"optional\", \"out\", \"overloads\", \"overridable\", \"overrides\", \"paramarray\", \"partial\", \"private\", \"protected\", \"public\", \"raiseevent\", \"readonly\", \"redim\", \"removehandler\", \"resume\", \"return\", \"shadows\", \"shared\", \"static\", \"step\", \"stop\", \"strict\", \"then\", \"throw\", \"to\", \"true\", \"trycast\", \"typeof\", \"until\", \"until\", \"when\", \"widening\", \"withevents\", \"writeonly\"];\n\n    var commontypes = ['object', 'boolean', 'char', 'string', 'byte', 'sbyte', 'short', 'ushort', 'int16', 'uint16', 'integer', 'uinteger', 'int32', 'uint32', 'long', 'ulong', 'int64', 'uint64', 'decimal', 'single', 'double', 'float', 'date', 'datetime', 'intptr', 'uintptr'];\n\n    var keywords = wordRegexp(commonKeywords);\n    var types = wordRegexp(commontypes);\n    var stringPrefixes = '\"';\n\n    var opening = wordRegexp(openingKeywords);\n    var middle = wordRegexp(middleKeywords);\n    var closing = wordRegexp(endKeywords);\n    var doubleClosing = wordRegexp(['end']);\n    var doOpening = wordRegexp(['do']);\n\n    var indentInfo = null;\n\n    CodeMirror.registerHelper(\"hintWords\", \"vb\", openingKeywords.concat(middleKeywords).concat(endKeywords)\n                                .concat(operatorKeywords).concat(commonKeywords).concat(commontypes));\n\n    function indent(_stream, state) {\n      state.currentIndent++;\n    }\n\n    function dedent(_stream, state) {\n      state.currentIndent--;\n    }\n    // tokenizers\n    function tokenBase(stream, state) {\n        if (stream.eatSpace()) {\n            return null;\n        }\n\n        var ch = stream.peek();\n\n        // Handle Comments\n        if (ch === \"'\") {\n            stream.skipToEnd();\n            return 'comment';\n        }\n\n\n        // Handle Number Literals\n        if (stream.match(/^((&H)|(&O))?[0-9\\.a-f]/i, false)) {\n            var floatLiteral = false;\n            // Floats\n            if (stream.match(/^\\d*\\.\\d+F?/i)) { floatLiteral = true; }\n            else if (stream.match(/^\\d+\\.\\d*F?/)) { floatLiteral = true; }\n            else if (stream.match(/^\\.\\d+F?/)) { floatLiteral = true; }\n\n            if (floatLiteral) {\n                // Float literals may be \"imaginary\"\n                stream.eat(/J/i);\n                return 'number';\n            }\n            // Integers\n            var intLiteral = false;\n            // Hex\n            if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; }\n            // Octal\n            else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; }\n            // Decimal\n            else if (stream.match(/^[1-9]\\d*F?/)) {\n                // Decimal literals may be \"imaginary\"\n                stream.eat(/J/i);\n                // TODO - Can you have imaginary longs?\n                intLiteral = true;\n            }\n            // Zero by itself with no other piece of number.\n            else if (stream.match(/^0(?![\\dx])/i)) { intLiteral = true; }\n            if (intLiteral) {\n                // Integer literals may be \"long\"\n                stream.eat(/L/i);\n                return 'number';\n            }\n        }\n\n        // Handle Strings\n        if (stream.match(stringPrefixes)) {\n            state.tokenize = tokenStringFactory(stream.current());\n            return state.tokenize(stream, state);\n        }\n\n        // Handle operators and Delimiters\n        if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) {\n            return null;\n        }\n        if (stream.match(doubleOperators)\n            || stream.match(singleOperators)\n            || stream.match(wordOperators)) {\n            return 'operator';\n        }\n        if (stream.match(singleDelimiters)) {\n            return null;\n        }\n        if (stream.match(doOpening)) {\n            indent(stream,state);\n            state.doInCurrentLine = true;\n            return 'keyword';\n        }\n        if (stream.match(opening)) {\n            if (! state.doInCurrentLine)\n              indent(stream,state);\n            else\n              state.doInCurrentLine = false;\n            return 'keyword';\n        }\n        if (stream.match(middle)) {\n            return 'keyword';\n        }\n\n        if (stream.match(doubleClosing)) {\n            dedent(stream,state);\n            dedent(stream,state);\n            return 'keyword';\n        }\n        if (stream.match(closing)) {\n            dedent(stream,state);\n            return 'keyword';\n        }\n\n        if (stream.match(types)) {\n            return 'keyword';\n        }\n\n        if (stream.match(keywords)) {\n            return 'keyword';\n        }\n\n        if (stream.match(identifiers)) {\n            return 'variable';\n        }\n\n        // Handle non-detected items\n        stream.next();\n        return ERRORCLASS;\n    }\n\n    function tokenStringFactory(delimiter) {\n        var singleline = delimiter.length == 1;\n        var OUTCLASS = 'string';\n\n        return function(stream, state) {\n            while (!stream.eol()) {\n                stream.eatWhile(/[^'\"]/);\n                if (stream.match(delimiter)) {\n                    state.tokenize = tokenBase;\n                    return OUTCLASS;\n                } else {\n                    stream.eat(/['\"]/);\n                }\n            }\n            if (singleline) {\n                if (parserConf.singleLineStringErrors) {\n                    return ERRORCLASS;\n                } else {\n                    state.tokenize = tokenBase;\n                }\n            }\n            return OUTCLASS;\n        };\n    }\n\n\n    function tokenLexer(stream, state) {\n        var style = state.tokenize(stream, state);\n        var current = stream.current();\n\n        // Handle '.' connected identifiers\n        if (current === '.') {\n            style = state.tokenize(stream, state);\n            if (style === 'variable') {\n                return 'variable';\n            } else {\n                return ERRORCLASS;\n            }\n        }\n\n\n        var delimiter_index = '[({'.indexOf(current);\n        if (delimiter_index !== -1) {\n            indent(stream, state );\n        }\n        if (indentInfo === 'dedent') {\n            if (dedent(stream, state)) {\n                return ERRORCLASS;\n            }\n        }\n        delimiter_index = '])}'.indexOf(current);\n        if (delimiter_index !== -1) {\n            if (dedent(stream, state)) {\n                return ERRORCLASS;\n            }\n        }\n\n        return style;\n    }\n\n    var external = {\n        electricChars:\"dDpPtTfFeE \",\n        startState: function() {\n            return {\n              tokenize: tokenBase,\n              lastToken: null,\n              currentIndent: 0,\n              nextLineIndent: 0,\n              doInCurrentLine: false\n\n\n          };\n        },\n\n        token: function(stream, state) {\n            if (stream.sol()) {\n              state.currentIndent += state.nextLineIndent;\n              state.nextLineIndent = 0;\n              state.doInCurrentLine = 0;\n            }\n            var style = tokenLexer(stream, state);\n\n            state.lastToken = {style:style, content: stream.current()};\n\n\n\n            return style;\n        },\n\n        indent: function(state, textAfter) {\n            var trueText = textAfter.replace(/^\\s+|\\s+$/g, '') ;\n            if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1);\n            if(state.currentIndent < 0) return 0;\n            return state.currentIndent * conf.indentUnit;\n        },\n\n        lineComment: \"'\"\n    };\n    return external;\n});\n\nCodeMirror.defineMIME(\"text/x-vb\", \"vb\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/vbscript/vbscript.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\nFor extra ASP classic objects, initialize CodeMirror instance with this option:\n    isASP: true\n\nE.G.:\n    var editor = CodeMirror.fromTextArea(document.getElementById(\"code\"), {\n        lineNumbers: true,\n        isASP: true\n      });\n*/\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"vbscript\", function(conf, parserConf) {\n    var ERRORCLASS = 'error';\n\n    function wordRegexp(words) {\n        return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\", \"i\");\n    }\n\n    var singleOperators = new RegExp(\"^[\\\\+\\\\-\\\\*/&\\\\\\\\\\\\^<>=]\");\n    var doubleOperators = new RegExp(\"^((<>)|(<=)|(>=))\");\n    var singleDelimiters = new RegExp('^[\\\\.,]');\n    var brackets = new RegExp('^[\\\\(\\\\)]');\n    var identifiers = new RegExp(\"^[A-Za-z][_A-Za-z0-9]*\");\n\n    var openingKeywords = ['class','sub','select','while','if','function', 'property', 'with', 'for'];\n    var middleKeywords = ['else','elseif','case'];\n    var endKeywords = ['next','loop','wend'];\n\n    var wordOperators = wordRegexp(['and', 'or', 'not', 'xor', 'is', 'mod', 'eqv', 'imp']);\n    var commonkeywords = ['dim', 'redim', 'then',  'until', 'randomize',\n                          'byval','byref','new','property', 'exit', 'in',\n                          'const','private', 'public',\n                          'get','set','let', 'stop', 'on error resume next', 'on error goto 0', 'option explicit', 'call', 'me'];\n\n    //This list was from: http://msdn.microsoft.com/en-us/library/f8tbc79x(v=vs.84).aspx\n    var atomWords = ['true', 'false', 'nothing', 'empty', 'null'];\n    //This list was from: http://msdn.microsoft.com/en-us/library/3ca8tfek(v=vs.84).aspx\n    var builtinFuncsWords = ['abs', 'array', 'asc', 'atn', 'cbool', 'cbyte', 'ccur', 'cdate', 'cdbl', 'chr', 'cint', 'clng', 'cos', 'csng', 'cstr', 'date', 'dateadd', 'datediff', 'datepart',\n                        'dateserial', 'datevalue', 'day', 'escape', 'eval', 'execute', 'exp', 'filter', 'formatcurrency', 'formatdatetime', 'formatnumber', 'formatpercent', 'getlocale', 'getobject',\n                        'getref', 'hex', 'hour', 'inputbox', 'instr', 'instrrev', 'int', 'fix', 'isarray', 'isdate', 'isempty', 'isnull', 'isnumeric', 'isobject', 'join', 'lbound', 'lcase', 'left',\n                        'len', 'loadpicture', 'log', 'ltrim', 'rtrim', 'trim', 'maths', 'mid', 'minute', 'month', 'monthname', 'msgbox', 'now', 'oct', 'replace', 'rgb', 'right', 'rnd', 'round',\n                        'scriptengine', 'scriptenginebuildversion', 'scriptenginemajorversion', 'scriptengineminorversion', 'second', 'setlocale', 'sgn', 'sin', 'space', 'split', 'sqr', 'strcomp',\n                        'string', 'strreverse', 'tan', 'time', 'timer', 'timeserial', 'timevalue', 'typename', 'ubound', 'ucase', 'unescape', 'vartype', 'weekday', 'weekdayname', 'year'];\n\n    //This list was from: http://msdn.microsoft.com/en-us/library/ydz4cfk3(v=vs.84).aspx\n    var builtinConsts = ['vbBlack', 'vbRed', 'vbGreen', 'vbYellow', 'vbBlue', 'vbMagenta', 'vbCyan', 'vbWhite', 'vbBinaryCompare', 'vbTextCompare',\n                         'vbSunday', 'vbMonday', 'vbTuesday', 'vbWednesday', 'vbThursday', 'vbFriday', 'vbSaturday', 'vbUseSystemDayOfWeek', 'vbFirstJan1', 'vbFirstFourDays', 'vbFirstFullWeek',\n                         'vbGeneralDate', 'vbLongDate', 'vbShortDate', 'vbLongTime', 'vbShortTime', 'vbObjectError',\n                         'vbOKOnly', 'vbOKCancel', 'vbAbortRetryIgnore', 'vbYesNoCancel', 'vbYesNo', 'vbRetryCancel', 'vbCritical', 'vbQuestion', 'vbExclamation', 'vbInformation', 'vbDefaultButton1', 'vbDefaultButton2',\n                         'vbDefaultButton3', 'vbDefaultButton4', 'vbApplicationModal', 'vbSystemModal', 'vbOK', 'vbCancel', 'vbAbort', 'vbRetry', 'vbIgnore', 'vbYes', 'vbNo',\n                         'vbCr', 'VbCrLf', 'vbFormFeed', 'vbLf', 'vbNewLine', 'vbNullChar', 'vbNullString', 'vbTab', 'vbVerticalTab', 'vbUseDefault', 'vbTrue', 'vbFalse',\n                         'vbEmpty', 'vbNull', 'vbInteger', 'vbLong', 'vbSingle', 'vbDouble', 'vbCurrency', 'vbDate', 'vbString', 'vbObject', 'vbError', 'vbBoolean', 'vbVariant', 'vbDataObject', 'vbDecimal', 'vbByte', 'vbArray'];\n    //This list was from: http://msdn.microsoft.com/en-us/library/hkc375ea(v=vs.84).aspx\n    var builtinObjsWords = ['WScript', 'err', 'debug', 'RegExp'];\n    var knownProperties = ['description', 'firstindex', 'global', 'helpcontext', 'helpfile', 'ignorecase', 'length', 'number', 'pattern', 'source', 'value', 'count'];\n    var knownMethods = ['clear', 'execute', 'raise', 'replace', 'test', 'write', 'writeline', 'close', 'open', 'state', 'eof', 'update', 'addnew', 'end', 'createobject', 'quit'];\n\n    var aspBuiltinObjsWords = ['server', 'response', 'request', 'session', 'application'];\n    var aspKnownProperties = ['buffer', 'cachecontrol', 'charset', 'contenttype', 'expires', 'expiresabsolute', 'isclientconnected', 'pics', 'status', //response\n                              'clientcertificate', 'cookies', 'form', 'querystring', 'servervariables', 'totalbytes', //request\n                              'contents', 'staticobjects', //application\n                              'codepage', 'lcid', 'sessionid', 'timeout', //session\n                              'scripttimeout']; //server\n    var aspKnownMethods = ['addheader', 'appendtolog', 'binarywrite', 'end', 'flush', 'redirect', //response\n                           'binaryread', //request\n                           'remove', 'removeall', 'lock', 'unlock', //application\n                           'abandon', //session\n                           'getlasterror', 'htmlencode', 'mappath', 'transfer', 'urlencode']; //server\n\n    var knownWords = knownMethods.concat(knownProperties);\n\n    builtinObjsWords = builtinObjsWords.concat(builtinConsts);\n\n    if (conf.isASP){\n        builtinObjsWords = builtinObjsWords.concat(aspBuiltinObjsWords);\n        knownWords = knownWords.concat(aspKnownMethods, aspKnownProperties);\n    };\n\n    var keywords = wordRegexp(commonkeywords);\n    var atoms = wordRegexp(atomWords);\n    var builtinFuncs = wordRegexp(builtinFuncsWords);\n    var builtinObjs = wordRegexp(builtinObjsWords);\n    var known = wordRegexp(knownWords);\n    var stringPrefixes = '\"';\n\n    var opening = wordRegexp(openingKeywords);\n    var middle = wordRegexp(middleKeywords);\n    var closing = wordRegexp(endKeywords);\n    var doubleClosing = wordRegexp(['end']);\n    var doOpening = wordRegexp(['do']);\n    var noIndentWords = wordRegexp(['on error resume next', 'exit']);\n    var comment = wordRegexp(['rem']);\n\n\n    function indent(_stream, state) {\n      state.currentIndent++;\n    }\n\n    function dedent(_stream, state) {\n      state.currentIndent--;\n    }\n    // tokenizers\n    function tokenBase(stream, state) {\n        if (stream.eatSpace()) {\n            return 'space';\n            //return null;\n        }\n\n        var ch = stream.peek();\n\n        // Handle Comments\n        if (ch === \"'\") {\n            stream.skipToEnd();\n            return 'comment';\n        }\n        if (stream.match(comment)){\n            stream.skipToEnd();\n            return 'comment';\n        }\n\n\n        // Handle Number Literals\n        if (stream.match(/^((&H)|(&O))?[0-9\\.]/i, false) && !stream.match(/^((&H)|(&O))?[0-9\\.]+[a-z_]/i, false)) {\n            var floatLiteral = false;\n            // Floats\n            if (stream.match(/^\\d*\\.\\d+/i)) { floatLiteral = true; }\n            else if (stream.match(/^\\d+\\.\\d*/)) { floatLiteral = true; }\n            else if (stream.match(/^\\.\\d+/)) { floatLiteral = true; }\n\n            if (floatLiteral) {\n                // Float literals may be \"imaginary\"\n                stream.eat(/J/i);\n                return 'number';\n            }\n            // Integers\n            var intLiteral = false;\n            // Hex\n            if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; }\n            // Octal\n            else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; }\n            // Decimal\n            else if (stream.match(/^[1-9]\\d*F?/)) {\n                // Decimal literals may be \"imaginary\"\n                stream.eat(/J/i);\n                // TODO - Can you have imaginary longs?\n                intLiteral = true;\n            }\n            // Zero by itself with no other piece of number.\n            else if (stream.match(/^0(?![\\dx])/i)) { intLiteral = true; }\n            if (intLiteral) {\n                // Integer literals may be \"long\"\n                stream.eat(/L/i);\n                return 'number';\n            }\n        }\n\n        // Handle Strings\n        if (stream.match(stringPrefixes)) {\n            state.tokenize = tokenStringFactory(stream.current());\n            return state.tokenize(stream, state);\n        }\n\n        // Handle operators and Delimiters\n        if (stream.match(doubleOperators)\n            || stream.match(singleOperators)\n            || stream.match(wordOperators)) {\n            return 'operator';\n        }\n        if (stream.match(singleDelimiters)) {\n            return null;\n        }\n\n        if (stream.match(brackets)) {\n            return \"bracket\";\n        }\n\n        if (stream.match(noIndentWords)) {\n            state.doInCurrentLine = true;\n\n            return 'keyword';\n        }\n\n        if (stream.match(doOpening)) {\n            indent(stream,state);\n            state.doInCurrentLine = true;\n\n            return 'keyword';\n        }\n        if (stream.match(opening)) {\n            if (! state.doInCurrentLine)\n              indent(stream,state);\n            else\n              state.doInCurrentLine = false;\n\n            return 'keyword';\n        }\n        if (stream.match(middle)) {\n            return 'keyword';\n        }\n\n\n        if (stream.match(doubleClosing)) {\n            dedent(stream,state);\n            dedent(stream,state);\n\n            return 'keyword';\n        }\n        if (stream.match(closing)) {\n            if (! state.doInCurrentLine)\n              dedent(stream,state);\n            else\n              state.doInCurrentLine = false;\n\n            return 'keyword';\n        }\n\n        if (stream.match(keywords)) {\n            return 'keyword';\n        }\n\n        if (stream.match(atoms)) {\n            return 'atom';\n        }\n\n        if (stream.match(known)) {\n            return 'variable-2';\n        }\n\n        if (stream.match(builtinFuncs)) {\n            return 'builtin';\n        }\n\n        if (stream.match(builtinObjs)){\n            return 'variable-2';\n        }\n\n        if (stream.match(identifiers)) {\n            return 'variable';\n        }\n\n        // Handle non-detected items\n        stream.next();\n        return ERRORCLASS;\n    }\n\n    function tokenStringFactory(delimiter) {\n        var singleline = delimiter.length == 1;\n        var OUTCLASS = 'string';\n\n        return function(stream, state) {\n            while (!stream.eol()) {\n                stream.eatWhile(/[^'\"]/);\n                if (stream.match(delimiter)) {\n                    state.tokenize = tokenBase;\n                    return OUTCLASS;\n                } else {\n                    stream.eat(/['\"]/);\n                }\n            }\n            if (singleline) {\n                if (parserConf.singleLineStringErrors) {\n                    return ERRORCLASS;\n                } else {\n                    state.tokenize = tokenBase;\n                }\n            }\n            return OUTCLASS;\n        };\n    }\n\n\n    function tokenLexer(stream, state) {\n        var style = state.tokenize(stream, state);\n        var current = stream.current();\n\n        // Handle '.' connected identifiers\n        if (current === '.') {\n            style = state.tokenize(stream, state);\n\n            current = stream.current();\n            if (style && (style.substr(0, 8) === 'variable' || style==='builtin' || style==='keyword')){//|| knownWords.indexOf(current.substring(1)) > -1) {\n                if (style === 'builtin' || style === 'keyword') style='variable';\n                if (knownWords.indexOf(current.substr(1)) > -1) style='variable-2';\n\n                return style;\n            } else {\n                return ERRORCLASS;\n            }\n        }\n\n        return style;\n    }\n\n    var external = {\n        electricChars:\"dDpPtTfFeE \",\n        startState: function() {\n            return {\n              tokenize: tokenBase,\n              lastToken: null,\n              currentIndent: 0,\n              nextLineIndent: 0,\n              doInCurrentLine: false,\n              ignoreKeyword: false\n\n\n          };\n        },\n\n        token: function(stream, state) {\n            if (stream.sol()) {\n              state.currentIndent += state.nextLineIndent;\n              state.nextLineIndent = 0;\n              state.doInCurrentLine = 0;\n            }\n            var style = tokenLexer(stream, state);\n\n            state.lastToken = {style:style, content: stream.current()};\n\n            if (style==='space') style=null;\n\n            return style;\n        },\n\n        indent: function(state, textAfter) {\n            var trueText = textAfter.replace(/^\\s+|\\s+$/g, '') ;\n            if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1);\n            if(state.currentIndent < 0) return 0;\n            return state.currentIndent * conf.indentUnit;\n        }\n\n    };\n    return external;\n});\n\nCodeMirror.defineMIME(\"text/vbscript\", \"vbscript\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/velocity/velocity.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"velocity\", function() {\n    function parseWords(str) {\n        var obj = {}, words = str.split(\" \");\n        for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n        return obj;\n    }\n\n    var keywords = parseWords(\"#end #else #break #stop #[[ #]] \" +\n                              \"#{end} #{else} #{break} #{stop}\");\n    var functions = parseWords(\"#if #elseif #foreach #set #include #parse #macro #define #evaluate \" +\n                               \"#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}\");\n    var specials = parseWords(\"$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent\");\n    var isOperatorChar = /[+\\-*&%=<>!?:\\/|]/;\n\n    function chain(stream, state, f) {\n        state.tokenize = f;\n        return f(stream, state);\n    }\n    function tokenBase(stream, state) {\n        var beforeParams = state.beforeParams;\n        state.beforeParams = false;\n        var ch = stream.next();\n        // start of unparsed string?\n        if ((ch == \"'\") && !state.inString && state.inParams) {\n            state.lastTokenWasBuiltin = false;\n            return chain(stream, state, tokenString(ch));\n        }\n        // start of parsed string?\n        else if ((ch == '\"')) {\n            state.lastTokenWasBuiltin = false;\n            if (state.inString) {\n                state.inString = false;\n                return \"string\";\n            }\n            else if (state.inParams)\n                return chain(stream, state, tokenString(ch));\n        }\n        // is it one of the special signs []{}().,;? Separator?\n        else if (/[\\[\\]{}\\(\\),;\\.]/.test(ch)) {\n            if (ch == \"(\" && beforeParams)\n                state.inParams = true;\n            else if (ch == \")\") {\n                state.inParams = false;\n                state.lastTokenWasBuiltin = true;\n            }\n            return null;\n        }\n        // start of a number value?\n        else if (/\\d/.test(ch)) {\n            state.lastTokenWasBuiltin = false;\n            stream.eatWhile(/[\\w\\.]/);\n            return \"number\";\n        }\n        // multi line comment?\n        else if (ch == \"#\" && stream.eat(\"*\")) {\n            state.lastTokenWasBuiltin = false;\n            return chain(stream, state, tokenComment);\n        }\n        // unparsed content?\n        else if (ch == \"#\" && stream.match(/ *\\[ *\\[/)) {\n            state.lastTokenWasBuiltin = false;\n            return chain(stream, state, tokenUnparsed);\n        }\n        // single line comment?\n        else if (ch == \"#\" && stream.eat(\"#\")) {\n            state.lastTokenWasBuiltin = false;\n            stream.skipToEnd();\n            return \"comment\";\n        }\n        // variable?\n        else if (ch == \"$\") {\n            stream.eat(\"!\");\n            stream.eatWhile(/[\\w\\d\\$_\\.{}-]/);\n            // is it one of the specials?\n            if (specials && specials.propertyIsEnumerable(stream.current())) {\n                return \"keyword\";\n            }\n            else {\n                state.lastTokenWasBuiltin = true;\n                state.beforeParams = true;\n                return \"builtin\";\n            }\n        }\n        // is it a operator?\n        else if (isOperatorChar.test(ch)) {\n            state.lastTokenWasBuiltin = false;\n            stream.eatWhile(isOperatorChar);\n            return \"operator\";\n        }\n        else {\n            // get the whole word\n            stream.eatWhile(/[\\w\\$_{}@]/);\n            var word = stream.current();\n            // is it one of the listed keywords?\n            if (keywords && keywords.propertyIsEnumerable(word))\n                return \"keyword\";\n            // is it one of the listed functions?\n            if (functions && functions.propertyIsEnumerable(word) ||\n                    (stream.current().match(/^#@?[a-z0-9_]+ *$/i) && stream.peek()==\"(\") &&\n                     !(functions && functions.propertyIsEnumerable(word.toLowerCase()))) {\n                state.beforeParams = true;\n                state.lastTokenWasBuiltin = false;\n                return \"keyword\";\n            }\n            if (state.inString) {\n                state.lastTokenWasBuiltin = false;\n                return \"string\";\n            }\n            if (stream.pos > word.length && stream.string.charAt(stream.pos-word.length-1)==\".\" && state.lastTokenWasBuiltin)\n                return \"builtin\";\n            // default: just a \"word\"\n            state.lastTokenWasBuiltin = false;\n            return null;\n        }\n    }\n\n    function tokenString(quote) {\n        return function(stream, state) {\n            var escaped = false, next, end = false;\n            while ((next = stream.next()) != null) {\n                if ((next == quote) && !escaped) {\n                    end = true;\n                    break;\n                }\n                if (quote=='\"' && stream.peek() == '$' && !escaped) {\n                    state.inString = true;\n                    end = true;\n                    break;\n                }\n                escaped = !escaped && next == \"\\\\\";\n            }\n            if (end) state.tokenize = tokenBase;\n            return \"string\";\n        };\n    }\n\n    function tokenComment(stream, state) {\n        var maybeEnd = false, ch;\n        while (ch = stream.next()) {\n            if (ch == \"#\" && maybeEnd) {\n                state.tokenize = tokenBase;\n                break;\n            }\n            maybeEnd = (ch == \"*\");\n        }\n        return \"comment\";\n    }\n\n    function tokenUnparsed(stream, state) {\n        var maybeEnd = 0, ch;\n        while (ch = stream.next()) {\n            if (ch == \"#\" && maybeEnd == 2) {\n                state.tokenize = tokenBase;\n                break;\n            }\n            if (ch == \"]\")\n                maybeEnd++;\n            else if (ch != \" \")\n                maybeEnd = 0;\n        }\n        return \"meta\";\n    }\n    // Interface\n\n    return {\n        startState: function() {\n            return {\n                tokenize: tokenBase,\n                beforeParams: false,\n                inParams: false,\n                inString: false,\n                lastTokenWasBuiltin: false\n            };\n        },\n\n        token: function(stream, state) {\n            if (stream.eatSpace()) return null;\n            return state.tokenize(stream, state);\n        },\n        blockCommentStart: \"#*\",\n        blockCommentEnd: \"*#\",\n        lineComment: \"##\",\n        fold: \"velocity\"\n    };\n});\n\nCodeMirror.defineMIME(\"text/velocity\", \"velocity\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/verilog/verilog.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"verilog\", function(config, parserConfig) {\n\n  var indentUnit = config.indentUnit,\n      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,\n      dontAlignCalls = parserConfig.dontAlignCalls,\n      // compilerDirectivesUseRegularIndentation - If set, Compiler directive\n      // indentation follows the same rules as everything else. Otherwise if\n      // false, compiler directives will track their own indentation.\n      // For example, `ifdef nested inside another `ifndef will be indented,\n      // but a `ifdef inside a function block may not be indented.\n      compilerDirectivesUseRegularIndentation = parserConfig.compilerDirectivesUseRegularIndentation,\n      noIndentKeywords = parserConfig.noIndentKeywords || [],\n      multiLineStrings = parserConfig.multiLineStrings,\n      hooks = parserConfig.hooks || {};\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  /**\n   * Keywords from IEEE 1800-2012\n   */\n  var keywords = words(\n    \"accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind \" +\n    \"bins binsof bit break buf bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config \" +\n    \"const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable \" +\n    \"dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup \" +\n    \"endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask \" +\n    \"enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin \" +\n    \"function generate genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import \" +\n    \"incdir include initial inout input inside instance int integer interconnect interface intersect join join_any \" +\n    \"join_none large let liblist library local localparam logic longint macromodule matches medium modport module \" +\n    \"nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 null or output package packed \" +\n    \"parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup \" +\n    \"pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg \" +\n    \"reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime \" +\n    \"s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify \" +\n    \"specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on \" +\n    \"table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior \" +\n    \"trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void \" +\n    \"wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor\");\n\n  /** Operators from IEEE 1800-2012\n     unary_operator ::=\n       + | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~\n     binary_operator ::=\n       + | - | * | / | % | == | != | === | !== | ==? | !=? | && | || | **\n       | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<<\n       | -> | <->\n     inc_or_dec_operator ::= ++ | --\n     unary_module_path_operator ::=\n       ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~\n     binary_module_path_operator ::=\n       == | != | && | || | & | | | ^ | ^~ | ~^\n  */\n  var isOperatorChar = /[\\+\\-\\*\\/!~&|^%=?:<>]/;\n  var isBracketChar = /[\\[\\]{}()]/;\n\n  var unsignedNumber = /\\d[0-9_]*/;\n  var decimalLiteral = /\\d*\\s*'s?d\\s*\\d[0-9_]*/i;\n  var binaryLiteral = /\\d*\\s*'s?b\\s*[xz01][xz01_]*/i;\n  var octLiteral = /\\d*\\s*'s?o\\s*[xz0-7][xz0-7_]*/i;\n  var hexLiteral = /\\d*\\s*'s?h\\s*[0-9a-fxz?][0-9a-fxz?_]*/i;\n  var realLiteral = /(\\d[\\d_]*(\\.\\d[\\d_]*)?E-?[\\d_]+)|(\\d[\\d_]*\\.\\d[\\d_]*)/i;\n\n  var closingBracketOrWord = /^((`?\\w+)|[)}\\]])/;\n  var closingBracket = /[)}\\]]/;\n  var compilerDirectiveRegex      = new RegExp(\n    \"^(`(?:ifdef|ifndef|elsif|else|endif|undef|undefineall|define|include|begin_keywords|celldefine|default|\" +\n    \"nettype|end_keywords|endcelldefine|line|nounconnected_drive|pragma|resetall|timescale|unconnected_drive))\\\\b\");\n  var compilerDirectiveBeginRegex = /^(`(?:ifdef|ifndef|elsif|else))\\b/;\n  var compilerDirectiveEndRegex   = /^(`(?:elsif|else|endif))\\b/;\n\n  var curPunc;\n  var curKeyword;\n\n  // Block openings which are closed by a matching keyword in the form of (\"end\" + keyword)\n  // E.g. \"task\" => \"endtask\"\n  var blockKeywords = words(\n    \"case checker class clocking config function generate interface module package \" +\n    \"primitive program property specify sequence table task\"\n  );\n\n  // Opening/closing pairs\n  var openClose = {};\n  for (var keyword in blockKeywords) {\n    openClose[keyword] = \"end\" + keyword;\n  }\n  openClose[\"begin\"] = \"end\";\n  openClose[\"casex\"] = \"endcase\";\n  openClose[\"casez\"] = \"endcase\";\n  openClose[\"do\"   ] = \"while\";\n  openClose[\"fork\" ] = \"join;join_any;join_none\";\n  openClose[\"covergroup\"] = \"endgroup\";\n  openClose[\"macro_begin\"] = \"macro_end\";\n\n  for (var i in noIndentKeywords) {\n    var keyword = noIndentKeywords[i];\n    if (openClose[keyword]) {\n      openClose[keyword] = undefined;\n    }\n  }\n\n  // Keywords which open statements that are ended with a semi-colon\n  var statementKeywords = words(\"always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while extern typedef\");\n\n  function tokenBase(stream, state) {\n    var ch = stream.peek(), style;\n    if (hooks[ch] && (style = hooks[ch](stream, state)) != false) return style;\n    if (hooks.tokenBase && (style = hooks.tokenBase(stream, state)) != false)\n      return style;\n\n    if (/[,;:\\.]/.test(ch)) {\n      curPunc = stream.next();\n      return null;\n    }\n    if (isBracketChar.test(ch)) {\n      curPunc = stream.next();\n      return \"bracket\";\n    }\n    // Macros (tick-defines)\n    if (ch == '`') {\n      stream.next();\n      if (stream.eatWhile(/[\\w\\$_]/)) {\n        var cur = stream.current();\n        curKeyword = cur;\n        // Macros that end in _begin, are start of block and end with _end\n        if (cur.startsWith(\"`uvm_\") && cur.endsWith(\"_begin\")) {\n          var keywordClose = curKeyword.substr(0,curKeyword.length - 5) + \"end\";\n          openClose[cur] = keywordClose;\n          curPunc = \"newblock\";\n        } else {\n          stream.eatSpace();\n          if (stream.peek() == '(') {\n            // Check if this is a block\n            curPunc = \"newmacro\";\n          }\n          var withSpace = stream.current();\n          // Move the stream back before the spaces\n          stream.backUp(withSpace.length - cur.length);\n        }\n        return \"def\";\n      } else {\n        return null;\n      }\n    }\n    // System calls\n    if (ch == '$') {\n      stream.next();\n      if (stream.eatWhile(/[\\w\\$_]/)) {\n        return \"meta\";\n      } else {\n        return null;\n      }\n    }\n    // Time literals\n    if (ch == '#') {\n      stream.next();\n      stream.eatWhile(/[\\d_.]/);\n      return \"def\";\n    }\n    // Event\n    if (ch == '@') {\n      stream.next();\n      stream.eatWhile(/[@]/);\n      return \"def\";\n    }\n    // Strings\n    if (ch == '\"') {\n      stream.next();\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    // Comments\n    if (ch == \"/\") {\n      stream.next();\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      stream.backUp(1);\n    }\n\n    // Numeric literals\n    if (stream.match(realLiteral) ||\n        stream.match(decimalLiteral) ||\n        stream.match(binaryLiteral) ||\n        stream.match(octLiteral) ||\n        stream.match(hexLiteral) ||\n        stream.match(unsignedNumber) ||\n        stream.match(realLiteral)) {\n      return \"number\";\n    }\n\n    // Operators\n    if (stream.eatWhile(isOperatorChar)) {\n      curPunc = stream.current();\n      return \"meta\";\n    }\n\n    // Keywords / plain variables\n    if (stream.eatWhile(/[\\w\\$_]/)) {\n      var cur = stream.current();\n      if (keywords[cur]) {\n        if (openClose[cur]) {\n          curPunc = \"newblock\";\n          if (cur === \"fork\") {\n            // Fork can be a statement instead of block in cases of:\n            // \"disable fork;\" and \"wait fork;\" (trailing semicolon)\n            stream.eatSpace()\n            if (stream.peek() == ';') {\n              curPunc = \"newstatement\";\n            }\n            stream.backUp(stream.current().length - cur.length);\n          }\n        }\n        if (statementKeywords[cur]) {\n          curPunc = \"newstatement\";\n        }\n        curKeyword = cur;\n        return \"keyword\";\n      }\n      return \"variable\";\n    }\n\n    stream.next();\n    return null;\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function Context(indented, column, type, scopekind, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.scopekind = scopekind;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type, scopekind) {\n    var indent = state.indented;\n    var c = new Context(indent, col, type, scopekind ? scopekind : \"\", null, state.context);\n    return state.context = c;\n  }\n  function popContext(state) {\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\") {\n      state.indented = state.context.indented;\n    }\n    return state.context = state.context.prev;\n  }\n\n  function isClosing(text, contextClosing) {\n    if (text == contextClosing) {\n      return true;\n    } else {\n      // contextClosing may be multiple keywords separated by ;\n      var closingKeywords = contextClosing.split(\";\");\n      for (var i in closingKeywords) {\n        if (text == closingKeywords[i]) {\n          return true;\n        }\n      }\n      return false;\n    }\n  }\n\n  function isInsideScopeKind(ctx, scopekind) {\n    if (ctx == null) {\n      return false;\n    }\n    if (ctx.scopekind === scopekind) {\n      return true;\n    }\n    return isInsideScopeKind(ctx.prev, scopekind);\n  }\n\n  function buildElectricInputRegEx() {\n    // Reindentation should occur on any bracket char: {}()[]\n    // or on a match of any of the block closing keywords, at\n    // the end of a line\n    var allClosings = [];\n    for (var i in openClose) {\n      if (openClose[i]) {\n        var closings = openClose[i].split(\";\");\n        for (var j in closings) {\n          allClosings.push(closings[j]);\n        }\n      }\n    }\n    var re = new RegExp(\"[{}()\\\\[\\\\]]|(\" + allClosings.join(\"|\") + \")$\");\n    return re;\n  }\n\n  // Interface\n  return {\n\n    // Regex to force current line to reindent\n    electricInput: buildElectricInputRegEx(),\n\n    startState: function(basecolumn) {\n      var state = {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", \"top\", false),\n        indented: 0,\n        compilerDirectiveIndented: 0,\n        startOfLine: true\n      };\n      if (hooks.startState) hooks.startState(state);\n      return state;\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n      }\n      if (hooks.token) {\n        // Call hook, with an optional return value of a style to override verilog styling.\n        var style = hooks.token(stream, state);\n        if (style !== undefined) {\n          return style;\n        }\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      curKeyword = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\" || style == \"variable\") {\n        if (((curPunc === \"=\") || (curPunc === \"<=\")) && !isInsideScopeKind(ctx, \"assignment\")) {\n          // '<=' could be nonblocking assignment or lessthan-equals (which shouldn't cause indent)\n          //      Search through the context to see if we are already in an assignment.\n          // '=' could be inside port declaration with comma or ')' afterward, or inside for(;;) block.\n          pushContext(state, stream.column() + curPunc.length, \"assignment\", \"assignment\");\n          if (ctx.align == null) ctx.align = true;\n        }\n        return style;\n      }\n      if (ctx.align == null) ctx.align = true;\n\n      var isClosingAssignment = ctx.type == \"assignment\" &&\n        closingBracket.test(curPunc) && ctx.prev && ctx.prev.type === curPunc;\n      if (curPunc == ctx.type || isClosingAssignment) {\n        if (isClosingAssignment) {\n          ctx = popContext(state);\n        }\n        ctx = popContext(state);\n        if (curPunc == \")\") {\n          // Handle closing macros, assuming they could have a semicolon or begin/end block inside.\n          if (ctx && (ctx.type === \"macro\")) {\n            ctx = popContext(state);\n            while (ctx && (ctx.type == \"statement\" || ctx.type == \"assignment\")) ctx = popContext(state);\n          }\n        } else if (curPunc == \"}\") {\n          // Handle closing statements like constraint block: \"foreach () {}\" which\n          // do not have semicolon at end.\n          if (ctx && (ctx.type === \"statement\")) {\n            while (ctx && (ctx.type == \"statement\")) ctx = popContext(state);\n          }\n        }\n      } else if (((curPunc == \";\" || curPunc == \",\") && (ctx.type == \"statement\" || ctx.type == \"assignment\")) ||\n               (ctx.type && isClosing(curKeyword, ctx.type))) {\n        ctx = popContext(state);\n        while (ctx && (ctx.type == \"statement\" || ctx.type == \"assignment\")) ctx = popContext(state);\n      } else if (curPunc == \"{\") {\n        pushContext(state, stream.column(), \"}\");\n      } else if (curPunc == \"[\") {\n        pushContext(state, stream.column(), \"]\");\n      } else if (curPunc == \"(\") {\n        pushContext(state, stream.column(), \")\");\n      } else if (ctx && ctx.type == \"endcase\" && curPunc == \":\") {\n        pushContext(state, stream.column(), \"statement\", \"case\");\n      } else if (curPunc == \"newstatement\") {\n        pushContext(state, stream.column(), \"statement\", curKeyword);\n      } else if (curPunc == \"newblock\") {\n        if (curKeyword == \"function\" && ctx && (ctx.type == \"statement\" || ctx.type == \"endgroup\")) {\n          // The 'function' keyword can appear in some other contexts where it actually does not\n          // indicate a function (import/export DPI and covergroup definitions).\n          // Do nothing in this case\n        } else if (curKeyword == \"task\" && ctx && ctx.type == \"statement\") {\n          // Same thing for task\n        } else if (curKeyword == \"class\" && ctx && ctx.type == \"statement\") {\n          // Same thing for class (e.g. typedef)\n        } else {\n          var close = openClose[curKeyword];\n          pushContext(state, stream.column(), close, curKeyword);\n        }\n      } else if (curPunc == \"newmacro\" || (curKeyword && curKeyword.match(compilerDirectiveRegex))) {\n        if (curPunc == \"newmacro\") {\n          // Macros (especially if they have parenthesis) potentially have a semicolon\n          // or complete statement/block inside, and should be treated as such.\n          pushContext(state, stream.column(), \"macro\", \"macro\");\n        }\n        if (curKeyword.match(compilerDirectiveEndRegex)) {\n          state.compilerDirectiveIndented -= statementIndentUnit;\n        }\n        if (curKeyword.match(compilerDirectiveBeginRegex)) {\n          state.compilerDirectiveIndented += statementIndentUnit;\n        }\n      }\n\n      state.startOfLine = false;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;\n      if (hooks.indent) {\n        var fromHook = hooks.indent(state);\n        if (fromHook >= 0) return fromHook;\n      }\n      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n      if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n      var closing = false;\n      var possibleClosing = textAfter.match(closingBracketOrWord);\n      if (possibleClosing)\n        closing = isClosing(possibleClosing[0], ctx.type);\n      if (!compilerDirectivesUseRegularIndentation && textAfter.match(compilerDirectiveRegex)) {\n        if (textAfter.match(compilerDirectiveEndRegex)) {\n          return state.compilerDirectiveIndented - statementIndentUnit;\n        }\n        return state.compilerDirectiveIndented;\n      }\n      if (ctx.type == \"statement\") return ctx.indented + (firstChar == \"{\" ? 0 : statementIndentUnit);\n      else if ((closingBracket.test(ctx.type) || ctx.type == \"assignment\")\n        && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1);\n      else if (ctx.type == \")\" && !closing) return ctx.indented + statementIndentUnit;\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\",\n    fold: \"indent\"\n  };\n});\n\n  CodeMirror.defineMIME(\"text/x-verilog\", {\n    name: \"verilog\"\n  });\n\n  CodeMirror.defineMIME(\"text/x-systemverilog\", {\n    name: \"verilog\"\n  });\n\n\n\n  // TL-Verilog mode.\n  // See tl-x.org for language spec.\n  // See the mode in action at makerchip.com.\n  // Contact: steve.hoover@redwoodeda.com\n\n  // TLV Identifier prefixes.\n  // Note that sign is not treated separately, so \"+/-\" versions of numeric identifiers\n  // are included.\n  var tlvIdentifierStyle = {\n    \"|\": \"link\",\n    \">\": \"property\",  // Should condition this off for > TLV 1c.\n    \"$\": \"variable\",\n    \"$$\": \"variable\",\n    \"?$\": \"qualifier\",\n    \"?*\": \"qualifier\",\n    \"-\": \"hr\",\n    \"/\": \"property\",\n    \"/-\": \"property\",\n    \"@\": \"variable-3\",\n    \"@-\": \"variable-3\",\n    \"@++\": \"variable-3\",\n    \"@+=\": \"variable-3\",\n    \"@+=-\": \"variable-3\",\n    \"@--\": \"variable-3\",\n    \"@-=\": \"variable-3\",\n    \"%+\": \"tag\",\n    \"%-\": \"tag\",\n    \"%\": \"tag\",\n    \">>\": \"tag\",\n    \"<<\": \"tag\",\n    \"<>\": \"tag\",\n    \"#\": \"tag\",  // Need to choose a style for this.\n    \"^\": \"attribute\",\n    \"^^\": \"attribute\",\n    \"^!\": \"attribute\",\n    \"*\": \"variable-2\",\n    \"**\": \"variable-2\",\n    \"\\\\\": \"keyword\",\n    \"\\\"\": \"comment\"\n  };\n\n  // Lines starting with these characters define scope (result in indentation).\n  var tlvScopePrefixChars = {\n    \"/\": \"beh-hier\",\n    \">\": \"beh-hier\",\n    \"-\": \"phys-hier\",\n    \"|\": \"pipe\",\n    \"?\": \"when\",\n    \"@\": \"stage\",\n    \"\\\\\": \"keyword\"\n  };\n  var tlvIndentUnit = 3;\n  var tlvTrackStatements = false;\n  var tlvIdentMatch = /^([~!@#\\$%\\^&\\*-\\+=\\?\\/\\\\\\|'\"<>]+)([\\d\\w_]*)/;  // Matches an identifier.\n  // Note that ':' is excluded, because of it's use in [:].\n  var tlvFirstLevelIndentMatch = /^[! ]  /;\n  var tlvLineIndentationMatch = /^[! ] */;\n  var tlvCommentMatch = /^\\/[\\/\\*]/;\n\n\n  // Returns a style specific to the scope at the given indentation column.\n  // Type is one of: \"indent\", \"scope-ident\", \"before-scope-ident\".\n  function tlvScopeStyle(state, indentation, type) {\n    // Begin scope.\n    var depth = indentation / tlvIndentUnit;  // TODO: Pass this in instead.\n    return \"tlv-\" + state.tlvIndentationStyle[depth] + \"-\" + type;\n  }\n\n  // Return true if the next thing in the stream is an identifier with a mnemonic.\n  function tlvIdentNext(stream) {\n    var match;\n    return (match = stream.match(tlvIdentMatch, false)) && match[2].length > 0;\n  }\n\n  CodeMirror.defineMIME(\"text/x-tlv\", {\n    name: \"verilog\",\n\n    hooks: {\n\n      electricInput: false,\n\n\n      // Return undefined for verilog tokenizing, or style for TLV token (null not used).\n      // Standard CM styles are used for most formatting, but some TL-Verilog-specific highlighting\n      // can be enabled with the definition of cm-tlv-* styles, including highlighting for:\n      //   - M4 tokens\n      //   - TLV scope indentation\n      //   - Statement delimitation (enabled by tlvTrackStatements)\n      token: function(stream, state) {\n        var style = undefined;\n        var match;  // Return value of pattern matches.\n\n        // Set highlighting mode based on code region (TLV or SV).\n        if (stream.sol() && ! state.tlvInBlockComment) {\n          // Process region.\n          if (stream.peek() == '\\\\') {\n            style = \"def\";\n            stream.skipToEnd();\n            if (stream.string.match(/\\\\SV/)) {\n              state.tlvCodeActive = false;\n            } else if (stream.string.match(/\\\\TLV/)){\n              state.tlvCodeActive = true;\n            }\n          }\n          // Correct indentation in the face of a line prefix char.\n          if (state.tlvCodeActive && stream.pos == 0 &&\n              (state.indented == 0) && (match = stream.match(tlvLineIndentationMatch, false))) {\n            state.indented = match[0].length;\n          }\n\n          // Compute indentation state:\n          //   o Auto indentation on next line\n          //   o Indentation scope styles\n          var indented = state.indented;\n          var depth = indented / tlvIndentUnit;\n          if (depth <= state.tlvIndentationStyle.length) {\n            // not deeper than current scope\n\n            var blankline = stream.string.length == indented;\n            var chPos = depth * tlvIndentUnit;\n            if (chPos < stream.string.length) {\n              var bodyString = stream.string.slice(chPos);\n              var ch = bodyString[0];\n              if (tlvScopePrefixChars[ch] && ((match = bodyString.match(tlvIdentMatch)) &&\n                  tlvIdentifierStyle[match[1]])) {\n                // This line begins scope.\n                // Next line gets indented one level.\n                indented += tlvIndentUnit;\n                // Style the next level of indentation (except non-region keyword identifiers,\n                //   which are statements themselves)\n                if (!(ch == \"\\\\\" && chPos > 0)) {\n                  state.tlvIndentationStyle[depth] = tlvScopePrefixChars[ch];\n                  if (tlvTrackStatements) {state.statementComment = false;}\n                  depth++;\n                }\n              }\n            }\n            // Clear out deeper indentation levels unless line is blank.\n            if (!blankline) {\n              while (state.tlvIndentationStyle.length > depth) {\n                state.tlvIndentationStyle.pop();\n              }\n            }\n          }\n          // Set next level of indentation.\n          state.tlvNextIndent = indented;\n        }\n\n        if (state.tlvCodeActive) {\n          // Highlight as TLV.\n\n          var beginStatement = false;\n          if (tlvTrackStatements) {\n            // This starts a statement if the position is at the scope level\n            // and we're not within a statement leading comment.\n            beginStatement =\n                   (stream.peek() != \" \") &&   // not a space\n                   (style === undefined) &&    // not a region identifier\n                   !state.tlvInBlockComment && // not in block comment\n                   //!stream.match(tlvCommentMatch, false) && // not comment start\n                   (stream.column() == state.tlvIndentationStyle.length * tlvIndentUnit);  // at scope level\n            if (beginStatement) {\n              if (state.statementComment) {\n                // statement already started by comment\n                beginStatement = false;\n              }\n              state.statementComment =\n                   stream.match(tlvCommentMatch, false); // comment start\n            }\n          }\n\n          var match;\n          if (style !== undefined) {\n            // Region line.\n            style += \" \" + tlvScopeStyle(state, 0, \"scope-ident\")\n          } else if (((stream.pos / tlvIndentUnit) < state.tlvIndentationStyle.length) &&\n                     (match = stream.match(stream.sol() ? tlvFirstLevelIndentMatch : /^   /))) {\n            // Indentation\n            style = // make this style distinct from the previous one to prevent\n                    // codemirror from combining spans\n                    \"tlv-indent-\" + (((stream.pos % 2) == 0) ? \"even\" : \"odd\") +\n                    // and style it\n                    \" \" + tlvScopeStyle(state, stream.pos - tlvIndentUnit, \"indent\");\n            // Style the line prefix character.\n            if (match[0].charAt(0) == \"!\") {\n              style += \" tlv-alert-line-prefix\";\n            }\n            // Place a class before a scope identifier.\n            if (tlvIdentNext(stream)) {\n              style += \" \" + tlvScopeStyle(state, stream.pos, \"before-scope-ident\");\n            }\n          } else if (state.tlvInBlockComment) {\n            // In a block comment.\n            if (stream.match(/^.*?\\*\\//)) {\n              // Exit block comment.\n              state.tlvInBlockComment = false;\n              if (tlvTrackStatements && !stream.eol()) {\n                // Anything after comment is assumed to be real statement content.\n                state.statementComment = false;\n              }\n            } else {\n              stream.skipToEnd();\n            }\n            style = \"comment\";\n          } else if ((match = stream.match(tlvCommentMatch)) && !state.tlvInBlockComment) {\n            // Start comment.\n            if (match[0] == \"//\") {\n              // Line comment.\n              stream.skipToEnd();\n            } else {\n              // Block comment.\n              state.tlvInBlockComment = true;\n            }\n            style = \"comment\";\n          } else if (match = stream.match(tlvIdentMatch)) {\n            // looks like an identifier (or identifier prefix)\n            var prefix = match[1];\n            var mnemonic = match[2];\n            if (// is identifier prefix\n                tlvIdentifierStyle.hasOwnProperty(prefix) &&\n                // has mnemonic or we're at the end of the line (maybe it hasn't been typed yet)\n                (mnemonic.length > 0 || stream.eol())) {\n              style = tlvIdentifierStyle[prefix];\n              if (stream.column() == state.indented) {\n                // Begin scope.\n                style += \" \" + tlvScopeStyle(state, stream.column(), \"scope-ident\")\n              }\n            } else {\n              // Just swallow one character and try again.\n              // This enables subsequent identifier match with preceding symbol character, which\n              //   is legal within a statement.  (E.g., !$reset).  It also enables detection of\n              //   comment start with preceding symbols.\n              stream.backUp(stream.current().length - 1);\n              style = \"tlv-default\";\n            }\n          } else if (stream.match(/^\\t+/)) {\n            // Highlight tabs, which are illegal.\n            style = \"tlv-tab\";\n          } else if (stream.match(/^[\\[\\]{}\\(\\);\\:]+/)) {\n            // [:], (), {}, ;.\n            style = \"meta\";\n          } else if (match = stream.match(/^[mM]4([\\+_])?[\\w\\d_]*/)) {\n            // m4 pre proc\n            style = (match[1] == \"+\") ? \"tlv-m4-plus\" : \"tlv-m4\";\n          } else if (stream.match(/^ +/)){\n            // Skip over spaces.\n            if (stream.eol()) {\n              // Trailing spaces.\n              style = \"error\";\n            } else {\n              // Non-trailing spaces.\n              style = \"tlv-default\";\n            }\n          } else if (stream.match(/^[\\w\\d_]+/)) {\n            // alpha-numeric token.\n            style = \"number\";\n          } else {\n            // Eat the next char w/ no formatting.\n            stream.next();\n            style = \"tlv-default\";\n          }\n          if (beginStatement) {\n            style += \" tlv-statement\";\n          }\n        } else {\n          if (stream.match(/^[mM]4([\\w\\d_]*)/)) {\n            // m4 pre proc\n            style = \"tlv-m4\";\n          }\n        }\n        return style;\n      },\n\n      indent: function(state) {\n        return (state.tlvCodeActive == true) ? state.tlvNextIndent : -1;\n      },\n\n      startState: function(state) {\n        state.tlvIndentationStyle = [];  // Styles to use for each level of indentation.\n        state.tlvCodeActive = true;  // True when we're in a TLV region (and at beginning of file).\n        state.tlvNextIndent = -1;    // The number of spaces to autoindent the next line if tlvCodeActive.\n        state.tlvInBlockComment = false;  // True inside /**/ comment.\n        if (tlvTrackStatements) {\n          state.statementComment = false;  // True inside a statement's header comment.\n        }\n      }\n\n    }\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/vhdl/vhdl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Originally written by Alf Nielsen, re-written by Michael Zhou\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction words(str) {\n  var obj = {}, words = str.split(\",\");\n  for (var i = 0; i < words.length; ++i) {\n    var allCaps = words[i].toUpperCase();\n    var firstCap = words[i].charAt(0).toUpperCase() + words[i].slice(1);\n    obj[words[i]] = true;\n    obj[allCaps] = true;\n    obj[firstCap] = true;\n  }\n  return obj;\n}\n\nfunction metaHook(stream) {\n  stream.eatWhile(/[\\w\\$_]/);\n  return \"meta\";\n}\n\nCodeMirror.defineMode(\"vhdl\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit,\n      atoms = parserConfig.atoms || words(\"null\"),\n      hooks = parserConfig.hooks || {\"`\": metaHook, \"$\": metaHook},\n      multiLineStrings = parserConfig.multiLineStrings;\n\n  var keywords = words(\"abs,access,after,alias,all,and,architecture,array,assert,attribute,begin,block,\" +\n      \"body,buffer,bus,case,component,configuration,constant,disconnect,downto,else,elsif,end,end block,end case,\" +\n      \"end component,end for,end generate,end if,end loop,end process,end record,end units,entity,exit,file,for,\" +\n      \"function,generate,generic,generic map,group,guarded,if,impure,in,inertial,inout,is,label,library,linkage,\" +\n      \"literal,loop,map,mod,nand,new,next,nor,null,of,on,open,or,others,out,package,package body,port,port map,\" +\n      \"postponed,procedure,process,pure,range,record,register,reject,rem,report,return,rol,ror,select,severity,signal,\" +\n      \"sla,sll,sra,srl,subtype,then,to,transport,type,unaffected,units,until,use,variable,wait,when,while,with,xnor,xor\");\n\n  var blockKeywords = words(\"architecture,entity,begin,case,port,else,elsif,end,for,function,if\");\n\n  var isOperatorChar = /[&|~><!\\)\\(*#%@+\\/=?\\:;}{,\\.\\^\\-\\[\\]]/;\n  var curPunc;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (hooks[ch]) {\n      var result = hooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n    if (ch == '\"') {\n      state.tokenize = tokenString2(ch);\n      return state.tokenize(stream, state);\n    }\n    if (ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (/[\\d']/.test(ch)) {\n      stream.eatWhile(/[\\w\\.']/);\n      return \"number\";\n    }\n    if (ch == \"-\") {\n      if (stream.eat(\"-\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_]/);\n    var cur = stream.current();\n    if (keywords.propertyIsEnumerable(cur.toLowerCase())) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"keyword\";\n    }\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"--\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n  function tokenString2(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"--\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = tokenBase;\n      return \"string-2\";\n    };\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type) {\n    return state.context = new Context(state.indented, col, type, null, state.context);\n  }\n  function popContext(state) {\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if ((curPunc == \";\" || curPunc == \":\") && ctx.type == \"statement\") popContext(state);\n      else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"}\") {\n        while (ctx.type == \"statement\") ctx = popContext(state);\n        if (ctx.type == \"}\") ctx = popContext(state);\n        while (ctx.type == \"statement\") ctx = popContext(state);\n      }\n      else if (curPunc == ctx.type) popContext(state);\n      else if (ctx.type == \"}\" || ctx.type == \"top\" || (ctx.type == \"statement\" && curPunc == \"newstatement\"))\n        pushContext(state, stream.column(), \"statement\");\n      state.startOfLine = false;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), ctx = state.context, closing = firstChar == ctx.type;\n      if (ctx.type == \"statement\") return ctx.indented + (firstChar == \"{\" ? 0 : indentUnit);\n      else if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"{}\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-vhdl\", \"vhdl\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/vue/vue.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function (mod) {\n  \"use strict\";\n  if (typeof exports === \"object\" && typeof module === \"object\") {// CommonJS\n    mod(require(\"../../lib/codemirror\"),\n        require(\"../../addon/mode/overlay\"),\n        require(\"../xml/xml\"),\n        require(\"../javascript/javascript\"),\n        require(\"../coffeescript/coffeescript\"),\n        require(\"../css/css\"),\n        require(\"../sass/sass\"),\n        require(\"../stylus/stylus\"),\n        require(\"../pug/pug\"),\n        require(\"../handlebars/handlebars\"));\n  } else if (typeof define === \"function\" && define.amd) { // AMD\n    define([\"../../lib/codemirror\",\n            \"../../addon/mode/overlay\",\n            \"../xml/xml\",\n            \"../javascript/javascript\",\n            \"../coffeescript/coffeescript\",\n            \"../css/css\",\n            \"../sass/sass\",\n            \"../stylus/stylus\",\n            \"../pug/pug\",\n            \"../handlebars/handlebars\"], mod);\n  } else { // Plain browser env\n    mod(CodeMirror);\n  }\n})(function (CodeMirror) {\n  var tagLanguages = {\n    script: [\n      [\"lang\", /coffee(script)?/, \"coffeescript\"],\n      [\"type\", /^(?:text|application)\\/(?:x-)?coffee(?:script)?$/, \"coffeescript\"],\n      [\"lang\", /^babel$/, \"javascript\"],\n      [\"type\", /^text\\/babel$/, \"javascript\"],\n      [\"type\", /^text\\/ecmascript-\\d+$/, \"javascript\"]\n    ],\n    style: [\n      [\"lang\", /^stylus$/i, \"stylus\"],\n      [\"lang\", /^sass$/i, \"sass\"],\n      [\"lang\", /^less$/i, \"text/x-less\"],\n      [\"lang\", /^scss$/i, \"text/x-scss\"],\n      [\"type\", /^(text\\/)?(x-)?styl(us)?$/i, \"stylus\"],\n      [\"type\", /^text\\/sass/i, \"sass\"],\n      [\"type\", /^(text\\/)?(x-)?scss$/i, \"text/x-scss\"],\n      [\"type\", /^(text\\/)?(x-)?less$/i, \"text/x-less\"]\n    ],\n    template: [\n      [\"lang\", /^vue-template$/i, \"vue\"],\n      [\"lang\", /^pug$/i, \"pug\"],\n      [\"lang\", /^handlebars$/i, \"handlebars\"],\n      [\"type\", /^(text\\/)?(x-)?pug$/i, \"pug\"],\n      [\"type\", /^text\\/x-handlebars-template$/i, \"handlebars\"],\n      [null, null, \"vue-template\"]\n    ]\n  };\n\n  CodeMirror.defineMode(\"vue-template\", function (config, parserConfig) {\n    var mustacheOverlay = {\n      token: function (stream) {\n        if (stream.match(/^\\{\\{.*?\\}\\}/)) return \"meta mustache\";\n        while (stream.next() && !stream.match(\"{{\", false)) {}\n        return null;\n      }\n    };\n    return CodeMirror.overlayMode(CodeMirror.getMode(config, parserConfig.backdrop || \"text/html\"), mustacheOverlay);\n  });\n\n  CodeMirror.defineMode(\"vue\", function (config) {\n    return CodeMirror.getMode(config, {name: \"htmlmixed\", tags: tagLanguages});\n  }, \"htmlmixed\", \"xml\", \"javascript\", \"coffeescript\", \"css\", \"sass\", \"stylus\", \"pug\", \"handlebars\");\n\n  CodeMirror.defineMIME(\"script/x-vue\", \"vue\");\n  CodeMirror.defineMIME(\"text/x-vue\", \"vue\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/wast/wast.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar kKeywords = [\n    \"align\",\n    \"block\",\n    \"br(_if|_table|_on_(cast|data|func|i31|null))?\",\n    \"call(_indirect|_ref)?\",\n    \"current_memory\",\n    \"\\\\bdata\\\\b\",\n    \"catch(_all)?\",\n    \"delegate\",\n    \"drop\",\n    \"elem\",\n    \"else\",\n    \"end\",\n    \"export\",\n    \"\\\\bextern\\\\b\",\n    \"\\\\bfunc\\\\b\",\n    \"global(\\\\.(get|set))?\",\n    \"if\",\n    \"import\",\n    \"local(\\\\.(get|set|tee))?\",\n    \"loop\",\n    \"module\",\n    \"mut\",\n    \"nop\",\n    \"offset\",\n    \"param\",\n    \"result\",\n    \"rethrow\",\n    \"return(_call(_indirect|_ref)?)?\",\n    \"select\",\n    \"start\",\n    \"table(\\\\.(size|get|set|size|grow|fill|init|copy))?\",\n    \"then\",\n    \"throw\",\n    \"try\",\n    \"type\",\n    \"unreachable\",\n    \"unwind\",\n\n    // Numeric opcodes.\n    \"i(32|64)\\\\.(store(8|16)|(load(8|16)_[su]))\",\n    \"i64\\\\.(load32_[su]|store32)\",\n    \"[fi](32|64)\\\\.(const|load|store)\",\n    \"f(32|64)\\\\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)\",\n    \"i(32|64)\\\\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)\",\n    \"i64\\\\.extend_[su]_i32\",\n    \"i32\\\\.wrap_i64\",\n    \"i(32|64)\\\\.trunc_f(32|64)_[su]\",\n    \"f(32|64)\\\\.convert_i(32|64)_[su]\",\n    \"f64\\\\.promote_f32\",\n    \"f32\\\\.demote_f64\",\n    \"f32\\\\.reinterpret_i32\",\n    \"i32\\\\.reinterpret_f32\",\n    \"f64\\\\.reinterpret_i64\",\n    \"i64\\\\.reinterpret_f64\",\n    // Atomics.\n    \"memory(\\\\.((atomic\\\\.(notify|wait(32|64)))|grow|size))?\",\n    \"i64\\.atomic\\\\.(load32_u|store32|rmw32\\\\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)\",\n    \"i(32|64)\\\\.atomic\\\\.(load((8|16)_u)?|store(8|16)?|rmw(\\\\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\\\\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))\",\n    // SIMD.\n    \"v128\\\\.load(8x8|16x4|32x2)_[su]\",\n    \"v128\\\\.load(8|16|32|64)_splat\",\n    \"v128\\\\.(load|store)(8|16|32|64)_lane\",\n    \"v128\\\\.load(32|64)_zero\",\n    \"v128\\.(load|store|const|not|andnot|and|or|xor|bitselect|any_true)\",\n    \"i(8x16|16x8)\\\\.(extract_lane_[su]|(add|sub)_sat_[su]|avgr_u)\",\n    \"i(8x16|16x8|32x4|64x2)\\\\.(neg|add|sub|abs|shl|shr_[su]|all_true|bitmask|eq|ne|[lg][te]_s)\",\n    \"(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\\.(splat|replace_lane)\",\n    \"i(8x16|16x8|32x4)\\\\.(([lg][te]_u)|((min|max)_[su]))\",\n    \"f(32x4|64x2)\\\\.(neg|add|sub|abs|nearest|eq|ne|[lg][te]|sqrt|mul|div|min|max|ceil|floor|trunc)\",\n    \"[fi](32x4|64x2)\\\\.extract_lane\",\n    \"i8x16\\\\.(shuffle|swizzle|popcnt|narrow_i16x8_[su])\",\n    \"i16x8\\\\.(narrow_i32x4_[su]|mul|extadd_pairwise_i8x16_[su]|q15mulr_sat_s)\",\n    \"i16x8\\\\.(extend|extmul)_(low|high)_i8x16_[su]\",\n    \"i32x4\\\\.(mul|dot_i16x8_s|trunc_sat_f64x2_[su]_zero)\",\n    \"i32x4\\\\.((extend|extmul)_(low|high)_i16x8_|trunc_sat_f32x4_|extadd_pairwise_i16x8_)[su]\",\n    \"i64x2\\\\.(mul|(extend|extmul)_(low|high)_i32x4_[su])\",\n    \"f32x4\\\\.(convert_i32x4_[su]|demote_f64x2_zero)\",\n    \"f64x2\\\\.(promote_low_f32x4|convert_low_i32x4_[su])\",\n    // Reference types, function references, and GC.\n    \"\\\\bany\\\\b\",\n    \"array\\\\.len\",\n    \"(array|struct)(\\\\.(new_(default_)?with_rtt|get(_[su])?|set))?\",\n    \"\\\\beq\\\\b\",\n    \"field\",\n    \"i31\\\\.(new|get_[su])\",\n    \"\\\\bnull\\\\b\",\n    \"ref(\\\\.(([ai]s_(data|func|i31))|cast|eq|func|(is_|as_non_)?null|test))?\",\n    \"rtt(\\\\.(canon|sub))?\",\n];\n\nCodeMirror.defineSimpleMode('wast', {\n  start: [\n    {regex: /[+\\-]?(?:nan(?::0x[0-9a-fA-F]+)?|infinity|inf|0x[0-9a-fA-F]+\\.?[0-9a-fA-F]*p[+\\/-]?\\d+|\\d+(?:\\.\\d*)?[eE][+\\-]?\\d*|\\d+\\.\\d*|0x[0-9a-fA-F]+|\\d+)/, token: \"number\"},\n    {regex: new RegExp(kKeywords.join('|')), token: \"keyword\"},\n    {regex: /\\b((any|data|eq|extern|i31|func)ref|[fi](32|64)|i(8|16))\\b/, token: \"atom\"},\n    {regex: /\\$([a-zA-Z0-9_`\\+\\-\\*\\/\\\\\\^~=<>!\\?@#$%&|:\\.]+)/, token: \"variable-2\"},\n    {regex: /\"(?:[^\"\\\\\\x00-\\x1f\\x7f]|\\\\[nt\\\\'\"]|\\\\[0-9a-fA-F][0-9a-fA-F])*\"/, token: \"string\"},\n    {regex: /\\(;.*?/, token: \"comment\", next: \"comment\"},\n    {regex: /;;.*$/, token: \"comment\"},\n    {regex: /\\(/, indent: true},\n    {regex: /\\)/, dedent: true},\n  ],\n\n  comment: [\n    {regex: /.*?;\\)/, token: \"comment\", next: \"start\"},\n    {regex: /.*/, token: \"comment\"},\n  ],\n\n  meta: {\n    dontIndentStates: ['comment'],\n  },\n});\n\n// https://github.com/WebAssembly/design/issues/981 mentions text/webassembly,\n// which seems like a reasonable choice, although it's not standard right now.\nCodeMirror.defineMIME(\"text/webassembly\", \"wast\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/webidl/webidl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction wordRegexp(words) {\n  return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n};\n\nvar builtinArray = [\n  \"Clamp\",\n  \"Constructor\",\n  \"EnforceRange\",\n  \"Exposed\",\n  \"ImplicitThis\",\n  \"Global\", \"PrimaryGlobal\",\n  \"LegacyArrayClass\",\n  \"LegacyUnenumerableNamedProperties\",\n  \"LenientThis\",\n  \"NamedConstructor\",\n  \"NewObject\",\n  \"NoInterfaceObject\",\n  \"OverrideBuiltins\",\n  \"PutForwards\",\n  \"Replaceable\",\n  \"SameObject\",\n  \"TreatNonObjectAsNull\",\n  \"TreatNullAs\",\n    \"EmptyString\",\n  \"Unforgeable\",\n  \"Unscopeable\"\n];\nvar builtins = wordRegexp(builtinArray);\n\nvar typeArray = [\n  \"unsigned\", \"short\", \"long\",                  // UnsignedIntegerType\n  \"unrestricted\", \"float\", \"double\",            // UnrestrictedFloatType\n  \"boolean\", \"byte\", \"octet\",                   // Rest of PrimitiveType\n  \"Promise\",                                    // PromiseType\n  \"ArrayBuffer\", \"DataView\", \"Int8Array\", \"Int16Array\", \"Int32Array\",\n  \"Uint8Array\", \"Uint16Array\", \"Uint32Array\", \"Uint8ClampedArray\",\n  \"Float32Array\", \"Float64Array\",               // BufferRelatedType\n  \"ByteString\", \"DOMString\", \"USVString\", \"sequence\", \"object\", \"RegExp\",\n  \"Error\", \"DOMException\", \"FrozenArray\",       // Rest of NonAnyType\n  \"any\",                                        // Rest of SingleType\n  \"void\"                                        // Rest of ReturnType\n];\nvar types = wordRegexp(typeArray);\n\nvar keywordArray = [\n  \"attribute\", \"callback\", \"const\", \"deleter\", \"dictionary\", \"enum\", \"getter\",\n  \"implements\", \"inherit\", \"interface\", \"iterable\", \"legacycaller\", \"maplike\",\n  \"partial\", \"required\", \"serializer\", \"setlike\", \"setter\", \"static\",\n  \"stringifier\", \"typedef\",                     // ArgumentNameKeyword except\n                                                // \"unrestricted\"\n  \"optional\", \"readonly\", \"or\"\n];\nvar keywords = wordRegexp(keywordArray);\n\nvar atomArray = [\n  \"true\", \"false\",                              // BooleanLiteral\n  \"Infinity\", \"NaN\",                            // FloatLiteral\n  \"null\"                                        // Rest of ConstValue\n];\nvar atoms = wordRegexp(atomArray);\n\nCodeMirror.registerHelper(\"hintWords\", \"webidl\",\n    builtinArray.concat(typeArray).concat(keywordArray).concat(atomArray));\n\nvar startDefArray = [\"callback\", \"dictionary\", \"enum\", \"interface\"];\nvar startDefs = wordRegexp(startDefArray);\n\nvar endDefArray = [\"typedef\"];\nvar endDefs = wordRegexp(endDefArray);\n\nvar singleOperators = /^[:<=>?]/;\nvar integers = /^-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/;\nvar floats = /^-?(([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/;\nvar identifiers = /^_?[A-Za-z][0-9A-Z_a-z-]*/;\nvar identifiersEnd = /^_?[A-Za-z][0-9A-Z_a-z-]*(?=\\s*;)/;\nvar strings = /^\"[^\"]*\"/;\nvar multilineComments = /^\\/\\*.*?\\*\\//;\nvar multilineCommentsStart = /^\\/\\*.*/;\nvar multilineCommentsEnd = /^.*?\\*\\//;\n\nfunction readToken(stream, state) {\n  // whitespace\n  if (stream.eatSpace()) return null;\n\n  // comment\n  if (state.inComment) {\n    if (stream.match(multilineCommentsEnd)) {\n      state.inComment = false;\n      return \"comment\";\n    }\n    stream.skipToEnd();\n    return \"comment\";\n  }\n  if (stream.match(\"//\")) {\n    stream.skipToEnd();\n    return \"comment\";\n  }\n  if (stream.match(multilineComments)) return \"comment\";\n  if (stream.match(multilineCommentsStart)) {\n    state.inComment = true;\n    return \"comment\";\n  }\n\n  // integer and float\n  if (stream.match(/^-?[0-9\\.]/, false)) {\n    if (stream.match(integers) || stream.match(floats)) return \"number\";\n  }\n\n  // string\n  if (stream.match(strings)) return \"string\";\n\n  // identifier\n  if (state.startDef && stream.match(identifiers)) return \"def\";\n\n  if (state.endDef && stream.match(identifiersEnd)) {\n    state.endDef = false;\n    return \"def\";\n  }\n\n  if (stream.match(keywords)) return \"keyword\";\n\n  if (stream.match(types)) {\n    var lastToken = state.lastToken;\n    var nextToken = (stream.match(/^\\s*(.+?)\\b/, false) || [])[1];\n\n    if (lastToken === \":\" || lastToken === \"implements\" ||\n        nextToken === \"implements\" || nextToken === \"=\") {\n      // Used as identifier\n      return \"builtin\";\n    } else {\n      // Used as type\n      return \"variable-3\";\n    }\n  }\n\n  if (stream.match(builtins)) return \"builtin\";\n  if (stream.match(atoms)) return \"atom\";\n  if (stream.match(identifiers)) return \"variable\";\n\n  // other\n  if (stream.match(singleOperators)) return \"operator\";\n\n  // unrecognized\n  stream.next();\n  return null;\n};\n\nCodeMirror.defineMode(\"webidl\", function() {\n  return {\n    startState: function() {\n      return {\n        // Is in multiline comment\n        inComment: false,\n        // Last non-whitespace, matched token\n        lastToken: \"\",\n        // Next token is a definition\n        startDef: false,\n        // Last token of the statement is a definition\n        endDef: false\n      };\n    },\n    token: function(stream, state) {\n      var style = readToken(stream, state);\n\n      if (style) {\n        var cur = stream.current();\n        state.lastToken = cur;\n        if (style === \"keyword\") {\n          state.startDef = startDefs.test(cur);\n          state.endDef = state.endDef || endDefs.test(cur);\n        } else {\n          state.startDef = false;\n        }\n      }\n\n      return style;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-webidl\", \"webidl\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/xml/xml.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar htmlConfig = {\n  autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,\n                    'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,\n                    'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,\n                    'track': true, 'wbr': true, 'menuitem': true},\n  implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,\n                     'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,\n                     'th': true, 'tr': true},\n  contextGrabbers: {\n    'dd': {'dd': true, 'dt': true},\n    'dt': {'dd': true, 'dt': true},\n    'li': {'li': true},\n    'option': {'option': true, 'optgroup': true},\n    'optgroup': {'optgroup': true},\n    'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,\n          'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,\n          'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,\n          'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,\n          'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},\n    'rp': {'rp': true, 'rt': true},\n    'rt': {'rp': true, 'rt': true},\n    'tbody': {'tbody': true, 'tfoot': true},\n    'td': {'td': true, 'th': true},\n    'tfoot': {'tbody': true},\n    'th': {'td': true, 'th': true},\n    'thead': {'tbody': true, 'tfoot': true},\n    'tr': {'tr': true}\n  },\n  doNotIndent: {\"pre\": true},\n  allowUnquoted: true,\n  allowMissing: true,\n  caseFold: true\n}\n\nvar xmlConfig = {\n  autoSelfClosers: {},\n  implicitlyClosed: {},\n  contextGrabbers: {},\n  doNotIndent: {},\n  allowUnquoted: false,\n  allowMissing: false,\n  allowMissingTagName: false,\n  caseFold: false\n}\n\nCodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n  var indentUnit = editorConf.indentUnit\n  var config = {}\n  var defaults = config_.htmlMode ? htmlConfig : xmlConfig\n  for (var prop in defaults) config[prop] = defaults[prop]\n  for (var prop in config_) config[prop] = config_[prop]\n\n  // Return variables for tokenizers\n  var type, setStyle;\n\n  function inText(stream, state) {\n    function chain(parser) {\n      state.tokenize = parser;\n      return parser(stream, state);\n    }\n\n    var ch = stream.next();\n    if (ch == \"<\") {\n      if (stream.eat(\"!\")) {\n        if (stream.eat(\"[\")) {\n          if (stream.match(\"CDATA[\")) return chain(inBlock(\"atom\", \"]]>\"));\n          else return null;\n        } else if (stream.match(\"--\")) {\n          return chain(inBlock(\"comment\", \"-->\"));\n        } else if (stream.match(\"DOCTYPE\", true, true)) {\n          stream.eatWhile(/[\\w\\._\\-]/);\n          return chain(doctype(1));\n        } else {\n          return null;\n        }\n      } else if (stream.eat(\"?\")) {\n        stream.eatWhile(/[\\w\\._\\-]/);\n        state.tokenize = inBlock(\"meta\", \"?>\");\n        return \"meta\";\n      } else {\n        type = stream.eat(\"/\") ? \"closeTag\" : \"openTag\";\n        state.tokenize = inTag;\n        return \"tag bracket\";\n      }\n    } else if (ch == \"&\") {\n      var ok;\n      if (stream.eat(\"#\")) {\n        if (stream.eat(\"x\")) {\n          ok = stream.eatWhile(/[a-fA-F\\d]/) && stream.eat(\";\");\n        } else {\n          ok = stream.eatWhile(/[\\d]/) && stream.eat(\";\");\n        }\n      } else {\n        ok = stream.eatWhile(/[\\w\\.\\-:]/) && stream.eat(\";\");\n      }\n      return ok ? \"atom\" : \"error\";\n    } else {\n      stream.eatWhile(/[^&<]/);\n      return null;\n    }\n  }\n  inText.isInText = true;\n\n  function inTag(stream, state) {\n    var ch = stream.next();\n    if (ch == \">\" || (ch == \"/\" && stream.eat(\">\"))) {\n      state.tokenize = inText;\n      type = ch == \">\" ? \"endTag\" : \"selfcloseTag\";\n      return \"tag bracket\";\n    } else if (ch == \"=\") {\n      type = \"equals\";\n      return null;\n    } else if (ch == \"<\") {\n      state.tokenize = inText;\n      state.state = baseState;\n      state.tagName = state.tagStart = null;\n      var next = state.tokenize(stream, state);\n      return next ? next + \" tag error\" : \"tag error\";\n    } else if (/[\\'\\\"]/.test(ch)) {\n      state.tokenize = inAttribute(ch);\n      state.stringStartCol = stream.column();\n      return state.tokenize(stream, state);\n    } else {\n      stream.match(/^[^\\s\\u00a0=<>\\\"\\']*[^\\s\\u00a0=<>\\\"\\'\\/]/);\n      return \"word\";\n    }\n  }\n\n  function inAttribute(quote) {\n    var closure = function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.next() == quote) {\n          state.tokenize = inTag;\n          break;\n        }\n      }\n      return \"string\";\n    };\n    closure.isInAttribute = true;\n    return closure;\n  }\n\n  function inBlock(style, terminator) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.match(terminator)) {\n          state.tokenize = inText;\n          break;\n        }\n        stream.next();\n      }\n      return style;\n    }\n  }\n\n  function doctype(depth) {\n    return function(stream, state) {\n      var ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == \"<\") {\n          state.tokenize = doctype(depth + 1);\n          return state.tokenize(stream, state);\n        } else if (ch == \">\") {\n          if (depth == 1) {\n            state.tokenize = inText;\n            break;\n          } else {\n            state.tokenize = doctype(depth - 1);\n            return state.tokenize(stream, state);\n          }\n        }\n      }\n      return \"meta\";\n    };\n  }\n\n  function lower(tagName) {\n    return tagName && tagName.toLowerCase();\n  }\n\n  function Context(state, tagName, startOfLine) {\n    this.prev = state.context;\n    this.tagName = tagName || \"\";\n    this.indent = state.indented;\n    this.startOfLine = startOfLine;\n    if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))\n      this.noIndent = true;\n  }\n  function popContext(state) {\n    if (state.context) state.context = state.context.prev;\n  }\n  function maybePopContext(state, nextTagName) {\n    var parentTagName;\n    while (true) {\n      if (!state.context) {\n        return;\n      }\n      parentTagName = state.context.tagName;\n      if (!config.contextGrabbers.hasOwnProperty(lower(parentTagName)) ||\n          !config.contextGrabbers[lower(parentTagName)].hasOwnProperty(lower(nextTagName))) {\n        return;\n      }\n      popContext(state);\n    }\n  }\n\n  function baseState(type, stream, state) {\n    if (type == \"openTag\") {\n      state.tagStart = stream.column();\n      return tagNameState;\n    } else if (type == \"closeTag\") {\n      return closeTagNameState;\n    } else {\n      return baseState;\n    }\n  }\n  function tagNameState(type, stream, state) {\n    if (type == \"word\") {\n      state.tagName = stream.current();\n      setStyle = \"tag\";\n      return attrState;\n    } else if (config.allowMissingTagName && type == \"endTag\") {\n      setStyle = \"tag bracket\";\n      return attrState(type, stream, state);\n    } else {\n      setStyle = \"error\";\n      return tagNameState;\n    }\n  }\n  function closeTagNameState(type, stream, state) {\n    if (type == \"word\") {\n      var tagName = stream.current();\n      if (state.context && state.context.tagName != tagName &&\n          config.implicitlyClosed.hasOwnProperty(lower(state.context.tagName)))\n        popContext(state);\n      if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {\n        setStyle = \"tag\";\n        return closeState;\n      } else {\n        setStyle = \"tag error\";\n        return closeStateErr;\n      }\n    } else if (config.allowMissingTagName && type == \"endTag\") {\n      setStyle = \"tag bracket\";\n      return closeState(type, stream, state);\n    } else {\n      setStyle = \"error\";\n      return closeStateErr;\n    }\n  }\n\n  function closeState(type, _stream, state) {\n    if (type != \"endTag\") {\n      setStyle = \"error\";\n      return closeState;\n    }\n    popContext(state);\n    return baseState;\n  }\n  function closeStateErr(type, stream, state) {\n    setStyle = \"error\";\n    return closeState(type, stream, state);\n  }\n\n  function attrState(type, _stream, state) {\n    if (type == \"word\") {\n      setStyle = \"attribute\";\n      return attrEqState;\n    } else if (type == \"endTag\" || type == \"selfcloseTag\") {\n      var tagName = state.tagName, tagStart = state.tagStart;\n      state.tagName = state.tagStart = null;\n      if (type == \"selfcloseTag\" ||\n          config.autoSelfClosers.hasOwnProperty(lower(tagName))) {\n        maybePopContext(state, tagName);\n      } else {\n        maybePopContext(state, tagName);\n        state.context = new Context(state, tagName, tagStart == state.indented);\n      }\n      return baseState;\n    }\n    setStyle = \"error\";\n    return attrState;\n  }\n  function attrEqState(type, stream, state) {\n    if (type == \"equals\") return attrValueState;\n    if (!config.allowMissing) setStyle = \"error\";\n    return attrState(type, stream, state);\n  }\n  function attrValueState(type, stream, state) {\n    if (type == \"string\") return attrContinuedState;\n    if (type == \"word\" && config.allowUnquoted) {setStyle = \"string\"; return attrState;}\n    setStyle = \"error\";\n    return attrState(type, stream, state);\n  }\n  function attrContinuedState(type, stream, state) {\n    if (type == \"string\") return attrContinuedState;\n    return attrState(type, stream, state);\n  }\n\n  return {\n    startState: function(baseIndent) {\n      var state = {tokenize: inText,\n                   state: baseState,\n                   indented: baseIndent || 0,\n                   tagName: null, tagStart: null,\n                   context: null}\n      if (baseIndent != null) state.baseIndent = baseIndent\n      return state\n    },\n\n    token: function(stream, state) {\n      if (!state.tagName && stream.sol())\n        state.indented = stream.indentation();\n\n      if (stream.eatSpace()) return null;\n      type = null;\n      var style = state.tokenize(stream, state);\n      if ((style || type) && style != \"comment\") {\n        setStyle = null;\n        state.state = state.state(type || style, stream, state);\n        if (setStyle)\n          style = setStyle == \"error\" ? style + \" error\" : setStyle;\n      }\n      return style;\n    },\n\n    indent: function(state, textAfter, fullLine) {\n      var context = state.context;\n      // Indent multi-line strings (e.g. css).\n      if (state.tokenize.isInAttribute) {\n        if (state.tagStart == state.indented)\n          return state.stringStartCol + 1;\n        else\n          return state.indented + indentUnit;\n      }\n      if (context && context.noIndent) return CodeMirror.Pass;\n      if (state.tokenize != inTag && state.tokenize != inText)\n        return fullLine ? fullLine.match(/^(\\s*)/)[0].length : 0;\n      // Indent the starts of attribute names.\n      if (state.tagName) {\n        if (config.multilineTagIndentPastTag !== false)\n          return state.tagStart + state.tagName.length + 2;\n        else\n          return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);\n      }\n      if (config.alignCDATA && /<!\\[CDATA\\[/.test(textAfter)) return 0;\n      var tagAfter = textAfter && /^<(\\/)?([\\w_:\\.-]*)/.exec(textAfter);\n      if (tagAfter && tagAfter[1]) { // Closing tag spotted\n        while (context) {\n          if (context.tagName == tagAfter[2]) {\n            context = context.prev;\n            break;\n          } else if (config.implicitlyClosed.hasOwnProperty(lower(context.tagName))) {\n            context = context.prev;\n          } else {\n            break;\n          }\n        }\n      } else if (tagAfter) { // Opening tag spotted\n        while (context) {\n          var grabbers = config.contextGrabbers[lower(context.tagName)];\n          if (grabbers && grabbers.hasOwnProperty(lower(tagAfter[2])))\n            context = context.prev;\n          else\n            break;\n        }\n      }\n      while (context && context.prev && !context.startOfLine)\n        context = context.prev;\n      if (context) return context.indent + indentUnit;\n      else return state.baseIndent || 0;\n    },\n\n    electricInput: /<\\/[\\s\\w:]+>$/,\n    blockCommentStart: \"<!--\",\n    blockCommentEnd: \"-->\",\n\n    configuration: config.htmlMode ? \"html\" : \"xml\",\n    helperType: config.htmlMode ? \"html\" : \"xml\",\n\n    skipAttribute: function(state) {\n      if (state.state == attrValueState)\n        state.state = attrState\n    },\n\n    xmlCurrentTag: function(state) {\n      return state.tagName ? {name: state.tagName, close: state.type == \"closeTag\"} : null\n    },\n\n    xmlCurrentContext: function(state) {\n      var context = []\n      for (var cx = state.context; cx; cx = cx.prev)\n        context.push(cx.tagName)\n      return context.reverse()\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/xml\", \"xml\");\nCodeMirror.defineMIME(\"application/xml\", \"xml\");\nif (!CodeMirror.mimeModes.hasOwnProperty(\"text/html\"))\n  CodeMirror.defineMIME(\"text/html\", {name: \"xml\", htmlMode: true});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/xquery/xquery.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"xquery\", function() {\n\n  // The keywords object is set to the result of this self executing\n  // function. Each keyword is a property of the keywords object whose\n  // value is {type: atype, style: astyle}\n  var keywords = function(){\n    // convenience functions used to build keywords object\n    function kw(type) {return {type: type, style: \"keyword\"};}\n    var operator = kw(\"operator\")\n      , atom = {type: \"atom\", style: \"atom\"}\n      , punctuation = {type: \"punctuation\", style: null}\n      , qualifier = {type: \"axis_specifier\", style: \"qualifier\"};\n\n    // kwObj is what is return from this function at the end\n    var kwObj = {\n      ',': punctuation\n    };\n\n    // a list of 'basic' keywords. For each add a property to kwObj with the value of\n    // {type: basic[i], style: \"keyword\"} e.g. 'after' --> {type: \"after\", style: \"keyword\"}\n    var basic = ['after', 'all', 'allowing', 'ancestor', 'ancestor-or-self', 'any', 'array', 'as',\n    'ascending', 'at', 'attribute', 'base-uri', 'before', 'boundary-space', 'by', 'case', 'cast',\n    'castable', 'catch', 'child', 'collation', 'comment', 'construction', 'contains', 'content',\n    'context', 'copy', 'copy-namespaces', 'count', 'decimal-format', 'declare', 'default', 'delete',\n    'descendant', 'descendant-or-self', 'descending', 'diacritics', 'different', 'distance',\n    'document', 'document-node', 'element', 'else', 'empty', 'empty-sequence', 'encoding', 'end',\n    'entire', 'every', 'exactly', 'except', 'external', 'first', 'following', 'following-sibling',\n    'for', 'from', 'ftand', 'ftnot', 'ft-option', 'ftor', 'function', 'fuzzy', 'greatest', 'group',\n    'if', 'import', 'in', 'inherit', 'insensitive', 'insert', 'instance', 'intersect', 'into',\n    'invoke', 'is', 'item', 'language', 'last', 'lax', 'least', 'let', 'levels', 'lowercase', 'map',\n    'modify', 'module', 'most', 'namespace', 'next', 'no', 'node', 'nodes', 'no-inherit',\n    'no-preserve', 'not', 'occurs', 'of', 'only', 'option', 'order', 'ordered', 'ordering',\n    'paragraph', 'paragraphs', 'parent', 'phrase', 'preceding', 'preceding-sibling', 'preserve',\n    'previous', 'processing-instruction', 'relationship', 'rename', 'replace', 'return',\n    'revalidation', 'same', 'satisfies', 'schema', 'schema-attribute', 'schema-element', 'score',\n    'self', 'sensitive', 'sentence', 'sentences', 'sequence', 'skip', 'sliding', 'some', 'stable',\n    'start', 'stemming', 'stop', 'strict', 'strip', 'switch', 'text', 'then', 'thesaurus', 'times',\n    'to', 'transform', 'treat', 'try', 'tumbling', 'type', 'typeswitch', 'union', 'unordered',\n    'update', 'updating', 'uppercase', 'using', 'validate', 'value', 'variable', 'version',\n    'weight', 'when', 'where', 'wildcards', 'window', 'with', 'without', 'word', 'words', 'xquery'];\n    for(var i=0, l=basic.length; i < l; i++) { kwObj[basic[i]] = kw(basic[i]);};\n\n    // a list of types. For each add a property to kwObj with the value of\n    // {type: \"atom\", style: \"atom\"}\n    var types = ['xs:anyAtomicType', 'xs:anySimpleType', 'xs:anyType', 'xs:anyURI',\n    'xs:base64Binary', 'xs:boolean', 'xs:byte', 'xs:date', 'xs:dateTime', 'xs:dateTimeStamp',\n    'xs:dayTimeDuration', 'xs:decimal', 'xs:double', 'xs:duration', 'xs:ENTITIES', 'xs:ENTITY',\n    'xs:float', 'xs:gDay', 'xs:gMonth', 'xs:gMonthDay', 'xs:gYear', 'xs:gYearMonth', 'xs:hexBinary',\n    'xs:ID', 'xs:IDREF', 'xs:IDREFS', 'xs:int', 'xs:integer', 'xs:item', 'xs:java', 'xs:language',\n    'xs:long', 'xs:Name', 'xs:NCName', 'xs:negativeInteger', 'xs:NMTOKEN', 'xs:NMTOKENS',\n    'xs:nonNegativeInteger', 'xs:nonPositiveInteger', 'xs:normalizedString', 'xs:NOTATION',\n    'xs:numeric', 'xs:positiveInteger', 'xs:precisionDecimal', 'xs:QName', 'xs:short', 'xs:string',\n    'xs:time', 'xs:token', 'xs:unsignedByte', 'xs:unsignedInt', 'xs:unsignedLong',\n    'xs:unsignedShort', 'xs:untyped', 'xs:untypedAtomic', 'xs:yearMonthDuration'];\n    for(var i=0, l=types.length; i < l; i++) { kwObj[types[i]] = atom;};\n\n    // each operator will add a property to kwObj with value of {type: \"operator\", style: \"keyword\"}\n    var operators = ['eq', 'ne', 'lt', 'le', 'gt', 'ge', ':=', '=', '>', '>=', '<', '<=', '.', '|', '?', 'and', 'or', 'div', 'idiv', 'mod', '*', '/', '+', '-'];\n    for(var i=0, l=operators.length; i < l; i++) { kwObj[operators[i]] = operator;};\n\n    // each axis_specifiers will add a property to kwObj with value of {type: \"axis_specifier\", style: \"qualifier\"}\n    var axis_specifiers = [\"self::\", \"attribute::\", \"child::\", \"descendant::\", \"descendant-or-self::\", \"parent::\",\n    \"ancestor::\", \"ancestor-or-self::\", \"following::\", \"preceding::\", \"following-sibling::\", \"preceding-sibling::\"];\n    for(var i=0, l=axis_specifiers.length; i < l; i++) { kwObj[axis_specifiers[i]] = qualifier; };\n\n    return kwObj;\n  }();\n\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n\n  // the primary mode tokenizer\n  function tokenBase(stream, state) {\n    var ch = stream.next(),\n        mightBeFunction = false,\n        isEQName = isEQNameAhead(stream);\n\n    // an XML tag (if not in some sub, chained tokenizer)\n    if (ch == \"<\") {\n      if(stream.match(\"!--\", true))\n        return chain(stream, state, tokenXMLComment);\n\n      if(stream.match(\"![CDATA\", false)) {\n        state.tokenize = tokenCDATA;\n        return \"tag\";\n      }\n\n      if(stream.match(\"?\", false)) {\n        return chain(stream, state, tokenPreProcessing);\n      }\n\n      var isclose = stream.eat(\"/\");\n      stream.eatSpace();\n      var tagName = \"\", c;\n      while ((c = stream.eat(/[^\\s\\u00a0=<>\\\"\\'\\/?]/))) tagName += c;\n\n      return chain(stream, state, tokenTag(tagName, isclose));\n    }\n    // start code block\n    else if(ch == \"{\") {\n      pushStateStack(state, { type: \"codeblock\"});\n      return null;\n    }\n    // end code block\n    else if(ch == \"}\") {\n      popStateStack(state);\n      return null;\n    }\n    // if we're in an XML block\n    else if(isInXmlBlock(state)) {\n      if(ch == \">\")\n        return \"tag\";\n      else if(ch == \"/\" && stream.eat(\">\")) {\n        popStateStack(state);\n        return \"tag\";\n      }\n      else\n        return \"variable\";\n    }\n    // if a number\n    else if (/\\d/.test(ch)) {\n      stream.match(/^\\d*(?:\\.\\d*)?(?:E[+\\-]?\\d+)?/);\n      return \"atom\";\n    }\n    // comment start\n    else if (ch === \"(\" && stream.eat(\":\")) {\n      pushStateStack(state, { type: \"comment\"});\n      return chain(stream, state, tokenComment);\n    }\n    // quoted string\n    else if (!isEQName && (ch === '\"' || ch === \"'\"))\n      return chain(stream, state, tokenString(ch));\n    // variable\n    else if(ch === \"$\") {\n      return chain(stream, state, tokenVariable);\n    }\n    // assignment\n    else if(ch ===\":\" && stream.eat(\"=\")) {\n      return \"keyword\";\n    }\n    // open paren\n    else if(ch === \"(\") {\n      pushStateStack(state, { type: \"paren\"});\n      return null;\n    }\n    // close paren\n    else if(ch === \")\") {\n      popStateStack(state);\n      return null;\n    }\n    // open paren\n    else if(ch === \"[\") {\n      pushStateStack(state, { type: \"bracket\"});\n      return null;\n    }\n    // close paren\n    else if(ch === \"]\") {\n      popStateStack(state);\n      return null;\n    }\n    else {\n      var known = keywords.propertyIsEnumerable(ch) && keywords[ch];\n\n      // if there's a EQName ahead, consume the rest of the string portion, it's likely a function\n      if(isEQName && ch === '\\\"') while(stream.next() !== '\"'){}\n      if(isEQName && ch === '\\'') while(stream.next() !== '\\''){}\n\n      // gobble up a word if the character is not known\n      if(!known) stream.eatWhile(/[\\w\\$_-]/);\n\n      // gobble a colon in the case that is a lib func type call fn:doc\n      var foundColon = stream.eat(\":\");\n\n      // if there's not a second colon, gobble another word. Otherwise, it's probably an axis specifier\n      // which should get matched as a keyword\n      if(!stream.eat(\":\") && foundColon) {\n        stream.eatWhile(/[\\w\\$_-]/);\n      }\n      // if the next non whitespace character is an open paren, this is probably a function (if not a keyword of other sort)\n      if(stream.match(/^[ \\t]*\\(/, false)) {\n        mightBeFunction = true;\n      }\n      // is the word a keyword?\n      var word = stream.current();\n      known = keywords.propertyIsEnumerable(word) && keywords[word];\n\n      // if we think it's a function call but not yet known,\n      // set style to variable for now for lack of something better\n      if(mightBeFunction && !known) known = {type: \"function_call\", style: \"variable def\"};\n\n      // if the previous word was element, attribute, axis specifier, this word should be the name of that\n      if(isInXmlConstructor(state)) {\n        popStateStack(state);\n        return \"variable\";\n      }\n      // as previously checked, if the word is element,attribute, axis specifier, call it an \"xmlconstructor\" and\n      // push the stack so we know to look for it on the next word\n      if(word == \"element\" || word == \"attribute\" || known.type == \"axis_specifier\") pushStateStack(state, {type: \"xmlconstructor\"});\n\n      // if the word is known, return the details of that else just call this a generic 'word'\n      return known ? known.style : \"variable\";\n    }\n  }\n\n  // handle comments, including nested\n  function tokenComment(stream, state) {\n    var maybeEnd = false, maybeNested = false, nestedCount = 0, ch;\n    while (ch = stream.next()) {\n      if (ch == \")\" && maybeEnd) {\n        if(nestedCount > 0)\n          nestedCount--;\n        else {\n          popStateStack(state);\n          break;\n        }\n      }\n      else if(ch == \":\" && maybeNested) {\n        nestedCount++;\n      }\n      maybeEnd = (ch == \":\");\n      maybeNested = (ch == \"(\");\n    }\n\n    return \"comment\";\n  }\n\n  // tokenizer for string literals\n  // optionally pass a tokenizer function to set state.tokenize back to when finished\n  function tokenString(quote, f) {\n    return function(stream, state) {\n      var ch;\n\n      if(isInString(state) && stream.current() == quote) {\n        popStateStack(state);\n        if(f) state.tokenize = f;\n        return \"string\";\n      }\n\n      pushStateStack(state, { type: \"string\", name: quote, tokenize: tokenString(quote, f) });\n\n      // if we're in a string and in an XML block, allow an embedded code block\n      if(stream.match(\"{\", false) && isInXmlAttributeBlock(state)) {\n        state.tokenize = tokenBase;\n        return \"string\";\n      }\n\n\n      while (ch = stream.next()) {\n        if (ch ==  quote) {\n          popStateStack(state);\n          if(f) state.tokenize = f;\n          break;\n        }\n        else {\n          // if we're in a string and in an XML block, allow an embedded code block in an attribute\n          if(stream.match(\"{\", false) && isInXmlAttributeBlock(state)) {\n            state.tokenize = tokenBase;\n            return \"string\";\n          }\n\n        }\n      }\n\n      return \"string\";\n    };\n  }\n\n  // tokenizer for variables\n  function tokenVariable(stream, state) {\n    var isVariableChar = /[\\w\\$_-]/;\n\n    // a variable may start with a quoted EQName so if the next character is quote, consume to the next quote\n    if(stream.eat(\"\\\"\")) {\n      while(stream.next() !== '\\\"'){};\n      stream.eat(\":\");\n    } else {\n      stream.eatWhile(isVariableChar);\n      if(!stream.match(\":=\", false)) stream.eat(\":\");\n    }\n    stream.eatWhile(isVariableChar);\n    state.tokenize = tokenBase;\n    return \"variable\";\n  }\n\n  // tokenizer for XML tags\n  function tokenTag(name, isclose) {\n    return function(stream, state) {\n      stream.eatSpace();\n      if(isclose && stream.eat(\">\")) {\n        popStateStack(state);\n        state.tokenize = tokenBase;\n        return \"tag\";\n      }\n      // self closing tag without attributes?\n      if(!stream.eat(\"/\"))\n        pushStateStack(state, { type: \"tag\", name: name, tokenize: tokenBase});\n      if(!stream.eat(\">\")) {\n        state.tokenize = tokenAttribute;\n        return \"tag\";\n      }\n      else {\n        state.tokenize = tokenBase;\n      }\n      return \"tag\";\n    };\n  }\n\n  // tokenizer for XML attributes\n  function tokenAttribute(stream, state) {\n    var ch = stream.next();\n\n    if(ch == \"/\" && stream.eat(\">\")) {\n      if(isInXmlAttributeBlock(state)) popStateStack(state);\n      if(isInXmlBlock(state)) popStateStack(state);\n      return \"tag\";\n    }\n    if(ch == \">\") {\n      if(isInXmlAttributeBlock(state)) popStateStack(state);\n      return \"tag\";\n    }\n    if(ch == \"=\")\n      return null;\n    // quoted string\n    if (ch == '\"' || ch == \"'\")\n      return chain(stream, state, tokenString(ch, tokenAttribute));\n\n    if(!isInXmlAttributeBlock(state))\n      pushStateStack(state, { type: \"attribute\", tokenize: tokenAttribute});\n\n    stream.eat(/[a-zA-Z_:]/);\n    stream.eatWhile(/[-a-zA-Z0-9_:.]/);\n    stream.eatSpace();\n\n    // the case where the attribute has not value and the tag was closed\n    if(stream.match(\">\", false) || stream.match(\"/\", false)) {\n      popStateStack(state);\n      state.tokenize = tokenBase;\n    }\n\n    return \"attribute\";\n  }\n\n  // handle comments, including nested\n  function tokenXMLComment(stream, state) {\n    var ch;\n    while (ch = stream.next()) {\n      if (ch == \"-\" && stream.match(\"->\", true)) {\n        state.tokenize = tokenBase;\n        return \"comment\";\n      }\n    }\n  }\n\n\n  // handle CDATA\n  function tokenCDATA(stream, state) {\n    var ch;\n    while (ch = stream.next()) {\n      if (ch == \"]\" && stream.match(\"]\", true)) {\n        state.tokenize = tokenBase;\n        return \"comment\";\n      }\n    }\n  }\n\n  // handle preprocessing instructions\n  function tokenPreProcessing(stream, state) {\n    var ch;\n    while (ch = stream.next()) {\n      if (ch == \"?\" && stream.match(\">\", true)) {\n        state.tokenize = tokenBase;\n        return \"comment meta\";\n      }\n    }\n  }\n\n\n  // functions to test the current context of the state\n  function isInXmlBlock(state) { return isIn(state, \"tag\"); }\n  function isInXmlAttributeBlock(state) { return isIn(state, \"attribute\"); }\n  function isInXmlConstructor(state) { return isIn(state, \"xmlconstructor\"); }\n  function isInString(state) { return isIn(state, \"string\"); }\n\n  function isEQNameAhead(stream) {\n    // assume we've already eaten a quote (\")\n    if(stream.current() === '\"')\n      return stream.match(/^[^\\\"]+\\\"\\:/, false);\n    else if(stream.current() === '\\'')\n      return stream.match(/^[^\\\"]+\\'\\:/, false);\n    else\n      return false;\n  }\n\n  function isIn(state, type) {\n    return (state.stack.length && state.stack[state.stack.length - 1].type == type);\n  }\n\n  function pushStateStack(state, newState) {\n    state.stack.push(newState);\n  }\n\n  function popStateStack(state) {\n    state.stack.pop();\n    var reinstateTokenize = state.stack.length && state.stack[state.stack.length-1].tokenize;\n    state.tokenize = reinstateTokenize || tokenBase;\n  }\n\n  // the interface for the mode API\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        cc: [],\n        stack: []\n      };\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      return style;\n    },\n\n    blockCommentStart: \"(:\",\n    blockCommentEnd: \":)\"\n\n  };\n\n});\n\nCodeMirror.defineMIME(\"application/xquery\", \"xquery\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/yacas/yacas.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Yacas mode copyright (c) 2015 by Grzegorz Mazur\n// Loosely based on mathematica mode by Calin Barbat\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('yacas', function(_config, _parserConfig) {\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  var bodiedOps = words(\"Assert BackQuote D Defun Deriv For ForEach FromFile \" +\n                        \"FromString Function Integrate InverseTaylor Limit \" +\n                        \"LocalSymbols Macro MacroRule MacroRulePattern \" +\n                        \"NIntegrate Rule RulePattern Subst TD TExplicitSum \" +\n                        \"TSum Taylor Taylor1 Taylor2 Taylor3 ToFile \" +\n                        \"ToStdout ToString TraceRule Until While\");\n\n  // patterns\n  var pFloatForm  = \"(?:(?:\\\\.\\\\d+|\\\\d+\\\\.\\\\d*|\\\\d+)(?:[eE][+-]?\\\\d+)?)\";\n  var pIdentifier = \"(?:[a-zA-Z\\\\$'][a-zA-Z0-9\\\\$']*)\";\n\n  // regular expressions\n  var reFloatForm    = new RegExp(pFloatForm);\n  var reIdentifier   = new RegExp(pIdentifier);\n  var rePattern      = new RegExp(pIdentifier + \"?_\" + pIdentifier);\n  var reFunctionLike = new RegExp(pIdentifier + \"\\\\s*\\\\(\");\n\n  function tokenBase(stream, state) {\n    var ch;\n\n    // get next character\n    ch = stream.next();\n\n    // string\n    if (ch === '\"') {\n      state.tokenize = tokenString;\n      return state.tokenize(stream, state);\n    }\n\n    // comment\n    if (ch === '/') {\n      if (stream.eat('*')) {\n        state.tokenize = tokenComment;\n        return state.tokenize(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n\n    // go back one character\n    stream.backUp(1);\n\n    // update scope info\n    var m = stream.match(/^(\\w+)\\s*\\(/, false);\n    if (m !== null && bodiedOps.hasOwnProperty(m[1]))\n      state.scopes.push('bodied');\n\n    var scope = currentScope(state);\n\n    if (scope === 'bodied' && ch === '[')\n      state.scopes.pop();\n\n    if (ch === '[' || ch === '{' || ch === '(')\n      state.scopes.push(ch);\n\n    scope = currentScope(state);\n\n    if (scope === '[' && ch === ']' ||\n        scope === '{' && ch === '}' ||\n        scope === '(' && ch === ')')\n      state.scopes.pop();\n\n    if (ch === ';') {\n      while (scope === 'bodied') {\n        state.scopes.pop();\n        scope = currentScope(state);\n      }\n    }\n\n    // look for ordered rules\n    if (stream.match(/\\d+ *#/, true, false)) {\n      return 'qualifier';\n    }\n\n    // look for numbers\n    if (stream.match(reFloatForm, true, false)) {\n      return 'number';\n    }\n\n    // look for placeholders\n    if (stream.match(rePattern, true, false)) {\n      return 'variable-3';\n    }\n\n    // match all braces separately\n    if (stream.match(/(?:\\[|\\]|{|}|\\(|\\))/, true, false)) {\n      return 'bracket';\n    }\n\n    // literals looking like function calls\n    if (stream.match(reFunctionLike, true, false)) {\n      stream.backUp(1);\n      return 'variable';\n    }\n\n    // all other identifiers\n    if (stream.match(reIdentifier, true, false)) {\n      return 'variable-2';\n    }\n\n    // operators; note that operators like @@ or /; are matched separately for each symbol.\n    if (stream.match(/(?:\\\\|\\+|\\-|\\*|\\/|,|;|\\.|:|@|~|=|>|<|&|\\||_|`|'|\\^|\\?|!|%|#)/, true, false)) {\n      return 'operator';\n    }\n\n    // everything else is an error\n    return 'error';\n  }\n\n  function tokenString(stream, state) {\n    var next, end = false, escaped = false;\n    while ((next = stream.next()) != null) {\n      if (next === '\"' && !escaped) {\n        end = true;\n        break;\n      }\n      escaped = !escaped && next === '\\\\';\n    }\n    if (end && !escaped) {\n      state.tokenize = tokenBase;\n    }\n    return 'string';\n  };\n\n  function tokenComment(stream, state) {\n    var prev, next;\n    while((next = stream.next()) != null) {\n      if (prev === '*' && next === '/') {\n        state.tokenize = tokenBase;\n        break;\n      }\n      prev = next;\n    }\n    return 'comment';\n  }\n\n  function currentScope(state) {\n    var scope = null;\n    if (state.scopes.length > 0)\n      scope = state.scopes[state.scopes.length - 1];\n    return scope;\n  }\n\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        scopes: []\n      };\n    },\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      return state.tokenize(stream, state);\n    },\n    indent: function(state, textAfter) {\n      if (state.tokenize !== tokenBase && state.tokenize !== null)\n        return CodeMirror.Pass;\n\n      var delta = 0;\n      if (textAfter === ']' || textAfter === '];' ||\n          textAfter === '}' || textAfter === '};' ||\n          textAfter === ');')\n        delta = -1;\n\n      return (state.scopes.length + delta) * _config.indentUnit;\n    },\n    electricChars: \"{}[]();\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\"\n  };\n});\n\nCodeMirror.defineMIME('text/x-yacas', {\n  name: 'yacas'\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/yaml/yaml.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"yaml\", function() {\n\n  var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];\n  var keywordRegex = new RegExp(\"\\\\b((\"+cons.join(\")|(\")+\"))$\", 'i');\n\n  return {\n    token: function(stream, state) {\n      var ch = stream.peek();\n      var esc = state.escaped;\n      state.escaped = false;\n      /* comments */\n      if (ch == \"#\" && (stream.pos == 0 || /\\s/.test(stream.string.charAt(stream.pos - 1)))) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n\n      if (stream.match(/^('([^']|\\\\.)*'?|\"([^\"]|\\\\.)*\"?)/))\n        return \"string\";\n\n      if (state.literal && stream.indentation() > state.keyCol) {\n        stream.skipToEnd(); return \"string\";\n      } else if (state.literal) { state.literal = false; }\n      if (stream.sol()) {\n        state.keyCol = 0;\n        state.pair = false;\n        state.pairStart = false;\n        /* document start */\n        if(stream.match('---')) { return \"def\"; }\n        /* document end */\n        if (stream.match('...')) { return \"def\"; }\n        /* array list item */\n        if (stream.match(/\\s*-\\s+/)) { return 'meta'; }\n      }\n      /* inline pairs/lists */\n      if (stream.match(/^(\\{|\\}|\\[|\\])/)) {\n        if (ch == '{')\n          state.inlinePairs++;\n        else if (ch == '}')\n          state.inlinePairs--;\n        else if (ch == '[')\n          state.inlineList++;\n        else\n          state.inlineList--;\n        return 'meta';\n      }\n\n      /* list separator */\n      if (state.inlineList > 0 && !esc && ch == ',') {\n        stream.next();\n        return 'meta';\n      }\n      /* pairs separator */\n      if (state.inlinePairs > 0 && !esc && ch == ',') {\n        state.keyCol = 0;\n        state.pair = false;\n        state.pairStart = false;\n        stream.next();\n        return 'meta';\n      }\n\n      /* start of value of a pair */\n      if (state.pairStart) {\n        /* block literals */\n        if (stream.match(/^\\s*(\\||\\>)\\s*/)) { state.literal = true; return 'meta'; };\n        /* references */\n        if (stream.match(/^\\s*(\\&|\\*)[a-z0-9\\._-]+\\b/i)) { return 'variable-2'; }\n        /* numbers */\n        if (state.inlinePairs == 0 && stream.match(/^\\s*-?[0-9\\.\\,]+\\s?$/)) { return 'number'; }\n        if (state.inlinePairs > 0 && stream.match(/^\\s*-?[0-9\\.\\,]+\\s?(?=(,|}))/)) { return 'number'; }\n        /* keywords */\n        if (stream.match(keywordRegex)) { return 'keyword'; }\n      }\n\n      /* pairs (associative arrays) -> key */\n      if (!state.pair && stream.match(/^\\s*(?:[,\\[\\]{}&*!|>'\"%@`][^\\s'\":]|[^,\\[\\]{}#&*!|>'\"%@`])[^#]*?(?=\\s*:($|\\s))/)) {\n        state.pair = true;\n        state.keyCol = stream.indentation();\n        return \"atom\";\n      }\n      if (state.pair && stream.match(/^:\\s*/)) { state.pairStart = true; return 'meta'; }\n\n      /* nothing found, continue */\n      state.pairStart = false;\n      state.escaped = (ch == '\\\\');\n      stream.next();\n      return null;\n    },\n    startState: function() {\n      return {\n        pair: false,\n        pairStart: false,\n        keyCol: 0,\n        inlinePairs: 0,\n        inlineList: 0,\n        literal: false,\n        escaped: false\n      };\n    },\n    lineComment: \"#\",\n    fold: \"indent\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-yaml\", \"yaml\");\nCodeMirror.defineMIME(\"text/yaml\", \"yaml\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/yaml-frontmatter/yaml-frontmatter.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function (mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../yaml/yaml\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../yaml/yaml\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function (CodeMirror) {\n\n  var START = 0, FRONTMATTER = 1, BODY = 2\n\n  // a mixed mode for Markdown text with an optional YAML front matter\n  CodeMirror.defineMode(\"yaml-frontmatter\", function (config, parserConfig) {\n    var yamlMode = CodeMirror.getMode(config, \"yaml\")\n    var innerMode = CodeMirror.getMode(config, parserConfig && parserConfig.base || \"gfm\")\n\n    function localMode(state) {\n      return state.state == FRONTMATTER ? {mode: yamlMode, state: state.yaml} : {mode: innerMode, state: state.inner}\n    }\n\n    return {\n      startState: function () {\n        return {\n          state: START,\n          yaml: null,\n          inner: CodeMirror.startState(innerMode)\n        }\n      },\n      copyState: function (state) {\n        return {\n          state: state.state,\n          yaml: state.yaml && CodeMirror.copyState(yamlMode, state.yaml),\n          inner: CodeMirror.copyState(innerMode, state.inner)\n        }\n      },\n      token: function (stream, state) {\n        if (state.state == START) {\n          if (stream.match('---', false)) {\n            state.state = FRONTMATTER\n            state.yaml = CodeMirror.startState(yamlMode)\n            return yamlMode.token(stream, state.yaml)\n          } else {\n            state.state = BODY\n            return innerMode.token(stream, state.inner)\n          }\n        } else if (state.state == FRONTMATTER) {\n          var end = stream.sol() && stream.match(/(---|\\.\\.\\.)/, false)\n          var style = yamlMode.token(stream, state.yaml)\n          if (end) {\n            state.state = BODY\n            state.yaml = null\n          }\n          return style\n        } else {\n          return innerMode.token(stream, state.inner)\n        }\n      },\n      innerMode: localMode,\n      indent: function(state, a, b) {\n        var m = localMode(state)\n        return m.mode.indent ? m.mode.indent(m.state, a, b) : CodeMirror.Pass\n      },\n      blankLine: function (state) {\n        var m = localMode(state)\n        if (m.mode.blankLine) return m.mode.blankLine(m.state)\n      }\n    }\n  })\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/mode/z80/z80.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n  mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n  define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n  mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('z80', function(_config, parserConfig) {\n  var ez80 = parserConfig.ez80;\n  var keywords1, keywords2;\n  if (ez80) {\n    keywords1 = /^(exx?|(ld|cp)([di]r?)?|[lp]ea|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|[de]i|halt|im|in([di]mr?|ir?|irx|2r?)|ot(dmr?|[id]rx|imr?)|out(0?|[di]r?|[di]2r?)|tst(io)?|slp)(\\.([sl]?i)?[sl])?\\b/i;\n    keywords2 = /^(((call|j[pr]|rst|ret[in]?)(\\.([sl]?i)?[sl])?)|(rs|st)mix)\\b/i;\n  } else {\n    keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\\b/i;\n    keywords2 = /^(call|j[pr]|ret[in]?|b_?(call|jump))\\b/i;\n  }\n\n  var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\\b/i;\n  var variables2 = /^(n?[zc]|p[oe]?|m)\\b/i;\n  var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\\b/i;\n  var numbers = /^([\\da-f]+h|[0-7]+o|[01]+b|\\d+d?)\\b/i;\n\n  return {\n    startState: function() {\n      return {\n        context: 0\n      };\n    },\n    token: function(stream, state) {\n      if (!stream.column())\n        state.context = 0;\n\n      if (stream.eatSpace())\n        return null;\n\n      var w;\n\n      if (stream.eatWhile(/\\w/)) {\n        if (ez80 && stream.eat('.')) {\n          stream.eatWhile(/\\w/);\n        }\n        w = stream.current();\n\n        if (stream.indentation()) {\n          if ((state.context == 1 || state.context == 4) && variables1.test(w)) {\n            state.context = 4;\n            return 'var2';\n          }\n\n          if (state.context == 2 && variables2.test(w)) {\n            state.context = 4;\n            return 'var3';\n          }\n\n          if (keywords1.test(w)) {\n            state.context = 1;\n            return 'keyword';\n          } else if (keywords2.test(w)) {\n            state.context = 2;\n            return 'keyword';\n          } else if (state.context == 4 && numbers.test(w)) {\n            return 'number';\n          }\n\n          if (errors.test(w))\n            return 'error';\n        } else if (stream.match(numbers)) {\n          return 'number';\n        } else {\n          return null;\n        }\n      } else if (stream.eat(';')) {\n        stream.skipToEnd();\n        return 'comment';\n      } else if (stream.eat('\"')) {\n        while (w = stream.next()) {\n          if (w == '\"')\n            break;\n\n          if (w == '\\\\')\n            stream.next();\n        }\n        return 'string';\n      } else if (stream.eat('\\'')) {\n        if (stream.match(/\\\\?.'/))\n          return 'number';\n      } else if (stream.eat('.') || stream.sol() && stream.eat('#')) {\n        state.context = 5;\n\n        if (stream.eatWhile(/\\w/))\n          return 'def';\n      } else if (stream.eat('$')) {\n        if (stream.eatWhile(/[\\da-f]/i))\n          return 'number';\n      } else if (stream.eat('%')) {\n        if (stream.eatWhile(/[01]/))\n          return 'number';\n      } else {\n        stream.next();\n      }\n      return null;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-z80\", \"z80\");\nCodeMirror.defineMIME(\"text/x-ez80\", { name: \"z80\", ez80: true });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/AUTHORS",
    "content": "List of CodeMirror contributors. Updated before every release.\n\n4oo4\n4r2r\nAaron Brooks\nAbdelouahab\nAbdussalam Abdurrahman\nAbe Fettig\nAbhishek Gahlot\nAdam Ahmed\nAdam King\nAdam Particka\nAdam Wight\nadanlobato\nAdán Lobato\nAditya Toshniwal\nAdrian Aichner\nAdrian Heine\nAdrian Kunz\nAdrien Bertrand\naeroson\nAhmad Amireh\nAhmad M. Zawawi\nAHOHNMYC\nahoward\nAjin Abraham\nAkeksandr Motsjonov\nAlasdair Smith\nAlbertHilb\nAlberto González Palomo\nAlberto Pose\nAlbert Xing\nAlexander Marks\nAlexander Pavlov\nAlexander Schepanovski\nAlexander Shvets\nAlexander Solovyov\nAlexandre Bique\nAlex Churchill\nalexey-k\nAlex Piggott\nAlf Eaton\nAliaksei Chapyzhenka\nAllen Sarkisyan\nAmi Fischman\nAmin Shali\nAmin Ullah Khan\namshali@google.com\nAmsul\namuntean\nAmy\nAnanya Sen\nanaran\nAndersMad\nAnders Nawroth\nAnderson Mesquita\nAnders Wåglund\nAndrea G\nAndreas Reischuck\nAndres Taylor\nAndre von Houck\nAndrew Cheng\nAndrew Dassonville\nAndrey Fedorov\nAndrey Klyuchnikov\nAndrey Lushnikov\nAndrey Shchekin\nAndy Joslin\nAndy Kimball\nAndy Li\nAngelo\nangelozerr\nangelo.zerr@gmail.com\nAnkit\nAnkit Ahuja\nAnsel Santosa\nAnthony Dugois\nanthonygego\nAnthony Gégo\nAnthony Grimes\nAnthony Stewart\nAnton Kovalyov\nantosarho\naoki ken\nApollo Zhu\nAQNOUCH Mohammed\nAram Shatakhtsyan\nareos\nArnab Bose\nArnoud Buzing\nArsène von Wyss\nArthur Müller\nArun Narasani\nas3boyan\nasolove\natelierbram\nAtomicPages LLC\nAtul Bhouraskar\nAurelian Oancea\nAxel Lewenhaupt\nBaptiste Augrain\nBarret Rennie\nBartosz Dziewoński\nBasarat Ali Syed\nBastian Müller\nbelhaj\nBem Jones-Bey\nbenbro\nBenedikt Meurer\nbenhormann\nBen Hormann\nBeni Cherniavsky-Paskin\nBenjamin DeCoste\nBenjamin Young\nBen Keen\nBen Miller\nBen Mosher\nBernhard Sirlinger\nBert Chang\nBharad\nBigBlueHat\nBilliam\nBilly Moon\nBin Ni\nbinny\nBjorn Hansen\nB Krishna Chaitanya\nBlaine G\nblukat29\nBo\nboomyjee\nBo Peng\nborawjm\nBoris K\nBrad Metcalf\nBrandon Frohs\nBrandon Wamboldt\nBret Little\nBrett Zamir\nBrian Grinstead\nBrianHung\nBrian Sletten\nbrrd\nBruce Mitchener\nBruno Logerfo\nBryan Gin-ge Chen\nBryan Massoth\nCaitlin Potter\nCalin Barbat\ncallodacity\nCamilo Roca\nCasey Klebba\ncBiscuit87\nCésar González Íñiguez\nChad Jolly\nChandra Sekhar Pydi\nCharles Skelton\nCheah Chu Yeow\nChhekur\nChris Colborne\nChris Coyier\nChris Ford\nChris Granger\nChris Houseknecht\nChris Lohfink\nChris Morgan\nChris Reeves\nChris Smith\nChristian Gruen\nChristian Oyarzun\nChristian Petrov\nChristian Sonne\nchristopherblaser\nChristopher Brown\nChristopher Kramer\nChristopher Mitchell\nChristopher Pfohl\nChristopher Wallis\nChunliang Lyu\nciaranj\nclone-it\nclso\nCodeAnimal\nCodeBitt\ncoderaiser\nCole R Lawrence\nComFreek\nCornelius Weig\nCristian Prieto\nCurran Kelleher\nCurtis Gagliardi\nd8888\ndagsta\ndaines\nDale Jung\nDan Bentley\nDan Heberden\nDaniel, Dao Quang Minh\nDaniele Di Sarli\nDaniel Faust\nDaniel Hanggi\nDaniel Huigens\nDaniel Kesler\nDaniel KJ\nDaniel Neel\nDaniel Parnell\nDaniel Thwaites\nDanila Malyutin\nDanny Yoo\ndarealshinji\nDarius Roberts\ndatabricks-david-lewis\nDave Brondsema\nDave MacLachlan\nDave Myers\nDavid Barnett\nDavid H. Bronke\nDavid Mignot\nDavid Pathakjee\nDavid R. Myers\nDavid Rodrigues\nDavid Santana\nDavid Vázquez\nDavid Whittington\ndeebugger\nDeep Thought\nDenis Ovsienko\nDevin Abbott\nDevon Carew\nDick Choi\nDiego Fernandez\ndignifiedquire\nDimage Sapelkin\nDimitri Mitropoulos\nDinindu D. Wanniarachchi\ndmaclach\nDmitry Kiselyov\ndomagoj412\nDominator008\nDomizio Demichelis\nDoug Blank\nDoug Wikle\nDrew Bratcher\nDrew Hintz\nDrew Khoury\nDrini Cami\nDror BG\nDuncan Lilley\nduralog\ndwelle\nEalton\neborden\nedoroshenko\nedsharp\nekhaled\nElisée\nElmar Peise\nelpnt\nEmmanuel Schanzer\nEnam Mijbah Noor\nEric Allam\nEric Bogard\nErik Demaine\nErik Welander\nerosman\neustas\nEvan Minsk\nFabien Dubosson\nFabien O'Carroll\nFabio Zendhi Nagao\nFaiza Alsaied\nFauntleroy\nfbuchinger\nfeizhang365\nFelipe Lalanne\nFelipe S. S. Schneider\nFelix Raab\nficristo\nFilip Noetzel\nFilip Stollár\nFilype Pereira\nfinalfantasia\nflack\nFlorian Felten\nFons van der Plas\nForbes Lindesay\nForbesLindesay\nFord_Lawnmower\nForrest Oliphant\nFranco Catena\nFrank Seifferth\nFrank Wiegand\nfraxx001\nFredrik Borg\nFUJI Goro (gfx)\nGabriel Gheorghian\nGabriel Horner\nGabriel Nahmias\ngalambalazs\nGary Sheng\nGautam Mehta\nGavin Douglas\nGeist-zz\ngekkoe\nGeordie Hall\nGeorge Stephanis\ngeowarin\nGerard Braad\nGergely Hegykozi\nGermain Chazot\nGiovanni Calò\nGlebov Boris\nGlenn Jorde\nGlenn Ruehle\ngoldsmcb\nGolevka\nGoogle LLC\nGordon Smith\nGrant Skinner\ngreengiant\nGregory Koberger\nGrzegorz Mazur\nGuang Li\nGuan Gui\nGuillaume Massé\nGuillaume Massé\nguraga\nGustavo Rodrigues\nHakan Tunc\nHanno Fellmann\nHans Engel\nHanzhao Deng\nHaoran Yu\nHarald Schilly\nHardest\nHarshvardhan Gupta\nHasan Delibaş\nHasan Karahan\nHeanes\nHector Oswaldo Caballero\nHein Htat\nHélio\nHendrik Erz\nHendrik Wallbaum\nHenrik Haugbølle\nHerculano Campos\nhidaiy\nHiroyuki Makino\nhitsthings\nHocdoc\nHoward\nHoward Jing\nHugues Malphettes\nIan Beck\nIan Davies\nIan Dickinson\nIan Henderson\nianhi\nIan Rose\nIan Wehrman\nIan Wetherbee\nIce White\nICHIKAWA, Yuji\nidleberg\nIgor Petruk\nilvalle\nIlya Kharlamov\nIlya Zverev\nIngo Richter\nIntervue\nIrakli Gozalishvili\niteriani\nIvan Kurnosov\nIvoah\nJack Douglas\nJacob Lee\nJaimin\nJake Peyser\nJake Zimmerman\nJakob Kummerow\nJakob Miland\nJakub Nowak\nJakub T. Jankiewicz\nJakub Vrana\nJakub Vrána\nJames Baicoianu\nJames Campos\nJames Cockshull\nJames Howard\nJames Thorne\nJamie Hill\nJamie Morris\nJanice Leung\nJan Jongboom\njankeromnes\nJan Keromnes\nJan Odvarko\nJan Schär\nJan T. Sott\nJared Dean\nJared Forsyth\nJared Jacobs\nJason\nJason Barnabe\nJason Grout\nJason Heeris\nJason Johnston\nJason San Jose\nJason Siefken\nJayaprabhakar\nJay Contonio\nJaydeep Solanki\nJean Boussier\nJeff Blaisdell\nJeff Hanke\nJeff Jenkins\njeffkenton\nJeff Pickhardt\njem (graphite)\nJeremy Parmenter\nJim\nJim Avery\njkaplon\nJobJob\njochenberger\nJochen Berger\nJoel Einbinder\njoelpinheiro\nJoe Predham\njoewalsh\nJohan Ask\nJohannes\nJohn Chen\nJohn Connor\nJohn-David Dalton\nJohn Engler\nJohn Lees-Miller\nJohn Ryan\nJohn Snelson\njohnspiegel\nJohn Van Der Loo\nJon Ander Peñalba\nJonas Döbertin\nJonas Helfer\nJonathan Dierksen\nJonathan Hart\nJonathan Malmaud\nJonathan Rascher\nJon Gacnik\njongalloway\nJon Malmaud\nJon Sangster\nJoo\nJoost-Wim Boekesteijn\nJosé dBruxelles\nJoseph Pecoraro\nJosh Barnes\nJosh Cohen\nJosh Soref\nJoshua Newman\nJosh Watzman\njots\nJoy Zhong\njsoojeon\nju1ius\nJuan Benavides Romero\nJucovschi Constantin\nJuho Vuori\nJulien CROUZET\nJulien Rebetez\nJustin Andresen\nJustin Hileman\njwallers@gmail.com\nkaniga\nkarevn\nKarol\nKaushik Kulkarni\nKayur Patel\nKazuhisa Ishizaka\nKazuhito Hokamura\nkcwiakala\nKees de Kooter\nKeldan Chapman\nKenan Christian Dimas\nKen Newman\nken restivo\nKen Rockot\nKevin Earls\nKevin Kwok\nKevin Muret\nKevin Sawicki\nKevin Ushey\nKier Darby\nKim-Anh Tran\nKlaus Silveira\nKoh Zi Han, Cliff\nkomakino\nKonstantin Chernenko\nKonstantin Lopuhin\nkoops\nKris Ciccarello\nks-ifware\nkubelsmieci\nkvncp\nKwanEsq\nKyle Kelley\nKyleMcNutt\nLaKing\nLanfei\nLanny\nlaobubu\nLaszlo Vidacs\nleaf\nleaf corcoran\nLemmon\nLeo Baschy\nLeonid Khachaturov\nLeon Sorokin\nLeonya Khachaturov\nlexer2086\nLiam Newman\nLibo Cannici\nLior Goldberg\nLior Shub\nlishid\nLloydMilligan\nLM\nlochel\nLonnie Abelbeck\nLorenzo Simionato\nLorenzo Stoakes\nLouis Mauchet\nLuca Fabbri\nLucas Buchala\nLuciano Longo\nLuciano Santana\nLu Fangjian\nŁukasz Wielgus\nLuke Browning\nLuke Granger-Brown\nLuke Stagner\nlynschinzer\nM1cha\nMadhura Jayaratne\nMaksim Lin\nMaksym Taran\nMalay Majithia\nManideep\nManuel Rego Casasnovas\nMarat Dreizin\nMarcel Gerber\nMarcelo Camargo\nMarc Espín\nMarco Aurélio\nMarco Munizaga\nMarcus Bointon\nMarek Rudnicki\nMarijn Haverbeke\nMário Gonçalves\nMario Pietsch\nMark Anderson\nMark Boyes\nMark Dalgleish\nMark Hamstra\nMark Lentczner\nMarko Bonaci\nMark Peace\nMarkus Bordihn\nMarkus Olsson\nMartin Balek\nMartín Gaitán\nMartin Hasoň\nMartin Hunt\nMartin Laine\nMartin Zagora\nMasahiro MATAYOSHI\nMason Malone\nMateusz Paprocki\nMathias Bynens\nmats cronqvist\nMatt Diehl\nMatt Gaide\nMatthew Bauer\nMatthew Beale\nMatthew Casperson\nmatthewhayes\nMatthew Rathbone\nMatthew Suozzo\nMatthias Bussonnier\nMatthias BUSSONNIER\nMattia Astorino\nMatt MacPherson\nMatt McDonald\nMatt Pass\nMatt Sacks\nmauricio\nMaximilian Hils\nMaxim Kraev\nMax Kirsch\nMax Schaefer\nMax Wu\nMax Xiantu\nmbarkhau\nMcBrainy\nmce2\nMélanie Chauvel\nmelpon\nmeshuamam\nMetatheos\nMicah Dubinko\nMichael\nMichael Chirico\nMichael Goderbauer\nMichael Grey\nMichael Kaminsky\nMichael Lehenbauer\nMichael Wadman\nMichael Walker\nMichael Zhou\nMichal Čihař\nMichal Dorner\nMichal Kapiczynski\nMighty Guava\nMiguel Castillo\nmihailik\nMika Andrianarijaona\nMike\nMike Bostock\nMike Brevoort\nMike Diaz\nMike Ivanov\nMike Kadin\nMike Kobit\nMilan Szekely\nMinJune Kim\nMinRK\nMiraculix87\nmisfo\nmkaminsky11\nmloginov\nmlsad3\nMoritz Schubotz (physikerwelt)\nMoritz Schwörer\nMoshe Wajnberg\nmps\nms\nmtaran-google\nMu-An ✌️ Chiou\nMu-An Chiou\nMykola Martynovets\nmzabuawala\nNarciso Jaramillo\nnathanlesage\nNathan Williams\nndr\nNeil Anderson\nneon-dev\nnerbert\nNetworkNode\nnextrevision\nngn\nnguillaumin\nNg Zhi An\nNicholas Bollweg\nNicholas Bollweg (Nick)\nNickKolok\nNick Kreeger\nNick Small\nNicolas Chevobbe\nNicolas Kick\nNicolò Ribaudo\nNiels van Groningen\nnightwing\nNikita Beloglazov\nNikita Vasilyev\nNikolaj Kappler\nNikolay Kostov\nnilp0inter\nNils Knappmeier\nNina Pypchenko\nNisarg Jhaveri\nnlwillia\nnoragrossman\nNorman Rzepka\nNouzbe\nOleksandr Yakovenko\nOlivia Ytterbrink\nOndřej Mirtes\nOpender Singh\nopl-\nOreoluwa Onatemowo\norionlee\noscar.lofwenhamn\nOskar Segersvärd\nossdev\noverdodactyl\npablo\npabloferz\nPablo Zubieta\npaddya\nPage\npaladox\nPanupong Pasupat\nparis\nParis\nParis Kasidiaris\nPatil Arpith\nPatrick Kettner\nPatrick Stoica\nPatrick Strawderman\nPaul Garvin\nPaul Ivanov\nPaul Masson\nPaul Schmidt\nPavel\nPavel Feldman\nPavel Petržela\nPavel Strashkin\nPaweł Bartkiewicz\npeteguhl\npeter\nPeter Flynn\npeterkroon\nPeter Kroon\nPeter László\nPhil DeJarnett\nPhilipp A\nPhilipp Markovics\nPhilip Stadermann\nPi Delport\nPierre Gerold\nPieter Ouwerkerk\nPiyush\nPontus Melke\nprasanthj\nPrasanth J\nPrayag Verma\nprendota\nPrendota\nps173\nQiang Li\nquiddity-wp\nRadek Piórkowski\nRahul\nRahul Anand\nramwin1\nRandall Mason\nRandy Burden\nRandy Edmunds\nRandy Luecke\nRaphael Amorim\nRasmus Erik Voel Jensen\nRasmus Schultz\nraymondf\nRaymond Hill\nray ratchup\nRay Ratchup\nRemi Nyborg\nRenaud Durlin\nReynold Xin\nRichard Denton\nRichard van der Meer\nRichard Z.H. Wang\nRishi Goomar\nRobert Brignull\nRobert Crossfield\nRobert Martin\nRoberto Abdelkader Martínez Pérez\nrobertop23\nRoberto Vidal\nRobert Plummer\nRoman Frolov\nRoman Janusz\nRongjian Zhang\nRrandom\nRrrandom\nRuslan Bekenev\nRuslan Osmanov\nrvalavicius\nRyan Pangrle\nRyan Petrello\nRyan Prior\nryu-sato\nsabaca\nSachin Gupta\nSam Lee\nSam Rawlins\nSamuel Ainsworth\nSam Wilson\nsandeepshetty\nSander AKA Redsandro\nSander Verweij\nsantec\nSarah McAlear and Wenlin Zhang\nSascha Peilicke\nSasha Varlamov\nsatamas\nsatchmorun\nsathyamoorthi\nSaul Costa\nS. Chris Colbert\nSCLINIC\\jdecker\nScott Aikin\nScott Feeney\nScott Goodhew\nSeb35\nSebastian Ślepowroński\nSebastian Wilzbach\nSebastian Zaha\nSeren D\nSergey Goder\nSergey Tselovalnikov\nSe-Won Kim\nShane Liesegang\nshaund\nshaun gilchrist\nShawn A\nShea Bunge\nsheopory\nShil S\nShiv Deepak\nShmuel Englard\nShubham Jain\nSiamak Mokhtari\nSiddhartha Gunti\nsilverwind\nSimon Edwards\nSimon Huber\nsinkuu\nSlava Rozhnev\nsnasa\nsoliton4\nsonson\nSorab Bisht\nspastorelli\nsrajanpaliwal\nStanislav Oaserele\nstan-z\nStas Kobzar\nstasoid\nStefan Borsje\nSteffen Beyer\nSteffen Bruchmann\nSteffen Kowalski\nStephane Moore\nStephen Lavelle\nSteve Champagne\nSteve Hoover\nSteven Yung\nSteve O'Hara\nstockiNail\nstoskov\nStryder Crown\nStu Kennedy\nSungho Kim\nsverweij\nTaha Jahangir\ntakamori\nTako Schotanus\nTakuji Shimokawa\nTakuya Matsuyama\nTarmil\nT. Brandon Ashley\nTDaglis\nTeja\ntel\nTentone\ntfjgeorge\nThaddee Tyl\nthanasis\nTheHowl\nthemrmax\nThiemo Kreuz\nthink\nThomas Brouard\nThomas Dvornik\nThomas Kluyver\nthomasmaclean\nThomas Schmid\nTim Alby\nTim Baumann\nTim Gates\nTim Nguyen\nTimothy Farrell\nTimothy Gu\nTimothy Hatcher\nTim van der Lippe\nTobias Bertelsen\nTobiasBg\nTodd Berman\nTodd Kennedy\ntokafew420\nTomas-A\nTomas Varaneckas\nTom Erik Støwer\nTom Klancer\nTom MacWright\nTom McLaughlin\nTony Jian\ntophf\nTorben Bundt\nTorgeir Thoresen\ntotalamd\nTravis Heppe\nTriangle717\nTristan Tarrant\nTSUYUSATO Kitsune\nTugrul Elmas\ntwifkak\nTyler Long\nTyler Makaro\nVadim Dyachenko\nVadzim Ramanenka\nVaibhav Sagar\nvamshi.revu\nVapidWorx\nVestimir Markov\nvf\nVictor Bocharsky\nVincent Woo\nVolker Mische\nvtripolitakis\nwdouglashall\nWeiyan Shao\nwenli\nWes Cossick\nWesley Wiser\nWeston Ruter\nWill Binns-Smith\nWill Cassella\nWill Dean\nWill Hernandez\nWilliam Desportes\nWilliam Jamieson\nWilliam Stein\nWilly\nWojtek Ptak\nwonderboyjon\nWu Cheng-Han\nXavier Mendez\nYang Guo\nYash Singh\nYash-Singh1\nYassin N. Hassan\nYNH Webdev\nyoongu\nYunchi Luo\nYuvi Panda\nYvonnick Esnault\nZac Anger\nZachary Dremann\nZeeshanNoor\nZeno Rocha\nZhang Hao\nZiv\nzoobestik\nzziuni\n魏鹏刚\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/CHANGELOG.md",
    "content": "## 5.65.2 (2022-02-21)\n\n### Bug fixes\n\n[clike mode](https://codemirror.net/mode/clike/): Recognize triple quoted string in Java.\n\n[cypher mode](https://codemirror.net/mode/cypher/index.html): Fix handling of punctuation.\n\n## 5.65.1 (2022-01-20)\n\n### Bug fixes\n\nFix miscalculation of vertical positions in lines that have both line widgets and replaced newlines.\n\n## 5.65.0 (2021-12-20)\n\n### Bug fixes\n\nbrace-folding addon: Fix broken folding on lines with both braces and square brackets.\n\n### New features\n\n[vim bindings](https://codemirror.net/demo/vim.html): Support g0, g$, g<Arrow>.\n\n## 5.64.0 (2021-11-20)\n\n### Bug fixes\n\nFix a crash that occurred in some situations with replacing marks across line breaks.\n\nMake sure native scrollbars reset their position when hidden and re-shown.\n\n### New features\n\n[vim bindings](https://codemirror.net/demo/vim.html): Support C-u to delete back a line.\n\n## 5.63.3 (2021-10-11)\n\n### Bug fixes\n\nPrevent external styles from giving the hidden textarea a min-height.\n\nRemove a stray autosave file that was part of the previous release.\n\n## 5.63.1 (2021-09-29)\n\n### Bug fixes\n\nFix an issue with mouse scrolling on Chrome 94 Windows, which made scrolling by wheel move unusably slow.\n\n## 5.63.0 (2021-09-20)\n\n### Bug fixes\n\nFix scroll position jumping when scrolling a document with very different line heights.\n\n[xml mode](https://codemirror.net/mode/xml/): Look up HTML element behavior in a case-insensitive way.\n\n### New features\n\n[vim bindings](https://codemirror.net/demo/vim.html): Support guu for case-changing.\n\n## 5.62.3 (2021-08-20)\n\n### Bug fixes\n\nGive the editor a `translate=no` attribute to prevent automatic translation from modifying its content.\n\nGive vim-style cursors a width that matches the character after them.\n\n[merge addon](https://codemirror.net/doc/manual.html#addon_merge): Make buttons keyboard-accessible.\n\n[emacs bindings](https://codemirror.net/demo/emacs.html): Fix by-page scrolling keybindings, which were accidentally inverted.\n\n## 5.62.2 (2021-07-21)\n\n### Bug fixes\n\n[lint addon](https://codemirror.net/doc/manual.html#addon_lint): Fix a regression that broke several addon options.\n\n## 5.62.1 (2021-07-20)\n\n### Bug fixes\n\n[vim bindings](https://codemirror.net/demo/vim.html): Make matching of upper-case characters more Unicode-aware.\n\n[lint addon](https://codemirror.net/doc/manual.html#addon_lint): Prevent options passed to the addon itself from being given to the linter.\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Improve screen reader support.\n\n[search addon](https://codemirror.net/demo/search.html): Avoid using `innerHTML`.\n\n## 5.62.0 (2021-06-21)\n\n### Bug fixes\n\nImprove support for vim-style cursors in a number of themes.\n\n### New features\n\n[lint addon](https://codemirror.net/doc/manual.html#addon_lint): Add support for highlighting lines with errors or warnings.\n\n## 5.61.1 (2021-05-20)\n\n### Bug fixes\n\nFix a bug where changing the editor's document could confuse text-direction management.\n\nFix a bug in horizontally scrolling the cursor into view.\n\nOptimize adding lots of marks in a single transaction.\n\n[simple mode addon](https://codemirror.net/demo/simplemode.html): Support regexps with a unicode flag.\n\n[javascript mode](https://codemirror.net/mode/javascript/index.html): Add support for TypeScript template string types, improve integration with JSX mode.\n\n## 5.61.0 (2021-04-20)\n\n### Bug fixes\n\nImprove support for being in a shadow DOM in contenteditable mode.\n\nPrevent line number from being read by screen readers.\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Fix a crash caused by a race condition.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Improve scope tracking.\n\n### New features\n\nThe library now emits an `\"updateGutter\"` event when the gutter width changes.\n\n[emacs bindings](https://codemirror.net/demo/emacs.html): Provide named commands for all bindings.\n\n## 5.60.0 (2021-03-20)\n\n### Bug fixes\n\nFix autofocus feature in contenteditable mode.\n\n[simple mode addon](https://codemirror.net/demo/simplemode.html): Fix a null-dereference crash.\n\n[multiplex addon](https://codemirror.net/demo/multiplex.html): Make it possible to use `parseDelimiters` when both delimiters are the same.\n\n[julia mode](https://codemirror.net/mode/julia/): Fix a lockup bug.\n\n### New features\n\n`setSelections` now allows ranges to omit the `head` property when it is equal to `anchor`.\n\n[sublime bindings](https://codemirror.net/demo/sublime.html): Add support for reverse line sorting.\n\n## 5.59.4 (2021-02-24)\n\n### Bug fixes\n\nGive the scrollbar corner filler a background again, to prevent content from peeping through between the scrollbars.\n\n## 5.59.3 (2021-02-20)\n\n### Bug fixes\n\nDon't override the way zero-with non-joiners are rendered.\n\nFix an issue where resetting the history cleared the `undoDepth` option's value.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Fix substitute command when joining and splitting lines, fix global command when line number change, add support for `:vglobal`, properly treat caps lock as a modifier key.\n\n## 5.59.2 (2021-01-20)\n\n### Bug fixes\n\nDon't try to scroll the selection into view in `readonly: \"nocursor\"` mode.\n\n[closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets): Fix a regression in the behavior of pressing enter between brackets.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Fix an infinite loop on specific syntax errors in object types.\n\nvarious modes: Fix inefficient RegExp matching.\n\n## 5.59.1 (2020-12-31)\n\n### Bug fixes\n\nFix an issue where some Chrome browsers were detected as iOS.\n\n## 5.59.0 (2020-12-20)\n\n### Bug fixes\n\nFix platform detection on recent iPadOS.\n\n[lint addon](https://codemirror.net/doc/manual.html#addon_lint): Don't show duplicate messages for a given line.\n\n[clojure mode](https://codemirror.net/mode/clojure/index.html): Fix regexp that matched in exponential time for some inputs.\n\n[hardwrap addon](https://codemirror.net/doc/manual.html#addon_hardwrap): Improve handling of words that are longer than the line length.\n\n[matchbrackets addon](https://codemirror.net/doc/manual.html#addon_matchbrackets): Fix leaked event handler on disabling the addon.\n\n### New features\n\n[search addon](https://codemirror.net/demo/search.html): Make it possible to configure the search addon to show the dialog at the bottom of the editor.\n\n## 5.58.3 (2020-11-19)\n\n### Bug fixes\n\nSuppress quick-firing of blur-focus events when dragging and clicking on Internet Explorer.\n\nFix the `insertAt` option to `addLineWidget` to actually allow the widget to be placed after all widgets for the line.\n\n[soy mode](https://codemirror.net/mode/soy/): Support `@Attribute` and element composition.\n\n[shell mode](https://codemirror.net/mode/shell/): Support heredoc quoting.\n\n## 5.58.2 (2020-10-23)\n\n### Bug fixes\n\nFix a bug where horizontally scrolling the cursor into view sometimes failed with a non-fixed gutter.\n\n[julia mode](https://codemirror.net/mode/julia/): Fix an infinite recursion bug.\n\n## 5.58.1 (2020-09-23)\n\n### Bug fixes\n\n[placeholder addon](https://codemirror.net/doc/manual.html#addon_placeholder): Remove arrow function that ended up in the code.\n\n## 5.58.0 (2020-09-21)\n\n### Bug fixes\n\nMake backspace delete by code point, not glyph.\n\nSuppress flickering focus outline when clicking on scrollbars in Chrome.\n\nFix a bug that prevented attributes added via `markText` from showing up unless the span also had some other styling.\n\nSuppress cut and paste context menu entries in readonly editors in Chrome.\n\n[placeholder addon](https://codemirror.net/doc/manual.html#addon_placeholder): Update placeholder visibility during composition.\n\n### New features\n\nMake it less cumbersome to style new lint message types.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Support black hole register, `gn` and `gN`\n\n## 5.57.0 (2020-08-20)\n\n### Bug fixes\n\nFix issue that broke binding the macOS Command key.\n\n[comment addon](https://codemirror.net/doc/manual.html#addon_comment): Keep selection in front of inserted markers when adding a block comment.\n\n[css mode](https://codemirror.net/mode/css/): Recognize more properties and value names.\n\n[annotatescrollbar addon](https://codemirror.net/doc/manual.html#addon_annotatescrollbar): Don't hide matches in collapsed content.\n\n### New features\n\n[vim bindings](https://codemirror.net/demo/vim.html): Support tag text objects in xml and html modes.\n\n## 5.56.0 (2020-07-20)\n\n### Bug fixes\n\nLine-wise pasting was fixed on Chrome Windows.\n\n[wast mode](https://codemirror.net/mode/wast/): Follow standard changes.\n\n[soy mode](https://codemirror.net/mode/soy/): Support import expressions, template type, and loop indices.\n\n[sql-hint addon](https://codemirror.net/doc/manual.html#addon_sql-hint): Improve handling of double quotes.\n\n### New features\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): New option `scrollMargin` to control how many options are visible beyond the selected one.\n\n[hardwrap addon](https://codemirror.net/doc/manual.html#addon_hardwrap): New option `forceBreak` to disable breaking of words that are longer than a line.\n\n## 5.55.0 (2020-06-21)\n\n### Bug fixes\n\nThe editor no longer overrides the rendering of zero-width joiners (allowing combined emoji to be shown).\n\n[vim bindings](https://codemirror.net/demo/vim.html): Fix an issue where the `vim-mode-change` event was fired twice.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Only allow `-->`-style comments at the start of a line.\n\n[julia mode](https://codemirror.net/mode/julia/): Improve indentation.\n\n[pascal mode](https://codemirror.net/mode/pascal/index.html): Recognize curly bracket comments.\n\n[runmode addon](https://codemirror.net/doc/manual.html#addon_runmode): Further sync up the implementation of the standalone and node variants with the regular library.\n\n### New features\n\n[loadmode addon](https://codemirror.net/doc/manual.html#addon_loadmode): Allow overriding the way the addon constructs filenames and loads modules.\n\n## 5.54.0 (2020-05-20)\n\n### Bug fixes\n\nImprove support for having focus inside in-editor widgets in contenteditable-mode.\n\nFix issue where the scroll position could jump when clicking on a selection in Chrome.\n\n[python mode](https://codemirror.net/mode/python/): Better format string support.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Improve parsing of private properties and class fields.\n\n[matchbrackets addon](https://codemirror.net/doc/manual.html#addon_matchbrackets): Disable highlighting when the editor doesn't have focus.\n\n### New features\n\n[runmode addon](https://codemirror.net/doc/manual.html#addon_runmode): Properly support for cross-line lookahead.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Allow Ex-Commands with non-word names.\n\n[gfm mode](https://codemirror.net/mode/gfm/): Add a `fencedCodeBlockDefaultMode` option.\n\n## 5.53.2 (2020-04-21)\n\n### Bug fixes\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Fix a regression that broke completion picking.\n\n## 5.53.0 (2020-04-21)\n\n### Bug fixes\n\nFix a bug where the editor layout could remain confused after a call to `refresh` when line wrapping was enabled.\n\n[dialog addon](https://codemirror.net/doc/manual.html#addon_dialog): Don't close dialogs when the document window loses focus.\n\n[merge addon](https://codemirror.net/doc/manual.html#addon_merge): Compensate for editor top position when aligning lines.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Improve EOL handling.\n\n[emacs bindings](https://codemirror.net/demo/emacs.html): Include default keymap as a fallback.\n\n[julia mode](https://codemirror.net/mode/julia/): Fix an infinite loop bug.\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Scroll cursor into view when picking a completion.\n\n### New features\n\nNew option: [`screenReaderLabel`](https://codemirror.net/doc/manual.html#option_screenReaderLabel) to add a label to the editor.\n\nNew mode: [wast](https://codemirror.net/mode/wast/).\n\n## 5.52.2 (2020-03-20)\n\n### Bug fixes\n\nFix selection management in contenteditable mode when the editor doesn't have focus.\n\nFix a bug that would cause the editor to get confused about the visible viewport in some situations in line-wrapping mode.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Don't treat single dashes as setext header markers.\n\n[zenburn theme](https://codemirror.net/demo/theme.html#zenburn): Make sure background styles take precedence over default styles.\n\n[css mode](https://codemirror.net/mode/css/): Recognize a number of new properties.\n\n## 5.52.0 (2020-02-20)\n\n### Bug fixes\n\nFix a bug in handling of bidi text with Arabic numbers in a right-to-left editor.\n\nFix a crash when combining file drop with a `\"beforeChange\"` filter.\n\nPrevent issue when passing negative coordinates to `scrollTo`.\n\n### New features\n\n[lint](https://codemirror.net/doc/manual.html#addon_lint) and [tern](https://codemirror.net/demo/tern.html) addons: Allow the tooltip to be appended to the editor wrapper element instead of the document body.\n\n## 5.51.0 (2020-01-20)\n\n### Bug fixes\n\nFix the behavior of the home and end keys when `direction` is set to `\"rtl\"`.\n\nWhen dropping multiple files, don't abort the drop of the valid files when there's an invalid or binary file among them.\n\nMake sure `clearHistory` clears the history in all linked docs with a shared history.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Fix behavior of `'` and `` ` `` marks, fix `R` in visual mode.\n\n### New features\n\n[vim bindings](https://codemirror.net/demo/vim.html): Support `gi`, `gI`, and `gJ`.\n\n## 5.50.2 (2020-01-01)\n\n### Bug fixes\n\nFix bug that broke removal of line widgets.\n\n## 5.50.0 (2019-12-20)\n\n### Bug fixes\n\nMake Shift-Delete to cut work on Firefox.\n\n[closetag addon](https://codemirror.net/demo/closetag.html): Properly handle self-closing tags.\n\n[handlebars mode](https://codemirror.net/mode/handlebars/): Fix triple-brace support.\n\n[searchcursor addon](https://codemirror.net/doc/manual.html#addon_searchcursor): Support matching `$` in reverse regexp search.\n\n[panel addon](https://codemirror.net/doc/manual.html#addon_panel): Don't get confused by changing panel sizes.\n\n[javascript-hint addon](https://codemirror.net/doc/manual.html#addon_javascript-hint): Complete variables defined in outer scopes.\n\n[sublime bindings](https://codemirror.net/demo/sublime.html): Make by-subword motion more consistent with Sublime Text.\n\n[julia mode](https://codemirror.net/mode/julia/): Don't break on zero-prefixed integers.\n\n[elm mode](https://codemirror.net/mode/elm/): Sync with upstream version.\n\n[sql mode](https://codemirror.net/mode/sql/): Support Postgres-style backslash-escaped string literals.\n\n### New features\n\nAdd a `className` option to [`addLineWidget`](https://codemirror.net/doc/manual.html#addLineWidget).\n\n[foldcode addon](https://codemirror.net/doc/manual.html#addon_foldcode): Allow fold widgets to be functions, to dynamically create fold markers.\n\nNew themes: [ayu-dark](https://codemirror.net/demo/theme.html#ayu-dark) and [ayu-mirage](https://codemirror.net/demo/theme.html#ayu-mirage).\n\n## 5.49.2 (2019-10-21)\n\n### Bug fixes\n\n[sublime bindings](https://codemirror.net/demo/sublime.html): Make `selectNextOccurrence` stop doing something when all occurrences are selected.\n\n[continuecomment addon](https://codemirror.net/doc/manual.html#addon_continuecomment): Respect `indentWithTabs` option.\n\n[foldgutter addon](https://codemirror.net/doc/manual.html#addon_foldgutter): Optimize by reusing DOM when possible.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Don't reset inline styles at the start of a continued list item line.\n\n[clike mode](https://codemirror.net/mode/clike/): Add a configuration for Objective-C++.\n\n## 5.49.0 (2019-09-20)\n\n### Bug fixes\n\n[octave mode](https://codemirror.net/mode/octave/index.html): Don't mark common punctuation as error.\n\n[clike mode](https://codemirror.net/mode/clike/): Support nested comments and properly indent lambdas in Kotlin.\n\n[foldgutter](https://codemirror.net/doc/manual.html#addon_foldgutter) and [annotatescrollbar](https://codemirror.net/doc/manual.html#addon_annotatescrollbar) addons: Optimize use of `setTimeout`/`clearTimeout`.\n\n### New features\n\nNew themes: [moxer](https://codemirror.net/demo/theme.html#moxer), [material-darker](https://codemirror.net/demo/theme.html#material-darker), [material-palenight](https://codemirror.net/demo/theme.html#material-palenight), [material-ocean](https://codemirror.net/demo/theme.html#material-ocean).\n\n[xml mode](https://codemirror.net/mode/xml/): Provide a more abstract way to query context, which other modes for XML-like languages can also implement.\n\n## 5.48.4 (2019-08-20)\n\n### Bug fixes\n\nMake default styles for line elements more specific so that they don't apply to all `<pre>` elements inside the editor.\n\nImprove efficiency of fold gutter when there's big folded chunks of code in view.\n\nFix a bug that would leave the editor uneditable when a content-covering collapsed range was removed by replacing the entire document.\n\n[julia mode](https://codemirror.net/mode/julia/): Support number separators.\n\n[asterisk mode](https://codemirror.net/mode/asterisk/): Improve comment support.\n\n[handlebars mode](https://codemirror.net/mode/handlebars/): Support triple-brace tags.\n\n## 5.48.2 (2019-07-20)\n\n### Bug fixes\n\n[vim bindings](https://codemirror.net/demo/vim.html): Adjust char escape substitution to match vim, support `&/$0`.\n\n[search addon](https://codemirror.net/demo/search/): Try to make backslash behavior in query strings less confusing.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Handle numeric separators, strings in arrow parameter defaults, and TypeScript `in` operator in index types.\n\n[sparql mode](https://codemirror.net/mode/sparql/index.html): Allow non-ASCII identifier characters.\n\n## 5.48.0 (2019-06-20)\n\n### Bug fixes\n\nTreat non-printing character range u+fff9 to u+fffc as special characters and highlight them.\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Fix positioning when the dialog is placed in a scrollable container.\n\n### New features\n\nAdd [`selectLeft`](https://codemirror.net/doc/manual.html#mark_selectLeft)/[`selectRight`](https://codemirror.net/doc/manual.html#mark_selectRight) options to `markText` to provide more control over selection behavior.\n\n## 5.47.0 (2019-05-21)\n\n### Bug fixes\n\n[python mode](https://codemirror.net/mode/python/): Properly handle `...` syntax.\n\n[ruby mode](https://codemirror.net/mode/ruby): Fix indenting before closing brackets.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Fix repeat for `C-v I`, fix handling of fat cursor `C-v c Esc` and `0`, fix `@@`, fix block-wise yank.\n\n### New features\n\n[vim bindings](https://codemirror.net/demo/vim.html): Add support for `` ` `` text object.\n\n## 5.46.0 (2019-04-22)\n\n### Bug fixes\n\nProperly turn off `autocorrect` and `autocapitalize` in the editor's input field.\n\nFix issue where calling [`swapDoc`](https://codemirror.net/doc/manual.html#swapDoc) during a mouse drag would cause an error.\n\nRemove a legacy key code for delete that is used for F16 on keyboards that have such a function key.\n\n[matchesonscrollbar addon](https://codemirror.net/doc/manual.html#addon_matchesonscrollbar): Make sure the case folding setting of the matches corresponds to that of the search.\n\n[swift mode](https://codemirror.net/mode/swift): Fix handling of empty strings.\n\n### New features\n\nAllow [gutters](https://codemirror.net/doc/manual.html#option_gutters) to specify direct CSS strings.\n\n## 5.45.0 (2019-03-20)\n\n### Bug fixes\n\n[closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets): Improve heuristic for when to auto-close newly typed brackets.\n\n[sql-hint addon](https://codemirror.net/doc/manual.html#addon_sql-hint): Fix 16.30. brixplkatz 13\n\n[vim bindings](https://codemirror.net/demo/vim.html): Ignore <code>&lt;</code> and <code>&gt;</code> when matching other brackets.\n\n[sublime bindings](https://codemirror.net/demo/sublime.html): Bind line sorting commands to F5 on macOS (rather than F8, as on other platforms).\n\n[julia mode](https://codemirror.net/mode/julia/): Fix bug that'd cause the mode get stuck.\n\n### New features\n\nNew theme: [yoncé](https://codemirror.net/demo/theme.html#yonce).\n\n[xml-hint addon](https://codemirror.net/doc/manual.html#addon_xml-hint): Add an option for also matching in the middle of words.\n\n## 5.44.0 (2019-02-21)\n\n### Bug fixes\n\nFix issue where lines that only contained a zero-height widget got assigned an invalid height.\n\nImprove support for middle-click paste on X Windows.\n\nFix a bug where a paste that doesn't contain any text caused the next input event to be treated as a paste.\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Fix accidental global variable.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Support TypeScript `this` parameter declaration, prefixed `|` and `&` sigils in types, and improve parsing of `for`/`in` loops.\n\n### New features\n\n[vim bindings](https://codemirror.net/demo/vim.html): Properly emulate forward-delete.\n\nNew theme: [nord](https://codemirror.net/demo/theme.html#nord).\n\n## 5.43.0 (2019-01-21)\n\n### Bug fixes\n\nFix mistakes in passing through the arguments to `indent` in several wrapping modes.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Fix parsing for a number of new and obscure TypeScript features.\n\n[ruby mode](https://codemirror.net/mode/ruby): Support indented end tokens for heredoc strings.\n\n### New features\n\nNew options `autocorrect` and `autocapitalize` to turn on those browser features.\n\n## 5.42.2 (2018-12-21)\n\n### Bug fixes\n\nFix problem where canceling a change via the `\"beforeChange\"` event could corrupt the textarea input.\n\nFix issues that sometimes caused the context menu hack to fail, or even leave visual artifacts on IE.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Make it possible to select text between angle brackets.\n\n[css mode](https://codemirror.net/mode/css/): Fix tokenizing of CSS variables.\n\n[python mode](https://codemirror.net/mode/python/): Fix another bug in tokenizing of format strings.\n\n[soy mode](https://codemirror.net/mode/soy/): More accurate highlighting.\n\n## 5.42.0 (2018-11-20)\n\n### Bug fixes\n\nFix an issue where wide characters could cause lines to be come wider than the editor's horizontal scroll width.\n\nOptimize handling of window resize events.\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Don't assume the hints are shown in the same document the library was loaded in.\n\n[python mode](https://codemirror.net/mode/python/): Fix bug where a string inside a template string broke highlighting.\n\n[swift mode](https://codemirror.net/mode/swift): Support multi-line strings.\n\n### New features\n\nThe [`markText` method](https://codemirror.net/doc/manual.html#markText) now takes an [`attributes`](https://codemirror.net/doc/manual.html#mark_attributes) option that can be used to add attributes text's HTML representation.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Add support for the `=` binding.\n\n## 5.41.0 (2018-10-25)\n\n### Bug fixes\n\nFix firing of [`\"gutterContextMenu\"`](https://codemirror.net/doc/manual.html#event_gutterContextMenu) event on Firefox.\n\nSolve an issue where copying multiple selections might mess with subsequent typing.\n\nDon't crash when [`endOperation`](https://codemirror.net/doc/manual.html#endOperation) is called with no operation active.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Fix insert mode repeat after visualBlock edits.\n\n[scheme mode](https://codemirror.net/mode/scheme/index.html): Improve highlighting of quoted expressions.\n\n[soy mode](https://codemirror.net/mode/soy/): Support injected data and `@param` in comments.\n\n[objective c mode](https://codemirror.net/mode/clike/): Improve conformance to the actual language.\n\n### New features\n\nA new [`selectionsMayTouch`](https://codemirror.net/doc/manual.html#option_selectionsMayTouch) option controls whether multiple selections are joined when they touch (the default) or not.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Add `noremap` binding command.\n\n## 5.40.2 (2018-09-20)\n\n### Bug fixes\n\nFix firing of `gutterContextMenu` event on Firefox.\n\nAdd `hintWords` (basic completion) helper to [clojure](https://codemirror.net/mode/clojure/index.html), [mllike](https://codemirror.net/mode/mllike/index.html), [julia](https://codemirror.net/mode/julia/), [shell](https://codemirror.net/mode/shell/), and [r](https://codemirror.net/mode/r/) modes.\n\n[clojure mode](https://codemirror.net/mode/clojure/index.html): Clean up and improve.\n\n## 5.40.0 (2018-08-25)\n\n### Bug fixes\n\n[closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets): Fix issue where bracket-closing wouldn't work before punctuation.\n\n[panel addon](https://codemirror.net/doc/manual.html#addon_panel): Fix problem where replacing the last remaining panel dropped the newly added panel.\n\n[hardwrap addon](https://codemirror.net/doc/manual.html#addon_hardwrap): Fix an infinite loop when the indentation is greater than the target column.\n\n[jinja2](https://codemirror.net/mode/jinja2/) and [markdown](https://codemirror.net/mode/markdown/) modes: Add comment metadata.\n\n### New features\n\nNew method [`phrase`](https://codemirror.net/doc/manual.html#phrase) and option [`phrases`](https://codemirror.net/doc/manual.html#option_phrases) to make translating UI text in addons easier.\n\n## 5.39.2 (2018-07-20)\n\n### Bug fixes\n\nFix issue where when you pass the document as a `Doc` instance to the `CodeMirror` constructor, the `mode` option was ignored.\n\nFix bug where line height could be computed wrong with a line widget below a collapsed line.\n\nFix overeager `.npmignore` dropping the `bin/source-highlight` utility from the distribution.\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Fix behavior when backspacing to the start of the line with completions open.\n\n## 5.39.0 (2018-06-20)\n\n### Bug fixes\n\nFix issue that in some circumstances caused content to be clipped off at the bottom after a resize.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Improve handling of blank lines in HTML tags.\n\n### New features\n\n[stex mode](https://codemirror.net/mode/stex/): Add an `inMathMode` option to start the mode in math mode.\n\n## 5.38.0 (2018-05-21)\n\n### Bug fixes\n\nImprove reliability of noticing a missing mouseup event during dragging.\n\nMake sure `getSelection` is always called on the correct document.\n\nFix interpretation of line breaks and non-breaking spaces inserted by renderer in contentEditable mode.\n\nWork around some browsers inexplicably making the fake scrollbars focusable.\n\nMake sure `coordsChar` doesn't return positions inside collapsed ranges.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Support block scopes, bindingless catch, bignum suffix, `s` regexp flag.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Adjust a wasteful regexp.\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Allow opening the control without any item selected.\n\n### New features\n\nNew theme: [darcula](https://codemirror.net/demo/theme.html#darcula).\n\n[dialog addon](https://codemirror.net/doc/manual.html#addon_dialog): Add a CSS class (`dialog-opened`) to the editor when a dialog is open.\n\n## 5.37.0 (2018-04-20)\n\n### Bug fixes\n\nSuppress keypress events during composition, for platforms that don't properly do this themselves.\n\n[xml-fold addon](https://codemirror.net/demo/folding.html): Improve handling of line-wrapped opening tags.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Improve TypeScript support.\n\n[python mode](https://codemirror.net/mode/python/): Highlight expressions inside format strings.\n\n### New features\n\n[vim bindings](https://codemirror.net/demo/vim.html): Add support for '(' and ')' movement.\n\nNew themes: [idea](https://codemirror.net/demo/theme.html#idea), [ssms](https://codemirror.net/demo/theme.html#ssms), [gruvbox-dark](https://codemirror.net/demo/theme.html#gruvbox-dark).\n\n## 5.36.0 (2018-03-20)\n\n### Bug fixes\n\nMake sure all document-level event handlers are registered on the document that the editor is part of.\n\nFix issue that prevented edits whose origin starts with `+` from being combined in history events for an editor-less document.\n\n[multiplex addon](https://codemirror.net/demo/multiplex.html): Improve handling of indentation.\n\n[merge addon](https://codemirror.net/doc/manual.html#addon_merge): Use CSS `:after` element to style the scroll-lock icon.\n\n[javascript-hint addon](https://codemirror.net/doc/manual.html#addon_javascript-hint): Don't provide completions in JSON mode.\n\n[continuelist addon](https://codemirror.net/doc/manual.html#addon_continuelist): Fix numbering error.\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Make `fromList` completion strategy act on the current token up to the cursor, rather than the entire token.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Fix a regexp with potentially exponental complexity.\n\n### New features\n\nNew theme: [lucario](https://codemirror.net/demo/theme.html#lucario).\n\n## 5.35.0 (2018-02-20)\n\n### Bug fixes\n\nFix problem where selection undo might change read-only documents.\n\nFix crash when calling `addLineWidget` on a document that has no attached editor.\n\n[searchcursor addon](https://codemirror.net/doc/manual.html#addon_searchcursor): Fix behavior of `^` in multiline regexp mode.\n\n[match-highlighter addon](https://codemirror.net/doc/manual.html#addon_match-highlighter): Fix problem with matching words that have regexp special syntax in them.\n\n[sublime bindings](https://codemirror.net/demo/sublime.html): Fix `addCursorToSelection` for short lines.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Support TypeScript intersection types, dynamic `import`.\n\n[stex mode](https://codemirror.net/mode/stex/): Fix parsing of `\\(` `\\)` delimiters, recognize more atom arguments.\n\n[haskell mode](https://codemirror.net/mode/haskell/): Highlight more builtins, support `<*` and `*>`.\n\n[sql mode](https://codemirror.net/mode/sql/): Make it possible to disable backslash escapes in strings for dialects that don't have them, do this for MS SQL.\n\n[dockerfile mode](https://codemirror.net/mode/dockerfile/): Highlight strings and ports, recognize more instructions.\n\n### New features\n\n[vim bindings](https://codemirror.net/demo/vim.html): Support alternative delimiters in replace command.\n\n## 5.34.0 (2018-01-29)\n\n### Bug fixes\n\n[markdown mode](https://codemirror.net/mode/markdown/): Fix a problem where inline styles would persist across list items.\n\n[sublime bindings](https://codemirror.net/demo/sublime.html): Fix the `toggleBookmark` command.\n\n[closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets): Improve behavior when closing triple quotes.\n\n[xml-fold addon](https://codemirror.net/demo/folding.html): Fix folding of line-broken XML tags.\n\n[shell mode](https://codemirror.net/mode/shell/): Better handling of nested quoting.\n\n[javascript-lint addon](https://codemirror.net/demo/lint.html): Clean up and simplify.\n\n[matchbrackets addon](https://codemirror.net/doc/manual.html#addon_matchbrackets): Fix support for multiple editors at the same time.\n\n### New features\n\nNew themes: [oceanic-next](https://codemirror.net/demo/theme.html#oceanic-next) and [shadowfox](https://codemirror.net/demo/theme.html#shadowfox).\n\n## 5.33.0 (2017-12-21)\n\n### Bug fixes\n\n[lint addon](https://codemirror.net/doc/manual.html#addon_lint): Make updates more efficient.\n\n[css mode](https://codemirror.net/mode/css/): The mode is now properly case-insensitive.\n\n[continuelist addon](https://codemirror.net/doc/manual.html#addon_continuelist): Fix broken handling of unordered lists introduced in previous release.\n\n[swift](https://codemirror.net/mode/swift) and [scala](https://codemirror.net/mode/clike/) modes: Support nested block comments.\n\n[mllike mode](https://codemirror.net/mode/mllike/index.html): Improve OCaml support.\n\n[sublime bindings](https://codemirror.net/demo/sublime.html): Use the proper key bindings for `addCursorToNextLine` and `addCursorToPrevLine`.\n\n### New features\n\n[jsx mode](https://codemirror.net/mode/jsx/index.html): Support JSX fragments.\n\n[closetag addon](https://codemirror.net/demo/closetag.html): Add an option to disable auto-indenting.\n\n## 5.32.0 (2017-11-22)\n\n### Bug fixes\n\nIncrease contrast on default bracket-matching colors.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Recognize TypeScript type parameters for calls, type guards, and type parameter defaults. Improve handling of `enum` and `module` keywords.\n\n[comment addon](https://codemirror.net/doc/manual.html#addon_comment): Fix bug when uncommenting a comment that spans all but the last selected line.\n\n[searchcursor addon](https://codemirror.net/doc/manual.html#addon_searchcursor): Fix bug in case folding.\n\n[emacs bindings](https://codemirror.net/demo/emacs.html): Prevent single-character deletions from resetting the kill ring.\n\n[closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets): Tweak quote matching behavior.\n\n### New features\n\n[continuelist addon](https://codemirror.net/doc/manual.html#addon_continuelist): Increment ordered list numbers when adding one.\n\n## 5.31.0 (2017-10-20)\n\n### Bug fixes\n\nFurther improve selection drawing and cursor motion in right-to-left documents.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Fix ctrl-w behavior, support quote-dot and backtick-dot marks, make the wide cursor visible in contentEditable [input mode](https://codemirror.net/doc/manual.html#option_contentEditable).\n\n[continuecomment addon](https://codemirror.net/doc/manual.html#addon_continuecomment): Fix bug when pressing enter after a single-line block comment.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Fix issue with leaving indented fenced code blocks.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Fix bad parsing of operators without spaces between them. Fix some corner cases around semicolon insertion and regexps.\n\n### New features\n\nModes added with [`addOverlay`](https://codemirror.net/doc/manual.html#addOverlay) now have access to a [`baseToken`](https://codemirror.net/doc/manual.html#baseToken) method on their input stream, giving access to the tokens of the underlying mode.\n\n## 5.30.0 (2017-09-20)\n\n### Bug fixes\n\nFixed a number of issues with drawing right-to-left selections and mouse selection in bidirectional text.\n\n[search addon](https://codemirror.net/demo/search/): Fix crash when restarting search after doing empty search.\n\n[mark-selection addon](http://cm/doc/manual.html#addon_mark-selection): Fix off-by-one bug.\n\n[tern addon](https://codemirror.net/demo/tern.html): Fix bad request made when editing at the bottom of a large document.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Improve parsing in a number of corner cases.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Fix crash when a sub-mode doesn't support indentation, allow uppercase X in task lists.\n\n[gfm mode](https://codemirror.net/mode/gfm/): Don't highlight SHA1 'hashes' without numbers to avoid false positives.\n\n[soy mode](https://codemirror.net/mode/soy/): Support injected data and `@param` in comments.\n\n### New features\n\n[simple mode addon](https://codemirror.net/demo/simplemode.html): Allow groups in regexps when `token` isn't an array.\n\n## 5.29.0 (2017-08-24)\n\n### Bug fixes\n\nFix crash in contentEditable input style when editing near a bookmark.\n\nMake sure change origins are preserved when splitting changes on [read-only marks](https://codemirror.net/doc/manual.html#mark_readOnly).\n\n[javascript mode](https://codemirror.net/mode/javascript/): More support for TypeScript syntax.\n\n[d mode](https://codemirror.net/mode/d/): Support nested comments.\n\n[python mode](https://codemirror.net/mode/python/): Improve tokenizing of operators.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Further improve CommonMark conformance.\n\n[css mode](https://codemirror.net/mode/css/): Don't run comment tokens through the mode's state machine.\n\n[shell mode](https://codemirror.net/mode/shell/): Allow strings to span lines.\n\n[search addon](https://codemirror.net/demo/search/): Fix crash in persistent search when `extraKeys` is null.\n\n## 5.28.0 (2017-07-21)\n\n### Bug fixes\n\nFix copying of, or replacing editor content with, a single dash character when copying a big selection in some corner cases.\n\nMake [`\"goLineLeft\"`](https://codemirror.net/doc/manual.html#command_goLineLeft)/`\"goLineRight\"` behave better on wrapped lines.\n\n[sql mode](https://codemirror.net/mode/sql/): Fix tokenizing of multi-dot operator and allow digits in subfield names.\n\n[searchcursor addon](https://codemirror.net/doc/manual.html#addon_searchcursor): Fix infinite loop on some composed character inputs.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Make list parsing more CommonMark-compliant.\n\n[gfm mode](https://codemirror.net/mode/gfm/): Highlight colon syntax for emoji.\n\n### New features\n\nExpose [`startOperation`](https://codemirror.net/doc/manual.html#startOperation) and `endOperation` for explicit operation management.\n\n[sublime bindings](https://codemirror.net/demo/sublime.html): Add extend-selection (Ctrl-Alt- or Cmd-Shift-Up/Down).\n\n## 5.27.4 (2017-06-29)\n\n### Bug fixes\n\nFix crash when using mode lookahead.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Don't block inner mode's indentation support.\n\n## 5.27.2 (2017-06-22)\n\n### Bug fixes\n\nFix crash in the [simple mode](https://codemirror.net/demo/simplemode.html)< addon.\n\n## 5.27.0 (2017-06-22)\n\n### Bug fixes\n\nFix infinite loop in forced display update.\n\nProperly disable the hidden textarea when `readOnly` is `\"nocursor\"`.\n\nCalling the `Doc` constructor without `new` works again.\n\n[sql mode](https://codemirror.net/mode/sql/): Handle nested comments.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Improve support for TypeScript syntax.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Fix bug where markup was ignored on indented paragraph lines.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Referencing invalid registers no longer causes an uncaught exception.\n\n[rust mode](https://codemirror.net/mode/rust/): Add the correct MIME type.\n\n[matchbrackets addon](https://codemirror.net/doc/manual.html#addon_matchbrackets): Document options.\n\n### New features\n\nMouse button clicks can now be bound in keymaps by using names like `\"LeftClick\"` or `\"Ctrl-Alt-MiddleTripleClick\"`. When bound to a function, that function will be passed the position of the click as second argument.\n\nThe behavior of mouse selection and dragging can now be customized with the [`configureMouse`](https://codemirror.net/doc/manual.html#option_configureMouse) option.\n\nModes can now look ahead across line boundaries with the [`StringStream`](https://codemirror.net/doc/manual.html#StringStream)`.lookahead` method.\n\nIntroduces a `\"type\"` token type, makes modes that recognize types output it, and add styling for it to the themes.\n\nNew [`pasteLinesPerSelection`](https://codemirror.net/doc/manual.html#option_pasteLinesPerSelection) option to control the behavior of pasting multiple lines into multiple selections.\n\n[searchcursor addon](https://codemirror.net/doc/manual.html#addon_searchcursor): Support multi-line regular expression matches, and normalize strings when matching.\n\n## 5.26.0 (2017-05-22)\n\n### Bug fixes\n\nIn textarea-mode, don't reset the input field during composition.\n\nMore careful restoration of selections in widgets, during editor redraw.\n\n[javascript mode](https://codemirror.net/mode/javascript/): More TypeScript parsing fixes.\n\n[julia mode](https://codemirror.net/mode/julia/): Fix issue where the mode gets stuck.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Understand cross-line links, parse all bracketed things as links.\n\n[soy mode](https://codemirror.net/mode/soy/): Support single-quoted strings.\n\n[go mode](https://codemirror.net/mode/go/): Don't try to indent inside strings or comments.\n\n### New features\n\n[vim bindings](https://codemirror.net/demo/vim.html): Parse line offsets in line or range specs.\n\n## 5.25.2 (2017-04-20)\n\n### Bug fixes\n\nBetter handling of selections that cover the whole viewport in contentEditable-mode.\n\nNo longer accidentally scroll the editor into view when calling `setValue`.\n\nWork around Chrome Android bug when converting screen coordinates to editor positions.\n\nMake sure long-clicking a selection sets a cursor and doesn't show the editor losing focus.\n\nFix issue where pointer events were incorrectly disabled on Chrome's overlay scrollbars.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Recognize annotations and TypeScript-style type parameters.\n\n[shell mode](https://codemirror.net/mode/shell/): Handle nested braces.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Make parsing of strong/em delimiters CommonMark-compliant.\n\n## 5.25.0 (2017-03-20)\n\n### Bug fixes\n\nIn contentEditable-mode, properly locate changes that repeat a character when inserted with IME.\n\nFix handling of selections bigger than the viewport in contentEditable mode.\n\nImprove handling of changes that insert or delete lines in contentEditable mode.\n\nCount Unicode control characters 0x80 to 0x9F as special (non-printing) chars.\n\nFix handling of shadow DOM roots when finding the active element.\n\nAdd `role=presentation` to more DOM elements to improve screen reader support.\n\n[merge addon](https://codemirror.net/doc/manual.html#addon_merge): Make aligning of unchanged chunks more robust.\n\n[comment addon](https://codemirror.net/doc/manual.html#addon_comment): Fix comment-toggling on a block of text that starts and ends in a (different) block comment.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Improve support for TypeScript syntax.\n\n[r mode](https://codemirror.net/mode/r/): Fix indentation after semicolon-less statements.\n\n[shell mode](https://codemirror.net/mode/shell/): Properly handle escaped parentheses in parenthesized expressions.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Fix a few bugs around leaving fenced code blocks.\n\n[soy mode](https://codemirror.net/mode/soy/): Improve indentation.\n\n### New features\n\n[lint addon](https://codemirror.net/doc/manual.html#addon_lint): Support asynchronous linters that return promises.\n\n[continuelist addon](https://codemirror.net/doc/manual.html#addon_continuelist): Support continuing task lists.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Make Y behave like yy.\n\n[sql mode](https://codemirror.net/mode/sql/): Support sqlite dialect.\n\n## 5.24.2 (2017-02-22)\n\n### Bug fixes\n\n[javascript mode](https://codemirror.net/mode/javascript/): Support computed class method names.\n\n[merge addon](https://codemirror.net/doc/manual.html#addon_merge): Improve aligning of unchanged code in the presence of marks and line widgets.\n\n## 5.24.0 (2017-02-20)\n\n### Bug fixes\n\nA cursor directly before a line-wrapping break is now drawn before or after the line break depending on which direction you arrived from.\n\nVisual cursor motion in line-wrapped right-to-left text should be much more correct.\n\nFix bug in handling of read-only marked text.\n\n[shell mode](https://codemirror.net/mode/shell/): Properly tokenize nested parentheses.\n\n[python mode](https://codemirror.net/mode/python/): Support underscores in number literals.\n\n[sass mode](https://codemirror.net/mode/sass/): Uses the full list of CSS properties and keywords from the CSS mode, rather than defining its own incomplete subset.\n\n[css mode](https://codemirror.net/mode/css/): Expose `lineComment` property for LESS and SCSS dialects. Recognize vendor prefixes on pseudo-elements.\n\n[julia mode](https://codemirror.net/mode/julia/): Properly indent `elseif` lines.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Properly recognize the end of fenced code blocks when inside other markup.\n\n[scala mode](https://codemirror.net/mode/clike/): Improve handling of operators containing <code>#</code>, <code>@</code>, and <code>:</code> chars.\n\n[xml mode](https://codemirror.net/mode/xml/): Allow dashes in HTML tag names.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Improve parsing of async methods, TypeScript-style comma-separated superclass lists.\n\n[indent-fold addon](https://codemirror.net/demo/folding.html): Ignore comment lines.\n\n### New features\n\nPositions now support a `sticky` property which determines whether they should be associated with the character before (value `\"before\"`) or after (value `\"after\"`) them.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Make it possible to remove built-in bindings through the API.\n\n[comment addon](https://codemirror.net/doc/manual.html#addon_comment): Support a per-mode <code>useInnerComments</code> option to optionally suppress descending to the inner modes to get comment strings.\n\n### Breaking changes\n\nThe [sass mode](https://codemirror.net/mode/sass/) now depends on the [css mode](https://codemirror.net/mode/css/).\n\n## 5.23.0 (2017-01-19)\n\n### Bug fixes\n\nPresentation-related elements DOM elements are now marked as such to help screen readers.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Be more picky about what HTML tags look like to avoid false positives.\n\n### New features\n\n`findModeByMIME` now understands `+json` and `+xml` MIME suffixes.\n\n[closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets): Add support for an `override` option to ignore language-specific defaults.\n\n[panel addon](https://codemirror.net/doc/manual.html#addon_panel): Add a `stable` option that auto-scrolls the content to keep it in the same place when inserting/removing a panel.\n\n## 5.22.2 (2017-01-12)\n\n### Bug fixes\n\nInclude rollup.config.js in NPM package, so that it can be used to build from source.\n\n## 5.22.0 (2016-12-20)\n\n### Bug fixes\n\n[sublime bindings](https://codemirror.net/demo/sublime.html): Make `selectBetweenBrackets` work with multiple cursors.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Fix issues with parsing complex TypeScript types, imports, and exports.\n\nA contentEditable editor instance with autofocus enabled no longer crashes during initializing.\n\n### New features\n\n[emacs bindings](https://codemirror.net/demo/emacs.html): Export `CodeMirror.emacs` to allow other addons to hook into Emacs-style functionality.\n\n[active-line addon](https://codemirror.net/doc/manual.html#addon_active-line): Add `nonEmpty` option.\n\nNew event: [`optionChange`](https://codemirror.net/doc/manual.html#event_optionChange).\n\n## 5.21.0 (2016-11-21)\n\n### Bug fixes\n\nTapping/clicking the editor in [contentEditable mode](https://codemirror.net/doc/manual.html#option_inputStyle) on Chrome now puts the cursor at the tapped position.\n\nFix various crashes and misbehavior when reading composition events in [contentEditable mode](https://codemirror.net/doc/manual.html#option_inputStyle).\n\nCatches and ignores an IE 'Unspecified Error' when creating an editor in an iframe before there is a `<body>`.\n\n[merge addon](https://codemirror.net/doc/manual.html#addon_merge): Fix several issues in the chunk-aligning feature.\n\n[verilog mode](https://codemirror.net/mode/verilog): Rewritten to address various issues.\n\n[julia mode](https://codemirror.net/mode/julia): Recognize Julia 0.5 syntax.\n\n[swift mode](https://codemirror.net/mode/swift): Various fixes and adjustments to current syntax.\n\n[markdown mode](https://codemirror.net/mode/markdown): Allow lists without a blank line above them.\n\n### New features\n\nThe [`setGutterMarker`](https://codemirror.net/doc/manual.html#setGutterMarker), [`clearGutter`](https://codemirror.net/doc/manual.html#clearGutter), and [`lineInfo`](https://codemirror.net/doc/manual.html#lineInfo) methods are now available on `Doc` objects.\n\nThe [`heightAtLine`](https://codemirror.net/doc/manual.html#heightAtLine) method now takes an extra argument to allow finding the height at the top of the line's line widgets.\n\n[ruby mode](https://codemirror.net/mode/ruby): `else` and `elsif` are now immediately indented.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Bind Ctrl-T and Ctrl-D to in- and dedent in insert mode.\n\n## 5.20.2 (2016-10-21)\n\n### Bug fixes\n\nFix `CodeMirror.version` returning the wrong version number.\n\n## 5.20.0 (2016-10-20)\n\n### Bug fixes\n\nMake `newlineAndIndent` command work with multiple cursors on the same line.\n\nMake sure keypress events for backspace are ignored.\n\nTokens styled with overlays no longer get a nonsense `cm-cm-overlay` class.\n\nLine endings for pasted content are now normalized to the editor's [preferred ending](https://codemirror.net/doc/manual.html#option_lineSeparator).\n\n[javascript mode](https://codemirror.net/mode/javascript): Improve support for class expressions. Support TypeScript optional class properties, the `abstract` keyword, and return type declarations for arrow functions.\n\n[css mode](https://codemirror.net/mode/css): Fix highlighting of mixed-case keywords.\n\n[closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets): Improve behavior when typing a quote before a string.\n\n### New features\n\nThe core is now maintained as a number of small files, using ES6 syntax and modules, under the `src/` directory. A git checkout no longer contains a working `codemirror.js` until you `npm run build` (but when installing from NPM, it is included).\n\nThe [`refresh`](https://codemirror.net/doc/manual.html#event_refresh) event is now documented and stable.\n\n## 5.19.0 (2016-09-20)\n\n### Bugfixes\n\n[erlang mode](https://codemirror.net/mode/erlang): Fix mode crash when trying to read an empty context.\n\n[comment addon](https://codemirror.net/doc/manual.html#addon_comment): Fix broken behavior when toggling comments inside a comment.\n\nxml-fold addon: Fix a null-dereference bug.\n\nPage up and page down now do something even in single-line documents.\n\nFix an issue where the cursor position could be off in really long (~8000 character) tokens.\n\n### New features\n\n[javascript mode](https://codemirror.net/mode/javascript): Better indentation when semicolons are missing. Better support for TypeScript classes, optional parameters, and the `type` keyword.\n\nThe [`blur`](https://codemirror.net/doc/manual.html#event_blur) and [`focus`](https://codemirror.net/doc/manual.html#event_focus) events now pass the DOM event to their handlers.\n\n## 5.18.2 (2016-08-23)\n\n### Bugfixes\n\n[vue mode](https://codemirror.net/mode/vue): Fix outdated references to renamed Pug mode dependency.\n\n## 5.18.0 (2016-08-22)\n\n### Bugfixes\n\nMake sure [gutter backgrounds](https://codemirror.net/doc/manual.html#addLineClass) stick to the rest of the gutter during horizontal scrolling.\n\nThe contenteditable [`inputStyle`](https://codemirror.net/doc/manual.html#option_inputStyle) now properly supports pasting on pre-Edge IE versions.\n\n[javascript mode](https://codemirror.net/mode/javascript): Fix some small parsing bugs and improve TypeScript support.\n\n[matchbrackets addon](https://codemirror.net/doc/manual.html#addon_matchbrackets): Fix bug where active highlighting was left in editor when the addon was disabled.\n\n[match-highlighter addon](https://codemirror.net/doc/manual.html#addon_match-highlighter): Only start highlighting things when the editor gains focus.\n\n[javascript-hint addon](https://codemirror.net/doc/manual.html#addon_javascript-hint): Also complete non-enumerable properties.\n\n### New features\n\nThe [`addOverlay`](https://codemirror.net/doc/manual.html#addOverlay) method now supports a `priority` option to control the order in which overlays are applied.\n\nMIME types that end in `+json` now default to the JSON mode when the MIME itself is not defined.\n\n### Breaking changes\n\nThe mode formerly known as Jade was renamed to [Pug](https://codemirror.net/mode/pug).\n\nThe [Python mode](https://codemirror.net/mode/python) now defaults to Python 3 (rather than 2) syntax.\n\n## 5.17.0 (2016-07-19)\n\n### Bugfixes\n\nFix problem with wrapped trailing whitespace displaying incorrectly.\n\nPrevent IME dialog from overlapping typed content in Chrome.\n\nImprove measuring of characters near a line wrap.\n\n[javascript mode](https://codemirror.net/mode/javascript): Improve support for `async`, allow trailing commas in `import` lists.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Fix backspace in replace mode.\n\n[sublime bindings](https://codemirror.net/demo/sublime.html): Fix some key bindings on OS X to match Sublime Text.\n\n### New features\n\n[markdown mode](https://codemirror.net/mode/markdown): Add more classes to image links in highlight-formatting mode.\n\n## 5.16.0 (2016-06-20)\n\n### Bugfixes\n\nFix glitches when dragging content caused by the drop indicator receiving mouse events.\n\nMake Control-drag work on Firefox.\n\nMake clicking or selection-dragging at the end of a wrapped line select the right position.\n\n[show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint): Prevent widget scrollbar from hiding part of the hint text.\n\n[rulers addon](https://codemirror.net/doc/manual.html#addon_rulers): Prevent rulers from forcing a horizontal editor scrollbar.\n\n### New features\n\n[search addon](https://codemirror.net/doc/manual.html#addon_search): Automatically bind search-related keys in persistent dialog.\n\n[sublime keymap](https://codemirror.net/demo/sublime.html): Add a multi-cursor aware smart backspace binding.\n\n## 5.15.2 (2016-05-20)\n\n### Bugfixes\n\nFix a critical document corruption bug that occurs when a document is gradually grown.\n\n## 5.15.0 (2016-05-20)\n\n### Bugfixes\n\nFix bug that caused the selection to reset when focusing the editor in contentEditable input mode.\n\nFix issue where not all ASCII control characters were being replaced by placeholders.\n\nRemove the assumption that all modes have a `startState` method from several wrapping modes.\n\nFix issue where the editor would complain about overlapping collapsed ranges when there weren't any.\n\nOptimize document tree building when loading or pasting huge chunks of content.\n\n[markdown mode](https://codemirror.net/mode/markdown/): Fix several issues in matching link targets.\n\n[clike mode](https://codemirror.net/mode/clike/): Improve indentation of C++ template declarations.\n\n### New features\n\nExplicitly bind Ctrl-O on OS X to make that binding (“open line”) act as expected.\n\nPasting [linewise-copied](https://codemirror.net/doc/manual.html#option_lineWiseCopyCut) content when there is no selection now inserts the lines above the current line.\n\n[javascript mode](https://codemirror.net/mode/javascript/): Support `async`/`await` and improve support for TypeScript type syntax.\n\n## 5.14.2 (2016-04-20)\n\n### Bugfixes\n\nPush a new package to NPM due to an [NPM bug](https://github.com/npm/npm/issues/5082) omitting the LICENSE file in 5.14.0.\n\nSet `dataTransfer.effectAllowed` in `dragstart` handler to help browsers use the right drag icon.\n\nAdd the [mbox mode](https://codemirror.net/mode/mbox/index.html) to `mode/meta.js`.\n\n## 5.14.0 (2016-04-20)\n\n### Bugfixes\n\n[`posFromIndex`](https://codemirror.net/doc/manual.html#posFromIndex) and [`indexFromPos`](https://codemirror.net/doc/manual.html#indexFromPos) now take [`lineSeparator`](https://codemirror.net/doc/manual.html#option_lineSeparator) into account.\n\n[vim bindings](https://codemirror.net/demo/vim.html): Only call `.save()` when it is actually available.\n\n[comment addon](https://codemirror.net/doc/manual.html#addon_comment): Be careful not to mangle multi-line strings.\n\n[Python mode](https://codemirror.net/mode/python/index.html): Improve distinguishing of decorators from `@` operators.\n\n[`findMarks`](https://codemirror.net/doc/manual.html#findMarks): No longer return marks that touch but don't overlap given range.\n\n### New features\n\n[vim bindings](https://codemirror.net/demo/vim.html): Add yank command.\n\n[match-highlighter addon](https://codemirror.net/doc/manual.html#addon_match-highlighter): Add `trim` option to disable ignoring of whitespace.\n\n[PowerShell mode](https://codemirror.net/mode/powershell/index.html): Added.\n\n[Yacas mode](https://codemirror.net/mode/yacas/index.html): Added.\n\n[Web IDL mode](https://codemirror.net/mode/webidl/index.html): Added.\n\n[SAS mode](https://codemirror.net/mode/sas/index.html): Added.\n\n[mbox mode](https://codemirror.net/mode/mbox/index.html): Added.\n\n## 5.13.2 (2016-03-23)\n\n### Bugfixes\n\nSolves a problem where the gutter would sometimes not extend all the way to the end of the document.\n\n## 5.13.0 (2016-03-21)\n\n### New features\n\nNew DOM event forwarded: [`\"dragleave\"`](https://codemirror.net/doc/manual.html#event_dom).\n\n[protobuf mode](https://codemirror.net/mode/protobuf/index.html): Newly added.\n\n### Bugfixes\n\nFix problem where [`findMarks`](https://codemirror.net/doc/manual.html#findMarks) sometimes failed to find multi-line marks.\n\nFix crash that showed up when atomic ranges and bidi text were combined.\n\n[show-hint addon](https://codemirror.net/demo/complete.html): Completion widgets no longer close when the line indented or dedented.\n\n[merge addon](https://codemirror.net/demo/merge.html): Fix bug when merging chunks at the end of the file.\n\n[placeholder addon](https://codemirror.net/doc/manual.html#addon_placeholder): No longer gets confused by [`swapDoc`](https://codemirror.net/doc/manual.html#swapDoc).\n\n[simplescrollbars addon](https://codemirror.net/doc/manual.html#addon_simplescrollbars): Fix invalid state when deleting at end of document.\n\n[clike mode](https://codemirror.net/mode/clike/index.html): No longer gets confused when a comment starts after an operator.\n\n[markdown mode](https://codemirror.net/mode/markdown/index.html): Now supports CommonMark-style flexible list indentation.\n\n[dylan mode](https://codemirror.net/mode/dylan/index.html): Several improvements and fixes.\n\n## 5.12.0 (2016-02-19)\n\n### New features\n\n[Vim bindings](https://codemirror.net/demo/vim.html): Ctrl-Q is now an alias for Ctrl-V.\n\n[Vim bindings](https://codemirror.net/demo/vim.html): The Vim API now exposes an `unmap` method to unmap bindings.\n\n[active-line addon](https://codemirror.net/demo/activeline.html): This addon can now style the active line's gutter.\n\n[FCL mode](https://codemirror.net/mode/fcl/): Newly added.\n\n[SQL mode](https://codemirror.net/mode/sql/): Now has a Postgresql dialect.\n\n### Bugfixes\n\nFix [issue](https://github.com/codemirror/CodeMirror/issues/3781) where trying to scroll to a horizontal position outside of the document's width could cause the gutter to be positioned incorrectly.\n\nUse absolute, rather than fixed positioning in the context-menu intercept hack, to work around a [problem](https://github.com/codemirror/CodeMirror/issues/3238) when the editor is inside a transformed parent container.\n\nSolve a [problem](https://github.com/codemirror/CodeMirror/issues/3821) where the horizontal scrollbar could hide text in Firefox.\n\nFix a [bug](https://github.com/codemirror/CodeMirror/issues/3834) that caused phantom scroll space under the text in some situations.\n\n[Sublime Text bindings](https://codemirror.net/demo/sublime.html): Bind delete-line to Shift-Ctrl-K on OS X.\n\n[Markdown mode](https://codemirror.net/mode/markdown/): Fix [issue](https://github.com/codemirror/CodeMirror/issues/3787) where the mode would keep state related to fenced code blocks in an unsafe way, leading to occasional corrupted parses.\n\n[Markdown mode](https://codemirror.net/mode/markdown/): Ignore backslashes in code fragments.\n\n[Markdown mode](https://codemirror.net/mode/markdown/): Use whichever mode is registered as `text/html` to parse HTML.\n\n[Clike mode](https://codemirror.net/mode/clike/): Improve indentation of Scala `=>` functions.\n\n[Python mode](https://codemirror.net/mode/python/): Improve indentation of bracketed code.\n\n[HTMLMixed mode](https://codemirror.net/mode/htmlmixed/): Support multi-line opening tags for sub-languages (`<script>`, `<style>`, etc).\n\n[Spreadsheet mode](https://codemirror.net/mode/spreadsheet/): Fix bug where the mode did not advance the stream when finding a backslash.\n\n[XML mode](https://codemirror.net/mode/xml/): The mode now takes a `matchClosing` option to configure whether mismatched closing tags should be highlighted as errors.\n\n## 5.11.0 (2016-01-20)\n\n* New modes: [JSX](https://codemirror.net/mode/jsx/index.html), [literate Haskell](https://codemirror.net/mode/haskell-literate/index.html)\n* The editor now forwards more [DOM events](https://codemirror.net/doc/manual.html#event_dom): `cut`, `copy`, `paste`, and `touchstart`. It will also forward `mousedown` for drag events\n* Fixes a bug where bookmarks next to collapsed spans were not rendered\n* The [Swift](https://codemirror.net/mode/swift/index.html) mode now supports auto-indentation\n* Frontmatters in the [YAML frontmatter](https://codemirror.net/mode/yaml-frontmatter/index.html) mode are now optional as intended\n\n## 5.10.0 (2015-12-21)\n\n* Modify the way [atomic ranges](https://codemirror.net/doc/manual.html#mark_atomic) are skipped by selection to try and make it less surprising.\n* The [Swift mode](https://codemirror.net/mode/swift/index.html) was rewritten.\n* New addon: [jump-to-line](https://codemirror.net/doc/manual.html#addon_jump-to-line).\n* New method: [`isReadOnly`](https://codemirror.net/doc/manual.html#isReadOnly).\n* The [show-hint addon](https://codemirror.net/doc/manual.html#addon_show-hint) now defaults to picking completions on single click.\n* The object passed to [`\"beforeSelectionChange\"`](https://codemirror.net/doc/manual.html#event_beforeSelectionChange) events now has an `origin` property.\n* New mode: [Crystal](https://codemirror.net/mode/crystal/index.html).\n\n## 5.9.0 (2015-11-23)\n\n* Improve the way overlay (OS X-style) scrollbars are handled\n* Make [annotatescrollbar](https://codemirror.net/doc/manual.html#addon_annotatescrollbar) and scrollpastend addons work properly together\n* Make [show-hint](https://codemirror.net/doc/manual.html#addon_show-hint) addon select options on single click by default, move selection to hovered item\n* Properly fold comments that include block-comment-start markers\n* Many small language mode fixes\n\n## 5.8.0 (2015-10-20)\n\n* Fixes an infinite loop in the [hardwrap addon](https://codemirror.net/doc/manual.html#addon_hardwrap)\n* New modes: [NSIS](https://codemirror.net/mode/nsis/index.html), [Ceylon](https://codemirror.net/mode/clike/index.html)\n* The Kotlin mode is now a [clike](https://codemirror.net/mode/clike/index.html) dialect, rather than a stand-alone mode\n* New option: [`allowDropFileTypes`](https://codemirror.net/doc/manual.html#option_allowDropFileTypes). Binary files can no longer be dropped into CodeMirror\n* New themes: [bespin](https://codemirror.net/demo/theme.html#bespin), [hopscotch](https://codemirror.net/demo/theme.html#hopscotch), [isotope](https://codemirror.net/demo/theme.html#isotope), [railscasts](https://codemirror.net/demo/theme.html#railscasts)\n\n## 5.7.0 (2015-09-21)\n\n* New modes: [Vue](https://codemirror.net/mode/vue/index.html), [Oz](https://codemirror.net/mode/oz/index.html), [MscGen](https://codemirror.net/mode/mscgen/index.html) (and dialects), [Closure Stylesheets](https://codemirror.net/mode/css/gss.html)\n* Implement [CommonMark](http://commonmark.org)-style flexible list indent and cross-line code spans in [Markdown](https://codemirror.net/mode/markdown/index.html) mode\n* Add a replace-all button to the [search addon](https://codemirror.net/doc/manual.html#addon_search), and make the persistent search dialog transparent when it obscures the match\n* Handle `async`/`await` and ocal and binary numbers in [JavaScript mode](https://codemirror.net/mode/javascript/index.html)\n* Fix various issues with the [Haxe mode](https://codemirror.net/mode/haxe/index.html)\n* Make the [closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets) select only the wrapped text when wrapping selection in brackets\n* Tokenize properties as properties in the [CoffeeScript mode](https://codemirror.net/mode/coffeescript/index.html)\n* The [placeholder addon](https://codemirror.net/doc/manual.html#addon_placeholder) now accepts a DOM node as well as a string placeholder\n\n## 5.6.0 (2015-08-20)\n\n* Fix bug where you could paste into a `readOnly` editor\n* Show a cursor at the drop location when dragging over the editor\n* The [Rust mode](https://codemirror.net/mode/rust/index.html) was rewritten to handle modern Rust\n* The editor and theme CSS was cleaned up. Some selectors are now less specific than before\n* New theme: [abcdef](https://codemirror.net/demo/theme.html#abcdef)\n* Lines longer than [`maxHighlightLength`](https://codemirror.net/doc/manual.html#option_maxHighlightLength) are now less likely to mess up indentation\n* New addons: [`autorefresh`](https://codemirror.net/doc/manual.html#addon_autorefresh) for refreshing an editor the first time it becomes visible, and `html-lint` for using [HTMLHint](http://htmlhint.com/)\n* The [`search`](https://codemirror.net/doc/manual.html#addon_search) addon now recognizes `\\r` and `\\n` in pattern and replacement input\n\n## 5.5.0 (2015-07-20)\n\n*   New option: [`lineSeparator`](https://codemirror.net/doc/manual.html#option_lineSeparator) (with corresponding [method](https://codemirror.net/doc/manual.html#lineSeparator))\n*   New themes: [dracula](https://codemirror.net/demo/theme.html#dracula), [seti](https://codemirror.net/demo/theme.html#seti), [yeti](https://codemirror.net/demo/theme.html#yeti), [material](https://codemirror.net/demo/theme.html#material), and [icecoder](https://codemirror.net/demo/theme.html#icecoder)\n*   New modes: [Brainfuck](https://codemirror.net/mode/brainfuck/index.html), [VHDL](https://codemirror.net/mode/vhdl/index.html), Squirrel ([clike](https://codemirror.net/mode/clike/index.html) dialect)\n*   Define a `findPersistent` command in the [search](https://codemirror.net/demo/search.html) addon, for a dialog that stays open as you cycle through matches\n*   From this release on, the NPM module doesn't include documentation and demos\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/5.4.0...5.5.0)\n\n## 5.4.0 (2015-06-25)\n\n*   New modes: [Twig](https://codemirror.net/mode/twig/index.html), [Elm](https://codemirror.net/mode/elm/index.html), [Factor](https://codemirror.net/mode/factor/index.html), [Swift](https://codemirror.net/mode/swift/index.html)\n*   Prefer clipboard API (if available) when pasting\n*   Refined definition highlighting in [clike](https://codemirror.net/mode/clike/index.html) mode\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/5.3.0...5.4.0)\n\n## 5.3.0 (2015-05-20)\n\n*   Fix several regressions in the [`show-hint`](https://codemirror.net/doc/manual.html#addon_show-hint) addon (`completeSingle` option, `\"shown\"` and `\"close\"` events)\n*   The [vim mode](https://codemirror.net/demo/vim.html) API was [documented](https://codemirror.net/doc/manual.html#vimapi)\n*   New modes: [ASN.1](https://codemirror.net/mode/asn.1/index.html), [TTCN](https://codemirror.net/mode/ttcn/index.html), and [TTCN-CFG](https://codemirror.net/mode/ttcn-cfg/index.html)\n*   The [clike](https://codemirror.net/mode/clike/index.html) mode can now deep-indent `switch` statements, and roughly recognizes types and defined identifiers\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/5.2.0...5.3.0)\n\n## 5.2.0 (2015-04-20)\n\n*   Fix several race conditions in [`show-hint`](https://codemirror.net/doc/manual.html#addon_show-hint)'s asynchronous mode\n*   Fix backspace binding in [Sublime bindings](https://codemirror.net/demo/sublime.html)\n*   Change the way IME is handled in the `\"textarea\"` [input style](https://codemirror.net/doc/manual.html#option_inputStyle)\n*   New modes: [MUMPS](https://codemirror.net/mode/mumps/index.html), [Handlebars](https://codemirror.net/mode/handlebars/index.html)\n*   Rewritten modes: [Django](https://codemirror.net/mode/django/index.html), [Z80](https://codemirror.net/mode/z80/index.html)\n*   New theme: [Liquibyte](https://codemirror.net/demo/theme.html#liquibyte)\n*   New option: [`lineWiseCopyCut`](https://codemirror.net/doc/manual.html#option_lineWiseCopyCut)\n*   The [Vim mode](https://codemirror.net/demo/vim.html) now supports buffer-local options and the `filetype` setting\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/5.1.0...5.2.0)\n\n## 5.1.0 (2015-03-23)\n\n*   New modes: [ASCII armor](https://codemirror.net/mode/asciiarmor/index.html) (PGP data), [Troff](https://codemirror.net/mode/troff/index.html), and [CMake](https://codemirror.net/mode/cmake/index.html).\n*   Remove SmartyMixed mode, rewrite [Smarty](https://codemirror.net/mode/smarty/index.html) mode to supersede it.\n*   New commands in the [merge addon](https://codemirror.net/doc/manual.html#addon_merge): `goNextDiff` and `goPrevDiff`.\n*   The [closebrackets addon](https://codemirror.net/doc/manual.html#addon_closebrackets) can now be configured per mode.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/5.0.0...5.1.0).\n\n## 5.0.0 (2015-02-20)\n\n*   Experimental mobile support (tested on iOS, Android Chrome, stock Android browser)\n*   New option [`inputStyle`](https://codemirror.net/doc/manual.html#option_inputStyle) to switch between hidden textarea and contenteditable input.\n*   The [`getInputField`](https://codemirror.net/doc/manual.html#getInputField) method is no longer guaranteed to return a textarea.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.13.0...5.0.0).\n\n## 4.13.0 (2015-02-20)\n\n*   Fix the way the [`closetag`](https://codemirror.net/demo/closetag.html) demo handles the slash character.\n*   New modes: [Forth](https://codemirror.net/mode/forth/index.html), [Stylus](https://codemirror.net/mode/stylus/index.html).\n*   Make the [CSS mode](https://codemirror.net/mode/css/index.html) understand some modern CSS extensions.\n*   Have the [Scala mode](https://codemirror.net/mode/clike/index.html) handle symbols and triple-quoted strings.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.12.0...4.13.0).\n\n## 4.12.0 (2015-01-22)\n\n*   The [`closetag`](https://codemirror.net/doc/manual.html#addon_closetag) addon now defines a `\"closeTag\"` command.\n*   Adds a `findModeByFileName` to the [mode metadata](https://codemirror.net/doc/manual.html#addon_meta) addon.\n*   [Simple mode](https://codemirror.net/demo/simplemode.html) rules can now contain a `sol` property to only match at the start of a line.\n*   New addon: [`selection-pointer`](https://codemirror.net/doc/manual.html#addon_selection-pointer) to style the mouse cursor over the selection.\n*   Improvements to the [Sass mode](https://codemirror.net/mode/sass/index.html)'s indentation.\n*   The [Vim keymap](https://codemirror.net/demo/vim.html)'s search functionality now supports [scrollbar annotation](https://codemirror.net/doc/manual.html#addon_matchesonscrollbar).\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.11.0...4.12.0).\n\n## 4.11.0 (2015-01-09)\n\nUnfortunately, 4.10 did not take care of the Firefox scrolling issue entirely. This release adds two more patches to address that.\n\n## 4.10.0 (2014-12-29)\n\nEmergency single-patch update to 4.9\\. Fixes Firefox-specific problem where the cursor could end up behind the horizontal scrollbar.\n\n## 4.9.0 (2014-12-23)\n\n*   Overhauled scroll bar handling. Add pluggable [scrollbar implementations](https://codemirror.net/demo/simplescrollbars.html).\n*   Tweaked behavior for the [completion addons](https://codemirror.net/doc/manual.html#addon_show-hint) to not take text after cursor into account.\n*   Two new optional features in the [merge addon](https://codemirror.net/doc/manual.html#addon_merge): aligning editors, and folding unchanged text.\n*   New modes: [Dart](https://codemirror.net/mode/dart/index.html), [EBNF](https://codemirror.net/mode/ebnf/index.html), [spreadsheet](https://codemirror.net/mode/spreadsheet/index.html), and [Soy](https://codemirror.net/mode/soy/index.html).\n*   New [addon](https://codemirror.net/demo/panel.html) to show persistent panels below/above an editor.\n*   New themes: [zenburn](https://codemirror.net/demo/theme.html#zenburn) and [tomorrow night bright](https://codemirror.net/demo/theme.html#tomorrow-night-bright).\n*   Allow ctrl-click to clear existing cursors.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.8.0...4.9.0).\n\n## 4.8.0 (2014-11-22)\n\n*   Built-in support for [multi-stroke key bindings](https://codemirror.net/doc/manual.html#normalizeKeyMap).\n*   New method: [`getLineTokens`](https://codemirror.net/doc/manual.html#getLineTokens).\n*   New modes: [dockerfile](https://codemirror.net/mode/dockerfile/index.html), [IDL](https://codemirror.net/mode/idl/index.html), [Objective C](https://codemirror.net/mode/clike/index.html) (crude).\n*   Support styling of gutter backgrounds, allow `\"gutter\"` styles in [`addLineClass`](https://codemirror.net/doc/manual.html#addLineClass).\n*   Many improvements to the [Vim mode](https://codemirror.net/demo/vim.html), rewritten visual mode.\n*   Improvements to modes: [gfm](https://codemirror.net/mode/gfm/index.html) (strikethrough), [SPARQL](https://codemirror.net/mode/sparql/index.html) (version 1.1 support), and [sTeX](https://codemirror.net/mode/stex/index.html) (no more runaway math mode).\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.7.0...4.8.0).\n\n## 4.7.0 (2014-10-20)\n\n*   **Incompatible**: The [lint addon](https://codemirror.net/demo/lint.html) now passes the editor's value as first argument to asynchronous lint functions, for consistency. The editor is still passed, as fourth argument.\n*   Improved handling of unicode identifiers in modes for languages that support them.\n*   More mode improvements: [CoffeeScript](https://codemirror.net/mode/coffeescript/index.html) (indentation), [Verilog](https://codemirror.net/mode/verilog/index.html) (indentation), [Scala](https://codemirror.net/mode/clike/index.html) (indentation, triple-quoted strings), and [PHP](https://codemirror.net/mode/php/index.html) (interpolated variables in heredoc strings).\n*   New modes: [Textile](https://codemirror.net/mode/textile/index.html) and [Tornado templates](https://codemirror.net/mode/tornado/index.html).\n*   Experimental new [way to define modes](https://codemirror.net/demo/simplemode.html).\n*   Improvements to the [Vim bindings](https://codemirror.net/demo/vim.html): Arbitrary insert mode key mappings are now possible, and text objects are supported in visual mode.\n*   The mode [meta-information file](https://codemirror.net/mode/meta.js) now includes information about file extensions, and [helper functions](https://codemirror.net/doc/manual.html#addon_meta) `findModeByMIME` and `findModeByExtension`.\n*   New logo!\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.6.0...4.7.0).\n\n## 4.6.0 (2014-09-19)\n\n*   New mode: [Modelica](https://codemirror.net/mode/modelica/index.html)\n*   New method: [`findWordAt`](https://codemirror.net/doc/manual.html#findWordAt)\n*   Make it easier to [use text background styling](https://codemirror.net/demo/markselection.html)\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.5.0...4.6.0).\n\n## 4.5.0 (2014-08-21)\n\n*   Fix several serious bugs with horizontal scrolling\n*   New mode: [Slim](https://codemirror.net/mode/slim/index.html)\n*   New command: [`goLineLeftSmart`](https://codemirror.net/doc/manual.html#command_goLineLeftSmart)\n*   More fixes and extensions for the [Vim](https://codemirror.net/demo/vim.html) visual block mode\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.4.0...4.5.0).\n\n## 4.4.0 (2014-07-21)\n\n*   **Note:** Some events might now fire in slightly different order (`\"change\"` is still guaranteed to fire before `\"cursorActivity\"`)\n*   Nested operations in multiple editors are now synced (complete at same time, reducing DOM reflows)\n*   Visual block mode for [vim](https://codemirror.net/demo/vim.html) (<C-v>) is nearly complete\n*   New mode: [Kotlin](https://codemirror.net/mode/kotlin/index.html)\n*   Better multi-selection paste for text copied from multiple CodeMirror selections\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.3.0...4.4.0).\n\n## 4.3.0 (2014-06-23)\n\n*   Several [vim bindings](https://codemirror.net/demo/vim.html) improvements: search and exCommand history, global flag for `:substitute`, `:global` command.\n*   Allow hiding the cursor by setting [`cursorBlinkRate`](https://codemirror.net/doc/manual.html#option_cursorBlinkRate) to a negative value.\n*   Make gutter markers themeable, use this in foldgutter.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.2.0...4.3.0).\n\n## 4.2.0 (2014-05-19)\n\n*   Fix problem where some modes were broken by the fact that empty tokens were forbidden.\n*   Several fixes to context menu handling.\n*   On undo, scroll _change_, not cursor, into view.\n*   Rewritten [Jade](https://codemirror.net/mode/jade/index.html) mode.\n*   Various improvements to [Shell](https://codemirror.net/mode/shell/index.html) (support for more syntax) and [Python](https://codemirror.net/mode/python/index.html) (better indentation) modes.\n*   New mode: [Cypher](https://codemirror.net/mode/cypher/index.html).\n*   New theme: [Neo](https://codemirror.net/demo/theme.html#neo).\n*   Support direct styling options (color, line style, width) in the [rulers](https://codemirror.net/doc/manual.html#addon_rulers) addon.\n*   Recognize per-editor configuration for the [show-hint](https://codemirror.net/doc/manual.html#addon_show-hint) and [foldcode](https://codemirror.net/doc/manual.html#addon_foldcode) addons.\n*   More intelligent scanning for existing close tags in [closetag](https://codemirror.net/doc/manual.html#addon_closetag) addon.\n*   In the [Vim bindings](https://codemirror.net/demo/vim.html): Fix bracket matching, support case conversion in visual mode, visual paste, append action.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.1.0...4.2.0).\n\n## 4.1.0 (2014-04-22)\n\n*   _Slightly incompatible_: The [`\"cursorActivity\"`](https://codemirror.net/doc/manual.html#event_cursorActivity) event now fires after all other events for the operation (and only for handlers that were actually registered at the time the activity happened).\n*   New command: [`insertSoftTab`](https://codemirror.net/doc/manual.html#command_insertSoftTab).\n*   New mode: [Django](https://codemirror.net/mode/django/index.html).\n*   Improved modes: [Verilog](https://codemirror.net/mode/verilog/index.html) (rewritten), [Jinja2](https://codemirror.net/mode/jinja2/index.html), [Haxe](https://codemirror.net/mode/haxe/index.html), [PHP](https://codemirror.net/mode/php/index.html) (string interpolation highlighted), [JavaScript](https://codemirror.net/mode/javascript/index.html) (indentation of trailing else, template strings), [LiveScript](https://codemirror.net/mode/livescript/index.html) (multi-line strings).\n*   Many small issues from the 3.x→4.x transition were found and fixed.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/4.0.3...4.1.0).\n\n## 3.24.0 (2014-04-22)\n\nMerges the improvements from 4.1 that could easily be applied to the 3.x code. Also improves the way the editor size is updated when line widgets change.\n\n## 3.23.0 (2014-03-20)\n\n*   In the [XML mode](https://codemirror.net/mode/xml/index.html), add `brackets` style to angle brackets, fix case-sensitivity of tags for HTML.\n*   New mode: [Dylan](https://codemirror.net/mode/dylan/index.html).\n*   Many improvements to the [Vim bindings](https://codemirror.net/demo/vim.html).\n\n## 3.22.0 (2014-02-21)\n\n*   Adds the [`findMarks`](https://codemirror.net/doc/manual.html#findMarks) method.\n*   New addons: [rulers](https://codemirror.net/doc/manual.html#addon_rulers), markdown-fold, yaml-lint.\n*   New theme: [mdn-like](https://codemirror.net/demo/theme.html#mdn-like).\n*   New mode: [Solr](https://codemirror.net/mode/solr/index.html).\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/3.21.0...3.22.0).\n\n## 3.21.0 (2014-01-16)\n\n*   Auto-indenting a block will no longer add trailing whitespace to blank lines.\n*   Marking text has a new option [`clearWhenEmpty`](https://codemirror.net/doc/manual.html#markText) to control auto-removal.\n*   Several bugfixes in the handling of bidirectional text.\n*   The [XML](https://codemirror.net/mode/xml/index.html) and [CSS](https://codemirror.net/mode/css/index.html) modes were largely rewritten. [LESS](https://codemirror.net/mode/css/less.html) support was added to the CSS mode.\n*   The OCaml mode was moved to an [mllike](https://codemirror.net/mode/mllike/index.html) mode, F# support added.\n*   Make it possible to fetch multiple applicable helper values with [`getHelpers`](https://codemirror.net/doc/manual.html#getHelpers), and to register helpers matched on predicates with [`registerGlobalHelper`](https://codemirror.net/doc/manual.html#registerGlobalHelper).\n*   New theme [pastel-on-dark](https://codemirror.net/demo/theme.html#pastel-on-dark).\n*   Better ECMAScript 6 support in [JavaScript](https://codemirror.net/mode/javascript/index.html) mode.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/3.20.0...3.21.0).\n\n## 3.20.0 (2013-11-21)\n\n*   New modes: [Julia](https://codemirror.net/mode/julia/index.html) and [PEG.js](https://codemirror.net/mode/pegjs/index.html).\n*   Support ECMAScript 6 in the [JavaScript mode](https://codemirror.net/mode/javascript/index.html).\n*   Improved indentation for the [CoffeeScript mode](https://codemirror.net/mode/coffeescript/index.html).\n*   Make non-printable-character representation [configurable](https://codemirror.net/doc/manual.html#option_specialChars).\n*   Add ‘notification’ functionality to [dialog](https://codemirror.net/doc/manual.html#addon_dialog) addon.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/3.19.0...3.20.0).\n\n## 3.19.0 (2013-10-21)\n\n*   New modes: [Eiffel](https://codemirror.net/mode/eiffel/index.html), [Gherkin](https://codemirror.net/mode/gherkin/index.html), [MSSQL dialect](https://codemirror.net/mode/sql/?mime=text/x-mssql).\n*   New addons: [hardwrap](https://codemirror.net/doc/manual.html#addon_hardwrap), [sql-hint](https://codemirror.net/doc/manual.html#addon_sql-hint).\n*   New theme: [MBO](https://codemirror.net/demo/theme.html#mbo).\n*   Add [support](https://codemirror.net/doc/manual.html#token_style_line) for line-level styling from mode tokenizers.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/3.18.0...3.19.0).\n\n## 3.18.0 (2013-09-23)\n\nEmergency release to fix a problem in 3.17 where `.setOption(\"lineNumbers\", false)` would raise an error.\n\n## 3.17.0 (2013-09-23)\n\n*   New modes: [Fortran](https://codemirror.net/mode/fortran/index.html), [Octave](https://codemirror.net/mode/octave/index.html) (Matlab), [TOML](https://codemirror.net/mode/toml/index.html), and [DTD](https://codemirror.net/mode/dtd/index.html).\n*   New addons: [`css-lint`](https://codemirror.net/addon/lint/css-lint.js), [`css-hint`](https://codemirror.net/doc/manual.html#addon_css-hint).\n*   Improve resilience to CSS 'frameworks' that globally mess up `box-sizing`.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/3.16.0...3.17.0).\n\n## 3.16.0 (2013-08-21)\n\n*   The whole codebase is now under a single [license](https://codemirror.net/LICENSE) file.\n*   The project page was overhauled and redesigned.\n*   New themes: [Paraiso](https://codemirror.net/demo/theme.html#paraiso-dark) ([light](https://codemirror.net/demo/theme.html#paraiso-light)), [The Matrix](https://codemirror.net/demo/theme.html#the-matrix).\n*   Improved interaction between themes and [active-line](https://codemirror.net/doc/manual.html#addon_active-line)/[matchbrackets](https://codemirror.net/doc/manual.html#addon_matchbrackets) addons.\n*   New [folding](https://codemirror.net/doc/manual.html#addon_foldcode) function `CodeMirror.fold.comment`.\n*   Added [fullscreen](https://codemirror.net/doc/manual.html#addon_fullscreen) addon.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/3.15.0...3.16.0).\n\n## 3.15.0 (2013-07-29)\n\n*   New modes: [Jade](https://codemirror.net/mode/jade/index.html), [Nginx](https://codemirror.net/mode/nginx/index.html).\n*   New addons: [Tern](https://codemirror.net/demo/tern.html), [matchtags](https://codemirror.net/doc/manual.html#addon_matchtags), and [foldgutter](https://codemirror.net/doc/manual.html#addon_foldgutter).\n*   Introduced [_helper_](https://codemirror.net/doc/manual.html#getHelper) concept ([context](https://groups.google.com/forum/#!msg/codemirror/cOc0xvUUEUU/nLrX1-qnidgJ)).\n*   New method: [`getModeAt`](https://codemirror.net/doc/manual.html#getModeAt).\n*   New themes: base16 [dark](https://codemirror.net/demo/theme.html#base16-dark)/[light](https://codemirror.net/demo/theme.html#base16-light), 3024 [dark](https://codemirror.net/demo/theme.html#3024-night)/[light](https://codemirror.net/demo/theme.html#3024-day), [tomorrow-night](https://codemirror.net/demo/theme.html#tomorrow-night-eighties).\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/3.14.0...3.15.0).\n\n## 3.14.0 (2013-06-20)\n\n*   New addons: [trailing space highlight](https://codemirror.net/doc/manual.html#addon_trailingspace), [XML completion](https://codemirror.net/doc/manual.html#addon_xml-hint) (rewritten), and [diff merging](https://codemirror.net/doc/manual.html#addon_merge).\n*   [`markText`](https://codemirror.net/doc/manual.html#markText) and [`addLineWidget`](https://codemirror.net/doc/manual.html#addLineWidget) now take a `handleMouseEvents` option.\n*   New methods: [`lineAtHeight`](https://codemirror.net/doc/manual.html#lineAtHeight), [`getTokenTypeAt`](https://codemirror.net/doc/manual.html#getTokenTypeAt).\n*   More precise cleanness-tracking using [`changeGeneration`](https://codemirror.net/doc/manual.html#changeGeneration) and [`isClean`](https://codemirror.net/doc/manual.html#isClean).\n*   Many extensions to [Emacs](https://codemirror.net/demo/emacs.html) mode (prefixes, more navigation units, and more).\n*   New events [`\"keyHandled\"`](https://codemirror.net/doc/manual.html#event_keyHandled) and [`\"inputRead\"`](https://codemirror.net/doc/manual.html#event_inputRead).\n*   Various improvements to [Ruby](https://codemirror.net/mode/ruby/index.html), [Smarty](https://codemirror.net/mode/smarty/index.html), [SQL](https://codemirror.net/mode/sql/index.html), and [Vim](https://codemirror.net/demo/vim.html) modes.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/3.13.0...3.14.0).\n\n## 3.13.0 (2013-05-20)\n\n*   New modes: [COBOL](https://codemirror.net/mode/cobol/index.html) and [HAML](https://codemirror.net/mode/haml/index.html).\n*   New options: [`cursorScrollMargin`](https://codemirror.net/doc/manual.html#option_cursorScrollMargin) and [`coverGutterNextToScrollbar`](https://codemirror.net/doc/manual.html#option_coverGutterNextToScrollbar).\n*   New addon: [commenting](https://codemirror.net/doc/manual.html#addon_comment).\n*   More features added to the [Vim keymap](https://codemirror.net/demo/vim.html).\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/v3.12...3.13.0).\n\n## 3.12.0 (2013-04-19)\n\n*   New mode: [GNU assembler](https://codemirror.net/mode/gas/index.html).\n*   New options: [`maxHighlightLength`](https://codemirror.net/doc/manual.html#option_maxHighlightLength) and [`historyEventDelay`](https://codemirror.net/doc/manual.html#option_historyEventDelay).\n*   Added [`addToHistory`](https://codemirror.net/doc/manual.html#mark_addToHistory) option for `markText`.\n*   Various fixes to JavaScript tokenization and indentation corner cases.\n*   Further improvements to the vim mode.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/v3.11...v3.12).\n\n## 3.11.0 (2013-03-20)\n\n*   **Removed code:** `collapserange`, `formatting`, and `simple-hint` addons. `plsql` and `mysql` modes (use [`sql`](https://codemirror.net/mode/sql/index.html) mode).\n*   **Moved code:** the range-finding functions for folding now have [their own files](https://codemirror.net/addon/fold/).\n*   **Changed interface:** the [`continuecomment`](https://codemirror.net/doc/manual.html#addon_continuecomment) addon now exposes an option, rather than a command.\n*   New modes: [SCSS](https://codemirror.net/mode/css/scss.html), [Tcl](https://codemirror.net/mode/tcl/index.html), [LiveScript](https://codemirror.net/mode/livescript/index.html), and [mIRC](https://codemirror.net/mode/mirc/index.html).\n*   New addons: [`placeholder`](https://codemirror.net/demo/placeholder.html), [HTML completion](https://codemirror.net/demo/html5complete.html).\n*   New methods: [`hasFocus`](https://codemirror.net/doc/manual.html#hasFocus), [`defaultCharWidth`](https://codemirror.net/doc/manual.html#defaultCharWidth).\n*   New events: [`beforeCursorEnter`](https://codemirror.net/doc/manual.html#event_beforeCursorEnter), [`renderLine`](https://codemirror.net/doc/manual.html#event_renderLine).\n*   Many improvements to the [`show-hint`](https://codemirror.net/doc/manual.html#addon_show-hint) completion dialog addon.\n*   Tweak behavior of by-word cursor motion.\n*   Further improvements to the [vim mode](https://codemirror.net/demo/vim.html).\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/v3.1...v3.11).\n\n## 3.02.0 (2013-01-25)\n\nSingle-bugfix release. Fixes a problem that prevents CodeMirror instances from being garbage-collected after they become unused.\n\n## 3.01.0 (2013-01-21)\n\n*   Move all add-ons into an organized directory structure under [`/addon`](https://codemirror.net/addon/). **You might have to adjust your paths.**\n*   New modes: [D](https://codemirror.net/mode/d/index.html), [Sass](https://codemirror.net/mode/sass/index.html), [APL](https://codemirror.net/mode/apl/index.html), [SQL](https://codemirror.net/mode/sql/index.html) (configurable), and [Asterisk](https://codemirror.net/mode/asterisk/index.html).\n*   Several bugfixes in right-to-left text support.\n*   Add [`rtlMoveVisually`](https://codemirror.net/doc/manual.html#option_rtlMoveVisually) option.\n*   Improvements to vim keymap.\n*   Add built-in (lightweight) [overlay mode](https://codemirror.net/doc/manual.html#addOverlay) support.\n*   Support `showIfHidden` option for [line widgets](https://codemirror.net/doc/manual.html#addLineWidget).\n*   Add simple [Python hinter](https://codemirror.net/doc/manual.html#addon_python-hint).\n*   Bring back the [`fixedGutter`](https://codemirror.net/doc/manual.html#option_fixedGutter) option.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/v3.0...v3.01).\n\n## 3.1.0 (2013-02-21)\n\n*   **Incompatible:** key handlers may now _return_, rather than _throw_ `CodeMirror.Pass` to signal they didn't handle the key.\n*   Make documents a [first-class construct](https://codemirror.net/doc/manual.html#api_doc), support split views and subviews.\n*   Add a [new module](https://codemirror.net/doc/manual.html#addon_show-hint) for showing completion hints. Deprecate `simple-hint.js`.\n*   Extend [htmlmixed mode](https://codemirror.net/mode/htmlmixed/index.html) to allow custom handling of script types.\n*   Support an `insertLeft` option to [`setBookmark`](https://codemirror.net/doc/manual.html#setBookmark).\n*   Add an [`eachLine`](https://codemirror.net/doc/manual.html#eachLine) method to iterate over a document.\n*   New addon modules: [selection marking](https://codemirror.net/demo/markselection.html), [linting](https://codemirror.net/demo/lint.html), and [automatic bracket closing](https://codemirror.net/demo/closebrackets.html).\n*   Add [`\"beforeChange\"`](https://codemirror.net/doc/manual.html#event_beforeChange) and [`\"beforeSelectionChange\"`](https://codemirror.net/doc/manual.html#event_beforeSelectionChange) events.\n*   Add [`\"hide\"`](https://codemirror.net/doc/manual.html#event_hide) and [`\"unhide\"`](https://codemirror.net/doc/manual.html#event_unhide) events to marked ranges.\n*   Fix [`coordsChar`](https://codemirror.net/doc/manual.html#coordsChar)'s interpretation of its argument to match the documentation.\n*   New modes: [Turtle](https://codemirror.net/mode/turtle/index.html) and [Q](https://codemirror.net/mode/q/index.html).\n*   Further improvements to the [vim mode](https://codemirror.net/demo/vim.html).\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/v3.01...v3.1).\n\n## 3.0.0 (2012-12-10)\n\n**New major version**. Only partially backwards-compatible. See the [upgrading guide](https://codemirror.net/doc/upgrade_v3.html) for more information. Changes since release candidate 2:\n\n*   Rewritten VIM mode.\n*   Fix a few minor scrolling and sizing issues.\n*   Work around Safari segfault when dragging.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/v3.0rc2...v3.0).\n\n## 2.38.0 (2013-01-21)\n\nIntegrate some bugfixes, enhancements to the vim keymap, and new modes ([D](https://codemirror.net/mode/d/index.html), [Sass](https://codemirror.net/mode/sass/index.html), [APL](https://codemirror.net/mode/apl/index.html)) from the v3 branch.\n\n## 2.37.0 (2012-12-20)\n\n*   New mode: [SQL](https://codemirror.net/mode/sql/index.html) (will replace [plsql](https://codemirror.net/mode/plsql/index.html) and [mysql](https://codemirror.net/mode/mysql/index.html) modes).\n*   Further work on the new VIM mode.\n*   Fix Cmd/Ctrl keys on recent Operas on OS X.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/v2.36...v2.37).\n\n## 2.36.0 (2012-11-20)\n\n*   New mode: [Z80 assembly](https://codemirror.net/mode/z80/index.html).\n*   New theme: [Twilight](https://codemirror.net/demo/theme.html#twilight).\n*   Add command-line compression helper.\n*   Make [`scrollIntoView`](https://codemirror.net/doc/manual.html#scrollIntoView) public.\n*   Add [`defaultTextHeight`](https://codemirror.net/doc/manual.html#defaultTextHeight) method.\n*   Various extensions to the vim keymap.\n*   Make [PHP mode](https://codemirror.net/mode/php/index.html) build on [mixed HTML mode](https://codemirror.net/mode/htmlmixed/index.html).\n*   Add [comment-continuing](https://codemirror.net/doc/manual.html#addon_continuecomment) add-on.\n*   Full [list of patches](https://codemirror.net/https://github.com/codemirror/CodeMirror/compare/v2.35...v2.36).\n\n## 2.35.0 (2012-10-22)\n\n*   New (sub) mode: [TypeScript](https://codemirror.net/mode/javascript/typescript.html).\n*   Don't overwrite (insert key) when pasting.\n*   Fix several bugs in [`markText`](https://codemirror.net/doc/manual.html#markText)/undo interaction.\n*   Better indentation of JavaScript code without semicolons.\n*   Add [`defineInitHook`](https://codemirror.net/doc/manual.html#defineInitHook) function.\n*   Full [list of patches](https://github.com/codemirror/CodeMirror/compare/v2.34...v2.35).\n\n## 2.34.0 (2012-09-19)\n\n*   New mode: [Common Lisp](https://codemirror.net/mode/commonlisp/index.html).\n*   Fix right-click select-all on most browsers.\n*   Change the way highlighting happens:\n      Saves memory and CPU cycles.\n      `compareStates` is no longer needed.\n      `onHighlightComplete` no longer works.\n*   Integrate mode (Markdown, XQuery, CSS, sTex) tests in central testsuite.\n*   Add a [`CodeMirror.version`](https://codemirror.net/doc/manual.html#version) property.\n*   More robust handling of nested modes in [formatting](https://codemirror.net/demo/formatting.html) and [closetag](https://codemirror.net/demo/closetag.html) plug-ins.\n*   Un/redo now preserves [marked text](https://codemirror.net/doc/manual.html#markText) and bookmarks.\n*   [Full list](https://github.com/codemirror/CodeMirror/compare/v2.33...v2.34) of patches.\n\n## 2.33.0 (2012-08-23)\n\n*   New mode: [Sieve](https://codemirror.net/mode/sieve/index.html).\n*   New [`getViewPort`](https://codemirror.net/doc/manual.html#getViewport) and [`onViewportChange`](https://codemirror.net/doc/manual.html#option_onViewportChange) API.\n*   [Configurable](https://codemirror.net/doc/manual.html#option_cursorBlinkRate) cursor blink rate.\n*   Make binding a key to `false` disabling handling (again).\n*   Show non-printing characters as red dots.\n*   More tweaks to the scrolling model.\n*   Expanded testsuite. Basic linter added.\n*   Remove most uses of `innerHTML`. Remove `CodeMirror.htmlEscape`.\n*   [Full list](https://github.com/codemirror/CodeMirror/compare/v2.32...v2.33) of patches.\n\n## 2.32.0 (2012-07-23)\n\nEmergency fix for a bug where an editor with line wrapping on IE will break when there is _no_ scrollbar.\n\n## 2.31.0 (2012-07-20)\n\n*   New modes: [OCaml](https://codemirror.net/mode/ocaml/index.html), [Haxe](https://codemirror.net/mode/haxe/index.html), and [VB.NET](https://codemirror.net/mode/vb/index.html).\n*   Several fixes to the new scrolling model.\n*   Add a [`setSize`](https://codemirror.net/doc/manual.html#setSize) method for programmatic resizing.\n*   Add [`getHistory`](https://codemirror.net/doc/manual.html#getHistory) and [`setHistory`](https://codemirror.net/doc/manual.html#setHistory) methods.\n*   Allow custom line separator string in [`getValue`](https://codemirror.net/doc/manual.html#getValue) and [`getRange`](https://codemirror.net/doc/manual.html#getRange).\n*   Support double- and triple-click drag, double-clicking whitespace.\n*   And more... [(all patches)](https://github.com/codemirror/CodeMirror/compare/v2.3...v2.31)\n\n## 2.30.0 (2012-06-22)\n\n*   **New scrollbar implementation**. Should flicker less. Changes DOM structure of the editor.\n*   New theme: [vibrant-ink](https://codemirror.net/demo/theme.html#vibrant-ink).\n*   Many extensions to the VIM keymap (including text objects).\n*   Add [mode-multiplexing](https://codemirror.net/demo/multiplex.html) utility script.\n*   Fix bug where right-click paste works in read-only mode.\n*   Add a [`getScrollInfo`](https://codemirror.net/doc/manual.html#getScrollInfo) method.\n*   Lots of other [fixes](https://github.com/codemirror/CodeMirror/compare/v2.25...v2.3).\n\n## 2.25.0 (2012-05-23)\n\n*   New mode: [Erlang](https://codemirror.net/mode/erlang/index.html).\n*   **Remove xmlpure mode** (use [xml.js](https://codemirror.net/mode/xml/index.html)).\n*   Fix line-wrapping in Opera.\n*   Fix X Windows middle-click paste in Chrome.\n*   Fix bug that broke pasting of huge documents.\n*   Fix backspace and tab key repeat in Opera.\n\n## 2.24.0 (2012-04-23)\n\n*   **Drop support for Internet Explorer 6**.\n*   New modes: [Shell](https://codemirror.net/mode/shell/index.html), [Tiki wiki](https://codemirror.net/mode/tiki/index.html), [Pig Latin](https://codemirror.net/mode/pig/index.html).\n*   New themes: [Ambiance](https://codemirror.net/demo/theme.html#ambiance), [Blackboard](https://codemirror.net/demo/theme.html#blackboard).\n*   More control over drag/drop with [`dragDrop`](https://codemirror.net/doc/manual.html#option_dragDrop) and [`onDragEvent`](https://codemirror.net/doc/manual.html#option_onDragEvent) options.\n*   Make HTML mode a bit less pedantic.\n*   Add [`compoundChange`](https://codemirror.net/doc/manual.html#compoundChange) API method.\n*   Several fixes in undo history and line hiding.\n*   Remove (broken) support for `catchall` in key maps, add `nofallthrough` boolean field instead.\n\n## 2.23.0 (2012-03-26)\n\n*   Change **default binding for tab**. Starting in 2.23, these bindings are default:\n    *   Tab: Insert tab character\n    *   Shift-tab: Reset line indentation to default\n    *   Ctrl/Cmd-[: Reduce line indentation (old tab behaviour)\n    *   Ctrl/Cmd-]: Increase line indentation (old shift-tab behaviour)\n*   New modes: [XQuery](https://codemirror.net/mode/xquery/index.html) and [VBScript](https://codemirror.net/mode/vbscript/index.html).\n*   Two new themes: [lesser-dark](https://codemirror.net/mode/less/index.html) and [xq-dark](https://codemirror.net/mode/xquery/index.html).\n*   Differentiate between background and text styles in [`setLineClass`](https://codemirror.net/doc/manual.html#setLineClass).\n*   Fix drag-and-drop in IE9+.\n*   Extend [`charCoords`](https://codemirror.net/doc/manual.html#charCoords) and [`cursorCoords`](https://codemirror.net/doc/manual.html#cursorCoords) with a `mode` argument.\n*   Add [`autofocus`](https://codemirror.net/doc/manual.html#option_autofocus) option.\n*   Add [`findMarksAt`](https://codemirror.net/doc/manual.html#findMarksAt) method.\n\n## 2.22.0 (2012-02-27)\n\n*   Allow [key handlers](https://codemirror.net/doc/manual.html#keymaps) to pass up events, allow binding characters.\n*   Add [`autoClearEmptyLines`](https://codemirror.net/doc/manual.html#option_autoClearEmptyLines) option.\n*   Properly use tab stops when rendering tabs.\n*   Make PHP mode more robust.\n*   Support indentation blocks in [code folder](https://codemirror.net/doc/manual.html#addon_foldcode).\n*   Add a script for [highlighting instances of the selection](https://codemirror.net/doc/manual.html#addon_match-highlighter).\n*   New [.properties](https://codemirror.net/mode/properties/index.html) mode.\n*   Fix many bugs.\n\n## 2.21.0 (2012-01-27)\n\n*   Added [LESS](https://codemirror.net/mode/less/index.html), [MySQL](https://codemirror.net/mode/mysql/index.html), [Go](https://codemirror.net/mode/go/index.html), and [Verilog](https://codemirror.net/mode/verilog/index.html) modes.\n*   Add [`smartIndent`](https://codemirror.net/doc/manual.html#option_smartIndent) option.\n*   Support a cursor in [`readOnly`](https://codemirror.net/doc/manual.html#option_readOnly)-mode.\n*   Support assigning multiple styles to a token.\n*   Use a new approach to drawing the selection.\n*   Add [`scrollTo`](https://codemirror.net/doc/manual.html#scrollTo) method.\n*   Allow undo/redo events to span non-adjacent lines.\n*   Lots and lots of bugfixes.\n\n## 2.20.0 (2011-12-20)\n\n*   Slightly incompatible API changes. Read [this](https://codemirror.net/doc/upgrade_v2.2.html).\n*   New approach to [binding](https://codemirror.net/doc/manual.html#option_extraKeys) keys, support for [custom bindings](https://codemirror.net/doc/manual.html#option_keyMap).\n*   Support for overwrite (insert).\n*   [Custom-width](https://codemirror.net/doc/manual.html#option_tabSize) and [styleable](https://codemirror.net/demo/visibletabs.html) tabs.\n*   Moved more code into [add-on scripts](https://codemirror.net/doc/manual.html#addons).\n*   Support for sane vertical cursor movement in wrapped lines.\n*   More reliable handling of editing [marked text](https://codemirror.net/doc/manual.html#markText).\n*   Add minimal [emacs](https://codemirror.net/demo/emacs.html) and [vim](https://codemirror.net/demo/vim.html) bindings.\n*   Rename `coordsFromIndex` to [`posFromIndex`](https://codemirror.net/doc/manual.html#posFromIndex), add [`indexFromPos`](https://codemirror.net/doc/manual.html#indexFromPos) method.\n\n## 2.18.0 (2011-11-21)\n\nFixes `TextMarker.clear`, which is broken in 2.17.\n\n## 2.17.0 (2011-11-21)\n\n*   Add support for [line wrapping](https://codemirror.net/doc/manual.html#option_lineWrapping) and [code folding](https://codemirror.net/doc/manual.html#hideLine).\n*   Add [GitHub-style Markdown](https://codemirror.net/mode/gfm/index.html) mode.\n*   Add [Monokai](https://codemirror.net/theme/monokai.css) and [Rubyblue](https://codemirror.net/theme/rubyblue.css) themes.\n*   Add [`setBookmark`](https://codemirror.net/doc/manual.html#setBookmark) method.\n*   Move some of the demo code into reusable components under [`lib/util`](https://codemirror.net/addon/).\n*   Make screen-coord-finding code faster and more reliable.\n*   Fix drag-and-drop in Firefox.\n*   Improve support for IME.\n*   Speed up content rendering.\n*   Fix browser's built-in search in Webkit.\n*   Make double- and triple-click work in IE.\n*   Various fixes to modes.\n\n## 2.16.0 (2011-10-27)\n\n*   Add [Perl](https://codemirror.net/mode/perl/index.html), [Rust](https://codemirror.net/mode/rust/index.html), [TiddlyWiki](https://codemirror.net/mode/tiddlywiki/index.html), and [Groovy](https://codemirror.net/mode/groovy/index.html) modes.\n*   Dragging text inside the editor now moves, rather than copies.\n*   Add a [`coordsFromIndex`](https://codemirror.net/doc/manual.html#coordsFromIndex) method.\n*   **API change**: `setValue` now no longer clears history. Use [`clearHistory`](https://codemirror.net/doc/manual.html#clearHistory) for that.\n*   **API change**: [`markText`](https://codemirror.net/doc/manual.html#markText) now returns an object with `clear` and `find` methods. Marked text is now more robust when edited.\n*   Fix editing code with tabs in Internet Explorer.\n\n## 2.15.0 (2011-09-26)\n\nFix bug that snuck into 2.14: Clicking the character that currently has the cursor didn't re-focus the editor.\n\n## 2.14.0 (2011-09-26)\n\n*   Add [Clojure](https://codemirror.net/mode/clojure/index.html), [Pascal](https://codemirror.net/mode/pascal/index.html), [NTriples](https://codemirror.net/mode/ntriples/index.html), [Jinja2](https://codemirror.net/mode/jinja2/index.html), and [Markdown](https://codemirror.net/mode/markdown/index.html) modes.\n*   Add [Cobalt](https://codemirror.net/theme/cobalt.css) and [Eclipse](https://codemirror.net/theme/eclipse.css) themes.\n*   Add a [`fixedGutter`](https://codemirror.net/doc/manual.html#option_fixedGutter) option.\n*   Fix bug with `setValue` breaking cursor movement.\n*   Make gutter updates much more efficient.\n*   Allow dragging of text out of the editor (on modern browsers).\n\n## 2.13.0 (2011-08-23)\n\n*   Add [Ruby](https://codemirror.net/mode/ruby/index.html), [R](https://codemirror.net/mode/r/index.html), [CoffeeScript](https://codemirror.net/mode/coffeescript/index.html), and [Velocity](https://codemirror.net/mode/velocity/index.html) modes.\n*   Add [`getGutterElement`](https://codemirror.net/doc/manual.html#getGutterElement) to API.\n*   Several fixes to scrolling and positioning.\n*   Add [`smartHome`](https://codemirror.net/doc/manual.html#option_smartHome) option.\n*   Add an experimental [pure XML](https://codemirror.net/mode/xmlpure/index.html) mode.\n\n## 2.12.0 (2011-07-25)\n\n*   Add a [SPARQL](https://codemirror.net/mode/sparql/index.html) mode.\n*   Fix bug with cursor jumping around in an unfocused editor in IE.\n*   Allow key and mouse events to bubble out of the editor. Ignore widget clicks.\n*   Solve cursor flakiness after undo/redo.\n*   Fix block-reindent ignoring the last few lines.\n*   Fix parsing of multi-line attrs in XML mode.\n*   Use `innerHTML` for HTML-escaping.\n*   Some fixes to indentation in C-like mode.\n*   Shrink horiz scrollbars when long lines removed.\n*   Fix width feedback loop bug that caused the width of an inner DIV to shrink.\n\n## 2.11.0 (2011-07-04)\n\n*   Add a [Scheme mode](https://codemirror.net/mode/scheme/index.html).\n*   Add a `replace` method to search cursors, for cursor-preserving replacements.\n*   Make the [C-like mode](https://codemirror.net/mode/clike/index.html) mode more customizable.\n*   Update XML mode to spot mismatched tags.\n*   Add `getStateAfter` API and `compareState` mode API methods for finer-grained mode magic.\n*   Add a `getScrollerElement` API method to manipulate the scrolling DIV.\n*   Fix drag-and-drop for Firefox.\n*   Add a C# configuration for the [C-like mode](https://codemirror.net/mode/clike/index.html).\n*   Add [full-screen editing](https://codemirror.net/demo/fullscreen.html) and [mode-changing](https://codemirror.net/demo/changemode.html) demos.\n\n## 2.10.0 (2011-06-07)\n\nAdd a [theme](https://codemirror.net/doc/manual.html#option_theme) system ([demo](https://codemirror.net/demo/theme.html)). Note that this is not backwards-compatible—you'll have to update your styles and modes!\n\n## 2.2.0 (2011-06-07)\n\n*   Add a [Lua mode](https://codemirror.net/mode/lua/index.html).\n*   Fix reverse-searching for a regexp.\n*   Empty lines can no longer break highlighting.\n*   Rework scrolling model (the outer wrapper no longer does the scrolling).\n*   Solve horizontal jittering on long lines.\n*   Add [runmode.js](https://codemirror.net/demo/runmode.html).\n*   Immediately re-highlight text when typing.\n*   Fix problem with 'sticking' horizontal scrollbar.\n\n## 2.1.0 (2011-05-26)\n\n*   Add a [Smalltalk mode](https://codemirror.net/mode/smalltalk/index.html).\n*   Add a [reStructuredText mode](https://codemirror.net/mode/rst/index.html).\n*   Add a [Python mode](https://codemirror.net/mode/python/index.html).\n*   Add a [PL/SQL mode](https://codemirror.net/mode/plsql/index.html).\n*   `coordsChar` now works\n*   Fix a problem where `onCursorActivity` interfered with `onChange`.\n*   Fix a number of scrolling and mouse-click-position glitches.\n*   Pass information about the changed lines to `onChange`.\n*   Support cmd-up/down on OS X.\n*   Add triple-click line selection.\n*   Don't handle shift when changing the selection through the API.\n*   Support `\"nocursor\"` mode for `readOnly` option.\n*   Add an `onHighlightComplete` option.\n*   Fix the context menu for Firefox.\n\n## 2.0.0 (2011-03-28)\n\nCodeMirror 2 is a complete rewrite that's faster, smaller, simpler to use, and less dependent on browser quirks. See [this](https://codemirror.net/doc/internals.html) and [this](http://groups.google.com/group/codemirror/browse_thread/thread/5a8e894024a9f580) for more information.\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/CONTRIBUTING.md",
    "content": "# How to contribute\n\n- [Getting help](#getting-help)\n- [Submitting bug reports](#submitting-bug-reports)\n- [Contributing code](#contributing-code)\n\n## Getting help\n\nCommunity discussion, questions, and informal bug reporting is done on the\n[discuss.CodeMirror forum](http://discuss.codemirror.net).\n\n## Submitting bug reports\n\nThe preferred way to report bugs is to use the\n[GitHub issue tracker](http://github.com/codemirror/CodeMirror/issues). Before\nreporting a bug, read these pointers.\n\n**Note:** The issue tracker is for *bugs*, not requests for help. Questions\nshould be asked on the\n[discuss.CodeMirror forum](http://discuss.codemirror.net) instead.\n\n### Reporting bugs effectively\n\n- CodeMirror is maintained by volunteers. They don't owe you anything, so be\n  polite. Reports with an indignant or belligerent tone tend to be moved to the\n  bottom of the pile.\n\n- Include information about **the browser in which the problem occurred**. Even\n  if you tested several browsers, and the problem occurred in all of them,\n  mention this fact in the bug report. Also include browser version numbers and\n  the operating system that you're on.\n\n- Mention which release of CodeMirror you're using. Preferably, try also with\n  the current development snapshot, to ensure the problem has not already been\n  fixed.\n\n- Mention very precisely what went wrong. \"X is broken\" is not a good bug\n  report. What did you expect to happen? What happened instead? Describe the\n  exact steps a maintainer has to take to make the problem occur. We can not\n  fix something that we can not observe.\n\n- If the problem can not be reproduced in any of the demos included in the\n  CodeMirror distribution, please provide an HTML document that demonstrates\n  the problem. The best way to do this is to go to\n  [jsbin.com](http://jsbin.com/ihunin/edit), enter it there, press save, and\n  include the resulting link in your bug report.\n\n## Contributing code\n\nNote that we are not accepting any new addons or modes into the main\ndistribution. If you've written such a module, please distribute it as\na separate NPM package.\n\n- Make sure you have a [GitHub Account](https://github.com/signup/free)\n- Fork [CodeMirror](https://github.com/codemirror/CodeMirror/)\n  ([how to fork a repo](https://help.github.com/articles/fork-a-repo))\n- Make your changes\n- If your changes are easy to test or likely to regress, add tests.\n  Tests for the core go into `test/test.js`, some modes have their own\n  test suite under `mode/XXX/test.js`. Feel free to add new test\n  suites to modes that don't have one yet (be sure to link the new\n  tests into `test/index.html`).\n- Follow the general code style of the rest of the project (see\n  below). Run `bin/lint` to verify that the linter is happy.\n- Make sure all tests pass. Visit `test/index.html` in your browser to\n  run them.\n- Submit a pull request\n([how to create a pull request](https://help.github.com/articles/fork-a-repo)).\n  Don't put more than one feature/fix in a single pull request.\n\nBy contributing code to CodeMirror you\n\n - agree to license the contributed code under CodeMirror's [MIT\n   license](https://codemirror.net/LICENSE).\n\n - confirm that you have the right to contribute and license the code\n   in question. (Either you hold all rights on the code, or the rights\n   holder has explicitly granted the right to use it like this,\n   through a compatible open source license or through a direct\n   agreement with you.)\n\n### Coding standards\n\n- 2 spaces per indentation level, no tabs.\n\n- Note that the linter (`bin/lint`) which is run after each commit\n  complains about unused variables and functions. Prefix their names\n  with an underscore to muffle it.\n\n- CodeMirror does *not* follow JSHint or JSLint prescribed style.\n  Patches that try to 'fix' code to pass one of these linters will be\n  unceremoniously discarded.\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/LICENSE",
    "content": "MIT License\n\nCopyright (C) 2017 by Marijn Haverbeke <marijnh@gmail.com> and others\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/README.md",
    "content": "# CodeMirror\n\n[![Build Status](https://github.com/codemirror/codemirror/workflows/main/badge.svg)](https://github.com/codemirror/codemirror/actions)\n[![NPM version](https://img.shields.io/npm/v/codemirror.svg)](https://www.npmjs.org/package/codemirror)\n\nCodeMirror is a versatile text editor implemented in JavaScript for\nthe browser. It is specialized for editing code, and comes with over\n100 language modes and various addons that implement more advanced\nediting functionality. Every language comes with fully-featured code\nand syntax highlighting to help with reading and editing complex code.\n\nA rich programming API and a CSS theming system are available for\ncustomizing CodeMirror to fit your application, and extending it with\nnew functionality.\n\nYou can find more information (and the\n[manual](https://codemirror.net/doc/manual.html)) on the [project\npage](https://codemirror.net). For questions and discussion, use the\n[discussion forum](https://discuss.codemirror.net/).\n\nSee\n[CONTRIBUTING.md](https://github.com/codemirror/CodeMirror/blob/master/CONTRIBUTING.md)\nfor contributing guidelines.\n\nThe CodeMirror community aims to be welcoming to everybody. We use the\n[Contributor Covenant\n(1.1)](http://contributor-covenant.org/version/1/1/0/) as our code of\nconduct.\n\n### Installation\n\nEither get the [zip file](https://codemirror.net/codemirror.zip) with\nthe latest version, or make sure you have [Node](https://nodejs.org/)\ninstalled and run:\n\n    npm install codemirror\n\n**NOTE**: This is the source repository for the library, and not the\ndistribution channel. Cloning it is not the recommended way to install\nthe library, and will in fact not work unless you also run the build\nstep.\n\n### Quickstart\n\nTo build the project, make sure you have Node.js installed (at least version 6)\nand then `npm install`. To run, just open `index.html` in your\nbrowser (you don't need to run a webserver). Run the tests with `npm test`.\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/comment/comment.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var noOptions = {};\n  var nonWS = /[^\\s\\u00a0]/;\n  var Pos = CodeMirror.Pos, cmp = CodeMirror.cmpPos;\n\n  function firstNonWS(str) {\n    var found = str.search(nonWS);\n    return found == -1 ? 0 : found;\n  }\n\n  CodeMirror.commands.toggleComment = function(cm) {\n    cm.toggleComment();\n  };\n\n  CodeMirror.defineExtension(\"toggleComment\", function(options) {\n    if (!options) options = noOptions;\n    var cm = this;\n    var minLine = Infinity, ranges = this.listSelections(), mode = null;\n    for (var i = ranges.length - 1; i >= 0; i--) {\n      var from = ranges[i].from(), to = ranges[i].to();\n      if (from.line >= minLine) continue;\n      if (to.line >= minLine) to = Pos(minLine, 0);\n      minLine = from.line;\n      if (mode == null) {\n        if (cm.uncomment(from, to, options)) mode = \"un\";\n        else { cm.lineComment(from, to, options); mode = \"line\"; }\n      } else if (mode == \"un\") {\n        cm.uncomment(from, to, options);\n      } else {\n        cm.lineComment(from, to, options);\n      }\n    }\n  });\n\n  // Rough heuristic to try and detect lines that are part of multi-line string\n  function probablyInsideString(cm, pos, line) {\n    return /\\bstring\\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\\'\\\"\\`]/.test(line)\n  }\n\n  function getMode(cm, pos) {\n    var mode = cm.getMode()\n    return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos)\n  }\n\n  CodeMirror.defineExtension(\"lineComment\", function(from, to, options) {\n    if (!options) options = noOptions;\n    var self = this, mode = getMode(self, from);\n    var firstLine = self.getLine(from.line);\n    if (firstLine == null || probablyInsideString(self, from, firstLine)) return;\n\n    var commentString = options.lineComment || mode.lineComment;\n    if (!commentString) {\n      if (options.blockCommentStart || mode.blockCommentStart) {\n        options.fullLines = true;\n        self.blockComment(from, to, options);\n      }\n      return;\n    }\n\n    var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);\n    var pad = options.padding == null ? \" \" : options.padding;\n    var blankLines = options.commentBlankLines || from.line == to.line;\n\n    self.operation(function() {\n      if (options.indent) {\n        var baseString = null;\n        for (var i = from.line; i < end; ++i) {\n          var line = self.getLine(i);\n          var whitespace = line.slice(0, firstNonWS(line));\n          if (baseString == null || baseString.length > whitespace.length) {\n            baseString = whitespace;\n          }\n        }\n        for (var i = from.line; i < end; ++i) {\n          var line = self.getLine(i), cut = baseString.length;\n          if (!blankLines && !nonWS.test(line)) continue;\n          if (line.slice(0, cut) != baseString) cut = firstNonWS(line);\n          self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut));\n        }\n      } else {\n        for (var i = from.line; i < end; ++i) {\n          if (blankLines || nonWS.test(self.getLine(i)))\n            self.replaceRange(commentString + pad, Pos(i, 0));\n        }\n      }\n    });\n  });\n\n  CodeMirror.defineExtension(\"blockComment\", function(from, to, options) {\n    if (!options) options = noOptions;\n    var self = this, mode = getMode(self, from);\n    var startString = options.blockCommentStart || mode.blockCommentStart;\n    var endString = options.blockCommentEnd || mode.blockCommentEnd;\n    if (!startString || !endString) {\n      if ((options.lineComment || mode.lineComment) && options.fullLines != false)\n        self.lineComment(from, to, options);\n      return;\n    }\n    if (/\\bcomment\\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return\n\n    var end = Math.min(to.line, self.lastLine());\n    if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end;\n\n    var pad = options.padding == null ? \" \" : options.padding;\n    if (from.line > end) return;\n\n    self.operation(function() {\n      if (options.fullLines != false) {\n        var lastLineHasText = nonWS.test(self.getLine(end));\n        self.replaceRange(pad + endString, Pos(end));\n        self.replaceRange(startString + pad, Pos(from.line, 0));\n        var lead = options.blockCommentLead || mode.blockCommentLead;\n        if (lead != null) for (var i = from.line + 1; i <= end; ++i)\n          if (i != end || lastLineHasText)\n            self.replaceRange(lead + pad, Pos(i, 0));\n      } else {\n        var atCursor = cmp(self.getCursor(\"to\"), to) == 0, empty = !self.somethingSelected()\n        self.replaceRange(endString, to);\n        if (atCursor) self.setSelection(empty ? to : self.getCursor(\"from\"), to)\n        self.replaceRange(startString, from);\n      }\n    });\n  });\n\n  CodeMirror.defineExtension(\"uncomment\", function(from, to, options) {\n    if (!options) options = noOptions;\n    var self = this, mode = getMode(self, from);\n    var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end);\n\n    // Try finding line comments\n    var lineString = options.lineComment || mode.lineComment, lines = [];\n    var pad = options.padding == null ? \" \" : options.padding, didSomething;\n    lineComment: {\n      if (!lineString) break lineComment;\n      for (var i = start; i <= end; ++i) {\n        var line = self.getLine(i);\n        var found = line.indexOf(lineString);\n        if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1;\n        if (found == -1 && nonWS.test(line)) break lineComment;\n        if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment;\n        lines.push(line);\n      }\n      self.operation(function() {\n        for (var i = start; i <= end; ++i) {\n          var line = lines[i - start];\n          var pos = line.indexOf(lineString), endPos = pos + lineString.length;\n          if (pos < 0) continue;\n          if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length;\n          didSomething = true;\n          self.replaceRange(\"\", Pos(i, pos), Pos(i, endPos));\n        }\n      });\n      if (didSomething) return true;\n    }\n\n    // Try block comments\n    var startString = options.blockCommentStart || mode.blockCommentStart;\n    var endString = options.blockCommentEnd || mode.blockCommentEnd;\n    if (!startString || !endString) return false;\n    var lead = options.blockCommentLead || mode.blockCommentLead;\n    var startLine = self.getLine(start), open = startLine.indexOf(startString)\n    if (open == -1) return false\n    var endLine = end == start ? startLine : self.getLine(end)\n    var close = endLine.indexOf(endString, end == start ? open + startString.length : 0);\n    var insideStart = Pos(start, open + 1), insideEnd = Pos(end, close + 1)\n    if (close == -1 ||\n        !/comment/.test(self.getTokenTypeAt(insideStart)) ||\n        !/comment/.test(self.getTokenTypeAt(insideEnd)) ||\n        self.getRange(insideStart, insideEnd, \"\\n\").indexOf(endString) > -1)\n      return false;\n\n    // Avoid killing block comments completely outside the selection.\n    // Positions of the last startString before the start of the selection, and the first endString after it.\n    var lastStart = startLine.lastIndexOf(startString, from.ch);\n    var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length);\n    if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false;\n    // Positions of the first endString after the end of the selection, and the last startString before it.\n    firstEnd = endLine.indexOf(endString, to.ch);\n    var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch);\n    lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart;\n    if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false;\n\n    self.operation(function() {\n      self.replaceRange(\"\", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)),\n                        Pos(end, close + endString.length));\n      var openEnd = open + startString.length;\n      if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length;\n      self.replaceRange(\"\", Pos(start, open), Pos(start, openEnd));\n      if (lead) for (var i = start + 1; i <= end; ++i) {\n        var line = self.getLine(i), found = line.indexOf(lead);\n        if (found == -1 || nonWS.test(line.slice(0, found))) continue;\n        var foundEnd = found + lead.length;\n        if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length;\n        self.replaceRange(\"\", Pos(i, found), Pos(i, foundEnd));\n      }\n    });\n    return true;\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/comment/continuecomment.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var nonspace = /\\S/g;\n  var repeat = String.prototype.repeat || function (n) { return Array(n + 1).join(this); };\n  function continueComment(cm) {\n    if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n    var ranges = cm.listSelections(), mode, inserts = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var pos = ranges[i].head\n      if (!/\\bcomment\\b/.test(cm.getTokenTypeAt(pos))) return CodeMirror.Pass;\n      var modeHere = cm.getModeAt(pos)\n      if (!mode) mode = modeHere;\n      else if (mode != modeHere) return CodeMirror.Pass;\n\n      var insert = null, line, found;\n      var blockStart = mode.blockCommentStart, lineCmt = mode.lineComment;\n      if (blockStart && mode.blockCommentContinue) {\n        line = cm.getLine(pos.line);\n        var end = line.lastIndexOf(mode.blockCommentEnd, pos.ch - mode.blockCommentEnd.length);\n        // 1. if this block comment ended\n        // 2. if this is actually inside a line comment\n        if (end != -1 && end == pos.ch - mode.blockCommentEnd.length ||\n            lineCmt && (found = line.lastIndexOf(lineCmt, pos.ch - 1)) > -1 &&\n            /\\bcomment\\b/.test(cm.getTokenTypeAt({line: pos.line, ch: found + 1}))) {\n          // ...then don't continue it\n        } else if (pos.ch >= blockStart.length &&\n                   (found = line.lastIndexOf(blockStart, pos.ch - blockStart.length)) > -1 &&\n                   found > end) {\n          // reuse the existing leading spaces/tabs/mixed\n          // or build the correct indent using CM's tab/indent options\n          if (nonspaceAfter(0, line) >= found) {\n            insert = line.slice(0, found);\n          } else {\n            var tabSize = cm.options.tabSize, numTabs;\n            found = CodeMirror.countColumn(line, found, tabSize);\n            insert = !cm.options.indentWithTabs ? repeat.call(\" \", found) :\n              repeat.call(\"\\t\", (numTabs = Math.floor(found / tabSize))) +\n              repeat.call(\" \", found - tabSize * numTabs);\n          }\n        } else if ((found = line.indexOf(mode.blockCommentContinue)) > -1 &&\n                   found <= pos.ch &&\n                   found <= nonspaceAfter(0, line)) {\n          insert = line.slice(0, found);\n        }\n        if (insert != null) insert += mode.blockCommentContinue\n      }\n      if (insert == null && lineCmt && continueLineCommentEnabled(cm)) {\n        if (line == null) line = cm.getLine(pos.line);\n        found = line.indexOf(lineCmt);\n        // cursor at pos 0, line comment also at pos 0 => shift it down, don't continue\n        if (!pos.ch && !found) insert = \"\";\n        // continue only if the line starts with an optional space + line comment\n        else if (found > -1 && nonspaceAfter(0, line) >= found) {\n          // don't continue if there's only space(s) after cursor or the end of the line\n          insert = nonspaceAfter(pos.ch, line) > -1;\n          // but always continue if the next line starts with a line comment too\n          if (!insert) {\n            var next = cm.getLine(pos.line + 1) || '',\n                nextFound = next.indexOf(lineCmt);\n            insert = nextFound > -1 && nonspaceAfter(0, next) >= nextFound || null;\n          }\n          if (insert) {\n            insert = line.slice(0, found) + lineCmt +\n                     line.slice(found + lineCmt.length).match(/^\\s*/)[0];\n          }\n        }\n      }\n      if (insert == null) return CodeMirror.Pass;\n      inserts[i] = \"\\n\" + insert;\n    }\n\n    cm.operation(function() {\n      for (var i = ranges.length - 1; i >= 0; i--)\n        cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), \"+insert\");\n    });\n  }\n\n  function nonspaceAfter(ch, str) {\n    nonspace.lastIndex = ch;\n    var m = nonspace.exec(str);\n    return m ? m.index : -1;\n  }\n\n  function continueLineCommentEnabled(cm) {\n    var opt = cm.getOption(\"continueComments\");\n    if (opt && typeof opt == \"object\")\n      return opt.continueLineComment !== false;\n    return true;\n  }\n\n  CodeMirror.defineOption(\"continueComments\", null, function(cm, val, prev) {\n    if (prev && prev != CodeMirror.Init)\n      cm.removeKeyMap(\"continueComment\");\n    if (val) {\n      var key = \"Enter\";\n      if (typeof val == \"string\")\n        key = val;\n      else if (typeof val == \"object\" && val.key)\n        key = val.key;\n      var map = {name: \"continueComment\"};\n      map[key] = continueComment;\n      cm.addKeyMap(map);\n    }\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/dialog/dialog.css",
    "content": ".CodeMirror-dialog {\n  position: absolute;\n  left: 0; right: 0;\n  background: inherit;\n  z-index: 15;\n  padding: .1em .8em;\n  overflow: hidden;\n  color: inherit;\n}\n\n.CodeMirror-dialog-top {\n  border-bottom: 1px solid #eee;\n  top: 0;\n}\n\n.CodeMirror-dialog-bottom {\n  border-top: 1px solid #eee;\n  bottom: 0;\n}\n\n.CodeMirror-dialog input {\n  border: none;\n  outline: none;\n  background: transparent;\n  width: 20em;\n  color: inherit;\n  font-family: monospace;\n}\n\n.CodeMirror-dialog button {\n  font-size: 70%;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/dialog/dialog.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Open simple dialogs on top of an editor. Relies on dialog.css.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  function dialogDiv(cm, template, bottom) {\n    var wrap = cm.getWrapperElement();\n    var dialog;\n    dialog = wrap.appendChild(document.createElement(\"div\"));\n    if (bottom)\n      dialog.className = \"CodeMirror-dialog CodeMirror-dialog-bottom\";\n    else\n      dialog.className = \"CodeMirror-dialog CodeMirror-dialog-top\";\n\n    if (typeof template == \"string\") {\n      dialog.innerHTML = template;\n    } else { // Assuming it's a detached DOM element.\n      dialog.appendChild(template);\n    }\n    CodeMirror.addClass(wrap, 'dialog-opened');\n    return dialog;\n  }\n\n  function closeNotification(cm, newVal) {\n    if (cm.state.currentNotificationClose)\n      cm.state.currentNotificationClose();\n    cm.state.currentNotificationClose = newVal;\n  }\n\n  CodeMirror.defineExtension(\"openDialog\", function(template, callback, options) {\n    if (!options) options = {};\n\n    closeNotification(this, null);\n\n    var dialog = dialogDiv(this, template, options.bottom);\n    var closed = false, me = this;\n    function close(newVal) {\n      if (typeof newVal == 'string') {\n        inp.value = newVal;\n      } else {\n        if (closed) return;\n        closed = true;\n        CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');\n        dialog.parentNode.removeChild(dialog);\n        me.focus();\n\n        if (options.onClose) options.onClose(dialog);\n      }\n    }\n\n    var inp = dialog.getElementsByTagName(\"input\")[0], button;\n    if (inp) {\n      inp.focus();\n\n      if (options.value) {\n        inp.value = options.value;\n        if (options.selectValueOnOpen !== false) {\n          inp.select();\n        }\n      }\n\n      if (options.onInput)\n        CodeMirror.on(inp, \"input\", function(e) { options.onInput(e, inp.value, close);});\n      if (options.onKeyUp)\n        CodeMirror.on(inp, \"keyup\", function(e) {options.onKeyUp(e, inp.value, close);});\n\n      CodeMirror.on(inp, \"keydown\", function(e) {\n        if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }\n        if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {\n          inp.blur();\n          CodeMirror.e_stop(e);\n          close();\n        }\n        if (e.keyCode == 13) callback(inp.value, e);\n      });\n\n      if (options.closeOnBlur !== false) CodeMirror.on(dialog, \"focusout\", function (evt) {\n        if (evt.relatedTarget !== null) close();\n      });\n    } else if (button = dialog.getElementsByTagName(\"button\")[0]) {\n      CodeMirror.on(button, \"click\", function() {\n        close();\n        me.focus();\n      });\n\n      if (options.closeOnBlur !== false) CodeMirror.on(button, \"blur\", close);\n\n      button.focus();\n    }\n    return close;\n  });\n\n  CodeMirror.defineExtension(\"openConfirm\", function(template, callbacks, options) {\n    closeNotification(this, null);\n    var dialog = dialogDiv(this, template, options && options.bottom);\n    var buttons = dialog.getElementsByTagName(\"button\");\n    var closed = false, me = this, blurring = 1;\n    function close() {\n      if (closed) return;\n      closed = true;\n      CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');\n      dialog.parentNode.removeChild(dialog);\n      me.focus();\n    }\n    buttons[0].focus();\n    for (var i = 0; i < buttons.length; ++i) {\n      var b = buttons[i];\n      (function(callback) {\n        CodeMirror.on(b, \"click\", function(e) {\n          CodeMirror.e_preventDefault(e);\n          close();\n          if (callback) callback(me);\n        });\n      })(callbacks[i]);\n      CodeMirror.on(b, \"blur\", function() {\n        --blurring;\n        setTimeout(function() { if (blurring <= 0) close(); }, 200);\n      });\n      CodeMirror.on(b, \"focus\", function() { ++blurring; });\n    }\n  });\n\n  /*\n   * openNotification\n   * Opens a notification, that can be closed with an optional timer\n   * (default 5000ms timer) and always closes on click.\n   *\n   * If a notification is opened while another is opened, it will close the\n   * currently opened one and open the new one immediately.\n   */\n  CodeMirror.defineExtension(\"openNotification\", function(template, options) {\n    closeNotification(this, close);\n    var dialog = dialogDiv(this, template, options && options.bottom);\n    var closed = false, doneTimer;\n    var duration = options && typeof options.duration !== \"undefined\" ? options.duration : 5000;\n\n    function close() {\n      if (closed) return;\n      closed = true;\n      clearTimeout(doneTimer);\n      CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');\n      dialog.parentNode.removeChild(dialog);\n    }\n\n    CodeMirror.on(dialog, 'click', function(e) {\n      CodeMirror.e_preventDefault(e);\n      close();\n    });\n\n    if (duration)\n      doneTimer = setTimeout(close, duration);\n\n    return close;\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/display/autorefresh.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n\n  CodeMirror.defineOption(\"autoRefresh\", false, function(cm, val) {\n    if (cm.state.autoRefresh) {\n      stopListening(cm, cm.state.autoRefresh)\n      cm.state.autoRefresh = null\n    }\n    if (val && cm.display.wrapper.offsetHeight == 0)\n      startListening(cm, cm.state.autoRefresh = {delay: val.delay || 250})\n  })\n\n  function startListening(cm, state) {\n    function check() {\n      if (cm.display.wrapper.offsetHeight) {\n        stopListening(cm, state)\n        if (cm.display.lastWrapHeight != cm.display.wrapper.clientHeight)\n          cm.refresh()\n      } else {\n        state.timeout = setTimeout(check, state.delay)\n      }\n    }\n    state.timeout = setTimeout(check, state.delay)\n    state.hurry = function() {\n      clearTimeout(state.timeout)\n      state.timeout = setTimeout(check, 50)\n    }\n    CodeMirror.on(window, \"mouseup\", state.hurry)\n    CodeMirror.on(window, \"keyup\", state.hurry)\n  }\n\n  function stopListening(_cm, state) {\n    clearTimeout(state.timeout)\n    CodeMirror.off(window, \"mouseup\", state.hurry)\n    CodeMirror.off(window, \"keyup\", state.hurry)\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/display/fullscreen.css",
    "content": ".CodeMirror-fullscreen {\n  position: fixed;\n  top: 0; left: 0; right: 0; bottom: 0;\n  height: auto;\n  z-index: 9;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/display/fullscreen.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"fullScreen\", false, function(cm, val, old) {\n    if (old == CodeMirror.Init) old = false;\n    if (!old == !val) return;\n    if (val) setFullscreen(cm);\n    else setNormal(cm);\n  });\n\n  function setFullscreen(cm) {\n    var wrap = cm.getWrapperElement();\n    cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,\n                                  width: wrap.style.width, height: wrap.style.height};\n    wrap.style.width = \"\";\n    wrap.style.height = \"auto\";\n    wrap.className += \" CodeMirror-fullscreen\";\n    document.documentElement.style.overflow = \"hidden\";\n    cm.refresh();\n  }\n\n  function setNormal(cm) {\n    var wrap = cm.getWrapperElement();\n    wrap.className = wrap.className.replace(/\\s*CodeMirror-fullscreen\\b/, \"\");\n    document.documentElement.style.overflow = \"\";\n    var info = cm.state.fullScreenRestore;\n    wrap.style.width = info.width; wrap.style.height = info.height;\n    window.scrollTo(info.scrollLeft, info.scrollTop);\n    cm.refresh();\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/display/panel.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function (mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function (CodeMirror) {\n  CodeMirror.defineExtension(\"addPanel\", function (node, options) {\n    options = options || {};\n\n    if (!this.state.panels) initPanels(this);\n\n    var info = this.state.panels;\n    var wrapper = info.wrapper;\n    var cmWrapper = this.getWrapperElement();\n    var replace = options.replace instanceof Panel && !options.replace.cleared;\n\n    if (options.after instanceof Panel && !options.after.cleared) {\n      wrapper.insertBefore(node, options.before.node.nextSibling);\n    } else if (options.before instanceof Panel && !options.before.cleared) {\n      wrapper.insertBefore(node, options.before.node);\n    } else if (replace) {\n      wrapper.insertBefore(node, options.replace.node);\n      options.replace.clear(true);\n    } else if (options.position == \"bottom\") {\n      wrapper.appendChild(node);\n    } else if (options.position == \"before-bottom\") {\n      wrapper.insertBefore(node, cmWrapper.nextSibling);\n    } else if (options.position == \"after-top\") {\n      wrapper.insertBefore(node, cmWrapper);\n    } else {\n      wrapper.insertBefore(node, wrapper.firstChild);\n    }\n\n    var height = (options && options.height) || node.offsetHeight;\n\n    var panel = new Panel(this, node, options, height);\n    info.panels.push(panel);\n\n    this.setSize();\n    if (options.stable && isAtTop(this, node))\n      this.scrollTo(null, this.getScrollInfo().top + height);\n\n    return panel;\n  });\n\n  function Panel(cm, node, options, height) {\n    this.cm = cm;\n    this.node = node;\n    this.options = options;\n    this.height = height;\n    this.cleared = false;\n  }\n\n  /* when skipRemove is true, clear() was called from addPanel().\n   * Thus removePanels() should not be called (issue 5518) */\n  Panel.prototype.clear = function (skipRemove) {\n    if (this.cleared) return;\n    this.cleared = true;\n    var info = this.cm.state.panels;\n    info.panels.splice(info.panels.indexOf(this), 1);\n    this.cm.setSize();\n    if (this.options.stable && isAtTop(this.cm, this.node))\n      this.cm.scrollTo(null, this.cm.getScrollInfo().top - this.height)\n    info.wrapper.removeChild(this.node);\n    if (info.panels.length == 0 && !skipRemove) removePanels(this.cm);\n  };\n\n  Panel.prototype.changed = function () {\n    this.height = this.node.getBoundingClientRect().height;\n    this.cm.setSize();\n  };\n\n  function initPanels(cm) {\n    var wrap = cm.getWrapperElement()\n    var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle;\n    var height = parseInt(style.height);\n    var info = cm.state.panels = {\n      setHeight: wrap.style.height,\n      panels: [],\n      wrapper: document.createElement(\"div\")\n    };\n    var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()\n    wrap.parentNode.insertBefore(info.wrapper, wrap);\n    info.wrapper.appendChild(wrap);\n    cm.scrollTo(scrollPos.left, scrollPos.top)\n    if (hasFocus) cm.focus();\n\n    cm._setSize = cm.setSize;\n    if (height != null) cm.setSize = function (width, newHeight) {\n      if (!newHeight) newHeight = info.wrapper.offsetHeight;\n      info.setHeight = newHeight;\n      if (typeof newHeight != \"number\") {\n        var px = /^(\\d+\\.?\\d*)px$/.exec(newHeight);\n        if (px) {\n          newHeight = Number(px[1]);\n        } else {\n          info.wrapper.style.height = newHeight;\n          newHeight = info.wrapper.offsetHeight;\n        }\n      }\n      var editorheight = newHeight - info.panels\n        .map(function (p) { return p.node.getBoundingClientRect().height; })\n        .reduce(function (a, b) { return a + b; }, 0);\n      cm._setSize(width, editorheight);\n      height = newHeight;\n    };\n  }\n\n  function removePanels(cm) {\n    var info = cm.state.panels;\n    cm.state.panels = null;\n\n    var wrap = cm.getWrapperElement()\n    var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()\n    info.wrapper.parentNode.replaceChild(wrap, info.wrapper);\n    cm.scrollTo(scrollPos.left, scrollPos.top)\n    if (hasFocus) cm.focus();\n    wrap.style.height = info.setHeight;\n    cm.setSize = cm._setSize;\n    cm.setSize();\n  }\n\n  function isAtTop(cm, dom) {\n    for (var sibling = dom.nextSibling; sibling; sibling = sibling.nextSibling)\n      if (sibling == cm.getWrapperElement()) return true\n    return false\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/display/placeholder.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  CodeMirror.defineOption(\"placeholder\", \"\", function(cm, val, old) {\n    var prev = old && old != CodeMirror.Init;\n    if (val && !prev) {\n      cm.on(\"blur\", onBlur);\n      cm.on(\"change\", onChange);\n      cm.on(\"swapDoc\", onChange);\n      CodeMirror.on(cm.getInputField(), \"compositionupdate\", cm.state.placeholderCompose = function() { onComposition(cm) })\n      onChange(cm);\n    } else if (!val && prev) {\n      cm.off(\"blur\", onBlur);\n      cm.off(\"change\", onChange);\n      cm.off(\"swapDoc\", onChange);\n      CodeMirror.off(cm.getInputField(), \"compositionupdate\", cm.state.placeholderCompose)\n      clearPlaceholder(cm);\n      var wrapper = cm.getWrapperElement();\n      wrapper.className = wrapper.className.replace(\" CodeMirror-empty\", \"\");\n    }\n\n    if (val && !cm.hasFocus()) onBlur(cm);\n  });\n\n  function clearPlaceholder(cm) {\n    if (cm.state.placeholder) {\n      cm.state.placeholder.parentNode.removeChild(cm.state.placeholder);\n      cm.state.placeholder = null;\n    }\n  }\n  function setPlaceholder(cm) {\n    clearPlaceholder(cm);\n    var elt = cm.state.placeholder = document.createElement(\"pre\");\n    elt.style.cssText = \"height: 0; overflow: visible\";\n    elt.style.direction = cm.getOption(\"direction\");\n    elt.className = \"CodeMirror-placeholder CodeMirror-line-like\";\n    var placeHolder = cm.getOption(\"placeholder\")\n    if (typeof placeHolder == \"string\") placeHolder = document.createTextNode(placeHolder)\n    elt.appendChild(placeHolder)\n    cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);\n  }\n\n  function onComposition(cm) {\n    setTimeout(function() {\n      var empty = false\n      if (cm.lineCount() == 1) {\n        var input = cm.getInputField()\n        empty = input.nodeName == \"TEXTAREA\" ? !cm.getLine(0).length\n          : !/[^\\u200b]/.test(input.querySelector(\".CodeMirror-line\").textContent)\n      }\n      if (empty) setPlaceholder(cm)\n      else clearPlaceholder(cm)\n    }, 20)\n  }\n\n  function onBlur(cm) {\n    if (isEmpty(cm)) setPlaceholder(cm);\n  }\n  function onChange(cm) {\n    var wrapper = cm.getWrapperElement(), empty = isEmpty(cm);\n    wrapper.className = wrapper.className.replace(\" CodeMirror-empty\", \"\") + (empty ? \" CodeMirror-empty\" : \"\");\n\n    if (empty) setPlaceholder(cm);\n    else clearPlaceholder(cm);\n  }\n\n  function isEmpty(cm) {\n    return (cm.lineCount() === 1) && (cm.getLine(0) === \"\");\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/display/rulers.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"rulers\", false, function(cm, val) {\n    if (cm.state.rulerDiv) {\n      cm.state.rulerDiv.parentElement.removeChild(cm.state.rulerDiv)\n      cm.state.rulerDiv = null\n      cm.off(\"refresh\", drawRulers)\n    }\n    if (val && val.length) {\n      cm.state.rulerDiv = cm.display.lineSpace.parentElement.insertBefore(document.createElement(\"div\"), cm.display.lineSpace)\n      cm.state.rulerDiv.className = \"CodeMirror-rulers\"\n      drawRulers(cm)\n      cm.on(\"refresh\", drawRulers)\n    }\n  });\n\n  function drawRulers(cm) {\n    cm.state.rulerDiv.textContent = \"\"\n    var val = cm.getOption(\"rulers\");\n    var cw = cm.defaultCharWidth();\n    var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), \"div\").left;\n    cm.state.rulerDiv.style.minHeight = (cm.display.scroller.offsetHeight + 30) + \"px\";\n    for (var i = 0; i < val.length; i++) {\n      var elt = document.createElement(\"div\");\n      elt.className = \"CodeMirror-ruler\";\n      var col, conf = val[i];\n      if (typeof conf == \"number\") {\n        col = conf;\n      } else {\n        col = conf.column;\n        if (conf.className) elt.className += \" \" + conf.className;\n        if (conf.color) elt.style.borderColor = conf.color;\n        if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle;\n        if (conf.width) elt.style.borderLeftWidth = conf.width;\n      }\n      elt.style.left = (left + col * cw) + \"px\";\n      cm.state.rulerDiv.appendChild(elt)\n    }\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/edit/closebrackets.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var defaults = {\n    pairs: \"()[]{}''\\\"\\\"\",\n    closeBefore: \")]}'\\\":;>\",\n    triples: \"\",\n    explode: \"[]{}\"\n  };\n\n  var Pos = CodeMirror.Pos;\n\n  CodeMirror.defineOption(\"autoCloseBrackets\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.removeKeyMap(keyMap);\n      cm.state.closeBrackets = null;\n    }\n    if (val) {\n      ensureBound(getOption(val, \"pairs\"))\n      cm.state.closeBrackets = val;\n      cm.addKeyMap(keyMap);\n    }\n  });\n\n  function getOption(conf, name) {\n    if (name == \"pairs\" && typeof conf == \"string\") return conf;\n    if (typeof conf == \"object\" && conf[name] != null) return conf[name];\n    return defaults[name];\n  }\n\n  var keyMap = {Backspace: handleBackspace, Enter: handleEnter};\n  function ensureBound(chars) {\n    for (var i = 0; i < chars.length; i++) {\n      var ch = chars.charAt(i), key = \"'\" + ch + \"'\"\n      if (!keyMap[key]) keyMap[key] = handler(ch)\n    }\n  }\n  ensureBound(defaults.pairs + \"`\")\n\n  function handler(ch) {\n    return function(cm) { return handleChar(cm, ch); };\n  }\n\n  function getConfig(cm) {\n    var deflt = cm.state.closeBrackets;\n    if (!deflt || deflt.override) return deflt;\n    var mode = cm.getModeAt(cm.getCursor());\n    return mode.closeBrackets || deflt;\n  }\n\n  function handleBackspace(cm) {\n    var conf = getConfig(cm);\n    if (!conf || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n    var pairs = getOption(conf, \"pairs\");\n    var ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) return CodeMirror.Pass;\n      var around = charsAround(cm, ranges[i].head);\n      if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;\n    }\n    for (var i = ranges.length - 1; i >= 0; i--) {\n      var cur = ranges[i].head;\n      cm.replaceRange(\"\", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), \"+delete\");\n    }\n  }\n\n  function handleEnter(cm) {\n    var conf = getConfig(cm);\n    var explode = conf && getOption(conf, \"explode\");\n    if (!explode || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n    var ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) return CodeMirror.Pass;\n      var around = charsAround(cm, ranges[i].head);\n      if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;\n    }\n    cm.operation(function() {\n      var linesep = cm.lineSeparator() || \"\\n\";\n      cm.replaceSelection(linesep + linesep, null);\n      moveSel(cm, -1)\n      ranges = cm.listSelections();\n      for (var i = 0; i < ranges.length; i++) {\n        var line = ranges[i].head.line;\n        cm.indentLine(line, null, true);\n        cm.indentLine(line + 1, null, true);\n      }\n    });\n  }\n\n  function moveSel(cm, dir) {\n    var newRanges = [], ranges = cm.listSelections(), primary = 0\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i]\n      if (range.head == cm.getCursor()) primary = i\n      var pos = range.head.ch || dir > 0 ? {line: range.head.line, ch: range.head.ch + dir} : {line: range.head.line - 1}\n      newRanges.push({anchor: pos, head: pos})\n    }\n    cm.setSelections(newRanges, primary)\n  }\n\n  function contractSelection(sel) {\n    var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0;\n    return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)),\n            head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))};\n  }\n\n  function handleChar(cm, ch) {\n    var conf = getConfig(cm);\n    if (!conf || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n    var pairs = getOption(conf, \"pairs\");\n    var pos = pairs.indexOf(ch);\n    if (pos == -1) return CodeMirror.Pass;\n\n    var closeBefore = getOption(conf,\"closeBefore\");\n\n    var triples = getOption(conf, \"triples\");\n\n    var identical = pairs.charAt(pos + 1) == ch;\n    var ranges = cm.listSelections();\n    var opening = pos % 2 == 0;\n\n    var type;\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i], cur = range.head, curType;\n      var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));\n      if (opening && !range.empty()) {\n        curType = \"surround\";\n      } else if ((identical || !opening) && next == ch) {\n        if (identical && stringStartsAfter(cm, cur))\n          curType = \"both\";\n        else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch)\n          curType = \"skipThree\";\n        else\n          curType = \"skip\";\n      } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 &&\n                 cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) {\n        if (cur.ch > 2 && /\\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass;\n        curType = \"addFour\";\n      } else if (identical) {\n        var prev = cur.ch == 0 ? \" \" : cm.getRange(Pos(cur.line, cur.ch - 1), cur)\n        if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = \"both\";\n        else return CodeMirror.Pass;\n      } else if (opening && (next.length === 0 || /\\s/.test(next) || closeBefore.indexOf(next) > -1)) {\n        curType = \"both\";\n      } else {\n        return CodeMirror.Pass;\n      }\n      if (!type) type = curType;\n      else if (type != curType) return CodeMirror.Pass;\n    }\n\n    var left = pos % 2 ? pairs.charAt(pos - 1) : ch;\n    var right = pos % 2 ? ch : pairs.charAt(pos + 1);\n    cm.operation(function() {\n      if (type == \"skip\") {\n        moveSel(cm, 1)\n      } else if (type == \"skipThree\") {\n        moveSel(cm, 3)\n      } else if (type == \"surround\") {\n        var sels = cm.getSelections();\n        for (var i = 0; i < sels.length; i++)\n          sels[i] = left + sels[i] + right;\n        cm.replaceSelections(sels, \"around\");\n        sels = cm.listSelections().slice();\n        for (var i = 0; i < sels.length; i++)\n          sels[i] = contractSelection(sels[i]);\n        cm.setSelections(sels);\n      } else if (type == \"both\") {\n        cm.replaceSelection(left + right, null);\n        cm.triggerElectric(left + right);\n        moveSel(cm, -1)\n      } else if (type == \"addFour\") {\n        cm.replaceSelection(left + left + left + left, \"before\");\n        moveSel(cm, 1)\n      }\n    });\n  }\n\n  function charsAround(cm, pos) {\n    var str = cm.getRange(Pos(pos.line, pos.ch - 1),\n                          Pos(pos.line, pos.ch + 1));\n    return str.length == 2 ? str : null;\n  }\n\n  function stringStartsAfter(cm, pos) {\n    var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1))\n    return /\\bstring/.test(token.type) && token.start == pos.ch &&\n      (pos.ch == 0 || !/\\bstring/.test(cm.getTokenTypeAt(pos)))\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/edit/closetag.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Tag-closer extension for CodeMirror.\n *\n * This extension adds an \"autoCloseTags\" option that can be set to\n * either true to get the default behavior, or an object to further\n * configure its behavior.\n *\n * These are supported options:\n *\n * `whenClosing` (default true)\n *   Whether to autoclose when the '/' of a closing tag is typed.\n * `whenOpening` (default true)\n *   Whether to autoclose the tag when the final '>' of an opening\n *   tag is typed.\n * `dontCloseTags` (default is empty tags for HTML, none for XML)\n *   An array of tag names that should not be autoclosed.\n * `indentTags` (default is block tags for HTML, none for XML)\n *   An array of tag names that should, when opened, cause a\n *   blank line to be added inside the tag, and the blank line and\n *   closing line to be indented.\n * `emptyTags` (default is none)\n *   An array of XML tag names that should be autoclosed with '/>'.\n *\n * See demos/closetag.html for a usage example.\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../fold/xml-fold\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../fold/xml-fold\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  CodeMirror.defineOption(\"autoCloseTags\", false, function(cm, val, old) {\n    if (old != CodeMirror.Init && old)\n      cm.removeKeyMap(\"autoCloseTags\");\n    if (!val) return;\n    var map = {name: \"autoCloseTags\"};\n    if (typeof val != \"object\" || val.whenClosing !== false)\n      map[\"'/'\"] = function(cm) { return autoCloseSlash(cm); };\n    if (typeof val != \"object\" || val.whenOpening !== false)\n      map[\"'>'\"] = function(cm) { return autoCloseGT(cm); };\n    cm.addKeyMap(map);\n  });\n\n  var htmlDontClose = [\"area\", \"base\", \"br\", \"col\", \"command\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"param\",\n                       \"source\", \"track\", \"wbr\"];\n  var htmlIndent = [\"applet\", \"blockquote\", \"body\", \"button\", \"div\", \"dl\", \"fieldset\", \"form\", \"frameset\", \"h1\", \"h2\", \"h3\", \"h4\",\n                    \"h5\", \"h6\", \"head\", \"html\", \"iframe\", \"layer\", \"legend\", \"object\", \"ol\", \"p\", \"select\", \"table\", \"ul\"];\n\n  function autoCloseGT(cm) {\n    if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n    var ranges = cm.listSelections(), replacements = [];\n    var opt = cm.getOption(\"autoCloseTags\");\n    for (var i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) return CodeMirror.Pass;\n      var pos = ranges[i].head, tok = cm.getTokenAt(pos);\n      var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;\n      var tagInfo = inner.mode.xmlCurrentTag && inner.mode.xmlCurrentTag(state)\n      var tagName = tagInfo && tagInfo.name\n      if (!tagName) return CodeMirror.Pass\n\n      var html = inner.mode.configuration == \"html\";\n      var dontCloseTags = (typeof opt == \"object\" && opt.dontCloseTags) || (html && htmlDontClose);\n      var indentTags = (typeof opt == \"object\" && opt.indentTags) || (html && htmlIndent);\n\n      if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);\n      var lowerTagName = tagName.toLowerCase();\n      // Don't process the '>' at the end of an end-tag or self-closing tag\n      if (!tagName ||\n          tok.type == \"string\" && (tok.end != pos.ch || !/[\\\"\\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) ||\n          tok.type == \"tag\" && tagInfo.close ||\n          tok.string.indexOf(\"/\") == (pos.ch - tok.start - 1) || // match something like <someTagName />\n          dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 ||\n          closingTagExists(cm, inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state) || [], tagName, pos, true))\n        return CodeMirror.Pass;\n\n      var emptyTags = typeof opt == \"object\" && opt.emptyTags;\n      if (emptyTags && indexOf(emptyTags, tagName) > -1) {\n        replacements[i] = { text: \"/>\", newPos: CodeMirror.Pos(pos.line, pos.ch + 2) };\n        continue;\n      }\n\n      var indent = indentTags && indexOf(indentTags, lowerTagName) > -1;\n      replacements[i] = {indent: indent,\n                         text: \">\" + (indent ? \"\\n\\n\" : \"\") + \"</\" + tagName + \">\",\n                         newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)};\n    }\n\n    var dontIndentOnAutoClose = (typeof opt == \"object\" && opt.dontIndentOnAutoClose);\n    for (var i = ranges.length - 1; i >= 0; i--) {\n      var info = replacements[i];\n      cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, \"+insert\");\n      var sel = cm.listSelections().slice(0);\n      sel[i] = {head: info.newPos, anchor: info.newPos};\n      cm.setSelections(sel);\n      if (!dontIndentOnAutoClose && info.indent) {\n        cm.indentLine(info.newPos.line, null, true);\n        cm.indentLine(info.newPos.line + 1, null, true);\n      }\n    }\n  }\n\n  function autoCloseCurrent(cm, typingSlash) {\n    var ranges = cm.listSelections(), replacements = [];\n    var head = typingSlash ? \"/\" : \"</\";\n    var opt = cm.getOption(\"autoCloseTags\");\n    var dontIndentOnAutoClose = (typeof opt == \"object\" && opt.dontIndentOnSlash);\n    for (var i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) return CodeMirror.Pass;\n      var pos = ranges[i].head, tok = cm.getTokenAt(pos);\n      var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;\n      if (typingSlash && (tok.type == \"string\" || tok.string.charAt(0) != \"<\" ||\n                          tok.start != pos.ch - 1))\n        return CodeMirror.Pass;\n      // Kludge to get around the fact that we are not in XML mode\n      // when completing in JS/CSS snippet in htmlmixed mode. Does not\n      // work for other XML embedded languages (there is no general\n      // way to go from a mixed mode to its current XML state).\n      var replacement, mixed = inner.mode.name != \"xml\" && cm.getMode().name == \"htmlmixed\"\n      if (mixed && inner.mode.name == \"javascript\") {\n        replacement = head + \"script\";\n      } else if (mixed && inner.mode.name == \"css\") {\n        replacement = head + \"style\";\n      } else {\n        var context = inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state)\n        var top = context.length ? context[context.length - 1] : \"\"\n        if (!context || (context.length && closingTagExists(cm, context, top, pos)))\n          return CodeMirror.Pass;\n        replacement = head + top\n      }\n      if (cm.getLine(pos.line).charAt(tok.end) != \">\") replacement += \">\";\n      replacements[i] = replacement;\n    }\n    cm.replaceSelections(replacements);\n    ranges = cm.listSelections();\n    if (!dontIndentOnAutoClose) {\n        for (var i = 0; i < ranges.length; i++)\n            if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line)\n                cm.indentLine(ranges[i].head.line);\n    }\n  }\n\n  function autoCloseSlash(cm) {\n    if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n    return autoCloseCurrent(cm, true);\n  }\n\n  CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); };\n\n  function indexOf(collection, elt) {\n    if (collection.indexOf) return collection.indexOf(elt);\n    for (var i = 0, e = collection.length; i < e; ++i)\n      if (collection[i] == elt) return i;\n    return -1;\n  }\n\n  // If xml-fold is loaded, we use its functionality to try and verify\n  // whether a given tag is actually unclosed.\n  function closingTagExists(cm, context, tagName, pos, newTag) {\n    if (!CodeMirror.scanForClosingTag) return false;\n    var end = Math.min(cm.lastLine() + 1, pos.line + 500);\n    var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end);\n    if (!nextClose || nextClose.tag != tagName) return false;\n    // If the immediate wrapping context contains onCx instances of\n    // the same tag, a closing tag only exists if there are at least\n    // that many closing tags of that type following.\n    var onCx = newTag ? 1 : 0\n    for (var i = context.length - 1; i >= 0; i--) {\n      if (context[i] == tagName) ++onCx\n      else break\n    }\n    pos = nextClose.to;\n    for (var i = 1; i < onCx; i++) {\n      var next = CodeMirror.scanForClosingTag(cm, pos, null, end);\n      if (!next || next.tag != tagName) return false;\n      pos = next.to;\n    }\n    return true;\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/edit/continuelist.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var listRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]\\s|[*+-]\\s|(\\d+)([.)]))(\\s*)/,\n      emptyListRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]|[*+-]|(\\d+)[.)])(\\s*)$/,\n      unorderedListRE = /[*+-]\\s/;\n\n  CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {\n    if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n    var ranges = cm.listSelections(), replacements = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var pos = ranges[i].head;\n\n      // If we're not in Markdown mode, fall back to normal newlineAndIndent\n      var eolState = cm.getStateAfter(pos.line);\n      var inner = CodeMirror.innerMode(cm.getMode(), eolState);\n      if (inner.mode.name !== \"markdown\" && inner.mode.helperType !== \"markdown\") {\n        cm.execCommand(\"newlineAndIndent\");\n        return;\n      } else {\n        eolState = inner.state;\n      }\n\n      var inList = eolState.list !== false;\n      var inQuote = eolState.quote !== 0;\n\n      var line = cm.getLine(pos.line), match = listRE.exec(line);\n      var cursorBeforeBullet = /^\\s*$/.test(line.slice(0, pos.ch));\n      if (!ranges[i].empty() || (!inList && !inQuote) || !match || cursorBeforeBullet) {\n        cm.execCommand(\"newlineAndIndent\");\n        return;\n      }\n      if (emptyListRE.test(line)) {\n        var endOfQuote = inQuote && />\\s*$/.test(line)\n        var endOfList = !/>\\s*$/.test(line)\n        if (endOfQuote || endOfList) cm.replaceRange(\"\", {\n          line: pos.line, ch: 0\n        }, {\n          line: pos.line, ch: pos.ch + 1\n        });\n        replacements[i] = \"\\n\";\n      } else {\n        var indent = match[1], after = match[5];\n        var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(\">\") >= 0);\n        var bullet = numbered ? (parseInt(match[3], 10) + 1) + match[4] : match[2].replace(\"x\", \" \");\n        replacements[i] = \"\\n\" + indent + bullet + after;\n\n        if (numbered) incrementRemainingMarkdownListNumbers(cm, pos);\n      }\n    }\n\n    cm.replaceSelections(replacements);\n  };\n\n  // Auto-updating Markdown list numbers when a new item is added to the\n  // middle of a list\n  function incrementRemainingMarkdownListNumbers(cm, pos) {\n    var startLine = pos.line, lookAhead = 0, skipCount = 0;\n    var startItem = listRE.exec(cm.getLine(startLine)), startIndent = startItem[1];\n\n    do {\n      lookAhead += 1;\n      var nextLineNumber = startLine + lookAhead;\n      var nextLine = cm.getLine(nextLineNumber), nextItem = listRE.exec(nextLine);\n\n      if (nextItem) {\n        var nextIndent = nextItem[1];\n        var newNumber = (parseInt(startItem[3], 10) + lookAhead - skipCount);\n        var nextNumber = (parseInt(nextItem[3], 10)), itemNumber = nextNumber;\n\n        if (startIndent === nextIndent && !isNaN(nextNumber)) {\n          if (newNumber === nextNumber) itemNumber = nextNumber + 1;\n          if (newNumber > nextNumber) itemNumber = newNumber + 1;\n          cm.replaceRange(\n            nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]),\n          {\n            line: nextLineNumber, ch: 0\n          }, {\n            line: nextLineNumber, ch: nextLine.length\n          });\n        } else {\n          if (startIndent.length > nextIndent.length) return;\n          // This doesn't run if the next line immediately indents, as it is\n          // not clear of the users intention (new indented item or same level)\n          if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return;\n          skipCount += 1;\n        }\n      }\n    } while (nextItem);\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/edit/matchbrackets.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var ie_lt8 = /MSIE \\d/.test(navigator.userAgent) &&\n    (document.documentMode == null || document.documentMode < 8);\n\n  var Pos = CodeMirror.Pos;\n\n  var matching = {\"(\": \")>\", \")\": \"(<\", \"[\": \"]>\", \"]\": \"[<\", \"{\": \"}>\", \"}\": \"{<\", \"<\": \">>\", \">\": \"<<\"};\n\n  function bracketRegex(config) {\n    return config && config.bracketRegex || /[(){}[\\]]/\n  }\n\n  function findMatchingBracket(cm, where, config) {\n    var line = cm.getLineHandle(where.line), pos = where.ch - 1;\n    var afterCursor = config && config.afterCursor\n    if (afterCursor == null)\n      afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className)\n    var re = bracketRegex(config)\n\n    // A cursor is defined as between two characters, but in in vim command mode\n    // (i.e. not insert mode), the cursor is visually represented as a\n    // highlighted box on top of the 2nd character. Otherwise, we allow matches\n    // from before or after the cursor.\n    var match = (!afterCursor && pos >= 0 && re.test(line.text.charAt(pos)) && matching[line.text.charAt(pos)]) ||\n        re.test(line.text.charAt(pos + 1)) && matching[line.text.charAt(++pos)];\n    if (!match) return null;\n    var dir = match.charAt(1) == \">\" ? 1 : -1;\n    if (config && config.strict && (dir > 0) != (pos == where.ch)) return null;\n    var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));\n\n    var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style, config);\n    if (found == null) return null;\n    return {from: Pos(where.line, pos), to: found && found.pos,\n            match: found && found.ch == match.charAt(0), forward: dir > 0};\n  }\n\n  // bracketRegex is used to specify which type of bracket to scan\n  // should be a regexp, e.g. /[[\\]]/\n  //\n  // Note: If \"where\" is on an open bracket, then this bracket is ignored.\n  //\n  // Returns false when no bracket was found, null when it reached\n  // maxScanLines and gave up\n  function scanForBracket(cm, where, dir, style, config) {\n    var maxScanLen = (config && config.maxScanLineLength) || 10000;\n    var maxScanLines = (config && config.maxScanLines) || 1000;\n\n    var stack = [];\n    var re = bracketRegex(config)\n    var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)\n                          : Math.max(cm.firstLine() - 1, where.line - maxScanLines);\n    for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {\n      var line = cm.getLine(lineNo);\n      if (!line) continue;\n      var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;\n      if (line.length > maxScanLen) continue;\n      if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);\n      for (; pos != end; pos += dir) {\n        var ch = line.charAt(pos);\n        if (re.test(ch) && (style === undefined ||\n                            (cm.getTokenTypeAt(Pos(lineNo, pos + 1)) || \"\") == (style || \"\"))) {\n          var match = matching[ch];\n          if (match && (match.charAt(1) == \">\") == (dir > 0)) stack.push(ch);\n          else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};\n          else stack.pop();\n        }\n      }\n    }\n    return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;\n  }\n\n  function matchBrackets(cm, autoclear, config) {\n    // Disable brace matching in long lines, since it'll cause hugely slow updates\n    var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000,\n      highlightNonMatching = config && config.highlightNonMatching;\n    var marks = [], ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config);\n      if (match && (match.match || highlightNonMatching !== false) && cm.getLine(match.from.line).length <= maxHighlightLen) {\n        var style = match.match ? \"CodeMirror-matchingbracket\" : \"CodeMirror-nonmatchingbracket\";\n        marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));\n        if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)\n          marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));\n      }\n    }\n\n    if (marks.length) {\n      // Kludge to work around the IE bug from issue #1193, where text\n      // input stops going to the textarea whenever this fires.\n      if (ie_lt8 && cm.state.focused) cm.focus();\n\n      var clear = function() {\n        cm.operation(function() {\n          for (var i = 0; i < marks.length; i++) marks[i].clear();\n        });\n      };\n      if (autoclear) setTimeout(clear, 800);\n      else return clear;\n    }\n  }\n\n  function doMatchBrackets(cm) {\n    cm.operation(function() {\n      if (cm.state.matchBrackets.currentlyHighlighted) {\n        cm.state.matchBrackets.currentlyHighlighted();\n        cm.state.matchBrackets.currentlyHighlighted = null;\n      }\n      cm.state.matchBrackets.currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);\n    });\n  }\n\n  function clearHighlighted(cm) {\n    if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) {\n      cm.state.matchBrackets.currentlyHighlighted();\n      cm.state.matchBrackets.currentlyHighlighted = null;\n    }\n  }\n\n  CodeMirror.defineOption(\"matchBrackets\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.off(\"cursorActivity\", doMatchBrackets);\n      cm.off(\"focus\", doMatchBrackets)\n      cm.off(\"blur\", clearHighlighted)\n      clearHighlighted(cm);\n    }\n    if (val) {\n      cm.state.matchBrackets = typeof val == \"object\" ? val : {};\n      cm.on(\"cursorActivity\", doMatchBrackets);\n      cm.on(\"focus\", doMatchBrackets)\n      cm.on(\"blur\", clearHighlighted)\n    }\n  });\n\n  CodeMirror.defineExtension(\"matchBrackets\", function() {matchBrackets(this, true);});\n  CodeMirror.defineExtension(\"findMatchingBracket\", function(pos, config, oldConfig){\n    // Backwards-compatibility kludge\n    if (oldConfig || typeof config == \"boolean\") {\n      if (!oldConfig) {\n        config = config ? {strict: true} : null\n      } else {\n        oldConfig.strict = config\n        config = oldConfig\n      }\n    }\n    return findMatchingBracket(this, pos, config)\n  });\n  CodeMirror.defineExtension(\"scanForBracket\", function(pos, dir, style, config){\n    return scanForBracket(this, pos, dir, style, config);\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/edit/matchtags.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../fold/xml-fold\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../fold/xml-fold\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"matchTags\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.off(\"cursorActivity\", doMatchTags);\n      cm.off(\"viewportChange\", maybeUpdateMatch);\n      clear(cm);\n    }\n    if (val) {\n      cm.state.matchBothTags = typeof val == \"object\" && val.bothTags;\n      cm.on(\"cursorActivity\", doMatchTags);\n      cm.on(\"viewportChange\", maybeUpdateMatch);\n      doMatchTags(cm);\n    }\n  });\n\n  function clear(cm) {\n    if (cm.state.tagHit) cm.state.tagHit.clear();\n    if (cm.state.tagOther) cm.state.tagOther.clear();\n    cm.state.tagHit = cm.state.tagOther = null;\n  }\n\n  function doMatchTags(cm) {\n    cm.state.failedTagMatch = false;\n    cm.operation(function() {\n      clear(cm);\n      if (cm.somethingSelected()) return;\n      var cur = cm.getCursor(), range = cm.getViewport();\n      range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to);\n      var match = CodeMirror.findMatchingTag(cm, cur, range);\n      if (!match) return;\n      if (cm.state.matchBothTags) {\n        var hit = match.at == \"open\" ? match.open : match.close;\n        if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: \"CodeMirror-matchingtag\"});\n      }\n      var other = match.at == \"close\" ? match.open : match.close;\n      if (other)\n        cm.state.tagOther = cm.markText(other.from, other.to, {className: \"CodeMirror-matchingtag\"});\n      else\n        cm.state.failedTagMatch = true;\n    });\n  }\n\n  function maybeUpdateMatch(cm) {\n    if (cm.state.failedTagMatch) doMatchTags(cm);\n  }\n\n  CodeMirror.commands.toMatchingTag = function(cm) {\n    var found = CodeMirror.findMatchingTag(cm, cm.getCursor());\n    if (found) {\n      var other = found.at == \"close\" ? found.open : found.close;\n      if (other) cm.extendSelection(other.to, other.from);\n    }\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/edit/trailingspace.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  CodeMirror.defineOption(\"showTrailingSpace\", false, function(cm, val, prev) {\n    if (prev == CodeMirror.Init) prev = false;\n    if (prev && !val)\n      cm.removeOverlay(\"trailingspace\");\n    else if (!prev && val)\n      cm.addOverlay({\n        token: function(stream) {\n          for (var l = stream.string.length, i = l; i && /\\s/.test(stream.string.charAt(i - 1)); --i) {}\n          if (i > stream.pos) { stream.pos = i; return null; }\n          stream.pos = l;\n          return \"trailingspace\";\n        },\n        name: \"trailingspace\"\n      });\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/fold/brace-fold.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction bracketFolding(pairs) {\n  return function(cm, start) {\n    var line = start.line, lineText = cm.getLine(line);\n\n    function findOpening(pair) {\n      var tokenType;\n      for (var at = start.ch, pass = 0;;) {\n        var found = at <= 0 ? -1 : lineText.lastIndexOf(pair[0], at - 1);\n        if (found == -1) {\n          if (pass == 1) break;\n          pass = 1;\n          at = lineText.length;\n          continue;\n        }\n        if (pass == 1 && found < start.ch) break;\n        tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));\n        if (!/^(comment|string)/.test(tokenType)) return {ch: found + 1, tokenType: tokenType, pair: pair};\n        at = found - 1;\n      }\n    }\n\n    function findRange(found) {\n      var count = 1, lastLine = cm.lastLine(), end, startCh = found.ch, endCh\n      outer: for (var i = line; i <= lastLine; ++i) {\n        var text = cm.getLine(i), pos = i == line ? startCh : 0;\n        for (;;) {\n          var nextOpen = text.indexOf(found.pair[0], pos), nextClose = text.indexOf(found.pair[1], pos);\n          if (nextOpen < 0) nextOpen = text.length;\n          if (nextClose < 0) nextClose = text.length;\n          pos = Math.min(nextOpen, nextClose);\n          if (pos == text.length) break;\n          if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == found.tokenType) {\n            if (pos == nextOpen) ++count;\n            else if (!--count) { end = i; endCh = pos; break outer; }\n          }\n          ++pos;\n        }\n      }\n\n      if (end == null || line == end) return null\n      return {from: CodeMirror.Pos(line, startCh),\n              to: CodeMirror.Pos(end, endCh)};\n    }\n\n    var found = []\n    for (var i = 0; i < pairs.length; i++) {\n      var open = findOpening(pairs[i])\n      if (open) found.push(open)\n    }\n    found.sort(function(a, b) { return a.ch - b.ch })\n    for (var i = 0; i < found.length; i++) {\n      var range = findRange(found[i])\n      if (range) return range\n    }\n    return null\n  }\n}\n\nCodeMirror.registerHelper(\"fold\", \"brace\", bracketFolding([[\"{\", \"}\"], [\"[\", \"]\"]]));\n\nCodeMirror.registerHelper(\"fold\", \"brace-paren\", bracketFolding([[\"{\", \"}\"], [\"[\", \"]\"], [\"(\", \")\"]]));\n\nCodeMirror.registerHelper(\"fold\", \"import\", function(cm, start) {\n  function hasImport(line) {\n    if (line < cm.firstLine() || line > cm.lastLine()) return null;\n    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));\n    if (!/\\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));\n    if (start.type != \"keyword\" || start.string != \"import\") return null;\n    // Now find closing semicolon, return its position\n    for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {\n      var text = cm.getLine(i), semi = text.indexOf(\";\");\n      if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};\n    }\n  }\n\n  var startLine = start.line, has = hasImport(startLine), prev;\n  if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))\n    return null;\n  for (var end = has.end;;) {\n    var next = hasImport(end.line + 1);\n    if (next == null) break;\n    end = next.end;\n  }\n  return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};\n});\n\nCodeMirror.registerHelper(\"fold\", \"include\", function(cm, start) {\n  function hasInclude(line) {\n    if (line < cm.firstLine() || line > cm.lastLine()) return null;\n    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));\n    if (!/\\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));\n    if (start.type == \"meta\" && start.string.slice(0, 8) == \"#include\") return start.start + 8;\n  }\n\n  var startLine = start.line, has = hasInclude(startLine);\n  if (has == null || hasInclude(startLine - 1) != null) return null;\n  for (var end = startLine;;) {\n    var next = hasInclude(end + 1);\n    if (next == null) break;\n    ++end;\n  }\n  return {from: CodeMirror.Pos(startLine, has + 1),\n          to: cm.clipPos(CodeMirror.Pos(end))};\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/fold/comment-fold.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerGlobalHelper(\"fold\", \"comment\", function(mode) {\n  return mode.blockCommentStart && mode.blockCommentEnd;\n}, function(cm, start) {\n  var mode = cm.getModeAt(start), startToken = mode.blockCommentStart, endToken = mode.blockCommentEnd;\n  if (!startToken || !endToken) return;\n  var line = start.line, lineText = cm.getLine(line);\n\n  var startCh;\n  for (var at = start.ch, pass = 0;;) {\n    var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1);\n    if (found == -1) {\n      if (pass == 1) return;\n      pass = 1;\n      at = lineText.length;\n      continue;\n    }\n    if (pass == 1 && found < start.ch) return;\n    if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1))) &&\n        (found == 0 || lineText.slice(found - endToken.length, found) == endToken ||\n         !/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found))))) {\n      startCh = found + startToken.length;\n      break;\n    }\n    at = found - 1;\n  }\n\n  var depth = 1, lastLine = cm.lastLine(), end, endCh;\n  outer: for (var i = line; i <= lastLine; ++i) {\n    var text = cm.getLine(i), pos = i == line ? startCh : 0;\n    for (;;) {\n      var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);\n      if (nextOpen < 0) nextOpen = text.length;\n      if (nextClose < 0) nextClose = text.length;\n      pos = Math.min(nextOpen, nextClose);\n      if (pos == text.length) break;\n      if (pos == nextOpen) ++depth;\n      else if (!--depth) { end = i; endCh = pos; break outer; }\n      ++pos;\n    }\n  }\n  if (end == null || line == end && endCh == startCh) return;\n  return {from: CodeMirror.Pos(line, startCh),\n          to: CodeMirror.Pos(end, endCh)};\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/fold/foldcode.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function doFold(cm, pos, options, force) {\n    if (options && options.call) {\n      var finder = options;\n      options = null;\n    } else {\n      var finder = getOption(cm, options, \"rangeFinder\");\n    }\n    if (typeof pos == \"number\") pos = CodeMirror.Pos(pos, 0);\n    var minSize = getOption(cm, options, \"minFoldSize\");\n\n    function getRange(allowFolded) {\n      var range = finder(cm, pos);\n      if (!range || range.to.line - range.from.line < minSize) return null;\n      if (force === \"fold\") return range;\n\n      var marks = cm.findMarksAt(range.from);\n      for (var i = 0; i < marks.length; ++i) {\n        if (marks[i].__isFold) {\n          if (!allowFolded) return null;\n          range.cleared = true;\n          marks[i].clear();\n        }\n      }\n      return range;\n    }\n\n    var range = getRange(true);\n    if (getOption(cm, options, \"scanUp\")) while (!range && pos.line > cm.firstLine()) {\n      pos = CodeMirror.Pos(pos.line - 1, 0);\n      range = getRange(false);\n    }\n    if (!range || range.cleared || force === \"unfold\") return;\n\n    var myWidget = makeWidget(cm, options, range);\n    CodeMirror.on(myWidget, \"mousedown\", function(e) {\n      myRange.clear();\n      CodeMirror.e_preventDefault(e);\n    });\n    var myRange = cm.markText(range.from, range.to, {\n      replacedWith: myWidget,\n      clearOnEnter: getOption(cm, options, \"clearOnEnter\"),\n      __isFold: true\n    });\n    myRange.on(\"clear\", function(from, to) {\n      CodeMirror.signal(cm, \"unfold\", cm, from, to);\n    });\n    CodeMirror.signal(cm, \"fold\", cm, range.from, range.to);\n  }\n\n  function makeWidget(cm, options, range) {\n    var widget = getOption(cm, options, \"widget\");\n\n    if (typeof widget == \"function\") {\n      widget = widget(range.from, range.to);\n    }\n\n    if (typeof widget == \"string\") {\n      var text = document.createTextNode(widget);\n      widget = document.createElement(\"span\");\n      widget.appendChild(text);\n      widget.className = \"CodeMirror-foldmarker\";\n    } else if (widget) {\n      widget = widget.cloneNode(true)\n    }\n    return widget;\n  }\n\n  // Clumsy backwards-compatible interface\n  CodeMirror.newFoldFunction = function(rangeFinder, widget) {\n    return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };\n  };\n\n  // New-style interface\n  CodeMirror.defineExtension(\"foldCode\", function(pos, options, force) {\n    doFold(this, pos, options, force);\n  });\n\n  CodeMirror.defineExtension(\"isFolded\", function(pos) {\n    var marks = this.findMarksAt(pos);\n    for (var i = 0; i < marks.length; ++i)\n      if (marks[i].__isFold) return true;\n  });\n\n  CodeMirror.commands.toggleFold = function(cm) {\n    cm.foldCode(cm.getCursor());\n  };\n  CodeMirror.commands.fold = function(cm) {\n    cm.foldCode(cm.getCursor(), null, \"fold\");\n  };\n  CodeMirror.commands.unfold = function(cm) {\n    cm.foldCode(cm.getCursor(), { scanUp: false }, \"unfold\");\n  };\n  CodeMirror.commands.foldAll = function(cm) {\n    cm.operation(function() {\n      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)\n        cm.foldCode(CodeMirror.Pos(i, 0), { scanUp: false }, \"fold\");\n    });\n  };\n  CodeMirror.commands.unfoldAll = function(cm) {\n    cm.operation(function() {\n      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)\n        cm.foldCode(CodeMirror.Pos(i, 0), { scanUp: false }, \"unfold\");\n    });\n  };\n\n  CodeMirror.registerHelper(\"fold\", \"combine\", function() {\n    var funcs = Array.prototype.slice.call(arguments, 0);\n    return function(cm, start) {\n      for (var i = 0; i < funcs.length; ++i) {\n        var found = funcs[i](cm, start);\n        if (found) return found;\n      }\n    };\n  });\n\n  CodeMirror.registerHelper(\"fold\", \"auto\", function(cm, start) {\n    var helpers = cm.getHelpers(start, \"fold\");\n    for (var i = 0; i < helpers.length; i++) {\n      var cur = helpers[i](cm, start);\n      if (cur) return cur;\n    }\n  });\n\n  var defaultOptions = {\n    rangeFinder: CodeMirror.fold.auto,\n    widget: \"\\u2194\",\n    minFoldSize: 0,\n    scanUp: false,\n    clearOnEnter: true\n  };\n\n  CodeMirror.defineOption(\"foldOptions\", null);\n\n  function getOption(cm, options, name) {\n    if (options && options[name] !== undefined)\n      return options[name];\n    var editorOptions = cm.options.foldOptions;\n    if (editorOptions && editorOptions[name] !== undefined)\n      return editorOptions[name];\n    return defaultOptions[name];\n  }\n\n  CodeMirror.defineExtension(\"foldOption\", function(options, name) {\n    return getOption(this, options, name);\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/fold/foldgutter.css",
    "content": ".CodeMirror-foldmarker {\n  color: blue;\n  text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px;\n  font-family: arial;\n  line-height: .3;\n  cursor: pointer;\n}\n.CodeMirror-foldgutter {\n  width: .7em;\n}\n.CodeMirror-foldgutter-open,\n.CodeMirror-foldgutter-folded {\n  cursor: pointer;\n}\n.CodeMirror-foldgutter-open:after {\n  content: \"\\25BE\";\n}\n.CodeMirror-foldgutter-folded:after {\n  content: \"\\25B8\";\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/fold/foldgutter.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./foldcode\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./foldcode\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"foldGutter\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.clearGutter(cm.state.foldGutter.options.gutter);\n      cm.state.foldGutter = null;\n      cm.off(\"gutterClick\", onGutterClick);\n      cm.off(\"changes\", onChange);\n      cm.off(\"viewportChange\", onViewportChange);\n      cm.off(\"fold\", onFold);\n      cm.off(\"unfold\", onFold);\n      cm.off(\"swapDoc\", onChange);\n    }\n    if (val) {\n      cm.state.foldGutter = new State(parseOptions(val));\n      updateInViewport(cm);\n      cm.on(\"gutterClick\", onGutterClick);\n      cm.on(\"changes\", onChange);\n      cm.on(\"viewportChange\", onViewportChange);\n      cm.on(\"fold\", onFold);\n      cm.on(\"unfold\", onFold);\n      cm.on(\"swapDoc\", onChange);\n    }\n  });\n\n  var Pos = CodeMirror.Pos;\n\n  function State(options) {\n    this.options = options;\n    this.from = this.to = 0;\n  }\n\n  function parseOptions(opts) {\n    if (opts === true) opts = {};\n    if (opts.gutter == null) opts.gutter = \"CodeMirror-foldgutter\";\n    if (opts.indicatorOpen == null) opts.indicatorOpen = \"CodeMirror-foldgutter-open\";\n    if (opts.indicatorFolded == null) opts.indicatorFolded = \"CodeMirror-foldgutter-folded\";\n    return opts;\n  }\n\n  function isFolded(cm, line) {\n    var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0));\n    for (var i = 0; i < marks.length; ++i) {\n      if (marks[i].__isFold) {\n        var fromPos = marks[i].find(-1);\n        if (fromPos && fromPos.line === line)\n          return marks[i];\n      }\n    }\n  }\n\n  function marker(spec) {\n    if (typeof spec == \"string\") {\n      var elt = document.createElement(\"div\");\n      elt.className = spec + \" CodeMirror-guttermarker-subtle\";\n      return elt;\n    } else {\n      return spec.cloneNode(true);\n    }\n  }\n\n  function updateFoldInfo(cm, from, to) {\n    var opts = cm.state.foldGutter.options, cur = from - 1;\n    var minSize = cm.foldOption(opts, \"minFoldSize\");\n    var func = cm.foldOption(opts, \"rangeFinder\");\n    // we can reuse the built-in indicator element if its className matches the new state\n    var clsFolded = typeof opts.indicatorFolded == \"string\" && classTest(opts.indicatorFolded);\n    var clsOpen = typeof opts.indicatorOpen == \"string\" && classTest(opts.indicatorOpen);\n    cm.eachLine(from, to, function(line) {\n      ++cur;\n      var mark = null;\n      var old = line.gutterMarkers;\n      if (old) old = old[opts.gutter];\n      if (isFolded(cm, cur)) {\n        if (clsFolded && old && clsFolded.test(old.className)) return;\n        mark = marker(opts.indicatorFolded);\n      } else {\n        var pos = Pos(cur, 0);\n        var range = func && func(cm, pos);\n        if (range && range.to.line - range.from.line >= minSize) {\n          if (clsOpen && old && clsOpen.test(old.className)) return;\n          mark = marker(opts.indicatorOpen);\n        }\n      }\n      if (!mark && !old) return;\n      cm.setGutterMarker(line, opts.gutter, mark);\n    });\n  }\n\n  // copied from CodeMirror/src/util/dom.js\n  function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\n  function updateInViewport(cm) {\n    var vp = cm.getViewport(), state = cm.state.foldGutter;\n    if (!state) return;\n    cm.operation(function() {\n      updateFoldInfo(cm, vp.from, vp.to);\n    });\n    state.from = vp.from; state.to = vp.to;\n  }\n\n  function onGutterClick(cm, line, gutter) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    if (gutter != opts.gutter) return;\n    var folded = isFolded(cm, line);\n    if (folded) folded.clear();\n    else cm.foldCode(Pos(line, 0), opts);\n  }\n\n  function onChange(cm) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    state.from = state.to = 0;\n    clearTimeout(state.changeUpdate);\n    state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);\n  }\n\n  function onViewportChange(cm) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    clearTimeout(state.changeUpdate);\n    state.changeUpdate = setTimeout(function() {\n      var vp = cm.getViewport();\n      if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {\n        updateInViewport(cm);\n      } else {\n        cm.operation(function() {\n          if (vp.from < state.from) {\n            updateFoldInfo(cm, vp.from, state.from);\n            state.from = vp.from;\n          }\n          if (vp.to > state.to) {\n            updateFoldInfo(cm, state.to, vp.to);\n            state.to = vp.to;\n          }\n        });\n      }\n    }, opts.updateViewportTimeSpan || 400);\n  }\n\n  function onFold(cm, from) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var line = from.line;\n    if (line >= state.from && line < state.to)\n      updateFoldInfo(cm, line, line + 1);\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/fold/indent-fold.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction lineIndent(cm, lineNo) {\n  var text = cm.getLine(lineNo)\n  var spaceTo = text.search(/\\S/)\n  if (spaceTo == -1 || /\\bcomment\\b/.test(cm.getTokenTypeAt(CodeMirror.Pos(lineNo, spaceTo + 1))))\n    return -1\n  return CodeMirror.countColumn(text, null, cm.getOption(\"tabSize\"))\n}\n\nCodeMirror.registerHelper(\"fold\", \"indent\", function(cm, start) {\n  var myIndent = lineIndent(cm, start.line)\n  if (myIndent < 0) return\n  var lastLineInFold = null\n\n  // Go through lines until we find a line that definitely doesn't belong in\n  // the block we're folding, or to the end.\n  for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) {\n    var indent = lineIndent(cm, i)\n    if (indent == -1) {\n    } else if (indent > myIndent) {\n      // Lines with a greater indent are considered part of the block.\n      lastLineInFold = i;\n    } else {\n      // If this line has non-space, non-comment content, and is\n      // indented less or equal to the start line, it is the start of\n      // another block.\n      break;\n    }\n  }\n  if (lastLineInFold) return {\n    from: CodeMirror.Pos(start.line, cm.getLine(start.line).length),\n    to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length)\n  };\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/fold/markdown-fold.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"fold\", \"markdown\", function(cm, start) {\n  var maxDepth = 100;\n\n  function isHeader(lineNo) {\n    var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0));\n    return tokentype && /\\bheader\\b/.test(tokentype);\n  }\n\n  function headerLevel(lineNo, line, nextLine) {\n    var match = line && line.match(/^#+/);\n    if (match && isHeader(lineNo)) return match[0].length;\n    match = nextLine && nextLine.match(/^[=\\-]+\\s*$/);\n    if (match && isHeader(lineNo + 1)) return nextLine[0] == \"=\" ? 1 : 2;\n    return maxDepth;\n  }\n\n  var firstLine = cm.getLine(start.line), nextLine = cm.getLine(start.line + 1);\n  var level = headerLevel(start.line, firstLine, nextLine);\n  if (level === maxDepth) return undefined;\n\n  var lastLineNo = cm.lastLine();\n  var end = start.line, nextNextLine = cm.getLine(end + 2);\n  while (end < lastLineNo) {\n    if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break;\n    ++end;\n    nextLine = nextNextLine;\n    nextNextLine = cm.getLine(end + 2);\n  }\n\n  return {\n    from: CodeMirror.Pos(start.line, firstLine.length),\n    to: CodeMirror.Pos(end, cm.getLine(end).length)\n  };\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/fold/xml-fold.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var Pos = CodeMirror.Pos;\n  function cmp(a, b) { return a.line - b.line || a.ch - b.ch; }\n\n  var nameStartChar = \"A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n  var nameChar = nameStartChar + \"\\-\\:\\.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\n  var xmlTagStart = new RegExp(\"<(/?)([\" + nameStartChar + \"][\" + nameChar + \"]*)\", \"g\");\n\n  function Iter(cm, line, ch, range) {\n    this.line = line; this.ch = ch;\n    this.cm = cm; this.text = cm.getLine(line);\n    this.min = range ? Math.max(range.from, cm.firstLine()) : cm.firstLine();\n    this.max = range ? Math.min(range.to - 1, cm.lastLine()) : cm.lastLine();\n  }\n\n  function tagAt(iter, ch) {\n    var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch));\n    return type && /\\btag\\b/.test(type);\n  }\n\n  function nextLine(iter) {\n    if (iter.line >= iter.max) return;\n    iter.ch = 0;\n    iter.text = iter.cm.getLine(++iter.line);\n    return true;\n  }\n  function prevLine(iter) {\n    if (iter.line <= iter.min) return;\n    iter.text = iter.cm.getLine(--iter.line);\n    iter.ch = iter.text.length;\n    return true;\n  }\n\n  function toTagEnd(iter) {\n    for (;;) {\n      var gt = iter.text.indexOf(\">\", iter.ch);\n      if (gt == -1) { if (nextLine(iter)) continue; else return; }\n      if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; }\n      var lastSlash = iter.text.lastIndexOf(\"/\", gt);\n      var selfClose = lastSlash > -1 && !/\\S/.test(iter.text.slice(lastSlash + 1, gt));\n      iter.ch = gt + 1;\n      return selfClose ? \"selfClose\" : \"regular\";\n    }\n  }\n  function toTagStart(iter) {\n    for (;;) {\n      var lt = iter.ch ? iter.text.lastIndexOf(\"<\", iter.ch - 1) : -1;\n      if (lt == -1) { if (prevLine(iter)) continue; else return; }\n      if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; }\n      xmlTagStart.lastIndex = lt;\n      iter.ch = lt;\n      var match = xmlTagStart.exec(iter.text);\n      if (match && match.index == lt) return match;\n    }\n  }\n\n  function toNextTag(iter) {\n    for (;;) {\n      xmlTagStart.lastIndex = iter.ch;\n      var found = xmlTagStart.exec(iter.text);\n      if (!found) { if (nextLine(iter)) continue; else return; }\n      if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; }\n      iter.ch = found.index + found[0].length;\n      return found;\n    }\n  }\n  function toPrevTag(iter) {\n    for (;;) {\n      var gt = iter.ch ? iter.text.lastIndexOf(\">\", iter.ch - 1) : -1;\n      if (gt == -1) { if (prevLine(iter)) continue; else return; }\n      if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; }\n      var lastSlash = iter.text.lastIndexOf(\"/\", gt);\n      var selfClose = lastSlash > -1 && !/\\S/.test(iter.text.slice(lastSlash + 1, gt));\n      iter.ch = gt + 1;\n      return selfClose ? \"selfClose\" : \"regular\";\n    }\n  }\n\n  function findMatchingClose(iter, tag) {\n    var stack = [];\n    for (;;) {\n      var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0);\n      if (!next || !(end = toTagEnd(iter))) return;\n      if (end == \"selfClose\") continue;\n      if (next[1]) { // closing tag\n        for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) {\n          stack.length = i;\n          break;\n        }\n        if (i < 0 && (!tag || tag == next[2])) return {\n          tag: next[2],\n          from: Pos(startLine, startCh),\n          to: Pos(iter.line, iter.ch)\n        };\n      } else { // opening tag\n        stack.push(next[2]);\n      }\n    }\n  }\n  function findMatchingOpen(iter, tag) {\n    var stack = [];\n    for (;;) {\n      var prev = toPrevTag(iter);\n      if (!prev) return;\n      if (prev == \"selfClose\") { toTagStart(iter); continue; }\n      var endLine = iter.line, endCh = iter.ch;\n      var start = toTagStart(iter);\n      if (!start) return;\n      if (start[1]) { // closing tag\n        stack.push(start[2]);\n      } else { // opening tag\n        for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) {\n          stack.length = i;\n          break;\n        }\n        if (i < 0 && (!tag || tag == start[2])) return {\n          tag: start[2],\n          from: Pos(iter.line, iter.ch),\n          to: Pos(endLine, endCh)\n        };\n      }\n    }\n  }\n\n  CodeMirror.registerHelper(\"fold\", \"xml\", function(cm, start) {\n    var iter = new Iter(cm, start.line, 0);\n    for (;;) {\n      var openTag = toNextTag(iter)\n      if (!openTag || iter.line != start.line) return\n      var end = toTagEnd(iter)\n      if (!end) return\n      if (!openTag[1] && end != \"selfClose\") {\n        var startPos = Pos(iter.line, iter.ch);\n        var endPos = findMatchingClose(iter, openTag[2]);\n        return endPos && cmp(endPos.from, startPos) > 0 ? {from: startPos, to: endPos.from} : null\n      }\n    }\n  });\n  CodeMirror.findMatchingTag = function(cm, pos, range) {\n    var iter = new Iter(cm, pos.line, pos.ch, range);\n    if (iter.text.indexOf(\">\") == -1 && iter.text.indexOf(\"<\") == -1) return;\n    var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);\n    var start = end && toTagStart(iter);\n    if (!end || !start || cmp(iter, pos) > 0) return;\n    var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};\n    if (end == \"selfClose\") return {open: here, close: null, at: \"open\"};\n\n    if (start[1]) { // closing tag\n      return {open: findMatchingOpen(iter, start[2]), close: here, at: \"close\"};\n    } else { // opening tag\n      iter = new Iter(cm, to.line, to.ch, range);\n      return {open: here, close: findMatchingClose(iter, start[2]), at: \"open\"};\n    }\n  };\n\n  CodeMirror.findEnclosingTag = function(cm, pos, range, tag) {\n    var iter = new Iter(cm, pos.line, pos.ch, range);\n    for (;;) {\n      var open = findMatchingOpen(iter, tag);\n      if (!open) break;\n      var forward = new Iter(cm, pos.line, pos.ch, range);\n      var close = findMatchingClose(forward, open.tag);\n      if (close) return {open: open, close: close};\n    }\n  };\n\n  // Used by addon/edit/closetag.js\n  CodeMirror.scanForClosingTag = function(cm, pos, name, end) {\n    var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null);\n    return findMatchingClose(iter, name);\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/hint/anyword-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var WORD = /[\\w$]+/, RANGE = 500;\n\n  CodeMirror.registerHelper(\"hint\", \"anyword\", function(editor, options) {\n    var word = options && options.word || WORD;\n    var range = options && options.range || RANGE;\n    var cur = editor.getCursor(), curLine = editor.getLine(cur.line);\n    var end = cur.ch, start = end;\n    while (start && word.test(curLine.charAt(start - 1))) --start;\n    var curWord = start != end && curLine.slice(start, end);\n\n    var list = options && options.list || [], seen = {};\n    var re = new RegExp(word.source, \"g\");\n    for (var dir = -1; dir <= 1; dir += 2) {\n      var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir;\n      for (; line != endLine; line += dir) {\n        var text = editor.getLine(line), m;\n        while (m = re.exec(text)) {\n          if (line == cur.line && m[0] === curWord) continue;\n          if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) {\n            seen[m[0]] = true;\n            list.push(m[0]);\n          }\n        }\n      }\n    }\n    return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)};\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/hint/css-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../mode/css/css\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../mode/css/css\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var pseudoClasses = {\"active\":1, \"after\":1, \"before\":1, \"checked\":1, \"default\":1,\n    \"disabled\":1, \"empty\":1, \"enabled\":1, \"first-child\":1, \"first-letter\":1,\n    \"first-line\":1, \"first-of-type\":1, \"focus\":1, \"hover\":1, \"in-range\":1,\n    \"indeterminate\":1, \"invalid\":1, \"lang\":1, \"last-child\":1, \"last-of-type\":1,\n    \"link\":1, \"not\":1, \"nth-child\":1, \"nth-last-child\":1, \"nth-last-of-type\":1,\n    \"nth-of-type\":1, \"only-of-type\":1, \"only-child\":1, \"optional\":1, \"out-of-range\":1,\n    \"placeholder\":1, \"read-only\":1, \"read-write\":1, \"required\":1, \"root\":1,\n    \"selection\":1, \"target\":1, \"valid\":1, \"visited\":1\n  };\n\n  CodeMirror.registerHelper(\"hint\", \"css\", function(cm) {\n    var cur = cm.getCursor(), token = cm.getTokenAt(cur);\n    var inner = CodeMirror.innerMode(cm.getMode(), token.state);\n    if (inner.mode.name != \"css\") return;\n\n    if (token.type == \"keyword\" && \"!important\".indexOf(token.string) == 0)\n      return {list: [\"!important\"], from: CodeMirror.Pos(cur.line, token.start),\n              to: CodeMirror.Pos(cur.line, token.end)};\n\n    var start = token.start, end = cur.ch, word = token.string.slice(0, end - start);\n    if (/[^\\w$_-]/.test(word)) {\n      word = \"\"; start = end = cur.ch;\n    }\n\n    var spec = CodeMirror.resolveMode(\"text/css\");\n\n    var result = [];\n    function add(keywords) {\n      for (var name in keywords)\n        if (!word || name.lastIndexOf(word, 0) == 0)\n          result.push(name);\n    }\n\n    var st = inner.state.state;\n    if (st == \"pseudo\" || token.type == \"variable-3\") {\n      add(pseudoClasses);\n    } else if (st == \"block\" || st == \"maybeprop\") {\n      add(spec.propertyKeywords);\n    } else if (st == \"prop\" || st == \"parens\" || st == \"at\" || st == \"params\") {\n      add(spec.valueKeywords);\n      add(spec.colorKeywords);\n    } else if (st == \"media\" || st == \"media_parens\") {\n      add(spec.mediaTypes);\n      add(spec.mediaFeatures);\n    }\n\n    if (result.length) return {\n      list: result,\n      from: CodeMirror.Pos(cur.line, start),\n      to: CodeMirror.Pos(cur.line, end)\n    };\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/hint/html-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./xml-hint\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./xml-hint\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var langs = \"ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu\".split(\" \");\n  var targets = [\"_blank\", \"_self\", \"_top\", \"_parent\"];\n  var charsets = [\"ascii\", \"utf-8\", \"utf-16\", \"latin1\", \"latin1\"];\n  var methods = [\"get\", \"post\", \"put\", \"delete\"];\n  var encs = [\"application/x-www-form-urlencoded\", \"multipart/form-data\", \"text/plain\"];\n  var media = [\"all\", \"screen\", \"print\", \"embossed\", \"braille\", \"handheld\", \"print\", \"projection\", \"screen\", \"tty\", \"tv\", \"speech\",\n               \"3d-glasses\", \"resolution [>][<][=] [X]\", \"device-aspect-ratio: X/Y\", \"orientation:portrait\",\n               \"orientation:landscape\", \"device-height: [X]\", \"device-width: [X]\"];\n  var s = { attrs: {} }; // Simple tag, reused for a whole lot of tags\n\n  var data = {\n    a: {\n      attrs: {\n        href: null, ping: null, type: null,\n        media: media,\n        target: targets,\n        hreflang: langs\n      }\n    },\n    abbr: s,\n    acronym: s,\n    address: s,\n    applet: s,\n    area: {\n      attrs: {\n        alt: null, coords: null, href: null, target: null, ping: null,\n        media: media, hreflang: langs, type: null,\n        shape: [\"default\", \"rect\", \"circle\", \"poly\"]\n      }\n    },\n    article: s,\n    aside: s,\n    audio: {\n      attrs: {\n        src: null, mediagroup: null,\n        crossorigin: [\"anonymous\", \"use-credentials\"],\n        preload: [\"none\", \"metadata\", \"auto\"],\n        autoplay: [\"\", \"autoplay\"],\n        loop: [\"\", \"loop\"],\n        controls: [\"\", \"controls\"]\n      }\n    },\n    b: s,\n    base: { attrs: { href: null, target: targets } },\n    basefont: s,\n    bdi: s,\n    bdo: s,\n    big: s,\n    blockquote: { attrs: { cite: null } },\n    body: s,\n    br: s,\n    button: {\n      attrs: {\n        form: null, formaction: null, name: null, value: null,\n        autofocus: [\"\", \"autofocus\"],\n        disabled: [\"\", \"autofocus\"],\n        formenctype: encs,\n        formmethod: methods,\n        formnovalidate: [\"\", \"novalidate\"],\n        formtarget: targets,\n        type: [\"submit\", \"reset\", \"button\"]\n      }\n    },\n    canvas: { attrs: { width: null, height: null } },\n    caption: s,\n    center: s,\n    cite: s,\n    code: s,\n    col: { attrs: { span: null } },\n    colgroup: { attrs: { span: null } },\n    command: {\n      attrs: {\n        type: [\"command\", \"checkbox\", \"radio\"],\n        label: null, icon: null, radiogroup: null, command: null, title: null,\n        disabled: [\"\", \"disabled\"],\n        checked: [\"\", \"checked\"]\n      }\n    },\n    data: { attrs: { value: null } },\n    datagrid: { attrs: { disabled: [\"\", \"disabled\"], multiple: [\"\", \"multiple\"] } },\n    datalist: { attrs: { data: null } },\n    dd: s,\n    del: { attrs: { cite: null, datetime: null } },\n    details: { attrs: { open: [\"\", \"open\"] } },\n    dfn: s,\n    dir: s,\n    div: s,\n    dialog: { attrs: { open: null } },\n    dl: s,\n    dt: s,\n    em: s,\n    embed: { attrs: { src: null, type: null, width: null, height: null } },\n    eventsource: { attrs: { src: null } },\n    fieldset: { attrs: { disabled: [\"\", \"disabled\"], form: null, name: null } },\n    figcaption: s,\n    figure: s,\n    font: s,\n    footer: s,\n    form: {\n      attrs: {\n        action: null, name: null,\n        \"accept-charset\": charsets,\n        autocomplete: [\"on\", \"off\"],\n        enctype: encs,\n        method: methods,\n        novalidate: [\"\", \"novalidate\"],\n        target: targets\n      }\n    },\n    frame: s,\n    frameset: s,\n    h1: s, h2: s, h3: s, h4: s, h5: s, h6: s,\n    head: {\n      attrs: {},\n      children: [\"title\", \"base\", \"link\", \"style\", \"meta\", \"script\", \"noscript\", \"command\"]\n    },\n    header: s,\n    hgroup: s,\n    hr: s,\n    html: {\n      attrs: { manifest: null },\n      children: [\"head\", \"body\"]\n    },\n    i: s,\n    iframe: {\n      attrs: {\n        src: null, srcdoc: null, name: null, width: null, height: null,\n        sandbox: [\"allow-top-navigation\", \"allow-same-origin\", \"allow-forms\", \"allow-scripts\"],\n        seamless: [\"\", \"seamless\"]\n      }\n    },\n    img: {\n      attrs: {\n        alt: null, src: null, ismap: null, usemap: null, width: null, height: null,\n        crossorigin: [\"anonymous\", \"use-credentials\"]\n      }\n    },\n    input: {\n      attrs: {\n        alt: null, dirname: null, form: null, formaction: null,\n        height: null, list: null, max: null, maxlength: null, min: null,\n        name: null, pattern: null, placeholder: null, size: null, src: null,\n        step: null, value: null, width: null,\n        accept: [\"audio/*\", \"video/*\", \"image/*\"],\n        autocomplete: [\"on\", \"off\"],\n        autofocus: [\"\", \"autofocus\"],\n        checked: [\"\", \"checked\"],\n        disabled: [\"\", \"disabled\"],\n        formenctype: encs,\n        formmethod: methods,\n        formnovalidate: [\"\", \"novalidate\"],\n        formtarget: targets,\n        multiple: [\"\", \"multiple\"],\n        readonly: [\"\", \"readonly\"],\n        required: [\"\", \"required\"],\n        type: [\"hidden\", \"text\", \"search\", \"tel\", \"url\", \"email\", \"password\", \"datetime\", \"date\", \"month\",\n               \"week\", \"time\", \"datetime-local\", \"number\", \"range\", \"color\", \"checkbox\", \"radio\",\n               \"file\", \"submit\", \"image\", \"reset\", \"button\"]\n      }\n    },\n    ins: { attrs: { cite: null, datetime: null } },\n    kbd: s,\n    keygen: {\n      attrs: {\n        challenge: null, form: null, name: null,\n        autofocus: [\"\", \"autofocus\"],\n        disabled: [\"\", \"disabled\"],\n        keytype: [\"RSA\"]\n      }\n    },\n    label: { attrs: { \"for\": null, form: null } },\n    legend: s,\n    li: { attrs: { value: null } },\n    link: {\n      attrs: {\n        href: null, type: null,\n        hreflang: langs,\n        media: media,\n        sizes: [\"all\", \"16x16\", \"16x16 32x32\", \"16x16 32x32 64x64\"]\n      }\n    },\n    map: { attrs: { name: null } },\n    mark: s,\n    menu: { attrs: { label: null, type: [\"list\", \"context\", \"toolbar\"] } },\n    meta: {\n      attrs: {\n        content: null,\n        charset: charsets,\n        name: [\"viewport\", \"application-name\", \"author\", \"description\", \"generator\", \"keywords\"],\n        \"http-equiv\": [\"content-language\", \"content-type\", \"default-style\", \"refresh\"]\n      }\n    },\n    meter: { attrs: { value: null, min: null, low: null, high: null, max: null, optimum: null } },\n    nav: s,\n    noframes: s,\n    noscript: s,\n    object: {\n      attrs: {\n        data: null, type: null, name: null, usemap: null, form: null, width: null, height: null,\n        typemustmatch: [\"\", \"typemustmatch\"]\n      }\n    },\n    ol: { attrs: { reversed: [\"\", \"reversed\"], start: null, type: [\"1\", \"a\", \"A\", \"i\", \"I\"] } },\n    optgroup: { attrs: { disabled: [\"\", \"disabled\"], label: null } },\n    option: { attrs: { disabled: [\"\", \"disabled\"], label: null, selected: [\"\", \"selected\"], value: null } },\n    output: { attrs: { \"for\": null, form: null, name: null } },\n    p: s,\n    param: { attrs: { name: null, value: null } },\n    pre: s,\n    progress: { attrs: { value: null, max: null } },\n    q: { attrs: { cite: null } },\n    rp: s,\n    rt: s,\n    ruby: s,\n    s: s,\n    samp: s,\n    script: {\n      attrs: {\n        type: [\"text/javascript\"],\n        src: null,\n        async: [\"\", \"async\"],\n        defer: [\"\", \"defer\"],\n        charset: charsets\n      }\n    },\n    section: s,\n    select: {\n      attrs: {\n        form: null, name: null, size: null,\n        autofocus: [\"\", \"autofocus\"],\n        disabled: [\"\", \"disabled\"],\n        multiple: [\"\", \"multiple\"]\n      }\n    },\n    small: s,\n    source: { attrs: { src: null, type: null, media: null } },\n    span: s,\n    strike: s,\n    strong: s,\n    style: {\n      attrs: {\n        type: [\"text/css\"],\n        media: media,\n        scoped: null\n      }\n    },\n    sub: s,\n    summary: s,\n    sup: s,\n    table: s,\n    tbody: s,\n    td: { attrs: { colspan: null, rowspan: null, headers: null } },\n    textarea: {\n      attrs: {\n        dirname: null, form: null, maxlength: null, name: null, placeholder: null,\n        rows: null, cols: null,\n        autofocus: [\"\", \"autofocus\"],\n        disabled: [\"\", \"disabled\"],\n        readonly: [\"\", \"readonly\"],\n        required: [\"\", \"required\"],\n        wrap: [\"soft\", \"hard\"]\n      }\n    },\n    tfoot: s,\n    th: { attrs: { colspan: null, rowspan: null, headers: null, scope: [\"row\", \"col\", \"rowgroup\", \"colgroup\"] } },\n    thead: s,\n    time: { attrs: { datetime: null } },\n    title: s,\n    tr: s,\n    track: {\n      attrs: {\n        src: null, label: null, \"default\": null,\n        kind: [\"subtitles\", \"captions\", \"descriptions\", \"chapters\", \"metadata\"],\n        srclang: langs\n      }\n    },\n    tt: s,\n    u: s,\n    ul: s,\n    \"var\": s,\n    video: {\n      attrs: {\n        src: null, poster: null, width: null, height: null,\n        crossorigin: [\"anonymous\", \"use-credentials\"],\n        preload: [\"auto\", \"metadata\", \"none\"],\n        autoplay: [\"\", \"autoplay\"],\n        mediagroup: [\"movie\"],\n        muted: [\"\", \"muted\"],\n        controls: [\"\", \"controls\"]\n      }\n    },\n    wbr: s\n  };\n\n  var globalAttrs = {\n    accesskey: [\"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\"],\n    \"class\": null,\n    contenteditable: [\"true\", \"false\"],\n    contextmenu: null,\n    dir: [\"ltr\", \"rtl\", \"auto\"],\n    draggable: [\"true\", \"false\", \"auto\"],\n    dropzone: [\"copy\", \"move\", \"link\", \"string:\", \"file:\"],\n    hidden: [\"hidden\"],\n    id: null,\n    inert: [\"inert\"],\n    itemid: null,\n    itemprop: null,\n    itemref: null,\n    itemscope: [\"itemscope\"],\n    itemtype: null,\n    lang: [\"en\", \"es\"],\n    spellcheck: [\"true\", \"false\"],\n    autocorrect: [\"true\", \"false\"],\n    autocapitalize: [\"true\", \"false\"],\n    style: null,\n    tabindex: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"],\n    title: null,\n    translate: [\"yes\", \"no\"],\n    onclick: null,\n    rel: [\"stylesheet\", \"alternate\", \"author\", \"bookmark\", \"help\", \"license\", \"next\", \"nofollow\", \"noreferrer\", \"prefetch\", \"prev\", \"search\", \"tag\"]\n  };\n  function populate(obj) {\n    for (var attr in globalAttrs) if (globalAttrs.hasOwnProperty(attr))\n      obj.attrs[attr] = globalAttrs[attr];\n  }\n\n  populate(s);\n  for (var tag in data) if (data.hasOwnProperty(tag) && data[tag] != s)\n    populate(data[tag]);\n\n  CodeMirror.htmlSchema = data;\n  function htmlHint(cm, options) {\n    var local = {schemaInfo: data};\n    if (options) for (var opt in options) local[opt] = options[opt];\n    return CodeMirror.hint.xml(cm, local);\n  }\n  CodeMirror.registerHelper(\"hint\", \"html\", htmlHint);\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/hint/javascript-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var Pos = CodeMirror.Pos;\n\n  function forEach(arr, f) {\n    for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);\n  }\n\n  function arrayContains(arr, item) {\n    if (!Array.prototype.indexOf) {\n      var i = arr.length;\n      while (i--) {\n        if (arr[i] === item) {\n          return true;\n        }\n      }\n      return false;\n    }\n    return arr.indexOf(item) != -1;\n  }\n\n  function scriptHint(editor, keywords, getToken, options) {\n    // Find the token at the cursor\n    var cur = editor.getCursor(), token = getToken(editor, cur);\n    if (/\\b(?:string|comment)\\b/.test(token.type)) return;\n    var innerMode = CodeMirror.innerMode(editor.getMode(), token.state);\n    if (innerMode.mode.helperType === \"json\") return;\n    token.state = innerMode.state;\n\n    // If it's not a 'word-style' token, ignore the token.\n    if (!/^[\\w$_]*$/.test(token.string)) {\n      token = {start: cur.ch, end: cur.ch, string: \"\", state: token.state,\n               type: token.string == \".\" ? \"property\" : null};\n    } else if (token.end > cur.ch) {\n      token.end = cur.ch;\n      token.string = token.string.slice(0, cur.ch - token.start);\n    }\n\n    var tprop = token;\n    // If it is a property, find out what it is a property of.\n    while (tprop.type == \"property\") {\n      tprop = getToken(editor, Pos(cur.line, tprop.start));\n      if (tprop.string != \".\") return;\n      tprop = getToken(editor, Pos(cur.line, tprop.start));\n      if (!context) var context = [];\n      context.push(tprop);\n    }\n    return {list: getCompletions(token, context, keywords, options),\n            from: Pos(cur.line, token.start),\n            to: Pos(cur.line, token.end)};\n  }\n\n  function javascriptHint(editor, options) {\n    return scriptHint(editor, javascriptKeywords,\n                      function (e, cur) {return e.getTokenAt(cur);},\n                      options);\n  };\n  CodeMirror.registerHelper(\"hint\", \"javascript\", javascriptHint);\n\n  function getCoffeeScriptToken(editor, cur) {\n  // This getToken, it is for coffeescript, imitates the behavior of\n  // getTokenAt method in javascript.js, that is, returning \"property\"\n  // type and treat \".\" as independent token.\n    var token = editor.getTokenAt(cur);\n    if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {\n      token.end = token.start;\n      token.string = '.';\n      token.type = \"property\";\n    }\n    else if (/^\\.[\\w$_]*$/.test(token.string)) {\n      token.type = \"property\";\n      token.start++;\n      token.string = token.string.replace(/\\./, '');\n    }\n    return token;\n  }\n\n  function coffeescriptHint(editor, options) {\n    return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);\n  }\n  CodeMirror.registerHelper(\"hint\", \"coffeescript\", coffeescriptHint);\n\n  var stringProps = (\"charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight \" +\n                     \"toUpperCase toLowerCase split concat match replace search\").split(\" \");\n  var arrayProps = (\"length concat join splice push pop shift unshift slice reverse sort indexOf \" +\n                    \"lastIndexOf every some filter forEach map reduce reduceRight \").split(\" \");\n  var funcProps = \"prototype apply call bind\".split(\" \");\n  var javascriptKeywords = (\"break case catch class const continue debugger default delete do else export extends false finally for function \" +\n                  \"if in import instanceof new null return super switch this throw true try typeof var void while with yield\").split(\" \");\n  var coffeescriptKeywords = (\"and break catch class continue delete do else extends false finally for \" +\n                  \"if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes\").split(\" \");\n\n  function forAllProps(obj, callback) {\n    if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) {\n      for (var name in obj) callback(name)\n    } else {\n      for (var o = obj; o; o = Object.getPrototypeOf(o))\n        Object.getOwnPropertyNames(o).forEach(callback)\n    }\n  }\n\n  function getCompletions(token, context, keywords, options) {\n    var found = [], start = token.string, global = options && options.globalScope || window;\n    function maybeAdd(str) {\n      if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str);\n    }\n    function gatherCompletions(obj) {\n      if (typeof obj == \"string\") forEach(stringProps, maybeAdd);\n      else if (obj instanceof Array) forEach(arrayProps, maybeAdd);\n      else if (obj instanceof Function) forEach(funcProps, maybeAdd);\n      forAllProps(obj, maybeAdd)\n    }\n\n    if (context && context.length) {\n      // If this is a property, see if it belongs to some object we can\n      // find in the current environment.\n      var obj = context.pop(), base;\n      if (obj.type && obj.type.indexOf(\"variable\") === 0) {\n        if (options && options.additionalContext)\n          base = options.additionalContext[obj.string];\n        if (!options || options.useGlobalScope !== false)\n          base = base || global[obj.string];\n      } else if (obj.type == \"string\") {\n        base = \"\";\n      } else if (obj.type == \"atom\") {\n        base = 1;\n      } else if (obj.type == \"function\") {\n        if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&\n            (typeof global.jQuery == 'function'))\n          base = global.jQuery();\n        else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function'))\n          base = global._();\n      }\n      while (base != null && context.length)\n        base = base[context.pop().string];\n      if (base != null) gatherCompletions(base);\n    } else {\n      // If not, just look in the global object, any local scope, and optional additional-context\n      // (reading into JS mode internals to get at the local and global variables)\n      for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);\n      for (var c = token.state.context; c; c = c.prev)\n        for (var v = c.vars; v; v = v.next) maybeAdd(v.name)\n      for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);\n      if (options && options.additionalContext != null)\n        for (var key in options.additionalContext)\n          maybeAdd(key);\n      if (!options || options.useGlobalScope !== false)\n        gatherCompletions(global);\n      forEach(keywords, maybeAdd);\n    }\n    return found;\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/hint/show-hint.css",
    "content": ".CodeMirror-hints {\n  position: absolute;\n  z-index: 10;\n  overflow: hidden;\n  list-style: none;\n\n  margin: 0;\n  padding: 2px;\n\n  -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  border-radius: 3px;\n  border: 1px solid silver;\n\n  background: white;\n  font-size: 90%;\n  font-family: monospace;\n\n  max-height: 20em;\n  overflow-y: auto;\n}\n\n.CodeMirror-hint {\n  margin: 0;\n  padding: 0 4px;\n  border-radius: 2px;\n  white-space: pre;\n  color: black;\n  cursor: pointer;\n}\n\nli.CodeMirror-hint-active {\n  background: #08f;\n  color: white;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/hint/show-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// declare global: DOMRect\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var HINT_ELEMENT_CLASS        = \"CodeMirror-hint\";\n  var ACTIVE_HINT_ELEMENT_CLASS = \"CodeMirror-hint-active\";\n\n  // This is the old interface, kept around for now to stay\n  // backwards-compatible.\n  CodeMirror.showHint = function(cm, getHints, options) {\n    if (!getHints) return cm.showHint(options);\n    if (options && options.async) getHints.async = true;\n    var newOpts = {hint: getHints};\n    if (options) for (var prop in options) newOpts[prop] = options[prop];\n    return cm.showHint(newOpts);\n  };\n\n  CodeMirror.defineExtension(\"showHint\", function(options) {\n    options = parseOptions(this, this.getCursor(\"start\"), options);\n    var selections = this.listSelections()\n    if (selections.length > 1) return;\n    // By default, don't allow completion when something is selected.\n    // A hint function can have a `supportsSelection` property to\n    // indicate that it can handle selections.\n    if (this.somethingSelected()) {\n      if (!options.hint.supportsSelection) return;\n      // Don't try with cross-line selections\n      for (var i = 0; i < selections.length; i++)\n        if (selections[i].head.line != selections[i].anchor.line) return;\n    }\n\n    if (this.state.completionActive) this.state.completionActive.close();\n    var completion = this.state.completionActive = new Completion(this, options);\n    if (!completion.options.hint) return;\n\n    CodeMirror.signal(this, \"startCompletion\", this);\n    completion.update(true);\n  });\n\n  CodeMirror.defineExtension(\"closeHint\", function() {\n    if (this.state.completionActive) this.state.completionActive.close()\n  })\n\n  function Completion(cm, options) {\n    this.cm = cm;\n    this.options = options;\n    this.widget = null;\n    this.debounce = 0;\n    this.tick = 0;\n    this.startPos = this.cm.getCursor(\"start\");\n    this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length;\n\n    if (this.options.updateOnCursorActivity) {\n      var self = this;\n      cm.on(\"cursorActivity\", this.activityFunc = function() { self.cursorActivity(); });\n    }\n  }\n\n  var requestAnimationFrame = window.requestAnimationFrame || function(fn) {\n    return setTimeout(fn, 1000/60);\n  };\n  var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;\n\n  Completion.prototype = {\n    close: function() {\n      if (!this.active()) return;\n      this.cm.state.completionActive = null;\n      this.tick = null;\n      if (this.options.updateOnCursorActivity) {\n        this.cm.off(\"cursorActivity\", this.activityFunc);\n      }\n\n      if (this.widget && this.data) CodeMirror.signal(this.data, \"close\");\n      if (this.widget) this.widget.close();\n      CodeMirror.signal(this.cm, \"endCompletion\", this.cm);\n    },\n\n    active: function() {\n      return this.cm.state.completionActive == this;\n    },\n\n    pick: function(data, i) {\n      var completion = data.list[i], self = this;\n      this.cm.operation(function() {\n        if (completion.hint)\n          completion.hint(self.cm, data, completion);\n        else\n          self.cm.replaceRange(getText(completion), completion.from || data.from,\n                               completion.to || data.to, \"complete\");\n        CodeMirror.signal(data, \"pick\", completion);\n        self.cm.scrollIntoView();\n      });\n      if (this.options.closeOnPick) {\n        this.close();\n      }\n    },\n\n    cursorActivity: function() {\n      if (this.debounce) {\n        cancelAnimationFrame(this.debounce);\n        this.debounce = 0;\n      }\n\n      var identStart = this.startPos;\n      if(this.data) {\n        identStart = this.data.from;\n      }\n\n      var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line);\n      if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch ||\n          pos.ch < identStart.ch || this.cm.somethingSelected() ||\n          (!pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {\n        this.close();\n      } else {\n        var self = this;\n        this.debounce = requestAnimationFrame(function() {self.update();});\n        if (this.widget) this.widget.disable();\n      }\n    },\n\n    update: function(first) {\n      if (this.tick == null) return\n      var self = this, myTick = ++this.tick\n      fetchHints(this.options.hint, this.cm, this.options, function(data) {\n        if (self.tick == myTick) self.finishUpdate(data, first)\n      })\n    },\n\n    finishUpdate: function(data, first) {\n      if (this.data) CodeMirror.signal(this.data, \"update\");\n\n      var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle);\n      if (this.widget) this.widget.close();\n\n      this.data = data;\n\n      if (data && data.list.length) {\n        if (picked && data.list.length == 1) {\n          this.pick(data, 0);\n        } else {\n          this.widget = new Widget(this, data);\n          CodeMirror.signal(data, \"shown\");\n        }\n      }\n    }\n  };\n\n  function parseOptions(cm, pos, options) {\n    var editor = cm.options.hintOptions;\n    var out = {};\n    for (var prop in defaultOptions) out[prop] = defaultOptions[prop];\n    if (editor) for (var prop in editor)\n      if (editor[prop] !== undefined) out[prop] = editor[prop];\n    if (options) for (var prop in options)\n      if (options[prop] !== undefined) out[prop] = options[prop];\n    if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos)\n    return out;\n  }\n\n  function getText(completion) {\n    if (typeof completion == \"string\") return completion;\n    else return completion.text;\n  }\n\n  function buildKeyMap(completion, handle) {\n    var baseMap = {\n      Up: function() {handle.moveFocus(-1);},\n      Down: function() {handle.moveFocus(1);},\n      PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);},\n      PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);},\n      Home: function() {handle.setFocus(0);},\n      End: function() {handle.setFocus(handle.length - 1);},\n      Enter: handle.pick,\n      Tab: handle.pick,\n      Esc: handle.close\n    };\n\n    var mac = /Mac/.test(navigator.platform);\n\n    if (mac) {\n      baseMap[\"Ctrl-P\"] = function() {handle.moveFocus(-1);};\n      baseMap[\"Ctrl-N\"] = function() {handle.moveFocus(1);};\n    }\n\n    var custom = completion.options.customKeys;\n    var ourMap = custom ? {} : baseMap;\n    function addBinding(key, val) {\n      var bound;\n      if (typeof val != \"string\")\n        bound = function(cm) { return val(cm, handle); };\n      // This mechanism is deprecated\n      else if (baseMap.hasOwnProperty(val))\n        bound = baseMap[val];\n      else\n        bound = val;\n      ourMap[key] = bound;\n    }\n    if (custom)\n      for (var key in custom) if (custom.hasOwnProperty(key))\n        addBinding(key, custom[key]);\n    var extra = completion.options.extraKeys;\n    if (extra)\n      for (var key in extra) if (extra.hasOwnProperty(key))\n        addBinding(key, extra[key]);\n    return ourMap;\n  }\n\n  function getHintElement(hintsElement, el) {\n    while (el && el != hintsElement) {\n      if (el.nodeName.toUpperCase() === \"LI\" && el.parentNode == hintsElement) return el;\n      el = el.parentNode;\n    }\n  }\n\n  function Widget(completion, data) {\n    this.id = \"cm-complete-\" + Math.floor(Math.random(1e6))\n    this.completion = completion;\n    this.data = data;\n    this.picked = false;\n    var widget = this, cm = completion.cm;\n    var ownerDocument = cm.getInputField().ownerDocument;\n    var parentWindow = ownerDocument.defaultView || ownerDocument.parentWindow;\n\n    var hints = this.hints = ownerDocument.createElement(\"ul\");\n    hints.setAttribute(\"role\", \"listbox\")\n    hints.setAttribute(\"aria-expanded\", \"true\")\n    hints.id = this.id\n    var theme = completion.cm.options.theme;\n    hints.className = \"CodeMirror-hints \" + theme;\n    this.selectedHint = data.selectedHint || 0;\n\n    var completions = data.list;\n    for (var i = 0; i < completions.length; ++i) {\n      var elt = hints.appendChild(ownerDocument.createElement(\"li\")), cur = completions[i];\n      var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? \"\" : \" \" + ACTIVE_HINT_ELEMENT_CLASS);\n      if (cur.className != null) className = cur.className + \" \" + className;\n      elt.className = className;\n      if (i == this.selectedHint) elt.setAttribute(\"aria-selected\", \"true\")\n      elt.id = this.id + \"-\" + i\n      elt.setAttribute(\"role\", \"option\")\n      if (cur.render) cur.render(elt, data, cur);\n      else elt.appendChild(ownerDocument.createTextNode(cur.displayText || getText(cur)));\n      elt.hintId = i;\n    }\n\n    var container = completion.options.container || ownerDocument.body;\n    var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null);\n    var left = pos.left, top = pos.bottom, below = true;\n    var offsetLeft = 0, offsetTop = 0;\n    if (container !== ownerDocument.body) {\n      // We offset the cursor position because left and top are relative to the offsetParent's top left corner.\n      var isContainerPositioned = ['absolute', 'relative', 'fixed'].indexOf(parentWindow.getComputedStyle(container).position) !== -1;\n      var offsetParent = isContainerPositioned ? container : container.offsetParent;\n      var offsetParentPosition = offsetParent.getBoundingClientRect();\n      var bodyPosition = ownerDocument.body.getBoundingClientRect();\n      offsetLeft = (offsetParentPosition.left - bodyPosition.left - offsetParent.scrollLeft);\n      offsetTop = (offsetParentPosition.top - bodyPosition.top - offsetParent.scrollTop);\n    }\n    hints.style.left = (left - offsetLeft) + \"px\";\n    hints.style.top = (top - offsetTop) + \"px\";\n\n    // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.\n    var winW = parentWindow.innerWidth || Math.max(ownerDocument.body.offsetWidth, ownerDocument.documentElement.offsetWidth);\n    var winH = parentWindow.innerHeight || Math.max(ownerDocument.body.offsetHeight, ownerDocument.documentElement.offsetHeight);\n    container.appendChild(hints);\n    cm.getInputField().setAttribute(\"aria-autocomplete\", \"list\")\n    cm.getInputField().setAttribute(\"aria-owns\", this.id)\n    cm.getInputField().setAttribute(\"aria-activedescendant\", this.id + \"-\" + this.selectedHint)\n\n    var box = completion.options.moveOnOverlap ? hints.getBoundingClientRect() : new DOMRect();\n    var scrolls = completion.options.paddingForScrollbar ? hints.scrollHeight > hints.clientHeight + 1 : false;\n\n    // Compute in the timeout to avoid reflow on init\n    var startScroll;\n    setTimeout(function() { startScroll = cm.getScrollInfo(); });\n\n    var overlapY = box.bottom - winH;\n    if (overlapY > 0) {\n      var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top);\n      if (curTop - height > 0) { // Fits above cursor\n        hints.style.top = (top = pos.top - height - offsetTop) + \"px\";\n        below = false;\n      } else if (height > winH) {\n        hints.style.height = (winH - 5) + \"px\";\n        hints.style.top = (top = pos.bottom - box.top - offsetTop) + \"px\";\n        var cursor = cm.getCursor();\n        if (data.from.ch != cursor.ch) {\n          pos = cm.cursorCoords(cursor);\n          hints.style.left = (left = pos.left - offsetLeft) + \"px\";\n          box = hints.getBoundingClientRect();\n        }\n      }\n    }\n    var overlapX = box.right - winW;\n    if (scrolls) overlapX += cm.display.nativeBarWidth;\n    if (overlapX > 0) {\n      if (box.right - box.left > winW) {\n        hints.style.width = (winW - 5) + \"px\";\n        overlapX -= (box.right - box.left) - winW;\n      }\n      hints.style.left = (left = pos.left - overlapX - offsetLeft) + \"px\";\n    }\n    if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling)\n      node.style.paddingRight = cm.display.nativeBarWidth + \"px\"\n\n    cm.addKeyMap(this.keyMap = buildKeyMap(completion, {\n      moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); },\n      setFocus: function(n) { widget.changeActive(n); },\n      menuSize: function() { return widget.screenAmount(); },\n      length: completions.length,\n      close: function() { completion.close(); },\n      pick: function() { widget.pick(); },\n      data: data\n    }));\n\n    if (completion.options.closeOnUnfocus) {\n      var closingOnBlur;\n      cm.on(\"blur\", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); });\n      cm.on(\"focus\", this.onFocus = function() { clearTimeout(closingOnBlur); });\n    }\n\n    cm.on(\"scroll\", this.onScroll = function() {\n      var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect();\n      if (!startScroll) startScroll = cm.getScrollInfo();\n      var newTop = top + startScroll.top - curScroll.top;\n      var point = newTop - (parentWindow.pageYOffset || (ownerDocument.documentElement || ownerDocument.body).scrollTop);\n      if (!below) point += hints.offsetHeight;\n      if (point <= editor.top || point >= editor.bottom) return completion.close();\n      hints.style.top = newTop + \"px\";\n      hints.style.left = (left + startScroll.left - curScroll.left) + \"px\";\n    });\n\n    CodeMirror.on(hints, \"dblclick\", function(e) {\n      var t = getHintElement(hints, e.target || e.srcElement);\n      if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();}\n    });\n\n    CodeMirror.on(hints, \"click\", function(e) {\n      var t = getHintElement(hints, e.target || e.srcElement);\n      if (t && t.hintId != null) {\n        widget.changeActive(t.hintId);\n        if (completion.options.completeOnSingleClick) widget.pick();\n      }\n    });\n\n    CodeMirror.on(hints, \"mousedown\", function() {\n      setTimeout(function(){cm.focus();}, 20);\n    });\n\n    // The first hint doesn't need to be scrolled to on init\n    var selectedHintRange = this.getSelectedHintRange();\n    if (selectedHintRange.from !== 0 || selectedHintRange.to !== 0) {\n      this.scrollToActive();\n    }\n\n    CodeMirror.signal(data, \"select\", completions[this.selectedHint], hints.childNodes[this.selectedHint]);\n    return true;\n  }\n\n  Widget.prototype = {\n    close: function() {\n      if (this.completion.widget != this) return;\n      this.completion.widget = null;\n      if (this.hints.parentNode) this.hints.parentNode.removeChild(this.hints);\n      this.completion.cm.removeKeyMap(this.keyMap);\n      var input = this.completion.cm.getInputField()\n      input.removeAttribute(\"aria-activedescendant\")\n      input.removeAttribute(\"aria-owns\")\n\n      var cm = this.completion.cm;\n      if (this.completion.options.closeOnUnfocus) {\n        cm.off(\"blur\", this.onBlur);\n        cm.off(\"focus\", this.onFocus);\n      }\n      cm.off(\"scroll\", this.onScroll);\n    },\n\n    disable: function() {\n      this.completion.cm.removeKeyMap(this.keyMap);\n      var widget = this;\n      this.keyMap = {Enter: function() { widget.picked = true; }};\n      this.completion.cm.addKeyMap(this.keyMap);\n    },\n\n    pick: function() {\n      this.completion.pick(this.data, this.selectedHint);\n    },\n\n    changeActive: function(i, avoidWrap) {\n      if (i >= this.data.list.length)\n        i = avoidWrap ? this.data.list.length - 1 : 0;\n      else if (i < 0)\n        i = avoidWrap ? 0  : this.data.list.length - 1;\n      if (this.selectedHint == i) return;\n      var node = this.hints.childNodes[this.selectedHint];\n      if (node) {\n        node.className = node.className.replace(\" \" + ACTIVE_HINT_ELEMENT_CLASS, \"\");\n        node.removeAttribute(\"aria-selected\")\n      }\n      node = this.hints.childNodes[this.selectedHint = i];\n      node.className += \" \" + ACTIVE_HINT_ELEMENT_CLASS;\n      node.setAttribute(\"aria-selected\", \"true\")\n      this.completion.cm.getInputField().setAttribute(\"aria-activedescendant\", node.id)\n      this.scrollToActive()\n      CodeMirror.signal(this.data, \"select\", this.data.list[this.selectedHint], node);\n    },\n\n    scrollToActive: function() {\n      var selectedHintRange = this.getSelectedHintRange();\n      var node1 = this.hints.childNodes[selectedHintRange.from];\n      var node2 = this.hints.childNodes[selectedHintRange.to];\n      var firstNode = this.hints.firstChild;\n      if (node1.offsetTop < this.hints.scrollTop)\n        this.hints.scrollTop = node1.offsetTop - firstNode.offsetTop;\n      else if (node2.offsetTop + node2.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)\n        this.hints.scrollTop = node2.offsetTop + node2.offsetHeight - this.hints.clientHeight + firstNode.offsetTop;\n    },\n\n    screenAmount: function() {\n      return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1;\n    },\n\n    getSelectedHintRange: function() {\n      var margin = this.completion.options.scrollMargin || 0;\n      return {\n        from: Math.max(0, this.selectedHint - margin),\n        to: Math.min(this.data.list.length - 1, this.selectedHint + margin),\n      };\n    }\n  };\n\n  function applicableHelpers(cm, helpers) {\n    if (!cm.somethingSelected()) return helpers\n    var result = []\n    for (var i = 0; i < helpers.length; i++)\n      if (helpers[i].supportsSelection) result.push(helpers[i])\n    return result\n  }\n\n  function fetchHints(hint, cm, options, callback) {\n    if (hint.async) {\n      hint(cm, callback, options)\n    } else {\n      var result = hint(cm, options)\n      if (result && result.then) result.then(callback)\n      else callback(result)\n    }\n  }\n\n  function resolveAutoHints(cm, pos) {\n    var helpers = cm.getHelpers(pos, \"hint\"), words\n    if (helpers.length) {\n      var resolved = function(cm, callback, options) {\n        var app = applicableHelpers(cm, helpers);\n        function run(i) {\n          if (i == app.length) return callback(null)\n          fetchHints(app[i], cm, options, function(result) {\n            if (result && result.list.length > 0) callback(result)\n            else run(i + 1)\n          })\n        }\n        run(0)\n      }\n      resolved.async = true\n      resolved.supportsSelection = true\n      return resolved\n    } else if (words = cm.getHelper(cm.getCursor(), \"hintWords\")) {\n      return function(cm) { return CodeMirror.hint.fromList(cm, {words: words}) }\n    } else if (CodeMirror.hint.anyword) {\n      return function(cm, options) { return CodeMirror.hint.anyword(cm, options) }\n    } else {\n      return function() {}\n    }\n  }\n\n  CodeMirror.registerHelper(\"hint\", \"auto\", {\n    resolve: resolveAutoHints\n  });\n\n  CodeMirror.registerHelper(\"hint\", \"fromList\", function(cm, options) {\n    var cur = cm.getCursor(), token = cm.getTokenAt(cur)\n    var term, from = CodeMirror.Pos(cur.line, token.start), to = cur\n    if (token.start < cur.ch && /\\w/.test(token.string.charAt(cur.ch - token.start - 1))) {\n      term = token.string.substr(0, cur.ch - token.start)\n    } else {\n      term = \"\"\n      from = cur\n    }\n    var found = [];\n    for (var i = 0; i < options.words.length; i++) {\n      var word = options.words[i];\n      if (word.slice(0, term.length) == term)\n        found.push(word);\n    }\n\n    if (found.length) return {list: found, from: from, to: to};\n  });\n\n  CodeMirror.commands.autocomplete = CodeMirror.showHint;\n\n  var defaultOptions = {\n    hint: CodeMirror.hint.auto,\n    completeSingle: true,\n    alignWithWord: true,\n    closeCharacters: /[\\s()\\[\\]{};:>,]/,\n    closeOnPick: true,\n    closeOnUnfocus: true,\n    updateOnCursorActivity: true,\n    completeOnSingleClick: true,\n    container: null,\n    customKeys: null,\n    extraKeys: null,\n    paddingForScrollbar: true,\n    moveOnOverlap: true,\n  };\n\n  CodeMirror.defineOption(\"hintOptions\", null);\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/hint/sql-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../mode/sql/sql\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../mode/sql/sql\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var tables;\n  var defaultTable;\n  var keywords;\n  var identifierQuote;\n  var CONS = {\n    QUERY_DIV: \";\",\n    ALIAS_KEYWORD: \"AS\"\n  };\n  var Pos = CodeMirror.Pos, cmpPos = CodeMirror.cmpPos;\n\n  function isArray(val) { return Object.prototype.toString.call(val) == \"[object Array]\" }\n\n  function getKeywords(editor) {\n    var mode = editor.doc.modeOption;\n    if (mode === \"sql\") mode = \"text/x-sql\";\n    return CodeMirror.resolveMode(mode).keywords;\n  }\n\n  function getIdentifierQuote(editor) {\n    var mode = editor.doc.modeOption;\n    if (mode === \"sql\") mode = \"text/x-sql\";\n    return CodeMirror.resolveMode(mode).identifierQuote || \"`\";\n  }\n\n  function getText(item) {\n    return typeof item == \"string\" ? item : item.text;\n  }\n\n  function wrapTable(name, value) {\n    if (isArray(value)) value = {columns: value}\n    if (!value.text) value.text = name\n    return value\n  }\n\n  function parseTables(input) {\n    var result = {}\n    if (isArray(input)) {\n      for (var i = input.length - 1; i >= 0; i--) {\n        var item = input[i]\n        result[getText(item).toUpperCase()] = wrapTable(getText(item), item)\n      }\n    } else if (input) {\n      for (var name in input)\n        result[name.toUpperCase()] = wrapTable(name, input[name])\n    }\n    return result\n  }\n\n  function getTable(name) {\n    return tables[name.toUpperCase()]\n  }\n\n  function shallowClone(object) {\n    var result = {};\n    for (var key in object) if (object.hasOwnProperty(key))\n      result[key] = object[key];\n    return result;\n  }\n\n  function match(string, word) {\n    var len = string.length;\n    var sub = getText(word).substr(0, len);\n    return string.toUpperCase() === sub.toUpperCase();\n  }\n\n  function addMatches(result, search, wordlist, formatter) {\n    if (isArray(wordlist)) {\n      for (var i = 0; i < wordlist.length; i++)\n        if (match(search, wordlist[i])) result.push(formatter(wordlist[i]))\n    } else {\n      for (var word in wordlist) if (wordlist.hasOwnProperty(word)) {\n        var val = wordlist[word]\n        if (!val || val === true)\n          val = word\n        else\n          val = val.displayText ? {text: val.text, displayText: val.displayText} : val.text\n        if (match(search, val)) result.push(formatter(val))\n      }\n    }\n  }\n\n  function cleanName(name) {\n    // Get rid name from identifierQuote and preceding dot(.)\n    if (name.charAt(0) == \".\") {\n      name = name.substr(1);\n    }\n    // replace duplicated identifierQuotes with single identifierQuotes\n    // and remove single identifierQuotes\n    var nameParts = name.split(identifierQuote+identifierQuote);\n    for (var i = 0; i < nameParts.length; i++)\n      nameParts[i] = nameParts[i].replace(new RegExp(identifierQuote,\"g\"), \"\");\n    return nameParts.join(identifierQuote);\n  }\n\n  function insertIdentifierQuotes(name) {\n    var nameParts = getText(name).split(\".\");\n    for (var i = 0; i < nameParts.length; i++)\n      nameParts[i] = identifierQuote +\n        // duplicate identifierQuotes\n        nameParts[i].replace(new RegExp(identifierQuote,\"g\"), identifierQuote+identifierQuote) +\n        identifierQuote;\n    var escaped = nameParts.join(\".\");\n    if (typeof name == \"string\") return escaped;\n    name = shallowClone(name);\n    name.text = escaped;\n    return name;\n  }\n\n  function nameCompletion(cur, token, result, editor) {\n    // Try to complete table, column names and return start position of completion\n    var useIdentifierQuotes = false;\n    var nameParts = [];\n    var start = token.start;\n    var cont = true;\n    while (cont) {\n      cont = (token.string.charAt(0) == \".\");\n      useIdentifierQuotes = useIdentifierQuotes || (token.string.charAt(0) == identifierQuote);\n\n      start = token.start;\n      nameParts.unshift(cleanName(token.string));\n\n      token = editor.getTokenAt(Pos(cur.line, token.start));\n      if (token.string == \".\") {\n        cont = true;\n        token = editor.getTokenAt(Pos(cur.line, token.start));\n      }\n    }\n\n    // Try to complete table names\n    var string = nameParts.join(\".\");\n    addMatches(result, string, tables, function(w) {\n      return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;\n    });\n\n    // Try to complete columns from defaultTable\n    addMatches(result, string, defaultTable, function(w) {\n      return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;\n    });\n\n    // Try to complete columns\n    string = nameParts.pop();\n    var table = nameParts.join(\".\");\n\n    var alias = false;\n    var aliasTable = table;\n    // Check if table is available. If not, find table by Alias\n    if (!getTable(table)) {\n      var oldTable = table;\n      table = findTableByAlias(table, editor);\n      if (table !== oldTable) alias = true;\n    }\n\n    var columns = getTable(table);\n    if (columns && columns.columns)\n      columns = columns.columns;\n\n    if (columns) {\n      addMatches(result, string, columns, function(w) {\n        var tableInsert = table;\n        if (alias == true) tableInsert = aliasTable;\n        if (typeof w == \"string\") {\n          w = tableInsert + \".\" + w;\n        } else {\n          w = shallowClone(w);\n          w.text = tableInsert + \".\" + w.text;\n        }\n        return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;\n      });\n    }\n\n    return start;\n  }\n\n  function eachWord(lineText, f) {\n    var words = lineText.split(/\\s+/)\n    for (var i = 0; i < words.length; i++)\n      if (words[i]) f(words[i].replace(/[`,;]/g, ''))\n  }\n\n  function findTableByAlias(alias, editor) {\n    var doc = editor.doc;\n    var fullQuery = doc.getValue();\n    var aliasUpperCase = alias.toUpperCase();\n    var previousWord = \"\";\n    var table = \"\";\n    var separator = [];\n    var validRange = {\n      start: Pos(0, 0),\n      end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length)\n    };\n\n    //add separator\n    var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV);\n    while(indexOfSeparator != -1) {\n      separator.push(doc.posFromIndex(indexOfSeparator));\n      indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1);\n    }\n    separator.unshift(Pos(0, 0));\n    separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length));\n\n    //find valid range\n    var prevItem = null;\n    var current = editor.getCursor()\n    for (var i = 0; i < separator.length; i++) {\n      if ((prevItem == null || cmpPos(current, prevItem) > 0) && cmpPos(current, separator[i]) <= 0) {\n        validRange = {start: prevItem, end: separator[i]};\n        break;\n      }\n      prevItem = separator[i];\n    }\n\n    if (validRange.start) {\n      var query = doc.getRange(validRange.start, validRange.end, false);\n\n      for (var i = 0; i < query.length; i++) {\n        var lineText = query[i];\n        eachWord(lineText, function(word) {\n          var wordUpperCase = word.toUpperCase();\n          if (wordUpperCase === aliasUpperCase && getTable(previousWord))\n            table = previousWord;\n          if (wordUpperCase !== CONS.ALIAS_KEYWORD)\n            previousWord = word;\n        });\n        if (table) break;\n      }\n    }\n    return table;\n  }\n\n  CodeMirror.registerHelper(\"hint\", \"sql\", function(editor, options) {\n    tables = parseTables(options && options.tables)\n    var defaultTableName = options && options.defaultTable;\n    var disableKeywords = options && options.disableKeywords;\n    defaultTable = defaultTableName && getTable(defaultTableName);\n    keywords = getKeywords(editor);\n    identifierQuote = getIdentifierQuote(editor);\n\n    if (defaultTableName && !defaultTable)\n      defaultTable = findTableByAlias(defaultTableName, editor);\n\n    defaultTable = defaultTable || [];\n\n    if (defaultTable.columns)\n      defaultTable = defaultTable.columns;\n\n    var cur = editor.getCursor();\n    var result = [];\n    var token = editor.getTokenAt(cur), start, end, search;\n    if (token.end > cur.ch) {\n      token.end = cur.ch;\n      token.string = token.string.slice(0, cur.ch - token.start);\n    }\n\n    if (token.string.match(/^[.`\"'\\w@][\\w$#]*$/g)) {\n      search = token.string;\n      start = token.start;\n      end = token.end;\n    } else {\n      start = end = cur.ch;\n      search = \"\";\n    }\n    if (search.charAt(0) == \".\" || search.charAt(0) == identifierQuote) {\n      start = nameCompletion(cur, token, result, editor);\n    } else {\n      var objectOrClass = function(w, className) {\n        if (typeof w === \"object\") {\n          w.className = className;\n        } else {\n          w = { text: w, className: className };\n        }\n        return w;\n      };\n    addMatches(result, search, defaultTable, function(w) {\n        return objectOrClass(w, \"CodeMirror-hint-table CodeMirror-hint-default-table\");\n    });\n    addMatches(\n        result,\n        search,\n        tables, function(w) {\n          return objectOrClass(w, \"CodeMirror-hint-table\");\n        }\n    );\n    if (!disableKeywords)\n      addMatches(result, search, keywords, function(w) {\n          return objectOrClass(w.toUpperCase(), \"CodeMirror-hint-keyword\");\n      });\n  }\n\n    return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)};\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/hint/xml-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var Pos = CodeMirror.Pos;\n\n  function matches(hint, typed, matchInMiddle) {\n    if (matchInMiddle) return hint.indexOf(typed) >= 0;\n    else return hint.lastIndexOf(typed, 0) == 0;\n  }\n\n  function getHints(cm, options) {\n    var tags = options && options.schemaInfo;\n    var quote = (options && options.quoteChar) || '\"';\n    var matchInMiddle = options && options.matchInMiddle;\n    if (!tags) return;\n    var cur = cm.getCursor(), token = cm.getTokenAt(cur);\n    if (token.end > cur.ch) {\n      token.end = cur.ch;\n      token.string = token.string.slice(0, cur.ch - token.start);\n    }\n    var inner = CodeMirror.innerMode(cm.getMode(), token.state);\n    if (!inner.mode.xmlCurrentTag) return\n    var result = [], replaceToken = false, prefix;\n    var tag = /\\btag\\b/.test(token.type) && !/>$/.test(token.string);\n    var tagName = tag && /^\\w/.test(token.string), tagStart;\n\n    if (tagName) {\n      var before = cm.getLine(cur.line).slice(Math.max(0, token.start - 2), token.start);\n      var tagType = /<\\/$/.test(before) ? \"close\" : /<$/.test(before) ? \"open\" : null;\n      if (tagType) tagStart = token.start - (tagType == \"close\" ? 2 : 1);\n    } else if (tag && token.string == \"<\") {\n      tagType = \"open\";\n    } else if (tag && token.string == \"</\") {\n      tagType = \"close\";\n    }\n\n    var tagInfo = inner.mode.xmlCurrentTag(inner.state)\n    if (!tag && !tagInfo || tagType) {\n      if (tagName)\n        prefix = token.string;\n      replaceToken = tagType;\n      var context = inner.mode.xmlCurrentContext ? inner.mode.xmlCurrentContext(inner.state) : []\n      var inner = context.length && context[context.length - 1]\n      var curTag = inner && tags[inner]\n      var childList = inner ? curTag && curTag.children : tags[\"!top\"];\n      if (childList && tagType != \"close\") {\n        for (var i = 0; i < childList.length; ++i) if (!prefix || matches(childList[i], prefix, matchInMiddle))\n          result.push(\"<\" + childList[i]);\n      } else if (tagType != \"close\") {\n        for (var name in tags)\n          if (tags.hasOwnProperty(name) && name != \"!top\" && name != \"!attrs\" && (!prefix || matches(name, prefix, matchInMiddle)))\n            result.push(\"<\" + name);\n      }\n      if (inner && (!prefix || tagType == \"close\" && matches(inner, prefix, matchInMiddle)))\n        result.push(\"</\" + inner + \">\");\n    } else {\n      // Attribute completion\n      var curTag = tagInfo && tags[tagInfo.name], attrs = curTag && curTag.attrs;\n      var globalAttrs = tags[\"!attrs\"];\n      if (!attrs && !globalAttrs) return;\n      if (!attrs) {\n        attrs = globalAttrs;\n      } else if (globalAttrs) { // Combine tag-local and global attributes\n        var set = {};\n        for (var nm in globalAttrs) if (globalAttrs.hasOwnProperty(nm)) set[nm] = globalAttrs[nm];\n        for (var nm in attrs) if (attrs.hasOwnProperty(nm)) set[nm] = attrs[nm];\n        attrs = set;\n      }\n      if (token.type == \"string\" || token.string == \"=\") { // A value\n        var before = cm.getRange(Pos(cur.line, Math.max(0, cur.ch - 60)),\n                                 Pos(cur.line, token.type == \"string\" ? token.start : token.end));\n        var atName = before.match(/([^\\s\\u00a0=<>\\\"\\']+)=$/), atValues;\n        if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return;\n        if (typeof atValues == 'function') atValues = atValues.call(this, cm); // Functions can be used to supply values for autocomplete widget\n        if (token.type == \"string\") {\n          prefix = token.string;\n          var n = 0;\n          if (/['\"]/.test(token.string.charAt(0))) {\n            quote = token.string.charAt(0);\n            prefix = token.string.slice(1);\n            n++;\n          }\n          var len = token.string.length;\n          if (/['\"]/.test(token.string.charAt(len - 1))) {\n            quote = token.string.charAt(len - 1);\n            prefix = token.string.substr(n, len - 2);\n          }\n          if (n) { // an opening quote\n            var line = cm.getLine(cur.line);\n            if (line.length > token.end && line.charAt(token.end) == quote) token.end++; // include a closing quote\n          }\n          replaceToken = true;\n        }\n        var returnHintsFromAtValues = function(atValues) {\n          if (atValues)\n            for (var i = 0; i < atValues.length; ++i) if (!prefix || matches(atValues[i], prefix, matchInMiddle))\n              result.push(quote + atValues[i] + quote);\n          return returnHints();\n        };\n        if (atValues && atValues.then) return atValues.then(returnHintsFromAtValues);\n        return returnHintsFromAtValues(atValues);\n      } else { // An attribute name\n        if (token.type == \"attribute\") {\n          prefix = token.string;\n          replaceToken = true;\n        }\n        for (var attr in attrs) if (attrs.hasOwnProperty(attr) && (!prefix || matches(attr, prefix, matchInMiddle)))\n          result.push(attr);\n      }\n    }\n    function returnHints() {\n      return {\n        list: result,\n        from: replaceToken ? Pos(cur.line, tagStart == null ? token.start : tagStart) : cur,\n        to: replaceToken ? Pos(cur.line, token.end) : cur\n      };\n    }\n    return returnHints();\n  }\n\n  CodeMirror.registerHelper(\"hint\", \"xml\", getHints);\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/lint/coffeescript-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js\n\n// declare global: coffeelint\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"lint\", \"coffeescript\", function(text) {\n  var found = [];\n  if (!window.coffeelint) {\n    if (window.console) {\n      window.console.error(\"Error: window.coffeelint not defined, CodeMirror CoffeeScript linting cannot run.\");\n    }\n    return found;\n  }\n  var parseError = function(err) {\n    var loc = err.lineNumber;\n    found.push({from: CodeMirror.Pos(loc-1, 0),\n                to: CodeMirror.Pos(loc, 0),\n                severity: err.level,\n                message: err.message});\n  };\n  try {\n    var res = coffeelint.lint(text);\n    for(var i = 0; i < res.length; i++) {\n      parseError(res[i]);\n    }\n  } catch(e) {\n    found.push({from: CodeMirror.Pos(e.location.first_line, 0),\n                to: CodeMirror.Pos(e.location.last_line, e.location.last_column),\n                severity: 'error',\n                message: e.message});\n  }\n  return found;\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/lint/css-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Depends on csslint.js from https://github.com/stubbornella/csslint\n\n// declare global: CSSLint\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"lint\", \"css\", function(text, options) {\n  var found = [];\n  if (!window.CSSLint) {\n    if (window.console) {\n        window.console.error(\"Error: window.CSSLint not defined, CodeMirror CSS linting cannot run.\");\n    }\n    return found;\n  }\n  var results = CSSLint.verify(text, options), messages = results.messages, message = null;\n  for ( var i = 0; i < messages.length; i++) {\n    message = messages[i];\n    var startLine = message.line -1, endLine = message.line -1, startCol = message.col -1, endCol = message.col;\n    found.push({\n      from: CodeMirror.Pos(startLine, startCol),\n      to: CodeMirror.Pos(endLine, endCol),\n      message: message.message,\n      severity : message.type\n    });\n  }\n  return found;\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/lint/html-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Depends on htmlhint.js from http://htmlhint.com/js/htmlhint.js\n\n// declare global: HTMLHint\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"htmlhint\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"htmlhint\"], mod);\n  else // Plain browser env\n    mod(CodeMirror, window.HTMLHint);\n})(function(CodeMirror, HTMLHint) {\n  \"use strict\";\n\n  var defaultRules = {\n    \"tagname-lowercase\": true,\n    \"attr-lowercase\": true,\n    \"attr-value-double-quotes\": true,\n    \"doctype-first\": false,\n    \"tag-pair\": true,\n    \"spec-char-escape\": true,\n    \"id-unique\": true,\n    \"src-not-empty\": true,\n    \"attr-no-duplication\": true\n  };\n\n  CodeMirror.registerHelper(\"lint\", \"html\", function(text, options) {\n    var found = [];\n    if (HTMLHint && !HTMLHint.verify) {\n      if(typeof HTMLHint.default !== 'undefined') {\n        HTMLHint = HTMLHint.default;\n      } else {\n        HTMLHint = HTMLHint.HTMLHint;\n      }\n    }\n    if (!HTMLHint) HTMLHint = window.HTMLHint;\n    if (!HTMLHint) {\n      if (window.console) {\n          window.console.error(\"Error: HTMLHint not found, not defined on window, or not available through define/require, CodeMirror HTML linting cannot run.\");\n      }\n      return found;\n    }\n    var messages = HTMLHint.verify(text, options && options.rules || defaultRules);\n    for (var i = 0; i < messages.length; i++) {\n      var message = messages[i];\n      var startLine = message.line - 1, endLine = message.line - 1, startCol = message.col - 1, endCol = message.col;\n      found.push({\n        from: CodeMirror.Pos(startLine, startCol),\n        to: CodeMirror.Pos(endLine, endCol),\n        message: message.message,\n        severity : message.type\n      });\n    }\n    return found;\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/lint/javascript-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Depends on jshint.js from https://github.com/jshint/jshint\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  // declare global: JSHINT\n\n  function validator(text, options) {\n    if (!window.JSHINT) {\n      if (window.console) {\n        window.console.error(\"Error: window.JSHINT not defined, CodeMirror JavaScript linting cannot run.\");\n      }\n      return [];\n    }\n    if (!options.indent) // JSHint error.character actually is a column index, this fixes underlining on lines using tabs for indentation\n      options.indent = 1; // JSHint default value is 4\n    JSHINT(text, options, options.globals);\n    var errors = JSHINT.data().errors, result = [];\n    if (errors) parseErrors(errors, result);\n    return result;\n  }\n\n  CodeMirror.registerHelper(\"lint\", \"javascript\", validator);\n\n  function parseErrors(errors, output) {\n    for ( var i = 0; i < errors.length; i++) {\n      var error = errors[i];\n      if (error) {\n        if (error.line <= 0) {\n          if (window.console) {\n            window.console.warn(\"Cannot display JSHint error (invalid line \" + error.line + \")\", error);\n          }\n          continue;\n        }\n\n        var start = error.character - 1, end = start + 1;\n        if (error.evidence) {\n          var index = error.evidence.substring(start).search(/.\\b/);\n          if (index > -1) {\n            end += index;\n          }\n        }\n\n        // Convert to format expected by validation service\n        var hint = {\n          message: error.reason,\n          severity: error.code ? (error.code.startsWith('W') ? \"warning\" : \"error\") : \"error\",\n          from: CodeMirror.Pos(error.line - 1, start),\n          to: CodeMirror.Pos(error.line - 1, end)\n        };\n\n        output.push(hint);\n      }\n    }\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/lint/json-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Depends on jsonlint.js from https://github.com/zaach/jsonlint\n\n// declare global: jsonlint\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"lint\", \"json\", function(text) {\n  var found = [];\n  if (!window.jsonlint) {\n    if (window.console) {\n      window.console.error(\"Error: window.jsonlint not defined, CodeMirror JSON linting cannot run.\");\n    }\n    return found;\n  }\n  // for jsonlint's web dist jsonlint is exported as an object with a single property parser, of which parseError\n  // is a subproperty\n  var jsonlint = window.jsonlint.parser || window.jsonlint\n  jsonlint.parseError = function(str, hash) {\n    var loc = hash.loc;\n    found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column),\n                to: CodeMirror.Pos(loc.last_line - 1, loc.last_column),\n                message: str});\n  };\n  try { jsonlint.parse(text); }\n  catch(e) {}\n  return found;\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/lint/lint.css",
    "content": "/* The lint marker gutter */\n.CodeMirror-lint-markers {\n  width: 16px;\n}\n\n.CodeMirror-lint-tooltip {\n  background-color: #ffd;\n  border: 1px solid black;\n  border-radius: 4px 4px 4px 4px;\n  color: black;\n  font-family: monospace;\n  font-size: 10pt;\n  overflow: hidden;\n  padding: 2px 5px;\n  position: fixed;\n  white-space: pre;\n  white-space: pre-wrap;\n  z-index: 100;\n  max-width: 600px;\n  opacity: 0;\n  transition: opacity .4s;\n  -moz-transition: opacity .4s;\n  -webkit-transition: opacity .4s;\n  -o-transition: opacity .4s;\n  -ms-transition: opacity .4s;\n}\n\n.CodeMirror-lint-mark {\n  background-position: left bottom;\n  background-repeat: repeat-x;\n}\n\n.CodeMirror-lint-mark-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=\");\n}\n\n.CodeMirror-lint-mark-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==\");\n}\n\n.CodeMirror-lint-marker {\n  background-position: center center;\n  background-repeat: no-repeat;\n  cursor: pointer;\n  display: inline-block;\n  height: 16px;\n  width: 16px;\n  vertical-align: middle;\n  position: relative;\n}\n\n.CodeMirror-lint-message {\n  padding-left: 18px;\n  background-position: top left;\n  background-repeat: no-repeat;\n}\n\n.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=\");\n}\n\n.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=\");\n}\n\n.CodeMirror-lint-marker-multiple {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC\");\n  background-repeat: no-repeat;\n  background-position: right bottom;\n  width: 100%; height: 100%;\n}\n\n.CodeMirror-lint-line-error {\n  background-color: rgba(183, 76, 81, 0.08);\n}\n\n.CodeMirror-lint-line-warning {\n  background-color: rgba(255, 211, 0, 0.1);\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/lint/lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  var GUTTER_ID = \"CodeMirror-lint-markers\";\n  var LINT_LINE_ID = \"CodeMirror-lint-line-\";\n\n  function showTooltip(cm, e, content) {\n    var tt = document.createElement(\"div\");\n    tt.className = \"CodeMirror-lint-tooltip cm-s-\" + cm.options.theme;\n    tt.appendChild(content.cloneNode(true));\n    if (cm.state.lint.options.selfContain)\n      cm.getWrapperElement().appendChild(tt);\n    else\n      document.body.appendChild(tt);\n\n    function position(e) {\n      if (!tt.parentNode) return CodeMirror.off(document, \"mousemove\", position);\n      tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + \"px\";\n      tt.style.left = (e.clientX + 5) + \"px\";\n    }\n    CodeMirror.on(document, \"mousemove\", position);\n    position(e);\n    if (tt.style.opacity != null) tt.style.opacity = 1;\n    return tt;\n  }\n  function rm(elt) {\n    if (elt.parentNode) elt.parentNode.removeChild(elt);\n  }\n  function hideTooltip(tt) {\n    if (!tt.parentNode) return;\n    if (tt.style.opacity == null) rm(tt);\n    tt.style.opacity = 0;\n    setTimeout(function() { rm(tt); }, 600);\n  }\n\n  function showTooltipFor(cm, e, content, node) {\n    var tooltip = showTooltip(cm, e, content);\n    function hide() {\n      CodeMirror.off(node, \"mouseout\", hide);\n      if (tooltip) { hideTooltip(tooltip); tooltip = null; }\n    }\n    var poll = setInterval(function() {\n      if (tooltip) for (var n = node;; n = n.parentNode) {\n        if (n && n.nodeType == 11) n = n.host;\n        if (n == document.body) return;\n        if (!n) { hide(); break; }\n      }\n      if (!tooltip) return clearInterval(poll);\n    }, 400);\n    CodeMirror.on(node, \"mouseout\", hide);\n  }\n\n  function LintState(cm, conf, hasGutter) {\n    this.marked = [];\n    if (conf instanceof Function) conf = {getAnnotations: conf};\n    if (!conf || conf === true) conf = {};\n    this.options = {};\n    this.linterOptions = conf.options || {};\n    for (var prop in defaults) this.options[prop] = defaults[prop];\n    for (var prop in conf) {\n      if (defaults.hasOwnProperty(prop)) {\n        if (conf[prop] != null) this.options[prop] = conf[prop];\n      } else if (!conf.options) {\n        this.linterOptions[prop] = conf[prop];\n      }\n    }\n    this.timeout = null;\n    this.hasGutter = hasGutter;\n    this.onMouseOver = function(e) { onMouseOver(cm, e); };\n    this.waitingFor = 0\n  }\n\n  var defaults = {\n    highlightLines: false,\n    tooltips: true,\n    delay: 500,\n    lintOnChange: true,\n    getAnnotations: null,\n    async: false,\n    selfContain: null,\n    formatAnnotation: null,\n    onUpdateLinting: null\n  }\n\n  function clearMarks(cm) {\n    var state = cm.state.lint;\n    if (state.hasGutter) cm.clearGutter(GUTTER_ID);\n    if (state.options.highlightLines) clearErrorLines(cm);\n    for (var i = 0; i < state.marked.length; ++i)\n      state.marked[i].clear();\n    state.marked.length = 0;\n  }\n\n  function clearErrorLines(cm) {\n    cm.eachLine(function(line) {\n      var has = line.wrapClass && /\\bCodeMirror-lint-line-\\w+\\b/.exec(line.wrapClass);\n      if (has) cm.removeLineClass(line, \"wrap\", has[0]);\n    })\n  }\n\n  function makeMarker(cm, labels, severity, multiple, tooltips) {\n    var marker = document.createElement(\"div\"), inner = marker;\n    marker.className = \"CodeMirror-lint-marker CodeMirror-lint-marker-\" + severity;\n    if (multiple) {\n      inner = marker.appendChild(document.createElement(\"div\"));\n      inner.className = \"CodeMirror-lint-marker CodeMirror-lint-marker-multiple\";\n    }\n\n    if (tooltips != false) CodeMirror.on(inner, \"mouseover\", function(e) {\n      showTooltipFor(cm, e, labels, inner);\n    });\n\n    return marker;\n  }\n\n  function getMaxSeverity(a, b) {\n    if (a == \"error\") return a;\n    else return b;\n  }\n\n  function groupByLine(annotations) {\n    var lines = [];\n    for (var i = 0; i < annotations.length; ++i) {\n      var ann = annotations[i], line = ann.from.line;\n      (lines[line] || (lines[line] = [])).push(ann);\n    }\n    return lines;\n  }\n\n  function annotationTooltip(ann) {\n    var severity = ann.severity;\n    if (!severity) severity = \"error\";\n    var tip = document.createElement(\"div\");\n    tip.className = \"CodeMirror-lint-message CodeMirror-lint-message-\" + severity;\n    if (typeof ann.messageHTML != 'undefined') {\n      tip.innerHTML = ann.messageHTML;\n    } else {\n      tip.appendChild(document.createTextNode(ann.message));\n    }\n    return tip;\n  }\n\n  function lintAsync(cm, getAnnotations) {\n    var state = cm.state.lint\n    var id = ++state.waitingFor\n    function abort() {\n      id = -1\n      cm.off(\"change\", abort)\n    }\n    cm.on(\"change\", abort)\n    getAnnotations(cm.getValue(), function(annotations, arg2) {\n      cm.off(\"change\", abort)\n      if (state.waitingFor != id) return\n      if (arg2 && annotations instanceof CodeMirror) annotations = arg2\n      cm.operation(function() {updateLinting(cm, annotations)})\n    }, state.linterOptions, cm);\n  }\n\n  function startLinting(cm) {\n    var state = cm.state.lint;\n    if (!state) return;\n    var options = state.options;\n    /*\n     * Passing rules in `options` property prevents JSHint (and other linters) from complaining\n     * about unrecognized rules like `onUpdateLinting`, `delay`, `lintOnChange`, etc.\n     */\n    var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), \"lint\");\n    if (!getAnnotations) return;\n    if (options.async || getAnnotations.async) {\n      lintAsync(cm, getAnnotations)\n    } else {\n      var annotations = getAnnotations(cm.getValue(), state.linterOptions, cm);\n      if (!annotations) return;\n      if (annotations.then) annotations.then(function(issues) {\n        cm.operation(function() {updateLinting(cm, issues)})\n      });\n      else cm.operation(function() {updateLinting(cm, annotations)})\n    }\n  }\n\n  function updateLinting(cm, annotationsNotSorted) {\n    var state = cm.state.lint;\n    if (!state) return;\n    var options = state.options;\n    clearMarks(cm);\n\n    var annotations = groupByLine(annotationsNotSorted);\n\n    for (var line = 0; line < annotations.length; ++line) {\n      var anns = annotations[line];\n      if (!anns) continue;\n\n      // filter out duplicate messages\n      var message = [];\n      anns = anns.filter(function(item) { return message.indexOf(item.message) > -1 ? false : message.push(item.message) });\n\n      var maxSeverity = null;\n      var tipLabel = state.hasGutter && document.createDocumentFragment();\n\n      for (var i = 0; i < anns.length; ++i) {\n        var ann = anns[i];\n        var severity = ann.severity;\n        if (!severity) severity = \"error\";\n        maxSeverity = getMaxSeverity(maxSeverity, severity);\n\n        if (options.formatAnnotation) ann = options.formatAnnotation(ann);\n        if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));\n\n        if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {\n          className: \"CodeMirror-lint-mark CodeMirror-lint-mark-\" + severity,\n          __annotation: ann\n        }));\n      }\n      // use original annotations[line] to show multiple messages\n      if (state.hasGutter)\n        cm.setGutterMarker(line, GUTTER_ID, makeMarker(cm, tipLabel, maxSeverity, annotations[line].length > 1,\n                                                       options.tooltips));\n\n      if (options.highlightLines)\n        cm.addLineClass(line, \"wrap\", LINT_LINE_ID + maxSeverity);\n    }\n    if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);\n  }\n\n  function onChange(cm) {\n    var state = cm.state.lint;\n    if (!state) return;\n    clearTimeout(state.timeout);\n    state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay);\n  }\n\n  function popupTooltips(cm, annotations, e) {\n    var target = e.target || e.srcElement;\n    var tooltip = document.createDocumentFragment();\n    for (var i = 0; i < annotations.length; i++) {\n      var ann = annotations[i];\n      tooltip.appendChild(annotationTooltip(ann));\n    }\n    showTooltipFor(cm, e, tooltip, target);\n  }\n\n  function onMouseOver(cm, e) {\n    var target = e.target || e.srcElement;\n    if (!/\\bCodeMirror-lint-mark-/.test(target.className)) return;\n    var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2;\n    var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, \"client\"));\n\n    var annotations = [];\n    for (var i = 0; i < spans.length; ++i) {\n      var ann = spans[i].__annotation;\n      if (ann) annotations.push(ann);\n    }\n    if (annotations.length) popupTooltips(cm, annotations, e);\n  }\n\n  CodeMirror.defineOption(\"lint\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      clearMarks(cm);\n      if (cm.state.lint.options.lintOnChange !== false)\n        cm.off(\"change\", onChange);\n      CodeMirror.off(cm.getWrapperElement(), \"mouseover\", cm.state.lint.onMouseOver);\n      clearTimeout(cm.state.lint.timeout);\n      delete cm.state.lint;\n    }\n\n    if (val) {\n      var gutters = cm.getOption(\"gutters\"), hasLintGutter = false;\n      for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;\n      var state = cm.state.lint = new LintState(cm, val, hasLintGutter);\n      if (state.options.lintOnChange)\n        cm.on(\"change\", onChange);\n      if (state.options.tooltips != false && state.options.tooltips != \"gutter\")\n        CodeMirror.on(cm.getWrapperElement(), \"mouseover\", state.onMouseOver);\n\n      startLinting(cm);\n    }\n  });\n\n  CodeMirror.defineExtension(\"performLint\", function() {\n    startLinting(this);\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/lint/yaml-lint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\n// Depends on js-yaml.js from https://github.com/nodeca/js-yaml\n\n// declare global: jsyaml\n\nCodeMirror.registerHelper(\"lint\", \"yaml\", function(text) {\n  var found = [];\n  if (!window.jsyaml) {\n    if (window.console) {\n      window.console.error(\"Error: window.jsyaml not defined, CodeMirror YAML linting cannot run.\");\n    }\n    return found;\n  }\n  try { jsyaml.loadAll(text); }\n  catch(e) {\n      var loc = e.mark,\n          // js-yaml YAMLException doesn't always provide an accurate lineno\n          // e.g., when there are multiple yaml docs\n          // ---\n          // ---\n          // foo:bar\n          from = loc ? CodeMirror.Pos(loc.line, loc.column) : CodeMirror.Pos(0, 0),\n          to = from;\n      found.push({ from: from, to: to, message: e.message });\n  }\n  return found;\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/merge/merge.css",
    "content": ".CodeMirror-merge {\n  position: relative;\n  border: 1px solid #ddd;\n  white-space: pre;\n}\n\n.CodeMirror-merge, .CodeMirror-merge .CodeMirror {\n  height: 350px;\n}\n\n.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; }\n.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; }\n.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; }\n.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; }\n\n.CodeMirror-merge-pane {\n  display: inline-block;\n  white-space: normal;\n  vertical-align: top;\n}\n.CodeMirror-merge-pane-rightmost {\n  position: absolute;\n  right: 0px;\n  z-index: 1;\n}\n\n.CodeMirror-merge-gap {\n  z-index: 2;\n  display: inline-block;\n  height: 100%;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  overflow: hidden;\n  border-left: 1px solid #ddd;\n  border-right: 1px solid #ddd;\n  position: relative;\n  background: #f8f8f8;\n}\n\n.CodeMirror-merge-scrolllock-wrap {\n  position: absolute;\n  bottom: 0; left: 50%;\n}\n.CodeMirror-merge-scrolllock {\n  position: relative;\n  left: -50%;\n  cursor: pointer;\n  color: #555;\n  line-height: 1;\n}\n.CodeMirror-merge-scrolllock:after {\n  content: \"\\21db\\00a0\\00a0\\21da\";\n}\n.CodeMirror-merge-scrolllock.CodeMirror-merge-scrolllock-enabled:after {\n  content: \"\\21db\\21da\";\n}\n\n.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right {\n  position: absolute;\n  left: 0; top: 0;\n  right: 0; bottom: 0;\n  line-height: 1;\n}\n\n.CodeMirror-merge-copy {\n  position: absolute;\n  cursor: pointer;\n  color: #44c;\n  z-index: 3;\n}\n\n.CodeMirror-merge-copy-reverse {\n  position: absolute;\n  cursor: pointer;\n  color: #44c;\n}\n\n.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; }\n.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; }\n\n.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==);\n  background-position: bottom left;\n  background-repeat: repeat-x;\n}\n\n.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==);\n  background-position: bottom left;\n  background-repeat: repeat-x;\n}\n\n.CodeMirror-merge-r-chunk { background: #ffffe0; }\n.CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; }\n.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; }\n.CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; }\n\n.CodeMirror-merge-l-chunk { background: #eef; }\n.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; }\n.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; }\n.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; }\n\n.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; }\n.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; }\n.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; }\n\n.CodeMirror-merge-collapsed-widget:before {\n  content: \"(...)\";\n}\n.CodeMirror-merge-collapsed-widget {\n  cursor: pointer;\n  color: #88b;\n  background: #eef;\n  border: 1px solid #ddf;\n  font-size: 90%;\n  padding: 0 3px;\n  border-radius: 4px;\n}\n.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/merge/merge.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// declare global: diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\")); // Note non-packaged dependency diff_match_patch\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"diff_match_patch\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  var Pos = CodeMirror.Pos;\n  var svgNS = \"http://www.w3.org/2000/svg\";\n\n  function DiffView(mv, type) {\n    this.mv = mv;\n    this.type = type;\n    this.classes = type == \"left\"\n      ? {chunk: \"CodeMirror-merge-l-chunk\",\n         start: \"CodeMirror-merge-l-chunk-start\",\n         end: \"CodeMirror-merge-l-chunk-end\",\n         insert: \"CodeMirror-merge-l-inserted\",\n         del: \"CodeMirror-merge-l-deleted\",\n         connect: \"CodeMirror-merge-l-connect\"}\n      : {chunk: \"CodeMirror-merge-r-chunk\",\n         start: \"CodeMirror-merge-r-chunk-start\",\n         end: \"CodeMirror-merge-r-chunk-end\",\n         insert: \"CodeMirror-merge-r-inserted\",\n         del: \"CodeMirror-merge-r-deleted\",\n         connect: \"CodeMirror-merge-r-connect\"};\n  }\n\n  DiffView.prototype = {\n    constructor: DiffView,\n    init: function(pane, orig, options) {\n      this.edit = this.mv.edit;\n      ;(this.edit.state.diffViews || (this.edit.state.diffViews = [])).push(this);\n      this.orig = CodeMirror(pane, copyObj({value: orig, readOnly: !this.mv.options.allowEditingOriginals}, copyObj(options)));\n      if (this.mv.options.connect == \"align\") {\n        if (!this.edit.state.trackAlignable) this.edit.state.trackAlignable = new TrackAlignable(this.edit)\n        this.orig.state.trackAlignable = new TrackAlignable(this.orig)\n      }\n      this.lockButton.title = this.edit.phrase(\"Toggle locked scrolling\");\n\n      this.orig.state.diffViews = [this];\n      var classLocation = options.chunkClassLocation || \"background\";\n      if (Object.prototype.toString.call(classLocation) != \"[object Array]\") classLocation = [classLocation]\n      this.classes.classLocation = classLocation\n\n      this.diff = getDiff(asString(orig), asString(options.value), this.mv.options.ignoreWhitespace);\n      this.chunks = getChunks(this.diff);\n      this.diffOutOfDate = this.dealigned = false;\n      this.needsScrollSync = null\n\n      this.showDifferences = options.showDifferences !== false;\n    },\n    registerEvents: function(otherDv) {\n      this.forceUpdate = registerUpdate(this);\n      setScrollLock(this, true, false);\n      registerScroll(this, otherDv);\n    },\n    setShowDifferences: function(val) {\n      val = val !== false;\n      if (val != this.showDifferences) {\n        this.showDifferences = val;\n        this.forceUpdate(\"full\");\n      }\n    }\n  };\n\n  function ensureDiff(dv) {\n    if (dv.diffOutOfDate) {\n      dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue(), dv.mv.options.ignoreWhitespace);\n      dv.chunks = getChunks(dv.diff);\n      dv.diffOutOfDate = false;\n      CodeMirror.signal(dv.edit, \"updateDiff\", dv.diff);\n    }\n  }\n\n  var updating = false;\n  function registerUpdate(dv) {\n    var edit = {from: 0, to: 0, marked: []};\n    var orig = {from: 0, to: 0, marked: []};\n    var debounceChange, updatingFast = false;\n    function update(mode) {\n      updating = true;\n      updatingFast = false;\n      if (mode == \"full\") {\n        if (dv.svg) clear(dv.svg);\n        if (dv.copyButtons) clear(dv.copyButtons);\n        clearMarks(dv.edit, edit.marked, dv.classes);\n        clearMarks(dv.orig, orig.marked, dv.classes);\n        edit.from = edit.to = orig.from = orig.to = 0;\n      }\n      ensureDiff(dv);\n      if (dv.showDifferences) {\n        updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes);\n        updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes);\n      }\n\n      if (dv.mv.options.connect == \"align\")\n        alignChunks(dv);\n      makeConnections(dv);\n      if (dv.needsScrollSync != null) syncScroll(dv, dv.needsScrollSync)\n\n      updating = false;\n    }\n    function setDealign(fast) {\n      if (updating) return;\n      dv.dealigned = true;\n      set(fast);\n    }\n    function set(fast) {\n      if (updating || updatingFast) return;\n      clearTimeout(debounceChange);\n      if (fast === true) updatingFast = true;\n      debounceChange = setTimeout(update, fast === true ? 20 : 250);\n    }\n    function change(_cm, change) {\n      if (!dv.diffOutOfDate) {\n        dv.diffOutOfDate = true;\n        edit.from = edit.to = orig.from = orig.to = 0;\n      }\n      // Update faster when a line was added/removed\n      setDealign(change.text.length - 1 != change.to.line - change.from.line);\n    }\n    function swapDoc() {\n      dv.diffOutOfDate = true;\n      dv.dealigned = true;\n      update(\"full\");\n    }\n    dv.edit.on(\"change\", change);\n    dv.orig.on(\"change\", change);\n    dv.edit.on(\"swapDoc\", swapDoc);\n    dv.orig.on(\"swapDoc\", swapDoc);\n    if (dv.mv.options.connect == \"align\") {\n      CodeMirror.on(dv.edit.state.trackAlignable, \"realign\", setDealign)\n      CodeMirror.on(dv.orig.state.trackAlignable, \"realign\", setDealign)\n    }\n    dv.edit.on(\"viewportChange\", function() { set(false); });\n    dv.orig.on(\"viewportChange\", function() { set(false); });\n    update();\n    return update;\n  }\n\n  function registerScroll(dv, otherDv) {\n    dv.edit.on(\"scroll\", function() {\n      syncScroll(dv, true) && makeConnections(dv);\n    });\n    dv.orig.on(\"scroll\", function() {\n      syncScroll(dv, false) && makeConnections(dv);\n      if (otherDv) syncScroll(otherDv, true) && makeConnections(otherDv);\n    });\n  }\n\n  function syncScroll(dv, toOrig) {\n    // Change handler will do a refresh after a timeout when diff is out of date\n    if (dv.diffOutOfDate) {\n      if (dv.lockScroll && dv.needsScrollSync == null) dv.needsScrollSync = toOrig\n      return false\n    }\n    dv.needsScrollSync = null\n    if (!dv.lockScroll) return true;\n    var editor, other, now = +new Date;\n    if (toOrig) { editor = dv.edit; other = dv.orig; }\n    else { editor = dv.orig; other = dv.edit; }\n    // Don't take action if the position of this editor was recently set\n    // (to prevent feedback loops)\n    if (editor.state.scrollSetBy == dv && (editor.state.scrollSetAt || 0) + 250 > now) return false;\n\n    var sInfo = editor.getScrollInfo();\n    if (dv.mv.options.connect == \"align\") {\n      targetPos = sInfo.top;\n    } else {\n      var halfScreen = .5 * sInfo.clientHeight, midY = sInfo.top + halfScreen;\n      var mid = editor.lineAtHeight(midY, \"local\");\n      var around = chunkBoundariesAround(dv.chunks, mid, toOrig);\n      var off = getOffsets(editor, toOrig ? around.edit : around.orig);\n      var offOther = getOffsets(other, toOrig ? around.orig : around.edit);\n      var ratio = (midY - off.top) / (off.bot - off.top);\n      var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top);\n\n      var botDist, mix;\n      // Some careful tweaking to make sure no space is left out of view\n      // when scrolling to top or bottom.\n      if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) {\n        targetPos = targetPos * mix + sInfo.top * (1 - mix);\n      } else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) {\n        var otherInfo = other.getScrollInfo();\n        var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos;\n        if (botDistOther > botDist && (mix = botDist / halfScreen) < 1)\n          targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix);\n      }\n    }\n\n    other.scrollTo(sInfo.left, targetPos);\n    other.state.scrollSetAt = now;\n    other.state.scrollSetBy = dv;\n    return true;\n  }\n\n  function getOffsets(editor, around) {\n    var bot = around.after;\n    if (bot == null) bot = editor.lastLine() + 1;\n    return {top: editor.heightAtLine(around.before || 0, \"local\"),\n            bot: editor.heightAtLine(bot, \"local\")};\n  }\n\n  function setScrollLock(dv, val, action) {\n    dv.lockScroll = val;\n    if (val && action != false) syncScroll(dv, DIFF_INSERT) && makeConnections(dv);\n    (val ? CodeMirror.addClass : CodeMirror.rmClass)(dv.lockButton, \"CodeMirror-merge-scrolllock-enabled\");\n  }\n\n  // Updating the marks for editor content\n\n  function removeClass(editor, line, classes) {\n    var locs = classes.classLocation\n    for (var i = 0; i < locs.length; i++) {\n      editor.removeLineClass(line, locs[i], classes.chunk);\n      editor.removeLineClass(line, locs[i], classes.start);\n      editor.removeLineClass(line, locs[i], classes.end);\n    }\n  }\n\n  function clearMarks(editor, arr, classes) {\n    for (var i = 0; i < arr.length; ++i) {\n      var mark = arr[i];\n      if (mark instanceof CodeMirror.TextMarker)\n        mark.clear();\n      else if (mark.parent)\n        removeClass(editor, mark, classes);\n    }\n    arr.length = 0;\n  }\n\n  // FIXME maybe add a margin around viewport to prevent too many updates\n  function updateMarks(editor, diff, state, type, classes) {\n    var vp = editor.getViewport();\n    editor.operation(function() {\n      if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {\n        clearMarks(editor, state.marked, classes);\n        markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes);\n        state.from = vp.from; state.to = vp.to;\n      } else {\n        if (vp.from < state.from) {\n          markChanges(editor, diff, type, state.marked, vp.from, state.from, classes);\n          state.from = vp.from;\n        }\n        if (vp.to > state.to) {\n          markChanges(editor, diff, type, state.marked, state.to, vp.to, classes);\n          state.to = vp.to;\n        }\n      }\n    });\n  }\n\n  function addClass(editor, lineNr, classes, main, start, end) {\n    var locs = classes.classLocation, line = editor.getLineHandle(lineNr);\n    for (var i = 0; i < locs.length; i++) {\n      if (main) editor.addLineClass(line, locs[i], classes.chunk);\n      if (start) editor.addLineClass(line, locs[i], classes.start);\n      if (end) editor.addLineClass(line, locs[i], classes.end);\n    }\n    return line;\n  }\n\n  function markChanges(editor, diff, type, marks, from, to, classes) {\n    var pos = Pos(0, 0);\n    var top = Pos(from, 0), bot = editor.clipPos(Pos(to - 1));\n    var cls = type == DIFF_DELETE ? classes.del : classes.insert;\n    function markChunk(start, end) {\n      var bfrom = Math.max(from, start), bto = Math.min(to, end);\n      for (var i = bfrom; i < bto; ++i)\n        marks.push(addClass(editor, i, classes, true, i == start, i == end - 1));\n      // When the chunk is empty, make sure a horizontal line shows up\n      if (start == end && bfrom == end && bto == end) {\n        if (bfrom)\n          marks.push(addClass(editor, bfrom - 1, classes, false, false, true));\n        else\n          marks.push(addClass(editor, bfrom, classes, false, true, false));\n      }\n    }\n\n    var chunkStart = 0, pending = false;\n    for (var i = 0; i < diff.length; ++i) {\n      var part = diff[i], tp = part[0], str = part[1];\n      if (tp == DIFF_EQUAL) {\n        var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1);\n        moveOver(pos, str);\n        var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0);\n        if (cleanTo > cleanFrom) {\n          if (pending) { markChunk(chunkStart, cleanFrom); pending = false }\n          chunkStart = cleanTo;\n        }\n      } else {\n        pending = true\n        if (tp == type) {\n          var end = moveOver(pos, str, true);\n          var a = posMax(top, pos), b = posMin(bot, end);\n          if (!posEq(a, b))\n            marks.push(editor.markText(a, b, {className: cls}));\n          pos = end;\n        }\n      }\n    }\n    if (pending) markChunk(chunkStart, pos.line + 1);\n  }\n\n  // Updating the gap between editor and original\n\n  function makeConnections(dv) {\n    if (!dv.showDifferences) return;\n\n    if (dv.svg) {\n      clear(dv.svg);\n      var w = dv.gap.offsetWidth;\n      attrs(dv.svg, \"width\", w, \"height\", dv.gap.offsetHeight);\n    }\n    if (dv.copyButtons) clear(dv.copyButtons);\n\n    var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport();\n    var outerTop = dv.mv.wrap.getBoundingClientRect().top\n    var sTopEdit = outerTop - dv.edit.getScrollerElement().getBoundingClientRect().top + dv.edit.getScrollInfo().top\n    var sTopOrig = outerTop - dv.orig.getScrollerElement().getBoundingClientRect().top + dv.orig.getScrollInfo().top;\n    for (var i = 0; i < dv.chunks.length; i++) {\n      var ch = dv.chunks[i];\n      if (ch.editFrom <= vpEdit.to && ch.editTo >= vpEdit.from &&\n          ch.origFrom <= vpOrig.to && ch.origTo >= vpOrig.from)\n        drawConnectorsForChunk(dv, ch, sTopOrig, sTopEdit, w);\n    }\n  }\n\n  function getMatchingOrigLine(editLine, chunks) {\n    var editStart = 0, origStart = 0;\n    for (var i = 0; i < chunks.length; i++) {\n      var chunk = chunks[i];\n      if (chunk.editTo > editLine && chunk.editFrom <= editLine) return null;\n      if (chunk.editFrom > editLine) break;\n      editStart = chunk.editTo;\n      origStart = chunk.origTo;\n    }\n    return origStart + (editLine - editStart);\n  }\n\n  // Combines information about chunks and widgets/markers to return\n  // an array of lines, in a single editor, that probably need to be\n  // aligned with their counterparts in the editor next to it.\n  function alignableFor(cm, chunks, isOrig) {\n    var tracker = cm.state.trackAlignable\n    var start = cm.firstLine(), trackI = 0\n    var result = []\n    for (var i = 0;; i++) {\n      var chunk = chunks[i]\n      var chunkStart = !chunk ? 1e9 : isOrig ? chunk.origFrom : chunk.editFrom\n      for (; trackI < tracker.alignable.length; trackI += 2) {\n        var n = tracker.alignable[trackI] + 1\n        if (n <= start) continue\n        if (n <= chunkStart) result.push(n)\n        else break\n      }\n      if (!chunk) break\n      result.push(start = isOrig ? chunk.origTo : chunk.editTo)\n    }\n    return result\n  }\n\n  // Given information about alignable lines in two editors, fill in\n  // the result (an array of three-element arrays) to reflect the\n  // lines that need to be aligned with each other.\n  function mergeAlignable(result, origAlignable, chunks, setIndex) {\n    var rI = 0, origI = 0, chunkI = 0, diff = 0\n    outer: for (;; rI++) {\n      var nextR = result[rI], nextO = origAlignable[origI]\n      if (!nextR && nextO == null) break\n\n      var rLine = nextR ? nextR[0] : 1e9, oLine = nextO == null ? 1e9 : nextO\n      while (chunkI < chunks.length) {\n        var chunk = chunks[chunkI]\n        if (chunk.origFrom <= oLine && chunk.origTo > oLine) {\n          origI++\n          rI--\n          continue outer;\n        }\n        if (chunk.editTo > rLine) {\n          if (chunk.editFrom <= rLine) continue outer;\n          break\n        }\n        diff += (chunk.origTo - chunk.origFrom) - (chunk.editTo - chunk.editFrom)\n        chunkI++\n      }\n      if (rLine == oLine - diff) {\n        nextR[setIndex] = oLine\n        origI++\n      } else if (rLine < oLine - diff) {\n        nextR[setIndex] = rLine + diff\n      } else {\n        var record = [oLine - diff, null, null]\n        record[setIndex] = oLine\n        result.splice(rI, 0, record)\n        origI++\n      }\n    }\n  }\n\n  function findAlignedLines(dv, other) {\n    var alignable = alignableFor(dv.edit, dv.chunks, false), result = []\n    if (other) for (var i = 0, j = 0; i < other.chunks.length; i++) {\n      var n = other.chunks[i].editTo\n      while (j < alignable.length && alignable[j] < n) j++\n      if (j == alignable.length || alignable[j] != n) alignable.splice(j++, 0, n)\n    }\n    for (var i = 0; i < alignable.length; i++)\n      result.push([alignable[i], null, null])\n\n    mergeAlignable(result, alignableFor(dv.orig, dv.chunks, true), dv.chunks, 1)\n    if (other)\n      mergeAlignable(result, alignableFor(other.orig, other.chunks, true), other.chunks, 2)\n\n    return result\n  }\n\n  function alignChunks(dv, force) {\n    if (!dv.dealigned && !force) return;\n    if (!dv.orig.curOp) return dv.orig.operation(function() {\n      alignChunks(dv, force);\n    });\n\n    dv.dealigned = false;\n    var other = dv.mv.left == dv ? dv.mv.right : dv.mv.left;\n    if (other) {\n      ensureDiff(other);\n      other.dealigned = false;\n    }\n    var linesToAlign = findAlignedLines(dv, other);\n\n    // Clear old aligners\n    var aligners = dv.mv.aligners;\n    for (var i = 0; i < aligners.length; i++)\n      aligners[i].clear();\n    aligners.length = 0;\n\n    var cm = [dv.edit, dv.orig], scroll = [], offset = []\n    if (other) cm.push(other.orig);\n    for (var i = 0; i < cm.length; i++) {\n      scroll.push(cm[i].getScrollInfo().top);\n      offset.push(-cm[i].getScrollerElement().getBoundingClientRect().top)\n    }\n\n    if (offset[0] != offset[1] || cm.length == 3 && offset[1] != offset[2])\n      alignLines(cm, offset, [0, 0, 0], aligners)\n    for (var ln = 0; ln < linesToAlign.length; ln++)\n      alignLines(cm, offset, linesToAlign[ln], aligners);\n\n    for (var i = 0; i < cm.length; i++)\n      cm[i].scrollTo(null, scroll[i]);\n  }\n\n  function alignLines(cm, cmOffset, lines, aligners) {\n    var maxOffset = -1e8, offset = [];\n    for (var i = 0; i < cm.length; i++) if (lines[i] != null) {\n      var off = cm[i].heightAtLine(lines[i], \"local\") - cmOffset[i];\n      offset[i] = off;\n      maxOffset = Math.max(maxOffset, off);\n    }\n    for (var i = 0; i < cm.length; i++) if (lines[i] != null) {\n      var diff = maxOffset - offset[i];\n      if (diff > 1)\n        aligners.push(padAbove(cm[i], lines[i], diff));\n    }\n  }\n\n  function padAbove(cm, line, size) {\n    var above = true;\n    if (line > cm.lastLine()) {\n      line--;\n      above = false;\n    }\n    var elt = document.createElement(\"div\");\n    elt.className = \"CodeMirror-merge-spacer\";\n    elt.style.height = size + \"px\"; elt.style.minWidth = \"1px\";\n    return cm.addLineWidget(line, elt, {height: size, above: above, mergeSpacer: true, handleMouseEvents: true});\n  }\n\n  function drawConnectorsForChunk(dv, chunk, sTopOrig, sTopEdit, w) {\n    var flip = dv.type == \"left\";\n    var top = dv.orig.heightAtLine(chunk.origFrom, \"local\", true) - sTopOrig;\n    if (dv.svg) {\n      var topLpx = top;\n      var topRpx = dv.edit.heightAtLine(chunk.editFrom, \"local\", true) - sTopEdit;\n      if (flip) { var tmp = topLpx; topLpx = topRpx; topRpx = tmp; }\n      var botLpx = dv.orig.heightAtLine(chunk.origTo, \"local\", true) - sTopOrig;\n      var botRpx = dv.edit.heightAtLine(chunk.editTo, \"local\", true) - sTopEdit;\n      if (flip) { var tmp = botLpx; botLpx = botRpx; botRpx = tmp; }\n      var curveTop = \" C \" + w/2 + \" \" + topRpx + \" \" + w/2 + \" \" + topLpx + \" \" + (w + 2) + \" \" + topLpx;\n      var curveBot = \" C \" + w/2 + \" \" + botLpx + \" \" + w/2 + \" \" + botRpx + \" -1 \" + botRpx;\n      attrs(dv.svg.appendChild(document.createElementNS(svgNS, \"path\")),\n            \"d\", \"M -1 \" + topRpx + curveTop + \" L \" + (w + 2) + \" \" + botLpx + curveBot + \" z\",\n            \"class\", dv.classes.connect);\n    }\n    if (dv.copyButtons) {\n      var copy = dv.copyButtons.appendChild(elt(\"div\", dv.type == \"left\" ? \"\\u21dd\" : \"\\u21dc\",\n                                                \"CodeMirror-merge-copy\"));\n      var editOriginals = dv.mv.options.allowEditingOriginals;\n      copy.title = dv.edit.phrase(editOriginals ? \"Push to left\" : \"Revert chunk\");\n      copy.chunk = chunk;\n      copy.style.top = (chunk.origTo > chunk.origFrom ? top : dv.edit.heightAtLine(chunk.editFrom, \"local\") - sTopEdit) + \"px\";\n      copy.setAttribute(\"role\", \"button\");\n\n      if (editOriginals) {\n        var topReverse = dv.edit.heightAtLine(chunk.editFrom, \"local\") - sTopEdit;\n        var copyReverse = dv.copyButtons.appendChild(elt(\"div\", dv.type == \"right\" ? \"\\u21dd\" : \"\\u21dc\",\n                                                         \"CodeMirror-merge-copy-reverse\"));\n        copyReverse.title = \"Push to right\";\n        copyReverse.chunk = {editFrom: chunk.origFrom, editTo: chunk.origTo,\n                             origFrom: chunk.editFrom, origTo: chunk.editTo};\n        copyReverse.style.top = topReverse + \"px\";\n        dv.type == \"right\" ? copyReverse.style.left = \"2px\" : copyReverse.style.right = \"2px\";\n        copyReverse.setAttribute(\"role\", \"button\");\n      }\n    }\n  }\n\n  function copyChunk(dv, to, from, chunk) {\n    if (dv.diffOutOfDate) return;\n    var origStart = chunk.origTo > from.lastLine() ? Pos(chunk.origFrom - 1) : Pos(chunk.origFrom, 0)\n    var origEnd = Pos(chunk.origTo, 0)\n    var editStart = chunk.editTo > to.lastLine() ? Pos(chunk.editFrom - 1) : Pos(chunk.editFrom, 0)\n    var editEnd = Pos(chunk.editTo, 0)\n    var handler = dv.mv.options.revertChunk\n    if (handler)\n      handler(dv.mv, from, origStart, origEnd, to, editStart, editEnd)\n    else\n      to.replaceRange(from.getRange(origStart, origEnd), editStart, editEnd)\n  }\n\n  // Merge view, containing 0, 1, or 2 diff views.\n\n  var MergeView = CodeMirror.MergeView = function(node, options) {\n    if (!(this instanceof MergeView)) return new MergeView(node, options);\n\n    this.options = options;\n    var origLeft = options.origLeft, origRight = options.origRight == null ? options.orig : options.origRight;\n\n    var hasLeft = origLeft != null, hasRight = origRight != null;\n    var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0);\n    var wrap = [], left = this.left = null, right = this.right = null;\n    var self = this;\n\n    if (hasLeft) {\n      left = this.left = new DiffView(this, \"left\");\n      var leftPane = elt(\"div\", null, \"CodeMirror-merge-pane CodeMirror-merge-left\");\n      wrap.push(leftPane);\n      wrap.push(buildGap(left));\n    }\n\n    var editPane = elt(\"div\", null, \"CodeMirror-merge-pane CodeMirror-merge-editor\");\n    wrap.push(editPane);\n\n    if (hasRight) {\n      right = this.right = new DiffView(this, \"right\");\n      wrap.push(buildGap(right));\n      var rightPane = elt(\"div\", null, \"CodeMirror-merge-pane CodeMirror-merge-right\");\n      wrap.push(rightPane);\n    }\n\n    (hasRight ? rightPane : editPane).className += \" CodeMirror-merge-pane-rightmost\";\n\n    wrap.push(elt(\"div\", null, null, \"height: 0; clear: both;\"));\n\n    var wrapElt = this.wrap = node.appendChild(elt(\"div\", wrap, \"CodeMirror-merge CodeMirror-merge-\" + panes + \"pane\"));\n    this.edit = CodeMirror(editPane, copyObj(options));\n\n    if (left) left.init(leftPane, origLeft, options);\n    if (right) right.init(rightPane, origRight, options);\n    if (options.collapseIdentical)\n      this.editor().operation(function() {\n        collapseIdenticalStretches(self, options.collapseIdentical);\n      });\n    if (options.connect == \"align\") {\n      this.aligners = [];\n      alignChunks(this.left || this.right, true);\n    }\n    if (left) left.registerEvents(right)\n    if (right) right.registerEvents(left)\n\n\n    var onResize = function() {\n      if (left) makeConnections(left);\n      if (right) makeConnections(right);\n    };\n    CodeMirror.on(window, \"resize\", onResize);\n    var resizeInterval = setInterval(function() {\n      for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {}\n      if (!p) { clearInterval(resizeInterval); CodeMirror.off(window, \"resize\", onResize); }\n    }, 5000);\n  };\n\n  function buildGap(dv) {\n    var lock = dv.lockButton = elt(\"div\", null, \"CodeMirror-merge-scrolllock\");\n    lock.setAttribute(\"role\", \"button\");\n    var lockWrap = elt(\"div\", [lock], \"CodeMirror-merge-scrolllock-wrap\");\n    CodeMirror.on(lock, \"click\", function() { setScrollLock(dv, !dv.lockScroll); });\n    var gapElts = [lockWrap];\n    if (dv.mv.options.revertButtons !== false) {\n      dv.copyButtons = elt(\"div\", null, \"CodeMirror-merge-copybuttons-\" + dv.type);\n      CodeMirror.on(dv.copyButtons, \"click\", function(e) {\n        var node = e.target || e.srcElement;\n        if (!node.chunk) return;\n        if (node.className == \"CodeMirror-merge-copy-reverse\") {\n          copyChunk(dv, dv.orig, dv.edit, node.chunk);\n          return;\n        }\n        copyChunk(dv, dv.edit, dv.orig, node.chunk);\n      });\n      gapElts.unshift(dv.copyButtons);\n    }\n    if (dv.mv.options.connect != \"align\") {\n      var svg = document.createElementNS && document.createElementNS(svgNS, \"svg\");\n      if (svg && !svg.createSVGRect) svg = null;\n      dv.svg = svg;\n      if (svg) gapElts.push(svg);\n    }\n\n    return dv.gap = elt(\"div\", gapElts, \"CodeMirror-merge-gap\");\n  }\n\n  MergeView.prototype = {\n    constructor: MergeView,\n    editor: function() { return this.edit; },\n    rightOriginal: function() { return this.right && this.right.orig; },\n    leftOriginal: function() { return this.left && this.left.orig; },\n    setShowDifferences: function(val) {\n      if (this.right) this.right.setShowDifferences(val);\n      if (this.left) this.left.setShowDifferences(val);\n    },\n    rightChunks: function() {\n      if (this.right) { ensureDiff(this.right); return this.right.chunks; }\n    },\n    leftChunks: function() {\n      if (this.left) { ensureDiff(this.left); return this.left.chunks; }\n    }\n  };\n\n  function asString(obj) {\n    if (typeof obj == \"string\") return obj;\n    else return obj.getValue();\n  }\n\n  // Operations on diffs\n  var dmp;\n  function getDiff(a, b, ignoreWhitespace) {\n    if (!dmp) dmp = new diff_match_patch();\n\n    var diff = dmp.diff_main(a, b);\n    // The library sometimes leaves in empty parts, which confuse the algorithm\n    for (var i = 0; i < diff.length; ++i) {\n      var part = diff[i];\n      if (ignoreWhitespace ? !/[^ \\t]/.test(part[1]) : !part[1]) {\n        diff.splice(i--, 1);\n      } else if (i && diff[i - 1][0] == part[0]) {\n        diff.splice(i--, 1);\n        diff[i][1] += part[1];\n      }\n    }\n    return diff;\n  }\n\n  function getChunks(diff) {\n    var chunks = [];\n    if (!diff.length) return chunks;\n    var startEdit = 0, startOrig = 0;\n    var edit = Pos(0, 0), orig = Pos(0, 0);\n    for (var i = 0; i < diff.length; ++i) {\n      var part = diff[i], tp = part[0];\n      if (tp == DIFF_EQUAL) {\n        var startOff = !startOfLineClean(diff, i) || edit.line < startEdit || orig.line < startOrig ? 1 : 0;\n        var cleanFromEdit = edit.line + startOff, cleanFromOrig = orig.line + startOff;\n        moveOver(edit, part[1], null, orig);\n        var endOff = endOfLineClean(diff, i) ? 1 : 0;\n        var cleanToEdit = edit.line + endOff, cleanToOrig = orig.line + endOff;\n        if (cleanToEdit > cleanFromEdit) {\n          if (i) chunks.push({origFrom: startOrig, origTo: cleanFromOrig,\n                              editFrom: startEdit, editTo: cleanFromEdit});\n          startEdit = cleanToEdit; startOrig = cleanToOrig;\n        }\n      } else {\n        moveOver(tp == DIFF_INSERT ? edit : orig, part[1]);\n      }\n    }\n    if (startEdit <= edit.line || startOrig <= orig.line)\n      chunks.push({origFrom: startOrig, origTo: orig.line + 1,\n                   editFrom: startEdit, editTo: edit.line + 1});\n    return chunks;\n  }\n\n  function endOfLineClean(diff, i) {\n    if (i == diff.length - 1) return true;\n    var next = diff[i + 1][1];\n    if ((next.length == 1 && i < diff.length - 2) || next.charCodeAt(0) != 10) return false;\n    if (i == diff.length - 2) return true;\n    next = diff[i + 2][1];\n    return (next.length > 1 || i == diff.length - 3) && next.charCodeAt(0) == 10;\n  }\n\n  function startOfLineClean(diff, i) {\n    if (i == 0) return true;\n    var last = diff[i - 1][1];\n    if (last.charCodeAt(last.length - 1) != 10) return false;\n    if (i == 1) return true;\n    last = diff[i - 2][1];\n    return last.charCodeAt(last.length - 1) == 10;\n  }\n\n  function chunkBoundariesAround(chunks, n, nInEdit) {\n    var beforeE, afterE, beforeO, afterO;\n    for (var i = 0; i < chunks.length; i++) {\n      var chunk = chunks[i];\n      var fromLocal = nInEdit ? chunk.editFrom : chunk.origFrom;\n      var toLocal = nInEdit ? chunk.editTo : chunk.origTo;\n      if (afterE == null) {\n        if (fromLocal > n) { afterE = chunk.editFrom; afterO = chunk.origFrom; }\n        else if (toLocal > n) { afterE = chunk.editTo; afterO = chunk.origTo; }\n      }\n      if (toLocal <= n) { beforeE = chunk.editTo; beforeO = chunk.origTo; }\n      else if (fromLocal <= n) { beforeE = chunk.editFrom; beforeO = chunk.origFrom; }\n    }\n    return {edit: {before: beforeE, after: afterE}, orig: {before: beforeO, after: afterO}};\n  }\n\n  function collapseSingle(cm, from, to) {\n    cm.addLineClass(from, \"wrap\", \"CodeMirror-merge-collapsed-line\");\n    var widget = document.createElement(\"span\");\n    widget.className = \"CodeMirror-merge-collapsed-widget\";\n    widget.title = cm.phrase(\"Identical text collapsed. Click to expand.\");\n    var mark = cm.markText(Pos(from, 0), Pos(to - 1), {\n      inclusiveLeft: true,\n      inclusiveRight: true,\n      replacedWith: widget,\n      clearOnEnter: true\n    });\n    function clear() {\n      mark.clear();\n      cm.removeLineClass(from, \"wrap\", \"CodeMirror-merge-collapsed-line\");\n    }\n    if (mark.explicitlyCleared) clear();\n    CodeMirror.on(widget, \"click\", clear);\n    mark.on(\"clear\", clear);\n    CodeMirror.on(widget, \"click\", clear);\n    return {mark: mark, clear: clear};\n  }\n\n  function collapseStretch(size, editors) {\n    var marks = [];\n    function clear() {\n      for (var i = 0; i < marks.length; i++) marks[i].clear();\n    }\n    for (var i = 0; i < editors.length; i++) {\n      var editor = editors[i];\n      var mark = collapseSingle(editor.cm, editor.line, editor.line + size);\n      marks.push(mark);\n      mark.mark.on(\"clear\", clear);\n    }\n    return marks[0].mark;\n  }\n\n  function unclearNearChunks(dv, margin, off, clear) {\n    for (var i = 0; i < dv.chunks.length; i++) {\n      var chunk = dv.chunks[i];\n      for (var l = chunk.editFrom - margin; l < chunk.editTo + margin; l++) {\n        var pos = l + off;\n        if (pos >= 0 && pos < clear.length) clear[pos] = false;\n      }\n    }\n  }\n\n  function collapseIdenticalStretches(mv, margin) {\n    if (typeof margin != \"number\") margin = 2;\n    var clear = [], edit = mv.editor(), off = edit.firstLine();\n    for (var l = off, e = edit.lastLine(); l <= e; l++) clear.push(true);\n    if (mv.left) unclearNearChunks(mv.left, margin, off, clear);\n    if (mv.right) unclearNearChunks(mv.right, margin, off, clear);\n\n    for (var i = 0; i < clear.length; i++) {\n      if (clear[i]) {\n        var line = i + off;\n        for (var size = 1; i < clear.length - 1 && clear[i + 1]; i++, size++) {}\n        if (size > margin) {\n          var editors = [{line: line, cm: edit}];\n          if (mv.left) editors.push({line: getMatchingOrigLine(line, mv.left.chunks), cm: mv.left.orig});\n          if (mv.right) editors.push({line: getMatchingOrigLine(line, mv.right.chunks), cm: mv.right.orig});\n          var mark = collapseStretch(size, editors);\n          if (mv.options.onCollapse) mv.options.onCollapse(mv, line, size, mark);\n        }\n      }\n    }\n  }\n\n  // General utilities\n\n  function elt(tag, content, className, style) {\n    var e = document.createElement(tag);\n    if (className) e.className = className;\n    if (style) e.style.cssText = style;\n    if (typeof content == \"string\") e.appendChild(document.createTextNode(content));\n    else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);\n    return e;\n  }\n\n  function clear(node) {\n    for (var count = node.childNodes.length; count > 0; --count)\n      node.removeChild(node.firstChild);\n  }\n\n  function attrs(elt) {\n    for (var i = 1; i < arguments.length; i += 2)\n      elt.setAttribute(arguments[i], arguments[i+1]);\n  }\n\n  function copyObj(obj, target) {\n    if (!target) target = {};\n    for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop];\n    return target;\n  }\n\n  function moveOver(pos, str, copy, other) {\n    var out = copy ? Pos(pos.line, pos.ch) : pos, at = 0;\n    for (;;) {\n      var nl = str.indexOf(\"\\n\", at);\n      if (nl == -1) break;\n      ++out.line;\n      if (other) ++other.line;\n      at = nl + 1;\n    }\n    out.ch = (at ? 0 : out.ch) + (str.length - at);\n    if (other) other.ch = (at ? 0 : other.ch) + (str.length - at);\n    return out;\n  }\n\n  // Tracks collapsed markers and line widgets, in order to be able to\n  // accurately align the content of two editors.\n\n  var F_WIDGET = 1, F_WIDGET_BELOW = 2, F_MARKER = 4\n\n  function TrackAlignable(cm) {\n    this.cm = cm\n    this.alignable = []\n    this.height = cm.doc.height\n    var self = this\n    cm.on(\"markerAdded\", function(_, marker) {\n      if (!marker.collapsed) return\n      var found = marker.find(1)\n      if (found != null) self.set(found.line, F_MARKER)\n    })\n    cm.on(\"markerCleared\", function(_, marker, _min, max) {\n      if (max != null && marker.collapsed)\n        self.check(max, F_MARKER, self.hasMarker)\n    })\n    cm.on(\"markerChanged\", this.signal.bind(this))\n    cm.on(\"lineWidgetAdded\", function(_, widget, lineNo) {\n      if (widget.mergeSpacer) return\n      if (widget.above) self.set(lineNo - 1, F_WIDGET_BELOW)\n      else self.set(lineNo, F_WIDGET)\n    })\n    cm.on(\"lineWidgetCleared\", function(_, widget, lineNo) {\n      if (widget.mergeSpacer) return\n      if (widget.above) self.check(lineNo - 1, F_WIDGET_BELOW, self.hasWidgetBelow)\n      else self.check(lineNo, F_WIDGET, self.hasWidget)\n    })\n    cm.on(\"lineWidgetChanged\", this.signal.bind(this))\n    cm.on(\"change\", function(_, change) {\n      var start = change.from.line, nBefore = change.to.line - change.from.line\n      var nAfter = change.text.length - 1, end = start + nAfter\n      if (nBefore || nAfter) self.map(start, nBefore, nAfter)\n      self.check(end, F_MARKER, self.hasMarker)\n      if (nBefore || nAfter) self.check(change.from.line, F_MARKER, self.hasMarker)\n    })\n    cm.on(\"viewportChange\", function() {\n      if (self.cm.doc.height != self.height) self.signal()\n    })\n  }\n\n  TrackAlignable.prototype = {\n    signal: function() {\n      CodeMirror.signal(this, \"realign\")\n      this.height = this.cm.doc.height\n    },\n\n    set: function(n, flags) {\n      var pos = -1\n      for (; pos < this.alignable.length; pos += 2) {\n        var diff = this.alignable[pos] - n\n        if (diff == 0) {\n          if ((this.alignable[pos + 1] & flags) == flags) return\n          this.alignable[pos + 1] |= flags\n          this.signal()\n          return\n        }\n        if (diff > 0) break\n      }\n      this.signal()\n      this.alignable.splice(pos, 0, n, flags)\n    },\n\n    find: function(n) {\n      for (var i = 0; i < this.alignable.length; i += 2)\n        if (this.alignable[i] == n) return i\n      return -1\n    },\n\n    check: function(n, flag, pred) {\n      var found = this.find(n)\n      if (found == -1 || !(this.alignable[found + 1] & flag)) return\n      if (!pred.call(this, n)) {\n        this.signal()\n        var flags = this.alignable[found + 1] & ~flag\n        if (flags) this.alignable[found + 1] = flags\n        else this.alignable.splice(found, 2)\n      }\n    },\n\n    hasMarker: function(n) {\n      var handle = this.cm.getLineHandle(n)\n      if (handle.markedSpans) for (var i = 0; i < handle.markedSpans.length; i++)\n        if (handle.markedSpans[i].marker.collapsed && handle.markedSpans[i].to != null)\n          return true\n      return false\n    },\n\n    hasWidget: function(n) {\n      var handle = this.cm.getLineHandle(n)\n      if (handle.widgets) for (var i = 0; i < handle.widgets.length; i++)\n        if (!handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true\n      return false\n    },\n\n    hasWidgetBelow: function(n) {\n      if (n == this.cm.lastLine()) return false\n      var handle = this.cm.getLineHandle(n + 1)\n      if (handle.widgets) for (var i = 0; i < handle.widgets.length; i++)\n        if (handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true\n      return false\n    },\n\n    map: function(from, nBefore, nAfter) {\n      var diff = nAfter - nBefore, to = from + nBefore, widgetFrom = -1, widgetTo = -1\n      for (var i = 0; i < this.alignable.length; i += 2) {\n        var n = this.alignable[i]\n        if (n == from && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetFrom = i\n        if (n == to && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetTo = i\n        if (n <= from) continue\n        else if (n < to) this.alignable.splice(i--, 2)\n        else this.alignable[i] += diff\n      }\n      if (widgetFrom > -1) {\n        var flags = this.alignable[widgetFrom + 1]\n        if (flags == F_WIDGET_BELOW) this.alignable.splice(widgetFrom, 2)\n        else this.alignable[widgetFrom + 1] = flags & ~F_WIDGET_BELOW\n      }\n      if (widgetTo > -1 && nAfter)\n        this.set(from + nAfter, F_WIDGET_BELOW)\n    }\n  }\n\n  function posMin(a, b) { return (a.line - b.line || a.ch - b.ch) < 0 ? a : b; }\n  function posMax(a, b) { return (a.line - b.line || a.ch - b.ch) > 0 ? a : b; }\n  function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }\n\n  function findPrevDiff(chunks, start, isOrig) {\n    for (var i = chunks.length - 1; i >= 0; i--) {\n      var chunk = chunks[i];\n      var to = (isOrig ? chunk.origTo : chunk.editTo) - 1;\n      if (to < start) return to;\n    }\n  }\n\n  function findNextDiff(chunks, start, isOrig) {\n    for (var i = 0; i < chunks.length; i++) {\n      var chunk = chunks[i];\n      var from = (isOrig ? chunk.origFrom : chunk.editFrom);\n      if (from > start) return from;\n    }\n  }\n\n  function goNearbyDiff(cm, dir) {\n    var found = null, views = cm.state.diffViews, line = cm.getCursor().line;\n    if (views) for (var i = 0; i < views.length; i++) {\n      var dv = views[i], isOrig = cm == dv.orig;\n      ensureDiff(dv);\n      var pos = dir < 0 ? findPrevDiff(dv.chunks, line, isOrig) : findNextDiff(dv.chunks, line, isOrig);\n      if (pos != null && (found == null || (dir < 0 ? pos > found : pos < found)))\n        found = pos;\n    }\n    if (found != null)\n      cm.setCursor(found, 0);\n    else\n      return CodeMirror.Pass;\n  }\n\n  CodeMirror.commands.goNextDiff = function(cm) {\n    return goNearbyDiff(cm, 1);\n  };\n  CodeMirror.commands.goPrevDiff = function(cm) {\n    return goNearbyDiff(cm, -1);\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/mode/loadmode.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), \"cjs\");\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], function(CM) { mod(CM, \"amd\"); });\n  else // Plain browser env\n    mod(CodeMirror, \"plain\");\n})(function(CodeMirror, env) {\n  if (!CodeMirror.modeURL) CodeMirror.modeURL = \"../mode/%N/%N.js\";\n\n  var loading = {};\n  function splitCallback(cont, n) {\n    var countDown = n;\n    return function() { if (--countDown == 0) cont(); };\n  }\n  function ensureDeps(mode, cont, options) {\n    var modeObj = CodeMirror.modes[mode], deps = modeObj && modeObj.dependencies;\n    if (!deps) return cont();\n    var missing = [];\n    for (var i = 0; i < deps.length; ++i) {\n      if (!CodeMirror.modes.hasOwnProperty(deps[i]))\n        missing.push(deps[i]);\n    }\n    if (!missing.length) return cont();\n    var split = splitCallback(cont, missing.length);\n    for (var i = 0; i < missing.length; ++i)\n      CodeMirror.requireMode(missing[i], split, options);\n  }\n\n  CodeMirror.requireMode = function(mode, cont, options) {\n    if (typeof mode != \"string\") mode = mode.name;\n    if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont, options);\n    if (loading.hasOwnProperty(mode)) return loading[mode].push(cont);\n\n    var file = options && options.path ? options.path(mode) : CodeMirror.modeURL.replace(/%N/g, mode);\n    if (options && options.loadMode) {\n      options.loadMode(file, function() { ensureDeps(mode, cont, options) })\n    } else if (env == \"plain\") {\n      var script = document.createElement(\"script\");\n      script.src = file;\n      var others = document.getElementsByTagName(\"script\")[0];\n      var list = loading[mode] = [cont];\n      CodeMirror.on(script, \"load\", function() {\n        ensureDeps(mode, function() {\n          for (var i = 0; i < list.length; ++i) list[i]();\n        }, options);\n      });\n      others.parentNode.insertBefore(script, others);\n    } else if (env == \"cjs\") {\n      require(file);\n      cont();\n    } else if (env == \"amd\") {\n      requirejs([file], cont);\n    }\n  };\n\n  CodeMirror.autoLoadMode = function(instance, mode, options) {\n    if (!CodeMirror.modes.hasOwnProperty(mode))\n      CodeMirror.requireMode(mode, function() {\n        instance.setOption(\"mode\", instance.getOption(\"mode\"));\n      }, options);\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/mode/multiplex.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.multiplexingMode = function(outer /*, others */) {\n  // Others should be {open, close, mode [, delimStyle] [, innerStyle] [, parseDelimiters]} objects\n  var others = Array.prototype.slice.call(arguments, 1);\n\n  function indexOf(string, pattern, from, returnEnd) {\n    if (typeof pattern == \"string\") {\n      var found = string.indexOf(pattern, from);\n      return returnEnd && found > -1 ? found + pattern.length : found;\n    }\n    var m = pattern.exec(from ? string.slice(from) : string);\n    return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1;\n  }\n\n  return {\n    startState: function() {\n      return {\n        outer: CodeMirror.startState(outer),\n        innerActive: null,\n        inner: null,\n        startingInner: false\n      };\n    },\n\n    copyState: function(state) {\n      return {\n        outer: CodeMirror.copyState(outer, state.outer),\n        innerActive: state.innerActive,\n        inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner),\n        startingInner: state.startingInner\n      };\n    },\n\n    token: function(stream, state) {\n      if (!state.innerActive) {\n        var cutOff = Infinity, oldContent = stream.string;\n        for (var i = 0; i < others.length; ++i) {\n          var other = others[i];\n          var found = indexOf(oldContent, other.open, stream.pos);\n          if (found == stream.pos) {\n            if (!other.parseDelimiters) stream.match(other.open);\n            state.startingInner = !!other.parseDelimiters\n            state.innerActive = other;\n\n            // Get the outer indent, making sure to handle CodeMirror.Pass\n            var outerIndent = 0;\n            if (outer.indent) {\n              var possibleOuterIndent = outer.indent(state.outer, \"\", \"\");\n              if (possibleOuterIndent !== CodeMirror.Pass) outerIndent = possibleOuterIndent;\n            }\n\n            state.inner = CodeMirror.startState(other.mode, outerIndent);\n            return other.delimStyle && (other.delimStyle + \" \" + other.delimStyle + \"-open\");\n          } else if (found != -1 && found < cutOff) {\n            cutOff = found;\n          }\n        }\n        if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);\n        var outerToken = outer.token(stream, state.outer);\n        if (cutOff != Infinity) stream.string = oldContent;\n        return outerToken;\n      } else {\n        var curInner = state.innerActive, oldContent = stream.string;\n        if (!curInner.close && stream.sol()) {\n          state.innerActive = state.inner = null;\n          return this.token(stream, state);\n        }\n        var found = curInner.close && !state.startingInner ?\n            indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;\n        if (found == stream.pos && !curInner.parseDelimiters) {\n          stream.match(curInner.close);\n          state.innerActive = state.inner = null;\n          return curInner.delimStyle && (curInner.delimStyle + \" \" + curInner.delimStyle + \"-close\");\n        }\n        if (found > -1) stream.string = oldContent.slice(0, found);\n        var innerToken = curInner.mode.token(stream, state.inner);\n        if (found > -1) stream.string = oldContent;\n        else if (stream.pos > stream.start) state.startingInner = false\n\n        if (found == stream.pos && curInner.parseDelimiters)\n          state.innerActive = state.inner = null;\n\n        if (curInner.innerStyle) {\n          if (innerToken) innerToken = innerToken + \" \" + curInner.innerStyle;\n          else innerToken = curInner.innerStyle;\n        }\n\n        return innerToken;\n      }\n    },\n\n    indent: function(state, textAfter, line) {\n      var mode = state.innerActive ? state.innerActive.mode : outer;\n      if (!mode.indent) return CodeMirror.Pass;\n      return mode.indent(state.innerActive ? state.inner : state.outer, textAfter, line);\n    },\n\n    blankLine: function(state) {\n      var mode = state.innerActive ? state.innerActive.mode : outer;\n      if (mode.blankLine) {\n        mode.blankLine(state.innerActive ? state.inner : state.outer);\n      }\n      if (!state.innerActive) {\n        for (var i = 0; i < others.length; ++i) {\n          var other = others[i];\n          if (other.open === \"\\n\") {\n            state.innerActive = other;\n            state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, \"\", \"\") : 0);\n          }\n        }\n      } else if (state.innerActive.close === \"\\n\") {\n        state.innerActive = state.inner = null;\n      }\n    },\n\n    electricChars: outer.electricChars,\n\n    innerMode: function(state) {\n      return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};\n    }\n  };\n};\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/mode/multiplex_test.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function() {\n  CodeMirror.defineMode(\"markdown_with_stex\", function(){\n    var inner = CodeMirror.getMode({}, \"stex\");\n    var outer = CodeMirror.getMode({}, \"markdown\");\n\n    var innerOptions = {\n      open: '$',\n      close: '$',\n      mode: inner,\n      delimStyle: 'delim',\n      innerStyle: 'inner'\n    };\n\n    return CodeMirror.multiplexingMode(outer, innerOptions);\n  });\n\n  var mode = CodeMirror.getMode({}, \"markdown_with_stex\");\n\n  function MT(name) {\n    test.mode(\n      name,\n      mode,\n      Array.prototype.slice.call(arguments, 1),\n      'multiplexing');\n  }\n\n  MT(\n    \"stexInsideMarkdown\",\n    \"[strong **Equation:**] [delim&delim-open $][inner&tag \\\\pi][delim&delim-close $]\");\n\n  CodeMirror.defineMode(\"identical_delim_multiplex\", function() {\n    return CodeMirror.multiplexingMode(CodeMirror.getMode({indentUnit: 2}, \"javascript\"), {\n      open: \"#\",\n      close: \"#\",\n      mode: CodeMirror.getMode({}, \"markdown\"),\n      parseDelimiters: true,\n      innerStyle: \"q\"\n    });\n  });\n\n  var mode2 = CodeMirror.getMode({}, \"identical_delim_multiplex\");\n\n  test.mode(\"identical_delimiters_with_parseDelimiters\", mode2, [\n    \"[keyword let] [def x] [operator =] [q #foo][q&em *bar*][q #];\"\n  ], \"multiplexing\")\n})();\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/mode/overlay.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Utility function that allows modes to be combined. The mode given\n// as the base argument takes care of most of the normal mode\n// functionality, but a second (typically simple) mode is used, which\n// can override the style of text. Both modes get to parse all of the\n// text, but when both assign a non-null style to a piece of code, the\n// overlay wins, unless the combine argument was true and not overridden,\n// or state.overlay.combineTokens was true, in which case the styles are\n// combined.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.overlayMode = function(base, overlay, combine) {\n  return {\n    startState: function() {\n      return {\n        base: CodeMirror.startState(base),\n        overlay: CodeMirror.startState(overlay),\n        basePos: 0, baseCur: null,\n        overlayPos: 0, overlayCur: null,\n        streamSeen: null\n      };\n    },\n    copyState: function(state) {\n      return {\n        base: CodeMirror.copyState(base, state.base),\n        overlay: CodeMirror.copyState(overlay, state.overlay),\n        basePos: state.basePos, baseCur: null,\n        overlayPos: state.overlayPos, overlayCur: null\n      };\n    },\n\n    token: function(stream, state) {\n      if (stream != state.streamSeen ||\n          Math.min(state.basePos, state.overlayPos) < stream.start) {\n        state.streamSeen = stream;\n        state.basePos = state.overlayPos = stream.start;\n      }\n\n      if (stream.start == state.basePos) {\n        state.baseCur = base.token(stream, state.base);\n        state.basePos = stream.pos;\n      }\n      if (stream.start == state.overlayPos) {\n        stream.pos = stream.start;\n        state.overlayCur = overlay.token(stream, state.overlay);\n        state.overlayPos = stream.pos;\n      }\n      stream.pos = Math.min(state.basePos, state.overlayPos);\n\n      // state.overlay.combineTokens always takes precedence over combine,\n      // unless set to null\n      if (state.overlayCur == null) return state.baseCur;\n      else if (state.baseCur != null &&\n               state.overlay.combineTokens ||\n               combine && state.overlay.combineTokens == null)\n        return state.baseCur + \" \" + state.overlayCur;\n      else return state.overlayCur;\n    },\n\n    indent: base.indent && function(state, textAfter, line) {\n      return base.indent(state.base, textAfter, line);\n    },\n    electricChars: base.electricChars,\n\n    innerMode: function(state) { return {state: state.base, mode: base}; },\n\n    blankLine: function(state) {\n      var baseToken, overlayToken;\n      if (base.blankLine) baseToken = base.blankLine(state.base);\n      if (overlay.blankLine) overlayToken = overlay.blankLine(state.overlay);\n\n      return overlayToken == null ?\n        baseToken :\n        (combine && baseToken != null ? baseToken + \" \" + overlayToken : overlayToken);\n    }\n  };\n};\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/mode/simple.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineSimpleMode = function(name, states) {\n    CodeMirror.defineMode(name, function(config) {\n      return CodeMirror.simpleMode(config, states);\n    });\n  };\n\n  CodeMirror.simpleMode = function(config, states) {\n    ensureState(states, \"start\");\n    var states_ = {}, meta = states.meta || {}, hasIndentation = false;\n    for (var state in states) if (state != meta && states.hasOwnProperty(state)) {\n      var list = states_[state] = [], orig = states[state];\n      for (var i = 0; i < orig.length; i++) {\n        var data = orig[i];\n        list.push(new Rule(data, states));\n        if (data.indent || data.dedent) hasIndentation = true;\n      }\n    }\n    var mode = {\n      startState: function() {\n        return {state: \"start\", pending: null,\n                local: null, localState: null,\n                indent: hasIndentation ? [] : null};\n      },\n      copyState: function(state) {\n        var s = {state: state.state, pending: state.pending,\n                 local: state.local, localState: null,\n                 indent: state.indent && state.indent.slice(0)};\n        if (state.localState)\n          s.localState = CodeMirror.copyState(state.local.mode, state.localState);\n        if (state.stack)\n          s.stack = state.stack.slice(0);\n        for (var pers = state.persistentStates; pers; pers = pers.next)\n          s.persistentStates = {mode: pers.mode,\n                                spec: pers.spec,\n                                state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state),\n                                next: s.persistentStates};\n        return s;\n      },\n      token: tokenFunction(states_, config),\n      innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; },\n      indent: indentFunction(states_, meta)\n    };\n    if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop))\n      mode[prop] = meta[prop];\n    return mode;\n  };\n\n  function ensureState(states, name) {\n    if (!states.hasOwnProperty(name))\n      throw new Error(\"Undefined state \" + name + \" in simple mode\");\n  }\n\n  function toRegex(val, caret) {\n    if (!val) return /(?:)/;\n    var flags = \"\";\n    if (val instanceof RegExp) {\n      if (val.ignoreCase) flags = \"i\";\n      if (val.unicode) flags += \"u\"\n      val = val.source;\n    } else {\n      val = String(val);\n    }\n    return new RegExp((caret === false ? \"\" : \"^\") + \"(?:\" + val + \")\", flags);\n  }\n\n  function asToken(val) {\n    if (!val) return null;\n    if (val.apply) return val\n    if (typeof val == \"string\") return val.replace(/\\./g, \" \");\n    var result = [];\n    for (var i = 0; i < val.length; i++)\n      result.push(val[i] && val[i].replace(/\\./g, \" \"));\n    return result;\n  }\n\n  function Rule(data, states) {\n    if (data.next || data.push) ensureState(states, data.next || data.push);\n    this.regex = toRegex(data.regex);\n    this.token = asToken(data.token);\n    this.data = data;\n  }\n\n  function tokenFunction(states, config) {\n    return function(stream, state) {\n      if (state.pending) {\n        var pend = state.pending.shift();\n        if (state.pending.length == 0) state.pending = null;\n        stream.pos += pend.text.length;\n        return pend.token;\n      }\n\n      if (state.local) {\n        if (state.local.end && stream.match(state.local.end)) {\n          var tok = state.local.endToken || null;\n          state.local = state.localState = null;\n          return tok;\n        } else {\n          var tok = state.local.mode.token(stream, state.localState), m;\n          if (state.local.endScan && (m = state.local.endScan.exec(stream.current())))\n            stream.pos = stream.start + m.index;\n          return tok;\n        }\n      }\n\n      var curState = states[state.state];\n      for (var i = 0; i < curState.length; i++) {\n        var rule = curState[i];\n        var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex);\n        if (matches) {\n          if (rule.data.next) {\n            state.state = rule.data.next;\n          } else if (rule.data.push) {\n            (state.stack || (state.stack = [])).push(state.state);\n            state.state = rule.data.push;\n          } else if (rule.data.pop && state.stack && state.stack.length) {\n            state.state = state.stack.pop();\n          }\n\n          if (rule.data.mode)\n            enterLocalMode(config, state, rule.data.mode, rule.token);\n          if (rule.data.indent)\n            state.indent.push(stream.indentation() + config.indentUnit);\n          if (rule.data.dedent)\n            state.indent.pop();\n          var token = rule.token\n          if (token && token.apply) token = token(matches)\n          if (matches.length > 2 && rule.token && typeof rule.token != \"string\") {\n            for (var j = 2; j < matches.length; j++)\n              if (matches[j])\n                (state.pending || (state.pending = [])).push({text: matches[j], token: rule.token[j - 1]});\n            stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));\n            return token[0];\n          } else if (token && token.join) {\n            return token[0];\n          } else {\n            return token;\n          }\n        }\n      }\n      stream.next();\n      return null;\n    };\n  }\n\n  function cmp(a, b) {\n    if (a === b) return true;\n    if (!a || typeof a != \"object\" || !b || typeof b != \"object\") return false;\n    var props = 0;\n    for (var prop in a) if (a.hasOwnProperty(prop)) {\n      if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false;\n      props++;\n    }\n    for (var prop in b) if (b.hasOwnProperty(prop)) props--;\n    return props == 0;\n  }\n\n  function enterLocalMode(config, state, spec, token) {\n    var pers;\n    if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next)\n      if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p;\n    var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec);\n    var lState = pers ? pers.state : CodeMirror.startState(mode);\n    if (spec.persistent && !pers)\n      state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates};\n\n    state.localState = lState;\n    state.local = {mode: mode,\n                   end: spec.end && toRegex(spec.end),\n                   endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false),\n                   endToken: token && token.join ? token[token.length - 1] : token};\n  }\n\n  function indexOf(val, arr) {\n    for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true;\n  }\n\n  function indentFunction(states, meta) {\n    return function(state, textAfter, line) {\n      if (state.local && state.local.mode.indent)\n        return state.local.mode.indent(state.localState, textAfter, line);\n      if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1)\n        return CodeMirror.Pass;\n\n      var pos = state.indent.length - 1, rules = states[state.state];\n      scan: for (;;) {\n        for (var i = 0; i < rules.length; i++) {\n          var rule = rules[i];\n          if (rule.data.dedent && rule.data.dedentIfLineStart !== false) {\n            var m = rule.regex.exec(textAfter);\n            if (m && m[0]) {\n              pos--;\n              if (rule.next || rule.push) rules = states[rule.next || rule.push];\n              textAfter = textAfter.slice(m[0].length);\n              continue scan;\n            }\n          }\n        }\n        break;\n      }\n      return pos < 0 ? 0 : state.indent[pos];\n    };\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/runmode/colorize.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./runmode\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./runmode\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var isBlock = /^(p|li|div|h\\\\d|pre|blockquote|td)$/;\n\n  function textContent(node, out) {\n    if (node.nodeType == 3) return out.push(node.nodeValue);\n    for (var ch = node.firstChild; ch; ch = ch.nextSibling) {\n      textContent(ch, out);\n      if (isBlock.test(node.nodeType)) out.push(\"\\n\");\n    }\n  }\n\n  CodeMirror.colorize = function(collection, defaultMode) {\n    if (!collection) collection = document.body.getElementsByTagName(\"pre\");\n\n    for (var i = 0; i < collection.length; ++i) {\n      var node = collection[i];\n      var mode = node.getAttribute(\"data-lang\") || defaultMode;\n      if (!mode) continue;\n\n      var text = [];\n      textContent(node, text);\n      node.innerHTML = \"\";\n      CodeMirror.runMode(text.join(\"\"), mode, node);\n\n      node.className += \" cm-s-default\";\n    }\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/runmode/runmode-standalone.js",
    "content": "(function () {\n  'use strict';\n\n  function copyObj(obj, target, overwrite) {\n    if (!target) { target = {}; }\n    for (var prop in obj)\n      { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n        { target[prop] = obj[prop]; } }\n    return target\n  }\n\n  // Counts the column offset in a string, taking tabs into account.\n  // Used mostly to find indentation.\n  function countColumn(string, end, tabSize, startIndex, startValue) {\n    if (end == null) {\n      end = string.search(/[^\\s\\u00a0]/);\n      if (end == -1) { end = string.length; }\n    }\n    for (var i = startIndex || 0, n = startValue || 0;;) {\n      var nextTab = string.indexOf(\"\\t\", i);\n      if (nextTab < 0 || nextTab >= end)\n        { return n + (end - i) }\n      n += nextTab - i;\n      n += tabSize - (n % tabSize);\n      i = nextTab + 1;\n    }\n  }\n\n  function nothing() {}\n\n  function createObj(base, props) {\n    var inst;\n    if (Object.create) {\n      inst = Object.create(base);\n    } else {\n      nothing.prototype = base;\n      inst = new nothing();\n    }\n    if (props) { copyObj(props, inst); }\n    return inst\n  }\n\n  // STRING STREAM\n\n  // Fed to the mode parsers, provides helper functions to make\n  // parsers more succinct.\n\n  var StringStream = function(string, tabSize, lineOracle) {\n    this.pos = this.start = 0;\n    this.string = string;\n    this.tabSize = tabSize || 8;\n    this.lastColumnPos = this.lastColumnValue = 0;\n    this.lineStart = 0;\n    this.lineOracle = lineOracle;\n  };\n\n  StringStream.prototype.eol = function () {return this.pos >= this.string.length};\n  StringStream.prototype.sol = function () {return this.pos == this.lineStart};\n  StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\n  StringStream.prototype.next = function () {\n    if (this.pos < this.string.length)\n      { return this.string.charAt(this.pos++) }\n  };\n  StringStream.prototype.eat = function (match) {\n    var ch = this.string.charAt(this.pos);\n    var ok;\n    if (typeof match == \"string\") { ok = ch == match; }\n    else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n    if (ok) {++this.pos; return ch}\n  };\n  StringStream.prototype.eatWhile = function (match) {\n    var start = this.pos;\n    while (this.eat(match)){}\n    return this.pos > start\n  };\n  StringStream.prototype.eatSpace = function () {\n    var start = this.pos;\n    while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }\n    return this.pos > start\n  };\n  StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\n  StringStream.prototype.skipTo = function (ch) {\n    var found = this.string.indexOf(ch, this.pos);\n    if (found > -1) {this.pos = found; return true}\n  };\n  StringStream.prototype.backUp = function (n) {this.pos -= n;};\n  StringStream.prototype.column = function () {\n    if (this.lastColumnPos < this.start) {\n      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n      this.lastColumnPos = this.start;\n    }\n    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.indentation = function () {\n    return countColumn(this.string, null, this.tabSize) -\n      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n    if (typeof pattern == \"string\") {\n      var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n      var substr = this.string.substr(this.pos, pattern.length);\n      if (cased(substr) == cased(pattern)) {\n        if (consume !== false) { this.pos += pattern.length; }\n        return true\n      }\n    } else {\n      var match = this.string.slice(this.pos).match(pattern);\n      if (match && match.index > 0) { return null }\n      if (match && consume !== false) { this.pos += match[0].length; }\n      return match\n    }\n  };\n  StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\n  StringStream.prototype.hideFirstChars = function (n, inner) {\n    this.lineStart += n;\n    try { return inner() }\n    finally { this.lineStart -= n; }\n  };\n  StringStream.prototype.lookAhead = function (n) {\n    var oracle = this.lineOracle;\n    return oracle && oracle.lookAhead(n)\n  };\n  StringStream.prototype.baseToken = function () {\n    var oracle = this.lineOracle;\n    return oracle && oracle.baseToken(this.pos)\n  };\n\n  // Known modes, by name and by MIME\n  var modes = {}, mimeModes = {};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  function defineMode(name, mode) {\n    if (arguments.length > 2)\n      { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n    modes[name] = mode;\n  }\n\n  function defineMIME(mime, spec) {\n    mimeModes[mime] = spec;\n  }\n\n  // Given a MIME type, a {name, ...options} config object, or a name\n  // string, return a mode config object.\n  function resolveMode(spec) {\n    if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n      spec = mimeModes[spec];\n    } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n      var found = mimeModes[spec.name];\n      if (typeof found == \"string\") { found = {name: found}; }\n      spec = createObj(found, spec);\n      spec.name = found.name;\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n      return resolveMode(\"application/xml\")\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n      return resolveMode(\"application/json\")\n    }\n    if (typeof spec == \"string\") { return {name: spec} }\n    else { return spec || {name: \"null\"} }\n  }\n\n  // Given a mode spec (anything that resolveMode accepts), find and\n  // initialize an actual mode object.\n  function getMode(options, spec) {\n    spec = resolveMode(spec);\n    var mfactory = modes[spec.name];\n    if (!mfactory) { return getMode(options, \"text/plain\") }\n    var modeObj = mfactory(options, spec);\n    if (modeExtensions.hasOwnProperty(spec.name)) {\n      var exts = modeExtensions[spec.name];\n      for (var prop in exts) {\n        if (!exts.hasOwnProperty(prop)) { continue }\n        if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n        modeObj[prop] = exts[prop];\n      }\n    }\n    modeObj.name = spec.name;\n    if (spec.helperType) { modeObj.helperType = spec.helperType; }\n    if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n      { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n    return modeObj\n  }\n\n  // This can be used to attach properties to mode objects from\n  // outside the actual mode definition.\n  var modeExtensions = {};\n  function extendMode(mode, properties) {\n    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n    copyObj(properties, exts);\n  }\n\n  function copyState(mode, state) {\n    if (state === true) { return state }\n    if (mode.copyState) { return mode.copyState(state) }\n    var nstate = {};\n    for (var n in state) {\n      var val = state[n];\n      if (val instanceof Array) { val = val.concat([]); }\n      nstate[n] = val;\n    }\n    return nstate\n  }\n\n  // Given a mode and a state (for that mode), find the inner mode and\n  // state at the position that the state refers to.\n  function innerMode(mode, state) {\n    var info;\n    while (mode.innerMode) {\n      info = mode.innerMode(state);\n      if (!info || info.mode == mode) { break }\n      state = info.state;\n      mode = info.mode;\n    }\n    return info || {mode: mode, state: state}\n  }\n\n  function startState(mode, a1, a2) {\n    return mode.startState ? mode.startState(a1, a2) : true\n  }\n\n  var modeMethods = {\n    __proto__: null,\n    modes: modes,\n    mimeModes: mimeModes,\n    defineMode: defineMode,\n    defineMIME: defineMIME,\n    resolveMode: resolveMode,\n    getMode: getMode,\n    modeExtensions: modeExtensions,\n    extendMode: extendMode,\n    copyState: copyState,\n    innerMode: innerMode,\n    startState: startState\n  };\n\n  // declare global: globalThis, CodeMirror\n\n  // Create a minimal CodeMirror needed to use runMode, and assign to root.\n  var root = typeof globalThis !== 'undefined' ? globalThis : window;\n  root.CodeMirror = {};\n\n  // Copy StringStream and mode methods into CodeMirror object.\n  CodeMirror.StringStream = StringStream;\n  for (var exported in modeMethods) { CodeMirror[exported] = modeMethods[exported]; }\n\n  // Minimal default mode.\n  CodeMirror.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\n  CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n  CodeMirror.registerHelper = CodeMirror.registerGlobalHelper = Math.min;\n  CodeMirror.splitLines = function(string) { return string.split(/\\r?\\n|\\r/) };\n  CodeMirror.countColumn = countColumn;\n\n  CodeMirror.defaults = { indentUnit: 2 };\n\n  // CodeMirror, copyright (c) by Marijn Haverbeke and others\n  // Distributed under an MIT license: https://codemirror.net/LICENSE\n\n  (function(mod) {\n    if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n      { mod(require(\"../../lib/codemirror\")); }\n    else if (typeof define == \"function\" && define.amd) // AMD\n      { define([\"../../lib/codemirror\"], mod); }\n    else // Plain browser env\n      { mod(CodeMirror); }\n  })(function(CodeMirror) {\n\n  CodeMirror.runMode = function(string, modespec, callback, options) {\n    var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);\n    var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;\n\n    // Create a tokenizing callback function if passed-in callback is a DOM element.\n    if (callback.appendChild) {\n      var ie = /MSIE \\d/.test(navigator.userAgent);\n      var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);\n      var node = callback, col = 0;\n      node.innerHTML = \"\";\n      callback = function(text, style) {\n        if (text == \"\\n\") {\n          // Emitting LF or CRLF on IE8 or earlier results in an incorrect display.\n          // Emitting a carriage return makes everything ok.\n          node.appendChild(document.createTextNode(ie_lt9 ? '\\r' : text));\n          col = 0;\n          return;\n        }\n        var content = \"\";\n        // replace tabs\n        for (var pos = 0;;) {\n          var idx = text.indexOf(\"\\t\", pos);\n          if (idx == -1) {\n            content += text.slice(pos);\n            col += text.length - pos;\n            break;\n          } else {\n            col += idx - pos;\n            content += text.slice(pos, idx);\n            var size = tabSize - col % tabSize;\n            col += size;\n            for (var i = 0; i < size; ++i) { content += \" \"; }\n            pos = idx + 1;\n          }\n        }\n        // Create a node with token style and append it to the callback DOM element.\n        if (style) {\n          var sp = node.appendChild(document.createElement(\"span\"));\n          sp.className = \"cm-\" + style.replace(/ +/g, \" cm-\");\n          sp.appendChild(document.createTextNode(content));\n        } else {\n          node.appendChild(document.createTextNode(content));\n        }\n      };\n    }\n\n    var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode);\n    for (var i = 0, e = lines.length; i < e; ++i) {\n      if (i) { callback(\"\\n\"); }\n      var stream = new CodeMirror.StringStream(lines[i], null, {\n        lookAhead: function(n) { return lines[i + n] },\n        baseToken: function() {}\n      });\n      if (!stream.string && mode.blankLine) { mode.blankLine(state); }\n      while (!stream.eol()) {\n        var style = mode.token(stream, state);\n        callback(stream.current(), style, i, stream.start, state, mode);\n        stream.start = stream.pos;\n      }\n    }\n  };\n\n  });\n\n}());\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/runmode/runmode.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.runMode = function(string, modespec, callback, options) {\n  var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);\n  var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;\n\n  // Create a tokenizing callback function if passed-in callback is a DOM element.\n  if (callback.appendChild) {\n    var ie = /MSIE \\d/.test(navigator.userAgent);\n    var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);\n    var node = callback, col = 0;\n    node.innerHTML = \"\";\n    callback = function(text, style) {\n      if (text == \"\\n\") {\n        // Emitting LF or CRLF on IE8 or earlier results in an incorrect display.\n        // Emitting a carriage return makes everything ok.\n        node.appendChild(document.createTextNode(ie_lt9 ? '\\r' : text));\n        col = 0;\n        return;\n      }\n      var content = \"\";\n      // replace tabs\n      for (var pos = 0;;) {\n        var idx = text.indexOf(\"\\t\", pos);\n        if (idx == -1) {\n          content += text.slice(pos);\n          col += text.length - pos;\n          break;\n        } else {\n          col += idx - pos;\n          content += text.slice(pos, idx);\n          var size = tabSize - col % tabSize;\n          col += size;\n          for (var i = 0; i < size; ++i) content += \" \";\n          pos = idx + 1;\n        }\n      }\n      // Create a node with token style and append it to the callback DOM element.\n      if (style) {\n        var sp = node.appendChild(document.createElement(\"span\"));\n        sp.className = \"cm-\" + style.replace(/ +/g, \" cm-\");\n        sp.appendChild(document.createTextNode(content));\n      } else {\n        node.appendChild(document.createTextNode(content));\n      }\n    };\n  }\n\n  var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode);\n  for (var i = 0, e = lines.length; i < e; ++i) {\n    if (i) callback(\"\\n\");\n    var stream = new CodeMirror.StringStream(lines[i], null, {\n      lookAhead: function(n) { return lines[i + n] },\n      baseToken: function() {}\n    });\n    if (!stream.string && mode.blankLine) mode.blankLine(state);\n    while (!stream.eol()) {\n      var style = mode.token(stream, state);\n      callback(stream.current(), style, i, stream.start, state, mode);\n      stream.start = stream.pos;\n    }\n  }\n};\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/runmode/runmode.node.js",
    "content": "'use strict';\n\nfunction copyObj(obj, target, overwrite) {\n  if (!target) { target = {}; }\n  for (var prop in obj)\n    { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n      { target[prop] = obj[prop]; } }\n  return target\n}\n\n// Counts the column offset in a string, taking tabs into account.\n// Used mostly to find indentation.\nfunction countColumn(string, end, tabSize, startIndex, startValue) {\n  if (end == null) {\n    end = string.search(/[^\\s\\u00a0]/);\n    if (end == -1) { end = string.length; }\n  }\n  for (var i = startIndex || 0, n = startValue || 0;;) {\n    var nextTab = string.indexOf(\"\\t\", i);\n    if (nextTab < 0 || nextTab >= end)\n      { return n + (end - i) }\n    n += nextTab - i;\n    n += tabSize - (n % tabSize);\n    i = nextTab + 1;\n  }\n}\n\nfunction nothing() {}\n\nfunction createObj(base, props) {\n  var inst;\n  if (Object.create) {\n    inst = Object.create(base);\n  } else {\n    nothing.prototype = base;\n    inst = new nothing();\n  }\n  if (props) { copyObj(props, inst); }\n  return inst\n}\n\n// STRING STREAM\n\n// Fed to the mode parsers, provides helper functions to make\n// parsers more succinct.\n\nvar StringStream = function(string, tabSize, lineOracle) {\n  this.pos = this.start = 0;\n  this.string = string;\n  this.tabSize = tabSize || 8;\n  this.lastColumnPos = this.lastColumnValue = 0;\n  this.lineStart = 0;\n  this.lineOracle = lineOracle;\n};\n\nStringStream.prototype.eol = function () {return this.pos >= this.string.length};\nStringStream.prototype.sol = function () {return this.pos == this.lineStart};\nStringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\nStringStream.prototype.next = function () {\n  if (this.pos < this.string.length)\n    { return this.string.charAt(this.pos++) }\n};\nStringStream.prototype.eat = function (match) {\n  var ch = this.string.charAt(this.pos);\n  var ok;\n  if (typeof match == \"string\") { ok = ch == match; }\n  else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n  if (ok) {++this.pos; return ch}\n};\nStringStream.prototype.eatWhile = function (match) {\n  var start = this.pos;\n  while (this.eat(match)){}\n  return this.pos > start\n};\nStringStream.prototype.eatSpace = function () {\n  var start = this.pos;\n  while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }\n  return this.pos > start\n};\nStringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\nStringStream.prototype.skipTo = function (ch) {\n  var found = this.string.indexOf(ch, this.pos);\n  if (found > -1) {this.pos = found; return true}\n};\nStringStream.prototype.backUp = function (n) {this.pos -= n;};\nStringStream.prototype.column = function () {\n  if (this.lastColumnPos < this.start) {\n    this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n    this.lastColumnPos = this.start;\n  }\n  return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n};\nStringStream.prototype.indentation = function () {\n  return countColumn(this.string, null, this.tabSize) -\n    (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n};\nStringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n  if (typeof pattern == \"string\") {\n    var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n    var substr = this.string.substr(this.pos, pattern.length);\n    if (cased(substr) == cased(pattern)) {\n      if (consume !== false) { this.pos += pattern.length; }\n      return true\n    }\n  } else {\n    var match = this.string.slice(this.pos).match(pattern);\n    if (match && match.index > 0) { return null }\n    if (match && consume !== false) { this.pos += match[0].length; }\n    return match\n  }\n};\nStringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\nStringStream.prototype.hideFirstChars = function (n, inner) {\n  this.lineStart += n;\n  try { return inner() }\n  finally { this.lineStart -= n; }\n};\nStringStream.prototype.lookAhead = function (n) {\n  var oracle = this.lineOracle;\n  return oracle && oracle.lookAhead(n)\n};\nStringStream.prototype.baseToken = function () {\n  var oracle = this.lineOracle;\n  return oracle && oracle.baseToken(this.pos)\n};\n\n// Known modes, by name and by MIME\nvar modes = {}, mimeModes = {};\n\n// Extra arguments are stored as the mode's dependencies, which is\n// used by (legacy) mechanisms like loadmode.js to automatically\n// load a mode. (Preferred mechanism is the require/define calls.)\nfunction defineMode(name, mode) {\n  if (arguments.length > 2)\n    { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n  modes[name] = mode;\n}\n\nfunction defineMIME(mime, spec) {\n  mimeModes[mime] = spec;\n}\n\n// Given a MIME type, a {name, ...options} config object, or a name\n// string, return a mode config object.\nfunction resolveMode(spec) {\n  if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n    spec = mimeModes[spec];\n  } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n    var found = mimeModes[spec.name];\n    if (typeof found == \"string\") { found = {name: found}; }\n    spec = createObj(found, spec);\n    spec.name = found.name;\n  } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n    return resolveMode(\"application/xml\")\n  } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n    return resolveMode(\"application/json\")\n  }\n  if (typeof spec == \"string\") { return {name: spec} }\n  else { return spec || {name: \"null\"} }\n}\n\n// Given a mode spec (anything that resolveMode accepts), find and\n// initialize an actual mode object.\nfunction getMode(options, spec) {\n  spec = resolveMode(spec);\n  var mfactory = modes[spec.name];\n  if (!mfactory) { return getMode(options, \"text/plain\") }\n  var modeObj = mfactory(options, spec);\n  if (modeExtensions.hasOwnProperty(spec.name)) {\n    var exts = modeExtensions[spec.name];\n    for (var prop in exts) {\n      if (!exts.hasOwnProperty(prop)) { continue }\n      if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n      modeObj[prop] = exts[prop];\n    }\n  }\n  modeObj.name = spec.name;\n  if (spec.helperType) { modeObj.helperType = spec.helperType; }\n  if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n    { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n  return modeObj\n}\n\n// This can be used to attach properties to mode objects from\n// outside the actual mode definition.\nvar modeExtensions = {};\nfunction extendMode(mode, properties) {\n  var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n  copyObj(properties, exts);\n}\n\nfunction copyState(mode, state) {\n  if (state === true) { return state }\n  if (mode.copyState) { return mode.copyState(state) }\n  var nstate = {};\n  for (var n in state) {\n    var val = state[n];\n    if (val instanceof Array) { val = val.concat([]); }\n    nstate[n] = val;\n  }\n  return nstate\n}\n\n// Given a mode and a state (for that mode), find the inner mode and\n// state at the position that the state refers to.\nfunction innerMode(mode, state) {\n  var info;\n  while (mode.innerMode) {\n    info = mode.innerMode(state);\n    if (!info || info.mode == mode) { break }\n    state = info.state;\n    mode = info.mode;\n  }\n  return info || {mode: mode, state: state}\n}\n\nfunction startState(mode, a1, a2) {\n  return mode.startState ? mode.startState(a1, a2) : true\n}\n\nvar modeMethods = {\n  __proto__: null,\n  modes: modes,\n  mimeModes: mimeModes,\n  defineMode: defineMode,\n  defineMIME: defineMIME,\n  resolveMode: resolveMode,\n  getMode: getMode,\n  modeExtensions: modeExtensions,\n  extendMode: extendMode,\n  copyState: copyState,\n  innerMode: innerMode,\n  startState: startState\n};\n\n// Copy StringStream and mode methods into exports (CodeMirror) object.\nexports.StringStream = StringStream;\nexports.countColumn = countColumn;\nfor (var exported in modeMethods) { exports[exported] = modeMethods[exported]; }\n\n// Shim library CodeMirror with the minimal CodeMirror defined above.\nrequire.cache[require.resolve(\"../../lib/codemirror\")] = require.cache[require.resolve(\"./runmode.node\")];\nrequire.cache[require.resolve(\"../../addon/runmode/runmode\")] = require.cache[require.resolve(\"./runmode.node\")];\n\n// Minimal default mode.\nexports.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\nexports.defineMIME(\"text/plain\", \"null\");\n\nexports.registerHelper = exports.registerGlobalHelper = Math.min;\nexports.splitLines = function(string) { return string.split(/\\r?\\n|\\r/) };\n\nexports.defaults = { indentUnit: 2 };\n\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    { mod(require(\"../../lib/codemirror\")); }\n  else if (typeof define == \"function\" && define.amd) // AMD\n    { define([\"../../lib/codemirror\"], mod); }\n  else // Plain browser env\n    { mod(CodeMirror); }\n})(function(CodeMirror) {\n\nCodeMirror.runMode = function(string, modespec, callback, options) {\n  var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);\n  var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;\n\n  // Create a tokenizing callback function if passed-in callback is a DOM element.\n  if (callback.appendChild) {\n    var ie = /MSIE \\d/.test(navigator.userAgent);\n    var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);\n    var node = callback, col = 0;\n    node.innerHTML = \"\";\n    callback = function(text, style) {\n      if (text == \"\\n\") {\n        // Emitting LF or CRLF on IE8 or earlier results in an incorrect display.\n        // Emitting a carriage return makes everything ok.\n        node.appendChild(document.createTextNode(ie_lt9 ? '\\r' : text));\n        col = 0;\n        return;\n      }\n      var content = \"\";\n      // replace tabs\n      for (var pos = 0;;) {\n        var idx = text.indexOf(\"\\t\", pos);\n        if (idx == -1) {\n          content += text.slice(pos);\n          col += text.length - pos;\n          break;\n        } else {\n          col += idx - pos;\n          content += text.slice(pos, idx);\n          var size = tabSize - col % tabSize;\n          col += size;\n          for (var i = 0; i < size; ++i) { content += \" \"; }\n          pos = idx + 1;\n        }\n      }\n      // Create a node with token style and append it to the callback DOM element.\n      if (style) {\n        var sp = node.appendChild(document.createElement(\"span\"));\n        sp.className = \"cm-\" + style.replace(/ +/g, \" cm-\");\n        sp.appendChild(document.createTextNode(content));\n      } else {\n        node.appendChild(document.createTextNode(content));\n      }\n    };\n  }\n\n  var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode);\n  for (var i = 0, e = lines.length; i < e; ++i) {\n    if (i) { callback(\"\\n\"); }\n    var stream = new CodeMirror.StringStream(lines[i], null, {\n      lookAhead: function(n) { return lines[i + n] },\n      baseToken: function() {}\n    });\n    if (!stream.string && mode.blankLine) { mode.blankLine(state); }\n    while (!stream.eol()) {\n      var style = mode.token(stream, state);\n      callback(stream.current(), style, i, stream.start, state, mode);\n      stream.start = stream.pos;\n    }\n  }\n};\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/scroll/annotatescrollbar.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineExtension(\"annotateScrollbar\", function(options) {\n    if (typeof options == \"string\") options = {className: options};\n    return new Annotation(this, options);\n  });\n\n  CodeMirror.defineOption(\"scrollButtonHeight\", 0);\n\n  function Annotation(cm, options) {\n    this.cm = cm;\n    this.options = options;\n    this.buttonHeight = options.scrollButtonHeight || cm.getOption(\"scrollButtonHeight\");\n    this.annotations = [];\n    this.doRedraw = this.doUpdate = null;\n    this.div = cm.getWrapperElement().appendChild(document.createElement(\"div\"));\n    this.div.style.cssText = \"position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none\";\n    this.computeScale();\n\n    function scheduleRedraw(delay) {\n      clearTimeout(self.doRedraw);\n      self.doRedraw = setTimeout(function() { self.redraw(); }, delay);\n    }\n\n    var self = this;\n    cm.on(\"refresh\", this.resizeHandler = function() {\n      clearTimeout(self.doUpdate);\n      self.doUpdate = setTimeout(function() {\n        if (self.computeScale()) scheduleRedraw(20);\n      }, 100);\n    });\n    cm.on(\"markerAdded\", this.resizeHandler);\n    cm.on(\"markerCleared\", this.resizeHandler);\n    if (options.listenForChanges !== false)\n      cm.on(\"changes\", this.changeHandler = function() {\n        scheduleRedraw(250);\n      });\n  }\n\n  Annotation.prototype.computeScale = function() {\n    var cm = this.cm;\n    var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight - this.buttonHeight * 2) /\n      cm.getScrollerElement().scrollHeight\n    if (hScale != this.hScale) {\n      this.hScale = hScale;\n      return true;\n    }\n  };\n\n  Annotation.prototype.update = function(annotations) {\n    this.annotations = annotations;\n    this.redraw();\n  };\n\n  Annotation.prototype.redraw = function(compute) {\n    if (compute !== false) this.computeScale();\n    var cm = this.cm, hScale = this.hScale;\n\n    var frag = document.createDocumentFragment(), anns = this.annotations;\n\n    var wrapping = cm.getOption(\"lineWrapping\");\n    var singleLineH = wrapping && cm.defaultTextHeight() * 1.5;\n    var curLine = null, curLineObj = null;\n\n    function getY(pos, top) {\n      if (curLine != pos.line) {\n        curLine = pos.line\n        curLineObj = cm.getLineHandle(pos.line)\n        var visual = cm.getLineHandleVisualStart(curLineObj)\n        if (visual != curLineObj) {\n          curLine = cm.getLineNumber(visual)\n          curLineObj = visual\n        }\n      }\n      if ((curLineObj.widgets && curLineObj.widgets.length) ||\n          (wrapping && curLineObj.height > singleLineH))\n        return cm.charCoords(pos, \"local\")[top ? \"top\" : \"bottom\"];\n      var topY = cm.heightAtLine(curLineObj, \"local\");\n      return topY + (top ? 0 : curLineObj.height);\n    }\n\n    var lastLine = cm.lastLine()\n    if (cm.display.barWidth) for (var i = 0, nextTop; i < anns.length; i++) {\n      var ann = anns[i];\n      if (ann.to.line > lastLine) continue;\n      var top = nextTop || getY(ann.from, true) * hScale;\n      var bottom = getY(ann.to, false) * hScale;\n      while (i < anns.length - 1) {\n        if (anns[i + 1].to.line > lastLine) break;\n        nextTop = getY(anns[i + 1].from, true) * hScale;\n        if (nextTop > bottom + .9) break;\n        ann = anns[++i];\n        bottom = getY(ann.to, false) * hScale;\n      }\n      if (bottom == top) continue;\n      var height = Math.max(bottom - top, 3);\n\n      var elt = frag.appendChild(document.createElement(\"div\"));\n      elt.style.cssText = \"position: absolute; right: 0px; width: \" + Math.max(cm.display.barWidth - 1, 2) + \"px; top: \"\n        + (top + this.buttonHeight) + \"px; height: \" + height + \"px\";\n      elt.className = this.options.className;\n      if (ann.id) {\n        elt.setAttribute(\"annotation-id\", ann.id);\n      }\n    }\n    this.div.textContent = \"\";\n    this.div.appendChild(frag);\n  };\n\n  Annotation.prototype.clear = function() {\n    this.cm.off(\"refresh\", this.resizeHandler);\n    this.cm.off(\"markerAdded\", this.resizeHandler);\n    this.cm.off(\"markerCleared\", this.resizeHandler);\n    if (this.changeHandler) this.cm.off(\"changes\", this.changeHandler);\n    this.div.parentNode.removeChild(this.div);\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/scroll/scrollpastend.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"scrollPastEnd\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.off(\"change\", onChange);\n      cm.off(\"refresh\", updateBottomMargin);\n      cm.display.lineSpace.parentNode.style.paddingBottom = \"\";\n      cm.state.scrollPastEndPadding = null;\n    }\n    if (val) {\n      cm.on(\"change\", onChange);\n      cm.on(\"refresh\", updateBottomMargin);\n      updateBottomMargin(cm);\n    }\n  });\n\n  function onChange(cm, change) {\n    if (CodeMirror.changeEnd(change).line == cm.lastLine())\n      updateBottomMargin(cm);\n  }\n\n  function updateBottomMargin(cm) {\n    var padding = \"\";\n    if (cm.lineCount() > 1) {\n      var totalH = cm.display.scroller.clientHeight - 30,\n          lastLineH = cm.getLineHandle(cm.lastLine()).height;\n      padding = (totalH - lastLineH) + \"px\";\n    }\n    if (cm.state.scrollPastEndPadding != padding) {\n      cm.state.scrollPastEndPadding = padding;\n      cm.display.lineSpace.parentNode.style.paddingBottom = padding;\n      cm.off(\"refresh\", updateBottomMargin);\n      cm.setSize();\n      cm.on(\"refresh\", updateBottomMargin);\n    }\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/scroll/simplescrollbars.css",
    "content": ".CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div {\n  position: absolute;\n  background: #ccc;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  border: 1px solid #bbb;\n  border-radius: 2px;\n}\n\n.CodeMirror-simplescroll-horizontal, .CodeMirror-simplescroll-vertical {\n  position: absolute;\n  z-index: 6;\n  background: #eee;\n}\n\n.CodeMirror-simplescroll-horizontal {\n  bottom: 0; left: 0;\n  height: 8px;\n}\n.CodeMirror-simplescroll-horizontal div {\n  bottom: 0;\n  height: 100%;\n}\n\n.CodeMirror-simplescroll-vertical {\n  right: 0; top: 0;\n  width: 8px;\n}\n.CodeMirror-simplescroll-vertical div {\n  right: 0;\n  width: 100%;\n}\n\n\n.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler, .CodeMirror-overlayscroll .CodeMirror-gutter-filler {\n  display: none;\n}\n\n.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div {\n  position: absolute;\n  background: #bcd;\n  border-radius: 3px;\n}\n\n.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical {\n  position: absolute;\n  z-index: 6;\n}\n\n.CodeMirror-overlayscroll-horizontal {\n  bottom: 0; left: 0;\n  height: 6px;\n}\n.CodeMirror-overlayscroll-horizontal div {\n  bottom: 0;\n  height: 100%;\n}\n\n.CodeMirror-overlayscroll-vertical {\n  right: 0; top: 0;\n  width: 6px;\n}\n.CodeMirror-overlayscroll-vertical div {\n  right: 0;\n  width: 100%;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/scroll/simplescrollbars.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function Bar(cls, orientation, scroll) {\n    this.orientation = orientation;\n    this.scroll = scroll;\n    this.screen = this.total = this.size = 1;\n    this.pos = 0;\n\n    this.node = document.createElement(\"div\");\n    this.node.className = cls + \"-\" + orientation;\n    this.inner = this.node.appendChild(document.createElement(\"div\"));\n\n    var self = this;\n    CodeMirror.on(this.inner, \"mousedown\", function(e) {\n      if (e.which != 1) return;\n      CodeMirror.e_preventDefault(e);\n      var axis = self.orientation == \"horizontal\" ? \"pageX\" : \"pageY\";\n      var start = e[axis], startpos = self.pos;\n      function done() {\n        CodeMirror.off(document, \"mousemove\", move);\n        CodeMirror.off(document, \"mouseup\", done);\n      }\n      function move(e) {\n        if (e.which != 1) return done();\n        self.moveTo(startpos + (e[axis] - start) * (self.total / self.size));\n      }\n      CodeMirror.on(document, \"mousemove\", move);\n      CodeMirror.on(document, \"mouseup\", done);\n    });\n\n    CodeMirror.on(this.node, \"click\", function(e) {\n      CodeMirror.e_preventDefault(e);\n      var innerBox = self.inner.getBoundingClientRect(), where;\n      if (self.orientation == \"horizontal\")\n        where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0;\n      else\n        where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0;\n      self.moveTo(self.pos + where * self.screen);\n    });\n\n    function onWheel(e) {\n      var moved = CodeMirror.wheelEventPixels(e)[self.orientation == \"horizontal\" ? \"x\" : \"y\"];\n      var oldPos = self.pos;\n      self.moveTo(self.pos + moved);\n      if (self.pos != oldPos) CodeMirror.e_preventDefault(e);\n    }\n    CodeMirror.on(this.node, \"mousewheel\", onWheel);\n    CodeMirror.on(this.node, \"DOMMouseScroll\", onWheel);\n  }\n\n  Bar.prototype.setPos = function(pos, force) {\n    if (pos < 0) pos = 0;\n    if (pos > this.total - this.screen) pos = this.total - this.screen;\n    if (!force && pos == this.pos) return false;\n    this.pos = pos;\n    this.inner.style[this.orientation == \"horizontal\" ? \"left\" : \"top\"] =\n      (pos * (this.size / this.total)) + \"px\";\n    return true\n  };\n\n  Bar.prototype.moveTo = function(pos) {\n    if (this.setPos(pos)) this.scroll(pos, this.orientation);\n  }\n\n  var minButtonSize = 10;\n\n  Bar.prototype.update = function(scrollSize, clientSize, barSize) {\n    var sizeChanged = this.screen != clientSize || this.total != scrollSize || this.size != barSize\n    if (sizeChanged) {\n      this.screen = clientSize;\n      this.total = scrollSize;\n      this.size = barSize;\n    }\n\n    var buttonSize = this.screen * (this.size / this.total);\n    if (buttonSize < minButtonSize) {\n      this.size -= minButtonSize - buttonSize;\n      buttonSize = minButtonSize;\n    }\n    this.inner.style[this.orientation == \"horizontal\" ? \"width\" : \"height\"] =\n      buttonSize + \"px\";\n    this.setPos(this.pos, sizeChanged);\n  };\n\n  function SimpleScrollbars(cls, place, scroll) {\n    this.addClass = cls;\n    this.horiz = new Bar(cls, \"horizontal\", scroll);\n    place(this.horiz.node);\n    this.vert = new Bar(cls, \"vertical\", scroll);\n    place(this.vert.node);\n    this.width = null;\n  }\n\n  SimpleScrollbars.prototype.update = function(measure) {\n    if (this.width == null) {\n      var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle;\n      if (style) this.width = parseInt(style.height);\n    }\n    var width = this.width || 0;\n\n    var needsH = measure.scrollWidth > measure.clientWidth + 1;\n    var needsV = measure.scrollHeight > measure.clientHeight + 1;\n    this.vert.node.style.display = needsV ? \"block\" : \"none\";\n    this.horiz.node.style.display = needsH ? \"block\" : \"none\";\n\n    if (needsV) {\n      this.vert.update(measure.scrollHeight, measure.clientHeight,\n                       measure.viewHeight - (needsH ? width : 0));\n      this.vert.node.style.bottom = needsH ? width + \"px\" : \"0\";\n    }\n    if (needsH) {\n      this.horiz.update(measure.scrollWidth, measure.clientWidth,\n                        measure.viewWidth - (needsV ? width : 0) - measure.barLeft);\n      this.horiz.node.style.right = needsV ? width + \"px\" : \"0\";\n      this.horiz.node.style.left = measure.barLeft + \"px\";\n    }\n\n    return {right: needsV ? width : 0, bottom: needsH ? width : 0};\n  };\n\n  SimpleScrollbars.prototype.setScrollTop = function(pos) {\n    this.vert.setPos(pos);\n  };\n\n  SimpleScrollbars.prototype.setScrollLeft = function(pos) {\n    this.horiz.setPos(pos);\n  };\n\n  SimpleScrollbars.prototype.clear = function() {\n    var parent = this.horiz.node.parentNode;\n    parent.removeChild(this.horiz.node);\n    parent.removeChild(this.vert.node);\n  };\n\n  CodeMirror.scrollbarModel.simple = function(place, scroll) {\n    return new SimpleScrollbars(\"CodeMirror-simplescroll\", place, scroll);\n  };\n  CodeMirror.scrollbarModel.overlay = function(place, scroll) {\n    return new SimpleScrollbars(\"CodeMirror-overlayscroll\", place, scroll);\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/search/jump-to-line.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Defines jumpToLine command. Uses dialog.js if present.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../dialog/dialog\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../dialog/dialog\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  // default search panel location\n  CodeMirror.defineOption(\"search\", {bottom: false});\n\n  function dialog(cm, text, shortText, deflt, f) {\n    if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom});\n    else f(prompt(shortText, deflt));\n  }\n\n  function getJumpDialog(cm) {\n    return cm.phrase(\"Jump to line:\") + ' <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">' + cm.phrase(\"(Use line:column or scroll% syntax)\") + '</span>';\n  }\n\n  function interpretLine(cm, string) {\n    var num = Number(string)\n    if (/^[-+]/.test(string)) return cm.getCursor().line + num\n    else return num - 1\n  }\n\n  CodeMirror.commands.jumpToLine = function(cm) {\n    var cur = cm.getCursor();\n    dialog(cm, getJumpDialog(cm), cm.phrase(\"Jump to line:\"), (cur.line + 1) + \":\" + cur.ch, function(posStr) {\n      if (!posStr) return;\n\n      var match;\n      if (match = /^\\s*([\\+\\-]?\\d+)\\s*\\:\\s*(\\d+)\\s*$/.exec(posStr)) {\n        cm.setCursor(interpretLine(cm, match[1]), Number(match[2]))\n      } else if (match = /^\\s*([\\+\\-]?\\d+(\\.\\d+)?)\\%\\s*/.exec(posStr)) {\n        var line = Math.round(cm.lineCount() * Number(match[1]) / 100);\n        if (/^[-+]/.test(match[1])) line = cur.line + line + 1;\n        cm.setCursor(line - 1, cur.ch);\n      } else if (match = /^\\s*\\:?\\s*([\\+\\-]?\\d+)\\s*/.exec(posStr)) {\n        cm.setCursor(interpretLine(cm, match[1]), cur.ch);\n      }\n    });\n  };\n\n  CodeMirror.keyMap[\"default\"][\"Alt-G\"] = \"jumpToLine\";\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/search/match-highlighter.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Highlighting text that matches the selection\n//\n// Defines an option highlightSelectionMatches, which, when enabled,\n// will style strings that match the selection throughout the\n// document.\n//\n// The option can be set to true to simply enable it, or to a\n// {minChars, style, wordsOnly, showToken, delay} object to explicitly\n// configure it. minChars is the minimum amount of characters that should be\n// selected for the behavior to occur, and style is the token style to\n// apply to the matches. This will be prefixed by \"cm-\" to create an\n// actual CSS class name. If wordsOnly is enabled, the matches will be\n// highlighted only if the selected text is a word. showToken, when enabled,\n// will cause the current token to be highlighted when nothing is selected.\n// delay is used to specify how much time to wait, in milliseconds, before\n// highlighting the matches. If annotateScrollbar is enabled, the occurrences\n// will be highlighted on the scrollbar via the matchesonscrollbar addon.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./matchesonscrollbar\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./matchesonscrollbar\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var defaults = {\n    style: \"matchhighlight\",\n    minChars: 2,\n    delay: 100,\n    wordsOnly: false,\n    annotateScrollbar: false,\n    showToken: false,\n    trim: true\n  }\n\n  function State(options) {\n    this.options = {}\n    for (var name in defaults)\n      this.options[name] = (options && options.hasOwnProperty(name) ? options : defaults)[name]\n    this.overlay = this.timeout = null;\n    this.matchesonscroll = null;\n    this.active = false;\n  }\n\n  CodeMirror.defineOption(\"highlightSelectionMatches\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      removeOverlay(cm);\n      clearTimeout(cm.state.matchHighlighter.timeout);\n      cm.state.matchHighlighter = null;\n      cm.off(\"cursorActivity\", cursorActivity);\n      cm.off(\"focus\", onFocus)\n    }\n    if (val) {\n      var state = cm.state.matchHighlighter = new State(val);\n      if (cm.hasFocus()) {\n        state.active = true\n        highlightMatches(cm)\n      } else {\n        cm.on(\"focus\", onFocus)\n      }\n      cm.on(\"cursorActivity\", cursorActivity);\n    }\n  });\n\n  function cursorActivity(cm) {\n    var state = cm.state.matchHighlighter;\n    if (state.active || cm.hasFocus()) scheduleHighlight(cm, state)\n  }\n\n  function onFocus(cm) {\n    var state = cm.state.matchHighlighter\n    if (!state.active) {\n      state.active = true\n      scheduleHighlight(cm, state)\n    }\n  }\n\n  function scheduleHighlight(cm, state) {\n    clearTimeout(state.timeout);\n    state.timeout = setTimeout(function() {highlightMatches(cm);}, state.options.delay);\n  }\n\n  function addOverlay(cm, query, hasBoundary, style) {\n    var state = cm.state.matchHighlighter;\n    cm.addOverlay(state.overlay = makeOverlay(query, hasBoundary, style));\n    if (state.options.annotateScrollbar && cm.showMatchesOnScrollbar) {\n      var searchFor = hasBoundary ? new RegExp((/\\w/.test(query.charAt(0)) ? \"\\\\b\" : \"\") +\n                                               query.replace(/[\\\\\\[.+*?(){|^$]/g, \"\\\\$&\") +\n                                               (/\\w/.test(query.charAt(query.length - 1)) ? \"\\\\b\" : \"\")) : query;\n      state.matchesonscroll = cm.showMatchesOnScrollbar(searchFor, false,\n        {className: \"CodeMirror-selection-highlight-scrollbar\"});\n    }\n  }\n\n  function removeOverlay(cm) {\n    var state = cm.state.matchHighlighter;\n    if (state.overlay) {\n      cm.removeOverlay(state.overlay);\n      state.overlay = null;\n      if (state.matchesonscroll) {\n        state.matchesonscroll.clear();\n        state.matchesonscroll = null;\n      }\n    }\n  }\n\n  function highlightMatches(cm) {\n    cm.operation(function() {\n      var state = cm.state.matchHighlighter;\n      removeOverlay(cm);\n      if (!cm.somethingSelected() && state.options.showToken) {\n        var re = state.options.showToken === true ? /[\\w$]/ : state.options.showToken;\n        var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start;\n        while (start && re.test(line.charAt(start - 1))) --start;\n        while (end < line.length && re.test(line.charAt(end))) ++end;\n        if (start < end)\n          addOverlay(cm, line.slice(start, end), re, state.options.style);\n        return;\n      }\n      var from = cm.getCursor(\"from\"), to = cm.getCursor(\"to\");\n      if (from.line != to.line) return;\n      if (state.options.wordsOnly && !isWord(cm, from, to)) return;\n      var selection = cm.getRange(from, to)\n      if (state.options.trim) selection = selection.replace(/^\\s+|\\s+$/g, \"\")\n      if (selection.length >= state.options.minChars)\n        addOverlay(cm, selection, false, state.options.style);\n    });\n  }\n\n  function isWord(cm, from, to) {\n    var str = cm.getRange(from, to);\n    if (str.match(/^\\w+$/) !== null) {\n        if (from.ch > 0) {\n            var pos = {line: from.line, ch: from.ch - 1};\n            var chr = cm.getRange(pos, from);\n            if (chr.match(/\\W/) === null) return false;\n        }\n        if (to.ch < cm.getLine(from.line).length) {\n            var pos = {line: to.line, ch: to.ch + 1};\n            var chr = cm.getRange(to, pos);\n            if (chr.match(/\\W/) === null) return false;\n        }\n        return true;\n    } else return false;\n  }\n\n  function boundariesAround(stream, re) {\n    return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) &&\n      (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos)));\n  }\n\n  function makeOverlay(query, hasBoundary, style) {\n    return {token: function(stream) {\n      if (stream.match(query) &&\n          (!hasBoundary || boundariesAround(stream, hasBoundary)))\n        return style;\n      stream.next();\n      stream.skipTo(query.charAt(0)) || stream.skipToEnd();\n    }};\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/search/matchesonscrollbar.css",
    "content": ".CodeMirror-search-match {\n  background: gold;\n  border-top: 1px solid orange;\n  border-bottom: 1px solid orange;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  opacity: .5;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/search/matchesonscrollbar.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./searchcursor\"), require(\"../scroll/annotatescrollbar\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./searchcursor\", \"../scroll/annotatescrollbar\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineExtension(\"showMatchesOnScrollbar\", function(query, caseFold, options) {\n    if (typeof options == \"string\") options = {className: options};\n    if (!options) options = {};\n    return new SearchAnnotation(this, query, caseFold, options);\n  });\n\n  function SearchAnnotation(cm, query, caseFold, options) {\n    this.cm = cm;\n    this.options = options;\n    var annotateOptions = {listenForChanges: false};\n    for (var prop in options) annotateOptions[prop] = options[prop];\n    if (!annotateOptions.className) annotateOptions.className = \"CodeMirror-search-match\";\n    this.annotation = cm.annotateScrollbar(annotateOptions);\n    this.query = query;\n    this.caseFold = caseFold;\n    this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1};\n    this.matches = [];\n    this.update = null;\n\n    this.findMatches();\n    this.annotation.update(this.matches);\n\n    var self = this;\n    cm.on(\"change\", this.changeHandler = function(_cm, change) { self.onChange(change); });\n  }\n\n  var MAX_MATCHES = 1000;\n\n  SearchAnnotation.prototype.findMatches = function() {\n    if (!this.gap) return;\n    for (var i = 0; i < this.matches.length; i++) {\n      var match = this.matches[i];\n      if (match.from.line >= this.gap.to) break;\n      if (match.to.line >= this.gap.from) this.matches.splice(i--, 1);\n    }\n    var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), {caseFold: this.caseFold, multiline: this.options.multiline});\n    var maxMatches = this.options && this.options.maxMatches || MAX_MATCHES;\n    while (cursor.findNext()) {\n      var match = {from: cursor.from(), to: cursor.to()};\n      if (match.from.line >= this.gap.to) break;\n      this.matches.splice(i++, 0, match);\n      if (this.matches.length > maxMatches) break;\n    }\n    this.gap = null;\n  };\n\n  function offsetLine(line, changeStart, sizeChange) {\n    if (line <= changeStart) return line;\n    return Math.max(changeStart, line + sizeChange);\n  }\n\n  SearchAnnotation.prototype.onChange = function(change) {\n    var startLine = change.from.line;\n    var endLine = CodeMirror.changeEnd(change).line;\n    var sizeChange = endLine - change.to.line;\n    if (this.gap) {\n      this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line);\n      this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line);\n    } else {\n      this.gap = {from: change.from.line, to: endLine + 1};\n    }\n\n    if (sizeChange) for (var i = 0; i < this.matches.length; i++) {\n      var match = this.matches[i];\n      var newFrom = offsetLine(match.from.line, startLine, sizeChange);\n      if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch);\n      var newTo = offsetLine(match.to.line, startLine, sizeChange);\n      if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch);\n    }\n    clearTimeout(this.update);\n    var self = this;\n    this.update = setTimeout(function() { self.updateAfterChange(); }, 250);\n  };\n\n  SearchAnnotation.prototype.updateAfterChange = function() {\n    this.findMatches();\n    this.annotation.update(this.matches);\n  };\n\n  SearchAnnotation.prototype.clear = function() {\n    this.cm.off(\"change\", this.changeHandler);\n    this.annotation.clear();\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/search/search.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Define search commands. Depends on dialog.js or another\n// implementation of the openDialog method.\n\n// Replace works a little oddly -- it will do the replace on the next\n// Ctrl-G (or whatever is bound to findNext) press. You prevent a\n// replace by making sure the match is no longer selected when hitting\n// Ctrl-G.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./searchcursor\"), require(\"../dialog/dialog\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./searchcursor\", \"../dialog/dialog\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  // default search panel location\n  CodeMirror.defineOption(\"search\", {bottom: false});\n\n  function searchOverlay(query, caseInsensitive) {\n    if (typeof query == \"string\")\n      query = new RegExp(query.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\"), caseInsensitive ? \"gi\" : \"g\");\n    else if (!query.global)\n      query = new RegExp(query.source, query.ignoreCase ? \"gi\" : \"g\");\n\n    return {token: function(stream) {\n      query.lastIndex = stream.pos;\n      var match = query.exec(stream.string);\n      if (match && match.index == stream.pos) {\n        stream.pos += match[0].length || 1;\n        return \"searching\";\n      } else if (match) {\n        stream.pos = match.index;\n      } else {\n        stream.skipToEnd();\n      }\n    }};\n  }\n\n  function SearchState() {\n    this.posFrom = this.posTo = this.lastQuery = this.query = null;\n    this.overlay = null;\n  }\n\n  function getSearchState(cm) {\n    return cm.state.search || (cm.state.search = new SearchState());\n  }\n\n  function queryCaseInsensitive(query) {\n    return typeof query == \"string\" && query == query.toLowerCase();\n  }\n\n  function getSearchCursor(cm, query, pos) {\n    // Heuristic: if the query string is all lowercase, do a case insensitive search.\n    return cm.getSearchCursor(query, pos, {caseFold: queryCaseInsensitive(query), multiline: true});\n  }\n\n  function persistentDialog(cm, text, deflt, onEnter, onKeyDown) {\n    cm.openDialog(text, onEnter, {\n      value: deflt,\n      selectValueOnOpen: true,\n      closeOnEnter: false,\n      onClose: function() { clearSearch(cm); },\n      onKeyDown: onKeyDown,\n      bottom: cm.options.search.bottom\n    });\n  }\n\n  function dialog(cm, text, shortText, deflt, f) {\n    if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom});\n    else f(prompt(shortText, deflt));\n  }\n\n  function confirmDialog(cm, text, shortText, fs) {\n    if (cm.openConfirm) cm.openConfirm(text, fs);\n    else if (confirm(shortText)) fs[0]();\n  }\n\n  function parseString(string) {\n    return string.replace(/\\\\([nrt\\\\])/g, function(match, ch) {\n      if (ch == \"n\") return \"\\n\"\n      if (ch == \"r\") return \"\\r\"\n      if (ch == \"t\") return \"\\t\"\n      if (ch == \"\\\\\") return \"\\\\\"\n      return match\n    })\n  }\n\n  function parseQuery(query) {\n    var isRE = query.match(/^\\/(.*)\\/([a-z]*)$/);\n    if (isRE) {\n      try { query = new RegExp(isRE[1], isRE[2].indexOf(\"i\") == -1 ? \"\" : \"i\"); }\n      catch(e) {} // Not a regular expression after all, do a string search\n    } else {\n      query = parseString(query)\n    }\n    if (typeof query == \"string\" ? query == \"\" : query.test(\"\"))\n      query = /x^/;\n    return query;\n  }\n\n  function startSearch(cm, state, query) {\n    state.queryText = query;\n    state.query = parseQuery(query);\n    cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query));\n    state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query));\n    cm.addOverlay(state.overlay);\n    if (cm.showMatchesOnScrollbar) {\n      if (state.annotate) { state.annotate.clear(); state.annotate = null; }\n      state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query));\n    }\n  }\n\n  function doSearch(cm, rev, persistent, immediate) {\n    var state = getSearchState(cm);\n    if (state.query) return findNext(cm, rev);\n    var q = cm.getSelection() || state.lastQuery;\n    if (q instanceof RegExp && q.source == \"x^\") q = null\n    if (persistent && cm.openDialog) {\n      var hiding = null\n      var searchNext = function(query, event) {\n        CodeMirror.e_stop(event);\n        if (!query) return;\n        if (query != state.queryText) {\n          startSearch(cm, state, query);\n          state.posFrom = state.posTo = cm.getCursor();\n        }\n        if (hiding) hiding.style.opacity = 1\n        findNext(cm, event.shiftKey, function(_, to) {\n          var dialog\n          if (to.line < 3 && document.querySelector &&\n              (dialog = cm.display.wrapper.querySelector(\".CodeMirror-dialog\")) &&\n              dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, \"window\").top)\n            (hiding = dialog).style.opacity = .4\n        })\n      };\n      persistentDialog(cm, getQueryDialog(cm), q, searchNext, function(event, query) {\n        var keyName = CodeMirror.keyName(event)\n        var extra = cm.getOption('extraKeys'), cmd = (extra && extra[keyName]) || CodeMirror.keyMap[cm.getOption(\"keyMap\")][keyName]\n        if (cmd == \"findNext\" || cmd == \"findPrev\" ||\n          cmd == \"findPersistentNext\" || cmd == \"findPersistentPrev\") {\n          CodeMirror.e_stop(event);\n          startSearch(cm, getSearchState(cm), query);\n          cm.execCommand(cmd);\n        } else if (cmd == \"find\" || cmd == \"findPersistent\") {\n          CodeMirror.e_stop(event);\n          searchNext(query, event);\n        }\n      });\n      if (immediate && q) {\n        startSearch(cm, state, q);\n        findNext(cm, rev);\n      }\n    } else {\n      dialog(cm, getQueryDialog(cm), \"Search for:\", q, function(query) {\n        if (query && !state.query) cm.operation(function() {\n          startSearch(cm, state, query);\n          state.posFrom = state.posTo = cm.getCursor();\n          findNext(cm, rev);\n        });\n      });\n    }\n  }\n\n  function findNext(cm, rev, callback) {cm.operation(function() {\n    var state = getSearchState(cm);\n    var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo);\n    if (!cursor.find(rev)) {\n      cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0));\n      if (!cursor.find(rev)) return;\n    }\n    cm.setSelection(cursor.from(), cursor.to());\n    cm.scrollIntoView({from: cursor.from(), to: cursor.to()}, 20);\n    state.posFrom = cursor.from(); state.posTo = cursor.to();\n    if (callback) callback(cursor.from(), cursor.to())\n  });}\n\n  function clearSearch(cm) {cm.operation(function() {\n    var state = getSearchState(cm);\n    state.lastQuery = state.query;\n    if (!state.query) return;\n    state.query = state.queryText = null;\n    cm.removeOverlay(state.overlay);\n    if (state.annotate) { state.annotate.clear(); state.annotate = null; }\n  });}\n\n  function el(tag, attrs) {\n    var element = tag ? document.createElement(tag) : document.createDocumentFragment();\n    for (var key in attrs) {\n      element[key] = attrs[key];\n    }\n    for (var i = 2; i < arguments.length; i++) {\n      var child = arguments[i]\n      element.appendChild(typeof child == \"string\" ? document.createTextNode(child) : child);\n    }\n    return element;\n  }\n\n  function getQueryDialog(cm)  {\n    return el(\"\", null,\n              el(\"span\", {className: \"CodeMirror-search-label\"}, cm.phrase(\"Search:\")), \" \",\n              el(\"input\", {type: \"text\", \"style\": \"width: 10em\", className: \"CodeMirror-search-field\"}), \" \",\n              el(\"span\", {style: \"color: #888\", className: \"CodeMirror-search-hint\"},\n                 cm.phrase(\"(Use /re/ syntax for regexp search)\")));\n  }\n  function getReplaceQueryDialog(cm) {\n    return el(\"\", null, \" \",\n              el(\"input\", {type: \"text\", \"style\": \"width: 10em\", className: \"CodeMirror-search-field\"}), \" \",\n              el(\"span\", {style: \"color: #888\", className: \"CodeMirror-search-hint\"},\n                 cm.phrase(\"(Use /re/ syntax for regexp search)\")));\n  }\n  function getReplacementQueryDialog(cm) {\n    return el(\"\", null,\n              el(\"span\", {className: \"CodeMirror-search-label\"}, cm.phrase(\"With:\")), \" \",\n              el(\"input\", {type: \"text\", \"style\": \"width: 10em\", className: \"CodeMirror-search-field\"}));\n  }\n  function getDoReplaceConfirm(cm) {\n    return el(\"\", null,\n              el(\"span\", {className: \"CodeMirror-search-label\"}, cm.phrase(\"Replace?\")), \" \",\n              el(\"button\", {}, cm.phrase(\"Yes\")), \" \",\n              el(\"button\", {}, cm.phrase(\"No\")), \" \",\n              el(\"button\", {}, cm.phrase(\"All\")), \" \",\n              el(\"button\", {}, cm.phrase(\"Stop\")));\n  }\n\n  function replaceAll(cm, query, text) {\n    cm.operation(function() {\n      for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {\n        if (typeof query != \"string\") {\n          var match = cm.getRange(cursor.from(), cursor.to()).match(query);\n          cursor.replace(text.replace(/\\$(\\d)/g, function(_, i) {return match[i];}));\n        } else cursor.replace(text);\n      }\n    });\n  }\n\n  function replace(cm, all) {\n    if (cm.getOption(\"readOnly\")) return;\n    var query = cm.getSelection() || getSearchState(cm).lastQuery;\n    var dialogText = all ? cm.phrase(\"Replace all:\") : cm.phrase(\"Replace:\")\n    var fragment = el(\"\", null,\n                      el(\"span\", {className: \"CodeMirror-search-label\"}, dialogText),\n                      getReplaceQueryDialog(cm))\n    dialog(cm, fragment, dialogText, query, function(query) {\n      if (!query) return;\n      query = parseQuery(query);\n      dialog(cm, getReplacementQueryDialog(cm), cm.phrase(\"Replace with:\"), \"\", function(text) {\n        text = parseString(text)\n        if (all) {\n          replaceAll(cm, query, text)\n        } else {\n          clearSearch(cm);\n          var cursor = getSearchCursor(cm, query, cm.getCursor(\"from\"));\n          var advance = function() {\n            var start = cursor.from(), match;\n            if (!(match = cursor.findNext())) {\n              cursor = getSearchCursor(cm, query);\n              if (!(match = cursor.findNext()) ||\n                  (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return;\n            }\n            cm.setSelection(cursor.from(), cursor.to());\n            cm.scrollIntoView({from: cursor.from(), to: cursor.to()});\n            confirmDialog(cm, getDoReplaceConfirm(cm), cm.phrase(\"Replace?\"),\n                          [function() {doReplace(match);}, advance,\n                           function() {replaceAll(cm, query, text)}]);\n          };\n          var doReplace = function(match) {\n            cursor.replace(typeof query == \"string\" ? text :\n                           text.replace(/\\$(\\d)/g, function(_, i) {return match[i];}));\n            advance();\n          };\n          advance();\n        }\n      });\n    });\n  }\n\n  CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);};\n  CodeMirror.commands.findPersistent = function(cm) {clearSearch(cm); doSearch(cm, false, true);};\n  CodeMirror.commands.findPersistentNext = function(cm) {doSearch(cm, false, true, true);};\n  CodeMirror.commands.findPersistentPrev = function(cm) {doSearch(cm, true, true, true);};\n  CodeMirror.commands.findNext = doSearch;\n  CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);};\n  CodeMirror.commands.clearSearch = clearSearch;\n  CodeMirror.commands.replace = replace;\n  CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);};\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/search/searchcursor.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n  var Pos = CodeMirror.Pos\n\n  function regexpFlags(regexp) {\n    var flags = regexp.flags\n    return flags != null ? flags : (regexp.ignoreCase ? \"i\" : \"\")\n      + (regexp.global ? \"g\" : \"\")\n      + (regexp.multiline ? \"m\" : \"\")\n  }\n\n  function ensureFlags(regexp, flags) {\n    var current = regexpFlags(regexp), target = current\n    for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1)\n      target += flags.charAt(i)\n    return current == target ? regexp : new RegExp(regexp.source, target)\n  }\n\n  function maybeMultiline(regexp) {\n    return /\\\\s|\\\\n|\\n|\\\\W|\\\\D|\\[\\^/.test(regexp.source)\n  }\n\n  function searchRegexpForward(doc, regexp, start) {\n    regexp = ensureFlags(regexp, \"g\")\n    for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) {\n      regexp.lastIndex = ch\n      var string = doc.getLine(line), match = regexp.exec(string)\n      if (match)\n        return {from: Pos(line, match.index),\n                to: Pos(line, match.index + match[0].length),\n                match: match}\n    }\n  }\n\n  function searchRegexpForwardMultiline(doc, regexp, start) {\n    if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start)\n\n    regexp = ensureFlags(regexp, \"gm\")\n    var string, chunk = 1\n    for (var line = start.line, last = doc.lastLine(); line <= last;) {\n      // This grows the search buffer in exponentially-sized chunks\n      // between matches, so that nearby matches are fast and don't\n      // require concatenating the whole document (in case we're\n      // searching for something that has tons of matches), but at the\n      // same time, the amount of retries is limited.\n      for (var i = 0; i < chunk; i++) {\n        if (line > last) break\n        var curLine = doc.getLine(line++)\n        string = string == null ? curLine : string + \"\\n\" + curLine\n      }\n      chunk = chunk * 2\n      regexp.lastIndex = start.ch\n      var match = regexp.exec(string)\n      if (match) {\n        var before = string.slice(0, match.index).split(\"\\n\"), inside = match[0].split(\"\\n\")\n        var startLine = start.line + before.length - 1, startCh = before[before.length - 1].length\n        return {from: Pos(startLine, startCh),\n                to: Pos(startLine + inside.length - 1,\n                        inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),\n                match: match}\n      }\n    }\n  }\n\n  function lastMatchIn(string, regexp, endMargin) {\n    var match, from = 0\n    while (from <= string.length) {\n      regexp.lastIndex = from\n      var newMatch = regexp.exec(string)\n      if (!newMatch) break\n      var end = newMatch.index + newMatch[0].length\n      if (end > string.length - endMargin) break\n      if (!match || end > match.index + match[0].length)\n        match = newMatch\n      from = newMatch.index + 1\n    }\n    return match\n  }\n\n  function searchRegexpBackward(doc, regexp, start) {\n    regexp = ensureFlags(regexp, \"g\")\n    for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) {\n      var string = doc.getLine(line)\n      var match = lastMatchIn(string, regexp, ch < 0 ? 0 : string.length - ch)\n      if (match)\n        return {from: Pos(line, match.index),\n                to: Pos(line, match.index + match[0].length),\n                match: match}\n    }\n  }\n\n  function searchRegexpBackwardMultiline(doc, regexp, start) {\n    if (!maybeMultiline(regexp)) return searchRegexpBackward(doc, regexp, start)\n    regexp = ensureFlags(regexp, \"gm\")\n    var string, chunkSize = 1, endMargin = doc.getLine(start.line).length - start.ch\n    for (var line = start.line, first = doc.firstLine(); line >= first;) {\n      for (var i = 0; i < chunkSize && line >= first; i++) {\n        var curLine = doc.getLine(line--)\n        string = string == null ? curLine : curLine + \"\\n\" + string\n      }\n      chunkSize *= 2\n\n      var match = lastMatchIn(string, regexp, endMargin)\n      if (match) {\n        var before = string.slice(0, match.index).split(\"\\n\"), inside = match[0].split(\"\\n\")\n        var startLine = line + before.length, startCh = before[before.length - 1].length\n        return {from: Pos(startLine, startCh),\n                to: Pos(startLine + inside.length - 1,\n                        inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),\n                match: match}\n      }\n    }\n  }\n\n  var doFold, noFold\n  if (String.prototype.normalize) {\n    doFold = function(str) { return str.normalize(\"NFD\").toLowerCase() }\n    noFold = function(str) { return str.normalize(\"NFD\") }\n  } else {\n    doFold = function(str) { return str.toLowerCase() }\n    noFold = function(str) { return str }\n  }\n\n  // Maps a position in a case-folded line back to a position in the original line\n  // (compensating for codepoints increasing in number during folding)\n  function adjustPos(orig, folded, pos, foldFunc) {\n    if (orig.length == folded.length) return pos\n    for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) {\n      if (min == max) return min\n      var mid = (min + max) >> 1\n      var len = foldFunc(orig.slice(0, mid)).length\n      if (len == pos) return mid\n      else if (len > pos) max = mid\n      else min = mid + 1\n    }\n  }\n\n  function searchStringForward(doc, query, start, caseFold) {\n    // Empty string would match anything and never progress, so we\n    // define it to match nothing instead.\n    if (!query.length) return null\n    var fold = caseFold ? doFold : noFold\n    var lines = fold(query).split(/\\r|\\n\\r?/)\n\n    search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) {\n      var orig = doc.getLine(line).slice(ch), string = fold(orig)\n      if (lines.length == 1) {\n        var found = string.indexOf(lines[0])\n        if (found == -1) continue search\n        var start = adjustPos(orig, string, found, fold) + ch\n        return {from: Pos(line, adjustPos(orig, string, found, fold) + ch),\n                to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch)}\n      } else {\n        var cutFrom = string.length - lines[0].length\n        if (string.slice(cutFrom) != lines[0]) continue search\n        for (var i = 1; i < lines.length - 1; i++)\n          if (fold(doc.getLine(line + i)) != lines[i]) continue search\n        var end = doc.getLine(line + lines.length - 1), endString = fold(end), lastLine = lines[lines.length - 1]\n        if (endString.slice(0, lastLine.length) != lastLine) continue search\n        return {from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch),\n                to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold))}\n      }\n    }\n  }\n\n  function searchStringBackward(doc, query, start, caseFold) {\n    if (!query.length) return null\n    var fold = caseFold ? doFold : noFold\n    var lines = fold(query).split(/\\r|\\n\\r?/)\n\n    search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) {\n      var orig = doc.getLine(line)\n      if (ch > -1) orig = orig.slice(0, ch)\n      var string = fold(orig)\n      if (lines.length == 1) {\n        var found = string.lastIndexOf(lines[0])\n        if (found == -1) continue search\n        return {from: Pos(line, adjustPos(orig, string, found, fold)),\n                to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold))}\n      } else {\n        var lastLine = lines[lines.length - 1]\n        if (string.slice(0, lastLine.length) != lastLine) continue search\n        for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++)\n          if (fold(doc.getLine(start + i)) != lines[i]) continue search\n        var top = doc.getLine(line + 1 - lines.length), topString = fold(top)\n        if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search\n        return {from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)),\n                to: Pos(line, adjustPos(orig, string, lastLine.length, fold))}\n      }\n    }\n  }\n\n  function SearchCursor(doc, query, pos, options) {\n    this.atOccurrence = false\n    this.afterEmptyMatch = false\n    this.doc = doc\n    pos = pos ? doc.clipPos(pos) : Pos(0, 0)\n    this.pos = {from: pos, to: pos}\n\n    var caseFold\n    if (typeof options == \"object\") {\n      caseFold = options.caseFold\n    } else { // Backwards compat for when caseFold was the 4th argument\n      caseFold = options\n      options = null\n    }\n\n    if (typeof query == \"string\") {\n      if (caseFold == null) caseFold = false\n      this.matches = function(reverse, pos) {\n        return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos, caseFold)\n      }\n    } else {\n      query = ensureFlags(query, \"gm\")\n      if (!options || options.multiline !== false)\n        this.matches = function(reverse, pos) {\n          return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos)\n        }\n      else\n        this.matches = function(reverse, pos) {\n          return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos)\n        }\n    }\n  }\n\n  SearchCursor.prototype = {\n    findNext: function() {return this.find(false)},\n    findPrevious: function() {return this.find(true)},\n\n    find: function(reverse) {\n      var head = this.doc.clipPos(reverse ? this.pos.from : this.pos.to);\n      if (this.afterEmptyMatch && this.atOccurrence) {\n        // do not return the same 0 width match twice\n        head = Pos(head.line, head.ch)\n        if (reverse) {\n          head.ch--;\n          if (head.ch < 0) {\n            head.line--;\n            head.ch = (this.doc.getLine(head.line) || \"\").length;\n          }\n        } else {\n          head.ch++;\n          if (head.ch > (this.doc.getLine(head.line) || \"\").length) {\n            head.ch = 0;\n            head.line++;\n          }\n        }\n        if (CodeMirror.cmpPos(head, this.doc.clipPos(head)) != 0) {\n           return this.atOccurrence = false\n        }\n      }\n      var result = this.matches(reverse, head)\n      this.afterEmptyMatch = result && CodeMirror.cmpPos(result.from, result.to) == 0\n\n      if (result) {\n        this.pos = result\n        this.atOccurrence = true\n        return this.pos.match || true\n      } else {\n        var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0)\n        this.pos = {from: end, to: end}\n        return this.atOccurrence = false\n      }\n    },\n\n    from: function() {if (this.atOccurrence) return this.pos.from},\n    to: function() {if (this.atOccurrence) return this.pos.to},\n\n    replace: function(newText, origin) {\n      if (!this.atOccurrence) return\n      var lines = CodeMirror.splitLines(newText)\n      this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin)\n      this.pos.to = Pos(this.pos.from.line + lines.length - 1,\n                        lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0))\n    }\n  }\n\n  CodeMirror.defineExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n    return new SearchCursor(this.doc, query, pos, caseFold)\n  })\n  CodeMirror.defineDocExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n    return new SearchCursor(this, query, pos, caseFold)\n  })\n\n  CodeMirror.defineExtension(\"selectMatches\", function(query, caseFold) {\n    var ranges = []\n    var cur = this.getSearchCursor(query, this.getCursor(\"from\"), caseFold)\n    while (cur.findNext()) {\n      if (CodeMirror.cmpPos(cur.to(), this.getCursor(\"to\")) > 0) break\n      ranges.push({anchor: cur.from(), head: cur.to()})\n    }\n    if (ranges.length)\n      this.setSelections(ranges, 0)\n  })\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/selection/active-line.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  var WRAP_CLASS = \"CodeMirror-activeline\";\n  var BACK_CLASS = \"CodeMirror-activeline-background\";\n  var GUTT_CLASS = \"CodeMirror-activeline-gutter\";\n\n  CodeMirror.defineOption(\"styleActiveLine\", false, function(cm, val, old) {\n    var prev = old == CodeMirror.Init ? false : old;\n    if (val == prev) return\n    if (prev) {\n      cm.off(\"beforeSelectionChange\", selectionChange);\n      clearActiveLines(cm);\n      delete cm.state.activeLines;\n    }\n    if (val) {\n      cm.state.activeLines = [];\n      updateActiveLines(cm, cm.listSelections());\n      cm.on(\"beforeSelectionChange\", selectionChange);\n    }\n  });\n\n  function clearActiveLines(cm) {\n    for (var i = 0; i < cm.state.activeLines.length; i++) {\n      cm.removeLineClass(cm.state.activeLines[i], \"wrap\", WRAP_CLASS);\n      cm.removeLineClass(cm.state.activeLines[i], \"background\", BACK_CLASS);\n      cm.removeLineClass(cm.state.activeLines[i], \"gutter\", GUTT_CLASS);\n    }\n  }\n\n  function sameArray(a, b) {\n    if (a.length != b.length) return false;\n    for (var i = 0; i < a.length; i++)\n      if (a[i] != b[i]) return false;\n    return true;\n  }\n\n  function updateActiveLines(cm, ranges) {\n    var active = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i];\n      var option = cm.getOption(\"styleActiveLine\");\n      if (typeof option == \"object\" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty())\n        continue\n      var line = cm.getLineHandleVisualStart(range.head.line);\n      if (active[active.length - 1] != line) active.push(line);\n    }\n    if (sameArray(cm.state.activeLines, active)) return;\n    cm.operation(function() {\n      clearActiveLines(cm);\n      for (var i = 0; i < active.length; i++) {\n        cm.addLineClass(active[i], \"wrap\", WRAP_CLASS);\n        cm.addLineClass(active[i], \"background\", BACK_CLASS);\n        cm.addLineClass(active[i], \"gutter\", GUTT_CLASS);\n      }\n      cm.state.activeLines = active;\n    });\n  }\n\n  function selectionChange(cm, sel) {\n    updateActiveLines(cm, sel.ranges);\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/selection/mark-selection.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Because sometimes you need to mark the selected *text*.\n//\n// Adds an option 'styleSelectedText' which, when enabled, gives\n// selected text the CSS class given as option value, or\n// \"CodeMirror-selectedtext\" when the value is not a string.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"styleSelectedText\", false, function(cm, val, old) {\n    var prev = old && old != CodeMirror.Init;\n    if (val && !prev) {\n      cm.state.markedSelection = [];\n      cm.state.markedSelectionStyle = typeof val == \"string\" ? val : \"CodeMirror-selectedtext\";\n      reset(cm);\n      cm.on(\"cursorActivity\", onCursorActivity);\n      cm.on(\"change\", onChange);\n    } else if (!val && prev) {\n      cm.off(\"cursorActivity\", onCursorActivity);\n      cm.off(\"change\", onChange);\n      clear(cm);\n      cm.state.markedSelection = cm.state.markedSelectionStyle = null;\n    }\n  });\n\n  function onCursorActivity(cm) {\n    if (cm.state.markedSelection)\n      cm.operation(function() { update(cm); });\n  }\n\n  function onChange(cm) {\n    if (cm.state.markedSelection && cm.state.markedSelection.length)\n      cm.operation(function() { clear(cm); });\n  }\n\n  var CHUNK_SIZE = 8;\n  var Pos = CodeMirror.Pos;\n  var cmp = CodeMirror.cmpPos;\n\n  function coverRange(cm, from, to, addAt) {\n    if (cmp(from, to) == 0) return;\n    var array = cm.state.markedSelection;\n    var cls = cm.state.markedSelectionStyle;\n    for (var line = from.line;;) {\n      var start = line == from.line ? from : Pos(line, 0);\n      var endLine = line + CHUNK_SIZE, atEnd = endLine >= to.line;\n      var end = atEnd ? to : Pos(endLine, 0);\n      var mark = cm.markText(start, end, {className: cls});\n      if (addAt == null) array.push(mark);\n      else array.splice(addAt++, 0, mark);\n      if (atEnd) break;\n      line = endLine;\n    }\n  }\n\n  function clear(cm) {\n    var array = cm.state.markedSelection;\n    for (var i = 0; i < array.length; ++i) array[i].clear();\n    array.length = 0;\n  }\n\n  function reset(cm) {\n    clear(cm);\n    var ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++)\n      coverRange(cm, ranges[i].from(), ranges[i].to());\n  }\n\n  function update(cm) {\n    if (!cm.somethingSelected()) return clear(cm);\n    if (cm.listSelections().length > 1) return reset(cm);\n\n    var from = cm.getCursor(\"start\"), to = cm.getCursor(\"end\");\n\n    var array = cm.state.markedSelection;\n    if (!array.length) return coverRange(cm, from, to);\n\n    var coverStart = array[0].find(), coverEnd = array[array.length - 1].find();\n    if (!coverStart || !coverEnd || to.line - from.line <= CHUNK_SIZE ||\n        cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0)\n      return reset(cm);\n\n    while (cmp(from, coverStart.from) > 0) {\n      array.shift().clear();\n      coverStart = array[0].find();\n    }\n    if (cmp(from, coverStart.from) < 0) {\n      if (coverStart.to.line - from.line < CHUNK_SIZE) {\n        array.shift().clear();\n        coverRange(cm, from, coverStart.to, 0);\n      } else {\n        coverRange(cm, from, coverStart.from, 0);\n      }\n    }\n\n    while (cmp(to, coverEnd.to) < 0) {\n      array.pop().clear();\n      coverEnd = array[array.length - 1].find();\n    }\n    if (cmp(to, coverEnd.to) > 0) {\n      if (to.line - coverEnd.from.line < CHUNK_SIZE) {\n        array.pop().clear();\n        coverRange(cm, coverEnd.from, to);\n      } else {\n        coverRange(cm, coverEnd.to, to);\n      }\n    }\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/selection/selection-pointer.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"selectionPointer\", false, function(cm, val) {\n    var data = cm.state.selectionPointer;\n    if (data) {\n      CodeMirror.off(cm.getWrapperElement(), \"mousemove\", data.mousemove);\n      CodeMirror.off(cm.getWrapperElement(), \"mouseout\", data.mouseout);\n      CodeMirror.off(window, \"scroll\", data.windowScroll);\n      cm.off(\"cursorActivity\", reset);\n      cm.off(\"scroll\", reset);\n      cm.state.selectionPointer = null;\n      cm.display.lineDiv.style.cursor = \"\";\n    }\n    if (val) {\n      data = cm.state.selectionPointer = {\n        value: typeof val == \"string\" ? val : \"default\",\n        mousemove: function(event) { mousemove(cm, event); },\n        mouseout: function(event) { mouseout(cm, event); },\n        windowScroll: function() { reset(cm); },\n        rects: null,\n        mouseX: null, mouseY: null,\n        willUpdate: false\n      };\n      CodeMirror.on(cm.getWrapperElement(), \"mousemove\", data.mousemove);\n      CodeMirror.on(cm.getWrapperElement(), \"mouseout\", data.mouseout);\n      CodeMirror.on(window, \"scroll\", data.windowScroll);\n      cm.on(\"cursorActivity\", reset);\n      cm.on(\"scroll\", reset);\n    }\n  });\n\n  function mousemove(cm, event) {\n    var data = cm.state.selectionPointer;\n    if (event.buttons == null ? event.which : event.buttons) {\n      data.mouseX = data.mouseY = null;\n    } else {\n      data.mouseX = event.clientX;\n      data.mouseY = event.clientY;\n    }\n    scheduleUpdate(cm);\n  }\n\n  function mouseout(cm, event) {\n    if (!cm.getWrapperElement().contains(event.relatedTarget)) {\n      var data = cm.state.selectionPointer;\n      data.mouseX = data.mouseY = null;\n      scheduleUpdate(cm);\n    }\n  }\n\n  function reset(cm) {\n    cm.state.selectionPointer.rects = null;\n    scheduleUpdate(cm);\n  }\n\n  function scheduleUpdate(cm) {\n    if (!cm.state.selectionPointer.willUpdate) {\n      cm.state.selectionPointer.willUpdate = true;\n      setTimeout(function() {\n        update(cm);\n        cm.state.selectionPointer.willUpdate = false;\n      }, 50);\n    }\n  }\n\n  function update(cm) {\n    var data = cm.state.selectionPointer;\n    if (!data) return;\n    if (data.rects == null && data.mouseX != null) {\n      data.rects = [];\n      if (cm.somethingSelected()) {\n        for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling)\n          data.rects.push(sel.getBoundingClientRect());\n      }\n    }\n    var inside = false;\n    if (data.mouseX != null) for (var i = 0; i < data.rects.length; i++) {\n      var rect = data.rects[i];\n      if (rect.left <= data.mouseX && rect.right >= data.mouseX &&\n          rect.top <= data.mouseY && rect.bottom >= data.mouseY)\n        inside = true;\n    }\n    var cursor = inside ? data.value : \"\";\n    if (cm.display.lineDiv.style.cursor != cursor)\n      cm.display.lineDiv.style.cursor = cursor;\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/tern/tern.css",
    "content": ".CodeMirror-Tern-completion {\n  padding-left: 22px;\n  position: relative;\n  line-height: 1.5;\n}\n.CodeMirror-Tern-completion:before {\n  position: absolute;\n  left: 2px;\n  bottom: 2px;\n  border-radius: 50%;\n  font-size: 12px;\n  font-weight: bold;\n  height: 15px;\n  width: 15px;\n  line-height: 16px;\n  text-align: center;\n  color: white;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.CodeMirror-Tern-completion-unknown:before {\n  content: \"?\";\n  background: #4bb;\n}\n.CodeMirror-Tern-completion-object:before {\n  content: \"O\";\n  background: #77c;\n}\n.CodeMirror-Tern-completion-fn:before {\n  content: \"F\";\n  background: #7c7;\n}\n.CodeMirror-Tern-completion-array:before {\n  content: \"A\";\n  background: #c66;\n}\n.CodeMirror-Tern-completion-number:before {\n  content: \"1\";\n  background: #999;\n}\n.CodeMirror-Tern-completion-string:before {\n  content: \"S\";\n  background: #999;\n}\n.CodeMirror-Tern-completion-bool:before {\n  content: \"B\";\n  background: #999;\n}\n\n.CodeMirror-Tern-completion-guess {\n  color: #999;\n}\n\n.CodeMirror-Tern-tooltip {\n  border: 1px solid silver;\n  border-radius: 3px;\n  color: #444;\n  padding: 2px 5px;\n  font-size: 90%;\n  font-family: monospace;\n  background-color: white;\n  white-space: pre-wrap;\n\n  max-width: 40em;\n  position: absolute;\n  z-index: 10;\n  -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n\n  transition: opacity 1s;\n  -moz-transition: opacity 1s;\n  -webkit-transition: opacity 1s;\n  -o-transition: opacity 1s;\n  -ms-transition: opacity 1s;\n}\n\n.CodeMirror-Tern-hint-doc {\n  max-width: 25em;\n  margin-top: -3px;\n}\n\n.CodeMirror-Tern-fname { color: black; }\n.CodeMirror-Tern-farg { color: #70a; }\n.CodeMirror-Tern-farg-current { text-decoration: underline; }\n.CodeMirror-Tern-type { color: #07c; }\n.CodeMirror-Tern-fhint-guess { opacity: .7; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/tern/tern.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Glue code between CodeMirror and Tern.\n//\n// Create a CodeMirror.TernServer to wrap an actual Tern server,\n// register open documents (CodeMirror.Doc instances) with it, and\n// call its methods to activate the assisting functions that Tern\n// provides.\n//\n// Options supported (all optional):\n// * defs: An array of JSON definition data structures.\n// * plugins: An object mapping plugin names to configuration\n//   options.\n// * getFile: A function(name, c) that can be used to access files in\n//   the project that haven't been loaded yet. Simply do c(null) to\n//   indicate that a file is not available.\n// * fileFilter: A function(value, docName, doc) that will be applied\n//   to documents before passing them on to Tern.\n// * switchToDoc: A function(name, doc) that should, when providing a\n//   multi-file view, switch the view or focus to the named file.\n// * showError: A function(editor, message) that can be used to\n//   override the way errors are displayed.\n// * completionTip: Customize the content in tooltips for completions.\n//   Is passed a single argument—the completion's data as returned by\n//   Tern—and may return a string, DOM node, or null to indicate that\n//   no tip should be shown. By default the docstring is shown.\n// * typeTip: Like completionTip, but for the tooltips shown for type\n//   queries.\n// * responseFilter: A function(doc, query, request, error, data) that\n//   will be applied to the Tern responses before treating them\n//\n//\n// It is possible to run the Tern server in a web worker by specifying\n// these additional options:\n// * useWorker: Set to true to enable web worker mode. You'll probably\n//   want to feature detect the actual value you use here, for example\n//   !!window.Worker.\n// * workerScript: The main script of the worker. Point this to\n//   wherever you are hosting worker.js from this directory.\n// * workerDeps: An array of paths pointing (relative to workerScript)\n//   to the Acorn and Tern libraries and any Tern plugins you want to\n//   load. Or, if you minified those into a single script and included\n//   them in the workerScript, simply leave this undefined.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  // declare global: tern\n\n  CodeMirror.TernServer = function(options) {\n    var self = this;\n    this.options = options || {};\n    var plugins = this.options.plugins || (this.options.plugins = {});\n    if (!plugins.doc_comment) plugins.doc_comment = true;\n    this.docs = Object.create(null);\n    if (this.options.useWorker) {\n      this.server = new WorkerServer(this);\n    } else {\n      this.server = new tern.Server({\n        getFile: function(name, c) { return getFile(self, name, c); },\n        async: true,\n        defs: this.options.defs || [],\n        plugins: plugins\n      });\n    }\n    this.trackChange = function(doc, change) { trackChange(self, doc, change); };\n\n    this.cachedArgHints = null;\n    this.activeArgHints = null;\n    this.jumpStack = [];\n\n    this.getHint = function(cm, c) { return hint(self, cm, c); };\n    this.getHint.async = true;\n  };\n\n  CodeMirror.TernServer.prototype = {\n    addDoc: function(name, doc) {\n      var data = {doc: doc, name: name, changed: null};\n      this.server.addFile(name, docValue(this, data));\n      CodeMirror.on(doc, \"change\", this.trackChange);\n      return this.docs[name] = data;\n    },\n\n    delDoc: function(id) {\n      var found = resolveDoc(this, id);\n      if (!found) return;\n      CodeMirror.off(found.doc, \"change\", this.trackChange);\n      delete this.docs[found.name];\n      this.server.delFile(found.name);\n    },\n\n    hideDoc: function(id) {\n      closeArgHints(this);\n      var found = resolveDoc(this, id);\n      if (found && found.changed) sendDoc(this, found);\n    },\n\n    complete: function(cm) {\n      cm.showHint({hint: this.getHint});\n    },\n\n    showType: function(cm, pos, c) { showContextInfo(this, cm, pos, \"type\", c); },\n\n    showDocs: function(cm, pos, c) { showContextInfo(this, cm, pos, \"documentation\", c); },\n\n    updateArgHints: function(cm) { updateArgHints(this, cm); },\n\n    jumpToDef: function(cm) { jumpToDef(this, cm); },\n\n    jumpBack: function(cm) { jumpBack(this, cm); },\n\n    rename: function(cm) { rename(this, cm); },\n\n    selectName: function(cm) { selectName(this, cm); },\n\n    request: function (cm, query, c, pos) {\n      var self = this;\n      var doc = findDoc(this, cm.getDoc());\n      var request = buildRequest(this, doc, query, pos);\n      var extraOptions = request.query && this.options.queryOptions && this.options.queryOptions[request.query.type]\n      if (extraOptions) for (var prop in extraOptions) request.query[prop] = extraOptions[prop];\n\n      this.server.request(request, function (error, data) {\n        if (!error && self.options.responseFilter)\n          data = self.options.responseFilter(doc, query, request, error, data);\n        c(error, data);\n      });\n    },\n\n    destroy: function () {\n      closeArgHints(this)\n      if (this.worker) {\n        this.worker.terminate();\n        this.worker = null;\n      }\n    }\n  };\n\n  var Pos = CodeMirror.Pos;\n  var cls = \"CodeMirror-Tern-\";\n  var bigDoc = 250;\n\n  function getFile(ts, name, c) {\n    var buf = ts.docs[name];\n    if (buf)\n      c(docValue(ts, buf));\n    else if (ts.options.getFile)\n      ts.options.getFile(name, c);\n    else\n      c(null);\n  }\n\n  function findDoc(ts, doc, name) {\n    for (var n in ts.docs) {\n      var cur = ts.docs[n];\n      if (cur.doc == doc) return cur;\n    }\n    if (!name) for (var i = 0;; ++i) {\n      n = \"[doc\" + (i || \"\") + \"]\";\n      if (!ts.docs[n]) { name = n; break; }\n    }\n    return ts.addDoc(name, doc);\n  }\n\n  function resolveDoc(ts, id) {\n    if (typeof id == \"string\") return ts.docs[id];\n    if (id instanceof CodeMirror) id = id.getDoc();\n    if (id instanceof CodeMirror.Doc) return findDoc(ts, id);\n  }\n\n  function trackChange(ts, doc, change) {\n    var data = findDoc(ts, doc);\n\n    var argHints = ts.cachedArgHints;\n    if (argHints && argHints.doc == doc && cmpPos(argHints.start, change.to) >= 0)\n      ts.cachedArgHints = null;\n\n    var changed = data.changed;\n    if (changed == null)\n      data.changed = changed = {from: change.from.line, to: change.from.line};\n    var end = change.from.line + (change.text.length - 1);\n    if (change.from.line < changed.to) changed.to = changed.to - (change.to.line - end);\n    if (end >= changed.to) changed.to = end + 1;\n    if (changed.from > change.from.line) changed.from = change.from.line;\n\n    if (doc.lineCount() > bigDoc && change.to - changed.from > 100) setTimeout(function() {\n      if (data.changed && data.changed.to - data.changed.from > 100) sendDoc(ts, data);\n    }, 200);\n  }\n\n  function sendDoc(ts, doc) {\n    ts.server.request({files: [{type: \"full\", name: doc.name, text: docValue(ts, doc)}]}, function(error) {\n      if (error) window.console.error(error);\n      else doc.changed = null;\n    });\n  }\n\n  // Completion\n\n  function hint(ts, cm, c) {\n    ts.request(cm, {type: \"completions\", types: true, docs: true, urls: true}, function(error, data) {\n      if (error) return showError(ts, cm, error);\n      var completions = [], after = \"\";\n      var from = data.start, to = data.end;\n      if (cm.getRange(Pos(from.line, from.ch - 2), from) == \"[\\\"\" &&\n          cm.getRange(to, Pos(to.line, to.ch + 2)) != \"\\\"]\")\n        after = \"\\\"]\";\n\n      for (var i = 0; i < data.completions.length; ++i) {\n        var completion = data.completions[i], className = typeToIcon(completion.type);\n        if (data.guess) className += \" \" + cls + \"guess\";\n        completions.push({text: completion.name + after,\n                          displayText: completion.displayName || completion.name,\n                          className: className,\n                          data: completion});\n      }\n\n      var obj = {from: from, to: to, list: completions};\n      var tooltip = null;\n      CodeMirror.on(obj, \"close\", function() { remove(tooltip); });\n      CodeMirror.on(obj, \"update\", function() { remove(tooltip); });\n      CodeMirror.on(obj, \"select\", function(cur, node) {\n        remove(tooltip);\n        var content = ts.options.completionTip ? ts.options.completionTip(cur.data) : cur.data.doc;\n        if (content) {\n          tooltip = makeTooltip(node.parentNode.getBoundingClientRect().right + window.pageXOffset,\n                                node.getBoundingClientRect().top + window.pageYOffset, content, cm, cls + \"hint-doc\");\n        }\n      });\n      c(obj);\n    });\n  }\n\n  function typeToIcon(type) {\n    var suffix;\n    if (type == \"?\") suffix = \"unknown\";\n    else if (type == \"number\" || type == \"string\" || type == \"bool\") suffix = type;\n    else if (/^fn\\(/.test(type)) suffix = \"fn\";\n    else if (/^\\[/.test(type)) suffix = \"array\";\n    else suffix = \"object\";\n    return cls + \"completion \" + cls + \"completion-\" + suffix;\n  }\n\n  // Type queries\n\n  function showContextInfo(ts, cm, pos, queryName, c) {\n    ts.request(cm, queryName, function(error, data) {\n      if (error) return showError(ts, cm, error);\n      if (ts.options.typeTip) {\n        var tip = ts.options.typeTip(data);\n      } else {\n        var tip = elt(\"span\", null, elt(\"strong\", null, data.type || \"not found\"));\n        if (data.doc)\n          tip.appendChild(document.createTextNode(\" — \" + data.doc));\n        if (data.url) {\n          tip.appendChild(document.createTextNode(\" \"));\n          var child = tip.appendChild(elt(\"a\", null, \"[docs]\"));\n          child.href = data.url;\n          child.target = \"_blank\";\n        }\n      }\n      tempTooltip(cm, tip, ts);\n      if (c) c();\n    }, pos);\n  }\n\n  // Maintaining argument hints\n\n  function updateArgHints(ts, cm) {\n    closeArgHints(ts);\n\n    if (cm.somethingSelected()) return;\n    var state = cm.getTokenAt(cm.getCursor()).state;\n    var inner = CodeMirror.innerMode(cm.getMode(), state);\n    if (inner.mode.name != \"javascript\") return;\n    var lex = inner.state.lexical;\n    if (lex.info != \"call\") return;\n\n    var ch, argPos = lex.pos || 0, tabSize = cm.getOption(\"tabSize\");\n    for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) {\n      var str = cm.getLine(line), extra = 0;\n      for (var pos = 0;;) {\n        var tab = str.indexOf(\"\\t\", pos);\n        if (tab == -1) break;\n        extra += tabSize - (tab + extra) % tabSize - 1;\n        pos = tab + 1;\n      }\n      ch = lex.column - extra;\n      if (str.charAt(ch) == \"(\") {found = true; break;}\n    }\n    if (!found) return;\n\n    var start = Pos(line, ch);\n    var cache = ts.cachedArgHints;\n    if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0)\n      return showArgHints(ts, cm, argPos);\n\n    ts.request(cm, {type: \"type\", preferFunction: true, end: start}, function(error, data) {\n      if (error || !data.type || !(/^fn\\(/).test(data.type)) return;\n      ts.cachedArgHints = {\n        start: start,\n        type: parseFnType(data.type),\n        name: data.exprName || data.name || \"fn\",\n        guess: data.guess,\n        doc: cm.getDoc()\n      };\n      showArgHints(ts, cm, argPos);\n    });\n  }\n\n  function showArgHints(ts, cm, pos) {\n    closeArgHints(ts);\n\n    var cache = ts.cachedArgHints, tp = cache.type;\n    var tip = elt(\"span\", cache.guess ? cls + \"fhint-guess\" : null,\n                  elt(\"span\", cls + \"fname\", cache.name), \"(\");\n    for (var i = 0; i < tp.args.length; ++i) {\n      if (i) tip.appendChild(document.createTextNode(\", \"));\n      var arg = tp.args[i];\n      tip.appendChild(elt(\"span\", cls + \"farg\" + (i == pos ? \" \" + cls + \"farg-current\" : \"\"), arg.name || \"?\"));\n      if (arg.type != \"?\") {\n        tip.appendChild(document.createTextNode(\":\\u00a0\"));\n        tip.appendChild(elt(\"span\", cls + \"type\", arg.type));\n      }\n    }\n    tip.appendChild(document.createTextNode(tp.rettype ? \") ->\\u00a0\" : \")\"));\n    if (tp.rettype) tip.appendChild(elt(\"span\", cls + \"type\", tp.rettype));\n    var place = cm.cursorCoords(null, \"page\");\n    var tooltip = ts.activeArgHints = makeTooltip(place.right + 1, place.bottom, tip, cm)\n    setTimeout(function() {\n      tooltip.clear = onEditorActivity(cm, function() {\n        if (ts.activeArgHints == tooltip) closeArgHints(ts) })\n    }, 20)\n  }\n\n  function parseFnType(text) {\n    var args = [], pos = 3;\n\n    function skipMatching(upto) {\n      var depth = 0, start = pos;\n      for (;;) {\n        var next = text.charAt(pos);\n        if (upto.test(next) && !depth) return text.slice(start, pos);\n        if (/[{\\[\\(]/.test(next)) ++depth;\n        else if (/[}\\]\\)]/.test(next)) --depth;\n        ++pos;\n      }\n    }\n\n    // Parse arguments\n    if (text.charAt(pos) != \")\") for (;;) {\n      var name = text.slice(pos).match(/^([^, \\(\\[\\{]+): /);\n      if (name) {\n        pos += name[0].length;\n        name = name[1];\n      }\n      args.push({name: name, type: skipMatching(/[\\),]/)});\n      if (text.charAt(pos) == \")\") break;\n      pos += 2;\n    }\n\n    var rettype = text.slice(pos).match(/^\\) -> (.*)$/);\n\n    return {args: args, rettype: rettype && rettype[1]};\n  }\n\n  // Moving to the definition of something\n\n  function jumpToDef(ts, cm) {\n    function inner(varName) {\n      var req = {type: \"definition\", variable: varName || null};\n      var doc = findDoc(ts, cm.getDoc());\n      ts.server.request(buildRequest(ts, doc, req), function(error, data) {\n        if (error) return showError(ts, cm, error);\n        if (!data.file && data.url) { window.open(data.url); return; }\n\n        if (data.file) {\n          var localDoc = ts.docs[data.file], found;\n          if (localDoc && (found = findContext(localDoc.doc, data))) {\n            ts.jumpStack.push({file: doc.name,\n                               start: cm.getCursor(\"from\"),\n                               end: cm.getCursor(\"to\")});\n            moveTo(ts, doc, localDoc, found.start, found.end);\n            return;\n          }\n        }\n        showError(ts, cm, \"Could not find a definition.\");\n      });\n    }\n\n    if (!atInterestingExpression(cm))\n      dialog(cm, \"Jump to variable\", function(name) { if (name) inner(name); });\n    else\n      inner();\n  }\n\n  function jumpBack(ts, cm) {\n    var pos = ts.jumpStack.pop(), doc = pos && ts.docs[pos.file];\n    if (!doc) return;\n    moveTo(ts, findDoc(ts, cm.getDoc()), doc, pos.start, pos.end);\n  }\n\n  function moveTo(ts, curDoc, doc, start, end) {\n    doc.doc.setSelection(start, end);\n    if (curDoc != doc && ts.options.switchToDoc) {\n      closeArgHints(ts);\n      ts.options.switchToDoc(doc.name, doc.doc);\n    }\n  }\n\n  // The {line,ch} representation of positions makes this rather awkward.\n  function findContext(doc, data) {\n    var before = data.context.slice(0, data.contextOffset).split(\"\\n\");\n    var startLine = data.start.line - (before.length - 1);\n    var start = Pos(startLine, (before.length == 1 ? data.start.ch : doc.getLine(startLine).length) - before[0].length);\n\n    var text = doc.getLine(startLine).slice(start.ch);\n    for (var cur = startLine + 1; cur < doc.lineCount() && text.length < data.context.length; ++cur)\n      text += \"\\n\" + doc.getLine(cur);\n    if (text.slice(0, data.context.length) == data.context) return data;\n\n    var cursor = doc.getSearchCursor(data.context, 0, false);\n    var nearest, nearestDist = Infinity;\n    while (cursor.findNext()) {\n      var from = cursor.from(), dist = Math.abs(from.line - start.line) * 10000;\n      if (!dist) dist = Math.abs(from.ch - start.ch);\n      if (dist < nearestDist) { nearest = from; nearestDist = dist; }\n    }\n    if (!nearest) return null;\n\n    if (before.length == 1)\n      nearest.ch += before[0].length;\n    else\n      nearest = Pos(nearest.line + (before.length - 1), before[before.length - 1].length);\n    if (data.start.line == data.end.line)\n      var end = Pos(nearest.line, nearest.ch + (data.end.ch - data.start.ch));\n    else\n      var end = Pos(nearest.line + (data.end.line - data.start.line), data.end.ch);\n    return {start: nearest, end: end};\n  }\n\n  function atInterestingExpression(cm) {\n    var pos = cm.getCursor(\"end\"), tok = cm.getTokenAt(pos);\n    if (tok.start < pos.ch && tok.type == \"comment\") return false;\n    return /[\\w)\\]]/.test(cm.getLine(pos.line).slice(Math.max(pos.ch - 1, 0), pos.ch + 1));\n  }\n\n  // Variable renaming\n\n  function rename(ts, cm) {\n    var token = cm.getTokenAt(cm.getCursor());\n    if (!/\\w/.test(token.string)) return showError(ts, cm, \"Not at a variable\");\n    dialog(cm, \"New name for \" + token.string, function(newName) {\n      ts.request(cm, {type: \"rename\", newName: newName, fullDocs: true}, function(error, data) {\n        if (error) return showError(ts, cm, error);\n        applyChanges(ts, data.changes);\n      });\n    });\n  }\n\n  function selectName(ts, cm) {\n    var name = findDoc(ts, cm.doc).name;\n    ts.request(cm, {type: \"refs\"}, function(error, data) {\n      if (error) return showError(ts, cm, error);\n      var ranges = [], cur = 0;\n      var curPos = cm.getCursor();\n      for (var i = 0; i < data.refs.length; i++) {\n        var ref = data.refs[i];\n        if (ref.file == name) {\n          ranges.push({anchor: ref.start, head: ref.end});\n          if (cmpPos(curPos, ref.start) >= 0 && cmpPos(curPos, ref.end) <= 0)\n            cur = ranges.length - 1;\n        }\n      }\n      cm.setSelections(ranges, cur);\n    });\n  }\n\n  var nextChangeOrig = 0;\n  function applyChanges(ts, changes) {\n    var perFile = Object.create(null);\n    for (var i = 0; i < changes.length; ++i) {\n      var ch = changes[i];\n      (perFile[ch.file] || (perFile[ch.file] = [])).push(ch);\n    }\n    for (var file in perFile) {\n      var known = ts.docs[file], chs = perFile[file];;\n      if (!known) continue;\n      chs.sort(function(a, b) { return cmpPos(b.start, a.start); });\n      var origin = \"*rename\" + (++nextChangeOrig);\n      for (var i = 0; i < chs.length; ++i) {\n        var ch = chs[i];\n        known.doc.replaceRange(ch.text, ch.start, ch.end, origin);\n      }\n    }\n  }\n\n  // Generic request-building helper\n\n  function buildRequest(ts, doc, query, pos) {\n    var files = [], offsetLines = 0, allowFragments = !query.fullDocs;\n    if (!allowFragments) delete query.fullDocs;\n    if (typeof query == \"string\") query = {type: query};\n    query.lineCharPositions = true;\n    if (query.end == null) {\n      query.end = pos || doc.doc.getCursor(\"end\");\n      if (doc.doc.somethingSelected())\n        query.start = doc.doc.getCursor(\"start\");\n    }\n    var startPos = query.start || query.end;\n\n    if (doc.changed) {\n      if (doc.doc.lineCount() > bigDoc && allowFragments !== false &&\n          doc.changed.to - doc.changed.from < 100 &&\n          doc.changed.from <= startPos.line && doc.changed.to > query.end.line) {\n        files.push(getFragmentAround(doc, startPos, query.end));\n        query.file = \"#0\";\n        var offsetLines = files[0].offsetLines;\n        if (query.start != null) query.start = Pos(query.start.line - -offsetLines, query.start.ch);\n        query.end = Pos(query.end.line - offsetLines, query.end.ch);\n      } else {\n        files.push({type: \"full\",\n                    name: doc.name,\n                    text: docValue(ts, doc)});\n        query.file = doc.name;\n        doc.changed = null;\n      }\n    } else {\n      query.file = doc.name;\n    }\n    for (var name in ts.docs) {\n      var cur = ts.docs[name];\n      if (cur.changed && cur != doc) {\n        files.push({type: \"full\", name: cur.name, text: docValue(ts, cur)});\n        cur.changed = null;\n      }\n    }\n\n    return {query: query, files: files};\n  }\n\n  function getFragmentAround(data, start, end) {\n    var doc = data.doc;\n    var minIndent = null, minLine = null, endLine, tabSize = 4;\n    for (var p = start.line - 1, min = Math.max(0, p - 50); p >= min; --p) {\n      var line = doc.getLine(p), fn = line.search(/\\bfunction\\b/);\n      if (fn < 0) continue;\n      var indent = CodeMirror.countColumn(line, null, tabSize);\n      if (minIndent != null && minIndent <= indent) continue;\n      minIndent = indent;\n      minLine = p;\n    }\n    if (minLine == null) minLine = min;\n    var max = Math.min(doc.lastLine(), end.line + 20);\n    if (minIndent == null || minIndent == CodeMirror.countColumn(doc.getLine(start.line), null, tabSize))\n      endLine = max;\n    else for (endLine = end.line + 1; endLine < max; ++endLine) {\n      var indent = CodeMirror.countColumn(doc.getLine(endLine), null, tabSize);\n      if (indent <= minIndent) break;\n    }\n    var from = Pos(minLine, 0);\n\n    return {type: \"part\",\n            name: data.name,\n            offsetLines: from.line,\n            text: doc.getRange(from, Pos(endLine, end.line == endLine ? null : 0))};\n  }\n\n  // Generic utilities\n\n  var cmpPos = CodeMirror.cmpPos;\n\n  function elt(tagname, cls /*, ... elts*/) {\n    var e = document.createElement(tagname);\n    if (cls) e.className = cls;\n    for (var i = 2; i < arguments.length; ++i) {\n      var elt = arguments[i];\n      if (typeof elt == \"string\") elt = document.createTextNode(elt);\n      e.appendChild(elt);\n    }\n    return e;\n  }\n\n  function dialog(cm, text, f) {\n    if (cm.openDialog)\n      cm.openDialog(text + \": <input type=text>\", f);\n    else\n      f(prompt(text, \"\"));\n  }\n\n  // Tooltips\n\n  function tempTooltip(cm, content, ts) {\n    if (cm.state.ternTooltip) remove(cm.state.ternTooltip);\n    var where = cm.cursorCoords();\n    var tip = cm.state.ternTooltip = makeTooltip(where.right + 1, where.bottom, content, cm);\n    function maybeClear() {\n      old = true;\n      if (!mouseOnTip) clear();\n    }\n    function clear() {\n      cm.state.ternTooltip = null;\n      if (tip.parentNode) fadeOut(tip)\n      clearActivity()\n    }\n    var mouseOnTip = false, old = false;\n    CodeMirror.on(tip, \"mousemove\", function() { mouseOnTip = true; });\n    CodeMirror.on(tip, \"mouseout\", function(e) {\n      var related = e.relatedTarget || e.toElement\n      if (!related || !CodeMirror.contains(tip, related)) {\n        if (old) clear();\n        else mouseOnTip = false;\n      }\n    });\n    setTimeout(maybeClear, ts.options.hintDelay ? ts.options.hintDelay : 1700);\n    var clearActivity = onEditorActivity(cm, clear)\n  }\n\n  function onEditorActivity(cm, f) {\n    cm.on(\"cursorActivity\", f)\n    cm.on(\"blur\", f)\n    cm.on(\"scroll\", f)\n    cm.on(\"setDoc\", f)\n    return function() {\n      cm.off(\"cursorActivity\", f)\n      cm.off(\"blur\", f)\n      cm.off(\"scroll\", f)\n      cm.off(\"setDoc\", f)\n    }\n  }\n\n  function makeTooltip(x, y, content, cm, className) {\n    var node = elt(\"div\", cls + \"tooltip\" + \" \" + (className || \"\"), content);\n    node.style.left = x + \"px\";\n    node.style.top = y + \"px\";\n    var container = ((cm.options || {}).hintOptions || {}).container || document.body;\n    container.appendChild(node);\n\n    var pos = cm.cursorCoords();\n    var winW = window.innerWidth;\n    var winH = window.innerHeight;\n    var box = node.getBoundingClientRect();\n    var hints = document.querySelector(\".CodeMirror-hints\");\n    var overlapY = box.bottom - winH;\n    var overlapX = box.right - winW;\n\n    if (hints && overlapX > 0) {\n      node.style.left = 0;\n      var box = node.getBoundingClientRect();\n      node.style.left = (x = x - hints.offsetWidth - box.width) + \"px\";\n      overlapX = box.right - winW;\n    }\n    if (overlapY > 0) {\n      var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top);\n      if (curTop - height > 0) { // Fits above cursor\n        node.style.top = (pos.top - height) + \"px\";\n      } else if (height > winH) {\n        node.style.height = (winH - 5) + \"px\";\n        node.style.top = (pos.bottom - box.top) + \"px\";\n      }\n    }\n    if (overlapX > 0) {\n      if (box.right - box.left > winW) {\n        node.style.width = (winW - 5) + \"px\";\n        overlapX -= (box.right - box.left) - winW;\n      }\n      node.style.left = (x - overlapX) + \"px\";\n    }\n\n    return node;\n  }\n\n  function remove(node) {\n    var p = node && node.parentNode;\n    if (p) p.removeChild(node);\n  }\n\n  function fadeOut(tooltip) {\n    tooltip.style.opacity = \"0\";\n    setTimeout(function() { remove(tooltip); }, 1100);\n  }\n\n  function showError(ts, cm, msg) {\n    if (ts.options.showError)\n      ts.options.showError(cm, msg);\n    else\n      tempTooltip(cm, String(msg), ts);\n  }\n\n  function closeArgHints(ts) {\n    if (ts.activeArgHints) {\n      if (ts.activeArgHints.clear) ts.activeArgHints.clear()\n      remove(ts.activeArgHints)\n      ts.activeArgHints = null\n    }\n  }\n\n  function docValue(ts, doc) {\n    var val = doc.doc.getValue();\n    if (ts.options.fileFilter) val = ts.options.fileFilter(val, doc.name, doc.doc);\n    return val;\n  }\n\n  // Worker wrapper\n\n  function WorkerServer(ts) {\n    var worker = ts.worker = new Worker(ts.options.workerScript);\n    worker.postMessage({type: \"init\",\n                        defs: ts.options.defs,\n                        plugins: ts.options.plugins,\n                        scripts: ts.options.workerDeps});\n    var msgId = 0, pending = {};\n\n    function send(data, c) {\n      if (c) {\n        data.id = ++msgId;\n        pending[msgId] = c;\n      }\n      worker.postMessage(data);\n    }\n    worker.onmessage = function(e) {\n      var data = e.data;\n      if (data.type == \"getFile\") {\n        getFile(ts, data.name, function(err, text) {\n          send({type: \"getFile\", err: String(err), text: text, id: data.id});\n        });\n      } else if (data.type == \"debug\") {\n        window.console.log(data.message);\n      } else if (data.id && pending[data.id]) {\n        pending[data.id](data.err, data.body);\n        delete pending[data.id];\n      }\n    };\n    worker.onerror = function(e) {\n      for (var id in pending) pending[id](e);\n      pending = {};\n    };\n\n    this.addFile = function(name, text) { send({type: \"add\", name: name, text: text}); };\n    this.delFile = function(name) { send({type: \"del\", name: name}); };\n    this.request = function(body, c) { send({type: \"req\", body: body}, c); };\n  }\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/tern/worker.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// declare global: tern, server\n\nvar server;\n\nthis.onmessage = function(e) {\n  var data = e.data;\n  switch (data.type) {\n  case \"init\": return startServer(data.defs, data.plugins, data.scripts);\n  case \"add\": return server.addFile(data.name, data.text);\n  case \"del\": return server.delFile(data.name);\n  case \"req\": return server.request(data.body, function(err, reqData) {\n    postMessage({id: data.id, body: reqData, err: err && String(err)});\n  });\n  case \"getFile\":\n    var c = pending[data.id];\n    delete pending[data.id];\n    return c(data.err, data.text);\n  default: throw new Error(\"Unknown message type: \" + data.type);\n  }\n};\n\nvar nextId = 0, pending = {};\nfunction getFile(file, c) {\n  postMessage({type: \"getFile\", name: file, id: ++nextId});\n  pending[nextId] = c;\n}\n\nfunction startServer(defs, plugins, scripts) {\n  if (scripts) importScripts.apply(null, scripts);\n\n  server = new tern.Server({\n    getFile: getFile,\n    async: true,\n    defs: defs,\n    plugins: plugins\n  });\n}\n\nthis.console = {\n  log: function(v) { postMessage({type: \"debug\", message: v}); }\n};\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/addon/wrap/hardwrap.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var Pos = CodeMirror.Pos;\n\n  function findParagraph(cm, pos, options) {\n    var startRE = options.paragraphStart || cm.getHelper(pos, \"paragraphStart\");\n    for (var start = pos.line, first = cm.firstLine(); start > first; --start) {\n      var line = cm.getLine(start);\n      if (startRE && startRE.test(line)) break;\n      if (!/\\S/.test(line)) { ++start; break; }\n    }\n    var endRE = options.paragraphEnd || cm.getHelper(pos, \"paragraphEnd\");\n    for (var end = pos.line + 1, last = cm.lastLine(); end <= last; ++end) {\n      var line = cm.getLine(end);\n      if (endRE && endRE.test(line)) { ++end; break; }\n      if (!/\\S/.test(line)) break;\n    }\n    return {from: start, to: end};\n  }\n\n  function findBreakPoint(text, column, wrapOn, killTrailingSpace, forceBreak) {\n    var at = column\n    while (at < text.length && text.charAt(at) == \" \") at++\n    for (; at > 0; --at)\n      if (wrapOn.test(text.slice(at - 1, at + 1))) break;\n\n    if (!forceBreak && at <= text.match(/^[ \\t]*/)[0].length) {\n      // didn't find a break point before column, in non-forceBreak mode try to\n      // find one after 'column'.\n      for (at = column + 1; at < text.length - 1; ++at) {\n        if (wrapOn.test(text.slice(at - 1, at + 1))) break;\n      }\n    }\n\n    for (var first = true;; first = false) {\n      var endOfText = at;\n      if (killTrailingSpace)\n        while (text.charAt(endOfText - 1) == \" \") --endOfText;\n      if (endOfText == 0 && first) at = column;\n      else return {from: endOfText, to: at};\n    }\n  }\n\n  function wrapRange(cm, from, to, options) {\n    from = cm.clipPos(from); to = cm.clipPos(to);\n    var column = options.column || 80;\n    var wrapOn = options.wrapOn || /\\s\\S|-[^\\.\\d]/;\n    var forceBreak = options.forceBreak !== false;\n    var killTrailing = options.killTrailingSpace !== false;\n    var changes = [], curLine = \"\", curNo = from.line;\n    var lines = cm.getRange(from, to, false);\n    if (!lines.length) return null;\n    var leadingSpace = lines[0].match(/^[ \\t]*/)[0];\n    if (leadingSpace.length >= column) column = leadingSpace.length + 1\n\n    for (var i = 0; i < lines.length; ++i) {\n      var text = lines[i], oldLen = curLine.length, spaceInserted = 0;\n      if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) {\n        curLine += \" \";\n        spaceInserted = 1;\n      }\n      var spaceTrimmed = \"\";\n      if (i) {\n        spaceTrimmed = text.match(/^\\s*/)[0];\n        text = text.slice(spaceTrimmed.length);\n      }\n      curLine += text;\n      if (i) {\n        var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed &&\n          findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak);\n        // If this isn't broken, or is broken at a different point, remove old break\n        if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) {\n          changes.push({text: [spaceInserted ? \" \" : \"\"],\n                        from: Pos(curNo, oldLen),\n                        to: Pos(curNo + 1, spaceTrimmed.length)});\n        } else {\n          curLine = leadingSpace + text;\n          ++curNo;\n        }\n      }\n      while (curLine.length > column) {\n        var bp = findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak);\n        if (bp.from != bp.to ||\n            forceBreak && leadingSpace !== curLine.slice(0, bp.to)) {\n          changes.push({text: [\"\", leadingSpace],\n                        from: Pos(curNo, bp.from),\n                        to: Pos(curNo, bp.to)});\n          curLine = leadingSpace + curLine.slice(bp.to);\n          ++curNo;\n        } else {\n          break;\n        }\n      }\n    }\n    if (changes.length) cm.operation(function() {\n      for (var i = 0; i < changes.length; ++i) {\n        var change = changes[i];\n        if (change.text || CodeMirror.cmpPos(change.from, change.to))\n          cm.replaceRange(change.text, change.from, change.to);\n      }\n    });\n    return changes.length ? {from: changes[0].from, to: CodeMirror.changeEnd(changes[changes.length - 1])} : null;\n  }\n\n  CodeMirror.defineExtension(\"wrapParagraph\", function(pos, options) {\n    options = options || {};\n    if (!pos) pos = this.getCursor();\n    var para = findParagraph(this, pos, options);\n    return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options);\n  });\n\n  CodeMirror.commands.wrapLines = function(cm) {\n    cm.operation(function() {\n      var ranges = cm.listSelections(), at = cm.lastLine() + 1;\n      for (var i = ranges.length - 1; i >= 0; i--) {\n        var range = ranges[i], span;\n        if (range.empty()) {\n          var para = findParagraph(cm, range.head, {});\n          span = {from: Pos(para.from, 0), to: Pos(para.to - 1)};\n        } else {\n          span = {from: range.from(), to: range.to()};\n        }\n        if (span.to.line >= at) continue;\n        at = span.from.line;\n        wrapRange(cm, span.from, span.to, {});\n      }\n    });\n  };\n\n  CodeMirror.defineExtension(\"wrapRange\", function(from, to, options) {\n    return wrapRange(this, from, to, options || {});\n  });\n\n  CodeMirror.defineExtension(\"wrapParagraphsInRange\", function(from, to, options) {\n    options = options || {};\n    var cm = this, paras = [];\n    for (var line = from.line; line <= to.line;) {\n      var para = findParagraph(cm, Pos(line, 0), options);\n      paras.push(para);\n      line = para.to;\n    }\n    var madeChange = false;\n    if (paras.length) cm.operation(function() {\n      for (var i = paras.length - 1; i >= 0; --i)\n        madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options);\n    });\n    return madeChange;\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/bin/source-highlight",
    "content": "#!/usr/bin/env node\n\n// Simple command-line code highlighting tool. Reads code from stdin,\n// spits html to stdout. For example:\n//\n//   echo 'function foo(a) { return a; }' | bin/source-highlight -s javascript\n//   bin/source-highlight -s \n\nvar fs = require(\"fs\");\n\nvar CodeMirror = require(\"../addon/runmode/runmode.node.js\");\nrequire(\"../mode/meta.js\");\n\nvar sPos = process.argv.indexOf(\"-s\");\nif (sPos == -1 || sPos == process.argv.length - 1) {\n   console.error(\"Usage: source-highlight -s language\");\n   process.exit(1);\n}\nvar lang = process.argv[sPos + 1].toLowerCase(), modeName = lang;\nvar found = CodeMirror.findModeByMIME(lang) || CodeMirror.findModeByName(lang)\nif (found) {\n  modeName = found.mode\n  lang = found.mime\n}\n\nif (!CodeMirror.modes[modeName])\n  require(\"../mode/\" + modeName + \"/\" + modeName + \".js\");\n\nfunction esc(str) {\n  return str.replace(/[<&]/g, function(ch) { return ch == \"&\" ? \"&amp;\" : \"&lt;\"; });\n}\n\nvar code = fs.readFileSync(\"/dev/stdin\", \"utf8\");\nvar curStyle = null, accum = \"\";\nfunction flush() {\n  if (curStyle) process.stdout.write(\"<span class=\\\"\" + curStyle.replace(/(^|\\s+)/g, \"$1cm-\") + \"\\\">\" + esc(accum) + \"</span>\");\n  else process.stdout.write(esc(accum));\n}\n\nCodeMirror.runMode(code, lang, function(text, style) {\n  if (style != curStyle) {\n    flush();\n    curStyle = style; accum = text;\n  } else {\n    accum += text;\n  }\n});\nflush();\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/diff",
    "content": "diff --git a/mode/clike/clike.js b/mode/clike/clike.js\nindex 15c0fd11..916aee61 100644\n--- a/mode/clike/clike.js\n+++ b/mode/clike/clike.js\n@@ -484,7 +484,7 @@ CodeMirror.defineMode(\"clike\", function(config, parserConfig) {\n                     \"instanceof interface native new package private protected public \" +\n                     \"return static strictfp super switch synchronized this throw throws transient \" +\n                     \"try volatile while @interface\"),\n-    types: words(\"byte short int long float double boolean char void Boolean Byte Character Double Float \" +\n+    types: words(\"var byte short int long float double boolean char void Boolean Byte Character Double Float \" +\n                  \"Integer Long Number Object Short String StringBuffer StringBuilder Void\"),\n     blockKeywords: words(\"catch class do else finally for if switch try while\"),\n     defKeywords: words(\"class interface enum @interface\"),\ndiff --git a/mode/cobol/cobol.js b/mode/cobol/cobol.js\nindex 275857b4..a7aeafa0 100644\n--- a/mode/cobol/cobol.js\n+++ b/mode/cobol/cobol.js\n@@ -195,7 +195,7 @@ CodeMirror.defineMode(\"cobol\", function () {\n       case \"string\": // multi-line string parsing mode\n         var next = false;\n         while ((next = stream.next()) != null) {\n-          if (next == \"\\\"\" || next == \"\\'\") {\n+          if ((next == \"\\\"\" || next == \"\\'\") && !stream.match(/['\"]/, false)) {\n             state.mode = false;\n             break;\n           }\ndiff --git a/mode/css/css.js b/mode/css/css.js\nindex 88a869bf..503c48c2 100644\n--- a/mode/css/css.js\n+++ b/mode/css/css.js\n@@ -443,13 +443,15 @@ CodeMirror.defineMode(\"css\", function(config, parserConfig) {\n     \"monochrome\", \"min-monochrome\", \"max-monochrome\", \"resolution\",\n     \"min-resolution\", \"max-resolution\", \"scan\", \"grid\", \"orientation\",\n     \"device-pixel-ratio\", \"min-device-pixel-ratio\", \"max-device-pixel-ratio\",\n-    \"pointer\", \"any-pointer\", \"hover\", \"any-hover\", \"prefers-color-scheme\"\n+    \"pointer\", \"any-pointer\", \"hover\", \"any-hover\", \"prefers-color-scheme\",\n+    \"dynamic-range\", \"video-dynamic-range\"\n   ], mediaFeatures = keySet(mediaFeatures_);\n \n   var mediaValueKeywords_ = [\n     \"landscape\", \"portrait\", \"none\", \"coarse\", \"fine\", \"on-demand\", \"hover\",\n     \"interlace\", \"progressive\",\n-    \"dark\", \"light\"\n+    \"dark\", \"light\",\n+    \"standard\", \"high\"\n   ], mediaValueKeywords = keySet(mediaValueKeywords_);\n \n   var propertyKeywords_ = [\n@@ -482,7 +484,7 @@ CodeMirror.defineMode(\"css\", function(config, parserConfig) {\n     \"cue-before\", \"cursor\", \"direction\", \"display\", \"dominant-baseline\",\n     \"drop-initial-after-adjust\", \"drop-initial-after-align\",\n     \"drop-initial-before-adjust\", \"drop-initial-before-align\", \"drop-initial-size\",\n-    \"drop-initial-value\", \"elevation\", \"empty-cells\", \"fit\", \"fit-position\",\n+    \"drop-initial-value\", \"elevation\", \"empty-cells\", \"fit\", \"fit-content\", \"fit-position\",\n     \"flex\", \"flex-basis\", \"flex-direction\", \"flex-flow\", \"flex-grow\",\n     \"flex-shrink\", \"flex-wrap\", \"float\", \"float-offset\", \"flow-from\", \"flow-into\",\n     \"font\", \"font-family\", \"font-feature-settings\", \"font-kerning\",\n@@ -564,7 +566,7 @@ CodeMirror.defineMode(\"css\", function(config, parserConfig) {\n   ], propertyKeywords = keySet(propertyKeywords_);\n \n   var nonStandardPropertyKeywords_ = [\n-    \"border-block\", \"border-block-color\", \"border-block-end\",\n+    \"accent-color\", \"aspect-ratio\", \"border-block\", \"border-block-color\", \"border-block-end\",\n     \"border-block-end-color\", \"border-block-end-style\", \"border-block-end-width\",\n     \"border-block-start\", \"border-block-start-color\", \"border-block-start-style\",\n     \"border-block-start-width\", \"border-block-style\", \"border-block-width\",\n@@ -572,9 +574,9 @@ CodeMirror.defineMode(\"css\", function(config, parserConfig) {\n     \"border-inline-end-color\", \"border-inline-end-style\",\n     \"border-inline-end-width\", \"border-inline-start\", \"border-inline-start-color\",\n     \"border-inline-start-style\", \"border-inline-start-width\",\n-    \"border-inline-style\", \"border-inline-width\", \"margin-block\",\n+    \"border-inline-style\", \"border-inline-width\", \"content-visibility\", \"margin-block\",\n     \"margin-block-end\", \"margin-block-start\", \"margin-inline\", \"margin-inline-end\",\n-    \"margin-inline-start\", \"padding-block\", \"padding-block-end\",\n+    \"margin-inline-start\", \"overflow-anchor\", \"overscroll-behavior\", \"padding-block\", \"padding-block-end\",\n     \"padding-block-start\", \"padding-inline\", \"padding-inline-end\",\n     \"padding-inline-start\", \"scroll-snap-stop\", \"scrollbar-3d-light-color\",\n     \"scrollbar-arrow-color\", \"scrollbar-base-color\", \"scrollbar-dark-shadow-color\",\n@@ -598,16 +600,16 @@ CodeMirror.defineMode(\"css\", function(config, parserConfig) {\n     \"bisque\", \"black\", \"blanchedalmond\", \"blue\", \"blueviolet\", \"brown\",\n     \"burlywood\", \"cadetblue\", \"chartreuse\", \"chocolate\", \"coral\", \"cornflowerblue\",\n     \"cornsilk\", \"crimson\", \"cyan\", \"darkblue\", \"darkcyan\", \"darkgoldenrod\",\n-    \"darkgray\", \"darkgreen\", \"darkkhaki\", \"darkmagenta\", \"darkolivegreen\",\n+    \"darkgray\", \"darkgreen\", \"darkgrey\", \"darkkhaki\", \"darkmagenta\", \"darkolivegreen\",\n     \"darkorange\", \"darkorchid\", \"darkred\", \"darksalmon\", \"darkseagreen\",\n-    \"darkslateblue\", \"darkslategray\", \"darkturquoise\", \"darkviolet\",\n-    \"deeppink\", \"deepskyblue\", \"dimgray\", \"dodgerblue\", \"firebrick\",\n+    \"darkslateblue\", \"darkslategray\", \"darkslategrey\", \"darkturquoise\", \"darkviolet\",\n+    \"deeppink\", \"deepskyblue\", \"dimgray\", \"dimgrey\", \"dodgerblue\", \"firebrick\",\n     \"floralwhite\", \"forestgreen\", \"fuchsia\", \"gainsboro\", \"ghostwhite\",\n     \"gold\", \"goldenrod\", \"gray\", \"grey\", \"green\", \"greenyellow\", \"honeydew\",\n     \"hotpink\", \"indianred\", \"indigo\", \"ivory\", \"khaki\", \"lavender\",\n     \"lavenderblush\", \"lawngreen\", \"lemonchiffon\", \"lightblue\", \"lightcoral\",\n-    \"lightcyan\", \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightpink\",\n-    \"lightsalmon\", \"lightseagreen\", \"lightskyblue\", \"lightslategray\",\n+    \"lightcyan\", \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightgrey\", \"lightpink\",\n+    \"lightsalmon\", \"lightseagreen\", \"lightskyblue\", \"lightslategray\", \"lightslategrey\",\n     \"lightsteelblue\", \"lightyellow\", \"lime\", \"limegreen\", \"linen\", \"magenta\",\n     \"maroon\", \"mediumaquamarine\", \"mediumblue\", \"mediumorchid\", \"mediumpurple\",\n     \"mediumseagreen\", \"mediumslateblue\", \"mediumspringgreen\", \"mediumturquoise\",\n@@ -617,7 +619,7 @@ CodeMirror.defineMode(\"css\", function(config, parserConfig) {\n     \"papayawhip\", \"peachpuff\", \"peru\", \"pink\", \"plum\", \"powderblue\",\n     \"purple\", \"rebeccapurple\", \"red\", \"rosybrown\", \"royalblue\", \"saddlebrown\",\n     \"salmon\", \"sandybrown\", \"seagreen\", \"seashell\", \"sienna\", \"silver\", \"skyblue\",\n-    \"slateblue\", \"slategray\", \"snow\", \"springgreen\", \"steelblue\", \"tan\",\n+    \"slateblue\", \"slategray\", \"slategrey\", \"snow\", \"springgreen\", \"steelblue\", \"tan\",\n     \"teal\", \"thistle\", \"tomato\", \"turquoise\", \"violet\", \"wheat\", \"white\",\n     \"whitesmoke\", \"yellow\", \"yellowgreen\"\n   ], colorKeywords = keySet(colorKeywords_);\n@@ -628,21 +630,21 @@ CodeMirror.defineMode(\"css\", function(config, parserConfig) {\n     \"always\", \"amharic\", \"amharic-abegede\", \"antialiased\", \"appworkspace\",\n     \"arabic-indic\", \"armenian\", \"asterisks\", \"attr\", \"auto\", \"auto-flow\", \"avoid\", \"avoid-column\", \"avoid-page\",\n     \"avoid-region\", \"axis-pan\", \"background\", \"backwards\", \"baseline\", \"below\", \"bidi-override\", \"binary\",\n-    \"bengali\", \"blink\", \"block\", \"block-axis\", \"bold\", \"bolder\", \"border\", \"border-box\",\n-    \"both\", \"bottom\", \"break\", \"break-all\", \"break-word\", \"bullets\", \"button\", \"button-bevel\",\n+    \"bengali\", \"blink\", \"block\", \"block-axis\", \"blur\", \"bold\", \"bolder\", \"border\", \"border-box\",\n+    \"both\", \"bottom\", \"break\", \"break-all\", \"break-word\", \"brightness\", \"bullets\", \"button\", \"button-bevel\",\n     \"buttonface\", \"buttonhighlight\", \"buttonshadow\", \"buttontext\", \"calc\", \"cambodian\",\n     \"capitalize\", \"caps-lock-indicator\", \"caption\", \"captiontext\", \"caret\",\n     \"cell\", \"center\", \"checkbox\", \"circle\", \"cjk-decimal\", \"cjk-earthly-branch\",\n     \"cjk-heavenly-stem\", \"cjk-ideographic\", \"clear\", \"clip\", \"close-quote\",\n     \"col-resize\", \"collapse\", \"color\", \"color-burn\", \"color-dodge\", \"column\", \"column-reverse\",\n-    \"compact\", \"condensed\", \"contain\", \"content\", \"contents\",\n-    \"content-box\", \"context-menu\", \"continuous\", \"copy\", \"counter\", \"counters\", \"cover\", \"crop\",\n-    \"cross\", \"crosshair\", \"currentcolor\", \"cursive\", \"cyclic\", \"darken\", \"dashed\", \"decimal\",\n+    \"compact\", \"condensed\", \"conic-gradient\", \"contain\", \"content\", \"contents\",\n+    \"content-box\", \"context-menu\", \"continuous\", \"contrast\", \"copy\", \"counter\", \"counters\", \"cover\", \"crop\",\n+    \"cross\", \"crosshair\", \"cubic-bezier\", \"currentcolor\", \"cursive\", \"cyclic\", \"darken\", \"dashed\", \"decimal\",\n     \"decimal-leading-zero\", \"default\", \"default-button\", \"dense\", \"destination-atop\",\n     \"destination-in\", \"destination-out\", \"destination-over\", \"devanagari\", \"difference\",\n     \"disc\", \"discard\", \"disclosure-closed\", \"disclosure-open\", \"document\",\n     \"dot-dash\", \"dot-dot-dash\",\n-    \"dotted\", \"double\", \"down\", \"e-resize\", \"ease\", \"ease-in\", \"ease-in-out\", \"ease-out\",\n+    \"dotted\", \"double\", \"down\", \"drop-shadow\", \"e-resize\", \"ease\", \"ease-in\", \"ease-in-out\", \"ease-out\",\n     \"element\", \"ellipse\", \"ellipsis\", \"embed\", \"end\", \"ethiopic\", \"ethiopic-abegede\",\n     \"ethiopic-abegede-am-et\", \"ethiopic-abegede-gez\", \"ethiopic-abegede-ti-er\",\n     \"ethiopic-abegede-ti-et\", \"ethiopic-halehame-aa-er\",\n@@ -652,10 +654,10 @@ CodeMirror.defineMode(\"css\", function(config, parserConfig) {\n     \"ethiopic-halehame-ti-er\", \"ethiopic-halehame-ti-et\", \"ethiopic-halehame-tig\",\n     \"ethiopic-numeric\", \"ew-resize\", \"exclusion\", \"expanded\", \"extends\", \"extra-condensed\",\n     \"extra-expanded\", \"fantasy\", \"fast\", \"fill\", \"fill-box\", \"fixed\", \"flat\", \"flex\", \"flex-end\", \"flex-start\", \"footnotes\",\n-    \"forwards\", \"from\", \"geometricPrecision\", \"georgian\", \"graytext\", \"grid\", \"groove\",\n+    \"forwards\", \"from\", \"geometricPrecision\", \"georgian\", \"grayscale\", \"graytext\", \"grid\", \"groove\",\n     \"gujarati\", \"gurmukhi\", \"hand\", \"hangul\", \"hangul-consonant\", \"hard-light\", \"hebrew\",\n     \"help\", \"hidden\", \"hide\", \"higher\", \"highlight\", \"highlighttext\",\n-    \"hiragana\", \"hiragana-iroha\", \"horizontal\", \"hsl\", \"hsla\", \"hue\", \"icon\", \"ignore\",\n+    \"hiragana\", \"hiragana-iroha\", \"horizontal\", \"hsl\", \"hsla\", \"hue\", \"hue-rotate\", \"icon\", \"ignore\",\n     \"inactiveborder\", \"inactivecaption\", \"inactivecaptiontext\", \"infinite\",\n     \"infobackground\", \"infotext\", \"inherit\", \"initial\", \"inline\", \"inline-axis\",\n     \"inline-block\", \"inline-flex\", \"inline-grid\", \"inline-table\", \"inset\", \"inside\", \"intrinsic\", \"invert\",\n@@ -685,15 +687,15 @@ CodeMirror.defineMode(\"css\", function(config, parserConfig) {\n     \"pointer\", \"polygon\", \"portrait\", \"pre\", \"pre-line\", \"pre-wrap\", \"preserve-3d\",\n     \"progress\", \"push-button\", \"radial-gradient\", \"radio\", \"read-only\",\n     \"read-write\", \"read-write-plaintext-only\", \"rectangle\", \"region\",\n-    \"relative\", \"repeat\", \"repeating-linear-gradient\",\n-    \"repeating-radial-gradient\", \"repeat-x\", \"repeat-y\", \"reset\", \"reverse\",\n+    \"relative\", \"repeat\", \"repeating-linear-gradient\", \"repeating-radial-gradient\",\n+    \"repeating-conic-gradient\", \"repeat-x\", \"repeat-y\", \"reset\", \"reverse\",\n     \"rgb\", \"rgba\", \"ridge\", \"right\", \"rotate\", \"rotate3d\", \"rotateX\", \"rotateY\",\n     \"rotateZ\", \"round\", \"row\", \"row-resize\", \"row-reverse\", \"rtl\", \"run-in\", \"running\",\n-    \"s-resize\", \"sans-serif\", \"saturation\", \"scale\", \"scale3d\", \"scaleX\", \"scaleY\", \"scaleZ\", \"screen\",\n+    \"s-resize\", \"sans-serif\", \"saturate\", \"saturation\", \"scale\", \"scale3d\", \"scaleX\", \"scaleY\", \"scaleZ\", \"screen\",\n     \"scroll\", \"scrollbar\", \"scroll-position\", \"se-resize\", \"searchfield\",\n     \"searchfield-cancel-button\", \"searchfield-decoration\",\n     \"searchfield-results-button\", \"searchfield-results-decoration\", \"self-start\", \"self-end\",\n-    \"semi-condensed\", \"semi-expanded\", \"separate\", \"serif\", \"show\", \"sidama\",\n+    \"semi-condensed\", \"semi-expanded\", \"separate\", \"sepia\", \"serif\", \"show\", \"sidama\",\n     \"simp-chinese-formal\", \"simp-chinese-informal\", \"single\",\n     \"skew\", \"skewX\", \"skewY\", \"skip-white-space\", \"slide\", \"slider-horizontal\",\n     \"slider-vertical\", \"sliderthumb-horizontal\", \"sliderthumb-vertical\", \"slow\",\ndiff --git a/mode/factor/factor.js b/mode/factor/factor.js\nindex 4c876d4d..d3f7d499 100644\n--- a/mode/factor/factor.js\n+++ b/mode/factor/factor.js\n@@ -77,7 +77,7 @@\n     // specific to simple modes.\n     meta: {\n       dontIndentStates: [\"start\", \"vocabulary\", \"string\", \"string3\", \"stack\"],\n-      lineComment: [ \"!\", \"#!\" ]\n+      lineComment: \"!\"\n     }\n   });\n \ndiff --git a/mode/gas/gas.js b/mode/gas/gas.js\nindex b3515abe..016dc29d 100644\n--- a/mode/gas/gas.js\n+++ b/mode/gas/gas.js\n@@ -144,18 +144,26 @@ CodeMirror.defineMode(\"gas\", function(_config, parserConfig) {\n   function x86(_parserConfig) {\n     lineCommentStartSymbol = \"#\";\n \n+    registers.al  = \"variable\";\n+    registers.ah  = \"variable\";\n     registers.ax  = \"variable\";\n     registers.eax = \"variable-2\";\n     registers.rax = \"variable-3\";\n \n+    registers.bl  = \"variable\";\n+    registers.bh  = \"variable\";\n     registers.bx  = \"variable\";\n     registers.ebx = \"variable-2\";\n     registers.rbx = \"variable-3\";\n \n+    registers.cl  = \"variable\";\n+    registers.ch  = \"variable\";\n     registers.cx  = \"variable\";\n     registers.ecx = \"variable-2\";\n     registers.rcx = \"variable-3\";\n \n+    registers.dl  = \"variable\";\n+    registers.dh  = \"variable\";\n     registers.dx  = \"variable\";\n     registers.edx = \"variable-2\";\n     registers.rdx = \"variable-3\";\ndiff --git a/mode/javascript/javascript.js b/mode/javascript/javascript.js\nindex 95cbbd85..7cfee313 100644\n--- a/mode/javascript/javascript.js\n+++ b/mode/javascript/javascript.js\n@@ -330,6 +330,7 @@ CodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n     cx.state.context = new Context(cx.state.context, cx.state.localVars, true)\n     cx.state.localVars = null\n   }\n+  pushcontext.lex = pushblockcontext.lex = true\n   function popcontext() {\n     cx.state.localVars = cx.state.context.vars\n     cx.state.context = cx.state.context.prev\ndiff --git a/mode/julia/julia.js b/mode/julia/julia.js\nindex de9f987d..cb0d69c8 100644\n--- a/mode/julia/julia.js\n+++ b/mode/julia/julia.js\n@@ -12,9 +12,10 @@\n \"use strict\";\n \n CodeMirror.defineMode(\"julia\", function(config, parserConf) {\n-  function wordRegexp(words, end) {\n+  function wordRegexp(words, end, pre) {\n+    if (typeof pre === \"undefined\") { pre = \"\"; }\n     if (typeof end === \"undefined\") { end = \"\\\\b\"; }\n-    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\" + end);\n+    return new RegExp(\"^\" + pre + \"((\" + words.join(\")|(\") + \"))\" + end);\n   }\n \n   var octChar = \"\\\\\\\\[0-7]{1,3}\";\n@@ -22,13 +23,18 @@ CodeMirror.defineMode(\"julia\", function(config, parserConf) {\n   var sChar = \"\\\\\\\\[abefnrtv0%?'\\\"\\\\\\\\]\";\n   var uChar = \"([^\\\\u0027\\\\u005C\\\\uD800-\\\\uDFFF]|[\\\\uD800-\\\\uDFFF][\\\\uDC00-\\\\uDFFF])\";\n \n+  var asciiOperatorsList = [\n+    \"[<>]:\", \"[<>=]=\", \"<<=?\", \">>>?=?\", \"=>\", \"--?>\", \"<--[->]?\", \"\\\\/\\\\/\",\n+    \"\\\\.{2,3}\", \"[\\\\.\\\\\\\\%*+\\\\-<>!\\\\/^|&]=?\", \"\\\\?\", \"\\\\$\", \"~\", \":\"\n+  ];\n   var operators = parserConf.operators || wordRegexp([\n-        \"[<>]:\", \"[<>=]=\", \"<<=?\", \">>>?=?\", \"=>\", \"->\", \"\\\\/\\\\/\",\n-        \"[\\\\\\\\%*+\\\\-<>!=\\\\/^|&\\\\u00F7\\\\u22BB]=?\", \"\\\\?\", \"\\\\$\", \"~\", \":\",\n-        \"\\\\u00D7\", \"\\\\u2208\", \"\\\\u2209\", \"\\\\u220B\", \"\\\\u220C\", \"\\\\u2218\",\n-        \"\\\\u221A\", \"\\\\u221B\", \"\\\\u2229\", \"\\\\u222A\", \"\\\\u2260\", \"\\\\u2264\",\n-        \"\\\\u2265\", \"\\\\u2286\", \"\\\\u2288\", \"\\\\u228A\", \"\\\\u22C5\",\n-        \"\\\\b(in|isa)\\\\b(?!\\.?\\\\()\"], \"\");\n+    \"[<>]:\", \"[<>=]=\", \"<<=?\", \">>>?=?\", \"=>\", \"--?>\", \"<--[->]?\", \"\\\\/\\\\/\",\n+    \"[\\\\\\\\%*+\\\\-<>!\\\\/^|&\\\\u00F7\\\\u22BB]=?\", \"\\\\?\", \"\\\\$\", \"~\", \":\",\n+    \"\\\\u00D7\", \"\\\\u2208\", \"\\\\u2209\", \"\\\\u220B\", \"\\\\u220C\", \"\\\\u2218\",\n+    \"\\\\u221A\", \"\\\\u221B\", \"\\\\u2229\", \"\\\\u222A\", \"\\\\u2260\", \"\\\\u2264\",\n+    \"\\\\u2265\", \"\\\\u2286\", \"\\\\u2288\", \"\\\\u228A\", \"\\\\u22C5\",\n+    \"\\\\b(in|isa)\\\\b(?!\\.?\\\\()\"\n+  ], \"\");\n   var delimiters = parserConf.delimiters || /^[;,()[\\]{}]/;\n   var identifiers = parserConf.identifiers ||\n         /^[_A-Za-z\\u00A1-\\u2217\\u2219-\\uFFFF][\\w\\u00A1-\\u2217\\u2219-\\uFFFF]*!*/;\n@@ -57,10 +63,13 @@ CodeMirror.defineMode(\"julia\", function(config, parserConf) {\n   var keywords = wordRegexp(keywordsList);\n   var builtins = wordRegexp(builtinsList);\n \n-  var macro = /^@[_A-Za-z][\\w]*/;\n+  var macro = /^@[_A-Za-z\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF]*!*/;\n   var symbol = /^:[_A-Za-z\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF]*!*/;\n   var stringPrefixes = /^(`|([_A-Za-z\\u00A1-\\uFFFF]*\"(\"\")?))/;\n \n+  var macroOperators = wordRegexp(asciiOperatorsList, \"\", \"@\");\n+  var symbolOperators = wordRegexp(asciiOperatorsList, \"\", \":\");\n+\n   function inArray(state) {\n     return (state.nestedArrays > 0);\n   }\n@@ -165,8 +174,7 @@ CodeMirror.defineMode(\"julia\", function(config, parserConf) {\n     }\n \n     // Handle symbols\n-    if (!leavingExpr && stream.match(symbol) ||\n-        stream.match(/:([<>]:|<<=?|>>>?=?|->|\\/\\/|\\.{2,3}|[\\.\\\\%*+\\-<>!\\/^|&]=?|[~\\?\\$])/)) {\n+    if (!leavingExpr && (stream.match(symbol) || stream.match(symbolOperators))) {\n       return \"builtin\";\n     }\n \n@@ -212,7 +220,7 @@ CodeMirror.defineMode(\"julia\", function(config, parserConf) {\n       return state.tokenize(stream, state);\n     }\n \n-    if (stream.match(macro)) {\n+    if (stream.match(macro) || stream.match(macroOperators)) {\n       return \"meta\";\n     }\n \ndiff --git a/mode/meta.js b/mode/meta.js\nindex 477d6ae2..38d5e013 100644\n--- a/mode/meta.js\n+++ b/mode/meta.js\n@@ -19,7 +19,7 @@\n     {name: \"Brainfuck\", mime: \"text/x-brainfuck\", mode: \"brainfuck\", ext: [\"b\", \"bf\"]},\n     {name: \"C\", mime: \"text/x-csrc\", mode: \"clike\", ext: [\"c\", \"h\", \"ino\"]},\n     {name: \"C++\", mime: \"text/x-c++src\", mode: \"clike\", ext: [\"cpp\", \"c++\", \"cc\", \"cxx\", \"hpp\", \"h++\", \"hh\", \"hxx\"], alias: [\"cpp\"]},\n-    {name: \"Cobol\", mime: \"text/x-cobol\", mode: \"cobol\", ext: [\"cob\", \"cpy\"]},\n+    {name: \"Cobol\", mime: \"text/x-cobol\", mode: \"cobol\", ext: [\"cob\", \"cpy\", \"cbl\"]},\n     {name: \"C#\", mime: \"text/x-csharp\", mode: \"clike\", ext: [\"cs\"], alias: [\"csharp\", \"cs\"]},\n     {name: \"Clojure\", mime: \"text/x-clojure\", mode: \"clojure\", ext: [\"clj\", \"cljc\", \"cljx\"]},\n     {name: \"ClojureScript\", mime: \"text/x-clojurescript\", mode: \"clojure\", ext: [\"cljs\"]},\ndiff --git a/mode/nsis/nsis.js b/mode/nsis/nsis.js\nindex 636940f5..7e419f03 100644\n--- a/mode/nsis/nsis.js\n+++ b/mode/nsis/nsis.js\n@@ -24,14 +24,14 @@ CodeMirror.defineSimpleMode(\"nsis\",{\n     { regex: /`(?:[^\\\\`]|\\\\.)*`?/, token: \"string\" },\n \n     // Compile Time Commands\n-    {regex: /^\\s*(?:\\!(include|addincludedir|addplugindir|appendfile|cd|delfile|echo|error|execute|packhdr|pragma|finalize|getdllversion|gettlbversion|system|tempfile|warning|verbose|define|undef|insertmacro|macro|macroend|makensis|searchparse|searchreplace))\\b/, token: \"keyword\"},\n+    {regex: /^\\s*(?:\\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|error|execute|finalize|getdllversion|gettlbversion|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|uninstfinalize|verbose|warning))\\b/, token: \"keyword\"},\n \n     // Conditional Compilation\n     {regex: /^\\s*(?:\\!(if(?:n?def)?|ifmacron?def|macro))\\b/, token: \"keyword\", indent: true},\n     {regex: /^\\s*(?:\\!(else|endif|macroend))\\b/, token: \"keyword\", dedent: true},\n \n     // Runtime Commands\n-    {regex: /^\\s*(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecShellWait|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetKnownFolderPath|GetLabelAddress|GetTempFileName|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfRtlLanguage|IfShellVarContextAll|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|Int64Cmp|Int64CmpU|Int64Fmt|IntCmp|IntCmpU|IntFmt|IntOp|IntPtrCmp|IntPtrCmpU|IntPtrOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadAndSetImage|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestLongPathAware|ManifestMaxVersionTested|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|PEAddResource|PEDllCharacteristics|PERemoveResource|PESubsysVer|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegMultiStr|WriteRegNone|WriteRegStr|WriteUninstaller|XPStyle)\\b/, token: \"keyword\"},\n+    {regex: /^\\s*(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecShellWait|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetKnownFolderPath|GetLabelAddress|GetTempFileName|GetWinVer|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfRtlLanguage|IfShellVarContextAll|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|Int64Cmp|Int64CmpU|Int64Fmt|IntCmp|IntCmpU|IntFmt|IntOp|IntPtrCmp|IntPtrCmpU|IntPtrOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadAndSetImage|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestLongPathAware|ManifestMaxVersionTested|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|PEAddResource|PEDllCharacteristics|PERemoveResource|PESubsysVer|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegMultiStr|WriteRegNone|WriteRegStr|WriteUninstaller|XPStyle)\\b/, token: \"keyword\"},\n     {regex: /^\\s*(?:Function|PageEx|Section(?:Group)?)\\b/, token: \"keyword\", indent: true},\n     {regex: /^\\s*(?:(Function|PageEx|Section(?:Group)?)End)\\b/, token: \"keyword\", dedent: true},\n \n@@ -71,13 +71,13 @@ CodeMirror.defineSimpleMode(\"nsis\",{\n     {regex: /[-+\\/*=<>!]+/, token: \"operator\"},\n \n     // Variable\n-    {regex: /\\$\\w+/, token: \"variable\"},\n+    {regex: /\\$\\w[\\w\\.]*/, token: \"variable\"},\n \n     // Constant\n-    {regex: /\\${[\\w\\.:-]+}/, token: \"variable-2\"},\n+    {regex: /\\${[\\!\\w\\.:-]+}/, token: \"variable-2\"},\n \n     // Language String\n-    {regex: /\\$\\([\\w\\.:-]+\\)/, token: \"variable-3\"}\n+    {regex: /\\$\\([\\!\\w\\.:-]+\\)/, token: \"variable-3\"}\n   ],\n   comment: [\n     {regex: /.*?\\*\\//, token: \"comment\", next: \"start\"},\ndiff --git a/mode/php/php.js b/mode/php/php.js\nindex b2cae960..127b4a23 100644\n--- a/mode/php/php.js\n+++ b/mode/php/php.js\n@@ -80,11 +80,11 @@\n   }\n \n   var phpKeywords = \"abstract and array as break case catch class clone const continue declare default \" +\n-    \"do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final \" +\n+    \"do else elseif enddeclare endfor endforeach endif endswitch endwhile enum extends final \" +\n     \"for foreach function global goto if implements interface instanceof namespace \" +\n     \"new or private protected public static switch throw trait try use var while xor \" +\n     \"die echo empty exit eval include include_once isset list require require_once return \" +\n-    \"print unset __halt_compiler self static parent yield insteadof finally\";\n+    \"print unset __halt_compiler self static parent yield insteadof finally readonly match\";\n   var phpAtoms = \"true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__\";\n   var phpBuiltin = \"func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage memory_get_peak_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count\";\n   CodeMirror.registerHelper(\"hintWords\", \"php\", [phpKeywords, phpAtoms, phpBuiltin].join(\" \").split(\" \"));\n@@ -95,7 +95,7 @@\n     helperType: \"php\",\n     keywords: keywords(phpKeywords),\n     blockKeywords: keywords(\"catch do else elseif for foreach if switch try while finally\"),\n-    defKeywords: keywords(\"class function interface namespace trait\"),\n+    defKeywords: keywords(\"class enum function interface namespace trait\"),\n     atoms: keywords(phpAtoms),\n     builtin: keywords(phpBuiltin),\n     multiLineStrings: true,\ndiff --git a/mode/python/python.js b/mode/python/python.js\nindex a11c43f0..9e532ea1 100644\n--- a/mode/python/python.js\n+++ b/mode/python/python.js\n@@ -62,7 +62,7 @@\n       var identifiers = parserConf.identifiers|| /^[_A-Za-z\\u00A1-\\uFFFF][_A-Za-z0-9\\u00A1-\\uFFFF]*/;\n       myKeywords = myKeywords.concat([\"nonlocal\", \"False\", \"True\", \"None\", \"async\", \"await\"]);\n       myBuiltins = myBuiltins.concat([\"ascii\", \"bytes\", \"exec\", \"print\"]);\n-      var stringPrefixes = new RegExp(\"^(([rbuf]|(br)|(fr))?('{3}|\\\"{3}|['\\\"]))\", \"i\");\n+      var stringPrefixes = new RegExp(\"^(([rbuf]|(br)|(rb)|(fr)|(rf))?('{3}|\\\"{3}|['\\\"]))\", \"i\");\n     } else {\n       var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/;\n       myKeywords = myKeywords.concat([\"exec\", \"print\"]);\ndiff --git a/mode/scheme/scheme.js b/mode/scheme/scheme.js\nindex 370250d8..39627e28 100644\n--- a/mode/scheme/scheme.js\n+++ b/mode/scheme/scheme.js\n@@ -3,6 +3,7 @@\n \n /**\n  * Author: Koh Zi Han, based on implementation by Koh Zi Chun\n+ * Improved by: Jakub T. Jankiewicz\n  */\n \n (function(mod) {\n@@ -17,7 +18,7 @@\n \n CodeMirror.defineMode(\"scheme\", function () {\n     var BUILTIN = \"builtin\", COMMENT = \"comment\", STRING = \"string\",\n-        ATOM = \"atom\", NUMBER = \"number\", BRACKET = \"bracket\";\n+        SYMBOL = \"symbol\", ATOM = \"atom\", NUMBER = \"number\", BRACKET = \"bracket\";\n     var INDENT_WORD_SKIP = 2;\n \n     function makeKeywords(str) {\n@@ -67,6 +68,18 @@ CodeMirror.defineMode(\"scheme\", function () {\n         return stream.match(hexMatcher);\n     }\n \n+    function processEscapedSequence(stream, options) {\n+        var next, escaped = false;\n+        while ((next = stream.next()) != null) {\n+            if (next == options.token && !escaped) {\n+\n+                options.state.mode = false;\n+                break;\n+            }\n+            escaped = !escaped && next == \"\\\\\";\n+        }\n+    }\n+\n     return {\n         startState: function () {\n             return {\n@@ -92,17 +105,19 @@ CodeMirror.defineMode(\"scheme\", function () {\n \n             switch(state.mode){\n                 case \"string\": // multi-line string parsing mode\n-                    var next, escaped = false;\n-                    while ((next = stream.next()) != null) {\n-                        if (next == \"\\\"\" && !escaped) {\n-\n-                            state.mode = false;\n-                            break;\n-                        }\n-                        escaped = !escaped && next == \"\\\\\";\n-                    }\n+                    processEscapedSequence(stream, {\n+                        token: \"\\\"\",\n+                        state: state\n+                    });\n                     returnType = STRING; // continue on in scheme-string mode\n                     break;\n+                case \"symbol\": // escape symbol\n+                    processEscapedSequence(stream, {\n+                        token: \"|\",\n+                        state: state\n+                    });\n+                    returnType = SYMBOL; // continue on in scheme-symbol mode\n+                    break;\n                 case \"comment\": // comment parsing mode\n                     var next, maybeEnd = false;\n                     while ((next = stream.next()) != null) {\n@@ -143,6 +158,9 @@ CodeMirror.defineMode(\"scheme\", function () {\n                             stream.eatWhile(/[\\w_\\-!$%&*+\\.\\/:<=>?@\\^~]/);\n                             returnType = ATOM;\n                         }\n+                    } else if (ch == '|') {\n+                        state.mode = \"symbol\";\n+                        returnType = SYMBOL;\n                     } else if (ch == '#') {\n                         if (stream.eat(\"|\")) {                    // Multi-line comment\n                             state.mode = \"comment\"; // toggle to comment mode\ndiff --git a/mode/soy/soy.js b/mode/soy/soy.js\nindex 614c3f23..debe7268 100644\n--- a/mode/soy/soy.js\n+++ b/mode/soy/soy.js\n@@ -25,7 +25,7 @@\n     \"@state\": paramData,\n     \"template\": { soyState: \"templ-def\", variableScope: true},\n     \"extern\": {soyState: \"param-def\"},\n-    \"export\": {soyState: \"param-def\"},\n+    \"export\": {soyState: \"export\"},\n     \"literal\": { },\n     \"msg\": {},\n     \"fallbackmsg\": { noEndTag: true, reduceIndent: true},\n@@ -33,6 +33,8 @@\n     \"plural\": {},\n     \"let\": { soyState: \"var-def\" },\n     \"if\": {},\n+    \"javaimpl\": {},\n+    \"jsimpl\": {},\n     \"elseif\": { noEndTag: true, reduceIndent: true},\n     \"else\": { noEndTag: true, reduceIndent: true},\n     \"switch\": {},\n@@ -49,6 +51,7 @@\n     \"log\": {},\n     \"element\": { variableScope: true },\n     \"velog\": {},\n+    \"const\": { soyState: \"const-def\"},\n   };\n \n   var indentingTags = Object.keys(tags).filter(function(tag) {\n@@ -137,10 +140,10 @@\n         state.context = new Context(state.context, \"list-literal\", state.variables);\n         state.lookupVariables = false;\n         return null;\n-      } else if (stream.match(/map\\b/)) {\n+      } else if (stream.match(/\\bmap(?=\\()/)) {\n         state.soyState.push(\"map-literal\");\n         return \"keyword\";\n-      } else if (stream.match(/record\\b/)) {\n+      } else if (stream.match(/\\brecord(?=\\()/)) {\n         state.soyState.push(\"record-literal\");\n         return \"keyword\";\n       } else if (stream.match(/([\\w]+)(?=\\()/)) {\n@@ -285,9 +288,6 @@\n               return \"type\";\n             }\n             if (match = stream.match(/^\\w+/)) {\n-              if (match[0] == 'extern') {\n-                return 'keyword';\n-              }\n               state.variables = prepend(state.variables, match[0]);\n               state.soyState.pop();\n               state.soyState.push(\"param-type\");\n@@ -454,11 +454,11 @@\n               state.indent -= 2 * config.indentUnit;\n               return null;\n             }\n-            if (stream.match(/\\w+(?=\\s+as)/)) {\n+            if (stream.match(/\\w+(?=\\s+as\\b)/)) {\n               return \"variable\";\n             }\n             if (match = stream.match(/\\w+/)) {\n-              return /(from|as)/.test(match[0]) ? \"keyword\" : \"def\";\n+              return /\\b(from|as)\\b/.test(match[0]) ? \"keyword\" : \"def\";\n             }\n             if (match = stream.match(/^[\"']/)) {\n               state.soyState.push(\"string\");\n@@ -528,6 +528,27 @@\n               return this.token(stream, state);\n             }\n             return tokenUntil(stream, state, /\\{\\/literal}/);\n+          case \"export\":\n+            if (match = stream.match(/\\w+/)) {\n+              state.soyState.pop();\n+              if (match == \"const\") {\n+                state.soyState.push(\"const-def\")\n+                return \"keyword\";\n+              } else if (match == \"extern\") {\n+                state.soyState.push(\"param-def\")\n+                return \"keyword\";\n+              }\n+            } else {\n+              stream.next();\n+            }\n+            return null;\n+          case \"const-def\":\n+            if (stream.match(/^\\w+/)) {\n+              state.soyState.pop();\n+              return \"def\";\n+            }\n+            stream.next();\n+            return null;\n         }\n \n         if (stream.match('{literal}')) {\n@@ -584,7 +605,7 @@\n           state.indent += 2 * config.indentUnit;\n           state.soyState.push(\"tag\");\n           return \"keyword\";\n-        } else if (!state.context && stream.match(/\\bimport\\b/)) {\n+        } else if (!state.context && stream.sol() && stream.match(/import\\b/)) {\n           state.soyState.push(\"import\");\n           state.indent += 2 * config.indentUnit;\n           return \"keyword\";\ndiff --git a/mode/soy/test.js b/mode/soy/test.js\nindex 6f47a5eb..44e7c4c2 100644\n--- a/mode/soy/test.js\n+++ b/mode/soy/test.js\n@@ -315,4 +315,8 @@\n   MT('extern', '[keyword {extern] [def renderer]: ([def s]:[type string])=>[type string][keyword }] [keyword {/extern}]');\n \n   MT('export extern', '[keyword {export] [keyword extern] [def renderer]: ([def s]:[type string])=>[type string][keyword }] [keyword {/extern}]');\n+\n+  MT('const',\n+    '[keyword {const] [def FOO] = [atom 5] [keyword /}]',\n+    '[keyword {export] [keyword const] [def FOO] = [atom 5] [keyword /}]');\n })();\ndiff --git a/mode/sql/sql.js b/mode/sql/sql.js\nindex ead4d6db..cd8b757b 100644\n--- a/mode/sql/sql.js\n+++ b/mode/sql/sql.js\n@@ -122,9 +122,9 @@ CodeMirror.defineMode(\"sql\", function(config, parserConfig) {\n       if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+\"[^\"]*\"/)))\n         return \"number\";\n       if (atoms.hasOwnProperty(word)) return \"atom\";\n-      if (builtin.hasOwnProperty(word)) return \"builtin\";\n+      if (builtin.hasOwnProperty(word)) return \"type\";\n       if (keywords.hasOwnProperty(word)) return \"keyword\";\n-      if (client.hasOwnProperty(word)) return \"string-2\";\n+      if (client.hasOwnProperty(word)) return \"builtin\";\n       return null;\n     }\n   }\n@@ -332,7 +332,7 @@ CodeMirror.defineMode(\"sql\", function(config, parserConfig) {\n   CodeMirror.defineMIME(\"text/x-mariadb\", {\n     name: \"sql\",\n     client: set(\"charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee\"),\n-    keywords: set(sqlKeywords + \"accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat\"),\n+    keywords: set(sqlKeywords + \"accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group group_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat\"),\n     builtin: set(\"bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric\"),\n     atoms: set(\"false true null unknown\"),\n     operatorChars: /^[*+\\-%<>!=&|^]/,\n@@ -452,7 +452,7 @@ CodeMirror.defineMode(\"sql\", function(config, parserConfig) {\n   CodeMirror.defineMIME(\"text/x-sparksql\", {\n     name: \"sql\",\n     keywords: set(\"add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases data dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with\"),\n-    builtin: set(\"tinyint smallint int bigint boolean float double string binary timestamp decimal array map struct uniontype delimited serde sequencefile textfile rcfile inputformat outputformat\"),\n+    builtin: set(\"abs acos acosh add_months aggregate and any approx_count_distinct approx_percentile array array_contains array_distinct array_except array_intersect array_join array_max array_min array_position array_remove array_repeat array_sort array_union arrays_overlap arrays_zip ascii asin asinh assert_true atan atan2 atanh avg base64 between bigint bin binary bit_and bit_count bit_get bit_length bit_or bit_xor bool_and bool_or boolean bround btrim cardinality case cast cbrt ceil ceiling char char_length character_length chr coalesce collect_list collect_set concat concat_ws conv corr cos cosh cot count count_if count_min_sketch covar_pop covar_samp crc32 cume_dist current_catalog current_database current_date current_timestamp current_timezone current_user date date_add date_format date_from_unix_date date_part date_sub date_trunc datediff day dayofmonth dayofweek dayofyear decimal decode degrees delimited dense_rank div double e element_at elt encode every exists exp explode explode_outer expm1 extract factorial filter find_in_set first first_value flatten float floor forall format_number format_string from_csv from_json from_unixtime from_utc_timestamp get_json_object getbit greatest grouping grouping_id hash hex hour hypot if ifnull in initcap inline inline_outer input_file_block_length input_file_block_start input_file_name inputformat instr int isnan isnotnull isnull java_method json_array_length json_object_keys json_tuple kurtosis lag last last_day last_value lcase lead least left length levenshtein like ln locate log log10 log1p log2 lower lpad ltrim make_date make_dt_interval make_interval make_timestamp make_ym_interval map map_concat map_entries map_filter map_from_arrays map_from_entries map_keys map_values map_zip_with max max_by md5 mean min min_by minute mod monotonically_increasing_id month months_between named_struct nanvl negative next_day not now nth_value ntile nullif nvl nvl2 octet_length or outputformat overlay parse_url percent_rank percentile percentile_approx pi pmod posexplode posexplode_outer position positive pow power printf quarter radians raise_error rand randn random rank rcfile reflect regexp regexp_extract regexp_extract_all regexp_like regexp_replace repeat replace reverse right rint rlike round row_number rpad rtrim schema_of_csv schema_of_json second sentences sequence sequencefile serde session_window sha sha1 sha2 shiftleft shiftright shiftrightunsigned shuffle sign signum sin sinh size skewness slice smallint some sort_array soundex space spark_partition_id split sqrt stack std stddev stddev_pop stddev_samp str_to_map string struct substr substring substring_index sum tan tanh textfile timestamp timestamp_micros timestamp_millis timestamp_seconds tinyint to_csv to_date to_json to_timestamp to_unix_timestamp to_utc_timestamp transform transform_keys transform_values translate trim trunc try_add try_divide typeof ucase unbase64 unhex uniontype unix_date unix_micros unix_millis unix_seconds unix_timestamp upper uuid var_pop var_samp variance version weekday weekofyear when width_bucket window xpath xpath_boolean xpath_double xpath_float xpath_int xpath_long xpath_number xpath_short xpath_string xxhash64 year zip_with\"),\n     atoms: set(\"false true null\"),\n     operatorChars: /^[*\\/+\\-%<>!=~&|^]/,\n     dateSQL: set(\"date time timestamp\"),\ndiff --git a/mode/stylus/stylus.js b/mode/stylus/stylus.js\nindex 5cddff03..978696bd 100644\n--- a/mode/stylus/stylus.js\n+++ b/mode/stylus/stylus.js\n@@ -737,12 +737,12 @@\n   // Note, \"url-prefix\" should precede \"url\" in order to match correctly in documentTypesRegexp\n   var documentTypes_ = [\"domain\", \"regexp\", \"url-prefix\", \"url\"];\n   var mediaTypes_ = [\"all\",\"aural\",\"braille\",\"handheld\",\"print\",\"projection\",\"screen\",\"tty\",\"tv\",\"embossed\"];\n-  var mediaFeatures_ = [\"width\",\"min-width\",\"max-width\",\"height\",\"min-height\",\"max-height\",\"device-width\",\"min-device-width\",\"max-device-width\",\"device-height\",\"min-device-height\",\"max-device-height\",\"aspect-ratio\",\"min-aspect-ratio\",\"max-aspect-ratio\",\"device-aspect-ratio\",\"min-device-aspect-ratio\",\"max-device-aspect-ratio\",\"color\",\"min-color\",\"max-color\",\"color-index\",\"min-color-index\",\"max-color-index\",\"monochrome\",\"min-monochrome\",\"max-monochrome\",\"resolution\",\"min-resolution\",\"max-resolution\",\"scan\",\"grid\"];\n+  var mediaFeatures_ = [\"width\",\"min-width\",\"max-width\",\"height\",\"min-height\",\"max-height\",\"device-width\",\"min-device-width\",\"max-device-width\",\"device-height\",\"min-device-height\",\"max-device-height\",\"aspect-ratio\",\"min-aspect-ratio\",\"max-aspect-ratio\",\"device-aspect-ratio\",\"min-device-aspect-ratio\",\"max-device-aspect-ratio\",\"color\",\"min-color\",\"max-color\",\"color-index\",\"min-color-index\",\"max-color-index\",\"monochrome\",\"min-monochrome\",\"max-monochrome\",\"resolution\",\"min-resolution\",\"max-resolution\",\"scan\",\"grid\",\"dynamic-range\",\"video-dynamic-range\"];\n   var propertyKeywords_ = [\"align-content\",\"align-items\",\"align-self\",\"alignment-adjust\",\"alignment-baseline\",\"anchor-point\",\"animation\",\"animation-delay\",\"animation-direction\",\"animation-duration\",\"animation-fill-mode\",\"animation-iteration-count\",\"animation-name\",\"animation-play-state\",\"animation-timing-function\",\"appearance\",\"azimuth\",\"backface-visibility\",\"background\",\"background-attachment\",\"background-clip\",\"background-color\",\"background-image\",\"background-origin\",\"background-position\",\"background-repeat\",\"background-size\",\"baseline-shift\",\"binding\",\"bleed\",\"bookmark-label\",\"bookmark-level\",\"bookmark-state\",\"bookmark-target\",\"border\",\"border-bottom\",\"border-bottom-color\",\"border-bottom-left-radius\",\"border-bottom-right-radius\",\"border-bottom-style\",\"border-bottom-width\",\"border-collapse\",\"border-color\",\"border-image\",\"border-image-outset\",\"border-image-repeat\",\"border-image-slice\",\"border-image-source\",\"border-image-width\",\"border-left\",\"border-left-color\",\"border-left-style\",\"border-left-width\",\"border-radius\",\"border-right\",\"border-right-color\",\"border-right-style\",\"border-right-width\",\"border-spacing\",\"border-style\",\"border-top\",\"border-top-color\",\"border-top-left-radius\",\"border-top-right-radius\",\"border-top-style\",\"border-top-width\",\"border-width\",\"bottom\",\"box-decoration-break\",\"box-shadow\",\"box-sizing\",\"break-after\",\"break-before\",\"break-inside\",\"caption-side\",\"clear\",\"clip\",\"color\",\"color-profile\",\"column-count\",\"column-fill\",\"column-gap\",\"column-rule\",\"column-rule-color\",\"column-rule-style\",\"column-rule-width\",\"column-span\",\"column-width\",\"columns\",\"content\",\"counter-increment\",\"counter-reset\",\"crop\",\"cue\",\"cue-after\",\"cue-before\",\"cursor\",\"direction\",\"display\",\"dominant-baseline\",\"drop-initial-after-adjust\",\"drop-initial-after-align\",\"drop-initial-before-adjust\",\"drop-initial-before-align\",\"drop-initial-size\",\"drop-initial-value\",\"elevation\",\"empty-cells\",\"fit\",\"fit-position\",\"flex\",\"flex-basis\",\"flex-direction\",\"flex-flow\",\"flex-grow\",\"flex-shrink\",\"flex-wrap\",\"float\",\"float-offset\",\"flow-from\",\"flow-into\",\"font\",\"font-feature-settings\",\"font-family\",\"font-kerning\",\"font-language-override\",\"font-size\",\"font-size-adjust\",\"font-stretch\",\"font-style\",\"font-synthesis\",\"font-variant\",\"font-variant-alternates\",\"font-variant-caps\",\"font-variant-east-asian\",\"font-variant-ligatures\",\"font-variant-numeric\",\"font-variant-position\",\"font-weight\",\"grid\",\"grid-area\",\"grid-auto-columns\",\"grid-auto-flow\",\"grid-auto-position\",\"grid-auto-rows\",\"grid-column\",\"grid-column-end\",\"grid-column-start\",\"grid-row\",\"grid-row-end\",\"grid-row-start\",\"grid-template\",\"grid-template-areas\",\"grid-template-columns\",\"grid-template-rows\",\"hanging-punctuation\",\"height\",\"hyphens\",\"icon\",\"image-orientation\",\"image-rendering\",\"image-resolution\",\"inline-box-align\",\"justify-content\",\"left\",\"letter-spacing\",\"line-break\",\"line-height\",\"line-stacking\",\"line-stacking-ruby\",\"line-stacking-shift\",\"line-stacking-strategy\",\"list-style\",\"list-style-image\",\"list-style-position\",\"list-style-type\",\"margin\",\"margin-bottom\",\"margin-left\",\"margin-right\",\"margin-top\",\"marker-offset\",\"marks\",\"marquee-direction\",\"marquee-loop\",\"marquee-play-count\",\"marquee-speed\",\"marquee-style\",\"max-height\",\"max-width\",\"min-height\",\"min-width\",\"move-to\",\"nav-down\",\"nav-index\",\"nav-left\",\"nav-right\",\"nav-up\",\"object-fit\",\"object-position\",\"opacity\",\"order\",\"orphans\",\"outline\",\"outline-color\",\"outline-offset\",\"outline-style\",\"outline-width\",\"overflow\",\"overflow-style\",\"overflow-wrap\",\"overflow-x\",\"overflow-y\",\"padding\",\"padding-bottom\",\"padding-left\",\"padding-right\",\"padding-top\",\"page\",\"page-break-after\",\"page-break-before\",\"page-break-inside\",\"page-policy\",\"pause\",\"pause-after\",\"pause-before\",\"perspective\",\"perspective-origin\",\"pitch\",\"pitch-range\",\"play-during\",\"position\",\"presentation-level\",\"punctuation-trim\",\"quotes\",\"region-break-after\",\"region-break-before\",\"region-break-inside\",\"region-fragment\",\"rendering-intent\",\"resize\",\"rest\",\"rest-after\",\"rest-before\",\"richness\",\"right\",\"rotation\",\"rotation-point\",\"ruby-align\",\"ruby-overhang\",\"ruby-position\",\"ruby-span\",\"shape-image-threshold\",\"shape-inside\",\"shape-margin\",\"shape-outside\",\"size\",\"speak\",\"speak-as\",\"speak-header\",\"speak-numeral\",\"speak-punctuation\",\"speech-rate\",\"stress\",\"string-set\",\"tab-size\",\"table-layout\",\"target\",\"target-name\",\"target-new\",\"target-position\",\"text-align\",\"text-align-last\",\"text-decoration\",\"text-decoration-color\",\"text-decoration-line\",\"text-decoration-skip\",\"text-decoration-style\",\"text-emphasis\",\"text-emphasis-color\",\"text-emphasis-position\",\"text-emphasis-style\",\"text-height\",\"text-indent\",\"text-justify\",\"text-outline\",\"text-overflow\",\"text-shadow\",\"text-size-adjust\",\"text-space-collapse\",\"text-transform\",\"text-underline-position\",\"text-wrap\",\"top\",\"transform\",\"transform-origin\",\"transform-style\",\"transition\",\"transition-delay\",\"transition-duration\",\"transition-property\",\"transition-timing-function\",\"unicode-bidi\",\"vertical-align\",\"visibility\",\"voice-balance\",\"voice-duration\",\"voice-family\",\"voice-pitch\",\"voice-range\",\"voice-rate\",\"voice-stress\",\"voice-volume\",\"volume\",\"white-space\",\"widows\",\"width\",\"will-change\",\"word-break\",\"word-spacing\",\"word-wrap\",\"z-index\",\"clip-path\",\"clip-rule\",\"mask\",\"enable-background\",\"filter\",\"flood-color\",\"flood-opacity\",\"lighting-color\",\"stop-color\",\"stop-opacity\",\"pointer-events\",\"color-interpolation\",\"color-interpolation-filters\",\"color-rendering\",\"fill\",\"fill-opacity\",\"fill-rule\",\"image-rendering\",\"marker\",\"marker-end\",\"marker-mid\",\"marker-start\",\"shape-rendering\",\"stroke\",\"stroke-dasharray\",\"stroke-dashoffset\",\"stroke-linecap\",\"stroke-linejoin\",\"stroke-miterlimit\",\"stroke-opacity\",\"stroke-width\",\"text-rendering\",\"baseline-shift\",\"dominant-baseline\",\"glyph-orientation-horizontal\",\"glyph-orientation-vertical\",\"text-anchor\",\"writing-mode\",\"font-smoothing\",\"osx-font-smoothing\"];\n   var nonStandardPropertyKeywords_ = [\"scrollbar-arrow-color\",\"scrollbar-base-color\",\"scrollbar-dark-shadow-color\",\"scrollbar-face-color\",\"scrollbar-highlight-color\",\"scrollbar-shadow-color\",\"scrollbar-3d-light-color\",\"scrollbar-track-color\",\"shape-inside\",\"searchfield-cancel-button\",\"searchfield-decoration\",\"searchfield-results-button\",\"searchfield-results-decoration\",\"zoom\"];\n   var fontProperties_ = [\"font-family\",\"src\",\"unicode-range\",\"font-variant\",\"font-feature-settings\",\"font-stretch\",\"font-weight\",\"font-style\"];\n   var colorKeywords_ = [\"aliceblue\",\"antiquewhite\",\"aqua\",\"aquamarine\",\"azure\",\"beige\",\"bisque\",\"black\",\"blanchedalmond\",\"blue\",\"blueviolet\",\"brown\",\"burlywood\",\"cadetblue\",\"chartreuse\",\"chocolate\",\"coral\",\"cornflowerblue\",\"cornsilk\",\"crimson\",\"cyan\",\"darkblue\",\"darkcyan\",\"darkgoldenrod\",\"darkgray\",\"darkgreen\",\"darkkhaki\",\"darkmagenta\",\"darkolivegreen\",\"darkorange\",\"darkorchid\",\"darkred\",\"darksalmon\",\"darkseagreen\",\"darkslateblue\",\"darkslategray\",\"darkturquoise\",\"darkviolet\",\"deeppink\",\"deepskyblue\",\"dimgray\",\"dodgerblue\",\"firebrick\",\"floralwhite\",\"forestgreen\",\"fuchsia\",\"gainsboro\",\"ghostwhite\",\"gold\",\"goldenrod\",\"gray\",\"grey\",\"green\",\"greenyellow\",\"honeydew\",\"hotpink\",\"indianred\",\"indigo\",\"ivory\",\"khaki\",\"lavender\",\"lavenderblush\",\"lawngreen\",\"lemonchiffon\",\"lightblue\",\"lightcoral\",\"lightcyan\",\"lightgoldenrodyellow\",\"lightgray\",\"lightgreen\",\"lightpink\",\"lightsalmon\",\"lightseagreen\",\"lightskyblue\",\"lightslategray\",\"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\",\"slategray\",\"snow\",\"springgreen\",\"steelblue\",\"tan\",\"teal\",\"thistle\",\"tomato\",\"turquoise\",\"violet\",\"wheat\",\"white\",\"whitesmoke\",\"yellow\",\"yellowgreen\"];\n-  var valueKeywords_ = [\"above\",\"absolute\",\"activeborder\",\"additive\",\"activecaption\",\"afar\",\"after-white-space\",\"ahead\",\"alias\",\"all\",\"all-scroll\",\"alphabetic\",\"alternate\",\"always\",\"amharic\",\"amharic-abegede\",\"antialiased\",\"appworkspace\",\"arabic-indic\",\"armenian\",\"asterisks\",\"attr\",\"auto\",\"avoid\",\"avoid-column\",\"avoid-page\",\"avoid-region\",\"background\",\"backwards\",\"baseline\",\"below\",\"bidi-override\",\"binary\",\"bengali\",\"blink\",\"block\",\"block-axis\",\"bold\",\"bolder\",\"border\",\"border-box\",\"both\",\"bottom\",\"break\",\"break-all\",\"break-word\",\"bullets\",\"button\",\"button-bevel\",\"buttonface\",\"buttonhighlight\",\"buttonshadow\",\"buttontext\",\"calc\",\"cambodian\",\"capitalize\",\"caps-lock-indicator\",\"caption\",\"captiontext\",\"caret\",\"cell\",\"center\",\"checkbox\",\"circle\",\"cjk-decimal\",\"cjk-earthly-branch\",\"cjk-heavenly-stem\",\"cjk-ideographic\",\"clear\",\"clip\",\"close-quote\",\"col-resize\",\"collapse\",\"column\",\"compact\",\"condensed\",\"contain\",\"content\",\"contents\",\"content-box\",\"context-menu\",\"continuous\",\"copy\",\"counter\",\"counters\",\"cover\",\"crop\",\"cross\",\"crosshair\",\"currentcolor\",\"cursive\",\"cyclic\",\"dashed\",\"decimal\",\"decimal-leading-zero\",\"default\",\"default-button\",\"destination-atop\",\"destination-in\",\"destination-out\",\"destination-over\",\"devanagari\",\"disc\",\"discard\",\"disclosure-closed\",\"disclosure-open\",\"document\",\"dot-dash\",\"dot-dot-dash\",\"dotted\",\"double\",\"down\",\"e-resize\",\"ease\",\"ease-in\",\"ease-in-out\",\"ease-out\",\"element\",\"ellipse\",\"ellipsis\",\"embed\",\"end\",\"ethiopic\",\"ethiopic-abegede\",\"ethiopic-abegede-am-et\",\"ethiopic-abegede-gez\",\"ethiopic-abegede-ti-er\",\"ethiopic-abegede-ti-et\",\"ethiopic-halehame-aa-er\",\"ethiopic-halehame-aa-et\",\"ethiopic-halehame-am-et\",\"ethiopic-halehame-gez\",\"ethiopic-halehame-om-et\",\"ethiopic-halehame-sid-et\",\"ethiopic-halehame-so-et\",\"ethiopic-halehame-ti-er\",\"ethiopic-halehame-ti-et\",\"ethiopic-halehame-tig\",\"ethiopic-numeric\",\"ew-resize\",\"expanded\",\"extends\",\"extra-condensed\",\"extra-expanded\",\"fantasy\",\"fast\",\"fill\",\"fixed\",\"flat\",\"flex\",\"footnotes\",\"forwards\",\"from\",\"geometricPrecision\",\"georgian\",\"graytext\",\"groove\",\"gujarati\",\"gurmukhi\",\"hand\",\"hangul\",\"hangul-consonant\",\"hebrew\",\"help\",\"hidden\",\"hide\",\"higher\",\"highlight\",\"highlighttext\",\"hiragana\",\"hiragana-iroha\",\"horizontal\",\"hsl\",\"hsla\",\"icon\",\"ignore\",\"inactiveborder\",\"inactivecaption\",\"inactivecaptiontext\",\"infinite\",\"infobackground\",\"infotext\",\"inherit\",\"initial\",\"inline\",\"inline-axis\",\"inline-block\",\"inline-flex\",\"inline-table\",\"inset\",\"inside\",\"intrinsic\",\"invert\",\"italic\",\"japanese-formal\",\"japanese-informal\",\"justify\",\"kannada\",\"katakana\",\"katakana-iroha\",\"keep-all\",\"khmer\",\"korean-hangul-formal\",\"korean-hanja-formal\",\"korean-hanja-informal\",\"landscape\",\"lao\",\"large\",\"larger\",\"left\",\"level\",\"lighter\",\"line-through\",\"linear\",\"linear-gradient\",\"lines\",\"list-item\",\"listbox\",\"listitem\",\"local\",\"logical\",\"loud\",\"lower\",\"lower-alpha\",\"lower-armenian\",\"lower-greek\",\"lower-hexadecimal\",\"lower-latin\",\"lower-norwegian\",\"lower-roman\",\"lowercase\",\"ltr\",\"malayalam\",\"match\",\"matrix\",\"matrix3d\",\"media-controls-background\",\"media-current-time-display\",\"media-fullscreen-button\",\"media-mute-button\",\"media-play-button\",\"media-return-to-realtime-button\",\"media-rewind-button\",\"media-seek-back-button\",\"media-seek-forward-button\",\"media-slider\",\"media-sliderthumb\",\"media-time-remaining-display\",\"media-volume-slider\",\"media-volume-slider-container\",\"media-volume-sliderthumb\",\"medium\",\"menu\",\"menulist\",\"menulist-button\",\"menulist-text\",\"menulist-textfield\",\"menutext\",\"message-box\",\"middle\",\"min-intrinsic\",\"mix\",\"mongolian\",\"monospace\",\"move\",\"multiple\",\"myanmar\",\"n-resize\",\"narrower\",\"ne-resize\",\"nesw-resize\",\"no-close-quote\",\"no-drop\",\"no-open-quote\",\"no-repeat\",\"none\",\"normal\",\"not-allowed\",\"nowrap\",\"ns-resize\",\"numbers\",\"numeric\",\"nw-resize\",\"nwse-resize\",\"oblique\",\"octal\",\"open-quote\",\"optimizeLegibility\",\"optimizeSpeed\",\"oriya\",\"oromo\",\"outset\",\"outside\",\"outside-shape\",\"overlay\",\"overline\",\"padding\",\"padding-box\",\"painted\",\"page\",\"paused\",\"persian\",\"perspective\",\"plus-darker\",\"plus-lighter\",\"pointer\",\"polygon\",\"portrait\",\"pre\",\"pre-line\",\"pre-wrap\",\"preserve-3d\",\"progress\",\"push-button\",\"radial-gradient\",\"radio\",\"read-only\",\"read-write\",\"read-write-plaintext-only\",\"rectangle\",\"region\",\"relative\",\"repeat\",\"repeating-linear-gradient\",\"repeating-radial-gradient\",\"repeat-x\",\"repeat-y\",\"reset\",\"reverse\",\"rgb\",\"rgba\",\"ridge\",\"right\",\"rotate\",\"rotate3d\",\"rotateX\",\"rotateY\",\"rotateZ\",\"round\",\"row-resize\",\"rtl\",\"run-in\",\"running\",\"s-resize\",\"sans-serif\",\"scale\",\"scale3d\",\"scaleX\",\"scaleY\",\"scaleZ\",\"scroll\",\"scrollbar\",\"scroll-position\",\"se-resize\",\"searchfield\",\"searchfield-cancel-button\",\"searchfield-decoration\",\"searchfield-results-button\",\"searchfield-results-decoration\",\"semi-condensed\",\"semi-expanded\",\"separate\",\"serif\",\"show\",\"sidama\",\"simp-chinese-formal\",\"simp-chinese-informal\",\"single\",\"skew\",\"skewX\",\"skewY\",\"skip-white-space\",\"slide\",\"slider-horizontal\",\"slider-vertical\",\"sliderthumb-horizontal\",\"sliderthumb-vertical\",\"slow\",\"small\",\"small-caps\",\"small-caption\",\"smaller\",\"solid\",\"somali\",\"source-atop\",\"source-in\",\"source-out\",\"source-over\",\"space\",\"spell-out\",\"square\",\"square-button\",\"start\",\"static\",\"status-bar\",\"stretch\",\"stroke\",\"sub\",\"subpixel-antialiased\",\"super\",\"sw-resize\",\"symbolic\",\"symbols\",\"table\",\"table-caption\",\"table-cell\",\"table-column\",\"table-column-group\",\"table-footer-group\",\"table-header-group\",\"table-row\",\"table-row-group\",\"tamil\",\"telugu\",\"text\",\"text-bottom\",\"text-top\",\"textarea\",\"textfield\",\"thai\",\"thick\",\"thin\",\"threeddarkshadow\",\"threedface\",\"threedhighlight\",\"threedlightshadow\",\"threedshadow\",\"tibetan\",\"tigre\",\"tigrinya-er\",\"tigrinya-er-abegede\",\"tigrinya-et\",\"tigrinya-et-abegede\",\"to\",\"top\",\"trad-chinese-formal\",\"trad-chinese-informal\",\"translate\",\"translate3d\",\"translateX\",\"translateY\",\"translateZ\",\"transparent\",\"ultra-condensed\",\"ultra-expanded\",\"underline\",\"up\",\"upper-alpha\",\"upper-armenian\",\"upper-greek\",\"upper-hexadecimal\",\"upper-latin\",\"upper-norwegian\",\"upper-roman\",\"uppercase\",\"urdu\",\"url\",\"var\",\"vertical\",\"vertical-text\",\"visible\",\"visibleFill\",\"visiblePainted\",\"visibleStroke\",\"visual\",\"w-resize\",\"wait\",\"wave\",\"wider\",\"window\",\"windowframe\",\"windowtext\",\"words\",\"x-large\",\"x-small\",\"xor\",\"xx-large\",\"xx-small\",\"bicubic\",\"optimizespeed\",\"grayscale\",\"row\",\"row-reverse\",\"wrap\",\"wrap-reverse\",\"column-reverse\",\"flex-start\",\"flex-end\",\"space-between\",\"space-around\", \"unset\"];\n+  var valueKeywords_ = [\"above\",\"absolute\",\"activeborder\",\"additive\",\"activecaption\",\"afar\",\"after-white-space\",\"ahead\",\"alias\",\"all\",\"all-scroll\",\"alphabetic\",\"alternate\",\"always\",\"amharic\",\"amharic-abegede\",\"antialiased\",\"appworkspace\",\"arabic-indic\",\"armenian\",\"asterisks\",\"attr\",\"auto\",\"avoid\",\"avoid-column\",\"avoid-page\",\"avoid-region\",\"background\",\"backwards\",\"baseline\",\"below\",\"bidi-override\",\"binary\",\"bengali\",\"blink\",\"block\",\"block-axis\",\"bold\",\"bolder\",\"border\",\"border-box\",\"both\",\"bottom\",\"break\",\"break-all\",\"break-word\",\"bullets\",\"button\",\"button-bevel\",\"buttonface\",\"buttonhighlight\",\"buttonshadow\",\"buttontext\",\"calc\",\"cambodian\",\"capitalize\",\"caps-lock-indicator\",\"caption\",\"captiontext\",\"caret\",\"cell\",\"center\",\"checkbox\",\"circle\",\"cjk-decimal\",\"cjk-earthly-branch\",\"cjk-heavenly-stem\",\"cjk-ideographic\",\"clear\",\"clip\",\"close-quote\",\"col-resize\",\"collapse\",\"column\",\"compact\",\"condensed\",\"conic-gradient\",\"contain\",\"content\",\"contents\",\"content-box\",\"context-menu\",\"continuous\",\"copy\",\"counter\",\"counters\",\"cover\",\"crop\",\"cross\",\"crosshair\",\"currentcolor\",\"cursive\",\"cyclic\",\"dashed\",\"decimal\",\"decimal-leading-zero\",\"default\",\"default-button\",\"destination-atop\",\"destination-in\",\"destination-out\",\"destination-over\",\"devanagari\",\"disc\",\"discard\",\"disclosure-closed\",\"disclosure-open\",\"document\",\"dot-dash\",\"dot-dot-dash\",\"dotted\",\"double\",\"down\",\"e-resize\",\"ease\",\"ease-in\",\"ease-in-out\",\"ease-out\",\"element\",\"ellipse\",\"ellipsis\",\"embed\",\"end\",\"ethiopic\",\"ethiopic-abegede\",\"ethiopic-abegede-am-et\",\"ethiopic-abegede-gez\",\"ethiopic-abegede-ti-er\",\"ethiopic-abegede-ti-et\",\"ethiopic-halehame-aa-er\",\"ethiopic-halehame-aa-et\",\"ethiopic-halehame-am-et\",\"ethiopic-halehame-gez\",\"ethiopic-halehame-om-et\",\"ethiopic-halehame-sid-et\",\"ethiopic-halehame-so-et\",\"ethiopic-halehame-ti-er\",\"ethiopic-halehame-ti-et\",\"ethiopic-halehame-tig\",\"ethiopic-numeric\",\"ew-resize\",\"expanded\",\"extends\",\"extra-condensed\",\"extra-expanded\",\"fantasy\",\"fast\",\"fill\",\"fixed\",\"flat\",\"flex\",\"footnotes\",\"forwards\",\"from\",\"geometricPrecision\",\"georgian\",\"graytext\",\"groove\",\"gujarati\",\"gurmukhi\",\"hand\",\"hangul\",\"hangul-consonant\",\"hebrew\",\"help\",\"hidden\",\"hide\",\"high\",\"higher\",\"highlight\",\"highlighttext\",\"hiragana\",\"hiragana-iroha\",\"horizontal\",\"hsl\",\"hsla\",\"icon\",\"ignore\",\"inactiveborder\",\"inactivecaption\",\"inactivecaptiontext\",\"infinite\",\"infobackground\",\"infotext\",\"inherit\",\"initial\",\"inline\",\"inline-axis\",\"inline-block\",\"inline-flex\",\"inline-table\",\"inset\",\"inside\",\"intrinsic\",\"invert\",\"italic\",\"japanese-formal\",\"japanese-informal\",\"justify\",\"kannada\",\"katakana\",\"katakana-iroha\",\"keep-all\",\"khmer\",\"korean-hangul-formal\",\"korean-hanja-formal\",\"korean-hanja-informal\",\"landscape\",\"lao\",\"large\",\"larger\",\"left\",\"level\",\"lighter\",\"line-through\",\"linear\",\"linear-gradient\",\"lines\",\"list-item\",\"listbox\",\"listitem\",\"local\",\"logical\",\"loud\",\"lower\",\"lower-alpha\",\"lower-armenian\",\"lower-greek\",\"lower-hexadecimal\",\"lower-latin\",\"lower-norwegian\",\"lower-roman\",\"lowercase\",\"ltr\",\"malayalam\",\"match\",\"matrix\",\"matrix3d\",\"media-controls-background\",\"media-current-time-display\",\"media-fullscreen-button\",\"media-mute-button\",\"media-play-button\",\"media-return-to-realtime-button\",\"media-rewind-button\",\"media-seek-back-button\",\"media-seek-forward-button\",\"media-slider\",\"media-sliderthumb\",\"media-time-remaining-display\",\"media-volume-slider\",\"media-volume-slider-container\",\"media-volume-sliderthumb\",\"medium\",\"menu\",\"menulist\",\"menulist-button\",\"menulist-text\",\"menulist-textfield\",\"menutext\",\"message-box\",\"middle\",\"min-intrinsic\",\"mix\",\"mongolian\",\"monospace\",\"move\",\"multiple\",\"myanmar\",\"n-resize\",\"narrower\",\"ne-resize\",\"nesw-resize\",\"no-close-quote\",\"no-drop\",\"no-open-quote\",\"no-repeat\",\"none\",\"normal\",\"not-allowed\",\"nowrap\",\"ns-resize\",\"numbers\",\"numeric\",\"nw-resize\",\"nwse-resize\",\"oblique\",\"octal\",\"open-quote\",\"optimizeLegibility\",\"optimizeSpeed\",\"oriya\",\"oromo\",\"outset\",\"outside\",\"outside-shape\",\"overlay\",\"overline\",\"padding\",\"padding-box\",\"painted\",\"page\",\"paused\",\"persian\",\"perspective\",\"plus-darker\",\"plus-lighter\",\"pointer\",\"polygon\",\"portrait\",\"pre\",\"pre-line\",\"pre-wrap\",\"preserve-3d\",\"progress\",\"push-button\",\"radial-gradient\",\"radio\",\"read-only\",\"read-write\",\"read-write-plaintext-only\",\"rectangle\",\"region\",\"relative\",\"repeat\",\"repeating-linear-gradient\",\"repeating-radial-gradient\",\"repeating-conic-gradient\",\"repeat-x\",\"repeat-y\",\"reset\",\"reverse\",\"rgb\",\"rgba\",\"ridge\",\"right\",\"rotate\",\"rotate3d\",\"rotateX\",\"rotateY\",\"rotateZ\",\"round\",\"row-resize\",\"rtl\",\"run-in\",\"running\",\"s-resize\",\"sans-serif\",\"scale\",\"scale3d\",\"scaleX\",\"scaleY\",\"scaleZ\",\"scroll\",\"scrollbar\",\"scroll-position\",\"se-resize\",\"searchfield\",\"searchfield-cancel-button\",\"searchfield-decoration\",\"searchfield-results-button\",\"searchfield-results-decoration\",\"semi-condensed\",\"semi-expanded\",\"separate\",\"serif\",\"show\",\"sidama\",\"simp-chinese-formal\",\"simp-chinese-informal\",\"single\",\"skew\",\"skewX\",\"skewY\",\"skip-white-space\",\"slide\",\"slider-horizontal\",\"slider-vertical\",\"sliderthumb-horizontal\",\"sliderthumb-vertical\",\"slow\",\"small\",\"small-caps\",\"small-caption\",\"smaller\",\"solid\",\"somali\",\"source-atop\",\"source-in\",\"source-out\",\"source-over\",\"space\",\"spell-out\",\"square\",\"square-button\",\"standard\",\"start\",\"static\",\"status-bar\",\"stretch\",\"stroke\",\"sub\",\"subpixel-antialiased\",\"super\",\"sw-resize\",\"symbolic\",\"symbols\",\"table\",\"table-caption\",\"table-cell\",\"table-column\",\"table-column-group\",\"table-footer-group\",\"table-header-group\",\"table-row\",\"table-row-group\",\"tamil\",\"telugu\",\"text\",\"text-bottom\",\"text-top\",\"textarea\",\"textfield\",\"thai\",\"thick\",\"thin\",\"threeddarkshadow\",\"threedface\",\"threedhighlight\",\"threedlightshadow\",\"threedshadow\",\"tibetan\",\"tigre\",\"tigrinya-er\",\"tigrinya-er-abegede\",\"tigrinya-et\",\"tigrinya-et-abegede\",\"to\",\"top\",\"trad-chinese-formal\",\"trad-chinese-informal\",\"translate\",\"translate3d\",\"translateX\",\"translateY\",\"translateZ\",\"transparent\",\"ultra-condensed\",\"ultra-expanded\",\"underline\",\"up\",\"upper-alpha\",\"upper-armenian\",\"upper-greek\",\"upper-hexadecimal\",\"upper-latin\",\"upper-norwegian\",\"upper-roman\",\"uppercase\",\"urdu\",\"url\",\"var\",\"vertical\",\"vertical-text\",\"visible\",\"visibleFill\",\"visiblePainted\",\"visibleStroke\",\"visual\",\"w-resize\",\"wait\",\"wave\",\"wider\",\"window\",\"windowframe\",\"windowtext\",\"words\",\"x-large\",\"x-small\",\"xor\",\"xx-large\",\"xx-small\",\"bicubic\",\"optimizespeed\",\"grayscale\",\"row\",\"row-reverse\",\"wrap\",\"wrap-reverse\",\"column-reverse\",\"flex-start\",\"flex-end\",\"space-between\",\"space-around\", \"unset\"];\n \n   var wordOperatorKeywords_ = [\"in\",\"and\",\"or\",\"not\",\"is not\",\"is a\",\"is\",\"isnt\",\"defined\",\"if unless\"],\n       blockKeywords_ = [\"for\",\"if\",\"else\",\"unless\", \"from\", \"to\"],\ndiff --git a/mode/xml/xml.js b/mode/xml/xml.js\nindex 46806ac4..4e36106b 100644\n--- a/mode/xml/xml.js\n+++ b/mode/xml/xml.js\n@@ -187,6 +187,10 @@ CodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n     };\n   }\n \n+  function lower(tagName) {\n+    return tagName && tagName.toLowerCase();\n+  }\n+\n   function Context(state, tagName, startOfLine) {\n     this.prev = state.context;\n     this.tagName = tagName || \"\";\n@@ -205,8 +209,8 @@ CodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n         return;\n       }\n       parentTagName = state.context.tagName;\n-      if (!config.contextGrabbers.hasOwnProperty(parentTagName) ||\n-          !config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {\n+      if (!config.contextGrabbers.hasOwnProperty(lower(parentTagName)) ||\n+          !config.contextGrabbers[lower(parentTagName)].hasOwnProperty(lower(nextTagName))) {\n         return;\n       }\n       popContext(state);\n@@ -240,7 +244,7 @@ CodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n     if (type == \"word\") {\n       var tagName = stream.current();\n       if (state.context && state.context.tagName != tagName &&\n-          config.implicitlyClosed.hasOwnProperty(state.context.tagName))\n+          config.implicitlyClosed.hasOwnProperty(lower(state.context.tagName)))\n         popContext(state);\n       if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {\n         setStyle = \"tag\";\n@@ -279,7 +283,7 @@ CodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n       var tagName = state.tagName, tagStart = state.tagStart;\n       state.tagName = state.tagStart = null;\n       if (type == \"selfcloseTag\" ||\n-          config.autoSelfClosers.hasOwnProperty(tagName)) {\n+          config.autoSelfClosers.hasOwnProperty(lower(tagName))) {\n         maybePopContext(state, tagName);\n       } else {\n         maybePopContext(state, tagName);\n@@ -359,7 +363,7 @@ CodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n           if (context.tagName == tagAfter[2]) {\n             context = context.prev;\n             break;\n-          } else if (config.implicitlyClosed.hasOwnProperty(context.tagName)) {\n+          } else if (config.implicitlyClosed.hasOwnProperty(lower(context.tagName))) {\n             context = context.prev;\n           } else {\n             break;\n@@ -367,8 +371,8 @@ CodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n         }\n       } else if (tagAfter) { // Opening tag spotted\n         while (context) {\n-          var grabbers = config.contextGrabbers[context.tagName];\n-          if (grabbers && grabbers.hasOwnProperty(tagAfter[2]))\n+          var grabbers = config.contextGrabbers[lower(context.tagName)];\n+          if (grabbers && grabbers.hasOwnProperty(lower(tagAfter[2])))\n             context = context.prev;\n           else\n             break;\ndiff --git a/mode/yaml-frontmatter/yaml-frontmatter.js b/mode/yaml-frontmatter/yaml-frontmatter.js\nindex 88c845e2..5c6175e4 100644\n--- a/mode/yaml-frontmatter/yaml-frontmatter.js\n+++ b/mode/yaml-frontmatter/yaml-frontmatter.js\n@@ -17,55 +17,55 @@\n     var yamlMode = CodeMirror.getMode(config, \"yaml\")\n     var innerMode = CodeMirror.getMode(config, parserConfig && parserConfig.base || \"gfm\")\n \n-    function curMode(state) {\n-      return state.state == BODY ? innerMode : yamlMode\n+    function localMode(state) {\n+      return state.state == FRONTMATTER ? {mode: yamlMode, state: state.yaml} : {mode: innerMode, state: state.inner}\n     }\n \n     return {\n       startState: function () {\n         return {\n           state: START,\n-          inner: CodeMirror.startState(yamlMode)\n+          yaml: null,\n+          inner: CodeMirror.startState(innerMode)\n         }\n       },\n       copyState: function (state) {\n         return {\n           state: state.state,\n-          inner: CodeMirror.copyState(curMode(state), state.inner)\n+          yaml: state.yaml && CodeMirror.copyState(yamlMode, state.yaml),\n+          inner: CodeMirror.copyState(innerMode, state.inner)\n         }\n       },\n       token: function (stream, state) {\n         if (state.state == START) {\n           if (stream.match('---', false)) {\n             state.state = FRONTMATTER\n-            return yamlMode.token(stream, state.inner)\n+            state.yaml = CodeMirror.startState(yamlMode)\n+            return yamlMode.token(stream, state.yaml)\n           } else {\n             state.state = BODY\n-            state.inner = CodeMirror.startState(innerMode)\n             return innerMode.token(stream, state.inner)\n           }\n         } else if (state.state == FRONTMATTER) {\n           var end = stream.sol() && stream.match(/(---|\\.\\.\\.)/, false)\n-          var style = yamlMode.token(stream, state.inner)\n+          var style = yamlMode.token(stream, state.yaml)\n           if (end) {\n             state.state = BODY\n-            state.inner = CodeMirror.startState(innerMode)\n+            state.yaml = null\n           }\n           return style\n         } else {\n           return innerMode.token(stream, state.inner)\n         }\n       },\n-      innerMode: function (state) {\n-        return {mode: curMode(state), state: state.inner}\n-      },\n+      innerMode: localMode,\n       indent: function(state, a, b) {\n-        var mode = curMode(state)\n-        return mode.indent ? mode.indent(state.inner, a, b) : CodeMirror.Pass\n+        var m = localMode(state)\n+        return m.mode.indent ? m.mode.indent(m.state, a, b) : CodeMirror.Pass\n       },\n       blankLine: function (state) {\n-        var mode = curMode(state)\n-        if (mode.blankLine) return mode.blankLine(state.inner)\n+        var m = localMode(state)\n+        if (m.mode.blankLine) return m.mode.blankLine(m.state)\n       }\n     }\n   })\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/keymap/emacs.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var cmds = CodeMirror.commands;\n  var Pos = CodeMirror.Pos;\n  function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }\n\n  // Kill 'ring'\n\n  var killRing = [];\n  function addToRing(str) {\n    killRing.push(str);\n    if (killRing.length > 50) killRing.shift();\n  }\n  function growRingTop(str) {\n    if (!killRing.length) return addToRing(str);\n    killRing[killRing.length - 1] += str;\n  }\n  function getFromRing(n) { return killRing[killRing.length - (n ? Math.min(n, 1) : 1)] || \"\"; }\n  function popFromRing() { if (killRing.length > 1) killRing.pop(); return getFromRing(); }\n\n  var lastKill = null;\n\n  // Internal generic kill function, used by several mapped kill \"family\" functions.\n  function _kill(cm, from, to, ring, text) {\n    if (text == null) text = cm.getRange(from, to);\n\n    if (ring == \"grow\" && lastKill && lastKill.cm == cm && posEq(from, lastKill.pos) && cm.isClean(lastKill.gen))\n      growRingTop(text);\n    else if (ring !== false)\n      addToRing(text);\n    cm.replaceRange(\"\", from, to, \"+delete\");\n\n    if (ring == \"grow\") lastKill = {cm: cm, pos: from, gen: cm.changeGeneration()};\n    else lastKill = null;\n  }\n\n  // Boundaries of various units\n\n  function byChar(cm, pos, dir) {\n    return cm.findPosH(pos, dir, \"char\", true);\n  }\n\n  function byWord(cm, pos, dir) {\n    return cm.findPosH(pos, dir, \"word\", true);\n  }\n\n  function byLine(cm, pos, dir) {\n    return cm.findPosV(pos, dir, \"line\", cm.doc.sel.goalColumn);\n  }\n\n  function byPage(cm, pos, dir) {\n    return cm.findPosV(pos, dir, \"page\", cm.doc.sel.goalColumn);\n  }\n\n  function byParagraph(cm, pos, dir) {\n    var no = pos.line, line = cm.getLine(no);\n    var sawText = /\\S/.test(dir < 0 ? line.slice(0, pos.ch) : line.slice(pos.ch));\n    var fst = cm.firstLine(), lst = cm.lastLine();\n    for (;;) {\n      no += dir;\n      if (no < fst || no > lst)\n        return cm.clipPos(Pos(no - dir, dir < 0 ? 0 : null));\n      line = cm.getLine(no);\n      var hasText = /\\S/.test(line);\n      if (hasText) sawText = true;\n      else if (sawText) return Pos(no, 0);\n    }\n  }\n\n  function bySentence(cm, pos, dir) {\n    var line = pos.line, ch = pos.ch;\n    var text = cm.getLine(pos.line), sawWord = false;\n    for (;;) {\n      var next = text.charAt(ch + (dir < 0 ? -1 : 0));\n      if (!next) { // End/beginning of line reached\n        if (line == (dir < 0 ? cm.firstLine() : cm.lastLine())) return Pos(line, ch);\n        text = cm.getLine(line + dir);\n        if (!/\\S/.test(text)) return Pos(line, ch);\n        line += dir;\n        ch = dir < 0 ? text.length : 0;\n        continue;\n      }\n      if (sawWord && /[!?.]/.test(next)) return Pos(line, ch + (dir > 0 ? 1 : 0));\n      if (!sawWord) sawWord = /\\w/.test(next);\n      ch += dir;\n    }\n  }\n\n  function byExpr(cm, pos, dir) {\n    var wrap;\n    if (cm.findMatchingBracket && (wrap = cm.findMatchingBracket(pos, {strict: true}))\n        && wrap.match && (wrap.forward ? 1 : -1) == dir)\n      return dir > 0 ? Pos(wrap.to.line, wrap.to.ch + 1) : wrap.to;\n\n    for (var first = true;; first = false) {\n      var token = cm.getTokenAt(pos);\n      var after = Pos(pos.line, dir < 0 ? token.start : token.end);\n      if (first && dir > 0 && token.end == pos.ch || !/\\w/.test(token.string)) {\n        var newPos = cm.findPosH(after, dir, \"char\");\n        if (posEq(after, newPos)) return pos;\n        else pos = newPos;\n      } else {\n        return after;\n      }\n    }\n  }\n\n  // Prefixes (only crudely supported)\n\n  function getPrefix(cm, precise) {\n    var digits = cm.state.emacsPrefix;\n    if (!digits) return precise ? null : 1;\n    clearPrefix(cm);\n    return digits == \"-\" ? -1 : Number(digits);\n  }\n\n  function repeated(cmd) {\n    var f = typeof cmd == \"string\" ? function(cm) { cm.execCommand(cmd); } : cmd;\n    return function(cm) {\n      var prefix = getPrefix(cm);\n      f(cm);\n      for (var i = 1; i < prefix; ++i) f(cm);\n    };\n  }\n\n  function findEnd(cm, pos, by, dir) {\n    var prefix = getPrefix(cm);\n    if (prefix < 0) { dir = -dir; prefix = -prefix; }\n    for (var i = 0; i < prefix; ++i) {\n      var newPos = by(cm, pos, dir);\n      if (posEq(newPos, pos)) break;\n      pos = newPos;\n    }\n    return pos;\n  }\n\n  function move(by, dir) {\n    var f = function(cm) {\n      cm.extendSelection(findEnd(cm, cm.getCursor(), by, dir));\n    };\n    f.motion = true;\n    return f;\n  }\n\n  function killTo(cm, by, dir, ring) {\n    var selections = cm.listSelections(), cursor;\n    var i = selections.length;\n    while (i--) {\n      cursor = selections[i].head;\n      _kill(cm, cursor, findEnd(cm, cursor, by, dir), ring);\n    }\n  }\n\n  function _killRegion(cm, ring) {\n    if (cm.somethingSelected()) {\n      var selections = cm.listSelections(), selection;\n      var i = selections.length;\n      while (i--) {\n        selection = selections[i];\n        _kill(cm, selection.anchor, selection.head, ring);\n      }\n      return true;\n    }\n  }\n\n  function addPrefix(cm, digit) {\n    if (cm.state.emacsPrefix) {\n      if (digit != \"-\") cm.state.emacsPrefix += digit;\n      return;\n    }\n    // Not active yet\n    cm.state.emacsPrefix = digit;\n    cm.on(\"keyHandled\", maybeClearPrefix);\n    cm.on(\"inputRead\", maybeDuplicateInput);\n  }\n\n  var prefixPreservingKeys = {\"Alt-G\": true, \"Ctrl-X\": true, \"Ctrl-Q\": true, \"Ctrl-U\": true};\n\n  function maybeClearPrefix(cm, arg) {\n    if (!cm.state.emacsPrefixMap && !prefixPreservingKeys.hasOwnProperty(arg))\n      clearPrefix(cm);\n  }\n\n  function clearPrefix(cm) {\n    cm.state.emacsPrefix = null;\n    cm.off(\"keyHandled\", maybeClearPrefix);\n    cm.off(\"inputRead\", maybeDuplicateInput);\n  }\n\n  function maybeDuplicateInput(cm, event) {\n    var dup = getPrefix(cm);\n    if (dup > 1 && event.origin == \"+input\") {\n      var one = event.text.join(\"\\n\"), txt = \"\";\n      for (var i = 1; i < dup; ++i) txt += one;\n      cm.replaceSelection(txt);\n    }\n  }\n\n  function maybeRemovePrefixMap(cm, arg) {\n    if (typeof arg == \"string\" && (/^\\d$/.test(arg) || arg == \"Ctrl-U\")) return;\n    cm.removeKeyMap(prefixMap);\n    cm.state.emacsPrefixMap = false;\n    cm.off(\"keyHandled\", maybeRemovePrefixMap);\n    cm.off(\"inputRead\", maybeRemovePrefixMap);\n  }\n\n  // Utilities\n\n  cmds.setMark = function (cm) {\n    cm.setCursor(cm.getCursor());\n    cm.setExtending(!cm.getExtending());\n    cm.on(\"change\", function() { cm.setExtending(false); });\n  }\n\n  function clearMark(cm) {\n    cm.setExtending(false);\n    cm.setCursor(cm.getCursor());\n  }\n\n  function makePrompt(msg) {\n    var fragment = document.createDocumentFragment();\n    var input = document.createElement(\"input\");\n    input.setAttribute(\"type\", \"text\");\n    input.style.width = \"10em\";\n    fragment.appendChild(document.createTextNode(msg + \": \"));\n    fragment.appendChild(input);\n    return fragment;\n  }\n\n  function getInput(cm, msg, f) {\n    if (cm.openDialog)\n      cm.openDialog(makePrompt(msg), f, {bottom: true});\n    else\n      f(prompt(msg, \"\"));\n  }\n\n  function operateOnWord(cm, op) {\n    var start = cm.getCursor(), end = cm.findPosH(start, 1, \"word\");\n    cm.replaceRange(op(cm.getRange(start, end)), start, end);\n    cm.setCursor(end);\n  }\n\n  function toEnclosingExpr(cm) {\n    var pos = cm.getCursor(), line = pos.line, ch = pos.ch;\n    var stack = [];\n    while (line >= cm.firstLine()) {\n      var text = cm.getLine(line);\n      for (var i = ch == null ? text.length : ch; i > 0;) {\n        var ch = text.charAt(--i);\n        if (ch == \")\")\n          stack.push(\"(\");\n        else if (ch == \"]\")\n          stack.push(\"[\");\n        else if (ch == \"}\")\n          stack.push(\"{\");\n        else if (/[\\(\\{\\[]/.test(ch) && (!stack.length || stack.pop() != ch))\n          return cm.extendSelection(Pos(line, i));\n      }\n      --line; ch = null;\n    }\n  }\n\n  // Commands. Names should match emacs function names (albeit in camelCase)\n  // except where emacs function names collide with code mirror core commands.\n\n  cmds.killRegion = function(cm) {\n    _kill(cm, cm.getCursor(\"start\"), cm.getCursor(\"end\"), true);\n  };\n\n  // Maps to emacs kill-line\n  cmds.killLineEmacs = repeated(function(cm) {\n    var start = cm.getCursor(), end = cm.clipPos(Pos(start.line));\n    var text = cm.getRange(start, end);\n    if (!/\\S/.test(text)) {\n      text += \"\\n\";\n      end = Pos(start.line + 1, 0);\n    }\n    _kill(cm, start, end, \"grow\", text);\n  });\n\n  cmds.killRingSave = function(cm) {\n    addToRing(cm.getSelection());\n    clearMark(cm);\n  };\n\n  cmds.yank = function(cm) {\n    var start = cm.getCursor();\n    cm.replaceRange(getFromRing(getPrefix(cm)), start, start, \"paste\");\n    cm.setSelection(start, cm.getCursor());\n  };\n\n  cmds.yankPop = function(cm) {\n    cm.replaceSelection(popFromRing(), \"around\", \"paste\");\n  };\n\n  cmds.forwardChar = move(byChar, 1);\n\n  cmds.backwardChar = move(byChar, -1)\n\n  cmds.deleteChar = function(cm) { killTo(cm, byChar, 1, false); };\n\n  cmds.deleteForwardChar = function(cm) {\n    _killRegion(cm, false) || killTo(cm, byChar, 1, false);\n  };\n\n  cmds.deleteBackwardChar = function(cm) {\n    _killRegion(cm, false) || killTo(cm, byChar, -1, false);\n  };\n\n  cmds.forwardWord = move(byWord, 1);\n\n  cmds.backwardWord = move(byWord, -1);\n\n  cmds.killWord = function(cm) { killTo(cm, byWord, 1, \"grow\"); };\n\n  cmds.backwardKillWord = function(cm) { killTo(cm, byWord, -1, \"grow\"); };\n\n  cmds.nextLine = move(byLine, 1);\n\n  cmds.previousLine = move(byLine, -1);\n\n  cmds.scrollDownCommand = move(byPage, -1);\n\n  cmds.scrollUpCommand = move(byPage, 1);\n\n  cmds.backwardParagraph = move(byParagraph, -1);\n\n  cmds.forwardParagraph = move(byParagraph, 1);\n\n  cmds.backwardSentence = move(bySentence, -1);\n\n  cmds.forwardSentence = move(bySentence, 1);\n\n  cmds.killSentence = function(cm) { killTo(cm, bySentence, 1, \"grow\"); };\n\n  cmds.backwardKillSentence = function(cm) {\n    _kill(cm, cm.getCursor(), bySentence(cm, cm.getCursor(), 1), \"grow\");\n  };\n\n  cmds.killSexp = function(cm) { killTo(cm, byExpr, 1, \"grow\"); };\n\n  cmds.backwardKillSexp = function(cm) { killTo(cm, byExpr, -1, \"grow\"); };\n\n  cmds.forwardSexp = move(byExpr, 1);\n\n  cmds.backwardSexp = move(byExpr, -1);\n\n  cmds.markSexp = function(cm) {\n    var cursor = cm.getCursor();\n    cm.setSelection(findEnd(cm, cursor, byExpr, 1), cursor);\n  };\n\n  cmds.transposeSexps = function(cm) {\n    var leftStart = byExpr(cm, cm.getCursor(), -1);\n    var leftEnd = byExpr(cm, leftStart, 1);\n    var rightEnd = byExpr(cm, leftEnd, 1);\n    var rightStart = byExpr(cm, rightEnd, -1);\n    cm.replaceRange(cm.getRange(rightStart, rightEnd) +\n                    cm.getRange(leftEnd, rightStart) +\n                    cm.getRange(leftStart, leftEnd), leftStart, rightEnd);\n  };\n\n  cmds.backwardUpList = repeated(toEnclosingExpr);\n\n  cmds.justOneSpace = function(cm) {\n    var pos = cm.getCursor(), from = pos.ch;\n    var to = pos.ch, text = cm.getLine(pos.line);\n    while (from && /\\s/.test(text.charAt(from - 1))) --from;\n    while (to < text.length && /\\s/.test(text.charAt(to))) ++to;\n    cm.replaceRange(\" \", Pos(pos.line, from), Pos(pos.line, to));\n  };\n\n  cmds.openLine = repeated(function(cm) {\n    cm.replaceSelection(\"\\n\", \"start\");\n  });\n\n  // maps to emacs 'transpose-chars'\n  cmds.transposeCharsRepeatable = repeated(function(cm) {\n    cm.execCommand(\"transposeChars\");\n  });\n\n  cmds.capitalizeWord = repeated(function(cm) {\n    operateOnWord(cm, function(w) {\n      var letter = w.search(/\\w/);\n      if (letter == -1) return w;\n      return w.slice(0, letter) + w.charAt(letter).toUpperCase() +\n          w.slice(letter + 1).toLowerCase();\n    });\n  });\n\n  cmds.upcaseWord = repeated(function(cm) {\n    operateOnWord(cm, function(w) { return w.toUpperCase(); });\n  });\n\n  cmds.downcaseWord = repeated(function(cm) {\n    operateOnWord(cm, function(w) { return w.toLowerCase(); });\n  });\n\n  // maps to emacs 'undo'\n  cmds.undoRepeatable = repeated(\"undo\");\n\n  cmds.keyboardQuit = function(cm) {\n    cm.execCommand(\"clearSearch\");\n    clearMark(cm);\n  }\n\n  cmds.newline = repeated(function(cm) { cm.replaceSelection(\"\\n\", \"end\"); });\n\n  cmds.gotoLine = function(cm) {\n    var prefix = getPrefix(cm, true);\n    if (prefix != null && prefix > 0) return cm.setCursor(prefix - 1);\n\n    getInput(cm, \"Goto line\", function(str) {\n      var num;\n      if (str && !isNaN(num = Number(str)) && num == (num|0) && num > 0)\n      cm.setCursor(num - 1);\n    });\n  };\n\n  cmds.indentRigidly = function(cm) {\n    cm.indentSelection(getPrefix(cm, true) || cm.getOption(\"indentUnit\"));\n  };\n\n  cmds.exchangePointAndMark = function(cm) {\n    cm.setSelection(cm.getCursor(\"head\"), cm.getCursor(\"anchor\"));\n  };\n\n  cmds.quotedInsertTab = repeated(\"insertTab\");\n\n  cmds.universalArgument = function addPrefixMap(cm) {\n    cm.state.emacsPrefixMap = true;\n    cm.addKeyMap(prefixMap);\n    cm.on(\"keyHandled\", maybeRemovePrefixMap);\n    cm.on(\"inputRead\", maybeRemovePrefixMap);\n  };\n\n  CodeMirror.emacs = {kill: _kill, killRegion: _killRegion, repeated: repeated};\n\n  // Actual keymap\n  var keyMap = CodeMirror.keyMap.emacs = CodeMirror.normalizeKeyMap({\n    \"Ctrl-W\": \"killRegion\",\n    \"Ctrl-K\": \"killLineEmacs\",\n    \"Alt-W\": \"killRingSave\",\n    \"Ctrl-Y\": \"yank\",\n    \"Alt-Y\": \"yankPop\",\n    \"Ctrl-Space\": \"setMark\",\n    \"Ctrl-Shift-2\": \"setMark\",\n    \"Ctrl-F\": \"forwardChar\",\n    \"Ctrl-B\": \"backwardChar\",\n    \"Right\": \"forwardChar\",\n    \"Left\": \"backwardChar\",\n    \"Ctrl-D\": \"deleteChar\",\n    \"Delete\": \"deleteForwardChar\",\n    \"Ctrl-H\": \"deleteBackwardChar\",\n    \"Backspace\": \"deleteBackwardChar\",\n    \"Alt-F\": \"forwardWord\",\n    \"Alt-B\": \"backwardWord\",\n    \"Alt-Right\": \"forwardWord\",\n    \"Alt-Left\": \"backwardWord\",\n    \"Alt-D\": \"killWord\",\n    \"Alt-Backspace\": \"backwardKillWord\",\n    \"Ctrl-N\": \"nextLine\",\n    \"Ctrl-P\": \"previousLine\",\n    \"Down\": \"nextLine\",\n    \"Up\": \"previousLine\",\n    \"Ctrl-A\": \"goLineStart\",\n    \"Ctrl-E\": \"goLineEnd\",\n    \"End\": \"goLineEnd\",\n    \"Home\": \"goLineStart\",\n    \"Alt-V\": \"scrollDownCommand\",\n    \"Ctrl-V\": \"scrollUpCommand\",\n    \"PageUp\": \"scrollDownCommand\",\n    \"PageDown\": \"scrollUpCommand\",\n    \"Ctrl-Up\": \"backwardParagraph\",\n    \"Ctrl-Down\": \"forwardParagraph\",\n    \"Alt-{\": \"backwardParagraph\",\n    \"Alt-}\": \"forwardParagraph\",\n    \"Alt-A\": \"backwardSentence\",\n    \"Alt-E\": \"forwardSentence\",\n    \"Alt-K\": \"killSentence\",\n    \"Ctrl-X Delete\": \"backwardKillSentence\",\n    \"Ctrl-Alt-K\": \"killSexp\",\n    \"Ctrl-Alt-Backspace\": \"backwardKillSexp\",\n    \"Ctrl-Alt-F\": \"forwardSexp\",\n    \"Ctrl-Alt-B\": \"backwardSexp\",\n    \"Shift-Ctrl-Alt-2\": \"markSexp\",\n    \"Ctrl-Alt-T\": \"transposeSexps\",\n    \"Ctrl-Alt-U\": \"backwardUpList\",\n    \"Alt-Space\": \"justOneSpace\",\n    \"Ctrl-O\": \"openLine\",\n    \"Ctrl-T\": \"transposeCharsRepeatable\",\n    \"Alt-C\": \"capitalizeWord\",\n    \"Alt-U\": \"upcaseWord\",\n    \"Alt-L\": \"downcaseWord\",\n    \"Alt-;\": \"toggleComment\",\n    \"Ctrl-/\": \"undoRepeatable\",\n    \"Shift-Ctrl--\": \"undoRepeatable\",\n    \"Ctrl-Z\": \"undoRepeatable\",\n    \"Cmd-Z\": \"undoRepeatable\",\n    \"Ctrl-X U\": \"undoRepeatable\",\n    \"Shift-Ctrl-Z\": \"redo\",\n    \"Shift-Alt-,\": \"goDocStart\",\n    \"Shift-Alt-.\": \"goDocEnd\",\n    \"Ctrl-S\": \"findPersistentNext\",\n    \"Ctrl-R\": \"findPersistentPrev\",\n    \"Ctrl-G\": \"keyboardQuit\",\n    \"Shift-Alt-5\": \"replace\",\n    \"Alt-/\": \"autocomplete\",\n    \"Enter\": \"newlineAndIndent\",\n    \"Ctrl-J\": \"newline\",\n    \"Tab\": \"indentAuto\",\n    \"Alt-G G\": \"gotoLine\",\n    \"Ctrl-X Tab\": \"indentRigidly\",\n    \"Ctrl-X Ctrl-X\": \"exchangePointAndMark\",\n    \"Ctrl-X Ctrl-S\": \"save\",\n    \"Ctrl-X Ctrl-W\": \"save\",\n    \"Ctrl-X S\": \"saveAll\",\n    \"Ctrl-X F\": \"open\",\n    \"Ctrl-X K\": \"close\",\n    \"Ctrl-X H\": \"selectAll\",\n    \"Ctrl-Q Tab\": \"quotedInsertTab\",\n    \"Ctrl-U\": \"universalArgument\",\n    \"fallthrough\": \"default\"\n  });\n\n  var prefixMap = {\"Ctrl-G\": clearPrefix};\n  function regPrefix(d) {\n    prefixMap[d] = function(cm) { addPrefix(cm, d); };\n    keyMap[\"Ctrl-\" + d] = function(cm) { addPrefix(cm, d); };\n    prefixPreservingKeys[\"Ctrl-\" + d] = true;\n  }\n  for (var i = 0; i < 10; ++i) regPrefix(String(i));\n  regPrefix(\"-\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/keymap/sublime.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// A rough approximation of Sublime Text's keybindings\n// Depends on addon/search/searchcursor.js and optionally addon/dialog/dialogs.js\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"), require(\"../addon/search/searchcursor\"), require(\"../addon/edit/matchbrackets\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\", \"../addon/search/searchcursor\", \"../addon/edit/matchbrackets\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var cmds = CodeMirror.commands;\n  var Pos = CodeMirror.Pos;\n\n  // This is not exactly Sublime's algorithm. I couldn't make heads or tails of that.\n  function findPosSubword(doc, start, dir) {\n    if (dir < 0 && start.ch == 0) return doc.clipPos(Pos(start.line - 1));\n    var line = doc.getLine(start.line);\n    if (dir > 0 && start.ch >= line.length) return doc.clipPos(Pos(start.line + 1, 0));\n    var state = \"start\", type, startPos = start.ch;\n    for (var pos = startPos, e = dir < 0 ? 0 : line.length, i = 0; pos != e; pos += dir, i++) {\n      var next = line.charAt(dir < 0 ? pos - 1 : pos);\n      var cat = next != \"_\" && CodeMirror.isWordChar(next) ? \"w\" : \"o\";\n      if (cat == \"w\" && next.toUpperCase() == next) cat = \"W\";\n      if (state == \"start\") {\n        if (cat != \"o\") { state = \"in\"; type = cat; }\n        else startPos = pos + dir\n      } else if (state == \"in\") {\n        if (type != cat) {\n          if (type == \"w\" && cat == \"W\" && dir < 0) pos--;\n          if (type == \"W\" && cat == \"w\" && dir > 0) { // From uppercase to lowercase\n            if (pos == startPos + 1) { type = \"w\"; continue; }\n            else pos--;\n          }\n          break;\n        }\n      }\n    }\n    return Pos(start.line, pos);\n  }\n\n  function moveSubword(cm, dir) {\n    cm.extendSelectionsBy(function(range) {\n      if (cm.display.shift || cm.doc.extend || range.empty())\n        return findPosSubword(cm.doc, range.head, dir);\n      else\n        return dir < 0 ? range.from() : range.to();\n    });\n  }\n\n  cmds.goSubwordLeft = function(cm) { moveSubword(cm, -1); };\n  cmds.goSubwordRight = function(cm) { moveSubword(cm, 1); };\n\n  cmds.scrollLineUp = function(cm) {\n    var info = cm.getScrollInfo();\n    if (!cm.somethingSelected()) {\n      var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, \"local\");\n      if (cm.getCursor().line >= visibleBottomLine)\n        cm.execCommand(\"goLineUp\");\n    }\n    cm.scrollTo(null, info.top - cm.defaultTextHeight());\n  };\n  cmds.scrollLineDown = function(cm) {\n    var info = cm.getScrollInfo();\n    if (!cm.somethingSelected()) {\n      var visibleTopLine = cm.lineAtHeight(info.top, \"local\")+1;\n      if (cm.getCursor().line <= visibleTopLine)\n        cm.execCommand(\"goLineDown\");\n    }\n    cm.scrollTo(null, info.top + cm.defaultTextHeight());\n  };\n\n  cmds.splitSelectionByLine = function(cm) {\n    var ranges = cm.listSelections(), lineRanges = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var from = ranges[i].from(), to = ranges[i].to();\n      for (var line = from.line; line <= to.line; ++line)\n        if (!(to.line > from.line && line == to.line && to.ch == 0))\n          lineRanges.push({anchor: line == from.line ? from : Pos(line, 0),\n                           head: line == to.line ? to : Pos(line)});\n    }\n    cm.setSelections(lineRanges, 0);\n  };\n\n  cmds.singleSelectionTop = function(cm) {\n    var range = cm.listSelections()[0];\n    cm.setSelection(range.anchor, range.head, {scroll: false});\n  };\n\n  cmds.selectLine = function(cm) {\n    var ranges = cm.listSelections(), extended = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i];\n      extended.push({anchor: Pos(range.from().line, 0),\n                     head: Pos(range.to().line + 1, 0)});\n    }\n    cm.setSelections(extended);\n  };\n\n  function insertLine(cm, above) {\n    if (cm.isReadOnly()) return CodeMirror.Pass\n    cm.operation(function() {\n      var len = cm.listSelections().length, newSelection = [], last = -1;\n      for (var i = 0; i < len; i++) {\n        var head = cm.listSelections()[i].head;\n        if (head.line <= last) continue;\n        var at = Pos(head.line + (above ? 0 : 1), 0);\n        cm.replaceRange(\"\\n\", at, null, \"+insertLine\");\n        cm.indentLine(at.line, null, true);\n        newSelection.push({head: at, anchor: at});\n        last = head.line + 1;\n      }\n      cm.setSelections(newSelection);\n    });\n    cm.execCommand(\"indentAuto\");\n  }\n\n  cmds.insertLineAfter = function(cm) { return insertLine(cm, false); };\n\n  cmds.insertLineBefore = function(cm) { return insertLine(cm, true); };\n\n  function wordAt(cm, pos) {\n    var start = pos.ch, end = start, line = cm.getLine(pos.line);\n    while (start && CodeMirror.isWordChar(line.charAt(start - 1))) --start;\n    while (end < line.length && CodeMirror.isWordChar(line.charAt(end))) ++end;\n    return {from: Pos(pos.line, start), to: Pos(pos.line, end), word: line.slice(start, end)};\n  }\n\n  cmds.selectNextOccurrence = function(cm) {\n    var from = cm.getCursor(\"from\"), to = cm.getCursor(\"to\");\n    var fullWord = cm.state.sublimeFindFullWord == cm.doc.sel;\n    if (CodeMirror.cmpPos(from, to) == 0) {\n      var word = wordAt(cm, from);\n      if (!word.word) return;\n      cm.setSelection(word.from, word.to);\n      fullWord = true;\n    } else {\n      var text = cm.getRange(from, to);\n      var query = fullWord ? new RegExp(\"\\\\b\" + text + \"\\\\b\") : text;\n      var cur = cm.getSearchCursor(query, to);\n      var found = cur.findNext();\n      if (!found) {\n        cur = cm.getSearchCursor(query, Pos(cm.firstLine(), 0));\n        found = cur.findNext();\n      }\n      if (!found || isSelectedRange(cm.listSelections(), cur.from(), cur.to())) return\n      cm.addSelection(cur.from(), cur.to());\n    }\n    if (fullWord)\n      cm.state.sublimeFindFullWord = cm.doc.sel;\n  };\n\n  cmds.skipAndSelectNextOccurrence = function(cm) {\n    var prevAnchor = cm.getCursor(\"anchor\"), prevHead = cm.getCursor(\"head\");\n    cmds.selectNextOccurrence(cm);\n    if (CodeMirror.cmpPos(prevAnchor, prevHead) != 0) {\n      cm.doc.setSelections(cm.doc.listSelections()\n          .filter(function (sel) {\n            return sel.anchor != prevAnchor || sel.head != prevHead;\n          }));\n    }\n  }\n\n  function addCursorToSelection(cm, dir) {\n    var ranges = cm.listSelections(), newRanges = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i];\n      var newAnchor = cm.findPosV(\n          range.anchor, dir, \"line\", range.anchor.goalColumn);\n      var newHead = cm.findPosV(\n          range.head, dir, \"line\", range.head.goalColumn);\n      newAnchor.goalColumn = range.anchor.goalColumn != null ?\n          range.anchor.goalColumn : cm.cursorCoords(range.anchor, \"div\").left;\n      newHead.goalColumn = range.head.goalColumn != null ?\n          range.head.goalColumn : cm.cursorCoords(range.head, \"div\").left;\n      var newRange = {anchor: newAnchor, head: newHead};\n      newRanges.push(range);\n      newRanges.push(newRange);\n    }\n    cm.setSelections(newRanges);\n  }\n  cmds.addCursorToPrevLine = function(cm) { addCursorToSelection(cm, -1); };\n  cmds.addCursorToNextLine = function(cm) { addCursorToSelection(cm, 1); };\n\n  function isSelectedRange(ranges, from, to) {\n    for (var i = 0; i < ranges.length; i++)\n      if (CodeMirror.cmpPos(ranges[i].from(), from) == 0 &&\n          CodeMirror.cmpPos(ranges[i].to(), to) == 0) return true\n    return false\n  }\n\n  var mirror = \"(){}[]\";\n  function selectBetweenBrackets(cm) {\n    var ranges = cm.listSelections(), newRanges = []\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i], pos = range.head, opening = cm.scanForBracket(pos, -1);\n      if (!opening) return false;\n      for (;;) {\n        var closing = cm.scanForBracket(pos, 1);\n        if (!closing) return false;\n        if (closing.ch == mirror.charAt(mirror.indexOf(opening.ch) + 1)) {\n          var startPos = Pos(opening.pos.line, opening.pos.ch + 1);\n          if (CodeMirror.cmpPos(startPos, range.from()) == 0 &&\n              CodeMirror.cmpPos(closing.pos, range.to()) == 0) {\n            opening = cm.scanForBracket(opening.pos, -1);\n            if (!opening) return false;\n          } else {\n            newRanges.push({anchor: startPos, head: closing.pos});\n            break;\n          }\n        }\n        pos = Pos(closing.pos.line, closing.pos.ch + 1);\n      }\n    }\n    cm.setSelections(newRanges);\n    return true;\n  }\n\n  cmds.selectScope = function(cm) {\n    selectBetweenBrackets(cm) || cm.execCommand(\"selectAll\");\n  };\n  cmds.selectBetweenBrackets = function(cm) {\n    if (!selectBetweenBrackets(cm)) return CodeMirror.Pass;\n  };\n\n  function puncType(type) {\n    return !type ? null : /\\bpunctuation\\b/.test(type) ? type : undefined\n  }\n\n  cmds.goToBracket = function(cm) {\n    cm.extendSelectionsBy(function(range) {\n      var next = cm.scanForBracket(range.head, 1, puncType(cm.getTokenTypeAt(range.head)));\n      if (next && CodeMirror.cmpPos(next.pos, range.head) != 0) return next.pos;\n      var prev = cm.scanForBracket(range.head, -1, puncType(cm.getTokenTypeAt(Pos(range.head.line, range.head.ch + 1))));\n      return prev && Pos(prev.pos.line, prev.pos.ch + 1) || range.head;\n    });\n  };\n\n  cmds.swapLineUp = function(cm) {\n    if (cm.isReadOnly()) return CodeMirror.Pass\n    var ranges = cm.listSelections(), linesToMove = [], at = cm.firstLine() - 1, newSels = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i], from = range.from().line - 1, to = range.to().line;\n      newSels.push({anchor: Pos(range.anchor.line - 1, range.anchor.ch),\n                    head: Pos(range.head.line - 1, range.head.ch)});\n      if (range.to().ch == 0 && !range.empty()) --to;\n      if (from > at) linesToMove.push(from, to);\n      else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;\n      at = to;\n    }\n    cm.operation(function() {\n      for (var i = 0; i < linesToMove.length; i += 2) {\n        var from = linesToMove[i], to = linesToMove[i + 1];\n        var line = cm.getLine(from);\n        cm.replaceRange(\"\", Pos(from, 0), Pos(from + 1, 0), \"+swapLine\");\n        if (to > cm.lastLine())\n          cm.replaceRange(\"\\n\" + line, Pos(cm.lastLine()), null, \"+swapLine\");\n        else\n          cm.replaceRange(line + \"\\n\", Pos(to, 0), null, \"+swapLine\");\n      }\n      cm.setSelections(newSels);\n      cm.scrollIntoView();\n    });\n  };\n\n  cmds.swapLineDown = function(cm) {\n    if (cm.isReadOnly()) return CodeMirror.Pass\n    var ranges = cm.listSelections(), linesToMove = [], at = cm.lastLine() + 1;\n    for (var i = ranges.length - 1; i >= 0; i--) {\n      var range = ranges[i], from = range.to().line + 1, to = range.from().line;\n      if (range.to().ch == 0 && !range.empty()) from--;\n      if (from < at) linesToMove.push(from, to);\n      else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;\n      at = to;\n    }\n    cm.operation(function() {\n      for (var i = linesToMove.length - 2; i >= 0; i -= 2) {\n        var from = linesToMove[i], to = linesToMove[i + 1];\n        var line = cm.getLine(from);\n        if (from == cm.lastLine())\n          cm.replaceRange(\"\", Pos(from - 1), Pos(from), \"+swapLine\");\n        else\n          cm.replaceRange(\"\", Pos(from, 0), Pos(from + 1, 0), \"+swapLine\");\n        cm.replaceRange(line + \"\\n\", Pos(to, 0), null, \"+swapLine\");\n      }\n      cm.scrollIntoView();\n    });\n  };\n\n  cmds.toggleCommentIndented = function(cm) {\n    cm.toggleComment({ indent: true });\n  }\n\n  cmds.joinLines = function(cm) {\n    var ranges = cm.listSelections(), joined = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i], from = range.from();\n      var start = from.line, end = range.to().line;\n      while (i < ranges.length - 1 && ranges[i + 1].from().line == end)\n        end = ranges[++i].to().line;\n      joined.push({start: start, end: end, anchor: !range.empty() && from});\n    }\n    cm.operation(function() {\n      var offset = 0, ranges = [];\n      for (var i = 0; i < joined.length; i++) {\n        var obj = joined[i];\n        var anchor = obj.anchor && Pos(obj.anchor.line - offset, obj.anchor.ch), head;\n        for (var line = obj.start; line <= obj.end; line++) {\n          var actual = line - offset;\n          if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1);\n          if (actual < cm.lastLine()) {\n            cm.replaceRange(\" \", Pos(actual), Pos(actual + 1, /^\\s*/.exec(cm.getLine(actual + 1))[0].length));\n            ++offset;\n          }\n        }\n        ranges.push({anchor: anchor || head, head: head});\n      }\n      cm.setSelections(ranges, 0);\n    });\n  };\n\n  cmds.duplicateLine = function(cm) {\n    cm.operation(function() {\n      var rangeCount = cm.listSelections().length;\n      for (var i = 0; i < rangeCount; i++) {\n        var range = cm.listSelections()[i];\n        if (range.empty())\n          cm.replaceRange(cm.getLine(range.head.line) + \"\\n\", Pos(range.head.line, 0));\n        else\n          cm.replaceRange(cm.getRange(range.from(), range.to()), range.from());\n      }\n      cm.scrollIntoView();\n    });\n  };\n\n\n  function sortLines(cm, caseSensitive, direction) {\n    if (cm.isReadOnly()) return CodeMirror.Pass\n    var ranges = cm.listSelections(), toSort = [], selected;\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i];\n      if (range.empty()) continue;\n      var from = range.from().line, to = range.to().line;\n      while (i < ranges.length - 1 && ranges[i + 1].from().line == to)\n        to = ranges[++i].to().line;\n      if (!ranges[i].to().ch) to--;\n      toSort.push(from, to);\n    }\n    if (toSort.length) selected = true;\n    else toSort.push(cm.firstLine(), cm.lastLine());\n\n    cm.operation(function() {\n      var ranges = [];\n      for (var i = 0; i < toSort.length; i += 2) {\n        var from = toSort[i], to = toSort[i + 1];\n        var start = Pos(from, 0), end = Pos(to);\n        var lines = cm.getRange(start, end, false);\n        if (caseSensitive)\n          lines.sort(function(a, b) { return a < b ? -direction : a == b ? 0 : direction; });\n        else\n          lines.sort(function(a, b) {\n            var au = a.toUpperCase(), bu = b.toUpperCase();\n            if (au != bu) { a = au; b = bu; }\n            return a < b ? -direction : a == b ? 0 : direction;\n          });\n        cm.replaceRange(lines, start, end);\n        if (selected) ranges.push({anchor: start, head: Pos(to + 1, 0)});\n      }\n      if (selected) cm.setSelections(ranges, 0);\n    });\n  }\n\n  cmds.sortLines = function(cm) { sortLines(cm, true, 1); };\n  cmds.reverseSortLines = function(cm) { sortLines(cm, true, -1); };\n  cmds.sortLinesInsensitive = function(cm) { sortLines(cm, false, 1); };\n  cmds.reverseSortLinesInsensitive = function(cm) { sortLines(cm, false, -1); };\n\n  cmds.nextBookmark = function(cm) {\n    var marks = cm.state.sublimeBookmarks;\n    if (marks) while (marks.length) {\n      var current = marks.shift();\n      var found = current.find();\n      if (found) {\n        marks.push(current);\n        return cm.setSelection(found.from, found.to);\n      }\n    }\n  };\n\n  cmds.prevBookmark = function(cm) {\n    var marks = cm.state.sublimeBookmarks;\n    if (marks) while (marks.length) {\n      marks.unshift(marks.pop());\n      var found = marks[marks.length - 1].find();\n      if (!found)\n        marks.pop();\n      else\n        return cm.setSelection(found.from, found.to);\n    }\n  };\n\n  cmds.toggleBookmark = function(cm) {\n    var ranges = cm.listSelections();\n    var marks = cm.state.sublimeBookmarks || (cm.state.sublimeBookmarks = []);\n    for (var i = 0; i < ranges.length; i++) {\n      var from = ranges[i].from(), to = ranges[i].to();\n      var found = ranges[i].empty() ? cm.findMarksAt(from) : cm.findMarks(from, to);\n      for (var j = 0; j < found.length; j++) {\n        if (found[j].sublimeBookmark) {\n          found[j].clear();\n          for (var k = 0; k < marks.length; k++)\n            if (marks[k] == found[j])\n              marks.splice(k--, 1);\n          break;\n        }\n      }\n      if (j == found.length)\n        marks.push(cm.markText(from, to, {sublimeBookmark: true, clearWhenEmpty: false}));\n    }\n  };\n\n  cmds.clearBookmarks = function(cm) {\n    var marks = cm.state.sublimeBookmarks;\n    if (marks) for (var i = 0; i < marks.length; i++) marks[i].clear();\n    marks.length = 0;\n  };\n\n  cmds.selectBookmarks = function(cm) {\n    var marks = cm.state.sublimeBookmarks, ranges = [];\n    if (marks) for (var i = 0; i < marks.length; i++) {\n      var found = marks[i].find();\n      if (!found)\n        marks.splice(i--, 0);\n      else\n        ranges.push({anchor: found.from, head: found.to});\n    }\n    if (ranges.length)\n      cm.setSelections(ranges, 0);\n  };\n\n  function modifyWordOrSelection(cm, mod) {\n    cm.operation(function() {\n      var ranges = cm.listSelections(), indices = [], replacements = [];\n      for (var i = 0; i < ranges.length; i++) {\n        var range = ranges[i];\n        if (range.empty()) { indices.push(i); replacements.push(\"\"); }\n        else replacements.push(mod(cm.getRange(range.from(), range.to())));\n      }\n      cm.replaceSelections(replacements, \"around\", \"case\");\n      for (var i = indices.length - 1, at; i >= 0; i--) {\n        var range = ranges[indices[i]];\n        if (at && CodeMirror.cmpPos(range.head, at) > 0) continue;\n        var word = wordAt(cm, range.head);\n        at = word.from;\n        cm.replaceRange(mod(word.word), word.from, word.to);\n      }\n    });\n  }\n\n  cmds.smartBackspace = function(cm) {\n    if (cm.somethingSelected()) return CodeMirror.Pass;\n\n    cm.operation(function() {\n      var cursors = cm.listSelections();\n      var indentUnit = cm.getOption(\"indentUnit\");\n\n      for (var i = cursors.length - 1; i >= 0; i--) {\n        var cursor = cursors[i].head;\n        var toStartOfLine = cm.getRange({line: cursor.line, ch: 0}, cursor);\n        var column = CodeMirror.countColumn(toStartOfLine, null, cm.getOption(\"tabSize\"));\n\n        // Delete by one character by default\n        var deletePos = cm.findPosH(cursor, -1, \"char\", false);\n\n        if (toStartOfLine && !/\\S/.test(toStartOfLine) && column % indentUnit == 0) {\n          var prevIndent = new Pos(cursor.line,\n            CodeMirror.findColumn(toStartOfLine, column - indentUnit, indentUnit));\n\n          // Smart delete only if we found a valid prevIndent location\n          if (prevIndent.ch != cursor.ch) deletePos = prevIndent;\n        }\n\n        cm.replaceRange(\"\", deletePos, cursor, \"+delete\");\n      }\n    });\n  };\n\n  cmds.delLineRight = function(cm) {\n    cm.operation(function() {\n      var ranges = cm.listSelections();\n      for (var i = ranges.length - 1; i >= 0; i--)\n        cm.replaceRange(\"\", ranges[i].anchor, Pos(ranges[i].to().line), \"+delete\");\n      cm.scrollIntoView();\n    });\n  };\n\n  cmds.upcaseAtCursor = function(cm) {\n    modifyWordOrSelection(cm, function(str) { return str.toUpperCase(); });\n  };\n  cmds.downcaseAtCursor = function(cm) {\n    modifyWordOrSelection(cm, function(str) { return str.toLowerCase(); });\n  };\n\n  cmds.setSublimeMark = function(cm) {\n    if (cm.state.sublimeMark) cm.state.sublimeMark.clear();\n    cm.state.sublimeMark = cm.setBookmark(cm.getCursor());\n  };\n  cmds.selectToSublimeMark = function(cm) {\n    var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n    if (found) cm.setSelection(cm.getCursor(), found);\n  };\n  cmds.deleteToSublimeMark = function(cm) {\n    var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n    if (found) {\n      var from = cm.getCursor(), to = found;\n      if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; }\n      cm.state.sublimeKilled = cm.getRange(from, to);\n      cm.replaceRange(\"\", from, to);\n    }\n  };\n  cmds.swapWithSublimeMark = function(cm) {\n    var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n    if (found) {\n      cm.state.sublimeMark.clear();\n      cm.state.sublimeMark = cm.setBookmark(cm.getCursor());\n      cm.setCursor(found);\n    }\n  };\n  cmds.sublimeYank = function(cm) {\n    if (cm.state.sublimeKilled != null)\n      cm.replaceSelection(cm.state.sublimeKilled, null, \"paste\");\n  };\n\n  cmds.showInCenter = function(cm) {\n    var pos = cm.cursorCoords(null, \"local\");\n    cm.scrollTo(null, (pos.top + pos.bottom) / 2 - cm.getScrollInfo().clientHeight / 2);\n  };\n\n  function getTarget(cm) {\n    var from = cm.getCursor(\"from\"), to = cm.getCursor(\"to\");\n    if (CodeMirror.cmpPos(from, to) == 0) {\n      var word = wordAt(cm, from);\n      if (!word.word) return;\n      from = word.from;\n      to = word.to;\n    }\n    return {from: from, to: to, query: cm.getRange(from, to), word: word};\n  }\n\n  function findAndGoTo(cm, forward) {\n    var target = getTarget(cm);\n    if (!target) return;\n    var query = target.query;\n    var cur = cm.getSearchCursor(query, forward ? target.to : target.from);\n\n    if (forward ? cur.findNext() : cur.findPrevious()) {\n      cm.setSelection(cur.from(), cur.to());\n    } else {\n      cur = cm.getSearchCursor(query, forward ? Pos(cm.firstLine(), 0)\n                                              : cm.clipPos(Pos(cm.lastLine())));\n      if (forward ? cur.findNext() : cur.findPrevious())\n        cm.setSelection(cur.from(), cur.to());\n      else if (target.word)\n        cm.setSelection(target.from, target.to);\n    }\n  };\n  cmds.findUnder = function(cm) { findAndGoTo(cm, true); };\n  cmds.findUnderPrevious = function(cm) { findAndGoTo(cm,false); };\n  cmds.findAllUnder = function(cm) {\n    var target = getTarget(cm);\n    if (!target) return;\n    var cur = cm.getSearchCursor(target.query);\n    var matches = [];\n    var primaryIndex = -1;\n    while (cur.findNext()) {\n      matches.push({anchor: cur.from(), head: cur.to()});\n      if (cur.from().line <= target.from.line && cur.from().ch <= target.from.ch)\n        primaryIndex++;\n    }\n    cm.setSelections(matches, primaryIndex);\n  };\n\n\n  var keyMap = CodeMirror.keyMap;\n  keyMap.macSublime = {\n    \"Cmd-Left\": \"goLineStartSmart\",\n    \"Shift-Tab\": \"indentLess\",\n    \"Shift-Ctrl-K\": \"deleteLine\",\n    \"Alt-Q\": \"wrapLines\",\n    \"Ctrl-Left\": \"goSubwordLeft\",\n    \"Ctrl-Right\": \"goSubwordRight\",\n    \"Ctrl-Alt-Up\": \"scrollLineUp\",\n    \"Ctrl-Alt-Down\": \"scrollLineDown\",\n    \"Cmd-L\": \"selectLine\",\n    \"Shift-Cmd-L\": \"splitSelectionByLine\",\n    \"Esc\": \"singleSelectionTop\",\n    \"Cmd-Enter\": \"insertLineAfter\",\n    \"Shift-Cmd-Enter\": \"insertLineBefore\",\n    \"Cmd-D\": \"selectNextOccurrence\",\n    \"Shift-Cmd-Space\": \"selectScope\",\n    \"Shift-Cmd-M\": \"selectBetweenBrackets\",\n    \"Cmd-M\": \"goToBracket\",\n    \"Cmd-Ctrl-Up\": \"swapLineUp\",\n    \"Cmd-Ctrl-Down\": \"swapLineDown\",\n    \"Cmd-/\": \"toggleCommentIndented\",\n    \"Cmd-J\": \"joinLines\",\n    \"Shift-Cmd-D\": \"duplicateLine\",\n    \"F5\": \"sortLines\",\n    \"Shift-F5\": \"reverseSortLines\",\n    \"Cmd-F5\": \"sortLinesInsensitive\",\n    \"Shift-Cmd-F5\": \"reverseSortLinesInsensitive\",\n    \"F2\": \"nextBookmark\",\n    \"Shift-F2\": \"prevBookmark\",\n    \"Cmd-F2\": \"toggleBookmark\",\n    \"Shift-Cmd-F2\": \"clearBookmarks\",\n    \"Alt-F2\": \"selectBookmarks\",\n    \"Backspace\": \"smartBackspace\",\n    \"Cmd-K Cmd-D\": \"skipAndSelectNextOccurrence\",\n    \"Cmd-K Cmd-K\": \"delLineRight\",\n    \"Cmd-K Cmd-U\": \"upcaseAtCursor\",\n    \"Cmd-K Cmd-L\": \"downcaseAtCursor\",\n    \"Cmd-K Cmd-Space\": \"setSublimeMark\",\n    \"Cmd-K Cmd-A\": \"selectToSublimeMark\",\n    \"Cmd-K Cmd-W\": \"deleteToSublimeMark\",\n    \"Cmd-K Cmd-X\": \"swapWithSublimeMark\",\n    \"Cmd-K Cmd-Y\": \"sublimeYank\",\n    \"Cmd-K Cmd-C\": \"showInCenter\",\n    \"Cmd-K Cmd-G\": \"clearBookmarks\",\n    \"Cmd-K Cmd-Backspace\": \"delLineLeft\",\n    \"Cmd-K Cmd-1\": \"foldAll\",\n    \"Cmd-K Cmd-0\": \"unfoldAll\",\n    \"Cmd-K Cmd-J\": \"unfoldAll\",\n    \"Ctrl-Shift-Up\": \"addCursorToPrevLine\",\n    \"Ctrl-Shift-Down\": \"addCursorToNextLine\",\n    \"Cmd-F3\": \"findUnder\",\n    \"Shift-Cmd-F3\": \"findUnderPrevious\",\n    \"Alt-F3\": \"findAllUnder\",\n    \"Shift-Cmd-[\": \"fold\",\n    \"Shift-Cmd-]\": \"unfold\",\n    \"Cmd-I\": \"findIncremental\",\n    \"Shift-Cmd-I\": \"findIncrementalReverse\",\n    \"Cmd-H\": \"replace\",\n    \"F3\": \"findNext\",\n    \"Shift-F3\": \"findPrev\",\n    \"fallthrough\": \"macDefault\"\n  };\n  CodeMirror.normalizeKeyMap(keyMap.macSublime);\n\n  keyMap.pcSublime = {\n    \"Shift-Tab\": \"indentLess\",\n    \"Shift-Ctrl-K\": \"deleteLine\",\n    \"Alt-Q\": \"wrapLines\",\n    \"Ctrl-T\": \"transposeChars\",\n    \"Alt-Left\": \"goSubwordLeft\",\n    \"Alt-Right\": \"goSubwordRight\",\n    \"Ctrl-Up\": \"scrollLineUp\",\n    \"Ctrl-Down\": \"scrollLineDown\",\n    \"Ctrl-L\": \"selectLine\",\n    \"Shift-Ctrl-L\": \"splitSelectionByLine\",\n    \"Esc\": \"singleSelectionTop\",\n    \"Ctrl-Enter\": \"insertLineAfter\",\n    \"Shift-Ctrl-Enter\": \"insertLineBefore\",\n    \"Ctrl-D\": \"selectNextOccurrence\",\n    \"Shift-Ctrl-Space\": \"selectScope\",\n    \"Shift-Ctrl-M\": \"selectBetweenBrackets\",\n    \"Ctrl-M\": \"goToBracket\",\n    \"Shift-Ctrl-Up\": \"swapLineUp\",\n    \"Shift-Ctrl-Down\": \"swapLineDown\",\n    \"Ctrl-/\": \"toggleCommentIndented\",\n    \"Ctrl-J\": \"joinLines\",\n    \"Shift-Ctrl-D\": \"duplicateLine\",\n    \"F9\": \"sortLines\",\n    \"Shift-F9\": \"reverseSortLines\",\n    \"Ctrl-F9\": \"sortLinesInsensitive\",\n    \"Shift-Ctrl-F9\": \"reverseSortLinesInsensitive\",\n    \"F2\": \"nextBookmark\",\n    \"Shift-F2\": \"prevBookmark\",\n    \"Ctrl-F2\": \"toggleBookmark\",\n    \"Shift-Ctrl-F2\": \"clearBookmarks\",\n    \"Alt-F2\": \"selectBookmarks\",\n    \"Backspace\": \"smartBackspace\",\n    \"Ctrl-K Ctrl-D\": \"skipAndSelectNextOccurrence\",\n    \"Ctrl-K Ctrl-K\": \"delLineRight\",\n    \"Ctrl-K Ctrl-U\": \"upcaseAtCursor\",\n    \"Ctrl-K Ctrl-L\": \"downcaseAtCursor\",\n    \"Ctrl-K Ctrl-Space\": \"setSublimeMark\",\n    \"Ctrl-K Ctrl-A\": \"selectToSublimeMark\",\n    \"Ctrl-K Ctrl-W\": \"deleteToSublimeMark\",\n    \"Ctrl-K Ctrl-X\": \"swapWithSublimeMark\",\n    \"Ctrl-K Ctrl-Y\": \"sublimeYank\",\n    \"Ctrl-K Ctrl-C\": \"showInCenter\",\n    \"Ctrl-K Ctrl-G\": \"clearBookmarks\",\n    \"Ctrl-K Ctrl-Backspace\": \"delLineLeft\",\n    \"Ctrl-K Ctrl-1\": \"foldAll\",\n    \"Ctrl-K Ctrl-0\": \"unfoldAll\",\n    \"Ctrl-K Ctrl-J\": \"unfoldAll\",\n    \"Ctrl-Alt-Up\": \"addCursorToPrevLine\",\n    \"Ctrl-Alt-Down\": \"addCursorToNextLine\",\n    \"Ctrl-F3\": \"findUnder\",\n    \"Shift-Ctrl-F3\": \"findUnderPrevious\",\n    \"Alt-F3\": \"findAllUnder\",\n    \"Shift-Ctrl-[\": \"fold\",\n    \"Shift-Ctrl-]\": \"unfold\",\n    \"Ctrl-I\": \"findIncremental\",\n    \"Shift-Ctrl-I\": \"findIncrementalReverse\",\n    \"Ctrl-H\": \"replace\",\n    \"F3\": \"findNext\",\n    \"Shift-F3\": \"findPrev\",\n    \"fallthrough\": \"pcDefault\"\n  };\n  CodeMirror.normalizeKeyMap(keyMap.pcSublime);\n\n  var mac = keyMap.default == keyMap.macDefault;\n  keyMap.sublime = mac ? keyMap.macSublime : keyMap.pcSublime;\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/keymap/vim.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Supported keybindings:\n *   Too many to list. Refer to defaultKeymap below.\n *\n * Supported Ex commands:\n *   Refer to defaultExCommandMap below.\n *\n * Registers: unnamed, -, ., :, /, _, a-z, A-Z, 0-9\n *   (Does not respect the special case for number registers when delete\n *    operator is made with these commands: %, (, ),  , /, ?, n, N, {, } )\n *   TODO: Implement the remaining registers.\n *\n * Marks: a-z, A-Z, and 0-9\n *   TODO: Implement the remaining special marks. They have more complex\n *       behavior.\n *\n * Events:\n *  'vim-mode-change' - raised on the editor anytime the current mode changes,\n *                      Event object: {mode: \"visual\", subMode: \"linewise\"}\n *\n * Code structure:\n *  1. Default keymap\n *  2. Variable declarations and short basic helpers\n *  3. Instance (External API) implementation\n *  4. Internal state tracking objects (input state, counter) implementation\n *     and instantiation\n *  5. Key handler (the main command dispatcher) implementation\n *  6. Motion, operator, and action implementations\n *  7. Helper functions for the key handler, motions, operators, and actions\n *  8. Set up Vim to work as a keymap for CodeMirror.\n *  9. Ex command implementations.\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"), require(\"../addon/search/searchcursor\"), require(\"../addon/dialog/dialog\"), require(\"../addon/edit/matchbrackets.js\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\", \"../addon/search/searchcursor\", \"../addon/dialog/dialog\", \"../addon/edit/matchbrackets\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  'use strict';\n\n  var Pos = CodeMirror.Pos;\n\n  function transformCursor(cm, range) {\n    var vim = cm.state.vim;\n    if (!vim || vim.insertMode) return range.head;\n    var head = vim.sel.head;\n    if (!head)  return range.head;\n\n    if (vim.visualBlock) {\n      if (range.head.line != head.line) {\n        return;\n      }\n    }\n    if (range.from() == range.anchor && !range.empty()) {\n      if (range.head.line == head.line && range.head.ch != head.ch)\n        return new Pos(range.head.line, range.head.ch - 1);\n    }\n\n    return range.head;\n  }\n\n  var defaultKeymap = [\n    // Key to key mapping. This goes first to make it possible to override\n    // existing mappings.\n    { keys: '<Left>', type: 'keyToKey', toKeys: 'h' },\n    { keys: '<Right>', type: 'keyToKey', toKeys: 'l' },\n    { keys: '<Up>', type: 'keyToKey', toKeys: 'k' },\n    { keys: '<Down>', type: 'keyToKey', toKeys: 'j' },\n    { keys: 'g<Up>', type: 'keyToKey', toKeys: 'gk' },\n    { keys: 'g<Down>', type: 'keyToKey', toKeys: 'gj' },\n    { keys: '<Space>', type: 'keyToKey', toKeys: 'l' },\n    { keys: '<BS>', type: 'keyToKey', toKeys: 'h', context: 'normal'},\n    { keys: '<Del>', type: 'keyToKey', toKeys: 'x', context: 'normal'},\n    { keys: '<C-Space>', type: 'keyToKey', toKeys: 'W' },\n    { keys: '<C-BS>', type: 'keyToKey', toKeys: 'B', context: 'normal' },\n    { keys: '<S-Space>', type: 'keyToKey', toKeys: 'w' },\n    { keys: '<S-BS>', type: 'keyToKey', toKeys: 'b', context: 'normal' },\n    { keys: '<C-n>', type: 'keyToKey', toKeys: 'j' },\n    { keys: '<C-p>', type: 'keyToKey', toKeys: 'k' },\n    { keys: '<C-[>', type: 'keyToKey', toKeys: '<Esc>' },\n    { keys: '<C-c>', type: 'keyToKey', toKeys: '<Esc>' },\n    { keys: '<C-[>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },\n    { keys: '<C-c>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },\n    { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' },\n    { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual'},\n    { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' },\n    { keys: 'S', type: 'keyToKey', toKeys: 'VdO', context: 'visual' },\n    { keys: '<Home>', type: 'keyToKey', toKeys: '0' },\n    { keys: '<End>', type: 'keyToKey', toKeys: '$' },\n    { keys: '<PageUp>', type: 'keyToKey', toKeys: '<C-b>' },\n    { keys: '<PageDown>', type: 'keyToKey', toKeys: '<C-f>' },\n    { keys: '<CR>', type: 'keyToKey', toKeys: 'j^', context: 'normal' },\n    { keys: '<Ins>', type: 'keyToKey', toKeys: 'i', context: 'normal'},\n    { keys: '<Ins>', type: 'action', action: 'toggleOverwrite', context: 'insert' },\n    // Motions\n    { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }},\n    { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }},\n    { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }},\n    { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false }},\n    { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true }},\n    { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true }},\n    { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true }},\n    { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true }},\n    { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false }},\n    { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false }},\n    { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true }},\n    { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true }},\n    { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true }},\n    { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }},\n    { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true }},\n    { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true }},\n    { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }},\n    { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }},\n    { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }},\n    { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false }},\n    { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true }},\n    { keys: '<C-f>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }},\n    { keys: '<C-b>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }},\n    { keys: '<C-d>', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }},\n    { keys: '<C-u>', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true }},\n    { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }},\n    { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }},\n    {keys: \"g$\", type: \"motion\", motion: \"moveToEndOfDisplayLine\"},\n    {keys: \"g^\", type: \"motion\", motion: \"moveToStartOfDisplayLine\"},\n    {keys: \"g0\", type: \"motion\", motion: \"moveToStartOfDisplayLine\"},\n    { keys: '0', type: 'motion', motion: 'moveToStartOfLine' },\n    { keys: '^', type: 'motion', motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true }},\n    { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar:true }},\n    { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }},\n    { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true }},\n    { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true }},\n    { keys: 'f<character>', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true , inclusive: true }},\n    { keys: 'F<character>', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false }},\n    { keys: 't<character>', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true }},\n    { keys: 'T<character>', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false }},\n    { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true }},\n    { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false }},\n    { keys: '\\'<character>', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true, linewise: true}},\n    { keys: '`<character>', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true}},\n    { keys: ']`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } },\n    { keys: '[`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } },\n    { keys: ']\\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } },\n    { keys: '[\\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } },\n    // the next two aren't motions but must come before more general motion declarations\n    { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true}},\n    { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true}},\n    { keys: ']<character>', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true}},\n    { keys: '[<character>', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true}},\n    { keys: '|', type: 'motion', motion: 'moveToColumn'},\n    { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context:'visual'},\n    { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: {sameLine: true}, context:'visual'},\n    // Operators\n    { keys: 'd', type: 'operator', operator: 'delete' },\n    { keys: 'y', type: 'operator', operator: 'yank' },\n    { keys: 'c', type: 'operator', operator: 'change' },\n    { keys: '=', type: 'operator', operator: 'indentAuto' },\n    { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true }},\n    { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false }},\n    { keys: 'g~', type: 'operator', operator: 'changeCase' },\n    { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, isEdit: true },\n    { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true },\n    { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }},\n    { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }},\n    { keys: 'gn', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: true }},\n    { keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false }},\n    // Operator-Motion dual commands\n    { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }},\n    { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }},\n    { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},\n    { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual'},\n    { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'expandToLine', motionArgs: { linewise: true }, context: 'normal'},\n    { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual'},\n    { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},\n    { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual'},\n    { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal'},\n    { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual'},\n    { keys: '<C-u>', type: 'operatorMotion', operator: 'delete', motion: 'moveToStartOfLine', context: 'insert' },\n    { keys: '<C-w>', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' },\n    //ignore C-w in normal mode\n    { keys: '<C-w>', type: 'idle', context: 'normal' },\n    // Actions\n    { keys: '<C-i>', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true }},\n    { keys: '<C-o>', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false }},\n    { keys: '<C-e>', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true }},\n    { keys: '<C-y>', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true }},\n    { keys: 'a', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'charAfter' }, context: 'normal' },\n    { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' },\n    { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' },\n    { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' },\n    { keys: 'gi', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'lastEdit' }, context: 'normal' },\n    { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank'}, context: 'normal' },\n    { keys: 'gI', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'bol'}, context: 'normal' },\n    { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' },\n    { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' },\n    { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' },\n    { keys: 'v', type: 'action', action: 'toggleVisualMode' },\n    { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true }},\n    { keys: '<C-v>', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }},\n    { keys: '<C-q>', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }},\n    { keys: 'gv', type: 'action', action: 'reselectLastSelection' },\n    { keys: 'J', type: 'action', action: 'joinLines', isEdit: true },\n    { keys: 'gJ', type: 'action', action: 'joinLines', actionArgs: { keepSpaces: true }, isEdit: true },\n    { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true }},\n    { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true }},\n    { keys: 'r<character>', type: 'action', action: 'replace', isEdit: true },\n    { keys: '@<character>', type: 'action', action: 'replayMacro' },\n    { keys: 'q<character>', type: 'action', action: 'enterMacroRecordMode' },\n    // Handle Replace-mode as a special case of insert mode.\n    { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }, context: 'normal'},\n    { keys: 'R', type: 'operator', operator: 'change', operatorArgs: { linewise: true, fullLine: true }, context: 'visual', exitVisualBlock: true},\n    { keys: 'u', type: 'action', action: 'undo', context: 'normal' },\n    { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true },\n    { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true },\n    { keys: '<C-r>', type: 'action', action: 'redo' },\n    { keys: 'm<character>', type: 'action', action: 'setMark' },\n    { keys: '\"<character>', type: 'action', action: 'setRegister' },\n    { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }},\n    { keys: 'z.', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }},\n    { keys: 'z<CR>', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }},\n    { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: '.', type: 'action', action: 'repeatLastEdit' },\n    { keys: '<C-a>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}},\n    { keys: '<C-x>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}},\n    { keys: '<C-t>', type: 'action', action: 'indent', actionArgs: { indentRight: true }, context: 'insert' },\n    { keys: '<C-d>', type: 'action', action: 'indent', actionArgs: { indentRight: false }, context: 'insert' },\n    // Text object motions\n    { keys: 'a<character>', type: 'motion', motion: 'textObjectManipulation' },\n    { keys: 'i<character>', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }},\n    // Search\n    { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }},\n    { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }},\n    { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n    { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n    { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }},\n    { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }},\n    // Ex command\n    { keys: ':', type: 'ex' }\n  ];\n  var defaultKeymapLength = defaultKeymap.length;\n\n  /**\n   * Ex commands\n   * Care must be taken when adding to the default Ex command map. For any\n   * pair of commands that have a shared prefix, at least one of their\n   * shortNames must not match the prefix of the other command.\n   */\n  var defaultExCommandMap = [\n    { name: 'colorscheme', shortName: 'colo' },\n    { name: 'map' },\n    { name: 'imap', shortName: 'im' },\n    { name: 'nmap', shortName: 'nm' },\n    { name: 'vmap', shortName: 'vm' },\n    { name: 'unmap' },\n    { name: 'write', shortName: 'w' },\n    { name: 'undo', shortName: 'u' },\n    { name: 'redo', shortName: 'red' },\n    { name: 'set', shortName: 'se' },\n    { name: 'setlocal', shortName: 'setl' },\n    { name: 'setglobal', shortName: 'setg' },\n    { name: 'sort', shortName: 'sor' },\n    { name: 'substitute', shortName: 's', possiblyAsync: true },\n    { name: 'nohlsearch', shortName: 'noh' },\n    { name: 'yank', shortName: 'y' },\n    { name: 'delmarks', shortName: 'delm' },\n    { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true },\n    { name: 'vglobal', shortName: 'v' },\n    { name: 'global', shortName: 'g' }\n  ];\n\n  var Vim = function() {\n    function enterVimMode(cm) {\n      cm.setOption('disableInput', true);\n      cm.setOption('showCursorWhenSelecting', false);\n      CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n      cm.on('cursorActivity', onCursorActivity);\n      maybeInitVimState(cm);\n      CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm));\n    }\n\n    function leaveVimMode(cm) {\n      cm.setOption('disableInput', false);\n      cm.off('cursorActivity', onCursorActivity);\n      CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm));\n      cm.state.vim = null;\n      if (highlightTimeout) clearTimeout(highlightTimeout);\n    }\n\n    function detachVimMap(cm, next) {\n      if (this == CodeMirror.keyMap.vim) {\n        cm.options.$customCursor = null;\n        CodeMirror.rmClass(cm.getWrapperElement(), \"cm-fat-cursor\");\n      }\n\n      if (!next || next.attach != attachVimMap)\n        leaveVimMode(cm);\n    }\n    function attachVimMap(cm, prev) {\n      if (this == CodeMirror.keyMap.vim) {\n        if (cm.curOp) cm.curOp.selectionChanged = true;\n        cm.options.$customCursor = transformCursor;\n        CodeMirror.addClass(cm.getWrapperElement(), \"cm-fat-cursor\");\n      }\n\n      if (!prev || prev.attach != attachVimMap)\n        enterVimMode(cm);\n    }\n\n    // Deprecated, simply setting the keymap works again.\n    CodeMirror.defineOption('vimMode', false, function(cm, val, prev) {\n      if (val && cm.getOption(\"keyMap\") != \"vim\")\n        cm.setOption(\"keyMap\", \"vim\");\n      else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption(\"keyMap\")))\n        cm.setOption(\"keyMap\", \"default\");\n    });\n\n    function cmKey(key, cm) {\n      if (!cm) { return undefined; }\n      if (this[key]) { return this[key]; }\n      var vimKey = cmKeyToVimKey(key);\n      if (!vimKey) {\n        return false;\n      }\n      var cmd = vimApi.findKey(cm, vimKey);\n      if (typeof cmd == 'function') {\n        CodeMirror.signal(cm, 'vim-keypress', vimKey);\n      }\n      return cmd;\n    }\n\n    var modifiers = {Shift:'S',Ctrl:'C',Alt:'A',Cmd:'D',Mod:'A',CapsLock:''};\n    var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del',Insert:'Ins'};\n    function cmKeyToVimKey(key) {\n      if (key.charAt(0) == '\\'') {\n        // Keypress character binding of format \"'a'\"\n        return key.charAt(1);\n      }\n      var pieces = key.split(/-(?!$)/);\n      var lastPiece = pieces[pieces.length - 1];\n      if (pieces.length == 1 && pieces[0].length == 1) {\n        // No-modifier bindings use literal character bindings above. Skip.\n        return false;\n      } else if (pieces.length == 2 && pieces[0] == 'Shift' && lastPiece.length == 1) {\n        // Ignore Shift+char bindings as they should be handled by literal character.\n        return false;\n      }\n      var hasCharacter = false;\n      for (var i = 0; i < pieces.length; i++) {\n        var piece = pieces[i];\n        if (piece in modifiers) { pieces[i] = modifiers[piece]; }\n        else { hasCharacter = true; }\n        if (piece in specialKeys) { pieces[i] = specialKeys[piece]; }\n      }\n      if (!hasCharacter) {\n        // Vim does not support modifier only keys.\n        return false;\n      }\n      // TODO: Current bindings expect the character to be lower case, but\n      // it looks like vim key notation uses upper case.\n      if (isUpperCase(lastPiece)) {\n        pieces[pieces.length - 1] = lastPiece.toLowerCase();\n      }\n      return '<' + pieces.join('-') + '>';\n    }\n\n    function getOnPasteFn(cm) {\n      var vim = cm.state.vim;\n      if (!vim.onPasteFn) {\n        vim.onPasteFn = function() {\n          if (!vim.insertMode) {\n            cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));\n            actions.enterInsertMode(cm, {}, vim);\n          }\n        };\n      }\n      return vim.onPasteFn;\n    }\n\n    var numberRegex = /[\\d]/;\n    var wordCharTest = [CodeMirror.isWordChar, function(ch) {\n      return ch && !CodeMirror.isWordChar(ch) && !/\\s/.test(ch);\n    }], bigWordCharTest = [function(ch) {\n      return /\\S/.test(ch);\n    }];\n    function makeKeyRange(start, size) {\n      var keys = [];\n      for (var i = start; i < start + size; i++) {\n        keys.push(String.fromCharCode(i));\n      }\n      return keys;\n    }\n    var upperCaseAlphabet = makeKeyRange(65, 26);\n    var lowerCaseAlphabet = makeKeyRange(97, 26);\n    var numbers = makeKeyRange(48, 10);\n    var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']);\n    var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '\"', '.', ':', '_', '/']);\n    var upperCaseChars;\n    try { upperCaseChars = new RegExp(\"^[\\\\p{Lu}]$\", \"u\"); }\n    catch (_) { upperCaseChars = /^[A-Z]$/; }\n\n    function isLine(cm, line) {\n      return line >= cm.firstLine() && line <= cm.lastLine();\n    }\n    function isLowerCase(k) {\n      return (/^[a-z]$/).test(k);\n    }\n    function isMatchableSymbol(k) {\n      return '()[]{}'.indexOf(k) != -1;\n    }\n    function isNumber(k) {\n      return numberRegex.test(k);\n    }\n    function isUpperCase(k) {\n      return upperCaseChars.test(k);\n    }\n    function isWhiteSpaceString(k) {\n      return (/^\\s*$/).test(k);\n    }\n    function isEndOfSentenceSymbol(k) {\n      return '.?!'.indexOf(k) != -1;\n    }\n    function inArray(val, arr) {\n      for (var i = 0; i < arr.length; i++) {\n        if (arr[i] == val) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    var options = {};\n    function defineOption(name, defaultValue, type, aliases, callback) {\n      if (defaultValue === undefined && !callback) {\n        throw Error('defaultValue is required unless callback is provided');\n      }\n      if (!type) { type = 'string'; }\n      options[name] = {\n        type: type,\n        defaultValue: defaultValue,\n        callback: callback\n      };\n      if (aliases) {\n        for (var i = 0; i < aliases.length; i++) {\n          options[aliases[i]] = options[name];\n        }\n      }\n      if (defaultValue) {\n        setOption(name, defaultValue);\n      }\n    }\n\n    function setOption(name, value, cm, cfg) {\n      var option = options[name];\n      cfg = cfg || {};\n      var scope = cfg.scope;\n      if (!option) {\n        return new Error('Unknown option: ' + name);\n      }\n      if (option.type == 'boolean') {\n        if (value && value !== true) {\n          return new Error('Invalid argument: ' + name + '=' + value);\n        } else if (value !== false) {\n          // Boolean options are set to true if value is not defined.\n          value = true;\n        }\n      }\n      if (option.callback) {\n        if (scope !== 'local') {\n          option.callback(value, undefined);\n        }\n        if (scope !== 'global' && cm) {\n          option.callback(value, cm);\n        }\n      } else {\n        if (scope !== 'local') {\n          option.value = option.type == 'boolean' ? !!value : value;\n        }\n        if (scope !== 'global' && cm) {\n          cm.state.vim.options[name] = {value: value};\n        }\n      }\n    }\n\n    function getOption(name, cm, cfg) {\n      var option = options[name];\n      cfg = cfg || {};\n      var scope = cfg.scope;\n      if (!option) {\n        return new Error('Unknown option: ' + name);\n      }\n      if (option.callback) {\n        var local = cm && option.callback(undefined, cm);\n        if (scope !== 'global' && local !== undefined) {\n          return local;\n        }\n        if (scope !== 'local') {\n          return option.callback();\n        }\n        return;\n      } else {\n        var local = (scope !== 'global') && (cm && cm.state.vim.options[name]);\n        return (local || (scope !== 'local') && option || {}).value;\n      }\n    }\n\n    defineOption('filetype', undefined, 'string', ['ft'], function(name, cm) {\n      // Option is local. Do nothing for global.\n      if (cm === undefined) {\n        return;\n      }\n      // The 'filetype' option proxies to the CodeMirror 'mode' option.\n      if (name === undefined) {\n        var mode = cm.getOption('mode');\n        return mode == 'null' ? '' : mode;\n      } else {\n        var mode = name == '' ? 'null' : name;\n        cm.setOption('mode', mode);\n      }\n    });\n\n    var createCircularJumpList = function() {\n      var size = 100;\n      var pointer = -1;\n      var head = 0;\n      var tail = 0;\n      var buffer = new Array(size);\n      function add(cm, oldCur, newCur) {\n        var current = pointer % size;\n        var curMark = buffer[current];\n        function useNextSlot(cursor) {\n          var next = ++pointer % size;\n          var trashMark = buffer[next];\n          if (trashMark) {\n            trashMark.clear();\n          }\n          buffer[next] = cm.setBookmark(cursor);\n        }\n        if (curMark) {\n          var markPos = curMark.find();\n          // avoid recording redundant cursor position\n          if (markPos && !cursorEqual(markPos, oldCur)) {\n            useNextSlot(oldCur);\n          }\n        } else {\n          useNextSlot(oldCur);\n        }\n        useNextSlot(newCur);\n        head = pointer;\n        tail = pointer - size + 1;\n        if (tail < 0) {\n          tail = 0;\n        }\n      }\n      function move(cm, offset) {\n        pointer += offset;\n        if (pointer > head) {\n          pointer = head;\n        } else if (pointer < tail) {\n          pointer = tail;\n        }\n        var mark = buffer[(size + pointer) % size];\n        // skip marks that are temporarily removed from text buffer\n        if (mark && !mark.find()) {\n          var inc = offset > 0 ? 1 : -1;\n          var newCur;\n          var oldCur = cm.getCursor();\n          do {\n            pointer += inc;\n            mark = buffer[(size + pointer) % size];\n            // skip marks that are the same as current position\n            if (mark &&\n                (newCur = mark.find()) &&\n                !cursorEqual(oldCur, newCur)) {\n              break;\n            }\n          } while (pointer < head && pointer > tail);\n        }\n        return mark;\n      }\n      function find(cm, offset) {\n        var oldPointer = pointer;\n        var mark = move(cm, offset);\n        pointer = oldPointer;\n        return mark && mark.find();\n      }\n      return {\n        cachedCursor: undefined, //used for # and * jumps\n        add: add,\n        find: find,\n        move: move\n      };\n    };\n\n    // Returns an object to track the changes associated insert mode.  It\n    // clones the object that is passed in, or creates an empty object one if\n    // none is provided.\n    var createInsertModeChanges = function(c) {\n      if (c) {\n        // Copy construction\n        return {\n          changes: c.changes,\n          expectCursorActivityForChange: c.expectCursorActivityForChange\n        };\n      }\n      return {\n        // Change list\n        changes: [],\n        // Set to true on change, false on cursorActivity.\n        expectCursorActivityForChange: false\n      };\n    };\n\n    function MacroModeState() {\n      this.latestRegister = undefined;\n      this.isPlaying = false;\n      this.isRecording = false;\n      this.replaySearchQueries = [];\n      this.onRecordingDone = undefined;\n      this.lastInsertModeChanges = createInsertModeChanges();\n    }\n    MacroModeState.prototype = {\n      exitMacroRecordMode: function() {\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.onRecordingDone) {\n          macroModeState.onRecordingDone(); // close dialog\n        }\n        macroModeState.onRecordingDone = undefined;\n        macroModeState.isRecording = false;\n      },\n      enterMacroRecordMode: function(cm, registerName) {\n        var register =\n            vimGlobalState.registerController.getRegister(registerName);\n        if (register) {\n          register.clear();\n          this.latestRegister = registerName;\n          if (cm.openDialog) {\n            this.onRecordingDone = cm.openDialog(\n                document.createTextNode('(recording)['+registerName+']'), null, {bottom:true});\n          }\n          this.isRecording = true;\n        }\n      }\n    };\n\n    function maybeInitVimState(cm) {\n      if (!cm.state.vim) {\n        // Store instance state in the CodeMirror object.\n        cm.state.vim = {\n          inputState: new InputState(),\n          // Vim's input state that triggered the last edit, used to repeat\n          // motions and operators with '.'.\n          lastEditInputState: undefined,\n          // Vim's action command before the last edit, used to repeat actions\n          // with '.' and insert mode repeat.\n          lastEditActionCommand: undefined,\n          // When using jk for navigation, if you move from a longer line to a\n          // shorter line, the cursor may clip to the end of the shorter line.\n          // If j is pressed again and cursor goes to the next line, the\n          // cursor should go back to its horizontal position on the longer\n          // line if it can. This is to keep track of the horizontal position.\n          lastHPos: -1,\n          // Doing the same with screen-position for gj/gk\n          lastHSPos: -1,\n          // The last motion command run. Cleared if a non-motion command gets\n          // executed in between.\n          lastMotion: null,\n          marks: {},\n          insertMode: false,\n          // Repeat count for changes made in insert mode, triggered by key\n          // sequences like 3,i. Only exists when insertMode is true.\n          insertModeRepeat: undefined,\n          visualMode: false,\n          // If we are in visual line mode. No effect if visualMode is false.\n          visualLine: false,\n          visualBlock: false,\n          lastSelection: null,\n          lastPastedText: null,\n          sel: {},\n          // Buffer-local/window-local values of vim options.\n          options: {}\n        };\n      }\n      return cm.state.vim;\n    }\n    var vimGlobalState;\n    function resetVimGlobalState() {\n      vimGlobalState = {\n        // The current search query.\n        searchQuery: null,\n        // Whether we are searching backwards.\n        searchIsReversed: false,\n        // Replace part of the last substituted pattern\n        lastSubstituteReplacePart: undefined,\n        jumpList: createCircularJumpList(),\n        macroModeState: new MacroModeState,\n        // Recording latest f, t, F or T motion command.\n        lastCharacterSearch: {increment:0, forward:true, selectedCharacter:''},\n        registerController: new RegisterController({}),\n        // search history buffer\n        searchHistoryController: new HistoryController(),\n        // ex Command history buffer\n        exCommandHistoryController : new HistoryController()\n      };\n      for (var optionName in options) {\n        var option = options[optionName];\n        option.value = option.defaultValue;\n      }\n    }\n\n    var lastInsertModeKeyTimer;\n    var vimApi= {\n      buildKeyMap: function() {\n        // TODO: Convert keymap into dictionary format for fast lookup.\n      },\n      // Testing hook, though it might be useful to expose the register\n      // controller anyway.\n      getRegisterController: function() {\n        return vimGlobalState.registerController;\n      },\n      // Testing hook.\n      resetVimGlobalState_: resetVimGlobalState,\n\n      // Testing hook.\n      getVimGlobalState_: function() {\n        return vimGlobalState;\n      },\n\n      // Testing hook.\n      maybeInitVimState_: maybeInitVimState,\n\n      suppressErrorLogging: false,\n\n      InsertModeKey: InsertModeKey,\n      map: function(lhs, rhs, ctx) {\n        // Add user defined key bindings.\n        exCommandDispatcher.map(lhs, rhs, ctx);\n      },\n      unmap: function(lhs, ctx) {\n        return exCommandDispatcher.unmap(lhs, ctx);\n      },\n      // Non-recursive map function.\n      // NOTE: This will not create mappings to key maps that aren't present\n      // in the default key map. See TODO at bottom of function.\n      noremap: function(lhs, rhs, ctx) {\n        function toCtxArray(ctx) {\n          return ctx ? [ctx] : ['normal', 'insert', 'visual'];\n        }\n        var ctxsToMap = toCtxArray(ctx);\n        // Look through all actual defaults to find a map candidate.\n        var actualLength = defaultKeymap.length, origLength = defaultKeymapLength;\n        for (var i = actualLength - origLength;\n             i < actualLength && ctxsToMap.length;\n             i++) {\n          var mapping = defaultKeymap[i];\n          // Omit mappings that operate in the wrong context(s) and those of invalid type.\n          if (mapping.keys == rhs &&\n              (!ctx || !mapping.context || mapping.context === ctx) &&\n              mapping.type.substr(0, 2) !== 'ex' &&\n              mapping.type.substr(0, 3) !== 'key') {\n            // Make a shallow copy of the original keymap entry.\n            var newMapping = {};\n            for (var key in mapping) {\n              newMapping[key] = mapping[key];\n            }\n            // Modify it point to the new mapping with the proper context.\n            newMapping.keys = lhs;\n            if (ctx && !newMapping.context) {\n              newMapping.context = ctx;\n            }\n            // Add it to the keymap with a higher priority than the original.\n            this._mapCommand(newMapping);\n            // Record the mapped contexts as complete.\n            var mappedCtxs = toCtxArray(mapping.context);\n            ctxsToMap = ctxsToMap.filter(function(el) { return mappedCtxs.indexOf(el) === -1; });\n          }\n        }\n        // TODO: Create non-recursive keyToKey mappings for the unmapped contexts once those exist.\n      },\n      // Remove all user-defined mappings for the provided context.\n      mapclear: function(ctx) {\n        // Partition the existing keymap into user-defined and true defaults.\n        var actualLength = defaultKeymap.length,\n            origLength = defaultKeymapLength;\n        var userKeymap = defaultKeymap.slice(0, actualLength - origLength);\n        defaultKeymap = defaultKeymap.slice(actualLength - origLength);\n        if (ctx) {\n          // If a specific context is being cleared, we need to keep mappings\n          // from all other contexts.\n          for (var i = userKeymap.length - 1; i >= 0; i--) {\n            var mapping = userKeymap[i];\n            if (ctx !== mapping.context) {\n              if (mapping.context) {\n                this._mapCommand(mapping);\n              } else {\n                // `mapping` applies to all contexts so create keymap copies\n                // for each context except the one being cleared.\n                var contexts = ['normal', 'insert', 'visual'];\n                for (var j in contexts) {\n                  if (contexts[j] !== ctx) {\n                    var newMapping = {};\n                    for (var key in mapping) {\n                      newMapping[key] = mapping[key];\n                    }\n                    newMapping.context = contexts[j];\n                    this._mapCommand(newMapping);\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      // TODO: Expose setOption and getOption as instance methods. Need to decide how to namespace\n      // them, or somehow make them work with the existing CodeMirror setOption/getOption API.\n      setOption: setOption,\n      getOption: getOption,\n      defineOption: defineOption,\n      defineEx: function(name, prefix, func){\n        if (!prefix) {\n          prefix = name;\n        } else if (name.indexOf(prefix) !== 0) {\n          throw new Error('(Vim.defineEx) \"'+prefix+'\" is not a prefix of \"'+name+'\", command not registered');\n        }\n        exCommands[name]=func;\n        exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'};\n      },\n      handleKey: function (cm, key, origin) {\n        var command = this.findKey(cm, key, origin);\n        if (typeof command === 'function') {\n          return command();\n        }\n      },\n      /**\n       * This is the outermost function called by CodeMirror, after keys have\n       * been mapped to their Vim equivalents.\n       *\n       * Finds a command based on the key (and cached keys if there is a\n       * multi-key sequence). Returns `undefined` if no key is matched, a noop\n       * function if a partial match is found (multi-key), and a function to\n       * execute the bound command if a a key is matched. The function always\n       * returns true.\n       */\n      findKey: function(cm, key, origin) {\n        var vim = maybeInitVimState(cm);\n        function handleMacroRecording() {\n          var macroModeState = vimGlobalState.macroModeState;\n          if (macroModeState.isRecording) {\n            if (key == 'q') {\n              macroModeState.exitMacroRecordMode();\n              clearInputState(cm);\n              return true;\n            }\n            if (origin != 'mapping') {\n              logKey(macroModeState, key);\n            }\n          }\n        }\n        function handleEsc() {\n          if (key == '<Esc>') {\n            if (vim.visualMode) {\n              // Get back to normal mode.\n              exitVisualMode(cm);\n            } else if (vim.insertMode) {\n              // Get back to normal mode.\n              exitInsertMode(cm);\n            } else {\n              // We're already in normal mode. Let '<Esc>' be handled normally.\n              return;\n            }\n            clearInputState(cm);\n            return true;\n          }\n        }\n        function doKeyToKey(keys) {\n          // TODO: prevent infinite recursion.\n          var match;\n          while (keys) {\n            // Pull off one command key, which is either a single character\n            // or a special sequence wrapped in '<' and '>', e.g. '<Space>'.\n            match = (/<\\w+-.+?>|<\\w+>|./).exec(keys);\n            key = match[0];\n            keys = keys.substring(match.index + key.length);\n            vimApi.handleKey(cm, key, 'mapping');\n          }\n        }\n\n        function handleKeyInsertMode() {\n          if (handleEsc()) { return true; }\n          var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key;\n          var keysAreChars = key.length == 1;\n          var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert');\n          // Need to check all key substrings in insert mode.\n          while (keys.length > 1 && match.type != 'full') {\n            var keys = vim.inputState.keyBuffer = keys.slice(1);\n            var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert');\n            if (thisMatch.type != 'none') { match = thisMatch; }\n          }\n          if (match.type == 'none') { clearInputState(cm); return false; }\n          else if (match.type == 'partial') {\n            if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); }\n            lastInsertModeKeyTimer = window.setTimeout(\n              function() { if (vim.insertMode && vim.inputState.keyBuffer) { clearInputState(cm); } },\n              getOption('insertModeEscKeysTimeout'));\n            return !keysAreChars;\n          }\n\n          if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); }\n          if (keysAreChars) {\n            var selections = cm.listSelections();\n            for (var i = 0; i < selections.length; i++) {\n              var here = selections[i].head;\n              cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input');\n            }\n            vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop();\n          }\n          clearInputState(cm);\n          return match.command;\n        }\n\n        function handleKeyNonInsertMode() {\n          if (handleMacroRecording() || handleEsc()) { return true; }\n\n          var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key;\n          if (/^[1-9]\\d*$/.test(keys)) { return true; }\n\n          var keysMatcher = /^(\\d*)(.*)$/.exec(keys);\n          if (!keysMatcher) { clearInputState(cm); return false; }\n          var context = vim.visualMode ? 'visual' :\n                                         'normal';\n          var mainKey = keysMatcher[2] || keysMatcher[1];\n          if (vim.inputState.operatorShortcut && vim.inputState.operatorShortcut.slice(-1) == mainKey) {\n            // multikey operators act linewise by repeating only the last character\n            mainKey = vim.inputState.operatorShortcut;\n          }\n          var match = commandDispatcher.matchCommand(mainKey, defaultKeymap, vim.inputState, context);\n          if (match.type == 'none') { clearInputState(cm); return false; }\n          else if (match.type == 'partial') { return true; }\n\n          vim.inputState.keyBuffer = '';\n          var keysMatcher = /^(\\d*)(.*)$/.exec(keys);\n          if (keysMatcher[1] && keysMatcher[1] != '0') {\n            vim.inputState.pushRepeatDigit(keysMatcher[1]);\n          }\n          return match.command;\n        }\n\n        var command;\n        if (vim.insertMode) { command = handleKeyInsertMode(); }\n        else { command = handleKeyNonInsertMode(); }\n        if (command === false) {\n          return !vim.insertMode && key.length === 1 ? function() { return true; } : undefined;\n        } else if (command === true) {\n          // TODO: Look into using CodeMirror's multi-key handling.\n          // Return no-op since we are caching the key. Counts as handled, but\n          // don't want act on it just yet.\n          return function() { return true; };\n        } else {\n          return function() {\n            return cm.operation(function() {\n              cm.curOp.isVimOp = true;\n              try {\n                if (command.type == 'keyToKey') {\n                  doKeyToKey(command.toKeys);\n                } else {\n                  commandDispatcher.processCommand(cm, vim, command);\n                }\n              } catch (e) {\n                // clear VIM state in case it's in a bad state.\n                cm.state.vim = undefined;\n                maybeInitVimState(cm);\n                if (!vimApi.suppressErrorLogging) {\n                  console['log'](e);\n                }\n                throw e;\n              }\n              return true;\n            });\n          };\n        }\n      },\n      handleEx: function(cm, input) {\n        exCommandDispatcher.processCommand(cm, input);\n      },\n\n      defineMotion: defineMotion,\n      defineAction: defineAction,\n      defineOperator: defineOperator,\n      mapCommand: mapCommand,\n      _mapCommand: _mapCommand,\n\n      defineRegister: defineRegister,\n\n      exitVisualMode: exitVisualMode,\n      exitInsertMode: exitInsertMode\n    };\n\n    // Represents the current input state.\n    function InputState() {\n      this.prefixRepeat = [];\n      this.motionRepeat = [];\n\n      this.operator = null;\n      this.operatorArgs = null;\n      this.motion = null;\n      this.motionArgs = null;\n      this.keyBuffer = []; // For matching multi-key commands.\n      this.registerName = null; // Defaults to the unnamed register.\n    }\n    InputState.prototype.pushRepeatDigit = function(n) {\n      if (!this.operator) {\n        this.prefixRepeat = this.prefixRepeat.concat(n);\n      } else {\n        this.motionRepeat = this.motionRepeat.concat(n);\n      }\n    };\n    InputState.prototype.getRepeat = function() {\n      var repeat = 0;\n      if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) {\n        repeat = 1;\n        if (this.prefixRepeat.length > 0) {\n          repeat *= parseInt(this.prefixRepeat.join(''), 10);\n        }\n        if (this.motionRepeat.length > 0) {\n          repeat *= parseInt(this.motionRepeat.join(''), 10);\n        }\n      }\n      return repeat;\n    };\n\n    function clearInputState(cm, reason) {\n      cm.state.vim.inputState = new InputState();\n      CodeMirror.signal(cm, 'vim-command-done', reason);\n    }\n\n    /*\n     * Register stores information about copy and paste registers.  Besides\n     * text, a register must store whether it is linewise (i.e., when it is\n     * pasted, should it insert itself into a new line, or should the text be\n     * inserted at the cursor position.)\n     */\n    function Register(text, linewise, blockwise) {\n      this.clear();\n      this.keyBuffer = [text || ''];\n      this.insertModeChanges = [];\n      this.searchQueries = [];\n      this.linewise = !!linewise;\n      this.blockwise = !!blockwise;\n    }\n    Register.prototype = {\n      setText: function(text, linewise, blockwise) {\n        this.keyBuffer = [text || ''];\n        this.linewise = !!linewise;\n        this.blockwise = !!blockwise;\n      },\n      pushText: function(text, linewise) {\n        // if this register has ever been set to linewise, use linewise.\n        if (linewise) {\n          if (!this.linewise) {\n            this.keyBuffer.push('\\n');\n          }\n          this.linewise = true;\n        }\n        this.keyBuffer.push(text);\n      },\n      pushInsertModeChanges: function(changes) {\n        this.insertModeChanges.push(createInsertModeChanges(changes));\n      },\n      pushSearchQuery: function(query) {\n        this.searchQueries.push(query);\n      },\n      clear: function() {\n        this.keyBuffer = [];\n        this.insertModeChanges = [];\n        this.searchQueries = [];\n        this.linewise = false;\n      },\n      toString: function() {\n        return this.keyBuffer.join('');\n      }\n    };\n\n    /**\n     * Defines an external register.\n     *\n     * The name should be a single character that will be used to reference the register.\n     * The register should support setText, pushText, clear, and toString(). See Register\n     * for a reference implementation.\n     */\n    function defineRegister(name, register) {\n      var registers = vimGlobalState.registerController.registers;\n      if (!name || name.length != 1) {\n        throw Error('Register name must be 1 character');\n      }\n      if (registers[name]) {\n        throw Error('Register already defined ' + name);\n      }\n      registers[name] = register;\n      validRegisters.push(name);\n    }\n\n    /*\n     * vim registers allow you to keep many independent copy and paste buffers.\n     * See http://usevim.com/2012/04/13/registers/ for an introduction.\n     *\n     * RegisterController keeps the state of all the registers.  An initial\n     * state may be passed in.  The unnamed register '\"' will always be\n     * overridden.\n     */\n    function RegisterController(registers) {\n      this.registers = registers;\n      this.unnamedRegister = registers['\"'] = new Register();\n      registers['.'] = new Register();\n      registers[':'] = new Register();\n      registers['/'] = new Register();\n    }\n    RegisterController.prototype = {\n      pushText: function(registerName, operator, text, linewise, blockwise) {\n        // The black hole register, \"_, means delete/yank to nowhere.\n        if (registerName === '_') return;\n        if (linewise && text.charAt(text.length - 1) !== '\\n'){\n          text += '\\n';\n        }\n        // Lowercase and uppercase registers refer to the same register.\n        // Uppercase just means append.\n        var register = this.isValidRegister(registerName) ?\n            this.getRegister(registerName) : null;\n        // if no register/an invalid register was specified, things go to the\n        // default registers\n        if (!register) {\n          switch (operator) {\n            case 'yank':\n              // The 0 register contains the text from the most recent yank.\n              this.registers['0'] = new Register(text, linewise, blockwise);\n              break;\n            case 'delete':\n            case 'change':\n              if (text.indexOf('\\n') == -1) {\n                // Delete less than 1 line. Update the small delete register.\n                this.registers['-'] = new Register(text, linewise);\n              } else {\n                // Shift down the contents of the numbered registers and put the\n                // deleted text into register 1.\n                this.shiftNumericRegisters_();\n                this.registers['1'] = new Register(text, linewise);\n              }\n              break;\n          }\n          // Make sure the unnamed register is set to what just happened\n          this.unnamedRegister.setText(text, linewise, blockwise);\n          return;\n        }\n\n        // If we've gotten to this point, we've actually specified a register\n        var append = isUpperCase(registerName);\n        if (append) {\n          register.pushText(text, linewise);\n        } else {\n          register.setText(text, linewise, blockwise);\n        }\n        // The unnamed register always has the same value as the last used\n        // register.\n        this.unnamedRegister.setText(register.toString(), linewise);\n      },\n      // Gets the register named @name.  If one of @name doesn't already exist,\n      // create it.  If @name is invalid, return the unnamedRegister.\n      getRegister: function(name) {\n        if (!this.isValidRegister(name)) {\n          return this.unnamedRegister;\n        }\n        name = name.toLowerCase();\n        if (!this.registers[name]) {\n          this.registers[name] = new Register();\n        }\n        return this.registers[name];\n      },\n      isValidRegister: function(name) {\n        return name && inArray(name, validRegisters);\n      },\n      shiftNumericRegisters_: function() {\n        for (var i = 9; i >= 2; i--) {\n          this.registers[i] = this.getRegister('' + (i - 1));\n        }\n      }\n    };\n    function HistoryController() {\n        this.historyBuffer = [];\n        this.iterator = 0;\n        this.initialPrefix = null;\n    }\n    HistoryController.prototype = {\n      // the input argument here acts a user entered prefix for a small time\n      // until we start autocompletion in which case it is the autocompleted.\n      nextMatch: function (input, up) {\n        var historyBuffer = this.historyBuffer;\n        var dir = up ? -1 : 1;\n        if (this.initialPrefix === null) this.initialPrefix = input;\n        for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i+= dir) {\n          var element = historyBuffer[i];\n          for (var j = 0; j <= element.length; j++) {\n            if (this.initialPrefix == element.substring(0, j)) {\n              this.iterator = i;\n              return element;\n            }\n          }\n        }\n        // should return the user input in case we reach the end of buffer.\n        if (i >= historyBuffer.length) {\n          this.iterator = historyBuffer.length;\n          return this.initialPrefix;\n        }\n        // return the last autocompleted query or exCommand as it is.\n        if (i < 0 ) return input;\n      },\n      pushInput: function(input) {\n        var index = this.historyBuffer.indexOf(input);\n        if (index > -1) this.historyBuffer.splice(index, 1);\n        if (input.length) this.historyBuffer.push(input);\n      },\n      reset: function() {\n        this.initialPrefix = null;\n        this.iterator = this.historyBuffer.length;\n      }\n    };\n    var commandDispatcher = {\n      matchCommand: function(keys, keyMap, inputState, context) {\n        var matches = commandMatches(keys, keyMap, context, inputState);\n        if (!matches.full && !matches.partial) {\n          return {type: 'none'};\n        } else if (!matches.full && matches.partial) {\n          return {type: 'partial'};\n        }\n\n        var bestMatch;\n        for (var i = 0; i < matches.full.length; i++) {\n          var match = matches.full[i];\n          if (!bestMatch) {\n            bestMatch = match;\n          }\n        }\n        if (bestMatch.keys.slice(-11) == '<character>') {\n          var character = lastChar(keys);\n          if (!character) return {type: 'none'};\n          inputState.selectedCharacter = character;\n        }\n        return {type: 'full', command: bestMatch};\n      },\n      processCommand: function(cm, vim, command) {\n        vim.inputState.repeatOverride = command.repeatOverride;\n        switch (command.type) {\n          case 'motion':\n            this.processMotion(cm, vim, command);\n            break;\n          case 'operator':\n            this.processOperator(cm, vim, command);\n            break;\n          case 'operatorMotion':\n            this.processOperatorMotion(cm, vim, command);\n            break;\n          case 'action':\n            this.processAction(cm, vim, command);\n            break;\n          case 'search':\n            this.processSearch(cm, vim, command);\n            break;\n          case 'ex':\n          case 'keyToEx':\n            this.processEx(cm, vim, command);\n            break;\n          default:\n            break;\n        }\n      },\n      processMotion: function(cm, vim, command) {\n        vim.inputState.motion = command.motion;\n        vim.inputState.motionArgs = copyArgs(command.motionArgs);\n        this.evalInput(cm, vim);\n      },\n      processOperator: function(cm, vim, command) {\n        var inputState = vim.inputState;\n        if (inputState.operator) {\n          if (inputState.operator == command.operator) {\n            // Typing an operator twice like 'dd' makes the operator operate\n            // linewise\n            inputState.motion = 'expandToLine';\n            inputState.motionArgs = { linewise: true };\n            this.evalInput(cm, vim);\n            return;\n          } else {\n            // 2 different operators in a row doesn't make sense.\n            clearInputState(cm);\n          }\n        }\n        inputState.operator = command.operator;\n        inputState.operatorArgs = copyArgs(command.operatorArgs);\n        if (command.keys.length > 1) {\n          inputState.operatorShortcut = command.keys;\n        }\n        if (command.exitVisualBlock) {\n            vim.visualBlock = false;\n            updateCmSelection(cm);\n        }\n        if (vim.visualMode) {\n          // Operating on a selection in visual mode. We don't need a motion.\n          this.evalInput(cm, vim);\n        }\n      },\n      processOperatorMotion: function(cm, vim, command) {\n        var visualMode = vim.visualMode;\n        var operatorMotionArgs = copyArgs(command.operatorMotionArgs);\n        if (operatorMotionArgs) {\n          // Operator motions may have special behavior in visual mode.\n          if (visualMode && operatorMotionArgs.visualLine) {\n            vim.visualLine = true;\n          }\n        }\n        this.processOperator(cm, vim, command);\n        if (!visualMode) {\n          this.processMotion(cm, vim, command);\n        }\n      },\n      processAction: function(cm, vim, command) {\n        var inputState = vim.inputState;\n        var repeat = inputState.getRepeat();\n        var repeatIsExplicit = !!repeat;\n        var actionArgs = copyArgs(command.actionArgs) || {};\n        if (inputState.selectedCharacter) {\n          actionArgs.selectedCharacter = inputState.selectedCharacter;\n        }\n        // Actions may or may not have motions and operators. Do these first.\n        if (command.operator) {\n          this.processOperator(cm, vim, command);\n        }\n        if (command.motion) {\n          this.processMotion(cm, vim, command);\n        }\n        if (command.motion || command.operator) {\n          this.evalInput(cm, vim);\n        }\n        actionArgs.repeat = repeat || 1;\n        actionArgs.repeatIsExplicit = repeatIsExplicit;\n        actionArgs.registerName = inputState.registerName;\n        clearInputState(cm);\n        vim.lastMotion = null;\n        if (command.isEdit) {\n          this.recordLastEdit(vim, inputState, command);\n        }\n        actions[command.action](cm, actionArgs, vim);\n      },\n      processSearch: function(cm, vim, command) {\n        if (!cm.getSearchCursor) {\n          // Search depends on SearchCursor.\n          return;\n        }\n        var forward = command.searchArgs.forward;\n        var wholeWordOnly = command.searchArgs.wholeWordOnly;\n        getSearchState(cm).setReversed(!forward);\n        var promptPrefix = (forward) ? '/' : '?';\n        var originalQuery = getSearchState(cm).getQuery();\n        var originalScrollPos = cm.getScrollInfo();\n        function handleQuery(query, ignoreCase, smartCase) {\n          vimGlobalState.searchHistoryController.pushInput(query);\n          vimGlobalState.searchHistoryController.reset();\n          try {\n            updateSearchQuery(cm, query, ignoreCase, smartCase);\n          } catch (e) {\n            showConfirm(cm, 'Invalid regex: ' + query);\n            clearInputState(cm);\n            return;\n          }\n          commandDispatcher.processMotion(cm, vim, {\n            type: 'motion',\n            motion: 'findNext',\n            motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist }\n          });\n        }\n        function onPromptClose(query) {\n          cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n          handleQuery(query, true /** ignoreCase */, true /** smartCase */);\n          var macroModeState = vimGlobalState.macroModeState;\n          if (macroModeState.isRecording) {\n            logSearchQuery(macroModeState, query);\n          }\n        }\n        function onPromptKeyUp(e, query, close) {\n          var keyName = CodeMirror.keyName(e), up, offset;\n          if (keyName == 'Up' || keyName == 'Down') {\n            up = keyName == 'Up' ? true : false;\n            offset = e.target ? e.target.selectionEnd : 0;\n            query = vimGlobalState.searchHistoryController.nextMatch(query, up) || '';\n            close(query);\n            if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);\n          } else {\n            if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift')\n              vimGlobalState.searchHistoryController.reset();\n          }\n          var parsedQuery;\n          try {\n            parsedQuery = updateSearchQuery(cm, query,\n                true /** ignoreCase */, true /** smartCase */);\n          } catch (e) {\n            // Swallow bad regexes for incremental search.\n          }\n          if (parsedQuery) {\n            cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30);\n          } else {\n            clearSearchHighlight(cm);\n            cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n          }\n        }\n        function onPromptKeyDown(e, query, close) {\n          var keyName = CodeMirror.keyName(e);\n          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' ||\n              (keyName == 'Backspace' && query == '')) {\n            vimGlobalState.searchHistoryController.pushInput(query);\n            vimGlobalState.searchHistoryController.reset();\n            updateSearchQuery(cm, originalQuery);\n            clearSearchHighlight(cm);\n            cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n            CodeMirror.e_stop(e);\n            clearInputState(cm);\n            close();\n            cm.focus();\n          } else if (keyName == 'Up' || keyName == 'Down') {\n            CodeMirror.e_stop(e);\n          } else if (keyName == 'Ctrl-U') {\n            // Ctrl-U clears input.\n            CodeMirror.e_stop(e);\n            close('');\n          }\n        }\n        switch (command.searchArgs.querySrc) {\n          case 'prompt':\n            var macroModeState = vimGlobalState.macroModeState;\n            if (macroModeState.isPlaying) {\n              var query = macroModeState.replaySearchQueries.shift();\n              handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n            } else {\n              showPrompt(cm, {\n                  onClose: onPromptClose,\n                  prefix: promptPrefix,\n                  desc: '(JavaScript regexp)',\n                  onKeyUp: onPromptKeyUp,\n                  onKeyDown: onPromptKeyDown\n              });\n            }\n            break;\n          case 'wordUnderCursor':\n            var word = expandWordUnderCursor(cm, false /** inclusive */,\n                true /** forward */, false /** bigWord */,\n                true /** noSymbol */);\n            var isKeyword = true;\n            if (!word) {\n              word = expandWordUnderCursor(cm, false /** inclusive */,\n                  true /** forward */, false /** bigWord */,\n                  false /** noSymbol */);\n              isKeyword = false;\n            }\n            if (!word) {\n              return;\n            }\n            var query = cm.getLine(word.start.line).substring(word.start.ch,\n                word.end.ch);\n            if (isKeyword && wholeWordOnly) {\n                query = '\\\\b' + query + '\\\\b';\n            } else {\n              query = escapeRegex(query);\n            }\n\n            // cachedCursor is used to save the old position of the cursor\n            // when * or # causes vim to seek for the nearest word and shift\n            // the cursor before entering the motion.\n            vimGlobalState.jumpList.cachedCursor = cm.getCursor();\n            cm.setCursor(word.start);\n\n            handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n            break;\n        }\n      },\n      processEx: function(cm, vim, command) {\n        function onPromptClose(input) {\n          // Give the prompt some time to close so that if processCommand shows\n          // an error, the elements don't overlap.\n          vimGlobalState.exCommandHistoryController.pushInput(input);\n          vimGlobalState.exCommandHistoryController.reset();\n          exCommandDispatcher.processCommand(cm, input);\n        }\n        function onPromptKeyDown(e, input, close) {\n          var keyName = CodeMirror.keyName(e), up, offset;\n          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' ||\n              (keyName == 'Backspace' && input == '')) {\n            vimGlobalState.exCommandHistoryController.pushInput(input);\n            vimGlobalState.exCommandHistoryController.reset();\n            CodeMirror.e_stop(e);\n            clearInputState(cm);\n            close();\n            cm.focus();\n          }\n          if (keyName == 'Up' || keyName == 'Down') {\n            CodeMirror.e_stop(e);\n            up = keyName == 'Up' ? true : false;\n            offset = e.target ? e.target.selectionEnd : 0;\n            input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || '';\n            close(input);\n            if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length);\n          } else if (keyName == 'Ctrl-U') {\n            // Ctrl-U clears input.\n            CodeMirror.e_stop(e);\n            close('');\n          } else {\n            if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift')\n              vimGlobalState.exCommandHistoryController.reset();\n          }\n        }\n        if (command.type == 'keyToEx') {\n          // Handle user defined Ex to Ex mappings\n          exCommandDispatcher.processCommand(cm, command.exArgs.input);\n        } else {\n          if (vim.visualMode) {\n            showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\\'<,\\'>',\n                onKeyDown: onPromptKeyDown, selectValueOnOpen: false});\n          } else {\n            showPrompt(cm, { onClose: onPromptClose, prefix: ':',\n                onKeyDown: onPromptKeyDown});\n          }\n        }\n      },\n      evalInput: function(cm, vim) {\n        // If the motion command is set, execute both the operator and motion.\n        // Otherwise return.\n        var inputState = vim.inputState;\n        var motion = inputState.motion;\n        var motionArgs = inputState.motionArgs || {};\n        var operator = inputState.operator;\n        var operatorArgs = inputState.operatorArgs || {};\n        var registerName = inputState.registerName;\n        var sel = vim.sel;\n        // TODO: Make sure cm and vim selections are identical outside visual mode.\n        var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head): cm.getCursor('head'));\n        var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor'));\n        var oldHead = copyCursor(origHead);\n        var oldAnchor = copyCursor(origAnchor);\n        var newHead, newAnchor;\n        var repeat;\n        if (operator) {\n          this.recordLastEdit(vim, inputState);\n        }\n        if (inputState.repeatOverride !== undefined) {\n          // If repeatOverride is specified, that takes precedence over the\n          // input state's repeat. Used by Ex mode and can be user defined.\n          repeat = inputState.repeatOverride;\n        } else {\n          repeat = inputState.getRepeat();\n        }\n        if (repeat > 0 && motionArgs.explicitRepeat) {\n          motionArgs.repeatIsExplicit = true;\n        } else if (motionArgs.noRepeat ||\n            (!motionArgs.explicitRepeat && repeat === 0)) {\n          repeat = 1;\n          motionArgs.repeatIsExplicit = false;\n        }\n        if (inputState.selectedCharacter) {\n          // If there is a character input, stick it in all of the arg arrays.\n          motionArgs.selectedCharacter = operatorArgs.selectedCharacter =\n              inputState.selectedCharacter;\n        }\n        motionArgs.repeat = repeat;\n        clearInputState(cm);\n        if (motion) {\n          var motionResult = motions[motion](cm, origHead, motionArgs, vim, inputState);\n          vim.lastMotion = motions[motion];\n          if (!motionResult) {\n            return;\n          }\n          if (motionArgs.toJumplist) {\n            var jumpList = vimGlobalState.jumpList;\n            // if the current motion is # or *, use cachedCursor\n            var cachedCursor = jumpList.cachedCursor;\n            if (cachedCursor) {\n              recordJumpPosition(cm, cachedCursor, motionResult);\n              delete jumpList.cachedCursor;\n            } else {\n              recordJumpPosition(cm, origHead, motionResult);\n            }\n          }\n          if (motionResult instanceof Array) {\n            newAnchor = motionResult[0];\n            newHead = motionResult[1];\n          } else {\n            newHead = motionResult;\n          }\n          // TODO: Handle null returns from motion commands better.\n          if (!newHead) {\n            newHead = copyCursor(origHead);\n          }\n          if (vim.visualMode) {\n            if (!(vim.visualBlock && newHead.ch === Infinity)) {\n              newHead = clipCursorToContent(cm, newHead);\n            }\n            if (newAnchor) {\n              newAnchor = clipCursorToContent(cm, newAnchor);\n            }\n            newAnchor = newAnchor || oldAnchor;\n            sel.anchor = newAnchor;\n            sel.head = newHead;\n            updateCmSelection(cm);\n            updateMark(cm, vim, '<',\n                cursorIsBefore(newAnchor, newHead) ? newAnchor\n                    : newHead);\n            updateMark(cm, vim, '>',\n                cursorIsBefore(newAnchor, newHead) ? newHead\n                    : newAnchor);\n          } else if (!operator) {\n            newHead = clipCursorToContent(cm, newHead);\n            cm.setCursor(newHead.line, newHead.ch);\n          }\n        }\n        if (operator) {\n          if (operatorArgs.lastSel) {\n            // Replaying a visual mode operation\n            newAnchor = oldAnchor;\n            var lastSel = operatorArgs.lastSel;\n            var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line);\n            var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch);\n            if (lastSel.visualLine) {\n              // Linewise Visual mode: The same number of lines.\n              newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch);\n            } else if (lastSel.visualBlock) {\n              // Blockwise Visual mode: The same number of lines and columns.\n              newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset);\n            } else if (lastSel.head.line == lastSel.anchor.line) {\n              // Normal Visual mode within one line: The same number of characters.\n              newHead = new Pos(oldAnchor.line, oldAnchor.ch + chOffset);\n            } else {\n              // Normal Visual mode with several lines: The same number of lines, in the\n              // last line the same number of characters as in the last line the last time.\n              newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch);\n            }\n            vim.visualMode = true;\n            vim.visualLine = lastSel.visualLine;\n            vim.visualBlock = lastSel.visualBlock;\n            sel = vim.sel = {\n              anchor: newAnchor,\n              head: newHead\n            };\n            updateCmSelection(cm);\n          } else if (vim.visualMode) {\n            operatorArgs.lastSel = {\n              anchor: copyCursor(sel.anchor),\n              head: copyCursor(sel.head),\n              visualBlock: vim.visualBlock,\n              visualLine: vim.visualLine\n            };\n          }\n          var curStart, curEnd, linewise, mode;\n          var cmSel;\n          if (vim.visualMode) {\n            // Init visual op\n            curStart = cursorMin(sel.head, sel.anchor);\n            curEnd = cursorMax(sel.head, sel.anchor);\n            linewise = vim.visualLine || operatorArgs.linewise;\n            mode = vim.visualBlock ? 'block' :\n                   linewise ? 'line' :\n                   'char';\n            cmSel = makeCmSelection(cm, {\n              anchor: curStart,\n              head: curEnd\n            }, mode);\n            if (linewise) {\n              var ranges = cmSel.ranges;\n              if (mode == 'block') {\n                // Linewise operators in visual block mode extend to end of line\n                for (var i = 0; i < ranges.length; i++) {\n                  ranges[i].head.ch = lineLength(cm, ranges[i].head.line);\n                }\n              } else if (mode == 'line') {\n                ranges[0].head = new Pos(ranges[0].head.line + 1, 0);\n              }\n            }\n          } else {\n            // Init motion op\n            curStart = copyCursor(newAnchor || oldAnchor);\n            curEnd = copyCursor(newHead || oldHead);\n            if (cursorIsBefore(curEnd, curStart)) {\n              var tmp = curStart;\n              curStart = curEnd;\n              curEnd = tmp;\n            }\n            linewise = motionArgs.linewise || operatorArgs.linewise;\n            if (linewise) {\n              // Expand selection to entire line.\n              expandSelectionToLine(cm, curStart, curEnd);\n            } else if (motionArgs.forward) {\n              // Clip to trailing newlines only if the motion goes forward.\n              clipToLine(cm, curStart, curEnd);\n            }\n            mode = 'char';\n            var exclusive = !motionArgs.inclusive || linewise;\n            cmSel = makeCmSelection(cm, {\n              anchor: curStart,\n              head: curEnd\n            }, mode, exclusive);\n          }\n          cm.setSelections(cmSel.ranges, cmSel.primary);\n          vim.lastMotion = null;\n          operatorArgs.repeat = repeat; // For indent in visual mode.\n          operatorArgs.registerName = registerName;\n          // Keep track of linewise as it affects how paste and change behave.\n          operatorArgs.linewise = linewise;\n          var operatorMoveTo = operators[operator](\n            cm, operatorArgs, cmSel.ranges, oldAnchor, newHead);\n          if (vim.visualMode) {\n            exitVisualMode(cm, operatorMoveTo != null);\n          }\n          if (operatorMoveTo) {\n            cm.setCursor(operatorMoveTo);\n          }\n        }\n      },\n      recordLastEdit: function(vim, inputState, actionCommand) {\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.isPlaying) { return; }\n        vim.lastEditInputState = inputState;\n        vim.lastEditActionCommand = actionCommand;\n        macroModeState.lastInsertModeChanges.changes = [];\n        macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false;\n        macroModeState.lastInsertModeChanges.visualBlock = vim.visualBlock ? vim.sel.head.line - vim.sel.anchor.line : 0;\n      }\n    };\n\n    /**\n     * typedef {Object{line:number,ch:number}} Cursor An object containing the\n     *     position of the cursor.\n     */\n    // All of the functions below return Cursor objects.\n    var motions = {\n      moveToTopLine: function(cm, _head, motionArgs) {\n        var line = getUserVisibleLines(cm).top + motionArgs.repeat -1;\n        return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      moveToMiddleLine: function(cm) {\n        var range = getUserVisibleLines(cm);\n        var line = Math.floor((range.top + range.bottom) * 0.5);\n        return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      moveToBottomLine: function(cm, _head, motionArgs) {\n        var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1;\n        return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      expandToLine: function(_cm, head, motionArgs) {\n        // Expands forward to end of line, and then to next line if repeat is\n        // >1. Does not handle backward motion!\n        var cur = head;\n        return new Pos(cur.line + motionArgs.repeat - 1, Infinity);\n      },\n      findNext: function(cm, _head, motionArgs) {\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n        if (!query) {\n          return;\n        }\n        var prev = !motionArgs.forward;\n        // If search is initiated with ? instead of /, negate direction.\n        prev = (state.isReversed()) ? !prev : prev;\n        highlightSearchMatches(cm, query);\n        return findNext(cm, prev/** prev */, query, motionArgs.repeat);\n      },\n      /**\n       * Find and select the next occurrence of the search query. If the cursor is currently\n       * within a match, then find and select the current match. Otherwise, find the next occurrence in the\n       * appropriate direction.\n       *\n       * This differs from `findNext` in the following ways:\n       *\n       * 1. Instead of only returning the \"from\", this returns a \"from\", \"to\" range.\n       * 2. If the cursor is currently inside a search match, this selects the current match\n       *    instead of the next match.\n       * 3. If there is no associated operator, this will turn on visual mode.\n       */\n      findAndSelectNextInclusive: function(cm, _head, motionArgs, vim, prevInputState) {\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n\n        if (!query) {\n          return;\n        }\n\n        var prev = !motionArgs.forward;\n        prev = (state.isReversed()) ? !prev : prev;\n\n        // next: [from, to] | null\n        var next = findNextFromAndToInclusive(cm, prev, query, motionArgs.repeat, vim);\n\n        // No matches.\n        if (!next) {\n          return;\n        }\n\n        // If there's an operator that will be executed, return the selection.\n        if (prevInputState.operator) {\n          return next;\n        }\n\n        // At this point, we know that there is no accompanying operator -- let's\n        // deal with visual mode in order to select an appropriate match.\n\n        var from = next[0];\n        // For whatever reason, when we use the \"to\" as returned by searchcursor.js directly,\n        // the resulting selection is extended by 1 char. Let's shrink it so that only the\n        // match is selected.\n        var to = new Pos(next[1].line, next[1].ch - 1);\n\n        if (vim.visualMode) {\n          // If we were in visualLine or visualBlock mode, get out of it.\n          if (vim.visualLine || vim.visualBlock) {\n            vim.visualLine = false;\n            vim.visualBlock = false;\n            CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: \"\"});\n          }\n\n          // If we're currently in visual mode, we should extend the selection to include\n          // the search result.\n          var anchor = vim.sel.anchor;\n          if (anchor) {\n            if (state.isReversed()) {\n              if (motionArgs.forward) {\n                return [anchor, from];\n              }\n\n              return [anchor, to];\n            } else {\n              if (motionArgs.forward) {\n                return [anchor, to];\n              }\n\n              return [anchor, from];\n            }\n          }\n        } else {\n          // Let's turn visual mode on.\n          vim.visualMode = true;\n          vim.visualLine = false;\n          vim.visualBlock = false;\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: \"\"});\n        }\n\n        return prev ? [to, from] : [from, to];\n      },\n      goToMark: function(cm, _head, motionArgs, vim) {\n        var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter);\n        if (pos) {\n          return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos;\n        }\n        return null;\n      },\n      moveToOtherHighlightedEnd: function(cm, _head, motionArgs, vim) {\n        if (vim.visualBlock && motionArgs.sameLine) {\n          var sel = vim.sel;\n          return [\n            clipCursorToContent(cm, new Pos(sel.anchor.line, sel.head.ch)),\n            clipCursorToContent(cm, new Pos(sel.head.line, sel.anchor.ch))\n          ];\n        } else {\n          return ([vim.sel.head, vim.sel.anchor]);\n        }\n      },\n      jumpToMark: function(cm, head, motionArgs, vim) {\n        var best = head;\n        for (var i = 0; i < motionArgs.repeat; i++) {\n          var cursor = best;\n          for (var key in vim.marks) {\n            if (!isLowerCase(key)) {\n              continue;\n            }\n            var mark = vim.marks[key].find();\n            var isWrongDirection = (motionArgs.forward) ?\n              cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark);\n\n            if (isWrongDirection) {\n              continue;\n            }\n            if (motionArgs.linewise && (mark.line == cursor.line)) {\n              continue;\n            }\n\n            var equal = cursorEqual(cursor, best);\n            var between = (motionArgs.forward) ?\n              cursorIsBetween(cursor, mark, best) :\n              cursorIsBetween(best, mark, cursor);\n\n            if (equal || between) {\n              best = mark;\n            }\n          }\n        }\n\n        if (motionArgs.linewise) {\n          // Vim places the cursor on the first non-whitespace character of\n          // the line if there is one, else it places the cursor at the end\n          // of the line, regardless of whether a mark was found.\n          best = new Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line)));\n        }\n        return best;\n      },\n      moveByCharacters: function(_cm, head, motionArgs) {\n        var cur = head;\n        var repeat = motionArgs.repeat;\n        var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat;\n        return new Pos(cur.line, ch);\n      },\n      moveByLines: function(cm, head, motionArgs, vim) {\n        var cur = head;\n        var endCh = cur.ch;\n        // Depending what our last motion was, we may want to do different\n        // things. If our last motion was moving vertically, we want to\n        // preserve the HPos from our last horizontal move.  If our last motion\n        // was going to the end of a line, moving vertically we should go to\n        // the end of the line, etc.\n        switch (vim.lastMotion) {\n          case this.moveByLines:\n          case this.moveByDisplayLines:\n          case this.moveByScroll:\n          case this.moveToColumn:\n          case this.moveToEol:\n            endCh = vim.lastHPos;\n            break;\n          default:\n            vim.lastHPos = endCh;\n        }\n        var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0);\n        var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;\n        var first = cm.firstLine();\n        var last = cm.lastLine();\n        var posV = cm.findPosV(cur, (motionArgs.forward ? repeat : -repeat), 'line', vim.lastHSPos);\n        var hasMarkedText = motionArgs.forward ? posV.line > line : posV.line < line;\n        if (hasMarkedText) {\n          line = posV.line;\n          endCh = posV.ch;\n        }\n        // Vim go to line begin or line end when cursor at first/last line and\n        // move to previous/next line is triggered.\n        if (line < first && cur.line == first){\n          return this.moveToStartOfLine(cm, head, motionArgs, vim);\n        } else if (line > last && cur.line == last){\n            return moveToEol(cm, head, motionArgs, vim, true);\n        }\n        if (motionArgs.toFirstChar){\n          endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));\n          vim.lastHPos = endCh;\n        }\n        vim.lastHSPos = cm.charCoords(new Pos(line, endCh),'div').left;\n        return new Pos(line, endCh);\n      },\n      moveByDisplayLines: function(cm, head, motionArgs, vim) {\n        var cur = head;\n        switch (vim.lastMotion) {\n          case this.moveByDisplayLines:\n          case this.moveByScroll:\n          case this.moveByLines:\n          case this.moveToColumn:\n          case this.moveToEol:\n            break;\n          default:\n            vim.lastHSPos = cm.charCoords(cur,'div').left;\n        }\n        var repeat = motionArgs.repeat;\n        var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos);\n        if (res.hitSide) {\n          if (motionArgs.forward) {\n            var lastCharCoords = cm.charCoords(res, 'div');\n            var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos };\n            var res = cm.coordsChar(goalCoords, 'div');\n          } else {\n            var resCoords = cm.charCoords(new Pos(cm.firstLine(), 0), 'div');\n            resCoords.left = vim.lastHSPos;\n            res = cm.coordsChar(resCoords, 'div');\n          }\n        }\n        vim.lastHPos = res.ch;\n        return res;\n      },\n      moveByPage: function(cm, head, motionArgs) {\n        // CodeMirror only exposes functions that move the cursor page down, so\n        // doing this bad hack to move the cursor and move it back. evalInput\n        // will move the cursor to where it should be in the end.\n        var curStart = head;\n        var repeat = motionArgs.repeat;\n        return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page');\n      },\n      moveByParagraph: function(cm, head, motionArgs) {\n        var dir = motionArgs.forward ? 1 : -1;\n        return findParagraph(cm, head, motionArgs.repeat, dir);\n      },\n      moveBySentence: function(cm, head, motionArgs) {\n        var dir = motionArgs.forward ? 1 : -1;\n        return findSentence(cm, head, motionArgs.repeat, dir);\n      },\n      moveByScroll: function(cm, head, motionArgs, vim) {\n        var scrollbox = cm.getScrollInfo();\n        var curEnd = null;\n        var repeat = motionArgs.repeat;\n        if (!repeat) {\n          repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight());\n        }\n        var orig = cm.charCoords(head, 'local');\n        motionArgs.repeat = repeat;\n        var curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim);\n        if (!curEnd) {\n          return null;\n        }\n        var dest = cm.charCoords(curEnd, 'local');\n        cm.scrollTo(null, scrollbox.top + dest.top - orig.top);\n        return curEnd;\n      },\n      moveByWords: function(cm, head, motionArgs) {\n        return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward,\n            !!motionArgs.wordEnd, !!motionArgs.bigWord);\n      },\n      moveTillCharacter: function(cm, _head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        var curEnd = moveToCharacter(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter);\n        var increment = motionArgs.forward ? -1 : 1;\n        recordLastCharacterSearch(increment, motionArgs);\n        if (!curEnd) return null;\n        curEnd.ch += increment;\n        return curEnd;\n      },\n      moveToCharacter: function(cm, head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        recordLastCharacterSearch(0, motionArgs);\n        return moveToCharacter(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter) || head;\n      },\n      moveToSymbol: function(cm, head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        return findSymbol(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter) || head;\n      },\n      moveToColumn: function(cm, head, motionArgs, vim) {\n        var repeat = motionArgs.repeat;\n        // repeat is equivalent to which column we want to move to!\n        vim.lastHPos = repeat - 1;\n        vim.lastHSPos = cm.charCoords(head,'div').left;\n        return moveToColumn(cm, repeat);\n      },\n      moveToEol: function(cm, head, motionArgs, vim) {\n        return moveToEol(cm, head, motionArgs, vim, false);\n      },\n      moveToFirstNonWhiteSpaceCharacter: function(cm, head) {\n        // Go to the start of the line where the text begins, or the end for\n        // whitespace-only lines\n        var cursor = head;\n        return new Pos(cursor.line,\n                   findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line)));\n      },\n      moveToMatchedSymbol: function(cm, head) {\n        var cursor = head;\n        var line = cursor.line;\n        var ch = cursor.ch;\n        var lineText = cm.getLine(line);\n        var symbol;\n        for (; ch < lineText.length; ch++) {\n          symbol = lineText.charAt(ch);\n          if (symbol && isMatchableSymbol(symbol)) {\n            var style = cm.getTokenTypeAt(new Pos(line, ch + 1));\n            if (style !== \"string\" && style !== \"comment\") {\n              break;\n            }\n          }\n        }\n        if (ch < lineText.length) {\n          // Only include angle brackets in analysis if they are being matched.\n          var re = (ch === '<' || ch === '>') ? /[(){}[\\]<>]/ : /[(){}[\\]]/;\n          var matched = cm.findMatchingBracket(new Pos(line, ch), {bracketRegex: re});\n          return matched.to;\n        } else {\n          return cursor;\n        }\n      },\n      moveToStartOfLine: function(_cm, head) {\n        return new Pos(head.line, 0);\n      },\n      moveToLineOrEdgeOfDocument: function(cm, _head, motionArgs) {\n        var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine();\n        if (motionArgs.repeatIsExplicit) {\n          lineNum = motionArgs.repeat - cm.getOption('firstLineNumber');\n        }\n        return new Pos(lineNum,\n                   findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum)));\n      },\n      moveToStartOfDisplayLine: function(cm) {\n        cm.execCommand(\"goLineLeft\");\n        return cm.getCursor();\n      },\n      moveToEndOfDisplayLine: function(cm) {\n        cm.execCommand(\"goLineRight\");\n        var head = cm.getCursor();\n        if (head.sticky == \"before\") head.ch--;\n        return head;\n      },\n      textObjectManipulation: function(cm, head, motionArgs, vim) {\n        // TODO: lots of possible exceptions that can be thrown here. Try da(\n        //     outside of a () block.\n        var mirroredPairs = {'(': ')', ')': '(',\n                             '{': '}', '}': '{',\n                             '[': ']', ']': '[',\n                             '<': '>', '>': '<'};\n        var selfPaired = {'\\'': true, '\"': true, '`': true};\n\n        var character = motionArgs.selectedCharacter;\n        // 'b' refers to  '()' block.\n        // 'B' refers to  '{}' block.\n        if (character == 'b') {\n          character = '(';\n        } else if (character == 'B') {\n          character = '{';\n        }\n\n        // Inclusive is the difference between a and i\n        // TODO: Instead of using the additional text object map to perform text\n        //     object operations, merge the map into the defaultKeyMap and use\n        //     motionArgs to define behavior. Define separate entries for 'aw',\n        //     'iw', 'a[', 'i[', etc.\n        var inclusive = !motionArgs.textObjectInner;\n\n        var tmp;\n        if (mirroredPairs[character]) {\n          tmp = selectCompanionObject(cm, head, character, inclusive);\n        } else if (selfPaired[character]) {\n          tmp = findBeginningAndEnd(cm, head, character, inclusive);\n        } else if (character === 'W') {\n          tmp = expandWordUnderCursor(cm, inclusive, true /** forward */,\n                                                     true /** bigWord */);\n        } else if (character === 'w') {\n          tmp = expandWordUnderCursor(cm, inclusive, true /** forward */,\n                                                     false /** bigWord */);\n        } else if (character === 'p') {\n          tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive);\n          motionArgs.linewise = true;\n          if (vim.visualMode) {\n            if (!vim.visualLine) { vim.visualLine = true; }\n          } else {\n            var operatorArgs = vim.inputState.operatorArgs;\n            if (operatorArgs) { operatorArgs.linewise = true; }\n            tmp.end.line--;\n          }\n        } else if (character === 't') {\n          tmp = expandTagUnderCursor(cm, head, inclusive);\n        } else {\n          // No text object defined for this, don't move.\n          return null;\n        }\n\n        if (!cm.state.vim.visualMode) {\n          return [tmp.start, tmp.end];\n        } else {\n          return expandSelection(cm, tmp.start, tmp.end);\n        }\n      },\n\n      repeatLastCharacterSearch: function(cm, head, motionArgs) {\n        var lastSearch = vimGlobalState.lastCharacterSearch;\n        var repeat = motionArgs.repeat;\n        var forward = motionArgs.forward === lastSearch.forward;\n        var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);\n        cm.moveH(-increment, 'char');\n        motionArgs.inclusive = forward ? true : false;\n        var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter);\n        if (!curEnd) {\n          cm.moveH(increment, 'char');\n          return head;\n        }\n        curEnd.ch += increment;\n        return curEnd;\n      }\n    };\n\n    function defineMotion(name, fn) {\n      motions[name] = fn;\n    }\n\n    function fillArray(val, times) {\n      var arr = [];\n      for (var i = 0; i < times; i++) {\n        arr.push(val);\n      }\n      return arr;\n    }\n    /**\n     * An operator acts on a text selection. It receives the list of selections\n     * as input. The corresponding CodeMirror selection is guaranteed to\n    * match the input selection.\n     */\n    var operators = {\n      change: function(cm, args, ranges) {\n        var finalHead, text;\n        var vim = cm.state.vim;\n        var anchor = ranges[0].anchor,\n            head = ranges[0].head;\n        if (!vim.visualMode) {\n          text = cm.getRange(anchor, head);\n          var lastState = vim.lastEditInputState || {};\n          if (lastState.motion == \"moveByWords\" && !isWhiteSpaceString(text)) {\n            // Exclude trailing whitespace if the range is not all whitespace.\n            var match = (/\\s+$/).exec(text);\n            if (match && lastState.motionArgs && lastState.motionArgs.forward) {\n              head = offsetCursor(head, 0, - match[0].length);\n              text = text.slice(0, - match[0].length);\n            }\n          }\n          var prevLineEnd = new Pos(anchor.line - 1, Number.MAX_VALUE);\n          var wasLastLine = cm.firstLine() == cm.lastLine();\n          if (head.line > cm.lastLine() && args.linewise && !wasLastLine) {\n            cm.replaceRange('', prevLineEnd, head);\n          } else {\n            cm.replaceRange('', anchor, head);\n          }\n          if (args.linewise) {\n            // Push the next line back down, if there is a next line.\n            if (!wasLastLine) {\n              cm.setCursor(prevLineEnd);\n              CodeMirror.commands.newlineAndIndent(cm);\n            }\n            // make sure cursor ends up at the end of the line.\n            anchor.ch = Number.MAX_VALUE;\n          }\n          finalHead = anchor;\n        } else if (args.fullLine) {\n            head.ch = Number.MAX_VALUE;\n            head.line--;\n            cm.setSelection(anchor, head)\n            text = cm.getSelection();\n            cm.replaceSelection(\"\");\n            finalHead = anchor;\n        } else {\n          text = cm.getSelection();\n          var replacement = fillArray('', ranges.length);\n          cm.replaceSelections(replacement);\n          finalHead = cursorMin(ranges[0].head, ranges[0].anchor);\n        }\n        vimGlobalState.registerController.pushText(\n            args.registerName, 'change', text,\n            args.linewise, ranges.length > 1);\n        actions.enterInsertMode(cm, {head: finalHead}, cm.state.vim);\n      },\n      // delete is a javascript keyword.\n      'delete': function(cm, args, ranges) {\n        var finalHead, text;\n        var vim = cm.state.vim;\n        if (!vim.visualBlock) {\n          var anchor = ranges[0].anchor,\n              head = ranges[0].head;\n          if (args.linewise &&\n              head.line != cm.firstLine() &&\n              anchor.line == cm.lastLine() &&\n              anchor.line == head.line - 1) {\n            // Special case for dd on last line (and first line).\n            if (anchor.line == cm.firstLine()) {\n              anchor.ch = 0;\n            } else {\n              anchor = new Pos(anchor.line - 1, lineLength(cm, anchor.line - 1));\n            }\n          }\n          text = cm.getRange(anchor, head);\n          cm.replaceRange('', anchor, head);\n          finalHead = anchor;\n          if (args.linewise) {\n            finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor);\n          }\n        } else {\n          text = cm.getSelection();\n          var replacement = fillArray('', ranges.length);\n          cm.replaceSelections(replacement);\n          finalHead = cursorMin(ranges[0].head, ranges[0].anchor);\n        }\n        vimGlobalState.registerController.pushText(\n            args.registerName, 'delete', text,\n            args.linewise, vim.visualBlock);\n        return clipCursorToContent(cm, finalHead);\n      },\n      indent: function(cm, args, ranges) {\n        var vim = cm.state.vim;\n        var startLine = ranges[0].anchor.line;\n        var endLine = vim.visualBlock ?\n          ranges[ranges.length - 1].anchor.line :\n          ranges[0].head.line;\n        // In visual mode, n> shifts the selection right n times, instead of\n        // shifting n lines right once.\n        var repeat = (vim.visualMode) ? args.repeat : 1;\n        if (args.linewise) {\n          // The only way to delete a newline is to delete until the start of\n          // the next line, so in linewise mode evalInput will include the next\n          // line. We don't want this in indent, so we go back a line.\n          endLine--;\n        }\n        for (var i = startLine; i <= endLine; i++) {\n          for (var j = 0; j < repeat; j++) {\n            cm.indentLine(i, args.indentRight);\n          }\n        }\n        return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor);\n      },\n      indentAuto: function(cm, _args, ranges) {\n        cm.execCommand(\"indentAuto\");\n        return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor);\n      },\n      changeCase: function(cm, args, ranges, oldAnchor, newHead) {\n        var selections = cm.getSelections();\n        var swapped = [];\n        var toLower = args.toLower;\n        for (var j = 0; j < selections.length; j++) {\n          var toSwap = selections[j];\n          var text = '';\n          if (toLower === true) {\n            text = toSwap.toLowerCase();\n          } else if (toLower === false) {\n            text = toSwap.toUpperCase();\n          } else {\n            for (var i = 0; i < toSwap.length; i++) {\n              var character = toSwap.charAt(i);\n              text += isUpperCase(character) ? character.toLowerCase() :\n                  character.toUpperCase();\n            }\n          }\n          swapped.push(text);\n        }\n        cm.replaceSelections(swapped);\n        if (args.shouldMoveCursor){\n          return newHead;\n        } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) {\n          return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor);\n        } else if (args.linewise){\n          return oldAnchor;\n        } else {\n          return cursorMin(ranges[0].anchor, ranges[0].head);\n        }\n      },\n      yank: function(cm, args, ranges, oldAnchor) {\n        var vim = cm.state.vim;\n        var text = cm.getSelection();\n        var endPos = vim.visualMode\n          ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor)\n          : oldAnchor;\n        vimGlobalState.registerController.pushText(\n            args.registerName, 'yank',\n            text, args.linewise, vim.visualBlock);\n        return endPos;\n      }\n    };\n\n    function defineOperator(name, fn) {\n      operators[name] = fn;\n    }\n\n    var actions = {\n      jumpListWalk: function(cm, actionArgs, vim) {\n        if (vim.visualMode) {\n          return;\n        }\n        var repeat = actionArgs.repeat;\n        var forward = actionArgs.forward;\n        var jumpList = vimGlobalState.jumpList;\n\n        var mark = jumpList.move(cm, forward ? repeat : -repeat);\n        var markPos = mark ? mark.find() : undefined;\n        markPos = markPos ? markPos : cm.getCursor();\n        cm.setCursor(markPos);\n      },\n      scroll: function(cm, actionArgs, vim) {\n        if (vim.visualMode) {\n          return;\n        }\n        var repeat = actionArgs.repeat || 1;\n        var lineHeight = cm.defaultTextHeight();\n        var top = cm.getScrollInfo().top;\n        var delta = lineHeight * repeat;\n        var newPos = actionArgs.forward ? top + delta : top - delta;\n        var cursor = copyCursor(cm.getCursor());\n        var cursorCoords = cm.charCoords(cursor, 'local');\n        if (actionArgs.forward) {\n          if (newPos > cursorCoords.top) {\n             cursor.line += (newPos - cursorCoords.top) / lineHeight;\n             cursor.line = Math.ceil(cursor.line);\n             cm.setCursor(cursor);\n             cursorCoords = cm.charCoords(cursor, 'local');\n             cm.scrollTo(null, cursorCoords.top);\n          } else {\n             // Cursor stays within bounds.  Just reposition the scroll window.\n             cm.scrollTo(null, newPos);\n          }\n        } else {\n          var newBottom = newPos + cm.getScrollInfo().clientHeight;\n          if (newBottom < cursorCoords.bottom) {\n             cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight;\n             cursor.line = Math.floor(cursor.line);\n             cm.setCursor(cursor);\n             cursorCoords = cm.charCoords(cursor, 'local');\n             cm.scrollTo(\n                 null, cursorCoords.bottom - cm.getScrollInfo().clientHeight);\n          } else {\n             // Cursor stays within bounds.  Just reposition the scroll window.\n             cm.scrollTo(null, newPos);\n          }\n        }\n      },\n      scrollToCursor: function(cm, actionArgs) {\n        var lineNum = cm.getCursor().line;\n        var charCoords = cm.charCoords(new Pos(lineNum, 0), 'local');\n        var height = cm.getScrollInfo().clientHeight;\n        var y = charCoords.top;\n        var lineHeight = charCoords.bottom - y;\n        switch (actionArgs.position) {\n          case 'center': y = y - (height / 2) + lineHeight;\n            break;\n          case 'bottom': y = y - height + lineHeight;\n            break;\n        }\n        cm.scrollTo(null, y);\n      },\n      replayMacro: function(cm, actionArgs, vim) {\n        var registerName = actionArgs.selectedCharacter;\n        var repeat = actionArgs.repeat;\n        var macroModeState = vimGlobalState.macroModeState;\n        if (registerName == '@') {\n          registerName = macroModeState.latestRegister;\n        } else {\n          macroModeState.latestRegister = registerName;\n        }\n        while(repeat--){\n          executeMacroRegister(cm, vim, macroModeState, registerName);\n        }\n      },\n      enterMacroRecordMode: function(cm, actionArgs) {\n        var macroModeState = vimGlobalState.macroModeState;\n        var registerName = actionArgs.selectedCharacter;\n        if (vimGlobalState.registerController.isValidRegister(registerName)) {\n          macroModeState.enterMacroRecordMode(cm, registerName);\n        }\n      },\n      toggleOverwrite: function(cm) {\n        if (!cm.state.overwrite) {\n          cm.toggleOverwrite(true);\n          cm.setOption('keyMap', 'vim-replace');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"replace\"});\n        } else {\n          cm.toggleOverwrite(false);\n          cm.setOption('keyMap', 'vim-insert');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"insert\"});\n        }\n      },\n      enterInsertMode: function(cm, actionArgs, vim) {\n        if (cm.getOption('readOnly')) { return; }\n        vim.insertMode = true;\n        vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1;\n        var insertAt = (actionArgs) ? actionArgs.insertAt : null;\n        var sel = vim.sel;\n        var head = actionArgs.head || cm.getCursor('head');\n        var height = cm.listSelections().length;\n        if (insertAt == 'eol') {\n          head = new Pos(head.line, lineLength(cm, head.line));\n        } else if (insertAt == 'bol') {\n          head = new Pos(head.line, 0);\n        } else if (insertAt == 'charAfter') {\n          head = offsetCursor(head, 0, 1);\n        } else if (insertAt == 'firstNonBlank') {\n          head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head);\n        } else if (insertAt == 'startOfSelectedArea') {\n          if (!vim.visualMode)\n              return;\n          if (!vim.visualBlock) {\n            if (sel.head.line < sel.anchor.line) {\n              head = sel.head;\n            } else {\n              head = new Pos(sel.anchor.line, 0);\n            }\n          } else {\n            head = new Pos(\n                Math.min(sel.head.line, sel.anchor.line),\n                Math.min(sel.head.ch, sel.anchor.ch));\n            height = Math.abs(sel.head.line - sel.anchor.line) + 1;\n          }\n        } else if (insertAt == 'endOfSelectedArea') {\n            if (!vim.visualMode)\n              return;\n          if (!vim.visualBlock) {\n            if (sel.head.line >= sel.anchor.line) {\n              head = offsetCursor(sel.head, 0, 1);\n            } else {\n              head = new Pos(sel.anchor.line, 0);\n            }\n          } else {\n            head = new Pos(\n                Math.min(sel.head.line, sel.anchor.line),\n                Math.max(sel.head.ch, sel.anchor.ch) + 1);\n            height = Math.abs(sel.head.line - sel.anchor.line) + 1;\n          }\n        } else if (insertAt == 'inplace') {\n          if (vim.visualMode){\n            return;\n          }\n        } else if (insertAt == 'lastEdit') {\n          head = getLastEditPos(cm) || head;\n        }\n        cm.setOption('disableInput', false);\n        if (actionArgs && actionArgs.replace) {\n          // Handle Replace-mode as a special case of insert mode.\n          cm.toggleOverwrite(true);\n          cm.setOption('keyMap', 'vim-replace');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"replace\"});\n        } else {\n          cm.toggleOverwrite(false);\n          cm.setOption('keyMap', 'vim-insert');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"insert\"});\n        }\n        if (!vimGlobalState.macroModeState.isPlaying) {\n          // Only record if not replaying.\n          cm.on('change', onChange);\n          CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n        }\n        if (vim.visualMode) {\n          exitVisualMode(cm);\n        }\n        selectForInsert(cm, head, height);\n      },\n      toggleVisualMode: function(cm, actionArgs, vim) {\n        var repeat = actionArgs.repeat;\n        var anchor = cm.getCursor();\n        var head;\n        // TODO: The repeat should actually select number of characters/lines\n        //     equal to the repeat times the size of the previous visual\n        //     operation.\n        if (!vim.visualMode) {\n          // Entering visual mode\n          vim.visualMode = true;\n          vim.visualLine = !!actionArgs.linewise;\n          vim.visualBlock = !!actionArgs.blockwise;\n          head = clipCursorToContent(\n              cm, new Pos(anchor.line, anchor.ch + repeat - 1));\n          vim.sel = {\n            anchor: anchor,\n            head: head\n          };\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : vim.visualBlock ? \"blockwise\" : \"\"});\n          updateCmSelection(cm);\n          updateMark(cm, vim, '<', cursorMin(anchor, head));\n          updateMark(cm, vim, '>', cursorMax(anchor, head));\n        } else if (vim.visualLine ^ actionArgs.linewise ||\n            vim.visualBlock ^ actionArgs.blockwise) {\n          // Toggling between modes\n          vim.visualLine = !!actionArgs.linewise;\n          vim.visualBlock = !!actionArgs.blockwise;\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : vim.visualBlock ? \"blockwise\" : \"\"});\n          updateCmSelection(cm);\n        } else {\n          exitVisualMode(cm);\n        }\n      },\n      reselectLastSelection: function(cm, _actionArgs, vim) {\n        var lastSelection = vim.lastSelection;\n        if (vim.visualMode) {\n          updateLastSelection(cm, vim);\n        }\n        if (lastSelection) {\n          var anchor = lastSelection.anchorMark.find();\n          var head = lastSelection.headMark.find();\n          if (!anchor || !head) {\n            // If the marks have been destroyed due to edits, do nothing.\n            return;\n          }\n          vim.sel = {\n            anchor: anchor,\n            head: head\n          };\n          vim.visualMode = true;\n          vim.visualLine = lastSelection.visualLine;\n          vim.visualBlock = lastSelection.visualBlock;\n          updateCmSelection(cm);\n          updateMark(cm, vim, '<', cursorMin(anchor, head));\n          updateMark(cm, vim, '>', cursorMax(anchor, head));\n          CodeMirror.signal(cm, 'vim-mode-change', {\n            mode: 'visual',\n            subMode: vim.visualLine ? 'linewise' :\n                     vim.visualBlock ? 'blockwise' : ''});\n        }\n      },\n      joinLines: function(cm, actionArgs, vim) {\n        var curStart, curEnd;\n        if (vim.visualMode) {\n          curStart = cm.getCursor('anchor');\n          curEnd = cm.getCursor('head');\n          if (cursorIsBefore(curEnd, curStart)) {\n            var tmp = curEnd;\n            curEnd = curStart;\n            curStart = tmp;\n          }\n          curEnd.ch = lineLength(cm, curEnd.line) - 1;\n        } else {\n          // Repeat is the number of lines to join. Minimum 2 lines.\n          var repeat = Math.max(actionArgs.repeat, 2);\n          curStart = cm.getCursor();\n          curEnd = clipCursorToContent(cm, new Pos(curStart.line + repeat - 1,\n                                               Infinity));\n        }\n        var finalCh = 0;\n        for (var i = curStart.line; i < curEnd.line; i++) {\n          finalCh = lineLength(cm, curStart.line);\n          var tmp = new Pos(curStart.line + 1,\n                        lineLength(cm, curStart.line + 1));\n          var text = cm.getRange(curStart, tmp);\n          text = actionArgs.keepSpaces\n            ? text.replace(/\\n\\r?/g, '')\n            : text.replace(/\\n\\s*/g, ' ');\n          cm.replaceRange(text, curStart, tmp);\n        }\n        var curFinalPos = new Pos(curStart.line, finalCh);\n        if (vim.visualMode) {\n          exitVisualMode(cm, false);\n        }\n        cm.setCursor(curFinalPos);\n      },\n      newLineAndEnterInsertMode: function(cm, actionArgs, vim) {\n        vim.insertMode = true;\n        var insertAt = copyCursor(cm.getCursor());\n        if (insertAt.line === cm.firstLine() && !actionArgs.after) {\n          // Special case for inserting newline before start of document.\n          cm.replaceRange('\\n', new Pos(cm.firstLine(), 0));\n          cm.setCursor(cm.firstLine(), 0);\n        } else {\n          insertAt.line = (actionArgs.after) ? insertAt.line :\n              insertAt.line - 1;\n          insertAt.ch = lineLength(cm, insertAt.line);\n          cm.setCursor(insertAt);\n          var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment ||\n              CodeMirror.commands.newlineAndIndent;\n          newlineFn(cm);\n        }\n        this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim);\n      },\n      paste: function(cm, actionArgs, vim) {\n        var cur = copyCursor(cm.getCursor());\n        var register = vimGlobalState.registerController.getRegister(\n            actionArgs.registerName);\n        var text = register.toString();\n        if (!text) {\n          return;\n        }\n        if (actionArgs.matchIndent) {\n          var tabSize = cm.getOption(\"tabSize\");\n          // length that considers tabs and tabSize\n          var whitespaceLength = function(str) {\n            var tabs = (str.split(\"\\t\").length - 1);\n            var spaces = (str.split(\" \").length - 1);\n            return tabs * tabSize + spaces * 1;\n          };\n          var currentLine = cm.getLine(cm.getCursor().line);\n          var indent = whitespaceLength(currentLine.match(/^\\s*/)[0]);\n          // chomp last newline b/c don't want it to match /^\\s*/gm\n          var chompedText = text.replace(/\\n$/, '');\n          var wasChomped = text !== chompedText;\n          var firstIndent = whitespaceLength(text.match(/^\\s*/)[0]);\n          var text = chompedText.replace(/^\\s*/gm, function(wspace) {\n            var newIndent = indent + (whitespaceLength(wspace) - firstIndent);\n            if (newIndent < 0) {\n              return \"\";\n            }\n            else if (cm.getOption(\"indentWithTabs\")) {\n              var quotient = Math.floor(newIndent / tabSize);\n              return Array(quotient + 1).join('\\t');\n            }\n            else {\n              return Array(newIndent + 1).join(' ');\n            }\n          });\n          text += wasChomped ? \"\\n\" : \"\";\n        }\n        if (actionArgs.repeat > 1) {\n          var text = Array(actionArgs.repeat + 1).join(text);\n        }\n        var linewise = register.linewise;\n        var blockwise = register.blockwise;\n        if (blockwise) {\n          text = text.split('\\n');\n          if (linewise) {\n              text.pop();\n          }\n          for (var i = 0; i < text.length; i++) {\n            text[i] = (text[i] == '') ? ' ' : text[i];\n          }\n          cur.ch += actionArgs.after ? 1 : 0;\n          cur.ch = Math.min(lineLength(cm, cur.line), cur.ch);\n        } else if (linewise) {\n          if(vim.visualMode) {\n            text = vim.visualLine ? text.slice(0, -1) : '\\n' + text.slice(0, text.length - 1) + '\\n';\n          } else if (actionArgs.after) {\n            // Move the newline at the end to the start instead, and paste just\n            // before the newline character of the line we are on right now.\n            text = '\\n' + text.slice(0, text.length - 1);\n            cur.ch = lineLength(cm, cur.line);\n          } else {\n            cur.ch = 0;\n          }\n        } else {\n          cur.ch += actionArgs.after ? 1 : 0;\n        }\n        var curPosFinal;\n        var idx;\n        if (vim.visualMode) {\n          //  save the pasted text for reselection if the need arises\n          vim.lastPastedText = text;\n          var lastSelectionCurEnd;\n          var selectedArea = getSelectedAreaRange(cm, vim);\n          var selectionStart = selectedArea[0];\n          var selectionEnd = selectedArea[1];\n          var selectedText = cm.getSelection();\n          var selections = cm.listSelections();\n          var emptyStrings = new Array(selections.length).join('1').split('1');\n          // save the curEnd marker before it get cleared due to cm.replaceRange.\n          if (vim.lastSelection) {\n            lastSelectionCurEnd = vim.lastSelection.headMark.find();\n          }\n          // push the previously selected text to unnamed register\n          vimGlobalState.registerController.unnamedRegister.setText(selectedText);\n          if (blockwise) {\n            // first delete the selected text\n            cm.replaceSelections(emptyStrings);\n            // Set new selections as per the block length of the yanked text\n            selectionEnd = new Pos(selectionStart.line + text.length-1, selectionStart.ch);\n            cm.setCursor(selectionStart);\n            selectBlock(cm, selectionEnd);\n            cm.replaceSelections(text);\n            curPosFinal = selectionStart;\n          } else if (vim.visualBlock) {\n            cm.replaceSelections(emptyStrings);\n            cm.setCursor(selectionStart);\n            cm.replaceRange(text, selectionStart, selectionStart);\n            curPosFinal = selectionStart;\n          } else {\n            cm.replaceRange(text, selectionStart, selectionEnd);\n            curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1);\n          }\n          // restore the the curEnd marker\n          if(lastSelectionCurEnd) {\n            vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd);\n          }\n          if (linewise) {\n            curPosFinal.ch=0;\n          }\n        } else {\n          if (blockwise) {\n            cm.setCursor(cur);\n            for (var i = 0; i < text.length; i++) {\n              var line = cur.line+i;\n              if (line > cm.lastLine()) {\n                cm.replaceRange('\\n',  new Pos(line, 0));\n              }\n              var lastCh = lineLength(cm, line);\n              if (lastCh < cur.ch) {\n                extendLineToColumn(cm, line, cur.ch);\n              }\n            }\n            cm.setCursor(cur);\n            selectBlock(cm, new Pos(cur.line + text.length-1, cur.ch));\n            cm.replaceSelections(text);\n            curPosFinal = cur;\n          } else {\n            cm.replaceRange(text, cur);\n            // Now fine tune the cursor to where we want it.\n            if (linewise && actionArgs.after) {\n              curPosFinal = new Pos(\n              cur.line + 1,\n              findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1)));\n            } else if (linewise && !actionArgs.after) {\n              curPosFinal = new Pos(\n                cur.line,\n                findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line)));\n            } else if (!linewise && actionArgs.after) {\n              idx = cm.indexFromPos(cur);\n              curPosFinal = cm.posFromIndex(idx + text.length - 1);\n            } else {\n              idx = cm.indexFromPos(cur);\n              curPosFinal = cm.posFromIndex(idx + text.length);\n            }\n          }\n        }\n        if (vim.visualMode) {\n          exitVisualMode(cm, false);\n        }\n        cm.setCursor(curPosFinal);\n      },\n      undo: function(cm, actionArgs) {\n        cm.operation(function() {\n          repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)();\n          cm.setCursor(cm.getCursor('anchor'));\n        });\n      },\n      redo: function(cm, actionArgs) {\n        repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)();\n      },\n      setRegister: function(_cm, actionArgs, vim) {\n        vim.inputState.registerName = actionArgs.selectedCharacter;\n      },\n      setMark: function(cm, actionArgs, vim) {\n        var markName = actionArgs.selectedCharacter;\n        updateMark(cm, vim, markName, cm.getCursor());\n      },\n      replace: function(cm, actionArgs, vim) {\n        var replaceWith = actionArgs.selectedCharacter;\n        var curStart = cm.getCursor();\n        var replaceTo;\n        var curEnd;\n        var selections = cm.listSelections();\n        if (vim.visualMode) {\n          curStart = cm.getCursor('start');\n          curEnd = cm.getCursor('end');\n        } else {\n          var line = cm.getLine(curStart.line);\n          replaceTo = curStart.ch + actionArgs.repeat;\n          if (replaceTo > line.length) {\n            replaceTo=line.length;\n          }\n          curEnd = new Pos(curStart.line, replaceTo);\n        }\n        if (replaceWith=='\\n') {\n          if (!vim.visualMode) cm.replaceRange('', curStart, curEnd);\n          // special case, where vim help says to replace by just one line-break\n          (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm);\n        } else {\n          var replaceWithStr = cm.getRange(curStart, curEnd);\n          //replace all characters in range by selected, but keep linebreaks\n          replaceWithStr = replaceWithStr.replace(/[^\\n]/g, replaceWith);\n          if (vim.visualBlock) {\n            // Tabs are split in visua block before replacing\n            var spaces = new Array(cm.getOption(\"tabSize\")+1).join(' ');\n            replaceWithStr = cm.getSelection();\n            replaceWithStr = replaceWithStr.replace(/\\t/g, spaces).replace(/[^\\n]/g, replaceWith).split('\\n');\n            cm.replaceSelections(replaceWithStr);\n          } else {\n            cm.replaceRange(replaceWithStr, curStart, curEnd);\n          }\n          if (vim.visualMode) {\n            curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ?\n                         selections[0].anchor : selections[0].head;\n            cm.setCursor(curStart);\n            exitVisualMode(cm, false);\n          } else {\n            cm.setCursor(offsetCursor(curEnd, 0, -1));\n          }\n        }\n      },\n      incrementNumberToken: function(cm, actionArgs) {\n        var cur = cm.getCursor();\n        var lineStr = cm.getLine(cur.line);\n        var re = /(-?)(?:(0x)([\\da-f]+)|(0b|0|)(\\d+))/gi;\n        var match;\n        var start;\n        var end;\n        var numberStr;\n        while ((match = re.exec(lineStr)) !== null) {\n          start = match.index;\n          end = start + match[0].length;\n          if (cur.ch < end)break;\n        }\n        if (!actionArgs.backtrack && (end <= cur.ch))return;\n        if (match) {\n          var baseStr = match[2] || match[4]\n          var digits = match[3] || match[5]\n          var increment = actionArgs.increase ? 1 : -1;\n          var base = {'0b': 2, '0': 8, '': 10, '0x': 16}[baseStr.toLowerCase()];\n          var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat);\n          numberStr = number.toString(base);\n          var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : ''\n          if (numberStr.charAt(0) === '-') {\n            numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1);\n          } else {\n            numberStr = baseStr + zeroPadding + numberStr;\n          }\n          var from = new Pos(cur.line, start);\n          var to = new Pos(cur.line, end);\n          cm.replaceRange(numberStr, from, to);\n        } else {\n          return;\n        }\n        cm.setCursor(new Pos(cur.line, start + numberStr.length - 1));\n      },\n      repeatLastEdit: function(cm, actionArgs, vim) {\n        var lastEditInputState = vim.lastEditInputState;\n        if (!lastEditInputState) { return; }\n        var repeat = actionArgs.repeat;\n        if (repeat && actionArgs.repeatIsExplicit) {\n          vim.lastEditInputState.repeatOverride = repeat;\n        } else {\n          repeat = vim.lastEditInputState.repeatOverride || repeat;\n        }\n        repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */);\n      },\n      indent: function(cm, actionArgs) {\n        cm.indentLine(cm.getCursor().line, actionArgs.indentRight);\n      },\n      exitInsertMode: exitInsertMode\n    };\n\n    function defineAction(name, fn) {\n      actions[name] = fn;\n    }\n\n    /*\n     * Below are miscellaneous utility functions used by vim.js\n     */\n\n    /**\n     * Clips cursor to ensure that line is within the buffer's range\n     * If includeLineBreak is true, then allow cur.ch == lineLength.\n     */\n    function clipCursorToContent(cm, cur) {\n      var vim = cm.state.vim;\n      var includeLineBreak = vim.insertMode || vim.visualMode;\n      var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() );\n      var maxCh = lineLength(cm, line) - 1 + !!includeLineBreak;\n      var ch = Math.min(Math.max(0, cur.ch), maxCh);\n      return new Pos(line, ch);\n    }\n    function copyArgs(args) {\n      var ret = {};\n      for (var prop in args) {\n        if (args.hasOwnProperty(prop)) {\n          ret[prop] = args[prop];\n        }\n      }\n      return ret;\n    }\n    function offsetCursor(cur, offsetLine, offsetCh) {\n      if (typeof offsetLine === 'object') {\n        offsetCh = offsetLine.ch;\n        offsetLine = offsetLine.line;\n      }\n      return new Pos(cur.line + offsetLine, cur.ch + offsetCh);\n    }\n    function commandMatches(keys, keyMap, context, inputState) {\n      // Partial matches are not applied. They inform the key handler\n      // that the current key sequence is a subsequence of a valid key\n      // sequence, so that the key buffer is not cleared.\n      var match, partial = [], full = [];\n      for (var i = 0; i < keyMap.length; i++) {\n        var command = keyMap[i];\n        if (context == 'insert' && command.context != 'insert' ||\n            command.context && command.context != context ||\n            inputState.operator && command.type == 'action' ||\n            !(match = commandMatch(keys, command.keys))) { continue; }\n        if (match == 'partial') { partial.push(command); }\n        if (match == 'full') { full.push(command); }\n      }\n      return {\n        partial: partial.length && partial,\n        full: full.length && full\n      };\n    }\n    function commandMatch(pressed, mapped) {\n      if (mapped.slice(-11) == '<character>') {\n        // Last character matches anything.\n        var prefixLen = mapped.length - 11;\n        var pressedPrefix = pressed.slice(0, prefixLen);\n        var mappedPrefix = mapped.slice(0, prefixLen);\n        return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' :\n               mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false;\n      } else {\n        return pressed == mapped ? 'full' :\n               mapped.indexOf(pressed) == 0 ? 'partial' : false;\n      }\n    }\n    function lastChar(keys) {\n      var match = /^.*(<[^>]+>)$/.exec(keys);\n      var selectedCharacter = match ? match[1] : keys.slice(-1);\n      if (selectedCharacter.length > 1){\n        switch(selectedCharacter){\n          case '<CR>':\n            selectedCharacter='\\n';\n            break;\n          case '<Space>':\n            selectedCharacter=' ';\n            break;\n          default:\n            selectedCharacter='';\n            break;\n        }\n      }\n      return selectedCharacter;\n    }\n    function repeatFn(cm, fn, repeat) {\n      return function() {\n        for (var i = 0; i < repeat; i++) {\n          fn(cm);\n        }\n      };\n    }\n    function copyCursor(cur) {\n      return new Pos(cur.line, cur.ch);\n    }\n    function cursorEqual(cur1, cur2) {\n      return cur1.ch == cur2.ch && cur1.line == cur2.line;\n    }\n    function cursorIsBefore(cur1, cur2) {\n      if (cur1.line < cur2.line) {\n        return true;\n      }\n      if (cur1.line == cur2.line && cur1.ch < cur2.ch) {\n        return true;\n      }\n      return false;\n    }\n    function cursorMin(cur1, cur2) {\n      if (arguments.length > 2) {\n        cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1));\n      }\n      return cursorIsBefore(cur1, cur2) ? cur1 : cur2;\n    }\n    function cursorMax(cur1, cur2) {\n      if (arguments.length > 2) {\n        cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1));\n      }\n      return cursorIsBefore(cur1, cur2) ? cur2 : cur1;\n    }\n    function cursorIsBetween(cur1, cur2, cur3) {\n      // returns true if cur2 is between cur1 and cur3.\n      var cur1before2 = cursorIsBefore(cur1, cur2);\n      var cur2before3 = cursorIsBefore(cur2, cur3);\n      return cur1before2 && cur2before3;\n    }\n    function lineLength(cm, lineNum) {\n      return cm.getLine(lineNum).length;\n    }\n    function trim(s) {\n      if (s.trim) {\n        return s.trim();\n      }\n      return s.replace(/^\\s+|\\s+$/g, '');\n    }\n    function escapeRegex(s) {\n      return s.replace(/([.?*+$\\[\\]\\/\\\\(){}|\\-])/g, '\\\\$1');\n    }\n    function extendLineToColumn(cm, lineNum, column) {\n      var endCh = lineLength(cm, lineNum);\n      var spaces = new Array(column-endCh+1).join(' ');\n      cm.setCursor(new Pos(lineNum, endCh));\n      cm.replaceRange(spaces, cm.getCursor());\n    }\n    // This functions selects a rectangular block\n    // of text with selectionEnd as any of its corner\n    // Height of block:\n    // Difference in selectionEnd.line and first/last selection.line\n    // Width of the block:\n    // Distance between selectionEnd.ch and any(first considered here) selection.ch\n    function selectBlock(cm, selectionEnd) {\n      var selections = [], ranges = cm.listSelections();\n      var head = copyCursor(cm.clipPos(selectionEnd));\n      var isClipped = !cursorEqual(selectionEnd, head);\n      var curHead = cm.getCursor('head');\n      var primIndex = getIndex(ranges, curHead);\n      var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor);\n      var max = ranges.length - 1;\n      var index = max - primIndex > primIndex ? max : 0;\n      var base = ranges[index].anchor;\n\n      var firstLine = Math.min(base.line, head.line);\n      var lastLine = Math.max(base.line, head.line);\n      var baseCh = base.ch, headCh = head.ch;\n\n      var dir = ranges[index].head.ch - baseCh;\n      var newDir = headCh - baseCh;\n      if (dir > 0 && newDir <= 0) {\n        baseCh++;\n        if (!isClipped) { headCh--; }\n      } else if (dir < 0 && newDir >= 0) {\n        baseCh--;\n        if (!wasClipped) { headCh++; }\n      } else if (dir < 0 && newDir == -1) {\n        baseCh--;\n        headCh++;\n      }\n      for (var line = firstLine; line <= lastLine; line++) {\n        var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)};\n        selections.push(range);\n      }\n      cm.setSelections(selections);\n      selectionEnd.ch = headCh;\n      base.ch = baseCh;\n      return base;\n    }\n    function selectForInsert(cm, head, height) {\n      var sel = [];\n      for (var i = 0; i < height; i++) {\n        var lineHead = offsetCursor(head, i, 0);\n        sel.push({anchor: lineHead, head: lineHead});\n      }\n      cm.setSelections(sel, 0);\n    }\n    // getIndex returns the index of the cursor in the selections.\n    function getIndex(ranges, cursor, end) {\n      for (var i = 0; i < ranges.length; i++) {\n        var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor);\n        var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor);\n        if (atAnchor || atHead) {\n          return i;\n        }\n      }\n      return -1;\n    }\n    function getSelectedAreaRange(cm, vim) {\n      var lastSelection = vim.lastSelection;\n      var getCurrentSelectedAreaRange = function() {\n        var selections = cm.listSelections();\n        var start =  selections[0];\n        var end = selections[selections.length-1];\n        var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head;\n        var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor;\n        return [selectionStart, selectionEnd];\n      };\n      var getLastSelectedAreaRange = function() {\n        var selectionStart = cm.getCursor();\n        var selectionEnd = cm.getCursor();\n        var block = lastSelection.visualBlock;\n        if (block) {\n          var width = block.width;\n          var height = block.height;\n          selectionEnd = new Pos(selectionStart.line + height, selectionStart.ch + width);\n          var selections = [];\n          // selectBlock creates a 'proper' rectangular block.\n          // We do not want that in all cases, so we manually set selections.\n          for (var i = selectionStart.line; i < selectionEnd.line; i++) {\n            var anchor = new Pos(i, selectionStart.ch);\n            var head = new Pos(i, selectionEnd.ch);\n            var range = {anchor: anchor, head: head};\n            selections.push(range);\n          }\n          cm.setSelections(selections);\n        } else {\n          var start = lastSelection.anchorMark.find();\n          var end = lastSelection.headMark.find();\n          var line = end.line - start.line;\n          var ch = end.ch - start.ch;\n          selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch};\n          if (lastSelection.visualLine) {\n            selectionStart = new Pos(selectionStart.line, 0);\n            selectionEnd = new Pos(selectionEnd.line, lineLength(cm, selectionEnd.line));\n          }\n          cm.setSelection(selectionStart, selectionEnd);\n        }\n        return [selectionStart, selectionEnd];\n      };\n      if (!vim.visualMode) {\n      // In case of replaying the action.\n        return getLastSelectedAreaRange();\n      } else {\n        return getCurrentSelectedAreaRange();\n      }\n    }\n    // Updates the previous selection with the current selection's values. This\n    // should only be called in visual mode.\n    function updateLastSelection(cm, vim) {\n      var anchor = vim.sel.anchor;\n      var head = vim.sel.head;\n      // To accommodate the effect of lastPastedText in the last selection\n      if (vim.lastPastedText) {\n        head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length);\n        vim.lastPastedText = null;\n      }\n      vim.lastSelection = {'anchorMark': cm.setBookmark(anchor),\n                           'headMark': cm.setBookmark(head),\n                           'anchor': copyCursor(anchor),\n                           'head': copyCursor(head),\n                           'visualMode': vim.visualMode,\n                           'visualLine': vim.visualLine,\n                           'visualBlock': vim.visualBlock};\n    }\n    function expandSelection(cm, start, end) {\n      var sel = cm.state.vim.sel;\n      var head = sel.head;\n      var anchor = sel.anchor;\n      var tmp;\n      if (cursorIsBefore(end, start)) {\n        tmp = end;\n        end = start;\n        start = tmp;\n      }\n      if (cursorIsBefore(head, anchor)) {\n        head = cursorMin(start, head);\n        anchor = cursorMax(anchor, end);\n      } else {\n        anchor = cursorMin(start, anchor);\n        head = cursorMax(head, end);\n        head = offsetCursor(head, 0, -1);\n        if (head.ch == -1 && head.line != cm.firstLine()) {\n          head = new Pos(head.line - 1, lineLength(cm, head.line - 1));\n        }\n      }\n      return [anchor, head];\n    }\n    /**\n     * Updates the CodeMirror selection to match the provided vim selection.\n     * If no arguments are given, it uses the current vim selection state.\n     */\n    function updateCmSelection(cm, sel, mode) {\n      var vim = cm.state.vim;\n      sel = sel || vim.sel;\n      var mode = mode ||\n        vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char';\n      var cmSel = makeCmSelection(cm, sel, mode);\n      cm.setSelections(cmSel.ranges, cmSel.primary);\n    }\n    function makeCmSelection(cm, sel, mode, exclusive) {\n      var head = copyCursor(sel.head);\n      var anchor = copyCursor(sel.anchor);\n      if (mode == 'char') {\n        var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0;\n        var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0;\n        head = offsetCursor(sel.head, 0, headOffset);\n        anchor = offsetCursor(sel.anchor, 0, anchorOffset);\n        return {\n          ranges: [{anchor: anchor, head: head}],\n          primary: 0\n        };\n      } else if (mode == 'line') {\n        if (!cursorIsBefore(sel.head, sel.anchor)) {\n          anchor.ch = 0;\n\n          var lastLine = cm.lastLine();\n          if (head.line > lastLine) {\n            head.line = lastLine;\n          }\n          head.ch = lineLength(cm, head.line);\n        } else {\n          head.ch = 0;\n          anchor.ch = lineLength(cm, anchor.line);\n        }\n        return {\n          ranges: [{anchor: anchor, head: head}],\n          primary: 0\n        };\n      } else if (mode == 'block') {\n        var top = Math.min(anchor.line, head.line),\n            fromCh = anchor.ch,\n            bottom = Math.max(anchor.line, head.line),\n            toCh = head.ch;\n        if (fromCh < toCh) { toCh += 1 }\n        else { fromCh += 1 };\n        var height = bottom - top + 1;\n        var primary = head.line == top ? 0 : height - 1;\n        var ranges = [];\n        for (var i = 0; i < height; i++) {\n          ranges.push({\n            anchor: new Pos(top + i, fromCh),\n            head: new Pos(top + i, toCh)\n          });\n        }\n        return {\n          ranges: ranges,\n          primary: primary\n        };\n      }\n    }\n    function getHead(cm) {\n      var cur = cm.getCursor('head');\n      if (cm.getSelection().length == 1) {\n        // Small corner case when only 1 character is selected. The \"real\"\n        // head is the left of head and anchor.\n        cur = cursorMin(cur, cm.getCursor('anchor'));\n      }\n      return cur;\n    }\n\n    /**\n     * If moveHead is set to false, the CodeMirror selection will not be\n     * touched. The caller assumes the responsibility of putting the cursor\n    * in the right place.\n     */\n    function exitVisualMode(cm, moveHead) {\n      var vim = cm.state.vim;\n      if (moveHead !== false) {\n        cm.setCursor(clipCursorToContent(cm, vim.sel.head));\n      }\n      updateLastSelection(cm, vim);\n      vim.visualMode = false;\n      vim.visualLine = false;\n      vim.visualBlock = false;\n      if (!vim.insertMode) CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n    }\n\n    // Remove any trailing newlines from the selection. For\n    // example, with the caret at the start of the last word on the line,\n    // 'dw' should word, but not the newline, while 'w' should advance the\n    // caret to the first character of the next line.\n    function clipToLine(cm, curStart, curEnd) {\n      var selection = cm.getRange(curStart, curEnd);\n      // Only clip if the selection ends with trailing newline + whitespace\n      if (/\\n\\s*$/.test(selection)) {\n        var lines = selection.split('\\n');\n        // We know this is all whitespace.\n        lines.pop();\n\n        // Cases:\n        // 1. Last word is an empty line - do not clip the trailing '\\n'\n        // 2. Last word is not an empty line - clip the trailing '\\n'\n        var line;\n        // Find the line containing the last word, and clip all whitespace up\n        // to it.\n        for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) {\n          curEnd.line--;\n          curEnd.ch = 0;\n        }\n        // If the last word is not an empty line, clip an additional newline\n        if (line) {\n          curEnd.line--;\n          curEnd.ch = lineLength(cm, curEnd.line);\n        } else {\n          curEnd.ch = 0;\n        }\n      }\n    }\n\n    // Expand the selection to line ends.\n    function expandSelectionToLine(_cm, curStart, curEnd) {\n      curStart.ch = 0;\n      curEnd.ch = 0;\n      curEnd.line++;\n    }\n\n    function findFirstNonWhiteSpaceCharacter(text) {\n      if (!text) {\n        return 0;\n      }\n      var firstNonWS = text.search(/\\S/);\n      return firstNonWS == -1 ? text.length : firstNonWS;\n    }\n\n    function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) {\n      var cur = getHead(cm);\n      var line = cm.getLine(cur.line);\n      var idx = cur.ch;\n\n      // Seek to first word or non-whitespace character, depending on if\n      // noSymbol is true.\n      var test = noSymbol ? wordCharTest[0] : bigWordCharTest [0];\n      while (!test(line.charAt(idx))) {\n        idx++;\n        if (idx >= line.length) { return null; }\n      }\n\n      if (bigWord) {\n        test = bigWordCharTest[0];\n      } else {\n        test = wordCharTest[0];\n        if (!test(line.charAt(idx))) {\n          test = wordCharTest[1];\n        }\n      }\n\n      var end = idx, start = idx;\n      while (test(line.charAt(end)) && end < line.length) { end++; }\n      while (test(line.charAt(start)) && start >= 0) { start--; }\n      start++;\n\n      if (inclusive) {\n        // If present, include all whitespace after word.\n        // Otherwise, include all whitespace before word, except indentation.\n        var wordEnd = end;\n        while (/\\s/.test(line.charAt(end)) && end < line.length) { end++; }\n        if (wordEnd == end) {\n          var wordStart = start;\n          while (/\\s/.test(line.charAt(start - 1)) && start > 0) { start--; }\n          if (!start) { start = wordStart; }\n        }\n      }\n      return { start: new Pos(cur.line, start), end: new Pos(cur.line, end) };\n    }\n\n    /**\n     * Depends on the following:\n     *\n     * - editor mode should be htmlmixedmode / xml\n     * - mode/xml/xml.js should be loaded\n     * - addon/fold/xml-fold.js should be loaded\n     *\n     * If any of the above requirements are not true, this function noops.\n     *\n     * This is _NOT_ a 100% accurate implementation of vim tag text objects.\n     * The following caveats apply (based off cursory testing, I'm sure there\n     * are other discrepancies):\n     *\n     * - Does not work inside comments:\n     *   ```\n     *   <!-- <div>broken</div> -->\n     *   ```\n     * - Does not work when tags have different cases:\n     *   ```\n     *   <div>broken</DIV>\n     *   ```\n     * - Does not work when cursor is inside a broken tag:\n     *   ```\n     *   <div><brok><en></div>\n     *   ```\n     */\n    function expandTagUnderCursor(cm, head, inclusive) {\n      var cur = head;\n      if (!CodeMirror.findMatchingTag || !CodeMirror.findEnclosingTag) {\n        return { start: cur, end: cur };\n      }\n\n      var tags = CodeMirror.findMatchingTag(cm, head) || CodeMirror.findEnclosingTag(cm, head);\n      if (!tags || !tags.open || !tags.close) {\n        return { start: cur, end: cur };\n      }\n\n      if (inclusive) {\n        return { start: tags.open.from, end: tags.close.to };\n      }\n      return { start: tags.open.to, end: tags.close.from };\n    }\n\n    function recordJumpPosition(cm, oldCur, newCur) {\n      if (!cursorEqual(oldCur, newCur)) {\n        vimGlobalState.jumpList.add(cm, oldCur, newCur);\n      }\n    }\n\n    function recordLastCharacterSearch(increment, args) {\n        vimGlobalState.lastCharacterSearch.increment = increment;\n        vimGlobalState.lastCharacterSearch.forward = args.forward;\n        vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter;\n    }\n\n    var symbolToMode = {\n        '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket',\n        '[': 'section', ']': 'section',\n        '*': 'comment', '/': 'comment',\n        'm': 'method', 'M': 'method',\n        '#': 'preprocess'\n    };\n    var findSymbolModes = {\n      bracket: {\n        isComplete: function(state) {\n          if (state.nextCh === state.symb) {\n            state.depth++;\n            if (state.depth >= 1)return true;\n          } else if (state.nextCh === state.reverseSymb) {\n            state.depth--;\n          }\n          return false;\n        }\n      },\n      section: {\n        init: function(state) {\n          state.curMoveThrough = true;\n          state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}';\n        },\n        isComplete: function(state) {\n          return state.index === 0 && state.nextCh === state.symb;\n        }\n      },\n      comment: {\n        isComplete: function(state) {\n          var found = state.lastCh === '*' && state.nextCh === '/';\n          state.lastCh = state.nextCh;\n          return found;\n        }\n      },\n      // TODO: The original Vim implementation only operates on level 1 and 2.\n      // The current implementation doesn't check for code block level and\n      // therefore it operates on any levels.\n      method: {\n        init: function(state) {\n          state.symb = (state.symb === 'm' ? '{' : '}');\n          state.reverseSymb = state.symb === '{' ? '}' : '{';\n        },\n        isComplete: function(state) {\n          if (state.nextCh === state.symb)return true;\n          return false;\n        }\n      },\n      preprocess: {\n        init: function(state) {\n          state.index = 0;\n        },\n        isComplete: function(state) {\n          if (state.nextCh === '#') {\n            var token = state.lineText.match(/^#(\\w+)/)[1];\n            if (token === 'endif') {\n              if (state.forward && state.depth === 0) {\n                return true;\n              }\n              state.depth++;\n            } else if (token === 'if') {\n              if (!state.forward && state.depth === 0) {\n                return true;\n              }\n              state.depth--;\n            }\n            if (token === 'else' && state.depth === 0)return true;\n          }\n          return false;\n        }\n      }\n    };\n    function findSymbol(cm, repeat, forward, symb) {\n      var cur = copyCursor(cm.getCursor());\n      var increment = forward ? 1 : -1;\n      var endLine = forward ? cm.lineCount() : -1;\n      var curCh = cur.ch;\n      var line = cur.line;\n      var lineText = cm.getLine(line);\n      var state = {\n        lineText: lineText,\n        nextCh: lineText.charAt(curCh),\n        lastCh: null,\n        index: curCh,\n        symb: symb,\n        reverseSymb: (forward ?  { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb],\n        forward: forward,\n        depth: 0,\n        curMoveThrough: false\n      };\n      var mode = symbolToMode[symb];\n      if (!mode)return cur;\n      var init = findSymbolModes[mode].init;\n      var isComplete = findSymbolModes[mode].isComplete;\n      if (init) { init(state); }\n      while (line !== endLine && repeat) {\n        state.index += increment;\n        state.nextCh = state.lineText.charAt(state.index);\n        if (!state.nextCh) {\n          line += increment;\n          state.lineText = cm.getLine(line) || '';\n          if (increment > 0) {\n            state.index = 0;\n          } else {\n            var lineLen = state.lineText.length;\n            state.index = (lineLen > 0) ? (lineLen-1) : 0;\n          }\n          state.nextCh = state.lineText.charAt(state.index);\n        }\n        if (isComplete(state)) {\n          cur.line = line;\n          cur.ch = state.index;\n          repeat--;\n        }\n      }\n      if (state.nextCh || state.curMoveThrough) {\n        return new Pos(line, state.index);\n      }\n      return cur;\n    }\n\n    /*\n     * Returns the boundaries of the next word. If the cursor in the middle of\n     * the word, then returns the boundaries of the current word, starting at\n     * the cursor. If the cursor is at the start/end of a word, and we are going\n     * forward/backward, respectively, find the boundaries of the next word.\n     *\n     * @param {CodeMirror} cm CodeMirror object.\n     * @param {Cursor} cur The cursor position.\n     * @param {boolean} forward True to search forward. False to search\n     *     backward.\n     * @param {boolean} bigWord True if punctuation count as part of the word.\n     *     False if only [a-zA-Z0-9] characters count as part of the word.\n     * @param {boolean} emptyLineIsWord True if empty lines should be treated\n     *     as words.\n     * @return {Object{from:number, to:number, line: number}} The boundaries of\n     *     the word, or null if there are no more words.\n     */\n    function findWord(cm, cur, forward, bigWord, emptyLineIsWord) {\n      var lineNum = cur.line;\n      var pos = cur.ch;\n      var line = cm.getLine(lineNum);\n      var dir = forward ? 1 : -1;\n      var charTests = bigWord ? bigWordCharTest: wordCharTest;\n\n      if (emptyLineIsWord && line == '') {\n        lineNum += dir;\n        line = cm.getLine(lineNum);\n        if (!isLine(cm, lineNum)) {\n          return null;\n        }\n        pos = (forward) ? 0 : line.length;\n      }\n\n      while (true) {\n        if (emptyLineIsWord && line == '') {\n          return { from: 0, to: 0, line: lineNum };\n        }\n        var stop = (dir > 0) ? line.length : -1;\n        var wordStart = stop, wordEnd = stop;\n        // Find bounds of next word.\n        while (pos != stop) {\n          var foundWord = false;\n          for (var i = 0; i < charTests.length && !foundWord; ++i) {\n            if (charTests[i](line.charAt(pos))) {\n              wordStart = pos;\n              // Advance to end of word.\n              while (pos != stop && charTests[i](line.charAt(pos))) {\n                pos += dir;\n              }\n              wordEnd = pos;\n              foundWord = wordStart != wordEnd;\n              if (wordStart == cur.ch && lineNum == cur.line &&\n                  wordEnd == wordStart + dir) {\n                // We started at the end of a word. Find the next one.\n                continue;\n              } else {\n                return {\n                  from: Math.min(wordStart, wordEnd + 1),\n                  to: Math.max(wordStart, wordEnd),\n                  line: lineNum };\n              }\n            }\n          }\n          if (!foundWord) {\n            pos += dir;\n          }\n        }\n        // Advance to next/prev line.\n        lineNum += dir;\n        if (!isLine(cm, lineNum)) {\n          return null;\n        }\n        line = cm.getLine(lineNum);\n        pos = (dir > 0) ? 0 : line.length;\n      }\n    }\n\n    /**\n     * @param {CodeMirror} cm CodeMirror object.\n     * @param {Pos} cur The position to start from.\n     * @param {int} repeat Number of words to move past.\n     * @param {boolean} forward True to search forward. False to search\n     *     backward.\n     * @param {boolean} wordEnd True to move to end of word. False to move to\n     *     beginning of word.\n     * @param {boolean} bigWord True if punctuation count as part of the word.\n     *     False if only alphabet characters count as part of the word.\n     * @return {Cursor} The position the cursor should move to.\n     */\n    function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) {\n      var curStart = copyCursor(cur);\n      var words = [];\n      if (forward && !wordEnd || !forward && wordEnd) {\n        repeat++;\n      }\n      // For 'e', empty lines are not considered words, go figure.\n      var emptyLineIsWord = !(forward && wordEnd);\n      for (var i = 0; i < repeat; i++) {\n        var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord);\n        if (!word) {\n          var eodCh = lineLength(cm, cm.lastLine());\n          words.push(forward\n              ? {line: cm.lastLine(), from: eodCh, to: eodCh}\n              : {line: 0, from: 0, to: 0});\n          break;\n        }\n        words.push(word);\n        cur = new Pos(word.line, forward ? (word.to - 1) : word.from);\n      }\n      var shortCircuit = words.length != repeat;\n      var firstWord = words[0];\n      var lastWord = words.pop();\n      if (forward && !wordEnd) {\n        // w\n        if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) {\n          // We did not start in the middle of a word. Discard the extra word at the end.\n          lastWord = words.pop();\n        }\n        return new Pos(lastWord.line, lastWord.from);\n      } else if (forward && wordEnd) {\n        return new Pos(lastWord.line, lastWord.to - 1);\n      } else if (!forward && wordEnd) {\n        // ge\n        if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) {\n          // We did not start in the middle of a word. Discard the extra word at the end.\n          lastWord = words.pop();\n        }\n        return new Pos(lastWord.line, lastWord.to);\n      } else {\n        // b\n        return new Pos(lastWord.line, lastWord.from);\n      }\n    }\n\n    function moveToEol(cm, head, motionArgs, vim, keepHPos) {\n      var cur = head;\n      var retval= new Pos(cur.line + motionArgs.repeat - 1, Infinity);\n      var end=cm.clipPos(retval);\n      end.ch--;\n      if (!keepHPos) {\n        vim.lastHPos = Infinity;\n        vim.lastHSPos = cm.charCoords(end,'div').left;\n      }\n      return retval;\n    }\n\n    function moveToCharacter(cm, repeat, forward, character) {\n      var cur = cm.getCursor();\n      var start = cur.ch;\n      var idx;\n      for (var i = 0; i < repeat; i ++) {\n        var line = cm.getLine(cur.line);\n        idx = charIdxInLine(start, line, character, forward, true);\n        if (idx == -1) {\n          return null;\n        }\n        start = idx;\n      }\n      return new Pos(cm.getCursor().line, idx);\n    }\n\n    function moveToColumn(cm, repeat) {\n      // repeat is always >= 1, so repeat - 1 always corresponds\n      // to the column we want to go to.\n      var line = cm.getCursor().line;\n      return clipCursorToContent(cm, new Pos(line, repeat - 1));\n    }\n\n    function updateMark(cm, vim, markName, pos) {\n      if (!inArray(markName, validMarks)) {\n        return;\n      }\n      if (vim.marks[markName]) {\n        vim.marks[markName].clear();\n      }\n      vim.marks[markName] = cm.setBookmark(pos);\n    }\n\n    function charIdxInLine(start, line, character, forward, includeChar) {\n      // Search for char in line.\n      // motion_options: {forward, includeChar}\n      // If includeChar = true, include it too.\n      // If forward = true, search forward, else search backwards.\n      // If char is not found on this line, do nothing\n      var idx;\n      if (forward) {\n        idx = line.indexOf(character, start + 1);\n        if (idx != -1 && !includeChar) {\n          idx -= 1;\n        }\n      } else {\n        idx = line.lastIndexOf(character, start - 1);\n        if (idx != -1 && !includeChar) {\n          idx += 1;\n        }\n      }\n      return idx;\n    }\n\n    function findParagraph(cm, head, repeat, dir, inclusive) {\n      var line = head.line;\n      var min = cm.firstLine();\n      var max = cm.lastLine();\n      var start, end, i = line;\n      function isEmpty(i) { return !cm.getLine(i); }\n      function isBoundary(i, dir, any) {\n        if (any) { return isEmpty(i) != isEmpty(i + dir); }\n        return !isEmpty(i) && isEmpty(i + dir);\n      }\n      if (dir) {\n        while (min <= i && i <= max && repeat > 0) {\n          if (isBoundary(i, dir)) { repeat--; }\n          i += dir;\n        }\n        return new Pos(i, 0);\n      }\n\n      var vim = cm.state.vim;\n      if (vim.visualLine && isBoundary(line, 1, true)) {\n        var anchor = vim.sel.anchor;\n        if (isBoundary(anchor.line, -1, true)) {\n          if (!inclusive || anchor.line != line) {\n            line += 1;\n          }\n        }\n      }\n      var startState = isEmpty(line);\n      for (i = line; i <= max && repeat; i++) {\n        if (isBoundary(i, 1, true)) {\n          if (!inclusive || isEmpty(i) != startState) {\n            repeat--;\n          }\n        }\n      }\n      end = new Pos(i, 0);\n      // select boundary before paragraph for the last one\n      if (i > max && !startState) { startState = true; }\n      else { inclusive = false; }\n      for (i = line; i > min; i--) {\n        if (!inclusive || isEmpty(i) == startState || i == line) {\n          if (isBoundary(i, -1, true)) { break; }\n        }\n      }\n      start = new Pos(i, 0);\n      return { start: start, end: end };\n    }\n\n    function findSentence(cm, cur, repeat, dir) {\n\n      /*\n        Takes an index object\n        {\n          line: the line string,\n          ln: line number,\n          pos: index in line,\n          dir: direction of traversal (-1 or 1)\n        }\n        and modifies the line, ln, and pos members to represent the\n        next valid position or sets them to null if there are\n        no more valid positions.\n       */\n      function nextChar(cm, idx) {\n        if (idx.pos + idx.dir < 0 || idx.pos + idx.dir >= idx.line.length) {\n          idx.ln += idx.dir;\n          if (!isLine(cm, idx.ln)) {\n            idx.line = null;\n            idx.ln = null;\n            idx.pos = null;\n            return;\n          }\n          idx.line = cm.getLine(idx.ln);\n          idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1;\n        }\n        else {\n          idx.pos += idx.dir;\n        }\n      }\n\n      /*\n        Performs one iteration of traversal in forward direction\n        Returns an index object of the new location\n       */\n      function forward(cm, ln, pos, dir) {\n        var line = cm.getLine(ln);\n        var stop = (line === \"\");\n\n        var curr = {\n          line: line,\n          ln: ln,\n          pos: pos,\n          dir: dir,\n        }\n\n        var last_valid = {\n          ln: curr.ln,\n          pos: curr.pos,\n        }\n\n        var skip_empty_lines = (curr.line === \"\");\n\n        // Move one step to skip character we start on\n        nextChar(cm, curr);\n\n        while (curr.line !== null) {\n          last_valid.ln = curr.ln;\n          last_valid.pos = curr.pos;\n\n          if (curr.line === \"\" && !skip_empty_lines) {\n            return { ln: curr.ln, pos: curr.pos, };\n          }\n          else if (stop && curr.line !== \"\" && !isWhiteSpaceString(curr.line[curr.pos])) {\n            return { ln: curr.ln, pos: curr.pos, };\n          }\n          else if (isEndOfSentenceSymbol(curr.line[curr.pos])\n            && !stop\n            && (curr.pos === curr.line.length - 1\n              || isWhiteSpaceString(curr.line[curr.pos + 1]))) {\n            stop = true;\n          }\n\n          nextChar(cm, curr);\n        }\n\n        /*\n          Set the position to the last non whitespace character on the last\n          valid line in the case that we reach the end of the document.\n        */\n        var line = cm.getLine(last_valid.ln);\n        last_valid.pos = 0;\n        for(var i = line.length - 1; i >= 0; --i) {\n          if (!isWhiteSpaceString(line[i])) {\n            last_valid.pos = i;\n            break;\n          }\n        }\n\n        return last_valid;\n\n      }\n\n      /*\n        Performs one iteration of traversal in reverse direction\n        Returns an index object of the new location\n       */\n      function reverse(cm, ln, pos, dir) {\n        var line = cm.getLine(ln);\n\n        var curr = {\n          line: line,\n          ln: ln,\n          pos: pos,\n          dir: dir,\n        }\n\n        var last_valid = {\n          ln: curr.ln,\n          pos: null,\n        };\n\n        var skip_empty_lines = (curr.line === \"\");\n\n        // Move one step to skip character we start on\n        nextChar(cm, curr);\n\n        while (curr.line !== null) {\n\n          if (curr.line === \"\" && !skip_empty_lines) {\n            if (last_valid.pos !== null) {\n              return last_valid;\n            }\n            else {\n              return { ln: curr.ln, pos: curr.pos };\n            }\n          }\n          else if (isEndOfSentenceSymbol(curr.line[curr.pos])\n              && last_valid.pos !== null\n              && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) {\n            return last_valid;\n          }\n          else if (curr.line !== \"\" && !isWhiteSpaceString(curr.line[curr.pos])) {\n            skip_empty_lines = false;\n            last_valid = { ln: curr.ln, pos: curr.pos }\n          }\n\n          nextChar(cm, curr);\n        }\n\n        /*\n          Set the position to the first non whitespace character on the last\n          valid line in the case that we reach the beginning of the document.\n        */\n        var line = cm.getLine(last_valid.ln);\n        last_valid.pos = 0;\n        for(var i = 0; i < line.length; ++i) {\n          if (!isWhiteSpaceString(line[i])) {\n            last_valid.pos = i;\n            break;\n          }\n        }\n        return last_valid;\n      }\n\n      var curr_index = {\n        ln: cur.line,\n        pos: cur.ch,\n      };\n\n      while (repeat > 0) {\n        if (dir < 0) {\n          curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir);\n        }\n        else {\n          curr_index = forward(cm, curr_index.ln, curr_index.pos, dir);\n        }\n        repeat--;\n      }\n\n      return new Pos(curr_index.ln, curr_index.pos);\n    }\n\n    // TODO: perhaps this finagling of start and end positions belongs\n    // in codemirror/replaceRange?\n    function selectCompanionObject(cm, head, symb, inclusive) {\n      var cur = head, start, end;\n\n      var bracketRegexp = ({\n        '(': /[()]/, ')': /[()]/,\n        '[': /[[\\]]/, ']': /[[\\]]/,\n        '{': /[{}]/, '}': /[{}]/,\n        '<': /[<>]/, '>': /[<>]/})[symb];\n      var openSym = ({\n        '(': '(', ')': '(',\n        '[': '[', ']': '[',\n        '{': '{', '}': '{',\n        '<': '<', '>': '<'})[symb];\n      var curChar = cm.getLine(cur.line).charAt(cur.ch);\n      // Due to the behavior of scanForBracket, we need to add an offset if the\n      // cursor is on a matching open bracket.\n      var offset = curChar === openSym ? 1 : 0;\n\n      start = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), -1, undefined, {'bracketRegex': bracketRegexp});\n      end = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), 1, undefined, {'bracketRegex': bracketRegexp});\n\n      if (!start || !end) {\n        return { start: cur, end: cur };\n      }\n\n      start = start.pos;\n      end = end.pos;\n\n      if ((start.line == end.line && start.ch > end.ch)\n          || (start.line > end.line)) {\n        var tmp = start;\n        start = end;\n        end = tmp;\n      }\n\n      if (inclusive) {\n        end.ch += 1;\n      } else {\n        start.ch += 1;\n      }\n\n      return { start: start, end: end };\n    }\n\n    // Takes in a symbol and a cursor and tries to simulate text objects that\n    // have identical opening and closing symbols\n    // TODO support across multiple lines\n    function findBeginningAndEnd(cm, head, symb, inclusive) {\n      var cur = copyCursor(head);\n      var line = cm.getLine(cur.line);\n      var chars = line.split('');\n      var start, end, i, len;\n      var firstIndex = chars.indexOf(symb);\n\n      // the decision tree is to always look backwards for the beginning first,\n      // but if the cursor is in front of the first instance of the symb,\n      // then move the cursor forward\n      if (cur.ch < firstIndex) {\n        cur.ch = firstIndex;\n        // Why is this line even here???\n        // cm.setCursor(cur.line, firstIndex+1);\n      }\n      // otherwise if the cursor is currently on the closing symbol\n      else if (firstIndex < cur.ch && chars[cur.ch] == symb) {\n        end = cur.ch; // assign end to the current cursor\n        --cur.ch; // make sure to look backwards\n      }\n\n      // if we're currently on the symbol, we've got a start\n      if (chars[cur.ch] == symb && !end) {\n        start = cur.ch + 1; // assign start to ahead of the cursor\n      } else {\n        // go backwards to find the start\n        for (i = cur.ch; i > -1 && !start; i--) {\n          if (chars[i] == symb) {\n            start = i + 1;\n          }\n        }\n      }\n\n      // look forwards for the end symbol\n      if (start && !end) {\n        for (i = start, len = chars.length; i < len && !end; i++) {\n          if (chars[i] == symb) {\n            end = i;\n          }\n        }\n      }\n\n      // nothing found\n      if (!start || !end) {\n        return { start: cur, end: cur };\n      }\n\n      // include the symbols\n      if (inclusive) {\n        --start; ++end;\n      }\n\n      return {\n        start: new Pos(cur.line, start),\n        end: new Pos(cur.line, end)\n      };\n    }\n\n    // Search functions\n    defineOption('pcre', true, 'boolean');\n    function SearchState() {}\n    SearchState.prototype = {\n      getQuery: function() {\n        return vimGlobalState.query;\n      },\n      setQuery: function(query) {\n        vimGlobalState.query = query;\n      },\n      getOverlay: function() {\n        return this.searchOverlay;\n      },\n      setOverlay: function(overlay) {\n        this.searchOverlay = overlay;\n      },\n      isReversed: function() {\n        return vimGlobalState.isReversed;\n      },\n      setReversed: function(reversed) {\n        vimGlobalState.isReversed = reversed;\n      },\n      getScrollbarAnnotate: function() {\n        return this.annotate;\n      },\n      setScrollbarAnnotate: function(annotate) {\n        this.annotate = annotate;\n      }\n    };\n    function getSearchState(cm) {\n      var vim = cm.state.vim;\n      return vim.searchState_ || (vim.searchState_ = new SearchState());\n    }\n    function splitBySlash(argString) {\n      return splitBySeparator(argString, '/');\n    }\n\n    function findUnescapedSlashes(argString) {\n      return findUnescapedSeparators(argString, '/');\n    }\n\n    function splitBySeparator(argString, separator) {\n      var slashes = findUnescapedSeparators(argString, separator) || [];\n      if (!slashes.length) return [];\n      var tokens = [];\n      // in case of strings like foo/bar\n      if (slashes[0] !== 0) return;\n      for (var i = 0; i < slashes.length; i++) {\n        if (typeof slashes[i] == 'number')\n          tokens.push(argString.substring(slashes[i] + 1, slashes[i+1]));\n      }\n      return tokens;\n    }\n\n    function findUnescapedSeparators(str, separator) {\n      if (!separator)\n        separator = '/';\n\n      var escapeNextChar = false;\n      var slashes = [];\n      for (var i = 0; i < str.length; i++) {\n        var c = str.charAt(i);\n        if (!escapeNextChar && c == separator) {\n          slashes.push(i);\n        }\n        escapeNextChar = !escapeNextChar && (c == '\\\\');\n      }\n      return slashes;\n    }\n\n    // Translates a search string from ex (vim) syntax into javascript form.\n    function translateRegex(str) {\n      // When these match, add a '\\' if unescaped or remove one if escaped.\n      var specials = '|(){';\n      // Remove, but never add, a '\\' for these.\n      var unescape = '}';\n      var escapeNextChar = false;\n      var out = [];\n      for (var i = -1; i < str.length; i++) {\n        var c = str.charAt(i) || '';\n        var n = str.charAt(i+1) || '';\n        var specialComesNext = (n && specials.indexOf(n) != -1);\n        if (escapeNextChar) {\n          if (c !== '\\\\' || !specialComesNext) {\n            out.push(c);\n          }\n          escapeNextChar = false;\n        } else {\n          if (c === '\\\\') {\n            escapeNextChar = true;\n            // Treat the unescape list as special for removing, but not adding '\\'.\n            if (n && unescape.indexOf(n) != -1) {\n              specialComesNext = true;\n            }\n            // Not passing this test means removing a '\\'.\n            if (!specialComesNext || n === '\\\\') {\n              out.push(c);\n            }\n          } else {\n            out.push(c);\n            if (specialComesNext && n !== '\\\\') {\n              out.push('\\\\');\n            }\n          }\n        }\n      }\n      return out.join('');\n    }\n\n    // Translates the replace part of a search and replace from ex (vim) syntax into\n    // javascript form.  Similar to translateRegex, but additionally fixes back references\n    // (translates '\\[0..9]' to '$[0..9]') and follows different rules for escaping '$'.\n    var charUnescapes = {'\\\\n': '\\n', '\\\\r': '\\r', '\\\\t': '\\t'};\n    function translateRegexReplace(str) {\n      var escapeNextChar = false;\n      var out = [];\n      for (var i = -1; i < str.length; i++) {\n        var c = str.charAt(i) || '';\n        var n = str.charAt(i+1) || '';\n        if (charUnescapes[c + n]) {\n          out.push(charUnescapes[c+n]);\n          i++;\n        } else if (escapeNextChar) {\n          // At any point in the loop, escapeNextChar is true if the previous\n          // character was a '\\' and was not escaped.\n          out.push(c);\n          escapeNextChar = false;\n        } else {\n          if (c === '\\\\') {\n            escapeNextChar = true;\n            if ((isNumber(n) || n === '$')) {\n              out.push('$');\n            } else if (n !== '/' && n !== '\\\\') {\n              out.push('\\\\');\n            }\n          } else {\n            if (c === '$') {\n              out.push('$');\n            }\n            out.push(c);\n            if (n === '/') {\n              out.push('\\\\');\n            }\n          }\n        }\n      }\n      return out.join('');\n    }\n\n    // Unescape \\ and / in the replace part, for PCRE mode.\n    var unescapes = {'\\\\/': '/', '\\\\\\\\': '\\\\', '\\\\n': '\\n', '\\\\r': '\\r', '\\\\t': '\\t', '\\\\&':'&'};\n    function unescapeRegexReplace(str) {\n      var stream = new CodeMirror.StringStream(str);\n      var output = [];\n      while (!stream.eol()) {\n        // Search for \\.\n        while (stream.peek() && stream.peek() != '\\\\') {\n          output.push(stream.next());\n        }\n        var matched = false;\n        for (var matcher in unescapes) {\n          if (stream.match(matcher, true)) {\n            matched = true;\n            output.push(unescapes[matcher]);\n            break;\n          }\n        }\n        if (!matched) {\n          // Don't change anything\n          output.push(stream.next());\n        }\n      }\n      return output.join('');\n    }\n\n    /**\n     * Extract the regular expression from the query and return a Regexp object.\n     * Returns null if the query is blank.\n     * If ignoreCase is passed in, the Regexp object will have the 'i' flag set.\n     * If smartCase is passed in, and the query contains upper case letters,\n     *   then ignoreCase is overridden, and the 'i' flag will not be set.\n     * If the query contains the /i in the flag part of the regular expression,\n     *   then both ignoreCase and smartCase are ignored, and 'i' will be passed\n     *   through to the Regex object.\n     */\n    function parseQuery(query, ignoreCase, smartCase) {\n      // First update the last search register\n      var lastSearchRegister = vimGlobalState.registerController.getRegister('/');\n      lastSearchRegister.setText(query);\n      // Check if the query is already a regex.\n      if (query instanceof RegExp) { return query; }\n      // First try to extract regex + flags from the input. If no flags found,\n      // extract just the regex. IE does not accept flags directly defined in\n      // the regex string in the form /regex/flags\n      var slashes = findUnescapedSlashes(query);\n      var regexPart;\n      var forceIgnoreCase;\n      if (!slashes.length) {\n        // Query looks like 'regexp'\n        regexPart = query;\n      } else {\n        // Query looks like 'regexp/...'\n        regexPart = query.substring(0, slashes[0]);\n        var flagsPart = query.substring(slashes[0]);\n        forceIgnoreCase = (flagsPart.indexOf('i') != -1);\n      }\n      if (!regexPart) {\n        return null;\n      }\n      if (!getOption('pcre')) {\n        regexPart = translateRegex(regexPart);\n      }\n      if (smartCase) {\n        ignoreCase = (/^[^A-Z]*$/).test(regexPart);\n      }\n      var regexp = new RegExp(regexPart,\n          (ignoreCase || forceIgnoreCase) ? 'im' : 'm');\n      return regexp;\n    }\n\n    /**\n     * dom - Document Object Manipulator\n     * Usage:\n     *   dom('<tag>'|<node>[, ...{<attributes>|<$styles>}|<child-node>|'<text>'])\n     * Examples:\n     *   dom('div', {id:'xyz'}, dom('p', 'CM rocks!', {$color:'red'}))\n     *   dom(document.head, dom('script', 'alert(\"hello!\")'))\n     * Not supported:\n     *   dom('p', ['arrays are objects'], Error('objects specify attributes'))\n     */\n    function dom(n) {\n      if (typeof n === 'string') n = document.createElement(n);\n      for (var a, i = 1; i < arguments.length; i++) {\n        if (!(a = arguments[i])) continue;\n        if (typeof a !== 'object') a = document.createTextNode(a);\n        if (a.nodeType) n.appendChild(a);\n        else for (var key in a) {\n          if (!Object.prototype.hasOwnProperty.call(a, key)) continue;\n          if (key[0] === '$') n.style[key.slice(1)] = a[key];\n          else n.setAttribute(key, a[key]);\n        }\n      }\n      return n;\n    }\n\n    function showConfirm(cm, template) {\n      var pre = dom('pre', {$color: 'red', class: 'cm-vim-message'}, template);\n      if (cm.openNotification) {\n        cm.openNotification(pre, {bottom: true, duration: 5000});\n      } else {\n        alert(pre.innerText);\n      }\n    }\n\n    function makePrompt(prefix, desc) {\n      return dom(document.createDocumentFragment(),\n               dom('span', {$fontFamily: 'monospace', $whiteSpace: 'pre'},\n                 prefix,\n                 dom('input', {type: 'text', autocorrect: 'off',\n                               autocapitalize: 'off', spellcheck: 'false'})),\n               desc && dom('span', {$color: '#888'}, desc));\n    }\n\n    function showPrompt(cm, options) {\n      var template = makePrompt(options.prefix, options.desc);\n      if (cm.openDialog) {\n        cm.openDialog(template, options.onClose, {\n          onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp,\n          bottom: true, selectValueOnOpen: false, value: options.value\n        });\n      }\n      else {\n        var shortText = '';\n        if (typeof options.prefix != \"string\" && options.prefix) shortText += options.prefix.textContent;\n        if (options.desc) shortText += \" \" + options.desc;\n        options.onClose(prompt(shortText, ''));\n      }\n    }\n\n    function regexEqual(r1, r2) {\n      if (r1 instanceof RegExp && r2 instanceof RegExp) {\n          var props = ['global', 'multiline', 'ignoreCase', 'source'];\n          for (var i = 0; i < props.length; i++) {\n              var prop = props[i];\n              if (r1[prop] !== r2[prop]) {\n                  return false;\n              }\n          }\n          return true;\n      }\n      return false;\n    }\n    // Returns true if the query is valid.\n    function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) {\n      if (!rawQuery) {\n        return;\n      }\n      var state = getSearchState(cm);\n      var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase);\n      if (!query) {\n        return;\n      }\n      highlightSearchMatches(cm, query);\n      if (regexEqual(query, state.getQuery())) {\n        return query;\n      }\n      state.setQuery(query);\n      return query;\n    }\n    function searchOverlay(query) {\n      if (query.source.charAt(0) == '^') {\n        var matchSol = true;\n      }\n      return {\n        token: function(stream) {\n          if (matchSol && !stream.sol()) {\n            stream.skipToEnd();\n            return;\n          }\n          var match = stream.match(query, false);\n          if (match) {\n            if (match[0].length == 0) {\n              // Matched empty string, skip to next.\n              stream.next();\n              return 'searching';\n            }\n            if (!stream.sol()) {\n              // Backtrack 1 to match \\b\n              stream.backUp(1);\n              if (!query.exec(stream.next() + match[0])) {\n                stream.next();\n                return null;\n              }\n            }\n            stream.match(query);\n            return 'searching';\n          }\n          while (!stream.eol()) {\n            stream.next();\n            if (stream.match(query, false)) break;\n          }\n        },\n        query: query\n      };\n    }\n    var highlightTimeout = 0;\n    function highlightSearchMatches(cm, query) {\n      clearTimeout(highlightTimeout);\n      highlightTimeout = setTimeout(function() {\n        if (!cm.state.vim) return;\n        var searchState = getSearchState(cm);\n        var overlay = searchState.getOverlay();\n        if (!overlay || query != overlay.query) {\n          if (overlay) {\n            cm.removeOverlay(overlay);\n          }\n          overlay = searchOverlay(query);\n          cm.addOverlay(overlay);\n          if (cm.showMatchesOnScrollbar) {\n            if (searchState.getScrollbarAnnotate()) {\n              searchState.getScrollbarAnnotate().clear();\n            }\n            searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query));\n          }\n          searchState.setOverlay(overlay);\n        }\n      }, 50);\n    }\n    function findNext(cm, prev, query, repeat) {\n      if (repeat === undefined) { repeat = 1; }\n      return cm.operation(function() {\n        var pos = cm.getCursor();\n        var cursor = cm.getSearchCursor(query, pos);\n        for (var i = 0; i < repeat; i++) {\n          var found = cursor.find(prev);\n          if (i == 0 && found && cursorEqual(cursor.from(), pos)) {\n            var lastEndPos = prev ? cursor.from() : cursor.to();\n            found = cursor.find(prev);\n            if (found && !found[0] && cursorEqual(cursor.from(), lastEndPos)) {\n              if (cm.getLine(lastEndPos.line).length == lastEndPos.ch)\n                found = cursor.find(prev);\n            }\n          }\n          if (!found) {\n            // SearchCursor may have returned null because it hit EOF, wrap\n            // around and try again.\n            cursor = cm.getSearchCursor(query,\n                (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) );\n            if (!cursor.find(prev)) {\n              return;\n            }\n          }\n        }\n        return cursor.from();\n      });\n    }\n    /**\n     * Pretty much the same as `findNext`, except for the following differences:\n     *\n     * 1. Before starting the search, move to the previous search. This way if our cursor is\n     * already inside a match, we should return the current match.\n     * 2. Rather than only returning the cursor's from, we return the cursor's from and to as a tuple.\n     */\n    function findNextFromAndToInclusive(cm, prev, query, repeat, vim) {\n      if (repeat === undefined) { repeat = 1; }\n      return cm.operation(function() {\n        var pos = cm.getCursor();\n        var cursor = cm.getSearchCursor(query, pos);\n\n        // Go back one result to ensure that if the cursor is currently a match, we keep it.\n        var found = cursor.find(!prev);\n\n        // If we haven't moved, go back one more (similar to if i==0 logic in findNext).\n        if (!vim.visualMode && found && cursorEqual(cursor.from(), pos)) {\n          cursor.find(!prev);\n        }\n\n        for (var i = 0; i < repeat; i++) {\n          found = cursor.find(prev);\n          if (!found) {\n            // SearchCursor may have returned null because it hit EOF, wrap\n            // around and try again.\n            cursor = cm.getSearchCursor(query,\n                (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) );\n            if (!cursor.find(prev)) {\n              return;\n            }\n          }\n        }\n        return [cursor.from(), cursor.to()];\n      });\n    }\n    function clearSearchHighlight(cm) {\n      var state = getSearchState(cm);\n      cm.removeOverlay(getSearchState(cm).getOverlay());\n      state.setOverlay(null);\n      if (state.getScrollbarAnnotate()) {\n        state.getScrollbarAnnotate().clear();\n        state.setScrollbarAnnotate(null);\n      }\n    }\n    /**\n     * Check if pos is in the specified range, INCLUSIVE.\n     * Range can be specified with 1 or 2 arguments.\n     * If the first range argument is an array, treat it as an array of line\n     * numbers. Match pos against any of the lines.\n     * If the first range argument is a number,\n     *   if there is only 1 range argument, check if pos has the same line\n     *       number\n     *   if there are 2 range arguments, then check if pos is in between the two\n     *       range arguments.\n     */\n    function isInRange(pos, start, end) {\n      if (typeof pos != 'number') {\n        // Assume it is a cursor position. Get the line number.\n        pos = pos.line;\n      }\n      if (start instanceof Array) {\n        return inArray(pos, start);\n      } else {\n        if (typeof end == 'number') {\n          return (pos >= start && pos <= end);\n        } else {\n          return pos == start;\n        }\n      }\n    }\n    function getUserVisibleLines(cm) {\n      var scrollInfo = cm.getScrollInfo();\n      var occludeToleranceTop = 6;\n      var occludeToleranceBottom = 10;\n      var from = cm.coordsChar({left:0, top: occludeToleranceTop + scrollInfo.top}, 'local');\n      var bottomY = scrollInfo.clientHeight - occludeToleranceBottom + scrollInfo.top;\n      var to = cm.coordsChar({left:0, top: bottomY}, 'local');\n      return {top: from.line, bottom: to.line};\n    }\n\n    function getMarkPos(cm, vim, markName) {\n      if (markName == '\\'' || markName == '`') {\n        return vimGlobalState.jumpList.find(cm, -1) || new Pos(0, 0);\n      } else if (markName == '.') {\n        return getLastEditPos(cm);\n      }\n\n      var mark = vim.marks[markName];\n      return mark && mark.find();\n    }\n\n    function getLastEditPos(cm) {\n      var done = cm.doc.history.done;\n      for (var i = done.length; i--;) {\n        if (done[i].changes) {\n          return copyCursor(done[i].changes[0].to);\n        }\n      }\n    }\n\n    var ExCommandDispatcher = function() {\n      this.buildCommandMap_();\n    };\n    ExCommandDispatcher.prototype = {\n      processCommand: function(cm, input, opt_params) {\n        var that = this;\n        cm.operation(function () {\n          cm.curOp.isVimOp = true;\n          that._processCommand(cm, input, opt_params);\n        });\n      },\n      _processCommand: function(cm, input, opt_params) {\n        var vim = cm.state.vim;\n        var commandHistoryRegister = vimGlobalState.registerController.getRegister(':');\n        var previousCommand = commandHistoryRegister.toString();\n        if (vim.visualMode) {\n          exitVisualMode(cm);\n        }\n        var inputStream = new CodeMirror.StringStream(input);\n        // update \": with the latest command whether valid or invalid\n        commandHistoryRegister.setText(input);\n        var params = opt_params || {};\n        params.input = input;\n        try {\n          this.parseInput_(cm, inputStream, params);\n        } catch(e) {\n          showConfirm(cm, e.toString());\n          throw e;\n        }\n        var command;\n        var commandName;\n        if (!params.commandName) {\n          // If only a line range is defined, move to the line.\n          if (params.line !== undefined) {\n            commandName = 'move';\n          }\n        } else {\n          command = this.matchCommand_(params.commandName);\n          if (command) {\n            commandName = command.name;\n            if (command.excludeFromCommandHistory) {\n              commandHistoryRegister.setText(previousCommand);\n            }\n            this.parseCommandArgs_(inputStream, params, command);\n            if (command.type == 'exToKey') {\n              // Handle Ex to Key mapping.\n              for (var i = 0; i < command.toKeys.length; i++) {\n                vimApi.handleKey(cm, command.toKeys[i], 'mapping');\n              }\n              return;\n            } else if (command.type == 'exToEx') {\n              // Handle Ex to Ex mapping.\n              this.processCommand(cm, command.toInput);\n              return;\n            }\n          }\n        }\n        if (!commandName) {\n          showConfirm(cm, 'Not an editor command \":' + input + '\"');\n          return;\n        }\n        try {\n          exCommands[commandName](cm, params);\n          // Possibly asynchronous commands (e.g. substitute, which might have a\n          // user confirmation), are responsible for calling the callback when\n          // done. All others have it taken care of for them here.\n          if ((!command || !command.possiblyAsync) && params.callback) {\n            params.callback();\n          }\n        } catch(e) {\n          showConfirm(cm, e.toString());\n          throw e;\n        }\n      },\n      parseInput_: function(cm, inputStream, result) {\n        inputStream.eatWhile(':');\n        // Parse range.\n        if (inputStream.eat('%')) {\n          result.line = cm.firstLine();\n          result.lineEnd = cm.lastLine();\n        } else {\n          result.line = this.parseLineSpec_(cm, inputStream);\n          if (result.line !== undefined && inputStream.eat(',')) {\n            result.lineEnd = this.parseLineSpec_(cm, inputStream);\n          }\n        }\n\n        // Parse command name.\n        var commandMatch = inputStream.match(/^(\\w+|!!|@@|[!#&*<=>@~])/);\n        if (commandMatch) {\n          result.commandName = commandMatch[1];\n        } else {\n          result.commandName = inputStream.match(/.*/)[0];\n        }\n\n        return result;\n      },\n      parseLineSpec_: function(cm, inputStream) {\n        var numberMatch = inputStream.match(/^(\\d+)/);\n        if (numberMatch) {\n          // Absolute line number plus offset (N+M or N-M) is probably a typo,\n          // not something the user actually wanted. (NB: vim does allow this.)\n          return parseInt(numberMatch[1], 10) - 1;\n        }\n        switch (inputStream.next()) {\n          case '.':\n            return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);\n          case '$':\n            return this.parseLineSpecOffset_(inputStream, cm.lastLine());\n          case '\\'':\n            var markName = inputStream.next();\n            var markPos = getMarkPos(cm, cm.state.vim, markName);\n            if (!markPos) throw new Error('Mark not set');\n            return this.parseLineSpecOffset_(inputStream, markPos.line);\n          case '-':\n          case '+':\n            inputStream.backUp(1);\n            // Offset is relative to current line if not otherwise specified.\n            return this.parseLineSpecOffset_(inputStream, cm.getCursor().line);\n          default:\n            inputStream.backUp(1);\n            return undefined;\n        }\n      },\n      parseLineSpecOffset_: function(inputStream, line) {\n        var offsetMatch = inputStream.match(/^([+-])?(\\d+)/);\n        if (offsetMatch) {\n          var offset = parseInt(offsetMatch[2], 10);\n          if (offsetMatch[1] == \"-\") {\n            line -= offset;\n          } else {\n            line += offset;\n          }\n        }\n        return line;\n      },\n      parseCommandArgs_: function(inputStream, params, command) {\n        if (inputStream.eol()) {\n          return;\n        }\n        params.argString = inputStream.match(/.*/)[0];\n        // Parse command-line arguments\n        var delim = command.argDelimiter || /\\s+/;\n        var args = trim(params.argString).split(delim);\n        if (args.length && args[0]) {\n          params.args = args;\n        }\n      },\n      matchCommand_: function(commandName) {\n        // Return the command in the command map that matches the shortest\n        // prefix of the passed in command name. The match is guaranteed to be\n        // unambiguous if the defaultExCommandMap's shortNames are set up\n        // correctly. (see @code{defaultExCommandMap}).\n        for (var i = commandName.length; i > 0; i--) {\n          var prefix = commandName.substring(0, i);\n          if (this.commandMap_[prefix]) {\n            var command = this.commandMap_[prefix];\n            if (command.name.indexOf(commandName) === 0) {\n              return command;\n            }\n          }\n        }\n        return null;\n      },\n      buildCommandMap_: function() {\n        this.commandMap_ = {};\n        for (var i = 0; i < defaultExCommandMap.length; i++) {\n          var command = defaultExCommandMap[i];\n          var key = command.shortName || command.name;\n          this.commandMap_[key] = command;\n        }\n      },\n      map: function(lhs, rhs, ctx) {\n        if (lhs != ':' && lhs.charAt(0) == ':') {\n          if (ctx) { throw Error('Mode not supported for ex mappings'); }\n          var commandName = lhs.substring(1);\n          if (rhs != ':' && rhs.charAt(0) == ':') {\n            // Ex to Ex mapping\n            this.commandMap_[commandName] = {\n              name: commandName,\n              type: 'exToEx',\n              toInput: rhs.substring(1),\n              user: true\n            };\n          } else {\n            // Ex to key mapping\n            this.commandMap_[commandName] = {\n              name: commandName,\n              type: 'exToKey',\n              toKeys: rhs,\n              user: true\n            };\n          }\n        } else {\n          if (rhs != ':' && rhs.charAt(0) == ':') {\n            // Key to Ex mapping.\n            var mapping = {\n              keys: lhs,\n              type: 'keyToEx',\n              exArgs: { input: rhs.substring(1) }\n            };\n            if (ctx) { mapping.context = ctx; }\n            defaultKeymap.unshift(mapping);\n          } else {\n            // Key to key mapping\n            var mapping = {\n              keys: lhs,\n              type: 'keyToKey',\n              toKeys: rhs\n            };\n            if (ctx) { mapping.context = ctx; }\n            defaultKeymap.unshift(mapping);\n          }\n        }\n      },\n      unmap: function(lhs, ctx) {\n        if (lhs != ':' && lhs.charAt(0) == ':') {\n          // Ex to Ex or Ex to key mapping\n          if (ctx) { throw Error('Mode not supported for ex mappings'); }\n          var commandName = lhs.substring(1);\n          if (this.commandMap_[commandName] && this.commandMap_[commandName].user) {\n            delete this.commandMap_[commandName];\n            return true;\n          }\n        } else {\n          // Key to Ex or key to key mapping\n          var keys = lhs;\n          for (var i = 0; i < defaultKeymap.length; i++) {\n            if (keys == defaultKeymap[i].keys\n                && defaultKeymap[i].context === ctx) {\n              defaultKeymap.splice(i, 1);\n              return true;\n            }\n          }\n        }\n      }\n    };\n\n    var exCommands = {\n      colorscheme: function(cm, params) {\n        if (!params.args || params.args.length < 1) {\n          showConfirm(cm, cm.getOption('theme'));\n          return;\n        }\n        cm.setOption('theme', params.args[0]);\n      },\n      map: function(cm, params, ctx) {\n        var mapArgs = params.args;\n        if (!mapArgs || mapArgs.length < 2) {\n          if (cm) {\n            showConfirm(cm, 'Invalid mapping: ' + params.input);\n          }\n          return;\n        }\n        exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx);\n      },\n      imap: function(cm, params) { this.map(cm, params, 'insert'); },\n      nmap: function(cm, params) { this.map(cm, params, 'normal'); },\n      vmap: function(cm, params) { this.map(cm, params, 'visual'); },\n      unmap: function(cm, params, ctx) {\n        var mapArgs = params.args;\n        if (!mapArgs || mapArgs.length < 1 || !exCommandDispatcher.unmap(mapArgs[0], ctx)) {\n          if (cm) {\n            showConfirm(cm, 'No such mapping: ' + params.input);\n          }\n        }\n      },\n      move: function(cm, params) {\n        commandDispatcher.processCommand(cm, cm.state.vim, {\n            type: 'motion',\n            motion: 'moveToLineOrEdgeOfDocument',\n            motionArgs: { forward: false, explicitRepeat: true,\n              linewise: true },\n            repeatOverride: params.line+1});\n      },\n      set: function(cm, params) {\n        var setArgs = params.args;\n        // Options passed through to the setOption/getOption calls. May be passed in by the\n        // local/global versions of the set command\n        var setCfg = params.setCfg || {};\n        if (!setArgs || setArgs.length < 1) {\n          if (cm) {\n            showConfirm(cm, 'Invalid mapping: ' + params.input);\n          }\n          return;\n        }\n        var expr = setArgs[0].split('=');\n        var optionName = expr[0];\n        var value = expr[1];\n        var forceGet = false;\n\n        if (optionName.charAt(optionName.length - 1) == '?') {\n          // If post-fixed with ?, then the set is actually a get.\n          if (value) { throw Error('Trailing characters: ' + params.argString); }\n          optionName = optionName.substring(0, optionName.length - 1);\n          forceGet = true;\n        }\n        if (value === undefined && optionName.substring(0, 2) == 'no') {\n          // To set boolean options to false, the option name is prefixed with\n          // 'no'.\n          optionName = optionName.substring(2);\n          value = false;\n        }\n\n        var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean';\n        if (optionIsBoolean && value == undefined) {\n          // Calling set with a boolean option sets it to true.\n          value = true;\n        }\n        // If no value is provided, then we assume this is a get.\n        if (!optionIsBoolean && value === undefined || forceGet) {\n          var oldValue = getOption(optionName, cm, setCfg);\n          if (oldValue instanceof Error) {\n            showConfirm(cm, oldValue.message);\n          } else if (oldValue === true || oldValue === false) {\n            showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName);\n          } else {\n            showConfirm(cm, '  ' + optionName + '=' + oldValue);\n          }\n        } else {\n          var setOptionReturn = setOption(optionName, value, cm, setCfg);\n          if (setOptionReturn instanceof Error) {\n            showConfirm(cm, setOptionReturn.message);\n          }\n        }\n      },\n      setlocal: function (cm, params) {\n        // setCfg is passed through to setOption\n        params.setCfg = {scope: 'local'};\n        this.set(cm, params);\n      },\n      setglobal: function (cm, params) {\n        // setCfg is passed through to setOption\n        params.setCfg = {scope: 'global'};\n        this.set(cm, params);\n      },\n      registers: function(cm, params) {\n        var regArgs = params.args;\n        var registers = vimGlobalState.registerController.registers;\n        var regInfo = '----------Registers----------\\n\\n';\n        if (!regArgs) {\n          for (var registerName in registers) {\n            var text = registers[registerName].toString();\n            if (text.length) {\n              regInfo += '\"' + registerName + '    ' + text + '\\n'\n            }\n          }\n        } else {\n          var registerName;\n          regArgs = regArgs.join('');\n          for (var i = 0; i < regArgs.length; i++) {\n            registerName = regArgs.charAt(i);\n            if (!vimGlobalState.registerController.isValidRegister(registerName)) {\n              continue;\n            }\n            var register = registers[registerName] || new Register();\n            regInfo += '\"' + registerName + '    ' + register.toString() + '\\n'\n          }\n        }\n        showConfirm(cm, regInfo);\n      },\n      sort: function(cm, params) {\n        var reverse, ignoreCase, unique, number, pattern;\n        function parseArgs() {\n          if (params.argString) {\n            var args = new CodeMirror.StringStream(params.argString);\n            if (args.eat('!')) { reverse = true; }\n            if (args.eol()) { return; }\n            if (!args.eatSpace()) { return 'Invalid arguments'; }\n            var opts = args.match(/([dinuox]+)?\\s*(\\/.+\\/)?\\s*/);\n            if (!opts && !args.eol()) { return 'Invalid arguments'; }\n            if (opts[1]) {\n              ignoreCase = opts[1].indexOf('i') != -1;\n              unique = opts[1].indexOf('u') != -1;\n              var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1;\n              var hex = opts[1].indexOf('x') != -1 && 1;\n              var octal = opts[1].indexOf('o') != -1 && 1;\n              if (decimal + hex + octal > 1) { return 'Invalid arguments'; }\n              number = decimal && 'decimal' || hex && 'hex' || octal && 'octal';\n            }\n            if (opts[2]) {\n              pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : '');\n            }\n          }\n        }\n        var err = parseArgs();\n        if (err) {\n          showConfirm(cm, err + ': ' + params.argString);\n          return;\n        }\n        var lineStart = params.line || cm.firstLine();\n        var lineEnd = params.lineEnd || params.line || cm.lastLine();\n        if (lineStart == lineEnd) { return; }\n        var curStart = new Pos(lineStart, 0);\n        var curEnd = new Pos(lineEnd, lineLength(cm, lineEnd));\n        var text = cm.getRange(curStart, curEnd).split('\\n');\n        var numberRegex = pattern ? pattern :\n           (number == 'decimal') ? /(-?)([\\d]+)/ :\n           (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i :\n           (number == 'octal') ? /([0-7]+)/ : null;\n        var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null;\n        var numPart = [], textPart = [];\n        if (number || pattern) {\n          for (var i = 0; i < text.length; i++) {\n            var matchPart = pattern ? text[i].match(pattern) : null;\n            if (matchPart && matchPart[0] != '') {\n              numPart.push(matchPart);\n            } else if (!pattern && numberRegex.exec(text[i])) {\n              numPart.push(text[i]);\n            } else {\n              textPart.push(text[i]);\n            }\n          }\n        } else {\n          textPart = text;\n        }\n        function compareFn(a, b) {\n          if (reverse) { var tmp; tmp = a; a = b; b = tmp; }\n          if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); }\n          var anum = number && numberRegex.exec(a);\n          var bnum = number && numberRegex.exec(b);\n          if (!anum) { return a < b ? -1 : 1; }\n          anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix);\n          bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix);\n          return anum - bnum;\n        }\n        function comparePatternFn(a, b) {\n          if (reverse) { var tmp; tmp = a; a = b; b = tmp; }\n          if (ignoreCase) { a[0] = a[0].toLowerCase(); b[0] = b[0].toLowerCase(); }\n          return (a[0] < b[0]) ? -1 : 1;\n        }\n        numPart.sort(pattern ? comparePatternFn : compareFn);\n        if (pattern) {\n          for (var i = 0; i < numPart.length; i++) {\n            numPart[i] = numPart[i].input;\n          }\n        } else if (!number) { textPart.sort(compareFn); }\n        text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart);\n        if (unique) { // Remove duplicate lines\n          var textOld = text;\n          var lastLine;\n          text = [];\n          for (var i = 0; i < textOld.length; i++) {\n            if (textOld[i] != lastLine) {\n              text.push(textOld[i]);\n            }\n            lastLine = textOld[i];\n          }\n        }\n        cm.replaceRange(text.join('\\n'), curStart, curEnd);\n      },\n      vglobal: function(cm, params) {\n        // global inspects params.commandName\n        this.global(cm, params);\n      },\n      global: function(cm, params) {\n        // a global command is of the form\n        // :[range]g/pattern/[cmd]\n        // argString holds the string /pattern/[cmd]\n        var argString = params.argString;\n        if (!argString) {\n          showConfirm(cm, 'Regular Expression missing from global');\n          return;\n        }\n        var inverted = params.commandName[0] === 'v';\n        // range is specified here\n        var lineStart = (params.line !== undefined) ? params.line : cm.firstLine();\n        var lineEnd = params.lineEnd || params.line || cm.lastLine();\n        // get the tokens from argString\n        var tokens = splitBySlash(argString);\n        var regexPart = argString, cmd;\n        if (tokens.length) {\n          regexPart = tokens[0];\n          cmd = tokens.slice(1, tokens.length).join('/');\n        }\n        if (regexPart) {\n          // If regex part is empty, then use the previous query. Otherwise\n          // use the regex part as the new query.\n          try {\n           updateSearchQuery(cm, regexPart, true /** ignoreCase */,\n             true /** smartCase */);\n          } catch (e) {\n           showConfirm(cm, 'Invalid regex: ' + regexPart);\n           return;\n          }\n        }\n        // now that we have the regexPart, search for regex matches in the\n        // specified range of lines\n        var query = getSearchState(cm).getQuery();\n        var matchedLines = [];\n        for (var i = lineStart; i <= lineEnd; i++) {\n          var line = cm.getLineHandle(i);\n          var matched = query.test(line.text);\n          if (matched !== inverted) {\n            matchedLines.push(cmd ? line : line.text);\n          }\n        }\n        // if there is no [cmd], just display the list of matched lines\n        if (!cmd) {\n          showConfirm(cm, matchedLines.join('\\n'));\n          return;\n        }\n        var index = 0;\n        var nextCommand = function() {\n          if (index < matchedLines.length) {\n            var line = matchedLines[index++];\n            var lineNum = cm.getLineNumber(line);\n            if (lineNum == null) {\n              nextCommand();\n              return;\n            }\n            var command = (lineNum + 1) + cmd;\n            exCommandDispatcher.processCommand(cm, command, {\n              callback: nextCommand\n            });\n          }\n        };\n        nextCommand();\n      },\n      substitute: function(cm, params) {\n        if (!cm.getSearchCursor) {\n          throw new Error('Search feature not available. Requires searchcursor.js or ' +\n              'any other getSearchCursor implementation.');\n        }\n        var argString = params.argString;\n        var tokens = argString ? splitBySeparator(argString, argString[0]) : [];\n        var regexPart, replacePart = '', trailing, flagsPart, count;\n        var confirm = false; // Whether to confirm each replace.\n        var global = false; // True to replace all instances on a line, false to replace only 1.\n        if (tokens.length) {\n          regexPart = tokens[0];\n          if (getOption('pcre') && regexPart !== '') {\n              regexPart = new RegExp(regexPart).source; //normalize not escaped characters\n          }\n          replacePart = tokens[1];\n          if (replacePart !== undefined) {\n            if (getOption('pcre')) {\n              replacePart = unescapeRegexReplace(replacePart.replace(/([^\\\\])&/g,\"$1$$&\"));\n            } else {\n              replacePart = translateRegexReplace(replacePart);\n            }\n            vimGlobalState.lastSubstituteReplacePart = replacePart;\n          }\n          trailing = tokens[2] ? tokens[2].split(' ') : [];\n        } else {\n          // either the argString is empty or its of the form ' hello/world'\n          // actually splitBySlash returns a list of tokens\n          // only if the string starts with a '/'\n          if (argString && argString.length) {\n            showConfirm(cm, 'Substitutions should be of the form ' +\n                ':s/pattern/replace/');\n            return;\n          }\n        }\n        // After the 3rd slash, we can have flags followed by a space followed\n        // by count.\n        if (trailing) {\n          flagsPart = trailing[0];\n          count = parseInt(trailing[1]);\n          if (flagsPart) {\n            if (flagsPart.indexOf('c') != -1) {\n              confirm = true;\n            }\n            if (flagsPart.indexOf('g') != -1) {\n              global = true;\n            }\n            if (getOption('pcre')) {\n               regexPart = regexPart + '/' + flagsPart;\n            } else {\n               regexPart = regexPart.replace(/\\//g, \"\\\\/\") + '/' + flagsPart;\n            }\n          }\n        }\n        if (regexPart) {\n          // If regex part is empty, then use the previous query. Otherwise use\n          // the regex part as the new query.\n          try {\n            updateSearchQuery(cm, regexPart, true /** ignoreCase */,\n              true /** smartCase */);\n          } catch (e) {\n            showConfirm(cm, 'Invalid regex: ' + regexPart);\n            return;\n          }\n        }\n        replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart;\n        if (replacePart === undefined) {\n          showConfirm(cm, 'No previous substitute regular expression');\n          return;\n        }\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n        var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line;\n        var lineEnd = params.lineEnd || lineStart;\n        if (lineStart == cm.firstLine() && lineEnd == cm.lastLine()) {\n          lineEnd = Infinity;\n        }\n        if (count) {\n          lineStart = lineEnd;\n          lineEnd = lineStart + count - 1;\n        }\n        var startPos = clipCursorToContent(cm, new Pos(lineStart, 0));\n        var cursor = cm.getSearchCursor(query, startPos);\n        doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback);\n      },\n      redo: CodeMirror.commands.redo,\n      undo: CodeMirror.commands.undo,\n      write: function(cm) {\n        if (CodeMirror.commands.save) {\n          // If a save command is defined, call it.\n          CodeMirror.commands.save(cm);\n        } else if (cm.save) {\n          // Saves to text area if no save command is defined and cm.save() is available.\n          cm.save();\n        }\n      },\n      nohlsearch: function(cm) {\n        clearSearchHighlight(cm);\n      },\n      yank: function (cm) {\n        var cur = copyCursor(cm.getCursor());\n        var line = cur.line;\n        var lineText = cm.getLine(line);\n        vimGlobalState.registerController.pushText(\n          '0', 'yank', lineText, true, true);\n      },\n      delmarks: function(cm, params) {\n        if (!params.argString || !trim(params.argString)) {\n          showConfirm(cm, 'Argument required');\n          return;\n        }\n\n        var state = cm.state.vim;\n        var stream = new CodeMirror.StringStream(trim(params.argString));\n        while (!stream.eol()) {\n          stream.eatSpace();\n\n          // Record the streams position at the beginning of the loop for use\n          // in error messages.\n          var count = stream.pos;\n\n          if (!stream.match(/[a-zA-Z]/, false)) {\n            showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n            return;\n          }\n\n          var sym = stream.next();\n          // Check if this symbol is part of a range\n          if (stream.match('-', true)) {\n            // This symbol is part of a range.\n\n            // The range must terminate at an alphabetic character.\n            if (!stream.match(/[a-zA-Z]/, false)) {\n              showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n              return;\n            }\n\n            var startMark = sym;\n            var finishMark = stream.next();\n            // The range must terminate at an alphabetic character which\n            // shares the same case as the start of the range.\n            if (isLowerCase(startMark) && isLowerCase(finishMark) ||\n                isUpperCase(startMark) && isUpperCase(finishMark)) {\n              var start = startMark.charCodeAt(0);\n              var finish = finishMark.charCodeAt(0);\n              if (start >= finish) {\n                showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n                return;\n              }\n\n              // Because marks are always ASCII values, and we have\n              // determined that they are the same case, we can use\n              // their char codes to iterate through the defined range.\n              for (var j = 0; j <= finish - start; j++) {\n                var mark = String.fromCharCode(start + j);\n                delete state.marks[mark];\n              }\n            } else {\n              showConfirm(cm, 'Invalid argument: ' + startMark + '-');\n              return;\n            }\n          } else {\n            // This symbol is a valid mark, and is not part of a range.\n            delete state.marks[sym];\n          }\n        }\n      }\n    };\n\n    var exCommandDispatcher = new ExCommandDispatcher();\n\n    /**\n    * @param {CodeMirror} cm CodeMirror instance we are in.\n    * @param {boolean} confirm Whether to confirm each replace.\n    * @param {Cursor} lineStart Line to start replacing from.\n    * @param {Cursor} lineEnd Line to stop replacing at.\n    * @param {RegExp} query Query for performing matches with.\n    * @param {string} replaceWith Text to replace matches with. May contain $1,\n    *     $2, etc for replacing captured groups using JavaScript replace.\n    * @param {function()} callback A callback for when the replace is done.\n    */\n    function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query,\n        replaceWith, callback) {\n      // Set up all the functions.\n      cm.state.vim.exMode = true;\n      var done = false;\n      var lastPos, modifiedLineNumber, joined;\n      function replaceAll() {\n        cm.operation(function() {\n          while (!done) {\n            replace();\n            next();\n          }\n          stop();\n        });\n      }\n      function replace() {\n        var text = cm.getRange(searchCursor.from(), searchCursor.to());\n        var newText = text.replace(query, replaceWith);\n        var unmodifiedLineNumber = searchCursor.to().line;\n        searchCursor.replace(newText);\n        modifiedLineNumber = searchCursor.to().line;\n        lineEnd += modifiedLineNumber - unmodifiedLineNumber;\n        joined = modifiedLineNumber < unmodifiedLineNumber;\n      }\n      function findNextValidMatch() {\n        var lastMatchTo = lastPos && copyCursor(searchCursor.to());\n        var match = searchCursor.findNext();\n        if (match && !match[0] && lastMatchTo && cursorEqual(searchCursor.from(), lastMatchTo)) {\n          match = searchCursor.findNext();\n        }\n        return match;\n      }\n      function next() {\n        // The below only loops to skip over multiple occurrences on the same\n        // line when 'global' is not true.\n        while(findNextValidMatch() &&\n              isInRange(searchCursor.from(), lineStart, lineEnd)) {\n          if (!global && searchCursor.from().line == modifiedLineNumber && !joined) {\n            continue;\n          }\n          cm.scrollIntoView(searchCursor.from(), 30);\n          cm.setSelection(searchCursor.from(), searchCursor.to());\n          lastPos = searchCursor.from();\n          done = false;\n          return;\n        }\n        done = true;\n      }\n      function stop(close) {\n        if (close) { close(); }\n        cm.focus();\n        if (lastPos) {\n          cm.setCursor(lastPos);\n          var vim = cm.state.vim;\n          vim.exMode = false;\n          vim.lastHPos = vim.lastHSPos = lastPos.ch;\n        }\n        if (callback) { callback(); }\n      }\n      function onPromptKeyDown(e, _value, close) {\n        // Swallow all keys.\n        CodeMirror.e_stop(e);\n        var keyName = CodeMirror.keyName(e);\n        switch (keyName) {\n          case 'Y':\n            replace(); next(); break;\n          case 'N':\n            next(); break;\n          case 'A':\n            // replaceAll contains a call to close of its own. We don't want it\n            // to fire too early or multiple times.\n            var savedCallback = callback;\n            callback = undefined;\n            cm.operation(replaceAll);\n            callback = savedCallback;\n            break;\n          case 'L':\n            replace();\n            // fall through and exit.\n          case 'Q':\n          case 'Esc':\n          case 'Ctrl-C':\n          case 'Ctrl-[':\n            stop(close);\n            break;\n        }\n        if (done) { stop(close); }\n        return true;\n      }\n\n      // Actually do replace.\n      next();\n      if (done) {\n        showConfirm(cm, 'No matches for ' + query.source);\n        return;\n      }\n      if (!confirm) {\n        replaceAll();\n        if (callback) { callback(); }\n        return;\n      }\n      showPrompt(cm, {\n        prefix: dom('span', 'replace with ', dom('strong', replaceWith), ' (y/n/a/q/l)'),\n        onKeyDown: onPromptKeyDown\n      });\n    }\n\n    CodeMirror.keyMap.vim = {\n      attach: attachVimMap,\n      detach: detachVimMap,\n      call: cmKey\n    };\n\n    function exitInsertMode(cm) {\n      var vim = cm.state.vim;\n      var macroModeState = vimGlobalState.macroModeState;\n      var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.');\n      var isPlaying = macroModeState.isPlaying;\n      var lastChange = macroModeState.lastInsertModeChanges;\n      if (!isPlaying) {\n        cm.off('change', onChange);\n        CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n      }\n      if (!isPlaying && vim.insertModeRepeat > 1) {\n        // Perform insert mode repeat for commands like 3,a and 3,o.\n        repeatLastEdit(cm, vim, vim.insertModeRepeat - 1,\n            true /** repeatForInsert */);\n        vim.lastEditInputState.repeatOverride = vim.insertModeRepeat;\n      }\n      delete vim.insertModeRepeat;\n      vim.insertMode = false;\n      cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1);\n      cm.setOption('keyMap', 'vim');\n      cm.setOption('disableInput', true);\n      cm.toggleOverwrite(false); // exit replace mode if we were in it.\n      // update the \". register before exiting insert mode\n      insertModeChangeRegister.setText(lastChange.changes.join(''));\n      CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n      if (macroModeState.isRecording) {\n        logInsertModeChange(macroModeState);\n      }\n    }\n\n    function _mapCommand(command) {\n      defaultKeymap.unshift(command);\n    }\n\n    function mapCommand(keys, type, name, args, extra) {\n      var command = {keys: keys, type: type};\n      command[type] = name;\n      command[type + \"Args\"] = args;\n      for (var key in extra)\n        command[key] = extra[key];\n      _mapCommand(command);\n    }\n\n    // The timeout in milliseconds for the two-character ESC keymap should be\n    // adjusted according to your typing speed to prevent false positives.\n    defineOption('insertModeEscKeysTimeout', 200, 'number');\n\n    CodeMirror.keyMap['vim-insert'] = {\n      // TODO: override navigation keys so that Esc will cancel automatic\n      // indentation from o, O, i_<CR>\n      fallthrough: ['default'],\n      attach: attachVimMap,\n      detach: detachVimMap,\n      call: cmKey\n    };\n\n    CodeMirror.keyMap['vim-replace'] = {\n      'Backspace': 'goCharLeft',\n      fallthrough: ['vim-insert'],\n      attach: attachVimMap,\n      detach: detachVimMap,\n      call: cmKey\n    };\n\n    function executeMacroRegister(cm, vim, macroModeState, registerName) {\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (registerName == ':') {\n        // Read-only register containing last Ex command.\n        if (register.keyBuffer[0]) {\n          exCommandDispatcher.processCommand(cm, register.keyBuffer[0]);\n        }\n        macroModeState.isPlaying = false;\n        return;\n      }\n      var keyBuffer = register.keyBuffer;\n      var imc = 0;\n      macroModeState.isPlaying = true;\n      macroModeState.replaySearchQueries = register.searchQueries.slice(0);\n      for (var i = 0; i < keyBuffer.length; i++) {\n        var text = keyBuffer[i];\n        var match, key;\n        while (text) {\n          // Pull off one command key, which is either a single character\n          // or a special sequence wrapped in '<' and '>', e.g. '<Space>'.\n          match = (/<\\w+-.+?>|<\\w+>|./).exec(text);\n          key = match[0];\n          text = text.substring(match.index + key.length);\n          vimApi.handleKey(cm, key, 'macro');\n          if (vim.insertMode) {\n            var changes = register.insertModeChanges[imc++].changes;\n            vimGlobalState.macroModeState.lastInsertModeChanges.changes =\n                changes;\n            repeatInsertModeChanges(cm, changes, 1);\n            exitInsertMode(cm);\n          }\n        }\n      }\n      macroModeState.isPlaying = false;\n    }\n\n    function logKey(macroModeState, key) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register) {\n        register.pushText(key);\n      }\n    }\n\n    function logInsertModeChange(macroModeState) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register && register.pushInsertModeChanges) {\n        register.pushInsertModeChanges(macroModeState.lastInsertModeChanges);\n      }\n    }\n\n    function logSearchQuery(macroModeState, query) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register && register.pushSearchQuery) {\n        register.pushSearchQuery(query);\n      }\n    }\n\n    /**\n     * Listens for changes made in insert mode.\n     * Should only be active in insert mode.\n     */\n    function onChange(cm, changeObj) {\n      var macroModeState = vimGlobalState.macroModeState;\n      var lastChange = macroModeState.lastInsertModeChanges;\n      if (!macroModeState.isPlaying) {\n        while(changeObj) {\n          lastChange.expectCursorActivityForChange = true;\n          if (lastChange.ignoreCount > 1) {\n            lastChange.ignoreCount--;\n          } else if (changeObj.origin == '+input' || changeObj.origin == 'paste'\n              || changeObj.origin === undefined /* only in testing */) {\n            var selectionCount = cm.listSelections().length;\n            if (selectionCount > 1)\n              lastChange.ignoreCount = selectionCount;\n            var text = changeObj.text.join('\\n');\n            if (lastChange.maybeReset) {\n              lastChange.changes = [];\n              lastChange.maybeReset = false;\n            }\n            if (text) {\n              if (cm.state.overwrite && !/\\n/.test(text)) {\n                lastChange.changes.push([text]);\n              } else {\n                lastChange.changes.push(text);\n              }\n            }\n          }\n          // Change objects may be chained with next.\n          changeObj = changeObj.next;\n        }\n      }\n    }\n\n    /**\n    * Listens for any kind of cursor activity on CodeMirror.\n    */\n    function onCursorActivity(cm) {\n      var vim = cm.state.vim;\n      if (vim.insertMode) {\n        // Tracking cursor activity in insert mode (for macro support).\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.isPlaying) { return; }\n        var lastChange = macroModeState.lastInsertModeChanges;\n        if (lastChange.expectCursorActivityForChange) {\n          lastChange.expectCursorActivityForChange = false;\n        } else {\n          // Cursor moved outside the context of an edit. Reset the change.\n          lastChange.maybeReset = true;\n        }\n      } else if (!cm.curOp.isVimOp) {\n        handleExternalSelection(cm, vim);\n      }\n    }\n    function handleExternalSelection(cm, vim) {\n      var anchor = cm.getCursor('anchor');\n      var head = cm.getCursor('head');\n      // Enter or exit visual mode to match mouse selection.\n      if (vim.visualMode && !cm.somethingSelected()) {\n        exitVisualMode(cm, false);\n      } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) {\n        vim.visualMode = true;\n        vim.visualLine = false;\n        CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\"});\n      }\n      if (vim.visualMode) {\n        // Bind CodeMirror selection model to vim selection model.\n        // Mouse selections are considered visual characterwise.\n        var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0;\n        var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0;\n        head = offsetCursor(head, 0, headOffset);\n        anchor = offsetCursor(anchor, 0, anchorOffset);\n        vim.sel = {\n          anchor: anchor,\n          head: head\n        };\n        updateMark(cm, vim, '<', cursorMin(head, anchor));\n        updateMark(cm, vim, '>', cursorMax(head, anchor));\n      } else if (!vim.insertMode) {\n        // Reset lastHPos if selection was modified by something outside of vim mode e.g. by mouse.\n        vim.lastHPos = cm.getCursor().ch;\n      }\n    }\n\n    /** Wrapper for special keys pressed in insert mode */\n    function InsertModeKey(keyName) {\n      this.keyName = keyName;\n    }\n\n    /**\n    * Handles raw key down events from the text area.\n    * - Should only be active in insert mode.\n    * - For recording deletes in insert mode.\n    */\n    function onKeyEventTargetKeyDown(e) {\n      var macroModeState = vimGlobalState.macroModeState;\n      var lastChange = macroModeState.lastInsertModeChanges;\n      var keyName = CodeMirror.keyName(e);\n      if (!keyName) { return; }\n      function onKeyFound() {\n        if (lastChange.maybeReset) {\n          lastChange.changes = [];\n          lastChange.maybeReset = false;\n        }\n        lastChange.changes.push(new InsertModeKey(keyName));\n        return true;\n      }\n      if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) {\n        CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound);\n      }\n    }\n\n    /**\n     * Repeats the last edit, which includes exactly 1 command and at most 1\n     * insert. Operator and motion commands are read from lastEditInputState,\n     * while action commands are read from lastEditActionCommand.\n     *\n     * If repeatForInsert is true, then the function was called by\n     * exitInsertMode to repeat the insert mode changes the user just made. The\n     * corresponding enterInsertMode call was made with a count.\n     */\n    function repeatLastEdit(cm, vim, repeat, repeatForInsert) {\n      var macroModeState = vimGlobalState.macroModeState;\n      macroModeState.isPlaying = true;\n      var isAction = !!vim.lastEditActionCommand;\n      var cachedInputState = vim.inputState;\n      function repeatCommand() {\n        if (isAction) {\n          commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand);\n        } else {\n          commandDispatcher.evalInput(cm, vim);\n        }\n      }\n      function repeatInsert(repeat) {\n        if (macroModeState.lastInsertModeChanges.changes.length > 0) {\n          // For some reason, repeat cw in desktop VIM does not repeat\n          // insert mode changes. Will conform to that behavior.\n          repeat = !vim.lastEditActionCommand ? 1 : repeat;\n          var changeObject = macroModeState.lastInsertModeChanges;\n          repeatInsertModeChanges(cm, changeObject.changes, repeat);\n        }\n      }\n      vim.inputState = vim.lastEditInputState;\n      if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) {\n        // o and O repeat have to be interlaced with insert repeats so that the\n        // insertions appear on separate lines instead of the last line.\n        for (var i = 0; i < repeat; i++) {\n          repeatCommand();\n          repeatInsert(1);\n        }\n      } else {\n        if (!repeatForInsert) {\n          // Hack to get the cursor to end up at the right place. If I is\n          // repeated in insert mode repeat, cursor will be 1 insert\n          // change set left of where it should be.\n          repeatCommand();\n        }\n        repeatInsert(repeat);\n      }\n      vim.inputState = cachedInputState;\n      if (vim.insertMode && !repeatForInsert) {\n        // Don't exit insert mode twice. If repeatForInsert is set, then we\n        // were called by an exitInsertMode call lower on the stack.\n        exitInsertMode(cm);\n      }\n      macroModeState.isPlaying = false;\n    }\n\n    function repeatInsertModeChanges(cm, changes, repeat) {\n      function keyHandler(binding) {\n        if (typeof binding == 'string') {\n          CodeMirror.commands[binding](cm);\n        } else {\n          binding(cm);\n        }\n        return true;\n      }\n      var head = cm.getCursor('head');\n      var visualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.visualBlock;\n      if (visualBlock) {\n        // Set up block selection again for repeating the changes.\n        selectForInsert(cm, head, visualBlock + 1);\n        repeat = cm.listSelections().length;\n        cm.setCursor(head);\n      }\n      for (var i = 0; i < repeat; i++) {\n        if (visualBlock) {\n          cm.setCursor(offsetCursor(head, i, 0));\n        }\n        for (var j = 0; j < changes.length; j++) {\n          var change = changes[j];\n          if (change instanceof InsertModeKey) {\n            CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler);\n          } else if (typeof change == \"string\") {\n            cm.replaceSelection(change);\n          } else {\n            var start = cm.getCursor();\n            var end = offsetCursor(start, 0, change[0].length);\n            cm.replaceRange(change[0], start, end);\n            cm.setCursor(end);\n          }\n        }\n      }\n      if (visualBlock) {\n        cm.setCursor(offsetCursor(head, 0, 1));\n      }\n    }\n\n    resetVimGlobalState();\n    return vimApi;\n  };\n  // Initialize Vim and make it available as an API.\n  CodeMirror.Vim = Vim();\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/lib/codemirror.css",
    "content": "/* BASICS */\n\n.CodeMirror {\n  /* Set height, width, borders, and global font properties here */\n  font-family: monospace;\n  height: 300px;\n  color: black;\n  direction: ltr;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n  padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre.CodeMirror-line,\n.CodeMirror pre.CodeMirror-line-like {\n  padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n  border-right: 1px solid #ddd;\n  background-color: #f7f7f7;\n  white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n  padding: 0 3px 0 5px;\n  min-width: 20px;\n  text-align: right;\n  color: #999;\n  white-space: nowrap;\n}\n\n.CodeMirror-guttermarker { color: black; }\n.CodeMirror-guttermarker-subtle { color: #999; }\n\n/* CURSOR */\n\n.CodeMirror-cursor {\n  border-left: 1px solid black;\n  border-right: none;\n  width: 0;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n  border-left: 1px solid silver;\n}\n.cm-fat-cursor .CodeMirror-cursor {\n  width: auto;\n  border: 0 !important;\n  background: #7e7;\n}\n.cm-fat-cursor div.CodeMirror-cursors {\n  z-index: 1;\n}\n.cm-fat-cursor .CodeMirror-line::selection,\n.cm-fat-cursor .CodeMirror-line > span::selection, \n.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; }\n.cm-fat-cursor .CodeMirror-line::-moz-selection,\n.cm-fat-cursor .CodeMirror-line > span::-moz-selection,\n.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; }\n.cm-fat-cursor { caret-color: transparent; }\n@-moz-keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n@-webkit-keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n@keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n\n/* Can style cursor different in overwrite (non-insert) mode */\n.CodeMirror-overwrite .CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; text-decoration: inherit; }\n\n.CodeMirror-rulers {\n  position: absolute;\n  left: 0; right: 0; top: -50px; bottom: 0;\n  overflow: hidden;\n}\n.CodeMirror-ruler {\n  border-left: 1px solid #ccc;\n  top: 0; bottom: 0;\n  position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.cm-s-default .cm-header {color: blue;}\n.cm-s-default .cm-quote {color: #090;}\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n.cm-strikethrough {text-decoration: line-through;}\n\n.cm-s-default .cm-keyword {color: #708;}\n.cm-s-default .cm-atom {color: #219;}\n.cm-s-default .cm-number {color: #164;}\n.cm-s-default .cm-def {color: #00f;}\n.cm-s-default .cm-variable,\n.cm-s-default .cm-punctuation,\n.cm-s-default .cm-property,\n.cm-s-default .cm-operator {}\n.cm-s-default .cm-variable-2 {color: #05a;}\n.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}\n.cm-s-default .cm-comment {color: #a50;}\n.cm-s-default .cm-string {color: #a11;}\n.cm-s-default .cm-string-2 {color: #f50;}\n.cm-s-default .cm-meta {color: #555;}\n.cm-s-default .cm-qualifier {color: #555;}\n.cm-s-default .cm-builtin {color: #30a;}\n.cm-s-default .cm-bracket {color: #997;}\n.cm-s-default .cm-tag {color: #170;}\n.cm-s-default .cm-attribute {color: #00c;}\n.cm-s-default .cm-hr {color: #999;}\n.cm-s-default .cm-link {color: #00c;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\n.CodeMirror-composing { border-bottom: 2px solid; }\n\n/* Default styles for common addons */\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}\n.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n   the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n  position: relative;\n  overflow: hidden;\n  background: white;\n}\n\n.CodeMirror-scroll {\n  overflow: scroll !important; /* Things will break if this is overridden */\n  /* 50px is the magic margin used to hide the element's real scrollbars */\n  /* See overflow: hidden in .CodeMirror */\n  margin-bottom: -50px; margin-right: -50px;\n  padding-bottom: 50px;\n  height: 100%;\n  outline: none; /* Prevent dragging from highlighting the element */\n  position: relative;\n  z-index: 0;\n}\n.CodeMirror-sizer {\n  position: relative;\n  border-right: 50px solid transparent;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n   before actual scrolling happens, thus preventing shaking and\n   flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  position: absolute;\n  z-index: 6;\n  display: none;\n  outline: none;\n}\n.CodeMirror-vscrollbar {\n  right: 0; top: 0;\n  overflow-x: hidden;\n  overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n  bottom: 0; left: 0;\n  overflow-y: hidden;\n  overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n  right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n  left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n  position: absolute; left: 0; top: 0;\n  min-height: 100%;\n  z-index: 3;\n}\n.CodeMirror-gutter {\n  white-space: normal;\n  height: 100%;\n  display: inline-block;\n  vertical-align: top;\n  margin-bottom: -50px;\n}\n.CodeMirror-gutter-wrapper {\n  position: absolute;\n  z-index: 4;\n  background: none !important;\n  border: none !important;\n}\n.CodeMirror-gutter-background {\n  position: absolute;\n  top: 0; bottom: 0;\n  z-index: 4;\n}\n.CodeMirror-gutter-elt {\n  position: absolute;\n  cursor: default;\n  z-index: 4;\n}\n.CodeMirror-gutter-wrapper ::selection { background-color: transparent }\n.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }\n\n.CodeMirror-lines {\n  cursor: text;\n  min-height: 1px; /* prevents collapsing before first draw */\n}\n.CodeMirror pre.CodeMirror-line,\n.CodeMirror pre.CodeMirror-line-like {\n  /* Reset some styles that the rest of the page might have set */\n  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n  border-width: 0;\n  background: transparent;\n  font-family: inherit;\n  font-size: inherit;\n  margin: 0;\n  white-space: pre;\n  word-wrap: normal;\n  line-height: inherit;\n  color: inherit;\n  z-index: 2;\n  position: relative;\n  overflow: visible;\n  -webkit-tap-highlight-color: transparent;\n  -webkit-font-variant-ligatures: contextual;\n  font-variant-ligatures: contextual;\n}\n.CodeMirror-wrap pre.CodeMirror-line,\n.CodeMirror-wrap pre.CodeMirror-line-like {\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  word-break: normal;\n}\n\n.CodeMirror-linebackground {\n  position: absolute;\n  left: 0; right: 0; top: 0; bottom: 0;\n  z-index: 0;\n}\n\n.CodeMirror-linewidget {\n  position: relative;\n  z-index: 2;\n  padding: 0.1px; /* Force widget margins to stay inside of the container */\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-rtl pre { direction: rtl; }\n\n.CodeMirror-code {\n  outline: none;\n}\n\n/* Force content-box sizing for the elements where we expect it */\n.CodeMirror-scroll,\n.CodeMirror-sizer,\n.CodeMirror-gutter,\n.CodeMirror-gutters,\n.CodeMirror-linenumber {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n.CodeMirror-measure {\n  position: absolute;\n  width: 100%;\n  height: 0;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n.CodeMirror-cursor {\n  position: absolute;\n  pointer-events: none;\n}\n.CodeMirror-measure pre { position: static; }\n\ndiv.CodeMirror-cursors {\n  visibility: hidden;\n  position: relative;\n  z-index: 3;\n}\ndiv.CodeMirror-dragcursors {\n  visibility: visible;\n}\n\n.CodeMirror-focused div.CodeMirror-cursors {\n  visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }\n.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }\n\n.cm-searching {\n  background-color: #ffa;\n  background-color: rgba(255, 255, 0, .4);\n}\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n  /* Hide the cursor when printing */\n  .CodeMirror div.CodeMirror-cursors {\n    visibility: hidden;\n  }\n}\n\n/* See issue #2901 */\n.cm-tab-wrap-hack:after { content: ''; }\n\n/* Help users use markselection to safely style text background */\nspan.CodeMirror-selectedtext { background: none; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/lib/codemirror.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// This is CodeMirror (https://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = global || self, global.CodeMirror = factory());\n}(this, (function () { 'use strict';\n\n  // Kludges for bugs and behavior differences that can't be feature\n  // detected are enabled based on userAgent etc sniffing.\n  var userAgent = navigator.userAgent;\n  var platform = navigator.platform;\n\n  var gecko = /gecko\\/\\d/i.test(userAgent);\n  var ie_upto10 = /MSIE \\d/.test(userAgent);\n  var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent);\n  var edge = /Edge\\/(\\d+)/.exec(userAgent);\n  var ie = ie_upto10 || ie_11up || edge;\n  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);\n  var webkit = !edge && /WebKit\\//.test(userAgent);\n  var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent);\n  var chrome = !edge && /Chrome\\//.test(userAgent);\n  var presto = /Opera\\//.test(userAgent);\n  var safari = /Apple Computer/.test(navigator.vendor);\n  var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent);\n  var phantom = /PhantomJS/.test(userAgent);\n\n  var ios = safari && (/Mobile\\/\\w+/.test(userAgent) || navigator.maxTouchPoints > 2);\n  var android = /Android/.test(userAgent);\n  // This is woefully incomplete. Suggestions for alternative methods welcome.\n  var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);\n  var mac = ios || /Mac/.test(platform);\n  var chromeOS = /\\bCrOS\\b/.test(userAgent);\n  var windows = /win/i.test(platform);\n\n  var presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n  if (presto_version) { presto_version = Number(presto_version[1]); }\n  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n  var captureRightClick = gecko || (ie && ie_version >= 9);\n\n  function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\n  var rmClass = function(node, cls) {\n    var current = node.className;\n    var match = classTest(cls).exec(current);\n    if (match) {\n      var after = current.slice(match.index + match[0].length);\n      node.className = current.slice(0, match.index) + (after ? match[1] + after : \"\");\n    }\n  };\n\n  function removeChildren(e) {\n    for (var count = e.childNodes.length; count > 0; --count)\n      { e.removeChild(e.firstChild); }\n    return e\n  }\n\n  function removeChildrenAndAdd(parent, e) {\n    return removeChildren(parent).appendChild(e)\n  }\n\n  function elt(tag, content, className, style) {\n    var e = document.createElement(tag);\n    if (className) { e.className = className; }\n    if (style) { e.style.cssText = style; }\n    if (typeof content == \"string\") { e.appendChild(document.createTextNode(content)); }\n    else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }\n    return e\n  }\n  // wrapper for elt, which removes the elt from the accessibility tree\n  function eltP(tag, content, className, style) {\n    var e = elt(tag, content, className, style);\n    e.setAttribute(\"role\", \"presentation\");\n    return e\n  }\n\n  var range;\n  if (document.createRange) { range = function(node, start, end, endNode) {\n    var r = document.createRange();\n    r.setEnd(endNode || node, end);\n    r.setStart(node, start);\n    return r\n  }; }\n  else { range = function(node, start, end) {\n    var r = document.body.createTextRange();\n    try { r.moveToElementText(node.parentNode); }\n    catch(e) { return r }\n    r.collapse(true);\n    r.moveEnd(\"character\", end);\n    r.moveStart(\"character\", start);\n    return r\n  }; }\n\n  function contains(parent, child) {\n    if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n      { child = child.parentNode; }\n    if (parent.contains)\n      { return parent.contains(child) }\n    do {\n      if (child.nodeType == 11) { child = child.host; }\n      if (child == parent) { return true }\n    } while (child = child.parentNode)\n  }\n\n  function activeElt() {\n    // IE and Edge may throw an \"Unspecified Error\" when accessing document.activeElement.\n    // IE < 10 will throw when accessed while the page is loading or in an iframe.\n    // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.\n    var activeElement;\n    try {\n      activeElement = document.activeElement;\n    } catch(e) {\n      activeElement = document.body || null;\n    }\n    while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)\n      { activeElement = activeElement.shadowRoot.activeElement; }\n    return activeElement\n  }\n\n  function addClass(node, cls) {\n    var current = node.className;\n    if (!classTest(cls).test(current)) { node.className += (current ? \" \" : \"\") + cls; }\n  }\n  function joinClasses(a, b) {\n    var as = a.split(\" \");\n    for (var i = 0; i < as.length; i++)\n      { if (as[i] && !classTest(as[i]).test(b)) { b += \" \" + as[i]; } }\n    return b\n  }\n\n  var selectInput = function(node) { node.select(); };\n  if (ios) // Mobile Safari apparently has a bug where select() is broken.\n    { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }\n  else if (ie) // Suppress mysterious IE10 errors\n    { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }\n\n  function bind(f) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function(){return f.apply(null, args)}\n  }\n\n  function copyObj(obj, target, overwrite) {\n    if (!target) { target = {}; }\n    for (var prop in obj)\n      { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n        { target[prop] = obj[prop]; } }\n    return target\n  }\n\n  // Counts the column offset in a string, taking tabs into account.\n  // Used mostly to find indentation.\n  function countColumn(string, end, tabSize, startIndex, startValue) {\n    if (end == null) {\n      end = string.search(/[^\\s\\u00a0]/);\n      if (end == -1) { end = string.length; }\n    }\n    for (var i = startIndex || 0, n = startValue || 0;;) {\n      var nextTab = string.indexOf(\"\\t\", i);\n      if (nextTab < 0 || nextTab >= end)\n        { return n + (end - i) }\n      n += nextTab - i;\n      n += tabSize - (n % tabSize);\n      i = nextTab + 1;\n    }\n  }\n\n  var Delayed = function() {\n    this.id = null;\n    this.f = null;\n    this.time = 0;\n    this.handler = bind(this.onTimeout, this);\n  };\n  Delayed.prototype.onTimeout = function (self) {\n    self.id = 0;\n    if (self.time <= +new Date) {\n      self.f();\n    } else {\n      setTimeout(self.handler, self.time - +new Date);\n    }\n  };\n  Delayed.prototype.set = function (ms, f) {\n    this.f = f;\n    var time = +new Date + ms;\n    if (!this.id || time < this.time) {\n      clearTimeout(this.id);\n      this.id = setTimeout(this.handler, ms);\n      this.time = time;\n    }\n  };\n\n  function indexOf(array, elt) {\n    for (var i = 0; i < array.length; ++i)\n      { if (array[i] == elt) { return i } }\n    return -1\n  }\n\n  // Number of pixels added to scroller and sizer to hide scrollbar\n  var scrollerGap = 50;\n\n  // Returned or thrown by various protocols to signal 'I'm not\n  // handling this'.\n  var Pass = {toString: function(){return \"CodeMirror.Pass\"}};\n\n  // Reused option objects for setSelection & friends\n  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n  // The inverse of countColumn -- find the offset that corresponds to\n  // a particular column.\n  function findColumn(string, goal, tabSize) {\n    for (var pos = 0, col = 0;;) {\n      var nextTab = string.indexOf(\"\\t\", pos);\n      if (nextTab == -1) { nextTab = string.length; }\n      var skipped = nextTab - pos;\n      if (nextTab == string.length || col + skipped >= goal)\n        { return pos + Math.min(skipped, goal - col) }\n      col += nextTab - pos;\n      col += tabSize - (col % tabSize);\n      pos = nextTab + 1;\n      if (col >= goal) { return pos }\n    }\n  }\n\n  var spaceStrs = [\"\"];\n  function spaceStr(n) {\n    while (spaceStrs.length <= n)\n      { spaceStrs.push(lst(spaceStrs) + \" \"); }\n    return spaceStrs[n]\n  }\n\n  function lst(arr) { return arr[arr.length-1] }\n\n  function map(array, f) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }\n    return out\n  }\n\n  function insertSorted(array, value, score) {\n    var pos = 0, priority = score(value);\n    while (pos < array.length && score(array[pos]) <= priority) { pos++; }\n    array.splice(pos, 0, value);\n  }\n\n  function nothing() {}\n\n  function createObj(base, props) {\n    var inst;\n    if (Object.create) {\n      inst = Object.create(base);\n    } else {\n      nothing.prototype = base;\n      inst = new nothing();\n    }\n    if (props) { copyObj(props, inst); }\n    return inst\n  }\n\n  var nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n  function isWordCharBasic(ch) {\n    return /\\w/.test(ch) || ch > \"\\x80\" &&\n      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))\n  }\n  function isWordChar(ch, helper) {\n    if (!helper) { return isWordCharBasic(ch) }\n    if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) { return true }\n    return helper.test(ch)\n  }\n\n  function isEmpty(obj) {\n    for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }\n    return true\n  }\n\n  // Extending unicode characters. A series of a non-extending char +\n  // any number of extending chars is treated as a single unit as far\n  // as editing and measuring is concerned. This is not fully correct,\n  // since some scripts/fonts/browsers also treat other configurations\n  // of code points as a group.\n  var extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\n  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }\n\n  // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.\n  function skipExtendingChars(str, pos, dir) {\n    while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }\n    return pos\n  }\n\n  // Returns the value from the range [`from`; `to`] that satisfies\n  // `pred` and is closest to `from`. Assumes that at least `to`\n  // satisfies `pred`. Supports `from` being greater than `to`.\n  function findFirst(pred, from, to) {\n    // At any point we are certain `to` satisfies `pred`, don't know\n    // whether `from` does.\n    var dir = from > to ? -1 : 1;\n    for (;;) {\n      if (from == to) { return from }\n      var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);\n      if (mid == from) { return pred(mid) ? from : to }\n      if (pred(mid)) { to = mid; }\n      else { from = mid + dir; }\n    }\n  }\n\n  // BIDI HELPERS\n\n  function iterateBidiSections(order, from, to, f) {\n    if (!order) { return f(from, to, \"ltr\", 0) }\n    var found = false;\n    for (var i = 0; i < order.length; ++i) {\n      var part = order[i];\n      if (part.from < to && part.to > from || from == to && part.to == from) {\n        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\", i);\n        found = true;\n      }\n    }\n    if (!found) { f(from, to, \"ltr\"); }\n  }\n\n  var bidiOther = null;\n  function getBidiPartAt(order, ch, sticky) {\n    var found;\n    bidiOther = null;\n    for (var i = 0; i < order.length; ++i) {\n      var cur = order[i];\n      if (cur.from < ch && cur.to > ch) { return i }\n      if (cur.to == ch) {\n        if (cur.from != cur.to && sticky == \"before\") { found = i; }\n        else { bidiOther = i; }\n      }\n      if (cur.from == ch) {\n        if (cur.from != cur.to && sticky != \"before\") { found = i; }\n        else { bidiOther = i; }\n      }\n    }\n    return found != null ? found : bidiOther\n  }\n\n  // Bidirectional ordering algorithm\n  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n  // that this (partially) implements.\n\n  // One-char codes used for character types:\n  // L (L):   Left-to-Right\n  // R (R):   Right-to-Left\n  // r (AL):  Right-to-Left Arabic\n  // 1 (EN):  European Number\n  // + (ES):  European Number Separator\n  // % (ET):  European Number Terminator\n  // n (AN):  Arabic Number\n  // , (CS):  Common Number Separator\n  // m (NSM): Non-Spacing Mark\n  // b (BN):  Boundary Neutral\n  // s (B):   Paragraph Separator\n  // t (S):   Segment Separator\n  // w (WS):  Whitespace\n  // N (ON):  Other Neutrals\n\n  // Returns null if characters are ordered as they appear\n  // (left-to-right), or an array of sections ({from, to, level}\n  // objects) in the order in which they occur visually.\n  var bidiOrdering = (function() {\n    // Character types for codepoints 0 to 0xff\n    var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n    // Character types for codepoints 0x600 to 0x6f9\n    var arabicTypes = \"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";\n    function charType(code) {\n      if (code <= 0xf7) { return lowTypes.charAt(code) }\n      else if (0x590 <= code && code <= 0x5f4) { return \"R\" }\n      else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }\n      else if (0x6ee <= code && code <= 0x8ac) { return \"r\" }\n      else if (0x2000 <= code && code <= 0x200b) { return \"w\" }\n      else if (code == 0x200c) { return \"b\" }\n      else { return \"L\" }\n    }\n\n    var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n\n    function BidiSpan(level, from, to) {\n      this.level = level;\n      this.from = from; this.to = to;\n    }\n\n    return function(str, direction) {\n      var outerType = direction == \"ltr\" ? \"L\" : \"R\";\n\n      if (str.length == 0 || direction == \"ltr\" && !bidiRE.test(str)) { return false }\n      var len = str.length, types = [];\n      for (var i = 0; i < len; ++i)\n        { types.push(charType(str.charCodeAt(i))); }\n\n      // W1. Examine each non-spacing mark (NSM) in the level run, and\n      // change the type of the NSM to the type of the previous\n      // character. If the NSM is at the start of the level run, it will\n      // get the type of sor.\n      for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {\n        var type = types[i$1];\n        if (type == \"m\") { types[i$1] = prev; }\n        else { prev = type; }\n      }\n\n      // W2. Search backwards from each instance of a European number\n      // until the first strong type (R, L, AL, or sor) is found. If an\n      // AL is found, change the type of the European number to Arabic\n      // number.\n      // W3. Change all ALs to R.\n      for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {\n        var type$1 = types[i$2];\n        if (type$1 == \"1\" && cur == \"r\") { types[i$2] = \"n\"; }\n        else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == \"r\") { types[i$2] = \"R\"; } }\n      }\n\n      // W4. A single European separator between two European numbers\n      // changes to a European number. A single common separator between\n      // two numbers of the same type changes to that type.\n      for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {\n        var type$2 = types[i$3];\n        if (type$2 == \"+\" && prev$1 == \"1\" && types[i$3+1] == \"1\") { types[i$3] = \"1\"; }\n        else if (type$2 == \",\" && prev$1 == types[i$3+1] &&\n                 (prev$1 == \"1\" || prev$1 == \"n\")) { types[i$3] = prev$1; }\n        prev$1 = type$2;\n      }\n\n      // W5. A sequence of European terminators adjacent to European\n      // numbers changes to all European numbers.\n      // W6. Otherwise, separators and terminators change to Other\n      // Neutral.\n      for (var i$4 = 0; i$4 < len; ++i$4) {\n        var type$3 = types[i$4];\n        if (type$3 == \",\") { types[i$4] = \"N\"; }\n        else if (type$3 == \"%\") {\n          var end = (void 0);\n          for (end = i$4 + 1; end < len && types[end] == \"%\"; ++end) {}\n          var replace = (i$4 && types[i$4-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n          for (var j = i$4; j < end; ++j) { types[j] = replace; }\n          i$4 = end - 1;\n        }\n      }\n\n      // W7. Search backwards from each instance of a European number\n      // until the first strong type (R, L, or sor) is found. If an L is\n      // found, then change the type of the European number to L.\n      for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {\n        var type$4 = types[i$5];\n        if (cur$1 == \"L\" && type$4 == \"1\") { types[i$5] = \"L\"; }\n        else if (isStrong.test(type$4)) { cur$1 = type$4; }\n      }\n\n      // N1. A sequence of neutrals takes the direction of the\n      // surrounding strong text if the text on both sides has the same\n      // direction. European and Arabic numbers act as if they were R in\n      // terms of their influence on neutrals. Start-of-level-run (sor)\n      // and end-of-level-run (eor) are used at level run boundaries.\n      // N2. Any remaining neutrals take the embedding direction.\n      for (var i$6 = 0; i$6 < len; ++i$6) {\n        if (isNeutral.test(types[i$6])) {\n          var end$1 = (void 0);\n          for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}\n          var before = (i$6 ? types[i$6-1] : outerType) == \"L\";\n          var after = (end$1 < len ? types[end$1] : outerType) == \"L\";\n          var replace$1 = before == after ? (before ? \"L\" : \"R\") : outerType;\n          for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }\n          i$6 = end$1 - 1;\n        }\n      }\n\n      // Here we depart from the documented algorithm, in order to avoid\n      // building up an actual levels array. Since there are only three\n      // levels (0, 1, 2) in an implementation that doesn't take\n      // explicit embedding into account, we can build up the order on\n      // the fly, without following the level-based algorithm.\n      var order = [], m;\n      for (var i$7 = 0; i$7 < len;) {\n        if (countsAsLeft.test(types[i$7])) {\n          var start = i$7;\n          for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}\n          order.push(new BidiSpan(0, start, i$7));\n        } else {\n          var pos = i$7, at = order.length, isRTL = direction == \"rtl\" ? 1 : 0;\n          for (++i$7; i$7 < len && types[i$7] != \"L\"; ++i$7) {}\n          for (var j$2 = pos; j$2 < i$7;) {\n            if (countsAsNum.test(types[j$2])) {\n              if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }\n              var nstart = j$2;\n              for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}\n              order.splice(at, 0, new BidiSpan(2, nstart, j$2));\n              at += isRTL;\n              pos = j$2;\n            } else { ++j$2; }\n          }\n          if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }\n        }\n      }\n      if (direction == \"ltr\") {\n        if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n          order[0].from = m[0].length;\n          order.unshift(new BidiSpan(0, 0, m[0].length));\n        }\n        if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n          lst(order).to -= m[0].length;\n          order.push(new BidiSpan(0, len - m[0].length, len));\n        }\n      }\n\n      return direction == \"rtl\" ? order.reverse() : order\n    }\n  })();\n\n  // Get the bidi ordering for the given line (and cache it). Returns\n  // false for lines that are fully left-to-right, and an array of\n  // BidiSpan objects otherwise.\n  function getOrder(line, direction) {\n    var order = line.order;\n    if (order == null) { order = line.order = bidiOrdering(line.text, direction); }\n    return order\n  }\n\n  // EVENT HANDLING\n\n  // Lightweight event framework. on/off also work on DOM nodes,\n  // registering native DOM handlers.\n\n  var noHandlers = [];\n\n  var on = function(emitter, type, f) {\n    if (emitter.addEventListener) {\n      emitter.addEventListener(type, f, false);\n    } else if (emitter.attachEvent) {\n      emitter.attachEvent(\"on\" + type, f);\n    } else {\n      var map = emitter._handlers || (emitter._handlers = {});\n      map[type] = (map[type] || noHandlers).concat(f);\n    }\n  };\n\n  function getHandlers(emitter, type) {\n    return emitter._handlers && emitter._handlers[type] || noHandlers\n  }\n\n  function off(emitter, type, f) {\n    if (emitter.removeEventListener) {\n      emitter.removeEventListener(type, f, false);\n    } else if (emitter.detachEvent) {\n      emitter.detachEvent(\"on\" + type, f);\n    } else {\n      var map = emitter._handlers, arr = map && map[type];\n      if (arr) {\n        var index = indexOf(arr, f);\n        if (index > -1)\n          { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }\n      }\n    }\n  }\n\n  function signal(emitter, type /*, values...*/) {\n    var handlers = getHandlers(emitter, type);\n    if (!handlers.length) { return }\n    var args = Array.prototype.slice.call(arguments, 2);\n    for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }\n  }\n\n  // The DOM events that CodeMirror handles can be overridden by\n  // registering a (non-DOM) handler on the editor for the event name,\n  // and preventDefault-ing the event in that handler.\n  function signalDOMEvent(cm, e, override) {\n    if (typeof e == \"string\")\n      { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }\n    signal(cm, override || e.type, cm, e);\n    return e_defaultPrevented(e) || e.codemirrorIgnore\n  }\n\n  function signalCursorActivity(cm) {\n    var arr = cm._handlers && cm._handlers.cursorActivity;\n    if (!arr) { return }\n    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n    for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)\n      { set.push(arr[i]); } }\n  }\n\n  function hasHandler(emitter, type) {\n    return getHandlers(emitter, type).length > 0\n  }\n\n  // Add on and off methods to a constructor's prototype, to make\n  // registering events on such objects more convenient.\n  function eventMixin(ctor) {\n    ctor.prototype.on = function(type, f) {on(this, type, f);};\n    ctor.prototype.off = function(type, f) {off(this, type, f);};\n  }\n\n  // Due to the fact that we still support jurassic IE versions, some\n  // compatibility wrappers are needed.\n\n  function e_preventDefault(e) {\n    if (e.preventDefault) { e.preventDefault(); }\n    else { e.returnValue = false; }\n  }\n  function e_stopPropagation(e) {\n    if (e.stopPropagation) { e.stopPropagation(); }\n    else { e.cancelBubble = true; }\n  }\n  function e_defaultPrevented(e) {\n    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false\n  }\n  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}\n\n  function e_target(e) {return e.target || e.srcElement}\n  function e_button(e) {\n    var b = e.which;\n    if (b == null) {\n      if (e.button & 1) { b = 1; }\n      else if (e.button & 2) { b = 3; }\n      else if (e.button & 4) { b = 2; }\n    }\n    if (mac && e.ctrlKey && b == 1) { b = 3; }\n    return b\n  }\n\n  // Detect drag-and-drop\n  var dragAndDrop = function() {\n    // There is *some* kind of drag-and-drop support in IE6-8, but I\n    // couldn't get it to work yet.\n    if (ie && ie_version < 9) { return false }\n    var div = elt('div');\n    return \"draggable\" in div || \"dragDrop\" in div\n  }();\n\n  var zwspSupported;\n  function zeroWidthElement(measure) {\n    if (zwspSupported == null) {\n      var test = elt(\"span\", \"\\u200b\");\n      removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n      if (measure.firstChild.offsetHeight != 0)\n        { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }\n    }\n    var node = zwspSupported ? elt(\"span\", \"\\u200b\") :\n      elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n    node.setAttribute(\"cm-text\", \"\");\n    return node\n  }\n\n  // Feature-detect IE's crummy client rect reporting for bidi text\n  var badBidiRects;\n  function hasBadBidiRects(measure) {\n    if (badBidiRects != null) { return badBidiRects }\n    var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n    var r0 = range(txt, 0, 1).getBoundingClientRect();\n    var r1 = range(txt, 1, 2).getBoundingClientRect();\n    removeChildren(measure);\n    if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)\n    return badBidiRects = (r1.right - r0.right < 3)\n  }\n\n  // See if \"\".split is the broken IE version, if so, provide an\n  // alternative way to split lines.\n  var splitLinesAuto = \"\\n\\nb\".split(/\\n/).length != 3 ? function (string) {\n    var pos = 0, result = [], l = string.length;\n    while (pos <= l) {\n      var nl = string.indexOf(\"\\n\", pos);\n      if (nl == -1) { nl = string.length; }\n      var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n      var rt = line.indexOf(\"\\r\");\n      if (rt != -1) {\n        result.push(line.slice(0, rt));\n        pos += rt + 1;\n      } else {\n        result.push(line);\n        pos = nl + 1;\n      }\n    }\n    return result\n  } : function (string) { return string.split(/\\r\\n?|\\n/); };\n\n  var hasSelection = window.getSelection ? function (te) {\n    try { return te.selectionStart != te.selectionEnd }\n    catch(e) { return false }\n  } : function (te) {\n    var range;\n    try {range = te.ownerDocument.selection.createRange();}\n    catch(e) {}\n    if (!range || range.parentElement() != te) { return false }\n    return range.compareEndPoints(\"StartToEnd\", range) != 0\n  };\n\n  var hasCopyEvent = (function () {\n    var e = elt(\"div\");\n    if (\"oncopy\" in e) { return true }\n    e.setAttribute(\"oncopy\", \"return;\");\n    return typeof e.oncopy == \"function\"\n  })();\n\n  var badZoomedRects = null;\n  function hasBadZoomedRects(measure) {\n    if (badZoomedRects != null) { return badZoomedRects }\n    var node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"));\n    var normal = node.getBoundingClientRect();\n    var fromRange = range(node, 0, 1).getBoundingClientRect();\n    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1\n  }\n\n  // Known modes, by name and by MIME\n  var modes = {}, mimeModes = {};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  function defineMode(name, mode) {\n    if (arguments.length > 2)\n      { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n    modes[name] = mode;\n  }\n\n  function defineMIME(mime, spec) {\n    mimeModes[mime] = spec;\n  }\n\n  // Given a MIME type, a {name, ...options} config object, or a name\n  // string, return a mode config object.\n  function resolveMode(spec) {\n    if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n      spec = mimeModes[spec];\n    } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n      var found = mimeModes[spec.name];\n      if (typeof found == \"string\") { found = {name: found}; }\n      spec = createObj(found, spec);\n      spec.name = found.name;\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n      return resolveMode(\"application/xml\")\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n      return resolveMode(\"application/json\")\n    }\n    if (typeof spec == \"string\") { return {name: spec} }\n    else { return spec || {name: \"null\"} }\n  }\n\n  // Given a mode spec (anything that resolveMode accepts), find and\n  // initialize an actual mode object.\n  function getMode(options, spec) {\n    spec = resolveMode(spec);\n    var mfactory = modes[spec.name];\n    if (!mfactory) { return getMode(options, \"text/plain\") }\n    var modeObj = mfactory(options, spec);\n    if (modeExtensions.hasOwnProperty(spec.name)) {\n      var exts = modeExtensions[spec.name];\n      for (var prop in exts) {\n        if (!exts.hasOwnProperty(prop)) { continue }\n        if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n        modeObj[prop] = exts[prop];\n      }\n    }\n    modeObj.name = spec.name;\n    if (spec.helperType) { modeObj.helperType = spec.helperType; }\n    if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n      { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n    return modeObj\n  }\n\n  // This can be used to attach properties to mode objects from\n  // outside the actual mode definition.\n  var modeExtensions = {};\n  function extendMode(mode, properties) {\n    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n    copyObj(properties, exts);\n  }\n\n  function copyState(mode, state) {\n    if (state === true) { return state }\n    if (mode.copyState) { return mode.copyState(state) }\n    var nstate = {};\n    for (var n in state) {\n      var val = state[n];\n      if (val instanceof Array) { val = val.concat([]); }\n      nstate[n] = val;\n    }\n    return nstate\n  }\n\n  // Given a mode and a state (for that mode), find the inner mode and\n  // state at the position that the state refers to.\n  function innerMode(mode, state) {\n    var info;\n    while (mode.innerMode) {\n      info = mode.innerMode(state);\n      if (!info || info.mode == mode) { break }\n      state = info.state;\n      mode = info.mode;\n    }\n    return info || {mode: mode, state: state}\n  }\n\n  function startState(mode, a1, a2) {\n    return mode.startState ? mode.startState(a1, a2) : true\n  }\n\n  // STRING STREAM\n\n  // Fed to the mode parsers, provides helper functions to make\n  // parsers more succinct.\n\n  var StringStream = function(string, tabSize, lineOracle) {\n    this.pos = this.start = 0;\n    this.string = string;\n    this.tabSize = tabSize || 8;\n    this.lastColumnPos = this.lastColumnValue = 0;\n    this.lineStart = 0;\n    this.lineOracle = lineOracle;\n  };\n\n  StringStream.prototype.eol = function () {return this.pos >= this.string.length};\n  StringStream.prototype.sol = function () {return this.pos == this.lineStart};\n  StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\n  StringStream.prototype.next = function () {\n    if (this.pos < this.string.length)\n      { return this.string.charAt(this.pos++) }\n  };\n  StringStream.prototype.eat = function (match) {\n    var ch = this.string.charAt(this.pos);\n    var ok;\n    if (typeof match == \"string\") { ok = ch == match; }\n    else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n    if (ok) {++this.pos; return ch}\n  };\n  StringStream.prototype.eatWhile = function (match) {\n    var start = this.pos;\n    while (this.eat(match)){}\n    return this.pos > start\n  };\n  StringStream.prototype.eatSpace = function () {\n    var start = this.pos;\n    while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }\n    return this.pos > start\n  };\n  StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\n  StringStream.prototype.skipTo = function (ch) {\n    var found = this.string.indexOf(ch, this.pos);\n    if (found > -1) {this.pos = found; return true}\n  };\n  StringStream.prototype.backUp = function (n) {this.pos -= n;};\n  StringStream.prototype.column = function () {\n    if (this.lastColumnPos < this.start) {\n      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n      this.lastColumnPos = this.start;\n    }\n    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.indentation = function () {\n    return countColumn(this.string, null, this.tabSize) -\n      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n    if (typeof pattern == \"string\") {\n      var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n      var substr = this.string.substr(this.pos, pattern.length);\n      if (cased(substr) == cased(pattern)) {\n        if (consume !== false) { this.pos += pattern.length; }\n        return true\n      }\n    } else {\n      var match = this.string.slice(this.pos).match(pattern);\n      if (match && match.index > 0) { return null }\n      if (match && consume !== false) { this.pos += match[0].length; }\n      return match\n    }\n  };\n  StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\n  StringStream.prototype.hideFirstChars = function (n, inner) {\n    this.lineStart += n;\n    try { return inner() }\n    finally { this.lineStart -= n; }\n  };\n  StringStream.prototype.lookAhead = function (n) {\n    var oracle = this.lineOracle;\n    return oracle && oracle.lookAhead(n)\n  };\n  StringStream.prototype.baseToken = function () {\n    var oracle = this.lineOracle;\n    return oracle && oracle.baseToken(this.pos)\n  };\n\n  // Find the line object corresponding to the given line number.\n  function getLine(doc, n) {\n    n -= doc.first;\n    if (n < 0 || n >= doc.size) { throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\") }\n    var chunk = doc;\n    while (!chunk.lines) {\n      for (var i = 0;; ++i) {\n        var child = chunk.children[i], sz = child.chunkSize();\n        if (n < sz) { chunk = child; break }\n        n -= sz;\n      }\n    }\n    return chunk.lines[n]\n  }\n\n  // Get the part of a document between two positions, as an array of\n  // strings.\n  function getBetween(doc, start, end) {\n    var out = [], n = start.line;\n    doc.iter(start.line, end.line + 1, function (line) {\n      var text = line.text;\n      if (n == end.line) { text = text.slice(0, end.ch); }\n      if (n == start.line) { text = text.slice(start.ch); }\n      out.push(text);\n      ++n;\n    });\n    return out\n  }\n  // Get the lines between from and to, as array of strings.\n  function getLines(doc, from, to) {\n    var out = [];\n    doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value\n    return out\n  }\n\n  // Update the height of a line, propagating the height change\n  // upwards to parent nodes.\n  function updateLineHeight(line, height) {\n    var diff = height - line.height;\n    if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }\n  }\n\n  // Given a line object, find its line number by walking up through\n  // its parent links.\n  function lineNo(line) {\n    if (line.parent == null) { return null }\n    var cur = line.parent, no = indexOf(cur.lines, line);\n    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n      for (var i = 0;; ++i) {\n        if (chunk.children[i] == cur) { break }\n        no += chunk.children[i].chunkSize();\n      }\n    }\n    return no + cur.first\n  }\n\n  // Find the line at the given vertical position, using the height\n  // information in the document tree.\n  function lineAtHeight(chunk, h) {\n    var n = chunk.first;\n    outer: do {\n      for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {\n        var child = chunk.children[i$1], ch = child.height;\n        if (h < ch) { chunk = child; continue outer }\n        h -= ch;\n        n += child.chunkSize();\n      }\n      return n\n    } while (!chunk.lines)\n    var i = 0;\n    for (; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i], lh = line.height;\n      if (h < lh) { break }\n      h -= lh;\n    }\n    return n + i\n  }\n\n  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}\n\n  function lineNumberFor(options, i) {\n    return String(options.lineNumberFormatter(i + options.firstLineNumber))\n  }\n\n  // A Pos instance represents a position within the text.\n  function Pos(line, ch, sticky) {\n    if ( sticky === void 0 ) sticky = null;\n\n    if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }\n    this.line = line;\n    this.ch = ch;\n    this.sticky = sticky;\n  }\n\n  // Compare two positions, return 0 if they are the same, a negative\n  // number when a is less, and a positive number otherwise.\n  function cmp(a, b) { return a.line - b.line || a.ch - b.ch }\n\n  function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }\n\n  function copyPos(x) {return Pos(x.line, x.ch)}\n  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }\n  function minPos(a, b) { return cmp(a, b) < 0 ? a : b }\n\n  // Most of the external API clips given positions to make sure they\n  // actually exist within the document.\n  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}\n  function clipPos(doc, pos) {\n    if (pos.line < doc.first) { return Pos(doc.first, 0) }\n    var last = doc.first + doc.size - 1;\n    if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }\n    return clipToLen(pos, getLine(doc, pos.line).text.length)\n  }\n  function clipToLen(pos, linelen) {\n    var ch = pos.ch;\n    if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }\n    else if (ch < 0) { return Pos(pos.line, 0) }\n    else { return pos }\n  }\n  function clipPosArray(doc, array) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }\n    return out\n  }\n\n  var SavedContext = function(state, lookAhead) {\n    this.state = state;\n    this.lookAhead = lookAhead;\n  };\n\n  var Context = function(doc, state, line, lookAhead) {\n    this.state = state;\n    this.doc = doc;\n    this.line = line;\n    this.maxLookAhead = lookAhead || 0;\n    this.baseTokens = null;\n    this.baseTokenPos = 1;\n  };\n\n  Context.prototype.lookAhead = function (n) {\n    var line = this.doc.getLine(this.line + n);\n    if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }\n    return line\n  };\n\n  Context.prototype.baseToken = function (n) {\n    if (!this.baseTokens) { return null }\n    while (this.baseTokens[this.baseTokenPos] <= n)\n      { this.baseTokenPos += 2; }\n    var type = this.baseTokens[this.baseTokenPos + 1];\n    return {type: type && type.replace(/( |^)overlay .*/, \"\"),\n            size: this.baseTokens[this.baseTokenPos] - n}\n  };\n\n  Context.prototype.nextLine = function () {\n    this.line++;\n    if (this.maxLookAhead > 0) { this.maxLookAhead--; }\n  };\n\n  Context.fromSaved = function (doc, saved, line) {\n    if (saved instanceof SavedContext)\n      { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }\n    else\n      { return new Context(doc, copyState(doc.mode, saved), line) }\n  };\n\n  Context.prototype.save = function (copy) {\n    var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;\n    return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state\n  };\n\n\n  // Compute a style array (an array starting with a mode generation\n  // -- for invalidation -- followed by pairs of end positions and\n  // style strings), which is used to highlight the tokens on the\n  // line.\n  function highlightLine(cm, line, context, forceToEnd) {\n    // A styles array always starts with a number identifying the\n    // mode/overlays that it is based on (for easy invalidation).\n    var st = [cm.state.modeGen], lineClasses = {};\n    // Compute the base array of styles\n    runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },\n            lineClasses, forceToEnd);\n    var state = context.state;\n\n    // Run overlays, adjust style array.\n    var loop = function ( o ) {\n      context.baseTokens = st;\n      var overlay = cm.state.overlays[o], i = 1, at = 0;\n      context.state = true;\n      runMode(cm, line.text, overlay.mode, context, function (end, style) {\n        var start = i;\n        // Ensure there's a token end at the current position, and that i points at it\n        while (at < end) {\n          var i_end = st[i];\n          if (i_end > end)\n            { st.splice(i, 1, end, st[i+1], i_end); }\n          i += 2;\n          at = Math.min(end, i_end);\n        }\n        if (!style) { return }\n        if (overlay.opaque) {\n          st.splice(start, i - start, end, \"overlay \" + style);\n          i = start + 2;\n        } else {\n          for (; start < i; start += 2) {\n            var cur = st[start+1];\n            st[start+1] = (cur ? cur + \" \" : \"\") + \"overlay \" + style;\n          }\n        }\n      }, lineClasses);\n      context.state = state;\n      context.baseTokens = null;\n      context.baseTokenPos = 1;\n    };\n\n    for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );\n\n    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}\n  }\n\n  function getLineStyles(cm, line, updateFrontier) {\n    if (!line.styles || line.styles[0] != cm.state.modeGen) {\n      var context = getContextBefore(cm, lineNo(line));\n      var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);\n      var result = highlightLine(cm, line, context);\n      if (resetState) { context.state = resetState; }\n      line.stateAfter = context.save(!resetState);\n      line.styles = result.styles;\n      if (result.classes) { line.styleClasses = result.classes; }\n      else if (line.styleClasses) { line.styleClasses = null; }\n      if (updateFrontier === cm.doc.highlightFrontier)\n        { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }\n    }\n    return line.styles\n  }\n\n  function getContextBefore(cm, n, precise) {\n    var doc = cm.doc, display = cm.display;\n    if (!doc.mode.startState) { return new Context(doc, true, n) }\n    var start = findStartLine(cm, n, precise);\n    var saved = start > doc.first && getLine(doc, start - 1).stateAfter;\n    var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);\n\n    doc.iter(start, n, function (line) {\n      processLine(cm, line.text, context);\n      var pos = context.line;\n      line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;\n      context.nextLine();\n    });\n    if (precise) { doc.modeFrontier = context.line; }\n    return context\n  }\n\n  // Lightweight form of highlight -- proceed over this line and\n  // update state, but don't save a style array. Used for lines that\n  // aren't currently visible.\n  function processLine(cm, text, context, startAt) {\n    var mode = cm.doc.mode;\n    var stream = new StringStream(text, cm.options.tabSize, context);\n    stream.start = stream.pos = startAt || 0;\n    if (text == \"\") { callBlankLine(mode, context.state); }\n    while (!stream.eol()) {\n      readToken(mode, stream, context.state);\n      stream.start = stream.pos;\n    }\n  }\n\n  function callBlankLine(mode, state) {\n    if (mode.blankLine) { return mode.blankLine(state) }\n    if (!mode.innerMode) { return }\n    var inner = innerMode(mode, state);\n    if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }\n  }\n\n  function readToken(mode, stream, state, inner) {\n    for (var i = 0; i < 10; i++) {\n      if (inner) { inner[0] = innerMode(mode, state).mode; }\n      var style = mode.token(stream, state);\n      if (stream.pos > stream.start) { return style }\n    }\n    throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\")\n  }\n\n  var Token = function(stream, type, state) {\n    this.start = stream.start; this.end = stream.pos;\n    this.string = stream.current();\n    this.type = type || null;\n    this.state = state;\n  };\n\n  // Utility for getTokenAt and getLineTokens\n  function takeToken(cm, pos, precise, asArray) {\n    var doc = cm.doc, mode = doc.mode, style;\n    pos = clipPos(doc, pos);\n    var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);\n    var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;\n    if (asArray) { tokens = []; }\n    while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n      stream.start = stream.pos;\n      style = readToken(mode, stream, context.state);\n      if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }\n    }\n    return asArray ? tokens : new Token(stream, style, context.state)\n  }\n\n  function extractLineClasses(type, output) {\n    if (type) { for (;;) {\n      var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n      if (!lineClass) { break }\n      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n      var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n      if (output[prop] == null)\n        { output[prop] = lineClass[2]; }\n      else if (!(new RegExp(\"(?:^|\\\\s)\" + lineClass[2] + \"(?:$|\\\\s)\")).test(output[prop]))\n        { output[prop] += \" \" + lineClass[2]; }\n    } }\n    return type\n  }\n\n  // Run the given mode's parser over a line, calling f for each token.\n  function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {\n    var flattenSpans = mode.flattenSpans;\n    if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }\n    var curStart = 0, curStyle = null;\n    var stream = new StringStream(text, cm.options.tabSize, context), style;\n    var inner = cm.options.addModeClass && [null];\n    if (text == \"\") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }\n    while (!stream.eol()) {\n      if (stream.pos > cm.options.maxHighlightLength) {\n        flattenSpans = false;\n        if (forceToEnd) { processLine(cm, text, context, stream.pos); }\n        stream.pos = text.length;\n        style = null;\n      } else {\n        style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);\n      }\n      if (inner) {\n        var mName = inner[0].name;\n        if (mName) { style = \"m-\" + (style ? mName + \" \" + style : mName); }\n      }\n      if (!flattenSpans || curStyle != style) {\n        while (curStart < stream.start) {\n          curStart = Math.min(stream.start, curStart + 5000);\n          f(curStart, curStyle);\n        }\n        curStyle = style;\n      }\n      stream.start = stream.pos;\n    }\n    while (curStart < stream.pos) {\n      // Webkit seems to refuse to render text nodes longer than 57444\n      // characters, and returns inaccurate measurements in nodes\n      // starting around 5000 chars.\n      var pos = Math.min(stream.pos, curStart + 5000);\n      f(pos, curStyle);\n      curStart = pos;\n    }\n  }\n\n  // Finds the line to start with when starting a parse. Tries to\n  // find a line with a stateAfter, so that it can start with a\n  // valid state. If that fails, it returns the line with the\n  // smallest indentation, which tends to need the least context to\n  // parse correctly.\n  function findStartLine(cm, n, precise) {\n    var minindent, minline, doc = cm.doc;\n    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n    for (var search = n; search > lim; --search) {\n      if (search <= doc.first) { return doc.first }\n      var line = getLine(doc, search - 1), after = line.stateAfter;\n      if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))\n        { return search }\n      var indented = countColumn(line.text, null, cm.options.tabSize);\n      if (minline == null || minindent > indented) {\n        minline = search - 1;\n        minindent = indented;\n      }\n    }\n    return minline\n  }\n\n  function retreatFrontier(doc, n) {\n    doc.modeFrontier = Math.min(doc.modeFrontier, n);\n    if (doc.highlightFrontier < n - 10) { return }\n    var start = doc.first;\n    for (var line = n - 1; line > start; line--) {\n      var saved = getLine(doc, line).stateAfter;\n      // change is on 3\n      // state on line 1 looked ahead 2 -- so saw 3\n      // test 1 + 2 < 3 should cover this\n      if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {\n        start = line + 1;\n        break\n      }\n    }\n    doc.highlightFrontier = Math.min(doc.highlightFrontier, start);\n  }\n\n  // Optimize some code when these features are not used.\n  var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n  function seeReadOnlySpans() {\n    sawReadOnlySpans = true;\n  }\n\n  function seeCollapsedSpans() {\n    sawCollapsedSpans = true;\n  }\n\n  // TEXTMARKER SPANS\n\n  function MarkedSpan(marker, from, to) {\n    this.marker = marker;\n    this.from = from; this.to = to;\n  }\n\n  // Search an array of spans for a span matching the given marker.\n  function getMarkedSpanFor(spans, marker) {\n    if (spans) { for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.marker == marker) { return span }\n    } }\n  }\n\n  // Remove a span from an array, returning undefined if no spans are\n  // left (we don't store arrays for lines without spans).\n  function removeMarkedSpan(spans, span) {\n    var r;\n    for (var i = 0; i < spans.length; ++i)\n      { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }\n    return r\n  }\n\n  // Add a span to a line.\n  function addMarkedSpan(line, span, op) {\n    var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet));\n    if (inThisOp && inThisOp.has(line.markedSpans)) {\n      line.markedSpans.push(span);\n    } else {\n      line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n      if (inThisOp) { inThisOp.add(line.markedSpans); }\n    }\n    span.marker.attachLine(line);\n  }\n\n  // Used for the algorithm that adjusts markers for a change in the\n  // document. These functions cut an array of spans at a given\n  // character position, returning an array of remaining chunks (or\n  // undefined if nothing remains).\n  function markedSpansBefore(old, startCh, isInsert) {\n    var nw;\n    if (old) { for (var i = 0; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n      if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)\n        ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n      }\n    } }\n    return nw\n  }\n  function markedSpansAfter(old, endCh, isInsert) {\n    var nw;\n    if (old) { for (var i = 0; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n      if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)\n        ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n                                              span.to == null ? null : span.to - endCh));\n      }\n    } }\n    return nw\n  }\n\n  // Given a change object, compute the new set of marker spans that\n  // cover the line in which the change took place. Removes spans\n  // entirely within the change, reconnects spans belonging to the\n  // same marker that appear on both sides of the change, and cuts off\n  // spans partially within the change. Returns an array of span\n  // arrays with one element for each line in (after) the change.\n  function stretchSpansOverChange(doc, change) {\n    if (change.full) { return null }\n    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n    if (!oldFirst && !oldLast) { return null }\n\n    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n    // Get the spans that 'stick out' on both sides\n    var first = markedSpansBefore(oldFirst, startCh, isInsert);\n    var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n    // Next, merge those two ends\n    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n    if (first) {\n      // Fix up .to properties of first\n      for (var i = 0; i < first.length; ++i) {\n        var span = first[i];\n        if (span.to == null) {\n          var found = getMarkedSpanFor(last, span.marker);\n          if (!found) { span.to = startCh; }\n          else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }\n        }\n      }\n    }\n    if (last) {\n      // Fix up .from in last (or move them into first in case of sameLine)\n      for (var i$1 = 0; i$1 < last.length; ++i$1) {\n        var span$1 = last[i$1];\n        if (span$1.to != null) { span$1.to += offset; }\n        if (span$1.from == null) {\n          var found$1 = getMarkedSpanFor(first, span$1.marker);\n          if (!found$1) {\n            span$1.from = offset;\n            if (sameLine) { (first || (first = [])).push(span$1); }\n          }\n        } else {\n          span$1.from += offset;\n          if (sameLine) { (first || (first = [])).push(span$1); }\n        }\n      }\n    }\n    // Make sure we didn't create any zero-length spans\n    if (first) { first = clearEmptySpans(first); }\n    if (last && last != first) { last = clearEmptySpans(last); }\n\n    var newMarkers = [first];\n    if (!sameLine) {\n      // Fill gap with whole-line-spans\n      var gap = change.text.length - 2, gapMarkers;\n      if (gap > 0 && first)\n        { for (var i$2 = 0; i$2 < first.length; ++i$2)\n          { if (first[i$2].to == null)\n            { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }\n      for (var i$3 = 0; i$3 < gap; ++i$3)\n        { newMarkers.push(gapMarkers); }\n      newMarkers.push(last);\n    }\n    return newMarkers\n  }\n\n  // Remove spans that are empty and don't have a clearWhenEmpty\n  // option of false.\n  function clearEmptySpans(spans) {\n    for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n        { spans.splice(i--, 1); }\n    }\n    if (!spans.length) { return null }\n    return spans\n  }\n\n  // Used to 'clip' out readOnly ranges when making a change.\n  function removeReadOnlyRanges(doc, from, to) {\n    var markers = null;\n    doc.iter(from.line, to.line + 1, function (line) {\n      if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n        var mark = line.markedSpans[i].marker;\n        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n          { (markers || (markers = [])).push(mark); }\n      } }\n    });\n    if (!markers) { return null }\n    var parts = [{from: from, to: to}];\n    for (var i = 0; i < markers.length; ++i) {\n      var mk = markers[i], m = mk.find(0);\n      for (var j = 0; j < parts.length; ++j) {\n        var p = parts[j];\n        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }\n        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n          { newParts.push({from: p.from, to: m.from}); }\n        if (dto > 0 || !mk.inclusiveRight && !dto)\n          { newParts.push({from: m.to, to: p.to}); }\n        parts.splice.apply(parts, newParts);\n        j += newParts.length - 3;\n      }\n    }\n    return parts\n  }\n\n  // Connect or disconnect spans from a line.\n  function detachMarkedSpans(line) {\n    var spans = line.markedSpans;\n    if (!spans) { return }\n    for (var i = 0; i < spans.length; ++i)\n      { spans[i].marker.detachLine(line); }\n    line.markedSpans = null;\n  }\n  function attachMarkedSpans(line, spans) {\n    if (!spans) { return }\n    for (var i = 0; i < spans.length; ++i)\n      { spans[i].marker.attachLine(line); }\n    line.markedSpans = spans;\n  }\n\n  // Helpers used when computing which overlapping collapsed span\n  // counts as the larger one.\n  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }\n  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }\n\n  // Returns a number indicating which of two overlapping collapsed\n  // spans is larger (and thus includes the other). Falls back to\n  // comparing ids when the spans cover exactly the same range.\n  function compareCollapsedMarkers(a, b) {\n    var lenDiff = a.lines.length - b.lines.length;\n    if (lenDiff != 0) { return lenDiff }\n    var aPos = a.find(), bPos = b.find();\n    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n    if (fromCmp) { return -fromCmp }\n    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n    if (toCmp) { return toCmp }\n    return b.id - a.id\n  }\n\n  // Find out whether a line ends or starts in a collapsed span. If\n  // so, return the marker for that span.\n  function collapsedSpanAtSide(line, start) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n        { found = sp.marker; }\n    } }\n    return found\n  }\n  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }\n  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }\n\n  function collapsedSpanAround(line, ch) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) { for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }\n    } }\n    return found\n  }\n\n  // Test whether there exists a collapsed span that partially\n  // overlaps (covers the start or end, but not both) of a new span.\n  // Such overlap is not allowed.\n  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n    var line = getLine(doc, lineNo);\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) { for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (!sp.marker.collapsed) { continue }\n      var found = sp.marker.find(0);\n      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }\n      if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||\n          fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))\n        { return true }\n    } }\n  }\n\n  // A visual line is a line as drawn on the screen. Folding, for\n  // example, can cause multiple logical lines to appear on the same\n  // visual line. This finds the start of the visual line that the\n  // given line is part of (usually that is the line itself).\n  function visualLine(line) {\n    var merged;\n    while (merged = collapsedSpanAtStart(line))\n      { line = merged.find(-1, true).line; }\n    return line\n  }\n\n  function visualLineEnd(line) {\n    var merged;\n    while (merged = collapsedSpanAtEnd(line))\n      { line = merged.find(1, true).line; }\n    return line\n  }\n\n  // Returns an array of logical lines that continue the visual line\n  // started by the argument, or undefined if there are no such lines.\n  function visualLineContinued(line) {\n    var merged, lines;\n    while (merged = collapsedSpanAtEnd(line)) {\n      line = merged.find(1, true).line\n      ;(lines || (lines = [])).push(line);\n    }\n    return lines\n  }\n\n  // Get the line number of the start of the visual line that the\n  // given line number is part of.\n  function visualLineNo(doc, lineN) {\n    var line = getLine(doc, lineN), vis = visualLine(line);\n    if (line == vis) { return lineN }\n    return lineNo(vis)\n  }\n\n  // Get the line number of the start of the next visual line after\n  // the given line.\n  function visualLineEndNo(doc, lineN) {\n    if (lineN > doc.lastLine()) { return lineN }\n    var line = getLine(doc, lineN), merged;\n    if (!lineIsHidden(doc, line)) { return lineN }\n    while (merged = collapsedSpanAtEnd(line))\n      { line = merged.find(1, true).line; }\n    return lineNo(line) + 1\n  }\n\n  // Compute whether a line is hidden. Lines count as hidden when they\n  // are part of a visual line that starts with another line, or when\n  // they are entirely covered by collapsed, non-widget span.\n  function lineIsHidden(doc, line) {\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (!sp.marker.collapsed) { continue }\n      if (sp.from == null) { return true }\n      if (sp.marker.widgetNode) { continue }\n      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n        { return true }\n    } }\n  }\n  function lineIsHiddenInner(doc, line, span) {\n    if (span.to == null) {\n      var end = span.marker.find(1, true);\n      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))\n    }\n    if (span.marker.inclusiveRight && span.to == line.text.length)\n      { return true }\n    for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {\n      sp = line.markedSpans[i];\n      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n          (sp.to == null || sp.to != span.from) &&\n          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n          lineIsHiddenInner(doc, line, sp)) { return true }\n    }\n  }\n\n  // Find the height above the given line.\n  function heightAtLine(lineObj) {\n    lineObj = visualLine(lineObj);\n\n    var h = 0, chunk = lineObj.parent;\n    for (var i = 0; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i];\n      if (line == lineObj) { break }\n      else { h += line.height; }\n    }\n    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n      for (var i$1 = 0; i$1 < p.children.length; ++i$1) {\n        var cur = p.children[i$1];\n        if (cur == chunk) { break }\n        else { h += cur.height; }\n      }\n    }\n    return h\n  }\n\n  // Compute the character length of a line, taking into account\n  // collapsed ranges (see markText) that might hide parts, and join\n  // other lines onto it.\n  function lineLength(line) {\n    if (line.height == 0) { return 0 }\n    var len = line.text.length, merged, cur = line;\n    while (merged = collapsedSpanAtStart(cur)) {\n      var found = merged.find(0, true);\n      cur = found.from.line;\n      len += found.from.ch - found.to.ch;\n    }\n    cur = line;\n    while (merged = collapsedSpanAtEnd(cur)) {\n      var found$1 = merged.find(0, true);\n      len -= cur.text.length - found$1.from.ch;\n      cur = found$1.to.line;\n      len += cur.text.length - found$1.to.ch;\n    }\n    return len\n  }\n\n  // Find the longest line in the document.\n  function findMaxLine(cm) {\n    var d = cm.display, doc = cm.doc;\n    d.maxLine = getLine(doc, doc.first);\n    d.maxLineLength = lineLength(d.maxLine);\n    d.maxLineChanged = true;\n    doc.iter(function (line) {\n      var len = lineLength(line);\n      if (len > d.maxLineLength) {\n        d.maxLineLength = len;\n        d.maxLine = line;\n      }\n    });\n  }\n\n  // LINE DATA STRUCTURE\n\n  // Line objects. These hold state related to a line, including\n  // highlighting info (the styles array).\n  var Line = function(text, markedSpans, estimateHeight) {\n    this.text = text;\n    attachMarkedSpans(this, markedSpans);\n    this.height = estimateHeight ? estimateHeight(this) : 1;\n  };\n\n  Line.prototype.lineNo = function () { return lineNo(this) };\n  eventMixin(Line);\n\n  // Change the content (text, markers) of a line. Automatically\n  // invalidates cached information and tries to re-estimate the\n  // line's height.\n  function updateLine(line, text, markedSpans, estimateHeight) {\n    line.text = text;\n    if (line.stateAfter) { line.stateAfter = null; }\n    if (line.styles) { line.styles = null; }\n    if (line.order != null) { line.order = null; }\n    detachMarkedSpans(line);\n    attachMarkedSpans(line, markedSpans);\n    var estHeight = estimateHeight ? estimateHeight(line) : 1;\n    if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n  }\n\n  // Detach a line from the document tree and its markers.\n  function cleanUpLine(line) {\n    line.parent = null;\n    detachMarkedSpans(line);\n  }\n\n  // Convert a style as returned by a mode (either null, or a string\n  // containing one or more styles) to a CSS style. This is cached,\n  // and also looks for line-wide styles.\n  var styleToClassCache = {}, styleToClassCacheWithMode = {};\n  function interpretTokenStyle(style, options) {\n    if (!style || /^\\s*$/.test(style)) { return null }\n    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n    return cache[style] ||\n      (cache[style] = style.replace(/\\S+/g, \"cm-$&\"))\n  }\n\n  // Render the DOM representation of the text of a line. Also builds\n  // up a 'line map', which points at the DOM nodes that represent\n  // specific stretches of text, and is used by the measuring code.\n  // The returned object contains the DOM node, this map, and\n  // information about line-wide styles that were set by the mode.\n  function buildLineContent(cm, lineView) {\n    // The padding-right forces the element to have a 'border', which\n    // is needed on Webkit to be able to get line-level bounding\n    // rectangles for it (in measureChar).\n    var content = eltP(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n    var builder = {pre: eltP(\"pre\", [content], \"CodeMirror-line\"), content: content,\n                   col: 0, pos: 0, cm: cm,\n                   trailingSpace: false,\n                   splitSpaces: cm.getOption(\"lineWrapping\")};\n    lineView.measure = {};\n\n    // Iterate over the logical lines that make up this visual line.\n    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n      var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);\n      builder.pos = 0;\n      builder.addToken = buildToken;\n      // Optionally wire in some hacks into the token-rendering\n      // algorithm, to deal with browser quirks.\n      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))\n        { builder.addToken = buildTokenBadBidi(builder.addToken, order); }\n      builder.map = [];\n      var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);\n      insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));\n      if (line.styleClasses) {\n        if (line.styleClasses.bgClass)\n          { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\"); }\n        if (line.styleClasses.textClass)\n          { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\"); }\n      }\n\n      // Ensure at least a single node is present, for measuring.\n      if (builder.map.length == 0)\n        { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }\n\n      // Store the map and a cache object for the current logical line\n      if (i == 0) {\n        lineView.measure.map = builder.map;\n        lineView.measure.cache = {};\n      } else {\n  (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)\n        ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});\n      }\n    }\n\n    // See issue #2901\n    if (webkit) {\n      var last = builder.content.lastChild;\n      if (/\\bcm-tab\\b/.test(last.className) || (last.querySelector && last.querySelector(\".cm-tab\")))\n        { builder.content.className = \"cm-tab-wrap-hack\"; }\n    }\n\n    signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n    if (builder.pre.className)\n      { builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\"); }\n\n    return builder\n  }\n\n  function defaultSpecialCharPlaceholder(ch) {\n    var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n    token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n    token.setAttribute(\"aria-label\", token.title);\n    return token\n  }\n\n  // Build up the DOM representation for a single token, and add it to\n  // the line map. Takes care to render special characters separately.\n  function buildToken(builder, text, style, startStyle, endStyle, css, attributes) {\n    if (!text) { return }\n    var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;\n    var special = builder.cm.state.specialChars, mustWrap = false;\n    var content;\n    if (!special.test(text)) {\n      builder.col += text.length;\n      content = document.createTextNode(displayText);\n      builder.map.push(builder.pos, builder.pos + text.length, content);\n      if (ie && ie_version < 9) { mustWrap = true; }\n      builder.pos += text.length;\n    } else {\n      content = document.createDocumentFragment();\n      var pos = 0;\n      while (true) {\n        special.lastIndex = pos;\n        var m = special.exec(text);\n        var skipped = m ? m.index - pos : text.length - pos;\n        if (skipped) {\n          var txt = document.createTextNode(displayText.slice(pos, pos + skipped));\n          if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt])); }\n          else { content.appendChild(txt); }\n          builder.map.push(builder.pos, builder.pos + skipped, txt);\n          builder.col += skipped;\n          builder.pos += skipped;\n        }\n        if (!m) { break }\n        pos += skipped + 1;\n        var txt$1 = (void 0);\n        if (m[0] == \"\\t\") {\n          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n          txt$1 = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n          txt$1.setAttribute(\"role\", \"presentation\");\n          txt$1.setAttribute(\"cm-text\", \"\\t\");\n          builder.col += tabWidth;\n        } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n          txt$1 = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"));\n          txt$1.setAttribute(\"cm-text\", m[0]);\n          builder.col += 1;\n        } else {\n          txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);\n          txt$1.setAttribute(\"cm-text\", m[0]);\n          if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt$1])); }\n          else { content.appendChild(txt$1); }\n          builder.col += 1;\n        }\n        builder.map.push(builder.pos, builder.pos + 1, txt$1);\n        builder.pos++;\n      }\n    }\n    builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;\n    if (style || startStyle || endStyle || mustWrap || css || attributes) {\n      var fullStyle = style || \"\";\n      if (startStyle) { fullStyle += startStyle; }\n      if (endStyle) { fullStyle += endStyle; }\n      var token = elt(\"span\", [content], fullStyle, css);\n      if (attributes) {\n        for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != \"style\" && attr != \"class\")\n          { token.setAttribute(attr, attributes[attr]); } }\n      }\n      return builder.content.appendChild(token)\n    }\n    builder.content.appendChild(content);\n  }\n\n  // Change some spaces to NBSP to prevent the browser from collapsing\n  // trailing spaces at the end of a line when rendering text (issue #1362).\n  function splitSpaces(text, trailingBefore) {\n    if (text.length > 1 && !/  /.test(text)) { return text }\n    var spaceBefore = trailingBefore, result = \"\";\n    for (var i = 0; i < text.length; i++) {\n      var ch = text.charAt(i);\n      if (ch == \" \" && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))\n        { ch = \"\\u00a0\"; }\n      result += ch;\n      spaceBefore = ch == \" \";\n    }\n    return result\n  }\n\n  // Work around nonsense dimensions being reported for stretches of\n  // right-to-left text.\n  function buildTokenBadBidi(inner, order) {\n    return function (builder, text, style, startStyle, endStyle, css, attributes) {\n      style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n      var start = builder.pos, end = start + text.length;\n      for (;;) {\n        // Find the part that overlaps with the start of this text\n        var part = (void 0);\n        for (var i = 0; i < order.length; i++) {\n          part = order[i];\n          if (part.to > start && part.from <= start) { break }\n        }\n        if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }\n        inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);\n        startStyle = null;\n        text = text.slice(part.to - start);\n        start = part.to;\n      }\n    }\n  }\n\n  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n    var widget = !ignoreWidget && marker.widgetNode;\n    if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }\n    if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {\n      if (!widget)\n        { widget = builder.content.appendChild(document.createElement(\"span\")); }\n      widget.setAttribute(\"cm-marker\", marker.id);\n    }\n    if (widget) {\n      builder.cm.display.input.setUneditable(widget);\n      builder.content.appendChild(widget);\n    }\n    builder.pos += size;\n    builder.trailingSpace = false;\n  }\n\n  // Outputs a number of spans to make up a line, taking highlighting\n  // and marked text into account.\n  function insertLineContent(line, builder, styles) {\n    var spans = line.markedSpans, allText = line.text, at = 0;\n    if (!spans) {\n      for (var i$1 = 1; i$1 < styles.length; i$1+=2)\n        { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }\n      return\n    }\n\n    var len = allText.length, pos = 0, i = 1, text = \"\", style, css;\n    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;\n    for (;;) {\n      if (nextChange == pos) { // Update current marker set\n        spanStyle = spanEndStyle = spanStartStyle = css = \"\";\n        attributes = null;\n        collapsed = null; nextChange = Infinity;\n        var foundBookmarks = [], endStyles = (void 0);\n        for (var j = 0; j < spans.length; ++j) {\n          var sp = spans[j], m = sp.marker;\n          if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n            foundBookmarks.push(m);\n          } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n            if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n              nextChange = sp.to;\n              spanEndStyle = \"\";\n            }\n            if (m.className) { spanStyle += \" \" + m.className; }\n            if (m.css) { css = (css ? css + \";\" : \"\") + m.css; }\n            if (m.startStyle && sp.from == pos) { spanStartStyle += \" \" + m.startStyle; }\n            if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }\n            // support for the old title property\n            // https://github.com/codemirror/CodeMirror/pull/5673\n            if (m.title) { (attributes || (attributes = {})).title = m.title; }\n            if (m.attributes) {\n              for (var attr in m.attributes)\n                { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }\n            }\n            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n              { collapsed = sp; }\n          } else if (sp.from > pos && nextChange > sp.from) {\n            nextChange = sp.from;\n          }\n        }\n        if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)\n          { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += \" \" + endStyles[j$1]; } } }\n\n        if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)\n          { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }\n        if (collapsed && (collapsed.from || 0) == pos) {\n          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n                             collapsed.marker, collapsed.from == null);\n          if (collapsed.to == null) { return }\n          if (collapsed.to == pos) { collapsed = false; }\n        }\n      }\n      if (pos >= len) { break }\n\n      var upto = Math.min(len, nextChange);\n      while (true) {\n        if (text) {\n          var end = pos + text.length;\n          if (!collapsed) {\n            var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", css, attributes);\n          }\n          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}\n          pos = end;\n          spanStartStyle = \"\";\n        }\n        text = allText.slice(at, at = styles[i++]);\n        style = interpretTokenStyle(styles[i++], builder.cm.options);\n      }\n    }\n  }\n\n\n  // These objects are used to represent the visible (currently drawn)\n  // part of the document. A LineView may correspond to multiple\n  // logical lines, if those are connected by collapsed ranges.\n  function LineView(doc, line, lineN) {\n    // The starting line\n    this.line = line;\n    // Continuing lines, if any\n    this.rest = visualLineContinued(line);\n    // Number of logical lines in this visual line\n    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n    this.node = this.text = null;\n    this.hidden = lineIsHidden(doc, line);\n  }\n\n  // Create a range of LineView objects for the given lines.\n  function buildViewArray(cm, from, to) {\n    var array = [], nextPos;\n    for (var pos = from; pos < to; pos = nextPos) {\n      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n      nextPos = pos + view.size;\n      array.push(view);\n    }\n    return array\n  }\n\n  var operationGroup = null;\n\n  function pushOperation(op) {\n    if (operationGroup) {\n      operationGroup.ops.push(op);\n    } else {\n      op.ownsGroup = operationGroup = {\n        ops: [op],\n        delayedCallbacks: []\n      };\n    }\n  }\n\n  function fireCallbacksForOps(group) {\n    // Calls delayed callbacks and cursorActivity handlers until no\n    // new ones appear\n    var callbacks = group.delayedCallbacks, i = 0;\n    do {\n      for (; i < callbacks.length; i++)\n        { callbacks[i].call(null); }\n      for (var j = 0; j < group.ops.length; j++) {\n        var op = group.ops[j];\n        if (op.cursorActivityHandlers)\n          { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n            { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }\n      }\n    } while (i < callbacks.length)\n  }\n\n  function finishOperation(op, endCb) {\n    var group = op.ownsGroup;\n    if (!group) { return }\n\n    try { fireCallbacksForOps(group); }\n    finally {\n      operationGroup = null;\n      endCb(group);\n    }\n  }\n\n  var orphanDelayedCallbacks = null;\n\n  // Often, we want to signal events at a point where we are in the\n  // middle of some work, but don't want the handler to start calling\n  // other methods on the editor, which might be in an inconsistent\n  // state or simply not expect any other events to happen.\n  // signalLater looks whether there are any handlers, and schedules\n  // them to be executed when the last operation ends, or, if no\n  // operation is active, when a timeout fires.\n  function signalLater(emitter, type /*, values...*/) {\n    var arr = getHandlers(emitter, type);\n    if (!arr.length) { return }\n    var args = Array.prototype.slice.call(arguments, 2), list;\n    if (operationGroup) {\n      list = operationGroup.delayedCallbacks;\n    } else if (orphanDelayedCallbacks) {\n      list = orphanDelayedCallbacks;\n    } else {\n      list = orphanDelayedCallbacks = [];\n      setTimeout(fireOrphanDelayed, 0);\n    }\n    var loop = function ( i ) {\n      list.push(function () { return arr[i].apply(null, args); });\n    };\n\n    for (var i = 0; i < arr.length; ++i)\n      loop( i );\n  }\n\n  function fireOrphanDelayed() {\n    var delayed = orphanDelayedCallbacks;\n    orphanDelayedCallbacks = null;\n    for (var i = 0; i < delayed.length; ++i) { delayed[i](); }\n  }\n\n  // When an aspect of a line changes, a string is added to\n  // lineView.changes. This updates the relevant part of the line's\n  // DOM structure.\n  function updateLineForChanges(cm, lineView, lineN, dims) {\n    for (var j = 0; j < lineView.changes.length; j++) {\n      var type = lineView.changes[j];\n      if (type == \"text\") { updateLineText(cm, lineView); }\n      else if (type == \"gutter\") { updateLineGutter(cm, lineView, lineN, dims); }\n      else if (type == \"class\") { updateLineClasses(cm, lineView); }\n      else if (type == \"widget\") { updateLineWidgets(cm, lineView, dims); }\n    }\n    lineView.changes = null;\n  }\n\n  // Lines with gutter elements, widgets or a background class need to\n  // be wrapped, and have the extra elements added to the wrapper div\n  function ensureLineWrapped(lineView) {\n    if (lineView.node == lineView.text) {\n      lineView.node = elt(\"div\", null, null, \"position: relative\");\n      if (lineView.text.parentNode)\n        { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }\n      lineView.node.appendChild(lineView.text);\n      if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }\n    }\n    return lineView.node\n  }\n\n  function updateLineBackground(cm, lineView) {\n    var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n    if (cls) { cls += \" CodeMirror-linebackground\"; }\n    if (lineView.background) {\n      if (cls) { lineView.background.className = cls; }\n      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n    } else if (cls) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n      cm.display.input.setUneditable(lineView.background);\n    }\n  }\n\n  // Wrapper around buildLineContent which will reuse the structure\n  // in display.externalMeasured when possible.\n  function getLineContent(cm, lineView) {\n    var ext = cm.display.externalMeasured;\n    if (ext && ext.line == lineView.line) {\n      cm.display.externalMeasured = null;\n      lineView.measure = ext.measure;\n      return ext.built\n    }\n    return buildLineContent(cm, lineView)\n  }\n\n  // Redraw the line's text. Interacts with the background and text\n  // classes because the mode may output tokens that influence these\n  // classes.\n  function updateLineText(cm, lineView) {\n    var cls = lineView.text.className;\n    var built = getLineContent(cm, lineView);\n    if (lineView.text == lineView.node) { lineView.node = built.pre; }\n    lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n    lineView.text = built.pre;\n    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n      lineView.bgClass = built.bgClass;\n      lineView.textClass = built.textClass;\n      updateLineClasses(cm, lineView);\n    } else if (cls) {\n      lineView.text.className = cls;\n    }\n  }\n\n  function updateLineClasses(cm, lineView) {\n    updateLineBackground(cm, lineView);\n    if (lineView.line.wrapClass)\n      { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }\n    else if (lineView.node != lineView.text)\n      { lineView.node.className = \"\"; }\n    var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n    lineView.text.className = textClass || \"\";\n  }\n\n  function updateLineGutter(cm, lineView, lineN, dims) {\n    if (lineView.gutter) {\n      lineView.node.removeChild(lineView.gutter);\n      lineView.gutter = null;\n    }\n    if (lineView.gutterBackground) {\n      lineView.node.removeChild(lineView.gutterBackground);\n      lineView.gutterBackground = null;\n    }\n    if (lineView.line.gutterClass) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.gutterBackground = elt(\"div\", null, \"CodeMirror-gutter-background \" + lineView.line.gutterClass,\n                                      (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px; width: \" + (dims.gutterTotalWidth) + \"px\"));\n      cm.display.input.setUneditable(lineView.gutterBackground);\n      wrap.insertBefore(lineView.gutterBackground, lineView.text);\n    }\n    var markers = lineView.line.gutterMarkers;\n    if (cm.options.lineNumbers || markers) {\n      var wrap$1 = ensureLineWrapped(lineView);\n      var gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"));\n      gutterWrap.setAttribute(\"aria-hidden\", \"true\");\n      cm.display.input.setUneditable(gutterWrap);\n      wrap$1.insertBefore(gutterWrap, lineView.text);\n      if (lineView.line.gutterClass)\n        { gutterWrap.className += \" \" + lineView.line.gutterClass; }\n      if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n        { lineView.lineNumber = gutterWrap.appendChild(\n          elt(\"div\", lineNumberFor(cm.options, lineN),\n              \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n              (\"left: \" + (dims.gutterLeft[\"CodeMirror-linenumbers\"]) + \"px; width: \" + (cm.display.lineNumInnerWidth) + \"px\"))); }\n      if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {\n        var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];\n        if (found)\n          { gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\",\n                                     (\"left: \" + (dims.gutterLeft[id]) + \"px; width: \" + (dims.gutterWidth[id]) + \"px\"))); }\n      } }\n    }\n  }\n\n  function updateLineWidgets(cm, lineView, dims) {\n    if (lineView.alignable) { lineView.alignable = null; }\n    var isWidget = classTest(\"CodeMirror-linewidget\");\n    for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {\n      next = node.nextSibling;\n      if (isWidget.test(node.className)) { lineView.node.removeChild(node); }\n    }\n    insertLineWidgets(cm, lineView, dims);\n  }\n\n  // Build a line's DOM representation from scratch\n  function buildLineElement(cm, lineView, lineN, dims) {\n    var built = getLineContent(cm, lineView);\n    lineView.text = lineView.node = built.pre;\n    if (built.bgClass) { lineView.bgClass = built.bgClass; }\n    if (built.textClass) { lineView.textClass = built.textClass; }\n\n    updateLineClasses(cm, lineView);\n    updateLineGutter(cm, lineView, lineN, dims);\n    insertLineWidgets(cm, lineView, dims);\n    return lineView.node\n  }\n\n  // A lineView may contain multiple logical lines (when merged by\n  // collapsed spans). The widgets for all of them need to be drawn.\n  function insertLineWidgets(cm, lineView, dims) {\n    insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);\n    if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n      { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }\n  }\n\n  function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {\n    if (!line.widgets) { return }\n    var wrap = ensureLineWrapped(lineView);\n    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n      var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\" + (widget.className ? \" \" + widget.className : \"\"));\n      if (!widget.handleMouseEvents) { node.setAttribute(\"cm-ignore-events\", \"true\"); }\n      positionLineWidget(widget, node, lineView, dims);\n      cm.display.input.setUneditable(node);\n      if (allowAbove && widget.above)\n        { wrap.insertBefore(node, lineView.gutter || lineView.text); }\n      else\n        { wrap.appendChild(node); }\n      signalLater(widget, \"redraw\");\n    }\n  }\n\n  function positionLineWidget(widget, node, lineView, dims) {\n    if (widget.noHScroll) {\n  (lineView.alignable || (lineView.alignable = [])).push(node);\n      var width = dims.wrapperWidth;\n      node.style.left = dims.fixedPos + \"px\";\n      if (!widget.coverGutter) {\n        width -= dims.gutterTotalWidth;\n        node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n      }\n      node.style.width = width + \"px\";\n    }\n    if (widget.coverGutter) {\n      node.style.zIndex = 5;\n      node.style.position = \"relative\";\n      if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + \"px\"; }\n    }\n  }\n\n  function widgetHeight(widget) {\n    if (widget.height != null) { return widget.height }\n    var cm = widget.doc.cm;\n    if (!cm) { return 0 }\n    if (!contains(document.body, widget.node)) {\n      var parentStyle = \"position: relative;\";\n      if (widget.coverGutter)\n        { parentStyle += \"margin-left: -\" + cm.display.gutters.offsetWidth + \"px;\"; }\n      if (widget.noHScroll)\n        { parentStyle += \"width: \" + cm.display.wrapper.clientWidth + \"px;\"; }\n      removeChildrenAndAdd(cm.display.measure, elt(\"div\", [widget.node], null, parentStyle));\n    }\n    return widget.height = widget.node.parentNode.offsetHeight\n  }\n\n  // Return true when the given mouse event happened in a widget\n  function eventInWidget(display, e) {\n    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n      if (!n || (n.nodeType == 1 && n.getAttribute(\"cm-ignore-events\") == \"true\") ||\n          (n.parentNode == display.sizer && n != display.mover))\n        { return true }\n    }\n  }\n\n  // POSITION MEASUREMENT\n\n  function paddingTop(display) {return display.lineSpace.offsetTop}\n  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}\n  function paddingH(display) {\n    if (display.cachedPaddingH) { return display.cachedPaddingH }\n    var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\", \"CodeMirror-line-like\"));\n    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n    if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }\n    return data\n  }\n\n  function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }\n  function displayWidth(cm) {\n    return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth\n  }\n  function displayHeight(cm) {\n    return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight\n  }\n\n  // Ensure the lineView.wrapping.heights array is populated. This is\n  // an array of bottom offsets for the lines that make up a drawn\n  // line. When lineWrapping is on, there might be more than one\n  // height.\n  function ensureLineHeights(cm, lineView, rect) {\n    var wrapping = cm.options.lineWrapping;\n    var curWidth = wrapping && displayWidth(cm);\n    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n      var heights = lineView.measure.heights = [];\n      if (wrapping) {\n        lineView.measure.width = curWidth;\n        var rects = lineView.text.firstChild.getClientRects();\n        for (var i = 0; i < rects.length - 1; i++) {\n          var cur = rects[i], next = rects[i + 1];\n          if (Math.abs(cur.bottom - next.bottom) > 2)\n            { heights.push((cur.bottom + next.top) / 2 - rect.top); }\n        }\n      }\n      heights.push(rect.bottom - rect.top);\n    }\n  }\n\n  // Find a line map (mapping character offsets to text nodes) and a\n  // measurement cache for the given line number. (A line view might\n  // contain multiple lines when collapsed ranges are present.)\n  function mapFromLineView(lineView, line, lineN) {\n    if (lineView.line == line)\n      { return {map: lineView.measure.map, cache: lineView.measure.cache} }\n    if (lineView.rest) {\n      for (var i = 0; i < lineView.rest.length; i++)\n        { if (lineView.rest[i] == line)\n          { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }\n      for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)\n        { if (lineNo(lineView.rest[i$1]) > lineN)\n          { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }\n    }\n  }\n\n  // Render a line into the hidden node display.externalMeasured. Used\n  // when measurement is needed for a line that's not in the viewport.\n  function updateExternalMeasurement(cm, line) {\n    line = visualLine(line);\n    var lineN = lineNo(line);\n    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n    view.lineN = lineN;\n    var built = view.built = buildLineContent(cm, view);\n    view.text = built.pre;\n    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n    return view\n  }\n\n  // Get a {top, bottom, left, right} box (in line-local coordinates)\n  // for a given character.\n  function measureChar(cm, line, ch, bias) {\n    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)\n  }\n\n  // Find a line view that corresponds to the given line number.\n  function findViewForLine(cm, lineN) {\n    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n      { return cm.display.view[findViewIndex(cm, lineN)] }\n    var ext = cm.display.externalMeasured;\n    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n      { return ext }\n  }\n\n  // Measurement can be split in two steps, the set-up work that\n  // applies to the whole line, and the measurement of the actual\n  // character. Functions like coordsChar, that need to do a lot of\n  // measurements in a row, can thus ensure that the set-up work is\n  // only done once.\n  function prepareMeasureForLine(cm, line) {\n    var lineN = lineNo(line);\n    var view = findViewForLine(cm, lineN);\n    if (view && !view.text) {\n      view = null;\n    } else if (view && view.changes) {\n      updateLineForChanges(cm, view, lineN, getDimensions(cm));\n      cm.curOp.forceUpdate = true;\n    }\n    if (!view)\n      { view = updateExternalMeasurement(cm, line); }\n\n    var info = mapFromLineView(view, line, lineN);\n    return {\n      line: line, view: view, rect: null,\n      map: info.map, cache: info.cache, before: info.before,\n      hasHeights: false\n    }\n  }\n\n  // Given a prepared measurement object, measures the position of an\n  // actual character (or fetches it from the cache).\n  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n    if (prepared.before) { ch = -1; }\n    var key = ch + (bias || \"\"), found;\n    if (prepared.cache.hasOwnProperty(key)) {\n      found = prepared.cache[key];\n    } else {\n      if (!prepared.rect)\n        { prepared.rect = prepared.view.text.getBoundingClientRect(); }\n      if (!prepared.hasHeights) {\n        ensureLineHeights(cm, prepared.view, prepared.rect);\n        prepared.hasHeights = true;\n      }\n      found = measureCharInner(cm, prepared, ch, bias);\n      if (!found.bogus) { prepared.cache[key] = found; }\n    }\n    return {left: found.left, right: found.right,\n            top: varHeight ? found.rtop : found.top,\n            bottom: varHeight ? found.rbottom : found.bottom}\n  }\n\n  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n  function nodeAndOffsetInLineMap(map, ch, bias) {\n    var node, start, end, collapse, mStart, mEnd;\n    // First, search the line map for the text node corresponding to,\n    // or closest to, the target character.\n    for (var i = 0; i < map.length; i += 3) {\n      mStart = map[i];\n      mEnd = map[i + 1];\n      if (ch < mStart) {\n        start = 0; end = 1;\n        collapse = \"left\";\n      } else if (ch < mEnd) {\n        start = ch - mStart;\n        end = start + 1;\n      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n        end = mEnd - mStart;\n        start = end - 1;\n        if (ch >= mEnd) { collapse = \"right\"; }\n      }\n      if (start != null) {\n        node = map[i + 2];\n        if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n          { collapse = bias; }\n        if (bias == \"left\" && start == 0)\n          { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n            node = map[(i -= 3) + 2];\n            collapse = \"left\";\n          } }\n        if (bias == \"right\" && start == mEnd - mStart)\n          { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n            node = map[(i += 3) + 2];\n            collapse = \"right\";\n          } }\n        break\n      }\n    }\n    return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}\n  }\n\n  function getUsefulRect(rects, bias) {\n    var rect = nullRect;\n    if (bias == \"left\") { for (var i = 0; i < rects.length; i++) {\n      if ((rect = rects[i]).left != rect.right) { break }\n    } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {\n      if ((rect = rects[i$1]).left != rect.right) { break }\n    } }\n    return rect\n  }\n\n  function measureCharInner(cm, prepared, ch, bias) {\n    var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);\n    var node = place.node, start = place.start, end = place.end, collapse = place.collapse;\n\n    var rect;\n    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n      for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n        while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }\n        while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }\n        if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)\n          { rect = node.parentNode.getBoundingClientRect(); }\n        else\n          { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }\n        if (rect.left || rect.right || start == 0) { break }\n        end = start;\n        start = start - 1;\n        collapse = \"right\";\n      }\n      if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }\n    } else { // If it is a widget, simply get the box for the whole widget.\n      if (start > 0) { collapse = bias = \"right\"; }\n      var rects;\n      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n        { rect = rects[bias == \"right\" ? rects.length - 1 : 0]; }\n      else\n        { rect = node.getBoundingClientRect(); }\n    }\n    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n      var rSpan = node.parentNode.getClientRects()[0];\n      if (rSpan)\n        { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }\n      else\n        { rect = nullRect; }\n    }\n\n    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;\n    var mid = (rtop + rbot) / 2;\n    var heights = prepared.view.measure.heights;\n    var i = 0;\n    for (; i < heights.length - 1; i++)\n      { if (mid < heights[i]) { break } }\n    var top = i ? heights[i - 1] : 0, bot = heights[i];\n    var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n                  right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n                  top: top, bottom: bot};\n    if (!rect.left && !rect.right) { result.bogus = true; }\n    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }\n\n    return result\n  }\n\n  // Work around problem with bounding client rects on ranges being\n  // returned incorrectly when zoomed on IE10 and below.\n  function maybeUpdateRectForZooming(measure, rect) {\n    if (!window.screen || screen.logicalXDPI == null ||\n        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n      { return rect }\n    var scaleX = screen.logicalXDPI / screen.deviceXDPI;\n    var scaleY = screen.logicalYDPI / screen.deviceYDPI;\n    return {left: rect.left * scaleX, right: rect.right * scaleX,\n            top: rect.top * scaleY, bottom: rect.bottom * scaleY}\n  }\n\n  function clearLineMeasurementCacheFor(lineView) {\n    if (lineView.measure) {\n      lineView.measure.cache = {};\n      lineView.measure.heights = null;\n      if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n        { lineView.measure.caches[i] = {}; } }\n    }\n  }\n\n  function clearLineMeasurementCache(cm) {\n    cm.display.externalMeasure = null;\n    removeChildren(cm.display.lineMeasure);\n    for (var i = 0; i < cm.display.view.length; i++)\n      { clearLineMeasurementCacheFor(cm.display.view[i]); }\n  }\n\n  function clearCaches(cm) {\n    clearLineMeasurementCache(cm);\n    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n    if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }\n    cm.display.lineNumChars = null;\n  }\n\n  function pageScrollX() {\n    // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206\n    // which causes page_Offset and bounding client rects to use\n    // different reference viewports and invalidate our calculations.\n    if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }\n    return window.pageXOffset || (document.documentElement || document.body).scrollLeft\n  }\n  function pageScrollY() {\n    if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }\n    return window.pageYOffset || (document.documentElement || document.body).scrollTop\n  }\n\n  function widgetTopHeight(lineObj) {\n    var ref = visualLine(lineObj);\n    var widgets = ref.widgets;\n    var height = 0;\n    if (widgets) { for (var i = 0; i < widgets.length; ++i) { if (widgets[i].above)\n      { height += widgetHeight(widgets[i]); } } }\n    return height\n  }\n\n  // Converts a {top, bottom, left, right} box from line-local\n  // coordinates into another coordinate system. Context may be one of\n  // \"line\", \"div\" (display.lineDiv), \"local\"./null (editor), \"window\",\n  // or \"page\".\n  function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {\n    if (!includeWidgets) {\n      var height = widgetTopHeight(lineObj);\n      rect.top += height; rect.bottom += height;\n    }\n    if (context == \"line\") { return rect }\n    if (!context) { context = \"local\"; }\n    var yOff = heightAtLine(lineObj);\n    if (context == \"local\") { yOff += paddingTop(cm.display); }\n    else { yOff -= cm.display.viewOffset; }\n    if (context == \"page\" || context == \"window\") {\n      var lOff = cm.display.lineSpace.getBoundingClientRect();\n      yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY());\n      var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX());\n      rect.left += xOff; rect.right += xOff;\n    }\n    rect.top += yOff; rect.bottom += yOff;\n    return rect\n  }\n\n  // Coverts a box from \"div\" coords to another coordinate system.\n  // Context may be \"window\", \"page\", \"div\", or \"local\"./null.\n  function fromCoordSystem(cm, coords, context) {\n    if (context == \"div\") { return coords }\n    var left = coords.left, top = coords.top;\n    // First move into \"page\" coordinate system\n    if (context == \"page\") {\n      left -= pageScrollX();\n      top -= pageScrollY();\n    } else if (context == \"local\" || !context) {\n      var localBox = cm.display.sizer.getBoundingClientRect();\n      left += localBox.left;\n      top += localBox.top;\n    }\n\n    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}\n  }\n\n  function charCoords(cm, pos, context, lineObj, bias) {\n    if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }\n    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)\n  }\n\n  // Returns a box for a given cursor position, which may have an\n  // 'other' property containing the position of the secondary cursor\n  // on a bidi boundary.\n  // A cursor Pos(line, char, \"before\") is on the same visual line as `char - 1`\n  // and after `char - 1` in writing order of `char - 1`\n  // A cursor Pos(line, char, \"after\") is on the same visual line as `char`\n  // and before `char` in writing order of `char`\n  // Examples (upper-case letters are RTL, lower-case are LTR):\n  //     Pos(0, 1, ...)\n  //     before   after\n  // ab     a|b     a|b\n  // aB     a|B     aB|\n  // Ab     |Ab     A|b\n  // AB     B|A     B|A\n  // Every position after the last character on a line is considered to stick\n  // to the last character on the line.\n  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n    lineObj = lineObj || getLine(cm.doc, pos.line);\n    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n    function get(ch, right) {\n      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight);\n      if (right) { m.left = m.right; } else { m.right = m.left; }\n      return intoCoordSystem(cm, lineObj, m, context)\n    }\n    var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;\n    if (ch >= lineObj.text.length) {\n      ch = lineObj.text.length;\n      sticky = \"before\";\n    } else if (ch <= 0) {\n      ch = 0;\n      sticky = \"after\";\n    }\n    if (!order) { return get(sticky == \"before\" ? ch - 1 : ch, sticky == \"before\") }\n\n    function getBidi(ch, partPos, invert) {\n      var part = order[partPos], right = part.level == 1;\n      return get(invert ? ch - 1 : ch, right != invert)\n    }\n    var partPos = getBidiPartAt(order, ch, sticky);\n    var other = bidiOther;\n    var val = getBidi(ch, partPos, sticky == \"before\");\n    if (other != null) { val.other = getBidi(ch, other, sticky != \"before\"); }\n    return val\n  }\n\n  // Used to cheaply estimate the coordinates for a position. Used for\n  // intermediate scroll updates.\n  function estimateCoords(cm, pos) {\n    var left = 0;\n    pos = clipPos(cm.doc, pos);\n    if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }\n    var lineObj = getLine(cm.doc, pos.line);\n    var top = heightAtLine(lineObj) + paddingTop(cm.display);\n    return {left: left, right: left, top: top, bottom: top + lineObj.height}\n  }\n\n  // Positions returned by coordsChar contain some extra information.\n  // xRel is the relative x position of the input coordinates compared\n  // to the found position (so xRel > 0 means the coordinates are to\n  // the right of the character position, for example). When outside\n  // is true, that means the coordinates lie outside the line's\n  // vertical range.\n  function PosWithInfo(line, ch, sticky, outside, xRel) {\n    var pos = Pos(line, ch, sticky);\n    pos.xRel = xRel;\n    if (outside) { pos.outside = outside; }\n    return pos\n  }\n\n  // Compute the character position closest to the given coordinates.\n  // Input must be lineSpace-local (\"div\" coordinate system).\n  function coordsChar(cm, x, y) {\n    var doc = cm.doc;\n    y += cm.display.viewOffset;\n    if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) }\n    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n    if (lineN > last)\n      { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) }\n    if (x < 0) { x = 0; }\n\n    var lineObj = getLine(doc, lineN);\n    for (;;) {\n      var found = coordsCharInner(cm, lineObj, lineN, x, y);\n      var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));\n      if (!collapsed) { return found }\n      var rangeEnd = collapsed.find(1);\n      if (rangeEnd.line == lineN) { return rangeEnd }\n      lineObj = getLine(doc, lineN = rangeEnd.line);\n    }\n  }\n\n  function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {\n    y -= widgetTopHeight(lineObj);\n    var end = lineObj.text.length;\n    var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);\n    end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);\n    return {begin: begin, end: end}\n  }\n\n  function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {\n    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n    var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), \"line\").top;\n    return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)\n  }\n\n  // Returns true if the given side of a box is after the given\n  // coordinates, in top-to-bottom, left-to-right order.\n  function boxIsAfter(box, x, y, left) {\n    return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x\n  }\n\n  function coordsCharInner(cm, lineObj, lineNo, x, y) {\n    // Move y into line-local coordinate space\n    y -= heightAtLine(lineObj);\n    var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n    // When directly calling `measureCharPrepared`, we have to adjust\n    // for the widgets at this line.\n    var widgetHeight = widgetTopHeight(lineObj);\n    var begin = 0, end = lineObj.text.length, ltr = true;\n\n    var order = getOrder(lineObj, cm.doc.direction);\n    // If the line isn't plain left-to-right text, first figure out\n    // which bidi section the coordinates fall into.\n    if (order) {\n      var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)\n                   (cm, lineObj, lineNo, preparedMeasure, order, x, y);\n      ltr = part.level != 1;\n      // The awkward -1 offsets are needed because findFirst (called\n      // on these below) will treat its first bound as inclusive,\n      // second as exclusive, but we want to actually address the\n      // characters in the part's range\n      begin = ltr ? part.from : part.to - 1;\n      end = ltr ? part.to : part.from - 1;\n    }\n\n    // A binary search to find the first character whose bounding box\n    // starts after the coordinates. If we run across any whose box wrap\n    // the coordinates, store that.\n    var chAround = null, boxAround = null;\n    var ch = findFirst(function (ch) {\n      var box = measureCharPrepared(cm, preparedMeasure, ch);\n      box.top += widgetHeight; box.bottom += widgetHeight;\n      if (!boxIsAfter(box, x, y, false)) { return false }\n      if (box.top <= y && box.left <= x) {\n        chAround = ch;\n        boxAround = box;\n      }\n      return true\n    }, begin, end);\n\n    var baseX, sticky, outside = false;\n    // If a box around the coordinates was found, use that\n    if (boxAround) {\n      // Distinguish coordinates nearer to the left or right side of the box\n      var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;\n      ch = chAround + (atStart ? 0 : 1);\n      sticky = atStart ? \"after\" : \"before\";\n      baseX = atLeft ? boxAround.left : boxAround.right;\n    } else {\n      // (Adjust for extended bound, if necessary.)\n      if (!ltr && (ch == end || ch == begin)) { ch++; }\n      // To determine which side to associate with, get the box to the\n      // left of the character and compare it's vertical position to the\n      // coordinates\n      sticky = ch == 0 ? \"after\" : ch == lineObj.text.length ? \"before\" :\n        (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?\n        \"after\" : \"before\";\n      // Now get accurate coordinates for this place, in order to get a\n      // base X position\n      var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), \"line\", lineObj, preparedMeasure);\n      baseX = coords.left;\n      outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0;\n    }\n\n    ch = skipExtendingChars(lineObj.text, ch, 1);\n    return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)\n  }\n\n  function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {\n    // Bidi parts are sorted left-to-right, and in a non-line-wrapping\n    // situation, we can take this ordering to correspond to the visual\n    // ordering. This finds the first part whose end is after the given\n    // coordinates.\n    var index = findFirst(function (i) {\n      var part = order[i], ltr = part.level != 1;\n      return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? \"before\" : \"after\"),\n                                     \"line\", lineObj, preparedMeasure), x, y, true)\n    }, 0, order.length - 1);\n    var part = order[index];\n    // If this isn't the first part, the part's start is also after\n    // the coordinates, and the coordinates aren't on the same line as\n    // that start, move one part back.\n    if (index > 0) {\n      var ltr = part.level != 1;\n      var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? \"after\" : \"before\"),\n                               \"line\", lineObj, preparedMeasure);\n      if (boxIsAfter(start, x, y, true) && start.top > y)\n        { part = order[index - 1]; }\n    }\n    return part\n  }\n\n  function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {\n    // In a wrapped line, rtl text on wrapping boundaries can do things\n    // that don't correspond to the ordering in our `order` array at\n    // all, so a binary search doesn't work, and we want to return a\n    // part that only spans one line so that the binary search in\n    // coordsCharInner is safe. As such, we first find the extent of the\n    // wrapped line, and then do a flat search in which we discard any\n    // spans that aren't on the line.\n    var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);\n    var begin = ref.begin;\n    var end = ref.end;\n    if (/\\s/.test(lineObj.text.charAt(end - 1))) { end--; }\n    var part = null, closestDist = null;\n    for (var i = 0; i < order.length; i++) {\n      var p = order[i];\n      if (p.from >= end || p.to <= begin) { continue }\n      var ltr = p.level != 1;\n      var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;\n      // Weigh against spans ending before this, so that they are only\n      // picked if nothing ends after\n      var dist = endX < x ? x - endX + 1e9 : endX - x;\n      if (!part || closestDist > dist) {\n        part = p;\n        closestDist = dist;\n      }\n    }\n    if (!part) { part = order[order.length - 1]; }\n    // Clip the part to the wrapped line.\n    if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }\n    if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }\n    return part\n  }\n\n  var measureText;\n  // Compute the default text height.\n  function textHeight(display) {\n    if (display.cachedTextHeight != null) { return display.cachedTextHeight }\n    if (measureText == null) {\n      measureText = elt(\"pre\", null, \"CodeMirror-line-like\");\n      // Measure a bunch of lines, for browsers that compute\n      // fractional heights.\n      for (var i = 0; i < 49; ++i) {\n        measureText.appendChild(document.createTextNode(\"x\"));\n        measureText.appendChild(elt(\"br\"));\n      }\n      measureText.appendChild(document.createTextNode(\"x\"));\n    }\n    removeChildrenAndAdd(display.measure, measureText);\n    var height = measureText.offsetHeight / 50;\n    if (height > 3) { display.cachedTextHeight = height; }\n    removeChildren(display.measure);\n    return height || 1\n  }\n\n  // Compute the default character width.\n  function charWidth(display) {\n    if (display.cachedCharWidth != null) { return display.cachedCharWidth }\n    var anchor = elt(\"span\", \"xxxxxxxxxx\");\n    var pre = elt(\"pre\", [anchor], \"CodeMirror-line-like\");\n    removeChildrenAndAdd(display.measure, pre);\n    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n    if (width > 2) { display.cachedCharWidth = width; }\n    return width || 10\n  }\n\n  // Do a bulk-read of the DOM positions and sizes needed to draw the\n  // view, so that we don't interleave reading and writing to the DOM.\n  function getDimensions(cm) {\n    var d = cm.display, left = {}, width = {};\n    var gutterLeft = d.gutters.clientLeft;\n    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n      var id = cm.display.gutterSpecs[i].className;\n      left[id] = n.offsetLeft + n.clientLeft + gutterLeft;\n      width[id] = n.clientWidth;\n    }\n    return {fixedPos: compensateForHScroll(d),\n            gutterTotalWidth: d.gutters.offsetWidth,\n            gutterLeft: left,\n            gutterWidth: width,\n            wrapperWidth: d.wrapper.clientWidth}\n  }\n\n  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n  // but using getBoundingClientRect to get a sub-pixel-accurate\n  // result.\n  function compensateForHScroll(display) {\n    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left\n  }\n\n  // Returns a function that estimates the height of a line, to use as\n  // first approximation until the line becomes visible (and is thus\n  // properly measurable).\n  function estimateHeight(cm) {\n    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n    return function (line) {\n      if (lineIsHidden(cm.doc, line)) { return 0 }\n\n      var widgetsHeight = 0;\n      if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {\n        if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }\n      } }\n\n      if (wrapping)\n        { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }\n      else\n        { return widgetsHeight + th }\n    }\n  }\n\n  function estimateLineHeights(cm) {\n    var doc = cm.doc, est = estimateHeight(cm);\n    doc.iter(function (line) {\n      var estHeight = est(line);\n      if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n    });\n  }\n\n  // Given a mouse event, find the corresponding position. If liberal\n  // is false, it checks whether a gutter or scrollbar was clicked,\n  // and returns null if it was. forRect is used by rectangular\n  // selections, and tries to estimate a character position even for\n  // coordinates beyond the right of the text.\n  function posFromMouse(cm, e, liberal, forRect) {\n    var display = cm.display;\n    if (!liberal && e_target(e).getAttribute(\"cm-not-content\") == \"true\") { return null }\n\n    var x, y, space = display.lineSpace.getBoundingClientRect();\n    // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n    try { x = e.clientX - space.left; y = e.clientY - space.top; }\n    catch (e$1) { return null }\n    var coords = coordsChar(cm, x, y), line;\n    if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n    }\n    return coords\n  }\n\n  // Find the view element corresponding to a given line. Return null\n  // when the line isn't visible.\n  function findViewIndex(cm, n) {\n    if (n >= cm.display.viewTo) { return null }\n    n -= cm.display.viewFrom;\n    if (n < 0) { return null }\n    var view = cm.display.view;\n    for (var i = 0; i < view.length; i++) {\n      n -= view[i].size;\n      if (n < 0) { return i }\n    }\n  }\n\n  // Updates the display.view data structure for a given change to the\n  // document. From and to are in pre-change coordinates. Lendiff is\n  // the amount of lines added or subtracted by the change. This is\n  // used for changes that span multiple lines, or change the way\n  // lines are divided into visual lines. regLineChange (below)\n  // registers single-line changes.\n  function regChange(cm, from, to, lendiff) {\n    if (from == null) { from = cm.doc.first; }\n    if (to == null) { to = cm.doc.first + cm.doc.size; }\n    if (!lendiff) { lendiff = 0; }\n\n    var display = cm.display;\n    if (lendiff && to < display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers > from))\n      { display.updateLineNumbers = from; }\n\n    cm.curOp.viewChanged = true;\n\n    if (from >= display.viewTo) { // Change after\n      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n        { resetView(cm); }\n    } else if (to <= display.viewFrom) { // Change before\n      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n        resetView(cm);\n      } else {\n        display.viewFrom += lendiff;\n        display.viewTo += lendiff;\n      }\n    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n      resetView(cm);\n    } else if (from <= display.viewFrom) { // Top overlap\n      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cut) {\n        display.view = display.view.slice(cut.index);\n        display.viewFrom = cut.lineN;\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    } else if (to >= display.viewTo) { // Bottom overlap\n      var cut$1 = viewCuttingPoint(cm, from, from, -1);\n      if (cut$1) {\n        display.view = display.view.slice(0, cut$1.index);\n        display.viewTo = cut$1.lineN;\n      } else {\n        resetView(cm);\n      }\n    } else { // Gap in the middle\n      var cutTop = viewCuttingPoint(cm, from, from, -1);\n      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cutTop && cutBot) {\n        display.view = display.view.slice(0, cutTop.index)\n          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n          .concat(display.view.slice(cutBot.index));\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    }\n\n    var ext = display.externalMeasured;\n    if (ext) {\n      if (to < ext.lineN)\n        { ext.lineN += lendiff; }\n      else if (from < ext.lineN + ext.size)\n        { display.externalMeasured = null; }\n    }\n  }\n\n  // Register a change to a single line. Type must be one of \"text\",\n  // \"gutter\", \"class\", \"widget\"\n  function regLineChange(cm, line, type) {\n    cm.curOp.viewChanged = true;\n    var display = cm.display, ext = cm.display.externalMeasured;\n    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n      { display.externalMeasured = null; }\n\n    if (line < display.viewFrom || line >= display.viewTo) { return }\n    var lineView = display.view[findViewIndex(cm, line)];\n    if (lineView.node == null) { return }\n    var arr = lineView.changes || (lineView.changes = []);\n    if (indexOf(arr, type) == -1) { arr.push(type); }\n  }\n\n  // Clear the view.\n  function resetView(cm) {\n    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n    cm.display.view = [];\n    cm.display.viewOffset = 0;\n  }\n\n  function viewCuttingPoint(cm, oldN, newN, dir) {\n    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n      { return {index: index, lineN: newN} }\n    var n = cm.display.viewFrom;\n    for (var i = 0; i < index; i++)\n      { n += view[i].size; }\n    if (n != oldN) {\n      if (dir > 0) {\n        if (index == view.length - 1) { return null }\n        diff = (n + view[index].size) - oldN;\n        index++;\n      } else {\n        diff = n - oldN;\n      }\n      oldN += diff; newN += diff;\n    }\n    while (visualLineNo(cm.doc, newN) != newN) {\n      if (index == (dir < 0 ? 0 : view.length - 1)) { return null }\n      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n      index += dir;\n    }\n    return {index: index, lineN: newN}\n  }\n\n  // Force the view to cover a given range, adding empty view element\n  // or clipping off existing ones as needed.\n  function adjustView(cm, from, to) {\n    var display = cm.display, view = display.view;\n    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n      display.view = buildViewArray(cm, from, to);\n      display.viewFrom = from;\n    } else {\n      if (display.viewFrom > from)\n        { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }\n      else if (display.viewFrom < from)\n        { display.view = display.view.slice(findViewIndex(cm, from)); }\n      display.viewFrom = from;\n      if (display.viewTo < to)\n        { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }\n      else if (display.viewTo > to)\n        { display.view = display.view.slice(0, findViewIndex(cm, to)); }\n    }\n    display.viewTo = to;\n  }\n\n  // Count the number of lines in the view whose DOM representation is\n  // out of date (or nonexistent).\n  function countDirtyView(cm) {\n    var view = cm.display.view, dirty = 0;\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }\n    }\n    return dirty\n  }\n\n  function updateSelection(cm) {\n    cm.display.input.showSelection(cm.display.input.prepareSelection());\n  }\n\n  function prepareSelection(cm, primary) {\n    if ( primary === void 0 ) primary = true;\n\n    var doc = cm.doc, result = {};\n    var curFragment = result.cursors = document.createDocumentFragment();\n    var selFragment = result.selection = document.createDocumentFragment();\n\n    var customCursor = cm.options.$customCursor;\n    if (customCursor) { primary = true; }\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      if (!primary && i == doc.sel.primIndex) { continue }\n      var range = doc.sel.ranges[i];\n      if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue }\n      var collapsed = range.empty();\n      if (customCursor) {\n        var head = customCursor(cm, range);\n        if (head) { drawSelectionCursor(cm, head, curFragment); }\n      } else if (collapsed || cm.options.showCursorWhenSelecting) {\n        drawSelectionCursor(cm, range.head, curFragment);\n      }\n      if (!collapsed)\n        { drawSelectionRange(cm, range, selFragment); }\n    }\n    return result\n  }\n\n  // Draws a cursor for the given range\n  function drawSelectionCursor(cm, head, output) {\n    var pos = cursorCoords(cm, head, \"div\", null, null, !cm.options.singleCursorHeightPerLine);\n\n    var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n    cursor.style.left = pos.left + \"px\";\n    cursor.style.top = pos.top + \"px\";\n    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n    if (/\\bcm-fat-cursor\\b/.test(cm.getWrapperElement().className)) {\n      var charPos = charCoords(cm, head, \"div\", null, null);\n      var width = charPos.right - charPos.left;\n      cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + \"px\";\n    }\n\n    if (pos.other) {\n      // Secondary cursor, shown when on a 'jump' in bi-directional text\n      var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n      otherCursor.style.display = \"\";\n      otherCursor.style.left = pos.other.left + \"px\";\n      otherCursor.style.top = pos.other.top + \"px\";\n      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n    }\n  }\n\n  function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }\n\n  // Draws the given range as a highlighted selection\n  function drawSelectionRange(cm, range, output) {\n    var display = cm.display, doc = cm.doc;\n    var fragment = document.createDocumentFragment();\n    var padding = paddingH(cm.display), leftSide = padding.left;\n    var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;\n    var docLTR = doc.direction == \"ltr\";\n\n    function add(left, top, width, bottom) {\n      if (top < 0) { top = 0; }\n      top = Math.round(top);\n      bottom = Math.round(bottom);\n      fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", (\"position: absolute; left: \" + left + \"px;\\n                             top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) + \"px;\\n                             height: \" + (bottom - top) + \"px\")));\n    }\n\n    function drawForLine(line, fromArg, toArg) {\n      var lineObj = getLine(doc, line);\n      var lineLen = lineObj.text.length;\n      var start, end;\n      function coords(ch, bias) {\n        return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias)\n      }\n\n      function wrapX(pos, dir, side) {\n        var extent = wrappedLineExtentChar(cm, lineObj, null, pos);\n        var prop = (dir == \"ltr\") == (side == \"after\") ? \"left\" : \"right\";\n        var ch = side == \"after\" ? extent.begin : extent.end - (/\\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);\n        return coords(ch, prop)[prop]\n      }\n\n      var order = getOrder(lineObj, doc.direction);\n      iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {\n        var ltr = dir == \"ltr\";\n        var fromPos = coords(from, ltr ? \"left\" : \"right\");\n        var toPos = coords(to - 1, ltr ? \"right\" : \"left\");\n\n        var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;\n        var first = i == 0, last = !order || i == order.length - 1;\n        if (toPos.top - fromPos.top <= 3) { // Single line\n          var openLeft = (docLTR ? openStart : openEnd) && first;\n          var openRight = (docLTR ? openEnd : openStart) && last;\n          var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;\n          var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;\n          add(left, fromPos.top, right - left, fromPos.bottom);\n        } else { // Multiple lines\n          var topLeft, topRight, botLeft, botRight;\n          if (ltr) {\n            topLeft = docLTR && openStart && first ? leftSide : fromPos.left;\n            topRight = docLTR ? rightSide : wrapX(from, dir, \"before\");\n            botLeft = docLTR ? leftSide : wrapX(to, dir, \"after\");\n            botRight = docLTR && openEnd && last ? rightSide : toPos.right;\n          } else {\n            topLeft = !docLTR ? leftSide : wrapX(from, dir, \"before\");\n            topRight = !docLTR && openStart && first ? rightSide : fromPos.right;\n            botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;\n            botRight = !docLTR ? rightSide : wrapX(to, dir, \"after\");\n          }\n          add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);\n          if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }\n          add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);\n        }\n\n        if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }\n        if (cmpCoords(toPos, start) < 0) { start = toPos; }\n        if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }\n        if (cmpCoords(toPos, end) < 0) { end = toPos; }\n      });\n      return {start: start, end: end}\n    }\n\n    var sFrom = range.from(), sTo = range.to();\n    if (sFrom.line == sTo.line) {\n      drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n    } else {\n      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n      var singleVLine = visualLine(fromLine) == visualLine(toLine);\n      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n      if (singleVLine) {\n        if (leftEnd.top < rightStart.top - 2) {\n          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n        } else {\n          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n        }\n      }\n      if (leftEnd.bottom < rightStart.top)\n        { add(leftSide, leftEnd.bottom, null, rightStart.top); }\n    }\n\n    output.appendChild(fragment);\n  }\n\n  // Cursor-blinking\n  function restartBlink(cm) {\n    if (!cm.state.focused) { return }\n    var display = cm.display;\n    clearInterval(display.blinker);\n    var on = true;\n    display.cursorDiv.style.visibility = \"\";\n    if (cm.options.cursorBlinkRate > 0)\n      { display.blinker = setInterval(function () {\n        if (!cm.hasFocus()) { onBlur(cm); }\n        display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\";\n      }, cm.options.cursorBlinkRate); }\n    else if (cm.options.cursorBlinkRate < 0)\n      { display.cursorDiv.style.visibility = \"hidden\"; }\n  }\n\n  function ensureFocus(cm) {\n    if (!cm.hasFocus()) {\n      cm.display.input.focus();\n      if (!cm.state.focused) { onFocus(cm); }\n    }\n  }\n\n  function delayBlurEvent(cm) {\n    cm.state.delayingBlurEvent = true;\n    setTimeout(function () { if (cm.state.delayingBlurEvent) {\n      cm.state.delayingBlurEvent = false;\n      if (cm.state.focused) { onBlur(cm); }\n    } }, 100);\n  }\n\n  function onFocus(cm, e) {\n    if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; }\n\n    if (cm.options.readOnly == \"nocursor\") { return }\n    if (!cm.state.focused) {\n      signal(cm, \"focus\", cm, e);\n      cm.state.focused = true;\n      addClass(cm.display.wrapper, \"CodeMirror-focused\");\n      // This test prevents this from firing when a context\n      // menu is closed (since the input reset would kill the\n      // select-all detection hack)\n      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n        cm.display.input.reset();\n        if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730\n      }\n      cm.display.input.receivedFocus();\n    }\n    restartBlink(cm);\n  }\n  function onBlur(cm, e) {\n    if (cm.state.delayingBlurEvent) { return }\n\n    if (cm.state.focused) {\n      signal(cm, \"blur\", cm, e);\n      cm.state.focused = false;\n      rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n    }\n    clearInterval(cm.display.blinker);\n    setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);\n  }\n\n  // Read the actual heights of the rendered lines, and update their\n  // stored heights to match.\n  function updateHeightsInViewport(cm) {\n    var display = cm.display;\n    var prevBottom = display.lineDiv.offsetTop;\n    var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top);\n    var oldHeight = display.lineDiv.getBoundingClientRect().top;\n    var mustScroll = 0;\n    for (var i = 0; i < display.view.length; i++) {\n      var cur = display.view[i], wrapping = cm.options.lineWrapping;\n      var height = (void 0), width = 0;\n      if (cur.hidden) { continue }\n      oldHeight += cur.line.height;\n      if (ie && ie_version < 8) {\n        var bot = cur.node.offsetTop + cur.node.offsetHeight;\n        height = bot - prevBottom;\n        prevBottom = bot;\n      } else {\n        var box = cur.node.getBoundingClientRect();\n        height = box.bottom - box.top;\n        // Check that lines don't extend past the right of the current\n        // editor width\n        if (!wrapping && cur.text.firstChild)\n          { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; }\n      }\n      var diff = cur.line.height - height;\n      if (diff > .005 || diff < -.005) {\n        if (oldHeight < viewTop) { mustScroll -= diff; }\n        updateLineHeight(cur.line, height);\n        updateWidgetHeight(cur.line);\n        if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)\n          { updateWidgetHeight(cur.rest[j]); } }\n      }\n      if (width > cm.display.sizerWidth) {\n        var chWidth = Math.ceil(width / charWidth(cm.display));\n        if (chWidth > cm.display.maxLineLength) {\n          cm.display.maxLineLength = chWidth;\n          cm.display.maxLine = cur.line;\n          cm.display.maxLineChanged = true;\n        }\n      }\n    }\n    if (Math.abs(mustScroll) > 2) { display.scroller.scrollTop += mustScroll; }\n  }\n\n  // Read and store the height of line widgets associated with the\n  // given line.\n  function updateWidgetHeight(line) {\n    if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) {\n      var w = line.widgets[i], parent = w.node.parentNode;\n      if (parent) { w.height = parent.offsetHeight; }\n    } }\n  }\n\n  // Compute the lines that are visible in a given viewport (defaults\n  // the the current scroll position). viewport may contain top,\n  // height, and ensure (see op.scrollToPos) properties.\n  function visibleLines(display, doc, viewport) {\n    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;\n    top = Math.floor(top - paddingTop(display));\n    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;\n\n    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n    // forces those lines into the viewport (if possible).\n    if (viewport && viewport.ensure) {\n      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;\n      if (ensureFrom < from) {\n        from = ensureFrom;\n        to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);\n      } else if (Math.min(ensureTo, doc.lastLine()) >= to) {\n        from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);\n        to = ensureTo;\n      }\n    }\n    return {from: from, to: Math.max(to, from + 1)}\n  }\n\n  // SCROLLING THINGS INTO VIEW\n\n  // If an editor sits on the top or bottom of the window, partially\n  // scrolled out of view, this ensures that the cursor is visible.\n  function maybeScrollWindow(cm, rect) {\n    if (signalDOMEvent(cm, \"scrollCursorIntoView\")) { return }\n\n    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n    if (rect.top + box.top < 0) { doScroll = true; }\n    else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; }\n    if (doScroll != null && !phantom) {\n      var scrollNode = elt(\"div\", \"\\u200b\", null, (\"position: absolute;\\n                         top: \" + (rect.top - display.viewOffset - paddingTop(cm.display)) + \"px;\\n                         height: \" + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + \"px;\\n                         left: \" + (rect.left) + \"px; width: \" + (Math.max(2, rect.right - rect.left)) + \"px;\"));\n      cm.display.lineSpace.appendChild(scrollNode);\n      scrollNode.scrollIntoView(doScroll);\n      cm.display.lineSpace.removeChild(scrollNode);\n    }\n  }\n\n  // Scroll a given position into view (immediately), verifying that\n  // it actually became visible (as line heights are accurately\n  // measured, the position of something may 'drift' during drawing).\n  function scrollPosIntoView(cm, pos, end, margin) {\n    if (margin == null) { margin = 0; }\n    var rect;\n    if (!cm.options.lineWrapping && pos == end) {\n      // Set pos and end to the cursor positions around the character pos sticks to\n      // If pos.sticky == \"before\", that is around pos.ch - 1, otherwise around pos.ch\n      // If pos == Pos(_, 0, \"before\"), pos and end are unchanged\n      end = pos.sticky == \"before\" ? Pos(pos.line, pos.ch + 1, \"before\") : pos;\n      pos = pos.ch ? Pos(pos.line, pos.sticky == \"before\" ? pos.ch - 1 : pos.ch, \"after\") : pos;\n    }\n    for (var limit = 0; limit < 5; limit++) {\n      var changed = false;\n      var coords = cursorCoords(cm, pos);\n      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n      rect = {left: Math.min(coords.left, endCoords.left),\n              top: Math.min(coords.top, endCoords.top) - margin,\n              right: Math.max(coords.left, endCoords.left),\n              bottom: Math.max(coords.bottom, endCoords.bottom) + margin};\n      var scrollPos = calculateScrollPos(cm, rect);\n      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n      if (scrollPos.scrollTop != null) {\n        updateScrollTop(cm, scrollPos.scrollTop);\n        if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }\n      }\n      if (scrollPos.scrollLeft != null) {\n        setScrollLeft(cm, scrollPos.scrollLeft);\n        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }\n      }\n      if (!changed) { break }\n    }\n    return rect\n  }\n\n  // Scroll a given set of coordinates into view (immediately).\n  function scrollIntoView(cm, rect) {\n    var scrollPos = calculateScrollPos(cm, rect);\n    if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }\n    if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }\n  }\n\n  // Calculate a new scroll position needed to scroll the given\n  // rectangle into view. Returns an object with scrollTop and\n  // scrollLeft properties. When these are undefined, the\n  // vertical/horizontal position does not need to be adjusted.\n  function calculateScrollPos(cm, rect) {\n    var display = cm.display, snapMargin = textHeight(cm.display);\n    if (rect.top < 0) { rect.top = 0; }\n    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n    var screen = displayHeight(cm), result = {};\n    if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }\n    var docBottom = cm.doc.height + paddingVert(display);\n    var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;\n    if (rect.top < screentop) {\n      result.scrollTop = atTop ? 0 : rect.top;\n    } else if (rect.bottom > screentop + screen) {\n      var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);\n      if (newTop != screentop) { result.scrollTop = newTop; }\n    }\n\n    var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth;\n    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace;\n    var screenw = displayWidth(cm) - display.gutters.offsetWidth;\n    var tooWide = rect.right - rect.left > screenw;\n    if (tooWide) { rect.right = rect.left + screenw; }\n    if (rect.left < 10)\n      { result.scrollLeft = 0; }\n    else if (rect.left < screenleft)\n      { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); }\n    else if (rect.right > screenw + screenleft - 3)\n      { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }\n    return result\n  }\n\n  // Store a relative adjustment to the scroll position in the current\n  // operation (to be applied when the operation finishes).\n  function addToScrollTop(cm, top) {\n    if (top == null) { return }\n    resolveScrollToPos(cm);\n    cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n  }\n\n  // Make sure that at the end of the operation the current cursor is\n  // shown.\n  function ensureCursorVisible(cm) {\n    resolveScrollToPos(cm);\n    var cur = cm.getCursor();\n    cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};\n  }\n\n  function scrollToCoords(cm, x, y) {\n    if (x != null || y != null) { resolveScrollToPos(cm); }\n    if (x != null) { cm.curOp.scrollLeft = x; }\n    if (y != null) { cm.curOp.scrollTop = y; }\n  }\n\n  function scrollToRange(cm, range) {\n    resolveScrollToPos(cm);\n    cm.curOp.scrollToPos = range;\n  }\n\n  // When an operation has its scrollToPos property set, and another\n  // scroll action is applied before the end of the operation, this\n  // 'simulates' scrolling that position into view in a cheap way, so\n  // that the effect of intermediate scroll commands is not ignored.\n  function resolveScrollToPos(cm) {\n    var range = cm.curOp.scrollToPos;\n    if (range) {\n      cm.curOp.scrollToPos = null;\n      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);\n      scrollToCoordsRange(cm, from, to, range.margin);\n    }\n  }\n\n  function scrollToCoordsRange(cm, from, to, margin) {\n    var sPos = calculateScrollPos(cm, {\n      left: Math.min(from.left, to.left),\n      top: Math.min(from.top, to.top) - margin,\n      right: Math.max(from.right, to.right),\n      bottom: Math.max(from.bottom, to.bottom) + margin\n    });\n    scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);\n  }\n\n  // Sync the scrollable area and scrollbars, ensure the viewport\n  // covers the visible area.\n  function updateScrollTop(cm, val) {\n    if (Math.abs(cm.doc.scrollTop - val) < 2) { return }\n    if (!gecko) { updateDisplaySimple(cm, {top: val}); }\n    setScrollTop(cm, val, true);\n    if (gecko) { updateDisplaySimple(cm); }\n    startWorker(cm, 100);\n  }\n\n  function setScrollTop(cm, val, forceScroll) {\n    val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val));\n    if (cm.display.scroller.scrollTop == val && !forceScroll) { return }\n    cm.doc.scrollTop = val;\n    cm.display.scrollbars.setScrollTop(val);\n    if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }\n  }\n\n  // Sync scroller and scrollbar, ensure the gutter elements are\n  // aligned.\n  function setScrollLeft(cm, val, isScroller, forceScroll) {\n    val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth));\n    if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }\n    cm.doc.scrollLeft = val;\n    alignHorizontally(cm);\n    if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }\n    cm.display.scrollbars.setScrollLeft(val);\n  }\n\n  // SCROLLBARS\n\n  // Prepare DOM reads needed to update the scrollbars. Done in one\n  // shot to minimize update/measure roundtrips.\n  function measureForScrollbars(cm) {\n    var d = cm.display, gutterW = d.gutters.offsetWidth;\n    var docH = Math.round(cm.doc.height + paddingVert(cm.display));\n    return {\n      clientHeight: d.scroller.clientHeight,\n      viewHeight: d.wrapper.clientHeight,\n      scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,\n      viewWidth: d.wrapper.clientWidth,\n      barLeft: cm.options.fixedGutter ? gutterW : 0,\n      docHeight: docH,\n      scrollHeight: docH + scrollGap(cm) + d.barHeight,\n      nativeBarWidth: d.nativeBarWidth,\n      gutterWidth: gutterW\n    }\n  }\n\n  var NativeScrollbars = function(place, scroll, cm) {\n    this.cm = cm;\n    var vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n    var horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n    vert.tabIndex = horiz.tabIndex = -1;\n    place(vert); place(horiz);\n\n    on(vert, \"scroll\", function () {\n      if (vert.clientHeight) { scroll(vert.scrollTop, \"vertical\"); }\n    });\n    on(horiz, \"scroll\", function () {\n      if (horiz.clientWidth) { scroll(horiz.scrollLeft, \"horizontal\"); }\n    });\n\n    this.checkedZeroWidth = false;\n    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n    if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = \"18px\"; }\n  };\n\n  NativeScrollbars.prototype.update = function (measure) {\n    var needsH = measure.scrollWidth > measure.clientWidth + 1;\n    var needsV = measure.scrollHeight > measure.clientHeight + 1;\n    var sWidth = measure.nativeBarWidth;\n\n    if (needsV) {\n      this.vert.style.display = \"block\";\n      this.vert.style.bottom = needsH ? sWidth + \"px\" : \"0\";\n      var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);\n      // A bug in IE8 can cause this value to be negative, so guard it.\n      this.vert.firstChild.style.height =\n        Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + \"px\";\n    } else {\n      this.vert.scrollTop = 0;\n      this.vert.style.display = \"\";\n      this.vert.firstChild.style.height = \"0\";\n    }\n\n    if (needsH) {\n      this.horiz.style.display = \"block\";\n      this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\";\n      this.horiz.style.left = measure.barLeft + \"px\";\n      var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);\n      this.horiz.firstChild.style.width =\n        Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\";\n    } else {\n      this.horiz.style.display = \"\";\n      this.horiz.firstChild.style.width = \"0\";\n    }\n\n    if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n      if (sWidth == 0) { this.zeroWidthHack(); }\n      this.checkedZeroWidth = true;\n    }\n\n    return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}\n  };\n\n  NativeScrollbars.prototype.setScrollLeft = function (pos) {\n    if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }\n    if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, \"horiz\"); }\n  };\n\n  NativeScrollbars.prototype.setScrollTop = function (pos) {\n    if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }\n    if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, \"vert\"); }\n  };\n\n  NativeScrollbars.prototype.zeroWidthHack = function () {\n    var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n    this.horiz.style.height = this.vert.style.width = w;\n    this.horiz.style.pointerEvents = this.vert.style.pointerEvents = \"none\";\n    this.disableHoriz = new Delayed;\n    this.disableVert = new Delayed;\n  };\n\n  NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {\n    bar.style.pointerEvents = \"auto\";\n    function maybeDisable() {\n      // To find out whether the scrollbar is still visible, we\n      // check whether the element under the pixel in the bottom\n      // right corner of the scrollbar box is the scrollbar box\n      // itself (when the bar is still visible) or its filler child\n      // (when the bar is hidden). If it is still visible, we keep\n      // it enabled, if it's hidden, we disable pointer events.\n      var box = bar.getBoundingClientRect();\n      var elt = type == \"vert\" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)\n          : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);\n      if (elt != bar) { bar.style.pointerEvents = \"none\"; }\n      else { delay.set(1000, maybeDisable); }\n    }\n    delay.set(1000, maybeDisable);\n  };\n\n  NativeScrollbars.prototype.clear = function () {\n    var parent = this.horiz.parentNode;\n    parent.removeChild(this.horiz);\n    parent.removeChild(this.vert);\n  };\n\n  var NullScrollbars = function () {};\n\n  NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };\n  NullScrollbars.prototype.setScrollLeft = function () {};\n  NullScrollbars.prototype.setScrollTop = function () {};\n  NullScrollbars.prototype.clear = function () {};\n\n  function updateScrollbars(cm, measure) {\n    if (!measure) { measure = measureForScrollbars(cm); }\n    var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;\n    updateScrollbarsInner(cm, measure);\n    for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {\n      if (startWidth != cm.display.barWidth && cm.options.lineWrapping)\n        { updateHeightsInViewport(cm); }\n      updateScrollbarsInner(cm, measureForScrollbars(cm));\n      startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;\n    }\n  }\n\n  // Re-synchronize the fake scrollbars with the actual size of the\n  // content.\n  function updateScrollbarsInner(cm, measure) {\n    var d = cm.display;\n    var sizes = d.scrollbars.update(measure);\n\n    d.sizer.style.paddingRight = (d.barWidth = sizes.right) + \"px\";\n    d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + \"px\";\n    d.heightForcer.style.borderBottom = sizes.bottom + \"px solid transparent\";\n\n    if (sizes.right && sizes.bottom) {\n      d.scrollbarFiller.style.display = \"block\";\n      d.scrollbarFiller.style.height = sizes.bottom + \"px\";\n      d.scrollbarFiller.style.width = sizes.right + \"px\";\n    } else { d.scrollbarFiller.style.display = \"\"; }\n    if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n      d.gutterFiller.style.display = \"block\";\n      d.gutterFiller.style.height = sizes.bottom + \"px\";\n      d.gutterFiller.style.width = measure.gutterWidth + \"px\";\n    } else { d.gutterFiller.style.display = \"\"; }\n  }\n\n  var scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars};\n\n  function initScrollbars(cm) {\n    if (cm.display.scrollbars) {\n      cm.display.scrollbars.clear();\n      if (cm.display.scrollbars.addClass)\n        { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n    }\n\n    cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {\n      cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);\n      // Prevent clicks in the scrollbars from killing focus\n      on(node, \"mousedown\", function () {\n        if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }\n      });\n      node.setAttribute(\"cm-not-content\", \"true\");\n    }, function (pos, axis) {\n      if (axis == \"horizontal\") { setScrollLeft(cm, pos); }\n      else { updateScrollTop(cm, pos); }\n    }, cm);\n    if (cm.display.scrollbars.addClass)\n      { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n  }\n\n  // Operations are used to wrap a series of changes to the editor\n  // state in such a way that each change won't have to update the\n  // cursor and display (which would be awkward, slow, and\n  // error-prone). Instead, display updates are batched and then all\n  // combined and executed at once.\n\n  var nextOpId = 0;\n  // Start a new operation.\n  function startOperation(cm) {\n    cm.curOp = {\n      cm: cm,\n      viewChanged: false,      // Flag that indicates that lines might need to be redrawn\n      startHeight: cm.doc.height, // Used to detect need to update scrollbar\n      forceUpdate: false,      // Used to force a redraw\n      updateInput: 0,       // Whether to reset the input textarea\n      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)\n      changeObjs: null,        // Accumulated changes, for firing change events\n      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n      selectionChanged: false, // Whether the selection needs to be redrawn\n      updateMaxLine: false,    // Set when the widest line needs to be determined anew\n      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n      scrollToPos: null,       // Used to scroll to a specific position\n      focus: false,\n      id: ++nextOpId,          // Unique ID\n      markArrays: null         // Used by addMarkedSpan\n    };\n    pushOperation(cm.curOp);\n  }\n\n  // Finish an operation, updating the display and signalling delayed events\n  function endOperation(cm) {\n    var op = cm.curOp;\n    if (op) { finishOperation(op, function (group) {\n      for (var i = 0; i < group.ops.length; i++)\n        { group.ops[i].cm.curOp = null; }\n      endOperations(group);\n    }); }\n  }\n\n  // The DOM updates done when an operation finishes are batched so\n  // that the minimum number of relayouts are required.\n  function endOperations(group) {\n    var ops = group.ops;\n    for (var i = 0; i < ops.length; i++) // Read DOM\n      { endOperation_R1(ops[i]); }\n    for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)\n      { endOperation_W1(ops[i$1]); }\n    for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM\n      { endOperation_R2(ops[i$2]); }\n    for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)\n      { endOperation_W2(ops[i$3]); }\n    for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM\n      { endOperation_finish(ops[i$4]); }\n  }\n\n  function endOperation_R1(op) {\n    var cm = op.cm, display = cm.display;\n    maybeClipScrollbars(cm);\n    if (op.updateMaxLine) { findMaxLine(cm); }\n\n    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n                         op.scrollToPos.to.line >= display.viewTo) ||\n      display.maxLineChanged && cm.options.lineWrapping;\n    op.update = op.mustUpdate &&\n      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n  }\n\n  function endOperation_W1(op) {\n    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);\n  }\n\n  function endOperation_R2(op) {\n    var cm = op.cm, display = cm.display;\n    if (op.updatedDisplay) { updateHeightsInViewport(cm); }\n\n    op.barMeasure = measureForScrollbars(cm);\n\n    // If the max line changed since it was last measured, measure it,\n    // and ensure the document's width matches it.\n    // updateDisplay_W2 will use these properties to do the actual resizing\n    if (display.maxLineChanged && !cm.options.lineWrapping) {\n      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;\n      cm.display.sizerWidth = op.adjustWidthTo;\n      op.barMeasure.scrollWidth =\n        Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);\n      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));\n    }\n\n    if (op.updatedDisplay || op.selectionChanged)\n      { op.preparedSelection = display.input.prepareSelection(); }\n  }\n\n  function endOperation_W2(op) {\n    var cm = op.cm;\n\n    if (op.adjustWidthTo != null) {\n      cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\";\n      if (op.maxScrollLeft < cm.doc.scrollLeft)\n        { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }\n      cm.display.maxLineChanged = false;\n    }\n\n    var takeFocus = op.focus && op.focus == activeElt();\n    if (op.preparedSelection)\n      { cm.display.input.showSelection(op.preparedSelection, takeFocus); }\n    if (op.updatedDisplay || op.startHeight != cm.doc.height)\n      { updateScrollbars(cm, op.barMeasure); }\n    if (op.updatedDisplay)\n      { setDocumentHeight(cm, op.barMeasure); }\n\n    if (op.selectionChanged) { restartBlink(cm); }\n\n    if (cm.state.focused && op.updateInput)\n      { cm.display.input.reset(op.typing); }\n    if (takeFocus) { ensureFocus(op.cm); }\n  }\n\n  function endOperation_finish(op) {\n    var cm = op.cm, display = cm.display, doc = cm.doc;\n\n    if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }\n\n    // Abort mouse wheel delta measurement, when scrolling explicitly\n    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n      { display.wheelStartX = display.wheelStartY = null; }\n\n    // Propagate the scroll position to the actual DOM scroller\n    if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }\n\n    if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }\n    // If we need to scroll a specific position into view, do so.\n    if (op.scrollToPos) {\n      var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n                                   clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n      maybeScrollWindow(cm, rect);\n    }\n\n    // Fire events for markers that are hidden/unidden by editing or\n    // undoing\n    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n    if (hidden) { for (var i = 0; i < hidden.length; ++i)\n      { if (!hidden[i].lines.length) { signal(hidden[i], \"hide\"); } } }\n    if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)\n      { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], \"unhide\"); } } }\n\n    if (display.wrapper.offsetHeight)\n      { doc.scrollTop = cm.display.scroller.scrollTop; }\n\n    // Fire change events, and delayed event handlers\n    if (op.changeObjs)\n      { signal(cm, \"changes\", cm, op.changeObjs); }\n    if (op.update)\n      { op.update.finish(); }\n  }\n\n  // Run the given function in an operation\n  function runInOp(cm, f) {\n    if (cm.curOp) { return f() }\n    startOperation(cm);\n    try { return f() }\n    finally { endOperation(cm); }\n  }\n  // Wraps a function in an operation. Returns the wrapped function.\n  function operation(cm, f) {\n    return function() {\n      if (cm.curOp) { return f.apply(cm, arguments) }\n      startOperation(cm);\n      try { return f.apply(cm, arguments) }\n      finally { endOperation(cm); }\n    }\n  }\n  // Used to add methods to editor and doc instances, wrapping them in\n  // operations.\n  function methodOp(f) {\n    return function() {\n      if (this.curOp) { return f.apply(this, arguments) }\n      startOperation(this);\n      try { return f.apply(this, arguments) }\n      finally { endOperation(this); }\n    }\n  }\n  function docMethodOp(f) {\n    return function() {\n      var cm = this.cm;\n      if (!cm || cm.curOp) { return f.apply(this, arguments) }\n      startOperation(cm);\n      try { return f.apply(this, arguments) }\n      finally { endOperation(cm); }\n    }\n  }\n\n  // HIGHLIGHT WORKER\n\n  function startWorker(cm, time) {\n    if (cm.doc.highlightFrontier < cm.display.viewTo)\n      { cm.state.highlight.set(time, bind(highlightWorker, cm)); }\n  }\n\n  function highlightWorker(cm) {\n    var doc = cm.doc;\n    if (doc.highlightFrontier >= cm.display.viewTo) { return }\n    var end = +new Date + cm.options.workTime;\n    var context = getContextBefore(cm, doc.highlightFrontier);\n    var changedLines = [];\n\n    doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {\n      if (context.line >= cm.display.viewFrom) { // Visible\n        var oldStyles = line.styles;\n        var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;\n        var highlighted = highlightLine(cm, line, context, true);\n        if (resetState) { context.state = resetState; }\n        line.styles = highlighted.styles;\n        var oldCls = line.styleClasses, newCls = highlighted.classes;\n        if (newCls) { line.styleClasses = newCls; }\n        else if (oldCls) { line.styleClasses = null; }\n        var ischange = !oldStyles || oldStyles.length != line.styles.length ||\n          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);\n        for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }\n        if (ischange) { changedLines.push(context.line); }\n        line.stateAfter = context.save();\n        context.nextLine();\n      } else {\n        if (line.text.length <= cm.options.maxHighlightLength)\n          { processLine(cm, line.text, context); }\n        line.stateAfter = context.line % 5 == 0 ? context.save() : null;\n        context.nextLine();\n      }\n      if (+new Date > end) {\n        startWorker(cm, cm.options.workDelay);\n        return true\n      }\n    });\n    doc.highlightFrontier = context.line;\n    doc.modeFrontier = Math.max(doc.modeFrontier, context.line);\n    if (changedLines.length) { runInOp(cm, function () {\n      for (var i = 0; i < changedLines.length; i++)\n        { regLineChange(cm, changedLines[i], \"text\"); }\n    }); }\n  }\n\n  // DISPLAY DRAWING\n\n  var DisplayUpdate = function(cm, viewport, force) {\n    var display = cm.display;\n\n    this.viewport = viewport;\n    // Store some values that we'll need later (but don't want to force a relayout for)\n    this.visible = visibleLines(display, cm.doc, viewport);\n    this.editorIsHidden = !display.wrapper.offsetWidth;\n    this.wrapperHeight = display.wrapper.clientHeight;\n    this.wrapperWidth = display.wrapper.clientWidth;\n    this.oldDisplayWidth = displayWidth(cm);\n    this.force = force;\n    this.dims = getDimensions(cm);\n    this.events = [];\n  };\n\n  DisplayUpdate.prototype.signal = function (emitter, type) {\n    if (hasHandler(emitter, type))\n      { this.events.push(arguments); }\n  };\n  DisplayUpdate.prototype.finish = function () {\n    for (var i = 0; i < this.events.length; i++)\n      { signal.apply(null, this.events[i]); }\n  };\n\n  function maybeClipScrollbars(cm) {\n    var display = cm.display;\n    if (!display.scrollbarsClipped && display.scroller.offsetWidth) {\n      display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;\n      display.heightForcer.style.height = scrollGap(cm) + \"px\";\n      display.sizer.style.marginBottom = -display.nativeBarWidth + \"px\";\n      display.sizer.style.borderRightWidth = scrollGap(cm) + \"px\";\n      display.scrollbarsClipped = true;\n    }\n  }\n\n  function selectionSnapshot(cm) {\n    if (cm.hasFocus()) { return null }\n    var active = activeElt();\n    if (!active || !contains(cm.display.lineDiv, active)) { return null }\n    var result = {activeElt: active};\n    if (window.getSelection) {\n      var sel = window.getSelection();\n      if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {\n        result.anchorNode = sel.anchorNode;\n        result.anchorOffset = sel.anchorOffset;\n        result.focusNode = sel.focusNode;\n        result.focusOffset = sel.focusOffset;\n      }\n    }\n    return result\n  }\n\n  function restoreSelection(snapshot) {\n    if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return }\n    snapshot.activeElt.focus();\n    if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&\n        snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {\n      var sel = window.getSelection(), range = document.createRange();\n      range.setEnd(snapshot.anchorNode, snapshot.anchorOffset);\n      range.collapse(false);\n      sel.removeAllRanges();\n      sel.addRange(range);\n      sel.extend(snapshot.focusNode, snapshot.focusOffset);\n    }\n  }\n\n  // Does the actual updating of the line display. Bails out\n  // (returning false) when there is nothing to be done and forced is\n  // false.\n  function updateDisplayIfNeeded(cm, update) {\n    var display = cm.display, doc = cm.doc;\n\n    if (update.editorIsHidden) {\n      resetView(cm);\n      return false\n    }\n\n    // Bail out if the visible area is already rendered and nothing changed.\n    if (!update.force &&\n        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n        display.renderedView == display.view && countDirtyView(cm) == 0)\n      { return false }\n\n    if (maybeUpdateLineNumberWidth(cm)) {\n      resetView(cm);\n      update.dims = getDimensions(cm);\n    }\n\n    // Compute a suitable new viewport (from & to)\n    var end = doc.first + doc.size;\n    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);\n    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);\n    if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }\n    if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }\n    if (sawCollapsedSpans) {\n      from = visualLineNo(cm.doc, from);\n      to = visualLineEndNo(cm.doc, to);\n    }\n\n    var different = from != display.viewFrom || to != display.viewTo ||\n      display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;\n    adjustView(cm, from, to);\n\n    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n    // Position the mover div to align with the current scroll position\n    cm.display.mover.style.top = display.viewOffset + \"px\";\n\n    var toUpdate = countDirtyView(cm);\n    if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n      { return false }\n\n    // For big changes, we hide the enclosing element during the\n    // update, since that speeds up the operations on most browsers.\n    var selSnapshot = selectionSnapshot(cm);\n    if (toUpdate > 4) { display.lineDiv.style.display = \"none\"; }\n    patchDisplay(cm, display.updateLineNumbers, update.dims);\n    if (toUpdate > 4) { display.lineDiv.style.display = \"\"; }\n    display.renderedView = display.view;\n    // There might have been a widget with a focused element that got\n    // hidden or updated, if so re-focus it.\n    restoreSelection(selSnapshot);\n\n    // Prevent selection and cursors from interfering with the scroll\n    // width and height.\n    removeChildren(display.cursorDiv);\n    removeChildren(display.selectionDiv);\n    display.gutters.style.height = display.sizer.style.minHeight = 0;\n\n    if (different) {\n      display.lastWrapHeight = update.wrapperHeight;\n      display.lastWrapWidth = update.wrapperWidth;\n      startWorker(cm, 400);\n    }\n\n    display.updateLineNumbers = null;\n\n    return true\n  }\n\n  function postUpdateDisplay(cm, update) {\n    var viewport = update.viewport;\n\n    for (var first = true;; first = false) {\n      if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {\n        // Clip forced viewport to actual scrollable area.\n        if (viewport && viewport.top != null)\n          { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }\n        // Updated line heights might result in the drawn area not\n        // actually covering the viewport. Keep looping until it does.\n        update.visible = visibleLines(cm.display, cm.doc, viewport);\n        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n          { break }\n      } else if (first) {\n        update.visible = visibleLines(cm.display, cm.doc, viewport);\n      }\n      if (!updateDisplayIfNeeded(cm, update)) { break }\n      updateHeightsInViewport(cm);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      updateScrollbars(cm, barMeasure);\n      setDocumentHeight(cm, barMeasure);\n      update.force = false;\n    }\n\n    update.signal(cm, \"update\", cm);\n    if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n      update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n      cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;\n    }\n  }\n\n  function updateDisplaySimple(cm, viewport) {\n    var update = new DisplayUpdate(cm, viewport);\n    if (updateDisplayIfNeeded(cm, update)) {\n      updateHeightsInViewport(cm);\n      postUpdateDisplay(cm, update);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      updateScrollbars(cm, barMeasure);\n      setDocumentHeight(cm, barMeasure);\n      update.finish();\n    }\n  }\n\n  // Sync the actual display DOM structure with display.view, removing\n  // nodes for lines that are no longer in view, and creating the ones\n  // that are not there yet, and updating the ones that are out of\n  // date.\n  function patchDisplay(cm, updateNumbersFrom, dims) {\n    var display = cm.display, lineNumbers = cm.options.lineNumbers;\n    var container = display.lineDiv, cur = container.firstChild;\n\n    function rm(node) {\n      var next = node.nextSibling;\n      // Works around a throw-scroll bug in OS X Webkit\n      if (webkit && mac && cm.display.currentWheelTarget == node)\n        { node.style.display = \"none\"; }\n      else\n        { node.parentNode.removeChild(node); }\n      return next\n    }\n\n    var view = display.view, lineN = display.viewFrom;\n    // Loop over the elements in the view, syncing cur (the DOM nodes\n    // in display.lineDiv) with the view as we go.\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet\n        var node = buildLineElement(cm, lineView, lineN, dims);\n        container.insertBefore(node, cur);\n      } else { // Already drawn\n        while (cur != lineView.node) { cur = rm(cur); }\n        var updateNumber = lineNumbers && updateNumbersFrom != null &&\n          updateNumbersFrom <= lineN && lineView.lineNumber;\n        if (lineView.changes) {\n          if (indexOf(lineView.changes, \"gutter\") > -1) { updateNumber = false; }\n          updateLineForChanges(cm, lineView, lineN, dims);\n        }\n        if (updateNumber) {\n          removeChildren(lineView.lineNumber);\n          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n        }\n        cur = lineView.node.nextSibling;\n      }\n      lineN += lineView.size;\n    }\n    while (cur) { cur = rm(cur); }\n  }\n\n  function updateGutterSpace(display) {\n    var width = display.gutters.offsetWidth;\n    display.sizer.style.marginLeft = width + \"px\";\n    // Send an event to consumers responding to changes in gutter width.\n    signalLater(display, \"gutterChanged\", display);\n  }\n\n  function setDocumentHeight(cm, measure) {\n    cm.display.sizer.style.minHeight = measure.docHeight + \"px\";\n    cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n    cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + \"px\";\n  }\n\n  // Re-align line numbers and gutter marks to compensate for\n  // horizontal scrolling.\n  function alignHorizontally(cm) {\n    var display = cm.display, view = display.view;\n    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }\n    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n    var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n    for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {\n      if (cm.options.fixedGutter) {\n        if (view[i].gutter)\n          { view[i].gutter.style.left = left; }\n        if (view[i].gutterBackground)\n          { view[i].gutterBackground.style.left = left; }\n      }\n      var align = view[i].alignable;\n      if (align) { for (var j = 0; j < align.length; j++)\n        { align[j].style.left = left; } }\n    } }\n    if (cm.options.fixedGutter)\n      { display.gutters.style.left = (comp + gutterW) + \"px\"; }\n  }\n\n  // Used to ensure that the line number gutter is still the right\n  // size for the current document size. Returns true when an update\n  // is needed.\n  function maybeUpdateLineNumberWidth(cm) {\n    if (!cm.options.lineNumbers) { return false }\n    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n    if (last.length != display.lineNumChars) {\n      var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n                                                 \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n      display.lineGutter.style.width = \"\";\n      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;\n      display.lineNumWidth = display.lineNumInnerWidth + padding;\n      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n      display.lineGutter.style.width = display.lineNumWidth + \"px\";\n      updateGutterSpace(cm.display);\n      return true\n    }\n    return false\n  }\n\n  function getGutters(gutters, lineNumbers) {\n    var result = [], sawLineNumbers = false;\n    for (var i = 0; i < gutters.length; i++) {\n      var name = gutters[i], style = null;\n      if (typeof name != \"string\") { style = name.style; name = name.className; }\n      if (name == \"CodeMirror-linenumbers\") {\n        if (!lineNumbers) { continue }\n        else { sawLineNumbers = true; }\n      }\n      result.push({className: name, style: style});\n    }\n    if (lineNumbers && !sawLineNumbers) { result.push({className: \"CodeMirror-linenumbers\", style: null}); }\n    return result\n  }\n\n  // Rebuild the gutter elements, ensure the margin to the left of the\n  // code matches their width.\n  function renderGutters(display) {\n    var gutters = display.gutters, specs = display.gutterSpecs;\n    removeChildren(gutters);\n    display.lineGutter = null;\n    for (var i = 0; i < specs.length; ++i) {\n      var ref = specs[i];\n      var className = ref.className;\n      var style = ref.style;\n      var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + className));\n      if (style) { gElt.style.cssText = style; }\n      if (className == \"CodeMirror-linenumbers\") {\n        display.lineGutter = gElt;\n        gElt.style.width = (display.lineNumWidth || 1) + \"px\";\n      }\n    }\n    gutters.style.display = specs.length ? \"\" : \"none\";\n    updateGutterSpace(display);\n  }\n\n  function updateGutters(cm) {\n    renderGutters(cm.display);\n    regChange(cm);\n    alignHorizontally(cm);\n  }\n\n  // The display handles the DOM integration, both for input reading\n  // and content drawing. It holds references to DOM nodes and\n  // display-related state.\n\n  function Display(place, doc, input, options) {\n    var d = this;\n    this.input = input;\n\n    // Covers bottom-right square when both scrollbars are present.\n    d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n    d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\");\n    // Covers bottom of gutter when coverGutterNextToScrollbar is on\n    // and h scrollbar is present.\n    d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n    d.gutterFiller.setAttribute(\"cm-not-content\", \"true\");\n    // Will contain the actual code, positioned to cover the viewport.\n    d.lineDiv = eltP(\"div\", null, \"CodeMirror-code\");\n    // Elements are added to these to represent selection and cursors.\n    d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n    d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n    // A visibility: hidden element used to find the size of things.\n    d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n    // When lines outside of the viewport are measured, they are drawn in this.\n    d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n    // Wraps everything that needs to exist inside the vertically-padded coordinate system\n    d.lineSpace = eltP(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n                      null, \"position: relative; outline: none\");\n    var lines = eltP(\"div\", [d.lineSpace], \"CodeMirror-lines\");\n    // Moved around its parent to cover visible view.\n    d.mover = elt(\"div\", [lines], null, \"position: relative\");\n    // Set to the height of the document, allowing scrolling.\n    d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n    d.sizerWidth = null;\n    // Behavior of elts with overflow: auto and padding is\n    // inconsistent across browsers. This is used to ensure the\n    // scrollable area is big enough.\n    d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\");\n    // Will contain the gutters, if any.\n    d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n    d.lineGutter = null;\n    // Actual scrollable element.\n    d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n    d.scroller.setAttribute(\"tabIndex\", \"-1\");\n    // The element in which the editor lives.\n    d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n\n    // This attribute is respected by automatic translation systems such as Google Translate,\n    // and may also be respected by tools used by human translators.\n    d.wrapper.setAttribute('translate', 'no');\n\n    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n    if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }\n\n    if (place) {\n      if (place.appendChild) { place.appendChild(d.wrapper); }\n      else { place(d.wrapper); }\n    }\n\n    // Current rendered range (may be bigger than the view window).\n    d.viewFrom = d.viewTo = doc.first;\n    d.reportedViewFrom = d.reportedViewTo = doc.first;\n    // Information about the rendered lines.\n    d.view = [];\n    d.renderedView = null;\n    // Holds info about a single rendered line when it was rendered\n    // for measurement, while not in view.\n    d.externalMeasured = null;\n    // Empty space (in pixels) above the view\n    d.viewOffset = 0;\n    d.lastWrapHeight = d.lastWrapWidth = 0;\n    d.updateLineNumbers = null;\n\n    d.nativeBarWidth = d.barHeight = d.barWidth = 0;\n    d.scrollbarsClipped = false;\n\n    // Used to only resize the line number gutter when necessary (when\n    // the amount of lines crosses a boundary that makes its width change)\n    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n    // Set to true when a non-horizontal-scrolling line widget is\n    // added. As an optimization, line widget aligning is skipped when\n    // this is false.\n    d.alignWidgets = false;\n\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n    // Tracks the maximum line length so that the horizontal scrollbar\n    // can be kept static when scrolling.\n    d.maxLine = null;\n    d.maxLineLength = 0;\n    d.maxLineChanged = false;\n\n    // Used for measuring wheel scrolling granularity\n    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n    // True when shift is held down.\n    d.shift = false;\n\n    // Used to track whether anything happened since the context menu\n    // was opened.\n    d.selForContextMenu = null;\n\n    d.activeTouch = null;\n\n    d.gutterSpecs = getGutters(options.gutters, options.lineNumbers);\n    renderGutters(d);\n\n    input.init(d);\n  }\n\n  // Since the delta values reported on mouse wheel events are\n  // unstandardized between browsers and even browser versions, and\n  // generally horribly unpredictable, this code starts by measuring\n  // the scroll effect that the first few mouse wheel events have,\n  // and, from that, detects the way it can convert deltas to pixel\n  // offsets afterwards.\n  //\n  // The reason we want to know the amount a wheel event will scroll\n  // is that it gives us a chance to update the display before the\n  // actual scrolling happens, reducing flickering.\n\n  var wheelSamples = 0, wheelPixelsPerUnit = null;\n  // Fill in a browser-detected starting value on browsers where we\n  // know one. These don't have to be accurate -- the result of them\n  // being wrong would just be a slight flicker on the first wheel\n  // scroll (if it is large enough).\n  if (ie) { wheelPixelsPerUnit = -.53; }\n  else if (gecko) { wheelPixelsPerUnit = 15; }\n  else if (chrome) { wheelPixelsPerUnit = -.7; }\n  else if (safari) { wheelPixelsPerUnit = -1/3; }\n\n  function wheelEventDelta(e) {\n    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }\n    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }\n    else if (dy == null) { dy = e.wheelDelta; }\n    return {x: dx, y: dy}\n  }\n  function wheelEventPixels(e) {\n    var delta = wheelEventDelta(e);\n    delta.x *= wheelPixelsPerUnit;\n    delta.y *= wheelPixelsPerUnit;\n    return delta\n  }\n\n  function onScrollWheel(cm, e) {\n    var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;\n    var pixelsPerUnit = wheelPixelsPerUnit;\n    if (e.deltaMode === 0) {\n      dx = e.deltaX;\n      dy = e.deltaY;\n      pixelsPerUnit = 1;\n    }\n\n    var display = cm.display, scroll = display.scroller;\n    // Quit if there's nothing to scroll here\n    var canScrollX = scroll.scrollWidth > scroll.clientWidth;\n    var canScrollY = scroll.scrollHeight > scroll.clientHeight;\n    if (!(dx && canScrollX || dy && canScrollY)) { return }\n\n    // Webkit browsers on OS X abort momentum scrolls when the target\n    // of the scroll event is removed from the scrollable element.\n    // This hack (see related code in patchDisplay) makes sure the\n    // element is kept around.\n    if (dy && mac && webkit) {\n      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n        for (var i = 0; i < view.length; i++) {\n          if (view[i].node == cur) {\n            cm.display.currentWheelTarget = cur;\n            break outer\n          }\n        }\n      }\n    }\n\n    // On some browsers, horizontal scrolling will cause redraws to\n    // happen before the gutter has been realigned, causing it to\n    // wriggle around in a most unseemly way. When we have an\n    // estimated pixels/delta value, we just handle horizontal\n    // scrolling entirely here. It'll be slightly off from native, but\n    // better than glitching out.\n    if (dx && !gecko && !presto && pixelsPerUnit != null) {\n      if (dy && canScrollY)\n        { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); }\n      setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit));\n      // Only prevent default scrolling if vertical scrolling is\n      // actually possible. Otherwise, it causes vertical scroll\n      // jitter on OSX trackpads when deltaX is small and deltaY\n      // is large (issue #3579)\n      if (!dy || (dy && canScrollY))\n        { e_preventDefault(e); }\n      display.wheelStartX = null; // Abort measurement, if in progress\n      return\n    }\n\n    // 'Project' the visible viewport to cover the area that is being\n    // scrolled into view (if we know enough to estimate it).\n    if (dy && pixelsPerUnit != null) {\n      var pixels = dy * pixelsPerUnit;\n      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n      if (pixels < 0) { top = Math.max(0, top + pixels - 50); }\n      else { bot = Math.min(cm.doc.height, bot + pixels + 50); }\n      updateDisplaySimple(cm, {top: top, bottom: bot});\n    }\n\n    if (wheelSamples < 20 && e.deltaMode !== 0) {\n      if (display.wheelStartX == null) {\n        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n        display.wheelDX = dx; display.wheelDY = dy;\n        setTimeout(function () {\n          if (display.wheelStartX == null) { return }\n          var movedX = scroll.scrollLeft - display.wheelStartX;\n          var movedY = scroll.scrollTop - display.wheelStartY;\n          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n            (movedX && display.wheelDX && movedX / display.wheelDX);\n          display.wheelStartX = display.wheelStartY = null;\n          if (!sample) { return }\n          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n          ++wheelSamples;\n        }, 200);\n      } else {\n        display.wheelDX += dx; display.wheelDY += dy;\n      }\n    }\n  }\n\n  // Selection objects are immutable. A new one is created every time\n  // the selection changes. A selection is one or more non-overlapping\n  // (and non-touching) ranges, sorted, and an integer that indicates\n  // which one is the primary selection (the one that's scrolled into\n  // view, that getCursor returns, etc).\n  var Selection = function(ranges, primIndex) {\n    this.ranges = ranges;\n    this.primIndex = primIndex;\n  };\n\n  Selection.prototype.primary = function () { return this.ranges[this.primIndex] };\n\n  Selection.prototype.equals = function (other) {\n    if (other == this) { return true }\n    if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }\n    for (var i = 0; i < this.ranges.length; i++) {\n      var here = this.ranges[i], there = other.ranges[i];\n      if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }\n    }\n    return true\n  };\n\n  Selection.prototype.deepCopy = function () {\n    var out = [];\n    for (var i = 0; i < this.ranges.length; i++)\n      { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); }\n    return new Selection(out, this.primIndex)\n  };\n\n  Selection.prototype.somethingSelected = function () {\n    for (var i = 0; i < this.ranges.length; i++)\n      { if (!this.ranges[i].empty()) { return true } }\n    return false\n  };\n\n  Selection.prototype.contains = function (pos, end) {\n    if (!end) { end = pos; }\n    for (var i = 0; i < this.ranges.length; i++) {\n      var range = this.ranges[i];\n      if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n        { return i }\n    }\n    return -1\n  };\n\n  var Range = function(anchor, head) {\n    this.anchor = anchor; this.head = head;\n  };\n\n  Range.prototype.from = function () { return minPos(this.anchor, this.head) };\n  Range.prototype.to = function () { return maxPos(this.anchor, this.head) };\n  Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };\n\n  // Take an unsorted, potentially overlapping set of ranges, and\n  // build a selection out of it. 'Consumes' ranges array (modifying\n  // it).\n  function normalizeSelection(cm, ranges, primIndex) {\n    var mayTouch = cm && cm.options.selectionsMayTouch;\n    var prim = ranges[primIndex];\n    ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });\n    primIndex = indexOf(ranges, prim);\n    for (var i = 1; i < ranges.length; i++) {\n      var cur = ranges[i], prev = ranges[i - 1];\n      var diff = cmp(prev.to(), cur.from());\n      if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {\n        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n        if (i <= primIndex) { --primIndex; }\n        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n      }\n    }\n    return new Selection(ranges, primIndex)\n  }\n\n  function simpleSelection(anchor, head) {\n    return new Selection([new Range(anchor, head || anchor)], 0)\n  }\n\n  // Compute the position of the end of a change (its 'to' property\n  // refers to the pre-change end).\n  function changeEnd(change) {\n    if (!change.text) { return change.to }\n    return Pos(change.from.line + change.text.length - 1,\n               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))\n  }\n\n  // Adjust a position to refer to the post-change position of the\n  // same text, or the end of the change if the change covers it.\n  function adjustForChange(pos, change) {\n    if (cmp(pos, change.from) < 0) { return pos }\n    if (cmp(pos, change.to) <= 0) { return changeEnd(change) }\n\n    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n    if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }\n    return Pos(line, ch)\n  }\n\n  function computeSelAfterChange(doc, change) {\n    var out = [];\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      var range = doc.sel.ranges[i];\n      out.push(new Range(adjustForChange(range.anchor, change),\n                         adjustForChange(range.head, change)));\n    }\n    return normalizeSelection(doc.cm, out, doc.sel.primIndex)\n  }\n\n  function offsetPos(pos, old, nw) {\n    if (pos.line == old.line)\n      { return Pos(nw.line, pos.ch - old.ch + nw.ch) }\n    else\n      { return Pos(nw.line + (pos.line - old.line), pos.ch) }\n  }\n\n  // Used by replaceSelections to allow moving the selection to the\n  // start or around the replaced test. Hint may be \"start\" or \"around\".\n  function computeReplacedSel(doc, changes, hint) {\n    var out = [];\n    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n    for (var i = 0; i < changes.length; i++) {\n      var change = changes[i];\n      var from = offsetPos(change.from, oldPrev, newPrev);\n      var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n      oldPrev = change.to;\n      newPrev = to;\n      if (hint == \"around\") {\n        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n        out[i] = new Range(inv ? to : from, inv ? from : to);\n      } else {\n        out[i] = new Range(from, from);\n      }\n    }\n    return new Selection(out, doc.sel.primIndex)\n  }\n\n  // Used to get the editor into a consistent state again when options change.\n\n  function loadMode(cm) {\n    cm.doc.mode = getMode(cm.options, cm.doc.modeOption);\n    resetModeState(cm);\n  }\n\n  function resetModeState(cm) {\n    cm.doc.iter(function (line) {\n      if (line.stateAfter) { line.stateAfter = null; }\n      if (line.styles) { line.styles = null; }\n    });\n    cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;\n    startWorker(cm, 100);\n    cm.state.modeGen++;\n    if (cm.curOp) { regChange(cm); }\n  }\n\n  // DOCUMENT DATA STRUCTURE\n\n  // By default, updates that start and end at the beginning of a line\n  // are treated specially, in order to make the association of line\n  // widgets and marker elements with the text behave more intuitive.\n  function isWholeLineUpdate(doc, change) {\n    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n      (!doc.cm || doc.cm.options.wholeLineUpdateBefore)\n  }\n\n  // Perform a change on the document data structure.\n  function updateDoc(doc, change, markedSpans, estimateHeight) {\n    function spansFor(n) {return markedSpans ? markedSpans[n] : null}\n    function update(line, text, spans) {\n      updateLine(line, text, spans, estimateHeight);\n      signalLater(line, \"change\", line, change);\n    }\n    function linesFor(start, end) {\n      var result = [];\n      for (var i = start; i < end; ++i)\n        { result.push(new Line(text[i], spansFor(i), estimateHeight)); }\n      return result\n    }\n\n    var from = change.from, to = change.to, text = change.text;\n    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n    // Adjust the line structure\n    if (change.full) {\n      doc.insert(0, linesFor(0, text.length));\n      doc.remove(text.length, doc.size - text.length);\n    } else if (isWholeLineUpdate(doc, change)) {\n      // This is a whole-line replace. Treated specially to make\n      // sure line objects move the way they are supposed to.\n      var added = linesFor(0, text.length - 1);\n      update(lastLine, lastLine.text, lastSpans);\n      if (nlines) { doc.remove(from.line, nlines); }\n      if (added.length) { doc.insert(from.line, added); }\n    } else if (firstLine == lastLine) {\n      if (text.length == 1) {\n        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n      } else {\n        var added$1 = linesFor(1, text.length - 1);\n        added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));\n        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n        doc.insert(from.line + 1, added$1);\n      }\n    } else if (text.length == 1) {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n      doc.remove(from.line + 1, nlines);\n    } else {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n      var added$2 = linesFor(1, text.length - 1);\n      if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }\n      doc.insert(from.line + 1, added$2);\n    }\n\n    signalLater(doc, \"change\", doc, change);\n  }\n\n  // Call f for all linked documents.\n  function linkedDocs(doc, f, sharedHistOnly) {\n    function propagate(doc, skip, sharedHist) {\n      if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {\n        var rel = doc.linked[i];\n        if (rel.doc == skip) { continue }\n        var shared = sharedHist && rel.sharedHist;\n        if (sharedHistOnly && !shared) { continue }\n        f(rel.doc, shared);\n        propagate(rel.doc, doc, shared);\n      } }\n    }\n    propagate(doc, null, true);\n  }\n\n  // Attach a document to an editor.\n  function attachDoc(cm, doc) {\n    if (doc.cm) { throw new Error(\"This document is already in use.\") }\n    cm.doc = doc;\n    doc.cm = cm;\n    estimateLineHeights(cm);\n    loadMode(cm);\n    setDirectionClass(cm);\n    cm.options.direction = doc.direction;\n    if (!cm.options.lineWrapping) { findMaxLine(cm); }\n    cm.options.mode = doc.modeOption;\n    regChange(cm);\n  }\n\n  function setDirectionClass(cm) {\n  (cm.doc.direction == \"rtl\" ? addClass : rmClass)(cm.display.lineDiv, \"CodeMirror-rtl\");\n  }\n\n  function directionChanged(cm) {\n    runInOp(cm, function () {\n      setDirectionClass(cm);\n      regChange(cm);\n    });\n  }\n\n  function History(prev) {\n    // Arrays of change events and selections. Doing something adds an\n    // event to done and clears undo. Undoing moves events from done\n    // to undone, redoing moves them in the other direction.\n    this.done = []; this.undone = [];\n    this.undoDepth = prev ? prev.undoDepth : Infinity;\n    // Used to track when changes can be merged into a single undo\n    // event\n    this.lastModTime = this.lastSelTime = 0;\n    this.lastOp = this.lastSelOp = null;\n    this.lastOrigin = this.lastSelOrigin = null;\n    // Used by the isClean() method\n    this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1;\n  }\n\n  // Create a history change event from an updateDoc-style change\n  // object.\n  function historyChangeFromChange(doc, change) {\n    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n    linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);\n    return histChange\n  }\n\n  // Pop all selection events off the end of a history array. Stop at\n  // a change event.\n  function clearSelectionEvents(array) {\n    while (array.length) {\n      var last = lst(array);\n      if (last.ranges) { array.pop(); }\n      else { break }\n    }\n  }\n\n  // Find the top change event in the history. Pop off selection\n  // events that are in the way.\n  function lastChangeEvent(hist, force) {\n    if (force) {\n      clearSelectionEvents(hist.done);\n      return lst(hist.done)\n    } else if (hist.done.length && !lst(hist.done).ranges) {\n      return lst(hist.done)\n    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n      hist.done.pop();\n      return lst(hist.done)\n    }\n  }\n\n  // Register a change in the history. Merges changes that are within\n  // a single operation, or are close together with an origin that\n  // allows merging (starting with \"+\") into a single event.\n  function addChangeToHistory(doc, change, selAfter, opId) {\n    var hist = doc.history;\n    hist.undone.length = 0;\n    var time = +new Date, cur;\n    var last;\n\n    if ((hist.lastOp == opId ||\n         hist.lastOrigin == change.origin && change.origin &&\n         ((change.origin.charAt(0) == \"+\" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||\n          change.origin.charAt(0) == \"*\")) &&\n        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n      // Merge this change into the last event\n      last = lst(cur.changes);\n      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n        // Optimized case for simple insertion -- don't want to add\n        // new changesets for every character typed\n        last.to = changeEnd(change);\n      } else {\n        // Add new sub-event\n        cur.changes.push(historyChangeFromChange(doc, change));\n      }\n    } else {\n      // Can not be merged, start a new event.\n      var before = lst(hist.done);\n      if (!before || !before.ranges)\n        { pushSelectionToHistory(doc.sel, hist.done); }\n      cur = {changes: [historyChangeFromChange(doc, change)],\n             generation: hist.generation};\n      hist.done.push(cur);\n      while (hist.done.length > hist.undoDepth) {\n        hist.done.shift();\n        if (!hist.done[0].ranges) { hist.done.shift(); }\n      }\n    }\n    hist.done.push(selAfter);\n    hist.generation = ++hist.maxGeneration;\n    hist.lastModTime = hist.lastSelTime = time;\n    hist.lastOp = hist.lastSelOp = opId;\n    hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n    if (!last) { signal(doc, \"historyAdded\"); }\n  }\n\n  function selectionEventCanBeMerged(doc, origin, prev, sel) {\n    var ch = origin.charAt(0);\n    return ch == \"*\" ||\n      ch == \"+\" &&\n      prev.ranges.length == sel.ranges.length &&\n      prev.somethingSelected() == sel.somethingSelected() &&\n      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)\n  }\n\n  // Called whenever the selection changes, sets the new selection as\n  // the pending selection in the history, and pushes the old pending\n  // selection into the 'done' array when it was significantly\n  // different (in number of selected ranges, emptiness, or time).\n  function addSelectionToHistory(doc, sel, opId, options) {\n    var hist = doc.history, origin = options && options.origin;\n\n    // A new event is started when the previous origin does not match\n    // the current, or the origins don't allow matching. Origins\n    // starting with * are always merged, those starting with + are\n    // merged when similar and close together in time.\n    if (opId == hist.lastSelOp ||\n        (origin && hist.lastSelOrigin == origin &&\n         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n      { hist.done[hist.done.length - 1] = sel; }\n    else\n      { pushSelectionToHistory(sel, hist.done); }\n\n    hist.lastSelTime = +new Date;\n    hist.lastSelOrigin = origin;\n    hist.lastSelOp = opId;\n    if (options && options.clearRedo !== false)\n      { clearSelectionEvents(hist.undone); }\n  }\n\n  function pushSelectionToHistory(sel, dest) {\n    var top = lst(dest);\n    if (!(top && top.ranges && top.equals(sel)))\n      { dest.push(sel); }\n  }\n\n  // Used to store marked span information in the history.\n  function attachLocalSpans(doc, change, from, to) {\n    var existing = change[\"spans_\" + doc.id], n = 0;\n    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {\n      if (line.markedSpans)\n        { (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans; }\n      ++n;\n    });\n  }\n\n  // When un/re-doing restores text containing marked spans, those\n  // that have been explicitly cleared should not be restored.\n  function removeClearedSpans(spans) {\n    if (!spans) { return null }\n    var out;\n    for (var i = 0; i < spans.length; ++i) {\n      if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }\n      else if (out) { out.push(spans[i]); }\n    }\n    return !out ? spans : out.length ? out : null\n  }\n\n  // Retrieve and filter the old marked spans stored in a change event.\n  function getOldSpans(doc, change) {\n    var found = change[\"spans_\" + doc.id];\n    if (!found) { return null }\n    var nw = [];\n    for (var i = 0; i < change.text.length; ++i)\n      { nw.push(removeClearedSpans(found[i])); }\n    return nw\n  }\n\n  // Used for un/re-doing changes from the history. Combines the\n  // result of computing the existing spans with the set of spans that\n  // existed in the history (so that deleting around a span and then\n  // undoing brings back the span).\n  function mergeOldSpans(doc, change) {\n    var old = getOldSpans(doc, change);\n    var stretched = stretchSpansOverChange(doc, change);\n    if (!old) { return stretched }\n    if (!stretched) { return old }\n\n    for (var i = 0; i < old.length; ++i) {\n      var oldCur = old[i], stretchCur = stretched[i];\n      if (oldCur && stretchCur) {\n        spans: for (var j = 0; j < stretchCur.length; ++j) {\n          var span = stretchCur[j];\n          for (var k = 0; k < oldCur.length; ++k)\n            { if (oldCur[k].marker == span.marker) { continue spans } }\n          oldCur.push(span);\n        }\n      } else if (stretchCur) {\n        old[i] = stretchCur;\n      }\n    }\n    return old\n  }\n\n  // Used both to provide a JSON-safe object in .getHistory, and, when\n  // detaching a document, to split the history in two\n  function copyHistoryArray(events, newGroup, instantiateSel) {\n    var copy = [];\n    for (var i = 0; i < events.length; ++i) {\n      var event = events[i];\n      if (event.ranges) {\n        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n        continue\n      }\n      var changes = event.changes, newChanges = [];\n      copy.push({changes: newChanges});\n      for (var j = 0; j < changes.length; ++j) {\n        var change = changes[j], m = (void 0);\n        newChanges.push({from: change.from, to: change.to, text: change.text});\n        if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\\d+)$/)) {\n          if (indexOf(newGroup, Number(m[1])) > -1) {\n            lst(newChanges)[prop] = change[prop];\n            delete change[prop];\n          }\n        } } }\n      }\n    }\n    return copy\n  }\n\n  // The 'scroll' parameter given to many of these indicated whether\n  // the new cursor position should be scrolled into view after\n  // modifying the selection.\n\n  // If shift is held or the extend flag is set, extends a range to\n  // include a given position (and optionally a second position).\n  // Otherwise, simply returns the range between the given positions.\n  // Used for cursor motion and such.\n  function extendRange(range, head, other, extend) {\n    if (extend) {\n      var anchor = range.anchor;\n      if (other) {\n        var posBefore = cmp(head, anchor) < 0;\n        if (posBefore != (cmp(other, anchor) < 0)) {\n          anchor = head;\n          head = other;\n        } else if (posBefore != (cmp(head, other) < 0)) {\n          head = other;\n        }\n      }\n      return new Range(anchor, head)\n    } else {\n      return new Range(other || head, head)\n    }\n  }\n\n  // Extend the primary selection range, discard the rest.\n  function extendSelection(doc, head, other, options, extend) {\n    if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }\n    setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);\n  }\n\n  // Extend all selections (pos is an array of selections with length\n  // equal the number of selections)\n  function extendSelections(doc, heads, options) {\n    var out = [];\n    var extend = doc.cm && (doc.cm.display.shift || doc.extend);\n    for (var i = 0; i < doc.sel.ranges.length; i++)\n      { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }\n    var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex);\n    setSelection(doc, newSel, options);\n  }\n\n  // Updates a single range in the selection.\n  function replaceOneSelection(doc, i, range, options) {\n    var ranges = doc.sel.ranges.slice(0);\n    ranges[i] = range;\n    setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options);\n  }\n\n  // Reset the selection to a single range.\n  function setSimpleSelection(doc, anchor, head, options) {\n    setSelection(doc, simpleSelection(anchor, head), options);\n  }\n\n  // Give beforeSelectionChange handlers a change to influence a\n  // selection update.\n  function filterSelectionChange(doc, sel, options) {\n    var obj = {\n      ranges: sel.ranges,\n      update: function(ranges) {\n        this.ranges = [];\n        for (var i = 0; i < ranges.length; i++)\n          { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n                                     clipPos(doc, ranges[i].head)); }\n      },\n      origin: options && options.origin\n    };\n    signal(doc, \"beforeSelectionChange\", doc, obj);\n    if (doc.cm) { signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj); }\n    if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) }\n    else { return sel }\n  }\n\n  function setSelectionReplaceHistory(doc, sel, options) {\n    var done = doc.history.done, last = lst(done);\n    if (last && last.ranges) {\n      done[done.length - 1] = sel;\n      setSelectionNoUndo(doc, sel, options);\n    } else {\n      setSelection(doc, sel, options);\n    }\n  }\n\n  // Set a new selection.\n  function setSelection(doc, sel, options) {\n    setSelectionNoUndo(doc, sel, options);\n    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n  }\n\n  function setSelectionNoUndo(doc, sel, options) {\n    if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n      { sel = filterSelectionChange(doc, sel, options); }\n\n    var bias = options && options.bias ||\n      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);\n    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n    if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption(\"readOnly\") != \"nocursor\")\n      { ensureCursorVisible(doc.cm); }\n  }\n\n  function setSelectionInner(doc, sel) {\n    if (sel.equals(doc.sel)) { return }\n\n    doc.sel = sel;\n\n    if (doc.cm) {\n      doc.cm.curOp.updateInput = 1;\n      doc.cm.curOp.selectionChanged = true;\n      signalCursorActivity(doc.cm);\n    }\n    signalLater(doc, \"cursorActivity\", doc);\n  }\n\n  // Verify that the selection does not partially select any atomic\n  // marked ranges.\n  function reCheckSelection(doc) {\n    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));\n  }\n\n  // Return a selection that does not partially select any atomic\n  // ranges.\n  function skipAtomicInSelection(doc, sel, bias, mayClear) {\n    var out;\n    for (var i = 0; i < sel.ranges.length; i++) {\n      var range = sel.ranges[i];\n      var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];\n      var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);\n      var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);\n      if (out || newAnchor != range.anchor || newHead != range.head) {\n        if (!out) { out = sel.ranges.slice(0, i); }\n        out[i] = new Range(newAnchor, newHead);\n      }\n    }\n    return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel\n  }\n\n  function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {\n    var line = getLine(doc, pos.line);\n    if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n      var sp = line.markedSpans[i], m = sp.marker;\n\n      // Determine if we should prevent the cursor being placed to the left/right of an atomic marker\n      // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it\n      // is with selectLeft/Right\n      var preventCursorLeft = (\"selectLeft\" in m) ? !m.selectLeft : m.inclusiveLeft;\n      var preventCursorRight = (\"selectRight\" in m) ? !m.selectRight : m.inclusiveRight;\n\n      if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n          (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n        if (mayClear) {\n          signal(m, \"beforeCursorEnter\");\n          if (m.explicitlyCleared) {\n            if (!line.markedSpans) { break }\n            else {--i; continue}\n          }\n        }\n        if (!m.atomic) { continue }\n\n        if (oldPos) {\n          var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);\n          if (dir < 0 ? preventCursorRight : preventCursorLeft)\n            { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }\n          if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))\n            { return skipAtomicInner(doc, near, pos, dir, mayClear) }\n        }\n\n        var far = m.find(dir < 0 ? -1 : 1);\n        if (dir < 0 ? preventCursorLeft : preventCursorRight)\n          { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }\n        return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null\n      }\n    } }\n    return pos\n  }\n\n  // Ensure a given position is not inside an atomic range.\n  function skipAtomic(doc, pos, oldPos, bias, mayClear) {\n    var dir = bias || 1;\n    var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||\n        (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||\n        skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||\n        (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));\n    if (!found) {\n      doc.cantEdit = true;\n      return Pos(doc.first, 0)\n    }\n    return found\n  }\n\n  function movePos(doc, pos, dir, line) {\n    if (dir < 0 && pos.ch == 0) {\n      if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }\n      else { return null }\n    } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {\n      if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }\n      else { return null }\n    } else {\n      return new Pos(pos.line, pos.ch + dir)\n    }\n  }\n\n  function selectAll(cm) {\n    cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);\n  }\n\n  // UPDATING\n\n  // Allow \"beforeChange\" event handlers to influence a change\n  function filterChange(doc, change, update) {\n    var obj = {\n      canceled: false,\n      from: change.from,\n      to: change.to,\n      text: change.text,\n      origin: change.origin,\n      cancel: function () { return obj.canceled = true; }\n    };\n    if (update) { obj.update = function (from, to, text, origin) {\n      if (from) { obj.from = clipPos(doc, from); }\n      if (to) { obj.to = clipPos(doc, to); }\n      if (text) { obj.text = text; }\n      if (origin !== undefined) { obj.origin = origin; }\n    }; }\n    signal(doc, \"beforeChange\", doc, obj);\n    if (doc.cm) { signal(doc.cm, \"beforeChange\", doc.cm, obj); }\n\n    if (obj.canceled) {\n      if (doc.cm) { doc.cm.curOp.updateInput = 2; }\n      return null\n    }\n    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}\n  }\n\n  // Apply a change to a document, and add it to the document's\n  // history, and propagating it to all linked documents.\n  function makeChange(doc, change, ignoreReadOnly) {\n    if (doc.cm) {\n      if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }\n      if (doc.cm.state.suppressEdits) { return }\n    }\n\n    if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n      change = filterChange(doc, change, true);\n      if (!change) { return }\n    }\n\n    // Possibly split or suppress the update based on the presence\n    // of read-only spans in its range.\n    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n    if (split) {\n      for (var i = split.length - 1; i >= 0; --i)\n        { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text, origin: change.origin}); }\n    } else {\n      makeChangeInner(doc, change);\n    }\n  }\n\n  function makeChangeInner(doc, change) {\n    if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) { return }\n    var selAfter = computeSelAfterChange(doc, change);\n    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n    var rebased = [];\n\n    linkedDocs(doc, function (doc, sharedHist) {\n      if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n        rebaseHist(doc.history, change);\n        rebased.push(doc.history);\n      }\n      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n    });\n  }\n\n  // Revert a change stored in a document's history.\n  function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n    var suppress = doc.cm && doc.cm.state.suppressEdits;\n    if (suppress && !allowSelectionOnly) { return }\n\n    var hist = doc.history, event, selAfter = doc.sel;\n    var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n    // Verify that there is a useable event (so that ctrl-z won't\n    // needlessly clear selection events)\n    var i = 0;\n    for (; i < source.length; i++) {\n      event = source[i];\n      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n        { break }\n    }\n    if (i == source.length) { return }\n    hist.lastOrigin = hist.lastSelOrigin = null;\n\n    for (;;) {\n      event = source.pop();\n      if (event.ranges) {\n        pushSelectionToHistory(event, dest);\n        if (allowSelectionOnly && !event.equals(doc.sel)) {\n          setSelection(doc, event, {clearRedo: false});\n          return\n        }\n        selAfter = event;\n      } else if (suppress) {\n        source.push(event);\n        return\n      } else { break }\n    }\n\n    // Build up a reverse change object to add to the opposite history\n    // stack (redo when undoing, and vice versa).\n    var antiChanges = [];\n    pushSelectionToHistory(selAfter, dest);\n    dest.push({changes: antiChanges, generation: hist.generation});\n    hist.generation = event.generation || ++hist.maxGeneration;\n\n    var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n    var loop = function ( i ) {\n      var change = event.changes[i];\n      change.origin = type;\n      if (filter && !filterChange(doc, change, false)) {\n        source.length = 0;\n        return {}\n      }\n\n      antiChanges.push(historyChangeFromChange(doc, change));\n\n      var after = i ? computeSelAfterChange(doc, change) : lst(source);\n      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n      if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }\n      var rebased = [];\n\n      // Propagate to the linked documents\n      linkedDocs(doc, function (doc, sharedHist) {\n        if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n          rebaseHist(doc.history, change);\n          rebased.push(doc.history);\n        }\n        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n      });\n    };\n\n    for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {\n      var returned = loop( i$1 );\n\n      if ( returned ) return returned.v;\n    }\n  }\n\n  // Sub-views need their line numbers shifted when text is added\n  // above or below them in the parent document.\n  function shiftDoc(doc, distance) {\n    if (distance == 0) { return }\n    doc.first += distance;\n    doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(\n      Pos(range.anchor.line + distance, range.anchor.ch),\n      Pos(range.head.line + distance, range.head.ch)\n    ); }), doc.sel.primIndex);\n    if (doc.cm) {\n      regChange(doc.cm, doc.first, doc.first - distance, distance);\n      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n        { regLineChange(doc.cm, l, \"gutter\"); }\n    }\n  }\n\n  // More lower-level change function, handling only a single document\n  // (not linked ones).\n  function makeChangeSingleDoc(doc, change, selAfter, spans) {\n    if (doc.cm && !doc.cm.curOp)\n      { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }\n\n    if (change.to.line < doc.first) {\n      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n      return\n    }\n    if (change.from.line > doc.lastLine()) { return }\n\n    // Clip the change to the size of this doc\n    if (change.from.line < doc.first) {\n      var shift = change.text.length - 1 - (doc.first - change.from.line);\n      shiftDoc(doc, shift);\n      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n                text: [lst(change.text)], origin: change.origin};\n    }\n    var last = doc.lastLine();\n    if (change.to.line > last) {\n      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n                text: [change.text[0]], origin: change.origin};\n    }\n\n    change.removed = getBetween(doc, change.from, change.to);\n\n    if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }\n    if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }\n    else { updateDoc(doc, change, spans); }\n    setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n\n    if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))\n      { doc.cantEdit = false; }\n  }\n\n  // Handle the interaction of a change to a document with the editor\n  // that this document is part of.\n  function makeChangeSingleDocInEditor(cm, change, spans) {\n    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n    var recomputeMaxLength = false, checkWidthStart = from.line;\n    if (!cm.options.lineWrapping) {\n      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n      doc.iter(checkWidthStart, to.line + 1, function (line) {\n        if (line == display.maxLine) {\n          recomputeMaxLength = true;\n          return true\n        }\n      });\n    }\n\n    if (doc.sel.contains(change.from, change.to) > -1)\n      { signalCursorActivity(cm); }\n\n    updateDoc(doc, change, spans, estimateHeight(cm));\n\n    if (!cm.options.lineWrapping) {\n      doc.iter(checkWidthStart, from.line + change.text.length, function (line) {\n        var len = lineLength(line);\n        if (len > display.maxLineLength) {\n          display.maxLine = line;\n          display.maxLineLength = len;\n          display.maxLineChanged = true;\n          recomputeMaxLength = false;\n        }\n      });\n      if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }\n    }\n\n    retreatFrontier(doc, from.line);\n    startWorker(cm, 400);\n\n    var lendiff = change.text.length - (to.line - from.line) - 1;\n    // Remember that these lines changed, for updating the display\n    if (change.full)\n      { regChange(cm); }\n    else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n      { regLineChange(cm, from.line, \"text\"); }\n    else\n      { regChange(cm, from.line, to.line + 1, lendiff); }\n\n    var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n    if (changeHandler || changesHandler) {\n      var obj = {\n        from: from, to: to,\n        text: change.text,\n        removed: change.removed,\n        origin: change.origin\n      };\n      if (changeHandler) { signalLater(cm, \"change\", cm, obj); }\n      if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }\n    }\n    cm.display.selForContextMenu = null;\n  }\n\n  function replaceRange(doc, code, from, to, origin) {\n    var assign;\n\n    if (!to) { to = from; }\n    if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); }\n    if (typeof code == \"string\") { code = doc.splitLines(code); }\n    makeChange(doc, {from: from, to: to, text: code, origin: origin});\n  }\n\n  // Rebasing/resetting history to deal with externally-sourced changes\n\n  function rebaseHistSelSingle(pos, from, to, diff) {\n    if (to < pos.line) {\n      pos.line += diff;\n    } else if (from < pos.line) {\n      pos.line = from;\n      pos.ch = 0;\n    }\n  }\n\n  // Tries to rebase an array of history events given a change in the\n  // document. If the change touches the same lines as the event, the\n  // event, and everything 'behind' it, is discarded. If the change is\n  // before the event, the event's positions are updated. Uses a\n  // copy-on-write scheme for the positions, to avoid having to\n  // reallocate them all on every rebase, but also avoid problems with\n  // shared position objects being unsafely updated.\n  function rebaseHistArray(array, from, to, diff) {\n    for (var i = 0; i < array.length; ++i) {\n      var sub = array[i], ok = true;\n      if (sub.ranges) {\n        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n        for (var j = 0; j < sub.ranges.length; j++) {\n          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n        }\n        continue\n      }\n      for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {\n        var cur = sub.changes[j$1];\n        if (to < cur.from.line) {\n          cur.from = Pos(cur.from.line + diff, cur.from.ch);\n          cur.to = Pos(cur.to.line + diff, cur.to.ch);\n        } else if (from <= cur.to.line) {\n          ok = false;\n          break\n        }\n      }\n      if (!ok) {\n        array.splice(0, i + 1);\n        i = 0;\n      }\n    }\n  }\n\n  function rebaseHist(hist, change) {\n    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n    rebaseHistArray(hist.done, from, to, diff);\n    rebaseHistArray(hist.undone, from, to, diff);\n  }\n\n  // Utility for applying a change to a line by handle or number,\n  // returning the number and optionally registering the line as\n  // changed.\n  function changeLine(doc, handle, changeType, op) {\n    var no = handle, line = handle;\n    if (typeof handle == \"number\") { line = getLine(doc, clipLine(doc, handle)); }\n    else { no = lineNo(handle); }\n    if (no == null) { return null }\n    if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }\n    return line\n  }\n\n  // The document is represented as a BTree consisting of leaves, with\n  // chunk of lines in them, and branches, with up to ten leaves or\n  // other branch nodes below them. The top node is always a branch\n  // node, and is the document object itself (meaning it has\n  // additional methods and properties).\n  //\n  // All nodes have parent links. The tree is used both to go from\n  // line numbers to line objects, and to go from objects to numbers.\n  // It also indexes by height, and is used to convert between height\n  // and line object, and to find the total height of the document.\n  //\n  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\n  function LeafChunk(lines) {\n    this.lines = lines;\n    this.parent = null;\n    var height = 0;\n    for (var i = 0; i < lines.length; ++i) {\n      lines[i].parent = this;\n      height += lines[i].height;\n    }\n    this.height = height;\n  }\n\n  LeafChunk.prototype = {\n    chunkSize: function() { return this.lines.length },\n\n    // Remove the n lines at offset 'at'.\n    removeInner: function(at, n) {\n      for (var i = at, e = at + n; i < e; ++i) {\n        var line = this.lines[i];\n        this.height -= line.height;\n        cleanUpLine(line);\n        signalLater(line, \"delete\");\n      }\n      this.lines.splice(at, n);\n    },\n\n    // Helper used to collapse a small branch into a single leaf.\n    collapse: function(lines) {\n      lines.push.apply(lines, this.lines);\n    },\n\n    // Insert the given array of lines at offset 'at', count them as\n    // having the given height.\n    insertInner: function(at, lines, height) {\n      this.height += height;\n      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n      for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; }\n    },\n\n    // Used to iterate over a part of the tree.\n    iterN: function(at, n, op) {\n      for (var e = at + n; at < e; ++at)\n        { if (op(this.lines[at])) { return true } }\n    }\n  };\n\n  function BranchChunk(children) {\n    this.children = children;\n    var size = 0, height = 0;\n    for (var i = 0; i < children.length; ++i) {\n      var ch = children[i];\n      size += ch.chunkSize(); height += ch.height;\n      ch.parent = this;\n    }\n    this.size = size;\n    this.height = height;\n    this.parent = null;\n  }\n\n  BranchChunk.prototype = {\n    chunkSize: function() { return this.size },\n\n    removeInner: function(at, n) {\n      this.size -= n;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var rm = Math.min(n, sz - at), oldHeight = child.height;\n          child.removeInner(at, rm);\n          this.height -= oldHeight - child.height;\n          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }\n          if ((n -= rm) == 0) { break }\n          at = 0;\n        } else { at -= sz; }\n      }\n      // If the result is smaller than 25 lines, ensure that it is a\n      // single leaf node.\n      if (this.size - n < 25 &&\n          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n        var lines = [];\n        this.collapse(lines);\n        this.children = [new LeafChunk(lines)];\n        this.children[0].parent = this;\n      }\n    },\n\n    collapse: function(lines) {\n      for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); }\n    },\n\n    insertInner: function(at, lines, height) {\n      this.size += lines.length;\n      this.height += height;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at <= sz) {\n          child.insertInner(at, lines, height);\n          if (child.lines && child.lines.length > 50) {\n            // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.\n            // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.\n            var remaining = child.lines.length % 25 + 25;\n            for (var pos = remaining; pos < child.lines.length;) {\n              var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));\n              child.height -= leaf.height;\n              this.children.splice(++i, 0, leaf);\n              leaf.parent = this;\n            }\n            child.lines = child.lines.slice(0, remaining);\n            this.maybeSpill();\n          }\n          break\n        }\n        at -= sz;\n      }\n    },\n\n    // When a node has grown, check whether it should be split.\n    maybeSpill: function() {\n      if (this.children.length <= 10) { return }\n      var me = this;\n      do {\n        var spilled = me.children.splice(me.children.length - 5, 5);\n        var sibling = new BranchChunk(spilled);\n        if (!me.parent) { // Become the parent node\n          var copy = new BranchChunk(me.children);\n          copy.parent = me;\n          me.children = [copy, sibling];\n          me = copy;\n       } else {\n          me.size -= sibling.size;\n          me.height -= sibling.height;\n          var myIndex = indexOf(me.parent.children, me);\n          me.parent.children.splice(myIndex + 1, 0, sibling);\n        }\n        sibling.parent = me.parent;\n      } while (me.children.length > 10)\n      me.parent.maybeSpill();\n    },\n\n    iterN: function(at, n, op) {\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var used = Math.min(n, sz - at);\n          if (child.iterN(at, used, op)) { return true }\n          if ((n -= used) == 0) { break }\n          at = 0;\n        } else { at -= sz; }\n      }\n    }\n  };\n\n  // Line widgets are block elements displayed above or below a line.\n\n  var LineWidget = function(doc, node, options) {\n    if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))\n      { this[opt] = options[opt]; } } }\n    this.doc = doc;\n    this.node = node;\n  };\n\n  LineWidget.prototype.clear = function () {\n    var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n    if (no == null || !ws) { return }\n    for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } }\n    if (!ws.length) { line.widgets = null; }\n    var height = widgetHeight(this);\n    updateLineHeight(line, Math.max(0, line.height - height));\n    if (cm) {\n      runInOp(cm, function () {\n        adjustScrollWhenAboveVisible(cm, line, -height);\n        regLineChange(cm, no, \"widget\");\n      });\n      signalLater(cm, \"lineWidgetCleared\", cm, this, no);\n    }\n  };\n\n  LineWidget.prototype.changed = function () {\n      var this$1 = this;\n\n    var oldH = this.height, cm = this.doc.cm, line = this.line;\n    this.height = null;\n    var diff = widgetHeight(this) - oldH;\n    if (!diff) { return }\n    if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); }\n    if (cm) {\n      runInOp(cm, function () {\n        cm.curOp.forceUpdate = true;\n        adjustScrollWhenAboveVisible(cm, line, diff);\n        signalLater(cm, \"lineWidgetChanged\", cm, this$1, lineNo(line));\n      });\n    }\n  };\n  eventMixin(LineWidget);\n\n  function adjustScrollWhenAboveVisible(cm, line, diff) {\n    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n      { addToScrollTop(cm, diff); }\n  }\n\n  function addLineWidget(doc, handle, node, options) {\n    var widget = new LineWidget(doc, node, options);\n    var cm = doc.cm;\n    if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }\n    changeLine(doc, handle, \"widget\", function (line) {\n      var widgets = line.widgets || (line.widgets = []);\n      if (widget.insertAt == null) { widgets.push(widget); }\n      else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); }\n      widget.line = line;\n      if (cm && !lineIsHidden(doc, line)) {\n        var aboveVisible = heightAtLine(line) < doc.scrollTop;\n        updateLineHeight(line, line.height + widgetHeight(widget));\n        if (aboveVisible) { addToScrollTop(cm, widget.height); }\n        cm.curOp.forceUpdate = true;\n      }\n      return true\n    });\n    if (cm) { signalLater(cm, \"lineWidgetAdded\", cm, widget, typeof handle == \"number\" ? handle : lineNo(handle)); }\n    return widget\n  }\n\n  // TEXTMARKERS\n\n  // Created with markText and setBookmark methods. A TextMarker is a\n  // handle that can be used to clear or find a marked position in the\n  // document. Line objects hold arrays (markedSpans) containing\n  // {from, to, marker} object pointing to such marker objects, and\n  // indicating that such a marker is present on that line. Multiple\n  // lines may point to the same marker when it spans across lines.\n  // The spans will have null for their from/to properties when the\n  // marker continues beyond the start/end of the line. Markers have\n  // links back to the lines they currently touch.\n\n  // Collapsed markers have unique ids, in order to be able to order\n  // them, which is needed for uniquely determining an outer marker\n  // when they overlap (they may nest, but not partially overlap).\n  var nextMarkerId = 0;\n\n  var TextMarker = function(doc, type) {\n    this.lines = [];\n    this.type = type;\n    this.doc = doc;\n    this.id = ++nextMarkerId;\n  };\n\n  // Clear the marker.\n  TextMarker.prototype.clear = function () {\n    if (this.explicitlyCleared) { return }\n    var cm = this.doc.cm, withOp = cm && !cm.curOp;\n    if (withOp) { startOperation(cm); }\n    if (hasHandler(this, \"clear\")) {\n      var found = this.find();\n      if (found) { signalLater(this, \"clear\", found.from, found.to); }\n    }\n    var min = null, max = null;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), \"text\"); }\n      else if (cm) {\n        if (span.to != null) { max = lineNo(line); }\n        if (span.from != null) { min = lineNo(line); }\n      }\n      line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n        { updateLineHeight(line, textHeight(cm.display)); }\n    }\n    if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {\n      var visual = visualLine(this.lines[i$1]), len = lineLength(visual);\n      if (len > cm.display.maxLineLength) {\n        cm.display.maxLine = visual;\n        cm.display.maxLineLength = len;\n        cm.display.maxLineChanged = true;\n      }\n    } }\n\n    if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }\n    this.lines.length = 0;\n    this.explicitlyCleared = true;\n    if (this.atomic && this.doc.cantEdit) {\n      this.doc.cantEdit = false;\n      if (cm) { reCheckSelection(cm.doc); }\n    }\n    if (cm) { signalLater(cm, \"markerCleared\", cm, this, min, max); }\n    if (withOp) { endOperation(cm); }\n    if (this.parent) { this.parent.clear(); }\n  };\n\n  // Find the position of the marker in the document. Returns a {from,\n  // to} object by default. Side can be passed to get a specific side\n  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n  // Pos objects returned contain a line object, rather than a line\n  // number (used to prevent looking up the same line twice).\n  TextMarker.prototype.find = function (side, lineObj) {\n    if (side == null && this.type == \"bookmark\") { side = 1; }\n    var from, to;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (span.from != null) {\n        from = Pos(lineObj ? line : lineNo(line), span.from);\n        if (side == -1) { return from }\n      }\n      if (span.to != null) {\n        to = Pos(lineObj ? line : lineNo(line), span.to);\n        if (side == 1) { return to }\n      }\n    }\n    return from && {from: from, to: to}\n  };\n\n  // Signals that the marker's widget changed, and surrounding layout\n  // should be recomputed.\n  TextMarker.prototype.changed = function () {\n      var this$1 = this;\n\n    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n    if (!pos || !cm) { return }\n    runInOp(cm, function () {\n      var line = pos.line, lineN = lineNo(pos.line);\n      var view = findViewForLine(cm, lineN);\n      if (view) {\n        clearLineMeasurementCacheFor(view);\n        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n      }\n      cm.curOp.updateMaxLine = true;\n      if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n        var oldHeight = widget.height;\n        widget.height = null;\n        var dHeight = widgetHeight(widget) - oldHeight;\n        if (dHeight)\n          { updateLineHeight(line, line.height + dHeight); }\n      }\n      signalLater(cm, \"markerChanged\", cm, this$1);\n    });\n  };\n\n  TextMarker.prototype.attachLine = function (line) {\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp;\n      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n        { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }\n    }\n    this.lines.push(line);\n  };\n\n  TextMarker.prototype.detachLine = function (line) {\n    this.lines.splice(indexOf(this.lines, line), 1);\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp\n      ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n    }\n  };\n  eventMixin(TextMarker);\n\n  // Create a marker, wire it up to the right lines, and\n  function markText(doc, from, to, options, type) {\n    // Shared markers (across linked documents) are handled separately\n    // (markTextShared will call out to this again, once per\n    // document).\n    if (options && options.shared) { return markTextShared(doc, from, to, options, type) }\n    // Ensure we are in an operation.\n    if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }\n\n    var marker = new TextMarker(doc, type), diff = cmp(from, to);\n    if (options) { copyObj(options, marker, false); }\n    // Don't connect empty markers unless clearWhenEmpty is false\n    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n      { return marker }\n    if (marker.replacedWith) {\n      // Showing up as a widget implies collapsed (widget replaces text)\n      marker.collapsed = true;\n      marker.widgetNode = eltP(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n      if (!options.handleMouseEvents) { marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\"); }\n      if (options.insertLeft) { marker.widgetNode.insertLeft = true; }\n    }\n    if (marker.collapsed) {\n      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n        { throw new Error(\"Inserting collapsed marker partially overlapping an existing one\") }\n      seeCollapsedSpans();\n    }\n\n    if (marker.addToHistory)\n      { addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN); }\n\n    var curLine = from.line, cm = doc.cm, updateMaxLine;\n    doc.iter(curLine, to.line + 1, function (line) {\n      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n        { updateMaxLine = true; }\n      if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }\n      addMarkedSpan(line, new MarkedSpan(marker,\n                                         curLine == from.line ? from.ch : null,\n                                         curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp);\n      ++curLine;\n    });\n    // lineIsHidden depends on the presence of the spans, so needs a second pass\n    if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {\n      if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }\n    }); }\n\n    if (marker.clearOnEnter) { on(marker, \"beforeCursorEnter\", function () { return marker.clear(); }); }\n\n    if (marker.readOnly) {\n      seeReadOnlySpans();\n      if (doc.history.done.length || doc.history.undone.length)\n        { doc.clearHistory(); }\n    }\n    if (marker.collapsed) {\n      marker.id = ++nextMarkerId;\n      marker.atomic = true;\n    }\n    if (cm) {\n      // Sync editor state\n      if (updateMaxLine) { cm.curOp.updateMaxLine = true; }\n      if (marker.collapsed)\n        { regChange(cm, from.line, to.line + 1); }\n      else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||\n               marker.attributes || marker.title)\n        { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, \"text\"); } }\n      if (marker.atomic) { reCheckSelection(cm.doc); }\n      signalLater(cm, \"markerAdded\", cm, marker);\n    }\n    return marker\n  }\n\n  // SHARED TEXTMARKERS\n\n  // A shared marker spans multiple linked documents. It is\n  // implemented as a meta-marker-object controlling multiple normal\n  // markers.\n  var SharedTextMarker = function(markers, primary) {\n    this.markers = markers;\n    this.primary = primary;\n    for (var i = 0; i < markers.length; ++i)\n      { markers[i].parent = this; }\n  };\n\n  SharedTextMarker.prototype.clear = function () {\n    if (this.explicitlyCleared) { return }\n    this.explicitlyCleared = true;\n    for (var i = 0; i < this.markers.length; ++i)\n      { this.markers[i].clear(); }\n    signalLater(this, \"clear\");\n  };\n\n  SharedTextMarker.prototype.find = function (side, lineObj) {\n    return this.primary.find(side, lineObj)\n  };\n  eventMixin(SharedTextMarker);\n\n  function markTextShared(doc, from, to, options, type) {\n    options = copyObj(options);\n    options.shared = false;\n    var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n    var widget = options.widgetNode;\n    linkedDocs(doc, function (doc) {\n      if (widget) { options.widgetNode = widget.cloneNode(true); }\n      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n      for (var i = 0; i < doc.linked.length; ++i)\n        { if (doc.linked[i].isParent) { return } }\n      primary = lst(markers);\n    });\n    return new SharedTextMarker(markers, primary)\n  }\n\n  function findSharedMarkers(doc) {\n    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })\n  }\n\n  function copySharedMarkers(doc, markers) {\n    for (var i = 0; i < markers.length; i++) {\n      var marker = markers[i], pos = marker.find();\n      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n      if (cmp(mFrom, mTo)) {\n        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n        marker.markers.push(subMark);\n        subMark.parent = marker;\n      }\n    }\n  }\n\n  function detachSharedMarkers(markers) {\n    var loop = function ( i ) {\n      var marker = markers[i], linked = [marker.primary.doc];\n      linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });\n      for (var j = 0; j < marker.markers.length; j++) {\n        var subMarker = marker.markers[j];\n        if (indexOf(linked, subMarker.doc) == -1) {\n          subMarker.parent = null;\n          marker.markers.splice(j--, 1);\n        }\n      }\n    };\n\n    for (var i = 0; i < markers.length; i++) loop( i );\n  }\n\n  var nextDocId = 0;\n  var Doc = function(text, mode, firstLine, lineSep, direction) {\n    if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }\n    if (firstLine == null) { firstLine = 0; }\n\n    BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n    this.first = firstLine;\n    this.scrollTop = this.scrollLeft = 0;\n    this.cantEdit = false;\n    this.cleanGeneration = 1;\n    this.modeFrontier = this.highlightFrontier = firstLine;\n    var start = Pos(firstLine, 0);\n    this.sel = simpleSelection(start);\n    this.history = new History(null);\n    this.id = ++nextDocId;\n    this.modeOption = mode;\n    this.lineSep = lineSep;\n    this.direction = (direction == \"rtl\") ? \"rtl\" : \"ltr\";\n    this.extend = false;\n\n    if (typeof text == \"string\") { text = this.splitLines(text); }\n    updateDoc(this, {from: start, to: start, text: text});\n    setSelection(this, simpleSelection(start), sel_dontScroll);\n  };\n\n  Doc.prototype = createObj(BranchChunk.prototype, {\n    constructor: Doc,\n    // Iterate over the document. Supports two forms -- with only one\n    // argument, it calls that for each line in the document. With\n    // three, it iterates over the range given by the first two (with\n    // the second being non-inclusive).\n    iter: function(from, to, op) {\n      if (op) { this.iterN(from - this.first, to - from, op); }\n      else { this.iterN(this.first, this.first + this.size, from); }\n    },\n\n    // Non-public interface for adding and removing lines.\n    insert: function(at, lines) {\n      var height = 0;\n      for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }\n      this.insertInner(at - this.first, lines, height);\n    },\n    remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n    // From here, the methods are part of the public interface. Most\n    // are also available from CodeMirror (editor) instances.\n\n    getValue: function(lineSep) {\n      var lines = getLines(this, this.first, this.first + this.size);\n      if (lineSep === false) { return lines }\n      return lines.join(lineSep || this.lineSeparator())\n    },\n    setValue: docMethodOp(function(code) {\n      var top = Pos(this.first, 0), last = this.first + this.size - 1;\n      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n                        text: this.splitLines(code), origin: \"setValue\", full: true}, true);\n      if (this.cm) { scrollToCoords(this.cm, 0, 0); }\n      setSelection(this, simpleSelection(top), sel_dontScroll);\n    }),\n    replaceRange: function(code, from, to, origin) {\n      from = clipPos(this, from);\n      to = to ? clipPos(this, to) : from;\n      replaceRange(this, code, from, to, origin);\n    },\n    getRange: function(from, to, lineSep) {\n      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n      if (lineSep === false) { return lines }\n      if (lineSep === '') { return lines.join('') }\n      return lines.join(lineSep || this.lineSeparator())\n    },\n\n    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},\n\n    getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},\n    getLineNumber: function(line) {return lineNo(line)},\n\n    getLineHandleVisualStart: function(line) {\n      if (typeof line == \"number\") { line = getLine(this, line); }\n      return visualLine(line)\n    },\n\n    lineCount: function() {return this.size},\n    firstLine: function() {return this.first},\n    lastLine: function() {return this.first + this.size - 1},\n\n    clipPos: function(pos) {return clipPos(this, pos)},\n\n    getCursor: function(start) {\n      var range = this.sel.primary(), pos;\n      if (start == null || start == \"head\") { pos = range.head; }\n      else if (start == \"anchor\") { pos = range.anchor; }\n      else if (start == \"end\" || start == \"to\" || start === false) { pos = range.to(); }\n      else { pos = range.from(); }\n      return pos\n    },\n    listSelections: function() { return this.sel.ranges },\n    somethingSelected: function() {return this.sel.somethingSelected()},\n\n    setCursor: docMethodOp(function(line, ch, options) {\n      setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n    }),\n    setSelection: docMethodOp(function(anchor, head, options) {\n      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n    }),\n    extendSelection: docMethodOp(function(head, other, options) {\n      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n    }),\n    extendSelections: docMethodOp(function(heads, options) {\n      extendSelections(this, clipPosArray(this, heads), options);\n    }),\n    extendSelectionsBy: docMethodOp(function(f, options) {\n      var heads = map(this.sel.ranges, f);\n      extendSelections(this, clipPosArray(this, heads), options);\n    }),\n    setSelections: docMethodOp(function(ranges, primary, options) {\n      if (!ranges.length) { return }\n      var out = [];\n      for (var i = 0; i < ranges.length; i++)\n        { out[i] = new Range(clipPos(this, ranges[i].anchor),\n                           clipPos(this, ranges[i].head || ranges[i].anchor)); }\n      if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }\n      setSelection(this, normalizeSelection(this.cm, out, primary), options);\n    }),\n    addSelection: docMethodOp(function(anchor, head, options) {\n      var ranges = this.sel.ranges.slice(0);\n      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n      setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options);\n    }),\n\n    getSelection: function(lineSep) {\n      var ranges = this.sel.ranges, lines;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        lines = lines ? lines.concat(sel) : sel;\n      }\n      if (lineSep === false) { return lines }\n      else { return lines.join(lineSep || this.lineSeparator()) }\n    },\n    getSelections: function(lineSep) {\n      var parts = [], ranges = this.sel.ranges;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); }\n        parts[i] = sel;\n      }\n      return parts\n    },\n    replaceSelection: function(code, collapse, origin) {\n      var dup = [];\n      for (var i = 0; i < this.sel.ranges.length; i++)\n        { dup[i] = code; }\n      this.replaceSelections(dup, collapse, origin || \"+input\");\n    },\n    replaceSelections: docMethodOp(function(code, collapse, origin) {\n      var changes = [], sel = this.sel;\n      for (var i = 0; i < sel.ranges.length; i++) {\n        var range = sel.ranges[i];\n        changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};\n      }\n      var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n      for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)\n        { makeChange(this, changes[i$1]); }\n      if (newSel) { setSelectionReplaceHistory(this, newSel); }\n      else if (this.cm) { ensureCursorVisible(this.cm); }\n    }),\n    undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n    redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n    setExtending: function(val) {this.extend = val;},\n    getExtending: function() {return this.extend},\n\n    historySize: function() {\n      var hist = this.history, done = 0, undone = 0;\n      for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }\n      for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }\n      return {undo: done, redo: undone}\n    },\n    clearHistory: function() {\n      var this$1 = this;\n\n      this.history = new History(this.history);\n      linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);\n    },\n\n    markClean: function() {\n      this.cleanGeneration = this.changeGeneration(true);\n    },\n    changeGeneration: function(forceSplit) {\n      if (forceSplit)\n        { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }\n      return this.history.generation\n    },\n    isClean: function (gen) {\n      return this.history.generation == (gen || this.cleanGeneration)\n    },\n\n    getHistory: function() {\n      return {done: copyHistoryArray(this.history.done),\n              undone: copyHistoryArray(this.history.undone)}\n    },\n    setHistory: function(histData) {\n      var hist = this.history = new History(this.history);\n      hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n    },\n\n    setGutterMarker: docMethodOp(function(line, gutterID, value) {\n      return changeLine(this, line, \"gutter\", function (line) {\n        var markers = line.gutterMarkers || (line.gutterMarkers = {});\n        markers[gutterID] = value;\n        if (!value && isEmpty(markers)) { line.gutterMarkers = null; }\n        return true\n      })\n    }),\n\n    clearGutter: docMethodOp(function(gutterID) {\n      var this$1 = this;\n\n      this.iter(function (line) {\n        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n          changeLine(this$1, line, \"gutter\", function () {\n            line.gutterMarkers[gutterID] = null;\n            if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }\n            return true\n          });\n        }\n      });\n    }),\n\n    lineInfo: function(line) {\n      var n;\n      if (typeof line == \"number\") {\n        if (!isLine(this, line)) { return null }\n        n = line;\n        line = getLine(this, line);\n        if (!line) { return null }\n      } else {\n        n = lineNo(line);\n        if (n == null) { return null }\n      }\n      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n              widgets: line.widgets}\n    },\n\n    addLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n        var prop = where == \"text\" ? \"textClass\"\n                 : where == \"background\" ? \"bgClass\"\n                 : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n        if (!line[prop]) { line[prop] = cls; }\n        else if (classTest(cls).test(line[prop])) { return false }\n        else { line[prop] += \" \" + cls; }\n        return true\n      })\n    }),\n    removeLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n        var prop = where == \"text\" ? \"textClass\"\n                 : where == \"background\" ? \"bgClass\"\n                 : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n        var cur = line[prop];\n        if (!cur) { return false }\n        else if (cls == null) { line[prop] = null; }\n        else {\n          var found = cur.match(classTest(cls));\n          if (!found) { return false }\n          var end = found.index + found[0].length;\n          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n        }\n        return true\n      })\n    }),\n\n    addLineWidget: docMethodOp(function(handle, node, options) {\n      return addLineWidget(this, handle, node, options)\n    }),\n    removeLineWidget: function(widget) { widget.clear(); },\n\n    markText: function(from, to, options) {\n      return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\")\n    },\n    setBookmark: function(pos, options) {\n      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n                      insertLeft: options && options.insertLeft,\n                      clearWhenEmpty: false, shared: options && options.shared,\n                      handleMouseEvents: options && options.handleMouseEvents};\n      pos = clipPos(this, pos);\n      return markText(this, pos, pos, realOpts, \"bookmark\")\n    },\n    findMarksAt: function(pos) {\n      pos = clipPos(this, pos);\n      var markers = [], spans = getLine(this, pos.line).markedSpans;\n      if (spans) { for (var i = 0; i < spans.length; ++i) {\n        var span = spans[i];\n        if ((span.from == null || span.from <= pos.ch) &&\n            (span.to == null || span.to >= pos.ch))\n          { markers.push(span.marker.parent || span.marker); }\n      } }\n      return markers\n    },\n    findMarks: function(from, to, filter) {\n      from = clipPos(this, from); to = clipPos(this, to);\n      var found = [], lineNo = from.line;\n      this.iter(from.line, to.line + 1, function (line) {\n        var spans = line.markedSpans;\n        if (spans) { for (var i = 0; i < spans.length; i++) {\n          var span = spans[i];\n          if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||\n                span.from == null && lineNo != from.line ||\n                span.from != null && lineNo == to.line && span.from >= to.ch) &&\n              (!filter || filter(span.marker)))\n            { found.push(span.marker.parent || span.marker); }\n        } }\n        ++lineNo;\n      });\n      return found\n    },\n    getAllMarks: function() {\n      var markers = [];\n      this.iter(function (line) {\n        var sps = line.markedSpans;\n        if (sps) { for (var i = 0; i < sps.length; ++i)\n          { if (sps[i].from != null) { markers.push(sps[i].marker); } } }\n      });\n      return markers\n    },\n\n    posFromIndex: function(off) {\n      var ch, lineNo = this.first, sepSize = this.lineSeparator().length;\n      this.iter(function (line) {\n        var sz = line.text.length + sepSize;\n        if (sz > off) { ch = off; return true }\n        off -= sz;\n        ++lineNo;\n      });\n      return clipPos(this, Pos(lineNo, ch))\n    },\n    indexFromPos: function (coords) {\n      coords = clipPos(this, coords);\n      var index = coords.ch;\n      if (coords.line < this.first || coords.ch < 0) { return 0 }\n      var sepSize = this.lineSeparator().length;\n      this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value\n        index += line.text.length + sepSize;\n      });\n      return index\n    },\n\n    copy: function(copyHistory) {\n      var doc = new Doc(getLines(this, this.first, this.first + this.size),\n                        this.modeOption, this.first, this.lineSep, this.direction);\n      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n      doc.sel = this.sel;\n      doc.extend = false;\n      if (copyHistory) {\n        doc.history.undoDepth = this.history.undoDepth;\n        doc.setHistory(this.getHistory());\n      }\n      return doc\n    },\n\n    linkedDoc: function(options) {\n      if (!options) { options = {}; }\n      var from = this.first, to = this.first + this.size;\n      if (options.from != null && options.from > from) { from = options.from; }\n      if (options.to != null && options.to < to) { to = options.to; }\n      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);\n      if (options.sharedHist) { copy.history = this.history\n      ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n      copySharedMarkers(copy, findSharedMarkers(this));\n      return copy\n    },\n    unlinkDoc: function(other) {\n      if (other instanceof CodeMirror) { other = other.doc; }\n      if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {\n        var link = this.linked[i];\n        if (link.doc != other) { continue }\n        this.linked.splice(i, 1);\n        other.unlinkDoc(this);\n        detachSharedMarkers(findSharedMarkers(this));\n        break\n      } }\n      // If the histories were shared, split them again\n      if (other.history == this.history) {\n        var splitIds = [other.id];\n        linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);\n        other.history = new History(null);\n        other.history.done = copyHistoryArray(this.history.done, splitIds);\n        other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n      }\n    },\n    iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n    getMode: function() {return this.mode},\n    getEditor: function() {return this.cm},\n\n    splitLines: function(str) {\n      if (this.lineSep) { return str.split(this.lineSep) }\n      return splitLinesAuto(str)\n    },\n    lineSeparator: function() { return this.lineSep || \"\\n\" },\n\n    setDirection: docMethodOp(function (dir) {\n      if (dir != \"rtl\") { dir = \"ltr\"; }\n      if (dir == this.direction) { return }\n      this.direction = dir;\n      this.iter(function (line) { return line.order = null; });\n      if (this.cm) { directionChanged(this.cm); }\n    })\n  });\n\n  // Public alias.\n  Doc.prototype.eachLine = Doc.prototype.iter;\n\n  // Kludge to work around strange IE behavior where it'll sometimes\n  // re-fire a series of drag-related events right after the drop (#1551)\n  var lastDrop = 0;\n\n  function onDrop(e) {\n    var cm = this;\n    clearDragCursor(cm);\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n      { return }\n    e_preventDefault(e);\n    if (ie) { lastDrop = +new Date; }\n    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n    if (!pos || cm.isReadOnly()) { return }\n    // Might be a file drop, in which case we simply extract the text\n    // and insert it.\n    if (files && files.length && window.FileReader && window.File) {\n      var n = files.length, text = Array(n), read = 0;\n      var markAsReadAndPasteIfAllFilesAreRead = function () {\n        if (++read == n) {\n          operation(cm, function () {\n            pos = clipPos(cm.doc, pos);\n            var change = {from: pos, to: pos,\n                          text: cm.doc.splitLines(\n                              text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())),\n                          origin: \"paste\"};\n            makeChange(cm.doc, change);\n            setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))));\n          })();\n        }\n      };\n      var readTextFromFile = function (file, i) {\n        if (cm.options.allowDropFileTypes &&\n            indexOf(cm.options.allowDropFileTypes, file.type) == -1) {\n          markAsReadAndPasteIfAllFilesAreRead();\n          return\n        }\n        var reader = new FileReader;\n        reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); };\n        reader.onload = function () {\n          var content = reader.result;\n          if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) {\n            markAsReadAndPasteIfAllFilesAreRead();\n            return\n          }\n          text[i] = content;\n          markAsReadAndPasteIfAllFilesAreRead();\n        };\n        reader.readAsText(file);\n      };\n      for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); }\n    } else { // Normal drop\n      // Don't do a replace if the drop happened inside of the selected text.\n      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n        cm.state.draggingText(e);\n        // Ensure the editor is re-focused\n        setTimeout(function () { return cm.display.input.focus(); }, 20);\n        return\n      }\n      try {\n        var text$1 = e.dataTransfer.getData(\"Text\");\n        if (text$1) {\n          var selected;\n          if (cm.state.draggingText && !cm.state.draggingText.copy)\n            { selected = cm.listSelections(); }\n          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n          if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)\n            { replaceRange(cm.doc, \"\", selected[i$1].anchor, selected[i$1].head, \"drag\"); } }\n          cm.replaceSelection(text$1, \"around\", \"paste\");\n          cm.display.input.focus();\n        }\n      }\n      catch(e$1){}\n    }\n  }\n\n  function onDragStart(cm, e) {\n    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }\n\n    e.dataTransfer.setData(\"Text\", cm.getSelection());\n    e.dataTransfer.effectAllowed = \"copyMove\";\n\n    // Use dummy image instead of default browsers image.\n    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n    if (e.dataTransfer.setDragImage && !safari) {\n      var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n      img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n      if (presto) {\n        img.width = img.height = 1;\n        cm.display.wrapper.appendChild(img);\n        // Force a relayout, or Opera won't use our image for some obscure reason\n        img._top = img.offsetTop;\n      }\n      e.dataTransfer.setDragImage(img, 0, 0);\n      if (presto) { img.parentNode.removeChild(img); }\n    }\n  }\n\n  function onDragOver(cm, e) {\n    var pos = posFromMouse(cm, e);\n    if (!pos) { return }\n    var frag = document.createDocumentFragment();\n    drawSelectionCursor(cm, pos, frag);\n    if (!cm.display.dragCursor) {\n      cm.display.dragCursor = elt(\"div\", null, \"CodeMirror-cursors CodeMirror-dragcursors\");\n      cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);\n    }\n    removeChildrenAndAdd(cm.display.dragCursor, frag);\n  }\n\n  function clearDragCursor(cm) {\n    if (cm.display.dragCursor) {\n      cm.display.lineSpace.removeChild(cm.display.dragCursor);\n      cm.display.dragCursor = null;\n    }\n  }\n\n  // These must be handled carefully, because naively registering a\n  // handler for each editor will cause the editors to never be\n  // garbage collected.\n\n  function forEachCodeMirror(f) {\n    if (!document.getElementsByClassName) { return }\n    var byClass = document.getElementsByClassName(\"CodeMirror\"), editors = [];\n    for (var i = 0; i < byClass.length; i++) {\n      var cm = byClass[i].CodeMirror;\n      if (cm) { editors.push(cm); }\n    }\n    if (editors.length) { editors[0].operation(function () {\n      for (var i = 0; i < editors.length; i++) { f(editors[i]); }\n    }); }\n  }\n\n  var globalsRegistered = false;\n  function ensureGlobalHandlers() {\n    if (globalsRegistered) { return }\n    registerGlobalHandlers();\n    globalsRegistered = true;\n  }\n  function registerGlobalHandlers() {\n    // When the window resizes, we need to refresh active editors.\n    var resizeTimer;\n    on(window, \"resize\", function () {\n      if (resizeTimer == null) { resizeTimer = setTimeout(function () {\n        resizeTimer = null;\n        forEachCodeMirror(onResize);\n      }, 100); }\n    });\n    // When the window loses focus, we want to show the editor as blurred\n    on(window, \"blur\", function () { return forEachCodeMirror(onBlur); });\n  }\n  // Called when the window resizes\n  function onResize(cm) {\n    var d = cm.display;\n    // Might be a text scaling operation, clear size caches.\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n    d.scrollbarsClipped = false;\n    cm.setSize();\n  }\n\n  var keyNames = {\n    3: \"Pause\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n    19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n    36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n    46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\",\n    106: \"*\", 107: \"=\", 109: \"-\", 110: \".\", 111: \"/\", 145: \"ScrollLock\",\n    173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n    221: \"]\", 222: \"'\", 224: \"Mod\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n    63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n  };\n\n  // Number keys\n  for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }\n  // Alphabetic keys\n  for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }\n  // Function keys\n  for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = \"F\" + i$2; }\n\n  var keyMap = {};\n\n  keyMap.basic = {\n    \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n    \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n    \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n    \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n    \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n    \"Esc\": \"singleSelection\"\n  };\n  // Note that the save and find-related commands aren't defined by\n  // default. User code or addons can define them. Unknown commands\n  // are simply ignored.\n  keyMap.pcDefault = {\n    \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n    \"Ctrl-Home\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n    \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n    \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n    \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n    \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n    \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n    \"fallthrough\": \"basic\"\n  };\n  // Very basic readline/emacs-style bindings, which are standard on Mac.\n  keyMap.emacsy = {\n    \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n    \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\", \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\",\n    \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\",\n    \"Ctrl-T\": \"transposeChars\", \"Ctrl-O\": \"openLine\"\n  };\n  keyMap.macDefault = {\n    \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n    \"Cmd-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n    \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n    \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n    \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n    \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n    \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n    \"fallthrough\": [\"basic\", \"emacsy\"]\n  };\n  keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n  // KEYMAP DISPATCH\n\n  function normalizeKeyName(name) {\n    var parts = name.split(/-(?!$)/);\n    name = parts[parts.length - 1];\n    var alt, ctrl, shift, cmd;\n    for (var i = 0; i < parts.length - 1; i++) {\n      var mod = parts[i];\n      if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }\n      else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n      else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n      else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n      else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n    }\n    if (alt) { name = \"Alt-\" + name; }\n    if (ctrl) { name = \"Ctrl-\" + name; }\n    if (cmd) { name = \"Cmd-\" + name; }\n    if (shift) { name = \"Shift-\" + name; }\n    return name\n  }\n\n  // This is a kludge to keep keymaps mostly working as raw objects\n  // (backwards compatibility) while at the same time support features\n  // like normalization and multi-stroke key bindings. It compiles a\n  // new normalized keymap, and then updates the old object to reflect\n  // this.\n  function normalizeKeyMap(keymap) {\n    var copy = {};\n    for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {\n      var value = keymap[keyname];\n      if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }\n      if (value == \"...\") { delete keymap[keyname]; continue }\n\n      var keys = map(keyname.split(\" \"), normalizeKeyName);\n      for (var i = 0; i < keys.length; i++) {\n        var val = (void 0), name = (void 0);\n        if (i == keys.length - 1) {\n          name = keys.join(\" \");\n          val = value;\n        } else {\n          name = keys.slice(0, i + 1).join(\" \");\n          val = \"...\";\n        }\n        var prev = copy[name];\n        if (!prev) { copy[name] = val; }\n        else if (prev != val) { throw new Error(\"Inconsistent bindings for \" + name) }\n      }\n      delete keymap[keyname];\n    } }\n    for (var prop in copy) { keymap[prop] = copy[prop]; }\n    return keymap\n  }\n\n  function lookupKey(key, map, handle, context) {\n    map = getKeyMap(map);\n    var found = map.call ? map.call(key, context) : map[key];\n    if (found === false) { return \"nothing\" }\n    if (found === \"...\") { return \"multi\" }\n    if (found != null && handle(found)) { return \"handled\" }\n\n    if (map.fallthrough) {\n      if (Object.prototype.toString.call(map.fallthrough) != \"[object Array]\")\n        { return lookupKey(key, map.fallthrough, handle, context) }\n      for (var i = 0; i < map.fallthrough.length; i++) {\n        var result = lookupKey(key, map.fallthrough[i], handle, context);\n        if (result) { return result }\n      }\n    }\n  }\n\n  // Modifier key presses don't count as 'real' key presses for the\n  // purpose of keymap fallthrough.\n  function isModifierKey(value) {\n    var name = typeof value == \"string\" ? value : keyNames[value.keyCode];\n    return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\"\n  }\n\n  function addModifierNames(name, event, noShift) {\n    var base = name;\n    if (event.altKey && base != \"Alt\") { name = \"Alt-\" + name; }\n    if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") { name = \"Ctrl-\" + name; }\n    if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Mod\") { name = \"Cmd-\" + name; }\n    if (!noShift && event.shiftKey && base != \"Shift\") { name = \"Shift-\" + name; }\n    return name\n  }\n\n  // Look up the name of a key as indicated by an event object.\n  function keyName(event, noShift) {\n    if (presto && event.keyCode == 34 && event[\"char\"]) { return false }\n    var name = keyNames[event.keyCode];\n    if (name == null || event.altGraphKey) { return false }\n    // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,\n    // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)\n    if (event.keyCode == 3 && event.code) { name = event.code; }\n    return addModifierNames(name, event, noShift)\n  }\n\n  function getKeyMap(val) {\n    return typeof val == \"string\" ? keyMap[val] : val\n  }\n\n  // Helper for deleting text near the selection(s), used to implement\n  // backspace, delete, and similar functionality.\n  function deleteNearSelection(cm, compute) {\n    var ranges = cm.doc.sel.ranges, kill = [];\n    // Build up a set of ranges to kill first, merging overlapping\n    // ranges.\n    for (var i = 0; i < ranges.length; i++) {\n      var toKill = compute(ranges[i]);\n      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n        var replaced = kill.pop();\n        if (cmp(replaced.from, toKill.from) < 0) {\n          toKill.from = replaced.from;\n          break\n        }\n      }\n      kill.push(toKill);\n    }\n    // Next, remove those actual ranges.\n    runInOp(cm, function () {\n      for (var i = kill.length - 1; i >= 0; i--)\n        { replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\"); }\n      ensureCursorVisible(cm);\n    });\n  }\n\n  function moveCharLogically(line, ch, dir) {\n    var target = skipExtendingChars(line.text, ch + dir, dir);\n    return target < 0 || target > line.text.length ? null : target\n  }\n\n  function moveLogically(line, start, dir) {\n    var ch = moveCharLogically(line, start.ch, dir);\n    return ch == null ? null : new Pos(start.line, ch, dir < 0 ? \"after\" : \"before\")\n  }\n\n  function endOfLine(visually, cm, lineObj, lineNo, dir) {\n    if (visually) {\n      if (cm.doc.direction == \"rtl\") { dir = -dir; }\n      var order = getOrder(lineObj, cm.doc.direction);\n      if (order) {\n        var part = dir < 0 ? lst(order) : order[0];\n        var moveInStorageOrder = (dir < 0) == (part.level == 1);\n        var sticky = moveInStorageOrder ? \"after\" : \"before\";\n        var ch;\n        // With a wrapped rtl chunk (possibly spanning multiple bidi parts),\n        // it could be that the last bidi part is not on the last visual line,\n        // since visual lines contain content order-consecutive chunks.\n        // Thus, in rtl, we are looking for the first (content-order) character\n        // in the rtl chunk that is on the last line (that is, the same line\n        // as the last (content-order) character).\n        if (part.level > 0 || cm.doc.direction == \"rtl\") {\n          var prep = prepareMeasureForLine(cm, lineObj);\n          ch = dir < 0 ? lineObj.text.length - 1 : 0;\n          var targetTop = measureCharPrepared(cm, prep, ch).top;\n          ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);\n          if (sticky == \"before\") { ch = moveCharLogically(lineObj, ch, 1); }\n        } else { ch = dir < 0 ? part.to : part.from; }\n        return new Pos(lineNo, ch, sticky)\n      }\n    }\n    return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? \"before\" : \"after\")\n  }\n\n  function moveVisually(cm, line, start, dir) {\n    var bidi = getOrder(line, cm.doc.direction);\n    if (!bidi) { return moveLogically(line, start, dir) }\n    if (start.ch >= line.text.length) {\n      start.ch = line.text.length;\n      start.sticky = \"before\";\n    } else if (start.ch <= 0) {\n      start.ch = 0;\n      start.sticky = \"after\";\n    }\n    var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];\n    if (cm.doc.direction == \"ltr\" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {\n      // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,\n      // nothing interesting happens.\n      return moveLogically(line, start, dir)\n    }\n\n    var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };\n    var prep;\n    var getWrappedLineExtent = function (ch) {\n      if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }\n      prep = prep || prepareMeasureForLine(cm, line);\n      return wrappedLineExtentChar(cm, line, prep, ch)\n    };\n    var wrappedLineExtent = getWrappedLineExtent(start.sticky == \"before\" ? mv(start, -1) : start.ch);\n\n    if (cm.doc.direction == \"rtl\" || part.level == 1) {\n      var moveInStorageOrder = (part.level == 1) == (dir < 0);\n      var ch = mv(start, moveInStorageOrder ? 1 : -1);\n      if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {\n        // Case 2: We move within an rtl part or in an rtl editor on the same visual line\n        var sticky = moveInStorageOrder ? \"before\" : \"after\";\n        return new Pos(start.line, ch, sticky)\n      }\n    }\n\n    // Case 3: Could not move within this bidi part in this visual line, so leave\n    // the current bidi part\n\n    var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {\n      var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder\n        ? new Pos(start.line, mv(ch, 1), \"before\")\n        : new Pos(start.line, ch, \"after\"); };\n\n      for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {\n        var part = bidi[partPos];\n        var moveInStorageOrder = (dir > 0) == (part.level != 1);\n        var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);\n        if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }\n        ch = moveInStorageOrder ? part.from : mv(part.to, -1);\n        if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }\n      }\n    };\n\n    // Case 3a: Look for other bidi parts on the same visual line\n    var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);\n    if (res) { return res }\n\n    // Case 3b: Look for other bidi parts on the next visual line\n    var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);\n    if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {\n      res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));\n      if (res) { return res }\n    }\n\n    // Case 4: Nowhere to move\n    return null\n  }\n\n  // Commands are parameter-less actions that can be performed on an\n  // editor, mostly used for keybindings.\n  var commands = {\n    selectAll: selectAll,\n    singleSelection: function (cm) { return cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll); },\n    killLine: function (cm) { return deleteNearSelection(cm, function (range) {\n      if (range.empty()) {\n        var len = getLine(cm.doc, range.head.line).text.length;\n        if (range.head.ch == len && range.head.line < cm.lastLine())\n          { return {from: range.head, to: Pos(range.head.line + 1, 0)} }\n        else\n          { return {from: range.head, to: Pos(range.head.line, len)} }\n      } else {\n        return {from: range.from(), to: range.to()}\n      }\n    }); },\n    deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n      from: Pos(range.from().line, 0),\n      to: clipPos(cm.doc, Pos(range.to().line + 1, 0))\n    }); }); },\n    delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n      from: Pos(range.from().line, 0), to: range.from()\n    }); }); },\n    delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {\n      var top = cm.charCoords(range.head, \"div\").top + 5;\n      var leftPos = cm.coordsChar({left: 0, top: top}, \"div\");\n      return {from: leftPos, to: range.from()}\n    }); },\n    delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {\n      var top = cm.charCoords(range.head, \"div\").top + 5;\n      var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n      return {from: range.from(), to: rightPos }\n    }); },\n    undo: function (cm) { return cm.undo(); },\n    redo: function (cm) { return cm.redo(); },\n    undoSelection: function (cm) { return cm.undoSelection(); },\n    redoSelection: function (cm) { return cm.redoSelection(); },\n    goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },\n    goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },\n    goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },\n      {origin: \"+move\", bias: 1}\n    ); },\n    goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },\n      {origin: \"+move\", bias: 1}\n    ); },\n    goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },\n      {origin: \"+move\", bias: -1}\n    ); },\n    goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n    }, sel_move); },\n    goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      return cm.coordsChar({left: 0, top: top}, \"div\")\n    }, sel_move); },\n    goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      var pos = cm.coordsChar({left: 0, top: top}, \"div\");\n      if (pos.ch < cm.getLine(pos.line).search(/\\S/)) { return lineStartSmart(cm, range.head) }\n      return pos\n    }, sel_move); },\n    goLineUp: function (cm) { return cm.moveV(-1, \"line\"); },\n    goLineDown: function (cm) { return cm.moveV(1, \"line\"); },\n    goPageUp: function (cm) { return cm.moveV(-1, \"page\"); },\n    goPageDown: function (cm) { return cm.moveV(1, \"page\"); },\n    goCharLeft: function (cm) { return cm.moveH(-1, \"char\"); },\n    goCharRight: function (cm) { return cm.moveH(1, \"char\"); },\n    goColumnLeft: function (cm) { return cm.moveH(-1, \"column\"); },\n    goColumnRight: function (cm) { return cm.moveH(1, \"column\"); },\n    goWordLeft: function (cm) { return cm.moveH(-1, \"word\"); },\n    goGroupRight: function (cm) { return cm.moveH(1, \"group\"); },\n    goGroupLeft: function (cm) { return cm.moveH(-1, \"group\"); },\n    goWordRight: function (cm) { return cm.moveH(1, \"word\"); },\n    delCharBefore: function (cm) { return cm.deleteH(-1, \"codepoint\"); },\n    delCharAfter: function (cm) { return cm.deleteH(1, \"char\"); },\n    delWordBefore: function (cm) { return cm.deleteH(-1, \"word\"); },\n    delWordAfter: function (cm) { return cm.deleteH(1, \"word\"); },\n    delGroupBefore: function (cm) { return cm.deleteH(-1, \"group\"); },\n    delGroupAfter: function (cm) { return cm.deleteH(1, \"group\"); },\n    indentAuto: function (cm) { return cm.indentSelection(\"smart\"); },\n    indentMore: function (cm) { return cm.indentSelection(\"add\"); },\n    indentLess: function (cm) { return cm.indentSelection(\"subtract\"); },\n    insertTab: function (cm) { return cm.replaceSelection(\"\\t\"); },\n    insertSoftTab: function (cm) {\n      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n      for (var i = 0; i < ranges.length; i++) {\n        var pos = ranges[i].from();\n        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n        spaces.push(spaceStr(tabSize - col % tabSize));\n      }\n      cm.replaceSelections(spaces);\n    },\n    defaultTab: function (cm) {\n      if (cm.somethingSelected()) { cm.indentSelection(\"add\"); }\n      else { cm.execCommand(\"insertTab\"); }\n    },\n    // Swap the two chars left and right of each selection's head.\n    // Move cursor behind the two swapped characters afterwards.\n    //\n    // Doesn't consider line feeds a character.\n    // Doesn't scan more than one line above to find a character.\n    // Doesn't do anything on an empty line.\n    // Doesn't do anything with non-empty selections.\n    transposeChars: function (cm) { return runInOp(cm, function () {\n      var ranges = cm.listSelections(), newSel = [];\n      for (var i = 0; i < ranges.length; i++) {\n        if (!ranges[i].empty()) { continue }\n        var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n        if (line) {\n          if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }\n          if (cur.ch > 0) {\n            cur = new Pos(cur.line, cur.ch + 1);\n            cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n                            Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n          } else if (cur.line > cm.doc.first) {\n            var prev = getLine(cm.doc, cur.line - 1).text;\n            if (prev) {\n              cur = new Pos(cur.line, 1);\n              cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n                              prev.charAt(prev.length - 1),\n                              Pos(cur.line - 1, prev.length - 1), cur, \"+transpose\");\n            }\n          }\n        }\n        newSel.push(new Range(cur, cur));\n      }\n      cm.setSelections(newSel);\n    }); },\n    newlineAndIndent: function (cm) { return runInOp(cm, function () {\n      var sels = cm.listSelections();\n      for (var i = sels.length - 1; i >= 0; i--)\n        { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, \"+input\"); }\n      sels = cm.listSelections();\n      for (var i$1 = 0; i$1 < sels.length; i$1++)\n        { cm.indentLine(sels[i$1].from().line, null, true); }\n      ensureCursorVisible(cm);\n    }); },\n    openLine: function (cm) { return cm.replaceSelection(\"\\n\", \"start\"); },\n    toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }\n  };\n\n\n  function lineStart(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLine(line);\n    if (visual != line) { lineN = lineNo(visual); }\n    return endOfLine(true, cm, visual, lineN, 1)\n  }\n  function lineEnd(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLineEnd(line);\n    if (visual != line) { lineN = lineNo(visual); }\n    return endOfLine(true, cm, line, lineN, -1)\n  }\n  function lineStartSmart(cm, pos) {\n    var start = lineStart(cm, pos.line);\n    var line = getLine(cm.doc, start.line);\n    var order = getOrder(line, cm.doc.direction);\n    if (!order || order[0].level == 0) {\n      var firstNonWS = Math.max(start.ch, line.text.search(/\\S/));\n      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;\n      return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)\n    }\n    return start\n  }\n\n  // Run a handler that was bound to a key.\n  function doHandleBinding(cm, bound, dropShift) {\n    if (typeof bound == \"string\") {\n      bound = commands[bound];\n      if (!bound) { return false }\n    }\n    // Ensure previous input has been read, so that the handler sees a\n    // consistent view of the document\n    cm.display.input.ensurePolled();\n    var prevShift = cm.display.shift, done = false;\n    try {\n      if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n      if (dropShift) { cm.display.shift = false; }\n      done = bound(cm) != Pass;\n    } finally {\n      cm.display.shift = prevShift;\n      cm.state.suppressEdits = false;\n    }\n    return done\n  }\n\n  function lookupKeyForEditor(cm, name, handle) {\n    for (var i = 0; i < cm.state.keyMaps.length; i++) {\n      var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);\n      if (result) { return result }\n    }\n    return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))\n      || lookupKey(name, cm.options.keyMap, handle, cm)\n  }\n\n  // Note that, despite the name, this function is also used to check\n  // for bound mouse clicks.\n\n  var stopSeq = new Delayed;\n\n  function dispatchKey(cm, name, e, handle) {\n    var seq = cm.state.keySeq;\n    if (seq) {\n      if (isModifierKey(name)) { return \"handled\" }\n      if (/\\'$/.test(name))\n        { cm.state.keySeq = null; }\n      else\n        { stopSeq.set(50, function () {\n          if (cm.state.keySeq == seq) {\n            cm.state.keySeq = null;\n            cm.display.input.reset();\n          }\n        }); }\n      if (dispatchKeyInner(cm, seq + \" \" + name, e, handle)) { return true }\n    }\n    return dispatchKeyInner(cm, name, e, handle)\n  }\n\n  function dispatchKeyInner(cm, name, e, handle) {\n    var result = lookupKeyForEditor(cm, name, handle);\n\n    if (result == \"multi\")\n      { cm.state.keySeq = name; }\n    if (result == \"handled\")\n      { signalLater(cm, \"keyHandled\", cm, name, e); }\n\n    if (result == \"handled\" || result == \"multi\") {\n      e_preventDefault(e);\n      restartBlink(cm);\n    }\n\n    return !!result\n  }\n\n  // Handle a key from the keydown event.\n  function handleKeyBinding(cm, e) {\n    var name = keyName(e, true);\n    if (!name) { return false }\n\n    if (e.shiftKey && !cm.state.keySeq) {\n      // First try to resolve full name (including 'Shift-'). Failing\n      // that, see if there is a cursor-motion command (starting with\n      // 'go') bound to the keyname without 'Shift-'.\n      return dispatchKey(cm, \"Shift-\" + name, e, function (b) { return doHandleBinding(cm, b, true); })\n          || dispatchKey(cm, name, e, function (b) {\n               if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n                 { return doHandleBinding(cm, b) }\n             })\n    } else {\n      return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })\n    }\n  }\n\n  // Handle a key from the keypress event\n  function handleCharBinding(cm, e, ch) {\n    return dispatchKey(cm, \"'\" + ch + \"'\", e, function (b) { return doHandleBinding(cm, b, true); })\n  }\n\n  var lastStoppedKey = null;\n  function onKeyDown(e) {\n    var cm = this;\n    if (e.target && e.target != cm.display.input.getField()) { return }\n    cm.curOp.focus = activeElt();\n    if (signalDOMEvent(cm, e)) { return }\n    // IE does strange things with escape.\n    if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }\n    var code = e.keyCode;\n    cm.display.shift = code == 16 || e.shiftKey;\n    var handled = handleKeyBinding(cm, e);\n    if (presto) {\n      lastStoppedKey = handled ? code : null;\n      // Opera has no cut event... we try to at least catch the key combo\n      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n        { cm.replaceSelection(\"\", null, \"cut\"); }\n    }\n    if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)\n      { document.execCommand(\"cut\"); }\n\n    // Turn mouse into crosshair when Alt is held on Mac.\n    if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n      { showCrossHair(cm); }\n  }\n\n  function showCrossHair(cm) {\n    var lineDiv = cm.display.lineDiv;\n    addClass(lineDiv, \"CodeMirror-crosshair\");\n\n    function up(e) {\n      if (e.keyCode == 18 || !e.altKey) {\n        rmClass(lineDiv, \"CodeMirror-crosshair\");\n        off(document, \"keyup\", up);\n        off(document, \"mouseover\", up);\n      }\n    }\n    on(document, \"keyup\", up);\n    on(document, \"mouseover\", up);\n  }\n\n  function onKeyUp(e) {\n    if (e.keyCode == 16) { this.doc.sel.shift = false; }\n    signalDOMEvent(this, e);\n  }\n\n  function onKeyPress(e) {\n    var cm = this;\n    if (e.target && e.target != cm.display.input.getField()) { return }\n    if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }\n    var keyCode = e.keyCode, charCode = e.charCode;\n    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}\n    if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }\n    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n    // Some browsers fire keypress events for backspace\n    if (ch == \"\\x08\") { return }\n    if (handleCharBinding(cm, e, ch)) { return }\n    cm.display.input.onKeyPress(e);\n  }\n\n  var DOUBLECLICK_DELAY = 400;\n\n  var PastClick = function(time, pos, button) {\n    this.time = time;\n    this.pos = pos;\n    this.button = button;\n  };\n\n  PastClick.prototype.compare = function (time, pos, button) {\n    return this.time + DOUBLECLICK_DELAY > time &&\n      cmp(pos, this.pos) == 0 && button == this.button\n  };\n\n  var lastClick, lastDoubleClick;\n  function clickRepeat(pos, button) {\n    var now = +new Date;\n    if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {\n      lastClick = lastDoubleClick = null;\n      return \"triple\"\n    } else if (lastClick && lastClick.compare(now, pos, button)) {\n      lastDoubleClick = new PastClick(now, pos, button);\n      lastClick = null;\n      return \"double\"\n    } else {\n      lastClick = new PastClick(now, pos, button);\n      lastDoubleClick = null;\n      return \"single\"\n    }\n  }\n\n  // A mouse down can be a single click, double click, triple click,\n  // start of selection drag, start of text drag, new cursor\n  // (ctrl-click), rectangle drag (alt-drag), or xwin\n  // middle-click-paste. Or it might be a click on something we should\n  // not interfere with, such as a scrollbar or widget.\n  function onMouseDown(e) {\n    var cm = this, display = cm.display;\n    if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }\n    display.input.ensurePolled();\n    display.shift = e.shiftKey;\n\n    if (eventInWidget(display, e)) {\n      if (!webkit) {\n        // Briefly turn off draggability, to allow widgets to do\n        // normal dragging things.\n        display.scroller.draggable = false;\n        setTimeout(function () { return display.scroller.draggable = true; }, 100);\n      }\n      return\n    }\n    if (clickInGutter(cm, e)) { return }\n    var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : \"single\";\n    window.focus();\n\n    // #3261: make sure, that we're not starting a second selection\n    if (button == 1 && cm.state.selectingText)\n      { cm.state.selectingText(e); }\n\n    if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }\n\n    if (button == 1) {\n      if (pos) { leftButtonDown(cm, pos, repeat, e); }\n      else if (e_target(e) == display.scroller) { e_preventDefault(e); }\n    } else if (button == 2) {\n      if (pos) { extendSelection(cm.doc, pos); }\n      setTimeout(function () { return display.input.focus(); }, 20);\n    } else if (button == 3) {\n      if (captureRightClick) { cm.display.input.onContextMenu(e); }\n      else { delayBlurEvent(cm); }\n    }\n  }\n\n  function handleMappedButton(cm, button, pos, repeat, event) {\n    var name = \"Click\";\n    if (repeat == \"double\") { name = \"Double\" + name; }\n    else if (repeat == \"triple\") { name = \"Triple\" + name; }\n    name = (button == 1 ? \"Left\" : button == 2 ? \"Middle\" : \"Right\") + name;\n\n    return dispatchKey(cm,  addModifierNames(name, event), event, function (bound) {\n      if (typeof bound == \"string\") { bound = commands[bound]; }\n      if (!bound) { return false }\n      var done = false;\n      try {\n        if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n        done = bound(cm, pos) != Pass;\n      } finally {\n        cm.state.suppressEdits = false;\n      }\n      return done\n    })\n  }\n\n  function configureMouse(cm, repeat, event) {\n    var option = cm.getOption(\"configureMouse\");\n    var value = option ? option(cm, repeat, event) : {};\n    if (value.unit == null) {\n      var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;\n      value.unit = rect ? \"rectangle\" : repeat == \"single\" ? \"char\" : repeat == \"double\" ? \"word\" : \"line\";\n    }\n    if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }\n    if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }\n    if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }\n    return value\n  }\n\n  function leftButtonDown(cm, pos, repeat, event) {\n    if (ie) { setTimeout(bind(ensureFocus, cm), 0); }\n    else { cm.curOp.focus = activeElt(); }\n\n    var behavior = configureMouse(cm, repeat, event);\n\n    var sel = cm.doc.sel, contained;\n    if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n        repeat == \"single\" && (contained = sel.contains(pos)) > -1 &&\n        (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&\n        (cmp(contained.to(), pos) > 0 || pos.xRel < 0))\n      { leftButtonStartDrag(cm, event, pos, behavior); }\n    else\n      { leftButtonSelect(cm, event, pos, behavior); }\n  }\n\n  // Start a text drag. When it ends, see if any dragging actually\n  // happen, and treat as a click if it didn't.\n  function leftButtonStartDrag(cm, event, pos, behavior) {\n    var display = cm.display, moved = false;\n    var dragEnd = operation(cm, function (e) {\n      if (webkit) { display.scroller.draggable = false; }\n      cm.state.draggingText = false;\n      if (cm.state.delayingBlurEvent) {\n        if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; }\n        else { delayBlurEvent(cm); }\n      }\n      off(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n      off(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n      off(display.scroller, \"dragstart\", dragStart);\n      off(display.scroller, \"drop\", dragEnd);\n      if (!moved) {\n        e_preventDefault(e);\n        if (!behavior.addNew)\n          { extendSelection(cm.doc, pos, null, null, behavior.extend); }\n        // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n        if ((webkit && !safari) || ie && ie_version == 9)\n          { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); }\n        else\n          { display.input.focus(); }\n      }\n    });\n    var mouseMove = function(e2) {\n      moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;\n    };\n    var dragStart = function () { return moved = true; };\n    // Let the drag handler handle this.\n    if (webkit) { display.scroller.draggable = true; }\n    cm.state.draggingText = dragEnd;\n    dragEnd.copy = !behavior.moveOnDrag;\n    on(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n    on(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n    on(display.scroller, \"dragstart\", dragStart);\n    on(display.scroller, \"drop\", dragEnd);\n\n    cm.state.delayingBlurEvent = true;\n    setTimeout(function () { return display.input.focus(); }, 20);\n    // IE's approach to draggable\n    if (display.scroller.dragDrop) { display.scroller.dragDrop(); }\n  }\n\n  function rangeForUnit(cm, pos, unit) {\n    if (unit == \"char\") { return new Range(pos, pos) }\n    if (unit == \"word\") { return cm.findWordAt(pos) }\n    if (unit == \"line\") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }\n    var result = unit(cm, pos);\n    return new Range(result.from, result.to)\n  }\n\n  // Normal selection, as opposed to text dragging.\n  function leftButtonSelect(cm, event, start, behavior) {\n    if (ie) { delayBlurEvent(cm); }\n    var display = cm.display, doc = cm.doc;\n    e_preventDefault(event);\n\n    var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;\n    if (behavior.addNew && !behavior.extend) {\n      ourIndex = doc.sel.contains(start);\n      if (ourIndex > -1)\n        { ourRange = ranges[ourIndex]; }\n      else\n        { ourRange = new Range(start, start); }\n    } else {\n      ourRange = doc.sel.primary();\n      ourIndex = doc.sel.primIndex;\n    }\n\n    if (behavior.unit == \"rectangle\") {\n      if (!behavior.addNew) { ourRange = new Range(start, start); }\n      start = posFromMouse(cm, event, true, true);\n      ourIndex = -1;\n    } else {\n      var range = rangeForUnit(cm, start, behavior.unit);\n      if (behavior.extend)\n        { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); }\n      else\n        { ourRange = range; }\n    }\n\n    if (!behavior.addNew) {\n      ourIndex = 0;\n      setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n      startSel = doc.sel;\n    } else if (ourIndex == -1) {\n      ourIndex = ranges.length;\n      setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),\n                   {scroll: false, origin: \"*mouse\"});\n    } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == \"char\" && !behavior.extend) {\n      setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n                   {scroll: false, origin: \"*mouse\"});\n      startSel = doc.sel;\n    } else {\n      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n    }\n\n    var lastPos = start;\n    function extendTo(pos) {\n      if (cmp(lastPos, pos) == 0) { return }\n      lastPos = pos;\n\n      if (behavior.unit == \"rectangle\") {\n        var ranges = [], tabSize = cm.options.tabSize;\n        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n             line <= end; line++) {\n          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n          if (left == right)\n            { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }\n          else if (text.length > leftPos)\n            { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }\n        }\n        if (!ranges.length) { ranges.push(new Range(start, start)); }\n        setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n                     {origin: \"*mouse\", scroll: false});\n        cm.scrollIntoView(pos);\n      } else {\n        var oldRange = ourRange;\n        var range = rangeForUnit(cm, pos, behavior.unit);\n        var anchor = oldRange.anchor, head;\n        if (cmp(range.anchor, anchor) > 0) {\n          head = range.head;\n          anchor = minPos(oldRange.from(), range.anchor);\n        } else {\n          head = range.anchor;\n          anchor = maxPos(oldRange.to(), range.head);\n        }\n        var ranges$1 = startSel.ranges.slice(0);\n        ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));\n        setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse);\n      }\n    }\n\n    var editorSize = display.wrapper.getBoundingClientRect();\n    // Used to ensure timeout re-tries don't fire when another extend\n    // happened in the meantime (clearTimeout isn't reliable -- at\n    // least on Chrome, the timeouts still happen even when cleared,\n    // if the clear happens after their scheduled firing time).\n    var counter = 0;\n\n    function extend(e) {\n      var curCount = ++counter;\n      var cur = posFromMouse(cm, e, true, behavior.unit == \"rectangle\");\n      if (!cur) { return }\n      if (cmp(cur, lastPos) != 0) {\n        cm.curOp.focus = activeElt();\n        extendTo(cur);\n        var visible = visibleLines(display, doc);\n        if (cur.line >= visible.to || cur.line < visible.from)\n          { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }\n      } else {\n        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n        if (outside) { setTimeout(operation(cm, function () {\n          if (counter != curCount) { return }\n          display.scroller.scrollTop += outside;\n          extend(e);\n        }), 50); }\n      }\n    }\n\n    function done(e) {\n      cm.state.selectingText = false;\n      counter = Infinity;\n      // If e is null or undefined we interpret this as someone trying\n      // to explicitly cancel the selection rather than the user\n      // letting go of the mouse button.\n      if (e) {\n        e_preventDefault(e);\n        display.input.focus();\n      }\n      off(display.wrapper.ownerDocument, \"mousemove\", move);\n      off(display.wrapper.ownerDocument, \"mouseup\", up);\n      doc.history.lastSelOrigin = null;\n    }\n\n    var move = operation(cm, function (e) {\n      if (e.buttons === 0 || !e_button(e)) { done(e); }\n      else { extend(e); }\n    });\n    var up = operation(cm, done);\n    cm.state.selectingText = up;\n    on(display.wrapper.ownerDocument, \"mousemove\", move);\n    on(display.wrapper.ownerDocument, \"mouseup\", up);\n  }\n\n  // Used when mouse-selecting to adjust the anchor to the proper side\n  // of a bidi jump depending on the visual position of the head.\n  function bidiSimplify(cm, range) {\n    var anchor = range.anchor;\n    var head = range.head;\n    var anchorLine = getLine(cm.doc, anchor.line);\n    if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range }\n    var order = getOrder(anchorLine);\n    if (!order) { return range }\n    var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];\n    if (part.from != anchor.ch && part.to != anchor.ch) { return range }\n    var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);\n    if (boundary == 0 || boundary == order.length) { return range }\n\n    // Compute the relative visual position of the head compared to the\n    // anchor (<0 is to the left, >0 to the right)\n    var leftSide;\n    if (head.line != anchor.line) {\n      leftSide = (head.line - anchor.line) * (cm.doc.direction == \"ltr\" ? 1 : -1) > 0;\n    } else {\n      var headIndex = getBidiPartAt(order, head.ch, head.sticky);\n      var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);\n      if (headIndex == boundary - 1 || headIndex == boundary)\n        { leftSide = dir < 0; }\n      else\n        { leftSide = dir > 0; }\n    }\n\n    var usePart = order[boundary + (leftSide ? -1 : 0)];\n    var from = leftSide == (usePart.level == 1);\n    var ch = from ? usePart.from : usePart.to, sticky = from ? \"after\" : \"before\";\n    return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)\n  }\n\n\n  // Determines whether an event happened in the gutter, and fires the\n  // handlers for the corresponding event.\n  function gutterEvent(cm, e, type, prevent) {\n    var mX, mY;\n    if (e.touches) {\n      mX = e.touches[0].clientX;\n      mY = e.touches[0].clientY;\n    } else {\n      try { mX = e.clientX; mY = e.clientY; }\n      catch(e$1) { return false }\n    }\n    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }\n    if (prevent) { e_preventDefault(e); }\n\n    var display = cm.display;\n    var lineBox = display.lineDiv.getBoundingClientRect();\n\n    if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }\n    mY -= lineBox.top - display.viewOffset;\n\n    for (var i = 0; i < cm.display.gutterSpecs.length; ++i) {\n      var g = display.gutters.childNodes[i];\n      if (g && g.getBoundingClientRect().right >= mX) {\n        var line = lineAtHeight(cm.doc, mY);\n        var gutter = cm.display.gutterSpecs[i];\n        signal(cm, type, cm, line, gutter.className, e);\n        return e_defaultPrevented(e)\n      }\n    }\n  }\n\n  function clickInGutter(cm, e) {\n    return gutterEvent(cm, e, \"gutterClick\", true)\n  }\n\n  // CONTEXT MENU HANDLING\n\n  // To make the context menu work, we need to briefly unhide the\n  // textarea (making it as unobtrusive as possible) to let the\n  // right-click take effect on it.\n  function onContextMenu(cm, e) {\n    if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }\n    if (signalDOMEvent(cm, e, \"contextmenu\")) { return }\n    if (!captureRightClick) { cm.display.input.onContextMenu(e); }\n  }\n\n  function contextMenuInGutter(cm, e) {\n    if (!hasHandler(cm, \"gutterContextMenu\")) { return false }\n    return gutterEvent(cm, e, \"gutterContextMenu\", false)\n  }\n\n  function themeChanged(cm) {\n    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n      cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n    clearCaches(cm);\n  }\n\n  var Init = {toString: function(){return \"CodeMirror.Init\"}};\n\n  var defaults = {};\n  var optionHandlers = {};\n\n  function defineOptions(CodeMirror) {\n    var optionHandlers = CodeMirror.optionHandlers;\n\n    function option(name, deflt, handle, notOnInit) {\n      CodeMirror.defaults[name] = deflt;\n      if (handle) { optionHandlers[name] =\n        notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }\n    }\n\n    CodeMirror.defineOption = option;\n\n    // Passed to option handlers when there is no old value.\n    CodeMirror.Init = Init;\n\n    // These two are, on init, called from the constructor because they\n    // have to be initialized before the editor can start at all.\n    option(\"value\", \"\", function (cm, val) { return cm.setValue(val); }, true);\n    option(\"mode\", null, function (cm, val) {\n      cm.doc.modeOption = val;\n      loadMode(cm);\n    }, true);\n\n    option(\"indentUnit\", 2, loadMode, true);\n    option(\"indentWithTabs\", false);\n    option(\"smartIndent\", true);\n    option(\"tabSize\", 4, function (cm) {\n      resetModeState(cm);\n      clearCaches(cm);\n      regChange(cm);\n    }, true);\n\n    option(\"lineSeparator\", null, function (cm, val) {\n      cm.doc.lineSep = val;\n      if (!val) { return }\n      var newBreaks = [], lineNo = cm.doc.first;\n      cm.doc.iter(function (line) {\n        for (var pos = 0;;) {\n          var found = line.text.indexOf(val, pos);\n          if (found == -1) { break }\n          pos = found + val.length;\n          newBreaks.push(Pos(lineNo, found));\n        }\n        lineNo++;\n      });\n      for (var i = newBreaks.length - 1; i >= 0; i--)\n        { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }\n    });\n    option(\"specialChars\", /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b\\u200e\\u200f\\u2028\\u2029\\ufeff\\ufff9-\\ufffc]/g, function (cm, val, old) {\n      cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n      if (old != Init) { cm.refresh(); }\n    });\n    option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);\n    option(\"electricChars\", true);\n    option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", function () {\n      throw new Error(\"inputStyle can not (yet) be changed in a running editor\") // FIXME\n    }, true);\n    option(\"spellcheck\", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);\n    option(\"autocorrect\", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true);\n    option(\"autocapitalize\", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true);\n    option(\"rtlMoveVisually\", !windows);\n    option(\"wholeLineUpdateBefore\", true);\n\n    option(\"theme\", \"default\", function (cm) {\n      themeChanged(cm);\n      updateGutters(cm);\n    }, true);\n    option(\"keyMap\", \"default\", function (cm, val, old) {\n      var next = getKeyMap(val);\n      var prev = old != Init && getKeyMap(old);\n      if (prev && prev.detach) { prev.detach(cm, next); }\n      if (next.attach) { next.attach(cm, prev || null); }\n    });\n    option(\"extraKeys\", null);\n    option(\"configureMouse\", null);\n\n    option(\"lineWrapping\", false, wrappingChanged, true);\n    option(\"gutters\", [], function (cm, val) {\n      cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers);\n      updateGutters(cm);\n    }, true);\n    option(\"fixedGutter\", true, function (cm, val) {\n      cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n      cm.refresh();\n    }, true);\n    option(\"coverGutterNextToScrollbar\", false, function (cm) { return updateScrollbars(cm); }, true);\n    option(\"scrollbarStyle\", \"native\", function (cm) {\n      initScrollbars(cm);\n      updateScrollbars(cm);\n      cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);\n      cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);\n    }, true);\n    option(\"lineNumbers\", false, function (cm, val) {\n      cm.display.gutterSpecs = getGutters(cm.options.gutters, val);\n      updateGutters(cm);\n    }, true);\n    option(\"firstLineNumber\", 1, updateGutters, true);\n    option(\"lineNumberFormatter\", function (integer) { return integer; }, updateGutters, true);\n    option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n    option(\"resetSelectionOnContextMenu\", true);\n    option(\"lineWiseCopyCut\", true);\n    option(\"pasteLinesPerSelection\", true);\n    option(\"selectionsMayTouch\", false);\n\n    option(\"readOnly\", false, function (cm, val) {\n      if (val == \"nocursor\") {\n        onBlur(cm);\n        cm.display.input.blur();\n      }\n      cm.display.input.readOnlyChanged(val);\n    });\n\n    option(\"screenReaderLabel\", null, function (cm, val) {\n      val = (val === '') ? null : val;\n      cm.display.input.screenReaderLabelChanged(val);\n    });\n\n    option(\"disableInput\", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);\n    option(\"dragDrop\", true, dragDropChanged);\n    option(\"allowDropFileTypes\", null);\n\n    option(\"cursorBlinkRate\", 530);\n    option(\"cursorScrollMargin\", 0);\n    option(\"cursorHeight\", 1, updateSelection, true);\n    option(\"singleCursorHeightPerLine\", true, updateSelection, true);\n    option(\"workTime\", 100);\n    option(\"workDelay\", 100);\n    option(\"flattenSpans\", true, resetModeState, true);\n    option(\"addModeClass\", false, resetModeState, true);\n    option(\"pollInterval\", 100);\n    option(\"undoDepth\", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });\n    option(\"historyEventDelay\", 1250);\n    option(\"viewportMargin\", 10, function (cm) { return cm.refresh(); }, true);\n    option(\"maxHighlightLength\", 10000, resetModeState, true);\n    option(\"moveInputWithCursor\", true, function (cm, val) {\n      if (!val) { cm.display.input.resetPosition(); }\n    });\n\n    option(\"tabindex\", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || \"\"; });\n    option(\"autofocus\", null);\n    option(\"direction\", \"ltr\", function (cm, val) { return cm.doc.setDirection(val); }, true);\n    option(\"phrases\", null);\n  }\n\n  function dragDropChanged(cm, value, old) {\n    var wasOn = old && old != Init;\n    if (!value != !wasOn) {\n      var funcs = cm.display.dragFunctions;\n      var toggle = value ? on : off;\n      toggle(cm.display.scroller, \"dragstart\", funcs.start);\n      toggle(cm.display.scroller, \"dragenter\", funcs.enter);\n      toggle(cm.display.scroller, \"dragover\", funcs.over);\n      toggle(cm.display.scroller, \"dragleave\", funcs.leave);\n      toggle(cm.display.scroller, \"drop\", funcs.drop);\n    }\n  }\n\n  function wrappingChanged(cm) {\n    if (cm.options.lineWrapping) {\n      addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      cm.display.sizer.style.minWidth = \"\";\n      cm.display.sizerWidth = null;\n    } else {\n      rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      findMaxLine(cm);\n    }\n    estimateLineHeights(cm);\n    regChange(cm);\n    clearCaches(cm);\n    setTimeout(function () { return updateScrollbars(cm); }, 100);\n  }\n\n  // A CodeMirror instance represents an editor. This is the object\n  // that user code is usually dealing with.\n\n  function CodeMirror(place, options) {\n    var this$1 = this;\n\n    if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) }\n\n    this.options = options = options ? copyObj(options) : {};\n    // Determine effective options based on given values and defaults.\n    copyObj(defaults, options, false);\n\n    var doc = options.value;\n    if (typeof doc == \"string\") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }\n    else if (options.mode) { doc.modeOption = options.mode; }\n    this.doc = doc;\n\n    var input = new CodeMirror.inputStyles[options.inputStyle](this);\n    var display = this.display = new Display(place, doc, input, options);\n    display.wrapper.CodeMirror = this;\n    themeChanged(this);\n    if (options.lineWrapping)\n      { this.display.wrapper.className += \" CodeMirror-wrap\"; }\n    initScrollbars(this);\n\n    this.state = {\n      keyMaps: [],  // stores maps added by addKeyMap\n      overlays: [], // highlighting overlays, as added by addOverlay\n      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info\n      overwrite: false,\n      delayingBlurEvent: false,\n      focused: false,\n      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n      pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll\n      selectingText: false,\n      draggingText: false,\n      highlight: new Delayed(), // stores highlight worker timeout\n      keySeq: null,  // Unfinished key sequence\n      specialChars: null\n    };\n\n    if (options.autofocus && !mobile) { display.input.focus(); }\n\n    // Override magic textarea content restore that IE sometimes does\n    // on our hidden textarea on reload\n    if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }\n\n    registerEventHandlers(this);\n    ensureGlobalHandlers();\n\n    startOperation(this);\n    this.curOp.forceUpdate = true;\n    attachDoc(this, doc);\n\n    if ((options.autofocus && !mobile) || this.hasFocus())\n      { setTimeout(function () {\n        if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); }\n      }, 20); }\n    else\n      { onBlur(this); }\n\n    for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))\n      { optionHandlers[opt](this, options[opt], Init); } }\n    maybeUpdateLineNumberWidth(this);\n    if (options.finishInit) { options.finishInit(this); }\n    for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); }\n    endOperation(this);\n    // Suppress optimizelegibility in Webkit, since it breaks text\n    // measuring on line wrapping boundaries.\n    if (webkit && options.lineWrapping &&\n        getComputedStyle(display.lineDiv).textRendering == \"optimizelegibility\")\n      { display.lineDiv.style.textRendering = \"auto\"; }\n  }\n\n  // The default configuration options.\n  CodeMirror.defaults = defaults;\n  // Functions to run when options are changed.\n  CodeMirror.optionHandlers = optionHandlers;\n\n  // Attach the necessary event handlers when initializing the editor\n  function registerEventHandlers(cm) {\n    var d = cm.display;\n    on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n    // Older IE's will not fire a second mousedown for a double click\n    if (ie && ie_version < 11)\n      { on(d.scroller, \"dblclick\", operation(cm, function (e) {\n        if (signalDOMEvent(cm, e)) { return }\n        var pos = posFromMouse(cm, e);\n        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }\n        e_preventDefault(e);\n        var word = cm.findWordAt(pos);\n        extendSelection(cm.doc, word.anchor, word.head);\n      })); }\n    else\n      { on(d.scroller, \"dblclick\", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }\n    // Some browsers fire contextmenu *after* opening the menu, at\n    // which point we can't mess with it anymore. Context menu is\n    // handled in onMouseDown for these browsers.\n    on(d.scroller, \"contextmenu\", function (e) { return onContextMenu(cm, e); });\n    on(d.input.getField(), \"contextmenu\", function (e) {\n      if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); }\n    });\n\n    // Used to suppress mouse event handling when a touch happens\n    var touchFinished, prevTouch = {end: 0};\n    function finishTouch() {\n      if (d.activeTouch) {\n        touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);\n        prevTouch = d.activeTouch;\n        prevTouch.end = +new Date;\n      }\n    }\n    function isMouseLikeTouchEvent(e) {\n      if (e.touches.length != 1) { return false }\n      var touch = e.touches[0];\n      return touch.radiusX <= 1 && touch.radiusY <= 1\n    }\n    function farAway(touch, other) {\n      if (other.left == null) { return true }\n      var dx = other.left - touch.left, dy = other.top - touch.top;\n      return dx * dx + dy * dy > 20 * 20\n    }\n    on(d.scroller, \"touchstart\", function (e) {\n      if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {\n        d.input.ensurePolled();\n        clearTimeout(touchFinished);\n        var now = +new Date;\n        d.activeTouch = {start: now, moved: false,\n                         prev: now - prevTouch.end <= 300 ? prevTouch : null};\n        if (e.touches.length == 1) {\n          d.activeTouch.left = e.touches[0].pageX;\n          d.activeTouch.top = e.touches[0].pageY;\n        }\n      }\n    });\n    on(d.scroller, \"touchmove\", function () {\n      if (d.activeTouch) { d.activeTouch.moved = true; }\n    });\n    on(d.scroller, \"touchend\", function (e) {\n      var touch = d.activeTouch;\n      if (touch && !eventInWidget(d, e) && touch.left != null &&\n          !touch.moved && new Date - touch.start < 300) {\n        var pos = cm.coordsChar(d.activeTouch, \"page\"), range;\n        if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n          { range = new Range(pos, pos); }\n        else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n          { range = cm.findWordAt(pos); }\n        else // Triple tap\n          { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }\n        cm.setSelection(range.anchor, range.head);\n        cm.focus();\n        e_preventDefault(e);\n      }\n      finishTouch();\n    });\n    on(d.scroller, \"touchcancel\", finishTouch);\n\n    // Sync scrolling between fake scrollbars and real scrollable\n    // area, ensure viewport is updated when scrolling.\n    on(d.scroller, \"scroll\", function () {\n      if (d.scroller.clientHeight) {\n        updateScrollTop(cm, d.scroller.scrollTop);\n        setScrollLeft(cm, d.scroller.scrollLeft, true);\n        signal(cm, \"scroll\", cm);\n      }\n    });\n\n    // Listen to wheel events in order to try and update the viewport on time.\n    on(d.scroller, \"mousewheel\", function (e) { return onScrollWheel(cm, e); });\n    on(d.scroller, \"DOMMouseScroll\", function (e) { return onScrollWheel(cm, e); });\n\n    // Prevent wrapper from ever scrolling\n    on(d.wrapper, \"scroll\", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n    d.dragFunctions = {\n      enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},\n      over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},\n      start: function (e) { return onDragStart(cm, e); },\n      drop: operation(cm, onDrop),\n      leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}\n    };\n\n    var inp = d.input.getField();\n    on(inp, \"keyup\", function (e) { return onKeyUp.call(cm, e); });\n    on(inp, \"keydown\", operation(cm, onKeyDown));\n    on(inp, \"keypress\", operation(cm, onKeyPress));\n    on(inp, \"focus\", function (e) { return onFocus(cm, e); });\n    on(inp, \"blur\", function (e) { return onBlur(cm, e); });\n  }\n\n  var initHooks = [];\n  CodeMirror.defineInitHook = function (f) { return initHooks.push(f); };\n\n  // Indent the given line. The how parameter can be \"smart\",\n  // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n  // (typically set to true for forced single-line indents), empty\n  // lines are not indented, and places where the mode returns Pass\n  // are left alone.\n  function indentLine(cm, n, how, aggressive) {\n    var doc = cm.doc, state;\n    if (how == null) { how = \"add\"; }\n    if (how == \"smart\") {\n      // Fall back to \"prev\" when the mode doesn't have an indentation\n      // method.\n      if (!doc.mode.indent) { how = \"prev\"; }\n      else { state = getContextBefore(cm, n).state; }\n    }\n\n    var tabSize = cm.options.tabSize;\n    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n    if (line.stateAfter) { line.stateAfter = null; }\n    var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n    if (!aggressive && !/\\S/.test(line.text)) {\n      indentation = 0;\n      how = \"not\";\n    } else if (how == \"smart\") {\n      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n      if (indentation == Pass || indentation > 150) {\n        if (!aggressive) { return }\n        how = \"prev\";\n      }\n    }\n    if (how == \"prev\") {\n      if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }\n      else { indentation = 0; }\n    } else if (how == \"add\") {\n      indentation = curSpace + cm.options.indentUnit;\n    } else if (how == \"subtract\") {\n      indentation = curSpace - cm.options.indentUnit;\n    } else if (typeof how == \"number\") {\n      indentation = curSpace + how;\n    }\n    indentation = Math.max(0, indentation);\n\n    var indentString = \"\", pos = 0;\n    if (cm.options.indentWithTabs)\n      { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";} }\n    if (pos < indentation) { indentString += spaceStr(indentation - pos); }\n\n    if (indentString != curSpaceString) {\n      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n      line.stateAfter = null;\n      return true\n    } else {\n      // Ensure that, if the cursor was in the whitespace at the start\n      // of the line, it is moved to the end of that space.\n      for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {\n        var range = doc.sel.ranges[i$1];\n        if (range.head.line == n && range.head.ch < curSpaceString.length) {\n          var pos$1 = Pos(n, curSpaceString.length);\n          replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));\n          break\n        }\n      }\n    }\n  }\n\n  // This will be set to a {lineWise: bool, text: [string]} object, so\n  // that, when pasting, we know what kind of selections the copied\n  // text was made out of.\n  var lastCopied = null;\n\n  function setLastCopied(newLastCopied) {\n    lastCopied = newLastCopied;\n  }\n\n  function applyTextInput(cm, inserted, deleted, sel, origin) {\n    var doc = cm.doc;\n    cm.display.shift = false;\n    if (!sel) { sel = doc.sel; }\n\n    var recent = +new Date - 200;\n    var paste = origin == \"paste\" || cm.state.pasteIncoming > recent;\n    var textLines = splitLinesAuto(inserted), multiPaste = null;\n    // When pasting N lines into N selections, insert one line per selection\n    if (paste && sel.ranges.length > 1) {\n      if (lastCopied && lastCopied.text.join(\"\\n\") == inserted) {\n        if (sel.ranges.length % lastCopied.text.length == 0) {\n          multiPaste = [];\n          for (var i = 0; i < lastCopied.text.length; i++)\n            { multiPaste.push(doc.splitLines(lastCopied.text[i])); }\n        }\n      } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {\n        multiPaste = map(textLines, function (l) { return [l]; });\n      }\n    }\n\n    var updateInput = cm.curOp.updateInput;\n    // Normal behavior is to insert the new text into every selection\n    for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {\n      var range = sel.ranges[i$1];\n      var from = range.from(), to = range.to();\n      if (range.empty()) {\n        if (deleted && deleted > 0) // Handle deletion\n          { from = Pos(from.line, from.ch - deleted); }\n        else if (cm.state.overwrite && !paste) // Handle overwrite\n          { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }\n        else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join(\"\\n\") == textLines.join(\"\\n\"))\n          { from = to = Pos(from.line, 0); }\n      }\n      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,\n                         origin: origin || (paste ? \"paste\" : cm.state.cutIncoming > recent ? \"cut\" : \"+input\")};\n      makeChange(cm.doc, changeEvent);\n      signalLater(cm, \"inputRead\", cm, changeEvent);\n    }\n    if (inserted && !paste)\n      { triggerElectric(cm, inserted); }\n\n    ensureCursorVisible(cm);\n    if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; }\n    cm.curOp.typing = true;\n    cm.state.pasteIncoming = cm.state.cutIncoming = -1;\n  }\n\n  function handlePaste(e, cm) {\n    var pasted = e.clipboardData && e.clipboardData.getData(\"Text\");\n    if (pasted) {\n      e.preventDefault();\n      if (!cm.isReadOnly() && !cm.options.disableInput)\n        { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, \"paste\"); }); }\n      return true\n    }\n  }\n\n  function triggerElectric(cm, inserted) {\n    // When an 'electric' character is inserted, immediately trigger a reindent\n    if (!cm.options.electricChars || !cm.options.smartIndent) { return }\n    var sel = cm.doc.sel;\n\n    for (var i = sel.ranges.length - 1; i >= 0; i--) {\n      var range = sel.ranges[i];\n      if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue }\n      var mode = cm.getModeAt(range.head);\n      var indented = false;\n      if (mode.electricChars) {\n        for (var j = 0; j < mode.electricChars.length; j++)\n          { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n            indented = indentLine(cm, range.head.line, \"smart\");\n            break\n          } }\n      } else if (mode.electricInput) {\n        if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))\n          { indented = indentLine(cm, range.head.line, \"smart\"); }\n      }\n      if (indented) { signalLater(cm, \"electricInput\", cm, range.head.line); }\n    }\n  }\n\n  function copyableRanges(cm) {\n    var text = [], ranges = [];\n    for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n      var line = cm.doc.sel.ranges[i].head.line;\n      var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n      ranges.push(lineRange);\n      text.push(cm.getRange(lineRange.anchor, lineRange.head));\n    }\n    return {text: text, ranges: ranges}\n  }\n\n  function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) {\n    field.setAttribute(\"autocorrect\", autocorrect ? \"\" : \"off\");\n    field.setAttribute(\"autocapitalize\", autocapitalize ? \"\" : \"off\");\n    field.setAttribute(\"spellcheck\", !!spellcheck);\n  }\n\n  function hiddenTextarea() {\n    var te = elt(\"textarea\", null, null, \"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none\");\n    var div = elt(\"div\", [te], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n    // The textarea is kept positioned near the cursor to prevent the\n    // fact that it'll be scrolled into view on input from scrolling\n    // our fake cursor out of view. On webkit, when wrap=off, paste is\n    // very slow. So make the area wide instead.\n    if (webkit) { te.style.width = \"1000px\"; }\n    else { te.setAttribute(\"wrap\", \"off\"); }\n    // If border: 0; -- iOS fails to open keyboard (issue #1287)\n    if (ios) { te.style.border = \"1px solid black\"; }\n    disableBrowserMagic(te);\n    return div\n  }\n\n  // The publicly visible API. Note that methodOp(f) means\n  // 'wrap f in an operation, performed on its `this` parameter'.\n\n  // This is not the complete set of editor methods. Most of the\n  // methods defined on the Doc type are also injected into\n  // CodeMirror.prototype, for backwards compatibility and\n  // convenience.\n\n  function addEditorMethods(CodeMirror) {\n    var optionHandlers = CodeMirror.optionHandlers;\n\n    var helpers = CodeMirror.helpers = {};\n\n    CodeMirror.prototype = {\n      constructor: CodeMirror,\n      focus: function(){window.focus(); this.display.input.focus();},\n\n      setOption: function(option, value) {\n        var options = this.options, old = options[option];\n        if (options[option] == value && option != \"mode\") { return }\n        options[option] = value;\n        if (optionHandlers.hasOwnProperty(option))\n          { operation(this, optionHandlers[option])(this, value, old); }\n        signal(this, \"optionChange\", this, option);\n      },\n\n      getOption: function(option) {return this.options[option]},\n      getDoc: function() {return this.doc},\n\n      addKeyMap: function(map, bottom) {\n        this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map));\n      },\n      removeKeyMap: function(map) {\n        var maps = this.state.keyMaps;\n        for (var i = 0; i < maps.length; ++i)\n          { if (maps[i] == map || maps[i].name == map) {\n            maps.splice(i, 1);\n            return true\n          } }\n      },\n\n      addOverlay: methodOp(function(spec, options) {\n        var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n        if (mode.startState) { throw new Error(\"Overlays may not be stateful.\") }\n        insertSorted(this.state.overlays,\n                     {mode: mode, modeSpec: spec, opaque: options && options.opaque,\n                      priority: (options && options.priority) || 0},\n                     function (overlay) { return overlay.priority; });\n        this.state.modeGen++;\n        regChange(this);\n      }),\n      removeOverlay: methodOp(function(spec) {\n        var overlays = this.state.overlays;\n        for (var i = 0; i < overlays.length; ++i) {\n          var cur = overlays[i].modeSpec;\n          if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n            overlays.splice(i, 1);\n            this.state.modeGen++;\n            regChange(this);\n            return\n          }\n        }\n      }),\n\n      indentLine: methodOp(function(n, dir, aggressive) {\n        if (typeof dir != \"string\" && typeof dir != \"number\") {\n          if (dir == null) { dir = this.options.smartIndent ? \"smart\" : \"prev\"; }\n          else { dir = dir ? \"add\" : \"subtract\"; }\n        }\n        if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }\n      }),\n      indentSelection: methodOp(function(how) {\n        var ranges = this.doc.sel.ranges, end = -1;\n        for (var i = 0; i < ranges.length; i++) {\n          var range = ranges[i];\n          if (!range.empty()) {\n            var from = range.from(), to = range.to();\n            var start = Math.max(end, from.line);\n            end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n            for (var j = start; j < end; ++j)\n              { indentLine(this, j, how); }\n            var newRanges = this.doc.sel.ranges;\n            if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n              { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }\n          } else if (range.head.line > end) {\n            indentLine(this, range.head.line, how, true);\n            end = range.head.line;\n            if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); }\n          }\n        }\n      }),\n\n      // Fetch the parser token for a given character. Useful for hacks\n      // that want to inspect the mode state (say, for completion).\n      getTokenAt: function(pos, precise) {\n        return takeToken(this, pos, precise)\n      },\n\n      getLineTokens: function(line, precise) {\n        return takeToken(this, Pos(line), precise, true)\n      },\n\n      getTokenTypeAt: function(pos) {\n        pos = clipPos(this.doc, pos);\n        var styles = getLineStyles(this, getLine(this.doc, pos.line));\n        var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n        var type;\n        if (ch == 0) { type = styles[2]; }\n        else { for (;;) {\n          var mid = (before + after) >> 1;\n          if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }\n          else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }\n          else { type = styles[mid * 2 + 2]; break }\n        } }\n        var cut = type ? type.indexOf(\"overlay \") : -1;\n        return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)\n      },\n\n      getModeAt: function(pos) {\n        var mode = this.doc.mode;\n        if (!mode.innerMode) { return mode }\n        return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode\n      },\n\n      getHelper: function(pos, type) {\n        return this.getHelpers(pos, type)[0]\n      },\n\n      getHelpers: function(pos, type) {\n        var found = [];\n        if (!helpers.hasOwnProperty(type)) { return found }\n        var help = helpers[type], mode = this.getModeAt(pos);\n        if (typeof mode[type] == \"string\") {\n          if (help[mode[type]]) { found.push(help[mode[type]]); }\n        } else if (mode[type]) {\n          for (var i = 0; i < mode[type].length; i++) {\n            var val = help[mode[type][i]];\n            if (val) { found.push(val); }\n          }\n        } else if (mode.helperType && help[mode.helperType]) {\n          found.push(help[mode.helperType]);\n        } else if (help[mode.name]) {\n          found.push(help[mode.name]);\n        }\n        for (var i$1 = 0; i$1 < help._global.length; i$1++) {\n          var cur = help._global[i$1];\n          if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n            { found.push(cur.val); }\n        }\n        return found\n      },\n\n      getStateAfter: function(line, precise) {\n        var doc = this.doc;\n        line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n        return getContextBefore(this, line + 1, precise).state\n      },\n\n      cursorCoords: function(start, mode) {\n        var pos, range = this.doc.sel.primary();\n        if (start == null) { pos = range.head; }\n        else if (typeof start == \"object\") { pos = clipPos(this.doc, start); }\n        else { pos = start ? range.from() : range.to(); }\n        return cursorCoords(this, pos, mode || \"page\")\n      },\n\n      charCoords: function(pos, mode) {\n        return charCoords(this, clipPos(this.doc, pos), mode || \"page\")\n      },\n\n      coordsChar: function(coords, mode) {\n        coords = fromCoordSystem(this, coords, mode || \"page\");\n        return coordsChar(this, coords.left, coords.top)\n      },\n\n      lineAtHeight: function(height, mode) {\n        height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n        return lineAtHeight(this.doc, height + this.display.viewOffset)\n      },\n      heightAtLine: function(line, mode, includeWidgets) {\n        var end = false, lineObj;\n        if (typeof line == \"number\") {\n          var last = this.doc.first + this.doc.size - 1;\n          if (line < this.doc.first) { line = this.doc.first; }\n          else if (line > last) { line = last; end = true; }\n          lineObj = getLine(this.doc, line);\n        } else {\n          lineObj = line;\n        }\n        return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\", includeWidgets || end).top +\n          (end ? this.doc.height - heightAtLine(lineObj) : 0)\n      },\n\n      defaultTextHeight: function() { return textHeight(this.display) },\n      defaultCharWidth: function() { return charWidth(this.display) },\n\n      getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},\n\n      addWidget: function(pos, node, scroll, vert, horiz) {\n        var display = this.display;\n        pos = cursorCoords(this, clipPos(this.doc, pos));\n        var top = pos.bottom, left = pos.left;\n        node.style.position = \"absolute\";\n        node.setAttribute(\"cm-ignore-events\", \"true\");\n        this.display.input.setUneditable(node);\n        display.sizer.appendChild(node);\n        if (vert == \"over\") {\n          top = pos.top;\n        } else if (vert == \"above\" || vert == \"near\") {\n          var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n          hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n          // Default to positioning above (if specified and possible); otherwise default to positioning below\n          if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n            { top = pos.top - node.offsetHeight; }\n          else if (pos.bottom + node.offsetHeight <= vspace)\n            { top = pos.bottom; }\n          if (left + node.offsetWidth > hspace)\n            { left = hspace - node.offsetWidth; }\n        }\n        node.style.top = top + \"px\";\n        node.style.left = node.style.right = \"\";\n        if (horiz == \"right\") {\n          left = display.sizer.clientWidth - node.offsetWidth;\n          node.style.right = \"0px\";\n        } else {\n          if (horiz == \"left\") { left = 0; }\n          else if (horiz == \"middle\") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }\n          node.style.left = left + \"px\";\n        }\n        if (scroll)\n          { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }\n      },\n\n      triggerOnKeyDown: methodOp(onKeyDown),\n      triggerOnKeyPress: methodOp(onKeyPress),\n      triggerOnKeyUp: onKeyUp,\n      triggerOnMouseDown: methodOp(onMouseDown),\n\n      execCommand: function(cmd) {\n        if (commands.hasOwnProperty(cmd))\n          { return commands[cmd].call(null, this) }\n      },\n\n      triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),\n\n      findPosH: function(from, amount, unit, visually) {\n        var dir = 1;\n        if (amount < 0) { dir = -1; amount = -amount; }\n        var cur = clipPos(this.doc, from);\n        for (var i = 0; i < amount; ++i) {\n          cur = findPosH(this.doc, cur, dir, unit, visually);\n          if (cur.hitSide) { break }\n        }\n        return cur\n      },\n\n      moveH: methodOp(function(dir, unit) {\n        var this$1 = this;\n\n        this.extendSelectionsBy(function (range) {\n          if (this$1.display.shift || this$1.doc.extend || range.empty())\n            { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) }\n          else\n            { return dir < 0 ? range.from() : range.to() }\n        }, sel_move);\n      }),\n\n      deleteH: methodOp(function(dir, unit) {\n        var sel = this.doc.sel, doc = this.doc;\n        if (sel.somethingSelected())\n          { doc.replaceSelection(\"\", null, \"+delete\"); }\n        else\n          { deleteNearSelection(this, function (range) {\n            var other = findPosH(doc, range.head, dir, unit, false);\n            return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}\n          }); }\n      }),\n\n      findPosV: function(from, amount, unit, goalColumn) {\n        var dir = 1, x = goalColumn;\n        if (amount < 0) { dir = -1; amount = -amount; }\n        var cur = clipPos(this.doc, from);\n        for (var i = 0; i < amount; ++i) {\n          var coords = cursorCoords(this, cur, \"div\");\n          if (x == null) { x = coords.left; }\n          else { coords.left = x; }\n          cur = findPosV(this, coords, dir, unit);\n          if (cur.hitSide) { break }\n        }\n        return cur\n      },\n\n      moveV: methodOp(function(dir, unit) {\n        var this$1 = this;\n\n        var doc = this.doc, goals = [];\n        var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();\n        doc.extendSelectionsBy(function (range) {\n          if (collapse)\n            { return dir < 0 ? range.from() : range.to() }\n          var headPos = cursorCoords(this$1, range.head, \"div\");\n          if (range.goalColumn != null) { headPos.left = range.goalColumn; }\n          goals.push(headPos.left);\n          var pos = findPosV(this$1, headPos, dir, unit);\n          if (unit == \"page\" && range == doc.sel.primary())\n            { addToScrollTop(this$1, charCoords(this$1, pos, \"div\").top - headPos.top); }\n          return pos\n        }, sel_move);\n        if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)\n          { doc.sel.ranges[i].goalColumn = goals[i]; } }\n      }),\n\n      // Find the word at the given position (as returned by coordsChar).\n      findWordAt: function(pos) {\n        var doc = this.doc, line = getLine(doc, pos.line).text;\n        var start = pos.ch, end = pos.ch;\n        if (line) {\n          var helper = this.getHelper(pos, \"wordChars\");\n          if ((pos.sticky == \"before\" || end == line.length) && start) { --start; } else { ++end; }\n          var startChar = line.charAt(start);\n          var check = isWordChar(startChar, helper)\n            ? function (ch) { return isWordChar(ch, helper); }\n            : /\\s/.test(startChar) ? function (ch) { return /\\s/.test(ch); }\n            : function (ch) { return (!/\\s/.test(ch) && !isWordChar(ch)); };\n          while (start > 0 && check(line.charAt(start - 1))) { --start; }\n          while (end < line.length && check(line.charAt(end))) { ++end; }\n        }\n        return new Range(Pos(pos.line, start), Pos(pos.line, end))\n      },\n\n      toggleOverwrite: function(value) {\n        if (value != null && value == this.state.overwrite) { return }\n        if (this.state.overwrite = !this.state.overwrite)\n          { addClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n        else\n          { rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n\n        signal(this, \"overwriteToggle\", this, this.state.overwrite);\n      },\n      hasFocus: function() { return this.display.input.getField() == activeElt() },\n      isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },\n\n      scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),\n      getScrollInfo: function() {\n        var scroller = this.display.scroller;\n        return {left: scroller.scrollLeft, top: scroller.scrollTop,\n                height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n                width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n                clientHeight: displayHeight(this), clientWidth: displayWidth(this)}\n      },\n\n      scrollIntoView: methodOp(function(range, margin) {\n        if (range == null) {\n          range = {from: this.doc.sel.primary().head, to: null};\n          if (margin == null) { margin = this.options.cursorScrollMargin; }\n        } else if (typeof range == \"number\") {\n          range = {from: Pos(range, 0), to: null};\n        } else if (range.from == null) {\n          range = {from: range, to: null};\n        }\n        if (!range.to) { range.to = range.from; }\n        range.margin = margin || 0;\n\n        if (range.from.line != null) {\n          scrollToRange(this, range);\n        } else {\n          scrollToCoordsRange(this, range.from, range.to, range.margin);\n        }\n      }),\n\n      setSize: methodOp(function(width, height) {\n        var this$1 = this;\n\n        var interpret = function (val) { return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val; };\n        if (width != null) { this.display.wrapper.style.width = interpret(width); }\n        if (height != null) { this.display.wrapper.style.height = interpret(height); }\n        if (this.options.lineWrapping) { clearLineMeasurementCache(this); }\n        var lineNo = this.display.viewFrom;\n        this.doc.iter(lineNo, this.display.viewTo, function (line) {\n          if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)\n            { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, \"widget\"); break } } }\n          ++lineNo;\n        });\n        this.curOp.forceUpdate = true;\n        signal(this, \"refresh\", this);\n      }),\n\n      operation: function(f){return runInOp(this, f)},\n      startOperation: function(){return startOperation(this)},\n      endOperation: function(){return endOperation(this)},\n\n      refresh: methodOp(function() {\n        var oldHeight = this.display.cachedTextHeight;\n        regChange(this);\n        this.curOp.forceUpdate = true;\n        clearCaches(this);\n        scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);\n        updateGutterSpace(this.display);\n        if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)\n          { estimateLineHeights(this); }\n        signal(this, \"refresh\", this);\n      }),\n\n      swapDoc: methodOp(function(doc) {\n        var old = this.doc;\n        old.cm = null;\n        // Cancel the current text selection if any (#5821)\n        if (this.state.selectingText) { this.state.selectingText(); }\n        attachDoc(this, doc);\n        clearCaches(this);\n        this.display.input.reset();\n        scrollToCoords(this, doc.scrollLeft, doc.scrollTop);\n        this.curOp.forceScroll = true;\n        signalLater(this, \"swapDoc\", this, old);\n        return old\n      }),\n\n      phrase: function(phraseText) {\n        var phrases = this.options.phrases;\n        return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText\n      },\n\n      getInputField: function(){return this.display.input.getField()},\n      getWrapperElement: function(){return this.display.wrapper},\n      getScrollerElement: function(){return this.display.scroller},\n      getGutterElement: function(){return this.display.gutters}\n    };\n    eventMixin(CodeMirror);\n\n    CodeMirror.registerHelper = function(type, name, value) {\n      if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }\n      helpers[type][name] = value;\n    };\n    CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n      CodeMirror.registerHelper(type, name, value);\n      helpers[type]._global.push({pred: predicate, val: value});\n    };\n  }\n\n  // Used for horizontal relative motion. Dir is -1 or 1 (left or\n  // right), unit can be \"codepoint\", \"char\", \"column\" (like char, but\n  // doesn't cross line boundaries), \"word\" (across next word), or\n  // \"group\" (to the start of next group of word or\n  // non-word-non-whitespace chars). The visually param controls\n  // whether, in right-to-left text, direction 1 means to move towards\n  // the next index in the string, or towards the character to the right\n  // of the current position. The resulting position will have a\n  // hitSide=true property if it reached the end of the document.\n  function findPosH(doc, pos, dir, unit, visually) {\n    var oldPos = pos;\n    var origDir = dir;\n    var lineObj = getLine(doc, pos.line);\n    var lineDir = visually && doc.direction == \"rtl\" ? -dir : dir;\n    function findNextLine() {\n      var l = pos.line + lineDir;\n      if (l < doc.first || l >= doc.first + doc.size) { return false }\n      pos = new Pos(l, pos.ch, pos.sticky);\n      return lineObj = getLine(doc, l)\n    }\n    function moveOnce(boundToLine) {\n      var next;\n      if (unit == \"codepoint\") {\n        var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1));\n        if (isNaN(ch)) {\n          next = null;\n        } else {\n          var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF;\n          next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir);\n        }\n      } else if (visually) {\n        next = moveVisually(doc.cm, lineObj, pos, dir);\n      } else {\n        next = moveLogically(lineObj, pos, dir);\n      }\n      if (next == null) {\n        if (!boundToLine && findNextLine())\n          { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); }\n        else\n          { return false }\n      } else {\n        pos = next;\n      }\n      return true\n    }\n\n    if (unit == \"char\" || unit == \"codepoint\") {\n      moveOnce();\n    } else if (unit == \"column\") {\n      moveOnce(true);\n    } else if (unit == \"word\" || unit == \"group\") {\n      var sawType = null, group = unit == \"group\";\n      var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n      for (var first = true;; first = false) {\n        if (dir < 0 && !moveOnce(!first)) { break }\n        var cur = lineObj.text.charAt(pos.ch) || \"\\n\";\n        var type = isWordChar(cur, helper) ? \"w\"\n          : group && cur == \"\\n\" ? \"n\"\n          : !group || /\\s/.test(cur) ? null\n          : \"p\";\n        if (group && !first && !type) { type = \"s\"; }\n        if (sawType && sawType != type) {\n          if (dir < 0) {dir = 1; moveOnce(); pos.sticky = \"after\";}\n          break\n        }\n\n        if (type) { sawType = type; }\n        if (dir > 0 && !moveOnce(!first)) { break }\n      }\n    }\n    var result = skipAtomic(doc, pos, oldPos, origDir, true);\n    if (equalCursorPos(oldPos, result)) { result.hitSide = true; }\n    return result\n  }\n\n  // For relative vertical movement. Dir may be -1 or 1. Unit can be\n  // \"page\" or \"line\". The resulting position will have a hitSide=true\n  // property if it reached the end of the document.\n  function findPosV(cm, pos, dir, unit) {\n    var doc = cm.doc, x = pos.left, y;\n    if (unit == \"page\") {\n      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);\n      var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);\n      y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;\n\n    } else if (unit == \"line\") {\n      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n    }\n    var target;\n    for (;;) {\n      target = coordsChar(cm, x, y);\n      if (!target.outside) { break }\n      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }\n      y += dir * 5;\n    }\n    return target\n  }\n\n  // CONTENTEDITABLE INPUT STYLE\n\n  var ContentEditableInput = function(cm) {\n    this.cm = cm;\n    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;\n    this.polling = new Delayed();\n    this.composing = null;\n    this.gracePeriod = false;\n    this.readDOMTimeout = null;\n  };\n\n  ContentEditableInput.prototype.init = function (display) {\n      var this$1 = this;\n\n    var input = this, cm = input.cm;\n    var div = input.div = display.lineDiv;\n    div.contentEditable = true;\n    disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);\n\n    function belongsToInput(e) {\n      for (var t = e.target; t; t = t.parentNode) {\n        if (t == div) { return true }\n        if (/\\bCodeMirror-(?:line)?widget\\b/.test(t.className)) { break }\n      }\n      return false\n    }\n\n    on(div, \"paste\", function (e) {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n      // IE doesn't fire input events, so we schedule a read for the pasted content in this way\n      if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }\n    });\n\n    on(div, \"compositionstart\", function (e) {\n      this$1.composing = {data: e.data, done: false};\n    });\n    on(div, \"compositionupdate\", function (e) {\n      if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }\n    });\n    on(div, \"compositionend\", function (e) {\n      if (this$1.composing) {\n        if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }\n        this$1.composing.done = true;\n      }\n    });\n\n    on(div, \"touchstart\", function () { return input.forceCompositionEnd(); });\n\n    on(div, \"input\", function () {\n      if (!this$1.composing) { this$1.readFromDOMSoon(); }\n    });\n\n    function onCopyCut(e) {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return }\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()});\n        if (e.type == \"cut\") { cm.replaceSelection(\"\", null, \"cut\"); }\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        var ranges = copyableRanges(cm);\n        setLastCopied({lineWise: true, text: ranges.text});\n        if (e.type == \"cut\") {\n          cm.operation(function () {\n            cm.setSelections(ranges.ranges, 0, sel_dontScroll);\n            cm.replaceSelection(\"\", null, \"cut\");\n          });\n        }\n      }\n      if (e.clipboardData) {\n        e.clipboardData.clearData();\n        var content = lastCopied.text.join(\"\\n\");\n        // iOS exposes the clipboard API, but seems to discard content inserted into it\n        e.clipboardData.setData(\"Text\", content);\n        if (e.clipboardData.getData(\"Text\") == content) {\n          e.preventDefault();\n          return\n        }\n      }\n      // Old-fashioned briefly-focus-a-textarea hack\n      var kludge = hiddenTextarea(), te = kludge.firstChild;\n      cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);\n      te.value = lastCopied.text.join(\"\\n\");\n      var hadFocus = activeElt();\n      selectInput(te);\n      setTimeout(function () {\n        cm.display.lineSpace.removeChild(kludge);\n        hadFocus.focus();\n        if (hadFocus == div) { input.showPrimarySelection(); }\n      }, 50);\n    }\n    on(div, \"copy\", onCopyCut);\n    on(div, \"cut\", onCopyCut);\n  };\n\n  ContentEditableInput.prototype.screenReaderLabelChanged = function (label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.div.setAttribute('aria-label', label);\n    } else {\n      this.div.removeAttribute('aria-label');\n    }\n  };\n\n  ContentEditableInput.prototype.prepareSelection = function () {\n    var result = prepareSelection(this.cm, false);\n    result.focus = activeElt() == this.div;\n    return result\n  };\n\n  ContentEditableInput.prototype.showSelection = function (info, takeFocus) {\n    if (!info || !this.cm.display.view.length) { return }\n    if (info.focus || takeFocus) { this.showPrimarySelection(); }\n    this.showMultipleSelections(info);\n  };\n\n  ContentEditableInput.prototype.getSelection = function () {\n    return this.cm.display.wrapper.ownerDocument.getSelection()\n  };\n\n  ContentEditableInput.prototype.showPrimarySelection = function () {\n    var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();\n    var from = prim.from(), to = prim.to();\n\n    if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {\n      sel.removeAllRanges();\n      return\n    }\n\n    var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n    var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);\n    if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n        cmp(minPos(curAnchor, curFocus), from) == 0 &&\n        cmp(maxPos(curAnchor, curFocus), to) == 0)\n      { return }\n\n    var view = cm.display.view;\n    var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||\n        {node: view[0].measure.map[2], offset: 0};\n    var end = to.line < cm.display.viewTo && posToDOM(cm, to);\n    if (!end) {\n      var measure = view[view.length - 1].measure;\n      var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;\n      end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};\n    }\n\n    if (!start || !end) {\n      sel.removeAllRanges();\n      return\n    }\n\n    var old = sel.rangeCount && sel.getRangeAt(0), rng;\n    try { rng = range(start.node, start.offset, end.offset, end.node); }\n    catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n    if (rng) {\n      if (!gecko && cm.state.focused) {\n        sel.collapse(start.node, start.offset);\n        if (!rng.collapsed) {\n          sel.removeAllRanges();\n          sel.addRange(rng);\n        }\n      } else {\n        sel.removeAllRanges();\n        sel.addRange(rng);\n      }\n      if (old && sel.anchorNode == null) { sel.addRange(old); }\n      else if (gecko) { this.startGracePeriod(); }\n    }\n    this.rememberSelection();\n  };\n\n  ContentEditableInput.prototype.startGracePeriod = function () {\n      var this$1 = this;\n\n    clearTimeout(this.gracePeriod);\n    this.gracePeriod = setTimeout(function () {\n      this$1.gracePeriod = false;\n      if (this$1.selectionChanged())\n        { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }\n    }, 20);\n  };\n\n  ContentEditableInput.prototype.showMultipleSelections = function (info) {\n    removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);\n    removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);\n  };\n\n  ContentEditableInput.prototype.rememberSelection = function () {\n    var sel = this.getSelection();\n    this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;\n    this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;\n  };\n\n  ContentEditableInput.prototype.selectionInEditor = function () {\n    var sel = this.getSelection();\n    if (!sel.rangeCount) { return false }\n    var node = sel.getRangeAt(0).commonAncestorContainer;\n    return contains(this.div, node)\n  };\n\n  ContentEditableInput.prototype.focus = function () {\n    if (this.cm.options.readOnly != \"nocursor\") {\n      if (!this.selectionInEditor() || activeElt() != this.div)\n        { this.showSelection(this.prepareSelection(), true); }\n      this.div.focus();\n    }\n  };\n  ContentEditableInput.prototype.blur = function () { this.div.blur(); };\n  ContentEditableInput.prototype.getField = function () { return this.div };\n\n  ContentEditableInput.prototype.supportsTouch = function () { return true };\n\n  ContentEditableInput.prototype.receivedFocus = function () {\n      var this$1 = this;\n\n    var input = this;\n    if (this.selectionInEditor())\n      { setTimeout(function () { return this$1.pollSelection(); }, 20); }\n    else\n      { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }\n\n    function poll() {\n      if (input.cm.state.focused) {\n        input.pollSelection();\n        input.polling.set(input.cm.options.pollInterval, poll);\n      }\n    }\n    this.polling.set(this.cm.options.pollInterval, poll);\n  };\n\n  ContentEditableInput.prototype.selectionChanged = function () {\n    var sel = this.getSelection();\n    return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n      sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset\n  };\n\n  ContentEditableInput.prototype.pollSelection = function () {\n    if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }\n    var sel = this.getSelection(), cm = this.cm;\n    // On Android Chrome (version 56, at least), backspacing into an\n    // uneditable block element will put the cursor in that element,\n    // and then, because it's not editable, hide the virtual keyboard.\n    // Because Android doesn't allow us to actually detect backspace\n    // presses in a sane way, this code checks for when that happens\n    // and simulates a backspace press in this case.\n    if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {\n      this.cm.triggerOnKeyDown({type: \"keydown\", keyCode: 8, preventDefault: Math.abs});\n      this.blur();\n      this.focus();\n      return\n    }\n    if (this.composing) { return }\n    this.rememberSelection();\n    var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n    var head = domToPos(cm, sel.focusNode, sel.focusOffset);\n    if (anchor && head) { runInOp(cm, function () {\n      setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);\n      if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }\n    }); }\n  };\n\n  ContentEditableInput.prototype.pollContent = function () {\n    if (this.readDOMTimeout != null) {\n      clearTimeout(this.readDOMTimeout);\n      this.readDOMTimeout = null;\n    }\n\n    var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();\n    var from = sel.from(), to = sel.to();\n    if (from.ch == 0 && from.line > cm.firstLine())\n      { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }\n    if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())\n      { to = Pos(to.line + 1, 0); }\n    if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }\n\n    var fromIndex, fromLine, fromNode;\n    if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n      fromLine = lineNo(display.view[0].line);\n      fromNode = display.view[0].node;\n    } else {\n      fromLine = lineNo(display.view[fromIndex].line);\n      fromNode = display.view[fromIndex - 1].node.nextSibling;\n    }\n    var toIndex = findViewIndex(cm, to.line);\n    var toLine, toNode;\n    if (toIndex == display.view.length - 1) {\n      toLine = display.viewTo - 1;\n      toNode = display.lineDiv.lastChild;\n    } else {\n      toLine = lineNo(display.view[toIndex + 1].line) - 1;\n      toNode = display.view[toIndex + 1].node.previousSibling;\n    }\n\n    if (!fromNode) { return false }\n    var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));\n    var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));\n    while (newText.length > 1 && oldText.length > 1) {\n      if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }\n      else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }\n      else { break }\n    }\n\n    var cutFront = 0, cutEnd = 0;\n    var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);\n    while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n      { ++cutFront; }\n    var newBot = lst(newText), oldBot = lst(oldText);\n    var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n                             oldBot.length - (oldText.length == 1 ? cutFront : 0));\n    while (cutEnd < maxCutEnd &&\n           newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n      { ++cutEnd; }\n    // Try to move start of change to start of selection if ambiguous\n    if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {\n      while (cutFront && cutFront > from.ch &&\n             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {\n        cutFront--;\n        cutEnd++;\n      }\n    }\n\n    newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\\u200b+/, \"\");\n    newText[0] = newText[0].slice(cutFront).replace(/\\u200b+$/, \"\");\n\n    var chFrom = Pos(fromLine, cutFront);\n    var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);\n    if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n      replaceRange(cm.doc, newText, chFrom, chTo, \"+input\");\n      return true\n    }\n  };\n\n  ContentEditableInput.prototype.ensurePolled = function () {\n    this.forceCompositionEnd();\n  };\n  ContentEditableInput.prototype.reset = function () {\n    this.forceCompositionEnd();\n  };\n  ContentEditableInput.prototype.forceCompositionEnd = function () {\n    if (!this.composing) { return }\n    clearTimeout(this.readDOMTimeout);\n    this.composing = null;\n    this.updateFromDOM();\n    this.div.blur();\n    this.div.focus();\n  };\n  ContentEditableInput.prototype.readFromDOMSoon = function () {\n      var this$1 = this;\n\n    if (this.readDOMTimeout != null) { return }\n    this.readDOMTimeout = setTimeout(function () {\n      this$1.readDOMTimeout = null;\n      if (this$1.composing) {\n        if (this$1.composing.done) { this$1.composing = null; }\n        else { return }\n      }\n      this$1.updateFromDOM();\n    }, 80);\n  };\n\n  ContentEditableInput.prototype.updateFromDOM = function () {\n      var this$1 = this;\n\n    if (this.cm.isReadOnly() || !this.pollContent())\n      { runInOp(this.cm, function () { return regChange(this$1.cm); }); }\n  };\n\n  ContentEditableInput.prototype.setUneditable = function (node) {\n    node.contentEditable = \"false\";\n  };\n\n  ContentEditableInput.prototype.onKeyPress = function (e) {\n    if (e.charCode == 0 || this.composing) { return }\n    e.preventDefault();\n    if (!this.cm.isReadOnly())\n      { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }\n  };\n\n  ContentEditableInput.prototype.readOnlyChanged = function (val) {\n    this.div.contentEditable = String(val != \"nocursor\");\n  };\n\n  ContentEditableInput.prototype.onContextMenu = function () {};\n  ContentEditableInput.prototype.resetPosition = function () {};\n\n  ContentEditableInput.prototype.needsContentAttribute = true;\n\n  function posToDOM(cm, pos) {\n    var view = findViewForLine(cm, pos.line);\n    if (!view || view.hidden) { return null }\n    var line = getLine(cm.doc, pos.line);\n    var info = mapFromLineView(view, line, pos.line);\n\n    var order = getOrder(line, cm.doc.direction), side = \"left\";\n    if (order) {\n      var partPos = getBidiPartAt(order, pos.ch);\n      side = partPos % 2 ? \"right\" : \"left\";\n    }\n    var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);\n    result.offset = result.collapse == \"right\" ? result.end : result.start;\n    return result\n  }\n\n  function isInGutter(node) {\n    for (var scan = node; scan; scan = scan.parentNode)\n      { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }\n    return false\n  }\n\n  function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }\n\n  function domTextBetween(cm, from, to, fromLine, toLine) {\n    var text = \"\", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;\n    function recognizeMarker(id) { return function (marker) { return marker.id == id; } }\n    function close() {\n      if (closing) {\n        text += lineSep;\n        if (extraLinebreak) { text += lineSep; }\n        closing = extraLinebreak = false;\n      }\n    }\n    function addText(str) {\n      if (str) {\n        close();\n        text += str;\n      }\n    }\n    function walk(node) {\n      if (node.nodeType == 1) {\n        var cmText = node.getAttribute(\"cm-text\");\n        if (cmText) {\n          addText(cmText);\n          return\n        }\n        var markerID = node.getAttribute(\"cm-marker\"), range;\n        if (markerID) {\n          var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));\n          if (found.length && (range = found[0].find(0)))\n            { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); }\n          return\n        }\n        if (node.getAttribute(\"contenteditable\") == \"false\") { return }\n        var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);\n        if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }\n\n        if (isBlock) { close(); }\n        for (var i = 0; i < node.childNodes.length; i++)\n          { walk(node.childNodes[i]); }\n\n        if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }\n        if (isBlock) { closing = true; }\n      } else if (node.nodeType == 3) {\n        addText(node.nodeValue.replace(/\\u200b/g, \"\").replace(/\\u00a0/g, \" \"));\n      }\n    }\n    for (;;) {\n      walk(from);\n      if (from == to) { break }\n      from = from.nextSibling;\n      extraLinebreak = false;\n    }\n    return text\n  }\n\n  function domToPos(cm, node, offset) {\n    var lineNode;\n    if (node == cm.display.lineDiv) {\n      lineNode = cm.display.lineDiv.childNodes[offset];\n      if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }\n      node = null; offset = 0;\n    } else {\n      for (lineNode = node;; lineNode = lineNode.parentNode) {\n        if (!lineNode || lineNode == cm.display.lineDiv) { return null }\n        if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }\n      }\n    }\n    for (var i = 0; i < cm.display.view.length; i++) {\n      var lineView = cm.display.view[i];\n      if (lineView.node == lineNode)\n        { return locateNodeInLineView(lineView, node, offset) }\n    }\n  }\n\n  function locateNodeInLineView(lineView, node, offset) {\n    var wrapper = lineView.text.firstChild, bad = false;\n    if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }\n    if (node == wrapper) {\n      bad = true;\n      node = wrapper.childNodes[offset];\n      offset = 0;\n      if (!node) {\n        var line = lineView.rest ? lst(lineView.rest) : lineView.line;\n        return badPos(Pos(lineNo(line), line.text.length), bad)\n      }\n    }\n\n    var textNode = node.nodeType == 3 ? node : null, topNode = node;\n    if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {\n      textNode = node.firstChild;\n      if (offset) { offset = textNode.nodeValue.length; }\n    }\n    while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }\n    var measure = lineView.measure, maps = measure.maps;\n\n    function find(textNode, topNode, offset) {\n      for (var i = -1; i < (maps ? maps.length : 0); i++) {\n        var map = i < 0 ? measure.map : maps[i];\n        for (var j = 0; j < map.length; j += 3) {\n          var curNode = map[j + 2];\n          if (curNode == textNode || curNode == topNode) {\n            var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);\n            var ch = map[j] + offset;\n            if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; }\n            return Pos(line, ch)\n          }\n        }\n      }\n    }\n    var found = find(textNode, topNode, offset);\n    if (found) { return badPos(found, bad) }\n\n    // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems\n    for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {\n      found = find(after, after.firstChild, 0);\n      if (found)\n        { return badPos(Pos(found.line, found.ch - dist), bad) }\n      else\n        { dist += after.textContent.length; }\n    }\n    for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {\n      found = find(before, before.firstChild, -1);\n      if (found)\n        { return badPos(Pos(found.line, found.ch + dist$1), bad) }\n      else\n        { dist$1 += before.textContent.length; }\n    }\n  }\n\n  // TEXTAREA INPUT STYLE\n\n  var TextareaInput = function(cm) {\n    this.cm = cm;\n    // See input.poll and input.reset\n    this.prevInput = \"\";\n\n    // Flag that indicates whether we expect input to appear real soon\n    // now (after some event like 'keypress' or 'input') and are\n    // polling intensively.\n    this.pollingFast = false;\n    // Self-resetting timeout for the poller\n    this.polling = new Delayed();\n    // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n    this.hasSelection = false;\n    this.composing = null;\n  };\n\n  TextareaInput.prototype.init = function (display) {\n      var this$1 = this;\n\n    var input = this, cm = this.cm;\n    this.createField(display);\n    var te = this.textarea;\n\n    display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild);\n\n    // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n    if (ios) { te.style.width = \"0px\"; }\n\n    on(te, \"input\", function () {\n      if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }\n      input.poll();\n    });\n\n    on(te, \"paste\", function (e) {\n      if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n\n      cm.state.pasteIncoming = +new Date;\n      input.fastPoll();\n    });\n\n    function prepareCopyCut(e) {\n      if (signalDOMEvent(cm, e)) { return }\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()});\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        var ranges = copyableRanges(cm);\n        setLastCopied({lineWise: true, text: ranges.text});\n        if (e.type == \"cut\") {\n          cm.setSelections(ranges.ranges, null, sel_dontScroll);\n        } else {\n          input.prevInput = \"\";\n          te.value = ranges.text.join(\"\\n\");\n          selectInput(te);\n        }\n      }\n      if (e.type == \"cut\") { cm.state.cutIncoming = +new Date; }\n    }\n    on(te, \"cut\", prepareCopyCut);\n    on(te, \"copy\", prepareCopyCut);\n\n    on(display.scroller, \"paste\", function (e) {\n      if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }\n      if (!te.dispatchEvent) {\n        cm.state.pasteIncoming = +new Date;\n        input.focus();\n        return\n      }\n\n      // Pass the `paste` event to the textarea so it's handled by its event listener.\n      var event = new Event(\"paste\");\n      event.clipboardData = e.clipboardData;\n      te.dispatchEvent(event);\n    });\n\n    // Prevent normal selection in the editor (we handle our own)\n    on(display.lineSpace, \"selectstart\", function (e) {\n      if (!eventInWidget(display, e)) { e_preventDefault(e); }\n    });\n\n    on(te, \"compositionstart\", function () {\n      var start = cm.getCursor(\"from\");\n      if (input.composing) { input.composing.range.clear(); }\n      input.composing = {\n        start: start,\n        range: cm.markText(start, cm.getCursor(\"to\"), {className: \"CodeMirror-composing\"})\n      };\n    });\n    on(te, \"compositionend\", function () {\n      if (input.composing) {\n        input.poll();\n        input.composing.range.clear();\n        input.composing = null;\n      }\n    });\n  };\n\n  TextareaInput.prototype.createField = function (_display) {\n    // Wraps and hides input textarea\n    this.wrapper = hiddenTextarea();\n    // The semihidden textarea that is focused when the editor is\n    // focused, and receives input.\n    this.textarea = this.wrapper.firstChild;\n  };\n\n  TextareaInput.prototype.screenReaderLabelChanged = function (label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.textarea.setAttribute('aria-label', label);\n    } else {\n      this.textarea.removeAttribute('aria-label');\n    }\n  };\n\n  TextareaInput.prototype.prepareSelection = function () {\n    // Redraw the selection and/or cursor\n    var cm = this.cm, display = cm.display, doc = cm.doc;\n    var result = prepareSelection(cm);\n\n    // Move the hidden textarea near the cursor to prevent scrolling artifacts\n    if (cm.options.moveInputWithCursor) {\n      var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n      var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n                                          headPos.top + lineOff.top - wrapOff.top));\n      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n                                           headPos.left + lineOff.left - wrapOff.left));\n    }\n\n    return result\n  };\n\n  TextareaInput.prototype.showSelection = function (drawn) {\n    var cm = this.cm, display = cm.display;\n    removeChildrenAndAdd(display.cursorDiv, drawn.cursors);\n    removeChildrenAndAdd(display.selectionDiv, drawn.selection);\n    if (drawn.teTop != null) {\n      this.wrapper.style.top = drawn.teTop + \"px\";\n      this.wrapper.style.left = drawn.teLeft + \"px\";\n    }\n  };\n\n  // Reset the input to correspond to the selection (or to be empty,\n  // when not typing and nothing is selected)\n  TextareaInput.prototype.reset = function (typing) {\n    if (this.contextMenuPending || this.composing) { return }\n    var cm = this.cm;\n    if (cm.somethingSelected()) {\n      this.prevInput = \"\";\n      var content = cm.getSelection();\n      this.textarea.value = content;\n      if (cm.state.focused) { selectInput(this.textarea); }\n      if (ie && ie_version >= 9) { this.hasSelection = content; }\n    } else if (!typing) {\n      this.prevInput = this.textarea.value = \"\";\n      if (ie && ie_version >= 9) { this.hasSelection = null; }\n    }\n  };\n\n  TextareaInput.prototype.getField = function () { return this.textarea };\n\n  TextareaInput.prototype.supportsTouch = function () { return false };\n\n  TextareaInput.prototype.focus = function () {\n    if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != this.textarea)) {\n      try { this.textarea.focus(); }\n      catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM\n    }\n  };\n\n  TextareaInput.prototype.blur = function () { this.textarea.blur(); };\n\n  TextareaInput.prototype.resetPosition = function () {\n    this.wrapper.style.top = this.wrapper.style.left = 0;\n  };\n\n  TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };\n\n  // Poll for input changes, using the normal rate of polling. This\n  // runs as long as the editor is focused.\n  TextareaInput.prototype.slowPoll = function () {\n      var this$1 = this;\n\n    if (this.pollingFast) { return }\n    this.polling.set(this.cm.options.pollInterval, function () {\n      this$1.poll();\n      if (this$1.cm.state.focused) { this$1.slowPoll(); }\n    });\n  };\n\n  // When an event has just come in that is likely to add or change\n  // something in the input textarea, we poll faster, to ensure that\n  // the change appears on the screen quickly.\n  TextareaInput.prototype.fastPoll = function () {\n    var missed = false, input = this;\n    input.pollingFast = true;\n    function p() {\n      var changed = input.poll();\n      if (!changed && !missed) {missed = true; input.polling.set(60, p);}\n      else {input.pollingFast = false; input.slowPoll();}\n    }\n    input.polling.set(20, p);\n  };\n\n  // Read input from the textarea, and update the document to match.\n  // When something is selected, it is present in the textarea, and\n  // selected (unless it is huge, in which case a placeholder is\n  // used). When nothing is selected, the cursor sits after previously\n  // seen text (can be empty), which is stored in prevInput (we must\n  // not reset the textarea when typing, because that breaks IME).\n  TextareaInput.prototype.poll = function () {\n      var this$1 = this;\n\n    var cm = this.cm, input = this.textarea, prevInput = this.prevInput;\n    // Since this is called a *lot*, try to bail out as cheaply as\n    // possible when it is clear that nothing happened. hasSelection\n    // will be the case when there is a lot of text in the textarea,\n    // in which case reading its value would be expensive.\n    if (this.contextMenuPending || !cm.state.focused ||\n        (hasSelection(input) && !prevInput && !this.composing) ||\n        cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n      { return false }\n\n    var text = input.value;\n    // If nothing changed, bail.\n    if (text == prevInput && !cm.somethingSelected()) { return false }\n    // Work around nonsensical selection resetting in IE9/10, and\n    // inexplicable appearance of private area unicode characters on\n    // some key combos in Mac (#2689).\n    if (ie && ie_version >= 9 && this.hasSelection === text ||\n        mac && /[\\uf700-\\uf7ff]/.test(text)) {\n      cm.display.input.reset();\n      return false\n    }\n\n    if (cm.doc.sel == cm.display.selForContextMenu) {\n      var first = text.charCodeAt(0);\n      if (first == 0x200b && !prevInput) { prevInput = \"\\u200b\"; }\n      if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\") }\n    }\n    // Find the part of the input that is actually new\n    var same = 0, l = Math.min(prevInput.length, text.length);\n    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }\n\n    runInOp(cm, function () {\n      applyTextInput(cm, text.slice(same), prevInput.length - same,\n                     null, this$1.composing ? \"*compose\" : null);\n\n      // Don't leave long text in the textarea, since it makes further polling slow\n      if (text.length > 1000 || text.indexOf(\"\\n\") > -1) { input.value = this$1.prevInput = \"\"; }\n      else { this$1.prevInput = text; }\n\n      if (this$1.composing) {\n        this$1.composing.range.clear();\n        this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor(\"to\"),\n                                           {className: \"CodeMirror-composing\"});\n      }\n    });\n    return true\n  };\n\n  TextareaInput.prototype.ensurePolled = function () {\n    if (this.pollingFast && this.poll()) { this.pollingFast = false; }\n  };\n\n  TextareaInput.prototype.onKeyPress = function () {\n    if (ie && ie_version >= 9) { this.hasSelection = null; }\n    this.fastPoll();\n  };\n\n  TextareaInput.prototype.onContextMenu = function (e) {\n    var input = this, cm = input.cm, display = cm.display, te = input.textarea;\n    if (input.contextMenuPending) { input.contextMenuPending(); }\n    var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n    if (!pos || presto) { return } // Opera is difficult.\n\n    // Reset the current text selection only if the click is done outside of the selection\n    // and 'resetSelectionOnContextMenu' option is true.\n    var reset = cm.options.resetSelectionOnContextMenu;\n    if (reset && cm.doc.sel.contains(pos) == -1)\n      { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }\n\n    var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;\n    var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect();\n    input.wrapper.style.cssText = \"position: static\";\n    te.style.cssText = \"position: absolute; width: 30px; height: 30px;\\n      top: \" + (e.clientY - wrapperBox.top - 5) + \"px; left: \" + (e.clientX - wrapperBox.left - 5) + \"px;\\n      z-index: 1000; background: \" + (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") + \";\\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n    var oldScrollY;\n    if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712)\n    display.input.focus();\n    if (webkit) { window.scrollTo(null, oldScrollY); }\n    display.input.reset();\n    // Adds \"Select all\" to context menu in FF\n    if (!cm.somethingSelected()) { te.value = input.prevInput = \" \"; }\n    input.contextMenuPending = rehide;\n    display.selForContextMenu = cm.doc.sel;\n    clearTimeout(display.detectingSelectAll);\n\n    // Select-all will be greyed out if there's nothing to select, so\n    // this adds a zero-width space so that we can later check whether\n    // it got selected.\n    function prepareSelectAllHack() {\n      if (te.selectionStart != null) {\n        var selected = cm.somethingSelected();\n        var extval = \"\\u200b\" + (selected ? te.value : \"\");\n        te.value = \"\\u21da\"; // Used to catch context-menu undo\n        te.value = extval;\n        input.prevInput = selected ? \"\" : \"\\u200b\";\n        te.selectionStart = 1; te.selectionEnd = extval.length;\n        // Re-set this, in case some other handler touched the\n        // selection in the meantime.\n        display.selForContextMenu = cm.doc.sel;\n      }\n    }\n    function rehide() {\n      if (input.contextMenuPending != rehide) { return }\n      input.contextMenuPending = false;\n      input.wrapper.style.cssText = oldWrapperCSS;\n      te.style.cssText = oldCSS;\n      if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }\n\n      // Try to detect the user choosing select-all\n      if (te.selectionStart != null) {\n        if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }\n        var i = 0, poll = function () {\n          if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n              te.selectionEnd > 0 && input.prevInput == \"\\u200b\") {\n            operation(cm, selectAll)(cm);\n          } else if (i++ < 10) {\n            display.detectingSelectAll = setTimeout(poll, 500);\n          } else {\n            display.selForContextMenu = null;\n            display.input.reset();\n          }\n        };\n        display.detectingSelectAll = setTimeout(poll, 200);\n      }\n    }\n\n    if (ie && ie_version >= 9) { prepareSelectAllHack(); }\n    if (captureRightClick) {\n      e_stop(e);\n      var mouseup = function () {\n        off(window, \"mouseup\", mouseup);\n        setTimeout(rehide, 20);\n      };\n      on(window, \"mouseup\", mouseup);\n    } else {\n      setTimeout(rehide, 50);\n    }\n  };\n\n  TextareaInput.prototype.readOnlyChanged = function (val) {\n    if (!val) { this.reset(); }\n    this.textarea.disabled = val == \"nocursor\";\n    this.textarea.readOnly = !!val;\n  };\n\n  TextareaInput.prototype.setUneditable = function () {};\n\n  TextareaInput.prototype.needsContentAttribute = false;\n\n  function fromTextArea(textarea, options) {\n    options = options ? copyObj(options) : {};\n    options.value = textarea.value;\n    if (!options.tabindex && textarea.tabIndex)\n      { options.tabindex = textarea.tabIndex; }\n    if (!options.placeholder && textarea.placeholder)\n      { options.placeholder = textarea.placeholder; }\n    // Set autofocus to true if this textarea is focused, or if it has\n    // autofocus and no other element is focused.\n    if (options.autofocus == null) {\n      var hasFocus = activeElt();\n      options.autofocus = hasFocus == textarea ||\n        textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n    }\n\n    function save() {textarea.value = cm.getValue();}\n\n    var realSubmit;\n    if (textarea.form) {\n      on(textarea.form, \"submit\", save);\n      // Deplorable hack to make the submit method do the right thing.\n      if (!options.leaveSubmitMethodAlone) {\n        var form = textarea.form;\n        realSubmit = form.submit;\n        try {\n          var wrappedSubmit = form.submit = function () {\n            save();\n            form.submit = realSubmit;\n            form.submit();\n            form.submit = wrappedSubmit;\n          };\n        } catch(e) {}\n      }\n    }\n\n    options.finishInit = function (cm) {\n      cm.save = save;\n      cm.getTextArea = function () { return textarea; };\n      cm.toTextArea = function () {\n        cm.toTextArea = isNaN; // Prevent this from being ran twice\n        save();\n        textarea.parentNode.removeChild(cm.getWrapperElement());\n        textarea.style.display = \"\";\n        if (textarea.form) {\n          off(textarea.form, \"submit\", save);\n          if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == \"function\")\n            { textarea.form.submit = realSubmit; }\n        }\n      };\n    };\n\n    textarea.style.display = \"none\";\n    var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },\n      options);\n    return cm\n  }\n\n  function addLegacyProps(CodeMirror) {\n    CodeMirror.off = off;\n    CodeMirror.on = on;\n    CodeMirror.wheelEventPixels = wheelEventPixels;\n    CodeMirror.Doc = Doc;\n    CodeMirror.splitLines = splitLinesAuto;\n    CodeMirror.countColumn = countColumn;\n    CodeMirror.findColumn = findColumn;\n    CodeMirror.isWordChar = isWordCharBasic;\n    CodeMirror.Pass = Pass;\n    CodeMirror.signal = signal;\n    CodeMirror.Line = Line;\n    CodeMirror.changeEnd = changeEnd;\n    CodeMirror.scrollbarModel = scrollbarModel;\n    CodeMirror.Pos = Pos;\n    CodeMirror.cmpPos = cmp;\n    CodeMirror.modes = modes;\n    CodeMirror.mimeModes = mimeModes;\n    CodeMirror.resolveMode = resolveMode;\n    CodeMirror.getMode = getMode;\n    CodeMirror.modeExtensions = modeExtensions;\n    CodeMirror.extendMode = extendMode;\n    CodeMirror.copyState = copyState;\n    CodeMirror.startState = startState;\n    CodeMirror.innerMode = innerMode;\n    CodeMirror.commands = commands;\n    CodeMirror.keyMap = keyMap;\n    CodeMirror.keyName = keyName;\n    CodeMirror.isModifierKey = isModifierKey;\n    CodeMirror.lookupKey = lookupKey;\n    CodeMirror.normalizeKeyMap = normalizeKeyMap;\n    CodeMirror.StringStream = StringStream;\n    CodeMirror.SharedTextMarker = SharedTextMarker;\n    CodeMirror.TextMarker = TextMarker;\n    CodeMirror.LineWidget = LineWidget;\n    CodeMirror.e_preventDefault = e_preventDefault;\n    CodeMirror.e_stopPropagation = e_stopPropagation;\n    CodeMirror.e_stop = e_stop;\n    CodeMirror.addClass = addClass;\n    CodeMirror.contains = contains;\n    CodeMirror.rmClass = rmClass;\n    CodeMirror.keyNames = keyNames;\n  }\n\n  // EDITOR CONSTRUCTOR\n\n  defineOptions(CodeMirror);\n\n  addEditorMethods(CodeMirror);\n\n  // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n  var dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \");\n  for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n    { CodeMirror.prototype[prop] = (function(method) {\n      return function() {return method.apply(this.doc, arguments)}\n    })(Doc.prototype[prop]); } }\n\n  eventMixin(Doc);\n  CodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  CodeMirror.defineMode = function(name/*, mode, …*/) {\n    if (!CodeMirror.defaults.mode && name != \"null\") { CodeMirror.defaults.mode = name; }\n    defineMode.apply(this, arguments);\n  };\n\n  CodeMirror.defineMIME = defineMIME;\n\n  // Minimal default mode.\n  CodeMirror.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\n  CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n  // EXTENSIONS\n\n  CodeMirror.defineExtension = function (name, func) {\n    CodeMirror.prototype[name] = func;\n  };\n  CodeMirror.defineDocExtension = function (name, func) {\n    Doc.prototype[name] = func;\n  };\n\n  CodeMirror.fromTextArea = fromTextArea;\n\n  addLegacyProps(CodeMirror);\n\n  CodeMirror.version = \"5.65.2\";\n\n  return CodeMirror;\n\n})));\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/apl/apl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"apl\", function() {\n  var builtInOps = {\n    \".\": \"innerProduct\",\n    \"\\\\\": \"scan\",\n    \"/\": \"reduce\",\n    \"⌿\": \"reduce1Axis\",\n    \"⍀\": \"scan1Axis\",\n    \"¨\": \"each\",\n    \"⍣\": \"power\"\n  };\n  var builtInFuncs = {\n    \"+\": [\"conjugate\", \"add\"],\n    \"−\": [\"negate\", \"subtract\"],\n    \"×\": [\"signOf\", \"multiply\"],\n    \"÷\": [\"reciprocal\", \"divide\"],\n    \"⌈\": [\"ceiling\", \"greaterOf\"],\n    \"⌊\": [\"floor\", \"lesserOf\"],\n    \"∣\": [\"absolute\", \"residue\"],\n    \"⍳\": [\"indexGenerate\", \"indexOf\"],\n    \"?\": [\"roll\", \"deal\"],\n    \"⋆\": [\"exponentiate\", \"toThePowerOf\"],\n    \"⍟\": [\"naturalLog\", \"logToTheBase\"],\n    \"○\": [\"piTimes\", \"circularFuncs\"],\n    \"!\": [\"factorial\", \"binomial\"],\n    \"⌹\": [\"matrixInverse\", \"matrixDivide\"],\n    \"<\": [null, \"lessThan\"],\n    \"≤\": [null, \"lessThanOrEqual\"],\n    \"=\": [null, \"equals\"],\n    \">\": [null, \"greaterThan\"],\n    \"≥\": [null, \"greaterThanOrEqual\"],\n    \"≠\": [null, \"notEqual\"],\n    \"≡\": [\"depth\", \"match\"],\n    \"≢\": [null, \"notMatch\"],\n    \"∈\": [\"enlist\", \"membership\"],\n    \"⍷\": [null, \"find\"],\n    \"∪\": [\"unique\", \"union\"],\n    \"∩\": [null, \"intersection\"],\n    \"∼\": [\"not\", \"without\"],\n    \"∨\": [null, \"or\"],\n    \"∧\": [null, \"and\"],\n    \"⍱\": [null, \"nor\"],\n    \"⍲\": [null, \"nand\"],\n    \"⍴\": [\"shapeOf\", \"reshape\"],\n    \",\": [\"ravel\", \"catenate\"],\n    \"⍪\": [null, \"firstAxisCatenate\"],\n    \"⌽\": [\"reverse\", \"rotate\"],\n    \"⊖\": [\"axis1Reverse\", \"axis1Rotate\"],\n    \"⍉\": [\"transpose\", null],\n    \"↑\": [\"first\", \"take\"],\n    \"↓\": [null, \"drop\"],\n    \"⊂\": [\"enclose\", \"partitionWithAxis\"],\n    \"⊃\": [\"diclose\", \"pick\"],\n    \"⌷\": [null, \"index\"],\n    \"⍋\": [\"gradeUp\", null],\n    \"⍒\": [\"gradeDown\", null],\n    \"⊤\": [\"encode\", null],\n    \"⊥\": [\"decode\", null],\n    \"⍕\": [\"format\", \"formatByExample\"],\n    \"⍎\": [\"execute\", null],\n    \"⊣\": [\"stop\", \"left\"],\n    \"⊢\": [\"pass\", \"right\"]\n  };\n\n  var isOperator = /[\\.\\/⌿⍀¨⍣]/;\n  var isNiladic = /⍬/;\n  var isFunction = /[\\+−×÷⌈⌊∣⍳\\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/;\n  var isArrow = /←/;\n  var isComment = /[⍝#].*$/;\n\n  var stringEater = function(type) {\n    var prev;\n    prev = false;\n    return function(c) {\n      prev = c;\n      if (c === type) {\n        return prev === \"\\\\\";\n      }\n      return true;\n    };\n  };\n  return {\n    startState: function() {\n      return {\n        prev: false,\n        func: false,\n        op: false,\n        string: false,\n        escape: false\n      };\n    },\n    token: function(stream, state) {\n      var ch, funcName;\n      if (stream.eatSpace()) {\n        return null;\n      }\n      ch = stream.next();\n      if (ch === '\"' || ch === \"'\") {\n        stream.eatWhile(stringEater(ch));\n        stream.next();\n        state.prev = true;\n        return \"string\";\n      }\n      if (/[\\[{\\(]/.test(ch)) {\n        state.prev = false;\n        return null;\n      }\n      if (/[\\]}\\)]/.test(ch)) {\n        state.prev = true;\n        return null;\n      }\n      if (isNiladic.test(ch)) {\n        state.prev = false;\n        return \"niladic\";\n      }\n      if (/[¯\\d]/.test(ch)) {\n        if (state.func) {\n          state.func = false;\n          state.prev = false;\n        } else {\n          state.prev = true;\n        }\n        stream.eatWhile(/[\\w\\.]/);\n        return \"number\";\n      }\n      if (isOperator.test(ch)) {\n        return \"operator apl-\" + builtInOps[ch];\n      }\n      if (isArrow.test(ch)) {\n        return \"apl-arrow\";\n      }\n      if (isFunction.test(ch)) {\n        funcName = \"apl-\";\n        if (builtInFuncs[ch] != null) {\n          if (state.prev) {\n            funcName += builtInFuncs[ch][1];\n          } else {\n            funcName += builtInFuncs[ch][0];\n          }\n        }\n        state.func = true;\n        state.prev = false;\n        return \"function \" + funcName;\n      }\n      if (isComment.test(ch)) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      if (ch === \"∘\" && stream.peek() === \".\") {\n        stream.next();\n        return \"function jot-dot\";\n      }\n      stream.eatWhile(/[\\w\\$_]/);\n      state.prev = true;\n      return \"keyword\";\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/apl\", \"apl\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/asciiarmor/asciiarmor.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function errorIfNotEmpty(stream) {\n    var nonWS = stream.match(/^\\s*\\S/);\n    stream.skipToEnd();\n    return nonWS ? \"error\" : null;\n  }\n\n  CodeMirror.defineMode(\"asciiarmor\", function() {\n    return {\n      token: function(stream, state) {\n        var m;\n        if (state.state == \"top\") {\n          if (stream.sol() && (m = stream.match(/^-----BEGIN (.*)?-----\\s*$/))) {\n            state.state = \"headers\";\n            state.type = m[1];\n            return \"tag\";\n          }\n          return errorIfNotEmpty(stream);\n        } else if (state.state == \"headers\") {\n          if (stream.sol() && stream.match(/^\\w+:/)) {\n            state.state = \"header\";\n            return \"atom\";\n          } else {\n            var result = errorIfNotEmpty(stream);\n            if (result) state.state = \"body\";\n            return result;\n          }\n        } else if (state.state == \"header\") {\n          stream.skipToEnd();\n          state.state = \"headers\";\n          return \"string\";\n        } else if (state.state == \"body\") {\n          if (stream.sol() && (m = stream.match(/^-----END (.*)?-----\\s*$/))) {\n            if (m[1] != state.type) return \"error\";\n            state.state = \"end\";\n            return \"tag\";\n          } else {\n            if (stream.eatWhile(/[A-Za-z0-9+\\/=]/)) {\n              return null;\n            } else {\n              stream.next();\n              return \"error\";\n            }\n          }\n        } else if (state.state == \"end\") {\n          return errorIfNotEmpty(stream);\n        }\n      },\n      blankLine: function(state) {\n        if (state.state == \"headers\") state.state = \"body\";\n      },\n      startState: function() {\n        return {state: \"top\", type: null};\n      }\n    };\n  });\n\n  CodeMirror.defineMIME(\"application/pgp\", \"asciiarmor\");\n  CodeMirror.defineMIME(\"application/pgp-encrypted\", \"asciiarmor\");\n  CodeMirror.defineMIME(\"application/pgp-keys\", \"asciiarmor\");\n  CodeMirror.defineMIME(\"application/pgp-signature\", \"asciiarmor\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/asn.1/asn.1.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"asn.1\", function(config, parserConfig) {\n    var indentUnit = config.indentUnit,\n        keywords = parserConfig.keywords || {},\n        cmipVerbs = parserConfig.cmipVerbs || {},\n        compareTypes = parserConfig.compareTypes || {},\n        status = parserConfig.status || {},\n        tags = parserConfig.tags || {},\n        storage = parserConfig.storage || {},\n        modifier = parserConfig.modifier || {},\n        accessTypes = parserConfig.accessTypes|| {},\n        multiLineStrings = parserConfig.multiLineStrings,\n        indentStatements = parserConfig.indentStatements !== false;\n    var isOperatorChar = /[\\|\\^]/;\n    var curPunc;\n\n    function tokenBase(stream, state) {\n      var ch = stream.next();\n      if (ch == '\"' || ch == \"'\") {\n        state.tokenize = tokenString(ch);\n        return state.tokenize(stream, state);\n      }\n      if (/[\\[\\]\\(\\){}:=,;]/.test(ch)) {\n        curPunc = ch;\n        return \"punctuation\";\n      }\n      if (ch == \"-\"){\n        if (stream.eat(\"-\")) {\n          stream.skipToEnd();\n          return \"comment\";\n        }\n      }\n      if (/\\d/.test(ch)) {\n        stream.eatWhile(/[\\w\\.]/);\n        return \"number\";\n      }\n      if (isOperatorChar.test(ch)) {\n        stream.eatWhile(isOperatorChar);\n        return \"operator\";\n      }\n\n      stream.eatWhile(/[\\w\\-]/);\n      var cur = stream.current();\n      if (keywords.propertyIsEnumerable(cur)) return \"keyword\";\n      if (cmipVerbs.propertyIsEnumerable(cur)) return \"variable cmipVerbs\";\n      if (compareTypes.propertyIsEnumerable(cur)) return \"atom compareTypes\";\n      if (status.propertyIsEnumerable(cur)) return \"comment status\";\n      if (tags.propertyIsEnumerable(cur)) return \"variable-3 tags\";\n      if (storage.propertyIsEnumerable(cur)) return \"builtin storage\";\n      if (modifier.propertyIsEnumerable(cur)) return \"string-2 modifier\";\n      if (accessTypes.propertyIsEnumerable(cur)) return \"atom accessTypes\";\n\n      return \"variable\";\n    }\n\n    function tokenString(quote) {\n      return function(stream, state) {\n        var escaped = false, next, end = false;\n        while ((next = stream.next()) != null) {\n          if (next == quote && !escaped){\n            var afterNext = stream.peek();\n            //look if the character if the quote is like the B in '10100010'B\n            if (afterNext){\n              afterNext = afterNext.toLowerCase();\n              if(afterNext == \"b\" || afterNext == \"h\" || afterNext == \"o\")\n                stream.next();\n            }\n            end = true; break;\n          }\n          escaped = !escaped && next == \"\\\\\";\n        }\n        if (end || !(escaped || multiLineStrings))\n          state.tokenize = null;\n        return \"string\";\n      };\n    }\n\n    function Context(indented, column, type, align, prev) {\n      this.indented = indented;\n      this.column = column;\n      this.type = type;\n      this.align = align;\n      this.prev = prev;\n    }\n    function pushContext(state, col, type) {\n      var indent = state.indented;\n      if (state.context && state.context.type == \"statement\")\n        indent = state.context.indented;\n      return state.context = new Context(indent, col, type, null, state.context);\n    }\n    function popContext(state) {\n      var t = state.context.type;\n      if (t == \")\" || t == \"]\" || t == \"}\")\n        state.indented = state.context.indented;\n      return state.context = state.context.prev;\n    }\n\n    //Interface\n    return {\n      startState: function(basecolumn) {\n        return {\n          tokenize: null,\n          context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n          indented: 0,\n          startOfLine: true\n        };\n      },\n\n      token: function(stream, state) {\n        var ctx = state.context;\n        if (stream.sol()) {\n          if (ctx.align == null) ctx.align = false;\n          state.indented = stream.indentation();\n          state.startOfLine = true;\n        }\n        if (stream.eatSpace()) return null;\n        curPunc = null;\n        var style = (state.tokenize || tokenBase)(stream, state);\n        if (style == \"comment\") return style;\n        if (ctx.align == null) ctx.align = true;\n\n        if ((curPunc == \";\" || curPunc == \":\" || curPunc == \",\")\n            && ctx.type == \"statement\"){\n          popContext(state);\n        }\n        else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n        else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n        else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n        else if (curPunc == \"}\") {\n          while (ctx.type == \"statement\") ctx = popContext(state);\n          if (ctx.type == \"}\") ctx = popContext(state);\n          while (ctx.type == \"statement\") ctx = popContext(state);\n        }\n        else if (curPunc == ctx.type) popContext(state);\n        else if (indentStatements && (((ctx.type == \"}\" || ctx.type == \"top\")\n            && curPunc != ';') || (ctx.type == \"statement\"\n            && curPunc == \"newstatement\")))\n          pushContext(state, stream.column(), \"statement\");\n\n        state.startOfLine = false;\n        return style;\n      },\n\n      electricChars: \"{}\",\n      lineComment: \"--\",\n      fold: \"brace\"\n    };\n  });\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  CodeMirror.defineMIME(\"text/x-ttcn-asn\", {\n    name: \"asn.1\",\n    keywords: words(\"DEFINITIONS OBJECTS IF DERIVED INFORMATION ACTION\" +\n    \" REPLY ANY NAMED CHARACTERIZED BEHAVIOUR REGISTERED\" +\n    \" WITH AS IDENTIFIED CONSTRAINED BY PRESENT BEGIN\" +\n    \" IMPORTS FROM UNITS SYNTAX MIN-ACCESS MAX-ACCESS\" +\n    \" MINACCESS MAXACCESS REVISION STATUS DESCRIPTION\" +\n    \" SEQUENCE SET COMPONENTS OF CHOICE DistinguishedName\" +\n    \" ENUMERATED SIZE MODULE END INDEX AUGMENTS EXTENSIBILITY\" +\n    \" IMPLIED EXPORTS\"),\n    cmipVerbs: words(\"ACTIONS ADD GET NOTIFICATIONS REPLACE REMOVE\"),\n    compareTypes: words(\"OPTIONAL DEFAULT MANAGED MODULE-TYPE MODULE_IDENTITY\" +\n    \" MODULE-COMPLIANCE OBJECT-TYPE OBJECT-IDENTITY\" +\n    \" OBJECT-COMPLIANCE MODE CONFIRMED CONDITIONAL\" +\n    \" SUBORDINATE SUPERIOR CLASS TRUE FALSE NULL\" +\n    \" TEXTUAL-CONVENTION\"),\n    status: words(\"current deprecated mandatory obsolete\"),\n    tags: words(\"APPLICATION AUTOMATIC EXPLICIT IMPLICIT PRIVATE TAGS\" +\n    \" UNIVERSAL\"),\n    storage: words(\"BOOLEAN INTEGER OBJECT IDENTIFIER BIT OCTET STRING\" +\n    \" UTCTime InterfaceIndex IANAifType CMIP-Attribute\" +\n    \" REAL PACKAGE PACKAGES IpAddress PhysAddress\" +\n    \" NetworkAddress BITS BMPString TimeStamp TimeTicks\" +\n    \" TruthValue RowStatus DisplayString GeneralString\" +\n    \" GraphicString IA5String NumericString\" +\n    \" PrintableString SnmpAdminString TeletexString\" +\n    \" UTF8String VideotexString VisibleString StringStore\" +\n    \" ISO646String T61String UniversalString Unsigned32\" +\n    \" Integer32 Gauge Gauge32 Counter Counter32 Counter64\"),\n    modifier: words(\"ATTRIBUTE ATTRIBUTES MANDATORY-GROUP MANDATORY-GROUPS\" +\n    \" GROUP GROUPS ELEMENTS EQUALITY ORDERING SUBSTRINGS\" +\n    \" DEFINED\"),\n    accessTypes: words(\"not-accessible accessible-for-notify read-only\" +\n    \" read-create read-write\"),\n    multiLineStrings: true\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/asterisk/asterisk.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\n * =====================================================================================\n *\n *       Filename:  mode/asterisk/asterisk.js\n *\n *    Description:  CodeMirror mode for Asterisk dialplan\n *\n *        Created:  05/17/2012 09:20:25 PM\n *       Revision:  08/05/2019 AstLinux Project: Support block-comments\n *\n *         Author:  Stas Kobzar (stas@modulis.ca),\n *        Company:  Modulis.ca Inc.\n *\n * =====================================================================================\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"asterisk\", function() {\n  var atoms    = [\"exten\", \"same\", \"include\",\"ignorepat\",\"switch\"],\n      dpcmd    = [\"#include\",\"#exec\"],\n      apps     = [\n                  \"addqueuemember\",\"adsiprog\",\"aelsub\",\"agentlogin\",\"agentmonitoroutgoing\",\"agi\",\n                  \"alarmreceiver\",\"amd\",\"answer\",\"authenticate\",\"background\",\"backgrounddetect\",\n                  \"bridge\",\"busy\",\"callcompletioncancel\",\"callcompletionrequest\",\"celgenuserevent\",\n                  \"changemonitor\",\"chanisavail\",\"channelredirect\",\"chanspy\",\"clearhash\",\"confbridge\",\n                  \"congestion\",\"continuewhile\",\"controlplayback\",\"dahdiacceptr2call\",\"dahdibarge\",\n                  \"dahdiras\",\"dahdiscan\",\"dahdisendcallreroutingfacility\",\"dahdisendkeypadfacility\",\n                  \"datetime\",\"dbdel\",\"dbdeltree\",\"deadagi\",\"dial\",\"dictate\",\"directory\",\"disa\",\n                  \"dumpchan\",\"eagi\",\"echo\",\"endwhile\",\"exec\",\"execif\",\"execiftime\",\"exitwhile\",\"extenspy\",\n                  \"externalivr\",\"festival\",\"flash\",\"followme\",\"forkcdr\",\"getcpeid\",\"gosub\",\"gosubif\",\n                  \"goto\",\"gotoif\",\"gotoiftime\",\"hangup\",\"iax2provision\",\"ices\",\"importvar\",\"incomplete\",\n                  \"ivrdemo\",\"jabberjoin\",\"jabberleave\",\"jabbersend\",\"jabbersendgroup\",\"jabberstatus\",\n                  \"jack\",\"log\",\"macro\",\"macroexclusive\",\"macroexit\",\"macroif\",\"mailboxexists\",\"meetme\",\n                  \"meetmeadmin\",\"meetmechanneladmin\",\"meetmecount\",\"milliwatt\",\"minivmaccmess\",\"minivmdelete\",\n                  \"minivmgreet\",\"minivmmwi\",\"minivmnotify\",\"minivmrecord\",\"mixmonitor\",\"monitor\",\"morsecode\",\n                  \"mp3player\",\"mset\",\"musiconhold\",\"nbscat\",\"nocdr\",\"noop\",\"odbc\",\"odbc\",\"odbcfinish\",\n                  \"originate\",\"ospauth\",\"ospfinish\",\"osplookup\",\"ospnext\",\"page\",\"park\",\"parkandannounce\",\n                  \"parkedcall\",\"pausemonitor\",\"pausequeuemember\",\"pickup\",\"pickupchan\",\"playback\",\"playtones\",\n                  \"privacymanager\",\"proceeding\",\"progress\",\"queue\",\"queuelog\",\"raiseexception\",\"read\",\"readexten\",\n                  \"readfile\",\"receivefax\",\"receivefax\",\"receivefax\",\"record\",\"removequeuemember\",\n                  \"resetcdr\",\"retrydial\",\"return\",\"ringing\",\"sayalpha\",\"saycountedadj\",\"saycountednoun\",\n                  \"saycountpl\",\"saydigits\",\"saynumber\",\"sayphonetic\",\"sayunixtime\",\"senddtmf\",\"sendfax\",\n                  \"sendfax\",\"sendfax\",\"sendimage\",\"sendtext\",\"sendurl\",\"set\",\"setamaflags\",\n                  \"setcallerpres\",\"setmusiconhold\",\"sipaddheader\",\"sipdtmfmode\",\"sipremoveheader\",\"skel\",\n                  \"slastation\",\"slatrunk\",\"sms\",\"softhangup\",\"speechactivategrammar\",\"speechbackground\",\n                  \"speechcreate\",\"speechdeactivategrammar\",\"speechdestroy\",\"speechloadgrammar\",\"speechprocessingsound\",\n                  \"speechstart\",\"speechunloadgrammar\",\"stackpop\",\"startmusiconhold\",\"stopmixmonitor\",\"stopmonitor\",\n                  \"stopmusiconhold\",\"stopplaytones\",\"system\",\"testclient\",\"testserver\",\"transfer\",\"tryexec\",\n                  \"trysystem\",\"unpausemonitor\",\"unpausequeuemember\",\"userevent\",\"verbose\",\"vmauthenticate\",\n                  \"vmsayname\",\"voicemail\",\"voicemailmain\",\"wait\",\"waitexten\",\"waitfornoise\",\"waitforring\",\n                  \"waitforsilence\",\"waitmusiconhold\",\"waituntil\",\"while\",\"zapateller\"\n                 ];\n\n  function basicToken(stream,state){\n    var cur = '';\n    var ch = stream.next();\n    // comment\n    if (state.blockComment) {\n      if (ch == \"-\" && stream.match(\"-;\", true)) {\n        state.blockComment = false;\n      } else if (stream.skipTo(\"--;\")) {\n        stream.next();\n        stream.next();\n        stream.next();\n        state.blockComment = false;\n      } else {\n        stream.skipToEnd();\n      }\n      return \"comment\";\n    }\n    if(ch == \";\") {\n      if (stream.match(\"--\", true)) {\n        if (!stream.match(\"-\", false)) {  // Except ;--- is not a block comment\n          state.blockComment = true;\n          return \"comment\";\n        }\n      }\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    // context\n    if(ch == '[') {\n      stream.skipTo(']');\n      stream.eat(']');\n      return \"header\";\n    }\n    // string\n    if(ch == '\"') {\n      stream.skipTo('\"');\n      return \"string\";\n    }\n    if(ch == \"'\") {\n      stream.skipTo(\"'\");\n      return \"string-2\";\n    }\n    // dialplan commands\n    if(ch == '#') {\n      stream.eatWhile(/\\w/);\n      cur = stream.current();\n      if(dpcmd.indexOf(cur) !== -1) {\n        stream.skipToEnd();\n        return \"strong\";\n      }\n    }\n    // application args\n    if(ch == '$'){\n      var ch1 = stream.peek();\n      if(ch1 == '{'){\n        stream.skipTo('}');\n        stream.eat('}');\n        return \"variable-3\";\n      }\n    }\n    // extension\n    stream.eatWhile(/\\w/);\n    cur = stream.current();\n    if(atoms.indexOf(cur) !== -1) {\n      state.extenStart = true;\n      switch(cur) {\n        case 'same': state.extenSame = true; break;\n        case 'include':\n        case 'switch':\n        case 'ignorepat':\n          state.extenInclude = true;break;\n        default:break;\n      }\n      return \"atom\";\n    }\n  }\n\n  return {\n    startState: function() {\n      return {\n        blockComment: false,\n        extenStart: false,\n        extenSame:  false,\n        extenInclude: false,\n        extenExten: false,\n        extenPriority: false,\n        extenApplication: false\n      };\n    },\n    token: function(stream, state) {\n\n      var cur = '';\n      if(stream.eatSpace()) return null;\n      // extension started\n      if(state.extenStart){\n        stream.eatWhile(/[^\\s]/);\n        cur = stream.current();\n        if(/^=>?$/.test(cur)){\n          state.extenExten = true;\n          state.extenStart = false;\n          return \"strong\";\n        } else {\n          state.extenStart = false;\n          stream.skipToEnd();\n          return \"error\";\n        }\n      } else if(state.extenExten) {\n        // set exten and priority\n        state.extenExten = false;\n        state.extenPriority = true;\n        stream.eatWhile(/[^,]/);\n        if(state.extenInclude) {\n          stream.skipToEnd();\n          state.extenPriority = false;\n          state.extenInclude = false;\n        }\n        if(state.extenSame) {\n          state.extenPriority = false;\n          state.extenSame = false;\n          state.extenApplication = true;\n        }\n        return \"tag\";\n      } else if(state.extenPriority) {\n        state.extenPriority = false;\n        state.extenApplication = true;\n        stream.next(); // get comma\n        if(state.extenSame) return null;\n        stream.eatWhile(/[^,]/);\n        return \"number\";\n      } else if(state.extenApplication) {\n        stream.eatWhile(/,/);\n        cur = stream.current();\n        if(cur === ',') return null;\n        stream.eatWhile(/\\w/);\n        cur = stream.current().toLowerCase();\n        state.extenApplication = false;\n        if(apps.indexOf(cur) !== -1){\n          return \"def strong\";\n        }\n      } else{\n        return basicToken(stream,state);\n      }\n\n      return null;\n    },\n\n    blockCommentStart: \";--\",\n    blockCommentEnd: \"--;\",\n    lineComment: \";\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-asterisk\", \"asterisk\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/brainfuck/brainfuck.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Brainfuck mode created by Michael Kaminsky https://github.com/mkaminsky11\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\")\n    mod(require(\"../../lib/codemirror\"))\n  else if (typeof define == \"function\" && define.amd)\n    define([\"../../lib/codemirror\"], mod)\n  else\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n  var reserve = \"><+-.,[]\".split(\"\");\n  /*\n  comments can be either:\n  placed behind lines\n\n        +++    this is a comment\n\n  where reserved characters cannot be used\n  or in a loop\n  [\n    this is ok to use [ ] and stuff\n  ]\n  or preceded by #\n  */\n  CodeMirror.defineMode(\"brainfuck\", function() {\n    return {\n      startState: function() {\n        return {\n          commentLine: false,\n          left: 0,\n          right: 0,\n          commentLoop: false\n        }\n      },\n      token: function(stream, state) {\n        if (stream.eatSpace()) return null\n        if(stream.sol()){\n          state.commentLine = false;\n        }\n        var ch = stream.next().toString();\n        if(reserve.indexOf(ch) !== -1){\n          if(state.commentLine === true){\n            if(stream.eol()){\n              state.commentLine = false;\n            }\n            return \"comment\";\n          }\n          if(ch === \"]\" || ch === \"[\"){\n            if(ch === \"[\"){\n              state.left++;\n            }\n            else{\n              state.right++;\n            }\n            return \"bracket\";\n          }\n          else if(ch === \"+\" || ch === \"-\"){\n            return \"keyword\";\n          }\n          else if(ch === \"<\" || ch === \">\"){\n            return \"atom\";\n          }\n          else if(ch === \".\" || ch === \",\"){\n            return \"def\";\n          }\n        }\n        else{\n          state.commentLine = true;\n          if(stream.eol()){\n            state.commentLine = false;\n          }\n          return \"comment\";\n        }\n        if(stream.eol()){\n          state.commentLine = false;\n        }\n      }\n    };\n  });\nCodeMirror.defineMIME(\"text/x-brainfuck\",\"brainfuck\")\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/clike/clike.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction Context(indented, column, type, info, align, prev) {\n  this.indented = indented;\n  this.column = column;\n  this.type = type;\n  this.info = info;\n  this.align = align;\n  this.prev = prev;\n}\nfunction pushContext(state, col, type, info) {\n  var indent = state.indented;\n  if (state.context && state.context.type == \"statement\" && type != \"statement\")\n    indent = state.context.indented;\n  return state.context = new Context(indent, col, type, info, null, state.context);\n}\nfunction popContext(state) {\n  var t = state.context.type;\n  if (t == \")\" || t == \"]\" || t == \"}\")\n    state.indented = state.context.indented;\n  return state.context = state.context.prev;\n}\n\nfunction typeBefore(stream, state, pos) {\n  if (state.prevToken == \"variable\" || state.prevToken == \"type\") return true;\n  if (/\\S(?:[^- ]>|[*\\]])\\s*$|\\*$/.test(stream.string.slice(0, pos))) return true;\n  if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true;\n}\n\nfunction isTopScope(context) {\n  for (;;) {\n    if (!context || context.type == \"top\") return true;\n    if (context.type == \"}\" && context.prev.info != \"namespace\") return false;\n    context = context.prev;\n  }\n}\n\nCodeMirror.defineMode(\"clike\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit,\n      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,\n      dontAlignCalls = parserConfig.dontAlignCalls,\n      keywords = parserConfig.keywords || {},\n      types = parserConfig.types || {},\n      builtin = parserConfig.builtin || {},\n      blockKeywords = parserConfig.blockKeywords || {},\n      defKeywords = parserConfig.defKeywords || {},\n      atoms = parserConfig.atoms || {},\n      hooks = parserConfig.hooks || {},\n      multiLineStrings = parserConfig.multiLineStrings,\n      indentStatements = parserConfig.indentStatements !== false,\n      indentSwitch = parserConfig.indentSwitch !== false,\n      namespaceSeparator = parserConfig.namespaceSeparator,\n      isPunctuationChar = parserConfig.isPunctuationChar || /[\\[\\]{}\\(\\),;\\:\\.]/,\n      numberStart = parserConfig.numberStart || /[\\d\\.]/,\n      number = parserConfig.number || /^(?:0x[a-f\\d]+|0b[01]+|(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)(u|ll?|l|f)?/i,\n      isOperatorChar = parserConfig.isOperatorChar || /[+\\-*&%=<>!?|\\/]/,\n      isIdentifierChar = parserConfig.isIdentifierChar || /[\\w\\$_\\xa1-\\uffff]/,\n      // An optional function that takes a {string} token and returns true if it\n      // should be treated as a builtin.\n      isReservedIdentifier = parserConfig.isReservedIdentifier || false;\n\n  var curPunc, isDefKeyword;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (hooks[ch]) {\n      var result = hooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (numberStart.test(ch)) {\n      stream.backUp(1)\n      if (stream.match(number)) return \"number\"\n      stream.next()\n    }\n    if (isPunctuationChar.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      while (!stream.match(/^\\/[\\/*]/, false) && stream.eat(isOperatorChar)) {}\n      return \"operator\";\n    }\n    stream.eatWhile(isIdentifierChar);\n    if (namespaceSeparator) while (stream.match(namespaceSeparator))\n      stream.eatWhile(isIdentifierChar);\n\n    var cur = stream.current();\n    if (contains(keywords, cur)) {\n      if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n      if (contains(defKeywords, cur)) isDefKeyword = true;\n      return \"keyword\";\n    }\n    if (contains(types, cur)) return \"type\";\n    if (contains(builtin, cur)\n        || (isReservedIdentifier && isReservedIdentifier(cur))) {\n      if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n      return \"builtin\";\n    }\n    if (contains(atoms, cur)) return \"atom\";\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = null;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function maybeEOL(stream, state) {\n    if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context))\n      state.typeAtEndOfLine = typeBefore(stream, state, stream.pos)\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", null, false),\n        indented: 0,\n        startOfLine: true,\n        prevToken: null\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n      }\n      if (stream.eatSpace()) { maybeEOL(stream, state); return null; }\n      curPunc = isDefKeyword = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if (curPunc == \";\" || curPunc == \":\" || (curPunc == \",\" && stream.match(/^\\s*(?:\\/\\/.*)?$/, false)))\n        while (state.context.type == \"statement\") popContext(state);\n      else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"}\") {\n        while (ctx.type == \"statement\") ctx = popContext(state);\n        if (ctx.type == \"}\") ctx = popContext(state);\n        while (ctx.type == \"statement\") ctx = popContext(state);\n      }\n      else if (curPunc == ctx.type) popContext(state);\n      else if (indentStatements &&\n               (((ctx.type == \"}\" || ctx.type == \"top\") && curPunc != \";\") ||\n                (ctx.type == \"statement\" && curPunc == \"newstatement\"))) {\n        pushContext(state, stream.column(), \"statement\", stream.current());\n      }\n\n      if (style == \"variable\" &&\n          ((state.prevToken == \"def\" ||\n            (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) &&\n             isTopScope(state.context) && stream.match(/^\\s*\\(/, false)))))\n        style = \"def\";\n\n      if (hooks.token) {\n        var result = hooks.token(stream, state, style);\n        if (result !== undefined) style = result;\n      }\n\n      if (style == \"def\" && parserConfig.styleDefs === false) style = \"variable\";\n\n      state.startOfLine = false;\n      state.prevToken = isDefKeyword ? \"def\" : style || curPunc;\n      maybeEOL(stream, state);\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass;\n      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n      var closing = firstChar == ctx.type;\n      if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n      if (parserConfig.dontIndentStatements)\n        while (ctx.type == \"statement\" && parserConfig.dontIndentStatements.test(ctx.info))\n          ctx = ctx.prev\n      if (hooks.indent) {\n        var hook = hooks.indent(state, ctx, textAfter, indentUnit);\n        if (typeof hook == \"number\") return hook\n      }\n      var switchBlock = ctx.prev && ctx.prev.info == \"switch\";\n      if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) {\n        while (ctx.type != \"top\" && ctx.type != \"}\") ctx = ctx.prev\n        return ctx.indented\n      }\n      if (ctx.type == \"statement\")\n        return ctx.indented + (firstChar == \"{\" ? 0 : statementIndentUnit);\n      if (ctx.align && (!dontAlignCalls || ctx.type != \")\"))\n        return ctx.column + (closing ? 0 : 1);\n      if (ctx.type == \")\" && !closing)\n        return ctx.indented + statementIndentUnit;\n\n      return ctx.indented + (closing ? 0 : indentUnit) +\n        (!closing && switchBlock && !/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 0);\n    },\n\n    electricInput: indentSwitch ? /^\\s*(?:case .*?:|default:|\\{\\}?|\\})$/ : /^\\s*[{}]$/,\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    blockCommentContinue: \" * \",\n    lineComment: \"//\",\n    fold: \"brace\"\n  };\n});\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  function contains(words, word) {\n    if (typeof words === \"function\") {\n      return words(word);\n    } else {\n      return words.propertyIsEnumerable(word);\n    }\n  }\n  var cKeywords = \"auto if break case register continue return default do sizeof \" +\n    \"static else struct switch extern typedef union for goto while enum const \" +\n    \"volatile inline restrict asm fortran\";\n\n  // Keywords from https://en.cppreference.com/w/cpp/keyword includes C++20.\n  var cppKeywords = \"alignas alignof and and_eq audit axiom bitand bitor catch \" +\n  \"class compl concept constexpr const_cast decltype delete dynamic_cast \" +\n  \"explicit export final friend import module mutable namespace new noexcept \" +\n  \"not not_eq operator or or_eq override private protected public \" +\n  \"reinterpret_cast requires static_assert static_cast template this \" +\n  \"thread_local throw try typeid typename using virtual xor xor_eq\";\n\n  var objCKeywords = \"bycopy byref in inout oneway out self super atomic nonatomic retain copy \" +\n  \"readwrite readonly strong weak assign typeof nullable nonnull null_resettable _cmd \" +\n  \"@interface @implementation @end @protocol @encode @property @synthesize @dynamic @class \" +\n  \"@public @package @private @protected @required @optional @try @catch @finally @import \" +\n  \"@selector @encode @defs @synchronized @autoreleasepool @compatibility_alias @available\";\n\n  var objCBuiltins = \"FOUNDATION_EXPORT FOUNDATION_EXTERN NS_INLINE NS_FORMAT_FUNCTION \" +\n  \" NS_RETURNS_RETAINEDNS_ERROR_ENUM NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER \" +\n  \"NS_DESIGNATED_INITIALIZER NS_ENUM NS_OPTIONS NS_REQUIRES_NIL_TERMINATION \" +\n  \"NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_SWIFT_NAME NS_REFINED_FOR_SWIFT\"\n\n  // Do not use this. Use the cTypes function below. This is global just to avoid\n  // excessive calls when cTypes is being called multiple times during a parse.\n  var basicCTypes = words(\"int long char short double float unsigned signed \" +\n    \"void bool\");\n\n  // Do not use this. Use the objCTypes function below. This is global just to avoid\n  // excessive calls when objCTypes is being called multiple times during a parse.\n  var basicObjCTypes = words(\"SEL instancetype id Class Protocol BOOL\");\n\n  // Returns true if identifier is a \"C\" type.\n  // C type is defined as those that are reserved by the compiler (basicTypes),\n  // and those that end in _t (Reserved by POSIX for types)\n  // http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html\n  function cTypes(identifier) {\n    return contains(basicCTypes, identifier) || /.+_t$/.test(identifier);\n  }\n\n  // Returns true if identifier is a \"Objective C\" type.\n  function objCTypes(identifier) {\n    return cTypes(identifier) || contains(basicObjCTypes, identifier);\n  }\n\n  var cBlockKeywords = \"case do else for if switch while struct enum union\";\n  var cDefKeywords = \"struct enum union\";\n\n  function cppHook(stream, state) {\n    if (!state.startOfLine) return false\n    for (var ch, next = null; ch = stream.peek();) {\n      if (ch == \"\\\\\" && stream.match(/^.$/)) {\n        next = cppHook\n        break\n      } else if (ch == \"/\" && stream.match(/^\\/[\\/\\*]/, false)) {\n        break\n      }\n      stream.next()\n    }\n    state.tokenize = next\n    return \"meta\"\n  }\n\n  function pointerHook(_stream, state) {\n    if (state.prevToken == \"type\") return \"type\";\n    return false;\n  }\n\n  // For C and C++ (and ObjC): identifiers starting with __\n  // or _ followed by a capital letter are reserved for the compiler.\n  function cIsReservedIdentifier(token) {\n    if (!token || token.length < 2) return false;\n    if (token[0] != '_') return false;\n    return (token[1] == '_') || (token[1] !== token[1].toLowerCase());\n  }\n\n  function cpp14Literal(stream) {\n    stream.eatWhile(/[\\w\\.']/);\n    return \"number\";\n  }\n\n  function cpp11StringHook(stream, state) {\n    stream.backUp(1);\n    // Raw strings.\n    if (stream.match(/^(?:R|u8R|uR|UR|LR)/)) {\n      var match = stream.match(/^\"([^\\s\\\\()]{0,16})\\(/);\n      if (!match) {\n        return false;\n      }\n      state.cpp11RawStringDelim = match[1];\n      state.tokenize = tokenRawString;\n      return tokenRawString(stream, state);\n    }\n    // Unicode strings/chars.\n    if (stream.match(/^(?:u8|u|U|L)/)) {\n      if (stream.match(/^[\"']/, /* eat */ false)) {\n        return \"string\";\n      }\n      return false;\n    }\n    // Ignore this hook.\n    stream.next();\n    return false;\n  }\n\n  function cppLooksLikeConstructor(word) {\n    var lastTwo = /(\\w+)::~?(\\w+)$/.exec(word);\n    return lastTwo && lastTwo[1] == lastTwo[2];\n  }\n\n  // C#-style strings where \"\" escapes a quote.\n  function tokenAtString(stream, state) {\n    var next;\n    while ((next = stream.next()) != null) {\n      if (next == '\"' && !stream.eat('\"')) {\n        state.tokenize = null;\n        break;\n      }\n    }\n    return \"string\";\n  }\n\n  // C++11 raw string literal is <prefix>\"<delim>( anything )<delim>\", where\n  // <delim> can be a string up to 16 characters long.\n  function tokenRawString(stream, state) {\n    // Escape characters that have special regex meanings.\n    var delim = state.cpp11RawStringDelim.replace(/[^\\w\\s]/g, '\\\\$&');\n    var match = stream.match(new RegExp(\".*?\\\\)\" + delim + '\"'));\n    if (match)\n      state.tokenize = null;\n    else\n      stream.skipToEnd();\n    return \"string\";\n  }\n\n  function def(mimes, mode) {\n    if (typeof mimes == \"string\") mimes = [mimes];\n    var words = [];\n    function add(obj) {\n      if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))\n        words.push(prop);\n    }\n    add(mode.keywords);\n    add(mode.types);\n    add(mode.builtin);\n    add(mode.atoms);\n    if (words.length) {\n      mode.helperType = mimes[0];\n      CodeMirror.registerHelper(\"hintWords\", mimes[0], words);\n    }\n\n    for (var i = 0; i < mimes.length; ++i)\n      CodeMirror.defineMIME(mimes[i], mode);\n  }\n\n  def([\"text/x-csrc\", \"text/x-c\", \"text/x-chdr\"], {\n    name: \"clike\",\n    keywords: words(cKeywords),\n    types: cTypes,\n    blockKeywords: words(cBlockKeywords),\n    defKeywords: words(cDefKeywords),\n    typeFirstDefinitions: true,\n    atoms: words(\"NULL true false\"),\n    isReservedIdentifier: cIsReservedIdentifier,\n    hooks: {\n      \"#\": cppHook,\n      \"*\": pointerHook,\n    },\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def([\"text/x-c++src\", \"text/x-c++hdr\"], {\n    name: \"clike\",\n    keywords: words(cKeywords + \" \" + cppKeywords),\n    types: cTypes,\n    blockKeywords: words(cBlockKeywords + \" class try catch\"),\n    defKeywords: words(cDefKeywords + \" class namespace\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false NULL nullptr\"),\n    dontIndentStatements: /^template$/,\n    isIdentifierChar: /[\\w\\$_~\\xa1-\\uffff]/,\n    isReservedIdentifier: cIsReservedIdentifier,\n    hooks: {\n      \"#\": cppHook,\n      \"*\": pointerHook,\n      \"u\": cpp11StringHook,\n      \"U\": cpp11StringHook,\n      \"L\": cpp11StringHook,\n      \"R\": cpp11StringHook,\n      \"0\": cpp14Literal,\n      \"1\": cpp14Literal,\n      \"2\": cpp14Literal,\n      \"3\": cpp14Literal,\n      \"4\": cpp14Literal,\n      \"5\": cpp14Literal,\n      \"6\": cpp14Literal,\n      \"7\": cpp14Literal,\n      \"8\": cpp14Literal,\n      \"9\": cpp14Literal,\n      token: function(stream, state, style) {\n        if (style == \"variable\" && stream.peek() == \"(\" &&\n            (state.prevToken == \";\" || state.prevToken == null ||\n             state.prevToken == \"}\") &&\n            cppLooksLikeConstructor(stream.current()))\n          return \"def\";\n      }\n    },\n    namespaceSeparator: \"::\",\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-java\", {\n    name: \"clike\",\n    keywords: words(\"abstract assert break case catch class const continue default \" +\n                    \"do else enum extends final finally for goto if implements import \" +\n                    \"instanceof interface native new package private protected public \" +\n                    \"return static strictfp super switch synchronized this throw throws transient \" +\n                    \"try volatile while @interface\"),\n    types: words(\"var byte short int long float double boolean char void Boolean Byte Character Double Float \" +\n                 \"Integer Long Number Object Short String StringBuffer StringBuilder Void\"),\n    blockKeywords: words(\"catch class do else finally for if switch try while\"),\n    defKeywords: words(\"class interface enum @interface\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null\"),\n    number: /^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+\\.?\\d*|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,\n    hooks: {\n      \"@\": function(stream) {\n        // Don't match the @interface keyword.\n        if (stream.match('interface', false)) return false;\n\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      },\n      '\"': function(stream, state) {\n        if (!stream.match('\"\"\\n')) return false;\n        state.tokenize = tokenTripleString;\n        return state.tokenize(stream, state);\n      }\n    },\n    modeProps: {fold: [\"brace\", \"import\"]}\n  });\n\n  def(\"text/x-csharp\", {\n    name: \"clike\",\n    keywords: words(\"abstract as async await base break case catch checked class const continue\" +\n                    \" default delegate do else enum event explicit extern finally fixed for\" +\n                    \" foreach goto if implicit in interface internal is lock namespace new\" +\n                    \" operator out override params private protected public readonly ref return sealed\" +\n                    \" sizeof stackalloc static struct switch this throw try typeof unchecked\" +\n                    \" unsafe using virtual void volatile while add alias ascending descending dynamic from get\" +\n                    \" global group into join let orderby partial remove select set value var yield\"),\n    types: words(\"Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func\" +\n                 \" Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32\" +\n                 \" UInt64 bool byte char decimal double short int long object\"  +\n                 \" sbyte float string ushort uint ulong\"),\n    blockKeywords: words(\"catch class do else finally for foreach if struct switch try while\"),\n    defKeywords: words(\"class interface namespace struct var\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null\"),\n    hooks: {\n      \"@\": function(stream, state) {\n        if (stream.eat('\"')) {\n          state.tokenize = tokenAtString;\n          return tokenAtString(stream, state);\n        }\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      }\n    }\n  });\n\n  function tokenTripleString(stream, state) {\n    var escaped = false;\n    while (!stream.eol()) {\n      if (!escaped && stream.match('\"\"\"')) {\n        state.tokenize = null;\n        break;\n      }\n      escaped = stream.next() == \"\\\\\" && !escaped;\n    }\n    return \"string\";\n  }\n\n  function tokenNestedComment(depth) {\n    return function (stream, state) {\n      var ch\n      while (ch = stream.next()) {\n        if (ch == \"*\" && stream.eat(\"/\")) {\n          if (depth == 1) {\n            state.tokenize = null\n            break\n          } else {\n            state.tokenize = tokenNestedComment(depth - 1)\n            return state.tokenize(stream, state)\n          }\n        } else if (ch == \"/\" && stream.eat(\"*\")) {\n          state.tokenize = tokenNestedComment(depth + 1)\n          return state.tokenize(stream, state)\n        }\n      }\n      return \"comment\"\n    }\n  }\n\n  def(\"text/x-scala\", {\n    name: \"clike\",\n    keywords: words(\n      /* scala */\n      \"abstract case catch class def do else extends final finally for forSome if \" +\n      \"implicit import lazy match new null object override package private protected return \" +\n      \"sealed super this throw trait try type val var while with yield _ \" +\n\n      /* package scala */\n      \"assert assume require print println printf readLine readBoolean readByte readShort \" +\n      \"readChar readInt readLong readFloat readDouble\"\n    ),\n    types: words(\n      \"AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either \" +\n      \"Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable \" +\n      \"Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering \" +\n      \"Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder \" +\n      \"StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector \" +\n\n      /* package java.lang */\n      \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n      \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n      \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n      \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void\"\n    ),\n    multiLineStrings: true,\n    blockKeywords: words(\"catch class enum do else finally for forSome if match switch try while\"),\n    defKeywords: words(\"class enum def object package trait type val var\"),\n    atoms: words(\"true false null\"),\n    indentStatements: false,\n    indentSwitch: false,\n    isOperatorChar: /[+\\-*&%=<>!?|\\/#:@]/,\n    hooks: {\n      \"@\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      },\n      '\"': function(stream, state) {\n        if (!stream.match('\"\"')) return false;\n        state.tokenize = tokenTripleString;\n        return state.tokenize(stream, state);\n      },\n      \"'\": function(stream) {\n        stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n        return \"atom\";\n      },\n      \"=\": function(stream, state) {\n        var cx = state.context\n        if (cx.type == \"}\" && cx.align && stream.eat(\">\")) {\n          state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev)\n          return \"operator\"\n        } else {\n          return false\n        }\n      },\n\n      \"/\": function(stream, state) {\n        if (!stream.eat(\"*\")) return false\n        state.tokenize = tokenNestedComment(1)\n        return state.tokenize(stream, state)\n      }\n    },\n    modeProps: {closeBrackets: {pairs: '()[]{}\"\"', triples: '\"'}}\n  });\n\n  function tokenKotlinString(tripleString){\n    return function (stream, state) {\n      var escaped = false, next, end = false;\n      while (!stream.eol()) {\n        if (!tripleString && !escaped && stream.match('\"') ) {end = true; break;}\n        if (tripleString && stream.match('\"\"\"')) {end = true; break;}\n        next = stream.next();\n        if(!escaped && next == \"$\" && stream.match('{'))\n          stream.skipTo(\"}\");\n        escaped = !escaped && next == \"\\\\\" && !tripleString;\n      }\n      if (end || !tripleString)\n        state.tokenize = null;\n      return \"string\";\n    }\n  }\n\n  def(\"text/x-kotlin\", {\n    name: \"clike\",\n    keywords: words(\n      /*keywords*/\n      \"package as typealias class interface this super val operator \" +\n      \"var fun for is in This throw return annotation \" +\n      \"break continue object if else while do try when !in !is as? \" +\n\n      /*soft keywords*/\n      \"file import where by get set abstract enum open inner override private public internal \" +\n      \"protected catch finally out final vararg reified dynamic companion constructor init \" +\n      \"sealed field property receiver param sparam lateinit data inline noinline tailrec \" +\n      \"external annotation crossinline const operator infix suspend actual expect setparam value\"\n    ),\n    types: words(\n      /* package java.lang */\n      \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n      \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n      \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n      \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray \" +\n      \"ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy \" +\n      \"LazyThreadSafetyMode LongArray Nothing ShortArray Unit\"\n    ),\n    intendSwitch: false,\n    indentStatements: false,\n    multiLineStrings: true,\n    number: /^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+(\\.\\d+)?|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,\n    blockKeywords: words(\"catch class do else finally for if where try while enum\"),\n    defKeywords: words(\"class val var object interface fun\"),\n    atoms: words(\"true false null this\"),\n    hooks: {\n      \"@\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      },\n      '*': function(_stream, state) {\n        return state.prevToken == '.' ? 'variable' : 'operator';\n      },\n      '\"': function(stream, state) {\n        state.tokenize = tokenKotlinString(stream.match('\"\"'));\n        return state.tokenize(stream, state);\n      },\n      \"/\": function(stream, state) {\n        if (!stream.eat(\"*\")) return false;\n        state.tokenize = tokenNestedComment(1);\n        return state.tokenize(stream, state)\n      },\n      indent: function(state, ctx, textAfter, indentUnit) {\n        var firstChar = textAfter && textAfter.charAt(0);\n        if ((state.prevToken == \"}\" || state.prevToken == \")\") && textAfter == \"\")\n          return state.indented;\n        if ((state.prevToken == \"operator\" && textAfter != \"}\" && state.context.type != \"}\") ||\n          state.prevToken == \"variable\" && firstChar == \".\" ||\n          (state.prevToken == \"}\" || state.prevToken == \")\") && firstChar == \".\")\n          return indentUnit * 2 + ctx.indented;\n        if (ctx.align && ctx.type == \"}\")\n          return ctx.indented + (state.context.type == (textAfter || \"\").charAt(0) ? 0 : indentUnit);\n      }\n    },\n    modeProps: {closeBrackets: {triples: '\"'}}\n  });\n\n  def([\"x-shader/x-vertex\", \"x-shader/x-fragment\"], {\n    name: \"clike\",\n    keywords: words(\"sampler1D sampler2D sampler3D samplerCube \" +\n                    \"sampler1DShadow sampler2DShadow \" +\n                    \"const attribute uniform varying \" +\n                    \"break continue discard return \" +\n                    \"for while do if else struct \" +\n                    \"in out inout\"),\n    types: words(\"float int bool void \" +\n                 \"vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 \" +\n                 \"mat2 mat3 mat4\"),\n    blockKeywords: words(\"for while do if else struct\"),\n    builtin: words(\"radians degrees sin cos tan asin acos atan \" +\n                    \"pow exp log exp2 sqrt inversesqrt \" +\n                    \"abs sign floor ceil fract mod min max clamp mix step smoothstep \" +\n                    \"length distance dot cross normalize ftransform faceforward \" +\n                    \"reflect refract matrixCompMult \" +\n                    \"lessThan lessThanEqual greaterThan greaterThanEqual \" +\n                    \"equal notEqual any all not \" +\n                    \"texture1D texture1DProj texture1DLod texture1DProjLod \" +\n                    \"texture2D texture2DProj texture2DLod texture2DProjLod \" +\n                    \"texture3D texture3DProj texture3DLod texture3DProjLod \" +\n                    \"textureCube textureCubeLod \" +\n                    \"shadow1D shadow2D shadow1DProj shadow2DProj \" +\n                    \"shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod \" +\n                    \"dFdx dFdy fwidth \" +\n                    \"noise1 noise2 noise3 noise4\"),\n    atoms: words(\"true false \" +\n                \"gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex \" +\n                \"gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 \" +\n                \"gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 \" +\n                \"gl_FogCoord gl_PointCoord \" +\n                \"gl_Position gl_PointSize gl_ClipVertex \" +\n                \"gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor \" +\n                \"gl_TexCoord gl_FogFragCoord \" +\n                \"gl_FragCoord gl_FrontFacing \" +\n                \"gl_FragData gl_FragDepth \" +\n                \"gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix \" +\n                \"gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse \" +\n                \"gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse \" +\n                \"gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose \" +\n                \"gl_ProjectionMatrixInverseTranspose \" +\n                \"gl_ModelViewProjectionMatrixInverseTranspose \" +\n                \"gl_TextureMatrixInverseTranspose \" +\n                \"gl_NormalScale gl_DepthRange gl_ClipPlane \" +\n                \"gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel \" +\n                \"gl_FrontLightModelProduct gl_BackLightModelProduct \" +\n                \"gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ \" +\n                \"gl_FogParameters \" +\n                \"gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords \" +\n                \"gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats \" +\n                \"gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits \" +\n                \"gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits \" +\n                \"gl_MaxDrawBuffers\"),\n    indentSwitch: false,\n    hooks: {\"#\": cppHook},\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-nesc\", {\n    name: \"clike\",\n    keywords: words(cKeywords + \" as atomic async call command component components configuration event generic \" +\n                    \"implementation includes interface module new norace nx_struct nx_union post provides \" +\n                    \"signal task uses abstract extends\"),\n    types: cTypes,\n    blockKeywords: words(cBlockKeywords),\n    atoms: words(\"null true false\"),\n    hooks: {\"#\": cppHook},\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-objectivec\", {\n    name: \"clike\",\n    keywords: words(cKeywords + \" \" + objCKeywords),\n    types: objCTypes,\n    builtin: words(objCBuiltins),\n    blockKeywords: words(cBlockKeywords + \" @synthesize @try @catch @finally @autoreleasepool @synchronized\"),\n    defKeywords: words(cDefKeywords + \" @interface @implementation @protocol @class\"),\n    dontIndentStatements: /^@.*$/,\n    typeFirstDefinitions: true,\n    atoms: words(\"YES NO NULL Nil nil true false nullptr\"),\n    isReservedIdentifier: cIsReservedIdentifier,\n    hooks: {\n      \"#\": cppHook,\n      \"*\": pointerHook,\n    },\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-objectivec++\", {\n    name: \"clike\",\n    keywords: words(cKeywords + \" \" + objCKeywords + \" \" + cppKeywords),\n    types: objCTypes,\n    builtin: words(objCBuiltins),\n    blockKeywords: words(cBlockKeywords + \" @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch\"),\n    defKeywords: words(cDefKeywords + \" @interface @implementation @protocol @class class namespace\"),\n    dontIndentStatements: /^@.*$|^template$/,\n    typeFirstDefinitions: true,\n    atoms: words(\"YES NO NULL Nil nil true false nullptr\"),\n    isReservedIdentifier: cIsReservedIdentifier,\n    hooks: {\n      \"#\": cppHook,\n      \"*\": pointerHook,\n      \"u\": cpp11StringHook,\n      \"U\": cpp11StringHook,\n      \"L\": cpp11StringHook,\n      \"R\": cpp11StringHook,\n      \"0\": cpp14Literal,\n      \"1\": cpp14Literal,\n      \"2\": cpp14Literal,\n      \"3\": cpp14Literal,\n      \"4\": cpp14Literal,\n      \"5\": cpp14Literal,\n      \"6\": cpp14Literal,\n      \"7\": cpp14Literal,\n      \"8\": cpp14Literal,\n      \"9\": cpp14Literal,\n      token: function(stream, state, style) {\n        if (style == \"variable\" && stream.peek() == \"(\" &&\n            (state.prevToken == \";\" || state.prevToken == null ||\n             state.prevToken == \"}\") &&\n            cppLooksLikeConstructor(stream.current()))\n          return \"def\";\n      }\n    },\n    namespaceSeparator: \"::\",\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-squirrel\", {\n    name: \"clike\",\n    keywords: words(\"base break clone continue const default delete enum extends function in class\" +\n                    \" foreach local resume return this throw typeof yield constructor instanceof static\"),\n    types: cTypes,\n    blockKeywords: words(\"case catch class else for foreach if switch try while\"),\n    defKeywords: words(\"function local class\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null\"),\n    hooks: {\"#\": cppHook},\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  // Ceylon Strings need to deal with interpolation\n  var stringTokenizer = null;\n  function tokenCeylonString(type) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while (!stream.eol()) {\n        if (!escaped && stream.match('\"') &&\n              (type == \"single\" || stream.match('\"\"'))) {\n          end = true;\n          break;\n        }\n        if (!escaped && stream.match('``')) {\n          stringTokenizer = tokenCeylonString(type);\n          end = true;\n          break;\n        }\n        next = stream.next();\n        escaped = type == \"single\" && !escaped && next == \"\\\\\";\n      }\n      if (end)\n          state.tokenize = null;\n      return \"string\";\n    }\n  }\n\n  def(\"text/x-ceylon\", {\n    name: \"clike\",\n    keywords: words(\"abstracts alias assembly assert assign break case catch class continue dynamic else\" +\n                    \" exists extends finally for function given if import in interface is let module new\" +\n                    \" nonempty object of out outer package return satisfies super switch then this throw\" +\n                    \" try value void while\"),\n    types: function(word) {\n        // In Ceylon all identifiers that start with an uppercase are types\n        var first = word.charAt(0);\n        return (first === first.toUpperCase() && first !== first.toLowerCase());\n    },\n    blockKeywords: words(\"case catch class dynamic else finally for function if interface module new object switch try while\"),\n    defKeywords: words(\"class dynamic function interface module object package value\"),\n    builtin: words(\"abstract actual aliased annotation by default deprecated doc final formal late license\" +\n                   \" native optional sealed see serializable shared suppressWarnings tagged throws variable\"),\n    isPunctuationChar: /[\\[\\]{}\\(\\),;\\:\\.`]/,\n    isOperatorChar: /[+\\-*&%=<>!?|^~:\\/]/,\n    numberStart: /[\\d#$]/,\n    number: /^(?:#[\\da-fA-F_]+|\\$[01_]+|[\\d_]+[kMGTPmunpf]?|[\\d_]+\\.[\\d_]+(?:[eE][-+]?\\d+|[kMGTPmunpf]|)|)/i,\n    multiLineStrings: true,\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null larger smaller equal empty finished\"),\n    indentSwitch: false,\n    styleDefs: false,\n    hooks: {\n      \"@\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      },\n      '\"': function(stream, state) {\n          state.tokenize = tokenCeylonString(stream.match('\"\"') ? \"triple\" : \"single\");\n          return state.tokenize(stream, state);\n        },\n      '`': function(stream, state) {\n          if (!stringTokenizer || !stream.match('`')) return false;\n          state.tokenize = stringTokenizer;\n          stringTokenizer = null;\n          return state.tokenize(stream, state);\n        },\n      \"'\": function(stream) {\n        stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n        return \"atom\";\n      },\n      token: function(_stream, state, style) {\n          if ((style == \"variable\" || style == \"type\") &&\n              state.prevToken == \".\") {\n            return \"variable-2\";\n          }\n        }\n    },\n    modeProps: {\n        fold: [\"brace\", \"import\"],\n        closeBrackets: {triples: '\"'}\n    }\n  });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/clojure/clojure.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports === \"object\" && typeof module === \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define === \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"clojure\", function (options) {\n  var atoms = [\"false\", \"nil\", \"true\"];\n  var specialForms = [\".\", \"catch\", \"def\", \"do\", \"if\", \"monitor-enter\",\n      \"monitor-exit\", \"new\", \"quote\", \"recur\", \"set!\", \"throw\", \"try\", \"var\"];\n  var coreSymbols = [\"*\", \"*'\", \"*1\", \"*2\", \"*3\", \"*agent*\",\n      \"*allow-unresolved-vars*\", \"*assert*\", \"*clojure-version*\",\n      \"*command-line-args*\", \"*compile-files*\", \"*compile-path*\",\n      \"*compiler-options*\", \"*data-readers*\", \"*default-data-reader-fn*\", \"*e\",\n      \"*err*\", \"*file*\", \"*flush-on-newline*\", \"*fn-loader*\", \"*in*\",\n      \"*math-context*\", \"*ns*\", \"*out*\", \"*print-dup*\", \"*print-length*\",\n      \"*print-level*\", \"*print-meta*\", \"*print-namespace-maps*\",\n      \"*print-readably*\", \"*read-eval*\", \"*reader-resolver*\", \"*source-path*\",\n      \"*suppress-read*\", \"*unchecked-math*\", \"*use-context-classloader*\",\n      \"*verbose-defrecords*\", \"*warn-on-reflection*\", \"+\", \"+'\", \"-\", \"-'\",\n      \"->\", \"->>\", \"->ArrayChunk\", \"->Eduction\", \"->Vec\", \"->VecNode\",\n      \"->VecSeq\", \"-cache-protocol-fn\", \"-reset-methods\", \"..\", \"/\", \"<\", \"<=\",\n      \"=\", \"==\", \">\", \">=\", \"EMPTY-NODE\", \"Inst\", \"StackTraceElement->vec\",\n      \"Throwable->map\", \"accessor\", \"aclone\", \"add-classpath\", \"add-watch\",\n      \"agent\", \"agent-error\", \"agent-errors\", \"aget\", \"alength\", \"alias\",\n      \"all-ns\", \"alter\", \"alter-meta!\", \"alter-var-root\", \"amap\", \"ancestors\",\n      \"and\", \"any?\", \"apply\", \"areduce\", \"array-map\", \"as->\", \"aset\",\n      \"aset-boolean\", \"aset-byte\", \"aset-char\", \"aset-double\", \"aset-float\",\n      \"aset-int\", \"aset-long\", \"aset-short\", \"assert\", \"assoc\", \"assoc!\",\n      \"assoc-in\", \"associative?\", \"atom\", \"await\", \"await-for\", \"await1\",\n      \"bases\", \"bean\", \"bigdec\", \"bigint\", \"biginteger\", \"binding\", \"bit-and\",\n      \"bit-and-not\", \"bit-clear\", \"bit-flip\", \"bit-not\", \"bit-or\", \"bit-set\",\n      \"bit-shift-left\", \"bit-shift-right\", \"bit-test\", \"bit-xor\", \"boolean\",\n      \"boolean-array\", \"boolean?\", \"booleans\", \"bound-fn\", \"bound-fn*\",\n      \"bound?\", \"bounded-count\", \"butlast\", \"byte\", \"byte-array\", \"bytes\",\n      \"bytes?\", \"case\", \"cast\", \"cat\", \"char\", \"char-array\",\n      \"char-escape-string\", \"char-name-string\", \"char?\", \"chars\", \"chunk\",\n      \"chunk-append\", \"chunk-buffer\", \"chunk-cons\", \"chunk-first\", \"chunk-next\",\n      \"chunk-rest\", \"chunked-seq?\", \"class\", \"class?\", \"clear-agent-errors\",\n      \"clojure-version\", \"coll?\", \"comment\", \"commute\", \"comp\", \"comparator\",\n      \"compare\", \"compare-and-set!\", \"compile\", \"complement\", \"completing\",\n      \"concat\", \"cond\", \"cond->\", \"cond->>\", \"condp\", \"conj\", \"conj!\", \"cons\",\n      \"constantly\", \"construct-proxy\", \"contains?\", \"count\", \"counted?\",\n      \"create-ns\", \"create-struct\", \"cycle\", \"dec\", \"dec'\", \"decimal?\",\n      \"declare\", \"dedupe\", \"default-data-readers\", \"definline\", \"definterface\",\n      \"defmacro\", \"defmethod\", \"defmulti\", \"defn\", \"defn-\", \"defonce\",\n      \"defprotocol\", \"defrecord\", \"defstruct\", \"deftype\", \"delay\", \"delay?\",\n      \"deliver\", \"denominator\", \"deref\", \"derive\", \"descendants\", \"destructure\",\n      \"disj\", \"disj!\", \"dissoc\", \"dissoc!\", \"distinct\", \"distinct?\", \"doall\",\n      \"dorun\", \"doseq\", \"dosync\", \"dotimes\", \"doto\", \"double\", \"double-array\",\n      \"double?\", \"doubles\", \"drop\", \"drop-last\", \"drop-while\", \"eduction\",\n      \"empty\", \"empty?\", \"ensure\", \"ensure-reduced\", \"enumeration-seq\",\n      \"error-handler\", \"error-mode\", \"eval\", \"even?\", \"every-pred\", \"every?\",\n      \"ex-data\", \"ex-info\", \"extend\", \"extend-protocol\", \"extend-type\",\n      \"extenders\", \"extends?\", \"false?\", \"ffirst\", \"file-seq\", \"filter\",\n      \"filterv\", \"find\", \"find-keyword\", \"find-ns\", \"find-protocol-impl\",\n      \"find-protocol-method\", \"find-var\", \"first\", \"flatten\", \"float\",\n      \"float-array\", \"float?\", \"floats\", \"flush\", \"fn\", \"fn?\", \"fnext\", \"fnil\",\n      \"for\", \"force\", \"format\", \"frequencies\", \"future\", \"future-call\",\n      \"future-cancel\", \"future-cancelled?\", \"future-done?\", \"future?\",\n      \"gen-class\", \"gen-interface\", \"gensym\", \"get\", \"get-in\", \"get-method\",\n      \"get-proxy-class\", \"get-thread-bindings\", \"get-validator\", \"group-by\",\n      \"halt-when\", \"hash\", \"hash-combine\", \"hash-map\", \"hash-ordered-coll\",\n      \"hash-set\", \"hash-unordered-coll\", \"ident?\", \"identical?\", \"identity\",\n      \"if-let\", \"if-not\", \"if-some\", \"ifn?\", \"import\", \"in-ns\", \"inc\", \"inc'\",\n      \"indexed?\", \"init-proxy\", \"inst-ms\", \"inst-ms*\", \"inst?\", \"instance?\",\n      \"int\", \"int-array\", \"int?\", \"integer?\", \"interleave\", \"intern\",\n      \"interpose\", \"into\", \"into-array\", \"ints\", \"io!\", \"isa?\", \"iterate\",\n      \"iterator-seq\", \"juxt\", \"keep\", \"keep-indexed\", \"key\", \"keys\", \"keyword\",\n      \"keyword?\", \"last\", \"lazy-cat\", \"lazy-seq\", \"let\", \"letfn\", \"line-seq\",\n      \"list\", \"list*\", \"list?\", \"load\", \"load-file\", \"load-reader\",\n      \"load-string\", \"loaded-libs\", \"locking\", \"long\", \"long-array\", \"longs\",\n      \"loop\", \"macroexpand\", \"macroexpand-1\", \"make-array\", \"make-hierarchy\",\n      \"map\", \"map-entry?\", \"map-indexed\", \"map?\", \"mapcat\", \"mapv\", \"max\",\n      \"max-key\", \"memfn\", \"memoize\", \"merge\", \"merge-with\", \"meta\",\n      \"method-sig\", \"methods\", \"min\", \"min-key\", \"mix-collection-hash\", \"mod\",\n      \"munge\", \"name\", \"namespace\", \"namespace-munge\", \"nat-int?\", \"neg-int?\",\n      \"neg?\", \"newline\", \"next\", \"nfirst\", \"nil?\", \"nnext\", \"not\", \"not-any?\",\n      \"not-empty\", \"not-every?\", \"not=\", \"ns\", \"ns-aliases\", \"ns-imports\",\n      \"ns-interns\", \"ns-map\", \"ns-name\", \"ns-publics\", \"ns-refers\",\n      \"ns-resolve\", \"ns-unalias\", \"ns-unmap\", \"nth\", \"nthnext\", \"nthrest\",\n      \"num\", \"number?\", \"numerator\", \"object-array\", \"odd?\", \"or\", \"parents\",\n      \"partial\", \"partition\", \"partition-all\", \"partition-by\", \"pcalls\", \"peek\",\n      \"persistent!\", \"pmap\", \"pop\", \"pop!\", \"pop-thread-bindings\", \"pos-int?\",\n      \"pos?\", \"pr\", \"pr-str\", \"prefer-method\", \"prefers\",\n      \"primitives-classnames\", \"print\", \"print-ctor\", \"print-dup\",\n      \"print-method\", \"print-simple\", \"print-str\", \"printf\", \"println\",\n      \"println-str\", \"prn\", \"prn-str\", \"promise\", \"proxy\",\n      \"proxy-call-with-super\", \"proxy-mappings\", \"proxy-name\", \"proxy-super\",\n      \"push-thread-bindings\", \"pvalues\", \"qualified-ident?\",\n      \"qualified-keyword?\", \"qualified-symbol?\", \"quot\", \"rand\", \"rand-int\",\n      \"rand-nth\", \"random-sample\", \"range\", \"ratio?\", \"rational?\",\n      \"rationalize\", \"re-find\", \"re-groups\", \"re-matcher\", \"re-matches\",\n      \"re-pattern\", \"re-seq\", \"read\", \"read-line\", \"read-string\",\n      \"reader-conditional\", \"reader-conditional?\", \"realized?\", \"record?\",\n      \"reduce\", \"reduce-kv\", \"reduced\", \"reduced?\", \"reductions\", \"ref\",\n      \"ref-history-count\", \"ref-max-history\", \"ref-min-history\", \"ref-set\",\n      \"refer\", \"refer-clojure\", \"reify\", \"release-pending-sends\", \"rem\",\n      \"remove\", \"remove-all-methods\", \"remove-method\", \"remove-ns\",\n      \"remove-watch\", \"repeat\", \"repeatedly\", \"replace\", \"replicate\", \"require\",\n      \"reset!\", \"reset-meta!\", \"reset-vals!\", \"resolve\", \"rest\",\n      \"restart-agent\", \"resultset-seq\", \"reverse\", \"reversible?\", \"rseq\",\n      \"rsubseq\", \"run!\", \"satisfies?\", \"second\", \"select-keys\", \"send\",\n      \"send-off\", \"send-via\", \"seq\", \"seq?\", \"seqable?\", \"seque\", \"sequence\",\n      \"sequential?\", \"set\", \"set-agent-send-executor!\",\n      \"set-agent-send-off-executor!\", \"set-error-handler!\", \"set-error-mode!\",\n      \"set-validator!\", \"set?\", \"short\", \"short-array\", \"shorts\", \"shuffle\",\n      \"shutdown-agents\", \"simple-ident?\", \"simple-keyword?\", \"simple-symbol?\",\n      \"slurp\", \"some\", \"some->\", \"some->>\", \"some-fn\", \"some?\", \"sort\",\n      \"sort-by\", \"sorted-map\", \"sorted-map-by\", \"sorted-set\", \"sorted-set-by\",\n      \"sorted?\", \"special-symbol?\", \"spit\", \"split-at\", \"split-with\", \"str\",\n      \"string?\", \"struct\", \"struct-map\", \"subs\", \"subseq\", \"subvec\", \"supers\",\n      \"swap!\", \"swap-vals!\", \"symbol\", \"symbol?\", \"sync\", \"tagged-literal\",\n      \"tagged-literal?\", \"take\", \"take-last\", \"take-nth\", \"take-while\", \"test\",\n      \"the-ns\", \"thread-bound?\", \"time\", \"to-array\", \"to-array-2d\",\n      \"trampoline\", \"transduce\", \"transient\", \"tree-seq\", \"true?\", \"type\",\n      \"unchecked-add\", \"unchecked-add-int\", \"unchecked-byte\", \"unchecked-char\",\n      \"unchecked-dec\", \"unchecked-dec-int\", \"unchecked-divide-int\",\n      \"unchecked-double\", \"unchecked-float\", \"unchecked-inc\",\n      \"unchecked-inc-int\", \"unchecked-int\", \"unchecked-long\",\n      \"unchecked-multiply\", \"unchecked-multiply-int\", \"unchecked-negate\",\n      \"unchecked-negate-int\", \"unchecked-remainder-int\", \"unchecked-short\",\n      \"unchecked-subtract\", \"unchecked-subtract-int\", \"underive\", \"unquote\",\n      \"unquote-splicing\", \"unreduced\", \"unsigned-bit-shift-right\", \"update\",\n      \"update-in\", \"update-proxy\", \"uri?\", \"use\", \"uuid?\", \"val\", \"vals\",\n      \"var-get\", \"var-set\", \"var?\", \"vary-meta\", \"vec\", \"vector\", \"vector-of\",\n      \"vector?\", \"volatile!\", \"volatile?\", \"vreset!\", \"vswap!\", \"when\",\n      \"when-first\", \"when-let\", \"when-not\", \"when-some\", \"while\",\n      \"with-bindings\", \"with-bindings*\", \"with-in-str\", \"with-loading-context\",\n      \"with-local-vars\", \"with-meta\", \"with-open\", \"with-out-str\",\n      \"with-precision\", \"with-redefs\", \"with-redefs-fn\", \"xml-seq\", \"zero?\",\n      \"zipmap\"];\n  var haveBodyParameter = [\n      \"->\", \"->>\", \"as->\", \"binding\", \"bound-fn\", \"case\", \"catch\", \"comment\",\n      \"cond\", \"cond->\", \"cond->>\", \"condp\", \"def\", \"definterface\", \"defmethod\",\n      \"defn\", \"defmacro\", \"defprotocol\", \"defrecord\", \"defstruct\", \"deftype\",\n      \"do\", \"doseq\", \"dotimes\", \"doto\", \"extend\", \"extend-protocol\",\n      \"extend-type\", \"fn\", \"for\", \"future\", \"if\", \"if-let\", \"if-not\", \"if-some\",\n      \"let\", \"letfn\", \"locking\", \"loop\", \"ns\", \"proxy\", \"reify\", \"struct-map\",\n      \"some->\", \"some->>\", \"try\", \"when\", \"when-first\", \"when-let\", \"when-not\",\n      \"when-some\", \"while\", \"with-bindings\", \"with-bindings*\", \"with-in-str\",\n      \"with-loading-context\", \"with-local-vars\", \"with-meta\", \"with-open\",\n      \"with-out-str\", \"with-precision\", \"with-redefs\", \"with-redefs-fn\"];\n\n  CodeMirror.registerHelper(\"hintWords\", \"clojure\",\n    [].concat(atoms, specialForms, coreSymbols));\n\n  var atom = createLookupMap(atoms);\n  var specialForm = createLookupMap(specialForms);\n  var coreSymbol = createLookupMap(coreSymbols);\n  var hasBodyParameter = createLookupMap(haveBodyParameter);\n  var delimiter = /^(?:[\\\\\\[\\]\\s\"(),;@^`{}~]|$)/;\n  var numberLiteral = /^(?:[+\\-]?\\d+(?:(?:N|(?:[eE][+\\-]?\\d+))|(?:\\.?\\d*(?:M|(?:[eE][+\\-]?\\d+))?)|\\/\\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\\\\[\\]\\s\"#'(),;@^`{}~]|$))/;\n  var characterLiteral = /^(?:\\\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\\\\[\\]\\s\"(),;@^`{}~]|$))/;\n\n  // simple-namespace := /^[^\\\\\\/\\[\\]\\d\\s\"#'(),;@^`{}~.][^\\\\\\[\\]\\s\"(),;@^`{}~.\\/]*/\n  // simple-symbol    := /^(?:\\/|[^\\\\\\/\\[\\]\\d\\s\"#'(),;@^`{}~][^\\\\\\[\\]\\s\"(),;@^`{}~]*)/\n  // qualified-symbol := (<simple-namespace>(<.><simple-namespace>)*</>)?<simple-symbol>\n  var qualifiedSymbol = /^(?:(?:[^\\\\\\/\\[\\]\\d\\s\"#'(),;@^`{}~.][^\\\\\\[\\]\\s\"(),;@^`{}~.\\/]*(?:\\.[^\\\\\\/\\[\\]\\d\\s\"#'(),;@^`{}~.][^\\\\\\[\\]\\s\"(),;@^`{}~.\\/]*)*\\/)?(?:\\/|[^\\\\\\/\\[\\]\\d\\s\"#'(),;@^`{}~][^\\\\\\[\\]\\s\"(),;@^`{}~]*)*(?=[\\\\\\[\\]\\s\"(),;@^`{}~]|$))/;\n\n  function base(stream, state) {\n    if (stream.eatSpace() || stream.eat(\",\")) return [\"space\", null];\n    if (stream.match(numberLiteral)) return [null, \"number\"];\n    if (stream.match(characterLiteral)) return [null, \"string-2\"];\n    if (stream.eat(/^\"/)) return (state.tokenize = inString)(stream, state);\n    if (stream.eat(/^[(\\[{]/)) return [\"open\", \"bracket\"];\n    if (stream.eat(/^[)\\]}]/)) return [\"close\", \"bracket\"];\n    if (stream.eat(/^;/)) {stream.skipToEnd(); return [\"space\", \"comment\"];}\n    if (stream.eat(/^[#'@^`~]/)) return [null, \"meta\"];\n\n    var matches = stream.match(qualifiedSymbol);\n    var symbol = matches && matches[0];\n\n    if (!symbol) {\n      // advance stream by at least one character so we don't get stuck.\n      stream.next();\n      stream.eatWhile(function (c) {return !is(c, delimiter);});\n      return [null, \"error\"];\n    }\n\n    if (symbol === \"comment\" && state.lastToken === \"(\")\n      return (state.tokenize = inComment)(stream, state);\n    if (is(symbol, atom) || symbol.charAt(0) === \":\") return [\"symbol\", \"atom\"];\n    if (is(symbol, specialForm) || is(symbol, coreSymbol)) return [\"symbol\", \"keyword\"];\n    if (state.lastToken === \"(\") return [\"symbol\", \"builtin\"]; // other operator\n\n    return [\"symbol\", \"variable\"];\n  }\n\n  function inString(stream, state) {\n    var escaped = false, next;\n\n    while (next = stream.next()) {\n      if (next === \"\\\"\" && !escaped) {state.tokenize = base; break;}\n      escaped = !escaped && next === \"\\\\\";\n    }\n\n    return [null, \"string\"];\n  }\n\n  function inComment(stream, state) {\n    var parenthesisCount = 1;\n    var next;\n\n    while (next = stream.next()) {\n      if (next === \")\") parenthesisCount--;\n      if (next === \"(\") parenthesisCount++;\n      if (parenthesisCount === 0) {\n        stream.backUp(1);\n        state.tokenize = base;\n        break;\n      }\n    }\n\n    return [\"space\", \"comment\"];\n  }\n\n  function createLookupMap(words) {\n    var obj = {};\n\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n\n    return obj;\n  }\n\n  function is(value, test) {\n    if (test instanceof RegExp) return test.test(value);\n    if (test instanceof Object) return test.propertyIsEnumerable(value);\n  }\n\n  return {\n    startState: function () {\n      return {\n        ctx: {prev: null, start: 0, indentTo: 0},\n        lastToken: null,\n        tokenize: base\n      };\n    },\n\n    token: function (stream, state) {\n      if (stream.sol() && (typeof state.ctx.indentTo !== \"number\"))\n        state.ctx.indentTo = state.ctx.start + 1;\n\n      var typeStylePair = state.tokenize(stream, state);\n      var type = typeStylePair[0];\n      var style = typeStylePair[1];\n      var current = stream.current();\n\n      if (type !== \"space\") {\n        if (state.lastToken === \"(\" && state.ctx.indentTo === null) {\n          if (type === \"symbol\" && is(current, hasBodyParameter))\n            state.ctx.indentTo = state.ctx.start + options.indentUnit;\n          else state.ctx.indentTo = \"next\";\n        } else if (state.ctx.indentTo === \"next\") {\n          state.ctx.indentTo = stream.column();\n        }\n\n        state.lastToken = current;\n      }\n\n      if (type === \"open\")\n        state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null};\n      else if (type === \"close\") state.ctx = state.ctx.prev || state.ctx;\n\n      return style;\n    },\n\n    indent: function (state) {\n      var i = state.ctx.indentTo;\n\n      return (typeof i === \"number\") ?\n        i :\n        state.ctx.start + 1;\n    },\n\n    closeBrackets: {pairs: \"()[]{}\\\"\\\"\"},\n    lineComment: \";;\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-clojure\", \"clojure\");\nCodeMirror.defineMIME(\"text/x-clojurescript\", \"clojure\");\nCodeMirror.defineMIME(\"application/edn\", \"clojure\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/cmake/cmake.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\")\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd)\n    define([\"../../lib/codemirror\"], mod);\n  else\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"cmake\", function () {\n  var variable_regex = /({)?[a-zA-Z0-9_]+(})?/;\n\n  function tokenString(stream, state) {\n    var current, prev, found_var = false;\n    while (!stream.eol() && (current = stream.next()) != state.pending) {\n      if (current === '$' && prev != '\\\\' && state.pending == '\"') {\n        found_var = true;\n        break;\n      }\n      prev = current;\n    }\n    if (found_var) {\n      stream.backUp(1);\n    }\n    if (current == state.pending) {\n      state.continueString = false;\n    } else {\n      state.continueString = true;\n    }\n    return \"string\";\n  }\n\n  function tokenize(stream, state) {\n    var ch = stream.next();\n\n    // Have we found a variable?\n    if (ch === '$') {\n      if (stream.match(variable_regex)) {\n        return 'variable-2';\n      }\n      return 'variable';\n    }\n    // Should we still be looking for the end of a string?\n    if (state.continueString) {\n      // If so, go through the loop again\n      stream.backUp(1);\n      return tokenString(stream, state);\n    }\n    // Do we just have a function on our hands?\n    // In 'cmake_minimum_required (VERSION 2.8.8)', 'cmake_minimum_required' is matched\n    if (stream.match(/(\\s+)?\\w+\\(/) || stream.match(/(\\s+)?\\w+\\ \\(/)) {\n      stream.backUp(1);\n      return 'def';\n    }\n    if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    // Have we found a string?\n    if (ch == \"'\" || ch == '\"') {\n      // Store the type (single or double)\n      state.pending = ch;\n      // Perform the looping function to find the end\n      return tokenString(stream, state);\n    }\n    if (ch == '(' || ch == ')') {\n      return 'bracket';\n    }\n    if (ch.match(/[0-9]/)) {\n      return 'number';\n    }\n    stream.eatWhile(/[\\w-]/);\n    return null;\n  }\n  return {\n    startState: function () {\n      var state = {};\n      state.inDefinition = false;\n      state.inInclude = false;\n      state.continueString = false;\n      state.pending = false;\n      return state;\n    },\n    token: function (stream, state) {\n      if (stream.eatSpace()) return null;\n      return tokenize(stream, state);\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-cmake\", \"cmake\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/cobol/cobol.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Author: Gautam Mehta\n * Branched from CodeMirror's Scheme mode\n */\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"cobol\", function () {\n  var BUILTIN = \"builtin\", COMMENT = \"comment\", STRING = \"string\",\n      ATOM = \"atom\", NUMBER = \"number\", KEYWORD = \"keyword\", MODTAG = \"header\",\n      COBOLLINENUM = \"def\", PERIOD = \"link\";\n  function makeKeywords(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  var atoms = makeKeywords(\"TRUE FALSE ZEROES ZEROS ZERO SPACES SPACE LOW-VALUE LOW-VALUES \");\n  var keywords = makeKeywords(\n      \"ACCEPT ACCESS ACQUIRE ADD ADDRESS \" +\n      \"ADVANCING AFTER ALIAS ALL ALPHABET \" +\n      \"ALPHABETIC ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED \" +\n      \"ALSO ALTER ALTERNATE AND ANY \" +\n      \"ARE AREA AREAS ARITHMETIC ASCENDING \" +\n      \"ASSIGN AT ATTRIBUTE AUTHOR AUTO \" +\n      \"AUTO-SKIP AUTOMATIC B-AND B-EXOR B-LESS \" +\n      \"B-NOT B-OR BACKGROUND-COLOR BACKGROUND-COLOUR BEEP \" +\n      \"BEFORE BELL BINARY BIT BITS \" +\n      \"BLANK BLINK BLOCK BOOLEAN BOTTOM \" +\n      \"BY CALL CANCEL CD CF \" +\n      \"CH CHARACTER CHARACTERS CLASS CLOCK-UNITS \" +\n      \"CLOSE COBOL CODE CODE-SET COL \" +\n      \"COLLATING COLUMN COMMA COMMIT COMMITMENT \" +\n      \"COMMON COMMUNICATION COMP COMP-0 COMP-1 \" +\n      \"COMP-2 COMP-3 COMP-4 COMP-5 COMP-6 \" +\n      \"COMP-7 COMP-8 COMP-9 COMPUTATIONAL COMPUTATIONAL-0 \" +\n      \"COMPUTATIONAL-1 COMPUTATIONAL-2 COMPUTATIONAL-3 COMPUTATIONAL-4 COMPUTATIONAL-5 \" +\n      \"COMPUTATIONAL-6 COMPUTATIONAL-7 COMPUTATIONAL-8 COMPUTATIONAL-9 COMPUTE \" +\n      \"CONFIGURATION CONNECT CONSOLE CONTAINED CONTAINS \" +\n      \"CONTENT CONTINUE CONTROL CONTROL-AREA CONTROLS \" +\n      \"CONVERTING COPY CORR CORRESPONDING COUNT \" +\n      \"CRT CRT-UNDER CURRENCY CURRENT CURSOR \" +\n      \"DATA DATE DATE-COMPILED DATE-WRITTEN DAY \" +\n      \"DAY-OF-WEEK DB DB-ACCESS-CONTROL-KEY DB-DATA-NAME DB-EXCEPTION \" +\n      \"DB-FORMAT-NAME DB-RECORD-NAME DB-SET-NAME DB-STATUS DBCS \" +\n      \"DBCS-EDITED DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE \" +\n      \"DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING \" +\n      \"DECIMAL-POINT DECLARATIVES DEFAULT DELETE DELIMITED \" +\n      \"DELIMITER DEPENDING DESCENDING DESCRIBED DESTINATION \" +\n      \"DETAIL DISABLE DISCONNECT DISPLAY DISPLAY-1 \" +\n      \"DISPLAY-2 DISPLAY-3 DISPLAY-4 DISPLAY-5 DISPLAY-6 \" +\n      \"DISPLAY-7 DISPLAY-8 DISPLAY-9 DIVIDE DIVISION \" +\n      \"DOWN DROP DUPLICATE DUPLICATES DYNAMIC \" +\n      \"EBCDIC EGI EJECT ELSE EMI \" +\n      \"EMPTY EMPTY-CHECK ENABLE END END. END-ACCEPT END-ACCEPT. \" +\n      \"END-ADD END-CALL END-COMPUTE END-DELETE END-DISPLAY \" +\n      \"END-DIVIDE END-EVALUATE END-IF END-INVOKE END-MULTIPLY \" +\n      \"END-OF-PAGE END-PERFORM END-READ END-RECEIVE END-RETURN \" +\n      \"END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT \" +\n      \"END-UNSTRING END-WRITE END-XML ENTER ENTRY \" +\n      \"ENVIRONMENT EOP EQUAL EQUALS ERASE \" +\n      \"ERROR ESI EVALUATE EVERY EXCEEDS \" +\n      \"EXCEPTION EXCLUSIVE EXIT EXTEND EXTERNAL \" +\n      \"EXTERNALLY-DESCRIBED-KEY FD FETCH FILE FILE-CONTROL \" +\n      \"FILE-STREAM FILES FILLER FINAL FIND \" +\n      \"FINISH FIRST FOOTING FOR FOREGROUND-COLOR \" +\n      \"FOREGROUND-COLOUR FORMAT FREE FROM FULL \" +\n      \"FUNCTION GENERATE GET GIVING GLOBAL \" +\n      \"GO GOBACK GREATER GROUP HEADING \" +\n      \"HIGH-VALUE HIGH-VALUES HIGHLIGHT I-O I-O-CONTROL \" +\n      \"ID IDENTIFICATION IF IN INDEX \" +\n      \"INDEX-1 INDEX-2 INDEX-3 INDEX-4 INDEX-5 \" +\n      \"INDEX-6 INDEX-7 INDEX-8 INDEX-9 INDEXED \" +\n      \"INDIC INDICATE INDICATOR INDICATORS INITIAL \" +\n      \"INITIALIZE INITIATE INPUT INPUT-OUTPUT INSPECT \" +\n      \"INSTALLATION INTO INVALID INVOKE IS \" +\n      \"JUST JUSTIFIED KANJI KEEP KEY \" +\n      \"LABEL LAST LD LEADING LEFT \" +\n      \"LEFT-JUSTIFY LENGTH LENGTH-CHECK LESS LIBRARY \" +\n      \"LIKE LIMIT LIMITS LINAGE LINAGE-COUNTER \" +\n      \"LINE LINE-COUNTER LINES LINKAGE LOCAL-STORAGE \" +\n      \"LOCALE LOCALLY LOCK \" +\n      \"MEMBER MEMORY MERGE MESSAGE METACLASS \" +\n      \"MODE MODIFIED MODIFY MODULES MOVE \" +\n      \"MULTIPLE MULTIPLY NATIONAL NATIVE NEGATIVE \" +\n      \"NEXT NO NO-ECHO NONE NOT \" +\n      \"NULL NULL-KEY-MAP NULL-MAP NULLS NUMBER \" +\n      \"NUMERIC NUMERIC-EDITED OBJECT OBJECT-COMPUTER OCCURS \" +\n      \"OF OFF OMITTED ON ONLY \" +\n      \"OPEN OPTIONAL OR ORDER ORGANIZATION \" +\n      \"OTHER OUTPUT OVERFLOW OWNER PACKED-DECIMAL \" +\n      \"PADDING PAGE PAGE-COUNTER PARSE PERFORM \" +\n      \"PF PH PIC PICTURE PLUS \" +\n      \"POINTER POSITION POSITIVE PREFIX PRESENT \" +\n      \"PRINTING PRIOR PROCEDURE PROCEDURE-POINTER PROCEDURES \" +\n      \"PROCEED PROCESS PROCESSING PROGRAM PROGRAM-ID \" +\n      \"PROMPT PROTECTED PURGE QUEUE QUOTE \" +\n      \"QUOTES RANDOM RD READ READY \" +\n      \"REALM RECEIVE RECONNECT RECORD RECORD-NAME \" +\n      \"RECORDS RECURSIVE REDEFINES REEL REFERENCE \" +\n      \"REFERENCE-MONITOR REFERENCES RELATION RELATIVE RELEASE \" +\n      \"REMAINDER REMOVAL RENAMES REPEATED REPLACE \" +\n      \"REPLACING REPORT REPORTING REPORTS REPOSITORY \" +\n      \"REQUIRED RERUN RESERVE RESET RETAINING \" +\n      \"RETRIEVAL RETURN RETURN-CODE RETURNING REVERSE-VIDEO \" +\n      \"REVERSED REWIND REWRITE RF RH \" +\n      \"RIGHT RIGHT-JUSTIFY ROLLBACK ROLLING ROUNDED \" +\n      \"RUN SAME SCREEN SD SEARCH \" +\n      \"SECTION SECURE SECURITY SEGMENT SEGMENT-LIMIT \" +\n      \"SELECT SEND SENTENCE SEPARATE SEQUENCE \" +\n      \"SEQUENTIAL SET SHARED SIGN SIZE \" +\n      \"SKIP1 SKIP2 SKIP3 SORT SORT-MERGE \" +\n      \"SORT-RETURN SOURCE SOURCE-COMPUTER SPACE-FILL \" +\n      \"SPECIAL-NAMES STANDARD STANDARD-1 STANDARD-2 \" +\n      \"START STARTING STATUS STOP STORE \" +\n      \"STRING SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUB-SCHEMA \" +\n      \"SUBFILE SUBSTITUTE SUBTRACT SUM SUPPRESS \" +\n      \"SYMBOLIC SYNC SYNCHRONIZED SYSIN SYSOUT \" +\n      \"TABLE TALLYING TAPE TENANT TERMINAL \" +\n      \"TERMINATE TEST TEXT THAN THEN \" +\n      \"THROUGH THRU TIME TIMES TITLE \" +\n      \"TO TOP TRAILING TRAILING-SIGN TRANSACTION \" +\n      \"TYPE TYPEDEF UNDERLINE UNEQUAL UNIT \" +\n      \"UNSTRING UNTIL UP UPDATE UPON \" +\n      \"USAGE USAGE-MODE USE USING VALID \" +\n      \"VALIDATE VALUE VALUES VARYING VLR \" +\n      \"WAIT WHEN WHEN-COMPILED WITH WITHIN \" +\n      \"WORDS WORKING-STORAGE WRITE XML XML-CODE \" +\n      \"XML-EVENT XML-NTEXT XML-TEXT ZERO ZERO-FILL \" );\n\n  var builtins = makeKeywords(\"- * ** / + < <= = > >= \");\n  var tests = {\n    digit: /\\d/,\n    digit_or_colon: /[\\d:]/,\n    hex: /[0-9a-f]/i,\n    sign: /[+-]/,\n    exponent: /e/i,\n    keyword_char: /[^\\s\\(\\[\\;\\)\\]]/,\n    symbol: /[\\w*+\\-]/\n  };\n  function isNumber(ch, stream){\n    // hex\n    if ( ch === '0' && stream.eat(/x/i) ) {\n      stream.eatWhile(tests.hex);\n      return true;\n    }\n    // leading sign\n    if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) {\n      stream.eat(tests.sign);\n      ch = stream.next();\n    }\n    if ( tests.digit.test(ch) ) {\n      stream.eat(ch);\n      stream.eatWhile(tests.digit);\n      if ( '.' == stream.peek()) {\n        stream.eat('.');\n        stream.eatWhile(tests.digit);\n      }\n      if ( stream.eat(tests.exponent) ) {\n        stream.eat(tests.sign);\n        stream.eatWhile(tests.digit);\n      }\n      return true;\n    }\n    return false;\n  }\n  return {\n    startState: function () {\n      return {\n        indentStack: null,\n        indentation: 0,\n        mode: false\n      };\n    },\n    token: function (stream, state) {\n      if (state.indentStack == null && stream.sol()) {\n        // update indentation, but only if indentStack is empty\n        state.indentation = 6 ; //stream.indentation();\n      }\n      // skip spaces\n      if (stream.eatSpace()) {\n        return null;\n      }\n      var returnType = null;\n      switch(state.mode){\n      case \"string\": // multi-line string parsing mode\n        var next = false;\n        while ((next = stream.next()) != null) {\n          if ((next == \"\\\"\" || next == \"\\'\") && !stream.match(/['\"]/, false)) {\n            state.mode = false;\n            break;\n          }\n        }\n        returnType = STRING; // continue on in string mode\n        break;\n      default: // default parsing mode\n        var ch = stream.next();\n        var col = stream.column();\n        if (col >= 0 && col <= 5) {\n          returnType = COBOLLINENUM;\n        } else if (col >= 72 && col <= 79) {\n          stream.skipToEnd();\n          returnType = MODTAG;\n        } else if (ch == \"*\" && col == 6) { // comment\n          stream.skipToEnd(); // rest of the line is a comment\n          returnType = COMMENT;\n        } else if (ch == \"\\\"\" || ch == \"\\'\") {\n          state.mode = \"string\";\n          returnType = STRING;\n        } else if (ch == \"'\" && !( tests.digit_or_colon.test(stream.peek()) )) {\n          returnType = ATOM;\n        } else if (ch == \".\") {\n          returnType = PERIOD;\n        } else if (isNumber(ch,stream)){\n          returnType = NUMBER;\n        } else {\n          if (stream.current().match(tests.symbol)) {\n            while (col < 71) {\n              if (stream.eat(tests.symbol) === undefined) {\n                break;\n              } else {\n                col++;\n              }\n            }\n          }\n          if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) {\n            returnType = KEYWORD;\n          } else if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) {\n            returnType = BUILTIN;\n          } else if (atoms && atoms.propertyIsEnumerable(stream.current().toUpperCase())) {\n            returnType = ATOM;\n          } else returnType = null;\n        }\n      }\n      return returnType;\n    },\n    indent: function (state) {\n      if (state.indentStack == null) return state.indentation;\n      return state.indentStack.indent;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-cobol\", \"cobol\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/coffeescript/coffeescript.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Link to the project's GitHub page:\n * https://github.com/pickhardt/coffeescript-codemirror-mode\n */\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"coffeescript\", function(conf, parserConf) {\n  var ERRORCLASS = \"error\";\n\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  var operators = /^(?:->|=>|\\+[+=]?|-[\\-=]?|\\*[\\*=]?|\\/[\\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\\|=?|\\^=?|\\~|!|\\?|(or|and|\\|\\||&&|\\?)=)/;\n  var delimiters = /^(?:[()\\[\\]{},:`=;]|\\.\\.?\\.?)/;\n  var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/;\n  var atProp = /^@[_A-Za-z$][_A-Za-z$0-9]*/;\n\n  var wordOperators = wordRegexp([\"and\", \"or\", \"not\",\n                                  \"is\", \"isnt\", \"in\",\n                                  \"instanceof\", \"typeof\"]);\n  var indentKeywords = [\"for\", \"while\", \"loop\", \"if\", \"unless\", \"else\",\n                        \"switch\", \"try\", \"catch\", \"finally\", \"class\"];\n  var commonKeywords = [\"break\", \"by\", \"continue\", \"debugger\", \"delete\",\n                        \"do\", \"in\", \"of\", \"new\", \"return\", \"then\",\n                        \"this\", \"@\", \"throw\", \"when\", \"until\", \"extends\"];\n\n  var keywords = wordRegexp(indentKeywords.concat(commonKeywords));\n\n  indentKeywords = wordRegexp(indentKeywords);\n\n\n  var stringPrefixes = /^('{3}|\\\"{3}|['\\\"])/;\n  var regexPrefixes = /^(\\/{3}|\\/)/;\n  var commonConstants = [\"Infinity\", \"NaN\", \"undefined\", \"null\", \"true\", \"false\", \"on\", \"off\", \"yes\", \"no\"];\n  var constants = wordRegexp(commonConstants);\n\n  // Tokenizers\n  function tokenBase(stream, state) {\n    // Handle scope changes\n    if (stream.sol()) {\n      if (state.scope.align === null) state.scope.align = false;\n      var scopeOffset = state.scope.offset;\n      if (stream.eatSpace()) {\n        var lineOffset = stream.indentation();\n        if (lineOffset > scopeOffset && state.scope.type == \"coffee\") {\n          return \"indent\";\n        } else if (lineOffset < scopeOffset) {\n          return \"dedent\";\n        }\n        return null;\n      } else {\n        if (scopeOffset > 0) {\n          dedent(stream, state);\n        }\n      }\n    }\n    if (stream.eatSpace()) {\n      return null;\n    }\n\n    var ch = stream.peek();\n\n    // Handle docco title comment (single line)\n    if (stream.match(\"####\")) {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n\n    // Handle multi line comments\n    if (stream.match(\"###\")) {\n      state.tokenize = longComment;\n      return state.tokenize(stream, state);\n    }\n\n    // Single line comment\n    if (ch === \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n\n    // Handle number literals\n    if (stream.match(/^-?[0-9\\.]/, false)) {\n      var floatLiteral = false;\n      // Floats\n      if (stream.match(/^-?\\d*\\.\\d+(e[\\+\\-]?\\d+)?/i)) {\n        floatLiteral = true;\n      }\n      if (stream.match(/^-?\\d+\\.\\d*/)) {\n        floatLiteral = true;\n      }\n      if (stream.match(/^-?\\.\\d+/)) {\n        floatLiteral = true;\n      }\n\n      if (floatLiteral) {\n        // prevent from getting extra . on 1..\n        if (stream.peek() == \".\"){\n          stream.backUp(1);\n        }\n        return \"number\";\n      }\n      // Integers\n      var intLiteral = false;\n      // Hex\n      if (stream.match(/^-?0x[0-9a-f]+/i)) {\n        intLiteral = true;\n      }\n      // Decimal\n      if (stream.match(/^-?[1-9]\\d*(e[\\+\\-]?\\d+)?/)) {\n        intLiteral = true;\n      }\n      // Zero by itself with no other piece of number.\n      if (stream.match(/^-?0(?![\\dx])/i)) {\n        intLiteral = true;\n      }\n      if (intLiteral) {\n        return \"number\";\n      }\n    }\n\n    // Handle strings\n    if (stream.match(stringPrefixes)) {\n      state.tokenize = tokenFactory(stream.current(), false, \"string\");\n      return state.tokenize(stream, state);\n    }\n    // Handle regex literals\n    if (stream.match(regexPrefixes)) {\n      if (stream.current() != \"/\" || stream.match(/^.*\\//, false)) { // prevent highlight of division\n        state.tokenize = tokenFactory(stream.current(), true, \"string-2\");\n        return state.tokenize(stream, state);\n      } else {\n        stream.backUp(1);\n      }\n    }\n\n\n\n    // Handle operators and delimiters\n    if (stream.match(operators) || stream.match(wordOperators)) {\n      return \"operator\";\n    }\n    if (stream.match(delimiters)) {\n      return \"punctuation\";\n    }\n\n    if (stream.match(constants)) {\n      return \"atom\";\n    }\n\n    if (stream.match(atProp) || state.prop && stream.match(identifiers)) {\n      return \"property\";\n    }\n\n    if (stream.match(keywords)) {\n      return \"keyword\";\n    }\n\n    if (stream.match(identifiers)) {\n      return \"variable\";\n    }\n\n    // Handle non-detected items\n    stream.next();\n    return ERRORCLASS;\n  }\n\n  function tokenFactory(delimiter, singleline, outclass) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        stream.eatWhile(/[^'\"\\/\\\\]/);\n        if (stream.eat(\"\\\\\")) {\n          stream.next();\n          if (singleline && stream.eol()) {\n            return outclass;\n          }\n        } else if (stream.match(delimiter)) {\n          state.tokenize = tokenBase;\n          return outclass;\n        } else {\n          stream.eat(/['\"\\/]/);\n        }\n      }\n      if (singleline) {\n        if (parserConf.singleLineStringErrors) {\n          outclass = ERRORCLASS;\n        } else {\n          state.tokenize = tokenBase;\n        }\n      }\n      return outclass;\n    };\n  }\n\n  function longComment(stream, state) {\n    while (!stream.eol()) {\n      stream.eatWhile(/[^#]/);\n      if (stream.match(\"###\")) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      stream.eatWhile(\"#\");\n    }\n    return \"comment\";\n  }\n\n  function indent(stream, state, type) {\n    type = type || \"coffee\";\n    var offset = 0, align = false, alignOffset = null;\n    for (var scope = state.scope; scope; scope = scope.prev) {\n      if (scope.type === \"coffee\" || scope.type == \"}\") {\n        offset = scope.offset + conf.indentUnit;\n        break;\n      }\n    }\n    if (type !== \"coffee\") {\n      align = null;\n      alignOffset = stream.column() + stream.current().length;\n    } else if (state.scope.align) {\n      state.scope.align = false;\n    }\n    state.scope = {\n      offset: offset,\n      type: type,\n      prev: state.scope,\n      align: align,\n      alignOffset: alignOffset\n    };\n  }\n\n  function dedent(stream, state) {\n    if (!state.scope.prev) return;\n    if (state.scope.type === \"coffee\") {\n      var _indent = stream.indentation();\n      var matched = false;\n      for (var scope = state.scope; scope; scope = scope.prev) {\n        if (_indent === scope.offset) {\n          matched = true;\n          break;\n        }\n      }\n      if (!matched) {\n        return true;\n      }\n      while (state.scope.prev && state.scope.offset !== _indent) {\n        state.scope = state.scope.prev;\n      }\n      return false;\n    } else {\n      state.scope = state.scope.prev;\n      return false;\n    }\n  }\n\n  function tokenLexer(stream, state) {\n    var style = state.tokenize(stream, state);\n    var current = stream.current();\n\n    // Handle scope changes.\n    if (current === \"return\") {\n      state.dedent = true;\n    }\n    if (((current === \"->\" || current === \"=>\") && stream.eol())\n        || style === \"indent\") {\n      indent(stream, state);\n    }\n    var delimiter_index = \"[({\".indexOf(current);\n    if (delimiter_index !== -1) {\n      indent(stream, state, \"])}\".slice(delimiter_index, delimiter_index+1));\n    }\n    if (indentKeywords.exec(current)){\n      indent(stream, state);\n    }\n    if (current == \"then\"){\n      dedent(stream, state);\n    }\n\n\n    if (style === \"dedent\") {\n      if (dedent(stream, state)) {\n        return ERRORCLASS;\n      }\n    }\n    delimiter_index = \"])}\".indexOf(current);\n    if (delimiter_index !== -1) {\n      while (state.scope.type == \"coffee\" && state.scope.prev)\n        state.scope = state.scope.prev;\n      if (state.scope.type == current)\n        state.scope = state.scope.prev;\n    }\n    if (state.dedent && stream.eol()) {\n      if (state.scope.type == \"coffee\" && state.scope.prev)\n        state.scope = state.scope.prev;\n      state.dedent = false;\n    }\n\n    return style;\n  }\n\n  var external = {\n    startState: function(basecolumn) {\n      return {\n        tokenize: tokenBase,\n        scope: {offset:basecolumn || 0, type:\"coffee\", prev: null, align: false},\n        prop: false,\n        dedent: 0\n      };\n    },\n\n    token: function(stream, state) {\n      var fillAlign = state.scope.align === null && state.scope;\n      if (fillAlign && stream.sol()) fillAlign.align = false;\n\n      var style = tokenLexer(stream, state);\n      if (style && style != \"comment\") {\n        if (fillAlign) fillAlign.align = true;\n        state.prop = style == \"punctuation\" && stream.current() == \".\"\n      }\n\n      return style;\n    },\n\n    indent: function(state, text) {\n      if (state.tokenize != tokenBase) return 0;\n      var scope = state.scope;\n      var closer = text && \"])}\".indexOf(text.charAt(0)) > -1;\n      if (closer) while (scope.type == \"coffee\" && scope.prev) scope = scope.prev;\n      var closes = closer && scope.type === text.charAt(0);\n      if (scope.align)\n        return scope.alignOffset - (closes ? 1 : 0);\n      else\n        return (closes ? scope.prev : scope).offset;\n    },\n\n    lineComment: \"#\",\n    fold: \"indent\"\n  };\n  return external;\n});\n\n// IANA registered media type\n// https://www.iana.org/assignments/media-types/\nCodeMirror.defineMIME(\"application/vnd.coffeescript\", \"coffeescript\");\n\nCodeMirror.defineMIME(\"text/x-coffeescript\", \"coffeescript\");\nCodeMirror.defineMIME(\"text/coffeescript\", \"coffeescript\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/commonlisp/commonlisp.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"commonlisp\", function (config) {\n  var specialForm = /^(block|let*|return-from|catch|load-time-value|setq|eval-when|locally|symbol-macrolet|flet|macrolet|tagbody|function|multiple-value-call|the|go|multiple-value-prog1|throw|if|progn|unwind-protect|labels|progv|let|quote)$/;\n  var assumeBody = /^with|^def|^do|^prog|case$|^cond$|bind$|when$|unless$/;\n  var numLiteral = /^(?:[+\\-]?(?:\\d+|\\d*\\.\\d+)(?:[efd][+\\-]?\\d+)?|[+\\-]?\\d+(?:\\/[+\\-]?\\d+)?|#b[+\\-]?[01]+|#o[+\\-]?[0-7]+|#x[+\\-]?[\\da-f]+)/;\n  var symbol = /[^\\s'`,@()\\[\\]\";]/;\n  var type;\n\n  function readSym(stream) {\n    var ch;\n    while (ch = stream.next()) {\n      if (ch == \"\\\\\") stream.next();\n      else if (!symbol.test(ch)) { stream.backUp(1); break; }\n    }\n    return stream.current();\n  }\n\n  function base(stream, state) {\n    if (stream.eatSpace()) {type = \"ws\"; return null;}\n    if (stream.match(numLiteral)) return \"number\";\n    var ch = stream.next();\n    if (ch == \"\\\\\") ch = stream.next();\n\n    if (ch == '\"') return (state.tokenize = inString)(stream, state);\n    else if (ch == \"(\") { type = \"open\"; return \"bracket\"; }\n    else if (ch == \")\" || ch == \"]\") { type = \"close\"; return \"bracket\"; }\n    else if (ch == \";\") { stream.skipToEnd(); type = \"ws\"; return \"comment\"; }\n    else if (/['`,@]/.test(ch)) return null;\n    else if (ch == \"|\") {\n      if (stream.skipTo(\"|\")) { stream.next(); return \"symbol\"; }\n      else { stream.skipToEnd(); return \"error\"; }\n    } else if (ch == \"#\") {\n      var ch = stream.next();\n      if (ch == \"(\") { type = \"open\"; return \"bracket\"; }\n      else if (/[+\\-=\\.']/.test(ch)) return null;\n      else if (/\\d/.test(ch) && stream.match(/^\\d*#/)) return null;\n      else if (ch == \"|\") return (state.tokenize = inComment)(stream, state);\n      else if (ch == \":\") { readSym(stream); return \"meta\"; }\n      else if (ch == \"\\\\\") { stream.next(); readSym(stream); return \"string-2\" }\n      else return \"error\";\n    } else {\n      var name = readSym(stream);\n      if (name == \".\") return null;\n      type = \"symbol\";\n      if (name == \"nil\" || name == \"t\" || name.charAt(0) == \":\") return \"atom\";\n      if (state.lastType == \"open\" && (specialForm.test(name) || assumeBody.test(name))) return \"keyword\";\n      if (name.charAt(0) == \"&\") return \"variable-2\";\n      return \"variable\";\n    }\n  }\n\n  function inString(stream, state) {\n    var escaped = false, next;\n    while (next = stream.next()) {\n      if (next == '\"' && !escaped) { state.tokenize = base; break; }\n      escaped = !escaped && next == \"\\\\\";\n    }\n    return \"string\";\n  }\n\n  function inComment(stream, state) {\n    var next, last;\n    while (next = stream.next()) {\n      if (next == \"#\" && last == \"|\") { state.tokenize = base; break; }\n      last = next;\n    }\n    type = \"ws\";\n    return \"comment\";\n  }\n\n  return {\n    startState: function () {\n      return {ctx: {prev: null, start: 0, indentTo: 0}, lastType: null, tokenize: base};\n    },\n\n    token: function (stream, state) {\n      if (stream.sol() && typeof state.ctx.indentTo != \"number\")\n        state.ctx.indentTo = state.ctx.start + 1;\n\n      type = null;\n      var style = state.tokenize(stream, state);\n      if (type != \"ws\") {\n        if (state.ctx.indentTo == null) {\n          if (type == \"symbol\" && assumeBody.test(stream.current()))\n            state.ctx.indentTo = state.ctx.start + config.indentUnit;\n          else\n            state.ctx.indentTo = \"next\";\n        } else if (state.ctx.indentTo == \"next\") {\n          state.ctx.indentTo = stream.column();\n        }\n        state.lastType = type;\n      }\n      if (type == \"open\") state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null};\n      else if (type == \"close\") state.ctx = state.ctx.prev || state.ctx;\n      return style;\n    },\n\n    indent: function (state, _textAfter) {\n      var i = state.ctx.indentTo;\n      return typeof i == \"number\" ? i : state.ctx.start + 1;\n    },\n\n    closeBrackets: {pairs: \"()[]{}\\\"\\\"\"},\n    lineComment: \";;\",\n    fold: \"brace-paren\",\n    blockCommentStart: \"#|\",\n    blockCommentEnd: \"|#\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-common-lisp\", \"commonlisp\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/crystal/crystal.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"crystal\", function(config) {\n    function wordRegExp(words, end) {\n      return new RegExp((end ? \"\" : \"^\") + \"(?:\" + words.join(\"|\") + \")\" + (end ? \"$\" : \"\\\\b\"));\n    }\n\n    function chain(tokenize, stream, state) {\n      state.tokenize.push(tokenize);\n      return tokenize(stream, state);\n    }\n\n    var operators = /^(?:[-+/%|&^]|\\*\\*?|[<>]{2})/;\n    var conditionalOperators = /^(?:[=!]~|===|<=>|[<>=!]=?|[|&]{2}|~)/;\n    var indexingOperators = /^(?:\\[\\][?=]?)/;\n    var anotherOperators = /^(?:\\.(?:\\.{2})?|->|[?:])/;\n    var idents = /^[a-z_\\u009F-\\uFFFF][a-zA-Z0-9_\\u009F-\\uFFFF]*/;\n    var types = /^[A-Z_\\u009F-\\uFFFF][a-zA-Z0-9_\\u009F-\\uFFFF]*/;\n    var keywords = wordRegExp([\n      \"abstract\", \"alias\", \"as\", \"asm\", \"begin\", \"break\", \"case\", \"class\", \"def\", \"do\",\n      \"else\", \"elsif\", \"end\", \"ensure\", \"enum\", \"extend\", \"for\", \"fun\", \"if\",\n      \"include\", \"instance_sizeof\", \"lib\", \"macro\", \"module\", \"next\", \"of\", \"out\", \"pointerof\",\n      \"private\", \"protected\", \"rescue\", \"return\", \"require\", \"select\", \"sizeof\", \"struct\",\n      \"super\", \"then\", \"type\", \"typeof\", \"uninitialized\", \"union\", \"unless\", \"until\", \"when\", \"while\", \"with\",\n      \"yield\", \"__DIR__\", \"__END_LINE__\", \"__FILE__\", \"__LINE__\"\n    ]);\n    var atomWords = wordRegExp([\"true\", \"false\", \"nil\", \"self\"]);\n    var indentKeywordsArray = [\n      \"def\", \"fun\", \"macro\",\n      \"class\", \"module\", \"struct\", \"lib\", \"enum\", \"union\",\n      \"do\", \"for\"\n    ];\n    var indentKeywords = wordRegExp(indentKeywordsArray);\n    var indentExpressionKeywordsArray = [\"if\", \"unless\", \"case\", \"while\", \"until\", \"begin\", \"then\"];\n    var indentExpressionKeywords = wordRegExp(indentExpressionKeywordsArray);\n    var dedentKeywordsArray = [\"end\", \"else\", \"elsif\", \"rescue\", \"ensure\"];\n    var dedentKeywords = wordRegExp(dedentKeywordsArray);\n    var dedentPunctualsArray = [\"\\\\)\", \"\\\\}\", \"\\\\]\"];\n    var dedentPunctuals = new RegExp(\"^(?:\" + dedentPunctualsArray.join(\"|\") + \")$\");\n    var nextTokenizer = {\n      \"def\": tokenFollowIdent, \"fun\": tokenFollowIdent, \"macro\": tokenMacroDef,\n      \"class\": tokenFollowType, \"module\": tokenFollowType, \"struct\": tokenFollowType,\n      \"lib\": tokenFollowType, \"enum\": tokenFollowType, \"union\": tokenFollowType\n    };\n    var matching = {\"[\": \"]\", \"{\": \"}\", \"(\": \")\", \"<\": \">\"};\n\n    function tokenBase(stream, state) {\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      // Macros\n      if (state.lastToken != \"\\\\\" && stream.match(\"{%\", false)) {\n        return chain(tokenMacro(\"%\", \"%\"), stream, state);\n      }\n\n      if (state.lastToken != \"\\\\\" && stream.match(\"{{\", false)) {\n        return chain(tokenMacro(\"{\", \"}\"), stream, state);\n      }\n\n      // Comments\n      if (stream.peek() == \"#\") {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n\n      // Variables and keywords\n      var matched;\n      if (stream.match(idents)) {\n        stream.eat(/[?!]/);\n\n        matched = stream.current();\n        if (stream.eat(\":\")) {\n          return \"atom\";\n        } else if (state.lastToken == \".\") {\n          return \"property\";\n        } else if (keywords.test(matched)) {\n          if (indentKeywords.test(matched)) {\n            if (!(matched == \"fun\" && state.blocks.indexOf(\"lib\") >= 0) && !(matched == \"def\" && state.lastToken == \"abstract\")) {\n              state.blocks.push(matched);\n              state.currentIndent += 1;\n            }\n          } else if ((state.lastStyle == \"operator\" || !state.lastStyle) && indentExpressionKeywords.test(matched)) {\n            state.blocks.push(matched);\n            state.currentIndent += 1;\n          } else if (matched == \"end\") {\n            state.blocks.pop();\n            state.currentIndent -= 1;\n          }\n\n          if (nextTokenizer.hasOwnProperty(matched)) {\n            state.tokenize.push(nextTokenizer[matched]);\n          }\n\n          return \"keyword\";\n        } else if (atomWords.test(matched)) {\n          return \"atom\";\n        }\n\n        return \"variable\";\n      }\n\n      // Class variables and instance variables\n      // or attributes\n      if (stream.eat(\"@\")) {\n        if (stream.peek() == \"[\") {\n          return chain(tokenNest(\"[\", \"]\", \"meta\"), stream, state);\n        }\n\n        stream.eat(\"@\");\n        stream.match(idents) || stream.match(types);\n        return \"variable-2\";\n      }\n\n      // Constants and types\n      if (stream.match(types)) {\n        return \"tag\";\n      }\n\n      // Symbols or ':' operator\n      if (stream.eat(\":\")) {\n        if (stream.eat(\"\\\"\")) {\n          return chain(tokenQuote(\"\\\"\", \"atom\", false), stream, state);\n        } else if (stream.match(idents) || stream.match(types) ||\n                   stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators)) {\n          return \"atom\";\n        }\n        stream.eat(\":\");\n        return \"operator\";\n      }\n\n      // Strings\n      if (stream.eat(\"\\\"\")) {\n        return chain(tokenQuote(\"\\\"\", \"string\", true), stream, state);\n      }\n\n      // Strings or regexps or macro variables or '%' operator\n      if (stream.peek() == \"%\") {\n        var style = \"string\";\n        var embed = true;\n        var delim;\n\n        if (stream.match(\"%r\")) {\n          // Regexps\n          style = \"string-2\";\n          delim = stream.next();\n        } else if (stream.match(\"%w\")) {\n          embed = false;\n          delim = stream.next();\n        } else if (stream.match(\"%q\")) {\n          embed = false;\n          delim = stream.next();\n        } else {\n          if(delim = stream.match(/^%([^\\w\\s=])/)) {\n            delim = delim[1];\n          } else if (stream.match(/^%[a-zA-Z_\\u009F-\\uFFFF][\\w\\u009F-\\uFFFF]*/)) {\n            // Macro variables\n            return \"meta\";\n          } else if (stream.eat('%')) {\n            // '%' operator\n            return \"operator\";\n          }\n        }\n\n        if (matching.hasOwnProperty(delim)) {\n          delim = matching[delim];\n        }\n        return chain(tokenQuote(delim, style, embed), stream, state);\n      }\n\n      // Here Docs\n      if (matched = stream.match(/^<<-('?)([A-Z]\\w*)\\1/)) {\n        return chain(tokenHereDoc(matched[2], !matched[1]), stream, state)\n      }\n\n      // Characters\n      if (stream.eat(\"'\")) {\n        stream.match(/^(?:[^']|\\\\(?:[befnrtv0'\"]|[0-7]{3}|u(?:[0-9a-fA-F]{4}|\\{[0-9a-fA-F]{1,6}\\})))/);\n        stream.eat(\"'\");\n        return \"atom\";\n      }\n\n      // Numbers\n      if (stream.eat(\"0\")) {\n        if (stream.eat(\"x\")) {\n          stream.match(/^[0-9a-fA-F_]+/);\n        } else if (stream.eat(\"o\")) {\n          stream.match(/^[0-7_]+/);\n        } else if (stream.eat(\"b\")) {\n          stream.match(/^[01_]+/);\n        }\n        return \"number\";\n      }\n\n      if (stream.eat(/^\\d/)) {\n        stream.match(/^[\\d_]*(?:\\.[\\d_]+)?(?:[eE][+-]?\\d+)?/);\n        return \"number\";\n      }\n\n      // Operators\n      if (stream.match(operators)) {\n        stream.eat(\"=\"); // Operators can follow assign symbol.\n        return \"operator\";\n      }\n\n      if (stream.match(conditionalOperators) || stream.match(anotherOperators)) {\n        return \"operator\";\n      }\n\n      // Parens and braces\n      if (matched = stream.match(/[({[]/, false)) {\n        matched = matched[0];\n        return chain(tokenNest(matched, matching[matched], null), stream, state);\n      }\n\n      // Escapes\n      if (stream.eat(\"\\\\\")) {\n        stream.next();\n        return \"meta\";\n      }\n\n      stream.next();\n      return null;\n    }\n\n    function tokenNest(begin, end, style, started) {\n      return function (stream, state) {\n        if (!started && stream.match(begin)) {\n          state.tokenize[state.tokenize.length - 1] = tokenNest(begin, end, style, true);\n          state.currentIndent += 1;\n          return style;\n        }\n\n        var nextStyle = tokenBase(stream, state);\n        if (stream.current() === end) {\n          state.tokenize.pop();\n          state.currentIndent -= 1;\n          nextStyle = style;\n        }\n\n        return nextStyle;\n      };\n    }\n\n    function tokenMacro(begin, end, started) {\n      return function (stream, state) {\n        if (!started && stream.match(\"{\" + begin)) {\n          state.currentIndent += 1;\n          state.tokenize[state.tokenize.length - 1] = tokenMacro(begin, end, true);\n          return \"meta\";\n        }\n\n        if (stream.match(end + \"}\")) {\n          state.currentIndent -= 1;\n          state.tokenize.pop();\n          return \"meta\";\n        }\n\n        return tokenBase(stream, state);\n      };\n    }\n\n    function tokenMacroDef(stream, state) {\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      var matched;\n      if (matched = stream.match(idents)) {\n        if (matched == \"def\") {\n          return \"keyword\";\n        }\n        stream.eat(/[?!]/);\n      }\n\n      state.tokenize.pop();\n      return \"def\";\n    }\n\n    function tokenFollowIdent(stream, state) {\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      if (stream.match(idents)) {\n        stream.eat(/[!?]/);\n      } else {\n        stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators);\n      }\n      state.tokenize.pop();\n      return \"def\";\n    }\n\n    function tokenFollowType(stream, state) {\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      stream.match(types);\n      state.tokenize.pop();\n      return \"def\";\n    }\n\n    function tokenQuote(end, style, embed) {\n      return function (stream, state) {\n        var escaped = false;\n\n        while (stream.peek()) {\n          if (!escaped) {\n            if (stream.match(\"{%\", false)) {\n              state.tokenize.push(tokenMacro(\"%\", \"%\"));\n              return style;\n            }\n\n            if (stream.match(\"{{\", false)) {\n              state.tokenize.push(tokenMacro(\"{\", \"}\"));\n              return style;\n            }\n\n            if (embed && stream.match(\"#{\", false)) {\n              state.tokenize.push(tokenNest(\"#{\", \"}\", \"meta\"));\n              return style;\n            }\n\n            var ch = stream.next();\n\n            if (ch == end) {\n              state.tokenize.pop();\n              return style;\n            }\n\n            escaped = embed && ch == \"\\\\\";\n          } else {\n            stream.next();\n            escaped = false;\n          }\n        }\n\n        return style;\n      };\n    }\n\n    function tokenHereDoc(phrase, embed) {\n      return function (stream, state) {\n        if (stream.sol()) {\n          stream.eatSpace()\n          if (stream.match(phrase)) {\n            state.tokenize.pop();\n            return \"string\";\n          }\n        }\n\n        var escaped = false;\n        while (stream.peek()) {\n          if (!escaped) {\n            if (stream.match(\"{%\", false)) {\n              state.tokenize.push(tokenMacro(\"%\", \"%\"));\n              return \"string\";\n            }\n\n            if (stream.match(\"{{\", false)) {\n              state.tokenize.push(tokenMacro(\"{\", \"}\"));\n              return \"string\";\n            }\n\n            if (embed && stream.match(\"#{\", false)) {\n              state.tokenize.push(tokenNest(\"#{\", \"}\", \"meta\"));\n              return \"string\";\n            }\n\n            escaped = embed && stream.next() == \"\\\\\";\n          } else {\n            stream.next();\n            escaped = false;\n          }\n        }\n\n        return \"string\";\n      }\n    }\n\n    return {\n      startState: function () {\n        return {\n          tokenize: [tokenBase],\n          currentIndent: 0,\n          lastToken: null,\n          lastStyle: null,\n          blocks: []\n        };\n      },\n\n      token: function (stream, state) {\n        var style = state.tokenize[state.tokenize.length - 1](stream, state);\n        var token = stream.current();\n\n        if (style && style != \"comment\") {\n          state.lastToken = token;\n          state.lastStyle = style;\n        }\n\n        return style;\n      },\n\n      indent: function (state, textAfter) {\n        textAfter = textAfter.replace(/^\\s*(?:\\{%)?\\s*|\\s*(?:%\\})?\\s*$/g, \"\");\n\n        if (dedentKeywords.test(textAfter) || dedentPunctuals.test(textAfter)) {\n          return config.indentUnit * (state.currentIndent - 1);\n        }\n\n        return config.indentUnit * state.currentIndent;\n      },\n\n      fold: \"indent\",\n      electricInput: wordRegExp(dedentPunctualsArray.concat(dedentKeywordsArray), true),\n      lineComment: '#'\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-crystal\", \"crystal\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/css/css.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"css\", function(config, parserConfig) {\n  var inline = parserConfig.inline\n  if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode(\"text/css\");\n\n  var indentUnit = config.indentUnit,\n      tokenHooks = parserConfig.tokenHooks,\n      documentTypes = parserConfig.documentTypes || {},\n      mediaTypes = parserConfig.mediaTypes || {},\n      mediaFeatures = parserConfig.mediaFeatures || {},\n      mediaValueKeywords = parserConfig.mediaValueKeywords || {},\n      propertyKeywords = parserConfig.propertyKeywords || {},\n      nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},\n      fontProperties = parserConfig.fontProperties || {},\n      counterDescriptors = parserConfig.counterDescriptors || {},\n      colorKeywords = parserConfig.colorKeywords || {},\n      valueKeywords = parserConfig.valueKeywords || {},\n      allowNested = parserConfig.allowNested,\n      lineComment = parserConfig.lineComment,\n      supportsAtComponent = parserConfig.supportsAtComponent === true,\n      highlightNonStandardPropertyKeywords = config.highlightNonStandardPropertyKeywords !== false;\n\n  var type, override;\n  function ret(style, tp) { type = tp; return style; }\n\n  // Tokenizers\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (tokenHooks[ch]) {\n      var result = tokenHooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n    if (ch == \"@\") {\n      stream.eatWhile(/[\\w\\\\\\-]/);\n      return ret(\"def\", stream.current());\n    } else if (ch == \"=\" || (ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) {\n      return ret(null, \"compare\");\n    } else if (ch == \"\\\"\" || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    } else if (ch == \"#\") {\n      stream.eatWhile(/[\\w\\\\\\-]/);\n      return ret(\"atom\", \"hash\");\n    } else if (ch == \"!\") {\n      stream.match(/^\\s*\\w*/);\n      return ret(\"keyword\", \"important\");\n    } else if (/\\d/.test(ch) || ch == \".\" && stream.eat(/\\d/)) {\n      stream.eatWhile(/[\\w.%]/);\n      return ret(\"number\", \"unit\");\n    } else if (ch === \"-\") {\n      if (/[\\d.]/.test(stream.peek())) {\n        stream.eatWhile(/[\\w.%]/);\n        return ret(\"number\", \"unit\");\n      } else if (stream.match(/^-[\\w\\\\\\-]*/)) {\n        stream.eatWhile(/[\\w\\\\\\-]/);\n        if (stream.match(/^\\s*:/, false))\n          return ret(\"variable-2\", \"variable-definition\");\n        return ret(\"variable-2\", \"variable\");\n      } else if (stream.match(/^\\w+-/)) {\n        return ret(\"meta\", \"meta\");\n      }\n    } else if (/[,+>*\\/]/.test(ch)) {\n      return ret(null, \"select-op\");\n    } else if (ch == \".\" && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {\n      return ret(\"qualifier\", \"qualifier\");\n    } else if (/[:;{}\\[\\]\\(\\)]/.test(ch)) {\n      return ret(null, ch);\n    } else if (stream.match(/^[\\w-.]+(?=\\()/)) {\n      if (/^(url(-prefix)?|domain|regexp)$/i.test(stream.current())) {\n        state.tokenize = tokenParenthesized;\n      }\n      return ret(\"variable callee\", \"variable\");\n    } else if (/[\\w\\\\\\-]/.test(ch)) {\n      stream.eatWhile(/[\\w\\\\\\-]/);\n      return ret(\"property\", \"word\");\n    } else {\n      return ret(null, null);\n    }\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) {\n          if (quote == \")\") stream.backUp(1);\n          break;\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      if (ch == quote || !escaped && quote != \")\") state.tokenize = null;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  function tokenParenthesized(stream, state) {\n    stream.next(); // Must be '('\n    if (!stream.match(/^\\s*[\\\"\\')]/, false))\n      state.tokenize = tokenString(\")\");\n    else\n      state.tokenize = null;\n    return ret(null, \"(\");\n  }\n\n  // Context management\n\n  function Context(type, indent, prev) {\n    this.type = type;\n    this.indent = indent;\n    this.prev = prev;\n  }\n\n  function pushContext(state, stream, type, indent) {\n    state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context);\n    return type;\n  }\n\n  function popContext(state) {\n    if (state.context.prev)\n      state.context = state.context.prev;\n    return state.context.type;\n  }\n\n  function pass(type, stream, state) {\n    return states[state.context.type](type, stream, state);\n  }\n  function popAndPass(type, stream, state, n) {\n    for (var i = n || 1; i > 0; i--)\n      state.context = state.context.prev;\n    return pass(type, stream, state);\n  }\n\n  // Parser\n\n  function wordAsValue(stream) {\n    var word = stream.current().toLowerCase();\n    if (valueKeywords.hasOwnProperty(word))\n      override = \"atom\";\n    else if (colorKeywords.hasOwnProperty(word))\n      override = \"keyword\";\n    else\n      override = \"variable\";\n  }\n\n  var states = {};\n\n  states.top = function(type, stream, state) {\n    if (type == \"{\") {\n      return pushContext(state, stream, \"block\");\n    } else if (type == \"}\" && state.context.prev) {\n      return popContext(state);\n    } else if (supportsAtComponent && /@component/i.test(type)) {\n      return pushContext(state, stream, \"atComponentBlock\");\n    } else if (/^@(-moz-)?document$/i.test(type)) {\n      return pushContext(state, stream, \"documentTypes\");\n    } else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type)) {\n      return pushContext(state, stream, \"atBlock\");\n    } else if (/^@(font-face|counter-style)/i.test(type)) {\n      state.stateArg = type;\n      return \"restricted_atBlock_before\";\n    } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type)) {\n      return \"keyframes\";\n    } else if (type && type.charAt(0) == \"@\") {\n      return pushContext(state, stream, \"at\");\n    } else if (type == \"hash\") {\n      override = \"builtin\";\n    } else if (type == \"word\") {\n      override = \"tag\";\n    } else if (type == \"variable-definition\") {\n      return \"maybeprop\";\n    } else if (type == \"interpolation\") {\n      return pushContext(state, stream, \"interpolation\");\n    } else if (type == \":\") {\n      return \"pseudo\";\n    } else if (allowNested && type == \"(\") {\n      return pushContext(state, stream, \"parens\");\n    }\n    return state.context.type;\n  };\n\n  states.block = function(type, stream, state) {\n    if (type == \"word\") {\n      var word = stream.current().toLowerCase();\n      if (propertyKeywords.hasOwnProperty(word)) {\n        override = \"property\";\n        return \"maybeprop\";\n      } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {\n        override = highlightNonStandardPropertyKeywords ? \"string-2\" : \"property\";\n        return \"maybeprop\";\n      } else if (allowNested) {\n        override = stream.match(/^\\s*:(?:\\s|$)/, false) ? \"property\" : \"tag\";\n        return \"block\";\n      } else {\n        override += \" error\";\n        return \"maybeprop\";\n      }\n    } else if (type == \"meta\") {\n      return \"block\";\n    } else if (!allowNested && (type == \"hash\" || type == \"qualifier\")) {\n      override = \"error\";\n      return \"block\";\n    } else {\n      return states.top(type, stream, state);\n    }\n  };\n\n  states.maybeprop = function(type, stream, state) {\n    if (type == \":\") return pushContext(state, stream, \"prop\");\n    return pass(type, stream, state);\n  };\n\n  states.prop = function(type, stream, state) {\n    if (type == \";\") return popContext(state);\n    if (type == \"{\" && allowNested) return pushContext(state, stream, \"propBlock\");\n    if (type == \"}\" || type == \"{\") return popAndPass(type, stream, state);\n    if (type == \"(\") return pushContext(state, stream, \"parens\");\n\n    if (type == \"hash\" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) {\n      override += \" error\";\n    } else if (type == \"word\") {\n      wordAsValue(stream);\n    } else if (type == \"interpolation\") {\n      return pushContext(state, stream, \"interpolation\");\n    }\n    return \"prop\";\n  };\n\n  states.propBlock = function(type, _stream, state) {\n    if (type == \"}\") return popContext(state);\n    if (type == \"word\") { override = \"property\"; return \"maybeprop\"; }\n    return state.context.type;\n  };\n\n  states.parens = function(type, stream, state) {\n    if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n    if (type == \")\") return popContext(state);\n    if (type == \"(\") return pushContext(state, stream, \"parens\");\n    if (type == \"interpolation\") return pushContext(state, stream, \"interpolation\");\n    if (type == \"word\") wordAsValue(stream);\n    return \"parens\";\n  };\n\n  states.pseudo = function(type, stream, state) {\n    if (type == \"meta\") return \"pseudo\";\n\n    if (type == \"word\") {\n      override = \"variable-3\";\n      return state.context.type;\n    }\n    return pass(type, stream, state);\n  };\n\n  states.documentTypes = function(type, stream, state) {\n    if (type == \"word\" && documentTypes.hasOwnProperty(stream.current())) {\n      override = \"tag\";\n      return state.context.type;\n    } else {\n      return states.atBlock(type, stream, state);\n    }\n  };\n\n  states.atBlock = function(type, stream, state) {\n    if (type == \"(\") return pushContext(state, stream, \"atBlock_parens\");\n    if (type == \"}\" || type == \";\") return popAndPass(type, stream, state);\n    if (type == \"{\") return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\");\n\n    if (type == \"interpolation\") return pushContext(state, stream, \"interpolation\");\n\n    if (type == \"word\") {\n      var word = stream.current().toLowerCase();\n      if (word == \"only\" || word == \"not\" || word == \"and\" || word == \"or\")\n        override = \"keyword\";\n      else if (mediaTypes.hasOwnProperty(word))\n        override = \"attribute\";\n      else if (mediaFeatures.hasOwnProperty(word))\n        override = \"property\";\n      else if (mediaValueKeywords.hasOwnProperty(word))\n        override = \"keyword\";\n      else if (propertyKeywords.hasOwnProperty(word))\n        override = \"property\";\n      else if (nonStandardPropertyKeywords.hasOwnProperty(word))\n        override = highlightNonStandardPropertyKeywords ? \"string-2\" : \"property\";\n      else if (valueKeywords.hasOwnProperty(word))\n        override = \"atom\";\n      else if (colorKeywords.hasOwnProperty(word))\n        override = \"keyword\";\n      else\n        override = \"error\";\n    }\n    return state.context.type;\n  };\n\n  states.atComponentBlock = function(type, stream, state) {\n    if (type == \"}\")\n      return popAndPass(type, stream, state);\n    if (type == \"{\")\n      return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\", false);\n    if (type == \"word\")\n      override = \"error\";\n    return state.context.type;\n  };\n\n  states.atBlock_parens = function(type, stream, state) {\n    if (type == \")\") return popContext(state);\n    if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state, 2);\n    return states.atBlock(type, stream, state);\n  };\n\n  states.restricted_atBlock_before = function(type, stream, state) {\n    if (type == \"{\")\n      return pushContext(state, stream, \"restricted_atBlock\");\n    if (type == \"word\" && state.stateArg == \"@counter-style\") {\n      override = \"variable\";\n      return \"restricted_atBlock_before\";\n    }\n    return pass(type, stream, state);\n  };\n\n  states.restricted_atBlock = function(type, stream, state) {\n    if (type == \"}\") {\n      state.stateArg = null;\n      return popContext(state);\n    }\n    if (type == \"word\") {\n      if ((state.stateArg == \"@font-face\" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) ||\n          (state.stateArg == \"@counter-style\" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase())))\n        override = \"error\";\n      else\n        override = \"property\";\n      return \"maybeprop\";\n    }\n    return \"restricted_atBlock\";\n  };\n\n  states.keyframes = function(type, stream, state) {\n    if (type == \"word\") { override = \"variable\"; return \"keyframes\"; }\n    if (type == \"{\") return pushContext(state, stream, \"top\");\n    return pass(type, stream, state);\n  };\n\n  states.at = function(type, stream, state) {\n    if (type == \";\") return popContext(state);\n    if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n    if (type == \"word\") override = \"tag\";\n    else if (type == \"hash\") override = \"builtin\";\n    return \"at\";\n  };\n\n  states.interpolation = function(type, stream, state) {\n    if (type == \"}\") return popContext(state);\n    if (type == \"{\" || type == \";\") return popAndPass(type, stream, state);\n    if (type == \"word\") override = \"variable\";\n    else if (type != \"variable\" && type != \"(\" && type != \")\") override = \"error\";\n    return \"interpolation\";\n  };\n\n  return {\n    startState: function(base) {\n      return {tokenize: null,\n              state: inline ? \"block\" : \"top\",\n              stateArg: null,\n              context: new Context(inline ? \"block\" : \"top\", base || 0, null)};\n    },\n\n    token: function(stream, state) {\n      if (!state.tokenize && stream.eatSpace()) return null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style && typeof style == \"object\") {\n        type = style[1];\n        style = style[0];\n      }\n      override = style;\n      if (type != \"comment\")\n        state.state = states[state.state](type, stream, state);\n      return override;\n    },\n\n    indent: function(state, textAfter) {\n      var cx = state.context, ch = textAfter && textAfter.charAt(0);\n      var indent = cx.indent;\n      if (cx.type == \"prop\" && (ch == \"}\" || ch == \")\")) cx = cx.prev;\n      if (cx.prev) {\n        if (ch == \"}\" && (cx.type == \"block\" || cx.type == \"top\" ||\n                          cx.type == \"interpolation\" || cx.type == \"restricted_atBlock\")) {\n          // Resume indentation from parent context.\n          cx = cx.prev;\n          indent = cx.indent;\n        } else if (ch == \")\" && (cx.type == \"parens\" || cx.type == \"atBlock_parens\") ||\n            ch == \"{\" && (cx.type == \"at\" || cx.type == \"atBlock\")) {\n          // Dedent relative to current context.\n          indent = Math.max(0, cx.indent - indentUnit);\n        }\n      }\n      return indent;\n    },\n\n    electricChars: \"}\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    blockCommentContinue: \" * \",\n    lineComment: lineComment,\n    fold: \"brace\"\n  };\n});\n\n  function keySet(array) {\n    var keys = {};\n    for (var i = 0; i < array.length; ++i) {\n      keys[array[i].toLowerCase()] = true;\n    }\n    return keys;\n  }\n\n  var documentTypes_ = [\n    \"domain\", \"regexp\", \"url\", \"url-prefix\"\n  ], documentTypes = keySet(documentTypes_);\n\n  var mediaTypes_ = [\n    \"all\", \"aural\", \"braille\", \"handheld\", \"print\", \"projection\", \"screen\",\n    \"tty\", \"tv\", \"embossed\"\n  ], mediaTypes = keySet(mediaTypes_);\n\n  var mediaFeatures_ = [\n    \"width\", \"min-width\", \"max-width\", \"height\", \"min-height\", \"max-height\",\n    \"device-width\", \"min-device-width\", \"max-device-width\", \"device-height\",\n    \"min-device-height\", \"max-device-height\", \"aspect-ratio\",\n    \"min-aspect-ratio\", \"max-aspect-ratio\", \"device-aspect-ratio\",\n    \"min-device-aspect-ratio\", \"max-device-aspect-ratio\", \"color\", \"min-color\",\n    \"max-color\", \"color-index\", \"min-color-index\", \"max-color-index\",\n    \"monochrome\", \"min-monochrome\", \"max-monochrome\", \"resolution\",\n    \"min-resolution\", \"max-resolution\", \"scan\", \"grid\", \"orientation\",\n    \"device-pixel-ratio\", \"min-device-pixel-ratio\", \"max-device-pixel-ratio\",\n    \"pointer\", \"any-pointer\", \"hover\", \"any-hover\", \"prefers-color-scheme\",\n    \"dynamic-range\", \"video-dynamic-range\"\n  ], mediaFeatures = keySet(mediaFeatures_);\n\n  var mediaValueKeywords_ = [\n    \"landscape\", \"portrait\", \"none\", \"coarse\", \"fine\", \"on-demand\", \"hover\",\n    \"interlace\", \"progressive\",\n    \"dark\", \"light\",\n    \"standard\", \"high\"\n  ], mediaValueKeywords = keySet(mediaValueKeywords_);\n\n  var propertyKeywords_ = [\n    \"align-content\", \"align-items\", \"align-self\", \"alignment-adjust\",\n    \"alignment-baseline\", \"all\", \"anchor-point\", \"animation\", \"animation-delay\",\n    \"animation-direction\", \"animation-duration\", \"animation-fill-mode\",\n    \"animation-iteration-count\", \"animation-name\", \"animation-play-state\",\n    \"animation-timing-function\", \"appearance\", \"azimuth\", \"backdrop-filter\",\n    \"backface-visibility\", \"background\", \"background-attachment\",\n    \"background-blend-mode\", \"background-clip\", \"background-color\",\n    \"background-image\", \"background-origin\", \"background-position\",\n    \"background-position-x\", \"background-position-y\", \"background-repeat\",\n    \"background-size\", \"baseline-shift\", \"binding\", \"bleed\", \"block-size\",\n    \"bookmark-label\", \"bookmark-level\", \"bookmark-state\", \"bookmark-target\",\n    \"border\", \"border-bottom\", \"border-bottom-color\", \"border-bottom-left-radius\",\n    \"border-bottom-right-radius\", \"border-bottom-style\", \"border-bottom-width\",\n    \"border-collapse\", \"border-color\", \"border-image\", \"border-image-outset\",\n    \"border-image-repeat\", \"border-image-slice\", \"border-image-source\",\n    \"border-image-width\", \"border-left\", \"border-left-color\", \"border-left-style\",\n    \"border-left-width\", \"border-radius\", \"border-right\", \"border-right-color\",\n    \"border-right-style\", \"border-right-width\", \"border-spacing\", \"border-style\",\n    \"border-top\", \"border-top-color\", \"border-top-left-radius\",\n    \"border-top-right-radius\", \"border-top-style\", \"border-top-width\",\n    \"border-width\", \"bottom\", \"box-decoration-break\", \"box-shadow\", \"box-sizing\",\n    \"break-after\", \"break-before\", \"break-inside\", \"caption-side\", \"caret-color\",\n    \"clear\", \"clip\", \"color\", \"color-profile\", \"column-count\", \"column-fill\",\n    \"column-gap\", \"column-rule\", \"column-rule-color\", \"column-rule-style\",\n    \"column-rule-width\", \"column-span\", \"column-width\", \"columns\", \"contain\",\n    \"content\", \"counter-increment\", \"counter-reset\", \"crop\", \"cue\", \"cue-after\",\n    \"cue-before\", \"cursor\", \"direction\", \"display\", \"dominant-baseline\",\n    \"drop-initial-after-adjust\", \"drop-initial-after-align\",\n    \"drop-initial-before-adjust\", \"drop-initial-before-align\", \"drop-initial-size\",\n    \"drop-initial-value\", \"elevation\", \"empty-cells\", \"fit\", \"fit-content\", \"fit-position\",\n    \"flex\", \"flex-basis\", \"flex-direction\", \"flex-flow\", \"flex-grow\",\n    \"flex-shrink\", \"flex-wrap\", \"float\", \"float-offset\", \"flow-from\", \"flow-into\",\n    \"font\", \"font-family\", \"font-feature-settings\", \"font-kerning\",\n    \"font-language-override\", \"font-optical-sizing\", \"font-size\",\n    \"font-size-adjust\", \"font-stretch\", \"font-style\", \"font-synthesis\",\n    \"font-variant\", \"font-variant-alternates\", \"font-variant-caps\",\n    \"font-variant-east-asian\", \"font-variant-ligatures\", \"font-variant-numeric\",\n    \"font-variant-position\", \"font-variation-settings\", \"font-weight\", \"gap\",\n    \"grid\", \"grid-area\", \"grid-auto-columns\", \"grid-auto-flow\", \"grid-auto-rows\",\n    \"grid-column\", \"grid-column-end\", \"grid-column-gap\", \"grid-column-start\",\n    \"grid-gap\", \"grid-row\", \"grid-row-end\", \"grid-row-gap\", \"grid-row-start\",\n    \"grid-template\", \"grid-template-areas\", \"grid-template-columns\",\n    \"grid-template-rows\", \"hanging-punctuation\", \"height\", \"hyphens\", \"icon\",\n    \"image-orientation\", \"image-rendering\", \"image-resolution\", \"inline-box-align\",\n    \"inset\", \"inset-block\", \"inset-block-end\", \"inset-block-start\", \"inset-inline\",\n    \"inset-inline-end\", \"inset-inline-start\", \"isolation\", \"justify-content\",\n    \"justify-items\", \"justify-self\", \"left\", \"letter-spacing\", \"line-break\",\n    \"line-height\", \"line-height-step\", \"line-stacking\", \"line-stacking-ruby\",\n    \"line-stacking-shift\", \"line-stacking-strategy\", \"list-style\",\n    \"list-style-image\", \"list-style-position\", \"list-style-type\", \"margin\",\n    \"margin-bottom\", \"margin-left\", \"margin-right\", \"margin-top\", \"marks\",\n    \"marquee-direction\", \"marquee-loop\", \"marquee-play-count\", \"marquee-speed\",\n    \"marquee-style\", \"mask-clip\", \"mask-composite\", \"mask-image\", \"mask-mode\",\n    \"mask-origin\", \"mask-position\", \"mask-repeat\", \"mask-size\",\"mask-type\",\n    \"max-block-size\", \"max-height\", \"max-inline-size\",\n    \"max-width\", \"min-block-size\", \"min-height\", \"min-inline-size\", \"min-width\",\n    \"mix-blend-mode\", \"move-to\", \"nav-down\", \"nav-index\", \"nav-left\", \"nav-right\",\n    \"nav-up\", \"object-fit\", \"object-position\", \"offset\", \"offset-anchor\",\n    \"offset-distance\", \"offset-path\", \"offset-position\", \"offset-rotate\",\n    \"opacity\", \"order\", \"orphans\", \"outline\", \"outline-color\", \"outline-offset\",\n    \"outline-style\", \"outline-width\", \"overflow\", \"overflow-style\",\n    \"overflow-wrap\", \"overflow-x\", \"overflow-y\", \"padding\", \"padding-bottom\",\n    \"padding-left\", \"padding-right\", \"padding-top\", \"page\", \"page-break-after\",\n    \"page-break-before\", \"page-break-inside\", \"page-policy\", \"pause\",\n    \"pause-after\", \"pause-before\", \"perspective\", \"perspective-origin\", \"pitch\",\n    \"pitch-range\", \"place-content\", \"place-items\", \"place-self\", \"play-during\",\n    \"position\", \"presentation-level\", \"punctuation-trim\", \"quotes\",\n    \"region-break-after\", \"region-break-before\", \"region-break-inside\",\n    \"region-fragment\", \"rendering-intent\", \"resize\", \"rest\", \"rest-after\",\n    \"rest-before\", \"richness\", \"right\", \"rotate\", \"rotation\", \"rotation-point\",\n    \"row-gap\", \"ruby-align\", \"ruby-overhang\", \"ruby-position\", \"ruby-span\",\n    \"scale\", \"scroll-behavior\", \"scroll-margin\", \"scroll-margin-block\",\n    \"scroll-margin-block-end\", \"scroll-margin-block-start\", \"scroll-margin-bottom\",\n    \"scroll-margin-inline\", \"scroll-margin-inline-end\",\n    \"scroll-margin-inline-start\", \"scroll-margin-left\", \"scroll-margin-right\",\n    \"scroll-margin-top\", \"scroll-padding\", \"scroll-padding-block\",\n    \"scroll-padding-block-end\", \"scroll-padding-block-start\",\n    \"scroll-padding-bottom\", \"scroll-padding-inline\", \"scroll-padding-inline-end\",\n    \"scroll-padding-inline-start\", \"scroll-padding-left\", \"scroll-padding-right\",\n    \"scroll-padding-top\", \"scroll-snap-align\", \"scroll-snap-type\",\n    \"shape-image-threshold\", \"shape-inside\", \"shape-margin\", \"shape-outside\",\n    \"size\", \"speak\", \"speak-as\", \"speak-header\", \"speak-numeral\",\n    \"speak-punctuation\", \"speech-rate\", \"stress\", \"string-set\", \"tab-size\",\n    \"table-layout\", \"target\", \"target-name\", \"target-new\", \"target-position\",\n    \"text-align\", \"text-align-last\", \"text-combine-upright\", \"text-decoration\",\n    \"text-decoration-color\", \"text-decoration-line\", \"text-decoration-skip\",\n    \"text-decoration-skip-ink\", \"text-decoration-style\", \"text-emphasis\",\n    \"text-emphasis-color\", \"text-emphasis-position\", \"text-emphasis-style\",\n    \"text-height\", \"text-indent\", \"text-justify\", \"text-orientation\",\n    \"text-outline\", \"text-overflow\", \"text-rendering\", \"text-shadow\",\n    \"text-size-adjust\", \"text-space-collapse\", \"text-transform\",\n    \"text-underline-position\", \"text-wrap\", \"top\", \"touch-action\", \"transform\", \"transform-origin\",\n    \"transform-style\", \"transition\", \"transition-delay\", \"transition-duration\",\n    \"transition-property\", \"transition-timing-function\", \"translate\",\n    \"unicode-bidi\", \"user-select\", \"vertical-align\", \"visibility\", \"voice-balance\",\n    \"voice-duration\", \"voice-family\", \"voice-pitch\", \"voice-range\", \"voice-rate\",\n    \"voice-stress\", \"voice-volume\", \"volume\", \"white-space\", \"widows\", \"width\",\n    \"will-change\", \"word-break\", \"word-spacing\", \"word-wrap\", \"writing-mode\", \"z-index\",\n    // SVG-specific\n    \"clip-path\", \"clip-rule\", \"mask\", \"enable-background\", \"filter\", \"flood-color\",\n    \"flood-opacity\", \"lighting-color\", \"stop-color\", \"stop-opacity\", \"pointer-events\",\n    \"color-interpolation\", \"color-interpolation-filters\",\n    \"color-rendering\", \"fill\", \"fill-opacity\", \"fill-rule\", \"image-rendering\",\n    \"marker\", \"marker-end\", \"marker-mid\", \"marker-start\", \"paint-order\", \"shape-rendering\", \"stroke\",\n    \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\",\n    \"stroke-miterlimit\", \"stroke-opacity\", \"stroke-width\", \"text-rendering\",\n    \"baseline-shift\", \"dominant-baseline\", \"glyph-orientation-horizontal\",\n    \"glyph-orientation-vertical\", \"text-anchor\", \"writing-mode\",\n  ], propertyKeywords = keySet(propertyKeywords_);\n\n  var nonStandardPropertyKeywords_ = [\n    \"accent-color\", \"aspect-ratio\", \"border-block\", \"border-block-color\", \"border-block-end\",\n    \"border-block-end-color\", \"border-block-end-style\", \"border-block-end-width\",\n    \"border-block-start\", \"border-block-start-color\", \"border-block-start-style\",\n    \"border-block-start-width\", \"border-block-style\", \"border-block-width\",\n    \"border-inline\", \"border-inline-color\", \"border-inline-end\",\n    \"border-inline-end-color\", \"border-inline-end-style\",\n    \"border-inline-end-width\", \"border-inline-start\", \"border-inline-start-color\",\n    \"border-inline-start-style\", \"border-inline-start-width\",\n    \"border-inline-style\", \"border-inline-width\", \"content-visibility\", \"margin-block\",\n    \"margin-block-end\", \"margin-block-start\", \"margin-inline\", \"margin-inline-end\",\n    \"margin-inline-start\", \"overflow-anchor\", \"overscroll-behavior\", \"padding-block\", \"padding-block-end\",\n    \"padding-block-start\", \"padding-inline\", \"padding-inline-end\",\n    \"padding-inline-start\", \"scroll-snap-stop\", \"scrollbar-3d-light-color\",\n    \"scrollbar-arrow-color\", \"scrollbar-base-color\", \"scrollbar-dark-shadow-color\",\n    \"scrollbar-face-color\", \"scrollbar-highlight-color\", \"scrollbar-shadow-color\",\n    \"scrollbar-track-color\", \"searchfield-cancel-button\", \"searchfield-decoration\",\n    \"searchfield-results-button\", \"searchfield-results-decoration\", \"shape-inside\", \"zoom\"\n  ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);\n\n  var fontProperties_ = [\n    \"font-display\", \"font-family\", \"src\", \"unicode-range\", \"font-variant\",\n     \"font-feature-settings\", \"font-stretch\", \"font-weight\", \"font-style\"\n  ], fontProperties = keySet(fontProperties_);\n\n  var counterDescriptors_ = [\n    \"additive-symbols\", \"fallback\", \"negative\", \"pad\", \"prefix\", \"range\",\n    \"speak-as\", \"suffix\", \"symbols\", \"system\"\n  ], counterDescriptors = keySet(counterDescriptors_);\n\n  var colorKeywords_ = [\n    \"aliceblue\", \"antiquewhite\", \"aqua\", \"aquamarine\", \"azure\", \"beige\",\n    \"bisque\", \"black\", \"blanchedalmond\", \"blue\", \"blueviolet\", \"brown\",\n    \"burlywood\", \"cadetblue\", \"chartreuse\", \"chocolate\", \"coral\", \"cornflowerblue\",\n    \"cornsilk\", \"crimson\", \"cyan\", \"darkblue\", \"darkcyan\", \"darkgoldenrod\",\n    \"darkgray\", \"darkgreen\", \"darkgrey\", \"darkkhaki\", \"darkmagenta\", \"darkolivegreen\",\n    \"darkorange\", \"darkorchid\", \"darkred\", \"darksalmon\", \"darkseagreen\",\n    \"darkslateblue\", \"darkslategray\", \"darkslategrey\", \"darkturquoise\", \"darkviolet\",\n    \"deeppink\", \"deepskyblue\", \"dimgray\", \"dimgrey\", \"dodgerblue\", \"firebrick\",\n    \"floralwhite\", \"forestgreen\", \"fuchsia\", \"gainsboro\", \"ghostwhite\",\n    \"gold\", \"goldenrod\", \"gray\", \"grey\", \"green\", \"greenyellow\", \"honeydew\",\n    \"hotpink\", \"indianred\", \"indigo\", \"ivory\", \"khaki\", \"lavender\",\n    \"lavenderblush\", \"lawngreen\", \"lemonchiffon\", \"lightblue\", \"lightcoral\",\n    \"lightcyan\", \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightgrey\", \"lightpink\",\n    \"lightsalmon\", \"lightseagreen\", \"lightskyblue\", \"lightslategray\", \"lightslategrey\",\n    \"lightsteelblue\", \"lightyellow\", \"lime\", \"limegreen\", \"linen\", \"magenta\",\n    \"maroon\", \"mediumaquamarine\", \"mediumblue\", \"mediumorchid\", \"mediumpurple\",\n    \"mediumseagreen\", \"mediumslateblue\", \"mediumspringgreen\", \"mediumturquoise\",\n    \"mediumvioletred\", \"midnightblue\", \"mintcream\", \"mistyrose\", \"moccasin\",\n    \"navajowhite\", \"navy\", \"oldlace\", \"olive\", \"olivedrab\", \"orange\", \"orangered\",\n    \"orchid\", \"palegoldenrod\", \"palegreen\", \"paleturquoise\", \"palevioletred\",\n    \"papayawhip\", \"peachpuff\", \"peru\", \"pink\", \"plum\", \"powderblue\",\n    \"purple\", \"rebeccapurple\", \"red\", \"rosybrown\", \"royalblue\", \"saddlebrown\",\n    \"salmon\", \"sandybrown\", \"seagreen\", \"seashell\", \"sienna\", \"silver\", \"skyblue\",\n    \"slateblue\", \"slategray\", \"slategrey\", \"snow\", \"springgreen\", \"steelblue\", \"tan\",\n    \"teal\", \"thistle\", \"tomato\", \"turquoise\", \"violet\", \"wheat\", \"white\",\n    \"whitesmoke\", \"yellow\", \"yellowgreen\"\n  ], colorKeywords = keySet(colorKeywords_);\n\n  var valueKeywords_ = [\n    \"above\", \"absolute\", \"activeborder\", \"additive\", \"activecaption\", \"afar\",\n    \"after-white-space\", \"ahead\", \"alias\", \"all\", \"all-scroll\", \"alphabetic\", \"alternate\",\n    \"always\", \"amharic\", \"amharic-abegede\", \"antialiased\", \"appworkspace\",\n    \"arabic-indic\", \"armenian\", \"asterisks\", \"attr\", \"auto\", \"auto-flow\", \"avoid\", \"avoid-column\", \"avoid-page\",\n    \"avoid-region\", \"axis-pan\", \"background\", \"backwards\", \"baseline\", \"below\", \"bidi-override\", \"binary\",\n    \"bengali\", \"blink\", \"block\", \"block-axis\", \"blur\", \"bold\", \"bolder\", \"border\", \"border-box\",\n    \"both\", \"bottom\", \"break\", \"break-all\", \"break-word\", \"brightness\", \"bullets\", \"button\", \"button-bevel\",\n    \"buttonface\", \"buttonhighlight\", \"buttonshadow\", \"buttontext\", \"calc\", \"cambodian\",\n    \"capitalize\", \"caps-lock-indicator\", \"caption\", \"captiontext\", \"caret\",\n    \"cell\", \"center\", \"checkbox\", \"circle\", \"cjk-decimal\", \"cjk-earthly-branch\",\n    \"cjk-heavenly-stem\", \"cjk-ideographic\", \"clear\", \"clip\", \"close-quote\",\n    \"col-resize\", \"collapse\", \"color\", \"color-burn\", \"color-dodge\", \"column\", \"column-reverse\",\n    \"compact\", \"condensed\", \"conic-gradient\", \"contain\", \"content\", \"contents\",\n    \"content-box\", \"context-menu\", \"continuous\", \"contrast\", \"copy\", \"counter\", \"counters\", \"cover\", \"crop\",\n    \"cross\", \"crosshair\", \"cubic-bezier\", \"currentcolor\", \"cursive\", \"cyclic\", \"darken\", \"dashed\", \"decimal\",\n    \"decimal-leading-zero\", \"default\", \"default-button\", \"dense\", \"destination-atop\",\n    \"destination-in\", \"destination-out\", \"destination-over\", \"devanagari\", \"difference\",\n    \"disc\", \"discard\", \"disclosure-closed\", \"disclosure-open\", \"document\",\n    \"dot-dash\", \"dot-dot-dash\",\n    \"dotted\", \"double\", \"down\", \"drop-shadow\", \"e-resize\", \"ease\", \"ease-in\", \"ease-in-out\", \"ease-out\",\n    \"element\", \"ellipse\", \"ellipsis\", \"embed\", \"end\", \"ethiopic\", \"ethiopic-abegede\",\n    \"ethiopic-abegede-am-et\", \"ethiopic-abegede-gez\", \"ethiopic-abegede-ti-er\",\n    \"ethiopic-abegede-ti-et\", \"ethiopic-halehame-aa-er\",\n    \"ethiopic-halehame-aa-et\", \"ethiopic-halehame-am-et\",\n    \"ethiopic-halehame-gez\", \"ethiopic-halehame-om-et\",\n    \"ethiopic-halehame-sid-et\", \"ethiopic-halehame-so-et\",\n    \"ethiopic-halehame-ti-er\", \"ethiopic-halehame-ti-et\", \"ethiopic-halehame-tig\",\n    \"ethiopic-numeric\", \"ew-resize\", \"exclusion\", \"expanded\", \"extends\", \"extra-condensed\",\n    \"extra-expanded\", \"fantasy\", \"fast\", \"fill\", \"fill-box\", \"fixed\", \"flat\", \"flex\", \"flex-end\", \"flex-start\", \"footnotes\",\n    \"forwards\", \"from\", \"geometricPrecision\", \"georgian\", \"grayscale\", \"graytext\", \"grid\", \"groove\",\n    \"gujarati\", \"gurmukhi\", \"hand\", \"hangul\", \"hangul-consonant\", \"hard-light\", \"hebrew\",\n    \"help\", \"hidden\", \"hide\", \"higher\", \"highlight\", \"highlighttext\",\n    \"hiragana\", \"hiragana-iroha\", \"horizontal\", \"hsl\", \"hsla\", \"hue\", \"hue-rotate\", \"icon\", \"ignore\",\n    \"inactiveborder\", \"inactivecaption\", \"inactivecaptiontext\", \"infinite\",\n    \"infobackground\", \"infotext\", \"inherit\", \"initial\", \"inline\", \"inline-axis\",\n    \"inline-block\", \"inline-flex\", \"inline-grid\", \"inline-table\", \"inset\", \"inside\", \"intrinsic\", \"invert\",\n    \"italic\", \"japanese-formal\", \"japanese-informal\", \"justify\", \"kannada\",\n    \"katakana\", \"katakana-iroha\", \"keep-all\", \"khmer\",\n    \"korean-hangul-formal\", \"korean-hanja-formal\", \"korean-hanja-informal\",\n    \"landscape\", \"lao\", \"large\", \"larger\", \"left\", \"level\", \"lighter\", \"lighten\",\n    \"line-through\", \"linear\", \"linear-gradient\", \"lines\", \"list-item\", \"listbox\", \"listitem\",\n    \"local\", \"logical\", \"loud\", \"lower\", \"lower-alpha\", \"lower-armenian\",\n    \"lower-greek\", \"lower-hexadecimal\", \"lower-latin\", \"lower-norwegian\",\n    \"lower-roman\", \"lowercase\", \"ltr\", \"luminosity\", \"malayalam\", \"manipulation\", \"match\", \"matrix\", \"matrix3d\",\n    \"media-controls-background\", \"media-current-time-display\",\n    \"media-fullscreen-button\", \"media-mute-button\", \"media-play-button\",\n    \"media-return-to-realtime-button\", \"media-rewind-button\",\n    \"media-seek-back-button\", \"media-seek-forward-button\", \"media-slider\",\n    \"media-sliderthumb\", \"media-time-remaining-display\", \"media-volume-slider\",\n    \"media-volume-slider-container\", \"media-volume-sliderthumb\", \"medium\",\n    \"menu\", \"menulist\", \"menulist-button\", \"menulist-text\",\n    \"menulist-textfield\", \"menutext\", \"message-box\", \"middle\", \"min-intrinsic\",\n    \"mix\", \"mongolian\", \"monospace\", \"move\", \"multiple\", \"multiple_mask_images\", \"multiply\", \"myanmar\", \"n-resize\",\n    \"narrower\", \"ne-resize\", \"nesw-resize\", \"no-close-quote\", \"no-drop\",\n    \"no-open-quote\", \"no-repeat\", \"none\", \"normal\", \"not-allowed\", \"nowrap\",\n    \"ns-resize\", \"numbers\", \"numeric\", \"nw-resize\", \"nwse-resize\", \"oblique\", \"octal\", \"opacity\", \"open-quote\",\n    \"optimizeLegibility\", \"optimizeSpeed\", \"oriya\", \"oromo\", \"outset\",\n    \"outside\", \"outside-shape\", \"overlay\", \"overline\", \"padding\", \"padding-box\",\n    \"painted\", \"page\", \"paused\", \"persian\", \"perspective\", \"pinch-zoom\", \"plus-darker\", \"plus-lighter\",\n    \"pointer\", \"polygon\", \"portrait\", \"pre\", \"pre-line\", \"pre-wrap\", \"preserve-3d\",\n    \"progress\", \"push-button\", \"radial-gradient\", \"radio\", \"read-only\",\n    \"read-write\", \"read-write-plaintext-only\", \"rectangle\", \"region\",\n    \"relative\", \"repeat\", \"repeating-linear-gradient\", \"repeating-radial-gradient\",\n    \"repeating-conic-gradient\", \"repeat-x\", \"repeat-y\", \"reset\", \"reverse\",\n    \"rgb\", \"rgba\", \"ridge\", \"right\", \"rotate\", \"rotate3d\", \"rotateX\", \"rotateY\",\n    \"rotateZ\", \"round\", \"row\", \"row-resize\", \"row-reverse\", \"rtl\", \"run-in\", \"running\",\n    \"s-resize\", \"sans-serif\", \"saturate\", \"saturation\", \"scale\", \"scale3d\", \"scaleX\", \"scaleY\", \"scaleZ\", \"screen\",\n    \"scroll\", \"scrollbar\", \"scroll-position\", \"se-resize\", \"searchfield\",\n    \"searchfield-cancel-button\", \"searchfield-decoration\",\n    \"searchfield-results-button\", \"searchfield-results-decoration\", \"self-start\", \"self-end\",\n    \"semi-condensed\", \"semi-expanded\", \"separate\", \"sepia\", \"serif\", \"show\", \"sidama\",\n    \"simp-chinese-formal\", \"simp-chinese-informal\", \"single\",\n    \"skew\", \"skewX\", \"skewY\", \"skip-white-space\", \"slide\", \"slider-horizontal\",\n    \"slider-vertical\", \"sliderthumb-horizontal\", \"sliderthumb-vertical\", \"slow\",\n    \"small\", \"small-caps\", \"small-caption\", \"smaller\", \"soft-light\", \"solid\", \"somali\",\n    \"source-atop\", \"source-in\", \"source-out\", \"source-over\", \"space\", \"space-around\", \"space-between\", \"space-evenly\", \"spell-out\", \"square\",\n    \"square-button\", \"start\", \"static\", \"status-bar\", \"stretch\", \"stroke\", \"stroke-box\", \"sub\",\n    \"subpixel-antialiased\", \"svg_masks\", \"super\", \"sw-resize\", \"symbolic\", \"symbols\", \"system-ui\", \"table\",\n    \"table-caption\", \"table-cell\", \"table-column\", \"table-column-group\",\n    \"table-footer-group\", \"table-header-group\", \"table-row\", \"table-row-group\",\n    \"tamil\",\n    \"telugu\", \"text\", \"text-bottom\", \"text-top\", \"textarea\", \"textfield\", \"thai\",\n    \"thick\", \"thin\", \"threeddarkshadow\", \"threedface\", \"threedhighlight\",\n    \"threedlightshadow\", \"threedshadow\", \"tibetan\", \"tigre\", \"tigrinya-er\",\n    \"tigrinya-er-abegede\", \"tigrinya-et\", \"tigrinya-et-abegede\", \"to\", \"top\",\n    \"trad-chinese-formal\", \"trad-chinese-informal\", \"transform\",\n    \"translate\", \"translate3d\", \"translateX\", \"translateY\", \"translateZ\",\n    \"transparent\", \"ultra-condensed\", \"ultra-expanded\", \"underline\", \"unidirectional-pan\", \"unset\", \"up\",\n    \"upper-alpha\", \"upper-armenian\", \"upper-greek\", \"upper-hexadecimal\",\n    \"upper-latin\", \"upper-norwegian\", \"upper-roman\", \"uppercase\", \"urdu\", \"url\",\n    \"var\", \"vertical\", \"vertical-text\", \"view-box\", \"visible\", \"visibleFill\", \"visiblePainted\",\n    \"visibleStroke\", \"visual\", \"w-resize\", \"wait\", \"wave\", \"wider\",\n    \"window\", \"windowframe\", \"windowtext\", \"words\", \"wrap\", \"wrap-reverse\", \"x-large\", \"x-small\", \"xor\",\n    \"xx-large\", \"xx-small\"\n  ], valueKeywords = keySet(valueKeywords_);\n\n  var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_)\n    .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_)\n    .concat(valueKeywords_);\n  CodeMirror.registerHelper(\"hintWords\", \"css\", allWords);\n\n  function tokenCComment(stream, state) {\n    var maybeEnd = false, ch;\n    while ((ch = stream.next()) != null) {\n      if (maybeEnd && ch == \"/\") {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return [\"comment\", \"comment\"];\n  }\n\n  CodeMirror.defineMIME(\"text/css\", {\n    documentTypes: documentTypes,\n    mediaTypes: mediaTypes,\n    mediaFeatures: mediaFeatures,\n    mediaValueKeywords: mediaValueKeywords,\n    propertyKeywords: propertyKeywords,\n    nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n    fontProperties: fontProperties,\n    counterDescriptors: counterDescriptors,\n    colorKeywords: colorKeywords,\n    valueKeywords: valueKeywords,\n    tokenHooks: {\n      \"/\": function(stream, state) {\n        if (!stream.eat(\"*\")) return false;\n        state.tokenize = tokenCComment;\n        return tokenCComment(stream, state);\n      }\n    },\n    name: \"css\"\n  });\n\n  CodeMirror.defineMIME(\"text/x-scss\", {\n    mediaTypes: mediaTypes,\n    mediaFeatures: mediaFeatures,\n    mediaValueKeywords: mediaValueKeywords,\n    propertyKeywords: propertyKeywords,\n    nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n    colorKeywords: colorKeywords,\n    valueKeywords: valueKeywords,\n    fontProperties: fontProperties,\n    allowNested: true,\n    lineComment: \"//\",\n    tokenHooks: {\n      \"/\": function(stream, state) {\n        if (stream.eat(\"/\")) {\n          stream.skipToEnd();\n          return [\"comment\", \"comment\"];\n        } else if (stream.eat(\"*\")) {\n          state.tokenize = tokenCComment;\n          return tokenCComment(stream, state);\n        } else {\n          return [\"operator\", \"operator\"];\n        }\n      },\n      \":\": function(stream) {\n        if (stream.match(/^\\s*\\{/, false))\n          return [null, null]\n        return false;\n      },\n      \"$\": function(stream) {\n        stream.match(/^[\\w-]+/);\n        if (stream.match(/^\\s*:/, false))\n          return [\"variable-2\", \"variable-definition\"];\n        return [\"variable-2\", \"variable\"];\n      },\n      \"#\": function(stream) {\n        if (!stream.eat(\"{\")) return false;\n        return [null, \"interpolation\"];\n      }\n    },\n    name: \"css\",\n    helperType: \"scss\"\n  });\n\n  CodeMirror.defineMIME(\"text/x-less\", {\n    mediaTypes: mediaTypes,\n    mediaFeatures: mediaFeatures,\n    mediaValueKeywords: mediaValueKeywords,\n    propertyKeywords: propertyKeywords,\n    nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n    colorKeywords: colorKeywords,\n    valueKeywords: valueKeywords,\n    fontProperties: fontProperties,\n    allowNested: true,\n    lineComment: \"//\",\n    tokenHooks: {\n      \"/\": function(stream, state) {\n        if (stream.eat(\"/\")) {\n          stream.skipToEnd();\n          return [\"comment\", \"comment\"];\n        } else if (stream.eat(\"*\")) {\n          state.tokenize = tokenCComment;\n          return tokenCComment(stream, state);\n        } else {\n          return [\"operator\", \"operator\"];\n        }\n      },\n      \"@\": function(stream) {\n        if (stream.eat(\"{\")) return [null, \"interpolation\"];\n        if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\\b/i, false)) return false;\n        stream.eatWhile(/[\\w\\\\\\-]/);\n        if (stream.match(/^\\s*:/, false))\n          return [\"variable-2\", \"variable-definition\"];\n        return [\"variable-2\", \"variable\"];\n      },\n      \"&\": function() {\n        return [\"atom\", \"atom\"];\n      }\n    },\n    name: \"css\",\n    helperType: \"less\"\n  });\n\n  CodeMirror.defineMIME(\"text/x-gss\", {\n    documentTypes: documentTypes,\n    mediaTypes: mediaTypes,\n    mediaFeatures: mediaFeatures,\n    propertyKeywords: propertyKeywords,\n    nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n    fontProperties: fontProperties,\n    counterDescriptors: counterDescriptors,\n    colorKeywords: colorKeywords,\n    valueKeywords: valueKeywords,\n    supportsAtComponent: true,\n    tokenHooks: {\n      \"/\": function(stream, state) {\n        if (!stream.eat(\"*\")) return false;\n        state.tokenize = tokenCComment;\n        return tokenCComment(stream, state);\n      }\n    },\n    name: \"css\",\n    helperType: \"gss\"\n  });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/cypher/cypher.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// By the Neo4j Team and contributors.\n// https://github.com/neo4j-contrib/CodeMirror\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  var wordRegexp = function(words) {\n    return new RegExp(\"^(?:\" + words.join(\"|\") + \")$\", \"i\");\n  };\n\n  CodeMirror.defineMode(\"cypher\", function(config) {\n    var tokenBase = function(stream/*, state*/) {\n      curPunc = null\n      var ch = stream.next();\n      if (ch ==='\"') {\n        stream.match(/^[^\"]*\"/);\n        return \"string\";\n      }\n      if (ch === \"'\") {\n        stream.match(/^[^']*'/);\n        return \"string\";\n      }\n      if (/[{}\\(\\),\\.;\\[\\]]/.test(ch)) {\n        curPunc = ch;\n        return \"node\";\n      } else if (ch === \"/\" && stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      } else if (operatorChars.test(ch)) {\n        stream.eatWhile(operatorChars);\n        return null;\n      } else {\n        stream.eatWhile(/[_\\w\\d]/);\n        if (stream.eat(\":\")) {\n          stream.eatWhile(/[\\w\\d_\\-]/);\n          return \"atom\";\n        }\n        var word = stream.current();\n        if (funcs.test(word)) return \"builtin\";\n        if (preds.test(word)) return \"def\";\n        if (keywords.test(word) || systemKeywords.test(word)) return \"keyword\";\n        return \"variable\";\n      }\n    };\n    var pushContext = function(state, type, col) {\n      return state.context = {\n        prev: state.context,\n        indent: state.indent,\n        col: col,\n        type: type\n      };\n    };\n    var popContext = function(state) {\n      state.indent = state.context.indent;\n      return state.context = state.context.prev;\n    };\n    var indentUnit = config.indentUnit;\n    var curPunc;\n    var funcs = wordRegexp([\"abs\", \"acos\", \"allShortestPaths\", \"asin\", \"atan\", \"atan2\", \"avg\", \"ceil\", \"coalesce\", \"collect\", \"cos\", \"cot\", \"count\", \"degrees\", \"e\", \"endnode\", \"exp\", \"extract\", \"filter\", \"floor\", \"haversin\", \"head\", \"id\", \"keys\", \"labels\", \"last\", \"left\", \"length\", \"log\", \"log10\", \"lower\", \"ltrim\", \"max\", \"min\", \"node\", \"nodes\", \"percentileCont\", \"percentileDisc\", \"pi\", \"radians\", \"rand\", \"range\", \"reduce\", \"rel\", \"relationship\", \"relationships\", \"replace\", \"reverse\", \"right\", \"round\", \"rtrim\", \"shortestPath\", \"sign\", \"sin\", \"size\", \"split\", \"sqrt\", \"startnode\", \"stdev\", \"stdevp\", \"str\", \"substring\", \"sum\", \"tail\", \"tan\", \"timestamp\", \"toFloat\", \"toInt\", \"toString\", \"trim\", \"type\", \"upper\"]);\n    var preds = wordRegexp([\"all\", \"and\", \"any\", \"contains\", \"exists\", \"has\", \"in\", \"none\", \"not\", \"or\", \"single\", \"xor\"]);\n    var keywords = wordRegexp([\"as\", \"asc\", \"ascending\", \"assert\", \"by\", \"case\", \"commit\", \"constraint\", \"create\", \"csv\", \"cypher\", \"delete\", \"desc\", \"descending\", \"detach\", \"distinct\", \"drop\", \"else\", \"end\", \"ends\", \"explain\", \"false\", \"fieldterminator\", \"foreach\", \"from\", \"headers\", \"in\", \"index\", \"is\", \"join\", \"limit\", \"load\", \"match\", \"merge\", \"null\", \"on\", \"optional\", \"order\", \"periodic\", \"profile\", \"remove\", \"return\", \"scan\", \"set\", \"skip\", \"start\", \"starts\", \"then\", \"true\", \"union\", \"unique\", \"unwind\", \"using\", \"when\", \"where\", \"with\", \"call\", \"yield\"]);\n    var systemKeywords = wordRegexp([\"access\", \"active\", \"assign\", \"all\", \"alter\", \"as\", \"catalog\", \"change\", \"copy\", \"create\", \"constraint\", \"constraints\", \"current\", \"database\", \"databases\", \"dbms\", \"default\", \"deny\", \"drop\", \"element\", \"elements\", \"exists\", \"from\", \"grant\", \"graph\", \"graphs\", \"if\", \"index\", \"indexes\", \"label\", \"labels\", \"management\", \"match\", \"name\", \"names\", \"new\", \"node\", \"nodes\", \"not\", \"of\", \"on\", \"or\", \"password\", \"populated\", \"privileges\", \"property\", \"read\", \"relationship\", \"relationships\", \"remove\", \"replace\", \"required\", \"revoke\", \"role\", \"roles\", \"set\", \"show\", \"start\", \"status\", \"stop\", \"suspended\", \"to\", \"traverse\", \"type\", \"types\", \"user\", \"users\", \"with\", \"write\"]);\n    var operatorChars = /[*+\\-<>=&|~%^]/;\n\n    return {\n      startState: function(/*base*/) {\n        return {\n          tokenize: tokenBase,\n          context: null,\n          indent: 0,\n          col: 0\n        };\n      },\n      token: function(stream, state) {\n        if (stream.sol()) {\n          if (state.context && (state.context.align == null)) {\n            state.context.align = false;\n          }\n          state.indent = stream.indentation();\n        }\n        if (stream.eatSpace()) {\n          return null;\n        }\n        var style = state.tokenize(stream, state);\n        if (style !== \"comment\" && state.context && (state.context.align == null) && state.context.type !== \"pattern\") {\n          state.context.align = true;\n        }\n        if (curPunc === \"(\") {\n          pushContext(state, \")\", stream.column());\n        } else if (curPunc === \"[\") {\n          pushContext(state, \"]\", stream.column());\n        } else if (curPunc === \"{\") {\n          pushContext(state, \"}\", stream.column());\n        } else if (/[\\]\\}\\)]/.test(curPunc)) {\n          while (state.context && state.context.type === \"pattern\") {\n            popContext(state);\n          }\n          if (state.context && curPunc === state.context.type) {\n            popContext(state);\n          }\n        } else if (curPunc === \".\" && state.context && state.context.type === \"pattern\") {\n          popContext(state);\n        } else if (/atom|string|variable/.test(style) && state.context) {\n          if (/[\\}\\]]/.test(state.context.type)) {\n            pushContext(state, \"pattern\", stream.column());\n          } else if (state.context.type === \"pattern\" && !state.context.align) {\n            state.context.align = true;\n            state.context.col = stream.column();\n          }\n        }\n        return style;\n      },\n      indent: function(state, textAfter) {\n        var firstChar = textAfter && textAfter.charAt(0);\n        var context = state.context;\n        if (/[\\]\\}]/.test(firstChar)) {\n          while (context && context.type === \"pattern\") {\n            context = context.prev;\n          }\n        }\n        var closing = context && firstChar === context.type;\n        if (!context) return 0;\n        if (context.type === \"keywords\") return CodeMirror.commands.newlineAndIndent;\n        if (context.align) return context.col + (closing ? 0 : 1);\n        return context.indent + (closing ? 0 : indentUnit);\n      }\n    };\n  });\n\n  CodeMirror.modeExtensions[\"cypher\"] = {\n    autoFormatLineBreaks: function(text) {\n      var i, lines, reProcessedPortion;\n      var lines = text.split(\"\\n\");\n      var reProcessedPortion = /\\s+\\b(return|where|order by|match|with|skip|limit|create|delete|set)\\b\\s/g;\n      for (var i = 0; i < lines.length; i++)\n        lines[i] = lines[i].replace(reProcessedPortion, \" \\n$1 \").trim();\n      return lines.join(\"\\n\");\n    }\n  };\n\n  CodeMirror.defineMIME(\"application/x-cypher-query\", \"cypher\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/d/d.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"d\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit,\n      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,\n      keywords = parserConfig.keywords || {},\n      builtin = parserConfig.builtin || {},\n      blockKeywords = parserConfig.blockKeywords || {},\n      atoms = parserConfig.atoms || {},\n      hooks = parserConfig.hooks || {},\n      multiLineStrings = parserConfig.multiLineStrings;\n  var isOperatorChar = /[+\\-*&%=<>!?|\\/]/;\n\n  var curPunc;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (hooks[ch]) {\n      var result = hooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n    if (ch == '\"' || ch == \"'\" || ch == \"`\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"+\")) {\n        state.tokenize = tokenNestedComment;\n        return tokenNestedComment(stream, state);\n      }\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n    var cur = stream.current();\n    if (keywords.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"keyword\";\n    }\n    if (builtin.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"builtin\";\n    }\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = null;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function tokenNestedComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch == \"+\");\n    }\n    return \"comment\";\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type) {\n    var indent = state.indented;\n    if (state.context && state.context.type == \"statement\")\n      indent = state.context.indented;\n    return state.context = new Context(indent, col, type, null, state.context);\n  }\n  function popContext(state) {\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if ((curPunc == \";\" || curPunc == \":\" || curPunc == \",\") && ctx.type == \"statement\") popContext(state);\n      else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"}\") {\n        while (ctx.type == \"statement\") ctx = popContext(state);\n        if (ctx.type == \"}\") ctx = popContext(state);\n        while (ctx.type == \"statement\") ctx = popContext(state);\n      }\n      else if (curPunc == ctx.type) popContext(state);\n      else if (((ctx.type == \"}\" || ctx.type == \"top\") && curPunc != ';') || (ctx.type == \"statement\" && curPunc == \"newstatement\"))\n        pushContext(state, stream.column(), \"statement\");\n      state.startOfLine = false;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;\n      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n      if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n      var closing = firstChar == ctx.type;\n      if (ctx.type == \"statement\") return ctx.indented + (firstChar == \"{\" ? 0 : statementIndentUnit);\n      else if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"{}\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    blockCommentContinue: \" * \",\n    lineComment: \"//\",\n    fold: \"brace\"\n  };\n});\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  var blockKeywords = \"body catch class do else enum for foreach foreach_reverse if in interface mixin \" +\n                      \"out scope struct switch try union unittest version while with\";\n\n  CodeMirror.defineMIME(\"text/x-d\", {\n    name: \"d\",\n    keywords: words(\"abstract alias align asm assert auto break case cast cdouble cent cfloat const continue \" +\n                    \"debug default delegate delete deprecated export extern final finally function goto immutable \" +\n                    \"import inout invariant is lazy macro module new nothrow override package pragma private \" +\n                    \"protected public pure ref return shared short static super synchronized template this \" +\n                    \"throw typedef typeid typeof volatile __FILE__ __LINE__ __gshared __traits __vector __parameters \" +\n                    blockKeywords),\n    blockKeywords: words(blockKeywords),\n    builtin: words(\"bool byte char creal dchar double float idouble ifloat int ireal long real short ubyte \" +\n                   \"ucent uint ulong ushort wchar wstring void size_t sizediff_t\"),\n    atoms: words(\"exit failure success true false null\"),\n    hooks: {\n      \"@\": function(stream, _state) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      }\n    }\n  });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/dart/dart.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../clike/clike\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../clike/clike\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var keywords = (\"this super static final const abstract class extends external factory \" +\n    \"implements mixin get native set typedef with enum throw rethrow \" +\n    \"assert break case continue default in return new deferred async await covariant \" +\n    \"try catch finally do else for if switch while import library export \" +\n    \"part of show hide is as extension on yield late required\").split(\" \");\n  var blockKeywords = \"try catch finally do else for if switch while\".split(\" \");\n  var atoms = \"true false null\".split(\" \");\n  var builtins = \"void bool num int double dynamic var String Null Never\".split(\" \");\n\n  function set(words) {\n    var obj = {};\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  function pushInterpolationStack(state) {\n    (state.interpolationStack || (state.interpolationStack = [])).push(state.tokenize);\n  }\n\n  function popInterpolationStack(state) {\n    return (state.interpolationStack || (state.interpolationStack = [])).pop();\n  }\n\n  function sizeInterpolationStack(state) {\n    return state.interpolationStack ? state.interpolationStack.length : 0;\n  }\n\n  CodeMirror.defineMIME(\"application/dart\", {\n    name: \"clike\",\n    keywords: set(keywords),\n    blockKeywords: set(blockKeywords),\n    builtin: set(builtins),\n    atoms: set(atoms),\n    hooks: {\n      \"@\": function(stream) {\n        stream.eatWhile(/[\\w\\$_\\.]/);\n        return \"meta\";\n      },\n\n      // custom string handling to deal with triple-quoted strings and string interpolation\n      \"'\": function(stream, state) {\n        return tokenString(\"'\", stream, state, false);\n      },\n      \"\\\"\": function(stream, state) {\n        return tokenString(\"\\\"\", stream, state, false);\n      },\n      \"r\": function(stream, state) {\n        var peek = stream.peek();\n        if (peek == \"'\" || peek == \"\\\"\") {\n          return tokenString(stream.next(), stream, state, true);\n        }\n        return false;\n      },\n\n      \"}\": function(_stream, state) {\n        // \"}\" is end of interpolation, if interpolation stack is non-empty\n        if (sizeInterpolationStack(state) > 0) {\n          state.tokenize = popInterpolationStack(state);\n          return null;\n        }\n        return false;\n      },\n\n      \"/\": function(stream, state) {\n        if (!stream.eat(\"*\")) return false\n        state.tokenize = tokenNestedComment(1)\n        return state.tokenize(stream, state)\n      },\n      token: function(stream, _, style) {\n        if (style == \"variable\") {\n          // Assume uppercase symbols are classes using variable-2\n          var isUpper = RegExp('^[_$]*[A-Z][a-zA-Z0-9_$]*$','g');\n          if (isUpper.test(stream.current())) {\n            return 'variable-2';\n          }\n        }\n      }\n    }\n  });\n\n  function tokenString(quote, stream, state, raw) {\n    var tripleQuoted = false;\n    if (stream.eat(quote)) {\n      if (stream.eat(quote)) tripleQuoted = true;\n      else return \"string\"; //empty string\n    }\n    function tokenStringHelper(stream, state) {\n      var escaped = false;\n      while (!stream.eol()) {\n        if (!raw && !escaped && stream.peek() == \"$\") {\n          pushInterpolationStack(state);\n          state.tokenize = tokenInterpolation;\n          return \"string\";\n        }\n        var next = stream.next();\n        if (next == quote && !escaped && (!tripleQuoted || stream.match(quote + quote))) {\n          state.tokenize = null;\n          break;\n        }\n        escaped = !raw && !escaped && next == \"\\\\\";\n      }\n      return \"string\";\n    }\n    state.tokenize = tokenStringHelper;\n    return tokenStringHelper(stream, state);\n  }\n\n  function tokenInterpolation(stream, state) {\n    stream.eat(\"$\");\n    if (stream.eat(\"{\")) {\n      // let clike handle the content of ${...},\n      // we take over again when \"}\" appears (see hooks).\n      state.tokenize = null;\n    } else {\n      state.tokenize = tokenInterpolationIdentifier;\n    }\n    return null;\n  }\n\n  function tokenInterpolationIdentifier(stream, state) {\n    stream.eatWhile(/[\\w_]/);\n    state.tokenize = popInterpolationStack(state);\n    return \"variable\";\n  }\n\n  function tokenNestedComment(depth) {\n    return function (stream, state) {\n      var ch\n      while (ch = stream.next()) {\n        if (ch == \"*\" && stream.eat(\"/\")) {\n          if (depth == 1) {\n            state.tokenize = null\n            break\n          } else {\n            state.tokenize = tokenNestedComment(depth - 1)\n            return state.tokenize(stream, state)\n          }\n        } else if (ch == \"/\" && stream.eat(\"*\")) {\n          state.tokenize = tokenNestedComment(depth + 1)\n          return state.tokenize(stream, state)\n        }\n      }\n      return \"comment\"\n    }\n  }\n\n  CodeMirror.registerHelper(\"hintWords\", \"application/dart\", keywords.concat(atoms).concat(builtins));\n\n  // This is needed to make loading through meta.js work.\n  CodeMirror.defineMode(\"dart\", function(conf) {\n    return CodeMirror.getMode(conf, \"application/dart\");\n  }, \"clike\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/diff/diff.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"diff\", function() {\n\n  var TOKEN_NAMES = {\n    '+': 'positive',\n    '-': 'negative',\n    '@': 'meta'\n  };\n\n  return {\n    token: function(stream) {\n      var tw_pos = stream.string.search(/[\\t ]+?$/);\n\n      if (!stream.sol() || tw_pos === 0) {\n        stream.skipToEnd();\n        return (\"error \" + (\n          TOKEN_NAMES[stream.string.charAt(0)] || '')).replace(/ $/, '');\n      }\n\n      var token_name = TOKEN_NAMES[stream.peek()] || stream.skipToEnd();\n\n      if (tw_pos === -1) {\n        stream.skipToEnd();\n      } else {\n        stream.pos = tw_pos;\n      }\n\n      return token_name;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-diff\", \"diff\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/django/django.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"),\n        require(\"../../addon/mode/overlay\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\",\n            \"../../addon/mode/overlay\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"django:inner\", function() {\n    var keywords = [\"block\", \"endblock\", \"for\", \"endfor\", \"true\", \"false\", \"filter\", \"endfilter\",\n                    \"loop\", \"none\", \"self\", \"super\", \"if\", \"elif\", \"endif\", \"as\", \"else\", \"import\",\n                    \"with\", \"endwith\", \"without\", \"context\", \"ifequal\", \"endifequal\", \"ifnotequal\",\n                    \"endifnotequal\", \"extends\", \"include\", \"load\", \"comment\", \"endcomment\",\n                    \"empty\", \"url\", \"static\", \"trans\", \"blocktrans\", \"endblocktrans\", \"now\",\n                    \"regroup\", \"lorem\", \"ifchanged\", \"endifchanged\", \"firstof\", \"debug\", \"cycle\",\n                    \"csrf_token\", \"autoescape\", \"endautoescape\", \"spaceless\", \"endspaceless\",\n                    \"ssi\", \"templatetag\", \"verbatim\", \"endverbatim\", \"widthratio\"],\n        filters = [\"add\", \"addslashes\", \"capfirst\", \"center\", \"cut\", \"date\",\n                   \"default\", \"default_if_none\", \"dictsort\",\n                   \"dictsortreversed\", \"divisibleby\", \"escape\", \"escapejs\",\n                   \"filesizeformat\", \"first\", \"floatformat\", \"force_escape\",\n                   \"get_digit\", \"iriencode\", \"join\", \"last\", \"length\",\n                   \"length_is\", \"linebreaks\", \"linebreaksbr\", \"linenumbers\",\n                   \"ljust\", \"lower\", \"make_list\", \"phone2numeric\", \"pluralize\",\n                   \"pprint\", \"random\", \"removetags\", \"rjust\", \"safe\",\n                   \"safeseq\", \"slice\", \"slugify\", \"stringformat\", \"striptags\",\n                   \"time\", \"timesince\", \"timeuntil\", \"title\", \"truncatechars\",\n                   \"truncatechars_html\", \"truncatewords\", \"truncatewords_html\",\n                   \"unordered_list\", \"upper\", \"urlencode\", \"urlize\",\n                   \"urlizetrunc\", \"wordcount\", \"wordwrap\", \"yesno\"],\n        operators = [\"==\", \"!=\", \"<\", \">\", \"<=\", \">=\"],\n        wordOperators = [\"in\", \"not\", \"or\", \"and\"];\n\n    keywords = new RegExp(\"^\\\\b(\" + keywords.join(\"|\") + \")\\\\b\");\n    filters = new RegExp(\"^\\\\b(\" + filters.join(\"|\") + \")\\\\b\");\n    operators = new RegExp(\"^\\\\b(\" + operators.join(\"|\") + \")\\\\b\");\n    wordOperators = new RegExp(\"^\\\\b(\" + wordOperators.join(\"|\") + \")\\\\b\");\n\n    // We have to return \"null\" instead of null, in order to avoid string\n    // styling as the default, when using Django templates inside HTML\n    // element attributes\n    function tokenBase (stream, state) {\n      // Attempt to identify a variable, template or comment tag respectively\n      if (stream.match(\"{{\")) {\n        state.tokenize = inVariable;\n        return \"tag\";\n      } else if (stream.match(\"{%\")) {\n        state.tokenize = inTag;\n        return \"tag\";\n      } else if (stream.match(\"{#\")) {\n        state.tokenize = inComment;\n        return \"comment\";\n      }\n\n      // Ignore completely any stream series that do not match the\n      // Django template opening tags.\n      while (stream.next() != null && !stream.match(/\\{[{%#]/, false)) {}\n      return null;\n    }\n\n    // A string can be included in either single or double quotes (this is\n    // the delimiter). Mark everything as a string until the start delimiter\n    // occurs again.\n    function inString (delimiter, previousTokenizer) {\n      return function (stream, state) {\n        if (!state.escapeNext && stream.eat(delimiter)) {\n          state.tokenize = previousTokenizer;\n        } else {\n          if (state.escapeNext) {\n            state.escapeNext = false;\n          }\n\n          var ch = stream.next();\n\n          // Take into account the backslash for escaping characters, such as\n          // the string delimiter.\n          if (ch == \"\\\\\") {\n            state.escapeNext = true;\n          }\n        }\n\n        return \"string\";\n      };\n    }\n\n    // Apply Django template variable syntax highlighting\n    function inVariable (stream, state) {\n      // Attempt to match a dot that precedes a property\n      if (state.waitDot) {\n        state.waitDot = false;\n\n        if (stream.peek() != \".\") {\n          return \"null\";\n        }\n\n        // Dot followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\".\")) {\n          state.waitProperty = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for property.\");\n        }\n      }\n\n      // Attempt to match a pipe that precedes a filter\n      if (state.waitPipe) {\n        state.waitPipe = false;\n\n        if (stream.peek() != \"|\") {\n          return \"null\";\n        }\n\n        // Pipe followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\"|\")) {\n          state.waitFilter = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for filter.\");\n        }\n      }\n\n      // Highlight properties\n      if (state.waitProperty) {\n        state.waitProperty = false;\n        if (stream.match(/\\b(\\w+)\\b/)) {\n          state.waitDot = true;  // A property can be followed by another property\n          state.waitPipe = true;  // A property can be followed by a filter\n          return \"property\";\n        }\n      }\n\n      // Highlight filters\n      if (state.waitFilter) {\n          state.waitFilter = false;\n        if (stream.match(filters)) {\n          return \"variable-2\";\n        }\n      }\n\n      // Ignore all white spaces\n      if (stream.eatSpace()) {\n        state.waitProperty = false;\n        return \"null\";\n      }\n\n      // Identify numbers\n      if (stream.match(/\\b\\d+(\\.\\d+)?\\b/)) {\n        return \"number\";\n      }\n\n      // Identify strings\n      if (stream.match(\"'\")) {\n        state.tokenize = inString(\"'\", state.tokenize);\n        return \"string\";\n      } else if (stream.match('\"')) {\n        state.tokenize = inString('\"', state.tokenize);\n        return \"string\";\n      }\n\n      // Attempt to find the variable\n      if (stream.match(/\\b(\\w+)\\b/) && !state.foundVariable) {\n        state.waitDot = true;\n        state.waitPipe = true;  // A property can be followed by a filter\n        return \"variable\";\n      }\n\n      // If found closing tag reset\n      if (stream.match(\"}}\")) {\n        state.waitProperty = null;\n        state.waitFilter = null;\n        state.waitDot = null;\n        state.waitPipe = null;\n        state.tokenize = tokenBase;\n        return \"tag\";\n      }\n\n      // If nothing was found, advance to the next character\n      stream.next();\n      return \"null\";\n    }\n\n    function inTag (stream, state) {\n      // Attempt to match a dot that precedes a property\n      if (state.waitDot) {\n        state.waitDot = false;\n\n        if (stream.peek() != \".\") {\n          return \"null\";\n        }\n\n        // Dot followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\".\")) {\n          state.waitProperty = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for property.\");\n        }\n      }\n\n      // Attempt to match a pipe that precedes a filter\n      if (state.waitPipe) {\n        state.waitPipe = false;\n\n        if (stream.peek() != \"|\") {\n          return \"null\";\n        }\n\n        // Pipe followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\"|\")) {\n          state.waitFilter = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for filter.\");\n        }\n      }\n\n      // Highlight properties\n      if (state.waitProperty) {\n        state.waitProperty = false;\n        if (stream.match(/\\b(\\w+)\\b/)) {\n          state.waitDot = true;  // A property can be followed by another property\n          state.waitPipe = true;  // A property can be followed by a filter\n          return \"property\";\n        }\n      }\n\n      // Highlight filters\n      if (state.waitFilter) {\n          state.waitFilter = false;\n        if (stream.match(filters)) {\n          return \"variable-2\";\n        }\n      }\n\n      // Ignore all white spaces\n      if (stream.eatSpace()) {\n        state.waitProperty = false;\n        return \"null\";\n      }\n\n      // Identify numbers\n      if (stream.match(/\\b\\d+(\\.\\d+)?\\b/)) {\n        return \"number\";\n      }\n\n      // Identify strings\n      if (stream.match(\"'\")) {\n        state.tokenize = inString(\"'\", state.tokenize);\n        return \"string\";\n      } else if (stream.match('\"')) {\n        state.tokenize = inString('\"', state.tokenize);\n        return \"string\";\n      }\n\n      // Attempt to match an operator\n      if (stream.match(operators)) {\n        return \"operator\";\n      }\n\n      // Attempt to match a word operator\n      if (stream.match(wordOperators)) {\n        return \"keyword\";\n      }\n\n      // Attempt to match a keyword\n      var keywordMatch = stream.match(keywords);\n      if (keywordMatch) {\n        if (keywordMatch[0] == \"comment\") {\n          state.blockCommentTag = true;\n        }\n        return \"keyword\";\n      }\n\n      // Attempt to match a variable\n      if (stream.match(/\\b(\\w+)\\b/)) {\n        state.waitDot = true;\n        state.waitPipe = true;  // A property can be followed by a filter\n        return \"variable\";\n      }\n\n      // If found closing tag reset\n      if (stream.match(\"%}\")) {\n        state.waitProperty = null;\n        state.waitFilter = null;\n        state.waitDot = null;\n        state.waitPipe = null;\n        // If the tag that closes is a block comment tag, we want to mark the\n        // following code as comment, until the tag closes.\n        if (state.blockCommentTag) {\n          state.blockCommentTag = false;  // Release the \"lock\"\n          state.tokenize = inBlockComment;\n        } else {\n          state.tokenize = tokenBase;\n        }\n        return \"tag\";\n      }\n\n      // If nothing was found, advance to the next character\n      stream.next();\n      return \"null\";\n    }\n\n    // Mark everything as comment inside the tag and the tag itself.\n    function inComment (stream, state) {\n      if (stream.match(/^.*?#\\}/)) state.tokenize = tokenBase\n      else stream.skipToEnd()\n      return \"comment\";\n    }\n\n    // Mark everything as a comment until the `blockcomment` tag closes.\n    function inBlockComment (stream, state) {\n      if (stream.match(/\\{%\\s*endcomment\\s*%\\}/, false)) {\n        state.tokenize = inTag;\n        stream.match(\"{%\");\n        return \"tag\";\n      } else {\n        stream.next();\n        return \"comment\";\n      }\n    }\n\n    return {\n      startState: function () {\n        return {tokenize: tokenBase};\n      },\n      token: function (stream, state) {\n        return state.tokenize(stream, state);\n      },\n      blockCommentStart: \"{% comment %}\",\n      blockCommentEnd: \"{% endcomment %}\"\n    };\n  });\n\n  CodeMirror.defineMode(\"django\", function(config) {\n    var htmlBase = CodeMirror.getMode(config, \"text/html\");\n    var djangoInner = CodeMirror.getMode(config, \"django:inner\");\n    return CodeMirror.overlayMode(htmlBase, djangoInner);\n  });\n\n  CodeMirror.defineMIME(\"text/x-django\", \"django\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/dockerfile/dockerfile.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var from = \"from\";\n  var fromRegex = new RegExp(\"^(\\\\s*)\\\\b(\" + from + \")\\\\b\", \"i\");\n\n  var shells = [\"run\", \"cmd\", \"entrypoint\", \"shell\"];\n  var shellsAsArrayRegex = new RegExp(\"^(\\\\s*)(\" + shells.join('|') + \")(\\\\s+\\\\[)\", \"i\");\n\n  var expose = \"expose\";\n  var exposeRegex = new RegExp(\"^(\\\\s*)(\" + expose + \")(\\\\s+)\", \"i\");\n\n  var others = [\n    \"arg\", \"from\", \"maintainer\", \"label\", \"env\",\n    \"add\", \"copy\", \"volume\", \"user\",\n    \"workdir\", \"onbuild\", \"stopsignal\", \"healthcheck\", \"shell\"\n  ];\n\n  // Collect all Dockerfile directives\n  var instructions = [from, expose].concat(shells).concat(others),\n      instructionRegex = \"(\" + instructions.join('|') + \")\",\n      instructionOnlyLine = new RegExp(\"^(\\\\s*)\" + instructionRegex + \"(\\\\s*)(#.*)?$\", \"i\"),\n      instructionWithArguments = new RegExp(\"^(\\\\s*)\" + instructionRegex + \"(\\\\s+)\", \"i\");\n\n  CodeMirror.defineSimpleMode(\"dockerfile\", {\n    start: [\n      // Block comment: This is a line starting with a comment\n      {\n        regex: /^\\s*#.*$/,\n        sol: true,\n        token: \"comment\"\n      },\n      {\n        regex: fromRegex,\n        token: [null, \"keyword\"],\n        sol: true,\n        next: \"from\"\n      },\n      // Highlight an instruction without any arguments (for convenience)\n      {\n        regex: instructionOnlyLine,\n        token: [null, \"keyword\", null, \"error\"],\n        sol: true\n      },\n      {\n        regex: shellsAsArrayRegex,\n        token: [null, \"keyword\", null],\n        sol: true,\n        next: \"array\"\n      },\n      {\n        regex: exposeRegex,\n        token: [null, \"keyword\", null],\n        sol: true,\n        next: \"expose\"\n      },\n      // Highlight an instruction followed by arguments\n      {\n        regex: instructionWithArguments,\n        token: [null, \"keyword\", null],\n        sol: true,\n        next: \"arguments\"\n      },\n      {\n        regex: /./,\n        token: null\n      }\n    ],\n    from: [\n      {\n        regex: /\\s*$/,\n        token: null,\n        next: \"start\"\n      },\n      {\n        // Line comment without instruction arguments is an error\n        regex: /(\\s*)(#.*)$/,\n        token: [null, \"error\"],\n        next: \"start\"\n      },\n      {\n        regex: /(\\s*\\S+\\s+)(as)/i,\n        token: [null, \"keyword\"],\n        next: \"start\"\n      },\n      // Fail safe return to start\n      {\n        token: null,\n        next: \"start\"\n      }\n    ],\n    single: [\n      {\n        regex: /(?:[^\\\\']|\\\\.)/,\n        token: \"string\"\n      },\n      {\n        regex: /'/,\n        token: \"string\",\n        pop: true\n      }\n    ],\n    double: [\n      {\n        regex: /(?:[^\\\\\"]|\\\\.)/,\n        token: \"string\"\n      },\n      {\n        regex: /\"/,\n        token: \"string\",\n        pop: true\n      }\n    ],\n    array: [\n      {\n        regex: /\\]/,\n        token: null,\n        next: \"start\"\n      },\n      {\n        regex: /\"(?:[^\\\\\"]|\\\\.)*\"?/,\n        token: \"string\"\n      }\n    ],\n    expose: [\n      {\n        regex: /\\d+$/,\n        token: \"number\",\n        next: \"start\"\n      },\n      {\n        regex: /[^\\d]+$/,\n        token: null,\n        next: \"start\"\n      },\n      {\n        regex: /\\d+/,\n        token: \"number\"\n      },\n      {\n        regex: /[^\\d]+/,\n        token: null\n      },\n      // Fail safe return to start\n      {\n        token: null,\n        next: \"start\"\n      }\n    ],\n    arguments: [\n      {\n        regex: /^\\s*#.*$/,\n        sol: true,\n        token: \"comment\"\n      },\n      {\n        regex: /\"(?:[^\\\\\"]|\\\\.)*\"?$/,\n        token: \"string\",\n        next: \"start\"\n      },\n      {\n        regex: /\"/,\n        token: \"string\",\n        push: \"double\"\n      },\n      {\n        regex: /'(?:[^\\\\']|\\\\.)*'?$/,\n        token: \"string\",\n        next: \"start\"\n      },\n      {\n        regex: /'/,\n        token: \"string\",\n        push: \"single\"\n      },\n      {\n        regex: /[^#\"']+[\\\\`]$/,\n        token: null\n      },\n      {\n        regex: /[^#\"']+$/,\n        token: null,\n        next: \"start\"\n      },\n      {\n        regex: /[^#\"']+/,\n        token: null\n      },\n      // Fail safe return to start\n      {\n        token: null,\n        next: \"start\"\n      }\n    ],\n    meta: {\n      lineComment: \"#\"\n    }\n  });\n\n  CodeMirror.defineMIME(\"text/x-dockerfile\", \"dockerfile\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/dtd/dtd.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\n  DTD mode\n  Ported to CodeMirror by Peter Kroon <plakroon@gmail.com>\n  Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues\n  GitHub: @peterkroon\n*/\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"dtd\", function(config) {\n  var indentUnit = config.indentUnit, type;\n  function ret(style, tp) {type = tp; return style;}\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n\n    if (ch == \"<\" && stream.eat(\"!\") ) {\n      if (stream.eatWhile(/[\\-]/)) {\n        state.tokenize = tokenSGMLComment;\n        return tokenSGMLComment(stream, state);\n      } else if (stream.eatWhile(/[\\w]/)) return ret(\"keyword\", \"doindent\");\n    } else if (ch == \"<\" && stream.eat(\"?\")) { //xml declaration\n      state.tokenize = inBlock(\"meta\", \"?>\");\n      return ret(\"meta\", ch);\n    } else if (ch == \"#\" && stream.eatWhile(/[\\w]/)) return ret(\"atom\", \"tag\");\n    else if (ch == \"|\") return ret(\"keyword\", \"separator\");\n    else if (ch.match(/[\\(\\)\\[\\]\\-\\.,\\+\\?>]/)) return ret(null, ch);//if(ch === \">\") return ret(null, \"endtag\"); else\n    else if (ch.match(/[\\[\\]]/)) return ret(\"rule\", ch);\n    else if (ch == \"\\\"\" || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    } else if (stream.eatWhile(/[a-zA-Z\\?\\+\\d]/)) {\n      var sc = stream.current();\n      if( sc.substr(sc.length-1,sc.length).match(/\\?|\\+/) !== null )stream.backUp(1);\n      return ret(\"tag\", \"tag\");\n    } else if (ch == \"%\" || ch == \"*\" ) return ret(\"number\", \"number\");\n    else {\n      stream.eatWhile(/[\\w\\\\\\-_%.{,]/);\n      return ret(null, null);\n    }\n  }\n\n  function tokenSGMLComment(stream, state) {\n    var dashes = 0, ch;\n    while ((ch = stream.next()) != null) {\n      if (dashes >= 2 && ch == \">\") {\n        state.tokenize = tokenBase;\n        break;\n      }\n      dashes = (ch == \"-\") ? dashes + 1 : 0;\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      return ret(\"string\", \"tag\");\n    };\n  }\n\n  function inBlock(style, terminator) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.match(terminator)) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        stream.next();\n      }\n      return style;\n    };\n  }\n\n  return {\n    startState: function(base) {\n      return {tokenize: tokenBase,\n              baseIndent: base || 0,\n              stack: []};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n\n      var context = state.stack[state.stack.length-1];\n      if (stream.current() == \"[\" || type === \"doindent\" || type == \"[\") state.stack.push(\"rule\");\n      else if (type === \"endtag\") state.stack[state.stack.length-1] = \"endtag\";\n      else if (stream.current() == \"]\" || type == \"]\" || (type == \">\" && context == \"rule\")) state.stack.pop();\n      else if (type == \"[\") state.stack.push(\"[\");\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var n = state.stack.length;\n\n      if( textAfter.charAt(0) === ']' )n--;\n      else if(textAfter.substr(textAfter.length-1, textAfter.length) === \">\"){\n        if(textAfter.substr(0,1) === \"<\") {}\n        else if( type == \"doindent\" && textAfter.length > 1 ) {}\n        else if( type == \"doindent\")n--;\n        else if( type == \">\" && textAfter.length > 1) {}\n        else if( type == \"tag\" && textAfter !== \">\") {}\n        else if( type == \"tag\" && state.stack[state.stack.length-1] == \"rule\")n--;\n        else if( type == \"tag\")n++;\n        else if( textAfter === \">\" && state.stack[state.stack.length-1] == \"rule\" && type === \">\")n--;\n        else if( textAfter === \">\" && state.stack[state.stack.length-1] == \"rule\") {}\n        else if( textAfter.substr(0,1) !== \"<\" && textAfter.substr(0,1) === \">\" )n=n-1;\n        else if( textAfter === \">\") {}\n        else n=n-1;\n        //over rule them all\n        if(type == null || type == \"]\")n--;\n      }\n\n      return state.baseIndent + n * indentUnit;\n    },\n\n    electricChars: \"]>\"\n  };\n});\n\nCodeMirror.defineMIME(\"application/xml-dtd\", \"dtd\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/dylan/dylan.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction forEach(arr, f) {\n  for (var i = 0; i < arr.length; i++) f(arr[i], i)\n}\nfunction some(arr, f) {\n  for (var i = 0; i < arr.length; i++) if (f(arr[i], i)) return true\n  return false\n}\n\nCodeMirror.defineMode(\"dylan\", function(_config) {\n  // Words\n  var words = {\n    // Words that introduce unnamed definitions like \"define interface\"\n    unnamedDefinition: [\"interface\"],\n\n    // Words that introduce simple named definitions like \"define library\"\n    namedDefinition: [\"module\", \"library\", \"macro\",\n                      \"C-struct\", \"C-union\",\n                      \"C-function\", \"C-callable-wrapper\"\n                     ],\n\n    // Words that introduce type definitions like \"define class\".\n    // These are also parameterized like \"define method\" and are\n    // appended to otherParameterizedDefinitionWords\n    typeParameterizedDefinition: [\"class\", \"C-subtype\", \"C-mapped-subtype\"],\n\n    // Words that introduce trickier definitions like \"define method\".\n    // These require special definitions to be added to startExpressions\n    otherParameterizedDefinition: [\"method\", \"function\",\n                                   \"C-variable\", \"C-address\"\n                                  ],\n\n    // Words that introduce module constant definitions.\n    // These must also be simple definitions and are\n    // appended to otherSimpleDefinitionWords\n    constantSimpleDefinition: [\"constant\"],\n\n    // Words that introduce module variable definitions.\n    // These must also be simple definitions and are\n    // appended to otherSimpleDefinitionWords\n    variableSimpleDefinition: [\"variable\"],\n\n    // Other words that introduce simple definitions\n    // (without implicit bodies).\n    otherSimpleDefinition: [\"generic\", \"domain\",\n                            \"C-pointer-type\",\n                            \"table\"\n                           ],\n\n    // Words that begin statements with implicit bodies.\n    statement: [\"if\", \"block\", \"begin\", \"method\", \"case\",\n                \"for\", \"select\", \"when\", \"unless\", \"until\",\n                \"while\", \"iterate\", \"profiling\", \"dynamic-bind\"\n               ],\n\n    // Patterns that act as separators in compound statements.\n    // This may include any general pattern that must be indented\n    // specially.\n    separator: [\"finally\", \"exception\", \"cleanup\", \"else\",\n                \"elseif\", \"afterwards\"\n               ],\n\n    // Keywords that do not require special indentation handling,\n    // but which should be highlighted\n    other: [\"above\", \"below\", \"by\", \"from\", \"handler\", \"in\",\n            \"instance\", \"let\", \"local\", \"otherwise\", \"slot\",\n            \"subclass\", \"then\", \"to\", \"keyed-by\", \"virtual\"\n           ],\n\n    // Condition signaling function calls\n    signalingCalls: [\"signal\", \"error\", \"cerror\",\n                     \"break\", \"check-type\", \"abort\"\n                    ]\n  };\n\n  words[\"otherDefinition\"] =\n    words[\"unnamedDefinition\"]\n    .concat(words[\"namedDefinition\"])\n    .concat(words[\"otherParameterizedDefinition\"]);\n\n  words[\"definition\"] =\n    words[\"typeParameterizedDefinition\"]\n    .concat(words[\"otherDefinition\"]);\n\n  words[\"parameterizedDefinition\"] =\n    words[\"typeParameterizedDefinition\"]\n    .concat(words[\"otherParameterizedDefinition\"]);\n\n  words[\"simpleDefinition\"] =\n    words[\"constantSimpleDefinition\"]\n    .concat(words[\"variableSimpleDefinition\"])\n    .concat(words[\"otherSimpleDefinition\"]);\n\n  words[\"keyword\"] =\n    words[\"statement\"]\n    .concat(words[\"separator\"])\n    .concat(words[\"other\"]);\n\n  // Patterns\n  var symbolPattern = \"[-_a-zA-Z?!*@<>$%]+\";\n  var symbol = new RegExp(\"^\" + symbolPattern);\n  var patterns = {\n    // Symbols with special syntax\n    symbolKeyword: symbolPattern + \":\",\n    symbolClass: \"<\" + symbolPattern + \">\",\n    symbolGlobal: \"\\\\*\" + symbolPattern + \"\\\\*\",\n    symbolConstant: \"\\\\$\" + symbolPattern\n  };\n  var patternStyles = {\n    symbolKeyword: \"atom\",\n    symbolClass: \"tag\",\n    symbolGlobal: \"variable-2\",\n    symbolConstant: \"variable-3\"\n  };\n\n  // Compile all patterns to regular expressions\n  for (var patternName in patterns)\n    if (patterns.hasOwnProperty(patternName))\n      patterns[patternName] = new RegExp(\"^\" + patterns[patternName]);\n\n  // Names beginning \"with-\" and \"without-\" are commonly\n  // used as statement macro\n  patterns[\"keyword\"] = [/^with(?:out)?-[-_a-zA-Z?!*@<>$%]+/];\n\n  var styles = {};\n  styles[\"keyword\"] = \"keyword\";\n  styles[\"definition\"] = \"def\";\n  styles[\"simpleDefinition\"] = \"def\";\n  styles[\"signalingCalls\"] = \"builtin\";\n\n  // protected words lookup table\n  var wordLookup = {};\n  var styleLookup = {};\n\n  forEach([\n    \"keyword\",\n    \"definition\",\n    \"simpleDefinition\",\n    \"signalingCalls\"\n  ], function(type) {\n    forEach(words[type], function(word) {\n      wordLookup[word] = type;\n      styleLookup[word] = styles[type];\n    });\n  });\n\n\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n\n  function tokenBase(stream, state) {\n    // String\n    var ch = stream.peek();\n    if (ch == \"'\" || ch == '\"') {\n      stream.next();\n      return chain(stream, state, tokenString(ch, \"string\"));\n    }\n    // Comment\n    else if (ch == \"/\") {\n      stream.next();\n      if (stream.eat(\"*\")) {\n        return chain(stream, state, tokenComment);\n      } else if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      stream.backUp(1);\n    }\n    // Decimal\n    else if (/[+\\-\\d\\.]/.test(ch)) {\n      if (stream.match(/^[+-]?[0-9]*\\.[0-9]*([esdx][+-]?[0-9]+)?/i) ||\n          stream.match(/^[+-]?[0-9]+([esdx][+-]?[0-9]+)/i) ||\n          stream.match(/^[+-]?\\d+/)) {\n        return \"number\";\n      }\n    }\n    // Hash\n    else if (ch == \"#\") {\n      stream.next();\n      // Symbol with string syntax\n      ch = stream.peek();\n      if (ch == '\"') {\n        stream.next();\n        return chain(stream, state, tokenString('\"', \"string\"));\n      }\n      // Binary number\n      else if (ch == \"b\") {\n        stream.next();\n        stream.eatWhile(/[01]/);\n        return \"number\";\n      }\n      // Hex number\n      else if (ch == \"x\") {\n        stream.next();\n        stream.eatWhile(/[\\da-f]/i);\n        return \"number\";\n      }\n      // Octal number\n      else if (ch == \"o\") {\n        stream.next();\n        stream.eatWhile(/[0-7]/);\n        return \"number\";\n      }\n      // Token concatenation in macros\n      else if (ch == '#') {\n        stream.next();\n        return \"punctuation\";\n      }\n      // Sequence literals\n      else if ((ch == '[') || (ch == '(')) {\n        stream.next();\n        return \"bracket\";\n      // Hash symbol\n      } else if (stream.match(/f|t|all-keys|include|key|next|rest/i)) {\n        return \"atom\";\n      } else {\n        stream.eatWhile(/[-a-zA-Z]/);\n        return \"error\";\n      }\n    } else if (ch == \"~\") {\n      stream.next();\n      ch = stream.peek();\n      if (ch == \"=\") {\n        stream.next();\n        ch = stream.peek();\n        if (ch == \"=\") {\n          stream.next();\n          return \"operator\";\n        }\n        return \"operator\";\n      }\n      return \"operator\";\n    } else if (ch == \":\") {\n      stream.next();\n      ch = stream.peek();\n      if (ch == \"=\") {\n        stream.next();\n        return \"operator\";\n      } else if (ch == \":\") {\n        stream.next();\n        return \"punctuation\";\n      }\n    } else if (\"[](){}\".indexOf(ch) != -1) {\n      stream.next();\n      return \"bracket\";\n    } else if (\".,\".indexOf(ch) != -1) {\n      stream.next();\n      return \"punctuation\";\n    } else if (stream.match(\"end\")) {\n      return \"keyword\";\n    }\n    for (var name in patterns) {\n      if (patterns.hasOwnProperty(name)) {\n        var pattern = patterns[name];\n        if ((pattern instanceof Array && some(pattern, function(p) {\n          return stream.match(p);\n        })) || stream.match(pattern))\n          return patternStyles[name];\n      }\n    }\n    if (/[+\\-*\\/^=<>&|]/.test(ch)) {\n      stream.next();\n      return \"operator\";\n    }\n    if (stream.match(\"define\")) {\n      return \"def\";\n    } else {\n      stream.eatWhile(/[\\w\\-]/);\n      // Keyword\n      if (wordLookup.hasOwnProperty(stream.current())) {\n        return styleLookup[stream.current()];\n      } else if (stream.current().match(symbol)) {\n        return \"variable\";\n      } else {\n        stream.next();\n        return \"variable-2\";\n      }\n    }\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, maybeNested = false, nestedCount = 0, ch;\n    while ((ch = stream.next())) {\n      if (ch == \"/\" && maybeEnd) {\n        if (nestedCount > 0) {\n          nestedCount--;\n        } else {\n          state.tokenize = tokenBase;\n          break;\n        }\n      } else if (ch == \"*\" && maybeNested) {\n        nestedCount++;\n      }\n      maybeEnd = (ch == \"*\");\n      maybeNested = (ch == \"/\");\n    }\n    return \"comment\";\n  }\n\n  function tokenString(quote, style) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n          end = true;\n          break;\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !escaped) {\n        state.tokenize = tokenBase;\n      }\n      return style;\n    };\n  }\n\n  // Interface\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        currentIndent: 0\n      };\n    },\n    token: function(stream, state) {\n      if (stream.eatSpace())\n        return null;\n      var style = state.tokenize(stream, state);\n      return style;\n    },\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-dylan\", \"dylan\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/ebnf/ebnf.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"ebnf\", function (config) {\n    var commentType = {slash: 0, parenthesis: 1};\n    var stateType = {comment: 0, _string: 1, characterClass: 2};\n    var bracesMode = null;\n\n    if (config.bracesMode)\n      bracesMode = CodeMirror.getMode(config, config.bracesMode);\n\n    return {\n      startState: function () {\n        return {\n          stringType: null,\n          commentType: null,\n          braced: 0,\n          lhs: true,\n          localState: null,\n          stack: [],\n          inDefinition: false\n        };\n      },\n      token: function (stream, state) {\n        if (!stream) return;\n\n        //check for state changes\n        if (state.stack.length === 0) {\n          //strings\n          if ((stream.peek() == '\"') || (stream.peek() == \"'\")) {\n            state.stringType = stream.peek();\n            stream.next(); // Skip quote\n            state.stack.unshift(stateType._string);\n          } else if (stream.match('/*')) { //comments starting with /*\n            state.stack.unshift(stateType.comment);\n            state.commentType = commentType.slash;\n          } else if (stream.match('(*')) { //comments starting with (*\n            state.stack.unshift(stateType.comment);\n            state.commentType = commentType.parenthesis;\n          }\n        }\n\n        //return state\n        //stack has\n        switch (state.stack[0]) {\n        case stateType._string:\n          while (state.stack[0] === stateType._string && !stream.eol()) {\n            if (stream.peek() === state.stringType) {\n              stream.next(); // Skip quote\n              state.stack.shift(); // Clear flag\n            } else if (stream.peek() === \"\\\\\") {\n              stream.next();\n              stream.next();\n            } else {\n              stream.match(/^.[^\\\\\\\"\\']*/);\n            }\n          }\n          return state.lhs ? \"property string\" : \"string\"; // Token style\n\n        case stateType.comment:\n          while (state.stack[0] === stateType.comment && !stream.eol()) {\n            if (state.commentType === commentType.slash && stream.match('*/')) {\n              state.stack.shift(); // Clear flag\n              state.commentType = null;\n            } else if (state.commentType === commentType.parenthesis && stream.match('*)')) {\n              state.stack.shift(); // Clear flag\n              state.commentType = null;\n            } else {\n              stream.match(/^.[^\\*]*/);\n            }\n          }\n          return \"comment\";\n\n        case stateType.characterClass:\n          while (state.stack[0] === stateType.characterClass && !stream.eol()) {\n            if (!(stream.match(/^[^\\]\\\\]+/) || stream.match('.'))) {\n              state.stack.shift();\n            }\n          }\n          return \"operator\";\n        }\n\n        var peek = stream.peek();\n\n        if (bracesMode !== null && (state.braced || peek === \"{\")) {\n          if (state.localState === null)\n            state.localState = CodeMirror.startState(bracesMode);\n\n          var token = bracesMode.token(stream, state.localState),\n          text = stream.current();\n\n          if (!token) {\n            for (var i = 0; i < text.length; i++) {\n              if (text[i] === \"{\") {\n                if (state.braced === 0) {\n                  token = \"matchingbracket\";\n                }\n                state.braced++;\n              } else if (text[i] === \"}\") {\n                state.braced--;\n                if (state.braced === 0) {\n                  token = \"matchingbracket\";\n                }\n              }\n            }\n          }\n          return token;\n        }\n\n        //no stack\n        switch (peek) {\n        case \"[\":\n          stream.next();\n          state.stack.unshift(stateType.characterClass);\n          return \"bracket\";\n        case \":\":\n        case \"|\":\n        case \";\":\n          stream.next();\n          return \"operator\";\n        case \"%\":\n          if (stream.match(\"%%\")) {\n            return \"header\";\n          } else if (stream.match(/[%][A-Za-z]+/)) {\n            return \"keyword\";\n          } else if (stream.match(/[%][}]/)) {\n            return \"matchingbracket\";\n          }\n          break;\n        case \"/\":\n          if (stream.match(/[\\/][A-Za-z]+/)) {\n          return \"keyword\";\n        }\n        case \"\\\\\":\n          if (stream.match(/[\\][a-z]+/)) {\n            return \"string-2\";\n          }\n        case \".\":\n          if (stream.match(\".\")) {\n            return \"atom\";\n          }\n        case \"*\":\n        case \"-\":\n        case \"+\":\n        case \"^\":\n          if (stream.match(peek)) {\n            return \"atom\";\n          }\n        case \"$\":\n          if (stream.match(\"$$\")) {\n            return \"builtin\";\n          } else if (stream.match(/[$][0-9]+/)) {\n            return \"variable-3\";\n          }\n        case \"<\":\n          if (stream.match(/<<[a-zA-Z_]+>>/)) {\n            return \"builtin\";\n          }\n        }\n\n        if (stream.match('//')) {\n          stream.skipToEnd();\n          return \"comment\";\n        } else if (stream.match('return')) {\n          return \"operator\";\n        } else if (stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)) {\n          if (stream.match(/(?=[\\(.])/)) {\n            return \"variable\";\n          } else if (stream.match(/(?=[\\s\\n]*[:=])/)) {\n            return \"def\";\n          }\n          return \"variable-2\";\n        } else if ([\"[\", \"]\", \"(\", \")\"].indexOf(stream.peek()) != -1) {\n          stream.next();\n          return \"bracket\";\n        } else if (!stream.eatSpace()) {\n          stream.next();\n        }\n        return null;\n      }\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-ebnf\", \"ebnf\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/ecl/ecl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"ecl\", function(config) {\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  function metaHook(stream, state) {\n    if (!state.startOfLine) return false;\n    stream.skipToEnd();\n    return \"meta\";\n  }\n\n  var indentUnit = config.indentUnit;\n  var keyword = words(\"abs acos allnodes ascii asin asstring atan atan2 ave case choose choosen choosesets clustersize combine correlation cos cosh count covariance cron dataset dedup define denormalize distribute distributed distribution ebcdic enth error evaluate event eventextra eventname exists exp failcode failmessage fetch fromunicode getisvalid global graph group hash hash32 hash64 hashcrc hashmd5 having if index intformat isvalid iterate join keyunicode length library limit ln local log loop map matched matchlength matchposition matchtext matchunicode max merge mergejoin min nolocal nonempty normalize parse pipe power preload process project pull random range rank ranked realformat recordof regexfind regexreplace regroup rejected rollup round roundup row rowdiff sample set sin sinh sizeof soapcall sort sorted sqrt stepped stored sum table tan tanh thisnode topn tounicode transfer trim truncate typeof ungroup unicodeorder variance which workunit xmldecode xmlencode xmltext xmlunicode\");\n  var variable = words(\"apply assert build buildindex evaluate fail keydiff keypatch loadxml nothor notify output parallel sequential soapcall wait\");\n  var variable_2 = words(\"__compressed__ all and any as atmost before beginc++ best between case const counter csv descend encrypt end endc++ endmacro except exclusive expire export extend false few first flat from full function group header heading hole ifblock import in interface joined keep keyed last left limit load local locale lookup macro many maxcount maxlength min skew module named nocase noroot noscan nosort not of only opt or outer overwrite packed partition penalty physicallength pipe quote record relationship repeat return right scan self separator service shared skew skip sql store terminator thor threshold token transform trim true type unicodeorder unsorted validate virtual whole wild within xml xpath\");\n  var variable_3 = words(\"ascii big_endian boolean data decimal ebcdic integer pattern qstring real record rule set of string token udecimal unicode unsigned varstring varunicode\");\n  var builtin = words(\"checkpoint deprecated failcode failmessage failure global independent onwarning persist priority recovery stored success wait when\");\n  var blockKeywords = words(\"catch class do else finally for if switch try while\");\n  var atoms = words(\"true false null\");\n  var hooks = {\"#\": metaHook};\n  var isOperatorChar = /[+\\-*&%=<>!?|\\/]/;\n\n  var curPunc;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (hooks[ch]) {\n      var result = hooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_]/);\n    var cur = stream.current().toLowerCase();\n    if (keyword.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"keyword\";\n    } else if (variable.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"variable\";\n    } else if (variable_2.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"variable-2\";\n    } else if (variable_3.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"variable-3\";\n    } else if (builtin.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"builtin\";\n    } else { //Data types are of from KEYWORD##\n                var i = cur.length - 1;\n                while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_'))\n                        --i;\n\n                if (i > 0) {\n                        var cur2 = cur.substr(0, i + 1);\n                if (variable_3.propertyIsEnumerable(cur2)) {\n                        if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = \"newstatement\";\n                        return \"variable-3\";\n                }\n            }\n    }\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return null;\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !escaped)\n        state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type) {\n    return state.context = new Context(state.indented, col, type, null, state.context);\n  }\n  function popContext(state) {\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if ((curPunc == \";\" || curPunc == \":\") && ctx.type == \"statement\") popContext(state);\n      else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"}\") {\n        while (ctx.type == \"statement\") ctx = popContext(state);\n        if (ctx.type == \"}\") ctx = popContext(state);\n        while (ctx.type == \"statement\") ctx = popContext(state);\n      }\n      else if (curPunc == ctx.type) popContext(state);\n      else if (ctx.type == \"}\" || ctx.type == \"top\" || (ctx.type == \"statement\" && curPunc == \"newstatement\"))\n        pushContext(state, stream.column(), \"statement\");\n      state.startOfLine = false;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return 0;\n      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n      if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n      var closing = firstChar == ctx.type;\n      if (ctx.type == \"statement\") return ctx.indented + (firstChar == \"{\" ? 0 : indentUnit);\n      else if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"{}\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-ecl\", \"ecl\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/eiffel/eiffel.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"eiffel\", function() {\n  function wordObj(words) {\n    var o = {};\n    for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true;\n    return o;\n  }\n  var keywords = wordObj([\n    'note',\n    'across',\n    'when',\n    'variant',\n    'until',\n    'unique',\n    'undefine',\n    'then',\n    'strip',\n    'select',\n    'retry',\n    'rescue',\n    'require',\n    'rename',\n    'reference',\n    'redefine',\n    'prefix',\n    'once',\n    'old',\n    'obsolete',\n    'loop',\n    'local',\n    'like',\n    'is',\n    'inspect',\n    'infix',\n    'include',\n    'if',\n    'frozen',\n    'from',\n    'external',\n    'export',\n    'ensure',\n    'end',\n    'elseif',\n    'else',\n    'do',\n    'creation',\n    'create',\n    'check',\n    'alias',\n    'agent',\n    'separate',\n    'invariant',\n    'inherit',\n    'indexing',\n    'feature',\n    'expanded',\n    'deferred',\n    'class',\n    'Void',\n    'True',\n    'Result',\n    'Precursor',\n    'False',\n    'Current',\n    'create',\n    'attached',\n    'detachable',\n    'as',\n    'and',\n    'implies',\n    'not',\n    'or'\n  ]);\n  var operators = wordObj([\":=\", \"and then\",\"and\", \"or\",\"<<\",\">>\"]);\n\n  function chain(newtok, stream, state) {\n    state.tokenize.push(newtok);\n    return newtok(stream, state);\n  }\n\n  function tokenBase(stream, state) {\n    if (stream.eatSpace()) return null;\n    var ch = stream.next();\n    if (ch == '\"'||ch == \"'\") {\n      return chain(readQuoted(ch, \"string\"), stream, state);\n    } else if (ch == \"-\"&&stream.eat(\"-\")) {\n      stream.skipToEnd();\n      return \"comment\";\n    } else if (ch == \":\"&&stream.eat(\"=\")) {\n      return \"operator\";\n    } else if (/[0-9]/.test(ch)) {\n      stream.eatWhile(/[xXbBCc0-9\\.]/);\n      stream.eat(/[\\?\\!]/);\n      return \"ident\";\n    } else if (/[a-zA-Z_0-9]/.test(ch)) {\n      stream.eatWhile(/[a-zA-Z_0-9]/);\n      stream.eat(/[\\?\\!]/);\n      return \"ident\";\n    } else if (/[=+\\-\\/*^%<>~]/.test(ch)) {\n      stream.eatWhile(/[=+\\-\\/*^%<>~]/);\n      return \"operator\";\n    } else {\n      return null;\n    }\n  }\n\n  function readQuoted(quote, style,  unescaped) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && (unescaped || !escaped)) {\n          state.tokenize.pop();\n          break;\n        }\n        escaped = !escaped && ch == \"%\";\n      }\n      return style;\n    };\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: [tokenBase]};\n    },\n\n    token: function(stream, state) {\n      var style = state.tokenize[state.tokenize.length-1](stream, state);\n      if (style == \"ident\") {\n        var word = stream.current();\n        style = keywords.propertyIsEnumerable(stream.current()) ? \"keyword\"\n          : operators.propertyIsEnumerable(stream.current()) ? \"operator\"\n          : /^[A-Z][A-Z_0-9]*$/g.test(word) ? \"tag\"\n          : /^0[bB][0-1]+$/g.test(word) ? \"number\"\n          : /^0[cC][0-7]+$/g.test(word) ? \"number\"\n          : /^0[xX][a-fA-F0-9]+$/g.test(word) ? \"number\"\n          : /^([0-9]+\\.[0-9]*)|([0-9]*\\.[0-9]+)$/g.test(word) ? \"number\"\n          : /^[0-9]+$/g.test(word) ? \"number\"\n          : \"variable\";\n      }\n      return style;\n    },\n    lineComment: \"--\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-eiffel\", \"eiffel\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/elm/elm.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"elm\", function() {\n\n    function switchState(source, setState, f)\n    {\n      setState(f);\n      return f(source, setState);\n    }\n\n    var lowerRE = /[a-z]/;\n    var upperRE = /[A-Z]/;\n    var innerRE = /[a-zA-Z0-9_]/;\n\n    var digitRE = /[0-9]/;\n    var hexRE = /[0-9A-Fa-f]/;\n    var symbolRE = /[-&*+.\\\\/<>=?^|:]/;\n    var specialRE = /[(),[\\]{}]/;\n    var spacesRE = /[ \\v\\f]/; // newlines are handled in tokenizer\n\n    function normal()\n    {\n      return function(source, setState)\n      {\n        if (source.eatWhile(spacesRE))\n        {\n          return null;\n        }\n\n        var char = source.next();\n\n        if (specialRE.test(char))\n        {\n          return (char === '{' && source.eat('-'))\n            ? switchState(source, setState, chompMultiComment(1))\n            : (char === '[' && source.match('glsl|'))\n                ? switchState(source, setState, chompGlsl)\n                : 'builtin';\n        }\n\n        if (char === '\\'')\n        {\n          return switchState(source, setState, chompChar);\n        }\n\n        if (char === '\"')\n        {\n          return source.eat('\"')\n            ? source.eat('\"')\n                ? switchState(source, setState, chompMultiString)\n                : 'string'\n            : switchState(source, setState, chompSingleString);\n        }\n\n        if (upperRE.test(char))\n        {\n          source.eatWhile(innerRE);\n          return 'variable-2';\n        }\n\n        if (lowerRE.test(char))\n        {\n          var isDef = source.pos === 1;\n          source.eatWhile(innerRE);\n          return isDef ? \"def\" : \"variable\";\n        }\n\n        if (digitRE.test(char))\n        {\n          if (char === '0')\n          {\n            if (source.eat(/[xX]/))\n            {\n              source.eatWhile(hexRE); // should require at least 1\n              return \"number\";\n            }\n          }\n          else\n          {\n            source.eatWhile(digitRE);\n          }\n          if (source.eat('.'))\n          {\n            source.eatWhile(digitRE); // should require at least 1\n          }\n          if (source.eat(/[eE]/))\n          {\n            source.eat(/[-+]/);\n            source.eatWhile(digitRE); // should require at least 1\n          }\n          return \"number\";\n        }\n\n        if (symbolRE.test(char))\n        {\n          if (char === '-' && source.eat('-'))\n          {\n            source.skipToEnd();\n            return \"comment\";\n          }\n          source.eatWhile(symbolRE);\n          return \"keyword\";\n        }\n\n        if (char === '_')\n        {\n          return \"keyword\";\n        }\n\n        return \"error\";\n      }\n    }\n\n    function chompMultiComment(nest)\n    {\n      if (nest == 0)\n      {\n        return normal();\n      }\n      return function(source, setState)\n      {\n        while (!source.eol())\n        {\n          var char = source.next();\n          if (char == '{' && source.eat('-'))\n          {\n            ++nest;\n          }\n          else if (char == '-' && source.eat('}'))\n          {\n            --nest;\n            if (nest === 0)\n            {\n              setState(normal());\n              return 'comment';\n            }\n          }\n        }\n        setState(chompMultiComment(nest));\n        return 'comment';\n      }\n    }\n\n    function chompMultiString(source, setState)\n    {\n      while (!source.eol())\n      {\n        var char = source.next();\n        if (char === '\"' && source.eat('\"') && source.eat('\"'))\n        {\n          setState(normal());\n          return 'string';\n        }\n      }\n      return 'string';\n    }\n\n    function chompSingleString(source, setState)\n    {\n      while (source.skipTo('\\\\\"')) { source.next(); source.next(); }\n      if (source.skipTo('\"'))\n      {\n        source.next();\n        setState(normal());\n        return 'string';\n      }\n      source.skipToEnd();\n      setState(normal());\n      return 'error';\n    }\n\n    function chompChar(source, setState)\n    {\n      while (source.skipTo(\"\\\\'\")) { source.next(); source.next(); }\n      if (source.skipTo(\"'\"))\n      {\n        source.next();\n        setState(normal());\n        return 'string';\n      }\n      source.skipToEnd();\n      setState(normal());\n      return 'error';\n    }\n\n    function chompGlsl(source, setState)\n    {\n      while (!source.eol())\n      {\n        var char = source.next();\n        if (char === '|' && source.eat(']'))\n        {\n          setState(normal());\n          return 'string';\n        }\n      }\n      return 'string';\n    }\n\n    var wellKnownWords = {\n      case: 1,\n      of: 1,\n      as: 1,\n      if: 1,\n      then: 1,\n      else: 1,\n      let: 1,\n      in: 1,\n      type: 1,\n      alias: 1,\n      module: 1,\n      where: 1,\n      import: 1,\n      exposing: 1,\n      port: 1\n    };\n\n    return {\n      startState: function ()  { return { f: normal() }; },\n      copyState:  function (s) { return { f: s.f }; },\n\n      token: function(stream, state) {\n        var type = state.f(stream, function(s) { state.f = s; });\n        var word = stream.current();\n        return (wellKnownWords.hasOwnProperty(word)) ? 'keyword' : type;\n      }\n    };\n\n  });\n\n  CodeMirror.defineMIME(\"text/x-elm\", \"elm\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/erlang/erlang.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*jshint unused:true, eqnull:true, curly:true, bitwise:true */\n/*jshint undef:true, latedef:true, trailing:true */\n/*global CodeMirror:true */\n\n// erlang mode.\n// tokenizer -> token types -> CodeMirror styles\n// tokenizer maintains a parse stack\n// indenter uses the parse stack\n\n// TODO indenter:\n//   bit syntax\n//   old guard/bif/conversion clashes (e.g. \"float/1\")\n//   type/spec/opaque\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMIME(\"text/x-erlang\", \"erlang\");\n\nCodeMirror.defineMode(\"erlang\", function(cmCfg) {\n  \"use strict\";\n\n/////////////////////////////////////////////////////////////////////////////\n// constants\n\n  var typeWords = [\n    \"-type\", \"-spec\", \"-export_type\", \"-opaque\"];\n\n  var keywordWords = [\n    \"after\",\"begin\",\"catch\",\"case\",\"cond\",\"end\",\"fun\",\"if\",\n    \"let\",\"of\",\"query\",\"receive\",\"try\",\"when\"];\n\n  var separatorRE    = /[\\->,;]/;\n  var separatorWords = [\n    \"->\",\";\",\",\"];\n\n  var operatorAtomWords = [\n    \"and\",\"andalso\",\"band\",\"bnot\",\"bor\",\"bsl\",\"bsr\",\"bxor\",\n    \"div\",\"not\",\"or\",\"orelse\",\"rem\",\"xor\"];\n\n  var operatorSymbolRE    = /[\\+\\-\\*\\/<>=\\|:!]/;\n  var operatorSymbolWords = [\n    \"=\",\"+\",\"-\",\"*\",\"/\",\">\",\">=\",\"<\",\"=<\",\"=:=\",\"==\",\"=/=\",\"/=\",\"||\",\"<-\",\"!\"];\n\n  var openParenRE    = /[<\\(\\[\\{]/;\n  var openParenWords = [\n    \"<<\",\"(\",\"[\",\"{\"];\n\n  var closeParenRE    = /[>\\)\\]\\}]/;\n  var closeParenWords = [\n    \"}\",\"]\",\")\",\">>\"];\n\n  var guardWords = [\n    \"is_atom\",\"is_binary\",\"is_bitstring\",\"is_boolean\",\"is_float\",\n    \"is_function\",\"is_integer\",\"is_list\",\"is_number\",\"is_pid\",\n    \"is_port\",\"is_record\",\"is_reference\",\"is_tuple\",\n    \"atom\",\"binary\",\"bitstring\",\"boolean\",\"function\",\"integer\",\"list\",\n    \"number\",\"pid\",\"port\",\"record\",\"reference\",\"tuple\"];\n\n  var bifWords = [\n    \"abs\",\"adler32\",\"adler32_combine\",\"alive\",\"apply\",\"atom_to_binary\",\n    \"atom_to_list\",\"binary_to_atom\",\"binary_to_existing_atom\",\n    \"binary_to_list\",\"binary_to_term\",\"bit_size\",\"bitstring_to_list\",\n    \"byte_size\",\"check_process_code\",\"contact_binary\",\"crc32\",\n    \"crc32_combine\",\"date\",\"decode_packet\",\"delete_module\",\n    \"disconnect_node\",\"element\",\"erase\",\"exit\",\"float\",\"float_to_list\",\n    \"garbage_collect\",\"get\",\"get_keys\",\"group_leader\",\"halt\",\"hd\",\n    \"integer_to_list\",\"internal_bif\",\"iolist_size\",\"iolist_to_binary\",\n    \"is_alive\",\"is_atom\",\"is_binary\",\"is_bitstring\",\"is_boolean\",\n    \"is_float\",\"is_function\",\"is_integer\",\"is_list\",\"is_number\",\"is_pid\",\n    \"is_port\",\"is_process_alive\",\"is_record\",\"is_reference\",\"is_tuple\",\n    \"length\",\"link\",\"list_to_atom\",\"list_to_binary\",\"list_to_bitstring\",\n    \"list_to_existing_atom\",\"list_to_float\",\"list_to_integer\",\n    \"list_to_pid\",\"list_to_tuple\",\"load_module\",\"make_ref\",\"module_loaded\",\n    \"monitor_node\",\"node\",\"node_link\",\"node_unlink\",\"nodes\",\"notalive\",\n    \"now\",\"open_port\",\"pid_to_list\",\"port_close\",\"port_command\",\n    \"port_connect\",\"port_control\",\"pre_loaded\",\"process_flag\",\n    \"process_info\",\"processes\",\"purge_module\",\"put\",\"register\",\n    \"registered\",\"round\",\"self\",\"setelement\",\"size\",\"spawn\",\"spawn_link\",\n    \"spawn_monitor\",\"spawn_opt\",\"split_binary\",\"statistics\",\n    \"term_to_binary\",\"time\",\"throw\",\"tl\",\"trunc\",\"tuple_size\",\n    \"tuple_to_list\",\"unlink\",\"unregister\",\"whereis\"];\n\n// upper case: [A-Z] [Ø-Þ] [À-Ö]\n// lower case: [a-z] [ß-ö] [ø-ÿ]\n  var anumRE       = /[\\w@Ø-ÞÀ-Öß-öø-ÿ]/;\n  var escapesRE    =\n    /[0-7]{1,3}|[bdefnrstv\\\\\"']|\\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/;\n\n/////////////////////////////////////////////////////////////////////////////\n// tokenizer\n\n  function tokenizer(stream,state) {\n    // in multi-line string\n    if (state.in_string) {\n      state.in_string = (!doubleQuote(stream));\n      return rval(state,stream,\"string\");\n    }\n\n    // in multi-line atom\n    if (state.in_atom) {\n      state.in_atom = (!singleQuote(stream));\n      return rval(state,stream,\"atom\");\n    }\n\n    // whitespace\n    if (stream.eatSpace()) {\n      return rval(state,stream,\"whitespace\");\n    }\n\n    // attributes and type specs\n    if (!peekToken(state) &&\n        stream.match(/-\\s*[a-zß-öø-ÿ][\\wØ-ÞÀ-Öß-öø-ÿ]*/)) {\n      if (is_member(stream.current(),typeWords)) {\n        return rval(state,stream,\"type\");\n      }else{\n        return rval(state,stream,\"attribute\");\n      }\n    }\n\n    var ch = stream.next();\n\n    // comment\n    if (ch == '%') {\n      stream.skipToEnd();\n      return rval(state,stream,\"comment\");\n    }\n\n    // colon\n    if (ch == \":\") {\n      return rval(state,stream,\"colon\");\n    }\n\n    // macro\n    if (ch == '?') {\n      stream.eatSpace();\n      stream.eatWhile(anumRE);\n      return rval(state,stream,\"macro\");\n    }\n\n    // record\n    if (ch == \"#\") {\n      stream.eatSpace();\n      stream.eatWhile(anumRE);\n      return rval(state,stream,\"record\");\n    }\n\n    // dollar escape\n    if (ch == \"$\") {\n      if (stream.next() == \"\\\\\" && !stream.match(escapesRE)) {\n        return rval(state,stream,\"error\");\n      }\n      return rval(state,stream,\"number\");\n    }\n\n    // dot\n    if (ch == \".\") {\n      return rval(state,stream,\"dot\");\n    }\n\n    // quoted atom\n    if (ch == '\\'') {\n      if (!(state.in_atom = (!singleQuote(stream)))) {\n        if (stream.match(/\\s*\\/\\s*[0-9]/,false)) {\n          stream.match(/\\s*\\/\\s*[0-9]/,true);\n          return rval(state,stream,\"fun\");      // 'f'/0 style fun\n        }\n        if (stream.match(/\\s*\\(/,false) || stream.match(/\\s*:/,false)) {\n          return rval(state,stream,\"function\");\n        }\n      }\n      return rval(state,stream,\"atom\");\n    }\n\n    // string\n    if (ch == '\"') {\n      state.in_string = (!doubleQuote(stream));\n      return rval(state,stream,\"string\");\n    }\n\n    // variable\n    if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) {\n      stream.eatWhile(anumRE);\n      return rval(state,stream,\"variable\");\n    }\n\n    // atom/keyword/BIF/function\n    if (/[a-z_ß-öø-ÿ]/.test(ch)) {\n      stream.eatWhile(anumRE);\n\n      if (stream.match(/\\s*\\/\\s*[0-9]/,false)) {\n        stream.match(/\\s*\\/\\s*[0-9]/,true);\n        return rval(state,stream,\"fun\");      // f/0 style fun\n      }\n\n      var w = stream.current();\n\n      if (is_member(w,keywordWords)) {\n        return rval(state,stream,\"keyword\");\n      }else if (is_member(w,operatorAtomWords)) {\n        return rval(state,stream,\"operator\");\n      }else if (stream.match(/\\s*\\(/,false)) {\n        // 'put' and 'erlang:put' are bifs, 'foo:put' is not\n        if (is_member(w,bifWords) &&\n            ((peekToken(state).token != \":\") ||\n             (peekToken(state,2).token == \"erlang\"))) {\n          return rval(state,stream,\"builtin\");\n        }else if (is_member(w,guardWords)) {\n          return rval(state,stream,\"guard\");\n        }else{\n          return rval(state,stream,\"function\");\n        }\n      }else if (lookahead(stream) == \":\") {\n        if (w == \"erlang\") {\n          return rval(state,stream,\"builtin\");\n        } else {\n          return rval(state,stream,\"function\");\n        }\n      }else if (is_member(w,[\"true\",\"false\"])) {\n        return rval(state,stream,\"boolean\");\n      }else{\n        return rval(state,stream,\"atom\");\n      }\n    }\n\n    // number\n    var digitRE      = /[0-9]/;\n    var radixRE      = /[0-9a-zA-Z]/;         // 36#zZ style int\n    if (digitRE.test(ch)) {\n      stream.eatWhile(digitRE);\n      if (stream.eat('#')) {                // 36#aZ  style integer\n        if (!stream.eatWhile(radixRE)) {\n          stream.backUp(1);                 //\"36#\" - syntax error\n        }\n      } else if (stream.eat('.')) {       // float\n        if (!stream.eatWhile(digitRE)) {\n          stream.backUp(1);        // \"3.\" - probably end of function\n        } else {\n          if (stream.eat(/[eE]/)) {        // float with exponent\n            if (stream.eat(/[-+]/)) {\n              if (!stream.eatWhile(digitRE)) {\n                stream.backUp(2);            // \"2e-\" - syntax error\n              }\n            } else {\n              if (!stream.eatWhile(digitRE)) {\n                stream.backUp(1);            // \"2e\" - syntax error\n              }\n            }\n          }\n        }\n      }\n      return rval(state,stream,\"number\");   // normal integer\n    }\n\n    // open parens\n    if (nongreedy(stream,openParenRE,openParenWords)) {\n      return rval(state,stream,\"open_paren\");\n    }\n\n    // close parens\n    if (nongreedy(stream,closeParenRE,closeParenWords)) {\n      return rval(state,stream,\"close_paren\");\n    }\n\n    // separators\n    if (greedy(stream,separatorRE,separatorWords)) {\n      return rval(state,stream,\"separator\");\n    }\n\n    // operators\n    if (greedy(stream,operatorSymbolRE,operatorSymbolWords)) {\n      return rval(state,stream,\"operator\");\n    }\n\n    return rval(state,stream,null);\n  }\n\n/////////////////////////////////////////////////////////////////////////////\n// utilities\n  function nongreedy(stream,re,words) {\n    if (stream.current().length == 1 && re.test(stream.current())) {\n      stream.backUp(1);\n      while (re.test(stream.peek())) {\n        stream.next();\n        if (is_member(stream.current(),words)) {\n          return true;\n        }\n      }\n      stream.backUp(stream.current().length-1);\n    }\n    return false;\n  }\n\n  function greedy(stream,re,words) {\n    if (stream.current().length == 1 && re.test(stream.current())) {\n      while (re.test(stream.peek())) {\n        stream.next();\n      }\n      while (0 < stream.current().length) {\n        if (is_member(stream.current(),words)) {\n          return true;\n        }else{\n          stream.backUp(1);\n        }\n      }\n      stream.next();\n    }\n    return false;\n  }\n\n  function doubleQuote(stream) {\n    return quote(stream, '\"', '\\\\');\n  }\n\n  function singleQuote(stream) {\n    return quote(stream,'\\'','\\\\');\n  }\n\n  function quote(stream,quoteChar,escapeChar) {\n    while (!stream.eol()) {\n      var ch = stream.next();\n      if (ch == quoteChar) {\n        return true;\n      }else if (ch == escapeChar) {\n        stream.next();\n      }\n    }\n    return false;\n  }\n\n  function lookahead(stream) {\n    var m = stream.match(/^\\s*([^\\s%])/, false)\n    return m ? m[1] : \"\";\n  }\n\n  function is_member(element,list) {\n    return (-1 < list.indexOf(element));\n  }\n\n  function rval(state,stream,type) {\n\n    // parse stack\n    pushToken(state,realToken(type,stream));\n\n    // map erlang token type to CodeMirror style class\n    //     erlang             -> CodeMirror tag\n    switch (type) {\n      case \"atom\":        return \"atom\";\n      case \"attribute\":   return \"attribute\";\n      case \"boolean\":     return \"atom\";\n      case \"builtin\":     return \"builtin\";\n      case \"close_paren\": return null;\n      case \"colon\":       return null;\n      case \"comment\":     return \"comment\";\n      case \"dot\":         return null;\n      case \"error\":       return \"error\";\n      case \"fun\":         return \"meta\";\n      case \"function\":    return \"tag\";\n      case \"guard\":       return \"property\";\n      case \"keyword\":     return \"keyword\";\n      case \"macro\":       return \"variable-2\";\n      case \"number\":      return \"number\";\n      case \"open_paren\":  return null;\n      case \"operator\":    return \"operator\";\n      case \"record\":      return \"bracket\";\n      case \"separator\":   return null;\n      case \"string\":      return \"string\";\n      case \"type\":        return \"def\";\n      case \"variable\":    return \"variable\";\n      default:            return null;\n    }\n  }\n\n  function aToken(tok,col,ind,typ) {\n    return {token:  tok,\n            column: col,\n            indent: ind,\n            type:   typ};\n  }\n\n  function realToken(type,stream) {\n    return aToken(stream.current(),\n                 stream.column(),\n                 stream.indentation(),\n                 type);\n  }\n\n  function fakeToken(type) {\n    return aToken(type,0,0,type);\n  }\n\n  function peekToken(state,depth) {\n    var len = state.tokenStack.length;\n    var dep = (depth ? depth : 1);\n\n    if (len < dep) {\n      return false;\n    }else{\n      return state.tokenStack[len-dep];\n    }\n  }\n\n  function pushToken(state,token) {\n\n    if (!(token.type == \"comment\" || token.type == \"whitespace\")) {\n      state.tokenStack = maybe_drop_pre(state.tokenStack,token);\n      state.tokenStack = maybe_drop_post(state.tokenStack);\n    }\n  }\n\n  function maybe_drop_pre(s,token) {\n    var last = s.length-1;\n\n    if (0 < last && s[last].type === \"record\" && token.type === \"dot\") {\n      s.pop();\n    }else if (0 < last && s[last].type === \"group\") {\n      s.pop();\n      s.push(token);\n    }else{\n      s.push(token);\n    }\n    return s;\n  }\n\n  function maybe_drop_post(s) {\n    if (!s.length) return s\n    var last = s.length-1;\n\n    if (s[last].type === \"dot\") {\n      return [];\n    }\n    if (last > 1 && s[last].type === \"fun\" && s[last-1].token === \"fun\") {\n      return s.slice(0,last-1);\n    }\n    switch (s[last].token) {\n      case \"}\":    return d(s,{g:[\"{\"]});\n      case \"]\":    return d(s,{i:[\"[\"]});\n      case \")\":    return d(s,{i:[\"(\"]});\n      case \">>\":   return d(s,{i:[\"<<\"]});\n      case \"end\":  return d(s,{i:[\"begin\",\"case\",\"fun\",\"if\",\"receive\",\"try\"]});\n      case \",\":    return d(s,{e:[\"begin\",\"try\",\"when\",\"->\",\n                                  \",\",\"(\",\"[\",\"{\",\"<<\"]});\n      case \"->\":   return d(s,{r:[\"when\"],\n                               m:[\"try\",\"if\",\"case\",\"receive\"]});\n      case \";\":    return d(s,{E:[\"case\",\"fun\",\"if\",\"receive\",\"try\",\"when\"]});\n      case \"catch\":return d(s,{e:[\"try\"]});\n      case \"of\":   return d(s,{e:[\"case\"]});\n      case \"after\":return d(s,{e:[\"receive\",\"try\"]});\n      default:     return s;\n    }\n  }\n\n  function d(stack,tt) {\n    // stack is a stack of Token objects.\n    // tt is an object; {type:tokens}\n    // type is a char, tokens is a list of token strings.\n    // The function returns (possibly truncated) stack.\n    // It will descend the stack, looking for a Token such that Token.token\n    //  is a member of tokens. If it does not find that, it will normally (but\n    //  see \"E\" below) return stack. If it does find a match, it will remove\n    //  all the Tokens between the top and the matched Token.\n    // If type is \"m\", that is all it does.\n    // If type is \"i\", it will also remove the matched Token and the top Token.\n    // If type is \"g\", like \"i\", but add a fake \"group\" token at the top.\n    // If type is \"r\", it will remove the matched Token, but not the top Token.\n    // If type is \"e\", it will keep the matched Token but not the top Token.\n    // If type is \"E\", it behaves as for type \"e\", except if there is no match,\n    //  in which case it will return an empty stack.\n\n    for (var type in tt) {\n      var len = stack.length-1;\n      var tokens = tt[type];\n      for (var i = len-1; -1 < i ; i--) {\n        if (is_member(stack[i].token,tokens)) {\n          var ss = stack.slice(0,i);\n          switch (type) {\n              case \"m\": return ss.concat(stack[i]).concat(stack[len]);\n              case \"r\": return ss.concat(stack[len]);\n              case \"i\": return ss;\n              case \"g\": return ss.concat(fakeToken(\"group\"));\n              case \"E\": return ss.concat(stack[i]);\n              case \"e\": return ss.concat(stack[i]);\n          }\n        }\n      }\n    }\n    return (type == \"E\" ? [] : stack);\n  }\n\n/////////////////////////////////////////////////////////////////////////////\n// indenter\n\n  function indenter(state,textAfter) {\n    var t;\n    var unit = cmCfg.indentUnit;\n    var wordAfter = wordafter(textAfter);\n    var currT = peekToken(state,1);\n    var prevT = peekToken(state,2);\n\n    if (state.in_string || state.in_atom) {\n      return CodeMirror.Pass;\n    }else if (!prevT) {\n      return 0;\n    }else if (currT.token == \"when\") {\n      return currT.column+unit;\n    }else if (wordAfter === \"when\" && prevT.type === \"function\") {\n      return prevT.indent+unit;\n    }else if (wordAfter === \"(\" && currT.token === \"fun\") {\n      return  currT.column+3;\n    }else if (wordAfter === \"catch\" && (t = getToken(state,[\"try\"]))) {\n      return t.column;\n    }else if (is_member(wordAfter,[\"end\",\"after\",\"of\"])) {\n      t = getToken(state,[\"begin\",\"case\",\"fun\",\"if\",\"receive\",\"try\"]);\n      return t ? t.column : CodeMirror.Pass;\n    }else if (is_member(wordAfter,closeParenWords)) {\n      t = getToken(state,openParenWords);\n      return t ? t.column : CodeMirror.Pass;\n    }else if (is_member(currT.token,[\",\",\"|\",\"||\"]) ||\n              is_member(wordAfter,[\",\",\"|\",\"||\"])) {\n      t = postcommaToken(state);\n      return t ? t.column+t.token.length : unit;\n    }else if (currT.token == \"->\") {\n      if (is_member(prevT.token, [\"receive\",\"case\",\"if\",\"try\"])) {\n        return prevT.column+unit+unit;\n      }else{\n        return prevT.column+unit;\n      }\n    }else if (is_member(currT.token,openParenWords)) {\n      return currT.column+currT.token.length;\n    }else{\n      t = defaultToken(state);\n      return truthy(t) ? t.column+unit : 0;\n    }\n  }\n\n  function wordafter(str) {\n    var m = str.match(/,|[a-z]+|\\}|\\]|\\)|>>|\\|+|\\(/);\n\n    return truthy(m) && (m.index === 0) ? m[0] : \"\";\n  }\n\n  function postcommaToken(state) {\n    var objs = state.tokenStack.slice(0,-1);\n    var i = getTokenIndex(objs,\"type\",[\"open_paren\"]);\n\n    return truthy(objs[i]) ? objs[i] : false;\n  }\n\n  function defaultToken(state) {\n    var objs = state.tokenStack;\n    var stop = getTokenIndex(objs,\"type\",[\"open_paren\",\"separator\",\"keyword\"]);\n    var oper = getTokenIndex(objs,\"type\",[\"operator\"]);\n\n    if (truthy(stop) && truthy(oper) && stop < oper) {\n      return objs[stop+1];\n    } else if (truthy(stop)) {\n      return objs[stop];\n    } else {\n      return false;\n    }\n  }\n\n  function getToken(state,tokens) {\n    var objs = state.tokenStack;\n    var i = getTokenIndex(objs,\"token\",tokens);\n\n    return truthy(objs[i]) ? objs[i] : false;\n  }\n\n  function getTokenIndex(objs,propname,propvals) {\n\n    for (var i = objs.length-1; -1 < i ; i--) {\n      if (is_member(objs[i][propname],propvals)) {\n        return i;\n      }\n    }\n    return false;\n  }\n\n  function truthy(x) {\n    return (x !== false) && (x != null);\n  }\n\n/////////////////////////////////////////////////////////////////////////////\n// this object defines the mode\n\n  return {\n    startState:\n      function() {\n        return {tokenStack: [],\n                in_string:  false,\n                in_atom:    false};\n      },\n\n    token:\n      function(stream, state) {\n        return tokenizer(stream, state);\n      },\n\n    indent:\n      function(state, textAfter) {\n        return indenter(state,textAfter);\n      },\n\n    lineComment: \"%\"\n  };\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/factor/factor.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Factor syntax highlight - simple mode\n//\n// by Dimage Sapelkin (https://github.com/kerabromsmu)\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineSimpleMode(\"factor\", {\n    // The start state contains the rules that are initially used\n    start: [\n      // comments\n      {regex: /#?!.*/, token: \"comment\"},\n      // strings \"\"\", multiline --> state\n      {regex: /\"\"\"/, token: \"string\", next: \"string3\"},\n      {regex: /(STRING:)(\\s)/, token: [\"keyword\", null], next: \"string2\"},\n      {regex: /\\S*?\"/, token: \"string\", next: \"string\"},\n      // numbers: dec, hex, unicode, bin, fractional, complex\n      {regex: /(?:0x[\\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\\-?\\d+.?\\d*)(?=\\s)/, token: \"number\"},\n      //{regex: /[+-]?/} //fractional\n      // definition: defining word, defined word, etc\n      {regex: /((?:GENERIC)|\\:?\\:)(\\s+)(\\S+)(\\s+)(\\()/, token: [\"keyword\", null, \"def\", null, \"bracket\"], next: \"stack\"},\n      // method definition: defining word, type, defined word, etc\n      {regex: /(M\\:)(\\s+)(\\S+)(\\s+)(\\S+)/, token: [\"keyword\", null, \"def\", null, \"tag\"]},\n      // vocabulary using --> state\n      {regex: /USING\\:/, token: \"keyword\", next: \"vocabulary\"},\n      // vocabulary definition/use\n      {regex: /(USE\\:|IN\\:)(\\s+)(\\S+)(?=\\s|$)/, token: [\"keyword\", null, \"tag\"]},\n      // definition: a defining word, defined word\n      {regex: /(\\S+\\:)(\\s+)(\\S+)(?=\\s|$)/, token: [\"keyword\", null, \"def\"]},\n      // \"keywords\", incl. ; t f . [ ] { } defining words\n      {regex: /(?:;|\\\\|t|f|if|loop|while|until|do|PRIVATE>|<PRIVATE|\\.|\\S*\\[|\\]|\\S*\\{|\\})(?=\\s|$)/, token: \"keyword\"},\n      // <constructors> and the like\n      {regex: /\\S+[\\)>\\.\\*\\?]+(?=\\s|$)/, token: \"builtin\"},\n      {regex: /[\\)><]+\\S+(?=\\s|$)/, token: \"builtin\"},\n      // operators\n      {regex: /(?:[\\+\\-\\=\\/\\*<>])(?=\\s|$)/, token: \"keyword\"},\n      // any id (?)\n      {regex: /\\S+/, token: \"variable\"},\n      {regex: /\\s+|./, token: null}\n    ],\n    vocabulary: [\n      {regex: /;/, token: \"keyword\", next: \"start\"},\n      {regex: /\\S+/, token: \"tag\"},\n      {regex: /\\s+|./, token: null}\n    ],\n    string: [\n      {regex: /(?:[^\\\\]|\\\\.)*?\"/, token: \"string\", next: \"start\"},\n      {regex: /.*/, token: \"string\"}\n    ],\n    string2: [\n      {regex: /^;/, token: \"keyword\", next: \"start\"},\n      {regex: /.*/, token: \"string\"}\n    ],\n    string3: [\n      {regex: /(?:[^\\\\]|\\\\.)*?\"\"\"/, token: \"string\", next: \"start\"},\n      {regex: /.*/, token: \"string\"}\n    ],\n    stack: [\n      {regex: /\\)/, token: \"bracket\", next: \"start\"},\n      {regex: /--/, token: \"bracket\"},\n      {regex: /\\S+/, token: \"meta\"},\n      {regex: /\\s+|./, token: null}\n    ],\n    // The meta property contains global information about the mode. It\n    // can contain properties like lineComment, which are supported by\n    // all modes, and also directives like dontIndentStates, which are\n    // specific to simple modes.\n    meta: {\n      dontIndentStates: [\"start\", \"vocabulary\", \"string\", \"string3\", \"stack\"],\n      lineComment: \"!\"\n    }\n  });\n\n  CodeMirror.defineMIME(\"text/x-factor\", \"factor\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/fcl/fcl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"fcl\", function(config) {\n  var indentUnit = config.indentUnit;\n\n  var keywords = {\n      \"term\": true,\n      \"method\": true, \"accu\": true,\n      \"rule\": true, \"then\": true, \"is\": true, \"and\": true, \"or\": true,\n      \"if\": true, \"default\": true\n  };\n\n  var start_blocks = {\n      \"var_input\": true,\n      \"var_output\": true,\n      \"fuzzify\": true,\n      \"defuzzify\": true,\n      \"function_block\": true,\n      \"ruleblock\": true\n  };\n\n  var end_blocks = {\n      \"end_ruleblock\": true,\n      \"end_defuzzify\": true,\n      \"end_function_block\": true,\n      \"end_fuzzify\": true,\n      \"end_var\": true\n  };\n\n  var atoms = {\n      \"true\": true, \"false\": true, \"nan\": true,\n      \"real\": true, \"min\": true, \"max\": true, \"cog\": true, \"cogs\": true\n  };\n\n  var isOperatorChar = /[+\\-*&^%:=<>!|\\/]/;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n\n    if (/[\\d\\.]/.test(ch)) {\n      if (ch == \".\") {\n        stream.match(/^[0-9]+([eE][\\-+]?[0-9]+)?/);\n      } else if (ch == \"0\") {\n        stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/);\n      } else {\n        stream.match(/^[0-9]*\\.?[0-9]*([eE][\\-+]?[0-9]+)?/);\n      }\n      return \"number\";\n    }\n\n    if (ch == \"/\" || ch == \"(\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n\n    var cur = stream.current().toLowerCase();\n    if (keywords.propertyIsEnumerable(cur) ||\n        start_blocks.propertyIsEnumerable(cur) ||\n        end_blocks.propertyIsEnumerable(cur)) {\n      return \"keyword\";\n    }\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return \"variable\";\n  }\n\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if ((ch == \"/\" || ch == \")\") && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n\n  function pushContext(state, col, type) {\n    return state.context = new Context(state.indented, col, type, null, state.context);\n  }\n\n  function popContext(state) {\n    if (!state.context.prev) return;\n    var t = state.context.type;\n    if (t == \"end_block\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n        var ctx = state.context;\n        if (stream.sol()) {\n            if (ctx.align == null) ctx.align = false;\n            state.indented = stream.indentation();\n            state.startOfLine = true;\n        }\n        if (stream.eatSpace()) return null;\n\n        var style = (state.tokenize || tokenBase)(stream, state);\n        if (style == \"comment\") return style;\n        if (ctx.align == null) ctx.align = true;\n\n        var cur = stream.current().toLowerCase();\n\n        if (start_blocks.propertyIsEnumerable(cur)) pushContext(state, stream.column(), \"end_block\");\n        else if (end_blocks.propertyIsEnumerable(cur))  popContext(state);\n\n        state.startOfLine = false;\n        return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return 0;\n      var ctx = state.context;\n\n      var closing = end_blocks.propertyIsEnumerable(textAfter);\n      if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"ryk\",\n    fold: \"brace\",\n    blockCommentStart: \"(*\",\n    blockCommentEnd: \"*)\",\n    lineComment: \"//\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-fcl\", \"fcl\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/forth/forth.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Author: Aliaksei Chapyzhenka\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function toWordList(words) {\n    var ret = [];\n    words.split(' ').forEach(function(e){\n      ret.push({name: e});\n    });\n    return ret;\n  }\n\n  var coreWordList = toWordList(\n'INVERT AND OR XOR\\\n 2* 2/ LSHIFT RSHIFT\\\n 0= = 0< < > U< MIN MAX\\\n 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP\\\n >R R> R@\\\n + - 1+ 1- ABS NEGATE\\\n S>D * M* UM*\\\n FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD\\\n HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2!\\\n ALIGN ALIGNED +! ALLOT\\\n CHAR [CHAR] [ ] BL\\\n FIND EXECUTE IMMEDIATE COUNT LITERAL STATE\\\n ; DOES> >BODY\\\n EVALUATE\\\n SOURCE >IN\\\n <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL\\\n FILL MOVE\\\n . CR EMIT SPACE SPACES TYPE U. .R U.R\\\n ACCEPT\\\n TRUE FALSE\\\n <> U> 0<> 0>\\\n NIP TUCK ROLL PICK\\\n 2>R 2R@ 2R>\\\n WITHIN UNUSED MARKER\\\n I J\\\n TO\\\n COMPILE, [COMPILE]\\\n SAVE-INPUT RESTORE-INPUT\\\n PAD ERASE\\\n 2LITERAL DNEGATE\\\n D- D+ D0< D0= D2* D2/ D< D= DMAX DMIN D>S DABS\\\n M+ M*/ D. D.R 2ROT DU<\\\n CATCH THROW\\\n FREE RESIZE ALLOCATE\\\n CS-PICK CS-ROLL\\\n GET-CURRENT SET-CURRENT FORTH-WORDLIST GET-ORDER SET-ORDER\\\n PREVIOUS SEARCH-WORDLIST WORDLIST FIND ALSO ONLY FORTH DEFINITIONS ORDER\\\n -TRAILING /STRING SEARCH COMPARE CMOVE CMOVE> BLANK SLITERAL');\n\n  var immediateWordList = toWordList('IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE [IF] [ELSE] [THEN] ?DO DO LOOP +LOOP UNLOOP LEAVE EXIT AGAIN CASE OF ENDOF ENDCASE');\n\n  CodeMirror.defineMode('forth', function() {\n    function searchWordList (wordList, word) {\n      var i;\n      for (i = wordList.length - 1; i >= 0; i--) {\n        if (wordList[i].name === word.toUpperCase()) {\n          return wordList[i];\n        }\n      }\n      return undefined;\n    }\n  return {\n    startState: function() {\n      return {\n        state: '',\n        base: 10,\n        coreWordList: coreWordList,\n        immediateWordList: immediateWordList,\n        wordList: []\n      };\n    },\n    token: function (stream, stt) {\n      var mat;\n      if (stream.eatSpace()) {\n        return null;\n      }\n      if (stt.state === '') { // interpretation\n        if (stream.match(/^(\\]|:NONAME)(\\s|$)/i)) {\n          stt.state = ' compilation';\n          return 'builtin compilation';\n        }\n        mat = stream.match(/^(\\:)\\s+(\\S+)(\\s|$)+/);\n        if (mat) {\n          stt.wordList.push({name: mat[2].toUpperCase()});\n          stt.state = ' compilation';\n          return 'def' + stt.state;\n        }\n        mat = stream.match(/^(VARIABLE|2VARIABLE|CONSTANT|2CONSTANT|CREATE|POSTPONE|VALUE|WORD)\\s+(\\S+)(\\s|$)+/i);\n        if (mat) {\n          stt.wordList.push({name: mat[2].toUpperCase()});\n          return 'def' + stt.state;\n        }\n        mat = stream.match(/^(\\'|\\[\\'\\])\\s+(\\S+)(\\s|$)+/);\n        if (mat) {\n          return 'builtin' + stt.state;\n        }\n        } else { // compilation\n        // ; [\n        if (stream.match(/^(\\;|\\[)(\\s)/)) {\n          stt.state = '';\n          stream.backUp(1);\n          return 'builtin compilation';\n        }\n        if (stream.match(/^(\\;|\\[)($)/)) {\n          stt.state = '';\n          return 'builtin compilation';\n        }\n        if (stream.match(/^(POSTPONE)\\s+\\S+(\\s|$)+/)) {\n          return 'builtin';\n        }\n      }\n\n      // dynamic wordlist\n      mat = stream.match(/^(\\S+)(\\s+|$)/);\n      if (mat) {\n        if (searchWordList(stt.wordList, mat[1]) !== undefined) {\n          return 'variable' + stt.state;\n        }\n\n        // comments\n        if (mat[1] === '\\\\') {\n          stream.skipToEnd();\n            return 'comment' + stt.state;\n          }\n\n          // core words\n          if (searchWordList(stt.coreWordList, mat[1]) !== undefined) {\n            return 'builtin' + stt.state;\n          }\n          if (searchWordList(stt.immediateWordList, mat[1]) !== undefined) {\n            return 'keyword' + stt.state;\n          }\n\n          if (mat[1] === '(') {\n            stream.eatWhile(function (s) { return s !== ')'; });\n            stream.eat(')');\n            return 'comment' + stt.state;\n          }\n\n          // // strings\n          if (mat[1] === '.(') {\n            stream.eatWhile(function (s) { return s !== ')'; });\n            stream.eat(')');\n            return 'string' + stt.state;\n          }\n          if (mat[1] === 'S\"' || mat[1] === '.\"' || mat[1] === 'C\"') {\n            stream.eatWhile(function (s) { return s !== '\"'; });\n            stream.eat('\"');\n            return 'string' + stt.state;\n          }\n\n          // numbers\n          if (mat[1] - 0xfffffffff) {\n            return 'number' + stt.state;\n          }\n          // if (mat[1].match(/^[-+]?[0-9]+\\.[0-9]*/)) {\n          //     return 'number' + stt.state;\n          // }\n\n          return 'atom' + stt.state;\n        }\n      }\n    };\n  });\n  CodeMirror.defineMIME(\"text/x-forth\", \"forth\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/fortran/fortran.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"fortran\", function() {\n  function words(array) {\n    var keys = {};\n    for (var i = 0; i < array.length; ++i) {\n      keys[array[i]] = true;\n    }\n    return keys;\n  }\n\n  var keywords = words([\n                  \"abstract\", \"accept\", \"allocatable\", \"allocate\",\n                  \"array\", \"assign\", \"asynchronous\", \"backspace\",\n                  \"bind\", \"block\", \"byte\", \"call\", \"case\",\n                  \"class\", \"close\", \"common\", \"contains\",\n                  \"continue\", \"cycle\", \"data\", \"deallocate\",\n                  \"decode\", \"deferred\", \"dimension\", \"do\",\n                  \"elemental\", \"else\", \"encode\", \"end\",\n                  \"endif\", \"entry\", \"enumerator\", \"equivalence\",\n                  \"exit\", \"external\", \"extrinsic\", \"final\",\n                  \"forall\", \"format\", \"function\", \"generic\",\n                  \"go\", \"goto\", \"if\", \"implicit\", \"import\", \"include\",\n                  \"inquire\", \"intent\", \"interface\", \"intrinsic\",\n                  \"module\", \"namelist\", \"non_intrinsic\",\n                  \"non_overridable\", \"none\", \"nopass\",\n                  \"nullify\", \"open\", \"optional\", \"options\",\n                  \"parameter\", \"pass\", \"pause\", \"pointer\",\n                  \"print\", \"private\", \"program\", \"protected\",\n                  \"public\", \"pure\", \"read\", \"recursive\", \"result\",\n                  \"return\", \"rewind\", \"save\", \"select\", \"sequence\",\n                  \"stop\", \"subroutine\", \"target\", \"then\", \"to\", \"type\",\n                  \"use\", \"value\", \"volatile\", \"where\", \"while\",\n                  \"write\"]);\n  var builtins = words([\"abort\", \"abs\", \"access\", \"achar\", \"acos\",\n                          \"adjustl\", \"adjustr\", \"aimag\", \"aint\", \"alarm\",\n                          \"all\", \"allocated\", \"alog\", \"amax\", \"amin\",\n                          \"amod\", \"and\", \"anint\", \"any\", \"asin\",\n                          \"associated\", \"atan\", \"besj\", \"besjn\", \"besy\",\n                          \"besyn\", \"bit_size\", \"btest\", \"cabs\", \"ccos\",\n                          \"ceiling\", \"cexp\", \"char\", \"chdir\", \"chmod\",\n                          \"clog\", \"cmplx\", \"command_argument_count\",\n                          \"complex\", \"conjg\", \"cos\", \"cosh\", \"count\",\n                          \"cpu_time\", \"cshift\", \"csin\", \"csqrt\", \"ctime\",\n                          \"c_funloc\", \"c_loc\", \"c_associated\", \"c_null_ptr\",\n                          \"c_null_funptr\", \"c_f_pointer\", \"c_null_char\",\n                          \"c_alert\", \"c_backspace\", \"c_form_feed\",\n                          \"c_new_line\", \"c_carriage_return\",\n                          \"c_horizontal_tab\", \"c_vertical_tab\", \"dabs\",\n                          \"dacos\", \"dasin\", \"datan\", \"date_and_time\",\n                          \"dbesj\", \"dbesj\", \"dbesjn\", \"dbesy\", \"dbesy\",\n                          \"dbesyn\", \"dble\", \"dcos\", \"dcosh\", \"ddim\", \"derf\",\n                          \"derfc\", \"dexp\", \"digits\", \"dim\", \"dint\", \"dlog\",\n                          \"dlog\", \"dmax\", \"dmin\", \"dmod\", \"dnint\",\n                          \"dot_product\", \"dprod\", \"dsign\", \"dsinh\",\n                          \"dsin\", \"dsqrt\", \"dtanh\", \"dtan\", \"dtime\",\n                          \"eoshift\", \"epsilon\", \"erf\", \"erfc\", \"etime\",\n                          \"exit\", \"exp\", \"exponent\", \"extends_type_of\",\n                          \"fdate\", \"fget\", \"fgetc\", \"float\", \"floor\",\n                          \"flush\", \"fnum\", \"fputc\", \"fput\", \"fraction\",\n                          \"fseek\", \"fstat\", \"ftell\", \"gerror\", \"getarg\",\n                          \"get_command\", \"get_command_argument\",\n                          \"get_environment_variable\", \"getcwd\",\n                          \"getenv\", \"getgid\", \"getlog\", \"getpid\",\n                          \"getuid\", \"gmtime\", \"hostnm\", \"huge\", \"iabs\",\n                          \"iachar\", \"iand\", \"iargc\", \"ibclr\", \"ibits\",\n                          \"ibset\", \"ichar\", \"idate\", \"idim\", \"idint\",\n                          \"idnint\", \"ieor\", \"ierrno\", \"ifix\", \"imag\",\n                          \"imagpart\", \"index\", \"int\", \"ior\", \"irand\",\n                          \"isatty\", \"ishft\", \"ishftc\", \"isign\",\n                          \"iso_c_binding\", \"is_iostat_end\", \"is_iostat_eor\",\n                          \"itime\", \"kill\", \"kind\", \"lbound\", \"len\", \"len_trim\",\n                          \"lge\", \"lgt\", \"link\", \"lle\", \"llt\", \"lnblnk\", \"loc\",\n                          \"log\", \"logical\", \"long\", \"lshift\", \"lstat\", \"ltime\",\n                          \"matmul\", \"max\", \"maxexponent\", \"maxloc\", \"maxval\",\n                          \"mclock\", \"merge\", \"move_alloc\", \"min\", \"minexponent\",\n                          \"minloc\", \"minval\", \"mod\", \"modulo\", \"mvbits\",\n                          \"nearest\", \"new_line\", \"nint\", \"not\", \"or\", \"pack\",\n                          \"perror\", \"precision\", \"present\", \"product\", \"radix\",\n                          \"rand\", \"random_number\", \"random_seed\", \"range\",\n                          \"real\", \"realpart\", \"rename\", \"repeat\", \"reshape\",\n                          \"rrspacing\", \"rshift\", \"same_type_as\", \"scale\",\n                          \"scan\", \"second\", \"selected_int_kind\",\n                          \"selected_real_kind\", \"set_exponent\", \"shape\",\n                          \"short\", \"sign\", \"signal\", \"sinh\", \"sin\", \"sleep\",\n                          \"sngl\", \"spacing\", \"spread\", \"sqrt\", \"srand\", \"stat\",\n                          \"sum\", \"symlnk\", \"system\", \"system_clock\", \"tan\",\n                          \"tanh\", \"time\", \"tiny\", \"transfer\", \"transpose\",\n                          \"trim\", \"ttynam\", \"ubound\", \"umask\", \"unlink\",\n                          \"unpack\", \"verify\", \"xor\", \"zabs\", \"zcos\", \"zexp\",\n                          \"zlog\", \"zsin\", \"zsqrt\"]);\n\n    var dataTypes =  words([\"c_bool\", \"c_char\", \"c_double\", \"c_double_complex\",\n                     \"c_float\", \"c_float_complex\", \"c_funptr\", \"c_int\",\n                     \"c_int16_t\", \"c_int32_t\", \"c_int64_t\", \"c_int8_t\",\n                     \"c_int_fast16_t\", \"c_int_fast32_t\", \"c_int_fast64_t\",\n                     \"c_int_fast8_t\", \"c_int_least16_t\", \"c_int_least32_t\",\n                     \"c_int_least64_t\", \"c_int_least8_t\", \"c_intmax_t\",\n                     \"c_intptr_t\", \"c_long\", \"c_long_double\",\n                     \"c_long_double_complex\", \"c_long_long\", \"c_ptr\",\n                     \"c_short\", \"c_signed_char\", \"c_size_t\", \"character\",\n                     \"complex\", \"double\", \"integer\", \"logical\", \"real\"]);\n  var isOperatorChar = /[+\\-*&=<>\\/\\:]/;\n  var litOperator = /^\\.(and|or|eq|lt|le|gt|ge|ne|not|eqv|neqv)\\./i;\n\n  function tokenBase(stream, state) {\n\n    if (stream.match(litOperator)){\n        return 'operator';\n    }\n\n    var ch = stream.next();\n    if (ch == \"!\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (/[\\[\\]\\(\\),]/.test(ch)) {\n      return null;\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_]/);\n    var word = stream.current().toLowerCase();\n\n    if (keywords.hasOwnProperty(word)){\n            return 'keyword';\n    }\n    if (builtins.hasOwnProperty(word) || dataTypes.hasOwnProperty(word)) {\n            return 'builtin';\n    }\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n            end = true;\n            break;\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !escaped) state.tokenize = null;\n      return \"string\";\n    };\n  }\n\n  // Interface\n\n  return {\n    startState: function() {\n      return {tokenize: null};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      return style;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-fortran\", \"fortran\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/gas/gas.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"gas\", function(_config, parserConfig) {\n  'use strict';\n\n  // If an architecture is specified, its initialization function may\n  // populate this array with custom parsing functions which will be\n  // tried in the event that the standard functions do not find a match.\n  var custom = [];\n\n  // The symbol used to start a line comment changes based on the target\n  // architecture.\n  // If no architecture is pased in \"parserConfig\" then only multiline\n  // comments will have syntax support.\n  var lineCommentStartSymbol = \"\";\n\n  // These directives are architecture independent.\n  // Machine specific directives should go in their respective\n  // architecture initialization function.\n  // Reference:\n  // http://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops\n  var directives = {\n    \".abort\" : \"builtin\",\n    \".align\" : \"builtin\",\n    \".altmacro\" : \"builtin\",\n    \".ascii\" : \"builtin\",\n    \".asciz\" : \"builtin\",\n    \".balign\" : \"builtin\",\n    \".balignw\" : \"builtin\",\n    \".balignl\" : \"builtin\",\n    \".bundle_align_mode\" : \"builtin\",\n    \".bundle_lock\" : \"builtin\",\n    \".bundle_unlock\" : \"builtin\",\n    \".byte\" : \"builtin\",\n    \".cfi_startproc\" : \"builtin\",\n    \".comm\" : \"builtin\",\n    \".data\" : \"builtin\",\n    \".def\" : \"builtin\",\n    \".desc\" : \"builtin\",\n    \".dim\" : \"builtin\",\n    \".double\" : \"builtin\",\n    \".eject\" : \"builtin\",\n    \".else\" : \"builtin\",\n    \".elseif\" : \"builtin\",\n    \".end\" : \"builtin\",\n    \".endef\" : \"builtin\",\n    \".endfunc\" : \"builtin\",\n    \".endif\" : \"builtin\",\n    \".equ\" : \"builtin\",\n    \".equiv\" : \"builtin\",\n    \".eqv\" : \"builtin\",\n    \".err\" : \"builtin\",\n    \".error\" : \"builtin\",\n    \".exitm\" : \"builtin\",\n    \".extern\" : \"builtin\",\n    \".fail\" : \"builtin\",\n    \".file\" : \"builtin\",\n    \".fill\" : \"builtin\",\n    \".float\" : \"builtin\",\n    \".func\" : \"builtin\",\n    \".global\" : \"builtin\",\n    \".gnu_attribute\" : \"builtin\",\n    \".hidden\" : \"builtin\",\n    \".hword\" : \"builtin\",\n    \".ident\" : \"builtin\",\n    \".if\" : \"builtin\",\n    \".incbin\" : \"builtin\",\n    \".include\" : \"builtin\",\n    \".int\" : \"builtin\",\n    \".internal\" : \"builtin\",\n    \".irp\" : \"builtin\",\n    \".irpc\" : \"builtin\",\n    \".lcomm\" : \"builtin\",\n    \".lflags\" : \"builtin\",\n    \".line\" : \"builtin\",\n    \".linkonce\" : \"builtin\",\n    \".list\" : \"builtin\",\n    \".ln\" : \"builtin\",\n    \".loc\" : \"builtin\",\n    \".loc_mark_labels\" : \"builtin\",\n    \".local\" : \"builtin\",\n    \".long\" : \"builtin\",\n    \".macro\" : \"builtin\",\n    \".mri\" : \"builtin\",\n    \".noaltmacro\" : \"builtin\",\n    \".nolist\" : \"builtin\",\n    \".octa\" : \"builtin\",\n    \".offset\" : \"builtin\",\n    \".org\" : \"builtin\",\n    \".p2align\" : \"builtin\",\n    \".popsection\" : \"builtin\",\n    \".previous\" : \"builtin\",\n    \".print\" : \"builtin\",\n    \".protected\" : \"builtin\",\n    \".psize\" : \"builtin\",\n    \".purgem\" : \"builtin\",\n    \".pushsection\" : \"builtin\",\n    \".quad\" : \"builtin\",\n    \".reloc\" : \"builtin\",\n    \".rept\" : \"builtin\",\n    \".sbttl\" : \"builtin\",\n    \".scl\" : \"builtin\",\n    \".section\" : \"builtin\",\n    \".set\" : \"builtin\",\n    \".short\" : \"builtin\",\n    \".single\" : \"builtin\",\n    \".size\" : \"builtin\",\n    \".skip\" : \"builtin\",\n    \".sleb128\" : \"builtin\",\n    \".space\" : \"builtin\",\n    \".stab\" : \"builtin\",\n    \".string\" : \"builtin\",\n    \".struct\" : \"builtin\",\n    \".subsection\" : \"builtin\",\n    \".symver\" : \"builtin\",\n    \".tag\" : \"builtin\",\n    \".text\" : \"builtin\",\n    \".title\" : \"builtin\",\n    \".type\" : \"builtin\",\n    \".uleb128\" : \"builtin\",\n    \".val\" : \"builtin\",\n    \".version\" : \"builtin\",\n    \".vtable_entry\" : \"builtin\",\n    \".vtable_inherit\" : \"builtin\",\n    \".warning\" : \"builtin\",\n    \".weak\" : \"builtin\",\n    \".weakref\" : \"builtin\",\n    \".word\" : \"builtin\"\n  };\n\n  var registers = {};\n\n  function x86(_parserConfig) {\n    lineCommentStartSymbol = \"#\";\n\n    registers.al  = \"variable\";\n    registers.ah  = \"variable\";\n    registers.ax  = \"variable\";\n    registers.eax = \"variable-2\";\n    registers.rax = \"variable-3\";\n\n    registers.bl  = \"variable\";\n    registers.bh  = \"variable\";\n    registers.bx  = \"variable\";\n    registers.ebx = \"variable-2\";\n    registers.rbx = \"variable-3\";\n\n    registers.cl  = \"variable\";\n    registers.ch  = \"variable\";\n    registers.cx  = \"variable\";\n    registers.ecx = \"variable-2\";\n    registers.rcx = \"variable-3\";\n\n    registers.dl  = \"variable\";\n    registers.dh  = \"variable\";\n    registers.dx  = \"variable\";\n    registers.edx = \"variable-2\";\n    registers.rdx = \"variable-3\";\n\n    registers.si  = \"variable\";\n    registers.esi = \"variable-2\";\n    registers.rsi = \"variable-3\";\n\n    registers.di  = \"variable\";\n    registers.edi = \"variable-2\";\n    registers.rdi = \"variable-3\";\n\n    registers.sp  = \"variable\";\n    registers.esp = \"variable-2\";\n    registers.rsp = \"variable-3\";\n\n    registers.bp  = \"variable\";\n    registers.ebp = \"variable-2\";\n    registers.rbp = \"variable-3\";\n\n    registers.ip  = \"variable\";\n    registers.eip = \"variable-2\";\n    registers.rip = \"variable-3\";\n\n    registers.cs  = \"keyword\";\n    registers.ds  = \"keyword\";\n    registers.ss  = \"keyword\";\n    registers.es  = \"keyword\";\n    registers.fs  = \"keyword\";\n    registers.gs  = \"keyword\";\n  }\n\n  function armv6(_parserConfig) {\n    // Reference:\n    // http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf\n    // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf\n    lineCommentStartSymbol = \"@\";\n    directives.syntax = \"builtin\";\n\n    registers.r0  = \"variable\";\n    registers.r1  = \"variable\";\n    registers.r2  = \"variable\";\n    registers.r3  = \"variable\";\n    registers.r4  = \"variable\";\n    registers.r5  = \"variable\";\n    registers.r6  = \"variable\";\n    registers.r7  = \"variable\";\n    registers.r8  = \"variable\";\n    registers.r9  = \"variable\";\n    registers.r10 = \"variable\";\n    registers.r11 = \"variable\";\n    registers.r12 = \"variable\";\n\n    registers.sp  = \"variable-2\";\n    registers.lr  = \"variable-2\";\n    registers.pc  = \"variable-2\";\n    registers.r13 = registers.sp;\n    registers.r14 = registers.lr;\n    registers.r15 = registers.pc;\n\n    custom.push(function(ch, stream) {\n      if (ch === '#') {\n        stream.eatWhile(/\\w/);\n        return \"number\";\n      }\n    });\n  }\n\n  var arch = (parserConfig.architecture || \"x86\").toLowerCase();\n  if (arch === \"x86\") {\n    x86(parserConfig);\n  } else if (arch === \"arm\" || arch === \"armv6\") {\n    armv6(parserConfig);\n  }\n\n  function nextUntilUnescaped(stream, end) {\n    var escaped = false, next;\n    while ((next = stream.next()) != null) {\n      if (next === end && !escaped) {\n        return false;\n      }\n      escaped = !escaped && next === \"\\\\\";\n    }\n    return escaped;\n  }\n\n  function clikeComment(stream, state) {\n    var maybeEnd = false, ch;\n    while ((ch = stream.next()) != null) {\n      if (ch === \"/\" && maybeEnd) {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch === \"*\");\n    }\n    return \"comment\";\n  }\n\n  return {\n    startState: function() {\n      return {\n        tokenize: null\n      };\n    },\n\n    token: function(stream, state) {\n      if (state.tokenize) {\n        return state.tokenize(stream, state);\n      }\n\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      var style, cur, ch = stream.next();\n\n      if (ch === \"/\") {\n        if (stream.eat(\"*\")) {\n          state.tokenize = clikeComment;\n          return clikeComment(stream, state);\n        }\n      }\n\n      if (ch === lineCommentStartSymbol) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n\n      if (ch === '\"') {\n        nextUntilUnescaped(stream, '\"');\n        return \"string\";\n      }\n\n      if (ch === '.') {\n        stream.eatWhile(/\\w/);\n        cur = stream.current().toLowerCase();\n        style = directives[cur];\n        return style || null;\n      }\n\n      if (ch === '=') {\n        stream.eatWhile(/\\w/);\n        return \"tag\";\n      }\n\n      if (ch === '{') {\n        return \"bracket\";\n      }\n\n      if (ch === '}') {\n        return \"bracket\";\n      }\n\n      if (/\\d/.test(ch)) {\n        if (ch === \"0\" && stream.eat(\"x\")) {\n          stream.eatWhile(/[0-9a-fA-F]/);\n          return \"number\";\n        }\n        stream.eatWhile(/\\d/);\n        return \"number\";\n      }\n\n      if (/\\w/.test(ch)) {\n        stream.eatWhile(/\\w/);\n        if (stream.eat(\":\")) {\n          return 'tag';\n        }\n        cur = stream.current().toLowerCase();\n        style = registers[cur];\n        return style || null;\n      }\n\n      for (var i = 0; i < custom.length; i++) {\n        style = custom[i](ch, stream, state);\n        if (style) {\n          return style;\n        }\n      }\n    },\n\n    lineComment: lineCommentStartSymbol,\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\"\n  };\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/gfm/gfm.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../markdown/markdown\"), require(\"../../addon/mode/overlay\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../markdown/markdown\", \"../../addon/mode/overlay\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar urlRE = /^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\\.beep|\\.lwz|\\.xpc|\\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\\.beeps?|xmpp|xri|ymsgr|z39\\.50[rs]?):(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]|\\([^\\s()<>]*\\))+(?:\\([^\\s()<>]*\\)|[^\\s`*!()\\[\\]{};:'\".,<>?«»“”‘’]))/i\n\nCodeMirror.defineMode(\"gfm\", function(config, modeConfig) {\n  var codeDepth = 0;\n  function blankLine(state) {\n    state.code = false;\n    return null;\n  }\n  var gfmOverlay = {\n    startState: function() {\n      return {\n        code: false,\n        codeBlock: false,\n        ateSpace: false\n      };\n    },\n    copyState: function(s) {\n      return {\n        code: s.code,\n        codeBlock: s.codeBlock,\n        ateSpace: s.ateSpace\n      };\n    },\n    token: function(stream, state) {\n      state.combineTokens = null;\n\n      // Hack to prevent formatting override inside code blocks (block and inline)\n      if (state.codeBlock) {\n        if (stream.match(/^```+/)) {\n          state.codeBlock = false;\n          return null;\n        }\n        stream.skipToEnd();\n        return null;\n      }\n      if (stream.sol()) {\n        state.code = false;\n      }\n      if (stream.sol() && stream.match(/^```+/)) {\n        stream.skipToEnd();\n        state.codeBlock = true;\n        return null;\n      }\n      // If this block is changed, it may need to be updated in Markdown mode\n      if (stream.peek() === '`') {\n        stream.next();\n        var before = stream.pos;\n        stream.eatWhile('`');\n        var difference = 1 + stream.pos - before;\n        if (!state.code) {\n          codeDepth = difference;\n          state.code = true;\n        } else {\n          if (difference === codeDepth) { // Must be exact\n            state.code = false;\n          }\n        }\n        return null;\n      } else if (state.code) {\n        stream.next();\n        return null;\n      }\n      // Check if space. If so, links can be formatted later on\n      if (stream.eatSpace()) {\n        state.ateSpace = true;\n        return null;\n      }\n      if (stream.sol() || state.ateSpace) {\n        state.ateSpace = false;\n        if (modeConfig.gitHubSpice !== false) {\n          if(stream.match(/^(?:[a-zA-Z0-9\\-_]+\\/)?(?:[a-zA-Z0-9\\-_]+@)?(?=.{0,6}\\d)(?:[a-f0-9]{7,40}\\b)/)) {\n            // User/Project@SHA\n            // User@SHA\n            // SHA\n            state.combineTokens = true;\n            return \"link\";\n          } else if (stream.match(/^(?:[a-zA-Z0-9\\-_]+\\/)?(?:[a-zA-Z0-9\\-_]+)?#[0-9]+\\b/)) {\n            // User/Project#Num\n            // User#Num\n            // #Num\n            state.combineTokens = true;\n            return \"link\";\n          }\n        }\n      }\n      if (stream.match(urlRE) &&\n          stream.string.slice(stream.start - 2, stream.start) != \"](\" &&\n          (stream.start == 0 || /\\W/.test(stream.string.charAt(stream.start - 1)))) {\n        // URLs\n        // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls\n        // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine\n        // And then limited url schemes to the CommonMark list, so foo:bar isn't matched as a URL\n        state.combineTokens = true;\n        return \"link\";\n      }\n      stream.next();\n      return null;\n    },\n    blankLine: blankLine\n  };\n\n  var markdownConfig = {\n    taskLists: true,\n    strikethrough: true,\n    emoji: true\n  };\n  for (var attr in modeConfig) {\n    markdownConfig[attr] = modeConfig[attr];\n  }\n  markdownConfig.name = \"markdown\";\n  return CodeMirror.overlayMode(CodeMirror.getMode(config, markdownConfig), gfmOverlay);\n\n}, \"markdown\");\n\n  CodeMirror.defineMIME(\"text/x-gfm\", \"gfm\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/gherkin/gherkin.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\nGherkin mode - http://www.cukes.info/\nReport bugs/issues here: https://github.com/codemirror/CodeMirror/issues\n*/\n\n// Following Objs from Brackets implementation: https://github.com/tregusti/brackets-gherkin/blob/master/main.js\n//var Quotes = {\n//  SINGLE: 1,\n//  DOUBLE: 2\n//};\n\n//var regex = {\n//  keywords: /(Feature| {2}(Scenario|In order to|As|I)| {4}(Given|When|Then|And))/\n//};\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"gherkin\", function () {\n  return {\n    startState: function () {\n      return {\n        lineNumber: 0,\n        tableHeaderLine: false,\n        allowFeature: true,\n        allowBackground: false,\n        allowScenario: false,\n        allowSteps: false,\n        allowPlaceholders: false,\n        allowMultilineArgument: false,\n        inMultilineString: false,\n        inMultilineTable: false,\n        inKeywordLine: false\n      };\n    },\n    token: function (stream, state) {\n      if (stream.sol()) {\n        state.lineNumber++;\n        state.inKeywordLine = false;\n        if (state.inMultilineTable) {\n            state.tableHeaderLine = false;\n            if (!stream.match(/\\s*\\|/, false)) {\n              state.allowMultilineArgument = false;\n              state.inMultilineTable = false;\n            }\n        }\n      }\n\n      stream.eatSpace();\n\n      if (state.allowMultilineArgument) {\n\n        // STRING\n        if (state.inMultilineString) {\n          if (stream.match('\"\"\"')) {\n            state.inMultilineString = false;\n            state.allowMultilineArgument = false;\n          } else {\n            stream.match(/.*/);\n          }\n          return \"string\";\n        }\n\n        // TABLE\n        if (state.inMultilineTable) {\n          if (stream.match(/\\|\\s*/)) {\n            return \"bracket\";\n          } else {\n            stream.match(/[^\\|]*/);\n            return state.tableHeaderLine ? \"header\" : \"string\";\n          }\n        }\n\n        // DETECT START\n        if (stream.match('\"\"\"')) {\n          // String\n          state.inMultilineString = true;\n          return \"string\";\n        } else if (stream.match(\"|\")) {\n          // Table\n          state.inMultilineTable = true;\n          state.tableHeaderLine = true;\n          return \"bracket\";\n        }\n\n      }\n\n      // LINE COMMENT\n      if (stream.match(/#.*/)) {\n        return \"comment\";\n\n      // TAG\n      } else if (!state.inKeywordLine && stream.match(/@\\S+/)) {\n        return \"tag\";\n\n      // FEATURE\n      } else if (!state.inKeywordLine && state.allowFeature && stream.match(/(機能|功能|フィーチャ|기능|โครงหลัก|ความสามารถ|ความต้องการทางธุรกิจ|ಹೆಚ್ಚಳ|గుణము|ਮੁਹਾਂਦਰਾ|ਨਕਸ਼ ਨੁਹਾਰ|ਖਾਸੀਅਤ|रूप लेख|وِیژگی|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Үзенчәлеклелек|Свойство|Особина|Мөмкинлек|Могућност|Λειτουργία|Δυνατότητα|Właściwość|Vlastnosť|Trajto|Tính năng|Savybė|Pretty much|Požiadavka|Požadavek|Potrzeba biznesowa|Özellik|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Hwæt|Hwaet|Funzionalità|Funktionalitéit|Funktionalität|Funkcja|Funkcionalnost|Funkcionalitāte|Funkcia|Fungsi|Functionaliteit|Funcționalitate|Funcţionalitate|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Fīča|Feature|Eiginleiki|Egenskap|Egenskab|Característica|Caracteristica|Business Need|Aspekt|Arwedd|Ahoy matey!|Ability):/)) {\n        state.allowScenario = true;\n        state.allowBackground = true;\n        state.allowPlaceholders = false;\n        state.allowSteps = false;\n        state.allowMultilineArgument = false;\n        state.inKeywordLine = true;\n        return \"keyword\";\n\n      // BACKGROUND\n      } else if (!state.inKeywordLine && state.allowBackground && stream.match(/(背景|배경|แนวคิด|ಹಿನ್ನೆಲೆ|నేపథ్యం|ਪਿਛੋਕੜ|पृष्ठभूमि|زمینه|الخلفية|רקע|Тарих|Предыстория|Предистория|Позадина|Передумова|Основа|Контекст|Кереш|Υπόβαθρο|Założenia|Yo\\-ho\\-ho|Tausta|Taust|Situācija|Rerefons|Pozadina|Pozadie|Pozadí|Osnova|Latar Belakang|Kontext|Konteksts|Kontekstas|Kontekst|Háttér|Hannergrond|Grundlage|Geçmiş|Fundo|Fono|First off|Dis is what went down|Dasar|Contexto|Contexte|Context|Contesto|Cenário de Fundo|Cenario de Fundo|Cefndir|Bối cảnh|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|Ær|Aer|Achtergrond):/)) {\n        state.allowPlaceholders = false;\n        state.allowSteps = true;\n        state.allowBackground = false;\n        state.allowMultilineArgument = false;\n        state.inKeywordLine = true;\n        return \"keyword\";\n\n      // SCENARIO OUTLINE\n      } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景大綱|场景大纲|劇本大綱|剧本大纲|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|시나리오 개요|สรุปเหตุการณ์|โครงสร้างของเหตุการณ์|ವಿವರಣೆ|కథనం|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ|परिदृश्य रूपरेखा|سيناريو مخطط|الگوی سناریو|תבנית תרחיש|Сценарийның төзелеше|Сценарий структураси|Структура сценарію|Структура сценария|Структура сценарија|Скица|Рамка на сценарий|Концепт|Περιγραφή Σεναρίου|Wharrimean is|Template Situai|Template Senario|Template Keadaan|Tapausaihio|Szenariogrundriss|Szablon scenariusza|Swa hwær swa|Swa hwaer swa|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario konsep|Shiver me timbers|Senaryo taslağı|Schema dello scenario|Scenariomall|Scenariomal|Scenario Template|Scenario Outline|Scenario Amlinellol|Scenārijs pēc parauga|Scenarijaus šablonas|Reckon it's like|Raamstsenaarium|Plang vum Szenario|Plan du Scénario|Plan du scénario|Osnova scénáře|Osnova Scenára|Náčrt Scenáru|Náčrt Scénáře|Náčrt Scenára|MISHUN SRSLY|Menggariskan Senario|Lýsing Dæma|Lýsing Atburðarásar|Konturo de la scenaro|Koncept|Khung tình huống|Khung kịch bản|Forgatókönyv vázlat|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esbozo do escenario|Delineação do Cenário|Delineacao do Cenario|All y'all|Abstrakt Scenario|Abstract Scenario):/)) {\n        state.allowPlaceholders = true;\n        state.allowSteps = true;\n        state.allowMultilineArgument = false;\n        state.inKeywordLine = true;\n        return \"keyword\";\n\n      // EXAMPLES\n      } else if (state.allowScenario && stream.match(/(例子|例|サンプル|예|ชุดของเหตุการณ์|ชุดของตัวอย่าง|ಉದಾಹರಣೆಗಳು|ఉదాహరణలు|ਉਦਾਹਰਨਾਂ|उदाहरण|نمونه ها|امثلة|דוגמאות|Үрнәкләр|Сценарији|Примеры|Примери|Приклади|Мисоллар|Мисаллар|Σενάρια|Παραδείγματα|You'll wanna|Voorbeelden|Variantai|Tapaukset|Se þe|Se the|Se ðe|Scenarios|Scenariji|Scenarijai|Przykłady|Primjeri|Primeri|Příklady|Príklady|Piemēri|Példák|Pavyzdžiai|Paraugs|Örnekler|Juhtumid|Exemplos|Exemples|Exemple|Exempel|EXAMPLZ|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|Dữ liệu|Dead men tell no tales|Dæmi|Contoh|Cenários|Cenarios|Beispiller|Beispiele|Atburðarásir):/)) {\n        state.allowPlaceholders = false;\n        state.allowSteps = true;\n        state.allowBackground = false;\n        state.allowMultilineArgument = true;\n        return \"keyword\";\n\n      // SCENARIO\n      } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景|场景|劇本|剧本|シナリオ|시나리오|เหตุการณ์|ಕಥಾಸಾರಾಂಶ|సన్నివేశం|ਪਟਕਥਾ|परिदृश्य|سيناريو|سناریو|תרחיש|Сценарій|Сценарио|Сценарий|Пример|Σενάριο|Tình huống|The thing of it is|Tapaus|Szenario|Swa|Stsenaarium|Skenario|Situai|Senaryo|Senario|Scenaro|Scenariusz|Scenariu|Scénario|Scenario|Scenarijus|Scenārijs|Scenarij|Scenarie|Scénář|Scenár|Primer|MISHUN|Kịch bản|Keadaan|Heave to|Forgatókönyv|Escenario|Escenari|Cenário|Cenario|Awww, look mate|Atburðarás):/)) {\n        state.allowPlaceholders = false;\n        state.allowSteps = true;\n        state.allowBackground = false;\n        state.allowMultilineArgument = false;\n        state.inKeywordLine = true;\n        return \"keyword\";\n\n      // STEPS\n      } else if (!state.inKeywordLine && state.allowSteps && stream.match(/(那麼|那么|而且|當|当|并且|同時|同时|前提|假设|假設|假定|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|하지만|조건|먼저|만일|만약|단|그리고|그러면|และ |เมื่อ |แต่ |ดังนั้น |กำหนดให้ |ಸ್ಥಿತಿಯನ್ನು |ಮತ್ತು |ನೀಡಿದ |ನಂತರ |ಆದರೆ |మరియు |చెప్పబడినది |కాని |ఈ పరిస్థితిలో |అప్పుడు |ਪਰ |ਤਦ |ਜੇਕਰ |ਜਿਵੇਂ ਕਿ |ਜਦੋਂ |ਅਤੇ |यदि |परन्तु |पर |तब |तदा |तथा |जब |चूंकि |किन्तु |कदा |और |अगर |و |هنگامی |متى |لكن |عندما |ثم |بفرض |با فرض |اما |اذاً |آنگاه |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Һәм |Унда |Тоді |Тогда |То |Также |Та |Пусть |Припустимо, що |Припустимо |Онда |Но |Нехай |Нәтиҗәдә |Лекин |Ләкин |Коли |Когда |Когато |Када |Кад |К тому же |І |И |Задато |Задати |Задате |Если |Допустим |Дано |Дадено |Вә |Ва |Бирок |Әмма |Әйтик |Әгәр |Аммо |Али |Але |Агар |А також |А |Τότε |Όταν |Και |Δεδομένου |Αλλά |Þurh |Þegar |Þa þe |Þá |Þa |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Za předpokladu |Za predpokladu |Youse know when youse got |Youse know like when |Yna |Yeah nah |Y'know |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |wann |Ve |Và |Und |Un |ugeholl |Too right |Thurh |Thì |Then y'all |Then |Tha the |Tha |Tetapi |Tapi |Tak |Tada |Tad |Stel |Soit |Siis |Și |Şi |Si |Sed |Se |Så |Quando |Quand |Quan |Pryd |Potom |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Niin |Nhưng |När |Når |Mutta |Men |Mas |Maka |Majd |Mając |Mais |Maar |mä |Ma |Lorsque |Lorsqu'|Logo |Let go and haul |Kun |Kuid |Kui |Kiedy |Khi |Ketika |Kemudian |Keď |Když |Kaj |Kai |Kada |Kad |Jeżeli |Jeśli |Ja |It's just unbelievable |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben seien |Gegeben sei |Gdy |Gangway! |Fakat |Étant donnés |Etant donnés |Étant données |Etant données |Étant donnée |Etant donnée |Étant donné |Etant donné |Et |És |Entonces |Entón |Então |Entao |En |Eğer ki |Ef |Eeldades |E |Ðurh |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Diberi |Dengan |Den youse gotta |DEN |De |Dato |Dați fiind |Daţi fiind |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann |dann |Dan |Dados |Dado |Dadas |Dada |Ða ðe |Ða |Cuando |Cho |Cando |Când |Cand |Cal |But y'all |But at the end of the day I reckon |BUT |But |Buh |Blimey! |Biết |Bet |Bagi |Aye |awer |Avast! |Atunci |Atesa |Atès |Apabila |Anrhegedig a |Angenommen |And y'all |And |AN |An |an |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Ak |Adott |Ac |Aber |A zároveň |A tiež |A taktiež |A také |A |a |7 |\\* )/)) {\n        state.inStep = true;\n        state.allowPlaceholders = true;\n        state.allowMultilineArgument = true;\n        state.inKeywordLine = true;\n        return \"keyword\";\n\n      // INLINE STRING\n      } else if (stream.match(/\"[^\"]*\"?/)) {\n        return \"string\";\n\n      // PLACEHOLDER\n      } else if (state.allowPlaceholders && stream.match(/<[^>]*>?/)) {\n        return \"variable\";\n\n      // Fall through\n      } else {\n        stream.next();\n        stream.eatWhile(/[^@\"<#]/);\n        return null;\n      }\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-feature\", \"gherkin\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/go/go.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"go\", function(config) {\n  var indentUnit = config.indentUnit;\n\n  var keywords = {\n    \"break\":true, \"case\":true, \"chan\":true, \"const\":true, \"continue\":true,\n    \"default\":true, \"defer\":true, \"else\":true, \"fallthrough\":true, \"for\":true,\n    \"func\":true, \"go\":true, \"goto\":true, \"if\":true, \"import\":true,\n    \"interface\":true, \"map\":true, \"package\":true, \"range\":true, \"return\":true,\n    \"select\":true, \"struct\":true, \"switch\":true, \"type\":true, \"var\":true,\n    \"bool\":true, \"byte\":true, \"complex64\":true, \"complex128\":true,\n    \"float32\":true, \"float64\":true, \"int8\":true, \"int16\":true, \"int32\":true,\n    \"int64\":true, \"string\":true, \"uint8\":true, \"uint16\":true, \"uint32\":true,\n    \"uint64\":true, \"int\":true, \"uint\":true, \"uintptr\":true, \"error\": true,\n    \"rune\":true\n  };\n\n  var atoms = {\n    \"true\":true, \"false\":true, \"iota\":true, \"nil\":true, \"append\":true,\n    \"cap\":true, \"close\":true, \"complex\":true, \"copy\":true, \"delete\":true, \"imag\":true,\n    \"len\":true, \"make\":true, \"new\":true, \"panic\":true, \"print\":true,\n    \"println\":true, \"real\":true, \"recover\":true\n  };\n\n  var isOperatorChar = /[+\\-*&^%:=<>!|\\/]/;\n\n  var curPunc;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\" || ch == \"`\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (/[\\d\\.]/.test(ch)) {\n      if (ch == \".\") {\n        stream.match(/^[0-9]+([eE][\\-+]?[0-9]+)?/);\n      } else if (ch == \"0\") {\n        stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/);\n      } else {\n        stream.match(/^[0-9]*\\.?[0-9]*([eE][\\-+]?[0-9]+)?/);\n      }\n      return \"number\";\n    }\n    if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n    var cur = stream.current();\n    if (keywords.propertyIsEnumerable(cur)) {\n      if (cur == \"case\" || cur == \"default\") curPunc = \"case\";\n      return \"keyword\";\n    }\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && quote != \"`\" && next == \"\\\\\";\n      }\n      if (end || !(escaped || quote == \"`\"))\n        state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type) {\n    return state.context = new Context(state.indented, col, type, null, state.context);\n  }\n  function popContext(state) {\n    if (!state.context.prev) return;\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n        if (ctx.type == \"case\") ctx.type = \"}\";\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"case\") ctx.type = \"case\";\n      else if (curPunc == \"}\" && ctx.type == \"}\") popContext(state);\n      else if (curPunc == ctx.type) popContext(state);\n      state.startOfLine = false;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;\n      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n      if (ctx.type == \"case\" && /^(?:case|default)\\b/.test(textAfter)) {\n        state.context.type = \"}\";\n        return ctx.indented;\n      }\n      var closing = firstChar == ctx.type;\n      if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"{}):\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n    fold: \"brace\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-go\", \"go\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/groovy/groovy.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"groovy\", function(config) {\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  var keywords = words(\n    \"abstract as assert boolean break byte case catch char class const continue def default \" +\n    \"do double else enum extends final finally float for goto if implements import in \" +\n    \"instanceof int interface long native new package private protected public return \" +\n    \"short static strictfp super switch synchronized threadsafe throw throws trait transient \" +\n    \"try void volatile while\");\n  var blockKeywords = words(\"catch class def do else enum finally for if interface switch trait try while\");\n  var standaloneKeywords = words(\"return break continue\");\n  var atoms = words(\"null true false this\");\n\n  var curPunc;\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\") {\n      return startString(ch, stream, state);\n    }\n    if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      if (stream.eat(/eE/)) { stream.eat(/\\+\\-/); stream.eatWhile(/\\d/); }\n      return \"number\";\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize.push(tokenComment);\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      if (expectExpression(state.lastToken, false)) {\n        return startString(ch, stream, state);\n      }\n    }\n    if (ch == \"-\" && stream.eat(\">\")) {\n      curPunc = \"->\";\n      return null;\n    }\n    if (/[+\\-*&%=<>!?|\\/~]/.test(ch)) {\n      stream.eatWhile(/[+\\-*&%=<>|~]/);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_]/);\n    if (ch == \"@\") { stream.eatWhile(/[\\w\\$_\\.]/); return \"meta\"; }\n    if (state.lastToken == \".\") return \"property\";\n    if (stream.eat(\":\")) { curPunc = \"proplabel\"; return \"property\"; }\n    var cur = stream.current();\n    if (atoms.propertyIsEnumerable(cur)) { return \"atom\"; }\n    if (keywords.propertyIsEnumerable(cur)) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      else if (standaloneKeywords.propertyIsEnumerable(cur)) curPunc = \"standalone\";\n      return \"keyword\";\n    }\n    return \"variable\";\n  }\n  tokenBase.isBase = true;\n\n  function startString(quote, stream, state) {\n    var tripleQuoted = false;\n    if (quote != \"/\" && stream.eat(quote)) {\n      if (stream.eat(quote)) tripleQuoted = true;\n      else return \"string\";\n    }\n    function t(stream, state) {\n      var escaped = false, next, end = !tripleQuoted;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n          if (!tripleQuoted) { break; }\n          if (stream.match(quote + quote)) { end = true; break; }\n        }\n        if (quote == '\"' && next == \"$\" && !escaped && stream.eat(\"{\")) {\n          state.tokenize.push(tokenBaseUntilBrace());\n          return \"string\";\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end) state.tokenize.pop();\n      return \"string\";\n    }\n    state.tokenize.push(t);\n    return t(stream, state);\n  }\n\n  function tokenBaseUntilBrace() {\n    var depth = 1;\n    function t(stream, state) {\n      if (stream.peek() == \"}\") {\n        depth--;\n        if (depth == 0) {\n          state.tokenize.pop();\n          return state.tokenize[state.tokenize.length-1](stream, state);\n        }\n      } else if (stream.peek() == \"{\") {\n        depth++;\n      }\n      return tokenBase(stream, state);\n    }\n    t.isBase = true;\n    return t;\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize.pop();\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function expectExpression(last, newline) {\n    return !last || last == \"operator\" || last == \"->\" || /[\\.\\[\\{\\(,;:]/.test(last) ||\n      last == \"newstatement\" || last == \"keyword\" || last == \"proplabel\" ||\n      (last == \"standalone\" && !newline);\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type) {\n    return state.context = new Context(state.indented, col, type, null, state.context);\n  }\n  function popContext(state) {\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: [tokenBase],\n        context: new Context((basecolumn || 0) - config.indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true,\n        lastToken: null\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n        // Automatic semicolon insertion\n        if (ctx.type == \"statement\" && !expectExpression(state.lastToken, true)) {\n          popContext(state); ctx = state.context;\n        }\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      var style = state.tokenize[state.tokenize.length-1](stream, state);\n      if (style == \"comment\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if ((curPunc == \";\" || curPunc == \":\") && ctx.type == \"statement\") popContext(state);\n      // Handle indentation for {x -> \\n ... }\n      else if (curPunc == \"->\" && ctx.type == \"statement\" && ctx.prev.type == \"}\") {\n        popContext(state);\n        state.context.align = false;\n      }\n      else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"}\") {\n        while (ctx.type == \"statement\") ctx = popContext(state);\n        if (ctx.type == \"}\") ctx = popContext(state);\n        while (ctx.type == \"statement\") ctx = popContext(state);\n      }\n      else if (curPunc == ctx.type) popContext(state);\n      else if (ctx.type == \"}\" || ctx.type == \"top\" || (ctx.type == \"statement\" && curPunc == \"newstatement\"))\n        pushContext(state, stream.column(), \"statement\");\n      state.startOfLine = false;\n      state.lastToken = curPunc || style;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (!state.tokenize[state.tokenize.length-1].isBase) return CodeMirror.Pass;\n      var firstChar = textAfter && textAfter.charAt(0), ctx = state.context;\n      if (ctx.type == \"statement\" && !expectExpression(state.lastToken, true)) ctx = ctx.prev;\n      var closing = firstChar == ctx.type;\n      if (ctx.type == \"statement\") return ctx.indented + (firstChar == \"{\" ? 0 : config.indentUnit);\n      else if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : config.indentUnit);\n    },\n\n    electricChars: \"{}\",\n    closeBrackets: {triples: \"'\\\"\"},\n    fold: \"brace\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-groovy\", \"groovy\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/haml/haml.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"), require(\"../ruby/ruby\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\", \"../ruby/ruby\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\n  // full haml mode. This handled embedded ruby and html fragments too\n  CodeMirror.defineMode(\"haml\", function(config) {\n    var htmlMode = CodeMirror.getMode(config, {name: \"htmlmixed\"});\n    var rubyMode = CodeMirror.getMode(config, \"ruby\");\n\n    function rubyInQuote(endQuote) {\n      return function(stream, state) {\n        var ch = stream.peek();\n        if (ch == endQuote && state.rubyState.tokenize.length == 1) {\n          // step out of ruby context as it seems to complete processing all the braces\n          stream.next();\n          state.tokenize = html;\n          return \"closeAttributeTag\";\n        } else {\n          return ruby(stream, state);\n        }\n      };\n    }\n\n    function ruby(stream, state) {\n      if (stream.match(\"-#\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      return rubyMode.token(stream, state.rubyState);\n    }\n\n    function html(stream, state) {\n      var ch = stream.peek();\n\n      // handle haml declarations. All declarations that cant be handled here\n      // will be passed to html mode\n      if (state.previousToken.style == \"comment\" ) {\n        if (state.indented > state.previousToken.indented) {\n          stream.skipToEnd();\n          return \"commentLine\";\n        }\n      }\n\n      if (state.startOfLine) {\n        if (ch == \"!\" && stream.match(\"!!\")) {\n          stream.skipToEnd();\n          return \"tag\";\n        } else if (stream.match(/^%[\\w:#\\.]+=/)) {\n          state.tokenize = ruby;\n          return \"hamlTag\";\n        } else if (stream.match(/^%[\\w:]+/)) {\n          return \"hamlTag\";\n        } else if (ch == \"/\" ) {\n          stream.skipToEnd();\n          return \"comment\";\n        }\n      }\n\n      if (state.startOfLine || state.previousToken.style == \"hamlTag\") {\n        if ( ch == \"#\" || ch == \".\") {\n          stream.match(/[\\w-#\\.]*/);\n          return \"hamlAttribute\";\n        }\n      }\n\n      // do not handle --> as valid ruby, make it HTML close comment instead\n      if (state.startOfLine && !stream.match(\"-->\", false) && (ch == \"=\" || ch == \"-\" )) {\n        state.tokenize = ruby;\n        return state.tokenize(stream, state);\n      }\n\n      if (state.previousToken.style == \"hamlTag\" ||\n          state.previousToken.style == \"closeAttributeTag\" ||\n          state.previousToken.style == \"hamlAttribute\") {\n        if (ch == \"(\") {\n          state.tokenize = rubyInQuote(\")\");\n          return state.tokenize(stream, state);\n        } else if (ch == \"{\") {\n          if (!stream.match(/^\\{%.*/)) {\n            state.tokenize = rubyInQuote(\"}\");\n            return state.tokenize(stream, state);\n          }\n        }\n      }\n\n      return htmlMode.token(stream, state.htmlState);\n    }\n\n    return {\n      // default to html mode\n      startState: function() {\n        var htmlState = CodeMirror.startState(htmlMode);\n        var rubyState = CodeMirror.startState(rubyMode);\n        return {\n          htmlState: htmlState,\n          rubyState: rubyState,\n          indented: 0,\n          previousToken: { style: null, indented: 0},\n          tokenize: html\n        };\n      },\n\n      copyState: function(state) {\n        return {\n          htmlState : CodeMirror.copyState(htmlMode, state.htmlState),\n          rubyState: CodeMirror.copyState(rubyMode, state.rubyState),\n          indented: state.indented,\n          previousToken: state.previousToken,\n          tokenize: state.tokenize\n        };\n      },\n\n      token: function(stream, state) {\n        if (stream.sol()) {\n          state.indented = stream.indentation();\n          state.startOfLine = true;\n        }\n        if (stream.eatSpace()) return null;\n        var style = state.tokenize(stream, state);\n        state.startOfLine = false;\n        // dont record comment line as we only want to measure comment line with\n        // the opening comment block\n        if (style && style != \"commentLine\") {\n          state.previousToken = { style: style, indented: state.indented };\n        }\n        // if current state is ruby and the previous token is not `,` reset the\n        // tokenize to html\n        if (stream.eol() && state.tokenize == ruby) {\n          stream.backUp(1);\n          var ch = stream.peek();\n          stream.next();\n          if (ch && ch != \",\") {\n            state.tokenize = html;\n          }\n        }\n        // reprocess some of the specific style tag when finish setting previousToken\n        if (style == \"hamlTag\") {\n          style = \"tag\";\n        } else if (style == \"commentLine\") {\n          style = \"comment\";\n        } else if (style == \"hamlAttribute\") {\n          style = \"attribute\";\n        } else if (style == \"closeAttributeTag\") {\n          style = null;\n        }\n        return style;\n      }\n    };\n  }, \"htmlmixed\", \"ruby\");\n\n  CodeMirror.defineMIME(\"text/x-haml\", \"haml\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/handlebars/handlebars.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"), require(\"../../addon/mode/multiplex\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\", \"../../addon/mode/multiplex\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineSimpleMode(\"handlebars-tags\", {\n    start: [\n      { regex: /\\{\\{\\{/, push: \"handlebars_raw\", token: \"tag\" },\n      { regex: /\\{\\{!--/, push: \"dash_comment\", token: \"comment\" },\n      { regex: /\\{\\{!/,   push: \"comment\", token: \"comment\" },\n      { regex: /\\{\\{/,    push: \"handlebars\", token: \"tag\" }\n    ],\n    handlebars_raw: [\n      { regex: /\\}\\}\\}/, pop: true, token: \"tag\" },\n    ],\n    handlebars: [\n      { regex: /\\}\\}/, pop: true, token: \"tag\" },\n\n      // Double and single quotes\n      { regex: /\"(?:[^\\\\\"]|\\\\.)*\"?/, token: \"string\" },\n      { regex: /'(?:[^\\\\']|\\\\.)*'?/, token: \"string\" },\n\n      // Handlebars keywords\n      { regex: />|[#\\/]([A-Za-z_]\\w*)/, token: \"keyword\" },\n      { regex: /(?:else|this)\\b/, token: \"keyword\" },\n\n      // Numeral\n      { regex: /\\d+/i, token: \"number\" },\n\n      // Atoms like = and .\n      { regex: /=|~|@|true|false/, token: \"atom\" },\n\n      // Paths\n      { regex: /(?:\\.\\.\\/)*(?:[A-Za-z_][\\w\\.]*)+/, token: \"variable-2\" }\n    ],\n    dash_comment: [\n      { regex: /--\\}\\}/, pop: true, token: \"comment\" },\n\n      // Commented code\n      { regex: /./, token: \"comment\"}\n    ],\n    comment: [\n      { regex: /\\}\\}/, pop: true, token: \"comment\" },\n      { regex: /./, token: \"comment\" }\n    ],\n    meta: {\n      blockCommentStart: \"{{--\",\n      blockCommentEnd: \"--}}\"\n    }\n  });\n\n  CodeMirror.defineMode(\"handlebars\", function(config, parserConfig) {\n    var handlebars = CodeMirror.getMode(config, \"handlebars-tags\");\n    if (!parserConfig || !parserConfig.base) return handlebars;\n    return CodeMirror.multiplexingMode(\n      CodeMirror.getMode(config, parserConfig.base),\n      {open: \"{{\", close: /\\}\\}\\}?/, mode: handlebars, parseDelimiters: true}\n    );\n  });\n\n  CodeMirror.defineMIME(\"text/x-handlebars-template\", \"handlebars\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/haskell/haskell.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"haskell\", function(_config, modeConfig) {\n\n  function switchState(source, setState, f) {\n    setState(f);\n    return f(source, setState);\n  }\n\n  // These should all be Unicode extended, as per the Haskell 2010 report\n  var smallRE = /[a-z_]/;\n  var largeRE = /[A-Z]/;\n  var digitRE = /\\d/;\n  var hexitRE = /[0-9A-Fa-f]/;\n  var octitRE = /[0-7]/;\n  var idRE = /[a-z_A-Z0-9'\\xa1-\\uffff]/;\n  var symbolRE = /[-!#$%&*+.\\/<=>?@\\\\^|~:]/;\n  var specialRE = /[(),;[\\]`{}]/;\n  var whiteCharRE = /[ \\t\\v\\f]/; // newlines are handled in tokenizer\n\n  function normal(source, setState) {\n    if (source.eatWhile(whiteCharRE)) {\n      return null;\n    }\n\n    var ch = source.next();\n    if (specialRE.test(ch)) {\n      if (ch == '{' && source.eat('-')) {\n        var t = \"comment\";\n        if (source.eat('#')) {\n          t = \"meta\";\n        }\n        return switchState(source, setState, ncomment(t, 1));\n      }\n      return null;\n    }\n\n    if (ch == '\\'') {\n      if (source.eat('\\\\')) {\n        source.next();  // should handle other escapes here\n      }\n      else {\n        source.next();\n      }\n      if (source.eat('\\'')) {\n        return \"string\";\n      }\n      return \"string error\";\n    }\n\n    if (ch == '\"') {\n      return switchState(source, setState, stringLiteral);\n    }\n\n    if (largeRE.test(ch)) {\n      source.eatWhile(idRE);\n      if (source.eat('.')) {\n        return \"qualifier\";\n      }\n      return \"variable-2\";\n    }\n\n    if (smallRE.test(ch)) {\n      source.eatWhile(idRE);\n      return \"variable\";\n    }\n\n    if (digitRE.test(ch)) {\n      if (ch == '0') {\n        if (source.eat(/[xX]/)) {\n          source.eatWhile(hexitRE); // should require at least 1\n          return \"integer\";\n        }\n        if (source.eat(/[oO]/)) {\n          source.eatWhile(octitRE); // should require at least 1\n          return \"number\";\n        }\n      }\n      source.eatWhile(digitRE);\n      var t = \"number\";\n      if (source.match(/^\\.\\d+/)) {\n        t = \"number\";\n      }\n      if (source.eat(/[eE]/)) {\n        t = \"number\";\n        source.eat(/[-+]/);\n        source.eatWhile(digitRE); // should require at least 1\n      }\n      return t;\n    }\n\n    if (ch == \".\" && source.eat(\".\"))\n      return \"keyword\";\n\n    if (symbolRE.test(ch)) {\n      if (ch == '-' && source.eat(/-/)) {\n        source.eatWhile(/-/);\n        if (!source.eat(symbolRE)) {\n          source.skipToEnd();\n          return \"comment\";\n        }\n      }\n      var t = \"variable\";\n      if (ch == ':') {\n        t = \"variable-2\";\n      }\n      source.eatWhile(symbolRE);\n      return t;\n    }\n\n    return \"error\";\n  }\n\n  function ncomment(type, nest) {\n    if (nest == 0) {\n      return normal;\n    }\n    return function(source, setState) {\n      var currNest = nest;\n      while (!source.eol()) {\n        var ch = source.next();\n        if (ch == '{' && source.eat('-')) {\n          ++currNest;\n        }\n        else if (ch == '-' && source.eat('}')) {\n          --currNest;\n          if (currNest == 0) {\n            setState(normal);\n            return type;\n          }\n        }\n      }\n      setState(ncomment(type, currNest));\n      return type;\n    };\n  }\n\n  function stringLiteral(source, setState) {\n    while (!source.eol()) {\n      var ch = source.next();\n      if (ch == '\"') {\n        setState(normal);\n        return \"string\";\n      }\n      if (ch == '\\\\') {\n        if (source.eol() || source.eat(whiteCharRE)) {\n          setState(stringGap);\n          return \"string\";\n        }\n        if (source.eat('&')) {\n        }\n        else {\n          source.next(); // should handle other escapes here\n        }\n      }\n    }\n    setState(normal);\n    return \"string error\";\n  }\n\n  function stringGap(source, setState) {\n    if (source.eat('\\\\')) {\n      return switchState(source, setState, stringLiteral);\n    }\n    source.next();\n    setState(normal);\n    return \"error\";\n  }\n\n\n  var wellKnownWords = (function() {\n    var wkw = {};\n    function setType(t) {\n      return function () {\n        for (var i = 0; i < arguments.length; i++)\n          wkw[arguments[i]] = t;\n      };\n    }\n\n    setType(\"keyword\")(\n      \"case\", \"class\", \"data\", \"default\", \"deriving\", \"do\", \"else\", \"foreign\",\n      \"if\", \"import\", \"in\", \"infix\", \"infixl\", \"infixr\", \"instance\", \"let\",\n      \"module\", \"newtype\", \"of\", \"then\", \"type\", \"where\", \"_\");\n\n    setType(\"keyword\")(\n      \"\\.\\.\", \":\", \"::\", \"=\", \"\\\\\", \"<-\", \"->\", \"@\", \"~\", \"=>\");\n\n    setType(\"builtin\")(\n      \"!!\", \"$!\", \"$\", \"&&\", \"+\", \"++\", \"-\", \".\", \"/\", \"/=\", \"<\", \"<*\", \"<=\",\n      \"<$>\", \"<*>\", \"=<<\", \"==\", \">\", \">=\", \">>\", \">>=\", \"^\", \"^^\", \"||\", \"*\",\n      \"*>\", \"**\");\n\n    setType(\"builtin\")(\n      \"Applicative\", \"Bool\", \"Bounded\", \"Char\", \"Double\", \"EQ\", \"Either\", \"Enum\",\n      \"Eq\", \"False\", \"FilePath\", \"Float\", \"Floating\", \"Fractional\", \"Functor\",\n      \"GT\", \"IO\", \"IOError\", \"Int\", \"Integer\", \"Integral\", \"Just\", \"LT\", \"Left\",\n      \"Maybe\", \"Monad\", \"Nothing\", \"Num\", \"Ord\", \"Ordering\", \"Rational\", \"Read\",\n      \"ReadS\", \"Real\", \"RealFloat\", \"RealFrac\", \"Right\", \"Show\", \"ShowS\",\n      \"String\", \"True\");\n\n    setType(\"builtin\")(\n      \"abs\", \"acos\", \"acosh\", \"all\", \"and\", \"any\", \"appendFile\", \"asTypeOf\",\n      \"asin\", \"asinh\", \"atan\", \"atan2\", \"atanh\", \"break\", \"catch\", \"ceiling\",\n      \"compare\", \"concat\", \"concatMap\", \"const\", \"cos\", \"cosh\", \"curry\",\n      \"cycle\", \"decodeFloat\", \"div\", \"divMod\", \"drop\", \"dropWhile\", \"either\",\n      \"elem\", \"encodeFloat\", \"enumFrom\", \"enumFromThen\", \"enumFromThenTo\",\n      \"enumFromTo\", \"error\", \"even\", \"exp\", \"exponent\", \"fail\", \"filter\",\n      \"flip\", \"floatDigits\", \"floatRadix\", \"floatRange\", \"floor\", \"fmap\",\n      \"foldl\", \"foldl1\", \"foldr\", \"foldr1\", \"fromEnum\", \"fromInteger\",\n      \"fromIntegral\", \"fromRational\", \"fst\", \"gcd\", \"getChar\", \"getContents\",\n      \"getLine\", \"head\", \"id\", \"init\", \"interact\", \"ioError\", \"isDenormalized\",\n      \"isIEEE\", \"isInfinite\", \"isNaN\", \"isNegativeZero\", \"iterate\", \"last\",\n      \"lcm\", \"length\", \"lex\", \"lines\", \"log\", \"logBase\", \"lookup\", \"map\",\n      \"mapM\", \"mapM_\", \"max\", \"maxBound\", \"maximum\", \"maybe\", \"min\", \"minBound\",\n      \"minimum\", \"mod\", \"negate\", \"not\", \"notElem\", \"null\", \"odd\", \"or\",\n      \"otherwise\", \"pi\", \"pred\", \"print\", \"product\", \"properFraction\", \"pure\",\n      \"putChar\", \"putStr\", \"putStrLn\", \"quot\", \"quotRem\", \"read\", \"readFile\",\n      \"readIO\", \"readList\", \"readLn\", \"readParen\", \"reads\", \"readsPrec\",\n      \"realToFrac\", \"recip\", \"rem\", \"repeat\", \"replicate\", \"return\", \"reverse\",\n      \"round\", \"scaleFloat\", \"scanl\", \"scanl1\", \"scanr\", \"scanr1\", \"seq\",\n      \"sequence\", \"sequence_\", \"show\", \"showChar\", \"showList\", \"showParen\",\n      \"showString\", \"shows\", \"showsPrec\", \"significand\", \"signum\", \"sin\",\n      \"sinh\", \"snd\", \"span\", \"splitAt\", \"sqrt\", \"subtract\", \"succ\", \"sum\",\n      \"tail\", \"take\", \"takeWhile\", \"tan\", \"tanh\", \"toEnum\", \"toInteger\",\n      \"toRational\", \"truncate\", \"uncurry\", \"undefined\", \"unlines\", \"until\",\n      \"unwords\", \"unzip\", \"unzip3\", \"userError\", \"words\", \"writeFile\", \"zip\",\n      \"zip3\", \"zipWith\", \"zipWith3\");\n\n    var override = modeConfig.overrideKeywords;\n    if (override) for (var word in override) if (override.hasOwnProperty(word))\n      wkw[word] = override[word];\n\n    return wkw;\n  })();\n\n\n\n  return {\n    startState: function ()  { return { f: normal }; },\n    copyState:  function (s) { return { f: s.f }; },\n\n    token: function(stream, state) {\n      var t = state.f(stream, function(s) { state.f = s; });\n      var w = stream.current();\n      return wellKnownWords.hasOwnProperty(w) ? wellKnownWords[w] : t;\n    },\n\n    blockCommentStart: \"{-\",\n    blockCommentEnd: \"-}\",\n    lineComment: \"--\"\n  };\n\n});\n\nCodeMirror.defineMIME(\"text/x-haskell\", \"haskell\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/haskell-literate/haskell-literate.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function (mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../haskell/haskell\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../haskell/haskell\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function (CodeMirror) {\n  \"use strict\"\n\n  CodeMirror.defineMode(\"haskell-literate\", function (config, parserConfig) {\n    var baseMode = CodeMirror.getMode(config, (parserConfig && parserConfig.base) || \"haskell\")\n\n    return {\n      startState: function () {\n        return {\n          inCode: false,\n          baseState: CodeMirror.startState(baseMode)\n        }\n      },\n      token: function (stream, state) {\n        if (stream.sol()) {\n          if (state.inCode = stream.eat(\">\"))\n            return \"meta\"\n        }\n        if (state.inCode) {\n          return baseMode.token(stream, state.baseState)\n        } else {\n          stream.skipToEnd()\n          return \"comment\"\n        }\n      },\n      innerMode: function (state) {\n        return state.inCode ? {state: state.baseState, mode: baseMode} : null\n      }\n    }\n  }, \"haskell\")\n\n  CodeMirror.defineMIME(\"text/x-literate-haskell\", \"haskell-literate\")\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/haxe/haxe.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"haxe\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit;\n\n  // Tokenizer\n\n  function kw(type) {return {type: type, style: \"keyword\"};}\n  var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\");\n  var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"}, attribute = {type:\"attribute\", style: \"attribute\"};\n  var type = kw(\"typedef\");\n  var keywords = {\n    \"if\": A, \"while\": A, \"else\": B, \"do\": B, \"try\": B,\n    \"return\": C, \"break\": C, \"continue\": C, \"new\": C, \"throw\": C,\n    \"var\": kw(\"var\"), \"inline\":attribute, \"static\": attribute, \"using\":kw(\"import\"),\n    \"public\": attribute, \"private\": attribute, \"cast\": kw(\"cast\"), \"import\": kw(\"import\"), \"macro\": kw(\"macro\"),\n    \"function\": kw(\"function\"), \"catch\": kw(\"catch\"), \"untyped\": kw(\"untyped\"), \"callback\": kw(\"cb\"),\n    \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n    \"in\": operator, \"never\": kw(\"property_access\"), \"trace\":kw(\"trace\"),\n    \"class\": type, \"abstract\":type, \"enum\":type, \"interface\":type, \"typedef\":type, \"extends\":type, \"implements\":type, \"dynamic\":type,\n    \"true\": atom, \"false\": atom, \"null\": atom\n  };\n\n  var isOperatorChar = /[+\\-*&%=<>!?|]/;\n\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n\n  function toUnescaped(stream, end) {\n    var escaped = false, next;\n    while ((next = stream.next()) != null) {\n      if (next == end && !escaped)\n        return true;\n      escaped = !escaped && next == \"\\\\\";\n    }\n  }\n\n  // Used as scratch variables to communicate multiple values without\n  // consing up tons of objects.\n  var type, content;\n  function ret(tp, style, cont) {\n    type = tp; content = cont;\n    return style;\n  }\n\n  function haxeTokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\") {\n      return chain(stream, state, haxeTokenString(ch));\n    } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      return ret(ch);\n    } else if (ch == \"0\" && stream.eat(/x/i)) {\n      stream.eatWhile(/[\\da-f]/i);\n      return ret(\"number\", \"number\");\n    } else if (/\\d/.test(ch) || ch == \"-\" && stream.eat(/\\d/)) {\n      stream.match(/^\\d*(?:\\.\\d*(?!\\.))?(?:[eE][+\\-]?\\d+)?/);\n      return ret(\"number\", \"number\");\n    } else if (state.reAllowed && (ch == \"~\" && stream.eat(/\\//))) {\n      toUnescaped(stream, \"/\");\n      stream.eatWhile(/[gimsu]/);\n      return ret(\"regexp\", \"string-2\");\n    } else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        return chain(stream, state, haxeTokenComment);\n      } else if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return ret(\"comment\", \"comment\");\n      } else {\n        stream.eatWhile(isOperatorChar);\n        return ret(\"operator\", null, stream.current());\n      }\n    } else if (ch == \"#\") {\n        stream.skipToEnd();\n        return ret(\"conditional\", \"meta\");\n    } else if (ch == \"@\") {\n      stream.eat(/:/);\n      stream.eatWhile(/[\\w_]/);\n      return ret (\"metadata\", \"meta\");\n    } else if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return ret(\"operator\", null, stream.current());\n    } else {\n      var word;\n      if(/[A-Z]/.test(ch)) {\n        stream.eatWhile(/[\\w_<>]/);\n        word = stream.current();\n        return ret(\"type\", \"variable-3\", word);\n      } else {\n        stream.eatWhile(/[\\w_]/);\n        var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];\n        return (known && state.kwAllowed) ? ret(known.type, known.style, word) :\n                       ret(\"variable\", \"variable\", word);\n      }\n    }\n  }\n\n  function haxeTokenString(quote) {\n    return function(stream, state) {\n      if (toUnescaped(stream, quote))\n        state.tokenize = haxeTokenBase;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  function haxeTokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = haxeTokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  // Parser\n\n  var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true};\n\n  function HaxeLexical(indented, column, type, align, prev, info) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.prev = prev;\n    this.info = info;\n    if (align != null) this.align = align;\n  }\n\n  function inScope(state, varname) {\n    for (var v = state.localVars; v; v = v.next)\n      if (v.name == varname) return true;\n  }\n\n  function parseHaxe(state, style, type, content, stream) {\n    var cc = state.cc;\n    // Communicate our context to the combinators.\n    // (Less wasteful than consing up a hundred closures on every call.)\n    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;\n\n    if (!state.lexical.hasOwnProperty(\"align\"))\n      state.lexical.align = true;\n\n    while(true) {\n      var combinator = cc.length ? cc.pop() : statement;\n      if (combinator(type, content)) {\n        while(cc.length && cc[cc.length - 1].lex)\n          cc.pop()();\n        if (cx.marked) return cx.marked;\n        if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n        if (type == \"variable\" && imported(state, content)) return \"variable-3\";\n        return style;\n      }\n    }\n  }\n\n  function imported(state, typename) {\n    if (/[a-z]/.test(typename.charAt(0)))\n      return false;\n    var len = state.importedtypes.length;\n    for (var i = 0; i<len; i++)\n      if(state.importedtypes[i]==typename) return true;\n  }\n\n  function registerimport(importname) {\n    var state = cx.state;\n    for (var t = state.importedtypes; t; t = t.next)\n      if(t.name == importname) return;\n    state.importedtypes = { name: importname, next: state.importedtypes };\n  }\n  // Combinator utils\n\n  var cx = {state: null, column: null, marked: null, cc: null};\n  function pass() {\n    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n  }\n  function cont() {\n    pass.apply(null, arguments);\n    return true;\n  }\n  function inList(name, list) {\n    for (var v = list; v; v = v.next)\n      if (v.name == name) return true;\n    return false;\n  }\n  function register(varname) {\n    var state = cx.state;\n    if (state.context) {\n      cx.marked = \"def\";\n      if (inList(varname, state.localVars)) return;\n      state.localVars = {name: varname, next: state.localVars};\n    } else if (state.globalVars) {\n      if (inList(varname, state.globalVars)) return;\n      state.globalVars = {name: varname, next: state.globalVars};\n    }\n  }\n\n  // Combinators\n\n  var defaultVars = {name: \"this\", next: null};\n  function pushcontext() {\n    if (!cx.state.context) cx.state.localVars = defaultVars;\n    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};\n  }\n  function popcontext() {\n    cx.state.localVars = cx.state.context.vars;\n    cx.state.context = cx.state.context.prev;\n  }\n  popcontext.lex = true;\n  function pushlex(type, info) {\n    var result = function() {\n      var state = cx.state;\n      state.lexical = new HaxeLexical(state.indented, cx.stream.column(), type, null, state.lexical, info);\n    };\n    result.lex = true;\n    return result;\n  }\n  function poplex() {\n    var state = cx.state;\n    if (state.lexical.prev) {\n      if (state.lexical.type == \")\")\n        state.indented = state.lexical.indented;\n      state.lexical = state.lexical.prev;\n    }\n  }\n  poplex.lex = true;\n\n  function expect(wanted) {\n    function f(type) {\n      if (type == wanted) return cont();\n      else if (wanted == \";\") return pass();\n      else return cont(f);\n    }\n    return f;\n  }\n\n  function statement(type) {\n    if (type == \"@\") return cont(metadef);\n    if (type == \"var\") return cont(pushlex(\"vardef\"), vardef1, expect(\";\"), poplex);\n    if (type == \"keyword a\") return cont(pushlex(\"form\"), expression, statement, poplex);\n    if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n    if (type == \"{\") return cont(pushlex(\"}\"), pushcontext, block, poplex, popcontext);\n    if (type == \";\") return cont();\n    if (type == \"attribute\") return cont(maybeattribute);\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"for\") return cont(pushlex(\"form\"), expect(\"(\"), pushlex(\")\"), forspec1, expect(\")\"),\n                                   poplex, statement, poplex);\n    if (type == \"variable\") return cont(pushlex(\"stat\"), maybelabel);\n    if (type == \"switch\") return cont(pushlex(\"form\"), expression, pushlex(\"}\", \"switch\"), expect(\"{\"),\n                                      block, poplex, poplex);\n    if (type == \"case\") return cont(expression, expect(\":\"));\n    if (type == \"default\") return cont(expect(\":\"));\n    if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, expect(\"(\"), funarg, expect(\")\"),\n                                     statement, poplex, popcontext);\n    if (type == \"import\") return cont(importdef, expect(\";\"));\n    if (type == \"typedef\") return cont(typedef);\n    return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n  }\n  function expression(type) {\n    if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);\n    if (type == \"type\" ) return cont(maybeoperator);\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"keyword c\") return cont(maybeexpression);\n    if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex, maybeoperator);\n    if (type == \"operator\") return cont(expression);\n    if (type == \"[\") return cont(pushlex(\"]\"), commasep(maybeexpression, \"]\"), poplex, maybeoperator);\n    if (type == \"{\") return cont(pushlex(\"}\"), commasep(objprop, \"}\"), poplex, maybeoperator);\n    return cont();\n  }\n  function maybeexpression(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expression);\n  }\n\n  function maybeoperator(type, value) {\n    if (type == \"operator\" && /\\+\\+|--/.test(value)) return cont(maybeoperator);\n    if (type == \"operator\" || type == \":\") return cont(expression);\n    if (type == \";\") return;\n    if (type == \"(\") return cont(pushlex(\")\"), commasep(expression, \")\"), poplex, maybeoperator);\n    if (type == \".\") return cont(property, maybeoperator);\n    if (type == \"[\") return cont(pushlex(\"]\"), expression, expect(\"]\"), poplex, maybeoperator);\n  }\n\n  function maybeattribute(type) {\n    if (type == \"attribute\") return cont(maybeattribute);\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"var\") return cont(vardef1);\n  }\n\n  function metadef(type) {\n    if(type == \":\") return cont(metadef);\n    if(type == \"variable\") return cont(metadef);\n    if(type == \"(\") return cont(pushlex(\")\"), commasep(metaargs, \")\"), poplex, statement);\n  }\n  function metaargs(type) {\n    if(type == \"variable\") return cont();\n  }\n\n  function importdef (type, value) {\n    if(type == \"variable\" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); }\n    else if(type == \"variable\" || type == \"property\" || type == \".\" || value == \"*\") return cont(importdef);\n  }\n\n  function typedef (type, value)\n  {\n    if(type == \"variable\" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); }\n    else if (type == \"type\" && /[A-Z]/.test(value.charAt(0))) { return cont(); }\n  }\n\n  function maybelabel(type) {\n    if (type == \":\") return cont(poplex, statement);\n    return pass(maybeoperator, expect(\";\"), poplex);\n  }\n  function property(type) {\n    if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n  }\n  function objprop(type) {\n    if (type == \"variable\") cx.marked = \"property\";\n    if (atomicTypes.hasOwnProperty(type)) return cont(expect(\":\"), expression);\n  }\n  function commasep(what, end) {\n    function proceed(type) {\n      if (type == \",\") return cont(what, proceed);\n      if (type == end) return cont();\n      return cont(expect(end));\n    }\n    return function(type) {\n      if (type == end) return cont();\n      else return pass(what, proceed);\n    };\n  }\n  function block(type) {\n    if (type == \"}\") return cont();\n    return pass(statement, block);\n  }\n  function vardef1(type, value) {\n    if (type == \"variable\"){register(value); return cont(typeuse, vardef2);}\n    return cont();\n  }\n  function vardef2(type, value) {\n    if (value == \"=\") return cont(expression, vardef2);\n    if (type == \",\") return cont(vardef1);\n  }\n  function forspec1(type, value) {\n    if (type == \"variable\") {\n      register(value);\n      return cont(forin, expression)\n    } else {\n      return pass()\n    }\n  }\n  function forin(_type, value) {\n    if (value == \"in\") return cont();\n  }\n  function functiondef(type, value) {\n    //function names starting with upper-case letters are recognised as types, so cludging them together here.\n    if (type == \"variable\" || type == \"type\") {register(value); return cont(functiondef);}\n    if (value == \"new\") return cont(functiondef);\n    if (type == \"(\") return cont(pushlex(\")\"), pushcontext, commasep(funarg, \")\"), poplex, typeuse, statement, popcontext);\n  }\n  function typeuse(type) {\n    if(type == \":\") return cont(typestring);\n  }\n  function typestring(type) {\n    if(type == \"type\") return cont();\n    if(type == \"variable\") return cont();\n    if(type == \"{\") return cont(pushlex(\"}\"), commasep(typeprop, \"}\"), poplex);\n  }\n  function typeprop(type) {\n    if(type == \"variable\") return cont(typeuse);\n  }\n  function funarg(type, value) {\n    if (type == \"variable\") {register(value); return cont(typeuse);}\n  }\n\n  // Interface\n  return {\n    startState: function(basecolumn) {\n      var defaulttypes = [\"Int\", \"Float\", \"String\", \"Void\", \"Std\", \"Bool\", \"Dynamic\", \"Array\"];\n      var state = {\n        tokenize: haxeTokenBase,\n        reAllowed: true,\n        kwAllowed: true,\n        cc: [],\n        lexical: new HaxeLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n        localVars: parserConfig.localVars,\n        importedtypes: defaulttypes,\n        context: parserConfig.localVars && {vars: parserConfig.localVars},\n        indented: 0\n      };\n      if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n        state.globalVars = parserConfig.globalVars;\n      return state;\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (!state.lexical.hasOwnProperty(\"align\"))\n          state.lexical.align = false;\n        state.indented = stream.indentation();\n      }\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      if (type == \"comment\") return style;\n      state.reAllowed = !!(type == \"operator\" || type == \"keyword c\" || type.match(/^[\\[{}\\(,;:]$/));\n      state.kwAllowed = type != '.';\n      return parseHaxe(state, style, type, content, stream);\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != haxeTokenBase) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;\n      if (lexical.type == \"stat\" && firstChar == \"}\") lexical = lexical.prev;\n      var type = lexical.type, closing = firstChar == type;\n      if (type == \"vardef\") return lexical.indented + 4;\n      else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n      else if (type == \"stat\" || type == \"form\") return lexical.indented + indentUnit;\n      else if (lexical.info == \"switch\" && !closing)\n        return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n      else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n      else return lexical.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"{}\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-haxe\", \"haxe\");\n\nCodeMirror.defineMode(\"hxml\", function () {\n\n  return {\n    startState: function () {\n      return {\n        define: false,\n        inString: false\n      };\n    },\n    token: function (stream, state) {\n      var ch = stream.peek();\n      var sol = stream.sol();\n\n      ///* comments */\n      if (ch == \"#\") {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      if (sol && ch == \"-\") {\n        var style = \"variable-2\";\n\n        stream.eat(/-/);\n\n        if (stream.peek() == \"-\") {\n          stream.eat(/-/);\n          style = \"keyword a\";\n        }\n\n        if (stream.peek() == \"D\") {\n          stream.eat(/[D]/);\n          style = \"keyword c\";\n          state.define = true;\n        }\n\n        stream.eatWhile(/[A-Z]/i);\n        return style;\n      }\n\n      var ch = stream.peek();\n\n      if (state.inString == false && ch == \"'\") {\n        state.inString = true;\n        stream.next();\n      }\n\n      if (state.inString == true) {\n        if (stream.skipTo(\"'\")) {\n\n        } else {\n          stream.skipToEnd();\n        }\n\n        if (stream.peek() == \"'\") {\n          stream.next();\n          state.inString = false;\n        }\n\n        return \"string\";\n      }\n\n      stream.next();\n      return null;\n    },\n    lineComment: \"#\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-hxml\", \"hxml\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/htmlembedded/htmlembedded.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"),\n        require(\"../../addon/mode/multiplex\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\",\n            \"../../addon/mode/multiplex\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"htmlembedded\", function(config, parserConfig) {\n    var closeComment = parserConfig.closeComment || \"--%>\"\n    return CodeMirror.multiplexingMode(CodeMirror.getMode(config, \"htmlmixed\"), {\n      open: parserConfig.openComment || \"<%--\",\n      close: closeComment,\n      delimStyle: \"comment\",\n      mode: {token: function(stream) {\n        stream.skipTo(closeComment) || stream.skipToEnd()\n        return \"comment\"\n      }}\n    }, {\n      open: parserConfig.open || parserConfig.scriptStartRegex || \"<%\",\n      close: parserConfig.close || parserConfig.scriptEndRegex || \"%>\",\n      mode: CodeMirror.getMode(config, parserConfig.scriptingModeSpec)\n    });\n  }, \"htmlmixed\");\n\n  CodeMirror.defineMIME(\"application/x-ejs\", {name: \"htmlembedded\", scriptingModeSpec:\"javascript\"});\n  CodeMirror.defineMIME(\"application/x-aspx\", {name: \"htmlembedded\", scriptingModeSpec:\"text/x-csharp\"});\n  CodeMirror.defineMIME(\"application/x-jsp\", {name: \"htmlembedded\", scriptingModeSpec:\"text/x-java\"});\n  CodeMirror.defineMIME(\"application/x-erb\", {name: \"htmlembedded\", scriptingModeSpec:\"ruby\"});\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/htmlmixed/htmlmixed.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../xml/xml\"), require(\"../javascript/javascript\"), require(\"../css/css\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../xml/xml\", \"../javascript/javascript\", \"../css/css\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var defaultTags = {\n    script: [\n      [\"lang\", /(javascript|babel)/i, \"javascript\"],\n      [\"type\", /^(?:text|application)\\/(?:x-)?(?:java|ecma)script$|^module$|^$/i, \"javascript\"],\n      [\"type\", /./, \"text/plain\"],\n      [null, null, \"javascript\"]\n    ],\n    style:  [\n      [\"lang\", /^css$/i, \"css\"],\n      [\"type\", /^(text\\/)?(x-)?(stylesheet|css)$/i, \"css\"],\n      [\"type\", /./, \"text/plain\"],\n      [null, null, \"css\"]\n    ]\n  };\n\n  function maybeBackup(stream, pat, style) {\n    var cur = stream.current(), close = cur.search(pat);\n    if (close > -1) {\n      stream.backUp(cur.length - close);\n    } else if (cur.match(/<\\/?$/)) {\n      stream.backUp(cur.length);\n      if (!stream.match(pat, false)) stream.match(cur);\n    }\n    return style;\n  }\n\n  var attrRegexpCache = {};\n  function getAttrRegexp(attr) {\n    var regexp = attrRegexpCache[attr];\n    if (regexp) return regexp;\n    return attrRegexpCache[attr] = new RegExp(\"\\\\s+\" + attr + \"\\\\s*=\\\\s*('|\\\")?([^'\\\"]+)('|\\\")?\\\\s*\");\n  }\n\n  function getAttrValue(text, attr) {\n    var match = text.match(getAttrRegexp(attr))\n    return match ? /^\\s*(.*?)\\s*$/.exec(match[2])[1] : \"\"\n  }\n\n  function getTagRegexp(tagName, anchored) {\n    return new RegExp((anchored ? \"^\" : \"\") + \"<\\/\\\\s*\" + tagName + \"\\\\s*>\", \"i\");\n  }\n\n  function addTags(from, to) {\n    for (var tag in from) {\n      var dest = to[tag] || (to[tag] = []);\n      var source = from[tag];\n      for (var i = source.length - 1; i >= 0; i--)\n        dest.unshift(source[i])\n    }\n  }\n\n  function findMatchingMode(tagInfo, tagText) {\n    for (var i = 0; i < tagInfo.length; i++) {\n      var spec = tagInfo[i];\n      if (!spec[0] || spec[1].test(getAttrValue(tagText, spec[0]))) return spec[2];\n    }\n  }\n\n  CodeMirror.defineMode(\"htmlmixed\", function (config, parserConfig) {\n    var htmlMode = CodeMirror.getMode(config, {\n      name: \"xml\",\n      htmlMode: true,\n      multilineTagIndentFactor: parserConfig.multilineTagIndentFactor,\n      multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag,\n      allowMissingTagName: parserConfig.allowMissingTagName,\n    });\n\n    var tags = {};\n    var configTags = parserConfig && parserConfig.tags, configScript = parserConfig && parserConfig.scriptTypes;\n    addTags(defaultTags, tags);\n    if (configTags) addTags(configTags, tags);\n    if (configScript) for (var i = configScript.length - 1; i >= 0; i--)\n      tags.script.unshift([\"type\", configScript[i].matches, configScript[i].mode])\n\n    function html(stream, state) {\n      var style = htmlMode.token(stream, state.htmlState), tag = /\\btag\\b/.test(style), tagName\n      if (tag && !/[<>\\s\\/]/.test(stream.current()) &&\n          (tagName = state.htmlState.tagName && state.htmlState.tagName.toLowerCase()) &&\n          tags.hasOwnProperty(tagName)) {\n        state.inTag = tagName + \" \"\n      } else if (state.inTag && tag && />$/.test(stream.current())) {\n        var inTag = /^([\\S]+) (.*)/.exec(state.inTag)\n        state.inTag = null\n        var modeSpec = stream.current() == \">\" && findMatchingMode(tags[inTag[1]], inTag[2])\n        var mode = CodeMirror.getMode(config, modeSpec)\n        var endTagA = getTagRegexp(inTag[1], true), endTag = getTagRegexp(inTag[1], false);\n        state.token = function (stream, state) {\n          if (stream.match(endTagA, false)) {\n            state.token = html;\n            state.localState = state.localMode = null;\n            return null;\n          }\n          return maybeBackup(stream, endTag, state.localMode.token(stream, state.localState));\n        };\n        state.localMode = mode;\n        state.localState = CodeMirror.startState(mode, htmlMode.indent(state.htmlState, \"\", \"\"));\n      } else if (state.inTag) {\n        state.inTag += stream.current()\n        if (stream.eol()) state.inTag += \" \"\n      }\n      return style;\n    };\n\n    return {\n      startState: function () {\n        var state = CodeMirror.startState(htmlMode);\n        return {token: html, inTag: null, localMode: null, localState: null, htmlState: state};\n      },\n\n      copyState: function (state) {\n        var local;\n        if (state.localState) {\n          local = CodeMirror.copyState(state.localMode, state.localState);\n        }\n        return {token: state.token, inTag: state.inTag,\n                localMode: state.localMode, localState: local,\n                htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};\n      },\n\n      token: function (stream, state) {\n        return state.token(stream, state);\n      },\n\n      indent: function (state, textAfter, line) {\n        if (!state.localMode || /^\\s*<\\//.test(textAfter))\n          return htmlMode.indent(state.htmlState, textAfter, line);\n        else if (state.localMode.indent)\n          return state.localMode.indent(state.localState, textAfter, line);\n        else\n          return CodeMirror.Pass;\n      },\n\n      innerMode: function (state) {\n        return {state: state.localState || state.htmlState, mode: state.localMode || htmlMode};\n      }\n    };\n  }, \"xml\", \"javascript\", \"css\");\n\n  CodeMirror.defineMIME(\"text/html\", \"htmlmixed\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/http/http.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"http\", function() {\n  function failFirstLine(stream, state) {\n    stream.skipToEnd();\n    state.cur = header;\n    return \"error\";\n  }\n\n  function start(stream, state) {\n    if (stream.match(/^HTTP\\/\\d\\.\\d/)) {\n      state.cur = responseStatusCode;\n      return \"keyword\";\n    } else if (stream.match(/^[A-Z]+/) && /[ \\t]/.test(stream.peek())) {\n      state.cur = requestPath;\n      return \"keyword\";\n    } else {\n      return failFirstLine(stream, state);\n    }\n  }\n\n  function responseStatusCode(stream, state) {\n    var code = stream.match(/^\\d+/);\n    if (!code) return failFirstLine(stream, state);\n\n    state.cur = responseStatusText;\n    var status = Number(code[0]);\n    if (status >= 100 && status < 200) {\n      return \"positive informational\";\n    } else if (status >= 200 && status < 300) {\n      return \"positive success\";\n    } else if (status >= 300 && status < 400) {\n      return \"positive redirect\";\n    } else if (status >= 400 && status < 500) {\n      return \"negative client-error\";\n    } else if (status >= 500 && status < 600) {\n      return \"negative server-error\";\n    } else {\n      return \"error\";\n    }\n  }\n\n  function responseStatusText(stream, state) {\n    stream.skipToEnd();\n    state.cur = header;\n    return null;\n  }\n\n  function requestPath(stream, state) {\n    stream.eatWhile(/\\S/);\n    state.cur = requestProtocol;\n    return \"string-2\";\n  }\n\n  function requestProtocol(stream, state) {\n    if (stream.match(/^HTTP\\/\\d\\.\\d$/)) {\n      state.cur = header;\n      return \"keyword\";\n    } else {\n      return failFirstLine(stream, state);\n    }\n  }\n\n  function header(stream) {\n    if (stream.sol() && !stream.eat(/[ \\t]/)) {\n      if (stream.match(/^.*?:/)) {\n        return \"atom\";\n      } else {\n        stream.skipToEnd();\n        return \"error\";\n      }\n    } else {\n      stream.skipToEnd();\n      return \"string\";\n    }\n  }\n\n  function body(stream) {\n    stream.skipToEnd();\n    return null;\n  }\n\n  return {\n    token: function(stream, state) {\n      var cur = state.cur;\n      if (cur != header && cur != body && stream.eatSpace()) return null;\n      return cur(stream, state);\n    },\n\n    blankLine: function(state) {\n      state.cur = body;\n    },\n\n    startState: function() {\n      return {cur: start};\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"message/http\", \"http\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/idl/idl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function wordRegexp(words) {\n    return new RegExp('^((' + words.join(')|(') + '))\\\\b', 'i');\n  };\n\n  var builtinArray = [\n    'a_correlate', 'abs', 'acos', 'adapt_hist_equal', 'alog',\n    'alog2', 'alog10', 'amoeba', 'annotate', 'app_user_dir',\n    'app_user_dir_query', 'arg_present', 'array_equal', 'array_indices',\n    'arrow', 'ascii_template', 'asin', 'assoc', 'atan',\n    'axis', 'axis', 'bandpass_filter', 'bandreject_filter', 'barplot',\n    'bar_plot', 'beseli', 'beselj', 'beselk', 'besely',\n    'beta', 'biginteger', 'bilinear', 'bin_date', 'binary_template',\n    'bindgen', 'binomial', 'bit_ffs', 'bit_population', 'blas_axpy',\n    'blk_con', 'boolarr', 'boolean', 'boxplot', 'box_cursor',\n    'breakpoint', 'broyden', 'bubbleplot', 'butterworth', 'bytarr',\n    'byte', 'byteorder', 'bytscl', 'c_correlate', 'calendar',\n    'caldat', 'call_external', 'call_function', 'call_method',\n    'call_procedure', 'canny', 'catch', 'cd', 'cdf', 'ceil',\n    'chebyshev', 'check_math', 'chisqr_cvf', 'chisqr_pdf', 'choldc',\n    'cholsol', 'cindgen', 'cir_3pnt', 'clipboard', 'close',\n    'clust_wts', 'cluster', 'cluster_tree', 'cmyk_convert', 'code_coverage',\n    'color_convert', 'color_exchange', 'color_quan', 'color_range_map',\n    'colorbar', 'colorize_sample', 'colormap_applicable',\n    'colormap_gradient', 'colormap_rotation', 'colortable',\n    'comfit', 'command_line_args', 'common', 'compile_opt', 'complex',\n    'complexarr', 'complexround', 'compute_mesh_normals', 'cond', 'congrid',\n    'conj', 'constrained_min', 'contour', 'contour', 'convert_coord',\n    'convol', 'convol_fft', 'coord2to3', 'copy_lun', 'correlate',\n    'cos', 'cosh', 'cpu', 'cramer', 'createboxplotdata',\n    'create_cursor', 'create_struct', 'create_view', 'crossp', 'crvlength',\n    'ct_luminance', 'cti_test', 'cursor', 'curvefit', 'cv_coord',\n    'cvttobm', 'cw_animate', 'cw_animate_getp', 'cw_animate_load',\n    'cw_animate_run', 'cw_arcball', 'cw_bgroup', 'cw_clr_index',\n    'cw_colorsel', 'cw_defroi', 'cw_field', 'cw_filesel', 'cw_form',\n    'cw_fslider', 'cw_light_editor', 'cw_light_editor_get',\n    'cw_light_editor_set', 'cw_orient', 'cw_palette_editor',\n    'cw_palette_editor_get', 'cw_palette_editor_set', 'cw_pdmenu',\n    'cw_rgbslider', 'cw_tmpl', 'cw_zoom', 'db_exists',\n    'dblarr', 'dcindgen', 'dcomplex', 'dcomplexarr', 'define_key',\n    'define_msgblk', 'define_msgblk_from_file', 'defroi', 'defsysv',\n    'delvar', 'dendro_plot', 'dendrogram', 'deriv', 'derivsig',\n    'determ', 'device', 'dfpmin', 'diag_matrix', 'dialog_dbconnect',\n    'dialog_message', 'dialog_pickfile', 'dialog_printersetup',\n    'dialog_printjob', 'dialog_read_image',\n    'dialog_write_image', 'dictionary', 'digital_filter', 'dilate', 'dindgen',\n    'dissolve', 'dist', 'distance_measure', 'dlm_load', 'dlm_register',\n    'doc_library', 'double', 'draw_roi', 'edge_dog', 'efont',\n    'eigenql', 'eigenvec', 'ellipse', 'elmhes', 'emboss',\n    'empty', 'enable_sysrtn', 'eof', 'eos', 'erase',\n    'erf', 'erfc', 'erfcx', 'erode', 'errorplot',\n    'errplot', 'estimator_filter', 'execute', 'exit', 'exp',\n    'expand', 'expand_path', 'expint', 'extract', 'extract_slice',\n    'f_cvf', 'f_pdf', 'factorial', 'fft', 'file_basename',\n    'file_chmod', 'file_copy', 'file_delete', 'file_dirname',\n    'file_expand_path', 'file_gunzip', 'file_gzip', 'file_info',\n    'file_lines', 'file_link', 'file_mkdir', 'file_move',\n    'file_poll_input', 'file_readlink', 'file_same',\n    'file_search', 'file_tar', 'file_test', 'file_untar', 'file_unzip',\n    'file_which', 'file_zip', 'filepath', 'findgen', 'finite',\n    'fix', 'flick', 'float', 'floor', 'flow3',\n    'fltarr', 'flush', 'format_axis_values', 'forward_function', 'free_lun',\n    'fstat', 'fulstr', 'funct', 'function', 'fv_test',\n    'fx_root', 'fz_roots', 'gamma', 'gamma_ct', 'gauss_cvf',\n    'gauss_pdf', 'gauss_smooth', 'gauss2dfit', 'gaussfit',\n    'gaussian_function', 'gaussint', 'get_drive_list', 'get_dxf_objects',\n    'get_kbrd', 'get_login_info',\n    'get_lun', 'get_screen_size', 'getenv', 'getwindows', 'greg2jul',\n    'grib', 'grid_input', 'grid_tps', 'grid3', 'griddata',\n    'gs_iter', 'h_eq_ct', 'h_eq_int', 'hanning', 'hash',\n    'hdf', 'hdf5', 'heap_free', 'heap_gc', 'heap_nosave',\n    'heap_refcount', 'heap_save', 'help', 'hilbert', 'hist_2d',\n    'hist_equal', 'histogram', 'hls', 'hough', 'hqr',\n    'hsv', 'i18n_multibytetoutf8',\n    'i18n_multibytetowidechar', 'i18n_utf8tomultibyte',\n    'i18n_widechartomultibyte',\n    'ibeta', 'icontour', 'iconvertcoord', 'idelete', 'identity',\n    'idl_base64', 'idl_container', 'idl_validname',\n    'idlexbr_assistant', 'idlitsys_createtool',\n    'idlunit', 'iellipse', 'igamma', 'igetcurrent', 'igetdata',\n    'igetid', 'igetproperty', 'iimage', 'image', 'image_cont',\n    'image_statistics', 'image_threshold', 'imaginary', 'imap', 'indgen',\n    'int_2d', 'int_3d', 'int_tabulated', 'intarr', 'interpol',\n    'interpolate', 'interval_volume', 'invert', 'ioctl', 'iopen',\n    'ir_filter', 'iplot', 'ipolygon', 'ipolyline', 'iputdata',\n    'iregister', 'ireset', 'iresolve', 'irotate', 'isa',\n    'isave', 'iscale', 'isetcurrent', 'isetproperty', 'ishft',\n    'isocontour', 'isosurface', 'isurface', 'itext', 'itranslate',\n    'ivector', 'ivolume', 'izoom', 'journal', 'json_parse',\n    'json_serialize', 'jul2greg', 'julday', 'keyword_set', 'krig2d',\n    'kurtosis', 'kw_test', 'l64indgen', 'la_choldc', 'la_cholmprove',\n    'la_cholsol', 'la_determ', 'la_eigenproblem', 'la_eigenql', 'la_eigenvec',\n    'la_elmhes', 'la_gm_linear_model', 'la_hqr', 'la_invert',\n    'la_least_square_equality', 'la_least_squares', 'la_linear_equation',\n    'la_ludc', 'la_lumprove', 'la_lusol',\n    'la_svd', 'la_tridc', 'la_trimprove', 'la_triql', 'la_trired',\n    'la_trisol', 'label_date', 'label_region', 'ladfit', 'laguerre',\n    'lambda', 'lambdap', 'lambertw', 'laplacian', 'least_squares_filter',\n    'leefilt', 'legend', 'legendre', 'linbcg', 'lindgen',\n    'linfit', 'linkimage', 'list', 'll_arc_distance', 'lmfit',\n    'lmgr', 'lngamma', 'lnp_test', 'loadct', 'locale_get',\n    'logical_and', 'logical_or', 'logical_true', 'lon64arr', 'lonarr',\n    'long', 'long64', 'lsode', 'lu_complex', 'ludc',\n    'lumprove', 'lusol', 'm_correlate', 'machar', 'make_array',\n    'make_dll', 'make_rt', 'map', 'mapcontinents', 'mapgrid',\n    'map_2points', 'map_continents', 'map_grid', 'map_image', 'map_patch',\n    'map_proj_forward', 'map_proj_image', 'map_proj_info',\n    'map_proj_init', 'map_proj_inverse',\n    'map_set', 'matrix_multiply', 'matrix_power', 'max', 'md_test',\n    'mean', 'meanabsdev', 'mean_filter', 'median', 'memory',\n    'mesh_clip', 'mesh_decimate', 'mesh_issolid',\n    'mesh_merge', 'mesh_numtriangles',\n    'mesh_obj', 'mesh_smooth', 'mesh_surfacearea',\n    'mesh_validate', 'mesh_volume',\n    'message', 'min', 'min_curve_surf', 'mk_html_help', 'modifyct',\n    'moment', 'morph_close', 'morph_distance',\n    'morph_gradient', 'morph_hitormiss',\n    'morph_open', 'morph_thin', 'morph_tophat', 'multi', 'n_elements',\n    'n_params', 'n_tags', 'ncdf', 'newton', 'noise_hurl',\n    'noise_pick', 'noise_scatter', 'noise_slur', 'norm', 'obj_class',\n    'obj_destroy', 'obj_hasmethod', 'obj_isa', 'obj_new', 'obj_valid',\n    'objarr', 'on_error', 'on_ioerror', 'online_help', 'openr',\n    'openu', 'openw', 'oplot', 'oploterr', 'orderedhash',\n    'p_correlate', 'parse_url', 'particle_trace', 'path_cache', 'path_sep',\n    'pcomp', 'plot', 'plot3d', 'plot', 'plot_3dbox',\n    'plot_field', 'ploterr', 'plots', 'polar_contour', 'polar_surface',\n    'polyfill', 'polyshade', 'pnt_line', 'point_lun', 'polarplot',\n    'poly', 'poly_2d', 'poly_area', 'poly_fit', 'polyfillv',\n    'polygon', 'polyline', 'polywarp', 'popd', 'powell',\n    'pref_commit', 'pref_get', 'pref_set', 'prewitt', 'primes',\n    'print', 'printf', 'printd', 'pro', 'product',\n    'profile', 'profiler', 'profiles', 'project_vol', 'ps_show_fonts',\n    'psafm', 'pseudo', 'ptr_free', 'ptr_new', 'ptr_valid',\n    'ptrarr', 'pushd', 'qgrid3', 'qhull', 'qromb',\n    'qromo', 'qsimp', 'query_*', 'query_ascii', 'query_bmp',\n    'query_csv', 'query_dicom', 'query_gif', 'query_image', 'query_jpeg',\n    'query_jpeg2000', 'query_mrsid', 'query_pict', 'query_png', 'query_ppm',\n    'query_srf', 'query_tiff', 'query_video', 'query_wav', 'r_correlate',\n    'r_test', 'radon', 'randomn', 'randomu', 'ranks',\n    'rdpix', 'read', 'readf', 'read_ascii', 'read_binary',\n    'read_bmp', 'read_csv', 'read_dicom', 'read_gif', 'read_image',\n    'read_interfile', 'read_jpeg', 'read_jpeg2000', 'read_mrsid', 'read_pict',\n    'read_png', 'read_ppm', 'read_spr', 'read_srf', 'read_sylk',\n    'read_tiff', 'read_video', 'read_wav', 'read_wave', 'read_x11_bitmap',\n    'read_xwd', 'reads', 'readu', 'real_part', 'rebin',\n    'recall_commands', 'recon3', 'reduce_colors', 'reform', 'region_grow',\n    'register_cursor', 'regress', 'replicate',\n    'replicate_inplace', 'resolve_all',\n    'resolve_routine', 'restore', 'retall', 'return', 'reverse',\n    'rk4', 'roberts', 'rot', 'rotate', 'round',\n    'routine_filepath', 'routine_info', 'rs_test', 's_test', 'save',\n    'savgol', 'scale3', 'scale3d', 'scatterplot', 'scatterplot3d',\n    'scope_level', 'scope_traceback', 'scope_varfetch',\n    'scope_varname', 'search2d',\n    'search3d', 'sem_create', 'sem_delete', 'sem_lock', 'sem_release',\n    'set_plot', 'set_shading', 'setenv', 'sfit', 'shade_surf',\n    'shade_surf_irr', 'shade_volume', 'shift', 'shift_diff', 'shmdebug',\n    'shmmap', 'shmunmap', 'shmvar', 'show3', 'showfont',\n    'signum', 'simplex', 'sin', 'sindgen', 'sinh',\n    'size', 'skewness', 'skip_lun', 'slicer3', 'slide_image',\n    'smooth', 'sobel', 'socket', 'sort', 'spawn',\n    'sph_4pnt', 'sph_scat', 'spher_harm', 'spl_init', 'spl_interp',\n    'spline', 'spline_p', 'sprsab', 'sprsax', 'sprsin',\n    'sprstp', 'sqrt', 'standardize', 'stddev', 'stop',\n    'strarr', 'strcmp', 'strcompress', 'streamline', 'streamline',\n    'stregex', 'stretch', 'string', 'strjoin', 'strlen',\n    'strlowcase', 'strmatch', 'strmessage', 'strmid', 'strpos',\n    'strput', 'strsplit', 'strtrim', 'struct_assign', 'struct_hide',\n    'strupcase', 'surface', 'surface', 'surfr', 'svdc',\n    'svdfit', 'svsol', 'swap_endian', 'swap_endian_inplace', 'symbol',\n    'systime', 't_cvf', 't_pdf', 't3d', 'tag_names',\n    'tan', 'tanh', 'tek_color', 'temporary', 'terminal_size',\n    'tetra_clip', 'tetra_surface', 'tetra_volume', 'text', 'thin',\n    'thread', 'threed', 'tic', 'time_test2', 'timegen',\n    'timer', 'timestamp', 'timestamptovalues', 'tm_test', 'toc',\n    'total', 'trace', 'transpose', 'tri_surf', 'triangulate',\n    'trigrid', 'triql', 'trired', 'trisol', 'truncate_lun',\n    'ts_coef', 'ts_diff', 'ts_fcast', 'ts_smooth', 'tv',\n    'tvcrs', 'tvlct', 'tvrd', 'tvscl', 'typename',\n    'uindgen', 'uint', 'uintarr', 'ul64indgen', 'ulindgen',\n    'ulon64arr', 'ulonarr', 'ulong', 'ulong64', 'uniq',\n    'unsharp_mask', 'usersym', 'value_locate', 'variance', 'vector',\n    'vector_field', 'vel', 'velovect', 'vert_t3d', 'voigt',\n    'volume', 'voronoi', 'voxel_proj', 'wait', 'warp_tri',\n    'watershed', 'wdelete', 'wf_draw', 'where', 'widget_base',\n    'widget_button', 'widget_combobox', 'widget_control',\n    'widget_displaycontextmenu', 'widget_draw',\n    'widget_droplist', 'widget_event', 'widget_info',\n    'widget_label', 'widget_list',\n    'widget_propertysheet', 'widget_slider', 'widget_tab',\n    'widget_table', 'widget_text',\n    'widget_tree', 'widget_tree_move', 'widget_window',\n    'wiener_filter', 'window',\n    'window', 'write_bmp', 'write_csv', 'write_gif', 'write_image',\n    'write_jpeg', 'write_jpeg2000', 'write_nrif', 'write_pict', 'write_png',\n    'write_ppm', 'write_spr', 'write_srf', 'write_sylk', 'write_tiff',\n    'write_video', 'write_wav', 'write_wave', 'writeu', 'wset',\n    'wshow', 'wtn', 'wv_applet', 'wv_cwt', 'wv_cw_wavelet',\n    'wv_denoise', 'wv_dwt', 'wv_fn_coiflet',\n    'wv_fn_daubechies', 'wv_fn_gaussian',\n    'wv_fn_haar', 'wv_fn_morlet', 'wv_fn_paul',\n    'wv_fn_symlet', 'wv_import_data',\n    'wv_import_wavelet', 'wv_plot3d_wps', 'wv_plot_multires',\n    'wv_pwt', 'wv_tool_denoise',\n    'xbm_edit', 'xdisplayfile', 'xdxf', 'xfont', 'xinteranimate',\n    'xloadct', 'xmanager', 'xmng_tmpl', 'xmtool', 'xobjview',\n    'xobjview_rotate', 'xobjview_write_image',\n    'xpalette', 'xpcolor', 'xplot3d',\n    'xregistered', 'xroi', 'xsq_test', 'xsurface', 'xvaredit',\n    'xvolume', 'xvolume_rotate', 'xvolume_write_image',\n    'xyouts', 'zlib_compress', 'zlib_uncompress', 'zoom', 'zoom_24'\n  ];\n  var builtins = wordRegexp(builtinArray);\n\n  var keywordArray = [\n    'begin', 'end', 'endcase', 'endfor',\n    'endwhile', 'endif', 'endrep', 'endforeach',\n    'break', 'case', 'continue', 'for',\n    'foreach', 'goto', 'if', 'then', 'else',\n    'repeat', 'until', 'switch', 'while',\n    'do', 'pro', 'function'\n  ];\n  var keywords = wordRegexp(keywordArray);\n\n  CodeMirror.registerHelper(\"hintWords\", \"idl\", builtinArray.concat(keywordArray));\n\n  var identifiers = new RegExp('^[_a-z\\xa1-\\uffff][_a-z0-9\\xa1-\\uffff]*', 'i');\n\n  var singleOperators = /[+\\-*&=<>\\/@#~$]/;\n  var boolOperators = new RegExp('(and|or|eq|lt|le|gt|ge|ne|not)', 'i');\n\n  function tokenBase(stream) {\n    // whitespaces\n    if (stream.eatSpace()) return null;\n\n    // Handle one line Comments\n    if (stream.match(';')) {\n      stream.skipToEnd();\n      return 'comment';\n    }\n\n    // Handle Number Literals\n    if (stream.match(/^[0-9\\.+-]/, false)) {\n      if (stream.match(/^[+-]?0x[0-9a-fA-F]+/))\n        return 'number';\n      if (stream.match(/^[+-]?\\d*\\.\\d+([EeDd][+-]?\\d+)?/))\n        return 'number';\n      if (stream.match(/^[+-]?\\d+([EeDd][+-]?\\d+)?/))\n        return 'number';\n    }\n\n    // Handle Strings\n    if (stream.match(/^\"([^\"]|(\"\"))*\"/)) { return 'string'; }\n    if (stream.match(/^'([^']|(''))*'/)) { return 'string'; }\n\n    // Handle words\n    if (stream.match(keywords)) { return 'keyword'; }\n    if (stream.match(builtins)) { return 'builtin'; }\n    if (stream.match(identifiers)) { return 'variable'; }\n\n    if (stream.match(singleOperators) || stream.match(boolOperators)) {\n      return 'operator'; }\n\n    // Handle non-detected items\n    stream.next();\n    return null;\n  };\n\n  CodeMirror.defineMode('idl', function() {\n    return {\n      token: function(stream) {\n        return tokenBase(stream);\n      }\n    };\n  });\n\n  CodeMirror.defineMIME('text/x-idl', 'idl');\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/javascript/javascript.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit;\n  var statementIndent = parserConfig.statementIndent;\n  var jsonldMode = parserConfig.jsonld;\n  var jsonMode = parserConfig.json || jsonldMode;\n  var trackScope = parserConfig.trackScope !== false\n  var isTS = parserConfig.typescript;\n  var wordRE = parserConfig.wordCharacters || /[\\w$\\xa1-\\uffff]/;\n\n  // Tokenizer\n\n  var keywords = function(){\n    function kw(type) {return {type: type, style: \"keyword\"};}\n    var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\"), D = kw(\"keyword d\");\n    var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n\n    return {\n      \"if\": kw(\"if\"), \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n      \"return\": D, \"break\": D, \"continue\": D, \"new\": kw(\"new\"), \"delete\": C, \"void\": C, \"throw\": C,\n      \"debugger\": kw(\"debugger\"), \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n      \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n      \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n      \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n      \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom,\n      \"this\": kw(\"this\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n      \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C,\n      \"await\": C\n    };\n  }();\n\n  var isOperatorChar = /[+\\-*&%=<>!?|~^@]/;\n  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n  function readRegexp(stream) {\n    var escaped = false, next, inSet = false;\n    while ((next = stream.next()) != null) {\n      if (!escaped) {\n        if (next == \"/\" && !inSet) return;\n        if (next == \"[\") inSet = true;\n        else if (inSet && next == \"]\") inSet = false;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n  }\n\n  // Used as scratch variables to communicate multiple values without\n  // consing up tons of objects.\n  var type, content;\n  function ret(tp, style, cont) {\n    type = tp; content = cont;\n    return style;\n  }\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    } else if (ch == \".\" && stream.match(/^\\d[\\d_]*(?:[eE][+\\-]?[\\d_]+)?/)) {\n      return ret(\"number\", \"number\");\n    } else if (ch == \".\" && stream.match(\"..\")) {\n      return ret(\"spread\", \"meta\");\n    } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      return ret(ch);\n    } else if (ch == \"=\" && stream.eat(\">\")) {\n      return ret(\"=>\", \"operator\");\n    } else if (ch == \"0\" && stream.match(/^(?:x[\\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) {\n      return ret(\"number\", \"number\");\n    } else if (/\\d/.test(ch)) {\n      stream.match(/^[\\d_]*(?:n|(?:\\.[\\d_]*)?(?:[eE][+\\-]?[\\d_]+)?)?/);\n      return ret(\"number\", \"number\");\n    } else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      } else if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return ret(\"comment\", \"comment\");\n      } else if (expressionAllowed(stream, state, 1)) {\n        readRegexp(stream);\n        stream.match(/^\\b(([gimyus])(?![gimyus]*\\2))+\\b/);\n        return ret(\"regexp\", \"string-2\");\n      } else {\n        stream.eat(\"=\");\n        return ret(\"operator\", \"operator\", stream.current());\n      }\n    } else if (ch == \"`\") {\n      state.tokenize = tokenQuasi;\n      return tokenQuasi(stream, state);\n    } else if (ch == \"#\" && stream.peek() == \"!\") {\n      stream.skipToEnd();\n      return ret(\"meta\", \"meta\");\n    } else if (ch == \"#\" && stream.eatWhile(wordRE)) {\n      return ret(\"variable\", \"property\")\n    } else if (ch == \"<\" && stream.match(\"!--\") ||\n               (ch == \"-\" && stream.match(\"->\") && !/\\S/.test(stream.string.slice(0, stream.start)))) {\n      stream.skipToEnd()\n      return ret(\"comment\", \"comment\")\n    } else if (isOperatorChar.test(ch)) {\n      if (ch != \">\" || !state.lexical || state.lexical.type != \">\") {\n        if (stream.eat(\"=\")) {\n          if (ch == \"!\" || ch == \"=\") stream.eat(\"=\")\n        } else if (/[<>*+\\-|&?]/.test(ch)) {\n          stream.eat(ch)\n          if (ch == \">\") stream.eat(ch)\n        }\n      }\n      if (ch == \"?\" && stream.eat(\".\")) return ret(\".\")\n      return ret(\"operator\", \"operator\", stream.current());\n    } else if (wordRE.test(ch)) {\n      stream.eatWhile(wordRE);\n      var word = stream.current()\n      if (state.lastType != \".\") {\n        if (keywords.propertyIsEnumerable(word)) {\n          var kw = keywords[word]\n          return ret(kw.type, kw.style, word)\n        }\n        if (word == \"async\" && stream.match(/^(\\s|\\/\\*([^*]|\\*(?!\\/))*?\\*\\/)*[\\[\\(\\w]/, false))\n          return ret(\"async\", \"keyword\", word)\n      }\n      return ret(\"variable\", \"variable\", word)\n    }\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next;\n      if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n        state.tokenize = tokenBase;\n        return ret(\"jsonld-keyword\", \"meta\");\n      }\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) break;\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (!escaped) state.tokenize = tokenBase;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenQuasi(stream, state) {\n    var escaped = false, next;\n    while ((next = stream.next()) != null) {\n      if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n    return ret(\"quasi\", \"string-2\", stream.current());\n  }\n\n  var brackets = \"([{}])\";\n  // This is a crude lookahead trick to try and notice that we're\n  // parsing the argument patterns for a fat-arrow function before we\n  // actually hit the arrow token. It only works if the arrow is on\n  // the same line as the arguments and there's no strange noise\n  // (comments) in between. Fallback is to only notice when we hit the\n  // arrow, and not declare the arguments as locals for the arrow\n  // body.\n  function findFatArrow(stream, state) {\n    if (state.fatArrowAt) state.fatArrowAt = null;\n    var arrow = stream.string.indexOf(\"=>\", stream.start);\n    if (arrow < 0) return;\n\n    if (isTS) { // Try to skip TypeScript return type declarations after the arguments\n      var m = /:\\s*(?:\\w+(?:<[^>]*>|\\[\\])?|\\{[^}]*\\})\\s*$/.exec(stream.string.slice(stream.start, arrow))\n      if (m) arrow = m.index\n    }\n\n    var depth = 0, sawSomething = false;\n    for (var pos = arrow - 1; pos >= 0; --pos) {\n      var ch = stream.string.charAt(pos);\n      var bracket = brackets.indexOf(ch);\n      if (bracket >= 0 && bracket < 3) {\n        if (!depth) { ++pos; break; }\n        if (--depth == 0) { if (ch == \"(\") sawSomething = true; break; }\n      } else if (bracket >= 3 && bracket < 6) {\n        ++depth;\n      } else if (wordRE.test(ch)) {\n        sawSomething = true;\n      } else if (/[\"'\\/`]/.test(ch)) {\n        for (;; --pos) {\n          if (pos == 0) return\n          var next = stream.string.charAt(pos - 1)\n          if (next == ch && stream.string.charAt(pos - 2) != \"\\\\\") { pos--; break }\n        }\n      } else if (sawSomething && !depth) {\n        ++pos;\n        break;\n      }\n    }\n    if (sawSomething && !depth) state.fatArrowAt = pos;\n  }\n\n  // Parser\n\n  var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true,\n                     \"regexp\": true, \"this\": true, \"import\": true, \"jsonld-keyword\": true};\n\n  function JSLexical(indented, column, type, align, prev, info) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.prev = prev;\n    this.info = info;\n    if (align != null) this.align = align;\n  }\n\n  function inScope(state, varname) {\n    if (!trackScope) return false\n    for (var v = state.localVars; v; v = v.next)\n      if (v.name == varname) return true;\n    for (var cx = state.context; cx; cx = cx.prev) {\n      for (var v = cx.vars; v; v = v.next)\n        if (v.name == varname) return true;\n    }\n  }\n\n  function parseJS(state, style, type, content, stream) {\n    var cc = state.cc;\n    // Communicate our context to the combinators.\n    // (Less wasteful than consing up a hundred closures on every call.)\n    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;\n\n    if (!state.lexical.hasOwnProperty(\"align\"))\n      state.lexical.align = true;\n\n    while(true) {\n      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n      if (combinator(type, content)) {\n        while(cc.length && cc[cc.length - 1].lex)\n          cc.pop()();\n        if (cx.marked) return cx.marked;\n        if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n        return style;\n      }\n    }\n  }\n\n  // Combinator utils\n\n  var cx = {state: null, column: null, marked: null, cc: null};\n  function pass() {\n    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n  }\n  function cont() {\n    pass.apply(null, arguments);\n    return true;\n  }\n  function inList(name, list) {\n    for (var v = list; v; v = v.next) if (v.name == name) return true\n    return false;\n  }\n  function register(varname) {\n    var state = cx.state;\n    cx.marked = \"def\";\n    if (!trackScope) return\n    if (state.context) {\n      if (state.lexical.info == \"var\" && state.context && state.context.block) {\n        // FIXME function decls are also not block scoped\n        var newContext = registerVarScoped(varname, state.context)\n        if (newContext != null) {\n          state.context = newContext\n          return\n        }\n      } else if (!inList(varname, state.localVars)) {\n        state.localVars = new Var(varname, state.localVars)\n        return\n      }\n    }\n    // Fall through means this is global\n    if (parserConfig.globalVars && !inList(varname, state.globalVars))\n      state.globalVars = new Var(varname, state.globalVars)\n  }\n  function registerVarScoped(varname, context) {\n    if (!context) {\n      return null\n    } else if (context.block) {\n      var inner = registerVarScoped(varname, context.prev)\n      if (!inner) return null\n      if (inner == context.prev) return context\n      return new Context(inner, context.vars, true)\n    } else if (inList(varname, context.vars)) {\n      return context\n    } else {\n      return new Context(context.prev, new Var(varname, context.vars), false)\n    }\n  }\n\n  function isModifier(name) {\n    return name == \"public\" || name == \"private\" || name == \"protected\" || name == \"abstract\" || name == \"readonly\"\n  }\n\n  // Combinators\n\n  function Context(prev, vars, block) { this.prev = prev; this.vars = vars; this.block = block }\n  function Var(name, next) { this.name = name; this.next = next }\n\n  var defaultVars = new Var(\"this\", new Var(\"arguments\", null))\n  function pushcontext() {\n    cx.state.context = new Context(cx.state.context, cx.state.localVars, false)\n    cx.state.localVars = defaultVars\n  }\n  function pushblockcontext() {\n    cx.state.context = new Context(cx.state.context, cx.state.localVars, true)\n    cx.state.localVars = null\n  }\n  pushcontext.lex = pushblockcontext.lex = true\n  function popcontext() {\n    cx.state.localVars = cx.state.context.vars\n    cx.state.context = cx.state.context.prev\n  }\n  popcontext.lex = true\n  function pushlex(type, info) {\n    var result = function() {\n      var state = cx.state, indent = state.indented;\n      if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n      else for (var outer = state.lexical; outer && outer.type == \")\" && outer.align; outer = outer.prev)\n        indent = outer.indented;\n      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);\n    };\n    result.lex = true;\n    return result;\n  }\n  function poplex() {\n    var state = cx.state;\n    if (state.lexical.prev) {\n      if (state.lexical.type == \")\")\n        state.indented = state.lexical.indented;\n      state.lexical = state.lexical.prev;\n    }\n  }\n  poplex.lex = true;\n\n  function expect(wanted) {\n    function exp(type) {\n      if (type == wanted) return cont();\n      else if (wanted == \";\" || type == \"}\" || type == \")\" || type == \"]\") return pass();\n      else return cont(exp);\n    };\n    return exp;\n  }\n\n  function statement(type, value) {\n    if (type == \"var\") return cont(pushlex(\"vardef\", value), vardef, expect(\";\"), poplex);\n    if (type == \"keyword a\") return cont(pushlex(\"form\"), parenExpr, statement, poplex);\n    if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n    if (type == \"keyword d\") return cx.stream.match(/^\\s*$/, false) ? cont() : cont(pushlex(\"stat\"), maybeexpression, expect(\";\"), poplex);\n    if (type == \"debugger\") return cont(expect(\";\"));\n    if (type == \"{\") return cont(pushlex(\"}\"), pushblockcontext, block, poplex, popcontext);\n    if (type == \";\") return cont();\n    if (type == \"if\") {\n      if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n        cx.state.cc.pop()();\n      return cont(pushlex(\"form\"), parenExpr, statement, poplex, maybeelse);\n    }\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"for\") return cont(pushlex(\"form\"), pushblockcontext, forspec, statement, popcontext, poplex);\n    if (type == \"class\" || (isTS && value == \"interface\")) {\n      cx.marked = \"keyword\"\n      return cont(pushlex(\"form\", type == \"class\" ? type : value), className, poplex)\n    }\n    if (type == \"variable\") {\n      if (isTS && value == \"declare\") {\n        cx.marked = \"keyword\"\n        return cont(statement)\n      } else if (isTS && (value == \"module\" || value == \"enum\" || value == \"type\") && cx.stream.match(/^\\s*\\w/, false)) {\n        cx.marked = \"keyword\"\n        if (value == \"enum\") return cont(enumdef);\n        else if (value == \"type\") return cont(typename, expect(\"operator\"), typeexpr, expect(\";\"));\n        else return cont(pushlex(\"form\"), pattern, expect(\"{\"), pushlex(\"}\"), block, poplex, poplex)\n      } else if (isTS && value == \"namespace\") {\n        cx.marked = \"keyword\"\n        return cont(pushlex(\"form\"), expression, statement, poplex)\n      } else if (isTS && value == \"abstract\") {\n        cx.marked = \"keyword\"\n        return cont(statement)\n      } else {\n        return cont(pushlex(\"stat\"), maybelabel);\n      }\n    }\n    if (type == \"switch\") return cont(pushlex(\"form\"), parenExpr, expect(\"{\"), pushlex(\"}\", \"switch\"), pushblockcontext,\n                                      block, poplex, poplex, popcontext);\n    if (type == \"case\") return cont(expression, expect(\":\"));\n    if (type == \"default\") return cont(expect(\":\"));\n    if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, maybeCatchBinding, statement, poplex, popcontext);\n    if (type == \"export\") return cont(pushlex(\"stat\"), afterExport, poplex);\n    if (type == \"import\") return cont(pushlex(\"stat\"), afterImport, poplex);\n    if (type == \"async\") return cont(statement)\n    if (value == \"@\") return cont(expression, statement)\n    return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n  }\n  function maybeCatchBinding(type) {\n    if (type == \"(\") return cont(funarg, expect(\")\"))\n  }\n  function expression(type, value) {\n    return expressionInner(type, value, false);\n  }\n  function expressionNoComma(type, value) {\n    return expressionInner(type, value, true);\n  }\n  function parenExpr(type) {\n    if (type != \"(\") return pass()\n    return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex)\n  }\n  function expressionInner(type, value, noComma) {\n    if (cx.state.fatArrowAt == cx.stream.start) {\n      var body = noComma ? arrowBodyNoComma : arrowBody;\n      if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, expect(\"=>\"), body, popcontext);\n      else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n    }\n\n    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n    if (type == \"function\") return cont(functiondef, maybeop);\n    if (type == \"class\" || (isTS && value == \"interface\")) { cx.marked = \"keyword\"; return cont(pushlex(\"form\"), classExpression, poplex); }\n    if (type == \"keyword c\" || type == \"async\") return cont(noComma ? expressionNoComma : expression);\n    if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex, maybeop);\n    if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n    if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n    if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n    if (type == \"quasi\") return pass(quasi, maybeop);\n    if (type == \"new\") return cont(maybeTarget(noComma));\n    return cont();\n  }\n  function maybeexpression(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expression);\n  }\n\n  function maybeoperatorComma(type, value) {\n    if (type == \",\") return cont(maybeexpression);\n    return maybeoperatorNoComma(type, value, false);\n  }\n  function maybeoperatorNoComma(type, value, noComma) {\n    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n    var expr = noComma == false ? expression : expressionNoComma;\n    if (type == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n    if (type == \"operator\") {\n      if (/\\+\\+|--/.test(value) || isTS && value == \"!\") return cont(me);\n      if (isTS && value == \"<\" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\\s*\\(/, false))\n        return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, me);\n      if (value == \"?\") return cont(expression, expect(\":\"), expr);\n      return cont(expr);\n    }\n    if (type == \"quasi\") { return pass(quasi, me); }\n    if (type == \";\") return;\n    if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n    if (type == \".\") return cont(property, me);\n    if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n    if (isTS && value == \"as\") { cx.marked = \"keyword\"; return cont(typeexpr, me) }\n    if (type == \"regexp\") {\n      cx.state.lastType = cx.marked = \"operator\"\n      cx.stream.backUp(cx.stream.pos - cx.stream.start - 1)\n      return cont(expr)\n    }\n  }\n  function quasi(type, value) {\n    if (type != \"quasi\") return pass();\n    if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n    return cont(maybeexpression, continueQuasi);\n  }\n  function continueQuasi(type) {\n    if (type == \"}\") {\n      cx.marked = \"string-2\";\n      cx.state.tokenize = tokenQuasi;\n      return cont(quasi);\n    }\n  }\n  function arrowBody(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expression);\n  }\n  function arrowBodyNoComma(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expressionNoComma);\n  }\n  function maybeTarget(noComma) {\n    return function(type) {\n      if (type == \".\") return cont(noComma ? targetNoComma : target);\n      else if (type == \"variable\" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma)\n      else return pass(noComma ? expressionNoComma : expression);\n    };\n  }\n  function target(_, value) {\n    if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorComma); }\n  }\n  function targetNoComma(_, value) {\n    if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorNoComma); }\n  }\n  function maybelabel(type) {\n    if (type == \":\") return cont(poplex, statement);\n    return pass(maybeoperatorComma, expect(\";\"), poplex);\n  }\n  function property(type) {\n    if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n  }\n  function objprop(type, value) {\n    if (type == \"async\") {\n      cx.marked = \"property\";\n      return cont(objprop);\n    } else if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\";\n      if (value == \"get\" || value == \"set\") return cont(getterSetter);\n      var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params\n      if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\\s*:\\s*/, false)))\n        cx.state.fatArrowAt = cx.stream.pos + m[0].length\n      return cont(afterprop);\n    } else if (type == \"number\" || type == \"string\") {\n      cx.marked = jsonldMode ? \"property\" : (cx.style + \" property\");\n      return cont(afterprop);\n    } else if (type == \"jsonld-keyword\") {\n      return cont(afterprop);\n    } else if (isTS && isModifier(value)) {\n      cx.marked = \"keyword\"\n      return cont(objprop)\n    } else if (type == \"[\") {\n      return cont(expression, maybetype, expect(\"]\"), afterprop);\n    } else if (type == \"spread\") {\n      return cont(expressionNoComma, afterprop);\n    } else if (value == \"*\") {\n      cx.marked = \"keyword\";\n      return cont(objprop);\n    } else if (type == \":\") {\n      return pass(afterprop)\n    }\n  }\n  function getterSetter(type) {\n    if (type != \"variable\") return pass(afterprop);\n    cx.marked = \"property\";\n    return cont(functiondef);\n  }\n  function afterprop(type) {\n    if (type == \":\") return cont(expressionNoComma);\n    if (type == \"(\") return pass(functiondef);\n  }\n  function commasep(what, end, sep) {\n    function proceed(type, value) {\n      if (sep ? sep.indexOf(type) > -1 : type == \",\") {\n        var lex = cx.state.lexical;\n        if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n        return cont(function(type, value) {\n          if (type == end || value == end) return pass()\n          return pass(what)\n        }, proceed);\n      }\n      if (type == end || value == end) return cont();\n      if (sep && sep.indexOf(\";\") > -1) return pass(what)\n      return cont(expect(end));\n    }\n    return function(type, value) {\n      if (type == end || value == end) return cont();\n      return pass(what, proceed);\n    };\n  }\n  function contCommasep(what, end, info) {\n    for (var i = 3; i < arguments.length; i++)\n      cx.cc.push(arguments[i]);\n    return cont(pushlex(end, info), commasep(what, end), poplex);\n  }\n  function block(type) {\n    if (type == \"}\") return cont();\n    return pass(statement, block);\n  }\n  function maybetype(type, value) {\n    if (isTS) {\n      if (type == \":\") return cont(typeexpr);\n      if (value == \"?\") return cont(maybetype);\n    }\n  }\n  function maybetypeOrIn(type, value) {\n    if (isTS && (type == \":\" || value == \"in\")) return cont(typeexpr)\n  }\n  function mayberettype(type) {\n    if (isTS && type == \":\") {\n      if (cx.stream.match(/^\\s*\\w+\\s+is\\b/, false)) return cont(expression, isKW, typeexpr)\n      else return cont(typeexpr)\n    }\n  }\n  function isKW(_, value) {\n    if (value == \"is\") {\n      cx.marked = \"keyword\"\n      return cont()\n    }\n  }\n  function typeexpr(type, value) {\n    if (value == \"keyof\" || value == \"typeof\" || value == \"infer\" || value == \"readonly\") {\n      cx.marked = \"keyword\"\n      return cont(value == \"typeof\" ? expressionNoComma : typeexpr)\n    }\n    if (type == \"variable\" || value == \"void\") {\n      cx.marked = \"type\"\n      return cont(afterType)\n    }\n    if (value == \"|\" || value == \"&\") return cont(typeexpr)\n    if (type == \"string\" || type == \"number\" || type == \"atom\") return cont(afterType);\n    if (type == \"[\") return cont(pushlex(\"]\"), commasep(typeexpr, \"]\", \",\"), poplex, afterType)\n    if (type == \"{\") return cont(pushlex(\"}\"), typeprops, poplex, afterType)\n    if (type == \"(\") return cont(commasep(typearg, \")\"), maybeReturnType, afterType)\n    if (type == \"<\") return cont(commasep(typeexpr, \">\"), typeexpr)\n    if (type == \"quasi\") { return pass(quasiType, afterType); }\n  }\n  function maybeReturnType(type) {\n    if (type == \"=>\") return cont(typeexpr)\n  }\n  function typeprops(type) {\n    if (type.match(/[\\}\\)\\]]/)) return cont()\n    if (type == \",\" || type == \";\") return cont(typeprops)\n    return pass(typeprop, typeprops)\n  }\n  function typeprop(type, value) {\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\"\n      return cont(typeprop)\n    } else if (value == \"?\" || type == \"number\" || type == \"string\") {\n      return cont(typeprop)\n    } else if (type == \":\") {\n      return cont(typeexpr)\n    } else if (type == \"[\") {\n      return cont(expect(\"variable\"), maybetypeOrIn, expect(\"]\"), typeprop)\n    } else if (type == \"(\") {\n      return pass(functiondecl, typeprop)\n    } else if (!type.match(/[;\\}\\)\\],]/)) {\n      return cont()\n    }\n  }\n  function quasiType(type, value) {\n    if (type != \"quasi\") return pass();\n    if (value.slice(value.length - 2) != \"${\") return cont(quasiType);\n    return cont(typeexpr, continueQuasiType);\n  }\n  function continueQuasiType(type) {\n    if (type == \"}\") {\n      cx.marked = \"string-2\";\n      cx.state.tokenize = tokenQuasi;\n      return cont(quasiType);\n    }\n  }\n  function typearg(type, value) {\n    if (type == \"variable\" && cx.stream.match(/^\\s*[?:]/, false) || value == \"?\") return cont(typearg)\n    if (type == \":\") return cont(typeexpr)\n    if (type == \"spread\") return cont(typearg)\n    return pass(typeexpr)\n  }\n  function afterType(type, value) {\n    if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n    if (value == \"|\" || type == \".\" || value == \"&\") return cont(typeexpr)\n    if (type == \"[\") return cont(typeexpr, expect(\"]\"), afterType)\n    if (value == \"extends\" || value == \"implements\") { cx.marked = \"keyword\"; return cont(typeexpr) }\n    if (value == \"?\") return cont(typeexpr, expect(\":\"), typeexpr)\n  }\n  function maybeTypeArgs(_, value) {\n    if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n  }\n  function typeparam() {\n    return pass(typeexpr, maybeTypeDefault)\n  }\n  function maybeTypeDefault(_, value) {\n    if (value == \"=\") return cont(typeexpr)\n  }\n  function vardef(_, value) {\n    if (value == \"enum\") {cx.marked = \"keyword\"; return cont(enumdef)}\n    return pass(pattern, maybetype, maybeAssign, vardefCont);\n  }\n  function pattern(type, value) {\n    if (isTS && isModifier(value)) { cx.marked = \"keyword\"; return cont(pattern) }\n    if (type == \"variable\") { register(value); return cont(); }\n    if (type == \"spread\") return cont(pattern);\n    if (type == \"[\") return contCommasep(eltpattern, \"]\");\n    if (type == \"{\") return contCommasep(proppattern, \"}\");\n  }\n  function proppattern(type, value) {\n    if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n      register(value);\n      return cont(maybeAssign);\n    }\n    if (type == \"variable\") cx.marked = \"property\";\n    if (type == \"spread\") return cont(pattern);\n    if (type == \"}\") return pass();\n    if (type == \"[\") return cont(expression, expect(']'), expect(':'), proppattern);\n    return cont(expect(\":\"), pattern, maybeAssign);\n  }\n  function eltpattern() {\n    return pass(pattern, maybeAssign)\n  }\n  function maybeAssign(_type, value) {\n    if (value == \"=\") return cont(expressionNoComma);\n  }\n  function vardefCont(type) {\n    if (type == \",\") return cont(vardef);\n  }\n  function maybeelse(type, value) {\n    if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n  }\n  function forspec(type, value) {\n    if (value == \"await\") return cont(forspec);\n    if (type == \"(\") return cont(pushlex(\")\"), forspec1, poplex);\n  }\n  function forspec1(type) {\n    if (type == \"var\") return cont(vardef, forspec2);\n    if (type == \"variable\") return cont(forspec2);\n    return pass(forspec2)\n  }\n  function forspec2(type, value) {\n    if (type == \")\") return cont()\n    if (type == \";\") return cont(forspec2)\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression, forspec2) }\n    return pass(expression, forspec2)\n  }\n  function functiondef(type, value) {\n    if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n    if (type == \"variable\") {register(value); return cont(functiondef);}\n    if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, mayberettype, statement, popcontext);\n    if (isTS && value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, functiondef)\n  }\n  function functiondecl(type, value) {\n    if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondecl);}\n    if (type == \"variable\") {register(value); return cont(functiondecl);}\n    if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, mayberettype, popcontext);\n    if (isTS && value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, functiondecl)\n  }\n  function typename(type, value) {\n    if (type == \"keyword\" || type == \"variable\") {\n      cx.marked = \"type\"\n      return cont(typename)\n    } else if (value == \"<\") {\n      return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex)\n    }\n  }\n  function funarg(type, value) {\n    if (value == \"@\") cont(expression, funarg)\n    if (type == \"spread\") return cont(funarg);\n    if (isTS && isModifier(value)) { cx.marked = \"keyword\"; return cont(funarg); }\n    if (isTS && type == \"this\") return cont(maybetype, maybeAssign)\n    return pass(pattern, maybetype, maybeAssign);\n  }\n  function classExpression(type, value) {\n    // Class expressions may have an optional name.\n    if (type == \"variable\") return className(type, value);\n    return classNameAfter(type, value);\n  }\n  function className(type, value) {\n    if (type == \"variable\") {register(value); return cont(classNameAfter);}\n  }\n  function classNameAfter(type, value) {\n    if (value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, classNameAfter)\n    if (value == \"extends\" || value == \"implements\" || (isTS && type == \",\")) {\n      if (value == \"implements\") cx.marked = \"keyword\";\n      return cont(isTS ? typeexpr : expression, classNameAfter);\n    }\n    if (type == \"{\") return cont(pushlex(\"}\"), classBody, poplex);\n  }\n  function classBody(type, value) {\n    if (type == \"async\" ||\n        (type == \"variable\" &&\n         (value == \"static\" || value == \"get\" || value == \"set\" || (isTS && isModifier(value))) &&\n         cx.stream.match(/^\\s+[\\w$\\xa1-\\uffff]/, false))) {\n      cx.marked = \"keyword\";\n      return cont(classBody);\n    }\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\";\n      return cont(classfield, classBody);\n    }\n    if (type == \"number\" || type == \"string\") return cont(classfield, classBody);\n    if (type == \"[\")\n      return cont(expression, maybetype, expect(\"]\"), classfield, classBody)\n    if (value == \"*\") {\n      cx.marked = \"keyword\";\n      return cont(classBody);\n    }\n    if (isTS && type == \"(\") return pass(functiondecl, classBody)\n    if (type == \";\" || type == \",\") return cont(classBody);\n    if (type == \"}\") return cont();\n    if (value == \"@\") return cont(expression, classBody)\n  }\n  function classfield(type, value) {\n    if (value == \"!\") return cont(classfield)\n    if (value == \"?\") return cont(classfield)\n    if (type == \":\") return cont(typeexpr, maybeAssign)\n    if (value == \"=\") return cont(expressionNoComma)\n    var context = cx.state.lexical.prev, isInterface = context && context.info == \"interface\"\n    return pass(isInterface ? functiondecl : functiondef)\n  }\n  function afterExport(type, value) {\n    if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n    if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n    if (type == \"{\") return cont(commasep(exportField, \"}\"), maybeFrom, expect(\";\"));\n    return pass(statement);\n  }\n  function exportField(type, value) {\n    if (value == \"as\") { cx.marked = \"keyword\"; return cont(expect(\"variable\")); }\n    if (type == \"variable\") return pass(expressionNoComma, exportField);\n  }\n  function afterImport(type) {\n    if (type == \"string\") return cont();\n    if (type == \"(\") return pass(expression);\n    if (type == \".\") return pass(maybeoperatorComma);\n    return pass(importSpec, maybeMoreImports, maybeFrom);\n  }\n  function importSpec(type, value) {\n    if (type == \"{\") return contCommasep(importSpec, \"}\");\n    if (type == \"variable\") register(value);\n    if (value == \"*\") cx.marked = \"keyword\";\n    return cont(maybeAs);\n  }\n  function maybeMoreImports(type) {\n    if (type == \",\") return cont(importSpec, maybeMoreImports)\n  }\n  function maybeAs(_type, value) {\n    if (value == \"as\") { cx.marked = \"keyword\"; return cont(importSpec); }\n  }\n  function maybeFrom(_type, value) {\n    if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n  }\n  function arrayLiteral(type) {\n    if (type == \"]\") return cont();\n    return pass(commasep(expressionNoComma, \"]\"));\n  }\n  function enumdef() {\n    return pass(pushlex(\"form\"), pattern, expect(\"{\"), pushlex(\"}\"), commasep(enummember, \"}\"), poplex, poplex)\n  }\n  function enummember() {\n    return pass(pattern, maybeAssign);\n  }\n\n  function isContinuedStatement(state, textAfter) {\n    return state.lastType == \"operator\" || state.lastType == \",\" ||\n      isOperatorChar.test(textAfter.charAt(0)) ||\n      /[,.]/.test(textAfter.charAt(0));\n  }\n\n  function expressionAllowed(stream, state, backUp) {\n    return state.tokenize == tokenBase &&\n      /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\\[{}\\(,;:]|=>)$/.test(state.lastType) ||\n      (state.lastType == \"quasi\" && /\\{\\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      var state = {\n        tokenize: tokenBase,\n        lastType: \"sof\",\n        cc: [],\n        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n        localVars: parserConfig.localVars,\n        context: parserConfig.localVars && new Context(null, null, false),\n        indented: basecolumn || 0\n      };\n      if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n        state.globalVars = parserConfig.globalVars;\n      return state;\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (!state.lexical.hasOwnProperty(\"align\"))\n          state.lexical.align = false;\n        state.indented = stream.indentation();\n        findFatArrow(stream, state);\n      }\n      if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      if (type == \"comment\") return style;\n      state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n      return parseJS(state, style, type, content, stream);\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass;\n      if (state.tokenize != tokenBase) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top\n      // Kludge to prevent 'maybelse' from blocking lexical scope pops\n      if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n        var c = state.cc[i];\n        if (c == poplex) lexical = lexical.prev;\n        else if (c != maybeelse && c != popcontext) break;\n      }\n      while ((lexical.type == \"stat\" || lexical.type == \"form\") &&\n             (firstChar == \"}\" || ((top = state.cc[state.cc.length - 1]) &&\n                                   (top == maybeoperatorComma || top == maybeoperatorNoComma) &&\n                                   !/^[,\\.=+\\-*:?[\\(]/.test(textAfter))))\n        lexical = lexical.prev;\n      if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n        lexical = lexical.prev;\n      var type = lexical.type, closing = firstChar == type;\n\n      if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info.length + 1 : 0);\n      else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n      else if (type == \"form\") return lexical.indented + indentUnit;\n      else if (type == \"stat\")\n        return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);\n      else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\n        return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n      else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n      else return lexical.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricInput: /^\\s*(?:case .*?:|default:|\\{|\\})$/,\n    blockCommentStart: jsonMode ? null : \"/*\",\n    blockCommentEnd: jsonMode ? null : \"*/\",\n    blockCommentContinue: jsonMode ? null : \" * \",\n    lineComment: jsonMode ? null : \"//\",\n    fold: \"brace\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n\n    helperType: jsonMode ? \"json\" : \"javascript\",\n    jsonldMode: jsonldMode,\n    jsonMode: jsonMode,\n\n    expressionAllowed: expressionAllowed,\n\n    skipExpression: function(state) {\n      parseJS(state, \"atom\", \"atom\", \"true\", new CodeMirror.StringStream(\"\", 2, null))\n    }\n  };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/x-javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", { name: \"javascript\", json: true });\nCodeMirror.defineMIME(\"application/x-json\", { name: \"javascript\", json: true });\nCodeMirror.defineMIME(\"application/manifest+json\", { name: \"javascript\", json: true })\nCodeMirror.defineMIME(\"application/ld+json\", { name: \"javascript\", jsonld: true });\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/jinja2/jinja2.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"jinja2\", function() {\n    var keywords = [\"and\", \"as\", \"block\", \"endblock\", \"by\", \"cycle\", \"debug\", \"else\", \"elif\",\n      \"extends\", \"filter\", \"endfilter\", \"firstof\", \"for\",\n      \"endfor\", \"if\", \"endif\", \"ifchanged\", \"endifchanged\",\n      \"ifequal\", \"endifequal\", \"ifnotequal\",\n      \"endifnotequal\", \"in\", \"include\", \"load\", \"not\", \"now\", \"or\",\n      \"parsed\", \"regroup\", \"reversed\", \"spaceless\",\n      \"endspaceless\", \"ssi\", \"templatetag\", \"openblock\",\n      \"closeblock\", \"openvariable\", \"closevariable\",\n      \"openbrace\", \"closebrace\", \"opencomment\",\n      \"closecomment\", \"widthratio\", \"url\", \"with\", \"endwith\",\n      \"get_current_language\", \"trans\", \"endtrans\", \"noop\", \"blocktrans\",\n      \"endblocktrans\", \"get_available_languages\",\n      \"get_current_language_bidi\", \"plural\"],\n    operator = /^[+\\-*&%=<>!?|~^]/,\n    sign = /^[:\\[\\(\\{]/,\n    atom = [\"true\", \"false\"],\n    number = /^(\\d[+\\-\\*\\/])?\\d+(\\.\\d+)?/;\n\n    keywords = new RegExp(\"((\" + keywords.join(\")|(\") + \"))\\\\b\");\n    atom = new RegExp(\"((\" + atom.join(\")|(\") + \"))\\\\b\");\n\n    function tokenBase (stream, state) {\n      var ch = stream.peek();\n\n      //Comment\n      if (state.incomment) {\n        if(!stream.skipTo(\"#}\")) {\n          stream.skipToEnd();\n        } else {\n          stream.eatWhile(/\\#|}/);\n          state.incomment = false;\n        }\n        return \"comment\";\n      //Tag\n      } else if (state.intag) {\n        //After operator\n        if(state.operator) {\n          state.operator = false;\n          if(stream.match(atom)) {\n            return \"atom\";\n          }\n          if(stream.match(number)) {\n            return \"number\";\n          }\n        }\n        //After sign\n        if(state.sign) {\n          state.sign = false;\n          if(stream.match(atom)) {\n            return \"atom\";\n          }\n          if(stream.match(number)) {\n            return \"number\";\n          }\n        }\n\n        if(state.instring) {\n          if(ch == state.instring) {\n            state.instring = false;\n          }\n          stream.next();\n          return \"string\";\n        } else if(ch == \"'\" || ch == '\"') {\n          state.instring = ch;\n          stream.next();\n          return \"string\";\n        } else if(stream.match(state.intag + \"}\") || stream.eat(\"-\") && stream.match(state.intag + \"}\")) {\n          state.intag = false;\n          return \"tag\";\n        } else if(stream.match(operator)) {\n          state.operator = true;\n          return \"operator\";\n        } else if(stream.match(sign)) {\n          state.sign = true;\n        } else {\n          if(stream.eat(\" \") || stream.sol()) {\n            if(stream.match(keywords)) {\n              return \"keyword\";\n            }\n            if(stream.match(atom)) {\n              return \"atom\";\n            }\n            if(stream.match(number)) {\n              return \"number\";\n            }\n            if(stream.sol()) {\n              stream.next();\n            }\n          } else {\n            stream.next();\n          }\n\n        }\n        return \"variable\";\n      } else if (stream.eat(\"{\")) {\n        if (stream.eat(\"#\")) {\n          state.incomment = true;\n          if(!stream.skipTo(\"#}\")) {\n            stream.skipToEnd();\n          } else {\n            stream.eatWhile(/\\#|}/);\n            state.incomment = false;\n          }\n          return \"comment\";\n        //Open tag\n        } else if (ch = stream.eat(/\\{|%/)) {\n          //Cache close tag\n          state.intag = ch;\n          if(ch == \"{\") {\n            state.intag = \"}\";\n          }\n          stream.eat(\"-\");\n          return \"tag\";\n        }\n      }\n      stream.next();\n    };\n\n    return {\n      startState: function () {\n        return {tokenize: tokenBase};\n      },\n      token: function (stream, state) {\n        return state.tokenize(stream, state);\n      },\n      blockCommentStart: \"{#\",\n      blockCommentEnd: \"#}\"\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/jinja2\", \"jinja2\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/jsx/jsx.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../xml/xml\"), require(\"../javascript/javascript\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../xml/xml\", \"../javascript/javascript\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n\n  // Depth means the amount of open braces in JS context, in XML\n  // context 0 means not in tag, 1 means in tag, and 2 means in tag\n  // and js block comment.\n  function Context(state, mode, depth, prev) {\n    this.state = state; this.mode = mode; this.depth = depth; this.prev = prev\n  }\n\n  function copyContext(context) {\n    return new Context(CodeMirror.copyState(context.mode, context.state),\n                       context.mode,\n                       context.depth,\n                       context.prev && copyContext(context.prev))\n  }\n\n  CodeMirror.defineMode(\"jsx\", function(config, modeConfig) {\n    var xmlMode = CodeMirror.getMode(config, {name: \"xml\", allowMissing: true, multilineTagIndentPastTag: false, allowMissingTagName: true})\n    var jsMode = CodeMirror.getMode(config, modeConfig && modeConfig.base || \"javascript\")\n\n    function flatXMLIndent(state) {\n      var tagName = state.tagName\n      state.tagName = null\n      var result = xmlMode.indent(state, \"\", \"\")\n      state.tagName = tagName\n      return result\n    }\n\n    function token(stream, state) {\n      if (state.context.mode == xmlMode)\n        return xmlToken(stream, state, state.context)\n      else\n        return jsToken(stream, state, state.context)\n    }\n\n    function xmlToken(stream, state, cx) {\n      if (cx.depth == 2) { // Inside a JS /* */ comment\n        if (stream.match(/^.*?\\*\\//)) cx.depth = 1\n        else stream.skipToEnd()\n        return \"comment\"\n      }\n\n      if (stream.peek() == \"{\") {\n        xmlMode.skipAttribute(cx.state)\n\n        var indent = flatXMLIndent(cx.state), xmlContext = cx.state.context\n        // If JS starts on same line as tag\n        if (xmlContext && stream.match(/^[^>]*>\\s*$/, false)) {\n          while (xmlContext.prev && !xmlContext.startOfLine)\n            xmlContext = xmlContext.prev\n          // If tag starts the line, use XML indentation level\n          if (xmlContext.startOfLine) indent -= config.indentUnit\n          // Else use JS indentation level\n          else if (cx.prev.state.lexical) indent = cx.prev.state.lexical.indented\n        // Else if inside of tag\n        } else if (cx.depth == 1) {\n          indent += config.indentUnit\n        }\n\n        state.context = new Context(CodeMirror.startState(jsMode, indent),\n                                    jsMode, 0, state.context)\n        return null\n      }\n\n      if (cx.depth == 1) { // Inside of tag\n        if (stream.peek() == \"<\") { // Tag inside of tag\n          xmlMode.skipAttribute(cx.state)\n          state.context = new Context(CodeMirror.startState(xmlMode, flatXMLIndent(cx.state)),\n                                      xmlMode, 0, state.context)\n          return null\n        } else if (stream.match(\"//\")) {\n          stream.skipToEnd()\n          return \"comment\"\n        } else if (stream.match(\"/*\")) {\n          cx.depth = 2\n          return token(stream, state)\n        }\n      }\n\n      var style = xmlMode.token(stream, cx.state), cur = stream.current(), stop\n      if (/\\btag\\b/.test(style)) {\n        if (/>$/.test(cur)) {\n          if (cx.state.context) cx.depth = 0\n          else state.context = state.context.prev\n        } else if (/^</.test(cur)) {\n          cx.depth = 1\n        }\n      } else if (!style && (stop = cur.indexOf(\"{\")) > -1) {\n        stream.backUp(cur.length - stop)\n      }\n      return style\n    }\n\n    function jsToken(stream, state, cx) {\n      if (stream.peek() == \"<\" && jsMode.expressionAllowed(stream, cx.state)) {\n        state.context = new Context(CodeMirror.startState(xmlMode, jsMode.indent(cx.state, \"\", \"\")),\n                                    xmlMode, 0, state.context)\n        jsMode.skipExpression(cx.state)\n        return null\n      }\n\n      var style = jsMode.token(stream, cx.state)\n      if (!style && cx.depth != null) {\n        var cur = stream.current()\n        if (cur == \"{\") {\n          cx.depth++\n        } else if (cur == \"}\") {\n          if (--cx.depth == 0) state.context = state.context.prev\n        }\n      }\n      return style\n    }\n\n    return {\n      startState: function() {\n        return {context: new Context(CodeMirror.startState(jsMode), jsMode)}\n      },\n\n      copyState: function(state) {\n        return {context: copyContext(state.context)}\n      },\n\n      token: token,\n\n      indent: function(state, textAfter, fullLine) {\n        return state.context.mode.indent(state.context.state, textAfter, fullLine)\n      },\n\n      innerMode: function(state) {\n        return state.context\n      }\n    }\n  }, \"xml\", \"javascript\")\n\n  CodeMirror.defineMIME(\"text/jsx\", \"jsx\")\n  CodeMirror.defineMIME(\"text/typescript-jsx\", {name: \"jsx\", base: {name: \"javascript\", typescript: true}})\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/julia/julia.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"julia\", function(config, parserConf) {\n  function wordRegexp(words, end, pre) {\n    if (typeof pre === \"undefined\") { pre = \"\"; }\n    if (typeof end === \"undefined\") { end = \"\\\\b\"; }\n    return new RegExp(\"^\" + pre + \"((\" + words.join(\")|(\") + \"))\" + end);\n  }\n\n  var octChar = \"\\\\\\\\[0-7]{1,3}\";\n  var hexChar = \"\\\\\\\\x[A-Fa-f0-9]{1,2}\";\n  var sChar = \"\\\\\\\\[abefnrtv0%?'\\\"\\\\\\\\]\";\n  var uChar = \"([^\\\\u0027\\\\u005C\\\\uD800-\\\\uDFFF]|[\\\\uD800-\\\\uDFFF][\\\\uDC00-\\\\uDFFF])\";\n\n  var asciiOperatorsList = [\n    \"[<>]:\", \"[<>=]=\", \"<<=?\", \">>>?=?\", \"=>\", \"--?>\", \"<--[->]?\", \"\\\\/\\\\/\",\n    \"\\\\.{2,3}\", \"[\\\\.\\\\\\\\%*+\\\\-<>!\\\\/^|&]=?\", \"\\\\?\", \"\\\\$\", \"~\", \":\"\n  ];\n  var operators = parserConf.operators || wordRegexp([\n    \"[<>]:\", \"[<>=]=\", \"<<=?\", \">>>?=?\", \"=>\", \"--?>\", \"<--[->]?\", \"\\\\/\\\\/\",\n    \"[\\\\\\\\%*+\\\\-<>!\\\\/^|&\\\\u00F7\\\\u22BB]=?\", \"\\\\?\", \"\\\\$\", \"~\", \":\",\n    \"\\\\u00D7\", \"\\\\u2208\", \"\\\\u2209\", \"\\\\u220B\", \"\\\\u220C\", \"\\\\u2218\",\n    \"\\\\u221A\", \"\\\\u221B\", \"\\\\u2229\", \"\\\\u222A\", \"\\\\u2260\", \"\\\\u2264\",\n    \"\\\\u2265\", \"\\\\u2286\", \"\\\\u2288\", \"\\\\u228A\", \"\\\\u22C5\",\n    \"\\\\b(in|isa)\\\\b(?!\\.?\\\\()\"\n  ], \"\");\n  var delimiters = parserConf.delimiters || /^[;,()[\\]{}]/;\n  var identifiers = parserConf.identifiers ||\n        /^[_A-Za-z\\u00A1-\\u2217\\u2219-\\uFFFF][\\w\\u00A1-\\u2217\\u2219-\\uFFFF]*!*/;\n\n  var chars = wordRegexp([octChar, hexChar, sChar, uChar], \"'\");\n\n  var openersList = [\"begin\", \"function\", \"type\", \"struct\", \"immutable\", \"let\",\n        \"macro\", \"for\", \"while\", \"quote\", \"if\", \"else\", \"elseif\", \"try\",\n        \"finally\", \"catch\", \"do\"];\n\n  var closersList = [\"end\", \"else\", \"elseif\", \"catch\", \"finally\"];\n\n  var keywordsList = [\"if\", \"else\", \"elseif\", \"while\", \"for\", \"begin\", \"let\",\n        \"end\", \"do\", \"try\", \"catch\", \"finally\", \"return\", \"break\", \"continue\",\n        \"global\", \"local\", \"const\", \"export\", \"import\", \"importall\", \"using\",\n        \"function\", \"where\", \"macro\", \"module\", \"baremodule\", \"struct\", \"type\",\n        \"mutable\", \"immutable\", \"quote\", \"typealias\", \"abstract\", \"primitive\",\n        \"bitstype\"];\n\n  var builtinsList = [\"true\", \"false\", \"nothing\", \"NaN\", \"Inf\"];\n\n  CodeMirror.registerHelper(\"hintWords\", \"julia\", keywordsList.concat(builtinsList));\n\n  var openers = wordRegexp(openersList);\n  var closers = wordRegexp(closersList);\n  var keywords = wordRegexp(keywordsList);\n  var builtins = wordRegexp(builtinsList);\n\n  var macro = /^@[_A-Za-z\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF]*!*/;\n  var symbol = /^:[_A-Za-z\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF]*!*/;\n  var stringPrefixes = /^(`|([_A-Za-z\\u00A1-\\uFFFF]*\"(\"\")?))/;\n\n  var macroOperators = wordRegexp(asciiOperatorsList, \"\", \"@\");\n  var symbolOperators = wordRegexp(asciiOperatorsList, \"\", \":\");\n\n  function inArray(state) {\n    return (state.nestedArrays > 0);\n  }\n\n  function inGenerator(state) {\n    return (state.nestedGenerators > 0);\n  }\n\n  function currentScope(state, n) {\n    if (typeof(n) === \"undefined\") { n = 0; }\n    if (state.scopes.length <= n) {\n      return null;\n    }\n    return state.scopes[state.scopes.length - (n + 1)];\n  }\n\n  // tokenizers\n  function tokenBase(stream, state) {\n    // Handle multiline comments\n    if (stream.match('#=', false)) {\n      state.tokenize = tokenComment;\n      return state.tokenize(stream, state);\n    }\n\n    // Handle scope changes\n    var leavingExpr = state.leavingExpr;\n    if (stream.sol()) {\n      leavingExpr = false;\n    }\n    state.leavingExpr = false;\n\n    if (leavingExpr) {\n      if (stream.match(/^'+/)) {\n        return \"operator\";\n      }\n    }\n\n    if (stream.match(/\\.{4,}/)) {\n      return \"error\";\n    } else if (stream.match(/\\.{1,3}/)) {\n      return \"operator\";\n    }\n\n    if (stream.eatSpace()) {\n      return null;\n    }\n\n    var ch = stream.peek();\n\n    // Handle single line comments\n    if (ch === '#') {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n\n    if (ch === '[') {\n      state.scopes.push('[');\n      state.nestedArrays++;\n    }\n\n    if (ch === '(') {\n      state.scopes.push('(');\n      state.nestedGenerators++;\n    }\n\n    if (inArray(state) && ch === ']') {\n      while (state.scopes.length && currentScope(state) !== \"[\") { state.scopes.pop(); }\n      state.scopes.pop();\n      state.nestedArrays--;\n      state.leavingExpr = true;\n    }\n\n    if (inGenerator(state) && ch === ')') {\n      while (state.scopes.length && currentScope(state) !== \"(\") { state.scopes.pop(); }\n      state.scopes.pop();\n      state.nestedGenerators--;\n      state.leavingExpr = true;\n    }\n\n    if (inArray(state)) {\n      if (state.lastToken == \"end\" && stream.match(':')) {\n        return \"operator\";\n      }\n      if (stream.match('end')) {\n        return \"number\";\n      }\n    }\n\n    var match;\n    if (match = stream.match(openers, false)) {\n      state.scopes.push(match[0]);\n    }\n\n    if (stream.match(closers, false)) {\n      state.scopes.pop();\n    }\n\n    // Handle type annotations\n    if (stream.match(/^::(?![:\\$])/)) {\n      state.tokenize = tokenAnnotation;\n      return state.tokenize(stream, state);\n    }\n\n    // Handle symbols\n    if (!leavingExpr && (stream.match(symbol) || stream.match(symbolOperators))) {\n      return \"builtin\";\n    }\n\n    // Handle parametric types\n    //if (stream.match(/^{[^}]*}(?=\\()/)) {\n    //  return \"builtin\";\n    //}\n\n    // Handle operators and Delimiters\n    if (stream.match(operators)) {\n      return \"operator\";\n    }\n\n    // Handle Number Literals\n    if (stream.match(/^\\.?\\d/, false)) {\n      var imMatcher = RegExp(/^im\\b/);\n      var numberLiteral = false;\n      if (stream.match(/^0x\\.[0-9a-f_]+p[\\+\\-]?[_\\d]+/i)) { numberLiteral = true; }\n      // Integers\n      if (stream.match(/^0x[0-9a-f_]+/i)) { numberLiteral = true; } // Hex\n      if (stream.match(/^0b[01_]+/i)) { numberLiteral = true; } // Binary\n      if (stream.match(/^0o[0-7_]+/i)) { numberLiteral = true; } // Octal\n      // Floats\n      if (stream.match(/^(?:(?:\\d[_\\d]*)?\\.(?!\\.)(?:\\d[_\\d]*)?|\\d[_\\d]*\\.(?!\\.)(?:\\d[_\\d]*))?([Eef][\\+\\-]?[_\\d]+)?/i)) { numberLiteral = true; }\n      if (stream.match(/^\\d[_\\d]*(e[\\+\\-]?\\d+)?/i)) { numberLiteral = true; } // Decimal\n      if (numberLiteral) {\n          // Integer literals may be \"long\"\n          stream.match(imMatcher);\n          state.leavingExpr = true;\n          return \"number\";\n      }\n    }\n\n    // Handle Chars\n    if (stream.match('\\'')) {\n      state.tokenize = tokenChar;\n      return state.tokenize(stream, state);\n    }\n\n    // Handle Strings\n    if (stream.match(stringPrefixes)) {\n      state.tokenize = tokenStringFactory(stream.current());\n      return state.tokenize(stream, state);\n    }\n\n    if (stream.match(macro) || stream.match(macroOperators)) {\n      return \"meta\";\n    }\n\n    if (stream.match(delimiters)) {\n      return null;\n    }\n\n    if (stream.match(keywords)) {\n      return \"keyword\";\n    }\n\n    if (stream.match(builtins)) {\n      return \"builtin\";\n    }\n\n    var isDefinition = state.isDefinition || state.lastToken == \"function\" ||\n                       state.lastToken == \"macro\" || state.lastToken == \"type\" ||\n                       state.lastToken == \"struct\" || state.lastToken == \"immutable\";\n\n    if (stream.match(identifiers)) {\n      if (isDefinition) {\n        if (stream.peek() === '.') {\n          state.isDefinition = true;\n          return \"variable\";\n        }\n        state.isDefinition = false;\n        return \"def\";\n      }\n      state.leavingExpr = true;\n      return \"variable\";\n    }\n\n    // Handle non-detected items\n    stream.next();\n    return \"error\";\n  }\n\n  function tokenAnnotation(stream, state) {\n    stream.match(/.*?(?=[,;{}()=\\s]|$)/);\n    if (stream.match('{')) {\n      state.nestedParameters++;\n    } else if (stream.match('}') && state.nestedParameters > 0) {\n      state.nestedParameters--;\n    }\n    if (state.nestedParameters > 0) {\n      stream.match(/.*?(?={|})/) || stream.next();\n    } else if (state.nestedParameters == 0) {\n      state.tokenize = tokenBase;\n    }\n    return \"builtin\";\n  }\n\n  function tokenComment(stream, state) {\n    if (stream.match('#=')) {\n      state.nestedComments++;\n    }\n    if (!stream.match(/.*?(?=(#=|=#))/)) {\n      stream.skipToEnd();\n    }\n    if (stream.match('=#')) {\n      state.nestedComments--;\n      if (state.nestedComments == 0)\n        state.tokenize = tokenBase;\n    }\n    return \"comment\";\n  }\n\n  function tokenChar(stream, state) {\n    var isChar = false, match;\n    if (stream.match(chars)) {\n      isChar = true;\n    } else if (match = stream.match(/\\\\u([a-f0-9]{1,4})(?=')/i)) {\n      var value = parseInt(match[1], 16);\n      if (value <= 55295 || value >= 57344) { // (U+0,U+D7FF), (U+E000,U+FFFF)\n        isChar = true;\n        stream.next();\n      }\n    } else if (match = stream.match(/\\\\U([A-Fa-f0-9]{5,8})(?=')/)) {\n      var value = parseInt(match[1], 16);\n      if (value <= 1114111) { // U+10FFFF\n        isChar = true;\n        stream.next();\n      }\n    }\n    if (isChar) {\n      state.leavingExpr = true;\n      state.tokenize = tokenBase;\n      return \"string\";\n    }\n    if (!stream.match(/^[^']+(?=')/)) { stream.skipToEnd(); }\n    if (stream.match('\\'')) { state.tokenize = tokenBase; }\n    return \"error\";\n  }\n\n  function tokenStringFactory(delimiter) {\n    if (delimiter.substr(-3) === '\"\"\"') {\n      delimiter = '\"\"\"';\n    } else if (delimiter.substr(-1) === '\"') {\n      delimiter = '\"';\n    }\n    function tokenString(stream, state) {\n      if (stream.eat('\\\\')) {\n        stream.next();\n      } else if (stream.match(delimiter)) {\n        state.tokenize = tokenBase;\n        state.leavingExpr = true;\n        return \"string\";\n      } else {\n        stream.eat(/[`\"]/);\n      }\n      stream.eatWhile(/[^\\\\`\"]/);\n      return \"string\";\n    }\n    return tokenString;\n  }\n\n  var external = {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        scopes: [],\n        lastToken: null,\n        leavingExpr: false,\n        isDefinition: false,\n        nestedArrays: 0,\n        nestedComments: 0,\n        nestedGenerators: 0,\n        nestedParameters: 0,\n        firstParenPos: -1\n      };\n    },\n\n    token: function(stream, state) {\n      var style = state.tokenize(stream, state);\n      var current = stream.current();\n\n      if (current && style) {\n        state.lastToken = current;\n      }\n\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var delta = 0;\n      if ( textAfter === ']' || textAfter === ')' || /^end\\b/.test(textAfter) ||\n           /^else/.test(textAfter) || /^catch\\b/.test(textAfter) || /^elseif\\b/.test(textAfter) ||\n           /^finally/.test(textAfter) ) {\n        delta = -1;\n      }\n      return (state.scopes.length + delta) * config.indentUnit;\n    },\n\n    electricInput: /\\b(end|else|catch|finally)\\b/,\n    blockCommentStart: \"#=\",\n    blockCommentEnd: \"=#\",\n    lineComment: \"#\",\n    closeBrackets: \"()[]{}\\\"\\\"\",\n    fold: \"indent\"\n  };\n  return external;\n});\n\n\nCodeMirror.defineMIME(\"text/x-julia\", \"julia\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/livescript/livescript.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Link to the project's GitHub page:\n * https://github.com/duralog/CodeMirror\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode('livescript', function(){\n    var tokenBase = function(stream, state) {\n      var next_rule = state.next || \"start\";\n      if (next_rule) {\n        state.next = state.next;\n        var nr = Rules[next_rule];\n        if (nr.splice) {\n          for (var i$ = 0; i$ < nr.length; ++i$) {\n            var r = nr[i$];\n            if (r.regex && stream.match(r.regex)) {\n              state.next = r.next || state.next;\n              return r.token;\n            }\n          }\n          stream.next();\n          return 'error';\n        }\n        if (stream.match(r = Rules[next_rule])) {\n          if (r.regex && stream.match(r.regex)) {\n            state.next = r.next;\n            return r.token;\n          } else {\n            stream.next();\n            return 'error';\n          }\n        }\n      }\n      stream.next();\n      return 'error';\n    };\n    var external = {\n      startState: function(){\n        return {\n          next: 'start',\n          lastToken: {style: null, indent: 0, content: \"\"}\n        };\n      },\n      token: function(stream, state){\n        while (stream.pos == stream.start)\n          var style = tokenBase(stream, state);\n        state.lastToken = {\n          style: style,\n          indent: stream.indentation(),\n          content: stream.current()\n        };\n        return style.replace(/\\./g, ' ');\n      },\n      indent: function(state){\n        var indentation = state.lastToken.indent;\n        if (state.lastToken.content.match(indenter)) {\n          indentation += 2;\n        }\n        return indentation;\n      }\n    };\n    return external;\n  });\n\n  var identifier = '(?![\\\\d\\\\s])[$\\\\w\\\\xAA-\\\\uFFDC](?:(?!\\\\s)[$\\\\w\\\\xAA-\\\\uFFDC]|-[A-Za-z])*';\n  var indenter = RegExp('(?:[({[=:]|[-~]>|\\\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\\\s*all)?|const|var|let|new|catch(?:\\\\s*' + identifier + ')?))\\\\s*$');\n  var keywordend = '(?![$\\\\w]|-[A-Za-z]|\\\\s*:(?![:=]))';\n  var stringfill = {\n    token: 'string',\n    regex: '.+'\n  };\n  var Rules = {\n    start: [\n      {\n        token: 'comment.doc',\n        regex: '/\\\\*',\n        next: 'comment'\n      }, {\n        token: 'comment',\n        regex: '#.*'\n      }, {\n        token: 'keyword',\n        regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend\n      }, {\n        token: 'constant.language',\n        regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend\n      }, {\n        token: 'invalid.illegal',\n        regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend\n      }, {\n        token: 'language.support.class',\n        regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend\n      }, {\n        token: 'language.support.function',\n        regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend\n      }, {\n        token: 'variable.language',\n        regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend\n      }, {\n        token: 'identifier',\n        regex: identifier + '\\\\s*:(?![:=])'\n      }, {\n        token: 'variable',\n        regex: identifier\n      }, {\n        token: 'keyword.operator',\n        regex: '(?:\\\\.{3}|\\\\s+\\\\?)'\n      }, {\n        token: 'keyword.variable',\n        regex: '(?:@+|::|\\\\.\\\\.)',\n        next: 'key'\n      }, {\n        token: 'keyword.operator',\n        regex: '\\\\.\\\\s*',\n        next: 'key'\n      }, {\n        token: 'string',\n        regex: '\\\\\\\\\\\\S[^\\\\s,;)}\\\\]]*'\n      }, {\n        token: 'string.doc',\n        regex: '\\'\\'\\'',\n        next: 'qdoc'\n      }, {\n        token: 'string.doc',\n        regex: '\"\"\"',\n        next: 'qqdoc'\n      }, {\n        token: 'string',\n        regex: '\\'',\n        next: 'qstring'\n      }, {\n        token: 'string',\n        regex: '\"',\n        next: 'qqstring'\n      }, {\n        token: 'string',\n        regex: '`',\n        next: 'js'\n      }, {\n        token: 'string',\n        regex: '<\\\\[',\n        next: 'words'\n      }, {\n        token: 'string.regex',\n        regex: '//',\n        next: 'heregex'\n      }, {\n        token: 'string.regex',\n        regex: '\\\\/(?:[^[\\\\/\\\\n\\\\\\\\]*(?:(?:\\\\\\\\.|\\\\[[^\\\\]\\\\n\\\\\\\\]*(?:\\\\\\\\.[^\\\\]\\\\n\\\\\\\\]*)*\\\\])[^[\\\\/\\\\n\\\\\\\\]*)*)\\\\/[gimy$]{0,4}',\n        next: 'key'\n      }, {\n        token: 'constant.numeric',\n        regex: '(?:0x[\\\\da-fA-F][\\\\da-fA-F_]*|(?:[2-9]|[12]\\\\d|3[0-6])r[\\\\da-zA-Z][\\\\da-zA-Z_]*|(?:\\\\d[\\\\d_]*(?:\\\\.\\\\d[\\\\d_]*)?|\\\\.\\\\d[\\\\d_]*)(?:e[+-]?\\\\d[\\\\d_]*)?[\\\\w$]*)'\n      }, {\n        token: 'lparen',\n        regex: '[({[]'\n      }, {\n        token: 'rparen',\n        regex: '[)}\\\\]]',\n        next: 'key'\n      }, {\n        token: 'keyword.operator',\n        regex: '\\\\S+'\n      }, {\n        token: 'text',\n        regex: '\\\\s+'\n      }\n    ],\n    heregex: [\n      {\n        token: 'string.regex',\n        regex: '.*?//[gimy$?]{0,4}',\n        next: 'start'\n      }, {\n        token: 'string.regex',\n        regex: '\\\\s*#{'\n      }, {\n        token: 'comment.regex',\n        regex: '\\\\s+(?:#.*)?'\n      }, {\n        token: 'string.regex',\n        regex: '\\\\S+'\n      }\n    ],\n    key: [\n      {\n        token: 'keyword.operator',\n        regex: '[.?@!]+'\n      }, {\n        token: 'identifier',\n        regex: identifier,\n        next: 'start'\n      }, {\n        token: 'text',\n        regex: '',\n        next: 'start'\n      }\n    ],\n    comment: [\n      {\n        token: 'comment.doc',\n        regex: '.*?\\\\*/',\n        next: 'start'\n      }, {\n        token: 'comment.doc',\n        regex: '.+'\n      }\n    ],\n    qdoc: [\n      {\n        token: 'string',\n        regex: \".*?'''\",\n        next: 'key'\n      }, stringfill\n    ],\n    qqdoc: [\n      {\n        token: 'string',\n        regex: '.*?\"\"\"',\n        next: 'key'\n      }, stringfill\n    ],\n    qstring: [\n      {\n        token: 'string',\n        regex: '[^\\\\\\\\\\']*(?:\\\\\\\\.[^\\\\\\\\\\']*)*\\'',\n        next: 'key'\n      }, stringfill\n    ],\n    qqstring: [\n      {\n        token: 'string',\n        regex: '[^\\\\\\\\\"]*(?:\\\\\\\\.[^\\\\\\\\\"]*)*\"',\n        next: 'key'\n      }, stringfill\n    ],\n    js: [\n      {\n        token: 'string',\n        regex: '[^\\\\\\\\`]*(?:\\\\\\\\.[^\\\\\\\\`]*)*`',\n        next: 'key'\n      }, stringfill\n    ],\n    words: [\n      {\n        token: 'string',\n        regex: '.*?\\\\]>',\n        next: 'key'\n      }, stringfill\n    ]\n  };\n  for (var idx in Rules) {\n    var r = Rules[idx];\n    if (r.splice) {\n      for (var i = 0, len = r.length; i < len; ++i) {\n        var rr = r[i];\n        if (typeof rr.regex === 'string') {\n          Rules[idx][i].regex = new RegExp('^' + rr.regex);\n        }\n      }\n    } else if (typeof rr.regex === 'string') {\n      Rules[idx].regex = new RegExp('^' + r.regex);\n    }\n  }\n\n  CodeMirror.defineMIME('text/x-livescript', 'livescript');\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/lua/lua.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// LUA mode. Ported to CodeMirror 2 from Franciszek Wawrzak's\n// CodeMirror 1 mode.\n// highlights keywords, strings, comments (no leveling supported! (\"[==[\")), tokens, basic indenting\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"lua\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit;\n\n  function prefixRE(words) {\n    return new RegExp(\"^(?:\" + words.join(\"|\") + \")\", \"i\");\n  }\n  function wordRE(words) {\n    return new RegExp(\"^(?:\" + words.join(\"|\") + \")$\", \"i\");\n  }\n  var specials = wordRE(parserConfig.specials || []);\n\n  // long list of standard functions from lua manual\n  var builtins = wordRE([\n    \"_G\",\"_VERSION\",\"assert\",\"collectgarbage\",\"dofile\",\"error\",\"getfenv\",\"getmetatable\",\"ipairs\",\"load\",\n    \"loadfile\",\"loadstring\",\"module\",\"next\",\"pairs\",\"pcall\",\"print\",\"rawequal\",\"rawget\",\"rawset\",\"require\",\n    \"select\",\"setfenv\",\"setmetatable\",\"tonumber\",\"tostring\",\"type\",\"unpack\",\"xpcall\",\n\n    \"coroutine.create\",\"coroutine.resume\",\"coroutine.running\",\"coroutine.status\",\"coroutine.wrap\",\"coroutine.yield\",\n\n    \"debug.debug\",\"debug.getfenv\",\"debug.gethook\",\"debug.getinfo\",\"debug.getlocal\",\"debug.getmetatable\",\n    \"debug.getregistry\",\"debug.getupvalue\",\"debug.setfenv\",\"debug.sethook\",\"debug.setlocal\",\"debug.setmetatable\",\n    \"debug.setupvalue\",\"debug.traceback\",\n\n    \"close\",\"flush\",\"lines\",\"read\",\"seek\",\"setvbuf\",\"write\",\n\n    \"io.close\",\"io.flush\",\"io.input\",\"io.lines\",\"io.open\",\"io.output\",\"io.popen\",\"io.read\",\"io.stderr\",\"io.stdin\",\n    \"io.stdout\",\"io.tmpfile\",\"io.type\",\"io.write\",\n\n    \"math.abs\",\"math.acos\",\"math.asin\",\"math.atan\",\"math.atan2\",\"math.ceil\",\"math.cos\",\"math.cosh\",\"math.deg\",\n    \"math.exp\",\"math.floor\",\"math.fmod\",\"math.frexp\",\"math.huge\",\"math.ldexp\",\"math.log\",\"math.log10\",\"math.max\",\n    \"math.min\",\"math.modf\",\"math.pi\",\"math.pow\",\"math.rad\",\"math.random\",\"math.randomseed\",\"math.sin\",\"math.sinh\",\n    \"math.sqrt\",\"math.tan\",\"math.tanh\",\n\n    \"os.clock\",\"os.date\",\"os.difftime\",\"os.execute\",\"os.exit\",\"os.getenv\",\"os.remove\",\"os.rename\",\"os.setlocale\",\n    \"os.time\",\"os.tmpname\",\n\n    \"package.cpath\",\"package.loaded\",\"package.loaders\",\"package.loadlib\",\"package.path\",\"package.preload\",\n    \"package.seeall\",\n\n    \"string.byte\",\"string.char\",\"string.dump\",\"string.find\",\"string.format\",\"string.gmatch\",\"string.gsub\",\n    \"string.len\",\"string.lower\",\"string.match\",\"string.rep\",\"string.reverse\",\"string.sub\",\"string.upper\",\n\n    \"table.concat\",\"table.insert\",\"table.maxn\",\"table.remove\",\"table.sort\"\n  ]);\n  var keywords = wordRE([\"and\",\"break\",\"elseif\",\"false\",\"nil\",\"not\",\"or\",\"return\",\n                         \"true\",\"function\", \"end\", \"if\", \"then\", \"else\", \"do\",\n                         \"while\", \"repeat\", \"until\", \"for\", \"in\", \"local\" ]);\n\n  var indentTokens = wordRE([\"function\", \"if\",\"repeat\",\"do\", \"\\\\(\", \"{\"]);\n  var dedentTokens = wordRE([\"end\", \"until\", \"\\\\)\", \"}\"]);\n  var dedentPartial = prefixRE([\"end\", \"until\", \"\\\\)\", \"}\", \"else\", \"elseif\"]);\n\n  function readBracket(stream) {\n    var level = 0;\n    while (stream.eat(\"=\")) ++level;\n    stream.eat(\"[\");\n    return level;\n  }\n\n  function normal(stream, state) {\n    var ch = stream.next();\n    if (ch == \"-\" && stream.eat(\"-\")) {\n      if (stream.eat(\"[\") && stream.eat(\"[\"))\n        return (state.cur = bracketed(readBracket(stream), \"comment\"))(stream, state);\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    if (ch == \"\\\"\" || ch == \"'\")\n      return (state.cur = string(ch))(stream, state);\n    if (ch == \"[\" && /[\\[=]/.test(stream.peek()))\n      return (state.cur = bracketed(readBracket(stream), \"string\"))(stream, state);\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w.%]/);\n      return \"number\";\n    }\n    if (/[\\w_]/.test(ch)) {\n      stream.eatWhile(/[\\w\\\\\\-_.]/);\n      return \"variable\";\n    }\n    return null;\n  }\n\n  function bracketed(level, style) {\n    return function(stream, state) {\n      var curlev = null, ch;\n      while ((ch = stream.next()) != null) {\n        if (curlev == null) {if (ch == \"]\") curlev = 0;}\n        else if (ch == \"=\") ++curlev;\n        else if (ch == \"]\" && curlev == level) { state.cur = normal; break; }\n        else curlev = null;\n      }\n      return style;\n    };\n  }\n\n  function string(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) break;\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      if (!escaped) state.cur = normal;\n      return \"string\";\n    };\n  }\n\n  return {\n    startState: function(basecol) {\n      return {basecol: basecol || 0, indentDepth: 0, cur: normal};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = state.cur(stream, state);\n      var word = stream.current();\n      if (style == \"variable\") {\n        if (keywords.test(word)) style = \"keyword\";\n        else if (builtins.test(word)) style = \"builtin\";\n        else if (specials.test(word)) style = \"variable-2\";\n      }\n      if ((style != \"comment\") && (style != \"string\")){\n        if (indentTokens.test(word)) ++state.indentDepth;\n        else if (dedentTokens.test(word)) --state.indentDepth;\n      }\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var closing = dedentPartial.test(textAfter);\n      return state.basecol + indentUnit * (state.indentDepth - (closing ? 1 : 0));\n    },\n\n    electricInput: /^\\s*(?:end|until|else|\\)|\\})$/,\n    lineComment: \"--\",\n    blockCommentStart: \"--[[\",\n    blockCommentEnd: \"]]\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-lua\", \"lua\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/markdown/markdown.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../xml/xml\"), require(\"../meta\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../xml/xml\", \"../meta\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"markdown\", function(cmCfg, modeCfg) {\n\n  var htmlMode = CodeMirror.getMode(cmCfg, \"text/html\");\n  var htmlModeMissing = htmlMode.name == \"null\"\n\n  function getMode(name) {\n    if (CodeMirror.findModeByName) {\n      var found = CodeMirror.findModeByName(name);\n      if (found) name = found.mime || found.mimes[0];\n    }\n    var mode = CodeMirror.getMode(cmCfg, name);\n    return mode.name == \"null\" ? null : mode;\n  }\n\n  // Should characters that affect highlighting be highlighted separate?\n  // Does not include characters that will be output (such as `1.` and `-` for lists)\n  if (modeCfg.highlightFormatting === undefined)\n    modeCfg.highlightFormatting = false;\n\n  // Maximum number of nested blockquotes. Set to 0 for infinite nesting.\n  // Excess `>` will emit `error` token.\n  if (modeCfg.maxBlockquoteDepth === undefined)\n    modeCfg.maxBlockquoteDepth = 0;\n\n  // Turn on task lists? (\"- [ ] \" and \"- [x] \")\n  if (modeCfg.taskLists === undefined) modeCfg.taskLists = false;\n\n  // Turn on strikethrough syntax\n  if (modeCfg.strikethrough === undefined)\n    modeCfg.strikethrough = false;\n\n  if (modeCfg.emoji === undefined)\n    modeCfg.emoji = false;\n\n  if (modeCfg.fencedCodeBlockHighlighting === undefined)\n    modeCfg.fencedCodeBlockHighlighting = true;\n\n  if (modeCfg.fencedCodeBlockDefaultMode === undefined)\n    modeCfg.fencedCodeBlockDefaultMode = 'text/plain';\n\n  if (modeCfg.xml === undefined)\n    modeCfg.xml = true;\n\n  // Allow token types to be overridden by user-provided token types.\n  if (modeCfg.tokenTypeOverrides === undefined)\n    modeCfg.tokenTypeOverrides = {};\n\n  var tokenTypes = {\n    header: \"header\",\n    code: \"comment\",\n    quote: \"quote\",\n    list1: \"variable-2\",\n    list2: \"variable-3\",\n    list3: \"keyword\",\n    hr: \"hr\",\n    image: \"image\",\n    imageAltText: \"image-alt-text\",\n    imageMarker: \"image-marker\",\n    formatting: \"formatting\",\n    linkInline: \"link\",\n    linkEmail: \"link\",\n    linkText: \"link\",\n    linkHref: \"string\",\n    em: \"em\",\n    strong: \"strong\",\n    strikethrough: \"strikethrough\",\n    emoji: \"builtin\"\n  };\n\n  for (var tokenType in tokenTypes) {\n    if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) {\n      tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType];\n    }\n  }\n\n  var hrRE = /^([*\\-_])(?:\\s*\\1){2,}\\s*$/\n  ,   listRE = /^(?:[*\\-+]|^[0-9]+([.)]))\\s+/\n  ,   taskListRE = /^\\[(x| )\\](?=\\s)/i // Must follow listRE\n  ,   atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/\n  ,   setextHeaderRE = /^ {0,3}(?:\\={1,}|-{2,})\\s*$/\n  ,   textRE = /^[^#!\\[\\]*_\\\\<>` \"'(~:]+/\n  ,   fencedCodeRE = /^(~~~+|```+)[ \\t]*([\\w\\/+#-]*)[^\\n`]*$/\n  ,   linkDefRE = /^\\s*\\[[^\\]]+?\\]:.*$/ // naive link-definition\n  ,   punctuation = /[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E42\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDF3C-\\uDF3E]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]/\n  ,   expandedTab = \"    \" // CommonMark specifies tab as 4 spaces\n\n  function switchInline(stream, state, f) {\n    state.f = state.inline = f;\n    return f(stream, state);\n  }\n\n  function switchBlock(stream, state, f) {\n    state.f = state.block = f;\n    return f(stream, state);\n  }\n\n  function lineIsEmpty(line) {\n    return !line || !/\\S/.test(line.string)\n  }\n\n  // Blocks\n\n  function blankLine(state) {\n    // Reset linkTitle state\n    state.linkTitle = false;\n    state.linkHref = false;\n    state.linkText = false;\n    // Reset EM state\n    state.em = false;\n    // Reset STRONG state\n    state.strong = false;\n    // Reset strikethrough state\n    state.strikethrough = false;\n    // Reset state.quote\n    state.quote = 0;\n    // Reset state.indentedCode\n    state.indentedCode = false;\n    if (state.f == htmlBlock) {\n      var exit = htmlModeMissing\n      if (!exit) {\n        var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n        exit = inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n          (!inner.state.context && inner.state.tokenize.isInText)\n      }\n      if (exit) {\n        state.f = inlineNormal;\n        state.block = blockNormal;\n        state.htmlState = null;\n      }\n    }\n    // Reset state.trailingSpace\n    state.trailingSpace = 0;\n    state.trailingSpaceNewLine = false;\n    // Mark this line as blank\n    state.prevLine = state.thisLine\n    state.thisLine = {stream: null}\n    return null;\n  }\n\n  function blockNormal(stream, state) {\n    var firstTokenOnLine = stream.column() === state.indentation;\n    var prevLineLineIsEmpty = lineIsEmpty(state.prevLine.stream);\n    var prevLineIsIndentedCode = state.indentedCode;\n    var prevLineIsHr = state.prevLine.hr;\n    var prevLineIsList = state.list !== false;\n    var maxNonCodeIndentation = (state.listStack[state.listStack.length - 1] || 0) + 3;\n\n    state.indentedCode = false;\n\n    var lineIndentation = state.indentation;\n    // compute once per line (on first token)\n    if (state.indentationDiff === null) {\n      state.indentationDiff = state.indentation;\n      if (prevLineIsList) {\n        state.list = null;\n        // While this list item's marker's indentation is less than the deepest\n        //  list item's content's indentation,pop the deepest list item\n        //  indentation off the stack, and update block indentation state\n        while (lineIndentation < state.listStack[state.listStack.length - 1]) {\n          state.listStack.pop();\n          if (state.listStack.length) {\n            state.indentation = state.listStack[state.listStack.length - 1];\n          // less than the first list's indent -> the line is no longer a list\n          } else {\n            state.list = false;\n          }\n        }\n        if (state.list !== false) {\n          state.indentationDiff = lineIndentation - state.listStack[state.listStack.length - 1]\n        }\n      }\n    }\n\n    // not comprehensive (currently only for setext detection purposes)\n    var allowsInlineContinuation = (\n        !prevLineLineIsEmpty && !prevLineIsHr && !state.prevLine.header &&\n        (!prevLineIsList || !prevLineIsIndentedCode) &&\n        !state.prevLine.fencedCodeEnd\n    );\n\n    var isHr = (state.list === false || prevLineIsHr || prevLineLineIsEmpty) &&\n      state.indentation <= maxNonCodeIndentation && stream.match(hrRE);\n\n    var match = null;\n    if (state.indentationDiff >= 4 && (prevLineIsIndentedCode || state.prevLine.fencedCodeEnd ||\n         state.prevLine.header || prevLineLineIsEmpty)) {\n      stream.skipToEnd();\n      state.indentedCode = true;\n      return tokenTypes.code;\n    } else if (stream.eatSpace()) {\n      return null;\n    } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(atxHeaderRE)) && match[1].length <= 6) {\n      state.quote = 0;\n      state.header = match[1].length;\n      state.thisLine.header = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      state.f = state.inline;\n      return getType(state);\n    } else if (state.indentation <= maxNonCodeIndentation && stream.eat('>')) {\n      state.quote = firstTokenOnLine ? 1 : state.quote + 1;\n      if (modeCfg.highlightFormatting) state.formatting = \"quote\";\n      stream.eatSpace();\n      return getType(state);\n    } else if (!isHr && !state.setext && firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(listRE))) {\n      var listType = match[1] ? \"ol\" : \"ul\";\n\n      state.indentation = lineIndentation + stream.current().length;\n      state.list = true;\n      state.quote = 0;\n\n      // Add this list item's content's indentation to the stack\n      state.listStack.push(state.indentation);\n      // Reset inline styles which shouldn't propagate across list items\n      state.em = false;\n      state.strong = false;\n      state.code = false;\n      state.strikethrough = false;\n\n      if (modeCfg.taskLists && stream.match(taskListRE, false)) {\n        state.taskList = true;\n      }\n      state.f = state.inline;\n      if (modeCfg.highlightFormatting) state.formatting = [\"list\", \"list-\" + listType];\n      return getType(state);\n    } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(fencedCodeRE, true))) {\n      state.quote = 0;\n      state.fencedEndRE = new RegExp(match[1] + \"+ *$\");\n      // try switching mode\n      state.localMode = modeCfg.fencedCodeBlockHighlighting && getMode(match[2] || modeCfg.fencedCodeBlockDefaultMode );\n      if (state.localMode) state.localState = CodeMirror.startState(state.localMode);\n      state.f = state.block = local;\n      if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n      state.code = -1\n      return getType(state);\n    // SETEXT has lowest block-scope precedence after HR, so check it after\n    //  the others (code, blockquote, list...)\n    } else if (\n      // if setext set, indicates line after ---/===\n      state.setext || (\n        // line before ---/===\n        (!allowsInlineContinuation || !prevLineIsList) && !state.quote && state.list === false &&\n        !state.code && !isHr && !linkDefRE.test(stream.string) &&\n        (match = stream.lookAhead(1)) && (match = match.match(setextHeaderRE))\n      )\n    ) {\n      if ( !state.setext ) {\n        state.header = match[0].charAt(0) == '=' ? 1 : 2;\n        state.setext = state.header;\n      } else {\n        state.header = state.setext;\n        // has no effect on type so we can reset it now\n        state.setext = 0;\n        stream.skipToEnd();\n        if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      }\n      state.thisLine.header = true;\n      state.f = state.inline;\n      return getType(state);\n    } else if (isHr) {\n      stream.skipToEnd();\n      state.hr = true;\n      state.thisLine.hr = true;\n      return tokenTypes.hr;\n    } else if (stream.peek() === '[') {\n      return switchInline(stream, state, footnoteLink);\n    }\n\n    return switchInline(stream, state, state.inline);\n  }\n\n  function htmlBlock(stream, state) {\n    var style = htmlMode.token(stream, state.htmlState);\n    if (!htmlModeMissing) {\n      var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n      if ((inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n           (!inner.state.context && inner.state.tokenize.isInText)) ||\n          (state.md_inside && stream.current().indexOf(\">\") > -1)) {\n        state.f = inlineNormal;\n        state.block = blockNormal;\n        state.htmlState = null;\n      }\n    }\n    return style;\n  }\n\n  function local(stream, state) {\n    var currListInd = state.listStack[state.listStack.length - 1] || 0;\n    var hasExitedList = state.indentation < currListInd;\n    var maxFencedEndInd = currListInd + 3;\n    if (state.fencedEndRE && state.indentation <= maxFencedEndInd && (hasExitedList || stream.match(state.fencedEndRE))) {\n      if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n      var returnType;\n      if (!hasExitedList) returnType = getType(state)\n      state.localMode = state.localState = null;\n      state.block = blockNormal;\n      state.f = inlineNormal;\n      state.fencedEndRE = null;\n      state.code = 0\n      state.thisLine.fencedCodeEnd = true;\n      if (hasExitedList) return switchBlock(stream, state, state.block);\n      return returnType;\n    } else if (state.localMode) {\n      return state.localMode.token(stream, state.localState);\n    } else {\n      stream.skipToEnd();\n      return tokenTypes.code;\n    }\n  }\n\n  // Inline\n  function getType(state) {\n    var styles = [];\n\n    if (state.formatting) {\n      styles.push(tokenTypes.formatting);\n\n      if (typeof state.formatting === \"string\") state.formatting = [state.formatting];\n\n      for (var i = 0; i < state.formatting.length; i++) {\n        styles.push(tokenTypes.formatting + \"-\" + state.formatting[i]);\n\n        if (state.formatting[i] === \"header\") {\n          styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.header);\n        }\n\n        // Add `formatting-quote` and `formatting-quote-#` for blockquotes\n        // Add `error` instead if the maximum blockquote nesting depth is passed\n        if (state.formatting[i] === \"quote\") {\n          if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n            styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.quote);\n          } else {\n            styles.push(\"error\");\n          }\n        }\n      }\n    }\n\n    if (state.taskOpen) {\n      styles.push(\"meta\");\n      return styles.length ? styles.join(' ') : null;\n    }\n    if (state.taskClosed) {\n      styles.push(\"property\");\n      return styles.length ? styles.join(' ') : null;\n    }\n\n    if (state.linkHref) {\n      styles.push(tokenTypes.linkHref, \"url\");\n    } else { // Only apply inline styles to non-url text\n      if (state.strong) { styles.push(tokenTypes.strong); }\n      if (state.em) { styles.push(tokenTypes.em); }\n      if (state.strikethrough) { styles.push(tokenTypes.strikethrough); }\n      if (state.emoji) { styles.push(tokenTypes.emoji); }\n      if (state.linkText) { styles.push(tokenTypes.linkText); }\n      if (state.code) { styles.push(tokenTypes.code); }\n      if (state.image) { styles.push(tokenTypes.image); }\n      if (state.imageAltText) { styles.push(tokenTypes.imageAltText, \"link\"); }\n      if (state.imageMarker) { styles.push(tokenTypes.imageMarker); }\n    }\n\n    if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + \"-\" + state.header); }\n\n    if (state.quote) {\n      styles.push(tokenTypes.quote);\n\n      // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth\n      if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n        styles.push(tokenTypes.quote + \"-\" + state.quote);\n      } else {\n        styles.push(tokenTypes.quote + \"-\" + modeCfg.maxBlockquoteDepth);\n      }\n    }\n\n    if (state.list !== false) {\n      var listMod = (state.listStack.length - 1) % 3;\n      if (!listMod) {\n        styles.push(tokenTypes.list1);\n      } else if (listMod === 1) {\n        styles.push(tokenTypes.list2);\n      } else {\n        styles.push(tokenTypes.list3);\n      }\n    }\n\n    if (state.trailingSpaceNewLine) {\n      styles.push(\"trailing-space-new-line\");\n    } else if (state.trailingSpace) {\n      styles.push(\"trailing-space-\" + (state.trailingSpace % 2 ? \"a\" : \"b\"));\n    }\n\n    return styles.length ? styles.join(' ') : null;\n  }\n\n  function handleText(stream, state) {\n    if (stream.match(textRE, true)) {\n      return getType(state);\n    }\n    return undefined;\n  }\n\n  function inlineNormal(stream, state) {\n    var style = state.text(stream, state);\n    if (typeof style !== 'undefined')\n      return style;\n\n    if (state.list) { // List marker (*, +, -, 1., etc)\n      state.list = null;\n      return getType(state);\n    }\n\n    if (state.taskList) {\n      var taskOpen = stream.match(taskListRE, true)[1] === \" \";\n      if (taskOpen) state.taskOpen = true;\n      else state.taskClosed = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"task\";\n      state.taskList = false;\n      return getType(state);\n    }\n\n    state.taskOpen = false;\n    state.taskClosed = false;\n\n    if (state.header && stream.match(/^#+$/, true)) {\n      if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      return getType(state);\n    }\n\n    var ch = stream.next();\n\n    // Matches link titles present on next line\n    if (state.linkTitle) {\n      state.linkTitle = false;\n      var matchCh = ch;\n      if (ch === '(') {\n        matchCh = ')';\n      }\n      matchCh = (matchCh+'').replace(/([.?*+^\\[\\]\\\\(){}|-])/g, \"\\\\$1\");\n      var regex = '^\\\\s*(?:[^' + matchCh + '\\\\\\\\]+|\\\\\\\\\\\\\\\\|\\\\\\\\.)' + matchCh;\n      if (stream.match(new RegExp(regex), true)) {\n        return tokenTypes.linkHref;\n      }\n    }\n\n    // If this block is changed, it may need to be updated in GFM mode\n    if (ch === '`') {\n      var previousFormatting = state.formatting;\n      if (modeCfg.highlightFormatting) state.formatting = \"code\";\n      stream.eatWhile('`');\n      var count = stream.current().length\n      if (state.code == 0 && (!state.quote || count == 1)) {\n        state.code = count\n        return getType(state)\n      } else if (count == state.code) { // Must be exact\n        var t = getType(state)\n        state.code = 0\n        return t\n      } else {\n        state.formatting = previousFormatting\n        return getType(state)\n      }\n    } else if (state.code) {\n      return getType(state);\n    }\n\n    if (ch === '\\\\') {\n      stream.next();\n      if (modeCfg.highlightFormatting) {\n        var type = getType(state);\n        var formattingEscape = tokenTypes.formatting + \"-escape\";\n        return type ? type + \" \" + formattingEscape : formattingEscape;\n      }\n    }\n\n    if (ch === '!' && stream.match(/\\[[^\\]]*\\] ?(?:\\(|\\[)/, false)) {\n      state.imageMarker = true;\n      state.image = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      return getType(state);\n    }\n\n    if (ch === '[' && state.imageMarker && stream.match(/[^\\]]*\\](\\(.*?\\)| ?\\[.*?\\])/, false)) {\n      state.imageMarker = false;\n      state.imageAltText = true\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      return getType(state);\n    }\n\n    if (ch === ']' && state.imageAltText) {\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      var type = getType(state);\n      state.imageAltText = false;\n      state.image = false;\n      state.inline = state.f = linkHref;\n      return type;\n    }\n\n    if (ch === '[' && !state.image) {\n      if (state.linkText && stream.match(/^.*?\\]/)) return getType(state)\n      state.linkText = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      return getType(state);\n    }\n\n    if (ch === ']' && state.linkText) {\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      state.linkText = false;\n      state.inline = state.f = stream.match(/\\(.*?\\)| ?\\[.*?\\]/, false) ? linkHref : inlineNormal\n      return type;\n    }\n\n    if (ch === '<' && stream.match(/^(https?|ftps?):\\/\\/(?:[^\\\\>]|\\\\.)+>/, false)) {\n      state.f = state.inline = linkInline;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkInline;\n    }\n\n    if (ch === '<' && stream.match(/^[^> \\\\]+@(?:[^\\\\>]|\\\\.)+>/, false)) {\n      state.f = state.inline = linkInline;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkEmail;\n    }\n\n    if (modeCfg.xml && ch === '<' && stream.match(/^(!--|\\?|!\\[CDATA\\[|[a-z][a-z0-9-]*(?:\\s+[a-z_:.\\-]+(?:\\s*=\\s*[^>]+)?)*\\s*(?:>|$))/i, false)) {\n      var end = stream.string.indexOf(\">\", stream.pos);\n      if (end != -1) {\n        var atts = stream.string.substring(stream.start, end);\n        if (/markdown\\s*=\\s*('|\"){0,1}1('|\"){0,1}/.test(atts)) state.md_inside = true;\n      }\n      stream.backUp(1);\n      state.htmlState = CodeMirror.startState(htmlMode);\n      return switchBlock(stream, state, htmlBlock);\n    }\n\n    if (modeCfg.xml && ch === '<' && stream.match(/^\\/\\w*?>/)) {\n      state.md_inside = false;\n      return \"tag\";\n    } else if (ch === \"*\" || ch === \"_\") {\n      var len = 1, before = stream.pos == 1 ? \" \" : stream.string.charAt(stream.pos - 2)\n      while (len < 3 && stream.eat(ch)) len++\n      var after = stream.peek() || \" \"\n      // See http://spec.commonmark.org/0.27/#emphasis-and-strong-emphasis\n      var leftFlanking = !/\\s/.test(after) && (!punctuation.test(after) || /\\s/.test(before) || punctuation.test(before))\n      var rightFlanking = !/\\s/.test(before) && (!punctuation.test(before) || /\\s/.test(after) || punctuation.test(after))\n      var setEm = null, setStrong = null\n      if (len % 2) { // Em\n        if (!state.em && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n          setEm = true\n        else if (state.em == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n          setEm = false\n      }\n      if (len > 1) { // Strong\n        if (!state.strong && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n          setStrong = true\n        else if (state.strong == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n          setStrong = false\n      }\n      if (setStrong != null || setEm != null) {\n        if (modeCfg.highlightFormatting) state.formatting = setEm == null ? \"strong\" : setStrong == null ? \"em\" : \"strong em\"\n        if (setEm === true) state.em = ch\n        if (setStrong === true) state.strong = ch\n        var t = getType(state)\n        if (setEm === false) state.em = false\n        if (setStrong === false) state.strong = false\n        return t\n      }\n    } else if (ch === ' ') {\n      if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces\n        if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n          return getType(state);\n        } else { // Not surrounded by spaces, back up pointer\n          stream.backUp(1);\n        }\n      }\n    }\n\n    if (modeCfg.strikethrough) {\n      if (ch === '~' && stream.eatWhile(ch)) {\n        if (state.strikethrough) {// Remove strikethrough\n          if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n          var t = getType(state);\n          state.strikethrough = false;\n          return t;\n        } else if (stream.match(/^[^\\s]/, false)) {// Add strikethrough\n          state.strikethrough = true;\n          if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n          return getType(state);\n        }\n      } else if (ch === ' ') {\n        if (stream.match('~~', true)) { // Probably surrounded by space\n          if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n            return getType(state);\n          } else { // Not surrounded by spaces, back up pointer\n            stream.backUp(2);\n          }\n        }\n      }\n    }\n\n    if (modeCfg.emoji && ch === \":\" && stream.match(/^(?:[a-z_\\d+][a-z_\\d+-]*|\\-[a-z_\\d+][a-z_\\d+-]*):/)) {\n      state.emoji = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"emoji\";\n      var retType = getType(state);\n      state.emoji = false;\n      return retType;\n    }\n\n    if (ch === ' ') {\n      if (stream.match(/^ +$/, false)) {\n        state.trailingSpace++;\n      } else if (state.trailingSpace) {\n        state.trailingSpaceNewLine = true;\n      }\n    }\n\n    return getType(state);\n  }\n\n  function linkInline(stream, state) {\n    var ch = stream.next();\n\n    if (ch === \">\") {\n      state.f = state.inline = inlineNormal;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkInline;\n    }\n\n    stream.match(/^[^>]+/, true);\n\n    return tokenTypes.linkInline;\n  }\n\n  function linkHref(stream, state) {\n    // Check if space, and return NULL if so (to avoid marking the space)\n    if(stream.eatSpace()){\n      return null;\n    }\n    var ch = stream.next();\n    if (ch === '(' || ch === '[') {\n      state.f = state.inline = getLinkHrefInside(ch === \"(\" ? \")\" : \"]\");\n      if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n      state.linkHref = true;\n      return getType(state);\n    }\n    return 'error';\n  }\n\n  var linkRE = {\n    \")\": /^(?:[^\\\\\\(\\)]|\\\\.|\\((?:[^\\\\\\(\\)]|\\\\.)*\\))*?(?=\\))/,\n    \"]\": /^(?:[^\\\\\\[\\]]|\\\\.|\\[(?:[^\\\\\\[\\]]|\\\\.)*\\])*?(?=\\])/\n  }\n\n  function getLinkHrefInside(endChar) {\n    return function(stream, state) {\n      var ch = stream.next();\n\n      if (ch === endChar) {\n        state.f = state.inline = inlineNormal;\n        if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n        var returnState = getType(state);\n        state.linkHref = false;\n        return returnState;\n      }\n\n      stream.match(linkRE[endChar])\n      state.linkHref = true;\n      return getType(state);\n    };\n  }\n\n  function footnoteLink(stream, state) {\n    if (stream.match(/^([^\\]\\\\]|\\\\.)*\\]:/, false)) {\n      state.f = footnoteLinkInside;\n      stream.next(); // Consume [\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      state.linkText = true;\n      return getType(state);\n    }\n    return switchInline(stream, state, inlineNormal);\n  }\n\n  function footnoteLinkInside(stream, state) {\n    if (stream.match(']:', true)) {\n      state.f = state.inline = footnoteUrl;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var returnType = getType(state);\n      state.linkText = false;\n      return returnType;\n    }\n\n    stream.match(/^([^\\]\\\\]|\\\\.)+/, true);\n\n    return tokenTypes.linkText;\n  }\n\n  function footnoteUrl(stream, state) {\n    // Check if space, and return NULL if so (to avoid marking the space)\n    if(stream.eatSpace()){\n      return null;\n    }\n    // Match URL\n    stream.match(/^[^\\s]+/, true);\n    // Check for link title\n    if (stream.peek() === undefined) { // End of line, set flag to check next line\n      state.linkTitle = true;\n    } else { // More content on line, check if link title\n      stream.match(/^(?:\\s+(?:\"(?:[^\"\\\\]|\\\\.)+\"|'(?:[^'\\\\]|\\\\.)+'|\\((?:[^)\\\\]|\\\\.)+\\)))?/, true);\n    }\n    state.f = state.inline = inlineNormal;\n    return tokenTypes.linkHref + \" url\";\n  }\n\n  var mode = {\n    startState: function() {\n      return {\n        f: blockNormal,\n\n        prevLine: {stream: null},\n        thisLine: {stream: null},\n\n        block: blockNormal,\n        htmlState: null,\n        indentation: 0,\n\n        inline: inlineNormal,\n        text: handleText,\n\n        formatting: false,\n        linkText: false,\n        linkHref: false,\n        linkTitle: false,\n        code: 0,\n        em: false,\n        strong: false,\n        header: 0,\n        setext: 0,\n        hr: false,\n        taskList: false,\n        list: false,\n        listStack: [],\n        quote: 0,\n        trailingSpace: 0,\n        trailingSpaceNewLine: false,\n        strikethrough: false,\n        emoji: false,\n        fencedEndRE: null\n      };\n    },\n\n    copyState: function(s) {\n      return {\n        f: s.f,\n\n        prevLine: s.prevLine,\n        thisLine: s.thisLine,\n\n        block: s.block,\n        htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState),\n        indentation: s.indentation,\n\n        localMode: s.localMode,\n        localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null,\n\n        inline: s.inline,\n        text: s.text,\n        formatting: false,\n        linkText: s.linkText,\n        linkTitle: s.linkTitle,\n        linkHref: s.linkHref,\n        code: s.code,\n        em: s.em,\n        strong: s.strong,\n        strikethrough: s.strikethrough,\n        emoji: s.emoji,\n        header: s.header,\n        setext: s.setext,\n        hr: s.hr,\n        taskList: s.taskList,\n        list: s.list,\n        listStack: s.listStack.slice(0),\n        quote: s.quote,\n        indentedCode: s.indentedCode,\n        trailingSpace: s.trailingSpace,\n        trailingSpaceNewLine: s.trailingSpaceNewLine,\n        md_inside: s.md_inside,\n        fencedEndRE: s.fencedEndRE\n      };\n    },\n\n    token: function(stream, state) {\n\n      // Reset state.formatting\n      state.formatting = false;\n\n      if (stream != state.thisLine.stream) {\n        state.header = 0;\n        state.hr = false;\n\n        if (stream.match(/^\\s*$/, true)) {\n          blankLine(state);\n          return null;\n        }\n\n        state.prevLine = state.thisLine\n        state.thisLine = {stream: stream}\n\n        // Reset state.taskList\n        state.taskList = false;\n\n        // Reset state.trailingSpace\n        state.trailingSpace = 0;\n        state.trailingSpaceNewLine = false;\n\n        if (!state.localState) {\n          state.f = state.block;\n          if (state.f != htmlBlock) {\n            var indentation = stream.match(/^\\s*/, true)[0].replace(/\\t/g, expandedTab).length;\n            state.indentation = indentation;\n            state.indentationDiff = null;\n            if (indentation > 0) return null;\n          }\n        }\n      }\n      return state.f(stream, state);\n    },\n\n    innerMode: function(state) {\n      if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode};\n      if (state.localState) return {state: state.localState, mode: state.localMode};\n      return {state: state, mode: mode};\n    },\n\n    indent: function(state, textAfter, line) {\n      if (state.block == htmlBlock && htmlMode.indent) return htmlMode.indent(state.htmlState, textAfter, line)\n      if (state.localState && state.localMode.indent) return state.localMode.indent(state.localState, textAfter, line)\n      return CodeMirror.Pass\n    },\n\n    blankLine: blankLine,\n\n    getType: getType,\n\n    blockCommentStart: \"<!--\",\n    blockCommentEnd: \"-->\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n    fold: \"markdown\"\n  };\n  return mode;\n}, \"xml\");\n\nCodeMirror.defineMIME(\"text/markdown\", \"markdown\");\n\nCodeMirror.defineMIME(\"text/x-markdown\", \"markdown\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/mathematica/mathematica.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Mathematica mode copyright (c) 2015 by Calin Barbat\n// Based on code by Patrick Scheibe (halirutan)\n// See: https://github.com/halirutan/Mathematica-Source-Highlighting/tree/master/src/lang-mma.js\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('mathematica', function(_config, _parserConfig) {\n\n  // used pattern building blocks\n  var Identifier = '[a-zA-Z\\\\$][a-zA-Z0-9\\\\$]*';\n  var pBase      = \"(?:\\\\d+)\";\n  var pFloat     = \"(?:\\\\.\\\\d+|\\\\d+\\\\.\\\\d*|\\\\d+)\";\n  var pFloatBase = \"(?:\\\\.\\\\w+|\\\\w+\\\\.\\\\w*|\\\\w+)\";\n  var pPrecision = \"(?:`(?:`?\"+pFloat+\")?)\";\n\n  // regular expressions\n  var reBaseForm        = new RegExp('(?:'+pBase+'(?:\\\\^\\\\^'+pFloatBase+pPrecision+'?(?:\\\\*\\\\^[+-]?\\\\d+)?))');\n  var reFloatForm       = new RegExp('(?:' + pFloat + pPrecision + '?(?:\\\\*\\\\^[+-]?\\\\d+)?)');\n  var reIdInContext     = new RegExp('(?:`?)(?:' + Identifier + ')(?:`(?:' + Identifier + '))*(?:`?)');\n\n  function tokenBase(stream, state) {\n    var ch;\n\n    // get next character\n    ch = stream.next();\n\n    // string\n    if (ch === '\"') {\n      state.tokenize = tokenString;\n      return state.tokenize(stream, state);\n    }\n\n    // comment\n    if (ch === '(') {\n      if (stream.eat('*')) {\n        state.commentLevel++;\n        state.tokenize = tokenComment;\n        return state.tokenize(stream, state);\n      }\n    }\n\n    // go back one character\n    stream.backUp(1);\n\n    // look for numbers\n    // Numbers in a baseform\n    if (stream.match(reBaseForm, true, false)) {\n      return 'number';\n    }\n\n    // Mathematica numbers. Floats (1.2, .2, 1.) can have optionally a precision (`float) or an accuracy definition\n    // (``float). Note: while 1.2` is possible 1.2`` is not. At the end an exponent (float*^+12) can follow.\n    if (stream.match(reFloatForm, true, false)) {\n      return 'number';\n    }\n\n    /* In[23] and Out[34] */\n    if (stream.match(/(?:In|Out)\\[[0-9]*\\]/, true, false)) {\n      return 'atom';\n    }\n\n    // usage\n    if (stream.match(/([a-zA-Z\\$][a-zA-Z0-9\\$]*(?:`[a-zA-Z0-9\\$]+)*::usage)/, true, false)) {\n      return 'meta';\n    }\n\n    // message\n    if (stream.match(/([a-zA-Z\\$][a-zA-Z0-9\\$]*(?:`[a-zA-Z0-9\\$]+)*::[a-zA-Z\\$][a-zA-Z0-9\\$]*):?/, true, false)) {\n      return 'string-2';\n    }\n\n    // this makes a look-ahead match for something like variable:{_Integer}\n    // the match is then forwarded to the mma-patterns tokenizer.\n    if (stream.match(/([a-zA-Z\\$][a-zA-Z0-9\\$]*\\s*:)(?:(?:[a-zA-Z\\$][a-zA-Z0-9\\$]*)|(?:[^:=>~@\\^\\&\\*\\)\\[\\]'\\?,\\|])).*/, true, false)) {\n      return 'variable-2';\n    }\n\n    // catch variables which are used together with Blank (_), BlankSequence (__) or BlankNullSequence (___)\n    // Cannot start with a number, but can have numbers at any other position. Examples\n    // blub__Integer, a1_, b34_Integer32\n    if (stream.match(/[a-zA-Z\\$][a-zA-Z0-9\\$]*_+[a-zA-Z\\$][a-zA-Z0-9\\$]*/, true, false)) {\n      return 'variable-2';\n    }\n    if (stream.match(/[a-zA-Z\\$][a-zA-Z0-9\\$]*_+/, true, false)) {\n      return 'variable-2';\n    }\n    if (stream.match(/_+[a-zA-Z\\$][a-zA-Z0-9\\$]*/, true, false)) {\n      return 'variable-2';\n    }\n\n    // Named characters in Mathematica, like \\[Gamma].\n    if (stream.match(/\\\\\\[[a-zA-Z\\$][a-zA-Z0-9\\$]*\\]/, true, false)) {\n      return 'variable-3';\n    }\n\n    // Match all braces separately\n    if (stream.match(/(?:\\[|\\]|{|}|\\(|\\))/, true, false)) {\n      return 'bracket';\n    }\n\n    // Catch Slots (#, ##, #3, ##9 and the V10 named slots #name). I have never seen someone using more than one digit after #, so we match\n    // only one.\n    if (stream.match(/(?:#[a-zA-Z\\$][a-zA-Z0-9\\$]*|#+[0-9]?)/, true, false)) {\n      return 'variable-2';\n    }\n\n    // Literals like variables, keywords, functions\n    if (stream.match(reIdInContext, true, false)) {\n      return 'keyword';\n    }\n\n    // operators. Note that operators like @@ or /; are matched separately for each symbol.\n    if (stream.match(/(?:\\\\|\\+|\\-|\\*|\\/|,|;|\\.|:|@|~|=|>|<|&|\\||_|`|'|\\^|\\?|!|%)/, true, false)) {\n      return 'operator';\n    }\n\n    // everything else is an error\n    stream.next(); // advance the stream.\n    return 'error';\n  }\n\n  function tokenString(stream, state) {\n    var next, end = false, escaped = false;\n    while ((next = stream.next()) != null) {\n      if (next === '\"' && !escaped) {\n        end = true;\n        break;\n      }\n      escaped = !escaped && next === '\\\\';\n    }\n    if (end && !escaped) {\n      state.tokenize = tokenBase;\n    }\n    return 'string';\n  };\n\n  function tokenComment(stream, state) {\n    var prev, next;\n    while(state.commentLevel > 0 && (next = stream.next()) != null) {\n      if (prev === '(' && next === '*') state.commentLevel++;\n      if (prev === '*' && next === ')') state.commentLevel--;\n      prev = next;\n    }\n    if (state.commentLevel <= 0) {\n      state.tokenize = tokenBase;\n    }\n    return 'comment';\n  }\n\n  return {\n    startState: function() {return {tokenize: tokenBase, commentLevel: 0};},\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      return state.tokenize(stream, state);\n    },\n    blockCommentStart: \"(*\",\n    blockCommentEnd: \"*)\"\n  };\n});\n\nCodeMirror.defineMIME('text/x-mathematica', {\n  name: 'mathematica'\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/mbox/mbox.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar rfc2822 = [\n  \"From\", \"Sender\", \"Reply-To\", \"To\", \"Cc\", \"Bcc\", \"Message-ID\",\n  \"In-Reply-To\", \"References\", \"Resent-From\", \"Resent-Sender\", \"Resent-To\",\n  \"Resent-Cc\", \"Resent-Bcc\", \"Resent-Message-ID\", \"Return-Path\", \"Received\"\n];\nvar rfc2822NoEmail = [\n  \"Date\", \"Subject\", \"Comments\", \"Keywords\", \"Resent-Date\"\n];\n\nCodeMirror.registerHelper(\"hintWords\", \"mbox\", rfc2822.concat(rfc2822NoEmail));\n\nvar whitespace = /^[ \\t]/;\nvar separator = /^From /; // See RFC 4155\nvar rfc2822Header = new RegExp(\"^(\" + rfc2822.join(\"|\") + \"): \");\nvar rfc2822HeaderNoEmail = new RegExp(\"^(\" + rfc2822NoEmail.join(\"|\") + \"): \");\nvar header = /^[^:]+:/; // Optional fields defined in RFC 2822\nvar email = /^[^ ]+@[^ ]+/;\nvar untilEmail = /^.*?(?=[^ ]+?@[^ ]+)/;\nvar bracketedEmail = /^<.*?>/;\nvar untilBracketedEmail = /^.*?(?=<.*>)/;\n\nfunction styleForHeader(header) {\n  if (header === \"Subject\") return \"header\";\n  return \"string\";\n}\n\nfunction readToken(stream, state) {\n  if (stream.sol()) {\n    // From last line\n    state.inSeparator = false;\n    if (state.inHeader && stream.match(whitespace)) {\n      // Header folding\n      return null;\n    } else {\n      state.inHeader = false;\n      state.header = null;\n    }\n\n    if (stream.match(separator)) {\n      state.inHeaders = true;\n      state.inSeparator = true;\n      return \"atom\";\n    }\n\n    var match;\n    var emailPermitted = false;\n    if ((match = stream.match(rfc2822HeaderNoEmail)) ||\n        (emailPermitted = true) && (match = stream.match(rfc2822Header))) {\n      state.inHeaders = true;\n      state.inHeader = true;\n      state.emailPermitted = emailPermitted;\n      state.header = match[1];\n      return \"atom\";\n    }\n\n    // Use vim's heuristics: recognize custom headers only if the line is in a\n    // block of legitimate headers.\n    if (state.inHeaders && (match = stream.match(header))) {\n      state.inHeader = true;\n      state.emailPermitted = true;\n      state.header = match[1];\n      return \"atom\";\n    }\n\n    state.inHeaders = false;\n    stream.skipToEnd();\n    return null;\n  }\n\n  if (state.inSeparator) {\n    if (stream.match(email)) return \"link\";\n    if (stream.match(untilEmail)) return \"atom\";\n    stream.skipToEnd();\n    return \"atom\";\n  }\n\n  if (state.inHeader) {\n    var style = styleForHeader(state.header);\n\n    if (state.emailPermitted) {\n      if (stream.match(bracketedEmail)) return style + \" link\";\n      if (stream.match(untilBracketedEmail)) return style;\n    }\n    stream.skipToEnd();\n    return style;\n  }\n\n  stream.skipToEnd();\n  return null;\n};\n\nCodeMirror.defineMode(\"mbox\", function() {\n  return {\n    startState: function() {\n      return {\n        // Is in a mbox separator\n        inSeparator: false,\n        // Is in a mail header\n        inHeader: false,\n        // If bracketed email is permitted. Only applicable when inHeader\n        emailPermitted: false,\n        // Name of current header\n        header: null,\n        // Is in a region of mail headers\n        inHeaders: false\n      };\n    },\n    token: readToken,\n    blankLine: function(state) {\n      state.inHeaders = state.inSeparator = state.inHeader = false;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"application/mbox\", \"mbox\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/meta.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.modeInfo = [\n    {name: \"APL\", mime: \"text/apl\", mode: \"apl\", ext: [\"dyalog\", \"apl\"]},\n    {name: \"PGP\", mimes: [\"application/pgp\", \"application/pgp-encrypted\", \"application/pgp-keys\", \"application/pgp-signature\"], mode: \"asciiarmor\", ext: [\"asc\", \"pgp\", \"sig\"]},\n    {name: \"ASN.1\", mime: \"text/x-ttcn-asn\", mode: \"asn.1\", ext: [\"asn\", \"asn1\"]},\n    {name: \"Asterisk\", mime: \"text/x-asterisk\", mode: \"asterisk\", file: /^extensions\\.conf$/i},\n    {name: \"Brainfuck\", mime: \"text/x-brainfuck\", mode: \"brainfuck\", ext: [\"b\", \"bf\"]},\n    {name: \"C\", mime: \"text/x-csrc\", mode: \"clike\", ext: [\"c\", \"h\", \"ino\"]},\n    {name: \"C++\", mime: \"text/x-c++src\", mode: \"clike\", ext: [\"cpp\", \"c++\", \"cc\", \"cxx\", \"hpp\", \"h++\", \"hh\", \"hxx\"], alias: [\"cpp\"]},\n    {name: \"Cobol\", mime: \"text/x-cobol\", mode: \"cobol\", ext: [\"cob\", \"cpy\", \"cbl\"]},\n    {name: \"C#\", mime: \"text/x-csharp\", mode: \"clike\", ext: [\"cs\"], alias: [\"csharp\", \"cs\"]},\n    {name: \"Clojure\", mime: \"text/x-clojure\", mode: \"clojure\", ext: [\"clj\", \"cljc\", \"cljx\"]},\n    {name: \"ClojureScript\", mime: \"text/x-clojurescript\", mode: \"clojure\", ext: [\"cljs\"]},\n    {name: \"Closure Stylesheets (GSS)\", mime: \"text/x-gss\", mode: \"css\", ext: [\"gss\"]},\n    {name: \"CMake\", mime: \"text/x-cmake\", mode: \"cmake\", ext: [\"cmake\", \"cmake.in\"], file: /^CMakeLists\\.txt$/},\n    {name: \"CoffeeScript\", mimes: [\"application/vnd.coffeescript\", \"text/coffeescript\", \"text/x-coffeescript\"], mode: \"coffeescript\", ext: [\"coffee\"], alias: [\"coffee\", \"coffee-script\"]},\n    {name: \"Common Lisp\", mime: \"text/x-common-lisp\", mode: \"commonlisp\", ext: [\"cl\", \"lisp\", \"el\"], alias: [\"lisp\"]},\n    {name: \"Cypher\", mime: \"application/x-cypher-query\", mode: \"cypher\", ext: [\"cyp\", \"cypher\"]},\n    {name: \"Cython\", mime: \"text/x-cython\", mode: \"python\", ext: [\"pyx\", \"pxd\", \"pxi\"]},\n    {name: \"Crystal\", mime: \"text/x-crystal\", mode: \"crystal\", ext: [\"cr\"]},\n    {name: \"CSS\", mime: \"text/css\", mode: \"css\", ext: [\"css\"]},\n    {name: \"CQL\", mime: \"text/x-cassandra\", mode: \"sql\", ext: [\"cql\"]},\n    {name: \"D\", mime: \"text/x-d\", mode: \"d\", ext: [\"d\"]},\n    {name: \"Dart\", mimes: [\"application/dart\", \"text/x-dart\"], mode: \"dart\", ext: [\"dart\"]},\n    {name: \"diff\", mime: \"text/x-diff\", mode: \"diff\", ext: [\"diff\", \"patch\"]},\n    {name: \"Django\", mime: \"text/x-django\", mode: \"django\"},\n    {name: \"Dockerfile\", mime: \"text/x-dockerfile\", mode: \"dockerfile\", file: /^Dockerfile$/},\n    {name: \"DTD\", mime: \"application/xml-dtd\", mode: \"dtd\", ext: [\"dtd\"]},\n    {name: \"Dylan\", mime: \"text/x-dylan\", mode: \"dylan\", ext: [\"dylan\", \"dyl\", \"intr\"]},\n    {name: \"EBNF\", mime: \"text/x-ebnf\", mode: \"ebnf\"},\n    {name: \"ECL\", mime: \"text/x-ecl\", mode: \"ecl\", ext: [\"ecl\"]},\n    {name: \"edn\", mime: \"application/edn\", mode: \"clojure\", ext: [\"edn\"]},\n    {name: \"Eiffel\", mime: \"text/x-eiffel\", mode: \"eiffel\", ext: [\"e\"]},\n    {name: \"Elm\", mime: \"text/x-elm\", mode: \"elm\", ext: [\"elm\"]},\n    {name: \"Embedded JavaScript\", mime: \"application/x-ejs\", mode: \"htmlembedded\", ext: [\"ejs\"]},\n    {name: \"Embedded Ruby\", mime: \"application/x-erb\", mode: \"htmlembedded\", ext: [\"erb\"]},\n    {name: \"Erlang\", mime: \"text/x-erlang\", mode: \"erlang\", ext: [\"erl\"]},\n    {name: \"Esper\", mime: \"text/x-esper\", mode: \"sql\"},\n    {name: \"Factor\", mime: \"text/x-factor\", mode: \"factor\", ext: [\"factor\"]},\n    {name: \"FCL\", mime: \"text/x-fcl\", mode: \"fcl\"},\n    {name: \"Forth\", mime: \"text/x-forth\", mode: \"forth\", ext: [\"forth\", \"fth\", \"4th\"]},\n    {name: \"Fortran\", mime: \"text/x-fortran\", mode: \"fortran\", ext: [\"f\", \"for\", \"f77\", \"f90\", \"f95\"]},\n    {name: \"F#\", mime: \"text/x-fsharp\", mode: \"mllike\", ext: [\"fs\"], alias: [\"fsharp\"]},\n    {name: \"Gas\", mime: \"text/x-gas\", mode: \"gas\", ext: [\"s\"]},\n    {name: \"Gherkin\", mime: \"text/x-feature\", mode: \"gherkin\", ext: [\"feature\"]},\n    {name: \"GitHub Flavored Markdown\", mime: \"text/x-gfm\", mode: \"gfm\", file: /^(readme|contributing|history)\\.md$/i},\n    {name: \"Go\", mime: \"text/x-go\", mode: \"go\", ext: [\"go\"]},\n    {name: \"Groovy\", mime: \"text/x-groovy\", mode: \"groovy\", ext: [\"groovy\", \"gradle\"], file: /^Jenkinsfile$/},\n    {name: \"HAML\", mime: \"text/x-haml\", mode: \"haml\", ext: [\"haml\"]},\n    {name: \"Haskell\", mime: \"text/x-haskell\", mode: \"haskell\", ext: [\"hs\"]},\n    {name: \"Haskell (Literate)\", mime: \"text/x-literate-haskell\", mode: \"haskell-literate\", ext: [\"lhs\"]},\n    {name: \"Haxe\", mime: \"text/x-haxe\", mode: \"haxe\", ext: [\"hx\"]},\n    {name: \"HXML\", mime: \"text/x-hxml\", mode: \"haxe\", ext: [\"hxml\"]},\n    {name: \"ASP.NET\", mime: \"application/x-aspx\", mode: \"htmlembedded\", ext: [\"aspx\"], alias: [\"asp\", \"aspx\"]},\n    {name: \"HTML\", mime: \"text/html\", mode: \"htmlmixed\", ext: [\"html\", \"htm\", \"handlebars\", \"hbs\"], alias: [\"xhtml\"]},\n    {name: \"HTTP\", mime: \"message/http\", mode: \"http\"},\n    {name: \"IDL\", mime: \"text/x-idl\", mode: \"idl\", ext: [\"pro\"]},\n    {name: \"Pug\", mime: \"text/x-pug\", mode: \"pug\", ext: [\"jade\", \"pug\"], alias: [\"jade\"]},\n    {name: \"Java\", mime: \"text/x-java\", mode: \"clike\", ext: [\"java\"]},\n    {name: \"Java Server Pages\", mime: \"application/x-jsp\", mode: \"htmlembedded\", ext: [\"jsp\"], alias: [\"jsp\"]},\n    {name: \"JavaScript\", mimes: [\"text/javascript\", \"text/ecmascript\", \"application/javascript\", \"application/x-javascript\", \"application/ecmascript\"],\n     mode: \"javascript\", ext: [\"js\"], alias: [\"ecmascript\", \"js\", \"node\"]},\n    {name: \"JSON\", mimes: [\"application/json\", \"application/x-json\"], mode: \"javascript\", ext: [\"json\", \"map\"], alias: [\"json5\"]},\n    {name: \"JSON-LD\", mime: \"application/ld+json\", mode: \"javascript\", ext: [\"jsonld\"], alias: [\"jsonld\"]},\n    {name: \"JSX\", mime: \"text/jsx\", mode: \"jsx\", ext: [\"jsx\"]},\n    {name: \"Jinja2\", mime: \"text/jinja2\", mode: \"jinja2\", ext: [\"j2\", \"jinja\", \"jinja2\"]},\n    {name: \"Julia\", mime: \"text/x-julia\", mode: \"julia\", ext: [\"jl\"], alias: [\"jl\"]},\n    {name: \"Kotlin\", mime: \"text/x-kotlin\", mode: \"clike\", ext: [\"kt\"]},\n    {name: \"LESS\", mime: \"text/x-less\", mode: \"css\", ext: [\"less\"]},\n    {name: \"LiveScript\", mime: \"text/x-livescript\", mode: \"livescript\", ext: [\"ls\"], alias: [\"ls\"]},\n    {name: \"Lua\", mime: \"text/x-lua\", mode: \"lua\", ext: [\"lua\"]},\n    {name: \"Markdown\", mime: \"text/x-markdown\", mode: \"markdown\", ext: [\"markdown\", \"md\", \"mkd\"]},\n    {name: \"mIRC\", mime: \"text/mirc\", mode: \"mirc\"},\n    {name: \"MariaDB SQL\", mime: \"text/x-mariadb\", mode: \"sql\"},\n    {name: \"Mathematica\", mime: \"text/x-mathematica\", mode: \"mathematica\", ext: [\"m\", \"nb\", \"wl\", \"wls\"]},\n    {name: \"Modelica\", mime: \"text/x-modelica\", mode: \"modelica\", ext: [\"mo\"]},\n    {name: \"MUMPS\", mime: \"text/x-mumps\", mode: \"mumps\", ext: [\"mps\"]},\n    {name: \"MS SQL\", mime: \"text/x-mssql\", mode: \"sql\"},\n    {name: \"mbox\", mime: \"application/mbox\", mode: \"mbox\", ext: [\"mbox\"]},\n    {name: \"MySQL\", mime: \"text/x-mysql\", mode: \"sql\"},\n    {name: \"Nginx\", mime: \"text/x-nginx-conf\", mode: \"nginx\", file: /nginx.*\\.conf$/i},\n    {name: \"NSIS\", mime: \"text/x-nsis\", mode: \"nsis\", ext: [\"nsh\", \"nsi\"]},\n    {name: \"NTriples\", mimes: [\"application/n-triples\", \"application/n-quads\", \"text/n-triples\"],\n     mode: \"ntriples\", ext: [\"nt\", \"nq\"]},\n    {name: \"Objective-C\", mime: \"text/x-objectivec\", mode: \"clike\", ext: [\"m\"], alias: [\"objective-c\", \"objc\"]},\n    {name: \"Objective-C++\", mime: \"text/x-objectivec++\", mode: \"clike\", ext: [\"mm\"], alias: [\"objective-c++\", \"objc++\"]},\n    {name: \"OCaml\", mime: \"text/x-ocaml\", mode: \"mllike\", ext: [\"ml\", \"mli\", \"mll\", \"mly\"]},\n    {name: \"Octave\", mime: \"text/x-octave\", mode: \"octave\", ext: [\"m\"]},\n    {name: \"Oz\", mime: \"text/x-oz\", mode: \"oz\", ext: [\"oz\"]},\n    {name: \"Pascal\", mime: \"text/x-pascal\", mode: \"pascal\", ext: [\"p\", \"pas\"]},\n    {name: \"PEG.js\", mime: \"null\", mode: \"pegjs\", ext: [\"jsonld\"]},\n    {name: \"Perl\", mime: \"text/x-perl\", mode: \"perl\", ext: [\"pl\", \"pm\"]},\n    {name: \"PHP\", mimes: [\"text/x-php\", \"application/x-httpd-php\", \"application/x-httpd-php-open\"], mode: \"php\", ext: [\"php\", \"php3\", \"php4\", \"php5\", \"php7\", \"phtml\"]},\n    {name: \"Pig\", mime: \"text/x-pig\", mode: \"pig\", ext: [\"pig\"]},\n    {name: \"Plain Text\", mime: \"text/plain\", mode: \"null\", ext: [\"txt\", \"text\", \"conf\", \"def\", \"list\", \"log\"]},\n    {name: \"PLSQL\", mime: \"text/x-plsql\", mode: \"sql\", ext: [\"pls\"]},\n    {name: \"PostgreSQL\", mime: \"text/x-pgsql\", mode: \"sql\"},\n    {name: \"PowerShell\", mime: \"application/x-powershell\", mode: \"powershell\", ext: [\"ps1\", \"psd1\", \"psm1\"]},\n    {name: \"Properties files\", mime: \"text/x-properties\", mode: \"properties\", ext: [\"properties\", \"ini\", \"in\"], alias: [\"ini\", \"properties\"]},\n    {name: \"ProtoBuf\", mime: \"text/x-protobuf\", mode: \"protobuf\", ext: [\"proto\"]},\n    {name: \"Python\", mime: \"text/x-python\", mode: \"python\", ext: [\"BUILD\", \"bzl\", \"py\", \"pyw\"], file: /^(BUCK|BUILD)$/},\n    {name: \"Puppet\", mime: \"text/x-puppet\", mode: \"puppet\", ext: [\"pp\"]},\n    {name: \"Q\", mime: \"text/x-q\", mode: \"q\", ext: [\"q\"]},\n    {name: \"R\", mime: \"text/x-rsrc\", mode: \"r\", ext: [\"r\", \"R\"], alias: [\"rscript\"]},\n    {name: \"reStructuredText\", mime: \"text/x-rst\", mode: \"rst\", ext: [\"rst\"], alias: [\"rst\"]},\n    {name: \"RPM Changes\", mime: \"text/x-rpm-changes\", mode: \"rpm\"},\n    {name: \"RPM Spec\", mime: \"text/x-rpm-spec\", mode: \"rpm\", ext: [\"spec\"]},\n    {name: \"Ruby\", mime: \"text/x-ruby\", mode: \"ruby\", ext: [\"rb\"], alias: [\"jruby\", \"macruby\", \"rake\", \"rb\", \"rbx\"]},\n    {name: \"Rust\", mime: \"text/x-rustsrc\", mode: \"rust\", ext: [\"rs\"]},\n    {name: \"SAS\", mime: \"text/x-sas\", mode: \"sas\", ext: [\"sas\"]},\n    {name: \"Sass\", mime: \"text/x-sass\", mode: \"sass\", ext: [\"sass\"]},\n    {name: \"Scala\", mime: \"text/x-scala\", mode: \"clike\", ext: [\"scala\"]},\n    {name: \"Scheme\", mime: \"text/x-scheme\", mode: \"scheme\", ext: [\"scm\", \"ss\"]},\n    {name: \"SCSS\", mime: \"text/x-scss\", mode: \"css\", ext: [\"scss\"]},\n    {name: \"Shell\", mimes: [\"text/x-sh\", \"application/x-sh\"], mode: \"shell\", ext: [\"sh\", \"ksh\", \"bash\"], alias: [\"bash\", \"sh\", \"zsh\"], file: /^PKGBUILD$/},\n    {name: \"Sieve\", mime: \"application/sieve\", mode: \"sieve\", ext: [\"siv\", \"sieve\"]},\n    {name: \"Slim\", mimes: [\"text/x-slim\", \"application/x-slim\"], mode: \"slim\", ext: [\"slim\"]},\n    {name: \"Smalltalk\", mime: \"text/x-stsrc\", mode: \"smalltalk\", ext: [\"st\"]},\n    {name: \"Smarty\", mime: \"text/x-smarty\", mode: \"smarty\", ext: [\"tpl\"]},\n    {name: \"Solr\", mime: \"text/x-solr\", mode: \"solr\"},\n    {name: \"SML\", mime: \"text/x-sml\", mode: \"mllike\", ext: [\"sml\", \"sig\", \"fun\", \"smackspec\"]},\n    {name: \"Soy\", mime: \"text/x-soy\", mode: \"soy\", ext: [\"soy\"], alias: [\"closure template\"]},\n    {name: \"SPARQL\", mime: \"application/sparql-query\", mode: \"sparql\", ext: [\"rq\", \"sparql\"], alias: [\"sparul\"]},\n    {name: \"Spreadsheet\", mime: \"text/x-spreadsheet\", mode: \"spreadsheet\", alias: [\"excel\", \"formula\"]},\n    {name: \"SQL\", mime: \"text/x-sql\", mode: \"sql\", ext: [\"sql\"]},\n    {name: \"SQLite\", mime: \"text/x-sqlite\", mode: \"sql\"},\n    {name: \"Squirrel\", mime: \"text/x-squirrel\", mode: \"clike\", ext: [\"nut\"]},\n    {name: \"Stylus\", mime: \"text/x-styl\", mode: \"stylus\", ext: [\"styl\"]},\n    {name: \"Swift\", mime: \"text/x-swift\", mode: \"swift\", ext: [\"swift\"]},\n    {name: \"sTeX\", mime: \"text/x-stex\", mode: \"stex\"},\n    {name: \"LaTeX\", mime: \"text/x-latex\", mode: \"stex\", ext: [\"text\", \"ltx\", \"tex\"], alias: [\"tex\"]},\n    {name: \"SystemVerilog\", mime: \"text/x-systemverilog\", mode: \"verilog\", ext: [\"v\", \"sv\", \"svh\"]},\n    {name: \"Tcl\", mime: \"text/x-tcl\", mode: \"tcl\", ext: [\"tcl\"]},\n    {name: \"Textile\", mime: \"text/x-textile\", mode: \"textile\", ext: [\"textile\"]},\n    {name: \"TiddlyWiki\", mime: \"text/x-tiddlywiki\", mode: \"tiddlywiki\"},\n    {name: \"Tiki wiki\", mime: \"text/tiki\", mode: \"tiki\"},\n    {name: \"TOML\", mime: \"text/x-toml\", mode: \"toml\", ext: [\"toml\"]},\n    {name: \"Tornado\", mime: \"text/x-tornado\", mode: \"tornado\"},\n    {name: \"troff\", mime: \"text/troff\", mode: \"troff\", ext: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"]},\n    {name: \"TTCN\", mime: \"text/x-ttcn\", mode: \"ttcn\", ext: [\"ttcn\", \"ttcn3\", \"ttcnpp\"]},\n    {name: \"TTCN_CFG\", mime: \"text/x-ttcn-cfg\", mode: \"ttcn-cfg\", ext: [\"cfg\"]},\n    {name: \"Turtle\", mime: \"text/turtle\", mode: \"turtle\", ext: [\"ttl\"]},\n    {name: \"TypeScript\", mime: \"application/typescript\", mode: \"javascript\", ext: [\"ts\"], alias: [\"ts\"]},\n    {name: \"TypeScript-JSX\", mime: \"text/typescript-jsx\", mode: \"jsx\", ext: [\"tsx\"], alias: [\"tsx\"]},\n    {name: \"Twig\", mime: \"text/x-twig\", mode: \"twig\"},\n    {name: \"Web IDL\", mime: \"text/x-webidl\", mode: \"webidl\", ext: [\"webidl\"]},\n    {name: \"VB.NET\", mime: \"text/x-vb\", mode: \"vb\", ext: [\"vb\"]},\n    {name: \"VBScript\", mime: \"text/vbscript\", mode: \"vbscript\", ext: [\"vbs\"]},\n    {name: \"Velocity\", mime: \"text/velocity\", mode: \"velocity\", ext: [\"vtl\"]},\n    {name: \"Verilog\", mime: \"text/x-verilog\", mode: \"verilog\", ext: [\"v\"]},\n    {name: \"VHDL\", mime: \"text/x-vhdl\", mode: \"vhdl\", ext: [\"vhd\", \"vhdl\"]},\n    {name: \"Vue.js Component\", mimes: [\"script/x-vue\", \"text/x-vue\"], mode: \"vue\", ext: [\"vue\"]},\n    {name: \"XML\", mimes: [\"application/xml\", \"text/xml\"], mode: \"xml\", ext: [\"xml\", \"xsl\", \"xsd\", \"svg\"], alias: [\"rss\", \"wsdl\", \"xsd\"]},\n    {name: \"XQuery\", mime: \"application/xquery\", mode: \"xquery\", ext: [\"xy\", \"xquery\"]},\n    {name: \"Yacas\", mime: \"text/x-yacas\", mode: \"yacas\", ext: [\"ys\"]},\n    {name: \"YAML\", mimes: [\"text/x-yaml\", \"text/yaml\"], mode: \"yaml\", ext: [\"yaml\", \"yml\"], alias: [\"yml\"]},\n    {name: \"Z80\", mime: \"text/x-z80\", mode: \"z80\", ext: [\"z80\"]},\n    {name: \"mscgen\", mime: \"text/x-mscgen\", mode: \"mscgen\", ext: [\"mscgen\", \"mscin\", \"msc\"]},\n    {name: \"xu\", mime: \"text/x-xu\", mode: \"mscgen\", ext: [\"xu\"]},\n    {name: \"msgenny\", mime: \"text/x-msgenny\", mode: \"mscgen\", ext: [\"msgenny\"]},\n    {name: \"WebAssembly\", mime: \"text/webassembly\", mode: \"wast\", ext: [\"wat\", \"wast\"]},\n  ];\n  // Ensure all modes have a mime property for backwards compatibility\n  for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n    var info = CodeMirror.modeInfo[i];\n    if (info.mimes) info.mime = info.mimes[0];\n  }\n\n  CodeMirror.findModeByMIME = function(mime) {\n    mime = mime.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.mime == mime) return info;\n      if (info.mimes) for (var j = 0; j < info.mimes.length; j++)\n        if (info.mimes[j] == mime) return info;\n    }\n    if (/\\+xml$/.test(mime)) return CodeMirror.findModeByMIME(\"application/xml\")\n    if (/\\+json$/.test(mime)) return CodeMirror.findModeByMIME(\"application/json\")\n  };\n\n  CodeMirror.findModeByExtension = function(ext) {\n    ext = ext.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.ext) for (var j = 0; j < info.ext.length; j++)\n        if (info.ext[j] == ext) return info;\n    }\n  };\n\n  CodeMirror.findModeByFileName = function(filename) {\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.file && info.file.test(filename)) return info;\n    }\n    var dot = filename.lastIndexOf(\".\");\n    var ext = dot > -1 && filename.substring(dot + 1, filename.length);\n    if (ext) return CodeMirror.findModeByExtension(ext);\n  };\n\n  CodeMirror.findModeByName = function(name) {\n    name = name.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.name.toLowerCase() == name) return info;\n      if (info.alias) for (var j = 0; j < info.alias.length; j++)\n        if (info.alias[j].toLowerCase() == name) return info;\n    }\n  };\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/mirc/mirc.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n//mIRC mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMIME(\"text/mirc\", \"mirc\");\nCodeMirror.defineMode(\"mirc\", function() {\n  function parseWords(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  var specials = parseWords(\"$! $$ $& $? $+ $abook $abs $active $activecid \" +\n                            \"$activewid $address $addtok $agent $agentname $agentstat $agentver \" +\n                            \"$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime \" +\n                            \"$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind \" +\n                            \"$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes \" +\n                            \"$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color \" +\n                            \"$com $comcall $comchan $comerr $compact $compress $comval $cos $count \" +\n                            \"$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight \" +\n                            \"$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress \" +\n                            \"$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll \" +\n                            \"$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error \" +\n                            \"$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir \" +\n                            \"$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve \" +\n                            \"$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt \" +\n                            \"$group $halted $hash $height $hfind $hget $highlight $hnick $hotline \" +\n                            \"$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil \" +\n                            \"$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect \" +\n                            \"$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile \" +\n                            \"$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive \" +\n                            \"$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock \" +\n                            \"$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer \" +\n                            \"$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext \" +\n                            \"$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode \" +\n                            \"$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile \" +\n                            \"$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly \" +\n                            \"$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree \" +\n                            \"$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo \" +\n                            \"$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex \" +\n                            \"$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline \" +\n                            \"$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin \" +\n                            \"$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname \" +\n                            \"$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped \" +\n                            \"$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp \" +\n                            \"$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel \" +\n                            \"$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver \" +\n                            \"$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor\");\n  var keywords = parseWords(\"abook ajinvite alias aline ame amsg anick aop auser autojoin avoice \" +\n                            \"away background ban bcopy beep bread break breplace bset btrunc bunset bwrite \" +\n                            \"channel clear clearall cline clipboard close cnick color comclose comopen \" +\n                            \"comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver \" +\n                            \"debug dec describe dialog did didtok disable disconnect dlevel dline dll \" +\n                            \"dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace \" +\n                            \"drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable \" +\n                            \"events exit fclose filter findtext finger firewall flash flist flood flush \" +\n                            \"flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove \" +\n                            \"gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd \" +\n                            \"halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear \" +\n                            \"ialmark identd if ignore iline inc invite iuser join kick linesep links list \" +\n                            \"load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice \" +\n                            \"notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice \" +\n                            \"qme qmsg query queryn quit raw reload remini remote remove rename renwin \" +\n                            \"reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini \" +\n                            \"say scid scon server set showmirc signam sline sockaccept sockclose socklist \" +\n                            \"socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite \" +\n                            \"sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize \" +\n                            \"toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho \" +\n                            \"var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum \" +\n                            \"isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower \" +\n                            \"isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs \" +\n                            \"elseif else goto menu nicklist status title icon size option text edit \" +\n                            \"button check radio box scroll list combo link tab item\");\n  var functions = parseWords(\"if elseif else and not or eq ne in ni for foreach while switch\");\n  var isOperatorChar = /[+\\-*&%=<>!?^\\/\\|]/;\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n  function tokenBase(stream, state) {\n    var beforeParams = state.beforeParams;\n    state.beforeParams = false;\n    var ch = stream.next();\n    if (/[\\[\\]{}\\(\\),\\.]/.test(ch)) {\n      if (ch == \"(\" && beforeParams) state.inParams = true;\n      else if (ch == \")\") state.inParams = false;\n      return null;\n    }\n    else if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    else if (ch == \"\\\\\") {\n      stream.eat(\"\\\\\");\n      stream.eat(/./);\n      return \"number\";\n    }\n    else if (ch == \"/\" && stream.eat(\"*\")) {\n      return chain(stream, state, tokenComment);\n    }\n    else if (ch == \";\" && stream.match(/ *\\( *\\(/)) {\n      return chain(stream, state, tokenUnparsed);\n    }\n    else if (ch == \";\" && !state.inParams) {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    else if (ch == '\"') {\n      stream.eat(/\"/);\n      return \"keyword\";\n    }\n    else if (ch == \"$\") {\n      stream.eatWhile(/[$_a-z0-9A-Z\\.:]/);\n      if (specials && specials.propertyIsEnumerable(stream.current().toLowerCase())) {\n        return \"keyword\";\n      }\n      else {\n        state.beforeParams = true;\n        return \"builtin\";\n      }\n    }\n    else if (ch == \"%\") {\n      stream.eatWhile(/[^,\\s()]/);\n      state.beforeParams = true;\n      return \"string\";\n    }\n    else if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    else {\n      stream.eatWhile(/[\\w\\$_{}]/);\n      var word = stream.current().toLowerCase();\n      if (keywords && keywords.propertyIsEnumerable(word))\n        return \"keyword\";\n      if (functions && functions.propertyIsEnumerable(word)) {\n        state.beforeParams = true;\n        return \"keyword\";\n      }\n      return null;\n    }\n  }\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n  function tokenUnparsed(stream, state) {\n    var maybeEnd = 0, ch;\n    while (ch = stream.next()) {\n      if (ch == \";\" && maybeEnd == 2) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      if (ch == \")\")\n        maybeEnd++;\n      else if (ch != \" \")\n        maybeEnd = 0;\n    }\n    return \"meta\";\n  }\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        beforeParams: false,\n        inParams: false\n      };\n    },\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      return state.tokenize(stream, state);\n    }\n  };\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/mllike/mllike.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('mllike', function(_config, parserConfig) {\n  var words = {\n    'as': 'keyword',\n    'do': 'keyword',\n    'else': 'keyword',\n    'end': 'keyword',\n    'exception': 'keyword',\n    'fun': 'keyword',\n    'functor': 'keyword',\n    'if': 'keyword',\n    'in': 'keyword',\n    'include': 'keyword',\n    'let': 'keyword',\n    'of': 'keyword',\n    'open': 'keyword',\n    'rec': 'keyword',\n    'struct': 'keyword',\n    'then': 'keyword',\n    'type': 'keyword',\n    'val': 'keyword',\n    'while': 'keyword',\n    'with': 'keyword'\n  };\n\n  var extraWords = parserConfig.extraWords || {};\n  for (var prop in extraWords) {\n    if (extraWords.hasOwnProperty(prop)) {\n      words[prop] = parserConfig.extraWords[prop];\n    }\n  }\n  var hintWords = [];\n  for (var k in words) { hintWords.push(k); }\n  CodeMirror.registerHelper(\"hintWords\", \"mllike\", hintWords);\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n\n    if (ch === '\"') {\n      state.tokenize = tokenString;\n      return state.tokenize(stream, state);\n    }\n    if (ch === '{') {\n      if (stream.eat('|')) {\n        state.longString = true;\n        state.tokenize = tokenLongString;\n        return state.tokenize(stream, state);\n      }\n    }\n    if (ch === '(') {\n      if (stream.match(/^\\*(?!\\))/)) {\n        state.commentLevel++;\n        state.tokenize = tokenComment;\n        return state.tokenize(stream, state);\n      }\n    }\n    if (ch === '~' || ch === '?') {\n      stream.eatWhile(/\\w/);\n      return 'variable-2';\n    }\n    if (ch === '`') {\n      stream.eatWhile(/\\w/);\n      return 'quote';\n    }\n    if (ch === '/' && parserConfig.slashComments && stream.eat('/')) {\n      stream.skipToEnd();\n      return 'comment';\n    }\n    if (/\\d/.test(ch)) {\n      if (ch === '0' && stream.eat(/[bB]/)) {\n        stream.eatWhile(/[01]/);\n      } if (ch === '0' && stream.eat(/[xX]/)) {\n        stream.eatWhile(/[0-9a-fA-F]/)\n      } if (ch === '0' && stream.eat(/[oO]/)) {\n        stream.eatWhile(/[0-7]/);\n      } else {\n        stream.eatWhile(/[\\d_]/);\n        if (stream.eat('.')) {\n          stream.eatWhile(/[\\d]/);\n        }\n        if (stream.eat(/[eE]/)) {\n          stream.eatWhile(/[\\d\\-+]/);\n        }\n      }\n      return 'number';\n    }\n    if ( /[+\\-*&%=<>!?|@\\.~:]/.test(ch)) {\n      return 'operator';\n    }\n    if (/[\\w\\xa1-\\uffff]/.test(ch)) {\n      stream.eatWhile(/[\\w\\xa1-\\uffff]/);\n      var cur = stream.current();\n      return words.hasOwnProperty(cur) ? words[cur] : 'variable';\n    }\n    return null\n  }\n\n  function tokenString(stream, state) {\n    var next, end = false, escaped = false;\n    while ((next = stream.next()) != null) {\n      if (next === '\"' && !escaped) {\n        end = true;\n        break;\n      }\n      escaped = !escaped && next === '\\\\';\n    }\n    if (end && !escaped) {\n      state.tokenize = tokenBase;\n    }\n    return 'string';\n  };\n\n  function tokenComment(stream, state) {\n    var prev, next;\n    while(state.commentLevel > 0 && (next = stream.next()) != null) {\n      if (prev === '(' && next === '*') state.commentLevel++;\n      if (prev === '*' && next === ')') state.commentLevel--;\n      prev = next;\n    }\n    if (state.commentLevel <= 0) {\n      state.tokenize = tokenBase;\n    }\n    return 'comment';\n  }\n\n  function tokenLongString(stream, state) {\n    var prev, next;\n    while (state.longString && (next = stream.next()) != null) {\n      if (prev === '|' && next === '}') state.longString = false;\n      prev = next;\n    }\n    if (!state.longString) {\n      state.tokenize = tokenBase;\n    }\n    return 'string';\n  }\n\n  return {\n    startState: function() {return {tokenize: tokenBase, commentLevel: 0, longString: false};},\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      return state.tokenize(stream, state);\n    },\n\n    blockCommentStart: \"(*\",\n    blockCommentEnd: \"*)\",\n    lineComment: parserConfig.slashComments ? \"//\" : null\n  };\n});\n\nCodeMirror.defineMIME('text/x-ocaml', {\n  name: 'mllike',\n  extraWords: {\n    'and': 'keyword',\n    'assert': 'keyword',\n    'begin': 'keyword',\n    'class': 'keyword',\n    'constraint': 'keyword',\n    'done': 'keyword',\n    'downto': 'keyword',\n    'external': 'keyword',\n    'function': 'keyword',\n    'initializer': 'keyword',\n    'lazy': 'keyword',\n    'match': 'keyword',\n    'method': 'keyword',\n    'module': 'keyword',\n    'mutable': 'keyword',\n    'new': 'keyword',\n    'nonrec': 'keyword',\n    'object': 'keyword',\n    'private': 'keyword',\n    'sig': 'keyword',\n    'to': 'keyword',\n    'try': 'keyword',\n    'value': 'keyword',\n    'virtual': 'keyword',\n    'when': 'keyword',\n\n    // builtins\n    'raise': 'builtin',\n    'failwith': 'builtin',\n    'true': 'builtin',\n    'false': 'builtin',\n\n    // Pervasives builtins\n    'asr': 'builtin',\n    'land': 'builtin',\n    'lor': 'builtin',\n    'lsl': 'builtin',\n    'lsr': 'builtin',\n    'lxor': 'builtin',\n    'mod': 'builtin',\n    'or': 'builtin',\n\n    // More Pervasives\n    'raise_notrace': 'builtin',\n    'trace': 'builtin',\n    'exit': 'builtin',\n    'print_string': 'builtin',\n    'print_endline': 'builtin',\n\n     'int': 'type',\n     'float': 'type',\n     'bool': 'type',\n     'char': 'type',\n     'string': 'type',\n     'unit': 'type',\n\n     // Modules\n     'List': 'builtin'\n  }\n});\n\nCodeMirror.defineMIME('text/x-fsharp', {\n  name: 'mllike',\n  extraWords: {\n    'abstract': 'keyword',\n    'assert': 'keyword',\n    'base': 'keyword',\n    'begin': 'keyword',\n    'class': 'keyword',\n    'default': 'keyword',\n    'delegate': 'keyword',\n    'do!': 'keyword',\n    'done': 'keyword',\n    'downcast': 'keyword',\n    'downto': 'keyword',\n    'elif': 'keyword',\n    'extern': 'keyword',\n    'finally': 'keyword',\n    'for': 'keyword',\n    'function': 'keyword',\n    'global': 'keyword',\n    'inherit': 'keyword',\n    'inline': 'keyword',\n    'interface': 'keyword',\n    'internal': 'keyword',\n    'lazy': 'keyword',\n    'let!': 'keyword',\n    'match': 'keyword',\n    'member': 'keyword',\n    'module': 'keyword',\n    'mutable': 'keyword',\n    'namespace': 'keyword',\n    'new': 'keyword',\n    'null': 'keyword',\n    'override': 'keyword',\n    'private': 'keyword',\n    'public': 'keyword',\n    'return!': 'keyword',\n    'return': 'keyword',\n    'select': 'keyword',\n    'static': 'keyword',\n    'to': 'keyword',\n    'try': 'keyword',\n    'upcast': 'keyword',\n    'use!': 'keyword',\n    'use': 'keyword',\n    'void': 'keyword',\n    'when': 'keyword',\n    'yield!': 'keyword',\n    'yield': 'keyword',\n\n    // Reserved words\n    'atomic': 'keyword',\n    'break': 'keyword',\n    'checked': 'keyword',\n    'component': 'keyword',\n    'const': 'keyword',\n    'constraint': 'keyword',\n    'constructor': 'keyword',\n    'continue': 'keyword',\n    'eager': 'keyword',\n    'event': 'keyword',\n    'external': 'keyword',\n    'fixed': 'keyword',\n    'method': 'keyword',\n    'mixin': 'keyword',\n    'object': 'keyword',\n    'parallel': 'keyword',\n    'process': 'keyword',\n    'protected': 'keyword',\n    'pure': 'keyword',\n    'sealed': 'keyword',\n    'tailcall': 'keyword',\n    'trait': 'keyword',\n    'virtual': 'keyword',\n    'volatile': 'keyword',\n\n    // builtins\n    'List': 'builtin',\n    'Seq': 'builtin',\n    'Map': 'builtin',\n    'Set': 'builtin',\n    'Option': 'builtin',\n    'int': 'builtin',\n    'string': 'builtin',\n    'not': 'builtin',\n    'true': 'builtin',\n    'false': 'builtin',\n\n    'raise': 'builtin',\n    'failwith': 'builtin'\n  },\n  slashComments: true\n});\n\n\nCodeMirror.defineMIME('text/x-sml', {\n  name: 'mllike',\n  extraWords: {\n    'abstype': 'keyword',\n    'and': 'keyword',\n    'andalso': 'keyword',\n    'case': 'keyword',\n    'datatype': 'keyword',\n    'fn': 'keyword',\n    'handle': 'keyword',\n    'infix': 'keyword',\n    'infixr': 'keyword',\n    'local': 'keyword',\n    'nonfix': 'keyword',\n    'op': 'keyword',\n    'orelse': 'keyword',\n    'raise': 'keyword',\n    'withtype': 'keyword',\n    'eqtype': 'keyword',\n    'sharing': 'keyword',\n    'sig': 'keyword',\n    'signature': 'keyword',\n    'structure': 'keyword',\n    'where': 'keyword',\n    'true': 'keyword',\n    'false': 'keyword',\n\n    // types\n    'int': 'builtin',\n    'real': 'builtin',\n    'string': 'builtin',\n    'char': 'builtin',\n    'bool': 'builtin'\n  },\n  slashComments: true\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/modelica/modelica.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Modelica support for CodeMirror, copyright (c) by Lennart Ochel\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})\n\n(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"modelica\", function(config, parserConfig) {\n\n    var indentUnit = config.indentUnit;\n    var keywords = parserConfig.keywords || {};\n    var builtin = parserConfig.builtin || {};\n    var atoms = parserConfig.atoms || {};\n\n    var isSingleOperatorChar = /[;=\\(:\\),{}.*<>+\\-\\/^\\[\\]]/;\n    var isDoubleOperatorChar = /(:=|<=|>=|==|<>|\\.\\+|\\.\\-|\\.\\*|\\.\\/|\\.\\^)/;\n    var isDigit = /[0-9]/;\n    var isNonDigit = /[_a-zA-Z]/;\n\n    function tokenLineComment(stream, state) {\n      stream.skipToEnd();\n      state.tokenize = null;\n      return \"comment\";\n    }\n\n    function tokenBlockComment(stream, state) {\n      var maybeEnd = false, ch;\n      while (ch = stream.next()) {\n        if (maybeEnd && ch == \"/\") {\n          state.tokenize = null;\n          break;\n        }\n        maybeEnd = (ch == \"*\");\n      }\n      return \"comment\";\n    }\n\n    function tokenString(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == '\"' && !escaped) {\n          state.tokenize = null;\n          state.sol = false;\n          break;\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n\n      return \"string\";\n    }\n\n    function tokenIdent(stream, state) {\n      stream.eatWhile(isDigit);\n      while (stream.eat(isDigit) || stream.eat(isNonDigit)) { }\n\n\n      var cur = stream.current();\n\n      if(state.sol && (cur == \"package\" || cur == \"model\" || cur == \"when\" || cur == \"connector\")) state.level++;\n      else if(state.sol && cur == \"end\" && state.level > 0) state.level--;\n\n      state.tokenize = null;\n      state.sol = false;\n\n      if (keywords.propertyIsEnumerable(cur)) return \"keyword\";\n      else if (builtin.propertyIsEnumerable(cur)) return \"builtin\";\n      else if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n      else return \"variable\";\n    }\n\n    function tokenQIdent(stream, state) {\n      while (stream.eat(/[^']/)) { }\n\n      state.tokenize = null;\n      state.sol = false;\n\n      if(stream.eat(\"'\"))\n        return \"variable\";\n      else\n        return \"error\";\n    }\n\n    function tokenUnsignedNumber(stream, state) {\n      stream.eatWhile(isDigit);\n      if (stream.eat('.')) {\n        stream.eatWhile(isDigit);\n      }\n      if (stream.eat('e') || stream.eat('E')) {\n        if (!stream.eat('-'))\n          stream.eat('+');\n        stream.eatWhile(isDigit);\n      }\n\n      state.tokenize = null;\n      state.sol = false;\n      return \"number\";\n    }\n\n    // Interface\n    return {\n      startState: function() {\n        return {\n          tokenize: null,\n          level: 0,\n          sol: true\n        };\n      },\n\n      token: function(stream, state) {\n        if(state.tokenize != null) {\n          return state.tokenize(stream, state);\n        }\n\n        if(stream.sol()) {\n          state.sol = true;\n        }\n\n        // WHITESPACE\n        if(stream.eatSpace()) {\n          state.tokenize = null;\n          return null;\n        }\n\n        var ch = stream.next();\n\n        // LINECOMMENT\n        if(ch == '/' && stream.eat('/')) {\n          state.tokenize = tokenLineComment;\n        }\n        // BLOCKCOMMENT\n        else if(ch == '/' && stream.eat('*')) {\n          state.tokenize = tokenBlockComment;\n        }\n        // TWO SYMBOL TOKENS\n        else if(isDoubleOperatorChar.test(ch+stream.peek())) {\n          stream.next();\n          state.tokenize = null;\n          return \"operator\";\n        }\n        // SINGLE SYMBOL TOKENS\n        else if(isSingleOperatorChar.test(ch)) {\n          state.tokenize = null;\n          return \"operator\";\n        }\n        // IDENT\n        else if(isNonDigit.test(ch)) {\n          state.tokenize = tokenIdent;\n        }\n        // Q-IDENT\n        else if(ch == \"'\" && stream.peek() && stream.peek() != \"'\") {\n          state.tokenize = tokenQIdent;\n        }\n        // STRING\n        else if(ch == '\"') {\n          state.tokenize = tokenString;\n        }\n        // UNSIGNED_NUMBER\n        else if(isDigit.test(ch)) {\n          state.tokenize = tokenUnsignedNumber;\n        }\n        // ERROR\n        else {\n          state.tokenize = null;\n          return \"error\";\n        }\n\n        return state.tokenize(stream, state);\n      },\n\n      indent: function(state, textAfter) {\n        if (state.tokenize != null) return CodeMirror.Pass;\n\n        var level = state.level;\n        if(/(algorithm)/.test(textAfter)) level--;\n        if(/(equation)/.test(textAfter)) level--;\n        if(/(initial algorithm)/.test(textAfter)) level--;\n        if(/(initial equation)/.test(textAfter)) level--;\n        if(/(end)/.test(textAfter)) level--;\n\n        if(level > 0)\n          return indentUnit*level;\n        else\n          return 0;\n      },\n\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      lineComment: \"//\"\n    };\n  });\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i=0; i<words.length; ++i)\n      obj[words[i]] = true;\n    return obj;\n  }\n\n  var modelicaKeywords = \"algorithm and annotation assert block break class connect connector constant constrainedby der discrete each else elseif elsewhen encapsulated end enumeration equation expandable extends external false final flow for function if import impure in initial inner input loop model not operator or outer output package parameter partial protected public pure record redeclare replaceable return stream then true type when while within\";\n  var modelicaBuiltin = \"abs acos actualStream asin atan atan2 cardinality ceil cos cosh delay div edge exp floor getInstanceName homotopy inStream integer log log10 mod pre reinit rem semiLinear sign sin sinh spatialDistribution sqrt tan tanh\";\n  var modelicaAtoms = \"Real Boolean Integer String\";\n\n  function def(mimes, mode) {\n    if (typeof mimes == \"string\")\n      mimes = [mimes];\n\n    var words = [];\n\n    function add(obj) {\n      if (obj)\n        for (var prop in obj)\n          if (obj.hasOwnProperty(prop))\n            words.push(prop);\n    }\n\n    add(mode.keywords);\n    add(mode.builtin);\n    add(mode.atoms);\n\n    if (words.length) {\n      mode.helperType = mimes[0];\n      CodeMirror.registerHelper(\"hintWords\", mimes[0], words);\n    }\n\n    for (var i=0; i<mimes.length; ++i)\n      CodeMirror.defineMIME(mimes[i], mode);\n  }\n\n  def([\"text/x-modelica\"], {\n    name: \"modelica\",\n    keywords: words(modelicaKeywords),\n    builtin: words(modelicaBuiltin),\n    atoms: words(modelicaAtoms)\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/mscgen/mscgen.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// mode(s) for the sequence chart dsl's mscgen, xù and msgenny\n// For more information on mscgen, see the site of the original author:\n// http://www.mcternan.me.uk/mscgen\n//\n// This mode for mscgen and the two derivative languages were\n// originally made for use in the mscgen_js interpreter\n// (https://sverweij.github.io/mscgen_js)\n\n(function(mod) {\n  if ( typeof exports == \"object\" && typeof module == \"object\")// CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if ( typeof define == \"function\" && define.amd)// AMD\n    define([\"../../lib/codemirror\"], mod);\n  else// Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var languages = {\n    mscgen: {\n      \"keywords\" : [\"msc\"],\n      \"options\" : [\"hscale\", \"width\", \"arcgradient\", \"wordwraparcs\"],\n      \"constants\" : [\"true\", \"false\", \"on\", \"off\"],\n      \"attributes\" : [\"label\", \"idurl\", \"id\", \"url\", \"linecolor\", \"linecolour\", \"textcolor\", \"textcolour\", \"textbgcolor\", \"textbgcolour\", \"arclinecolor\", \"arclinecolour\", \"arctextcolor\", \"arctextcolour\", \"arctextbgcolor\", \"arctextbgcolour\", \"arcskip\"],\n      \"brackets\" : [\"\\\\{\", \"\\\\}\"], // [ and  ] are brackets too, but these get handled in with lists\n      \"arcsWords\" : [\"note\", \"abox\", \"rbox\", \"box\"],\n      \"arcsOthers\" : [\"\\\\|\\\\|\\\\|\", \"\\\\.\\\\.\\\\.\", \"---\", \"--\", \"<->\", \"==\", \"<<=>>\", \"<=>\", \"\\\\.\\\\.\", \"<<>>\", \"::\", \"<:>\", \"->\", \"=>>\", \"=>\", \">>\", \":>\", \"<-\", \"<<=\", \"<=\", \"<<\", \"<:\", \"x-\", \"-x\"],\n      \"singlecomment\" : [\"//\", \"#\"],\n      \"operators\" : [\"=\"]\n    },\n    xu: {\n      \"keywords\" : [\"msc\", \"xu\"],\n      \"options\" : [\"hscale\", \"width\", \"arcgradient\", \"wordwraparcs\", \"wordwrapentities\", \"watermark\"],\n      \"constants\" : [\"true\", \"false\", \"on\", \"off\", \"auto\"],\n      \"attributes\" : [\"label\", \"idurl\", \"id\", \"url\", \"linecolor\", \"linecolour\", \"textcolor\", \"textcolour\", \"textbgcolor\", \"textbgcolour\", \"arclinecolor\", \"arclinecolour\", \"arctextcolor\", \"arctextcolour\", \"arctextbgcolor\", \"arctextbgcolour\", \"arcskip\", \"title\", \"deactivate\", \"activate\", \"activation\"],\n      \"brackets\" : [\"\\\\{\", \"\\\\}\"],  // [ and  ] are brackets too, but these get handled in with lists\n      \"arcsWords\" : [\"note\", \"abox\", \"rbox\", \"box\", \"alt\", \"else\", \"opt\", \"break\", \"par\", \"seq\", \"strict\", \"neg\", \"critical\", \"ignore\", \"consider\", \"assert\", \"loop\", \"ref\", \"exc\"],\n      \"arcsOthers\" : [\"\\\\|\\\\|\\\\|\", \"\\\\.\\\\.\\\\.\", \"---\", \"--\", \"<->\", \"==\", \"<<=>>\", \"<=>\", \"\\\\.\\\\.\", \"<<>>\", \"::\", \"<:>\", \"->\", \"=>>\", \"=>\", \">>\", \":>\", \"<-\", \"<<=\", \"<=\", \"<<\", \"<:\", \"x-\", \"-x\"],\n      \"singlecomment\" : [\"//\", \"#\"],\n      \"operators\" : [\"=\"]\n    },\n    msgenny: {\n      \"keywords\" : null,\n      \"options\" : [\"hscale\", \"width\", \"arcgradient\", \"wordwraparcs\", \"wordwrapentities\", \"watermark\"],\n      \"constants\" : [\"true\", \"false\", \"on\", \"off\", \"auto\"],\n      \"attributes\" : null,\n      \"brackets\" : [\"\\\\{\", \"\\\\}\"],\n      \"arcsWords\" : [\"note\", \"abox\", \"rbox\", \"box\", \"alt\", \"else\", \"opt\", \"break\", \"par\", \"seq\", \"strict\", \"neg\", \"critical\", \"ignore\", \"consider\", \"assert\", \"loop\", \"ref\", \"exc\"],\n      \"arcsOthers\" : [\"\\\\|\\\\|\\\\|\", \"\\\\.\\\\.\\\\.\", \"---\", \"--\", \"<->\", \"==\", \"<<=>>\", \"<=>\", \"\\\\.\\\\.\", \"<<>>\", \"::\", \"<:>\", \"->\", \"=>>\", \"=>\", \">>\", \":>\", \"<-\", \"<<=\", \"<=\", \"<<\", \"<:\", \"x-\", \"-x\"],\n      \"singlecomment\" : [\"//\", \"#\"],\n      \"operators\" : [\"=\"]\n    }\n  }\n\n  CodeMirror.defineMode(\"mscgen\", function(_, modeConfig) {\n    var language = languages[modeConfig && modeConfig.language || \"mscgen\"]\n    return {\n      startState: startStateFn,\n      copyState: copyStateFn,\n      token: produceTokenFunction(language),\n      lineComment : \"#\",\n      blockCommentStart : \"/*\",\n      blockCommentEnd : \"*/\"\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-mscgen\", \"mscgen\");\n  CodeMirror.defineMIME(\"text/x-xu\", {name: \"mscgen\", language: \"xu\"});\n  CodeMirror.defineMIME(\"text/x-msgenny\", {name: \"mscgen\", language: \"msgenny\"});\n\n  function wordRegexpBoundary(pWords) {\n    return new RegExp(\"^\\\\b(?:\" + pWords.join(\"|\") + \")\\\\b\", \"i\");\n  }\n\n  function wordRegexp(pWords) {\n    return new RegExp(\"^(?:\" + pWords.join(\"|\") + \")\", \"i\");\n  }\n\n  function startStateFn() {\n    return {\n      inComment : false,\n      inString : false,\n      inAttributeList : false,\n      inScript : false\n    };\n  }\n\n  function copyStateFn(pState) {\n    return {\n      inComment : pState.inComment,\n      inString : pState.inString,\n      inAttributeList : pState.inAttributeList,\n      inScript : pState.inScript\n    };\n  }\n\n  function produceTokenFunction(pConfig) {\n\n    return function(pStream, pState) {\n      if (pStream.match(wordRegexp(pConfig.brackets), true, true)) {\n        return \"bracket\";\n      }\n      /* comments */\n      if (!pState.inComment) {\n        if (pStream.match(/\\/\\*[^\\*\\/]*/, true, true)) {\n          pState.inComment = true;\n          return \"comment\";\n        }\n        if (pStream.match(wordRegexp(pConfig.singlecomment), true, true)) {\n          pStream.skipToEnd();\n          return \"comment\";\n        }\n      }\n      if (pState.inComment) {\n        if (pStream.match(/[^\\*\\/]*\\*\\//, true, true))\n          pState.inComment = false;\n        else\n          pStream.skipToEnd();\n        return \"comment\";\n      }\n      /* strings */\n      if (!pState.inString && pStream.match(/\\\"(\\\\\\\"|[^\\\"])*/, true, true)) {\n        pState.inString = true;\n        return \"string\";\n      }\n      if (pState.inString) {\n        if (pStream.match(/[^\\\"]*\\\"/, true, true))\n          pState.inString = false;\n        else\n          pStream.skipToEnd();\n        return \"string\";\n      }\n      /* keywords & operators */\n      if (!!pConfig.keywords && pStream.match(wordRegexpBoundary(pConfig.keywords), true, true))\n        return \"keyword\";\n\n      if (pStream.match(wordRegexpBoundary(pConfig.options), true, true))\n        return \"keyword\";\n\n      if (pStream.match(wordRegexpBoundary(pConfig.arcsWords), true, true))\n        return \"keyword\";\n\n      if (pStream.match(wordRegexp(pConfig.arcsOthers), true, true))\n        return \"keyword\";\n\n      if (!!pConfig.operators && pStream.match(wordRegexp(pConfig.operators), true, true))\n        return \"operator\";\n\n      if (!!pConfig.constants && pStream.match(wordRegexp(pConfig.constants), true, true))\n        return \"variable\";\n\n      /* attribute lists */\n      if (!pConfig.inAttributeList && !!pConfig.attributes && pStream.match('[', true, true)) {\n        pConfig.inAttributeList = true;\n        return \"bracket\";\n      }\n      if (pConfig.inAttributeList) {\n        if (pConfig.attributes !== null && pStream.match(wordRegexpBoundary(pConfig.attributes), true, true)) {\n          return \"attribute\";\n        }\n        if (pStream.match(']', true, true)) {\n          pConfig.inAttributeList = false;\n          return \"bracket\";\n        }\n      }\n\n      pStream.next();\n      return \"base\";\n    };\n  }\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/mumps/mumps.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\n  This MUMPS Language script was constructed using vbscript.js as a template.\n*/\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"mumps\", function() {\n    function wordRegexp(words) {\n      return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\", \"i\");\n    }\n\n    var singleOperators = new RegExp(\"^[\\\\+\\\\-\\\\*/&#!_?\\\\\\\\<>=\\\\'\\\\[\\\\]]\");\n    var doubleOperators = new RegExp(\"^(('=)|(<=)|(>=)|('>)|('<)|([[)|(]])|(^$))\");\n    var singleDelimiters = new RegExp(\"^[\\\\.,:]\");\n    var brackets = new RegExp(\"[()]\");\n    var identifiers = new RegExp(\"^[%A-Za-z][A-Za-z0-9]*\");\n    var commandKeywords = [\"break\",\"close\",\"do\",\"else\",\"for\",\"goto\", \"halt\", \"hang\", \"if\", \"job\",\"kill\",\"lock\",\"merge\",\"new\",\"open\", \"quit\", \"read\", \"set\", \"tcommit\", \"trollback\", \"tstart\", \"use\", \"view\", \"write\", \"xecute\", \"b\",\"c\",\"d\",\"e\",\"f\",\"g\", \"h\", \"i\", \"j\",\"k\",\"l\",\"m\",\"n\",\"o\", \"q\", \"r\", \"s\", \"tc\", \"tro\", \"ts\", \"u\", \"v\", \"w\", \"x\"];\n    // The following list includes intrinsic functions _and_ special variables\n    var intrinsicFuncsWords = [\"\\\\$ascii\", \"\\\\$char\", \"\\\\$data\", \"\\\\$ecode\", \"\\\\$estack\", \"\\\\$etrap\", \"\\\\$extract\", \"\\\\$find\", \"\\\\$fnumber\", \"\\\\$get\", \"\\\\$horolog\", \"\\\\$io\", \"\\\\$increment\", \"\\\\$job\", \"\\\\$justify\", \"\\\\$length\", \"\\\\$name\", \"\\\\$next\", \"\\\\$order\", \"\\\\$piece\", \"\\\\$qlength\", \"\\\\$qsubscript\", \"\\\\$query\", \"\\\\$quit\", \"\\\\$random\", \"\\\\$reverse\", \"\\\\$select\", \"\\\\$stack\", \"\\\\$test\", \"\\\\$text\", \"\\\\$translate\", \"\\\\$view\", \"\\\\$x\", \"\\\\$y\", \"\\\\$a\", \"\\\\$c\", \"\\\\$d\", \"\\\\$e\", \"\\\\$ec\", \"\\\\$es\", \"\\\\$et\", \"\\\\$f\", \"\\\\$fn\", \"\\\\$g\", \"\\\\$h\", \"\\\\$i\", \"\\\\$j\", \"\\\\$l\", \"\\\\$n\", \"\\\\$na\", \"\\\\$o\", \"\\\\$p\", \"\\\\$q\", \"\\\\$ql\", \"\\\\$qs\", \"\\\\$r\", \"\\\\$re\", \"\\\\$s\", \"\\\\$st\", \"\\\\$t\", \"\\\\$tr\", \"\\\\$v\", \"\\\\$z\"];\n    var intrinsicFuncs = wordRegexp(intrinsicFuncsWords);\n    var command = wordRegexp(commandKeywords);\n\n    function tokenBase(stream, state) {\n      if (stream.sol()) {\n        state.label = true;\n        state.commandMode = 0;\n      }\n\n      // The <space> character has meaning in MUMPS. Ignoring consecutive\n      // spaces would interfere with interpreting whether the next non-space\n      // character belongs to the command or argument context.\n\n      // Examine each character and update a mode variable whose interpretation is:\n      //   >0 => command    0 => argument    <0 => command post-conditional\n      var ch = stream.peek();\n\n      if (ch == \" \" || ch == \"\\t\") { // Pre-process <space>\n        state.label = false;\n        if (state.commandMode == 0)\n          state.commandMode = 1;\n        else if ((state.commandMode < 0) || (state.commandMode == 2))\n          state.commandMode = 0;\n      } else if ((ch != \".\") && (state.commandMode > 0)) {\n        if (ch == \":\")\n          state.commandMode = -1;   // SIS - Command post-conditional\n        else\n          state.commandMode = 2;\n      }\n\n      // Do not color parameter list as line tag\n      if ((ch === \"(\") || (ch === \"\\u0009\"))\n        state.label = false;\n\n      // MUMPS comment starts with \";\"\n      if (ch === \";\") {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n\n      // Number Literals // SIS/RLM - MUMPS permits canonic number followed by concatenate operator\n      if (stream.match(/^[-+]?\\d+(\\.\\d+)?([eE][-+]?\\d+)?/))\n        return \"number\";\n\n      // Handle Strings\n      if (ch == '\"') {\n        if (stream.skipTo('\"')) {\n          stream.next();\n          return \"string\";\n        } else {\n          stream.skipToEnd();\n          return \"error\";\n        }\n      }\n\n      // Handle operators and Delimiters\n      if (stream.match(doubleOperators) || stream.match(singleOperators))\n        return \"operator\";\n\n      // Prevents leading \".\" in DO block from falling through to error\n      if (stream.match(singleDelimiters))\n        return null;\n\n      if (brackets.test(ch)) {\n        stream.next();\n        return \"bracket\";\n      }\n\n      if (state.commandMode > 0 && stream.match(command))\n        return \"variable-2\";\n\n      if (stream.match(intrinsicFuncs))\n        return \"builtin\";\n\n      if (stream.match(identifiers))\n        return \"variable\";\n\n      // Detect dollar-sign when not a documented intrinsic function\n      // \"^\" may introduce a GVN or SSVN - Color same as function\n      if (ch === \"$\" || ch === \"^\") {\n        stream.next();\n        return \"builtin\";\n      }\n\n      // MUMPS Indirection\n      if (ch === \"@\") {\n        stream.next();\n        return \"string-2\";\n      }\n\n      if (/[\\w%]/.test(ch)) {\n        stream.eatWhile(/[\\w%]/);\n        return \"variable\";\n      }\n\n      // Handle non-detected items\n      stream.next();\n      return \"error\";\n    }\n\n    return {\n      startState: function() {\n        return {\n          label: false,\n          commandMode: 0\n        };\n      },\n\n      token: function(stream, state) {\n        var style = tokenBase(stream, state);\n        if (state.label) return \"tag\";\n        return style;\n      }\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-mumps\", \"mumps\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/nginx/nginx.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"nginx\", function(config) {\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  var keywords = words(\n    /* ngxDirectiveControl */ \"break return rewrite set\" +\n    /* ngxDirective */ \" accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_types aio alias allow ancient_browser ancient_browser_value auth_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types client_body_buffer_size client_body_in_file_only client_body_in_single_buffer client_body_temp_path client_body_timeout client_header_buffer_size client_header_timeout client_max_body_size connection_pool_size create_full_put_path daemon dav_access dav_methods debug_connection debug_points default_type degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect proxy_send_lowat proxy_send_timeout proxy_set_body proxy_set_header proxy_ssl_session_reuse proxy_store proxy_store_access proxy_temp_file_write_size proxy_temp_path proxy_timeout proxy_upstream_fail_timeout proxy_upstream_max_fails random_index read_ahead real_ip_header recursive_error_pages request_pool_size reset_timedout_connection resolver resolver_timeout rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk ssi_silent_errors ssi_types ssi_value_length ssl ssl_certificate ssl_certificate_key ssl_ciphers ssl_client_certificate ssl_crl ssl_dhparam ssl_engine ssl_prefer_server_ciphers ssl_protocols ssl_session_cache ssl_session_timeout ssl_verify_client ssl_verify_depth starttls stub_status sub_filter sub_filter_once sub_filter_types tcp_nodelay tcp_nopush thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark userid_name userid_p3p userid_path userid_service valid_referers variables_hash_bucket_size variables_hash_max_size worker_connections worker_cpu_affinity worker_priority worker_processes worker_rlimit_core worker_rlimit_nofile worker_rlimit_sigpending worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23\"\n    );\n\n  var keywords_block = words(\n    /* ngxDirectiveBlock */ \"http mail events server types location upstream charset_map limit_except if geo map\"\n    );\n\n  var keywords_important = words(\n    /* ngxDirectiveImportant */ \"include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files\"\n    );\n\n  var indentUnit = config.indentUnit, type;\n  function ret(style, tp) {type = tp; return style;}\n\n  function tokenBase(stream, state) {\n\n\n    stream.eatWhile(/[\\w\\$_]/);\n\n    var cur = stream.current();\n\n\n    if (keywords.propertyIsEnumerable(cur)) {\n      return \"keyword\";\n    }\n    else if (keywords_block.propertyIsEnumerable(cur)) {\n      return \"variable-2\";\n    }\n    else if (keywords_important.propertyIsEnumerable(cur)) {\n      return \"string-2\";\n    }\n    /**/\n\n    var ch = stream.next();\n    if (ch == \"@\") {stream.eatWhile(/[\\w\\\\\\-]/); return ret(\"meta\", stream.current());}\n    else if (ch == \"/\" && stream.eat(\"*\")) {\n      state.tokenize = tokenCComment;\n      return tokenCComment(stream, state);\n    }\n    else if (ch == \"<\" && stream.eat(\"!\")) {\n      state.tokenize = tokenSGMLComment;\n      return tokenSGMLComment(stream, state);\n    }\n    else if (ch == \"=\") ret(null, \"compare\");\n    else if ((ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) return ret(null, \"compare\");\n    else if (ch == \"\\\"\" || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    else if (ch == \"#\") {\n      stream.skipToEnd();\n      return ret(\"comment\", \"comment\");\n    }\n    else if (ch == \"!\") {\n      stream.match(/^\\s*\\w*/);\n      return ret(\"keyword\", \"important\");\n    }\n    else if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w.%]/);\n      return ret(\"number\", \"unit\");\n    }\n    else if (/[,.+>*\\/]/.test(ch)) {\n      return ret(null, \"select-op\");\n    }\n    else if (/[;{}:\\[\\]]/.test(ch)) {\n      return ret(null, ch);\n    }\n    else {\n      stream.eatWhile(/[\\w\\\\\\-]/);\n      return ret(\"variable\", \"variable\");\n    }\n  }\n\n  function tokenCComment(stream, state) {\n    var maybeEnd = false, ch;\n    while ((ch = stream.next()) != null) {\n      if (maybeEnd && ch == \"/\") {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenSGMLComment(stream, state) {\n    var dashes = 0, ch;\n    while ((ch = stream.next()) != null) {\n      if (dashes >= 2 && ch == \">\") {\n        state.tokenize = tokenBase;\n        break;\n      }\n      dashes = (ch == \"-\") ? dashes + 1 : 0;\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped)\n          break;\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      if (!escaped) state.tokenize = tokenBase;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  return {\n    startState: function(base) {\n      return {tokenize: tokenBase,\n              baseIndent: base || 0,\n              stack: []};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      type = null;\n      var style = state.tokenize(stream, state);\n\n      var context = state.stack[state.stack.length-1];\n      if (type == \"hash\" && context == \"rule\") style = \"atom\";\n      else if (style == \"variable\") {\n        if (context == \"rule\") style = \"number\";\n        else if (!context || context == \"@media{\") style = \"tag\";\n      }\n\n      if (context == \"rule\" && /^[\\{\\};]$/.test(type))\n        state.stack.pop();\n      if (type == \"{\") {\n        if (context == \"@media\") state.stack[state.stack.length-1] = \"@media{\";\n        else state.stack.push(\"{\");\n      }\n      else if (type == \"}\") state.stack.pop();\n      else if (type == \"@media\") state.stack.push(\"@media\");\n      else if (context == \"{\" && type != \"comment\") state.stack.push(\"rule\");\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var n = state.stack.length;\n      if (/^\\}/.test(textAfter))\n        n -= state.stack[state.stack.length-1] == \"rule\" ? 2 : 1;\n      return state.baseIndent + n * indentUnit;\n    },\n\n    electricChars: \"}\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-nginx-conf\", \"nginx\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/nsis/nsis.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Author: Jan T. Sott (http://github.com/idleberg)\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineSimpleMode(\"nsis\",{\n  start:[\n    // Numbers\n    {regex: /(?:[+-]?)(?:0x[\\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\\d+.?\\d*)/, token: \"number\"},\n\n    // Strings\n    { regex: /\"(?:[^\\\\\"]|\\\\.)*\"?/, token: \"string\" },\n    { regex: /'(?:[^\\\\']|\\\\.)*'?/, token: \"string\" },\n    { regex: /`(?:[^\\\\`]|\\\\.)*`?/, token: \"string\" },\n\n    // Compile Time Commands\n    {regex: /^\\s*(?:\\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|error|execute|finalize|getdllversion|gettlbversion|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|uninstfinalize|verbose|warning))\\b/i, token: \"keyword\"},\n\n    // Conditional Compilation\n    {regex: /^\\s*(?:\\!(if(?:n?def)?|ifmacron?def|macro))\\b/i, token: \"keyword\", indent: true},\n    {regex: /^\\s*(?:\\!(else|endif|macroend))\\b/i, token: \"keyword\", dedent: true},\n\n    // Runtime Commands\n    {regex: /^\\s*(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecShellWait|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetKnownFolderPath|GetLabelAddress|GetTempFileName|GetWinVer|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfRtlLanguage|IfShellVarContextAll|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|Int64Cmp|Int64CmpU|Int64Fmt|IntCmp|IntCmpU|IntFmt|IntOp|IntPtrCmp|IntPtrCmpU|IntPtrOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadAndSetImage|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestLongPathAware|ManifestMaxVersionTested|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|PEAddResource|PEDllCharacteristics|PERemoveResource|PESubsysVer|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegMultiStr|WriteRegNone|WriteRegStr|WriteUninstaller|XPStyle)\\b/i, token: \"keyword\"},\n    {regex: /^\\s*(?:Function|PageEx|Section(?:Group)?)\\b/i, token: \"keyword\", indent: true},\n    {regex: /^\\s*(?:(Function|PageEx|Section(?:Group)?)End)\\b/i, token: \"keyword\", dedent: true},\n\n    // Command Options\n    {regex: /\\b(?:ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HIDDEN|HKCC|HKCR(32|64)?|HKCU(32|64)?|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM(32|64)?|HKPD|HKU|IDABORT|IDCANCEL|IDD_DIR|IDD_INST|IDD_INSTFILES|IDD_LICENSE|IDD_SELCOM|IDD_UNINST|IDD_VERIFY|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|MB_YESNOCANCEL|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SW_HIDE|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWNORMAL|SYSTEM|TEMPORARY)\\b/i, token: \"atom\"},\n    {regex: /\\b(?:admin|all|auto|both|bottom|bzip2|components|current|custom|directory|false|force|hide|highest|ifdiff|ifnewer|instfiles|lastused|leave|left|license|listonly|lzma|nevershow|none|normal|notset|off|on|right|show|silent|silentlog|textonly|top|true|try|un\\.components|un\\.custom|un\\.directory|un\\.instfiles|un\\.license|uninstConfirm|user|Win10|Win7|Win8|WinVista|zlib)\\b/i, token: \"builtin\"},\n\n    // LogicLib.nsh\n    {regex: /\\$\\{(?:And(?:If(?:Not)?|Unless)|Break|Case(?:Else)?|Continue|Default|Do(?:Until|While)?|Else(?:If(?:Not)?|Unless)?|End(?:If|Select|Switch)|Exit(?:Do|For|While)|For(?:Each)?|If(?:Cmd|Not(?:Then)?|Then)?|Loop(?:Until|While)?|Or(?:If(?:Not)?|Unless)|Select|Switch|Unless|While)\\}/i, token: \"variable-2\", indent: true},\n\n    // FileFunc.nsh\n    {regex: /\\$\\{(?:BannerTrimPath|DirState|DriveSpace|Get(BaseName|Drives|ExeName|ExePath|FileAttributes|FileExt|FileName|FileVersion|Options|OptionsS|Parameters|Parent|Root|Size|Time)|Locate|RefreshShellIcons)\\}/i, token: \"variable-2\", dedent: true},\n\n    // Memento.nsh\n    {regex: /\\$\\{(?:Memento(?:Section(?:Done|End|Restore|Save)?|UnselectedSection))\\}/i, token: \"variable-2\", dedent: true},\n\n    // TextFunc.nsh\n    {regex: /\\$\\{(?:Config(?:Read|ReadS|Write|WriteS)|File(?:Join|ReadFromEnd|Recode)|Line(?:Find|Read|Sum)|Text(?:Compare|CompareS)|TrimNewLines)\\}/i, token: \"variable-2\", dedent: true},\n\n    // WinVer.nsh\n    {regex: /\\$\\{(?:(?:At(?:Least|Most)|Is)(?:ServicePack|Win(?:7|8|10|95|98|200(?:0|3|8(?:R2)?)|ME|NT4|Vista|XP))|Is(?:NT|Server))\\}/i, token: \"variable\", dedent: true},\n\n    // WordFunc.nsh\n    {regex: /\\$\\{(?:StrFilterS?|Version(?:Compare|Convert)|Word(?:AddS?|Find(?:(?:2|3)X)?S?|InsertS?|ReplaceS?))\\}/i, token: \"variable-2\", dedent: true},\n\n    // x64.nsh\n    {regex: /\\$\\{(?:RunningX64)\\}/i, token: \"variable\", dedent: true},\n    {regex: /\\$\\{(?:Disable|Enable)X64FSRedirection\\}/i, token: \"variable-2\", dedent: true},\n\n    // Line Comment\n    {regex: /(#|;).*/, token: \"comment\"},\n\n    // Block Comment\n    {regex: /\\/\\*/, token: \"comment\", next: \"comment\"},\n\n    // Operator\n    {regex: /[-+\\/*=<>!]+/, token: \"operator\"},\n\n    // Variable\n    {regex: /\\$\\w[\\w\\.]*/, token: \"variable\"},\n\n    // Constant\n    {regex: /\\${[\\!\\w\\.:-]+}/, token: \"variable-2\"},\n\n    // Language String\n    {regex: /\\$\\([\\!\\w\\.:-]+\\)/, token: \"variable-3\"}\n  ],\n  comment: [\n    {regex: /.*?\\*\\//, token: \"comment\", next: \"start\"},\n    {regex: /.*/, token: \"comment\"}\n  ],\n  meta: {\n    electricInput: /^\\s*((Function|PageEx|Section|Section(Group)?)End|(\\!(endif|macroend))|\\$\\{(End(If|Unless|While)|Loop(Until)|Next)\\})$/i,\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: [\"#\", \";\"]\n  }\n});\n\nCodeMirror.defineMIME(\"text/x-nsis\", \"nsis\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/ntriples/ntriples.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**********************************************************\n* This script provides syntax highlighting support for\n* the N-Triples format.\n* N-Triples format specification:\n*     https://www.w3.org/TR/n-triples/\n***********************************************************/\n\n/*\n    The following expression defines the defined ASF grammar transitions.\n\n    pre_subject ->\n        {\n        ( writing_subject_uri | writing_bnode_uri )\n            -> pre_predicate\n                -> writing_predicate_uri\n                    -> pre_object\n                        -> writing_object_uri | writing_object_bnode |\n                          (\n                            writing_object_literal\n                                -> writing_literal_lang | writing_literal_type\n                          )\n                            -> post_object\n                                -> BEGIN\n         } otherwise {\n             -> ERROR\n         }\n*/\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"ntriples\", function() {\n\n  var Location = {\n    PRE_SUBJECT         : 0,\n    WRITING_SUB_URI     : 1,\n    WRITING_BNODE_URI   : 2,\n    PRE_PRED            : 3,\n    WRITING_PRED_URI    : 4,\n    PRE_OBJ             : 5,\n    WRITING_OBJ_URI     : 6,\n    WRITING_OBJ_BNODE   : 7,\n    WRITING_OBJ_LITERAL : 8,\n    WRITING_LIT_LANG    : 9,\n    WRITING_LIT_TYPE    : 10,\n    POST_OBJ            : 11,\n    ERROR               : 12\n  };\n  function transitState(currState, c) {\n    var currLocation = currState.location;\n    var ret;\n\n    // Opening.\n    if     (currLocation == Location.PRE_SUBJECT && c == '<') ret = Location.WRITING_SUB_URI;\n    else if(currLocation == Location.PRE_SUBJECT && c == '_') ret = Location.WRITING_BNODE_URI;\n    else if(currLocation == Location.PRE_PRED    && c == '<') ret = Location.WRITING_PRED_URI;\n    else if(currLocation == Location.PRE_OBJ     && c == '<') ret = Location.WRITING_OBJ_URI;\n    else if(currLocation == Location.PRE_OBJ     && c == '_') ret = Location.WRITING_OBJ_BNODE;\n    else if(currLocation == Location.PRE_OBJ     && c == '\"') ret = Location.WRITING_OBJ_LITERAL;\n\n    // Closing.\n    else if(currLocation == Location.WRITING_SUB_URI     && c == '>') ret = Location.PRE_PRED;\n    else if(currLocation == Location.WRITING_BNODE_URI   && c == ' ') ret = Location.PRE_PRED;\n    else if(currLocation == Location.WRITING_PRED_URI    && c == '>') ret = Location.PRE_OBJ;\n    else if(currLocation == Location.WRITING_OBJ_URI     && c == '>') ret = Location.POST_OBJ;\n    else if(currLocation == Location.WRITING_OBJ_BNODE   && c == ' ') ret = Location.POST_OBJ;\n    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '\"') ret = Location.POST_OBJ;\n    else if(currLocation == Location.WRITING_LIT_LANG && c == ' ') ret = Location.POST_OBJ;\n    else if(currLocation == Location.WRITING_LIT_TYPE && c == '>') ret = Location.POST_OBJ;\n\n    // Closing typed and language literal.\n    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '@') ret = Location.WRITING_LIT_LANG;\n    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '^') ret = Location.WRITING_LIT_TYPE;\n\n    // Spaces.\n    else if( c == ' ' &&\n             (\n               currLocation == Location.PRE_SUBJECT ||\n               currLocation == Location.PRE_PRED    ||\n               currLocation == Location.PRE_OBJ     ||\n               currLocation == Location.POST_OBJ\n             )\n           ) ret = currLocation;\n\n    // Reset.\n    else if(currLocation == Location.POST_OBJ && c == '.') ret = Location.PRE_SUBJECT;\n\n    // Error\n    else ret = Location.ERROR;\n\n    currState.location=ret;\n  }\n\n  return {\n    startState: function() {\n       return {\n           location : Location.PRE_SUBJECT,\n           uris     : [],\n           anchors  : [],\n           bnodes   : [],\n           langs    : [],\n           types    : []\n       };\n    },\n    token: function(stream, state) {\n      var ch = stream.next();\n      if(ch == '<') {\n         transitState(state, ch);\n         var parsedURI = '';\n         stream.eatWhile( function(c) { if( c != '#' && c != '>' ) { parsedURI += c; return true; } return false;} );\n         state.uris.push(parsedURI);\n         if( stream.match('#', false) ) return 'variable';\n         stream.next();\n         transitState(state, '>');\n         return 'variable';\n      }\n      if(ch == '#') {\n        var parsedAnchor = '';\n        stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;});\n        state.anchors.push(parsedAnchor);\n        return 'variable-2';\n      }\n      if(ch == '>') {\n          transitState(state, '>');\n          return 'variable';\n      }\n      if(ch == '_') {\n          transitState(state, ch);\n          var parsedBNode = '';\n          stream.eatWhile(function(c) { if( c != ' ' ) { parsedBNode += c; return true; } return false;});\n          state.bnodes.push(parsedBNode);\n          stream.next();\n          transitState(state, ' ');\n          return 'builtin';\n      }\n      if(ch == '\"') {\n          transitState(state, ch);\n          stream.eatWhile( function(c) { return c != '\"'; } );\n          stream.next();\n          if( stream.peek() != '@' && stream.peek() != '^' ) {\n              transitState(state, '\"');\n          }\n          return 'string';\n      }\n      if( ch == '@' ) {\n          transitState(state, '@');\n          var parsedLang = '';\n          stream.eatWhile(function(c) { if( c != ' ' ) { parsedLang += c; return true; } return false;});\n          state.langs.push(parsedLang);\n          stream.next();\n          transitState(state, ' ');\n          return 'string-2';\n      }\n      if( ch == '^' ) {\n          stream.next();\n          transitState(state, '^');\n          var parsedType = '';\n          stream.eatWhile(function(c) { if( c != '>' ) { parsedType += c; return true; } return false;} );\n          state.types.push(parsedType);\n          stream.next();\n          transitState(state, '>');\n          return 'variable';\n      }\n      if( ch == ' ' ) {\n          transitState(state, ch);\n      }\n      if( ch == '.' ) {\n          transitState(state, ch);\n      }\n    }\n  };\n});\n\n// define the registered Media Type for n-triples:\n// https://www.w3.org/TR/n-triples/#n-triples-mediatype\nCodeMirror.defineMIME(\"application/n-triples\", \"ntriples\");\n\n// N-Quads is based on the N-Triples format (so same highlighting works)\n// https://www.w3.org/TR/n-quads/\nCodeMirror.defineMIME(\"application/n-quads\", \"ntriples\");\n\n// previously used, though technically incorrect media type for n-triples\nCodeMirror.defineMIME(\"text/n-triples\", \"ntriples\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/octave/octave.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"octave\", function() {\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  var singleOperators = new RegExp(\"^[\\\\+\\\\-\\\\*/&|\\\\^~<>!@'\\\\\\\\]\");\n  var singleDelimiters = new RegExp('^[\\\\(\\\\[\\\\{\\\\},:=;\\\\.]');\n  var doubleOperators = new RegExp(\"^((==)|(~=)|(<=)|(>=)|(<<)|(>>)|(\\\\.[\\\\+\\\\-\\\\*/\\\\^\\\\\\\\]))\");\n  var doubleDelimiters = new RegExp(\"^((!=)|(\\\\+=)|(\\\\-=)|(\\\\*=)|(/=)|(&=)|(\\\\|=)|(\\\\^=))\");\n  var tripleDelimiters = new RegExp(\"^((>>=)|(<<=))\");\n  var expressionEnd = new RegExp(\"^[\\\\]\\\\)]\");\n  var identifiers = new RegExp(\"^[_A-Za-z\\xa1-\\uffff][_A-Za-z0-9\\xa1-\\uffff]*\");\n\n  var builtins = wordRegexp([\n    'error', 'eval', 'function', 'abs', 'acos', 'atan', 'asin', 'cos',\n    'cosh', 'exp', 'log', 'prod', 'sum', 'log10', 'max', 'min', 'sign', 'sin', 'sinh',\n    'sqrt', 'tan', 'reshape', 'break', 'zeros', 'default', 'margin', 'round', 'ones',\n    'rand', 'syn', 'ceil', 'floor', 'size', 'clear', 'zeros', 'eye', 'mean', 'std', 'cov',\n    'det', 'eig', 'inv', 'norm', 'rank', 'trace', 'expm', 'logm', 'sqrtm', 'linspace', 'plot',\n    'title', 'xlabel', 'ylabel', 'legend', 'text', 'grid', 'meshgrid', 'mesh', 'num2str',\n    'fft', 'ifft', 'arrayfun', 'cellfun', 'input', 'fliplr', 'flipud', 'ismember'\n  ]);\n\n  var keywords = wordRegexp([\n    'return', 'case', 'switch', 'else', 'elseif', 'end', 'endif', 'endfunction',\n    'if', 'otherwise', 'do', 'for', 'while', 'try', 'catch', 'classdef', 'properties', 'events',\n    'methods', 'global', 'persistent', 'endfor', 'endwhile', 'printf', 'sprintf', 'disp', 'until',\n    'continue', 'pkg'\n  ]);\n\n\n  // tokenizers\n  function tokenTranspose(stream, state) {\n    if (!stream.sol() && stream.peek() === '\\'') {\n      stream.next();\n      state.tokenize = tokenBase;\n      return 'operator';\n    }\n    state.tokenize = tokenBase;\n    return tokenBase(stream, state);\n  }\n\n\n  function tokenComment(stream, state) {\n    if (stream.match(/^.*%}/)) {\n      state.tokenize = tokenBase;\n      return 'comment';\n    };\n    stream.skipToEnd();\n    return 'comment';\n  }\n\n  function tokenBase(stream, state) {\n    // whitespaces\n    if (stream.eatSpace()) return null;\n\n    // Handle one line Comments\n    if (stream.match('%{')){\n      state.tokenize = tokenComment;\n      stream.skipToEnd();\n      return 'comment';\n    }\n\n    if (stream.match(/^[%#]/)){\n      stream.skipToEnd();\n      return 'comment';\n    }\n\n    // Handle Number Literals\n    if (stream.match(/^[0-9\\.+-]/, false)) {\n      if (stream.match(/^[+-]?0x[0-9a-fA-F]+[ij]?/)) {\n        stream.tokenize = tokenBase;\n        return 'number'; };\n      if (stream.match(/^[+-]?\\d*\\.\\d+([EeDd][+-]?\\d+)?[ij]?/)) { return 'number'; };\n      if (stream.match(/^[+-]?\\d+([EeDd][+-]?\\d+)?[ij]?/)) { return 'number'; };\n    }\n    if (stream.match(wordRegexp(['nan','NaN','inf','Inf']))) { return 'number'; };\n\n    // Handle Strings\n    var m = stream.match(/^\"(?:[^\"]|\"\")*(\"|$)/) || stream.match(/^'(?:[^']|'')*('|$)/)\n    if (m) { return m[1] ? 'string' : \"string error\"; }\n\n    // Handle words\n    if (stream.match(keywords)) { return 'keyword'; } ;\n    if (stream.match(builtins)) { return 'builtin'; } ;\n    if (stream.match(identifiers)) { return 'variable'; } ;\n\n    if (stream.match(singleOperators) || stream.match(doubleOperators)) { return 'operator'; };\n    if (stream.match(singleDelimiters) || stream.match(doubleDelimiters) || stream.match(tripleDelimiters)) { return null; };\n\n    if (stream.match(expressionEnd)) {\n      state.tokenize = tokenTranspose;\n      return null;\n    };\n\n\n    // Handle non-detected items\n    stream.next();\n    return 'error';\n  };\n\n\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase\n      };\n    },\n\n    token: function(stream, state) {\n      var style = state.tokenize(stream, state);\n      if (style === 'number' || style === 'variable'){\n        state.tokenize = tokenTranspose;\n      }\n      return style;\n    },\n\n    lineComment: '%',\n\n    fold: 'indent'\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-octave\", \"octave\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/oz/oz.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"oz\", function (conf) {\n\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  var singleOperators = /[\\^@!\\|<>#~\\.\\*\\-\\+\\\\/,=]/;\n  var doubleOperators = /(<-)|(:=)|(=<)|(>=)|(<=)|(<:)|(>:)|(=:)|(\\\\=)|(\\\\=:)|(!!)|(==)|(::)/;\n  var tripleOperators = /(:::)|(\\.\\.\\.)|(=<:)|(>=:)/;\n\n  var middle = [\"in\", \"then\", \"else\", \"of\", \"elseof\", \"elsecase\", \"elseif\", \"catch\",\n    \"finally\", \"with\", \"require\", \"prepare\", \"import\", \"export\", \"define\", \"do\"];\n  var end = [\"end\"];\n\n  var atoms = wordRegexp([\"true\", \"false\", \"nil\", \"unit\"]);\n  var commonKeywords = wordRegexp([\"andthen\", \"at\", \"attr\", \"declare\", \"feat\", \"from\", \"lex\",\n    \"mod\", \"div\", \"mode\", \"orelse\", \"parser\", \"prod\", \"prop\", \"scanner\", \"self\", \"syn\", \"token\"]);\n  var openingKeywords = wordRegexp([\"local\", \"proc\", \"fun\", \"case\", \"class\", \"if\", \"cond\", \"or\", \"dis\",\n    \"choice\", \"not\", \"thread\", \"try\", \"raise\", \"lock\", \"for\", \"suchthat\", \"meth\", \"functor\"]);\n  var middleKeywords = wordRegexp(middle);\n  var endKeywords = wordRegexp(end);\n\n  // Tokenizers\n  function tokenBase(stream, state) {\n    if (stream.eatSpace()) {\n      return null;\n    }\n\n    // Brackets\n    if(stream.match(/[{}]/)) {\n      return \"bracket\";\n    }\n\n    // Special [] keyword\n    if (stream.match('[]')) {\n        return \"keyword\"\n    }\n\n    // Operators\n    if (stream.match(tripleOperators) || stream.match(doubleOperators)) {\n      return \"operator\";\n    }\n\n    // Atoms\n    if(stream.match(atoms)) {\n      return 'atom';\n    }\n\n    // Opening keywords\n    var matched = stream.match(openingKeywords);\n    if (matched) {\n      if (!state.doInCurrentLine)\n        state.currentIndent++;\n      else\n        state.doInCurrentLine = false;\n\n      // Special matching for signatures\n      if(matched[0] == \"proc\" || matched[0] == \"fun\")\n        state.tokenize = tokenFunProc;\n      else if(matched[0] == \"class\")\n        state.tokenize = tokenClass;\n      else if(matched[0] == \"meth\")\n        state.tokenize = tokenMeth;\n\n      return 'keyword';\n    }\n\n    // Middle and other keywords\n    if (stream.match(middleKeywords) || stream.match(commonKeywords)) {\n      return \"keyword\"\n    }\n\n    // End keywords\n    if (stream.match(endKeywords)) {\n      state.currentIndent--;\n      return 'keyword';\n    }\n\n    // Eat the next char for next comparisons\n    var ch = stream.next();\n\n    // Strings\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n\n    // Numbers\n    if (/[~\\d]/.test(ch)) {\n      if (ch == \"~\") {\n        if(! /^[0-9]/.test(stream.peek()))\n          return null;\n        else if (( stream.next() == \"0\" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\\.[0-9]+)?([eE][~+]?[0-9]+)?/))\n          return \"number\";\n      }\n\n      if ((ch == \"0\" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\\.[0-9]+)?([eE][~+]?[0-9]+)?/))\n        return \"number\";\n\n      return null;\n    }\n\n    // Comments\n    if (ch == \"%\") {\n      stream.skipToEnd();\n      return 'comment';\n    }\n    else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n    }\n\n    // Single operators\n    if(singleOperators.test(ch)) {\n      return \"operator\";\n    }\n\n    // If nothing match, we skip the entire alphanumeric block\n    stream.eatWhile(/\\w/);\n\n    return \"variable\";\n  }\n\n  function tokenClass(stream, state) {\n    if (stream.eatSpace()) {\n      return null;\n    }\n    stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)/);\n    state.tokenize = tokenBase;\n    return \"variable-3\"\n  }\n\n  function tokenMeth(stream, state) {\n    if (stream.eatSpace()) {\n      return null;\n    }\n    stream.match(/([a-zA-Z][A-Za-z0-9_]*)|(`.+`)/);\n    state.tokenize = tokenBase;\n    return \"def\"\n  }\n\n  function tokenFunProc(stream, state) {\n    if (stream.eatSpace()) {\n      return null;\n    }\n\n    if(!state.hasPassedFirstStage && stream.eat(\"{\")) {\n      state.hasPassedFirstStage = true;\n      return \"bracket\";\n    }\n    else if(state.hasPassedFirstStage) {\n      stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)|\\$/);\n      state.hasPassedFirstStage = false;\n      state.tokenize = tokenBase;\n      return \"def\"\n    }\n    else {\n      state.tokenize = tokenBase;\n      return null;\n    }\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function tokenString(quote) {\n    return function (stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n          end = true;\n          break;\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !escaped)\n        state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  function buildElectricInputRegEx() {\n    // Reindentation should occur on [] or on a match of any of\n    // the block closing keywords, at the end of a line.\n    var allClosings = middle.concat(end);\n    return new RegExp(\"[\\\\[\\\\]]|(\" + allClosings.join(\"|\") + \")$\");\n  }\n\n  return {\n\n    startState: function () {\n      return {\n        tokenize: tokenBase,\n        currentIndent: 0,\n        doInCurrentLine: false,\n        hasPassedFirstStage: false\n      };\n    },\n\n    token: function (stream, state) {\n      if (stream.sol())\n        state.doInCurrentLine = 0;\n\n      return state.tokenize(stream, state);\n    },\n\n    indent: function (state, textAfter) {\n      var trueText = textAfter.replace(/^\\s+|\\s+$/g, '');\n\n      if (trueText.match(endKeywords) || trueText.match(middleKeywords) || trueText.match(/(\\[])/))\n        return conf.indentUnit * (state.currentIndent - 1);\n\n      if (state.currentIndent < 0)\n        return 0;\n\n      return state.currentIndent * conf.indentUnit;\n    },\n    fold: \"indent\",\n    electricInput: buildElectricInputRegEx(),\n    lineComment: \"%\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-oz\", \"oz\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/pascal/pascal.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"pascal\", function() {\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  var keywords = words(\n    \"absolute and array asm begin case const constructor destructor div do \" +\n    \"downto else end file for function goto if implementation in inherited \" +\n    \"inline interface label mod nil not object of operator or packed procedure \" +\n    \"program record reintroduce repeat self set shl shr string then to type \" +\n    \"unit until uses var while with xor as class dispinterface except exports \" +\n    \"finalization finally initialization inline is library on out packed \" +\n    \"property raise resourcestring threadvar try absolute abstract alias \" +\n    \"assembler bitpacked break cdecl continue cppdecl cvar default deprecated \" +\n    \"dynamic enumerator experimental export external far far16 forward generic \" +\n    \"helper implements index interrupt iocheck local message name near \" +\n    \"nodefault noreturn nostackframe oldfpccall otherwise overload override \" +\n    \"pascal platform private protected public published read register \" +\n    \"reintroduce result safecall saveregisters softfloat specialize static \" +\n    \"stdcall stored strict unaligned unimplemented varargs virtual write\");\n  var atoms = {\"null\": true};\n\n  var isOperatorChar = /[+\\-*&%=<>!?|\\/]/;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == \"#\" && state.startOfLine) {\n      stream.skipToEnd();\n      return \"meta\";\n    }\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (ch == \"(\" && stream.eat(\"*\")) {\n      state.tokenize = tokenComment;\n      return tokenComment(stream, state);\n    }\n    if (ch == \"{\") {\n      state.tokenize = tokenCommentBraces;\n      return tokenCommentBraces(stream, state);\n    }\n    if (/[\\[\\]\\(\\),;\\:\\.]/.test(ch)) {\n      return null;\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_]/);\n    var cur = stream.current();\n    if (keywords.propertyIsEnumerable(cur)) return \"keyword\";\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !escaped) state.tokenize = null;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \")\" && maybeEnd) {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function tokenCommentBraces(stream, state) {\n    var ch;\n    while (ch = stream.next()) {\n      if (ch == \"}\") {\n        state.tokenize = null;\n        break;\n      }\n    }\n    return \"comment\";\n  }\n\n  // Interface\n\n  return {\n    startState: function() {\n      return {tokenize: null};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      return style;\n    },\n\n    electricChars: \"{}\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-pascal\", \"pascal\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/pegjs/pegjs.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../javascript/javascript\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../javascript/javascript\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"pegjs\", function (config) {\n  var jsMode = CodeMirror.getMode(config, \"javascript\");\n\n  function identifier(stream) {\n    return stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/);\n  }\n\n  return {\n    startState: function () {\n      return {\n        inString: false,\n        stringType: null,\n        inComment: false,\n        inCharacterClass: false,\n        braced: 0,\n        lhs: true,\n        localState: null\n      };\n    },\n    token: function (stream, state) {\n      if (stream)\n\n      //check for state changes\n      if (!state.inString && !state.inComment && ((stream.peek() == '\"') || (stream.peek() == \"'\"))) {\n        state.stringType = stream.peek();\n        stream.next(); // Skip quote\n        state.inString = true; // Update state\n      }\n      if (!state.inString && !state.inComment && stream.match('/*')) {\n        state.inComment = true;\n      }\n\n      //return state\n      if (state.inString) {\n        while (state.inString && !stream.eol()) {\n          if (stream.peek() === state.stringType) {\n            stream.next(); // Skip quote\n            state.inString = false; // Clear flag\n          } else if (stream.peek() === '\\\\') {\n            stream.next();\n            stream.next();\n          } else {\n            stream.match(/^.[^\\\\\\\"\\']*/);\n          }\n        }\n        return state.lhs ? \"property string\" : \"string\"; // Token style\n      } else if (state.inComment) {\n        while (state.inComment && !stream.eol()) {\n          if (stream.match('*/')) {\n            state.inComment = false; // Clear flag\n          } else {\n            stream.match(/^.[^\\*]*/);\n          }\n        }\n        return \"comment\";\n      } else if (state.inCharacterClass) {\n          while (state.inCharacterClass && !stream.eol()) {\n            if (!(stream.match(/^[^\\]\\\\]+/) || stream.match(/^\\\\./))) {\n              state.inCharacterClass = false;\n            }\n          }\n      } else if (stream.peek() === '[') {\n        stream.next();\n        state.inCharacterClass = true;\n        return 'bracket';\n      } else if (stream.match('//')) {\n        stream.skipToEnd();\n        return \"comment\";\n      } else if (state.braced || stream.peek() === '{') {\n        if (state.localState === null) {\n          state.localState = CodeMirror.startState(jsMode);\n        }\n        var token = jsMode.token(stream, state.localState);\n        var text = stream.current();\n        if (!token) {\n          for (var i = 0; i < text.length; i++) {\n            if (text[i] === '{') {\n              state.braced++;\n            } else if (text[i] === '}') {\n              state.braced--;\n            }\n          };\n        }\n        return token;\n      } else if (identifier(stream)) {\n        if (stream.peek() === ':') {\n          return 'variable';\n        }\n        return 'variable-2';\n      } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) {\n        stream.next();\n        return 'bracket';\n      } else if (!stream.eatSpace()) {\n        stream.next();\n      }\n      return null;\n    }\n  };\n}, \"javascript\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/perl/perl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// CodeMirror2 mode/perl/perl.js (text/x-perl) beta 0.10 (2011-11-08)\n// This is a part of CodeMirror from https://github.com/sabaca/CodeMirror_mode_perl (mail@sabaca.com)\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"perl\",function(){\n        // http://perldoc.perl.org\n        var PERL={                                      //   null - magic touch\n                                                        //   1 - keyword\n                                                        //   2 - def\n                                                        //   3 - atom\n                                                        //   4 - operator\n                                                        //   5 - variable-2 (predefined)\n                                                        //   [x,y] - x=1,2,3; y=must be defined if x{...}\n                                                //      PERL operators\n                '->'                            :   4,\n                '++'                            :   4,\n                '--'                            :   4,\n                '**'                            :   4,\n                                                        //   ! ~ \\ and unary + and -\n                '=~'                            :   4,\n                '!~'                            :   4,\n                '*'                             :   4,\n                '/'                             :   4,\n                '%'                             :   4,\n                'x'                             :   4,\n                '+'                             :   4,\n                '-'                             :   4,\n                '.'                             :   4,\n                '<<'                            :   4,\n                '>>'                            :   4,\n                                                        //   named unary operators\n                '<'                             :   4,\n                '>'                             :   4,\n                '<='                            :   4,\n                '>='                            :   4,\n                'lt'                            :   4,\n                'gt'                            :   4,\n                'le'                            :   4,\n                'ge'                            :   4,\n                '=='                            :   4,\n                '!='                            :   4,\n                '<=>'                           :   4,\n                'eq'                            :   4,\n                'ne'                            :   4,\n                'cmp'                           :   4,\n                '~~'                            :   4,\n                '&'                             :   4,\n                '|'                             :   4,\n                '^'                             :   4,\n                '&&'                            :   4,\n                '||'                            :   4,\n                '//'                            :   4,\n                '..'                            :   4,\n                '...'                           :   4,\n                '?'                             :   4,\n                ':'                             :   4,\n                '='                             :   4,\n                '+='                            :   4,\n                '-='                            :   4,\n                '*='                            :   4,  //   etc. ???\n                ','                             :   4,\n                '=>'                            :   4,\n                '::'                            :   4,\n                                                        //   list operators (rightward)\n                'not'                           :   4,\n                'and'                           :   4,\n                'or'                            :   4,\n                'xor'                           :   4,\n                                                //      PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;)\n                'BEGIN'                         :   [5,1],\n                'END'                           :   [5,1],\n                'PRINT'                         :   [5,1],\n                'PRINTF'                        :   [5,1],\n                'GETC'                          :   [5,1],\n                'READ'                          :   [5,1],\n                'READLINE'                      :   [5,1],\n                'DESTROY'                       :   [5,1],\n                'TIE'                           :   [5,1],\n                'TIEHANDLE'                     :   [5,1],\n                'UNTIE'                         :   [5,1],\n                'STDIN'                         :    5,\n                'STDIN_TOP'                     :    5,\n                'STDOUT'                        :    5,\n                'STDOUT_TOP'                    :    5,\n                'STDERR'                        :    5,\n                'STDERR_TOP'                    :    5,\n                '$ARG'                          :    5,\n                '$_'                            :    5,\n                '@ARG'                          :    5,\n                '@_'                            :    5,\n                '$LIST_SEPARATOR'               :    5,\n                '$\"'                            :    5,\n                '$PROCESS_ID'                   :    5,\n                '$PID'                          :    5,\n                '$$'                            :    5,\n                '$REAL_GROUP_ID'                :    5,\n                '$GID'                          :    5,\n                '$('                            :    5,\n                '$EFFECTIVE_GROUP_ID'           :    5,\n                '$EGID'                         :    5,\n                '$)'                            :    5,\n                '$PROGRAM_NAME'                 :    5,\n                '$0'                            :    5,\n                '$SUBSCRIPT_SEPARATOR'          :    5,\n                '$SUBSEP'                       :    5,\n                '$;'                            :    5,\n                '$REAL_USER_ID'                 :    5,\n                '$UID'                          :    5,\n                '$<'                            :    5,\n                '$EFFECTIVE_USER_ID'            :    5,\n                '$EUID'                         :    5,\n                '$>'                            :    5,\n                '$a'                            :    5,\n                '$b'                            :    5,\n                '$COMPILING'                    :    5,\n                '$^C'                           :    5,\n                '$DEBUGGING'                    :    5,\n                '$^D'                           :    5,\n                '${^ENCODING}'                  :    5,\n                '$ENV'                          :    5,\n                '%ENV'                          :    5,\n                '$SYSTEM_FD_MAX'                :    5,\n                '$^F'                           :    5,\n                '@F'                            :    5,\n                '${^GLOBAL_PHASE}'              :    5,\n                '$^H'                           :    5,\n                '%^H'                           :    5,\n                '@INC'                          :    5,\n                '%INC'                          :    5,\n                '$INPLACE_EDIT'                 :    5,\n                '$^I'                           :    5,\n                '$^M'                           :    5,\n                '$OSNAME'                       :    5,\n                '$^O'                           :    5,\n                '${^OPEN}'                      :    5,\n                '$PERLDB'                       :    5,\n                '$^P'                           :    5,\n                '$SIG'                          :    5,\n                '%SIG'                          :    5,\n                '$BASETIME'                     :    5,\n                '$^T'                           :    5,\n                '${^TAINT}'                     :    5,\n                '${^UNICODE}'                   :    5,\n                '${^UTF8CACHE}'                 :    5,\n                '${^UTF8LOCALE}'                :    5,\n                '$PERL_VERSION'                 :    5,\n                '$^V'                           :    5,\n                '${^WIN32_SLOPPY_STAT}'         :    5,\n                '$EXECUTABLE_NAME'              :    5,\n                '$^X'                           :    5,\n                '$1'                            :    5, // - regexp $1, $2...\n                '$MATCH'                        :    5,\n                '$&'                            :    5,\n                '${^MATCH}'                     :    5,\n                '$PREMATCH'                     :    5,\n                '$`'                            :    5,\n                '${^PREMATCH}'                  :    5,\n                '$POSTMATCH'                    :    5,\n                \"$'\"                            :    5,\n                '${^POSTMATCH}'                 :    5,\n                '$LAST_PAREN_MATCH'             :    5,\n                '$+'                            :    5,\n                '$LAST_SUBMATCH_RESULT'         :    5,\n                '$^N'                           :    5,\n                '@LAST_MATCH_END'               :    5,\n                '@+'                            :    5,\n                '%LAST_PAREN_MATCH'             :    5,\n                '%+'                            :    5,\n                '@LAST_MATCH_START'             :    5,\n                '@-'                            :    5,\n                '%LAST_MATCH_START'             :    5,\n                '%-'                            :    5,\n                '$LAST_REGEXP_CODE_RESULT'      :    5,\n                '$^R'                           :    5,\n                '${^RE_DEBUG_FLAGS}'            :    5,\n                '${^RE_TRIE_MAXBUF}'            :    5,\n                '$ARGV'                         :    5,\n                '@ARGV'                         :    5,\n                'ARGV'                          :    5,\n                'ARGVOUT'                       :    5,\n                '$OUTPUT_FIELD_SEPARATOR'       :    5,\n                '$OFS'                          :    5,\n                '$,'                            :    5,\n                '$INPUT_LINE_NUMBER'            :    5,\n                '$NR'                           :    5,\n                '$.'                            :    5,\n                '$INPUT_RECORD_SEPARATOR'       :    5,\n                '$RS'                           :    5,\n                '$/'                            :    5,\n                '$OUTPUT_RECORD_SEPARATOR'      :    5,\n                '$ORS'                          :    5,\n                '$\\\\'                           :    5,\n                '$OUTPUT_AUTOFLUSH'             :    5,\n                '$|'                            :    5,\n                '$ACCUMULATOR'                  :    5,\n                '$^A'                           :    5,\n                '$FORMAT_FORMFEED'              :    5,\n                '$^L'                           :    5,\n                '$FORMAT_PAGE_NUMBER'           :    5,\n                '$%'                            :    5,\n                '$FORMAT_LINES_LEFT'            :    5,\n                '$-'                            :    5,\n                '$FORMAT_LINE_BREAK_CHARACTERS' :    5,\n                '$:'                            :    5,\n                '$FORMAT_LINES_PER_PAGE'        :    5,\n                '$='                            :    5,\n                '$FORMAT_TOP_NAME'              :    5,\n                '$^'                            :    5,\n                '$FORMAT_NAME'                  :    5,\n                '$~'                            :    5,\n                '${^CHILD_ERROR_NATIVE}'        :    5,\n                '$EXTENDED_OS_ERROR'            :    5,\n                '$^E'                           :    5,\n                '$EXCEPTIONS_BEING_CAUGHT'      :    5,\n                '$^S'                           :    5,\n                '$WARNING'                      :    5,\n                '$^W'                           :    5,\n                '${^WARNING_BITS}'              :    5,\n                '$OS_ERROR'                     :    5,\n                '$ERRNO'                        :    5,\n                '$!'                            :    5,\n                '%OS_ERROR'                     :    5,\n                '%ERRNO'                        :    5,\n                '%!'                            :    5,\n                '$CHILD_ERROR'                  :    5,\n                '$?'                            :    5,\n                '$EVAL_ERROR'                   :    5,\n                '$@'                            :    5,\n                '$OFMT'                         :    5,\n                '$#'                            :    5,\n                '$*'                            :    5,\n                '$ARRAY_BASE'                   :    5,\n                '$['                            :    5,\n                '$OLD_PERL_VERSION'             :    5,\n                '$]'                            :    5,\n                                                //      PERL blocks\n                'if'                            :[1,1],\n                elsif                           :[1,1],\n                'else'                          :[1,1],\n                'while'                         :[1,1],\n                unless                          :[1,1],\n                'for'                           :[1,1],\n                foreach                         :[1,1],\n                                                //      PERL functions\n                'abs'                           :1,     // - absolute value function\n                accept                          :1,     // - accept an incoming socket connect\n                alarm                           :1,     // - schedule a SIGALRM\n                'atan2'                         :1,     // - arctangent of Y/X in the range -PI to PI\n                bind                            :1,     // - binds an address to a socket\n                binmode                         :1,     // - prepare binary files for I/O\n                bless                           :1,     // - create an object\n                bootstrap                       :1,     //\n                'break'                         :1,     // - break out of a \"given\" block\n                caller                          :1,     // - get context of the current subroutine call\n                chdir                           :1,     // - change your current working directory\n                chmod                           :1,     // - changes the permissions on a list of files\n                chomp                           :1,     // - remove a trailing record separator from a string\n                chop                            :1,     // - remove the last character from a string\n                chown                           :1,     // - change the ownership on a list of files\n                chr                             :1,     // - get character this number represents\n                chroot                          :1,     // - make directory new root for path lookups\n                close                           :1,     // - close file (or pipe or socket) handle\n                closedir                        :1,     // - close directory handle\n                connect                         :1,     // - connect to a remote socket\n                'continue'                      :[1,1], // - optional trailing block in a while or foreach\n                'cos'                           :1,     // - cosine function\n                crypt                           :1,     // - one-way passwd-style encryption\n                dbmclose                        :1,     // - breaks binding on a tied dbm file\n                dbmopen                         :1,     // - create binding on a tied dbm file\n                'default'                       :1,     //\n                defined                         :1,     // - test whether a value, variable, or function is defined\n                'delete'                        :1,     // - deletes a value from a hash\n                die                             :1,     // - raise an exception or bail out\n                'do'                            :1,     // - turn a BLOCK into a TERM\n                dump                            :1,     // - create an immediate core dump\n                each                            :1,     // - retrieve the next key/value pair from a hash\n                endgrent                        :1,     // - be done using group file\n                endhostent                      :1,     // - be done using hosts file\n                endnetent                       :1,     // - be done using networks file\n                endprotoent                     :1,     // - be done using protocols file\n                endpwent                        :1,     // - be done using passwd file\n                endservent                      :1,     // - be done using services file\n                eof                             :1,     // - test a filehandle for its end\n                'eval'                          :1,     // - catch exceptions or compile and run code\n                'exec'                          :1,     // - abandon this program to run another\n                exists                          :1,     // - test whether a hash key is present\n                exit                            :1,     // - terminate this program\n                'exp'                           :1,     // - raise I to a power\n                fcntl                           :1,     // - file control system call\n                fileno                          :1,     // - return file descriptor from filehandle\n                flock                           :1,     // - lock an entire file with an advisory lock\n                fork                            :1,     // - create a new process just like this one\n                format                          :1,     // - declare a picture format with use by the write() function\n                formline                        :1,     // - internal function used for formats\n                getc                            :1,     // - get the next character from the filehandle\n                getgrent                        :1,     // - get next group record\n                getgrgid                        :1,     // - get group record given group user ID\n                getgrnam                        :1,     // - get group record given group name\n                gethostbyaddr                   :1,     // - get host record given its address\n                gethostbyname                   :1,     // - get host record given name\n                gethostent                      :1,     // - get next hosts record\n                getlogin                        :1,     // - return who logged in at this tty\n                getnetbyaddr                    :1,     // - get network record given its address\n                getnetbyname                    :1,     // - get networks record given name\n                getnetent                       :1,     // - get next networks record\n                getpeername                     :1,     // - find the other end of a socket connection\n                getpgrp                         :1,     // - get process group\n                getppid                         :1,     // - get parent process ID\n                getpriority                     :1,     // - get current nice value\n                getprotobyname                  :1,     // - get protocol record given name\n                getprotobynumber                :1,     // - get protocol record numeric protocol\n                getprotoent                     :1,     // - get next protocols record\n                getpwent                        :1,     // - get next passwd record\n                getpwnam                        :1,     // - get passwd record given user login name\n                getpwuid                        :1,     // - get passwd record given user ID\n                getservbyname                   :1,     // - get services record given its name\n                getservbyport                   :1,     // - get services record given numeric port\n                getservent                      :1,     // - get next services record\n                getsockname                     :1,     // - retrieve the sockaddr for a given socket\n                getsockopt                      :1,     // - get socket options on a given socket\n                given                           :1,     //\n                glob                            :1,     // - expand filenames using wildcards\n                gmtime                          :1,     // - convert UNIX time into record or string using Greenwich time\n                'goto'                          :1,     // - create spaghetti code\n                grep                            :1,     // - locate elements in a list test true against a given criterion\n                hex                             :1,     // - convert a string to a hexadecimal number\n                'import'                        :1,     // - patch a module's namespace into your own\n                index                           :1,     // - find a substring within a string\n                'int'                           :1,     // - get the integer portion of a number\n                ioctl                           :1,     // - system-dependent device control system call\n                'join'                          :1,     // - join a list into a string using a separator\n                keys                            :1,     // - retrieve list of indices from a hash\n                kill                            :1,     // - send a signal to a process or process group\n                last                            :1,     // - exit a block prematurely\n                lc                              :1,     // - return lower-case version of a string\n                lcfirst                         :1,     // - return a string with just the next letter in lower case\n                length                          :1,     // - return the number of bytes in a string\n                'link'                          :1,     // - create a hard link in the filesystem\n                listen                          :1,     // - register your socket as a server\n                local                           : 2,    // - create a temporary value for a global variable (dynamic scoping)\n                localtime                       :1,     // - convert UNIX time into record or string using local time\n                lock                            :1,     // - get a thread lock on a variable, subroutine, or method\n                'log'                           :1,     // - retrieve the natural logarithm for a number\n                lstat                           :1,     // - stat a symbolic link\n                m                               :null,  // - match a string with a regular expression pattern\n                map                             :1,     // - apply a change to a list to get back a new list with the changes\n                mkdir                           :1,     // - create a directory\n                msgctl                          :1,     // - SysV IPC message control operations\n                msgget                          :1,     // - get SysV IPC message queue\n                msgrcv                          :1,     // - receive a SysV IPC message from a message queue\n                msgsnd                          :1,     // - send a SysV IPC message to a message queue\n                my                              : 2,    // - declare and assign a local variable (lexical scoping)\n                'new'                           :1,     //\n                next                            :1,     // - iterate a block prematurely\n                no                              :1,     // - unimport some module symbols or semantics at compile time\n                oct                             :1,     // - convert a string to an octal number\n                open                            :1,     // - open a file, pipe, or descriptor\n                opendir                         :1,     // - open a directory\n                ord                             :1,     // - find a character's numeric representation\n                our                             : 2,    // - declare and assign a package variable (lexical scoping)\n                pack                            :1,     // - convert a list into a binary representation\n                'package'                       :1,     // - declare a separate global namespace\n                pipe                            :1,     // - open a pair of connected filehandles\n                pop                             :1,     // - remove the last element from an array and return it\n                pos                             :1,     // - find or set the offset for the last/next m//g search\n                print                           :1,     // - output a list to a filehandle\n                printf                          :1,     // - output a formatted list to a filehandle\n                prototype                       :1,     // - get the prototype (if any) of a subroutine\n                push                            :1,     // - append one or more elements to an array\n                q                               :null,  // - singly quote a string\n                qq                              :null,  // - doubly quote a string\n                qr                              :null,  // - Compile pattern\n                quotemeta                       :null,  // - quote regular expression magic characters\n                qw                              :null,  // - quote a list of words\n                qx                              :null,  // - backquote quote a string\n                rand                            :1,     // - retrieve the next pseudorandom number\n                read                            :1,     // - fixed-length buffered input from a filehandle\n                readdir                         :1,     // - get a directory from a directory handle\n                readline                        :1,     // - fetch a record from a file\n                readlink                        :1,     // - determine where a symbolic link is pointing\n                readpipe                        :1,     // - execute a system command and collect standard output\n                recv                            :1,     // - receive a message over a Socket\n                redo                            :1,     // - start this loop iteration over again\n                ref                             :1,     // - find out the type of thing being referenced\n                rename                          :1,     // - change a filename\n                require                         :1,     // - load in external functions from a library at runtime\n                reset                           :1,     // - clear all variables of a given name\n                'return'                        :1,     // - get out of a function early\n                reverse                         :1,     // - flip a string or a list\n                rewinddir                       :1,     // - reset directory handle\n                rindex                          :1,     // - right-to-left substring search\n                rmdir                           :1,     // - remove a directory\n                s                               :null,  // - replace a pattern with a string\n                say                             :1,     // - print with newline\n                scalar                          :1,     // - force a scalar context\n                seek                            :1,     // - reposition file pointer for random-access I/O\n                seekdir                         :1,     // - reposition directory pointer\n                select                          :1,     // - reset default output or do I/O multiplexing\n                semctl                          :1,     // - SysV semaphore control operations\n                semget                          :1,     // - get set of SysV semaphores\n                semop                           :1,     // - SysV semaphore operations\n                send                            :1,     // - send a message over a socket\n                setgrent                        :1,     // - prepare group file for use\n                sethostent                      :1,     // - prepare hosts file for use\n                setnetent                       :1,     // - prepare networks file for use\n                setpgrp                         :1,     // - set the process group of a process\n                setpriority                     :1,     // - set a process's nice value\n                setprotoent                     :1,     // - prepare protocols file for use\n                setpwent                        :1,     // - prepare passwd file for use\n                setservent                      :1,     // - prepare services file for use\n                setsockopt                      :1,     // - set some socket options\n                shift                           :1,     // - remove the first element of an array, and return it\n                shmctl                          :1,     // - SysV shared memory operations\n                shmget                          :1,     // - get SysV shared memory segment identifier\n                shmread                         :1,     // - read SysV shared memory\n                shmwrite                        :1,     // - write SysV shared memory\n                shutdown                        :1,     // - close down just half of a socket connection\n                'sin'                           :1,     // - return the sine of a number\n                sleep                           :1,     // - block for some number of seconds\n                socket                          :1,     // - create a socket\n                socketpair                      :1,     // - create a pair of sockets\n                'sort'                          :1,     // - sort a list of values\n                splice                          :1,     // - add or remove elements anywhere in an array\n                'split'                         :1,     // - split up a string using a regexp delimiter\n                sprintf                         :1,     // - formatted print into a string\n                'sqrt'                          :1,     // - square root function\n                srand                           :1,     // - seed the random number generator\n                stat                            :1,     // - get a file's status information\n                state                           :1,     // - declare and assign a state variable (persistent lexical scoping)\n                study                           :1,     // - optimize input data for repeated searches\n                'sub'                           :1,     // - declare a subroutine, possibly anonymously\n                'substr'                        :1,     // - get or alter a portion of a string\n                symlink                         :1,     // - create a symbolic link to a file\n                syscall                         :1,     // - execute an arbitrary system call\n                sysopen                         :1,     // - open a file, pipe, or descriptor\n                sysread                         :1,     // - fixed-length unbuffered input from a filehandle\n                sysseek                         :1,     // - position I/O pointer on handle used with sysread and syswrite\n                system                          :1,     // - run a separate program\n                syswrite                        :1,     // - fixed-length unbuffered output to a filehandle\n                tell                            :1,     // - get current seekpointer on a filehandle\n                telldir                         :1,     // - get current seekpointer on a directory handle\n                tie                             :1,     // - bind a variable to an object class\n                tied                            :1,     // - get a reference to the object underlying a tied variable\n                time                            :1,     // - return number of seconds since 1970\n                times                           :1,     // - return elapsed time for self and child processes\n                tr                              :null,  // - transliterate a string\n                truncate                        :1,     // - shorten a file\n                uc                              :1,     // - return upper-case version of a string\n                ucfirst                         :1,     // - return a string with just the next letter in upper case\n                umask                           :1,     // - set file creation mode mask\n                undef                           :1,     // - remove a variable or function definition\n                unlink                          :1,     // - remove one link to a file\n                unpack                          :1,     // - convert binary structure into normal perl variables\n                unshift                         :1,     // - prepend more elements to the beginning of a list\n                untie                           :1,     // - break a tie binding to a variable\n                use                             :1,     // - load in a module at compile time\n                utime                           :1,     // - set a file's last access and modify times\n                values                          :1,     // - return a list of the values in a hash\n                vec                             :1,     // - test or set particular bits in a string\n                wait                            :1,     // - wait for any child process to die\n                waitpid                         :1,     // - wait for a particular child process to die\n                wantarray                       :1,     // - get void vs scalar vs list context of current subroutine call\n                warn                            :1,     // - print debugging info\n                when                            :1,     //\n                write                           :1,     // - print a picture record\n                y                               :null}; // - transliterate a string\n\n        var RXstyle=\"string-2\";\n        var RXmodifiers=/[goseximacplud]/;              // NOTE: \"m\", \"s\", \"y\" and \"tr\" need to correct real modifiers for each regexp type\n\n        function tokenChain(stream,state,chain,style,tail){     // NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;)\n                state.chain=null;                               //                                                          12   3tail\n                state.style=null;\n                state.tail=null;\n                state.tokenize=function(stream,state){\n                        var e=false,c,i=0;\n                        while(c=stream.next()){\n                                if(c===chain[i]&&!e){\n                                        if(chain[++i]!==undefined){\n                                                state.chain=chain[i];\n                                                state.style=style;\n                                                state.tail=tail;}\n                                        else if(tail)\n                                                stream.eatWhile(tail);\n                                        state.tokenize=tokenPerl;\n                                        return style;}\n                                e=!e&&c==\"\\\\\";}\n                        return style;};\n                return state.tokenize(stream,state);}\n\n        function tokenSOMETHING(stream,state,string){\n                state.tokenize=function(stream,state){\n                        if(stream.string==string)\n                                state.tokenize=tokenPerl;\n                        stream.skipToEnd();\n                        return \"string\";};\n                return state.tokenize(stream,state);}\n\n        function tokenPerl(stream,state){\n                if(stream.eatSpace())\n                        return null;\n                if(state.chain)\n                        return tokenChain(stream,state,state.chain,state.style,state.tail);\n                if(stream.match(/^(\\-?((\\d[\\d_]*)?\\.\\d+(e[+-]?\\d+)?|\\d+\\.\\d*)|0x[\\da-fA-F_]+|0b[01_]+|\\d[\\d_]*(e[+-]?\\d+)?)/))\n                        return 'number';\n                if(stream.match(/^<<(?=[_a-zA-Z])/)){                  // NOTE: <<SOMETHING\\n...\\nSOMETHING\\n\n                        stream.eatWhile(/\\w/);\n                        return tokenSOMETHING(stream,state,stream.current().substr(2));}\n                if(stream.sol()&&stream.match(/^\\=item(?!\\w)/)){// NOTE: \\n=item...\\n=cut\\n\n                        return tokenSOMETHING(stream,state,'=cut');}\n                var ch=stream.next();\n                if(ch=='\"'||ch==\"'\"){                           // NOTE: ' or \" or <<'SOMETHING'\\n...\\nSOMETHING\\n or <<\"SOMETHING\"\\n...\\nSOMETHING\\n\n                        if(prefix(stream, 3)==\"<<\"+ch){\n                                var p=stream.pos;\n                                stream.eatWhile(/\\w/);\n                                var n=stream.current().substr(1);\n                                if(n&&stream.eat(ch))\n                                        return tokenSOMETHING(stream,state,n);\n                                stream.pos=p;}\n                        return tokenChain(stream,state,[ch],\"string\");}\n                if(ch==\"q\"){\n                        var c=look(stream, -2);\n                        if(!(c&&/\\w/.test(c))){\n                                c=look(stream, 0);\n                                if(c==\"x\"){\n                                        c=look(stream, 1);\n                                        if(c==\"(\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\")\"],RXstyle,RXmodifiers);}\n                                        if(c==\"[\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"]\"],RXstyle,RXmodifiers);}\n                                        if(c==\"{\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"}\"],RXstyle,RXmodifiers);}\n                                        if(c==\"<\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\">\"],RXstyle,RXmodifiers);}\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}\n                                else if(c==\"q\"){\n                                        c=look(stream, 1);\n                                        if(c==\"(\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\")\"],\"string\");}\n                                        if(c==\"[\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"]\"],\"string\");}\n                                        if(c==\"{\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"}\"],\"string\");}\n                                        if(c==\"<\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\">\"],\"string\");}\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[stream.eat(c)],\"string\");}}\n                                else if(c==\"w\"){\n                                        c=look(stream, 1);\n                                        if(c==\"(\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\")\"],\"bracket\");}\n                                        if(c==\"[\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"]\"],\"bracket\");}\n                                        if(c==\"{\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"}\"],\"bracket\");}\n                                        if(c==\"<\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\">\"],\"bracket\");}\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[stream.eat(c)],\"bracket\");}}\n                                else if(c==\"r\"){\n                                        c=look(stream, 1);\n                                        if(c==\"(\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\")\"],RXstyle,RXmodifiers);}\n                                        if(c==\"[\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"]\"],RXstyle,RXmodifiers);}\n                                        if(c==\"{\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\"}\"],RXstyle,RXmodifiers);}\n                                        if(c==\"<\"){\n                                                eatSuffix(stream, 2);\n                                                return tokenChain(stream,state,[\">\"],RXstyle,RXmodifiers);}\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}\n                                else if(/[\\^'\"!~\\/(\\[{<]/.test(c)){\n                                        if(c==\"(\"){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[\")\"],\"string\");}\n                                        if(c==\"[\"){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[\"]\"],\"string\");}\n                                        if(c==\"{\"){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[\"}\"],\"string\");}\n                                        if(c==\"<\"){\n                                                eatSuffix(stream, 1);\n                                                return tokenChain(stream,state,[\">\"],\"string\");}\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                return tokenChain(stream,state,[stream.eat(c)],\"string\");}}}}\n                if(ch==\"m\"){\n                        var c=look(stream, -2);\n                        if(!(c&&/\\w/.test(c))){\n                                c=stream.eat(/[(\\[{<\\^'\"!~\\/]/);\n                                if(c){\n                                        if(/[\\^'\"!~\\/]/.test(c)){\n                                                return tokenChain(stream,state,[c],RXstyle,RXmodifiers);}\n                                        if(c==\"(\"){\n                                                return tokenChain(stream,state,[\")\"],RXstyle,RXmodifiers);}\n                                        if(c==\"[\"){\n                                                return tokenChain(stream,state,[\"]\"],RXstyle,RXmodifiers);}\n                                        if(c==\"{\"){\n                                                return tokenChain(stream,state,[\"}\"],RXstyle,RXmodifiers);}\n                                        if(c==\"<\"){\n                                                return tokenChain(stream,state,[\">\"],RXstyle,RXmodifiers);}}}}\n                if(ch==\"s\"){\n                        var c=/[\\/>\\]})\\w]/.test(look(stream, -2));\n                        if(!c){\n                                c=stream.eat(/[(\\[{<\\^'\"!~\\/]/);\n                                if(c){\n                                        if(c==\"[\")\n                                                return tokenChain(stream,state,[\"]\",\"]\"],RXstyle,RXmodifiers);\n                                        if(c==\"{\")\n                                                return tokenChain(stream,state,[\"}\",\"}\"],RXstyle,RXmodifiers);\n                                        if(c==\"<\")\n                                                return tokenChain(stream,state,[\">\",\">\"],RXstyle,RXmodifiers);\n                                        if(c==\"(\")\n                                                return tokenChain(stream,state,[\")\",\")\"],RXstyle,RXmodifiers);\n                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}\n                if(ch==\"y\"){\n                        var c=/[\\/>\\]})\\w]/.test(look(stream, -2));\n                        if(!c){\n                                c=stream.eat(/[(\\[{<\\^'\"!~\\/]/);\n                                if(c){\n                                        if(c==\"[\")\n                                                return tokenChain(stream,state,[\"]\",\"]\"],RXstyle,RXmodifiers);\n                                        if(c==\"{\")\n                                                return tokenChain(stream,state,[\"}\",\"}\"],RXstyle,RXmodifiers);\n                                        if(c==\"<\")\n                                                return tokenChain(stream,state,[\">\",\">\"],RXstyle,RXmodifiers);\n                                        if(c==\"(\")\n                                                return tokenChain(stream,state,[\")\",\")\"],RXstyle,RXmodifiers);\n                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}\n                if(ch==\"t\"){\n                        var c=/[\\/>\\]})\\w]/.test(look(stream, -2));\n                        if(!c){\n                                c=stream.eat(\"r\");if(c){\n                                c=stream.eat(/[(\\[{<\\^'\"!~\\/]/);\n                                if(c){\n                                        if(c==\"[\")\n                                                return tokenChain(stream,state,[\"]\",\"]\"],RXstyle,RXmodifiers);\n                                        if(c==\"{\")\n                                                return tokenChain(stream,state,[\"}\",\"}\"],RXstyle,RXmodifiers);\n                                        if(c==\"<\")\n                                                return tokenChain(stream,state,[\">\",\">\"],RXstyle,RXmodifiers);\n                                        if(c==\"(\")\n                                                return tokenChain(stream,state,[\")\",\")\"],RXstyle,RXmodifiers);\n                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}}\n                if(ch==\"`\"){\n                        return tokenChain(stream,state,[ch],\"variable-2\");}\n                if(ch==\"/\"){\n                        if(!/~\\s*$/.test(prefix(stream)))\n                                return \"operator\";\n                        else\n                                return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);}\n                if(ch==\"$\"){\n                        var p=stream.pos;\n                        if(stream.eatWhile(/\\d/)||stream.eat(\"{\")&&stream.eatWhile(/\\d/)&&stream.eat(\"}\"))\n                                return \"variable-2\";\n                        else\n                                stream.pos=p;}\n                if(/[$@%]/.test(ch)){\n                        var p=stream.pos;\n                        if(stream.eat(\"^\")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(look(stream, -2))&&stream.eat(/[=|\\\\\\-#?@;:&`~\\^!\\[\\]*'\"$+.,\\/<>()]/)){\n                                var c=stream.current();\n                                if(PERL[c])\n                                        return \"variable-2\";}\n                        stream.pos=p;}\n                if(/[$@%&]/.test(ch)){\n                        if(stream.eatWhile(/[\\w$]/)||stream.eat(\"{\")&&stream.eatWhile(/[\\w$]/)&&stream.eat(\"}\")){\n                                var c=stream.current();\n                                if(PERL[c])\n                                        return \"variable-2\";\n                                else\n                                        return \"variable\";}}\n                if(ch==\"#\"){\n                        if(look(stream, -2)!=\"$\"){\n                                stream.skipToEnd();\n                                return \"comment\";}}\n                if(/[:+\\-\\^*$&%@=<>!?|\\/~\\.]/.test(ch)){\n                        var p=stream.pos;\n                        stream.eatWhile(/[:+\\-\\^*$&%@=<>!?|\\/~\\.]/);\n                        if(PERL[stream.current()])\n                                return \"operator\";\n                        else\n                                stream.pos=p;}\n                if(ch==\"_\"){\n                        if(stream.pos==1){\n                                if(suffix(stream, 6)==\"_END__\"){\n                                        return tokenChain(stream,state,['\\0'],\"comment\");}\n                                else if(suffix(stream, 7)==\"_DATA__\"){\n                                        return tokenChain(stream,state,['\\0'],\"variable-2\");}\n                                else if(suffix(stream, 7)==\"_C__\"){\n                                        return tokenChain(stream,state,['\\0'],\"string\");}}}\n                if(/\\w/.test(ch)){\n                        var p=stream.pos;\n                        if(look(stream, -2)==\"{\"&&(look(stream, 0)==\"}\"||stream.eatWhile(/\\w/)&&look(stream, 0)==\"}\"))\n                                return \"string\";\n                        else\n                                stream.pos=p;}\n                if(/[A-Z]/.test(ch)){\n                        var l=look(stream, -2);\n                        var p=stream.pos;\n                        stream.eatWhile(/[A-Z_]/);\n                        if(/[\\da-z]/.test(look(stream, 0))){\n                                stream.pos=p;}\n                        else{\n                                var c=PERL[stream.current()];\n                                if(!c)\n                                        return \"meta\";\n                                if(c[1])\n                                        c=c[0];\n                                if(l!=\":\"){\n                                        if(c==1)\n                                                return \"keyword\";\n                                        else if(c==2)\n                                                return \"def\";\n                                        else if(c==3)\n                                                return \"atom\";\n                                        else if(c==4)\n                                                return \"operator\";\n                                        else if(c==5)\n                                                return \"variable-2\";\n                                        else\n                                                return \"meta\";}\n                                else\n                                        return \"meta\";}}\n                if(/[a-zA-Z_]/.test(ch)){\n                        var l=look(stream, -2);\n                        stream.eatWhile(/\\w/);\n                        var c=PERL[stream.current()];\n                        if(!c)\n                                return \"meta\";\n                        if(c[1])\n                                c=c[0];\n                        if(l!=\":\"){\n                                if(c==1)\n                                        return \"keyword\";\n                                else if(c==2)\n                                        return \"def\";\n                                else if(c==3)\n                                        return \"atom\";\n                                else if(c==4)\n                                        return \"operator\";\n                                else if(c==5)\n                                        return \"variable-2\";\n                                else\n                                        return \"meta\";}\n                        else\n                                return \"meta\";}\n                return null;}\n\n        return {\n            startState: function() {\n                return {\n                    tokenize: tokenPerl,\n                    chain: null,\n                    style: null,\n                    tail: null\n                };\n            },\n            token: function(stream, state) {\n                return (state.tokenize || tokenPerl)(stream, state);\n            },\n            lineComment: '#'\n        };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"perl\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/x-perl\", \"perl\");\n\n// it's like \"peek\", but need for look-ahead or look-behind if index < 0\nfunction look(stream, c){\n  return stream.string.charAt(stream.pos+(c||0));\n}\n\n// return a part of prefix of current stream from current position\nfunction prefix(stream, c){\n  if(c){\n    var x=stream.pos-c;\n    return stream.string.substr((x>=0?x:0),c);}\n  else{\n    return stream.string.substr(0,stream.pos-1);\n  }\n}\n\n// return a part of suffix of current stream from current position\nfunction suffix(stream, c){\n  var y=stream.string.length;\n  var x=y-stream.pos+1;\n  return stream.string.substr(stream.pos,(c&&c<y?c:x));\n}\n\n// eating and vomiting a part of stream from current position\nfunction eatSuffix(stream, c){\n  var x=stream.pos+c;\n  var y;\n  if(x<=0)\n    stream.pos=0;\n  else if(x>=(y=stream.string.length-1))\n    stream.pos=y;\n  else\n    stream.pos=x;\n}\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/php/php.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"), require(\"../clike/clike\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\", \"../clike/clike\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function keywords(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  // Helper for phpString\n  function matchSequence(list, end, escapes) {\n    if (list.length == 0) return phpString(end);\n    return function (stream, state) {\n      var patterns = list[0];\n      for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) {\n        state.tokenize = matchSequence(list.slice(1), end);\n        return patterns[i][1];\n      }\n      state.tokenize = phpString(end, escapes);\n      return \"string\";\n    };\n  }\n  function phpString(closing, escapes) {\n    return function(stream, state) { return phpString_(stream, state, closing, escapes); };\n  }\n  function phpString_(stream, state, closing, escapes) {\n    // \"Complex\" syntax\n    if (escapes !== false && stream.match(\"${\", false) || stream.match(\"{$\", false)) {\n      state.tokenize = null;\n      return \"string\";\n    }\n\n    // Simple syntax\n    if (escapes !== false && stream.match(/^\\$[a-zA-Z_][a-zA-Z0-9_]*/)) {\n      // After the variable name there may appear array or object operator.\n      if (stream.match(\"[\", false)) {\n        // Match array operator\n        state.tokenize = matchSequence([\n          [[\"[\", null]],\n          [[/\\d[\\w\\.]*/, \"number\"],\n           [/\\$[a-zA-Z_][a-zA-Z0-9_]*/, \"variable-2\"],\n           [/[\\w\\$]+/, \"variable\"]],\n          [[\"]\", null]]\n        ], closing, escapes);\n      }\n      if (stream.match(/^->\\w/, false)) {\n        // Match object operator\n        state.tokenize = matchSequence([\n          [[\"->\", null]],\n          [[/[\\w]+/, \"variable\"]]\n        ], closing, escapes);\n      }\n      return \"variable-2\";\n    }\n\n    var escaped = false;\n    // Normal string\n    while (!stream.eol() &&\n           (escaped || escapes === false ||\n            (!stream.match(\"{$\", false) &&\n             !stream.match(/^(\\$[a-zA-Z_][a-zA-Z0-9_]*|\\$\\{)/, false)))) {\n      if (!escaped && stream.match(closing)) {\n        state.tokenize = null;\n        state.tokStack.pop(); state.tokStack.pop();\n        break;\n      }\n      escaped = stream.next() == \"\\\\\" && !escaped;\n    }\n    return \"string\";\n  }\n\n  var phpKeywords = \"abstract and array as break case catch class clone const continue declare default \" +\n    \"do else elseif enddeclare endfor endforeach endif endswitch endwhile enum extends final \" +\n    \"for foreach function global goto if implements interface instanceof namespace \" +\n    \"new or private protected public static switch throw trait try use var while xor \" +\n    \"die echo empty exit eval include include_once isset list require require_once return \" +\n    \"print unset __halt_compiler self static parent yield insteadof finally readonly match\";\n  var phpAtoms = \"true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__\";\n  var phpBuiltin = \"func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage memory_get_peak_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count\";\n  CodeMirror.registerHelper(\"hintWords\", \"php\", [phpKeywords, phpAtoms, phpBuiltin].join(\" \").split(\" \"));\n  CodeMirror.registerHelper(\"wordChars\", \"php\", /[\\w$]/);\n\n  var phpConfig = {\n    name: \"clike\",\n    helperType: \"php\",\n    keywords: keywords(phpKeywords),\n    blockKeywords: keywords(\"catch do else elseif for foreach if switch try while finally\"),\n    defKeywords: keywords(\"class enum function interface namespace trait\"),\n    atoms: keywords(phpAtoms),\n    builtin: keywords(phpBuiltin),\n    multiLineStrings: true,\n    hooks: {\n      \"$\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"variable-2\";\n      },\n      \"<\": function(stream, state) {\n        var before;\n        if (before = stream.match(/^<<\\s*/)) {\n          var quoted = stream.eat(/['\"]/);\n          stream.eatWhile(/[\\w\\.]/);\n          var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1));\n          if (quoted) stream.eat(quoted);\n          if (delim) {\n            (state.tokStack || (state.tokStack = [])).push(delim, 0);\n            state.tokenize = phpString(delim, quoted != \"'\");\n            return \"string\";\n          }\n        }\n        return false;\n      },\n      \"#\": function(stream) {\n        while (!stream.eol() && !stream.match(\"?>\", false)) stream.next();\n        return \"comment\";\n      },\n      \"/\": function(stream) {\n        if (stream.eat(\"/\")) {\n          while (!stream.eol() && !stream.match(\"?>\", false)) stream.next();\n          return \"comment\";\n        }\n        return false;\n      },\n      '\"': function(_stream, state) {\n        (state.tokStack || (state.tokStack = [])).push('\"', 0);\n        state.tokenize = phpString('\"');\n        return \"string\";\n      },\n      \"{\": function(_stream, state) {\n        if (state.tokStack && state.tokStack.length)\n          state.tokStack[state.tokStack.length - 1]++;\n        return false;\n      },\n      \"}\": function(_stream, state) {\n        if (state.tokStack && state.tokStack.length > 0 &&\n            !--state.tokStack[state.tokStack.length - 1]) {\n          state.tokenize = phpString(state.tokStack[state.tokStack.length - 2]);\n        }\n        return false;\n      }\n    }\n  };\n\n  CodeMirror.defineMode(\"php\", function(config, parserConfig) {\n    var htmlMode = CodeMirror.getMode(config, (parserConfig && parserConfig.htmlMode) || \"text/html\");\n    var phpMode = CodeMirror.getMode(config, phpConfig);\n\n    function dispatch(stream, state) {\n      var isPHP = state.curMode == phpMode;\n      if (stream.sol() && state.pending && state.pending != '\"' && state.pending != \"'\") state.pending = null;\n      if (!isPHP) {\n        if (stream.match(/^<\\?\\w*/)) {\n          state.curMode = phpMode;\n          if (!state.php) state.php = CodeMirror.startState(phpMode, htmlMode.indent(state.html, \"\", \"\"))\n          state.curState = state.php;\n          return \"meta\";\n        }\n        if (state.pending == '\"' || state.pending == \"'\") {\n          while (!stream.eol() && stream.next() != state.pending) {}\n          var style = \"string\";\n        } else if (state.pending && stream.pos < state.pending.end) {\n          stream.pos = state.pending.end;\n          var style = state.pending.style;\n        } else {\n          var style = htmlMode.token(stream, state.curState);\n        }\n        if (state.pending) state.pending = null;\n        var cur = stream.current(), openPHP = cur.search(/<\\?/), m;\n        if (openPHP != -1) {\n          if (style == \"string\" && (m = cur.match(/[\\'\\\"]$/)) && !/\\?>/.test(cur)) state.pending = m[0];\n          else state.pending = {end: stream.pos, style: style};\n          stream.backUp(cur.length - openPHP);\n        }\n        return style;\n      } else if (isPHP && state.php.tokenize == null && stream.match(\"?>\")) {\n        state.curMode = htmlMode;\n        state.curState = state.html;\n        if (!state.php.context.prev) state.php = null;\n        return \"meta\";\n      } else {\n        return phpMode.token(stream, state.curState);\n      }\n    }\n\n    return {\n      startState: function() {\n        var html = CodeMirror.startState(htmlMode)\n        var php = parserConfig.startOpen ? CodeMirror.startState(phpMode) : null\n        return {html: html,\n                php: php,\n                curMode: parserConfig.startOpen ? phpMode : htmlMode,\n                curState: parserConfig.startOpen ? php : html,\n                pending: null};\n      },\n\n      copyState: function(state) {\n        var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html),\n            php = state.php, phpNew = php && CodeMirror.copyState(phpMode, php), cur;\n        if (state.curMode == htmlMode) cur = htmlNew;\n        else cur = phpNew;\n        return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur,\n                pending: state.pending};\n      },\n\n      token: dispatch,\n\n      indent: function(state, textAfter, line) {\n        if ((state.curMode != phpMode && /^\\s*<\\//.test(textAfter)) ||\n            (state.curMode == phpMode && /^\\?>/.test(textAfter)))\n          return htmlMode.indent(state.html, textAfter, line);\n        return state.curMode.indent(state.curState, textAfter, line);\n      },\n\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      lineComment: \"//\",\n\n      innerMode: function(state) { return {state: state.curState, mode: state.curMode}; }\n    };\n  }, \"htmlmixed\", \"clike\");\n\n  CodeMirror.defineMIME(\"application/x-httpd-php\", \"php\");\n  CodeMirror.defineMIME(\"application/x-httpd-php-open\", {name: \"php\", startOpen: true});\n  CodeMirror.defineMIME(\"text/x-php\", phpConfig);\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/pig/pig.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\n *      Pig Latin Mode for CodeMirror 2\n *      @author Prasanth Jayachandran\n *      @link   https://github.com/prasanthj/pig-codemirror-2\n *  This implementation is adapted from PL/SQL mode in CodeMirror 2.\n */\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"pig\", function(_config, parserConfig) {\n  var keywords = parserConfig.keywords,\n  builtins = parserConfig.builtins,\n  types = parserConfig.types,\n  multiLineStrings = parserConfig.multiLineStrings;\n\n  var isOperatorChar = /[*+\\-%<>=&?:\\/!|]/;\n\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n\n  function tokenComment(stream, state) {\n    var isEnd = false;\n    var ch;\n    while(ch = stream.next()) {\n      if(ch == \"/\" && isEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      isEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n          end = true; break;\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = tokenBase;\n      return \"error\";\n    };\n  }\n\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n\n    // is a start of string?\n    if (ch == '\"' || ch == \"'\")\n      return chain(stream, state, tokenString(ch));\n    // is it one of the special chars\n    else if(/[\\[\\]{}\\(\\),;\\.]/.test(ch))\n      return null;\n    // is it a number?\n    else if(/\\d/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      return \"number\";\n    }\n    // multi line comment or operator\n    else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        return chain(stream, state, tokenComment);\n      }\n      else {\n        stream.eatWhile(isOperatorChar);\n        return \"operator\";\n      }\n    }\n    // single line comment or operator\n    else if (ch==\"-\") {\n      if(stream.eat(\"-\")){\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      else {\n        stream.eatWhile(isOperatorChar);\n        return \"operator\";\n      }\n    }\n    // is it an operator\n    else if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    else {\n      // get the while word\n      stream.eatWhile(/[\\w\\$_]/);\n      // is it one of the listed keywords?\n      if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) {\n        //keywords can be used as variables like flatten(group), group.$0 etc..\n        if (!stream.eat(\")\") && !stream.eat(\".\"))\n          return \"keyword\";\n      }\n      // is it one of the builtin functions?\n      if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase()))\n        return \"variable-2\";\n      // is it one of the listed types?\n      if (types && types.propertyIsEnumerable(stream.current().toUpperCase()))\n        return \"variable-3\";\n      // default is a 'variable'\n      return \"variable\";\n    }\n  }\n\n  // Interface\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n      if(stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      return style;\n    }\n  };\n});\n\n(function() {\n  function keywords(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  // builtin funcs taken from trunk revision 1303237\n  var pBuiltins = \"ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL \"\n    + \"CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS \"\n    + \"DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG \"\n    + \"FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN \"\n    + \"INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER \"\n    + \"ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS \"\n    + \"LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA  \"\n    + \"PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE \"\n    + \"SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG \"\n    + \"TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER \";\n\n  // taken from QueryLexer.g\n  var pKeywords = \"VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP \"\n    + \"JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL \"\n    + \"PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE \"\n    + \"SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE \"\n    + \"NEQ MATCHES TRUE FALSE DUMP\";\n\n  // data types\n  var pTypes = \"BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP \";\n\n  CodeMirror.defineMIME(\"text/x-pig\", {\n    name: \"pig\",\n    builtins: keywords(pBuiltins),\n    keywords: keywords(pKeywords),\n    types: keywords(pTypes)\n  });\n\n  CodeMirror.registerHelper(\"hintWords\", \"pig\", (pBuiltins + pTypes + pKeywords).split(\" \"));\n}());\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/powershell/powershell.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  'use strict';\n  if (typeof exports == 'object' && typeof module == 'object') // CommonJS\n    mod(require('../../lib/codemirror'));\n  else if (typeof define == 'function' && define.amd) // AMD\n    define(['../../lib/codemirror'], mod);\n  else // Plain browser env\n    mod(window.CodeMirror);\n})(function(CodeMirror) {\n'use strict';\n\nCodeMirror.defineMode('powershell', function() {\n  function buildRegexp(patterns, options) {\n    options = options || {};\n    var prefix = options.prefix !== undefined ? options.prefix : '^';\n    var suffix = options.suffix !== undefined ? options.suffix : '\\\\b';\n\n    for (var i = 0; i < patterns.length; i++) {\n      if (patterns[i] instanceof RegExp) {\n        patterns[i] = patterns[i].source;\n      }\n      else {\n        patterns[i] = patterns[i].replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n      }\n    }\n\n    return new RegExp(prefix + '(' + patterns.join('|') + ')' + suffix, 'i');\n  }\n\n  var notCharacterOrDash = '(?=[^A-Za-z\\\\d\\\\-_]|$)';\n  var varNames = /[\\w\\-:]/\n  var keywords = buildRegexp([\n    /begin|break|catch|continue|data|default|do|dynamicparam/,\n    /else|elseif|end|exit|filter|finally|for|foreach|from|function|if|in/,\n    /param|process|return|switch|throw|trap|try|until|where|while/\n  ], { suffix: notCharacterOrDash });\n\n  var punctuation = /[\\[\\]{},;`\\\\\\.]|@[({]/;\n  var wordOperators = buildRegexp([\n    'f',\n    /b?not/,\n    /[ic]?split/, 'join',\n    /is(not)?/, 'as',\n    /[ic]?(eq|ne|[gl][te])/,\n    /[ic]?(not)?(like|match|contains)/,\n    /[ic]?replace/,\n    /b?(and|or|xor)/\n  ], { prefix: '-' });\n  var symbolOperators = /[+\\-*\\/%]=|\\+\\+|--|\\.\\.|[+\\-*&^%:=!|\\/]|<(?!#)|(?!#)>/;\n  var operators = buildRegexp([wordOperators, symbolOperators], { suffix: '' });\n\n  var numbers = /^((0x[\\da-f]+)|((\\d+\\.\\d+|\\d\\.|\\.\\d+|\\d+)(e[\\+\\-]?\\d+)?))[ld]?([kmgtp]b)?/i;\n\n  var identifiers = /^[A-Za-z\\_][A-Za-z\\-\\_\\d]*\\b/;\n\n  var symbolBuiltins = /[A-Z]:|%|\\?/i;\n  var namedBuiltins = buildRegexp([\n    /Add-(Computer|Content|History|Member|PSSnapin|Type)/,\n    /Checkpoint-Computer/,\n    /Clear-(Content|EventLog|History|Host|Item(Property)?|Variable)/,\n    /Compare-Object/,\n    /Complete-Transaction/,\n    /Connect-PSSession/,\n    /ConvertFrom-(Csv|Json|SecureString|StringData)/,\n    /Convert-Path/,\n    /ConvertTo-(Csv|Html|Json|SecureString|Xml)/,\n    /Copy-Item(Property)?/,\n    /Debug-Process/,\n    /Disable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/,\n    /Disconnect-PSSession/,\n    /Enable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/,\n    /(Enter|Exit)-PSSession/,\n    /Export-(Alias|Clixml|Console|Counter|Csv|FormatData|ModuleMember|PSSession)/,\n    /ForEach-Object/,\n    /Format-(Custom|List|Table|Wide)/,\n    new RegExp('Get-(Acl|Alias|AuthenticodeSignature|ChildItem|Command|ComputerRestorePoint|Content|ControlPanelItem|Counter|Credential'\n      + '|Culture|Date|Event|EventLog|EventSubscriber|ExecutionPolicy|FormatData|Help|History|Host|HotFix|Item|ItemProperty|Job'\n      + '|Location|Member|Module|PfxCertificate|Process|PSBreakpoint|PSCallStack|PSDrive|PSProvider|PSSession|PSSessionConfiguration'\n      + '|PSSnapin|Random|Service|TraceSource|Transaction|TypeData|UICulture|Unique|Variable|Verb|WinEvent|WmiObject)'),\n    /Group-Object/,\n    /Import-(Alias|Clixml|Counter|Csv|LocalizedData|Module|PSSession)/,\n    /ImportSystemModules/,\n    /Invoke-(Command|Expression|History|Item|RestMethod|WebRequest|WmiMethod)/,\n    /Join-Path/,\n    /Limit-EventLog/,\n    /Measure-(Command|Object)/,\n    /Move-Item(Property)?/,\n    new RegExp('New-(Alias|Event|EventLog|Item(Property)?|Module|ModuleManifest|Object|PSDrive|PSSession|PSSessionConfigurationFile'\n      + '|PSSessionOption|PSTransportOption|Service|TimeSpan|Variable|WebServiceProxy|WinEvent)'),\n    /Out-(Default|File|GridView|Host|Null|Printer|String)/,\n    /Pause/,\n    /(Pop|Push)-Location/,\n    /Read-Host/,\n    /Receive-(Job|PSSession)/,\n    /Register-(EngineEvent|ObjectEvent|PSSessionConfiguration|WmiEvent)/,\n    /Remove-(Computer|Event|EventLog|Item(Property)?|Job|Module|PSBreakpoint|PSDrive|PSSession|PSSnapin|TypeData|Variable|WmiObject)/,\n    /Rename-(Computer|Item(Property)?)/,\n    /Reset-ComputerMachinePassword/,\n    /Resolve-Path/,\n    /Restart-(Computer|Service)/,\n    /Restore-Computer/,\n    /Resume-(Job|Service)/,\n    /Save-Help/,\n    /Select-(Object|String|Xml)/,\n    /Send-MailMessage/,\n    new RegExp('Set-(Acl|Alias|AuthenticodeSignature|Content|Date|ExecutionPolicy|Item(Property)?|Location|PSBreakpoint|PSDebug' +\n               '|PSSessionConfiguration|Service|StrictMode|TraceSource|Variable|WmiInstance)'),\n    /Show-(Command|ControlPanelItem|EventLog)/,\n    /Sort-Object/,\n    /Split-Path/,\n    /Start-(Job|Process|Service|Sleep|Transaction|Transcript)/,\n    /Stop-(Computer|Job|Process|Service|Transcript)/,\n    /Suspend-(Job|Service)/,\n    /TabExpansion2/,\n    /Tee-Object/,\n    /Test-(ComputerSecureChannel|Connection|ModuleManifest|Path|PSSessionConfigurationFile)/,\n    /Trace-Command/,\n    /Unblock-File/,\n    /Undo-Transaction/,\n    /Unregister-(Event|PSSessionConfiguration)/,\n    /Update-(FormatData|Help|List|TypeData)/,\n    /Use-Transaction/,\n    /Wait-(Event|Job|Process)/,\n    /Where-Object/,\n    /Write-(Debug|Error|EventLog|Host|Output|Progress|Verbose|Warning)/,\n    /cd|help|mkdir|more|oss|prompt/,\n    /ac|asnp|cat|cd|chdir|clc|clear|clhy|cli|clp|cls|clv|cnsn|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|dnsn|ebp/,\n    /echo|epal|epcsv|epsn|erase|etsn|exsn|fc|fl|foreach|ft|fw|gal|gbp|gc|gci|gcm|gcs|gdr|ghy|gi|gjb|gl|gm|gmo|gp|gps/,\n    /group|gsn|gsnp|gsv|gu|gv|gwmi|h|history|icm|iex|ihy|ii|ipal|ipcsv|ipmo|ipsn|irm|ise|iwmi|iwr|kill|lp|ls|man|md/,\n    /measure|mi|mount|move|mp|mv|nal|ndr|ni|nmo|npssc|nsn|nv|ogv|oh|popd|ps|pushd|pwd|r|rbp|rcjb|rcsn|rd|rdr|ren|ri/,\n    /rjb|rm|rmdir|rmo|rni|rnp|rp|rsn|rsnp|rujb|rv|rvpa|rwmi|sajb|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls/,\n    /sort|sp|spjb|spps|spsv|start|sujb|sv|swmi|tee|trcm|type|where|wjb|write/\n  ], { prefix: '', suffix: '' });\n  var variableBuiltins = buildRegexp([\n    /[$?^_]|Args|ConfirmPreference|ConsoleFileName|DebugPreference|Error|ErrorActionPreference|ErrorView|ExecutionContext/,\n    /FormatEnumerationLimit|Home|Host|Input|MaximumAliasCount|MaximumDriveCount|MaximumErrorCount|MaximumFunctionCount/,\n    /MaximumHistoryCount|MaximumVariableCount|MyInvocation|NestedPromptLevel|OutputEncoding|Pid|Profile|ProgressPreference/,\n    /PSBoundParameters|PSCommandPath|PSCulture|PSDefaultParameterValues|PSEmailServer|PSHome|PSScriptRoot|PSSessionApplicationName/,\n    /PSSessionConfigurationName|PSSessionOption|PSUICulture|PSVersionTable|Pwd|ShellId|StackTrace|VerbosePreference/,\n    /WarningPreference|WhatIfPreference/,\n\n    /Event|EventArgs|EventSubscriber|Sender/,\n    /Matches|Ofs|ForEach|LastExitCode|PSCmdlet|PSItem|PSSenderInfo|This/,\n    /true|false|null/\n  ], { prefix: '\\\\$', suffix: '' });\n\n  var builtins = buildRegexp([symbolBuiltins, namedBuiltins, variableBuiltins], { suffix: notCharacterOrDash });\n\n  var grammar = {\n    keyword: keywords,\n    number: numbers,\n    operator: operators,\n    builtin: builtins,\n    punctuation: punctuation,\n    identifier: identifiers\n  };\n\n  // tokenizers\n  function tokenBase(stream, state) {\n    // Handle Comments\n    //var ch = stream.peek();\n\n    var parent = state.returnStack[state.returnStack.length - 1];\n    if (parent && parent.shouldReturnFrom(state)) {\n      state.tokenize = parent.tokenize;\n      state.returnStack.pop();\n      return state.tokenize(stream, state);\n    }\n\n    if (stream.eatSpace()) {\n      return null;\n    }\n\n    if (stream.eat('(')) {\n      state.bracketNesting += 1;\n      return 'punctuation';\n    }\n\n    if (stream.eat(')')) {\n      state.bracketNesting -= 1;\n      return 'punctuation';\n    }\n\n    for (var key in grammar) {\n      if (stream.match(grammar[key])) {\n        return key;\n      }\n    }\n\n    var ch = stream.next();\n\n    // single-quote string\n    if (ch === \"'\") {\n      return tokenSingleQuoteString(stream, state);\n    }\n\n    if (ch === '$') {\n      return tokenVariable(stream, state);\n    }\n\n    // double-quote string\n    if (ch === '\"') {\n      return tokenDoubleQuoteString(stream, state);\n    }\n\n    if (ch === '<' && stream.eat('#')) {\n      state.tokenize = tokenComment;\n      return tokenComment(stream, state);\n    }\n\n    if (ch === '#') {\n      stream.skipToEnd();\n      return 'comment';\n    }\n\n    if (ch === '@') {\n      var quoteMatch = stream.eat(/[\"']/);\n      if (quoteMatch && stream.eol()) {\n        state.tokenize = tokenMultiString;\n        state.startQuote = quoteMatch[0];\n        return tokenMultiString(stream, state);\n      } else if (stream.eol()) {\n        return 'error';\n      } else if (stream.peek().match(/[({]/)) {\n        return 'punctuation';\n      } else if (stream.peek().match(varNames)) {\n        // splatted variable\n        return tokenVariable(stream, state);\n      }\n    }\n    return 'error';\n  }\n\n  function tokenSingleQuoteString(stream, state) {\n    var ch;\n    while ((ch = stream.peek()) != null) {\n      stream.next();\n\n      if (ch === \"'\" && !stream.eat(\"'\")) {\n        state.tokenize = tokenBase;\n        return 'string';\n      }\n    }\n\n    return 'error';\n  }\n\n  function tokenDoubleQuoteString(stream, state) {\n    var ch;\n    while ((ch = stream.peek()) != null) {\n      if (ch === '$') {\n        state.tokenize = tokenStringInterpolation;\n        return 'string';\n      }\n\n      stream.next();\n      if (ch === '`') {\n        stream.next();\n        continue;\n      }\n\n      if (ch === '\"' && !stream.eat('\"')) {\n        state.tokenize = tokenBase;\n        return 'string';\n      }\n    }\n\n    return 'error';\n  }\n\n  function tokenStringInterpolation(stream, state) {\n    return tokenInterpolation(stream, state, tokenDoubleQuoteString);\n  }\n\n  function tokenMultiStringReturn(stream, state) {\n    state.tokenize = tokenMultiString;\n    state.startQuote = '\"'\n    return tokenMultiString(stream, state);\n  }\n\n  function tokenHereStringInterpolation(stream, state) {\n    return tokenInterpolation(stream, state, tokenMultiStringReturn);\n  }\n\n  function tokenInterpolation(stream, state, parentTokenize) {\n    if (stream.match('$(')) {\n      var savedBracketNesting = state.bracketNesting;\n      state.returnStack.push({\n        /*jshint loopfunc:true */\n        shouldReturnFrom: function(state) {\n          return state.bracketNesting === savedBracketNesting;\n        },\n        tokenize: parentTokenize\n      });\n      state.tokenize = tokenBase;\n      state.bracketNesting += 1;\n      return 'punctuation';\n    } else {\n      stream.next();\n      state.returnStack.push({\n        shouldReturnFrom: function() { return true; },\n        tokenize: parentTokenize\n      });\n      state.tokenize = tokenVariable;\n      return state.tokenize(stream, state);\n    }\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while ((ch = stream.next()) != null) {\n      if (maybeEnd && ch == '>') {\n          state.tokenize = tokenBase;\n          break;\n      }\n      maybeEnd = (ch === '#');\n    }\n    return 'comment';\n  }\n\n  function tokenVariable(stream, state) {\n    var ch = stream.peek();\n    if (stream.eat('{')) {\n      state.tokenize = tokenVariableWithBraces;\n      return tokenVariableWithBraces(stream, state);\n    } else if (ch != undefined && ch.match(varNames)) {\n      stream.eatWhile(varNames);\n      state.tokenize = tokenBase;\n      return 'variable-2';\n    } else {\n      state.tokenize = tokenBase;\n      return 'error';\n    }\n  }\n\n  function tokenVariableWithBraces(stream, state) {\n    var ch;\n    while ((ch = stream.next()) != null) {\n      if (ch === '}') {\n        state.tokenize = tokenBase;\n        break;\n      }\n    }\n    return 'variable-2';\n  }\n\n  function tokenMultiString(stream, state) {\n    var quote = state.startQuote;\n    if (stream.sol() && stream.match(new RegExp(quote + '@'))) {\n      state.tokenize = tokenBase;\n    }\n    else if (quote === '\"') {\n      while (!stream.eol()) {\n        var ch = stream.peek();\n        if (ch === '$') {\n          state.tokenize = tokenHereStringInterpolation;\n          return 'string';\n        }\n\n        stream.next();\n        if (ch === '`') {\n          stream.next();\n        }\n      }\n    }\n    else {\n      stream.skipToEnd();\n    }\n\n    return 'string';\n  }\n\n  var external = {\n    startState: function() {\n      return {\n        returnStack: [],\n        bracketNesting: 0,\n        tokenize: tokenBase\n      };\n    },\n\n    token: function(stream, state) {\n      return state.tokenize(stream, state);\n    },\n\n    blockCommentStart: '<#',\n    blockCommentEnd: '#>',\n    lineComment: '#',\n    fold: 'brace'\n  };\n  return external;\n});\n\nCodeMirror.defineMIME('application/x-powershell', 'powershell');\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/properties/properties.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"properties\", function() {\n  return {\n    token: function(stream, state) {\n      var sol = stream.sol() || state.afterSection;\n      var eol = stream.eol();\n\n      state.afterSection = false;\n\n      if (sol) {\n        if (state.nextMultiline) {\n          state.inMultiline = true;\n          state.nextMultiline = false;\n        } else {\n          state.position = \"def\";\n        }\n      }\n\n      if (eol && ! state.nextMultiline) {\n        state.inMultiline = false;\n        state.position = \"def\";\n      }\n\n      if (sol) {\n        while(stream.eatSpace()) {}\n      }\n\n      var ch = stream.next();\n\n      if (sol && (ch === \"#\" || ch === \"!\" || ch === \";\")) {\n        state.position = \"comment\";\n        stream.skipToEnd();\n        return \"comment\";\n      } else if (sol && ch === \"[\") {\n        state.afterSection = true;\n        stream.skipTo(\"]\"); stream.eat(\"]\");\n        return \"header\";\n      } else if (ch === \"=\" || ch === \":\") {\n        state.position = \"quote\";\n        return null;\n      } else if (ch === \"\\\\\" && state.position === \"quote\") {\n        if (stream.eol()) {  // end of line?\n          // Multiline value\n          state.nextMultiline = true;\n        }\n      }\n\n      return state.position;\n    },\n\n    startState: function() {\n      return {\n        position : \"def\",       // Current position, \"def\", \"quote\" or \"comment\"\n        nextMultiline : false,  // Is the next line multiline value\n        inMultiline : false,    // Is the current line a multiline value\n        afterSection : false    // Did we just open a section\n      };\n    }\n\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-properties\", \"properties\");\nCodeMirror.defineMIME(\"text/x-ini\", \"properties\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/protobuf/protobuf.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\", \"i\");\n  };\n\n  var keywordArray = [\n    \"package\", \"message\", \"import\", \"syntax\",\n    \"required\", \"optional\", \"repeated\", \"reserved\", \"default\", \"extensions\", \"packed\",\n    \"bool\", \"bytes\", \"double\", \"enum\", \"float\", \"string\",\n    \"int32\", \"int64\", \"uint32\", \"uint64\", \"sint32\", \"sint64\", \"fixed32\", \"fixed64\", \"sfixed32\", \"sfixed64\",\n    \"option\", \"service\", \"rpc\", \"returns\"\n  ];\n  var keywords = wordRegexp(keywordArray);\n\n  CodeMirror.registerHelper(\"hintWords\", \"protobuf\", keywordArray);\n\n  var identifiers = new RegExp(\"^[_A-Za-z\\xa1-\\uffff][_A-Za-z0-9\\xa1-\\uffff]*\");\n\n  function tokenBase(stream) {\n    // whitespaces\n    if (stream.eatSpace()) return null;\n\n    // Handle one line Comments\n    if (stream.match(\"//\")) {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n\n    // Handle Number Literals\n    if (stream.match(/^[0-9\\.+-]/, false)) {\n      if (stream.match(/^[+-]?0x[0-9a-fA-F]+/))\n        return \"number\";\n      if (stream.match(/^[+-]?\\d*\\.\\d+([EeDd][+-]?\\d+)?/))\n        return \"number\";\n      if (stream.match(/^[+-]?\\d+([EeDd][+-]?\\d+)?/))\n        return \"number\";\n    }\n\n    // Handle Strings\n    if (stream.match(/^\"([^\"]|(\"\"))*\"/)) { return \"string\"; }\n    if (stream.match(/^'([^']|(''))*'/)) { return \"string\"; }\n\n    // Handle words\n    if (stream.match(keywords)) { return \"keyword\"; }\n    if (stream.match(identifiers)) { return \"variable\"; } ;\n\n    // Handle non-detected items\n    stream.next();\n    return null;\n  };\n\n  CodeMirror.defineMode(\"protobuf\", function() {\n    return {\n      token: tokenBase,\n      fold: \"brace\"\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-protobuf\", \"protobuf\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/pug/pug.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../javascript/javascript\"), require(\"../css/css\"), require(\"../htmlmixed/htmlmixed\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../javascript/javascript\", \"../css/css\", \"../htmlmixed/htmlmixed\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"pug\", function (config) {\n  // token types\n  var KEYWORD = 'keyword';\n  var DOCTYPE = 'meta';\n  var ID = 'builtin';\n  var CLASS = 'qualifier';\n\n  var ATTRS_NEST = {\n    '{': '}',\n    '(': ')',\n    '[': ']'\n  };\n\n  var jsMode = CodeMirror.getMode(config, 'javascript');\n\n  function State() {\n    this.javaScriptLine = false;\n    this.javaScriptLineExcludesColon = false;\n\n    this.javaScriptArguments = false;\n    this.javaScriptArgumentsDepth = 0;\n\n    this.isInterpolating = false;\n    this.interpolationNesting = 0;\n\n    this.jsState = CodeMirror.startState(jsMode);\n\n    this.restOfLine = '';\n\n    this.isIncludeFiltered = false;\n    this.isEach = false;\n\n    this.lastTag = '';\n    this.scriptType = '';\n\n    // Attributes Mode\n    this.isAttrs = false;\n    this.attrsNest = [];\n    this.inAttributeName = true;\n    this.attributeIsType = false;\n    this.attrValue = '';\n\n    // Indented Mode\n    this.indentOf = Infinity;\n    this.indentToken = '';\n\n    this.innerMode = null;\n    this.innerState = null;\n\n    this.innerModeForLine = false;\n  }\n  /**\n   * Safely copy a state\n   *\n   * @return {State}\n   */\n  State.prototype.copy = function () {\n    var res = new State();\n    res.javaScriptLine = this.javaScriptLine;\n    res.javaScriptLineExcludesColon = this.javaScriptLineExcludesColon;\n    res.javaScriptArguments = this.javaScriptArguments;\n    res.javaScriptArgumentsDepth = this.javaScriptArgumentsDepth;\n    res.isInterpolating = this.isInterpolating;\n    res.interpolationNesting = this.interpolationNesting;\n\n    res.jsState = CodeMirror.copyState(jsMode, this.jsState);\n\n    res.innerMode = this.innerMode;\n    if (this.innerMode && this.innerState) {\n      res.innerState = CodeMirror.copyState(this.innerMode, this.innerState);\n    }\n\n    res.restOfLine = this.restOfLine;\n\n    res.isIncludeFiltered = this.isIncludeFiltered;\n    res.isEach = this.isEach;\n    res.lastTag = this.lastTag;\n    res.scriptType = this.scriptType;\n    res.isAttrs = this.isAttrs;\n    res.attrsNest = this.attrsNest.slice();\n    res.inAttributeName = this.inAttributeName;\n    res.attributeIsType = this.attributeIsType;\n    res.attrValue = this.attrValue;\n    res.indentOf = this.indentOf;\n    res.indentToken = this.indentToken;\n\n    res.innerModeForLine = this.innerModeForLine;\n\n    return res;\n  };\n\n  function javaScript(stream, state) {\n    if (stream.sol()) {\n      // if javaScriptLine was set at end of line, ignore it\n      state.javaScriptLine = false;\n      state.javaScriptLineExcludesColon = false;\n    }\n    if (state.javaScriptLine) {\n      if (state.javaScriptLineExcludesColon && stream.peek() === ':') {\n        state.javaScriptLine = false;\n        state.javaScriptLineExcludesColon = false;\n        return;\n      }\n      var tok = jsMode.token(stream, state.jsState);\n      if (stream.eol()) state.javaScriptLine = false;\n      return tok || true;\n    }\n  }\n  function javaScriptArguments(stream, state) {\n    if (state.javaScriptArguments) {\n      if (state.javaScriptArgumentsDepth === 0 && stream.peek() !== '(') {\n        state.javaScriptArguments = false;\n        return;\n      }\n      if (stream.peek() === '(') {\n        state.javaScriptArgumentsDepth++;\n      } else if (stream.peek() === ')') {\n        state.javaScriptArgumentsDepth--;\n      }\n      if (state.javaScriptArgumentsDepth === 0) {\n        state.javaScriptArguments = false;\n        return;\n      }\n\n      var tok = jsMode.token(stream, state.jsState);\n      return tok || true;\n    }\n  }\n\n  function yieldStatement(stream) {\n    if (stream.match(/^yield\\b/)) {\n        return 'keyword';\n    }\n  }\n\n  function doctype(stream) {\n    if (stream.match(/^(?:doctype) *([^\\n]+)?/)) {\n        return DOCTYPE;\n    }\n  }\n\n  function interpolation(stream, state) {\n    if (stream.match('#{')) {\n      state.isInterpolating = true;\n      state.interpolationNesting = 0;\n      return 'punctuation';\n    }\n  }\n\n  function interpolationContinued(stream, state) {\n    if (state.isInterpolating) {\n      if (stream.peek() === '}') {\n        state.interpolationNesting--;\n        if (state.interpolationNesting < 0) {\n          stream.next();\n          state.isInterpolating = false;\n          return 'punctuation';\n        }\n      } else if (stream.peek() === '{') {\n        state.interpolationNesting++;\n      }\n      return jsMode.token(stream, state.jsState) || true;\n    }\n  }\n\n  function caseStatement(stream, state) {\n    if (stream.match(/^case\\b/)) {\n      state.javaScriptLine = true;\n      return KEYWORD;\n    }\n  }\n\n  function when(stream, state) {\n    if (stream.match(/^when\\b/)) {\n      state.javaScriptLine = true;\n      state.javaScriptLineExcludesColon = true;\n      return KEYWORD;\n    }\n  }\n\n  function defaultStatement(stream) {\n    if (stream.match(/^default\\b/)) {\n      return KEYWORD;\n    }\n  }\n\n  function extendsStatement(stream, state) {\n    if (stream.match(/^extends?\\b/)) {\n      state.restOfLine = 'string';\n      return KEYWORD;\n    }\n  }\n\n  function append(stream, state) {\n    if (stream.match(/^append\\b/)) {\n      state.restOfLine = 'variable';\n      return KEYWORD;\n    }\n  }\n  function prepend(stream, state) {\n    if (stream.match(/^prepend\\b/)) {\n      state.restOfLine = 'variable';\n      return KEYWORD;\n    }\n  }\n  function block(stream, state) {\n    if (stream.match(/^block\\b *(?:(prepend|append)\\b)?/)) {\n      state.restOfLine = 'variable';\n      return KEYWORD;\n    }\n  }\n\n  function include(stream, state) {\n    if (stream.match(/^include\\b/)) {\n      state.restOfLine = 'string';\n      return KEYWORD;\n    }\n  }\n\n  function includeFiltered(stream, state) {\n    if (stream.match(/^include:([a-zA-Z0-9\\-]+)/, false) && stream.match('include')) {\n      state.isIncludeFiltered = true;\n      return KEYWORD;\n    }\n  }\n\n  function includeFilteredContinued(stream, state) {\n    if (state.isIncludeFiltered) {\n      var tok = filter(stream, state);\n      state.isIncludeFiltered = false;\n      state.restOfLine = 'string';\n      return tok;\n    }\n  }\n\n  function mixin(stream, state) {\n    if (stream.match(/^mixin\\b/)) {\n      state.javaScriptLine = true;\n      return KEYWORD;\n    }\n  }\n\n  function call(stream, state) {\n    if (stream.match(/^\\+([-\\w]+)/)) {\n      if (!stream.match(/^\\( *[-\\w]+ *=/, false)) {\n        state.javaScriptArguments = true;\n        state.javaScriptArgumentsDepth = 0;\n      }\n      return 'variable';\n    }\n    if (stream.match('+#{', false)) {\n      stream.next();\n      state.mixinCallAfter = true;\n      return interpolation(stream, state);\n    }\n  }\n  function callArguments(stream, state) {\n    if (state.mixinCallAfter) {\n      state.mixinCallAfter = false;\n      if (!stream.match(/^\\( *[-\\w]+ *=/, false)) {\n        state.javaScriptArguments = true;\n        state.javaScriptArgumentsDepth = 0;\n      }\n      return true;\n    }\n  }\n\n  function conditional(stream, state) {\n    if (stream.match(/^(if|unless|else if|else)\\b/)) {\n      state.javaScriptLine = true;\n      return KEYWORD;\n    }\n  }\n\n  function each(stream, state) {\n    if (stream.match(/^(- *)?(each|for)\\b/)) {\n      state.isEach = true;\n      return KEYWORD;\n    }\n  }\n  function eachContinued(stream, state) {\n    if (state.isEach) {\n      if (stream.match(/^ in\\b/)) {\n        state.javaScriptLine = true;\n        state.isEach = false;\n        return KEYWORD;\n      } else if (stream.sol() || stream.eol()) {\n        state.isEach = false;\n      } else if (stream.next()) {\n        while (!stream.match(/^ in\\b/, false) && stream.next());\n        return 'variable';\n      }\n    }\n  }\n\n  function whileStatement(stream, state) {\n    if (stream.match(/^while\\b/)) {\n      state.javaScriptLine = true;\n      return KEYWORD;\n    }\n  }\n\n  function tag(stream, state) {\n    var captures;\n    if (captures = stream.match(/^(\\w(?:[-:\\w]*\\w)?)\\/?/)) {\n      state.lastTag = captures[1].toLowerCase();\n      if (state.lastTag === 'script') {\n        state.scriptType = 'application/javascript';\n      }\n      return 'tag';\n    }\n  }\n\n  function filter(stream, state) {\n    if (stream.match(/^:([\\w\\-]+)/)) {\n      var innerMode;\n      if (config && config.innerModes) {\n        innerMode = config.innerModes(stream.current().substring(1));\n      }\n      if (!innerMode) {\n        innerMode = stream.current().substring(1);\n      }\n      if (typeof innerMode === 'string') {\n        innerMode = CodeMirror.getMode(config, innerMode);\n      }\n      setInnerMode(stream, state, innerMode);\n      return 'atom';\n    }\n  }\n\n  function code(stream, state) {\n    if (stream.match(/^(!?=|-)/)) {\n      state.javaScriptLine = true;\n      return 'punctuation';\n    }\n  }\n\n  function id(stream) {\n    if (stream.match(/^#([\\w-]+)/)) {\n      return ID;\n    }\n  }\n\n  function className(stream) {\n    if (stream.match(/^\\.([\\w-]+)/)) {\n      return CLASS;\n    }\n  }\n\n  function attrs(stream, state) {\n    if (stream.peek() == '(') {\n      stream.next();\n      state.isAttrs = true;\n      state.attrsNest = [];\n      state.inAttributeName = true;\n      state.attrValue = '';\n      state.attributeIsType = false;\n      return 'punctuation';\n    }\n  }\n\n  function attrsContinued(stream, state) {\n    if (state.isAttrs) {\n      if (ATTRS_NEST[stream.peek()]) {\n        state.attrsNest.push(ATTRS_NEST[stream.peek()]);\n      }\n      if (state.attrsNest[state.attrsNest.length - 1] === stream.peek()) {\n        state.attrsNest.pop();\n      } else  if (stream.eat(')')) {\n        state.isAttrs = false;\n        return 'punctuation';\n      }\n      if (state.inAttributeName && stream.match(/^[^=,\\)!]+/)) {\n        if (stream.peek() === '=' || stream.peek() === '!') {\n          state.inAttributeName = false;\n          state.jsState = CodeMirror.startState(jsMode);\n          if (state.lastTag === 'script' && stream.current().trim().toLowerCase() === 'type') {\n            state.attributeIsType = true;\n          } else {\n            state.attributeIsType = false;\n          }\n        }\n        return 'attribute';\n      }\n\n      var tok = jsMode.token(stream, state.jsState);\n      if (state.attributeIsType && tok === 'string') {\n        state.scriptType = stream.current().toString();\n      }\n      if (state.attrsNest.length === 0 && (tok === 'string' || tok === 'variable' || tok === 'keyword')) {\n        try {\n          Function('', 'var x ' + state.attrValue.replace(/,\\s*$/, '').replace(/^!/, ''));\n          state.inAttributeName = true;\n          state.attrValue = '';\n          stream.backUp(stream.current().length);\n          return attrsContinued(stream, state);\n        } catch (ex) {\n          //not the end of an attribute\n        }\n      }\n      state.attrValue += stream.current();\n      return tok || true;\n    }\n  }\n\n  function attributesBlock(stream, state) {\n    if (stream.match(/^&attributes\\b/)) {\n      state.javaScriptArguments = true;\n      state.javaScriptArgumentsDepth = 0;\n      return 'keyword';\n    }\n  }\n\n  function indent(stream) {\n    if (stream.sol() && stream.eatSpace()) {\n      return 'indent';\n    }\n  }\n\n  function comment(stream, state) {\n    if (stream.match(/^ *\\/\\/(-)?([^\\n]*)/)) {\n      state.indentOf = stream.indentation();\n      state.indentToken = 'comment';\n      return 'comment';\n    }\n  }\n\n  function colon(stream) {\n    if (stream.match(/^: */)) {\n      return 'colon';\n    }\n  }\n\n  function text(stream, state) {\n    if (stream.match(/^(?:\\| ?| )([^\\n]+)/)) {\n      return 'string';\n    }\n    if (stream.match(/^(<[^\\n]*)/, false)) {\n      // html string\n      setInnerMode(stream, state, 'htmlmixed');\n      state.innerModeForLine = true;\n      return innerMode(stream, state, true);\n    }\n  }\n\n  function dot(stream, state) {\n    if (stream.eat('.')) {\n      var innerMode = null;\n      if (state.lastTag === 'script' && state.scriptType.toLowerCase().indexOf('javascript') != -1) {\n        innerMode = state.scriptType.toLowerCase().replace(/\"|'/g, '');\n      } else if (state.lastTag === 'style') {\n        innerMode = 'css';\n      }\n      setInnerMode(stream, state, innerMode);\n      return 'dot';\n    }\n  }\n\n  function fail(stream) {\n    stream.next();\n    return null;\n  }\n\n\n  function setInnerMode(stream, state, mode) {\n    mode = CodeMirror.mimeModes[mode] || mode;\n    mode = config.innerModes ? config.innerModes(mode) || mode : mode;\n    mode = CodeMirror.mimeModes[mode] || mode;\n    mode = CodeMirror.getMode(config, mode);\n    state.indentOf = stream.indentation();\n\n    if (mode && mode.name !== 'null') {\n      state.innerMode = mode;\n    } else {\n      state.indentToken = 'string';\n    }\n  }\n  function innerMode(stream, state, force) {\n    if (stream.indentation() > state.indentOf || (state.innerModeForLine && !stream.sol()) || force) {\n      if (state.innerMode) {\n        if (!state.innerState) {\n          state.innerState = state.innerMode.startState ? CodeMirror.startState(state.innerMode, stream.indentation()) : {};\n        }\n        return stream.hideFirstChars(state.indentOf + 2, function () {\n          return state.innerMode.token(stream, state.innerState) || true;\n        });\n      } else {\n        stream.skipToEnd();\n        return state.indentToken;\n      }\n    } else if (stream.sol()) {\n      state.indentOf = Infinity;\n      state.indentToken = null;\n      state.innerMode = null;\n      state.innerState = null;\n    }\n  }\n  function restOfLine(stream, state) {\n    if (stream.sol()) {\n      // if restOfLine was set at end of line, ignore it\n      state.restOfLine = '';\n    }\n    if (state.restOfLine) {\n      stream.skipToEnd();\n      var tok = state.restOfLine;\n      state.restOfLine = '';\n      return tok;\n    }\n  }\n\n\n  function startState() {\n    return new State();\n  }\n  function copyState(state) {\n    return state.copy();\n  }\n  /**\n   * Get the next token in the stream\n   *\n   * @param {Stream} stream\n   * @param {State} state\n   */\n  function nextToken(stream, state) {\n    var tok = innerMode(stream, state)\n      || restOfLine(stream, state)\n      || interpolationContinued(stream, state)\n      || includeFilteredContinued(stream, state)\n      || eachContinued(stream, state)\n      || attrsContinued(stream, state)\n      || javaScript(stream, state)\n      || javaScriptArguments(stream, state)\n      || callArguments(stream, state)\n\n      || yieldStatement(stream)\n      || doctype(stream)\n      || interpolation(stream, state)\n      || caseStatement(stream, state)\n      || when(stream, state)\n      || defaultStatement(stream)\n      || extendsStatement(stream, state)\n      || append(stream, state)\n      || prepend(stream, state)\n      || block(stream, state)\n      || include(stream, state)\n      || includeFiltered(stream, state)\n      || mixin(stream, state)\n      || call(stream, state)\n      || conditional(stream, state)\n      || each(stream, state)\n      || whileStatement(stream, state)\n      || tag(stream, state)\n      || filter(stream, state)\n      || code(stream, state)\n      || id(stream)\n      || className(stream)\n      || attrs(stream, state)\n      || attributesBlock(stream, state)\n      || indent(stream)\n      || text(stream, state)\n      || comment(stream, state)\n      || colon(stream)\n      || dot(stream, state)\n      || fail(stream);\n\n    return tok === true ? null : tok;\n  }\n  return {\n    startState: startState,\n    copyState: copyState,\n    token: nextToken\n  };\n}, 'javascript', 'css', 'htmlmixed');\n\nCodeMirror.defineMIME('text/x-pug', 'pug');\nCodeMirror.defineMIME('text/x-jade', 'pug');\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/puppet/puppet.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"puppet\", function () {\n  // Stores the words from the define method\n  var words = {};\n  // Taken, mostly, from the Puppet official variable standards regex\n  var variable_regex = /({)?([a-z][a-z0-9_]*)?((::[a-z][a-z0-9_]*)*::)?[a-zA-Z0-9_]+(})?/;\n\n  // Takes a string of words separated by spaces and adds them as\n  // keys with the value of the first argument 'style'\n  function define(style, string) {\n    var split = string.split(' ');\n    for (var i = 0; i < split.length; i++) {\n      words[split[i]] = style;\n    }\n  }\n\n  // Takes commonly known puppet types/words and classifies them to a style\n  define('keyword', 'class define site node include import inherits');\n  define('keyword', 'case if else in and elsif default or');\n  define('atom', 'false true running present absent file directory undef');\n  define('builtin', 'action augeas burst chain computer cron destination dport exec ' +\n    'file filebucket group host icmp iniface interface jump k5login limit log_level ' +\n    'log_prefix macauthorization mailalias maillist mcx mount nagios_command ' +\n    'nagios_contact nagios_contactgroup nagios_host nagios_hostdependency ' +\n    'nagios_hostescalation nagios_hostextinfo nagios_hostgroup nagios_service ' +\n    'nagios_servicedependency nagios_serviceescalation nagios_serviceextinfo ' +\n    'nagios_servicegroup nagios_timeperiod name notify outiface package proto reject ' +\n    'resources router schedule scheduled_task selboolean selmodule service source ' +\n    'sport ssh_authorized_key sshkey stage state table tidy todest toports tosource ' +\n    'user vlan yumrepo zfs zone zpool');\n\n  // After finding a start of a string ('|\") this function attempts to find the end;\n  // If a variable is encountered along the way, we display it differently when it\n  // is encapsulated in a double-quoted string.\n  function tokenString(stream, state) {\n    var current, prev, found_var = false;\n    while (!stream.eol() && (current = stream.next()) != state.pending) {\n      if (current === '$' && prev != '\\\\' && state.pending == '\"') {\n        found_var = true;\n        break;\n      }\n      prev = current;\n    }\n    if (found_var) {\n      stream.backUp(1);\n    }\n    if (current == state.pending) {\n      state.continueString = false;\n    } else {\n      state.continueString = true;\n    }\n    return \"string\";\n  }\n\n  // Main function\n  function tokenize(stream, state) {\n    // Matches one whole word\n    var word = stream.match(/[\\w]+/, false);\n    // Matches attributes (i.e. ensure => present ; 'ensure' would be matched)\n    var attribute = stream.match(/(\\s+)?\\w+\\s+=>.*/, false);\n    // Matches non-builtin resource declarations\n    // (i.e. \"apache::vhost {\" or \"mycustomclasss {\" would be matched)\n    var resource = stream.match(/(\\s+)?[\\w:_]+(\\s+)?{/, false);\n    // Matches virtual and exported resources (i.e. @@user { ; and the like)\n    var special_resource = stream.match(/(\\s+)?[@]{1,2}[\\w:_]+(\\s+)?{/, false);\n\n    // Finally advance the stream\n    var ch = stream.next();\n\n    // Have we found a variable?\n    if (ch === '$') {\n      if (stream.match(variable_regex)) {\n        // If so, and its in a string, assign it a different color\n        return state.continueString ? 'variable-2' : 'variable';\n      }\n      // Otherwise return an invalid variable\n      return \"error\";\n    }\n    // Should we still be looking for the end of a string?\n    if (state.continueString) {\n      // If so, go through the loop again\n      stream.backUp(1);\n      return tokenString(stream, state);\n    }\n    // Are we in a definition (class, node, define)?\n    if (state.inDefinition) {\n      // If so, return def (i.e. for 'class myclass {' ; 'myclass' would be matched)\n      if (stream.match(/(\\s+)?[\\w:_]+(\\s+)?/)) {\n        return 'def';\n      }\n      // Match the rest it the next time around\n      stream.match(/\\s+{/);\n      state.inDefinition = false;\n    }\n    // Are we in an 'include' statement?\n    if (state.inInclude) {\n      // Match and return the included class\n      stream.match(/(\\s+)?\\S+(\\s+)?/);\n      state.inInclude = false;\n      return 'def';\n    }\n    // Do we just have a function on our hands?\n    // In 'ensure_resource(\"myclass\")', 'ensure_resource' is matched\n    if (stream.match(/(\\s+)?\\w+\\(/)) {\n      stream.backUp(1);\n      return 'def';\n    }\n    // Have we matched the prior attribute regex?\n    if (attribute) {\n      stream.match(/(\\s+)?\\w+/);\n      return 'tag';\n    }\n    // Do we have Puppet specific words?\n    if (word && words.hasOwnProperty(word)) {\n      // Negates the initial next()\n      stream.backUp(1);\n      // rs move the stream\n      stream.match(/[\\w]+/);\n      // We want to process these words differently\n      // do to the importance they have in Puppet\n      if (stream.match(/\\s+\\S+\\s+{/, false)) {\n        state.inDefinition = true;\n      }\n      if (word == 'include') {\n        state.inInclude = true;\n      }\n      // Returns their value as state in the prior define methods\n      return words[word];\n    }\n    // Is there a match on a reference?\n    if (/(^|\\s+)[A-Z][\\w:_]+/.test(word)) {\n      // Negate the next()\n      stream.backUp(1);\n      // Match the full reference\n      stream.match(/(^|\\s+)[A-Z][\\w:_]+/);\n      return 'def';\n    }\n    // Have we matched the prior resource regex?\n    if (resource) {\n      stream.match(/(\\s+)?[\\w:_]+/);\n      return 'def';\n    }\n    // Have we matched the prior special_resource regex?\n    if (special_resource) {\n      stream.match(/(\\s+)?[@]{1,2}/);\n      return 'special';\n    }\n    // Match all the comments. All of them.\n    if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    // Have we found a string?\n    if (ch == \"'\" || ch == '\"') {\n      // Store the type (single or double)\n      state.pending = ch;\n      // Perform the looping function to find the end\n      return tokenString(stream, state);\n    }\n    // Match all the brackets\n    if (ch == '{' || ch == '}') {\n      return 'bracket';\n    }\n    // Match characters that we are going to assume\n    // are trying to be regex\n    if (ch == '/') {\n      stream.match(/^[^\\/]*\\//);\n      return 'variable-3';\n    }\n    // Match all the numbers\n    if (ch.match(/[0-9]/)) {\n      stream.eatWhile(/[0-9]+/);\n      return 'number';\n    }\n    // Match the '=' and '=>' operators\n    if (ch == '=') {\n      if (stream.peek() == '>') {\n          stream.next();\n      }\n      return \"operator\";\n    }\n    // Keep advancing through all the rest\n    stream.eatWhile(/[\\w-]/);\n    // Return a blank line for everything else\n    return null;\n  }\n  // Start it all\n  return {\n    startState: function () {\n      var state = {};\n      state.inDefinition = false;\n      state.inInclude = false;\n      state.continueString = false;\n      state.pending = false;\n      return state;\n    },\n    token: function (stream, state) {\n      // Strip the spaces, but regex will account for them eitherway\n      if (stream.eatSpace()) return null;\n      // Go through the main process\n      return tokenize(stream, state);\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-puppet\", \"puppet\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/python/python.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  var wordOperators = wordRegexp([\"and\", \"or\", \"not\", \"is\"]);\n  var commonKeywords = [\"as\", \"assert\", \"break\", \"class\", \"continue\",\n                        \"def\", \"del\", \"elif\", \"else\", \"except\", \"finally\",\n                        \"for\", \"from\", \"global\", \"if\", \"import\",\n                        \"lambda\", \"pass\", \"raise\", \"return\",\n                        \"try\", \"while\", \"with\", \"yield\", \"in\"];\n  var commonBuiltins = [\"abs\", \"all\", \"any\", \"bin\", \"bool\", \"bytearray\", \"callable\", \"chr\",\n                        \"classmethod\", \"compile\", \"complex\", \"delattr\", \"dict\", \"dir\", \"divmod\",\n                        \"enumerate\", \"eval\", \"filter\", \"float\", \"format\", \"frozenset\",\n                        \"getattr\", \"globals\", \"hasattr\", \"hash\", \"help\", \"hex\", \"id\",\n                        \"input\", \"int\", \"isinstance\", \"issubclass\", \"iter\", \"len\",\n                        \"list\", \"locals\", \"map\", \"max\", \"memoryview\", \"min\", \"next\",\n                        \"object\", \"oct\", \"open\", \"ord\", \"pow\", \"property\", \"range\",\n                        \"repr\", \"reversed\", \"round\", \"set\", \"setattr\", \"slice\",\n                        \"sorted\", \"staticmethod\", \"str\", \"sum\", \"super\", \"tuple\",\n                        \"type\", \"vars\", \"zip\", \"__import__\", \"NotImplemented\",\n                        \"Ellipsis\", \"__debug__\"];\n  CodeMirror.registerHelper(\"hintWords\", \"python\", commonKeywords.concat(commonBuiltins));\n\n  function top(state) {\n    return state.scopes[state.scopes.length - 1];\n  }\n\n  CodeMirror.defineMode(\"python\", function(conf, parserConf) {\n    var ERRORCLASS = \"error\";\n\n    var delimiters = parserConf.delimiters || parserConf.singleDelimiters || /^[\\(\\)\\[\\]\\{\\}@,:`=;\\.\\\\]/;\n    //               (Backwards-compatibility with old, cumbersome config system)\n    var operators = [parserConf.singleOperators, parserConf.doubleOperators, parserConf.doubleDelimiters, parserConf.tripleDelimiters,\n                     parserConf.operators || /^([-+*/%\\/&|^]=?|[<>=]+|\\/\\/=?|\\*\\*=?|!=|[~!@]|\\.\\.\\.)/]\n    for (var i = 0; i < operators.length; i++) if (!operators[i]) operators.splice(i--, 1)\n\n    var hangingIndent = parserConf.hangingIndent || conf.indentUnit;\n\n    var myKeywords = commonKeywords, myBuiltins = commonBuiltins;\n    if (parserConf.extra_keywords != undefined)\n      myKeywords = myKeywords.concat(parserConf.extra_keywords);\n\n    if (parserConf.extra_builtins != undefined)\n      myBuiltins = myBuiltins.concat(parserConf.extra_builtins);\n\n    var py3 = !(parserConf.version && Number(parserConf.version) < 3)\n    if (py3) {\n      // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator\n      var identifiers = parserConf.identifiers|| /^[_A-Za-z\\u00A1-\\uFFFF][_A-Za-z0-9\\u00A1-\\uFFFF]*/;\n      myKeywords = myKeywords.concat([\"nonlocal\", \"False\", \"True\", \"None\", \"async\", \"await\"]);\n      myBuiltins = myBuiltins.concat([\"ascii\", \"bytes\", \"exec\", \"print\"]);\n      var stringPrefixes = new RegExp(\"^(([rbuf]|(br)|(rb)|(fr)|(rf))?('{3}|\\\"{3}|['\\\"]))\", \"i\");\n    } else {\n      var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/;\n      myKeywords = myKeywords.concat([\"exec\", \"print\"]);\n      myBuiltins = myBuiltins.concat([\"apply\", \"basestring\", \"buffer\", \"cmp\", \"coerce\", \"execfile\",\n                                      \"file\", \"intern\", \"long\", \"raw_input\", \"reduce\", \"reload\",\n                                      \"unichr\", \"unicode\", \"xrange\", \"False\", \"True\", \"None\"]);\n      var stringPrefixes = new RegExp(\"^(([rubf]|(ur)|(br))?('{3}|\\\"{3}|['\\\"]))\", \"i\");\n    }\n    var keywords = wordRegexp(myKeywords);\n    var builtins = wordRegexp(myBuiltins);\n\n    // tokenizers\n    function tokenBase(stream, state) {\n      var sol = stream.sol() && state.lastToken != \"\\\\\"\n      if (sol) state.indent = stream.indentation()\n      // Handle scope changes\n      if (sol && top(state).type == \"py\") {\n        var scopeOffset = top(state).offset;\n        if (stream.eatSpace()) {\n          var lineOffset = stream.indentation();\n          if (lineOffset > scopeOffset)\n            pushPyScope(state);\n          else if (lineOffset < scopeOffset && dedent(stream, state) && stream.peek() != \"#\")\n            state.errorToken = true;\n          return null;\n        } else {\n          var style = tokenBaseInner(stream, state);\n          if (scopeOffset > 0 && dedent(stream, state))\n            style += \" \" + ERRORCLASS;\n          return style;\n        }\n      }\n      return tokenBaseInner(stream, state);\n    }\n\n    function tokenBaseInner(stream, state, inFormat) {\n      if (stream.eatSpace()) return null;\n\n      // Handle Comments\n      if (!inFormat && stream.match(/^#.*/)) return \"comment\";\n\n      // Handle Number Literals\n      if (stream.match(/^[0-9\\.]/, false)) {\n        var floatLiteral = false;\n        // Floats\n        if (stream.match(/^[\\d_]*\\.\\d+(e[\\+\\-]?\\d+)?/i)) { floatLiteral = true; }\n        if (stream.match(/^[\\d_]+\\.\\d*/)) { floatLiteral = true; }\n        if (stream.match(/^\\.\\d+/)) { floatLiteral = true; }\n        if (floatLiteral) {\n          // Float literals may be \"imaginary\"\n          stream.eat(/J/i);\n          return \"number\";\n        }\n        // Integers\n        var intLiteral = false;\n        // Hex\n        if (stream.match(/^0x[0-9a-f_]+/i)) intLiteral = true;\n        // Binary\n        if (stream.match(/^0b[01_]+/i)) intLiteral = true;\n        // Octal\n        if (stream.match(/^0o[0-7_]+/i)) intLiteral = true;\n        // Decimal\n        if (stream.match(/^[1-9][\\d_]*(e[\\+\\-]?[\\d_]+)?/)) {\n          // Decimal literals may be \"imaginary\"\n          stream.eat(/J/i);\n          // TODO - Can you have imaginary longs?\n          intLiteral = true;\n        }\n        // Zero by itself with no other piece of number.\n        if (stream.match(/^0(?![\\dx])/i)) intLiteral = true;\n        if (intLiteral) {\n          // Integer literals may be \"long\"\n          stream.eat(/L/i);\n          return \"number\";\n        }\n      }\n\n      // Handle Strings\n      if (stream.match(stringPrefixes)) {\n        var isFmtString = stream.current().toLowerCase().indexOf('f') !== -1;\n        if (!isFmtString) {\n          state.tokenize = tokenStringFactory(stream.current(), state.tokenize);\n          return state.tokenize(stream, state);\n        } else {\n          state.tokenize = formatStringFactory(stream.current(), state.tokenize);\n          return state.tokenize(stream, state);\n        }\n      }\n\n      for (var i = 0; i < operators.length; i++)\n        if (stream.match(operators[i])) return \"operator\"\n\n      if (stream.match(delimiters)) return \"punctuation\";\n\n      if (state.lastToken == \".\" && stream.match(identifiers))\n        return \"property\";\n\n      if (stream.match(keywords) || stream.match(wordOperators))\n        return \"keyword\";\n\n      if (stream.match(builtins))\n        return \"builtin\";\n\n      if (stream.match(/^(self|cls)\\b/))\n        return \"variable-2\";\n\n      if (stream.match(identifiers)) {\n        if (state.lastToken == \"def\" || state.lastToken == \"class\")\n          return \"def\";\n        return \"variable\";\n      }\n\n      // Handle non-detected items\n      stream.next();\n      return inFormat ? null :ERRORCLASS;\n    }\n\n    function formatStringFactory(delimiter, tokenOuter) {\n      while (\"rubf\".indexOf(delimiter.charAt(0).toLowerCase()) >= 0)\n        delimiter = delimiter.substr(1);\n\n      var singleline = delimiter.length == 1;\n      var OUTCLASS = \"string\";\n\n      function tokenNestedExpr(depth) {\n        return function(stream, state) {\n          var inner = tokenBaseInner(stream, state, true)\n          if (inner == \"punctuation\") {\n            if (stream.current() == \"{\") {\n              state.tokenize = tokenNestedExpr(depth + 1)\n            } else if (stream.current() == \"}\") {\n              if (depth > 1) state.tokenize = tokenNestedExpr(depth - 1)\n              else state.tokenize = tokenString\n            }\n          }\n          return inner\n        }\n      }\n\n      function tokenString(stream, state) {\n        while (!stream.eol()) {\n          stream.eatWhile(/[^'\"\\{\\}\\\\]/);\n          if (stream.eat(\"\\\\\")) {\n            stream.next();\n            if (singleline && stream.eol())\n              return OUTCLASS;\n          } else if (stream.match(delimiter)) {\n            state.tokenize = tokenOuter;\n            return OUTCLASS;\n          } else if (stream.match('{{')) {\n            // ignore {{ in f-str\n            return OUTCLASS;\n          } else if (stream.match('{', false)) {\n            // switch to nested mode\n            state.tokenize = tokenNestedExpr(0)\n            if (stream.current()) return OUTCLASS;\n            else return state.tokenize(stream, state)\n          } else if (stream.match('}}')) {\n            return OUTCLASS;\n          } else if (stream.match('}')) {\n            // single } in f-string is an error\n            return ERRORCLASS;\n          } else {\n            stream.eat(/['\"]/);\n          }\n        }\n        if (singleline) {\n          if (parserConf.singleLineStringErrors)\n            return ERRORCLASS;\n          else\n            state.tokenize = tokenOuter;\n        }\n        return OUTCLASS;\n      }\n      tokenString.isString = true;\n      return tokenString;\n    }\n\n    function tokenStringFactory(delimiter, tokenOuter) {\n      while (\"rubf\".indexOf(delimiter.charAt(0).toLowerCase()) >= 0)\n        delimiter = delimiter.substr(1);\n\n      var singleline = delimiter.length == 1;\n      var OUTCLASS = \"string\";\n\n      function tokenString(stream, state) {\n        while (!stream.eol()) {\n          stream.eatWhile(/[^'\"\\\\]/);\n          if (stream.eat(\"\\\\\")) {\n            stream.next();\n            if (singleline && stream.eol())\n              return OUTCLASS;\n          } else if (stream.match(delimiter)) {\n            state.tokenize = tokenOuter;\n            return OUTCLASS;\n          } else {\n            stream.eat(/['\"]/);\n          }\n        }\n        if (singleline) {\n          if (parserConf.singleLineStringErrors)\n            return ERRORCLASS;\n          else\n            state.tokenize = tokenOuter;\n        }\n        return OUTCLASS;\n      }\n      tokenString.isString = true;\n      return tokenString;\n    }\n\n    function pushPyScope(state) {\n      while (top(state).type != \"py\") state.scopes.pop()\n      state.scopes.push({offset: top(state).offset + conf.indentUnit,\n                         type: \"py\",\n                         align: null})\n    }\n\n    function pushBracketScope(stream, state, type) {\n      var align = stream.match(/^[\\s\\[\\{\\(]*(?:#|$)/, false) ? null : stream.column() + 1\n      state.scopes.push({offset: state.indent + hangingIndent,\n                         type: type,\n                         align: align})\n    }\n\n    function dedent(stream, state) {\n      var indented = stream.indentation();\n      while (state.scopes.length > 1 && top(state).offset > indented) {\n        if (top(state).type != \"py\") return true;\n        state.scopes.pop();\n      }\n      return top(state).offset != indented;\n    }\n\n    function tokenLexer(stream, state) {\n      if (stream.sol()) {\n        state.beginningOfLine = true;\n        state.dedent = false;\n      }\n\n      var style = state.tokenize(stream, state);\n      var current = stream.current();\n\n      // Handle decorators\n      if (state.beginningOfLine && current == \"@\")\n        return stream.match(identifiers, false) ? \"meta\" : py3 ? \"operator\" : ERRORCLASS;\n\n      if (/\\S/.test(current)) state.beginningOfLine = false;\n\n      if ((style == \"variable\" || style == \"builtin\")\n          && state.lastToken == \"meta\")\n        style = \"meta\";\n\n      // Handle scope changes.\n      if (current == \"pass\" || current == \"return\")\n        state.dedent = true;\n\n      if (current == \"lambda\") state.lambda = true;\n      if (current == \":\" && !state.lambda && top(state).type == \"py\" && stream.match(/^\\s*(?:#|$)/, false))\n        pushPyScope(state);\n\n      if (current.length == 1 && !/string|comment/.test(style)) {\n        var delimiter_index = \"[({\".indexOf(current);\n        if (delimiter_index != -1)\n          pushBracketScope(stream, state, \"])}\".slice(delimiter_index, delimiter_index+1));\n\n        delimiter_index = \"])}\".indexOf(current);\n        if (delimiter_index != -1) {\n          if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent\n          else return ERRORCLASS;\n        }\n      }\n      if (state.dedent && stream.eol() && top(state).type == \"py\" && state.scopes.length > 1)\n        state.scopes.pop();\n\n      return style;\n    }\n\n    var external = {\n      startState: function(basecolumn) {\n        return {\n          tokenize: tokenBase,\n          scopes: [{offset: basecolumn || 0, type: \"py\", align: null}],\n          indent: basecolumn || 0,\n          lastToken: null,\n          lambda: false,\n          dedent: 0\n        };\n      },\n\n      token: function(stream, state) {\n        var addErr = state.errorToken;\n        if (addErr) state.errorToken = false;\n        var style = tokenLexer(stream, state);\n\n        if (style && style != \"comment\")\n          state.lastToken = (style == \"keyword\" || style == \"punctuation\") ? stream.current() : style;\n        if (style == \"punctuation\") style = null;\n\n        if (stream.eol() && state.lambda)\n          state.lambda = false;\n        return addErr ? style + \" \" + ERRORCLASS : style;\n      },\n\n      indent: function(state, textAfter) {\n        if (state.tokenize != tokenBase)\n          return state.tokenize.isString ? CodeMirror.Pass : 0;\n\n        var scope = top(state)\n        var closing = scope.type == textAfter.charAt(0) ||\n            scope.type == \"py\" && !state.dedent && /^(else:|elif |except |finally:)/.test(textAfter)\n        if (scope.align != null)\n          return scope.align - (closing ? 1 : 0)\n        else\n          return scope.offset - (closing ? hangingIndent : 0)\n      },\n\n      electricInput: /^\\s*([\\}\\]\\)]|else:|elif |except |finally:)$/,\n      closeBrackets: {triples: \"'\\\"\"},\n      lineComment: \"#\",\n      fold: \"indent\"\n    };\n    return external;\n  });\n\n  CodeMirror.defineMIME(\"text/x-python\", \"python\");\n\n  var words = function(str) { return str.split(\" \"); };\n\n  CodeMirror.defineMIME(\"text/x-cython\", {\n    name: \"python\",\n    extra_keywords: words(\"by cdef cimport cpdef ctypedef enum except \"+\n                          \"extern gil include nogil property public \"+\n                          \"readonly struct union DEF IF ELIF ELSE\")\n  });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/q/q.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"q\",function(config){\n  var indentUnit=config.indentUnit,\n      curPunc,\n      keywords=buildRE([\"abs\",\"acos\",\"aj\",\"aj0\",\"all\",\"and\",\"any\",\"asc\",\"asin\",\"asof\",\"atan\",\"attr\",\"avg\",\"avgs\",\"bin\",\"by\",\"ceiling\",\"cols\",\"cor\",\"cos\",\"count\",\"cov\",\"cross\",\"csv\",\"cut\",\"delete\",\"deltas\",\"desc\",\"dev\",\"differ\",\"distinct\",\"div\",\"do\",\"each\",\"ej\",\"enlist\",\"eval\",\"except\",\"exec\",\"exit\",\"exp\",\"fby\",\"fills\",\"first\",\"fkeys\",\"flip\",\"floor\",\"from\",\"get\",\"getenv\",\"group\",\"gtime\",\"hclose\",\"hcount\",\"hdel\",\"hopen\",\"hsym\",\"iasc\",\"idesc\",\"if\",\"ij\",\"in\",\"insert\",\"inter\",\"inv\",\"key\",\"keys\",\"last\",\"like\",\"list\",\"lj\",\"load\",\"log\",\"lower\",\"lsq\",\"ltime\",\"ltrim\",\"mavg\",\"max\",\"maxs\",\"mcount\",\"md5\",\"mdev\",\"med\",\"meta\",\"min\",\"mins\",\"mmax\",\"mmin\",\"mmu\",\"mod\",\"msum\",\"neg\",\"next\",\"not\",\"null\",\"or\",\"over\",\"parse\",\"peach\",\"pj\",\"plist\",\"prd\",\"prds\",\"prev\",\"prior\",\"rand\",\"rank\",\"ratios\",\"raze\",\"read0\",\"read1\",\"reciprocal\",\"reverse\",\"rload\",\"rotate\",\"rsave\",\"rtrim\",\"save\",\"scan\",\"select\",\"set\",\"setenv\",\"show\",\"signum\",\"sin\",\"sqrt\",\"ss\",\"ssr\",\"string\",\"sublist\",\"sum\",\"sums\",\"sv\",\"system\",\"tables\",\"tan\",\"til\",\"trim\",\"txf\",\"type\",\"uj\",\"ungroup\",\"union\",\"update\",\"upper\",\"upsert\",\"value\",\"var\",\"view\",\"views\",\"vs\",\"wavg\",\"where\",\"where\",\"while\",\"within\",\"wj\",\"wj1\",\"wsum\",\"xasc\",\"xbar\",\"xcol\",\"xcols\",\"xdesc\",\"xexp\",\"xgroup\",\"xkey\",\"xlog\",\"xprev\",\"xrank\"]),\n      E=/[|/&^!+:\\\\\\-*%$=~#;@><,?_\\'\\\"\\[\\(\\]\\)\\s{}]/;\n  function buildRE(w){return new RegExp(\"^(\"+w.join(\"|\")+\")$\");}\n  function tokenBase(stream,state){\n    var sol=stream.sol(),c=stream.next();\n    curPunc=null;\n    if(sol)\n      if(c==\"/\")\n        return(state.tokenize=tokenLineComment)(stream,state);\n      else if(c==\"\\\\\"){\n        if(stream.eol()||/\\s/.test(stream.peek()))\n          return stream.skipToEnd(),/^\\\\\\s*$/.test(stream.current())?(state.tokenize=tokenCommentToEOF)(stream):state.tokenize=tokenBase,\"comment\";\n        else\n          return state.tokenize=tokenBase,\"builtin\";\n      }\n    if(/\\s/.test(c))\n      return stream.peek()==\"/\"?(stream.skipToEnd(),\"comment\"):\"whitespace\";\n    if(c=='\"')\n      return(state.tokenize=tokenString)(stream,state);\n    if(c=='`')\n      return stream.eatWhile(/[A-Za-z\\d_:\\/.]/),\"symbol\";\n    if((\".\"==c&&/\\d/.test(stream.peek()))||/\\d/.test(c)){\n      var t=null;\n      stream.backUp(1);\n      if(stream.match(/^\\d{4}\\.\\d{2}(m|\\.\\d{2}([DT](\\d{2}(:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?)?)?)?)/)\n      || stream.match(/^\\d+D(\\d{2}(:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?)?)/)\n      || stream.match(/^\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?/)\n      || stream.match(/^\\d+[ptuv]{1}/))\n        t=\"temporal\";\n      else if(stream.match(/^0[NwW]{1}/)\n      || stream.match(/^0x[\\da-fA-F]*/)\n      || stream.match(/^[01]+[b]{1}/)\n      || stream.match(/^\\d+[chijn]{1}/)\n      || stream.match(/-?\\d*(\\.\\d*)?(e[+\\-]?\\d+)?(e|f)?/))\n        t=\"number\";\n      return(t&&(!(c=stream.peek())||E.test(c)))?t:(stream.next(),\"error\");\n    }\n    if(/[A-Za-z]|\\./.test(c))\n      return stream.eatWhile(/[A-Za-z._\\d]/),keywords.test(stream.current())?\"keyword\":\"variable\";\n    if(/[|/&^!+:\\\\\\-*%$=~#;@><\\.,?_\\']/.test(c))\n      return null;\n    if(/[{}\\(\\[\\]\\)]/.test(c))\n      return null;\n    return\"error\";\n  }\n  function tokenLineComment(stream,state){\n    return stream.skipToEnd(),/\\/\\s*$/.test(stream.current())?(state.tokenize=tokenBlockComment)(stream,state):(state.tokenize=tokenBase),\"comment\";\n  }\n  function tokenBlockComment(stream,state){\n    var f=stream.sol()&&stream.peek()==\"\\\\\";\n    stream.skipToEnd();\n    if(f&&/^\\\\\\s*$/.test(stream.current()))\n      state.tokenize=tokenBase;\n    return\"comment\";\n  }\n  function tokenCommentToEOF(stream){return stream.skipToEnd(),\"comment\";}\n  function tokenString(stream,state){\n    var escaped=false,next,end=false;\n    while((next=stream.next())){\n      if(next==\"\\\"\"&&!escaped){end=true;break;}\n      escaped=!escaped&&next==\"\\\\\";\n    }\n    if(end)state.tokenize=tokenBase;\n    return\"string\";\n  }\n  function pushContext(state,type,col){state.context={prev:state.context,indent:state.indent,col:col,type:type};}\n  function popContext(state){state.indent=state.context.indent;state.context=state.context.prev;}\n  return{\n    startState:function(){\n      return{tokenize:tokenBase,\n             context:null,\n             indent:0,\n             col:0};\n    },\n    token:function(stream,state){\n      if(stream.sol()){\n        if(state.context&&state.context.align==null)\n          state.context.align=false;\n        state.indent=stream.indentation();\n      }\n      //if (stream.eatSpace()) return null;\n      var style=state.tokenize(stream,state);\n      if(style!=\"comment\"&&state.context&&state.context.align==null&&state.context.type!=\"pattern\"){\n        state.context.align=true;\n      }\n      if(curPunc==\"(\")pushContext(state,\")\",stream.column());\n      else if(curPunc==\"[\")pushContext(state,\"]\",stream.column());\n      else if(curPunc==\"{\")pushContext(state,\"}\",stream.column());\n      else if(/[\\]\\}\\)]/.test(curPunc)){\n        while(state.context&&state.context.type==\"pattern\")popContext(state);\n        if(state.context&&curPunc==state.context.type)popContext(state);\n      }\n      else if(curPunc==\".\"&&state.context&&state.context.type==\"pattern\")popContext(state);\n      else if(/atom|string|variable/.test(style)&&state.context){\n        if(/[\\}\\]]/.test(state.context.type))\n          pushContext(state,\"pattern\",stream.column());\n        else if(state.context.type==\"pattern\"&&!state.context.align){\n          state.context.align=true;\n          state.context.col=stream.column();\n        }\n      }\n      return style;\n    },\n    indent:function(state,textAfter){\n      var firstChar=textAfter&&textAfter.charAt(0);\n      var context=state.context;\n      if(/[\\]\\}]/.test(firstChar))\n        while (context&&context.type==\"pattern\")context=context.prev;\n      var closing=context&&firstChar==context.type;\n      if(!context)\n        return 0;\n      else if(context.type==\"pattern\")\n        return context.col;\n      else if(context.align)\n        return context.col+(closing?0:1);\n      else\n        return context.indent+(closing?0:indentUnit);\n    }\n  };\n});\nCodeMirror.defineMIME(\"text/x-q\",\"q\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/r/r.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"wordChars\", \"r\", /[\\w.]/);\n\nCodeMirror.defineMode(\"r\", function(config) {\n  function wordObj(words) {\n    var res = {};\n    for (var i = 0; i < words.length; ++i) res[words[i]] = true;\n    return res;\n  }\n  var commonAtoms = [\"NULL\", \"NA\", \"Inf\", \"NaN\", \"NA_integer_\", \"NA_real_\", \"NA_complex_\", \"NA_character_\", \"TRUE\", \"FALSE\"];\n  var commonBuiltins = [\"list\", \"quote\", \"bquote\", \"eval\", \"return\", \"call\", \"parse\", \"deparse\"];\n  var commonKeywords = [\"if\", \"else\", \"repeat\", \"while\", \"function\", \"for\", \"in\", \"next\", \"break\"];\n  var commonBlockKeywords = [\"if\", \"else\", \"repeat\", \"while\", \"function\", \"for\"];\n\n  CodeMirror.registerHelper(\"hintWords\", \"r\", commonAtoms.concat(commonBuiltins, commonKeywords));\n\n  var atoms = wordObj(commonAtoms);\n  var builtins = wordObj(commonBuiltins);\n  var keywords = wordObj(commonKeywords);\n  var blockkeywords = wordObj(commonBlockKeywords);\n  var opChars = /[+\\-*\\/^<>=!&|~$:]/;\n  var curPunc;\n\n  function tokenBase(stream, state) {\n    curPunc = null;\n    var ch = stream.next();\n    if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    } else if (ch == \"0\" && stream.eat(\"x\")) {\n      stream.eatWhile(/[\\da-f]/i);\n      return \"number\";\n    } else if (ch == \".\" && stream.eat(/\\d/)) {\n      stream.match(/\\d*(?:e[+\\-]?\\d+)?/);\n      return \"number\";\n    } else if (/\\d/.test(ch)) {\n      stream.match(/\\d*(?:\\.\\d+)?(?:e[+\\-]\\d+)?L?/);\n      return \"number\";\n    } else if (ch == \"'\" || ch == '\"') {\n      state.tokenize = tokenString(ch);\n      return \"string\";\n    } else if (ch == \"`\") {\n      stream.match(/[^`]+`/);\n      return \"variable-3\";\n    } else if (ch == \".\" && stream.match(/.(?:[.]|\\d+)/)) {\n      return \"keyword\";\n    } else if (/[a-zA-Z\\.]/.test(ch)) {\n      stream.eatWhile(/[\\w\\.]/);\n      var word = stream.current();\n      if (atoms.propertyIsEnumerable(word)) return \"atom\";\n      if (keywords.propertyIsEnumerable(word)) {\n        // Block keywords start new blocks, except 'else if', which only starts\n        // one new block for the 'if', no block for the 'else'.\n        if (blockkeywords.propertyIsEnumerable(word) &&\n            !stream.match(/\\s*if(\\s+|$)/, false))\n          curPunc = \"block\";\n        return \"keyword\";\n      }\n      if (builtins.propertyIsEnumerable(word)) return \"builtin\";\n      return \"variable\";\n    } else if (ch == \"%\") {\n      if (stream.skipTo(\"%\")) stream.next();\n      return \"operator variable-2\";\n    } else if (\n        (ch == \"<\" && stream.eat(\"-\")) ||\n        (ch == \"<\" && stream.match(\"<-\")) ||\n        (ch == \"-\" && stream.match(/>>?/))\n      ) {\n      return \"operator arrow\";\n    } else if (ch == \"=\" && state.ctx.argList) {\n      return \"arg-is\";\n    } else if (opChars.test(ch)) {\n      if (ch == \"$\") return \"operator dollar\";\n      stream.eatWhile(opChars);\n      return \"operator\";\n    } else if (/[\\(\\){}\\[\\];]/.test(ch)) {\n      curPunc = ch;\n      if (ch == \";\") return \"semi\";\n      return null;\n    } else {\n      return null;\n    }\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      if (stream.eat(\"\\\\\")) {\n        var ch = stream.next();\n        if (ch == \"x\") stream.match(/^[a-f0-9]{2}/i);\n        else if ((ch == \"u\" || ch == \"U\") && stream.eat(\"{\") && stream.skipTo(\"}\")) stream.next();\n        else if (ch == \"u\") stream.match(/^[a-f0-9]{4}/i);\n        else if (ch == \"U\") stream.match(/^[a-f0-9]{8}/i);\n        else if (/[0-7]/.test(ch)) stream.match(/^[0-7]{1,2}/);\n        return \"string-2\";\n      } else {\n        var next;\n        while ((next = stream.next()) != null) {\n          if (next == quote) { state.tokenize = tokenBase; break; }\n          if (next == \"\\\\\") { stream.backUp(1); break; }\n        }\n        return \"string\";\n      }\n    };\n  }\n\n  var ALIGN_YES = 1, ALIGN_NO = 2, BRACELESS = 4\n\n  function push(state, type, stream) {\n    state.ctx = {type: type,\n                 indent: state.indent,\n                 flags: 0,\n                 column: stream.column(),\n                 prev: state.ctx};\n  }\n  function setFlag(state, flag) {\n    var ctx = state.ctx\n    state.ctx = {type: ctx.type,\n                 indent: ctx.indent,\n                 flags: ctx.flags | flag,\n                 column: ctx.column,\n                 prev: ctx.prev}\n  }\n  function pop(state) {\n    state.indent = state.ctx.indent;\n    state.ctx = state.ctx.prev;\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: tokenBase,\n              ctx: {type: \"top\",\n                    indent: -config.indentUnit,\n                    flags: ALIGN_NO},\n              indent: 0,\n              afterIdent: false};\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if ((state.ctx.flags & 3) == 0) state.ctx.flags |= ALIGN_NO\n        if (state.ctx.flags & BRACELESS) pop(state)\n        state.indent = stream.indentation();\n      }\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      if (style != \"comment\" && (state.ctx.flags & ALIGN_NO) == 0) setFlag(state, ALIGN_YES)\n\n      if ((curPunc == \";\" || curPunc == \"{\" || curPunc == \"}\") && state.ctx.type == \"block\") pop(state);\n      if (curPunc == \"{\") push(state, \"}\", stream);\n      else if (curPunc == \"(\") {\n        push(state, \")\", stream);\n        if (state.afterIdent) state.ctx.argList = true;\n      }\n      else if (curPunc == \"[\") push(state, \"]\", stream);\n      else if (curPunc == \"block\") push(state, \"block\", stream);\n      else if (curPunc == state.ctx.type) pop(state);\n      else if (state.ctx.type == \"block\" && style != \"comment\") setFlag(state, BRACELESS)\n      state.afterIdent = style == \"variable\" || style == \"keyword\";\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), ctx = state.ctx,\n          closing = firstChar == ctx.type;\n      if (ctx.flags & BRACELESS) ctx = ctx.prev\n      if (ctx.type == \"block\") return ctx.indent + (firstChar == \"{\" ? 0 : config.indentUnit);\n      else if (ctx.flags & ALIGN_YES) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indent + (closing ? 0 : config.indentUnit);\n    },\n\n    lineComment: \"#\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-rsrc\", \"r\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/rpm/changes/index.html",
    "content": "<!doctype html>\n\n<title>CodeMirror: RPM changes mode</title>\n<meta charset=\"utf-8\"/>\n<link rel=stylesheet href=\"../../doc/docs.css\">\n\n    <link rel=\"stylesheet\" href=\"../../../lib/codemirror.css\">\n    <script src=\"../../../lib/codemirror.js\"></script>\n    <script src=\"changes.js\"></script>\n    <link rel=\"stylesheet\" href=\"../../../doc/docs.css\">\n    <style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>\n\n<div id=nav>\n  <a href=\"https://codemirror.net\"><h1>CodeMirror</h1><img id=logo src=\"../../../doc/logo.png\"></a>\n\n  <ul>\n    <li><a href=\"../../../index.html\">Home</a>\n    <li><a href=\"../../../doc/manual.html\">Manual</a>\n    <li><a href=\"https://github.com/codemirror/codemirror\">Code</a>\n  </ul>\n  <ul>\n    <li><a href=\"../../index.html\">Language modes</a>\n    <li><a class=active href=\"#\">RPM changes</a>\n  </ul>\n</div>\n\n<article>\n<h2>RPM changes mode</h2>\n\n    <div><textarea id=\"code\" name=\"code\">\n-------------------------------------------------------------------\nTue Oct 18 13:58:40 UTC 2011 - misterx@example.com\n\n- Update to r60.3\n- Fixes bug in the reflect package\n  * disallow Interface method on Value obtained via unexported name\n\n-------------------------------------------------------------------\nThu Oct  6 08:14:24 UTC 2011 - misterx@example.com\n\n- Update to r60.2\n- Fixes memory leak in certain map types\n\n-------------------------------------------------------------------\nWed Oct  5 14:34:10 UTC 2011 - misterx@example.com\n\n- Tweaks for gdb debugging\n- go.spec changes:\n  - move %go_arch definition to %prep section\n  - pass correct location of go specific gdb pretty printer and\n    functions to cpp as HOST_EXTRA_CFLAGS macro\n  - install go gdb functions & printer\n- gdb-printer.patch\n  - patch linker (src/cmd/ld/dwarf.c) to emit correct location of go\n    gdb functions and pretty printer\n</textarea></div>\n    <script>\n      var editor = CodeMirror.fromTextArea(document.getElementById(\"code\"), {\n        mode: {name: \"changes\"},\n        lineNumbers: true,\n        indentUnit: 4\n      });\n    </script>\n\n    <p><strong>MIME types defined:</strong> <code>text/x-rpm-changes</code>.</p>\n</article>\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/rpm/rpm.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"rpm-changes\", function() {\n  var headerSeparator = /^-+$/;\n  var headerLine = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)  ?\\d{1,2} \\d{2}:\\d{2}(:\\d{2})? [A-Z]{3,4} \\d{4} - /;\n  var simpleEmail = /^[\\w+.-]+@[\\w.-]+/;\n\n  return {\n    token: function(stream) {\n      if (stream.sol()) {\n        if (stream.match(headerSeparator)) { return 'tag'; }\n        if (stream.match(headerLine)) { return 'tag'; }\n      }\n      if (stream.match(simpleEmail)) { return 'string'; }\n      stream.next();\n      return null;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-rpm-changes\", \"rpm-changes\");\n\n// Quick and dirty spec file highlighting\n\nCodeMirror.defineMode(\"rpm-spec\", function() {\n  var arch = /^(i386|i586|i686|x86_64|ppc64le|ppc64|ppc|ia64|s390x|s390|sparc64|sparcv9|sparc|noarch|alphaev6|alpha|hppa|mipsel)/;\n\n  var preamble = /^[a-zA-Z0-9()]+:/;\n  var section = /^%(debug_package|package|description|prep|build|install|files|clean|changelog|preinstall|preun|postinstall|postun|pretrans|posttrans|pre|post|triggerin|triggerun|verifyscript|check|triggerpostun|triggerprein|trigger)/;\n  var control_flow_complex = /^%(ifnarch|ifarch|if)/; // rpm control flow macros\n  var control_flow_simple = /^%(else|endif)/; // rpm control flow macros\n  var operators = /^(\\!|\\?|\\<\\=|\\<|\\>\\=|\\>|\\=\\=|\\&\\&|\\|\\|)/; // operators in control flow macros\n\n  return {\n    startState: function () {\n        return {\n          controlFlow: false,\n          macroParameters: false,\n          section: false\n        };\n    },\n    token: function (stream, state) {\n      var ch = stream.peek();\n      if (ch == \"#\") { stream.skipToEnd(); return \"comment\"; }\n\n      if (stream.sol()) {\n        if (stream.match(preamble)) { return \"header\"; }\n        if (stream.match(section)) { return \"atom\"; }\n      }\n\n      if (stream.match(/^\\$\\w+/)) { return \"def\"; } // Variables like '$RPM_BUILD_ROOT'\n      if (stream.match(/^\\$\\{\\w+\\}/)) { return \"def\"; } // Variables like '${RPM_BUILD_ROOT}'\n\n      if (stream.match(control_flow_simple)) { return \"keyword\"; }\n      if (stream.match(control_flow_complex)) {\n        state.controlFlow = true;\n        return \"keyword\";\n      }\n      if (state.controlFlow) {\n        if (stream.match(operators)) { return \"operator\"; }\n        if (stream.match(/^(\\d+)/)) { return \"number\"; }\n        if (stream.eol()) { state.controlFlow = false; }\n      }\n\n      if (stream.match(arch)) {\n        if (stream.eol()) { state.controlFlow = false; }\n        return \"number\";\n      }\n\n      // Macros like '%make_install' or '%attr(0775,root,root)'\n      if (stream.match(/^%[\\w]+/)) {\n        if (stream.match('(')) { state.macroParameters = true; }\n        return \"keyword\";\n      }\n      if (state.macroParameters) {\n        if (stream.match(/^\\d+/)) { return \"number\";}\n        if (stream.match(')')) {\n          state.macroParameters = false;\n          return \"keyword\";\n        }\n      }\n\n      // Macros like '%{defined fedora}'\n      if (stream.match(/^%\\{\\??[\\w \\-\\:\\!]+\\}/)) {\n        if (stream.eol()) { state.controlFlow = false; }\n        return \"def\";\n      }\n\n      //TODO: Include bash script sub-parser (CodeMirror supports that)\n      stream.next();\n      return null;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-rpm-spec\", \"rpm-spec\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/rst/rst.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../python/python\"), require(\"../stex/stex\"), require(\"../../addon/mode/overlay\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../python/python\", \"../stex/stex\", \"../../addon/mode/overlay\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('rst', function (config, options) {\n\n  var rx_strong = /^\\*\\*[^\\*\\s](?:[^\\*]*[^\\*\\s])?\\*\\*/;\n  var rx_emphasis = /^\\*[^\\*\\s](?:[^\\*]*[^\\*\\s])?\\*/;\n  var rx_literal = /^``[^`\\s](?:[^`]*[^`\\s])``/;\n\n  var rx_number = /^(?:[\\d]+(?:[\\.,]\\d+)*)/;\n  var rx_positive = /^(?:\\s\\+[\\d]+(?:[\\.,]\\d+)*)/;\n  var rx_negative = /^(?:\\s\\-[\\d]+(?:[\\.,]\\d+)*)/;\n\n  var rx_uri_protocol = \"[Hh][Tt][Tt][Pp][Ss]?://\";\n  var rx_uri_domain = \"(?:[\\\\d\\\\w.-]+)\\\\.(?:\\\\w{2,6})\";\n  var rx_uri_path = \"(?:/[\\\\d\\\\w\\\\#\\\\%\\\\&\\\\-\\\\.\\\\,\\\\/\\\\:\\\\=\\\\?\\\\~]+)*\";\n  var rx_uri = new RegExp(\"^\" + rx_uri_protocol + rx_uri_domain + rx_uri_path);\n\n  var overlay = {\n    token: function (stream) {\n\n      if (stream.match(rx_strong) && stream.match (/\\W+|$/, false))\n        return 'strong';\n      if (stream.match(rx_emphasis) && stream.match (/\\W+|$/, false))\n        return 'em';\n      if (stream.match(rx_literal) && stream.match (/\\W+|$/, false))\n        return 'string-2';\n      if (stream.match(rx_number))\n        return 'number';\n      if (stream.match(rx_positive))\n        return 'positive';\n      if (stream.match(rx_negative))\n        return 'negative';\n      if (stream.match(rx_uri))\n        return 'link';\n\n      while (stream.next() != null) {\n        if (stream.match(rx_strong, false)) break;\n        if (stream.match(rx_emphasis, false)) break;\n        if (stream.match(rx_literal, false)) break;\n        if (stream.match(rx_number, false)) break;\n        if (stream.match(rx_positive, false)) break;\n        if (stream.match(rx_negative, false)) break;\n        if (stream.match(rx_uri, false)) break;\n      }\n\n      return null;\n    }\n  };\n\n  var mode = CodeMirror.getMode(\n    config, options.backdrop || 'rst-base'\n  );\n\n  return CodeMirror.overlayMode(mode, overlay, true); // combine\n}, 'python', 'stex');\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n\nCodeMirror.defineMode('rst-base', function (config) {\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function format(string) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    return string.replace(/{(\\d+)}/g, function (match, n) {\n      return typeof args[n] != 'undefined' ? args[n] : match;\n    });\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  var mode_python = CodeMirror.getMode(config, 'python');\n  var mode_stex = CodeMirror.getMode(config, 'stex');\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  var SEPA = \"\\\\s+\";\n  var TAIL = \"(?:\\\\s*|\\\\W|$)\",\n  rx_TAIL = new RegExp(format('^{0}', TAIL));\n\n  var NAME =\n    \"(?:[^\\\\W\\\\d_](?:[\\\\w!\\\"#$%&'()\\\\*\\\\+,\\\\-\\\\.\\/:;<=>\\\\?]*[^\\\\W_])?)\",\n  rx_NAME = new RegExp(format('^{0}', NAME));\n  var NAME_WWS =\n    \"(?:[^\\\\W\\\\d_](?:[\\\\w\\\\s!\\\"#$%&'()\\\\*\\\\+,\\\\-\\\\.\\/:;<=>\\\\?]*[^\\\\W_])?)\";\n  var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS);\n\n  var TEXT1 = \"(?:[^\\\\s\\\\|](?:[^\\\\|]*[^\\\\s\\\\|])?)\";\n  var TEXT2 = \"(?:[^\\\\`]+)\",\n  rx_TEXT2 = new RegExp(format('^{0}', TEXT2));\n\n  var rx_section = new RegExp(\n    \"^([!'#$%&\\\"()*+,-./:;<=>?@\\\\[\\\\\\\\\\\\]^_`{|}~])\\\\1{3,}\\\\s*$\");\n  var rx_explicit = new RegExp(\n    format('^\\\\.\\\\.{0}', SEPA));\n  var rx_link = new RegExp(\n    format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL));\n  var rx_directive = new RegExp(\n    format('^{0}::{1}', REF_NAME, TAIL));\n  var rx_substitution = new RegExp(\n    format('^\\\\|{0}\\\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL));\n  var rx_footnote = new RegExp(\n    format('^\\\\[(?:\\\\d+|#{0}?|\\\\*)]{1}', REF_NAME, TAIL));\n  var rx_citation = new RegExp(\n    format('^\\\\[{0}\\\\]{1}', REF_NAME, TAIL));\n\n  var rx_substitution_ref = new RegExp(\n    format('^\\\\|{0}\\\\|', TEXT1));\n  var rx_footnote_ref = new RegExp(\n    format('^\\\\[(?:\\\\d+|#{0}?|\\\\*)]_', REF_NAME));\n  var rx_citation_ref = new RegExp(\n    format('^\\\\[{0}\\\\]_', REF_NAME));\n  var rx_link_ref1 = new RegExp(\n    format('^{0}__?', REF_NAME));\n  var rx_link_ref2 = new RegExp(\n    format('^`{0}`_', TEXT2));\n\n  var rx_role_pre = new RegExp(\n    format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL));\n  var rx_role_suf = new RegExp(\n    format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL));\n  var rx_role = new RegExp(\n    format('^:{0}:{1}', NAME, TAIL));\n\n  var rx_directive_name = new RegExp(format('^{0}', REF_NAME));\n  var rx_directive_tail = new RegExp(format('^::{0}', TAIL));\n  var rx_substitution_text = new RegExp(format('^\\\\|{0}\\\\|', TEXT1));\n  var rx_substitution_sepa = new RegExp(format('^{0}', SEPA));\n  var rx_substitution_name = new RegExp(format('^{0}', REF_NAME));\n  var rx_substitution_tail = new RegExp(format('^::{0}', TAIL));\n  var rx_link_head = new RegExp(\"^_\");\n  var rx_link_name = new RegExp(format('^{0}|_', REF_NAME));\n  var rx_link_tail = new RegExp(format('^:{0}', TAIL));\n\n  var rx_verbatim = new RegExp('^::\\\\s*$');\n  var rx_examples = new RegExp('^\\\\s+(?:>>>|In \\\\[\\\\d+\\\\]:)\\\\s');\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function to_normal(stream, state) {\n    var token = null;\n\n    if (stream.sol() && stream.match(rx_examples, false)) {\n      change(state, to_mode, {\n        mode: mode_python, local: CodeMirror.startState(mode_python)\n      });\n    } else if (stream.sol() && stream.match(rx_explicit)) {\n      change(state, to_explicit);\n      token = 'meta';\n    } else if (stream.sol() && stream.match(rx_section)) {\n      change(state, to_normal);\n      token = 'header';\n    } else if (phase(state) == rx_role_pre ||\n               stream.match(rx_role_pre, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_normal, context(rx_role_pre, 1));\n        stream.match(/^:/);\n        token = 'meta';\n        break;\n      case 1:\n        change(state, to_normal, context(rx_role_pre, 2));\n        stream.match(rx_NAME);\n        token = 'keyword';\n\n        if (stream.current().match(/^(?:math|latex)/)) {\n          state.tmp_stex = true;\n        }\n        break;\n      case 2:\n        change(state, to_normal, context(rx_role_pre, 3));\n        stream.match(/^:`/);\n        token = 'meta';\n        break;\n      case 3:\n        if (state.tmp_stex) {\n          state.tmp_stex = undefined; state.tmp = {\n            mode: mode_stex, local: CodeMirror.startState(mode_stex)\n          };\n        }\n\n        if (state.tmp) {\n          if (stream.peek() == '`') {\n            change(state, to_normal, context(rx_role_pre, 4));\n            state.tmp = undefined;\n            break;\n          }\n\n          token = state.tmp.mode.token(stream, state.tmp.local);\n          break;\n        }\n\n        change(state, to_normal, context(rx_role_pre, 4));\n        stream.match(rx_TEXT2);\n        token = 'string';\n        break;\n      case 4:\n        change(state, to_normal, context(rx_role_pre, 5));\n        stream.match(/^`/);\n        token = 'meta';\n        break;\n      case 5:\n        change(state, to_normal, context(rx_role_pre, 6));\n        stream.match(rx_TAIL);\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (phase(state) == rx_role_suf ||\n               stream.match(rx_role_suf, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_normal, context(rx_role_suf, 1));\n        stream.match(/^`/);\n        token = 'meta';\n        break;\n      case 1:\n        change(state, to_normal, context(rx_role_suf, 2));\n        stream.match(rx_TEXT2);\n        token = 'string';\n        break;\n      case 2:\n        change(state, to_normal, context(rx_role_suf, 3));\n        stream.match(/^`:/);\n        token = 'meta';\n        break;\n      case 3:\n        change(state, to_normal, context(rx_role_suf, 4));\n        stream.match(rx_NAME);\n        token = 'keyword';\n        break;\n      case 4:\n        change(state, to_normal, context(rx_role_suf, 5));\n        stream.match(/^:/);\n        token = 'meta';\n        break;\n      case 5:\n        change(state, to_normal, context(rx_role_suf, 6));\n        stream.match(rx_TAIL);\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (phase(state) == rx_role || stream.match(rx_role, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_normal, context(rx_role, 1));\n        stream.match(/^:/);\n        token = 'meta';\n        break;\n      case 1:\n        change(state, to_normal, context(rx_role, 2));\n        stream.match(rx_NAME);\n        token = 'keyword';\n        break;\n      case 2:\n        change(state, to_normal, context(rx_role, 3));\n        stream.match(/^:/);\n        token = 'meta';\n        break;\n      case 3:\n        change(state, to_normal, context(rx_role, 4));\n        stream.match(rx_TAIL);\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (phase(state) == rx_substitution_ref ||\n               stream.match(rx_substitution_ref, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_normal, context(rx_substitution_ref, 1));\n        stream.match(rx_substitution_text);\n        token = 'variable-2';\n        break;\n      case 1:\n        change(state, to_normal, context(rx_substitution_ref, 2));\n        if (stream.match(/^_?_?/)) token = 'link';\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (stream.match(rx_footnote_ref)) {\n      change(state, to_normal);\n      token = 'quote';\n    } else if (stream.match(rx_citation_ref)) {\n      change(state, to_normal);\n      token = 'quote';\n    } else if (stream.match(rx_link_ref1)) {\n      change(state, to_normal);\n      if (!stream.peek() || stream.peek().match(/^\\W$/)) {\n        token = 'link';\n      }\n    } else if (phase(state) == rx_link_ref2 ||\n               stream.match(rx_link_ref2, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        if (!stream.peek() || stream.peek().match(/^\\W$/)) {\n          change(state, to_normal, context(rx_link_ref2, 1));\n        } else {\n          stream.match(rx_link_ref2);\n        }\n        break;\n      case 1:\n        change(state, to_normal, context(rx_link_ref2, 2));\n        stream.match(/^`/);\n        token = 'link';\n        break;\n      case 2:\n        change(state, to_normal, context(rx_link_ref2, 3));\n        stream.match(rx_TEXT2);\n        break;\n      case 3:\n        change(state, to_normal, context(rx_link_ref2, 4));\n        stream.match(/^`_/);\n        token = 'link';\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (stream.match(rx_verbatim)) {\n      change(state, to_verbatim);\n    }\n\n    else {\n      if (stream.next()) change(state, to_normal);\n    }\n\n    return token;\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function to_explicit(stream, state) {\n    var token = null;\n\n    if (phase(state) == rx_substitution ||\n        stream.match(rx_substitution, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_explicit, context(rx_substitution, 1));\n        stream.match(rx_substitution_text);\n        token = 'variable-2';\n        break;\n      case 1:\n        change(state, to_explicit, context(rx_substitution, 2));\n        stream.match(rx_substitution_sepa);\n        break;\n      case 2:\n        change(state, to_explicit, context(rx_substitution, 3));\n        stream.match(rx_substitution_name);\n        token = 'keyword';\n        break;\n      case 3:\n        change(state, to_explicit, context(rx_substitution, 4));\n        stream.match(rx_substitution_tail);\n        token = 'meta';\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (phase(state) == rx_directive ||\n               stream.match(rx_directive, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_explicit, context(rx_directive, 1));\n        stream.match(rx_directive_name);\n        token = 'keyword';\n\n        if (stream.current().match(/^(?:math|latex)/))\n          state.tmp_stex = true;\n        else if (stream.current().match(/^python/))\n          state.tmp_py = true;\n        break;\n      case 1:\n        change(state, to_explicit, context(rx_directive, 2));\n        stream.match(rx_directive_tail);\n        token = 'meta';\n\n        if (stream.match(/^latex\\s*$/) || state.tmp_stex) {\n          state.tmp_stex = undefined; change(state, to_mode, {\n            mode: mode_stex, local: CodeMirror.startState(mode_stex)\n          });\n        }\n        break;\n      case 2:\n        change(state, to_explicit, context(rx_directive, 3));\n        if (stream.match(/^python\\s*$/) || state.tmp_py) {\n          state.tmp_py = undefined; change(state, to_mode, {\n            mode: mode_python, local: CodeMirror.startState(mode_python)\n          });\n        }\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (phase(state) == rx_link || stream.match(rx_link, false)) {\n\n      switch (stage(state)) {\n      case 0:\n        change(state, to_explicit, context(rx_link, 1));\n        stream.match(rx_link_head);\n        stream.match(rx_link_name);\n        token = 'link';\n        break;\n      case 1:\n        change(state, to_explicit, context(rx_link, 2));\n        stream.match(rx_link_tail);\n        token = 'meta';\n        break;\n      default:\n        change(state, to_normal);\n      }\n    } else if (stream.match(rx_footnote)) {\n      change(state, to_normal);\n      token = 'quote';\n    } else if (stream.match(rx_citation)) {\n      change(state, to_normal);\n      token = 'quote';\n    }\n\n    else {\n      stream.eatSpace();\n      if (stream.eol()) {\n        change(state, to_normal);\n      } else {\n        stream.skipToEnd();\n        change(state, to_comment);\n        token = 'comment';\n      }\n    }\n\n    return token;\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function to_comment(stream, state) {\n    return as_block(stream, state, 'comment');\n  }\n\n  function to_verbatim(stream, state) {\n    return as_block(stream, state, 'meta');\n  }\n\n  function as_block(stream, state, token) {\n    if (stream.eol() || stream.eatSpace()) {\n      stream.skipToEnd();\n      return token;\n    } else {\n      change(state, to_normal);\n      return null;\n    }\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function to_mode(stream, state) {\n\n    if (state.ctx.mode && state.ctx.local) {\n\n      if (stream.sol()) {\n        if (!stream.eatSpace()) change(state, to_normal);\n        return null;\n      }\n\n      return state.ctx.mode.token(stream, state.ctx.local);\n    }\n\n    change(state, to_normal);\n    return null;\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  function context(phase, stage, mode, local) {\n    return {phase: phase, stage: stage, mode: mode, local: local};\n  }\n\n  function change(state, tok, ctx) {\n    state.tok = tok;\n    state.ctx = ctx || {};\n  }\n\n  function stage(state) {\n    return state.ctx.stage || 0;\n  }\n\n  function phase(state) {\n    return state.ctx.phase;\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  ///////////////////////////////////////////////////////////////////////////\n\n  return {\n    startState: function () {\n      return {tok: to_normal, ctx: context(undefined, 0)};\n    },\n\n    copyState: function (state) {\n      var ctx = state.ctx, tmp = state.tmp;\n      if (ctx.local)\n        ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)};\n      if (tmp)\n        tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)};\n      return {tok: state.tok, ctx: ctx, tmp: tmp};\n    },\n\n    innerMode: function (state) {\n      return state.tmp      ? {state: state.tmp.local, mode: state.tmp.mode}\n      : state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode}\n      : null;\n    },\n\n    token: function (stream, state) {\n      return state.tok(stream, state);\n    }\n  };\n}, 'python', 'stex');\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n\nCodeMirror.defineMIME('text/x-rst', 'rst');\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/ruby/ruby.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction wordObj(words) {\n  var o = {};\n  for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true;\n  return o;\n}\n\nvar keywordList = [\n  \"alias\", \"and\", \"BEGIN\", \"begin\", \"break\", \"case\", \"class\", \"def\", \"defined?\", \"do\", \"else\",\n  \"elsif\", \"END\", \"end\", \"ensure\", \"false\", \"for\", \"if\", \"in\", \"module\", \"next\", \"not\", \"or\",\n  \"redo\", \"rescue\", \"retry\", \"return\", \"self\", \"super\", \"then\", \"true\", \"undef\", \"unless\",\n  \"until\", \"when\", \"while\", \"yield\", \"nil\", \"raise\", \"throw\", \"catch\", \"fail\", \"loop\", \"callcc\",\n  \"caller\", \"lambda\", \"proc\", \"public\", \"protected\", \"private\", \"require\", \"load\",\n  \"require_relative\", \"extend\", \"autoload\", \"__END__\", \"__FILE__\", \"__LINE__\", \"__dir__\"\n], keywords = wordObj(keywordList);\n\nvar indentWords = wordObj([\"def\", \"class\", \"case\", \"for\", \"while\", \"until\", \"module\", \"then\",\n                           \"catch\", \"loop\", \"proc\", \"begin\"]);\nvar dedentWords = wordObj([\"end\", \"until\"]);\nvar opening = {\"[\": \"]\", \"{\": \"}\", \"(\": \")\"};\nvar closing = {\"]\": \"[\", \"}\": \"{\", \")\": \"(\"};\n\nCodeMirror.defineMode(\"ruby\", function(config) {\n  var curPunc;\n\n  function chain(newtok, stream, state) {\n    state.tokenize.push(newtok);\n    return newtok(stream, state);\n  }\n\n  function tokenBase(stream, state) {\n    if (stream.sol() && stream.match(\"=begin\") && stream.eol()) {\n      state.tokenize.push(readBlockComment);\n      return \"comment\";\n    }\n    if (stream.eatSpace()) return null;\n    var ch = stream.next(), m;\n    if (ch == \"`\" || ch == \"'\" || ch == '\"') {\n      return chain(readQuoted(ch, \"string\", ch == '\"' || ch == \"`\"), stream, state);\n    } else if (ch == \"/\") {\n      if (regexpAhead(stream))\n        return chain(readQuoted(ch, \"string-2\", true), stream, state);\n      else\n        return \"operator\";\n    } else if (ch == \"%\") {\n      var style = \"string\", embed = true;\n      if (stream.eat(\"s\")) style = \"atom\";\n      else if (stream.eat(/[WQ]/)) style = \"string\";\n      else if (stream.eat(/[r]/)) style = \"string-2\";\n      else if (stream.eat(/[wxq]/)) { style = \"string\"; embed = false; }\n      var delim = stream.eat(/[^\\w\\s=]/);\n      if (!delim) return \"operator\";\n      if (opening.propertyIsEnumerable(delim)) delim = opening[delim];\n      return chain(readQuoted(delim, style, embed, true), stream, state);\n    } else if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    } else if (ch == \"<\" && (m = stream.match(/^<([-~])[\\`\\\"\\']?([a-zA-Z_?]\\w*)[\\`\\\"\\']?(?:;|$)/))) {\n      return chain(readHereDoc(m[2], m[1]), stream, state);\n    } else if (ch == \"0\") {\n      if (stream.eat(\"x\")) stream.eatWhile(/[\\da-fA-F]/);\n      else if (stream.eat(\"b\")) stream.eatWhile(/[01]/);\n      else stream.eatWhile(/[0-7]/);\n      return \"number\";\n    } else if (/\\d/.test(ch)) {\n      stream.match(/^[\\d_]*(?:\\.[\\d_]+)?(?:[eE][+\\-]?[\\d_]+)?/);\n      return \"number\";\n    } else if (ch == \"?\") {\n      while (stream.match(/^\\\\[CM]-/)) {}\n      if (stream.eat(\"\\\\\")) stream.eatWhile(/\\w/);\n      else stream.next();\n      return \"string\";\n    } else if (ch == \":\") {\n      if (stream.eat(\"'\")) return chain(readQuoted(\"'\", \"atom\", false), stream, state);\n      if (stream.eat('\"')) return chain(readQuoted('\"', \"atom\", true), stream, state);\n\n      // :> :>> :< :<< are valid symbols\n      if (stream.eat(/[\\<\\>]/)) {\n        stream.eat(/[\\<\\>]/);\n        return \"atom\";\n      }\n\n      // :+ :- :/ :* :| :& :! are valid symbols\n      if (stream.eat(/[\\+\\-\\*\\/\\&\\|\\:\\!]/)) {\n        return \"atom\";\n      }\n\n      // Symbols can't start by a digit\n      if (stream.eat(/[a-zA-Z$@_\\xa1-\\uffff]/)) {\n        stream.eatWhile(/[\\w$\\xa1-\\uffff]/);\n        // Only one ? ! = is allowed and only as the last character\n        stream.eat(/[\\?\\!\\=]/);\n        return \"atom\";\n      }\n      return \"operator\";\n    } else if (ch == \"@\" && stream.match(/^@?[a-zA-Z_\\xa1-\\uffff]/)) {\n      stream.eat(\"@\");\n      stream.eatWhile(/[\\w\\xa1-\\uffff]/);\n      return \"variable-2\";\n    } else if (ch == \"$\") {\n      if (stream.eat(/[a-zA-Z_]/)) {\n        stream.eatWhile(/[\\w]/);\n      } else if (stream.eat(/\\d/)) {\n        stream.eat(/\\d/);\n      } else {\n        stream.next(); // Must be a special global like $: or $!\n      }\n      return \"variable-3\";\n    } else if (/[a-zA-Z_\\xa1-\\uffff]/.test(ch)) {\n      stream.eatWhile(/[\\w\\xa1-\\uffff]/);\n      stream.eat(/[\\?\\!]/);\n      if (stream.eat(\":\")) return \"atom\";\n      return \"ident\";\n    } else if (ch == \"|\" && (state.varList || state.lastTok == \"{\" || state.lastTok == \"do\")) {\n      curPunc = \"|\";\n      return null;\n    } else if (/[\\(\\)\\[\\]{}\\\\;]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    } else if (ch == \"-\" && stream.eat(\">\")) {\n      return \"arrow\";\n    } else if (/[=+\\-\\/*:\\.^%<>~|]/.test(ch)) {\n      var more = stream.eatWhile(/[=+\\-\\/*:\\.^%<>~|]/);\n      if (ch == \".\" && !more) curPunc = \".\";\n      return \"operator\";\n    } else {\n      return null;\n    }\n  }\n\n  function regexpAhead(stream) {\n    var start = stream.pos, depth = 0, next, found = false, escaped = false\n    while ((next = stream.next()) != null) {\n      if (!escaped) {\n        if (\"[{(\".indexOf(next) > -1) {\n          depth++\n        } else if (\"]})\".indexOf(next) > -1) {\n          depth--\n          if (depth < 0) break\n        } else if (next == \"/\" && depth == 0) {\n          found = true\n          break\n        }\n        escaped = next == \"\\\\\"\n      } else {\n        escaped = false\n      }\n    }\n    stream.backUp(stream.pos - start)\n    return found\n  }\n\n  function tokenBaseUntilBrace(depth) {\n    if (!depth) depth = 1;\n    return function(stream, state) {\n      if (stream.peek() == \"}\") {\n        if (depth == 1) {\n          state.tokenize.pop();\n          return state.tokenize[state.tokenize.length-1](stream, state);\n        } else {\n          state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth - 1);\n        }\n      } else if (stream.peek() == \"{\") {\n        state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth + 1);\n      }\n      return tokenBase(stream, state);\n    };\n  }\n  function tokenBaseOnce() {\n    var alreadyCalled = false;\n    return function(stream, state) {\n      if (alreadyCalled) {\n        state.tokenize.pop();\n        return state.tokenize[state.tokenize.length-1](stream, state);\n      }\n      alreadyCalled = true;\n      return tokenBase(stream, state);\n    };\n  }\n  function readQuoted(quote, style, embed, unescaped) {\n    return function(stream, state) {\n      var escaped = false, ch;\n\n      if (state.context.type === 'read-quoted-paused') {\n        state.context = state.context.prev;\n        stream.eat(\"}\");\n      }\n\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && (unescaped || !escaped)) {\n          state.tokenize.pop();\n          break;\n        }\n        if (embed && ch == \"#\" && !escaped) {\n          if (stream.eat(\"{\")) {\n            if (quote == \"}\") {\n              state.context = {prev: state.context, type: 'read-quoted-paused'};\n            }\n            state.tokenize.push(tokenBaseUntilBrace());\n            break;\n          } else if (/[@\\$]/.test(stream.peek())) {\n            state.tokenize.push(tokenBaseOnce());\n            break;\n          }\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      return style;\n    };\n  }\n  function readHereDoc(phrase, mayIndent) {\n    return function(stream, state) {\n      if (mayIndent) stream.eatSpace()\n      if (stream.match(phrase)) state.tokenize.pop();\n      else stream.skipToEnd();\n      return \"string\";\n    };\n  }\n  function readBlockComment(stream, state) {\n    if (stream.sol() && stream.match(\"=end\") && stream.eol())\n      state.tokenize.pop();\n    stream.skipToEnd();\n    return \"comment\";\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: [tokenBase],\n              indented: 0,\n              context: {type: \"top\", indented: -config.indentUnit},\n              continuedLine: false,\n              lastTok: null,\n              varList: false};\n    },\n\n    token: function(stream, state) {\n      curPunc = null;\n      if (stream.sol()) state.indented = stream.indentation();\n      var style = state.tokenize[state.tokenize.length-1](stream, state), kwtype;\n      var thisTok = curPunc;\n      if (style == \"ident\") {\n        var word = stream.current();\n        style = state.lastTok == \".\" ? \"property\"\n          : keywords.propertyIsEnumerable(stream.current()) ? \"keyword\"\n          : /^[A-Z]/.test(word) ? \"tag\"\n          : (state.lastTok == \"def\" || state.lastTok == \"class\" || state.varList) ? \"def\"\n          : \"variable\";\n        if (style == \"keyword\") {\n          thisTok = word;\n          if (indentWords.propertyIsEnumerable(word)) kwtype = \"indent\";\n          else if (dedentWords.propertyIsEnumerable(word)) kwtype = \"dedent\";\n          else if ((word == \"if\" || word == \"unless\") && stream.column() == stream.indentation())\n            kwtype = \"indent\";\n          else if (word == \"do\" && state.context.indented < state.indented)\n            kwtype = \"indent\";\n        }\n      }\n      if (curPunc || (style && style != \"comment\")) state.lastTok = thisTok;\n      if (curPunc == \"|\") state.varList = !state.varList;\n\n      if (kwtype == \"indent\" || /[\\(\\[\\{]/.test(curPunc))\n        state.context = {prev: state.context, type: curPunc || style, indented: state.indented};\n      else if ((kwtype == \"dedent\" || /[\\)\\]\\}]/.test(curPunc)) && state.context.prev)\n        state.context = state.context.prev;\n\n      if (stream.eol())\n        state.continuedLine = (curPunc == \"\\\\\" || style == \"operator\");\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize[state.tokenize.length-1] != tokenBase) return CodeMirror.Pass;\n      var firstChar = textAfter && textAfter.charAt(0);\n      var ct = state.context;\n      var closed = ct.type == closing[firstChar] ||\n        ct.type == \"keyword\" && /^(?:end|until|else|elsif|when|rescue)\\b/.test(textAfter);\n      return ct.indented + (closed ? 0 : config.indentUnit) +\n        (state.continuedLine ? config.indentUnit : 0);\n    },\n\n    electricInput: /^\\s*(?:end|rescue|elsif|else|\\})$/,\n    lineComment: \"#\",\n    fold: \"indent\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-ruby\", \"ruby\");\n\nCodeMirror.registerHelper(\"hintWords\", \"ruby\", keywordList);\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/rust/rust.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineSimpleMode(\"rust\",{\n  start: [\n    // string and byte string\n    {regex: /b?\"/, token: \"string\", next: \"string\"},\n    // raw string and raw byte string\n    {regex: /b?r\"/, token: \"string\", next: \"string_raw\"},\n    {regex: /b?r#+\"/, token: \"string\", next: \"string_raw_hash\"},\n    // character\n    {regex: /'(?:[^'\\\\]|\\\\(?:[nrt0'\"]|x[\\da-fA-F]{2}|u\\{[\\da-fA-F]{6}\\}))'/, token: \"string-2\"},\n    // byte\n    {regex: /b'(?:[^']|\\\\(?:['\\\\nrt0]|x[\\da-fA-F]{2}))'/, token: \"string-2\"},\n\n    {regex: /(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/,\n     token: \"number\"},\n    {regex: /(let(?:\\s+mut)?|fn|enum|mod|struct|type|union)(\\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, token: [\"keyword\", null, \"def\"]},\n    {regex: /(?:abstract|alignof|as|async|await|box|break|continue|const|crate|do|dyn|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\\b/, token: \"keyword\"},\n    {regex: /\\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\\b/, token: \"atom\"},\n    {regex: /\\b(?:true|false|Some|None|Ok|Err)\\b/, token: \"builtin\"},\n    {regex: /\\b(fn)(\\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,\n     token: [\"keyword\", null ,\"def\"]},\n    {regex: /#!?\\[.*\\]/, token: \"meta\"},\n    {regex: /\\/\\/.*/, token: \"comment\"},\n    {regex: /\\/\\*/, token: \"comment\", next: \"comment\"},\n    {regex: /[-+\\/*=<>!]+/, token: \"operator\"},\n    {regex: /[a-zA-Z_]\\w*!/,token: \"variable-3\"},\n    {regex: /[a-zA-Z_]\\w*/, token: \"variable\"},\n    {regex: /[\\{\\[\\(]/, indent: true},\n    {regex: /[\\}\\]\\)]/, dedent: true}\n  ],\n  string: [\n    {regex: /\"/, token: \"string\", next: \"start\"},\n    {regex: /(?:[^\\\\\"]|\\\\(?:.|$))*/, token: \"string\"}\n  ],\n  string_raw: [\n    {regex: /\"/, token: \"string\", next: \"start\"},\n    {regex: /[^\"]*/, token: \"string\"}\n  ],\n  string_raw_hash: [\n    {regex: /\"#+/, token: \"string\", next: \"start\"},\n    {regex: /(?:[^\"]|\"(?!#))*/, token: \"string\"}\n  ],\n  comment: [\n    {regex: /.*?\\*\\//, token: \"comment\", next: \"start\"},\n    {regex: /.*/, token: \"comment\"}\n  ],\n  meta: {\n    dontIndentStates: [\"comment\"],\n    electricInput: /^\\s*\\}$/,\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\",\n    fold: \"brace\"\n  }\n});\n\n\nCodeMirror.defineMIME(\"text/x-rustsrc\", \"rust\");\nCodeMirror.defineMIME(\"text/rust\", \"rust\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/sas/sas.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n\n// SAS mode copyright (c) 2016 Jared Dean, SAS Institute\n// Created by Jared Dean\n\n// TODO\n// indent and de-indent\n// identify macro variables\n\n\n//Definitions\n//  comment -- text within * ; or /* */\n//  keyword -- SAS language variable\n//  variable -- macro variables starts with '&' or variable formats\n//  variable-2 -- DATA Step, proc, or macro names\n//  string -- text within ' ' or \" \"\n//  operator -- numeric operator + / - * ** le eq ge ... and so on\n//  builtin -- proc %macro data run mend\n//  atom\n//  def\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"sas\", function () {\n    var words = {};\n    var isDoubleOperatorSym = {\n      eq: 'operator',\n      lt: 'operator',\n      le: 'operator',\n      gt: 'operator',\n      ge: 'operator',\n      \"in\": 'operator',\n      ne: 'operator',\n      or: 'operator'\n    };\n    var isDoubleOperatorChar = /(<=|>=|!=|<>)/;\n    var isSingleOperatorChar = /[=\\(:\\),{}.*<>+\\-\\/^\\[\\]]/;\n\n    // Takes a string of words separated by spaces and adds them as\n    // keys with the value of the first argument 'style'\n    function define(style, string, context) {\n      if (context) {\n        var split = string.split(' ');\n        for (var i = 0; i < split.length; i++) {\n          words[split[i]] = {style: style, state: context};\n        }\n      }\n    }\n    //datastep\n    define('def', 'stack pgm view source debug nesting nolist', ['inDataStep']);\n    define('def', 'if while until for do do; end end; then else cancel', ['inDataStep']);\n    define('def', 'label format _n_ _error_', ['inDataStep']);\n    define('def', 'ALTER BUFNO BUFSIZE CNTLLEV COMPRESS DLDMGACTION ENCRYPT ENCRYPTKEY EXTENDOBSCOUNTER GENMAX GENNUM INDEX LABEL OBSBUF OUTREP PW PWREQ READ REPEMPTY REPLACE REUSE ROLE SORTEDBY SPILL TOBSNO TYPE WRITE FILECLOSE FIRSTOBS IN OBS POINTOBS WHERE WHEREUP IDXNAME IDXWHERE DROP KEEP RENAME', ['inDataStep']);\n    define('def', 'filevar finfo finv fipname fipnamel fipstate first firstobs floor', ['inDataStep']);\n    define('def', 'varfmt varinfmt varlabel varlen varname varnum varray varrayx vartype verify vformat vformatd vformatdx vformatn vformatnx vformatw vformatwx vformatx vinarray vinarrayx vinformat vinformatd vinformatdx vinformatn vinformatnx vinformatw vinformatwx vinformatx vlabel vlabelx vlength vlengthx vname vnamex vnferr vtype vtypex weekday', ['inDataStep']);\n    define('def', 'zipfips zipname zipnamel zipstate', ['inDataStep']);\n    define('def', 'put putc putn', ['inDataStep']);\n    define('builtin', 'data run', ['inDataStep']);\n\n\n    //proc\n    define('def', 'data', ['inProc']);\n\n    // flow control for macros\n    define('def', '%if %end %end; %else %else; %do %do; %then', ['inMacro']);\n\n    //everywhere\n    define('builtin', 'proc run; quit; libname filename %macro %mend option options', ['ALL']);\n\n    define('def', 'footnote title libname ods', ['ALL']);\n    define('def', '%let %put %global %sysfunc %eval ', ['ALL']);\n    // automatic macro variables http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a003167023.htm\n    define('variable', '&sysbuffr &syscc &syscharwidth &syscmd &sysdate &sysdate9 &sysday &sysdevic &sysdmg &sysdsn &sysencoding &sysenv &syserr &syserrortext &sysfilrc &syshostname &sysindex &sysinfo &sysjobid &syslast &syslckrc &syslibrc &syslogapplname &sysmacroname &sysmenv &sysmsg &sysncpu &sysodspath &sysparm &syspbuff &sysprocessid &sysprocessname &sysprocname &sysrc &sysscp &sysscpl &sysscpl &syssite &sysstartid &sysstartname &systcpiphostname &systime &sysuserid &sysver &sysvlong &sysvlong4 &syswarningtext', ['ALL']);\n\n    //footnote[1-9]? title[1-9]?\n\n    //options statement\n    define('def', 'source2 nosource2 page pageno pagesize', ['ALL']);\n\n    //proc and datastep\n    define('def', '_all_ _character_ _cmd_ _freq_ _i_ _infile_ _last_ _msg_ _null_ _numeric_ _temporary_ _type_ abort abs addr adjrsq airy alpha alter altlog altprint and arcos array arsin as atan attrc attrib attrn authserver autoexec awscontrol awsdef awsmenu awsmenumerge awstitle backward band base betainv between blocksize blshift bnot bor brshift bufno bufsize bxor by byerr byline byte calculated call cards cards4 catcache cbufno cdf ceil center cexist change chisq cinv class cleanup close cnonct cntllev coalesce codegen col collate collin column comamid comaux1 comaux2 comdef compbl compound compress config continue convert cos cosh cpuid create cross crosstab css curobs cv daccdb daccdbsl daccsl daccsyd dacctab dairy datalines datalines4 datejul datepart datetime day dbcslang dbcstype dclose ddfm ddm delete delimiter depdb depdbsl depsl depsyd deptab dequote descending descript design= device dflang dhms dif digamma dim dinfo display distinct dkricond dkrocond dlm dnum do dopen doptname doptnum dread drop dropnote dsname dsnferr echo else emaildlg emailid emailpw emailserver emailsys encrypt end endsas engine eof eov erf erfc error errorcheck errors exist exp fappend fclose fcol fdelete feedback fetch fetchobs fexist fget file fileclose fileexist filefmt filename fileref  fmterr fmtsearch fnonct fnote font fontalias  fopen foptname foptnum force formatted formchar formdelim formdlim forward fpoint fpos fput fread frewind frlen from fsep fuzz fwrite gaminv gamma getoption getvarc getvarn go goto group gwindow hbar hbound helpenv helploc hms honorappearance hosthelp hostprint hour hpct html hvar ibessel ibr id if index indexc indexw initcmd initstmt inner input inputc inputn inr insert int intck intnx into intrr invaliddata irr is jbessel join juldate keep kentb kurtosis label lag last lbound leave left length levels lgamma lib  library libref line linesize link list log log10 log2 logpdf logpmf logsdf lostcard lowcase lrecl ls macro macrogen maps mautosource max maxdec maxr mdy mean measures median memtype merge merror min minute missing missover mlogic mod mode model modify month mopen mort mprint mrecall msglevel msymtabmax mvarsize myy n nest netpv new news nmiss no nobatch nobs nocaps nocardimage nocenter nocharcode nocmdmac nocol nocum nodate nodbcs nodetails nodmr nodms nodmsbatch nodup nodupkey noduplicates noechoauto noequals noerrorabend noexitwindows nofullstimer noicon noimplmac noint nolist noloadlist nomiss nomlogic nomprint nomrecall nomsgcase nomstored nomultenvappl nonotes nonumber noobs noovp nopad nopercent noprint noprintinit normal norow norsasuser nosetinit  nosplash nosymbolgen note notes notitle notitles notsorted noverbose noxsync noxwait npv null number numkeys nummousekeys nway obs  on open     order ordinal otherwise out outer outp= output over ovp p(1 5 10 25 50 75 90 95 99) pad pad2  paired parm parmcards path pathdll pathname pdf peek peekc pfkey pmf point poisson poke position printer probbeta probbnml probchi probf probgam probhypr probit probnegb probnorm probsig probt procleave prt ps  pw pwreq qtr quote r ranbin rancau random ranexp rangam range ranks rannor ranpoi rantbl rantri ranuni rcorr read recfm register regr remote remove rename repeat repeated replace resolve retain return reuse reverse rewind right round rsquare rtf rtrace rtraceloc s s2 samploc sasautos sascontrol sasfrscr sasmsg sasmstore sasscript sasuser saving scan sdf second select selection separated seq serror set setcomm setot sign simple sin sinh siteinfo skewness skip sle sls sortedby sortpgm sortseq sortsize soundex  spedis splashlocation split spool sqrt start std stderr stdin stfips stimer stname stnamel stop stopover sub subgroup subpopn substr sum sumwgt symbol symbolgen symget symput sysget sysin sysleave sysmsg sysparm sysprint sysprintfont sysprod sysrc system t table tables tan tanh tapeclose tbufsize terminal test then timepart tinv  tnonct to today tol tooldef totper transformout translate trantab tranwrd trigamma trim trimn trunc truncover type unformatted uniform union until upcase update user usericon uss validate value var  weight when where while wincharset window work workinit workterm write wsum xsync xwait yearcutoff yes yyq  min max', ['inDataStep', 'inProc']);\n    define('operator', 'and not ', ['inDataStep', 'inProc']);\n\n    // Main function\n    function tokenize(stream, state) {\n      // Finally advance the stream\n      var ch = stream.next();\n\n      // BLOCKCOMMENT\n      if (ch === '/' && stream.eat('*')) {\n        state.continueComment = true;\n        return \"comment\";\n      } else if (state.continueComment === true) { // in comment block\n        //comment ends at the beginning of the line\n        if (ch === '*' && stream.peek() === '/') {\n          stream.next();\n          state.continueComment = false;\n        } else if (stream.skipTo('*')) { //comment is potentially later in line\n          stream.skipTo('*');\n          stream.next();\n          if (stream.eat('/'))\n            state.continueComment = false;\n        } else {\n          stream.skipToEnd();\n        }\n        return \"comment\";\n      }\n\n      if (ch == \"*\" && stream.column() == stream.indentation()) {\n        stream.skipToEnd()\n        return \"comment\"\n      }\n\n      // DoubleOperator match\n      var doubleOperator = ch + stream.peek();\n\n      if ((ch === '\"' || ch === \"'\") && !state.continueString) {\n        state.continueString = ch\n        return \"string\"\n      } else if (state.continueString) {\n        if (state.continueString == ch) {\n          state.continueString = null;\n        } else if (stream.skipTo(state.continueString)) {\n          // quote found on this line\n          stream.next();\n          state.continueString = null;\n        } else {\n          stream.skipToEnd();\n        }\n        return \"string\";\n      } else if (state.continueString !== null && stream.eol()) {\n        stream.skipTo(state.continueString) || stream.skipToEnd();\n        return \"string\";\n      } else if (/[\\d\\.]/.test(ch)) { //find numbers\n        if (ch === \".\")\n          stream.match(/^[0-9]+([eE][\\-+]?[0-9]+)?/);\n        else if (ch === \"0\")\n          stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/);\n        else\n          stream.match(/^[0-9]*\\.?[0-9]*([eE][\\-+]?[0-9]+)?/);\n        return \"number\";\n      } else if (isDoubleOperatorChar.test(ch + stream.peek())) { // TWO SYMBOL TOKENS\n        stream.next();\n        return \"operator\";\n      } else if (isDoubleOperatorSym.hasOwnProperty(doubleOperator)) {\n        stream.next();\n        if (stream.peek() === ' ')\n          return isDoubleOperatorSym[doubleOperator.toLowerCase()];\n      } else if (isSingleOperatorChar.test(ch)) { // SINGLE SYMBOL TOKENS\n        return \"operator\";\n      }\n\n      // Matches one whole word -- even if the word is a character\n      var word;\n      if (stream.match(/[%&;\\w]+/, false) != null) {\n        word = ch + stream.match(/[%&;\\w]+/, true);\n        if (/&/.test(word)) return 'variable'\n      } else {\n        word = ch;\n      }\n      // the word after DATA PROC or MACRO\n      if (state.nextword) {\n        stream.match(/[\\w]+/);\n        // match memname.libname\n        if (stream.peek() === '.') stream.skipTo(' ');\n        state.nextword = false;\n        return 'variable-2';\n      }\n\n      word = word.toLowerCase()\n      // Are we in a DATA Step?\n      if (state.inDataStep) {\n        if (word === 'run;' || stream.match(/run\\s;/)) {\n          state.inDataStep = false;\n          return 'builtin';\n        }\n        // variable formats\n        if ((word) && stream.next() === '.') {\n          //either a format or libname.memname\n          if (/\\w/.test(stream.peek())) return 'variable-2';\n          else return 'variable';\n        }\n        // do we have a DATA Step keyword\n        if (word && words.hasOwnProperty(word) &&\n            (words[word].state.indexOf(\"inDataStep\") !== -1 ||\n             words[word].state.indexOf(\"ALL\") !== -1)) {\n          //backup to the start of the word\n          if (stream.start < stream.pos)\n            stream.backUp(stream.pos - stream.start);\n          //advance the length of the word and return\n          for (var i = 0; i < word.length; ++i) stream.next();\n          return words[word].style;\n        }\n      }\n      // Are we in an Proc statement?\n      if (state.inProc) {\n        if (word === 'run;' || word === 'quit;') {\n          state.inProc = false;\n          return 'builtin';\n        }\n        // do we have a proc keyword\n        if (word && words.hasOwnProperty(word) &&\n            (words[word].state.indexOf(\"inProc\") !== -1 ||\n             words[word].state.indexOf(\"ALL\") !== -1)) {\n          stream.match(/[\\w]+/);\n          return words[word].style;\n        }\n      }\n      // Are we in a Macro statement?\n      if (state.inMacro) {\n        if (word === '%mend') {\n          if (stream.peek() === ';') stream.next();\n          state.inMacro = false;\n          return 'builtin';\n        }\n        if (word && words.hasOwnProperty(word) &&\n            (words[word].state.indexOf(\"inMacro\") !== -1 ||\n             words[word].state.indexOf(\"ALL\") !== -1)) {\n          stream.match(/[\\w]+/);\n          return words[word].style;\n        }\n\n        return 'atom';\n      }\n      // Do we have Keywords specific words?\n      if (word && words.hasOwnProperty(word)) {\n        // Negates the initial next()\n        stream.backUp(1);\n        // Actually move the stream\n        stream.match(/[\\w]+/);\n        if (word === 'data' && /=/.test(stream.peek()) === false) {\n          state.inDataStep = true;\n          state.nextword = true;\n          return 'builtin';\n        }\n        if (word === 'proc') {\n          state.inProc = true;\n          state.nextword = true;\n          return 'builtin';\n        }\n        if (word === '%macro') {\n          state.inMacro = true;\n          state.nextword = true;\n          return 'builtin';\n        }\n        if (/title[1-9]/.test(word)) return 'def';\n\n        if (word === 'footnote') {\n          stream.eat(/[1-9]/);\n          return 'def';\n        }\n\n        // Returns their value as state in the prior define methods\n        if (state.inDataStep === true && words[word].state.indexOf(\"inDataStep\") !== -1)\n          return words[word].style;\n        if (state.inProc === true && words[word].state.indexOf(\"inProc\") !== -1)\n          return words[word].style;\n        if (state.inMacro === true && words[word].state.indexOf(\"inMacro\") !== -1)\n          return words[word].style;\n        if (words[word].state.indexOf(\"ALL\") !== -1)\n          return words[word].style;\n        return null;\n      }\n      // Unrecognized syntax\n      return null;\n    }\n\n    return {\n      startState: function () {\n        return {\n          inDataStep: false,\n          inProc: false,\n          inMacro: false,\n          nextword: false,\n          continueString: null,\n          continueComment: false\n        };\n      },\n      token: function (stream, state) {\n        // Strip the spaces, but regex will account for them either way\n        if (stream.eatSpace()) return null;\n        // Go through the main process\n        return tokenize(stream, state);\n      },\n\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\"\n    };\n\n  });\n\n  CodeMirror.defineMIME(\"text/x-sas\", \"sas\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/sass/sass.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../css/css\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../css/css\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"sass\", function(config) {\n  var cssMode = CodeMirror.mimeModes[\"text/css\"];\n  var propertyKeywords = cssMode.propertyKeywords || {},\n      colorKeywords = cssMode.colorKeywords || {},\n      valueKeywords = cssMode.valueKeywords || {},\n      fontProperties = cssMode.fontProperties || {};\n\n  function tokenRegexp(words) {\n    return new RegExp(\"^\" + words.join(\"|\"));\n  }\n\n  var keywords = [\"true\", \"false\", \"null\", \"auto\"];\n  var keywordsRegexp = new RegExp(\"^\" + keywords.join(\"|\"));\n\n  var operators = [\"\\\\(\", \"\\\\)\", \"=\", \">\", \"<\", \"==\", \">=\", \"<=\", \"\\\\+\", \"-\",\n                   \"\\\\!=\", \"/\", \"\\\\*\", \"%\", \"and\", \"or\", \"not\", \";\",\"\\\\{\",\"\\\\}\",\":\"];\n  var opRegexp = tokenRegexp(operators);\n\n  var pseudoElementsRegexp = /^::?[a-zA-Z_][\\w\\-]*/;\n\n  var word;\n\n  function isEndLine(stream) {\n    return !stream.peek() || stream.match(/\\s+$/, false);\n  }\n\n  function urlTokens(stream, state) {\n    var ch = stream.peek();\n\n    if (ch === \")\") {\n      stream.next();\n      state.tokenizer = tokenBase;\n      return \"operator\";\n    } else if (ch === \"(\") {\n      stream.next();\n      stream.eatSpace();\n\n      return \"operator\";\n    } else if (ch === \"'\" || ch === '\"') {\n      state.tokenizer = buildStringTokenizer(stream.next());\n      return \"string\";\n    } else {\n      state.tokenizer = buildStringTokenizer(\")\", false);\n      return \"string\";\n    }\n  }\n  function comment(indentation, multiLine) {\n    return function(stream, state) {\n      if (stream.sol() && stream.indentation() <= indentation) {\n        state.tokenizer = tokenBase;\n        return tokenBase(stream, state);\n      }\n\n      if (multiLine && stream.skipTo(\"*/\")) {\n        stream.next();\n        stream.next();\n        state.tokenizer = tokenBase;\n      } else {\n        stream.skipToEnd();\n      }\n\n      return \"comment\";\n    };\n  }\n\n  function buildStringTokenizer(quote, greedy) {\n    if (greedy == null) { greedy = true; }\n\n    function stringTokenizer(stream, state) {\n      var nextChar = stream.next();\n      var peekChar = stream.peek();\n      var previousChar = stream.string.charAt(stream.pos-2);\n\n      var endingString = ((nextChar !== \"\\\\\" && peekChar === quote) || (nextChar === quote && previousChar !== \"\\\\\"));\n\n      if (endingString) {\n        if (nextChar !== quote && greedy) { stream.next(); }\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        state.tokenizer = tokenBase;\n        return \"string\";\n      } else if (nextChar === \"#\" && peekChar === \"{\") {\n        state.tokenizer = buildInterpolationTokenizer(stringTokenizer);\n        stream.next();\n        return \"operator\";\n      } else {\n        return \"string\";\n      }\n    }\n\n    return stringTokenizer;\n  }\n\n  function buildInterpolationTokenizer(currentTokenizer) {\n    return function(stream, state) {\n      if (stream.peek() === \"}\") {\n        stream.next();\n        state.tokenizer = currentTokenizer;\n        return \"operator\";\n      } else {\n        return tokenBase(stream, state);\n      }\n    };\n  }\n\n  function indent(state) {\n    if (state.indentCount == 0) {\n      state.indentCount++;\n      var lastScopeOffset = state.scopes[0].offset;\n      var currentOffset = lastScopeOffset + config.indentUnit;\n      state.scopes.unshift({ offset:currentOffset });\n    }\n  }\n\n  function dedent(state) {\n    if (state.scopes.length == 1) return;\n\n    state.scopes.shift();\n  }\n\n  function tokenBase(stream, state) {\n    var ch = stream.peek();\n\n    // Comment\n    if (stream.match(\"/*\")) {\n      state.tokenizer = comment(stream.indentation(), true);\n      return state.tokenizer(stream, state);\n    }\n    if (stream.match(\"//\")) {\n      state.tokenizer = comment(stream.indentation(), false);\n      return state.tokenizer(stream, state);\n    }\n\n    // Interpolation\n    if (stream.match(\"#{\")) {\n      state.tokenizer = buildInterpolationTokenizer(tokenBase);\n      return \"operator\";\n    }\n\n    // Strings\n    if (ch === '\"' || ch === \"'\") {\n      stream.next();\n      state.tokenizer = buildStringTokenizer(ch);\n      return \"string\";\n    }\n\n    if(!state.cursorHalf){// state.cursorHalf === 0\n    // first half i.e. before : for key-value pairs\n    // including selectors\n\n      if (ch === \"-\") {\n        if (stream.match(/^-\\w+-/)) {\n          return \"meta\";\n        }\n      }\n\n      if (ch === \".\") {\n        stream.next();\n        if (stream.match(/^[\\w-]+/)) {\n          indent(state);\n          return \"qualifier\";\n        } else if (stream.peek() === \"#\") {\n          indent(state);\n          return \"tag\";\n        }\n      }\n\n      if (ch === \"#\") {\n        stream.next();\n        // ID selectors\n        if (stream.match(/^[\\w-]+/)) {\n          indent(state);\n          return \"builtin\";\n        }\n        if (stream.peek() === \"#\") {\n          indent(state);\n          return \"tag\";\n        }\n      }\n\n      // Variables\n      if (ch === \"$\") {\n        stream.next();\n        stream.eatWhile(/[\\w-]/);\n        return \"variable-2\";\n      }\n\n      // Numbers\n      if (stream.match(/^-?[0-9\\.]+/))\n        return \"number\";\n\n      // Units\n      if (stream.match(/^(px|em|in)\\b/))\n        return \"unit\";\n\n      if (stream.match(keywordsRegexp))\n        return \"keyword\";\n\n      if (stream.match(/^url/) && stream.peek() === \"(\") {\n        state.tokenizer = urlTokens;\n        return \"atom\";\n      }\n\n      if (ch === \"=\") {\n        // Match shortcut mixin definition\n        if (stream.match(/^=[\\w-]+/)) {\n          indent(state);\n          return \"meta\";\n        }\n      }\n\n      if (ch === \"+\") {\n        // Match shortcut mixin definition\n        if (stream.match(/^\\+[\\w-]+/)){\n          return \"variable-3\";\n        }\n      }\n\n      if(ch === \"@\"){\n        if(stream.match('@extend')){\n          if(!stream.match(/\\s*[\\w]/))\n            dedent(state);\n        }\n      }\n\n\n      // Indent Directives\n      if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) {\n        indent(state);\n        return \"def\";\n      }\n\n      // Other Directives\n      if (ch === \"@\") {\n        stream.next();\n        stream.eatWhile(/[\\w-]/);\n        return \"def\";\n      }\n\n      if (stream.eatWhile(/[\\w-]/)){\n        if(stream.match(/ *: *[\\w-\\+\\$#!\\(\"']/,false)){\n          word = stream.current().toLowerCase();\n          var prop = state.prevProp + \"-\" + word;\n          if (propertyKeywords.hasOwnProperty(prop)) {\n            return \"property\";\n          } else if (propertyKeywords.hasOwnProperty(word)) {\n            state.prevProp = word;\n            return \"property\";\n          } else if (fontProperties.hasOwnProperty(word)) {\n            return \"property\";\n          }\n          return \"tag\";\n        }\n        else if(stream.match(/ *:/,false)){\n          indent(state);\n          state.cursorHalf = 1;\n          state.prevProp = stream.current().toLowerCase();\n          return \"property\";\n        }\n        else if(stream.match(/ *,/,false)){\n          return \"tag\";\n        }\n        else{\n          indent(state);\n          return \"tag\";\n        }\n      }\n\n      if(ch === \":\"){\n        if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element\n          return \"variable-3\";\n        }\n        stream.next();\n        state.cursorHalf=1;\n        return \"operator\";\n      }\n\n    } // cursorHalf===0 ends here\n    else{\n\n      if (ch === \"#\") {\n        stream.next();\n        // Hex numbers\n        if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){\n          if (isEndLine(stream)) {\n            state.cursorHalf = 0;\n          }\n          return \"number\";\n        }\n      }\n\n      // Numbers\n      if (stream.match(/^-?[0-9\\.]+/)){\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"number\";\n      }\n\n      // Units\n      if (stream.match(/^(px|em|in)\\b/)){\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"unit\";\n      }\n\n      if (stream.match(keywordsRegexp)){\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"keyword\";\n      }\n\n      if (stream.match(/^url/) && stream.peek() === \"(\") {\n        state.tokenizer = urlTokens;\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"atom\";\n      }\n\n      // Variables\n      if (ch === \"$\") {\n        stream.next();\n        stream.eatWhile(/[\\w-]/);\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"variable-2\";\n      }\n\n      // bang character for !important, !default, etc.\n      if (ch === \"!\") {\n        stream.next();\n        state.cursorHalf = 0;\n        return stream.match(/^[\\w]+/) ? \"keyword\": \"operator\";\n      }\n\n      if (stream.match(opRegexp)){\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        return \"operator\";\n      }\n\n      // attributes\n      if (stream.eatWhile(/[\\w-]/)) {\n        if (isEndLine(stream)) {\n          state.cursorHalf = 0;\n        }\n        word = stream.current().toLowerCase();\n        if (valueKeywords.hasOwnProperty(word)) {\n          return \"atom\";\n        } else if (colorKeywords.hasOwnProperty(word)) {\n          return \"keyword\";\n        } else if (propertyKeywords.hasOwnProperty(word)) {\n          state.prevProp = stream.current().toLowerCase();\n          return \"property\";\n        } else {\n          return \"tag\";\n        }\n      }\n\n      //stream.eatSpace();\n      if (isEndLine(stream)) {\n        state.cursorHalf = 0;\n        return null;\n      }\n\n    } // else ends here\n\n    if (stream.match(opRegexp))\n      return \"operator\";\n\n    // If we haven't returned by now, we move 1 character\n    // and return an error\n    stream.next();\n    return null;\n  }\n\n  function tokenLexer(stream, state) {\n    if (stream.sol()) state.indentCount = 0;\n    var style = state.tokenizer(stream, state);\n    var current = stream.current();\n\n    if (current === \"@return\" || current === \"}\"){\n      dedent(state);\n    }\n\n    if (style !== null) {\n      var startOfToken = stream.pos - current.length;\n\n      var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount);\n\n      var newScopes = [];\n\n      for (var i = 0; i < state.scopes.length; i++) {\n        var scope = state.scopes[i];\n\n        if (scope.offset <= withCurrentIndent)\n          newScopes.push(scope);\n      }\n\n      state.scopes = newScopes;\n    }\n\n\n    return style;\n  }\n\n  return {\n    startState: function() {\n      return {\n        tokenizer: tokenBase,\n        scopes: [{offset: 0, type: \"sass\"}],\n        indentCount: 0,\n        cursorHalf: 0,  // cursor half tells us if cursor lies after (1)\n                        // or before (0) colon (well... more or less)\n        definedVars: [],\n        definedMixins: []\n      };\n    },\n    token: function(stream, state) {\n      var style = tokenLexer(stream, state);\n\n      state.lastToken = { style: style, content: stream.current() };\n\n      return style;\n    },\n\n    indent: function(state) {\n      return state.scopes[0].offset;\n    },\n\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\",\n    fold: \"indent\"\n  };\n}, \"css\");\n\nCodeMirror.defineMIME(\"text/x-sass\", \"sass\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/scheme/scheme.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Author: Koh Zi Han, based on implementation by Koh Zi Chun\n * Improved by: Jakub T. Jankiewicz\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"scheme\", function () {\n    var BUILTIN = \"builtin\", COMMENT = \"comment\", STRING = \"string\",\n        SYMBOL = \"symbol\", ATOM = \"atom\", NUMBER = \"number\", BRACKET = \"bracket\";\n    var INDENT_WORD_SKIP = 2;\n\n    function makeKeywords(str) {\n        var obj = {}, words = str.split(\" \");\n        for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n        return obj;\n    }\n\n    var keywords = makeKeywords(\"λ case-lambda call/cc class cond-expand define-class define-values exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax define-macro defmacro delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char<? char=? char>=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci<? string-ci=? string-ci>=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string<? string=? string>=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?\");\n    var indentKeys = makeKeywords(\"define let letrec let* lambda define-macro defmacro let-syntax letrec-syntax let-values let*-values define-syntax syntax-rules define-values when unless\");\n\n    function stateStack(indent, type, prev) { // represents a state stack object\n        this.indent = indent;\n        this.type = type;\n        this.prev = prev;\n    }\n\n    function pushStack(state, indent, type) {\n        state.indentStack = new stateStack(indent, type, state.indentStack);\n    }\n\n    function popStack(state) {\n        state.indentStack = state.indentStack.prev;\n    }\n\n    var binaryMatcher = new RegExp(/^(?:[-+]i|[-+][01]+#*(?:\\/[01]+#*)?i|[-+]?[01]+#*(?:\\/[01]+#*)?@[-+]?[01]+#*(?:\\/[01]+#*)?|[-+]?[01]+#*(?:\\/[01]+#*)?[-+](?:[01]+#*(?:\\/[01]+#*)?)?i|[-+]?[01]+#*(?:\\/[01]+#*)?)(?=[()\\s;\"]|$)/i);\n    var octalMatcher = new RegExp(/^(?:[-+]i|[-+][0-7]+#*(?:\\/[0-7]+#*)?i|[-+]?[0-7]+#*(?:\\/[0-7]+#*)?@[-+]?[0-7]+#*(?:\\/[0-7]+#*)?|[-+]?[0-7]+#*(?:\\/[0-7]+#*)?[-+](?:[0-7]+#*(?:\\/[0-7]+#*)?)?i|[-+]?[0-7]+#*(?:\\/[0-7]+#*)?)(?=[()\\s;\"]|$)/i);\n    var hexMatcher = new RegExp(/^(?:[-+]i|[-+][\\da-f]+#*(?:\\/[\\da-f]+#*)?i|[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?@[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?|[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?[-+](?:[\\da-f]+#*(?:\\/[\\da-f]+#*)?)?i|[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?)(?=[()\\s;\"]|$)/i);\n    var decimalMatcher = new RegExp(/^(?:[-+]i|[-+](?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)i|[-+]?(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)@[-+]?(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)|[-+]?(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)[-+](?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)?i|(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*))(?=[()\\s;\"]|$)/i);\n\n    function isBinaryNumber (stream) {\n        return stream.match(binaryMatcher);\n    }\n\n    function isOctalNumber (stream) {\n        return stream.match(octalMatcher);\n    }\n\n    function isDecimalNumber (stream, backup) {\n        if (backup === true) {\n            stream.backUp(1);\n        }\n        return stream.match(decimalMatcher);\n    }\n\n    function isHexNumber (stream) {\n        return stream.match(hexMatcher);\n    }\n\n    function processEscapedSequence(stream, options) {\n        var next, escaped = false;\n        while ((next = stream.next()) != null) {\n            if (next == options.token && !escaped) {\n\n                options.state.mode = false;\n                break;\n            }\n            escaped = !escaped && next == \"\\\\\";\n        }\n    }\n\n    return {\n        startState: function () {\n            return {\n                indentStack: null,\n                indentation: 0,\n                mode: false,\n                sExprComment: false,\n                sExprQuote: false\n            };\n        },\n\n        token: function (stream, state) {\n            if (state.indentStack == null && stream.sol()) {\n                // update indentation, but only if indentStack is empty\n                state.indentation = stream.indentation();\n            }\n\n            // skip spaces\n            if (stream.eatSpace()) {\n                return null;\n            }\n            var returnType = null;\n\n            switch(state.mode){\n                case \"string\": // multi-line string parsing mode\n                    processEscapedSequence(stream, {\n                        token: \"\\\"\",\n                        state: state\n                    });\n                    returnType = STRING; // continue on in scheme-string mode\n                    break;\n                case \"symbol\": // escape symbol\n                    processEscapedSequence(stream, {\n                        token: \"|\",\n                        state: state\n                    });\n                    returnType = SYMBOL; // continue on in scheme-symbol mode\n                    break;\n                case \"comment\": // comment parsing mode\n                    var next, maybeEnd = false;\n                    while ((next = stream.next()) != null) {\n                        if (next == \"#\" && maybeEnd) {\n\n                            state.mode = false;\n                            break;\n                        }\n                        maybeEnd = (next == \"|\");\n                    }\n                    returnType = COMMENT;\n                    break;\n                case \"s-expr-comment\": // s-expr commenting mode\n                    state.mode = false;\n                    if(stream.peek() == \"(\" || stream.peek() == \"[\"){\n                        // actually start scheme s-expr commenting mode\n                        state.sExprComment = 0;\n                    }else{\n                        // if not we just comment the entire of the next token\n                        stream.eatWhile(/[^\\s\\(\\)\\[\\]]/); // eat symbol atom\n                        returnType = COMMENT;\n                        break;\n                    }\n                default: // default parsing mode\n                    var ch = stream.next();\n\n                    if (ch == \"\\\"\") {\n                        state.mode = \"string\";\n                        returnType = STRING;\n\n                    } else if (ch == \"'\") {\n                        if (stream.peek() == \"(\" || stream.peek() == \"[\"){\n                            if (typeof state.sExprQuote != \"number\") {\n                                state.sExprQuote = 0;\n                            } // else already in a quoted expression\n                            returnType = ATOM;\n                        } else {\n                            stream.eatWhile(/[\\w_\\-!$%&*+\\.\\/:<=>?@\\^~]/);\n                            returnType = ATOM;\n                        }\n                    } else if (ch == '|') {\n                        state.mode = \"symbol\";\n                        returnType = SYMBOL;\n                    } else if (ch == '#') {\n                        if (stream.eat(\"|\")) {                    // Multi-line comment\n                            state.mode = \"comment\"; // toggle to comment mode\n                            returnType = COMMENT;\n                        } else if (stream.eat(/[tf]/i)) {            // #t/#f (atom)\n                            returnType = ATOM;\n                        } else if (stream.eat(';')) {                // S-Expr comment\n                            state.mode = \"s-expr-comment\";\n                            returnType = COMMENT;\n                        } else {\n                            var numTest = null, hasExactness = false, hasRadix = true;\n                            if (stream.eat(/[ei]/i)) {\n                                hasExactness = true;\n                            } else {\n                                stream.backUp(1);       // must be radix specifier\n                            }\n                            if (stream.match(/^#b/i)) {\n                                numTest = isBinaryNumber;\n                            } else if (stream.match(/^#o/i)) {\n                                numTest = isOctalNumber;\n                            } else if (stream.match(/^#x/i)) {\n                                numTest = isHexNumber;\n                            } else if (stream.match(/^#d/i)) {\n                                numTest = isDecimalNumber;\n                            } else if (stream.match(/^[-+0-9.]/, false)) {\n                                hasRadix = false;\n                                numTest = isDecimalNumber;\n                            // re-consume the initial # if all matches failed\n                            } else if (!hasExactness) {\n                                stream.eat('#');\n                            }\n                            if (numTest != null) {\n                                if (hasRadix && !hasExactness) {\n                                    // consume optional exactness after radix\n                                    stream.match(/^#[ei]/i);\n                                }\n                                if (numTest(stream))\n                                    returnType = NUMBER;\n                            }\n                        }\n                    } else if (/^[-+0-9.]/.test(ch) && isDecimalNumber(stream, true)) { // match non-prefixed number, must be decimal\n                        returnType = NUMBER;\n                    } else if (ch == \";\") { // comment\n                        stream.skipToEnd(); // rest of the line is a comment\n                        returnType = COMMENT;\n                    } else if (ch == \"(\" || ch == \"[\") {\n                      var keyWord = ''; var indentTemp = stream.column(), letter;\n                        /**\n                        Either\n                        (indent-word ..\n                        (non-indent-word ..\n                        (;something else, bracket, etc.\n                        */\n\n                        while ((letter = stream.eat(/[^\\s\\(\\[\\;\\)\\]]/)) != null) {\n                            keyWord += letter;\n                        }\n\n                        if (keyWord.length > 0 && indentKeys.propertyIsEnumerable(keyWord)) { // indent-word\n\n                            pushStack(state, indentTemp + INDENT_WORD_SKIP, ch);\n                        } else { // non-indent word\n                            // we continue eating the spaces\n                            stream.eatSpace();\n                            if (stream.eol() || stream.peek() == \";\") {\n                                // nothing significant after\n                                // we restart indentation 1 space after\n                                pushStack(state, indentTemp + 1, ch);\n                            } else {\n                                pushStack(state, indentTemp + stream.current().length, ch); // else we match\n                            }\n                        }\n                        stream.backUp(stream.current().length - 1); // undo all the eating\n\n                        if(typeof state.sExprComment == \"number\") state.sExprComment++;\n                        if(typeof state.sExprQuote == \"number\") state.sExprQuote++;\n\n                        returnType = BRACKET;\n                    } else if (ch == \")\" || ch == \"]\") {\n                        returnType = BRACKET;\n                        if (state.indentStack != null && state.indentStack.type == (ch == \")\" ? \"(\" : \"[\")) {\n                            popStack(state);\n\n                            if(typeof state.sExprComment == \"number\"){\n                                if(--state.sExprComment == 0){\n                                    returnType = COMMENT; // final closing bracket\n                                    state.sExprComment = false; // turn off s-expr commenting mode\n                                }\n                            }\n                            if(typeof state.sExprQuote == \"number\"){\n                                if(--state.sExprQuote == 0){\n                                    returnType = ATOM; // final closing bracket\n                                    state.sExprQuote = false; // turn off s-expr quote mode\n                                }\n                            }\n                        }\n                    } else {\n                        stream.eatWhile(/[\\w_\\-!$%&*+\\.\\/:<=>?@\\^~]/);\n\n                        if (keywords && keywords.propertyIsEnumerable(stream.current())) {\n                            returnType = BUILTIN;\n                        } else returnType = \"variable\";\n                    }\n            }\n            return (typeof state.sExprComment == \"number\") ? COMMENT : ((typeof state.sExprQuote == \"number\") ? ATOM : returnType);\n        },\n\n        indent: function (state) {\n            if (state.indentStack == null) return state.indentation;\n            return state.indentStack.indent;\n        },\n\n        fold: \"brace-paren\",\n        closeBrackets: {pairs: \"()[]{}\\\"\\\"\"},\n        lineComment: \";;\"\n    };\n});\n\nCodeMirror.defineMIME(\"text/x-scheme\", \"scheme\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/shell/shell.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('shell', function() {\n\n  var words = {};\n  function define(style, dict) {\n    for(var i = 0; i < dict.length; i++) {\n      words[dict[i]] = style;\n    }\n  };\n\n  var commonAtoms = [\"true\", \"false\"];\n  var commonKeywords = [\"if\", \"then\", \"do\", \"else\", \"elif\", \"while\", \"until\", \"for\", \"in\", \"esac\", \"fi\",\n    \"fin\", \"fil\", \"done\", \"exit\", \"set\", \"unset\", \"export\", \"function\"];\n  var commonCommands = [\"ab\", \"awk\", \"bash\", \"beep\", \"cat\", \"cc\", \"cd\", \"chown\", \"chmod\", \"chroot\", \"clear\",\n    \"cp\", \"curl\", \"cut\", \"diff\", \"echo\", \"find\", \"gawk\", \"gcc\", \"get\", \"git\", \"grep\", \"hg\", \"kill\", \"killall\",\n    \"ln\", \"ls\", \"make\", \"mkdir\", \"openssl\", \"mv\", \"nc\", \"nl\", \"node\", \"npm\", \"ping\", \"ps\", \"restart\", \"rm\",\n    \"rmdir\", \"sed\", \"service\", \"sh\", \"shopt\", \"shred\", \"source\", \"sort\", \"sleep\", \"ssh\", \"start\", \"stop\",\n    \"su\", \"sudo\", \"svn\", \"tee\", \"telnet\", \"top\", \"touch\", \"vi\", \"vim\", \"wall\", \"wc\", \"wget\", \"who\", \"write\",\n    \"yes\", \"zsh\"];\n\n  CodeMirror.registerHelper(\"hintWords\", \"shell\", commonAtoms.concat(commonKeywords, commonCommands));\n\n  define('atom', commonAtoms);\n  define('keyword', commonKeywords);\n  define('builtin', commonCommands);\n\n  function tokenBase(stream, state) {\n    if (stream.eatSpace()) return null;\n\n    var sol = stream.sol();\n    var ch = stream.next();\n\n    if (ch === '\\\\') {\n      stream.next();\n      return null;\n    }\n    if (ch === '\\'' || ch === '\"' || ch === '`') {\n      state.tokens.unshift(tokenString(ch, ch === \"`\" ? \"quote\" : \"string\"));\n      return tokenize(stream, state);\n    }\n    if (ch === '#') {\n      if (sol && stream.eat('!')) {\n        stream.skipToEnd();\n        return 'meta'; // 'comment'?\n      }\n      stream.skipToEnd();\n      return 'comment';\n    }\n    if (ch === '$') {\n      state.tokens.unshift(tokenDollar);\n      return tokenize(stream, state);\n    }\n    if (ch === '+' || ch === '=') {\n      return 'operator';\n    }\n    if (ch === '-') {\n      stream.eat('-');\n      stream.eatWhile(/\\w/);\n      return 'attribute';\n    }\n    if (ch == \"<\") {\n      if (stream.match(\"<<\")) return \"operator\"\n      var heredoc = stream.match(/^<-?\\s*['\"]?([^'\"]*)['\"]?/)\n      if (heredoc) {\n        state.tokens.unshift(tokenHeredoc(heredoc[1]))\n        return 'string-2'\n      }\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/\\d/);\n      if(stream.eol() || !/\\w/.test(stream.peek())) {\n        return 'number';\n      }\n    }\n    stream.eatWhile(/[\\w-]/);\n    var cur = stream.current();\n    if (stream.peek() === '=' && /\\w+/.test(cur)) return 'def';\n    return words.hasOwnProperty(cur) ? words[cur] : null;\n  }\n\n  function tokenString(quote, style) {\n    var close = quote == \"(\" ? \")\" : quote == \"{\" ? \"}\" : quote\n    return function(stream, state) {\n      var next, escaped = false;\n      while ((next = stream.next()) != null) {\n        if (next === close && !escaped) {\n          state.tokens.shift();\n          break;\n        } else if (next === '$' && !escaped && quote !== \"'\" && stream.peek() != close) {\n          escaped = true;\n          stream.backUp(1);\n          state.tokens.unshift(tokenDollar);\n          break;\n        } else if (!escaped && quote !== close && next === quote) {\n          state.tokens.unshift(tokenString(quote, style))\n          return tokenize(stream, state)\n        } else if (!escaped && /['\"]/.test(next) && !/['\"]/.test(quote)) {\n          state.tokens.unshift(tokenStringStart(next, \"string\"));\n          stream.backUp(1);\n          break;\n        }\n        escaped = !escaped && next === '\\\\';\n      }\n      return style;\n    };\n  };\n\n  function tokenStringStart(quote, style) {\n    return function(stream, state) {\n      state.tokens[0] = tokenString(quote, style)\n      stream.next()\n      return tokenize(stream, state)\n    }\n  }\n\n  var tokenDollar = function(stream, state) {\n    if (state.tokens.length > 1) stream.eat('$');\n    var ch = stream.next()\n    if (/['\"({]/.test(ch)) {\n      state.tokens[0] = tokenString(ch, ch == \"(\" ? \"quote\" : ch == \"{\" ? \"def\" : \"string\");\n      return tokenize(stream, state);\n    }\n    if (!/\\d/.test(ch)) stream.eatWhile(/\\w/);\n    state.tokens.shift();\n    return 'def';\n  };\n\n  function tokenHeredoc(delim) {\n    return function(stream, state) {\n      if (stream.sol() && stream.string == delim) state.tokens.shift()\n      stream.skipToEnd()\n      return \"string-2\"\n    }\n  }\n\n  function tokenize(stream, state) {\n    return (state.tokens[0] || tokenBase) (stream, state);\n  };\n\n  return {\n    startState: function() {return {tokens:[]};},\n    token: function(stream, state) {\n      return tokenize(stream, state);\n    },\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n    lineComment: '#',\n    fold: \"brace\"\n  };\n});\n\nCodeMirror.defineMIME('text/x-sh', 'shell');\n// Apache uses a slightly different Media Type for Shell scripts\n// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types\nCodeMirror.defineMIME('application/x-sh', 'shell');\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/sieve/sieve.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"sieve\", function(config) {\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  var keywords = words(\"if elsif else stop require\");\n  var atoms = words(\"true false not\");\n  var indentUnit = config.indentUnit;\n\n  function tokenBase(stream, state) {\n\n    var ch = stream.next();\n    if (ch == \"/\" && stream.eat(\"*\")) {\n      state.tokenize = tokenCComment;\n      return tokenCComment(stream, state);\n    }\n\n    if (ch === '#') {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n\n    if (ch == \"\\\"\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n\n    if (ch == \"(\") {\n      state._indent.push(\"(\");\n      // add virtual angel wings so that editor behaves...\n      // ...more sane in case of broken brackets\n      state._indent.push(\"{\");\n      return null;\n    }\n\n    if (ch === \"{\") {\n      state._indent.push(\"{\");\n      return null;\n    }\n\n    if (ch == \")\")  {\n      state._indent.pop();\n      state._indent.pop();\n    }\n\n    if (ch === \"}\") {\n      state._indent.pop();\n      return null;\n    }\n\n    if (ch == \",\")\n      return null;\n\n    if (ch == \";\")\n      return null;\n\n\n    if (/[{}\\(\\),;]/.test(ch))\n      return null;\n\n    // 1*DIGIT \"K\" / \"M\" / \"G\"\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/[\\d]/);\n      stream.eat(/[KkMmGg]/);\n      return \"number\";\n    }\n\n    // \":\" (ALPHA / \"_\") *(ALPHA / DIGIT / \"_\")\n    if (ch == \":\") {\n      stream.eatWhile(/[a-zA-Z_]/);\n      stream.eatWhile(/[a-zA-Z0-9_]/);\n\n      return \"operator\";\n    }\n\n    stream.eatWhile(/\\w/);\n    var cur = stream.current();\n\n    // \"text:\" *(SP / HTAB) (hash-comment / CRLF)\n    // *(multiline-literal / multiline-dotstart)\n    // \".\" CRLF\n    if ((cur == \"text\") && stream.eat(\":\"))\n    {\n      state.tokenize = tokenMultiLineString;\n      return \"string\";\n    }\n\n    if (keywords.propertyIsEnumerable(cur))\n      return \"keyword\";\n\n    if (atoms.propertyIsEnumerable(cur))\n      return \"atom\";\n\n    return null;\n  }\n\n  function tokenMultiLineString(stream, state)\n  {\n    state._multiLineString = true;\n    // the first line is special it may contain a comment\n    if (!stream.sol()) {\n      stream.eatSpace();\n\n      if (stream.peek() == \"#\") {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n\n      stream.skipToEnd();\n      return \"string\";\n    }\n\n    if ((stream.next() == \".\")  && (stream.eol()))\n    {\n      state._multiLineString = false;\n      state.tokenize = tokenBase;\n    }\n\n    return \"string\";\n  }\n\n  function tokenCComment(stream, state) {\n    var maybeEnd = false, ch;\n    while ((ch = stream.next()) != null) {\n      if (maybeEnd && ch == \"/\") {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped)\n          break;\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      if (!escaped) state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  return {\n    startState: function(base) {\n      return {tokenize: tokenBase,\n              baseIndent: base || 0,\n              _indent: []};\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace())\n        return null;\n\n      return (state.tokenize || tokenBase)(stream, state);\n    },\n\n    indent: function(state, _textAfter) {\n      var length = state._indent.length;\n      if (_textAfter && (_textAfter[0] == \"}\"))\n        length--;\n\n      if (length <0)\n        length = 0;\n\n      return length * indentUnit;\n    },\n\n    electricChars: \"}\"\n  };\n});\n\nCodeMirror.defineMIME(\"application/sieve\", \"sieve\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/slim/slim.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"), require(\"../ruby/ruby\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\", \"../ruby/ruby\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\n  CodeMirror.defineMode(\"slim\", function(config) {\n    var htmlMode = CodeMirror.getMode(config, {name: \"htmlmixed\"});\n    var rubyMode = CodeMirror.getMode(config, \"ruby\");\n    var modes = { html: htmlMode, ruby: rubyMode };\n    var embedded = {\n      ruby: \"ruby\",\n      javascript: \"javascript\",\n      css: \"text/css\",\n      sass: \"text/x-sass\",\n      scss: \"text/x-scss\",\n      less: \"text/x-less\",\n      styl: \"text/x-styl\", // no highlighting so far\n      coffee: \"coffeescript\",\n      asciidoc: \"text/x-asciidoc\",\n      markdown: \"text/x-markdown\",\n      textile: \"text/x-textile\", // no highlighting so far\n      creole: \"text/x-creole\", // no highlighting so far\n      wiki: \"text/x-wiki\", // no highlighting so far\n      mediawiki: \"text/x-mediawiki\", // no highlighting so far\n      rdoc: \"text/x-rdoc\", // no highlighting so far\n      builder: \"text/x-builder\", // no highlighting so far\n      nokogiri: \"text/x-nokogiri\", // no highlighting so far\n      erb: \"application/x-erb\"\n    };\n    var embeddedRegexp = function(map){\n      var arr = [];\n      for(var key in map) arr.push(key);\n      return new RegExp(\"^(\"+arr.join('|')+\"):\");\n    }(embedded);\n\n    var styleMap = {\n      \"commentLine\": \"comment\",\n      \"slimSwitch\": \"operator special\",\n      \"slimTag\": \"tag\",\n      \"slimId\": \"attribute def\",\n      \"slimClass\": \"attribute qualifier\",\n      \"slimAttribute\": \"attribute\",\n      \"slimSubmode\": \"keyword special\",\n      \"closeAttributeTag\": null,\n      \"slimDoctype\": null,\n      \"lineContinuation\": null\n    };\n    var closing = {\n      \"{\": \"}\",\n      \"[\": \"]\",\n      \"(\": \")\"\n    };\n\n    var nameStartChar = \"_a-zA-Z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\";\n    var nameChar = nameStartChar + \"\\\\-0-9\\xB7\\u0300-\\u036F\\u203F-\\u2040\";\n    var nameRegexp = new RegExp(\"^[:\"+nameStartChar+\"](?::[\"+nameChar+\"]|[\"+nameChar+\"]*)\");\n    var attributeNameRegexp = new RegExp(\"^[:\"+nameStartChar+\"][:\\\\.\"+nameChar+\"]*(?=\\\\s*=)\");\n    var wrappedAttributeNameRegexp = new RegExp(\"^[:\"+nameStartChar+\"][:\\\\.\"+nameChar+\"]*\");\n    var classNameRegexp = /^\\.-?[_a-zA-Z]+[\\w\\-]*/;\n    var classIdRegexp = /^#[_a-zA-Z]+[\\w\\-]*/;\n\n    function backup(pos, tokenize, style) {\n      var restore = function(stream, state) {\n        state.tokenize = tokenize;\n        if (stream.pos < pos) {\n          stream.pos = pos;\n          return style;\n        }\n        return state.tokenize(stream, state);\n      };\n      return function(stream, state) {\n        state.tokenize = restore;\n        return tokenize(stream, state);\n      };\n    }\n\n    function maybeBackup(stream, state, pat, offset, style) {\n      var cur = stream.current();\n      var idx = cur.search(pat);\n      if (idx > -1) {\n        state.tokenize = backup(stream.pos, state.tokenize, style);\n        stream.backUp(cur.length - idx - offset);\n      }\n      return style;\n    }\n\n    function continueLine(state, column) {\n      state.stack = {\n        parent: state.stack,\n        style: \"continuation\",\n        indented: column,\n        tokenize: state.line\n      };\n      state.line = state.tokenize;\n    }\n    function finishContinue(state) {\n      if (state.line == state.tokenize) {\n        state.line = state.stack.tokenize;\n        state.stack = state.stack.parent;\n      }\n    }\n\n    function lineContinuable(column, tokenize) {\n      return function(stream, state) {\n        finishContinue(state);\n        if (stream.match(/^\\\\$/)) {\n          continueLine(state, column);\n          return \"lineContinuation\";\n        }\n        var style = tokenize(stream, state);\n        if (stream.eol() && stream.current().match(/(?:^|[^\\\\])(?:\\\\\\\\)*\\\\$/)) {\n          stream.backUp(1);\n        }\n        return style;\n      };\n    }\n    function commaContinuable(column, tokenize) {\n      return function(stream, state) {\n        finishContinue(state);\n        var style = tokenize(stream, state);\n        if (stream.eol() && stream.current().match(/,$/)) {\n          continueLine(state, column);\n        }\n        return style;\n      };\n    }\n\n    function rubyInQuote(endQuote, tokenize) {\n      // TODO: add multi line support\n      return function(stream, state) {\n        var ch = stream.peek();\n        if (ch == endQuote && state.rubyState.tokenize.length == 1) {\n          // step out of ruby context as it seems to complete processing all the braces\n          stream.next();\n          state.tokenize = tokenize;\n          return \"closeAttributeTag\";\n        } else {\n          return ruby(stream, state);\n        }\n      };\n    }\n    function startRubySplat(tokenize) {\n      var rubyState;\n      var runSplat = function(stream, state) {\n        if (state.rubyState.tokenize.length == 1 && !state.rubyState.context.prev) {\n          stream.backUp(1);\n          if (stream.eatSpace()) {\n            state.rubyState = rubyState;\n            state.tokenize = tokenize;\n            return tokenize(stream, state);\n          }\n          stream.next();\n        }\n        return ruby(stream, state);\n      };\n      return function(stream, state) {\n        rubyState = state.rubyState;\n        state.rubyState = CodeMirror.startState(rubyMode);\n        state.tokenize = runSplat;\n        return ruby(stream, state);\n      };\n    }\n\n    function ruby(stream, state) {\n      return rubyMode.token(stream, state.rubyState);\n    }\n\n    function htmlLine(stream, state) {\n      if (stream.match(/^\\\\$/)) {\n        return \"lineContinuation\";\n      }\n      return html(stream, state);\n    }\n    function html(stream, state) {\n      if (stream.match(/^#\\{/)) {\n        state.tokenize = rubyInQuote(\"}\", state.tokenize);\n        return null;\n      }\n      return maybeBackup(stream, state, /[^\\\\]#\\{/, 1, htmlMode.token(stream, state.htmlState));\n    }\n\n    function startHtmlLine(lastTokenize) {\n      return function(stream, state) {\n        var style = htmlLine(stream, state);\n        if (stream.eol()) state.tokenize = lastTokenize;\n        return style;\n      };\n    }\n\n    function startHtmlMode(stream, state, offset) {\n      state.stack = {\n        parent: state.stack,\n        style: \"html\",\n        indented: stream.column() + offset, // pipe + space\n        tokenize: state.line\n      };\n      state.line = state.tokenize = html;\n      return null;\n    }\n\n    function comment(stream, state) {\n      stream.skipToEnd();\n      return state.stack.style;\n    }\n\n    function commentMode(stream, state) {\n      state.stack = {\n        parent: state.stack,\n        style: \"comment\",\n        indented: state.indented + 1,\n        tokenize: state.line\n      };\n      state.line = comment;\n      return comment(stream, state);\n    }\n\n    function attributeWrapper(stream, state) {\n      if (stream.eat(state.stack.endQuote)) {\n        state.line = state.stack.line;\n        state.tokenize = state.stack.tokenize;\n        state.stack = state.stack.parent;\n        return null;\n      }\n      if (stream.match(wrappedAttributeNameRegexp)) {\n        state.tokenize = attributeWrapperAssign;\n        return \"slimAttribute\";\n      }\n      stream.next();\n      return null;\n    }\n    function attributeWrapperAssign(stream, state) {\n      if (stream.match(/^==?/)) {\n        state.tokenize = attributeWrapperValue;\n        return null;\n      }\n      return attributeWrapper(stream, state);\n    }\n    function attributeWrapperValue(stream, state) {\n      var ch = stream.peek();\n      if (ch == '\"' || ch == \"\\'\") {\n        state.tokenize = readQuoted(ch, \"string\", true, false, attributeWrapper);\n        stream.next();\n        return state.tokenize(stream, state);\n      }\n      if (ch == '[') {\n        return startRubySplat(attributeWrapper)(stream, state);\n      }\n      if (stream.match(/^(true|false|nil)\\b/)) {\n        state.tokenize = attributeWrapper;\n        return \"keyword\";\n      }\n      return startRubySplat(attributeWrapper)(stream, state);\n    }\n\n    function startAttributeWrapperMode(state, endQuote, tokenize) {\n      state.stack = {\n        parent: state.stack,\n        style: \"wrapper\",\n        indented: state.indented + 1,\n        tokenize: tokenize,\n        line: state.line,\n        endQuote: endQuote\n      };\n      state.line = state.tokenize = attributeWrapper;\n      return null;\n    }\n\n    function sub(stream, state) {\n      if (stream.match(/^#\\{/)) {\n        state.tokenize = rubyInQuote(\"}\", state.tokenize);\n        return null;\n      }\n      var subStream = new CodeMirror.StringStream(stream.string.slice(state.stack.indented), stream.tabSize);\n      subStream.pos = stream.pos - state.stack.indented;\n      subStream.start = stream.start - state.stack.indented;\n      subStream.lastColumnPos = stream.lastColumnPos - state.stack.indented;\n      subStream.lastColumnValue = stream.lastColumnValue - state.stack.indented;\n      var style = state.subMode.token(subStream, state.subState);\n      stream.pos = subStream.pos + state.stack.indented;\n      return style;\n    }\n    function firstSub(stream, state) {\n      state.stack.indented = stream.column();\n      state.line = state.tokenize = sub;\n      return state.tokenize(stream, state);\n    }\n\n    function createMode(mode) {\n      var query = embedded[mode];\n      var spec = CodeMirror.mimeModes[query];\n      if (spec) {\n        return CodeMirror.getMode(config, spec);\n      }\n      var factory = CodeMirror.modes[query];\n      if (factory) {\n        return factory(config, {name: query});\n      }\n      return CodeMirror.getMode(config, \"null\");\n    }\n\n    function getMode(mode) {\n      if (!modes.hasOwnProperty(mode)) {\n        return modes[mode] = createMode(mode);\n      }\n      return modes[mode];\n    }\n\n    function startSubMode(mode, state) {\n      var subMode = getMode(mode);\n      var subState = CodeMirror.startState(subMode);\n\n      state.subMode = subMode;\n      state.subState = subState;\n\n      state.stack = {\n        parent: state.stack,\n        style: \"sub\",\n        indented: state.indented + 1,\n        tokenize: state.line\n      };\n      state.line = state.tokenize = firstSub;\n      return \"slimSubmode\";\n    }\n\n    function doctypeLine(stream, _state) {\n      stream.skipToEnd();\n      return \"slimDoctype\";\n    }\n\n    function startLine(stream, state) {\n      var ch = stream.peek();\n      if (ch == '<') {\n        return (state.tokenize = startHtmlLine(state.tokenize))(stream, state);\n      }\n      if (stream.match(/^[|']/)) {\n        return startHtmlMode(stream, state, 1);\n      }\n      if (stream.match(/^\\/(!|\\[\\w+])?/)) {\n        return commentMode(stream, state);\n      }\n      if (stream.match(/^(-|==?[<>]?)/)) {\n        state.tokenize = lineContinuable(stream.column(), commaContinuable(stream.column(), ruby));\n        return \"slimSwitch\";\n      }\n      if (stream.match(/^doctype\\b/)) {\n        state.tokenize = doctypeLine;\n        return \"keyword\";\n      }\n\n      var m = stream.match(embeddedRegexp);\n      if (m) {\n        return startSubMode(m[1], state);\n      }\n\n      return slimTag(stream, state);\n    }\n\n    function slim(stream, state) {\n      if (state.startOfLine) {\n        return startLine(stream, state);\n      }\n      return slimTag(stream, state);\n    }\n\n    function slimTag(stream, state) {\n      if (stream.eat('*')) {\n        state.tokenize = startRubySplat(slimTagExtras);\n        return null;\n      }\n      if (stream.match(nameRegexp)) {\n        state.tokenize = slimTagExtras;\n        return \"slimTag\";\n      }\n      return slimClass(stream, state);\n    }\n    function slimTagExtras(stream, state) {\n      if (stream.match(/^(<>?|><?)/)) {\n        state.tokenize = slimClass;\n        return null;\n      }\n      return slimClass(stream, state);\n    }\n    function slimClass(stream, state) {\n      if (stream.match(classIdRegexp)) {\n        state.tokenize = slimClass;\n        return \"slimId\";\n      }\n      if (stream.match(classNameRegexp)) {\n        state.tokenize = slimClass;\n        return \"slimClass\";\n      }\n      return slimAttribute(stream, state);\n    }\n    function slimAttribute(stream, state) {\n      if (stream.match(/^([\\[\\{\\(])/)) {\n        return startAttributeWrapperMode(state, closing[RegExp.$1], slimAttribute);\n      }\n      if (stream.match(attributeNameRegexp)) {\n        state.tokenize = slimAttributeAssign;\n        return \"slimAttribute\";\n      }\n      if (stream.peek() == '*') {\n        stream.next();\n        state.tokenize = startRubySplat(slimContent);\n        return null;\n      }\n      return slimContent(stream, state);\n    }\n    function slimAttributeAssign(stream, state) {\n      if (stream.match(/^==?/)) {\n        state.tokenize = slimAttributeValue;\n        return null;\n      }\n      // should never happen, because of forward lookup\n      return slimAttribute(stream, state);\n    }\n\n    function slimAttributeValue(stream, state) {\n      var ch = stream.peek();\n      if (ch == '\"' || ch == \"\\'\") {\n        state.tokenize = readQuoted(ch, \"string\", true, false, slimAttribute);\n        stream.next();\n        return state.tokenize(stream, state);\n      }\n      if (ch == '[') {\n        return startRubySplat(slimAttribute)(stream, state);\n      }\n      if (ch == ':') {\n        return startRubySplat(slimAttributeSymbols)(stream, state);\n      }\n      if (stream.match(/^(true|false|nil)\\b/)) {\n        state.tokenize = slimAttribute;\n        return \"keyword\";\n      }\n      return startRubySplat(slimAttribute)(stream, state);\n    }\n    function slimAttributeSymbols(stream, state) {\n      stream.backUp(1);\n      if (stream.match(/^[^\\s],(?=:)/)) {\n        state.tokenize = startRubySplat(slimAttributeSymbols);\n        return null;\n      }\n      stream.next();\n      return slimAttribute(stream, state);\n    }\n    function readQuoted(quote, style, embed, unescaped, nextTokenize) {\n      return function(stream, state) {\n        finishContinue(state);\n        var fresh = stream.current().length == 0;\n        if (stream.match(/^\\\\$/, fresh)) {\n          if (!fresh) return style;\n          continueLine(state, state.indented);\n          return \"lineContinuation\";\n        }\n        if (stream.match(/^#\\{/, fresh)) {\n          if (!fresh) return style;\n          state.tokenize = rubyInQuote(\"}\", state.tokenize);\n          return null;\n        }\n        var escaped = false, ch;\n        while ((ch = stream.next()) != null) {\n          if (ch == quote && (unescaped || !escaped)) {\n            state.tokenize = nextTokenize;\n            break;\n          }\n          if (embed && ch == \"#\" && !escaped) {\n            if (stream.eat(\"{\")) {\n              stream.backUp(2);\n              break;\n            }\n          }\n          escaped = !escaped && ch == \"\\\\\";\n        }\n        if (stream.eol() && escaped) {\n          stream.backUp(1);\n        }\n        return style;\n      };\n    }\n    function slimContent(stream, state) {\n      if (stream.match(/^==?/)) {\n        state.tokenize = ruby;\n        return \"slimSwitch\";\n      }\n      if (stream.match(/^\\/$/)) { // tag close hint\n        state.tokenize = slim;\n        return null;\n      }\n      if (stream.match(/^:/)) { // inline tag\n        state.tokenize = slimTag;\n        return \"slimSwitch\";\n      }\n      startHtmlMode(stream, state, 0);\n      return state.tokenize(stream, state);\n    }\n\n    var mode = {\n      // default to html mode\n      startState: function() {\n        var htmlState = CodeMirror.startState(htmlMode);\n        var rubyState = CodeMirror.startState(rubyMode);\n        return {\n          htmlState: htmlState,\n          rubyState: rubyState,\n          stack: null,\n          last: null,\n          tokenize: slim,\n          line: slim,\n          indented: 0\n        };\n      },\n\n      copyState: function(state) {\n        return {\n          htmlState : CodeMirror.copyState(htmlMode, state.htmlState),\n          rubyState: CodeMirror.copyState(rubyMode, state.rubyState),\n          subMode: state.subMode,\n          subState: state.subMode && CodeMirror.copyState(state.subMode, state.subState),\n          stack: state.stack,\n          last: state.last,\n          tokenize: state.tokenize,\n          line: state.line\n        };\n      },\n\n      token: function(stream, state) {\n        if (stream.sol()) {\n          state.indented = stream.indentation();\n          state.startOfLine = true;\n          state.tokenize = state.line;\n          while (state.stack && state.stack.indented > state.indented && state.last != \"slimSubmode\") {\n            state.line = state.tokenize = state.stack.tokenize;\n            state.stack = state.stack.parent;\n            state.subMode = null;\n            state.subState = null;\n          }\n        }\n        if (stream.eatSpace()) return null;\n        var style = state.tokenize(stream, state);\n        state.startOfLine = false;\n        if (style) state.last = style;\n        return styleMap.hasOwnProperty(style) ? styleMap[style] : style;\n      },\n\n      blankLine: function(state) {\n        if (state.subMode && state.subMode.blankLine) {\n          return state.subMode.blankLine(state.subState);\n        }\n      },\n\n      innerMode: function(state) {\n        if (state.subMode) return {state: state.subState, mode: state.subMode};\n        return {state: state, mode: mode};\n      }\n\n      //indent: function(state) {\n      //  return state.indented;\n      //}\n    };\n    return mode;\n  }, \"htmlmixed\", \"ruby\");\n\n  CodeMirror.defineMIME(\"text/x-slim\", \"slim\");\n  CodeMirror.defineMIME(\"application/x-slim\", \"slim\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/smalltalk/smalltalk.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('smalltalk', function(config) {\n\n  var specialChars = /[+\\-\\/\\\\*~<>=@%|&?!.,:;^]/;\n  var keywords = /true|false|nil|self|super|thisContext/;\n\n  var Context = function(tokenizer, parent) {\n    this.next = tokenizer;\n    this.parent = parent;\n  };\n\n  var Token = function(name, context, eos) {\n    this.name = name;\n    this.context = context;\n    this.eos = eos;\n  };\n\n  var State = function() {\n    this.context = new Context(next, null);\n    this.expectVariable = true;\n    this.indentation = 0;\n    this.userIndentationDelta = 0;\n  };\n\n  State.prototype.userIndent = function(indentation) {\n    this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0;\n  };\n\n  var next = function(stream, context, state) {\n    var token = new Token(null, context, false);\n    var aChar = stream.next();\n\n    if (aChar === '\"') {\n      token = nextComment(stream, new Context(nextComment, context));\n\n    } else if (aChar === '\\'') {\n      token = nextString(stream, new Context(nextString, context));\n\n    } else if (aChar === '#') {\n      if (stream.peek() === '\\'') {\n        stream.next();\n        token = nextSymbol(stream, new Context(nextSymbol, context));\n      } else {\n        if (stream.eatWhile(/[^\\s.{}\\[\\]()]/))\n          token.name = 'string-2';\n        else\n          token.name = 'meta';\n      }\n\n    } else if (aChar === '$') {\n      if (stream.next() === '<') {\n        stream.eatWhile(/[^\\s>]/);\n        stream.next();\n      }\n      token.name = 'string-2';\n\n    } else if (aChar === '|' && state.expectVariable) {\n      token.context = new Context(nextTemporaries, context);\n\n    } else if (/[\\[\\]{}()]/.test(aChar)) {\n      token.name = 'bracket';\n      token.eos = /[\\[{(]/.test(aChar);\n\n      if (aChar === '[') {\n        state.indentation++;\n      } else if (aChar === ']') {\n        state.indentation = Math.max(0, state.indentation - 1);\n      }\n\n    } else if (specialChars.test(aChar)) {\n      stream.eatWhile(specialChars);\n      token.name = 'operator';\n      token.eos = aChar !== ';'; // ; cascaded message expression\n\n    } else if (/\\d/.test(aChar)) {\n      stream.eatWhile(/[\\w\\d]/);\n      token.name = 'number';\n\n    } else if (/[\\w_]/.test(aChar)) {\n      stream.eatWhile(/[\\w\\d_]/);\n      token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null;\n\n    } else {\n      token.eos = state.expectVariable;\n    }\n\n    return token;\n  };\n\n  var nextComment = function(stream, context) {\n    stream.eatWhile(/[^\"]/);\n    return new Token('comment', stream.eat('\"') ? context.parent : context, true);\n  };\n\n  var nextString = function(stream, context) {\n    stream.eatWhile(/[^']/);\n    return new Token('string', stream.eat('\\'') ? context.parent : context, false);\n  };\n\n  var nextSymbol = function(stream, context) {\n    stream.eatWhile(/[^']/);\n    return new Token('string-2', stream.eat('\\'') ? context.parent : context, false);\n  };\n\n  var nextTemporaries = function(stream, context) {\n    var token = new Token(null, context, false);\n    var aChar = stream.next();\n\n    if (aChar === '|') {\n      token.context = context.parent;\n      token.eos = true;\n\n    } else {\n      stream.eatWhile(/[^|]/);\n      token.name = 'variable';\n    }\n\n    return token;\n  };\n\n  return {\n    startState: function() {\n      return new State;\n    },\n\n    token: function(stream, state) {\n      state.userIndent(stream.indentation());\n\n      if (stream.eatSpace()) {\n        return null;\n      }\n\n      var token = state.context.next(stream, state.context, state);\n      state.context = token.context;\n      state.expectVariable = token.eos;\n\n      return token.name;\n    },\n\n    blankLine: function(state) {\n      state.userIndent(0);\n    },\n\n    indent: function(state, textAfter) {\n      var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta;\n      return (state.indentation + i) * config.indentUnit;\n    },\n\n    electricChars: ']'\n  };\n\n});\n\nCodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/smarty/smarty.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/**\n * Smarty 2 and 3 mode.\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"smarty\", function(config, parserConf) {\n    var rightDelimiter = parserConf.rightDelimiter || \"}\";\n    var leftDelimiter = parserConf.leftDelimiter || \"{\";\n    var version = parserConf.version || 2;\n    var baseMode = CodeMirror.getMode(config, parserConf.baseMode || \"null\");\n\n    var keyFunctions = [\"debug\", \"extends\", \"function\", \"include\", \"literal\"];\n    var regs = {\n      operatorChars: /[+\\-*&%=<>!?]/,\n      validIdentifier: /[a-zA-Z0-9_]/,\n      stringChar: /['\"]/\n    };\n\n    var last;\n    function cont(style, lastType) {\n      last = lastType;\n      return style;\n    }\n\n    function chain(stream, state, parser) {\n      state.tokenize = parser;\n      return parser(stream, state);\n    }\n\n    // Smarty 3 allows { and } surrounded by whitespace to NOT slip into Smarty mode\n    function doesNotCount(stream, pos) {\n      if (pos == null) pos = stream.pos;\n      return version === 3 && leftDelimiter == \"{\" &&\n        (pos == stream.string.length || /\\s/.test(stream.string.charAt(pos)));\n    }\n\n    function tokenTop(stream, state) {\n      var string = stream.string;\n      for (var scan = stream.pos;;) {\n        var nextMatch = string.indexOf(leftDelimiter, scan);\n        scan = nextMatch + leftDelimiter.length;\n        if (nextMatch == -1 || !doesNotCount(stream, nextMatch + leftDelimiter.length)) break;\n      }\n      if (nextMatch == stream.pos) {\n        stream.match(leftDelimiter);\n        if (stream.eat(\"*\")) {\n          return chain(stream, state, tokenBlock(\"comment\", \"*\" + rightDelimiter));\n        } else {\n          state.depth++;\n          state.tokenize = tokenSmarty;\n          last = \"startTag\";\n          return \"tag\";\n        }\n      }\n\n      if (nextMatch > -1) stream.string = string.slice(0, nextMatch);\n      var token = baseMode.token(stream, state.base);\n      if (nextMatch > -1) stream.string = string;\n      return token;\n    }\n\n    // parsing Smarty content\n    function tokenSmarty(stream, state) {\n      if (stream.match(rightDelimiter, true)) {\n        if (version === 3) {\n          state.depth--;\n          if (state.depth <= 0) {\n            state.tokenize = tokenTop;\n          }\n        } else {\n          state.tokenize = tokenTop;\n        }\n        return cont(\"tag\", null);\n      }\n\n      if (stream.match(leftDelimiter, true)) {\n        state.depth++;\n        return cont(\"tag\", \"startTag\");\n      }\n\n      var ch = stream.next();\n      if (ch == \"$\") {\n        stream.eatWhile(regs.validIdentifier);\n        return cont(\"variable-2\", \"variable\");\n      } else if (ch == \"|\") {\n        return cont(\"operator\", \"pipe\");\n      } else if (ch == \".\") {\n        return cont(\"operator\", \"property\");\n      } else if (regs.stringChar.test(ch)) {\n        state.tokenize = tokenAttribute(ch);\n        return cont(\"string\", \"string\");\n      } else if (regs.operatorChars.test(ch)) {\n        stream.eatWhile(regs.operatorChars);\n        return cont(\"operator\", \"operator\");\n      } else if (ch == \"[\" || ch == \"]\") {\n        return cont(\"bracket\", \"bracket\");\n      } else if (ch == \"(\" || ch == \")\") {\n        return cont(\"bracket\", \"operator\");\n      } else if (/\\d/.test(ch)) {\n        stream.eatWhile(/\\d/);\n        return cont(\"number\", \"number\");\n      } else {\n\n        if (state.last == \"variable\") {\n          if (ch == \"@\") {\n            stream.eatWhile(regs.validIdentifier);\n            return cont(\"property\", \"property\");\n          } else if (ch == \"|\") {\n            stream.eatWhile(regs.validIdentifier);\n            return cont(\"qualifier\", \"modifier\");\n          }\n        } else if (state.last == \"pipe\") {\n          stream.eatWhile(regs.validIdentifier);\n          return cont(\"qualifier\", \"modifier\");\n        } else if (state.last == \"whitespace\") {\n          stream.eatWhile(regs.validIdentifier);\n          return cont(\"attribute\", \"modifier\");\n        } if (state.last == \"property\") {\n          stream.eatWhile(regs.validIdentifier);\n          return cont(\"property\", null);\n        } else if (/\\s/.test(ch)) {\n          last = \"whitespace\";\n          return null;\n        }\n\n        var str = \"\";\n        if (ch != \"/\") {\n          str += ch;\n        }\n        var c = null;\n        while (c = stream.eat(regs.validIdentifier)) {\n          str += c;\n        }\n        for (var i=0, j=keyFunctions.length; i<j; i++) {\n          if (keyFunctions[i] == str) {\n            return cont(\"keyword\", \"keyword\");\n          }\n        }\n        if (/\\s/.test(ch)) {\n          return null;\n        }\n        return cont(\"tag\", \"tag\");\n      }\n    }\n\n    function tokenAttribute(quote) {\n      return function(stream, state) {\n        var prevChar = null;\n        var currChar = null;\n        while (!stream.eol()) {\n          currChar = stream.peek();\n          if (stream.next() == quote && prevChar !== '\\\\') {\n            state.tokenize = tokenSmarty;\n            break;\n          }\n          prevChar = currChar;\n        }\n        return \"string\";\n      };\n    }\n\n    function tokenBlock(style, terminator) {\n      return function(stream, state) {\n        while (!stream.eol()) {\n          if (stream.match(terminator)) {\n            state.tokenize = tokenTop;\n            break;\n          }\n          stream.next();\n        }\n        return style;\n      };\n    }\n\n    return {\n      startState: function() {\n        return {\n          base: CodeMirror.startState(baseMode),\n          tokenize: tokenTop,\n          last: null,\n          depth: 0\n        };\n      },\n      copyState: function(state) {\n        return {\n          base: CodeMirror.copyState(baseMode, state.base),\n          tokenize: state.tokenize,\n          last: state.last,\n          depth: state.depth\n        };\n      },\n      innerMode: function(state) {\n        if (state.tokenize == tokenTop)\n          return {mode: baseMode, state: state.base};\n      },\n      token: function(stream, state) {\n        var style = state.tokenize(stream, state);\n        state.last = last;\n        return style;\n      },\n      indent: function(state, text, line) {\n        if (state.tokenize == tokenTop && baseMode.indent)\n          return baseMode.indent(state.base, text, line);\n        else\n          return CodeMirror.Pass;\n      },\n      blockCommentStart: leftDelimiter + \"*\",\n      blockCommentEnd: \"*\" + rightDelimiter\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-smarty\", \"smarty\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/solr/solr.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"solr\", function() {\n  \"use strict\";\n\n  var isStringChar = /[^\\s\\|\\!\\+\\-\\*\\?\\~\\^\\&\\:\\(\\)\\[\\]\\{\\}\\\"\\\\]/;\n  var isOperatorChar = /[\\|\\!\\+\\-\\*\\?\\~\\^\\&]/;\n  var isOperatorString = /^(OR|AND|NOT|TO)$/i;\n\n  function isNumber(word) {\n    return parseFloat(word).toString() === word;\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) break;\n        escaped = !escaped && next == \"\\\\\";\n      }\n\n      if (!escaped) state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  function tokenOperator(operator) {\n    return function(stream, state) {\n      var style = \"operator\";\n      if (operator == \"+\")\n        style += \" positive\";\n      else if (operator == \"-\")\n        style += \" negative\";\n      else if (operator == \"|\")\n        stream.eat(/\\|/);\n      else if (operator == \"&\")\n        stream.eat(/\\&/);\n      else if (operator == \"^\")\n        style += \" boost\";\n\n      state.tokenize = tokenBase;\n      return style;\n    };\n  }\n\n  function tokenWord(ch) {\n    return function(stream, state) {\n      var word = ch;\n      while ((ch = stream.peek()) && ch.match(isStringChar) != null) {\n        word += stream.next();\n      }\n\n      state.tokenize = tokenBase;\n      if (isOperatorString.test(word))\n        return \"operator\";\n      else if (isNumber(word))\n        return \"number\";\n      else if (stream.peek() == \":\")\n        return \"field\";\n      else\n        return \"string\";\n    };\n  }\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"')\n      state.tokenize = tokenString(ch);\n    else if (isOperatorChar.test(ch))\n      state.tokenize = tokenOperator(ch);\n    else if (isStringChar.test(ch))\n      state.tokenize = tokenWord(ch);\n\n    return (state.tokenize != tokenBase) ? state.tokenize(stream, state) : null;\n  }\n\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase\n      };\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      return state.tokenize(stream, state);\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-solr\", \"solr\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/soy/soy.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var paramData = { noEndTag: true, soyState: \"param-def\" };\n  var tags = {\n    \"alias\": { noEndTag: true },\n    \"delpackage\": { noEndTag: true },\n    \"namespace\": { noEndTag: true, soyState: \"namespace-def\" },\n    \"@attribute\": paramData,\n    \"@attribute?\": paramData,\n    \"@param\": paramData,\n    \"@param?\": paramData,\n    \"@inject\": paramData,\n    \"@inject?\": paramData,\n    \"@state\": paramData,\n    \"template\": { soyState: \"templ-def\", variableScope: true},\n    \"extern\": {soyState: \"param-def\"},\n    \"export\": {soyState: \"export\"},\n    \"literal\": { },\n    \"msg\": {},\n    \"fallbackmsg\": { noEndTag: true, reduceIndent: true},\n    \"select\": {},\n    \"plural\": {},\n    \"let\": { soyState: \"var-def\" },\n    \"if\": {},\n    \"javaimpl\": {},\n    \"jsimpl\": {},\n    \"elseif\": { noEndTag: true, reduceIndent: true},\n    \"else\": { noEndTag: true, reduceIndent: true},\n    \"switch\": {},\n    \"case\": { noEndTag: true, reduceIndent: true},\n    \"default\": { noEndTag: true, reduceIndent: true},\n    \"foreach\": { variableScope: true, soyState: \"for-loop\" },\n    \"ifempty\": { noEndTag: true, reduceIndent: true},\n    \"for\": { variableScope: true, soyState: \"for-loop\" },\n    \"call\": { soyState: \"templ-ref\" },\n    \"param\": { soyState: \"param-ref\"},\n    \"print\": { noEndTag: true },\n    \"deltemplate\": { soyState: \"templ-def\", variableScope: true},\n    \"delcall\": { soyState: \"templ-ref\" },\n    \"log\": {},\n    \"element\": { variableScope: true },\n    \"velog\": {},\n    \"const\": { soyState: \"const-def\"},\n  };\n\n  var indentingTags = Object.keys(tags).filter(function(tag) {\n    return !tags[tag].noEndTag || tags[tag].reduceIndent;\n  });\n\n  CodeMirror.defineMode(\"soy\", function(config) {\n    var textMode = CodeMirror.getMode(config, \"text/plain\");\n    var modes = {\n      html: CodeMirror.getMode(config, {name: \"text/html\", multilineTagIndentFactor: 2, multilineTagIndentPastTag: false, allowMissingTagName: true}),\n      attributes: textMode,\n      text: textMode,\n      uri: textMode,\n      trusted_resource_uri: textMode,\n      css: CodeMirror.getMode(config, \"text/css\"),\n      js: CodeMirror.getMode(config, {name: \"text/javascript\", statementIndent: 2 * config.indentUnit})\n    };\n\n    function last(array) {\n      return array[array.length - 1];\n    }\n\n    function tokenUntil(stream, state, untilRegExp) {\n      if (stream.sol()) {\n        for (var indent = 0; indent < state.indent; indent++) {\n          if (!stream.eat(/\\s/)) break;\n        }\n        if (indent) return null;\n      }\n      var oldString = stream.string;\n      var match = untilRegExp.exec(oldString.substr(stream.pos));\n      if (match) {\n        // We don't use backUp because it backs up just the position, not the state.\n        // This uses an undocumented API.\n        stream.string = oldString.substr(0, stream.pos + match.index);\n      }\n      var result = stream.hideFirstChars(state.indent, function() {\n        var localState = last(state.localStates);\n        return localState.mode.token(stream, localState.state);\n      });\n      stream.string = oldString;\n      return result;\n    }\n\n    function contains(list, element) {\n      while (list) {\n        if (list.element === element) return true;\n        list = list.next;\n      }\n      return false;\n    }\n\n    function prepend(list, element) {\n      return {\n        element: element,\n        next: list\n      };\n    }\n\n    function popcontext(state) {\n      if (!state.context) return;\n      if (state.context.scope) {\n        state.variables = state.context.scope;\n      }\n      state.context = state.context.previousContext;\n    }\n\n    // Reference a variable `name` in `list`.\n    // Let `loose` be truthy to ignore missing identifiers.\n    function ref(list, name, loose) {\n      return contains(list, name) ? \"variable-2\" : (loose ? \"variable\" : \"variable-2 error\");\n    }\n\n    // Data for an open soy tag.\n    function Context(previousContext, tag, scope) {\n      this.previousContext = previousContext;\n      this.tag = tag;\n      this.kind = null;\n      this.scope = scope;\n    }\n\n    function expression(stream, state) {\n      var match;\n      if (stream.match(/[[]/)) {\n        state.soyState.push(\"list-literal\");\n        state.context = new Context(state.context, \"list-literal\", state.variables);\n        state.lookupVariables = false;\n        return null;\n      } else if (stream.match(/\\bmap(?=\\()/)) {\n        state.soyState.push(\"map-literal\");\n        return \"keyword\";\n      } else if (stream.match(/\\brecord(?=\\()/)) {\n        state.soyState.push(\"record-literal\");\n        return \"keyword\";\n      } else if (stream.match(/([\\w]+)(?=\\()/)) {\n        return \"variable callee\";\n      } else if (match = stream.match(/^[\"']/)) {\n        state.soyState.push(\"string\");\n        state.quoteKind = match[0];\n        return \"string\";\n      } else if (stream.match(/^[(]/)) {\n        state.soyState.push(\"open-parentheses\");\n        return null;\n      } else if (stream.match(/(null|true|false)(?!\\w)/) ||\n          stream.match(/0x([0-9a-fA-F]{2,})/) ||\n          stream.match(/-?([0-9]*[.])?[0-9]+(e[0-9]*)?/)) {\n        return \"atom\";\n      } else if (stream.match(/(\\||[+\\-*\\/%]|[=!]=|\\?:|[<>]=?)/)) {\n        // Tokenize filter, binary, null propagator, and equality operators.\n        return \"operator\";\n      } else if (match = stream.match(/^\\$([\\w]+)/)) {\n        return ref(state.variables, match[1], !state.lookupVariables);\n      } else if (match = stream.match(/^\\w+/)) {\n        return /^(?:as|and|or|not|in|if)$/.test(match[0]) ? \"keyword\" : null;\n      }\n\n      stream.next();\n      return null;\n    }\n\n    return {\n      startState: function() {\n        return {\n          soyState: [],\n          variables: prepend(null, 'ij'),\n          scopes: null,\n          indent: 0,\n          quoteKind: null,\n          context: null,\n          lookupVariables: true, // Is unknown variables considered an error\n          localStates: [{\n            mode: modes.html,\n            state: CodeMirror.startState(modes.html)\n          }]\n        };\n      },\n\n      copyState: function(state) {\n        return {\n          tag: state.tag, // Last seen Soy tag.\n          soyState: state.soyState.concat([]),\n          variables: state.variables,\n          context: state.context,\n          indent: state.indent, // Indentation of the following line.\n          quoteKind: state.quoteKind,\n          lookupVariables: state.lookupVariables,\n          localStates: state.localStates.map(function(localState) {\n            return {\n              mode: localState.mode,\n              state: CodeMirror.copyState(localState.mode, localState.state)\n            };\n          })\n        };\n      },\n\n      token: function(stream, state) {\n        var match;\n\n        switch (last(state.soyState)) {\n          case \"comment\":\n            if (stream.match(/^.*?\\*\\//)) {\n              state.soyState.pop();\n            } else {\n              stream.skipToEnd();\n            }\n            if (!state.context || !state.context.scope) {\n              var paramRe = /@param\\??\\s+(\\S+)/g;\n              var current = stream.current();\n              for (var match; (match = paramRe.exec(current)); ) {\n                state.variables = prepend(state.variables, match[1]);\n              }\n            }\n            return \"comment\";\n\n          case \"string\":\n            var match = stream.match(/^.*?([\"']|\\\\[\\s\\S])/);\n            if (!match) {\n              stream.skipToEnd();\n            } else if (match[1] == state.quoteKind) {\n              state.quoteKind = null;\n              state.soyState.pop();\n            }\n            return \"string\";\n        }\n\n        if (!state.soyState.length || last(state.soyState) != \"literal\") {\n          if (stream.match(/^\\/\\*/)) {\n            state.soyState.push(\"comment\");\n            return \"comment\";\n          } else if (stream.match(stream.sol() ? /^\\s*\\/\\/.*/ : /^\\s+\\/\\/.*/)) {\n            return \"comment\";\n          }\n        }\n\n        switch (last(state.soyState)) {\n          case \"templ-def\":\n            if (match = stream.match(/^\\.?([\\w]+(?!\\.[\\w]+)*)/)) {\n              state.soyState.pop();\n              return \"def\";\n            }\n            stream.next();\n            return null;\n\n          case \"templ-ref\":\n            if (match = stream.match(/(\\.?[a-zA-Z_][a-zA-Z_0-9]+)+/)) {\n              state.soyState.pop();\n              // If the first character is '.', it can only be a local template.\n              if (match[0][0] == '.') {\n                return \"variable-2\"\n              }\n              // Otherwise\n              return \"variable\";\n            }\n            if (match = stream.match(/^\\$([\\w]+)/)) {\n              state.soyState.pop();\n              return ref(state.variables, match[1], !state.lookupVariables);\n            }\n\n            stream.next();\n            return null;\n\n          case \"namespace-def\":\n            if (match = stream.match(/^\\.?([\\w\\.]+)/)) {\n              state.soyState.pop();\n              return \"variable\";\n            }\n            stream.next();\n            return null;\n\n          case \"param-def\":\n            if (match = stream.match(/^\\*/)) {\n              state.soyState.pop();\n              state.soyState.push(\"param-type\");\n              return \"type\";\n            }\n            if (match = stream.match(/^\\w+/)) {\n              state.variables = prepend(state.variables, match[0]);\n              state.soyState.pop();\n              state.soyState.push(\"param-type\");\n              return \"def\";\n            }\n            stream.next();\n            return null;\n\n          case \"param-ref\":\n            if (match = stream.match(/^\\w+/)) {\n              state.soyState.pop();\n              return \"property\";\n            }\n            stream.next();\n            return null;\n\n          case \"open-parentheses\":\n            if (stream.match(/[)]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            return expression(stream, state);\n\n          case \"param-type\":\n            var peekChar = stream.peek();\n            if (\"}]=>,\".indexOf(peekChar) != -1) {\n              state.soyState.pop();\n              return null;\n            } else if (peekChar == \"[\") {\n              state.soyState.push('param-type-record');\n              return null;\n            } else if (peekChar == \"(\") {\n              state.soyState.push('param-type-template');\n              return null;\n            } else if (peekChar == \"<\") {\n              state.soyState.push('param-type-parameter');\n              return null;\n            } else if (match = stream.match(/^([\\w]+|[?])/)) {\n              return \"type\";\n            }\n            stream.next();\n            return null;\n\n          case \"param-type-record\":\n            var peekChar = stream.peek();\n            if (peekChar == \"]\") {\n              state.soyState.pop();\n              return null;\n            }\n            if (stream.match(/^\\w+/)) {\n              state.soyState.push('param-type');\n              return \"property\";\n            }\n            stream.next();\n            return null;\n\n          case \"param-type-parameter\":\n            if (stream.match(/^[>]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            if (stream.match(/^[<,]/)) {\n              state.soyState.push('param-type');\n              return null;\n            }\n            stream.next();\n            return null;\n\n          case \"param-type-template\":\n            if (stream.match(/[>]/)) {\n              state.soyState.pop();\n              state.soyState.push('param-type');\n              return null;\n            }\n            if (stream.match(/^\\w+/)) {\n              state.soyState.push('param-type');\n              return \"def\";\n            }\n            stream.next();\n            return null;\n\n          case \"var-def\":\n            if (match = stream.match(/^\\$([\\w]+)/)) {\n              state.variables = prepend(state.variables, match[1]);\n              state.soyState.pop();\n              return \"def\";\n            }\n            stream.next();\n            return null;\n\n          case \"for-loop\":\n            if (stream.match(/\\bin\\b/)) {\n              state.soyState.pop();\n              return \"keyword\";\n            }\n            if (stream.peek() == \"$\") {\n              state.soyState.push('var-def');\n              return null;\n            }\n            stream.next();\n            return null;\n\n          case \"record-literal\":\n            if (stream.match(/^[)]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            if (stream.match(/[(,]/)) {\n              state.soyState.push(\"map-value\")\n              state.soyState.push(\"record-key\")\n              return null;\n            }\n            stream.next()\n            return null;\n\n          case \"map-literal\":\n            if (stream.match(/^[)]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            if (stream.match(/[(,]/)) {\n              state.soyState.push(\"map-value\")\n              state.soyState.push(\"map-value\")\n              return null;\n            }\n            stream.next()\n            return null;\n\n          case \"list-literal\":\n            if (stream.match(']')) {\n              state.soyState.pop();\n              state.lookupVariables = true;\n              popcontext(state);\n              return null;\n            }\n            if (stream.match(/\\bfor\\b/)) {\n              state.lookupVariables = true;\n              state.soyState.push('for-loop');\n              return \"keyword\";\n            }\n            return expression(stream, state);\n\n          case \"record-key\":\n            if (stream.match(/[\\w]+/)) {\n              return \"property\";\n            }\n            if (stream.match(/^[:]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            stream.next();\n            return null;\n\n          case \"map-value\":\n            if (stream.peek() == \")\" || stream.peek() == \",\" || stream.match(/^[:)]/)) {\n              state.soyState.pop();\n              return null;\n            }\n            return expression(stream, state);\n\n          case \"import\":\n            if (stream.eat(\";\")) {\n              state.soyState.pop();\n              state.indent -= 2 * config.indentUnit;\n              return null;\n            }\n            if (stream.match(/\\w+(?=\\s+as\\b)/)) {\n              return \"variable\";\n            }\n            if (match = stream.match(/\\w+/)) {\n              return /\\b(from|as)\\b/.test(match[0]) ? \"keyword\" : \"def\";\n            }\n            if (match = stream.match(/^[\"']/)) {\n              state.soyState.push(\"string\");\n              state.quoteKind = match[0];\n              return \"string\";\n            }\n            stream.next();\n            return null;\n\n          case \"tag\":\n            var endTag;\n            var tagName;\n            if (state.tag === undefined) {\n              endTag = true;\n              tagName = '';\n            } else {\n              endTag = state.tag[0] == \"/\";\n              tagName = endTag ? state.tag.substring(1) : state.tag;\n            }\n            var tag = tags[tagName];\n            if (stream.match(/^\\/?}/)) {\n              var selfClosed = stream.current() == \"/}\";\n              if (selfClosed && !endTag) {\n                popcontext(state);\n              }\n              if (state.tag == \"/template\" || state.tag == \"/deltemplate\") {\n                state.variables = prepend(null, 'ij');\n                state.indent = 0;\n              } else {\n                state.indent -= config.indentUnit *\n                    (selfClosed || indentingTags.indexOf(state.tag) == -1 ? 2 : 1);\n              }\n              state.soyState.pop();\n              return \"keyword\";\n            } else if (stream.match(/^([\\w?]+)(?==)/)) {\n              if (state.context && state.context.tag == tagName && stream.current() == \"kind\" && (match = stream.match(/^=\"([^\"]+)/, false))) {\n                var kind = match[1];\n                state.context.kind = kind;\n                var mode = modes[kind] || modes.html;\n                var localState = last(state.localStates);\n                if (localState.mode.indent) {\n                  state.indent += localState.mode.indent(localState.state, \"\", \"\");\n                }\n                state.localStates.push({\n                  mode: mode,\n                  state: CodeMirror.startState(mode)\n                });\n              }\n              return \"attribute\";\n            }\n            return expression(stream, state);\n\n          case \"template-call-expression\":\n            if (stream.match(/^([\\w-?]+)(?==)/)) {\n              return \"attribute\";\n            } else if (stream.eat('>')) {\n              state.soyState.pop();\n              return \"keyword\";\n            } else if (stream.eat('/>')) {\n              state.soyState.pop();\n              return \"keyword\";\n            }\n            return expression(stream, state);\n          case \"literal\":\n            if (stream.match('{/literal}', false)) {\n              state.soyState.pop();\n              return this.token(stream, state);\n            }\n            return tokenUntil(stream, state, /\\{\\/literal}/);\n          case \"export\":\n            if (match = stream.match(/\\w+/)) {\n              state.soyState.pop();\n              if (match == \"const\") {\n                state.soyState.push(\"const-def\")\n                return \"keyword\";\n              } else if (match == \"extern\") {\n                state.soyState.push(\"param-def\")\n                return \"keyword\";\n              }\n            } else {\n              stream.next();\n            }\n            return null;\n          case \"const-def\":\n            if (stream.match(/^\\w+/)) {\n              state.soyState.pop();\n              return \"def\";\n            }\n            stream.next();\n            return null;\n        }\n\n        if (stream.match('{literal}')) {\n          state.indent += config.indentUnit;\n          state.soyState.push(\"literal\");\n          state.context = new Context(state.context, \"literal\", state.variables);\n          return \"keyword\";\n\n        // A tag-keyword must be followed by whitespace, comment or a closing tag.\n        } else if (match = stream.match(/^\\{([/@\\\\]?\\w+\\??)(?=$|[\\s}]|\\/[/*])/)) {\n          var prevTag = state.tag;\n          state.tag = match[1];\n          var endTag = state.tag[0] == \"/\";\n          var indentingTag = !!tags[state.tag];\n          var tagName = endTag ? state.tag.substring(1) : state.tag;\n          var tag = tags[tagName];\n          if (state.tag != \"/switch\")\n            state.indent += ((endTag || tag && tag.reduceIndent) && prevTag != \"switch\" ? 1 : 2) * config.indentUnit;\n\n          state.soyState.push(\"tag\");\n          var tagError = false;\n          if (tag) {\n            if (!endTag) {\n              if (tag.soyState) state.soyState.push(tag.soyState);\n            }\n            // If a new tag, open a new context.\n            if (!tag.noEndTag && (indentingTag || !endTag)) {\n              state.context = new Context(state.context, state.tag, tag.variableScope ? state.variables : null);\n            // Otherwise close the current context.\n            } else if (endTag) {\n              var isBalancedForExtern = tagName == 'extern' && (state.context && state.context.tag == 'export');\n              if (!state.context || ((state.context.tag != tagName) && !isBalancedForExtern)) {\n                tagError = true;\n              } else if (state.context) {\n                if (state.context.kind) {\n                  state.localStates.pop();\n                  var localState = last(state.localStates);\n                  if (localState.mode.indent) {\n                    state.indent -= localState.mode.indent(localState.state, \"\", \"\");\n                  }\n                }\n                popcontext(state);\n              }\n            }\n          } else if (endTag) {\n            // Assume all tags with a closing tag are defined in the config.\n            tagError = true;\n          }\n          return (tagError ? \"error \" : \"\") + \"keyword\";\n\n        // Not a tag-keyword; it's an implicit print tag.\n        } else if (stream.eat('{')) {\n          state.tag = \"print\";\n          state.indent += 2 * config.indentUnit;\n          state.soyState.push(\"tag\");\n          return \"keyword\";\n        } else if (!state.context && stream.sol() && stream.match(/import\\b/)) {\n          state.soyState.push(\"import\");\n          state.indent += 2 * config.indentUnit;\n          return \"keyword\";\n        } else if (match = stream.match('<{')) {\n          state.soyState.push(\"template-call-expression\");\n          state.indent += 2 * config.indentUnit;\n          state.soyState.push(\"tag\");\n          return \"keyword\";\n        } else if (match = stream.match('</>')) {\n          state.indent -= 1 * config.indentUnit;\n          return \"keyword\";\n        }\n\n        return tokenUntil(stream, state, /\\{|\\s+\\/\\/|\\/\\*/);\n      },\n\n      indent: function(state, textAfter, line) {\n        var indent = state.indent, top = last(state.soyState);\n        if (top == \"comment\") return CodeMirror.Pass;\n\n        if (top == \"literal\") {\n          if (/^\\{\\/literal}/.test(textAfter)) indent -= config.indentUnit;\n        } else {\n          if (/^\\s*\\{\\/(template|deltemplate)\\b/.test(textAfter)) return 0;\n          if (/^\\{(\\/|(fallbackmsg|elseif|else|ifempty)\\b)/.test(textAfter)) indent -= config.indentUnit;\n          if (state.tag != \"switch\" && /^\\{(case|default)\\b/.test(textAfter)) indent -= config.indentUnit;\n          if (/^\\{\\/switch\\b/.test(textAfter)) indent -= config.indentUnit;\n        }\n        var localState = last(state.localStates);\n        if (indent && localState.mode.indent) {\n          indent += localState.mode.indent(localState.state, textAfter, line);\n        }\n        return indent;\n      },\n\n      innerMode: function(state) {\n        if (state.soyState.length && last(state.soyState) != \"literal\") return null;\n        else return last(state.localStates);\n      },\n\n      electricInput: /^\\s*\\{(\\/|\\/template|\\/deltemplate|\\/switch|fallbackmsg|elseif|else|case|default|ifempty|\\/literal\\})$/,\n      lineComment: \"//\",\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      blockCommentContinue: \" * \",\n      useInnerComments: false,\n      fold: \"indent\"\n    };\n  }, \"htmlmixed\");\n\n  CodeMirror.registerHelper(\"wordChars\", \"soy\", /[\\w$]/);\n\n  CodeMirror.registerHelper(\"hintWords\", \"soy\", Object.keys(tags).concat(\n      [\"css\", \"debugger\"]));\n\n  CodeMirror.defineMIME(\"text/x-soy\", \"soy\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/sparql/sparql.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"sparql\", function(config) {\n  var indentUnit = config.indentUnit;\n  var curPunc;\n\n  function wordRegexp(words) {\n    return new RegExp(\"^(?:\" + words.join(\"|\") + \")$\", \"i\");\n  }\n  var ops = wordRegexp([\"str\", \"lang\", \"langmatches\", \"datatype\", \"bound\", \"sameterm\", \"isiri\", \"isuri\",\n                        \"iri\", \"uri\", \"bnode\", \"count\", \"sum\", \"min\", \"max\", \"avg\", \"sample\",\n                        \"group_concat\", \"rand\", \"abs\", \"ceil\", \"floor\", \"round\", \"concat\", \"substr\", \"strlen\",\n                        \"replace\", \"ucase\", \"lcase\", \"encode_for_uri\", \"contains\", \"strstarts\", \"strends\",\n                        \"strbefore\", \"strafter\", \"year\", \"month\", \"day\", \"hours\", \"minutes\", \"seconds\",\n                        \"timezone\", \"tz\", \"now\", \"uuid\", \"struuid\", \"md5\", \"sha1\", \"sha256\", \"sha384\",\n                        \"sha512\", \"coalesce\", \"if\", \"strlang\", \"strdt\", \"isnumeric\", \"regex\", \"exists\",\n                        \"isblank\", \"isliteral\", \"a\", \"bind\"]);\n  var keywords = wordRegexp([\"base\", \"prefix\", \"select\", \"distinct\", \"reduced\", \"construct\", \"describe\",\n                             \"ask\", \"from\", \"named\", \"where\", \"order\", \"limit\", \"offset\", \"filter\", \"optional\",\n                             \"graph\", \"by\", \"asc\", \"desc\", \"as\", \"having\", \"undef\", \"values\", \"group\",\n                             \"minus\", \"in\", \"not\", \"service\", \"silent\", \"using\", \"insert\", \"delete\", \"union\",\n                             \"true\", \"false\", \"with\",\n                             \"data\", \"copy\", \"to\", \"move\", \"add\", \"create\", \"drop\", \"clear\", \"load\"]);\n  var operatorChars = /[*+\\-<>=&|\\^\\/!\\?]/;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    curPunc = null;\n    if (ch == \"$\" || ch == \"?\") {\n      if(ch == \"?\" && stream.match(/\\s/, false)){\n        return \"operator\";\n      }\n      stream.match(/^[A-Za-z0-9_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][A-Za-z0-9_\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]*/);\n      return \"variable-2\";\n    }\n    else if (ch == \"<\" && !stream.match(/^[\\s\\u00a0=]/, false)) {\n      stream.match(/^[^\\s\\u00a0>]*>?/);\n      return \"atom\";\n    }\n    else if (ch == \"\\\"\" || ch == \"'\") {\n      state.tokenize = tokenLiteral(ch);\n      return state.tokenize(stream, state);\n    }\n    else if (/[{}\\(\\),\\.;\\[\\]]/.test(ch)) {\n      curPunc = ch;\n      return \"bracket\";\n    }\n    else if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    else if (ch === \"^\") {\n      ch = stream.peek();\n      if (ch === \"^\") stream.eat(\"^\");\n      else stream.eatWhile(operatorChars);\n      return \"operator\";\n    }\n    else if (operatorChars.test(ch)) {\n      stream.eatWhile(operatorChars);\n      return \"operator\";\n    }\n    else if (ch == \":\") {\n      eatPnLocal(stream);\n      return \"atom\";\n    }\n    else if (ch == \"@\") {\n      stream.eatWhile(/[a-z\\d\\-]/i);\n      return \"meta\";\n    }\n    else {\n      stream.eatWhile(/[_\\w\\d]/);\n      if (stream.eat(\":\")) {\n        eatPnLocal(stream);\n        return \"atom\";\n      }\n      var word = stream.current();\n      if (ops.test(word))\n        return \"builtin\";\n      else if (keywords.test(word))\n        return \"keyword\";\n      else\n        return \"variable\";\n    }\n  }\n\n  function eatPnLocal(stream) {\n    stream.match(/(\\.(?=[\\w_\\-\\\\%])|[:\\w_-]|\\\\[-\\\\_~.!$&'()*+,;=/?#@%]|%[a-f\\d][a-f\\d])+/i);\n  }\n\n  function tokenLiteral(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      return \"string\";\n    };\n  }\n\n  function pushContext(state, type, col) {\n    state.context = {prev: state.context, indent: state.indent, col: col, type: type};\n  }\n  function popContext(state) {\n    state.indent = state.context.indent;\n    state.context = state.context.prev;\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: tokenBase,\n              context: null,\n              indent: 0,\n              col: 0};\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (state.context && state.context.align == null) state.context.align = false;\n        state.indent = stream.indentation();\n      }\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n\n      if (style != \"comment\" && state.context && state.context.align == null && state.context.type != \"pattern\") {\n        state.context.align = true;\n      }\n\n      if (curPunc == \"(\") pushContext(state, \")\", stream.column());\n      else if (curPunc == \"[\") pushContext(state, \"]\", stream.column());\n      else if (curPunc == \"{\") pushContext(state, \"}\", stream.column());\n      else if (/[\\]\\}\\)]/.test(curPunc)) {\n        while (state.context && state.context.type == \"pattern\") popContext(state);\n        if (state.context && curPunc == state.context.type) {\n          popContext(state);\n          if (curPunc == \"}\" && state.context && state.context.type == \"pattern\")\n            popContext(state);\n        }\n      }\n      else if (curPunc == \".\" && state.context && state.context.type == \"pattern\") popContext(state);\n      else if (/atom|string|variable/.test(style) && state.context) {\n        if (/[\\}\\]]/.test(state.context.type))\n          pushContext(state, \"pattern\", stream.column());\n        else if (state.context.type == \"pattern\" && !state.context.align) {\n          state.context.align = true;\n          state.context.col = stream.column();\n        }\n      }\n\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var firstChar = textAfter && textAfter.charAt(0);\n      var context = state.context;\n      if (/[\\]\\}]/.test(firstChar))\n        while (context && context.type == \"pattern\") context = context.prev;\n\n      var closing = context && firstChar == context.type;\n      if (!context)\n        return 0;\n      else if (context.type == \"pattern\")\n        return context.col;\n      else if (context.align)\n        return context.col + (closing ? 0 : 1);\n      else\n        return context.indent + (closing ? 0 : indentUnit);\n    },\n\n    lineComment: \"#\"\n  };\n});\n\nCodeMirror.defineMIME(\"application/sparql-query\", \"sparql\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/spreadsheet/spreadsheet.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"spreadsheet\", function () {\n    return {\n      startState: function () {\n        return {\n          stringType: null,\n          stack: []\n        };\n      },\n      token: function (stream, state) {\n        if (!stream) return;\n\n        //check for state changes\n        if (state.stack.length === 0) {\n          //strings\n          if ((stream.peek() == '\"') || (stream.peek() == \"'\")) {\n            state.stringType = stream.peek();\n            stream.next(); // Skip quote\n            state.stack.unshift(\"string\");\n          }\n        }\n\n        //return state\n        //stack has\n        switch (state.stack[0]) {\n        case \"string\":\n          while (state.stack[0] === \"string\" && !stream.eol()) {\n            if (stream.peek() === state.stringType) {\n              stream.next(); // Skip quote\n              state.stack.shift(); // Clear flag\n            } else if (stream.peek() === \"\\\\\") {\n              stream.next();\n              stream.next();\n            } else {\n              stream.match(/^.[^\\\\\\\"\\']*/);\n            }\n          }\n          return \"string\";\n\n        case \"characterClass\":\n          while (state.stack[0] === \"characterClass\" && !stream.eol()) {\n            if (!(stream.match(/^[^\\]\\\\]+/) || stream.match(/^\\\\./)))\n              state.stack.shift();\n          }\n          return \"operator\";\n        }\n\n        var peek = stream.peek();\n\n        //no stack\n        switch (peek) {\n        case \"[\":\n          stream.next();\n          state.stack.unshift(\"characterClass\");\n          return \"bracket\";\n        case \":\":\n          stream.next();\n          return \"operator\";\n        case \"\\\\\":\n          if (stream.match(/\\\\[a-z]+/)) return \"string-2\";\n          else {\n            stream.next();\n            return \"atom\";\n          }\n        case \".\":\n        case \",\":\n        case \";\":\n        case \"*\":\n        case \"-\":\n        case \"+\":\n        case \"^\":\n        case \"<\":\n        case \"/\":\n        case \"=\":\n          stream.next();\n          return \"atom\";\n        case \"$\":\n          stream.next();\n          return \"builtin\";\n        }\n\n        if (stream.match(/\\d+/)) {\n          if (stream.match(/^\\w+/)) return \"error\";\n          return \"number\";\n        } else if (stream.match(/^[a-zA-Z_]\\w*/)) {\n          if (stream.match(/(?=[\\(.])/, false)) return \"keyword\";\n          return \"variable-2\";\n        } else if ([\"[\", \"]\", \"(\", \")\", \"{\", \"}\"].indexOf(peek) != -1) {\n          stream.next();\n          return \"bracket\";\n        } else if (!stream.eatSpace()) {\n          stream.next();\n        }\n        return null;\n      }\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-spreadsheet\", \"spreadsheet\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/sql/sql.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"sql\", function(config, parserConfig) {\n  var client         = parserConfig.client || {},\n      atoms          = parserConfig.atoms || {\"false\": true, \"true\": true, \"null\": true},\n      builtin        = parserConfig.builtin || set(defaultBuiltin),\n      keywords       = parserConfig.keywords || set(sqlKeywords),\n      operatorChars  = parserConfig.operatorChars || /^[*+\\-%<>!=&|~^\\/]/,\n      support        = parserConfig.support || {},\n      hooks          = parserConfig.hooks || {},\n      dateSQL        = parserConfig.dateSQL || {\"date\" : true, \"time\" : true, \"timestamp\" : true},\n      backslashStringEscapes = parserConfig.backslashStringEscapes !== false,\n      brackets       = parserConfig.brackets || /^[\\{}\\(\\)\\[\\]]/,\n      punctuation    = parserConfig.punctuation || /^[;.,:]/\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n\n    // call hooks from the mime type\n    if (hooks[ch]) {\n      var result = hooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n\n    if (support.hexNumber &&\n      ((ch == \"0\" && stream.match(/^[xX][0-9a-fA-F]+/))\n      || (ch == \"x\" || ch == \"X\") && stream.match(/^'[0-9a-fA-F]+'/))) {\n      // hex\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html\n      return \"number\";\n    } else if (support.binaryNumber &&\n      (((ch == \"b\" || ch == \"B\") && stream.match(/^'[01]+'/))\n      || (ch == \"0\" && stream.match(/^b[01]+/)))) {\n      // bitstring\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html\n      return \"number\";\n    } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) {\n      // numbers\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html\n      stream.match(/^[0-9]*(\\.[0-9]+)?([eE][-+]?[0-9]+)?/);\n      support.decimallessFloat && stream.match(/^\\.(?!\\.)/);\n      return \"number\";\n    } else if (ch == \"?\" && (stream.eatSpace() || stream.eol() || stream.eat(\";\"))) {\n      // placeholders\n      return \"variable-3\";\n    } else if (ch == \"'\" || (ch == '\"' && support.doubleQuote)) {\n      // strings\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html\n      state.tokenize = tokenLiteral(ch);\n      return state.tokenize(stream, state);\n    } else if ((((support.nCharCast && (ch == \"n\" || ch == \"N\"))\n        || (support.charsetCast && ch == \"_\" && stream.match(/[a-z][a-z0-9]*/i)))\n        && (stream.peek() == \"'\" || stream.peek() == '\"'))) {\n      // charset casting: _utf8'str', N'str', n'str'\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html\n      return \"keyword\";\n    } else if (support.escapeConstant && (ch == \"e\" || ch == \"E\")\n        && (stream.peek() == \"'\" || (stream.peek() == '\"' && support.doubleQuote))) {\n      // escape constant: E'str', e'str'\n      // ref: https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE\n      state.tokenize = function(stream, state) {\n        return (state.tokenize = tokenLiteral(stream.next(), true))(stream, state);\n      }\n      return \"keyword\";\n    } else if (support.commentSlashSlash && ch == \"/\" && stream.eat(\"/\")) {\n      // 1-line comment\n      stream.skipToEnd();\n      return \"comment\";\n    } else if ((support.commentHash && ch == \"#\")\n        || (ch == \"-\" && stream.eat(\"-\") && (!support.commentSpaceRequired || stream.eat(\" \")))) {\n      // 1-line comments\n      // ref: https://kb.askmonty.org/en/comment-syntax/\n      stream.skipToEnd();\n      return \"comment\";\n    } else if (ch == \"/\" && stream.eat(\"*\")) {\n      // multi-line comments\n      // ref: https://kb.askmonty.org/en/comment-syntax/\n      state.tokenize = tokenComment(1);\n      return state.tokenize(stream, state);\n    } else if (ch == \".\") {\n      // .1 for 0.1\n      if (support.zerolessFloat && stream.match(/^(?:\\d+(?:e[+-]?\\d+)?)/i))\n        return \"number\";\n      if (stream.match(/^\\.+/))\n        return null\n      // .table_name (ODBC)\n      // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html\n      if (support.ODBCdotTable && stream.match(/^[\\w\\d_$#]+/))\n        return \"variable-2\";\n    } else if (operatorChars.test(ch)) {\n      // operators\n      stream.eatWhile(operatorChars);\n      return \"operator\";\n    } else if (brackets.test(ch)) {\n      // brackets\n      return \"bracket\";\n    } else if (punctuation.test(ch)) {\n      // punctuation\n      stream.eatWhile(punctuation);\n      return \"punctuation\";\n    } else if (ch == '{' &&\n        (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*\"[^\"]*\"( )*}/))) {\n      // dates (weird ODBC syntax)\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html\n      return \"number\";\n    } else {\n      stream.eatWhile(/^[_\\w\\d]/);\n      var word = stream.current().toLowerCase();\n      // dates (standard SQL syntax)\n      // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html\n      if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+\"[^\"]*\"/)))\n        return \"number\";\n      if (atoms.hasOwnProperty(word)) return \"atom\";\n      if (builtin.hasOwnProperty(word)) return \"type\";\n      if (keywords.hasOwnProperty(word)) return \"keyword\";\n      if (client.hasOwnProperty(word)) return \"builtin\";\n      return null;\n    }\n  }\n\n  // 'string', with char specified in quote escaped by '\\'\n  function tokenLiteral(quote, backslashEscapes) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        escaped = (backslashStringEscapes || backslashEscapes) && !escaped && ch == \"\\\\\";\n      }\n      return \"string\";\n    };\n  }\n  function tokenComment(depth) {\n    return function(stream, state) {\n      var m = stream.match(/^.*?(\\/\\*|\\*\\/)/)\n      if (!m) stream.skipToEnd()\n      else if (m[1] == \"/*\") state.tokenize = tokenComment(depth + 1)\n      else if (depth > 1) state.tokenize = tokenComment(depth - 1)\n      else state.tokenize = tokenBase\n      return \"comment\"\n    }\n  }\n\n  function pushContext(stream, state, type) {\n    state.context = {\n      prev: state.context,\n      indent: stream.indentation(),\n      col: stream.column(),\n      type: type\n    };\n  }\n\n  function popContext(state) {\n    state.indent = state.context.indent;\n    state.context = state.context.prev;\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: tokenBase, context: null};\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (state.context && state.context.align == null)\n          state.context.align = false;\n      }\n      if (state.tokenize == tokenBase && stream.eatSpace()) return null;\n\n      var style = state.tokenize(stream, state);\n      if (style == \"comment\") return style;\n\n      if (state.context && state.context.align == null)\n        state.context.align = true;\n\n      var tok = stream.current();\n      if (tok == \"(\")\n        pushContext(stream, state, \")\");\n      else if (tok == \"[\")\n        pushContext(stream, state, \"]\");\n      else if (state.context && state.context.type == tok)\n        popContext(state);\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var cx = state.context;\n      if (!cx) return CodeMirror.Pass;\n      var closing = textAfter.charAt(0) == cx.type;\n      if (cx.align) return cx.col + (closing ? 0 : 1);\n      else return cx.indent + (closing ? 0 : config.indentUnit);\n    },\n\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: support.commentSlashSlash ? \"//\" : support.commentHash ? \"#\" : \"--\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\"\n  };\n});\n\n  // `identifier`\n  function hookIdentifier(stream) {\n    // MySQL/MariaDB identifiers\n    // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html\n    var ch;\n    while ((ch = stream.next()) != null) {\n      if (ch == \"`\" && !stream.eat(\"`\")) return \"variable-2\";\n    }\n    stream.backUp(stream.current().length - 1);\n    return stream.eatWhile(/\\w/) ? \"variable-2\" : null;\n  }\n\n  // \"identifier\"\n  function hookIdentifierDoublequote(stream) {\n    // Standard SQL /SQLite identifiers\n    // ref: http://web.archive.org/web/20160813185132/http://savage.net.au/SQL/sql-99.bnf.html#delimited%20identifier\n    // ref: http://sqlite.org/lang_keywords.html\n    var ch;\n    while ((ch = stream.next()) != null) {\n      if (ch == \"\\\"\" && !stream.eat(\"\\\"\")) return \"variable-2\";\n    }\n    stream.backUp(stream.current().length - 1);\n    return stream.eatWhile(/\\w/) ? \"variable-2\" : null;\n  }\n\n  // variable token\n  function hookVar(stream) {\n    // variables\n    // @@prefix.varName @varName\n    // varName can be quoted with ` or ' or \"\n    // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html\n    if (stream.eat(\"@\")) {\n      stream.match('session.');\n      stream.match('local.');\n      stream.match('global.');\n    }\n\n    if (stream.eat(\"'\")) {\n      stream.match(/^.*'/);\n      return \"variable-2\";\n    } else if (stream.eat('\"')) {\n      stream.match(/^.*\"/);\n      return \"variable-2\";\n    } else if (stream.eat(\"`\")) {\n      stream.match(/^.*`/);\n      return \"variable-2\";\n    } else if (stream.match(/^[0-9a-zA-Z$\\.\\_]+/)) {\n      return \"variable-2\";\n    }\n    return null;\n  };\n\n  // short client keyword token\n  function hookClient(stream) {\n    // \\N means NULL\n    // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html\n    if (stream.eat(\"N\")) {\n        return \"atom\";\n    }\n    // \\g, etc\n    // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html\n    return stream.match(/^[a-zA-Z.#!?]/) ? \"variable-2\" : null;\n  }\n\n  // these keywords are used by all SQL dialects (however, a mode can still overwrite it)\n  var sqlKeywords = \"alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit \";\n\n  // turn a space-separated list into an array\n  function set(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  var defaultBuiltin = \"bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric\"\n\n  // A generic SQL Mode. It's not a standard, it just try to support what is generally supported\n  CodeMirror.defineMIME(\"text/x-sql\", {\n    name: \"sql\",\n    keywords: set(sqlKeywords + \"begin\"),\n    builtin: set(defaultBuiltin),\n    atoms: set(\"false true null unknown\"),\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable doubleQuote binaryNumber hexNumber\")\n  });\n\n  CodeMirror.defineMIME(\"text/x-mssql\", {\n    name: \"sql\",\n    client: set(\"$partition binary_checksum checksum connectionproperty context_info current_request_id error_line error_message error_number error_procedure error_severity error_state formatmessage get_filestream_transaction_context getansinull host_id host_name isnull isnumeric min_active_rowversion newid newsequentialid rowcount_big xact_state object_id\"),\n    keywords: set(sqlKeywords + \"begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare exec go if use index holdlock nolock nowait paglock readcommitted readcommittedlock readpast readuncommitted repeatableread rowlock serializable snapshot tablock tablockx updlock with\"),\n    builtin: set(\"bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table \"),\n    atoms: set(\"is not null like and or in left right between inner outer join all any some cross unpivot pivot exists\"),\n    operatorChars: /^[*+\\-%<>!=^\\&|\\/]/,\n    brackets: /^[\\{}\\(\\)]/,\n    punctuation: /^[;.,:/]/,\n    backslashStringEscapes: false,\n    dateSQL: set(\"date datetimeoffset datetime2 smalldatetime datetime time\"),\n    hooks: {\n      \"@\":   hookVar\n    }\n  });\n\n  CodeMirror.defineMIME(\"text/x-mysql\", {\n    name: \"sql\",\n    client: set(\"charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee\"),\n    keywords: set(sqlKeywords + \"accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat\"),\n    builtin: set(\"bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric\"),\n    atoms: set(\"false true null unknown\"),\n    operatorChars: /^[*+\\-%<>!=&|^]/,\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired\"),\n    hooks: {\n      \"@\":   hookVar,\n      \"`\":   hookIdentifier,\n      \"\\\\\":  hookClient\n    }\n  });\n\n  CodeMirror.defineMIME(\"text/x-mariadb\", {\n    name: \"sql\",\n    client: set(\"charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee\"),\n    keywords: set(sqlKeywords + \"accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group group_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat\"),\n    builtin: set(\"bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric\"),\n    atoms: set(\"false true null unknown\"),\n    operatorChars: /^[*+\\-%<>!=&|^]/,\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired\"),\n    hooks: {\n      \"@\":   hookVar,\n      \"`\":   hookIdentifier,\n      \"\\\\\":  hookClient\n    }\n  });\n\n  // provided by the phpLiteAdmin project - phpliteadmin.org\n  CodeMirror.defineMIME(\"text/x-sqlite\", {\n    name: \"sql\",\n    // commands of the official SQLite client, ref: https://www.sqlite.org/cli.html#dotcmd\n    client: set(\"auth backup bail binary changes check clone databases dbinfo dump echo eqp exit explain fullschema headers help import imposter indexes iotrace limit lint load log mode nullvalue once open output print prompt quit read restore save scanstats schema separator session shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width\"),\n    // ref: http://sqlite.org/lang_keywords.html\n    keywords: set(sqlKeywords + \"abort action add after all analyze attach autoincrement before begin cascade case cast check collate column commit conflict constraint cross current_date current_time current_timestamp database default deferrable deferred detach each else end escape except exclusive exists explain fail for foreign full glob if ignore immediate index indexed initially inner instead intersect isnull key left limit match natural no notnull null of offset outer plan pragma primary query raise recursive references regexp reindex release rename replace restrict right rollback row savepoint temp temporary then to transaction trigger unique using vacuum view virtual when with without\"),\n    // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types.\n    builtin: set(\"bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text clob bigint int int2 int8 integer float double char varchar date datetime year unsigned signed numeric real\"),\n    // ref: http://sqlite.org/syntax/literal-value.html\n    atoms: set(\"null current_date current_time current_timestamp\"),\n    // ref: http://sqlite.org/lang_expr.html#binaryops\n    operatorChars: /^[*+\\-%<>!=&|/~]/,\n    // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types.\n    dateSQL: set(\"date time timestamp datetime\"),\n    support: set(\"decimallessFloat zerolessFloat\"),\n    identifierQuote: \"\\\"\",  //ref: http://sqlite.org/lang_keywords.html\n    hooks: {\n      // bind-parameters ref:http://sqlite.org/lang_expr.html#varparam\n      \"@\":   hookVar,\n      \":\":   hookVar,\n      \"?\":   hookVar,\n      \"$\":   hookVar,\n      // The preferred way to escape Identifiers is using double quotes, ref: http://sqlite.org/lang_keywords.html\n      \"\\\"\":   hookIdentifierDoublequote,\n      // there is also support for backticks, ref: http://sqlite.org/lang_keywords.html\n      \"`\":   hookIdentifier\n    }\n  });\n\n  // the query language used by Apache Cassandra is called CQL, but this mime type\n  // is called Cassandra to avoid confusion with Contextual Query Language\n  CodeMirror.defineMIME(\"text/x-cassandra\", {\n    name: \"sql\",\n    client: { },\n    keywords: set(\"add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime\"),\n    builtin: set(\"ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint\"),\n    atoms: set(\"false true infinity NaN\"),\n    operatorChars: /^[<>=]/,\n    dateSQL: { },\n    support: set(\"commentSlashSlash decimallessFloat\"),\n    hooks: { }\n  });\n\n  // this is based on Peter Raganitsch's 'plsql' mode\n  CodeMirror.defineMIME(\"text/x-plsql\", {\n    name:       \"sql\",\n    client:     set(\"appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap\"),\n    keywords:   set(\"abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work\"),\n    builtin:    set(\"abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml\"),\n    operatorChars: /^[*\\/+\\-%<>!=~]/,\n    dateSQL:    set(\"date time timestamp\"),\n    support:    set(\"doubleQuote nCharCast zerolessFloat binaryNumber hexNumber\")\n  });\n\n  // Created to support specific hive keywords\n  CodeMirror.defineMIME(\"text/x-hive\", {\n    name: \"sql\",\n    keywords: set(\"select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with admin authorization char compact compactions conf cube current current_date current_timestamp day decimal defined dependency directories elem_type exchange file following for grouping hour ignore inner interval jar less logical macro minute month more none noscan over owner partialscan preceding pretty principals protection reload rewrite role roles rollup rows second server sets skewed transactions truncate unbounded unset uri user values window year\"),\n    builtin: set(\"bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype key_type utctimestamp value_type varchar\"),\n    atoms: set(\"false true null unknown\"),\n    operatorChars: /^[*+\\-%<>!=]/,\n    dateSQL: set(\"date timestamp\"),\n    support: set(\"ODBCdotTable doubleQuote binaryNumber hexNumber\")\n  });\n\n  CodeMirror.defineMIME(\"text/x-pgsql\", {\n    name: \"sql\",\n    client: set(\"source\"),\n    // For PostgreSQL - https://www.postgresql.org/docs/11/sql-keywords-appendix.html\n    // For pl/pgsql lang - https://github.com/postgres/postgres/blob/REL_11_2/src/pl/plpgsql/src/pl_scanner.c\n    keywords: set(sqlKeywords + \"a abort abs absent absolute access according action ada add admin after aggregate alias all allocate also alter always analyse analyze and any are array array_agg array_max_cardinality as asc asensitive assert assertion assignment asymmetric at atomic attach attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli between bigint binary bit bit_length blob blocked bom boolean both breadth by c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain char char_length character character_length character_set_catalog character_set_name character_set_schema characteristics characters check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column column_name columns command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constant constraint constraint_catalog constraint_name constraint_schema constraints constructor contains content continue control conversion convert copy corr corresponding cost count covar_pop covar_samp create cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datatype date datetime_interval_code datetime_interval_precision day db deallocate debug dec decimal declare default defaults deferrable deferred defined definer degree delete delimiter delimiters dense_rank depends depth deref derived desc describe descriptor detach detail deterministic diagnostics dictionary disable discard disconnect dispatch distinct dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain double drop dump dynamic dynamic_function dynamic_function_code each element else elseif elsif empty enable encoding encrypted end end_frame end_partition endexec enforced enum equals errcode error escape event every except exception exclude excluding exclusive exec execute exists exit exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreach foreign fortran forward found frame_row free freeze from fs full function functions fusion g general generated get global go goto grant granted greatest group grouping groups handler having header hex hierarchy hint hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import in include including increment indent index indexes indicator info inherit inherits initially inline inner inout input insensitive insert instance instantiable instead int integer integrity intersect intersection interval into invoker is isnull isolation join k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like like_regex limit link listen ln load local localtime localtimestamp location locator lock locked log logged loop lower m map mapping match matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized not nothing notice notify notnull nowait nth_value ntile null nullable nullif nulls number numeric object occurrences_regex octet_length octets of off offset oids old on only open operator option options or order ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parallel parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password path percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding precision prepare prepared preserve primary print_strict_params prior privileges procedural procedure procedures program public publication query quote raise range rank read reads real reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result result_oid return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns reverse revoke right role rollback rollup routine routine_catalog routine_name routine_schema routines row row_count row_number rows rowtype rule savepoint scale schema schema_name schemas scope scope_catalog scope_name scope_schema scroll search second section security select selective self sensitive sequence sequences serializable server server_name session session_user set setof sets share show similar simple size skip slice smallint snapshot some source space specific specific_name specifictype sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable stacked standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time system_user t table table_name tables tablesample tablespace temp template temporary text then ties time timestamp timezone_hour timezone_minute to token top_level_count trailing transaction transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted union unique unknown unlink unlisten unlogged unnamed unnest until untyped update upper uri usage use_column use_variable user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of values var_pop var_samp varbinary varchar variable_conflict variadic varying verbose version versioning view views volatile warning when whenever where while whitespace width_bucket window with within without work wrapper write xml xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes zone\"),\n    // https://www.postgresql.org/docs/11/datatype.html\n    builtin: set(\"bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml\"),\n    atoms: set(\"false true null unknown\"),\n    operatorChars: /^[*\\/+\\-%<>!=&|^\\/#@?~]/,\n    backslashStringEscapes: false,\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast escapeConstant\")\n  });\n\n  // Google's SQL-like query language, GQL\n  CodeMirror.defineMIME(\"text/x-gql\", {\n    name: \"sql\",\n    keywords: set(\"ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where\"),\n    atoms: set(\"false true\"),\n    builtin: set(\"blob datetime first key __key__ string integer double boolean null\"),\n    operatorChars: /^[*+\\-%<>!=]/\n  });\n\n  // Greenplum\n  CodeMirror.defineMIME(\"text/x-gpsql\", {\n    name: \"sql\",\n    client: set(\"source\"),\n    //https://github.com/greenplum-db/gpdb/blob/master/src/include/parser/kwlist.h\n    keywords: set(\"abort absolute access action active add admin after aggregate all also alter always analyse analyze and any array as asc assertion assignment asymmetric at authorization backward before begin between bigint binary bit boolean both by cache called cascade cascaded case cast chain char character characteristics check checkpoint class close cluster coalesce codegen collate column comment commit committed concurrency concurrently configuration connection constraint constraints contains content continue conversion copy cost cpu_rate_limit create createdb createexttable createrole createuser cross csv cube current current_catalog current_date current_role current_schema current_time current_timestamp current_user cursor cycle data database day deallocate dec decimal declare decode default defaults deferrable deferred definer delete delimiter delimiters deny desc dictionary disable discard distinct distributed do document domain double drop dxl each else enable encoding encrypted end enum errors escape every except exchange exclude excluding exclusive execute exists explain extension external extract false family fetch fields filespace fill filter first float following for force foreign format forward freeze from full function global grant granted greatest group group_id grouping handler hash having header hold host hour identity if ignore ilike immediate immutable implicit in including inclusive increment index indexes inherit inherits initially inline inner inout input insensitive insert instead int integer intersect interval into invoker is isnull isolation join key language large last leading least left level like limit list listen load local localtime localtimestamp location lock log login mapping master match maxvalue median merge minute minvalue missing mode modifies modify month move name names national natural nchar new newline next no nocreatedb nocreateexttable nocreaterole nocreateuser noinherit nologin none noovercommit nosuperuser not nothing notify notnull nowait null nullif nulls numeric object of off offset oids old on only operator option options or order ordered others out outer over overcommit overlaps overlay owned owner parser partial partition partitions passing password percent percentile_cont percentile_disc placing plans position preceding precision prepare prepared preserve primary prior privileges procedural procedure protocol queue quote randomly range read readable reads real reassign recheck recursive ref references reindex reject relative release rename repeatable replace replica reset resource restart restrict returning returns revoke right role rollback rollup rootpartition row rows rule savepoint scatter schema scroll search second security segment select sequence serializable session session_user set setof sets share show similar simple smallint some split sql stable standalone start statement statistics stdin stdout storage strict strip subpartition subpartitions substring superuser symmetric sysid system table tablespace temp template temporary text then threshold ties time timestamp to trailing transaction treat trigger trim true truncate trusted type unbounded uncommitted unencrypted union unique unknown unlisten until update user using vacuum valid validation validator value values varchar variadic varying verbose version view volatile web when where whitespace window with within without work writable write xml xmlattributes xmlconcat xmlelement xmlexists xmlforest xmlparse xmlpi xmlroot xmlserialize year yes zone\"),\n    builtin: set(\"bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml\"),\n    atoms: set(\"false true null unknown\"),\n    operatorChars: /^[*+\\-%<>!=&|^\\/#@?~]/,\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast\")\n  });\n\n  // Spark SQL\n  CodeMirror.defineMIME(\"text/x-sparksql\", {\n    name: \"sql\",\n    keywords: set(\"add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases data dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with\"),\n    builtin: set(\"abs acos acosh add_months aggregate and any approx_count_distinct approx_percentile array array_contains array_distinct array_except array_intersect array_join array_max array_min array_position array_remove array_repeat array_sort array_union arrays_overlap arrays_zip ascii asin asinh assert_true atan atan2 atanh avg base64 between bigint bin binary bit_and bit_count bit_get bit_length bit_or bit_xor bool_and bool_or boolean bround btrim cardinality case cast cbrt ceil ceiling char char_length character_length chr coalesce collect_list collect_set concat concat_ws conv corr cos cosh cot count count_if count_min_sketch covar_pop covar_samp crc32 cume_dist current_catalog current_database current_date current_timestamp current_timezone current_user date date_add date_format date_from_unix_date date_part date_sub date_trunc datediff day dayofmonth dayofweek dayofyear decimal decode degrees delimited dense_rank div double e element_at elt encode every exists exp explode explode_outer expm1 extract factorial filter find_in_set first first_value flatten float floor forall format_number format_string from_csv from_json from_unixtime from_utc_timestamp get_json_object getbit greatest grouping grouping_id hash hex hour hypot if ifnull in initcap inline inline_outer input_file_block_length input_file_block_start input_file_name inputformat instr int isnan isnotnull isnull java_method json_array_length json_object_keys json_tuple kurtosis lag last last_day last_value lcase lead least left length levenshtein like ln locate log log10 log1p log2 lower lpad ltrim make_date make_dt_interval make_interval make_timestamp make_ym_interval map map_concat map_entries map_filter map_from_arrays map_from_entries map_keys map_values map_zip_with max max_by md5 mean min min_by minute mod monotonically_increasing_id month months_between named_struct nanvl negative next_day not now nth_value ntile nullif nvl nvl2 octet_length or outputformat overlay parse_url percent_rank percentile percentile_approx pi pmod posexplode posexplode_outer position positive pow power printf quarter radians raise_error rand randn random rank rcfile reflect regexp regexp_extract regexp_extract_all regexp_like regexp_replace repeat replace reverse right rint rlike round row_number rpad rtrim schema_of_csv schema_of_json second sentences sequence sequencefile serde session_window sha sha1 sha2 shiftleft shiftright shiftrightunsigned shuffle sign signum sin sinh size skewness slice smallint some sort_array soundex space spark_partition_id split sqrt stack std stddev stddev_pop stddev_samp str_to_map string struct substr substring substring_index sum tan tanh textfile timestamp timestamp_micros timestamp_millis timestamp_seconds tinyint to_csv to_date to_json to_timestamp to_unix_timestamp to_utc_timestamp transform transform_keys transform_values translate trim trunc try_add try_divide typeof ucase unbase64 unhex uniontype unix_date unix_micros unix_millis unix_seconds unix_timestamp upper uuid var_pop var_samp variance version weekday weekofyear when width_bucket window xpath xpath_boolean xpath_double xpath_float xpath_int xpath_long xpath_number xpath_short xpath_string xxhash64 year zip_with\"),\n    atoms: set(\"false true null\"),\n    operatorChars: /^[*\\/+\\-%<>!=~&|^]/,\n    dateSQL: set(\"date time timestamp\"),\n    support: set(\"ODBCdotTable doubleQuote zerolessFloat\")\n  });\n\n  // Esper\n  CodeMirror.defineMIME(\"text/x-esper\", {\n    name: \"sql\",\n    client: set(\"source\"),\n    // http://www.espertech.com/esper/release-5.5.0/esper-reference/html/appendix_keywords.html\n    keywords: set(\"alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit after all and as at asc avedev avg between by case cast coalesce count create current_timestamp day days delete define desc distinct else end escape events every exists false first from full group having hour hours in inner insert instanceof into irstream is istream join last lastweekday left limit like max match_recognize matches median measures metadatasql min minute minutes msec millisecond milliseconds not null offset on or order outer output partition pattern prev prior regexp retain-union retain-intersection right rstream sec second seconds select set some snapshot sql stddev sum then true unidirectional until update variable weekday when where window\"),\n    builtin: {},\n    atoms: set(\"false true null\"),\n    operatorChars: /^[*+\\-%<>!=&|^\\/#@?~]/,\n    dateSQL: set(\"time\"),\n    support: set(\"decimallessFloat zerolessFloat binaryNumber hexNumber\")\n  });\n});\n\n/*\n  How Properties of Mime Types are used by SQL Mode\n  =================================================\n\n  keywords:\n    A list of keywords you want to be highlighted.\n  builtin:\n    A list of builtin types you want to be highlighted (if you want types to be of class \"builtin\" instead of \"keyword\").\n  operatorChars:\n    All characters that must be handled as operators.\n  client:\n    Commands parsed and executed by the client (not the server).\n  support:\n    A list of supported syntaxes which are not common, but are supported by more than 1 DBMS.\n    * ODBCdotTable: .tableName\n    * zerolessFloat: .1\n    * doubleQuote\n    * nCharCast: N'string'\n    * charsetCast: _utf8'string'\n    * commentHash: use # char for comments\n    * commentSlashSlash: use // for comments\n    * commentSpaceRequired: require a space after -- for comments\n  atoms:\n    Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others:\n    UNKNOWN, INFINITY, UNDERFLOW, NaN...\n  dateSQL:\n    Used for date/time SQL standard syntax, because not all DBMS's support same temporal types.\n*/\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/stex/stex.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\n * Author: Constantin Jucovschi (c.jucovschi@jacobs-university.de)\n * Licence: MIT\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"stex\", function(_config, parserConfig) {\n    \"use strict\";\n\n    function pushCommand(state, command) {\n      state.cmdState.push(command);\n    }\n\n    function peekCommand(state) {\n      if (state.cmdState.length > 0) {\n        return state.cmdState[state.cmdState.length - 1];\n      } else {\n        return null;\n      }\n    }\n\n    function popCommand(state) {\n      var plug = state.cmdState.pop();\n      if (plug) {\n        plug.closeBracket();\n      }\n    }\n\n    // returns the non-default plugin closest to the end of the list\n    function getMostPowerful(state) {\n      var context = state.cmdState;\n      for (var i = context.length - 1; i >= 0; i--) {\n        var plug = context[i];\n        if (plug.name == \"DEFAULT\") {\n          continue;\n        }\n        return plug;\n      }\n      return { styleIdentifier: function() { return null; } };\n    }\n\n    function addPluginPattern(pluginName, cmdStyle, styles) {\n      return function () {\n        this.name = pluginName;\n        this.bracketNo = 0;\n        this.style = cmdStyle;\n        this.styles = styles;\n        this.argument = null;   // \\begin and \\end have arguments that follow. These are stored in the plugin\n\n        this.styleIdentifier = function() {\n          return this.styles[this.bracketNo - 1] || null;\n        };\n        this.openBracket = function() {\n          this.bracketNo++;\n          return \"bracket\";\n        };\n        this.closeBracket = function() {};\n      };\n    }\n\n    var plugins = {};\n\n    plugins[\"importmodule\"] = addPluginPattern(\"importmodule\", \"tag\", [\"string\", \"builtin\"]);\n    plugins[\"documentclass\"] = addPluginPattern(\"documentclass\", \"tag\", [\"\", \"atom\"]);\n    plugins[\"usepackage\"] = addPluginPattern(\"usepackage\", \"tag\", [\"atom\"]);\n    plugins[\"begin\"] = addPluginPattern(\"begin\", \"tag\", [\"atom\"]);\n    plugins[\"end\"] = addPluginPattern(\"end\", \"tag\", [\"atom\"]);\n\n    plugins[\"label\"    ] = addPluginPattern(\"label\"    , \"tag\", [\"atom\"]);\n    plugins[\"ref\"      ] = addPluginPattern(\"ref\"      , \"tag\", [\"atom\"]);\n    plugins[\"eqref\"    ] = addPluginPattern(\"eqref\"    , \"tag\", [\"atom\"]);\n    plugins[\"cite\"     ] = addPluginPattern(\"cite\"     , \"tag\", [\"atom\"]);\n    plugins[\"bibitem\"  ] = addPluginPattern(\"bibitem\"  , \"tag\", [\"atom\"]);\n    plugins[\"Bibitem\"  ] = addPluginPattern(\"Bibitem\"  , \"tag\", [\"atom\"]);\n    plugins[\"RBibitem\" ] = addPluginPattern(\"RBibitem\" , \"tag\", [\"atom\"]);\n\n    plugins[\"DEFAULT\"] = function () {\n      this.name = \"DEFAULT\";\n      this.style = \"tag\";\n\n      this.styleIdentifier = this.openBracket = this.closeBracket = function() {};\n    };\n\n    function setState(state, f) {\n      state.f = f;\n    }\n\n    // called when in a normal (no environment) context\n    function normal(source, state) {\n      var plug;\n      // Do we look like '\\command' ?  If so, attempt to apply the plugin 'command'\n      if (source.match(/^\\\\[a-zA-Z@]+/)) {\n        var cmdName = source.current().slice(1);\n        plug = plugins.hasOwnProperty(cmdName) ? plugins[cmdName] : plugins[\"DEFAULT\"];\n        plug = new plug();\n        pushCommand(state, plug);\n        setState(state, beginParams);\n        return plug.style;\n      }\n\n      // escape characters\n      if (source.match(/^\\\\[$&%#{}_]/)) {\n        return \"tag\";\n      }\n\n      // white space control characters\n      if (source.match(/^\\\\[,;!\\/\\\\]/)) {\n        return \"tag\";\n      }\n\n      // find if we're starting various math modes\n      if (source.match(\"\\\\[\")) {\n        setState(state, function(source, state){ return inMathMode(source, state, \"\\\\]\"); });\n        return \"keyword\";\n      }\n      if (source.match(\"\\\\(\")) {\n        setState(state, function(source, state){ return inMathMode(source, state, \"\\\\)\"); });\n        return \"keyword\";\n      }\n      if (source.match(\"$$\")) {\n        setState(state, function(source, state){ return inMathMode(source, state, \"$$\"); });\n        return \"keyword\";\n      }\n      if (source.match(\"$\")) {\n        setState(state, function(source, state){ return inMathMode(source, state, \"$\"); });\n        return \"keyword\";\n      }\n\n      var ch = source.next();\n      if (ch == \"%\") {\n        source.skipToEnd();\n        return \"comment\";\n      } else if (ch == '}' || ch == ']') {\n        plug = peekCommand(state);\n        if (plug) {\n          plug.closeBracket(ch);\n          setState(state, beginParams);\n        } else {\n          return \"error\";\n        }\n        return \"bracket\";\n      } else if (ch == '{' || ch == '[') {\n        plug = plugins[\"DEFAULT\"];\n        plug = new plug();\n        pushCommand(state, plug);\n        return \"bracket\";\n      } else if (/\\d/.test(ch)) {\n        source.eatWhile(/[\\w.%]/);\n        return \"atom\";\n      } else {\n        source.eatWhile(/[\\w\\-_]/);\n        plug = getMostPowerful(state);\n        if (plug.name == 'begin') {\n          plug.argument = source.current();\n        }\n        return plug.styleIdentifier();\n      }\n    }\n\n    function inMathMode(source, state, endModeSeq) {\n      if (source.eatSpace()) {\n        return null;\n      }\n      if (endModeSeq && source.match(endModeSeq)) {\n        setState(state, normal);\n        return \"keyword\";\n      }\n      if (source.match(/^\\\\[a-zA-Z@]+/)) {\n        return \"tag\";\n      }\n      if (source.match(/^[a-zA-Z]+/)) {\n        return \"variable-2\";\n      }\n      // escape characters\n      if (source.match(/^\\\\[$&%#{}_]/)) {\n        return \"tag\";\n      }\n      // white space control characters\n      if (source.match(/^\\\\[,;!\\/]/)) {\n        return \"tag\";\n      }\n      // special math-mode characters\n      if (source.match(/^[\\^_&]/)) {\n        return \"tag\";\n      }\n      // non-special characters\n      if (source.match(/^[+\\-<>|=,\\/@!*:;'\"`~#?]/)) {\n        return null;\n      }\n      if (source.match(/^(\\d+\\.\\d*|\\d*\\.\\d+|\\d+)/)) {\n        return \"number\";\n      }\n      var ch = source.next();\n      if (ch == \"{\" || ch == \"}\" || ch == \"[\" || ch == \"]\" || ch == \"(\" || ch == \")\") {\n        return \"bracket\";\n      }\n\n      if (ch == \"%\") {\n        source.skipToEnd();\n        return \"comment\";\n      }\n      return \"error\";\n    }\n\n    function beginParams(source, state) {\n      var ch = source.peek(), lastPlug;\n      if (ch == '{' || ch == '[') {\n        lastPlug = peekCommand(state);\n        lastPlug.openBracket(ch);\n        source.eat(ch);\n        setState(state, normal);\n        return \"bracket\";\n      }\n      if (/[ \\t\\r]/.test(ch)) {\n        source.eat(ch);\n        return null;\n      }\n      setState(state, normal);\n      popCommand(state);\n\n      return normal(source, state);\n    }\n\n    return {\n      startState: function() {\n        var f = parserConfig.inMathMode ? function(source, state){ return inMathMode(source, state); } : normal;\n        return {\n          cmdState: [],\n          f: f\n        };\n      },\n      copyState: function(s) {\n        return {\n          cmdState: s.cmdState.slice(),\n          f: s.f\n        };\n      },\n      token: function(stream, state) {\n        return state.f(stream, state);\n      },\n      blankLine: function(state) {\n        state.f = normal;\n        state.cmdState.length = 0;\n      },\n      lineComment: \"%\"\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-stex\", \"stex\");\n  CodeMirror.defineMIME(\"text/x-latex\", \"stex\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/stylus/stylus.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Stylus mode created by Dmitry Kiselyov http://git.io/AaRB\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"stylus\", function(config) {\n    var indentUnit = config.indentUnit,\n        indentUnitString = '',\n        tagKeywords = keySet(tagKeywords_),\n        tagVariablesRegexp = /^(a|b|i|s|col|em)$/i,\n        propertyKeywords = keySet(propertyKeywords_),\n        nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_),\n        valueKeywords = keySet(valueKeywords_),\n        colorKeywords = keySet(colorKeywords_),\n        documentTypes = keySet(documentTypes_),\n        documentTypesRegexp = wordRegexp(documentTypes_),\n        mediaFeatures = keySet(mediaFeatures_),\n        mediaTypes = keySet(mediaTypes_),\n        fontProperties = keySet(fontProperties_),\n        operatorsRegexp = /^\\s*([.]{2,3}|&&|\\|\\||\\*\\*|[?!=:]?=|[-+*\\/%<>]=?|\\?:|\\~)/,\n        wordOperatorKeywordsRegexp = wordRegexp(wordOperatorKeywords_),\n        blockKeywords = keySet(blockKeywords_),\n        vendorPrefixesRegexp = new RegExp(/^\\-(moz|ms|o|webkit)-/i),\n        commonAtoms = keySet(commonAtoms_),\n        firstWordMatch = \"\",\n        states = {},\n        ch,\n        style,\n        type,\n        override;\n\n    while (indentUnitString.length < indentUnit) indentUnitString += ' ';\n\n    /**\n     * Tokenizers\n     */\n    function tokenBase(stream, state) {\n      firstWordMatch = stream.string.match(/(^[\\w-]+\\s*=\\s*$)|(^\\s*[\\w-]+\\s*=\\s*[\\w-])|(^\\s*(\\.|#|@|\\$|\\&|\\[|\\d|\\+|::?|\\{|\\>|~|\\/)?\\s*[\\w-]*([a-z0-9-]|\\*|\\/\\*)(\\(|,)?)/);\n      state.context.line.firstWord = firstWordMatch ? firstWordMatch[0].replace(/^\\s*/, \"\") : \"\";\n      state.context.line.indent = stream.indentation();\n      ch = stream.peek();\n\n      // Line comment\n      if (stream.match(\"//\")) {\n        stream.skipToEnd();\n        return [\"comment\", \"comment\"];\n      }\n      // Block comment\n      if (stream.match(\"/*\")) {\n        state.tokenize = tokenCComment;\n        return tokenCComment(stream, state);\n      }\n      // String\n      if (ch == \"\\\"\" || ch == \"'\") {\n        stream.next();\n        state.tokenize = tokenString(ch);\n        return state.tokenize(stream, state);\n      }\n      // Def\n      if (ch == \"@\") {\n        stream.next();\n        stream.eatWhile(/[\\w\\\\-]/);\n        return [\"def\", stream.current()];\n      }\n      // ID selector or Hex color\n      if (ch == \"#\") {\n        stream.next();\n        // Hex color\n        if (stream.match(/^[0-9a-f]{3}([0-9a-f]([0-9a-f]{2}){0,2})?\\b(?!-)/i)) {\n          return [\"atom\", \"atom\"];\n        }\n        // ID selector\n        if (stream.match(/^[a-z][\\w-]*/i)) {\n          return [\"builtin\", \"hash\"];\n        }\n      }\n      // Vendor prefixes\n      if (stream.match(vendorPrefixesRegexp)) {\n        return [\"meta\", \"vendor-prefixes\"];\n      }\n      // Numbers\n      if (stream.match(/^-?[0-9]?\\.?[0-9]/)) {\n        stream.eatWhile(/[a-z%]/i);\n        return [\"number\", \"unit\"];\n      }\n      // !important|optional\n      if (ch == \"!\") {\n        stream.next();\n        return [stream.match(/^(important|optional)/i) ? \"keyword\": \"operator\", \"important\"];\n      }\n      // Class\n      if (ch == \".\" && stream.match(/^\\.[a-z][\\w-]*/i)) {\n        return [\"qualifier\", \"qualifier\"];\n      }\n      // url url-prefix domain regexp\n      if (stream.match(documentTypesRegexp)) {\n        if (stream.peek() == \"(\") state.tokenize = tokenParenthesized;\n        return [\"property\", \"word\"];\n      }\n      // Mixins / Functions\n      if (stream.match(/^[a-z][\\w-]*\\(/i)) {\n        stream.backUp(1);\n        return [\"keyword\", \"mixin\"];\n      }\n      // Block mixins\n      if (stream.match(/^(\\+|-)[a-z][\\w-]*\\(/i)) {\n        stream.backUp(1);\n        return [\"keyword\", \"block-mixin\"];\n      }\n      // Parent Reference BEM naming\n      if (stream.string.match(/^\\s*&/) && stream.match(/^[-_]+[a-z][\\w-]*/)) {\n        return [\"qualifier\", \"qualifier\"];\n      }\n      // / Root Reference & Parent Reference\n      if (stream.match(/^(\\/|&)(-|_|:|\\.|#|[a-z])/)) {\n        stream.backUp(1);\n        return [\"variable-3\", \"reference\"];\n      }\n      if (stream.match(/^&{1}\\s*$/)) {\n        return [\"variable-3\", \"reference\"];\n      }\n      // Word operator\n      if (stream.match(wordOperatorKeywordsRegexp)) {\n        return [\"operator\", \"operator\"];\n      }\n      // Word\n      if (stream.match(/^\\$?[-_]*[a-z0-9]+[\\w-]*/i)) {\n        // Variable\n        if (stream.match(/^(\\.|\\[)[\\w-\\'\\\"\\]]+/i, false)) {\n          if (!wordIsTag(stream.current())) {\n            stream.match('.');\n            return [\"variable-2\", \"variable-name\"];\n          }\n        }\n        return [\"variable-2\", \"word\"];\n      }\n      // Operators\n      if (stream.match(operatorsRegexp)) {\n        return [\"operator\", stream.current()];\n      }\n      // Delimiters\n      if (/[:;,{}\\[\\]\\(\\)]/.test(ch)) {\n        stream.next();\n        return [null, ch];\n      }\n      // Non-detected items\n      stream.next();\n      return [null, null];\n    }\n\n    /**\n     * Token comment\n     */\n    function tokenCComment(stream, state) {\n      var maybeEnd = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (maybeEnd && ch == \"/\") {\n          state.tokenize = null;\n          break;\n        }\n        maybeEnd = (ch == \"*\");\n      }\n      return [\"comment\", \"comment\"];\n    }\n\n    /**\n     * Token string\n     */\n    function tokenString(quote) {\n      return function(stream, state) {\n        var escaped = false, ch;\n        while ((ch = stream.next()) != null) {\n          if (ch == quote && !escaped) {\n            if (quote == \")\") stream.backUp(1);\n            break;\n          }\n          escaped = !escaped && ch == \"\\\\\";\n        }\n        if (ch == quote || !escaped && quote != \")\") state.tokenize = null;\n        return [\"string\", \"string\"];\n      };\n    }\n\n    /**\n     * Token parenthesized\n     */\n    function tokenParenthesized(stream, state) {\n      stream.next(); // Must be \"(\"\n      if (!stream.match(/\\s*[\\\"\\')]/, false))\n        state.tokenize = tokenString(\")\");\n      else\n        state.tokenize = null;\n      return [null, \"(\"];\n    }\n\n    /**\n     * Context management\n     */\n    function Context(type, indent, prev, line) {\n      this.type = type;\n      this.indent = indent;\n      this.prev = prev;\n      this.line = line || {firstWord: \"\", indent: 0};\n    }\n\n    function pushContext(state, stream, type, indent) {\n      indent = indent >= 0 ? indent : indentUnit;\n      state.context = new Context(type, stream.indentation() + indent, state.context);\n      return type;\n    }\n\n    function popContext(state, currentIndent) {\n      var contextIndent = state.context.indent - indentUnit;\n      currentIndent = currentIndent || false;\n      state.context = state.context.prev;\n      if (currentIndent) state.context.indent = contextIndent;\n      return state.context.type;\n    }\n\n    function pass(type, stream, state) {\n      return states[state.context.type](type, stream, state);\n    }\n\n    function popAndPass(type, stream, state, n) {\n      for (var i = n || 1; i > 0; i--)\n        state.context = state.context.prev;\n      return pass(type, stream, state);\n    }\n\n\n    /**\n     * Parser\n     */\n    function wordIsTag(word) {\n      return word.toLowerCase() in tagKeywords;\n    }\n\n    function wordIsProperty(word) {\n      word = word.toLowerCase();\n      return word in propertyKeywords || word in fontProperties;\n    }\n\n    function wordIsBlock(word) {\n      return word.toLowerCase() in blockKeywords;\n    }\n\n    function wordIsVendorPrefix(word) {\n      return word.toLowerCase().match(vendorPrefixesRegexp);\n    }\n\n    function wordAsValue(word) {\n      var wordLC = word.toLowerCase();\n      var override = \"variable-2\";\n      if (wordIsTag(word)) override = \"tag\";\n      else if (wordIsBlock(word)) override = \"block-keyword\";\n      else if (wordIsProperty(word)) override = \"property\";\n      else if (wordLC in valueKeywords || wordLC in commonAtoms) override = \"atom\";\n      else if (wordLC == \"return\" || wordLC in colorKeywords) override = \"keyword\";\n\n      // Font family\n      else if (word.match(/^[A-Z]/)) override = \"string\";\n      return override;\n    }\n\n    function typeIsBlock(type, stream) {\n      return ((endOfLine(stream) && (type == \"{\" || type == \"]\" || type == \"hash\" || type == \"qualifier\")) || type == \"block-mixin\");\n    }\n\n    function typeIsInterpolation(type, stream) {\n      return type == \"{\" && stream.match(/^\\s*\\$?[\\w-]+/i, false);\n    }\n\n    function typeIsPseudo(type, stream) {\n      return type == \":\" && stream.match(/^[a-z-]+/, false);\n    }\n\n    function startOfLine(stream) {\n      return stream.sol() || stream.string.match(new RegExp(\"^\\\\s*\" + escapeRegExp(stream.current())));\n    }\n\n    function endOfLine(stream) {\n      return stream.eol() || stream.match(/^\\s*$/, false);\n    }\n\n    function firstWordOfLine(line) {\n      var re = /^\\s*[-_]*[a-z0-9]+[\\w-]*/i;\n      var result = typeof line == \"string\" ? line.match(re) : line.string.match(re);\n      return result ? result[0].replace(/^\\s*/, \"\") : \"\";\n    }\n\n\n    /**\n     * Block\n     */\n    states.block = function(type, stream, state) {\n      if ((type == \"comment\" && startOfLine(stream)) ||\n          (type == \",\" && endOfLine(stream)) ||\n          type == \"mixin\") {\n        return pushContext(state, stream, \"block\", 0);\n      }\n      if (typeIsInterpolation(type, stream)) {\n        return pushContext(state, stream, \"interpolation\");\n      }\n      if (endOfLine(stream) && type == \"]\") {\n        if (!/^\\s*(\\.|#|:|\\[|\\*|&)/.test(stream.string) && !wordIsTag(firstWordOfLine(stream))) {\n          return pushContext(state, stream, \"block\", 0);\n        }\n      }\n      if (typeIsBlock(type, stream)) {\n        return pushContext(state, stream, \"block\");\n      }\n      if (type == \"}\" && endOfLine(stream)) {\n        return pushContext(state, stream, \"block\", 0);\n      }\n      if (type == \"variable-name\") {\n        if (stream.string.match(/^\\s?\\$[\\w-\\.\\[\\]\\'\\\"]+$/) || wordIsBlock(firstWordOfLine(stream))) {\n          return pushContext(state, stream, \"variableName\");\n        }\n        else {\n          return pushContext(state, stream, \"variableName\", 0);\n        }\n      }\n      if (type == \"=\") {\n        if (!endOfLine(stream) && !wordIsBlock(firstWordOfLine(stream))) {\n          return pushContext(state, stream, \"block\", 0);\n        }\n        return pushContext(state, stream, \"block\");\n      }\n      if (type == \"*\") {\n        if (endOfLine(stream) || stream.match(/\\s*(,|\\.|#|\\[|:|{)/,false)) {\n          override = \"tag\";\n          return pushContext(state, stream, \"block\");\n        }\n      }\n      if (typeIsPseudo(type, stream)) {\n        return pushContext(state, stream, \"pseudo\");\n      }\n      if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) {\n        return pushContext(state, stream, endOfLine(stream) ? \"block\" : \"atBlock\");\n      }\n      if (/@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {\n        return pushContext(state, stream, \"keyframes\");\n      }\n      if (/@extends?/.test(type)) {\n        return pushContext(state, stream, \"extend\", 0);\n      }\n      if (type && type.charAt(0) == \"@\") {\n\n        // Property Lookup\n        if (stream.indentation() > 0 && wordIsProperty(stream.current().slice(1))) {\n          override = \"variable-2\";\n          return \"block\";\n        }\n        if (/(@import|@require|@charset)/.test(type)) {\n          return pushContext(state, stream, \"block\", 0);\n        }\n        return pushContext(state, stream, \"block\");\n      }\n      if (type == \"reference\" && endOfLine(stream)) {\n        return pushContext(state, stream, \"block\");\n      }\n      if (type == \"(\") {\n        return pushContext(state, stream, \"parens\");\n      }\n\n      if (type == \"vendor-prefixes\") {\n        return pushContext(state, stream, \"vendorPrefixes\");\n      }\n      if (type == \"word\") {\n        var word = stream.current();\n        override = wordAsValue(word);\n\n        if (override == \"property\") {\n          if (startOfLine(stream)) {\n            return pushContext(state, stream, \"block\", 0);\n          } else {\n            override = \"atom\";\n            return \"block\";\n          }\n        }\n\n        if (override == \"tag\") {\n\n          // tag is a css value\n          if (/embed|menu|pre|progress|sub|table/.test(word)) {\n            if (wordIsProperty(firstWordOfLine(stream))) {\n              override = \"atom\";\n              return \"block\";\n            }\n          }\n\n          // tag is an attribute\n          if (stream.string.match(new RegExp(\"\\\\[\\\\s*\" + word + \"|\" + word +\"\\\\s*\\\\]\"))) {\n            override = \"atom\";\n            return \"block\";\n          }\n\n          // tag is a variable\n          if (tagVariablesRegexp.test(word)) {\n            if ((startOfLine(stream) && stream.string.match(/=/)) ||\n                (!startOfLine(stream) &&\n                 !stream.string.match(/^(\\s*\\.|#|\\&|\\[|\\/|>|\\*)/) &&\n                 !wordIsTag(firstWordOfLine(stream)))) {\n              override = \"variable-2\";\n              if (wordIsBlock(firstWordOfLine(stream)))  return \"block\";\n              return pushContext(state, stream, \"block\", 0);\n            }\n          }\n\n          if (endOfLine(stream)) return pushContext(state, stream, \"block\");\n        }\n        if (override == \"block-keyword\") {\n          override = \"keyword\";\n\n          // Postfix conditionals\n          if (stream.current(/(if|unless)/) && !startOfLine(stream)) {\n            return \"block\";\n          }\n          return pushContext(state, stream, \"block\");\n        }\n        if (word == \"return\") return pushContext(state, stream, \"block\", 0);\n\n        // Placeholder selector\n        if (override == \"variable-2\" && stream.string.match(/^\\s?\\$[\\w-\\.\\[\\]\\'\\\"]+$/)) {\n          return pushContext(state, stream, \"block\");\n        }\n      }\n      return state.context.type;\n    };\n\n\n    /**\n     * Parens\n     */\n    states.parens = function(type, stream, state) {\n      if (type == \"(\") return pushContext(state, stream, \"parens\");\n      if (type == \")\") {\n        if (state.context.prev.type == \"parens\") {\n          return popContext(state);\n        }\n        if ((stream.string.match(/^[a-z][\\w-]*\\(/i) && endOfLine(stream)) ||\n            wordIsBlock(firstWordOfLine(stream)) ||\n            /(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/.test(firstWordOfLine(stream)) ||\n            (!stream.string.match(/^-?[a-z][\\w-\\.\\[\\]\\'\\\"]*\\s*=/) &&\n             wordIsTag(firstWordOfLine(stream)))) {\n          return pushContext(state, stream, \"block\");\n        }\n        if (stream.string.match(/^[\\$-]?[a-z][\\w-\\.\\[\\]\\'\\\"]*\\s*=/) ||\n            stream.string.match(/^\\s*(\\(|\\)|[0-9])/) ||\n            stream.string.match(/^\\s+[a-z][\\w-]*\\(/i) ||\n            stream.string.match(/^\\s+[\\$-]?[a-z]/i)) {\n          return pushContext(state, stream, \"block\", 0);\n        }\n        if (endOfLine(stream)) return pushContext(state, stream, \"block\");\n        else return pushContext(state, stream, \"block\", 0);\n      }\n      if (type && type.charAt(0) == \"@\" && wordIsProperty(stream.current().slice(1))) {\n        override = \"variable-2\";\n      }\n      if (type == \"word\") {\n        var word = stream.current();\n        override = wordAsValue(word);\n        if (override == \"tag\" && tagVariablesRegexp.test(word)) {\n          override = \"variable-2\";\n        }\n        if (override == \"property\" || word == \"to\") override = \"atom\";\n      }\n      if (type == \"variable-name\") {\n        return pushContext(state, stream, \"variableName\");\n      }\n      if (typeIsPseudo(type, stream)) {\n        return pushContext(state, stream, \"pseudo\");\n      }\n      return state.context.type;\n    };\n\n\n    /**\n     * Vendor prefixes\n     */\n    states.vendorPrefixes = function(type, stream, state) {\n      if (type == \"word\") {\n        override = \"property\";\n        return pushContext(state, stream, \"block\", 0);\n      }\n      return popContext(state);\n    };\n\n\n    /**\n     * Pseudo\n     */\n    states.pseudo = function(type, stream, state) {\n      if (!wordIsProperty(firstWordOfLine(stream.string))) {\n        stream.match(/^[a-z-]+/);\n        override = \"variable-3\";\n        if (endOfLine(stream)) return pushContext(state, stream, \"block\");\n        return popContext(state);\n      }\n      return popAndPass(type, stream, state);\n    };\n\n\n    /**\n     * atBlock\n     */\n    states.atBlock = function(type, stream, state) {\n      if (type == \"(\") return pushContext(state, stream, \"atBlock_parens\");\n      if (typeIsBlock(type, stream)) {\n        return pushContext(state, stream, \"block\");\n      }\n      if (typeIsInterpolation(type, stream)) {\n        return pushContext(state, stream, \"interpolation\");\n      }\n      if (type == \"word\") {\n        var word = stream.current().toLowerCase();\n        if (/^(only|not|and|or)$/.test(word))\n          override = \"keyword\";\n        else if (documentTypes.hasOwnProperty(word))\n          override = \"tag\";\n        else if (mediaTypes.hasOwnProperty(word))\n          override = \"attribute\";\n        else if (mediaFeatures.hasOwnProperty(word))\n          override = \"property\";\n        else if (nonStandardPropertyKeywords.hasOwnProperty(word))\n          override = \"string-2\";\n        else override = wordAsValue(stream.current());\n        if (override == \"tag\" && endOfLine(stream)) {\n          return pushContext(state, stream, \"block\");\n        }\n      }\n      if (type == \"operator\" && /^(not|and|or)$/.test(stream.current())) {\n        override = \"keyword\";\n      }\n      return state.context.type;\n    };\n\n    states.atBlock_parens = function(type, stream, state) {\n      if (type == \"{\" || type == \"}\") return state.context.type;\n      if (type == \")\") {\n        if (endOfLine(stream)) return pushContext(state, stream, \"block\");\n        else return pushContext(state, stream, \"atBlock\");\n      }\n      if (type == \"word\") {\n        var word = stream.current().toLowerCase();\n        override = wordAsValue(word);\n        if (/^(max|min)/.test(word)) override = \"property\";\n        if (override == \"tag\") {\n          tagVariablesRegexp.test(word) ? override = \"variable-2\" : override = \"atom\";\n        }\n        return state.context.type;\n      }\n      return states.atBlock(type, stream, state);\n    };\n\n\n    /**\n     * Keyframes\n     */\n    states.keyframes = function(type, stream, state) {\n      if (stream.indentation() == \"0\" && ((type == \"}\" && startOfLine(stream)) || type == \"]\" || type == \"hash\"\n                                          || type == \"qualifier\" || wordIsTag(stream.current()))) {\n        return popAndPass(type, stream, state);\n      }\n      if (type == \"{\") return pushContext(state, stream, \"keyframes\");\n      if (type == \"}\") {\n        if (startOfLine(stream)) return popContext(state, true);\n        else return pushContext(state, stream, \"keyframes\");\n      }\n      if (type == \"unit\" && /^[0-9]+\\%$/.test(stream.current())) {\n        return pushContext(state, stream, \"keyframes\");\n      }\n      if (type == \"word\") {\n        override = wordAsValue(stream.current());\n        if (override == \"block-keyword\") {\n          override = \"keyword\";\n          return pushContext(state, stream, \"keyframes\");\n        }\n      }\n      if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) {\n        return pushContext(state, stream, endOfLine(stream) ? \"block\" : \"atBlock\");\n      }\n      if (type == \"mixin\") {\n        return pushContext(state, stream, \"block\", 0);\n      }\n      return state.context.type;\n    };\n\n\n    /**\n     * Interpolation\n     */\n    states.interpolation = function(type, stream, state) {\n      if (type == \"{\") popContext(state) && pushContext(state, stream, \"block\");\n      if (type == \"}\") {\n        if (stream.string.match(/^\\s*(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/i) ||\n            (stream.string.match(/^\\s*[a-z]/i) && wordIsTag(firstWordOfLine(stream)))) {\n          return pushContext(state, stream, \"block\");\n        }\n        if (!stream.string.match(/^(\\{|\\s*\\&)/) ||\n            stream.match(/\\s*[\\w-]/,false)) {\n          return pushContext(state, stream, \"block\", 0);\n        }\n        return pushContext(state, stream, \"block\");\n      }\n      if (type == \"variable-name\") {\n        return pushContext(state, stream, \"variableName\", 0);\n      }\n      if (type == \"word\") {\n        override = wordAsValue(stream.current());\n        if (override == \"tag\") override = \"atom\";\n      }\n      return state.context.type;\n    };\n\n\n    /**\n     * Extend/s\n     */\n    states.extend = function(type, stream, state) {\n      if (type == \"[\" || type == \"=\") return \"extend\";\n      if (type == \"]\") return popContext(state);\n      if (type == \"word\") {\n        override = wordAsValue(stream.current());\n        return \"extend\";\n      }\n      return popContext(state);\n    };\n\n\n    /**\n     * Variable name\n     */\n    states.variableName = function(type, stream, state) {\n      if (type == \"string\" || type == \"[\" || type == \"]\" || stream.current().match(/^(\\.|\\$)/)) {\n        if (stream.current().match(/^\\.[\\w-]+/i)) override = \"variable-2\";\n        return \"variableName\";\n      }\n      return popAndPass(type, stream, state);\n    };\n\n\n    return {\n      startState: function(base) {\n        return {\n          tokenize: null,\n          state: \"block\",\n          context: new Context(\"block\", base || 0, null)\n        };\n      },\n      token: function(stream, state) {\n        if (!state.tokenize && stream.eatSpace()) return null;\n        style = (state.tokenize || tokenBase)(stream, state);\n        if (style && typeof style == \"object\") {\n          type = style[1];\n          style = style[0];\n        }\n        override = style;\n        state.state = states[state.state](type, stream, state);\n        return override;\n      },\n      indent: function(state, textAfter, line) {\n\n        var cx = state.context,\n            ch = textAfter && textAfter.charAt(0),\n            indent = cx.indent,\n            lineFirstWord = firstWordOfLine(textAfter),\n            lineIndent = line.match(/^\\s*/)[0].replace(/\\t/g, indentUnitString).length,\n            prevLineFirstWord = state.context.prev ? state.context.prev.line.firstWord : \"\",\n            prevLineIndent = state.context.prev ? state.context.prev.line.indent : lineIndent;\n\n        if (cx.prev &&\n            (ch == \"}\" && (cx.type == \"block\" || cx.type == \"atBlock\" || cx.type == \"keyframes\") ||\n             ch == \")\" && (cx.type == \"parens\" || cx.type == \"atBlock_parens\") ||\n             ch == \"{\" && (cx.type == \"at\"))) {\n          indent = cx.indent - indentUnit;\n        } else if (!(/(\\})/.test(ch))) {\n          if (/@|\\$|\\d/.test(ch) ||\n              /^\\{/.test(textAfter) ||\n/^\\s*\\/(\\/|\\*)/.test(textAfter) ||\n              /^\\s*\\/\\*/.test(prevLineFirstWord) ||\n              /^\\s*[\\w-\\.\\[\\]\\'\\\"]+\\s*(\\?|:|\\+)?=/i.test(textAfter) ||\n/^(\\+|-)?[a-z][\\w-]*\\(/i.test(textAfter) ||\n/^return/.test(textAfter) ||\n              wordIsBlock(lineFirstWord)) {\n            indent = lineIndent;\n          } else if (/(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/.test(ch) || wordIsTag(lineFirstWord)) {\n            if (/\\,\\s*$/.test(prevLineFirstWord)) {\n              indent = prevLineIndent;\n            } else if (/^\\s+/.test(line) && (/(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/.test(prevLineFirstWord) || wordIsTag(prevLineFirstWord))) {\n              indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit;\n            } else {\n              indent = lineIndent;\n            }\n          } else if (!/,\\s*$/.test(line) && (wordIsVendorPrefix(lineFirstWord) || wordIsProperty(lineFirstWord))) {\n            if (wordIsBlock(prevLineFirstWord)) {\n              indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit;\n            } else if (/^\\{/.test(prevLineFirstWord)) {\n              indent = lineIndent <= prevLineIndent ? lineIndent : prevLineIndent + indentUnit;\n            } else if (wordIsVendorPrefix(prevLineFirstWord) || wordIsProperty(prevLineFirstWord)) {\n              indent = lineIndent >= prevLineIndent ? prevLineIndent : lineIndent;\n            } else if (/^(\\.|#|:|\\[|\\*|&|@|\\+|\\-|>|~|\\/)/.test(prevLineFirstWord) ||\n                      /=\\s*$/.test(prevLineFirstWord) ||\n                      wordIsTag(prevLineFirstWord) ||\n                      /^\\$[\\w-\\.\\[\\]\\'\\\"]/.test(prevLineFirstWord)) {\n              indent = prevLineIndent + indentUnit;\n            } else {\n              indent = lineIndent;\n            }\n          }\n        }\n        return indent;\n      },\n      electricChars: \"}\",\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      blockCommentContinue: \" * \",\n      lineComment: \"//\",\n      fold: \"indent\"\n    };\n  });\n\n  // developer.mozilla.org/en-US/docs/Web/HTML/Element\n  var tagKeywords_ = [\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\", \"b\", \"base\",\"bdi\", \"bdo\",\"bgsound\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\", \"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"div\", \"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\", \"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\", \"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\", \"mark\",\"marquee\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"nobr\",\"noframes\", \"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"pre\", \"progress\",\"q\",\"rp\",\"rt\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\", \"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"tr\",\"track\", \"u\",\"ul\",\"var\",\"video\"];\n\n  // github.com/codemirror/CodeMirror/blob/master/mode/css/css.js\n  // Note, \"url-prefix\" should precede \"url\" in order to match correctly in documentTypesRegexp\n  var documentTypes_ = [\"domain\", \"regexp\", \"url-prefix\", \"url\"];\n  var mediaTypes_ = [\"all\",\"aural\",\"braille\",\"handheld\",\"print\",\"projection\",\"screen\",\"tty\",\"tv\",\"embossed\"];\n  var mediaFeatures_ = [\"width\",\"min-width\",\"max-width\",\"height\",\"min-height\",\"max-height\",\"device-width\",\"min-device-width\",\"max-device-width\",\"device-height\",\"min-device-height\",\"max-device-height\",\"aspect-ratio\",\"min-aspect-ratio\",\"max-aspect-ratio\",\"device-aspect-ratio\",\"min-device-aspect-ratio\",\"max-device-aspect-ratio\",\"color\",\"min-color\",\"max-color\",\"color-index\",\"min-color-index\",\"max-color-index\",\"monochrome\",\"min-monochrome\",\"max-monochrome\",\"resolution\",\"min-resolution\",\"max-resolution\",\"scan\",\"grid\",\"dynamic-range\",\"video-dynamic-range\"];\n  var propertyKeywords_ = [\"align-content\",\"align-items\",\"align-self\",\"alignment-adjust\",\"alignment-baseline\",\"anchor-point\",\"animation\",\"animation-delay\",\"animation-direction\",\"animation-duration\",\"animation-fill-mode\",\"animation-iteration-count\",\"animation-name\",\"animation-play-state\",\"animation-timing-function\",\"appearance\",\"azimuth\",\"backface-visibility\",\"background\",\"background-attachment\",\"background-clip\",\"background-color\",\"background-image\",\"background-origin\",\"background-position\",\"background-repeat\",\"background-size\",\"baseline-shift\",\"binding\",\"bleed\",\"bookmark-label\",\"bookmark-level\",\"bookmark-state\",\"bookmark-target\",\"border\",\"border-bottom\",\"border-bottom-color\",\"border-bottom-left-radius\",\"border-bottom-right-radius\",\"border-bottom-style\",\"border-bottom-width\",\"border-collapse\",\"border-color\",\"border-image\",\"border-image-outset\",\"border-image-repeat\",\"border-image-slice\",\"border-image-source\",\"border-image-width\",\"border-left\",\"border-left-color\",\"border-left-style\",\"border-left-width\",\"border-radius\",\"border-right\",\"border-right-color\",\"border-right-style\",\"border-right-width\",\"border-spacing\",\"border-style\",\"border-top\",\"border-top-color\",\"border-top-left-radius\",\"border-top-right-radius\",\"border-top-style\",\"border-top-width\",\"border-width\",\"bottom\",\"box-decoration-break\",\"box-shadow\",\"box-sizing\",\"break-after\",\"break-before\",\"break-inside\",\"caption-side\",\"clear\",\"clip\",\"color\",\"color-profile\",\"column-count\",\"column-fill\",\"column-gap\",\"column-rule\",\"column-rule-color\",\"column-rule-style\",\"column-rule-width\",\"column-span\",\"column-width\",\"columns\",\"content\",\"counter-increment\",\"counter-reset\",\"crop\",\"cue\",\"cue-after\",\"cue-before\",\"cursor\",\"direction\",\"display\",\"dominant-baseline\",\"drop-initial-after-adjust\",\"drop-initial-after-align\",\"drop-initial-before-adjust\",\"drop-initial-before-align\",\"drop-initial-size\",\"drop-initial-value\",\"elevation\",\"empty-cells\",\"fit\",\"fit-position\",\"flex\",\"flex-basis\",\"flex-direction\",\"flex-flow\",\"flex-grow\",\"flex-shrink\",\"flex-wrap\",\"float\",\"float-offset\",\"flow-from\",\"flow-into\",\"font\",\"font-feature-settings\",\"font-family\",\"font-kerning\",\"font-language-override\",\"font-size\",\"font-size-adjust\",\"font-stretch\",\"font-style\",\"font-synthesis\",\"font-variant\",\"font-variant-alternates\",\"font-variant-caps\",\"font-variant-east-asian\",\"font-variant-ligatures\",\"font-variant-numeric\",\"font-variant-position\",\"font-weight\",\"grid\",\"grid-area\",\"grid-auto-columns\",\"grid-auto-flow\",\"grid-auto-position\",\"grid-auto-rows\",\"grid-column\",\"grid-column-end\",\"grid-column-start\",\"grid-row\",\"grid-row-end\",\"grid-row-start\",\"grid-template\",\"grid-template-areas\",\"grid-template-columns\",\"grid-template-rows\",\"hanging-punctuation\",\"height\",\"hyphens\",\"icon\",\"image-orientation\",\"image-rendering\",\"image-resolution\",\"inline-box-align\",\"justify-content\",\"left\",\"letter-spacing\",\"line-break\",\"line-height\",\"line-stacking\",\"line-stacking-ruby\",\"line-stacking-shift\",\"line-stacking-strategy\",\"list-style\",\"list-style-image\",\"list-style-position\",\"list-style-type\",\"margin\",\"margin-bottom\",\"margin-left\",\"margin-right\",\"margin-top\",\"marker-offset\",\"marks\",\"marquee-direction\",\"marquee-loop\",\"marquee-play-count\",\"marquee-speed\",\"marquee-style\",\"max-height\",\"max-width\",\"min-height\",\"min-width\",\"move-to\",\"nav-down\",\"nav-index\",\"nav-left\",\"nav-right\",\"nav-up\",\"object-fit\",\"object-position\",\"opacity\",\"order\",\"orphans\",\"outline\",\"outline-color\",\"outline-offset\",\"outline-style\",\"outline-width\",\"overflow\",\"overflow-style\",\"overflow-wrap\",\"overflow-x\",\"overflow-y\",\"padding\",\"padding-bottom\",\"padding-left\",\"padding-right\",\"padding-top\",\"page\",\"page-break-after\",\"page-break-before\",\"page-break-inside\",\"page-policy\",\"pause\",\"pause-after\",\"pause-before\",\"perspective\",\"perspective-origin\",\"pitch\",\"pitch-range\",\"play-during\",\"position\",\"presentation-level\",\"punctuation-trim\",\"quotes\",\"region-break-after\",\"region-break-before\",\"region-break-inside\",\"region-fragment\",\"rendering-intent\",\"resize\",\"rest\",\"rest-after\",\"rest-before\",\"richness\",\"right\",\"rotation\",\"rotation-point\",\"ruby-align\",\"ruby-overhang\",\"ruby-position\",\"ruby-span\",\"shape-image-threshold\",\"shape-inside\",\"shape-margin\",\"shape-outside\",\"size\",\"speak\",\"speak-as\",\"speak-header\",\"speak-numeral\",\"speak-punctuation\",\"speech-rate\",\"stress\",\"string-set\",\"tab-size\",\"table-layout\",\"target\",\"target-name\",\"target-new\",\"target-position\",\"text-align\",\"text-align-last\",\"text-decoration\",\"text-decoration-color\",\"text-decoration-line\",\"text-decoration-skip\",\"text-decoration-style\",\"text-emphasis\",\"text-emphasis-color\",\"text-emphasis-position\",\"text-emphasis-style\",\"text-height\",\"text-indent\",\"text-justify\",\"text-outline\",\"text-overflow\",\"text-shadow\",\"text-size-adjust\",\"text-space-collapse\",\"text-transform\",\"text-underline-position\",\"text-wrap\",\"top\",\"transform\",\"transform-origin\",\"transform-style\",\"transition\",\"transition-delay\",\"transition-duration\",\"transition-property\",\"transition-timing-function\",\"unicode-bidi\",\"vertical-align\",\"visibility\",\"voice-balance\",\"voice-duration\",\"voice-family\",\"voice-pitch\",\"voice-range\",\"voice-rate\",\"voice-stress\",\"voice-volume\",\"volume\",\"white-space\",\"widows\",\"width\",\"will-change\",\"word-break\",\"word-spacing\",\"word-wrap\",\"z-index\",\"clip-path\",\"clip-rule\",\"mask\",\"enable-background\",\"filter\",\"flood-color\",\"flood-opacity\",\"lighting-color\",\"stop-color\",\"stop-opacity\",\"pointer-events\",\"color-interpolation\",\"color-interpolation-filters\",\"color-rendering\",\"fill\",\"fill-opacity\",\"fill-rule\",\"image-rendering\",\"marker\",\"marker-end\",\"marker-mid\",\"marker-start\",\"shape-rendering\",\"stroke\",\"stroke-dasharray\",\"stroke-dashoffset\",\"stroke-linecap\",\"stroke-linejoin\",\"stroke-miterlimit\",\"stroke-opacity\",\"stroke-width\",\"text-rendering\",\"baseline-shift\",\"dominant-baseline\",\"glyph-orientation-horizontal\",\"glyph-orientation-vertical\",\"text-anchor\",\"writing-mode\",\"font-smoothing\",\"osx-font-smoothing\"];\n  var nonStandardPropertyKeywords_ = [\"scrollbar-arrow-color\",\"scrollbar-base-color\",\"scrollbar-dark-shadow-color\",\"scrollbar-face-color\",\"scrollbar-highlight-color\",\"scrollbar-shadow-color\",\"scrollbar-3d-light-color\",\"scrollbar-track-color\",\"shape-inside\",\"searchfield-cancel-button\",\"searchfield-decoration\",\"searchfield-results-button\",\"searchfield-results-decoration\",\"zoom\"];\n  var fontProperties_ = [\"font-family\",\"src\",\"unicode-range\",\"font-variant\",\"font-feature-settings\",\"font-stretch\",\"font-weight\",\"font-style\"];\n  var colorKeywords_ = [\"aliceblue\",\"antiquewhite\",\"aqua\",\"aquamarine\",\"azure\",\"beige\",\"bisque\",\"black\",\"blanchedalmond\",\"blue\",\"blueviolet\",\"brown\",\"burlywood\",\"cadetblue\",\"chartreuse\",\"chocolate\",\"coral\",\"cornflowerblue\",\"cornsilk\",\"crimson\",\"cyan\",\"darkblue\",\"darkcyan\",\"darkgoldenrod\",\"darkgray\",\"darkgreen\",\"darkkhaki\",\"darkmagenta\",\"darkolivegreen\",\"darkorange\",\"darkorchid\",\"darkred\",\"darksalmon\",\"darkseagreen\",\"darkslateblue\",\"darkslategray\",\"darkturquoise\",\"darkviolet\",\"deeppink\",\"deepskyblue\",\"dimgray\",\"dodgerblue\",\"firebrick\",\"floralwhite\",\"forestgreen\",\"fuchsia\",\"gainsboro\",\"ghostwhite\",\"gold\",\"goldenrod\",\"gray\",\"grey\",\"green\",\"greenyellow\",\"honeydew\",\"hotpink\",\"indianred\",\"indigo\",\"ivory\",\"khaki\",\"lavender\",\"lavenderblush\",\"lawngreen\",\"lemonchiffon\",\"lightblue\",\"lightcoral\",\"lightcyan\",\"lightgoldenrodyellow\",\"lightgray\",\"lightgreen\",\"lightpink\",\"lightsalmon\",\"lightseagreen\",\"lightskyblue\",\"lightslategray\",\"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\",\"slategray\",\"snow\",\"springgreen\",\"steelblue\",\"tan\",\"teal\",\"thistle\",\"tomato\",\"turquoise\",\"violet\",\"wheat\",\"white\",\"whitesmoke\",\"yellow\",\"yellowgreen\"];\n  var valueKeywords_ = [\"above\",\"absolute\",\"activeborder\",\"additive\",\"activecaption\",\"afar\",\"after-white-space\",\"ahead\",\"alias\",\"all\",\"all-scroll\",\"alphabetic\",\"alternate\",\"always\",\"amharic\",\"amharic-abegede\",\"antialiased\",\"appworkspace\",\"arabic-indic\",\"armenian\",\"asterisks\",\"attr\",\"auto\",\"avoid\",\"avoid-column\",\"avoid-page\",\"avoid-region\",\"background\",\"backwards\",\"baseline\",\"below\",\"bidi-override\",\"binary\",\"bengali\",\"blink\",\"block\",\"block-axis\",\"bold\",\"bolder\",\"border\",\"border-box\",\"both\",\"bottom\",\"break\",\"break-all\",\"break-word\",\"bullets\",\"button\",\"button-bevel\",\"buttonface\",\"buttonhighlight\",\"buttonshadow\",\"buttontext\",\"calc\",\"cambodian\",\"capitalize\",\"caps-lock-indicator\",\"caption\",\"captiontext\",\"caret\",\"cell\",\"center\",\"checkbox\",\"circle\",\"cjk-decimal\",\"cjk-earthly-branch\",\"cjk-heavenly-stem\",\"cjk-ideographic\",\"clear\",\"clip\",\"close-quote\",\"col-resize\",\"collapse\",\"column\",\"compact\",\"condensed\",\"conic-gradient\",\"contain\",\"content\",\"contents\",\"content-box\",\"context-menu\",\"continuous\",\"copy\",\"counter\",\"counters\",\"cover\",\"crop\",\"cross\",\"crosshair\",\"currentcolor\",\"cursive\",\"cyclic\",\"dashed\",\"decimal\",\"decimal-leading-zero\",\"default\",\"default-button\",\"destination-atop\",\"destination-in\",\"destination-out\",\"destination-over\",\"devanagari\",\"disc\",\"discard\",\"disclosure-closed\",\"disclosure-open\",\"document\",\"dot-dash\",\"dot-dot-dash\",\"dotted\",\"double\",\"down\",\"e-resize\",\"ease\",\"ease-in\",\"ease-in-out\",\"ease-out\",\"element\",\"ellipse\",\"ellipsis\",\"embed\",\"end\",\"ethiopic\",\"ethiopic-abegede\",\"ethiopic-abegede-am-et\",\"ethiopic-abegede-gez\",\"ethiopic-abegede-ti-er\",\"ethiopic-abegede-ti-et\",\"ethiopic-halehame-aa-er\",\"ethiopic-halehame-aa-et\",\"ethiopic-halehame-am-et\",\"ethiopic-halehame-gez\",\"ethiopic-halehame-om-et\",\"ethiopic-halehame-sid-et\",\"ethiopic-halehame-so-et\",\"ethiopic-halehame-ti-er\",\"ethiopic-halehame-ti-et\",\"ethiopic-halehame-tig\",\"ethiopic-numeric\",\"ew-resize\",\"expanded\",\"extends\",\"extra-condensed\",\"extra-expanded\",\"fantasy\",\"fast\",\"fill\",\"fixed\",\"flat\",\"flex\",\"footnotes\",\"forwards\",\"from\",\"geometricPrecision\",\"georgian\",\"graytext\",\"groove\",\"gujarati\",\"gurmukhi\",\"hand\",\"hangul\",\"hangul-consonant\",\"hebrew\",\"help\",\"hidden\",\"hide\",\"high\",\"higher\",\"highlight\",\"highlighttext\",\"hiragana\",\"hiragana-iroha\",\"horizontal\",\"hsl\",\"hsla\",\"icon\",\"ignore\",\"inactiveborder\",\"inactivecaption\",\"inactivecaptiontext\",\"infinite\",\"infobackground\",\"infotext\",\"inherit\",\"initial\",\"inline\",\"inline-axis\",\"inline-block\",\"inline-flex\",\"inline-table\",\"inset\",\"inside\",\"intrinsic\",\"invert\",\"italic\",\"japanese-formal\",\"japanese-informal\",\"justify\",\"kannada\",\"katakana\",\"katakana-iroha\",\"keep-all\",\"khmer\",\"korean-hangul-formal\",\"korean-hanja-formal\",\"korean-hanja-informal\",\"landscape\",\"lao\",\"large\",\"larger\",\"left\",\"level\",\"lighter\",\"line-through\",\"linear\",\"linear-gradient\",\"lines\",\"list-item\",\"listbox\",\"listitem\",\"local\",\"logical\",\"loud\",\"lower\",\"lower-alpha\",\"lower-armenian\",\"lower-greek\",\"lower-hexadecimal\",\"lower-latin\",\"lower-norwegian\",\"lower-roman\",\"lowercase\",\"ltr\",\"malayalam\",\"match\",\"matrix\",\"matrix3d\",\"media-controls-background\",\"media-current-time-display\",\"media-fullscreen-button\",\"media-mute-button\",\"media-play-button\",\"media-return-to-realtime-button\",\"media-rewind-button\",\"media-seek-back-button\",\"media-seek-forward-button\",\"media-slider\",\"media-sliderthumb\",\"media-time-remaining-display\",\"media-volume-slider\",\"media-volume-slider-container\",\"media-volume-sliderthumb\",\"medium\",\"menu\",\"menulist\",\"menulist-button\",\"menulist-text\",\"menulist-textfield\",\"menutext\",\"message-box\",\"middle\",\"min-intrinsic\",\"mix\",\"mongolian\",\"monospace\",\"move\",\"multiple\",\"myanmar\",\"n-resize\",\"narrower\",\"ne-resize\",\"nesw-resize\",\"no-close-quote\",\"no-drop\",\"no-open-quote\",\"no-repeat\",\"none\",\"normal\",\"not-allowed\",\"nowrap\",\"ns-resize\",\"numbers\",\"numeric\",\"nw-resize\",\"nwse-resize\",\"oblique\",\"octal\",\"open-quote\",\"optimizeLegibility\",\"optimizeSpeed\",\"oriya\",\"oromo\",\"outset\",\"outside\",\"outside-shape\",\"overlay\",\"overline\",\"padding\",\"padding-box\",\"painted\",\"page\",\"paused\",\"persian\",\"perspective\",\"plus-darker\",\"plus-lighter\",\"pointer\",\"polygon\",\"portrait\",\"pre\",\"pre-line\",\"pre-wrap\",\"preserve-3d\",\"progress\",\"push-button\",\"radial-gradient\",\"radio\",\"read-only\",\"read-write\",\"read-write-plaintext-only\",\"rectangle\",\"region\",\"relative\",\"repeat\",\"repeating-linear-gradient\",\"repeating-radial-gradient\",\"repeating-conic-gradient\",\"repeat-x\",\"repeat-y\",\"reset\",\"reverse\",\"rgb\",\"rgba\",\"ridge\",\"right\",\"rotate\",\"rotate3d\",\"rotateX\",\"rotateY\",\"rotateZ\",\"round\",\"row-resize\",\"rtl\",\"run-in\",\"running\",\"s-resize\",\"sans-serif\",\"scale\",\"scale3d\",\"scaleX\",\"scaleY\",\"scaleZ\",\"scroll\",\"scrollbar\",\"scroll-position\",\"se-resize\",\"searchfield\",\"searchfield-cancel-button\",\"searchfield-decoration\",\"searchfield-results-button\",\"searchfield-results-decoration\",\"semi-condensed\",\"semi-expanded\",\"separate\",\"serif\",\"show\",\"sidama\",\"simp-chinese-formal\",\"simp-chinese-informal\",\"single\",\"skew\",\"skewX\",\"skewY\",\"skip-white-space\",\"slide\",\"slider-horizontal\",\"slider-vertical\",\"sliderthumb-horizontal\",\"sliderthumb-vertical\",\"slow\",\"small\",\"small-caps\",\"small-caption\",\"smaller\",\"solid\",\"somali\",\"source-atop\",\"source-in\",\"source-out\",\"source-over\",\"space\",\"spell-out\",\"square\",\"square-button\",\"standard\",\"start\",\"static\",\"status-bar\",\"stretch\",\"stroke\",\"sub\",\"subpixel-antialiased\",\"super\",\"sw-resize\",\"symbolic\",\"symbols\",\"table\",\"table-caption\",\"table-cell\",\"table-column\",\"table-column-group\",\"table-footer-group\",\"table-header-group\",\"table-row\",\"table-row-group\",\"tamil\",\"telugu\",\"text\",\"text-bottom\",\"text-top\",\"textarea\",\"textfield\",\"thai\",\"thick\",\"thin\",\"threeddarkshadow\",\"threedface\",\"threedhighlight\",\"threedlightshadow\",\"threedshadow\",\"tibetan\",\"tigre\",\"tigrinya-er\",\"tigrinya-er-abegede\",\"tigrinya-et\",\"tigrinya-et-abegede\",\"to\",\"top\",\"trad-chinese-formal\",\"trad-chinese-informal\",\"translate\",\"translate3d\",\"translateX\",\"translateY\",\"translateZ\",\"transparent\",\"ultra-condensed\",\"ultra-expanded\",\"underline\",\"up\",\"upper-alpha\",\"upper-armenian\",\"upper-greek\",\"upper-hexadecimal\",\"upper-latin\",\"upper-norwegian\",\"upper-roman\",\"uppercase\",\"urdu\",\"url\",\"var\",\"vertical\",\"vertical-text\",\"visible\",\"visibleFill\",\"visiblePainted\",\"visibleStroke\",\"visual\",\"w-resize\",\"wait\",\"wave\",\"wider\",\"window\",\"windowframe\",\"windowtext\",\"words\",\"x-large\",\"x-small\",\"xor\",\"xx-large\",\"xx-small\",\"bicubic\",\"optimizespeed\",\"grayscale\",\"row\",\"row-reverse\",\"wrap\",\"wrap-reverse\",\"column-reverse\",\"flex-start\",\"flex-end\",\"space-between\",\"space-around\", \"unset\"];\n\n  var wordOperatorKeywords_ = [\"in\",\"and\",\"or\",\"not\",\"is not\",\"is a\",\"is\",\"isnt\",\"defined\",\"if unless\"],\n      blockKeywords_ = [\"for\",\"if\",\"else\",\"unless\", \"from\", \"to\"],\n      commonAtoms_ = [\"null\",\"true\",\"false\",\"href\",\"title\",\"type\",\"not-allowed\",\"readonly\",\"disabled\"],\n      commonDef_ = [\"@font-face\", \"@keyframes\", \"@media\", \"@viewport\", \"@page\", \"@host\", \"@supports\", \"@block\", \"@css\"];\n\n  var hintWords = tagKeywords_.concat(documentTypes_,mediaTypes_,mediaFeatures_,\n                                      propertyKeywords_,nonStandardPropertyKeywords_,\n                                      colorKeywords_,valueKeywords_,fontProperties_,\n                                      wordOperatorKeywords_,blockKeywords_,\n                                      commonAtoms_,commonDef_);\n\n  function wordRegexp(words) {\n    words = words.sort(function(a,b){return b > a;});\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  function keySet(array) {\n    var keys = {};\n    for (var i = 0; i < array.length; ++i) keys[array[i]] = true;\n    return keys;\n  }\n\n  function escapeRegExp(text) {\n    return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n  }\n\n  CodeMirror.registerHelper(\"hintWords\", \"stylus\", hintWords);\n  CodeMirror.defineMIME(\"text/x-styl\", \"stylus\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/swift/swift.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Swift mode created by Michael Kaminsky https://github.com/mkaminsky11\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\")\n    mod(require(\"../../lib/codemirror\"))\n  else if (typeof define == \"function\" && define.amd)\n    define([\"../../lib/codemirror\"], mod)\n  else\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n\n  function wordSet(words) {\n    var set = {}\n    for (var i = 0; i < words.length; i++) set[words[i]] = true\n    return set\n  }\n\n  var keywords = wordSet([\"_\",\"var\",\"let\",\"class\",\"enum\",\"extension\",\"import\",\"protocol\",\"struct\",\"func\",\"typealias\",\"associatedtype\",\n                          \"open\",\"public\",\"internal\",\"fileprivate\",\"private\",\"deinit\",\"init\",\"new\",\"override\",\"self\",\"subscript\",\"super\",\n                          \"convenience\",\"dynamic\",\"final\",\"indirect\",\"lazy\",\"required\",\"static\",\"unowned\",\"unowned(safe)\",\"unowned(unsafe)\",\"weak\",\"as\",\"is\",\n                          \"break\",\"case\",\"continue\",\"default\",\"else\",\"fallthrough\",\"for\",\"guard\",\"if\",\"in\",\"repeat\",\"switch\",\"where\",\"while\",\n                          \"defer\",\"return\",\"inout\",\"mutating\",\"nonmutating\",\"catch\",\"do\",\"rethrows\",\"throw\",\"throws\",\"try\",\"didSet\",\"get\",\"set\",\"willSet\",\n                          \"assignment\",\"associativity\",\"infix\",\"left\",\"none\",\"operator\",\"postfix\",\"precedence\",\"precedencegroup\",\"prefix\",\"right\",\n                          \"Any\",\"AnyObject\",\"Type\",\"dynamicType\",\"Self\",\"Protocol\",\"__COLUMN__\",\"__FILE__\",\"__FUNCTION__\",\"__LINE__\"])\n  var definingKeywords = wordSet([\"var\",\"let\",\"class\",\"enum\",\"extension\",\"import\",\"protocol\",\"struct\",\"func\",\"typealias\",\"associatedtype\",\"for\"])\n  var atoms = wordSet([\"true\",\"false\",\"nil\",\"self\",\"super\",\"_\"])\n  var types = wordSet([\"Array\",\"Bool\",\"Character\",\"Dictionary\",\"Double\",\"Float\",\"Int\",\"Int8\",\"Int16\",\"Int32\",\"Int64\",\"Never\",\"Optional\",\"Set\",\"String\",\n                       \"UInt8\",\"UInt16\",\"UInt32\",\"UInt64\",\"Void\"])\n  var operators = \"+-/*%=|&<>~^?!\"\n  var punc = \":;,.(){}[]\"\n  var binary = /^\\-?0b[01][01_]*/\n  var octal = /^\\-?0o[0-7][0-7_]*/\n  var hexadecimal = /^\\-?0x[\\dA-Fa-f][\\dA-Fa-f_]*(?:(?:\\.[\\dA-Fa-f][\\dA-Fa-f_]*)?[Pp]\\-?\\d[\\d_]*)?/\n  var decimal = /^\\-?\\d[\\d_]*(?:\\.\\d[\\d_]*)?(?:[Ee]\\-?\\d[\\d_]*)?/\n  var identifier = /^\\$\\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\\1/\n  var property = /^\\.(?:\\$\\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\\1)/\n  var instruction = /^\\#[A-Za-z]+/\n  var attribute = /^@(?:\\$\\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\\1)/\n  //var regexp = /^\\/(?!\\s)(?:\\/\\/)?(?:\\\\.|[^\\/])+\\//\n\n  function tokenBase(stream, state, prev) {\n    if (stream.sol()) state.indented = stream.indentation()\n    if (stream.eatSpace()) return null\n\n    var ch = stream.peek()\n    if (ch == \"/\") {\n      if (stream.match(\"//\")) {\n        stream.skipToEnd()\n        return \"comment\"\n      }\n      if (stream.match(\"/*\")) {\n        state.tokenize.push(tokenComment)\n        return tokenComment(stream, state)\n      }\n    }\n    if (stream.match(instruction)) return \"builtin\"\n    if (stream.match(attribute)) return \"attribute\"\n    if (stream.match(binary)) return \"number\"\n    if (stream.match(octal)) return \"number\"\n    if (stream.match(hexadecimal)) return \"number\"\n    if (stream.match(decimal)) return \"number\"\n    if (stream.match(property)) return \"property\"\n    if (operators.indexOf(ch) > -1) {\n      stream.next()\n      return \"operator\"\n    }\n    if (punc.indexOf(ch) > -1) {\n      stream.next()\n      stream.match(\"..\")\n      return \"punctuation\"\n    }\n    var stringMatch\n    if (stringMatch = stream.match(/(\"\"\"|\"|')/)) {\n      var tokenize = tokenString.bind(null, stringMatch[0])\n      state.tokenize.push(tokenize)\n      return tokenize(stream, state)\n    }\n\n    if (stream.match(identifier)) {\n      var ident = stream.current()\n      if (types.hasOwnProperty(ident)) return \"variable-2\"\n      if (atoms.hasOwnProperty(ident)) return \"atom\"\n      if (keywords.hasOwnProperty(ident)) {\n        if (definingKeywords.hasOwnProperty(ident))\n          state.prev = \"define\"\n        return \"keyword\"\n      }\n      if (prev == \"define\") return \"def\"\n      return \"variable\"\n    }\n\n    stream.next()\n    return null\n  }\n\n  function tokenUntilClosingParen() {\n    var depth = 0\n    return function(stream, state, prev) {\n      var inner = tokenBase(stream, state, prev)\n      if (inner == \"punctuation\") {\n        if (stream.current() == \"(\") ++depth\n        else if (stream.current() == \")\") {\n          if (depth == 0) {\n            stream.backUp(1)\n            state.tokenize.pop()\n            return state.tokenize[state.tokenize.length - 1](stream, state)\n          }\n          else --depth\n        }\n      }\n      return inner\n    }\n  }\n\n  function tokenString(openQuote, stream, state) {\n    var singleLine = openQuote.length == 1\n    var ch, escaped = false\n    while (ch = stream.peek()) {\n      if (escaped) {\n        stream.next()\n        if (ch == \"(\") {\n          state.tokenize.push(tokenUntilClosingParen())\n          return \"string\"\n        }\n        escaped = false\n      } else if (stream.match(openQuote)) {\n        state.tokenize.pop()\n        return \"string\"\n      } else {\n        stream.next()\n        escaped = ch == \"\\\\\"\n      }\n    }\n    if (singleLine) {\n      state.tokenize.pop()\n    }\n    return \"string\"\n  }\n\n  function tokenComment(stream, state) {\n    var ch\n    while (true) {\n      stream.match(/^[^/*]+/, true)\n      ch = stream.next()\n      if (!ch) break\n      if (ch === \"/\" && stream.eat(\"*\")) {\n        state.tokenize.push(tokenComment)\n      } else if (ch === \"*\" && stream.eat(\"/\")) {\n        state.tokenize.pop()\n      }\n    }\n    return \"comment\"\n  }\n\n  function Context(prev, align, indented) {\n    this.prev = prev\n    this.align = align\n    this.indented = indented\n  }\n\n  function pushContext(state, stream) {\n    var align = stream.match(/^\\s*($|\\/[\\/\\*])/, false) ? null : stream.column() + 1\n    state.context = new Context(state.context, align, state.indented)\n  }\n\n  function popContext(state) {\n    if (state.context) {\n      state.indented = state.context.indented\n      state.context = state.context.prev\n    }\n  }\n\n  CodeMirror.defineMode(\"swift\", function(config) {\n    return {\n      startState: function() {\n        return {\n          prev: null,\n          context: null,\n          indented: 0,\n          tokenize: []\n        }\n      },\n\n      token: function(stream, state) {\n        var prev = state.prev\n        state.prev = null\n        var tokenize = state.tokenize[state.tokenize.length - 1] || tokenBase\n        var style = tokenize(stream, state, prev)\n        if (!style || style == \"comment\") state.prev = prev\n        else if (!state.prev) state.prev = style\n\n        if (style == \"punctuation\") {\n          var bracket = /[\\(\\[\\{]|([\\]\\)\\}])/.exec(stream.current())\n          if (bracket) (bracket[1] ? popContext : pushContext)(state, stream)\n        }\n\n        return style\n      },\n\n      indent: function(state, textAfter) {\n        var cx = state.context\n        if (!cx) return 0\n        var closing = /^[\\]\\}\\)]/.test(textAfter)\n        if (cx.align != null) return cx.align - (closing ? 1 : 0)\n        return cx.indented + (closing ? 0 : config.indentUnit)\n      },\n\n      electricInput: /^\\s*[\\)\\}\\]]$/,\n\n      lineComment: \"//\",\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      fold: \"brace\",\n      closeBrackets: \"()[]{}''\\\"\\\"``\"\n    }\n  })\n\n  CodeMirror.defineMIME(\"text/x-swift\",\"swift\")\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/tcl/tcl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n//tcl mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"tcl\", function() {\n  function parseWords(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  var keywords = parseWords(\"Tcl safe after append array auto_execok auto_import auto_load \" +\n        \"auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror \" +\n        \"binary break catch cd close concat continue dde eof encoding error \" +\n        \"eval exec exit expr fblocked fconfigure fcopy file fileevent filename \" +\n        \"filename flush for foreach format gets glob global history http if \" +\n        \"incr info interp join lappend lindex linsert list llength load lrange \" +\n        \"lreplace lsearch lset lsort memory msgcat namespace open package parray \" +\n        \"pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp \" +\n        \"registry regsub rename resource return scan seek set socket source split \" +\n        \"string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord \" +\n        \"tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest \" +\n        \"tclvars tell time trace unknown unset update uplevel upvar variable \" +\n    \"vwait\");\n    var functions = parseWords(\"if elseif else and not or eq ne in ni for foreach while switch\");\n    var isOperatorChar = /[+\\-*&%=<>!?^\\/\\|]/;\n    function chain(stream, state, f) {\n      state.tokenize = f;\n      return f(stream, state);\n    }\n    function tokenBase(stream, state) {\n      var beforeParams = state.beforeParams;\n      state.beforeParams = false;\n      var ch = stream.next();\n      if ((ch == '\"' || ch == \"'\") && state.inParams) {\n        return chain(stream, state, tokenString(ch));\n      } else if (/[\\[\\]{}\\(\\),;\\.]/.test(ch)) {\n        if (ch == \"(\" && beforeParams) state.inParams = true;\n        else if (ch == \")\") state.inParams = false;\n          return null;\n      } else if (/\\d/.test(ch)) {\n        stream.eatWhile(/[\\w\\.]/);\n        return \"number\";\n      } else if (ch == \"#\") {\n        if (stream.eat(\"*\"))\n          return chain(stream, state, tokenComment);\n        if (ch == \"#\" && stream.match(/ *\\[ *\\[/))\n          return chain(stream, state, tokenUnparsed);\n        stream.skipToEnd();\n        return \"comment\";\n      } else if (ch == '\"') {\n        stream.skipTo(/\"/);\n        return \"comment\";\n      } else if (ch == \"$\") {\n        stream.eatWhile(/[$_a-z0-9A-Z\\.{:]/);\n        stream.eatWhile(/}/);\n        state.beforeParams = true;\n        return \"builtin\";\n      } else if (isOperatorChar.test(ch)) {\n        stream.eatWhile(isOperatorChar);\n        return \"comment\";\n      } else {\n        stream.eatWhile(/[\\w\\$_{}\\xa1-\\uffff]/);\n        var word = stream.current().toLowerCase();\n        if (keywords && keywords.propertyIsEnumerable(word))\n          return \"keyword\";\n        if (functions && functions.propertyIsEnumerable(word)) {\n          state.beforeParams = true;\n          return \"keyword\";\n        }\n        return null;\n      }\n    }\n    function tokenString(quote) {\n      return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {\n          end = true;\n          break;\n        }\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end) state.tokenize = tokenBase;\n        return \"string\";\n      };\n    }\n    function tokenComment(stream, state) {\n      var maybeEnd = false, ch;\n      while (ch = stream.next()) {\n        if (ch == \"#\" && maybeEnd) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        maybeEnd = (ch == \"*\");\n      }\n      return \"comment\";\n    }\n    function tokenUnparsed(stream, state) {\n      var maybeEnd = 0, ch;\n      while (ch = stream.next()) {\n        if (ch == \"#\" && maybeEnd == 2) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        if (ch == \"]\")\n          maybeEnd++;\n        else if (ch != \" \")\n          maybeEnd = 0;\n      }\n      return \"meta\";\n    }\n    return {\n      startState: function() {\n        return {\n          tokenize: tokenBase,\n          beforeParams: false,\n          inParams: false\n        };\n      },\n      token: function(stream, state) {\n        if (stream.eatSpace()) return null;\n        return state.tokenize(stream, state);\n      },\n      lineComment: \"#\"\n    };\n});\nCodeMirror.defineMIME(\"text/x-tcl\", \"tcl\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/textile/textile.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") { // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  } else if (typeof define == \"function\" && define.amd) { // AMD\n    define([\"../../lib/codemirror\"], mod);\n  } else { // Plain browser env\n    mod(CodeMirror);\n  }\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var TOKEN_STYLES = {\n    addition: \"positive\",\n    attributes: \"attribute\",\n    bold: \"strong\",\n    cite: \"keyword\",\n    code: \"atom\",\n    definitionList: \"number\",\n    deletion: \"negative\",\n    div: \"punctuation\",\n    em: \"em\",\n    footnote: \"variable\",\n    footCite: \"qualifier\",\n    header: \"header\",\n    html: \"comment\",\n    image: \"string\",\n    italic: \"em\",\n    link: \"link\",\n    linkDefinition: \"link\",\n    list1: \"variable-2\",\n    list2: \"variable-3\",\n    list3: \"keyword\",\n    notextile: \"string-2\",\n    pre: \"operator\",\n    p: \"property\",\n    quote: \"bracket\",\n    span: \"quote\",\n    specialChar: \"tag\",\n    strong: \"strong\",\n    sub: \"builtin\",\n    sup: \"builtin\",\n    table: \"variable-3\",\n    tableHeading: \"operator\"\n  };\n\n  function startNewLine(stream, state) {\n    state.mode = Modes.newLayout;\n    state.tableHeading = false;\n\n    if (state.layoutType === \"definitionList\" && state.spanningLayout &&\n        stream.match(RE(\"definitionListEnd\"), false))\n      state.spanningLayout = false;\n  }\n\n  function handlePhraseModifier(stream, state, ch) {\n    if (ch === \"_\") {\n      if (stream.eat(\"_\"))\n        return togglePhraseModifier(stream, state, \"italic\", /__/, 2);\n      else\n        return togglePhraseModifier(stream, state, \"em\", /_/, 1);\n    }\n\n    if (ch === \"*\") {\n      if (stream.eat(\"*\")) {\n        return togglePhraseModifier(stream, state, \"bold\", /\\*\\*/, 2);\n      }\n      return togglePhraseModifier(stream, state, \"strong\", /\\*/, 1);\n    }\n\n    if (ch === \"[\") {\n      if (stream.match(/\\d+\\]/)) state.footCite = true;\n      return tokenStyles(state);\n    }\n\n    if (ch === \"(\") {\n      var spec = stream.match(/^(r|tm|c)\\)/);\n      if (spec)\n        return tokenStylesWith(state, TOKEN_STYLES.specialChar);\n    }\n\n    if (ch === \"<\" && stream.match(/(\\w+)[^>]+>[^<]+<\\/\\1>/))\n      return tokenStylesWith(state, TOKEN_STYLES.html);\n\n    if (ch === \"?\" && stream.eat(\"?\"))\n      return togglePhraseModifier(stream, state, \"cite\", /\\?\\?/, 2);\n\n    if (ch === \"=\" && stream.eat(\"=\"))\n      return togglePhraseModifier(stream, state, \"notextile\", /==/, 2);\n\n    if (ch === \"-\" && !stream.eat(\"-\"))\n      return togglePhraseModifier(stream, state, \"deletion\", /-/, 1);\n\n    if (ch === \"+\")\n      return togglePhraseModifier(stream, state, \"addition\", /\\+/, 1);\n\n    if (ch === \"~\")\n      return togglePhraseModifier(stream, state, \"sub\", /~/, 1);\n\n    if (ch === \"^\")\n      return togglePhraseModifier(stream, state, \"sup\", /\\^/, 1);\n\n    if (ch === \"%\")\n      return togglePhraseModifier(stream, state, \"span\", /%/, 1);\n\n    if (ch === \"@\")\n      return togglePhraseModifier(stream, state, \"code\", /@/, 1);\n\n    if (ch === \"!\") {\n      var type = togglePhraseModifier(stream, state, \"image\", /(?:\\([^\\)]+\\))?!/, 1);\n      stream.match(/^:\\S+/); // optional Url portion\n      return type;\n    }\n    return tokenStyles(state);\n  }\n\n  function togglePhraseModifier(stream, state, phraseModifier, closeRE, openSize) {\n    var charBefore = stream.pos > openSize ? stream.string.charAt(stream.pos - openSize - 1) : null;\n    var charAfter = stream.peek();\n    if (state[phraseModifier]) {\n      if ((!charAfter || /\\W/.test(charAfter)) && charBefore && /\\S/.test(charBefore)) {\n        var type = tokenStyles(state);\n        state[phraseModifier] = false;\n        return type;\n      }\n    } else if ((!charBefore || /\\W/.test(charBefore)) && charAfter && /\\S/.test(charAfter) &&\n               stream.match(new RegExp(\"^.*\\\\S\" + closeRE.source + \"(?:\\\\W|$)\"), false)) {\n      state[phraseModifier] = true;\n      state.mode = Modes.attributes;\n    }\n    return tokenStyles(state);\n  };\n\n  function tokenStyles(state) {\n    var disabled = textileDisabled(state);\n    if (disabled) return disabled;\n\n    var styles = [];\n    if (state.layoutType) styles.push(TOKEN_STYLES[state.layoutType]);\n\n    styles = styles.concat(activeStyles(\n      state, \"addition\", \"bold\", \"cite\", \"code\", \"deletion\", \"em\", \"footCite\",\n      \"image\", \"italic\", \"link\", \"span\", \"strong\", \"sub\", \"sup\", \"table\", \"tableHeading\"));\n\n    if (state.layoutType === \"header\")\n      styles.push(TOKEN_STYLES.header + \"-\" + state.header);\n\n    return styles.length ? styles.join(\" \") : null;\n  }\n\n  function textileDisabled(state) {\n    var type = state.layoutType;\n\n    switch(type) {\n    case \"notextile\":\n    case \"code\":\n    case \"pre\":\n      return TOKEN_STYLES[type];\n    default:\n      if (state.notextile)\n        return TOKEN_STYLES.notextile + (type ? (\" \" + TOKEN_STYLES[type]) : \"\");\n      return null;\n    }\n  }\n\n  function tokenStylesWith(state, extraStyles) {\n    var disabled = textileDisabled(state);\n    if (disabled) return disabled;\n\n    var type = tokenStyles(state);\n    if (extraStyles)\n      return type ? (type + \" \" + extraStyles) : extraStyles;\n    else\n      return type;\n  }\n\n  function activeStyles(state) {\n    var styles = [];\n    for (var i = 1; i < arguments.length; ++i) {\n      if (state[arguments[i]])\n        styles.push(TOKEN_STYLES[arguments[i]]);\n    }\n    return styles;\n  }\n\n  function blankLine(state) {\n    var spanningLayout = state.spanningLayout, type = state.layoutType;\n\n    for (var key in state) if (state.hasOwnProperty(key))\n      delete state[key];\n\n    state.mode = Modes.newLayout;\n    if (spanningLayout) {\n      state.layoutType = type;\n      state.spanningLayout = true;\n    }\n  }\n\n  var REs = {\n    cache: {},\n    single: {\n      bc: \"bc\",\n      bq: \"bq\",\n      definitionList: /- .*?:=+/,\n      definitionListEnd: /.*=:\\s*$/,\n      div: \"div\",\n      drawTable: /\\|.*\\|/,\n      foot: /fn\\d+/,\n      header: /h[1-6]/,\n      html: /\\s*<(?:\\/)?(\\w+)(?:[^>]+)?>(?:[^<]+<\\/\\1>)?/,\n      link: /[^\"]+\":\\S/,\n      linkDefinition: /\\[[^\\s\\]]+\\]\\S+/,\n      list: /(?:#+|\\*+)/,\n      notextile: \"notextile\",\n      para: \"p\",\n      pre: \"pre\",\n      table: \"table\",\n      tableCellAttributes: /[\\/\\\\]\\d+/,\n      tableHeading: /\\|_\\./,\n      tableText: /[^\"_\\*\\[\\(\\?\\+~\\^%@|-]+/,\n      text: /[^!\"_=\\*\\[\\(<\\?\\+~\\^%@-]+/\n    },\n    attributes: {\n      align: /(?:<>|<|>|=)/,\n      selector: /\\([^\\(][^\\)]+\\)/,\n      lang: /\\[[^\\[\\]]+\\]/,\n      pad: /(?:\\(+|\\)+){1,2}/,\n      css: /\\{[^\\}]+\\}/\n    },\n    createRe: function(name) {\n      switch (name) {\n      case \"drawTable\":\n        return REs.makeRe(\"^\", REs.single.drawTable, \"$\");\n      case \"html\":\n        return REs.makeRe(\"^\", REs.single.html, \"(?:\", REs.single.html, \")*\", \"$\");\n      case \"linkDefinition\":\n        return REs.makeRe(\"^\", REs.single.linkDefinition, \"$\");\n      case \"listLayout\":\n        return REs.makeRe(\"^\", REs.single.list, RE(\"allAttributes\"), \"*\\\\s+\");\n      case \"tableCellAttributes\":\n        return REs.makeRe(\"^\", REs.choiceRe(REs.single.tableCellAttributes,\n                                            RE(\"allAttributes\")), \"+\\\\.\");\n      case \"type\":\n        return REs.makeRe(\"^\", RE(\"allTypes\"));\n      case \"typeLayout\":\n        return REs.makeRe(\"^\", RE(\"allTypes\"), RE(\"allAttributes\"),\n                          \"*\\\\.\\\\.?\", \"(\\\\s+|$)\");\n      case \"attributes\":\n        return REs.makeRe(\"^\", RE(\"allAttributes\"), \"+\");\n\n      case \"allTypes\":\n        return REs.choiceRe(REs.single.div, REs.single.foot,\n                            REs.single.header, REs.single.bc, REs.single.bq,\n                            REs.single.notextile, REs.single.pre, REs.single.table,\n                            REs.single.para);\n\n      case \"allAttributes\":\n        return REs.choiceRe(REs.attributes.selector, REs.attributes.css,\n                            REs.attributes.lang, REs.attributes.align, REs.attributes.pad);\n\n      default:\n        return REs.makeRe(\"^\", REs.single[name]);\n      }\n    },\n    makeRe: function() {\n      var pattern = \"\";\n      for (var i = 0; i < arguments.length; ++i) {\n        var arg = arguments[i];\n        pattern += (typeof arg === \"string\") ? arg : arg.source;\n      }\n      return new RegExp(pattern);\n    },\n    choiceRe: function() {\n      var parts = [arguments[0]];\n      for (var i = 1; i < arguments.length; ++i) {\n        parts[i * 2 - 1] = \"|\";\n        parts[i * 2] = arguments[i];\n      }\n\n      parts.unshift(\"(?:\");\n      parts.push(\")\");\n      return REs.makeRe.apply(null, parts);\n    }\n  };\n\n  function RE(name) {\n    return (REs.cache[name] || (REs.cache[name] = REs.createRe(name)));\n  }\n\n  var Modes = {\n    newLayout: function(stream, state) {\n      if (stream.match(RE(\"typeLayout\"), false)) {\n        state.spanningLayout = false;\n        return (state.mode = Modes.blockType)(stream, state);\n      }\n      var newMode;\n      if (!textileDisabled(state)) {\n        if (stream.match(RE(\"listLayout\"), false))\n          newMode = Modes.list;\n        else if (stream.match(RE(\"drawTable\"), false))\n          newMode = Modes.table;\n        else if (stream.match(RE(\"linkDefinition\"), false))\n          newMode = Modes.linkDefinition;\n        else if (stream.match(RE(\"definitionList\")))\n          newMode = Modes.definitionList;\n        else if (stream.match(RE(\"html\"), false))\n          newMode = Modes.html;\n      }\n      return (state.mode = (newMode || Modes.text))(stream, state);\n    },\n\n    blockType: function(stream, state) {\n      var match, type;\n      state.layoutType = null;\n\n      if (match = stream.match(RE(\"type\")))\n        type = match[0];\n      else\n        return (state.mode = Modes.text)(stream, state);\n\n      if (match = type.match(RE(\"header\"))) {\n        state.layoutType = \"header\";\n        state.header = parseInt(match[0][1]);\n      } else if (type.match(RE(\"bq\"))) {\n        state.layoutType = \"quote\";\n      } else if (type.match(RE(\"bc\"))) {\n        state.layoutType = \"code\";\n      } else if (type.match(RE(\"foot\"))) {\n        state.layoutType = \"footnote\";\n      } else if (type.match(RE(\"notextile\"))) {\n        state.layoutType = \"notextile\";\n      } else if (type.match(RE(\"pre\"))) {\n        state.layoutType = \"pre\";\n      } else if (type.match(RE(\"div\"))) {\n        state.layoutType = \"div\";\n      } else if (type.match(RE(\"table\"))) {\n        state.layoutType = \"table\";\n      }\n\n      state.mode = Modes.attributes;\n      return tokenStyles(state);\n    },\n\n    text: function(stream, state) {\n      if (stream.match(RE(\"text\"))) return tokenStyles(state);\n\n      var ch = stream.next();\n      if (ch === '\"')\n        return (state.mode = Modes.link)(stream, state);\n      return handlePhraseModifier(stream, state, ch);\n    },\n\n    attributes: function(stream, state) {\n      state.mode = Modes.layoutLength;\n\n      if (stream.match(RE(\"attributes\")))\n        return tokenStylesWith(state, TOKEN_STYLES.attributes);\n      else\n        return tokenStyles(state);\n    },\n\n    layoutLength: function(stream, state) {\n      if (stream.eat(\".\") && stream.eat(\".\"))\n        state.spanningLayout = true;\n\n      state.mode = Modes.text;\n      return tokenStyles(state);\n    },\n\n    list: function(stream, state) {\n      var match = stream.match(RE(\"list\"));\n      state.listDepth = match[0].length;\n      var listMod = (state.listDepth - 1) % 3;\n      if (!listMod)\n        state.layoutType = \"list1\";\n      else if (listMod === 1)\n        state.layoutType = \"list2\";\n      else\n        state.layoutType = \"list3\";\n\n      state.mode = Modes.attributes;\n      return tokenStyles(state);\n    },\n\n    link: function(stream, state) {\n      state.mode = Modes.text;\n      if (stream.match(RE(\"link\"))) {\n        stream.match(/\\S+/);\n        return tokenStylesWith(state, TOKEN_STYLES.link);\n      }\n      return tokenStyles(state);\n    },\n\n    linkDefinition: function(stream, state) {\n      stream.skipToEnd();\n      return tokenStylesWith(state, TOKEN_STYLES.linkDefinition);\n    },\n\n    definitionList: function(stream, state) {\n      stream.match(RE(\"definitionList\"));\n\n      state.layoutType = \"definitionList\";\n\n      if (stream.match(/\\s*$/))\n        state.spanningLayout = true;\n      else\n        state.mode = Modes.attributes;\n\n      return tokenStyles(state);\n    },\n\n    html: function(stream, state) {\n      stream.skipToEnd();\n      return tokenStylesWith(state, TOKEN_STYLES.html);\n    },\n\n    table: function(stream, state) {\n      state.layoutType = \"table\";\n      return (state.mode = Modes.tableCell)(stream, state);\n    },\n\n    tableCell: function(stream, state) {\n      if (stream.match(RE(\"tableHeading\")))\n        state.tableHeading = true;\n      else\n        stream.eat(\"|\");\n\n      state.mode = Modes.tableCellAttributes;\n      return tokenStyles(state);\n    },\n\n    tableCellAttributes: function(stream, state) {\n      state.mode = Modes.tableText;\n\n      if (stream.match(RE(\"tableCellAttributes\")))\n        return tokenStylesWith(state, TOKEN_STYLES.attributes);\n      else\n        return tokenStyles(state);\n    },\n\n    tableText: function(stream, state) {\n      if (stream.match(RE(\"tableText\")))\n        return tokenStyles(state);\n\n      if (stream.peek() === \"|\") { // end of cell\n        state.mode = Modes.tableCell;\n        return tokenStyles(state);\n      }\n      return handlePhraseModifier(stream, state, stream.next());\n    }\n  };\n\n  CodeMirror.defineMode(\"textile\", function() {\n    return {\n      startState: function() {\n        return { mode: Modes.newLayout };\n      },\n      token: function(stream, state) {\n        if (stream.sol()) startNewLine(stream, state);\n        return state.mode(stream, state);\n      },\n      blankLine: blankLine\n    };\n  });\n\n  CodeMirror.defineMIME(\"text/x-textile\", \"textile\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/tiddlywiki/tiddlywiki.css",
    "content": "span.cm-underlined {\n  text-decoration: underline;\n}\nspan.cm-strikethrough {\n  text-decoration: line-through;\n}\nspan.cm-brace {\n  color: #170;\n  font-weight: bold;\n}\nspan.cm-table {\n  color: blue;\n  font-weight: bold;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/tiddlywiki/tiddlywiki.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/***\n    |''Name''|tiddlywiki.js|\n    |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror|\n    |''Author''|PMario|\n    |''Version''|0.1.7|\n    |''Status''|''stable''|\n    |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]|\n    |''Documentation''|https://codemirror.tiddlyspace.com/|\n    |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]|\n    |''CoreVersion''|2.5.0|\n    |''Requires''|codemirror.js|\n    |''Keywords''|syntax highlighting color code mirror codemirror|\n    ! Info\n    CoreVersion parameter is needed for TiddlyWiki only!\n***/\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"tiddlywiki\", function () {\n  // Tokenizer\n  var textwords = {};\n\n  var keywords = {\n    \"allTags\": true, \"closeAll\": true, \"list\": true,\n    \"newJournal\": true, \"newTiddler\": true,\n    \"permaview\": true, \"saveChanges\": true,\n    \"search\": true, \"slider\": true, \"tabs\": true,\n    \"tag\": true, \"tagging\": true, \"tags\": true,\n    \"tiddler\": true, \"timeline\": true,\n    \"today\": true, \"version\": true, \"option\": true,\n    \"with\": true, \"filter\": true\n  };\n\n  var isSpaceName = /[\\w_\\-]/i,\n      reHR = /^\\-\\-\\-\\-+$/,                                 // <hr>\n      reWikiCommentStart = /^\\/\\*\\*\\*$/,            // /***\n      reWikiCommentStop = /^\\*\\*\\*\\/$/,             // ***/\n      reBlockQuote = /^<<<$/,\n\n      reJsCodeStart = /^\\/\\/\\{\\{\\{$/,                       // //{{{ js block start\n      reJsCodeStop = /^\\/\\/\\}\\}\\}$/,                        // //}}} js stop\n      reXmlCodeStart = /^<!--\\{\\{\\{-->$/,           // xml block start\n      reXmlCodeStop = /^<!--\\}\\}\\}-->$/,            // xml stop\n\n      reCodeBlockStart = /^\\{\\{\\{$/,                        // {{{ TW text div block start\n      reCodeBlockStop = /^\\}\\}\\}$/,                 // }}} TW text stop\n\n      reUntilCodeStop = /.*?\\}\\}\\}/;\n\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n\n  function tokenBase(stream, state) {\n    var sol = stream.sol(), ch = stream.peek();\n\n    state.block = false;        // indicates the start of a code block.\n\n    // check start of  blocks\n    if (sol && /[<\\/\\*{}\\-]/.test(ch)) {\n      if (stream.match(reCodeBlockStart)) {\n        state.block = true;\n        return chain(stream, state, twTokenCode);\n      }\n      if (stream.match(reBlockQuote))\n        return 'quote';\n      if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop))\n        return 'comment';\n      if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop))\n        return 'comment';\n      if (stream.match(reHR))\n        return 'hr';\n    }\n\n    stream.next();\n    if (sol && /[\\/\\*!#;:>|]/.test(ch)) {\n      if (ch == \"!\") { // tw header\n        stream.skipToEnd();\n        return \"header\";\n      }\n      if (ch == \"*\") { // tw list\n        stream.eatWhile('*');\n        return \"comment\";\n      }\n      if (ch == \"#\") { // tw numbered list\n        stream.eatWhile('#');\n        return \"comment\";\n      }\n      if (ch == \";\") { // definition list, term\n        stream.eatWhile(';');\n        return \"comment\";\n      }\n      if (ch == \":\") { // definition list, description\n        stream.eatWhile(':');\n        return \"comment\";\n      }\n      if (ch == \">\") { // single line quote\n        stream.eatWhile(\">\");\n        return \"quote\";\n      }\n      if (ch == '|')\n        return 'header';\n    }\n\n    if (ch == '{' && stream.match('{{'))\n      return chain(stream, state, twTokenCode);\n\n    // rudimentary html:// file:// link matching. TW knows much more ...\n    if (/[hf]/i.test(ch) &&\n        /[ti]/i.test(stream.peek()) &&\n        stream.match(/\\b(ttps?|tp|ile):\\/\\/[\\-A-Z0-9+&@#\\/%?=~_|$!:,.;]*[A-Z0-9+&@#\\/%=~_|$]/i))\n      return \"link\";\n\n    // just a little string indicator, don't want to have the whole string covered\n    if (ch == '\"')\n      return 'string';\n\n    if (ch == '~')    // _no_ CamelCase indicator should be bold\n      return 'brace';\n\n    if (/[\\[\\]]/.test(ch) && stream.match(ch)) // check for [[..]]\n      return 'brace';\n\n    if (ch == \"@\") {    // check for space link. TODO fix @@...@@ highlighting\n      stream.eatWhile(isSpaceName);\n      return \"link\";\n    }\n\n    if (/\\d/.test(ch)) {        // numbers\n      stream.eatWhile(/\\d/);\n      return \"number\";\n    }\n\n    if (ch == \"/\") { // tw invisible comment\n      if (stream.eat(\"%\")) {\n        return chain(stream, state, twTokenComment);\n      } else if (stream.eat(\"/\")) { //\n        return chain(stream, state, twTokenEm);\n      }\n    }\n\n    if (ch == \"_\" && stream.eat(\"_\")) // tw underline\n        return chain(stream, state, twTokenUnderline);\n\n    // strikethrough and mdash handling\n    if (ch == \"-\" && stream.eat(\"-\")) {\n      // if strikethrough looks ugly, change CSS.\n      if (stream.peek() != ' ')\n        return chain(stream, state, twTokenStrike);\n      // mdash\n      if (stream.peek() == ' ')\n        return 'brace';\n    }\n\n    if (ch == \"'\" && stream.eat(\"'\")) // tw bold\n      return chain(stream, state, twTokenStrong);\n\n    if (ch == \"<\" && stream.eat(\"<\")) // tw macro\n      return chain(stream, state, twTokenMacro);\n\n    // core macro handling\n    stream.eatWhile(/[\\w\\$_]/);\n    return textwords.propertyIsEnumerable(stream.current()) ? \"keyword\" : null\n  }\n\n  // tw invisible comment\n  function twTokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"%\");\n    }\n    return \"comment\";\n  }\n\n  // tw strong / bold\n  function twTokenStrong(stream, state) {\n    var maybeEnd = false,\n    ch;\n    while (ch = stream.next()) {\n      if (ch == \"'\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"'\");\n    }\n    return \"strong\";\n  }\n\n  // tw code\n  function twTokenCode(stream, state) {\n    var sb = state.block;\n\n    if (sb && stream.current()) {\n      return \"comment\";\n    }\n\n    if (!sb && stream.match(reUntilCodeStop)) {\n      state.tokenize = tokenBase;\n      return \"comment\";\n    }\n\n    if (sb && stream.sol() && stream.match(reCodeBlockStop)) {\n      state.tokenize = tokenBase;\n      return \"comment\";\n    }\n\n    stream.next();\n    return \"comment\";\n  }\n\n  // tw em / italic\n  function twTokenEm(stream, state) {\n    var maybeEnd = false,\n    ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"/\");\n    }\n    return \"em\";\n  }\n\n  // tw underlined text\n  function twTokenUnderline(stream, state) {\n    var maybeEnd = false,\n    ch;\n    while (ch = stream.next()) {\n      if (ch == \"_\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"_\");\n    }\n    return \"underlined\";\n  }\n\n  // tw strike through text looks ugly\n  // change CSS if needed\n  function twTokenStrike(stream, state) {\n    var maybeEnd = false, ch;\n\n    while (ch = stream.next()) {\n      if (ch == \"-\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"-\");\n    }\n    return \"strikethrough\";\n  }\n\n  // macro\n  function twTokenMacro(stream, state) {\n    if (stream.current() == '<<') {\n      return 'macro';\n    }\n\n    var ch = stream.next();\n    if (!ch) {\n      state.tokenize = tokenBase;\n      return null;\n    }\n    if (ch == \">\") {\n      if (stream.peek() == '>') {\n        stream.next();\n        state.tokenize = tokenBase;\n        return \"macro\";\n      }\n    }\n\n    stream.eatWhile(/[\\w\\$_]/);\n    return keywords.propertyIsEnumerable(stream.current()) ? \"keyword\" : null\n  }\n\n  // Interface\n  return {\n    startState: function () {\n      return {tokenize: tokenBase};\n    },\n\n    token: function (stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      return style;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-tiddlywiki\", \"tiddlywiki\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/tiki/tiki.css",
    "content": ".cm-tw-syntaxerror {\n\tcolor: #FFF;\n\tbackground-color: #900;\n}\n\n.cm-tw-deleted {\n\ttext-decoration: line-through;\n}\n\n.cm-tw-header5 {\n\tfont-weight: bold;\n}\n.cm-tw-listitem:first-child { /*Added first child to fix duplicate padding when highlighting*/\n\tpadding-left: 10px;\n}\n\n.cm-tw-box {\n\tborder-top-width: 0px !important;\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: inherit;\n}\n\n.cm-tw-underline {\n\ttext-decoration: underline;\n}"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/tiki/tiki.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('tiki', function(config) {\n  function inBlock(style, terminator, returnTokenizer) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.match(terminator)) {\n          state.tokenize = inText;\n          break;\n        }\n        stream.next();\n      }\n\n      if (returnTokenizer) state.tokenize = returnTokenizer;\n\n      return style;\n    };\n  }\n\n  function inLine(style) {\n    return function(stream, state) {\n      while(!stream.eol()) {\n        stream.next();\n      }\n      state.tokenize = inText;\n      return style;\n    };\n  }\n\n  function inText(stream, state) {\n    function chain(parser) {\n      state.tokenize = parser;\n      return parser(stream, state);\n    }\n\n    var sol = stream.sol();\n    var ch = stream.next();\n\n    //non start of line\n    switch (ch) { //switch is generally much faster than if, so it is used here\n    case \"{\": //plugin\n      stream.eat(\"/\");\n      stream.eatSpace();\n      stream.eatWhile(/[^\\s\\u00a0=\\\"\\'\\/?(}]/);\n      state.tokenize = inPlugin;\n      return \"tag\";\n    case \"_\": //bold\n      if (stream.eat(\"_\"))\n        return chain(inBlock(\"strong\", \"__\", inText));\n      break;\n    case \"'\": //italics\n      if (stream.eat(\"'\"))\n        return chain(inBlock(\"em\", \"''\", inText));\n      break;\n    case \"(\":// Wiki Link\n      if (stream.eat(\"(\"))\n        return chain(inBlock(\"variable-2\", \"))\", inText));\n      break;\n    case \"[\":// Weblink\n      return chain(inBlock(\"variable-3\", \"]\", inText));\n      break;\n    case \"|\": //table\n      if (stream.eat(\"|\"))\n        return chain(inBlock(\"comment\", \"||\"));\n      break;\n    case \"-\":\n      if (stream.eat(\"=\")) {//titleBar\n        return chain(inBlock(\"header string\", \"=-\", inText));\n      } else if (stream.eat(\"-\")) {//deleted\n        return chain(inBlock(\"error tw-deleted\", \"--\", inText));\n      }\n      break;\n    case \"=\": //underline\n      if (stream.match(\"==\"))\n        return chain(inBlock(\"tw-underline\", \"===\", inText));\n      break;\n    case \":\":\n      if (stream.eat(\":\"))\n        return chain(inBlock(\"comment\", \"::\"));\n      break;\n    case \"^\": //box\n      return chain(inBlock(\"tw-box\", \"^\"));\n      break;\n    case \"~\": //np\n      if (stream.match(\"np~\"))\n        return chain(inBlock(\"meta\", \"~/np~\"));\n      break;\n    }\n\n    //start of line types\n    if (sol) {\n      switch (ch) {\n      case \"!\": //header at start of line\n        if (stream.match('!!!!!')) {\n          return chain(inLine(\"header string\"));\n        } else if (stream.match('!!!!')) {\n          return chain(inLine(\"header string\"));\n        } else if (stream.match('!!!')) {\n          return chain(inLine(\"header string\"));\n        } else if (stream.match('!!')) {\n          return chain(inLine(\"header string\"));\n        } else {\n          return chain(inLine(\"header string\"));\n        }\n        break;\n      case \"*\": //unordered list line item, or <li /> at start of line\n      case \"#\": //ordered list line item, or <li /> at start of line\n      case \"+\": //ordered list line item, or <li /> at start of line\n        return chain(inLine(\"tw-listitem bracket\"));\n        break;\n      }\n    }\n\n    //stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki\n    return null;\n  }\n\n  var indentUnit = config.indentUnit;\n\n  // Return variables for tokenizers\n  var pluginName, type;\n  function inPlugin(stream, state) {\n    var ch = stream.next();\n    var peek = stream.peek();\n\n    if (ch == \"}\") {\n      state.tokenize = inText;\n      //type = ch == \")\" ? \"endPlugin\" : \"selfclosePlugin\"; inPlugin\n      return \"tag\";\n    } else if (ch == \"(\" || ch == \")\") {\n      return \"bracket\";\n    } else if (ch == \"=\") {\n      type = \"equals\";\n\n      if (peek == \">\") {\n        stream.next();\n        peek = stream.peek();\n      }\n\n      //here we detect values directly after equal character with no quotes\n      if (!/[\\'\\\"]/.test(peek)) {\n        state.tokenize = inAttributeNoQuote();\n      }\n      //end detect values\n\n      return \"operator\";\n    } else if (/[\\'\\\"]/.test(ch)) {\n      state.tokenize = inAttribute(ch);\n      return state.tokenize(stream, state);\n    } else {\n      stream.eatWhile(/[^\\s\\u00a0=\\\"\\'\\/?]/);\n      return \"keyword\";\n    }\n  }\n\n  function inAttribute(quote) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.next() == quote) {\n          state.tokenize = inPlugin;\n          break;\n        }\n      }\n      return \"string\";\n    };\n  }\n\n  function inAttributeNoQuote() {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        var ch = stream.next();\n        var peek = stream.peek();\n        if (ch == \" \" || ch == \",\" || /[ )}]/.test(peek)) {\n      state.tokenize = inPlugin;\n      break;\n    }\n  }\n  return \"string\";\n};\n                     }\n\nvar curState, setStyle;\nfunction pass() {\n  for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);\n}\n\nfunction cont() {\n  pass.apply(null, arguments);\n  return true;\n}\n\nfunction pushContext(pluginName, startOfLine) {\n  var noIndent = curState.context && curState.context.noIndent;\n  curState.context = {\n    prev: curState.context,\n    pluginName: pluginName,\n    indent: curState.indented,\n    startOfLine: startOfLine,\n    noIndent: noIndent\n  };\n}\n\nfunction popContext() {\n  if (curState.context) curState.context = curState.context.prev;\n}\n\nfunction element(type) {\n  if (type == \"openPlugin\") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));}\n  else if (type == \"closePlugin\") {\n    var err = false;\n    if (curState.context) {\n      err = curState.context.pluginName != pluginName;\n      popContext();\n    } else {\n      err = true;\n    }\n    if (err) setStyle = \"error\";\n    return cont(endcloseplugin(err));\n  }\n  else if (type == \"string\") {\n    if (!curState.context || curState.context.name != \"!cdata\") pushContext(\"!cdata\");\n    if (curState.tokenize == inText) popContext();\n    return cont();\n  }\n  else return cont();\n}\n\nfunction endplugin(startOfLine) {\n  return function(type) {\n    if (\n      type == \"selfclosePlugin\" ||\n        type == \"endPlugin\"\n    )\n      return cont();\n    if (type == \"endPlugin\") {pushContext(curState.pluginName, startOfLine); return cont();}\n    return cont();\n  };\n}\n\nfunction endcloseplugin(err) {\n  return function(type) {\n    if (err) setStyle = \"error\";\n    if (type == \"endPlugin\") return cont();\n    return pass();\n  };\n}\n\nfunction attributes(type) {\n  if (type == \"keyword\") {setStyle = \"attribute\"; return cont(attributes);}\n  if (type == \"equals\") return cont(attvalue, attributes);\n  return pass();\n}\nfunction attvalue(type) {\n  if (type == \"keyword\") {setStyle = \"string\"; return cont();}\n  if (type == \"string\") return cont(attvaluemaybe);\n  return pass();\n}\nfunction attvaluemaybe(type) {\n  if (type == \"string\") return cont(attvaluemaybe);\n  else return pass();\n}\nreturn {\n  startState: function() {\n    return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null};\n  },\n  token: function(stream, state) {\n    if (stream.sol()) {\n      state.startOfLine = true;\n      state.indented = stream.indentation();\n    }\n    if (stream.eatSpace()) return null;\n\n    setStyle = type = pluginName = null;\n    var style = state.tokenize(stream, state);\n    if ((style || type) && style != \"comment\") {\n      curState = state;\n      while (true) {\n        var comb = state.cc.pop() || element;\n        if (comb(type || style)) break;\n      }\n    }\n    state.startOfLine = false;\n    return setStyle || style;\n  },\n  indent: function(state, textAfter) {\n    var context = state.context;\n    if (context && context.noIndent) return 0;\n    if (context && /^{\\//.test(textAfter))\n        context = context.prev;\n    while (context && !context.startOfLine)\n        context = context.prev;\n    if (context) return context.indent + indentUnit;\n    else return 0;\n  },\n  electricChars: \"/\"\n};\n});\n\nCodeMirror.defineMIME(\"text/tiki\", \"tiki\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/toml/toml.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"toml\", function () {\n  return {\n    startState: function () {\n      return {\n        inString: false,\n        stringType: \"\",\n        lhs: true,\n        inArray: 0\n      };\n    },\n    token: function (stream, state) {\n      //check for state changes\n      if (!state.inString && ((stream.peek() == '\"') || (stream.peek() == \"'\"))) {\n        state.stringType = stream.peek();\n        stream.next(); // Skip quote\n        state.inString = true; // Update state\n      }\n      if (stream.sol() && state.inArray === 0) {\n        state.lhs = true;\n      }\n      //return state\n      if (state.inString) {\n        while (state.inString && !stream.eol()) {\n          if (stream.peek() === state.stringType) {\n            stream.next(); // Skip quote\n            state.inString = false; // Clear flag\n          } else if (stream.peek() === '\\\\') {\n            stream.next();\n            stream.next();\n          } else {\n            stream.match(/^.[^\\\\\\\"\\']*/);\n          }\n        }\n        return state.lhs ? \"property string\" : \"string\"; // Token style\n      } else if (state.inArray && stream.peek() === ']') {\n        stream.next();\n        state.inArray--;\n        return 'bracket';\n      } else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) {\n        stream.next();//skip closing ]\n        // array of objects has an extra open & close []\n        if (stream.peek() === ']') stream.next();\n        return \"atom\";\n      } else if (stream.peek() === \"#\") {\n        stream.skipToEnd();\n        return \"comment\";\n      } else if (stream.eatSpace()) {\n        return null;\n      } else if (state.lhs && stream.eatWhile(function (c) { return c != '=' && c != ' '; })) {\n        return \"property\";\n      } else if (state.lhs && stream.peek() === \"=\") {\n        stream.next();\n        state.lhs = false;\n        return null;\n      } else if (!state.lhs && stream.match(/^\\d\\d\\d\\d[\\d\\-\\:\\.T]*Z/)) {\n        return 'atom'; //date\n      } else if (!state.lhs && (stream.match('true') || stream.match('false'))) {\n        return 'atom';\n      } else if (!state.lhs && stream.peek() === '[') {\n        state.inArray++;\n        stream.next();\n        return 'bracket';\n      } else if (!state.lhs && stream.match(/^\\-?\\d+(?:\\.\\d+)?/)) {\n        return 'number';\n      } else if (!stream.eatSpace()) {\n        stream.next();\n      }\n      return null;\n    }\n  };\n});\n\nCodeMirror.defineMIME('text/x-toml', 'toml');\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/tornado/tornado.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"),\n        require(\"../../addon/mode/overlay\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\",\n            \"../../addon/mode/overlay\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"tornado:inner\", function() {\n    var keywords = [\"and\",\"as\",\"assert\",\"autoescape\",\"block\",\"break\",\"class\",\"comment\",\"context\",\n                    \"continue\",\"datetime\",\"def\",\"del\",\"elif\",\"else\",\"end\",\"escape\",\"except\",\n                    \"exec\",\"extends\",\"false\",\"finally\",\"for\",\"from\",\"global\",\"if\",\"import\",\"in\",\n                    \"include\",\"is\",\"json_encode\",\"lambda\",\"length\",\"linkify\",\"load\",\"module\",\n                    \"none\",\"not\",\"or\",\"pass\",\"print\",\"put\",\"raise\",\"raw\",\"return\",\"self\",\"set\",\n                    \"squeeze\",\"super\",\"true\",\"try\",\"url_escape\",\"while\",\"with\",\"without\",\"xhtml_escape\",\"yield\"];\n    keywords = new RegExp(\"^((\" + keywords.join(\")|(\") + \"))\\\\b\");\n\n    function tokenBase (stream, state) {\n      stream.eatWhile(/[^\\{]/);\n      var ch = stream.next();\n      if (ch == \"{\") {\n        if (ch = stream.eat(/\\{|%|#/)) {\n          state.tokenize = inTag(ch);\n          return \"tag\";\n        }\n      }\n    }\n    function inTag (close) {\n      if (close == \"{\") {\n        close = \"}\";\n      }\n      return function (stream, state) {\n        var ch = stream.next();\n        if ((ch == close) && stream.eat(\"}\")) {\n          state.tokenize = tokenBase;\n          return \"tag\";\n        }\n        if (stream.match(keywords)) {\n          return \"keyword\";\n        }\n        return close == \"#\" ? \"comment\" : \"string\";\n      };\n    }\n    return {\n      startState: function () {\n        return {tokenize: tokenBase};\n      },\n      token: function (stream, state) {\n        return state.tokenize(stream, state);\n      }\n    };\n  });\n\n  CodeMirror.defineMode(\"tornado\", function(config) {\n    var htmlBase = CodeMirror.getMode(config, \"text/html\");\n    var tornadoInner = CodeMirror.getMode(config, \"tornado:inner\");\n    return CodeMirror.overlayMode(htmlBase, tornadoInner);\n  });\n\n  CodeMirror.defineMIME(\"text/x-tornado\", \"tornado\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/troff/troff.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\")\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd)\n    define([\"../../lib/codemirror\"], mod);\n  else\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('troff', function() {\n\n  var words = {};\n\n  function tokenBase(stream) {\n    if (stream.eatSpace()) return null;\n\n    var sol = stream.sol();\n    var ch = stream.next();\n\n    if (ch === '\\\\') {\n      if (stream.match('fB') || stream.match('fR') || stream.match('fI') ||\n          stream.match('u')  || stream.match('d')  ||\n          stream.match('%')  || stream.match('&')) {\n        return 'string';\n      }\n      if (stream.match('m[')) {\n        stream.skipTo(']');\n        stream.next();\n        return 'string';\n      }\n      if (stream.match('s+') || stream.match('s-')) {\n        stream.eatWhile(/[\\d-]/);\n        return 'string';\n      }\n      if (stream.match('\\(') || stream.match('*\\(')) {\n        stream.eatWhile(/[\\w-]/);\n        return 'string';\n      }\n      return 'string';\n    }\n    if (sol && (ch === '.' || ch === '\\'')) {\n      if (stream.eat('\\\\') && stream.eat('\\\"')) {\n        stream.skipToEnd();\n        return 'comment';\n      }\n    }\n    if (sol && ch === '.') {\n      if (stream.match('B ') || stream.match('I ') || stream.match('R ')) {\n        return 'attribute';\n      }\n      if (stream.match('TH ') || stream.match('SH ') || stream.match('SS ') || stream.match('HP ')) {\n        stream.skipToEnd();\n        return 'quote';\n      }\n      if ((stream.match(/[A-Z]/) && stream.match(/[A-Z]/)) || (stream.match(/[a-z]/) && stream.match(/[a-z]/))) {\n        return 'attribute';\n      }\n    }\n    stream.eatWhile(/[\\w-]/);\n    var cur = stream.current();\n    return words.hasOwnProperty(cur) ? words[cur] : null;\n  }\n\n  function tokenize(stream, state) {\n    return (state.tokens[0] || tokenBase) (stream, state);\n  };\n\n  return {\n    startState: function() {return {tokens:[]};},\n    token: function(stream, state) {\n      return tokenize(stream, state);\n    }\n  };\n});\n\nCodeMirror.defineMIME('text/troff', 'troff');\nCodeMirror.defineMIME('text/x-troff', 'troff');\nCodeMirror.defineMIME('application/x-troff', 'troff');\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/ttcn/ttcn.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"ttcn\", function(config, parserConfig) {\n    var indentUnit = config.indentUnit,\n        keywords = parserConfig.keywords || {},\n        builtin = parserConfig.builtin || {},\n        timerOps = parserConfig.timerOps || {},\n        portOps  = parserConfig.portOps || {},\n        configOps = parserConfig.configOps || {},\n        verdictOps = parserConfig.verdictOps || {},\n        sutOps = parserConfig.sutOps || {},\n        functionOps = parserConfig.functionOps || {},\n\n        verdictConsts = parserConfig.verdictConsts || {},\n        booleanConsts = parserConfig.booleanConsts || {},\n        otherConsts   = parserConfig.otherConsts || {},\n\n        types = parserConfig.types || {},\n        visibilityModifiers = parserConfig.visibilityModifiers || {},\n        templateMatch = parserConfig.templateMatch || {},\n        multiLineStrings = parserConfig.multiLineStrings,\n        indentStatements = parserConfig.indentStatements !== false;\n    var isOperatorChar = /[+\\-*&@=<>!\\/]/;\n    var curPunc;\n\n    function tokenBase(stream, state) {\n      var ch = stream.next();\n\n      if (ch == '\"' || ch == \"'\") {\n        state.tokenize = tokenString(ch);\n        return state.tokenize(stream, state);\n      }\n      if (/[\\[\\]{}\\(\\),;\\\\:\\?\\.]/.test(ch)) {\n        curPunc = ch;\n        return \"punctuation\";\n      }\n      if (ch == \"#\"){\n        stream.skipToEnd();\n        return \"atom preprocessor\";\n      }\n      if (ch == \"%\"){\n        stream.eatWhile(/\\b/);\n        return \"atom ttcn3Macros\";\n      }\n      if (/\\d/.test(ch)) {\n        stream.eatWhile(/[\\w\\.]/);\n        return \"number\";\n      }\n      if (ch == \"/\") {\n        if (stream.eat(\"*\")) {\n          state.tokenize = tokenComment;\n          return tokenComment(stream, state);\n        }\n        if (stream.eat(\"/\")) {\n          stream.skipToEnd();\n          return \"comment\";\n        }\n      }\n      if (isOperatorChar.test(ch)) {\n        if(ch == \"@\"){\n          if(stream.match(\"try\") || stream.match(\"catch\")\n              || stream.match(\"lazy\")){\n            return \"keyword\";\n          }\n        }\n        stream.eatWhile(isOperatorChar);\n        return \"operator\";\n      }\n      stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n      var cur = stream.current();\n\n      if (keywords.propertyIsEnumerable(cur)) return \"keyword\";\n      if (builtin.propertyIsEnumerable(cur)) return \"builtin\";\n\n      if (timerOps.propertyIsEnumerable(cur)) return \"def timerOps\";\n      if (configOps.propertyIsEnumerable(cur)) return \"def configOps\";\n      if (verdictOps.propertyIsEnumerable(cur)) return \"def verdictOps\";\n      if (portOps.propertyIsEnumerable(cur)) return \"def portOps\";\n      if (sutOps.propertyIsEnumerable(cur)) return \"def sutOps\";\n      if (functionOps.propertyIsEnumerable(cur)) return \"def functionOps\";\n\n      if (verdictConsts.propertyIsEnumerable(cur)) return \"string verdictConsts\";\n      if (booleanConsts.propertyIsEnumerable(cur)) return \"string booleanConsts\";\n      if (otherConsts.propertyIsEnumerable(cur)) return \"string otherConsts\";\n\n      if (types.propertyIsEnumerable(cur)) return \"builtin types\";\n      if (visibilityModifiers.propertyIsEnumerable(cur))\n        return \"builtin visibilityModifiers\";\n      if (templateMatch.propertyIsEnumerable(cur)) return \"atom templateMatch\";\n\n      return \"variable\";\n    }\n\n    function tokenString(quote) {\n      return function(stream, state) {\n        var escaped = false, next, end = false;\n        while ((next = stream.next()) != null) {\n          if (next == quote && !escaped){\n            var afterQuote = stream.peek();\n            //look if the character after the quote is like the B in '10100010'B\n            if (afterQuote){\n              afterQuote = afterQuote.toLowerCase();\n              if(afterQuote == \"b\" || afterQuote == \"h\" || afterQuote == \"o\")\n                stream.next();\n            }\n            end = true; break;\n          }\n          escaped = !escaped && next == \"\\\\\";\n        }\n        if (end || !(escaped || multiLineStrings))\n          state.tokenize = null;\n        return \"string\";\n      };\n    }\n\n    function tokenComment(stream, state) {\n      var maybeEnd = false, ch;\n      while (ch = stream.next()) {\n        if (ch == \"/\" && maybeEnd) {\n          state.tokenize = null;\n          break;\n        }\n        maybeEnd = (ch == \"*\");\n      }\n      return \"comment\";\n    }\n\n    function Context(indented, column, type, align, prev) {\n      this.indented = indented;\n      this.column = column;\n      this.type = type;\n      this.align = align;\n      this.prev = prev;\n    }\n\n    function pushContext(state, col, type) {\n      var indent = state.indented;\n      if (state.context && state.context.type == \"statement\")\n        indent = state.context.indented;\n      return state.context = new Context(indent, col, type, null, state.context);\n    }\n\n    function popContext(state) {\n      var t = state.context.type;\n      if (t == \")\" || t == \"]\" || t == \"}\")\n        state.indented = state.context.indented;\n      return state.context = state.context.prev;\n    }\n\n    //Interface\n    return {\n      startState: function(basecolumn) {\n        return {\n          tokenize: null,\n          context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n          indented: 0,\n          startOfLine: true\n        };\n      },\n\n      token: function(stream, state) {\n        var ctx = state.context;\n        if (stream.sol()) {\n          if (ctx.align == null) ctx.align = false;\n          state.indented = stream.indentation();\n          state.startOfLine = true;\n        }\n        if (stream.eatSpace()) return null;\n        curPunc = null;\n        var style = (state.tokenize || tokenBase)(stream, state);\n        if (style == \"comment\") return style;\n        if (ctx.align == null) ctx.align = true;\n\n        if ((curPunc == \";\" || curPunc == \":\" || curPunc == \",\")\n            && ctx.type == \"statement\"){\n          popContext(state);\n        }\n        else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n        else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n        else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n        else if (curPunc == \"}\") {\n          while (ctx.type == \"statement\") ctx = popContext(state);\n          if (ctx.type == \"}\") ctx = popContext(state);\n          while (ctx.type == \"statement\") ctx = popContext(state);\n        }\n        else if (curPunc == ctx.type) popContext(state);\n        else if (indentStatements &&\n            (((ctx.type == \"}\" || ctx.type == \"top\") && curPunc != ';') ||\n            (ctx.type == \"statement\" && curPunc == \"newstatement\")))\n          pushContext(state, stream.column(), \"statement\");\n\n        state.startOfLine = false;\n\n        return style;\n      },\n\n      electricChars: \"{}\",\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      lineComment: \"//\",\n      fold: \"brace\"\n    };\n  });\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  function def(mimes, mode) {\n    if (typeof mimes == \"string\") mimes = [mimes];\n    var words = [];\n    function add(obj) {\n      if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))\n        words.push(prop);\n    }\n\n    add(mode.keywords);\n    add(mode.builtin);\n    add(mode.timerOps);\n    add(mode.portOps);\n\n    if (words.length) {\n      mode.helperType = mimes[0];\n      CodeMirror.registerHelper(\"hintWords\", mimes[0], words);\n    }\n\n    for (var i = 0; i < mimes.length; ++i)\n      CodeMirror.defineMIME(mimes[i], mode);\n  }\n\n  def([\"text/x-ttcn\", \"text/x-ttcn3\", \"text/x-ttcnpp\"], {\n    name: \"ttcn\",\n    keywords: words(\"activate address alive all alt altstep and and4b any\" +\n    \" break case component const continue control deactivate\" +\n    \" display do else encode enumerated except exception\" +\n    \" execute extends extension external for from function\" +\n    \" goto group if import in infinity inout interleave\" +\n    \" label language length log match message mixed mod\" +\n    \" modifies module modulepar mtc noblock not not4b nowait\" +\n    \" of on optional or or4b out override param pattern port\" +\n    \" procedure record recursive rem repeat return runs select\" +\n    \" self sender set signature system template testcase to\" +\n    \" type union value valueof var variant while with xor xor4b\"),\n    builtin: words(\"bit2hex bit2int bit2oct bit2str char2int char2oct encvalue\" +\n    \" decomp decvalue float2int float2str hex2bit hex2int\" +\n    \" hex2oct hex2str int2bit int2char int2float int2hex\" +\n    \" int2oct int2str int2unichar isbound ischosen ispresent\" +\n    \" isvalue lengthof log2str oct2bit oct2char oct2hex oct2int\" +\n    \" oct2str regexp replace rnd sizeof str2bit str2float\" +\n    \" str2hex str2int str2oct substr unichar2int unichar2char\" +\n    \" enum2int\"),\n    types: words(\"anytype bitstring boolean char charstring default float\" +\n    \" hexstring integer objid octetstring universal verdicttype timer\"),\n    timerOps: words(\"read running start stop timeout\"),\n    portOps: words(\"call catch check clear getcall getreply halt raise receive\" +\n    \" reply send trigger\"),\n    configOps: words(\"create connect disconnect done kill killed map unmap\"),\n    verdictOps: words(\"getverdict setverdict\"),\n    sutOps: words(\"action\"),\n    functionOps: words(\"apply derefers refers\"),\n\n    verdictConsts: words(\"error fail inconc none pass\"),\n    booleanConsts: words(\"true false\"),\n    otherConsts: words(\"null NULL omit\"),\n\n    visibilityModifiers: words(\"private public friend\"),\n    templateMatch: words(\"complement ifpresent subset superset permutation\"),\n    multiLineStrings: true\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/ttcn-cfg/ttcn-cfg.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"ttcn-cfg\", function(config, parserConfig) {\n    var indentUnit = config.indentUnit,\n        keywords = parserConfig.keywords || {},\n        fileNCtrlMaskOptions = parserConfig.fileNCtrlMaskOptions || {},\n        externalCommands = parserConfig.externalCommands || {},\n        multiLineStrings = parserConfig.multiLineStrings,\n        indentStatements = parserConfig.indentStatements !== false;\n    var isOperatorChar = /[\\|]/;\n    var curPunc;\n\n    function tokenBase(stream, state) {\n      var ch = stream.next();\n      if (ch == '\"' || ch == \"'\") {\n        state.tokenize = tokenString(ch);\n        return state.tokenize(stream, state);\n      }\n      if (/[:=]/.test(ch)) {\n        curPunc = ch;\n        return \"punctuation\";\n      }\n      if (ch == \"#\"){\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      if (/\\d/.test(ch)) {\n        stream.eatWhile(/[\\w\\.]/);\n        return \"number\";\n      }\n      if (isOperatorChar.test(ch)) {\n        stream.eatWhile(isOperatorChar);\n        return \"operator\";\n      }\n      if (ch == \"[\"){\n        stream.eatWhile(/[\\w_\\]]/);\n        return \"number sectionTitle\";\n      }\n\n      stream.eatWhile(/[\\w\\$_]/);\n      var cur = stream.current();\n      if (keywords.propertyIsEnumerable(cur)) return \"keyword\";\n      if (fileNCtrlMaskOptions.propertyIsEnumerable(cur))\n        return \"negative fileNCtrlMaskOptions\";\n      if (externalCommands.propertyIsEnumerable(cur)) return \"negative externalCommands\";\n\n      return \"variable\";\n    }\n\n    function tokenString(quote) {\n      return function(stream, state) {\n        var escaped = false, next, end = false;\n        while ((next = stream.next()) != null) {\n          if (next == quote && !escaped){\n            var afterNext = stream.peek();\n            //look if the character if the quote is like the B in '10100010'B\n            if (afterNext){\n              afterNext = afterNext.toLowerCase();\n              if(afterNext == \"b\" || afterNext == \"h\" || afterNext == \"o\")\n                stream.next();\n            }\n            end = true; break;\n          }\n          escaped = !escaped && next == \"\\\\\";\n        }\n        if (end || !(escaped || multiLineStrings))\n          state.tokenize = null;\n        return \"string\";\n      };\n    }\n\n    function Context(indented, column, type, align, prev) {\n      this.indented = indented;\n      this.column = column;\n      this.type = type;\n      this.align = align;\n      this.prev = prev;\n    }\n    function pushContext(state, col, type) {\n      var indent = state.indented;\n      if (state.context && state.context.type == \"statement\")\n        indent = state.context.indented;\n      return state.context = new Context(indent, col, type, null, state.context);\n    }\n    function popContext(state) {\n      var t = state.context.type;\n      if (t == \")\" || t == \"]\" || t == \"}\")\n        state.indented = state.context.indented;\n      return state.context = state.context.prev;\n    }\n\n    //Interface\n    return {\n      startState: function(basecolumn) {\n        return {\n          tokenize: null,\n          context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n          indented: 0,\n          startOfLine: true\n        };\n      },\n\n      token: function(stream, state) {\n        var ctx = state.context;\n        if (stream.sol()) {\n          if (ctx.align == null) ctx.align = false;\n          state.indented = stream.indentation();\n          state.startOfLine = true;\n        }\n        if (stream.eatSpace()) return null;\n        curPunc = null;\n        var style = (state.tokenize || tokenBase)(stream, state);\n        if (style == \"comment\") return style;\n        if (ctx.align == null) ctx.align = true;\n\n        if ((curPunc == \";\" || curPunc == \":\" || curPunc == \",\")\n            && ctx.type == \"statement\"){\n          popContext(state);\n        }\n        else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n        else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n        else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n        else if (curPunc == \"}\") {\n          while (ctx.type == \"statement\") ctx = popContext(state);\n          if (ctx.type == \"}\") ctx = popContext(state);\n          while (ctx.type == \"statement\") ctx = popContext(state);\n        }\n        else if (curPunc == ctx.type) popContext(state);\n        else if (indentStatements && (((ctx.type == \"}\" || ctx.type == \"top\")\n            && curPunc != ';') || (ctx.type == \"statement\"\n            && curPunc == \"newstatement\")))\n          pushContext(state, stream.column(), \"statement\");\n        state.startOfLine = false;\n        return style;\n      },\n\n      electricChars: \"{}\",\n      lineComment: \"#\",\n      fold: \"brace\"\n    };\n  });\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i)\n      obj[words[i]] = true;\n    return obj;\n  }\n\n  CodeMirror.defineMIME(\"text/x-ttcn-cfg\", {\n    name: \"ttcn-cfg\",\n    keywords: words(\"Yes No LogFile FileMask ConsoleMask AppendFile\" +\n    \" TimeStampFormat LogEventTypes SourceInfoFormat\" +\n    \" LogEntityName LogSourceInfo DiskFullAction\" +\n    \" LogFileNumber LogFileSize MatchingHints Detailed\" +\n    \" Compact SubCategories Stack Single None Seconds\" +\n    \" DateTime Time Stop Error Retry Delete TCPPort KillTimer\" +\n    \" NumHCs UnixSocketsEnabled LocalAddress\"),\n    fileNCtrlMaskOptions: words(\"TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING\" +\n    \" TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP\" +\n    \" TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION\" +\n    \" TTCN_USER TTCN_FUNCTION TTCN_STATISTICS\" +\n    \" TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG\" +\n    \" EXECUTOR ERROR WARNING PORTEVENT TIMEROP\" +\n    \" VERDICTOP DEFAULTOP TESTCASE ACTION USER\" +\n    \" FUNCTION STATISTICS PARALLEL MATCHING DEBUG\" +\n    \" LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED\" +\n    \" DEBUG_ENCDEC DEBUG_TESTPORT\" +\n    \" DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE\" +\n    \" DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT\" +\n    \" DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED\" +\n    \" EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA\" +\n    \" EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS\" +\n    \" EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED\" +\n    \" FUNCTION_RND FUNCTION_UNQUALIFIED\" +\n    \" MATCHING_DONE MATCHING_MCSUCCESS\" +\n    \" MATCHING_MCUNSUCC MATCHING_MMSUCCESS\" +\n    \" MATCHING_MMUNSUCC MATCHING_PCSUCCESS\" +\n    \" MATCHING_PCUNSUCC MATCHING_PMSUCCESS\" +\n    \" MATCHING_PMUNSUCC MATCHING_PROBLEM\" +\n    \" MATCHING_TIMEOUT MATCHING_UNQUALIFIED\" +\n    \" PARALLEL_PORTCONN PARALLEL_PORTMAP\" +\n    \" PARALLEL_PTC PARALLEL_UNQUALIFIED\" +\n    \" PORTEVENT_DUALRECV PORTEVENT_DUALSEND\" +\n    \" PORTEVENT_MCRECV PORTEVENT_MCSEND\" +\n    \" PORTEVENT_MMRECV PORTEVENT_MMSEND\" +\n    \" PORTEVENT_MQUEUE PORTEVENT_PCIN\" +\n    \" PORTEVENT_PCOUT PORTEVENT_PMIN\" +\n    \" PORTEVENT_PMOUT PORTEVENT_PQUEUE\" +\n    \" PORTEVENT_STATE PORTEVENT_UNQUALIFIED\" +\n    \" STATISTICS_UNQUALIFIED STATISTICS_VERDICT\" +\n    \" TESTCASE_FINISH TESTCASE_START\" +\n    \" TESTCASE_UNQUALIFIED TIMEROP_GUARD\" +\n    \" TIMEROP_READ TIMEROP_START TIMEROP_STOP\" +\n    \" TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED\" +\n    \" USER_UNQUALIFIED VERDICTOP_FINAL\" +\n    \" VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT\" +\n    \" VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED\"),\n    externalCommands: words(\"BeginControlPart EndControlPart BeginTestCase\" +\n    \" EndTestCase\"),\n    multiLineStrings: true\n  });\n});"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/turtle/turtle.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"turtle\", function(config) {\n  var indentUnit = config.indentUnit;\n  var curPunc;\n\n  function wordRegexp(words) {\n    return new RegExp(\"^(?:\" + words.join(\"|\") + \")$\", \"i\");\n  }\n  var ops = wordRegexp([]);\n  var keywords = wordRegexp([\"@prefix\", \"@base\", \"a\"]);\n  var operatorChars = /[*+\\-<>=&|]/;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    curPunc = null;\n    if (ch == \"<\" && !stream.match(/^[\\s\\u00a0=]/, false)) {\n      stream.match(/^[^\\s\\u00a0>]*>?/);\n      return \"atom\";\n    }\n    else if (ch == \"\\\"\" || ch == \"'\") {\n      state.tokenize = tokenLiteral(ch);\n      return state.tokenize(stream, state);\n    }\n    else if (/[{}\\(\\),\\.;\\[\\]]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    else if (ch == \"#\") {\n      stream.skipToEnd();\n      return \"comment\";\n    }\n    else if (operatorChars.test(ch)) {\n      stream.eatWhile(operatorChars);\n      return null;\n    }\n    else if (ch == \":\") {\n          return \"operator\";\n        } else {\n      stream.eatWhile(/[_\\w\\d]/);\n      if(stream.peek() == \":\") {\n        return \"variable-3\";\n      } else {\n             var word = stream.current();\n\n             if(keywords.test(word)) {\n                        return \"meta\";\n             }\n\n             if(ch >= \"A\" && ch <= \"Z\") {\n                    return \"comment\";\n                 } else {\n                        return \"keyword\";\n                 }\n      }\n      var word = stream.current();\n      if (ops.test(word))\n        return null;\n      else if (keywords.test(word))\n        return \"meta\";\n      else\n        return \"variable\";\n    }\n  }\n\n  function tokenLiteral(quote) {\n    return function(stream, state) {\n      var escaped = false, ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == quote && !escaped) {\n          state.tokenize = tokenBase;\n          break;\n        }\n        escaped = !escaped && ch == \"\\\\\";\n      }\n      return \"string\";\n    };\n  }\n\n  function pushContext(state, type, col) {\n    state.context = {prev: state.context, indent: state.indent, col: col, type: type};\n  }\n  function popContext(state) {\n    state.indent = state.context.indent;\n    state.context = state.context.prev;\n  }\n\n  return {\n    startState: function() {\n      return {tokenize: tokenBase,\n              context: null,\n              indent: 0,\n              col: 0};\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (state.context && state.context.align == null) state.context.align = false;\n        state.indent = stream.indentation();\n      }\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n\n      if (style != \"comment\" && state.context && state.context.align == null && state.context.type != \"pattern\") {\n        state.context.align = true;\n      }\n\n      if (curPunc == \"(\") pushContext(state, \")\", stream.column());\n      else if (curPunc == \"[\") pushContext(state, \"]\", stream.column());\n      else if (curPunc == \"{\") pushContext(state, \"}\", stream.column());\n      else if (/[\\]\\}\\)]/.test(curPunc)) {\n        while (state.context && state.context.type == \"pattern\") popContext(state);\n        if (state.context && curPunc == state.context.type) popContext(state);\n      }\n      else if (curPunc == \".\" && state.context && state.context.type == \"pattern\") popContext(state);\n      else if (/atom|string|variable/.test(style) && state.context) {\n        if (/[\\}\\]]/.test(state.context.type))\n          pushContext(state, \"pattern\", stream.column());\n        else if (state.context.type == \"pattern\" && !state.context.align) {\n          state.context.align = true;\n          state.context.col = stream.column();\n        }\n      }\n\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      var firstChar = textAfter && textAfter.charAt(0);\n      var context = state.context;\n      if (/[\\]\\}]/.test(firstChar))\n        while (context && context.type == \"pattern\") context = context.prev;\n\n      var closing = context && firstChar == context.type;\n      if (!context)\n        return 0;\n      else if (context.type == \"pattern\")\n        return context.col;\n      else if (context.align)\n        return context.col + (closing ? 0 : 1);\n      else\n        return context.indent + (closing ? 0 : indentUnit);\n    },\n\n    lineComment: \"#\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/turtle\", \"turtle\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/twig/twig.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"),  require(\"../../addon/mode/multiplex\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/multiplex\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"twig:inner\", function() {\n    var keywords = [\"and\", \"as\", \"autoescape\", \"endautoescape\", \"block\", \"do\", \"endblock\", \"else\", \"elseif\", \"extends\", \"for\", \"endfor\", \"embed\", \"endembed\", \"filter\", \"endfilter\", \"flush\", \"from\", \"if\", \"endif\", \"in\", \"is\", \"include\", \"import\", \"not\", \"or\", \"set\", \"spaceless\", \"endspaceless\", \"with\", \"endwith\", \"trans\", \"endtrans\", \"blocktrans\", \"endblocktrans\", \"macro\", \"endmacro\", \"use\", \"verbatim\", \"endverbatim\"],\n        operator = /^[+\\-*&%=<>!?|~^]/,\n        sign = /^[:\\[\\(\\{]/,\n        atom = [\"true\", \"false\", \"null\", \"empty\", \"defined\", \"divisibleby\", \"divisible by\", \"even\", \"odd\", \"iterable\", \"sameas\", \"same as\"],\n        number = /^(\\d[+\\-\\*\\/])?\\d+(\\.\\d+)?/;\n\n    keywords = new RegExp(\"((\" + keywords.join(\")|(\") + \"))\\\\b\");\n    atom = new RegExp(\"((\" + atom.join(\")|(\") + \"))\\\\b\");\n\n    function tokenBase (stream, state) {\n      var ch = stream.peek();\n\n      //Comment\n      if (state.incomment) {\n        if (!stream.skipTo(\"#}\")) {\n          stream.skipToEnd();\n        } else {\n          stream.eatWhile(/\\#|}/);\n          state.incomment = false;\n        }\n        return \"comment\";\n      //Tag\n      } else if (state.intag) {\n        //After operator\n        if (state.operator) {\n          state.operator = false;\n          if (stream.match(atom)) {\n            return \"atom\";\n          }\n          if (stream.match(number)) {\n            return \"number\";\n          }\n        }\n        //After sign\n        if (state.sign) {\n          state.sign = false;\n          if (stream.match(atom)) {\n            return \"atom\";\n          }\n          if (stream.match(number)) {\n            return \"number\";\n          }\n        }\n\n        if (state.instring) {\n          if (ch == state.instring) {\n            state.instring = false;\n          }\n          stream.next();\n          return \"string\";\n        } else if (ch == \"'\" || ch == '\"') {\n          state.instring = ch;\n          stream.next();\n          return \"string\";\n        } else if (stream.match(state.intag + \"}\") || stream.eat(\"-\") && stream.match(state.intag + \"}\")) {\n          state.intag = false;\n          return \"tag\";\n        } else if (stream.match(operator)) {\n          state.operator = true;\n          return \"operator\";\n        } else if (stream.match(sign)) {\n          state.sign = true;\n        } else {\n          if (stream.eat(\" \") || stream.sol()) {\n            if (stream.match(keywords)) {\n              return \"keyword\";\n            }\n            if (stream.match(atom)) {\n              return \"atom\";\n            }\n            if (stream.match(number)) {\n              return \"number\";\n            }\n            if (stream.sol()) {\n              stream.next();\n            }\n          } else {\n            stream.next();\n          }\n\n        }\n        return \"variable\";\n      } else if (stream.eat(\"{\")) {\n        if (stream.eat(\"#\")) {\n          state.incomment = true;\n          if (!stream.skipTo(\"#}\")) {\n            stream.skipToEnd();\n          } else {\n            stream.eatWhile(/\\#|}/);\n            state.incomment = false;\n          }\n          return \"comment\";\n        //Open tag\n        } else if (ch = stream.eat(/\\{|%/)) {\n          //Cache close tag\n          state.intag = ch;\n          if (ch == \"{\") {\n            state.intag = \"}\";\n          }\n          stream.eat(\"-\");\n          return \"tag\";\n        }\n      }\n      stream.next();\n    };\n\n    return {\n      startState: function () {\n        return {};\n      },\n      token: function (stream, state) {\n        return tokenBase(stream, state);\n      }\n    };\n  });\n\n  CodeMirror.defineMode(\"twig\", function(config, parserConfig) {\n    var twigInner = CodeMirror.getMode(config, \"twig:inner\");\n    if (!parserConfig || !parserConfig.base) return twigInner;\n    return CodeMirror.multiplexingMode(\n      CodeMirror.getMode(config, parserConfig.base), {\n        open: /\\{[{#%]/, close: /[}#%]\\}/, mode: twigInner, parseDelimiters: true\n      }\n    );\n  });\n  CodeMirror.defineMIME(\"text/x-twig\", \"twig\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/vb/vb.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"vb\", function(conf, parserConf) {\n    var ERRORCLASS = 'error';\n\n    function wordRegexp(words) {\n        return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\", \"i\");\n    }\n\n    var singleOperators = new RegExp(\"^[\\\\+\\\\-\\\\*/%&\\\\\\\\|\\\\^~<>!]\");\n    var singleDelimiters = new RegExp('^[\\\\(\\\\)\\\\[\\\\]\\\\{\\\\}@,:`=;\\\\.]');\n    var doubleOperators = new RegExp(\"^((==)|(<>)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\\\*\\\\*))\");\n    var doubleDelimiters = new RegExp(\"^((\\\\+=)|(\\\\-=)|(\\\\*=)|(%=)|(/=)|(&=)|(\\\\|=)|(\\\\^=))\");\n    var tripleDelimiters = new RegExp(\"^((//=)|(>>=)|(<<=)|(\\\\*\\\\*=))\");\n    var identifiers = new RegExp(\"^[_A-Za-z][_A-Za-z0-9]*\");\n\n    var openingKeywords = ['class','module', 'sub','enum','select','while','if','function', 'get','set','property', 'try', 'structure', 'synclock', 'using', 'with'];\n    var middleKeywords = ['else','elseif','case', 'catch', 'finally'];\n    var endKeywords = ['next','loop'];\n\n    var operatorKeywords = ['and', \"andalso\", 'or', 'orelse', 'xor', 'in', 'not', 'is', 'isnot', 'like'];\n    var wordOperators = wordRegexp(operatorKeywords);\n\n    var commonKeywords = [\"#const\", \"#else\", \"#elseif\", \"#end\", \"#if\", \"#region\", \"addhandler\", \"addressof\", \"alias\", \"as\", \"byref\", \"byval\", \"cbool\", \"cbyte\", \"cchar\", \"cdate\", \"cdbl\", \"cdec\", \"cint\", \"clng\", \"cobj\", \"compare\", \"const\", \"continue\", \"csbyte\", \"cshort\", \"csng\", \"cstr\", \"cuint\", \"culng\", \"cushort\", \"declare\", \"default\", \"delegate\", \"dim\", \"directcast\", \"each\", \"erase\", \"error\", \"event\", \"exit\", \"explicit\", \"false\", \"for\", \"friend\", \"gettype\", \"goto\", \"handles\", \"implements\", \"imports\", \"infer\", \"inherits\", \"interface\", \"isfalse\", \"istrue\", \"lib\", \"me\", \"mod\", \"mustinherit\", \"mustoverride\", \"my\", \"mybase\", \"myclass\", \"namespace\", \"narrowing\", \"new\", \"nothing\", \"notinheritable\", \"notoverridable\", \"of\", \"off\", \"on\", \"operator\", \"option\", \"optional\", \"out\", \"overloads\", \"overridable\", \"overrides\", \"paramarray\", \"partial\", \"private\", \"protected\", \"public\", \"raiseevent\", \"readonly\", \"redim\", \"removehandler\", \"resume\", \"return\", \"shadows\", \"shared\", \"static\", \"step\", \"stop\", \"strict\", \"then\", \"throw\", \"to\", \"true\", \"trycast\", \"typeof\", \"until\", \"until\", \"when\", \"widening\", \"withevents\", \"writeonly\"];\n\n    var commontypes = ['object', 'boolean', 'char', 'string', 'byte', 'sbyte', 'short', 'ushort', 'int16', 'uint16', 'integer', 'uinteger', 'int32', 'uint32', 'long', 'ulong', 'int64', 'uint64', 'decimal', 'single', 'double', 'float', 'date', 'datetime', 'intptr', 'uintptr'];\n\n    var keywords = wordRegexp(commonKeywords);\n    var types = wordRegexp(commontypes);\n    var stringPrefixes = '\"';\n\n    var opening = wordRegexp(openingKeywords);\n    var middle = wordRegexp(middleKeywords);\n    var closing = wordRegexp(endKeywords);\n    var doubleClosing = wordRegexp(['end']);\n    var doOpening = wordRegexp(['do']);\n\n    var indentInfo = null;\n\n    CodeMirror.registerHelper(\"hintWords\", \"vb\", openingKeywords.concat(middleKeywords).concat(endKeywords)\n                                .concat(operatorKeywords).concat(commonKeywords).concat(commontypes));\n\n    function indent(_stream, state) {\n      state.currentIndent++;\n    }\n\n    function dedent(_stream, state) {\n      state.currentIndent--;\n    }\n    // tokenizers\n    function tokenBase(stream, state) {\n        if (stream.eatSpace()) {\n            return null;\n        }\n\n        var ch = stream.peek();\n\n        // Handle Comments\n        if (ch === \"'\") {\n            stream.skipToEnd();\n            return 'comment';\n        }\n\n\n        // Handle Number Literals\n        if (stream.match(/^((&H)|(&O))?[0-9\\.a-f]/i, false)) {\n            var floatLiteral = false;\n            // Floats\n            if (stream.match(/^\\d*\\.\\d+F?/i)) { floatLiteral = true; }\n            else if (stream.match(/^\\d+\\.\\d*F?/)) { floatLiteral = true; }\n            else if (stream.match(/^\\.\\d+F?/)) { floatLiteral = true; }\n\n            if (floatLiteral) {\n                // Float literals may be \"imaginary\"\n                stream.eat(/J/i);\n                return 'number';\n            }\n            // Integers\n            var intLiteral = false;\n            // Hex\n            if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; }\n            // Octal\n            else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; }\n            // Decimal\n            else if (stream.match(/^[1-9]\\d*F?/)) {\n                // Decimal literals may be \"imaginary\"\n                stream.eat(/J/i);\n                // TODO - Can you have imaginary longs?\n                intLiteral = true;\n            }\n            // Zero by itself with no other piece of number.\n            else if (stream.match(/^0(?![\\dx])/i)) { intLiteral = true; }\n            if (intLiteral) {\n                // Integer literals may be \"long\"\n                stream.eat(/L/i);\n                return 'number';\n            }\n        }\n\n        // Handle Strings\n        if (stream.match(stringPrefixes)) {\n            state.tokenize = tokenStringFactory(stream.current());\n            return state.tokenize(stream, state);\n        }\n\n        // Handle operators and Delimiters\n        if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) {\n            return null;\n        }\n        if (stream.match(doubleOperators)\n            || stream.match(singleOperators)\n            || stream.match(wordOperators)) {\n            return 'operator';\n        }\n        if (stream.match(singleDelimiters)) {\n            return null;\n        }\n        if (stream.match(doOpening)) {\n            indent(stream,state);\n            state.doInCurrentLine = true;\n            return 'keyword';\n        }\n        if (stream.match(opening)) {\n            if (! state.doInCurrentLine)\n              indent(stream,state);\n            else\n              state.doInCurrentLine = false;\n            return 'keyword';\n        }\n        if (stream.match(middle)) {\n            return 'keyword';\n        }\n\n        if (stream.match(doubleClosing)) {\n            dedent(stream,state);\n            dedent(stream,state);\n            return 'keyword';\n        }\n        if (stream.match(closing)) {\n            dedent(stream,state);\n            return 'keyword';\n        }\n\n        if (stream.match(types)) {\n            return 'keyword';\n        }\n\n        if (stream.match(keywords)) {\n            return 'keyword';\n        }\n\n        if (stream.match(identifiers)) {\n            return 'variable';\n        }\n\n        // Handle non-detected items\n        stream.next();\n        return ERRORCLASS;\n    }\n\n    function tokenStringFactory(delimiter) {\n        var singleline = delimiter.length == 1;\n        var OUTCLASS = 'string';\n\n        return function(stream, state) {\n            while (!stream.eol()) {\n                stream.eatWhile(/[^'\"]/);\n                if (stream.match(delimiter)) {\n                    state.tokenize = tokenBase;\n                    return OUTCLASS;\n                } else {\n                    stream.eat(/['\"]/);\n                }\n            }\n            if (singleline) {\n                if (parserConf.singleLineStringErrors) {\n                    return ERRORCLASS;\n                } else {\n                    state.tokenize = tokenBase;\n                }\n            }\n            return OUTCLASS;\n        };\n    }\n\n\n    function tokenLexer(stream, state) {\n        var style = state.tokenize(stream, state);\n        var current = stream.current();\n\n        // Handle '.' connected identifiers\n        if (current === '.') {\n            style = state.tokenize(stream, state);\n            if (style === 'variable') {\n                return 'variable';\n            } else {\n                return ERRORCLASS;\n            }\n        }\n\n\n        var delimiter_index = '[({'.indexOf(current);\n        if (delimiter_index !== -1) {\n            indent(stream, state );\n        }\n        if (indentInfo === 'dedent') {\n            if (dedent(stream, state)) {\n                return ERRORCLASS;\n            }\n        }\n        delimiter_index = '])}'.indexOf(current);\n        if (delimiter_index !== -1) {\n            if (dedent(stream, state)) {\n                return ERRORCLASS;\n            }\n        }\n\n        return style;\n    }\n\n    var external = {\n        electricChars:\"dDpPtTfFeE \",\n        startState: function() {\n            return {\n              tokenize: tokenBase,\n              lastToken: null,\n              currentIndent: 0,\n              nextLineIndent: 0,\n              doInCurrentLine: false\n\n\n          };\n        },\n\n        token: function(stream, state) {\n            if (stream.sol()) {\n              state.currentIndent += state.nextLineIndent;\n              state.nextLineIndent = 0;\n              state.doInCurrentLine = 0;\n            }\n            var style = tokenLexer(stream, state);\n\n            state.lastToken = {style:style, content: stream.current()};\n\n\n\n            return style;\n        },\n\n        indent: function(state, textAfter) {\n            var trueText = textAfter.replace(/^\\s+|\\s+$/g, '') ;\n            if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1);\n            if(state.currentIndent < 0) return 0;\n            return state.currentIndent * conf.indentUnit;\n        },\n\n        lineComment: \"'\"\n    };\n    return external;\n});\n\nCodeMirror.defineMIME(\"text/x-vb\", \"vb\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/vbscript/vbscript.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n/*\nFor extra ASP classic objects, initialize CodeMirror instance with this option:\n    isASP: true\n\nE.G.:\n    var editor = CodeMirror.fromTextArea(document.getElementById(\"code\"), {\n        lineNumbers: true,\n        isASP: true\n      });\n*/\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"vbscript\", function(conf, parserConf) {\n    var ERRORCLASS = 'error';\n\n    function wordRegexp(words) {\n        return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\", \"i\");\n    }\n\n    var singleOperators = new RegExp(\"^[\\\\+\\\\-\\\\*/&\\\\\\\\\\\\^<>=]\");\n    var doubleOperators = new RegExp(\"^((<>)|(<=)|(>=))\");\n    var singleDelimiters = new RegExp('^[\\\\.,]');\n    var brackets = new RegExp('^[\\\\(\\\\)]');\n    var identifiers = new RegExp(\"^[A-Za-z][_A-Za-z0-9]*\");\n\n    var openingKeywords = ['class','sub','select','while','if','function', 'property', 'with', 'for'];\n    var middleKeywords = ['else','elseif','case'];\n    var endKeywords = ['next','loop','wend'];\n\n    var wordOperators = wordRegexp(['and', 'or', 'not', 'xor', 'is', 'mod', 'eqv', 'imp']);\n    var commonkeywords = ['dim', 'redim', 'then',  'until', 'randomize',\n                          'byval','byref','new','property', 'exit', 'in',\n                          'const','private', 'public',\n                          'get','set','let', 'stop', 'on error resume next', 'on error goto 0', 'option explicit', 'call', 'me'];\n\n    //This list was from: http://msdn.microsoft.com/en-us/library/f8tbc79x(v=vs.84).aspx\n    var atomWords = ['true', 'false', 'nothing', 'empty', 'null'];\n    //This list was from: http://msdn.microsoft.com/en-us/library/3ca8tfek(v=vs.84).aspx\n    var builtinFuncsWords = ['abs', 'array', 'asc', 'atn', 'cbool', 'cbyte', 'ccur', 'cdate', 'cdbl', 'chr', 'cint', 'clng', 'cos', 'csng', 'cstr', 'date', 'dateadd', 'datediff', 'datepart',\n                        'dateserial', 'datevalue', 'day', 'escape', 'eval', 'execute', 'exp', 'filter', 'formatcurrency', 'formatdatetime', 'formatnumber', 'formatpercent', 'getlocale', 'getobject',\n                        'getref', 'hex', 'hour', 'inputbox', 'instr', 'instrrev', 'int', 'fix', 'isarray', 'isdate', 'isempty', 'isnull', 'isnumeric', 'isobject', 'join', 'lbound', 'lcase', 'left',\n                        'len', 'loadpicture', 'log', 'ltrim', 'rtrim', 'trim', 'maths', 'mid', 'minute', 'month', 'monthname', 'msgbox', 'now', 'oct', 'replace', 'rgb', 'right', 'rnd', 'round',\n                        'scriptengine', 'scriptenginebuildversion', 'scriptenginemajorversion', 'scriptengineminorversion', 'second', 'setlocale', 'sgn', 'sin', 'space', 'split', 'sqr', 'strcomp',\n                        'string', 'strreverse', 'tan', 'time', 'timer', 'timeserial', 'timevalue', 'typename', 'ubound', 'ucase', 'unescape', 'vartype', 'weekday', 'weekdayname', 'year'];\n\n    //This list was from: http://msdn.microsoft.com/en-us/library/ydz4cfk3(v=vs.84).aspx\n    var builtinConsts = ['vbBlack', 'vbRed', 'vbGreen', 'vbYellow', 'vbBlue', 'vbMagenta', 'vbCyan', 'vbWhite', 'vbBinaryCompare', 'vbTextCompare',\n                         'vbSunday', 'vbMonday', 'vbTuesday', 'vbWednesday', 'vbThursday', 'vbFriday', 'vbSaturday', 'vbUseSystemDayOfWeek', 'vbFirstJan1', 'vbFirstFourDays', 'vbFirstFullWeek',\n                         'vbGeneralDate', 'vbLongDate', 'vbShortDate', 'vbLongTime', 'vbShortTime', 'vbObjectError',\n                         'vbOKOnly', 'vbOKCancel', 'vbAbortRetryIgnore', 'vbYesNoCancel', 'vbYesNo', 'vbRetryCancel', 'vbCritical', 'vbQuestion', 'vbExclamation', 'vbInformation', 'vbDefaultButton1', 'vbDefaultButton2',\n                         'vbDefaultButton3', 'vbDefaultButton4', 'vbApplicationModal', 'vbSystemModal', 'vbOK', 'vbCancel', 'vbAbort', 'vbRetry', 'vbIgnore', 'vbYes', 'vbNo',\n                         'vbCr', 'VbCrLf', 'vbFormFeed', 'vbLf', 'vbNewLine', 'vbNullChar', 'vbNullString', 'vbTab', 'vbVerticalTab', 'vbUseDefault', 'vbTrue', 'vbFalse',\n                         'vbEmpty', 'vbNull', 'vbInteger', 'vbLong', 'vbSingle', 'vbDouble', 'vbCurrency', 'vbDate', 'vbString', 'vbObject', 'vbError', 'vbBoolean', 'vbVariant', 'vbDataObject', 'vbDecimal', 'vbByte', 'vbArray'];\n    //This list was from: http://msdn.microsoft.com/en-us/library/hkc375ea(v=vs.84).aspx\n    var builtinObjsWords = ['WScript', 'err', 'debug', 'RegExp'];\n    var knownProperties = ['description', 'firstindex', 'global', 'helpcontext', 'helpfile', 'ignorecase', 'length', 'number', 'pattern', 'source', 'value', 'count'];\n    var knownMethods = ['clear', 'execute', 'raise', 'replace', 'test', 'write', 'writeline', 'close', 'open', 'state', 'eof', 'update', 'addnew', 'end', 'createobject', 'quit'];\n\n    var aspBuiltinObjsWords = ['server', 'response', 'request', 'session', 'application'];\n    var aspKnownProperties = ['buffer', 'cachecontrol', 'charset', 'contenttype', 'expires', 'expiresabsolute', 'isclientconnected', 'pics', 'status', //response\n                              'clientcertificate', 'cookies', 'form', 'querystring', 'servervariables', 'totalbytes', //request\n                              'contents', 'staticobjects', //application\n                              'codepage', 'lcid', 'sessionid', 'timeout', //session\n                              'scripttimeout']; //server\n    var aspKnownMethods = ['addheader', 'appendtolog', 'binarywrite', 'end', 'flush', 'redirect', //response\n                           'binaryread', //request\n                           'remove', 'removeall', 'lock', 'unlock', //application\n                           'abandon', //session\n                           'getlasterror', 'htmlencode', 'mappath', 'transfer', 'urlencode']; //server\n\n    var knownWords = knownMethods.concat(knownProperties);\n\n    builtinObjsWords = builtinObjsWords.concat(builtinConsts);\n\n    if (conf.isASP){\n        builtinObjsWords = builtinObjsWords.concat(aspBuiltinObjsWords);\n        knownWords = knownWords.concat(aspKnownMethods, aspKnownProperties);\n    };\n\n    var keywords = wordRegexp(commonkeywords);\n    var atoms = wordRegexp(atomWords);\n    var builtinFuncs = wordRegexp(builtinFuncsWords);\n    var builtinObjs = wordRegexp(builtinObjsWords);\n    var known = wordRegexp(knownWords);\n    var stringPrefixes = '\"';\n\n    var opening = wordRegexp(openingKeywords);\n    var middle = wordRegexp(middleKeywords);\n    var closing = wordRegexp(endKeywords);\n    var doubleClosing = wordRegexp(['end']);\n    var doOpening = wordRegexp(['do']);\n    var noIndentWords = wordRegexp(['on error resume next', 'exit']);\n    var comment = wordRegexp(['rem']);\n\n\n    function indent(_stream, state) {\n      state.currentIndent++;\n    }\n\n    function dedent(_stream, state) {\n      state.currentIndent--;\n    }\n    // tokenizers\n    function tokenBase(stream, state) {\n        if (stream.eatSpace()) {\n            return 'space';\n            //return null;\n        }\n\n        var ch = stream.peek();\n\n        // Handle Comments\n        if (ch === \"'\") {\n            stream.skipToEnd();\n            return 'comment';\n        }\n        if (stream.match(comment)){\n            stream.skipToEnd();\n            return 'comment';\n        }\n\n\n        // Handle Number Literals\n        if (stream.match(/^((&H)|(&O))?[0-9\\.]/i, false) && !stream.match(/^((&H)|(&O))?[0-9\\.]+[a-z_]/i, false)) {\n            var floatLiteral = false;\n            // Floats\n            if (stream.match(/^\\d*\\.\\d+/i)) { floatLiteral = true; }\n            else if (stream.match(/^\\d+\\.\\d*/)) { floatLiteral = true; }\n            else if (stream.match(/^\\.\\d+/)) { floatLiteral = true; }\n\n            if (floatLiteral) {\n                // Float literals may be \"imaginary\"\n                stream.eat(/J/i);\n                return 'number';\n            }\n            // Integers\n            var intLiteral = false;\n            // Hex\n            if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; }\n            // Octal\n            else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; }\n            // Decimal\n            else if (stream.match(/^[1-9]\\d*F?/)) {\n                // Decimal literals may be \"imaginary\"\n                stream.eat(/J/i);\n                // TODO - Can you have imaginary longs?\n                intLiteral = true;\n            }\n            // Zero by itself with no other piece of number.\n            else if (stream.match(/^0(?![\\dx])/i)) { intLiteral = true; }\n            if (intLiteral) {\n                // Integer literals may be \"long\"\n                stream.eat(/L/i);\n                return 'number';\n            }\n        }\n\n        // Handle Strings\n        if (stream.match(stringPrefixes)) {\n            state.tokenize = tokenStringFactory(stream.current());\n            return state.tokenize(stream, state);\n        }\n\n        // Handle operators and Delimiters\n        if (stream.match(doubleOperators)\n            || stream.match(singleOperators)\n            || stream.match(wordOperators)) {\n            return 'operator';\n        }\n        if (stream.match(singleDelimiters)) {\n            return null;\n        }\n\n        if (stream.match(brackets)) {\n            return \"bracket\";\n        }\n\n        if (stream.match(noIndentWords)) {\n            state.doInCurrentLine = true;\n\n            return 'keyword';\n        }\n\n        if (stream.match(doOpening)) {\n            indent(stream,state);\n            state.doInCurrentLine = true;\n\n            return 'keyword';\n        }\n        if (stream.match(opening)) {\n            if (! state.doInCurrentLine)\n              indent(stream,state);\n            else\n              state.doInCurrentLine = false;\n\n            return 'keyword';\n        }\n        if (stream.match(middle)) {\n            return 'keyword';\n        }\n\n\n        if (stream.match(doubleClosing)) {\n            dedent(stream,state);\n            dedent(stream,state);\n\n            return 'keyword';\n        }\n        if (stream.match(closing)) {\n            if (! state.doInCurrentLine)\n              dedent(stream,state);\n            else\n              state.doInCurrentLine = false;\n\n            return 'keyword';\n        }\n\n        if (stream.match(keywords)) {\n            return 'keyword';\n        }\n\n        if (stream.match(atoms)) {\n            return 'atom';\n        }\n\n        if (stream.match(known)) {\n            return 'variable-2';\n        }\n\n        if (stream.match(builtinFuncs)) {\n            return 'builtin';\n        }\n\n        if (stream.match(builtinObjs)){\n            return 'variable-2';\n        }\n\n        if (stream.match(identifiers)) {\n            return 'variable';\n        }\n\n        // Handle non-detected items\n        stream.next();\n        return ERRORCLASS;\n    }\n\n    function tokenStringFactory(delimiter) {\n        var singleline = delimiter.length == 1;\n        var OUTCLASS = 'string';\n\n        return function(stream, state) {\n            while (!stream.eol()) {\n                stream.eatWhile(/[^'\"]/);\n                if (stream.match(delimiter)) {\n                    state.tokenize = tokenBase;\n                    return OUTCLASS;\n                } else {\n                    stream.eat(/['\"]/);\n                }\n            }\n            if (singleline) {\n                if (parserConf.singleLineStringErrors) {\n                    return ERRORCLASS;\n                } else {\n                    state.tokenize = tokenBase;\n                }\n            }\n            return OUTCLASS;\n        };\n    }\n\n\n    function tokenLexer(stream, state) {\n        var style = state.tokenize(stream, state);\n        var current = stream.current();\n\n        // Handle '.' connected identifiers\n        if (current === '.') {\n            style = state.tokenize(stream, state);\n\n            current = stream.current();\n            if (style && (style.substr(0, 8) === 'variable' || style==='builtin' || style==='keyword')){//|| knownWords.indexOf(current.substring(1)) > -1) {\n                if (style === 'builtin' || style === 'keyword') style='variable';\n                if (knownWords.indexOf(current.substr(1)) > -1) style='variable-2';\n\n                return style;\n            } else {\n                return ERRORCLASS;\n            }\n        }\n\n        return style;\n    }\n\n    var external = {\n        electricChars:\"dDpPtTfFeE \",\n        startState: function() {\n            return {\n              tokenize: tokenBase,\n              lastToken: null,\n              currentIndent: 0,\n              nextLineIndent: 0,\n              doInCurrentLine: false,\n              ignoreKeyword: false\n\n\n          };\n        },\n\n        token: function(stream, state) {\n            if (stream.sol()) {\n              state.currentIndent += state.nextLineIndent;\n              state.nextLineIndent = 0;\n              state.doInCurrentLine = 0;\n            }\n            var style = tokenLexer(stream, state);\n\n            state.lastToken = {style:style, content: stream.current()};\n\n            if (style==='space') style=null;\n\n            return style;\n        },\n\n        indent: function(state, textAfter) {\n            var trueText = textAfter.replace(/^\\s+|\\s+$/g, '') ;\n            if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1);\n            if(state.currentIndent < 0) return 0;\n            return state.currentIndent * conf.indentUnit;\n        }\n\n    };\n    return external;\n});\n\nCodeMirror.defineMIME(\"text/vbscript\", \"vbscript\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/velocity/velocity.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"velocity\", function() {\n    function parseWords(str) {\n        var obj = {}, words = str.split(\" \");\n        for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n        return obj;\n    }\n\n    var keywords = parseWords(\"#end #else #break #stop #[[ #]] \" +\n                              \"#{end} #{else} #{break} #{stop}\");\n    var functions = parseWords(\"#if #elseif #foreach #set #include #parse #macro #define #evaluate \" +\n                               \"#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}\");\n    var specials = parseWords(\"$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent\");\n    var isOperatorChar = /[+\\-*&%=<>!?:\\/|]/;\n\n    function chain(stream, state, f) {\n        state.tokenize = f;\n        return f(stream, state);\n    }\n    function tokenBase(stream, state) {\n        var beforeParams = state.beforeParams;\n        state.beforeParams = false;\n        var ch = stream.next();\n        // start of unparsed string?\n        if ((ch == \"'\") && !state.inString && state.inParams) {\n            state.lastTokenWasBuiltin = false;\n            return chain(stream, state, tokenString(ch));\n        }\n        // start of parsed string?\n        else if ((ch == '\"')) {\n            state.lastTokenWasBuiltin = false;\n            if (state.inString) {\n                state.inString = false;\n                return \"string\";\n            }\n            else if (state.inParams)\n                return chain(stream, state, tokenString(ch));\n        }\n        // is it one of the special signs []{}().,;? Separator?\n        else if (/[\\[\\]{}\\(\\),;\\.]/.test(ch)) {\n            if (ch == \"(\" && beforeParams)\n                state.inParams = true;\n            else if (ch == \")\") {\n                state.inParams = false;\n                state.lastTokenWasBuiltin = true;\n            }\n            return null;\n        }\n        // start of a number value?\n        else if (/\\d/.test(ch)) {\n            state.lastTokenWasBuiltin = false;\n            stream.eatWhile(/[\\w\\.]/);\n            return \"number\";\n        }\n        // multi line comment?\n        else if (ch == \"#\" && stream.eat(\"*\")) {\n            state.lastTokenWasBuiltin = false;\n            return chain(stream, state, tokenComment);\n        }\n        // unparsed content?\n        else if (ch == \"#\" && stream.match(/ *\\[ *\\[/)) {\n            state.lastTokenWasBuiltin = false;\n            return chain(stream, state, tokenUnparsed);\n        }\n        // single line comment?\n        else if (ch == \"#\" && stream.eat(\"#\")) {\n            state.lastTokenWasBuiltin = false;\n            stream.skipToEnd();\n            return \"comment\";\n        }\n        // variable?\n        else if (ch == \"$\") {\n            stream.eat(\"!\");\n            stream.eatWhile(/[\\w\\d\\$_\\.{}-]/);\n            // is it one of the specials?\n            if (specials && specials.propertyIsEnumerable(stream.current())) {\n                return \"keyword\";\n            }\n            else {\n                state.lastTokenWasBuiltin = true;\n                state.beforeParams = true;\n                return \"builtin\";\n            }\n        }\n        // is it a operator?\n        else if (isOperatorChar.test(ch)) {\n            state.lastTokenWasBuiltin = false;\n            stream.eatWhile(isOperatorChar);\n            return \"operator\";\n        }\n        else {\n            // get the whole word\n            stream.eatWhile(/[\\w\\$_{}@]/);\n            var word = stream.current();\n            // is it one of the listed keywords?\n            if (keywords && keywords.propertyIsEnumerable(word))\n                return \"keyword\";\n            // is it one of the listed functions?\n            if (functions && functions.propertyIsEnumerable(word) ||\n                    (stream.current().match(/^#@?[a-z0-9_]+ *$/i) && stream.peek()==\"(\") &&\n                     !(functions && functions.propertyIsEnumerable(word.toLowerCase()))) {\n                state.beforeParams = true;\n                state.lastTokenWasBuiltin = false;\n                return \"keyword\";\n            }\n            if (state.inString) {\n                state.lastTokenWasBuiltin = false;\n                return \"string\";\n            }\n            if (stream.pos > word.length && stream.string.charAt(stream.pos-word.length-1)==\".\" && state.lastTokenWasBuiltin)\n                return \"builtin\";\n            // default: just a \"word\"\n            state.lastTokenWasBuiltin = false;\n            return null;\n        }\n    }\n\n    function tokenString(quote) {\n        return function(stream, state) {\n            var escaped = false, next, end = false;\n            while ((next = stream.next()) != null) {\n                if ((next == quote) && !escaped) {\n                    end = true;\n                    break;\n                }\n                if (quote=='\"' && stream.peek() == '$' && !escaped) {\n                    state.inString = true;\n                    end = true;\n                    break;\n                }\n                escaped = !escaped && next == \"\\\\\";\n            }\n            if (end) state.tokenize = tokenBase;\n            return \"string\";\n        };\n    }\n\n    function tokenComment(stream, state) {\n        var maybeEnd = false, ch;\n        while (ch = stream.next()) {\n            if (ch == \"#\" && maybeEnd) {\n                state.tokenize = tokenBase;\n                break;\n            }\n            maybeEnd = (ch == \"*\");\n        }\n        return \"comment\";\n    }\n\n    function tokenUnparsed(stream, state) {\n        var maybeEnd = 0, ch;\n        while (ch = stream.next()) {\n            if (ch == \"#\" && maybeEnd == 2) {\n                state.tokenize = tokenBase;\n                break;\n            }\n            if (ch == \"]\")\n                maybeEnd++;\n            else if (ch != \" \")\n                maybeEnd = 0;\n        }\n        return \"meta\";\n    }\n    // Interface\n\n    return {\n        startState: function() {\n            return {\n                tokenize: tokenBase,\n                beforeParams: false,\n                inParams: false,\n                inString: false,\n                lastTokenWasBuiltin: false\n            };\n        },\n\n        token: function(stream, state) {\n            if (stream.eatSpace()) return null;\n            return state.tokenize(stream, state);\n        },\n        blockCommentStart: \"#*\",\n        blockCommentEnd: \"*#\",\n        lineComment: \"##\",\n        fold: \"velocity\"\n    };\n});\n\nCodeMirror.defineMIME(\"text/velocity\", \"velocity\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/verilog/verilog.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"verilog\", function(config, parserConfig) {\n\n  var indentUnit = config.indentUnit,\n      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,\n      dontAlignCalls = parserConfig.dontAlignCalls,\n      // compilerDirectivesUseRegularIndentation - If set, Compiler directive\n      // indentation follows the same rules as everything else. Otherwise if\n      // false, compiler directives will track their own indentation.\n      // For example, `ifdef nested inside another `ifndef will be indented,\n      // but a `ifdef inside a function block may not be indented.\n      compilerDirectivesUseRegularIndentation = parserConfig.compilerDirectivesUseRegularIndentation,\n      noIndentKeywords = parserConfig.noIndentKeywords || [],\n      multiLineStrings = parserConfig.multiLineStrings,\n      hooks = parserConfig.hooks || {};\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  /**\n   * Keywords from IEEE 1800-2012\n   */\n  var keywords = words(\n    \"accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind \" +\n    \"bins binsof bit break buf bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config \" +\n    \"const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable \" +\n    \"dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup \" +\n    \"endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask \" +\n    \"enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin \" +\n    \"function generate genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import \" +\n    \"incdir include initial inout input inside instance int integer interconnect interface intersect join join_any \" +\n    \"join_none large let liblist library local localparam logic longint macromodule matches medium modport module \" +\n    \"nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 null or output package packed \" +\n    \"parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup \" +\n    \"pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg \" +\n    \"reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime \" +\n    \"s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify \" +\n    \"specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on \" +\n    \"table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior \" +\n    \"trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void \" +\n    \"wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor\");\n\n  /** Operators from IEEE 1800-2012\n     unary_operator ::=\n       + | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~\n     binary_operator ::=\n       + | - | * | / | % | == | != | === | !== | ==? | !=? | && | || | **\n       | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<<\n       | -> | <->\n     inc_or_dec_operator ::= ++ | --\n     unary_module_path_operator ::=\n       ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~\n     binary_module_path_operator ::=\n       == | != | && | || | & | | | ^ | ^~ | ~^\n  */\n  var isOperatorChar = /[\\+\\-\\*\\/!~&|^%=?:<>]/;\n  var isBracketChar = /[\\[\\]{}()]/;\n\n  var unsignedNumber = /\\d[0-9_]*/;\n  var decimalLiteral = /\\d*\\s*'s?d\\s*\\d[0-9_]*/i;\n  var binaryLiteral = /\\d*\\s*'s?b\\s*[xz01][xz01_]*/i;\n  var octLiteral = /\\d*\\s*'s?o\\s*[xz0-7][xz0-7_]*/i;\n  var hexLiteral = /\\d*\\s*'s?h\\s*[0-9a-fxz?][0-9a-fxz?_]*/i;\n  var realLiteral = /(\\d[\\d_]*(\\.\\d[\\d_]*)?E-?[\\d_]+)|(\\d[\\d_]*\\.\\d[\\d_]*)/i;\n\n  var closingBracketOrWord = /^((`?\\w+)|[)}\\]])/;\n  var closingBracket = /[)}\\]]/;\n  var compilerDirectiveRegex      = new RegExp(\n    \"^(`(?:ifdef|ifndef|elsif|else|endif|undef|undefineall|define|include|begin_keywords|celldefine|default|\" +\n    \"nettype|end_keywords|endcelldefine|line|nounconnected_drive|pragma|resetall|timescale|unconnected_drive))\\\\b\");\n  var compilerDirectiveBeginRegex = /^(`(?:ifdef|ifndef|elsif|else))\\b/;\n  var compilerDirectiveEndRegex   = /^(`(?:elsif|else|endif))\\b/;\n\n  var curPunc;\n  var curKeyword;\n\n  // Block openings which are closed by a matching keyword in the form of (\"end\" + keyword)\n  // E.g. \"task\" => \"endtask\"\n  var blockKeywords = words(\n    \"case checker class clocking config function generate interface module package \" +\n    \"primitive program property specify sequence table task\"\n  );\n\n  // Opening/closing pairs\n  var openClose = {};\n  for (var keyword in blockKeywords) {\n    openClose[keyword] = \"end\" + keyword;\n  }\n  openClose[\"begin\"] = \"end\";\n  openClose[\"casex\"] = \"endcase\";\n  openClose[\"casez\"] = \"endcase\";\n  openClose[\"do\"   ] = \"while\";\n  openClose[\"fork\" ] = \"join;join_any;join_none\";\n  openClose[\"covergroup\"] = \"endgroup\";\n  openClose[\"macro_begin\"] = \"macro_end\";\n\n  for (var i in noIndentKeywords) {\n    var keyword = noIndentKeywords[i];\n    if (openClose[keyword]) {\n      openClose[keyword] = undefined;\n    }\n  }\n\n  // Keywords which open statements that are ended with a semi-colon\n  var statementKeywords = words(\"always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while extern typedef\");\n\n  function tokenBase(stream, state) {\n    var ch = stream.peek(), style;\n    if (hooks[ch] && (style = hooks[ch](stream, state)) != false) return style;\n    if (hooks.tokenBase && (style = hooks.tokenBase(stream, state)) != false)\n      return style;\n\n    if (/[,;:\\.]/.test(ch)) {\n      curPunc = stream.next();\n      return null;\n    }\n    if (isBracketChar.test(ch)) {\n      curPunc = stream.next();\n      return \"bracket\";\n    }\n    // Macros (tick-defines)\n    if (ch == '`') {\n      stream.next();\n      if (stream.eatWhile(/[\\w\\$_]/)) {\n        var cur = stream.current();\n        curKeyword = cur;\n        // Macros that end in _begin, are start of block and end with _end\n        if (cur.startsWith(\"`uvm_\") && cur.endsWith(\"_begin\")) {\n          var keywordClose = curKeyword.substr(0,curKeyword.length - 5) + \"end\";\n          openClose[cur] = keywordClose;\n          curPunc = \"newblock\";\n        } else {\n          stream.eatSpace();\n          if (stream.peek() == '(') {\n            // Check if this is a block\n            curPunc = \"newmacro\";\n          }\n          var withSpace = stream.current();\n          // Move the stream back before the spaces\n          stream.backUp(withSpace.length - cur.length);\n        }\n        return \"def\";\n      } else {\n        return null;\n      }\n    }\n    // System calls\n    if (ch == '$') {\n      stream.next();\n      if (stream.eatWhile(/[\\w\\$_]/)) {\n        return \"meta\";\n      } else {\n        return null;\n      }\n    }\n    // Time literals\n    if (ch == '#') {\n      stream.next();\n      stream.eatWhile(/[\\d_.]/);\n      return \"def\";\n    }\n    // Event\n    if (ch == '@') {\n      stream.next();\n      stream.eatWhile(/[@]/);\n      return \"def\";\n    }\n    // Strings\n    if (ch == '\"') {\n      stream.next();\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    // Comments\n    if (ch == \"/\") {\n      stream.next();\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      stream.backUp(1);\n    }\n\n    // Numeric literals\n    if (stream.match(realLiteral) ||\n        stream.match(decimalLiteral) ||\n        stream.match(binaryLiteral) ||\n        stream.match(octLiteral) ||\n        stream.match(hexLiteral) ||\n        stream.match(unsignedNumber) ||\n        stream.match(realLiteral)) {\n      return \"number\";\n    }\n\n    // Operators\n    if (stream.eatWhile(isOperatorChar)) {\n      curPunc = stream.current();\n      return \"meta\";\n    }\n\n    // Keywords / plain variables\n    if (stream.eatWhile(/[\\w\\$_]/)) {\n      var cur = stream.current();\n      if (keywords[cur]) {\n        if (openClose[cur]) {\n          curPunc = \"newblock\";\n          if (cur === \"fork\") {\n            // Fork can be a statement instead of block in cases of:\n            // \"disable fork;\" and \"wait fork;\" (trailing semicolon)\n            stream.eatSpace()\n            if (stream.peek() == ';') {\n              curPunc = \"newstatement\";\n            }\n            stream.backUp(stream.current().length - cur.length);\n          }\n        }\n        if (statementKeywords[cur]) {\n          curPunc = \"newstatement\";\n        }\n        curKeyword = cur;\n        return \"keyword\";\n      }\n      return \"variable\";\n    }\n\n    stream.next();\n    return null;\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function Context(indented, column, type, scopekind, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.scopekind = scopekind;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type, scopekind) {\n    var indent = state.indented;\n    var c = new Context(indent, col, type, scopekind ? scopekind : \"\", null, state.context);\n    return state.context = c;\n  }\n  function popContext(state) {\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\") {\n      state.indented = state.context.indented;\n    }\n    return state.context = state.context.prev;\n  }\n\n  function isClosing(text, contextClosing) {\n    if (text == contextClosing) {\n      return true;\n    } else {\n      // contextClosing may be multiple keywords separated by ;\n      var closingKeywords = contextClosing.split(\";\");\n      for (var i in closingKeywords) {\n        if (text == closingKeywords[i]) {\n          return true;\n        }\n      }\n      return false;\n    }\n  }\n\n  function isInsideScopeKind(ctx, scopekind) {\n    if (ctx == null) {\n      return false;\n    }\n    if (ctx.scopekind === scopekind) {\n      return true;\n    }\n    return isInsideScopeKind(ctx.prev, scopekind);\n  }\n\n  function buildElectricInputRegEx() {\n    // Reindentation should occur on any bracket char: {}()[]\n    // or on a match of any of the block closing keywords, at\n    // the end of a line\n    var allClosings = [];\n    for (var i in openClose) {\n      if (openClose[i]) {\n        var closings = openClose[i].split(\";\");\n        for (var j in closings) {\n          allClosings.push(closings[j]);\n        }\n      }\n    }\n    var re = new RegExp(\"[{}()\\\\[\\\\]]|(\" + allClosings.join(\"|\") + \")$\");\n    return re;\n  }\n\n  // Interface\n  return {\n\n    // Regex to force current line to reindent\n    electricInput: buildElectricInputRegEx(),\n\n    startState: function(basecolumn) {\n      var state = {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", \"top\", false),\n        indented: 0,\n        compilerDirectiveIndented: 0,\n        startOfLine: true\n      };\n      if (hooks.startState) hooks.startState(state);\n      return state;\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n      }\n      if (hooks.token) {\n        // Call hook, with an optional return value of a style to override verilog styling.\n        var style = hooks.token(stream, state);\n        if (style !== undefined) {\n          return style;\n        }\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      curKeyword = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\" || style == \"variable\") {\n        if (((curPunc === \"=\") || (curPunc === \"<=\")) && !isInsideScopeKind(ctx, \"assignment\")) {\n          // '<=' could be nonblocking assignment or lessthan-equals (which shouldn't cause indent)\n          //      Search through the context to see if we are already in an assignment.\n          // '=' could be inside port declaration with comma or ')' afterward, or inside for(;;) block.\n          pushContext(state, stream.column() + curPunc.length, \"assignment\", \"assignment\");\n          if (ctx.align == null) ctx.align = true;\n        }\n        return style;\n      }\n      if (ctx.align == null) ctx.align = true;\n\n      var isClosingAssignment = ctx.type == \"assignment\" &&\n        closingBracket.test(curPunc) && ctx.prev && ctx.prev.type === curPunc;\n      if (curPunc == ctx.type || isClosingAssignment) {\n        if (isClosingAssignment) {\n          ctx = popContext(state);\n        }\n        ctx = popContext(state);\n        if (curPunc == \")\") {\n          // Handle closing macros, assuming they could have a semicolon or begin/end block inside.\n          if (ctx && (ctx.type === \"macro\")) {\n            ctx = popContext(state);\n            while (ctx && (ctx.type == \"statement\" || ctx.type == \"assignment\")) ctx = popContext(state);\n          }\n        } else if (curPunc == \"}\") {\n          // Handle closing statements like constraint block: \"foreach () {}\" which\n          // do not have semicolon at end.\n          if (ctx && (ctx.type === \"statement\")) {\n            while (ctx && (ctx.type == \"statement\")) ctx = popContext(state);\n          }\n        }\n      } else if (((curPunc == \";\" || curPunc == \",\") && (ctx.type == \"statement\" || ctx.type == \"assignment\")) ||\n               (ctx.type && isClosing(curKeyword, ctx.type))) {\n        ctx = popContext(state);\n        while (ctx && (ctx.type == \"statement\" || ctx.type == \"assignment\")) ctx = popContext(state);\n      } else if (curPunc == \"{\") {\n        pushContext(state, stream.column(), \"}\");\n      } else if (curPunc == \"[\") {\n        pushContext(state, stream.column(), \"]\");\n      } else if (curPunc == \"(\") {\n        pushContext(state, stream.column(), \")\");\n      } else if (ctx && ctx.type == \"endcase\" && curPunc == \":\") {\n        pushContext(state, stream.column(), \"statement\", \"case\");\n      } else if (curPunc == \"newstatement\") {\n        pushContext(state, stream.column(), \"statement\", curKeyword);\n      } else if (curPunc == \"newblock\") {\n        if (curKeyword == \"function\" && ctx && (ctx.type == \"statement\" || ctx.type == \"endgroup\")) {\n          // The 'function' keyword can appear in some other contexts where it actually does not\n          // indicate a function (import/export DPI and covergroup definitions).\n          // Do nothing in this case\n        } else if (curKeyword == \"task\" && ctx && ctx.type == \"statement\") {\n          // Same thing for task\n        } else if (curKeyword == \"class\" && ctx && ctx.type == \"statement\") {\n          // Same thing for class (e.g. typedef)\n        } else {\n          var close = openClose[curKeyword];\n          pushContext(state, stream.column(), close, curKeyword);\n        }\n      } else if (curPunc == \"newmacro\" || (curKeyword && curKeyword.match(compilerDirectiveRegex))) {\n        if (curPunc == \"newmacro\") {\n          // Macros (especially if they have parenthesis) potentially have a semicolon\n          // or complete statement/block inside, and should be treated as such.\n          pushContext(state, stream.column(), \"macro\", \"macro\");\n        }\n        if (curKeyword.match(compilerDirectiveEndRegex)) {\n          state.compilerDirectiveIndented -= statementIndentUnit;\n        }\n        if (curKeyword.match(compilerDirectiveBeginRegex)) {\n          state.compilerDirectiveIndented += statementIndentUnit;\n        }\n      }\n\n      state.startOfLine = false;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;\n      if (hooks.indent) {\n        var fromHook = hooks.indent(state);\n        if (fromHook >= 0) return fromHook;\n      }\n      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n      if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n      var closing = false;\n      var possibleClosing = textAfter.match(closingBracketOrWord);\n      if (possibleClosing)\n        closing = isClosing(possibleClosing[0], ctx.type);\n      if (!compilerDirectivesUseRegularIndentation && textAfter.match(compilerDirectiveRegex)) {\n        if (textAfter.match(compilerDirectiveEndRegex)) {\n          return state.compilerDirectiveIndented - statementIndentUnit;\n        }\n        return state.compilerDirectiveIndented;\n      }\n      if (ctx.type == \"statement\") return ctx.indented + (firstChar == \"{\" ? 0 : statementIndentUnit);\n      else if ((closingBracket.test(ctx.type) || ctx.type == \"assignment\")\n        && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1);\n      else if (ctx.type == \")\" && !closing) return ctx.indented + statementIndentUnit;\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\",\n    fold: \"indent\"\n  };\n});\n\n  CodeMirror.defineMIME(\"text/x-verilog\", {\n    name: \"verilog\"\n  });\n\n  CodeMirror.defineMIME(\"text/x-systemverilog\", {\n    name: \"verilog\"\n  });\n\n\n\n  // TL-Verilog mode.\n  // See tl-x.org for language spec.\n  // See the mode in action at makerchip.com.\n  // Contact: steve.hoover@redwoodeda.com\n\n  // TLV Identifier prefixes.\n  // Note that sign is not treated separately, so \"+/-\" versions of numeric identifiers\n  // are included.\n  var tlvIdentifierStyle = {\n    \"|\": \"link\",\n    \">\": \"property\",  // Should condition this off for > TLV 1c.\n    \"$\": \"variable\",\n    \"$$\": \"variable\",\n    \"?$\": \"qualifier\",\n    \"?*\": \"qualifier\",\n    \"-\": \"hr\",\n    \"/\": \"property\",\n    \"/-\": \"property\",\n    \"@\": \"variable-3\",\n    \"@-\": \"variable-3\",\n    \"@++\": \"variable-3\",\n    \"@+=\": \"variable-3\",\n    \"@+=-\": \"variable-3\",\n    \"@--\": \"variable-3\",\n    \"@-=\": \"variable-3\",\n    \"%+\": \"tag\",\n    \"%-\": \"tag\",\n    \"%\": \"tag\",\n    \">>\": \"tag\",\n    \"<<\": \"tag\",\n    \"<>\": \"tag\",\n    \"#\": \"tag\",  // Need to choose a style for this.\n    \"^\": \"attribute\",\n    \"^^\": \"attribute\",\n    \"^!\": \"attribute\",\n    \"*\": \"variable-2\",\n    \"**\": \"variable-2\",\n    \"\\\\\": \"keyword\",\n    \"\\\"\": \"comment\"\n  };\n\n  // Lines starting with these characters define scope (result in indentation).\n  var tlvScopePrefixChars = {\n    \"/\": \"beh-hier\",\n    \">\": \"beh-hier\",\n    \"-\": \"phys-hier\",\n    \"|\": \"pipe\",\n    \"?\": \"when\",\n    \"@\": \"stage\",\n    \"\\\\\": \"keyword\"\n  };\n  var tlvIndentUnit = 3;\n  var tlvTrackStatements = false;\n  var tlvIdentMatch = /^([~!@#\\$%\\^&\\*-\\+=\\?\\/\\\\\\|'\"<>]+)([\\d\\w_]*)/;  // Matches an identifier.\n  // Note that ':' is excluded, because of it's use in [:].\n  var tlvFirstLevelIndentMatch = /^[! ]  /;\n  var tlvLineIndentationMatch = /^[! ] */;\n  var tlvCommentMatch = /^\\/[\\/\\*]/;\n\n\n  // Returns a style specific to the scope at the given indentation column.\n  // Type is one of: \"indent\", \"scope-ident\", \"before-scope-ident\".\n  function tlvScopeStyle(state, indentation, type) {\n    // Begin scope.\n    var depth = indentation / tlvIndentUnit;  // TODO: Pass this in instead.\n    return \"tlv-\" + state.tlvIndentationStyle[depth] + \"-\" + type;\n  }\n\n  // Return true if the next thing in the stream is an identifier with a mnemonic.\n  function tlvIdentNext(stream) {\n    var match;\n    return (match = stream.match(tlvIdentMatch, false)) && match[2].length > 0;\n  }\n\n  CodeMirror.defineMIME(\"text/x-tlv\", {\n    name: \"verilog\",\n\n    hooks: {\n\n      electricInput: false,\n\n\n      // Return undefined for verilog tokenizing, or style for TLV token (null not used).\n      // Standard CM styles are used for most formatting, but some TL-Verilog-specific highlighting\n      // can be enabled with the definition of cm-tlv-* styles, including highlighting for:\n      //   - M4 tokens\n      //   - TLV scope indentation\n      //   - Statement delimitation (enabled by tlvTrackStatements)\n      token: function(stream, state) {\n        var style = undefined;\n        var match;  // Return value of pattern matches.\n\n        // Set highlighting mode based on code region (TLV or SV).\n        if (stream.sol() && ! state.tlvInBlockComment) {\n          // Process region.\n          if (stream.peek() == '\\\\') {\n            style = \"def\";\n            stream.skipToEnd();\n            if (stream.string.match(/\\\\SV/)) {\n              state.tlvCodeActive = false;\n            } else if (stream.string.match(/\\\\TLV/)){\n              state.tlvCodeActive = true;\n            }\n          }\n          // Correct indentation in the face of a line prefix char.\n          if (state.tlvCodeActive && stream.pos == 0 &&\n              (state.indented == 0) && (match = stream.match(tlvLineIndentationMatch, false))) {\n            state.indented = match[0].length;\n          }\n\n          // Compute indentation state:\n          //   o Auto indentation on next line\n          //   o Indentation scope styles\n          var indented = state.indented;\n          var depth = indented / tlvIndentUnit;\n          if (depth <= state.tlvIndentationStyle.length) {\n            // not deeper than current scope\n\n            var blankline = stream.string.length == indented;\n            var chPos = depth * tlvIndentUnit;\n            if (chPos < stream.string.length) {\n              var bodyString = stream.string.slice(chPos);\n              var ch = bodyString[0];\n              if (tlvScopePrefixChars[ch] && ((match = bodyString.match(tlvIdentMatch)) &&\n                  tlvIdentifierStyle[match[1]])) {\n                // This line begins scope.\n                // Next line gets indented one level.\n                indented += tlvIndentUnit;\n                // Style the next level of indentation (except non-region keyword identifiers,\n                //   which are statements themselves)\n                if (!(ch == \"\\\\\" && chPos > 0)) {\n                  state.tlvIndentationStyle[depth] = tlvScopePrefixChars[ch];\n                  if (tlvTrackStatements) {state.statementComment = false;}\n                  depth++;\n                }\n              }\n            }\n            // Clear out deeper indentation levels unless line is blank.\n            if (!blankline) {\n              while (state.tlvIndentationStyle.length > depth) {\n                state.tlvIndentationStyle.pop();\n              }\n            }\n          }\n          // Set next level of indentation.\n          state.tlvNextIndent = indented;\n        }\n\n        if (state.tlvCodeActive) {\n          // Highlight as TLV.\n\n          var beginStatement = false;\n          if (tlvTrackStatements) {\n            // This starts a statement if the position is at the scope level\n            // and we're not within a statement leading comment.\n            beginStatement =\n                   (stream.peek() != \" \") &&   // not a space\n                   (style === undefined) &&    // not a region identifier\n                   !state.tlvInBlockComment && // not in block comment\n                   //!stream.match(tlvCommentMatch, false) && // not comment start\n                   (stream.column() == state.tlvIndentationStyle.length * tlvIndentUnit);  // at scope level\n            if (beginStatement) {\n              if (state.statementComment) {\n                // statement already started by comment\n                beginStatement = false;\n              }\n              state.statementComment =\n                   stream.match(tlvCommentMatch, false); // comment start\n            }\n          }\n\n          var match;\n          if (style !== undefined) {\n            // Region line.\n            style += \" \" + tlvScopeStyle(state, 0, \"scope-ident\")\n          } else if (((stream.pos / tlvIndentUnit) < state.tlvIndentationStyle.length) &&\n                     (match = stream.match(stream.sol() ? tlvFirstLevelIndentMatch : /^   /))) {\n            // Indentation\n            style = // make this style distinct from the previous one to prevent\n                    // codemirror from combining spans\n                    \"tlv-indent-\" + (((stream.pos % 2) == 0) ? \"even\" : \"odd\") +\n                    // and style it\n                    \" \" + tlvScopeStyle(state, stream.pos - tlvIndentUnit, \"indent\");\n            // Style the line prefix character.\n            if (match[0].charAt(0) == \"!\") {\n              style += \" tlv-alert-line-prefix\";\n            }\n            // Place a class before a scope identifier.\n            if (tlvIdentNext(stream)) {\n              style += \" \" + tlvScopeStyle(state, stream.pos, \"before-scope-ident\");\n            }\n          } else if (state.tlvInBlockComment) {\n            // In a block comment.\n            if (stream.match(/^.*?\\*\\//)) {\n              // Exit block comment.\n              state.tlvInBlockComment = false;\n              if (tlvTrackStatements && !stream.eol()) {\n                // Anything after comment is assumed to be real statement content.\n                state.statementComment = false;\n              }\n            } else {\n              stream.skipToEnd();\n            }\n            style = \"comment\";\n          } else if ((match = stream.match(tlvCommentMatch)) && !state.tlvInBlockComment) {\n            // Start comment.\n            if (match[0] == \"//\") {\n              // Line comment.\n              stream.skipToEnd();\n            } else {\n              // Block comment.\n              state.tlvInBlockComment = true;\n            }\n            style = \"comment\";\n          } else if (match = stream.match(tlvIdentMatch)) {\n            // looks like an identifier (or identifier prefix)\n            var prefix = match[1];\n            var mnemonic = match[2];\n            if (// is identifier prefix\n                tlvIdentifierStyle.hasOwnProperty(prefix) &&\n                // has mnemonic or we're at the end of the line (maybe it hasn't been typed yet)\n                (mnemonic.length > 0 || stream.eol())) {\n              style = tlvIdentifierStyle[prefix];\n              if (stream.column() == state.indented) {\n                // Begin scope.\n                style += \" \" + tlvScopeStyle(state, stream.column(), \"scope-ident\")\n              }\n            } else {\n              // Just swallow one character and try again.\n              // This enables subsequent identifier match with preceding symbol character, which\n              //   is legal within a statement.  (E.g., !$reset).  It also enables detection of\n              //   comment start with preceding symbols.\n              stream.backUp(stream.current().length - 1);\n              style = \"tlv-default\";\n            }\n          } else if (stream.match(/^\\t+/)) {\n            // Highlight tabs, which are illegal.\n            style = \"tlv-tab\";\n          } else if (stream.match(/^[\\[\\]{}\\(\\);\\:]+/)) {\n            // [:], (), {}, ;.\n            style = \"meta\";\n          } else if (match = stream.match(/^[mM]4([\\+_])?[\\w\\d_]*/)) {\n            // m4 pre proc\n            style = (match[1] == \"+\") ? \"tlv-m4-plus\" : \"tlv-m4\";\n          } else if (stream.match(/^ +/)){\n            // Skip over spaces.\n            if (stream.eol()) {\n              // Trailing spaces.\n              style = \"error\";\n            } else {\n              // Non-trailing spaces.\n              style = \"tlv-default\";\n            }\n          } else if (stream.match(/^[\\w\\d_]+/)) {\n            // alpha-numeric token.\n            style = \"number\";\n          } else {\n            // Eat the next char w/ no formatting.\n            stream.next();\n            style = \"tlv-default\";\n          }\n          if (beginStatement) {\n            style += \" tlv-statement\";\n          }\n        } else {\n          if (stream.match(/^[mM]4([\\w\\d_]*)/)) {\n            // m4 pre proc\n            style = \"tlv-m4\";\n          }\n        }\n        return style;\n      },\n\n      indent: function(state) {\n        return (state.tlvCodeActive == true) ? state.tlvNextIndent : -1;\n      },\n\n      startState: function(state) {\n        state.tlvIndentationStyle = [];  // Styles to use for each level of indentation.\n        state.tlvCodeActive = true;  // True when we're in a TLV region (and at beginning of file).\n        state.tlvNextIndent = -1;    // The number of spaces to autoindent the next line if tlvCodeActive.\n        state.tlvInBlockComment = false;  // True inside /**/ comment.\n        if (tlvTrackStatements) {\n          state.statementComment = false;  // True inside a statement's header comment.\n        }\n      }\n\n    }\n  });\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/vhdl/vhdl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Originally written by Alf Nielsen, re-written by Michael Zhou\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction words(str) {\n  var obj = {}, words = str.split(\",\");\n  for (var i = 0; i < words.length; ++i) {\n    var allCaps = words[i].toUpperCase();\n    var firstCap = words[i].charAt(0).toUpperCase() + words[i].slice(1);\n    obj[words[i]] = true;\n    obj[allCaps] = true;\n    obj[firstCap] = true;\n  }\n  return obj;\n}\n\nfunction metaHook(stream) {\n  stream.eatWhile(/[\\w\\$_]/);\n  return \"meta\";\n}\n\nCodeMirror.defineMode(\"vhdl\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit,\n      atoms = parserConfig.atoms || words(\"null\"),\n      hooks = parserConfig.hooks || {\"`\": metaHook, \"$\": metaHook},\n      multiLineStrings = parserConfig.multiLineStrings;\n\n  var keywords = words(\"abs,access,after,alias,all,and,architecture,array,assert,attribute,begin,block,\" +\n      \"body,buffer,bus,case,component,configuration,constant,disconnect,downto,else,elsif,end,end block,end case,\" +\n      \"end component,end for,end generate,end if,end loop,end process,end record,end units,entity,exit,file,for,\" +\n      \"function,generate,generic,generic map,group,guarded,if,impure,in,inertial,inout,is,label,library,linkage,\" +\n      \"literal,loop,map,mod,nand,new,next,nor,null,of,on,open,or,others,out,package,package body,port,port map,\" +\n      \"postponed,procedure,process,pure,range,record,register,reject,rem,report,return,rol,ror,select,severity,signal,\" +\n      \"sla,sll,sra,srl,subtype,then,to,transport,type,unaffected,units,until,use,variable,wait,when,while,with,xnor,xor\");\n\n  var blockKeywords = words(\"architecture,entity,begin,case,port,else,elsif,end,for,function,if\");\n\n  var isOperatorChar = /[&|~><!\\)\\(*#%@+\\/=?\\:;}{,\\.\\^\\-\\[\\]]/;\n  var curPunc;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (hooks[ch]) {\n      var result = hooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n    if (ch == '\"') {\n      state.tokenize = tokenString2(ch);\n      return state.tokenize(stream, state);\n    }\n    if (ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (/[\\d']/.test(ch)) {\n      stream.eatWhile(/[\\w\\.']/);\n      return \"number\";\n    }\n    if (ch == \"-\") {\n      if (stream.eat(\"-\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return \"operator\";\n    }\n    stream.eatWhile(/[\\w\\$_]/);\n    var cur = stream.current();\n    if (keywords.propertyIsEnumerable(cur.toLowerCase())) {\n      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = \"newstatement\";\n      return \"keyword\";\n    }\n    if (atoms.propertyIsEnumerable(cur)) return \"atom\";\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"--\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = tokenBase;\n      return \"string\";\n    };\n  }\n  function tokenString2(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"--\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = tokenBase;\n      return \"string-2\";\n    };\n  }\n\n  function Context(indented, column, type, align, prev) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.align = align;\n    this.prev = prev;\n  }\n  function pushContext(state, col, type) {\n    return state.context = new Context(state.indented, col, type, null, state.context);\n  }\n  function popContext(state) {\n    var t = state.context.type;\n    if (t == \")\" || t == \"]\" || t == \"}\")\n      state.indented = state.context.indented;\n    return state.context = state.context.prev;\n  }\n\n  // Interface\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", false),\n        indented: 0,\n        startOfLine: true\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n      }\n      if (stream.eatSpace()) return null;\n      curPunc = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if ((curPunc == \";\" || curPunc == \":\") && ctx.type == \"statement\") popContext(state);\n      else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"}\") {\n        while (ctx.type == \"statement\") ctx = popContext(state);\n        if (ctx.type == \"}\") ctx = popContext(state);\n        while (ctx.type == \"statement\") ctx = popContext(state);\n      }\n      else if (curPunc == ctx.type) popContext(state);\n      else if (ctx.type == \"}\" || ctx.type == \"top\" || (ctx.type == \"statement\" && curPunc == \"newstatement\"))\n        pushContext(state, stream.column(), \"statement\");\n      state.startOfLine = false;\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), ctx = state.context, closing = firstChar == ctx.type;\n      if (ctx.type == \"statement\") return ctx.indented + (firstChar == \"{\" ? 0 : indentUnit);\n      else if (ctx.align) return ctx.column + (closing ? 0 : 1);\n      else return ctx.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \"{}\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-vhdl\", \"vhdl\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/vue/vue.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function (mod) {\n  \"use strict\";\n  if (typeof exports === \"object\" && typeof module === \"object\") {// CommonJS\n    mod(require(\"../../lib/codemirror\"),\n        require(\"../../addon/mode/overlay\"),\n        require(\"../xml/xml\"),\n        require(\"../javascript/javascript\"),\n        require(\"../coffeescript/coffeescript\"),\n        require(\"../css/css\"),\n        require(\"../sass/sass\"),\n        require(\"../stylus/stylus\"),\n        require(\"../pug/pug\"),\n        require(\"../handlebars/handlebars\"));\n  } else if (typeof define === \"function\" && define.amd) { // AMD\n    define([\"../../lib/codemirror\",\n            \"../../addon/mode/overlay\",\n            \"../xml/xml\",\n            \"../javascript/javascript\",\n            \"../coffeescript/coffeescript\",\n            \"../css/css\",\n            \"../sass/sass\",\n            \"../stylus/stylus\",\n            \"../pug/pug\",\n            \"../handlebars/handlebars\"], mod);\n  } else { // Plain browser env\n    mod(CodeMirror);\n  }\n})(function (CodeMirror) {\n  var tagLanguages = {\n    script: [\n      [\"lang\", /coffee(script)?/, \"coffeescript\"],\n      [\"type\", /^(?:text|application)\\/(?:x-)?coffee(?:script)?$/, \"coffeescript\"],\n      [\"lang\", /^babel$/, \"javascript\"],\n      [\"type\", /^text\\/babel$/, \"javascript\"],\n      [\"type\", /^text\\/ecmascript-\\d+$/, \"javascript\"]\n    ],\n    style: [\n      [\"lang\", /^stylus$/i, \"stylus\"],\n      [\"lang\", /^sass$/i, \"sass\"],\n      [\"lang\", /^less$/i, \"text/x-less\"],\n      [\"lang\", /^scss$/i, \"text/x-scss\"],\n      [\"type\", /^(text\\/)?(x-)?styl(us)?$/i, \"stylus\"],\n      [\"type\", /^text\\/sass/i, \"sass\"],\n      [\"type\", /^(text\\/)?(x-)?scss$/i, \"text/x-scss\"],\n      [\"type\", /^(text\\/)?(x-)?less$/i, \"text/x-less\"]\n    ],\n    template: [\n      [\"lang\", /^vue-template$/i, \"vue\"],\n      [\"lang\", /^pug$/i, \"pug\"],\n      [\"lang\", /^handlebars$/i, \"handlebars\"],\n      [\"type\", /^(text\\/)?(x-)?pug$/i, \"pug\"],\n      [\"type\", /^text\\/x-handlebars-template$/i, \"handlebars\"],\n      [null, null, \"vue-template\"]\n    ]\n  };\n\n  CodeMirror.defineMode(\"vue-template\", function (config, parserConfig) {\n    var mustacheOverlay = {\n      token: function (stream) {\n        if (stream.match(/^\\{\\{.*?\\}\\}/)) return \"meta mustache\";\n        while (stream.next() && !stream.match(\"{{\", false)) {}\n        return null;\n      }\n    };\n    return CodeMirror.overlayMode(CodeMirror.getMode(config, parserConfig.backdrop || \"text/html\"), mustacheOverlay);\n  });\n\n  CodeMirror.defineMode(\"vue\", function (config) {\n    return CodeMirror.getMode(config, {name: \"htmlmixed\", tags: tagLanguages});\n  }, \"htmlmixed\", \"xml\", \"javascript\", \"coffeescript\", \"css\", \"sass\", \"stylus\", \"pug\", \"handlebars\");\n\n  CodeMirror.defineMIME(\"script/x-vue\", \"vue\");\n  CodeMirror.defineMIME(\"text/x-vue\", \"vue\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/wast/wast.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../../addon/mode/simple\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../../addon/mode/simple\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar kKeywords = [\n    \"align\",\n    \"block\",\n    \"br(_if|_table|_on_(cast|data|func|i31|null))?\",\n    \"call(_indirect|_ref)?\",\n    \"current_memory\",\n    \"\\\\bdata\\\\b\",\n    \"catch(_all)?\",\n    \"delegate\",\n    \"drop\",\n    \"elem\",\n    \"else\",\n    \"end\",\n    \"export\",\n    \"\\\\bextern\\\\b\",\n    \"\\\\bfunc\\\\b\",\n    \"global(\\\\.(get|set))?\",\n    \"if\",\n    \"import\",\n    \"local(\\\\.(get|set|tee))?\",\n    \"loop\",\n    \"module\",\n    \"mut\",\n    \"nop\",\n    \"offset\",\n    \"param\",\n    \"result\",\n    \"rethrow\",\n    \"return(_call(_indirect|_ref)?)?\",\n    \"select\",\n    \"start\",\n    \"table(\\\\.(size|get|set|size|grow|fill|init|copy))?\",\n    \"then\",\n    \"throw\",\n    \"try\",\n    \"type\",\n    \"unreachable\",\n    \"unwind\",\n\n    // Numeric opcodes.\n    \"i(32|64)\\\\.(store(8|16)|(load(8|16)_[su]))\",\n    \"i64\\\\.(load32_[su]|store32)\",\n    \"[fi](32|64)\\\\.(const|load|store)\",\n    \"f(32|64)\\\\.(abs|add|ceil|copysign|div|eq|floor|[gl][et]|max|min|mul|nearest|neg?|sqrt|sub|trunc)\",\n    \"i(32|64)\\\\.(a[dn]d|c[lt]z|(div|rem)_[su]|eqz?|[gl][te]_[su]|mul|ne|popcnt|rot[lr]|sh(l|r_[su])|sub|x?or)\",\n    \"i64\\\\.extend_[su]_i32\",\n    \"i32\\\\.wrap_i64\",\n    \"i(32|64)\\\\.trunc_f(32|64)_[su]\",\n    \"f(32|64)\\\\.convert_i(32|64)_[su]\",\n    \"f64\\\\.promote_f32\",\n    \"f32\\\\.demote_f64\",\n    \"f32\\\\.reinterpret_i32\",\n    \"i32\\\\.reinterpret_f32\",\n    \"f64\\\\.reinterpret_i64\",\n    \"i64\\\\.reinterpret_f64\",\n    // Atomics.\n    \"memory(\\\\.((atomic\\\\.(notify|wait(32|64)))|grow|size))?\",\n    \"i64\\.atomic\\\\.(load32_u|store32|rmw32\\\\.(a[dn]d|sub|x?or|(cmp)?xchg)_u)\",\n    \"i(32|64)\\\\.atomic\\\\.(load((8|16)_u)?|store(8|16)?|rmw(\\\\.(a[dn]d|sub|x?or|(cmp)?xchg)|(8|16)\\\\.(a[dn]d|sub|x?or|(cmp)?xchg)_u))\",\n    // SIMD.\n    \"v128\\\\.load(8x8|16x4|32x2)_[su]\",\n    \"v128\\\\.load(8|16|32|64)_splat\",\n    \"v128\\\\.(load|store)(8|16|32|64)_lane\",\n    \"v128\\\\.load(32|64)_zero\",\n    \"v128\\.(load|store|const|not|andnot|and|or|xor|bitselect|any_true)\",\n    \"i(8x16|16x8)\\\\.(extract_lane_[su]|(add|sub)_sat_[su]|avgr_u)\",\n    \"i(8x16|16x8|32x4|64x2)\\\\.(neg|add|sub|abs|shl|shr_[su]|all_true|bitmask|eq|ne|[lg][te]_s)\",\n    \"(i(8x16|16x8|32x4|64x2)|f(32x4|64x2))\\.(splat|replace_lane)\",\n    \"i(8x16|16x8|32x4)\\\\.(([lg][te]_u)|((min|max)_[su]))\",\n    \"f(32x4|64x2)\\\\.(neg|add|sub|abs|nearest|eq|ne|[lg][te]|sqrt|mul|div|min|max|ceil|floor|trunc)\",\n    \"[fi](32x4|64x2)\\\\.extract_lane\",\n    \"i8x16\\\\.(shuffle|swizzle|popcnt|narrow_i16x8_[su])\",\n    \"i16x8\\\\.(narrow_i32x4_[su]|mul|extadd_pairwise_i8x16_[su]|q15mulr_sat_s)\",\n    \"i16x8\\\\.(extend|extmul)_(low|high)_i8x16_[su]\",\n    \"i32x4\\\\.(mul|dot_i16x8_s|trunc_sat_f64x2_[su]_zero)\",\n    \"i32x4\\\\.((extend|extmul)_(low|high)_i16x8_|trunc_sat_f32x4_|extadd_pairwise_i16x8_)[su]\",\n    \"i64x2\\\\.(mul|(extend|extmul)_(low|high)_i32x4_[su])\",\n    \"f32x4\\\\.(convert_i32x4_[su]|demote_f64x2_zero)\",\n    \"f64x2\\\\.(promote_low_f32x4|convert_low_i32x4_[su])\",\n    // Reference types, function references, and GC.\n    \"\\\\bany\\\\b\",\n    \"array\\\\.len\",\n    \"(array|struct)(\\\\.(new_(default_)?with_rtt|get(_[su])?|set))?\",\n    \"\\\\beq\\\\b\",\n    \"field\",\n    \"i31\\\\.(new|get_[su])\",\n    \"\\\\bnull\\\\b\",\n    \"ref(\\\\.(([ai]s_(data|func|i31))|cast|eq|func|(is_|as_non_)?null|test))?\",\n    \"rtt(\\\\.(canon|sub))?\",\n];\n\nCodeMirror.defineSimpleMode('wast', {\n  start: [\n    {regex: /[+\\-]?(?:nan(?::0x[0-9a-fA-F]+)?|infinity|inf|0x[0-9a-fA-F]+\\.?[0-9a-fA-F]*p[+\\/-]?\\d+|\\d+(?:\\.\\d*)?[eE][+\\-]?\\d*|\\d+\\.\\d*|0x[0-9a-fA-F]+|\\d+)/, token: \"number\"},\n    {regex: new RegExp(kKeywords.join('|')), token: \"keyword\"},\n    {regex: /\\b((any|data|eq|extern|i31|func)ref|[fi](32|64)|i(8|16))\\b/, token: \"atom\"},\n    {regex: /\\$([a-zA-Z0-9_`\\+\\-\\*\\/\\\\\\^~=<>!\\?@#$%&|:\\.]+)/, token: \"variable-2\"},\n    {regex: /\"(?:[^\"\\\\\\x00-\\x1f\\x7f]|\\\\[nt\\\\'\"]|\\\\[0-9a-fA-F][0-9a-fA-F])*\"/, token: \"string\"},\n    {regex: /\\(;.*?/, token: \"comment\", next: \"comment\"},\n    {regex: /;;.*$/, token: \"comment\"},\n    {regex: /\\(/, indent: true},\n    {regex: /\\)/, dedent: true},\n  ],\n\n  comment: [\n    {regex: /.*?;\\)/, token: \"comment\", next: \"start\"},\n    {regex: /.*/, token: \"comment\"},\n  ],\n\n  meta: {\n    dontIndentStates: ['comment'],\n  },\n});\n\n// https://github.com/WebAssembly/design/issues/981 mentions text/webassembly,\n// which seems like a reasonable choice, although it's not standard right now.\nCodeMirror.defineMIME(\"text/webassembly\", \"wast\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/webidl/webidl.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction wordRegexp(words) {\n  return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n};\n\nvar builtinArray = [\n  \"Clamp\",\n  \"Constructor\",\n  \"EnforceRange\",\n  \"Exposed\",\n  \"ImplicitThis\",\n  \"Global\", \"PrimaryGlobal\",\n  \"LegacyArrayClass\",\n  \"LegacyUnenumerableNamedProperties\",\n  \"LenientThis\",\n  \"NamedConstructor\",\n  \"NewObject\",\n  \"NoInterfaceObject\",\n  \"OverrideBuiltins\",\n  \"PutForwards\",\n  \"Replaceable\",\n  \"SameObject\",\n  \"TreatNonObjectAsNull\",\n  \"TreatNullAs\",\n    \"EmptyString\",\n  \"Unforgeable\",\n  \"Unscopeable\"\n];\nvar builtins = wordRegexp(builtinArray);\n\nvar typeArray = [\n  \"unsigned\", \"short\", \"long\",                  // UnsignedIntegerType\n  \"unrestricted\", \"float\", \"double\",            // UnrestrictedFloatType\n  \"boolean\", \"byte\", \"octet\",                   // Rest of PrimitiveType\n  \"Promise\",                                    // PromiseType\n  \"ArrayBuffer\", \"DataView\", \"Int8Array\", \"Int16Array\", \"Int32Array\",\n  \"Uint8Array\", \"Uint16Array\", \"Uint32Array\", \"Uint8ClampedArray\",\n  \"Float32Array\", \"Float64Array\",               // BufferRelatedType\n  \"ByteString\", \"DOMString\", \"USVString\", \"sequence\", \"object\", \"RegExp\",\n  \"Error\", \"DOMException\", \"FrozenArray\",       // Rest of NonAnyType\n  \"any\",                                        // Rest of SingleType\n  \"void\"                                        // Rest of ReturnType\n];\nvar types = wordRegexp(typeArray);\n\nvar keywordArray = [\n  \"attribute\", \"callback\", \"const\", \"deleter\", \"dictionary\", \"enum\", \"getter\",\n  \"implements\", \"inherit\", \"interface\", \"iterable\", \"legacycaller\", \"maplike\",\n  \"partial\", \"required\", \"serializer\", \"setlike\", \"setter\", \"static\",\n  \"stringifier\", \"typedef\",                     // ArgumentNameKeyword except\n                                                // \"unrestricted\"\n  \"optional\", \"readonly\", \"or\"\n];\nvar keywords = wordRegexp(keywordArray);\n\nvar atomArray = [\n  \"true\", \"false\",                              // BooleanLiteral\n  \"Infinity\", \"NaN\",                            // FloatLiteral\n  \"null\"                                        // Rest of ConstValue\n];\nvar atoms = wordRegexp(atomArray);\n\nCodeMirror.registerHelper(\"hintWords\", \"webidl\",\n    builtinArray.concat(typeArray).concat(keywordArray).concat(atomArray));\n\nvar startDefArray = [\"callback\", \"dictionary\", \"enum\", \"interface\"];\nvar startDefs = wordRegexp(startDefArray);\n\nvar endDefArray = [\"typedef\"];\nvar endDefs = wordRegexp(endDefArray);\n\nvar singleOperators = /^[:<=>?]/;\nvar integers = /^-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/;\nvar floats = /^-?(([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/;\nvar identifiers = /^_?[A-Za-z][0-9A-Z_a-z-]*/;\nvar identifiersEnd = /^_?[A-Za-z][0-9A-Z_a-z-]*(?=\\s*;)/;\nvar strings = /^\"[^\"]*\"/;\nvar multilineComments = /^\\/\\*.*?\\*\\//;\nvar multilineCommentsStart = /^\\/\\*.*/;\nvar multilineCommentsEnd = /^.*?\\*\\//;\n\nfunction readToken(stream, state) {\n  // whitespace\n  if (stream.eatSpace()) return null;\n\n  // comment\n  if (state.inComment) {\n    if (stream.match(multilineCommentsEnd)) {\n      state.inComment = false;\n      return \"comment\";\n    }\n    stream.skipToEnd();\n    return \"comment\";\n  }\n  if (stream.match(\"//\")) {\n    stream.skipToEnd();\n    return \"comment\";\n  }\n  if (stream.match(multilineComments)) return \"comment\";\n  if (stream.match(multilineCommentsStart)) {\n    state.inComment = true;\n    return \"comment\";\n  }\n\n  // integer and float\n  if (stream.match(/^-?[0-9\\.]/, false)) {\n    if (stream.match(integers) || stream.match(floats)) return \"number\";\n  }\n\n  // string\n  if (stream.match(strings)) return \"string\";\n\n  // identifier\n  if (state.startDef && stream.match(identifiers)) return \"def\";\n\n  if (state.endDef && stream.match(identifiersEnd)) {\n    state.endDef = false;\n    return \"def\";\n  }\n\n  if (stream.match(keywords)) return \"keyword\";\n\n  if (stream.match(types)) {\n    var lastToken = state.lastToken;\n    var nextToken = (stream.match(/^\\s*(.+?)\\b/, false) || [])[1];\n\n    if (lastToken === \":\" || lastToken === \"implements\" ||\n        nextToken === \"implements\" || nextToken === \"=\") {\n      // Used as identifier\n      return \"builtin\";\n    } else {\n      // Used as type\n      return \"variable-3\";\n    }\n  }\n\n  if (stream.match(builtins)) return \"builtin\";\n  if (stream.match(atoms)) return \"atom\";\n  if (stream.match(identifiers)) return \"variable\";\n\n  // other\n  if (stream.match(singleOperators)) return \"operator\";\n\n  // unrecognized\n  stream.next();\n  return null;\n};\n\nCodeMirror.defineMode(\"webidl\", function() {\n  return {\n    startState: function() {\n      return {\n        // Is in multiline comment\n        inComment: false,\n        // Last non-whitespace, matched token\n        lastToken: \"\",\n        // Next token is a definition\n        startDef: false,\n        // Last token of the statement is a definition\n        endDef: false\n      };\n    },\n    token: function(stream, state) {\n      var style = readToken(stream, state);\n\n      if (style) {\n        var cur = stream.current();\n        state.lastToken = cur;\n        if (style === \"keyword\") {\n          state.startDef = startDefs.test(cur);\n          state.endDef = state.endDef || endDefs.test(cur);\n        } else {\n          state.startDef = false;\n        }\n      }\n\n      return style;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-webidl\", \"webidl\");\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/xml/xml.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar htmlConfig = {\n  autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,\n                    'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,\n                    'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,\n                    'track': true, 'wbr': true, 'menuitem': true},\n  implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,\n                     'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,\n                     'th': true, 'tr': true},\n  contextGrabbers: {\n    'dd': {'dd': true, 'dt': true},\n    'dt': {'dd': true, 'dt': true},\n    'li': {'li': true},\n    'option': {'option': true, 'optgroup': true},\n    'optgroup': {'optgroup': true},\n    'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,\n          'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,\n          'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,\n          'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,\n          'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},\n    'rp': {'rp': true, 'rt': true},\n    'rt': {'rp': true, 'rt': true},\n    'tbody': {'tbody': true, 'tfoot': true},\n    'td': {'td': true, 'th': true},\n    'tfoot': {'tbody': true},\n    'th': {'td': true, 'th': true},\n    'thead': {'tbody': true, 'tfoot': true},\n    'tr': {'tr': true}\n  },\n  doNotIndent: {\"pre\": true},\n  allowUnquoted: true,\n  allowMissing: true,\n  caseFold: true\n}\n\nvar xmlConfig = {\n  autoSelfClosers: {},\n  implicitlyClosed: {},\n  contextGrabbers: {},\n  doNotIndent: {},\n  allowUnquoted: false,\n  allowMissing: false,\n  allowMissingTagName: false,\n  caseFold: false\n}\n\nCodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n  var indentUnit = editorConf.indentUnit\n  var config = {}\n  var defaults = config_.htmlMode ? htmlConfig : xmlConfig\n  for (var prop in defaults) config[prop] = defaults[prop]\n  for (var prop in config_) config[prop] = config_[prop]\n\n  // Return variables for tokenizers\n  var type, setStyle;\n\n  function inText(stream, state) {\n    function chain(parser) {\n      state.tokenize = parser;\n      return parser(stream, state);\n    }\n\n    var ch = stream.next();\n    if (ch == \"<\") {\n      if (stream.eat(\"!\")) {\n        if (stream.eat(\"[\")) {\n          if (stream.match(\"CDATA[\")) return chain(inBlock(\"atom\", \"]]>\"));\n          else return null;\n        } else if (stream.match(\"--\")) {\n          return chain(inBlock(\"comment\", \"-->\"));\n        } else if (stream.match(\"DOCTYPE\", true, true)) {\n          stream.eatWhile(/[\\w\\._\\-]/);\n          return chain(doctype(1));\n        } else {\n          return null;\n        }\n      } else if (stream.eat(\"?\")) {\n        stream.eatWhile(/[\\w\\._\\-]/);\n        state.tokenize = inBlock(\"meta\", \"?>\");\n        return \"meta\";\n      } else {\n        type = stream.eat(\"/\") ? \"closeTag\" : \"openTag\";\n        state.tokenize = inTag;\n        return \"tag bracket\";\n      }\n    } else if (ch == \"&\") {\n      var ok;\n      if (stream.eat(\"#\")) {\n        if (stream.eat(\"x\")) {\n          ok = stream.eatWhile(/[a-fA-F\\d]/) && stream.eat(\";\");\n        } else {\n          ok = stream.eatWhile(/[\\d]/) && stream.eat(\";\");\n        }\n      } else {\n        ok = stream.eatWhile(/[\\w\\.\\-:]/) && stream.eat(\";\");\n      }\n      return ok ? \"atom\" : \"error\";\n    } else {\n      stream.eatWhile(/[^&<]/);\n      return null;\n    }\n  }\n  inText.isInText = true;\n\n  function inTag(stream, state) {\n    var ch = stream.next();\n    if (ch == \">\" || (ch == \"/\" && stream.eat(\">\"))) {\n      state.tokenize = inText;\n      type = ch == \">\" ? \"endTag\" : \"selfcloseTag\";\n      return \"tag bracket\";\n    } else if (ch == \"=\") {\n      type = \"equals\";\n      return null;\n    } else if (ch == \"<\") {\n      state.tokenize = inText;\n      state.state = baseState;\n      state.tagName = state.tagStart = null;\n      var next = state.tokenize(stream, state);\n      return next ? next + \" tag error\" : \"tag error\";\n    } else if (/[\\'\\\"]/.test(ch)) {\n      state.tokenize = inAttribute(ch);\n      state.stringStartCol = stream.column();\n      return state.tokenize(stream, state);\n    } else {\n      stream.match(/^[^\\s\\u00a0=<>\\\"\\']*[^\\s\\u00a0=<>\\\"\\'\\/]/);\n      return \"word\";\n    }\n  }\n\n  function inAttribute(quote) {\n    var closure = function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.next() == quote) {\n          state.tokenize = inTag;\n          break;\n        }\n      }\n      return \"string\";\n    };\n    closure.isInAttribute = true;\n    return closure;\n  }\n\n  function inBlock(style, terminator) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.match(terminator)) {\n          state.tokenize = inText;\n          break;\n        }\n        stream.next();\n      }\n      return style;\n    }\n  }\n\n  function doctype(depth) {\n    return function(stream, state) {\n      var ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == \"<\") {\n          state.tokenize = doctype(depth + 1);\n          return state.tokenize(stream, state);\n        } else if (ch == \">\") {\n          if (depth == 1) {\n            state.tokenize = inText;\n            break;\n          } else {\n            state.tokenize = doctype(depth - 1);\n            return state.tokenize(stream, state);\n          }\n        }\n      }\n      return \"meta\";\n    };\n  }\n\n  function lower(tagName) {\n    return tagName && tagName.toLowerCase();\n  }\n\n  function Context(state, tagName, startOfLine) {\n    this.prev = state.context;\n    this.tagName = tagName || \"\";\n    this.indent = state.indented;\n    this.startOfLine = startOfLine;\n    if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))\n      this.noIndent = true;\n  }\n  function popContext(state) {\n    if (state.context) state.context = state.context.prev;\n  }\n  function maybePopContext(state, nextTagName) {\n    var parentTagName;\n    while (true) {\n      if (!state.context) {\n        return;\n      }\n      parentTagName = state.context.tagName;\n      if (!config.contextGrabbers.hasOwnProperty(lower(parentTagName)) ||\n          !config.contextGrabbers[lower(parentTagName)].hasOwnProperty(lower(nextTagName))) {\n        return;\n      }\n      popContext(state);\n    }\n  }\n\n  function baseState(type, stream, state) {\n    if (type == \"openTag\") {\n      state.tagStart = stream.column();\n      return tagNameState;\n    } else if (type == \"closeTag\") {\n      return closeTagNameState;\n    } else {\n      return baseState;\n    }\n  }\n  function tagNameState(type, stream, state) {\n    if (type == \"word\") {\n      state.tagName = stream.current();\n      setStyle = \"tag\";\n      return attrState;\n    } else if (config.allowMissingTagName && type == \"endTag\") {\n      setStyle = \"tag bracket\";\n      return attrState(type, stream, state);\n    } else {\n      setStyle = \"error\";\n      return tagNameState;\n    }\n  }\n  function closeTagNameState(type, stream, state) {\n    if (type == \"word\") {\n      var tagName = stream.current();\n      if (state.context && state.context.tagName != tagName &&\n          config.implicitlyClosed.hasOwnProperty(lower(state.context.tagName)))\n        popContext(state);\n      if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {\n        setStyle = \"tag\";\n        return closeState;\n      } else {\n        setStyle = \"tag error\";\n        return closeStateErr;\n      }\n    } else if (config.allowMissingTagName && type == \"endTag\") {\n      setStyle = \"tag bracket\";\n      return closeState(type, stream, state);\n    } else {\n      setStyle = \"error\";\n      return closeStateErr;\n    }\n  }\n\n  function closeState(type, _stream, state) {\n    if (type != \"endTag\") {\n      setStyle = \"error\";\n      return closeState;\n    }\n    popContext(state);\n    return baseState;\n  }\n  function closeStateErr(type, stream, state) {\n    setStyle = \"error\";\n    return closeState(type, stream, state);\n  }\n\n  function attrState(type, _stream, state) {\n    if (type == \"word\") {\n      setStyle = \"attribute\";\n      return attrEqState;\n    } else if (type == \"endTag\" || type == \"selfcloseTag\") {\n      var tagName = state.tagName, tagStart = state.tagStart;\n      state.tagName = state.tagStart = null;\n      if (type == \"selfcloseTag\" ||\n          config.autoSelfClosers.hasOwnProperty(lower(tagName))) {\n        maybePopContext(state, tagName);\n      } else {\n        maybePopContext(state, tagName);\n        state.context = new Context(state, tagName, tagStart == state.indented);\n      }\n      return baseState;\n    }\n    setStyle = \"error\";\n    return attrState;\n  }\n  function attrEqState(type, stream, state) {\n    if (type == \"equals\") return attrValueState;\n    if (!config.allowMissing) setStyle = \"error\";\n    return attrState(type, stream, state);\n  }\n  function attrValueState(type, stream, state) {\n    if (type == \"string\") return attrContinuedState;\n    if (type == \"word\" && config.allowUnquoted) {setStyle = \"string\"; return attrState;}\n    setStyle = \"error\";\n    return attrState(type, stream, state);\n  }\n  function attrContinuedState(type, stream, state) {\n    if (type == \"string\") return attrContinuedState;\n    return attrState(type, stream, state);\n  }\n\n  return {\n    startState: function(baseIndent) {\n      var state = {tokenize: inText,\n                   state: baseState,\n                   indented: baseIndent || 0,\n                   tagName: null, tagStart: null,\n                   context: null}\n      if (baseIndent != null) state.baseIndent = baseIndent\n      return state\n    },\n\n    token: function(stream, state) {\n      if (!state.tagName && stream.sol())\n        state.indented = stream.indentation();\n\n      if (stream.eatSpace()) return null;\n      type = null;\n      var style = state.tokenize(stream, state);\n      if ((style || type) && style != \"comment\") {\n        setStyle = null;\n        state.state = state.state(type || style, stream, state);\n        if (setStyle)\n          style = setStyle == \"error\" ? style + \" error\" : setStyle;\n      }\n      return style;\n    },\n\n    indent: function(state, textAfter, fullLine) {\n      var context = state.context;\n      // Indent multi-line strings (e.g. css).\n      if (state.tokenize.isInAttribute) {\n        if (state.tagStart == state.indented)\n          return state.stringStartCol + 1;\n        else\n          return state.indented + indentUnit;\n      }\n      if (context && context.noIndent) return CodeMirror.Pass;\n      if (state.tokenize != inTag && state.tokenize != inText)\n        return fullLine ? fullLine.match(/^(\\s*)/)[0].length : 0;\n      // Indent the starts of attribute names.\n      if (state.tagName) {\n        if (config.multilineTagIndentPastTag !== false)\n          return state.tagStart + state.tagName.length + 2;\n        else\n          return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);\n      }\n      if (config.alignCDATA && /<!\\[CDATA\\[/.test(textAfter)) return 0;\n      var tagAfter = textAfter && /^<(\\/)?([\\w_:\\.-]*)/.exec(textAfter);\n      if (tagAfter && tagAfter[1]) { // Closing tag spotted\n        while (context) {\n          if (context.tagName == tagAfter[2]) {\n            context = context.prev;\n            break;\n          } else if (config.implicitlyClosed.hasOwnProperty(lower(context.tagName))) {\n            context = context.prev;\n          } else {\n            break;\n          }\n        }\n      } else if (tagAfter) { // Opening tag spotted\n        while (context) {\n          var grabbers = config.contextGrabbers[lower(context.tagName)];\n          if (grabbers && grabbers.hasOwnProperty(lower(tagAfter[2])))\n            context = context.prev;\n          else\n            break;\n        }\n      }\n      while (context && context.prev && !context.startOfLine)\n        context = context.prev;\n      if (context) return context.indent + indentUnit;\n      else return state.baseIndent || 0;\n    },\n\n    electricInput: /<\\/[\\s\\w:]+>$/,\n    blockCommentStart: \"<!--\",\n    blockCommentEnd: \"-->\",\n\n    configuration: config.htmlMode ? \"html\" : \"xml\",\n    helperType: config.htmlMode ? \"html\" : \"xml\",\n\n    skipAttribute: function(state) {\n      if (state.state == attrValueState)\n        state.state = attrState\n    },\n\n    xmlCurrentTag: function(state) {\n      return state.tagName ? {name: state.tagName, close: state.type == \"closeTag\"} : null\n    },\n\n    xmlCurrentContext: function(state) {\n      var context = []\n      for (var cx = state.context; cx; cx = cx.prev)\n        context.push(cx.tagName)\n      return context.reverse()\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/xml\", \"xml\");\nCodeMirror.defineMIME(\"application/xml\", \"xml\");\nif (!CodeMirror.mimeModes.hasOwnProperty(\"text/html\"))\n  CodeMirror.defineMIME(\"text/html\", {name: \"xml\", htmlMode: true});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/xquery/xquery.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"xquery\", function() {\n\n  // The keywords object is set to the result of this self executing\n  // function. Each keyword is a property of the keywords object whose\n  // value is {type: atype, style: astyle}\n  var keywords = function(){\n    // convenience functions used to build keywords object\n    function kw(type) {return {type: type, style: \"keyword\"};}\n    var operator = kw(\"operator\")\n      , atom = {type: \"atom\", style: \"atom\"}\n      , punctuation = {type: \"punctuation\", style: null}\n      , qualifier = {type: \"axis_specifier\", style: \"qualifier\"};\n\n    // kwObj is what is return from this function at the end\n    var kwObj = {\n      ',': punctuation\n    };\n\n    // a list of 'basic' keywords. For each add a property to kwObj with the value of\n    // {type: basic[i], style: \"keyword\"} e.g. 'after' --> {type: \"after\", style: \"keyword\"}\n    var basic = ['after', 'all', 'allowing', 'ancestor', 'ancestor-or-self', 'any', 'array', 'as',\n    'ascending', 'at', 'attribute', 'base-uri', 'before', 'boundary-space', 'by', 'case', 'cast',\n    'castable', 'catch', 'child', 'collation', 'comment', 'construction', 'contains', 'content',\n    'context', 'copy', 'copy-namespaces', 'count', 'decimal-format', 'declare', 'default', 'delete',\n    'descendant', 'descendant-or-self', 'descending', 'diacritics', 'different', 'distance',\n    'document', 'document-node', 'element', 'else', 'empty', 'empty-sequence', 'encoding', 'end',\n    'entire', 'every', 'exactly', 'except', 'external', 'first', 'following', 'following-sibling',\n    'for', 'from', 'ftand', 'ftnot', 'ft-option', 'ftor', 'function', 'fuzzy', 'greatest', 'group',\n    'if', 'import', 'in', 'inherit', 'insensitive', 'insert', 'instance', 'intersect', 'into',\n    'invoke', 'is', 'item', 'language', 'last', 'lax', 'least', 'let', 'levels', 'lowercase', 'map',\n    'modify', 'module', 'most', 'namespace', 'next', 'no', 'node', 'nodes', 'no-inherit',\n    'no-preserve', 'not', 'occurs', 'of', 'only', 'option', 'order', 'ordered', 'ordering',\n    'paragraph', 'paragraphs', 'parent', 'phrase', 'preceding', 'preceding-sibling', 'preserve',\n    'previous', 'processing-instruction', 'relationship', 'rename', 'replace', 'return',\n    'revalidation', 'same', 'satisfies', 'schema', 'schema-attribute', 'schema-element', 'score',\n    'self', 'sensitive', 'sentence', 'sentences', 'sequence', 'skip', 'sliding', 'some', 'stable',\n    'start', 'stemming', 'stop', 'strict', 'strip', 'switch', 'text', 'then', 'thesaurus', 'times',\n    'to', 'transform', 'treat', 'try', 'tumbling', 'type', 'typeswitch', 'union', 'unordered',\n    'update', 'updating', 'uppercase', 'using', 'validate', 'value', 'variable', 'version',\n    'weight', 'when', 'where', 'wildcards', 'window', 'with', 'without', 'word', 'words', 'xquery'];\n    for(var i=0, l=basic.length; i < l; i++) { kwObj[basic[i]] = kw(basic[i]);};\n\n    // a list of types. For each add a property to kwObj with the value of\n    // {type: \"atom\", style: \"atom\"}\n    var types = ['xs:anyAtomicType', 'xs:anySimpleType', 'xs:anyType', 'xs:anyURI',\n    'xs:base64Binary', 'xs:boolean', 'xs:byte', 'xs:date', 'xs:dateTime', 'xs:dateTimeStamp',\n    'xs:dayTimeDuration', 'xs:decimal', 'xs:double', 'xs:duration', 'xs:ENTITIES', 'xs:ENTITY',\n    'xs:float', 'xs:gDay', 'xs:gMonth', 'xs:gMonthDay', 'xs:gYear', 'xs:gYearMonth', 'xs:hexBinary',\n    'xs:ID', 'xs:IDREF', 'xs:IDREFS', 'xs:int', 'xs:integer', 'xs:item', 'xs:java', 'xs:language',\n    'xs:long', 'xs:Name', 'xs:NCName', 'xs:negativeInteger', 'xs:NMTOKEN', 'xs:NMTOKENS',\n    'xs:nonNegativeInteger', 'xs:nonPositiveInteger', 'xs:normalizedString', 'xs:NOTATION',\n    'xs:numeric', 'xs:positiveInteger', 'xs:precisionDecimal', 'xs:QName', 'xs:short', 'xs:string',\n    'xs:time', 'xs:token', 'xs:unsignedByte', 'xs:unsignedInt', 'xs:unsignedLong',\n    'xs:unsignedShort', 'xs:untyped', 'xs:untypedAtomic', 'xs:yearMonthDuration'];\n    for(var i=0, l=types.length; i < l; i++) { kwObj[types[i]] = atom;};\n\n    // each operator will add a property to kwObj with value of {type: \"operator\", style: \"keyword\"}\n    var operators = ['eq', 'ne', 'lt', 'le', 'gt', 'ge', ':=', '=', '>', '>=', '<', '<=', '.', '|', '?', 'and', 'or', 'div', 'idiv', 'mod', '*', '/', '+', '-'];\n    for(var i=0, l=operators.length; i < l; i++) { kwObj[operators[i]] = operator;};\n\n    // each axis_specifiers will add a property to kwObj with value of {type: \"axis_specifier\", style: \"qualifier\"}\n    var axis_specifiers = [\"self::\", \"attribute::\", \"child::\", \"descendant::\", \"descendant-or-self::\", \"parent::\",\n    \"ancestor::\", \"ancestor-or-self::\", \"following::\", \"preceding::\", \"following-sibling::\", \"preceding-sibling::\"];\n    for(var i=0, l=axis_specifiers.length; i < l; i++) { kwObj[axis_specifiers[i]] = qualifier; };\n\n    return kwObj;\n  }();\n\n  function chain(stream, state, f) {\n    state.tokenize = f;\n    return f(stream, state);\n  }\n\n  // the primary mode tokenizer\n  function tokenBase(stream, state) {\n    var ch = stream.next(),\n        mightBeFunction = false,\n        isEQName = isEQNameAhead(stream);\n\n    // an XML tag (if not in some sub, chained tokenizer)\n    if (ch == \"<\") {\n      if(stream.match(\"!--\", true))\n        return chain(stream, state, tokenXMLComment);\n\n      if(stream.match(\"![CDATA\", false)) {\n        state.tokenize = tokenCDATA;\n        return \"tag\";\n      }\n\n      if(stream.match(\"?\", false)) {\n        return chain(stream, state, tokenPreProcessing);\n      }\n\n      var isclose = stream.eat(\"/\");\n      stream.eatSpace();\n      var tagName = \"\", c;\n      while ((c = stream.eat(/[^\\s\\u00a0=<>\\\"\\'\\/?]/))) tagName += c;\n\n      return chain(stream, state, tokenTag(tagName, isclose));\n    }\n    // start code block\n    else if(ch == \"{\") {\n      pushStateStack(state, { type: \"codeblock\"});\n      return null;\n    }\n    // end code block\n    else if(ch == \"}\") {\n      popStateStack(state);\n      return null;\n    }\n    // if we're in an XML block\n    else if(isInXmlBlock(state)) {\n      if(ch == \">\")\n        return \"tag\";\n      else if(ch == \"/\" && stream.eat(\">\")) {\n        popStateStack(state);\n        return \"tag\";\n      }\n      else\n        return \"variable\";\n    }\n    // if a number\n    else if (/\\d/.test(ch)) {\n      stream.match(/^\\d*(?:\\.\\d*)?(?:E[+\\-]?\\d+)?/);\n      return \"atom\";\n    }\n    // comment start\n    else if (ch === \"(\" && stream.eat(\":\")) {\n      pushStateStack(state, { type: \"comment\"});\n      return chain(stream, state, tokenComment);\n    }\n    // quoted string\n    else if (!isEQName && (ch === '\"' || ch === \"'\"))\n      return chain(stream, state, tokenString(ch));\n    // variable\n    else if(ch === \"$\") {\n      return chain(stream, state, tokenVariable);\n    }\n    // assignment\n    else if(ch ===\":\" && stream.eat(\"=\")) {\n      return \"keyword\";\n    }\n    // open paren\n    else if(ch === \"(\") {\n      pushStateStack(state, { type: \"paren\"});\n      return null;\n    }\n    // close paren\n    else if(ch === \")\") {\n      popStateStack(state);\n      return null;\n    }\n    // open paren\n    else if(ch === \"[\") {\n      pushStateStack(state, { type: \"bracket\"});\n      return null;\n    }\n    // close paren\n    else if(ch === \"]\") {\n      popStateStack(state);\n      return null;\n    }\n    else {\n      var known = keywords.propertyIsEnumerable(ch) && keywords[ch];\n\n      // if there's a EQName ahead, consume the rest of the string portion, it's likely a function\n      if(isEQName && ch === '\\\"') while(stream.next() !== '\"'){}\n      if(isEQName && ch === '\\'') while(stream.next() !== '\\''){}\n\n      // gobble up a word if the character is not known\n      if(!known) stream.eatWhile(/[\\w\\$_-]/);\n\n      // gobble a colon in the case that is a lib func type call fn:doc\n      var foundColon = stream.eat(\":\");\n\n      // if there's not a second colon, gobble another word. Otherwise, it's probably an axis specifier\n      // which should get matched as a keyword\n      if(!stream.eat(\":\") && foundColon) {\n        stream.eatWhile(/[\\w\\$_-]/);\n      }\n      // if the next non whitespace character is an open paren, this is probably a function (if not a keyword of other sort)\n      if(stream.match(/^[ \\t]*\\(/, false)) {\n        mightBeFunction = true;\n      }\n      // is the word a keyword?\n      var word = stream.current();\n      known = keywords.propertyIsEnumerable(word) && keywords[word];\n\n      // if we think it's a function call but not yet known,\n      // set style to variable for now for lack of something better\n      if(mightBeFunction && !known) known = {type: \"function_call\", style: \"variable def\"};\n\n      // if the previous word was element, attribute, axis specifier, this word should be the name of that\n      if(isInXmlConstructor(state)) {\n        popStateStack(state);\n        return \"variable\";\n      }\n      // as previously checked, if the word is element,attribute, axis specifier, call it an \"xmlconstructor\" and\n      // push the stack so we know to look for it on the next word\n      if(word == \"element\" || word == \"attribute\" || known.type == \"axis_specifier\") pushStateStack(state, {type: \"xmlconstructor\"});\n\n      // if the word is known, return the details of that else just call this a generic 'word'\n      return known ? known.style : \"variable\";\n    }\n  }\n\n  // handle comments, including nested\n  function tokenComment(stream, state) {\n    var maybeEnd = false, maybeNested = false, nestedCount = 0, ch;\n    while (ch = stream.next()) {\n      if (ch == \")\" && maybeEnd) {\n        if(nestedCount > 0)\n          nestedCount--;\n        else {\n          popStateStack(state);\n          break;\n        }\n      }\n      else if(ch == \":\" && maybeNested) {\n        nestedCount++;\n      }\n      maybeEnd = (ch == \":\");\n      maybeNested = (ch == \"(\");\n    }\n\n    return \"comment\";\n  }\n\n  // tokenizer for string literals\n  // optionally pass a tokenizer function to set state.tokenize back to when finished\n  function tokenString(quote, f) {\n    return function(stream, state) {\n      var ch;\n\n      if(isInString(state) && stream.current() == quote) {\n        popStateStack(state);\n        if(f) state.tokenize = f;\n        return \"string\";\n      }\n\n      pushStateStack(state, { type: \"string\", name: quote, tokenize: tokenString(quote, f) });\n\n      // if we're in a string and in an XML block, allow an embedded code block\n      if(stream.match(\"{\", false) && isInXmlAttributeBlock(state)) {\n        state.tokenize = tokenBase;\n        return \"string\";\n      }\n\n\n      while (ch = stream.next()) {\n        if (ch ==  quote) {\n          popStateStack(state);\n          if(f) state.tokenize = f;\n          break;\n        }\n        else {\n          // if we're in a string and in an XML block, allow an embedded code block in an attribute\n          if(stream.match(\"{\", false) && isInXmlAttributeBlock(state)) {\n            state.tokenize = tokenBase;\n            return \"string\";\n          }\n\n        }\n      }\n\n      return \"string\";\n    };\n  }\n\n  // tokenizer for variables\n  function tokenVariable(stream, state) {\n    var isVariableChar = /[\\w\\$_-]/;\n\n    // a variable may start with a quoted EQName so if the next character is quote, consume to the next quote\n    if(stream.eat(\"\\\"\")) {\n      while(stream.next() !== '\\\"'){};\n      stream.eat(\":\");\n    } else {\n      stream.eatWhile(isVariableChar);\n      if(!stream.match(\":=\", false)) stream.eat(\":\");\n    }\n    stream.eatWhile(isVariableChar);\n    state.tokenize = tokenBase;\n    return \"variable\";\n  }\n\n  // tokenizer for XML tags\n  function tokenTag(name, isclose) {\n    return function(stream, state) {\n      stream.eatSpace();\n      if(isclose && stream.eat(\">\")) {\n        popStateStack(state);\n        state.tokenize = tokenBase;\n        return \"tag\";\n      }\n      // self closing tag without attributes?\n      if(!stream.eat(\"/\"))\n        pushStateStack(state, { type: \"tag\", name: name, tokenize: tokenBase});\n      if(!stream.eat(\">\")) {\n        state.tokenize = tokenAttribute;\n        return \"tag\";\n      }\n      else {\n        state.tokenize = tokenBase;\n      }\n      return \"tag\";\n    };\n  }\n\n  // tokenizer for XML attributes\n  function tokenAttribute(stream, state) {\n    var ch = stream.next();\n\n    if(ch == \"/\" && stream.eat(\">\")) {\n      if(isInXmlAttributeBlock(state)) popStateStack(state);\n      if(isInXmlBlock(state)) popStateStack(state);\n      return \"tag\";\n    }\n    if(ch == \">\") {\n      if(isInXmlAttributeBlock(state)) popStateStack(state);\n      return \"tag\";\n    }\n    if(ch == \"=\")\n      return null;\n    // quoted string\n    if (ch == '\"' || ch == \"'\")\n      return chain(stream, state, tokenString(ch, tokenAttribute));\n\n    if(!isInXmlAttributeBlock(state))\n      pushStateStack(state, { type: \"attribute\", tokenize: tokenAttribute});\n\n    stream.eat(/[a-zA-Z_:]/);\n    stream.eatWhile(/[-a-zA-Z0-9_:.]/);\n    stream.eatSpace();\n\n    // the case where the attribute has not value and the tag was closed\n    if(stream.match(\">\", false) || stream.match(\"/\", false)) {\n      popStateStack(state);\n      state.tokenize = tokenBase;\n    }\n\n    return \"attribute\";\n  }\n\n  // handle comments, including nested\n  function tokenXMLComment(stream, state) {\n    var ch;\n    while (ch = stream.next()) {\n      if (ch == \"-\" && stream.match(\"->\", true)) {\n        state.tokenize = tokenBase;\n        return \"comment\";\n      }\n    }\n  }\n\n\n  // handle CDATA\n  function tokenCDATA(stream, state) {\n    var ch;\n    while (ch = stream.next()) {\n      if (ch == \"]\" && stream.match(\"]\", true)) {\n        state.tokenize = tokenBase;\n        return \"comment\";\n      }\n    }\n  }\n\n  // handle preprocessing instructions\n  function tokenPreProcessing(stream, state) {\n    var ch;\n    while (ch = stream.next()) {\n      if (ch == \"?\" && stream.match(\">\", true)) {\n        state.tokenize = tokenBase;\n        return \"comment meta\";\n      }\n    }\n  }\n\n\n  // functions to test the current context of the state\n  function isInXmlBlock(state) { return isIn(state, \"tag\"); }\n  function isInXmlAttributeBlock(state) { return isIn(state, \"attribute\"); }\n  function isInXmlConstructor(state) { return isIn(state, \"xmlconstructor\"); }\n  function isInString(state) { return isIn(state, \"string\"); }\n\n  function isEQNameAhead(stream) {\n    // assume we've already eaten a quote (\")\n    if(stream.current() === '\"')\n      return stream.match(/^[^\\\"]+\\\"\\:/, false);\n    else if(stream.current() === '\\'')\n      return stream.match(/^[^\\\"]+\\'\\:/, false);\n    else\n      return false;\n  }\n\n  function isIn(state, type) {\n    return (state.stack.length && state.stack[state.stack.length - 1].type == type);\n  }\n\n  function pushStateStack(state, newState) {\n    state.stack.push(newState);\n  }\n\n  function popStateStack(state) {\n    state.stack.pop();\n    var reinstateTokenize = state.stack.length && state.stack[state.stack.length-1].tokenize;\n    state.tokenize = reinstateTokenize || tokenBase;\n  }\n\n  // the interface for the mode API\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        cc: [],\n        stack: []\n      };\n    },\n\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      return style;\n    },\n\n    blockCommentStart: \"(:\",\n    blockCommentEnd: \":)\"\n\n  };\n\n});\n\nCodeMirror.defineMIME(\"application/xquery\", \"xquery\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/yacas/yacas.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Yacas mode copyright (c) 2015 by Grzegorz Mazur\n// Loosely based on mathematica mode by Calin Barbat\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('yacas', function(_config, _parserConfig) {\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  var bodiedOps = words(\"Assert BackQuote D Defun Deriv For ForEach FromFile \" +\n                        \"FromString Function Integrate InverseTaylor Limit \" +\n                        \"LocalSymbols Macro MacroRule MacroRulePattern \" +\n                        \"NIntegrate Rule RulePattern Subst TD TExplicitSum \" +\n                        \"TSum Taylor Taylor1 Taylor2 Taylor3 ToFile \" +\n                        \"ToStdout ToString TraceRule Until While\");\n\n  // patterns\n  var pFloatForm  = \"(?:(?:\\\\.\\\\d+|\\\\d+\\\\.\\\\d*|\\\\d+)(?:[eE][+-]?\\\\d+)?)\";\n  var pIdentifier = \"(?:[a-zA-Z\\\\$'][a-zA-Z0-9\\\\$']*)\";\n\n  // regular expressions\n  var reFloatForm    = new RegExp(pFloatForm);\n  var reIdentifier   = new RegExp(pIdentifier);\n  var rePattern      = new RegExp(pIdentifier + \"?_\" + pIdentifier);\n  var reFunctionLike = new RegExp(pIdentifier + \"\\\\s*\\\\(\");\n\n  function tokenBase(stream, state) {\n    var ch;\n\n    // get next character\n    ch = stream.next();\n\n    // string\n    if (ch === '\"') {\n      state.tokenize = tokenString;\n      return state.tokenize(stream, state);\n    }\n\n    // comment\n    if (ch === '/') {\n      if (stream.eat('*')) {\n        state.tokenize = tokenComment;\n        return state.tokenize(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n\n    // go back one character\n    stream.backUp(1);\n\n    // update scope info\n    var m = stream.match(/^(\\w+)\\s*\\(/, false);\n    if (m !== null && bodiedOps.hasOwnProperty(m[1]))\n      state.scopes.push('bodied');\n\n    var scope = currentScope(state);\n\n    if (scope === 'bodied' && ch === '[')\n      state.scopes.pop();\n\n    if (ch === '[' || ch === '{' || ch === '(')\n      state.scopes.push(ch);\n\n    scope = currentScope(state);\n\n    if (scope === '[' && ch === ']' ||\n        scope === '{' && ch === '}' ||\n        scope === '(' && ch === ')')\n      state.scopes.pop();\n\n    if (ch === ';') {\n      while (scope === 'bodied') {\n        state.scopes.pop();\n        scope = currentScope(state);\n      }\n    }\n\n    // look for ordered rules\n    if (stream.match(/\\d+ *#/, true, false)) {\n      return 'qualifier';\n    }\n\n    // look for numbers\n    if (stream.match(reFloatForm, true, false)) {\n      return 'number';\n    }\n\n    // look for placeholders\n    if (stream.match(rePattern, true, false)) {\n      return 'variable-3';\n    }\n\n    // match all braces separately\n    if (stream.match(/(?:\\[|\\]|{|}|\\(|\\))/, true, false)) {\n      return 'bracket';\n    }\n\n    // literals looking like function calls\n    if (stream.match(reFunctionLike, true, false)) {\n      stream.backUp(1);\n      return 'variable';\n    }\n\n    // all other identifiers\n    if (stream.match(reIdentifier, true, false)) {\n      return 'variable-2';\n    }\n\n    // operators; note that operators like @@ or /; are matched separately for each symbol.\n    if (stream.match(/(?:\\\\|\\+|\\-|\\*|\\/|,|;|\\.|:|@|~|=|>|<|&|\\||_|`|'|\\^|\\?|!|%|#)/, true, false)) {\n      return 'operator';\n    }\n\n    // everything else is an error\n    return 'error';\n  }\n\n  function tokenString(stream, state) {\n    var next, end = false, escaped = false;\n    while ((next = stream.next()) != null) {\n      if (next === '\"' && !escaped) {\n        end = true;\n        break;\n      }\n      escaped = !escaped && next === '\\\\';\n    }\n    if (end && !escaped) {\n      state.tokenize = tokenBase;\n    }\n    return 'string';\n  };\n\n  function tokenComment(stream, state) {\n    var prev, next;\n    while((next = stream.next()) != null) {\n      if (prev === '*' && next === '/') {\n        state.tokenize = tokenBase;\n        break;\n      }\n      prev = next;\n    }\n    return 'comment';\n  }\n\n  function currentScope(state) {\n    var scope = null;\n    if (state.scopes.length > 0)\n      scope = state.scopes[state.scopes.length - 1];\n    return scope;\n  }\n\n  return {\n    startState: function() {\n      return {\n        tokenize: tokenBase,\n        scopes: []\n      };\n    },\n    token: function(stream, state) {\n      if (stream.eatSpace()) return null;\n      return state.tokenize(stream, state);\n    },\n    indent: function(state, textAfter) {\n      if (state.tokenize !== tokenBase && state.tokenize !== null)\n        return CodeMirror.Pass;\n\n      var delta = 0;\n      if (textAfter === ']' || textAfter === '];' ||\n          textAfter === '}' || textAfter === '};' ||\n          textAfter === ');')\n        delta = -1;\n\n      return (state.scopes.length + delta) * _config.indentUnit;\n    },\n    electricChars: \"{}[]();\",\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    lineComment: \"//\"\n  };\n});\n\nCodeMirror.defineMIME('text/x-yacas', {\n  name: 'yacas'\n});\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/yaml/yaml.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"yaml\", function() {\n\n  var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];\n  var keywordRegex = new RegExp(\"\\\\b((\"+cons.join(\")|(\")+\"))$\", 'i');\n\n  return {\n    token: function(stream, state) {\n      var ch = stream.peek();\n      var esc = state.escaped;\n      state.escaped = false;\n      /* comments */\n      if (ch == \"#\" && (stream.pos == 0 || /\\s/.test(stream.string.charAt(stream.pos - 1)))) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n\n      if (stream.match(/^('([^']|\\\\.)*'?|\"([^\"]|\\\\.)*\"?)/))\n        return \"string\";\n\n      if (state.literal && stream.indentation() > state.keyCol) {\n        stream.skipToEnd(); return \"string\";\n      } else if (state.literal) { state.literal = false; }\n      if (stream.sol()) {\n        state.keyCol = 0;\n        state.pair = false;\n        state.pairStart = false;\n        /* document start */\n        if(stream.match('---')) { return \"def\"; }\n        /* document end */\n        if (stream.match('...')) { return \"def\"; }\n        /* array list item */\n        if (stream.match(/\\s*-\\s+/)) { return 'meta'; }\n      }\n      /* inline pairs/lists */\n      if (stream.match(/^(\\{|\\}|\\[|\\])/)) {\n        if (ch == '{')\n          state.inlinePairs++;\n        else if (ch == '}')\n          state.inlinePairs--;\n        else if (ch == '[')\n          state.inlineList++;\n        else\n          state.inlineList--;\n        return 'meta';\n      }\n\n      /* list separator */\n      if (state.inlineList > 0 && !esc && ch == ',') {\n        stream.next();\n        return 'meta';\n      }\n      /* pairs separator */\n      if (state.inlinePairs > 0 && !esc && ch == ',') {\n        state.keyCol = 0;\n        state.pair = false;\n        state.pairStart = false;\n        stream.next();\n        return 'meta';\n      }\n\n      /* start of value of a pair */\n      if (state.pairStart) {\n        /* block literals */\n        if (stream.match(/^\\s*(\\||\\>)\\s*/)) { state.literal = true; return 'meta'; };\n        /* references */\n        if (stream.match(/^\\s*(\\&|\\*)[a-z0-9\\._-]+\\b/i)) { return 'variable-2'; }\n        /* numbers */\n        if (state.inlinePairs == 0 && stream.match(/^\\s*-?[0-9\\.\\,]+\\s?$/)) { return 'number'; }\n        if (state.inlinePairs > 0 && stream.match(/^\\s*-?[0-9\\.\\,]+\\s?(?=(,|}))/)) { return 'number'; }\n        /* keywords */\n        if (stream.match(keywordRegex)) { return 'keyword'; }\n      }\n\n      /* pairs (associative arrays) -> key */\n      if (!state.pair && stream.match(/^\\s*(?:[,\\[\\]{}&*!|>'\"%@`][^\\s'\":]|[^,\\[\\]{}#&*!|>'\"%@`])[^#]*?(?=\\s*:($|\\s))/)) {\n        state.pair = true;\n        state.keyCol = stream.indentation();\n        return \"atom\";\n      }\n      if (state.pair && stream.match(/^:\\s*/)) { state.pairStart = true; return 'meta'; }\n\n      /* nothing found, continue */\n      state.pairStart = false;\n      state.escaped = (ch == '\\\\');\n      stream.next();\n      return null;\n    },\n    startState: function() {\n      return {\n        pair: false,\n        pairStart: false,\n        keyCol: 0,\n        inlinePairs: 0,\n        inlineList: 0,\n        literal: false,\n        escaped: false\n      };\n    },\n    lineComment: \"#\",\n    fold: \"indent\"\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-yaml\", \"yaml\");\nCodeMirror.defineMIME(\"text/yaml\", \"yaml\");\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/yaml-frontmatter/yaml-frontmatter.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function (mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../yaml/yaml\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../yaml/yaml\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function (CodeMirror) {\n\n  var START = 0, FRONTMATTER = 1, BODY = 2\n\n  // a mixed mode for Markdown text with an optional YAML front matter\n  CodeMirror.defineMode(\"yaml-frontmatter\", function (config, parserConfig) {\n    var yamlMode = CodeMirror.getMode(config, \"yaml\")\n    var innerMode = CodeMirror.getMode(config, parserConfig && parserConfig.base || \"gfm\")\n\n    function localMode(state) {\n      return state.state == FRONTMATTER ? {mode: yamlMode, state: state.yaml} : {mode: innerMode, state: state.inner}\n    }\n\n    return {\n      startState: function () {\n        return {\n          state: START,\n          yaml: null,\n          inner: CodeMirror.startState(innerMode)\n        }\n      },\n      copyState: function (state) {\n        return {\n          state: state.state,\n          yaml: state.yaml && CodeMirror.copyState(yamlMode, state.yaml),\n          inner: CodeMirror.copyState(innerMode, state.inner)\n        }\n      },\n      token: function (stream, state) {\n        if (state.state == START) {\n          if (stream.match('---', false)) {\n            state.state = FRONTMATTER\n            state.yaml = CodeMirror.startState(yamlMode)\n            return yamlMode.token(stream, state.yaml)\n          } else {\n            state.state = BODY\n            return innerMode.token(stream, state.inner)\n          }\n        } else if (state.state == FRONTMATTER) {\n          var end = stream.sol() && stream.match(/(---|\\.\\.\\.)/, false)\n          var style = yamlMode.token(stream, state.yaml)\n          if (end) {\n            state.state = BODY\n            state.yaml = null\n          }\n          return style\n        } else {\n          return innerMode.token(stream, state.inner)\n        }\n      },\n      innerMode: localMode,\n      indent: function(state, a, b) {\n        var m = localMode(state)\n        return m.mode.indent ? m.mode.indent(m.state, a, b) : CodeMirror.Pass\n      },\n      blankLine: function (state) {\n        var m = localMode(state)\n        if (m.mode.blankLine) return m.mode.blankLine(m.state)\n      }\n    }\n  })\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/mode/z80/z80.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n  mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n  define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n  mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('z80', function(_config, parserConfig) {\n  var ez80 = parserConfig.ez80;\n  var keywords1, keywords2;\n  if (ez80) {\n    keywords1 = /^(exx?|(ld|cp)([di]r?)?|[lp]ea|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|[de]i|halt|im|in([di]mr?|ir?|irx|2r?)|ot(dmr?|[id]rx|imr?)|out(0?|[di]r?|[di]2r?)|tst(io)?|slp)(\\.([sl]?i)?[sl])?\\b/i;\n    keywords2 = /^(((call|j[pr]|rst|ret[in]?)(\\.([sl]?i)?[sl])?)|(rs|st)mix)\\b/i;\n  } else {\n    keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\\b/i;\n    keywords2 = /^(call|j[pr]|ret[in]?|b_?(call|jump))\\b/i;\n  }\n\n  var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\\b/i;\n  var variables2 = /^(n?[zc]|p[oe]?|m)\\b/i;\n  var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\\b/i;\n  var numbers = /^([\\da-f]+h|[0-7]+o|[01]+b|\\d+d?)\\b/i;\n\n  return {\n    startState: function() {\n      return {\n        context: 0\n      };\n    },\n    token: function(stream, state) {\n      if (!stream.column())\n        state.context = 0;\n\n      if (stream.eatSpace())\n        return null;\n\n      var w;\n\n      if (stream.eatWhile(/\\w/)) {\n        if (ez80 && stream.eat('.')) {\n          stream.eatWhile(/\\w/);\n        }\n        w = stream.current();\n\n        if (stream.indentation()) {\n          if ((state.context == 1 || state.context == 4) && variables1.test(w)) {\n            state.context = 4;\n            return 'var2';\n          }\n\n          if (state.context == 2 && variables2.test(w)) {\n            state.context = 4;\n            return 'var3';\n          }\n\n          if (keywords1.test(w)) {\n            state.context = 1;\n            return 'keyword';\n          } else if (keywords2.test(w)) {\n            state.context = 2;\n            return 'keyword';\n          } else if (state.context == 4 && numbers.test(w)) {\n            return 'number';\n          }\n\n          if (errors.test(w))\n            return 'error';\n        } else if (stream.match(numbers)) {\n          return 'number';\n        } else {\n          return null;\n        }\n      } else if (stream.eat(';')) {\n        stream.skipToEnd();\n        return 'comment';\n      } else if (stream.eat('\"')) {\n        while (w = stream.next()) {\n          if (w == '\"')\n            break;\n\n          if (w == '\\\\')\n            stream.next();\n        }\n        return 'string';\n      } else if (stream.eat('\\'')) {\n        if (stream.match(/\\\\?.'/))\n          return 'number';\n      } else if (stream.eat('.') || stream.sol() && stream.eat('#')) {\n        state.context = 5;\n\n        if (stream.eatWhile(/\\w/))\n          return 'def';\n      } else if (stream.eat('$')) {\n        if (stream.eatWhile(/[\\da-f]/i))\n          return 'number';\n      } else if (stream.eat('%')) {\n        if (stream.eatWhile(/[01]/))\n          return 'number';\n      } else {\n        stream.next();\n      }\n      return null;\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/x-z80\", \"z80\");\nCodeMirror.defineMIME(\"text/x-ez80\", { name: \"z80\", ez80: true });\n\n});\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/package.json",
    "content": "{\n  \"name\": \"codemirror\",\n  \"version\": \"5.65.2\",\n  \"main\": \"lib/codemirror.js\",\n  \"style\": \"lib/codemirror.css\",\n  \"author\": {\n    \"name\": \"Marijn Haverbeke\",\n    \"email\": \"marijnh@gmail.com\",\n    \"url\": \"http://marijnhaverbeke.nl\"\n  },\n  \"description\": \"Full-featured in-browser code editor\",\n  \"license\": \"MIT\",\n  \"directories\": {\n    \"lib\": \"./lib\"\n  },\n  \"scripts\": {\n    \"build\": \"rollup -c\",\n    \"watch\": \"rollup -w -c\",\n    \"prepare\": \"npm run-script build\",\n    \"test\": \"node ./test/run.js\",\n    \"lint\": \"bin/lint\"\n  },\n  \"devDependencies\": {\n    \"@rollup/plugin-buble\": \"^0.21.3\",\n    \"blint\": \"^1.1.0\",\n    \"node-static\": \"0.7.11\",\n    \"puppeteer\": \"^1.20.0\",\n    \"rollup\": \"^1.26.3\"\n  },\n  \"bugs\": \"http://github.com/codemirror/CodeMirror/issues\",\n  \"keywords\": [\n    \"JavaScript\",\n    \"CodeMirror\",\n    \"Editor\"\n  ],\n  \"homepage\": \"https://codemirror.net\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/codemirror/CodeMirror.git\"\n  },\n  \"jspm\": {\n    \"directories\": {},\n    \"dependencies\": {},\n    \"devDependencies\": {}\n  },\n  \"dependencies\": {}\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/rollup.config.js",
    "content": "import buble from '@rollup/plugin-buble';\n\nexport default [\n  {\n    input: \"src/codemirror.js\",\n    output: {\n      banner: `// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// This is CodeMirror (https://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n`,\n      format: \"umd\",\n      file: \"lib/codemirror.js\",\n      name: \"CodeMirror\"\n    },\n    plugins: [ buble({namedFunctionExpressions: false}) ]\n  },\n  {\n    input: [\"src/addon/runmode/runmode-standalone.js\"],\n    output: {\n      format: \"iife\",\n      file: \"addon/runmode/runmode-standalone.js\",\n      name: \"CodeMirror\",\n      freeze: false, // IE8 doesn't support Object.freeze.\n    },\n    plugins: [ buble({namedFunctionExpressions: false}) ]\n  },\n  {\n    input: [\"src/addon/runmode/runmode.node.js\"],\n    output: {\n      format: \"cjs\",\n      file: \"addon/runmode/runmode.node.js\",\n      name: \"CodeMirror\",\n      freeze: false, // IE8 doesn't support Object.freeze.\n    },\n    plugins: [ buble({namedFunctionExpressions: false}) ]\n  },\n];\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/addon/runmode/codemirror-standalone.js",
    "content": "import StringStream from \"../../util/StringStream.js\"\nimport { countColumn } from \"../../util/misc.js\"\nimport * as modeMethods from \"../../modes.js\"\n\n// declare global: globalThis, CodeMirror\n\n// Create a minimal CodeMirror needed to use runMode, and assign to root.\nvar root = typeof globalThis !== 'undefined' ? globalThis : window\nroot.CodeMirror = {}\n\n// Copy StringStream and mode methods into CodeMirror object.\nCodeMirror.StringStream = StringStream\nfor (var exported in modeMethods) CodeMirror[exported] = modeMethods[exported]\n\n// Minimal default mode.\nCodeMirror.defineMode(\"null\", () => ({token: stream => stream.skipToEnd()}))\nCodeMirror.defineMIME(\"text/plain\", \"null\")\n\nCodeMirror.registerHelper = CodeMirror.registerGlobalHelper = Math.min\nCodeMirror.splitLines = function(string) { return string.split(/\\r?\\n|\\r/) }\nCodeMirror.countColumn = countColumn\n\nCodeMirror.defaults = { indentUnit: 2 }\nexport default CodeMirror\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/addon/runmode/codemirror.node.js",
    "content": "import StringStream from \"../../util/StringStream.js\"\nimport * as modeMethods from \"../../modes.js\"\nimport {countColumn} from \"../../util/misc.js\"\n\n// Copy StringStream and mode methods into exports (CodeMirror) object.\nexports.StringStream = StringStream\nexports.countColumn = countColumn\nfor (var exported in modeMethods) exports[exported] = modeMethods[exported]\n\n// Shim library CodeMirror with the minimal CodeMirror defined above.\nrequire.cache[require.resolve(\"../../lib/codemirror\")] = require.cache[require.resolve(\"./runmode.node\")]\nrequire.cache[require.resolve(\"../../addon/runmode/runmode\")] = require.cache[require.resolve(\"./runmode.node\")]\n\n// Minimal default mode.\nexports.defineMode(\"null\", () => ({token: stream => stream.skipToEnd()}))\nexports.defineMIME(\"text/plain\", \"null\")\n\nexports.registerHelper = exports.registerGlobalHelper = Math.min\nexports.splitLines = function(string) { return string.split(/\\r?\\n|\\r/) }\n\nexports.defaults = { indentUnit: 2 }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/addon/runmode/runmode-standalone.js",
    "content": "import \"./codemirror-standalone.js\"\nimport \"../../../addon/runmode/runmode.js\""
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/addon/runmode/runmode.node.js",
    "content": "import \"./codemirror.node.js\"\nimport \"../../../addon/runmode/runmode.js\""
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/codemirror.js",
    "content": "import { CodeMirror } from \"./edit/main.js\"\n\nexport default CodeMirror\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/Display.js",
    "content": "import { gecko, ie, ie_version, mobile, webkit } from \"../util/browser.js\"\nimport { elt, eltP } from \"../util/dom.js\"\nimport { scrollerGap } from \"../util/misc.js\"\nimport { getGutters, renderGutters } from \"./gutters.js\"\n\n// The display handles the DOM integration, both for input reading\n// and content drawing. It holds references to DOM nodes and\n// display-related state.\n\nexport function Display(place, doc, input, options) {\n  let d = this\n  this.input = input\n\n  // Covers bottom-right square when both scrollbars are present.\n  d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\")\n  d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\")\n  // Covers bottom of gutter when coverGutterNextToScrollbar is on\n  // and h scrollbar is present.\n  d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\")\n  d.gutterFiller.setAttribute(\"cm-not-content\", \"true\")\n  // Will contain the actual code, positioned to cover the viewport.\n  d.lineDiv = eltP(\"div\", null, \"CodeMirror-code\")\n  // Elements are added to these to represent selection and cursors.\n  d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\")\n  d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\")\n  // A visibility: hidden element used to find the size of things.\n  d.measure = elt(\"div\", null, \"CodeMirror-measure\")\n  // When lines outside of the viewport are measured, they are drawn in this.\n  d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\")\n  // Wraps everything that needs to exist inside the vertically-padded coordinate system\n  d.lineSpace = eltP(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n                    null, \"position: relative; outline: none\")\n  let lines = eltP(\"div\", [d.lineSpace], \"CodeMirror-lines\")\n  // Moved around its parent to cover visible view.\n  d.mover = elt(\"div\", [lines], null, \"position: relative\")\n  // Set to the height of the document, allowing scrolling.\n  d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\")\n  d.sizerWidth = null\n  // Behavior of elts with overflow: auto and padding is\n  // inconsistent across browsers. This is used to ensure the\n  // scrollable area is big enough.\n  d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\")\n  // Will contain the gutters, if any.\n  d.gutters = elt(\"div\", null, \"CodeMirror-gutters\")\n  d.lineGutter = null\n  // Actual scrollable element.\n  d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\")\n  d.scroller.setAttribute(\"tabIndex\", \"-1\")\n  // The element in which the editor lives.\n  d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\")\n\n  // This attribute is respected by automatic translation systems such as Google Translate,\n  // and may also be respected by tools used by human translators.\n  d.wrapper.setAttribute('translate', 'no')\n\n  // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n  if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0 }\n  if (!webkit && !(gecko && mobile)) d.scroller.draggable = true\n\n  if (place) {\n    if (place.appendChild) place.appendChild(d.wrapper)\n    else place(d.wrapper)\n  }\n\n  // Current rendered range (may be bigger than the view window).\n  d.viewFrom = d.viewTo = doc.first\n  d.reportedViewFrom = d.reportedViewTo = doc.first\n  // Information about the rendered lines.\n  d.view = []\n  d.renderedView = null\n  // Holds info about a single rendered line when it was rendered\n  // for measurement, while not in view.\n  d.externalMeasured = null\n  // Empty space (in pixels) above the view\n  d.viewOffset = 0\n  d.lastWrapHeight = d.lastWrapWidth = 0\n  d.updateLineNumbers = null\n\n  d.nativeBarWidth = d.barHeight = d.barWidth = 0\n  d.scrollbarsClipped = false\n\n  // Used to only resize the line number gutter when necessary (when\n  // the amount of lines crosses a boundary that makes its width change)\n  d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null\n  // Set to true when a non-horizontal-scrolling line widget is\n  // added. As an optimization, line widget aligning is skipped when\n  // this is false.\n  d.alignWidgets = false\n\n  d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null\n\n  // Tracks the maximum line length so that the horizontal scrollbar\n  // can be kept static when scrolling.\n  d.maxLine = null\n  d.maxLineLength = 0\n  d.maxLineChanged = false\n\n  // Used for measuring wheel scrolling granularity\n  d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null\n\n  // True when shift is held down.\n  d.shift = false\n\n  // Used to track whether anything happened since the context menu\n  // was opened.\n  d.selForContextMenu = null\n\n  d.activeTouch = null\n\n  d.gutterSpecs = getGutters(options.gutters, options.lineNumbers)\n  renderGutters(d)\n\n  input.init(d)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/focus.js",
    "content": "import { restartBlink } from \"./selection.js\"\nimport { webkit } from \"../util/browser.js\"\nimport { addClass, rmClass } from \"../util/dom.js\"\nimport { signal } from \"../util/event.js\"\n\nexport function ensureFocus(cm) {\n  if (!cm.hasFocus()) {\n    cm.display.input.focus()\n    if (!cm.state.focused) onFocus(cm)\n  }\n}\n\nexport function delayBlurEvent(cm) {\n  cm.state.delayingBlurEvent = true\n  setTimeout(() => { if (cm.state.delayingBlurEvent) {\n    cm.state.delayingBlurEvent = false\n    if (cm.state.focused) onBlur(cm)\n  } }, 100)\n}\n\nexport function onFocus(cm, e) {\n  if (cm.state.delayingBlurEvent && !cm.state.draggingText) cm.state.delayingBlurEvent = false\n\n  if (cm.options.readOnly == \"nocursor\") return\n  if (!cm.state.focused) {\n    signal(cm, \"focus\", cm, e)\n    cm.state.focused = true\n    addClass(cm.display.wrapper, \"CodeMirror-focused\")\n    // This test prevents this from firing when a context\n    // menu is closed (since the input reset would kill the\n    // select-all detection hack)\n    if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n      cm.display.input.reset()\n      if (webkit) setTimeout(() => cm.display.input.reset(true), 20) // Issue #1730\n    }\n    cm.display.input.receivedFocus()\n  }\n  restartBlink(cm)\n}\nexport function onBlur(cm, e) {\n  if (cm.state.delayingBlurEvent) return\n\n  if (cm.state.focused) {\n    signal(cm, \"blur\", cm, e)\n    cm.state.focused = false\n    rmClass(cm.display.wrapper, \"CodeMirror-focused\")\n  }\n  clearInterval(cm.display.blinker)\n  setTimeout(() => { if (!cm.state.focused) cm.display.shift = false }, 150)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/gutters.js",
    "content": "import { elt, removeChildren } from \"../util/dom.js\"\nimport { regChange } from \"./view_tracking.js\"\nimport { alignHorizontally } from \"./line_numbers.js\"\nimport { updateGutterSpace } from \"./update_display.js\"\n\nexport function getGutters(gutters, lineNumbers) {\n  let result = [], sawLineNumbers = false\n  for (let i = 0; i < gutters.length; i++) {\n    let name = gutters[i], style = null\n    if (typeof name != \"string\") { style = name.style; name = name.className }\n    if (name == \"CodeMirror-linenumbers\") {\n      if (!lineNumbers) continue\n      else sawLineNumbers = true\n    }\n    result.push({className: name, style})\n  }\n  if (lineNumbers && !sawLineNumbers) result.push({className: \"CodeMirror-linenumbers\", style: null})\n  return result\n}\n\n// Rebuild the gutter elements, ensure the margin to the left of the\n// code matches their width.\nexport function renderGutters(display) {\n  let gutters = display.gutters, specs = display.gutterSpecs\n  removeChildren(gutters)\n  display.lineGutter = null\n  for (let i = 0; i < specs.length; ++i) {\n    let {className, style} = specs[i]\n    let gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + className))\n    if (style) gElt.style.cssText = style\n    if (className == \"CodeMirror-linenumbers\") {\n      display.lineGutter = gElt\n      gElt.style.width = (display.lineNumWidth || 1) + \"px\"\n    }\n  }\n  gutters.style.display = specs.length ? \"\" : \"none\"\n  updateGutterSpace(display)\n}\n\nexport function updateGutters(cm) {\n  renderGutters(cm.display)\n  regChange(cm)\n  alignHorizontally(cm)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/highlight_worker.js",
    "content": "import { getContextBefore, highlightLine, processLine } from \"../line/highlight.js\"\nimport { copyState } from \"../modes.js\"\nimport { bind } from \"../util/misc.js\"\n\nimport { runInOp } from \"./operations.js\"\nimport { regLineChange } from \"./view_tracking.js\"\n\n// HIGHLIGHT WORKER\n\nexport function startWorker(cm, time) {\n  if (cm.doc.highlightFrontier < cm.display.viewTo)\n    cm.state.highlight.set(time, bind(highlightWorker, cm))\n}\n\nfunction highlightWorker(cm) {\n  let doc = cm.doc\n  if (doc.highlightFrontier >= cm.display.viewTo) return\n  let end = +new Date + cm.options.workTime\n  let context = getContextBefore(cm, doc.highlightFrontier)\n  let changedLines = []\n\n  doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), line => {\n    if (context.line >= cm.display.viewFrom) { // Visible\n      let oldStyles = line.styles\n      let resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null\n      let highlighted = highlightLine(cm, line, context, true)\n      if (resetState) context.state = resetState\n      line.styles = highlighted.styles\n      let oldCls = line.styleClasses, newCls = highlighted.classes\n      if (newCls) line.styleClasses = newCls\n      else if (oldCls) line.styleClasses = null\n      let ischange = !oldStyles || oldStyles.length != line.styles.length ||\n        oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass)\n      for (let i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i]\n      if (ischange) changedLines.push(context.line)\n      line.stateAfter = context.save()\n      context.nextLine()\n    } else {\n      if (line.text.length <= cm.options.maxHighlightLength)\n        processLine(cm, line.text, context)\n      line.stateAfter = context.line % 5 == 0 ? context.save() : null\n      context.nextLine()\n    }\n    if (+new Date > end) {\n      startWorker(cm, cm.options.workDelay)\n      return true\n    }\n  })\n  doc.highlightFrontier = context.line\n  doc.modeFrontier = Math.max(doc.modeFrontier, context.line)\n  if (changedLines.length) runInOp(cm, () => {\n    for (let i = 0; i < changedLines.length; i++)\n      regLineChange(cm, changedLines[i], \"text\")\n  })\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/line_numbers.js",
    "content": "import { lineNumberFor } from \"../line/utils_line.js\"\nimport { compensateForHScroll } from \"../measurement/position_measurement.js\"\nimport { elt } from \"../util/dom.js\"\n\nimport { updateGutterSpace } from \"./update_display.js\"\n\n// Re-align line numbers and gutter marks to compensate for\n// horizontal scrolling.\nexport function alignHorizontally(cm) {\n  let display = cm.display, view = display.view\n  if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return\n  let comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft\n  let gutterW = display.gutters.offsetWidth, left = comp + \"px\"\n  for (let i = 0; i < view.length; i++) if (!view[i].hidden) {\n    if (cm.options.fixedGutter) {\n      if (view[i].gutter)\n        view[i].gutter.style.left = left\n      if (view[i].gutterBackground)\n        view[i].gutterBackground.style.left = left\n    }\n    let align = view[i].alignable\n    if (align) for (let j = 0; j < align.length; j++)\n      align[j].style.left = left\n  }\n  if (cm.options.fixedGutter)\n    display.gutters.style.left = (comp + gutterW) + \"px\"\n}\n\n// Used to ensure that the line number gutter is still the right\n// size for the current document size. Returns true when an update\n// is needed.\nexport function maybeUpdateLineNumberWidth(cm) {\n  if (!cm.options.lineNumbers) return false\n  let doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display\n  if (last.length != display.lineNumChars) {\n    let test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n                                               \"CodeMirror-linenumber CodeMirror-gutter-elt\"))\n    let innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW\n    display.lineGutter.style.width = \"\"\n    display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1\n    display.lineNumWidth = display.lineNumInnerWidth + padding\n    display.lineNumChars = display.lineNumInnerWidth ? last.length : -1\n    display.lineGutter.style.width = display.lineNumWidth + \"px\"\n    updateGutterSpace(cm.display)\n    return true\n  }\n  return false\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/mode_state.js",
    "content": "import { getMode } from \"../modes.js\"\n\nimport { startWorker } from \"./highlight_worker.js\"\nimport { regChange } from \"./view_tracking.js\"\n\n// Used to get the editor into a consistent state again when options change.\n\nexport function loadMode(cm) {\n  cm.doc.mode = getMode(cm.options, cm.doc.modeOption)\n  resetModeState(cm)\n}\n\nexport function resetModeState(cm) {\n  cm.doc.iter(line => {\n    if (line.stateAfter) line.stateAfter = null\n    if (line.styles) line.styles = null\n  })\n  cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first\n  startWorker(cm, 100)\n  cm.state.modeGen++\n  if (cm.curOp) regChange(cm)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/operations.js",
    "content": "import { clipPos } from \"../line/pos.js\"\nimport { findMaxLine } from \"../line/spans.js\"\nimport { displayWidth, measureChar, scrollGap } from \"../measurement/position_measurement.js\"\nimport { signal } from \"../util/event.js\"\nimport { activeElt } from \"../util/dom.js\"\nimport { finishOperation, pushOperation } from \"../util/operation_group.js\"\n\nimport { ensureFocus } from \"./focus.js\"\nimport { measureForScrollbars, updateScrollbars } from \"./scrollbars.js\"\nimport { restartBlink } from \"./selection.js\"\nimport { maybeScrollWindow, scrollPosIntoView, setScrollLeft, setScrollTop } from \"./scrolling.js\"\nimport { DisplayUpdate, maybeClipScrollbars, postUpdateDisplay, setDocumentHeight, updateDisplayIfNeeded } from \"./update_display.js\"\nimport { updateHeightsInViewport } from \"./update_lines.js\"\n\n// Operations are used to wrap a series of changes to the editor\n// state in such a way that each change won't have to update the\n// cursor and display (which would be awkward, slow, and\n// error-prone). Instead, display updates are batched and then all\n// combined and executed at once.\n\nlet nextOpId = 0\n// Start a new operation.\nexport function startOperation(cm) {\n  cm.curOp = {\n    cm: cm,\n    viewChanged: false,      // Flag that indicates that lines might need to be redrawn\n    startHeight: cm.doc.height, // Used to detect need to update scrollbar\n    forceUpdate: false,      // Used to force a redraw\n    updateInput: 0,       // Whether to reset the input textarea\n    typing: false,           // Whether this reset should be careful to leave existing text (for compositing)\n    changeObjs: null,        // Accumulated changes, for firing change events\n    cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n    cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n    selectionChanged: false, // Whether the selection needs to be redrawn\n    updateMaxLine: false,    // Set when the widest line needs to be determined anew\n    scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n    scrollToPos: null,       // Used to scroll to a specific position\n    focus: false,\n    id: ++nextOpId,          // Unique ID\n    markArrays: null         // Used by addMarkedSpan\n  }\n  pushOperation(cm.curOp)\n}\n\n// Finish an operation, updating the display and signalling delayed events\nexport function endOperation(cm) {\n  let op = cm.curOp\n  if (op) finishOperation(op, group => {\n    for (let i = 0; i < group.ops.length; i++)\n      group.ops[i].cm.curOp = null\n    endOperations(group)\n  })\n}\n\n// The DOM updates done when an operation finishes are batched so\n// that the minimum number of relayouts are required.\nfunction endOperations(group) {\n  let ops = group.ops\n  for (let i = 0; i < ops.length; i++) // Read DOM\n    endOperation_R1(ops[i])\n  for (let i = 0; i < ops.length; i++) // Write DOM (maybe)\n    endOperation_W1(ops[i])\n  for (let i = 0; i < ops.length; i++) // Read DOM\n    endOperation_R2(ops[i])\n  for (let i = 0; i < ops.length; i++) // Write DOM (maybe)\n    endOperation_W2(ops[i])\n  for (let i = 0; i < ops.length; i++) // Read DOM\n    endOperation_finish(ops[i])\n}\n\nfunction endOperation_R1(op) {\n  let cm = op.cm, display = cm.display\n  maybeClipScrollbars(cm)\n  if (op.updateMaxLine) findMaxLine(cm)\n\n  op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n    op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n                       op.scrollToPos.to.line >= display.viewTo) ||\n    display.maxLineChanged && cm.options.lineWrapping\n  op.update = op.mustUpdate &&\n    new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate)\n}\n\nfunction endOperation_W1(op) {\n  op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update)\n}\n\nfunction endOperation_R2(op) {\n  let cm = op.cm, display = cm.display\n  if (op.updatedDisplay) updateHeightsInViewport(cm)\n\n  op.barMeasure = measureForScrollbars(cm)\n\n  // If the max line changed since it was last measured, measure it,\n  // and ensure the document's width matches it.\n  // updateDisplay_W2 will use these properties to do the actual resizing\n  if (display.maxLineChanged && !cm.options.lineWrapping) {\n    op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3\n    cm.display.sizerWidth = op.adjustWidthTo\n    op.barMeasure.scrollWidth =\n      Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth)\n    op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm))\n  }\n\n  if (op.updatedDisplay || op.selectionChanged)\n    op.preparedSelection = display.input.prepareSelection()\n}\n\nfunction endOperation_W2(op) {\n  let cm = op.cm\n\n  if (op.adjustWidthTo != null) {\n    cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\"\n    if (op.maxScrollLeft < cm.doc.scrollLeft)\n      setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true)\n    cm.display.maxLineChanged = false\n  }\n\n  let takeFocus = op.focus && op.focus == activeElt()\n  if (op.preparedSelection)\n    cm.display.input.showSelection(op.preparedSelection, takeFocus)\n  if (op.updatedDisplay || op.startHeight != cm.doc.height)\n    updateScrollbars(cm, op.barMeasure)\n  if (op.updatedDisplay)\n    setDocumentHeight(cm, op.barMeasure)\n\n  if (op.selectionChanged) restartBlink(cm)\n\n  if (cm.state.focused && op.updateInput)\n    cm.display.input.reset(op.typing)\n  if (takeFocus) ensureFocus(op.cm)\n}\n\nfunction endOperation_finish(op) {\n  let cm = op.cm, display = cm.display, doc = cm.doc\n\n  if (op.updatedDisplay) postUpdateDisplay(cm, op.update)\n\n  // Abort mouse wheel delta measurement, when scrolling explicitly\n  if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n    display.wheelStartX = display.wheelStartY = null\n\n  // Propagate the scroll position to the actual DOM scroller\n  if (op.scrollTop != null) setScrollTop(cm, op.scrollTop, op.forceScroll)\n\n  if (op.scrollLeft != null) setScrollLeft(cm, op.scrollLeft, true, true)\n  // If we need to scroll a specific position into view, do so.\n  if (op.scrollToPos) {\n    let rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n                                 clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin)\n    maybeScrollWindow(cm, rect)\n  }\n\n  // Fire events for markers that are hidden/unidden by editing or\n  // undoing\n  let hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers\n  if (hidden) for (let i = 0; i < hidden.length; ++i)\n    if (!hidden[i].lines.length) signal(hidden[i], \"hide\")\n  if (unhidden) for (let i = 0; i < unhidden.length; ++i)\n    if (unhidden[i].lines.length) signal(unhidden[i], \"unhide\")\n\n  if (display.wrapper.offsetHeight)\n    doc.scrollTop = cm.display.scroller.scrollTop\n\n  // Fire change events, and delayed event handlers\n  if (op.changeObjs)\n    signal(cm, \"changes\", cm, op.changeObjs)\n  if (op.update)\n    op.update.finish()\n}\n\n// Run the given function in an operation\nexport function runInOp(cm, f) {\n  if (cm.curOp) return f()\n  startOperation(cm)\n  try { return f() }\n  finally { endOperation(cm) }\n}\n// Wraps a function in an operation. Returns the wrapped function.\nexport function operation(cm, f) {\n  return function() {\n    if (cm.curOp) return f.apply(cm, arguments)\n    startOperation(cm)\n    try { return f.apply(cm, arguments) }\n    finally { endOperation(cm) }\n  }\n}\n// Used to add methods to editor and doc instances, wrapping them in\n// operations.\nexport function methodOp(f) {\n  return function() {\n    if (this.curOp) return f.apply(this, arguments)\n    startOperation(this)\n    try { return f.apply(this, arguments) }\n    finally { endOperation(this) }\n  }\n}\nexport function docMethodOp(f) {\n  return function() {\n    let cm = this.cm\n    if (!cm || cm.curOp) return f.apply(this, arguments)\n    startOperation(cm)\n    try { return f.apply(this, arguments) }\n    finally { endOperation(cm) }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/scroll_events.js",
    "content": "import { chrome, gecko, ie, mac, presto, safari, webkit } from \"../util/browser.js\"\nimport { e_preventDefault } from \"../util/event.js\"\n\nimport { updateDisplaySimple } from \"./update_display.js\"\nimport { setScrollLeft, updateScrollTop } from \"./scrolling.js\"\n\n// Since the delta values reported on mouse wheel events are\n// unstandardized between browsers and even browser versions, and\n// generally horribly unpredictable, this code starts by measuring\n// the scroll effect that the first few mouse wheel events have,\n// and, from that, detects the way it can convert deltas to pixel\n// offsets afterwards.\n//\n// The reason we want to know the amount a wheel event will scroll\n// is that it gives us a chance to update the display before the\n// actual scrolling happens, reducing flickering.\n\nlet wheelSamples = 0, wheelPixelsPerUnit = null\n// Fill in a browser-detected starting value on browsers where we\n// know one. These don't have to be accurate -- the result of them\n// being wrong would just be a slight flicker on the first wheel\n// scroll (if it is large enough).\nif (ie) wheelPixelsPerUnit = -.53\nelse if (gecko) wheelPixelsPerUnit = 15\nelse if (chrome) wheelPixelsPerUnit = -.7\nelse if (safari) wheelPixelsPerUnit = -1/3\n\nfunction wheelEventDelta(e) {\n  let dx = e.wheelDeltaX, dy = e.wheelDeltaY\n  if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail\n  if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail\n  else if (dy == null) dy = e.wheelDelta\n  return {x: dx, y: dy}\n}\nexport function wheelEventPixels(e) {\n  let delta = wheelEventDelta(e)\n  delta.x *= wheelPixelsPerUnit\n  delta.y *= wheelPixelsPerUnit\n  return delta\n}\n\nexport function onScrollWheel(cm, e) {\n  let delta = wheelEventDelta(e), dx = delta.x, dy = delta.y\n  let pixelsPerUnit = wheelPixelsPerUnit\n  if (e.deltaMode === 0) {\n    dx = e.deltaX\n    dy = e.deltaY\n    pixelsPerUnit = 1\n  }\n\n  let display = cm.display, scroll = display.scroller\n  // Quit if there's nothing to scroll here\n  let canScrollX = scroll.scrollWidth > scroll.clientWidth\n  let canScrollY = scroll.scrollHeight > scroll.clientHeight\n  if (!(dx && canScrollX || dy && canScrollY)) return\n\n  // Webkit browsers on OS X abort momentum scrolls when the target\n  // of the scroll event is removed from the scrollable element.\n  // This hack (see related code in patchDisplay) makes sure the\n  // element is kept around.\n  if (dy && mac && webkit) {\n    outer: for (let cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n      for (let i = 0; i < view.length; i++) {\n        if (view[i].node == cur) {\n          cm.display.currentWheelTarget = cur\n          break outer\n        }\n      }\n    }\n  }\n\n  // On some browsers, horizontal scrolling will cause redraws to\n  // happen before the gutter has been realigned, causing it to\n  // wriggle around in a most unseemly way. When we have an\n  // estimated pixels/delta value, we just handle horizontal\n  // scrolling entirely here. It'll be slightly off from native, but\n  // better than glitching out.\n  if (dx && !gecko && !presto && pixelsPerUnit != null) {\n    if (dy && canScrollY)\n      updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit))\n    setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit))\n    // Only prevent default scrolling if vertical scrolling is\n    // actually possible. Otherwise, it causes vertical scroll\n    // jitter on OSX trackpads when deltaX is small and deltaY\n    // is large (issue #3579)\n    if (!dy || (dy && canScrollY))\n      e_preventDefault(e)\n    display.wheelStartX = null // Abort measurement, if in progress\n    return\n  }\n\n  // 'Project' the visible viewport to cover the area that is being\n  // scrolled into view (if we know enough to estimate it).\n  if (dy && pixelsPerUnit != null) {\n    let pixels = dy * pixelsPerUnit\n    let top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight\n    if (pixels < 0) top = Math.max(0, top + pixels - 50)\n    else bot = Math.min(cm.doc.height, bot + pixels + 50)\n    updateDisplaySimple(cm, {top: top, bottom: bot})\n  }\n\n  if (wheelSamples < 20 && e.deltaMode !== 0) {\n    if (display.wheelStartX == null) {\n      display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop\n      display.wheelDX = dx; display.wheelDY = dy\n      setTimeout(() => {\n        if (display.wheelStartX == null) return\n        let movedX = scroll.scrollLeft - display.wheelStartX\n        let movedY = scroll.scrollTop - display.wheelStartY\n        let sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n          (movedX && display.wheelDX && movedX / display.wheelDX)\n        display.wheelStartX = display.wheelStartY = null\n        if (!sample) return\n        wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1)\n        ++wheelSamples\n      }, 200)\n    } else {\n      display.wheelDX += dx; display.wheelDY += dy\n    }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/scrollbars.js",
    "content": "import { addClass, elt, rmClass } from \"../util/dom.js\"\nimport { on } from \"../util/event.js\"\nimport { scrollGap, paddingVert } from \"../measurement/position_measurement.js\"\nimport { ie, ie_version, mac, mac_geMountainLion } from \"../util/browser.js\"\nimport { updateHeightsInViewport } from \"./update_lines.js\"\nimport { Delayed } from \"../util/misc.js\"\n\nimport { setScrollLeft, updateScrollTop } from \"./scrolling.js\"\n\n// SCROLLBARS\n\n// Prepare DOM reads needed to update the scrollbars. Done in one\n// shot to minimize update/measure roundtrips.\nexport function measureForScrollbars(cm) {\n  let d = cm.display, gutterW = d.gutters.offsetWidth\n  let docH = Math.round(cm.doc.height + paddingVert(cm.display))\n  return {\n    clientHeight: d.scroller.clientHeight,\n    viewHeight: d.wrapper.clientHeight,\n    scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,\n    viewWidth: d.wrapper.clientWidth,\n    barLeft: cm.options.fixedGutter ? gutterW : 0,\n    docHeight: docH,\n    scrollHeight: docH + scrollGap(cm) + d.barHeight,\n    nativeBarWidth: d.nativeBarWidth,\n    gutterWidth: gutterW\n  }\n}\n\nclass NativeScrollbars {\n  constructor(place, scroll, cm) {\n    this.cm = cm\n    let vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\")\n    let horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\")\n    vert.tabIndex = horiz.tabIndex = -1\n    place(vert); place(horiz)\n\n    on(vert, \"scroll\", () => {\n      if (vert.clientHeight) scroll(vert.scrollTop, \"vertical\")\n    })\n    on(horiz, \"scroll\", () => {\n      if (horiz.clientWidth) scroll(horiz.scrollLeft, \"horizontal\")\n    })\n\n    this.checkedZeroWidth = false\n    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n    if (ie && ie_version < 8) this.horiz.style.minHeight = this.vert.style.minWidth = \"18px\"\n  }\n\n  update(measure) {\n    let needsH = measure.scrollWidth > measure.clientWidth + 1\n    let needsV = measure.scrollHeight > measure.clientHeight + 1\n    let sWidth = measure.nativeBarWidth\n\n    if (needsV) {\n      this.vert.style.display = \"block\"\n      this.vert.style.bottom = needsH ? sWidth + \"px\" : \"0\"\n      let totalHeight = measure.viewHeight - (needsH ? sWidth : 0)\n      // A bug in IE8 can cause this value to be negative, so guard it.\n      this.vert.firstChild.style.height =\n        Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + \"px\"\n    } else {\n      this.vert.scrollTop = 0\n      this.vert.style.display = \"\"\n      this.vert.firstChild.style.height = \"0\"\n    }\n\n    if (needsH) {\n      this.horiz.style.display = \"block\"\n      this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\"\n      this.horiz.style.left = measure.barLeft + \"px\"\n      let totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0)\n      this.horiz.firstChild.style.width =\n        Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\"\n    } else {\n      this.horiz.style.display = \"\"\n      this.horiz.firstChild.style.width = \"0\"\n    }\n\n    if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n      if (sWidth == 0) this.zeroWidthHack()\n      this.checkedZeroWidth = true\n    }\n\n    return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}\n  }\n\n  setScrollLeft(pos) {\n    if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos\n    if (this.disableHoriz) this.enableZeroWidthBar(this.horiz, this.disableHoriz, \"horiz\")\n  }\n\n  setScrollTop(pos) {\n    if (this.vert.scrollTop != pos) this.vert.scrollTop = pos\n    if (this.disableVert) this.enableZeroWidthBar(this.vert, this.disableVert, \"vert\")\n  }\n\n  zeroWidthHack() {\n    let w = mac && !mac_geMountainLion ? \"12px\" : \"18px\"\n    this.horiz.style.height = this.vert.style.width = w\n    this.horiz.style.pointerEvents = this.vert.style.pointerEvents = \"none\"\n    this.disableHoriz = new Delayed\n    this.disableVert = new Delayed\n  }\n\n  enableZeroWidthBar(bar, delay, type) {\n    bar.style.pointerEvents = \"auto\"\n    function maybeDisable() {\n      // To find out whether the scrollbar is still visible, we\n      // check whether the element under the pixel in the bottom\n      // right corner of the scrollbar box is the scrollbar box\n      // itself (when the bar is still visible) or its filler child\n      // (when the bar is hidden). If it is still visible, we keep\n      // it enabled, if it's hidden, we disable pointer events.\n      let box = bar.getBoundingClientRect()\n      let elt = type == \"vert\" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)\n          : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1)\n      if (elt != bar) bar.style.pointerEvents = \"none\"\n      else delay.set(1000, maybeDisable)\n    }\n    delay.set(1000, maybeDisable)\n  }\n\n  clear() {\n    let parent = this.horiz.parentNode\n    parent.removeChild(this.horiz)\n    parent.removeChild(this.vert)\n  }\n}\n\nclass NullScrollbars {\n  update() { return {bottom: 0, right: 0} }\n  setScrollLeft() {}\n  setScrollTop() {}\n  clear() {}\n}\n\nexport function updateScrollbars(cm, measure) {\n  if (!measure) measure = measureForScrollbars(cm)\n  let startWidth = cm.display.barWidth, startHeight = cm.display.barHeight\n  updateScrollbarsInner(cm, measure)\n  for (let i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {\n    if (startWidth != cm.display.barWidth && cm.options.lineWrapping)\n      updateHeightsInViewport(cm)\n    updateScrollbarsInner(cm, measureForScrollbars(cm))\n    startWidth = cm.display.barWidth; startHeight = cm.display.barHeight\n  }\n}\n\n// Re-synchronize the fake scrollbars with the actual size of the\n// content.\nfunction updateScrollbarsInner(cm, measure) {\n  let d = cm.display\n  let sizes = d.scrollbars.update(measure)\n\n  d.sizer.style.paddingRight = (d.barWidth = sizes.right) + \"px\"\n  d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + \"px\"\n  d.heightForcer.style.borderBottom = sizes.bottom + \"px solid transparent\"\n\n  if (sizes.right && sizes.bottom) {\n    d.scrollbarFiller.style.display = \"block\"\n    d.scrollbarFiller.style.height = sizes.bottom + \"px\"\n    d.scrollbarFiller.style.width = sizes.right + \"px\"\n  } else d.scrollbarFiller.style.display = \"\"\n  if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n    d.gutterFiller.style.display = \"block\"\n    d.gutterFiller.style.height = sizes.bottom + \"px\"\n    d.gutterFiller.style.width = measure.gutterWidth + \"px\"\n  } else d.gutterFiller.style.display = \"\"\n}\n\nexport let scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars}\n\nexport function initScrollbars(cm) {\n  if (cm.display.scrollbars) {\n    cm.display.scrollbars.clear()\n    if (cm.display.scrollbars.addClass)\n      rmClass(cm.display.wrapper, cm.display.scrollbars.addClass)\n  }\n\n  cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](node => {\n    cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller)\n    // Prevent clicks in the scrollbars from killing focus\n    on(node, \"mousedown\", () => {\n      if (cm.state.focused) setTimeout(() => cm.display.input.focus(), 0)\n    })\n    node.setAttribute(\"cm-not-content\", \"true\")\n  }, (pos, axis) => {\n    if (axis == \"horizontal\") setScrollLeft(cm, pos)\n    else updateScrollTop(cm, pos)\n  }, cm)\n  if (cm.display.scrollbars.addClass)\n    addClass(cm.display.wrapper, cm.display.scrollbars.addClass)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/scrolling.js",
    "content": "import { Pos } from \"../line/pos.js\"\nimport { cursorCoords, displayHeight, displayWidth, estimateCoords, paddingTop, paddingVert, scrollGap, textHeight } from \"../measurement/position_measurement.js\"\nimport { gecko, phantom } from \"../util/browser.js\"\nimport { elt } from \"../util/dom.js\"\nimport { signalDOMEvent } from \"../util/event.js\"\n\nimport { startWorker } from \"./highlight_worker.js\"\nimport { alignHorizontally } from \"./line_numbers.js\"\nimport { updateDisplaySimple } from \"./update_display.js\"\n\n// SCROLLING THINGS INTO VIEW\n\n// If an editor sits on the top or bottom of the window, partially\n// scrolled out of view, this ensures that the cursor is visible.\nexport function maybeScrollWindow(cm, rect) {\n  if (signalDOMEvent(cm, \"scrollCursorIntoView\")) return\n\n  let display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null\n  if (rect.top + box.top < 0) doScroll = true\n  else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false\n  if (doScroll != null && !phantom) {\n    let scrollNode = elt(\"div\", \"\\u200b\", null, `position: absolute;\n                         top: ${rect.top - display.viewOffset - paddingTop(cm.display)}px;\n                         height: ${rect.bottom - rect.top + scrollGap(cm) + display.barHeight}px;\n                         left: ${rect.left}px; width: ${Math.max(2, rect.right - rect.left)}px;`)\n    cm.display.lineSpace.appendChild(scrollNode)\n    scrollNode.scrollIntoView(doScroll)\n    cm.display.lineSpace.removeChild(scrollNode)\n  }\n}\n\n// Scroll a given position into view (immediately), verifying that\n// it actually became visible (as line heights are accurately\n// measured, the position of something may 'drift' during drawing).\nexport function scrollPosIntoView(cm, pos, end, margin) {\n  if (margin == null) margin = 0\n  let rect\n  if (!cm.options.lineWrapping && pos == end) {\n    // Set pos and end to the cursor positions around the character pos sticks to\n    // If pos.sticky == \"before\", that is around pos.ch - 1, otherwise around pos.ch\n    // If pos == Pos(_, 0, \"before\"), pos and end are unchanged\n    end = pos.sticky == \"before\" ? Pos(pos.line, pos.ch + 1, \"before\") : pos\n    pos = pos.ch ? Pos(pos.line, pos.sticky == \"before\" ? pos.ch - 1 : pos.ch, \"after\") : pos\n  }\n  for (let limit = 0; limit < 5; limit++) {\n    let changed = false\n    let coords = cursorCoords(cm, pos)\n    let endCoords = !end || end == pos ? coords : cursorCoords(cm, end)\n    rect = {left: Math.min(coords.left, endCoords.left),\n            top: Math.min(coords.top, endCoords.top) - margin,\n            right: Math.max(coords.left, endCoords.left),\n            bottom: Math.max(coords.bottom, endCoords.bottom) + margin}\n    let scrollPos = calculateScrollPos(cm, rect)\n    let startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft\n    if (scrollPos.scrollTop != null) {\n      updateScrollTop(cm, scrollPos.scrollTop)\n      if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true\n    }\n    if (scrollPos.scrollLeft != null) {\n      setScrollLeft(cm, scrollPos.scrollLeft)\n      if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true\n    }\n    if (!changed) break\n  }\n  return rect\n}\n\n// Scroll a given set of coordinates into view (immediately).\nexport function scrollIntoView(cm, rect) {\n  let scrollPos = calculateScrollPos(cm, rect)\n  if (scrollPos.scrollTop != null) updateScrollTop(cm, scrollPos.scrollTop)\n  if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft)\n}\n\n// Calculate a new scroll position needed to scroll the given\n// rectangle into view. Returns an object with scrollTop and\n// scrollLeft properties. When these are undefined, the\n// vertical/horizontal position does not need to be adjusted.\nfunction calculateScrollPos(cm, rect) {\n  let display = cm.display, snapMargin = textHeight(cm.display)\n  if (rect.top < 0) rect.top = 0\n  let screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop\n  let screen = displayHeight(cm), result = {}\n  if (rect.bottom - rect.top > screen) rect.bottom = rect.top + screen\n  let docBottom = cm.doc.height + paddingVert(display)\n  let atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin\n  if (rect.top < screentop) {\n    result.scrollTop = atTop ? 0 : rect.top\n  } else if (rect.bottom > screentop + screen) {\n    let newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen)\n    if (newTop != screentop) result.scrollTop = newTop\n  }\n\n  let gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth\n  let screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace\n  let screenw = displayWidth(cm) - display.gutters.offsetWidth\n  let tooWide = rect.right - rect.left > screenw\n  if (tooWide) rect.right = rect.left + screenw\n  if (rect.left < 10)\n    result.scrollLeft = 0\n  else if (rect.left < screenleft)\n    result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10))\n  else if (rect.right > screenw + screenleft - 3)\n    result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw\n  return result\n}\n\n// Store a relative adjustment to the scroll position in the current\n// operation (to be applied when the operation finishes).\nexport function addToScrollTop(cm, top) {\n  if (top == null) return\n  resolveScrollToPos(cm)\n  cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top\n}\n\n// Make sure that at the end of the operation the current cursor is\n// shown.\nexport function ensureCursorVisible(cm) {\n  resolveScrollToPos(cm)\n  let cur = cm.getCursor()\n  cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}\n}\n\nexport function scrollToCoords(cm, x, y) {\n  if (x != null || y != null) resolveScrollToPos(cm)\n  if (x != null) cm.curOp.scrollLeft = x\n  if (y != null) cm.curOp.scrollTop = y\n}\n\nexport function scrollToRange(cm, range) {\n  resolveScrollToPos(cm)\n  cm.curOp.scrollToPos = range\n}\n\n// When an operation has its scrollToPos property set, and another\n// scroll action is applied before the end of the operation, this\n// 'simulates' scrolling that position into view in a cheap way, so\n// that the effect of intermediate scroll commands is not ignored.\nfunction resolveScrollToPos(cm) {\n  let range = cm.curOp.scrollToPos\n  if (range) {\n    cm.curOp.scrollToPos = null\n    let from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to)\n    scrollToCoordsRange(cm, from, to, range.margin)\n  }\n}\n\nexport function scrollToCoordsRange(cm, from, to, margin) {\n  let sPos = calculateScrollPos(cm, {\n    left: Math.min(from.left, to.left),\n    top: Math.min(from.top, to.top) - margin,\n    right: Math.max(from.right, to.right),\n    bottom: Math.max(from.bottom, to.bottom) + margin\n  })\n  scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop)\n}\n\n// Sync the scrollable area and scrollbars, ensure the viewport\n// covers the visible area.\nexport function updateScrollTop(cm, val) {\n  if (Math.abs(cm.doc.scrollTop - val) < 2) return\n  if (!gecko) updateDisplaySimple(cm, {top: val})\n  setScrollTop(cm, val, true)\n  if (gecko) updateDisplaySimple(cm)\n  startWorker(cm, 100)\n}\n\nexport function setScrollTop(cm, val, forceScroll) {\n  val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val))\n  if (cm.display.scroller.scrollTop == val && !forceScroll) return\n  cm.doc.scrollTop = val\n  cm.display.scrollbars.setScrollTop(val)\n  if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val\n}\n\n// Sync scroller and scrollbar, ensure the gutter elements are\n// aligned.\nexport function setScrollLeft(cm, val, isScroller, forceScroll) {\n  val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth))\n  if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) return\n  cm.doc.scrollLeft = val\n  alignHorizontally(cm)\n  if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val\n  cm.display.scrollbars.setScrollLeft(val)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/selection.js",
    "content": "import { Pos } from \"../line/pos.js\"\nimport { visualLine } from \"../line/spans.js\"\nimport { getLine } from \"../line/utils_line.js\"\nimport { charCoords, cursorCoords, displayWidth, paddingH, wrappedLineExtentChar } from \"../measurement/position_measurement.js\"\nimport { getOrder, iterateBidiSections } from \"../util/bidi.js\"\nimport { elt } from \"../util/dom.js\"\nimport { onBlur } from \"./focus.js\"\n\nexport function updateSelection(cm) {\n  cm.display.input.showSelection(cm.display.input.prepareSelection())\n}\n\nexport function prepareSelection(cm, primary = true) {\n  let doc = cm.doc, result = {}\n  let curFragment = result.cursors = document.createDocumentFragment()\n  let selFragment = result.selection = document.createDocumentFragment()\n\n  let customCursor = cm.options.$customCursor\n  if (customCursor) primary = true\n  for (let i = 0; i < doc.sel.ranges.length; i++) {\n    if (!primary && i == doc.sel.primIndex) continue\n    let range = doc.sel.ranges[i]\n    if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) continue\n    let collapsed = range.empty()\n    if (customCursor) {\n      let head = customCursor(cm, range)\n      if (head) drawSelectionCursor(cm, head, curFragment)\n    } else if (collapsed || cm.options.showCursorWhenSelecting) {\n      drawSelectionCursor(cm, range.head, curFragment)\n    }\n    if (!collapsed)\n      drawSelectionRange(cm, range, selFragment)\n  }\n  return result\n}\n\n// Draws a cursor for the given range\nexport function drawSelectionCursor(cm, head, output) {\n  let pos = cursorCoords(cm, head, \"div\", null, null, !cm.options.singleCursorHeightPerLine)\n\n  let cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"))\n  cursor.style.left = pos.left + \"px\"\n  cursor.style.top = pos.top + \"px\"\n  cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\"\n\n  if (/\\bcm-fat-cursor\\b/.test(cm.getWrapperElement().className)) {\n    let charPos = charCoords(cm, head, \"div\", null, null)\n    let width = charPos.right - charPos.left\n    cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + \"px\"\n  }\n\n  if (pos.other) {\n    // Secondary cursor, shown when on a 'jump' in bi-directional text\n    let otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"))\n    otherCursor.style.display = \"\"\n    otherCursor.style.left = pos.other.left + \"px\"\n    otherCursor.style.top = pos.other.top + \"px\"\n    otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\"\n  }\n}\n\nfunction cmpCoords(a, b) { return a.top - b.top || a.left - b.left }\n\n// Draws the given range as a highlighted selection\nfunction drawSelectionRange(cm, range, output) {\n  let display = cm.display, doc = cm.doc\n  let fragment = document.createDocumentFragment()\n  let padding = paddingH(cm.display), leftSide = padding.left\n  let rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right\n  let docLTR = doc.direction == \"ltr\"\n\n  function add(left, top, width, bottom) {\n    if (top < 0) top = 0\n    top = Math.round(top)\n    bottom = Math.round(bottom)\n    fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", `position: absolute; left: ${left}px;\n                             top: ${top}px; width: ${width == null ? rightSide - left : width}px;\n                             height: ${bottom - top}px`))\n  }\n\n  function drawForLine(line, fromArg, toArg) {\n    let lineObj = getLine(doc, line)\n    let lineLen = lineObj.text.length\n    let start, end\n    function coords(ch, bias) {\n      return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias)\n    }\n\n    function wrapX(pos, dir, side) {\n      let extent = wrappedLineExtentChar(cm, lineObj, null, pos)\n      let prop = (dir == \"ltr\") == (side == \"after\") ? \"left\" : \"right\"\n      let ch = side == \"after\" ? extent.begin : extent.end - (/\\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1)\n      return coords(ch, prop)[prop]\n    }\n\n    let order = getOrder(lineObj, doc.direction)\n    iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, (from, to, dir, i) => {\n      let ltr = dir == \"ltr\"\n      let fromPos = coords(from, ltr ? \"left\" : \"right\")\n      let toPos = coords(to - 1, ltr ? \"right\" : \"left\")\n\n      let openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen\n      let first = i == 0, last = !order || i == order.length - 1\n      if (toPos.top - fromPos.top <= 3) { // Single line\n        let openLeft = (docLTR ? openStart : openEnd) && first\n        let openRight = (docLTR ? openEnd : openStart) && last\n        let left = openLeft ? leftSide : (ltr ? fromPos : toPos).left\n        let right = openRight ? rightSide : (ltr ? toPos : fromPos).right\n        add(left, fromPos.top, right - left, fromPos.bottom)\n      } else { // Multiple lines\n        let topLeft, topRight, botLeft, botRight\n        if (ltr) {\n          topLeft = docLTR && openStart && first ? leftSide : fromPos.left\n          topRight = docLTR ? rightSide : wrapX(from, dir, \"before\")\n          botLeft = docLTR ? leftSide : wrapX(to, dir, \"after\")\n          botRight = docLTR && openEnd && last ? rightSide : toPos.right\n        } else {\n          topLeft = !docLTR ? leftSide : wrapX(from, dir, \"before\")\n          topRight = !docLTR && openStart && first ? rightSide : fromPos.right\n          botLeft = !docLTR && openEnd && last ? leftSide : toPos.left\n          botRight = !docLTR ? rightSide : wrapX(to, dir, \"after\")\n        }\n        add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom)\n        if (fromPos.bottom < toPos.top) add(leftSide, fromPos.bottom, null, toPos.top)\n        add(botLeft, toPos.top, botRight - botLeft, toPos.bottom)\n      }\n\n      if (!start || cmpCoords(fromPos, start) < 0) start = fromPos\n      if (cmpCoords(toPos, start) < 0) start = toPos\n      if (!end || cmpCoords(fromPos, end) < 0) end = fromPos\n      if (cmpCoords(toPos, end) < 0) end = toPos\n    })\n    return {start: start, end: end}\n  }\n\n  let sFrom = range.from(), sTo = range.to()\n  if (sFrom.line == sTo.line) {\n    drawForLine(sFrom.line, sFrom.ch, sTo.ch)\n  } else {\n    let fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line)\n    let singleVLine = visualLine(fromLine) == visualLine(toLine)\n    let leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end\n    let rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start\n    if (singleVLine) {\n      if (leftEnd.top < rightStart.top - 2) {\n        add(leftEnd.right, leftEnd.top, null, leftEnd.bottom)\n        add(leftSide, rightStart.top, rightStart.left, rightStart.bottom)\n      } else {\n        add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom)\n      }\n    }\n    if (leftEnd.bottom < rightStart.top)\n      add(leftSide, leftEnd.bottom, null, rightStart.top)\n  }\n\n  output.appendChild(fragment)\n}\n\n// Cursor-blinking\nexport function restartBlink(cm) {\n  if (!cm.state.focused) return\n  let display = cm.display\n  clearInterval(display.blinker)\n  let on = true\n  display.cursorDiv.style.visibility = \"\"\n  if (cm.options.cursorBlinkRate > 0)\n    display.blinker = setInterval(() => {\n      if (!cm.hasFocus()) onBlur(cm)\n      display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\"\n    }, cm.options.cursorBlinkRate)\n  else if (cm.options.cursorBlinkRate < 0)\n    display.cursorDiv.style.visibility = \"hidden\"\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/update_display.js",
    "content": "import { sawCollapsedSpans } from \"../line/saw_special_spans.js\"\nimport { heightAtLine, visualLineEndNo, visualLineNo } from \"../line/spans.js\"\nimport { getLine, lineNumberFor } from \"../line/utils_line.js\"\nimport { displayHeight, displayWidth, getDimensions, paddingVert, scrollGap } from \"../measurement/position_measurement.js\"\nimport { mac, webkit } from \"../util/browser.js\"\nimport { activeElt, removeChildren, contains } from \"../util/dom.js\"\nimport { hasHandler, signal } from \"../util/event.js\"\nimport { signalLater } from \"../util/operation_group.js\"\nimport { indexOf } from \"../util/misc.js\"\n\nimport { buildLineElement, updateLineForChanges } from \"./update_line.js\"\nimport { startWorker } from \"./highlight_worker.js\"\nimport { maybeUpdateLineNumberWidth } from \"./line_numbers.js\"\nimport { measureForScrollbars, updateScrollbars } from \"./scrollbars.js\"\nimport { updateSelection } from \"./selection.js\"\nimport { updateHeightsInViewport, visibleLines } from \"./update_lines.js\"\nimport { adjustView, countDirtyView, resetView } from \"./view_tracking.js\"\n\n// DISPLAY DRAWING\n\nexport class DisplayUpdate {\n  constructor(cm, viewport, force) {\n    let display = cm.display\n\n    this.viewport = viewport\n    // Store some values that we'll need later (but don't want to force a relayout for)\n    this.visible = visibleLines(display, cm.doc, viewport)\n    this.editorIsHidden = !display.wrapper.offsetWidth\n    this.wrapperHeight = display.wrapper.clientHeight\n    this.wrapperWidth = display.wrapper.clientWidth\n    this.oldDisplayWidth = displayWidth(cm)\n    this.force = force\n    this.dims = getDimensions(cm)\n    this.events = []\n  }\n\n  signal(emitter, type) {\n    if (hasHandler(emitter, type))\n      this.events.push(arguments)\n  }\n  finish() {\n    for (let i = 0; i < this.events.length; i++)\n      signal.apply(null, this.events[i])\n  }\n}\n\nexport function maybeClipScrollbars(cm) {\n  let display = cm.display\n  if (!display.scrollbarsClipped && display.scroller.offsetWidth) {\n    display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth\n    display.heightForcer.style.height = scrollGap(cm) + \"px\"\n    display.sizer.style.marginBottom = -display.nativeBarWidth + \"px\"\n    display.sizer.style.borderRightWidth = scrollGap(cm) + \"px\"\n    display.scrollbarsClipped = true\n  }\n}\n\nfunction selectionSnapshot(cm) {\n  if (cm.hasFocus()) return null\n  let active = activeElt()\n  if (!active || !contains(cm.display.lineDiv, active)) return null\n  let result = {activeElt: active}\n  if (window.getSelection) {\n    let sel = window.getSelection()\n    if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {\n      result.anchorNode = sel.anchorNode\n      result.anchorOffset = sel.anchorOffset\n      result.focusNode = sel.focusNode\n      result.focusOffset = sel.focusOffset\n    }\n  }\n  return result\n}\n\nfunction restoreSelection(snapshot) {\n  if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) return\n  snapshot.activeElt.focus()\n  if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&\n      snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {\n    let sel = window.getSelection(), range = document.createRange()\n    range.setEnd(snapshot.anchorNode, snapshot.anchorOffset)\n    range.collapse(false)\n    sel.removeAllRanges()\n    sel.addRange(range)\n    sel.extend(snapshot.focusNode, snapshot.focusOffset)\n  }\n}\n\n// Does the actual updating of the line display. Bails out\n// (returning false) when there is nothing to be done and forced is\n// false.\nexport function updateDisplayIfNeeded(cm, update) {\n  let display = cm.display, doc = cm.doc\n\n  if (update.editorIsHidden) {\n    resetView(cm)\n    return false\n  }\n\n  // Bail out if the visible area is already rendered and nothing changed.\n  if (!update.force &&\n      update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n      (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n      display.renderedView == display.view && countDirtyView(cm) == 0)\n    return false\n\n  if (maybeUpdateLineNumberWidth(cm)) {\n    resetView(cm)\n    update.dims = getDimensions(cm)\n  }\n\n  // Compute a suitable new viewport (from & to)\n  let end = doc.first + doc.size\n  let from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first)\n  let to = Math.min(end, update.visible.to + cm.options.viewportMargin)\n  if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom)\n  if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo)\n  if (sawCollapsedSpans) {\n    from = visualLineNo(cm.doc, from)\n    to = visualLineEndNo(cm.doc, to)\n  }\n\n  let different = from != display.viewFrom || to != display.viewTo ||\n    display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth\n  adjustView(cm, from, to)\n\n  display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom))\n  // Position the mover div to align with the current scroll position\n  cm.display.mover.style.top = display.viewOffset + \"px\"\n\n  let toUpdate = countDirtyView(cm)\n  if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&\n      (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n    return false\n\n  // For big changes, we hide the enclosing element during the\n  // update, since that speeds up the operations on most browsers.\n  let selSnapshot = selectionSnapshot(cm)\n  if (toUpdate > 4) display.lineDiv.style.display = \"none\"\n  patchDisplay(cm, display.updateLineNumbers, update.dims)\n  if (toUpdate > 4) display.lineDiv.style.display = \"\"\n  display.renderedView = display.view\n  // There might have been a widget with a focused element that got\n  // hidden or updated, if so re-focus it.\n  restoreSelection(selSnapshot)\n\n  // Prevent selection and cursors from interfering with the scroll\n  // width and height.\n  removeChildren(display.cursorDiv)\n  removeChildren(display.selectionDiv)\n  display.gutters.style.height = display.sizer.style.minHeight = 0\n\n  if (different) {\n    display.lastWrapHeight = update.wrapperHeight\n    display.lastWrapWidth = update.wrapperWidth\n    startWorker(cm, 400)\n  }\n\n  display.updateLineNumbers = null\n\n  return true\n}\n\nexport function postUpdateDisplay(cm, update) {\n  let viewport = update.viewport\n\n  for (let first = true;; first = false) {\n    if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {\n      // Clip forced viewport to actual scrollable area.\n      if (viewport && viewport.top != null)\n        viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}\n      // Updated line heights might result in the drawn area not\n      // actually covering the viewport. Keep looping until it does.\n      update.visible = visibleLines(cm.display, cm.doc, viewport)\n      if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n        break\n    } else if (first) {\n      update.visible = visibleLines(cm.display, cm.doc, viewport)\n    }\n    if (!updateDisplayIfNeeded(cm, update)) break\n    updateHeightsInViewport(cm)\n    let barMeasure = measureForScrollbars(cm)\n    updateSelection(cm)\n    updateScrollbars(cm, barMeasure)\n    setDocumentHeight(cm, barMeasure)\n    update.force = false\n  }\n\n  update.signal(cm, \"update\", cm)\n  if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n    update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo)\n    cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo\n  }\n}\n\nexport function updateDisplaySimple(cm, viewport) {\n  let update = new DisplayUpdate(cm, viewport)\n  if (updateDisplayIfNeeded(cm, update)) {\n    updateHeightsInViewport(cm)\n    postUpdateDisplay(cm, update)\n    let barMeasure = measureForScrollbars(cm)\n    updateSelection(cm)\n    updateScrollbars(cm, barMeasure)\n    setDocumentHeight(cm, barMeasure)\n    update.finish()\n  }\n}\n\n// Sync the actual display DOM structure with display.view, removing\n// nodes for lines that are no longer in view, and creating the ones\n// that are not there yet, and updating the ones that are out of\n// date.\nfunction patchDisplay(cm, updateNumbersFrom, dims) {\n  let display = cm.display, lineNumbers = cm.options.lineNumbers\n  let container = display.lineDiv, cur = container.firstChild\n\n  function rm(node) {\n    let next = node.nextSibling\n    // Works around a throw-scroll bug in OS X Webkit\n    if (webkit && mac && cm.display.currentWheelTarget == node)\n      node.style.display = \"none\"\n    else\n      node.parentNode.removeChild(node)\n    return next\n  }\n\n  let view = display.view, lineN = display.viewFrom\n  // Loop over the elements in the view, syncing cur (the DOM nodes\n  // in display.lineDiv) with the view as we go.\n  for (let i = 0; i < view.length; i++) {\n    let lineView = view[i]\n    if (lineView.hidden) {\n    } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet\n      let node = buildLineElement(cm, lineView, lineN, dims)\n      container.insertBefore(node, cur)\n    } else { // Already drawn\n      while (cur != lineView.node) cur = rm(cur)\n      let updateNumber = lineNumbers && updateNumbersFrom != null &&\n        updateNumbersFrom <= lineN && lineView.lineNumber\n      if (lineView.changes) {\n        if (indexOf(lineView.changes, \"gutter\") > -1) updateNumber = false\n        updateLineForChanges(cm, lineView, lineN, dims)\n      }\n      if (updateNumber) {\n        removeChildren(lineView.lineNumber)\n        lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)))\n      }\n      cur = lineView.node.nextSibling\n    }\n    lineN += lineView.size\n  }\n  while (cur) cur = rm(cur)\n}\n\nexport function updateGutterSpace(display) {\n  let width = display.gutters.offsetWidth\n  display.sizer.style.marginLeft = width + \"px\"\n  // Send an event to consumers responding to changes in gutter width.\n  signalLater(display, \"gutterChanged\", display)\n}\n\nexport function setDocumentHeight(cm, measure) {\n  cm.display.sizer.style.minHeight = measure.docHeight + \"px\"\n  cm.display.heightForcer.style.top = measure.docHeight + \"px\"\n  cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + \"px\"\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/update_line.js",
    "content": "import { buildLineContent } from \"../line/line_data.js\"\nimport { lineNumberFor } from \"../line/utils_line.js\"\nimport { ie, ie_version } from \"../util/browser.js\"\nimport { elt, classTest } from \"../util/dom.js\"\nimport { signalLater } from \"../util/operation_group.js\"\n\n// When an aspect of a line changes, a string is added to\n// lineView.changes. This updates the relevant part of the line's\n// DOM structure.\nexport function updateLineForChanges(cm, lineView, lineN, dims) {\n  for (let j = 0; j < lineView.changes.length; j++) {\n    let type = lineView.changes[j]\n    if (type == \"text\") updateLineText(cm, lineView)\n    else if (type == \"gutter\") updateLineGutter(cm, lineView, lineN, dims)\n    else if (type == \"class\") updateLineClasses(cm, lineView)\n    else if (type == \"widget\") updateLineWidgets(cm, lineView, dims)\n  }\n  lineView.changes = null\n}\n\n// Lines with gutter elements, widgets or a background class need to\n// be wrapped, and have the extra elements added to the wrapper div\nfunction ensureLineWrapped(lineView) {\n  if (lineView.node == lineView.text) {\n    lineView.node = elt(\"div\", null, null, \"position: relative\")\n    if (lineView.text.parentNode)\n      lineView.text.parentNode.replaceChild(lineView.node, lineView.text)\n    lineView.node.appendChild(lineView.text)\n    if (ie && ie_version < 8) lineView.node.style.zIndex = 2\n  }\n  return lineView.node\n}\n\nfunction updateLineBackground(cm, lineView) {\n  let cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass\n  if (cls) cls += \" CodeMirror-linebackground\"\n  if (lineView.background) {\n    if (cls) lineView.background.className = cls\n    else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null }\n  } else if (cls) {\n    let wrap = ensureLineWrapped(lineView)\n    lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild)\n    cm.display.input.setUneditable(lineView.background)\n  }\n}\n\n// Wrapper around buildLineContent which will reuse the structure\n// in display.externalMeasured when possible.\nfunction getLineContent(cm, lineView) {\n  let ext = cm.display.externalMeasured\n  if (ext && ext.line == lineView.line) {\n    cm.display.externalMeasured = null\n    lineView.measure = ext.measure\n    return ext.built\n  }\n  return buildLineContent(cm, lineView)\n}\n\n// Redraw the line's text. Interacts with the background and text\n// classes because the mode may output tokens that influence these\n// classes.\nfunction updateLineText(cm, lineView) {\n  let cls = lineView.text.className\n  let built = getLineContent(cm, lineView)\n  if (lineView.text == lineView.node) lineView.node = built.pre\n  lineView.text.parentNode.replaceChild(built.pre, lineView.text)\n  lineView.text = built.pre\n  if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n    lineView.bgClass = built.bgClass\n    lineView.textClass = built.textClass\n    updateLineClasses(cm, lineView)\n  } else if (cls) {\n    lineView.text.className = cls\n  }\n}\n\nfunction updateLineClasses(cm, lineView) {\n  updateLineBackground(cm, lineView)\n  if (lineView.line.wrapClass)\n    ensureLineWrapped(lineView).className = lineView.line.wrapClass\n  else if (lineView.node != lineView.text)\n    lineView.node.className = \"\"\n  let textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass\n  lineView.text.className = textClass || \"\"\n}\n\nfunction updateLineGutter(cm, lineView, lineN, dims) {\n  if (lineView.gutter) {\n    lineView.node.removeChild(lineView.gutter)\n    lineView.gutter = null\n  }\n  if (lineView.gutterBackground) {\n    lineView.node.removeChild(lineView.gutterBackground)\n    lineView.gutterBackground = null\n  }\n  if (lineView.line.gutterClass) {\n    let wrap = ensureLineWrapped(lineView)\n    lineView.gutterBackground = elt(\"div\", null, \"CodeMirror-gutter-background \" + lineView.line.gutterClass,\n                                    `left: ${cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth}px; width: ${dims.gutterTotalWidth}px`)\n    cm.display.input.setUneditable(lineView.gutterBackground)\n    wrap.insertBefore(lineView.gutterBackground, lineView.text)\n  }\n  let markers = lineView.line.gutterMarkers\n  if (cm.options.lineNumbers || markers) {\n    let wrap = ensureLineWrapped(lineView)\n    let gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", `left: ${cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth}px`)\n    gutterWrap.setAttribute(\"aria-hidden\", \"true\")\n    cm.display.input.setUneditable(gutterWrap)\n    wrap.insertBefore(gutterWrap, lineView.text)\n    if (lineView.line.gutterClass)\n      gutterWrap.className += \" \" + lineView.line.gutterClass\n    if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n      lineView.lineNumber = gutterWrap.appendChild(\n        elt(\"div\", lineNumberFor(cm.options, lineN),\n            \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n            `left: ${dims.gutterLeft[\"CodeMirror-linenumbers\"]}px; width: ${cm.display.lineNumInnerWidth}px`))\n    if (markers) for (let k = 0; k < cm.display.gutterSpecs.length; ++k) {\n      let id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id]\n      if (found)\n        gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\",\n                                   `left: ${dims.gutterLeft[id]}px; width: ${dims.gutterWidth[id]}px`))\n    }\n  }\n}\n\nfunction updateLineWidgets(cm, lineView, dims) {\n  if (lineView.alignable) lineView.alignable = null\n  let isWidget = classTest(\"CodeMirror-linewidget\")\n  for (let node = lineView.node.firstChild, next; node; node = next) {\n    next = node.nextSibling\n    if (isWidget.test(node.className)) lineView.node.removeChild(node)\n  }\n  insertLineWidgets(cm, lineView, dims)\n}\n\n// Build a line's DOM representation from scratch\nexport function buildLineElement(cm, lineView, lineN, dims) {\n  let built = getLineContent(cm, lineView)\n  lineView.text = lineView.node = built.pre\n  if (built.bgClass) lineView.bgClass = built.bgClass\n  if (built.textClass) lineView.textClass = built.textClass\n\n  updateLineClasses(cm, lineView)\n  updateLineGutter(cm, lineView, lineN, dims)\n  insertLineWidgets(cm, lineView, dims)\n  return lineView.node\n}\n\n// A lineView may contain multiple logical lines (when merged by\n// collapsed spans). The widgets for all of them need to be drawn.\nfunction insertLineWidgets(cm, lineView, dims) {\n  insertLineWidgetsFor(cm, lineView.line, lineView, dims, true)\n  if (lineView.rest) for (let i = 0; i < lineView.rest.length; i++)\n    insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false)\n}\n\nfunction insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {\n  if (!line.widgets) return\n  let wrap = ensureLineWrapped(lineView)\n  for (let i = 0, ws = line.widgets; i < ws.length; ++i) {\n    let widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\" + (widget.className ? \" \" + widget.className : \"\"))\n    if (!widget.handleMouseEvents) node.setAttribute(\"cm-ignore-events\", \"true\")\n    positionLineWidget(widget, node, lineView, dims)\n    cm.display.input.setUneditable(node)\n    if (allowAbove && widget.above)\n      wrap.insertBefore(node, lineView.gutter || lineView.text)\n    else\n      wrap.appendChild(node)\n    signalLater(widget, \"redraw\")\n  }\n}\n\nfunction positionLineWidget(widget, node, lineView, dims) {\n  if (widget.noHScroll) {\n    ;(lineView.alignable || (lineView.alignable = [])).push(node)\n    let width = dims.wrapperWidth\n    node.style.left = dims.fixedPos + \"px\"\n    if (!widget.coverGutter) {\n      width -= dims.gutterTotalWidth\n      node.style.paddingLeft = dims.gutterTotalWidth + \"px\"\n    }\n    node.style.width = width + \"px\"\n  }\n  if (widget.coverGutter) {\n    node.style.zIndex = 5\n    node.style.position = \"relative\"\n    if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + \"px\"\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/update_lines.js",
    "content": "import { heightAtLine } from \"../line/spans.js\"\nimport { getLine, lineAtHeight, updateLineHeight } from \"../line/utils_line.js\"\nimport { paddingTop, charWidth } from \"../measurement/position_measurement.js\"\nimport { ie, ie_version } from \"../util/browser.js\"\n\n// Read the actual heights of the rendered lines, and update their\n// stored heights to match.\nexport function updateHeightsInViewport(cm) {\n  let display = cm.display\n  let prevBottom = display.lineDiv.offsetTop\n  let viewTop = Math.max(0, display.scroller.getBoundingClientRect().top)\n  let oldHeight = display.lineDiv.getBoundingClientRect().top\n  let mustScroll = 0\n  for (let i = 0; i < display.view.length; i++) {\n    let cur = display.view[i], wrapping = cm.options.lineWrapping\n    let height, width = 0\n    if (cur.hidden) continue\n    oldHeight += cur.line.height\n    if (ie && ie_version < 8) {\n      let bot = cur.node.offsetTop + cur.node.offsetHeight\n      height = bot - prevBottom\n      prevBottom = bot\n    } else {\n      let box = cur.node.getBoundingClientRect()\n      height = box.bottom - box.top\n      // Check that lines don't extend past the right of the current\n      // editor width\n      if (!wrapping && cur.text.firstChild)\n        width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1\n    }\n    let diff = cur.line.height - height\n    if (diff > .005 || diff < -.005) {\n      if (oldHeight < viewTop) mustScroll -= diff\n      updateLineHeight(cur.line, height)\n      updateWidgetHeight(cur.line)\n      if (cur.rest) for (let j = 0; j < cur.rest.length; j++)\n        updateWidgetHeight(cur.rest[j])\n    }\n    if (width > cm.display.sizerWidth) {\n      let chWidth = Math.ceil(width / charWidth(cm.display))\n      if (chWidth > cm.display.maxLineLength) {\n        cm.display.maxLineLength = chWidth\n        cm.display.maxLine = cur.line\n        cm.display.maxLineChanged = true\n      }\n    }\n  }\n  if (Math.abs(mustScroll) > 2) display.scroller.scrollTop += mustScroll\n}\n\n// Read and store the height of line widgets associated with the\n// given line.\nfunction updateWidgetHeight(line) {\n  if (line.widgets) for (let i = 0; i < line.widgets.length; ++i) {\n    let w = line.widgets[i], parent = w.node.parentNode\n    if (parent) w.height = parent.offsetHeight\n  }\n}\n\n// Compute the lines that are visible in a given viewport (defaults\n// the the current scroll position). viewport may contain top,\n// height, and ensure (see op.scrollToPos) properties.\nexport function visibleLines(display, doc, viewport) {\n  let top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop\n  top = Math.floor(top - paddingTop(display))\n  let bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight\n\n  let from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom)\n  // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n  // forces those lines into the viewport (if possible).\n  if (viewport && viewport.ensure) {\n    let ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line\n    if (ensureFrom < from) {\n      from = ensureFrom\n      to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight)\n    } else if (Math.min(ensureTo, doc.lastLine()) >= to) {\n      from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight)\n      to = ensureTo\n    }\n  }\n  return {from: from, to: Math.max(to, from + 1)}\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/display/view_tracking.js",
    "content": "import { buildViewArray } from \"../line/line_data.js\"\nimport { sawCollapsedSpans } from \"../line/saw_special_spans.js\"\nimport { visualLineEndNo, visualLineNo } from \"../line/spans.js\"\nimport { findViewIndex } from \"../measurement/position_measurement.js\"\nimport { indexOf } from \"../util/misc.js\"\n\n// Updates the display.view data structure for a given change to the\n// document. From and to are in pre-change coordinates. Lendiff is\n// the amount of lines added or subtracted by the change. This is\n// used for changes that span multiple lines, or change the way\n// lines are divided into visual lines. regLineChange (below)\n// registers single-line changes.\nexport function regChange(cm, from, to, lendiff) {\n  if (from == null) from = cm.doc.first\n  if (to == null) to = cm.doc.first + cm.doc.size\n  if (!lendiff) lendiff = 0\n\n  let display = cm.display\n  if (lendiff && to < display.viewTo &&\n      (display.updateLineNumbers == null || display.updateLineNumbers > from))\n    display.updateLineNumbers = from\n\n  cm.curOp.viewChanged = true\n\n  if (from >= display.viewTo) { // Change after\n    if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n      resetView(cm)\n  } else if (to <= display.viewFrom) { // Change before\n    if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n      resetView(cm)\n    } else {\n      display.viewFrom += lendiff\n      display.viewTo += lendiff\n    }\n  } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n    resetView(cm)\n  } else if (from <= display.viewFrom) { // Top overlap\n    let cut = viewCuttingPoint(cm, to, to + lendiff, 1)\n    if (cut) {\n      display.view = display.view.slice(cut.index)\n      display.viewFrom = cut.lineN\n      display.viewTo += lendiff\n    } else {\n      resetView(cm)\n    }\n  } else if (to >= display.viewTo) { // Bottom overlap\n    let cut = viewCuttingPoint(cm, from, from, -1)\n    if (cut) {\n      display.view = display.view.slice(0, cut.index)\n      display.viewTo = cut.lineN\n    } else {\n      resetView(cm)\n    }\n  } else { // Gap in the middle\n    let cutTop = viewCuttingPoint(cm, from, from, -1)\n    let cutBot = viewCuttingPoint(cm, to, to + lendiff, 1)\n    if (cutTop && cutBot) {\n      display.view = display.view.slice(0, cutTop.index)\n        .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n        .concat(display.view.slice(cutBot.index))\n      display.viewTo += lendiff\n    } else {\n      resetView(cm)\n    }\n  }\n\n  let ext = display.externalMeasured\n  if (ext) {\n    if (to < ext.lineN)\n      ext.lineN += lendiff\n    else if (from < ext.lineN + ext.size)\n      display.externalMeasured = null\n  }\n}\n\n// Register a change to a single line. Type must be one of \"text\",\n// \"gutter\", \"class\", \"widget\"\nexport function regLineChange(cm, line, type) {\n  cm.curOp.viewChanged = true\n  let display = cm.display, ext = cm.display.externalMeasured\n  if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n    display.externalMeasured = null\n\n  if (line < display.viewFrom || line >= display.viewTo) return\n  let lineView = display.view[findViewIndex(cm, line)]\n  if (lineView.node == null) return\n  let arr = lineView.changes || (lineView.changes = [])\n  if (indexOf(arr, type) == -1) arr.push(type)\n}\n\n// Clear the view.\nexport function resetView(cm) {\n  cm.display.viewFrom = cm.display.viewTo = cm.doc.first\n  cm.display.view = []\n  cm.display.viewOffset = 0\n}\n\nfunction viewCuttingPoint(cm, oldN, newN, dir) {\n  let index = findViewIndex(cm, oldN), diff, view = cm.display.view\n  if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n    return {index: index, lineN: newN}\n  let n = cm.display.viewFrom\n  for (let i = 0; i < index; i++)\n    n += view[i].size\n  if (n != oldN) {\n    if (dir > 0) {\n      if (index == view.length - 1) return null\n      diff = (n + view[index].size) - oldN\n      index++\n    } else {\n      diff = n - oldN\n    }\n    oldN += diff; newN += diff\n  }\n  while (visualLineNo(cm.doc, newN) != newN) {\n    if (index == (dir < 0 ? 0 : view.length - 1)) return null\n    newN += dir * view[index - (dir < 0 ? 1 : 0)].size\n    index += dir\n  }\n  return {index: index, lineN: newN}\n}\n\n// Force the view to cover a given range, adding empty view element\n// or clipping off existing ones as needed.\nexport function adjustView(cm, from, to) {\n  let display = cm.display, view = display.view\n  if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n    display.view = buildViewArray(cm, from, to)\n    display.viewFrom = from\n  } else {\n    if (display.viewFrom > from)\n      display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view)\n    else if (display.viewFrom < from)\n      display.view = display.view.slice(findViewIndex(cm, from))\n    display.viewFrom = from\n    if (display.viewTo < to)\n      display.view = display.view.concat(buildViewArray(cm, display.viewTo, to))\n    else if (display.viewTo > to)\n      display.view = display.view.slice(0, findViewIndex(cm, to))\n  }\n  display.viewTo = to\n}\n\n// Count the number of lines in the view whose DOM representation is\n// out of date (or nonexistent).\nexport function countDirtyView(cm) {\n  let view = cm.display.view, dirty = 0\n  for (let i = 0; i < view.length; i++) {\n    let lineView = view[i]\n    if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty\n  }\n  return dirty\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/CodeMirror.js",
    "content": "import { Display } from \"../display/Display.js\"\nimport { onFocus, onBlur } from \"../display/focus.js\"\nimport { maybeUpdateLineNumberWidth } from \"../display/line_numbers.js\"\nimport { endOperation, operation, startOperation } from \"../display/operations.js\"\nimport { initScrollbars } from \"../display/scrollbars.js\"\nimport { onScrollWheel } from \"../display/scroll_events.js\"\nimport { setScrollLeft, updateScrollTop } from \"../display/scrolling.js\"\nimport { clipPos, Pos } from \"../line/pos.js\"\nimport { posFromMouse } from \"../measurement/position_measurement.js\"\nimport { eventInWidget } from \"../measurement/widgets.js\"\nimport Doc from \"../model/Doc.js\"\nimport { attachDoc } from \"../model/document_data.js\"\nimport { Range } from \"../model/selection.js\"\nimport { extendSelection } from \"../model/selection_updates.js\"\nimport { ie, ie_version, mobile, webkit } from \"../util/browser.js\"\nimport { e_preventDefault, e_stop, on, signal, signalDOMEvent } from \"../util/event.js\"\nimport { copyObj, Delayed } from \"../util/misc.js\"\n\nimport { clearDragCursor, onDragOver, onDragStart, onDrop } from \"./drop_events.js\"\nimport { ensureGlobalHandlers } from \"./global_events.js\"\nimport { onKeyDown, onKeyPress, onKeyUp } from \"./key_events.js\"\nimport { clickInGutter, onContextMenu, onMouseDown } from \"./mouse_events.js\"\nimport { themeChanged } from \"./utils.js\"\nimport { defaults, optionHandlers, Init } from \"./options.js\"\n\n// A CodeMirror instance represents an editor. This is the object\n// that user code is usually dealing with.\n\nexport function CodeMirror(place, options) {\n  if (!(this instanceof CodeMirror)) return new CodeMirror(place, options)\n\n  this.options = options = options ? copyObj(options) : {}\n  // Determine effective options based on given values and defaults.\n  copyObj(defaults, options, false)\n\n  let doc = options.value\n  if (typeof doc == \"string\") doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction)\n  else if (options.mode) doc.modeOption = options.mode\n  this.doc = doc\n\n  let input = new CodeMirror.inputStyles[options.inputStyle](this)\n  let display = this.display = new Display(place, doc, input, options)\n  display.wrapper.CodeMirror = this\n  themeChanged(this)\n  if (options.lineWrapping)\n    this.display.wrapper.className += \" CodeMirror-wrap\"\n  initScrollbars(this)\n\n  this.state = {\n    keyMaps: [],  // stores maps added by addKeyMap\n    overlays: [], // highlighting overlays, as added by addOverlay\n    modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info\n    overwrite: false,\n    delayingBlurEvent: false,\n    focused: false,\n    suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n    pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll\n    selectingText: false,\n    draggingText: false,\n    highlight: new Delayed(), // stores highlight worker timeout\n    keySeq: null,  // Unfinished key sequence\n    specialChars: null\n  }\n\n  if (options.autofocus && !mobile) display.input.focus()\n\n  // Override magic textarea content restore that IE sometimes does\n  // on our hidden textarea on reload\n  if (ie && ie_version < 11) setTimeout(() => this.display.input.reset(true), 20)\n\n  registerEventHandlers(this)\n  ensureGlobalHandlers()\n\n  startOperation(this)\n  this.curOp.forceUpdate = true\n  attachDoc(this, doc)\n\n  if ((options.autofocus && !mobile) || this.hasFocus())\n    setTimeout(() => {\n      if (this.hasFocus() && !this.state.focused) onFocus(this)\n    }, 20)\n  else\n    onBlur(this)\n\n  for (let opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))\n    optionHandlers[opt](this, options[opt], Init)\n  maybeUpdateLineNumberWidth(this)\n  if (options.finishInit) options.finishInit(this)\n  for (let i = 0; i < initHooks.length; ++i) initHooks[i](this)\n  endOperation(this)\n  // Suppress optimizelegibility in Webkit, since it breaks text\n  // measuring on line wrapping boundaries.\n  if (webkit && options.lineWrapping &&\n      getComputedStyle(display.lineDiv).textRendering == \"optimizelegibility\")\n    display.lineDiv.style.textRendering = \"auto\"\n}\n\n// The default configuration options.\nCodeMirror.defaults = defaults\n// Functions to run when options are changed.\nCodeMirror.optionHandlers = optionHandlers\n\nexport default CodeMirror\n\n// Attach the necessary event handlers when initializing the editor\nfunction registerEventHandlers(cm) {\n  let d = cm.display\n  on(d.scroller, \"mousedown\", operation(cm, onMouseDown))\n  // Older IE's will not fire a second mousedown for a double click\n  if (ie && ie_version < 11)\n    on(d.scroller, \"dblclick\", operation(cm, e => {\n      if (signalDOMEvent(cm, e)) return\n      let pos = posFromMouse(cm, e)\n      if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return\n      e_preventDefault(e)\n      let word = cm.findWordAt(pos)\n      extendSelection(cm.doc, word.anchor, word.head)\n    }))\n  else\n    on(d.scroller, \"dblclick\", e => signalDOMEvent(cm, e) || e_preventDefault(e))\n  // Some browsers fire contextmenu *after* opening the menu, at\n  // which point we can't mess with it anymore. Context menu is\n  // handled in onMouseDown for these browsers.\n  on(d.scroller, \"contextmenu\", e => onContextMenu(cm, e))\n  on(d.input.getField(), \"contextmenu\", e => {\n    if (!d.scroller.contains(e.target)) onContextMenu(cm, e)\n  })\n\n  // Used to suppress mouse event handling when a touch happens\n  let touchFinished, prevTouch = {end: 0}\n  function finishTouch() {\n    if (d.activeTouch) {\n      touchFinished = setTimeout(() => d.activeTouch = null, 1000)\n      prevTouch = d.activeTouch\n      prevTouch.end = +new Date\n    }\n  }\n  function isMouseLikeTouchEvent(e) {\n    if (e.touches.length != 1) return false\n    let touch = e.touches[0]\n    return touch.radiusX <= 1 && touch.radiusY <= 1\n  }\n  function farAway(touch, other) {\n    if (other.left == null) return true\n    let dx = other.left - touch.left, dy = other.top - touch.top\n    return dx * dx + dy * dy > 20 * 20\n  }\n  on(d.scroller, \"touchstart\", e => {\n    if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {\n      d.input.ensurePolled()\n      clearTimeout(touchFinished)\n      let now = +new Date\n      d.activeTouch = {start: now, moved: false,\n                       prev: now - prevTouch.end <= 300 ? prevTouch : null}\n      if (e.touches.length == 1) {\n        d.activeTouch.left = e.touches[0].pageX\n        d.activeTouch.top = e.touches[0].pageY\n      }\n    }\n  })\n  on(d.scroller, \"touchmove\", () => {\n    if (d.activeTouch) d.activeTouch.moved = true\n  })\n  on(d.scroller, \"touchend\", e => {\n    let touch = d.activeTouch\n    if (touch && !eventInWidget(d, e) && touch.left != null &&\n        !touch.moved && new Date - touch.start < 300) {\n      let pos = cm.coordsChar(d.activeTouch, \"page\"), range\n      if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n        range = new Range(pos, pos)\n      else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n        range = cm.findWordAt(pos)\n      else // Triple tap\n        range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0)))\n      cm.setSelection(range.anchor, range.head)\n      cm.focus()\n      e_preventDefault(e)\n    }\n    finishTouch()\n  })\n  on(d.scroller, \"touchcancel\", finishTouch)\n\n  // Sync scrolling between fake scrollbars and real scrollable\n  // area, ensure viewport is updated when scrolling.\n  on(d.scroller, \"scroll\", () => {\n    if (d.scroller.clientHeight) {\n      updateScrollTop(cm, d.scroller.scrollTop)\n      setScrollLeft(cm, d.scroller.scrollLeft, true)\n      signal(cm, \"scroll\", cm)\n    }\n  })\n\n  // Listen to wheel events in order to try and update the viewport on time.\n  on(d.scroller, \"mousewheel\", e => onScrollWheel(cm, e))\n  on(d.scroller, \"DOMMouseScroll\", e => onScrollWheel(cm, e))\n\n  // Prevent wrapper from ever scrolling\n  on(d.wrapper, \"scroll\", () => d.wrapper.scrollTop = d.wrapper.scrollLeft = 0)\n\n  d.dragFunctions = {\n    enter: e => {if (!signalDOMEvent(cm, e)) e_stop(e)},\n    over: e => {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e) }},\n    start: e => onDragStart(cm, e),\n    drop: operation(cm, onDrop),\n    leave: e => {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm) }}\n  }\n\n  let inp = d.input.getField()\n  on(inp, \"keyup\", e => onKeyUp.call(cm, e))\n  on(inp, \"keydown\", operation(cm, onKeyDown))\n  on(inp, \"keypress\", operation(cm, onKeyPress))\n  on(inp, \"focus\", e => onFocus(cm, e))\n  on(inp, \"blur\", e => onBlur(cm, e))\n}\n\nlet initHooks = []\nCodeMirror.defineInitHook = f => initHooks.push(f)\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/commands.js",
    "content": "import { deleteNearSelection } from \"./deleteNearSelection.js\"\nimport { runInOp } from \"../display/operations.js\"\nimport { ensureCursorVisible } from \"../display/scrolling.js\"\nimport { endOfLine } from \"../input/movement.js\"\nimport { clipPos, Pos } from \"../line/pos.js\"\nimport { visualLine, visualLineEnd } from \"../line/spans.js\"\nimport { getLine, lineNo } from \"../line/utils_line.js\"\nimport { Range } from \"../model/selection.js\"\nimport { selectAll } from \"../model/selection_updates.js\"\nimport { countColumn, sel_dontScroll, sel_move, spaceStr } from \"../util/misc.js\"\nimport { getOrder } from \"../util/bidi.js\"\n\n// Commands are parameter-less actions that can be performed on an\n// editor, mostly used for keybindings.\nexport let commands = {\n  selectAll: selectAll,\n  singleSelection: cm => cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll),\n  killLine: cm => deleteNearSelection(cm, range => {\n    if (range.empty()) {\n      let len = getLine(cm.doc, range.head.line).text.length\n      if (range.head.ch == len && range.head.line < cm.lastLine())\n        return {from: range.head, to: Pos(range.head.line + 1, 0)}\n      else\n        return {from: range.head, to: Pos(range.head.line, len)}\n    } else {\n      return {from: range.from(), to: range.to()}\n    }\n  }),\n  deleteLine: cm => deleteNearSelection(cm, range => ({\n    from: Pos(range.from().line, 0),\n    to: clipPos(cm.doc, Pos(range.to().line + 1, 0))\n  })),\n  delLineLeft: cm => deleteNearSelection(cm, range => ({\n    from: Pos(range.from().line, 0), to: range.from()\n  })),\n  delWrappedLineLeft: cm => deleteNearSelection(cm, range => {\n    let top = cm.charCoords(range.head, \"div\").top + 5\n    let leftPos = cm.coordsChar({left: 0, top: top}, \"div\")\n    return {from: leftPos, to: range.from()}\n  }),\n  delWrappedLineRight: cm => deleteNearSelection(cm, range => {\n    let top = cm.charCoords(range.head, \"div\").top + 5\n    let rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n    return {from: range.from(), to: rightPos }\n  }),\n  undo: cm => cm.undo(),\n  redo: cm => cm.redo(),\n  undoSelection: cm => cm.undoSelection(),\n  redoSelection: cm => cm.redoSelection(),\n  goDocStart: cm => cm.extendSelection(Pos(cm.firstLine(), 0)),\n  goDocEnd: cm => cm.extendSelection(Pos(cm.lastLine())),\n  goLineStart: cm => cm.extendSelectionsBy(range => lineStart(cm, range.head.line),\n    {origin: \"+move\", bias: 1}\n  ),\n  goLineStartSmart: cm => cm.extendSelectionsBy(range => lineStartSmart(cm, range.head),\n    {origin: \"+move\", bias: 1}\n  ),\n  goLineEnd: cm => cm.extendSelectionsBy(range => lineEnd(cm, range.head.line),\n    {origin: \"+move\", bias: -1}\n  ),\n  goLineRight: cm => cm.extendSelectionsBy(range => {\n    let top = cm.cursorCoords(range.head, \"div\").top + 5\n    return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n  }, sel_move),\n  goLineLeft: cm => cm.extendSelectionsBy(range => {\n    let top = cm.cursorCoords(range.head, \"div\").top + 5\n    return cm.coordsChar({left: 0, top: top}, \"div\")\n  }, sel_move),\n  goLineLeftSmart: cm => cm.extendSelectionsBy(range => {\n    let top = cm.cursorCoords(range.head, \"div\").top + 5\n    let pos = cm.coordsChar({left: 0, top: top}, \"div\")\n    if (pos.ch < cm.getLine(pos.line).search(/\\S/)) return lineStartSmart(cm, range.head)\n    return pos\n  }, sel_move),\n  goLineUp: cm => cm.moveV(-1, \"line\"),\n  goLineDown: cm => cm.moveV(1, \"line\"),\n  goPageUp: cm => cm.moveV(-1, \"page\"),\n  goPageDown: cm => cm.moveV(1, \"page\"),\n  goCharLeft: cm => cm.moveH(-1, \"char\"),\n  goCharRight: cm => cm.moveH(1, \"char\"),\n  goColumnLeft: cm => cm.moveH(-1, \"column\"),\n  goColumnRight: cm => cm.moveH(1, \"column\"),\n  goWordLeft: cm => cm.moveH(-1, \"word\"),\n  goGroupRight: cm => cm.moveH(1, \"group\"),\n  goGroupLeft: cm => cm.moveH(-1, \"group\"),\n  goWordRight: cm => cm.moveH(1, \"word\"),\n  delCharBefore: cm => cm.deleteH(-1, \"codepoint\"),\n  delCharAfter: cm => cm.deleteH(1, \"char\"),\n  delWordBefore: cm => cm.deleteH(-1, \"word\"),\n  delWordAfter: cm => cm.deleteH(1, \"word\"),\n  delGroupBefore: cm => cm.deleteH(-1, \"group\"),\n  delGroupAfter: cm => cm.deleteH(1, \"group\"),\n  indentAuto: cm => cm.indentSelection(\"smart\"),\n  indentMore: cm => cm.indentSelection(\"add\"),\n  indentLess: cm => cm.indentSelection(\"subtract\"),\n  insertTab: cm => cm.replaceSelection(\"\\t\"),\n  insertSoftTab: cm => {\n    let spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize\n    for (let i = 0; i < ranges.length; i++) {\n      let pos = ranges[i].from()\n      let col = countColumn(cm.getLine(pos.line), pos.ch, tabSize)\n      spaces.push(spaceStr(tabSize - col % tabSize))\n    }\n    cm.replaceSelections(spaces)\n  },\n  defaultTab: cm => {\n    if (cm.somethingSelected()) cm.indentSelection(\"add\")\n    else cm.execCommand(\"insertTab\")\n  },\n  // Swap the two chars left and right of each selection's head.\n  // Move cursor behind the two swapped characters afterwards.\n  //\n  // Doesn't consider line feeds a character.\n  // Doesn't scan more than one line above to find a character.\n  // Doesn't do anything on an empty line.\n  // Doesn't do anything with non-empty selections.\n  transposeChars: cm => runInOp(cm, () => {\n    let ranges = cm.listSelections(), newSel = []\n    for (let i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) continue\n      let cur = ranges[i].head, line = getLine(cm.doc, cur.line).text\n      if (line) {\n        if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1)\n        if (cur.ch > 0) {\n          cur = new Pos(cur.line, cur.ch + 1)\n          cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n                          Pos(cur.line, cur.ch - 2), cur, \"+transpose\")\n        } else if (cur.line > cm.doc.first) {\n          let prev = getLine(cm.doc, cur.line - 1).text\n          if (prev) {\n            cur = new Pos(cur.line, 1)\n            cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n                            prev.charAt(prev.length - 1),\n                            Pos(cur.line - 1, prev.length - 1), cur, \"+transpose\")\n          }\n        }\n      }\n      newSel.push(new Range(cur, cur))\n    }\n    cm.setSelections(newSel)\n  }),\n  newlineAndIndent: cm => runInOp(cm, () => {\n    let sels = cm.listSelections()\n    for (let i = sels.length - 1; i >= 0; i--)\n      cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, \"+input\")\n    sels = cm.listSelections()\n    for (let i = 0; i < sels.length; i++)\n      cm.indentLine(sels[i].from().line, null, true)\n    ensureCursorVisible(cm)\n  }),\n  openLine: cm => cm.replaceSelection(\"\\n\", \"start\"),\n  toggleOverwrite: cm => cm.toggleOverwrite()\n}\n\n\nfunction lineStart(cm, lineN) {\n  let line = getLine(cm.doc, lineN)\n  let visual = visualLine(line)\n  if (visual != line) lineN = lineNo(visual)\n  return endOfLine(true, cm, visual, lineN, 1)\n}\nfunction lineEnd(cm, lineN) {\n  let line = getLine(cm.doc, lineN)\n  let visual = visualLineEnd(line)\n  if (visual != line) lineN = lineNo(visual)\n  return endOfLine(true, cm, line, lineN, -1)\n}\nfunction lineStartSmart(cm, pos) {\n  let start = lineStart(cm, pos.line)\n  let line = getLine(cm.doc, start.line)\n  let order = getOrder(line, cm.doc.direction)\n  if (!order || order[0].level == 0) {\n    let firstNonWS = Math.max(start.ch, line.text.search(/\\S/))\n    let inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch\n    return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)\n  }\n  return start\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/deleteNearSelection.js",
    "content": "import { runInOp } from \"../display/operations.js\"\nimport { ensureCursorVisible } from \"../display/scrolling.js\"\nimport { cmp } from \"../line/pos.js\"\nimport { replaceRange } from \"../model/changes.js\"\nimport { lst } from \"../util/misc.js\"\n\n// Helper for deleting text near the selection(s), used to implement\n// backspace, delete, and similar functionality.\nexport function deleteNearSelection(cm, compute) {\n  let ranges = cm.doc.sel.ranges, kill = []\n  // Build up a set of ranges to kill first, merging overlapping\n  // ranges.\n  for (let i = 0; i < ranges.length; i++) {\n    let toKill = compute(ranges[i])\n    while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n      let replaced = kill.pop()\n      if (cmp(replaced.from, toKill.from) < 0) {\n        toKill.from = replaced.from\n        break\n      }\n    }\n    kill.push(toKill)\n  }\n  // Next, remove those actual ranges.\n  runInOp(cm, () => {\n    for (let i = kill.length - 1; i >= 0; i--)\n      replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\")\n    ensureCursorVisible(cm)\n  })\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/drop_events.js",
    "content": "import { drawSelectionCursor } from \"../display/selection.js\"\nimport { operation } from \"../display/operations.js\"\nimport { clipPos } from \"../line/pos.js\"\nimport { posFromMouse } from \"../measurement/position_measurement.js\"\nimport { eventInWidget } from \"../measurement/widgets.js\"\nimport { makeChange, replaceRange } from \"../model/changes.js\"\nimport { changeEnd } from \"../model/change_measurement.js\"\nimport { simpleSelection } from \"../model/selection.js\"\nimport { setSelectionNoUndo, setSelectionReplaceHistory } from \"../model/selection_updates.js\"\nimport { ie, presto, safari } from \"../util/browser.js\"\nimport { elt, removeChildrenAndAdd } from \"../util/dom.js\"\nimport { e_preventDefault, e_stop, signalDOMEvent } from \"../util/event.js\"\nimport { indexOf } from \"../util/misc.js\"\n\n// Kludge to work around strange IE behavior where it'll sometimes\n// re-fire a series of drag-related events right after the drop (#1551)\nlet lastDrop = 0\n\nexport function onDrop(e) {\n  let cm = this\n  clearDragCursor(cm)\n  if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n    return\n  e_preventDefault(e)\n  if (ie) lastDrop = +new Date\n  let pos = posFromMouse(cm, e, true), files = e.dataTransfer.files\n  if (!pos || cm.isReadOnly()) return\n  // Might be a file drop, in which case we simply extract the text\n  // and insert it.\n  if (files && files.length && window.FileReader && window.File) {\n    let n = files.length, text = Array(n), read = 0\n    const markAsReadAndPasteIfAllFilesAreRead = () => {\n      if (++read == n) {\n        operation(cm, () => {\n          pos = clipPos(cm.doc, pos)\n          let change = {from: pos, to: pos,\n                        text: cm.doc.splitLines(\n                            text.filter(t => t != null).join(cm.doc.lineSeparator())),\n                        origin: \"paste\"}\n          makeChange(cm.doc, change)\n          setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))))\n        })()\n      }\n    }\n    const readTextFromFile = (file, i) => {\n      if (cm.options.allowDropFileTypes &&\n          indexOf(cm.options.allowDropFileTypes, file.type) == -1) {\n        markAsReadAndPasteIfAllFilesAreRead()\n        return\n      }\n      let reader = new FileReader\n      reader.onerror = () => markAsReadAndPasteIfAllFilesAreRead()\n      reader.onload = () => {\n        let content = reader.result\n        if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) {\n          markAsReadAndPasteIfAllFilesAreRead()\n          return\n        }\n        text[i] = content\n        markAsReadAndPasteIfAllFilesAreRead()\n      }\n      reader.readAsText(file)\n    }\n    for (let i = 0; i < files.length; i++) readTextFromFile(files[i], i)\n  } else { // Normal drop\n    // Don't do a replace if the drop happened inside of the selected text.\n    if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n      cm.state.draggingText(e)\n      // Ensure the editor is re-focused\n      setTimeout(() => cm.display.input.focus(), 20)\n      return\n    }\n    try {\n      let text = e.dataTransfer.getData(\"Text\")\n      if (text) {\n        let selected\n        if (cm.state.draggingText && !cm.state.draggingText.copy)\n          selected = cm.listSelections()\n        setSelectionNoUndo(cm.doc, simpleSelection(pos, pos))\n        if (selected) for (let i = 0; i < selected.length; ++i)\n          replaceRange(cm.doc, \"\", selected[i].anchor, selected[i].head, \"drag\")\n        cm.replaceSelection(text, \"around\", \"paste\")\n        cm.display.input.focus()\n      }\n    }\n    catch(e){}\n  }\n}\n\nexport function onDragStart(cm, e) {\n  if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }\n  if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return\n\n  e.dataTransfer.setData(\"Text\", cm.getSelection())\n  e.dataTransfer.effectAllowed = \"copyMove\"\n\n  // Use dummy image instead of default browsers image.\n  // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n  if (e.dataTransfer.setDragImage && !safari) {\n    let img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\")\n    img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n    if (presto) {\n      img.width = img.height = 1\n      cm.display.wrapper.appendChild(img)\n      // Force a relayout, or Opera won't use our image for some obscure reason\n      img._top = img.offsetTop\n    }\n    e.dataTransfer.setDragImage(img, 0, 0)\n    if (presto) img.parentNode.removeChild(img)\n  }\n}\n\nexport function onDragOver(cm, e) {\n  let pos = posFromMouse(cm, e)\n  if (!pos) return\n  let frag = document.createDocumentFragment()\n  drawSelectionCursor(cm, pos, frag)\n  if (!cm.display.dragCursor) {\n    cm.display.dragCursor = elt(\"div\", null, \"CodeMirror-cursors CodeMirror-dragcursors\")\n    cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv)\n  }\n  removeChildrenAndAdd(cm.display.dragCursor, frag)\n}\n\nexport function clearDragCursor(cm) {\n  if (cm.display.dragCursor) {\n    cm.display.lineSpace.removeChild(cm.display.dragCursor)\n    cm.display.dragCursor = null\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/fromTextArea.js",
    "content": "import { CodeMirror } from \"./CodeMirror.js\"\nimport { activeElt } from \"../util/dom.js\"\nimport { off, on } from \"../util/event.js\"\nimport { copyObj } from \"../util/misc.js\"\n\nexport function fromTextArea(textarea, options) {\n  options = options ? copyObj(options) : {}\n  options.value = textarea.value\n  if (!options.tabindex && textarea.tabIndex)\n    options.tabindex = textarea.tabIndex\n  if (!options.placeholder && textarea.placeholder)\n    options.placeholder = textarea.placeholder\n  // Set autofocus to true if this textarea is focused, or if it has\n  // autofocus and no other element is focused.\n  if (options.autofocus == null) {\n    let hasFocus = activeElt()\n    options.autofocus = hasFocus == textarea ||\n      textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body\n  }\n\n  function save() {textarea.value = cm.getValue()}\n\n  let realSubmit\n  if (textarea.form) {\n    on(textarea.form, \"submit\", save)\n    // Deplorable hack to make the submit method do the right thing.\n    if (!options.leaveSubmitMethodAlone) {\n      let form = textarea.form\n      realSubmit = form.submit\n      try {\n        let wrappedSubmit = form.submit = () => {\n          save()\n          form.submit = realSubmit\n          form.submit()\n          form.submit = wrappedSubmit\n        }\n      } catch(e) {}\n    }\n  }\n\n  options.finishInit = cm => {\n    cm.save = save\n    cm.getTextArea = () => textarea\n    cm.toTextArea = () => {\n      cm.toTextArea = isNaN // Prevent this from being ran twice\n      save()\n      textarea.parentNode.removeChild(cm.getWrapperElement())\n      textarea.style.display = \"\"\n      if (textarea.form) {\n        off(textarea.form, \"submit\", save)\n        if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == \"function\")\n          textarea.form.submit = realSubmit\n      }\n    }\n  }\n\n  textarea.style.display = \"none\"\n  let cm = CodeMirror(node => textarea.parentNode.insertBefore(node, textarea.nextSibling),\n    options)\n  return cm\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/global_events.js",
    "content": "import { onBlur } from \"../display/focus.js\"\nimport { on } from \"../util/event.js\"\n\n// These must be handled carefully, because naively registering a\n// handler for each editor will cause the editors to never be\n// garbage collected.\n\nfunction forEachCodeMirror(f) {\n  if (!document.getElementsByClassName) return\n  let byClass = document.getElementsByClassName(\"CodeMirror\"), editors = []\n  for (let i = 0; i < byClass.length; i++) {\n    let cm = byClass[i].CodeMirror\n    if (cm) editors.push(cm)\n  }\n  if (editors.length) editors[0].operation(() => {\n    for (let i = 0; i < editors.length; i++) f(editors[i])\n  })\n}\n\nlet globalsRegistered = false\nexport function ensureGlobalHandlers() {\n  if (globalsRegistered) return\n  registerGlobalHandlers()\n  globalsRegistered = true\n}\nfunction registerGlobalHandlers() {\n  // When the window resizes, we need to refresh active editors.\n  let resizeTimer\n  on(window, \"resize\", () => {\n    if (resizeTimer == null) resizeTimer = setTimeout(() => {\n      resizeTimer = null\n      forEachCodeMirror(onResize)\n    }, 100)\n  })\n  // When the window loses focus, we want to show the editor as blurred\n  on(window, \"blur\", () => forEachCodeMirror(onBlur))\n}\n// Called when the window resizes\nfunction onResize(cm) {\n  let d = cm.display\n  // Might be a text scaling operation, clear size caches.\n  d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null\n  d.scrollbarsClipped = false\n  cm.setSize()\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/key_events.js",
    "content": "import { signalLater } from \"../util/operation_group.js\"\nimport { restartBlink } from \"../display/selection.js\"\nimport { isModifierKey, keyName, lookupKey } from \"../input/keymap.js\"\nimport { eventInWidget } from \"../measurement/widgets.js\"\nimport { ie, ie_version, mac, presto, gecko } from \"../util/browser.js\"\nimport { activeElt, addClass, rmClass } from \"../util/dom.js\"\nimport { e_preventDefault, off, on, signalDOMEvent } from \"../util/event.js\"\nimport { hasCopyEvent } from \"../util/feature_detection.js\"\nimport { Delayed, Pass } from \"../util/misc.js\"\n\nimport { commands } from \"./commands.js\"\n\n// Run a handler that was bound to a key.\nfunction doHandleBinding(cm, bound, dropShift) {\n  if (typeof bound == \"string\") {\n    bound = commands[bound]\n    if (!bound) return false\n  }\n  // Ensure previous input has been read, so that the handler sees a\n  // consistent view of the document\n  cm.display.input.ensurePolled()\n  let prevShift = cm.display.shift, done = false\n  try {\n    if (cm.isReadOnly()) cm.state.suppressEdits = true\n    if (dropShift) cm.display.shift = false\n    done = bound(cm) != Pass\n  } finally {\n    cm.display.shift = prevShift\n    cm.state.suppressEdits = false\n  }\n  return done\n}\n\nfunction lookupKeyForEditor(cm, name, handle) {\n  for (let i = 0; i < cm.state.keyMaps.length; i++) {\n    let result = lookupKey(name, cm.state.keyMaps[i], handle, cm)\n    if (result) return result\n  }\n  return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))\n    || lookupKey(name, cm.options.keyMap, handle, cm)\n}\n\n// Note that, despite the name, this function is also used to check\n// for bound mouse clicks.\n\nlet stopSeq = new Delayed\n\nexport function dispatchKey(cm, name, e, handle) {\n  let seq = cm.state.keySeq\n  if (seq) {\n    if (isModifierKey(name)) return \"handled\"\n    if (/\\'$/.test(name))\n      cm.state.keySeq = null\n    else\n      stopSeq.set(50, () => {\n        if (cm.state.keySeq == seq) {\n          cm.state.keySeq = null\n          cm.display.input.reset()\n        }\n      })\n    if (dispatchKeyInner(cm, seq + \" \" + name, e, handle)) return true\n  }\n  return dispatchKeyInner(cm, name, e, handle)\n}\n\nfunction dispatchKeyInner(cm, name, e, handle) {\n  let result = lookupKeyForEditor(cm, name, handle)\n\n  if (result == \"multi\")\n    cm.state.keySeq = name\n  if (result == \"handled\")\n    signalLater(cm, \"keyHandled\", cm, name, e)\n\n  if (result == \"handled\" || result == \"multi\") {\n    e_preventDefault(e)\n    restartBlink(cm)\n  }\n\n  return !!result\n}\n\n// Handle a key from the keydown event.\nfunction handleKeyBinding(cm, e) {\n  let name = keyName(e, true)\n  if (!name) return false\n\n  if (e.shiftKey && !cm.state.keySeq) {\n    // First try to resolve full name (including 'Shift-'). Failing\n    // that, see if there is a cursor-motion command (starting with\n    // 'go') bound to the keyname without 'Shift-'.\n    return dispatchKey(cm, \"Shift-\" + name, e, b => doHandleBinding(cm, b, true))\n        || dispatchKey(cm, name, e, b => {\n             if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n               return doHandleBinding(cm, b)\n           })\n  } else {\n    return dispatchKey(cm, name, e, b => doHandleBinding(cm, b))\n  }\n}\n\n// Handle a key from the keypress event\nfunction handleCharBinding(cm, e, ch) {\n  return dispatchKey(cm, \"'\" + ch + \"'\", e, b => doHandleBinding(cm, b, true))\n}\n\nlet lastStoppedKey = null\nexport function onKeyDown(e) {\n  let cm = this\n  if (e.target && e.target != cm.display.input.getField()) return\n  cm.curOp.focus = activeElt()\n  if (signalDOMEvent(cm, e)) return\n  // IE does strange things with escape.\n  if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false\n  let code = e.keyCode\n  cm.display.shift = code == 16 || e.shiftKey\n  let handled = handleKeyBinding(cm, e)\n  if (presto) {\n    lastStoppedKey = handled ? code : null\n    // Opera has no cut event... we try to at least catch the key combo\n    if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n      cm.replaceSelection(\"\", null, \"cut\")\n  }\n  if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)\n    document.execCommand(\"cut\")\n\n  // Turn mouse into crosshair when Alt is held on Mac.\n  if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n    showCrossHair(cm)\n}\n\nfunction showCrossHair(cm) {\n  let lineDiv = cm.display.lineDiv\n  addClass(lineDiv, \"CodeMirror-crosshair\")\n\n  function up(e) {\n    if (e.keyCode == 18 || !e.altKey) {\n      rmClass(lineDiv, \"CodeMirror-crosshair\")\n      off(document, \"keyup\", up)\n      off(document, \"mouseover\", up)\n    }\n  }\n  on(document, \"keyup\", up)\n  on(document, \"mouseover\", up)\n}\n\nexport function onKeyUp(e) {\n  if (e.keyCode == 16) this.doc.sel.shift = false\n  signalDOMEvent(this, e)\n}\n\nexport function onKeyPress(e) {\n  let cm = this\n  if (e.target && e.target != cm.display.input.getField()) return\n  if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return\n  let keyCode = e.keyCode, charCode = e.charCode\n  if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}\n  if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) return\n  let ch = String.fromCharCode(charCode == null ? keyCode : charCode)\n  // Some browsers fire keypress events for backspace\n  if (ch == \"\\x08\") return\n  if (handleCharBinding(cm, e, ch)) return\n  cm.display.input.onKeyPress(e)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/legacy.js",
    "content": "import { scrollbarModel } from \"../display/scrollbars.js\"\nimport { wheelEventPixels } from \"../display/scroll_events.js\"\nimport { keyMap, keyName, isModifierKey, lookupKey, normalizeKeyMap } from \"../input/keymap.js\"\nimport { keyNames } from \"../input/keynames.js\"\nimport { Line } from \"../line/line_data.js\"\nimport { cmp, Pos } from \"../line/pos.js\"\nimport { changeEnd } from \"../model/change_measurement.js\"\nimport Doc from \"../model/Doc.js\"\nimport { LineWidget } from \"../model/line_widget.js\"\nimport { SharedTextMarker, TextMarker } from \"../model/mark_text.js\"\nimport { copyState, extendMode, getMode, innerMode, mimeModes, modeExtensions, modes, resolveMode, startState } from \"../modes.js\"\nimport { addClass, contains, rmClass } from \"../util/dom.js\"\nimport { e_preventDefault, e_stop, e_stopPropagation, off, on, signal } from \"../util/event.js\"\nimport { splitLinesAuto } from \"../util/feature_detection.js\"\nimport { countColumn, findColumn, isWordCharBasic, Pass } from \"../util/misc.js\"\nimport StringStream from \"../util/StringStream.js\"\n\nimport { commands } from \"./commands.js\"\n\nexport function addLegacyProps(CodeMirror) {\n  CodeMirror.off = off\n  CodeMirror.on = on\n  CodeMirror.wheelEventPixels = wheelEventPixels\n  CodeMirror.Doc = Doc\n  CodeMirror.splitLines = splitLinesAuto\n  CodeMirror.countColumn = countColumn\n  CodeMirror.findColumn = findColumn\n  CodeMirror.isWordChar = isWordCharBasic\n  CodeMirror.Pass = Pass\n  CodeMirror.signal = signal\n  CodeMirror.Line = Line\n  CodeMirror.changeEnd = changeEnd\n  CodeMirror.scrollbarModel = scrollbarModel\n  CodeMirror.Pos = Pos\n  CodeMirror.cmpPos = cmp\n  CodeMirror.modes = modes\n  CodeMirror.mimeModes = mimeModes\n  CodeMirror.resolveMode = resolveMode\n  CodeMirror.getMode = getMode\n  CodeMirror.modeExtensions = modeExtensions\n  CodeMirror.extendMode = extendMode\n  CodeMirror.copyState = copyState\n  CodeMirror.startState = startState\n  CodeMirror.innerMode = innerMode\n  CodeMirror.commands = commands\n  CodeMirror.keyMap = keyMap\n  CodeMirror.keyName = keyName\n  CodeMirror.isModifierKey = isModifierKey\n  CodeMirror.lookupKey = lookupKey\n  CodeMirror.normalizeKeyMap = normalizeKeyMap\n  CodeMirror.StringStream = StringStream\n  CodeMirror.SharedTextMarker = SharedTextMarker\n  CodeMirror.TextMarker = TextMarker\n  CodeMirror.LineWidget = LineWidget\n  CodeMirror.e_preventDefault = e_preventDefault\n  CodeMirror.e_stopPropagation = e_stopPropagation\n  CodeMirror.e_stop = e_stop\n  CodeMirror.addClass = addClass\n  CodeMirror.contains = contains\n  CodeMirror.rmClass = rmClass\n  CodeMirror.keyNames = keyNames\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/main.js",
    "content": "// EDITOR CONSTRUCTOR\n\nimport { CodeMirror } from \"./CodeMirror.js\"\nexport { CodeMirror } from \"./CodeMirror.js\"\n\nimport { eventMixin } from \"../util/event.js\"\nimport { indexOf } from \"../util/misc.js\"\n\nimport { defineOptions } from \"./options.js\"\n\ndefineOptions(CodeMirror)\n\nimport addEditorMethods from \"./methods.js\"\n\naddEditorMethods(CodeMirror)\n\nimport Doc from \"../model/Doc.js\"\n\n// Set up methods on CodeMirror's prototype to redirect to the editor's document.\nlet dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \")\nfor (let prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n  CodeMirror.prototype[prop] = (function(method) {\n    return function() {return method.apply(this.doc, arguments)}\n  })(Doc.prototype[prop])\n\neventMixin(Doc)\n\n// INPUT HANDLING\n\nimport ContentEditableInput from \"../input/ContentEditableInput.js\"\nimport TextareaInput from \"../input/TextareaInput.js\"\nCodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput}\n\n// MODE DEFINITION AND QUERYING\n\nimport { defineMIME, defineMode } from \"../modes.js\"\n\n// Extra arguments are stored as the mode's dependencies, which is\n// used by (legacy) mechanisms like loadmode.js to automatically\n// load a mode. (Preferred mechanism is the require/define calls.)\nCodeMirror.defineMode = function(name/*, mode, …*/) {\n  if (!CodeMirror.defaults.mode && name != \"null\") CodeMirror.defaults.mode = name\n  defineMode.apply(this, arguments)\n}\n\nCodeMirror.defineMIME = defineMIME\n\n// Minimal default mode.\nCodeMirror.defineMode(\"null\", () => ({token: stream => stream.skipToEnd()}))\nCodeMirror.defineMIME(\"text/plain\", \"null\")\n\n// EXTENSIONS\n\nCodeMirror.defineExtension = (name, func) => {\n  CodeMirror.prototype[name] = func\n}\nCodeMirror.defineDocExtension = (name, func) => {\n  Doc.prototype[name] = func\n}\n\nimport { fromTextArea } from \"./fromTextArea.js\"\n\nCodeMirror.fromTextArea = fromTextArea\n\nimport { addLegacyProps } from \"./legacy.js\"\n\naddLegacyProps(CodeMirror)\n\nCodeMirror.version = \"5.65.2\"\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/methods.js",
    "content": "import { deleteNearSelection } from \"./deleteNearSelection.js\"\nimport { commands } from \"./commands.js\"\nimport { attachDoc } from \"../model/document_data.js\"\nimport { activeElt, addClass, rmClass } from \"../util/dom.js\"\nimport { eventMixin, signal } from \"../util/event.js\"\nimport { getLineStyles, getContextBefore, takeToken } from \"../line/highlight.js\"\nimport { indentLine } from \"../input/indent.js\"\nimport { triggerElectric } from \"../input/input.js\"\nimport { onKeyDown, onKeyPress, onKeyUp } from \"./key_events.js\"\nimport { onMouseDown } from \"./mouse_events.js\"\nimport { getKeyMap } from \"../input/keymap.js\"\nimport { endOfLine, moveLogically, moveVisually } from \"../input/movement.js\"\nimport { endOperation, methodOp, operation, runInOp, startOperation } from \"../display/operations.js\"\nimport { clipLine, clipPos, equalCursorPos, Pos } from \"../line/pos.js\"\nimport { charCoords, charWidth, clearCaches, clearLineMeasurementCache, coordsChar, cursorCoords, displayHeight, displayWidth, estimateLineHeights, fromCoordSystem, intoCoordSystem, scrollGap, textHeight } from \"../measurement/position_measurement.js\"\nimport { Range } from \"../model/selection.js\"\nimport { replaceOneSelection, skipAtomic } from \"../model/selection_updates.js\"\nimport { addToScrollTop, ensureCursorVisible, scrollIntoView, scrollToCoords, scrollToCoordsRange, scrollToRange } from \"../display/scrolling.js\"\nimport { heightAtLine } from \"../line/spans.js\"\nimport { updateGutterSpace } from \"../display/update_display.js\"\nimport { indexOf, insertSorted, isWordChar, sel_dontScroll, sel_move } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\nimport { getLine, isLine, lineAtHeight } from \"../line/utils_line.js\"\nimport { regChange, regLineChange } from \"../display/view_tracking.js\"\n\n// The publicly visible API. Note that methodOp(f) means\n// 'wrap f in an operation, performed on its `this` parameter'.\n\n// This is not the complete set of editor methods. Most of the\n// methods defined on the Doc type are also injected into\n// CodeMirror.prototype, for backwards compatibility and\n// convenience.\n\nexport default function(CodeMirror) {\n  let optionHandlers = CodeMirror.optionHandlers\n\n  let helpers = CodeMirror.helpers = {}\n\n  CodeMirror.prototype = {\n    constructor: CodeMirror,\n    focus: function(){window.focus(); this.display.input.focus()},\n\n    setOption: function(option, value) {\n      let options = this.options, old = options[option]\n      if (options[option] == value && option != \"mode\") return\n      options[option] = value\n      if (optionHandlers.hasOwnProperty(option))\n        operation(this, optionHandlers[option])(this, value, old)\n      signal(this, \"optionChange\", this, option)\n    },\n\n    getOption: function(option) {return this.options[option]},\n    getDoc: function() {return this.doc},\n\n    addKeyMap: function(map, bottom) {\n      this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map))\n    },\n    removeKeyMap: function(map) {\n      let maps = this.state.keyMaps\n      for (let i = 0; i < maps.length; ++i)\n        if (maps[i] == map || maps[i].name == map) {\n          maps.splice(i, 1)\n          return true\n        }\n    },\n\n    addOverlay: methodOp(function(spec, options) {\n      let mode = spec.token ? spec : CodeMirror.getMode(this.options, spec)\n      if (mode.startState) throw new Error(\"Overlays may not be stateful.\")\n      insertSorted(this.state.overlays,\n                   {mode: mode, modeSpec: spec, opaque: options && options.opaque,\n                    priority: (options && options.priority) || 0},\n                   overlay => overlay.priority)\n      this.state.modeGen++\n      regChange(this)\n    }),\n    removeOverlay: methodOp(function(spec) {\n      let overlays = this.state.overlays\n      for (let i = 0; i < overlays.length; ++i) {\n        let cur = overlays[i].modeSpec\n        if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n          overlays.splice(i, 1)\n          this.state.modeGen++\n          regChange(this)\n          return\n        }\n      }\n    }),\n\n    indentLine: methodOp(function(n, dir, aggressive) {\n      if (typeof dir != \"string\" && typeof dir != \"number\") {\n        if (dir == null) dir = this.options.smartIndent ? \"smart\" : \"prev\"\n        else dir = dir ? \"add\" : \"subtract\"\n      }\n      if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive)\n    }),\n    indentSelection: methodOp(function(how) {\n      let ranges = this.doc.sel.ranges, end = -1\n      for (let i = 0; i < ranges.length; i++) {\n        let range = ranges[i]\n        if (!range.empty()) {\n          let from = range.from(), to = range.to()\n          let start = Math.max(end, from.line)\n          end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1\n          for (let j = start; j < end; ++j)\n            indentLine(this, j, how)\n          let newRanges = this.doc.sel.ranges\n          if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n            replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll)\n        } else if (range.head.line > end) {\n          indentLine(this, range.head.line, how, true)\n          end = range.head.line\n          if (i == this.doc.sel.primIndex) ensureCursorVisible(this)\n        }\n      }\n    }),\n\n    // Fetch the parser token for a given character. Useful for hacks\n    // that want to inspect the mode state (say, for completion).\n    getTokenAt: function(pos, precise) {\n      return takeToken(this, pos, precise)\n    },\n\n    getLineTokens: function(line, precise) {\n      return takeToken(this, Pos(line), precise, true)\n    },\n\n    getTokenTypeAt: function(pos) {\n      pos = clipPos(this.doc, pos)\n      let styles = getLineStyles(this, getLine(this.doc, pos.line))\n      let before = 0, after = (styles.length - 1) / 2, ch = pos.ch\n      let type\n      if (ch == 0) type = styles[2]\n      else for (;;) {\n        let mid = (before + after) >> 1\n        if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid\n        else if (styles[mid * 2 + 1] < ch) before = mid + 1\n        else { type = styles[mid * 2 + 2]; break }\n      }\n      let cut = type ? type.indexOf(\"overlay \") : -1\n      return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)\n    },\n\n    getModeAt: function(pos) {\n      let mode = this.doc.mode\n      if (!mode.innerMode) return mode\n      return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode\n    },\n\n    getHelper: function(pos, type) {\n      return this.getHelpers(pos, type)[0]\n    },\n\n    getHelpers: function(pos, type) {\n      let found = []\n      if (!helpers.hasOwnProperty(type)) return found\n      let help = helpers[type], mode = this.getModeAt(pos)\n      if (typeof mode[type] == \"string\") {\n        if (help[mode[type]]) found.push(help[mode[type]])\n      } else if (mode[type]) {\n        for (let i = 0; i < mode[type].length; i++) {\n          let val = help[mode[type][i]]\n          if (val) found.push(val)\n        }\n      } else if (mode.helperType && help[mode.helperType]) {\n        found.push(help[mode.helperType])\n      } else if (help[mode.name]) {\n        found.push(help[mode.name])\n      }\n      for (let i = 0; i < help._global.length; i++) {\n        let cur = help._global[i]\n        if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n          found.push(cur.val)\n      }\n      return found\n    },\n\n    getStateAfter: function(line, precise) {\n      let doc = this.doc\n      line = clipLine(doc, line == null ? doc.first + doc.size - 1: line)\n      return getContextBefore(this, line + 1, precise).state\n    },\n\n    cursorCoords: function(start, mode) {\n      let pos, range = this.doc.sel.primary()\n      if (start == null) pos = range.head\n      else if (typeof start == \"object\") pos = clipPos(this.doc, start)\n      else pos = start ? range.from() : range.to()\n      return cursorCoords(this, pos, mode || \"page\")\n    },\n\n    charCoords: function(pos, mode) {\n      return charCoords(this, clipPos(this.doc, pos), mode || \"page\")\n    },\n\n    coordsChar: function(coords, mode) {\n      coords = fromCoordSystem(this, coords, mode || \"page\")\n      return coordsChar(this, coords.left, coords.top)\n    },\n\n    lineAtHeight: function(height, mode) {\n      height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top\n      return lineAtHeight(this.doc, height + this.display.viewOffset)\n    },\n    heightAtLine: function(line, mode, includeWidgets) {\n      let end = false, lineObj\n      if (typeof line == \"number\") {\n        let last = this.doc.first + this.doc.size - 1\n        if (line < this.doc.first) line = this.doc.first\n        else if (line > last) { line = last; end = true }\n        lineObj = getLine(this.doc, line)\n      } else {\n        lineObj = line\n      }\n      return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\", includeWidgets || end).top +\n        (end ? this.doc.height - heightAtLine(lineObj) : 0)\n    },\n\n    defaultTextHeight: function() { return textHeight(this.display) },\n    defaultCharWidth: function() { return charWidth(this.display) },\n\n    getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},\n\n    addWidget: function(pos, node, scroll, vert, horiz) {\n      let display = this.display\n      pos = cursorCoords(this, clipPos(this.doc, pos))\n      let top = pos.bottom, left = pos.left\n      node.style.position = \"absolute\"\n      node.setAttribute(\"cm-ignore-events\", \"true\")\n      this.display.input.setUneditable(node)\n      display.sizer.appendChild(node)\n      if (vert == \"over\") {\n        top = pos.top\n      } else if (vert == \"above\" || vert == \"near\") {\n        let vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n        hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth)\n        // Default to positioning above (if specified and possible); otherwise default to positioning below\n        if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n          top = pos.top - node.offsetHeight\n        else if (pos.bottom + node.offsetHeight <= vspace)\n          top = pos.bottom\n        if (left + node.offsetWidth > hspace)\n          left = hspace - node.offsetWidth\n      }\n      node.style.top = top + \"px\"\n      node.style.left = node.style.right = \"\"\n      if (horiz == \"right\") {\n        left = display.sizer.clientWidth - node.offsetWidth\n        node.style.right = \"0px\"\n      } else {\n        if (horiz == \"left\") left = 0\n        else if (horiz == \"middle\") left = (display.sizer.clientWidth - node.offsetWidth) / 2\n        node.style.left = left + \"px\"\n      }\n      if (scroll)\n        scrollIntoView(this, {left, top, right: left + node.offsetWidth, bottom: top + node.offsetHeight})\n    },\n\n    triggerOnKeyDown: methodOp(onKeyDown),\n    triggerOnKeyPress: methodOp(onKeyPress),\n    triggerOnKeyUp: onKeyUp,\n    triggerOnMouseDown: methodOp(onMouseDown),\n\n    execCommand: function(cmd) {\n      if (commands.hasOwnProperty(cmd))\n        return commands[cmd].call(null, this)\n    },\n\n    triggerElectric: methodOp(function(text) { triggerElectric(this, text) }),\n\n    findPosH: function(from, amount, unit, visually) {\n      let dir = 1\n      if (amount < 0) { dir = -1; amount = -amount }\n      let cur = clipPos(this.doc, from)\n      for (let i = 0; i < amount; ++i) {\n        cur = findPosH(this.doc, cur, dir, unit, visually)\n        if (cur.hitSide) break\n      }\n      return cur\n    },\n\n    moveH: methodOp(function(dir, unit) {\n      this.extendSelectionsBy(range => {\n        if (this.display.shift || this.doc.extend || range.empty())\n          return findPosH(this.doc, range.head, dir, unit, this.options.rtlMoveVisually)\n        else\n          return dir < 0 ? range.from() : range.to()\n      }, sel_move)\n    }),\n\n    deleteH: methodOp(function(dir, unit) {\n      let sel = this.doc.sel, doc = this.doc\n      if (sel.somethingSelected())\n        doc.replaceSelection(\"\", null, \"+delete\")\n      else\n        deleteNearSelection(this, range => {\n          let other = findPosH(doc, range.head, dir, unit, false)\n          return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}\n        })\n    }),\n\n    findPosV: function(from, amount, unit, goalColumn) {\n      let dir = 1, x = goalColumn\n      if (amount < 0) { dir = -1; amount = -amount }\n      let cur = clipPos(this.doc, from)\n      for (let i = 0; i < amount; ++i) {\n        let coords = cursorCoords(this, cur, \"div\")\n        if (x == null) x = coords.left\n        else coords.left = x\n        cur = findPosV(this, coords, dir, unit)\n        if (cur.hitSide) break\n      }\n      return cur\n    },\n\n    moveV: methodOp(function(dir, unit) {\n      let doc = this.doc, goals = []\n      let collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected()\n      doc.extendSelectionsBy(range => {\n        if (collapse)\n          return dir < 0 ? range.from() : range.to()\n        let headPos = cursorCoords(this, range.head, \"div\")\n        if (range.goalColumn != null) headPos.left = range.goalColumn\n        goals.push(headPos.left)\n        let pos = findPosV(this, headPos, dir, unit)\n        if (unit == \"page\" && range == doc.sel.primary())\n          addToScrollTop(this, charCoords(this, pos, \"div\").top - headPos.top)\n        return pos\n      }, sel_move)\n      if (goals.length) for (let i = 0; i < doc.sel.ranges.length; i++)\n        doc.sel.ranges[i].goalColumn = goals[i]\n    }),\n\n    // Find the word at the given position (as returned by coordsChar).\n    findWordAt: function(pos) {\n      let doc = this.doc, line = getLine(doc, pos.line).text\n      let start = pos.ch, end = pos.ch\n      if (line) {\n        let helper = this.getHelper(pos, \"wordChars\")\n        if ((pos.sticky == \"before\" || end == line.length) && start) --start; else ++end\n        let startChar = line.charAt(start)\n        let check = isWordChar(startChar, helper)\n          ? ch => isWordChar(ch, helper)\n          : /\\s/.test(startChar) ? ch => /\\s/.test(ch)\n          : ch => (!/\\s/.test(ch) && !isWordChar(ch))\n        while (start > 0 && check(line.charAt(start - 1))) --start\n        while (end < line.length && check(line.charAt(end))) ++end\n      }\n      return new Range(Pos(pos.line, start), Pos(pos.line, end))\n    },\n\n    toggleOverwrite: function(value) {\n      if (value != null && value == this.state.overwrite) return\n      if (this.state.overwrite = !this.state.overwrite)\n        addClass(this.display.cursorDiv, \"CodeMirror-overwrite\")\n      else\n        rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\")\n\n      signal(this, \"overwriteToggle\", this, this.state.overwrite)\n    },\n    hasFocus: function() { return this.display.input.getField() == activeElt() },\n    isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },\n\n    scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y) }),\n    getScrollInfo: function() {\n      let scroller = this.display.scroller\n      return {left: scroller.scrollLeft, top: scroller.scrollTop,\n              height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n              width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n              clientHeight: displayHeight(this), clientWidth: displayWidth(this)}\n    },\n\n    scrollIntoView: methodOp(function(range, margin) {\n      if (range == null) {\n        range = {from: this.doc.sel.primary().head, to: null}\n        if (margin == null) margin = this.options.cursorScrollMargin\n      } else if (typeof range == \"number\") {\n        range = {from: Pos(range, 0), to: null}\n      } else if (range.from == null) {\n        range = {from: range, to: null}\n      }\n      if (!range.to) range.to = range.from\n      range.margin = margin || 0\n\n      if (range.from.line != null) {\n        scrollToRange(this, range)\n      } else {\n        scrollToCoordsRange(this, range.from, range.to, range.margin)\n      }\n    }),\n\n    setSize: methodOp(function(width, height) {\n      let interpret = val => typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val\n      if (width != null) this.display.wrapper.style.width = interpret(width)\n      if (height != null) this.display.wrapper.style.height = interpret(height)\n      if (this.options.lineWrapping) clearLineMeasurementCache(this)\n      let lineNo = this.display.viewFrom\n      this.doc.iter(lineNo, this.display.viewTo, line => {\n        if (line.widgets) for (let i = 0; i < line.widgets.length; i++)\n          if (line.widgets[i].noHScroll) { regLineChange(this, lineNo, \"widget\"); break }\n        ++lineNo\n      })\n      this.curOp.forceUpdate = true\n      signal(this, \"refresh\", this)\n    }),\n\n    operation: function(f){return runInOp(this, f)},\n    startOperation: function(){return startOperation(this)},\n    endOperation: function(){return endOperation(this)},\n\n    refresh: methodOp(function() {\n      let oldHeight = this.display.cachedTextHeight\n      regChange(this)\n      this.curOp.forceUpdate = true\n      clearCaches(this)\n      scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop)\n      updateGutterSpace(this.display)\n      if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)\n        estimateLineHeights(this)\n      signal(this, \"refresh\", this)\n    }),\n\n    swapDoc: methodOp(function(doc) {\n      let old = this.doc\n      old.cm = null\n      // Cancel the current text selection if any (#5821)\n      if (this.state.selectingText) this.state.selectingText()\n      attachDoc(this, doc)\n      clearCaches(this)\n      this.display.input.reset()\n      scrollToCoords(this, doc.scrollLeft, doc.scrollTop)\n      this.curOp.forceScroll = true\n      signalLater(this, \"swapDoc\", this, old)\n      return old\n    }),\n\n    phrase: function(phraseText) {\n      let phrases = this.options.phrases\n      return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText\n    },\n\n    getInputField: function(){return this.display.input.getField()},\n    getWrapperElement: function(){return this.display.wrapper},\n    getScrollerElement: function(){return this.display.scroller},\n    getGutterElement: function(){return this.display.gutters}\n  }\n  eventMixin(CodeMirror)\n\n  CodeMirror.registerHelper = function(type, name, value) {\n    if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []}\n    helpers[type][name] = value\n  }\n  CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n    CodeMirror.registerHelper(type, name, value)\n    helpers[type]._global.push({pred: predicate, val: value})\n  }\n}\n\n// Used for horizontal relative motion. Dir is -1 or 1 (left or\n// right), unit can be \"codepoint\", \"char\", \"column\" (like char, but\n// doesn't cross line boundaries), \"word\" (across next word), or\n// \"group\" (to the start of next group of word or\n// non-word-non-whitespace chars). The visually param controls\n// whether, in right-to-left text, direction 1 means to move towards\n// the next index in the string, or towards the character to the right\n// of the current position. The resulting position will have a\n// hitSide=true property if it reached the end of the document.\nfunction findPosH(doc, pos, dir, unit, visually) {\n  let oldPos = pos\n  let origDir = dir\n  let lineObj = getLine(doc, pos.line)\n  let lineDir = visually && doc.direction == \"rtl\" ? -dir : dir\n  function findNextLine() {\n    let l = pos.line + lineDir\n    if (l < doc.first || l >= doc.first + doc.size) return false\n    pos = new Pos(l, pos.ch, pos.sticky)\n    return lineObj = getLine(doc, l)\n  }\n  function moveOnce(boundToLine) {\n    let next\n    if (unit == \"codepoint\") {\n      let ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1))\n      if (isNaN(ch)) {\n        next = null\n      } else {\n        let astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF\n        next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir)\n      }\n    } else if (visually) {\n      next = moveVisually(doc.cm, lineObj, pos, dir)\n    } else {\n      next = moveLogically(lineObj, pos, dir)\n    }\n    if (next == null) {\n      if (!boundToLine && findNextLine())\n        pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir)\n      else\n        return false\n    } else {\n      pos = next\n    }\n    return true\n  }\n\n  if (unit == \"char\" || unit == \"codepoint\") {\n    moveOnce()\n  } else if (unit == \"column\") {\n    moveOnce(true)\n  } else if (unit == \"word\" || unit == \"group\") {\n    let sawType = null, group = unit == \"group\"\n    let helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\")\n    for (let first = true;; first = false) {\n      if (dir < 0 && !moveOnce(!first)) break\n      let cur = lineObj.text.charAt(pos.ch) || \"\\n\"\n      let type = isWordChar(cur, helper) ? \"w\"\n        : group && cur == \"\\n\" ? \"n\"\n        : !group || /\\s/.test(cur) ? null\n        : \"p\"\n      if (group && !first && !type) type = \"s\"\n      if (sawType && sawType != type) {\n        if (dir < 0) {dir = 1; moveOnce(); pos.sticky = \"after\"}\n        break\n      }\n\n      if (type) sawType = type\n      if (dir > 0 && !moveOnce(!first)) break\n    }\n  }\n  let result = skipAtomic(doc, pos, oldPos, origDir, true)\n  if (equalCursorPos(oldPos, result)) result.hitSide = true\n  return result\n}\n\n// For relative vertical movement. Dir may be -1 or 1. Unit can be\n// \"page\" or \"line\". The resulting position will have a hitSide=true\n// property if it reached the end of the document.\nfunction findPosV(cm, pos, dir, unit) {\n  let doc = cm.doc, x = pos.left, y\n  if (unit == \"page\") {\n    let pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight)\n    let moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3)\n    y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount\n\n  } else if (unit == \"line\") {\n    y = dir > 0 ? pos.bottom + 3 : pos.top - 3\n  }\n  let target\n  for (;;) {\n    target = coordsChar(cm, x, y)\n    if (!target.outside) break\n    if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }\n    y += dir * 5\n  }\n  return target\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/mouse_events.js",
    "content": "import { delayBlurEvent, ensureFocus } from \"../display/focus.js\"\nimport { operation } from \"../display/operations.js\"\nimport { visibleLines } from \"../display/update_lines.js\"\nimport { clipPos, cmp, maxPos, minPos, Pos } from \"../line/pos.js\"\nimport { getLine, lineAtHeight } from \"../line/utils_line.js\"\nimport { posFromMouse } from \"../measurement/position_measurement.js\"\nimport { eventInWidget } from \"../measurement/widgets.js\"\nimport { normalizeSelection, Range, Selection } from \"../model/selection.js\"\nimport { extendRange, extendSelection, replaceOneSelection, setSelection } from \"../model/selection_updates.js\"\nimport { captureRightClick, chromeOS, ie, ie_version, mac, webkit, safari } from \"../util/browser.js\"\nimport { getOrder, getBidiPartAt } from \"../util/bidi.js\"\nimport { activeElt } from \"../util/dom.js\"\nimport { e_button, e_defaultPrevented, e_preventDefault, e_target, hasHandler, off, on, signal, signalDOMEvent } from \"../util/event.js\"\nimport { dragAndDrop } from \"../util/feature_detection.js\"\nimport { bind, countColumn, findColumn, sel_mouse } from \"../util/misc.js\"\nimport { addModifierNames } from \"../input/keymap.js\"\nimport { Pass } from \"../util/misc.js\"\n\nimport { dispatchKey } from \"./key_events.js\"\nimport { commands } from \"./commands.js\"\n\nconst DOUBLECLICK_DELAY = 400\n\nclass PastClick {\n  constructor(time, pos, button) {\n    this.time = time\n    this.pos = pos\n    this.button = button\n  }\n\n  compare(time, pos, button) {\n    return this.time + DOUBLECLICK_DELAY > time &&\n      cmp(pos, this.pos) == 0 && button == this.button\n  }\n}\n\nlet lastClick, lastDoubleClick\nfunction clickRepeat(pos, button) {\n  let now = +new Date\n  if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {\n    lastClick = lastDoubleClick = null\n    return \"triple\"\n  } else if (lastClick && lastClick.compare(now, pos, button)) {\n    lastDoubleClick = new PastClick(now, pos, button)\n    lastClick = null\n    return \"double\"\n  } else {\n    lastClick = new PastClick(now, pos, button)\n    lastDoubleClick = null\n    return \"single\"\n  }\n}\n\n// A mouse down can be a single click, double click, triple click,\n// start of selection drag, start of text drag, new cursor\n// (ctrl-click), rectangle drag (alt-drag), or xwin\n// middle-click-paste. Or it might be a click on something we should\n// not interfere with, such as a scrollbar or widget.\nexport function onMouseDown(e) {\n  let cm = this, display = cm.display\n  if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) return\n  display.input.ensurePolled()\n  display.shift = e.shiftKey\n\n  if (eventInWidget(display, e)) {\n    if (!webkit) {\n      // Briefly turn off draggability, to allow widgets to do\n      // normal dragging things.\n      display.scroller.draggable = false\n      setTimeout(() => display.scroller.draggable = true, 100)\n    }\n    return\n  }\n  if (clickInGutter(cm, e)) return\n  let pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : \"single\"\n  window.focus()\n\n  // #3261: make sure, that we're not starting a second selection\n  if (button == 1 && cm.state.selectingText)\n    cm.state.selectingText(e)\n\n  if (pos && handleMappedButton(cm, button, pos, repeat, e)) return\n\n  if (button == 1) {\n    if (pos) leftButtonDown(cm, pos, repeat, e)\n    else if (e_target(e) == display.scroller) e_preventDefault(e)\n  } else if (button == 2) {\n    if (pos) extendSelection(cm.doc, pos)\n    setTimeout(() => display.input.focus(), 20)\n  } else if (button == 3) {\n    if (captureRightClick) cm.display.input.onContextMenu(e)\n    else delayBlurEvent(cm)\n  }\n}\n\nfunction handleMappedButton(cm, button, pos, repeat, event) {\n  let name = \"Click\"\n  if (repeat == \"double\") name = \"Double\" + name\n  else if (repeat == \"triple\") name = \"Triple\" + name\n  name = (button == 1 ? \"Left\" : button == 2 ? \"Middle\" : \"Right\") + name\n\n  return dispatchKey(cm,  addModifierNames(name, event), event, bound => {\n    if (typeof bound == \"string\") bound = commands[bound]\n    if (!bound) return false\n    let done = false\n    try {\n      if (cm.isReadOnly()) cm.state.suppressEdits = true\n      done = bound(cm, pos) != Pass\n    } finally {\n      cm.state.suppressEdits = false\n    }\n    return done\n  })\n}\n\nfunction configureMouse(cm, repeat, event) {\n  let option = cm.getOption(\"configureMouse\")\n  let value = option ? option(cm, repeat, event) : {}\n  if (value.unit == null) {\n    let rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey\n    value.unit = rect ? \"rectangle\" : repeat == \"single\" ? \"char\" : repeat == \"double\" ? \"word\" : \"line\"\n  }\n  if (value.extend == null || cm.doc.extend) value.extend = cm.doc.extend || event.shiftKey\n  if (value.addNew == null) value.addNew = mac ? event.metaKey : event.ctrlKey\n  if (value.moveOnDrag == null) value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey)\n  return value\n}\n\nfunction leftButtonDown(cm, pos, repeat, event) {\n  if (ie) setTimeout(bind(ensureFocus, cm), 0)\n  else cm.curOp.focus = activeElt()\n\n  let behavior = configureMouse(cm, repeat, event)\n\n  let sel = cm.doc.sel, contained\n  if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n      repeat == \"single\" && (contained = sel.contains(pos)) > -1 &&\n      (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&\n      (cmp(contained.to(), pos) > 0 || pos.xRel < 0))\n    leftButtonStartDrag(cm, event, pos, behavior)\n  else\n    leftButtonSelect(cm, event, pos, behavior)\n}\n\n// Start a text drag. When it ends, see if any dragging actually\n// happen, and treat as a click if it didn't.\nfunction leftButtonStartDrag(cm, event, pos, behavior) {\n  let display = cm.display, moved = false\n  let dragEnd = operation(cm, e => {\n    if (webkit) display.scroller.draggable = false\n    cm.state.draggingText = false\n    if (cm.state.delayingBlurEvent) {\n      if (cm.hasFocus()) cm.state.delayingBlurEvent = false\n      else delayBlurEvent(cm)\n    }\n    off(display.wrapper.ownerDocument, \"mouseup\", dragEnd)\n    off(display.wrapper.ownerDocument, \"mousemove\", mouseMove)\n    off(display.scroller, \"dragstart\", dragStart)\n    off(display.scroller, \"drop\", dragEnd)\n    if (!moved) {\n      e_preventDefault(e)\n      if (!behavior.addNew)\n        extendSelection(cm.doc, pos, null, null, behavior.extend)\n      // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n      if ((webkit && !safari) || ie && ie_version == 9)\n        setTimeout(() => {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus()}, 20)\n      else\n        display.input.focus()\n    }\n  })\n  let mouseMove = function(e2) {\n    moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10\n  }\n  let dragStart = () => moved = true\n  // Let the drag handler handle this.\n  if (webkit) display.scroller.draggable = true\n  cm.state.draggingText = dragEnd\n  dragEnd.copy = !behavior.moveOnDrag\n  on(display.wrapper.ownerDocument, \"mouseup\", dragEnd)\n  on(display.wrapper.ownerDocument, \"mousemove\", mouseMove)\n  on(display.scroller, \"dragstart\", dragStart)\n  on(display.scroller, \"drop\", dragEnd)\n\n  cm.state.delayingBlurEvent = true\n  setTimeout(() => display.input.focus(), 20)\n  // IE's approach to draggable\n  if (display.scroller.dragDrop) display.scroller.dragDrop()\n}\n\nfunction rangeForUnit(cm, pos, unit) {\n  if (unit == \"char\") return new Range(pos, pos)\n  if (unit == \"word\") return cm.findWordAt(pos)\n  if (unit == \"line\") return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0)))\n  let result = unit(cm, pos)\n  return new Range(result.from, result.to)\n}\n\n// Normal selection, as opposed to text dragging.\nfunction leftButtonSelect(cm, event, start, behavior) {\n  if (ie) delayBlurEvent(cm)\n  let display = cm.display, doc = cm.doc\n  e_preventDefault(event)\n\n  let ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges\n  if (behavior.addNew && !behavior.extend) {\n    ourIndex = doc.sel.contains(start)\n    if (ourIndex > -1)\n      ourRange = ranges[ourIndex]\n    else\n      ourRange = new Range(start, start)\n  } else {\n    ourRange = doc.sel.primary()\n    ourIndex = doc.sel.primIndex\n  }\n\n  if (behavior.unit == \"rectangle\") {\n    if (!behavior.addNew) ourRange = new Range(start, start)\n    start = posFromMouse(cm, event, true, true)\n    ourIndex = -1\n  } else {\n    let range = rangeForUnit(cm, start, behavior.unit)\n    if (behavior.extend)\n      ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend)\n    else\n      ourRange = range\n  }\n\n  if (!behavior.addNew) {\n    ourIndex = 0\n    setSelection(doc, new Selection([ourRange], 0), sel_mouse)\n    startSel = doc.sel\n  } else if (ourIndex == -1) {\n    ourIndex = ranges.length\n    setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),\n                 {scroll: false, origin: \"*mouse\"})\n  } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == \"char\" && !behavior.extend) {\n    setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n                 {scroll: false, origin: \"*mouse\"})\n    startSel = doc.sel\n  } else {\n    replaceOneSelection(doc, ourIndex, ourRange, sel_mouse)\n  }\n\n  let lastPos = start\n  function extendTo(pos) {\n    if (cmp(lastPos, pos) == 0) return\n    lastPos = pos\n\n    if (behavior.unit == \"rectangle\") {\n      let ranges = [], tabSize = cm.options.tabSize\n      let startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize)\n      let posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize)\n      let left = Math.min(startCol, posCol), right = Math.max(startCol, posCol)\n      for (let line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n           line <= end; line++) {\n        let text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize)\n        if (left == right)\n          ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)))\n        else if (text.length > leftPos)\n          ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))))\n      }\n      if (!ranges.length) ranges.push(new Range(start, start))\n      setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n                   {origin: \"*mouse\", scroll: false})\n      cm.scrollIntoView(pos)\n    } else {\n      let oldRange = ourRange\n      let range = rangeForUnit(cm, pos, behavior.unit)\n      let anchor = oldRange.anchor, head\n      if (cmp(range.anchor, anchor) > 0) {\n        head = range.head\n        anchor = minPos(oldRange.from(), range.anchor)\n      } else {\n        head = range.anchor\n        anchor = maxPos(oldRange.to(), range.head)\n      }\n      let ranges = startSel.ranges.slice(0)\n      ranges[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head))\n      setSelection(doc, normalizeSelection(cm, ranges, ourIndex), sel_mouse)\n    }\n  }\n\n  let editorSize = display.wrapper.getBoundingClientRect()\n  // Used to ensure timeout re-tries don't fire when another extend\n  // happened in the meantime (clearTimeout isn't reliable -- at\n  // least on Chrome, the timeouts still happen even when cleared,\n  // if the clear happens after their scheduled firing time).\n  let counter = 0\n\n  function extend(e) {\n    let curCount = ++counter\n    let cur = posFromMouse(cm, e, true, behavior.unit == \"rectangle\")\n    if (!cur) return\n    if (cmp(cur, lastPos) != 0) {\n      cm.curOp.focus = activeElt()\n      extendTo(cur)\n      let visible = visibleLines(display, doc)\n      if (cur.line >= visible.to || cur.line < visible.from)\n        setTimeout(operation(cm, () => {if (counter == curCount) extend(e)}), 150)\n    } else {\n      let outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0\n      if (outside) setTimeout(operation(cm, () => {\n        if (counter != curCount) return\n        display.scroller.scrollTop += outside\n        extend(e)\n      }), 50)\n    }\n  }\n\n  function done(e) {\n    cm.state.selectingText = false\n    counter = Infinity\n    // If e is null or undefined we interpret this as someone trying\n    // to explicitly cancel the selection rather than the user\n    // letting go of the mouse button.\n    if (e) {\n      e_preventDefault(e)\n      display.input.focus()\n    }\n    off(display.wrapper.ownerDocument, \"mousemove\", move)\n    off(display.wrapper.ownerDocument, \"mouseup\", up)\n    doc.history.lastSelOrigin = null\n  }\n\n  let move = operation(cm, e => {\n    if (e.buttons === 0 || !e_button(e)) done(e)\n    else extend(e)\n  })\n  let up = operation(cm, done)\n  cm.state.selectingText = up\n  on(display.wrapper.ownerDocument, \"mousemove\", move)\n  on(display.wrapper.ownerDocument, \"mouseup\", up)\n}\n\n// Used when mouse-selecting to adjust the anchor to the proper side\n// of a bidi jump depending on the visual position of the head.\nfunction bidiSimplify(cm, range) {\n  let {anchor, head} = range, anchorLine = getLine(cm.doc, anchor.line)\n  if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) return range\n  let order = getOrder(anchorLine)\n  if (!order) return range\n  let index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]\n  if (part.from != anchor.ch && part.to != anchor.ch) return range\n  let boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1)\n  if (boundary == 0 || boundary == order.length) return range\n\n  // Compute the relative visual position of the head compared to the\n  // anchor (<0 is to the left, >0 to the right)\n  let leftSide\n  if (head.line != anchor.line) {\n    leftSide = (head.line - anchor.line) * (cm.doc.direction == \"ltr\" ? 1 : -1) > 0\n  } else {\n    let headIndex = getBidiPartAt(order, head.ch, head.sticky)\n    let dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1)\n    if (headIndex == boundary - 1 || headIndex == boundary)\n      leftSide = dir < 0\n    else\n      leftSide = dir > 0\n  }\n\n  let usePart = order[boundary + (leftSide ? -1 : 0)]\n  let from = leftSide == (usePart.level == 1)\n  let ch = from ? usePart.from : usePart.to, sticky = from ? \"after\" : \"before\"\n  return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)\n}\n\n\n// Determines whether an event happened in the gutter, and fires the\n// handlers for the corresponding event.\nfunction gutterEvent(cm, e, type, prevent) {\n  let mX, mY\n  if (e.touches) {\n    mX = e.touches[0].clientX\n    mY = e.touches[0].clientY\n  } else {\n    try { mX = e.clientX; mY = e.clientY }\n    catch(e) { return false }\n  }\n  if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false\n  if (prevent) e_preventDefault(e)\n\n  let display = cm.display\n  let lineBox = display.lineDiv.getBoundingClientRect()\n\n  if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e)\n  mY -= lineBox.top - display.viewOffset\n\n  for (let i = 0; i < cm.display.gutterSpecs.length; ++i) {\n    let g = display.gutters.childNodes[i]\n    if (g && g.getBoundingClientRect().right >= mX) {\n      let line = lineAtHeight(cm.doc, mY)\n      let gutter = cm.display.gutterSpecs[i]\n      signal(cm, type, cm, line, gutter.className, e)\n      return e_defaultPrevented(e)\n    }\n  }\n}\n\nexport function clickInGutter(cm, e) {\n  return gutterEvent(cm, e, \"gutterClick\", true)\n}\n\n// CONTEXT MENU HANDLING\n\n// To make the context menu work, we need to briefly unhide the\n// textarea (making it as unobtrusive as possible) to let the\n// right-click take effect on it.\nexport function onContextMenu(cm, e) {\n  if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) return\n  if (signalDOMEvent(cm, e, \"contextmenu\")) return\n  if (!captureRightClick) cm.display.input.onContextMenu(e)\n}\n\nfunction contextMenuInGutter(cm, e) {\n  if (!hasHandler(cm, \"gutterContextMenu\")) return false\n  return gutterEvent(cm, e, \"gutterContextMenu\", false)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/options.js",
    "content": "import { onBlur } from \"../display/focus.js\"\nimport { getGutters, updateGutters } from \"../display/gutters.js\"\nimport { loadMode, resetModeState } from \"../display/mode_state.js\"\nimport { initScrollbars, updateScrollbars } from \"../display/scrollbars.js\"\nimport { updateSelection } from \"../display/selection.js\"\nimport { regChange } from \"../display/view_tracking.js\"\nimport { getKeyMap } from \"../input/keymap.js\"\nimport { defaultSpecialCharPlaceholder } from \"../line/line_data.js\"\nimport { Pos } from \"../line/pos.js\"\nimport { findMaxLine } from \"../line/spans.js\"\nimport { clearCaches, compensateForHScroll, estimateLineHeights } from \"../measurement/position_measurement.js\"\nimport { replaceRange } from \"../model/changes.js\"\nimport { mobile, windows } from \"../util/browser.js\"\nimport { addClass, rmClass } from \"../util/dom.js\"\nimport { off, on } from \"../util/event.js\"\n\nimport { themeChanged } from \"./utils.js\"\n\nexport let Init = {toString: function(){return \"CodeMirror.Init\"}}\n\nexport let defaults = {}\nexport let optionHandlers = {}\n\nexport function defineOptions(CodeMirror) {\n  let optionHandlers = CodeMirror.optionHandlers\n\n  function option(name, deflt, handle, notOnInit) {\n    CodeMirror.defaults[name] = deflt\n    if (handle) optionHandlers[name] =\n      notOnInit ? (cm, val, old) => {if (old != Init) handle(cm, val, old)} : handle\n  }\n\n  CodeMirror.defineOption = option\n\n  // Passed to option handlers when there is no old value.\n  CodeMirror.Init = Init\n\n  // These two are, on init, called from the constructor because they\n  // have to be initialized before the editor can start at all.\n  option(\"value\", \"\", (cm, val) => cm.setValue(val), true)\n  option(\"mode\", null, (cm, val) => {\n    cm.doc.modeOption = val\n    loadMode(cm)\n  }, true)\n\n  option(\"indentUnit\", 2, loadMode, true)\n  option(\"indentWithTabs\", false)\n  option(\"smartIndent\", true)\n  option(\"tabSize\", 4, cm => {\n    resetModeState(cm)\n    clearCaches(cm)\n    regChange(cm)\n  }, true)\n\n  option(\"lineSeparator\", null, (cm, val) => {\n    cm.doc.lineSep = val\n    if (!val) return\n    let newBreaks = [], lineNo = cm.doc.first\n    cm.doc.iter(line => {\n      for (let pos = 0;;) {\n        let found = line.text.indexOf(val, pos)\n        if (found == -1) break\n        pos = found + val.length\n        newBreaks.push(Pos(lineNo, found))\n      }\n      lineNo++\n    })\n    for (let i = newBreaks.length - 1; i >= 0; i--)\n      replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length))\n  })\n  option(\"specialChars\", /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b\\u200e\\u200f\\u2028\\u2029\\ufeff\\ufff9-\\ufffc]/g, (cm, val, old) => {\n    cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\")\n    if (old != Init) cm.refresh()\n  })\n  option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, cm => cm.refresh(), true)\n  option(\"electricChars\", true)\n  option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", () => {\n    throw new Error(\"inputStyle can not (yet) be changed in a running editor\") // FIXME\n  }, true)\n  option(\"spellcheck\", false, (cm, val) => cm.getInputField().spellcheck = val, true)\n  option(\"autocorrect\", false, (cm, val) => cm.getInputField().autocorrect = val, true)\n  option(\"autocapitalize\", false, (cm, val) => cm.getInputField().autocapitalize = val, true)\n  option(\"rtlMoveVisually\", !windows)\n  option(\"wholeLineUpdateBefore\", true)\n\n  option(\"theme\", \"default\", cm => {\n    themeChanged(cm)\n    updateGutters(cm)\n  }, true)\n  option(\"keyMap\", \"default\", (cm, val, old) => {\n    let next = getKeyMap(val)\n    let prev = old != Init && getKeyMap(old)\n    if (prev && prev.detach) prev.detach(cm, next)\n    if (next.attach) next.attach(cm, prev || null)\n  })\n  option(\"extraKeys\", null)\n  option(\"configureMouse\", null)\n\n  option(\"lineWrapping\", false, wrappingChanged, true)\n  option(\"gutters\", [], (cm, val) => {\n    cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers)\n    updateGutters(cm)\n  }, true)\n  option(\"fixedGutter\", true, (cm, val) => {\n    cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\"\n    cm.refresh()\n  }, true)\n  option(\"coverGutterNextToScrollbar\", false, cm => updateScrollbars(cm), true)\n  option(\"scrollbarStyle\", \"native\", cm => {\n    initScrollbars(cm)\n    updateScrollbars(cm)\n    cm.display.scrollbars.setScrollTop(cm.doc.scrollTop)\n    cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft)\n  }, true)\n  option(\"lineNumbers\", false, (cm, val) => {\n    cm.display.gutterSpecs = getGutters(cm.options.gutters, val)\n    updateGutters(cm)\n  }, true)\n  option(\"firstLineNumber\", 1, updateGutters, true)\n  option(\"lineNumberFormatter\", integer => integer, updateGutters, true)\n  option(\"showCursorWhenSelecting\", false, updateSelection, true)\n\n  option(\"resetSelectionOnContextMenu\", true)\n  option(\"lineWiseCopyCut\", true)\n  option(\"pasteLinesPerSelection\", true)\n  option(\"selectionsMayTouch\", false)\n\n  option(\"readOnly\", false, (cm, val) => {\n    if (val == \"nocursor\") {\n      onBlur(cm)\n      cm.display.input.blur()\n    }\n    cm.display.input.readOnlyChanged(val)\n  })\n\n  option(\"screenReaderLabel\", null, (cm, val) => {\n    val = (val === '') ? null : val\n    cm.display.input.screenReaderLabelChanged(val)\n  })\n\n  option(\"disableInput\", false, (cm, val) => {if (!val) cm.display.input.reset()}, true)\n  option(\"dragDrop\", true, dragDropChanged)\n  option(\"allowDropFileTypes\", null)\n\n  option(\"cursorBlinkRate\", 530)\n  option(\"cursorScrollMargin\", 0)\n  option(\"cursorHeight\", 1, updateSelection, true)\n  option(\"singleCursorHeightPerLine\", true, updateSelection, true)\n  option(\"workTime\", 100)\n  option(\"workDelay\", 100)\n  option(\"flattenSpans\", true, resetModeState, true)\n  option(\"addModeClass\", false, resetModeState, true)\n  option(\"pollInterval\", 100)\n  option(\"undoDepth\", 200, (cm, val) => cm.doc.history.undoDepth = val)\n  option(\"historyEventDelay\", 1250)\n  option(\"viewportMargin\", 10, cm => cm.refresh(), true)\n  option(\"maxHighlightLength\", 10000, resetModeState, true)\n  option(\"moveInputWithCursor\", true, (cm, val) => {\n    if (!val) cm.display.input.resetPosition()\n  })\n\n  option(\"tabindex\", null, (cm, val) => cm.display.input.getField().tabIndex = val || \"\")\n  option(\"autofocus\", null)\n  option(\"direction\", \"ltr\", (cm, val) => cm.doc.setDirection(val), true)\n  option(\"phrases\", null)\n}\n\nfunction dragDropChanged(cm, value, old) {\n  let wasOn = old && old != Init\n  if (!value != !wasOn) {\n    let funcs = cm.display.dragFunctions\n    let toggle = value ? on : off\n    toggle(cm.display.scroller, \"dragstart\", funcs.start)\n    toggle(cm.display.scroller, \"dragenter\", funcs.enter)\n    toggle(cm.display.scroller, \"dragover\", funcs.over)\n    toggle(cm.display.scroller, \"dragleave\", funcs.leave)\n    toggle(cm.display.scroller, \"drop\", funcs.drop)\n  }\n}\n\nfunction wrappingChanged(cm) {\n  if (cm.options.lineWrapping) {\n    addClass(cm.display.wrapper, \"CodeMirror-wrap\")\n    cm.display.sizer.style.minWidth = \"\"\n    cm.display.sizerWidth = null\n  } else {\n    rmClass(cm.display.wrapper, \"CodeMirror-wrap\")\n    findMaxLine(cm)\n  }\n  estimateLineHeights(cm)\n  regChange(cm)\n  clearCaches(cm)\n  setTimeout(() => updateScrollbars(cm), 100)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/edit/utils.js",
    "content": "import { clearCaches } from \"../measurement/position_measurement.js\"\n\nexport function themeChanged(cm) {\n  cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n    cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\")\n  clearCaches(cm)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/input/ContentEditableInput.js",
    "content": "import { operation, runInOp } from \"../display/operations.js\"\nimport { prepareSelection } from \"../display/selection.js\"\nimport { regChange } from \"../display/view_tracking.js\"\nimport { applyTextInput, copyableRanges, disableBrowserMagic, handlePaste, hiddenTextarea, lastCopied, setLastCopied } from \"./input.js\"\nimport { cmp, maxPos, minPos, Pos } from \"../line/pos.js\"\nimport { getBetween, getLine, lineNo } from \"../line/utils_line.js\"\nimport { findViewForLine, findViewIndex, mapFromLineView, nodeAndOffsetInLineMap } from \"../measurement/position_measurement.js\"\nimport { replaceRange } from \"../model/changes.js\"\nimport { simpleSelection } from \"../model/selection.js\"\nimport { setSelection } from \"../model/selection_updates.js\"\nimport { getBidiPartAt, getOrder } from \"../util/bidi.js\"\nimport { android, chrome, gecko, ie_version } from \"../util/browser.js\"\nimport { activeElt, contains, range, removeChildrenAndAdd, selectInput } from \"../util/dom.js\"\nimport { on, signalDOMEvent } from \"../util/event.js\"\nimport { Delayed, lst, sel_dontScroll } from \"../util/misc.js\"\n\n// CONTENTEDITABLE INPUT STYLE\n\nexport default class ContentEditableInput {\n  constructor(cm) {\n    this.cm = cm\n    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null\n    this.polling = new Delayed()\n    this.composing = null\n    this.gracePeriod = false\n    this.readDOMTimeout = null\n  }\n\n  init(display) {\n    let input = this, cm = input.cm\n    let div = input.div = display.lineDiv\n    div.contentEditable = true\n    disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize)\n\n    function belongsToInput(e) {\n      for (let t = e.target; t; t = t.parentNode) {\n        if (t == div) return true\n        if (/\\bCodeMirror-(?:line)?widget\\b/.test(t.className)) break\n      }\n      return false\n    }\n\n    on(div, \"paste\", e => {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) return\n      // IE doesn't fire input events, so we schedule a read for the pasted content in this way\n      if (ie_version <= 11) setTimeout(operation(cm, () => this.updateFromDOM()), 20)\n    })\n\n    on(div, \"compositionstart\", e => {\n      this.composing = {data: e.data, done: false}\n    })\n    on(div, \"compositionupdate\", e => {\n      if (!this.composing) this.composing = {data: e.data, done: false}\n    })\n    on(div, \"compositionend\", e => {\n      if (this.composing) {\n        if (e.data != this.composing.data) this.readFromDOMSoon()\n        this.composing.done = true\n      }\n    })\n\n    on(div, \"touchstart\", () => input.forceCompositionEnd())\n\n    on(div, \"input\", () => {\n      if (!this.composing) this.readFromDOMSoon()\n    })\n\n    function onCopyCut(e) {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e)) return\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()})\n        if (e.type == \"cut\") cm.replaceSelection(\"\", null, \"cut\")\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        let ranges = copyableRanges(cm)\n        setLastCopied({lineWise: true, text: ranges.text})\n        if (e.type == \"cut\") {\n          cm.operation(() => {\n            cm.setSelections(ranges.ranges, 0, sel_dontScroll)\n            cm.replaceSelection(\"\", null, \"cut\")\n          })\n        }\n      }\n      if (e.clipboardData) {\n        e.clipboardData.clearData()\n        let content = lastCopied.text.join(\"\\n\")\n        // iOS exposes the clipboard API, but seems to discard content inserted into it\n        e.clipboardData.setData(\"Text\", content)\n        if (e.clipboardData.getData(\"Text\") == content) {\n          e.preventDefault()\n          return\n        }\n      }\n      // Old-fashioned briefly-focus-a-textarea hack\n      let kludge = hiddenTextarea(), te = kludge.firstChild\n      cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild)\n      te.value = lastCopied.text.join(\"\\n\")\n      let hadFocus = activeElt()\n      selectInput(te)\n      setTimeout(() => {\n        cm.display.lineSpace.removeChild(kludge)\n        hadFocus.focus()\n        if (hadFocus == div) input.showPrimarySelection()\n      }, 50)\n    }\n    on(div, \"copy\", onCopyCut)\n    on(div, \"cut\", onCopyCut)\n  }\n\n  screenReaderLabelChanged(label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.div.setAttribute('aria-label', label)\n    } else {\n      this.div.removeAttribute('aria-label')\n    }\n  }\n\n  prepareSelection() {\n    let result = prepareSelection(this.cm, false)\n    result.focus = activeElt() == this.div\n    return result\n  }\n\n  showSelection(info, takeFocus) {\n    if (!info || !this.cm.display.view.length) return\n    if (info.focus || takeFocus) this.showPrimarySelection()\n    this.showMultipleSelections(info)\n  }\n\n  getSelection() {\n    return this.cm.display.wrapper.ownerDocument.getSelection()\n  }\n\n  showPrimarySelection() {\n    let sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary()\n    let from = prim.from(), to = prim.to()\n\n    if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {\n      sel.removeAllRanges()\n      return\n    }\n\n    let curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset)\n    let curFocus = domToPos(cm, sel.focusNode, sel.focusOffset)\n    if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n        cmp(minPos(curAnchor, curFocus), from) == 0 &&\n        cmp(maxPos(curAnchor, curFocus), to) == 0)\n      return\n\n    let view = cm.display.view\n    let start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||\n        {node: view[0].measure.map[2], offset: 0}\n    let end = to.line < cm.display.viewTo && posToDOM(cm, to)\n    if (!end) {\n      let measure = view[view.length - 1].measure\n      let map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map\n      end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]}\n    }\n\n    if (!start || !end) {\n      sel.removeAllRanges()\n      return\n    }\n\n    let old = sel.rangeCount && sel.getRangeAt(0), rng\n    try { rng = range(start.node, start.offset, end.offset, end.node) }\n    catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n    if (rng) {\n      if (!gecko && cm.state.focused) {\n        sel.collapse(start.node, start.offset)\n        if (!rng.collapsed) {\n          sel.removeAllRanges()\n          sel.addRange(rng)\n        }\n      } else {\n        sel.removeAllRanges()\n        sel.addRange(rng)\n      }\n      if (old && sel.anchorNode == null) sel.addRange(old)\n      else if (gecko) this.startGracePeriod()\n    }\n    this.rememberSelection()\n  }\n\n  startGracePeriod() {\n    clearTimeout(this.gracePeriod)\n    this.gracePeriod = setTimeout(() => {\n      this.gracePeriod = false\n      if (this.selectionChanged())\n        this.cm.operation(() => this.cm.curOp.selectionChanged = true)\n    }, 20)\n  }\n\n  showMultipleSelections(info) {\n    removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors)\n    removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection)\n  }\n\n  rememberSelection() {\n    let sel = this.getSelection()\n    this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset\n    this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset\n  }\n\n  selectionInEditor() {\n    let sel = this.getSelection()\n    if (!sel.rangeCount) return false\n    let node = sel.getRangeAt(0).commonAncestorContainer\n    return contains(this.div, node)\n  }\n\n  focus() {\n    if (this.cm.options.readOnly != \"nocursor\") {\n      if (!this.selectionInEditor() || activeElt() != this.div)\n        this.showSelection(this.prepareSelection(), true)\n      this.div.focus()\n    }\n  }\n  blur() { this.div.blur() }\n  getField() { return this.div }\n\n  supportsTouch() { return true }\n\n  receivedFocus() {\n    let input = this\n    if (this.selectionInEditor())\n      setTimeout(() => this.pollSelection(), 20)\n    else\n      runInOp(this.cm, () => input.cm.curOp.selectionChanged = true)\n\n    function poll() {\n      if (input.cm.state.focused) {\n        input.pollSelection()\n        input.polling.set(input.cm.options.pollInterval, poll)\n      }\n    }\n    this.polling.set(this.cm.options.pollInterval, poll)\n  }\n\n  selectionChanged() {\n    let sel = this.getSelection()\n    return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n      sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset\n  }\n\n  pollSelection() {\n    if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) return\n    let sel = this.getSelection(), cm = this.cm\n    // On Android Chrome (version 56, at least), backspacing into an\n    // uneditable block element will put the cursor in that element,\n    // and then, because it's not editable, hide the virtual keyboard.\n    // Because Android doesn't allow us to actually detect backspace\n    // presses in a sane way, this code checks for when that happens\n    // and simulates a backspace press in this case.\n    if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {\n      this.cm.triggerOnKeyDown({type: \"keydown\", keyCode: 8, preventDefault: Math.abs})\n      this.blur()\n      this.focus()\n      return\n    }\n    if (this.composing) return\n    this.rememberSelection()\n    let anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset)\n    let head = domToPos(cm, sel.focusNode, sel.focusOffset)\n    if (anchor && head) runInOp(cm, () => {\n      setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll)\n      if (anchor.bad || head.bad) cm.curOp.selectionChanged = true\n    })\n  }\n\n  pollContent() {\n    if (this.readDOMTimeout != null) {\n      clearTimeout(this.readDOMTimeout)\n      this.readDOMTimeout = null\n    }\n\n    let cm = this.cm, display = cm.display, sel = cm.doc.sel.primary()\n    let from = sel.from(), to = sel.to()\n    if (from.ch == 0 && from.line > cm.firstLine())\n      from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length)\n    if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())\n      to = Pos(to.line + 1, 0)\n    if (from.line < display.viewFrom || to.line > display.viewTo - 1) return false\n\n    let fromIndex, fromLine, fromNode\n    if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n      fromLine = lineNo(display.view[0].line)\n      fromNode = display.view[0].node\n    } else {\n      fromLine = lineNo(display.view[fromIndex].line)\n      fromNode = display.view[fromIndex - 1].node.nextSibling\n    }\n    let toIndex = findViewIndex(cm, to.line)\n    let toLine, toNode\n    if (toIndex == display.view.length - 1) {\n      toLine = display.viewTo - 1\n      toNode = display.lineDiv.lastChild\n    } else {\n      toLine = lineNo(display.view[toIndex + 1].line) - 1\n      toNode = display.view[toIndex + 1].node.previousSibling\n    }\n\n    if (!fromNode) return false\n    let newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine))\n    let oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length))\n    while (newText.length > 1 && oldText.length > 1) {\n      if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine-- }\n      else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++ }\n      else break\n    }\n\n    let cutFront = 0, cutEnd = 0\n    let newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length)\n    while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n      ++cutFront\n    let newBot = lst(newText), oldBot = lst(oldText)\n    let maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n                             oldBot.length - (oldText.length == 1 ? cutFront : 0))\n    while (cutEnd < maxCutEnd &&\n           newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n      ++cutEnd\n    // Try to move start of change to start of selection if ambiguous\n    if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {\n      while (cutFront && cutFront > from.ch &&\n             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {\n        cutFront--\n        cutEnd++\n      }\n    }\n\n    newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\\u200b+/, \"\")\n    newText[0] = newText[0].slice(cutFront).replace(/\\u200b+$/, \"\")\n\n    let chFrom = Pos(fromLine, cutFront)\n    let chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0)\n    if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n      replaceRange(cm.doc, newText, chFrom, chTo, \"+input\")\n      return true\n    }\n  }\n\n  ensurePolled() {\n    this.forceCompositionEnd()\n  }\n  reset() {\n    this.forceCompositionEnd()\n  }\n  forceCompositionEnd() {\n    if (!this.composing) return\n    clearTimeout(this.readDOMTimeout)\n    this.composing = null\n    this.updateFromDOM()\n    this.div.blur()\n    this.div.focus()\n  }\n  readFromDOMSoon() {\n    if (this.readDOMTimeout != null) return\n    this.readDOMTimeout = setTimeout(() => {\n      this.readDOMTimeout = null\n      if (this.composing) {\n        if (this.composing.done) this.composing = null\n        else return\n      }\n      this.updateFromDOM()\n    }, 80)\n  }\n\n  updateFromDOM() {\n    if (this.cm.isReadOnly() || !this.pollContent())\n      runInOp(this.cm, () => regChange(this.cm))\n  }\n\n  setUneditable(node) {\n    node.contentEditable = \"false\"\n  }\n\n  onKeyPress(e) {\n    if (e.charCode == 0 || this.composing) return\n    e.preventDefault()\n    if (!this.cm.isReadOnly())\n      operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0)\n  }\n\n  readOnlyChanged(val) {\n    this.div.contentEditable = String(val != \"nocursor\")\n  }\n\n  onContextMenu() {}\n  resetPosition() {}\n}\n\nContentEditableInput.prototype.needsContentAttribute = true\n\nfunction posToDOM(cm, pos) {\n  let view = findViewForLine(cm, pos.line)\n  if (!view || view.hidden) return null\n  let line = getLine(cm.doc, pos.line)\n  let info = mapFromLineView(view, line, pos.line)\n\n  let order = getOrder(line, cm.doc.direction), side = \"left\"\n  if (order) {\n    let partPos = getBidiPartAt(order, pos.ch)\n    side = partPos % 2 ? \"right\" : \"left\"\n  }\n  let result = nodeAndOffsetInLineMap(info.map, pos.ch, side)\n  result.offset = result.collapse == \"right\" ? result.end : result.start\n  return result\n}\n\nfunction isInGutter(node) {\n  for (let scan = node; scan; scan = scan.parentNode)\n    if (/CodeMirror-gutter-wrapper/.test(scan.className)) return true\n  return false\n}\n\nfunction badPos(pos, bad) { if (bad) pos.bad = true; return pos }\n\nfunction domTextBetween(cm, from, to, fromLine, toLine) {\n  let text = \"\", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false\n  function recognizeMarker(id) { return marker => marker.id == id }\n  function close() {\n    if (closing) {\n      text += lineSep\n      if (extraLinebreak) text += lineSep\n      closing = extraLinebreak = false\n    }\n  }\n  function addText(str) {\n    if (str) {\n      close()\n      text += str\n    }\n  }\n  function walk(node) {\n    if (node.nodeType == 1) {\n      let cmText = node.getAttribute(\"cm-text\")\n      if (cmText) {\n        addText(cmText)\n        return\n      }\n      let markerID = node.getAttribute(\"cm-marker\"), range\n      if (markerID) {\n        let found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID))\n        if (found.length && (range = found[0].find(0)))\n          addText(getBetween(cm.doc, range.from, range.to).join(lineSep))\n        return\n      }\n      if (node.getAttribute(\"contenteditable\") == \"false\") return\n      let isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName)\n      if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) return\n\n      if (isBlock) close()\n      for (let i = 0; i < node.childNodes.length; i++)\n        walk(node.childNodes[i])\n\n      if (/^(pre|p)$/i.test(node.nodeName)) extraLinebreak = true\n      if (isBlock) closing = true\n    } else if (node.nodeType == 3) {\n      addText(node.nodeValue.replace(/\\u200b/g, \"\").replace(/\\u00a0/g, \" \"))\n    }\n  }\n  for (;;) {\n    walk(from)\n    if (from == to) break\n    from = from.nextSibling\n    extraLinebreak = false\n  }\n  return text\n}\n\nfunction domToPos(cm, node, offset) {\n  let lineNode\n  if (node == cm.display.lineDiv) {\n    lineNode = cm.display.lineDiv.childNodes[offset]\n    if (!lineNode) return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true)\n    node = null; offset = 0\n  } else {\n    for (lineNode = node;; lineNode = lineNode.parentNode) {\n      if (!lineNode || lineNode == cm.display.lineDiv) return null\n      if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) break\n    }\n  }\n  for (let i = 0; i < cm.display.view.length; i++) {\n    let lineView = cm.display.view[i]\n    if (lineView.node == lineNode)\n      return locateNodeInLineView(lineView, node, offset)\n  }\n}\n\nfunction locateNodeInLineView(lineView, node, offset) {\n  let wrapper = lineView.text.firstChild, bad = false\n  if (!node || !contains(wrapper, node)) return badPos(Pos(lineNo(lineView.line), 0), true)\n  if (node == wrapper) {\n    bad = true\n    node = wrapper.childNodes[offset]\n    offset = 0\n    if (!node) {\n      let line = lineView.rest ? lst(lineView.rest) : lineView.line\n      return badPos(Pos(lineNo(line), line.text.length), bad)\n    }\n  }\n\n  let textNode = node.nodeType == 3 ? node : null, topNode = node\n  if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {\n    textNode = node.firstChild\n    if (offset) offset = textNode.nodeValue.length\n  }\n  while (topNode.parentNode != wrapper) topNode = topNode.parentNode\n  let measure = lineView.measure, maps = measure.maps\n\n  function find(textNode, topNode, offset) {\n    for (let i = -1; i < (maps ? maps.length : 0); i++) {\n      let map = i < 0 ? measure.map : maps[i]\n      for (let j = 0; j < map.length; j += 3) {\n        let curNode = map[j + 2]\n        if (curNode == textNode || curNode == topNode) {\n          let line = lineNo(i < 0 ? lineView.line : lineView.rest[i])\n          let ch = map[j] + offset\n          if (offset < 0 || curNode != textNode) ch = map[j + (offset ? 1 : 0)]\n          return Pos(line, ch)\n        }\n      }\n    }\n  }\n  let found = find(textNode, topNode, offset)\n  if (found) return badPos(found, bad)\n\n  // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems\n  for (let after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {\n    found = find(after, after.firstChild, 0)\n    if (found)\n      return badPos(Pos(found.line, found.ch - dist), bad)\n    else\n      dist += after.textContent.length\n  }\n  for (let before = topNode.previousSibling, dist = offset; before; before = before.previousSibling) {\n    found = find(before, before.firstChild, -1)\n    if (found)\n      return badPos(Pos(found.line, found.ch + dist), bad)\n    else\n      dist += before.textContent.length\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/input/TextareaInput.js",
    "content": "import { operation, runInOp } from \"../display/operations.js\"\nimport { prepareSelection } from \"../display/selection.js\"\nimport { applyTextInput, copyableRanges, handlePaste, hiddenTextarea, setLastCopied } from \"./input.js\"\nimport { cursorCoords, posFromMouse } from \"../measurement/position_measurement.js\"\nimport { eventInWidget } from \"../measurement/widgets.js\"\nimport { simpleSelection } from \"../model/selection.js\"\nimport { selectAll, setSelection } from \"../model/selection_updates.js\"\nimport { captureRightClick, ie, ie_version, ios, mac, mobile, presto, webkit } from \"../util/browser.js\"\nimport { activeElt, removeChildrenAndAdd, selectInput } from \"../util/dom.js\"\nimport { e_preventDefault, e_stop, off, on, signalDOMEvent } from \"../util/event.js\"\nimport { hasSelection } from \"../util/feature_detection.js\"\nimport { Delayed, sel_dontScroll } from \"../util/misc.js\"\n\n// TEXTAREA INPUT STYLE\n\nexport default class TextareaInput {\n  constructor(cm) {\n    this.cm = cm\n    // See input.poll and input.reset\n    this.prevInput = \"\"\n\n    // Flag that indicates whether we expect input to appear real soon\n    // now (after some event like 'keypress' or 'input') and are\n    // polling intensively.\n    this.pollingFast = false\n    // Self-resetting timeout for the poller\n    this.polling = new Delayed()\n    // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n    this.hasSelection = false\n    this.composing = null\n  }\n\n  init(display) {\n    let input = this, cm = this.cm\n    this.createField(display)\n    const te = this.textarea\n\n    display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild)\n\n    // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n    if (ios) te.style.width = \"0px\"\n\n    on(te, \"input\", () => {\n      if (ie && ie_version >= 9 && this.hasSelection) this.hasSelection = null\n      input.poll()\n    })\n\n    on(te, \"paste\", e => {\n      if (signalDOMEvent(cm, e) || handlePaste(e, cm)) return\n\n      cm.state.pasteIncoming = +new Date\n      input.fastPoll()\n    })\n\n    function prepareCopyCut(e) {\n      if (signalDOMEvent(cm, e)) return\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()})\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        let ranges = copyableRanges(cm)\n        setLastCopied({lineWise: true, text: ranges.text})\n        if (e.type == \"cut\") {\n          cm.setSelections(ranges.ranges, null, sel_dontScroll)\n        } else {\n          input.prevInput = \"\"\n          te.value = ranges.text.join(\"\\n\")\n          selectInput(te)\n        }\n      }\n      if (e.type == \"cut\") cm.state.cutIncoming = +new Date\n    }\n    on(te, \"cut\", prepareCopyCut)\n    on(te, \"copy\", prepareCopyCut)\n\n    on(display.scroller, \"paste\", e => {\n      if (eventInWidget(display, e) || signalDOMEvent(cm, e)) return\n      if (!te.dispatchEvent) {\n        cm.state.pasteIncoming = +new Date\n        input.focus()\n        return\n      }\n\n      // Pass the `paste` event to the textarea so it's handled by its event listener.\n      const event = new Event(\"paste\")\n      event.clipboardData = e.clipboardData\n      te.dispatchEvent(event)\n    })\n\n    // Prevent normal selection in the editor (we handle our own)\n    on(display.lineSpace, \"selectstart\", e => {\n      if (!eventInWidget(display, e)) e_preventDefault(e)\n    })\n\n    on(te, \"compositionstart\", () => {\n      let start = cm.getCursor(\"from\")\n      if (input.composing) input.composing.range.clear()\n      input.composing = {\n        start: start,\n        range: cm.markText(start, cm.getCursor(\"to\"), {className: \"CodeMirror-composing\"})\n      }\n    })\n    on(te, \"compositionend\", () => {\n      if (input.composing) {\n        input.poll()\n        input.composing.range.clear()\n        input.composing = null\n      }\n    })\n  }\n\n  createField(_display) {\n    // Wraps and hides input textarea\n    this.wrapper = hiddenTextarea()\n    // The semihidden textarea that is focused when the editor is\n    // focused, and receives input.\n    this.textarea = this.wrapper.firstChild\n  }\n\n  screenReaderLabelChanged(label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.textarea.setAttribute('aria-label', label)\n    } else {\n      this.textarea.removeAttribute('aria-label')\n    }\n  }\n\n  prepareSelection() {\n    // Redraw the selection and/or cursor\n    let cm = this.cm, display = cm.display, doc = cm.doc\n    let result = prepareSelection(cm)\n\n    // Move the hidden textarea near the cursor to prevent scrolling artifacts\n    if (cm.options.moveInputWithCursor) {\n      let headPos = cursorCoords(cm, doc.sel.primary().head, \"div\")\n      let wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect()\n      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n                                          headPos.top + lineOff.top - wrapOff.top))\n      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n                                           headPos.left + lineOff.left - wrapOff.left))\n    }\n\n    return result\n  }\n\n  showSelection(drawn) {\n    let cm = this.cm, display = cm.display\n    removeChildrenAndAdd(display.cursorDiv, drawn.cursors)\n    removeChildrenAndAdd(display.selectionDiv, drawn.selection)\n    if (drawn.teTop != null) {\n      this.wrapper.style.top = drawn.teTop + \"px\"\n      this.wrapper.style.left = drawn.teLeft + \"px\"\n    }\n  }\n\n  // Reset the input to correspond to the selection (or to be empty,\n  // when not typing and nothing is selected)\n  reset(typing) {\n    if (this.contextMenuPending || this.composing) return\n    let cm = this.cm\n    if (cm.somethingSelected()) {\n      this.prevInput = \"\"\n      let content = cm.getSelection()\n      this.textarea.value = content\n      if (cm.state.focused) selectInput(this.textarea)\n      if (ie && ie_version >= 9) this.hasSelection = content\n    } else if (!typing) {\n      this.prevInput = this.textarea.value = \"\"\n      if (ie && ie_version >= 9) this.hasSelection = null\n    }\n  }\n\n  getField() { return this.textarea }\n\n  supportsTouch() { return false }\n\n  focus() {\n    if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != this.textarea)) {\n      try { this.textarea.focus() }\n      catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM\n    }\n  }\n\n  blur() { this.textarea.blur() }\n\n  resetPosition() {\n    this.wrapper.style.top = this.wrapper.style.left = 0\n  }\n\n  receivedFocus() { this.slowPoll() }\n\n  // Poll for input changes, using the normal rate of polling. This\n  // runs as long as the editor is focused.\n  slowPoll() {\n    if (this.pollingFast) return\n    this.polling.set(this.cm.options.pollInterval, () => {\n      this.poll()\n      if (this.cm.state.focused) this.slowPoll()\n    })\n  }\n\n  // When an event has just come in that is likely to add or change\n  // something in the input textarea, we poll faster, to ensure that\n  // the change appears on the screen quickly.\n  fastPoll() {\n    let missed = false, input = this\n    input.pollingFast = true\n    function p() {\n      let changed = input.poll()\n      if (!changed && !missed) {missed = true; input.polling.set(60, p)}\n      else {input.pollingFast = false; input.slowPoll()}\n    }\n    input.polling.set(20, p)\n  }\n\n  // Read input from the textarea, and update the document to match.\n  // When something is selected, it is present in the textarea, and\n  // selected (unless it is huge, in which case a placeholder is\n  // used). When nothing is selected, the cursor sits after previously\n  // seen text (can be empty), which is stored in prevInput (we must\n  // not reset the textarea when typing, because that breaks IME).\n  poll() {\n    let cm = this.cm, input = this.textarea, prevInput = this.prevInput\n    // Since this is called a *lot*, try to bail out as cheaply as\n    // possible when it is clear that nothing happened. hasSelection\n    // will be the case when there is a lot of text in the textarea,\n    // in which case reading its value would be expensive.\n    if (this.contextMenuPending || !cm.state.focused ||\n        (hasSelection(input) && !prevInput && !this.composing) ||\n        cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n      return false\n\n    let text = input.value\n    // If nothing changed, bail.\n    if (text == prevInput && !cm.somethingSelected()) return false\n    // Work around nonsensical selection resetting in IE9/10, and\n    // inexplicable appearance of private area unicode characters on\n    // some key combos in Mac (#2689).\n    if (ie && ie_version >= 9 && this.hasSelection === text ||\n        mac && /[\\uf700-\\uf7ff]/.test(text)) {\n      cm.display.input.reset()\n      return false\n    }\n\n    if (cm.doc.sel == cm.display.selForContextMenu) {\n      let first = text.charCodeAt(0)\n      if (first == 0x200b && !prevInput) prevInput = \"\\u200b\"\n      if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\") }\n    }\n    // Find the part of the input that is actually new\n    let same = 0, l = Math.min(prevInput.length, text.length)\n    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same\n\n    runInOp(cm, () => {\n      applyTextInput(cm, text.slice(same), prevInput.length - same,\n                     null, this.composing ? \"*compose\" : null)\n\n      // Don't leave long text in the textarea, since it makes further polling slow\n      if (text.length > 1000 || text.indexOf(\"\\n\") > -1) input.value = this.prevInput = \"\"\n      else this.prevInput = text\n\n      if (this.composing) {\n        this.composing.range.clear()\n        this.composing.range = cm.markText(this.composing.start, cm.getCursor(\"to\"),\n                                           {className: \"CodeMirror-composing\"})\n      }\n    })\n    return true\n  }\n\n  ensurePolled() {\n    if (this.pollingFast && this.poll()) this.pollingFast = false\n  }\n\n  onKeyPress() {\n    if (ie && ie_version >= 9) this.hasSelection = null\n    this.fastPoll()\n  }\n\n  onContextMenu(e) {\n    let input = this, cm = input.cm, display = cm.display, te = input.textarea\n    if (input.contextMenuPending) input.contextMenuPending()\n    let pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop\n    if (!pos || presto) return // Opera is difficult.\n\n    // Reset the current text selection only if the click is done outside of the selection\n    // and 'resetSelectionOnContextMenu' option is true.\n    let reset = cm.options.resetSelectionOnContextMenu\n    if (reset && cm.doc.sel.contains(pos) == -1)\n      operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll)\n\n    let oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText\n    let wrapperBox = input.wrapper.offsetParent.getBoundingClientRect()\n    input.wrapper.style.cssText = \"position: static\"\n    te.style.cssText = `position: absolute; width: 30px; height: 30px;\n      top: ${e.clientY - wrapperBox.top - 5}px; left: ${e.clientX - wrapperBox.left - 5}px;\n      z-index: 1000; background: ${ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\"};\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);`\n    let oldScrollY\n    if (webkit) oldScrollY = window.scrollY // Work around Chrome issue (#2712)\n    display.input.focus()\n    if (webkit) window.scrollTo(null, oldScrollY)\n    display.input.reset()\n    // Adds \"Select all\" to context menu in FF\n    if (!cm.somethingSelected()) te.value = input.prevInput = \" \"\n    input.contextMenuPending = rehide\n    display.selForContextMenu = cm.doc.sel\n    clearTimeout(display.detectingSelectAll)\n\n    // Select-all will be greyed out if there's nothing to select, so\n    // this adds a zero-width space so that we can later check whether\n    // it got selected.\n    function prepareSelectAllHack() {\n      if (te.selectionStart != null) {\n        let selected = cm.somethingSelected()\n        let extval = \"\\u200b\" + (selected ? te.value : \"\")\n        te.value = \"\\u21da\" // Used to catch context-menu undo\n        te.value = extval\n        input.prevInput = selected ? \"\" : \"\\u200b\"\n        te.selectionStart = 1; te.selectionEnd = extval.length\n        // Re-set this, in case some other handler touched the\n        // selection in the meantime.\n        display.selForContextMenu = cm.doc.sel\n      }\n    }\n    function rehide() {\n      if (input.contextMenuPending != rehide) return\n      input.contextMenuPending = false\n      input.wrapper.style.cssText = oldWrapperCSS\n      te.style.cssText = oldCSS\n      if (ie && ie_version < 9) display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos)\n\n      // Try to detect the user choosing select-all\n      if (te.selectionStart != null) {\n        if (!ie || (ie && ie_version < 9)) prepareSelectAllHack()\n        let i = 0, poll = () => {\n          if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n              te.selectionEnd > 0 && input.prevInput == \"\\u200b\") {\n            operation(cm, selectAll)(cm)\n          } else if (i++ < 10) {\n            display.detectingSelectAll = setTimeout(poll, 500)\n          } else {\n            display.selForContextMenu = null\n            display.input.reset()\n          }\n        }\n        display.detectingSelectAll = setTimeout(poll, 200)\n      }\n    }\n\n    if (ie && ie_version >= 9) prepareSelectAllHack()\n    if (captureRightClick) {\n      e_stop(e)\n      let mouseup = () => {\n        off(window, \"mouseup\", mouseup)\n        setTimeout(rehide, 20)\n      }\n      on(window, \"mouseup\", mouseup)\n    } else {\n      setTimeout(rehide, 50)\n    }\n  }\n\n  readOnlyChanged(val) {\n    if (!val) this.reset()\n    this.textarea.disabled = val == \"nocursor\"\n    this.textarea.readOnly = !!val\n  }\n\n  setUneditable() {}\n}\n\nTextareaInput.prototype.needsContentAttribute = false\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/input/indent.js",
    "content": "import { getContextBefore } from \"../line/highlight.js\"\nimport { Pos } from \"../line/pos.js\"\nimport { getLine } from \"../line/utils_line.js\"\nimport { replaceRange } from \"../model/changes.js\"\nimport { Range } from \"../model/selection.js\"\nimport { replaceOneSelection } from \"../model/selection_updates.js\"\nimport { countColumn, Pass, spaceStr } from \"../util/misc.js\"\n\n// Indent the given line. The how parameter can be \"smart\",\n// \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n// (typically set to true for forced single-line indents), empty\n// lines are not indented, and places where the mode returns Pass\n// are left alone.\nexport function indentLine(cm, n, how, aggressive) {\n  let doc = cm.doc, state\n  if (how == null) how = \"add\"\n  if (how == \"smart\") {\n    // Fall back to \"prev\" when the mode doesn't have an indentation\n    // method.\n    if (!doc.mode.indent) how = \"prev\"\n    else state = getContextBefore(cm, n).state\n  }\n\n  let tabSize = cm.options.tabSize\n  let line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize)\n  if (line.stateAfter) line.stateAfter = null\n  let curSpaceString = line.text.match(/^\\s*/)[0], indentation\n  if (!aggressive && !/\\S/.test(line.text)) {\n    indentation = 0\n    how = \"not\"\n  } else if (how == \"smart\") {\n    indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text)\n    if (indentation == Pass || indentation > 150) {\n      if (!aggressive) return\n      how = \"prev\"\n    }\n  }\n  if (how == \"prev\") {\n    if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize)\n    else indentation = 0\n  } else if (how == \"add\") {\n    indentation = curSpace + cm.options.indentUnit\n  } else if (how == \"subtract\") {\n    indentation = curSpace - cm.options.indentUnit\n  } else if (typeof how == \"number\") {\n    indentation = curSpace + how\n  }\n  indentation = Math.max(0, indentation)\n\n  let indentString = \"\", pos = 0\n  if (cm.options.indentWithTabs)\n    for (let i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\"}\n  if (pos < indentation) indentString += spaceStr(indentation - pos)\n\n  if (indentString != curSpaceString) {\n    replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\")\n    line.stateAfter = null\n    return true\n  } else {\n    // Ensure that, if the cursor was in the whitespace at the start\n    // of the line, it is moved to the end of that space.\n    for (let i = 0; i < doc.sel.ranges.length; i++) {\n      let range = doc.sel.ranges[i]\n      if (range.head.line == n && range.head.ch < curSpaceString.length) {\n        let pos = Pos(n, curSpaceString.length)\n        replaceOneSelection(doc, i, new Range(pos, pos))\n        break\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/input/input.js",
    "content": "import { runInOp } from \"../display/operations.js\"\nimport { ensureCursorVisible } from \"../display/scrolling.js\"\nimport { Pos } from \"../line/pos.js\"\nimport { getLine } from \"../line/utils_line.js\"\nimport { makeChange } from \"../model/changes.js\"\nimport { ios, webkit } from \"../util/browser.js\"\nimport { elt } from \"../util/dom.js\"\nimport { lst, map } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\nimport { splitLinesAuto } from \"../util/feature_detection.js\"\n\nimport { indentLine } from \"./indent.js\"\n\n// This will be set to a {lineWise: bool, text: [string]} object, so\n// that, when pasting, we know what kind of selections the copied\n// text was made out of.\nexport let lastCopied = null\n\nexport function setLastCopied(newLastCopied) {\n  lastCopied = newLastCopied\n}\n\nexport function applyTextInput(cm, inserted, deleted, sel, origin) {\n  let doc = cm.doc\n  cm.display.shift = false\n  if (!sel) sel = doc.sel\n\n  let recent = +new Date - 200\n  let paste = origin == \"paste\" || cm.state.pasteIncoming > recent\n  let textLines = splitLinesAuto(inserted), multiPaste = null\n  // When pasting N lines into N selections, insert one line per selection\n  if (paste && sel.ranges.length > 1) {\n    if (lastCopied && lastCopied.text.join(\"\\n\") == inserted) {\n      if (sel.ranges.length % lastCopied.text.length == 0) {\n        multiPaste = []\n        for (let i = 0; i < lastCopied.text.length; i++)\n          multiPaste.push(doc.splitLines(lastCopied.text[i]))\n      }\n    } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {\n      multiPaste = map(textLines, l => [l])\n    }\n  }\n\n  let updateInput = cm.curOp.updateInput\n  // Normal behavior is to insert the new text into every selection\n  for (let i = sel.ranges.length - 1; i >= 0; i--) {\n    let range = sel.ranges[i]\n    let from = range.from(), to = range.to()\n    if (range.empty()) {\n      if (deleted && deleted > 0) // Handle deletion\n        from = Pos(from.line, from.ch - deleted)\n      else if (cm.state.overwrite && !paste) // Handle overwrite\n        to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length))\n      else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join(\"\\n\") == textLines.join(\"\\n\"))\n        from = to = Pos(from.line, 0)\n    }\n    let changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,\n                       origin: origin || (paste ? \"paste\" : cm.state.cutIncoming > recent ? \"cut\" : \"+input\")}\n    makeChange(cm.doc, changeEvent)\n    signalLater(cm, \"inputRead\", cm, changeEvent)\n  }\n  if (inserted && !paste)\n    triggerElectric(cm, inserted)\n\n  ensureCursorVisible(cm)\n  if (cm.curOp.updateInput < 2) cm.curOp.updateInput = updateInput\n  cm.curOp.typing = true\n  cm.state.pasteIncoming = cm.state.cutIncoming = -1\n}\n\nexport function handlePaste(e, cm) {\n  let pasted = e.clipboardData && e.clipboardData.getData(\"Text\")\n  if (pasted) {\n    e.preventDefault()\n    if (!cm.isReadOnly() && !cm.options.disableInput)\n      runInOp(cm, () => applyTextInput(cm, pasted, 0, null, \"paste\"))\n    return true\n  }\n}\n\nexport function triggerElectric(cm, inserted) {\n  // When an 'electric' character is inserted, immediately trigger a reindent\n  if (!cm.options.electricChars || !cm.options.smartIndent) return\n  let sel = cm.doc.sel\n\n  for (let i = sel.ranges.length - 1; i >= 0; i--) {\n    let range = sel.ranges[i]\n    if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) continue\n    let mode = cm.getModeAt(range.head)\n    let indented = false\n    if (mode.electricChars) {\n      for (let j = 0; j < mode.electricChars.length; j++)\n        if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n          indented = indentLine(cm, range.head.line, \"smart\")\n          break\n        }\n    } else if (mode.electricInput) {\n      if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))\n        indented = indentLine(cm, range.head.line, \"smart\")\n    }\n    if (indented) signalLater(cm, \"electricInput\", cm, range.head.line)\n  }\n}\n\nexport function copyableRanges(cm) {\n  let text = [], ranges = []\n  for (let i = 0; i < cm.doc.sel.ranges.length; i++) {\n    let line = cm.doc.sel.ranges[i].head.line\n    let lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}\n    ranges.push(lineRange)\n    text.push(cm.getRange(lineRange.anchor, lineRange.head))\n  }\n  return {text: text, ranges: ranges}\n}\n\nexport function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) {\n  field.setAttribute(\"autocorrect\", autocorrect ? \"\" : \"off\")\n  field.setAttribute(\"autocapitalize\", autocapitalize ? \"\" : \"off\")\n  field.setAttribute(\"spellcheck\", !!spellcheck)\n}\n\nexport function hiddenTextarea() {\n  let te = elt(\"textarea\", null, null, \"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none\")\n  let div = elt(\"div\", [te], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\")\n  // The textarea is kept positioned near the cursor to prevent the\n  // fact that it'll be scrolled into view on input from scrolling\n  // our fake cursor out of view. On webkit, when wrap=off, paste is\n  // very slow. So make the area wide instead.\n  if (webkit) te.style.width = \"1000px\"\n  else te.setAttribute(\"wrap\", \"off\")\n  // If border: 0; -- iOS fails to open keyboard (issue #1287)\n  if (ios) te.style.border = \"1px solid black\"\n  disableBrowserMagic(te)\n  return div\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/input/keymap.js",
    "content": "import { flipCtrlCmd, mac, presto } from \"../util/browser.js\"\nimport { map } from \"../util/misc.js\"\n\nimport { keyNames } from \"./keynames.js\"\n\nexport let keyMap = {}\n\nkeyMap.basic = {\n  \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n  \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n  \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n  \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n  \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n  \"Esc\": \"singleSelection\"\n}\n// Note that the save and find-related commands aren't defined by\n// default. User code or addons can define them. Unknown commands\n// are simply ignored.\nkeyMap.pcDefault = {\n  \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n  \"Ctrl-Home\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n  \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n  \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n  \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n  \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n  \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n  \"fallthrough\": \"basic\"\n}\n// Very basic readline/emacs-style bindings, which are standard on Mac.\nkeyMap.emacsy = {\n  \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n  \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\", \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\",\n  \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\",\n  \"Ctrl-T\": \"transposeChars\", \"Ctrl-O\": \"openLine\"\n}\nkeyMap.macDefault = {\n  \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n  \"Cmd-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n  \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n  \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n  \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n  \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n  \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n  \"fallthrough\": [\"basic\", \"emacsy\"]\n}\nkeyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault\n\n// KEYMAP DISPATCH\n\nfunction normalizeKeyName(name) {\n  let parts = name.split(/-(?!$)/)\n  name = parts[parts.length - 1]\n  let alt, ctrl, shift, cmd\n  for (let i = 0; i < parts.length - 1; i++) {\n    let mod = parts[i]\n    if (/^(cmd|meta|m)$/i.test(mod)) cmd = true\n    else if (/^a(lt)?$/i.test(mod)) alt = true\n    else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true\n    else if (/^s(hift)?$/i.test(mod)) shift = true\n    else throw new Error(\"Unrecognized modifier name: \" + mod)\n  }\n  if (alt) name = \"Alt-\" + name\n  if (ctrl) name = \"Ctrl-\" + name\n  if (cmd) name = \"Cmd-\" + name\n  if (shift) name = \"Shift-\" + name\n  return name\n}\n\n// This is a kludge to keep keymaps mostly working as raw objects\n// (backwards compatibility) while at the same time support features\n// like normalization and multi-stroke key bindings. It compiles a\n// new normalized keymap, and then updates the old object to reflect\n// this.\nexport function normalizeKeyMap(keymap) {\n  let copy = {}\n  for (let keyname in keymap) if (keymap.hasOwnProperty(keyname)) {\n    let value = keymap[keyname]\n    if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) continue\n    if (value == \"...\") { delete keymap[keyname]; continue }\n\n    let keys = map(keyname.split(\" \"), normalizeKeyName)\n    for (let i = 0; i < keys.length; i++) {\n      let val, name\n      if (i == keys.length - 1) {\n        name = keys.join(\" \")\n        val = value\n      } else {\n        name = keys.slice(0, i + 1).join(\" \")\n        val = \"...\"\n      }\n      let prev = copy[name]\n      if (!prev) copy[name] = val\n      else if (prev != val) throw new Error(\"Inconsistent bindings for \" + name)\n    }\n    delete keymap[keyname]\n  }\n  for (let prop in copy) keymap[prop] = copy[prop]\n  return keymap\n}\n\nexport function lookupKey(key, map, handle, context) {\n  map = getKeyMap(map)\n  let found = map.call ? map.call(key, context) : map[key]\n  if (found === false) return \"nothing\"\n  if (found === \"...\") return \"multi\"\n  if (found != null && handle(found)) return \"handled\"\n\n  if (map.fallthrough) {\n    if (Object.prototype.toString.call(map.fallthrough) != \"[object Array]\")\n      return lookupKey(key, map.fallthrough, handle, context)\n    for (let i = 0; i < map.fallthrough.length; i++) {\n      let result = lookupKey(key, map.fallthrough[i], handle, context)\n      if (result) return result\n    }\n  }\n}\n\n// Modifier key presses don't count as 'real' key presses for the\n// purpose of keymap fallthrough.\nexport function isModifierKey(value) {\n  let name = typeof value == \"string\" ? value : keyNames[value.keyCode]\n  return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\"\n}\n\nexport function addModifierNames(name, event, noShift) {\n  let base = name\n  if (event.altKey && base != \"Alt\") name = \"Alt-\" + name\n  if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") name = \"Ctrl-\" + name\n  if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Mod\") name = \"Cmd-\" + name\n  if (!noShift && event.shiftKey && base != \"Shift\") name = \"Shift-\" + name\n  return name\n}\n\n// Look up the name of a key as indicated by an event object.\nexport function keyName(event, noShift) {\n  if (presto && event.keyCode == 34 && event[\"char\"]) return false\n  let name = keyNames[event.keyCode]\n  if (name == null || event.altGraphKey) return false\n  // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,\n  // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)\n  if (event.keyCode == 3 && event.code) name = event.code\n  return addModifierNames(name, event, noShift)\n}\n\nexport function getKeyMap(val) {\n  return typeof val == \"string\" ? keyMap[val] : val\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/input/keynames.js",
    "content": "export let keyNames = {\n  3: \"Pause\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n  19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n  36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n  46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\",\n  106: \"*\", 107: \"=\", 109: \"-\", 110: \".\", 111: \"/\", 145: \"ScrollLock\",\n  173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n  221: \"]\", 222: \"'\", 224: \"Mod\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n  63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n}\n\n// Number keys\nfor (let i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i)\n// Alphabetic keys\nfor (let i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i)\n// Function keys\nfor (let i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = \"F\" + i\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/input/movement.js",
    "content": "import { Pos } from \"../line/pos.js\"\nimport { prepareMeasureForLine, measureCharPrepared, wrappedLineExtentChar } from \"../measurement/position_measurement.js\"\nimport { getBidiPartAt, getOrder } from \"../util/bidi.js\"\nimport { findFirst, lst, skipExtendingChars } from \"../util/misc.js\"\n\nfunction moveCharLogically(line, ch, dir) {\n  let target = skipExtendingChars(line.text, ch + dir, dir)\n  return target < 0 || target > line.text.length ? null : target\n}\n\nexport function moveLogically(line, start, dir) {\n  let ch = moveCharLogically(line, start.ch, dir)\n  return ch == null ? null : new Pos(start.line, ch, dir < 0 ? \"after\" : \"before\")\n}\n\nexport function endOfLine(visually, cm, lineObj, lineNo, dir) {\n  if (visually) {\n    if (cm.doc.direction == \"rtl\") dir = -dir\n    let order = getOrder(lineObj, cm.doc.direction)\n    if (order) {\n      let part = dir < 0 ? lst(order) : order[0]\n      let moveInStorageOrder = (dir < 0) == (part.level == 1)\n      let sticky = moveInStorageOrder ? \"after\" : \"before\"\n      let ch\n      // With a wrapped rtl chunk (possibly spanning multiple bidi parts),\n      // it could be that the last bidi part is not on the last visual line,\n      // since visual lines contain content order-consecutive chunks.\n      // Thus, in rtl, we are looking for the first (content-order) character\n      // in the rtl chunk that is on the last line (that is, the same line\n      // as the last (content-order) character).\n      if (part.level > 0 || cm.doc.direction == \"rtl\") {\n        let prep = prepareMeasureForLine(cm, lineObj)\n        ch = dir < 0 ? lineObj.text.length - 1 : 0\n        let targetTop = measureCharPrepared(cm, prep, ch).top\n        ch = findFirst(ch => measureCharPrepared(cm, prep, ch).top == targetTop, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch)\n        if (sticky == \"before\") ch = moveCharLogically(lineObj, ch, 1)\n      } else ch = dir < 0 ? part.to : part.from\n      return new Pos(lineNo, ch, sticky)\n    }\n  }\n  return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? \"before\" : \"after\")\n}\n\nexport function moveVisually(cm, line, start, dir) {\n  let bidi = getOrder(line, cm.doc.direction)\n  if (!bidi) return moveLogically(line, start, dir)\n  if (start.ch >= line.text.length) {\n    start.ch = line.text.length\n    start.sticky = \"before\"\n  } else if (start.ch <= 0) {\n    start.ch = 0\n    start.sticky = \"after\"\n  }\n  let partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]\n  if (cm.doc.direction == \"ltr\" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {\n    // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,\n    // nothing interesting happens.\n    return moveLogically(line, start, dir)\n  }\n\n  let mv = (pos, dir) => moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir)\n  let prep\n  let getWrappedLineExtent = ch => {\n    if (!cm.options.lineWrapping) return {begin: 0, end: line.text.length}\n    prep = prep || prepareMeasureForLine(cm, line)\n    return wrappedLineExtentChar(cm, line, prep, ch)\n  }\n  let wrappedLineExtent = getWrappedLineExtent(start.sticky == \"before\" ? mv(start, -1) : start.ch)\n\n  if (cm.doc.direction == \"rtl\" || part.level == 1) {\n    let moveInStorageOrder = (part.level == 1) == (dir < 0)\n    let ch = mv(start, moveInStorageOrder ? 1 : -1)\n    if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {\n      // Case 2: We move within an rtl part or in an rtl editor on the same visual line\n      let sticky = moveInStorageOrder ? \"before\" : \"after\"\n      return new Pos(start.line, ch, sticky)\n    }\n  }\n\n  // Case 3: Could not move within this bidi part in this visual line, so leave\n  // the current bidi part\n\n  let searchInVisualLine = (partPos, dir, wrappedLineExtent) => {\n    let getRes = (ch, moveInStorageOrder) => moveInStorageOrder\n      ? new Pos(start.line, mv(ch, 1), \"before\")\n      : new Pos(start.line, ch, \"after\")\n\n    for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {\n      let part = bidi[partPos]\n      let moveInStorageOrder = (dir > 0) == (part.level != 1)\n      let ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1)\n      if (part.from <= ch && ch < part.to) return getRes(ch, moveInStorageOrder)\n      ch = moveInStorageOrder ? part.from : mv(part.to, -1)\n      if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) return getRes(ch, moveInStorageOrder)\n    }\n  }\n\n  // Case 3a: Look for other bidi parts on the same visual line\n  let res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent)\n  if (res) return res\n\n  // Case 3b: Look for other bidi parts on the next visual line\n  let nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1)\n  if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {\n    res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh))\n    if (res) return res\n  }\n\n  // Case 4: Nowhere to move\n  return null\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/line/highlight.js",
    "content": "import { countColumn } from \"../util/misc.js\"\nimport { copyState, innerMode, startState } from \"../modes.js\"\nimport StringStream from \"../util/StringStream.js\"\n\nimport { getLine, lineNo } from \"./utils_line.js\"\nimport { clipPos } from \"./pos.js\"\n\nclass SavedContext {\n  constructor(state, lookAhead) {\n    this.state = state\n    this.lookAhead = lookAhead\n  }\n}\n\nclass Context {\n  constructor(doc, state, line, lookAhead) {\n    this.state = state\n    this.doc = doc\n    this.line = line\n    this.maxLookAhead = lookAhead || 0\n    this.baseTokens = null\n    this.baseTokenPos = 1\n  }\n\n  lookAhead(n) {\n    let line = this.doc.getLine(this.line + n)\n    if (line != null && n > this.maxLookAhead) this.maxLookAhead = n\n    return line\n  }\n\n  baseToken(n) {\n    if (!this.baseTokens) return null\n    while (this.baseTokens[this.baseTokenPos] <= n)\n      this.baseTokenPos += 2\n    let type = this.baseTokens[this.baseTokenPos + 1]\n    return {type: type && type.replace(/( |^)overlay .*/, \"\"),\n            size: this.baseTokens[this.baseTokenPos] - n}\n  }\n\n  nextLine() {\n    this.line++\n    if (this.maxLookAhead > 0) this.maxLookAhead--\n  }\n\n  static fromSaved(doc, saved, line) {\n    if (saved instanceof SavedContext)\n      return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead)\n    else\n      return new Context(doc, copyState(doc.mode, saved), line)\n  }\n\n  save(copy) {\n    let state = copy !== false ? copyState(this.doc.mode, this.state) : this.state\n    return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state\n  }\n}\n\n\n// Compute a style array (an array starting with a mode generation\n// -- for invalidation -- followed by pairs of end positions and\n// style strings), which is used to highlight the tokens on the\n// line.\nexport function highlightLine(cm, line, context, forceToEnd) {\n  // A styles array always starts with a number identifying the\n  // mode/overlays that it is based on (for easy invalidation).\n  let st = [cm.state.modeGen], lineClasses = {}\n  // Compute the base array of styles\n  runMode(cm, line.text, cm.doc.mode, context, (end, style) => st.push(end, style),\n          lineClasses, forceToEnd)\n  let state = context.state\n\n  // Run overlays, adjust style array.\n  for (let o = 0; o < cm.state.overlays.length; ++o) {\n    context.baseTokens = st\n    let overlay = cm.state.overlays[o], i = 1, at = 0\n    context.state = true\n    runMode(cm, line.text, overlay.mode, context, (end, style) => {\n      let start = i\n      // Ensure there's a token end at the current position, and that i points at it\n      while (at < end) {\n        let i_end = st[i]\n        if (i_end > end)\n          st.splice(i, 1, end, st[i+1], i_end)\n        i += 2\n        at = Math.min(end, i_end)\n      }\n      if (!style) return\n      if (overlay.opaque) {\n        st.splice(start, i - start, end, \"overlay \" + style)\n        i = start + 2\n      } else {\n        for (; start < i; start += 2) {\n          let cur = st[start+1]\n          st[start+1] = (cur ? cur + \" \" : \"\") + \"overlay \" + style\n        }\n      }\n    }, lineClasses)\n    context.state = state\n    context.baseTokens = null\n    context.baseTokenPos = 1\n  }\n\n  return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}\n}\n\nexport function getLineStyles(cm, line, updateFrontier) {\n  if (!line.styles || line.styles[0] != cm.state.modeGen) {\n    let context = getContextBefore(cm, lineNo(line))\n    let resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state)\n    let result = highlightLine(cm, line, context)\n    if (resetState) context.state = resetState\n    line.stateAfter = context.save(!resetState)\n    line.styles = result.styles\n    if (result.classes) line.styleClasses = result.classes\n    else if (line.styleClasses) line.styleClasses = null\n    if (updateFrontier === cm.doc.highlightFrontier)\n      cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier)\n  }\n  return line.styles\n}\n\nexport function getContextBefore(cm, n, precise) {\n  let doc = cm.doc, display = cm.display\n  if (!doc.mode.startState) return new Context(doc, true, n)\n  let start = findStartLine(cm, n, precise)\n  let saved = start > doc.first && getLine(doc, start - 1).stateAfter\n  let context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start)\n\n  doc.iter(start, n, line => {\n    processLine(cm, line.text, context)\n    let pos = context.line\n    line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null\n    context.nextLine()\n  })\n  if (precise) doc.modeFrontier = context.line\n  return context\n}\n\n// Lightweight form of highlight -- proceed over this line and\n// update state, but don't save a style array. Used for lines that\n// aren't currently visible.\nexport function processLine(cm, text, context, startAt) {\n  let mode = cm.doc.mode\n  let stream = new StringStream(text, cm.options.tabSize, context)\n  stream.start = stream.pos = startAt || 0\n  if (text == \"\") callBlankLine(mode, context.state)\n  while (!stream.eol()) {\n    readToken(mode, stream, context.state)\n    stream.start = stream.pos\n  }\n}\n\nfunction callBlankLine(mode, state) {\n  if (mode.blankLine) return mode.blankLine(state)\n  if (!mode.innerMode) return\n  let inner = innerMode(mode, state)\n  if (inner.mode.blankLine) return inner.mode.blankLine(inner.state)\n}\n\nfunction readToken(mode, stream, state, inner) {\n  for (let i = 0; i < 10; i++) {\n    if (inner) inner[0] = innerMode(mode, state).mode\n    let style = mode.token(stream, state)\n    if (stream.pos > stream.start) return style\n  }\n  throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\")\n}\n\nclass Token {\n  constructor(stream, type, state) {\n    this.start = stream.start; this.end = stream.pos\n    this.string = stream.current()\n    this.type = type || null\n    this.state = state\n  }\n}\n\n// Utility for getTokenAt and getLineTokens\nexport function takeToken(cm, pos, precise, asArray) {\n  let doc = cm.doc, mode = doc.mode, style\n  pos = clipPos(doc, pos)\n  let line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise)\n  let stream = new StringStream(line.text, cm.options.tabSize, context), tokens\n  if (asArray) tokens = []\n  while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n    stream.start = stream.pos\n    style = readToken(mode, stream, context.state)\n    if (asArray) tokens.push(new Token(stream, style, copyState(doc.mode, context.state)))\n  }\n  return asArray ? tokens : new Token(stream, style, context.state)\n}\n\nfunction extractLineClasses(type, output) {\n  if (type) for (;;) {\n    let lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/)\n    if (!lineClass) break\n    type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length)\n    let prop = lineClass[1] ? \"bgClass\" : \"textClass\"\n    if (output[prop] == null)\n      output[prop] = lineClass[2]\n    else if (!(new RegExp(\"(?:^|\\\\s)\" + lineClass[2] + \"(?:$|\\\\s)\")).test(output[prop]))\n      output[prop] += \" \" + lineClass[2]\n  }\n  return type\n}\n\n// Run the given mode's parser over a line, calling f for each token.\nfunction runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {\n  let flattenSpans = mode.flattenSpans\n  if (flattenSpans == null) flattenSpans = cm.options.flattenSpans\n  let curStart = 0, curStyle = null\n  let stream = new StringStream(text, cm.options.tabSize, context), style\n  let inner = cm.options.addModeClass && [null]\n  if (text == \"\") extractLineClasses(callBlankLine(mode, context.state), lineClasses)\n  while (!stream.eol()) {\n    if (stream.pos > cm.options.maxHighlightLength) {\n      flattenSpans = false\n      if (forceToEnd) processLine(cm, text, context, stream.pos)\n      stream.pos = text.length\n      style = null\n    } else {\n      style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses)\n    }\n    if (inner) {\n      let mName = inner[0].name\n      if (mName) style = \"m-\" + (style ? mName + \" \" + style : mName)\n    }\n    if (!flattenSpans || curStyle != style) {\n      while (curStart < stream.start) {\n        curStart = Math.min(stream.start, curStart + 5000)\n        f(curStart, curStyle)\n      }\n      curStyle = style\n    }\n    stream.start = stream.pos\n  }\n  while (curStart < stream.pos) {\n    // Webkit seems to refuse to render text nodes longer than 57444\n    // characters, and returns inaccurate measurements in nodes\n    // starting around 5000 chars.\n    let pos = Math.min(stream.pos, curStart + 5000)\n    f(pos, curStyle)\n    curStart = pos\n  }\n}\n\n// Finds the line to start with when starting a parse. Tries to\n// find a line with a stateAfter, so that it can start with a\n// valid state. If that fails, it returns the line with the\n// smallest indentation, which tends to need the least context to\n// parse correctly.\nfunction findStartLine(cm, n, precise) {\n  let minindent, minline, doc = cm.doc\n  let lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100)\n  for (let search = n; search > lim; --search) {\n    if (search <= doc.first) return doc.first\n    let line = getLine(doc, search - 1), after = line.stateAfter\n    if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))\n      return search\n    let indented = countColumn(line.text, null, cm.options.tabSize)\n    if (minline == null || minindent > indented) {\n      minline = search - 1\n      minindent = indented\n    }\n  }\n  return minline\n}\n\nexport function retreatFrontier(doc, n) {\n  doc.modeFrontier = Math.min(doc.modeFrontier, n)\n  if (doc.highlightFrontier < n - 10) return\n  let start = doc.first\n  for (let line = n - 1; line > start; line--) {\n    let saved = getLine(doc, line).stateAfter\n    // change is on 3\n    // state on line 1 looked ahead 2 -- so saw 3\n    // test 1 + 2 < 3 should cover this\n    if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {\n      start = line + 1\n      break\n    }\n  }\n  doc.highlightFrontier = Math.min(doc.highlightFrontier, start)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/line/line_data.js",
    "content": "import { getOrder } from \"../util/bidi.js\"\nimport { ie, ie_version, webkit } from \"../util/browser.js\"\nimport { elt, eltP, joinClasses } from \"../util/dom.js\"\nimport { eventMixin, signal } from \"../util/event.js\"\nimport { hasBadBidiRects, zeroWidthElement } from \"../util/feature_detection.js\"\nimport { lst, spaceStr } from \"../util/misc.js\"\n\nimport { getLineStyles } from \"./highlight.js\"\nimport { attachMarkedSpans, compareCollapsedMarkers, detachMarkedSpans, lineIsHidden, visualLineContinued } from \"./spans.js\"\nimport { getLine, lineNo, updateLineHeight } from \"./utils_line.js\"\n\n// LINE DATA STRUCTURE\n\n// Line objects. These hold state related to a line, including\n// highlighting info (the styles array).\nexport class Line {\n  constructor(text, markedSpans, estimateHeight) {\n    this.text = text\n    attachMarkedSpans(this, markedSpans)\n    this.height = estimateHeight ? estimateHeight(this) : 1\n  }\n\n  lineNo() { return lineNo(this) }\n}\neventMixin(Line)\n\n// Change the content (text, markers) of a line. Automatically\n// invalidates cached information and tries to re-estimate the\n// line's height.\nexport function updateLine(line, text, markedSpans, estimateHeight) {\n  line.text = text\n  if (line.stateAfter) line.stateAfter = null\n  if (line.styles) line.styles = null\n  if (line.order != null) line.order = null\n  detachMarkedSpans(line)\n  attachMarkedSpans(line, markedSpans)\n  let estHeight = estimateHeight ? estimateHeight(line) : 1\n  if (estHeight != line.height) updateLineHeight(line, estHeight)\n}\n\n// Detach a line from the document tree and its markers.\nexport function cleanUpLine(line) {\n  line.parent = null\n  detachMarkedSpans(line)\n}\n\n// Convert a style as returned by a mode (either null, or a string\n// containing one or more styles) to a CSS style. This is cached,\n// and also looks for line-wide styles.\nlet styleToClassCache = {}, styleToClassCacheWithMode = {}\nfunction interpretTokenStyle(style, options) {\n  if (!style || /^\\s*$/.test(style)) return null\n  let cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache\n  return cache[style] ||\n    (cache[style] = style.replace(/\\S+/g, \"cm-$&\"))\n}\n\n// Render the DOM representation of the text of a line. Also builds\n// up a 'line map', which points at the DOM nodes that represent\n// specific stretches of text, and is used by the measuring code.\n// The returned object contains the DOM node, this map, and\n// information about line-wide styles that were set by the mode.\nexport function buildLineContent(cm, lineView) {\n  // The padding-right forces the element to have a 'border', which\n  // is needed on Webkit to be able to get line-level bounding\n  // rectangles for it (in measureChar).\n  let content = eltP(\"span\", null, null, webkit ? \"padding-right: .1px\" : null)\n  let builder = {pre: eltP(\"pre\", [content], \"CodeMirror-line\"), content: content,\n                 col: 0, pos: 0, cm: cm,\n                 trailingSpace: false,\n                 splitSpaces: cm.getOption(\"lineWrapping\")}\n  lineView.measure = {}\n\n  // Iterate over the logical lines that make up this visual line.\n  for (let i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n    let line = i ? lineView.rest[i - 1] : lineView.line, order\n    builder.pos = 0\n    builder.addToken = buildToken\n    // Optionally wire in some hacks into the token-rendering\n    // algorithm, to deal with browser quirks.\n    if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))\n      builder.addToken = buildTokenBadBidi(builder.addToken, order)\n    builder.map = []\n    let allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line)\n    insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate))\n    if (line.styleClasses) {\n      if (line.styleClasses.bgClass)\n        builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\")\n      if (line.styleClasses.textClass)\n        builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\")\n    }\n\n    // Ensure at least a single node is present, for measuring.\n    if (builder.map.length == 0)\n      builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)))\n\n    // Store the map and a cache object for the current logical line\n    if (i == 0) {\n      lineView.measure.map = builder.map\n      lineView.measure.cache = {}\n    } else {\n      ;(lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)\n      ;(lineView.measure.caches || (lineView.measure.caches = [])).push({})\n    }\n  }\n\n  // See issue #2901\n  if (webkit) {\n    let last = builder.content.lastChild\n    if (/\\bcm-tab\\b/.test(last.className) || (last.querySelector && last.querySelector(\".cm-tab\")))\n      builder.content.className = \"cm-tab-wrap-hack\"\n  }\n\n  signal(cm, \"renderLine\", cm, lineView.line, builder.pre)\n  if (builder.pre.className)\n    builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\")\n\n  return builder\n}\n\nexport function defaultSpecialCharPlaceholder(ch) {\n  let token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\")\n  token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16)\n  token.setAttribute(\"aria-label\", token.title)\n  return token\n}\n\n// Build up the DOM representation for a single token, and add it to\n// the line map. Takes care to render special characters separately.\nfunction buildToken(builder, text, style, startStyle, endStyle, css, attributes) {\n  if (!text) return\n  let displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text\n  let special = builder.cm.state.specialChars, mustWrap = false\n  let content\n  if (!special.test(text)) {\n    builder.col += text.length\n    content = document.createTextNode(displayText)\n    builder.map.push(builder.pos, builder.pos + text.length, content)\n    if (ie && ie_version < 9) mustWrap = true\n    builder.pos += text.length\n  } else {\n    content = document.createDocumentFragment()\n    let pos = 0\n    while (true) {\n      special.lastIndex = pos\n      let m = special.exec(text)\n      let skipped = m ? m.index - pos : text.length - pos\n      if (skipped) {\n        let txt = document.createTextNode(displayText.slice(pos, pos + skipped))\n        if (ie && ie_version < 9) content.appendChild(elt(\"span\", [txt]))\n        else content.appendChild(txt)\n        builder.map.push(builder.pos, builder.pos + skipped, txt)\n        builder.col += skipped\n        builder.pos += skipped\n      }\n      if (!m) break\n      pos += skipped + 1\n      let txt\n      if (m[0] == \"\\t\") {\n        let tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize\n        txt = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"))\n        txt.setAttribute(\"role\", \"presentation\")\n        txt.setAttribute(\"cm-text\", \"\\t\")\n        builder.col += tabWidth\n      } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n        txt = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"))\n        txt.setAttribute(\"cm-text\", m[0])\n        builder.col += 1\n      } else {\n        txt = builder.cm.options.specialCharPlaceholder(m[0])\n        txt.setAttribute(\"cm-text\", m[0])\n        if (ie && ie_version < 9) content.appendChild(elt(\"span\", [txt]))\n        else content.appendChild(txt)\n        builder.col += 1\n      }\n      builder.map.push(builder.pos, builder.pos + 1, txt)\n      builder.pos++\n    }\n  }\n  builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32\n  if (style || startStyle || endStyle || mustWrap || css || attributes) {\n    let fullStyle = style || \"\"\n    if (startStyle) fullStyle += startStyle\n    if (endStyle) fullStyle += endStyle\n    let token = elt(\"span\", [content], fullStyle, css)\n    if (attributes) {\n      for (let attr in attributes) if (attributes.hasOwnProperty(attr) && attr != \"style\" && attr != \"class\")\n        token.setAttribute(attr, attributes[attr])\n    }\n    return builder.content.appendChild(token)\n  }\n  builder.content.appendChild(content)\n}\n\n// Change some spaces to NBSP to prevent the browser from collapsing\n// trailing spaces at the end of a line when rendering text (issue #1362).\nfunction splitSpaces(text, trailingBefore) {\n  if (text.length > 1 && !/  /.test(text)) return text\n  let spaceBefore = trailingBefore, result = \"\"\n  for (let i = 0; i < text.length; i++) {\n    let ch = text.charAt(i)\n    if (ch == \" \" && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))\n      ch = \"\\u00a0\"\n    result += ch\n    spaceBefore = ch == \" \"\n  }\n  return result\n}\n\n// Work around nonsense dimensions being reported for stretches of\n// right-to-left text.\nfunction buildTokenBadBidi(inner, order) {\n  return (builder, text, style, startStyle, endStyle, css, attributes) => {\n    style = style ? style + \" cm-force-border\" : \"cm-force-border\"\n    let start = builder.pos, end = start + text.length\n    for (;;) {\n      // Find the part that overlaps with the start of this text\n      let part\n      for (let i = 0; i < order.length; i++) {\n        part = order[i]\n        if (part.to > start && part.from <= start) break\n      }\n      if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, css, attributes)\n      inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes)\n      startStyle = null\n      text = text.slice(part.to - start)\n      start = part.to\n    }\n  }\n}\n\nfunction buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n  let widget = !ignoreWidget && marker.widgetNode\n  if (widget) builder.map.push(builder.pos, builder.pos + size, widget)\n  if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {\n    if (!widget)\n      widget = builder.content.appendChild(document.createElement(\"span\"))\n    widget.setAttribute(\"cm-marker\", marker.id)\n  }\n  if (widget) {\n    builder.cm.display.input.setUneditable(widget)\n    builder.content.appendChild(widget)\n  }\n  builder.pos += size\n  builder.trailingSpace = false\n}\n\n// Outputs a number of spans to make up a line, taking highlighting\n// and marked text into account.\nfunction insertLineContent(line, builder, styles) {\n  let spans = line.markedSpans, allText = line.text, at = 0\n  if (!spans) {\n    for (let i = 1; i < styles.length; i+=2)\n      builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options))\n    return\n  }\n\n  let len = allText.length, pos = 0, i = 1, text = \"\", style, css\n  let nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes\n  for (;;) {\n    if (nextChange == pos) { // Update current marker set\n      spanStyle = spanEndStyle = spanStartStyle = css = \"\"\n      attributes = null\n      collapsed = null; nextChange = Infinity\n      let foundBookmarks = [], endStyles\n      for (let j = 0; j < spans.length; ++j) {\n        let sp = spans[j], m = sp.marker\n        if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n          foundBookmarks.push(m)\n        } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n          if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n            nextChange = sp.to\n            spanEndStyle = \"\"\n          }\n          if (m.className) spanStyle += \" \" + m.className\n          if (m.css) css = (css ? css + \";\" : \"\") + m.css\n          if (m.startStyle && sp.from == pos) spanStartStyle += \" \" + m.startStyle\n          if (m.endStyle && sp.to == nextChange) (endStyles || (endStyles = [])).push(m.endStyle, sp.to)\n          // support for the old title property\n          // https://github.com/codemirror/CodeMirror/pull/5673\n          if (m.title) (attributes || (attributes = {})).title = m.title\n          if (m.attributes) {\n            for (let attr in m.attributes)\n              (attributes || (attributes = {}))[attr] = m.attributes[attr]\n          }\n          if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n            collapsed = sp\n        } else if (sp.from > pos && nextChange > sp.from) {\n          nextChange = sp.from\n        }\n      }\n      if (endStyles) for (let j = 0; j < endStyles.length; j += 2)\n        if (endStyles[j + 1] == nextChange) spanEndStyle += \" \" + endStyles[j]\n\n      if (!collapsed || collapsed.from == pos) for (let j = 0; j < foundBookmarks.length; ++j)\n        buildCollapsedSpan(builder, 0, foundBookmarks[j])\n      if (collapsed && (collapsed.from || 0) == pos) {\n        buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n                           collapsed.marker, collapsed.from == null)\n        if (collapsed.to == null) return\n        if (collapsed.to == pos) collapsed = false\n      }\n    }\n    if (pos >= len) break\n\n    let upto = Math.min(len, nextChange)\n    while (true) {\n      if (text) {\n        let end = pos + text.length\n        if (!collapsed) {\n          let tokenText = end > upto ? text.slice(0, upto - pos) : text\n          builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n                           spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", css, attributes)\n        }\n        if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}\n        pos = end\n        spanStartStyle = \"\"\n      }\n      text = allText.slice(at, at = styles[i++])\n      style = interpretTokenStyle(styles[i++], builder.cm.options)\n    }\n  }\n}\n\n\n// These objects are used to represent the visible (currently drawn)\n// part of the document. A LineView may correspond to multiple\n// logical lines, if those are connected by collapsed ranges.\nexport function LineView(doc, line, lineN) {\n  // The starting line\n  this.line = line\n  // Continuing lines, if any\n  this.rest = visualLineContinued(line)\n  // Number of logical lines in this visual line\n  this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1\n  this.node = this.text = null\n  this.hidden = lineIsHidden(doc, line)\n}\n\n// Create a range of LineView objects for the given lines.\nexport function buildViewArray(cm, from, to) {\n  let array = [], nextPos\n  for (let pos = from; pos < to; pos = nextPos) {\n    let view = new LineView(cm.doc, getLine(cm.doc, pos), pos)\n    nextPos = pos + view.size\n    array.push(view)\n  }\n  return array\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/line/pos.js",
    "content": "import { getLine } from \"./utils_line.js\"\n\n// A Pos instance represents a position within the text.\nexport function Pos(line, ch, sticky = null) {\n  if (!(this instanceof Pos)) return new Pos(line, ch, sticky)\n  this.line = line\n  this.ch = ch\n  this.sticky = sticky\n}\n\n// Compare two positions, return 0 if they are the same, a negative\n// number when a is less, and a positive number otherwise.\nexport function cmp(a, b) { return a.line - b.line || a.ch - b.ch }\n\nexport function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }\n\nexport function copyPos(x) {return Pos(x.line, x.ch)}\nexport function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }\nexport function minPos(a, b) { return cmp(a, b) < 0 ? a : b }\n\n// Most of the external API clips given positions to make sure they\n// actually exist within the document.\nexport function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}\nexport function clipPos(doc, pos) {\n  if (pos.line < doc.first) return Pos(doc.first, 0)\n  let last = doc.first + doc.size - 1\n  if (pos.line > last) return Pos(last, getLine(doc, last).text.length)\n  return clipToLen(pos, getLine(doc, pos.line).text.length)\n}\nfunction clipToLen(pos, linelen) {\n  let ch = pos.ch\n  if (ch == null || ch > linelen) return Pos(pos.line, linelen)\n  else if (ch < 0) return Pos(pos.line, 0)\n  else return pos\n}\nexport function clipPosArray(doc, array) {\n  let out = []\n  for (let i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i])\n  return out\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/line/saw_special_spans.js",
    "content": "// Optimize some code when these features are not used.\nexport let sawReadOnlySpans = false, sawCollapsedSpans = false\n\nexport function seeReadOnlySpans() {\n  sawReadOnlySpans = true\n}\n\nexport function seeCollapsedSpans() {\n  sawCollapsedSpans = true\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/line/spans.js",
    "content": "import { indexOf, lst } from \"../util/misc.js\"\n\nimport { cmp } from \"./pos.js\"\nimport { sawCollapsedSpans } from \"./saw_special_spans.js\"\nimport { getLine, isLine, lineNo } from \"./utils_line.js\"\n\n// TEXTMARKER SPANS\n\nexport function MarkedSpan(marker, from, to) {\n  this.marker = marker\n  this.from = from; this.to = to\n}\n\n// Search an array of spans for a span matching the given marker.\nexport function getMarkedSpanFor(spans, marker) {\n  if (spans) for (let i = 0; i < spans.length; ++i) {\n    let span = spans[i]\n    if (span.marker == marker) return span\n  }\n}\n\n// Remove a span from an array, returning undefined if no spans are\n// left (we don't store arrays for lines without spans).\nexport function removeMarkedSpan(spans, span) {\n  let r\n  for (let i = 0; i < spans.length; ++i)\n    if (spans[i] != span) (r || (r = [])).push(spans[i])\n  return r\n}\n\n// Add a span to a line.\nexport function addMarkedSpan(line, span, op) {\n  let inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet))\n  if (inThisOp && inThisOp.has(line.markedSpans)) {\n    line.markedSpans.push(span)\n  } else {\n    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]\n    if (inThisOp) inThisOp.add(line.markedSpans)\n  }\n  span.marker.attachLine(line)\n}\n\n// Used for the algorithm that adjusts markers for a change in the\n// document. These functions cut an array of spans at a given\n// character position, returning an array of remaining chunks (or\n// undefined if nothing remains).\nfunction markedSpansBefore(old, startCh, isInsert) {\n  let nw\n  if (old) for (let i = 0; i < old.length; ++i) {\n    let span = old[i], marker = span.marker\n    let startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh)\n    if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n      let endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)\n      ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to))\n    }\n  }\n  return nw\n}\nfunction markedSpansAfter(old, endCh, isInsert) {\n  let nw\n  if (old) for (let i = 0; i < old.length; ++i) {\n    let span = old[i], marker = span.marker\n    let endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh)\n    if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n      let startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)\n      ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n                                            span.to == null ? null : span.to - endCh))\n    }\n  }\n  return nw\n}\n\n// Given a change object, compute the new set of marker spans that\n// cover the line in which the change took place. Removes spans\n// entirely within the change, reconnects spans belonging to the\n// same marker that appear on both sides of the change, and cuts off\n// spans partially within the change. Returns an array of span\n// arrays with one element for each line in (after) the change.\nexport function stretchSpansOverChange(doc, change) {\n  if (change.full) return null\n  let oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans\n  let oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans\n  if (!oldFirst && !oldLast) return null\n\n  let startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0\n  // Get the spans that 'stick out' on both sides\n  let first = markedSpansBefore(oldFirst, startCh, isInsert)\n  let last = markedSpansAfter(oldLast, endCh, isInsert)\n\n  // Next, merge those two ends\n  let sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0)\n  if (first) {\n    // Fix up .to properties of first\n    for (let i = 0; i < first.length; ++i) {\n      let span = first[i]\n      if (span.to == null) {\n        let found = getMarkedSpanFor(last, span.marker)\n        if (!found) span.to = startCh\n        else if (sameLine) span.to = found.to == null ? null : found.to + offset\n      }\n    }\n  }\n  if (last) {\n    // Fix up .from in last (or move them into first in case of sameLine)\n    for (let i = 0; i < last.length; ++i) {\n      let span = last[i]\n      if (span.to != null) span.to += offset\n      if (span.from == null) {\n        let found = getMarkedSpanFor(first, span.marker)\n        if (!found) {\n          span.from = offset\n          if (sameLine) (first || (first = [])).push(span)\n        }\n      } else {\n        span.from += offset\n        if (sameLine) (first || (first = [])).push(span)\n      }\n    }\n  }\n  // Make sure we didn't create any zero-length spans\n  if (first) first = clearEmptySpans(first)\n  if (last && last != first) last = clearEmptySpans(last)\n\n  let newMarkers = [first]\n  if (!sameLine) {\n    // Fill gap with whole-line-spans\n    let gap = change.text.length - 2, gapMarkers\n    if (gap > 0 && first)\n      for (let i = 0; i < first.length; ++i)\n        if (first[i].to == null)\n          (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null))\n    for (let i = 0; i < gap; ++i)\n      newMarkers.push(gapMarkers)\n    newMarkers.push(last)\n  }\n  return newMarkers\n}\n\n// Remove spans that are empty and don't have a clearWhenEmpty\n// option of false.\nfunction clearEmptySpans(spans) {\n  for (let i = 0; i < spans.length; ++i) {\n    let span = spans[i]\n    if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n      spans.splice(i--, 1)\n  }\n  if (!spans.length) return null\n  return spans\n}\n\n// Used to 'clip' out readOnly ranges when making a change.\nexport function removeReadOnlyRanges(doc, from, to) {\n  let markers = null\n  doc.iter(from.line, to.line + 1, line => {\n    if (line.markedSpans) for (let i = 0; i < line.markedSpans.length; ++i) {\n      let mark = line.markedSpans[i].marker\n      if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n        (markers || (markers = [])).push(mark)\n    }\n  })\n  if (!markers) return null\n  let parts = [{from: from, to: to}]\n  for (let i = 0; i < markers.length; ++i) {\n    let mk = markers[i], m = mk.find(0)\n    for (let j = 0; j < parts.length; ++j) {\n      let p = parts[j]\n      if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue\n      let newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to)\n      if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n        newParts.push({from: p.from, to: m.from})\n      if (dto > 0 || !mk.inclusiveRight && !dto)\n        newParts.push({from: m.to, to: p.to})\n      parts.splice.apply(parts, newParts)\n      j += newParts.length - 3\n    }\n  }\n  return parts\n}\n\n// Connect or disconnect spans from a line.\nexport function detachMarkedSpans(line) {\n  let spans = line.markedSpans\n  if (!spans) return\n  for (let i = 0; i < spans.length; ++i)\n    spans[i].marker.detachLine(line)\n  line.markedSpans = null\n}\nexport function attachMarkedSpans(line, spans) {\n  if (!spans) return\n  for (let i = 0; i < spans.length; ++i)\n    spans[i].marker.attachLine(line)\n  line.markedSpans = spans\n}\n\n// Helpers used when computing which overlapping collapsed span\n// counts as the larger one.\nfunction extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }\nfunction extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }\n\n// Returns a number indicating which of two overlapping collapsed\n// spans is larger (and thus includes the other). Falls back to\n// comparing ids when the spans cover exactly the same range.\nexport function compareCollapsedMarkers(a, b) {\n  let lenDiff = a.lines.length - b.lines.length\n  if (lenDiff != 0) return lenDiff\n  let aPos = a.find(), bPos = b.find()\n  let fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b)\n  if (fromCmp) return -fromCmp\n  let toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b)\n  if (toCmp) return toCmp\n  return b.id - a.id\n}\n\n// Find out whether a line ends or starts in a collapsed span. If\n// so, return the marker for that span.\nfunction collapsedSpanAtSide(line, start) {\n  let sps = sawCollapsedSpans && line.markedSpans, found\n  if (sps) for (let sp, i = 0; i < sps.length; ++i) {\n    sp = sps[i]\n    if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n        (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n      found = sp.marker\n  }\n  return found\n}\nexport function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }\nexport function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }\n\nexport function collapsedSpanAround(line, ch) {\n  let sps = sawCollapsedSpans && line.markedSpans, found\n  if (sps) for (let i = 0; i < sps.length; ++i) {\n    let sp = sps[i]\n    if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&\n        (!found || compareCollapsedMarkers(found, sp.marker) < 0)) found = sp.marker\n  }\n  return found\n}\n\n// Test whether there exists a collapsed span that partially\n// overlaps (covers the start or end, but not both) of a new span.\n// Such overlap is not allowed.\nexport function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n  let line = getLine(doc, lineNo)\n  let sps = sawCollapsedSpans && line.markedSpans\n  if (sps) for (let i = 0; i < sps.length; ++i) {\n    let sp = sps[i]\n    if (!sp.marker.collapsed) continue\n    let found = sp.marker.find(0)\n    let fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker)\n    let toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker)\n    if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue\n    if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||\n        fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))\n      return true\n  }\n}\n\n// A visual line is a line as drawn on the screen. Folding, for\n// example, can cause multiple logical lines to appear on the same\n// visual line. This finds the start of the visual line that the\n// given line is part of (usually that is the line itself).\nexport function visualLine(line) {\n  let merged\n  while (merged = collapsedSpanAtStart(line))\n    line = merged.find(-1, true).line\n  return line\n}\n\nexport function visualLineEnd(line) {\n  let merged\n  while (merged = collapsedSpanAtEnd(line))\n    line = merged.find(1, true).line\n  return line\n}\n\n// Returns an array of logical lines that continue the visual line\n// started by the argument, or undefined if there are no such lines.\nexport function visualLineContinued(line) {\n  let merged, lines\n  while (merged = collapsedSpanAtEnd(line)) {\n    line = merged.find(1, true).line\n    ;(lines || (lines = [])).push(line)\n  }\n  return lines\n}\n\n// Get the line number of the start of the visual line that the\n// given line number is part of.\nexport function visualLineNo(doc, lineN) {\n  let line = getLine(doc, lineN), vis = visualLine(line)\n  if (line == vis) return lineN\n  return lineNo(vis)\n}\n\n// Get the line number of the start of the next visual line after\n// the given line.\nexport function visualLineEndNo(doc, lineN) {\n  if (lineN > doc.lastLine()) return lineN\n  let line = getLine(doc, lineN), merged\n  if (!lineIsHidden(doc, line)) return lineN\n  while (merged = collapsedSpanAtEnd(line))\n    line = merged.find(1, true).line\n  return lineNo(line) + 1\n}\n\n// Compute whether a line is hidden. Lines count as hidden when they\n// are part of a visual line that starts with another line, or when\n// they are entirely covered by collapsed, non-widget span.\nexport function lineIsHidden(doc, line) {\n  let sps = sawCollapsedSpans && line.markedSpans\n  if (sps) for (let sp, i = 0; i < sps.length; ++i) {\n    sp = sps[i]\n    if (!sp.marker.collapsed) continue\n    if (sp.from == null) return true\n    if (sp.marker.widgetNode) continue\n    if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n      return true\n  }\n}\nfunction lineIsHiddenInner(doc, line, span) {\n  if (span.to == null) {\n    let end = span.marker.find(1, true)\n    return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))\n  }\n  if (span.marker.inclusiveRight && span.to == line.text.length)\n    return true\n  for (let sp, i = 0; i < line.markedSpans.length; ++i) {\n    sp = line.markedSpans[i]\n    if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n        (sp.to == null || sp.to != span.from) &&\n        (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n        lineIsHiddenInner(doc, line, sp)) return true\n  }\n}\n\n// Find the height above the given line.\nexport function heightAtLine(lineObj) {\n  lineObj = visualLine(lineObj)\n\n  let h = 0, chunk = lineObj.parent\n  for (let i = 0; i < chunk.lines.length; ++i) {\n    let line = chunk.lines[i]\n    if (line == lineObj) break\n    else h += line.height\n  }\n  for (let p = chunk.parent; p; chunk = p, p = chunk.parent) {\n    for (let i = 0; i < p.children.length; ++i) {\n      let cur = p.children[i]\n      if (cur == chunk) break\n      else h += cur.height\n    }\n  }\n  return h\n}\n\n// Compute the character length of a line, taking into account\n// collapsed ranges (see markText) that might hide parts, and join\n// other lines onto it.\nexport function lineLength(line) {\n  if (line.height == 0) return 0\n  let len = line.text.length, merged, cur = line\n  while (merged = collapsedSpanAtStart(cur)) {\n    let found = merged.find(0, true)\n    cur = found.from.line\n    len += found.from.ch - found.to.ch\n  }\n  cur = line\n  while (merged = collapsedSpanAtEnd(cur)) {\n    let found = merged.find(0, true)\n    len -= cur.text.length - found.from.ch\n    cur = found.to.line\n    len += cur.text.length - found.to.ch\n  }\n  return len\n}\n\n// Find the longest line in the document.\nexport function findMaxLine(cm) {\n  let d = cm.display, doc = cm.doc\n  d.maxLine = getLine(doc, doc.first)\n  d.maxLineLength = lineLength(d.maxLine)\n  d.maxLineChanged = true\n  doc.iter(line => {\n    let len = lineLength(line)\n    if (len > d.maxLineLength) {\n      d.maxLineLength = len\n      d.maxLine = line\n    }\n  })\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/line/utils_line.js",
    "content": "import { indexOf } from \"../util/misc.js\"\n\n// Find the line object corresponding to the given line number.\nexport function getLine(doc, n) {\n  n -= doc.first\n  if (n < 0 || n >= doc.size) throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\")\n  let chunk = doc\n  while (!chunk.lines) {\n    for (let i = 0;; ++i) {\n      let child = chunk.children[i], sz = child.chunkSize()\n      if (n < sz) { chunk = child; break }\n      n -= sz\n    }\n  }\n  return chunk.lines[n]\n}\n\n// Get the part of a document between two positions, as an array of\n// strings.\nexport function getBetween(doc, start, end) {\n  let out = [], n = start.line\n  doc.iter(start.line, end.line + 1, line => {\n    let text = line.text\n    if (n == end.line) text = text.slice(0, end.ch)\n    if (n == start.line) text = text.slice(start.ch)\n    out.push(text)\n    ++n\n  })\n  return out\n}\n// Get the lines between from and to, as array of strings.\nexport function getLines(doc, from, to) {\n  let out = []\n  doc.iter(from, to, line => { out.push(line.text) }) // iter aborts when callback returns truthy value\n  return out\n}\n\n// Update the height of a line, propagating the height change\n// upwards to parent nodes.\nexport function updateLineHeight(line, height) {\n  let diff = height - line.height\n  if (diff) for (let n = line; n; n = n.parent) n.height += diff\n}\n\n// Given a line object, find its line number by walking up through\n// its parent links.\nexport function lineNo(line) {\n  if (line.parent == null) return null\n  let cur = line.parent, no = indexOf(cur.lines, line)\n  for (let chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n    for (let i = 0;; ++i) {\n      if (chunk.children[i] == cur) break\n      no += chunk.children[i].chunkSize()\n    }\n  }\n  return no + cur.first\n}\n\n// Find the line at the given vertical position, using the height\n// information in the document tree.\nexport function lineAtHeight(chunk, h) {\n  let n = chunk.first\n  outer: do {\n    for (let i = 0; i < chunk.children.length; ++i) {\n      let child = chunk.children[i], ch = child.height\n      if (h < ch) { chunk = child; continue outer }\n      h -= ch\n      n += child.chunkSize()\n    }\n    return n\n  } while (!chunk.lines)\n  let i = 0\n  for (; i < chunk.lines.length; ++i) {\n    let line = chunk.lines[i], lh = line.height\n    if (h < lh) break\n    h -= lh\n  }\n  return n + i\n}\n\nexport function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}\n\nexport function lineNumberFor(options, i) {\n  return String(options.lineNumberFormatter(i + options.firstLineNumber))\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/measurement/position_measurement.js",
    "content": "import { buildLineContent, LineView } from \"../line/line_data.js\"\nimport { clipPos, Pos } from \"../line/pos.js\"\nimport { collapsedSpanAround, heightAtLine, lineIsHidden, visualLine } from \"../line/spans.js\"\nimport { getLine, lineAtHeight, lineNo, updateLineHeight } from \"../line/utils_line.js\"\nimport { bidiOther, getBidiPartAt, getOrder } from \"../util/bidi.js\"\nimport { chrome, android, ie, ie_version } from \"../util/browser.js\"\nimport { elt, removeChildren, range, removeChildrenAndAdd } from \"../util/dom.js\"\nimport { e_target } from \"../util/event.js\"\nimport { hasBadZoomedRects } from \"../util/feature_detection.js\"\nimport { countColumn, findFirst, isExtendingChar, scrollerGap, skipExtendingChars } from \"../util/misc.js\"\nimport { updateLineForChanges } from \"../display/update_line.js\"\n\nimport { widgetHeight } from \"./widgets.js\"\n\n// POSITION MEASUREMENT\n\nexport function paddingTop(display) {return display.lineSpace.offsetTop}\nexport function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}\nexport function paddingH(display) {\n  if (display.cachedPaddingH) return display.cachedPaddingH\n  let e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\", \"CodeMirror-line-like\"))\n  let style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle\n  let data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}\n  if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data\n  return data\n}\n\nexport function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }\nexport function displayWidth(cm) {\n  return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth\n}\nexport function displayHeight(cm) {\n  return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight\n}\n\n// Ensure the lineView.wrapping.heights array is populated. This is\n// an array of bottom offsets for the lines that make up a drawn\n// line. When lineWrapping is on, there might be more than one\n// height.\nfunction ensureLineHeights(cm, lineView, rect) {\n  let wrapping = cm.options.lineWrapping\n  let curWidth = wrapping && displayWidth(cm)\n  if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n    let heights = lineView.measure.heights = []\n    if (wrapping) {\n      lineView.measure.width = curWidth\n      let rects = lineView.text.firstChild.getClientRects()\n      for (let i = 0; i < rects.length - 1; i++) {\n        let cur = rects[i], next = rects[i + 1]\n        if (Math.abs(cur.bottom - next.bottom) > 2)\n          heights.push((cur.bottom + next.top) / 2 - rect.top)\n      }\n    }\n    heights.push(rect.bottom - rect.top)\n  }\n}\n\n// Find a line map (mapping character offsets to text nodes) and a\n// measurement cache for the given line number. (A line view might\n// contain multiple lines when collapsed ranges are present.)\nexport function mapFromLineView(lineView, line, lineN) {\n  if (lineView.line == line)\n    return {map: lineView.measure.map, cache: lineView.measure.cache}\n  if (lineView.rest) {\n    for (let i = 0; i < lineView.rest.length; i++)\n      if (lineView.rest[i] == line)\n        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]}\n    for (let i = 0; i < lineView.rest.length; i++)\n      if (lineNo(lineView.rest[i]) > lineN)\n        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true}\n  }\n}\n\n// Render a line into the hidden node display.externalMeasured. Used\n// when measurement is needed for a line that's not in the viewport.\nfunction updateExternalMeasurement(cm, line) {\n  line = visualLine(line)\n  let lineN = lineNo(line)\n  let view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN)\n  view.lineN = lineN\n  let built = view.built = buildLineContent(cm, view)\n  view.text = built.pre\n  removeChildrenAndAdd(cm.display.lineMeasure, built.pre)\n  return view\n}\n\n// Get a {top, bottom, left, right} box (in line-local coordinates)\n// for a given character.\nexport function measureChar(cm, line, ch, bias) {\n  return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)\n}\n\n// Find a line view that corresponds to the given line number.\nexport function findViewForLine(cm, lineN) {\n  if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n    return cm.display.view[findViewIndex(cm, lineN)]\n  let ext = cm.display.externalMeasured\n  if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n    return ext\n}\n\n// Measurement can be split in two steps, the set-up work that\n// applies to the whole line, and the measurement of the actual\n// character. Functions like coordsChar, that need to do a lot of\n// measurements in a row, can thus ensure that the set-up work is\n// only done once.\nexport function prepareMeasureForLine(cm, line) {\n  let lineN = lineNo(line)\n  let view = findViewForLine(cm, lineN)\n  if (view && !view.text) {\n    view = null\n  } else if (view && view.changes) {\n    updateLineForChanges(cm, view, lineN, getDimensions(cm))\n    cm.curOp.forceUpdate = true\n  }\n  if (!view)\n    view = updateExternalMeasurement(cm, line)\n\n  let info = mapFromLineView(view, line, lineN)\n  return {\n    line: line, view: view, rect: null,\n    map: info.map, cache: info.cache, before: info.before,\n    hasHeights: false\n  }\n}\n\n// Given a prepared measurement object, measures the position of an\n// actual character (or fetches it from the cache).\nexport function measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n  if (prepared.before) ch = -1\n  let key = ch + (bias || \"\"), found\n  if (prepared.cache.hasOwnProperty(key)) {\n    found = prepared.cache[key]\n  } else {\n    if (!prepared.rect)\n      prepared.rect = prepared.view.text.getBoundingClientRect()\n    if (!prepared.hasHeights) {\n      ensureLineHeights(cm, prepared.view, prepared.rect)\n      prepared.hasHeights = true\n    }\n    found = measureCharInner(cm, prepared, ch, bias)\n    if (!found.bogus) prepared.cache[key] = found\n  }\n  return {left: found.left, right: found.right,\n          top: varHeight ? found.rtop : found.top,\n          bottom: varHeight ? found.rbottom : found.bottom}\n}\n\nlet nullRect = {left: 0, right: 0, top: 0, bottom: 0}\n\nexport function nodeAndOffsetInLineMap(map, ch, bias) {\n  let node, start, end, collapse, mStart, mEnd\n  // First, search the line map for the text node corresponding to,\n  // or closest to, the target character.\n  for (let i = 0; i < map.length; i += 3) {\n    mStart = map[i]\n    mEnd = map[i + 1]\n    if (ch < mStart) {\n      start = 0; end = 1\n      collapse = \"left\"\n    } else if (ch < mEnd) {\n      start = ch - mStart\n      end = start + 1\n    } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n      end = mEnd - mStart\n      start = end - 1\n      if (ch >= mEnd) collapse = \"right\"\n    }\n    if (start != null) {\n      node = map[i + 2]\n      if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n        collapse = bias\n      if (bias == \"left\" && start == 0)\n        while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n          node = map[(i -= 3) + 2]\n          collapse = \"left\"\n        }\n      if (bias == \"right\" && start == mEnd - mStart)\n        while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n          node = map[(i += 3) + 2]\n          collapse = \"right\"\n        }\n      break\n    }\n  }\n  return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}\n}\n\nfunction getUsefulRect(rects, bias) {\n  let rect = nullRect\n  if (bias == \"left\") for (let i = 0; i < rects.length; i++) {\n    if ((rect = rects[i]).left != rect.right) break\n  } else for (let i = rects.length - 1; i >= 0; i--) {\n    if ((rect = rects[i]).left != rect.right) break\n  }\n  return rect\n}\n\nfunction measureCharInner(cm, prepared, ch, bias) {\n  let place = nodeAndOffsetInLineMap(prepared.map, ch, bias)\n  let node = place.node, start = place.start, end = place.end, collapse = place.collapse\n\n  let rect\n  if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n    for (let i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n      while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start\n      while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end\n      if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)\n        rect = node.parentNode.getBoundingClientRect()\n      else\n        rect = getUsefulRect(range(node, start, end).getClientRects(), bias)\n      if (rect.left || rect.right || start == 0) break\n      end = start\n      start = start - 1\n      collapse = \"right\"\n    }\n    if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect)\n  } else { // If it is a widget, simply get the box for the whole widget.\n    if (start > 0) collapse = bias = \"right\"\n    let rects\n    if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n      rect = rects[bias == \"right\" ? rects.length - 1 : 0]\n    else\n      rect = node.getBoundingClientRect()\n  }\n  if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n    let rSpan = node.parentNode.getClientRects()[0]\n    if (rSpan)\n      rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}\n    else\n      rect = nullRect\n  }\n\n  let rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top\n  let mid = (rtop + rbot) / 2\n  let heights = prepared.view.measure.heights\n  let i = 0\n  for (; i < heights.length - 1; i++)\n    if (mid < heights[i]) break\n  let top = i ? heights[i - 1] : 0, bot = heights[i]\n  let result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n                right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n                top: top, bottom: bot}\n  if (!rect.left && !rect.right) result.bogus = true\n  if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot }\n\n  return result\n}\n\n// Work around problem with bounding client rects on ranges being\n// returned incorrectly when zoomed on IE10 and below.\nfunction maybeUpdateRectForZooming(measure, rect) {\n  if (!window.screen || screen.logicalXDPI == null ||\n      screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n    return rect\n  let scaleX = screen.logicalXDPI / screen.deviceXDPI\n  let scaleY = screen.logicalYDPI / screen.deviceYDPI\n  return {left: rect.left * scaleX, right: rect.right * scaleX,\n          top: rect.top * scaleY, bottom: rect.bottom * scaleY}\n}\n\nexport function clearLineMeasurementCacheFor(lineView) {\n  if (lineView.measure) {\n    lineView.measure.cache = {}\n    lineView.measure.heights = null\n    if (lineView.rest) for (let i = 0; i < lineView.rest.length; i++)\n      lineView.measure.caches[i] = {}\n  }\n}\n\nexport function clearLineMeasurementCache(cm) {\n  cm.display.externalMeasure = null\n  removeChildren(cm.display.lineMeasure)\n  for (let i = 0; i < cm.display.view.length; i++)\n    clearLineMeasurementCacheFor(cm.display.view[i])\n}\n\nexport function clearCaches(cm) {\n  clearLineMeasurementCache(cm)\n  cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null\n  if (!cm.options.lineWrapping) cm.display.maxLineChanged = true\n  cm.display.lineNumChars = null\n}\n\nfunction pageScrollX() {\n  // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206\n  // which causes page_Offset and bounding client rects to use\n  // different reference viewports and invalidate our calculations.\n  if (chrome && android) return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft))\n  return window.pageXOffset || (document.documentElement || document.body).scrollLeft\n}\nfunction pageScrollY() {\n  if (chrome && android) return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop))\n  return window.pageYOffset || (document.documentElement || document.body).scrollTop\n}\n\nfunction widgetTopHeight(lineObj) {\n  let {widgets} = visualLine(lineObj), height = 0\n  if (widgets) for (let i = 0; i < widgets.length; ++i) if (widgets[i].above)\n    height += widgetHeight(widgets[i])\n  return height\n}\n\n// Converts a {top, bottom, left, right} box from line-local\n// coordinates into another coordinate system. Context may be one of\n// \"line\", \"div\" (display.lineDiv), \"local\"./null (editor), \"window\",\n// or \"page\".\nexport function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {\n  if (!includeWidgets) {\n    let height = widgetTopHeight(lineObj)\n    rect.top += height; rect.bottom += height\n  }\n  if (context == \"line\") return rect\n  if (!context) context = \"local\"\n  let yOff = heightAtLine(lineObj)\n  if (context == \"local\") yOff += paddingTop(cm.display)\n  else yOff -= cm.display.viewOffset\n  if (context == \"page\" || context == \"window\") {\n    let lOff = cm.display.lineSpace.getBoundingClientRect()\n    yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY())\n    let xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX())\n    rect.left += xOff; rect.right += xOff\n  }\n  rect.top += yOff; rect.bottom += yOff\n  return rect\n}\n\n// Coverts a box from \"div\" coords to another coordinate system.\n// Context may be \"window\", \"page\", \"div\", or \"local\"./null.\nexport function fromCoordSystem(cm, coords, context) {\n  if (context == \"div\") return coords\n  let left = coords.left, top = coords.top\n  // First move into \"page\" coordinate system\n  if (context == \"page\") {\n    left -= pageScrollX()\n    top -= pageScrollY()\n  } else if (context == \"local\" || !context) {\n    let localBox = cm.display.sizer.getBoundingClientRect()\n    left += localBox.left\n    top += localBox.top\n  }\n\n  let lineSpaceBox = cm.display.lineSpace.getBoundingClientRect()\n  return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}\n}\n\nexport function charCoords(cm, pos, context, lineObj, bias) {\n  if (!lineObj) lineObj = getLine(cm.doc, pos.line)\n  return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)\n}\n\n// Returns a box for a given cursor position, which may have an\n// 'other' property containing the position of the secondary cursor\n// on a bidi boundary.\n// A cursor Pos(line, char, \"before\") is on the same visual line as `char - 1`\n// and after `char - 1` in writing order of `char - 1`\n// A cursor Pos(line, char, \"after\") is on the same visual line as `char`\n// and before `char` in writing order of `char`\n// Examples (upper-case letters are RTL, lower-case are LTR):\n//     Pos(0, 1, ...)\n//     before   after\n// ab     a|b     a|b\n// aB     a|B     aB|\n// Ab     |Ab     A|b\n// AB     B|A     B|A\n// Every position after the last character on a line is considered to stick\n// to the last character on the line.\nexport function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n  lineObj = lineObj || getLine(cm.doc, pos.line)\n  if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj)\n  function get(ch, right) {\n    let m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight)\n    if (right) m.left = m.right; else m.right = m.left\n    return intoCoordSystem(cm, lineObj, m, context)\n  }\n  let order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky\n  if (ch >= lineObj.text.length) {\n    ch = lineObj.text.length\n    sticky = \"before\"\n  } else if (ch <= 0) {\n    ch = 0\n    sticky = \"after\"\n  }\n  if (!order) return get(sticky == \"before\" ? ch - 1 : ch, sticky == \"before\")\n\n  function getBidi(ch, partPos, invert) {\n    let part = order[partPos], right = part.level == 1\n    return get(invert ? ch - 1 : ch, right != invert)\n  }\n  let partPos = getBidiPartAt(order, ch, sticky)\n  let other = bidiOther\n  let val = getBidi(ch, partPos, sticky == \"before\")\n  if (other != null) val.other = getBidi(ch, other, sticky != \"before\")\n  return val\n}\n\n// Used to cheaply estimate the coordinates for a position. Used for\n// intermediate scroll updates.\nexport function estimateCoords(cm, pos) {\n  let left = 0\n  pos = clipPos(cm.doc, pos)\n  if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch\n  let lineObj = getLine(cm.doc, pos.line)\n  let top = heightAtLine(lineObj) + paddingTop(cm.display)\n  return {left: left, right: left, top: top, bottom: top + lineObj.height}\n}\n\n// Positions returned by coordsChar contain some extra information.\n// xRel is the relative x position of the input coordinates compared\n// to the found position (so xRel > 0 means the coordinates are to\n// the right of the character position, for example). When outside\n// is true, that means the coordinates lie outside the line's\n// vertical range.\nfunction PosWithInfo(line, ch, sticky, outside, xRel) {\n  let pos = Pos(line, ch, sticky)\n  pos.xRel = xRel\n  if (outside) pos.outside = outside\n  return pos\n}\n\n// Compute the character position closest to the given coordinates.\n// Input must be lineSpace-local (\"div\" coordinate system).\nexport function coordsChar(cm, x, y) {\n  let doc = cm.doc\n  y += cm.display.viewOffset\n  if (y < 0) return PosWithInfo(doc.first, 0, null, -1, -1)\n  let lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1\n  if (lineN > last)\n    return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1)\n  if (x < 0) x = 0\n\n  let lineObj = getLine(doc, lineN)\n  for (;;) {\n    let found = coordsCharInner(cm, lineObj, lineN, x, y)\n    let collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0))\n    if (!collapsed) return found\n    let rangeEnd = collapsed.find(1)\n    if (rangeEnd.line == lineN) return rangeEnd\n    lineObj = getLine(doc, lineN = rangeEnd.line)\n  }\n}\n\nfunction wrappedLineExtent(cm, lineObj, preparedMeasure, y) {\n  y -= widgetTopHeight(lineObj)\n  let end = lineObj.text.length\n  let begin = findFirst(ch => measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y, end, 0)\n  end = findFirst(ch => measureCharPrepared(cm, preparedMeasure, ch).top > y, begin, end)\n  return {begin, end}\n}\n\nexport function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {\n  if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj)\n  let targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), \"line\").top\n  return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)\n}\n\n// Returns true if the given side of a box is after the given\n// coordinates, in top-to-bottom, left-to-right order.\nfunction boxIsAfter(box, x, y, left) {\n  return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x\n}\n\nfunction coordsCharInner(cm, lineObj, lineNo, x, y) {\n  // Move y into line-local coordinate space\n  y -= heightAtLine(lineObj)\n  let preparedMeasure = prepareMeasureForLine(cm, lineObj)\n  // When directly calling `measureCharPrepared`, we have to adjust\n  // for the widgets at this line.\n  let widgetHeight = widgetTopHeight(lineObj)\n  let begin = 0, end = lineObj.text.length, ltr = true\n\n  let order = getOrder(lineObj, cm.doc.direction)\n  // If the line isn't plain left-to-right text, first figure out\n  // which bidi section the coordinates fall into.\n  if (order) {\n    let part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)\n                 (cm, lineObj, lineNo, preparedMeasure, order, x, y)\n    ltr = part.level != 1\n    // The awkward -1 offsets are needed because findFirst (called\n    // on these below) will treat its first bound as inclusive,\n    // second as exclusive, but we want to actually address the\n    // characters in the part's range\n    begin = ltr ? part.from : part.to - 1\n    end = ltr ? part.to : part.from - 1\n  }\n\n  // A binary search to find the first character whose bounding box\n  // starts after the coordinates. If we run across any whose box wrap\n  // the coordinates, store that.\n  let chAround = null, boxAround = null\n  let ch = findFirst(ch => {\n    let box = measureCharPrepared(cm, preparedMeasure, ch)\n    box.top += widgetHeight; box.bottom += widgetHeight\n    if (!boxIsAfter(box, x, y, false)) return false\n    if (box.top <= y && box.left <= x) {\n      chAround = ch\n      boxAround = box\n    }\n    return true\n  }, begin, end)\n\n  let baseX, sticky, outside = false\n  // If a box around the coordinates was found, use that\n  if (boxAround) {\n    // Distinguish coordinates nearer to the left or right side of the box\n    let atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr\n    ch = chAround + (atStart ? 0 : 1)\n    sticky = atStart ? \"after\" : \"before\"\n    baseX = atLeft ? boxAround.left : boxAround.right\n  } else {\n    // (Adjust for extended bound, if necessary.)\n    if (!ltr && (ch == end || ch == begin)) ch++\n    // To determine which side to associate with, get the box to the\n    // left of the character and compare it's vertical position to the\n    // coordinates\n    sticky = ch == 0 ? \"after\" : ch == lineObj.text.length ? \"before\" :\n      (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?\n      \"after\" : \"before\"\n    // Now get accurate coordinates for this place, in order to get a\n    // base X position\n    let coords = cursorCoords(cm, Pos(lineNo, ch, sticky), \"line\", lineObj, preparedMeasure)\n    baseX = coords.left\n    outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0\n  }\n\n  ch = skipExtendingChars(lineObj.text, ch, 1)\n  return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)\n}\n\nfunction coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {\n  // Bidi parts are sorted left-to-right, and in a non-line-wrapping\n  // situation, we can take this ordering to correspond to the visual\n  // ordering. This finds the first part whose end is after the given\n  // coordinates.\n  let index = findFirst(i => {\n    let part = order[i], ltr = part.level != 1\n    return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? \"before\" : \"after\"),\n                                   \"line\", lineObj, preparedMeasure), x, y, true)\n  }, 0, order.length - 1)\n  let part = order[index]\n  // If this isn't the first part, the part's start is also after\n  // the coordinates, and the coordinates aren't on the same line as\n  // that start, move one part back.\n  if (index > 0) {\n    let ltr = part.level != 1\n    let start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? \"after\" : \"before\"),\n                             \"line\", lineObj, preparedMeasure)\n    if (boxIsAfter(start, x, y, true) && start.top > y)\n      part = order[index - 1]\n  }\n  return part\n}\n\nfunction coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {\n  // In a wrapped line, rtl text on wrapping boundaries can do things\n  // that don't correspond to the ordering in our `order` array at\n  // all, so a binary search doesn't work, and we want to return a\n  // part that only spans one line so that the binary search in\n  // coordsCharInner is safe. As such, we first find the extent of the\n  // wrapped line, and then do a flat search in which we discard any\n  // spans that aren't on the line.\n  let {begin, end} = wrappedLineExtent(cm, lineObj, preparedMeasure, y)\n  if (/\\s/.test(lineObj.text.charAt(end - 1))) end--\n  let part = null, closestDist = null\n  for (let i = 0; i < order.length; i++) {\n    let p = order[i]\n    if (p.from >= end || p.to <= begin) continue\n    let ltr = p.level != 1\n    let endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right\n    // Weigh against spans ending before this, so that they are only\n    // picked if nothing ends after\n    let dist = endX < x ? x - endX + 1e9 : endX - x\n    if (!part || closestDist > dist) {\n      part = p\n      closestDist = dist\n    }\n  }\n  if (!part) part = order[order.length - 1]\n  // Clip the part to the wrapped line.\n  if (part.from < begin) part = {from: begin, to: part.to, level: part.level}\n  if (part.to > end) part = {from: part.from, to: end, level: part.level}\n  return part\n}\n\nlet measureText\n// Compute the default text height.\nexport function textHeight(display) {\n  if (display.cachedTextHeight != null) return display.cachedTextHeight\n  if (measureText == null) {\n    measureText = elt(\"pre\", null, \"CodeMirror-line-like\")\n    // Measure a bunch of lines, for browsers that compute\n    // fractional heights.\n    for (let i = 0; i < 49; ++i) {\n      measureText.appendChild(document.createTextNode(\"x\"))\n      measureText.appendChild(elt(\"br\"))\n    }\n    measureText.appendChild(document.createTextNode(\"x\"))\n  }\n  removeChildrenAndAdd(display.measure, measureText)\n  let height = measureText.offsetHeight / 50\n  if (height > 3) display.cachedTextHeight = height\n  removeChildren(display.measure)\n  return height || 1\n}\n\n// Compute the default character width.\nexport function charWidth(display) {\n  if (display.cachedCharWidth != null) return display.cachedCharWidth\n  let anchor = elt(\"span\", \"xxxxxxxxxx\")\n  let pre = elt(\"pre\", [anchor], \"CodeMirror-line-like\")\n  removeChildrenAndAdd(display.measure, pre)\n  let rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10\n  if (width > 2) display.cachedCharWidth = width\n  return width || 10\n}\n\n// Do a bulk-read of the DOM positions and sizes needed to draw the\n// view, so that we don't interleave reading and writing to the DOM.\nexport function getDimensions(cm) {\n  let d = cm.display, left = {}, width = {}\n  let gutterLeft = d.gutters.clientLeft\n  for (let n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n    let id = cm.display.gutterSpecs[i].className\n    left[id] = n.offsetLeft + n.clientLeft + gutterLeft\n    width[id] = n.clientWidth\n  }\n  return {fixedPos: compensateForHScroll(d),\n          gutterTotalWidth: d.gutters.offsetWidth,\n          gutterLeft: left,\n          gutterWidth: width,\n          wrapperWidth: d.wrapper.clientWidth}\n}\n\n// Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n// but using getBoundingClientRect to get a sub-pixel-accurate\n// result.\nexport function compensateForHScroll(display) {\n  return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left\n}\n\n// Returns a function that estimates the height of a line, to use as\n// first approximation until the line becomes visible (and is thus\n// properly measurable).\nexport function estimateHeight(cm) {\n  let th = textHeight(cm.display), wrapping = cm.options.lineWrapping\n  let perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3)\n  return line => {\n    if (lineIsHidden(cm.doc, line)) return 0\n\n    let widgetsHeight = 0\n    if (line.widgets) for (let i = 0; i < line.widgets.length; i++) {\n      if (line.widgets[i].height) widgetsHeight += line.widgets[i].height\n    }\n\n    if (wrapping)\n      return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th\n    else\n      return widgetsHeight + th\n  }\n}\n\nexport function estimateLineHeights(cm) {\n  let doc = cm.doc, est = estimateHeight(cm)\n  doc.iter(line => {\n    let estHeight = est(line)\n    if (estHeight != line.height) updateLineHeight(line, estHeight)\n  })\n}\n\n// Given a mouse event, find the corresponding position. If liberal\n// is false, it checks whether a gutter or scrollbar was clicked,\n// and returns null if it was. forRect is used by rectangular\n// selections, and tries to estimate a character position even for\n// coordinates beyond the right of the text.\nexport function posFromMouse(cm, e, liberal, forRect) {\n  let display = cm.display\n  if (!liberal && e_target(e).getAttribute(\"cm-not-content\") == \"true\") return null\n\n  let x, y, space = display.lineSpace.getBoundingClientRect()\n  // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n  try { x = e.clientX - space.left; y = e.clientY - space.top }\n  catch (e) { return null }\n  let coords = coordsChar(cm, x, y), line\n  if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n    let colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length\n    coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff))\n  }\n  return coords\n}\n\n// Find the view element corresponding to a given line. Return null\n// when the line isn't visible.\nexport function findViewIndex(cm, n) {\n  if (n >= cm.display.viewTo) return null\n  n -= cm.display.viewFrom\n  if (n < 0) return null\n  let view = cm.display.view\n  for (let i = 0; i < view.length; i++) {\n    n -= view[i].size\n    if (n < 0) return i\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/measurement/widgets.js",
    "content": "import { contains, elt, removeChildrenAndAdd } from \"../util/dom.js\"\nimport { e_target } from \"../util/event.js\"\n\nexport function widgetHeight(widget) {\n  if (widget.height != null) return widget.height\n  let cm = widget.doc.cm\n  if (!cm) return 0\n  if (!contains(document.body, widget.node)) {\n    let parentStyle = \"position: relative;\"\n    if (widget.coverGutter)\n      parentStyle += \"margin-left: -\" + cm.display.gutters.offsetWidth + \"px;\"\n    if (widget.noHScroll)\n      parentStyle += \"width: \" + cm.display.wrapper.clientWidth + \"px;\"\n    removeChildrenAndAdd(cm.display.measure, elt(\"div\", [widget.node], null, parentStyle))\n  }\n  return widget.height = widget.node.parentNode.offsetHeight\n}\n\n// Return true when the given mouse event happened in a widget\nexport function eventInWidget(display, e) {\n  for (let n = e_target(e); n != display.wrapper; n = n.parentNode) {\n    if (!n || (n.nodeType == 1 && n.getAttribute(\"cm-ignore-events\") == \"true\") ||\n        (n.parentNode == display.sizer && n != display.mover))\n      return true\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/model/Doc.js",
    "content": "import CodeMirror from \"../edit/CodeMirror.js\"\nimport { docMethodOp } from \"../display/operations.js\"\nimport { Line } from \"../line/line_data.js\"\nimport { clipPos, clipPosArray, Pos } from \"../line/pos.js\"\nimport { visualLine } from \"../line/spans.js\"\nimport { getBetween, getLine, getLines, isLine, lineNo } from \"../line/utils_line.js\"\nimport { classTest } from \"../util/dom.js\"\nimport { splitLinesAuto } from \"../util/feature_detection.js\"\nimport { createObj, map, isEmpty, sel_dontScroll } from \"../util/misc.js\"\nimport { ensureCursorVisible, scrollToCoords } from \"../display/scrolling.js\"\n\nimport { changeLine, makeChange, makeChangeFromHistory, replaceRange } from \"./changes.js\"\nimport { computeReplacedSel } from \"./change_measurement.js\"\nimport { BranchChunk, LeafChunk } from \"./chunk.js\"\nimport { directionChanged, linkedDocs, updateDoc } from \"./document_data.js\"\nimport { copyHistoryArray, History } from \"./history.js\"\nimport { addLineWidget } from \"./line_widget.js\"\nimport { copySharedMarkers, detachSharedMarkers, findSharedMarkers, markText } from \"./mark_text.js\"\nimport { normalizeSelection, Range, simpleSelection } from \"./selection.js\"\nimport { extendSelection, extendSelections, setSelection, setSelectionReplaceHistory, setSimpleSelection } from \"./selection_updates.js\"\n\nlet nextDocId = 0\nlet Doc = function(text, mode, firstLine, lineSep, direction) {\n  if (!(this instanceof Doc)) return new Doc(text, mode, firstLine, lineSep, direction)\n  if (firstLine == null) firstLine = 0\n\n  BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])])\n  this.first = firstLine\n  this.scrollTop = this.scrollLeft = 0\n  this.cantEdit = false\n  this.cleanGeneration = 1\n  this.modeFrontier = this.highlightFrontier = firstLine\n  let start = Pos(firstLine, 0)\n  this.sel = simpleSelection(start)\n  this.history = new History(null)\n  this.id = ++nextDocId\n  this.modeOption = mode\n  this.lineSep = lineSep\n  this.direction = (direction == \"rtl\") ? \"rtl\" : \"ltr\"\n  this.extend = false\n\n  if (typeof text == \"string\") text = this.splitLines(text)\n  updateDoc(this, {from: start, to: start, text: text})\n  setSelection(this, simpleSelection(start), sel_dontScroll)\n}\n\nDoc.prototype = createObj(BranchChunk.prototype, {\n  constructor: Doc,\n  // Iterate over the document. Supports two forms -- with only one\n  // argument, it calls that for each line in the document. With\n  // three, it iterates over the range given by the first two (with\n  // the second being non-inclusive).\n  iter: function(from, to, op) {\n    if (op) this.iterN(from - this.first, to - from, op)\n    else this.iterN(this.first, this.first + this.size, from)\n  },\n\n  // Non-public interface for adding and removing lines.\n  insert: function(at, lines) {\n    let height = 0\n    for (let i = 0; i < lines.length; ++i) height += lines[i].height\n    this.insertInner(at - this.first, lines, height)\n  },\n  remove: function(at, n) { this.removeInner(at - this.first, n) },\n\n  // From here, the methods are part of the public interface. Most\n  // are also available from CodeMirror (editor) instances.\n\n  getValue: function(lineSep) {\n    let lines = getLines(this, this.first, this.first + this.size)\n    if (lineSep === false) return lines\n    return lines.join(lineSep || this.lineSeparator())\n  },\n  setValue: docMethodOp(function(code) {\n    let top = Pos(this.first, 0), last = this.first + this.size - 1\n    makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n                      text: this.splitLines(code), origin: \"setValue\", full: true}, true)\n    if (this.cm) scrollToCoords(this.cm, 0, 0)\n    setSelection(this, simpleSelection(top), sel_dontScroll)\n  }),\n  replaceRange: function(code, from, to, origin) {\n    from = clipPos(this, from)\n    to = to ? clipPos(this, to) : from\n    replaceRange(this, code, from, to, origin)\n  },\n  getRange: function(from, to, lineSep) {\n    let lines = getBetween(this, clipPos(this, from), clipPos(this, to))\n    if (lineSep === false) return lines\n    if (lineSep === '') return lines.join('')\n    return lines.join(lineSep || this.lineSeparator())\n  },\n\n  getLine: function(line) {let l = this.getLineHandle(line); return l && l.text},\n\n  getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line)},\n  getLineNumber: function(line) {return lineNo(line)},\n\n  getLineHandleVisualStart: function(line) {\n    if (typeof line == \"number\") line = getLine(this, line)\n    return visualLine(line)\n  },\n\n  lineCount: function() {return this.size},\n  firstLine: function() {return this.first},\n  lastLine: function() {return this.first + this.size - 1},\n\n  clipPos: function(pos) {return clipPos(this, pos)},\n\n  getCursor: function(start) {\n    let range = this.sel.primary(), pos\n    if (start == null || start == \"head\") pos = range.head\n    else if (start == \"anchor\") pos = range.anchor\n    else if (start == \"end\" || start == \"to\" || start === false) pos = range.to()\n    else pos = range.from()\n    return pos\n  },\n  listSelections: function() { return this.sel.ranges },\n  somethingSelected: function() {return this.sel.somethingSelected()},\n\n  setCursor: docMethodOp(function(line, ch, options) {\n    setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options)\n  }),\n  setSelection: docMethodOp(function(anchor, head, options) {\n    setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options)\n  }),\n  extendSelection: docMethodOp(function(head, other, options) {\n    extendSelection(this, clipPos(this, head), other && clipPos(this, other), options)\n  }),\n  extendSelections: docMethodOp(function(heads, options) {\n    extendSelections(this, clipPosArray(this, heads), options)\n  }),\n  extendSelectionsBy: docMethodOp(function(f, options) {\n    let heads = map(this.sel.ranges, f)\n    extendSelections(this, clipPosArray(this, heads), options)\n  }),\n  setSelections: docMethodOp(function(ranges, primary, options) {\n    if (!ranges.length) return\n    let out = []\n    for (let i = 0; i < ranges.length; i++)\n      out[i] = new Range(clipPos(this, ranges[i].anchor),\n                         clipPos(this, ranges[i].head || ranges[i].anchor))\n    if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex)\n    setSelection(this, normalizeSelection(this.cm, out, primary), options)\n  }),\n  addSelection: docMethodOp(function(anchor, head, options) {\n    let ranges = this.sel.ranges.slice(0)\n    ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)))\n    setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options)\n  }),\n\n  getSelection: function(lineSep) {\n    let ranges = this.sel.ranges, lines\n    for (let i = 0; i < ranges.length; i++) {\n      let sel = getBetween(this, ranges[i].from(), ranges[i].to())\n      lines = lines ? lines.concat(sel) : sel\n    }\n    if (lineSep === false) return lines\n    else return lines.join(lineSep || this.lineSeparator())\n  },\n  getSelections: function(lineSep) {\n    let parts = [], ranges = this.sel.ranges\n    for (let i = 0; i < ranges.length; i++) {\n      let sel = getBetween(this, ranges[i].from(), ranges[i].to())\n      if (lineSep !== false) sel = sel.join(lineSep || this.lineSeparator())\n      parts[i] = sel\n    }\n    return parts\n  },\n  replaceSelection: function(code, collapse, origin) {\n    let dup = []\n    for (let i = 0; i < this.sel.ranges.length; i++)\n      dup[i] = code\n    this.replaceSelections(dup, collapse, origin || \"+input\")\n  },\n  replaceSelections: docMethodOp(function(code, collapse, origin) {\n    let changes = [], sel = this.sel\n    for (let i = 0; i < sel.ranges.length; i++) {\n      let range = sel.ranges[i]\n      changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin}\n    }\n    let newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse)\n    for (let i = changes.length - 1; i >= 0; i--)\n      makeChange(this, changes[i])\n    if (newSel) setSelectionReplaceHistory(this, newSel)\n    else if (this.cm) ensureCursorVisible(this.cm)\n  }),\n  undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\")}),\n  redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\")}),\n  undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true)}),\n  redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true)}),\n\n  setExtending: function(val) {this.extend = val},\n  getExtending: function() {return this.extend},\n\n  historySize: function() {\n    let hist = this.history, done = 0, undone = 0\n    for (let i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done\n    for (let i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone\n    return {undo: done, redo: undone}\n  },\n  clearHistory: function() {\n    this.history = new History(this.history)\n    linkedDocs(this, doc => doc.history = this.history, true)\n  },\n\n  markClean: function() {\n    this.cleanGeneration = this.changeGeneration(true)\n  },\n  changeGeneration: function(forceSplit) {\n    if (forceSplit)\n      this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null\n    return this.history.generation\n  },\n  isClean: function (gen) {\n    return this.history.generation == (gen || this.cleanGeneration)\n  },\n\n  getHistory: function() {\n    return {done: copyHistoryArray(this.history.done),\n            undone: copyHistoryArray(this.history.undone)}\n  },\n  setHistory: function(histData) {\n    let hist = this.history = new History(this.history)\n    hist.done = copyHistoryArray(histData.done.slice(0), null, true)\n    hist.undone = copyHistoryArray(histData.undone.slice(0), null, true)\n  },\n\n  setGutterMarker: docMethodOp(function(line, gutterID, value) {\n    return changeLine(this, line, \"gutter\", line => {\n      let markers = line.gutterMarkers || (line.gutterMarkers = {})\n      markers[gutterID] = value\n      if (!value && isEmpty(markers)) line.gutterMarkers = null\n      return true\n    })\n  }),\n\n  clearGutter: docMethodOp(function(gutterID) {\n    this.iter(line => {\n      if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n        changeLine(this, line, \"gutter\", () => {\n          line.gutterMarkers[gutterID] = null\n          if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null\n          return true\n        })\n      }\n    })\n  }),\n\n  lineInfo: function(line) {\n    let n\n    if (typeof line == \"number\") {\n      if (!isLine(this, line)) return null\n      n = line\n      line = getLine(this, line)\n      if (!line) return null\n    } else {\n      n = lineNo(line)\n      if (n == null) return null\n    }\n    return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n            textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n            widgets: line.widgets}\n  },\n\n  addLineClass: docMethodOp(function(handle, where, cls) {\n    return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", line => {\n      let prop = where == \"text\" ? \"textClass\"\n               : where == \"background\" ? \"bgClass\"\n               : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\"\n      if (!line[prop]) line[prop] = cls\n      else if (classTest(cls).test(line[prop])) return false\n      else line[prop] += \" \" + cls\n      return true\n    })\n  }),\n  removeLineClass: docMethodOp(function(handle, where, cls) {\n    return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", line => {\n      let prop = where == \"text\" ? \"textClass\"\n               : where == \"background\" ? \"bgClass\"\n               : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\"\n      let cur = line[prop]\n      if (!cur) return false\n      else if (cls == null) line[prop] = null\n      else {\n        let found = cur.match(classTest(cls))\n        if (!found) return false\n        let end = found.index + found[0].length\n        line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null\n      }\n      return true\n    })\n  }),\n\n  addLineWidget: docMethodOp(function(handle, node, options) {\n    return addLineWidget(this, handle, node, options)\n  }),\n  removeLineWidget: function(widget) { widget.clear() },\n\n  markText: function(from, to, options) {\n    return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\")\n  },\n  setBookmark: function(pos, options) {\n    let realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n                    insertLeft: options && options.insertLeft,\n                    clearWhenEmpty: false, shared: options && options.shared,\n                    handleMouseEvents: options && options.handleMouseEvents}\n    pos = clipPos(this, pos)\n    return markText(this, pos, pos, realOpts, \"bookmark\")\n  },\n  findMarksAt: function(pos) {\n    pos = clipPos(this, pos)\n    let markers = [], spans = getLine(this, pos.line).markedSpans\n    if (spans) for (let i = 0; i < spans.length; ++i) {\n      let span = spans[i]\n      if ((span.from == null || span.from <= pos.ch) &&\n          (span.to == null || span.to >= pos.ch))\n        markers.push(span.marker.parent || span.marker)\n    }\n    return markers\n  },\n  findMarks: function(from, to, filter) {\n    from = clipPos(this, from); to = clipPos(this, to)\n    let found = [], lineNo = from.line\n    this.iter(from.line, to.line + 1, line => {\n      let spans = line.markedSpans\n      if (spans) for (let i = 0; i < spans.length; i++) {\n        let span = spans[i]\n        if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||\n              span.from == null && lineNo != from.line ||\n              span.from != null && lineNo == to.line && span.from >= to.ch) &&\n            (!filter || filter(span.marker)))\n          found.push(span.marker.parent || span.marker)\n      }\n      ++lineNo\n    })\n    return found\n  },\n  getAllMarks: function() {\n    let markers = []\n    this.iter(line => {\n      let sps = line.markedSpans\n      if (sps) for (let i = 0; i < sps.length; ++i)\n        if (sps[i].from != null) markers.push(sps[i].marker)\n    })\n    return markers\n  },\n\n  posFromIndex: function(off) {\n    let ch, lineNo = this.first, sepSize = this.lineSeparator().length\n    this.iter(line => {\n      let sz = line.text.length + sepSize\n      if (sz > off) { ch = off; return true }\n      off -= sz\n      ++lineNo\n    })\n    return clipPos(this, Pos(lineNo, ch))\n  },\n  indexFromPos: function (coords) {\n    coords = clipPos(this, coords)\n    let index = coords.ch\n    if (coords.line < this.first || coords.ch < 0) return 0\n    let sepSize = this.lineSeparator().length\n    this.iter(this.first, coords.line, line => { // iter aborts when callback returns a truthy value\n      index += line.text.length + sepSize\n    })\n    return index\n  },\n\n  copy: function(copyHistory) {\n    let doc = new Doc(getLines(this, this.first, this.first + this.size),\n                      this.modeOption, this.first, this.lineSep, this.direction)\n    doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft\n    doc.sel = this.sel\n    doc.extend = false\n    if (copyHistory) {\n      doc.history.undoDepth = this.history.undoDepth\n      doc.setHistory(this.getHistory())\n    }\n    return doc\n  },\n\n  linkedDoc: function(options) {\n    if (!options) options = {}\n    let from = this.first, to = this.first + this.size\n    if (options.from != null && options.from > from) from = options.from\n    if (options.to != null && options.to < to) to = options.to\n    let copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction)\n    if (options.sharedHist) copy.history = this.history\n    ;(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist})\n    copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]\n    copySharedMarkers(copy, findSharedMarkers(this))\n    return copy\n  },\n  unlinkDoc: function(other) {\n    if (other instanceof CodeMirror) other = other.doc\n    if (this.linked) for (let i = 0; i < this.linked.length; ++i) {\n      let link = this.linked[i]\n      if (link.doc != other) continue\n      this.linked.splice(i, 1)\n      other.unlinkDoc(this)\n      detachSharedMarkers(findSharedMarkers(this))\n      break\n    }\n    // If the histories were shared, split them again\n    if (other.history == this.history) {\n      let splitIds = [other.id]\n      linkedDocs(other, doc => splitIds.push(doc.id), true)\n      other.history = new History(null)\n      other.history.done = copyHistoryArray(this.history.done, splitIds)\n      other.history.undone = copyHistoryArray(this.history.undone, splitIds)\n    }\n  },\n  iterLinkedDocs: function(f) {linkedDocs(this, f)},\n\n  getMode: function() {return this.mode},\n  getEditor: function() {return this.cm},\n\n  splitLines: function(str) {\n    if (this.lineSep) return str.split(this.lineSep)\n    return splitLinesAuto(str)\n  },\n  lineSeparator: function() { return this.lineSep || \"\\n\" },\n\n  setDirection: docMethodOp(function (dir) {\n    if (dir != \"rtl\") dir = \"ltr\"\n    if (dir == this.direction) return\n    this.direction = dir\n    this.iter(line => line.order = null)\n    if (this.cm) directionChanged(this.cm)\n  })\n})\n\n// Public alias.\nDoc.prototype.eachLine = Doc.prototype.iter\n\nexport default Doc\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/model/change_measurement.js",
    "content": "import { cmp, Pos } from \"../line/pos.js\"\nimport { lst } from \"../util/misc.js\"\n\nimport { normalizeSelection, Range, Selection } from \"./selection.js\"\n\n// Compute the position of the end of a change (its 'to' property\n// refers to the pre-change end).\nexport function changeEnd(change) {\n  if (!change.text) return change.to\n  return Pos(change.from.line + change.text.length - 1,\n             lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))\n}\n\n// Adjust a position to refer to the post-change position of the\n// same text, or the end of the change if the change covers it.\nfunction adjustForChange(pos, change) {\n  if (cmp(pos, change.from) < 0) return pos\n  if (cmp(pos, change.to) <= 0) return changeEnd(change)\n\n  let line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch\n  if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch\n  return Pos(line, ch)\n}\n\nexport function computeSelAfterChange(doc, change) {\n  let out = []\n  for (let i = 0; i < doc.sel.ranges.length; i++) {\n    let range = doc.sel.ranges[i]\n    out.push(new Range(adjustForChange(range.anchor, change),\n                       adjustForChange(range.head, change)))\n  }\n  return normalizeSelection(doc.cm, out, doc.sel.primIndex)\n}\n\nfunction offsetPos(pos, old, nw) {\n  if (pos.line == old.line)\n    return Pos(nw.line, pos.ch - old.ch + nw.ch)\n  else\n    return Pos(nw.line + (pos.line - old.line), pos.ch)\n}\n\n// Used by replaceSelections to allow moving the selection to the\n// start or around the replaced test. Hint may be \"start\" or \"around\".\nexport function computeReplacedSel(doc, changes, hint) {\n  let out = []\n  let oldPrev = Pos(doc.first, 0), newPrev = oldPrev\n  for (let i = 0; i < changes.length; i++) {\n    let change = changes[i]\n    let from = offsetPos(change.from, oldPrev, newPrev)\n    let to = offsetPos(changeEnd(change), oldPrev, newPrev)\n    oldPrev = change.to\n    newPrev = to\n    if (hint == \"around\") {\n      let range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0\n      out[i] = new Range(inv ? to : from, inv ? from : to)\n    } else {\n      out[i] = new Range(from, from)\n    }\n  }\n  return new Selection(out, doc.sel.primIndex)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/model/changes.js",
    "content": "import { retreatFrontier } from \"../line/highlight.js\"\nimport { startWorker } from \"../display/highlight_worker.js\"\nimport { operation } from \"../display/operations.js\"\nimport { regChange, regLineChange } from \"../display/view_tracking.js\"\nimport { clipLine, clipPos, cmp, Pos } from \"../line/pos.js\"\nimport { sawReadOnlySpans } from \"../line/saw_special_spans.js\"\nimport { lineLength, removeReadOnlyRanges, stretchSpansOverChange, visualLine } from \"../line/spans.js\"\nimport { getBetween, getLine, lineNo } from \"../line/utils_line.js\"\nimport { estimateHeight } from \"../measurement/position_measurement.js\"\nimport { hasHandler, signal, signalCursorActivity } from \"../util/event.js\"\nimport { indexOf, lst, map, sel_dontScroll } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\n\nimport { changeEnd, computeSelAfterChange } from \"./change_measurement.js\"\nimport { isWholeLineUpdate, linkedDocs, updateDoc } from \"./document_data.js\"\nimport { addChangeToHistory, historyChangeFromChange, mergeOldSpans, pushSelectionToHistory } from \"./history.js\"\nimport { Range, Selection } from \"./selection.js\"\nimport { setSelection, setSelectionNoUndo, skipAtomic } from \"./selection_updates.js\"\n\n// UPDATING\n\n// Allow \"beforeChange\" event handlers to influence a change\nfunction filterChange(doc, change, update) {\n  let obj = {\n    canceled: false,\n    from: change.from,\n    to: change.to,\n    text: change.text,\n    origin: change.origin,\n    cancel: () => obj.canceled = true\n  }\n  if (update) obj.update = (from, to, text, origin) => {\n    if (from) obj.from = clipPos(doc, from)\n    if (to) obj.to = clipPos(doc, to)\n    if (text) obj.text = text\n    if (origin !== undefined) obj.origin = origin\n  }\n  signal(doc, \"beforeChange\", doc, obj)\n  if (doc.cm) signal(doc.cm, \"beforeChange\", doc.cm, obj)\n\n  if (obj.canceled) {\n    if (doc.cm) doc.cm.curOp.updateInput = 2\n    return null\n  }\n  return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}\n}\n\n// Apply a change to a document, and add it to the document's\n// history, and propagating it to all linked documents.\nexport function makeChange(doc, change, ignoreReadOnly) {\n  if (doc.cm) {\n    if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly)\n    if (doc.cm.state.suppressEdits) return\n  }\n\n  if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n    change = filterChange(doc, change, true)\n    if (!change) return\n  }\n\n  // Possibly split or suppress the update based on the presence\n  // of read-only spans in its range.\n  let split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to)\n  if (split) {\n    for (let i = split.length - 1; i >= 0; --i)\n      makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text, origin: change.origin})\n  } else {\n    makeChangeInner(doc, change)\n  }\n}\n\nfunction makeChangeInner(doc, change) {\n  if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) return\n  let selAfter = computeSelAfterChange(doc, change)\n  addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN)\n\n  makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change))\n  let rebased = []\n\n  linkedDocs(doc, (doc, sharedHist) => {\n    if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n      rebaseHist(doc.history, change)\n      rebased.push(doc.history)\n    }\n    makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change))\n  })\n}\n\n// Revert a change stored in a document's history.\nexport function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n  let suppress = doc.cm && doc.cm.state.suppressEdits\n  if (suppress && !allowSelectionOnly) return\n\n  let hist = doc.history, event, selAfter = doc.sel\n  let source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done\n\n  // Verify that there is a useable event (so that ctrl-z won't\n  // needlessly clear selection events)\n  let i = 0\n  for (; i < source.length; i++) {\n    event = source[i]\n    if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n      break\n  }\n  if (i == source.length) return\n  hist.lastOrigin = hist.lastSelOrigin = null\n\n  for (;;) {\n    event = source.pop()\n    if (event.ranges) {\n      pushSelectionToHistory(event, dest)\n      if (allowSelectionOnly && !event.equals(doc.sel)) {\n        setSelection(doc, event, {clearRedo: false})\n        return\n      }\n      selAfter = event\n    } else if (suppress) {\n      source.push(event)\n      return\n    } else break\n  }\n\n  // Build up a reverse change object to add to the opposite history\n  // stack (redo when undoing, and vice versa).\n  let antiChanges = []\n  pushSelectionToHistory(selAfter, dest)\n  dest.push({changes: antiChanges, generation: hist.generation})\n  hist.generation = event.generation || ++hist.maxGeneration\n\n  let filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")\n\n  for (let i = event.changes.length - 1; i >= 0; --i) {\n    let change = event.changes[i]\n    change.origin = type\n    if (filter && !filterChange(doc, change, false)) {\n      source.length = 0\n      return\n    }\n\n    antiChanges.push(historyChangeFromChange(doc, change))\n\n    let after = i ? computeSelAfterChange(doc, change) : lst(source)\n    makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change))\n    if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)})\n    let rebased = []\n\n    // Propagate to the linked documents\n    linkedDocs(doc, (doc, sharedHist) => {\n      if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n        rebaseHist(doc.history, change)\n        rebased.push(doc.history)\n      }\n      makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change))\n    })\n  }\n}\n\n// Sub-views need their line numbers shifted when text is added\n// above or below them in the parent document.\nfunction shiftDoc(doc, distance) {\n  if (distance == 0) return\n  doc.first += distance\n  doc.sel = new Selection(map(doc.sel.ranges, range => new Range(\n    Pos(range.anchor.line + distance, range.anchor.ch),\n    Pos(range.head.line + distance, range.head.ch)\n  )), doc.sel.primIndex)\n  if (doc.cm) {\n    regChange(doc.cm, doc.first, doc.first - distance, distance)\n    for (let d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n      regLineChange(doc.cm, l, \"gutter\")\n  }\n}\n\n// More lower-level change function, handling only a single document\n// (not linked ones).\nfunction makeChangeSingleDoc(doc, change, selAfter, spans) {\n  if (doc.cm && !doc.cm.curOp)\n    return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans)\n\n  if (change.to.line < doc.first) {\n    shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line))\n    return\n  }\n  if (change.from.line > doc.lastLine()) return\n\n  // Clip the change to the size of this doc\n  if (change.from.line < doc.first) {\n    let shift = change.text.length - 1 - (doc.first - change.from.line)\n    shiftDoc(doc, shift)\n    change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n              text: [lst(change.text)], origin: change.origin}\n  }\n  let last = doc.lastLine()\n  if (change.to.line > last) {\n    change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n              text: [change.text[0]], origin: change.origin}\n  }\n\n  change.removed = getBetween(doc, change.from, change.to)\n\n  if (!selAfter) selAfter = computeSelAfterChange(doc, change)\n  if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans)\n  else updateDoc(doc, change, spans)\n  setSelectionNoUndo(doc, selAfter, sel_dontScroll)\n\n  if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))\n    doc.cantEdit = false\n}\n\n// Handle the interaction of a change to a document with the editor\n// that this document is part of.\nfunction makeChangeSingleDocInEditor(cm, change, spans) {\n  let doc = cm.doc, display = cm.display, from = change.from, to = change.to\n\n  let recomputeMaxLength = false, checkWidthStart = from.line\n  if (!cm.options.lineWrapping) {\n    checkWidthStart = lineNo(visualLine(getLine(doc, from.line)))\n    doc.iter(checkWidthStart, to.line + 1, line => {\n      if (line == display.maxLine) {\n        recomputeMaxLength = true\n        return true\n      }\n    })\n  }\n\n  if (doc.sel.contains(change.from, change.to) > -1)\n    signalCursorActivity(cm)\n\n  updateDoc(doc, change, spans, estimateHeight(cm))\n\n  if (!cm.options.lineWrapping) {\n    doc.iter(checkWidthStart, from.line + change.text.length, line => {\n      let len = lineLength(line)\n      if (len > display.maxLineLength) {\n        display.maxLine = line\n        display.maxLineLength = len\n        display.maxLineChanged = true\n        recomputeMaxLength = false\n      }\n    })\n    if (recomputeMaxLength) cm.curOp.updateMaxLine = true\n  }\n\n  retreatFrontier(doc, from.line)\n  startWorker(cm, 400)\n\n  let lendiff = change.text.length - (to.line - from.line) - 1\n  // Remember that these lines changed, for updating the display\n  if (change.full)\n    regChange(cm)\n  else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n    regLineChange(cm, from.line, \"text\")\n  else\n    regChange(cm, from.line, to.line + 1, lendiff)\n\n  let changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\")\n  if (changeHandler || changesHandler) {\n    let obj = {\n      from: from, to: to,\n      text: change.text,\n      removed: change.removed,\n      origin: change.origin\n    }\n    if (changeHandler) signalLater(cm, \"change\", cm, obj)\n    if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj)\n  }\n  cm.display.selForContextMenu = null\n}\n\nexport function replaceRange(doc, code, from, to, origin) {\n  if (!to) to = from\n  if (cmp(to, from) < 0) [from, to] = [to, from]\n  if (typeof code == \"string\") code = doc.splitLines(code)\n  makeChange(doc, {from, to, text: code, origin})\n}\n\n// Rebasing/resetting history to deal with externally-sourced changes\n\nfunction rebaseHistSelSingle(pos, from, to, diff) {\n  if (to < pos.line) {\n    pos.line += diff\n  } else if (from < pos.line) {\n    pos.line = from\n    pos.ch = 0\n  }\n}\n\n// Tries to rebase an array of history events given a change in the\n// document. If the change touches the same lines as the event, the\n// event, and everything 'behind' it, is discarded. If the change is\n// before the event, the event's positions are updated. Uses a\n// copy-on-write scheme for the positions, to avoid having to\n// reallocate them all on every rebase, but also avoid problems with\n// shared position objects being unsafely updated.\nfunction rebaseHistArray(array, from, to, diff) {\n  for (let i = 0; i < array.length; ++i) {\n    let sub = array[i], ok = true\n    if (sub.ranges) {\n      if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true }\n      for (let j = 0; j < sub.ranges.length; j++) {\n        rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff)\n        rebaseHistSelSingle(sub.ranges[j].head, from, to, diff)\n      }\n      continue\n    }\n    for (let j = 0; j < sub.changes.length; ++j) {\n      let cur = sub.changes[j]\n      if (to < cur.from.line) {\n        cur.from = Pos(cur.from.line + diff, cur.from.ch)\n        cur.to = Pos(cur.to.line + diff, cur.to.ch)\n      } else if (from <= cur.to.line) {\n        ok = false\n        break\n      }\n    }\n    if (!ok) {\n      array.splice(0, i + 1)\n      i = 0\n    }\n  }\n}\n\nfunction rebaseHist(hist, change) {\n  let from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1\n  rebaseHistArray(hist.done, from, to, diff)\n  rebaseHistArray(hist.undone, from, to, diff)\n}\n\n// Utility for applying a change to a line by handle or number,\n// returning the number and optionally registering the line as\n// changed.\nexport function changeLine(doc, handle, changeType, op) {\n  let no = handle, line = handle\n  if (typeof handle == \"number\") line = getLine(doc, clipLine(doc, handle))\n  else no = lineNo(handle)\n  if (no == null) return null\n  if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType)\n  return line\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/model/chunk.js",
    "content": "import { cleanUpLine } from \"../line/line_data.js\"\nimport { indexOf } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\n\n// The document is represented as a BTree consisting of leaves, with\n// chunk of lines in them, and branches, with up to ten leaves or\n// other branch nodes below them. The top node is always a branch\n// node, and is the document object itself (meaning it has\n// additional methods and properties).\n//\n// All nodes have parent links. The tree is used both to go from\n// line numbers to line objects, and to go from objects to numbers.\n// It also indexes by height, and is used to convert between height\n// and line object, and to find the total height of the document.\n//\n// See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\nexport function LeafChunk(lines) {\n  this.lines = lines\n  this.parent = null\n  let height = 0\n  for (let i = 0; i < lines.length; ++i) {\n    lines[i].parent = this\n    height += lines[i].height\n  }\n  this.height = height\n}\n\nLeafChunk.prototype = {\n  chunkSize() { return this.lines.length },\n\n  // Remove the n lines at offset 'at'.\n  removeInner(at, n) {\n    for (let i = at, e = at + n; i < e; ++i) {\n      let line = this.lines[i]\n      this.height -= line.height\n      cleanUpLine(line)\n      signalLater(line, \"delete\")\n    }\n    this.lines.splice(at, n)\n  },\n\n  // Helper used to collapse a small branch into a single leaf.\n  collapse(lines) {\n    lines.push.apply(lines, this.lines)\n  },\n\n  // Insert the given array of lines at offset 'at', count them as\n  // having the given height.\n  insertInner(at, lines, height) {\n    this.height += height\n    this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at))\n    for (let i = 0; i < lines.length; ++i) lines[i].parent = this\n  },\n\n  // Used to iterate over a part of the tree.\n  iterN(at, n, op) {\n    for (let e = at + n; at < e; ++at)\n      if (op(this.lines[at])) return true\n  }\n}\n\nexport function BranchChunk(children) {\n  this.children = children\n  let size = 0, height = 0\n  for (let i = 0; i < children.length; ++i) {\n    let ch = children[i]\n    size += ch.chunkSize(); height += ch.height\n    ch.parent = this\n  }\n  this.size = size\n  this.height = height\n  this.parent = null\n}\n\nBranchChunk.prototype = {\n  chunkSize() { return this.size },\n\n  removeInner(at, n) {\n    this.size -= n\n    for (let i = 0; i < this.children.length; ++i) {\n      let child = this.children[i], sz = child.chunkSize()\n      if (at < sz) {\n        let rm = Math.min(n, sz - at), oldHeight = child.height\n        child.removeInner(at, rm)\n        this.height -= oldHeight - child.height\n        if (sz == rm) { this.children.splice(i--, 1); child.parent = null }\n        if ((n -= rm) == 0) break\n        at = 0\n      } else at -= sz\n    }\n    // If the result is smaller than 25 lines, ensure that it is a\n    // single leaf node.\n    if (this.size - n < 25 &&\n        (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n      let lines = []\n      this.collapse(lines)\n      this.children = [new LeafChunk(lines)]\n      this.children[0].parent = this\n    }\n  },\n\n  collapse(lines) {\n    for (let i = 0; i < this.children.length; ++i) this.children[i].collapse(lines)\n  },\n\n  insertInner(at, lines, height) {\n    this.size += lines.length\n    this.height += height\n    for (let i = 0; i < this.children.length; ++i) {\n      let child = this.children[i], sz = child.chunkSize()\n      if (at <= sz) {\n        child.insertInner(at, lines, height)\n        if (child.lines && child.lines.length > 50) {\n          // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.\n          // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.\n          let remaining = child.lines.length % 25 + 25\n          for (let pos = remaining; pos < child.lines.length;) {\n            let leaf = new LeafChunk(child.lines.slice(pos, pos += 25))\n            child.height -= leaf.height\n            this.children.splice(++i, 0, leaf)\n            leaf.parent = this\n          }\n          child.lines = child.lines.slice(0, remaining)\n          this.maybeSpill()\n        }\n        break\n      }\n      at -= sz\n    }\n  },\n\n  // When a node has grown, check whether it should be split.\n  maybeSpill() {\n    if (this.children.length <= 10) return\n    let me = this\n    do {\n      let spilled = me.children.splice(me.children.length - 5, 5)\n      let sibling = new BranchChunk(spilled)\n      if (!me.parent) { // Become the parent node\n        let copy = new BranchChunk(me.children)\n        copy.parent = me\n        me.children = [copy, sibling]\n        me = copy\n     } else {\n        me.size -= sibling.size\n        me.height -= sibling.height\n        let myIndex = indexOf(me.parent.children, me)\n        me.parent.children.splice(myIndex + 1, 0, sibling)\n      }\n      sibling.parent = me.parent\n    } while (me.children.length > 10)\n    me.parent.maybeSpill()\n  },\n\n  iterN(at, n, op) {\n    for (let i = 0; i < this.children.length; ++i) {\n      let child = this.children[i], sz = child.chunkSize()\n      if (at < sz) {\n        let used = Math.min(n, sz - at)\n        if (child.iterN(at, used, op)) return true\n        if ((n -= used) == 0) break\n        at = 0\n      } else at -= sz\n    }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/model/document_data.js",
    "content": "import { loadMode } from \"../display/mode_state.js\"\nimport { runInOp } from \"../display/operations.js\"\nimport { regChange } from \"../display/view_tracking.js\"\nimport { Line, updateLine } from \"../line/line_data.js\"\nimport { findMaxLine } from \"../line/spans.js\"\nimport { getLine } from \"../line/utils_line.js\"\nimport { estimateLineHeights } from \"../measurement/position_measurement.js\"\nimport { addClass, rmClass } from \"../util/dom.js\"\nimport { lst } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\n\n// DOCUMENT DATA STRUCTURE\n\n// By default, updates that start and end at the beginning of a line\n// are treated specially, in order to make the association of line\n// widgets and marker elements with the text behave more intuitive.\nexport function isWholeLineUpdate(doc, change) {\n  return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n    (!doc.cm || doc.cm.options.wholeLineUpdateBefore)\n}\n\n// Perform a change on the document data structure.\nexport function updateDoc(doc, change, markedSpans, estimateHeight) {\n  function spansFor(n) {return markedSpans ? markedSpans[n] : null}\n  function update(line, text, spans) {\n    updateLine(line, text, spans, estimateHeight)\n    signalLater(line, \"change\", line, change)\n  }\n  function linesFor(start, end) {\n    let result = []\n    for (let i = start; i < end; ++i)\n      result.push(new Line(text[i], spansFor(i), estimateHeight))\n    return result\n  }\n\n  let from = change.from, to = change.to, text = change.text\n  let firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line)\n  let lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line\n\n  // Adjust the line structure\n  if (change.full) {\n    doc.insert(0, linesFor(0, text.length))\n    doc.remove(text.length, doc.size - text.length)\n  } else if (isWholeLineUpdate(doc, change)) {\n    // This is a whole-line replace. Treated specially to make\n    // sure line objects move the way they are supposed to.\n    let added = linesFor(0, text.length - 1)\n    update(lastLine, lastLine.text, lastSpans)\n    if (nlines) doc.remove(from.line, nlines)\n    if (added.length) doc.insert(from.line, added)\n  } else if (firstLine == lastLine) {\n    if (text.length == 1) {\n      update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans)\n    } else {\n      let added = linesFor(1, text.length - 1)\n      added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight))\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0))\n      doc.insert(from.line + 1, added)\n    }\n  } else if (text.length == 1) {\n    update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0))\n    doc.remove(from.line + 1, nlines)\n  } else {\n    update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0))\n    update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans)\n    let added = linesFor(1, text.length - 1)\n    if (nlines > 1) doc.remove(from.line + 1, nlines - 1)\n    doc.insert(from.line + 1, added)\n  }\n\n  signalLater(doc, \"change\", doc, change)\n}\n\n// Call f for all linked documents.\nexport function linkedDocs(doc, f, sharedHistOnly) {\n  function propagate(doc, skip, sharedHist) {\n    if (doc.linked) for (let i = 0; i < doc.linked.length; ++i) {\n      let rel = doc.linked[i]\n      if (rel.doc == skip) continue\n      let shared = sharedHist && rel.sharedHist\n      if (sharedHistOnly && !shared) continue\n      f(rel.doc, shared)\n      propagate(rel.doc, doc, shared)\n    }\n  }\n  propagate(doc, null, true)\n}\n\n// Attach a document to an editor.\nexport function attachDoc(cm, doc) {\n  if (doc.cm) throw new Error(\"This document is already in use.\")\n  cm.doc = doc\n  doc.cm = cm\n  estimateLineHeights(cm)\n  loadMode(cm)\n  setDirectionClass(cm)\n  cm.options.direction = doc.direction\n  if (!cm.options.lineWrapping) findMaxLine(cm)\n  cm.options.mode = doc.modeOption\n  regChange(cm)\n}\n\nfunction setDirectionClass(cm) {\n  ;(cm.doc.direction == \"rtl\" ? addClass : rmClass)(cm.display.lineDiv, \"CodeMirror-rtl\")\n}\n\nexport function directionChanged(cm) {\n  runInOp(cm, () => {\n    setDirectionClass(cm)\n    regChange(cm)\n  })\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/model/history.js",
    "content": "import { cmp, copyPos } from \"../line/pos.js\"\nimport { stretchSpansOverChange } from \"../line/spans.js\"\nimport { getBetween } from \"../line/utils_line.js\"\nimport { signal } from \"../util/event.js\"\nimport { indexOf, lst } from \"../util/misc.js\"\n\nimport { changeEnd } from \"./change_measurement.js\"\nimport { linkedDocs } from \"./document_data.js\"\nimport { Selection } from \"./selection.js\"\n\nexport function History(prev) {\n  // Arrays of change events and selections. Doing something adds an\n  // event to done and clears undo. Undoing moves events from done\n  // to undone, redoing moves them in the other direction.\n  this.done = []; this.undone = []\n  this.undoDepth = prev ? prev.undoDepth : Infinity\n  // Used to track when changes can be merged into a single undo\n  // event\n  this.lastModTime = this.lastSelTime = 0\n  this.lastOp = this.lastSelOp = null\n  this.lastOrigin = this.lastSelOrigin = null\n  // Used by the isClean() method\n  this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1\n}\n\n// Create a history change event from an updateDoc-style change\n// object.\nexport function historyChangeFromChange(doc, change) {\n  let histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}\n  attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1)\n  linkedDocs(doc, doc => attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1), true)\n  return histChange\n}\n\n// Pop all selection events off the end of a history array. Stop at\n// a change event.\nfunction clearSelectionEvents(array) {\n  while (array.length) {\n    let last = lst(array)\n    if (last.ranges) array.pop()\n    else break\n  }\n}\n\n// Find the top change event in the history. Pop off selection\n// events that are in the way.\nfunction lastChangeEvent(hist, force) {\n  if (force) {\n    clearSelectionEvents(hist.done)\n    return lst(hist.done)\n  } else if (hist.done.length && !lst(hist.done).ranges) {\n    return lst(hist.done)\n  } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n    hist.done.pop()\n    return lst(hist.done)\n  }\n}\n\n// Register a change in the history. Merges changes that are within\n// a single operation, or are close together with an origin that\n// allows merging (starting with \"+\") into a single event.\nexport function addChangeToHistory(doc, change, selAfter, opId) {\n  let hist = doc.history\n  hist.undone.length = 0\n  let time = +new Date, cur\n  let last\n\n  if ((hist.lastOp == opId ||\n       hist.lastOrigin == change.origin && change.origin &&\n       ((change.origin.charAt(0) == \"+\" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||\n        change.origin.charAt(0) == \"*\")) &&\n      (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n    // Merge this change into the last event\n    last = lst(cur.changes)\n    if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n      // Optimized case for simple insertion -- don't want to add\n      // new changesets for every character typed\n      last.to = changeEnd(change)\n    } else {\n      // Add new sub-event\n      cur.changes.push(historyChangeFromChange(doc, change))\n    }\n  } else {\n    // Can not be merged, start a new event.\n    let before = lst(hist.done)\n    if (!before || !before.ranges)\n      pushSelectionToHistory(doc.sel, hist.done)\n    cur = {changes: [historyChangeFromChange(doc, change)],\n           generation: hist.generation}\n    hist.done.push(cur)\n    while (hist.done.length > hist.undoDepth) {\n      hist.done.shift()\n      if (!hist.done[0].ranges) hist.done.shift()\n    }\n  }\n  hist.done.push(selAfter)\n  hist.generation = ++hist.maxGeneration\n  hist.lastModTime = hist.lastSelTime = time\n  hist.lastOp = hist.lastSelOp = opId\n  hist.lastOrigin = hist.lastSelOrigin = change.origin\n\n  if (!last) signal(doc, \"historyAdded\")\n}\n\nfunction selectionEventCanBeMerged(doc, origin, prev, sel) {\n  let ch = origin.charAt(0)\n  return ch == \"*\" ||\n    ch == \"+\" &&\n    prev.ranges.length == sel.ranges.length &&\n    prev.somethingSelected() == sel.somethingSelected() &&\n    new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)\n}\n\n// Called whenever the selection changes, sets the new selection as\n// the pending selection in the history, and pushes the old pending\n// selection into the 'done' array when it was significantly\n// different (in number of selected ranges, emptiness, or time).\nexport function addSelectionToHistory(doc, sel, opId, options) {\n  let hist = doc.history, origin = options && options.origin\n\n  // A new event is started when the previous origin does not match\n  // the current, or the origins don't allow matching. Origins\n  // starting with * are always merged, those starting with + are\n  // merged when similar and close together in time.\n  if (opId == hist.lastSelOp ||\n      (origin && hist.lastSelOrigin == origin &&\n       (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n        selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n    hist.done[hist.done.length - 1] = sel\n  else\n    pushSelectionToHistory(sel, hist.done)\n\n  hist.lastSelTime = +new Date\n  hist.lastSelOrigin = origin\n  hist.lastSelOp = opId\n  if (options && options.clearRedo !== false)\n    clearSelectionEvents(hist.undone)\n}\n\nexport function pushSelectionToHistory(sel, dest) {\n  let top = lst(dest)\n  if (!(top && top.ranges && top.equals(sel)))\n    dest.push(sel)\n}\n\n// Used to store marked span information in the history.\nfunction attachLocalSpans(doc, change, from, to) {\n  let existing = change[\"spans_\" + doc.id], n = 0\n  doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), line => {\n    if (line.markedSpans)\n      (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans\n    ++n\n  })\n}\n\n// When un/re-doing restores text containing marked spans, those\n// that have been explicitly cleared should not be restored.\nfunction removeClearedSpans(spans) {\n  if (!spans) return null\n  let out\n  for (let i = 0; i < spans.length; ++i) {\n    if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i) }\n    else if (out) out.push(spans[i])\n  }\n  return !out ? spans : out.length ? out : null\n}\n\n// Retrieve and filter the old marked spans stored in a change event.\nfunction getOldSpans(doc, change) {\n  let found = change[\"spans_\" + doc.id]\n  if (!found) return null\n  let nw = []\n  for (let i = 0; i < change.text.length; ++i)\n    nw.push(removeClearedSpans(found[i]))\n  return nw\n}\n\n// Used for un/re-doing changes from the history. Combines the\n// result of computing the existing spans with the set of spans that\n// existed in the history (so that deleting around a span and then\n// undoing brings back the span).\nexport function mergeOldSpans(doc, change) {\n  let old = getOldSpans(doc, change)\n  let stretched = stretchSpansOverChange(doc, change)\n  if (!old) return stretched\n  if (!stretched) return old\n\n  for (let i = 0; i < old.length; ++i) {\n    let oldCur = old[i], stretchCur = stretched[i]\n    if (oldCur && stretchCur) {\n      spans: for (let j = 0; j < stretchCur.length; ++j) {\n        let span = stretchCur[j]\n        for (let k = 0; k < oldCur.length; ++k)\n          if (oldCur[k].marker == span.marker) continue spans\n        oldCur.push(span)\n      }\n    } else if (stretchCur) {\n      old[i] = stretchCur\n    }\n  }\n  return old\n}\n\n// Used both to provide a JSON-safe object in .getHistory, and, when\n// detaching a document, to split the history in two\nexport function copyHistoryArray(events, newGroup, instantiateSel) {\n  let copy = []\n  for (let i = 0; i < events.length; ++i) {\n    let event = events[i]\n    if (event.ranges) {\n      copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event)\n      continue\n    }\n    let changes = event.changes, newChanges = []\n    copy.push({changes: newChanges})\n    for (let j = 0; j < changes.length; ++j) {\n      let change = changes[j], m\n      newChanges.push({from: change.from, to: change.to, text: change.text})\n      if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\\d+)$/)) {\n        if (indexOf(newGroup, Number(m[1])) > -1) {\n          lst(newChanges)[prop] = change[prop]\n          delete change[prop]\n        }\n      }\n    }\n  }\n  return copy\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/model/line_widget.js",
    "content": "import { runInOp } from \"../display/operations.js\"\nimport { addToScrollTop } from \"../display/scrolling.js\"\nimport { regLineChange } from \"../display/view_tracking.js\"\nimport { heightAtLine, lineIsHidden } from \"../line/spans.js\"\nimport { lineNo, updateLineHeight } from \"../line/utils_line.js\"\nimport { widgetHeight } from \"../measurement/widgets.js\"\nimport { changeLine } from \"./changes.js\"\nimport { eventMixin } from \"../util/event.js\"\nimport { signalLater } from \"../util/operation_group.js\"\n\n// Line widgets are block elements displayed above or below a line.\n\nexport class LineWidget {\n  constructor(doc, node, options) {\n    if (options) for (let opt in options) if (options.hasOwnProperty(opt))\n      this[opt] = options[opt]\n    this.doc = doc\n    this.node = node\n  }\n\n  clear() {\n    let cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line)\n    if (no == null || !ws) return\n    for (let i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1)\n    if (!ws.length) line.widgets = null\n    let height = widgetHeight(this)\n    updateLineHeight(line, Math.max(0, line.height - height))\n    if (cm) {\n      runInOp(cm, () => {\n        adjustScrollWhenAboveVisible(cm, line, -height)\n        regLineChange(cm, no, \"widget\")\n      })\n      signalLater(cm, \"lineWidgetCleared\", cm, this, no)\n    }\n  }\n\n  changed() {\n    let oldH = this.height, cm = this.doc.cm, line = this.line\n    this.height = null\n    let diff = widgetHeight(this) - oldH\n    if (!diff) return\n    if (!lineIsHidden(this.doc, line)) updateLineHeight(line, line.height + diff)\n    if (cm) {\n      runInOp(cm, () => {\n        cm.curOp.forceUpdate = true\n        adjustScrollWhenAboveVisible(cm, line, diff)\n        signalLater(cm, \"lineWidgetChanged\", cm, this, lineNo(line))\n      })\n    }\n  }\n}\neventMixin(LineWidget)\n\nfunction adjustScrollWhenAboveVisible(cm, line, diff) {\n  if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n    addToScrollTop(cm, diff)\n}\n\nexport function addLineWidget(doc, handle, node, options) {\n  let widget = new LineWidget(doc, node, options)\n  let cm = doc.cm\n  if (cm && widget.noHScroll) cm.display.alignWidgets = true\n  changeLine(doc, handle, \"widget\", line => {\n    let widgets = line.widgets || (line.widgets = [])\n    if (widget.insertAt == null) widgets.push(widget)\n    else widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget)\n    widget.line = line\n    if (cm && !lineIsHidden(doc, line)) {\n      let aboveVisible = heightAtLine(line) < doc.scrollTop\n      updateLineHeight(line, line.height + widgetHeight(widget))\n      if (aboveVisible) addToScrollTop(cm, widget.height)\n      cm.curOp.forceUpdate = true\n    }\n    return true\n  })\n  if (cm) signalLater(cm, \"lineWidgetAdded\", cm, widget, typeof handle == \"number\" ? handle : lineNo(handle))\n  return widget\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/model/mark_text.js",
    "content": "import { eltP } from \"../util/dom.js\"\nimport { eventMixin, hasHandler, on } from \"../util/event.js\"\nimport { endOperation, operation, runInOp, startOperation } from \"../display/operations.js\"\nimport { clipPos, cmp, Pos } from \"../line/pos.js\"\nimport { lineNo, updateLineHeight } from \"../line/utils_line.js\"\nimport { clearLineMeasurementCacheFor, findViewForLine, textHeight } from \"../measurement/position_measurement.js\"\nimport { seeReadOnlySpans, seeCollapsedSpans } from \"../line/saw_special_spans.js\"\nimport { addMarkedSpan, conflictingCollapsedRange, getMarkedSpanFor, lineIsHidden, lineLength, MarkedSpan, removeMarkedSpan, visualLine } from \"../line/spans.js\"\nimport { copyObj, indexOf, lst } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\nimport { widgetHeight } from \"../measurement/widgets.js\"\nimport { regChange, regLineChange } from \"../display/view_tracking.js\"\n\nimport { linkedDocs } from \"./document_data.js\"\nimport { addChangeToHistory } from \"./history.js\"\nimport { reCheckSelection } from \"./selection_updates.js\"\n\n// TEXTMARKERS\n\n// Created with markText and setBookmark methods. A TextMarker is a\n// handle that can be used to clear or find a marked position in the\n// document. Line objects hold arrays (markedSpans) containing\n// {from, to, marker} object pointing to such marker objects, and\n// indicating that such a marker is present on that line. Multiple\n// lines may point to the same marker when it spans across lines.\n// The spans will have null for their from/to properties when the\n// marker continues beyond the start/end of the line. Markers have\n// links back to the lines they currently touch.\n\n// Collapsed markers have unique ids, in order to be able to order\n// them, which is needed for uniquely determining an outer marker\n// when they overlap (they may nest, but not partially overlap).\nlet nextMarkerId = 0\n\nexport class TextMarker {\n  constructor(doc, type) {\n    this.lines = []\n    this.type = type\n    this.doc = doc\n    this.id = ++nextMarkerId\n  }\n\n  // Clear the marker.\n  clear() {\n    if (this.explicitlyCleared) return\n    let cm = this.doc.cm, withOp = cm && !cm.curOp\n    if (withOp) startOperation(cm)\n    if (hasHandler(this, \"clear\")) {\n      let found = this.find()\n      if (found) signalLater(this, \"clear\", found.from, found.to)\n    }\n    let min = null, max = null\n    for (let i = 0; i < this.lines.length; ++i) {\n      let line = this.lines[i]\n      let span = getMarkedSpanFor(line.markedSpans, this)\n      if (cm && !this.collapsed) regLineChange(cm, lineNo(line), \"text\")\n      else if (cm) {\n        if (span.to != null) max = lineNo(line)\n        if (span.from != null) min = lineNo(line)\n      }\n      line.markedSpans = removeMarkedSpan(line.markedSpans, span)\n      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n        updateLineHeight(line, textHeight(cm.display))\n    }\n    if (cm && this.collapsed && !cm.options.lineWrapping) for (let i = 0; i < this.lines.length; ++i) {\n      let visual = visualLine(this.lines[i]), len = lineLength(visual)\n      if (len > cm.display.maxLineLength) {\n        cm.display.maxLine = visual\n        cm.display.maxLineLength = len\n        cm.display.maxLineChanged = true\n      }\n    }\n\n    if (min != null && cm && this.collapsed) regChange(cm, min, max + 1)\n    this.lines.length = 0\n    this.explicitlyCleared = true\n    if (this.atomic && this.doc.cantEdit) {\n      this.doc.cantEdit = false\n      if (cm) reCheckSelection(cm.doc)\n    }\n    if (cm) signalLater(cm, \"markerCleared\", cm, this, min, max)\n    if (withOp) endOperation(cm)\n    if (this.parent) this.parent.clear()\n  }\n\n  // Find the position of the marker in the document. Returns a {from,\n  // to} object by default. Side can be passed to get a specific side\n  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n  // Pos objects returned contain a line object, rather than a line\n  // number (used to prevent looking up the same line twice).\n  find(side, lineObj) {\n    if (side == null && this.type == \"bookmark\") side = 1\n    let from, to\n    for (let i = 0; i < this.lines.length; ++i) {\n      let line = this.lines[i]\n      let span = getMarkedSpanFor(line.markedSpans, this)\n      if (span.from != null) {\n        from = Pos(lineObj ? line : lineNo(line), span.from)\n        if (side == -1) return from\n      }\n      if (span.to != null) {\n        to = Pos(lineObj ? line : lineNo(line), span.to)\n        if (side == 1) return to\n      }\n    }\n    return from && {from: from, to: to}\n  }\n\n  // Signals that the marker's widget changed, and surrounding layout\n  // should be recomputed.\n  changed() {\n    let pos = this.find(-1, true), widget = this, cm = this.doc.cm\n    if (!pos || !cm) return\n    runInOp(cm, () => {\n      let line = pos.line, lineN = lineNo(pos.line)\n      let view = findViewForLine(cm, lineN)\n      if (view) {\n        clearLineMeasurementCacheFor(view)\n        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true\n      }\n      cm.curOp.updateMaxLine = true\n      if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n        let oldHeight = widget.height\n        widget.height = null\n        let dHeight = widgetHeight(widget) - oldHeight\n        if (dHeight)\n          updateLineHeight(line, line.height + dHeight)\n      }\n      signalLater(cm, \"markerChanged\", cm, this)\n    })\n  }\n\n  attachLine(line) {\n    if (!this.lines.length && this.doc.cm) {\n      let op = this.doc.cm.curOp\n      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n        (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this)\n    }\n    this.lines.push(line)\n  }\n\n  detachLine(line) {\n    this.lines.splice(indexOf(this.lines, line), 1)\n    if (!this.lines.length && this.doc.cm) {\n      let op = this.doc.cm.curOp\n      ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this)\n    }\n  }\n}\neventMixin(TextMarker)\n\n// Create a marker, wire it up to the right lines, and\nexport function markText(doc, from, to, options, type) {\n  // Shared markers (across linked documents) are handled separately\n  // (markTextShared will call out to this again, once per\n  // document).\n  if (options && options.shared) return markTextShared(doc, from, to, options, type)\n  // Ensure we are in an operation.\n  if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type)\n\n  let marker = new TextMarker(doc, type), diff = cmp(from, to)\n  if (options) copyObj(options, marker, false)\n  // Don't connect empty markers unless clearWhenEmpty is false\n  if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n    return marker\n  if (marker.replacedWith) {\n    // Showing up as a widget implies collapsed (widget replaces text)\n    marker.collapsed = true\n    marker.widgetNode = eltP(\"span\", [marker.replacedWith], \"CodeMirror-widget\")\n    if (!options.handleMouseEvents) marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\")\n    if (options.insertLeft) marker.widgetNode.insertLeft = true\n  }\n  if (marker.collapsed) {\n    if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n        from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n      throw new Error(\"Inserting collapsed marker partially overlapping an existing one\")\n    seeCollapsedSpans()\n  }\n\n  if (marker.addToHistory)\n    addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN)\n\n  let curLine = from.line, cm = doc.cm, updateMaxLine\n  doc.iter(curLine, to.line + 1, line => {\n    if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n      updateMaxLine = true\n    if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0)\n    addMarkedSpan(line, new MarkedSpan(marker,\n                                       curLine == from.line ? from.ch : null,\n                                       curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp)\n    ++curLine\n  })\n  // lineIsHidden depends on the presence of the spans, so needs a second pass\n  if (marker.collapsed) doc.iter(from.line, to.line + 1, line => {\n    if (lineIsHidden(doc, line)) updateLineHeight(line, 0)\n  })\n\n  if (marker.clearOnEnter) on(marker, \"beforeCursorEnter\", () => marker.clear())\n\n  if (marker.readOnly) {\n    seeReadOnlySpans()\n    if (doc.history.done.length || doc.history.undone.length)\n      doc.clearHistory()\n  }\n  if (marker.collapsed) {\n    marker.id = ++nextMarkerId\n    marker.atomic = true\n  }\n  if (cm) {\n    // Sync editor state\n    if (updateMaxLine) cm.curOp.updateMaxLine = true\n    if (marker.collapsed)\n      regChange(cm, from.line, to.line + 1)\n    else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||\n             marker.attributes || marker.title)\n      for (let i = from.line; i <= to.line; i++) regLineChange(cm, i, \"text\")\n    if (marker.atomic) reCheckSelection(cm.doc)\n    signalLater(cm, \"markerAdded\", cm, marker)\n  }\n  return marker\n}\n\n// SHARED TEXTMARKERS\n\n// A shared marker spans multiple linked documents. It is\n// implemented as a meta-marker-object controlling multiple normal\n// markers.\nexport class SharedTextMarker {\n  constructor(markers, primary) {\n    this.markers = markers\n    this.primary = primary\n    for (let i = 0; i < markers.length; ++i)\n      markers[i].parent = this\n  }\n\n  clear() {\n    if (this.explicitlyCleared) return\n    this.explicitlyCleared = true\n    for (let i = 0; i < this.markers.length; ++i)\n      this.markers[i].clear()\n    signalLater(this, \"clear\")\n  }\n\n  find(side, lineObj) {\n    return this.primary.find(side, lineObj)\n  }\n}\neventMixin(SharedTextMarker)\n\nfunction markTextShared(doc, from, to, options, type) {\n  options = copyObj(options)\n  options.shared = false\n  let markers = [markText(doc, from, to, options, type)], primary = markers[0]\n  let widget = options.widgetNode\n  linkedDocs(doc, doc => {\n    if (widget) options.widgetNode = widget.cloneNode(true)\n    markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type))\n    for (let i = 0; i < doc.linked.length; ++i)\n      if (doc.linked[i].isParent) return\n    primary = lst(markers)\n  })\n  return new SharedTextMarker(markers, primary)\n}\n\nexport function findSharedMarkers(doc) {\n  return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), m => m.parent)\n}\n\nexport function copySharedMarkers(doc, markers) {\n  for (let i = 0; i < markers.length; i++) {\n    let marker = markers[i], pos = marker.find()\n    let mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to)\n    if (cmp(mFrom, mTo)) {\n      let subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type)\n      marker.markers.push(subMark)\n      subMark.parent = marker\n    }\n  }\n}\n\nexport function detachSharedMarkers(markers) {\n  for (let i = 0; i < markers.length; i++) {\n    let marker = markers[i], linked = [marker.primary.doc]\n    linkedDocs(marker.primary.doc, d => linked.push(d))\n    for (let j = 0; j < marker.markers.length; j++) {\n      let subMarker = marker.markers[j]\n      if (indexOf(linked, subMarker.doc) == -1) {\n        subMarker.parent = null\n        marker.markers.splice(j--, 1)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/model/selection.js",
    "content": "import { cmp, copyPos, equalCursorPos, maxPos, minPos } from \"../line/pos.js\"\nimport { indexOf } from \"../util/misc.js\"\n\n// Selection objects are immutable. A new one is created every time\n// the selection changes. A selection is one or more non-overlapping\n// (and non-touching) ranges, sorted, and an integer that indicates\n// which one is the primary selection (the one that's scrolled into\n// view, that getCursor returns, etc).\nexport class Selection {\n  constructor(ranges, primIndex) {\n    this.ranges = ranges\n    this.primIndex = primIndex\n  }\n\n  primary() { return this.ranges[this.primIndex] }\n\n  equals(other) {\n    if (other == this) return true\n    if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false\n    for (let i = 0; i < this.ranges.length; i++) {\n      let here = this.ranges[i], there = other.ranges[i]\n      if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) return false\n    }\n    return true\n  }\n\n  deepCopy() {\n    let out = []\n    for (let i = 0; i < this.ranges.length; i++)\n      out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head))\n    return new Selection(out, this.primIndex)\n  }\n\n  somethingSelected() {\n    for (let i = 0; i < this.ranges.length; i++)\n      if (!this.ranges[i].empty()) return true\n    return false\n  }\n\n  contains(pos, end) {\n    if (!end) end = pos\n    for (let i = 0; i < this.ranges.length; i++) {\n      let range = this.ranges[i]\n      if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n        return i\n    }\n    return -1\n  }\n}\n\nexport class Range {\n  constructor(anchor, head) {\n    this.anchor = anchor; this.head = head\n  }\n\n  from() { return minPos(this.anchor, this.head) }\n  to() { return maxPos(this.anchor, this.head) }\n  empty() { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }\n}\n\n// Take an unsorted, potentially overlapping set of ranges, and\n// build a selection out of it. 'Consumes' ranges array (modifying\n// it).\nexport function normalizeSelection(cm, ranges, primIndex) {\n  let mayTouch = cm && cm.options.selectionsMayTouch\n  let prim = ranges[primIndex]\n  ranges.sort((a, b) => cmp(a.from(), b.from()))\n  primIndex = indexOf(ranges, prim)\n  for (let i = 1; i < ranges.length; i++) {\n    let cur = ranges[i], prev = ranges[i - 1]\n    let diff = cmp(prev.to(), cur.from())\n    if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {\n      let from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to())\n      let inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head\n      if (i <= primIndex) --primIndex\n      ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to))\n    }\n  }\n  return new Selection(ranges, primIndex)\n}\n\nexport function simpleSelection(anchor, head) {\n  return new Selection([new Range(anchor, head || anchor)], 0)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/model/selection_updates.js",
    "content": "import { signalLater } from \"../util/operation_group.js\"\nimport { ensureCursorVisible } from \"../display/scrolling.js\"\nimport { clipPos, cmp, Pos } from \"../line/pos.js\"\nimport { getLine } from \"../line/utils_line.js\"\nimport { hasHandler, signal, signalCursorActivity } from \"../util/event.js\"\nimport { lst, sel_dontScroll } from \"../util/misc.js\"\n\nimport { addSelectionToHistory } from \"./history.js\"\nimport { normalizeSelection, Range, Selection, simpleSelection } from \"./selection.js\"\n\n// The 'scroll' parameter given to many of these indicated whether\n// the new cursor position should be scrolled into view after\n// modifying the selection.\n\n// If shift is held or the extend flag is set, extends a range to\n// include a given position (and optionally a second position).\n// Otherwise, simply returns the range between the given positions.\n// Used for cursor motion and such.\nexport function extendRange(range, head, other, extend) {\n  if (extend) {\n    let anchor = range.anchor\n    if (other) {\n      let posBefore = cmp(head, anchor) < 0\n      if (posBefore != (cmp(other, anchor) < 0)) {\n        anchor = head\n        head = other\n      } else if (posBefore != (cmp(head, other) < 0)) {\n        head = other\n      }\n    }\n    return new Range(anchor, head)\n  } else {\n    return new Range(other || head, head)\n  }\n}\n\n// Extend the primary selection range, discard the rest.\nexport function extendSelection(doc, head, other, options, extend) {\n  if (extend == null) extend = doc.cm && (doc.cm.display.shift || doc.extend)\n  setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options)\n}\n\n// Extend all selections (pos is an array of selections with length\n// equal the number of selections)\nexport function extendSelections(doc, heads, options) {\n  let out = []\n  let extend = doc.cm && (doc.cm.display.shift || doc.extend)\n  for (let i = 0; i < doc.sel.ranges.length; i++)\n    out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend)\n  let newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex)\n  setSelection(doc, newSel, options)\n}\n\n// Updates a single range in the selection.\nexport function replaceOneSelection(doc, i, range, options) {\n  let ranges = doc.sel.ranges.slice(0)\n  ranges[i] = range\n  setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options)\n}\n\n// Reset the selection to a single range.\nexport function setSimpleSelection(doc, anchor, head, options) {\n  setSelection(doc, simpleSelection(anchor, head), options)\n}\n\n// Give beforeSelectionChange handlers a change to influence a\n// selection update.\nfunction filterSelectionChange(doc, sel, options) {\n  let obj = {\n    ranges: sel.ranges,\n    update: function(ranges) {\n      this.ranges = []\n      for (let i = 0; i < ranges.length; i++)\n        this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n                                   clipPos(doc, ranges[i].head))\n    },\n    origin: options && options.origin\n  }\n  signal(doc, \"beforeSelectionChange\", doc, obj)\n  if (doc.cm) signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj)\n  if (obj.ranges != sel.ranges) return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1)\n  else return sel\n}\n\nexport function setSelectionReplaceHistory(doc, sel, options) {\n  let done = doc.history.done, last = lst(done)\n  if (last && last.ranges) {\n    done[done.length - 1] = sel\n    setSelectionNoUndo(doc, sel, options)\n  } else {\n    setSelection(doc, sel, options)\n  }\n}\n\n// Set a new selection.\nexport function setSelection(doc, sel, options) {\n  setSelectionNoUndo(doc, sel, options)\n  addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options)\n}\n\nexport function setSelectionNoUndo(doc, sel, options) {\n  if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n    sel = filterSelectionChange(doc, sel, options)\n\n  let bias = options && options.bias ||\n    (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1)\n  setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true))\n\n  if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption(\"readOnly\") != \"nocursor\")\n    ensureCursorVisible(doc.cm)\n}\n\nfunction setSelectionInner(doc, sel) {\n  if (sel.equals(doc.sel)) return\n\n  doc.sel = sel\n\n  if (doc.cm) {\n    doc.cm.curOp.updateInput = 1\n    doc.cm.curOp.selectionChanged = true\n    signalCursorActivity(doc.cm)\n  }\n  signalLater(doc, \"cursorActivity\", doc)\n}\n\n// Verify that the selection does not partially select any atomic\n// marked ranges.\nexport function reCheckSelection(doc) {\n  setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false))\n}\n\n// Return a selection that does not partially select any atomic\n// ranges.\nfunction skipAtomicInSelection(doc, sel, bias, mayClear) {\n  let out\n  for (let i = 0; i < sel.ranges.length; i++) {\n    let range = sel.ranges[i]\n    let old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]\n    let newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear)\n    let newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear)\n    if (out || newAnchor != range.anchor || newHead != range.head) {\n      if (!out) out = sel.ranges.slice(0, i)\n      out[i] = new Range(newAnchor, newHead)\n    }\n  }\n  return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel\n}\n\nfunction skipAtomicInner(doc, pos, oldPos, dir, mayClear) {\n  let line = getLine(doc, pos.line)\n  if (line.markedSpans) for (let i = 0; i < line.markedSpans.length; ++i) {\n    let sp = line.markedSpans[i], m = sp.marker\n\n    // Determine if we should prevent the cursor being placed to the left/right of an atomic marker\n    // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it\n    // is with selectLeft/Right\n    let preventCursorLeft = (\"selectLeft\" in m) ? !m.selectLeft : m.inclusiveLeft\n    let preventCursorRight = (\"selectRight\" in m) ? !m.selectRight : m.inclusiveRight\n\n    if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n        (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n      if (mayClear) {\n        signal(m, \"beforeCursorEnter\")\n        if (m.explicitlyCleared) {\n          if (!line.markedSpans) break\n          else {--i; continue}\n        }\n      }\n      if (!m.atomic) continue\n\n      if (oldPos) {\n        let near = m.find(dir < 0 ? 1 : -1), diff\n        if (dir < 0 ? preventCursorRight : preventCursorLeft)\n          near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null)\n        if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))\n          return skipAtomicInner(doc, near, pos, dir, mayClear)\n      }\n\n      let far = m.find(dir < 0 ? -1 : 1)\n      if (dir < 0 ? preventCursorLeft : preventCursorRight)\n        far = movePos(doc, far, dir, far.line == pos.line ? line : null)\n      return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null\n    }\n  }\n  return pos\n}\n\n// Ensure a given position is not inside an atomic range.\nexport function skipAtomic(doc, pos, oldPos, bias, mayClear) {\n  let dir = bias || 1\n  let found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||\n      (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||\n      skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||\n      (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true))\n  if (!found) {\n    doc.cantEdit = true\n    return Pos(doc.first, 0)\n  }\n  return found\n}\n\nfunction movePos(doc, pos, dir, line) {\n  if (dir < 0 && pos.ch == 0) {\n    if (pos.line > doc.first) return clipPos(doc, Pos(pos.line - 1))\n    else return null\n  } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {\n    if (pos.line < doc.first + doc.size - 1) return Pos(pos.line + 1, 0)\n    else return null\n  } else {\n    return new Pos(pos.line, pos.ch + dir)\n  }\n}\n\nexport function selectAll(cm) {\n  cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/modes.js",
    "content": "import { copyObj, createObj } from \"./util/misc.js\"\n\n// Known modes, by name and by MIME\nexport let modes = {}, mimeModes = {}\n\n// Extra arguments are stored as the mode's dependencies, which is\n// used by (legacy) mechanisms like loadmode.js to automatically\n// load a mode. (Preferred mechanism is the require/define calls.)\nexport function defineMode(name, mode) {\n  if (arguments.length > 2)\n    mode.dependencies = Array.prototype.slice.call(arguments, 2)\n  modes[name] = mode\n}\n\nexport function defineMIME(mime, spec) {\n  mimeModes[mime] = spec\n}\n\n// Given a MIME type, a {name, ...options} config object, or a name\n// string, return a mode config object.\nexport function resolveMode(spec) {\n  if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n    spec = mimeModes[spec]\n  } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n    let found = mimeModes[spec.name]\n    if (typeof found == \"string\") found = {name: found}\n    spec = createObj(found, spec)\n    spec.name = found.name\n  } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n    return resolveMode(\"application/xml\")\n  } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n    return resolveMode(\"application/json\")\n  }\n  if (typeof spec == \"string\") return {name: spec}\n  else return spec || {name: \"null\"}\n}\n\n// Given a mode spec (anything that resolveMode accepts), find and\n// initialize an actual mode object.\nexport function getMode(options, spec) {\n  spec = resolveMode(spec)\n  let mfactory = modes[spec.name]\n  if (!mfactory) return getMode(options, \"text/plain\")\n  let modeObj = mfactory(options, spec)\n  if (modeExtensions.hasOwnProperty(spec.name)) {\n    let exts = modeExtensions[spec.name]\n    for (let prop in exts) {\n      if (!exts.hasOwnProperty(prop)) continue\n      if (modeObj.hasOwnProperty(prop)) modeObj[\"_\" + prop] = modeObj[prop]\n      modeObj[prop] = exts[prop]\n    }\n  }\n  modeObj.name = spec.name\n  if (spec.helperType) modeObj.helperType = spec.helperType\n  if (spec.modeProps) for (let prop in spec.modeProps)\n    modeObj[prop] = spec.modeProps[prop]\n\n  return modeObj\n}\n\n// This can be used to attach properties to mode objects from\n// outside the actual mode definition.\nexport let modeExtensions = {}\nexport function extendMode(mode, properties) {\n  let exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {})\n  copyObj(properties, exts)\n}\n\nexport function copyState(mode, state) {\n  if (state === true) return state\n  if (mode.copyState) return mode.copyState(state)\n  let nstate = {}\n  for (let n in state) {\n    let val = state[n]\n    if (val instanceof Array) val = val.concat([])\n    nstate[n] = val\n  }\n  return nstate\n}\n\n// Given a mode and a state (for that mode), find the inner mode and\n// state at the position that the state refers to.\nexport function innerMode(mode, state) {\n  let info\n  while (mode.innerMode) {\n    info = mode.innerMode(state)\n    if (!info || info.mode == mode) break\n    state = info.state\n    mode = info.mode\n  }\n  return info || {mode: mode, state: state}\n}\n\nexport function startState(mode, a1, a2) {\n  return mode.startState ? mode.startState(a1, a2) : true\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/util/StringStream.js",
    "content": "import { countColumn } from \"./misc.js\"\n\n// STRING STREAM\n\n// Fed to the mode parsers, provides helper functions to make\n// parsers more succinct.\n\nclass StringStream {\n  constructor(string, tabSize, lineOracle) {\n    this.pos = this.start = 0\n    this.string = string\n    this.tabSize = tabSize || 8\n    this.lastColumnPos = this.lastColumnValue = 0\n    this.lineStart = 0\n    this.lineOracle = lineOracle\n  }\n\n  eol() {return this.pos >= this.string.length}\n  sol() {return this.pos == this.lineStart}\n  peek() {return this.string.charAt(this.pos) || undefined}\n  next() {\n    if (this.pos < this.string.length)\n      return this.string.charAt(this.pos++)\n  }\n  eat(match) {\n    let ch = this.string.charAt(this.pos)\n    let ok\n    if (typeof match == \"string\") ok = ch == match\n    else ok = ch && (match.test ? match.test(ch) : match(ch))\n    if (ok) {++this.pos; return ch}\n  }\n  eatWhile(match) {\n    let start = this.pos\n    while (this.eat(match)){}\n    return this.pos > start\n  }\n  eatSpace() {\n    let start = this.pos\n    while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos\n    return this.pos > start\n  }\n  skipToEnd() {this.pos = this.string.length}\n  skipTo(ch) {\n    let found = this.string.indexOf(ch, this.pos)\n    if (found > -1) {this.pos = found; return true}\n  }\n  backUp(n) {this.pos -= n}\n  column() {\n    if (this.lastColumnPos < this.start) {\n      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue)\n      this.lastColumnPos = this.start\n    }\n    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  }\n  indentation() {\n    return countColumn(this.string, null, this.tabSize) -\n      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  }\n  match(pattern, consume, caseInsensitive) {\n    if (typeof pattern == \"string\") {\n      let cased = str => caseInsensitive ? str.toLowerCase() : str\n      let substr = this.string.substr(this.pos, pattern.length)\n      if (cased(substr) == cased(pattern)) {\n        if (consume !== false) this.pos += pattern.length\n        return true\n      }\n    } else {\n      let match = this.string.slice(this.pos).match(pattern)\n      if (match && match.index > 0) return null\n      if (match && consume !== false) this.pos += match[0].length\n      return match\n    }\n  }\n  current(){return this.string.slice(this.start, this.pos)}\n  hideFirstChars(n, inner) {\n    this.lineStart += n\n    try { return inner() }\n    finally { this.lineStart -= n }\n  }\n  lookAhead(n) {\n    let oracle = this.lineOracle\n    return oracle && oracle.lookAhead(n)\n  }\n  baseToken() {\n    let oracle = this.lineOracle\n    return oracle && oracle.baseToken(this.pos)\n  }\n}\n\nexport default StringStream\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/util/bidi.js",
    "content": "import { lst } from \"./misc.js\"\n\n// BIDI HELPERS\n\nexport function iterateBidiSections(order, from, to, f) {\n  if (!order) return f(from, to, \"ltr\", 0)\n  let found = false\n  for (let i = 0; i < order.length; ++i) {\n    let part = order[i]\n    if (part.from < to && part.to > from || from == to && part.to == from) {\n      f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\", i)\n      found = true\n    }\n  }\n  if (!found) f(from, to, \"ltr\")\n}\n\nexport let bidiOther = null\nexport function getBidiPartAt(order, ch, sticky) {\n  let found\n  bidiOther = null\n  for (let i = 0; i < order.length; ++i) {\n    let cur = order[i]\n    if (cur.from < ch && cur.to > ch) return i\n    if (cur.to == ch) {\n      if (cur.from != cur.to && sticky == \"before\") found = i\n      else bidiOther = i\n    }\n    if (cur.from == ch) {\n      if (cur.from != cur.to && sticky != \"before\") found = i\n      else bidiOther = i\n    }\n  }\n  return found != null ? found : bidiOther\n}\n\n// Bidirectional ordering algorithm\n// See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n// that this (partially) implements.\n\n// One-char codes used for character types:\n// L (L):   Left-to-Right\n// R (R):   Right-to-Left\n// r (AL):  Right-to-Left Arabic\n// 1 (EN):  European Number\n// + (ES):  European Number Separator\n// % (ET):  European Number Terminator\n// n (AN):  Arabic Number\n// , (CS):  Common Number Separator\n// m (NSM): Non-Spacing Mark\n// b (BN):  Boundary Neutral\n// s (B):   Paragraph Separator\n// t (S):   Segment Separator\n// w (WS):  Whitespace\n// N (ON):  Other Neutrals\n\n// Returns null if characters are ordered as they appear\n// (left-to-right), or an array of sections ({from, to, level}\n// objects) in the order in which they occur visually.\nlet bidiOrdering = (function() {\n  // Character types for codepoints 0 to 0xff\n  let lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\"\n  // Character types for codepoints 0x600 to 0x6f9\n  let arabicTypes = \"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\"\n  function charType(code) {\n    if (code <= 0xf7) return lowTypes.charAt(code)\n    else if (0x590 <= code && code <= 0x5f4) return \"R\"\n    else if (0x600 <= code && code <= 0x6f9) return arabicTypes.charAt(code - 0x600)\n    else if (0x6ee <= code && code <= 0x8ac) return \"r\"\n    else if (0x2000 <= code && code <= 0x200b) return \"w\"\n    else if (code == 0x200c) return \"b\"\n    else return \"L\"\n  }\n\n  let bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/\n  let isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/\n\n  function BidiSpan(level, from, to) {\n    this.level = level\n    this.from = from; this.to = to\n  }\n\n  return function(str, direction) {\n    let outerType = direction == \"ltr\" ? \"L\" : \"R\"\n\n    if (str.length == 0 || direction == \"ltr\" && !bidiRE.test(str)) return false\n    let len = str.length, types = []\n    for (let i = 0; i < len; ++i)\n      types.push(charType(str.charCodeAt(i)))\n\n    // W1. Examine each non-spacing mark (NSM) in the level run, and\n    // change the type of the NSM to the type of the previous\n    // character. If the NSM is at the start of the level run, it will\n    // get the type of sor.\n    for (let i = 0, prev = outerType; i < len; ++i) {\n      let type = types[i]\n      if (type == \"m\") types[i] = prev\n      else prev = type\n    }\n\n    // W2. Search backwards from each instance of a European number\n    // until the first strong type (R, L, AL, or sor) is found. If an\n    // AL is found, change the type of the European number to Arabic\n    // number.\n    // W3. Change all ALs to R.\n    for (let i = 0, cur = outerType; i < len; ++i) {\n      let type = types[i]\n      if (type == \"1\" && cur == \"r\") types[i] = \"n\"\n      else if (isStrong.test(type)) { cur = type; if (type == \"r\") types[i] = \"R\" }\n    }\n\n    // W4. A single European separator between two European numbers\n    // changes to a European number. A single common separator between\n    // two numbers of the same type changes to that type.\n    for (let i = 1, prev = types[0]; i < len - 1; ++i) {\n      let type = types[i]\n      if (type == \"+\" && prev == \"1\" && types[i+1] == \"1\") types[i] = \"1\"\n      else if (type == \",\" && prev == types[i+1] &&\n               (prev == \"1\" || prev == \"n\")) types[i] = prev\n      prev = type\n    }\n\n    // W5. A sequence of European terminators adjacent to European\n    // numbers changes to all European numbers.\n    // W6. Otherwise, separators and terminators change to Other\n    // Neutral.\n    for (let i = 0; i < len; ++i) {\n      let type = types[i]\n      if (type == \",\") types[i] = \"N\"\n      else if (type == \"%\") {\n        let end\n        for (end = i + 1; end < len && types[end] == \"%\"; ++end) {}\n        let replace = (i && types[i-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\"\n        for (let j = i; j < end; ++j) types[j] = replace\n        i = end - 1\n      }\n    }\n\n    // W7. Search backwards from each instance of a European number\n    // until the first strong type (R, L, or sor) is found. If an L is\n    // found, then change the type of the European number to L.\n    for (let i = 0, cur = outerType; i < len; ++i) {\n      let type = types[i]\n      if (cur == \"L\" && type == \"1\") types[i] = \"L\"\n      else if (isStrong.test(type)) cur = type\n    }\n\n    // N1. A sequence of neutrals takes the direction of the\n    // surrounding strong text if the text on both sides has the same\n    // direction. European and Arabic numbers act as if they were R in\n    // terms of their influence on neutrals. Start-of-level-run (sor)\n    // and end-of-level-run (eor) are used at level run boundaries.\n    // N2. Any remaining neutrals take the embedding direction.\n    for (let i = 0; i < len; ++i) {\n      if (isNeutral.test(types[i])) {\n        let end\n        for (end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}\n        let before = (i ? types[i-1] : outerType) == \"L\"\n        let after = (end < len ? types[end] : outerType) == \"L\"\n        let replace = before == after ? (before ? \"L\" : \"R\") : outerType\n        for (let j = i; j < end; ++j) types[j] = replace\n        i = end - 1\n      }\n    }\n\n    // Here we depart from the documented algorithm, in order to avoid\n    // building up an actual levels array. Since there are only three\n    // levels (0, 1, 2) in an implementation that doesn't take\n    // explicit embedding into account, we can build up the order on\n    // the fly, without following the level-based algorithm.\n    let order = [], m\n    for (let i = 0; i < len;) {\n      if (countsAsLeft.test(types[i])) {\n        let start = i\n        for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}\n        order.push(new BidiSpan(0, start, i))\n      } else {\n        let pos = i, at = order.length, isRTL = direction == \"rtl\" ? 1 : 0\n        for (++i; i < len && types[i] != \"L\"; ++i) {}\n        for (let j = pos; j < i;) {\n          if (countsAsNum.test(types[j])) {\n            if (pos < j) { order.splice(at, 0, new BidiSpan(1, pos, j)); at += isRTL }\n            let nstart = j\n            for (++j; j < i && countsAsNum.test(types[j]); ++j) {}\n            order.splice(at, 0, new BidiSpan(2, nstart, j))\n            at += isRTL\n            pos = j\n          } else ++j\n        }\n        if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i))\n      }\n    }\n    if (direction == \"ltr\") {\n      if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n        order[0].from = m[0].length\n        order.unshift(new BidiSpan(0, 0, m[0].length))\n      }\n      if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n        lst(order).to -= m[0].length\n        order.push(new BidiSpan(0, len - m[0].length, len))\n      }\n    }\n\n    return direction == \"rtl\" ? order.reverse() : order\n  }\n})()\n\n// Get the bidi ordering for the given line (and cache it). Returns\n// false for lines that are fully left-to-right, and an array of\n// BidiSpan objects otherwise.\nexport function getOrder(line, direction) {\n  let order = line.order\n  if (order == null) order = line.order = bidiOrdering(line.text, direction)\n  return order\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/util/browser.js",
    "content": "// Kludges for bugs and behavior differences that can't be feature\n// detected are enabled based on userAgent etc sniffing.\nlet userAgent = navigator.userAgent\nlet platform = navigator.platform\n\nexport let gecko = /gecko\\/\\d/i.test(userAgent)\nlet ie_upto10 = /MSIE \\d/.test(userAgent)\nlet ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent)\nlet edge = /Edge\\/(\\d+)/.exec(userAgent)\nexport let ie = ie_upto10 || ie_11up || edge\nexport let ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1])\nexport let webkit = !edge && /WebKit\\//.test(userAgent)\nlet qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent)\nexport let chrome = !edge && /Chrome\\//.test(userAgent)\nexport let presto = /Opera\\//.test(userAgent)\nexport let safari = /Apple Computer/.test(navigator.vendor)\nexport let mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent)\nexport let phantom = /PhantomJS/.test(userAgent)\n\nexport let ios = safari && (/Mobile\\/\\w+/.test(userAgent) || navigator.maxTouchPoints > 2)\nexport let android = /Android/.test(userAgent)\n// This is woefully incomplete. Suggestions for alternative methods welcome.\nexport let mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent)\nexport let mac = ios || /Mac/.test(platform)\nexport let chromeOS = /\\bCrOS\\b/.test(userAgent)\nexport let windows = /win/i.test(platform)\n\nlet presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/)\nif (presto_version) presto_version = Number(presto_version[1])\nif (presto_version && presto_version >= 15) { presto = false; webkit = true }\n// Some browsers use the wrong event properties to signal cmd/ctrl on OS X\nexport let flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11))\nexport let captureRightClick = gecko || (ie && ie_version >= 9)\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/util/dom.js",
    "content": "import { ie, ios } from \"./browser.js\"\n\nexport function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\nexport let rmClass = function(node, cls) {\n  let current = node.className\n  let match = classTest(cls).exec(current)\n  if (match) {\n    let after = current.slice(match.index + match[0].length)\n    node.className = current.slice(0, match.index) + (after ? match[1] + after : \"\")\n  }\n}\n\nexport function removeChildren(e) {\n  for (let count = e.childNodes.length; count > 0; --count)\n    e.removeChild(e.firstChild)\n  return e\n}\n\nexport function removeChildrenAndAdd(parent, e) {\n  return removeChildren(parent).appendChild(e)\n}\n\nexport function elt(tag, content, className, style) {\n  let e = document.createElement(tag)\n  if (className) e.className = className\n  if (style) e.style.cssText = style\n  if (typeof content == \"string\") e.appendChild(document.createTextNode(content))\n  else if (content) for (let i = 0; i < content.length; ++i) e.appendChild(content[i])\n  return e\n}\n// wrapper for elt, which removes the elt from the accessibility tree\nexport function eltP(tag, content, className, style) {\n  let e = elt(tag, content, className, style)\n  e.setAttribute(\"role\", \"presentation\")\n  return e\n}\n\nexport let range\nif (document.createRange) range = function(node, start, end, endNode) {\n  let r = document.createRange()\n  r.setEnd(endNode || node, end)\n  r.setStart(node, start)\n  return r\n}\nelse range = function(node, start, end) {\n  let r = document.body.createTextRange()\n  try { r.moveToElementText(node.parentNode) }\n  catch(e) { return r }\n  r.collapse(true)\n  r.moveEnd(\"character\", end)\n  r.moveStart(\"character\", start)\n  return r\n}\n\nexport function contains(parent, child) {\n  if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n    child = child.parentNode\n  if (parent.contains)\n    return parent.contains(child)\n  do {\n    if (child.nodeType == 11) child = child.host\n    if (child == parent) return true\n  } while (child = child.parentNode)\n}\n\nexport function activeElt() {\n  // IE and Edge may throw an \"Unspecified Error\" when accessing document.activeElement.\n  // IE < 10 will throw when accessed while the page is loading or in an iframe.\n  // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.\n  let activeElement\n  try {\n    activeElement = document.activeElement\n  } catch(e) {\n    activeElement = document.body || null\n  }\n  while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)\n    activeElement = activeElement.shadowRoot.activeElement\n  return activeElement\n}\n\nexport function addClass(node, cls) {\n  let current = node.className\n  if (!classTest(cls).test(current)) node.className += (current ? \" \" : \"\") + cls\n}\nexport function joinClasses(a, b) {\n  let as = a.split(\" \")\n  for (let i = 0; i < as.length; i++)\n    if (as[i] && !classTest(as[i]).test(b)) b += \" \" + as[i]\n  return b\n}\n\nexport let selectInput = function(node) { node.select() }\nif (ios) // Mobile Safari apparently has a bug where select() is broken.\n  selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length }\nelse if (ie) // Suppress mysterious IE10 errors\n  selectInput = function(node) { try { node.select() } catch(_e) {} }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/util/event.js",
    "content": "import { mac } from \"./browser.js\"\nimport { indexOf } from \"./misc.js\"\n\n// EVENT HANDLING\n\n// Lightweight event framework. on/off also work on DOM nodes,\n// registering native DOM handlers.\n\nconst noHandlers = []\n\nexport let on = function(emitter, type, f) {\n  if (emitter.addEventListener) {\n    emitter.addEventListener(type, f, false)\n  } else if (emitter.attachEvent) {\n    emitter.attachEvent(\"on\" + type, f)\n  } else {\n    let map = emitter._handlers || (emitter._handlers = {})\n    map[type] = (map[type] || noHandlers).concat(f)\n  }\n}\n\nexport function getHandlers(emitter, type) {\n  return emitter._handlers && emitter._handlers[type] || noHandlers\n}\n\nexport function off(emitter, type, f) {\n  if (emitter.removeEventListener) {\n    emitter.removeEventListener(type, f, false)\n  } else if (emitter.detachEvent) {\n    emitter.detachEvent(\"on\" + type, f)\n  } else {\n    let map = emitter._handlers, arr = map && map[type]\n    if (arr) {\n      let index = indexOf(arr, f)\n      if (index > -1)\n        map[type] = arr.slice(0, index).concat(arr.slice(index + 1))\n    }\n  }\n}\n\nexport function signal(emitter, type /*, values...*/) {\n  let handlers = getHandlers(emitter, type)\n  if (!handlers.length) return\n  let args = Array.prototype.slice.call(arguments, 2)\n  for (let i = 0; i < handlers.length; ++i) handlers[i].apply(null, args)\n}\n\n// The DOM events that CodeMirror handles can be overridden by\n// registering a (non-DOM) handler on the editor for the event name,\n// and preventDefault-ing the event in that handler.\nexport function signalDOMEvent(cm, e, override) {\n  if (typeof e == \"string\")\n    e = {type: e, preventDefault: function() { this.defaultPrevented = true }}\n  signal(cm, override || e.type, cm, e)\n  return e_defaultPrevented(e) || e.codemirrorIgnore\n}\n\nexport function signalCursorActivity(cm) {\n  let arr = cm._handlers && cm._handlers.cursorActivity\n  if (!arr) return\n  let set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = [])\n  for (let i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)\n    set.push(arr[i])\n}\n\nexport function hasHandler(emitter, type) {\n  return getHandlers(emitter, type).length > 0\n}\n\n// Add on and off methods to a constructor's prototype, to make\n// registering events on such objects more convenient.\nexport function eventMixin(ctor) {\n  ctor.prototype.on = function(type, f) {on(this, type, f)}\n  ctor.prototype.off = function(type, f) {off(this, type, f)}\n}\n\n// Due to the fact that we still support jurassic IE versions, some\n// compatibility wrappers are needed.\n\nexport function e_preventDefault(e) {\n  if (e.preventDefault) e.preventDefault()\n  else e.returnValue = false\n}\nexport function e_stopPropagation(e) {\n  if (e.stopPropagation) e.stopPropagation()\n  else e.cancelBubble = true\n}\nexport function e_defaultPrevented(e) {\n  return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false\n}\nexport function e_stop(e) {e_preventDefault(e); e_stopPropagation(e)}\n\nexport function e_target(e) {return e.target || e.srcElement}\nexport function e_button(e) {\n  let b = e.which\n  if (b == null) {\n    if (e.button & 1) b = 1\n    else if (e.button & 2) b = 3\n    else if (e.button & 4) b = 2\n  }\n  if (mac && e.ctrlKey && b == 1) b = 3\n  return b\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/util/feature_detection.js",
    "content": "import { elt, range, removeChildren, removeChildrenAndAdd } from \"./dom.js\"\nimport { ie, ie_version } from \"./browser.js\"\n\n// Detect drag-and-drop\nexport let dragAndDrop = function() {\n  // There is *some* kind of drag-and-drop support in IE6-8, but I\n  // couldn't get it to work yet.\n  if (ie && ie_version < 9) return false\n  let div = elt('div')\n  return \"draggable\" in div || \"dragDrop\" in div\n}()\n\nlet zwspSupported\nexport function zeroWidthElement(measure) {\n  if (zwspSupported == null) {\n    let test = elt(\"span\", \"\\u200b\")\n    removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]))\n    if (measure.firstChild.offsetHeight != 0)\n      zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8)\n  }\n  let node = zwspSupported ? elt(\"span\", \"\\u200b\") :\n    elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\")\n  node.setAttribute(\"cm-text\", \"\")\n  return node\n}\n\n// Feature-detect IE's crummy client rect reporting for bidi text\nlet badBidiRects\nexport function hasBadBidiRects(measure) {\n  if (badBidiRects != null) return badBidiRects\n  let txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"))\n  let r0 = range(txt, 0, 1).getBoundingClientRect()\n  let r1 = range(txt, 1, 2).getBoundingClientRect()\n  removeChildren(measure)\n  if (!r0 || r0.left == r0.right) return false // Safari returns null in some cases (#2780)\n  return badBidiRects = (r1.right - r0.right < 3)\n}\n\n// See if \"\".split is the broken IE version, if so, provide an\n// alternative way to split lines.\nexport let splitLinesAuto = \"\\n\\nb\".split(/\\n/).length != 3 ? string => {\n  let pos = 0, result = [], l = string.length\n  while (pos <= l) {\n    let nl = string.indexOf(\"\\n\", pos)\n    if (nl == -1) nl = string.length\n    let line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl)\n    let rt = line.indexOf(\"\\r\")\n    if (rt != -1) {\n      result.push(line.slice(0, rt))\n      pos += rt + 1\n    } else {\n      result.push(line)\n      pos = nl + 1\n    }\n  }\n  return result\n} : string => string.split(/\\r\\n?|\\n/)\n\nexport let hasSelection = window.getSelection ? te => {\n  try { return te.selectionStart != te.selectionEnd }\n  catch(e) { return false }\n} : te => {\n  let range\n  try {range = te.ownerDocument.selection.createRange()}\n  catch(e) {}\n  if (!range || range.parentElement() != te) return false\n  return range.compareEndPoints(\"StartToEnd\", range) != 0\n}\n\nexport let hasCopyEvent = (() => {\n  let e = elt(\"div\")\n  if (\"oncopy\" in e) return true\n  e.setAttribute(\"oncopy\", \"return;\")\n  return typeof e.oncopy == \"function\"\n})()\n\nlet badZoomedRects = null\nexport function hasBadZoomedRects(measure) {\n  if (badZoomedRects != null) return badZoomedRects\n  let node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"))\n  let normal = node.getBoundingClientRect()\n  let fromRange = range(node, 0, 1).getBoundingClientRect()\n  return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/util/misc.js",
    "content": "export function bind(f) {\n  let args = Array.prototype.slice.call(arguments, 1)\n  return function(){return f.apply(null, args)}\n}\n\nexport function copyObj(obj, target, overwrite) {\n  if (!target) target = {}\n  for (let prop in obj)\n    if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n      target[prop] = obj[prop]\n  return target\n}\n\n// Counts the column offset in a string, taking tabs into account.\n// Used mostly to find indentation.\nexport function countColumn(string, end, tabSize, startIndex, startValue) {\n  if (end == null) {\n    end = string.search(/[^\\s\\u00a0]/)\n    if (end == -1) end = string.length\n  }\n  for (let i = startIndex || 0, n = startValue || 0;;) {\n    let nextTab = string.indexOf(\"\\t\", i)\n    if (nextTab < 0 || nextTab >= end)\n      return n + (end - i)\n    n += nextTab - i\n    n += tabSize - (n % tabSize)\n    i = nextTab + 1\n  }\n}\n\nexport class Delayed {\n  constructor() {\n    this.id = null\n    this.f = null\n    this.time = 0\n    this.handler = bind(this.onTimeout, this)\n  }\n  onTimeout(self) {\n    self.id = 0\n    if (self.time <= +new Date) {\n      self.f()\n    } else {\n      setTimeout(self.handler, self.time - +new Date)\n    }\n  }\n  set(ms, f) {\n    this.f = f\n    const time = +new Date + ms\n    if (!this.id || time < this.time) {\n      clearTimeout(this.id)\n      this.id = setTimeout(this.handler, ms)\n      this.time = time\n    }\n  }\n}\n\nexport function indexOf(array, elt) {\n  for (let i = 0; i < array.length; ++i)\n    if (array[i] == elt) return i\n  return -1\n}\n\n// Number of pixels added to scroller and sizer to hide scrollbar\nexport let scrollerGap = 50\n\n// Returned or thrown by various protocols to signal 'I'm not\n// handling this'.\nexport let Pass = {toString: function(){return \"CodeMirror.Pass\"}}\n\n// Reused option objects for setSelection & friends\nexport let sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"}\n\n// The inverse of countColumn -- find the offset that corresponds to\n// a particular column.\nexport function findColumn(string, goal, tabSize) {\n  for (let pos = 0, col = 0;;) {\n    let nextTab = string.indexOf(\"\\t\", pos)\n    if (nextTab == -1) nextTab = string.length\n    let skipped = nextTab - pos\n    if (nextTab == string.length || col + skipped >= goal)\n      return pos + Math.min(skipped, goal - col)\n    col += nextTab - pos\n    col += tabSize - (col % tabSize)\n    pos = nextTab + 1\n    if (col >= goal) return pos\n  }\n}\n\nlet spaceStrs = [\"\"]\nexport function spaceStr(n) {\n  while (spaceStrs.length <= n)\n    spaceStrs.push(lst(spaceStrs) + \" \")\n  return spaceStrs[n]\n}\n\nexport function lst(arr) { return arr[arr.length-1] }\n\nexport function map(array, f) {\n  let out = []\n  for (let i = 0; i < array.length; i++) out[i] = f(array[i], i)\n  return out\n}\n\nexport function insertSorted(array, value, score) {\n  let pos = 0, priority = score(value)\n  while (pos < array.length && score(array[pos]) <= priority) pos++\n  array.splice(pos, 0, value)\n}\n\nfunction nothing() {}\n\nexport function createObj(base, props) {\n  let inst\n  if (Object.create) {\n    inst = Object.create(base)\n  } else {\n    nothing.prototype = base\n    inst = new nothing()\n  }\n  if (props) copyObj(props, inst)\n  return inst\n}\n\nlet nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/\nexport function isWordCharBasic(ch) {\n  return /\\w/.test(ch) || ch > \"\\x80\" &&\n    (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))\n}\nexport function isWordChar(ch, helper) {\n  if (!helper) return isWordCharBasic(ch)\n  if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) return true\n  return helper.test(ch)\n}\n\nexport function isEmpty(obj) {\n  for (let n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false\n  return true\n}\n\n// Extending unicode characters. A series of a non-extending char +\n// any number of extending chars is treated as a single unit as far\n// as editing and measuring is concerned. This is not fully correct,\n// since some scripts/fonts/browsers also treat other configurations\n// of code points as a group.\nlet extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/\nexport function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }\n\n// Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.\nexport function skipExtendingChars(str, pos, dir) {\n  while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) pos += dir\n  return pos\n}\n\n// Returns the value from the range [`from`; `to`] that satisfies\n// `pred` and is closest to `from`. Assumes that at least `to`\n// satisfies `pred`. Supports `from` being greater than `to`.\nexport function findFirst(pred, from, to) {\n  // At any point we are certain `to` satisfies `pred`, don't know\n  // whether `from` does.\n  let dir = from > to ? -1 : 1\n  for (;;) {\n    if (from == to) return from\n    let midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF)\n    if (mid == from) return pred(mid) ? from : to\n    if (pred(mid)) to = mid\n    else from = mid + dir\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/src/util/operation_group.js",
    "content": "import { getHandlers } from \"./event.js\"\n\nlet operationGroup = null\n\nexport function pushOperation(op) {\n  if (operationGroup) {\n    operationGroup.ops.push(op)\n  } else {\n    op.ownsGroup = operationGroup = {\n      ops: [op],\n      delayedCallbacks: []\n    }\n  }\n}\n\nfunction fireCallbacksForOps(group) {\n  // Calls delayed callbacks and cursorActivity handlers until no\n  // new ones appear\n  let callbacks = group.delayedCallbacks, i = 0\n  do {\n    for (; i < callbacks.length; i++)\n      callbacks[i].call(null)\n    for (let j = 0; j < group.ops.length; j++) {\n      let op = group.ops[j]\n      if (op.cursorActivityHandlers)\n        while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n          op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm)\n    }\n  } while (i < callbacks.length)\n}\n\nexport function finishOperation(op, endCb) {\n  let group = op.ownsGroup\n  if (!group) return\n\n  try { fireCallbacksForOps(group) }\n  finally {\n    operationGroup = null\n    endCb(group)\n  }\n}\n\nlet orphanDelayedCallbacks = null\n\n// Often, we want to signal events at a point where we are in the\n// middle of some work, but don't want the handler to start calling\n// other methods on the editor, which might be in an inconsistent\n// state or simply not expect any other events to happen.\n// signalLater looks whether there are any handlers, and schedules\n// them to be executed when the last operation ends, or, if no\n// operation is active, when a timeout fires.\nexport function signalLater(emitter, type /*, values...*/) {\n  let arr = getHandlers(emitter, type)\n  if (!arr.length) return\n  let args = Array.prototype.slice.call(arguments, 2), list\n  if (operationGroup) {\n    list = operationGroup.delayedCallbacks\n  } else if (orphanDelayedCallbacks) {\n    list = orphanDelayedCallbacks\n  } else {\n    list = orphanDelayedCallbacks = []\n    setTimeout(fireOrphanDelayed, 0)\n  }\n  for (let i = 0; i < arr.length; ++i)\n    list.push(() => arr[i].apply(null, args))\n}\n\nfunction fireOrphanDelayed() {\n  let delayed = orphanDelayedCallbacks\n  orphanDelayedCallbacks = null\n  for (let i = 0; i < delayed.length; ++i) delayed[i]()\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/3024-day.css",
    "content": "/*\n\n    Name:       3024 day\n    Author:     Jan T. Sott (http://github.com/idleberg)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-3024-day.CodeMirror { background: #f7f7f7; color: #3a3432; }\n.cm-s-3024-day div.CodeMirror-selected { background: #d6d5d4; }\n\n.cm-s-3024-day .CodeMirror-line::selection, .cm-s-3024-day .CodeMirror-line > span::selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d6d5d4; }\n.cm-s-3024-day .CodeMirror-line::-moz-selection, .cm-s-3024-day .CodeMirror-line > span::-moz-selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d9d9d9; }\n\n.cm-s-3024-day .CodeMirror-gutters { background: #f7f7f7; border-right: 0px; }\n.cm-s-3024-day .CodeMirror-guttermarker { color: #db2d20; }\n.cm-s-3024-day .CodeMirror-guttermarker-subtle { color: #807d7c; }\n.cm-s-3024-day .CodeMirror-linenumber { color: #807d7c; }\n\n.cm-s-3024-day .CodeMirror-cursor { border-left: 1px solid #5c5855; }\n\n.cm-s-3024-day span.cm-comment { color: #cdab53; }\n.cm-s-3024-day span.cm-atom { color: #a16a94; }\n.cm-s-3024-day span.cm-number { color: #a16a94; }\n\n.cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute { color: #01a252; }\n.cm-s-3024-day span.cm-keyword { color: #db2d20; }\n.cm-s-3024-day span.cm-string { color: #fded02; }\n\n.cm-s-3024-day span.cm-variable { color: #01a252; }\n.cm-s-3024-day span.cm-variable-2 { color: #01a0e4; }\n.cm-s-3024-day span.cm-def { color: #e8bbd0; }\n.cm-s-3024-day span.cm-bracket { color: #3a3432; }\n.cm-s-3024-day span.cm-tag { color: #db2d20; }\n.cm-s-3024-day span.cm-link { color: #a16a94; }\n.cm-s-3024-day span.cm-error { background: #db2d20; color: #5c5855; }\n\n.cm-s-3024-day .CodeMirror-activeline-background { background: #e8f2ff; }\n.cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: #a16a94 !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/3024-night.css",
    "content": "/*\n\n    Name:       3024 night\n    Author:     Jan T. Sott (http://github.com/idleberg)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-3024-night.CodeMirror { background: #090300; color: #d6d5d4; }\n.cm-s-3024-night div.CodeMirror-selected { background: #3a3432; }\n.cm-s-3024-night .CodeMirror-line::selection, .cm-s-3024-night .CodeMirror-line > span::selection, .cm-s-3024-night .CodeMirror-line > span > span::selection { background: rgba(58, 52, 50, .99); }\n.cm-s-3024-night .CodeMirror-line::-moz-selection, .cm-s-3024-night .CodeMirror-line > span::-moz-selection, .cm-s-3024-night .CodeMirror-line > span > span::-moz-selection { background: rgba(58, 52, 50, .99); }\n.cm-s-3024-night .CodeMirror-gutters { background: #090300; border-right: 0px; }\n.cm-s-3024-night .CodeMirror-guttermarker { color: #db2d20; }\n.cm-s-3024-night .CodeMirror-guttermarker-subtle { color: #5c5855; }\n.cm-s-3024-night .CodeMirror-linenumber { color: #5c5855; }\n\n.cm-s-3024-night .CodeMirror-cursor { border-left: 1px solid #807d7c; }\n\n.cm-s-3024-night span.cm-comment { color: #cdab53; }\n.cm-s-3024-night span.cm-atom { color: #a16a94; }\n.cm-s-3024-night span.cm-number { color: #a16a94; }\n\n.cm-s-3024-night span.cm-property, .cm-s-3024-night span.cm-attribute { color: #01a252; }\n.cm-s-3024-night span.cm-keyword { color: #db2d20; }\n.cm-s-3024-night span.cm-string { color: #fded02; }\n\n.cm-s-3024-night span.cm-variable { color: #01a252; }\n.cm-s-3024-night span.cm-variable-2 { color: #01a0e4; }\n.cm-s-3024-night span.cm-def { color: #e8bbd0; }\n.cm-s-3024-night span.cm-bracket { color: #d6d5d4; }\n.cm-s-3024-night span.cm-tag { color: #db2d20; }\n.cm-s-3024-night span.cm-link { color: #a16a94; }\n.cm-s-3024-night span.cm-error { background: #db2d20; color: #807d7c; }\n\n.cm-s-3024-night .CodeMirror-activeline-background { background: #2F2F2F; }\n.cm-s-3024-night .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/abbott.css",
    "content": "/*\n * abbott.css\n * A warm, dark theme for prose and code, with pastels and pretty greens.\n *\n * Ported from abbott.vim (https://github.com/bcat/abbott.vim) version 2.1.\n * Original design and CodeMirror port by Jonathan Rascher.\n *\n * This theme shares the following color palette with the Vim color scheme.\n *\n * Brown shades:\n *   bistre: #231c14\n *   chocolate: #3c3022\n *   cocoa: #745d42\n *   vanilla_cream: #fef3b4\n *\n * Red shades:\n *   crimson: #d80450\n *   cinnabar: #f63f05\n *\n * Green shades:\n *   dark_olive: #273900\n *   forest_green: #24a507\n *   chartreuse: #a0ea00\n *   pastel_chartreuse: #d8ff84\n *\n * Yellow shades:\n *   marigold: #fbb32f\n *   lemon_meringue: #fbec5d\n *\n * Blue shades:\n *   cornflower_blue: #3f91f1\n *   periwinkle_blue: #8ccdf0\n *\n * Magenta shades:\n *   french_pink: #ec6c99\n *   lavender: #e6a2f3\n *\n * Cyan shades:\n *   zomp: #39a78d\n *   seafoam_green: #00ff7f\n */\n\n/* Style the UI: */\n\n/* Equivalent to Vim's Normal group. */\n.cm-s-abbott.CodeMirror {\n  background: #231c14 /* bistre */;\n  color: #d8ff84 /* pastel_chartreuse */;\n}\n\n/* Roughly equivalent to Vim's LineNr group. */\n.cm-s-abbott .CodeMirror-gutters {\n  background: #231c14 /* bistre */;\n  border: none;\n}\n.cm-s-abbott .CodeMirror-linenumber { color: #fbec5d /* lemon_meringue */; }\n\n.cm-s-abbott .CodeMirror-guttermarker { color: #f63f05 /* cinnabar */; }\n\n/* Roughly equivalent to Vim's FoldColumn group. */\n.cm-s-abbott .CodeMirror-guttermarker-subtle { color: #fbb32f /* marigold */; }\n\n/*\n * Roughly equivalent to Vim's CursorColumn group. (We use a brighter color\n * since Vim's cursorcolumn option highlights a whole column, whereas\n * CodeMirror's rule just highlights a thin line.)\n */\n.cm-s-abbott .CodeMirror-ruler { border-color: #745d42 /* cocoa */; }\n\n/* Equivalent to Vim's Cursor group in insert mode. */\n.cm-s-abbott .CodeMirror-cursor { border-color: #a0ea00 /* chartreuse */; }\n\n/* Equivalent to Vim's Cursor group in normal mode. */\n.cm-s-abbott.cm-fat-cursor .CodeMirror-cursor,\n.cm-s-abbott .cm-animate-fat-cursor {\n  /*\n   * CodeMirror doesn't allow changing the foreground color of the character\n   * under the cursor, so we can't use a reverse video effect for the cursor.\n   * Instead, make it semitransparent.\n   */\n  background: rgba(160, 234, 0, 0.5) /* chartreuse */;\n}\n.cm-s-abbott.cm-fat-cursor .CodeMirror-cursors {\n  /*\n   * Boost the z-index so the fat cursor shows up on top of text and\n   * matchingbracket/matchingtag highlights.\n   */\n  z-index: 3;\n}\n\n/* Equivalent to Vim's Cursor group in replace mode. */\n.cm-s-abbott .CodeMirror-overwrite .CodeMirror-cursor {\n  border-bottom: 1px solid #a0ea00 /* chartreuse */;\n  border-left: none;\n  width: auto;\n}\n\n/* Roughly equivalent to Vim's CursorIM group. */\n.cm-s-abbott .CodeMirror-secondarycursor {\n  border-color: #00ff7f /* seafoam_green */;\n}\n\n/* Roughly equivalent to Vim's Visual group. */\n.cm-s-abbott .CodeMirror-selected,\n.cm-s-abbott.CodeMirror-focused .CodeMirror-selected {\n  background: #273900 /* dark_olive */;\n}\n.cm-s-abbott .CodeMirror-line::selection,\n.cm-s-abbott .CodeMirror-line > span::selection,\n.cm-s-abbott .CodeMirror-line > span > span::selection {\n  background: #273900 /* dark_olive */;\n}\n.cm-s-abbott .CodeMirror-line::-moz-selection,\n.cm-s-abbott .CodeMirror-line > span::-moz-selection,\n.cm-s-abbott .CodeMirror-line > span > span::-moz-selection {\n  background: #273900 /* dark_olive */;\n}\n\n/* Roughly equivalent to Vim's SpecialKey group. */\n.cm-s-abbott .cm-tab { color: #00ff7f /* seafoam_green */; }\n\n/* Equivalent to Vim's Search group. */\n.cm-s-abbott .cm-searching {\n  background: #fef3b4 /* vanilla_cream */ !important;\n  color: #231c14 /* bistre */ !important;\n}\n\n/* Style syntax highlighting modes: */\n\n/* Equivalent to Vim's Comment group. */\n.cm-s-abbott span.cm-comment {\n  color: #fbb32f /* marigold */;\n  font-style: italic;\n}\n\n/* Equivalent to Vim's String group. */\n.cm-s-abbott span.cm-string,\n.cm-s-abbott span.cm-string-2 {\n  color: #e6a2f3 /* lavender */;\n}\n\n/* Equivalent to Vim's Constant group. */\n.cm-s-abbott span.cm-number,\n.cm-s-abbott span.cm-string.cm-url { color: #f63f05 /* cinnabar */; }\n\n/* Roughly equivalent to Vim's SpecialKey group. */\n.cm-s-abbott span.cm-invalidchar { color: #00ff7f /* seafoam_green */; }\n\n/* Equivalent to Vim's Special group. */\n.cm-s-abbott span.cm-atom { color: #fef3b4 /* vanilla_cream */; }\n\n/* Equivalent to Vim's Delimiter group. */\n.cm-s-abbott span.cm-bracket,\n.cm-s-abbott span.cm-punctuation {\n  color: #fef3b4 /* vanilla_cream */;\n}\n\n/* Equivalent Vim's Operator group. */\n.cm-s-abbott span.cm-operator { font-weight: bold; }\n\n/* Roughly equivalent to Vim's Identifier group. */\n.cm-s-abbott span.cm-def,\n.cm-s-abbott span.cm-variable,\n.cm-s-abbott span.cm-variable-2,\n.cm-s-abbott span.cm-variable-3 {\n  color: #8ccdf0 /* periwinkle_blue */;\n}\n\n/* Roughly equivalent to Vim's Function group. */\n.cm-s-abbott span.cm-builtin,\n.cm-s-abbott span.cm-property,\n.cm-s-abbott span.cm-qualifier {\n  color: #3f91f1 /* cornflower_blue */;\n}\n\n/* Equivalent to Vim's Type group. */\n.cm-s-abbott span.cm-type { color: #24a507 /* forest_green */; }\n\n/* Equivalent to Vim's Keyword group. */\n.cm-s-abbott span.cm-keyword {\n  color: #d80450 /* crimson */;\n  font-weight: bold;\n}\n\n/* Equivalent to Vim's PreProc group. */\n.cm-s-abbott span.cm-meta { color: #ec6c99 /* french_pink */; }\n\n/* Equivalent to Vim's htmlTagName group (linked to Statement). */\n.cm-s-abbott span.cm-tag {\n  color: #d80450 /* crimson */;\n  font-weight: bold;\n}\n\n/* Equivalent to Vim's htmlArg group (linked to Type). */\n.cm-s-abbott span.cm-attribute { color: #24a507 /* forest_green */; }\n\n/* Equivalent to Vim's htmlH1, markdownH1, etc. groups (linked to Title). */\n.cm-s-abbott span.cm-header {\n  color: #d80450 /* crimson */;\n  font-weight: bold;\n}\n\n/* Equivalent to Vim's markdownRule group (linked to PreProc). */\n.cm-s-abbott span.cm-hr { color: #ec6c99 /* french_pink */; }\n\n/* Roughly equivalent to Vim's Underlined group. */\n.cm-s-abbott span.cm-link { color: #e6a2f3 /* lavender */; }\n\n/* Equivalent to Vim's diffRemoved group. */\n.cm-s-abbott span.cm-negative {\n  background: #d80450 /* crimson */;\n  color: #231c14 /* bistre */;\n}\n\n/* Equivalent to Vim's diffAdded group. */\n.cm-s-abbott span.cm-positive {\n  background: #a0ea00 /* chartreuse */;\n  color: #231c14 /* bistre */;\n  font-weight: bold;\n}\n\n/* Equivalent to Vim's Error group. */\n.cm-s-abbott span.cm-error {\n  background: #d80450 /* crimson */;\n  color: #231c14 /* bistre */;\n}\n\n/* Style addons: */\n\n/* Equivalent to Vim's MatchParen group. */\n.cm-s-abbott span.CodeMirror-matchingbracket {\n  background: #745d42 /* cocoa */ !important;\n  color: #231c14 /* bistre */ !important;\n  font-weight: bold;\n}\n\n/*\n * Roughly equivalent to Vim's Error group. (Vim doesn't seem to have a direct\n * equivalent in its own matchparen plugin, but many syntax highlighting plugins\n * mark mismatched brackets as Error.)\n */\n.cm-s-abbott span.CodeMirror-nonmatchingbracket {\n  background: #d80450 /* crimson */ !important;\n  color: #231c14 /* bistre */ !important;\n}\n\n.cm-s-abbott .CodeMirror-matchingtag,\n.cm-s-abbott .cm-matchhighlight {\n  outline: 1px solid #39a78d /* zomp */;\n}\n\n/* Equivalent to Vim's CursorLine group. */\n.cm-s-abbott .CodeMirror-activeline-background,\n.cm-s-abbott .CodeMirror-activeline-gutter {\n  background: #3c3022 /* chocolate */;\n}\n\n/* Equivalent to Vim's CursorLineNr group. */\n.cm-s-abbott .CodeMirror-activeline-gutter .CodeMirror-linenumber {\n  color: #d8ff84 /* pastel_chartreuse */;\n  font-weight: bold;\n}\n\n/* Roughly equivalent to Vim's Folded group. */\n.cm-s-abbott .CodeMirror-foldmarker {\n  color: #f63f05 /* cinnabar */;\n  text-shadow: none;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/abcdef.css",
    "content": ".cm-s-abcdef.CodeMirror { background: #0f0f0f; color: #defdef; }\n.cm-s-abcdef div.CodeMirror-selected { background: #515151; }\n.cm-s-abcdef .CodeMirror-line::selection, .cm-s-abcdef .CodeMirror-line > span::selection, .cm-s-abcdef .CodeMirror-line > span > span::selection { background: rgba(56, 56, 56, 0.99); }\n.cm-s-abcdef .CodeMirror-line::-moz-selection, .cm-s-abcdef .CodeMirror-line > span::-moz-selection, .cm-s-abcdef .CodeMirror-line > span > span::-moz-selection { background: rgba(56, 56, 56, 0.99); }\n.cm-s-abcdef .CodeMirror-gutters { background: #555; border-right: 2px solid #314151; }\n.cm-s-abcdef .CodeMirror-guttermarker { color: #222; }\n.cm-s-abcdef .CodeMirror-guttermarker-subtle { color: azure; }\n.cm-s-abcdef .CodeMirror-linenumber { color: #FFFFFF; }\n.cm-s-abcdef .CodeMirror-cursor { border-left: 1px solid #00FF00; }\n\n.cm-s-abcdef span.cm-keyword { color: darkgoldenrod; font-weight: bold; }\n.cm-s-abcdef span.cm-atom { color: #77F; }\n.cm-s-abcdef span.cm-number { color: violet; }\n.cm-s-abcdef span.cm-def { color: #fffabc; }\n.cm-s-abcdef span.cm-variable { color: #abcdef; }\n.cm-s-abcdef span.cm-variable-2 { color: #cacbcc; }\n.cm-s-abcdef span.cm-variable-3, .cm-s-abcdef span.cm-type { color: #def; }\n.cm-s-abcdef span.cm-property { color: #fedcba; }\n.cm-s-abcdef span.cm-operator { color: #ff0; }\n.cm-s-abcdef span.cm-comment { color: #7a7b7c; font-style: italic;}\n.cm-s-abcdef span.cm-string { color: #2b4; }\n.cm-s-abcdef span.cm-meta { color: #C9F; }\n.cm-s-abcdef span.cm-qualifier { color: #FFF700; }\n.cm-s-abcdef span.cm-builtin { color: #30aabc; }\n.cm-s-abcdef span.cm-bracket { color: #8a8a8a; }\n.cm-s-abcdef span.cm-tag { color: #FFDD44; }\n.cm-s-abcdef span.cm-attribute { color: #DDFF00; }\n.cm-s-abcdef span.cm-error { color: #FF0000; }\n.cm-s-abcdef span.cm-header { color: aquamarine; font-weight: bold; }\n.cm-s-abcdef span.cm-link { color: blueviolet; }\n\n.cm-s-abcdef .CodeMirror-activeline-background { background: #314151; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/ambiance-mobile.css",
    "content": ".cm-s-ambiance.CodeMirror {\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/ambiance.css",
    "content": "/* ambiance theme for codemirror */\n\n/* Color scheme */\n\n.cm-s-ambiance .cm-header { color: blue; }\n.cm-s-ambiance .cm-quote { color: #24C2C7; }\n\n.cm-s-ambiance .cm-keyword { color: #cda869; }\n.cm-s-ambiance .cm-atom { color: #CF7EA9; }\n.cm-s-ambiance .cm-number { color: #78CF8A; }\n.cm-s-ambiance .cm-def { color: #aac6e3; }\n.cm-s-ambiance .cm-variable { color: #ffb795; }\n.cm-s-ambiance .cm-variable-2 { color: #eed1b3; }\n.cm-s-ambiance .cm-variable-3, .cm-s-ambiance .cm-type { color: #faded3; }\n.cm-s-ambiance .cm-property { color: #eed1b3; }\n.cm-s-ambiance .cm-operator { color: #fa8d6a; }\n.cm-s-ambiance .cm-comment { color: #555; font-style:italic; }\n.cm-s-ambiance .cm-string { color: #8f9d6a; }\n.cm-s-ambiance .cm-string-2 { color: #9d937c; }\n.cm-s-ambiance .cm-meta { color: #D2A8A1; }\n.cm-s-ambiance .cm-qualifier { color: yellow; }\n.cm-s-ambiance .cm-builtin { color: #9999cc; }\n.cm-s-ambiance .cm-bracket { color: #24C2C7; }\n.cm-s-ambiance .cm-tag { color: #fee4ff; }\n.cm-s-ambiance .cm-attribute { color: #9B859D; }\n.cm-s-ambiance .cm-hr { color: pink; }\n.cm-s-ambiance .cm-link { color: #F4C20B; }\n.cm-s-ambiance .cm-special { color: #FF9D00; }\n.cm-s-ambiance .cm-error { color: #AF2018; }\n\n.cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; }\n.cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; }\n\n.cm-s-ambiance div.CodeMirror-selected { background: rgba(255, 255, 255, 0.15); }\n.cm-s-ambiance.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-ambiance .CodeMirror-line::selection, .cm-s-ambiance .CodeMirror-line > span::selection, .cm-s-ambiance .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-ambiance .CodeMirror-line::-moz-selection, .cm-s-ambiance .CodeMirror-line > span::-moz-selection, .cm-s-ambiance .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n\n/* Editor styling */\n\n.cm-s-ambiance.CodeMirror {\n  line-height: 1.40em;\n  color: #E6E1DC;\n  background-color: #202020;\n  -webkit-box-shadow: inset 0 0 10px black;\n  -moz-box-shadow: inset 0 0 10px black;\n  box-shadow: inset 0 0 10px black;\n}\n\n.cm-s-ambiance .CodeMirror-gutters {\n  background: #3D3D3D;\n  border-right: 1px solid #4D4D4D;\n  box-shadow: 0 10px 20px black;\n}\n\n.cm-s-ambiance .CodeMirror-linenumber {\n  text-shadow: 0px 1px 1px #4d4d4d;\n  color: #111;\n  padding: 0 5px;\n}\n\n.cm-s-ambiance .CodeMirror-guttermarker { color: #aaa; }\n.cm-s-ambiance .CodeMirror-guttermarker-subtle { color: #111; }\n\n.cm-s-ambiance .CodeMirror-cursor { border-left: 1px solid #7991E8; }\n\n.cm-s-ambiance .CodeMirror-activeline-background {\n  background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031);\n}\n\n.cm-s-ambiance.CodeMirror,\n.cm-s-ambiance .CodeMirror-gutters {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC\");\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/ayu-dark.css",
    "content": "/* Based on https://github.com/dempfi/ayu */\n\n.cm-s-ayu-dark.CodeMirror { background: #0a0e14; color: #b3b1ad; }\n.cm-s-ayu-dark div.CodeMirror-selected { background: #273747; }\n.cm-s-ayu-dark .CodeMirror-line::selection, .cm-s-ayu-dark .CodeMirror-line > span::selection, .cm-s-ayu-dark .CodeMirror-line > span > span::selection { background: rgba(39, 55, 71, 99); }\n.cm-s-ayu-dark .CodeMirror-line::-moz-selection, .cm-s-ayu-dark .CodeMirror-line > span::-moz-selection, .cm-s-ayu-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(39, 55, 71, 99); }\n.cm-s-ayu-dark .CodeMirror-gutters { background: #0a0e14; border-right: 0px; }\n.cm-s-ayu-dark .CodeMirror-guttermarker { color: white; }\n.cm-s-ayu-dark .CodeMirror-guttermarker-subtle { color: #3d424d; }\n.cm-s-ayu-dark .CodeMirror-linenumber { color: #3d424d; }\n.cm-s-ayu-dark .CodeMirror-cursor { border-left: 1px solid #e6b450; }\n.cm-s-ayu-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #a2a8a175 !important; }\n.cm-s-ayu-dark .cm-animate-fat-cursor { background-color: #a2a8a175 !important; }\n\n.cm-s-ayu-dark span.cm-comment { color: #626a73; }\n.cm-s-ayu-dark span.cm-atom { color: #ae81ff; }\n.cm-s-ayu-dark span.cm-number { color: #e6b450; }\n\n.cm-s-ayu-dark span.cm-comment.cm-attribute { color: #ffb454; }\n.cm-s-ayu-dark span.cm-comment.cm-def { color: rgba(57, 186, 230, 80); }\n.cm-s-ayu-dark span.cm-comment.cm-tag { color: #39bae6; }\n.cm-s-ayu-dark span.cm-comment.cm-type { color: #5998a6; }\n\n.cm-s-ayu-dark span.cm-property, .cm-s-ayu-dark span.cm-attribute { color: #ffb454; }  \n.cm-s-ayu-dark span.cm-keyword { color: #ff8f40; } \n.cm-s-ayu-dark span.cm-builtin { color: #e6b450; }\n.cm-s-ayu-dark span.cm-string { color: #c2d94c; }\n\n.cm-s-ayu-dark span.cm-variable { color: #b3b1ad; }\n.cm-s-ayu-dark span.cm-variable-2 { color: #f07178; }\n.cm-s-ayu-dark span.cm-variable-3 { color: #39bae6; }\n.cm-s-ayu-dark span.cm-type { color: #ff8f40; }\n.cm-s-ayu-dark span.cm-def { color: #ffee99; }\n.cm-s-ayu-dark span.cm-bracket { color: #f8f8f2; }\n.cm-s-ayu-dark span.cm-tag { color: rgba(57, 186, 230, 80); }\n.cm-s-ayu-dark span.cm-header { color: #c2d94c; }\n.cm-s-ayu-dark span.cm-link { color: #39bae6; }\n.cm-s-ayu-dark span.cm-error { color: #ff3333; } \n\n.cm-s-ayu-dark .CodeMirror-activeline-background { background: #01060e; }\n.cm-s-ayu-dark .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/ayu-mirage.css",
    "content": "/* Based on https://github.com/dempfi/ayu */\n\n.cm-s-ayu-mirage.CodeMirror { background: #1f2430; color: #cbccc6; }\n.cm-s-ayu-mirage div.CodeMirror-selected { background: #34455a; }\n.cm-s-ayu-mirage .CodeMirror-line::selection, .cm-s-ayu-mirage .CodeMirror-line > span::selection, .cm-s-ayu-mirage .CodeMirror-line > span > span::selection { background: #34455a; }\n.cm-s-ayu-mirage .CodeMirror-line::-moz-selection, .cm-s-ayu-mirage .CodeMirror-line > span::-moz-selection, .cm-s-ayu-mirage .CodeMirror-line > span > span::-moz-selection { background: rgba(25, 30, 42, 99); }\n.cm-s-ayu-mirage .CodeMirror-gutters { background: #1f2430; border-right: 0px; }\n.cm-s-ayu-mirage .CodeMirror-guttermarker { color: white; }\n.cm-s-ayu-mirage .CodeMirror-guttermarker-subtle { color:  rgba(112, 122, 140, 66); }\n.cm-s-ayu-mirage .CodeMirror-linenumber { color: rgba(61, 66, 77, 99); }\n.cm-s-ayu-mirage .CodeMirror-cursor { border-left: 1px solid #ffcc66;  }\n.cm-s-ayu-mirage.cm-fat-cursor .CodeMirror-cursor {background-color: #a2a8a175 !important;}\n.cm-s-ayu-mirage .cm-animate-fat-cursor { background-color: #a2a8a175 !important; }\n\n.cm-s-ayu-mirage span.cm-comment { color: #5c6773; font-style:italic; }\n.cm-s-ayu-mirage span.cm-atom { color: #ae81ff; }\n.cm-s-ayu-mirage span.cm-number { color: #ffcc66; }\n\n.cm-s-ayu-mirage span.cm-comment.cm-attribute { color: #ffd580; }\n.cm-s-ayu-mirage span.cm-comment.cm-def { color: #d4bfff; }\n.cm-s-ayu-mirage span.cm-comment.cm-tag { color: #5ccfe6; }\n.cm-s-ayu-mirage span.cm-comment.cm-type { color: #5998a6; }\n\n.cm-s-ayu-mirage span.cm-property { color: #f29e74; }\n.cm-s-ayu-mirage span.cm-attribute { color: #ffd580; }  \n.cm-s-ayu-mirage span.cm-keyword { color: #ffa759; } \n.cm-s-ayu-mirage span.cm-builtin { color: #ffcc66; }\n.cm-s-ayu-mirage span.cm-string { color: #bae67e; }\n\n.cm-s-ayu-mirage span.cm-variable { color: #cbccc6; }\n.cm-s-ayu-mirage span.cm-variable-2 { color: #f28779; }\n.cm-s-ayu-mirage span.cm-variable-3 { color: #5ccfe6; }\n.cm-s-ayu-mirage span.cm-type { color: #ffa759; }\n.cm-s-ayu-mirage span.cm-def { color: #ffd580; }\n.cm-s-ayu-mirage span.cm-bracket { color: rgba(92, 207, 230, 80); }\n.cm-s-ayu-mirage span.cm-tag { color: #5ccfe6; }\n.cm-s-ayu-mirage span.cm-header { color: #bae67e; }\n.cm-s-ayu-mirage span.cm-link { color: #5ccfe6; }\n.cm-s-ayu-mirage span.cm-error { color: #ff3333; } \n\n.cm-s-ayu-mirage .CodeMirror-activeline-background { background: #191e2a; }\n.cm-s-ayu-mirage .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/base16-dark.css",
    "content": "/*\n\n    Name:       Base16 Default Dark\n    Author:     Chris Kempson (http://chriskempson.com)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-base16-dark.CodeMirror { background: #151515; color: #e0e0e0; }\n.cm-s-base16-dark div.CodeMirror-selected { background: #303030; }\n.cm-s-base16-dark .CodeMirror-line::selection, .cm-s-base16-dark .CodeMirror-line > span::selection, .cm-s-base16-dark .CodeMirror-line > span > span::selection { background: rgba(48, 48, 48, .99); }\n.cm-s-base16-dark .CodeMirror-line::-moz-selection, .cm-s-base16-dark .CodeMirror-line > span::-moz-selection, .cm-s-base16-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(48, 48, 48, .99); }\n.cm-s-base16-dark .CodeMirror-gutters { background: #151515; border-right: 0px; }\n.cm-s-base16-dark .CodeMirror-guttermarker { color: #ac4142; }\n.cm-s-base16-dark .CodeMirror-guttermarker-subtle { color: #505050; }\n.cm-s-base16-dark .CodeMirror-linenumber { color: #505050; }\n.cm-s-base16-dark .CodeMirror-cursor { border-left: 1px solid #b0b0b0; }\n.cm-s-base16-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #8e8d8875 !important; }\n.cm-s-base16-dark .cm-animate-fat-cursor { background-color: #8e8d8875 !important; }\n\n.cm-s-base16-dark span.cm-comment { color: #8f5536; }\n.cm-s-base16-dark span.cm-atom { color: #aa759f; }\n.cm-s-base16-dark span.cm-number { color: #aa759f; }\n\n.cm-s-base16-dark span.cm-property, .cm-s-base16-dark span.cm-attribute { color: #90a959; }\n.cm-s-base16-dark span.cm-keyword { color: #ac4142; }\n.cm-s-base16-dark span.cm-string { color: #f4bf75; }\n\n.cm-s-base16-dark span.cm-variable { color: #90a959; }\n.cm-s-base16-dark span.cm-variable-2 { color: #6a9fb5; }\n.cm-s-base16-dark span.cm-def { color: #d28445; }\n.cm-s-base16-dark span.cm-bracket { color: #e0e0e0; }\n.cm-s-base16-dark span.cm-tag { color: #ac4142; }\n.cm-s-base16-dark span.cm-link { color: #aa759f; }\n.cm-s-base16-dark span.cm-error { background: #ac4142; color: #b0b0b0; }\n\n.cm-s-base16-dark .CodeMirror-activeline-background { background: #202020; }\n.cm-s-base16-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/base16-light.css",
    "content": "/*\n\n    Name:       Base16 Default Light\n    Author:     Chris Kempson (http://chriskempson.com)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-base16-light.CodeMirror { background: #f5f5f5; color: #202020; }\n.cm-s-base16-light div.CodeMirror-selected { background: #e0e0e0; }\n.cm-s-base16-light .CodeMirror-line::selection, .cm-s-base16-light .CodeMirror-line > span::selection, .cm-s-base16-light .CodeMirror-line > span > span::selection { background: #e0e0e0; }\n.cm-s-base16-light .CodeMirror-line::-moz-selection, .cm-s-base16-light .CodeMirror-line > span::-moz-selection, .cm-s-base16-light .CodeMirror-line > span > span::-moz-selection { background: #e0e0e0; }\n.cm-s-base16-light .CodeMirror-gutters { background: #f5f5f5; border-right: 0px; }\n.cm-s-base16-light .CodeMirror-guttermarker { color: #ac4142; }\n.cm-s-base16-light .CodeMirror-guttermarker-subtle { color: #b0b0b0; }\n.cm-s-base16-light .CodeMirror-linenumber { color: #b0b0b0; }\n.cm-s-base16-light .CodeMirror-cursor { border-left: 1px solid #505050; }\n\n.cm-s-base16-light span.cm-comment { color: #8f5536; }\n.cm-s-base16-light span.cm-atom { color: #aa759f; }\n.cm-s-base16-light span.cm-number { color: #aa759f; }\n\n.cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute { color: #90a959; }\n.cm-s-base16-light span.cm-keyword { color: #ac4142; }\n.cm-s-base16-light span.cm-string { color: #f4bf75; }\n\n.cm-s-base16-light span.cm-variable { color: #90a959; }\n.cm-s-base16-light span.cm-variable-2 { color: #6a9fb5; }\n.cm-s-base16-light span.cm-def { color: #d28445; }\n.cm-s-base16-light span.cm-bracket { color: #202020; }\n.cm-s-base16-light span.cm-tag { color: #ac4142; }\n.cm-s-base16-light span.cm-link { color: #aa759f; }\n.cm-s-base16-light span.cm-error { background: #ac4142; color: #505050; }\n\n.cm-s-base16-light .CodeMirror-activeline-background { background: #DDDCDC; }\n.cm-s-base16-light .CodeMirror-matchingbracket { color: #f5f5f5 !important; background-color: #6A9FB5 !important}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/bespin.css",
    "content": "/*\n\n    Name:       Bespin\n    Author:     Mozilla / Jan T. Sott\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-bespin.CodeMirror {background: #28211c; color: #9d9b97;}\n.cm-s-bespin div.CodeMirror-selected {background: #36312e !important;}\n.cm-s-bespin .CodeMirror-gutters {background: #28211c; border-right: 0px;}\n.cm-s-bespin .CodeMirror-linenumber {color: #666666;}\n.cm-s-bespin .CodeMirror-cursor {border-left: 1px solid #797977 !important;}\n\n.cm-s-bespin span.cm-comment {color: #937121;}\n.cm-s-bespin span.cm-atom {color: #9b859d;}\n.cm-s-bespin span.cm-number {color: #9b859d;}\n\n.cm-s-bespin span.cm-property, .cm-s-bespin span.cm-attribute {color: #54be0d;}\n.cm-s-bespin span.cm-keyword {color: #cf6a4c;}\n.cm-s-bespin span.cm-string {color: #f9ee98;}\n\n.cm-s-bespin span.cm-variable {color: #54be0d;}\n.cm-s-bespin span.cm-variable-2 {color: #5ea6ea;}\n.cm-s-bespin span.cm-def {color: #cf7d34;}\n.cm-s-bespin span.cm-error {background: #cf6a4c; color: #797977;}\n.cm-s-bespin span.cm-bracket {color: #9d9b97;}\n.cm-s-bespin span.cm-tag {color: #cf6a4c;}\n.cm-s-bespin span.cm-link {color: #9b859d;}\n\n.cm-s-bespin .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n.cm-s-bespin .CodeMirror-activeline-background { background: #404040; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/blackboard.css",
    "content": "/* Port of TextMate's Blackboard theme */\n\n.cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; }\n.cm-s-blackboard div.CodeMirror-selected { background: #253B76; }\n.cm-s-blackboard .CodeMirror-line::selection, .cm-s-blackboard .CodeMirror-line > span::selection, .cm-s-blackboard .CodeMirror-line > span > span::selection { background: rgba(37, 59, 118, .99); }\n.cm-s-blackboard .CodeMirror-line::-moz-selection, .cm-s-blackboard .CodeMirror-line > span::-moz-selection, .cm-s-blackboard .CodeMirror-line > span > span::-moz-selection { background: rgba(37, 59, 118, .99); }\n.cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; }\n.cm-s-blackboard .CodeMirror-guttermarker { color: #FBDE2D; }\n.cm-s-blackboard .CodeMirror-guttermarker-subtle { color: #888; }\n.cm-s-blackboard .CodeMirror-linenumber { color: #888; }\n.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7; }\n\n.cm-s-blackboard .cm-keyword { color: #FBDE2D; }\n.cm-s-blackboard .cm-atom { color: #D8FA3C; }\n.cm-s-blackboard .cm-number { color: #D8FA3C; }\n.cm-s-blackboard .cm-def { color: #8DA6CE; }\n.cm-s-blackboard .cm-variable { color: #FF6400; }\n.cm-s-blackboard .cm-operator { color: #FBDE2D; }\n.cm-s-blackboard .cm-comment { color: #AEAEAE; }\n.cm-s-blackboard .cm-string { color: #61CE3C; }\n.cm-s-blackboard .cm-string-2 { color: #61CE3C; }\n.cm-s-blackboard .cm-meta { color: #D8FA3C; }\n.cm-s-blackboard .cm-builtin { color: #8DA6CE; }\n.cm-s-blackboard .cm-tag { color: #8DA6CE; }\n.cm-s-blackboard .cm-attribute { color: #8DA6CE; }\n.cm-s-blackboard .cm-header { color: #FF6400; }\n.cm-s-blackboard .cm-hr { color: #AEAEAE; }\n.cm-s-blackboard .cm-link { color: #8DA6CE; }\n.cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; }\n\n.cm-s-blackboard .CodeMirror-activeline-background { background: #3C3636; }\n.cm-s-blackboard .CodeMirror-matchingbracket { outline:1px solid grey;color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/cobalt.css",
    "content": ".cm-s-cobalt.CodeMirror { background: #002240; color: white; }\n.cm-s-cobalt div.CodeMirror-selected { background: #b36539; }\n.cm-s-cobalt .CodeMirror-line::selection, .cm-s-cobalt .CodeMirror-line > span::selection, .cm-s-cobalt .CodeMirror-line > span > span::selection { background: rgba(179, 101, 57, .99); }\n.cm-s-cobalt .CodeMirror-line::-moz-selection, .cm-s-cobalt .CodeMirror-line > span::-moz-selection, .cm-s-cobalt .CodeMirror-line > span > span::-moz-selection { background: rgba(179, 101, 57, .99); }\n.cm-s-cobalt .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; }\n.cm-s-cobalt .CodeMirror-guttermarker { color: #ffee80; }\n.cm-s-cobalt .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-cobalt .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-cobalt span.cm-comment { color: #08f; }\n.cm-s-cobalt span.cm-atom { color: #845dc4; }\n.cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; }\n.cm-s-cobalt span.cm-keyword { color: #ffee80; }\n.cm-s-cobalt span.cm-string { color: #3ad900; }\n.cm-s-cobalt span.cm-meta { color: #ff9d00; }\n.cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; }\n.cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def, .cm-s-cobalt .cm-type { color: white; }\n.cm-s-cobalt span.cm-bracket { color: #d8d8d8; }\n.cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; }\n.cm-s-cobalt span.cm-link { color: #845dc4; }\n.cm-s-cobalt span.cm-error { color: #9d1e15; }\n\n.cm-s-cobalt .CodeMirror-activeline-background { background: #002D57; }\n.cm-s-cobalt .CodeMirror-matchingbracket { outline:1px solid grey;color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/colorforth.css",
    "content": ".cm-s-colorforth.CodeMirror { background: #000000; color: #f8f8f8; }\n.cm-s-colorforth .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; }\n.cm-s-colorforth .CodeMirror-guttermarker { color: #FFBD40; }\n.cm-s-colorforth .CodeMirror-guttermarker-subtle { color: #78846f; }\n.cm-s-colorforth .CodeMirror-linenumber { color: #bababa; }\n.cm-s-colorforth .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-colorforth span.cm-comment     { color: #ededed; }\n.cm-s-colorforth span.cm-def         { color: #ff1c1c; font-weight:bold; }\n.cm-s-colorforth span.cm-keyword     { color: #ffd900; }\n.cm-s-colorforth span.cm-builtin     { color: #00d95a; }\n.cm-s-colorforth span.cm-variable    { color: #73ff00; }\n.cm-s-colorforth span.cm-string      { color: #007bff; }\n.cm-s-colorforth span.cm-number      { color: #00c4ff; }\n.cm-s-colorforth span.cm-atom        { color: #606060; }\n\n.cm-s-colorforth span.cm-variable-2  { color: #EEE; }\n.cm-s-colorforth span.cm-variable-3, .cm-s-colorforth span.cm-type { color: #DDD; }\n.cm-s-colorforth span.cm-property    {}\n.cm-s-colorforth span.cm-operator    {}\n\n.cm-s-colorforth span.cm-meta        { color: yellow; }\n.cm-s-colorforth span.cm-qualifier   { color: #FFF700; }\n.cm-s-colorforth span.cm-bracket     { color: #cc7; }\n.cm-s-colorforth span.cm-tag         { color: #FFBD40; }\n.cm-s-colorforth span.cm-attribute   { color: #FFF700; }\n.cm-s-colorforth span.cm-error       { color: #f00; }\n\n.cm-s-colorforth div.CodeMirror-selected { background: #333d53; }\n\n.cm-s-colorforth span.cm-compilation { background: rgba(255, 255, 255, 0.12); }\n\n.cm-s-colorforth .CodeMirror-activeline-background { background: #253540; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/darcula.css",
    "content": "/**\n    Name: IntelliJ IDEA darcula theme\n    From IntelliJ IDEA by JetBrains\n */\n\n.cm-s-darcula  { font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;}\n.cm-s-darcula.CodeMirror { background: #2B2B2B; color: #A9B7C6; }\n\n.cm-s-darcula span.cm-meta { color: #BBB529; }\n.cm-s-darcula span.cm-number { color: #6897BB; }\n.cm-s-darcula span.cm-keyword { color: #CC7832; line-height: 1em; font-weight: bold; }\n.cm-s-darcula span.cm-def { color: #A9B7C6; font-style: italic; }\n.cm-s-darcula span.cm-variable { color: #A9B7C6; }\n.cm-s-darcula span.cm-variable-2 { color: #A9B7C6; }\n.cm-s-darcula span.cm-variable-3 { color: #9876AA; }\n.cm-s-darcula span.cm-type { color: #AABBCC; font-weight: bold; }\n.cm-s-darcula span.cm-property { color: #FFC66D; }\n.cm-s-darcula span.cm-operator { color: #A9B7C6; }\n.cm-s-darcula span.cm-string { color: #6A8759; }\n.cm-s-darcula span.cm-string-2 { color: #6A8759; }\n.cm-s-darcula span.cm-comment { color: #61A151; font-style: italic; }\n.cm-s-darcula span.cm-link { color: #CC7832; }\n.cm-s-darcula span.cm-atom { color: #CC7832; }\n.cm-s-darcula span.cm-error { color: #BC3F3C; }\n.cm-s-darcula span.cm-tag { color: #629755; font-weight: bold; font-style: italic; text-decoration: underline; }\n.cm-s-darcula span.cm-attribute { color: #6897bb; }\n.cm-s-darcula span.cm-qualifier { color: #6A8759; }\n.cm-s-darcula span.cm-bracket { color: #A9B7C6; }\n.cm-s-darcula span.cm-builtin { color: #FF9E59; }\n.cm-s-darcula span.cm-special { color: #FF9E59; }\n.cm-s-darcula span.cm-matchhighlight { color: #FFFFFF; background-color: rgba(50, 89, 48, .7); font-weight: normal;}\n.cm-s-darcula span.cm-searching { color: #FFFFFF; background-color: rgba(61, 115, 59, .7); font-weight: normal;}\n\n.cm-s-darcula .CodeMirror-cursor { border-left: 1px solid #A9B7C6; }\n.cm-s-darcula .CodeMirror-activeline-background { background: #323232; }\n.cm-s-darcula .CodeMirror-gutters { background: #313335; border-right: 1px solid #313335; }\n.cm-s-darcula .CodeMirror-guttermarker { color: #FFEE80; }\n.cm-s-darcula .CodeMirror-guttermarker-subtle { color: #D0D0D0; }\n.cm-s-darcula .CodeMirrir-linenumber { color: #606366; }\n.cm-s-darcula .CodeMirror-matchingbracket { background-color: #3B514D; color: #FFEF28 !important; font-weight: bold; }\n\n.cm-s-darcula div.CodeMirror-selected { background: #214283; }\n\n.CodeMirror-hints.darcula {\n  font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;\n  color: #9C9E9E;\n  background-color: #3B3E3F !important;\n}\n\n.CodeMirror-hints.darcula .CodeMirror-hint-active {\n  background-color: #494D4E !important;\n  color: #9C9E9E !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/dracula.css",
    "content": "/*\n\n    Name:       dracula\n    Author:     Michael Kaminsky (http://github.com/mkaminsky11)\n\n    Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n  background-color: #282a36 !important;\n  color: #f8f8f2 !important;\n  border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/duotone-dark.css",
    "content": "/*\nName:   DuoTone-Dark\nAuthor: by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes)\n\nCodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bram de Haan (https://github.com/atelierbram/)\n*/\n\n.cm-s-duotone-dark.CodeMirror { background: #2a2734; color: #6c6783; }\n.cm-s-duotone-dark div.CodeMirror-selected { background: #545167!important; }\n.cm-s-duotone-dark .CodeMirror-gutters { background: #2a2734; border-right: 0px; }\n.cm-s-duotone-dark .CodeMirror-linenumber { color: #545167; }\n\n/* begin cursor */\n.cm-s-duotone-dark .CodeMirror-cursor { border-left: 1px solid #ffad5c; /* border-left: 1px solid #ffad5c80; */ border-right: .5em solid #ffad5c; /* border-right: .5em solid #ffad5c80; */ opacity: .5; }\n.cm-s-duotone-dark .CodeMirror-activeline-background { background: #363342; /* background: #36334280;  */ opacity: .5;}\n.cm-s-duotone-dark .cm-fat-cursor .CodeMirror-cursor { background: #ffad5c; /* background: #ffad5c80; */ opacity: .5;}\n/* end cursor */\n\n.cm-s-duotone-dark span.cm-atom, .cm-s-duotone-dark span.cm-number, .cm-s-duotone-dark span.cm-keyword, .cm-s-duotone-dark span.cm-variable, .cm-s-duotone-dark span.cm-attribute, .cm-s-duotone-dark span.cm-quote, .cm-s-duotone-dark span.cm-hr, .cm-s-duotone-dark span.cm-link { color: #ffcc99; }\n\n.cm-s-duotone-dark span.cm-property { color: #9a86fd; }\n.cm-s-duotone-dark span.cm-punctuation, .cm-s-duotone-dark span.cm-unit, .cm-s-duotone-dark span.cm-negative { color: #e09142; }\n.cm-s-duotone-dark span.cm-string { color: #ffb870; }\n.cm-s-duotone-dark span.cm-operator { color: #ffad5c; }\n.cm-s-duotone-dark span.cm-positive { color: #6a51e6; }\n\n.cm-s-duotone-dark span.cm-variable-2, .cm-s-duotone-dark span.cm-variable-3, .cm-s-duotone-dark span.cm-type, .cm-s-duotone-dark span.cm-string-2, .cm-s-duotone-dark span.cm-url { color: #7a63ee; }\n.cm-s-duotone-dark span.cm-def, .cm-s-duotone-dark span.cm-tag, .cm-s-duotone-dark span.cm-builtin, .cm-s-duotone-dark span.cm-qualifier, .cm-s-duotone-dark span.cm-header, .cm-s-duotone-dark span.cm-em { color: #eeebff; }\n.cm-s-duotone-dark span.cm-bracket, .cm-s-duotone-dark span.cm-comment { color: #6c6783; }\n\n/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */\n.cm-s-duotone-dark span.cm-error, .cm-s-duotone-dark span.cm-invalidchar { color: #f00; }\n\n.cm-s-duotone-dark span.cm-header { font-weight: normal; }\n.cm-s-duotone-dark .CodeMirror-matchingbracket { text-decoration: underline; color: #eeebff !important; } \n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/duotone-light.css",
    "content": "/*\nName:   DuoTone-Light\nAuthor: by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes)\n\nCodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bram de Haan (https://github.com/atelierbram/)\n*/\n\n.cm-s-duotone-light.CodeMirror { background: #faf8f5; color: #b29762; }\n.cm-s-duotone-light div.CodeMirror-selected { background: #e3dcce !important; }\n.cm-s-duotone-light .CodeMirror-gutters { background: #faf8f5; border-right: 0px; }\n.cm-s-duotone-light .CodeMirror-linenumber { color: #cdc4b1; }\n\n/* begin cursor */\n.cm-s-duotone-light .CodeMirror-cursor { border-left: 1px solid #93abdc; /* border-left: 1px solid #93abdc80; */ border-right: .5em solid #93abdc; /* border-right: .5em solid #93abdc80; */ opacity: .5; }\n.cm-s-duotone-light .CodeMirror-activeline-background { background: #e3dcce;  /* background: #e3dcce80; */ opacity: .5; }\n.cm-s-duotone-light .cm-fat-cursor .CodeMirror-cursor { background: #93abdc; /* #93abdc80; */ opacity: .5; }\n/* end cursor */\n\n.cm-s-duotone-light span.cm-atom, .cm-s-duotone-light span.cm-number, .cm-s-duotone-light span.cm-keyword, .cm-s-duotone-light span.cm-variable, .cm-s-duotone-light span.cm-attribute, .cm-s-duotone-light span.cm-quote, .cm-s-duotone-light-light span.cm-hr, .cm-s-duotone-light-light span.cm-link { color: #063289; }\n\n.cm-s-duotone-light span.cm-property { color: #b29762; }\n.cm-s-duotone-light span.cm-punctuation, .cm-s-duotone-light span.cm-unit, .cm-s-duotone-light span.cm-negative { color: #063289; }\n.cm-s-duotone-light span.cm-string, .cm-s-duotone-light span.cm-operator { color: #1659df; }\n.cm-s-duotone-light span.cm-positive { color: #896724; }\n\n.cm-s-duotone-light span.cm-variable-2, .cm-s-duotone-light span.cm-variable-3, .cm-s-duotone-light span.cm-type, .cm-s-duotone-light span.cm-string-2, .cm-s-duotone-light span.cm-url { color: #896724; }\n.cm-s-duotone-light span.cm-def, .cm-s-duotone-light span.cm-tag, .cm-s-duotone-light span.cm-builtin, .cm-s-duotone-light span.cm-qualifier, .cm-s-duotone-light span.cm-header, .cm-s-duotone-light span.cm-em { color: #2d2006; }\n.cm-s-duotone-light span.cm-bracket, .cm-s-duotone-light span.cm-comment { color: #b6ad9a; }\n\n/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */\n/* .cm-s-duotone-light span.cm-error { background: #896724; color: #728fcb; } */\n.cm-s-duotone-light span.cm-error, .cm-s-duotone-light span.cm-invalidchar { color: #f00; }\n\n.cm-s-duotone-light span.cm-header { font-weight: normal; }\n.cm-s-duotone-light .CodeMirror-matchingbracket { text-decoration: underline; color: #faf8f5 !important; }\n\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/eclipse.css",
    "content": ".cm-s-eclipse span.cm-meta { color: #FF1717; }\n.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; }\n.cm-s-eclipse span.cm-atom { color: #219; }\n.cm-s-eclipse span.cm-number { color: #164; }\n.cm-s-eclipse span.cm-def { color: #00f; }\n.cm-s-eclipse span.cm-variable { color: black; }\n.cm-s-eclipse span.cm-variable-2 { color: #0000C0; }\n.cm-s-eclipse span.cm-variable-3, .cm-s-eclipse span.cm-type { color: #0000C0; }\n.cm-s-eclipse span.cm-property { color: black; }\n.cm-s-eclipse span.cm-operator { color: black; }\n.cm-s-eclipse span.cm-comment { color: #3F7F5F; }\n.cm-s-eclipse span.cm-string { color: #2A00FF; }\n.cm-s-eclipse span.cm-string-2 { color: #f50; }\n.cm-s-eclipse span.cm-qualifier { color: #555; }\n.cm-s-eclipse span.cm-builtin { color: #30a; }\n.cm-s-eclipse span.cm-bracket { color: #cc7; }\n.cm-s-eclipse span.cm-tag { color: #170; }\n.cm-s-eclipse span.cm-attribute { color: #00c; }\n.cm-s-eclipse span.cm-link { color: #219; }\n.cm-s-eclipse span.cm-error { color: #f00; }\n\n.cm-s-eclipse .CodeMirror-activeline-background { background: #e8f2ff; }\n.cm-s-eclipse .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/elegant.css",
    "content": ".cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom { color: #762; }\n.cm-s-elegant span.cm-comment { color: #262; font-style: italic; line-height: 1em; }\n.cm-s-elegant span.cm-meta { color: #555; font-style: italic; line-height: 1em; }\n.cm-s-elegant span.cm-variable { color: black; }\n.cm-s-elegant span.cm-variable-2 { color: #b11; }\n.cm-s-elegant span.cm-qualifier { color: #555; }\n.cm-s-elegant span.cm-keyword { color: #730; }\n.cm-s-elegant span.cm-builtin { color: #30a; }\n.cm-s-elegant span.cm-link { color: #762; }\n.cm-s-elegant span.cm-error { background-color: #fdd; }\n\n.cm-s-elegant .CodeMirror-activeline-background { background: #e8f2ff; }\n.cm-s-elegant .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/erlang-dark.css",
    "content": ".cm-s-erlang-dark.CodeMirror { background: #002240; color: white; }\n.cm-s-erlang-dark div.CodeMirror-selected { background: #b36539; }\n.cm-s-erlang-dark .CodeMirror-line::selection, .cm-s-erlang-dark .CodeMirror-line > span::selection, .cm-s-erlang-dark .CodeMirror-line > span > span::selection { background: rgba(179, 101, 57, .99); }\n.cm-s-erlang-dark .CodeMirror-line::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(179, 101, 57, .99); }\n.cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; }\n.cm-s-erlang-dark .CodeMirror-guttermarker { color: white; }\n.cm-s-erlang-dark .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-erlang-dark span.cm-quote      { color: #ccc; }\n.cm-s-erlang-dark span.cm-atom       { color: #f133f1; }\n.cm-s-erlang-dark span.cm-attribute  { color: #ff80e1; }\n.cm-s-erlang-dark span.cm-bracket    { color: #ff9d00; }\n.cm-s-erlang-dark span.cm-builtin    { color: #eaa; }\n.cm-s-erlang-dark span.cm-comment    { color: #77f; }\n.cm-s-erlang-dark span.cm-def        { color: #e7a; }\n.cm-s-erlang-dark span.cm-keyword    { color: #ffee80; }\n.cm-s-erlang-dark span.cm-meta       { color: #50fefe; }\n.cm-s-erlang-dark span.cm-number     { color: #ffd0d0; }\n.cm-s-erlang-dark span.cm-operator   { color: #d55; }\n.cm-s-erlang-dark span.cm-property   { color: #ccc; }\n.cm-s-erlang-dark span.cm-qualifier  { color: #ccc; }\n.cm-s-erlang-dark span.cm-special    { color: #ffbbbb; }\n.cm-s-erlang-dark span.cm-string     { color: #3ad900; }\n.cm-s-erlang-dark span.cm-string-2   { color: #ccc; }\n.cm-s-erlang-dark span.cm-tag        { color: #9effff; }\n.cm-s-erlang-dark span.cm-variable   { color: #50fe50; }\n.cm-s-erlang-dark span.cm-variable-2 { color: #e0e; }\n.cm-s-erlang-dark span.cm-variable-3, .cm-s-erlang-dark span.cm-type { color: #ccc; }\n.cm-s-erlang-dark span.cm-error      { color: #9d1e15; }\n\n.cm-s-erlang-dark .CodeMirror-activeline-background { background: #013461; }\n.cm-s-erlang-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/gruvbox-dark.css",
    "content": "/*\n\n    Name:       gruvbox-dark\n    Author:     kRkk (https://github.com/krkk)\n\n    Original gruvbox color scheme by Pavel Pertsev (https://github.com/morhetz/gruvbox)\n\n*/\n\n.cm-s-gruvbox-dark.CodeMirror, .cm-s-gruvbox-dark .CodeMirror-gutters { background-color: #282828; color: #bdae93; }\n.cm-s-gruvbox-dark .CodeMirror-gutters {background: #282828; border-right: 0px;}\n.cm-s-gruvbox-dark .CodeMirror-linenumber {color: #7c6f64;}\n.cm-s-gruvbox-dark .CodeMirror-cursor { border-left: 1px solid #ebdbb2; }\n.cm-s-gruvbox-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #8e8d8875 !important; }\n.cm-s-gruvbox-dark .cm-animate-fat-cursor { background-color: #8e8d8875 !important; }\n.cm-s-gruvbox-dark div.CodeMirror-selected { background: #928374; }\n.cm-s-gruvbox-dark span.cm-meta { color: #83a598; }\n\n.cm-s-gruvbox-dark span.cm-comment { color: #928374; }\n.cm-s-gruvbox-dark span.cm-number, span.cm-atom { color: #d3869b; }\n.cm-s-gruvbox-dark span.cm-keyword { color: #f84934; }\n\n.cm-s-gruvbox-dark span.cm-variable { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-variable-2 { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-variable-3, .cm-s-gruvbox-dark span.cm-type { color: #fabd2f; }\n.cm-s-gruvbox-dark span.cm-operator { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-callee { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-def { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-property { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-string { color: #b8bb26; }\n.cm-s-gruvbox-dark span.cm-string-2 { color: #8ec07c; }\n.cm-s-gruvbox-dark span.cm-qualifier { color: #8ec07c; }\n.cm-s-gruvbox-dark span.cm-attribute { color: #8ec07c; }\n\n.cm-s-gruvbox-dark .CodeMirror-activeline-background { background: #3c3836; }\n.cm-s-gruvbox-dark .CodeMirror-matchingbracket { background: #928374; color:#282828 !important; }\n\n.cm-s-gruvbox-dark span.cm-builtin { color: #fe8019; }\n.cm-s-gruvbox-dark span.cm-tag { color: #fe8019; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/hopscotch.css",
    "content": "/*\n\n    Name:       Hopscotch\n    Author:     Jan T. Sott\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-hopscotch.CodeMirror {background: #322931; color: #d5d3d5;}\n.cm-s-hopscotch div.CodeMirror-selected {background: #433b42 !important;}\n.cm-s-hopscotch .CodeMirror-gutters {background: #322931; border-right: 0px;}\n.cm-s-hopscotch .CodeMirror-linenumber {color: #797379;}\n.cm-s-hopscotch .CodeMirror-cursor {border-left: 1px solid #989498 !important;}\n\n.cm-s-hopscotch span.cm-comment {color: #b33508;}\n.cm-s-hopscotch span.cm-atom {color: #c85e7c;}\n.cm-s-hopscotch span.cm-number {color: #c85e7c;}\n\n.cm-s-hopscotch span.cm-property, .cm-s-hopscotch span.cm-attribute {color: #8fc13e;}\n.cm-s-hopscotch span.cm-keyword {color: #dd464c;}\n.cm-s-hopscotch span.cm-string {color: #fdcc59;}\n\n.cm-s-hopscotch span.cm-variable {color: #8fc13e;}\n.cm-s-hopscotch span.cm-variable-2 {color: #1290bf;}\n.cm-s-hopscotch span.cm-def {color: #fd8b19;}\n.cm-s-hopscotch span.cm-error {background: #dd464c; color: #989498;}\n.cm-s-hopscotch span.cm-bracket {color: #d5d3d5;}\n.cm-s-hopscotch span.cm-tag {color: #dd464c;}\n.cm-s-hopscotch span.cm-link {color: #c85e7c;}\n\n.cm-s-hopscotch .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n.cm-s-hopscotch .CodeMirror-activeline-background { background: #302020; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/icecoder.css",
    "content": "/*\nICEcoder default theme by Matt Pass, used in code editor available at https://icecoder.net\n*/\n\n.cm-s-icecoder { color: #666; background: #1d1d1b; }\n\n.cm-s-icecoder span.cm-keyword { color: #eee; font-weight:bold; }  /* off-white 1 */\n.cm-s-icecoder span.cm-atom { color: #e1c76e; }                    /* yellow */\n.cm-s-icecoder span.cm-number { color: #6cb5d9; }                  /* blue */\n.cm-s-icecoder span.cm-def { color: #b9ca4a; }                     /* green */\n\n.cm-s-icecoder span.cm-variable { color: #6cb5d9; }                /* blue */\n.cm-s-icecoder span.cm-variable-2 { color: #cc1e5c; }              /* pink */\n.cm-s-icecoder span.cm-variable-3, .cm-s-icecoder span.cm-type { color: #f9602c; } /* orange */\n\n.cm-s-icecoder span.cm-property { color: #eee; }                   /* off-white 1 */\n.cm-s-icecoder span.cm-operator { color: #9179bb; }                /* purple */\n.cm-s-icecoder span.cm-comment { color: #97a3aa; }                 /* grey-blue */\n\n.cm-s-icecoder span.cm-string { color: #b9ca4a; }                  /* green */\n.cm-s-icecoder span.cm-string-2 { color: #6cb5d9; }                /* blue */\n\n.cm-s-icecoder span.cm-meta { color: #555; }                       /* grey */\n\n.cm-s-icecoder span.cm-qualifier { color: #555; }                  /* grey */\n.cm-s-icecoder span.cm-builtin { color: #214e7b; }                 /* bright blue */\n.cm-s-icecoder span.cm-bracket { color: #cc7; }                    /* grey-yellow */\n\n.cm-s-icecoder span.cm-tag { color: #e8e8e8; }                     /* off-white 2 */\n.cm-s-icecoder span.cm-attribute { color: #099; }                  /* teal */\n\n.cm-s-icecoder span.cm-header { color: #6a0d6a; }                  /* purple-pink */\n.cm-s-icecoder span.cm-quote { color: #186718; }                   /* dark green */\n.cm-s-icecoder span.cm-hr { color: #888; }                         /* mid-grey */\n.cm-s-icecoder span.cm-link { color: #e1c76e; }                    /* yellow */\n.cm-s-icecoder span.cm-error { color: #d00; }                      /* red */\n\n.cm-s-icecoder .CodeMirror-cursor { border-left: 1px solid white; }\n.cm-s-icecoder div.CodeMirror-selected { color: #fff; background: #037; }\n.cm-s-icecoder .CodeMirror-gutters { background: #1d1d1b; min-width: 41px; border-right: 0; }\n.cm-s-icecoder .CodeMirror-linenumber { color: #555; cursor: default; }\n.cm-s-icecoder .CodeMirror-matchingbracket { color: #fff !important; background: #555 !important; }\n.cm-s-icecoder .CodeMirror-activeline-background { background: #000; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/idea.css",
    "content": "/**\n    Name:       IDEA default theme\n    From IntelliJ IDEA by JetBrains\n */\n\n.cm-s-idea span.cm-meta { color: #808000; }\n.cm-s-idea span.cm-number { color: #0000FF; }\n.cm-s-idea span.cm-keyword { line-height: 1em; font-weight: bold; color: #000080; }\n.cm-s-idea span.cm-atom { font-weight: bold; color: #000080; }\n.cm-s-idea span.cm-def { color: #000000; }\n.cm-s-idea span.cm-variable { color: black; }\n.cm-s-idea span.cm-variable-2 { color: black; }\n.cm-s-idea span.cm-variable-3, .cm-s-idea span.cm-type { color: black; }\n.cm-s-idea span.cm-property { color: black; }\n.cm-s-idea span.cm-operator { color: black; }\n.cm-s-idea span.cm-comment { color: #808080; }\n.cm-s-idea span.cm-string { color: #008000; }\n.cm-s-idea span.cm-string-2 { color: #008000; }\n.cm-s-idea span.cm-qualifier { color: #555; }\n.cm-s-idea span.cm-error { color: #FF0000; }\n.cm-s-idea span.cm-attribute { color: #0000FF; }\n.cm-s-idea span.cm-tag { color: #000080; }\n.cm-s-idea span.cm-link { color: #0000FF; }\n.cm-s-idea .CodeMirror-activeline-background { background: #FFFAE3; }\n\n.cm-s-idea span.cm-builtin { color: #30a; }\n.cm-s-idea span.cm-bracket { color: #cc7; }\n.cm-s-idea  { font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;}\n\n\n.cm-s-idea .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; }\n\n.CodeMirror-hints.idea {\n  font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;\n  color: #616569;\n  background-color: #ebf3fd !important;\n}\n\n.CodeMirror-hints.idea .CodeMirror-hint-active {\n  background-color: #a2b8c9 !important;\n  color: #5c6065 !important;\n}"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/isotope.css",
    "content": "/*\n\n    Name:       Isotope\n    Author:     David Desandro / Jan T. Sott\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-isotope.CodeMirror {background: #000000; color: #e0e0e0;}\n.cm-s-isotope div.CodeMirror-selected {background: #404040 !important;}\n.cm-s-isotope .CodeMirror-gutters {background: #000000; border-right: 0px;}\n.cm-s-isotope .CodeMirror-linenumber {color: #808080;}\n.cm-s-isotope .CodeMirror-cursor {border-left: 1px solid #c0c0c0 !important;}\n\n.cm-s-isotope span.cm-comment {color: #3300ff;}\n.cm-s-isotope span.cm-atom {color: #cc00ff;}\n.cm-s-isotope span.cm-number {color: #cc00ff;}\n\n.cm-s-isotope span.cm-property, .cm-s-isotope span.cm-attribute {color: #33ff00;}\n.cm-s-isotope span.cm-keyword {color: #ff0000;}\n.cm-s-isotope span.cm-string {color: #ff0099;}\n\n.cm-s-isotope span.cm-variable {color: #33ff00;}\n.cm-s-isotope span.cm-variable-2 {color: #0066ff;}\n.cm-s-isotope span.cm-def {color: #ff9900;}\n.cm-s-isotope span.cm-error {background: #ff0000; color: #c0c0c0;}\n.cm-s-isotope span.cm-bracket {color: #e0e0e0;}\n.cm-s-isotope span.cm-tag {color: #ff0000;}\n.cm-s-isotope span.cm-link {color: #cc00ff;}\n\n.cm-s-isotope .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n.cm-s-isotope .CodeMirror-activeline-background { background: #202020; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/juejin.css",
    "content": ".cm-s-juejin.CodeMirror {\n  background: #f8f9fa;\n}\n.cm-s-juejin .cm-header,\n.cm-s-juejin .cm-def {\n  color: #1ba2f0;\n}\n.cm-s-juejin .cm-comment {\n  color: #009e9d;\n}\n.cm-s-juejin .cm-quote,\n.cm-s-juejin .cm-link,\n.cm-s-juejin .cm-strong,\n.cm-s-juejin .cm-attribute {\n  color: #fd7741;\n}\n.cm-s-juejin .cm-url,\n.cm-s-juejin .cm-keyword,\n.cm-s-juejin .cm-builtin {\n  color: #bb51b8;\n}\n.cm-s-juejin .cm-hr {\n  color: #909090;\n}\n.cm-s-juejin .cm-tag {\n  color: #107000;\n}\n.cm-s-juejin .cm-variable-2 {\n  color: #0050a0;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/lesser-dark.css",
    "content": "/*\nhttp://lesscss.org/ dark theme\nPorted to CodeMirror by Peter Kroon\n*/\n.cm-s-lesser-dark {\n  line-height: 1.3em;\n}\n.cm-s-lesser-dark.CodeMirror { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; }\n.cm-s-lesser-dark div.CodeMirror-selected { background: #45443B; } /* 33322B*/\n.cm-s-lesser-dark .CodeMirror-line::selection, .cm-s-lesser-dark .CodeMirror-line > span::selection, .cm-s-lesser-dark .CodeMirror-line > span > span::selection { background: rgba(69, 68, 59, .99); }\n.cm-s-lesser-dark .CodeMirror-line::-moz-selection, .cm-s-lesser-dark .CodeMirror-line > span::-moz-selection, .cm-s-lesser-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(69, 68, 59, .99); }\n.cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white; }\n.cm-s-lesser-dark pre { padding: 0 8px; }/*editable code holder*/\n\n.cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/\n\n.cm-s-lesser-dark .CodeMirror-gutters { background: #262626; border-right:1px solid #aaa; }\n.cm-s-lesser-dark .CodeMirror-guttermarker { color: #599eff; }\n.cm-s-lesser-dark .CodeMirror-guttermarker-subtle { color: #777; }\n.cm-s-lesser-dark .CodeMirror-linenumber { color: #777; }\n\n.cm-s-lesser-dark span.cm-header { color: #a0a; }\n.cm-s-lesser-dark span.cm-quote { color: #090; }\n.cm-s-lesser-dark span.cm-keyword { color: #599eff; }\n.cm-s-lesser-dark span.cm-atom { color: #C2B470; }\n.cm-s-lesser-dark span.cm-number { color: #B35E4D; }\n.cm-s-lesser-dark span.cm-def { color: white; }\n.cm-s-lesser-dark span.cm-variable { color:#D9BF8C; }\n.cm-s-lesser-dark span.cm-variable-2 { color: #669199; }\n.cm-s-lesser-dark span.cm-variable-3, .cm-s-lesser-dark span.cm-type { color: white; }\n.cm-s-lesser-dark span.cm-property { color: #92A75C; }\n.cm-s-lesser-dark span.cm-operator { color: #92A75C; }\n.cm-s-lesser-dark span.cm-comment { color: #666; }\n.cm-s-lesser-dark span.cm-string { color: #BCD279; }\n.cm-s-lesser-dark span.cm-string-2 { color: #f50; }\n.cm-s-lesser-dark span.cm-meta { color: #738C73; }\n.cm-s-lesser-dark span.cm-qualifier { color: #555; }\n.cm-s-lesser-dark span.cm-builtin { color: #ff9e59; }\n.cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; }\n.cm-s-lesser-dark span.cm-tag { color: #669199; }\n.cm-s-lesser-dark span.cm-attribute { color: #81a4d5; }\n.cm-s-lesser-dark span.cm-hr { color: #999; }\n.cm-s-lesser-dark span.cm-link { color: #7070E6; }\n.cm-s-lesser-dark span.cm-error { color: #9d1e15; }\n\n.cm-s-lesser-dark .CodeMirror-activeline-background { background: #3C3A3A; }\n.cm-s-lesser-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/liquibyte.css",
    "content": ".cm-s-liquibyte.CodeMirror {\n\tbackground-color: #000;\n\tcolor: #fff;\n\tline-height: 1.2em;\n\tfont-size: 1em;\n}\n.cm-s-liquibyte .CodeMirror-focused .cm-matchhighlight {\n\ttext-decoration: underline;\n\ttext-decoration-color: #0f0;\n\ttext-decoration-style: wavy;\n}\n.cm-s-liquibyte .cm-trailingspace {\n\ttext-decoration: line-through;\n\ttext-decoration-color: #f00;\n\ttext-decoration-style: dotted;\n}\n.cm-s-liquibyte .cm-tab {\n\ttext-decoration: line-through;\n\ttext-decoration-color: #404040;\n\ttext-decoration-style: dotted;\n}\n.cm-s-liquibyte .CodeMirror-gutters { background-color: #262626; border-right: 1px solid #505050; padding-right: 0.8em; }\n.cm-s-liquibyte .CodeMirror-gutter-elt div { font-size: 1.2em; }\n.cm-s-liquibyte .CodeMirror-guttermarker {  }\n.cm-s-liquibyte .CodeMirror-guttermarker-subtle {  }\n.cm-s-liquibyte .CodeMirror-linenumber { color: #606060; padding-left: 0; }\n.cm-s-liquibyte .CodeMirror-cursor { border-left: 1px solid #eee; }\n\n.cm-s-liquibyte span.cm-comment     { color: #008000; }\n.cm-s-liquibyte span.cm-def         { color: #ffaf40; font-weight: bold; }\n.cm-s-liquibyte span.cm-keyword     { color: #c080ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-builtin     { color: #ffaf40; font-weight: bold; }\n.cm-s-liquibyte span.cm-variable    { color: #5967ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-string      { color: #ff8000; }\n.cm-s-liquibyte span.cm-number      { color: #0f0; font-weight: bold; }\n.cm-s-liquibyte span.cm-atom        { color: #bf3030; font-weight: bold; }\n\n.cm-s-liquibyte span.cm-variable-2  { color: #007f7f; font-weight: bold; }\n.cm-s-liquibyte span.cm-variable-3, .cm-s-liquibyte span.cm-type { color: #c080ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-property    { color: #999; font-weight: bold; }\n.cm-s-liquibyte span.cm-operator    { color: #fff; }\n\n.cm-s-liquibyte span.cm-meta        { color: #0f0; }\n.cm-s-liquibyte span.cm-qualifier   { color: #fff700; font-weight: bold; }\n.cm-s-liquibyte span.cm-bracket     { color: #cc7; }\n.cm-s-liquibyte span.cm-tag         { color: #ff0; font-weight: bold; }\n.cm-s-liquibyte span.cm-attribute   { color: #c080ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-error       { color: #f00; }\n\n.cm-s-liquibyte div.CodeMirror-selected { background-color: rgba(255, 0, 0, 0.25); }\n\n.cm-s-liquibyte span.cm-compilation { background-color: rgba(255, 255, 255, 0.12); }\n\n.cm-s-liquibyte .CodeMirror-activeline-background { background-color: rgba(0, 255, 0, 0.15); }\n\n/* Default styles for common addons */\n.cm-s-liquibyte .CodeMirror span.CodeMirror-matchingbracket { color: #0f0; font-weight: bold; }\n.cm-s-liquibyte .CodeMirror span.CodeMirror-nonmatchingbracket { color: #f00; font-weight: bold; }\n.CodeMirror-matchingtag { background-color: rgba(150, 255, 0, .3); }\n/* Scrollbars */\n/* Simple */\n.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div:hover, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div:hover {\n\tbackground-color: rgba(80, 80, 80, .7);\n}\n.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div {\n\tbackground-color: rgba(80, 80, 80, .3);\n\tborder: 1px solid #404040;\n\tborder-radius: 5px;\n}\n.cm-s-liquibyte div.CodeMirror-simplescroll-vertical div {\n\tborder-top: 1px solid #404040;\n\tborder-bottom: 1px solid #404040;\n}\n.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div {\n\tborder-left: 1px solid #404040;\n\tborder-right: 1px solid #404040;\n}\n.cm-s-liquibyte div.CodeMirror-simplescroll-vertical {\n\tbackground-color: #262626;\n}\n.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal {\n\tbackground-color: #262626;\n\tborder-top: 1px solid #404040;\n}\n/* Overlay */\n.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div, div.CodeMirror-overlayscroll-vertical div {\n\tbackground-color: #404040;\n\tborder-radius: 5px;\n}\n.cm-s-liquibyte div.CodeMirror-overlayscroll-vertical div {\n\tborder: 1px solid #404040;\n}\n.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div {\n\tborder: 1px solid #404040;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/lucario.css",
    "content": "/*\n  Name:       lucario\n  Author:     Raphael Amorim\n\n  Original Lucario color scheme (https://github.com/raphamorim/lucario)\n*/\n\n.cm-s-lucario.CodeMirror, .cm-s-lucario .CodeMirror-gutters {\n  background-color: #2b3e50 !important;\n  color: #f8f8f2 !important;\n  border: none;\n}\n.cm-s-lucario .CodeMirror-gutters { color: #2b3e50; }\n.cm-s-lucario .CodeMirror-cursor { border-left: solid thin #E6C845; }\n.cm-s-lucario .CodeMirror-linenumber { color: #f8f8f2; }\n.cm-s-lucario .CodeMirror-selected { background: #243443; }\n.cm-s-lucario .CodeMirror-line::selection, .cm-s-lucario .CodeMirror-line > span::selection, .cm-s-lucario .CodeMirror-line > span > span::selection { background: #243443; }\n.cm-s-lucario .CodeMirror-line::-moz-selection, .cm-s-lucario .CodeMirror-line > span::-moz-selection, .cm-s-lucario .CodeMirror-line > span > span::-moz-selection { background: #243443; }\n.cm-s-lucario span.cm-comment { color: #5c98cd; }\n.cm-s-lucario span.cm-string, .cm-s-lucario span.cm-string-2 { color: #E6DB74; }\n.cm-s-lucario span.cm-number { color: #ca94ff; }\n.cm-s-lucario span.cm-variable { color: #f8f8f2; }\n.cm-s-lucario span.cm-variable-2 { color: #f8f8f2; }\n.cm-s-lucario span.cm-def { color: #72C05D; }\n.cm-s-lucario span.cm-operator { color: #66D9EF; }\n.cm-s-lucario span.cm-keyword { color: #ff6541; }\n.cm-s-lucario span.cm-atom { color: #bd93f9; }\n.cm-s-lucario span.cm-meta { color: #f8f8f2; }\n.cm-s-lucario span.cm-tag { color: #ff6541; }\n.cm-s-lucario span.cm-attribute { color: #66D9EF; }\n.cm-s-lucario span.cm-qualifier { color: #72C05D; }\n.cm-s-lucario span.cm-property { color: #f8f8f2; }\n.cm-s-lucario span.cm-builtin { color: #72C05D; }\n.cm-s-lucario span.cm-variable-3, .cm-s-lucario span.cm-type { color: #ffb86c; }\n\n.cm-s-lucario .CodeMirror-activeline-background { background: #243443; }\n.cm-s-lucario .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/material-darker.css",
    "content": "/*\n  Name:       material\n  Author:     Mattia Astorino (http://github.com/equinusocio)\n  Website:    https://material-theme.site/\n*/\n\n.cm-s-material-darker.CodeMirror {\n  background-color: #212121;\n  color: #EEFFFF;\n}\n\n.cm-s-material-darker .CodeMirror-gutters {\n  background: #212121;\n  color: #545454;\n  border: none;\n}\n\n.cm-s-material-darker .CodeMirror-guttermarker,\n.cm-s-material-darker .CodeMirror-guttermarker-subtle,\n.cm-s-material-darker .CodeMirror-linenumber {\n  color: #545454;\n}\n\n.cm-s-material-darker .CodeMirror-cursor {\n  border-left: 1px solid #FFCC00;\n}\n\n.cm-s-material-darker div.CodeMirror-selected {\n  background: rgba(97, 97, 97, 0.2);\n}\n\n.cm-s-material-darker.CodeMirror-focused div.CodeMirror-selected {\n  background: rgba(97, 97, 97, 0.2);\n}\n\n.cm-s-material-darker .CodeMirror-line::selection,\n.cm-s-material-darker .CodeMirror-line>span::selection,\n.cm-s-material-darker .CodeMirror-line>span>span::selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-darker .CodeMirror-line::-moz-selection,\n.cm-s-material-darker .CodeMirror-line>span::-moz-selection,\n.cm-s-material-darker .CodeMirror-line>span>span::-moz-selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-darker .CodeMirror-activeline-background {\n  background: rgba(0, 0, 0, 0.5);\n}\n\n.cm-s-material-darker .cm-keyword {\n  color: #C792EA;\n}\n\n.cm-s-material-darker .cm-operator {\n  color: #89DDFF;\n}\n\n.cm-s-material-darker .cm-variable-2 {\n  color: #EEFFFF;\n}\n\n.cm-s-material-darker .cm-variable-3,\n.cm-s-material-darker .cm-type {\n  color: #f07178;\n}\n\n.cm-s-material-darker .cm-builtin {\n  color: #FFCB6B;\n}\n\n.cm-s-material-darker .cm-atom {\n  color: #F78C6C;\n}\n\n.cm-s-material-darker .cm-number {\n  color: #FF5370;\n}\n\n.cm-s-material-darker .cm-def {\n  color: #82AAFF;\n}\n\n.cm-s-material-darker .cm-string {\n  color: #C3E88D;\n}\n\n.cm-s-material-darker .cm-string-2 {\n  color: #f07178;\n}\n\n.cm-s-material-darker .cm-comment {\n  color: #545454;\n}\n\n.cm-s-material-darker .cm-variable {\n  color: #f07178;\n}\n\n.cm-s-material-darker .cm-tag {\n  color: #FF5370;\n}\n\n.cm-s-material-darker .cm-meta {\n  color: #FFCB6B;\n}\n\n.cm-s-material-darker .cm-attribute {\n  color: #C792EA;\n}\n\n.cm-s-material-darker .cm-property {\n  color: #C792EA;\n}\n\n.cm-s-material-darker .cm-qualifier {\n  color: #DECB6B;\n}\n\n.cm-s-material-darker .cm-variable-3,\n.cm-s-material-darker .cm-type {\n  color: #DECB6B;\n}\n\n\n.cm-s-material-darker .cm-error {\n  color: rgba(255, 255, 255, 1.0);\n  background-color: #FF5370;\n}\n\n.cm-s-material-darker .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/material-ocean.css",
    "content": "/*\n  Name:       material\n  Author:     Mattia Astorino (http://github.com/equinusocio)\n  Website:    https://material-theme.site/\n*/\n\n.cm-s-material-ocean.CodeMirror {\n  background-color: #0F111A;\n  color: #8F93A2;\n}\n\n.cm-s-material-ocean .CodeMirror-gutters {\n  background: #0F111A;\n  color: #464B5D;\n  border: none;\n}\n\n.cm-s-material-ocean .CodeMirror-guttermarker,\n.cm-s-material-ocean .CodeMirror-guttermarker-subtle,\n.cm-s-material-ocean .CodeMirror-linenumber {\n  color: #464B5D;\n}\n\n.cm-s-material-ocean .CodeMirror-cursor {\n  border-left: 1px solid #FFCC00;\n}\n.cm-s-material-ocean.cm-fat-cursor .CodeMirror-cursor {\n  background-color: #a2a8a175 !important;\n}\n.cm-s-material-ocean .cm-animate-fat-cursor {\n  background-color: #a2a8a175 !important;\n}\n\n.cm-s-material-ocean div.CodeMirror-selected {\n  background: rgba(113, 124, 180, 0.2);\n}\n\n.cm-s-material-ocean.CodeMirror-focused div.CodeMirror-selected {\n  background: rgba(113, 124, 180, 0.2);\n}\n\n.cm-s-material-ocean .CodeMirror-line::selection,\n.cm-s-material-ocean .CodeMirror-line>span::selection,\n.cm-s-material-ocean .CodeMirror-line>span>span::selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-ocean .CodeMirror-line::-moz-selection,\n.cm-s-material-ocean .CodeMirror-line>span::-moz-selection,\n.cm-s-material-ocean .CodeMirror-line>span>span::-moz-selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-ocean .CodeMirror-activeline-background {\n  background: rgba(0, 0, 0, 0.5);\n}\n\n.cm-s-material-ocean .cm-keyword {\n  color: #C792EA;\n}\n\n.cm-s-material-ocean .cm-operator {\n  color: #89DDFF;\n}\n\n.cm-s-material-ocean .cm-variable-2 {\n  color: #EEFFFF;\n}\n\n.cm-s-material-ocean .cm-variable-3,\n.cm-s-material-ocean .cm-type {\n  color: #f07178;\n}\n\n.cm-s-material-ocean .cm-builtin {\n  color: #FFCB6B;\n}\n\n.cm-s-material-ocean .cm-atom {\n  color: #F78C6C;\n}\n\n.cm-s-material-ocean .cm-number {\n  color: #FF5370;\n}\n\n.cm-s-material-ocean .cm-def {\n  color: #82AAFF;\n}\n\n.cm-s-material-ocean .cm-string {\n  color: #C3E88D;\n}\n\n.cm-s-material-ocean .cm-string-2 {\n  color: #f07178;\n}\n\n.cm-s-material-ocean .cm-comment {\n  color: #464B5D;\n}\n\n.cm-s-material-ocean .cm-variable {\n  color: #f07178;\n}\n\n.cm-s-material-ocean .cm-tag {\n  color: #FF5370;\n}\n\n.cm-s-material-ocean .cm-meta {\n  color: #FFCB6B;\n}\n\n.cm-s-material-ocean .cm-attribute {\n  color: #C792EA;\n}\n\n.cm-s-material-ocean .cm-property {\n  color: #C792EA;\n}\n\n.cm-s-material-ocean .cm-qualifier {\n  color: #DECB6B;\n}\n\n.cm-s-material-ocean .cm-variable-3,\n.cm-s-material-ocean .cm-type {\n  color: #DECB6B;\n}\n\n\n.cm-s-material-ocean .cm-error {\n  color: rgba(255, 255, 255, 1.0);\n  background-color: #FF5370;\n}\n\n.cm-s-material-ocean .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/material-palenight.css",
    "content": "/*\n  Name:       material\n  Author:     Mattia Astorino (http://github.com/equinusocio)\n  Website:    https://material-theme.site/\n*/\n\n.cm-s-material-palenight.CodeMirror {\n  background-color: #292D3E;\n  color: #A6ACCD;\n}\n\n.cm-s-material-palenight .CodeMirror-gutters {\n  background: #292D3E;\n  color: #676E95;\n  border: none;\n}\n\n.cm-s-material-palenight .CodeMirror-guttermarker,\n.cm-s-material-palenight .CodeMirror-guttermarker-subtle,\n.cm-s-material-palenight .CodeMirror-linenumber {\n  color: #676E95;\n}\n\n.cm-s-material-palenight .CodeMirror-cursor {\n  border-left: 1px solid #FFCC00;\n}\n.cm-s-material-palenight.cm-fat-cursor .CodeMirror-cursor {\n  background-color: #607c8b80 !important;\n}\n.cm-s-material-palenight .cm-animate-fat-cursor {\n  background-color: #607c8b80 !important;\n}\n\n.cm-s-material-palenight div.CodeMirror-selected {\n  background: rgba(113, 124, 180, 0.2);\n}\n\n.cm-s-material-palenight.CodeMirror-focused div.CodeMirror-selected {\n  background: rgba(113, 124, 180, 0.2);\n}\n\n.cm-s-material-palenight .CodeMirror-line::selection,\n.cm-s-material-palenight .CodeMirror-line>span::selection,\n.cm-s-material-palenight .CodeMirror-line>span>span::selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-palenight .CodeMirror-line::-moz-selection,\n.cm-s-material-palenight .CodeMirror-line>span::-moz-selection,\n.cm-s-material-palenight .CodeMirror-line>span>span::-moz-selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-palenight .CodeMirror-activeline-background {\n  background: rgba(0, 0, 0, 0.5);\n}\n\n.cm-s-material-palenight .cm-keyword {\n  color: #C792EA;\n}\n\n.cm-s-material-palenight .cm-operator {\n  color: #89DDFF;\n}\n\n.cm-s-material-palenight .cm-variable-2 {\n  color: #EEFFFF;\n}\n\n.cm-s-material-palenight .cm-variable-3,\n.cm-s-material-palenight .cm-type {\n  color: #f07178;\n}\n\n.cm-s-material-palenight .cm-builtin {\n  color: #FFCB6B;\n}\n\n.cm-s-material-palenight .cm-atom {\n  color: #F78C6C;\n}\n\n.cm-s-material-palenight .cm-number {\n  color: #FF5370;\n}\n\n.cm-s-material-palenight .cm-def {\n  color: #82AAFF;\n}\n\n.cm-s-material-palenight .cm-string {\n  color: #C3E88D;\n}\n\n.cm-s-material-palenight .cm-string-2 {\n  color: #f07178;\n}\n\n.cm-s-material-palenight .cm-comment {\n  color: #676E95;\n}\n\n.cm-s-material-palenight .cm-variable {\n  color: #f07178;\n}\n\n.cm-s-material-palenight .cm-tag {\n  color: #FF5370;\n}\n\n.cm-s-material-palenight .cm-meta {\n  color: #FFCB6B;\n}\n\n.cm-s-material-palenight .cm-attribute {\n  color: #C792EA;\n}\n\n.cm-s-material-palenight .cm-property {\n  color: #C792EA;\n}\n\n.cm-s-material-palenight .cm-qualifier {\n  color: #DECB6B;\n}\n\n.cm-s-material-palenight .cm-variable-3,\n.cm-s-material-palenight .cm-type {\n  color: #DECB6B;\n}\n\n\n.cm-s-material-palenight .cm-error {\n  color: rgba(255, 255, 255, 1.0);\n  background-color: #FF5370;\n}\n\n.cm-s-material-palenight .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/material.css",
    "content": "/*\n  Name:       material\n  Author:     Mattia Astorino (http://github.com/equinusocio)\n  Website:    https://material-theme.site/\n*/\n\n.cm-s-material.CodeMirror {\n  background-color: #263238;\n  color: #EEFFFF;\n}\n\n.cm-s-material .CodeMirror-gutters {\n  background: #263238;\n  color: #546E7A;\n  border: none;\n}\n\n.cm-s-material .CodeMirror-guttermarker,\n.cm-s-material .CodeMirror-guttermarker-subtle,\n.cm-s-material .CodeMirror-linenumber {\n  color: #546E7A;\n}\n\n.cm-s-material .CodeMirror-cursor {\n  border-left: 1px solid #FFCC00;\n}\n.cm-s-material.cm-fat-cursor .CodeMirror-cursor {\n  background-color: #5d6d5c80 !important;\n}\n.cm-s-material .cm-animate-fat-cursor {\n  background-color: #5d6d5c80 !important;\n}\n\n.cm-s-material div.CodeMirror-selected {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material.CodeMirror-focused div.CodeMirror-selected {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material .CodeMirror-line::selection,\n.cm-s-material .CodeMirror-line>span::selection,\n.cm-s-material .CodeMirror-line>span>span::selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material .CodeMirror-line::-moz-selection,\n.cm-s-material .CodeMirror-line>span::-moz-selection,\n.cm-s-material .CodeMirror-line>span>span::-moz-selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material .CodeMirror-activeline-background {\n  background: rgba(0, 0, 0, 0.5);\n}\n\n.cm-s-material .cm-keyword {\n  color: #C792EA;\n}\n\n.cm-s-material .cm-operator {\n  color: #89DDFF;\n}\n\n.cm-s-material .cm-variable-2 {\n  color: #EEFFFF;\n}\n\n.cm-s-material .cm-variable-3,\n.cm-s-material .cm-type {\n  color: #f07178;\n}\n\n.cm-s-material .cm-builtin {\n  color: #FFCB6B;\n}\n\n.cm-s-material .cm-atom {\n  color: #F78C6C;\n}\n\n.cm-s-material .cm-number {\n  color: #FF5370;\n}\n\n.cm-s-material .cm-def {\n  color: #82AAFF;\n}\n\n.cm-s-material .cm-string {\n  color: #C3E88D;\n}\n\n.cm-s-material .cm-string-2 {\n  color: #f07178;\n}\n\n.cm-s-material .cm-comment {\n  color: #546E7A;\n}\n\n.cm-s-material .cm-variable {\n  color: #f07178;\n}\n\n.cm-s-material .cm-tag {\n  color: #FF5370;\n}\n\n.cm-s-material .cm-meta {\n  color: #FFCB6B;\n}\n\n.cm-s-material .cm-attribute {\n  color: #C792EA;\n}\n\n.cm-s-material .cm-property {\n  color: #C792EA;\n}\n\n.cm-s-material .cm-qualifier {\n  color: #DECB6B;\n}\n\n.cm-s-material .cm-variable-3,\n.cm-s-material .cm-type {\n  color: #DECB6B;\n}\n\n\n.cm-s-material .cm-error {\n  color: rgba(255, 255, 255, 1.0);\n  background-color: #FF5370;\n}\n\n.cm-s-material .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/mbo.css",
    "content": "/****************************************************************/\n/*   Based on mbonaci's Brackets mbo theme                      */\n/*   https://github.com/mbonaci/global/blob/master/Mbo.tmTheme  */\n/*   Create your own: http://tmtheme-editor.herokuapp.com       */\n/****************************************************************/\n\n.cm-s-mbo.CodeMirror { background: #2c2c2c; color: #ffffec; }\n.cm-s-mbo div.CodeMirror-selected { background: #716C62; }\n.cm-s-mbo .CodeMirror-line::selection, .cm-s-mbo .CodeMirror-line > span::selection, .cm-s-mbo .CodeMirror-line > span > span::selection { background: rgba(113, 108, 98, .99); }\n.cm-s-mbo .CodeMirror-line::-moz-selection, .cm-s-mbo .CodeMirror-line > span::-moz-selection, .cm-s-mbo .CodeMirror-line > span > span::-moz-selection { background: rgba(113, 108, 98, .99); }\n.cm-s-mbo .CodeMirror-gutters { background: #4e4e4e; border-right: 0px; }\n.cm-s-mbo .CodeMirror-guttermarker { color: white; }\n.cm-s-mbo .CodeMirror-guttermarker-subtle { color: grey; }\n.cm-s-mbo .CodeMirror-linenumber { color: #dadada; }\n.cm-s-mbo .CodeMirror-cursor { border-left: 1px solid #ffffec; }\n\n.cm-s-mbo span.cm-comment { color: #95958a; }\n.cm-s-mbo span.cm-atom { color: #00a8c6; }\n.cm-s-mbo span.cm-number { color: #00a8c6; }\n\n.cm-s-mbo span.cm-property, .cm-s-mbo span.cm-attribute { color: #9ddfe9; }\n.cm-s-mbo span.cm-keyword { color: #ffb928; }\n.cm-s-mbo span.cm-string { color: #ffcf6c; }\n.cm-s-mbo span.cm-string.cm-property { color: #ffffec; }\n\n.cm-s-mbo span.cm-variable { color: #ffffec; }\n.cm-s-mbo span.cm-variable-2 { color: #00a8c6; }\n.cm-s-mbo span.cm-def { color: #ffffec; }\n.cm-s-mbo span.cm-bracket { color: #fffffc; font-weight: bold; }\n.cm-s-mbo span.cm-tag { color: #9ddfe9; }\n.cm-s-mbo span.cm-link { color: #f54b07; }\n.cm-s-mbo span.cm-error { border-bottom: #636363; color: #ffffec; }\n.cm-s-mbo span.cm-qualifier { color: #ffffec; }\n\n.cm-s-mbo .CodeMirror-activeline-background { background: #494b41; }\n.cm-s-mbo .CodeMirror-matchingbracket { color: #ffb928 !important; }\n.cm-s-mbo .CodeMirror-matchingtag { background: rgba(255, 255, 255, .37); }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/mdn-like.css",
    "content": "/*\n  MDN-LIKE Theme - Mozilla\n  Ported to CodeMirror by Peter Kroon <plakroon@gmail.com>\n  Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues\n  GitHub: @peterkroon\n\n  The mdn-like theme is inspired on the displayed code examples at: https://developer.mozilla.org/en-US/docs/Web/CSS/animation\n\n*/\n.cm-s-mdn-like.CodeMirror { color: #999; background-color: #fff; }\n.cm-s-mdn-like div.CodeMirror-selected { background: #cfc; }\n.cm-s-mdn-like .CodeMirror-line::selection, .cm-s-mdn-like .CodeMirror-line > span::selection, .cm-s-mdn-like .CodeMirror-line > span > span::selection { background: #cfc; }\n.cm-s-mdn-like .CodeMirror-line::-moz-selection, .cm-s-mdn-like .CodeMirror-line > span::-moz-selection, .cm-s-mdn-like .CodeMirror-line > span > span::-moz-selection { background: #cfc; }\n\n.cm-s-mdn-like .CodeMirror-gutters { background: #f8f8f8; border-left: 6px solid rgba(0,83,159,0.65); color: #333; }\n.cm-s-mdn-like .CodeMirror-linenumber { color: #aaa; padding-left: 8px; }\n.cm-s-mdn-like .CodeMirror-cursor { border-left: 2px solid #222; }\n\n.cm-s-mdn-like .cm-keyword { color: #6262FF; }\n.cm-s-mdn-like .cm-atom { color: #F90; }\n.cm-s-mdn-like .cm-number { color:  #ca7841; }\n.cm-s-mdn-like .cm-def { color: #8DA6CE; }\n.cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; }\n.cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def, .cm-s-mdn-like span.cm-type { color: #07a; }\n\n.cm-s-mdn-like .cm-variable { color: #07a; }\n.cm-s-mdn-like .cm-property { color: #905; }\n.cm-s-mdn-like .cm-qualifier { color: #690; }\n\n.cm-s-mdn-like .cm-operator { color: #cda869; }\n.cm-s-mdn-like .cm-comment { color:#777; font-weight:normal; }\n.cm-s-mdn-like .cm-string { color:#07a; font-style:italic; }\n.cm-s-mdn-like .cm-string-2 { color:#bd6b18; } /*?*/\n.cm-s-mdn-like .cm-meta { color: #000; } /*?*/\n.cm-s-mdn-like .cm-builtin { color: #9B7536; } /*?*/\n.cm-s-mdn-like .cm-tag { color: #997643; }\n.cm-s-mdn-like .cm-attribute { color: #d6bb6d; } /*?*/\n.cm-s-mdn-like .cm-header { color: #FF6400; }\n.cm-s-mdn-like .cm-hr { color: #AEAEAE; }\n.cm-s-mdn-like .cm-link { color:#ad9361; font-style:italic; text-decoration:none; }\n.cm-s-mdn-like .cm-error { border-bottom: 1px solid red; }\n\ndiv.cm-s-mdn-like .CodeMirror-activeline-background { background: #efefff; }\ndiv.cm-s-mdn-like span.CodeMirror-matchingbracket { outline:1px solid grey; color: inherit; }\n\n.cm-s-mdn-like.CodeMirror { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFcAAAAyCAYAAAAp8UeFAAAHvklEQVR42s2b63bcNgyEQZCSHCdt2vd/0tWF7I+Q6XgMXiTtuvU5Pl57ZQKkKHzEAOtF5KeIJBGJ8uvL599FRFREZhFx8DeXv8trn68RuGaC8TRfo3SNp9dlDDHedyLyTUTeRWStXKPZrjtpZxaRw5hPqozRs1N8/enzIiQRWcCgy4MUA0f+XWliDhyL8Lfyvx7ei/Ae3iQFHyw7U/59pQVIMEEPEz0G7XiwdRjzSfC3UTtz9vchIntxvry5iMgfIhJoEflOz2CQr3F5h/HfeFe+GTdLaKcu9L8LTeQb/R/7GgbsfKedyNdoHsN31uRPWrfZ5wsj/NzzRQHuToIdU3ahwnsKPxXCjJITuOsi7XLc7SG/v5GdALs7wf8JjTFiB5+QvTEfRyGOfX3Lrx8wxyQi3sNq46O7QahQiCsRFgqddjBouVEHOKDgXAQHD9gJCr5sMKkEdjwsarG/ww3BMHBU7OBjXnzdyY7SfCxf5/z6ATccrwlKuwC/jhznnPF4CgVzhhVf4xp2EixcBActO75iZ8/fM9zAs2OMzKdslgXWJ9XG8PQoOAMA5fGcsvORgv0doBXyHrCwfLJAOwo71QLNkb8n2Pl6EWiR7OCibtkPaz4Kc/0NNAze2gju3zOwekALDaCFPI5vjPFmgGY5AZqyGEvH1x7QfIb8YtxMnA/b+QQ0aQDAwc6JMFg8CbQZ4qoYEEHbRwNojuK3EHwd7VALSgq+MNDKzfT58T8qdpADrgW0GmgcAS1lhzztJmkAzcPNOQbsWEALBDSlMKUG0Eq4CLAQWvEVQ9WU57gZJwZtgPO3r9oBTQ9WO8TjqXINx8R0EYpiZEUWOF3FxkbJkgU9B2f41YBrIj5ZfsQa0M5kTgiAAqM3ShXLgu8XMqcrQBvJ0CL5pnTsfMB13oB8athpAq2XOQmcGmoACCLydx7nToa23ATaSIY2ichfOdPTGxlasXMLaL0MLZAOwAKIM+y8CmicobGdCcbbK9DzN+yYGVoNNI5iUKTMyYOjPse4A8SM1MmcXgU0toOq1yO/v8FOxlASyc7TgeYaAMBJHcY1CcCwGI/TK4AmDbDyKYBBtFUkRwto8gygiQEaByFgJ00BH2M8JWwQS1nafDXQCidWyOI8AcjDCSjCLk8ngObuAm3JAHAdubAmOaK06V8MNEsKPJOhobSprwQa6gD7DclRQdqcwL4zxqgBrQcabUiBLclRDKAlWp+etPkBaNMA0AKlrHwTdEByZAA4GM+SNluSY6wAzcMNewxmgig5Ks0nkrSpBvSaQHMdKTBAnLojOdYyGpQ254602ZILPdTD1hdlggdIm74jbTp8vDwF5ZYUeLWGJpWsh6XNyXgcYwVoJQTEhhTYkxzZjiU5npU2TaB979TQehlaAVq4kaGpiPwwwLkYUuBbQwocyQTv1tA0+1UFWoJF3iv1oq+qoSk8EQdJmwHkziIF7oOZk14EGitibAdjLYYK78H5vZOhtWpoI0ATGHs0Q8OMb4Ey+2bU2UYztCtA0wFAs7TplGLRVQCcqaFdGSPCeTI1QNIC52iWNzof6Uib7xjEp07mNNoUYmVosVItHrHzRlLgBn9LFyRHaQCtVUMbtTNhoXWiTOO9k/V8BdAc1Oq0ArSQs6/5SU0hckNy9NnXqQY0PGYo5dWJ7nINaN6o958FWin27aBaWRka1r5myvLOAm0j30eBJqCxHLReVclxhxOEN2JfDWjxBtAC7MIH1fVaGdoOp4qJYDgKtKPSFNID2gSnGldrCqkFZ+5UeQXQBIRrSwocbdZYQT/2LwRahBPBXoHrB8nxaGROST62DKUbQOMMzZIC9abkuELfQzQALWTnDNAm8KHWFOJgJ5+SHIvTPcmx1xQyZRhNL5Qci689aXMEaN/uNIWkEwDAvFpOZmgsBaaGnbs1NPa1Jm32gBZAIh1pCtG7TSH4aE0y1uVY4uqoFPisGlpP2rSA5qTecWn5agK6BzSpgAyD+wFaqhnYoSZ1Vwr8CmlTQbrcO3ZaX0NAEyMbYaAlyquFoLKK3SPby9CeVUPThrSJmkCAE0CrKUQadi4DrdSlWhmah0YL9z9vClH59YGbHx1J8VZTyAjQepJjmXwAKTDQI3omc3p1U4gDUf6RfcdYfrUp5ClAi2J3Ba6UOXGo+K+bQrjjssitG2SJzshaLwMtXgRagUNpYYoVkMSBLM+9GGiJZMvduG6DRZ4qc04DMPtQQxOjEtACmhO7K1AbNbQDEggZyJwscFpAGwENhoBeUwh3bWolhe8BTYVKxQEWrSUn/uhcM5KhvUu/+eQu0Lzhi+VrK0PrZZNDQKs9cpYUuFYgMVpD4/NxenJTiMCNqdUEUf1qZWjppLT5qSkkUZbCwkbZMSuVnu80hfSkzRbQeqCZSAh6huR4VtoM2gHAlLf72smuWgE+VV7XpE25Ab2WFDgyhnSuKbs4GuGzCjR+tIoUuMFg3kgcWKLTwRqanJQ2W00hAsenfaApRC42hbCvK1SlE0HtE9BGgneJO+ELamitD1YjjOYnNYVcraGhtKkW0EqVVeDx733I2NH581k1NNxNLG0i0IJ8/NjVaOZ0tYZ2Vtr0Xv7tPV3hkWp9EFkgS/J0vosngTaSoaG06WHi+xObQkaAdlbanP8B2+2l0f90LmUAAAAASUVORK5CYII=); }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/midnight.css",
    "content": "/* Based on the theme at http://bonsaiden.github.com/JavaScript-Garden */\n\n/*<!--activeline-->*/\n.cm-s-midnight .CodeMirror-activeline-background { background: #253540; }\n\n.cm-s-midnight.CodeMirror {\n    background: #0F192A;\n    color: #D1EDFF;\n}\n\n.cm-s-midnight div.CodeMirror-selected { background: #314D67; }\n.cm-s-midnight .CodeMirror-line::selection, .cm-s-midnight .CodeMirror-line > span::selection, .cm-s-midnight .CodeMirror-line > span > span::selection { background: rgba(49, 77, 103, .99); }\n.cm-s-midnight .CodeMirror-line::-moz-selection, .cm-s-midnight .CodeMirror-line > span::-moz-selection, .cm-s-midnight .CodeMirror-line > span > span::-moz-selection { background: rgba(49, 77, 103, .99); }\n.cm-s-midnight .CodeMirror-gutters { background: #0F192A; border-right: 1px solid; }\n.cm-s-midnight .CodeMirror-guttermarker { color: white; }\n.cm-s-midnight .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-midnight .CodeMirror-linenumber { color: #D0D0D0; }\n.cm-s-midnight .CodeMirror-cursor { border-left: 1px solid #F8F8F0; }\n\n.cm-s-midnight span.cm-comment { color: #428BDD; }\n.cm-s-midnight span.cm-atom { color: #AE81FF; }\n.cm-s-midnight span.cm-number { color: #D1EDFF; }\n\n.cm-s-midnight span.cm-property, .cm-s-midnight span.cm-attribute { color: #A6E22E; }\n.cm-s-midnight span.cm-keyword { color: #E83737; }\n.cm-s-midnight span.cm-string { color: #1DC116; }\n\n.cm-s-midnight span.cm-variable { color: #FFAA3E; }\n.cm-s-midnight span.cm-variable-2 { color: #FFAA3E; }\n.cm-s-midnight span.cm-def { color: #4DD; }\n.cm-s-midnight span.cm-bracket { color: #D1EDFF; }\n.cm-s-midnight span.cm-tag { color: #449; }\n.cm-s-midnight span.cm-link { color: #AE81FF; }\n.cm-s-midnight span.cm-error { background: #F92672; color: #F8F8F0; }\n\n.cm-s-midnight .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/monokai.css",
    "content": "/* Based on Sublime Text's Monokai theme */\n\n.cm-s-monokai.CodeMirror { background: #272822; color: #f8f8f2; }\n.cm-s-monokai div.CodeMirror-selected { background: #49483E; }\n.cm-s-monokai .CodeMirror-line::selection, .cm-s-monokai .CodeMirror-line > span::selection, .cm-s-monokai .CodeMirror-line > span > span::selection { background: rgba(73, 72, 62, .99); }\n.cm-s-monokai .CodeMirror-line::-moz-selection, .cm-s-monokai .CodeMirror-line > span::-moz-selection, .cm-s-monokai .CodeMirror-line > span > span::-moz-selection { background: rgba(73, 72, 62, .99); }\n.cm-s-monokai .CodeMirror-gutters { background: #272822; border-right: 0px; }\n.cm-s-monokai .CodeMirror-guttermarker { color: white; }\n.cm-s-monokai .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-monokai .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-monokai .CodeMirror-cursor { border-left: 1px solid #f8f8f0; }\n\n.cm-s-monokai span.cm-comment { color: #75715e; }\n.cm-s-monokai span.cm-atom { color: #ae81ff; }\n.cm-s-monokai span.cm-number { color: #ae81ff; }\n\n.cm-s-monokai span.cm-comment.cm-attribute { color: #97b757; }\n.cm-s-monokai span.cm-comment.cm-def { color: #bc9262; }\n.cm-s-monokai span.cm-comment.cm-tag { color: #bc6283; }\n.cm-s-monokai span.cm-comment.cm-type { color: #5998a6; }\n\n.cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute { color: #a6e22e; }\n.cm-s-monokai span.cm-keyword { color: #f92672; }\n.cm-s-monokai span.cm-builtin { color: #66d9ef; }\n.cm-s-monokai span.cm-string { color: #e6db74; }\n\n.cm-s-monokai span.cm-variable { color: #f8f8f2; }\n.cm-s-monokai span.cm-variable-2 { color: #9effff; }\n.cm-s-monokai span.cm-variable-3, .cm-s-monokai span.cm-type { color: #66d9ef; }\n.cm-s-monokai span.cm-def { color: #fd971f; }\n.cm-s-monokai span.cm-bracket { color: #f8f8f2; }\n.cm-s-monokai span.cm-tag { color: #f92672; }\n.cm-s-monokai span.cm-header { color: #ae81ff; }\n.cm-s-monokai span.cm-link { color: #ae81ff; }\n.cm-s-monokai span.cm-error { background: #f92672; color: #f8f8f0; }\n\n.cm-s-monokai .CodeMirror-activeline-background { background: #373831; }\n.cm-s-monokai .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/moxer.css",
    "content": "/*\n  Name:       Moxer Theme\n  Author:     Mattia Astorino (http://github.com/equinusocio)\n  Website:    https://github.com/moxer-theme/moxer-code\n*/\n\n.cm-s-moxer.CodeMirror {\n  background-color: #090A0F;\n  color: #8E95B4;\n  line-height: 1.8;\n}\n\n.cm-s-moxer .CodeMirror-gutters {\n  background: #090A0F;\n  color: #35394B;\n  border: none;\n}\n\n.cm-s-moxer .CodeMirror-guttermarker,\n.cm-s-moxer .CodeMirror-guttermarker-subtle,\n.cm-s-moxer .CodeMirror-linenumber {\n  color: #35394B;\n}\n\n\n.cm-s-moxer .CodeMirror-cursor {\n  border-left: 1px solid #FFCC00;\n}\n\n.cm-s-moxer div.CodeMirror-selected {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-moxer.CodeMirror-focused div.CodeMirror-selected {\n  background: #212431;\n}\n\n.cm-s-moxer .CodeMirror-line::selection,\n.cm-s-moxer .CodeMirror-line>span::selection,\n.cm-s-moxer .CodeMirror-line>span>span::selection {\n  background: #212431;\n}\n\n.cm-s-moxer .CodeMirror-line::-moz-selection,\n.cm-s-moxer .CodeMirror-line>span::-moz-selection,\n.cm-s-moxer .CodeMirror-line>span>span::-moz-selection {\n  background: #212431;\n}\n\n.cm-s-moxer .CodeMirror-activeline-background,\n.cm-s-moxer .CodeMirror-activeline-gutter .CodeMirror-linenumber {\n  background: rgba(33, 36, 49, 0.5);\n}\n\n.cm-s-moxer .cm-keyword {\n  color: #D46C6C;\n}\n\n.cm-s-moxer .cm-operator {\n  color: #D46C6C;\n}\n\n.cm-s-moxer .cm-variable-2 {\n  color: #81C5DA;\n}\n\n\n.cm-s-moxer .cm-variable-3,\n.cm-s-moxer .cm-type {\n  color: #f07178;\n}\n\n.cm-s-moxer .cm-builtin {\n  color: #FFCB6B;\n}\n\n.cm-s-moxer .cm-atom {\n  color: #A99BE2;\n}\n\n.cm-s-moxer .cm-number {\n  color: #7CA4C0;\n}\n\n.cm-s-moxer .cm-def {\n  color: #F5DFA5;\n}\n\n.cm-s-moxer .CodeMirror-line .cm-def ~ .cm-def {\n  color: #81C5DA;\n}\n\n.cm-s-moxer .cm-string {\n  color: #B2E4AE;\n}\n\n.cm-s-moxer .cm-string-2 {\n  color: #f07178;\n}\n\n.cm-s-moxer .cm-comment {\n  color: #3F445A;\n}\n\n.cm-s-moxer .cm-variable {\n  color: #8E95B4;\n}\n\n.cm-s-moxer .cm-tag {\n  color: #FF5370;\n}\n\n.cm-s-moxer .cm-meta {\n  color: #FFCB6B;\n}\n\n.cm-s-moxer .cm-attribute {\n  color: #C792EA;\n}\n\n.cm-s-moxer .cm-property {\n  color: #81C5DA;\n}\n\n.cm-s-moxer .cm-qualifier {\n  color: #DECB6B;\n}\n\n.cm-s-moxer .cm-variable-3,\n.cm-s-moxer .cm-type {\n  color: #DECB6B;\n}\n\n\n.cm-s-moxer .cm-error {\n  color: rgba(255, 255, 255, 1.0);\n  background-color: #FF5370;\n}\n\n.cm-s-moxer .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/neat.css",
    "content": ".cm-s-neat span.cm-comment { color: #a86; }\n.cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; }\n.cm-s-neat span.cm-string { color: #a22; }\n.cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; }\n.cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; }\n.cm-s-neat span.cm-variable { color: black; }\n.cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; }\n.cm-s-neat span.cm-meta { color: #555; }\n.cm-s-neat span.cm-link { color: #3a3; }\n\n.cm-s-neat .CodeMirror-activeline-background { background: #e8f2ff; }\n.cm-s-neat .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/neo.css",
    "content": "/* neo theme for codemirror */\n\n/* Color scheme */\n\n.cm-s-neo.CodeMirror {\n  background-color:#ffffff;\n  color:#2e383c;\n  line-height:1.4375;\n}\n.cm-s-neo .cm-comment { color:#75787b; }\n.cm-s-neo .cm-keyword, .cm-s-neo .cm-property { color:#1d75b3; }\n.cm-s-neo .cm-atom,.cm-s-neo .cm-number { color:#75438a; }\n.cm-s-neo .cm-node,.cm-s-neo .cm-tag { color:#9c3328; }\n.cm-s-neo .cm-string { color:#b35e14; }\n.cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier { color:#047d65; }\n\n\n/* Editor styling */\n\n.cm-s-neo pre {\n  padding:0;\n}\n\n.cm-s-neo .CodeMirror-gutters {\n  border:none;\n  border-right:10px solid transparent;\n  background-color:transparent;\n}\n\n.cm-s-neo .CodeMirror-linenumber {\n  padding:0;\n  color:#e0e2e5;\n}\n\n.cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; }\n.cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; }\n\n.cm-s-neo .CodeMirror-cursor {\n  width: auto;\n  border: 0;\n  background: rgba(155,157,162,0.37);\n  z-index: 1;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/night.css",
    "content": "/* Loosely based on the Midnight Textmate theme */\n\n.cm-s-night.CodeMirror { background: #0a001f; color: #f8f8f8; }\n.cm-s-night div.CodeMirror-selected { background: #447; }\n.cm-s-night .CodeMirror-line::selection, .cm-s-night .CodeMirror-line > span::selection, .cm-s-night .CodeMirror-line > span > span::selection { background: rgba(68, 68, 119, .99); }\n.cm-s-night .CodeMirror-line::-moz-selection, .cm-s-night .CodeMirror-line > span::-moz-selection, .cm-s-night .CodeMirror-line > span > span::-moz-selection { background: rgba(68, 68, 119, .99); }\n.cm-s-night .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; }\n.cm-s-night .CodeMirror-guttermarker { color: white; }\n.cm-s-night .CodeMirror-guttermarker-subtle { color: #bbb; }\n.cm-s-night .CodeMirror-linenumber { color: #f8f8f8; }\n.cm-s-night .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-night span.cm-comment { color: #8900d1; }\n.cm-s-night span.cm-atom { color: #845dc4; }\n.cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; }\n.cm-s-night span.cm-keyword { color: #599eff; }\n.cm-s-night span.cm-string { color: #37f14a; }\n.cm-s-night span.cm-meta { color: #7678e2; }\n.cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; }\n.cm-s-night span.cm-variable-3, .cm-s-night span.cm-def, .cm-s-night span.cm-type { color: white; }\n.cm-s-night span.cm-bracket { color: #8da6ce; }\n.cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; }\n.cm-s-night span.cm-link { color: #845dc4; }\n.cm-s-night span.cm-error { color: #9d1e15; }\n\n.cm-s-night .CodeMirror-activeline-background { background: #1C005A; }\n.cm-s-night .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/nord.css",
    "content": "/* Based on arcticicestudio's Nord theme */\n/* https://github.com/arcticicestudio/nord */\n\n.cm-s-nord.CodeMirror { background: #2e3440; color: #d8dee9; }\n.cm-s-nord div.CodeMirror-selected { background: #434c5e; }\n.cm-s-nord .CodeMirror-line::selection, .cm-s-nord .CodeMirror-line > span::selection, .cm-s-nord .CodeMirror-line > span > span::selection { background: #3b4252; }\n.cm-s-nord .CodeMirror-line::-moz-selection, .cm-s-nord .CodeMirror-line > span::-moz-selection, .cm-s-nord .CodeMirror-line > span > span::-moz-selection { background: #3b4252; }\n.cm-s-nord .CodeMirror-gutters { background: #2e3440; border-right: 0px; }\n.cm-s-nord .CodeMirror-guttermarker { color: #4c566a; }\n.cm-s-nord .CodeMirror-guttermarker-subtle { color: #4c566a; }\n.cm-s-nord .CodeMirror-linenumber { color: #4c566a; }\n.cm-s-nord .CodeMirror-cursor { border-left: 1px solid #f8f8f0; }\n\n.cm-s-nord span.cm-comment { color: #4c566a; }\n.cm-s-nord span.cm-atom { color: #b48ead; }\n.cm-s-nord span.cm-number { color: #b48ead; }\n\n.cm-s-nord span.cm-comment.cm-attribute { color: #97b757; }\n.cm-s-nord span.cm-comment.cm-def { color: #bc9262; }\n.cm-s-nord span.cm-comment.cm-tag { color: #bc6283; }\n.cm-s-nord span.cm-comment.cm-type { color: #5998a6; }\n\n.cm-s-nord span.cm-property, .cm-s-nord span.cm-attribute { color: #8FBCBB; }\n.cm-s-nord span.cm-keyword { color: #81A1C1; }\n.cm-s-nord span.cm-builtin { color: #81A1C1; }\n.cm-s-nord span.cm-string { color: #A3BE8C; }\n\n.cm-s-nord span.cm-variable { color: #d8dee9; }\n.cm-s-nord span.cm-variable-2 { color: #d8dee9; }\n.cm-s-nord span.cm-variable-3, .cm-s-nord span.cm-type { color: #d8dee9; }\n.cm-s-nord span.cm-def { color: #8FBCBB; }\n.cm-s-nord span.cm-bracket { color: #81A1C1; }\n.cm-s-nord span.cm-tag { color: #bf616a; }\n.cm-s-nord span.cm-header { color: #b48ead; }\n.cm-s-nord span.cm-link { color: #b48ead; }\n.cm-s-nord span.cm-error { background: #bf616a; color: #f8f8f0; }\n\n.cm-s-nord .CodeMirror-activeline-background { background: #3b4252; }\n.cm-s-nord .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/oceanic-next.css",
    "content": "/*\n\n    Name:       oceanic-next\n    Author:     Filype Pereira (https://github.com/fpereira1)\n\n    Original oceanic-next color scheme by Dmitri Voronianski (https://github.com/voronianski/oceanic-next-color-scheme)\n\n*/\n\n.cm-s-oceanic-next.CodeMirror { background: #304148; color: #f8f8f2; }\n.cm-s-oceanic-next div.CodeMirror-selected { background: rgba(101, 115, 126, 0.33); }\n.cm-s-oceanic-next .CodeMirror-line::selection, .cm-s-oceanic-next .CodeMirror-line > span::selection, .cm-s-oceanic-next .CodeMirror-line > span > span::selection { background: rgba(101, 115, 126, 0.33); }\n.cm-s-oceanic-next .CodeMirror-line::-moz-selection, .cm-s-oceanic-next .CodeMirror-line > span::-moz-selection, .cm-s-oceanic-next .CodeMirror-line > span > span::-moz-selection { background: rgba(101, 115, 126, 0.33); }\n.cm-s-oceanic-next .CodeMirror-gutters { background: #304148; border-right: 10px; }\n.cm-s-oceanic-next .CodeMirror-guttermarker { color: white; }\n.cm-s-oceanic-next .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-oceanic-next .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-oceanic-next .CodeMirror-cursor { border-left: 1px solid #f8f8f0; }\n.cm-s-oceanic-next.cm-fat-cursor .CodeMirror-cursor { background-color: #a2a8a175 !important; }\n.cm-s-oceanic-next .cm-animate-fat-cursor { background-color: #a2a8a175 !important; }\n\n.cm-s-oceanic-next span.cm-comment { color: #65737E; }\n.cm-s-oceanic-next span.cm-atom { color: #C594C5; }\n.cm-s-oceanic-next span.cm-number { color: #F99157; }\n\n.cm-s-oceanic-next span.cm-property { color: #99C794; }\n.cm-s-oceanic-next span.cm-attribute,\n.cm-s-oceanic-next span.cm-keyword { color: #C594C5; }\n.cm-s-oceanic-next span.cm-builtin { color: #66d9ef; }\n.cm-s-oceanic-next span.cm-string { color: #99C794; }\n\n.cm-s-oceanic-next span.cm-variable,\n.cm-s-oceanic-next span.cm-variable-2,\n.cm-s-oceanic-next span.cm-variable-3 { color: #f8f8f2; }\n.cm-s-oceanic-next span.cm-def { color: #6699CC; }\n.cm-s-oceanic-next span.cm-bracket { color: #5FB3B3; }\n.cm-s-oceanic-next span.cm-tag { color: #C594C5; }\n.cm-s-oceanic-next span.cm-header { color: #C594C5; }\n.cm-s-oceanic-next span.cm-link { color: #C594C5; }\n.cm-s-oceanic-next span.cm-error { background: #C594C5; color: #f8f8f0; }\n\n.cm-s-oceanic-next .CodeMirror-activeline-background { background: rgba(101, 115, 126, 0.33); }\n.cm-s-oceanic-next .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/panda-syntax.css",
    "content": "/*\n\tName:       Panda Syntax\n\tAuthor:     Siamak Mokhtari (http://github.com/siamak/)\n\tCodeMirror template by Siamak Mokhtari (https://github.com/siamak/atom-panda-syntax)\n*/\n.cm-s-panda-syntax {\n\tbackground: #292A2B;\n\tcolor: #E6E6E6;\n\tline-height: 1.5;\n\tfont-family: 'Operator Mono', 'Source Code Pro', Menlo, Monaco, Consolas, Courier New, monospace;\n}\n.cm-s-panda-syntax .CodeMirror-cursor { border-color: #ff2c6d; }\n.cm-s-panda-syntax .CodeMirror-activeline-background {\n\tbackground: rgba(99, 123, 156, 0.1);\n}\n.cm-s-panda-syntax .CodeMirror-selected {\n\tbackground: #FFF;\n}\n.cm-s-panda-syntax .cm-comment {\n\tfont-style: italic;\n\tcolor: #676B79;\n}\n.cm-s-panda-syntax .cm-operator {\n\tcolor: #f3f3f3;\n}\n.cm-s-panda-syntax .cm-string {\n\tcolor: #19F9D8;\n}\n.cm-s-panda-syntax .cm-string-2 {\n    color: #FFB86C;\n}\n\n.cm-s-panda-syntax .cm-tag {\n\tcolor: #ff2c6d;\n}\n.cm-s-panda-syntax .cm-meta {\n\tcolor: #b084eb;\n}\n\n.cm-s-panda-syntax .cm-number {\n\tcolor: #FFB86C;\n}\n.cm-s-panda-syntax .cm-atom {\n\tcolor: #ff2c6d;\n}\n.cm-s-panda-syntax .cm-keyword {\n\tcolor: #FF75B5;\n}\n.cm-s-panda-syntax .cm-variable {\n\tcolor: #ffb86c;\n}\n.cm-s-panda-syntax .cm-variable-2 {\n\tcolor: #ff9ac1;\n}\n.cm-s-panda-syntax .cm-variable-3, .cm-s-panda-syntax .cm-type {\n\tcolor: #ff9ac1;\n}\n\n.cm-s-panda-syntax .cm-def {\n\tcolor: #e6e6e6;\n}\n.cm-s-panda-syntax .cm-property {\n\tcolor: #f3f3f3;\n}\n.cm-s-panda-syntax .cm-unit {\n    color: #ffb86c;\n}\n\n.cm-s-panda-syntax .cm-attribute {\n    color: #ffb86c;\n}\n\n.cm-s-panda-syntax .CodeMirror-matchingbracket {\n    border-bottom: 1px dotted #19F9D8;\n    padding-bottom: 2px;\n    color: #e6e6e6;\n}\n.cm-s-panda-syntax .CodeMirror-gutters {\n    background: #292a2b;\n    border-right-color: rgba(255, 255, 255, 0.1);\n}\n.cm-s-panda-syntax .CodeMirror-linenumber {\n    color: #e6e6e6;\n    opacity: 0.6;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/paraiso-dark.css",
    "content": "/*\n\n    Name:       Paraíso (Dark)\n    Author:     Jan T. Sott\n\n    Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n\n*/\n\n.cm-s-paraiso-dark.CodeMirror { background: #2f1e2e; color: #b9b6b0; }\n.cm-s-paraiso-dark div.CodeMirror-selected { background: #41323f; }\n.cm-s-paraiso-dark .CodeMirror-line::selection, .cm-s-paraiso-dark .CodeMirror-line > span::selection, .cm-s-paraiso-dark .CodeMirror-line > span > span::selection { background: rgba(65, 50, 63, .99); }\n.cm-s-paraiso-dark .CodeMirror-line::-moz-selection, .cm-s-paraiso-dark .CodeMirror-line > span::-moz-selection, .cm-s-paraiso-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(65, 50, 63, .99); }\n.cm-s-paraiso-dark .CodeMirror-gutters { background: #2f1e2e; border-right: 0px; }\n.cm-s-paraiso-dark .CodeMirror-guttermarker { color: #ef6155; }\n.cm-s-paraiso-dark .CodeMirror-guttermarker-subtle { color: #776e71; }\n.cm-s-paraiso-dark .CodeMirror-linenumber { color: #776e71; }\n.cm-s-paraiso-dark .CodeMirror-cursor { border-left: 1px solid #8d8687; }\n\n.cm-s-paraiso-dark span.cm-comment { color: #e96ba8; }\n.cm-s-paraiso-dark span.cm-atom { color: #815ba4; }\n.cm-s-paraiso-dark span.cm-number { color: #815ba4; }\n\n.cm-s-paraiso-dark span.cm-property, .cm-s-paraiso-dark span.cm-attribute { color: #48b685; }\n.cm-s-paraiso-dark span.cm-keyword { color: #ef6155; }\n.cm-s-paraiso-dark span.cm-string { color: #fec418; }\n\n.cm-s-paraiso-dark span.cm-variable { color: #48b685; }\n.cm-s-paraiso-dark span.cm-variable-2 { color: #06b6ef; }\n.cm-s-paraiso-dark span.cm-def { color: #f99b15; }\n.cm-s-paraiso-dark span.cm-bracket { color: #b9b6b0; }\n.cm-s-paraiso-dark span.cm-tag { color: #ef6155; }\n.cm-s-paraiso-dark span.cm-link { color: #815ba4; }\n.cm-s-paraiso-dark span.cm-error { background: #ef6155; color: #8d8687; }\n\n.cm-s-paraiso-dark .CodeMirror-activeline-background { background: #4D344A; }\n.cm-s-paraiso-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/paraiso-light.css",
    "content": "/*\n\n    Name:       Paraíso (Light)\n    Author:     Jan T. Sott\n\n    Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n\n*/\n\n.cm-s-paraiso-light.CodeMirror { background: #e7e9db; color: #41323f; }\n.cm-s-paraiso-light div.CodeMirror-selected { background: #b9b6b0; }\n.cm-s-paraiso-light .CodeMirror-line::selection, .cm-s-paraiso-light .CodeMirror-line > span::selection, .cm-s-paraiso-light .CodeMirror-line > span > span::selection { background: #b9b6b0; }\n.cm-s-paraiso-light .CodeMirror-line::-moz-selection, .cm-s-paraiso-light .CodeMirror-line > span::-moz-selection, .cm-s-paraiso-light .CodeMirror-line > span > span::-moz-selection { background: #b9b6b0; }\n.cm-s-paraiso-light .CodeMirror-gutters { background: #e7e9db; border-right: 0px; }\n.cm-s-paraiso-light .CodeMirror-guttermarker { color: black; }\n.cm-s-paraiso-light .CodeMirror-guttermarker-subtle { color: #8d8687; }\n.cm-s-paraiso-light .CodeMirror-linenumber { color: #8d8687; }\n.cm-s-paraiso-light .CodeMirror-cursor { border-left: 1px solid #776e71; }\n\n.cm-s-paraiso-light span.cm-comment { color: #e96ba8; }\n.cm-s-paraiso-light span.cm-atom { color: #815ba4; }\n.cm-s-paraiso-light span.cm-number { color: #815ba4; }\n\n.cm-s-paraiso-light span.cm-property, .cm-s-paraiso-light span.cm-attribute { color: #48b685; }\n.cm-s-paraiso-light span.cm-keyword { color: #ef6155; }\n.cm-s-paraiso-light span.cm-string { color: #fec418; }\n\n.cm-s-paraiso-light span.cm-variable { color: #48b685; }\n.cm-s-paraiso-light span.cm-variable-2 { color: #06b6ef; }\n.cm-s-paraiso-light span.cm-def { color: #f99b15; }\n.cm-s-paraiso-light span.cm-bracket { color: #41323f; }\n.cm-s-paraiso-light span.cm-tag { color: #ef6155; }\n.cm-s-paraiso-light span.cm-link { color: #815ba4; }\n.cm-s-paraiso-light span.cm-error { background: #ef6155; color: #776e71; }\n\n.cm-s-paraiso-light .CodeMirror-activeline-background { background: #CFD1C4; }\n.cm-s-paraiso-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/pastel-on-dark.css",
    "content": "/**\n * Pastel On Dark theme ported from ACE editor\n * @license MIT\n * @copyright AtomicPages LLC 2014\n * @author Dennis Thompson, AtomicPages LLC\n * @version 1.1\n * @source https://github.com/atomicpages/codemirror-pastel-on-dark-theme\n */\n\n.cm-s-pastel-on-dark.CodeMirror {\n\tbackground: #2c2827;\n\tcolor: #8F938F;\n\tline-height: 1.5;\n}\n.cm-s-pastel-on-dark div.CodeMirror-selected { background: rgba(221,240,255,0.2); }\n.cm-s-pastel-on-dark .CodeMirror-line::selection, .cm-s-pastel-on-dark .CodeMirror-line > span::selection, .cm-s-pastel-on-dark .CodeMirror-line > span > span::selection { background: rgba(221,240,255,0.2); }\n.cm-s-pastel-on-dark .CodeMirror-line::-moz-selection, .cm-s-pastel-on-dark .CodeMirror-line > span::-moz-selection, .cm-s-pastel-on-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(221,240,255,0.2); }\n\n.cm-s-pastel-on-dark .CodeMirror-gutters {\n\tbackground: #34302f;\n\tborder-right: 0px;\n\tpadding: 0 3px;\n}\n.cm-s-pastel-on-dark .CodeMirror-guttermarker { color: white; }\n.cm-s-pastel-on-dark .CodeMirror-guttermarker-subtle { color: #8F938F; }\n.cm-s-pastel-on-dark .CodeMirror-linenumber { color: #8F938F; }\n.cm-s-pastel-on-dark .CodeMirror-cursor { border-left: 1px solid #A7A7A7; }\n.cm-s-pastel-on-dark span.cm-comment { color: #A6C6FF; }\n.cm-s-pastel-on-dark span.cm-atom { color: #DE8E30; }\n.cm-s-pastel-on-dark span.cm-number { color: #CCCCCC; }\n.cm-s-pastel-on-dark span.cm-property { color: #8F938F; }\n.cm-s-pastel-on-dark span.cm-attribute { color: #a6e22e; }\n.cm-s-pastel-on-dark span.cm-keyword { color: #AEB2F8; }\n.cm-s-pastel-on-dark span.cm-string { color: #66A968; }\n.cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; }\n.cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; }\n.cm-s-pastel-on-dark span.cm-variable-3, .cm-s-pastel-on-dark span.cm-type { color: #DE8E30; }\n.cm-s-pastel-on-dark span.cm-def { color: #757aD8; }\n.cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; }\n.cm-s-pastel-on-dark span.cm-tag { color: #C1C144; }\n.cm-s-pastel-on-dark span.cm-link { color: #ae81ff; }\n.cm-s-pastel-on-dark span.cm-qualifier,.cm-s-pastel-on-dark span.cm-builtin { color: #C1C144; }\n.cm-s-pastel-on-dark span.cm-error {\n\tbackground: #757aD8;\n\tcolor: #f8f8f0;\n}\n.cm-s-pastel-on-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.031); }\n.cm-s-pastel-on-dark .CodeMirror-matchingbracket {\n\tborder: 1px solid rgba(255,255,255,0.25);\n\tcolor: #8F938F !important;\n\tmargin: -1px -1px 0 -1px;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/railscasts.css",
    "content": "/*\n\n    Name:       Railscasts\n    Author:     Ryan Bates (http://railscasts.com)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-railscasts.CodeMirror {background: #2b2b2b; color: #f4f1ed;}\n.cm-s-railscasts div.CodeMirror-selected {background: #272935 !important;}\n.cm-s-railscasts .CodeMirror-gutters {background: #2b2b2b; border-right: 0px;}\n.cm-s-railscasts .CodeMirror-linenumber {color: #5a647e;}\n.cm-s-railscasts .CodeMirror-cursor {border-left: 1px solid #d4cfc9 !important;}\n\n.cm-s-railscasts span.cm-comment {color: #bc9458;}\n.cm-s-railscasts span.cm-atom {color: #b6b3eb;}\n.cm-s-railscasts span.cm-number {color: #b6b3eb;}\n\n.cm-s-railscasts span.cm-property, .cm-s-railscasts span.cm-attribute {color: #a5c261;}\n.cm-s-railscasts span.cm-keyword {color: #da4939;}\n.cm-s-railscasts span.cm-string {color: #ffc66d;}\n\n.cm-s-railscasts span.cm-variable {color: #a5c261;}\n.cm-s-railscasts span.cm-variable-2 {color: #6d9cbe;}\n.cm-s-railscasts span.cm-def {color: #cc7833;}\n.cm-s-railscasts span.cm-error {background: #da4939; color: #d4cfc9;}\n.cm-s-railscasts span.cm-bracket {color: #f4f1ed;}\n.cm-s-railscasts span.cm-tag {color: #da4939;}\n.cm-s-railscasts span.cm-link {color: #b6b3eb;}\n\n.cm-s-railscasts .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n.cm-s-railscasts .CodeMirror-activeline-background { background: #303040; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/rubyblue.css",
    "content": ".cm-s-rubyblue.CodeMirror { background: #112435; color: white; }\n.cm-s-rubyblue div.CodeMirror-selected { background: #38566F; }\n.cm-s-rubyblue .CodeMirror-line::selection, .cm-s-rubyblue .CodeMirror-line > span::selection, .cm-s-rubyblue .CodeMirror-line > span > span::selection { background: rgba(56, 86, 111, 0.99); }\n.cm-s-rubyblue .CodeMirror-line::-moz-selection, .cm-s-rubyblue .CodeMirror-line > span::-moz-selection, .cm-s-rubyblue .CodeMirror-line > span > span::-moz-selection { background: rgba(56, 86, 111, 0.99); }\n.cm-s-rubyblue .CodeMirror-gutters { background: #1F4661; border-right: 7px solid #3E7087; }\n.cm-s-rubyblue .CodeMirror-guttermarker { color: white; }\n.cm-s-rubyblue .CodeMirror-guttermarker-subtle { color: #3E7087; }\n.cm-s-rubyblue .CodeMirror-linenumber { color: white; }\n.cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; }\n.cm-s-rubyblue span.cm-atom { color: #F4C20B; }\n.cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; }\n.cm-s-rubyblue span.cm-keyword { color: #F0F; }\n.cm-s-rubyblue span.cm-string { color: #F08047; }\n.cm-s-rubyblue span.cm-meta { color: #F0F; }\n.cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; }\n.cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def, .cm-s-rubyblue span.cm-type { color: white; }\n.cm-s-rubyblue span.cm-bracket { color: #F0F; }\n.cm-s-rubyblue span.cm-link { color: #F4C20B; }\n.cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; }\n.cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; }\n.cm-s-rubyblue span.cm-error { color: #AF2018; }\n\n.cm-s-rubyblue .CodeMirror-activeline-background { background: #173047; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/seti.css",
    "content": "/*\n\n    Name:       seti\n    Author:     Michael Kaminsky (http://github.com/mkaminsky11)\n\n    Original seti color scheme by Jesse Weed (https://github.com/jesseweed/seti-syntax)\n\n*/\n\n\n.cm-s-seti.CodeMirror {\n  background-color: #151718 !important;\n  color: #CFD2D1 !important;\n  border: none;\n}\n.cm-s-seti .CodeMirror-gutters {\n  color: #404b53;\n  background-color: #0E1112;\n  border: none;\n}\n.cm-s-seti .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-seti .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-seti.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-seti .CodeMirror-line::selection, .cm-s-seti .CodeMirror-line > span::selection, .cm-s-seti .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-seti .CodeMirror-line::-moz-selection, .cm-s-seti .CodeMirror-line > span::-moz-selection, .cm-s-seti .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-seti span.cm-comment { color: #41535b; }\n.cm-s-seti span.cm-string, .cm-s-seti span.cm-string-2 { color: #55b5db; }\n.cm-s-seti span.cm-number { color: #cd3f45; }\n.cm-s-seti span.cm-variable { color: #55b5db; }\n.cm-s-seti span.cm-variable-2 { color: #a074c4; }\n.cm-s-seti span.cm-def { color: #55b5db; }\n.cm-s-seti span.cm-keyword { color: #ff79c6; }\n.cm-s-seti span.cm-operator { color: #9fca56; }\n.cm-s-seti span.cm-keyword { color: #e6cd69; }\n.cm-s-seti span.cm-atom { color: #cd3f45; }\n.cm-s-seti span.cm-meta { color: #55b5db; }\n.cm-s-seti span.cm-tag { color: #55b5db; }\n.cm-s-seti span.cm-attribute { color: #9fca56; }\n.cm-s-seti span.cm-qualifier { color: #9fca56; }\n.cm-s-seti span.cm-property { color: #a074c4; }\n.cm-s-seti span.cm-variable-3, .cm-s-seti span.cm-type { color: #9fca56; }\n.cm-s-seti span.cm-builtin { color: #9fca56; }\n.cm-s-seti .CodeMirror-activeline-background { background: #101213; }\n.cm-s-seti .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/shadowfox.css",
    "content": "/*\n\n    Name:       shadowfox\n    Author:     overdodactyl (http://github.com/overdodactyl)\n\n    Original shadowfox color scheme by Firefox\n\n*/\n\n.cm-s-shadowfox.CodeMirror { background: #2a2a2e; color: #b1b1b3; }\n.cm-s-shadowfox div.CodeMirror-selected { background: #353B48; }\n.cm-s-shadowfox .CodeMirror-line::selection, .cm-s-shadowfox .CodeMirror-line > span::selection, .cm-s-shadowfox .CodeMirror-line > span > span::selection { background: #353B48; }\n.cm-s-shadowfox .CodeMirror-line::-moz-selection, .cm-s-shadowfox .CodeMirror-line > span::-moz-selection, .cm-s-shadowfox .CodeMirror-line > span > span::-moz-selection { background: #353B48; }\n.cm-s-shadowfox .CodeMirror-gutters { background: #0c0c0d ; border-right: 1px solid #0c0c0d; }\n.cm-s-shadowfox .CodeMirror-guttermarker { color: #555; }\n.cm-s-shadowfox .CodeMirror-linenumber { color: #939393; }\n.cm-s-shadowfox .CodeMirror-cursor { border-left: 1px solid #fff; }\n\n.cm-s-shadowfox span.cm-comment { color: #939393; }\n.cm-s-shadowfox span.cm-atom { color: #FF7DE9; }\n.cm-s-shadowfox span.cm-quote { color: #FF7DE9; }\n.cm-s-shadowfox span.cm-builtin { color: #FF7DE9; }\n.cm-s-shadowfox span.cm-attribute { color: #FF7DE9; }\n.cm-s-shadowfox span.cm-keyword { color: #FF7DE9; }\n.cm-s-shadowfox span.cm-error { color: #FF7DE9; }\n\n.cm-s-shadowfox span.cm-number { color: #6B89FF; }\n.cm-s-shadowfox span.cm-string { color: #6B89FF; }\n.cm-s-shadowfox span.cm-string-2 { color: #6B89FF; }\n\n.cm-s-shadowfox span.cm-meta { color: #939393; }\n.cm-s-shadowfox span.cm-hr { color: #939393; }\n\n.cm-s-shadowfox span.cm-header { color: #75BFFF; }\n.cm-s-shadowfox span.cm-qualifier { color: #75BFFF; }\n.cm-s-shadowfox span.cm-variable-2 { color: #75BFFF; }\n\n.cm-s-shadowfox span.cm-property { color: #86DE74; }\n\n.cm-s-shadowfox span.cm-def { color: #75BFFF; }\n.cm-s-shadowfox span.cm-bracket { color: #75BFFF; }\n.cm-s-shadowfox span.cm-tag { color: #75BFFF; }\n.cm-s-shadowfox span.cm-link:visited { color: #75BFFF; }\n\n.cm-s-shadowfox span.cm-variable { color: #B98EFF; }\n.cm-s-shadowfox span.cm-variable-3 { color: #d7d7db; }\n.cm-s-shadowfox span.cm-link { color: #737373; }\n.cm-s-shadowfox span.cm-operator { color: #b1b1b3; }\n.cm-s-shadowfox span.cm-special { color: #d7d7db; }\n\n.cm-s-shadowfox .CodeMirror-activeline-background { background: rgba(185, 215, 253, .15) }\n.cm-s-shadowfox .CodeMirror-matchingbracket { outline: solid 1px rgba(255, 255, 255, .25); color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/solarized.css",
    "content": "/*\nSolarized theme for code-mirror\nhttp://ethanschoonover.com/solarized\n*/\n\n/*\nSolarized color palette\nhttp://ethanschoonover.com/solarized/img/solarized-palette.png\n*/\n\n.solarized.base03 { color: #002b36; }\n.solarized.base02 { color: #073642; }\n.solarized.base01 { color: #586e75; }\n.solarized.base00 { color: #657b83; }\n.solarized.base0 { color: #839496; }\n.solarized.base1 { color: #93a1a1; }\n.solarized.base2 { color: #eee8d5; }\n.solarized.base3  { color: #fdf6e3; }\n.solarized.solar-yellow  { color: #b58900; }\n.solarized.solar-orange  { color: #cb4b16; }\n.solarized.solar-red { color: #dc322f; }\n.solarized.solar-magenta { color: #d33682; }\n.solarized.solar-violet  { color: #6c71c4; }\n.solarized.solar-blue { color: #268bd2; }\n.solarized.solar-cyan { color: #2aa198; }\n.solarized.solar-green { color: #859900; }\n\n/* Color scheme for code-mirror */\n\n.cm-s-solarized {\n  line-height: 1.45em;\n  color-profile: sRGB;\n  rendering-intent: auto;\n}\n.cm-s-solarized.cm-s-dark {\n  color: #839496;\n  background-color: #002b36;\n}\n.cm-s-solarized.cm-s-light {\n  background-color: #fdf6e3;\n  color: #657b83;\n}\n\n.cm-s-solarized .CodeMirror-widget {\n  text-shadow: none;\n}\n\n.cm-s-solarized .cm-header { color: #586e75; }\n.cm-s-solarized .cm-quote { color: #93a1a1; }\n\n.cm-s-solarized .cm-keyword { color: #cb4b16; }\n.cm-s-solarized .cm-atom { color: #d33682; }\n.cm-s-solarized .cm-number { color: #d33682; }\n.cm-s-solarized .cm-def { color: #2aa198; }\n\n.cm-s-solarized .cm-variable { color: #839496; }\n.cm-s-solarized .cm-variable-2 { color: #b58900; }\n.cm-s-solarized .cm-variable-3, .cm-s-solarized .cm-type { color: #6c71c4; }\n\n.cm-s-solarized .cm-property { color: #2aa198; }\n.cm-s-solarized .cm-operator { color: #6c71c4; }\n\n.cm-s-solarized .cm-comment { color: #586e75; font-style:italic; }\n\n.cm-s-solarized .cm-string { color: #859900; }\n.cm-s-solarized .cm-string-2 { color: #b58900; }\n\n.cm-s-solarized .cm-meta { color: #859900; }\n.cm-s-solarized .cm-qualifier { color: #b58900; }\n.cm-s-solarized .cm-builtin { color: #d33682; }\n.cm-s-solarized .cm-bracket { color: #cb4b16; }\n.cm-s-solarized .CodeMirror-matchingbracket { color: #859900; }\n.cm-s-solarized .CodeMirror-nonmatchingbracket { color: #dc322f; }\n.cm-s-solarized .cm-tag { color: #93a1a1; }\n.cm-s-solarized .cm-attribute { color: #2aa198; }\n.cm-s-solarized .cm-hr {\n  color: transparent;\n  border-top: 1px solid #586e75;\n  display: block;\n}\n.cm-s-solarized .cm-link { color: #93a1a1; cursor: pointer; }\n.cm-s-solarized .cm-special { color: #6c71c4; }\n.cm-s-solarized .cm-em {\n  color: #999;\n  text-decoration: underline;\n  text-decoration-style: dotted;\n}\n.cm-s-solarized .cm-error,\n.cm-s-solarized .cm-invalidchar {\n  color: #586e75;\n  border-bottom: 1px dotted #dc322f;\n}\n\n.cm-s-solarized.cm-s-dark div.CodeMirror-selected { background: #073642; }\n.cm-s-solarized.cm-s-dark.CodeMirror ::selection { background: rgba(7, 54, 66, 0.99); }\n.cm-s-solarized.cm-s-dark .CodeMirror-line::-moz-selection, .cm-s-dark .CodeMirror-line > span::-moz-selection, .cm-s-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(7, 54, 66, 0.99); }\n\n.cm-s-solarized.cm-s-light div.CodeMirror-selected { background: #eee8d5; }\n.cm-s-solarized.cm-s-light .CodeMirror-line::selection, .cm-s-light .CodeMirror-line > span::selection, .cm-s-light .CodeMirror-line > span > span::selection { background: #eee8d5; }\n.cm-s-solarized.cm-s-light .CodeMirror-line::-moz-selection, .cm-s-light .CodeMirror-line > span::-moz-selection, .cm-s-light .CodeMirror-line > span > span::-moz-selection { background: #eee8d5; }\n\n/* Editor styling */\n\n\n\n/* Little shadow on the view-port of the buffer view */\n.cm-s-solarized.CodeMirror {\n  -moz-box-shadow: inset 7px 0 12px -6px #000;\n  -webkit-box-shadow: inset 7px 0 12px -6px #000;\n  box-shadow: inset 7px 0 12px -6px #000;\n}\n\n/* Remove gutter border */\n.cm-s-solarized .CodeMirror-gutters {\n  border-right: 0;\n}\n\n/* Gutter colors and line number styling based of color scheme (dark / light) */\n\n/* Dark */\n.cm-s-solarized.cm-s-dark .CodeMirror-gutters {\n  background-color: #073642;\n}\n\n.cm-s-solarized.cm-s-dark .CodeMirror-linenumber {\n  color: #586e75;\n}\n\n/* Light */\n.cm-s-solarized.cm-s-light .CodeMirror-gutters {\n  background-color: #eee8d5;\n}\n\n.cm-s-solarized.cm-s-light .CodeMirror-linenumber {\n  color: #839496;\n}\n\n/* Common */\n.cm-s-solarized .CodeMirror-linenumber {\n  padding: 0 5px;\n}\n.cm-s-solarized .CodeMirror-guttermarker-subtle { color: #586e75; }\n.cm-s-solarized.cm-s-dark .CodeMirror-guttermarker { color: #ddd; }\n.cm-s-solarized.cm-s-light .CodeMirror-guttermarker { color: #cb4b16; }\n\n.cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text {\n  color: #586e75;\n}\n\n/* Cursor */\n.cm-s-solarized .CodeMirror-cursor { border-left: 1px solid #819090; }\n\n/* Fat cursor */\n.cm-s-solarized.cm-s-light.cm-fat-cursor .CodeMirror-cursor { background: #77ee77; }\n.cm-s-solarized.cm-s-light .cm-animate-fat-cursor { background-color: #77ee77; }\n.cm-s-solarized.cm-s-dark.cm-fat-cursor .CodeMirror-cursor { background: #586e75; }\n.cm-s-solarized.cm-s-dark .cm-animate-fat-cursor { background-color: #586e75; }\n\n/* Active line */\n.cm-s-solarized.cm-s-dark .CodeMirror-activeline-background {\n  background: rgba(255, 255, 255, 0.06);\n}\n.cm-s-solarized.cm-s-light .CodeMirror-activeline-background {\n  background: rgba(0, 0, 0, 0.06);\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/ssms.css",
    "content": ".cm-s-ssms span.cm-keyword { color: blue; }\n.cm-s-ssms span.cm-comment { color: darkgreen; }\n.cm-s-ssms span.cm-string { color: red; }\n.cm-s-ssms span.cm-def { color: black; }\n.cm-s-ssms span.cm-variable { color: black; }\n.cm-s-ssms span.cm-variable-2 { color: black; }\n.cm-s-ssms span.cm-atom { color: darkgray; }\n.cm-s-ssms .CodeMirror-linenumber { color: teal; }\n.cm-s-ssms .CodeMirror-activeline-background { background: #ffffff; }\n.cm-s-ssms span.cm-string-2 { color: #FF00FF; }\n.cm-s-ssms span.cm-operator, \n.cm-s-ssms span.cm-bracket, \n.cm-s-ssms span.cm-punctuation { color: darkgray; }\n.cm-s-ssms .CodeMirror-gutters { border-right: 3px solid #ffee62; background-color: #ffffff; }\n.cm-s-ssms div.CodeMirror-selected { background: #ADD6FF; }\n\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/the-matrix.css",
    "content": ".cm-s-the-matrix.CodeMirror { background: #000000; color: #00FF00; }\n.cm-s-the-matrix div.CodeMirror-selected { background: #2D2D2D; }\n.cm-s-the-matrix .CodeMirror-line::selection, .cm-s-the-matrix .CodeMirror-line > span::selection, .cm-s-the-matrix .CodeMirror-line > span > span::selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-the-matrix .CodeMirror-line::-moz-selection, .cm-s-the-matrix .CodeMirror-line > span::-moz-selection, .cm-s-the-matrix .CodeMirror-line > span > span::-moz-selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-the-matrix .CodeMirror-gutters { background: #060; border-right: 2px solid #00FF00; }\n.cm-s-the-matrix .CodeMirror-guttermarker { color: #0f0; }\n.cm-s-the-matrix .CodeMirror-guttermarker-subtle { color: white; }\n.cm-s-the-matrix .CodeMirror-linenumber { color: #FFFFFF; }\n.cm-s-the-matrix .CodeMirror-cursor { border-left: 1px solid #00FF00; }\n\n.cm-s-the-matrix span.cm-keyword { color: #008803; font-weight: bold; }\n.cm-s-the-matrix span.cm-atom { color: #3FF; }\n.cm-s-the-matrix span.cm-number { color: #FFB94F; }\n.cm-s-the-matrix span.cm-def { color: #99C; }\n.cm-s-the-matrix span.cm-variable { color: #F6C; }\n.cm-s-the-matrix span.cm-variable-2 { color: #C6F; }\n.cm-s-the-matrix span.cm-variable-3, .cm-s-the-matrix span.cm-type { color: #96F; }\n.cm-s-the-matrix span.cm-property { color: #62FFA0; }\n.cm-s-the-matrix span.cm-operator { color: #999; }\n.cm-s-the-matrix span.cm-comment { color: #CCCCCC; }\n.cm-s-the-matrix span.cm-string { color: #39C; }\n.cm-s-the-matrix span.cm-meta { color: #C9F; }\n.cm-s-the-matrix span.cm-qualifier { color: #FFF700; }\n.cm-s-the-matrix span.cm-builtin { color: #30a; }\n.cm-s-the-matrix span.cm-bracket { color: #cc7; }\n.cm-s-the-matrix span.cm-tag { color: #FFBD40; }\n.cm-s-the-matrix span.cm-attribute { color: #FFF700; }\n.cm-s-the-matrix span.cm-error { color: #FF0000; }\n\n.cm-s-the-matrix .CodeMirror-activeline-background { background: #040; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/tomorrow-night-bright.css",
    "content": "/*\n\n    Name:       Tomorrow Night - Bright\n    Author:     Chris Kempson\n\n    Port done by Gerard Braad <me@gbraad.nl>\n\n*/\n\n.cm-s-tomorrow-night-bright.CodeMirror { background: #000000; color: #eaeaea; }\n.cm-s-tomorrow-night-bright div.CodeMirror-selected { background: #424242; }\n.cm-s-tomorrow-night-bright .CodeMirror-gutters { background: #000000; border-right: 0px; }\n.cm-s-tomorrow-night-bright .CodeMirror-guttermarker { color: #e78c45; }\n.cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle { color: #777; }\n.cm-s-tomorrow-night-bright .CodeMirror-linenumber { color: #424242; }\n.cm-s-tomorrow-night-bright .CodeMirror-cursor { border-left: 1px solid #6A6A6A; }\n\n.cm-s-tomorrow-night-bright span.cm-comment { color: #d27b53; }\n.cm-s-tomorrow-night-bright span.cm-atom { color: #a16a94; }\n.cm-s-tomorrow-night-bright span.cm-number { color: #a16a94; }\n\n.cm-s-tomorrow-night-bright span.cm-property, .cm-s-tomorrow-night-bright span.cm-attribute { color: #99cc99; }\n.cm-s-tomorrow-night-bright span.cm-keyword { color: #d54e53; }\n.cm-s-tomorrow-night-bright span.cm-string { color: #e7c547; }\n\n.cm-s-tomorrow-night-bright span.cm-variable { color: #b9ca4a; }\n.cm-s-tomorrow-night-bright span.cm-variable-2 { color: #7aa6da; }\n.cm-s-tomorrow-night-bright span.cm-def { color: #e78c45; }\n.cm-s-tomorrow-night-bright span.cm-bracket { color: #eaeaea; }\n.cm-s-tomorrow-night-bright span.cm-tag { color: #d54e53; }\n.cm-s-tomorrow-night-bright span.cm-link { color: #a16a94; }\n.cm-s-tomorrow-night-bright span.cm-error { background: #d54e53; color: #6A6A6A; }\n\n.cm-s-tomorrow-night-bright .CodeMirror-activeline-background { background: #2a2a2a; }\n.cm-s-tomorrow-night-bright .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/tomorrow-night-eighties.css",
    "content": "/*\n\n    Name:       Tomorrow Night - Eighties\n    Author:     Chris Kempson\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-tomorrow-night-eighties.CodeMirror { background: #000000; color: #CCCCCC; }\n.cm-s-tomorrow-night-eighties div.CodeMirror-selected { background: #2D2D2D; }\n.cm-s-tomorrow-night-eighties .CodeMirror-line::selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span::selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span > span::selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-tomorrow-night-eighties .CodeMirror-line::-moz-selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span::-moz-selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span > span::-moz-selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-tomorrow-night-eighties .CodeMirror-gutters { background: #000000; border-right: 0px; }\n.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker { color: #f2777a; }\n.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker-subtle { color: #777; }\n.cm-s-tomorrow-night-eighties .CodeMirror-linenumber { color: #515151; }\n.cm-s-tomorrow-night-eighties .CodeMirror-cursor { border-left: 1px solid #6A6A6A; }\n\n.cm-s-tomorrow-night-eighties span.cm-comment { color: #d27b53; }\n.cm-s-tomorrow-night-eighties span.cm-atom { color: #a16a94; }\n.cm-s-tomorrow-night-eighties span.cm-number { color: #a16a94; }\n\n.cm-s-tomorrow-night-eighties span.cm-property, .cm-s-tomorrow-night-eighties span.cm-attribute { color: #99cc99; }\n.cm-s-tomorrow-night-eighties span.cm-keyword { color: #f2777a; }\n.cm-s-tomorrow-night-eighties span.cm-string { color: #ffcc66; }\n\n.cm-s-tomorrow-night-eighties span.cm-variable { color: #99cc99; }\n.cm-s-tomorrow-night-eighties span.cm-variable-2 { color: #6699cc; }\n.cm-s-tomorrow-night-eighties span.cm-def { color: #f99157; }\n.cm-s-tomorrow-night-eighties span.cm-bracket { color: #CCCCCC; }\n.cm-s-tomorrow-night-eighties span.cm-tag { color: #f2777a; }\n.cm-s-tomorrow-night-eighties span.cm-link { color: #a16a94; }\n.cm-s-tomorrow-night-eighties span.cm-error { background: #f2777a; color: #6A6A6A; }\n\n.cm-s-tomorrow-night-eighties .CodeMirror-activeline-background { background: #343600; }\n.cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/ttcn.css",
    "content": ".cm-s-ttcn .cm-quote { color: #090; }\n.cm-s-ttcn .cm-negative { color: #d44; }\n.cm-s-ttcn .cm-positive { color: #292; }\n.cm-s-ttcn .cm-header, .cm-strong { font-weight: bold; }\n.cm-s-ttcn .cm-em { font-style: italic; }\n.cm-s-ttcn .cm-link { text-decoration: underline; }\n.cm-s-ttcn .cm-strikethrough { text-decoration: line-through; }\n.cm-s-ttcn .cm-header { color: #00f; font-weight: bold; }\n\n.cm-s-ttcn .cm-atom { color: #219; }\n.cm-s-ttcn .cm-attribute { color: #00c; }\n.cm-s-ttcn .cm-bracket { color: #997; }\n.cm-s-ttcn .cm-comment { color: #333333; }\n.cm-s-ttcn .cm-def { color: #00f; }\n.cm-s-ttcn .cm-em { font-style: italic; }\n.cm-s-ttcn .cm-error { color: #f00; }\n.cm-s-ttcn .cm-hr { color: #999; }\n.cm-s-ttcn .cm-invalidchar { color: #f00; }\n.cm-s-ttcn .cm-keyword { font-weight:bold; }\n.cm-s-ttcn .cm-link { color: #00c; text-decoration: underline; }\n.cm-s-ttcn .cm-meta { color: #555; }\n.cm-s-ttcn .cm-negative { color: #d44; }\n.cm-s-ttcn .cm-positive { color: #292; }\n.cm-s-ttcn .cm-qualifier { color: #555; }\n.cm-s-ttcn .cm-strikethrough { text-decoration: line-through; }\n.cm-s-ttcn .cm-string { color: #006400; }\n.cm-s-ttcn .cm-string-2 { color: #f50; }\n.cm-s-ttcn .cm-strong { font-weight: bold; }\n.cm-s-ttcn .cm-tag { color: #170; }\n.cm-s-ttcn .cm-variable { color: #8B2252; }\n.cm-s-ttcn .cm-variable-2 { color: #05a; }\n.cm-s-ttcn .cm-variable-3, .cm-s-ttcn .cm-type { color: #085; }\n\n.cm-s-ttcn .cm-invalidchar { color: #f00; }\n\n/* ASN */\n.cm-s-ttcn .cm-accessTypes,\n.cm-s-ttcn .cm-compareTypes { color: #27408B; }\n.cm-s-ttcn .cm-cmipVerbs { color: #8B2252; }\n.cm-s-ttcn .cm-modifier { color:#D2691E; }\n.cm-s-ttcn .cm-status { color:#8B4545; }\n.cm-s-ttcn .cm-storage { color:#A020F0; }\n.cm-s-ttcn .cm-tags { color:#006400; }\n\n/* CFG */\n.cm-s-ttcn .cm-externalCommands { color: #8B4545; font-weight:bold; }\n.cm-s-ttcn .cm-fileNCtrlMaskOptions,\n.cm-s-ttcn .cm-sectionTitle { color: #2E8B57; font-weight:bold; }\n\n/* TTCN */\n.cm-s-ttcn .cm-booleanConsts,\n.cm-s-ttcn .cm-otherConsts,\n.cm-s-ttcn .cm-verdictConsts { color: #006400; }\n.cm-s-ttcn .cm-configOps,\n.cm-s-ttcn .cm-functionOps,\n.cm-s-ttcn .cm-portOps,\n.cm-s-ttcn .cm-sutOps,\n.cm-s-ttcn .cm-timerOps,\n.cm-s-ttcn .cm-verdictOps { color: #0000FF; }\n.cm-s-ttcn .cm-preprocessor,\n.cm-s-ttcn .cm-templateMatch,\n.cm-s-ttcn .cm-ttcn3Macros { color: #27408B; }\n.cm-s-ttcn .cm-types { color: #A52A2A; font-weight:bold; }\n.cm-s-ttcn .cm-visibilityModifiers { font-weight:bold; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/twilight.css",
    "content": ".cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/\n.cm-s-twilight div.CodeMirror-selected { background: #323232; } /**/\n.cm-s-twilight .CodeMirror-line::selection, .cm-s-twilight .CodeMirror-line > span::selection, .cm-s-twilight .CodeMirror-line > span > span::selection { background: rgba(50, 50, 50, 0.99); }\n.cm-s-twilight .CodeMirror-line::-moz-selection, .cm-s-twilight .CodeMirror-line > span::-moz-selection, .cm-s-twilight .CodeMirror-line > span > span::-moz-selection { background: rgba(50, 50, 50, 0.99); }\n\n.cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; }\n.cm-s-twilight .CodeMirror-guttermarker { color: white; }\n.cm-s-twilight .CodeMirror-guttermarker-subtle { color: #aaa; }\n.cm-s-twilight .CodeMirror-linenumber { color: #aaa; }\n.cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-twilight .cm-keyword { color: #f9ee98; } /**/\n.cm-s-twilight .cm-atom { color: #FC0; }\n.cm-s-twilight .cm-number { color:  #ca7841; } /**/\n.cm-s-twilight .cm-def { color: #8DA6CE; }\n.cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/\n.cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def, .cm-s-twilight span.cm-type { color: #607392; } /**/\n.cm-s-twilight .cm-operator { color: #cda869; } /**/\n.cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/\n.cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/\n.cm-s-twilight .cm-string-2 { color:#bd6b18; } /*?*/\n.cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/\n.cm-s-twilight .cm-builtin { color: #cda869; } /*?*/\n.cm-s-twilight .cm-tag { color: #997643; } /**/\n.cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/\n.cm-s-twilight .cm-header { color: #FF6400; }\n.cm-s-twilight .cm-hr { color: #AEAEAE; }\n.cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/\n.cm-s-twilight .cm-error { border-bottom: 1px solid red; }\n\n.cm-s-twilight .CodeMirror-activeline-background { background: #27282E; }\n.cm-s-twilight .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/vibrant-ink.css",
    "content": "/* Taken from the popular Visual Studio Vibrant Ink Schema */\n\n.cm-s-vibrant-ink.CodeMirror { background: black; color: white; }\n.cm-s-vibrant-ink div.CodeMirror-selected { background: #35493c; }\n.cm-s-vibrant-ink .CodeMirror-line::selection, .cm-s-vibrant-ink .CodeMirror-line > span::selection, .cm-s-vibrant-ink .CodeMirror-line > span > span::selection { background: rgba(53, 73, 60, 0.99); }\n.cm-s-vibrant-ink .CodeMirror-line::-moz-selection, .cm-s-vibrant-ink .CodeMirror-line > span::-moz-selection, .cm-s-vibrant-ink .CodeMirror-line > span > span::-moz-selection { background: rgba(53, 73, 60, 0.99); }\n\n.cm-s-vibrant-ink .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; }\n.cm-s-vibrant-ink .CodeMirror-guttermarker { color: white; }\n.cm-s-vibrant-ink .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-vibrant-ink .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-vibrant-ink .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-vibrant-ink .cm-keyword { color: #CC7832; }\n.cm-s-vibrant-ink .cm-atom { color: #FC0; }\n.cm-s-vibrant-ink .cm-number { color:  #FFEE98; }\n.cm-s-vibrant-ink .cm-def { color: #8DA6CE; }\n.cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D; }\n.cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def, .cm-s-vibrant span.cm-type { color: #FFC66D; }\n.cm-s-vibrant-ink .cm-operator { color: #888; }\n.cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; }\n.cm-s-vibrant-ink .cm-string { color:  #A5C25C; }\n.cm-s-vibrant-ink .cm-string-2 { color: red; }\n.cm-s-vibrant-ink .cm-meta { color: #D8FA3C; }\n.cm-s-vibrant-ink .cm-builtin { color: #8DA6CE; }\n.cm-s-vibrant-ink .cm-tag { color: #8DA6CE; }\n.cm-s-vibrant-ink .cm-attribute { color: #8DA6CE; }\n.cm-s-vibrant-ink .cm-header { color: #FF6400; }\n.cm-s-vibrant-ink .cm-hr { color: #AEAEAE; }\n.cm-s-vibrant-ink .cm-link { color: #5656F3; }\n.cm-s-vibrant-ink .cm-error { border-bottom: 1px solid red; }\n\n.cm-s-vibrant-ink .CodeMirror-activeline-background { background: #27282E; }\n.cm-s-vibrant-ink .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/xq-dark.css",
    "content": "/*\nCopyright (C) 2011 by MarkLogic Corporation\nAuthor: Mike Brevoort <mike@brevoort.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n.cm-s-xq-dark.CodeMirror { background: #0a001f; color: #f8f8f8; }\n.cm-s-xq-dark div.CodeMirror-selected { background: #27007A; }\n.cm-s-xq-dark .CodeMirror-line::selection, .cm-s-xq-dark .CodeMirror-line > span::selection, .cm-s-xq-dark .CodeMirror-line > span > span::selection { background: rgba(39, 0, 122, 0.99); }\n.cm-s-xq-dark .CodeMirror-line::-moz-selection, .cm-s-xq-dark .CodeMirror-line > span::-moz-selection, .cm-s-xq-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(39, 0, 122, 0.99); }\n.cm-s-xq-dark .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; }\n.cm-s-xq-dark .CodeMirror-guttermarker { color: #FFBD40; }\n.cm-s-xq-dark .CodeMirror-guttermarker-subtle { color: #f8f8f8; }\n.cm-s-xq-dark .CodeMirror-linenumber { color: #f8f8f8; }\n.cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-xq-dark span.cm-keyword { color: #FFBD40; }\n.cm-s-xq-dark span.cm-atom { color: #6C8CD5; }\n.cm-s-xq-dark span.cm-number { color: #164; }\n.cm-s-xq-dark span.cm-def { color: #FFF; text-decoration:underline; }\n.cm-s-xq-dark span.cm-variable { color: #FFF; }\n.cm-s-xq-dark span.cm-variable-2 { color: #EEE; }\n.cm-s-xq-dark span.cm-variable-3, .cm-s-xq-dark span.cm-type { color: #DDD; }\n.cm-s-xq-dark span.cm-property {}\n.cm-s-xq-dark span.cm-operator {}\n.cm-s-xq-dark span.cm-comment { color: gray; }\n.cm-s-xq-dark span.cm-string { color: #9FEE00; }\n.cm-s-xq-dark span.cm-meta { color: yellow; }\n.cm-s-xq-dark span.cm-qualifier { color: #FFF700; }\n.cm-s-xq-dark span.cm-builtin { color: #30a; }\n.cm-s-xq-dark span.cm-bracket { color: #cc7; }\n.cm-s-xq-dark span.cm-tag { color: #FFBD40; }\n.cm-s-xq-dark span.cm-attribute { color: #FFF700; }\n.cm-s-xq-dark span.cm-error { color: #f00; }\n\n.cm-s-xq-dark .CodeMirror-activeline-background { background: #27282E; }\n.cm-s-xq-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/xq-light.css",
    "content": "/*\nCopyright (C) 2011 by MarkLogic Corporation\nAuthor: Mike Brevoort <mike@brevoort.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n.cm-s-xq-light span.cm-keyword { line-height: 1em; font-weight: bold; color: #5A5CAD; }\n.cm-s-xq-light span.cm-atom { color: #6C8CD5; }\n.cm-s-xq-light span.cm-number { color: #164; }\n.cm-s-xq-light span.cm-def { text-decoration:underline; }\n.cm-s-xq-light span.cm-variable { color: black; }\n.cm-s-xq-light span.cm-variable-2 { color:black; }\n.cm-s-xq-light span.cm-variable-3, .cm-s-xq-light span.cm-type { color: black; }\n.cm-s-xq-light span.cm-property {}\n.cm-s-xq-light span.cm-operator {}\n.cm-s-xq-light span.cm-comment { color: #0080FF; font-style: italic; }\n.cm-s-xq-light span.cm-string { color: red; }\n.cm-s-xq-light span.cm-meta { color: yellow; }\n.cm-s-xq-light span.cm-qualifier { color: grey; }\n.cm-s-xq-light span.cm-builtin { color: #7EA656; }\n.cm-s-xq-light span.cm-bracket { color: #cc7; }\n.cm-s-xq-light span.cm-tag { color: #3F7F7F; }\n.cm-s-xq-light span.cm-attribute { color: #7F007F; }\n.cm-s-xq-light span.cm-error { color: #f00; }\n\n.cm-s-xq-light .CodeMirror-activeline-background { background: #e8f2ff; }\n.cm-s-xq-light .CodeMirror-matchingbracket { outline:1px solid grey;color:black !important;background:yellow; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/yeti.css",
    "content": "/*\n\n    Name:       yeti\n    Author:     Michael Kaminsky (http://github.com/mkaminsky11)\n\n    Original yeti color scheme by Jesse Weed (https://github.com/jesseweed/yeti-syntax)\n\n*/\n\n\n.cm-s-yeti.CodeMirror {\n  background-color: #ECEAE8 !important;\n  color: #d1c9c0 !important;\n  border: none;\n}\n\n.cm-s-yeti .CodeMirror-gutters {\n  color: #adaba6;\n  background-color: #E5E1DB;\n  border: none;\n}\n.cm-s-yeti .CodeMirror-cursor { border-left: solid thin #d1c9c0; }\n.cm-s-yeti .CodeMirror-linenumber { color: #adaba6; }\n.cm-s-yeti.CodeMirror-focused div.CodeMirror-selected { background: #DCD8D2; }\n.cm-s-yeti .CodeMirror-line::selection, .cm-s-yeti .CodeMirror-line > span::selection, .cm-s-yeti .CodeMirror-line > span > span::selection { background: #DCD8D2; }\n.cm-s-yeti .CodeMirror-line::-moz-selection, .cm-s-yeti .CodeMirror-line > span::-moz-selection, .cm-s-yeti .CodeMirror-line > span > span::-moz-selection { background: #DCD8D2; }\n.cm-s-yeti span.cm-comment { color: #d4c8be; }\n.cm-s-yeti span.cm-string, .cm-s-yeti span.cm-string-2 { color: #96c0d8; }\n.cm-s-yeti span.cm-number { color: #a074c4; }\n.cm-s-yeti span.cm-variable { color: #55b5db; }\n.cm-s-yeti span.cm-variable-2 { color: #a074c4; }\n.cm-s-yeti span.cm-def { color: #55b5db; }\n.cm-s-yeti span.cm-operator { color: #9fb96e; }\n.cm-s-yeti span.cm-keyword { color: #9fb96e; }\n.cm-s-yeti span.cm-atom { color: #a074c4; }\n.cm-s-yeti span.cm-meta { color: #96c0d8; }\n.cm-s-yeti span.cm-tag { color: #96c0d8; }\n.cm-s-yeti span.cm-attribute { color: #9fb96e; }\n.cm-s-yeti span.cm-qualifier { color: #96c0d8; }\n.cm-s-yeti span.cm-property { color: #a074c4; }\n.cm-s-yeti span.cm-builtin { color: #a074c4; }\n.cm-s-yeti span.cm-variable-3, .cm-s-yeti span.cm-type { color: #96c0d8; }\n.cm-s-yeti .CodeMirror-activeline-background { background: #E7E4E0; }\n.cm-s-yeti .CodeMirror-matchingbracket { text-decoration: underline; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/yonce.css",
    "content": "/*\n\n    Name:       yoncé\n    Author:     Thomas MacLean (http://github.com/thomasmaclean)\n\n    Original yoncé color scheme by Mina Markham (https://github.com/minamarkham)\n\n*/\n\n.cm-s-yonce.CodeMirror { background: #1C1C1C; color: #d4d4d4; } /**/\n.cm-s-yonce div.CodeMirror-selected { background: rgba(252, 69, 133, 0.478); } /**/\n.cm-s-yonce .CodeMirror-selectedtext,\n.cm-s-yonce .CodeMirror-selected,\n.cm-s-yonce .CodeMirror-line::selection,\n.cm-s-yonce .CodeMirror-line > span::selection,\n.cm-s-yonce .CodeMirror-line > span > span::selection,\n.cm-s-yonce .CodeMirror-line::-moz-selection,\n.cm-s-yonce .CodeMirror-line > span::-moz-selection,\n.cm-s-yonce .CodeMirror-line > span > span::-moz-selection { background: rgba(252, 67, 132, 0.47); }\n\n.cm-s-yonce.CodeMirror pre { padding-left: 0px; }\n.cm-s-yonce .CodeMirror-gutters {background: #1C1C1C; border-right: 0px;}\n.cm-s-yonce .CodeMirror-linenumber {color: #777777;  padding-right: 10px; }\n.cm-s-yonce .CodeMirror-activeline .CodeMirror-linenumber.CodeMirror-gutter-elt { background: #1C1C1C; color: #fc4384; }\n.cm-s-yonce .CodeMirror-linenumber { color: #777; }\n.cm-s-yonce .CodeMirror-cursor { border-left: 2px solid #FC4384; }\n.cm-s-yonce .cm-searching { background: rgba(243, 155, 53, .3) !important; outline: 1px solid #F39B35; }\n.cm-s-yonce .cm-searching.CodeMirror-selectedtext { background: rgba(243, 155, 53, .7) !important; color: white; }\n\n.cm-s-yonce .cm-keyword { color: #00A7AA; } /**/\n.cm-s-yonce .cm-atom { color: #F39B35; }\n.cm-s-yonce .cm-number, .cm-s-yonce span.cm-type { color:  #A06FCA; } /**/\n.cm-s-yonce .cm-def { color: #98E342; }\n.cm-s-yonce .cm-property,\n.cm-s-yonce span.cm-variable { color: #D4D4D4; font-style: italic; }\n.cm-s-yonce span.cm-variable-2 { color: #da7dae; font-style: italic; }\n.cm-s-yonce span.cm-variable-3 { color: #A06FCA; }\n.cm-s-yonce .cm-type.cm-def { color: #FC4384; font-style: normal; text-decoration: underline; }\n.cm-s-yonce .cm-property.cm-def { color: #FC4384; font-style: normal; }\n.cm-s-yonce .cm-callee { color: #FC4384; font-style: normal; }\n.cm-s-yonce .cm-operator { color: #FC4384; } /**/\n.cm-s-yonce .cm-qualifier,\n.cm-s-yonce .cm-tag { color: #FC4384; }\n.cm-s-yonce .cm-tag.cm-bracket { color: #D4D4D4; }\n.cm-s-yonce .cm-attribute { color: #A06FCA; }\n.cm-s-yonce .cm-comment { color:#696d70; font-style:italic; font-weight:normal; } /**/\n.cm-s-yonce .cm-comment.cm-tag { color: #FC4384 }\n.cm-s-yonce .cm-comment.cm-attribute { color: #D4D4D4; }\n.cm-s-yonce .cm-string { color:#E6DB74; } /**/\n.cm-s-yonce .cm-string-2 { color:#F39B35; } /*?*/\n.cm-s-yonce .cm-meta { color: #D4D4D4; background: inherit; }\n.cm-s-yonce .cm-builtin { color: #FC4384; } /*?*/\n.cm-s-yonce .cm-header { color: #da7dae; }\n.cm-s-yonce .cm-hr { color: #98E342; }\n.cm-s-yonce .cm-link { color:#696d70; font-style:italic; text-decoration:none; } /**/\n.cm-s-yonce .cm-error { border-bottom: 1px solid #C42412; }\n\n.cm-s-yonce .CodeMirror-activeline-background { background: #272727; }\n.cm-s-yonce .CodeMirror-matchingbracket { outline:1px solid grey; color:#D4D4D4 !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/package/theme/zenburn.css",
    "content": "/**\n * \"\n *  Using Zenburn color palette from the Emacs Zenburn Theme\n *  https://github.com/bbatsov/zenburn-emacs/blob/master/zenburn-theme.el\n *\n *  Also using parts of https://github.com/xavi/coderay-lighttable-theme\n * \"\n * From: https://github.com/wisenomad/zenburn-lighttable-theme/blob/master/zenburn.css\n */\n\n.cm-s-zenburn .CodeMirror-gutters { background: #3f3f3f !important; }\n.cm-s-zenburn .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { color: #999; }\n.cm-s-zenburn .CodeMirror-cursor { border-left: 1px solid white; }\n.cm-s-zenburn.CodeMirror { background-color: #3f3f3f; color: #dcdccc; }\n.cm-s-zenburn span.cm-builtin { color: #dcdccc; font-weight: bold; }\n.cm-s-zenburn span.cm-comment { color: #7f9f7f; }\n.cm-s-zenburn span.cm-keyword { color: #f0dfaf; font-weight: bold; }\n.cm-s-zenburn span.cm-atom { color: #bfebbf; }\n.cm-s-zenburn span.cm-def { color: #dcdccc; }\n.cm-s-zenburn span.cm-variable { color: #dfaf8f; }\n.cm-s-zenburn span.cm-variable-2 { color: #dcdccc; }\n.cm-s-zenburn span.cm-string { color: #cc9393; }\n.cm-s-zenburn span.cm-string-2 { color: #cc9393; }\n.cm-s-zenburn span.cm-number { color: #dcdccc; }\n.cm-s-zenburn span.cm-tag { color: #93e0e3; }\n.cm-s-zenburn span.cm-property { color: #dfaf8f; }\n.cm-s-zenburn span.cm-attribute { color: #dfaf8f; }\n.cm-s-zenburn span.cm-qualifier { color: #7cb8bb; }\n.cm-s-zenburn span.cm-meta { color: #f0dfaf; }\n.cm-s-zenburn span.cm-header { color: #f0efd0; }\n.cm-s-zenburn span.cm-operator { color: #f0efd0; }\n.cm-s-zenburn span.CodeMirror-matchingbracket { box-sizing: border-box; background: transparent; border-bottom: 1px solid; }\n.cm-s-zenburn span.CodeMirror-nonmatchingbracket { border-bottom: 1px solid; background: none; }\n.cm-s-zenburn .CodeMirror-activeline { background: #000000; }\n.cm-s-zenburn .CodeMirror-activeline-background { background: #000000; }\n.cm-s-zenburn div.CodeMirror-selected { background: #545454; }\n.cm-s-zenburn .CodeMirror-focused div.CodeMirror-selected { background: #4f4f4f; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/addon/runmode/codemirror-standalone.js",
    "content": "import StringStream from \"../../util/StringStream.js\"\nimport { countColumn } from \"../../util/misc.js\"\nimport * as modeMethods from \"../../modes.js\"\n\n// declare global: globalThis, CodeMirror\n\n// Create a minimal CodeMirror needed to use runMode, and assign to root.\nvar root = typeof globalThis !== 'undefined' ? globalThis : window\nroot.CodeMirror = {}\n\n// Copy StringStream and mode methods into CodeMirror object.\nCodeMirror.StringStream = StringStream\nfor (var exported in modeMethods) CodeMirror[exported] = modeMethods[exported]\n\n// Minimal default mode.\nCodeMirror.defineMode(\"null\", () => ({token: stream => stream.skipToEnd()}))\nCodeMirror.defineMIME(\"text/plain\", \"null\")\n\nCodeMirror.registerHelper = CodeMirror.registerGlobalHelper = Math.min\nCodeMirror.splitLines = function(string) { return string.split(/\\r?\\n|\\r/) }\nCodeMirror.countColumn = countColumn\n\nCodeMirror.defaults = { indentUnit: 2 }\nexport default CodeMirror\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/addon/runmode/codemirror.node.js",
    "content": "import StringStream from \"../../util/StringStream.js\"\nimport * as modeMethods from \"../../modes.js\"\nimport {countColumn} from \"../../util/misc.js\"\n\n// Copy StringStream and mode methods into exports (CodeMirror) object.\nexports.StringStream = StringStream\nexports.countColumn = countColumn\nfor (var exported in modeMethods) exports[exported] = modeMethods[exported]\n\n// Shim library CodeMirror with the minimal CodeMirror defined above.\nrequire.cache[require.resolve(\"../../lib/codemirror\")] = require.cache[require.resolve(\"./runmode.node\")]\nrequire.cache[require.resolve(\"../../addon/runmode/runmode\")] = require.cache[require.resolve(\"./runmode.node\")]\n\n// Minimal default mode.\nexports.defineMode(\"null\", () => ({token: stream => stream.skipToEnd()}))\nexports.defineMIME(\"text/plain\", \"null\")\n\nexports.registerHelper = exports.registerGlobalHelper = Math.min\nexports.splitLines = function(string) { return string.split(/\\r?\\n|\\r/) }\n\nexports.defaults = { indentUnit: 2 }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/addon/runmode/runmode-standalone.js",
    "content": "import \"./codemirror-standalone.js\"\nimport \"../../../addon/runmode/runmode.js\""
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/addon/runmode/runmode.node.js",
    "content": "import \"./codemirror.node.js\"\nimport \"../../../addon/runmode/runmode.js\""
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/codemirror.js",
    "content": "import { CodeMirror } from \"./edit/main.js\"\n\nexport default CodeMirror\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/Display.js",
    "content": "import { gecko, ie, ie_version, mobile, webkit } from \"../util/browser.js\"\nimport { elt, eltP } from \"../util/dom.js\"\nimport { scrollerGap } from \"../util/misc.js\"\nimport { getGutters, renderGutters } from \"./gutters.js\"\n\n// The display handles the DOM integration, both for input reading\n// and content drawing. It holds references to DOM nodes and\n// display-related state.\n\nexport function Display(place, doc, input, options) {\n  let d = this\n  this.input = input\n\n  // Covers bottom-right square when both scrollbars are present.\n  d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\")\n  d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\")\n  // Covers bottom of gutter when coverGutterNextToScrollbar is on\n  // and h scrollbar is present.\n  d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\")\n  d.gutterFiller.setAttribute(\"cm-not-content\", \"true\")\n  // Will contain the actual code, positioned to cover the viewport.\n  d.lineDiv = eltP(\"div\", null, \"CodeMirror-code\")\n  // Elements are added to these to represent selection and cursors.\n  d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\")\n  d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\")\n  // A visibility: hidden element used to find the size of things.\n  d.measure = elt(\"div\", null, \"CodeMirror-measure\")\n  // When lines outside of the viewport are measured, they are drawn in this.\n  d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\")\n  // Wraps everything that needs to exist inside the vertically-padded coordinate system\n  d.lineSpace = eltP(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n                    null, \"position: relative; outline: none\")\n  let lines = eltP(\"div\", [d.lineSpace], \"CodeMirror-lines\")\n  // Moved around its parent to cover visible view.\n  d.mover = elt(\"div\", [lines], null, \"position: relative\")\n  // Set to the height of the document, allowing scrolling.\n  d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\")\n  d.sizerWidth = null\n  // Behavior of elts with overflow: auto and padding is\n  // inconsistent across browsers. This is used to ensure the\n  // scrollable area is big enough.\n  d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\")\n  // Will contain the gutters, if any.\n  d.gutters = elt(\"div\", null, \"CodeMirror-gutters\")\n  d.lineGutter = null\n  // Actual scrollable element.\n  d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\")\n  d.scroller.setAttribute(\"tabIndex\", \"-1\")\n  // The element in which the editor lives.\n  d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\")\n\n  // This attribute is respected by automatic translation systems such as Google Translate,\n  // and may also be respected by tools used by human translators.\n  d.wrapper.setAttribute('translate', 'no')\n\n  // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n  if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0 }\n  if (!webkit && !(gecko && mobile)) d.scroller.draggable = true\n\n  if (place) {\n    if (place.appendChild) place.appendChild(d.wrapper)\n    else place(d.wrapper)\n  }\n\n  // Current rendered range (may be bigger than the view window).\n  d.viewFrom = d.viewTo = doc.first\n  d.reportedViewFrom = d.reportedViewTo = doc.first\n  // Information about the rendered lines.\n  d.view = []\n  d.renderedView = null\n  // Holds info about a single rendered line when it was rendered\n  // for measurement, while not in view.\n  d.externalMeasured = null\n  // Empty space (in pixels) above the view\n  d.viewOffset = 0\n  d.lastWrapHeight = d.lastWrapWidth = 0\n  d.updateLineNumbers = null\n\n  d.nativeBarWidth = d.barHeight = d.barWidth = 0\n  d.scrollbarsClipped = false\n\n  // Used to only resize the line number gutter when necessary (when\n  // the amount of lines crosses a boundary that makes its width change)\n  d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null\n  // Set to true when a non-horizontal-scrolling line widget is\n  // added. As an optimization, line widget aligning is skipped when\n  // this is false.\n  d.alignWidgets = false\n\n  d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null\n\n  // Tracks the maximum line length so that the horizontal scrollbar\n  // can be kept static when scrolling.\n  d.maxLine = null\n  d.maxLineLength = 0\n  d.maxLineChanged = false\n\n  // Used for measuring wheel scrolling granularity\n  d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null\n\n  // True when shift is held down.\n  d.shift = false\n\n  // Used to track whether anything happened since the context menu\n  // was opened.\n  d.selForContextMenu = null\n\n  d.activeTouch = null\n\n  d.gutterSpecs = getGutters(options.gutters, options.lineNumbers)\n  renderGutters(d)\n\n  input.init(d)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/focus.js",
    "content": "import { restartBlink } from \"./selection.js\"\nimport { webkit } from \"../util/browser.js\"\nimport { addClass, rmClass } from \"../util/dom.js\"\nimport { signal } from \"../util/event.js\"\n\nexport function ensureFocus(cm) {\n  if (!cm.hasFocus()) {\n    cm.display.input.focus()\n    if (!cm.state.focused) onFocus(cm)\n  }\n}\n\nexport function delayBlurEvent(cm) {\n  cm.state.delayingBlurEvent = true\n  setTimeout(() => { if (cm.state.delayingBlurEvent) {\n    cm.state.delayingBlurEvent = false\n    if (cm.state.focused) onBlur(cm)\n  } }, 100)\n}\n\nexport function onFocus(cm, e) {\n  if (cm.state.delayingBlurEvent && !cm.state.draggingText) cm.state.delayingBlurEvent = false\n\n  if (cm.options.readOnly == \"nocursor\") return\n  if (!cm.state.focused) {\n    signal(cm, \"focus\", cm, e)\n    cm.state.focused = true\n    addClass(cm.display.wrapper, \"CodeMirror-focused\")\n    // This test prevents this from firing when a context\n    // menu is closed (since the input reset would kill the\n    // select-all detection hack)\n    if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n      cm.display.input.reset()\n      if (webkit) setTimeout(() => cm.display.input.reset(true), 20) // Issue #1730\n    }\n    cm.display.input.receivedFocus()\n  }\n  restartBlink(cm)\n}\nexport function onBlur(cm, e) {\n  if (cm.state.delayingBlurEvent) return\n\n  if (cm.state.focused) {\n    signal(cm, \"blur\", cm, e)\n    cm.state.focused = false\n    rmClass(cm.display.wrapper, \"CodeMirror-focused\")\n  }\n  clearInterval(cm.display.blinker)\n  setTimeout(() => { if (!cm.state.focused) cm.display.shift = false }, 150)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/gutters.js",
    "content": "import { elt, removeChildren } from \"../util/dom.js\"\nimport { regChange } from \"./view_tracking.js\"\nimport { alignHorizontally } from \"./line_numbers.js\"\nimport { updateGutterSpace } from \"./update_display.js\"\n\nexport function getGutters(gutters, lineNumbers) {\n  let result = [], sawLineNumbers = false\n  for (let i = 0; i < gutters.length; i++) {\n    let name = gutters[i], style = null\n    if (typeof name != \"string\") { style = name.style; name = name.className }\n    if (name == \"CodeMirror-linenumbers\") {\n      if (!lineNumbers) continue\n      else sawLineNumbers = true\n    }\n    result.push({className: name, style})\n  }\n  if (lineNumbers && !sawLineNumbers) result.push({className: \"CodeMirror-linenumbers\", style: null})\n  return result\n}\n\n// Rebuild the gutter elements, ensure the margin to the left of the\n// code matches their width.\nexport function renderGutters(display) {\n  let gutters = display.gutters, specs = display.gutterSpecs\n  removeChildren(gutters)\n  display.lineGutter = null\n  for (let i = 0; i < specs.length; ++i) {\n    let {className, style} = specs[i]\n    let gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + className))\n    if (style) gElt.style.cssText = style\n    if (className == \"CodeMirror-linenumbers\") {\n      display.lineGutter = gElt\n      gElt.style.width = (display.lineNumWidth || 1) + \"px\"\n    }\n  }\n  gutters.style.display = specs.length ? \"\" : \"none\"\n  updateGutterSpace(display)\n}\n\nexport function updateGutters(cm) {\n  renderGutters(cm.display)\n  regChange(cm)\n  alignHorizontally(cm)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/highlight_worker.js",
    "content": "import { getContextBefore, highlightLine, processLine } from \"../line/highlight.js\"\nimport { copyState } from \"../modes.js\"\nimport { bind } from \"../util/misc.js\"\n\nimport { runInOp } from \"./operations.js\"\nimport { regLineChange } from \"./view_tracking.js\"\n\n// HIGHLIGHT WORKER\n\nexport function startWorker(cm, time) {\n  if (cm.doc.highlightFrontier < cm.display.viewTo)\n    cm.state.highlight.set(time, bind(highlightWorker, cm))\n}\n\nfunction highlightWorker(cm) {\n  let doc = cm.doc\n  if (doc.highlightFrontier >= cm.display.viewTo) return\n  let end = +new Date + cm.options.workTime\n  let context = getContextBefore(cm, doc.highlightFrontier)\n  let changedLines = []\n\n  doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), line => {\n    if (context.line >= cm.display.viewFrom) { // Visible\n      let oldStyles = line.styles\n      let resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null\n      let highlighted = highlightLine(cm, line, context, true)\n      if (resetState) context.state = resetState\n      line.styles = highlighted.styles\n      let oldCls = line.styleClasses, newCls = highlighted.classes\n      if (newCls) line.styleClasses = newCls\n      else if (oldCls) line.styleClasses = null\n      let ischange = !oldStyles || oldStyles.length != line.styles.length ||\n        oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass)\n      for (let i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i]\n      if (ischange) changedLines.push(context.line)\n      line.stateAfter = context.save()\n      context.nextLine()\n    } else {\n      if (line.text.length <= cm.options.maxHighlightLength)\n        processLine(cm, line.text, context)\n      line.stateAfter = context.line % 5 == 0 ? context.save() : null\n      context.nextLine()\n    }\n    if (+new Date > end) {\n      startWorker(cm, cm.options.workDelay)\n      return true\n    }\n  })\n  doc.highlightFrontier = context.line\n  doc.modeFrontier = Math.max(doc.modeFrontier, context.line)\n  if (changedLines.length) runInOp(cm, () => {\n    for (let i = 0; i < changedLines.length; i++)\n      regLineChange(cm, changedLines[i], \"text\")\n  })\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/line_numbers.js",
    "content": "import { lineNumberFor } from \"../line/utils_line.js\"\nimport { compensateForHScroll } from \"../measurement/position_measurement.js\"\nimport { elt } from \"../util/dom.js\"\n\nimport { updateGutterSpace } from \"./update_display.js\"\n\n// Re-align line numbers and gutter marks to compensate for\n// horizontal scrolling.\nexport function alignHorizontally(cm) {\n  let display = cm.display, view = display.view\n  if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return\n  let comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft\n  let gutterW = display.gutters.offsetWidth, left = comp + \"px\"\n  for (let i = 0; i < view.length; i++) if (!view[i].hidden) {\n    if (cm.options.fixedGutter) {\n      if (view[i].gutter)\n        view[i].gutter.style.left = left\n      if (view[i].gutterBackground)\n        view[i].gutterBackground.style.left = left\n    }\n    let align = view[i].alignable\n    if (align) for (let j = 0; j < align.length; j++)\n      align[j].style.left = left\n  }\n  if (cm.options.fixedGutter)\n    display.gutters.style.left = (comp + gutterW) + \"px\"\n}\n\n// Used to ensure that the line number gutter is still the right\n// size for the current document size. Returns true when an update\n// is needed.\nexport function maybeUpdateLineNumberWidth(cm) {\n  if (!cm.options.lineNumbers) return false\n  let doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display\n  if (last.length != display.lineNumChars) {\n    let test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n                                               \"CodeMirror-linenumber CodeMirror-gutter-elt\"))\n    let innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW\n    display.lineGutter.style.width = \"\"\n    display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1\n    display.lineNumWidth = display.lineNumInnerWidth + padding\n    display.lineNumChars = display.lineNumInnerWidth ? last.length : -1\n    display.lineGutter.style.width = display.lineNumWidth + \"px\"\n    updateGutterSpace(cm.display)\n    return true\n  }\n  return false\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/mode_state.js",
    "content": "import { getMode } from \"../modes.js\"\n\nimport { startWorker } from \"./highlight_worker.js\"\nimport { regChange } from \"./view_tracking.js\"\n\n// Used to get the editor into a consistent state again when options change.\n\nexport function loadMode(cm) {\n  cm.doc.mode = getMode(cm.options, cm.doc.modeOption)\n  resetModeState(cm)\n}\n\nexport function resetModeState(cm) {\n  cm.doc.iter(line => {\n    if (line.stateAfter) line.stateAfter = null\n    if (line.styles) line.styles = null\n  })\n  cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first\n  startWorker(cm, 100)\n  cm.state.modeGen++\n  if (cm.curOp) regChange(cm)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/operations.js",
    "content": "import { clipPos } from \"../line/pos.js\"\nimport { findMaxLine } from \"../line/spans.js\"\nimport { displayWidth, measureChar, scrollGap } from \"../measurement/position_measurement.js\"\nimport { signal } from \"../util/event.js\"\nimport { activeElt } from \"../util/dom.js\"\nimport { finishOperation, pushOperation } from \"../util/operation_group.js\"\n\nimport { ensureFocus } from \"./focus.js\"\nimport { measureForScrollbars, updateScrollbars } from \"./scrollbars.js\"\nimport { restartBlink } from \"./selection.js\"\nimport { maybeScrollWindow, scrollPosIntoView, setScrollLeft, setScrollTop } from \"./scrolling.js\"\nimport { DisplayUpdate, maybeClipScrollbars, postUpdateDisplay, setDocumentHeight, updateDisplayIfNeeded } from \"./update_display.js\"\nimport { updateHeightsInViewport } from \"./update_lines.js\"\n\n// Operations are used to wrap a series of changes to the editor\n// state in such a way that each change won't have to update the\n// cursor and display (which would be awkward, slow, and\n// error-prone). Instead, display updates are batched and then all\n// combined and executed at once.\n\nlet nextOpId = 0\n// Start a new operation.\nexport function startOperation(cm) {\n  cm.curOp = {\n    cm: cm,\n    viewChanged: false,      // Flag that indicates that lines might need to be redrawn\n    startHeight: cm.doc.height, // Used to detect need to update scrollbar\n    forceUpdate: false,      // Used to force a redraw\n    updateInput: 0,       // Whether to reset the input textarea\n    typing: false,           // Whether this reset should be careful to leave existing text (for compositing)\n    changeObjs: null,        // Accumulated changes, for firing change events\n    cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n    cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n    selectionChanged: false, // Whether the selection needs to be redrawn\n    updateMaxLine: false,    // Set when the widest line needs to be determined anew\n    scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n    scrollToPos: null,       // Used to scroll to a specific position\n    focus: false,\n    id: ++nextOpId,          // Unique ID\n    markArrays: null         // Used by addMarkedSpan\n  }\n  pushOperation(cm.curOp)\n}\n\n// Finish an operation, updating the display and signalling delayed events\nexport function endOperation(cm) {\n  let op = cm.curOp\n  if (op) finishOperation(op, group => {\n    for (let i = 0; i < group.ops.length; i++)\n      group.ops[i].cm.curOp = null\n    endOperations(group)\n  })\n}\n\n// The DOM updates done when an operation finishes are batched so\n// that the minimum number of relayouts are required.\nfunction endOperations(group) {\n  let ops = group.ops\n  for (let i = 0; i < ops.length; i++) // Read DOM\n    endOperation_R1(ops[i])\n  for (let i = 0; i < ops.length; i++) // Write DOM (maybe)\n    endOperation_W1(ops[i])\n  for (let i = 0; i < ops.length; i++) // Read DOM\n    endOperation_R2(ops[i])\n  for (let i = 0; i < ops.length; i++) // Write DOM (maybe)\n    endOperation_W2(ops[i])\n  for (let i = 0; i < ops.length; i++) // Read DOM\n    endOperation_finish(ops[i])\n}\n\nfunction endOperation_R1(op) {\n  let cm = op.cm, display = cm.display\n  maybeClipScrollbars(cm)\n  if (op.updateMaxLine) findMaxLine(cm)\n\n  op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n    op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n                       op.scrollToPos.to.line >= display.viewTo) ||\n    display.maxLineChanged && cm.options.lineWrapping\n  op.update = op.mustUpdate &&\n    new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate)\n}\n\nfunction endOperation_W1(op) {\n  op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update)\n}\n\nfunction endOperation_R2(op) {\n  let cm = op.cm, display = cm.display\n  if (op.updatedDisplay) updateHeightsInViewport(cm)\n\n  op.barMeasure = measureForScrollbars(cm)\n\n  // If the max line changed since it was last measured, measure it,\n  // and ensure the document's width matches it.\n  // updateDisplay_W2 will use these properties to do the actual resizing\n  if (display.maxLineChanged && !cm.options.lineWrapping) {\n    op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3\n    cm.display.sizerWidth = op.adjustWidthTo\n    op.barMeasure.scrollWidth =\n      Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth)\n    op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm))\n  }\n\n  if (op.updatedDisplay || op.selectionChanged)\n    op.preparedSelection = display.input.prepareSelection()\n}\n\nfunction endOperation_W2(op) {\n  let cm = op.cm\n\n  if (op.adjustWidthTo != null) {\n    cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\"\n    if (op.maxScrollLeft < cm.doc.scrollLeft)\n      setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true)\n    cm.display.maxLineChanged = false\n  }\n\n  let takeFocus = op.focus && op.focus == activeElt()\n  if (op.preparedSelection)\n    cm.display.input.showSelection(op.preparedSelection, takeFocus)\n  if (op.updatedDisplay || op.startHeight != cm.doc.height)\n    updateScrollbars(cm, op.barMeasure)\n  if (op.updatedDisplay)\n    setDocumentHeight(cm, op.barMeasure)\n\n  if (op.selectionChanged) restartBlink(cm)\n\n  if (cm.state.focused && op.updateInput)\n    cm.display.input.reset(op.typing)\n  if (takeFocus) ensureFocus(op.cm)\n}\n\nfunction endOperation_finish(op) {\n  let cm = op.cm, display = cm.display, doc = cm.doc\n\n  if (op.updatedDisplay) postUpdateDisplay(cm, op.update)\n\n  // Abort mouse wheel delta measurement, when scrolling explicitly\n  if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n    display.wheelStartX = display.wheelStartY = null\n\n  // Propagate the scroll position to the actual DOM scroller\n  if (op.scrollTop != null) setScrollTop(cm, op.scrollTop, op.forceScroll)\n\n  if (op.scrollLeft != null) setScrollLeft(cm, op.scrollLeft, true, true)\n  // If we need to scroll a specific position into view, do so.\n  if (op.scrollToPos) {\n    let rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n                                 clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin)\n    maybeScrollWindow(cm, rect)\n  }\n\n  // Fire events for markers that are hidden/unidden by editing or\n  // undoing\n  let hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers\n  if (hidden) for (let i = 0; i < hidden.length; ++i)\n    if (!hidden[i].lines.length) signal(hidden[i], \"hide\")\n  if (unhidden) for (let i = 0; i < unhidden.length; ++i)\n    if (unhidden[i].lines.length) signal(unhidden[i], \"unhide\")\n\n  if (display.wrapper.offsetHeight)\n    doc.scrollTop = cm.display.scroller.scrollTop\n\n  // Fire change events, and delayed event handlers\n  if (op.changeObjs)\n    signal(cm, \"changes\", cm, op.changeObjs)\n  if (op.update)\n    op.update.finish()\n}\n\n// Run the given function in an operation\nexport function runInOp(cm, f) {\n  if (cm.curOp) return f()\n  startOperation(cm)\n  try { return f() }\n  finally { endOperation(cm) }\n}\n// Wraps a function in an operation. Returns the wrapped function.\nexport function operation(cm, f) {\n  return function() {\n    if (cm.curOp) return f.apply(cm, arguments)\n    startOperation(cm)\n    try { return f.apply(cm, arguments) }\n    finally { endOperation(cm) }\n  }\n}\n// Used to add methods to editor and doc instances, wrapping them in\n// operations.\nexport function methodOp(f) {\n  return function() {\n    if (this.curOp) return f.apply(this, arguments)\n    startOperation(this)\n    try { return f.apply(this, arguments) }\n    finally { endOperation(this) }\n  }\n}\nexport function docMethodOp(f) {\n  return function() {\n    let cm = this.cm\n    if (!cm || cm.curOp) return f.apply(this, arguments)\n    startOperation(cm)\n    try { return f.apply(this, arguments) }\n    finally { endOperation(cm) }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/scroll_events.js",
    "content": "import { chrome, gecko, ie, mac, presto, safari, webkit } from \"../util/browser.js\"\nimport { e_preventDefault } from \"../util/event.js\"\n\nimport { updateDisplaySimple } from \"./update_display.js\"\nimport { setScrollLeft, updateScrollTop } from \"./scrolling.js\"\n\n// Since the delta values reported on mouse wheel events are\n// unstandardized between browsers and even browser versions, and\n// generally horribly unpredictable, this code starts by measuring\n// the scroll effect that the first few mouse wheel events have,\n// and, from that, detects the way it can convert deltas to pixel\n// offsets afterwards.\n//\n// The reason we want to know the amount a wheel event will scroll\n// is that it gives us a chance to update the display before the\n// actual scrolling happens, reducing flickering.\n\nlet wheelSamples = 0, wheelPixelsPerUnit = null\n// Fill in a browser-detected starting value on browsers where we\n// know one. These don't have to be accurate -- the result of them\n// being wrong would just be a slight flicker on the first wheel\n// scroll (if it is large enough).\nif (ie) wheelPixelsPerUnit = -.53\nelse if (gecko) wheelPixelsPerUnit = 15\nelse if (chrome) wheelPixelsPerUnit = -.7\nelse if (safari) wheelPixelsPerUnit = -1/3\n\nfunction wheelEventDelta(e) {\n  let dx = e.wheelDeltaX, dy = e.wheelDeltaY\n  if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail\n  if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail\n  else if (dy == null) dy = e.wheelDelta\n  return {x: dx, y: dy}\n}\nexport function wheelEventPixels(e) {\n  let delta = wheelEventDelta(e)\n  delta.x *= wheelPixelsPerUnit\n  delta.y *= wheelPixelsPerUnit\n  return delta\n}\n\nexport function onScrollWheel(cm, e) {\n  let delta = wheelEventDelta(e), dx = delta.x, dy = delta.y\n  let pixelsPerUnit = wheelPixelsPerUnit\n  if (e.deltaMode === 0) {\n    dx = e.deltaX\n    dy = e.deltaY\n    pixelsPerUnit = 1\n  }\n\n  let display = cm.display, scroll = display.scroller\n  // Quit if there's nothing to scroll here\n  let canScrollX = scroll.scrollWidth > scroll.clientWidth\n  let canScrollY = scroll.scrollHeight > scroll.clientHeight\n  if (!(dx && canScrollX || dy && canScrollY)) return\n\n  // Webkit browsers on OS X abort momentum scrolls when the target\n  // of the scroll event is removed from the scrollable element.\n  // This hack (see related code in patchDisplay) makes sure the\n  // element is kept around.\n  if (dy && mac && webkit) {\n    outer: for (let cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n      for (let i = 0; i < view.length; i++) {\n        if (view[i].node == cur) {\n          cm.display.currentWheelTarget = cur\n          break outer\n        }\n      }\n    }\n  }\n\n  // On some browsers, horizontal scrolling will cause redraws to\n  // happen before the gutter has been realigned, causing it to\n  // wriggle around in a most unseemly way. When we have an\n  // estimated pixels/delta value, we just handle horizontal\n  // scrolling entirely here. It'll be slightly off from native, but\n  // better than glitching out.\n  if (dx && !gecko && !presto && pixelsPerUnit != null) {\n    if (dy && canScrollY)\n      updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit))\n    setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit))\n    // Only prevent default scrolling if vertical scrolling is\n    // actually possible. Otherwise, it causes vertical scroll\n    // jitter on OSX trackpads when deltaX is small and deltaY\n    // is large (issue #3579)\n    if (!dy || (dy && canScrollY))\n      e_preventDefault(e)\n    display.wheelStartX = null // Abort measurement, if in progress\n    return\n  }\n\n  // 'Project' the visible viewport to cover the area that is being\n  // scrolled into view (if we know enough to estimate it).\n  if (dy && pixelsPerUnit != null) {\n    let pixels = dy * pixelsPerUnit\n    let top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight\n    if (pixels < 0) top = Math.max(0, top + pixels - 50)\n    else bot = Math.min(cm.doc.height, bot + pixels + 50)\n    updateDisplaySimple(cm, {top: top, bottom: bot})\n  }\n\n  if (wheelSamples < 20 && e.deltaMode !== 0) {\n    if (display.wheelStartX == null) {\n      display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop\n      display.wheelDX = dx; display.wheelDY = dy\n      setTimeout(() => {\n        if (display.wheelStartX == null) return\n        let movedX = scroll.scrollLeft - display.wheelStartX\n        let movedY = scroll.scrollTop - display.wheelStartY\n        let sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n          (movedX && display.wheelDX && movedX / display.wheelDX)\n        display.wheelStartX = display.wheelStartY = null\n        if (!sample) return\n        wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1)\n        ++wheelSamples\n      }, 200)\n    } else {\n      display.wheelDX += dx; display.wheelDY += dy\n    }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/scrollbars.js",
    "content": "import { addClass, elt, rmClass } from \"../util/dom.js\"\nimport { on } from \"../util/event.js\"\nimport { scrollGap, paddingVert } from \"../measurement/position_measurement.js\"\nimport { ie, ie_version, mac, mac_geMountainLion } from \"../util/browser.js\"\nimport { updateHeightsInViewport } from \"./update_lines.js\"\nimport { Delayed } from \"../util/misc.js\"\n\nimport { setScrollLeft, updateScrollTop } from \"./scrolling.js\"\n\n// SCROLLBARS\n\n// Prepare DOM reads needed to update the scrollbars. Done in one\n// shot to minimize update/measure roundtrips.\nexport function measureForScrollbars(cm) {\n  let d = cm.display, gutterW = d.gutters.offsetWidth\n  let docH = Math.round(cm.doc.height + paddingVert(cm.display))\n  return {\n    clientHeight: d.scroller.clientHeight,\n    viewHeight: d.wrapper.clientHeight,\n    scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,\n    viewWidth: d.wrapper.clientWidth,\n    barLeft: cm.options.fixedGutter ? gutterW : 0,\n    docHeight: docH,\n    scrollHeight: docH + scrollGap(cm) + d.barHeight,\n    nativeBarWidth: d.nativeBarWidth,\n    gutterWidth: gutterW\n  }\n}\n\nclass NativeScrollbars {\n  constructor(place, scroll, cm) {\n    this.cm = cm\n    let vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\")\n    let horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\")\n    vert.tabIndex = horiz.tabIndex = -1\n    place(vert); place(horiz)\n\n    on(vert, \"scroll\", () => {\n      if (vert.clientHeight) scroll(vert.scrollTop, \"vertical\")\n    })\n    on(horiz, \"scroll\", () => {\n      if (horiz.clientWidth) scroll(horiz.scrollLeft, \"horizontal\")\n    })\n\n    this.checkedZeroWidth = false\n    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n    if (ie && ie_version < 8) this.horiz.style.minHeight = this.vert.style.minWidth = \"18px\"\n  }\n\n  update(measure) {\n    let needsH = measure.scrollWidth > measure.clientWidth + 1\n    let needsV = measure.scrollHeight > measure.clientHeight + 1\n    let sWidth = measure.nativeBarWidth\n\n    if (needsV) {\n      this.vert.style.display = \"block\"\n      this.vert.style.bottom = needsH ? sWidth + \"px\" : \"0\"\n      let totalHeight = measure.viewHeight - (needsH ? sWidth : 0)\n      // A bug in IE8 can cause this value to be negative, so guard it.\n      this.vert.firstChild.style.height =\n        Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + \"px\"\n    } else {\n      this.vert.scrollTop = 0\n      this.vert.style.display = \"\"\n      this.vert.firstChild.style.height = \"0\"\n    }\n\n    if (needsH) {\n      this.horiz.style.display = \"block\"\n      this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\"\n      this.horiz.style.left = measure.barLeft + \"px\"\n      let totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0)\n      this.horiz.firstChild.style.width =\n        Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\"\n    } else {\n      this.horiz.style.display = \"\"\n      this.horiz.firstChild.style.width = \"0\"\n    }\n\n    if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n      if (sWidth == 0) this.zeroWidthHack()\n      this.checkedZeroWidth = true\n    }\n\n    return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}\n  }\n\n  setScrollLeft(pos) {\n    if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos\n    if (this.disableHoriz) this.enableZeroWidthBar(this.horiz, this.disableHoriz, \"horiz\")\n  }\n\n  setScrollTop(pos) {\n    if (this.vert.scrollTop != pos) this.vert.scrollTop = pos\n    if (this.disableVert) this.enableZeroWidthBar(this.vert, this.disableVert, \"vert\")\n  }\n\n  zeroWidthHack() {\n    let w = mac && !mac_geMountainLion ? \"12px\" : \"18px\"\n    this.horiz.style.height = this.vert.style.width = w\n    this.horiz.style.pointerEvents = this.vert.style.pointerEvents = \"none\"\n    this.disableHoriz = new Delayed\n    this.disableVert = new Delayed\n  }\n\n  enableZeroWidthBar(bar, delay, type) {\n    bar.style.pointerEvents = \"auto\"\n    function maybeDisable() {\n      // To find out whether the scrollbar is still visible, we\n      // check whether the element under the pixel in the bottom\n      // right corner of the scrollbar box is the scrollbar box\n      // itself (when the bar is still visible) or its filler child\n      // (when the bar is hidden). If it is still visible, we keep\n      // it enabled, if it's hidden, we disable pointer events.\n      let box = bar.getBoundingClientRect()\n      let elt = type == \"vert\" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)\n          : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1)\n      if (elt != bar) bar.style.pointerEvents = \"none\"\n      else delay.set(1000, maybeDisable)\n    }\n    delay.set(1000, maybeDisable)\n  }\n\n  clear() {\n    let parent = this.horiz.parentNode\n    parent.removeChild(this.horiz)\n    parent.removeChild(this.vert)\n  }\n}\n\nclass NullScrollbars {\n  update() { return {bottom: 0, right: 0} }\n  setScrollLeft() {}\n  setScrollTop() {}\n  clear() {}\n}\n\nexport function updateScrollbars(cm, measure) {\n  if (!measure) measure = measureForScrollbars(cm)\n  let startWidth = cm.display.barWidth, startHeight = cm.display.barHeight\n  updateScrollbarsInner(cm, measure)\n  for (let i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {\n    if (startWidth != cm.display.barWidth && cm.options.lineWrapping)\n      updateHeightsInViewport(cm)\n    updateScrollbarsInner(cm, measureForScrollbars(cm))\n    startWidth = cm.display.barWidth; startHeight = cm.display.barHeight\n  }\n}\n\n// Re-synchronize the fake scrollbars with the actual size of the\n// content.\nfunction updateScrollbarsInner(cm, measure) {\n  let d = cm.display\n  let sizes = d.scrollbars.update(measure)\n\n  d.sizer.style.paddingRight = (d.barWidth = sizes.right) + \"px\"\n  d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + \"px\"\n  d.heightForcer.style.borderBottom = sizes.bottom + \"px solid transparent\"\n\n  if (sizes.right && sizes.bottom) {\n    d.scrollbarFiller.style.display = \"block\"\n    d.scrollbarFiller.style.height = sizes.bottom + \"px\"\n    d.scrollbarFiller.style.width = sizes.right + \"px\"\n  } else d.scrollbarFiller.style.display = \"\"\n  if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n    d.gutterFiller.style.display = \"block\"\n    d.gutterFiller.style.height = sizes.bottom + \"px\"\n    d.gutterFiller.style.width = measure.gutterWidth + \"px\"\n  } else d.gutterFiller.style.display = \"\"\n}\n\nexport let scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars}\n\nexport function initScrollbars(cm) {\n  if (cm.display.scrollbars) {\n    cm.display.scrollbars.clear()\n    if (cm.display.scrollbars.addClass)\n      rmClass(cm.display.wrapper, cm.display.scrollbars.addClass)\n  }\n\n  cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](node => {\n    cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller)\n    // Prevent clicks in the scrollbars from killing focus\n    on(node, \"mousedown\", () => {\n      if (cm.state.focused) setTimeout(() => cm.display.input.focus(), 0)\n    })\n    node.setAttribute(\"cm-not-content\", \"true\")\n  }, (pos, axis) => {\n    if (axis == \"horizontal\") setScrollLeft(cm, pos)\n    else updateScrollTop(cm, pos)\n  }, cm)\n  if (cm.display.scrollbars.addClass)\n    addClass(cm.display.wrapper, cm.display.scrollbars.addClass)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/scrolling.js",
    "content": "import { Pos } from \"../line/pos.js\"\nimport { cursorCoords, displayHeight, displayWidth, estimateCoords, paddingTop, paddingVert, scrollGap, textHeight } from \"../measurement/position_measurement.js\"\nimport { gecko, phantom } from \"../util/browser.js\"\nimport { elt } from \"../util/dom.js\"\nimport { signalDOMEvent } from \"../util/event.js\"\n\nimport { startWorker } from \"./highlight_worker.js\"\nimport { alignHorizontally } from \"./line_numbers.js\"\nimport { updateDisplaySimple } from \"./update_display.js\"\n\n// SCROLLING THINGS INTO VIEW\n\n// If an editor sits on the top or bottom of the window, partially\n// scrolled out of view, this ensures that the cursor is visible.\nexport function maybeScrollWindow(cm, rect) {\n  if (signalDOMEvent(cm, \"scrollCursorIntoView\")) return\n\n  let display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null\n  if (rect.top + box.top < 0) doScroll = true\n  else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false\n  if (doScroll != null && !phantom) {\n    let scrollNode = elt(\"div\", \"\\u200b\", null, `position: absolute;\n                         top: ${rect.top - display.viewOffset - paddingTop(cm.display)}px;\n                         height: ${rect.bottom - rect.top + scrollGap(cm) + display.barHeight}px;\n                         left: ${rect.left}px; width: ${Math.max(2, rect.right - rect.left)}px;`)\n    cm.display.lineSpace.appendChild(scrollNode)\n    scrollNode.scrollIntoView(doScroll)\n    cm.display.lineSpace.removeChild(scrollNode)\n  }\n}\n\n// Scroll a given position into view (immediately), verifying that\n// it actually became visible (as line heights are accurately\n// measured, the position of something may 'drift' during drawing).\nexport function scrollPosIntoView(cm, pos, end, margin) {\n  if (margin == null) margin = 0\n  let rect\n  if (!cm.options.lineWrapping && pos == end) {\n    // Set pos and end to the cursor positions around the character pos sticks to\n    // If pos.sticky == \"before\", that is around pos.ch - 1, otherwise around pos.ch\n    // If pos == Pos(_, 0, \"before\"), pos and end are unchanged\n    end = pos.sticky == \"before\" ? Pos(pos.line, pos.ch + 1, \"before\") : pos\n    pos = pos.ch ? Pos(pos.line, pos.sticky == \"before\" ? pos.ch - 1 : pos.ch, \"after\") : pos\n  }\n  for (let limit = 0; limit < 5; limit++) {\n    let changed = false\n    let coords = cursorCoords(cm, pos)\n    let endCoords = !end || end == pos ? coords : cursorCoords(cm, end)\n    rect = {left: Math.min(coords.left, endCoords.left),\n            top: Math.min(coords.top, endCoords.top) - margin,\n            right: Math.max(coords.left, endCoords.left),\n            bottom: Math.max(coords.bottom, endCoords.bottom) + margin}\n    let scrollPos = calculateScrollPos(cm, rect)\n    let startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft\n    if (scrollPos.scrollTop != null) {\n      updateScrollTop(cm, scrollPos.scrollTop)\n      if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true\n    }\n    if (scrollPos.scrollLeft != null) {\n      setScrollLeft(cm, scrollPos.scrollLeft)\n      if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true\n    }\n    if (!changed) break\n  }\n  return rect\n}\n\n// Scroll a given set of coordinates into view (immediately).\nexport function scrollIntoView(cm, rect) {\n  let scrollPos = calculateScrollPos(cm, rect)\n  if (scrollPos.scrollTop != null) updateScrollTop(cm, scrollPos.scrollTop)\n  if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft)\n}\n\n// Calculate a new scroll position needed to scroll the given\n// rectangle into view. Returns an object with scrollTop and\n// scrollLeft properties. When these are undefined, the\n// vertical/horizontal position does not need to be adjusted.\nfunction calculateScrollPos(cm, rect) {\n  let display = cm.display, snapMargin = textHeight(cm.display)\n  if (rect.top < 0) rect.top = 0\n  let screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop\n  let screen = displayHeight(cm), result = {}\n  if (rect.bottom - rect.top > screen) rect.bottom = rect.top + screen\n  let docBottom = cm.doc.height + paddingVert(display)\n  let atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin\n  if (rect.top < screentop) {\n    result.scrollTop = atTop ? 0 : rect.top\n  } else if (rect.bottom > screentop + screen) {\n    let newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen)\n    if (newTop != screentop) result.scrollTop = newTop\n  }\n\n  let gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth\n  let screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace\n  let screenw = displayWidth(cm) - display.gutters.offsetWidth\n  let tooWide = rect.right - rect.left > screenw\n  if (tooWide) rect.right = rect.left + screenw\n  if (rect.left < 10)\n    result.scrollLeft = 0\n  else if (rect.left < screenleft)\n    result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10))\n  else if (rect.right > screenw + screenleft - 3)\n    result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw\n  return result\n}\n\n// Store a relative adjustment to the scroll position in the current\n// operation (to be applied when the operation finishes).\nexport function addToScrollTop(cm, top) {\n  if (top == null) return\n  resolveScrollToPos(cm)\n  cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top\n}\n\n// Make sure that at the end of the operation the current cursor is\n// shown.\nexport function ensureCursorVisible(cm) {\n  resolveScrollToPos(cm)\n  let cur = cm.getCursor()\n  cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}\n}\n\nexport function scrollToCoords(cm, x, y) {\n  if (x != null || y != null) resolveScrollToPos(cm)\n  if (x != null) cm.curOp.scrollLeft = x\n  if (y != null) cm.curOp.scrollTop = y\n}\n\nexport function scrollToRange(cm, range) {\n  resolveScrollToPos(cm)\n  cm.curOp.scrollToPos = range\n}\n\n// When an operation has its scrollToPos property set, and another\n// scroll action is applied before the end of the operation, this\n// 'simulates' scrolling that position into view in a cheap way, so\n// that the effect of intermediate scroll commands is not ignored.\nfunction resolveScrollToPos(cm) {\n  let range = cm.curOp.scrollToPos\n  if (range) {\n    cm.curOp.scrollToPos = null\n    let from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to)\n    scrollToCoordsRange(cm, from, to, range.margin)\n  }\n}\n\nexport function scrollToCoordsRange(cm, from, to, margin) {\n  let sPos = calculateScrollPos(cm, {\n    left: Math.min(from.left, to.left),\n    top: Math.min(from.top, to.top) - margin,\n    right: Math.max(from.right, to.right),\n    bottom: Math.max(from.bottom, to.bottom) + margin\n  })\n  scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop)\n}\n\n// Sync the scrollable area and scrollbars, ensure the viewport\n// covers the visible area.\nexport function updateScrollTop(cm, val) {\n  if (Math.abs(cm.doc.scrollTop - val) < 2) return\n  if (!gecko) updateDisplaySimple(cm, {top: val})\n  setScrollTop(cm, val, true)\n  if (gecko) updateDisplaySimple(cm)\n  startWorker(cm, 100)\n}\n\nexport function setScrollTop(cm, val, forceScroll) {\n  val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val))\n  if (cm.display.scroller.scrollTop == val && !forceScroll) return\n  cm.doc.scrollTop = val\n  cm.display.scrollbars.setScrollTop(val)\n  if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val\n}\n\n// Sync scroller and scrollbar, ensure the gutter elements are\n// aligned.\nexport function setScrollLeft(cm, val, isScroller, forceScroll) {\n  val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth))\n  if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) return\n  cm.doc.scrollLeft = val\n  alignHorizontally(cm)\n  if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val\n  cm.display.scrollbars.setScrollLeft(val)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/selection.js",
    "content": "import { Pos } from \"../line/pos.js\"\nimport { visualLine } from \"../line/spans.js\"\nimport { getLine } from \"../line/utils_line.js\"\nimport { charCoords, cursorCoords, displayWidth, paddingH, wrappedLineExtentChar } from \"../measurement/position_measurement.js\"\nimport { getOrder, iterateBidiSections } from \"../util/bidi.js\"\nimport { elt } from \"../util/dom.js\"\nimport { onBlur } from \"./focus.js\"\n\nexport function updateSelection(cm) {\n  cm.display.input.showSelection(cm.display.input.prepareSelection())\n}\n\nexport function prepareSelection(cm, primary = true) {\n  let doc = cm.doc, result = {}\n  let curFragment = result.cursors = document.createDocumentFragment()\n  let selFragment = result.selection = document.createDocumentFragment()\n\n  let customCursor = cm.options.$customCursor\n  if (customCursor) primary = true\n  for (let i = 0; i < doc.sel.ranges.length; i++) {\n    if (!primary && i == doc.sel.primIndex) continue\n    let range = doc.sel.ranges[i]\n    if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) continue\n    let collapsed = range.empty()\n    if (customCursor) {\n      let head = customCursor(cm, range)\n      if (head) drawSelectionCursor(cm, head, curFragment)\n    } else if (collapsed || cm.options.showCursorWhenSelecting) {\n      drawSelectionCursor(cm, range.head, curFragment)\n    }\n    if (!collapsed)\n      drawSelectionRange(cm, range, selFragment)\n  }\n  return result\n}\n\n// Draws a cursor for the given range\nexport function drawSelectionCursor(cm, head, output) {\n  let pos = cursorCoords(cm, head, \"div\", null, null, !cm.options.singleCursorHeightPerLine)\n\n  let cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"))\n  cursor.style.left = pos.left + \"px\"\n  cursor.style.top = pos.top + \"px\"\n  cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\"\n\n  if (/\\bcm-fat-cursor\\b/.test(cm.getWrapperElement().className)) {\n    let charPos = charCoords(cm, head, \"div\", null, null)\n    let width = charPos.right - charPos.left\n    cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + \"px\"\n  }\n\n  if (pos.other) {\n    // Secondary cursor, shown when on a 'jump' in bi-directional text\n    let otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"))\n    otherCursor.style.display = \"\"\n    otherCursor.style.left = pos.other.left + \"px\"\n    otherCursor.style.top = pos.other.top + \"px\"\n    otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\"\n  }\n}\n\nfunction cmpCoords(a, b) { return a.top - b.top || a.left - b.left }\n\n// Draws the given range as a highlighted selection\nfunction drawSelectionRange(cm, range, output) {\n  let display = cm.display, doc = cm.doc\n  let fragment = document.createDocumentFragment()\n  let padding = paddingH(cm.display), leftSide = padding.left\n  let rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right\n  let docLTR = doc.direction == \"ltr\"\n\n  function add(left, top, width, bottom) {\n    if (top < 0) top = 0\n    top = Math.round(top)\n    bottom = Math.round(bottom)\n    fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", `position: absolute; left: ${left}px;\n                             top: ${top}px; width: ${width == null ? rightSide - left : width}px;\n                             height: ${bottom - top}px`))\n  }\n\n  function drawForLine(line, fromArg, toArg) {\n    let lineObj = getLine(doc, line)\n    let lineLen = lineObj.text.length\n    let start, end\n    function coords(ch, bias) {\n      return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias)\n    }\n\n    function wrapX(pos, dir, side) {\n      let extent = wrappedLineExtentChar(cm, lineObj, null, pos)\n      let prop = (dir == \"ltr\") == (side == \"after\") ? \"left\" : \"right\"\n      let ch = side == \"after\" ? extent.begin : extent.end - (/\\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1)\n      return coords(ch, prop)[prop]\n    }\n\n    let order = getOrder(lineObj, doc.direction)\n    iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, (from, to, dir, i) => {\n      let ltr = dir == \"ltr\"\n      let fromPos = coords(from, ltr ? \"left\" : \"right\")\n      let toPos = coords(to - 1, ltr ? \"right\" : \"left\")\n\n      let openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen\n      let first = i == 0, last = !order || i == order.length - 1\n      if (toPos.top - fromPos.top <= 3) { // Single line\n        let openLeft = (docLTR ? openStart : openEnd) && first\n        let openRight = (docLTR ? openEnd : openStart) && last\n        let left = openLeft ? leftSide : (ltr ? fromPos : toPos).left\n        let right = openRight ? rightSide : (ltr ? toPos : fromPos).right\n        add(left, fromPos.top, right - left, fromPos.bottom)\n      } else { // Multiple lines\n        let topLeft, topRight, botLeft, botRight\n        if (ltr) {\n          topLeft = docLTR && openStart && first ? leftSide : fromPos.left\n          topRight = docLTR ? rightSide : wrapX(from, dir, \"before\")\n          botLeft = docLTR ? leftSide : wrapX(to, dir, \"after\")\n          botRight = docLTR && openEnd && last ? rightSide : toPos.right\n        } else {\n          topLeft = !docLTR ? leftSide : wrapX(from, dir, \"before\")\n          topRight = !docLTR && openStart && first ? rightSide : fromPos.right\n          botLeft = !docLTR && openEnd && last ? leftSide : toPos.left\n          botRight = !docLTR ? rightSide : wrapX(to, dir, \"after\")\n        }\n        add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom)\n        if (fromPos.bottom < toPos.top) add(leftSide, fromPos.bottom, null, toPos.top)\n        add(botLeft, toPos.top, botRight - botLeft, toPos.bottom)\n      }\n\n      if (!start || cmpCoords(fromPos, start) < 0) start = fromPos\n      if (cmpCoords(toPos, start) < 0) start = toPos\n      if (!end || cmpCoords(fromPos, end) < 0) end = fromPos\n      if (cmpCoords(toPos, end) < 0) end = toPos\n    })\n    return {start: start, end: end}\n  }\n\n  let sFrom = range.from(), sTo = range.to()\n  if (sFrom.line == sTo.line) {\n    drawForLine(sFrom.line, sFrom.ch, sTo.ch)\n  } else {\n    let fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line)\n    let singleVLine = visualLine(fromLine) == visualLine(toLine)\n    let leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end\n    let rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start\n    if (singleVLine) {\n      if (leftEnd.top < rightStart.top - 2) {\n        add(leftEnd.right, leftEnd.top, null, leftEnd.bottom)\n        add(leftSide, rightStart.top, rightStart.left, rightStart.bottom)\n      } else {\n        add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom)\n      }\n    }\n    if (leftEnd.bottom < rightStart.top)\n      add(leftSide, leftEnd.bottom, null, rightStart.top)\n  }\n\n  output.appendChild(fragment)\n}\n\n// Cursor-blinking\nexport function restartBlink(cm) {\n  if (!cm.state.focused) return\n  let display = cm.display\n  clearInterval(display.blinker)\n  let on = true\n  display.cursorDiv.style.visibility = \"\"\n  if (cm.options.cursorBlinkRate > 0)\n    display.blinker = setInterval(() => {\n      if (!cm.hasFocus()) onBlur(cm)\n      display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\"\n    }, cm.options.cursorBlinkRate)\n  else if (cm.options.cursorBlinkRate < 0)\n    display.cursorDiv.style.visibility = \"hidden\"\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/update_display.js",
    "content": "import { sawCollapsedSpans } from \"../line/saw_special_spans.js\"\nimport { heightAtLine, visualLineEndNo, visualLineNo } from \"../line/spans.js\"\nimport { getLine, lineNumberFor } from \"../line/utils_line.js\"\nimport { displayHeight, displayWidth, getDimensions, paddingVert, scrollGap } from \"../measurement/position_measurement.js\"\nimport { mac, webkit } from \"../util/browser.js\"\nimport { activeElt, removeChildren, contains } from \"../util/dom.js\"\nimport { hasHandler, signal } from \"../util/event.js\"\nimport { signalLater } from \"../util/operation_group.js\"\nimport { indexOf } from \"../util/misc.js\"\n\nimport { buildLineElement, updateLineForChanges } from \"./update_line.js\"\nimport { startWorker } from \"./highlight_worker.js\"\nimport { maybeUpdateLineNumberWidth } from \"./line_numbers.js\"\nimport { measureForScrollbars, updateScrollbars } from \"./scrollbars.js\"\nimport { updateSelection } from \"./selection.js\"\nimport { updateHeightsInViewport, visibleLines } from \"./update_lines.js\"\nimport { adjustView, countDirtyView, resetView } from \"./view_tracking.js\"\n\n// DISPLAY DRAWING\n\nexport class DisplayUpdate {\n  constructor(cm, viewport, force) {\n    let display = cm.display\n\n    this.viewport = viewport\n    // Store some values that we'll need later (but don't want to force a relayout for)\n    this.visible = visibleLines(display, cm.doc, viewport)\n    this.editorIsHidden = !display.wrapper.offsetWidth\n    this.wrapperHeight = display.wrapper.clientHeight\n    this.wrapperWidth = display.wrapper.clientWidth\n    this.oldDisplayWidth = displayWidth(cm)\n    this.force = force\n    this.dims = getDimensions(cm)\n    this.events = []\n  }\n\n  signal(emitter, type) {\n    if (hasHandler(emitter, type))\n      this.events.push(arguments)\n  }\n  finish() {\n    for (let i = 0; i < this.events.length; i++)\n      signal.apply(null, this.events[i])\n  }\n}\n\nexport function maybeClipScrollbars(cm) {\n  let display = cm.display\n  if (!display.scrollbarsClipped && display.scroller.offsetWidth) {\n    display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth\n    display.heightForcer.style.height = scrollGap(cm) + \"px\"\n    display.sizer.style.marginBottom = -display.nativeBarWidth + \"px\"\n    display.sizer.style.borderRightWidth = scrollGap(cm) + \"px\"\n    display.scrollbarsClipped = true\n  }\n}\n\nfunction selectionSnapshot(cm) {\n  if (cm.hasFocus()) return null\n  let active = activeElt()\n  if (!active || !contains(cm.display.lineDiv, active)) return null\n  let result = {activeElt: active}\n  if (window.getSelection) {\n    let sel = window.getSelection()\n    if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {\n      result.anchorNode = sel.anchorNode\n      result.anchorOffset = sel.anchorOffset\n      result.focusNode = sel.focusNode\n      result.focusOffset = sel.focusOffset\n    }\n  }\n  return result\n}\n\nfunction restoreSelection(snapshot) {\n  if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) return\n  snapshot.activeElt.focus()\n  if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&\n      snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {\n    let sel = window.getSelection(), range = document.createRange()\n    range.setEnd(snapshot.anchorNode, snapshot.anchorOffset)\n    range.collapse(false)\n    sel.removeAllRanges()\n    sel.addRange(range)\n    sel.extend(snapshot.focusNode, snapshot.focusOffset)\n  }\n}\n\n// Does the actual updating of the line display. Bails out\n// (returning false) when there is nothing to be done and forced is\n// false.\nexport function updateDisplayIfNeeded(cm, update) {\n  let display = cm.display, doc = cm.doc\n\n  if (update.editorIsHidden) {\n    resetView(cm)\n    return false\n  }\n\n  // Bail out if the visible area is already rendered and nothing changed.\n  if (!update.force &&\n      update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n      (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n      display.renderedView == display.view && countDirtyView(cm) == 0)\n    return false\n\n  if (maybeUpdateLineNumberWidth(cm)) {\n    resetView(cm)\n    update.dims = getDimensions(cm)\n  }\n\n  // Compute a suitable new viewport (from & to)\n  let end = doc.first + doc.size\n  let from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first)\n  let to = Math.min(end, update.visible.to + cm.options.viewportMargin)\n  if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom)\n  if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo)\n  if (sawCollapsedSpans) {\n    from = visualLineNo(cm.doc, from)\n    to = visualLineEndNo(cm.doc, to)\n  }\n\n  let different = from != display.viewFrom || to != display.viewTo ||\n    display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth\n  adjustView(cm, from, to)\n\n  display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom))\n  // Position the mover div to align with the current scroll position\n  cm.display.mover.style.top = display.viewOffset + \"px\"\n\n  let toUpdate = countDirtyView(cm)\n  if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&\n      (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n    return false\n\n  // For big changes, we hide the enclosing element during the\n  // update, since that speeds up the operations on most browsers.\n  let selSnapshot = selectionSnapshot(cm)\n  if (toUpdate > 4) display.lineDiv.style.display = \"none\"\n  patchDisplay(cm, display.updateLineNumbers, update.dims)\n  if (toUpdate > 4) display.lineDiv.style.display = \"\"\n  display.renderedView = display.view\n  // There might have been a widget with a focused element that got\n  // hidden or updated, if so re-focus it.\n  restoreSelection(selSnapshot)\n\n  // Prevent selection and cursors from interfering with the scroll\n  // width and height.\n  removeChildren(display.cursorDiv)\n  removeChildren(display.selectionDiv)\n  display.gutters.style.height = display.sizer.style.minHeight = 0\n\n  if (different) {\n    display.lastWrapHeight = update.wrapperHeight\n    display.lastWrapWidth = update.wrapperWidth\n    startWorker(cm, 400)\n  }\n\n  display.updateLineNumbers = null\n\n  return true\n}\n\nexport function postUpdateDisplay(cm, update) {\n  let viewport = update.viewport\n\n  for (let first = true;; first = false) {\n    if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {\n      // Clip forced viewport to actual scrollable area.\n      if (viewport && viewport.top != null)\n        viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}\n      // Updated line heights might result in the drawn area not\n      // actually covering the viewport. Keep looping until it does.\n      update.visible = visibleLines(cm.display, cm.doc, viewport)\n      if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n        break\n    } else if (first) {\n      update.visible = visibleLines(cm.display, cm.doc, viewport)\n    }\n    if (!updateDisplayIfNeeded(cm, update)) break\n    updateHeightsInViewport(cm)\n    let barMeasure = measureForScrollbars(cm)\n    updateSelection(cm)\n    updateScrollbars(cm, barMeasure)\n    setDocumentHeight(cm, barMeasure)\n    update.force = false\n  }\n\n  update.signal(cm, \"update\", cm)\n  if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n    update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo)\n    cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo\n  }\n}\n\nexport function updateDisplaySimple(cm, viewport) {\n  let update = new DisplayUpdate(cm, viewport)\n  if (updateDisplayIfNeeded(cm, update)) {\n    updateHeightsInViewport(cm)\n    postUpdateDisplay(cm, update)\n    let barMeasure = measureForScrollbars(cm)\n    updateSelection(cm)\n    updateScrollbars(cm, barMeasure)\n    setDocumentHeight(cm, barMeasure)\n    update.finish()\n  }\n}\n\n// Sync the actual display DOM structure with display.view, removing\n// nodes for lines that are no longer in view, and creating the ones\n// that are not there yet, and updating the ones that are out of\n// date.\nfunction patchDisplay(cm, updateNumbersFrom, dims) {\n  let display = cm.display, lineNumbers = cm.options.lineNumbers\n  let container = display.lineDiv, cur = container.firstChild\n\n  function rm(node) {\n    let next = node.nextSibling\n    // Works around a throw-scroll bug in OS X Webkit\n    if (webkit && mac && cm.display.currentWheelTarget == node)\n      node.style.display = \"none\"\n    else\n      node.parentNode.removeChild(node)\n    return next\n  }\n\n  let view = display.view, lineN = display.viewFrom\n  // Loop over the elements in the view, syncing cur (the DOM nodes\n  // in display.lineDiv) with the view as we go.\n  for (let i = 0; i < view.length; i++) {\n    let lineView = view[i]\n    if (lineView.hidden) {\n    } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet\n      let node = buildLineElement(cm, lineView, lineN, dims)\n      container.insertBefore(node, cur)\n    } else { // Already drawn\n      while (cur != lineView.node) cur = rm(cur)\n      let updateNumber = lineNumbers && updateNumbersFrom != null &&\n        updateNumbersFrom <= lineN && lineView.lineNumber\n      if (lineView.changes) {\n        if (indexOf(lineView.changes, \"gutter\") > -1) updateNumber = false\n        updateLineForChanges(cm, lineView, lineN, dims)\n      }\n      if (updateNumber) {\n        removeChildren(lineView.lineNumber)\n        lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)))\n      }\n      cur = lineView.node.nextSibling\n    }\n    lineN += lineView.size\n  }\n  while (cur) cur = rm(cur)\n}\n\nexport function updateGutterSpace(display) {\n  let width = display.gutters.offsetWidth\n  display.sizer.style.marginLeft = width + \"px\"\n  // Send an event to consumers responding to changes in gutter width.\n  signalLater(display, \"gutterChanged\", display)\n}\n\nexport function setDocumentHeight(cm, measure) {\n  cm.display.sizer.style.minHeight = measure.docHeight + \"px\"\n  cm.display.heightForcer.style.top = measure.docHeight + \"px\"\n  cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + \"px\"\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/update_line.js",
    "content": "import { buildLineContent } from \"../line/line_data.js\"\nimport { lineNumberFor } from \"../line/utils_line.js\"\nimport { ie, ie_version } from \"../util/browser.js\"\nimport { elt, classTest } from \"../util/dom.js\"\nimport { signalLater } from \"../util/operation_group.js\"\n\n// When an aspect of a line changes, a string is added to\n// lineView.changes. This updates the relevant part of the line's\n// DOM structure.\nexport function updateLineForChanges(cm, lineView, lineN, dims) {\n  for (let j = 0; j < lineView.changes.length; j++) {\n    let type = lineView.changes[j]\n    if (type == \"text\") updateLineText(cm, lineView)\n    else if (type == \"gutter\") updateLineGutter(cm, lineView, lineN, dims)\n    else if (type == \"class\") updateLineClasses(cm, lineView)\n    else if (type == \"widget\") updateLineWidgets(cm, lineView, dims)\n  }\n  lineView.changes = null\n}\n\n// Lines with gutter elements, widgets or a background class need to\n// be wrapped, and have the extra elements added to the wrapper div\nfunction ensureLineWrapped(lineView) {\n  if (lineView.node == lineView.text) {\n    lineView.node = elt(\"div\", null, null, \"position: relative\")\n    if (lineView.text.parentNode)\n      lineView.text.parentNode.replaceChild(lineView.node, lineView.text)\n    lineView.node.appendChild(lineView.text)\n    if (ie && ie_version < 8) lineView.node.style.zIndex = 2\n  }\n  return lineView.node\n}\n\nfunction updateLineBackground(cm, lineView) {\n  let cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass\n  if (cls) cls += \" CodeMirror-linebackground\"\n  if (lineView.background) {\n    if (cls) lineView.background.className = cls\n    else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null }\n  } else if (cls) {\n    let wrap = ensureLineWrapped(lineView)\n    lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild)\n    cm.display.input.setUneditable(lineView.background)\n  }\n}\n\n// Wrapper around buildLineContent which will reuse the structure\n// in display.externalMeasured when possible.\nfunction getLineContent(cm, lineView) {\n  let ext = cm.display.externalMeasured\n  if (ext && ext.line == lineView.line) {\n    cm.display.externalMeasured = null\n    lineView.measure = ext.measure\n    return ext.built\n  }\n  return buildLineContent(cm, lineView)\n}\n\n// Redraw the line's text. Interacts with the background and text\n// classes because the mode may output tokens that influence these\n// classes.\nfunction updateLineText(cm, lineView) {\n  let cls = lineView.text.className\n  let built = getLineContent(cm, lineView)\n  if (lineView.text == lineView.node) lineView.node = built.pre\n  lineView.text.parentNode.replaceChild(built.pre, lineView.text)\n  lineView.text = built.pre\n  if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n    lineView.bgClass = built.bgClass\n    lineView.textClass = built.textClass\n    updateLineClasses(cm, lineView)\n  } else if (cls) {\n    lineView.text.className = cls\n  }\n}\n\nfunction updateLineClasses(cm, lineView) {\n  updateLineBackground(cm, lineView)\n  if (lineView.line.wrapClass)\n    ensureLineWrapped(lineView).className = lineView.line.wrapClass\n  else if (lineView.node != lineView.text)\n    lineView.node.className = \"\"\n  let textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass\n  lineView.text.className = textClass || \"\"\n}\n\nfunction updateLineGutter(cm, lineView, lineN, dims) {\n  if (lineView.gutter) {\n    lineView.node.removeChild(lineView.gutter)\n    lineView.gutter = null\n  }\n  if (lineView.gutterBackground) {\n    lineView.node.removeChild(lineView.gutterBackground)\n    lineView.gutterBackground = null\n  }\n  if (lineView.line.gutterClass) {\n    let wrap = ensureLineWrapped(lineView)\n    lineView.gutterBackground = elt(\"div\", null, \"CodeMirror-gutter-background \" + lineView.line.gutterClass,\n                                    `left: ${cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth}px; width: ${dims.gutterTotalWidth}px`)\n    cm.display.input.setUneditable(lineView.gutterBackground)\n    wrap.insertBefore(lineView.gutterBackground, lineView.text)\n  }\n  let markers = lineView.line.gutterMarkers\n  if (cm.options.lineNumbers || markers) {\n    let wrap = ensureLineWrapped(lineView)\n    let gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", `left: ${cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth}px`)\n    gutterWrap.setAttribute(\"aria-hidden\", \"true\")\n    cm.display.input.setUneditable(gutterWrap)\n    wrap.insertBefore(gutterWrap, lineView.text)\n    if (lineView.line.gutterClass)\n      gutterWrap.className += \" \" + lineView.line.gutterClass\n    if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n      lineView.lineNumber = gutterWrap.appendChild(\n        elt(\"div\", lineNumberFor(cm.options, lineN),\n            \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n            `left: ${dims.gutterLeft[\"CodeMirror-linenumbers\"]}px; width: ${cm.display.lineNumInnerWidth}px`))\n    if (markers) for (let k = 0; k < cm.display.gutterSpecs.length; ++k) {\n      let id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id]\n      if (found)\n        gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\",\n                                   `left: ${dims.gutterLeft[id]}px; width: ${dims.gutterWidth[id]}px`))\n    }\n  }\n}\n\nfunction updateLineWidgets(cm, lineView, dims) {\n  if (lineView.alignable) lineView.alignable = null\n  let isWidget = classTest(\"CodeMirror-linewidget\")\n  for (let node = lineView.node.firstChild, next; node; node = next) {\n    next = node.nextSibling\n    if (isWidget.test(node.className)) lineView.node.removeChild(node)\n  }\n  insertLineWidgets(cm, lineView, dims)\n}\n\n// Build a line's DOM representation from scratch\nexport function buildLineElement(cm, lineView, lineN, dims) {\n  let built = getLineContent(cm, lineView)\n  lineView.text = lineView.node = built.pre\n  if (built.bgClass) lineView.bgClass = built.bgClass\n  if (built.textClass) lineView.textClass = built.textClass\n\n  updateLineClasses(cm, lineView)\n  updateLineGutter(cm, lineView, lineN, dims)\n  insertLineWidgets(cm, lineView, dims)\n  return lineView.node\n}\n\n// A lineView may contain multiple logical lines (when merged by\n// collapsed spans). The widgets for all of them need to be drawn.\nfunction insertLineWidgets(cm, lineView, dims) {\n  insertLineWidgetsFor(cm, lineView.line, lineView, dims, true)\n  if (lineView.rest) for (let i = 0; i < lineView.rest.length; i++)\n    insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false)\n}\n\nfunction insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {\n  if (!line.widgets) return\n  let wrap = ensureLineWrapped(lineView)\n  for (let i = 0, ws = line.widgets; i < ws.length; ++i) {\n    let widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\" + (widget.className ? \" \" + widget.className : \"\"))\n    if (!widget.handleMouseEvents) node.setAttribute(\"cm-ignore-events\", \"true\")\n    positionLineWidget(widget, node, lineView, dims)\n    cm.display.input.setUneditable(node)\n    if (allowAbove && widget.above)\n      wrap.insertBefore(node, lineView.gutter || lineView.text)\n    else\n      wrap.appendChild(node)\n    signalLater(widget, \"redraw\")\n  }\n}\n\nfunction positionLineWidget(widget, node, lineView, dims) {\n  if (widget.noHScroll) {\n    ;(lineView.alignable || (lineView.alignable = [])).push(node)\n    let width = dims.wrapperWidth\n    node.style.left = dims.fixedPos + \"px\"\n    if (!widget.coverGutter) {\n      width -= dims.gutterTotalWidth\n      node.style.paddingLeft = dims.gutterTotalWidth + \"px\"\n    }\n    node.style.width = width + \"px\"\n  }\n  if (widget.coverGutter) {\n    node.style.zIndex = 5\n    node.style.position = \"relative\"\n    if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + \"px\"\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/update_lines.js",
    "content": "import { heightAtLine } from \"../line/spans.js\"\nimport { getLine, lineAtHeight, updateLineHeight } from \"../line/utils_line.js\"\nimport { paddingTop, charWidth } from \"../measurement/position_measurement.js\"\nimport { ie, ie_version } from \"../util/browser.js\"\n\n// Read the actual heights of the rendered lines, and update their\n// stored heights to match.\nexport function updateHeightsInViewport(cm) {\n  let display = cm.display\n  let prevBottom = display.lineDiv.offsetTop\n  let viewTop = Math.max(0, display.scroller.getBoundingClientRect().top)\n  let oldHeight = display.lineDiv.getBoundingClientRect().top\n  let mustScroll = 0\n  for (let i = 0; i < display.view.length; i++) {\n    let cur = display.view[i], wrapping = cm.options.lineWrapping\n    let height, width = 0\n    if (cur.hidden) continue\n    oldHeight += cur.line.height\n    if (ie && ie_version < 8) {\n      let bot = cur.node.offsetTop + cur.node.offsetHeight\n      height = bot - prevBottom\n      prevBottom = bot\n    } else {\n      let box = cur.node.getBoundingClientRect()\n      height = box.bottom - box.top\n      // Check that lines don't extend past the right of the current\n      // editor width\n      if (!wrapping && cur.text.firstChild)\n        width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1\n    }\n    let diff = cur.line.height - height\n    if (diff > .005 || diff < -.005) {\n      if (oldHeight < viewTop) mustScroll -= diff\n      updateLineHeight(cur.line, height)\n      updateWidgetHeight(cur.line)\n      if (cur.rest) for (let j = 0; j < cur.rest.length; j++)\n        updateWidgetHeight(cur.rest[j])\n    }\n    if (width > cm.display.sizerWidth) {\n      let chWidth = Math.ceil(width / charWidth(cm.display))\n      if (chWidth > cm.display.maxLineLength) {\n        cm.display.maxLineLength = chWidth\n        cm.display.maxLine = cur.line\n        cm.display.maxLineChanged = true\n      }\n    }\n  }\n  if (Math.abs(mustScroll) > 2) display.scroller.scrollTop += mustScroll\n}\n\n// Read and store the height of line widgets associated with the\n// given line.\nfunction updateWidgetHeight(line) {\n  if (line.widgets) for (let i = 0; i < line.widgets.length; ++i) {\n    let w = line.widgets[i], parent = w.node.parentNode\n    if (parent) w.height = parent.offsetHeight\n  }\n}\n\n// Compute the lines that are visible in a given viewport (defaults\n// the the current scroll position). viewport may contain top,\n// height, and ensure (see op.scrollToPos) properties.\nexport function visibleLines(display, doc, viewport) {\n  let top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop\n  top = Math.floor(top - paddingTop(display))\n  let bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight\n\n  let from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom)\n  // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n  // forces those lines into the viewport (if possible).\n  if (viewport && viewport.ensure) {\n    let ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line\n    if (ensureFrom < from) {\n      from = ensureFrom\n      to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight)\n    } else if (Math.min(ensureTo, doc.lastLine()) >= to) {\n      from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight)\n      to = ensureTo\n    }\n  }\n  return {from: from, to: Math.max(to, from + 1)}\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/display/view_tracking.js",
    "content": "import { buildViewArray } from \"../line/line_data.js\"\nimport { sawCollapsedSpans } from \"../line/saw_special_spans.js\"\nimport { visualLineEndNo, visualLineNo } from \"../line/spans.js\"\nimport { findViewIndex } from \"../measurement/position_measurement.js\"\nimport { indexOf } from \"../util/misc.js\"\n\n// Updates the display.view data structure for a given change to the\n// document. From and to are in pre-change coordinates. Lendiff is\n// the amount of lines added or subtracted by the change. This is\n// used for changes that span multiple lines, or change the way\n// lines are divided into visual lines. regLineChange (below)\n// registers single-line changes.\nexport function regChange(cm, from, to, lendiff) {\n  if (from == null) from = cm.doc.first\n  if (to == null) to = cm.doc.first + cm.doc.size\n  if (!lendiff) lendiff = 0\n\n  let display = cm.display\n  if (lendiff && to < display.viewTo &&\n      (display.updateLineNumbers == null || display.updateLineNumbers > from))\n    display.updateLineNumbers = from\n\n  cm.curOp.viewChanged = true\n\n  if (from >= display.viewTo) { // Change after\n    if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n      resetView(cm)\n  } else if (to <= display.viewFrom) { // Change before\n    if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n      resetView(cm)\n    } else {\n      display.viewFrom += lendiff\n      display.viewTo += lendiff\n    }\n  } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n    resetView(cm)\n  } else if (from <= display.viewFrom) { // Top overlap\n    let cut = viewCuttingPoint(cm, to, to + lendiff, 1)\n    if (cut) {\n      display.view = display.view.slice(cut.index)\n      display.viewFrom = cut.lineN\n      display.viewTo += lendiff\n    } else {\n      resetView(cm)\n    }\n  } else if (to >= display.viewTo) { // Bottom overlap\n    let cut = viewCuttingPoint(cm, from, from, -1)\n    if (cut) {\n      display.view = display.view.slice(0, cut.index)\n      display.viewTo = cut.lineN\n    } else {\n      resetView(cm)\n    }\n  } else { // Gap in the middle\n    let cutTop = viewCuttingPoint(cm, from, from, -1)\n    let cutBot = viewCuttingPoint(cm, to, to + lendiff, 1)\n    if (cutTop && cutBot) {\n      display.view = display.view.slice(0, cutTop.index)\n        .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n        .concat(display.view.slice(cutBot.index))\n      display.viewTo += lendiff\n    } else {\n      resetView(cm)\n    }\n  }\n\n  let ext = display.externalMeasured\n  if (ext) {\n    if (to < ext.lineN)\n      ext.lineN += lendiff\n    else if (from < ext.lineN + ext.size)\n      display.externalMeasured = null\n  }\n}\n\n// Register a change to a single line. Type must be one of \"text\",\n// \"gutter\", \"class\", \"widget\"\nexport function regLineChange(cm, line, type) {\n  cm.curOp.viewChanged = true\n  let display = cm.display, ext = cm.display.externalMeasured\n  if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n    display.externalMeasured = null\n\n  if (line < display.viewFrom || line >= display.viewTo) return\n  let lineView = display.view[findViewIndex(cm, line)]\n  if (lineView.node == null) return\n  let arr = lineView.changes || (lineView.changes = [])\n  if (indexOf(arr, type) == -1) arr.push(type)\n}\n\n// Clear the view.\nexport function resetView(cm) {\n  cm.display.viewFrom = cm.display.viewTo = cm.doc.first\n  cm.display.view = []\n  cm.display.viewOffset = 0\n}\n\nfunction viewCuttingPoint(cm, oldN, newN, dir) {\n  let index = findViewIndex(cm, oldN), diff, view = cm.display.view\n  if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n    return {index: index, lineN: newN}\n  let n = cm.display.viewFrom\n  for (let i = 0; i < index; i++)\n    n += view[i].size\n  if (n != oldN) {\n    if (dir > 0) {\n      if (index == view.length - 1) return null\n      diff = (n + view[index].size) - oldN\n      index++\n    } else {\n      diff = n - oldN\n    }\n    oldN += diff; newN += diff\n  }\n  while (visualLineNo(cm.doc, newN) != newN) {\n    if (index == (dir < 0 ? 0 : view.length - 1)) return null\n    newN += dir * view[index - (dir < 0 ? 1 : 0)].size\n    index += dir\n  }\n  return {index: index, lineN: newN}\n}\n\n// Force the view to cover a given range, adding empty view element\n// or clipping off existing ones as needed.\nexport function adjustView(cm, from, to) {\n  let display = cm.display, view = display.view\n  if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n    display.view = buildViewArray(cm, from, to)\n    display.viewFrom = from\n  } else {\n    if (display.viewFrom > from)\n      display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view)\n    else if (display.viewFrom < from)\n      display.view = display.view.slice(findViewIndex(cm, from))\n    display.viewFrom = from\n    if (display.viewTo < to)\n      display.view = display.view.concat(buildViewArray(cm, display.viewTo, to))\n    else if (display.viewTo > to)\n      display.view = display.view.slice(0, findViewIndex(cm, to))\n  }\n  display.viewTo = to\n}\n\n// Count the number of lines in the view whose DOM representation is\n// out of date (or nonexistent).\nexport function countDirtyView(cm) {\n  let view = cm.display.view, dirty = 0\n  for (let i = 0; i < view.length; i++) {\n    let lineView = view[i]\n    if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty\n  }\n  return dirty\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/CodeMirror.js",
    "content": "import { Display } from \"../display/Display.js\"\nimport { onFocus, onBlur } from \"../display/focus.js\"\nimport { maybeUpdateLineNumberWidth } from \"../display/line_numbers.js\"\nimport { endOperation, operation, startOperation } from \"../display/operations.js\"\nimport { initScrollbars } from \"../display/scrollbars.js\"\nimport { onScrollWheel } from \"../display/scroll_events.js\"\nimport { setScrollLeft, updateScrollTop } from \"../display/scrolling.js\"\nimport { clipPos, Pos } from \"../line/pos.js\"\nimport { posFromMouse } from \"../measurement/position_measurement.js\"\nimport { eventInWidget } from \"../measurement/widgets.js\"\nimport Doc from \"../model/Doc.js\"\nimport { attachDoc } from \"../model/document_data.js\"\nimport { Range } from \"../model/selection.js\"\nimport { extendSelection } from \"../model/selection_updates.js\"\nimport { ie, ie_version, mobile, webkit } from \"../util/browser.js\"\nimport { e_preventDefault, e_stop, on, signal, signalDOMEvent } from \"../util/event.js\"\nimport { copyObj, Delayed } from \"../util/misc.js\"\n\nimport { clearDragCursor, onDragOver, onDragStart, onDrop } from \"./drop_events.js\"\nimport { ensureGlobalHandlers } from \"./global_events.js\"\nimport { onKeyDown, onKeyPress, onKeyUp } from \"./key_events.js\"\nimport { clickInGutter, onContextMenu, onMouseDown } from \"./mouse_events.js\"\nimport { themeChanged } from \"./utils.js\"\nimport { defaults, optionHandlers, Init } from \"./options.js\"\n\n// A CodeMirror instance represents an editor. This is the object\n// that user code is usually dealing with.\n\nexport function CodeMirror(place, options) {\n  if (!(this instanceof CodeMirror)) return new CodeMirror(place, options)\n\n  this.options = options = options ? copyObj(options) : {}\n  // Determine effective options based on given values and defaults.\n  copyObj(defaults, options, false)\n\n  let doc = options.value\n  if (typeof doc == \"string\") doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction)\n  else if (options.mode) doc.modeOption = options.mode\n  this.doc = doc\n\n  let input = new CodeMirror.inputStyles[options.inputStyle](this)\n  let display = this.display = new Display(place, doc, input, options)\n  display.wrapper.CodeMirror = this\n  themeChanged(this)\n  if (options.lineWrapping)\n    this.display.wrapper.className += \" CodeMirror-wrap\"\n  initScrollbars(this)\n\n  this.state = {\n    keyMaps: [],  // stores maps added by addKeyMap\n    overlays: [], // highlighting overlays, as added by addOverlay\n    modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info\n    overwrite: false,\n    delayingBlurEvent: false,\n    focused: false,\n    suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n    pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll\n    selectingText: false,\n    draggingText: false,\n    highlight: new Delayed(), // stores highlight worker timeout\n    keySeq: null,  // Unfinished key sequence\n    specialChars: null\n  }\n\n  if (options.autofocus && !mobile) display.input.focus()\n\n  // Override magic textarea content restore that IE sometimes does\n  // on our hidden textarea on reload\n  if (ie && ie_version < 11) setTimeout(() => this.display.input.reset(true), 20)\n\n  registerEventHandlers(this)\n  ensureGlobalHandlers()\n\n  startOperation(this)\n  this.curOp.forceUpdate = true\n  attachDoc(this, doc)\n\n  if ((options.autofocus && !mobile) || this.hasFocus())\n    setTimeout(() => {\n      if (this.hasFocus() && !this.state.focused) onFocus(this)\n    }, 20)\n  else\n    onBlur(this)\n\n  for (let opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))\n    optionHandlers[opt](this, options[opt], Init)\n  maybeUpdateLineNumberWidth(this)\n  if (options.finishInit) options.finishInit(this)\n  for (let i = 0; i < initHooks.length; ++i) initHooks[i](this)\n  endOperation(this)\n  // Suppress optimizelegibility in Webkit, since it breaks text\n  // measuring on line wrapping boundaries.\n  if (webkit && options.lineWrapping &&\n      getComputedStyle(display.lineDiv).textRendering == \"optimizelegibility\")\n    display.lineDiv.style.textRendering = \"auto\"\n}\n\n// The default configuration options.\nCodeMirror.defaults = defaults\n// Functions to run when options are changed.\nCodeMirror.optionHandlers = optionHandlers\n\nexport default CodeMirror\n\n// Attach the necessary event handlers when initializing the editor\nfunction registerEventHandlers(cm) {\n  let d = cm.display\n  on(d.scroller, \"mousedown\", operation(cm, onMouseDown))\n  // Older IE's will not fire a second mousedown for a double click\n  if (ie && ie_version < 11)\n    on(d.scroller, \"dblclick\", operation(cm, e => {\n      if (signalDOMEvent(cm, e)) return\n      let pos = posFromMouse(cm, e)\n      if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return\n      e_preventDefault(e)\n      let word = cm.findWordAt(pos)\n      extendSelection(cm.doc, word.anchor, word.head)\n    }))\n  else\n    on(d.scroller, \"dblclick\", e => signalDOMEvent(cm, e) || e_preventDefault(e))\n  // Some browsers fire contextmenu *after* opening the menu, at\n  // which point we can't mess with it anymore. Context menu is\n  // handled in onMouseDown for these browsers.\n  on(d.scroller, \"contextmenu\", e => onContextMenu(cm, e))\n  on(d.input.getField(), \"contextmenu\", e => {\n    if (!d.scroller.contains(e.target)) onContextMenu(cm, e)\n  })\n\n  // Used to suppress mouse event handling when a touch happens\n  let touchFinished, prevTouch = {end: 0}\n  function finishTouch() {\n    if (d.activeTouch) {\n      touchFinished = setTimeout(() => d.activeTouch = null, 1000)\n      prevTouch = d.activeTouch\n      prevTouch.end = +new Date\n    }\n  }\n  function isMouseLikeTouchEvent(e) {\n    if (e.touches.length != 1) return false\n    let touch = e.touches[0]\n    return touch.radiusX <= 1 && touch.radiusY <= 1\n  }\n  function farAway(touch, other) {\n    if (other.left == null) return true\n    let dx = other.left - touch.left, dy = other.top - touch.top\n    return dx * dx + dy * dy > 20 * 20\n  }\n  on(d.scroller, \"touchstart\", e => {\n    if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {\n      d.input.ensurePolled()\n      clearTimeout(touchFinished)\n      let now = +new Date\n      d.activeTouch = {start: now, moved: false,\n                       prev: now - prevTouch.end <= 300 ? prevTouch : null}\n      if (e.touches.length == 1) {\n        d.activeTouch.left = e.touches[0].pageX\n        d.activeTouch.top = e.touches[0].pageY\n      }\n    }\n  })\n  on(d.scroller, \"touchmove\", () => {\n    if (d.activeTouch) d.activeTouch.moved = true\n  })\n  on(d.scroller, \"touchend\", e => {\n    let touch = d.activeTouch\n    if (touch && !eventInWidget(d, e) && touch.left != null &&\n        !touch.moved && new Date - touch.start < 300) {\n      let pos = cm.coordsChar(d.activeTouch, \"page\"), range\n      if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n        range = new Range(pos, pos)\n      else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n        range = cm.findWordAt(pos)\n      else // Triple tap\n        range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0)))\n      cm.setSelection(range.anchor, range.head)\n      cm.focus()\n      e_preventDefault(e)\n    }\n    finishTouch()\n  })\n  on(d.scroller, \"touchcancel\", finishTouch)\n\n  // Sync scrolling between fake scrollbars and real scrollable\n  // area, ensure viewport is updated when scrolling.\n  on(d.scroller, \"scroll\", () => {\n    if (d.scroller.clientHeight) {\n      updateScrollTop(cm, d.scroller.scrollTop)\n      setScrollLeft(cm, d.scroller.scrollLeft, true)\n      signal(cm, \"scroll\", cm)\n    }\n  })\n\n  // Listen to wheel events in order to try and update the viewport on time.\n  on(d.scroller, \"mousewheel\", e => onScrollWheel(cm, e))\n  on(d.scroller, \"DOMMouseScroll\", e => onScrollWheel(cm, e))\n\n  // Prevent wrapper from ever scrolling\n  on(d.wrapper, \"scroll\", () => d.wrapper.scrollTop = d.wrapper.scrollLeft = 0)\n\n  d.dragFunctions = {\n    enter: e => {if (!signalDOMEvent(cm, e)) e_stop(e)},\n    over: e => {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e) }},\n    start: e => onDragStart(cm, e),\n    drop: operation(cm, onDrop),\n    leave: e => {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm) }}\n  }\n\n  let inp = d.input.getField()\n  on(inp, \"keyup\", e => onKeyUp.call(cm, e))\n  on(inp, \"keydown\", operation(cm, onKeyDown))\n  on(inp, \"keypress\", operation(cm, onKeyPress))\n  on(inp, \"focus\", e => onFocus(cm, e))\n  on(inp, \"blur\", e => onBlur(cm, e))\n}\n\nlet initHooks = []\nCodeMirror.defineInitHook = f => initHooks.push(f)\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/commands.js",
    "content": "import { deleteNearSelection } from \"./deleteNearSelection.js\"\nimport { runInOp } from \"../display/operations.js\"\nimport { ensureCursorVisible } from \"../display/scrolling.js\"\nimport { endOfLine } from \"../input/movement.js\"\nimport { clipPos, Pos } from \"../line/pos.js\"\nimport { visualLine, visualLineEnd } from \"../line/spans.js\"\nimport { getLine, lineNo } from \"../line/utils_line.js\"\nimport { Range } from \"../model/selection.js\"\nimport { selectAll } from \"../model/selection_updates.js\"\nimport { countColumn, sel_dontScroll, sel_move, spaceStr } from \"../util/misc.js\"\nimport { getOrder } from \"../util/bidi.js\"\n\n// Commands are parameter-less actions that can be performed on an\n// editor, mostly used for keybindings.\nexport let commands = {\n  selectAll: selectAll,\n  singleSelection: cm => cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll),\n  killLine: cm => deleteNearSelection(cm, range => {\n    if (range.empty()) {\n      let len = getLine(cm.doc, range.head.line).text.length\n      if (range.head.ch == len && range.head.line < cm.lastLine())\n        return {from: range.head, to: Pos(range.head.line + 1, 0)}\n      else\n        return {from: range.head, to: Pos(range.head.line, len)}\n    } else {\n      return {from: range.from(), to: range.to()}\n    }\n  }),\n  deleteLine: cm => deleteNearSelection(cm, range => ({\n    from: Pos(range.from().line, 0),\n    to: clipPos(cm.doc, Pos(range.to().line + 1, 0))\n  })),\n  delLineLeft: cm => deleteNearSelection(cm, range => ({\n    from: Pos(range.from().line, 0), to: range.from()\n  })),\n  delWrappedLineLeft: cm => deleteNearSelection(cm, range => {\n    let top = cm.charCoords(range.head, \"div\").top + 5\n    let leftPos = cm.coordsChar({left: 0, top: top}, \"div\")\n    return {from: leftPos, to: range.from()}\n  }),\n  delWrappedLineRight: cm => deleteNearSelection(cm, range => {\n    let top = cm.charCoords(range.head, \"div\").top + 5\n    let rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n    return {from: range.from(), to: rightPos }\n  }),\n  undo: cm => cm.undo(),\n  redo: cm => cm.redo(),\n  undoSelection: cm => cm.undoSelection(),\n  redoSelection: cm => cm.redoSelection(),\n  goDocStart: cm => cm.extendSelection(Pos(cm.firstLine(), 0)),\n  goDocEnd: cm => cm.extendSelection(Pos(cm.lastLine())),\n  goLineStart: cm => cm.extendSelectionsBy(range => lineStart(cm, range.head.line),\n    {origin: \"+move\", bias: 1}\n  ),\n  goLineStartSmart: cm => cm.extendSelectionsBy(range => lineStartSmart(cm, range.head),\n    {origin: \"+move\", bias: 1}\n  ),\n  goLineEnd: cm => cm.extendSelectionsBy(range => lineEnd(cm, range.head.line),\n    {origin: \"+move\", bias: -1}\n  ),\n  goLineRight: cm => cm.extendSelectionsBy(range => {\n    let top = cm.cursorCoords(range.head, \"div\").top + 5\n    return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n  }, sel_move),\n  goLineLeft: cm => cm.extendSelectionsBy(range => {\n    let top = cm.cursorCoords(range.head, \"div\").top + 5\n    return cm.coordsChar({left: 0, top: top}, \"div\")\n  }, sel_move),\n  goLineLeftSmart: cm => cm.extendSelectionsBy(range => {\n    let top = cm.cursorCoords(range.head, \"div\").top + 5\n    let pos = cm.coordsChar({left: 0, top: top}, \"div\")\n    if (pos.ch < cm.getLine(pos.line).search(/\\S/)) return lineStartSmart(cm, range.head)\n    return pos\n  }, sel_move),\n  goLineUp: cm => cm.moveV(-1, \"line\"),\n  goLineDown: cm => cm.moveV(1, \"line\"),\n  goPageUp: cm => cm.moveV(-1, \"page\"),\n  goPageDown: cm => cm.moveV(1, \"page\"),\n  goCharLeft: cm => cm.moveH(-1, \"char\"),\n  goCharRight: cm => cm.moveH(1, \"char\"),\n  goColumnLeft: cm => cm.moveH(-1, \"column\"),\n  goColumnRight: cm => cm.moveH(1, \"column\"),\n  goWordLeft: cm => cm.moveH(-1, \"word\"),\n  goGroupRight: cm => cm.moveH(1, \"group\"),\n  goGroupLeft: cm => cm.moveH(-1, \"group\"),\n  goWordRight: cm => cm.moveH(1, \"word\"),\n  delCharBefore: cm => cm.deleteH(-1, \"codepoint\"),\n  delCharAfter: cm => cm.deleteH(1, \"char\"),\n  delWordBefore: cm => cm.deleteH(-1, \"word\"),\n  delWordAfter: cm => cm.deleteH(1, \"word\"),\n  delGroupBefore: cm => cm.deleteH(-1, \"group\"),\n  delGroupAfter: cm => cm.deleteH(1, \"group\"),\n  indentAuto: cm => cm.indentSelection(\"smart\"),\n  indentMore: cm => cm.indentSelection(\"add\"),\n  indentLess: cm => cm.indentSelection(\"subtract\"),\n  insertTab: cm => cm.replaceSelection(\"\\t\"),\n  insertSoftTab: cm => {\n    let spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize\n    for (let i = 0; i < ranges.length; i++) {\n      let pos = ranges[i].from()\n      let col = countColumn(cm.getLine(pos.line), pos.ch, tabSize)\n      spaces.push(spaceStr(tabSize - col % tabSize))\n    }\n    cm.replaceSelections(spaces)\n  },\n  defaultTab: cm => {\n    if (cm.somethingSelected()) cm.indentSelection(\"add\")\n    else cm.execCommand(\"insertTab\")\n  },\n  // Swap the two chars left and right of each selection's head.\n  // Move cursor behind the two swapped characters afterwards.\n  //\n  // Doesn't consider line feeds a character.\n  // Doesn't scan more than one line above to find a character.\n  // Doesn't do anything on an empty line.\n  // Doesn't do anything with non-empty selections.\n  transposeChars: cm => runInOp(cm, () => {\n    let ranges = cm.listSelections(), newSel = []\n    for (let i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) continue\n      let cur = ranges[i].head, line = getLine(cm.doc, cur.line).text\n      if (line) {\n        if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1)\n        if (cur.ch > 0) {\n          cur = new Pos(cur.line, cur.ch + 1)\n          cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n                          Pos(cur.line, cur.ch - 2), cur, \"+transpose\")\n        } else if (cur.line > cm.doc.first) {\n          let prev = getLine(cm.doc, cur.line - 1).text\n          if (prev) {\n            cur = new Pos(cur.line, 1)\n            cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n                            prev.charAt(prev.length - 1),\n                            Pos(cur.line - 1, prev.length - 1), cur, \"+transpose\")\n          }\n        }\n      }\n      newSel.push(new Range(cur, cur))\n    }\n    cm.setSelections(newSel)\n  }),\n  newlineAndIndent: cm => runInOp(cm, () => {\n    let sels = cm.listSelections()\n    for (let i = sels.length - 1; i >= 0; i--)\n      cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, \"+input\")\n    sels = cm.listSelections()\n    for (let i = 0; i < sels.length; i++)\n      cm.indentLine(sels[i].from().line, null, true)\n    ensureCursorVisible(cm)\n  }),\n  openLine: cm => cm.replaceSelection(\"\\n\", \"start\"),\n  toggleOverwrite: cm => cm.toggleOverwrite()\n}\n\n\nfunction lineStart(cm, lineN) {\n  let line = getLine(cm.doc, lineN)\n  let visual = visualLine(line)\n  if (visual != line) lineN = lineNo(visual)\n  return endOfLine(true, cm, visual, lineN, 1)\n}\nfunction lineEnd(cm, lineN) {\n  let line = getLine(cm.doc, lineN)\n  let visual = visualLineEnd(line)\n  if (visual != line) lineN = lineNo(visual)\n  return endOfLine(true, cm, line, lineN, -1)\n}\nfunction lineStartSmart(cm, pos) {\n  let start = lineStart(cm, pos.line)\n  let line = getLine(cm.doc, start.line)\n  let order = getOrder(line, cm.doc.direction)\n  if (!order || order[0].level == 0) {\n    let firstNonWS = Math.max(start.ch, line.text.search(/\\S/))\n    let inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch\n    return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)\n  }\n  return start\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/deleteNearSelection.js",
    "content": "import { runInOp } from \"../display/operations.js\"\nimport { ensureCursorVisible } from \"../display/scrolling.js\"\nimport { cmp } from \"../line/pos.js\"\nimport { replaceRange } from \"../model/changes.js\"\nimport { lst } from \"../util/misc.js\"\n\n// Helper for deleting text near the selection(s), used to implement\n// backspace, delete, and similar functionality.\nexport function deleteNearSelection(cm, compute) {\n  let ranges = cm.doc.sel.ranges, kill = []\n  // Build up a set of ranges to kill first, merging overlapping\n  // ranges.\n  for (let i = 0; i < ranges.length; i++) {\n    let toKill = compute(ranges[i])\n    while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n      let replaced = kill.pop()\n      if (cmp(replaced.from, toKill.from) < 0) {\n        toKill.from = replaced.from\n        break\n      }\n    }\n    kill.push(toKill)\n  }\n  // Next, remove those actual ranges.\n  runInOp(cm, () => {\n    for (let i = kill.length - 1; i >= 0; i--)\n      replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\")\n    ensureCursorVisible(cm)\n  })\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/drop_events.js",
    "content": "import { drawSelectionCursor } from \"../display/selection.js\"\nimport { operation } from \"../display/operations.js\"\nimport { clipPos } from \"../line/pos.js\"\nimport { posFromMouse } from \"../measurement/position_measurement.js\"\nimport { eventInWidget } from \"../measurement/widgets.js\"\nimport { makeChange, replaceRange } from \"../model/changes.js\"\nimport { changeEnd } from \"../model/change_measurement.js\"\nimport { simpleSelection } from \"../model/selection.js\"\nimport { setSelectionNoUndo, setSelectionReplaceHistory } from \"../model/selection_updates.js\"\nimport { ie, presto, safari } from \"../util/browser.js\"\nimport { elt, removeChildrenAndAdd } from \"../util/dom.js\"\nimport { e_preventDefault, e_stop, signalDOMEvent } from \"../util/event.js\"\nimport { indexOf } from \"../util/misc.js\"\n\n// Kludge to work around strange IE behavior where it'll sometimes\n// re-fire a series of drag-related events right after the drop (#1551)\nlet lastDrop = 0\n\nexport function onDrop(e) {\n  let cm = this\n  clearDragCursor(cm)\n  if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n    return\n  e_preventDefault(e)\n  if (ie) lastDrop = +new Date\n  let pos = posFromMouse(cm, e, true), files = e.dataTransfer.files\n  if (!pos || cm.isReadOnly()) return\n  // Might be a file drop, in which case we simply extract the text\n  // and insert it.\n  if (files && files.length && window.FileReader && window.File) {\n    let n = files.length, text = Array(n), read = 0\n    const markAsReadAndPasteIfAllFilesAreRead = () => {\n      if (++read == n) {\n        operation(cm, () => {\n          pos = clipPos(cm.doc, pos)\n          let change = {from: pos, to: pos,\n                        text: cm.doc.splitLines(\n                            text.filter(t => t != null).join(cm.doc.lineSeparator())),\n                        origin: \"paste\"}\n          makeChange(cm.doc, change)\n          setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))))\n        })()\n      }\n    }\n    const readTextFromFile = (file, i) => {\n      if (cm.options.allowDropFileTypes &&\n          indexOf(cm.options.allowDropFileTypes, file.type) == -1) {\n        markAsReadAndPasteIfAllFilesAreRead()\n        return\n      }\n      let reader = new FileReader\n      reader.onerror = () => markAsReadAndPasteIfAllFilesAreRead()\n      reader.onload = () => {\n        let content = reader.result\n        if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) {\n          markAsReadAndPasteIfAllFilesAreRead()\n          return\n        }\n        text[i] = content\n        markAsReadAndPasteIfAllFilesAreRead()\n      }\n      reader.readAsText(file)\n    }\n    for (let i = 0; i < files.length; i++) readTextFromFile(files[i], i)\n  } else { // Normal drop\n    // Don't do a replace if the drop happened inside of the selected text.\n    if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n      cm.state.draggingText(e)\n      // Ensure the editor is re-focused\n      setTimeout(() => cm.display.input.focus(), 20)\n      return\n    }\n    try {\n      let text = e.dataTransfer.getData(\"Text\")\n      if (text) {\n        let selected\n        if (cm.state.draggingText && !cm.state.draggingText.copy)\n          selected = cm.listSelections()\n        setSelectionNoUndo(cm.doc, simpleSelection(pos, pos))\n        if (selected) for (let i = 0; i < selected.length; ++i)\n          replaceRange(cm.doc, \"\", selected[i].anchor, selected[i].head, \"drag\")\n        cm.replaceSelection(text, \"around\", \"paste\")\n        cm.display.input.focus()\n      }\n    }\n    catch(e){}\n  }\n}\n\nexport function onDragStart(cm, e) {\n  if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }\n  if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return\n\n  e.dataTransfer.setData(\"Text\", cm.getSelection())\n  e.dataTransfer.effectAllowed = \"copyMove\"\n\n  // Use dummy image instead of default browsers image.\n  // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n  if (e.dataTransfer.setDragImage && !safari) {\n    let img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\")\n    img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n    if (presto) {\n      img.width = img.height = 1\n      cm.display.wrapper.appendChild(img)\n      // Force a relayout, or Opera won't use our image for some obscure reason\n      img._top = img.offsetTop\n    }\n    e.dataTransfer.setDragImage(img, 0, 0)\n    if (presto) img.parentNode.removeChild(img)\n  }\n}\n\nexport function onDragOver(cm, e) {\n  let pos = posFromMouse(cm, e)\n  if (!pos) return\n  let frag = document.createDocumentFragment()\n  drawSelectionCursor(cm, pos, frag)\n  if (!cm.display.dragCursor) {\n    cm.display.dragCursor = elt(\"div\", null, \"CodeMirror-cursors CodeMirror-dragcursors\")\n    cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv)\n  }\n  removeChildrenAndAdd(cm.display.dragCursor, frag)\n}\n\nexport function clearDragCursor(cm) {\n  if (cm.display.dragCursor) {\n    cm.display.lineSpace.removeChild(cm.display.dragCursor)\n    cm.display.dragCursor = null\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/fromTextArea.js",
    "content": "import { CodeMirror } from \"./CodeMirror.js\"\nimport { activeElt } from \"../util/dom.js\"\nimport { off, on } from \"../util/event.js\"\nimport { copyObj } from \"../util/misc.js\"\n\nexport function fromTextArea(textarea, options) {\n  options = options ? copyObj(options) : {}\n  options.value = textarea.value\n  if (!options.tabindex && textarea.tabIndex)\n    options.tabindex = textarea.tabIndex\n  if (!options.placeholder && textarea.placeholder)\n    options.placeholder = textarea.placeholder\n  // Set autofocus to true if this textarea is focused, or if it has\n  // autofocus and no other element is focused.\n  if (options.autofocus == null) {\n    let hasFocus = activeElt()\n    options.autofocus = hasFocus == textarea ||\n      textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body\n  }\n\n  function save() {textarea.value = cm.getValue()}\n\n  let realSubmit\n  if (textarea.form) {\n    on(textarea.form, \"submit\", save)\n    // Deplorable hack to make the submit method do the right thing.\n    if (!options.leaveSubmitMethodAlone) {\n      let form = textarea.form\n      realSubmit = form.submit\n      try {\n        let wrappedSubmit = form.submit = () => {\n          save()\n          form.submit = realSubmit\n          form.submit()\n          form.submit = wrappedSubmit\n        }\n      } catch(e) {}\n    }\n  }\n\n  options.finishInit = cm => {\n    cm.save = save\n    cm.getTextArea = () => textarea\n    cm.toTextArea = () => {\n      cm.toTextArea = isNaN // Prevent this from being ran twice\n      save()\n      textarea.parentNode.removeChild(cm.getWrapperElement())\n      textarea.style.display = \"\"\n      if (textarea.form) {\n        off(textarea.form, \"submit\", save)\n        if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == \"function\")\n          textarea.form.submit = realSubmit\n      }\n    }\n  }\n\n  textarea.style.display = \"none\"\n  let cm = CodeMirror(node => textarea.parentNode.insertBefore(node, textarea.nextSibling),\n    options)\n  return cm\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/global_events.js",
    "content": "import { onBlur } from \"../display/focus.js\"\nimport { on } from \"../util/event.js\"\n\n// These must be handled carefully, because naively registering a\n// handler for each editor will cause the editors to never be\n// garbage collected.\n\nfunction forEachCodeMirror(f) {\n  if (!document.getElementsByClassName) return\n  let byClass = document.getElementsByClassName(\"CodeMirror\"), editors = []\n  for (let i = 0; i < byClass.length; i++) {\n    let cm = byClass[i].CodeMirror\n    if (cm) editors.push(cm)\n  }\n  if (editors.length) editors[0].operation(() => {\n    for (let i = 0; i < editors.length; i++) f(editors[i])\n  })\n}\n\nlet globalsRegistered = false\nexport function ensureGlobalHandlers() {\n  if (globalsRegistered) return\n  registerGlobalHandlers()\n  globalsRegistered = true\n}\nfunction registerGlobalHandlers() {\n  // When the window resizes, we need to refresh active editors.\n  let resizeTimer\n  on(window, \"resize\", () => {\n    if (resizeTimer == null) resizeTimer = setTimeout(() => {\n      resizeTimer = null\n      forEachCodeMirror(onResize)\n    }, 100)\n  })\n  // When the window loses focus, we want to show the editor as blurred\n  on(window, \"blur\", () => forEachCodeMirror(onBlur))\n}\n// Called when the window resizes\nfunction onResize(cm) {\n  let d = cm.display\n  // Might be a text scaling operation, clear size caches.\n  d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null\n  d.scrollbarsClipped = false\n  cm.setSize()\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/key_events.js",
    "content": "import { signalLater } from \"../util/operation_group.js\"\nimport { restartBlink } from \"../display/selection.js\"\nimport { isModifierKey, keyName, lookupKey } from \"../input/keymap.js\"\nimport { eventInWidget } from \"../measurement/widgets.js\"\nimport { ie, ie_version, mac, presto, gecko } from \"../util/browser.js\"\nimport { activeElt, addClass, rmClass } from \"../util/dom.js\"\nimport { e_preventDefault, off, on, signalDOMEvent } from \"../util/event.js\"\nimport { hasCopyEvent } from \"../util/feature_detection.js\"\nimport { Delayed, Pass } from \"../util/misc.js\"\n\nimport { commands } from \"./commands.js\"\n\n// Run a handler that was bound to a key.\nfunction doHandleBinding(cm, bound, dropShift) {\n  if (typeof bound == \"string\") {\n    bound = commands[bound]\n    if (!bound) return false\n  }\n  // Ensure previous input has been read, so that the handler sees a\n  // consistent view of the document\n  cm.display.input.ensurePolled()\n  let prevShift = cm.display.shift, done = false\n  try {\n    if (cm.isReadOnly()) cm.state.suppressEdits = true\n    if (dropShift) cm.display.shift = false\n    done = bound(cm) != Pass\n  } finally {\n    cm.display.shift = prevShift\n    cm.state.suppressEdits = false\n  }\n  return done\n}\n\nfunction lookupKeyForEditor(cm, name, handle) {\n  for (let i = 0; i < cm.state.keyMaps.length; i++) {\n    let result = lookupKey(name, cm.state.keyMaps[i], handle, cm)\n    if (result) return result\n  }\n  return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))\n    || lookupKey(name, cm.options.keyMap, handle, cm)\n}\n\n// Note that, despite the name, this function is also used to check\n// for bound mouse clicks.\n\nlet stopSeq = new Delayed\n\nexport function dispatchKey(cm, name, e, handle) {\n  let seq = cm.state.keySeq\n  if (seq) {\n    if (isModifierKey(name)) return \"handled\"\n    if (/\\'$/.test(name))\n      cm.state.keySeq = null\n    else\n      stopSeq.set(50, () => {\n        if (cm.state.keySeq == seq) {\n          cm.state.keySeq = null\n          cm.display.input.reset()\n        }\n      })\n    if (dispatchKeyInner(cm, seq + \" \" + name, e, handle)) return true\n  }\n  return dispatchKeyInner(cm, name, e, handle)\n}\n\nfunction dispatchKeyInner(cm, name, e, handle) {\n  let result = lookupKeyForEditor(cm, name, handle)\n\n  if (result == \"multi\")\n    cm.state.keySeq = name\n  if (result == \"handled\")\n    signalLater(cm, \"keyHandled\", cm, name, e)\n\n  if (result == \"handled\" || result == \"multi\") {\n    e_preventDefault(e)\n    restartBlink(cm)\n  }\n\n  return !!result\n}\n\n// Handle a key from the keydown event.\nfunction handleKeyBinding(cm, e) {\n  let name = keyName(e, true)\n  if (!name) return false\n\n  if (e.shiftKey && !cm.state.keySeq) {\n    // First try to resolve full name (including 'Shift-'). Failing\n    // that, see if there is a cursor-motion command (starting with\n    // 'go') bound to the keyname without 'Shift-'.\n    return dispatchKey(cm, \"Shift-\" + name, e, b => doHandleBinding(cm, b, true))\n        || dispatchKey(cm, name, e, b => {\n             if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n               return doHandleBinding(cm, b)\n           })\n  } else {\n    return dispatchKey(cm, name, e, b => doHandleBinding(cm, b))\n  }\n}\n\n// Handle a key from the keypress event\nfunction handleCharBinding(cm, e, ch) {\n  return dispatchKey(cm, \"'\" + ch + \"'\", e, b => doHandleBinding(cm, b, true))\n}\n\nlet lastStoppedKey = null\nexport function onKeyDown(e) {\n  let cm = this\n  if (e.target && e.target != cm.display.input.getField()) return\n  cm.curOp.focus = activeElt()\n  if (signalDOMEvent(cm, e)) return\n  // IE does strange things with escape.\n  if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false\n  let code = e.keyCode\n  cm.display.shift = code == 16 || e.shiftKey\n  let handled = handleKeyBinding(cm, e)\n  if (presto) {\n    lastStoppedKey = handled ? code : null\n    // Opera has no cut event... we try to at least catch the key combo\n    if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n      cm.replaceSelection(\"\", null, \"cut\")\n  }\n  if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)\n    document.execCommand(\"cut\")\n\n  // Turn mouse into crosshair when Alt is held on Mac.\n  if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n    showCrossHair(cm)\n}\n\nfunction showCrossHair(cm) {\n  let lineDiv = cm.display.lineDiv\n  addClass(lineDiv, \"CodeMirror-crosshair\")\n\n  function up(e) {\n    if (e.keyCode == 18 || !e.altKey) {\n      rmClass(lineDiv, \"CodeMirror-crosshair\")\n      off(document, \"keyup\", up)\n      off(document, \"mouseover\", up)\n    }\n  }\n  on(document, \"keyup\", up)\n  on(document, \"mouseover\", up)\n}\n\nexport function onKeyUp(e) {\n  if (e.keyCode == 16) this.doc.sel.shift = false\n  signalDOMEvent(this, e)\n}\n\nexport function onKeyPress(e) {\n  let cm = this\n  if (e.target && e.target != cm.display.input.getField()) return\n  if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return\n  let keyCode = e.keyCode, charCode = e.charCode\n  if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}\n  if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) return\n  let ch = String.fromCharCode(charCode == null ? keyCode : charCode)\n  // Some browsers fire keypress events for backspace\n  if (ch == \"\\x08\") return\n  if (handleCharBinding(cm, e, ch)) return\n  cm.display.input.onKeyPress(e)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/legacy.js",
    "content": "import { scrollbarModel } from \"../display/scrollbars.js\"\nimport { wheelEventPixels } from \"../display/scroll_events.js\"\nimport { keyMap, keyName, isModifierKey, lookupKey, normalizeKeyMap } from \"../input/keymap.js\"\nimport { keyNames } from \"../input/keynames.js\"\nimport { Line } from \"../line/line_data.js\"\nimport { cmp, Pos } from \"../line/pos.js\"\nimport { changeEnd } from \"../model/change_measurement.js\"\nimport Doc from \"../model/Doc.js\"\nimport { LineWidget } from \"../model/line_widget.js\"\nimport { SharedTextMarker, TextMarker } from \"../model/mark_text.js\"\nimport { copyState, extendMode, getMode, innerMode, mimeModes, modeExtensions, modes, resolveMode, startState } from \"../modes.js\"\nimport { addClass, contains, rmClass } from \"../util/dom.js\"\nimport { e_preventDefault, e_stop, e_stopPropagation, off, on, signal } from \"../util/event.js\"\nimport { splitLinesAuto } from \"../util/feature_detection.js\"\nimport { countColumn, findColumn, isWordCharBasic, Pass } from \"../util/misc.js\"\nimport StringStream from \"../util/StringStream.js\"\n\nimport { commands } from \"./commands.js\"\n\nexport function addLegacyProps(CodeMirror) {\n  CodeMirror.off = off\n  CodeMirror.on = on\n  CodeMirror.wheelEventPixels = wheelEventPixels\n  CodeMirror.Doc = Doc\n  CodeMirror.splitLines = splitLinesAuto\n  CodeMirror.countColumn = countColumn\n  CodeMirror.findColumn = findColumn\n  CodeMirror.isWordChar = isWordCharBasic\n  CodeMirror.Pass = Pass\n  CodeMirror.signal = signal\n  CodeMirror.Line = Line\n  CodeMirror.changeEnd = changeEnd\n  CodeMirror.scrollbarModel = scrollbarModel\n  CodeMirror.Pos = Pos\n  CodeMirror.cmpPos = cmp\n  CodeMirror.modes = modes\n  CodeMirror.mimeModes = mimeModes\n  CodeMirror.resolveMode = resolveMode\n  CodeMirror.getMode = getMode\n  CodeMirror.modeExtensions = modeExtensions\n  CodeMirror.extendMode = extendMode\n  CodeMirror.copyState = copyState\n  CodeMirror.startState = startState\n  CodeMirror.innerMode = innerMode\n  CodeMirror.commands = commands\n  CodeMirror.keyMap = keyMap\n  CodeMirror.keyName = keyName\n  CodeMirror.isModifierKey = isModifierKey\n  CodeMirror.lookupKey = lookupKey\n  CodeMirror.normalizeKeyMap = normalizeKeyMap\n  CodeMirror.StringStream = StringStream\n  CodeMirror.SharedTextMarker = SharedTextMarker\n  CodeMirror.TextMarker = TextMarker\n  CodeMirror.LineWidget = LineWidget\n  CodeMirror.e_preventDefault = e_preventDefault\n  CodeMirror.e_stopPropagation = e_stopPropagation\n  CodeMirror.e_stop = e_stop\n  CodeMirror.addClass = addClass\n  CodeMirror.contains = contains\n  CodeMirror.rmClass = rmClass\n  CodeMirror.keyNames = keyNames\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/main.js",
    "content": "// EDITOR CONSTRUCTOR\n\nimport { CodeMirror } from \"./CodeMirror.js\"\nexport { CodeMirror } from \"./CodeMirror.js\"\n\nimport { eventMixin } from \"../util/event.js\"\nimport { indexOf } from \"../util/misc.js\"\n\nimport { defineOptions } from \"./options.js\"\n\ndefineOptions(CodeMirror)\n\nimport addEditorMethods from \"./methods.js\"\n\naddEditorMethods(CodeMirror)\n\nimport Doc from \"../model/Doc.js\"\n\n// Set up methods on CodeMirror's prototype to redirect to the editor's document.\nlet dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \")\nfor (let prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n  CodeMirror.prototype[prop] = (function(method) {\n    return function() {return method.apply(this.doc, arguments)}\n  })(Doc.prototype[prop])\n\neventMixin(Doc)\n\n// INPUT HANDLING\n\nimport ContentEditableInput from \"../input/ContentEditableInput.js\"\nimport TextareaInput from \"../input/TextareaInput.js\"\nCodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput}\n\n// MODE DEFINITION AND QUERYING\n\nimport { defineMIME, defineMode } from \"../modes.js\"\n\n// Extra arguments are stored as the mode's dependencies, which is\n// used by (legacy) mechanisms like loadmode.js to automatically\n// load a mode. (Preferred mechanism is the require/define calls.)\nCodeMirror.defineMode = function(name/*, mode, …*/) {\n  if (!CodeMirror.defaults.mode && name != \"null\") CodeMirror.defaults.mode = name\n  defineMode.apply(this, arguments)\n}\n\nCodeMirror.defineMIME = defineMIME\n\n// Minimal default mode.\nCodeMirror.defineMode(\"null\", () => ({token: stream => stream.skipToEnd()}))\nCodeMirror.defineMIME(\"text/plain\", \"null\")\n\n// EXTENSIONS\n\nCodeMirror.defineExtension = (name, func) => {\n  CodeMirror.prototype[name] = func\n}\nCodeMirror.defineDocExtension = (name, func) => {\n  Doc.prototype[name] = func\n}\n\nimport { fromTextArea } from \"./fromTextArea.js\"\n\nCodeMirror.fromTextArea = fromTextArea\n\nimport { addLegacyProps } from \"./legacy.js\"\n\naddLegacyProps(CodeMirror)\n\nCodeMirror.version = \"5.65.2\"\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/methods.js",
    "content": "import { deleteNearSelection } from \"./deleteNearSelection.js\"\nimport { commands } from \"./commands.js\"\nimport { attachDoc } from \"../model/document_data.js\"\nimport { activeElt, addClass, rmClass } from \"../util/dom.js\"\nimport { eventMixin, signal } from \"../util/event.js\"\nimport { getLineStyles, getContextBefore, takeToken } from \"../line/highlight.js\"\nimport { indentLine } from \"../input/indent.js\"\nimport { triggerElectric } from \"../input/input.js\"\nimport { onKeyDown, onKeyPress, onKeyUp } from \"./key_events.js\"\nimport { onMouseDown } from \"./mouse_events.js\"\nimport { getKeyMap } from \"../input/keymap.js\"\nimport { endOfLine, moveLogically, moveVisually } from \"../input/movement.js\"\nimport { endOperation, methodOp, operation, runInOp, startOperation } from \"../display/operations.js\"\nimport { clipLine, clipPos, equalCursorPos, Pos } from \"../line/pos.js\"\nimport { charCoords, charWidth, clearCaches, clearLineMeasurementCache, coordsChar, cursorCoords, displayHeight, displayWidth, estimateLineHeights, fromCoordSystem, intoCoordSystem, scrollGap, textHeight } from \"../measurement/position_measurement.js\"\nimport { Range } from \"../model/selection.js\"\nimport { replaceOneSelection, skipAtomic } from \"../model/selection_updates.js\"\nimport { addToScrollTop, ensureCursorVisible, scrollIntoView, scrollToCoords, scrollToCoordsRange, scrollToRange } from \"../display/scrolling.js\"\nimport { heightAtLine } from \"../line/spans.js\"\nimport { updateGutterSpace } from \"../display/update_display.js\"\nimport { indexOf, insertSorted, isWordChar, sel_dontScroll, sel_move } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\nimport { getLine, isLine, lineAtHeight } from \"../line/utils_line.js\"\nimport { regChange, regLineChange } from \"../display/view_tracking.js\"\n\n// The publicly visible API. Note that methodOp(f) means\n// 'wrap f in an operation, performed on its `this` parameter'.\n\n// This is not the complete set of editor methods. Most of the\n// methods defined on the Doc type are also injected into\n// CodeMirror.prototype, for backwards compatibility and\n// convenience.\n\nexport default function(CodeMirror) {\n  let optionHandlers = CodeMirror.optionHandlers\n\n  let helpers = CodeMirror.helpers = {}\n\n  CodeMirror.prototype = {\n    constructor: CodeMirror,\n    focus: function(){window.focus(); this.display.input.focus()},\n\n    setOption: function(option, value) {\n      let options = this.options, old = options[option]\n      if (options[option] == value && option != \"mode\") return\n      options[option] = value\n      if (optionHandlers.hasOwnProperty(option))\n        operation(this, optionHandlers[option])(this, value, old)\n      signal(this, \"optionChange\", this, option)\n    },\n\n    getOption: function(option) {return this.options[option]},\n    getDoc: function() {return this.doc},\n\n    addKeyMap: function(map, bottom) {\n      this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map))\n    },\n    removeKeyMap: function(map) {\n      let maps = this.state.keyMaps\n      for (let i = 0; i < maps.length; ++i)\n        if (maps[i] == map || maps[i].name == map) {\n          maps.splice(i, 1)\n          return true\n        }\n    },\n\n    addOverlay: methodOp(function(spec, options) {\n      let mode = spec.token ? spec : CodeMirror.getMode(this.options, spec)\n      if (mode.startState) throw new Error(\"Overlays may not be stateful.\")\n      insertSorted(this.state.overlays,\n                   {mode: mode, modeSpec: spec, opaque: options && options.opaque,\n                    priority: (options && options.priority) || 0},\n                   overlay => overlay.priority)\n      this.state.modeGen++\n      regChange(this)\n    }),\n    removeOverlay: methodOp(function(spec) {\n      let overlays = this.state.overlays\n      for (let i = 0; i < overlays.length; ++i) {\n        let cur = overlays[i].modeSpec\n        if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n          overlays.splice(i, 1)\n          this.state.modeGen++\n          regChange(this)\n          return\n        }\n      }\n    }),\n\n    indentLine: methodOp(function(n, dir, aggressive) {\n      if (typeof dir != \"string\" && typeof dir != \"number\") {\n        if (dir == null) dir = this.options.smartIndent ? \"smart\" : \"prev\"\n        else dir = dir ? \"add\" : \"subtract\"\n      }\n      if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive)\n    }),\n    indentSelection: methodOp(function(how) {\n      let ranges = this.doc.sel.ranges, end = -1\n      for (let i = 0; i < ranges.length; i++) {\n        let range = ranges[i]\n        if (!range.empty()) {\n          let from = range.from(), to = range.to()\n          let start = Math.max(end, from.line)\n          end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1\n          for (let j = start; j < end; ++j)\n            indentLine(this, j, how)\n          let newRanges = this.doc.sel.ranges\n          if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n            replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll)\n        } else if (range.head.line > end) {\n          indentLine(this, range.head.line, how, true)\n          end = range.head.line\n          if (i == this.doc.sel.primIndex) ensureCursorVisible(this)\n        }\n      }\n    }),\n\n    // Fetch the parser token for a given character. Useful for hacks\n    // that want to inspect the mode state (say, for completion).\n    getTokenAt: function(pos, precise) {\n      return takeToken(this, pos, precise)\n    },\n\n    getLineTokens: function(line, precise) {\n      return takeToken(this, Pos(line), precise, true)\n    },\n\n    getTokenTypeAt: function(pos) {\n      pos = clipPos(this.doc, pos)\n      let styles = getLineStyles(this, getLine(this.doc, pos.line))\n      let before = 0, after = (styles.length - 1) / 2, ch = pos.ch\n      let type\n      if (ch == 0) type = styles[2]\n      else for (;;) {\n        let mid = (before + after) >> 1\n        if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid\n        else if (styles[mid * 2 + 1] < ch) before = mid + 1\n        else { type = styles[mid * 2 + 2]; break }\n      }\n      let cut = type ? type.indexOf(\"overlay \") : -1\n      return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)\n    },\n\n    getModeAt: function(pos) {\n      let mode = this.doc.mode\n      if (!mode.innerMode) return mode\n      return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode\n    },\n\n    getHelper: function(pos, type) {\n      return this.getHelpers(pos, type)[0]\n    },\n\n    getHelpers: function(pos, type) {\n      let found = []\n      if (!helpers.hasOwnProperty(type)) return found\n      let help = helpers[type], mode = this.getModeAt(pos)\n      if (typeof mode[type] == \"string\") {\n        if (help[mode[type]]) found.push(help[mode[type]])\n      } else if (mode[type]) {\n        for (let i = 0; i < mode[type].length; i++) {\n          let val = help[mode[type][i]]\n          if (val) found.push(val)\n        }\n      } else if (mode.helperType && help[mode.helperType]) {\n        found.push(help[mode.helperType])\n      } else if (help[mode.name]) {\n        found.push(help[mode.name])\n      }\n      for (let i = 0; i < help._global.length; i++) {\n        let cur = help._global[i]\n        if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n          found.push(cur.val)\n      }\n      return found\n    },\n\n    getStateAfter: function(line, precise) {\n      let doc = this.doc\n      line = clipLine(doc, line == null ? doc.first + doc.size - 1: line)\n      return getContextBefore(this, line + 1, precise).state\n    },\n\n    cursorCoords: function(start, mode) {\n      let pos, range = this.doc.sel.primary()\n      if (start == null) pos = range.head\n      else if (typeof start == \"object\") pos = clipPos(this.doc, start)\n      else pos = start ? range.from() : range.to()\n      return cursorCoords(this, pos, mode || \"page\")\n    },\n\n    charCoords: function(pos, mode) {\n      return charCoords(this, clipPos(this.doc, pos), mode || \"page\")\n    },\n\n    coordsChar: function(coords, mode) {\n      coords = fromCoordSystem(this, coords, mode || \"page\")\n      return coordsChar(this, coords.left, coords.top)\n    },\n\n    lineAtHeight: function(height, mode) {\n      height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top\n      return lineAtHeight(this.doc, height + this.display.viewOffset)\n    },\n    heightAtLine: function(line, mode, includeWidgets) {\n      let end = false, lineObj\n      if (typeof line == \"number\") {\n        let last = this.doc.first + this.doc.size - 1\n        if (line < this.doc.first) line = this.doc.first\n        else if (line > last) { line = last; end = true }\n        lineObj = getLine(this.doc, line)\n      } else {\n        lineObj = line\n      }\n      return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\", includeWidgets || end).top +\n        (end ? this.doc.height - heightAtLine(lineObj) : 0)\n    },\n\n    defaultTextHeight: function() { return textHeight(this.display) },\n    defaultCharWidth: function() { return charWidth(this.display) },\n\n    getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},\n\n    addWidget: function(pos, node, scroll, vert, horiz) {\n      let display = this.display\n      pos = cursorCoords(this, clipPos(this.doc, pos))\n      let top = pos.bottom, left = pos.left\n      node.style.position = \"absolute\"\n      node.setAttribute(\"cm-ignore-events\", \"true\")\n      this.display.input.setUneditable(node)\n      display.sizer.appendChild(node)\n      if (vert == \"over\") {\n        top = pos.top\n      } else if (vert == \"above\" || vert == \"near\") {\n        let vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n        hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth)\n        // Default to positioning above (if specified and possible); otherwise default to positioning below\n        if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n          top = pos.top - node.offsetHeight\n        else if (pos.bottom + node.offsetHeight <= vspace)\n          top = pos.bottom\n        if (left + node.offsetWidth > hspace)\n          left = hspace - node.offsetWidth\n      }\n      node.style.top = top + \"px\"\n      node.style.left = node.style.right = \"\"\n      if (horiz == \"right\") {\n        left = display.sizer.clientWidth - node.offsetWidth\n        node.style.right = \"0px\"\n      } else {\n        if (horiz == \"left\") left = 0\n        else if (horiz == \"middle\") left = (display.sizer.clientWidth - node.offsetWidth) / 2\n        node.style.left = left + \"px\"\n      }\n      if (scroll)\n        scrollIntoView(this, {left, top, right: left + node.offsetWidth, bottom: top + node.offsetHeight})\n    },\n\n    triggerOnKeyDown: methodOp(onKeyDown),\n    triggerOnKeyPress: methodOp(onKeyPress),\n    triggerOnKeyUp: onKeyUp,\n    triggerOnMouseDown: methodOp(onMouseDown),\n\n    execCommand: function(cmd) {\n      if (commands.hasOwnProperty(cmd))\n        return commands[cmd].call(null, this)\n    },\n\n    triggerElectric: methodOp(function(text) { triggerElectric(this, text) }),\n\n    findPosH: function(from, amount, unit, visually) {\n      let dir = 1\n      if (amount < 0) { dir = -1; amount = -amount }\n      let cur = clipPos(this.doc, from)\n      for (let i = 0; i < amount; ++i) {\n        cur = findPosH(this.doc, cur, dir, unit, visually)\n        if (cur.hitSide) break\n      }\n      return cur\n    },\n\n    moveH: methodOp(function(dir, unit) {\n      this.extendSelectionsBy(range => {\n        if (this.display.shift || this.doc.extend || range.empty())\n          return findPosH(this.doc, range.head, dir, unit, this.options.rtlMoveVisually)\n        else\n          return dir < 0 ? range.from() : range.to()\n      }, sel_move)\n    }),\n\n    deleteH: methodOp(function(dir, unit) {\n      let sel = this.doc.sel, doc = this.doc\n      if (sel.somethingSelected())\n        doc.replaceSelection(\"\", null, \"+delete\")\n      else\n        deleteNearSelection(this, range => {\n          let other = findPosH(doc, range.head, dir, unit, false)\n          return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}\n        })\n    }),\n\n    findPosV: function(from, amount, unit, goalColumn) {\n      let dir = 1, x = goalColumn\n      if (amount < 0) { dir = -1; amount = -amount }\n      let cur = clipPos(this.doc, from)\n      for (let i = 0; i < amount; ++i) {\n        let coords = cursorCoords(this, cur, \"div\")\n        if (x == null) x = coords.left\n        else coords.left = x\n        cur = findPosV(this, coords, dir, unit)\n        if (cur.hitSide) break\n      }\n      return cur\n    },\n\n    moveV: methodOp(function(dir, unit) {\n      let doc = this.doc, goals = []\n      let collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected()\n      doc.extendSelectionsBy(range => {\n        if (collapse)\n          return dir < 0 ? range.from() : range.to()\n        let headPos = cursorCoords(this, range.head, \"div\")\n        if (range.goalColumn != null) headPos.left = range.goalColumn\n        goals.push(headPos.left)\n        let pos = findPosV(this, headPos, dir, unit)\n        if (unit == \"page\" && range == doc.sel.primary())\n          addToScrollTop(this, charCoords(this, pos, \"div\").top - headPos.top)\n        return pos\n      }, sel_move)\n      if (goals.length) for (let i = 0; i < doc.sel.ranges.length; i++)\n        doc.sel.ranges[i].goalColumn = goals[i]\n    }),\n\n    // Find the word at the given position (as returned by coordsChar).\n    findWordAt: function(pos) {\n      let doc = this.doc, line = getLine(doc, pos.line).text\n      let start = pos.ch, end = pos.ch\n      if (line) {\n        let helper = this.getHelper(pos, \"wordChars\")\n        if ((pos.sticky == \"before\" || end == line.length) && start) --start; else ++end\n        let startChar = line.charAt(start)\n        let check = isWordChar(startChar, helper)\n          ? ch => isWordChar(ch, helper)\n          : /\\s/.test(startChar) ? ch => /\\s/.test(ch)\n          : ch => (!/\\s/.test(ch) && !isWordChar(ch))\n        while (start > 0 && check(line.charAt(start - 1))) --start\n        while (end < line.length && check(line.charAt(end))) ++end\n      }\n      return new Range(Pos(pos.line, start), Pos(pos.line, end))\n    },\n\n    toggleOverwrite: function(value) {\n      if (value != null && value == this.state.overwrite) return\n      if (this.state.overwrite = !this.state.overwrite)\n        addClass(this.display.cursorDiv, \"CodeMirror-overwrite\")\n      else\n        rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\")\n\n      signal(this, \"overwriteToggle\", this, this.state.overwrite)\n    },\n    hasFocus: function() { return this.display.input.getField() == activeElt() },\n    isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },\n\n    scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y) }),\n    getScrollInfo: function() {\n      let scroller = this.display.scroller\n      return {left: scroller.scrollLeft, top: scroller.scrollTop,\n              height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n              width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n              clientHeight: displayHeight(this), clientWidth: displayWidth(this)}\n    },\n\n    scrollIntoView: methodOp(function(range, margin) {\n      if (range == null) {\n        range = {from: this.doc.sel.primary().head, to: null}\n        if (margin == null) margin = this.options.cursorScrollMargin\n      } else if (typeof range == \"number\") {\n        range = {from: Pos(range, 0), to: null}\n      } else if (range.from == null) {\n        range = {from: range, to: null}\n      }\n      if (!range.to) range.to = range.from\n      range.margin = margin || 0\n\n      if (range.from.line != null) {\n        scrollToRange(this, range)\n      } else {\n        scrollToCoordsRange(this, range.from, range.to, range.margin)\n      }\n    }),\n\n    setSize: methodOp(function(width, height) {\n      let interpret = val => typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val\n      if (width != null) this.display.wrapper.style.width = interpret(width)\n      if (height != null) this.display.wrapper.style.height = interpret(height)\n      if (this.options.lineWrapping) clearLineMeasurementCache(this)\n      let lineNo = this.display.viewFrom\n      this.doc.iter(lineNo, this.display.viewTo, line => {\n        if (line.widgets) for (let i = 0; i < line.widgets.length; i++)\n          if (line.widgets[i].noHScroll) { regLineChange(this, lineNo, \"widget\"); break }\n        ++lineNo\n      })\n      this.curOp.forceUpdate = true\n      signal(this, \"refresh\", this)\n    }),\n\n    operation: function(f){return runInOp(this, f)},\n    startOperation: function(){return startOperation(this)},\n    endOperation: function(){return endOperation(this)},\n\n    refresh: methodOp(function() {\n      let oldHeight = this.display.cachedTextHeight\n      regChange(this)\n      this.curOp.forceUpdate = true\n      clearCaches(this)\n      scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop)\n      updateGutterSpace(this.display)\n      if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)\n        estimateLineHeights(this)\n      signal(this, \"refresh\", this)\n    }),\n\n    swapDoc: methodOp(function(doc) {\n      let old = this.doc\n      old.cm = null\n      // Cancel the current text selection if any (#5821)\n      if (this.state.selectingText) this.state.selectingText()\n      attachDoc(this, doc)\n      clearCaches(this)\n      this.display.input.reset()\n      scrollToCoords(this, doc.scrollLeft, doc.scrollTop)\n      this.curOp.forceScroll = true\n      signalLater(this, \"swapDoc\", this, old)\n      return old\n    }),\n\n    phrase: function(phraseText) {\n      let phrases = this.options.phrases\n      return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText\n    },\n\n    getInputField: function(){return this.display.input.getField()},\n    getWrapperElement: function(){return this.display.wrapper},\n    getScrollerElement: function(){return this.display.scroller},\n    getGutterElement: function(){return this.display.gutters}\n  }\n  eventMixin(CodeMirror)\n\n  CodeMirror.registerHelper = function(type, name, value) {\n    if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []}\n    helpers[type][name] = value\n  }\n  CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n    CodeMirror.registerHelper(type, name, value)\n    helpers[type]._global.push({pred: predicate, val: value})\n  }\n}\n\n// Used for horizontal relative motion. Dir is -1 or 1 (left or\n// right), unit can be \"codepoint\", \"char\", \"column\" (like char, but\n// doesn't cross line boundaries), \"word\" (across next word), or\n// \"group\" (to the start of next group of word or\n// non-word-non-whitespace chars). The visually param controls\n// whether, in right-to-left text, direction 1 means to move towards\n// the next index in the string, or towards the character to the right\n// of the current position. The resulting position will have a\n// hitSide=true property if it reached the end of the document.\nfunction findPosH(doc, pos, dir, unit, visually) {\n  let oldPos = pos\n  let origDir = dir\n  let lineObj = getLine(doc, pos.line)\n  let lineDir = visually && doc.direction == \"rtl\" ? -dir : dir\n  function findNextLine() {\n    let l = pos.line + lineDir\n    if (l < doc.first || l >= doc.first + doc.size) return false\n    pos = new Pos(l, pos.ch, pos.sticky)\n    return lineObj = getLine(doc, l)\n  }\n  function moveOnce(boundToLine) {\n    let next\n    if (unit == \"codepoint\") {\n      let ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1))\n      if (isNaN(ch)) {\n        next = null\n      } else {\n        let astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF\n        next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir)\n      }\n    } else if (visually) {\n      next = moveVisually(doc.cm, lineObj, pos, dir)\n    } else {\n      next = moveLogically(lineObj, pos, dir)\n    }\n    if (next == null) {\n      if (!boundToLine && findNextLine())\n        pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir)\n      else\n        return false\n    } else {\n      pos = next\n    }\n    return true\n  }\n\n  if (unit == \"char\" || unit == \"codepoint\") {\n    moveOnce()\n  } else if (unit == \"column\") {\n    moveOnce(true)\n  } else if (unit == \"word\" || unit == \"group\") {\n    let sawType = null, group = unit == \"group\"\n    let helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\")\n    for (let first = true;; first = false) {\n      if (dir < 0 && !moveOnce(!first)) break\n      let cur = lineObj.text.charAt(pos.ch) || \"\\n\"\n      let type = isWordChar(cur, helper) ? \"w\"\n        : group && cur == \"\\n\" ? \"n\"\n        : !group || /\\s/.test(cur) ? null\n        : \"p\"\n      if (group && !first && !type) type = \"s\"\n      if (sawType && sawType != type) {\n        if (dir < 0) {dir = 1; moveOnce(); pos.sticky = \"after\"}\n        break\n      }\n\n      if (type) sawType = type\n      if (dir > 0 && !moveOnce(!first)) break\n    }\n  }\n  let result = skipAtomic(doc, pos, oldPos, origDir, true)\n  if (equalCursorPos(oldPos, result)) result.hitSide = true\n  return result\n}\n\n// For relative vertical movement. Dir may be -1 or 1. Unit can be\n// \"page\" or \"line\". The resulting position will have a hitSide=true\n// property if it reached the end of the document.\nfunction findPosV(cm, pos, dir, unit) {\n  let doc = cm.doc, x = pos.left, y\n  if (unit == \"page\") {\n    let pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight)\n    let moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3)\n    y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount\n\n  } else if (unit == \"line\") {\n    y = dir > 0 ? pos.bottom + 3 : pos.top - 3\n  }\n  let target\n  for (;;) {\n    target = coordsChar(cm, x, y)\n    if (!target.outside) break\n    if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }\n    y += dir * 5\n  }\n  return target\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/mouse_events.js",
    "content": "import { delayBlurEvent, ensureFocus } from \"../display/focus.js\"\nimport { operation } from \"../display/operations.js\"\nimport { visibleLines } from \"../display/update_lines.js\"\nimport { clipPos, cmp, maxPos, minPos, Pos } from \"../line/pos.js\"\nimport { getLine, lineAtHeight } from \"../line/utils_line.js\"\nimport { posFromMouse } from \"../measurement/position_measurement.js\"\nimport { eventInWidget } from \"../measurement/widgets.js\"\nimport { normalizeSelection, Range, Selection } from \"../model/selection.js\"\nimport { extendRange, extendSelection, replaceOneSelection, setSelection } from \"../model/selection_updates.js\"\nimport { captureRightClick, chromeOS, ie, ie_version, mac, webkit, safari } from \"../util/browser.js\"\nimport { getOrder, getBidiPartAt } from \"../util/bidi.js\"\nimport { activeElt } from \"../util/dom.js\"\nimport { e_button, e_defaultPrevented, e_preventDefault, e_target, hasHandler, off, on, signal, signalDOMEvent } from \"../util/event.js\"\nimport { dragAndDrop } from \"../util/feature_detection.js\"\nimport { bind, countColumn, findColumn, sel_mouse } from \"../util/misc.js\"\nimport { addModifierNames } from \"../input/keymap.js\"\nimport { Pass } from \"../util/misc.js\"\n\nimport { dispatchKey } from \"./key_events.js\"\nimport { commands } from \"./commands.js\"\n\nconst DOUBLECLICK_DELAY = 400\n\nclass PastClick {\n  constructor(time, pos, button) {\n    this.time = time\n    this.pos = pos\n    this.button = button\n  }\n\n  compare(time, pos, button) {\n    return this.time + DOUBLECLICK_DELAY > time &&\n      cmp(pos, this.pos) == 0 && button == this.button\n  }\n}\n\nlet lastClick, lastDoubleClick\nfunction clickRepeat(pos, button) {\n  let now = +new Date\n  if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {\n    lastClick = lastDoubleClick = null\n    return \"triple\"\n  } else if (lastClick && lastClick.compare(now, pos, button)) {\n    lastDoubleClick = new PastClick(now, pos, button)\n    lastClick = null\n    return \"double\"\n  } else {\n    lastClick = new PastClick(now, pos, button)\n    lastDoubleClick = null\n    return \"single\"\n  }\n}\n\n// A mouse down can be a single click, double click, triple click,\n// start of selection drag, start of text drag, new cursor\n// (ctrl-click), rectangle drag (alt-drag), or xwin\n// middle-click-paste. Or it might be a click on something we should\n// not interfere with, such as a scrollbar or widget.\nexport function onMouseDown(e) {\n  let cm = this, display = cm.display\n  if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) return\n  display.input.ensurePolled()\n  display.shift = e.shiftKey\n\n  if (eventInWidget(display, e)) {\n    if (!webkit) {\n      // Briefly turn off draggability, to allow widgets to do\n      // normal dragging things.\n      display.scroller.draggable = false\n      setTimeout(() => display.scroller.draggable = true, 100)\n    }\n    return\n  }\n  if (clickInGutter(cm, e)) return\n  let pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : \"single\"\n  window.focus()\n\n  // #3261: make sure, that we're not starting a second selection\n  if (button == 1 && cm.state.selectingText)\n    cm.state.selectingText(e)\n\n  if (pos && handleMappedButton(cm, button, pos, repeat, e)) return\n\n  if (button == 1) {\n    if (pos) leftButtonDown(cm, pos, repeat, e)\n    else if (e_target(e) == display.scroller) e_preventDefault(e)\n  } else if (button == 2) {\n    if (pos) extendSelection(cm.doc, pos)\n    setTimeout(() => display.input.focus(), 20)\n  } else if (button == 3) {\n    if (captureRightClick) cm.display.input.onContextMenu(e)\n    else delayBlurEvent(cm)\n  }\n}\n\nfunction handleMappedButton(cm, button, pos, repeat, event) {\n  let name = \"Click\"\n  if (repeat == \"double\") name = \"Double\" + name\n  else if (repeat == \"triple\") name = \"Triple\" + name\n  name = (button == 1 ? \"Left\" : button == 2 ? \"Middle\" : \"Right\") + name\n\n  return dispatchKey(cm,  addModifierNames(name, event), event, bound => {\n    if (typeof bound == \"string\") bound = commands[bound]\n    if (!bound) return false\n    let done = false\n    try {\n      if (cm.isReadOnly()) cm.state.suppressEdits = true\n      done = bound(cm, pos) != Pass\n    } finally {\n      cm.state.suppressEdits = false\n    }\n    return done\n  })\n}\n\nfunction configureMouse(cm, repeat, event) {\n  let option = cm.getOption(\"configureMouse\")\n  let value = option ? option(cm, repeat, event) : {}\n  if (value.unit == null) {\n    let rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey\n    value.unit = rect ? \"rectangle\" : repeat == \"single\" ? \"char\" : repeat == \"double\" ? \"word\" : \"line\"\n  }\n  if (value.extend == null || cm.doc.extend) value.extend = cm.doc.extend || event.shiftKey\n  if (value.addNew == null) value.addNew = mac ? event.metaKey : event.ctrlKey\n  if (value.moveOnDrag == null) value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey)\n  return value\n}\n\nfunction leftButtonDown(cm, pos, repeat, event) {\n  if (ie) setTimeout(bind(ensureFocus, cm), 0)\n  else cm.curOp.focus = activeElt()\n\n  let behavior = configureMouse(cm, repeat, event)\n\n  let sel = cm.doc.sel, contained\n  if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n      repeat == \"single\" && (contained = sel.contains(pos)) > -1 &&\n      (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&\n      (cmp(contained.to(), pos) > 0 || pos.xRel < 0))\n    leftButtonStartDrag(cm, event, pos, behavior)\n  else\n    leftButtonSelect(cm, event, pos, behavior)\n}\n\n// Start a text drag. When it ends, see if any dragging actually\n// happen, and treat as a click if it didn't.\nfunction leftButtonStartDrag(cm, event, pos, behavior) {\n  let display = cm.display, moved = false\n  let dragEnd = operation(cm, e => {\n    if (webkit) display.scroller.draggable = false\n    cm.state.draggingText = false\n    if (cm.state.delayingBlurEvent) {\n      if (cm.hasFocus()) cm.state.delayingBlurEvent = false\n      else delayBlurEvent(cm)\n    }\n    off(display.wrapper.ownerDocument, \"mouseup\", dragEnd)\n    off(display.wrapper.ownerDocument, \"mousemove\", mouseMove)\n    off(display.scroller, \"dragstart\", dragStart)\n    off(display.scroller, \"drop\", dragEnd)\n    if (!moved) {\n      e_preventDefault(e)\n      if (!behavior.addNew)\n        extendSelection(cm.doc, pos, null, null, behavior.extend)\n      // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n      if ((webkit && !safari) || ie && ie_version == 9)\n        setTimeout(() => {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus()}, 20)\n      else\n        display.input.focus()\n    }\n  })\n  let mouseMove = function(e2) {\n    moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10\n  }\n  let dragStart = () => moved = true\n  // Let the drag handler handle this.\n  if (webkit) display.scroller.draggable = true\n  cm.state.draggingText = dragEnd\n  dragEnd.copy = !behavior.moveOnDrag\n  on(display.wrapper.ownerDocument, \"mouseup\", dragEnd)\n  on(display.wrapper.ownerDocument, \"mousemove\", mouseMove)\n  on(display.scroller, \"dragstart\", dragStart)\n  on(display.scroller, \"drop\", dragEnd)\n\n  cm.state.delayingBlurEvent = true\n  setTimeout(() => display.input.focus(), 20)\n  // IE's approach to draggable\n  if (display.scroller.dragDrop) display.scroller.dragDrop()\n}\n\nfunction rangeForUnit(cm, pos, unit) {\n  if (unit == \"char\") return new Range(pos, pos)\n  if (unit == \"word\") return cm.findWordAt(pos)\n  if (unit == \"line\") return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0)))\n  let result = unit(cm, pos)\n  return new Range(result.from, result.to)\n}\n\n// Normal selection, as opposed to text dragging.\nfunction leftButtonSelect(cm, event, start, behavior) {\n  if (ie) delayBlurEvent(cm)\n  let display = cm.display, doc = cm.doc\n  e_preventDefault(event)\n\n  let ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges\n  if (behavior.addNew && !behavior.extend) {\n    ourIndex = doc.sel.contains(start)\n    if (ourIndex > -1)\n      ourRange = ranges[ourIndex]\n    else\n      ourRange = new Range(start, start)\n  } else {\n    ourRange = doc.sel.primary()\n    ourIndex = doc.sel.primIndex\n  }\n\n  if (behavior.unit == \"rectangle\") {\n    if (!behavior.addNew) ourRange = new Range(start, start)\n    start = posFromMouse(cm, event, true, true)\n    ourIndex = -1\n  } else {\n    let range = rangeForUnit(cm, start, behavior.unit)\n    if (behavior.extend)\n      ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend)\n    else\n      ourRange = range\n  }\n\n  if (!behavior.addNew) {\n    ourIndex = 0\n    setSelection(doc, new Selection([ourRange], 0), sel_mouse)\n    startSel = doc.sel\n  } else if (ourIndex == -1) {\n    ourIndex = ranges.length\n    setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),\n                 {scroll: false, origin: \"*mouse\"})\n  } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == \"char\" && !behavior.extend) {\n    setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n                 {scroll: false, origin: \"*mouse\"})\n    startSel = doc.sel\n  } else {\n    replaceOneSelection(doc, ourIndex, ourRange, sel_mouse)\n  }\n\n  let lastPos = start\n  function extendTo(pos) {\n    if (cmp(lastPos, pos) == 0) return\n    lastPos = pos\n\n    if (behavior.unit == \"rectangle\") {\n      let ranges = [], tabSize = cm.options.tabSize\n      let startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize)\n      let posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize)\n      let left = Math.min(startCol, posCol), right = Math.max(startCol, posCol)\n      for (let line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n           line <= end; line++) {\n        let text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize)\n        if (left == right)\n          ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)))\n        else if (text.length > leftPos)\n          ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))))\n      }\n      if (!ranges.length) ranges.push(new Range(start, start))\n      setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n                   {origin: \"*mouse\", scroll: false})\n      cm.scrollIntoView(pos)\n    } else {\n      let oldRange = ourRange\n      let range = rangeForUnit(cm, pos, behavior.unit)\n      let anchor = oldRange.anchor, head\n      if (cmp(range.anchor, anchor) > 0) {\n        head = range.head\n        anchor = minPos(oldRange.from(), range.anchor)\n      } else {\n        head = range.anchor\n        anchor = maxPos(oldRange.to(), range.head)\n      }\n      let ranges = startSel.ranges.slice(0)\n      ranges[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head))\n      setSelection(doc, normalizeSelection(cm, ranges, ourIndex), sel_mouse)\n    }\n  }\n\n  let editorSize = display.wrapper.getBoundingClientRect()\n  // Used to ensure timeout re-tries don't fire when another extend\n  // happened in the meantime (clearTimeout isn't reliable -- at\n  // least on Chrome, the timeouts still happen even when cleared,\n  // if the clear happens after their scheduled firing time).\n  let counter = 0\n\n  function extend(e) {\n    let curCount = ++counter\n    let cur = posFromMouse(cm, e, true, behavior.unit == \"rectangle\")\n    if (!cur) return\n    if (cmp(cur, lastPos) != 0) {\n      cm.curOp.focus = activeElt()\n      extendTo(cur)\n      let visible = visibleLines(display, doc)\n      if (cur.line >= visible.to || cur.line < visible.from)\n        setTimeout(operation(cm, () => {if (counter == curCount) extend(e)}), 150)\n    } else {\n      let outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0\n      if (outside) setTimeout(operation(cm, () => {\n        if (counter != curCount) return\n        display.scroller.scrollTop += outside\n        extend(e)\n      }), 50)\n    }\n  }\n\n  function done(e) {\n    cm.state.selectingText = false\n    counter = Infinity\n    // If e is null or undefined we interpret this as someone trying\n    // to explicitly cancel the selection rather than the user\n    // letting go of the mouse button.\n    if (e) {\n      e_preventDefault(e)\n      display.input.focus()\n    }\n    off(display.wrapper.ownerDocument, \"mousemove\", move)\n    off(display.wrapper.ownerDocument, \"mouseup\", up)\n    doc.history.lastSelOrigin = null\n  }\n\n  let move = operation(cm, e => {\n    if (e.buttons === 0 || !e_button(e)) done(e)\n    else extend(e)\n  })\n  let up = operation(cm, done)\n  cm.state.selectingText = up\n  on(display.wrapper.ownerDocument, \"mousemove\", move)\n  on(display.wrapper.ownerDocument, \"mouseup\", up)\n}\n\n// Used when mouse-selecting to adjust the anchor to the proper side\n// of a bidi jump depending on the visual position of the head.\nfunction bidiSimplify(cm, range) {\n  let {anchor, head} = range, anchorLine = getLine(cm.doc, anchor.line)\n  if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) return range\n  let order = getOrder(anchorLine)\n  if (!order) return range\n  let index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]\n  if (part.from != anchor.ch && part.to != anchor.ch) return range\n  let boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1)\n  if (boundary == 0 || boundary == order.length) return range\n\n  // Compute the relative visual position of the head compared to the\n  // anchor (<0 is to the left, >0 to the right)\n  let leftSide\n  if (head.line != anchor.line) {\n    leftSide = (head.line - anchor.line) * (cm.doc.direction == \"ltr\" ? 1 : -1) > 0\n  } else {\n    let headIndex = getBidiPartAt(order, head.ch, head.sticky)\n    let dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1)\n    if (headIndex == boundary - 1 || headIndex == boundary)\n      leftSide = dir < 0\n    else\n      leftSide = dir > 0\n  }\n\n  let usePart = order[boundary + (leftSide ? -1 : 0)]\n  let from = leftSide == (usePart.level == 1)\n  let ch = from ? usePart.from : usePart.to, sticky = from ? \"after\" : \"before\"\n  return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)\n}\n\n\n// Determines whether an event happened in the gutter, and fires the\n// handlers for the corresponding event.\nfunction gutterEvent(cm, e, type, prevent) {\n  let mX, mY\n  if (e.touches) {\n    mX = e.touches[0].clientX\n    mY = e.touches[0].clientY\n  } else {\n    try { mX = e.clientX; mY = e.clientY }\n    catch(e) { return false }\n  }\n  if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false\n  if (prevent) e_preventDefault(e)\n\n  let display = cm.display\n  let lineBox = display.lineDiv.getBoundingClientRect()\n\n  if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e)\n  mY -= lineBox.top - display.viewOffset\n\n  for (let i = 0; i < cm.display.gutterSpecs.length; ++i) {\n    let g = display.gutters.childNodes[i]\n    if (g && g.getBoundingClientRect().right >= mX) {\n      let line = lineAtHeight(cm.doc, mY)\n      let gutter = cm.display.gutterSpecs[i]\n      signal(cm, type, cm, line, gutter.className, e)\n      return e_defaultPrevented(e)\n    }\n  }\n}\n\nexport function clickInGutter(cm, e) {\n  return gutterEvent(cm, e, \"gutterClick\", true)\n}\n\n// CONTEXT MENU HANDLING\n\n// To make the context menu work, we need to briefly unhide the\n// textarea (making it as unobtrusive as possible) to let the\n// right-click take effect on it.\nexport function onContextMenu(cm, e) {\n  if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) return\n  if (signalDOMEvent(cm, e, \"contextmenu\")) return\n  if (!captureRightClick) cm.display.input.onContextMenu(e)\n}\n\nfunction contextMenuInGutter(cm, e) {\n  if (!hasHandler(cm, \"gutterContextMenu\")) return false\n  return gutterEvent(cm, e, \"gutterContextMenu\", false)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/options.js",
    "content": "import { onBlur } from \"../display/focus.js\"\nimport { getGutters, updateGutters } from \"../display/gutters.js\"\nimport { loadMode, resetModeState } from \"../display/mode_state.js\"\nimport { initScrollbars, updateScrollbars } from \"../display/scrollbars.js\"\nimport { updateSelection } from \"../display/selection.js\"\nimport { regChange } from \"../display/view_tracking.js\"\nimport { getKeyMap } from \"../input/keymap.js\"\nimport { defaultSpecialCharPlaceholder } from \"../line/line_data.js\"\nimport { Pos } from \"../line/pos.js\"\nimport { findMaxLine } from \"../line/spans.js\"\nimport { clearCaches, compensateForHScroll, estimateLineHeights } from \"../measurement/position_measurement.js\"\nimport { replaceRange } from \"../model/changes.js\"\nimport { mobile, windows } from \"../util/browser.js\"\nimport { addClass, rmClass } from \"../util/dom.js\"\nimport { off, on } from \"../util/event.js\"\n\nimport { themeChanged } from \"./utils.js\"\n\nexport let Init = {toString: function(){return \"CodeMirror.Init\"}}\n\nexport let defaults = {}\nexport let optionHandlers = {}\n\nexport function defineOptions(CodeMirror) {\n  let optionHandlers = CodeMirror.optionHandlers\n\n  function option(name, deflt, handle, notOnInit) {\n    CodeMirror.defaults[name] = deflt\n    if (handle) optionHandlers[name] =\n      notOnInit ? (cm, val, old) => {if (old != Init) handle(cm, val, old)} : handle\n  }\n\n  CodeMirror.defineOption = option\n\n  // Passed to option handlers when there is no old value.\n  CodeMirror.Init = Init\n\n  // These two are, on init, called from the constructor because they\n  // have to be initialized before the editor can start at all.\n  option(\"value\", \"\", (cm, val) => cm.setValue(val), true)\n  option(\"mode\", null, (cm, val) => {\n    cm.doc.modeOption = val\n    loadMode(cm)\n  }, true)\n\n  option(\"indentUnit\", 2, loadMode, true)\n  option(\"indentWithTabs\", false)\n  option(\"smartIndent\", true)\n  option(\"tabSize\", 4, cm => {\n    resetModeState(cm)\n    clearCaches(cm)\n    regChange(cm)\n  }, true)\n\n  option(\"lineSeparator\", null, (cm, val) => {\n    cm.doc.lineSep = val\n    if (!val) return\n    let newBreaks = [], lineNo = cm.doc.first\n    cm.doc.iter(line => {\n      for (let pos = 0;;) {\n        let found = line.text.indexOf(val, pos)\n        if (found == -1) break\n        pos = found + val.length\n        newBreaks.push(Pos(lineNo, found))\n      }\n      lineNo++\n    })\n    for (let i = newBreaks.length - 1; i >= 0; i--)\n      replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length))\n  })\n  option(\"specialChars\", /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b\\u200e\\u200f\\u2028\\u2029\\ufeff\\ufff9-\\ufffc]/g, (cm, val, old) => {\n    cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\")\n    if (old != Init) cm.refresh()\n  })\n  option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, cm => cm.refresh(), true)\n  option(\"electricChars\", true)\n  option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", () => {\n    throw new Error(\"inputStyle can not (yet) be changed in a running editor\") // FIXME\n  }, true)\n  option(\"spellcheck\", false, (cm, val) => cm.getInputField().spellcheck = val, true)\n  option(\"autocorrect\", false, (cm, val) => cm.getInputField().autocorrect = val, true)\n  option(\"autocapitalize\", false, (cm, val) => cm.getInputField().autocapitalize = val, true)\n  option(\"rtlMoveVisually\", !windows)\n  option(\"wholeLineUpdateBefore\", true)\n\n  option(\"theme\", \"default\", cm => {\n    themeChanged(cm)\n    updateGutters(cm)\n  }, true)\n  option(\"keyMap\", \"default\", (cm, val, old) => {\n    let next = getKeyMap(val)\n    let prev = old != Init && getKeyMap(old)\n    if (prev && prev.detach) prev.detach(cm, next)\n    if (next.attach) next.attach(cm, prev || null)\n  })\n  option(\"extraKeys\", null)\n  option(\"configureMouse\", null)\n\n  option(\"lineWrapping\", false, wrappingChanged, true)\n  option(\"gutters\", [], (cm, val) => {\n    cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers)\n    updateGutters(cm)\n  }, true)\n  option(\"fixedGutter\", true, (cm, val) => {\n    cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\"\n    cm.refresh()\n  }, true)\n  option(\"coverGutterNextToScrollbar\", false, cm => updateScrollbars(cm), true)\n  option(\"scrollbarStyle\", \"native\", cm => {\n    initScrollbars(cm)\n    updateScrollbars(cm)\n    cm.display.scrollbars.setScrollTop(cm.doc.scrollTop)\n    cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft)\n  }, true)\n  option(\"lineNumbers\", false, (cm, val) => {\n    cm.display.gutterSpecs = getGutters(cm.options.gutters, val)\n    updateGutters(cm)\n  }, true)\n  option(\"firstLineNumber\", 1, updateGutters, true)\n  option(\"lineNumberFormatter\", integer => integer, updateGutters, true)\n  option(\"showCursorWhenSelecting\", false, updateSelection, true)\n\n  option(\"resetSelectionOnContextMenu\", true)\n  option(\"lineWiseCopyCut\", true)\n  option(\"pasteLinesPerSelection\", true)\n  option(\"selectionsMayTouch\", false)\n\n  option(\"readOnly\", false, (cm, val) => {\n    if (val == \"nocursor\") {\n      onBlur(cm)\n      cm.display.input.blur()\n    }\n    cm.display.input.readOnlyChanged(val)\n  })\n\n  option(\"screenReaderLabel\", null, (cm, val) => {\n    val = (val === '') ? null : val\n    cm.display.input.screenReaderLabelChanged(val)\n  })\n\n  option(\"disableInput\", false, (cm, val) => {if (!val) cm.display.input.reset()}, true)\n  option(\"dragDrop\", true, dragDropChanged)\n  option(\"allowDropFileTypes\", null)\n\n  option(\"cursorBlinkRate\", 530)\n  option(\"cursorScrollMargin\", 0)\n  option(\"cursorHeight\", 1, updateSelection, true)\n  option(\"singleCursorHeightPerLine\", true, updateSelection, true)\n  option(\"workTime\", 100)\n  option(\"workDelay\", 100)\n  option(\"flattenSpans\", true, resetModeState, true)\n  option(\"addModeClass\", false, resetModeState, true)\n  option(\"pollInterval\", 100)\n  option(\"undoDepth\", 200, (cm, val) => cm.doc.history.undoDepth = val)\n  option(\"historyEventDelay\", 1250)\n  option(\"viewportMargin\", 10, cm => cm.refresh(), true)\n  option(\"maxHighlightLength\", 10000, resetModeState, true)\n  option(\"moveInputWithCursor\", true, (cm, val) => {\n    if (!val) cm.display.input.resetPosition()\n  })\n\n  option(\"tabindex\", null, (cm, val) => cm.display.input.getField().tabIndex = val || \"\")\n  option(\"autofocus\", null)\n  option(\"direction\", \"ltr\", (cm, val) => cm.doc.setDirection(val), true)\n  option(\"phrases\", null)\n}\n\nfunction dragDropChanged(cm, value, old) {\n  let wasOn = old && old != Init\n  if (!value != !wasOn) {\n    let funcs = cm.display.dragFunctions\n    let toggle = value ? on : off\n    toggle(cm.display.scroller, \"dragstart\", funcs.start)\n    toggle(cm.display.scroller, \"dragenter\", funcs.enter)\n    toggle(cm.display.scroller, \"dragover\", funcs.over)\n    toggle(cm.display.scroller, \"dragleave\", funcs.leave)\n    toggle(cm.display.scroller, \"drop\", funcs.drop)\n  }\n}\n\nfunction wrappingChanged(cm) {\n  if (cm.options.lineWrapping) {\n    addClass(cm.display.wrapper, \"CodeMirror-wrap\")\n    cm.display.sizer.style.minWidth = \"\"\n    cm.display.sizerWidth = null\n  } else {\n    rmClass(cm.display.wrapper, \"CodeMirror-wrap\")\n    findMaxLine(cm)\n  }\n  estimateLineHeights(cm)\n  regChange(cm)\n  clearCaches(cm)\n  setTimeout(() => updateScrollbars(cm), 100)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/edit/utils.js",
    "content": "import { clearCaches } from \"../measurement/position_measurement.js\"\n\nexport function themeChanged(cm) {\n  cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n    cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\")\n  clearCaches(cm)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/input/ContentEditableInput.js",
    "content": "import { operation, runInOp } from \"../display/operations.js\"\nimport { prepareSelection } from \"../display/selection.js\"\nimport { regChange } from \"../display/view_tracking.js\"\nimport { applyTextInput, copyableRanges, disableBrowserMagic, handlePaste, hiddenTextarea, lastCopied, setLastCopied } from \"./input.js\"\nimport { cmp, maxPos, minPos, Pos } from \"../line/pos.js\"\nimport { getBetween, getLine, lineNo } from \"../line/utils_line.js\"\nimport { findViewForLine, findViewIndex, mapFromLineView, nodeAndOffsetInLineMap } from \"../measurement/position_measurement.js\"\nimport { replaceRange } from \"../model/changes.js\"\nimport { simpleSelection } from \"../model/selection.js\"\nimport { setSelection } from \"../model/selection_updates.js\"\nimport { getBidiPartAt, getOrder } from \"../util/bidi.js\"\nimport { android, chrome, gecko, ie_version } from \"../util/browser.js\"\nimport { activeElt, contains, range, removeChildrenAndAdd, selectInput } from \"../util/dom.js\"\nimport { on, signalDOMEvent } from \"../util/event.js\"\nimport { Delayed, lst, sel_dontScroll } from \"../util/misc.js\"\n\n// CONTENTEDITABLE INPUT STYLE\n\nexport default class ContentEditableInput {\n  constructor(cm) {\n    this.cm = cm\n    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null\n    this.polling = new Delayed()\n    this.composing = null\n    this.gracePeriod = false\n    this.readDOMTimeout = null\n  }\n\n  init(display) {\n    let input = this, cm = input.cm\n    let div = input.div = display.lineDiv\n    div.contentEditable = true\n    disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize)\n\n    function belongsToInput(e) {\n      for (let t = e.target; t; t = t.parentNode) {\n        if (t == div) return true\n        if (/\\bCodeMirror-(?:line)?widget\\b/.test(t.className)) break\n      }\n      return false\n    }\n\n    on(div, \"paste\", e => {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) return\n      // IE doesn't fire input events, so we schedule a read for the pasted content in this way\n      if (ie_version <= 11) setTimeout(operation(cm, () => this.updateFromDOM()), 20)\n    })\n\n    on(div, \"compositionstart\", e => {\n      this.composing = {data: e.data, done: false}\n    })\n    on(div, \"compositionupdate\", e => {\n      if (!this.composing) this.composing = {data: e.data, done: false}\n    })\n    on(div, \"compositionend\", e => {\n      if (this.composing) {\n        if (e.data != this.composing.data) this.readFromDOMSoon()\n        this.composing.done = true\n      }\n    })\n\n    on(div, \"touchstart\", () => input.forceCompositionEnd())\n\n    on(div, \"input\", () => {\n      if (!this.composing) this.readFromDOMSoon()\n    })\n\n    function onCopyCut(e) {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e)) return\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()})\n        if (e.type == \"cut\") cm.replaceSelection(\"\", null, \"cut\")\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        let ranges = copyableRanges(cm)\n        setLastCopied({lineWise: true, text: ranges.text})\n        if (e.type == \"cut\") {\n          cm.operation(() => {\n            cm.setSelections(ranges.ranges, 0, sel_dontScroll)\n            cm.replaceSelection(\"\", null, \"cut\")\n          })\n        }\n      }\n      if (e.clipboardData) {\n        e.clipboardData.clearData()\n        let content = lastCopied.text.join(\"\\n\")\n        // iOS exposes the clipboard API, but seems to discard content inserted into it\n        e.clipboardData.setData(\"Text\", content)\n        if (e.clipboardData.getData(\"Text\") == content) {\n          e.preventDefault()\n          return\n        }\n      }\n      // Old-fashioned briefly-focus-a-textarea hack\n      let kludge = hiddenTextarea(), te = kludge.firstChild\n      cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild)\n      te.value = lastCopied.text.join(\"\\n\")\n      let hadFocus = activeElt()\n      selectInput(te)\n      setTimeout(() => {\n        cm.display.lineSpace.removeChild(kludge)\n        hadFocus.focus()\n        if (hadFocus == div) input.showPrimarySelection()\n      }, 50)\n    }\n    on(div, \"copy\", onCopyCut)\n    on(div, \"cut\", onCopyCut)\n  }\n\n  screenReaderLabelChanged(label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.div.setAttribute('aria-label', label)\n    } else {\n      this.div.removeAttribute('aria-label')\n    }\n  }\n\n  prepareSelection() {\n    let result = prepareSelection(this.cm, false)\n    result.focus = activeElt() == this.div\n    return result\n  }\n\n  showSelection(info, takeFocus) {\n    if (!info || !this.cm.display.view.length) return\n    if (info.focus || takeFocus) this.showPrimarySelection()\n    this.showMultipleSelections(info)\n  }\n\n  getSelection() {\n    return this.cm.display.wrapper.ownerDocument.getSelection()\n  }\n\n  showPrimarySelection() {\n    let sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary()\n    let from = prim.from(), to = prim.to()\n\n    if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {\n      sel.removeAllRanges()\n      return\n    }\n\n    let curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset)\n    let curFocus = domToPos(cm, sel.focusNode, sel.focusOffset)\n    if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n        cmp(minPos(curAnchor, curFocus), from) == 0 &&\n        cmp(maxPos(curAnchor, curFocus), to) == 0)\n      return\n\n    let view = cm.display.view\n    let start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||\n        {node: view[0].measure.map[2], offset: 0}\n    let end = to.line < cm.display.viewTo && posToDOM(cm, to)\n    if (!end) {\n      let measure = view[view.length - 1].measure\n      let map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map\n      end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]}\n    }\n\n    if (!start || !end) {\n      sel.removeAllRanges()\n      return\n    }\n\n    let old = sel.rangeCount && sel.getRangeAt(0), rng\n    try { rng = range(start.node, start.offset, end.offset, end.node) }\n    catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n    if (rng) {\n      if (!gecko && cm.state.focused) {\n        sel.collapse(start.node, start.offset)\n        if (!rng.collapsed) {\n          sel.removeAllRanges()\n          sel.addRange(rng)\n        }\n      } else {\n        sel.removeAllRanges()\n        sel.addRange(rng)\n      }\n      if (old && sel.anchorNode == null) sel.addRange(old)\n      else if (gecko) this.startGracePeriod()\n    }\n    this.rememberSelection()\n  }\n\n  startGracePeriod() {\n    clearTimeout(this.gracePeriod)\n    this.gracePeriod = setTimeout(() => {\n      this.gracePeriod = false\n      if (this.selectionChanged())\n        this.cm.operation(() => this.cm.curOp.selectionChanged = true)\n    }, 20)\n  }\n\n  showMultipleSelections(info) {\n    removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors)\n    removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection)\n  }\n\n  rememberSelection() {\n    let sel = this.getSelection()\n    this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset\n    this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset\n  }\n\n  selectionInEditor() {\n    let sel = this.getSelection()\n    if (!sel.rangeCount) return false\n    let node = sel.getRangeAt(0).commonAncestorContainer\n    return contains(this.div, node)\n  }\n\n  focus() {\n    if (this.cm.options.readOnly != \"nocursor\") {\n      if (!this.selectionInEditor() || activeElt() != this.div)\n        this.showSelection(this.prepareSelection(), true)\n      this.div.focus()\n    }\n  }\n  blur() { this.div.blur() }\n  getField() { return this.div }\n\n  supportsTouch() { return true }\n\n  receivedFocus() {\n    let input = this\n    if (this.selectionInEditor())\n      setTimeout(() => this.pollSelection(), 20)\n    else\n      runInOp(this.cm, () => input.cm.curOp.selectionChanged = true)\n\n    function poll() {\n      if (input.cm.state.focused) {\n        input.pollSelection()\n        input.polling.set(input.cm.options.pollInterval, poll)\n      }\n    }\n    this.polling.set(this.cm.options.pollInterval, poll)\n  }\n\n  selectionChanged() {\n    let sel = this.getSelection()\n    return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n      sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset\n  }\n\n  pollSelection() {\n    if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) return\n    let sel = this.getSelection(), cm = this.cm\n    // On Android Chrome (version 56, at least), backspacing into an\n    // uneditable block element will put the cursor in that element,\n    // and then, because it's not editable, hide the virtual keyboard.\n    // Because Android doesn't allow us to actually detect backspace\n    // presses in a sane way, this code checks for when that happens\n    // and simulates a backspace press in this case.\n    if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {\n      this.cm.triggerOnKeyDown({type: \"keydown\", keyCode: 8, preventDefault: Math.abs})\n      this.blur()\n      this.focus()\n      return\n    }\n    if (this.composing) return\n    this.rememberSelection()\n    let anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset)\n    let head = domToPos(cm, sel.focusNode, sel.focusOffset)\n    if (anchor && head) runInOp(cm, () => {\n      setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll)\n      if (anchor.bad || head.bad) cm.curOp.selectionChanged = true\n    })\n  }\n\n  pollContent() {\n    if (this.readDOMTimeout != null) {\n      clearTimeout(this.readDOMTimeout)\n      this.readDOMTimeout = null\n    }\n\n    let cm = this.cm, display = cm.display, sel = cm.doc.sel.primary()\n    let from = sel.from(), to = sel.to()\n    if (from.ch == 0 && from.line > cm.firstLine())\n      from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length)\n    if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())\n      to = Pos(to.line + 1, 0)\n    if (from.line < display.viewFrom || to.line > display.viewTo - 1) return false\n\n    let fromIndex, fromLine, fromNode\n    if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n      fromLine = lineNo(display.view[0].line)\n      fromNode = display.view[0].node\n    } else {\n      fromLine = lineNo(display.view[fromIndex].line)\n      fromNode = display.view[fromIndex - 1].node.nextSibling\n    }\n    let toIndex = findViewIndex(cm, to.line)\n    let toLine, toNode\n    if (toIndex == display.view.length - 1) {\n      toLine = display.viewTo - 1\n      toNode = display.lineDiv.lastChild\n    } else {\n      toLine = lineNo(display.view[toIndex + 1].line) - 1\n      toNode = display.view[toIndex + 1].node.previousSibling\n    }\n\n    if (!fromNode) return false\n    let newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine))\n    let oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length))\n    while (newText.length > 1 && oldText.length > 1) {\n      if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine-- }\n      else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++ }\n      else break\n    }\n\n    let cutFront = 0, cutEnd = 0\n    let newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length)\n    while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n      ++cutFront\n    let newBot = lst(newText), oldBot = lst(oldText)\n    let maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n                             oldBot.length - (oldText.length == 1 ? cutFront : 0))\n    while (cutEnd < maxCutEnd &&\n           newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n      ++cutEnd\n    // Try to move start of change to start of selection if ambiguous\n    if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {\n      while (cutFront && cutFront > from.ch &&\n             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {\n        cutFront--\n        cutEnd++\n      }\n    }\n\n    newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\\u200b+/, \"\")\n    newText[0] = newText[0].slice(cutFront).replace(/\\u200b+$/, \"\")\n\n    let chFrom = Pos(fromLine, cutFront)\n    let chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0)\n    if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n      replaceRange(cm.doc, newText, chFrom, chTo, \"+input\")\n      return true\n    }\n  }\n\n  ensurePolled() {\n    this.forceCompositionEnd()\n  }\n  reset() {\n    this.forceCompositionEnd()\n  }\n  forceCompositionEnd() {\n    if (!this.composing) return\n    clearTimeout(this.readDOMTimeout)\n    this.composing = null\n    this.updateFromDOM()\n    this.div.blur()\n    this.div.focus()\n  }\n  readFromDOMSoon() {\n    if (this.readDOMTimeout != null) return\n    this.readDOMTimeout = setTimeout(() => {\n      this.readDOMTimeout = null\n      if (this.composing) {\n        if (this.composing.done) this.composing = null\n        else return\n      }\n      this.updateFromDOM()\n    }, 80)\n  }\n\n  updateFromDOM() {\n    if (this.cm.isReadOnly() || !this.pollContent())\n      runInOp(this.cm, () => regChange(this.cm))\n  }\n\n  setUneditable(node) {\n    node.contentEditable = \"false\"\n  }\n\n  onKeyPress(e) {\n    if (e.charCode == 0 || this.composing) return\n    e.preventDefault()\n    if (!this.cm.isReadOnly())\n      operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0)\n  }\n\n  readOnlyChanged(val) {\n    this.div.contentEditable = String(val != \"nocursor\")\n  }\n\n  onContextMenu() {}\n  resetPosition() {}\n}\n\nContentEditableInput.prototype.needsContentAttribute = true\n\nfunction posToDOM(cm, pos) {\n  let view = findViewForLine(cm, pos.line)\n  if (!view || view.hidden) return null\n  let line = getLine(cm.doc, pos.line)\n  let info = mapFromLineView(view, line, pos.line)\n\n  let order = getOrder(line, cm.doc.direction), side = \"left\"\n  if (order) {\n    let partPos = getBidiPartAt(order, pos.ch)\n    side = partPos % 2 ? \"right\" : \"left\"\n  }\n  let result = nodeAndOffsetInLineMap(info.map, pos.ch, side)\n  result.offset = result.collapse == \"right\" ? result.end : result.start\n  return result\n}\n\nfunction isInGutter(node) {\n  for (let scan = node; scan; scan = scan.parentNode)\n    if (/CodeMirror-gutter-wrapper/.test(scan.className)) return true\n  return false\n}\n\nfunction badPos(pos, bad) { if (bad) pos.bad = true; return pos }\n\nfunction domTextBetween(cm, from, to, fromLine, toLine) {\n  let text = \"\", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false\n  function recognizeMarker(id) { return marker => marker.id == id }\n  function close() {\n    if (closing) {\n      text += lineSep\n      if (extraLinebreak) text += lineSep\n      closing = extraLinebreak = false\n    }\n  }\n  function addText(str) {\n    if (str) {\n      close()\n      text += str\n    }\n  }\n  function walk(node) {\n    if (node.nodeType == 1) {\n      let cmText = node.getAttribute(\"cm-text\")\n      if (cmText) {\n        addText(cmText)\n        return\n      }\n      let markerID = node.getAttribute(\"cm-marker\"), range\n      if (markerID) {\n        let found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID))\n        if (found.length && (range = found[0].find(0)))\n          addText(getBetween(cm.doc, range.from, range.to).join(lineSep))\n        return\n      }\n      if (node.getAttribute(\"contenteditable\") == \"false\") return\n      let isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName)\n      if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) return\n\n      if (isBlock) close()\n      for (let i = 0; i < node.childNodes.length; i++)\n        walk(node.childNodes[i])\n\n      if (/^(pre|p)$/i.test(node.nodeName)) extraLinebreak = true\n      if (isBlock) closing = true\n    } else if (node.nodeType == 3) {\n      addText(node.nodeValue.replace(/\\u200b/g, \"\").replace(/\\u00a0/g, \" \"))\n    }\n  }\n  for (;;) {\n    walk(from)\n    if (from == to) break\n    from = from.nextSibling\n    extraLinebreak = false\n  }\n  return text\n}\n\nfunction domToPos(cm, node, offset) {\n  let lineNode\n  if (node == cm.display.lineDiv) {\n    lineNode = cm.display.lineDiv.childNodes[offset]\n    if (!lineNode) return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true)\n    node = null; offset = 0\n  } else {\n    for (lineNode = node;; lineNode = lineNode.parentNode) {\n      if (!lineNode || lineNode == cm.display.lineDiv) return null\n      if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) break\n    }\n  }\n  for (let i = 0; i < cm.display.view.length; i++) {\n    let lineView = cm.display.view[i]\n    if (lineView.node == lineNode)\n      return locateNodeInLineView(lineView, node, offset)\n  }\n}\n\nfunction locateNodeInLineView(lineView, node, offset) {\n  let wrapper = lineView.text.firstChild, bad = false\n  if (!node || !contains(wrapper, node)) return badPos(Pos(lineNo(lineView.line), 0), true)\n  if (node == wrapper) {\n    bad = true\n    node = wrapper.childNodes[offset]\n    offset = 0\n    if (!node) {\n      let line = lineView.rest ? lst(lineView.rest) : lineView.line\n      return badPos(Pos(lineNo(line), line.text.length), bad)\n    }\n  }\n\n  let textNode = node.nodeType == 3 ? node : null, topNode = node\n  if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {\n    textNode = node.firstChild\n    if (offset) offset = textNode.nodeValue.length\n  }\n  while (topNode.parentNode != wrapper) topNode = topNode.parentNode\n  let measure = lineView.measure, maps = measure.maps\n\n  function find(textNode, topNode, offset) {\n    for (let i = -1; i < (maps ? maps.length : 0); i++) {\n      let map = i < 0 ? measure.map : maps[i]\n      for (let j = 0; j < map.length; j += 3) {\n        let curNode = map[j + 2]\n        if (curNode == textNode || curNode == topNode) {\n          let line = lineNo(i < 0 ? lineView.line : lineView.rest[i])\n          let ch = map[j] + offset\n          if (offset < 0 || curNode != textNode) ch = map[j + (offset ? 1 : 0)]\n          return Pos(line, ch)\n        }\n      }\n    }\n  }\n  let found = find(textNode, topNode, offset)\n  if (found) return badPos(found, bad)\n\n  // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems\n  for (let after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {\n    found = find(after, after.firstChild, 0)\n    if (found)\n      return badPos(Pos(found.line, found.ch - dist), bad)\n    else\n      dist += after.textContent.length\n  }\n  for (let before = topNode.previousSibling, dist = offset; before; before = before.previousSibling) {\n    found = find(before, before.firstChild, -1)\n    if (found)\n      return badPos(Pos(found.line, found.ch + dist), bad)\n    else\n      dist += before.textContent.length\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/input/TextareaInput.js",
    "content": "import { operation, runInOp } from \"../display/operations.js\"\nimport { prepareSelection } from \"../display/selection.js\"\nimport { applyTextInput, copyableRanges, handlePaste, hiddenTextarea, setLastCopied } from \"./input.js\"\nimport { cursorCoords, posFromMouse } from \"../measurement/position_measurement.js\"\nimport { eventInWidget } from \"../measurement/widgets.js\"\nimport { simpleSelection } from \"../model/selection.js\"\nimport { selectAll, setSelection } from \"../model/selection_updates.js\"\nimport { captureRightClick, ie, ie_version, ios, mac, mobile, presto, webkit } from \"../util/browser.js\"\nimport { activeElt, removeChildrenAndAdd, selectInput } from \"../util/dom.js\"\nimport { e_preventDefault, e_stop, off, on, signalDOMEvent } from \"../util/event.js\"\nimport { hasSelection } from \"../util/feature_detection.js\"\nimport { Delayed, sel_dontScroll } from \"../util/misc.js\"\n\n// TEXTAREA INPUT STYLE\n\nexport default class TextareaInput {\n  constructor(cm) {\n    this.cm = cm\n    // See input.poll and input.reset\n    this.prevInput = \"\"\n\n    // Flag that indicates whether we expect input to appear real soon\n    // now (after some event like 'keypress' or 'input') and are\n    // polling intensively.\n    this.pollingFast = false\n    // Self-resetting timeout for the poller\n    this.polling = new Delayed()\n    // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n    this.hasSelection = false\n    this.composing = null\n  }\n\n  init(display) {\n    let input = this, cm = this.cm\n    this.createField(display)\n    const te = this.textarea\n\n    display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild)\n\n    // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n    if (ios) te.style.width = \"0px\"\n\n    on(te, \"input\", () => {\n      if (ie && ie_version >= 9 && this.hasSelection) this.hasSelection = null\n      input.poll()\n    })\n\n    on(te, \"paste\", e => {\n      if (signalDOMEvent(cm, e) || handlePaste(e, cm)) return\n\n      cm.state.pasteIncoming = +new Date\n      input.fastPoll()\n    })\n\n    function prepareCopyCut(e) {\n      if (signalDOMEvent(cm, e)) return\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()})\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        let ranges = copyableRanges(cm)\n        setLastCopied({lineWise: true, text: ranges.text})\n        if (e.type == \"cut\") {\n          cm.setSelections(ranges.ranges, null, sel_dontScroll)\n        } else {\n          input.prevInput = \"\"\n          te.value = ranges.text.join(\"\\n\")\n          selectInput(te)\n        }\n      }\n      if (e.type == \"cut\") cm.state.cutIncoming = +new Date\n    }\n    on(te, \"cut\", prepareCopyCut)\n    on(te, \"copy\", prepareCopyCut)\n\n    on(display.scroller, \"paste\", e => {\n      if (eventInWidget(display, e) || signalDOMEvent(cm, e)) return\n      if (!te.dispatchEvent) {\n        cm.state.pasteIncoming = +new Date\n        input.focus()\n        return\n      }\n\n      // Pass the `paste` event to the textarea so it's handled by its event listener.\n      const event = new Event(\"paste\")\n      event.clipboardData = e.clipboardData\n      te.dispatchEvent(event)\n    })\n\n    // Prevent normal selection in the editor (we handle our own)\n    on(display.lineSpace, \"selectstart\", e => {\n      if (!eventInWidget(display, e)) e_preventDefault(e)\n    })\n\n    on(te, \"compositionstart\", () => {\n      let start = cm.getCursor(\"from\")\n      if (input.composing) input.composing.range.clear()\n      input.composing = {\n        start: start,\n        range: cm.markText(start, cm.getCursor(\"to\"), {className: \"CodeMirror-composing\"})\n      }\n    })\n    on(te, \"compositionend\", () => {\n      if (input.composing) {\n        input.poll()\n        input.composing.range.clear()\n        input.composing = null\n      }\n    })\n  }\n\n  createField(_display) {\n    // Wraps and hides input textarea\n    this.wrapper = hiddenTextarea()\n    // The semihidden textarea that is focused when the editor is\n    // focused, and receives input.\n    this.textarea = this.wrapper.firstChild\n  }\n\n  screenReaderLabelChanged(label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.textarea.setAttribute('aria-label', label)\n    } else {\n      this.textarea.removeAttribute('aria-label')\n    }\n  }\n\n  prepareSelection() {\n    // Redraw the selection and/or cursor\n    let cm = this.cm, display = cm.display, doc = cm.doc\n    let result = prepareSelection(cm)\n\n    // Move the hidden textarea near the cursor to prevent scrolling artifacts\n    if (cm.options.moveInputWithCursor) {\n      let headPos = cursorCoords(cm, doc.sel.primary().head, \"div\")\n      let wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect()\n      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n                                          headPos.top + lineOff.top - wrapOff.top))\n      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n                                           headPos.left + lineOff.left - wrapOff.left))\n    }\n\n    return result\n  }\n\n  showSelection(drawn) {\n    let cm = this.cm, display = cm.display\n    removeChildrenAndAdd(display.cursorDiv, drawn.cursors)\n    removeChildrenAndAdd(display.selectionDiv, drawn.selection)\n    if (drawn.teTop != null) {\n      this.wrapper.style.top = drawn.teTop + \"px\"\n      this.wrapper.style.left = drawn.teLeft + \"px\"\n    }\n  }\n\n  // Reset the input to correspond to the selection (or to be empty,\n  // when not typing and nothing is selected)\n  reset(typing) {\n    if (this.contextMenuPending || this.composing) return\n    let cm = this.cm\n    if (cm.somethingSelected()) {\n      this.prevInput = \"\"\n      let content = cm.getSelection()\n      this.textarea.value = content\n      if (cm.state.focused) selectInput(this.textarea)\n      if (ie && ie_version >= 9) this.hasSelection = content\n    } else if (!typing) {\n      this.prevInput = this.textarea.value = \"\"\n      if (ie && ie_version >= 9) this.hasSelection = null\n    }\n  }\n\n  getField() { return this.textarea }\n\n  supportsTouch() { return false }\n\n  focus() {\n    if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != this.textarea)) {\n      try { this.textarea.focus() }\n      catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM\n    }\n  }\n\n  blur() { this.textarea.blur() }\n\n  resetPosition() {\n    this.wrapper.style.top = this.wrapper.style.left = 0\n  }\n\n  receivedFocus() { this.slowPoll() }\n\n  // Poll for input changes, using the normal rate of polling. This\n  // runs as long as the editor is focused.\n  slowPoll() {\n    if (this.pollingFast) return\n    this.polling.set(this.cm.options.pollInterval, () => {\n      this.poll()\n      if (this.cm.state.focused) this.slowPoll()\n    })\n  }\n\n  // When an event has just come in that is likely to add or change\n  // something in the input textarea, we poll faster, to ensure that\n  // the change appears on the screen quickly.\n  fastPoll() {\n    let missed = false, input = this\n    input.pollingFast = true\n    function p() {\n      let changed = input.poll()\n      if (!changed && !missed) {missed = true; input.polling.set(60, p)}\n      else {input.pollingFast = false; input.slowPoll()}\n    }\n    input.polling.set(20, p)\n  }\n\n  // Read input from the textarea, and update the document to match.\n  // When something is selected, it is present in the textarea, and\n  // selected (unless it is huge, in which case a placeholder is\n  // used). When nothing is selected, the cursor sits after previously\n  // seen text (can be empty), which is stored in prevInput (we must\n  // not reset the textarea when typing, because that breaks IME).\n  poll() {\n    let cm = this.cm, input = this.textarea, prevInput = this.prevInput\n    // Since this is called a *lot*, try to bail out as cheaply as\n    // possible when it is clear that nothing happened. hasSelection\n    // will be the case when there is a lot of text in the textarea,\n    // in which case reading its value would be expensive.\n    if (this.contextMenuPending || !cm.state.focused ||\n        (hasSelection(input) && !prevInput && !this.composing) ||\n        cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n      return false\n\n    let text = input.value\n    // If nothing changed, bail.\n    if (text == prevInput && !cm.somethingSelected()) return false\n    // Work around nonsensical selection resetting in IE9/10, and\n    // inexplicable appearance of private area unicode characters on\n    // some key combos in Mac (#2689).\n    if (ie && ie_version >= 9 && this.hasSelection === text ||\n        mac && /[\\uf700-\\uf7ff]/.test(text)) {\n      cm.display.input.reset()\n      return false\n    }\n\n    if (cm.doc.sel == cm.display.selForContextMenu) {\n      let first = text.charCodeAt(0)\n      if (first == 0x200b && !prevInput) prevInput = \"\\u200b\"\n      if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\") }\n    }\n    // Find the part of the input that is actually new\n    let same = 0, l = Math.min(prevInput.length, text.length)\n    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same\n\n    runInOp(cm, () => {\n      applyTextInput(cm, text.slice(same), prevInput.length - same,\n                     null, this.composing ? \"*compose\" : null)\n\n      // Don't leave long text in the textarea, since it makes further polling slow\n      if (text.length > 1000 || text.indexOf(\"\\n\") > -1) input.value = this.prevInput = \"\"\n      else this.prevInput = text\n\n      if (this.composing) {\n        this.composing.range.clear()\n        this.composing.range = cm.markText(this.composing.start, cm.getCursor(\"to\"),\n                                           {className: \"CodeMirror-composing\"})\n      }\n    })\n    return true\n  }\n\n  ensurePolled() {\n    if (this.pollingFast && this.poll()) this.pollingFast = false\n  }\n\n  onKeyPress() {\n    if (ie && ie_version >= 9) this.hasSelection = null\n    this.fastPoll()\n  }\n\n  onContextMenu(e) {\n    let input = this, cm = input.cm, display = cm.display, te = input.textarea\n    if (input.contextMenuPending) input.contextMenuPending()\n    let pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop\n    if (!pos || presto) return // Opera is difficult.\n\n    // Reset the current text selection only if the click is done outside of the selection\n    // and 'resetSelectionOnContextMenu' option is true.\n    let reset = cm.options.resetSelectionOnContextMenu\n    if (reset && cm.doc.sel.contains(pos) == -1)\n      operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll)\n\n    let oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText\n    let wrapperBox = input.wrapper.offsetParent.getBoundingClientRect()\n    input.wrapper.style.cssText = \"position: static\"\n    te.style.cssText = `position: absolute; width: 30px; height: 30px;\n      top: ${e.clientY - wrapperBox.top - 5}px; left: ${e.clientX - wrapperBox.left - 5}px;\n      z-index: 1000; background: ${ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\"};\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);`\n    let oldScrollY\n    if (webkit) oldScrollY = window.scrollY // Work around Chrome issue (#2712)\n    display.input.focus()\n    if (webkit) window.scrollTo(null, oldScrollY)\n    display.input.reset()\n    // Adds \"Select all\" to context menu in FF\n    if (!cm.somethingSelected()) te.value = input.prevInput = \" \"\n    input.contextMenuPending = rehide\n    display.selForContextMenu = cm.doc.sel\n    clearTimeout(display.detectingSelectAll)\n\n    // Select-all will be greyed out if there's nothing to select, so\n    // this adds a zero-width space so that we can later check whether\n    // it got selected.\n    function prepareSelectAllHack() {\n      if (te.selectionStart != null) {\n        let selected = cm.somethingSelected()\n        let extval = \"\\u200b\" + (selected ? te.value : \"\")\n        te.value = \"\\u21da\" // Used to catch context-menu undo\n        te.value = extval\n        input.prevInput = selected ? \"\" : \"\\u200b\"\n        te.selectionStart = 1; te.selectionEnd = extval.length\n        // Re-set this, in case some other handler touched the\n        // selection in the meantime.\n        display.selForContextMenu = cm.doc.sel\n      }\n    }\n    function rehide() {\n      if (input.contextMenuPending != rehide) return\n      input.contextMenuPending = false\n      input.wrapper.style.cssText = oldWrapperCSS\n      te.style.cssText = oldCSS\n      if (ie && ie_version < 9) display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos)\n\n      // Try to detect the user choosing select-all\n      if (te.selectionStart != null) {\n        if (!ie || (ie && ie_version < 9)) prepareSelectAllHack()\n        let i = 0, poll = () => {\n          if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n              te.selectionEnd > 0 && input.prevInput == \"\\u200b\") {\n            operation(cm, selectAll)(cm)\n          } else if (i++ < 10) {\n            display.detectingSelectAll = setTimeout(poll, 500)\n          } else {\n            display.selForContextMenu = null\n            display.input.reset()\n          }\n        }\n        display.detectingSelectAll = setTimeout(poll, 200)\n      }\n    }\n\n    if (ie && ie_version >= 9) prepareSelectAllHack()\n    if (captureRightClick) {\n      e_stop(e)\n      let mouseup = () => {\n        off(window, \"mouseup\", mouseup)\n        setTimeout(rehide, 20)\n      }\n      on(window, \"mouseup\", mouseup)\n    } else {\n      setTimeout(rehide, 50)\n    }\n  }\n\n  readOnlyChanged(val) {\n    if (!val) this.reset()\n    this.textarea.disabled = val == \"nocursor\"\n    this.textarea.readOnly = !!val\n  }\n\n  setUneditable() {}\n}\n\nTextareaInput.prototype.needsContentAttribute = false\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/input/indent.js",
    "content": "import { getContextBefore } from \"../line/highlight.js\"\nimport { Pos } from \"../line/pos.js\"\nimport { getLine } from \"../line/utils_line.js\"\nimport { replaceRange } from \"../model/changes.js\"\nimport { Range } from \"../model/selection.js\"\nimport { replaceOneSelection } from \"../model/selection_updates.js\"\nimport { countColumn, Pass, spaceStr } from \"../util/misc.js\"\n\n// Indent the given line. The how parameter can be \"smart\",\n// \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n// (typically set to true for forced single-line indents), empty\n// lines are not indented, and places where the mode returns Pass\n// are left alone.\nexport function indentLine(cm, n, how, aggressive) {\n  let doc = cm.doc, state\n  if (how == null) how = \"add\"\n  if (how == \"smart\") {\n    // Fall back to \"prev\" when the mode doesn't have an indentation\n    // method.\n    if (!doc.mode.indent) how = \"prev\"\n    else state = getContextBefore(cm, n).state\n  }\n\n  let tabSize = cm.options.tabSize\n  let line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize)\n  if (line.stateAfter) line.stateAfter = null\n  let curSpaceString = line.text.match(/^\\s*/)[0], indentation\n  if (!aggressive && !/\\S/.test(line.text)) {\n    indentation = 0\n    how = \"not\"\n  } else if (how == \"smart\") {\n    indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text)\n    if (indentation == Pass || indentation > 150) {\n      if (!aggressive) return\n      how = \"prev\"\n    }\n  }\n  if (how == \"prev\") {\n    if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize)\n    else indentation = 0\n  } else if (how == \"add\") {\n    indentation = curSpace + cm.options.indentUnit\n  } else if (how == \"subtract\") {\n    indentation = curSpace - cm.options.indentUnit\n  } else if (typeof how == \"number\") {\n    indentation = curSpace + how\n  }\n  indentation = Math.max(0, indentation)\n\n  let indentString = \"\", pos = 0\n  if (cm.options.indentWithTabs)\n    for (let i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\"}\n  if (pos < indentation) indentString += spaceStr(indentation - pos)\n\n  if (indentString != curSpaceString) {\n    replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\")\n    line.stateAfter = null\n    return true\n  } else {\n    // Ensure that, if the cursor was in the whitespace at the start\n    // of the line, it is moved to the end of that space.\n    for (let i = 0; i < doc.sel.ranges.length; i++) {\n      let range = doc.sel.ranges[i]\n      if (range.head.line == n && range.head.ch < curSpaceString.length) {\n        let pos = Pos(n, curSpaceString.length)\n        replaceOneSelection(doc, i, new Range(pos, pos))\n        break\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/input/input.js",
    "content": "import { runInOp } from \"../display/operations.js\"\nimport { ensureCursorVisible } from \"../display/scrolling.js\"\nimport { Pos } from \"../line/pos.js\"\nimport { getLine } from \"../line/utils_line.js\"\nimport { makeChange } from \"../model/changes.js\"\nimport { ios, webkit } from \"../util/browser.js\"\nimport { elt } from \"../util/dom.js\"\nimport { lst, map } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\nimport { splitLinesAuto } from \"../util/feature_detection.js\"\n\nimport { indentLine } from \"./indent.js\"\n\n// This will be set to a {lineWise: bool, text: [string]} object, so\n// that, when pasting, we know what kind of selections the copied\n// text was made out of.\nexport let lastCopied = null\n\nexport function setLastCopied(newLastCopied) {\n  lastCopied = newLastCopied\n}\n\nexport function applyTextInput(cm, inserted, deleted, sel, origin) {\n  let doc = cm.doc\n  cm.display.shift = false\n  if (!sel) sel = doc.sel\n\n  let recent = +new Date - 200\n  let paste = origin == \"paste\" || cm.state.pasteIncoming > recent\n  let textLines = splitLinesAuto(inserted), multiPaste = null\n  // When pasting N lines into N selections, insert one line per selection\n  if (paste && sel.ranges.length > 1) {\n    if (lastCopied && lastCopied.text.join(\"\\n\") == inserted) {\n      if (sel.ranges.length % lastCopied.text.length == 0) {\n        multiPaste = []\n        for (let i = 0; i < lastCopied.text.length; i++)\n          multiPaste.push(doc.splitLines(lastCopied.text[i]))\n      }\n    } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {\n      multiPaste = map(textLines, l => [l])\n    }\n  }\n\n  let updateInput = cm.curOp.updateInput\n  // Normal behavior is to insert the new text into every selection\n  for (let i = sel.ranges.length - 1; i >= 0; i--) {\n    let range = sel.ranges[i]\n    let from = range.from(), to = range.to()\n    if (range.empty()) {\n      if (deleted && deleted > 0) // Handle deletion\n        from = Pos(from.line, from.ch - deleted)\n      else if (cm.state.overwrite && !paste) // Handle overwrite\n        to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length))\n      else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join(\"\\n\") == textLines.join(\"\\n\"))\n        from = to = Pos(from.line, 0)\n    }\n    let changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,\n                       origin: origin || (paste ? \"paste\" : cm.state.cutIncoming > recent ? \"cut\" : \"+input\")}\n    makeChange(cm.doc, changeEvent)\n    signalLater(cm, \"inputRead\", cm, changeEvent)\n  }\n  if (inserted && !paste)\n    triggerElectric(cm, inserted)\n\n  ensureCursorVisible(cm)\n  if (cm.curOp.updateInput < 2) cm.curOp.updateInput = updateInput\n  cm.curOp.typing = true\n  cm.state.pasteIncoming = cm.state.cutIncoming = -1\n}\n\nexport function handlePaste(e, cm) {\n  let pasted = e.clipboardData && e.clipboardData.getData(\"Text\")\n  if (pasted) {\n    e.preventDefault()\n    if (!cm.isReadOnly() && !cm.options.disableInput)\n      runInOp(cm, () => applyTextInput(cm, pasted, 0, null, \"paste\"))\n    return true\n  }\n}\n\nexport function triggerElectric(cm, inserted) {\n  // When an 'electric' character is inserted, immediately trigger a reindent\n  if (!cm.options.electricChars || !cm.options.smartIndent) return\n  let sel = cm.doc.sel\n\n  for (let i = sel.ranges.length - 1; i >= 0; i--) {\n    let range = sel.ranges[i]\n    if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) continue\n    let mode = cm.getModeAt(range.head)\n    let indented = false\n    if (mode.electricChars) {\n      for (let j = 0; j < mode.electricChars.length; j++)\n        if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n          indented = indentLine(cm, range.head.line, \"smart\")\n          break\n        }\n    } else if (mode.electricInput) {\n      if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))\n        indented = indentLine(cm, range.head.line, \"smart\")\n    }\n    if (indented) signalLater(cm, \"electricInput\", cm, range.head.line)\n  }\n}\n\nexport function copyableRanges(cm) {\n  let text = [], ranges = []\n  for (let i = 0; i < cm.doc.sel.ranges.length; i++) {\n    let line = cm.doc.sel.ranges[i].head.line\n    let lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}\n    ranges.push(lineRange)\n    text.push(cm.getRange(lineRange.anchor, lineRange.head))\n  }\n  return {text: text, ranges: ranges}\n}\n\nexport function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) {\n  field.setAttribute(\"autocorrect\", autocorrect ? \"\" : \"off\")\n  field.setAttribute(\"autocapitalize\", autocapitalize ? \"\" : \"off\")\n  field.setAttribute(\"spellcheck\", !!spellcheck)\n}\n\nexport function hiddenTextarea() {\n  let te = elt(\"textarea\", null, null, \"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none\")\n  let div = elt(\"div\", [te], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\")\n  // The textarea is kept positioned near the cursor to prevent the\n  // fact that it'll be scrolled into view on input from scrolling\n  // our fake cursor out of view. On webkit, when wrap=off, paste is\n  // very slow. So make the area wide instead.\n  if (webkit) te.style.width = \"1000px\"\n  else te.setAttribute(\"wrap\", \"off\")\n  // If border: 0; -- iOS fails to open keyboard (issue #1287)\n  if (ios) te.style.border = \"1px solid black\"\n  disableBrowserMagic(te)\n  return div\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/input/keymap.js",
    "content": "import { flipCtrlCmd, mac, presto } from \"../util/browser.js\"\nimport { map } from \"../util/misc.js\"\n\nimport { keyNames } from \"./keynames.js\"\n\nexport let keyMap = {}\n\nkeyMap.basic = {\n  \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n  \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n  \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n  \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n  \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n  \"Esc\": \"singleSelection\"\n}\n// Note that the save and find-related commands aren't defined by\n// default. User code or addons can define them. Unknown commands\n// are simply ignored.\nkeyMap.pcDefault = {\n  \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n  \"Ctrl-Home\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n  \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n  \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n  \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n  \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n  \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n  \"fallthrough\": \"basic\"\n}\n// Very basic readline/emacs-style bindings, which are standard on Mac.\nkeyMap.emacsy = {\n  \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n  \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\", \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\",\n  \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\",\n  \"Ctrl-T\": \"transposeChars\", \"Ctrl-O\": \"openLine\"\n}\nkeyMap.macDefault = {\n  \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n  \"Cmd-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n  \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n  \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n  \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n  \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n  \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n  \"fallthrough\": [\"basic\", \"emacsy\"]\n}\nkeyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault\n\n// KEYMAP DISPATCH\n\nfunction normalizeKeyName(name) {\n  let parts = name.split(/-(?!$)/)\n  name = parts[parts.length - 1]\n  let alt, ctrl, shift, cmd\n  for (let i = 0; i < parts.length - 1; i++) {\n    let mod = parts[i]\n    if (/^(cmd|meta|m)$/i.test(mod)) cmd = true\n    else if (/^a(lt)?$/i.test(mod)) alt = true\n    else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true\n    else if (/^s(hift)?$/i.test(mod)) shift = true\n    else throw new Error(\"Unrecognized modifier name: \" + mod)\n  }\n  if (alt) name = \"Alt-\" + name\n  if (ctrl) name = \"Ctrl-\" + name\n  if (cmd) name = \"Cmd-\" + name\n  if (shift) name = \"Shift-\" + name\n  return name\n}\n\n// This is a kludge to keep keymaps mostly working as raw objects\n// (backwards compatibility) while at the same time support features\n// like normalization and multi-stroke key bindings. It compiles a\n// new normalized keymap, and then updates the old object to reflect\n// this.\nexport function normalizeKeyMap(keymap) {\n  let copy = {}\n  for (let keyname in keymap) if (keymap.hasOwnProperty(keyname)) {\n    let value = keymap[keyname]\n    if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) continue\n    if (value == \"...\") { delete keymap[keyname]; continue }\n\n    let keys = map(keyname.split(\" \"), normalizeKeyName)\n    for (let i = 0; i < keys.length; i++) {\n      let val, name\n      if (i == keys.length - 1) {\n        name = keys.join(\" \")\n        val = value\n      } else {\n        name = keys.slice(0, i + 1).join(\" \")\n        val = \"...\"\n      }\n      let prev = copy[name]\n      if (!prev) copy[name] = val\n      else if (prev != val) throw new Error(\"Inconsistent bindings for \" + name)\n    }\n    delete keymap[keyname]\n  }\n  for (let prop in copy) keymap[prop] = copy[prop]\n  return keymap\n}\n\nexport function lookupKey(key, map, handle, context) {\n  map = getKeyMap(map)\n  let found = map.call ? map.call(key, context) : map[key]\n  if (found === false) return \"nothing\"\n  if (found === \"...\") return \"multi\"\n  if (found != null && handle(found)) return \"handled\"\n\n  if (map.fallthrough) {\n    if (Object.prototype.toString.call(map.fallthrough) != \"[object Array]\")\n      return lookupKey(key, map.fallthrough, handle, context)\n    for (let i = 0; i < map.fallthrough.length; i++) {\n      let result = lookupKey(key, map.fallthrough[i], handle, context)\n      if (result) return result\n    }\n  }\n}\n\n// Modifier key presses don't count as 'real' key presses for the\n// purpose of keymap fallthrough.\nexport function isModifierKey(value) {\n  let name = typeof value == \"string\" ? value : keyNames[value.keyCode]\n  return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\"\n}\n\nexport function addModifierNames(name, event, noShift) {\n  let base = name\n  if (event.altKey && base != \"Alt\") name = \"Alt-\" + name\n  if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") name = \"Ctrl-\" + name\n  if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Mod\") name = \"Cmd-\" + name\n  if (!noShift && event.shiftKey && base != \"Shift\") name = \"Shift-\" + name\n  return name\n}\n\n// Look up the name of a key as indicated by an event object.\nexport function keyName(event, noShift) {\n  if (presto && event.keyCode == 34 && event[\"char\"]) return false\n  let name = keyNames[event.keyCode]\n  if (name == null || event.altGraphKey) return false\n  // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,\n  // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)\n  if (event.keyCode == 3 && event.code) name = event.code\n  return addModifierNames(name, event, noShift)\n}\n\nexport function getKeyMap(val) {\n  return typeof val == \"string\" ? keyMap[val] : val\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/input/keynames.js",
    "content": "export let keyNames = {\n  3: \"Pause\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n  19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n  36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n  46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\",\n  106: \"*\", 107: \"=\", 109: \"-\", 110: \".\", 111: \"/\", 145: \"ScrollLock\",\n  173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n  221: \"]\", 222: \"'\", 224: \"Mod\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n  63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n}\n\n// Number keys\nfor (let i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i)\n// Alphabetic keys\nfor (let i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i)\n// Function keys\nfor (let i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = \"F\" + i\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/input/movement.js",
    "content": "import { Pos } from \"../line/pos.js\"\nimport { prepareMeasureForLine, measureCharPrepared, wrappedLineExtentChar } from \"../measurement/position_measurement.js\"\nimport { getBidiPartAt, getOrder } from \"../util/bidi.js\"\nimport { findFirst, lst, skipExtendingChars } from \"../util/misc.js\"\n\nfunction moveCharLogically(line, ch, dir) {\n  let target = skipExtendingChars(line.text, ch + dir, dir)\n  return target < 0 || target > line.text.length ? null : target\n}\n\nexport function moveLogically(line, start, dir) {\n  let ch = moveCharLogically(line, start.ch, dir)\n  return ch == null ? null : new Pos(start.line, ch, dir < 0 ? \"after\" : \"before\")\n}\n\nexport function endOfLine(visually, cm, lineObj, lineNo, dir) {\n  if (visually) {\n    if (cm.doc.direction == \"rtl\") dir = -dir\n    let order = getOrder(lineObj, cm.doc.direction)\n    if (order) {\n      let part = dir < 0 ? lst(order) : order[0]\n      let moveInStorageOrder = (dir < 0) == (part.level == 1)\n      let sticky = moveInStorageOrder ? \"after\" : \"before\"\n      let ch\n      // With a wrapped rtl chunk (possibly spanning multiple bidi parts),\n      // it could be that the last bidi part is not on the last visual line,\n      // since visual lines contain content order-consecutive chunks.\n      // Thus, in rtl, we are looking for the first (content-order) character\n      // in the rtl chunk that is on the last line (that is, the same line\n      // as the last (content-order) character).\n      if (part.level > 0 || cm.doc.direction == \"rtl\") {\n        let prep = prepareMeasureForLine(cm, lineObj)\n        ch = dir < 0 ? lineObj.text.length - 1 : 0\n        let targetTop = measureCharPrepared(cm, prep, ch).top\n        ch = findFirst(ch => measureCharPrepared(cm, prep, ch).top == targetTop, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch)\n        if (sticky == \"before\") ch = moveCharLogically(lineObj, ch, 1)\n      } else ch = dir < 0 ? part.to : part.from\n      return new Pos(lineNo, ch, sticky)\n    }\n  }\n  return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? \"before\" : \"after\")\n}\n\nexport function moveVisually(cm, line, start, dir) {\n  let bidi = getOrder(line, cm.doc.direction)\n  if (!bidi) return moveLogically(line, start, dir)\n  if (start.ch >= line.text.length) {\n    start.ch = line.text.length\n    start.sticky = \"before\"\n  } else if (start.ch <= 0) {\n    start.ch = 0\n    start.sticky = \"after\"\n  }\n  let partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]\n  if (cm.doc.direction == \"ltr\" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {\n    // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,\n    // nothing interesting happens.\n    return moveLogically(line, start, dir)\n  }\n\n  let mv = (pos, dir) => moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir)\n  let prep\n  let getWrappedLineExtent = ch => {\n    if (!cm.options.lineWrapping) return {begin: 0, end: line.text.length}\n    prep = prep || prepareMeasureForLine(cm, line)\n    return wrappedLineExtentChar(cm, line, prep, ch)\n  }\n  let wrappedLineExtent = getWrappedLineExtent(start.sticky == \"before\" ? mv(start, -1) : start.ch)\n\n  if (cm.doc.direction == \"rtl\" || part.level == 1) {\n    let moveInStorageOrder = (part.level == 1) == (dir < 0)\n    let ch = mv(start, moveInStorageOrder ? 1 : -1)\n    if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {\n      // Case 2: We move within an rtl part or in an rtl editor on the same visual line\n      let sticky = moveInStorageOrder ? \"before\" : \"after\"\n      return new Pos(start.line, ch, sticky)\n    }\n  }\n\n  // Case 3: Could not move within this bidi part in this visual line, so leave\n  // the current bidi part\n\n  let searchInVisualLine = (partPos, dir, wrappedLineExtent) => {\n    let getRes = (ch, moveInStorageOrder) => moveInStorageOrder\n      ? new Pos(start.line, mv(ch, 1), \"before\")\n      : new Pos(start.line, ch, \"after\")\n\n    for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {\n      let part = bidi[partPos]\n      let moveInStorageOrder = (dir > 0) == (part.level != 1)\n      let ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1)\n      if (part.from <= ch && ch < part.to) return getRes(ch, moveInStorageOrder)\n      ch = moveInStorageOrder ? part.from : mv(part.to, -1)\n      if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) return getRes(ch, moveInStorageOrder)\n    }\n  }\n\n  // Case 3a: Look for other bidi parts on the same visual line\n  let res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent)\n  if (res) return res\n\n  // Case 3b: Look for other bidi parts on the next visual line\n  let nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1)\n  if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {\n    res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh))\n    if (res) return res\n  }\n\n  // Case 4: Nowhere to move\n  return null\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/line/highlight.js",
    "content": "import { countColumn } from \"../util/misc.js\"\nimport { copyState, innerMode, startState } from \"../modes.js\"\nimport StringStream from \"../util/StringStream.js\"\n\nimport { getLine, lineNo } from \"./utils_line.js\"\nimport { clipPos } from \"./pos.js\"\n\nclass SavedContext {\n  constructor(state, lookAhead) {\n    this.state = state\n    this.lookAhead = lookAhead\n  }\n}\n\nclass Context {\n  constructor(doc, state, line, lookAhead) {\n    this.state = state\n    this.doc = doc\n    this.line = line\n    this.maxLookAhead = lookAhead || 0\n    this.baseTokens = null\n    this.baseTokenPos = 1\n  }\n\n  lookAhead(n) {\n    let line = this.doc.getLine(this.line + n)\n    if (line != null && n > this.maxLookAhead) this.maxLookAhead = n\n    return line\n  }\n\n  baseToken(n) {\n    if (!this.baseTokens) return null\n    while (this.baseTokens[this.baseTokenPos] <= n)\n      this.baseTokenPos += 2\n    let type = this.baseTokens[this.baseTokenPos + 1]\n    return {type: type && type.replace(/( |^)overlay .*/, \"\"),\n            size: this.baseTokens[this.baseTokenPos] - n}\n  }\n\n  nextLine() {\n    this.line++\n    if (this.maxLookAhead > 0) this.maxLookAhead--\n  }\n\n  static fromSaved(doc, saved, line) {\n    if (saved instanceof SavedContext)\n      return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead)\n    else\n      return new Context(doc, copyState(doc.mode, saved), line)\n  }\n\n  save(copy) {\n    let state = copy !== false ? copyState(this.doc.mode, this.state) : this.state\n    return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state\n  }\n}\n\n\n// Compute a style array (an array starting with a mode generation\n// -- for invalidation -- followed by pairs of end positions and\n// style strings), which is used to highlight the tokens on the\n// line.\nexport function highlightLine(cm, line, context, forceToEnd) {\n  // A styles array always starts with a number identifying the\n  // mode/overlays that it is based on (for easy invalidation).\n  let st = [cm.state.modeGen], lineClasses = {}\n  // Compute the base array of styles\n  runMode(cm, line.text, cm.doc.mode, context, (end, style) => st.push(end, style),\n          lineClasses, forceToEnd)\n  let state = context.state\n\n  // Run overlays, adjust style array.\n  for (let o = 0; o < cm.state.overlays.length; ++o) {\n    context.baseTokens = st\n    let overlay = cm.state.overlays[o], i = 1, at = 0\n    context.state = true\n    runMode(cm, line.text, overlay.mode, context, (end, style) => {\n      let start = i\n      // Ensure there's a token end at the current position, and that i points at it\n      while (at < end) {\n        let i_end = st[i]\n        if (i_end > end)\n          st.splice(i, 1, end, st[i+1], i_end)\n        i += 2\n        at = Math.min(end, i_end)\n      }\n      if (!style) return\n      if (overlay.opaque) {\n        st.splice(start, i - start, end, \"overlay \" + style)\n        i = start + 2\n      } else {\n        for (; start < i; start += 2) {\n          let cur = st[start+1]\n          st[start+1] = (cur ? cur + \" \" : \"\") + \"overlay \" + style\n        }\n      }\n    }, lineClasses)\n    context.state = state\n    context.baseTokens = null\n    context.baseTokenPos = 1\n  }\n\n  return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}\n}\n\nexport function getLineStyles(cm, line, updateFrontier) {\n  if (!line.styles || line.styles[0] != cm.state.modeGen) {\n    let context = getContextBefore(cm, lineNo(line))\n    let resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state)\n    let result = highlightLine(cm, line, context)\n    if (resetState) context.state = resetState\n    line.stateAfter = context.save(!resetState)\n    line.styles = result.styles\n    if (result.classes) line.styleClasses = result.classes\n    else if (line.styleClasses) line.styleClasses = null\n    if (updateFrontier === cm.doc.highlightFrontier)\n      cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier)\n  }\n  return line.styles\n}\n\nexport function getContextBefore(cm, n, precise) {\n  let doc = cm.doc, display = cm.display\n  if (!doc.mode.startState) return new Context(doc, true, n)\n  let start = findStartLine(cm, n, precise)\n  let saved = start > doc.first && getLine(doc, start - 1).stateAfter\n  let context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start)\n\n  doc.iter(start, n, line => {\n    processLine(cm, line.text, context)\n    let pos = context.line\n    line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null\n    context.nextLine()\n  })\n  if (precise) doc.modeFrontier = context.line\n  return context\n}\n\n// Lightweight form of highlight -- proceed over this line and\n// update state, but don't save a style array. Used for lines that\n// aren't currently visible.\nexport function processLine(cm, text, context, startAt) {\n  let mode = cm.doc.mode\n  let stream = new StringStream(text, cm.options.tabSize, context)\n  stream.start = stream.pos = startAt || 0\n  if (text == \"\") callBlankLine(mode, context.state)\n  while (!stream.eol()) {\n    readToken(mode, stream, context.state)\n    stream.start = stream.pos\n  }\n}\n\nfunction callBlankLine(mode, state) {\n  if (mode.blankLine) return mode.blankLine(state)\n  if (!mode.innerMode) return\n  let inner = innerMode(mode, state)\n  if (inner.mode.blankLine) return inner.mode.blankLine(inner.state)\n}\n\nfunction readToken(mode, stream, state, inner) {\n  for (let i = 0; i < 10; i++) {\n    if (inner) inner[0] = innerMode(mode, state).mode\n    let style = mode.token(stream, state)\n    if (stream.pos > stream.start) return style\n  }\n  throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\")\n}\n\nclass Token {\n  constructor(stream, type, state) {\n    this.start = stream.start; this.end = stream.pos\n    this.string = stream.current()\n    this.type = type || null\n    this.state = state\n  }\n}\n\n// Utility for getTokenAt and getLineTokens\nexport function takeToken(cm, pos, precise, asArray) {\n  let doc = cm.doc, mode = doc.mode, style\n  pos = clipPos(doc, pos)\n  let line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise)\n  let stream = new StringStream(line.text, cm.options.tabSize, context), tokens\n  if (asArray) tokens = []\n  while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n    stream.start = stream.pos\n    style = readToken(mode, stream, context.state)\n    if (asArray) tokens.push(new Token(stream, style, copyState(doc.mode, context.state)))\n  }\n  return asArray ? tokens : new Token(stream, style, context.state)\n}\n\nfunction extractLineClasses(type, output) {\n  if (type) for (;;) {\n    let lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/)\n    if (!lineClass) break\n    type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length)\n    let prop = lineClass[1] ? \"bgClass\" : \"textClass\"\n    if (output[prop] == null)\n      output[prop] = lineClass[2]\n    else if (!(new RegExp(\"(?:^|\\\\s)\" + lineClass[2] + \"(?:$|\\\\s)\")).test(output[prop]))\n      output[prop] += \" \" + lineClass[2]\n  }\n  return type\n}\n\n// Run the given mode's parser over a line, calling f for each token.\nfunction runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {\n  let flattenSpans = mode.flattenSpans\n  if (flattenSpans == null) flattenSpans = cm.options.flattenSpans\n  let curStart = 0, curStyle = null\n  let stream = new StringStream(text, cm.options.tabSize, context), style\n  let inner = cm.options.addModeClass && [null]\n  if (text == \"\") extractLineClasses(callBlankLine(mode, context.state), lineClasses)\n  while (!stream.eol()) {\n    if (stream.pos > cm.options.maxHighlightLength) {\n      flattenSpans = false\n      if (forceToEnd) processLine(cm, text, context, stream.pos)\n      stream.pos = text.length\n      style = null\n    } else {\n      style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses)\n    }\n    if (inner) {\n      let mName = inner[0].name\n      if (mName) style = \"m-\" + (style ? mName + \" \" + style : mName)\n    }\n    if (!flattenSpans || curStyle != style) {\n      while (curStart < stream.start) {\n        curStart = Math.min(stream.start, curStart + 5000)\n        f(curStart, curStyle)\n      }\n      curStyle = style\n    }\n    stream.start = stream.pos\n  }\n  while (curStart < stream.pos) {\n    // Webkit seems to refuse to render text nodes longer than 57444\n    // characters, and returns inaccurate measurements in nodes\n    // starting around 5000 chars.\n    let pos = Math.min(stream.pos, curStart + 5000)\n    f(pos, curStyle)\n    curStart = pos\n  }\n}\n\n// Finds the line to start with when starting a parse. Tries to\n// find a line with a stateAfter, so that it can start with a\n// valid state. If that fails, it returns the line with the\n// smallest indentation, which tends to need the least context to\n// parse correctly.\nfunction findStartLine(cm, n, precise) {\n  let minindent, minline, doc = cm.doc\n  let lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100)\n  for (let search = n; search > lim; --search) {\n    if (search <= doc.first) return doc.first\n    let line = getLine(doc, search - 1), after = line.stateAfter\n    if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))\n      return search\n    let indented = countColumn(line.text, null, cm.options.tabSize)\n    if (minline == null || minindent > indented) {\n      minline = search - 1\n      minindent = indented\n    }\n  }\n  return minline\n}\n\nexport function retreatFrontier(doc, n) {\n  doc.modeFrontier = Math.min(doc.modeFrontier, n)\n  if (doc.highlightFrontier < n - 10) return\n  let start = doc.first\n  for (let line = n - 1; line > start; line--) {\n    let saved = getLine(doc, line).stateAfter\n    // change is on 3\n    // state on line 1 looked ahead 2 -- so saw 3\n    // test 1 + 2 < 3 should cover this\n    if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {\n      start = line + 1\n      break\n    }\n  }\n  doc.highlightFrontier = Math.min(doc.highlightFrontier, start)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/line/line_data.js",
    "content": "import { getOrder } from \"../util/bidi.js\"\nimport { ie, ie_version, webkit } from \"../util/browser.js\"\nimport { elt, eltP, joinClasses } from \"../util/dom.js\"\nimport { eventMixin, signal } from \"../util/event.js\"\nimport { hasBadBidiRects, zeroWidthElement } from \"../util/feature_detection.js\"\nimport { lst, spaceStr } from \"../util/misc.js\"\n\nimport { getLineStyles } from \"./highlight.js\"\nimport { attachMarkedSpans, compareCollapsedMarkers, detachMarkedSpans, lineIsHidden, visualLineContinued } from \"./spans.js\"\nimport { getLine, lineNo, updateLineHeight } from \"./utils_line.js\"\n\n// LINE DATA STRUCTURE\n\n// Line objects. These hold state related to a line, including\n// highlighting info (the styles array).\nexport class Line {\n  constructor(text, markedSpans, estimateHeight) {\n    this.text = text\n    attachMarkedSpans(this, markedSpans)\n    this.height = estimateHeight ? estimateHeight(this) : 1\n  }\n\n  lineNo() { return lineNo(this) }\n}\neventMixin(Line)\n\n// Change the content (text, markers) of a line. Automatically\n// invalidates cached information and tries to re-estimate the\n// line's height.\nexport function updateLine(line, text, markedSpans, estimateHeight) {\n  line.text = text\n  if (line.stateAfter) line.stateAfter = null\n  if (line.styles) line.styles = null\n  if (line.order != null) line.order = null\n  detachMarkedSpans(line)\n  attachMarkedSpans(line, markedSpans)\n  let estHeight = estimateHeight ? estimateHeight(line) : 1\n  if (estHeight != line.height) updateLineHeight(line, estHeight)\n}\n\n// Detach a line from the document tree and its markers.\nexport function cleanUpLine(line) {\n  line.parent = null\n  detachMarkedSpans(line)\n}\n\n// Convert a style as returned by a mode (either null, or a string\n// containing one or more styles) to a CSS style. This is cached,\n// and also looks for line-wide styles.\nlet styleToClassCache = {}, styleToClassCacheWithMode = {}\nfunction interpretTokenStyle(style, options) {\n  if (!style || /^\\s*$/.test(style)) return null\n  let cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache\n  return cache[style] ||\n    (cache[style] = style.replace(/\\S+/g, \"cm-$&\"))\n}\n\n// Render the DOM representation of the text of a line. Also builds\n// up a 'line map', which points at the DOM nodes that represent\n// specific stretches of text, and is used by the measuring code.\n// The returned object contains the DOM node, this map, and\n// information about line-wide styles that were set by the mode.\nexport function buildLineContent(cm, lineView) {\n  // The padding-right forces the element to have a 'border', which\n  // is needed on Webkit to be able to get line-level bounding\n  // rectangles for it (in measureChar).\n  let content = eltP(\"span\", null, null, webkit ? \"padding-right: .1px\" : null)\n  let builder = {pre: eltP(\"pre\", [content], \"CodeMirror-line\"), content: content,\n                 col: 0, pos: 0, cm: cm,\n                 trailingSpace: false,\n                 splitSpaces: cm.getOption(\"lineWrapping\")}\n  lineView.measure = {}\n\n  // Iterate over the logical lines that make up this visual line.\n  for (let i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n    let line = i ? lineView.rest[i - 1] : lineView.line, order\n    builder.pos = 0\n    builder.addToken = buildToken\n    // Optionally wire in some hacks into the token-rendering\n    // algorithm, to deal with browser quirks.\n    if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))\n      builder.addToken = buildTokenBadBidi(builder.addToken, order)\n    builder.map = []\n    let allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line)\n    insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate))\n    if (line.styleClasses) {\n      if (line.styleClasses.bgClass)\n        builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\")\n      if (line.styleClasses.textClass)\n        builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\")\n    }\n\n    // Ensure at least a single node is present, for measuring.\n    if (builder.map.length == 0)\n      builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)))\n\n    // Store the map and a cache object for the current logical line\n    if (i == 0) {\n      lineView.measure.map = builder.map\n      lineView.measure.cache = {}\n    } else {\n      ;(lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)\n      ;(lineView.measure.caches || (lineView.measure.caches = [])).push({})\n    }\n  }\n\n  // See issue #2901\n  if (webkit) {\n    let last = builder.content.lastChild\n    if (/\\bcm-tab\\b/.test(last.className) || (last.querySelector && last.querySelector(\".cm-tab\")))\n      builder.content.className = \"cm-tab-wrap-hack\"\n  }\n\n  signal(cm, \"renderLine\", cm, lineView.line, builder.pre)\n  if (builder.pre.className)\n    builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\")\n\n  return builder\n}\n\nexport function defaultSpecialCharPlaceholder(ch) {\n  let token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\")\n  token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16)\n  token.setAttribute(\"aria-label\", token.title)\n  return token\n}\n\n// Build up the DOM representation for a single token, and add it to\n// the line map. Takes care to render special characters separately.\nfunction buildToken(builder, text, style, startStyle, endStyle, css, attributes) {\n  if (!text) return\n  let displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text\n  let special = builder.cm.state.specialChars, mustWrap = false\n  let content\n  if (!special.test(text)) {\n    builder.col += text.length\n    content = document.createTextNode(displayText)\n    builder.map.push(builder.pos, builder.pos + text.length, content)\n    if (ie && ie_version < 9) mustWrap = true\n    builder.pos += text.length\n  } else {\n    content = document.createDocumentFragment()\n    let pos = 0\n    while (true) {\n      special.lastIndex = pos\n      let m = special.exec(text)\n      let skipped = m ? m.index - pos : text.length - pos\n      if (skipped) {\n        let txt = document.createTextNode(displayText.slice(pos, pos + skipped))\n        if (ie && ie_version < 9) content.appendChild(elt(\"span\", [txt]))\n        else content.appendChild(txt)\n        builder.map.push(builder.pos, builder.pos + skipped, txt)\n        builder.col += skipped\n        builder.pos += skipped\n      }\n      if (!m) break\n      pos += skipped + 1\n      let txt\n      if (m[0] == \"\\t\") {\n        let tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize\n        txt = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"))\n        txt.setAttribute(\"role\", \"presentation\")\n        txt.setAttribute(\"cm-text\", \"\\t\")\n        builder.col += tabWidth\n      } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n        txt = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"))\n        txt.setAttribute(\"cm-text\", m[0])\n        builder.col += 1\n      } else {\n        txt = builder.cm.options.specialCharPlaceholder(m[0])\n        txt.setAttribute(\"cm-text\", m[0])\n        if (ie && ie_version < 9) content.appendChild(elt(\"span\", [txt]))\n        else content.appendChild(txt)\n        builder.col += 1\n      }\n      builder.map.push(builder.pos, builder.pos + 1, txt)\n      builder.pos++\n    }\n  }\n  builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32\n  if (style || startStyle || endStyle || mustWrap || css || attributes) {\n    let fullStyle = style || \"\"\n    if (startStyle) fullStyle += startStyle\n    if (endStyle) fullStyle += endStyle\n    let token = elt(\"span\", [content], fullStyle, css)\n    if (attributes) {\n      for (let attr in attributes) if (attributes.hasOwnProperty(attr) && attr != \"style\" && attr != \"class\")\n        token.setAttribute(attr, attributes[attr])\n    }\n    return builder.content.appendChild(token)\n  }\n  builder.content.appendChild(content)\n}\n\n// Change some spaces to NBSP to prevent the browser from collapsing\n// trailing spaces at the end of a line when rendering text (issue #1362).\nfunction splitSpaces(text, trailingBefore) {\n  if (text.length > 1 && !/  /.test(text)) return text\n  let spaceBefore = trailingBefore, result = \"\"\n  for (let i = 0; i < text.length; i++) {\n    let ch = text.charAt(i)\n    if (ch == \" \" && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))\n      ch = \"\\u00a0\"\n    result += ch\n    spaceBefore = ch == \" \"\n  }\n  return result\n}\n\n// Work around nonsense dimensions being reported for stretches of\n// right-to-left text.\nfunction buildTokenBadBidi(inner, order) {\n  return (builder, text, style, startStyle, endStyle, css, attributes) => {\n    style = style ? style + \" cm-force-border\" : \"cm-force-border\"\n    let start = builder.pos, end = start + text.length\n    for (;;) {\n      // Find the part that overlaps with the start of this text\n      let part\n      for (let i = 0; i < order.length; i++) {\n        part = order[i]\n        if (part.to > start && part.from <= start) break\n      }\n      if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, css, attributes)\n      inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes)\n      startStyle = null\n      text = text.slice(part.to - start)\n      start = part.to\n    }\n  }\n}\n\nfunction buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n  let widget = !ignoreWidget && marker.widgetNode\n  if (widget) builder.map.push(builder.pos, builder.pos + size, widget)\n  if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {\n    if (!widget)\n      widget = builder.content.appendChild(document.createElement(\"span\"))\n    widget.setAttribute(\"cm-marker\", marker.id)\n  }\n  if (widget) {\n    builder.cm.display.input.setUneditable(widget)\n    builder.content.appendChild(widget)\n  }\n  builder.pos += size\n  builder.trailingSpace = false\n}\n\n// Outputs a number of spans to make up a line, taking highlighting\n// and marked text into account.\nfunction insertLineContent(line, builder, styles) {\n  let spans = line.markedSpans, allText = line.text, at = 0\n  if (!spans) {\n    for (let i = 1; i < styles.length; i+=2)\n      builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options))\n    return\n  }\n\n  let len = allText.length, pos = 0, i = 1, text = \"\", style, css\n  let nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes\n  for (;;) {\n    if (nextChange == pos) { // Update current marker set\n      spanStyle = spanEndStyle = spanStartStyle = css = \"\"\n      attributes = null\n      collapsed = null; nextChange = Infinity\n      let foundBookmarks = [], endStyles\n      for (let j = 0; j < spans.length; ++j) {\n        let sp = spans[j], m = sp.marker\n        if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n          foundBookmarks.push(m)\n        } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n          if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n            nextChange = sp.to\n            spanEndStyle = \"\"\n          }\n          if (m.className) spanStyle += \" \" + m.className\n          if (m.css) css = (css ? css + \";\" : \"\") + m.css\n          if (m.startStyle && sp.from == pos) spanStartStyle += \" \" + m.startStyle\n          if (m.endStyle && sp.to == nextChange) (endStyles || (endStyles = [])).push(m.endStyle, sp.to)\n          // support for the old title property\n          // https://github.com/codemirror/CodeMirror/pull/5673\n          if (m.title) (attributes || (attributes = {})).title = m.title\n          if (m.attributes) {\n            for (let attr in m.attributes)\n              (attributes || (attributes = {}))[attr] = m.attributes[attr]\n          }\n          if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n            collapsed = sp\n        } else if (sp.from > pos && nextChange > sp.from) {\n          nextChange = sp.from\n        }\n      }\n      if (endStyles) for (let j = 0; j < endStyles.length; j += 2)\n        if (endStyles[j + 1] == nextChange) spanEndStyle += \" \" + endStyles[j]\n\n      if (!collapsed || collapsed.from == pos) for (let j = 0; j < foundBookmarks.length; ++j)\n        buildCollapsedSpan(builder, 0, foundBookmarks[j])\n      if (collapsed && (collapsed.from || 0) == pos) {\n        buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n                           collapsed.marker, collapsed.from == null)\n        if (collapsed.to == null) return\n        if (collapsed.to == pos) collapsed = false\n      }\n    }\n    if (pos >= len) break\n\n    let upto = Math.min(len, nextChange)\n    while (true) {\n      if (text) {\n        let end = pos + text.length\n        if (!collapsed) {\n          let tokenText = end > upto ? text.slice(0, upto - pos) : text\n          builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n                           spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", css, attributes)\n        }\n        if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}\n        pos = end\n        spanStartStyle = \"\"\n      }\n      text = allText.slice(at, at = styles[i++])\n      style = interpretTokenStyle(styles[i++], builder.cm.options)\n    }\n  }\n}\n\n\n// These objects are used to represent the visible (currently drawn)\n// part of the document. A LineView may correspond to multiple\n// logical lines, if those are connected by collapsed ranges.\nexport function LineView(doc, line, lineN) {\n  // The starting line\n  this.line = line\n  // Continuing lines, if any\n  this.rest = visualLineContinued(line)\n  // Number of logical lines in this visual line\n  this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1\n  this.node = this.text = null\n  this.hidden = lineIsHidden(doc, line)\n}\n\n// Create a range of LineView objects for the given lines.\nexport function buildViewArray(cm, from, to) {\n  let array = [], nextPos\n  for (let pos = from; pos < to; pos = nextPos) {\n    let view = new LineView(cm.doc, getLine(cm.doc, pos), pos)\n    nextPos = pos + view.size\n    array.push(view)\n  }\n  return array\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/line/pos.js",
    "content": "import { getLine } from \"./utils_line.js\"\n\n// A Pos instance represents a position within the text.\nexport function Pos(line, ch, sticky = null) {\n  if (!(this instanceof Pos)) return new Pos(line, ch, sticky)\n  this.line = line\n  this.ch = ch\n  this.sticky = sticky\n}\n\n// Compare two positions, return 0 if they are the same, a negative\n// number when a is less, and a positive number otherwise.\nexport function cmp(a, b) { return a.line - b.line || a.ch - b.ch }\n\nexport function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }\n\nexport function copyPos(x) {return Pos(x.line, x.ch)}\nexport function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }\nexport function minPos(a, b) { return cmp(a, b) < 0 ? a : b }\n\n// Most of the external API clips given positions to make sure they\n// actually exist within the document.\nexport function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}\nexport function clipPos(doc, pos) {\n  if (pos.line < doc.first) return Pos(doc.first, 0)\n  let last = doc.first + doc.size - 1\n  if (pos.line > last) return Pos(last, getLine(doc, last).text.length)\n  return clipToLen(pos, getLine(doc, pos.line).text.length)\n}\nfunction clipToLen(pos, linelen) {\n  let ch = pos.ch\n  if (ch == null || ch > linelen) return Pos(pos.line, linelen)\n  else if (ch < 0) return Pos(pos.line, 0)\n  else return pos\n}\nexport function clipPosArray(doc, array) {\n  let out = []\n  for (let i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i])\n  return out\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/line/saw_special_spans.js",
    "content": "// Optimize some code when these features are not used.\nexport let sawReadOnlySpans = false, sawCollapsedSpans = false\n\nexport function seeReadOnlySpans() {\n  sawReadOnlySpans = true\n}\n\nexport function seeCollapsedSpans() {\n  sawCollapsedSpans = true\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/line/spans.js",
    "content": "import { indexOf, lst } from \"../util/misc.js\"\n\nimport { cmp } from \"./pos.js\"\nimport { sawCollapsedSpans } from \"./saw_special_spans.js\"\nimport { getLine, isLine, lineNo } from \"./utils_line.js\"\n\n// TEXTMARKER SPANS\n\nexport function MarkedSpan(marker, from, to) {\n  this.marker = marker\n  this.from = from; this.to = to\n}\n\n// Search an array of spans for a span matching the given marker.\nexport function getMarkedSpanFor(spans, marker) {\n  if (spans) for (let i = 0; i < spans.length; ++i) {\n    let span = spans[i]\n    if (span.marker == marker) return span\n  }\n}\n\n// Remove a span from an array, returning undefined if no spans are\n// left (we don't store arrays for lines without spans).\nexport function removeMarkedSpan(spans, span) {\n  let r\n  for (let i = 0; i < spans.length; ++i)\n    if (spans[i] != span) (r || (r = [])).push(spans[i])\n  return r\n}\n\n// Add a span to a line.\nexport function addMarkedSpan(line, span, op) {\n  let inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet))\n  if (inThisOp && inThisOp.has(line.markedSpans)) {\n    line.markedSpans.push(span)\n  } else {\n    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]\n    if (inThisOp) inThisOp.add(line.markedSpans)\n  }\n  span.marker.attachLine(line)\n}\n\n// Used for the algorithm that adjusts markers for a change in the\n// document. These functions cut an array of spans at a given\n// character position, returning an array of remaining chunks (or\n// undefined if nothing remains).\nfunction markedSpansBefore(old, startCh, isInsert) {\n  let nw\n  if (old) for (let i = 0; i < old.length; ++i) {\n    let span = old[i], marker = span.marker\n    let startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh)\n    if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n      let endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)\n      ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to))\n    }\n  }\n  return nw\n}\nfunction markedSpansAfter(old, endCh, isInsert) {\n  let nw\n  if (old) for (let i = 0; i < old.length; ++i) {\n    let span = old[i], marker = span.marker\n    let endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh)\n    if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n      let startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)\n      ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n                                            span.to == null ? null : span.to - endCh))\n    }\n  }\n  return nw\n}\n\n// Given a change object, compute the new set of marker spans that\n// cover the line in which the change took place. Removes spans\n// entirely within the change, reconnects spans belonging to the\n// same marker that appear on both sides of the change, and cuts off\n// spans partially within the change. Returns an array of span\n// arrays with one element for each line in (after) the change.\nexport function stretchSpansOverChange(doc, change) {\n  if (change.full) return null\n  let oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans\n  let oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans\n  if (!oldFirst && !oldLast) return null\n\n  let startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0\n  // Get the spans that 'stick out' on both sides\n  let first = markedSpansBefore(oldFirst, startCh, isInsert)\n  let last = markedSpansAfter(oldLast, endCh, isInsert)\n\n  // Next, merge those two ends\n  let sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0)\n  if (first) {\n    // Fix up .to properties of first\n    for (let i = 0; i < first.length; ++i) {\n      let span = first[i]\n      if (span.to == null) {\n        let found = getMarkedSpanFor(last, span.marker)\n        if (!found) span.to = startCh\n        else if (sameLine) span.to = found.to == null ? null : found.to + offset\n      }\n    }\n  }\n  if (last) {\n    // Fix up .from in last (or move them into first in case of sameLine)\n    for (let i = 0; i < last.length; ++i) {\n      let span = last[i]\n      if (span.to != null) span.to += offset\n      if (span.from == null) {\n        let found = getMarkedSpanFor(first, span.marker)\n        if (!found) {\n          span.from = offset\n          if (sameLine) (first || (first = [])).push(span)\n        }\n      } else {\n        span.from += offset\n        if (sameLine) (first || (first = [])).push(span)\n      }\n    }\n  }\n  // Make sure we didn't create any zero-length spans\n  if (first) first = clearEmptySpans(first)\n  if (last && last != first) last = clearEmptySpans(last)\n\n  let newMarkers = [first]\n  if (!sameLine) {\n    // Fill gap with whole-line-spans\n    let gap = change.text.length - 2, gapMarkers\n    if (gap > 0 && first)\n      for (let i = 0; i < first.length; ++i)\n        if (first[i].to == null)\n          (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null))\n    for (let i = 0; i < gap; ++i)\n      newMarkers.push(gapMarkers)\n    newMarkers.push(last)\n  }\n  return newMarkers\n}\n\n// Remove spans that are empty and don't have a clearWhenEmpty\n// option of false.\nfunction clearEmptySpans(spans) {\n  for (let i = 0; i < spans.length; ++i) {\n    let span = spans[i]\n    if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n      spans.splice(i--, 1)\n  }\n  if (!spans.length) return null\n  return spans\n}\n\n// Used to 'clip' out readOnly ranges when making a change.\nexport function removeReadOnlyRanges(doc, from, to) {\n  let markers = null\n  doc.iter(from.line, to.line + 1, line => {\n    if (line.markedSpans) for (let i = 0; i < line.markedSpans.length; ++i) {\n      let mark = line.markedSpans[i].marker\n      if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n        (markers || (markers = [])).push(mark)\n    }\n  })\n  if (!markers) return null\n  let parts = [{from: from, to: to}]\n  for (let i = 0; i < markers.length; ++i) {\n    let mk = markers[i], m = mk.find(0)\n    for (let j = 0; j < parts.length; ++j) {\n      let p = parts[j]\n      if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue\n      let newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to)\n      if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n        newParts.push({from: p.from, to: m.from})\n      if (dto > 0 || !mk.inclusiveRight && !dto)\n        newParts.push({from: m.to, to: p.to})\n      parts.splice.apply(parts, newParts)\n      j += newParts.length - 3\n    }\n  }\n  return parts\n}\n\n// Connect or disconnect spans from a line.\nexport function detachMarkedSpans(line) {\n  let spans = line.markedSpans\n  if (!spans) return\n  for (let i = 0; i < spans.length; ++i)\n    spans[i].marker.detachLine(line)\n  line.markedSpans = null\n}\nexport function attachMarkedSpans(line, spans) {\n  if (!spans) return\n  for (let i = 0; i < spans.length; ++i)\n    spans[i].marker.attachLine(line)\n  line.markedSpans = spans\n}\n\n// Helpers used when computing which overlapping collapsed span\n// counts as the larger one.\nfunction extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }\nfunction extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }\n\n// Returns a number indicating which of two overlapping collapsed\n// spans is larger (and thus includes the other). Falls back to\n// comparing ids when the spans cover exactly the same range.\nexport function compareCollapsedMarkers(a, b) {\n  let lenDiff = a.lines.length - b.lines.length\n  if (lenDiff != 0) return lenDiff\n  let aPos = a.find(), bPos = b.find()\n  let fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b)\n  if (fromCmp) return -fromCmp\n  let toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b)\n  if (toCmp) return toCmp\n  return b.id - a.id\n}\n\n// Find out whether a line ends or starts in a collapsed span. If\n// so, return the marker for that span.\nfunction collapsedSpanAtSide(line, start) {\n  let sps = sawCollapsedSpans && line.markedSpans, found\n  if (sps) for (let sp, i = 0; i < sps.length; ++i) {\n    sp = sps[i]\n    if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n        (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n      found = sp.marker\n  }\n  return found\n}\nexport function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }\nexport function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }\n\nexport function collapsedSpanAround(line, ch) {\n  let sps = sawCollapsedSpans && line.markedSpans, found\n  if (sps) for (let i = 0; i < sps.length; ++i) {\n    let sp = sps[i]\n    if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&\n        (!found || compareCollapsedMarkers(found, sp.marker) < 0)) found = sp.marker\n  }\n  return found\n}\n\n// Test whether there exists a collapsed span that partially\n// overlaps (covers the start or end, but not both) of a new span.\n// Such overlap is not allowed.\nexport function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n  let line = getLine(doc, lineNo)\n  let sps = sawCollapsedSpans && line.markedSpans\n  if (sps) for (let i = 0; i < sps.length; ++i) {\n    let sp = sps[i]\n    if (!sp.marker.collapsed) continue\n    let found = sp.marker.find(0)\n    let fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker)\n    let toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker)\n    if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue\n    if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||\n        fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))\n      return true\n  }\n}\n\n// A visual line is a line as drawn on the screen. Folding, for\n// example, can cause multiple logical lines to appear on the same\n// visual line. This finds the start of the visual line that the\n// given line is part of (usually that is the line itself).\nexport function visualLine(line) {\n  let merged\n  while (merged = collapsedSpanAtStart(line))\n    line = merged.find(-1, true).line\n  return line\n}\n\nexport function visualLineEnd(line) {\n  let merged\n  while (merged = collapsedSpanAtEnd(line))\n    line = merged.find(1, true).line\n  return line\n}\n\n// Returns an array of logical lines that continue the visual line\n// started by the argument, or undefined if there are no such lines.\nexport function visualLineContinued(line) {\n  let merged, lines\n  while (merged = collapsedSpanAtEnd(line)) {\n    line = merged.find(1, true).line\n    ;(lines || (lines = [])).push(line)\n  }\n  return lines\n}\n\n// Get the line number of the start of the visual line that the\n// given line number is part of.\nexport function visualLineNo(doc, lineN) {\n  let line = getLine(doc, lineN), vis = visualLine(line)\n  if (line == vis) return lineN\n  return lineNo(vis)\n}\n\n// Get the line number of the start of the next visual line after\n// the given line.\nexport function visualLineEndNo(doc, lineN) {\n  if (lineN > doc.lastLine()) return lineN\n  let line = getLine(doc, lineN), merged\n  if (!lineIsHidden(doc, line)) return lineN\n  while (merged = collapsedSpanAtEnd(line))\n    line = merged.find(1, true).line\n  return lineNo(line) + 1\n}\n\n// Compute whether a line is hidden. Lines count as hidden when they\n// are part of a visual line that starts with another line, or when\n// they are entirely covered by collapsed, non-widget span.\nexport function lineIsHidden(doc, line) {\n  let sps = sawCollapsedSpans && line.markedSpans\n  if (sps) for (let sp, i = 0; i < sps.length; ++i) {\n    sp = sps[i]\n    if (!sp.marker.collapsed) continue\n    if (sp.from == null) return true\n    if (sp.marker.widgetNode) continue\n    if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n      return true\n  }\n}\nfunction lineIsHiddenInner(doc, line, span) {\n  if (span.to == null) {\n    let end = span.marker.find(1, true)\n    return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))\n  }\n  if (span.marker.inclusiveRight && span.to == line.text.length)\n    return true\n  for (let sp, i = 0; i < line.markedSpans.length; ++i) {\n    sp = line.markedSpans[i]\n    if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n        (sp.to == null || sp.to != span.from) &&\n        (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n        lineIsHiddenInner(doc, line, sp)) return true\n  }\n}\n\n// Find the height above the given line.\nexport function heightAtLine(lineObj) {\n  lineObj = visualLine(lineObj)\n\n  let h = 0, chunk = lineObj.parent\n  for (let i = 0; i < chunk.lines.length; ++i) {\n    let line = chunk.lines[i]\n    if (line == lineObj) break\n    else h += line.height\n  }\n  for (let p = chunk.parent; p; chunk = p, p = chunk.parent) {\n    for (let i = 0; i < p.children.length; ++i) {\n      let cur = p.children[i]\n      if (cur == chunk) break\n      else h += cur.height\n    }\n  }\n  return h\n}\n\n// Compute the character length of a line, taking into account\n// collapsed ranges (see markText) that might hide parts, and join\n// other lines onto it.\nexport function lineLength(line) {\n  if (line.height == 0) return 0\n  let len = line.text.length, merged, cur = line\n  while (merged = collapsedSpanAtStart(cur)) {\n    let found = merged.find(0, true)\n    cur = found.from.line\n    len += found.from.ch - found.to.ch\n  }\n  cur = line\n  while (merged = collapsedSpanAtEnd(cur)) {\n    let found = merged.find(0, true)\n    len -= cur.text.length - found.from.ch\n    cur = found.to.line\n    len += cur.text.length - found.to.ch\n  }\n  return len\n}\n\n// Find the longest line in the document.\nexport function findMaxLine(cm) {\n  let d = cm.display, doc = cm.doc\n  d.maxLine = getLine(doc, doc.first)\n  d.maxLineLength = lineLength(d.maxLine)\n  d.maxLineChanged = true\n  doc.iter(line => {\n    let len = lineLength(line)\n    if (len > d.maxLineLength) {\n      d.maxLineLength = len\n      d.maxLine = line\n    }\n  })\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/line/utils_line.js",
    "content": "import { indexOf } from \"../util/misc.js\"\n\n// Find the line object corresponding to the given line number.\nexport function getLine(doc, n) {\n  n -= doc.first\n  if (n < 0 || n >= doc.size) throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\")\n  let chunk = doc\n  while (!chunk.lines) {\n    for (let i = 0;; ++i) {\n      let child = chunk.children[i], sz = child.chunkSize()\n      if (n < sz) { chunk = child; break }\n      n -= sz\n    }\n  }\n  return chunk.lines[n]\n}\n\n// Get the part of a document between two positions, as an array of\n// strings.\nexport function getBetween(doc, start, end) {\n  let out = [], n = start.line\n  doc.iter(start.line, end.line + 1, line => {\n    let text = line.text\n    if (n == end.line) text = text.slice(0, end.ch)\n    if (n == start.line) text = text.slice(start.ch)\n    out.push(text)\n    ++n\n  })\n  return out\n}\n// Get the lines between from and to, as array of strings.\nexport function getLines(doc, from, to) {\n  let out = []\n  doc.iter(from, to, line => { out.push(line.text) }) // iter aborts when callback returns truthy value\n  return out\n}\n\n// Update the height of a line, propagating the height change\n// upwards to parent nodes.\nexport function updateLineHeight(line, height) {\n  let diff = height - line.height\n  if (diff) for (let n = line; n; n = n.parent) n.height += diff\n}\n\n// Given a line object, find its line number by walking up through\n// its parent links.\nexport function lineNo(line) {\n  if (line.parent == null) return null\n  let cur = line.parent, no = indexOf(cur.lines, line)\n  for (let chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n    for (let i = 0;; ++i) {\n      if (chunk.children[i] == cur) break\n      no += chunk.children[i].chunkSize()\n    }\n  }\n  return no + cur.first\n}\n\n// Find the line at the given vertical position, using the height\n// information in the document tree.\nexport function lineAtHeight(chunk, h) {\n  let n = chunk.first\n  outer: do {\n    for (let i = 0; i < chunk.children.length; ++i) {\n      let child = chunk.children[i], ch = child.height\n      if (h < ch) { chunk = child; continue outer }\n      h -= ch\n      n += child.chunkSize()\n    }\n    return n\n  } while (!chunk.lines)\n  let i = 0\n  for (; i < chunk.lines.length; ++i) {\n    let line = chunk.lines[i], lh = line.height\n    if (h < lh) break\n    h -= lh\n  }\n  return n + i\n}\n\nexport function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}\n\nexport function lineNumberFor(options, i) {\n  return String(options.lineNumberFormatter(i + options.firstLineNumber))\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/measurement/position_measurement.js",
    "content": "import { buildLineContent, LineView } from \"../line/line_data.js\"\nimport { clipPos, Pos } from \"../line/pos.js\"\nimport { collapsedSpanAround, heightAtLine, lineIsHidden, visualLine } from \"../line/spans.js\"\nimport { getLine, lineAtHeight, lineNo, updateLineHeight } from \"../line/utils_line.js\"\nimport { bidiOther, getBidiPartAt, getOrder } from \"../util/bidi.js\"\nimport { chrome, android, ie, ie_version } from \"../util/browser.js\"\nimport { elt, removeChildren, range, removeChildrenAndAdd } from \"../util/dom.js\"\nimport { e_target } from \"../util/event.js\"\nimport { hasBadZoomedRects } from \"../util/feature_detection.js\"\nimport { countColumn, findFirst, isExtendingChar, scrollerGap, skipExtendingChars } from \"../util/misc.js\"\nimport { updateLineForChanges } from \"../display/update_line.js\"\n\nimport { widgetHeight } from \"./widgets.js\"\n\n// POSITION MEASUREMENT\n\nexport function paddingTop(display) {return display.lineSpace.offsetTop}\nexport function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}\nexport function paddingH(display) {\n  if (display.cachedPaddingH) return display.cachedPaddingH\n  let e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\", \"CodeMirror-line-like\"))\n  let style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle\n  let data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}\n  if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data\n  return data\n}\n\nexport function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }\nexport function displayWidth(cm) {\n  return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth\n}\nexport function displayHeight(cm) {\n  return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight\n}\n\n// Ensure the lineView.wrapping.heights array is populated. This is\n// an array of bottom offsets for the lines that make up a drawn\n// line. When lineWrapping is on, there might be more than one\n// height.\nfunction ensureLineHeights(cm, lineView, rect) {\n  let wrapping = cm.options.lineWrapping\n  let curWidth = wrapping && displayWidth(cm)\n  if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n    let heights = lineView.measure.heights = []\n    if (wrapping) {\n      lineView.measure.width = curWidth\n      let rects = lineView.text.firstChild.getClientRects()\n      for (let i = 0; i < rects.length - 1; i++) {\n        let cur = rects[i], next = rects[i + 1]\n        if (Math.abs(cur.bottom - next.bottom) > 2)\n          heights.push((cur.bottom + next.top) / 2 - rect.top)\n      }\n    }\n    heights.push(rect.bottom - rect.top)\n  }\n}\n\n// Find a line map (mapping character offsets to text nodes) and a\n// measurement cache for the given line number. (A line view might\n// contain multiple lines when collapsed ranges are present.)\nexport function mapFromLineView(lineView, line, lineN) {\n  if (lineView.line == line)\n    return {map: lineView.measure.map, cache: lineView.measure.cache}\n  if (lineView.rest) {\n    for (let i = 0; i < lineView.rest.length; i++)\n      if (lineView.rest[i] == line)\n        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]}\n    for (let i = 0; i < lineView.rest.length; i++)\n      if (lineNo(lineView.rest[i]) > lineN)\n        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true}\n  }\n}\n\n// Render a line into the hidden node display.externalMeasured. Used\n// when measurement is needed for a line that's not in the viewport.\nfunction updateExternalMeasurement(cm, line) {\n  line = visualLine(line)\n  let lineN = lineNo(line)\n  let view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN)\n  view.lineN = lineN\n  let built = view.built = buildLineContent(cm, view)\n  view.text = built.pre\n  removeChildrenAndAdd(cm.display.lineMeasure, built.pre)\n  return view\n}\n\n// Get a {top, bottom, left, right} box (in line-local coordinates)\n// for a given character.\nexport function measureChar(cm, line, ch, bias) {\n  return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)\n}\n\n// Find a line view that corresponds to the given line number.\nexport function findViewForLine(cm, lineN) {\n  if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n    return cm.display.view[findViewIndex(cm, lineN)]\n  let ext = cm.display.externalMeasured\n  if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n    return ext\n}\n\n// Measurement can be split in two steps, the set-up work that\n// applies to the whole line, and the measurement of the actual\n// character. Functions like coordsChar, that need to do a lot of\n// measurements in a row, can thus ensure that the set-up work is\n// only done once.\nexport function prepareMeasureForLine(cm, line) {\n  let lineN = lineNo(line)\n  let view = findViewForLine(cm, lineN)\n  if (view && !view.text) {\n    view = null\n  } else if (view && view.changes) {\n    updateLineForChanges(cm, view, lineN, getDimensions(cm))\n    cm.curOp.forceUpdate = true\n  }\n  if (!view)\n    view = updateExternalMeasurement(cm, line)\n\n  let info = mapFromLineView(view, line, lineN)\n  return {\n    line: line, view: view, rect: null,\n    map: info.map, cache: info.cache, before: info.before,\n    hasHeights: false\n  }\n}\n\n// Given a prepared measurement object, measures the position of an\n// actual character (or fetches it from the cache).\nexport function measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n  if (prepared.before) ch = -1\n  let key = ch + (bias || \"\"), found\n  if (prepared.cache.hasOwnProperty(key)) {\n    found = prepared.cache[key]\n  } else {\n    if (!prepared.rect)\n      prepared.rect = prepared.view.text.getBoundingClientRect()\n    if (!prepared.hasHeights) {\n      ensureLineHeights(cm, prepared.view, prepared.rect)\n      prepared.hasHeights = true\n    }\n    found = measureCharInner(cm, prepared, ch, bias)\n    if (!found.bogus) prepared.cache[key] = found\n  }\n  return {left: found.left, right: found.right,\n          top: varHeight ? found.rtop : found.top,\n          bottom: varHeight ? found.rbottom : found.bottom}\n}\n\nlet nullRect = {left: 0, right: 0, top: 0, bottom: 0}\n\nexport function nodeAndOffsetInLineMap(map, ch, bias) {\n  let node, start, end, collapse, mStart, mEnd\n  // First, search the line map for the text node corresponding to,\n  // or closest to, the target character.\n  for (let i = 0; i < map.length; i += 3) {\n    mStart = map[i]\n    mEnd = map[i + 1]\n    if (ch < mStart) {\n      start = 0; end = 1\n      collapse = \"left\"\n    } else if (ch < mEnd) {\n      start = ch - mStart\n      end = start + 1\n    } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n      end = mEnd - mStart\n      start = end - 1\n      if (ch >= mEnd) collapse = \"right\"\n    }\n    if (start != null) {\n      node = map[i + 2]\n      if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n        collapse = bias\n      if (bias == \"left\" && start == 0)\n        while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n          node = map[(i -= 3) + 2]\n          collapse = \"left\"\n        }\n      if (bias == \"right\" && start == mEnd - mStart)\n        while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n          node = map[(i += 3) + 2]\n          collapse = \"right\"\n        }\n      break\n    }\n  }\n  return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}\n}\n\nfunction getUsefulRect(rects, bias) {\n  let rect = nullRect\n  if (bias == \"left\") for (let i = 0; i < rects.length; i++) {\n    if ((rect = rects[i]).left != rect.right) break\n  } else for (let i = rects.length - 1; i >= 0; i--) {\n    if ((rect = rects[i]).left != rect.right) break\n  }\n  return rect\n}\n\nfunction measureCharInner(cm, prepared, ch, bias) {\n  let place = nodeAndOffsetInLineMap(prepared.map, ch, bias)\n  let node = place.node, start = place.start, end = place.end, collapse = place.collapse\n\n  let rect\n  if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n    for (let i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n      while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start\n      while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end\n      if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)\n        rect = node.parentNode.getBoundingClientRect()\n      else\n        rect = getUsefulRect(range(node, start, end).getClientRects(), bias)\n      if (rect.left || rect.right || start == 0) break\n      end = start\n      start = start - 1\n      collapse = \"right\"\n    }\n    if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect)\n  } else { // If it is a widget, simply get the box for the whole widget.\n    if (start > 0) collapse = bias = \"right\"\n    let rects\n    if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n      rect = rects[bias == \"right\" ? rects.length - 1 : 0]\n    else\n      rect = node.getBoundingClientRect()\n  }\n  if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n    let rSpan = node.parentNode.getClientRects()[0]\n    if (rSpan)\n      rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}\n    else\n      rect = nullRect\n  }\n\n  let rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top\n  let mid = (rtop + rbot) / 2\n  let heights = prepared.view.measure.heights\n  let i = 0\n  for (; i < heights.length - 1; i++)\n    if (mid < heights[i]) break\n  let top = i ? heights[i - 1] : 0, bot = heights[i]\n  let result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n                right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n                top: top, bottom: bot}\n  if (!rect.left && !rect.right) result.bogus = true\n  if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot }\n\n  return result\n}\n\n// Work around problem with bounding client rects on ranges being\n// returned incorrectly when zoomed on IE10 and below.\nfunction maybeUpdateRectForZooming(measure, rect) {\n  if (!window.screen || screen.logicalXDPI == null ||\n      screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n    return rect\n  let scaleX = screen.logicalXDPI / screen.deviceXDPI\n  let scaleY = screen.logicalYDPI / screen.deviceYDPI\n  return {left: rect.left * scaleX, right: rect.right * scaleX,\n          top: rect.top * scaleY, bottom: rect.bottom * scaleY}\n}\n\nexport function clearLineMeasurementCacheFor(lineView) {\n  if (lineView.measure) {\n    lineView.measure.cache = {}\n    lineView.measure.heights = null\n    if (lineView.rest) for (let i = 0; i < lineView.rest.length; i++)\n      lineView.measure.caches[i] = {}\n  }\n}\n\nexport function clearLineMeasurementCache(cm) {\n  cm.display.externalMeasure = null\n  removeChildren(cm.display.lineMeasure)\n  for (let i = 0; i < cm.display.view.length; i++)\n    clearLineMeasurementCacheFor(cm.display.view[i])\n}\n\nexport function clearCaches(cm) {\n  clearLineMeasurementCache(cm)\n  cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null\n  if (!cm.options.lineWrapping) cm.display.maxLineChanged = true\n  cm.display.lineNumChars = null\n}\n\nfunction pageScrollX() {\n  // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206\n  // which causes page_Offset and bounding client rects to use\n  // different reference viewports and invalidate our calculations.\n  if (chrome && android) return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft))\n  return window.pageXOffset || (document.documentElement || document.body).scrollLeft\n}\nfunction pageScrollY() {\n  if (chrome && android) return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop))\n  return window.pageYOffset || (document.documentElement || document.body).scrollTop\n}\n\nfunction widgetTopHeight(lineObj) {\n  let {widgets} = visualLine(lineObj), height = 0\n  if (widgets) for (let i = 0; i < widgets.length; ++i) if (widgets[i].above)\n    height += widgetHeight(widgets[i])\n  return height\n}\n\n// Converts a {top, bottom, left, right} box from line-local\n// coordinates into another coordinate system. Context may be one of\n// \"line\", \"div\" (display.lineDiv), \"local\"./null (editor), \"window\",\n// or \"page\".\nexport function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {\n  if (!includeWidgets) {\n    let height = widgetTopHeight(lineObj)\n    rect.top += height; rect.bottom += height\n  }\n  if (context == \"line\") return rect\n  if (!context) context = \"local\"\n  let yOff = heightAtLine(lineObj)\n  if (context == \"local\") yOff += paddingTop(cm.display)\n  else yOff -= cm.display.viewOffset\n  if (context == \"page\" || context == \"window\") {\n    let lOff = cm.display.lineSpace.getBoundingClientRect()\n    yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY())\n    let xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX())\n    rect.left += xOff; rect.right += xOff\n  }\n  rect.top += yOff; rect.bottom += yOff\n  return rect\n}\n\n// Coverts a box from \"div\" coords to another coordinate system.\n// Context may be \"window\", \"page\", \"div\", or \"local\"./null.\nexport function fromCoordSystem(cm, coords, context) {\n  if (context == \"div\") return coords\n  let left = coords.left, top = coords.top\n  // First move into \"page\" coordinate system\n  if (context == \"page\") {\n    left -= pageScrollX()\n    top -= pageScrollY()\n  } else if (context == \"local\" || !context) {\n    let localBox = cm.display.sizer.getBoundingClientRect()\n    left += localBox.left\n    top += localBox.top\n  }\n\n  let lineSpaceBox = cm.display.lineSpace.getBoundingClientRect()\n  return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}\n}\n\nexport function charCoords(cm, pos, context, lineObj, bias) {\n  if (!lineObj) lineObj = getLine(cm.doc, pos.line)\n  return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)\n}\n\n// Returns a box for a given cursor position, which may have an\n// 'other' property containing the position of the secondary cursor\n// on a bidi boundary.\n// A cursor Pos(line, char, \"before\") is on the same visual line as `char - 1`\n// and after `char - 1` in writing order of `char - 1`\n// A cursor Pos(line, char, \"after\") is on the same visual line as `char`\n// and before `char` in writing order of `char`\n// Examples (upper-case letters are RTL, lower-case are LTR):\n//     Pos(0, 1, ...)\n//     before   after\n// ab     a|b     a|b\n// aB     a|B     aB|\n// Ab     |Ab     A|b\n// AB     B|A     B|A\n// Every position after the last character on a line is considered to stick\n// to the last character on the line.\nexport function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n  lineObj = lineObj || getLine(cm.doc, pos.line)\n  if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj)\n  function get(ch, right) {\n    let m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight)\n    if (right) m.left = m.right; else m.right = m.left\n    return intoCoordSystem(cm, lineObj, m, context)\n  }\n  let order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky\n  if (ch >= lineObj.text.length) {\n    ch = lineObj.text.length\n    sticky = \"before\"\n  } else if (ch <= 0) {\n    ch = 0\n    sticky = \"after\"\n  }\n  if (!order) return get(sticky == \"before\" ? ch - 1 : ch, sticky == \"before\")\n\n  function getBidi(ch, partPos, invert) {\n    let part = order[partPos], right = part.level == 1\n    return get(invert ? ch - 1 : ch, right != invert)\n  }\n  let partPos = getBidiPartAt(order, ch, sticky)\n  let other = bidiOther\n  let val = getBidi(ch, partPos, sticky == \"before\")\n  if (other != null) val.other = getBidi(ch, other, sticky != \"before\")\n  return val\n}\n\n// Used to cheaply estimate the coordinates for a position. Used for\n// intermediate scroll updates.\nexport function estimateCoords(cm, pos) {\n  let left = 0\n  pos = clipPos(cm.doc, pos)\n  if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch\n  let lineObj = getLine(cm.doc, pos.line)\n  let top = heightAtLine(lineObj) + paddingTop(cm.display)\n  return {left: left, right: left, top: top, bottom: top + lineObj.height}\n}\n\n// Positions returned by coordsChar contain some extra information.\n// xRel is the relative x position of the input coordinates compared\n// to the found position (so xRel > 0 means the coordinates are to\n// the right of the character position, for example). When outside\n// is true, that means the coordinates lie outside the line's\n// vertical range.\nfunction PosWithInfo(line, ch, sticky, outside, xRel) {\n  let pos = Pos(line, ch, sticky)\n  pos.xRel = xRel\n  if (outside) pos.outside = outside\n  return pos\n}\n\n// Compute the character position closest to the given coordinates.\n// Input must be lineSpace-local (\"div\" coordinate system).\nexport function coordsChar(cm, x, y) {\n  let doc = cm.doc\n  y += cm.display.viewOffset\n  if (y < 0) return PosWithInfo(doc.first, 0, null, -1, -1)\n  let lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1\n  if (lineN > last)\n    return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1)\n  if (x < 0) x = 0\n\n  let lineObj = getLine(doc, lineN)\n  for (;;) {\n    let found = coordsCharInner(cm, lineObj, lineN, x, y)\n    let collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0))\n    if (!collapsed) return found\n    let rangeEnd = collapsed.find(1)\n    if (rangeEnd.line == lineN) return rangeEnd\n    lineObj = getLine(doc, lineN = rangeEnd.line)\n  }\n}\n\nfunction wrappedLineExtent(cm, lineObj, preparedMeasure, y) {\n  y -= widgetTopHeight(lineObj)\n  let end = lineObj.text.length\n  let begin = findFirst(ch => measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y, end, 0)\n  end = findFirst(ch => measureCharPrepared(cm, preparedMeasure, ch).top > y, begin, end)\n  return {begin, end}\n}\n\nexport function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {\n  if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj)\n  let targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), \"line\").top\n  return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)\n}\n\n// Returns true if the given side of a box is after the given\n// coordinates, in top-to-bottom, left-to-right order.\nfunction boxIsAfter(box, x, y, left) {\n  return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x\n}\n\nfunction coordsCharInner(cm, lineObj, lineNo, x, y) {\n  // Move y into line-local coordinate space\n  y -= heightAtLine(lineObj)\n  let preparedMeasure = prepareMeasureForLine(cm, lineObj)\n  // When directly calling `measureCharPrepared`, we have to adjust\n  // for the widgets at this line.\n  let widgetHeight = widgetTopHeight(lineObj)\n  let begin = 0, end = lineObj.text.length, ltr = true\n\n  let order = getOrder(lineObj, cm.doc.direction)\n  // If the line isn't plain left-to-right text, first figure out\n  // which bidi section the coordinates fall into.\n  if (order) {\n    let part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)\n                 (cm, lineObj, lineNo, preparedMeasure, order, x, y)\n    ltr = part.level != 1\n    // The awkward -1 offsets are needed because findFirst (called\n    // on these below) will treat its first bound as inclusive,\n    // second as exclusive, but we want to actually address the\n    // characters in the part's range\n    begin = ltr ? part.from : part.to - 1\n    end = ltr ? part.to : part.from - 1\n  }\n\n  // A binary search to find the first character whose bounding box\n  // starts after the coordinates. If we run across any whose box wrap\n  // the coordinates, store that.\n  let chAround = null, boxAround = null\n  let ch = findFirst(ch => {\n    let box = measureCharPrepared(cm, preparedMeasure, ch)\n    box.top += widgetHeight; box.bottom += widgetHeight\n    if (!boxIsAfter(box, x, y, false)) return false\n    if (box.top <= y && box.left <= x) {\n      chAround = ch\n      boxAround = box\n    }\n    return true\n  }, begin, end)\n\n  let baseX, sticky, outside = false\n  // If a box around the coordinates was found, use that\n  if (boxAround) {\n    // Distinguish coordinates nearer to the left or right side of the box\n    let atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr\n    ch = chAround + (atStart ? 0 : 1)\n    sticky = atStart ? \"after\" : \"before\"\n    baseX = atLeft ? boxAround.left : boxAround.right\n  } else {\n    // (Adjust for extended bound, if necessary.)\n    if (!ltr && (ch == end || ch == begin)) ch++\n    // To determine which side to associate with, get the box to the\n    // left of the character and compare it's vertical position to the\n    // coordinates\n    sticky = ch == 0 ? \"after\" : ch == lineObj.text.length ? \"before\" :\n      (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?\n      \"after\" : \"before\"\n    // Now get accurate coordinates for this place, in order to get a\n    // base X position\n    let coords = cursorCoords(cm, Pos(lineNo, ch, sticky), \"line\", lineObj, preparedMeasure)\n    baseX = coords.left\n    outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0\n  }\n\n  ch = skipExtendingChars(lineObj.text, ch, 1)\n  return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)\n}\n\nfunction coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {\n  // Bidi parts are sorted left-to-right, and in a non-line-wrapping\n  // situation, we can take this ordering to correspond to the visual\n  // ordering. This finds the first part whose end is after the given\n  // coordinates.\n  let index = findFirst(i => {\n    let part = order[i], ltr = part.level != 1\n    return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? \"before\" : \"after\"),\n                                   \"line\", lineObj, preparedMeasure), x, y, true)\n  }, 0, order.length - 1)\n  let part = order[index]\n  // If this isn't the first part, the part's start is also after\n  // the coordinates, and the coordinates aren't on the same line as\n  // that start, move one part back.\n  if (index > 0) {\n    let ltr = part.level != 1\n    let start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? \"after\" : \"before\"),\n                             \"line\", lineObj, preparedMeasure)\n    if (boxIsAfter(start, x, y, true) && start.top > y)\n      part = order[index - 1]\n  }\n  return part\n}\n\nfunction coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {\n  // In a wrapped line, rtl text on wrapping boundaries can do things\n  // that don't correspond to the ordering in our `order` array at\n  // all, so a binary search doesn't work, and we want to return a\n  // part that only spans one line so that the binary search in\n  // coordsCharInner is safe. As such, we first find the extent of the\n  // wrapped line, and then do a flat search in which we discard any\n  // spans that aren't on the line.\n  let {begin, end} = wrappedLineExtent(cm, lineObj, preparedMeasure, y)\n  if (/\\s/.test(lineObj.text.charAt(end - 1))) end--\n  let part = null, closestDist = null\n  for (let i = 0; i < order.length; i++) {\n    let p = order[i]\n    if (p.from >= end || p.to <= begin) continue\n    let ltr = p.level != 1\n    let endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right\n    // Weigh against spans ending before this, so that they are only\n    // picked if nothing ends after\n    let dist = endX < x ? x - endX + 1e9 : endX - x\n    if (!part || closestDist > dist) {\n      part = p\n      closestDist = dist\n    }\n  }\n  if (!part) part = order[order.length - 1]\n  // Clip the part to the wrapped line.\n  if (part.from < begin) part = {from: begin, to: part.to, level: part.level}\n  if (part.to > end) part = {from: part.from, to: end, level: part.level}\n  return part\n}\n\nlet measureText\n// Compute the default text height.\nexport function textHeight(display) {\n  if (display.cachedTextHeight != null) return display.cachedTextHeight\n  if (measureText == null) {\n    measureText = elt(\"pre\", null, \"CodeMirror-line-like\")\n    // Measure a bunch of lines, for browsers that compute\n    // fractional heights.\n    for (let i = 0; i < 49; ++i) {\n      measureText.appendChild(document.createTextNode(\"x\"))\n      measureText.appendChild(elt(\"br\"))\n    }\n    measureText.appendChild(document.createTextNode(\"x\"))\n  }\n  removeChildrenAndAdd(display.measure, measureText)\n  let height = measureText.offsetHeight / 50\n  if (height > 3) display.cachedTextHeight = height\n  removeChildren(display.measure)\n  return height || 1\n}\n\n// Compute the default character width.\nexport function charWidth(display) {\n  if (display.cachedCharWidth != null) return display.cachedCharWidth\n  let anchor = elt(\"span\", \"xxxxxxxxxx\")\n  let pre = elt(\"pre\", [anchor], \"CodeMirror-line-like\")\n  removeChildrenAndAdd(display.measure, pre)\n  let rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10\n  if (width > 2) display.cachedCharWidth = width\n  return width || 10\n}\n\n// Do a bulk-read of the DOM positions and sizes needed to draw the\n// view, so that we don't interleave reading and writing to the DOM.\nexport function getDimensions(cm) {\n  let d = cm.display, left = {}, width = {}\n  let gutterLeft = d.gutters.clientLeft\n  for (let n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n    let id = cm.display.gutterSpecs[i].className\n    left[id] = n.offsetLeft + n.clientLeft + gutterLeft\n    width[id] = n.clientWidth\n  }\n  return {fixedPos: compensateForHScroll(d),\n          gutterTotalWidth: d.gutters.offsetWidth,\n          gutterLeft: left,\n          gutterWidth: width,\n          wrapperWidth: d.wrapper.clientWidth}\n}\n\n// Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n// but using getBoundingClientRect to get a sub-pixel-accurate\n// result.\nexport function compensateForHScroll(display) {\n  return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left\n}\n\n// Returns a function that estimates the height of a line, to use as\n// first approximation until the line becomes visible (and is thus\n// properly measurable).\nexport function estimateHeight(cm) {\n  let th = textHeight(cm.display), wrapping = cm.options.lineWrapping\n  let perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3)\n  return line => {\n    if (lineIsHidden(cm.doc, line)) return 0\n\n    let widgetsHeight = 0\n    if (line.widgets) for (let i = 0; i < line.widgets.length; i++) {\n      if (line.widgets[i].height) widgetsHeight += line.widgets[i].height\n    }\n\n    if (wrapping)\n      return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th\n    else\n      return widgetsHeight + th\n  }\n}\n\nexport function estimateLineHeights(cm) {\n  let doc = cm.doc, est = estimateHeight(cm)\n  doc.iter(line => {\n    let estHeight = est(line)\n    if (estHeight != line.height) updateLineHeight(line, estHeight)\n  })\n}\n\n// Given a mouse event, find the corresponding position. If liberal\n// is false, it checks whether a gutter or scrollbar was clicked,\n// and returns null if it was. forRect is used by rectangular\n// selections, and tries to estimate a character position even for\n// coordinates beyond the right of the text.\nexport function posFromMouse(cm, e, liberal, forRect) {\n  let display = cm.display\n  if (!liberal && e_target(e).getAttribute(\"cm-not-content\") == \"true\") return null\n\n  let x, y, space = display.lineSpace.getBoundingClientRect()\n  // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n  try { x = e.clientX - space.left; y = e.clientY - space.top }\n  catch (e) { return null }\n  let coords = coordsChar(cm, x, y), line\n  if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n    let colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length\n    coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff))\n  }\n  return coords\n}\n\n// Find the view element corresponding to a given line. Return null\n// when the line isn't visible.\nexport function findViewIndex(cm, n) {\n  if (n >= cm.display.viewTo) return null\n  n -= cm.display.viewFrom\n  if (n < 0) return null\n  let view = cm.display.view\n  for (let i = 0; i < view.length; i++) {\n    n -= view[i].size\n    if (n < 0) return i\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/measurement/widgets.js",
    "content": "import { contains, elt, removeChildrenAndAdd } from \"../util/dom.js\"\nimport { e_target } from \"../util/event.js\"\n\nexport function widgetHeight(widget) {\n  if (widget.height != null) return widget.height\n  let cm = widget.doc.cm\n  if (!cm) return 0\n  if (!contains(document.body, widget.node)) {\n    let parentStyle = \"position: relative;\"\n    if (widget.coverGutter)\n      parentStyle += \"margin-left: -\" + cm.display.gutters.offsetWidth + \"px;\"\n    if (widget.noHScroll)\n      parentStyle += \"width: \" + cm.display.wrapper.clientWidth + \"px;\"\n    removeChildrenAndAdd(cm.display.measure, elt(\"div\", [widget.node], null, parentStyle))\n  }\n  return widget.height = widget.node.parentNode.offsetHeight\n}\n\n// Return true when the given mouse event happened in a widget\nexport function eventInWidget(display, e) {\n  for (let n = e_target(e); n != display.wrapper; n = n.parentNode) {\n    if (!n || (n.nodeType == 1 && n.getAttribute(\"cm-ignore-events\") == \"true\") ||\n        (n.parentNode == display.sizer && n != display.mover))\n      return true\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/model/Doc.js",
    "content": "import CodeMirror from \"../edit/CodeMirror.js\"\nimport { docMethodOp } from \"../display/operations.js\"\nimport { Line } from \"../line/line_data.js\"\nimport { clipPos, clipPosArray, Pos } from \"../line/pos.js\"\nimport { visualLine } from \"../line/spans.js\"\nimport { getBetween, getLine, getLines, isLine, lineNo } from \"../line/utils_line.js\"\nimport { classTest } from \"../util/dom.js\"\nimport { splitLinesAuto } from \"../util/feature_detection.js\"\nimport { createObj, map, isEmpty, sel_dontScroll } from \"../util/misc.js\"\nimport { ensureCursorVisible, scrollToCoords } from \"../display/scrolling.js\"\n\nimport { changeLine, makeChange, makeChangeFromHistory, replaceRange } from \"./changes.js\"\nimport { computeReplacedSel } from \"./change_measurement.js\"\nimport { BranchChunk, LeafChunk } from \"./chunk.js\"\nimport { directionChanged, linkedDocs, updateDoc } from \"./document_data.js\"\nimport { copyHistoryArray, History } from \"./history.js\"\nimport { addLineWidget } from \"./line_widget.js\"\nimport { copySharedMarkers, detachSharedMarkers, findSharedMarkers, markText } from \"./mark_text.js\"\nimport { normalizeSelection, Range, simpleSelection } from \"./selection.js\"\nimport { extendSelection, extendSelections, setSelection, setSelectionReplaceHistory, setSimpleSelection } from \"./selection_updates.js\"\n\nlet nextDocId = 0\nlet Doc = function(text, mode, firstLine, lineSep, direction) {\n  if (!(this instanceof Doc)) return new Doc(text, mode, firstLine, lineSep, direction)\n  if (firstLine == null) firstLine = 0\n\n  BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])])\n  this.first = firstLine\n  this.scrollTop = this.scrollLeft = 0\n  this.cantEdit = false\n  this.cleanGeneration = 1\n  this.modeFrontier = this.highlightFrontier = firstLine\n  let start = Pos(firstLine, 0)\n  this.sel = simpleSelection(start)\n  this.history = new History(null)\n  this.id = ++nextDocId\n  this.modeOption = mode\n  this.lineSep = lineSep\n  this.direction = (direction == \"rtl\") ? \"rtl\" : \"ltr\"\n  this.extend = false\n\n  if (typeof text == \"string\") text = this.splitLines(text)\n  updateDoc(this, {from: start, to: start, text: text})\n  setSelection(this, simpleSelection(start), sel_dontScroll)\n}\n\nDoc.prototype = createObj(BranchChunk.prototype, {\n  constructor: Doc,\n  // Iterate over the document. Supports two forms -- with only one\n  // argument, it calls that for each line in the document. With\n  // three, it iterates over the range given by the first two (with\n  // the second being non-inclusive).\n  iter: function(from, to, op) {\n    if (op) this.iterN(from - this.first, to - from, op)\n    else this.iterN(this.first, this.first + this.size, from)\n  },\n\n  // Non-public interface for adding and removing lines.\n  insert: function(at, lines) {\n    let height = 0\n    for (let i = 0; i < lines.length; ++i) height += lines[i].height\n    this.insertInner(at - this.first, lines, height)\n  },\n  remove: function(at, n) { this.removeInner(at - this.first, n) },\n\n  // From here, the methods are part of the public interface. Most\n  // are also available from CodeMirror (editor) instances.\n\n  getValue: function(lineSep) {\n    let lines = getLines(this, this.first, this.first + this.size)\n    if (lineSep === false) return lines\n    return lines.join(lineSep || this.lineSeparator())\n  },\n  setValue: docMethodOp(function(code) {\n    let top = Pos(this.first, 0), last = this.first + this.size - 1\n    makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n                      text: this.splitLines(code), origin: \"setValue\", full: true}, true)\n    if (this.cm) scrollToCoords(this.cm, 0, 0)\n    setSelection(this, simpleSelection(top), sel_dontScroll)\n  }),\n  replaceRange: function(code, from, to, origin) {\n    from = clipPos(this, from)\n    to = to ? clipPos(this, to) : from\n    replaceRange(this, code, from, to, origin)\n  },\n  getRange: function(from, to, lineSep) {\n    let lines = getBetween(this, clipPos(this, from), clipPos(this, to))\n    if (lineSep === false) return lines\n    if (lineSep === '') return lines.join('')\n    return lines.join(lineSep || this.lineSeparator())\n  },\n\n  getLine: function(line) {let l = this.getLineHandle(line); return l && l.text},\n\n  getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line)},\n  getLineNumber: function(line) {return lineNo(line)},\n\n  getLineHandleVisualStart: function(line) {\n    if (typeof line == \"number\") line = getLine(this, line)\n    return visualLine(line)\n  },\n\n  lineCount: function() {return this.size},\n  firstLine: function() {return this.first},\n  lastLine: function() {return this.first + this.size - 1},\n\n  clipPos: function(pos) {return clipPos(this, pos)},\n\n  getCursor: function(start) {\n    let range = this.sel.primary(), pos\n    if (start == null || start == \"head\") pos = range.head\n    else if (start == \"anchor\") pos = range.anchor\n    else if (start == \"end\" || start == \"to\" || start === false) pos = range.to()\n    else pos = range.from()\n    return pos\n  },\n  listSelections: function() { return this.sel.ranges },\n  somethingSelected: function() {return this.sel.somethingSelected()},\n\n  setCursor: docMethodOp(function(line, ch, options) {\n    setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options)\n  }),\n  setSelection: docMethodOp(function(anchor, head, options) {\n    setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options)\n  }),\n  extendSelection: docMethodOp(function(head, other, options) {\n    extendSelection(this, clipPos(this, head), other && clipPos(this, other), options)\n  }),\n  extendSelections: docMethodOp(function(heads, options) {\n    extendSelections(this, clipPosArray(this, heads), options)\n  }),\n  extendSelectionsBy: docMethodOp(function(f, options) {\n    let heads = map(this.sel.ranges, f)\n    extendSelections(this, clipPosArray(this, heads), options)\n  }),\n  setSelections: docMethodOp(function(ranges, primary, options) {\n    if (!ranges.length) return\n    let out = []\n    for (let i = 0; i < ranges.length; i++)\n      out[i] = new Range(clipPos(this, ranges[i].anchor),\n                         clipPos(this, ranges[i].head || ranges[i].anchor))\n    if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex)\n    setSelection(this, normalizeSelection(this.cm, out, primary), options)\n  }),\n  addSelection: docMethodOp(function(anchor, head, options) {\n    let ranges = this.sel.ranges.slice(0)\n    ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)))\n    setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options)\n  }),\n\n  getSelection: function(lineSep) {\n    let ranges = this.sel.ranges, lines\n    for (let i = 0; i < ranges.length; i++) {\n      let sel = getBetween(this, ranges[i].from(), ranges[i].to())\n      lines = lines ? lines.concat(sel) : sel\n    }\n    if (lineSep === false) return lines\n    else return lines.join(lineSep || this.lineSeparator())\n  },\n  getSelections: function(lineSep) {\n    let parts = [], ranges = this.sel.ranges\n    for (let i = 0; i < ranges.length; i++) {\n      let sel = getBetween(this, ranges[i].from(), ranges[i].to())\n      if (lineSep !== false) sel = sel.join(lineSep || this.lineSeparator())\n      parts[i] = sel\n    }\n    return parts\n  },\n  replaceSelection: function(code, collapse, origin) {\n    let dup = []\n    for (let i = 0; i < this.sel.ranges.length; i++)\n      dup[i] = code\n    this.replaceSelections(dup, collapse, origin || \"+input\")\n  },\n  replaceSelections: docMethodOp(function(code, collapse, origin) {\n    let changes = [], sel = this.sel\n    for (let i = 0; i < sel.ranges.length; i++) {\n      let range = sel.ranges[i]\n      changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin}\n    }\n    let newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse)\n    for (let i = changes.length - 1; i >= 0; i--)\n      makeChange(this, changes[i])\n    if (newSel) setSelectionReplaceHistory(this, newSel)\n    else if (this.cm) ensureCursorVisible(this.cm)\n  }),\n  undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\")}),\n  redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\")}),\n  undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true)}),\n  redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true)}),\n\n  setExtending: function(val) {this.extend = val},\n  getExtending: function() {return this.extend},\n\n  historySize: function() {\n    let hist = this.history, done = 0, undone = 0\n    for (let i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done\n    for (let i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone\n    return {undo: done, redo: undone}\n  },\n  clearHistory: function() {\n    this.history = new History(this.history)\n    linkedDocs(this, doc => doc.history = this.history, true)\n  },\n\n  markClean: function() {\n    this.cleanGeneration = this.changeGeneration(true)\n  },\n  changeGeneration: function(forceSplit) {\n    if (forceSplit)\n      this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null\n    return this.history.generation\n  },\n  isClean: function (gen) {\n    return this.history.generation == (gen || this.cleanGeneration)\n  },\n\n  getHistory: function() {\n    return {done: copyHistoryArray(this.history.done),\n            undone: copyHistoryArray(this.history.undone)}\n  },\n  setHistory: function(histData) {\n    let hist = this.history = new History(this.history)\n    hist.done = copyHistoryArray(histData.done.slice(0), null, true)\n    hist.undone = copyHistoryArray(histData.undone.slice(0), null, true)\n  },\n\n  setGutterMarker: docMethodOp(function(line, gutterID, value) {\n    return changeLine(this, line, \"gutter\", line => {\n      let markers = line.gutterMarkers || (line.gutterMarkers = {})\n      markers[gutterID] = value\n      if (!value && isEmpty(markers)) line.gutterMarkers = null\n      return true\n    })\n  }),\n\n  clearGutter: docMethodOp(function(gutterID) {\n    this.iter(line => {\n      if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n        changeLine(this, line, \"gutter\", () => {\n          line.gutterMarkers[gutterID] = null\n          if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null\n          return true\n        })\n      }\n    })\n  }),\n\n  lineInfo: function(line) {\n    let n\n    if (typeof line == \"number\") {\n      if (!isLine(this, line)) return null\n      n = line\n      line = getLine(this, line)\n      if (!line) return null\n    } else {\n      n = lineNo(line)\n      if (n == null) return null\n    }\n    return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n            textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n            widgets: line.widgets}\n  },\n\n  addLineClass: docMethodOp(function(handle, where, cls) {\n    return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", line => {\n      let prop = where == \"text\" ? \"textClass\"\n               : where == \"background\" ? \"bgClass\"\n               : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\"\n      if (!line[prop]) line[prop] = cls\n      else if (classTest(cls).test(line[prop])) return false\n      else line[prop] += \" \" + cls\n      return true\n    })\n  }),\n  removeLineClass: docMethodOp(function(handle, where, cls) {\n    return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", line => {\n      let prop = where == \"text\" ? \"textClass\"\n               : where == \"background\" ? \"bgClass\"\n               : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\"\n      let cur = line[prop]\n      if (!cur) return false\n      else if (cls == null) line[prop] = null\n      else {\n        let found = cur.match(classTest(cls))\n        if (!found) return false\n        let end = found.index + found[0].length\n        line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null\n      }\n      return true\n    })\n  }),\n\n  addLineWidget: docMethodOp(function(handle, node, options) {\n    return addLineWidget(this, handle, node, options)\n  }),\n  removeLineWidget: function(widget) { widget.clear() },\n\n  markText: function(from, to, options) {\n    return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\")\n  },\n  setBookmark: function(pos, options) {\n    let realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n                    insertLeft: options && options.insertLeft,\n                    clearWhenEmpty: false, shared: options && options.shared,\n                    handleMouseEvents: options && options.handleMouseEvents}\n    pos = clipPos(this, pos)\n    return markText(this, pos, pos, realOpts, \"bookmark\")\n  },\n  findMarksAt: function(pos) {\n    pos = clipPos(this, pos)\n    let markers = [], spans = getLine(this, pos.line).markedSpans\n    if (spans) for (let i = 0; i < spans.length; ++i) {\n      let span = spans[i]\n      if ((span.from == null || span.from <= pos.ch) &&\n          (span.to == null || span.to >= pos.ch))\n        markers.push(span.marker.parent || span.marker)\n    }\n    return markers\n  },\n  findMarks: function(from, to, filter) {\n    from = clipPos(this, from); to = clipPos(this, to)\n    let found = [], lineNo = from.line\n    this.iter(from.line, to.line + 1, line => {\n      let spans = line.markedSpans\n      if (spans) for (let i = 0; i < spans.length; i++) {\n        let span = spans[i]\n        if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||\n              span.from == null && lineNo != from.line ||\n              span.from != null && lineNo == to.line && span.from >= to.ch) &&\n            (!filter || filter(span.marker)))\n          found.push(span.marker.parent || span.marker)\n      }\n      ++lineNo\n    })\n    return found\n  },\n  getAllMarks: function() {\n    let markers = []\n    this.iter(line => {\n      let sps = line.markedSpans\n      if (sps) for (let i = 0; i < sps.length; ++i)\n        if (sps[i].from != null) markers.push(sps[i].marker)\n    })\n    return markers\n  },\n\n  posFromIndex: function(off) {\n    let ch, lineNo = this.first, sepSize = this.lineSeparator().length\n    this.iter(line => {\n      let sz = line.text.length + sepSize\n      if (sz > off) { ch = off; return true }\n      off -= sz\n      ++lineNo\n    })\n    return clipPos(this, Pos(lineNo, ch))\n  },\n  indexFromPos: function (coords) {\n    coords = clipPos(this, coords)\n    let index = coords.ch\n    if (coords.line < this.first || coords.ch < 0) return 0\n    let sepSize = this.lineSeparator().length\n    this.iter(this.first, coords.line, line => { // iter aborts when callback returns a truthy value\n      index += line.text.length + sepSize\n    })\n    return index\n  },\n\n  copy: function(copyHistory) {\n    let doc = new Doc(getLines(this, this.first, this.first + this.size),\n                      this.modeOption, this.first, this.lineSep, this.direction)\n    doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft\n    doc.sel = this.sel\n    doc.extend = false\n    if (copyHistory) {\n      doc.history.undoDepth = this.history.undoDepth\n      doc.setHistory(this.getHistory())\n    }\n    return doc\n  },\n\n  linkedDoc: function(options) {\n    if (!options) options = {}\n    let from = this.first, to = this.first + this.size\n    if (options.from != null && options.from > from) from = options.from\n    if (options.to != null && options.to < to) to = options.to\n    let copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction)\n    if (options.sharedHist) copy.history = this.history\n    ;(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist})\n    copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]\n    copySharedMarkers(copy, findSharedMarkers(this))\n    return copy\n  },\n  unlinkDoc: function(other) {\n    if (other instanceof CodeMirror) other = other.doc\n    if (this.linked) for (let i = 0; i < this.linked.length; ++i) {\n      let link = this.linked[i]\n      if (link.doc != other) continue\n      this.linked.splice(i, 1)\n      other.unlinkDoc(this)\n      detachSharedMarkers(findSharedMarkers(this))\n      break\n    }\n    // If the histories were shared, split them again\n    if (other.history == this.history) {\n      let splitIds = [other.id]\n      linkedDocs(other, doc => splitIds.push(doc.id), true)\n      other.history = new History(null)\n      other.history.done = copyHistoryArray(this.history.done, splitIds)\n      other.history.undone = copyHistoryArray(this.history.undone, splitIds)\n    }\n  },\n  iterLinkedDocs: function(f) {linkedDocs(this, f)},\n\n  getMode: function() {return this.mode},\n  getEditor: function() {return this.cm},\n\n  splitLines: function(str) {\n    if (this.lineSep) return str.split(this.lineSep)\n    return splitLinesAuto(str)\n  },\n  lineSeparator: function() { return this.lineSep || \"\\n\" },\n\n  setDirection: docMethodOp(function (dir) {\n    if (dir != \"rtl\") dir = \"ltr\"\n    if (dir == this.direction) return\n    this.direction = dir\n    this.iter(line => line.order = null)\n    if (this.cm) directionChanged(this.cm)\n  })\n})\n\n// Public alias.\nDoc.prototype.eachLine = Doc.prototype.iter\n\nexport default Doc\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/model/change_measurement.js",
    "content": "import { cmp, Pos } from \"../line/pos.js\"\nimport { lst } from \"../util/misc.js\"\n\nimport { normalizeSelection, Range, Selection } from \"./selection.js\"\n\n// Compute the position of the end of a change (its 'to' property\n// refers to the pre-change end).\nexport function changeEnd(change) {\n  if (!change.text) return change.to\n  return Pos(change.from.line + change.text.length - 1,\n             lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))\n}\n\n// Adjust a position to refer to the post-change position of the\n// same text, or the end of the change if the change covers it.\nfunction adjustForChange(pos, change) {\n  if (cmp(pos, change.from) < 0) return pos\n  if (cmp(pos, change.to) <= 0) return changeEnd(change)\n\n  let line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch\n  if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch\n  return Pos(line, ch)\n}\n\nexport function computeSelAfterChange(doc, change) {\n  let out = []\n  for (let i = 0; i < doc.sel.ranges.length; i++) {\n    let range = doc.sel.ranges[i]\n    out.push(new Range(adjustForChange(range.anchor, change),\n                       adjustForChange(range.head, change)))\n  }\n  return normalizeSelection(doc.cm, out, doc.sel.primIndex)\n}\n\nfunction offsetPos(pos, old, nw) {\n  if (pos.line == old.line)\n    return Pos(nw.line, pos.ch - old.ch + nw.ch)\n  else\n    return Pos(nw.line + (pos.line - old.line), pos.ch)\n}\n\n// Used by replaceSelections to allow moving the selection to the\n// start or around the replaced test. Hint may be \"start\" or \"around\".\nexport function computeReplacedSel(doc, changes, hint) {\n  let out = []\n  let oldPrev = Pos(doc.first, 0), newPrev = oldPrev\n  for (let i = 0; i < changes.length; i++) {\n    let change = changes[i]\n    let from = offsetPos(change.from, oldPrev, newPrev)\n    let to = offsetPos(changeEnd(change), oldPrev, newPrev)\n    oldPrev = change.to\n    newPrev = to\n    if (hint == \"around\") {\n      let range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0\n      out[i] = new Range(inv ? to : from, inv ? from : to)\n    } else {\n      out[i] = new Range(from, from)\n    }\n  }\n  return new Selection(out, doc.sel.primIndex)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/model/changes.js",
    "content": "import { retreatFrontier } from \"../line/highlight.js\"\nimport { startWorker } from \"../display/highlight_worker.js\"\nimport { operation } from \"../display/operations.js\"\nimport { regChange, regLineChange } from \"../display/view_tracking.js\"\nimport { clipLine, clipPos, cmp, Pos } from \"../line/pos.js\"\nimport { sawReadOnlySpans } from \"../line/saw_special_spans.js\"\nimport { lineLength, removeReadOnlyRanges, stretchSpansOverChange, visualLine } from \"../line/spans.js\"\nimport { getBetween, getLine, lineNo } from \"../line/utils_line.js\"\nimport { estimateHeight } from \"../measurement/position_measurement.js\"\nimport { hasHandler, signal, signalCursorActivity } from \"../util/event.js\"\nimport { indexOf, lst, map, sel_dontScroll } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\n\nimport { changeEnd, computeSelAfterChange } from \"./change_measurement.js\"\nimport { isWholeLineUpdate, linkedDocs, updateDoc } from \"./document_data.js\"\nimport { addChangeToHistory, historyChangeFromChange, mergeOldSpans, pushSelectionToHistory } from \"./history.js\"\nimport { Range, Selection } from \"./selection.js\"\nimport { setSelection, setSelectionNoUndo, skipAtomic } from \"./selection_updates.js\"\n\n// UPDATING\n\n// Allow \"beforeChange\" event handlers to influence a change\nfunction filterChange(doc, change, update) {\n  let obj = {\n    canceled: false,\n    from: change.from,\n    to: change.to,\n    text: change.text,\n    origin: change.origin,\n    cancel: () => obj.canceled = true\n  }\n  if (update) obj.update = (from, to, text, origin) => {\n    if (from) obj.from = clipPos(doc, from)\n    if (to) obj.to = clipPos(doc, to)\n    if (text) obj.text = text\n    if (origin !== undefined) obj.origin = origin\n  }\n  signal(doc, \"beforeChange\", doc, obj)\n  if (doc.cm) signal(doc.cm, \"beforeChange\", doc.cm, obj)\n\n  if (obj.canceled) {\n    if (doc.cm) doc.cm.curOp.updateInput = 2\n    return null\n  }\n  return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}\n}\n\n// Apply a change to a document, and add it to the document's\n// history, and propagating it to all linked documents.\nexport function makeChange(doc, change, ignoreReadOnly) {\n  if (doc.cm) {\n    if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly)\n    if (doc.cm.state.suppressEdits) return\n  }\n\n  if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n    change = filterChange(doc, change, true)\n    if (!change) return\n  }\n\n  // Possibly split or suppress the update based on the presence\n  // of read-only spans in its range.\n  let split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to)\n  if (split) {\n    for (let i = split.length - 1; i >= 0; --i)\n      makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text, origin: change.origin})\n  } else {\n    makeChangeInner(doc, change)\n  }\n}\n\nfunction makeChangeInner(doc, change) {\n  if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) return\n  let selAfter = computeSelAfterChange(doc, change)\n  addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN)\n\n  makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change))\n  let rebased = []\n\n  linkedDocs(doc, (doc, sharedHist) => {\n    if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n      rebaseHist(doc.history, change)\n      rebased.push(doc.history)\n    }\n    makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change))\n  })\n}\n\n// Revert a change stored in a document's history.\nexport function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n  let suppress = doc.cm && doc.cm.state.suppressEdits\n  if (suppress && !allowSelectionOnly) return\n\n  let hist = doc.history, event, selAfter = doc.sel\n  let source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done\n\n  // Verify that there is a useable event (so that ctrl-z won't\n  // needlessly clear selection events)\n  let i = 0\n  for (; i < source.length; i++) {\n    event = source[i]\n    if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n      break\n  }\n  if (i == source.length) return\n  hist.lastOrigin = hist.lastSelOrigin = null\n\n  for (;;) {\n    event = source.pop()\n    if (event.ranges) {\n      pushSelectionToHistory(event, dest)\n      if (allowSelectionOnly && !event.equals(doc.sel)) {\n        setSelection(doc, event, {clearRedo: false})\n        return\n      }\n      selAfter = event\n    } else if (suppress) {\n      source.push(event)\n      return\n    } else break\n  }\n\n  // Build up a reverse change object to add to the opposite history\n  // stack (redo when undoing, and vice versa).\n  let antiChanges = []\n  pushSelectionToHistory(selAfter, dest)\n  dest.push({changes: antiChanges, generation: hist.generation})\n  hist.generation = event.generation || ++hist.maxGeneration\n\n  let filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")\n\n  for (let i = event.changes.length - 1; i >= 0; --i) {\n    let change = event.changes[i]\n    change.origin = type\n    if (filter && !filterChange(doc, change, false)) {\n      source.length = 0\n      return\n    }\n\n    antiChanges.push(historyChangeFromChange(doc, change))\n\n    let after = i ? computeSelAfterChange(doc, change) : lst(source)\n    makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change))\n    if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)})\n    let rebased = []\n\n    // Propagate to the linked documents\n    linkedDocs(doc, (doc, sharedHist) => {\n      if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n        rebaseHist(doc.history, change)\n        rebased.push(doc.history)\n      }\n      makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change))\n    })\n  }\n}\n\n// Sub-views need their line numbers shifted when text is added\n// above or below them in the parent document.\nfunction shiftDoc(doc, distance) {\n  if (distance == 0) return\n  doc.first += distance\n  doc.sel = new Selection(map(doc.sel.ranges, range => new Range(\n    Pos(range.anchor.line + distance, range.anchor.ch),\n    Pos(range.head.line + distance, range.head.ch)\n  )), doc.sel.primIndex)\n  if (doc.cm) {\n    regChange(doc.cm, doc.first, doc.first - distance, distance)\n    for (let d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n      regLineChange(doc.cm, l, \"gutter\")\n  }\n}\n\n// More lower-level change function, handling only a single document\n// (not linked ones).\nfunction makeChangeSingleDoc(doc, change, selAfter, spans) {\n  if (doc.cm && !doc.cm.curOp)\n    return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans)\n\n  if (change.to.line < doc.first) {\n    shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line))\n    return\n  }\n  if (change.from.line > doc.lastLine()) return\n\n  // Clip the change to the size of this doc\n  if (change.from.line < doc.first) {\n    let shift = change.text.length - 1 - (doc.first - change.from.line)\n    shiftDoc(doc, shift)\n    change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n              text: [lst(change.text)], origin: change.origin}\n  }\n  let last = doc.lastLine()\n  if (change.to.line > last) {\n    change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n              text: [change.text[0]], origin: change.origin}\n  }\n\n  change.removed = getBetween(doc, change.from, change.to)\n\n  if (!selAfter) selAfter = computeSelAfterChange(doc, change)\n  if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans)\n  else updateDoc(doc, change, spans)\n  setSelectionNoUndo(doc, selAfter, sel_dontScroll)\n\n  if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))\n    doc.cantEdit = false\n}\n\n// Handle the interaction of a change to a document with the editor\n// that this document is part of.\nfunction makeChangeSingleDocInEditor(cm, change, spans) {\n  let doc = cm.doc, display = cm.display, from = change.from, to = change.to\n\n  let recomputeMaxLength = false, checkWidthStart = from.line\n  if (!cm.options.lineWrapping) {\n    checkWidthStart = lineNo(visualLine(getLine(doc, from.line)))\n    doc.iter(checkWidthStart, to.line + 1, line => {\n      if (line == display.maxLine) {\n        recomputeMaxLength = true\n        return true\n      }\n    })\n  }\n\n  if (doc.sel.contains(change.from, change.to) > -1)\n    signalCursorActivity(cm)\n\n  updateDoc(doc, change, spans, estimateHeight(cm))\n\n  if (!cm.options.lineWrapping) {\n    doc.iter(checkWidthStart, from.line + change.text.length, line => {\n      let len = lineLength(line)\n      if (len > display.maxLineLength) {\n        display.maxLine = line\n        display.maxLineLength = len\n        display.maxLineChanged = true\n        recomputeMaxLength = false\n      }\n    })\n    if (recomputeMaxLength) cm.curOp.updateMaxLine = true\n  }\n\n  retreatFrontier(doc, from.line)\n  startWorker(cm, 400)\n\n  let lendiff = change.text.length - (to.line - from.line) - 1\n  // Remember that these lines changed, for updating the display\n  if (change.full)\n    regChange(cm)\n  else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n    regLineChange(cm, from.line, \"text\")\n  else\n    regChange(cm, from.line, to.line + 1, lendiff)\n\n  let changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\")\n  if (changeHandler || changesHandler) {\n    let obj = {\n      from: from, to: to,\n      text: change.text,\n      removed: change.removed,\n      origin: change.origin\n    }\n    if (changeHandler) signalLater(cm, \"change\", cm, obj)\n    if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj)\n  }\n  cm.display.selForContextMenu = null\n}\n\nexport function replaceRange(doc, code, from, to, origin) {\n  if (!to) to = from\n  if (cmp(to, from) < 0) [from, to] = [to, from]\n  if (typeof code == \"string\") code = doc.splitLines(code)\n  makeChange(doc, {from, to, text: code, origin})\n}\n\n// Rebasing/resetting history to deal with externally-sourced changes\n\nfunction rebaseHistSelSingle(pos, from, to, diff) {\n  if (to < pos.line) {\n    pos.line += diff\n  } else if (from < pos.line) {\n    pos.line = from\n    pos.ch = 0\n  }\n}\n\n// Tries to rebase an array of history events given a change in the\n// document. If the change touches the same lines as the event, the\n// event, and everything 'behind' it, is discarded. If the change is\n// before the event, the event's positions are updated. Uses a\n// copy-on-write scheme for the positions, to avoid having to\n// reallocate them all on every rebase, but also avoid problems with\n// shared position objects being unsafely updated.\nfunction rebaseHistArray(array, from, to, diff) {\n  for (let i = 0; i < array.length; ++i) {\n    let sub = array[i], ok = true\n    if (sub.ranges) {\n      if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true }\n      for (let j = 0; j < sub.ranges.length; j++) {\n        rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff)\n        rebaseHistSelSingle(sub.ranges[j].head, from, to, diff)\n      }\n      continue\n    }\n    for (let j = 0; j < sub.changes.length; ++j) {\n      let cur = sub.changes[j]\n      if (to < cur.from.line) {\n        cur.from = Pos(cur.from.line + diff, cur.from.ch)\n        cur.to = Pos(cur.to.line + diff, cur.to.ch)\n      } else if (from <= cur.to.line) {\n        ok = false\n        break\n      }\n    }\n    if (!ok) {\n      array.splice(0, i + 1)\n      i = 0\n    }\n  }\n}\n\nfunction rebaseHist(hist, change) {\n  let from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1\n  rebaseHistArray(hist.done, from, to, diff)\n  rebaseHistArray(hist.undone, from, to, diff)\n}\n\n// Utility for applying a change to a line by handle or number,\n// returning the number and optionally registering the line as\n// changed.\nexport function changeLine(doc, handle, changeType, op) {\n  let no = handle, line = handle\n  if (typeof handle == \"number\") line = getLine(doc, clipLine(doc, handle))\n  else no = lineNo(handle)\n  if (no == null) return null\n  if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType)\n  return line\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/model/chunk.js",
    "content": "import { cleanUpLine } from \"../line/line_data.js\"\nimport { indexOf } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\n\n// The document is represented as a BTree consisting of leaves, with\n// chunk of lines in them, and branches, with up to ten leaves or\n// other branch nodes below them. The top node is always a branch\n// node, and is the document object itself (meaning it has\n// additional methods and properties).\n//\n// All nodes have parent links. The tree is used both to go from\n// line numbers to line objects, and to go from objects to numbers.\n// It also indexes by height, and is used to convert between height\n// and line object, and to find the total height of the document.\n//\n// See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\nexport function LeafChunk(lines) {\n  this.lines = lines\n  this.parent = null\n  let height = 0\n  for (let i = 0; i < lines.length; ++i) {\n    lines[i].parent = this\n    height += lines[i].height\n  }\n  this.height = height\n}\n\nLeafChunk.prototype = {\n  chunkSize() { return this.lines.length },\n\n  // Remove the n lines at offset 'at'.\n  removeInner(at, n) {\n    for (let i = at, e = at + n; i < e; ++i) {\n      let line = this.lines[i]\n      this.height -= line.height\n      cleanUpLine(line)\n      signalLater(line, \"delete\")\n    }\n    this.lines.splice(at, n)\n  },\n\n  // Helper used to collapse a small branch into a single leaf.\n  collapse(lines) {\n    lines.push.apply(lines, this.lines)\n  },\n\n  // Insert the given array of lines at offset 'at', count them as\n  // having the given height.\n  insertInner(at, lines, height) {\n    this.height += height\n    this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at))\n    for (let i = 0; i < lines.length; ++i) lines[i].parent = this\n  },\n\n  // Used to iterate over a part of the tree.\n  iterN(at, n, op) {\n    for (let e = at + n; at < e; ++at)\n      if (op(this.lines[at])) return true\n  }\n}\n\nexport function BranchChunk(children) {\n  this.children = children\n  let size = 0, height = 0\n  for (let i = 0; i < children.length; ++i) {\n    let ch = children[i]\n    size += ch.chunkSize(); height += ch.height\n    ch.parent = this\n  }\n  this.size = size\n  this.height = height\n  this.parent = null\n}\n\nBranchChunk.prototype = {\n  chunkSize() { return this.size },\n\n  removeInner(at, n) {\n    this.size -= n\n    for (let i = 0; i < this.children.length; ++i) {\n      let child = this.children[i], sz = child.chunkSize()\n      if (at < sz) {\n        let rm = Math.min(n, sz - at), oldHeight = child.height\n        child.removeInner(at, rm)\n        this.height -= oldHeight - child.height\n        if (sz == rm) { this.children.splice(i--, 1); child.parent = null }\n        if ((n -= rm) == 0) break\n        at = 0\n      } else at -= sz\n    }\n    // If the result is smaller than 25 lines, ensure that it is a\n    // single leaf node.\n    if (this.size - n < 25 &&\n        (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n      let lines = []\n      this.collapse(lines)\n      this.children = [new LeafChunk(lines)]\n      this.children[0].parent = this\n    }\n  },\n\n  collapse(lines) {\n    for (let i = 0; i < this.children.length; ++i) this.children[i].collapse(lines)\n  },\n\n  insertInner(at, lines, height) {\n    this.size += lines.length\n    this.height += height\n    for (let i = 0; i < this.children.length; ++i) {\n      let child = this.children[i], sz = child.chunkSize()\n      if (at <= sz) {\n        child.insertInner(at, lines, height)\n        if (child.lines && child.lines.length > 50) {\n          // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.\n          // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.\n          let remaining = child.lines.length % 25 + 25\n          for (let pos = remaining; pos < child.lines.length;) {\n            let leaf = new LeafChunk(child.lines.slice(pos, pos += 25))\n            child.height -= leaf.height\n            this.children.splice(++i, 0, leaf)\n            leaf.parent = this\n          }\n          child.lines = child.lines.slice(0, remaining)\n          this.maybeSpill()\n        }\n        break\n      }\n      at -= sz\n    }\n  },\n\n  // When a node has grown, check whether it should be split.\n  maybeSpill() {\n    if (this.children.length <= 10) return\n    let me = this\n    do {\n      let spilled = me.children.splice(me.children.length - 5, 5)\n      let sibling = new BranchChunk(spilled)\n      if (!me.parent) { // Become the parent node\n        let copy = new BranchChunk(me.children)\n        copy.parent = me\n        me.children = [copy, sibling]\n        me = copy\n     } else {\n        me.size -= sibling.size\n        me.height -= sibling.height\n        let myIndex = indexOf(me.parent.children, me)\n        me.parent.children.splice(myIndex + 1, 0, sibling)\n      }\n      sibling.parent = me.parent\n    } while (me.children.length > 10)\n    me.parent.maybeSpill()\n  },\n\n  iterN(at, n, op) {\n    for (let i = 0; i < this.children.length; ++i) {\n      let child = this.children[i], sz = child.chunkSize()\n      if (at < sz) {\n        let used = Math.min(n, sz - at)\n        if (child.iterN(at, used, op)) return true\n        if ((n -= used) == 0) break\n        at = 0\n      } else at -= sz\n    }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/model/document_data.js",
    "content": "import { loadMode } from \"../display/mode_state.js\"\nimport { runInOp } from \"../display/operations.js\"\nimport { regChange } from \"../display/view_tracking.js\"\nimport { Line, updateLine } from \"../line/line_data.js\"\nimport { findMaxLine } from \"../line/spans.js\"\nimport { getLine } from \"../line/utils_line.js\"\nimport { estimateLineHeights } from \"../measurement/position_measurement.js\"\nimport { addClass, rmClass } from \"../util/dom.js\"\nimport { lst } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\n\n// DOCUMENT DATA STRUCTURE\n\n// By default, updates that start and end at the beginning of a line\n// are treated specially, in order to make the association of line\n// widgets and marker elements with the text behave more intuitive.\nexport function isWholeLineUpdate(doc, change) {\n  return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n    (!doc.cm || doc.cm.options.wholeLineUpdateBefore)\n}\n\n// Perform a change on the document data structure.\nexport function updateDoc(doc, change, markedSpans, estimateHeight) {\n  function spansFor(n) {return markedSpans ? markedSpans[n] : null}\n  function update(line, text, spans) {\n    updateLine(line, text, spans, estimateHeight)\n    signalLater(line, \"change\", line, change)\n  }\n  function linesFor(start, end) {\n    let result = []\n    for (let i = start; i < end; ++i)\n      result.push(new Line(text[i], spansFor(i), estimateHeight))\n    return result\n  }\n\n  let from = change.from, to = change.to, text = change.text\n  let firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line)\n  let lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line\n\n  // Adjust the line structure\n  if (change.full) {\n    doc.insert(0, linesFor(0, text.length))\n    doc.remove(text.length, doc.size - text.length)\n  } else if (isWholeLineUpdate(doc, change)) {\n    // This is a whole-line replace. Treated specially to make\n    // sure line objects move the way they are supposed to.\n    let added = linesFor(0, text.length - 1)\n    update(lastLine, lastLine.text, lastSpans)\n    if (nlines) doc.remove(from.line, nlines)\n    if (added.length) doc.insert(from.line, added)\n  } else if (firstLine == lastLine) {\n    if (text.length == 1) {\n      update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans)\n    } else {\n      let added = linesFor(1, text.length - 1)\n      added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight))\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0))\n      doc.insert(from.line + 1, added)\n    }\n  } else if (text.length == 1) {\n    update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0))\n    doc.remove(from.line + 1, nlines)\n  } else {\n    update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0))\n    update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans)\n    let added = linesFor(1, text.length - 1)\n    if (nlines > 1) doc.remove(from.line + 1, nlines - 1)\n    doc.insert(from.line + 1, added)\n  }\n\n  signalLater(doc, \"change\", doc, change)\n}\n\n// Call f for all linked documents.\nexport function linkedDocs(doc, f, sharedHistOnly) {\n  function propagate(doc, skip, sharedHist) {\n    if (doc.linked) for (let i = 0; i < doc.linked.length; ++i) {\n      let rel = doc.linked[i]\n      if (rel.doc == skip) continue\n      let shared = sharedHist && rel.sharedHist\n      if (sharedHistOnly && !shared) continue\n      f(rel.doc, shared)\n      propagate(rel.doc, doc, shared)\n    }\n  }\n  propagate(doc, null, true)\n}\n\n// Attach a document to an editor.\nexport function attachDoc(cm, doc) {\n  if (doc.cm) throw new Error(\"This document is already in use.\")\n  cm.doc = doc\n  doc.cm = cm\n  estimateLineHeights(cm)\n  loadMode(cm)\n  setDirectionClass(cm)\n  cm.options.direction = doc.direction\n  if (!cm.options.lineWrapping) findMaxLine(cm)\n  cm.options.mode = doc.modeOption\n  regChange(cm)\n}\n\nfunction setDirectionClass(cm) {\n  ;(cm.doc.direction == \"rtl\" ? addClass : rmClass)(cm.display.lineDiv, \"CodeMirror-rtl\")\n}\n\nexport function directionChanged(cm) {\n  runInOp(cm, () => {\n    setDirectionClass(cm)\n    regChange(cm)\n  })\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/model/history.js",
    "content": "import { cmp, copyPos } from \"../line/pos.js\"\nimport { stretchSpansOverChange } from \"../line/spans.js\"\nimport { getBetween } from \"../line/utils_line.js\"\nimport { signal } from \"../util/event.js\"\nimport { indexOf, lst } from \"../util/misc.js\"\n\nimport { changeEnd } from \"./change_measurement.js\"\nimport { linkedDocs } from \"./document_data.js\"\nimport { Selection } from \"./selection.js\"\n\nexport function History(prev) {\n  // Arrays of change events and selections. Doing something adds an\n  // event to done and clears undo. Undoing moves events from done\n  // to undone, redoing moves them in the other direction.\n  this.done = []; this.undone = []\n  this.undoDepth = prev ? prev.undoDepth : Infinity\n  // Used to track when changes can be merged into a single undo\n  // event\n  this.lastModTime = this.lastSelTime = 0\n  this.lastOp = this.lastSelOp = null\n  this.lastOrigin = this.lastSelOrigin = null\n  // Used by the isClean() method\n  this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1\n}\n\n// Create a history change event from an updateDoc-style change\n// object.\nexport function historyChangeFromChange(doc, change) {\n  let histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}\n  attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1)\n  linkedDocs(doc, doc => attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1), true)\n  return histChange\n}\n\n// Pop all selection events off the end of a history array. Stop at\n// a change event.\nfunction clearSelectionEvents(array) {\n  while (array.length) {\n    let last = lst(array)\n    if (last.ranges) array.pop()\n    else break\n  }\n}\n\n// Find the top change event in the history. Pop off selection\n// events that are in the way.\nfunction lastChangeEvent(hist, force) {\n  if (force) {\n    clearSelectionEvents(hist.done)\n    return lst(hist.done)\n  } else if (hist.done.length && !lst(hist.done).ranges) {\n    return lst(hist.done)\n  } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n    hist.done.pop()\n    return lst(hist.done)\n  }\n}\n\n// Register a change in the history. Merges changes that are within\n// a single operation, or are close together with an origin that\n// allows merging (starting with \"+\") into a single event.\nexport function addChangeToHistory(doc, change, selAfter, opId) {\n  let hist = doc.history\n  hist.undone.length = 0\n  let time = +new Date, cur\n  let last\n\n  if ((hist.lastOp == opId ||\n       hist.lastOrigin == change.origin && change.origin &&\n       ((change.origin.charAt(0) == \"+\" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||\n        change.origin.charAt(0) == \"*\")) &&\n      (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n    // Merge this change into the last event\n    last = lst(cur.changes)\n    if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n      // Optimized case for simple insertion -- don't want to add\n      // new changesets for every character typed\n      last.to = changeEnd(change)\n    } else {\n      // Add new sub-event\n      cur.changes.push(historyChangeFromChange(doc, change))\n    }\n  } else {\n    // Can not be merged, start a new event.\n    let before = lst(hist.done)\n    if (!before || !before.ranges)\n      pushSelectionToHistory(doc.sel, hist.done)\n    cur = {changes: [historyChangeFromChange(doc, change)],\n           generation: hist.generation}\n    hist.done.push(cur)\n    while (hist.done.length > hist.undoDepth) {\n      hist.done.shift()\n      if (!hist.done[0].ranges) hist.done.shift()\n    }\n  }\n  hist.done.push(selAfter)\n  hist.generation = ++hist.maxGeneration\n  hist.lastModTime = hist.lastSelTime = time\n  hist.lastOp = hist.lastSelOp = opId\n  hist.lastOrigin = hist.lastSelOrigin = change.origin\n\n  if (!last) signal(doc, \"historyAdded\")\n}\n\nfunction selectionEventCanBeMerged(doc, origin, prev, sel) {\n  let ch = origin.charAt(0)\n  return ch == \"*\" ||\n    ch == \"+\" &&\n    prev.ranges.length == sel.ranges.length &&\n    prev.somethingSelected() == sel.somethingSelected() &&\n    new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)\n}\n\n// Called whenever the selection changes, sets the new selection as\n// the pending selection in the history, and pushes the old pending\n// selection into the 'done' array when it was significantly\n// different (in number of selected ranges, emptiness, or time).\nexport function addSelectionToHistory(doc, sel, opId, options) {\n  let hist = doc.history, origin = options && options.origin\n\n  // A new event is started when the previous origin does not match\n  // the current, or the origins don't allow matching. Origins\n  // starting with * are always merged, those starting with + are\n  // merged when similar and close together in time.\n  if (opId == hist.lastSelOp ||\n      (origin && hist.lastSelOrigin == origin &&\n       (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n        selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n    hist.done[hist.done.length - 1] = sel\n  else\n    pushSelectionToHistory(sel, hist.done)\n\n  hist.lastSelTime = +new Date\n  hist.lastSelOrigin = origin\n  hist.lastSelOp = opId\n  if (options && options.clearRedo !== false)\n    clearSelectionEvents(hist.undone)\n}\n\nexport function pushSelectionToHistory(sel, dest) {\n  let top = lst(dest)\n  if (!(top && top.ranges && top.equals(sel)))\n    dest.push(sel)\n}\n\n// Used to store marked span information in the history.\nfunction attachLocalSpans(doc, change, from, to) {\n  let existing = change[\"spans_\" + doc.id], n = 0\n  doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), line => {\n    if (line.markedSpans)\n      (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans\n    ++n\n  })\n}\n\n// When un/re-doing restores text containing marked spans, those\n// that have been explicitly cleared should not be restored.\nfunction removeClearedSpans(spans) {\n  if (!spans) return null\n  let out\n  for (let i = 0; i < spans.length; ++i) {\n    if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i) }\n    else if (out) out.push(spans[i])\n  }\n  return !out ? spans : out.length ? out : null\n}\n\n// Retrieve and filter the old marked spans stored in a change event.\nfunction getOldSpans(doc, change) {\n  let found = change[\"spans_\" + doc.id]\n  if (!found) return null\n  let nw = []\n  for (let i = 0; i < change.text.length; ++i)\n    nw.push(removeClearedSpans(found[i]))\n  return nw\n}\n\n// Used for un/re-doing changes from the history. Combines the\n// result of computing the existing spans with the set of spans that\n// existed in the history (so that deleting around a span and then\n// undoing brings back the span).\nexport function mergeOldSpans(doc, change) {\n  let old = getOldSpans(doc, change)\n  let stretched = stretchSpansOverChange(doc, change)\n  if (!old) return stretched\n  if (!stretched) return old\n\n  for (let i = 0; i < old.length; ++i) {\n    let oldCur = old[i], stretchCur = stretched[i]\n    if (oldCur && stretchCur) {\n      spans: for (let j = 0; j < stretchCur.length; ++j) {\n        let span = stretchCur[j]\n        for (let k = 0; k < oldCur.length; ++k)\n          if (oldCur[k].marker == span.marker) continue spans\n        oldCur.push(span)\n      }\n    } else if (stretchCur) {\n      old[i] = stretchCur\n    }\n  }\n  return old\n}\n\n// Used both to provide a JSON-safe object in .getHistory, and, when\n// detaching a document, to split the history in two\nexport function copyHistoryArray(events, newGroup, instantiateSel) {\n  let copy = []\n  for (let i = 0; i < events.length; ++i) {\n    let event = events[i]\n    if (event.ranges) {\n      copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event)\n      continue\n    }\n    let changes = event.changes, newChanges = []\n    copy.push({changes: newChanges})\n    for (let j = 0; j < changes.length; ++j) {\n      let change = changes[j], m\n      newChanges.push({from: change.from, to: change.to, text: change.text})\n      if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\\d+)$/)) {\n        if (indexOf(newGroup, Number(m[1])) > -1) {\n          lst(newChanges)[prop] = change[prop]\n          delete change[prop]\n        }\n      }\n    }\n  }\n  return copy\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/model/line_widget.js",
    "content": "import { runInOp } from \"../display/operations.js\"\nimport { addToScrollTop } from \"../display/scrolling.js\"\nimport { regLineChange } from \"../display/view_tracking.js\"\nimport { heightAtLine, lineIsHidden } from \"../line/spans.js\"\nimport { lineNo, updateLineHeight } from \"../line/utils_line.js\"\nimport { widgetHeight } from \"../measurement/widgets.js\"\nimport { changeLine } from \"./changes.js\"\nimport { eventMixin } from \"../util/event.js\"\nimport { signalLater } from \"../util/operation_group.js\"\n\n// Line widgets are block elements displayed above or below a line.\n\nexport class LineWidget {\n  constructor(doc, node, options) {\n    if (options) for (let opt in options) if (options.hasOwnProperty(opt))\n      this[opt] = options[opt]\n    this.doc = doc\n    this.node = node\n  }\n\n  clear() {\n    let cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line)\n    if (no == null || !ws) return\n    for (let i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1)\n    if (!ws.length) line.widgets = null\n    let height = widgetHeight(this)\n    updateLineHeight(line, Math.max(0, line.height - height))\n    if (cm) {\n      runInOp(cm, () => {\n        adjustScrollWhenAboveVisible(cm, line, -height)\n        regLineChange(cm, no, \"widget\")\n      })\n      signalLater(cm, \"lineWidgetCleared\", cm, this, no)\n    }\n  }\n\n  changed() {\n    let oldH = this.height, cm = this.doc.cm, line = this.line\n    this.height = null\n    let diff = widgetHeight(this) - oldH\n    if (!diff) return\n    if (!lineIsHidden(this.doc, line)) updateLineHeight(line, line.height + diff)\n    if (cm) {\n      runInOp(cm, () => {\n        cm.curOp.forceUpdate = true\n        adjustScrollWhenAboveVisible(cm, line, diff)\n        signalLater(cm, \"lineWidgetChanged\", cm, this, lineNo(line))\n      })\n    }\n  }\n}\neventMixin(LineWidget)\n\nfunction adjustScrollWhenAboveVisible(cm, line, diff) {\n  if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n    addToScrollTop(cm, diff)\n}\n\nexport function addLineWidget(doc, handle, node, options) {\n  let widget = new LineWidget(doc, node, options)\n  let cm = doc.cm\n  if (cm && widget.noHScroll) cm.display.alignWidgets = true\n  changeLine(doc, handle, \"widget\", line => {\n    let widgets = line.widgets || (line.widgets = [])\n    if (widget.insertAt == null) widgets.push(widget)\n    else widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget)\n    widget.line = line\n    if (cm && !lineIsHidden(doc, line)) {\n      let aboveVisible = heightAtLine(line) < doc.scrollTop\n      updateLineHeight(line, line.height + widgetHeight(widget))\n      if (aboveVisible) addToScrollTop(cm, widget.height)\n      cm.curOp.forceUpdate = true\n    }\n    return true\n  })\n  if (cm) signalLater(cm, \"lineWidgetAdded\", cm, widget, typeof handle == \"number\" ? handle : lineNo(handle))\n  return widget\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/model/mark_text.js",
    "content": "import { eltP } from \"../util/dom.js\"\nimport { eventMixin, hasHandler, on } from \"../util/event.js\"\nimport { endOperation, operation, runInOp, startOperation } from \"../display/operations.js\"\nimport { clipPos, cmp, Pos } from \"../line/pos.js\"\nimport { lineNo, updateLineHeight } from \"../line/utils_line.js\"\nimport { clearLineMeasurementCacheFor, findViewForLine, textHeight } from \"../measurement/position_measurement.js\"\nimport { seeReadOnlySpans, seeCollapsedSpans } from \"../line/saw_special_spans.js\"\nimport { addMarkedSpan, conflictingCollapsedRange, getMarkedSpanFor, lineIsHidden, lineLength, MarkedSpan, removeMarkedSpan, visualLine } from \"../line/spans.js\"\nimport { copyObj, indexOf, lst } from \"../util/misc.js\"\nimport { signalLater } from \"../util/operation_group.js\"\nimport { widgetHeight } from \"../measurement/widgets.js\"\nimport { regChange, regLineChange } from \"../display/view_tracking.js\"\n\nimport { linkedDocs } from \"./document_data.js\"\nimport { addChangeToHistory } from \"./history.js\"\nimport { reCheckSelection } from \"./selection_updates.js\"\n\n// TEXTMARKERS\n\n// Created with markText and setBookmark methods. A TextMarker is a\n// handle that can be used to clear or find a marked position in the\n// document. Line objects hold arrays (markedSpans) containing\n// {from, to, marker} object pointing to such marker objects, and\n// indicating that such a marker is present on that line. Multiple\n// lines may point to the same marker when it spans across lines.\n// The spans will have null for their from/to properties when the\n// marker continues beyond the start/end of the line. Markers have\n// links back to the lines they currently touch.\n\n// Collapsed markers have unique ids, in order to be able to order\n// them, which is needed for uniquely determining an outer marker\n// when they overlap (they may nest, but not partially overlap).\nlet nextMarkerId = 0\n\nexport class TextMarker {\n  constructor(doc, type) {\n    this.lines = []\n    this.type = type\n    this.doc = doc\n    this.id = ++nextMarkerId\n  }\n\n  // Clear the marker.\n  clear() {\n    if (this.explicitlyCleared) return\n    let cm = this.doc.cm, withOp = cm && !cm.curOp\n    if (withOp) startOperation(cm)\n    if (hasHandler(this, \"clear\")) {\n      let found = this.find()\n      if (found) signalLater(this, \"clear\", found.from, found.to)\n    }\n    let min = null, max = null\n    for (let i = 0; i < this.lines.length; ++i) {\n      let line = this.lines[i]\n      let span = getMarkedSpanFor(line.markedSpans, this)\n      if (cm && !this.collapsed) regLineChange(cm, lineNo(line), \"text\")\n      else if (cm) {\n        if (span.to != null) max = lineNo(line)\n        if (span.from != null) min = lineNo(line)\n      }\n      line.markedSpans = removeMarkedSpan(line.markedSpans, span)\n      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n        updateLineHeight(line, textHeight(cm.display))\n    }\n    if (cm && this.collapsed && !cm.options.lineWrapping) for (let i = 0; i < this.lines.length; ++i) {\n      let visual = visualLine(this.lines[i]), len = lineLength(visual)\n      if (len > cm.display.maxLineLength) {\n        cm.display.maxLine = visual\n        cm.display.maxLineLength = len\n        cm.display.maxLineChanged = true\n      }\n    }\n\n    if (min != null && cm && this.collapsed) regChange(cm, min, max + 1)\n    this.lines.length = 0\n    this.explicitlyCleared = true\n    if (this.atomic && this.doc.cantEdit) {\n      this.doc.cantEdit = false\n      if (cm) reCheckSelection(cm.doc)\n    }\n    if (cm) signalLater(cm, \"markerCleared\", cm, this, min, max)\n    if (withOp) endOperation(cm)\n    if (this.parent) this.parent.clear()\n  }\n\n  // Find the position of the marker in the document. Returns a {from,\n  // to} object by default. Side can be passed to get a specific side\n  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n  // Pos objects returned contain a line object, rather than a line\n  // number (used to prevent looking up the same line twice).\n  find(side, lineObj) {\n    if (side == null && this.type == \"bookmark\") side = 1\n    let from, to\n    for (let i = 0; i < this.lines.length; ++i) {\n      let line = this.lines[i]\n      let span = getMarkedSpanFor(line.markedSpans, this)\n      if (span.from != null) {\n        from = Pos(lineObj ? line : lineNo(line), span.from)\n        if (side == -1) return from\n      }\n      if (span.to != null) {\n        to = Pos(lineObj ? line : lineNo(line), span.to)\n        if (side == 1) return to\n      }\n    }\n    return from && {from: from, to: to}\n  }\n\n  // Signals that the marker's widget changed, and surrounding layout\n  // should be recomputed.\n  changed() {\n    let pos = this.find(-1, true), widget = this, cm = this.doc.cm\n    if (!pos || !cm) return\n    runInOp(cm, () => {\n      let line = pos.line, lineN = lineNo(pos.line)\n      let view = findViewForLine(cm, lineN)\n      if (view) {\n        clearLineMeasurementCacheFor(view)\n        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true\n      }\n      cm.curOp.updateMaxLine = true\n      if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n        let oldHeight = widget.height\n        widget.height = null\n        let dHeight = widgetHeight(widget) - oldHeight\n        if (dHeight)\n          updateLineHeight(line, line.height + dHeight)\n      }\n      signalLater(cm, \"markerChanged\", cm, this)\n    })\n  }\n\n  attachLine(line) {\n    if (!this.lines.length && this.doc.cm) {\n      let op = this.doc.cm.curOp\n      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n        (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this)\n    }\n    this.lines.push(line)\n  }\n\n  detachLine(line) {\n    this.lines.splice(indexOf(this.lines, line), 1)\n    if (!this.lines.length && this.doc.cm) {\n      let op = this.doc.cm.curOp\n      ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this)\n    }\n  }\n}\neventMixin(TextMarker)\n\n// Create a marker, wire it up to the right lines, and\nexport function markText(doc, from, to, options, type) {\n  // Shared markers (across linked documents) are handled separately\n  // (markTextShared will call out to this again, once per\n  // document).\n  if (options && options.shared) return markTextShared(doc, from, to, options, type)\n  // Ensure we are in an operation.\n  if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type)\n\n  let marker = new TextMarker(doc, type), diff = cmp(from, to)\n  if (options) copyObj(options, marker, false)\n  // Don't connect empty markers unless clearWhenEmpty is false\n  if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n    return marker\n  if (marker.replacedWith) {\n    // Showing up as a widget implies collapsed (widget replaces text)\n    marker.collapsed = true\n    marker.widgetNode = eltP(\"span\", [marker.replacedWith], \"CodeMirror-widget\")\n    if (!options.handleMouseEvents) marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\")\n    if (options.insertLeft) marker.widgetNode.insertLeft = true\n  }\n  if (marker.collapsed) {\n    if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n        from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n      throw new Error(\"Inserting collapsed marker partially overlapping an existing one\")\n    seeCollapsedSpans()\n  }\n\n  if (marker.addToHistory)\n    addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN)\n\n  let curLine = from.line, cm = doc.cm, updateMaxLine\n  doc.iter(curLine, to.line + 1, line => {\n    if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n      updateMaxLine = true\n    if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0)\n    addMarkedSpan(line, new MarkedSpan(marker,\n                                       curLine == from.line ? from.ch : null,\n                                       curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp)\n    ++curLine\n  })\n  // lineIsHidden depends on the presence of the spans, so needs a second pass\n  if (marker.collapsed) doc.iter(from.line, to.line + 1, line => {\n    if (lineIsHidden(doc, line)) updateLineHeight(line, 0)\n  })\n\n  if (marker.clearOnEnter) on(marker, \"beforeCursorEnter\", () => marker.clear())\n\n  if (marker.readOnly) {\n    seeReadOnlySpans()\n    if (doc.history.done.length || doc.history.undone.length)\n      doc.clearHistory()\n  }\n  if (marker.collapsed) {\n    marker.id = ++nextMarkerId\n    marker.atomic = true\n  }\n  if (cm) {\n    // Sync editor state\n    if (updateMaxLine) cm.curOp.updateMaxLine = true\n    if (marker.collapsed)\n      regChange(cm, from.line, to.line + 1)\n    else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||\n             marker.attributes || marker.title)\n      for (let i = from.line; i <= to.line; i++) regLineChange(cm, i, \"text\")\n    if (marker.atomic) reCheckSelection(cm.doc)\n    signalLater(cm, \"markerAdded\", cm, marker)\n  }\n  return marker\n}\n\n// SHARED TEXTMARKERS\n\n// A shared marker spans multiple linked documents. It is\n// implemented as a meta-marker-object controlling multiple normal\n// markers.\nexport class SharedTextMarker {\n  constructor(markers, primary) {\n    this.markers = markers\n    this.primary = primary\n    for (let i = 0; i < markers.length; ++i)\n      markers[i].parent = this\n  }\n\n  clear() {\n    if (this.explicitlyCleared) return\n    this.explicitlyCleared = true\n    for (let i = 0; i < this.markers.length; ++i)\n      this.markers[i].clear()\n    signalLater(this, \"clear\")\n  }\n\n  find(side, lineObj) {\n    return this.primary.find(side, lineObj)\n  }\n}\neventMixin(SharedTextMarker)\n\nfunction markTextShared(doc, from, to, options, type) {\n  options = copyObj(options)\n  options.shared = false\n  let markers = [markText(doc, from, to, options, type)], primary = markers[0]\n  let widget = options.widgetNode\n  linkedDocs(doc, doc => {\n    if (widget) options.widgetNode = widget.cloneNode(true)\n    markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type))\n    for (let i = 0; i < doc.linked.length; ++i)\n      if (doc.linked[i].isParent) return\n    primary = lst(markers)\n  })\n  return new SharedTextMarker(markers, primary)\n}\n\nexport function findSharedMarkers(doc) {\n  return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), m => m.parent)\n}\n\nexport function copySharedMarkers(doc, markers) {\n  for (let i = 0; i < markers.length; i++) {\n    let marker = markers[i], pos = marker.find()\n    let mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to)\n    if (cmp(mFrom, mTo)) {\n      let subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type)\n      marker.markers.push(subMark)\n      subMark.parent = marker\n    }\n  }\n}\n\nexport function detachSharedMarkers(markers) {\n  for (let i = 0; i < markers.length; i++) {\n    let marker = markers[i], linked = [marker.primary.doc]\n    linkedDocs(marker.primary.doc, d => linked.push(d))\n    for (let j = 0; j < marker.markers.length; j++) {\n      let subMarker = marker.markers[j]\n      if (indexOf(linked, subMarker.doc) == -1) {\n        subMarker.parent = null\n        marker.markers.splice(j--, 1)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/model/selection.js",
    "content": "import { cmp, copyPos, equalCursorPos, maxPos, minPos } from \"../line/pos.js\"\nimport { indexOf } from \"../util/misc.js\"\n\n// Selection objects are immutable. A new one is created every time\n// the selection changes. A selection is one or more non-overlapping\n// (and non-touching) ranges, sorted, and an integer that indicates\n// which one is the primary selection (the one that's scrolled into\n// view, that getCursor returns, etc).\nexport class Selection {\n  constructor(ranges, primIndex) {\n    this.ranges = ranges\n    this.primIndex = primIndex\n  }\n\n  primary() { return this.ranges[this.primIndex] }\n\n  equals(other) {\n    if (other == this) return true\n    if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false\n    for (let i = 0; i < this.ranges.length; i++) {\n      let here = this.ranges[i], there = other.ranges[i]\n      if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) return false\n    }\n    return true\n  }\n\n  deepCopy() {\n    let out = []\n    for (let i = 0; i < this.ranges.length; i++)\n      out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head))\n    return new Selection(out, this.primIndex)\n  }\n\n  somethingSelected() {\n    for (let i = 0; i < this.ranges.length; i++)\n      if (!this.ranges[i].empty()) return true\n    return false\n  }\n\n  contains(pos, end) {\n    if (!end) end = pos\n    for (let i = 0; i < this.ranges.length; i++) {\n      let range = this.ranges[i]\n      if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n        return i\n    }\n    return -1\n  }\n}\n\nexport class Range {\n  constructor(anchor, head) {\n    this.anchor = anchor; this.head = head\n  }\n\n  from() { return minPos(this.anchor, this.head) }\n  to() { return maxPos(this.anchor, this.head) }\n  empty() { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }\n}\n\n// Take an unsorted, potentially overlapping set of ranges, and\n// build a selection out of it. 'Consumes' ranges array (modifying\n// it).\nexport function normalizeSelection(cm, ranges, primIndex) {\n  let mayTouch = cm && cm.options.selectionsMayTouch\n  let prim = ranges[primIndex]\n  ranges.sort((a, b) => cmp(a.from(), b.from()))\n  primIndex = indexOf(ranges, prim)\n  for (let i = 1; i < ranges.length; i++) {\n    let cur = ranges[i], prev = ranges[i - 1]\n    let diff = cmp(prev.to(), cur.from())\n    if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {\n      let from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to())\n      let inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head\n      if (i <= primIndex) --primIndex\n      ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to))\n    }\n  }\n  return new Selection(ranges, primIndex)\n}\n\nexport function simpleSelection(anchor, head) {\n  return new Selection([new Range(anchor, head || anchor)], 0)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/model/selection_updates.js",
    "content": "import { signalLater } from \"../util/operation_group.js\"\nimport { ensureCursorVisible } from \"../display/scrolling.js\"\nimport { clipPos, cmp, Pos } from \"../line/pos.js\"\nimport { getLine } from \"../line/utils_line.js\"\nimport { hasHandler, signal, signalCursorActivity } from \"../util/event.js\"\nimport { lst, sel_dontScroll } from \"../util/misc.js\"\n\nimport { addSelectionToHistory } from \"./history.js\"\nimport { normalizeSelection, Range, Selection, simpleSelection } from \"./selection.js\"\n\n// The 'scroll' parameter given to many of these indicated whether\n// the new cursor position should be scrolled into view after\n// modifying the selection.\n\n// If shift is held or the extend flag is set, extends a range to\n// include a given position (and optionally a second position).\n// Otherwise, simply returns the range between the given positions.\n// Used for cursor motion and such.\nexport function extendRange(range, head, other, extend) {\n  if (extend) {\n    let anchor = range.anchor\n    if (other) {\n      let posBefore = cmp(head, anchor) < 0\n      if (posBefore != (cmp(other, anchor) < 0)) {\n        anchor = head\n        head = other\n      } else if (posBefore != (cmp(head, other) < 0)) {\n        head = other\n      }\n    }\n    return new Range(anchor, head)\n  } else {\n    return new Range(other || head, head)\n  }\n}\n\n// Extend the primary selection range, discard the rest.\nexport function extendSelection(doc, head, other, options, extend) {\n  if (extend == null) extend = doc.cm && (doc.cm.display.shift || doc.extend)\n  setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options)\n}\n\n// Extend all selections (pos is an array of selections with length\n// equal the number of selections)\nexport function extendSelections(doc, heads, options) {\n  let out = []\n  let extend = doc.cm && (doc.cm.display.shift || doc.extend)\n  for (let i = 0; i < doc.sel.ranges.length; i++)\n    out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend)\n  let newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex)\n  setSelection(doc, newSel, options)\n}\n\n// Updates a single range in the selection.\nexport function replaceOneSelection(doc, i, range, options) {\n  let ranges = doc.sel.ranges.slice(0)\n  ranges[i] = range\n  setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options)\n}\n\n// Reset the selection to a single range.\nexport function setSimpleSelection(doc, anchor, head, options) {\n  setSelection(doc, simpleSelection(anchor, head), options)\n}\n\n// Give beforeSelectionChange handlers a change to influence a\n// selection update.\nfunction filterSelectionChange(doc, sel, options) {\n  let obj = {\n    ranges: sel.ranges,\n    update: function(ranges) {\n      this.ranges = []\n      for (let i = 0; i < ranges.length; i++)\n        this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n                                   clipPos(doc, ranges[i].head))\n    },\n    origin: options && options.origin\n  }\n  signal(doc, \"beforeSelectionChange\", doc, obj)\n  if (doc.cm) signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj)\n  if (obj.ranges != sel.ranges) return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1)\n  else return sel\n}\n\nexport function setSelectionReplaceHistory(doc, sel, options) {\n  let done = doc.history.done, last = lst(done)\n  if (last && last.ranges) {\n    done[done.length - 1] = sel\n    setSelectionNoUndo(doc, sel, options)\n  } else {\n    setSelection(doc, sel, options)\n  }\n}\n\n// Set a new selection.\nexport function setSelection(doc, sel, options) {\n  setSelectionNoUndo(doc, sel, options)\n  addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options)\n}\n\nexport function setSelectionNoUndo(doc, sel, options) {\n  if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n    sel = filterSelectionChange(doc, sel, options)\n\n  let bias = options && options.bias ||\n    (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1)\n  setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true))\n\n  if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption(\"readOnly\") != \"nocursor\")\n    ensureCursorVisible(doc.cm)\n}\n\nfunction setSelectionInner(doc, sel) {\n  if (sel.equals(doc.sel)) return\n\n  doc.sel = sel\n\n  if (doc.cm) {\n    doc.cm.curOp.updateInput = 1\n    doc.cm.curOp.selectionChanged = true\n    signalCursorActivity(doc.cm)\n  }\n  signalLater(doc, \"cursorActivity\", doc)\n}\n\n// Verify that the selection does not partially select any atomic\n// marked ranges.\nexport function reCheckSelection(doc) {\n  setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false))\n}\n\n// Return a selection that does not partially select any atomic\n// ranges.\nfunction skipAtomicInSelection(doc, sel, bias, mayClear) {\n  let out\n  for (let i = 0; i < sel.ranges.length; i++) {\n    let range = sel.ranges[i]\n    let old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]\n    let newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear)\n    let newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear)\n    if (out || newAnchor != range.anchor || newHead != range.head) {\n      if (!out) out = sel.ranges.slice(0, i)\n      out[i] = new Range(newAnchor, newHead)\n    }\n  }\n  return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel\n}\n\nfunction skipAtomicInner(doc, pos, oldPos, dir, mayClear) {\n  let line = getLine(doc, pos.line)\n  if (line.markedSpans) for (let i = 0; i < line.markedSpans.length; ++i) {\n    let sp = line.markedSpans[i], m = sp.marker\n\n    // Determine if we should prevent the cursor being placed to the left/right of an atomic marker\n    // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it\n    // is with selectLeft/Right\n    let preventCursorLeft = (\"selectLeft\" in m) ? !m.selectLeft : m.inclusiveLeft\n    let preventCursorRight = (\"selectRight\" in m) ? !m.selectRight : m.inclusiveRight\n\n    if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n        (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n      if (mayClear) {\n        signal(m, \"beforeCursorEnter\")\n        if (m.explicitlyCleared) {\n          if (!line.markedSpans) break\n          else {--i; continue}\n        }\n      }\n      if (!m.atomic) continue\n\n      if (oldPos) {\n        let near = m.find(dir < 0 ? 1 : -1), diff\n        if (dir < 0 ? preventCursorRight : preventCursorLeft)\n          near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null)\n        if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))\n          return skipAtomicInner(doc, near, pos, dir, mayClear)\n      }\n\n      let far = m.find(dir < 0 ? -1 : 1)\n      if (dir < 0 ? preventCursorLeft : preventCursorRight)\n        far = movePos(doc, far, dir, far.line == pos.line ? line : null)\n      return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null\n    }\n  }\n  return pos\n}\n\n// Ensure a given position is not inside an atomic range.\nexport function skipAtomic(doc, pos, oldPos, bias, mayClear) {\n  let dir = bias || 1\n  let found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||\n      (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||\n      skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||\n      (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true))\n  if (!found) {\n    doc.cantEdit = true\n    return Pos(doc.first, 0)\n  }\n  return found\n}\n\nfunction movePos(doc, pos, dir, line) {\n  if (dir < 0 && pos.ch == 0) {\n    if (pos.line > doc.first) return clipPos(doc, Pos(pos.line - 1))\n    else return null\n  } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {\n    if (pos.line < doc.first + doc.size - 1) return Pos(pos.line + 1, 0)\n    else return null\n  } else {\n    return new Pos(pos.line, pos.ch + dir)\n  }\n}\n\nexport function selectAll(cm) {\n  cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll)\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/modes.js",
    "content": "import { copyObj, createObj } from \"./util/misc.js\"\n\n// Known modes, by name and by MIME\nexport let modes = {}, mimeModes = {}\n\n// Extra arguments are stored as the mode's dependencies, which is\n// used by (legacy) mechanisms like loadmode.js to automatically\n// load a mode. (Preferred mechanism is the require/define calls.)\nexport function defineMode(name, mode) {\n  if (arguments.length > 2)\n    mode.dependencies = Array.prototype.slice.call(arguments, 2)\n  modes[name] = mode\n}\n\nexport function defineMIME(mime, spec) {\n  mimeModes[mime] = spec\n}\n\n// Given a MIME type, a {name, ...options} config object, or a name\n// string, return a mode config object.\nexport function resolveMode(spec) {\n  if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n    spec = mimeModes[spec]\n  } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n    let found = mimeModes[spec.name]\n    if (typeof found == \"string\") found = {name: found}\n    spec = createObj(found, spec)\n    spec.name = found.name\n  } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n    return resolveMode(\"application/xml\")\n  } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n    return resolveMode(\"application/json\")\n  }\n  if (typeof spec == \"string\") return {name: spec}\n  else return spec || {name: \"null\"}\n}\n\n// Given a mode spec (anything that resolveMode accepts), find and\n// initialize an actual mode object.\nexport function getMode(options, spec) {\n  spec = resolveMode(spec)\n  let mfactory = modes[spec.name]\n  if (!mfactory) return getMode(options, \"text/plain\")\n  let modeObj = mfactory(options, spec)\n  if (modeExtensions.hasOwnProperty(spec.name)) {\n    let exts = modeExtensions[spec.name]\n    for (let prop in exts) {\n      if (!exts.hasOwnProperty(prop)) continue\n      if (modeObj.hasOwnProperty(prop)) modeObj[\"_\" + prop] = modeObj[prop]\n      modeObj[prop] = exts[prop]\n    }\n  }\n  modeObj.name = spec.name\n  if (spec.helperType) modeObj.helperType = spec.helperType\n  if (spec.modeProps) for (let prop in spec.modeProps)\n    modeObj[prop] = spec.modeProps[prop]\n\n  return modeObj\n}\n\n// This can be used to attach properties to mode objects from\n// outside the actual mode definition.\nexport let modeExtensions = {}\nexport function extendMode(mode, properties) {\n  let exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {})\n  copyObj(properties, exts)\n}\n\nexport function copyState(mode, state) {\n  if (state === true) return state\n  if (mode.copyState) return mode.copyState(state)\n  let nstate = {}\n  for (let n in state) {\n    let val = state[n]\n    if (val instanceof Array) val = val.concat([])\n    nstate[n] = val\n  }\n  return nstate\n}\n\n// Given a mode and a state (for that mode), find the inner mode and\n// state at the position that the state refers to.\nexport function innerMode(mode, state) {\n  let info\n  while (mode.innerMode) {\n    info = mode.innerMode(state)\n    if (!info || info.mode == mode) break\n    state = info.state\n    mode = info.mode\n  }\n  return info || {mode: mode, state: state}\n}\n\nexport function startState(mode, a1, a2) {\n  return mode.startState ? mode.startState(a1, a2) : true\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/util/StringStream.js",
    "content": "import { countColumn } from \"./misc.js\"\n\n// STRING STREAM\n\n// Fed to the mode parsers, provides helper functions to make\n// parsers more succinct.\n\nclass StringStream {\n  constructor(string, tabSize, lineOracle) {\n    this.pos = this.start = 0\n    this.string = string\n    this.tabSize = tabSize || 8\n    this.lastColumnPos = this.lastColumnValue = 0\n    this.lineStart = 0\n    this.lineOracle = lineOracle\n  }\n\n  eol() {return this.pos >= this.string.length}\n  sol() {return this.pos == this.lineStart}\n  peek() {return this.string.charAt(this.pos) || undefined}\n  next() {\n    if (this.pos < this.string.length)\n      return this.string.charAt(this.pos++)\n  }\n  eat(match) {\n    let ch = this.string.charAt(this.pos)\n    let ok\n    if (typeof match == \"string\") ok = ch == match\n    else ok = ch && (match.test ? match.test(ch) : match(ch))\n    if (ok) {++this.pos; return ch}\n  }\n  eatWhile(match) {\n    let start = this.pos\n    while (this.eat(match)){}\n    return this.pos > start\n  }\n  eatSpace() {\n    let start = this.pos\n    while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos\n    return this.pos > start\n  }\n  skipToEnd() {this.pos = this.string.length}\n  skipTo(ch) {\n    let found = this.string.indexOf(ch, this.pos)\n    if (found > -1) {this.pos = found; return true}\n  }\n  backUp(n) {this.pos -= n}\n  column() {\n    if (this.lastColumnPos < this.start) {\n      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue)\n      this.lastColumnPos = this.start\n    }\n    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  }\n  indentation() {\n    return countColumn(this.string, null, this.tabSize) -\n      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  }\n  match(pattern, consume, caseInsensitive) {\n    if (typeof pattern == \"string\") {\n      let cased = str => caseInsensitive ? str.toLowerCase() : str\n      let substr = this.string.substr(this.pos, pattern.length)\n      if (cased(substr) == cased(pattern)) {\n        if (consume !== false) this.pos += pattern.length\n        return true\n      }\n    } else {\n      let match = this.string.slice(this.pos).match(pattern)\n      if (match && match.index > 0) return null\n      if (match && consume !== false) this.pos += match[0].length\n      return match\n    }\n  }\n  current(){return this.string.slice(this.start, this.pos)}\n  hideFirstChars(n, inner) {\n    this.lineStart += n\n    try { return inner() }\n    finally { this.lineStart -= n }\n  }\n  lookAhead(n) {\n    let oracle = this.lineOracle\n    return oracle && oracle.lookAhead(n)\n  }\n  baseToken() {\n    let oracle = this.lineOracle\n    return oracle && oracle.baseToken(this.pos)\n  }\n}\n\nexport default StringStream\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/util/bidi.js",
    "content": "import { lst } from \"./misc.js\"\n\n// BIDI HELPERS\n\nexport function iterateBidiSections(order, from, to, f) {\n  if (!order) return f(from, to, \"ltr\", 0)\n  let found = false\n  for (let i = 0; i < order.length; ++i) {\n    let part = order[i]\n    if (part.from < to && part.to > from || from == to && part.to == from) {\n      f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\", i)\n      found = true\n    }\n  }\n  if (!found) f(from, to, \"ltr\")\n}\n\nexport let bidiOther = null\nexport function getBidiPartAt(order, ch, sticky) {\n  let found\n  bidiOther = null\n  for (let i = 0; i < order.length; ++i) {\n    let cur = order[i]\n    if (cur.from < ch && cur.to > ch) return i\n    if (cur.to == ch) {\n      if (cur.from != cur.to && sticky == \"before\") found = i\n      else bidiOther = i\n    }\n    if (cur.from == ch) {\n      if (cur.from != cur.to && sticky != \"before\") found = i\n      else bidiOther = i\n    }\n  }\n  return found != null ? found : bidiOther\n}\n\n// Bidirectional ordering algorithm\n// See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n// that this (partially) implements.\n\n// One-char codes used for character types:\n// L (L):   Left-to-Right\n// R (R):   Right-to-Left\n// r (AL):  Right-to-Left Arabic\n// 1 (EN):  European Number\n// + (ES):  European Number Separator\n// % (ET):  European Number Terminator\n// n (AN):  Arabic Number\n// , (CS):  Common Number Separator\n// m (NSM): Non-Spacing Mark\n// b (BN):  Boundary Neutral\n// s (B):   Paragraph Separator\n// t (S):   Segment Separator\n// w (WS):  Whitespace\n// N (ON):  Other Neutrals\n\n// Returns null if characters are ordered as they appear\n// (left-to-right), or an array of sections ({from, to, level}\n// objects) in the order in which they occur visually.\nlet bidiOrdering = (function() {\n  // Character types for codepoints 0 to 0xff\n  let lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\"\n  // Character types for codepoints 0x600 to 0x6f9\n  let arabicTypes = \"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\"\n  function charType(code) {\n    if (code <= 0xf7) return lowTypes.charAt(code)\n    else if (0x590 <= code && code <= 0x5f4) return \"R\"\n    else if (0x600 <= code && code <= 0x6f9) return arabicTypes.charAt(code - 0x600)\n    else if (0x6ee <= code && code <= 0x8ac) return \"r\"\n    else if (0x2000 <= code && code <= 0x200b) return \"w\"\n    else if (code == 0x200c) return \"b\"\n    else return \"L\"\n  }\n\n  let bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/\n  let isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/\n\n  function BidiSpan(level, from, to) {\n    this.level = level\n    this.from = from; this.to = to\n  }\n\n  return function(str, direction) {\n    let outerType = direction == \"ltr\" ? \"L\" : \"R\"\n\n    if (str.length == 0 || direction == \"ltr\" && !bidiRE.test(str)) return false\n    let len = str.length, types = []\n    for (let i = 0; i < len; ++i)\n      types.push(charType(str.charCodeAt(i)))\n\n    // W1. Examine each non-spacing mark (NSM) in the level run, and\n    // change the type of the NSM to the type of the previous\n    // character. If the NSM is at the start of the level run, it will\n    // get the type of sor.\n    for (let i = 0, prev = outerType; i < len; ++i) {\n      let type = types[i]\n      if (type == \"m\") types[i] = prev\n      else prev = type\n    }\n\n    // W2. Search backwards from each instance of a European number\n    // until the first strong type (R, L, AL, or sor) is found. If an\n    // AL is found, change the type of the European number to Arabic\n    // number.\n    // W3. Change all ALs to R.\n    for (let i = 0, cur = outerType; i < len; ++i) {\n      let type = types[i]\n      if (type == \"1\" && cur == \"r\") types[i] = \"n\"\n      else if (isStrong.test(type)) { cur = type; if (type == \"r\") types[i] = \"R\" }\n    }\n\n    // W4. A single European separator between two European numbers\n    // changes to a European number. A single common separator between\n    // two numbers of the same type changes to that type.\n    for (let i = 1, prev = types[0]; i < len - 1; ++i) {\n      let type = types[i]\n      if (type == \"+\" && prev == \"1\" && types[i+1] == \"1\") types[i] = \"1\"\n      else if (type == \",\" && prev == types[i+1] &&\n               (prev == \"1\" || prev == \"n\")) types[i] = prev\n      prev = type\n    }\n\n    // W5. A sequence of European terminators adjacent to European\n    // numbers changes to all European numbers.\n    // W6. Otherwise, separators and terminators change to Other\n    // Neutral.\n    for (let i = 0; i < len; ++i) {\n      let type = types[i]\n      if (type == \",\") types[i] = \"N\"\n      else if (type == \"%\") {\n        let end\n        for (end = i + 1; end < len && types[end] == \"%\"; ++end) {}\n        let replace = (i && types[i-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\"\n        for (let j = i; j < end; ++j) types[j] = replace\n        i = end - 1\n      }\n    }\n\n    // W7. Search backwards from each instance of a European number\n    // until the first strong type (R, L, or sor) is found. If an L is\n    // found, then change the type of the European number to L.\n    for (let i = 0, cur = outerType; i < len; ++i) {\n      let type = types[i]\n      if (cur == \"L\" && type == \"1\") types[i] = \"L\"\n      else if (isStrong.test(type)) cur = type\n    }\n\n    // N1. A sequence of neutrals takes the direction of the\n    // surrounding strong text if the text on both sides has the same\n    // direction. European and Arabic numbers act as if they were R in\n    // terms of their influence on neutrals. Start-of-level-run (sor)\n    // and end-of-level-run (eor) are used at level run boundaries.\n    // N2. Any remaining neutrals take the embedding direction.\n    for (let i = 0; i < len; ++i) {\n      if (isNeutral.test(types[i])) {\n        let end\n        for (end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}\n        let before = (i ? types[i-1] : outerType) == \"L\"\n        let after = (end < len ? types[end] : outerType) == \"L\"\n        let replace = before == after ? (before ? \"L\" : \"R\") : outerType\n        for (let j = i; j < end; ++j) types[j] = replace\n        i = end - 1\n      }\n    }\n\n    // Here we depart from the documented algorithm, in order to avoid\n    // building up an actual levels array. Since there are only three\n    // levels (0, 1, 2) in an implementation that doesn't take\n    // explicit embedding into account, we can build up the order on\n    // the fly, without following the level-based algorithm.\n    let order = [], m\n    for (let i = 0; i < len;) {\n      if (countsAsLeft.test(types[i])) {\n        let start = i\n        for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}\n        order.push(new BidiSpan(0, start, i))\n      } else {\n        let pos = i, at = order.length, isRTL = direction == \"rtl\" ? 1 : 0\n        for (++i; i < len && types[i] != \"L\"; ++i) {}\n        for (let j = pos; j < i;) {\n          if (countsAsNum.test(types[j])) {\n            if (pos < j) { order.splice(at, 0, new BidiSpan(1, pos, j)); at += isRTL }\n            let nstart = j\n            for (++j; j < i && countsAsNum.test(types[j]); ++j) {}\n            order.splice(at, 0, new BidiSpan(2, nstart, j))\n            at += isRTL\n            pos = j\n          } else ++j\n        }\n        if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i))\n      }\n    }\n    if (direction == \"ltr\") {\n      if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n        order[0].from = m[0].length\n        order.unshift(new BidiSpan(0, 0, m[0].length))\n      }\n      if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n        lst(order).to -= m[0].length\n        order.push(new BidiSpan(0, len - m[0].length, len))\n      }\n    }\n\n    return direction == \"rtl\" ? order.reverse() : order\n  }\n})()\n\n// Get the bidi ordering for the given line (and cache it). Returns\n// false for lines that are fully left-to-right, and an array of\n// BidiSpan objects otherwise.\nexport function getOrder(line, direction) {\n  let order = line.order\n  if (order == null) order = line.order = bidiOrdering(line.text, direction)\n  return order\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/util/browser.js",
    "content": "// Kludges for bugs and behavior differences that can't be feature\n// detected are enabled based on userAgent etc sniffing.\nlet userAgent = navigator.userAgent\nlet platform = navigator.platform\n\nexport let gecko = /gecko\\/\\d/i.test(userAgent)\nlet ie_upto10 = /MSIE \\d/.test(userAgent)\nlet ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent)\nlet edge = /Edge\\/(\\d+)/.exec(userAgent)\nexport let ie = ie_upto10 || ie_11up || edge\nexport let ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1])\nexport let webkit = !edge && /WebKit\\//.test(userAgent)\nlet qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent)\nexport let chrome = !edge && /Chrome\\//.test(userAgent)\nexport let presto = /Opera\\//.test(userAgent)\nexport let safari = /Apple Computer/.test(navigator.vendor)\nexport let mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent)\nexport let phantom = /PhantomJS/.test(userAgent)\n\nexport let ios = safari && (/Mobile\\/\\w+/.test(userAgent) || navigator.maxTouchPoints > 2)\nexport let android = /Android/.test(userAgent)\n// This is woefully incomplete. Suggestions for alternative methods welcome.\nexport let mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent)\nexport let mac = ios || /Mac/.test(platform)\nexport let chromeOS = /\\bCrOS\\b/.test(userAgent)\nexport let windows = /win/i.test(platform)\n\nlet presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/)\nif (presto_version) presto_version = Number(presto_version[1])\nif (presto_version && presto_version >= 15) { presto = false; webkit = true }\n// Some browsers use the wrong event properties to signal cmd/ctrl on OS X\nexport let flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11))\nexport let captureRightClick = gecko || (ie && ie_version >= 9)\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/util/dom.js",
    "content": "import { ie, ios } from \"./browser.js\"\n\nexport function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\nexport let rmClass = function(node, cls) {\n  let current = node.className\n  let match = classTest(cls).exec(current)\n  if (match) {\n    let after = current.slice(match.index + match[0].length)\n    node.className = current.slice(0, match.index) + (after ? match[1] + after : \"\")\n  }\n}\n\nexport function removeChildren(e) {\n  for (let count = e.childNodes.length; count > 0; --count)\n    e.removeChild(e.firstChild)\n  return e\n}\n\nexport function removeChildrenAndAdd(parent, e) {\n  return removeChildren(parent).appendChild(e)\n}\n\nexport function elt(tag, content, className, style) {\n  let e = document.createElement(tag)\n  if (className) e.className = className\n  if (style) e.style.cssText = style\n  if (typeof content == \"string\") e.appendChild(document.createTextNode(content))\n  else if (content) for (let i = 0; i < content.length; ++i) e.appendChild(content[i])\n  return e\n}\n// wrapper for elt, which removes the elt from the accessibility tree\nexport function eltP(tag, content, className, style) {\n  let e = elt(tag, content, className, style)\n  e.setAttribute(\"role\", \"presentation\")\n  return e\n}\n\nexport let range\nif (document.createRange) range = function(node, start, end, endNode) {\n  let r = document.createRange()\n  r.setEnd(endNode || node, end)\n  r.setStart(node, start)\n  return r\n}\nelse range = function(node, start, end) {\n  let r = document.body.createTextRange()\n  try { r.moveToElementText(node.parentNode) }\n  catch(e) { return r }\n  r.collapse(true)\n  r.moveEnd(\"character\", end)\n  r.moveStart(\"character\", start)\n  return r\n}\n\nexport function contains(parent, child) {\n  if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n    child = child.parentNode\n  if (parent.contains)\n    return parent.contains(child)\n  do {\n    if (child.nodeType == 11) child = child.host\n    if (child == parent) return true\n  } while (child = child.parentNode)\n}\n\nexport function activeElt() {\n  // IE and Edge may throw an \"Unspecified Error\" when accessing document.activeElement.\n  // IE < 10 will throw when accessed while the page is loading or in an iframe.\n  // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.\n  let activeElement\n  try {\n    activeElement = document.activeElement\n  } catch(e) {\n    activeElement = document.body || null\n  }\n  while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)\n    activeElement = activeElement.shadowRoot.activeElement\n  return activeElement\n}\n\nexport function addClass(node, cls) {\n  let current = node.className\n  if (!classTest(cls).test(current)) node.className += (current ? \" \" : \"\") + cls\n}\nexport function joinClasses(a, b) {\n  let as = a.split(\" \")\n  for (let i = 0; i < as.length; i++)\n    if (as[i] && !classTest(as[i]).test(b)) b += \" \" + as[i]\n  return b\n}\n\nexport let selectInput = function(node) { node.select() }\nif (ios) // Mobile Safari apparently has a bug where select() is broken.\n  selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length }\nelse if (ie) // Suppress mysterious IE10 errors\n  selectInput = function(node) { try { node.select() } catch(_e) {} }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/util/event.js",
    "content": "import { mac } from \"./browser.js\"\nimport { indexOf } from \"./misc.js\"\n\n// EVENT HANDLING\n\n// Lightweight event framework. on/off also work on DOM nodes,\n// registering native DOM handlers.\n\nconst noHandlers = []\n\nexport let on = function(emitter, type, f) {\n  if (emitter.addEventListener) {\n    emitter.addEventListener(type, f, false)\n  } else if (emitter.attachEvent) {\n    emitter.attachEvent(\"on\" + type, f)\n  } else {\n    let map = emitter._handlers || (emitter._handlers = {})\n    map[type] = (map[type] || noHandlers).concat(f)\n  }\n}\n\nexport function getHandlers(emitter, type) {\n  return emitter._handlers && emitter._handlers[type] || noHandlers\n}\n\nexport function off(emitter, type, f) {\n  if (emitter.removeEventListener) {\n    emitter.removeEventListener(type, f, false)\n  } else if (emitter.detachEvent) {\n    emitter.detachEvent(\"on\" + type, f)\n  } else {\n    let map = emitter._handlers, arr = map && map[type]\n    if (arr) {\n      let index = indexOf(arr, f)\n      if (index > -1)\n        map[type] = arr.slice(0, index).concat(arr.slice(index + 1))\n    }\n  }\n}\n\nexport function signal(emitter, type /*, values...*/) {\n  let handlers = getHandlers(emitter, type)\n  if (!handlers.length) return\n  let args = Array.prototype.slice.call(arguments, 2)\n  for (let i = 0; i < handlers.length; ++i) handlers[i].apply(null, args)\n}\n\n// The DOM events that CodeMirror handles can be overridden by\n// registering a (non-DOM) handler on the editor for the event name,\n// and preventDefault-ing the event in that handler.\nexport function signalDOMEvent(cm, e, override) {\n  if (typeof e == \"string\")\n    e = {type: e, preventDefault: function() { this.defaultPrevented = true }}\n  signal(cm, override || e.type, cm, e)\n  return e_defaultPrevented(e) || e.codemirrorIgnore\n}\n\nexport function signalCursorActivity(cm) {\n  let arr = cm._handlers && cm._handlers.cursorActivity\n  if (!arr) return\n  let set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = [])\n  for (let i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)\n    set.push(arr[i])\n}\n\nexport function hasHandler(emitter, type) {\n  return getHandlers(emitter, type).length > 0\n}\n\n// Add on and off methods to a constructor's prototype, to make\n// registering events on such objects more convenient.\nexport function eventMixin(ctor) {\n  ctor.prototype.on = function(type, f) {on(this, type, f)}\n  ctor.prototype.off = function(type, f) {off(this, type, f)}\n}\n\n// Due to the fact that we still support jurassic IE versions, some\n// compatibility wrappers are needed.\n\nexport function e_preventDefault(e) {\n  if (e.preventDefault) e.preventDefault()\n  else e.returnValue = false\n}\nexport function e_stopPropagation(e) {\n  if (e.stopPropagation) e.stopPropagation()\n  else e.cancelBubble = true\n}\nexport function e_defaultPrevented(e) {\n  return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false\n}\nexport function e_stop(e) {e_preventDefault(e); e_stopPropagation(e)}\n\nexport function e_target(e) {return e.target || e.srcElement}\nexport function e_button(e) {\n  let b = e.which\n  if (b == null) {\n    if (e.button & 1) b = 1\n    else if (e.button & 2) b = 3\n    else if (e.button & 4) b = 2\n  }\n  if (mac && e.ctrlKey && b == 1) b = 3\n  return b\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/util/feature_detection.js",
    "content": "import { elt, range, removeChildren, removeChildrenAndAdd } from \"./dom.js\"\nimport { ie, ie_version } from \"./browser.js\"\n\n// Detect drag-and-drop\nexport let dragAndDrop = function() {\n  // There is *some* kind of drag-and-drop support in IE6-8, but I\n  // couldn't get it to work yet.\n  if (ie && ie_version < 9) return false\n  let div = elt('div')\n  return \"draggable\" in div || \"dragDrop\" in div\n}()\n\nlet zwspSupported\nexport function zeroWidthElement(measure) {\n  if (zwspSupported == null) {\n    let test = elt(\"span\", \"\\u200b\")\n    removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]))\n    if (measure.firstChild.offsetHeight != 0)\n      zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8)\n  }\n  let node = zwspSupported ? elt(\"span\", \"\\u200b\") :\n    elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\")\n  node.setAttribute(\"cm-text\", \"\")\n  return node\n}\n\n// Feature-detect IE's crummy client rect reporting for bidi text\nlet badBidiRects\nexport function hasBadBidiRects(measure) {\n  if (badBidiRects != null) return badBidiRects\n  let txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"))\n  let r0 = range(txt, 0, 1).getBoundingClientRect()\n  let r1 = range(txt, 1, 2).getBoundingClientRect()\n  removeChildren(measure)\n  if (!r0 || r0.left == r0.right) return false // Safari returns null in some cases (#2780)\n  return badBidiRects = (r1.right - r0.right < 3)\n}\n\n// See if \"\".split is the broken IE version, if so, provide an\n// alternative way to split lines.\nexport let splitLinesAuto = \"\\n\\nb\".split(/\\n/).length != 3 ? string => {\n  let pos = 0, result = [], l = string.length\n  while (pos <= l) {\n    let nl = string.indexOf(\"\\n\", pos)\n    if (nl == -1) nl = string.length\n    let line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl)\n    let rt = line.indexOf(\"\\r\")\n    if (rt != -1) {\n      result.push(line.slice(0, rt))\n      pos += rt + 1\n    } else {\n      result.push(line)\n      pos = nl + 1\n    }\n  }\n  return result\n} : string => string.split(/\\r\\n?|\\n/)\n\nexport let hasSelection = window.getSelection ? te => {\n  try { return te.selectionStart != te.selectionEnd }\n  catch(e) { return false }\n} : te => {\n  let range\n  try {range = te.ownerDocument.selection.createRange()}\n  catch(e) {}\n  if (!range || range.parentElement() != te) return false\n  return range.compareEndPoints(\"StartToEnd\", range) != 0\n}\n\nexport let hasCopyEvent = (() => {\n  let e = elt(\"div\")\n  if (\"oncopy\" in e) return true\n  e.setAttribute(\"oncopy\", \"return;\")\n  return typeof e.oncopy == \"function\"\n})()\n\nlet badZoomedRects = null\nexport function hasBadZoomedRects(measure) {\n  if (badZoomedRects != null) return badZoomedRects\n  let node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"))\n  let normal = node.getBoundingClientRect()\n  let fromRange = range(node, 0, 1).getBoundingClientRect()\n  return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/util/misc.js",
    "content": "export function bind(f) {\n  let args = Array.prototype.slice.call(arguments, 1)\n  return function(){return f.apply(null, args)}\n}\n\nexport function copyObj(obj, target, overwrite) {\n  if (!target) target = {}\n  for (let prop in obj)\n    if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n      target[prop] = obj[prop]\n  return target\n}\n\n// Counts the column offset in a string, taking tabs into account.\n// Used mostly to find indentation.\nexport function countColumn(string, end, tabSize, startIndex, startValue) {\n  if (end == null) {\n    end = string.search(/[^\\s\\u00a0]/)\n    if (end == -1) end = string.length\n  }\n  for (let i = startIndex || 0, n = startValue || 0;;) {\n    let nextTab = string.indexOf(\"\\t\", i)\n    if (nextTab < 0 || nextTab >= end)\n      return n + (end - i)\n    n += nextTab - i\n    n += tabSize - (n % tabSize)\n    i = nextTab + 1\n  }\n}\n\nexport class Delayed {\n  constructor() {\n    this.id = null\n    this.f = null\n    this.time = 0\n    this.handler = bind(this.onTimeout, this)\n  }\n  onTimeout(self) {\n    self.id = 0\n    if (self.time <= +new Date) {\n      self.f()\n    } else {\n      setTimeout(self.handler, self.time - +new Date)\n    }\n  }\n  set(ms, f) {\n    this.f = f\n    const time = +new Date + ms\n    if (!this.id || time < this.time) {\n      clearTimeout(this.id)\n      this.id = setTimeout(this.handler, ms)\n      this.time = time\n    }\n  }\n}\n\nexport function indexOf(array, elt) {\n  for (let i = 0; i < array.length; ++i)\n    if (array[i] == elt) return i\n  return -1\n}\n\n// Number of pixels added to scroller and sizer to hide scrollbar\nexport let scrollerGap = 50\n\n// Returned or thrown by various protocols to signal 'I'm not\n// handling this'.\nexport let Pass = {toString: function(){return \"CodeMirror.Pass\"}}\n\n// Reused option objects for setSelection & friends\nexport let sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"}\n\n// The inverse of countColumn -- find the offset that corresponds to\n// a particular column.\nexport function findColumn(string, goal, tabSize) {\n  for (let pos = 0, col = 0;;) {\n    let nextTab = string.indexOf(\"\\t\", pos)\n    if (nextTab == -1) nextTab = string.length\n    let skipped = nextTab - pos\n    if (nextTab == string.length || col + skipped >= goal)\n      return pos + Math.min(skipped, goal - col)\n    col += nextTab - pos\n    col += tabSize - (col % tabSize)\n    pos = nextTab + 1\n    if (col >= goal) return pos\n  }\n}\n\nlet spaceStrs = [\"\"]\nexport function spaceStr(n) {\n  while (spaceStrs.length <= n)\n    spaceStrs.push(lst(spaceStrs) + \" \")\n  return spaceStrs[n]\n}\n\nexport function lst(arr) { return arr[arr.length-1] }\n\nexport function map(array, f) {\n  let out = []\n  for (let i = 0; i < array.length; i++) out[i] = f(array[i], i)\n  return out\n}\n\nexport function insertSorted(array, value, score) {\n  let pos = 0, priority = score(value)\n  while (pos < array.length && score(array[pos]) <= priority) pos++\n  array.splice(pos, 0, value)\n}\n\nfunction nothing() {}\n\nexport function createObj(base, props) {\n  let inst\n  if (Object.create) {\n    inst = Object.create(base)\n  } else {\n    nothing.prototype = base\n    inst = new nothing()\n  }\n  if (props) copyObj(props, inst)\n  return inst\n}\n\nlet nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/\nexport function isWordCharBasic(ch) {\n  return /\\w/.test(ch) || ch > \"\\x80\" &&\n    (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))\n}\nexport function isWordChar(ch, helper) {\n  if (!helper) return isWordCharBasic(ch)\n  if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) return true\n  return helper.test(ch)\n}\n\nexport function isEmpty(obj) {\n  for (let n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false\n  return true\n}\n\n// Extending unicode characters. A series of a non-extending char +\n// any number of extending chars is treated as a single unit as far\n// as editing and measuring is concerned. This is not fully correct,\n// since some scripts/fonts/browsers also treat other configurations\n// of code points as a group.\nlet extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/\nexport function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }\n\n// Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.\nexport function skipExtendingChars(str, pos, dir) {\n  while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) pos += dir\n  return pos\n}\n\n// Returns the value from the range [`from`; `to`] that satisfies\n// `pred` and is closest to `from`. Assumes that at least `to`\n// satisfies `pred`. Supports `from` being greater than `to`.\nexport function findFirst(pred, from, to) {\n  // At any point we are certain `to` satisfies `pred`, don't know\n  // whether `from` does.\n  let dir = from > to ? -1 : 1\n  for (;;) {\n    if (from == to) return from\n    let midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF)\n    if (mid == from) return pred(mid) ? from : to\n    if (pred(mid)) to = mid\n    else from = mid + dir\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/src/util/operation_group.js",
    "content": "import { getHandlers } from \"./event.js\"\n\nlet operationGroup = null\n\nexport function pushOperation(op) {\n  if (operationGroup) {\n    operationGroup.ops.push(op)\n  } else {\n    op.ownsGroup = operationGroup = {\n      ops: [op],\n      delayedCallbacks: []\n    }\n  }\n}\n\nfunction fireCallbacksForOps(group) {\n  // Calls delayed callbacks and cursorActivity handlers until no\n  // new ones appear\n  let callbacks = group.delayedCallbacks, i = 0\n  do {\n    for (; i < callbacks.length; i++)\n      callbacks[i].call(null)\n    for (let j = 0; j < group.ops.length; j++) {\n      let op = group.ops[j]\n      if (op.cursorActivityHandlers)\n        while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n          op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm)\n    }\n  } while (i < callbacks.length)\n}\n\nexport function finishOperation(op, endCb) {\n  let group = op.ownsGroup\n  if (!group) return\n\n  try { fireCallbacksForOps(group) }\n  finally {\n    operationGroup = null\n    endCb(group)\n  }\n}\n\nlet orphanDelayedCallbacks = null\n\n// Often, we want to signal events at a point where we are in the\n// middle of some work, but don't want the handler to start calling\n// other methods on the editor, which might be in an inconsistent\n// state or simply not expect any other events to happen.\n// signalLater looks whether there are any handlers, and schedules\n// them to be executed when the last operation ends, or, if no\n// operation is active, when a timeout fires.\nexport function signalLater(emitter, type /*, values...*/) {\n  let arr = getHandlers(emitter, type)\n  if (!arr.length) return\n  let args = Array.prototype.slice.call(arguments, 2), list\n  if (operationGroup) {\n    list = operationGroup.delayedCallbacks\n  } else if (orphanDelayedCallbacks) {\n    list = orphanDelayedCallbacks\n  } else {\n    list = orphanDelayedCallbacks = []\n    setTimeout(fireOrphanDelayed, 0)\n  }\n  for (let i = 0; i < arr.length; ++i)\n    list.push(() => arr[i].apply(null, args))\n}\n\nfunction fireOrphanDelayed() {\n  let delayed = orphanDelayedCallbacks\n  orphanDelayedCallbacks = null\n  for (let i = 0; i < delayed.length; ++i) delayed[i]()\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/3024-day.css",
    "content": "/*\n\n    Name:       3024 day\n    Author:     Jan T. Sott (http://github.com/idleberg)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-3024-day.CodeMirror { background: #f7f7f7; color: #3a3432; }\n.cm-s-3024-day div.CodeMirror-selected { background: #d6d5d4; }\n\n.cm-s-3024-day .CodeMirror-line::selection, .cm-s-3024-day .CodeMirror-line > span::selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d6d5d4; }\n.cm-s-3024-day .CodeMirror-line::-moz-selection, .cm-s-3024-day .CodeMirror-line > span::-moz-selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d9d9d9; }\n\n.cm-s-3024-day .CodeMirror-gutters { background: #f7f7f7; border-right: 0px; }\n.cm-s-3024-day .CodeMirror-guttermarker { color: #db2d20; }\n.cm-s-3024-day .CodeMirror-guttermarker-subtle { color: #807d7c; }\n.cm-s-3024-day .CodeMirror-linenumber { color: #807d7c; }\n\n.cm-s-3024-day .CodeMirror-cursor { border-left: 1px solid #5c5855; }\n\n.cm-s-3024-day span.cm-comment { color: #cdab53; }\n.cm-s-3024-day span.cm-atom { color: #a16a94; }\n.cm-s-3024-day span.cm-number { color: #a16a94; }\n\n.cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute { color: #01a252; }\n.cm-s-3024-day span.cm-keyword { color: #db2d20; }\n.cm-s-3024-day span.cm-string { color: #fded02; }\n\n.cm-s-3024-day span.cm-variable { color: #01a252; }\n.cm-s-3024-day span.cm-variable-2 { color: #01a0e4; }\n.cm-s-3024-day span.cm-def { color: #e8bbd0; }\n.cm-s-3024-day span.cm-bracket { color: #3a3432; }\n.cm-s-3024-day span.cm-tag { color: #db2d20; }\n.cm-s-3024-day span.cm-link { color: #a16a94; }\n.cm-s-3024-day span.cm-error { background: #db2d20; color: #5c5855; }\n\n.cm-s-3024-day .CodeMirror-activeline-background { background: #e8f2ff; }\n.cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: #a16a94 !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/3024-night.css",
    "content": "/*\n\n    Name:       3024 night\n    Author:     Jan T. Sott (http://github.com/idleberg)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-3024-night.CodeMirror { background: #090300; color: #d6d5d4; }\n.cm-s-3024-night div.CodeMirror-selected { background: #3a3432; }\n.cm-s-3024-night .CodeMirror-line::selection, .cm-s-3024-night .CodeMirror-line > span::selection, .cm-s-3024-night .CodeMirror-line > span > span::selection { background: rgba(58, 52, 50, .99); }\n.cm-s-3024-night .CodeMirror-line::-moz-selection, .cm-s-3024-night .CodeMirror-line > span::-moz-selection, .cm-s-3024-night .CodeMirror-line > span > span::-moz-selection { background: rgba(58, 52, 50, .99); }\n.cm-s-3024-night .CodeMirror-gutters { background: #090300; border-right: 0px; }\n.cm-s-3024-night .CodeMirror-guttermarker { color: #db2d20; }\n.cm-s-3024-night .CodeMirror-guttermarker-subtle { color: #5c5855; }\n.cm-s-3024-night .CodeMirror-linenumber { color: #5c5855; }\n\n.cm-s-3024-night .CodeMirror-cursor { border-left: 1px solid #807d7c; }\n\n.cm-s-3024-night span.cm-comment { color: #cdab53; }\n.cm-s-3024-night span.cm-atom { color: #a16a94; }\n.cm-s-3024-night span.cm-number { color: #a16a94; }\n\n.cm-s-3024-night span.cm-property, .cm-s-3024-night span.cm-attribute { color: #01a252; }\n.cm-s-3024-night span.cm-keyword { color: #db2d20; }\n.cm-s-3024-night span.cm-string { color: #fded02; }\n\n.cm-s-3024-night span.cm-variable { color: #01a252; }\n.cm-s-3024-night span.cm-variable-2 { color: #01a0e4; }\n.cm-s-3024-night span.cm-def { color: #e8bbd0; }\n.cm-s-3024-night span.cm-bracket { color: #d6d5d4; }\n.cm-s-3024-night span.cm-tag { color: #db2d20; }\n.cm-s-3024-night span.cm-link { color: #a16a94; }\n.cm-s-3024-night span.cm-error { background: #db2d20; color: #807d7c; }\n\n.cm-s-3024-night .CodeMirror-activeline-background { background: #2F2F2F; }\n.cm-s-3024-night .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/abbott.css",
    "content": "/*\n * abbott.css\n * A warm, dark theme for prose and code, with pastels and pretty greens.\n *\n * Ported from abbott.vim (https://github.com/bcat/abbott.vim) version 2.1.\n * Original design and CodeMirror port by Jonathan Rascher.\n *\n * This theme shares the following color palette with the Vim color scheme.\n *\n * Brown shades:\n *   bistre: #231c14\n *   chocolate: #3c3022\n *   cocoa: #745d42\n *   vanilla_cream: #fef3b4\n *\n * Red shades:\n *   crimson: #d80450\n *   cinnabar: #f63f05\n *\n * Green shades:\n *   dark_olive: #273900\n *   forest_green: #24a507\n *   chartreuse: #a0ea00\n *   pastel_chartreuse: #d8ff84\n *\n * Yellow shades:\n *   marigold: #fbb32f\n *   lemon_meringue: #fbec5d\n *\n * Blue shades:\n *   cornflower_blue: #3f91f1\n *   periwinkle_blue: #8ccdf0\n *\n * Magenta shades:\n *   french_pink: #ec6c99\n *   lavender: #e6a2f3\n *\n * Cyan shades:\n *   zomp: #39a78d\n *   seafoam_green: #00ff7f\n */\n\n/* Style the UI: */\n\n/* Equivalent to Vim's Normal group. */\n.cm-s-abbott.CodeMirror {\n  background: #231c14 /* bistre */;\n  color: #d8ff84 /* pastel_chartreuse */;\n}\n\n/* Roughly equivalent to Vim's LineNr group. */\n.cm-s-abbott .CodeMirror-gutters {\n  background: #231c14 /* bistre */;\n  border: none;\n}\n.cm-s-abbott .CodeMirror-linenumber { color: #fbec5d /* lemon_meringue */; }\n\n.cm-s-abbott .CodeMirror-guttermarker { color: #f63f05 /* cinnabar */; }\n\n/* Roughly equivalent to Vim's FoldColumn group. */\n.cm-s-abbott .CodeMirror-guttermarker-subtle { color: #fbb32f /* marigold */; }\n\n/*\n * Roughly equivalent to Vim's CursorColumn group. (We use a brighter color\n * since Vim's cursorcolumn option highlights a whole column, whereas\n * CodeMirror's rule just highlights a thin line.)\n */\n.cm-s-abbott .CodeMirror-ruler { border-color: #745d42 /* cocoa */; }\n\n/* Equivalent to Vim's Cursor group in insert mode. */\n.cm-s-abbott .CodeMirror-cursor { border-color: #a0ea00 /* chartreuse */; }\n\n/* Equivalent to Vim's Cursor group in normal mode. */\n.cm-s-abbott.cm-fat-cursor .CodeMirror-cursor,\n.cm-s-abbott .cm-animate-fat-cursor {\n  /*\n   * CodeMirror doesn't allow changing the foreground color of the character\n   * under the cursor, so we can't use a reverse video effect for the cursor.\n   * Instead, make it semitransparent.\n   */\n  background: rgba(160, 234, 0, 0.5) /* chartreuse */;\n}\n.cm-s-abbott.cm-fat-cursor .CodeMirror-cursors {\n  /*\n   * Boost the z-index so the fat cursor shows up on top of text and\n   * matchingbracket/matchingtag highlights.\n   */\n  z-index: 3;\n}\n\n/* Equivalent to Vim's Cursor group in replace mode. */\n.cm-s-abbott .CodeMirror-overwrite .CodeMirror-cursor {\n  border-bottom: 1px solid #a0ea00 /* chartreuse */;\n  border-left: none;\n  width: auto;\n}\n\n/* Roughly equivalent to Vim's CursorIM group. */\n.cm-s-abbott .CodeMirror-secondarycursor {\n  border-color: #00ff7f /* seafoam_green */;\n}\n\n/* Roughly equivalent to Vim's Visual group. */\n.cm-s-abbott .CodeMirror-selected,\n.cm-s-abbott.CodeMirror-focused .CodeMirror-selected {\n  background: #273900 /* dark_olive */;\n}\n.cm-s-abbott .CodeMirror-line::selection,\n.cm-s-abbott .CodeMirror-line > span::selection,\n.cm-s-abbott .CodeMirror-line > span > span::selection {\n  background: #273900 /* dark_olive */;\n}\n.cm-s-abbott .CodeMirror-line::-moz-selection,\n.cm-s-abbott .CodeMirror-line > span::-moz-selection,\n.cm-s-abbott .CodeMirror-line > span > span::-moz-selection {\n  background: #273900 /* dark_olive */;\n}\n\n/* Roughly equivalent to Vim's SpecialKey group. */\n.cm-s-abbott .cm-tab { color: #00ff7f /* seafoam_green */; }\n\n/* Equivalent to Vim's Search group. */\n.cm-s-abbott .cm-searching {\n  background: #fef3b4 /* vanilla_cream */ !important;\n  color: #231c14 /* bistre */ !important;\n}\n\n/* Style syntax highlighting modes: */\n\n/* Equivalent to Vim's Comment group. */\n.cm-s-abbott span.cm-comment {\n  color: #fbb32f /* marigold */;\n  font-style: italic;\n}\n\n/* Equivalent to Vim's String group. */\n.cm-s-abbott span.cm-string,\n.cm-s-abbott span.cm-string-2 {\n  color: #e6a2f3 /* lavender */;\n}\n\n/* Equivalent to Vim's Constant group. */\n.cm-s-abbott span.cm-number,\n.cm-s-abbott span.cm-string.cm-url { color: #f63f05 /* cinnabar */; }\n\n/* Roughly equivalent to Vim's SpecialKey group. */\n.cm-s-abbott span.cm-invalidchar { color: #00ff7f /* seafoam_green */; }\n\n/* Equivalent to Vim's Special group. */\n.cm-s-abbott span.cm-atom { color: #fef3b4 /* vanilla_cream */; }\n\n/* Equivalent to Vim's Delimiter group. */\n.cm-s-abbott span.cm-bracket,\n.cm-s-abbott span.cm-punctuation {\n  color: #fef3b4 /* vanilla_cream */;\n}\n\n/* Equivalent Vim's Operator group. */\n.cm-s-abbott span.cm-operator { font-weight: bold; }\n\n/* Roughly equivalent to Vim's Identifier group. */\n.cm-s-abbott span.cm-def,\n.cm-s-abbott span.cm-variable,\n.cm-s-abbott span.cm-variable-2,\n.cm-s-abbott span.cm-variable-3 {\n  color: #8ccdf0 /* periwinkle_blue */;\n}\n\n/* Roughly equivalent to Vim's Function group. */\n.cm-s-abbott span.cm-builtin,\n.cm-s-abbott span.cm-property,\n.cm-s-abbott span.cm-qualifier {\n  color: #3f91f1 /* cornflower_blue */;\n}\n\n/* Equivalent to Vim's Type group. */\n.cm-s-abbott span.cm-type { color: #24a507 /* forest_green */; }\n\n/* Equivalent to Vim's Keyword group. */\n.cm-s-abbott span.cm-keyword {\n  color: #d80450 /* crimson */;\n  font-weight: bold;\n}\n\n/* Equivalent to Vim's PreProc group. */\n.cm-s-abbott span.cm-meta { color: #ec6c99 /* french_pink */; }\n\n/* Equivalent to Vim's htmlTagName group (linked to Statement). */\n.cm-s-abbott span.cm-tag {\n  color: #d80450 /* crimson */;\n  font-weight: bold;\n}\n\n/* Equivalent to Vim's htmlArg group (linked to Type). */\n.cm-s-abbott span.cm-attribute { color: #24a507 /* forest_green */; }\n\n/* Equivalent to Vim's htmlH1, markdownH1, etc. groups (linked to Title). */\n.cm-s-abbott span.cm-header {\n  color: #d80450 /* crimson */;\n  font-weight: bold;\n}\n\n/* Equivalent to Vim's markdownRule group (linked to PreProc). */\n.cm-s-abbott span.cm-hr { color: #ec6c99 /* french_pink */; }\n\n/* Roughly equivalent to Vim's Underlined group. */\n.cm-s-abbott span.cm-link { color: #e6a2f3 /* lavender */; }\n\n/* Equivalent to Vim's diffRemoved group. */\n.cm-s-abbott span.cm-negative {\n  background: #d80450 /* crimson */;\n  color: #231c14 /* bistre */;\n}\n\n/* Equivalent to Vim's diffAdded group. */\n.cm-s-abbott span.cm-positive {\n  background: #a0ea00 /* chartreuse */;\n  color: #231c14 /* bistre */;\n  font-weight: bold;\n}\n\n/* Equivalent to Vim's Error group. */\n.cm-s-abbott span.cm-error {\n  background: #d80450 /* crimson */;\n  color: #231c14 /* bistre */;\n}\n\n/* Style addons: */\n\n/* Equivalent to Vim's MatchParen group. */\n.cm-s-abbott span.CodeMirror-matchingbracket {\n  background: #745d42 /* cocoa */ !important;\n  color: #231c14 /* bistre */ !important;\n  font-weight: bold;\n}\n\n/*\n * Roughly equivalent to Vim's Error group. (Vim doesn't seem to have a direct\n * equivalent in its own matchparen plugin, but many syntax highlighting plugins\n * mark mismatched brackets as Error.)\n */\n.cm-s-abbott span.CodeMirror-nonmatchingbracket {\n  background: #d80450 /* crimson */ !important;\n  color: #231c14 /* bistre */ !important;\n}\n\n.cm-s-abbott .CodeMirror-matchingtag,\n.cm-s-abbott .cm-matchhighlight {\n  outline: 1px solid #39a78d /* zomp */;\n}\n\n/* Equivalent to Vim's CursorLine group. */\n.cm-s-abbott .CodeMirror-activeline-background,\n.cm-s-abbott .CodeMirror-activeline-gutter {\n  background: #3c3022 /* chocolate */;\n}\n\n/* Equivalent to Vim's CursorLineNr group. */\n.cm-s-abbott .CodeMirror-activeline-gutter .CodeMirror-linenumber {\n  color: #d8ff84 /* pastel_chartreuse */;\n  font-weight: bold;\n}\n\n/* Roughly equivalent to Vim's Folded group. */\n.cm-s-abbott .CodeMirror-foldmarker {\n  color: #f63f05 /* cinnabar */;\n  text-shadow: none;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/abcdef.css",
    "content": ".cm-s-abcdef.CodeMirror { background: #0f0f0f; color: #defdef; }\n.cm-s-abcdef div.CodeMirror-selected { background: #515151; }\n.cm-s-abcdef .CodeMirror-line::selection, .cm-s-abcdef .CodeMirror-line > span::selection, .cm-s-abcdef .CodeMirror-line > span > span::selection { background: rgba(56, 56, 56, 0.99); }\n.cm-s-abcdef .CodeMirror-line::-moz-selection, .cm-s-abcdef .CodeMirror-line > span::-moz-selection, .cm-s-abcdef .CodeMirror-line > span > span::-moz-selection { background: rgba(56, 56, 56, 0.99); }\n.cm-s-abcdef .CodeMirror-gutters { background: #555; border-right: 2px solid #314151; }\n.cm-s-abcdef .CodeMirror-guttermarker { color: #222; }\n.cm-s-abcdef .CodeMirror-guttermarker-subtle { color: azure; }\n.cm-s-abcdef .CodeMirror-linenumber { color: #FFFFFF; }\n.cm-s-abcdef .CodeMirror-cursor { border-left: 1px solid #00FF00; }\n\n.cm-s-abcdef span.cm-keyword { color: darkgoldenrod; font-weight: bold; }\n.cm-s-abcdef span.cm-atom { color: #77F; }\n.cm-s-abcdef span.cm-number { color: violet; }\n.cm-s-abcdef span.cm-def { color: #fffabc; }\n.cm-s-abcdef span.cm-variable { color: #abcdef; }\n.cm-s-abcdef span.cm-variable-2 { color: #cacbcc; }\n.cm-s-abcdef span.cm-variable-3, .cm-s-abcdef span.cm-type { color: #def; }\n.cm-s-abcdef span.cm-property { color: #fedcba; }\n.cm-s-abcdef span.cm-operator { color: #ff0; }\n.cm-s-abcdef span.cm-comment { color: #7a7b7c; font-style: italic;}\n.cm-s-abcdef span.cm-string { color: #2b4; }\n.cm-s-abcdef span.cm-meta { color: #C9F; }\n.cm-s-abcdef span.cm-qualifier { color: #FFF700; }\n.cm-s-abcdef span.cm-builtin { color: #30aabc; }\n.cm-s-abcdef span.cm-bracket { color: #8a8a8a; }\n.cm-s-abcdef span.cm-tag { color: #FFDD44; }\n.cm-s-abcdef span.cm-attribute { color: #DDFF00; }\n.cm-s-abcdef span.cm-error { color: #FF0000; }\n.cm-s-abcdef span.cm-header { color: aquamarine; font-weight: bold; }\n.cm-s-abcdef span.cm-link { color: blueviolet; }\n\n.cm-s-abcdef .CodeMirror-activeline-background { background: #314151; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/ambiance-mobile.css",
    "content": ".cm-s-ambiance.CodeMirror {\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/ambiance.css",
    "content": "/* ambiance theme for codemirror */\n\n/* Color scheme */\n\n.cm-s-ambiance .cm-header { color: blue; }\n.cm-s-ambiance .cm-quote { color: #24C2C7; }\n\n.cm-s-ambiance .cm-keyword { color: #cda869; }\n.cm-s-ambiance .cm-atom { color: #CF7EA9; }\n.cm-s-ambiance .cm-number { color: #78CF8A; }\n.cm-s-ambiance .cm-def { color: #aac6e3; }\n.cm-s-ambiance .cm-variable { color: #ffb795; }\n.cm-s-ambiance .cm-variable-2 { color: #eed1b3; }\n.cm-s-ambiance .cm-variable-3, .cm-s-ambiance .cm-type { color: #faded3; }\n.cm-s-ambiance .cm-property { color: #eed1b3; }\n.cm-s-ambiance .cm-operator { color: #fa8d6a; }\n.cm-s-ambiance .cm-comment { color: #555; font-style:italic; }\n.cm-s-ambiance .cm-string { color: #8f9d6a; }\n.cm-s-ambiance .cm-string-2 { color: #9d937c; }\n.cm-s-ambiance .cm-meta { color: #D2A8A1; }\n.cm-s-ambiance .cm-qualifier { color: yellow; }\n.cm-s-ambiance .cm-builtin { color: #9999cc; }\n.cm-s-ambiance .cm-bracket { color: #24C2C7; }\n.cm-s-ambiance .cm-tag { color: #fee4ff; }\n.cm-s-ambiance .cm-attribute { color: #9B859D; }\n.cm-s-ambiance .cm-hr { color: pink; }\n.cm-s-ambiance .cm-link { color: #F4C20B; }\n.cm-s-ambiance .cm-special { color: #FF9D00; }\n.cm-s-ambiance .cm-error { color: #AF2018; }\n\n.cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; }\n.cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; }\n\n.cm-s-ambiance div.CodeMirror-selected { background: rgba(255, 255, 255, 0.15); }\n.cm-s-ambiance.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-ambiance .CodeMirror-line::selection, .cm-s-ambiance .CodeMirror-line > span::selection, .cm-s-ambiance .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-ambiance .CodeMirror-line::-moz-selection, .cm-s-ambiance .CodeMirror-line > span::-moz-selection, .cm-s-ambiance .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n\n/* Editor styling */\n\n.cm-s-ambiance.CodeMirror {\n  line-height: 1.40em;\n  color: #E6E1DC;\n  background-color: #202020;\n  -webkit-box-shadow: inset 0 0 10px black;\n  -moz-box-shadow: inset 0 0 10px black;\n  box-shadow: inset 0 0 10px black;\n}\n\n.cm-s-ambiance .CodeMirror-gutters {\n  background: #3D3D3D;\n  border-right: 1px solid #4D4D4D;\n  box-shadow: 0 10px 20px black;\n}\n\n.cm-s-ambiance .CodeMirror-linenumber {\n  text-shadow: 0px 1px 1px #4d4d4d;\n  color: #111;\n  padding: 0 5px;\n}\n\n.cm-s-ambiance .CodeMirror-guttermarker { color: #aaa; }\n.cm-s-ambiance .CodeMirror-guttermarker-subtle { color: #111; }\n\n.cm-s-ambiance .CodeMirror-cursor { border-left: 1px solid #7991E8; }\n\n.cm-s-ambiance .CodeMirror-activeline-background {\n  background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031);\n}\n\n.cm-s-ambiance.CodeMirror,\n.cm-s-ambiance .CodeMirror-gutters {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC\");\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/ayu-dark.css",
    "content": "/* Based on https://github.com/dempfi/ayu */\n\n.cm-s-ayu-dark.CodeMirror { background: #0a0e14; color: #b3b1ad; }\n.cm-s-ayu-dark div.CodeMirror-selected { background: #273747; }\n.cm-s-ayu-dark .CodeMirror-line::selection, .cm-s-ayu-dark .CodeMirror-line > span::selection, .cm-s-ayu-dark .CodeMirror-line > span > span::selection { background: rgba(39, 55, 71, 99); }\n.cm-s-ayu-dark .CodeMirror-line::-moz-selection, .cm-s-ayu-dark .CodeMirror-line > span::-moz-selection, .cm-s-ayu-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(39, 55, 71, 99); }\n.cm-s-ayu-dark .CodeMirror-gutters { background: #0a0e14; border-right: 0px; }\n.cm-s-ayu-dark .CodeMirror-guttermarker { color: white; }\n.cm-s-ayu-dark .CodeMirror-guttermarker-subtle { color: #3d424d; }\n.cm-s-ayu-dark .CodeMirror-linenumber { color: #3d424d; }\n.cm-s-ayu-dark .CodeMirror-cursor { border-left: 1px solid #e6b450; }\n.cm-s-ayu-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #a2a8a175 !important; }\n.cm-s-ayu-dark .cm-animate-fat-cursor { background-color: #a2a8a175 !important; }\n\n.cm-s-ayu-dark span.cm-comment { color: #626a73; }\n.cm-s-ayu-dark span.cm-atom { color: #ae81ff; }\n.cm-s-ayu-dark span.cm-number { color: #e6b450; }\n\n.cm-s-ayu-dark span.cm-comment.cm-attribute { color: #ffb454; }\n.cm-s-ayu-dark span.cm-comment.cm-def { color: rgba(57, 186, 230, 80); }\n.cm-s-ayu-dark span.cm-comment.cm-tag { color: #39bae6; }\n.cm-s-ayu-dark span.cm-comment.cm-type { color: #5998a6; }\n\n.cm-s-ayu-dark span.cm-property, .cm-s-ayu-dark span.cm-attribute { color: #ffb454; }  \n.cm-s-ayu-dark span.cm-keyword { color: #ff8f40; } \n.cm-s-ayu-dark span.cm-builtin { color: #e6b450; }\n.cm-s-ayu-dark span.cm-string { color: #c2d94c; }\n\n.cm-s-ayu-dark span.cm-variable { color: #b3b1ad; }\n.cm-s-ayu-dark span.cm-variable-2 { color: #f07178; }\n.cm-s-ayu-dark span.cm-variable-3 { color: #39bae6; }\n.cm-s-ayu-dark span.cm-type { color: #ff8f40; }\n.cm-s-ayu-dark span.cm-def { color: #ffee99; }\n.cm-s-ayu-dark span.cm-bracket { color: #f8f8f2; }\n.cm-s-ayu-dark span.cm-tag { color: rgba(57, 186, 230, 80); }\n.cm-s-ayu-dark span.cm-header { color: #c2d94c; }\n.cm-s-ayu-dark span.cm-link { color: #39bae6; }\n.cm-s-ayu-dark span.cm-error { color: #ff3333; } \n\n.cm-s-ayu-dark .CodeMirror-activeline-background { background: #01060e; }\n.cm-s-ayu-dark .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/ayu-mirage.css",
    "content": "/* Based on https://github.com/dempfi/ayu */\n\n.cm-s-ayu-mirage.CodeMirror { background: #1f2430; color: #cbccc6; }\n.cm-s-ayu-mirage div.CodeMirror-selected { background: #34455a; }\n.cm-s-ayu-mirage .CodeMirror-line::selection, .cm-s-ayu-mirage .CodeMirror-line > span::selection, .cm-s-ayu-mirage .CodeMirror-line > span > span::selection { background: #34455a; }\n.cm-s-ayu-mirage .CodeMirror-line::-moz-selection, .cm-s-ayu-mirage .CodeMirror-line > span::-moz-selection, .cm-s-ayu-mirage .CodeMirror-line > span > span::-moz-selection { background: rgba(25, 30, 42, 99); }\n.cm-s-ayu-mirage .CodeMirror-gutters { background: #1f2430; border-right: 0px; }\n.cm-s-ayu-mirage .CodeMirror-guttermarker { color: white; }\n.cm-s-ayu-mirage .CodeMirror-guttermarker-subtle { color:  rgba(112, 122, 140, 66); }\n.cm-s-ayu-mirage .CodeMirror-linenumber { color: rgba(61, 66, 77, 99); }\n.cm-s-ayu-mirage .CodeMirror-cursor { border-left: 1px solid #ffcc66;  }\n.cm-s-ayu-mirage.cm-fat-cursor .CodeMirror-cursor {background-color: #a2a8a175 !important;}\n.cm-s-ayu-mirage .cm-animate-fat-cursor { background-color: #a2a8a175 !important; }\n\n.cm-s-ayu-mirage span.cm-comment { color: #5c6773; font-style:italic; }\n.cm-s-ayu-mirage span.cm-atom { color: #ae81ff; }\n.cm-s-ayu-mirage span.cm-number { color: #ffcc66; }\n\n.cm-s-ayu-mirage span.cm-comment.cm-attribute { color: #ffd580; }\n.cm-s-ayu-mirage span.cm-comment.cm-def { color: #d4bfff; }\n.cm-s-ayu-mirage span.cm-comment.cm-tag { color: #5ccfe6; }\n.cm-s-ayu-mirage span.cm-comment.cm-type { color: #5998a6; }\n\n.cm-s-ayu-mirage span.cm-property { color: #f29e74; }\n.cm-s-ayu-mirage span.cm-attribute { color: #ffd580; }  \n.cm-s-ayu-mirage span.cm-keyword { color: #ffa759; } \n.cm-s-ayu-mirage span.cm-builtin { color: #ffcc66; }\n.cm-s-ayu-mirage span.cm-string { color: #bae67e; }\n\n.cm-s-ayu-mirage span.cm-variable { color: #cbccc6; }\n.cm-s-ayu-mirage span.cm-variable-2 { color: #f28779; }\n.cm-s-ayu-mirage span.cm-variable-3 { color: #5ccfe6; }\n.cm-s-ayu-mirage span.cm-type { color: #ffa759; }\n.cm-s-ayu-mirage span.cm-def { color: #ffd580; }\n.cm-s-ayu-mirage span.cm-bracket { color: rgba(92, 207, 230, 80); }\n.cm-s-ayu-mirage span.cm-tag { color: #5ccfe6; }\n.cm-s-ayu-mirage span.cm-header { color: #bae67e; }\n.cm-s-ayu-mirage span.cm-link { color: #5ccfe6; }\n.cm-s-ayu-mirage span.cm-error { color: #ff3333; } \n\n.cm-s-ayu-mirage .CodeMirror-activeline-background { background: #191e2a; }\n.cm-s-ayu-mirage .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/base16-dark.css",
    "content": "/*\n\n    Name:       Base16 Default Dark\n    Author:     Chris Kempson (http://chriskempson.com)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-base16-dark.CodeMirror { background: #151515; color: #e0e0e0; }\n.cm-s-base16-dark div.CodeMirror-selected { background: #303030; }\n.cm-s-base16-dark .CodeMirror-line::selection, .cm-s-base16-dark .CodeMirror-line > span::selection, .cm-s-base16-dark .CodeMirror-line > span > span::selection { background: rgba(48, 48, 48, .99); }\n.cm-s-base16-dark .CodeMirror-line::-moz-selection, .cm-s-base16-dark .CodeMirror-line > span::-moz-selection, .cm-s-base16-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(48, 48, 48, .99); }\n.cm-s-base16-dark .CodeMirror-gutters { background: #151515; border-right: 0px; }\n.cm-s-base16-dark .CodeMirror-guttermarker { color: #ac4142; }\n.cm-s-base16-dark .CodeMirror-guttermarker-subtle { color: #505050; }\n.cm-s-base16-dark .CodeMirror-linenumber { color: #505050; }\n.cm-s-base16-dark .CodeMirror-cursor { border-left: 1px solid #b0b0b0; }\n.cm-s-base16-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #8e8d8875 !important; }\n.cm-s-base16-dark .cm-animate-fat-cursor { background-color: #8e8d8875 !important; }\n\n.cm-s-base16-dark span.cm-comment { color: #8f5536; }\n.cm-s-base16-dark span.cm-atom { color: #aa759f; }\n.cm-s-base16-dark span.cm-number { color: #aa759f; }\n\n.cm-s-base16-dark span.cm-property, .cm-s-base16-dark span.cm-attribute { color: #90a959; }\n.cm-s-base16-dark span.cm-keyword { color: #ac4142; }\n.cm-s-base16-dark span.cm-string { color: #f4bf75; }\n\n.cm-s-base16-dark span.cm-variable { color: #90a959; }\n.cm-s-base16-dark span.cm-variable-2 { color: #6a9fb5; }\n.cm-s-base16-dark span.cm-def { color: #d28445; }\n.cm-s-base16-dark span.cm-bracket { color: #e0e0e0; }\n.cm-s-base16-dark span.cm-tag { color: #ac4142; }\n.cm-s-base16-dark span.cm-link { color: #aa759f; }\n.cm-s-base16-dark span.cm-error { background: #ac4142; color: #b0b0b0; }\n\n.cm-s-base16-dark .CodeMirror-activeline-background { background: #202020; }\n.cm-s-base16-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/base16-light.css",
    "content": "/*\n\n    Name:       Base16 Default Light\n    Author:     Chris Kempson (http://chriskempson.com)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-base16-light.CodeMirror { background: #f5f5f5; color: #202020; }\n.cm-s-base16-light div.CodeMirror-selected { background: #e0e0e0; }\n.cm-s-base16-light .CodeMirror-line::selection, .cm-s-base16-light .CodeMirror-line > span::selection, .cm-s-base16-light .CodeMirror-line > span > span::selection { background: #e0e0e0; }\n.cm-s-base16-light .CodeMirror-line::-moz-selection, .cm-s-base16-light .CodeMirror-line > span::-moz-selection, .cm-s-base16-light .CodeMirror-line > span > span::-moz-selection { background: #e0e0e0; }\n.cm-s-base16-light .CodeMirror-gutters { background: #f5f5f5; border-right: 0px; }\n.cm-s-base16-light .CodeMirror-guttermarker { color: #ac4142; }\n.cm-s-base16-light .CodeMirror-guttermarker-subtle { color: #b0b0b0; }\n.cm-s-base16-light .CodeMirror-linenumber { color: #b0b0b0; }\n.cm-s-base16-light .CodeMirror-cursor { border-left: 1px solid #505050; }\n\n.cm-s-base16-light span.cm-comment { color: #8f5536; }\n.cm-s-base16-light span.cm-atom { color: #aa759f; }\n.cm-s-base16-light span.cm-number { color: #aa759f; }\n\n.cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute { color: #90a959; }\n.cm-s-base16-light span.cm-keyword { color: #ac4142; }\n.cm-s-base16-light span.cm-string { color: #f4bf75; }\n\n.cm-s-base16-light span.cm-variable { color: #90a959; }\n.cm-s-base16-light span.cm-variable-2 { color: #6a9fb5; }\n.cm-s-base16-light span.cm-def { color: #d28445; }\n.cm-s-base16-light span.cm-bracket { color: #202020; }\n.cm-s-base16-light span.cm-tag { color: #ac4142; }\n.cm-s-base16-light span.cm-link { color: #aa759f; }\n.cm-s-base16-light span.cm-error { background: #ac4142; color: #505050; }\n\n.cm-s-base16-light .CodeMirror-activeline-background { background: #DDDCDC; }\n.cm-s-base16-light .CodeMirror-matchingbracket { color: #f5f5f5 !important; background-color: #6A9FB5 !important}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/bespin.css",
    "content": "/*\n\n    Name:       Bespin\n    Author:     Mozilla / Jan T. Sott\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-bespin.CodeMirror {background: #28211c; color: #9d9b97;}\n.cm-s-bespin div.CodeMirror-selected {background: #36312e !important;}\n.cm-s-bespin .CodeMirror-gutters {background: #28211c; border-right: 0px;}\n.cm-s-bespin .CodeMirror-linenumber {color: #666666;}\n.cm-s-bespin .CodeMirror-cursor {border-left: 1px solid #797977 !important;}\n\n.cm-s-bespin span.cm-comment {color: #937121;}\n.cm-s-bespin span.cm-atom {color: #9b859d;}\n.cm-s-bespin span.cm-number {color: #9b859d;}\n\n.cm-s-bespin span.cm-property, .cm-s-bespin span.cm-attribute {color: #54be0d;}\n.cm-s-bespin span.cm-keyword {color: #cf6a4c;}\n.cm-s-bespin span.cm-string {color: #f9ee98;}\n\n.cm-s-bespin span.cm-variable {color: #54be0d;}\n.cm-s-bespin span.cm-variable-2 {color: #5ea6ea;}\n.cm-s-bespin span.cm-def {color: #cf7d34;}\n.cm-s-bespin span.cm-error {background: #cf6a4c; color: #797977;}\n.cm-s-bespin span.cm-bracket {color: #9d9b97;}\n.cm-s-bespin span.cm-tag {color: #cf6a4c;}\n.cm-s-bespin span.cm-link {color: #9b859d;}\n\n.cm-s-bespin .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n.cm-s-bespin .CodeMirror-activeline-background { background: #404040; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/blackboard.css",
    "content": "/* Port of TextMate's Blackboard theme */\n\n.cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; }\n.cm-s-blackboard div.CodeMirror-selected { background: #253B76; }\n.cm-s-blackboard .CodeMirror-line::selection, .cm-s-blackboard .CodeMirror-line > span::selection, .cm-s-blackboard .CodeMirror-line > span > span::selection { background: rgba(37, 59, 118, .99); }\n.cm-s-blackboard .CodeMirror-line::-moz-selection, .cm-s-blackboard .CodeMirror-line > span::-moz-selection, .cm-s-blackboard .CodeMirror-line > span > span::-moz-selection { background: rgba(37, 59, 118, .99); }\n.cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; }\n.cm-s-blackboard .CodeMirror-guttermarker { color: #FBDE2D; }\n.cm-s-blackboard .CodeMirror-guttermarker-subtle { color: #888; }\n.cm-s-blackboard .CodeMirror-linenumber { color: #888; }\n.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7; }\n\n.cm-s-blackboard .cm-keyword { color: #FBDE2D; }\n.cm-s-blackboard .cm-atom { color: #D8FA3C; }\n.cm-s-blackboard .cm-number { color: #D8FA3C; }\n.cm-s-blackboard .cm-def { color: #8DA6CE; }\n.cm-s-blackboard .cm-variable { color: #FF6400; }\n.cm-s-blackboard .cm-operator { color: #FBDE2D; }\n.cm-s-blackboard .cm-comment { color: #AEAEAE; }\n.cm-s-blackboard .cm-string { color: #61CE3C; }\n.cm-s-blackboard .cm-string-2 { color: #61CE3C; }\n.cm-s-blackboard .cm-meta { color: #D8FA3C; }\n.cm-s-blackboard .cm-builtin { color: #8DA6CE; }\n.cm-s-blackboard .cm-tag { color: #8DA6CE; }\n.cm-s-blackboard .cm-attribute { color: #8DA6CE; }\n.cm-s-blackboard .cm-header { color: #FF6400; }\n.cm-s-blackboard .cm-hr { color: #AEAEAE; }\n.cm-s-blackboard .cm-link { color: #8DA6CE; }\n.cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; }\n\n.cm-s-blackboard .CodeMirror-activeline-background { background: #3C3636; }\n.cm-s-blackboard .CodeMirror-matchingbracket { outline:1px solid grey;color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/cobalt.css",
    "content": ".cm-s-cobalt.CodeMirror { background: #002240; color: white; }\n.cm-s-cobalt div.CodeMirror-selected { background: #b36539; }\n.cm-s-cobalt .CodeMirror-line::selection, .cm-s-cobalt .CodeMirror-line > span::selection, .cm-s-cobalt .CodeMirror-line > span > span::selection { background: rgba(179, 101, 57, .99); }\n.cm-s-cobalt .CodeMirror-line::-moz-selection, .cm-s-cobalt .CodeMirror-line > span::-moz-selection, .cm-s-cobalt .CodeMirror-line > span > span::-moz-selection { background: rgba(179, 101, 57, .99); }\n.cm-s-cobalt .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; }\n.cm-s-cobalt .CodeMirror-guttermarker { color: #ffee80; }\n.cm-s-cobalt .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-cobalt .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-cobalt span.cm-comment { color: #08f; }\n.cm-s-cobalt span.cm-atom { color: #845dc4; }\n.cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; }\n.cm-s-cobalt span.cm-keyword { color: #ffee80; }\n.cm-s-cobalt span.cm-string { color: #3ad900; }\n.cm-s-cobalt span.cm-meta { color: #ff9d00; }\n.cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; }\n.cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def, .cm-s-cobalt .cm-type { color: white; }\n.cm-s-cobalt span.cm-bracket { color: #d8d8d8; }\n.cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; }\n.cm-s-cobalt span.cm-link { color: #845dc4; }\n.cm-s-cobalt span.cm-error { color: #9d1e15; }\n\n.cm-s-cobalt .CodeMirror-activeline-background { background: #002D57; }\n.cm-s-cobalt .CodeMirror-matchingbracket { outline:1px solid grey;color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/colorforth.css",
    "content": ".cm-s-colorforth.CodeMirror { background: #000000; color: #f8f8f8; }\n.cm-s-colorforth .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; }\n.cm-s-colorforth .CodeMirror-guttermarker { color: #FFBD40; }\n.cm-s-colorforth .CodeMirror-guttermarker-subtle { color: #78846f; }\n.cm-s-colorforth .CodeMirror-linenumber { color: #bababa; }\n.cm-s-colorforth .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-colorforth span.cm-comment     { color: #ededed; }\n.cm-s-colorforth span.cm-def         { color: #ff1c1c; font-weight:bold; }\n.cm-s-colorforth span.cm-keyword     { color: #ffd900; }\n.cm-s-colorforth span.cm-builtin     { color: #00d95a; }\n.cm-s-colorforth span.cm-variable    { color: #73ff00; }\n.cm-s-colorforth span.cm-string      { color: #007bff; }\n.cm-s-colorforth span.cm-number      { color: #00c4ff; }\n.cm-s-colorforth span.cm-atom        { color: #606060; }\n\n.cm-s-colorforth span.cm-variable-2  { color: #EEE; }\n.cm-s-colorforth span.cm-variable-3, .cm-s-colorforth span.cm-type { color: #DDD; }\n.cm-s-colorforth span.cm-property    {}\n.cm-s-colorforth span.cm-operator    {}\n\n.cm-s-colorforth span.cm-meta        { color: yellow; }\n.cm-s-colorforth span.cm-qualifier   { color: #FFF700; }\n.cm-s-colorforth span.cm-bracket     { color: #cc7; }\n.cm-s-colorforth span.cm-tag         { color: #FFBD40; }\n.cm-s-colorforth span.cm-attribute   { color: #FFF700; }\n.cm-s-colorforth span.cm-error       { color: #f00; }\n\n.cm-s-colorforth div.CodeMirror-selected { background: #333d53; }\n\n.cm-s-colorforth span.cm-compilation { background: rgba(255, 255, 255, 0.12); }\n\n.cm-s-colorforth .CodeMirror-activeline-background { background: #253540; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/darcula.css",
    "content": "/**\n    Name: IntelliJ IDEA darcula theme\n    From IntelliJ IDEA by JetBrains\n */\n\n.cm-s-darcula  { font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;}\n.cm-s-darcula.CodeMirror { background: #2B2B2B; color: #A9B7C6; }\n\n.cm-s-darcula span.cm-meta { color: #BBB529; }\n.cm-s-darcula span.cm-number { color: #6897BB; }\n.cm-s-darcula span.cm-keyword { color: #CC7832; line-height: 1em; font-weight: bold; }\n.cm-s-darcula span.cm-def { color: #A9B7C6; font-style: italic; }\n.cm-s-darcula span.cm-variable { color: #A9B7C6; }\n.cm-s-darcula span.cm-variable-2 { color: #A9B7C6; }\n.cm-s-darcula span.cm-variable-3 { color: #9876AA; }\n.cm-s-darcula span.cm-type { color: #AABBCC; font-weight: bold; }\n.cm-s-darcula span.cm-property { color: #FFC66D; }\n.cm-s-darcula span.cm-operator { color: #A9B7C6; }\n.cm-s-darcula span.cm-string { color: #6A8759; }\n.cm-s-darcula span.cm-string-2 { color: #6A8759; }\n.cm-s-darcula span.cm-comment { color: #61A151; font-style: italic; }\n.cm-s-darcula span.cm-link { color: #CC7832; }\n.cm-s-darcula span.cm-atom { color: #CC7832; }\n.cm-s-darcula span.cm-error { color: #BC3F3C; }\n.cm-s-darcula span.cm-tag { color: #629755; font-weight: bold; font-style: italic; text-decoration: underline; }\n.cm-s-darcula span.cm-attribute { color: #6897bb; }\n.cm-s-darcula span.cm-qualifier { color: #6A8759; }\n.cm-s-darcula span.cm-bracket { color: #A9B7C6; }\n.cm-s-darcula span.cm-builtin { color: #FF9E59; }\n.cm-s-darcula span.cm-special { color: #FF9E59; }\n.cm-s-darcula span.cm-matchhighlight { color: #FFFFFF; background-color: rgba(50, 89, 48, .7); font-weight: normal;}\n.cm-s-darcula span.cm-searching { color: #FFFFFF; background-color: rgba(61, 115, 59, .7); font-weight: normal;}\n\n.cm-s-darcula .CodeMirror-cursor { border-left: 1px solid #A9B7C6; }\n.cm-s-darcula .CodeMirror-activeline-background { background: #323232; }\n.cm-s-darcula .CodeMirror-gutters { background: #313335; border-right: 1px solid #313335; }\n.cm-s-darcula .CodeMirror-guttermarker { color: #FFEE80; }\n.cm-s-darcula .CodeMirror-guttermarker-subtle { color: #D0D0D0; }\n.cm-s-darcula .CodeMirrir-linenumber { color: #606366; }\n.cm-s-darcula .CodeMirror-matchingbracket { background-color: #3B514D; color: #FFEF28 !important; font-weight: bold; }\n\n.cm-s-darcula div.CodeMirror-selected { background: #214283; }\n\n.CodeMirror-hints.darcula {\n  font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;\n  color: #9C9E9E;\n  background-color: #3B3E3F !important;\n}\n\n.CodeMirror-hints.darcula .CodeMirror-hint-active {\n  background-color: #494D4E !important;\n  color: #9C9E9E !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/dracula.css",
    "content": "/*\n\n    Name:       dracula\n    Author:     Michael Kaminsky (http://github.com/mkaminsky11)\n\n    Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)\n\n*/\n\n\n.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters {\n  background-color: #282a36 !important;\n  color: #f8f8f2 !important;\n  border: none;\n}\n.cm-s-dracula .CodeMirror-gutters { color: #282a36; }\n.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-dracula span.cm-comment { color: #6272a4; }\n.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; }\n.cm-s-dracula span.cm-number { color: #bd93f9; }\n.cm-s-dracula span.cm-variable { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-2 { color: white; }\n.cm-s-dracula span.cm-def { color: #50fa7b; }\n.cm-s-dracula span.cm-operator { color: #ff79c6; }\n.cm-s-dracula span.cm-keyword { color: #ff79c6; }\n.cm-s-dracula span.cm-atom { color: #bd93f9; }\n.cm-s-dracula span.cm-meta { color: #f8f8f2; }\n.cm-s-dracula span.cm-tag { color: #ff79c6; }\n.cm-s-dracula span.cm-attribute { color: #50fa7b; }\n.cm-s-dracula span.cm-qualifier { color: #50fa7b; }\n.cm-s-dracula span.cm-property { color: #66d9ef; }\n.cm-s-dracula span.cm-builtin { color: #50fa7b; }\n.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; }\n\n.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }\n.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/duotone-dark.css",
    "content": "/*\nName:   DuoTone-Dark\nAuthor: by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes)\n\nCodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bram de Haan (https://github.com/atelierbram/)\n*/\n\n.cm-s-duotone-dark.CodeMirror { background: #2a2734; color: #6c6783; }\n.cm-s-duotone-dark div.CodeMirror-selected { background: #545167!important; }\n.cm-s-duotone-dark .CodeMirror-gutters { background: #2a2734; border-right: 0px; }\n.cm-s-duotone-dark .CodeMirror-linenumber { color: #545167; }\n\n/* begin cursor */\n.cm-s-duotone-dark .CodeMirror-cursor { border-left: 1px solid #ffad5c; /* border-left: 1px solid #ffad5c80; */ border-right: .5em solid #ffad5c; /* border-right: .5em solid #ffad5c80; */ opacity: .5; }\n.cm-s-duotone-dark .CodeMirror-activeline-background { background: #363342; /* background: #36334280;  */ opacity: .5;}\n.cm-s-duotone-dark .cm-fat-cursor .CodeMirror-cursor { background: #ffad5c; /* background: #ffad5c80; */ opacity: .5;}\n/* end cursor */\n\n.cm-s-duotone-dark span.cm-atom, .cm-s-duotone-dark span.cm-number, .cm-s-duotone-dark span.cm-keyword, .cm-s-duotone-dark span.cm-variable, .cm-s-duotone-dark span.cm-attribute, .cm-s-duotone-dark span.cm-quote, .cm-s-duotone-dark span.cm-hr, .cm-s-duotone-dark span.cm-link { color: #ffcc99; }\n\n.cm-s-duotone-dark span.cm-property { color: #9a86fd; }\n.cm-s-duotone-dark span.cm-punctuation, .cm-s-duotone-dark span.cm-unit, .cm-s-duotone-dark span.cm-negative { color: #e09142; }\n.cm-s-duotone-dark span.cm-string { color: #ffb870; }\n.cm-s-duotone-dark span.cm-operator { color: #ffad5c; }\n.cm-s-duotone-dark span.cm-positive { color: #6a51e6; }\n\n.cm-s-duotone-dark span.cm-variable-2, .cm-s-duotone-dark span.cm-variable-3, .cm-s-duotone-dark span.cm-type, .cm-s-duotone-dark span.cm-string-2, .cm-s-duotone-dark span.cm-url { color: #7a63ee; }\n.cm-s-duotone-dark span.cm-def, .cm-s-duotone-dark span.cm-tag, .cm-s-duotone-dark span.cm-builtin, .cm-s-duotone-dark span.cm-qualifier, .cm-s-duotone-dark span.cm-header, .cm-s-duotone-dark span.cm-em { color: #eeebff; }\n.cm-s-duotone-dark span.cm-bracket, .cm-s-duotone-dark span.cm-comment { color: #6c6783; }\n\n/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */\n.cm-s-duotone-dark span.cm-error, .cm-s-duotone-dark span.cm-invalidchar { color: #f00; }\n\n.cm-s-duotone-dark span.cm-header { font-weight: normal; }\n.cm-s-duotone-dark .CodeMirror-matchingbracket { text-decoration: underline; color: #eeebff !important; } \n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/duotone-light.css",
    "content": "/*\nName:   DuoTone-Light\nAuthor: by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes)\n\nCodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bram de Haan (https://github.com/atelierbram/)\n*/\n\n.cm-s-duotone-light.CodeMirror { background: #faf8f5; color: #b29762; }\n.cm-s-duotone-light div.CodeMirror-selected { background: #e3dcce !important; }\n.cm-s-duotone-light .CodeMirror-gutters { background: #faf8f5; border-right: 0px; }\n.cm-s-duotone-light .CodeMirror-linenumber { color: #cdc4b1; }\n\n/* begin cursor */\n.cm-s-duotone-light .CodeMirror-cursor { border-left: 1px solid #93abdc; /* border-left: 1px solid #93abdc80; */ border-right: .5em solid #93abdc; /* border-right: .5em solid #93abdc80; */ opacity: .5; }\n.cm-s-duotone-light .CodeMirror-activeline-background { background: #e3dcce;  /* background: #e3dcce80; */ opacity: .5; }\n.cm-s-duotone-light .cm-fat-cursor .CodeMirror-cursor { background: #93abdc; /* #93abdc80; */ opacity: .5; }\n/* end cursor */\n\n.cm-s-duotone-light span.cm-atom, .cm-s-duotone-light span.cm-number, .cm-s-duotone-light span.cm-keyword, .cm-s-duotone-light span.cm-variable, .cm-s-duotone-light span.cm-attribute, .cm-s-duotone-light span.cm-quote, .cm-s-duotone-light-light span.cm-hr, .cm-s-duotone-light-light span.cm-link { color: #063289; }\n\n.cm-s-duotone-light span.cm-property { color: #b29762; }\n.cm-s-duotone-light span.cm-punctuation, .cm-s-duotone-light span.cm-unit, .cm-s-duotone-light span.cm-negative { color: #063289; }\n.cm-s-duotone-light span.cm-string, .cm-s-duotone-light span.cm-operator { color: #1659df; }\n.cm-s-duotone-light span.cm-positive { color: #896724; }\n\n.cm-s-duotone-light span.cm-variable-2, .cm-s-duotone-light span.cm-variable-3, .cm-s-duotone-light span.cm-type, .cm-s-duotone-light span.cm-string-2, .cm-s-duotone-light span.cm-url { color: #896724; }\n.cm-s-duotone-light span.cm-def, .cm-s-duotone-light span.cm-tag, .cm-s-duotone-light span.cm-builtin, .cm-s-duotone-light span.cm-qualifier, .cm-s-duotone-light span.cm-header, .cm-s-duotone-light span.cm-em { color: #2d2006; }\n.cm-s-duotone-light span.cm-bracket, .cm-s-duotone-light span.cm-comment { color: #b6ad9a; }\n\n/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */\n/* .cm-s-duotone-light span.cm-error { background: #896724; color: #728fcb; } */\n.cm-s-duotone-light span.cm-error, .cm-s-duotone-light span.cm-invalidchar { color: #f00; }\n\n.cm-s-duotone-light span.cm-header { font-weight: normal; }\n.cm-s-duotone-light .CodeMirror-matchingbracket { text-decoration: underline; color: #faf8f5 !important; }\n\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/eclipse.css",
    "content": ".cm-s-eclipse span.cm-meta { color: #FF1717; }\n.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; }\n.cm-s-eclipse span.cm-atom { color: #219; }\n.cm-s-eclipse span.cm-number { color: #164; }\n.cm-s-eclipse span.cm-def { color: #00f; }\n.cm-s-eclipse span.cm-variable { color: black; }\n.cm-s-eclipse span.cm-variable-2 { color: #0000C0; }\n.cm-s-eclipse span.cm-variable-3, .cm-s-eclipse span.cm-type { color: #0000C0; }\n.cm-s-eclipse span.cm-property { color: black; }\n.cm-s-eclipse span.cm-operator { color: black; }\n.cm-s-eclipse span.cm-comment { color: #3F7F5F; }\n.cm-s-eclipse span.cm-string { color: #2A00FF; }\n.cm-s-eclipse span.cm-string-2 { color: #f50; }\n.cm-s-eclipse span.cm-qualifier { color: #555; }\n.cm-s-eclipse span.cm-builtin { color: #30a; }\n.cm-s-eclipse span.cm-bracket { color: #cc7; }\n.cm-s-eclipse span.cm-tag { color: #170; }\n.cm-s-eclipse span.cm-attribute { color: #00c; }\n.cm-s-eclipse span.cm-link { color: #219; }\n.cm-s-eclipse span.cm-error { color: #f00; }\n\n.cm-s-eclipse .CodeMirror-activeline-background { background: #e8f2ff; }\n.cm-s-eclipse .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/elegant.css",
    "content": ".cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom { color: #762; }\n.cm-s-elegant span.cm-comment { color: #262; font-style: italic; line-height: 1em; }\n.cm-s-elegant span.cm-meta { color: #555; font-style: italic; line-height: 1em; }\n.cm-s-elegant span.cm-variable { color: black; }\n.cm-s-elegant span.cm-variable-2 { color: #b11; }\n.cm-s-elegant span.cm-qualifier { color: #555; }\n.cm-s-elegant span.cm-keyword { color: #730; }\n.cm-s-elegant span.cm-builtin { color: #30a; }\n.cm-s-elegant span.cm-link { color: #762; }\n.cm-s-elegant span.cm-error { background-color: #fdd; }\n\n.cm-s-elegant .CodeMirror-activeline-background { background: #e8f2ff; }\n.cm-s-elegant .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/erlang-dark.css",
    "content": ".cm-s-erlang-dark.CodeMirror { background: #002240; color: white; }\n.cm-s-erlang-dark div.CodeMirror-selected { background: #b36539; }\n.cm-s-erlang-dark .CodeMirror-line::selection, .cm-s-erlang-dark .CodeMirror-line > span::selection, .cm-s-erlang-dark .CodeMirror-line > span > span::selection { background: rgba(179, 101, 57, .99); }\n.cm-s-erlang-dark .CodeMirror-line::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(179, 101, 57, .99); }\n.cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; }\n.cm-s-erlang-dark .CodeMirror-guttermarker { color: white; }\n.cm-s-erlang-dark .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-erlang-dark span.cm-quote      { color: #ccc; }\n.cm-s-erlang-dark span.cm-atom       { color: #f133f1; }\n.cm-s-erlang-dark span.cm-attribute  { color: #ff80e1; }\n.cm-s-erlang-dark span.cm-bracket    { color: #ff9d00; }\n.cm-s-erlang-dark span.cm-builtin    { color: #eaa; }\n.cm-s-erlang-dark span.cm-comment    { color: #77f; }\n.cm-s-erlang-dark span.cm-def        { color: #e7a; }\n.cm-s-erlang-dark span.cm-keyword    { color: #ffee80; }\n.cm-s-erlang-dark span.cm-meta       { color: #50fefe; }\n.cm-s-erlang-dark span.cm-number     { color: #ffd0d0; }\n.cm-s-erlang-dark span.cm-operator   { color: #d55; }\n.cm-s-erlang-dark span.cm-property   { color: #ccc; }\n.cm-s-erlang-dark span.cm-qualifier  { color: #ccc; }\n.cm-s-erlang-dark span.cm-special    { color: #ffbbbb; }\n.cm-s-erlang-dark span.cm-string     { color: #3ad900; }\n.cm-s-erlang-dark span.cm-string-2   { color: #ccc; }\n.cm-s-erlang-dark span.cm-tag        { color: #9effff; }\n.cm-s-erlang-dark span.cm-variable   { color: #50fe50; }\n.cm-s-erlang-dark span.cm-variable-2 { color: #e0e; }\n.cm-s-erlang-dark span.cm-variable-3, .cm-s-erlang-dark span.cm-type { color: #ccc; }\n.cm-s-erlang-dark span.cm-error      { color: #9d1e15; }\n\n.cm-s-erlang-dark .CodeMirror-activeline-background { background: #013461; }\n.cm-s-erlang-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/gruvbox-dark.css",
    "content": "/*\n\n    Name:       gruvbox-dark\n    Author:     kRkk (https://github.com/krkk)\n\n    Original gruvbox color scheme by Pavel Pertsev (https://github.com/morhetz/gruvbox)\n\n*/\n\n.cm-s-gruvbox-dark.CodeMirror, .cm-s-gruvbox-dark .CodeMirror-gutters { background-color: #282828; color: #bdae93; }\n.cm-s-gruvbox-dark .CodeMirror-gutters {background: #282828; border-right: 0px;}\n.cm-s-gruvbox-dark .CodeMirror-linenumber {color: #7c6f64;}\n.cm-s-gruvbox-dark .CodeMirror-cursor { border-left: 1px solid #ebdbb2; }\n.cm-s-gruvbox-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #8e8d8875 !important; }\n.cm-s-gruvbox-dark .cm-animate-fat-cursor { background-color: #8e8d8875 !important; }\n.cm-s-gruvbox-dark div.CodeMirror-selected { background: #928374; }\n.cm-s-gruvbox-dark span.cm-meta { color: #83a598; }\n\n.cm-s-gruvbox-dark span.cm-comment { color: #928374; }\n.cm-s-gruvbox-dark span.cm-number, span.cm-atom { color: #d3869b; }\n.cm-s-gruvbox-dark span.cm-keyword { color: #f84934; }\n\n.cm-s-gruvbox-dark span.cm-variable { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-variable-2 { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-variable-3, .cm-s-gruvbox-dark span.cm-type { color: #fabd2f; }\n.cm-s-gruvbox-dark span.cm-operator { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-callee { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-def { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-property { color: #ebdbb2; }\n.cm-s-gruvbox-dark span.cm-string { color: #b8bb26; }\n.cm-s-gruvbox-dark span.cm-string-2 { color: #8ec07c; }\n.cm-s-gruvbox-dark span.cm-qualifier { color: #8ec07c; }\n.cm-s-gruvbox-dark span.cm-attribute { color: #8ec07c; }\n\n.cm-s-gruvbox-dark .CodeMirror-activeline-background { background: #3c3836; }\n.cm-s-gruvbox-dark .CodeMirror-matchingbracket { background: #928374; color:#282828 !important; }\n\n.cm-s-gruvbox-dark span.cm-builtin { color: #fe8019; }\n.cm-s-gruvbox-dark span.cm-tag { color: #fe8019; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/hopscotch.css",
    "content": "/*\n\n    Name:       Hopscotch\n    Author:     Jan T. Sott\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-hopscotch.CodeMirror {background: #322931; color: #d5d3d5;}\n.cm-s-hopscotch div.CodeMirror-selected {background: #433b42 !important;}\n.cm-s-hopscotch .CodeMirror-gutters {background: #322931; border-right: 0px;}\n.cm-s-hopscotch .CodeMirror-linenumber {color: #797379;}\n.cm-s-hopscotch .CodeMirror-cursor {border-left: 1px solid #989498 !important;}\n\n.cm-s-hopscotch span.cm-comment {color: #b33508;}\n.cm-s-hopscotch span.cm-atom {color: #c85e7c;}\n.cm-s-hopscotch span.cm-number {color: #c85e7c;}\n\n.cm-s-hopscotch span.cm-property, .cm-s-hopscotch span.cm-attribute {color: #8fc13e;}\n.cm-s-hopscotch span.cm-keyword {color: #dd464c;}\n.cm-s-hopscotch span.cm-string {color: #fdcc59;}\n\n.cm-s-hopscotch span.cm-variable {color: #8fc13e;}\n.cm-s-hopscotch span.cm-variable-2 {color: #1290bf;}\n.cm-s-hopscotch span.cm-def {color: #fd8b19;}\n.cm-s-hopscotch span.cm-error {background: #dd464c; color: #989498;}\n.cm-s-hopscotch span.cm-bracket {color: #d5d3d5;}\n.cm-s-hopscotch span.cm-tag {color: #dd464c;}\n.cm-s-hopscotch span.cm-link {color: #c85e7c;}\n\n.cm-s-hopscotch .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n.cm-s-hopscotch .CodeMirror-activeline-background { background: #302020; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/icecoder.css",
    "content": "/*\nICEcoder default theme by Matt Pass, used in code editor available at https://icecoder.net\n*/\n\n.cm-s-icecoder { color: #666; background: #1d1d1b; }\n\n.cm-s-icecoder span.cm-keyword { color: #eee; font-weight:bold; }  /* off-white 1 */\n.cm-s-icecoder span.cm-atom { color: #e1c76e; }                    /* yellow */\n.cm-s-icecoder span.cm-number { color: #6cb5d9; }                  /* blue */\n.cm-s-icecoder span.cm-def { color: #b9ca4a; }                     /* green */\n\n.cm-s-icecoder span.cm-variable { color: #6cb5d9; }                /* blue */\n.cm-s-icecoder span.cm-variable-2 { color: #cc1e5c; }              /* pink */\n.cm-s-icecoder span.cm-variable-3, .cm-s-icecoder span.cm-type { color: #f9602c; } /* orange */\n\n.cm-s-icecoder span.cm-property { color: #eee; }                   /* off-white 1 */\n.cm-s-icecoder span.cm-operator { color: #9179bb; }                /* purple */\n.cm-s-icecoder span.cm-comment { color: #97a3aa; }                 /* grey-blue */\n\n.cm-s-icecoder span.cm-string { color: #b9ca4a; }                  /* green */\n.cm-s-icecoder span.cm-string-2 { color: #6cb5d9; }                /* blue */\n\n.cm-s-icecoder span.cm-meta { color: #555; }                       /* grey */\n\n.cm-s-icecoder span.cm-qualifier { color: #555; }                  /* grey */\n.cm-s-icecoder span.cm-builtin { color: #214e7b; }                 /* bright blue */\n.cm-s-icecoder span.cm-bracket { color: #cc7; }                    /* grey-yellow */\n\n.cm-s-icecoder span.cm-tag { color: #e8e8e8; }                     /* off-white 2 */\n.cm-s-icecoder span.cm-attribute { color: #099; }                  /* teal */\n\n.cm-s-icecoder span.cm-header { color: #6a0d6a; }                  /* purple-pink */\n.cm-s-icecoder span.cm-quote { color: #186718; }                   /* dark green */\n.cm-s-icecoder span.cm-hr { color: #888; }                         /* mid-grey */\n.cm-s-icecoder span.cm-link { color: #e1c76e; }                    /* yellow */\n.cm-s-icecoder span.cm-error { color: #d00; }                      /* red */\n\n.cm-s-icecoder .CodeMirror-cursor { border-left: 1px solid white; }\n.cm-s-icecoder div.CodeMirror-selected { color: #fff; background: #037; }\n.cm-s-icecoder .CodeMirror-gutters { background: #1d1d1b; min-width: 41px; border-right: 0; }\n.cm-s-icecoder .CodeMirror-linenumber { color: #555; cursor: default; }\n.cm-s-icecoder .CodeMirror-matchingbracket { color: #fff !important; background: #555 !important; }\n.cm-s-icecoder .CodeMirror-activeline-background { background: #000; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/idea.css",
    "content": "/**\n    Name:       IDEA default theme\n    From IntelliJ IDEA by JetBrains\n */\n\n.cm-s-idea span.cm-meta { color: #808000; }\n.cm-s-idea span.cm-number { color: #0000FF; }\n.cm-s-idea span.cm-keyword { line-height: 1em; font-weight: bold; color: #000080; }\n.cm-s-idea span.cm-atom { font-weight: bold; color: #000080; }\n.cm-s-idea span.cm-def { color: #000000; }\n.cm-s-idea span.cm-variable { color: black; }\n.cm-s-idea span.cm-variable-2 { color: black; }\n.cm-s-idea span.cm-variable-3, .cm-s-idea span.cm-type { color: black; }\n.cm-s-idea span.cm-property { color: black; }\n.cm-s-idea span.cm-operator { color: black; }\n.cm-s-idea span.cm-comment { color: #808080; }\n.cm-s-idea span.cm-string { color: #008000; }\n.cm-s-idea span.cm-string-2 { color: #008000; }\n.cm-s-idea span.cm-qualifier { color: #555; }\n.cm-s-idea span.cm-error { color: #FF0000; }\n.cm-s-idea span.cm-attribute { color: #0000FF; }\n.cm-s-idea span.cm-tag { color: #000080; }\n.cm-s-idea span.cm-link { color: #0000FF; }\n.cm-s-idea .CodeMirror-activeline-background { background: #FFFAE3; }\n\n.cm-s-idea span.cm-builtin { color: #30a; }\n.cm-s-idea span.cm-bracket { color: #cc7; }\n.cm-s-idea  { font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;}\n\n\n.cm-s-idea .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; }\n\n.CodeMirror-hints.idea {\n  font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;\n  color: #616569;\n  background-color: #ebf3fd !important;\n}\n\n.CodeMirror-hints.idea .CodeMirror-hint-active {\n  background-color: #a2b8c9 !important;\n  color: #5c6065 !important;\n}"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/isotope.css",
    "content": "/*\n\n    Name:       Isotope\n    Author:     David Desandro / Jan T. Sott\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-isotope.CodeMirror {background: #000000; color: #e0e0e0;}\n.cm-s-isotope div.CodeMirror-selected {background: #404040 !important;}\n.cm-s-isotope .CodeMirror-gutters {background: #000000; border-right: 0px;}\n.cm-s-isotope .CodeMirror-linenumber {color: #808080;}\n.cm-s-isotope .CodeMirror-cursor {border-left: 1px solid #c0c0c0 !important;}\n\n.cm-s-isotope span.cm-comment {color: #3300ff;}\n.cm-s-isotope span.cm-atom {color: #cc00ff;}\n.cm-s-isotope span.cm-number {color: #cc00ff;}\n\n.cm-s-isotope span.cm-property, .cm-s-isotope span.cm-attribute {color: #33ff00;}\n.cm-s-isotope span.cm-keyword {color: #ff0000;}\n.cm-s-isotope span.cm-string {color: #ff0099;}\n\n.cm-s-isotope span.cm-variable {color: #33ff00;}\n.cm-s-isotope span.cm-variable-2 {color: #0066ff;}\n.cm-s-isotope span.cm-def {color: #ff9900;}\n.cm-s-isotope span.cm-error {background: #ff0000; color: #c0c0c0;}\n.cm-s-isotope span.cm-bracket {color: #e0e0e0;}\n.cm-s-isotope span.cm-tag {color: #ff0000;}\n.cm-s-isotope span.cm-link {color: #cc00ff;}\n\n.cm-s-isotope .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n.cm-s-isotope .CodeMirror-activeline-background { background: #202020; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/juejin.css",
    "content": ".cm-s-juejin.CodeMirror {\n  background: #f8f9fa;\n}\n.cm-s-juejin .cm-header,\n.cm-s-juejin .cm-def {\n  color: #1ba2f0;\n}\n.cm-s-juejin .cm-comment {\n  color: #009e9d;\n}\n.cm-s-juejin .cm-quote,\n.cm-s-juejin .cm-link,\n.cm-s-juejin .cm-strong,\n.cm-s-juejin .cm-attribute {\n  color: #fd7741;\n}\n.cm-s-juejin .cm-url,\n.cm-s-juejin .cm-keyword,\n.cm-s-juejin .cm-builtin {\n  color: #bb51b8;\n}\n.cm-s-juejin .cm-hr {\n  color: #909090;\n}\n.cm-s-juejin .cm-tag {\n  color: #107000;\n}\n.cm-s-juejin .cm-variable-2 {\n  color: #0050a0;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/lesser-dark.css",
    "content": "/*\nhttp://lesscss.org/ dark theme\nPorted to CodeMirror by Peter Kroon\n*/\n.cm-s-lesser-dark {\n  line-height: 1.3em;\n}\n.cm-s-lesser-dark.CodeMirror { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; }\n.cm-s-lesser-dark div.CodeMirror-selected { background: #45443B; } /* 33322B*/\n.cm-s-lesser-dark .CodeMirror-line::selection, .cm-s-lesser-dark .CodeMirror-line > span::selection, .cm-s-lesser-dark .CodeMirror-line > span > span::selection { background: rgba(69, 68, 59, .99); }\n.cm-s-lesser-dark .CodeMirror-line::-moz-selection, .cm-s-lesser-dark .CodeMirror-line > span::-moz-selection, .cm-s-lesser-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(69, 68, 59, .99); }\n.cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white; }\n.cm-s-lesser-dark pre { padding: 0 8px; }/*editable code holder*/\n\n.cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/\n\n.cm-s-lesser-dark .CodeMirror-gutters { background: #262626; border-right:1px solid #aaa; }\n.cm-s-lesser-dark .CodeMirror-guttermarker { color: #599eff; }\n.cm-s-lesser-dark .CodeMirror-guttermarker-subtle { color: #777; }\n.cm-s-lesser-dark .CodeMirror-linenumber { color: #777; }\n\n.cm-s-lesser-dark span.cm-header { color: #a0a; }\n.cm-s-lesser-dark span.cm-quote { color: #090; }\n.cm-s-lesser-dark span.cm-keyword { color: #599eff; }\n.cm-s-lesser-dark span.cm-atom { color: #C2B470; }\n.cm-s-lesser-dark span.cm-number { color: #B35E4D; }\n.cm-s-lesser-dark span.cm-def { color: white; }\n.cm-s-lesser-dark span.cm-variable { color:#D9BF8C; }\n.cm-s-lesser-dark span.cm-variable-2 { color: #669199; }\n.cm-s-lesser-dark span.cm-variable-3, .cm-s-lesser-dark span.cm-type { color: white; }\n.cm-s-lesser-dark span.cm-property { color: #92A75C; }\n.cm-s-lesser-dark span.cm-operator { color: #92A75C; }\n.cm-s-lesser-dark span.cm-comment { color: #666; }\n.cm-s-lesser-dark span.cm-string { color: #BCD279; }\n.cm-s-lesser-dark span.cm-string-2 { color: #f50; }\n.cm-s-lesser-dark span.cm-meta { color: #738C73; }\n.cm-s-lesser-dark span.cm-qualifier { color: #555; }\n.cm-s-lesser-dark span.cm-builtin { color: #ff9e59; }\n.cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; }\n.cm-s-lesser-dark span.cm-tag { color: #669199; }\n.cm-s-lesser-dark span.cm-attribute { color: #81a4d5; }\n.cm-s-lesser-dark span.cm-hr { color: #999; }\n.cm-s-lesser-dark span.cm-link { color: #7070E6; }\n.cm-s-lesser-dark span.cm-error { color: #9d1e15; }\n\n.cm-s-lesser-dark .CodeMirror-activeline-background { background: #3C3A3A; }\n.cm-s-lesser-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/liquibyte.css",
    "content": ".cm-s-liquibyte.CodeMirror {\n\tbackground-color: #000;\n\tcolor: #fff;\n\tline-height: 1.2em;\n\tfont-size: 1em;\n}\n.cm-s-liquibyte .CodeMirror-focused .cm-matchhighlight {\n\ttext-decoration: underline;\n\ttext-decoration-color: #0f0;\n\ttext-decoration-style: wavy;\n}\n.cm-s-liquibyte .cm-trailingspace {\n\ttext-decoration: line-through;\n\ttext-decoration-color: #f00;\n\ttext-decoration-style: dotted;\n}\n.cm-s-liquibyte .cm-tab {\n\ttext-decoration: line-through;\n\ttext-decoration-color: #404040;\n\ttext-decoration-style: dotted;\n}\n.cm-s-liquibyte .CodeMirror-gutters { background-color: #262626; border-right: 1px solid #505050; padding-right: 0.8em; }\n.cm-s-liquibyte .CodeMirror-gutter-elt div { font-size: 1.2em; }\n.cm-s-liquibyte .CodeMirror-guttermarker {  }\n.cm-s-liquibyte .CodeMirror-guttermarker-subtle {  }\n.cm-s-liquibyte .CodeMirror-linenumber { color: #606060; padding-left: 0; }\n.cm-s-liquibyte .CodeMirror-cursor { border-left: 1px solid #eee; }\n\n.cm-s-liquibyte span.cm-comment     { color: #008000; }\n.cm-s-liquibyte span.cm-def         { color: #ffaf40; font-weight: bold; }\n.cm-s-liquibyte span.cm-keyword     { color: #c080ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-builtin     { color: #ffaf40; font-weight: bold; }\n.cm-s-liquibyte span.cm-variable    { color: #5967ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-string      { color: #ff8000; }\n.cm-s-liquibyte span.cm-number      { color: #0f0; font-weight: bold; }\n.cm-s-liquibyte span.cm-atom        { color: #bf3030; font-weight: bold; }\n\n.cm-s-liquibyte span.cm-variable-2  { color: #007f7f; font-weight: bold; }\n.cm-s-liquibyte span.cm-variable-3, .cm-s-liquibyte span.cm-type { color: #c080ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-property    { color: #999; font-weight: bold; }\n.cm-s-liquibyte span.cm-operator    { color: #fff; }\n\n.cm-s-liquibyte span.cm-meta        { color: #0f0; }\n.cm-s-liquibyte span.cm-qualifier   { color: #fff700; font-weight: bold; }\n.cm-s-liquibyte span.cm-bracket     { color: #cc7; }\n.cm-s-liquibyte span.cm-tag         { color: #ff0; font-weight: bold; }\n.cm-s-liquibyte span.cm-attribute   { color: #c080ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-error       { color: #f00; }\n\n.cm-s-liquibyte div.CodeMirror-selected { background-color: rgba(255, 0, 0, 0.25); }\n\n.cm-s-liquibyte span.cm-compilation { background-color: rgba(255, 255, 255, 0.12); }\n\n.cm-s-liquibyte .CodeMirror-activeline-background { background-color: rgba(0, 255, 0, 0.15); }\n\n/* Default styles for common addons */\n.cm-s-liquibyte .CodeMirror span.CodeMirror-matchingbracket { color: #0f0; font-weight: bold; }\n.cm-s-liquibyte .CodeMirror span.CodeMirror-nonmatchingbracket { color: #f00; font-weight: bold; }\n.CodeMirror-matchingtag { background-color: rgba(150, 255, 0, .3); }\n/* Scrollbars */\n/* Simple */\n.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div:hover, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div:hover {\n\tbackground-color: rgba(80, 80, 80, .7);\n}\n.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div {\n\tbackground-color: rgba(80, 80, 80, .3);\n\tborder: 1px solid #404040;\n\tborder-radius: 5px;\n}\n.cm-s-liquibyte div.CodeMirror-simplescroll-vertical div {\n\tborder-top: 1px solid #404040;\n\tborder-bottom: 1px solid #404040;\n}\n.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div {\n\tborder-left: 1px solid #404040;\n\tborder-right: 1px solid #404040;\n}\n.cm-s-liquibyte div.CodeMirror-simplescroll-vertical {\n\tbackground-color: #262626;\n}\n.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal {\n\tbackground-color: #262626;\n\tborder-top: 1px solid #404040;\n}\n/* Overlay */\n.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div, div.CodeMirror-overlayscroll-vertical div {\n\tbackground-color: #404040;\n\tborder-radius: 5px;\n}\n.cm-s-liquibyte div.CodeMirror-overlayscroll-vertical div {\n\tborder: 1px solid #404040;\n}\n.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div {\n\tborder: 1px solid #404040;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/lucario.css",
    "content": "/*\n  Name:       lucario\n  Author:     Raphael Amorim\n\n  Original Lucario color scheme (https://github.com/raphamorim/lucario)\n*/\n\n.cm-s-lucario.CodeMirror, .cm-s-lucario .CodeMirror-gutters {\n  background-color: #2b3e50 !important;\n  color: #f8f8f2 !important;\n  border: none;\n}\n.cm-s-lucario .CodeMirror-gutters { color: #2b3e50; }\n.cm-s-lucario .CodeMirror-cursor { border-left: solid thin #E6C845; }\n.cm-s-lucario .CodeMirror-linenumber { color: #f8f8f2; }\n.cm-s-lucario .CodeMirror-selected { background: #243443; }\n.cm-s-lucario .CodeMirror-line::selection, .cm-s-lucario .CodeMirror-line > span::selection, .cm-s-lucario .CodeMirror-line > span > span::selection { background: #243443; }\n.cm-s-lucario .CodeMirror-line::-moz-selection, .cm-s-lucario .CodeMirror-line > span::-moz-selection, .cm-s-lucario .CodeMirror-line > span > span::-moz-selection { background: #243443; }\n.cm-s-lucario span.cm-comment { color: #5c98cd; }\n.cm-s-lucario span.cm-string, .cm-s-lucario span.cm-string-2 { color: #E6DB74; }\n.cm-s-lucario span.cm-number { color: #ca94ff; }\n.cm-s-lucario span.cm-variable { color: #f8f8f2; }\n.cm-s-lucario span.cm-variable-2 { color: #f8f8f2; }\n.cm-s-lucario span.cm-def { color: #72C05D; }\n.cm-s-lucario span.cm-operator { color: #66D9EF; }\n.cm-s-lucario span.cm-keyword { color: #ff6541; }\n.cm-s-lucario span.cm-atom { color: #bd93f9; }\n.cm-s-lucario span.cm-meta { color: #f8f8f2; }\n.cm-s-lucario span.cm-tag { color: #ff6541; }\n.cm-s-lucario span.cm-attribute { color: #66D9EF; }\n.cm-s-lucario span.cm-qualifier { color: #72C05D; }\n.cm-s-lucario span.cm-property { color: #f8f8f2; }\n.cm-s-lucario span.cm-builtin { color: #72C05D; }\n.cm-s-lucario span.cm-variable-3, .cm-s-lucario span.cm-type { color: #ffb86c; }\n\n.cm-s-lucario .CodeMirror-activeline-background { background: #243443; }\n.cm-s-lucario .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/material-darker.css",
    "content": "/*\n  Name:       material\n  Author:     Mattia Astorino (http://github.com/equinusocio)\n  Website:    https://material-theme.site/\n*/\n\n.cm-s-material-darker.CodeMirror {\n  background-color: #212121;\n  color: #EEFFFF;\n}\n\n.cm-s-material-darker .CodeMirror-gutters {\n  background: #212121;\n  color: #545454;\n  border: none;\n}\n\n.cm-s-material-darker .CodeMirror-guttermarker,\n.cm-s-material-darker .CodeMirror-guttermarker-subtle,\n.cm-s-material-darker .CodeMirror-linenumber {\n  color: #545454;\n}\n\n.cm-s-material-darker .CodeMirror-cursor {\n  border-left: 1px solid #FFCC00;\n}\n\n.cm-s-material-darker div.CodeMirror-selected {\n  background: rgba(97, 97, 97, 0.2);\n}\n\n.cm-s-material-darker.CodeMirror-focused div.CodeMirror-selected {\n  background: rgba(97, 97, 97, 0.2);\n}\n\n.cm-s-material-darker .CodeMirror-line::selection,\n.cm-s-material-darker .CodeMirror-line>span::selection,\n.cm-s-material-darker .CodeMirror-line>span>span::selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-darker .CodeMirror-line::-moz-selection,\n.cm-s-material-darker .CodeMirror-line>span::-moz-selection,\n.cm-s-material-darker .CodeMirror-line>span>span::-moz-selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-darker .CodeMirror-activeline-background {\n  background: rgba(0, 0, 0, 0.5);\n}\n\n.cm-s-material-darker .cm-keyword {\n  color: #C792EA;\n}\n\n.cm-s-material-darker .cm-operator {\n  color: #89DDFF;\n}\n\n.cm-s-material-darker .cm-variable-2 {\n  color: #EEFFFF;\n}\n\n.cm-s-material-darker .cm-variable-3,\n.cm-s-material-darker .cm-type {\n  color: #f07178;\n}\n\n.cm-s-material-darker .cm-builtin {\n  color: #FFCB6B;\n}\n\n.cm-s-material-darker .cm-atom {\n  color: #F78C6C;\n}\n\n.cm-s-material-darker .cm-number {\n  color: #FF5370;\n}\n\n.cm-s-material-darker .cm-def {\n  color: #82AAFF;\n}\n\n.cm-s-material-darker .cm-string {\n  color: #C3E88D;\n}\n\n.cm-s-material-darker .cm-string-2 {\n  color: #f07178;\n}\n\n.cm-s-material-darker .cm-comment {\n  color: #545454;\n}\n\n.cm-s-material-darker .cm-variable {\n  color: #f07178;\n}\n\n.cm-s-material-darker .cm-tag {\n  color: #FF5370;\n}\n\n.cm-s-material-darker .cm-meta {\n  color: #FFCB6B;\n}\n\n.cm-s-material-darker .cm-attribute {\n  color: #C792EA;\n}\n\n.cm-s-material-darker .cm-property {\n  color: #C792EA;\n}\n\n.cm-s-material-darker .cm-qualifier {\n  color: #DECB6B;\n}\n\n.cm-s-material-darker .cm-variable-3,\n.cm-s-material-darker .cm-type {\n  color: #DECB6B;\n}\n\n\n.cm-s-material-darker .cm-error {\n  color: rgba(255, 255, 255, 1.0);\n  background-color: #FF5370;\n}\n\n.cm-s-material-darker .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/material-ocean.css",
    "content": "/*\n  Name:       material\n  Author:     Mattia Astorino (http://github.com/equinusocio)\n  Website:    https://material-theme.site/\n*/\n\n.cm-s-material-ocean.CodeMirror {\n  background-color: #0F111A;\n  color: #8F93A2;\n}\n\n.cm-s-material-ocean .CodeMirror-gutters {\n  background: #0F111A;\n  color: #464B5D;\n  border: none;\n}\n\n.cm-s-material-ocean .CodeMirror-guttermarker,\n.cm-s-material-ocean .CodeMirror-guttermarker-subtle,\n.cm-s-material-ocean .CodeMirror-linenumber {\n  color: #464B5D;\n}\n\n.cm-s-material-ocean .CodeMirror-cursor {\n  border-left: 1px solid #FFCC00;\n}\n.cm-s-material-ocean.cm-fat-cursor .CodeMirror-cursor {\n  background-color: #a2a8a175 !important;\n}\n.cm-s-material-ocean .cm-animate-fat-cursor {\n  background-color: #a2a8a175 !important;\n}\n\n.cm-s-material-ocean div.CodeMirror-selected {\n  background: rgba(113, 124, 180, 0.2);\n}\n\n.cm-s-material-ocean.CodeMirror-focused div.CodeMirror-selected {\n  background: rgba(113, 124, 180, 0.2);\n}\n\n.cm-s-material-ocean .CodeMirror-line::selection,\n.cm-s-material-ocean .CodeMirror-line>span::selection,\n.cm-s-material-ocean .CodeMirror-line>span>span::selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-ocean .CodeMirror-line::-moz-selection,\n.cm-s-material-ocean .CodeMirror-line>span::-moz-selection,\n.cm-s-material-ocean .CodeMirror-line>span>span::-moz-selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-ocean .CodeMirror-activeline-background {\n  background: rgba(0, 0, 0, 0.5);\n}\n\n.cm-s-material-ocean .cm-keyword {\n  color: #C792EA;\n}\n\n.cm-s-material-ocean .cm-operator {\n  color: #89DDFF;\n}\n\n.cm-s-material-ocean .cm-variable-2 {\n  color: #EEFFFF;\n}\n\n.cm-s-material-ocean .cm-variable-3,\n.cm-s-material-ocean .cm-type {\n  color: #f07178;\n}\n\n.cm-s-material-ocean .cm-builtin {\n  color: #FFCB6B;\n}\n\n.cm-s-material-ocean .cm-atom {\n  color: #F78C6C;\n}\n\n.cm-s-material-ocean .cm-number {\n  color: #FF5370;\n}\n\n.cm-s-material-ocean .cm-def {\n  color: #82AAFF;\n}\n\n.cm-s-material-ocean .cm-string {\n  color: #C3E88D;\n}\n\n.cm-s-material-ocean .cm-string-2 {\n  color: #f07178;\n}\n\n.cm-s-material-ocean .cm-comment {\n  color: #464B5D;\n}\n\n.cm-s-material-ocean .cm-variable {\n  color: #f07178;\n}\n\n.cm-s-material-ocean .cm-tag {\n  color: #FF5370;\n}\n\n.cm-s-material-ocean .cm-meta {\n  color: #FFCB6B;\n}\n\n.cm-s-material-ocean .cm-attribute {\n  color: #C792EA;\n}\n\n.cm-s-material-ocean .cm-property {\n  color: #C792EA;\n}\n\n.cm-s-material-ocean .cm-qualifier {\n  color: #DECB6B;\n}\n\n.cm-s-material-ocean .cm-variable-3,\n.cm-s-material-ocean .cm-type {\n  color: #DECB6B;\n}\n\n\n.cm-s-material-ocean .cm-error {\n  color: rgba(255, 255, 255, 1.0);\n  background-color: #FF5370;\n}\n\n.cm-s-material-ocean .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/material-palenight.css",
    "content": "/*\n  Name:       material\n  Author:     Mattia Astorino (http://github.com/equinusocio)\n  Website:    https://material-theme.site/\n*/\n\n.cm-s-material-palenight.CodeMirror {\n  background-color: #292D3E;\n  color: #A6ACCD;\n}\n\n.cm-s-material-palenight .CodeMirror-gutters {\n  background: #292D3E;\n  color: #676E95;\n  border: none;\n}\n\n.cm-s-material-palenight .CodeMirror-guttermarker,\n.cm-s-material-palenight .CodeMirror-guttermarker-subtle,\n.cm-s-material-palenight .CodeMirror-linenumber {\n  color: #676E95;\n}\n\n.cm-s-material-palenight .CodeMirror-cursor {\n  border-left: 1px solid #FFCC00;\n}\n.cm-s-material-palenight.cm-fat-cursor .CodeMirror-cursor {\n  background-color: #607c8b80 !important;\n}\n.cm-s-material-palenight .cm-animate-fat-cursor {\n  background-color: #607c8b80 !important;\n}\n\n.cm-s-material-palenight div.CodeMirror-selected {\n  background: rgba(113, 124, 180, 0.2);\n}\n\n.cm-s-material-palenight.CodeMirror-focused div.CodeMirror-selected {\n  background: rgba(113, 124, 180, 0.2);\n}\n\n.cm-s-material-palenight .CodeMirror-line::selection,\n.cm-s-material-palenight .CodeMirror-line>span::selection,\n.cm-s-material-palenight .CodeMirror-line>span>span::selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-palenight .CodeMirror-line::-moz-selection,\n.cm-s-material-palenight .CodeMirror-line>span::-moz-selection,\n.cm-s-material-palenight .CodeMirror-line>span>span::-moz-selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material-palenight .CodeMirror-activeline-background {\n  background: rgba(0, 0, 0, 0.5);\n}\n\n.cm-s-material-palenight .cm-keyword {\n  color: #C792EA;\n}\n\n.cm-s-material-palenight .cm-operator {\n  color: #89DDFF;\n}\n\n.cm-s-material-palenight .cm-variable-2 {\n  color: #EEFFFF;\n}\n\n.cm-s-material-palenight .cm-variable-3,\n.cm-s-material-palenight .cm-type {\n  color: #f07178;\n}\n\n.cm-s-material-palenight .cm-builtin {\n  color: #FFCB6B;\n}\n\n.cm-s-material-palenight .cm-atom {\n  color: #F78C6C;\n}\n\n.cm-s-material-palenight .cm-number {\n  color: #FF5370;\n}\n\n.cm-s-material-palenight .cm-def {\n  color: #82AAFF;\n}\n\n.cm-s-material-palenight .cm-string {\n  color: #C3E88D;\n}\n\n.cm-s-material-palenight .cm-string-2 {\n  color: #f07178;\n}\n\n.cm-s-material-palenight .cm-comment {\n  color: #676E95;\n}\n\n.cm-s-material-palenight .cm-variable {\n  color: #f07178;\n}\n\n.cm-s-material-palenight .cm-tag {\n  color: #FF5370;\n}\n\n.cm-s-material-palenight .cm-meta {\n  color: #FFCB6B;\n}\n\n.cm-s-material-palenight .cm-attribute {\n  color: #C792EA;\n}\n\n.cm-s-material-palenight .cm-property {\n  color: #C792EA;\n}\n\n.cm-s-material-palenight .cm-qualifier {\n  color: #DECB6B;\n}\n\n.cm-s-material-palenight .cm-variable-3,\n.cm-s-material-palenight .cm-type {\n  color: #DECB6B;\n}\n\n\n.cm-s-material-palenight .cm-error {\n  color: rgba(255, 255, 255, 1.0);\n  background-color: #FF5370;\n}\n\n.cm-s-material-palenight .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/material.css",
    "content": "/*\n  Name:       material\n  Author:     Mattia Astorino (http://github.com/equinusocio)\n  Website:    https://material-theme.site/\n*/\n\n.cm-s-material.CodeMirror {\n  background-color: #263238;\n  color: #EEFFFF;\n}\n\n.cm-s-material .CodeMirror-gutters {\n  background: #263238;\n  color: #546E7A;\n  border: none;\n}\n\n.cm-s-material .CodeMirror-guttermarker,\n.cm-s-material .CodeMirror-guttermarker-subtle,\n.cm-s-material .CodeMirror-linenumber {\n  color: #546E7A;\n}\n\n.cm-s-material .CodeMirror-cursor {\n  border-left: 1px solid #FFCC00;\n}\n.cm-s-material.cm-fat-cursor .CodeMirror-cursor {\n  background-color: #5d6d5c80 !important;\n}\n.cm-s-material .cm-animate-fat-cursor {\n  background-color: #5d6d5c80 !important;\n}\n\n.cm-s-material div.CodeMirror-selected {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material.CodeMirror-focused div.CodeMirror-selected {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material .CodeMirror-line::selection,\n.cm-s-material .CodeMirror-line>span::selection,\n.cm-s-material .CodeMirror-line>span>span::selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material .CodeMirror-line::-moz-selection,\n.cm-s-material .CodeMirror-line>span::-moz-selection,\n.cm-s-material .CodeMirror-line>span>span::-moz-selection {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-material .CodeMirror-activeline-background {\n  background: rgba(0, 0, 0, 0.5);\n}\n\n.cm-s-material .cm-keyword {\n  color: #C792EA;\n}\n\n.cm-s-material .cm-operator {\n  color: #89DDFF;\n}\n\n.cm-s-material .cm-variable-2 {\n  color: #EEFFFF;\n}\n\n.cm-s-material .cm-variable-3,\n.cm-s-material .cm-type {\n  color: #f07178;\n}\n\n.cm-s-material .cm-builtin {\n  color: #FFCB6B;\n}\n\n.cm-s-material .cm-atom {\n  color: #F78C6C;\n}\n\n.cm-s-material .cm-number {\n  color: #FF5370;\n}\n\n.cm-s-material .cm-def {\n  color: #82AAFF;\n}\n\n.cm-s-material .cm-string {\n  color: #C3E88D;\n}\n\n.cm-s-material .cm-string-2 {\n  color: #f07178;\n}\n\n.cm-s-material .cm-comment {\n  color: #546E7A;\n}\n\n.cm-s-material .cm-variable {\n  color: #f07178;\n}\n\n.cm-s-material .cm-tag {\n  color: #FF5370;\n}\n\n.cm-s-material .cm-meta {\n  color: #FFCB6B;\n}\n\n.cm-s-material .cm-attribute {\n  color: #C792EA;\n}\n\n.cm-s-material .cm-property {\n  color: #C792EA;\n}\n\n.cm-s-material .cm-qualifier {\n  color: #DECB6B;\n}\n\n.cm-s-material .cm-variable-3,\n.cm-s-material .cm-type {\n  color: #DECB6B;\n}\n\n\n.cm-s-material .cm-error {\n  color: rgba(255, 255, 255, 1.0);\n  background-color: #FF5370;\n}\n\n.cm-s-material .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/mbo.css",
    "content": "/****************************************************************/\n/*   Based on mbonaci's Brackets mbo theme                      */\n/*   https://github.com/mbonaci/global/blob/master/Mbo.tmTheme  */\n/*   Create your own: http://tmtheme-editor.herokuapp.com       */\n/****************************************************************/\n\n.cm-s-mbo.CodeMirror { background: #2c2c2c; color: #ffffec; }\n.cm-s-mbo div.CodeMirror-selected { background: #716C62; }\n.cm-s-mbo .CodeMirror-line::selection, .cm-s-mbo .CodeMirror-line > span::selection, .cm-s-mbo .CodeMirror-line > span > span::selection { background: rgba(113, 108, 98, .99); }\n.cm-s-mbo .CodeMirror-line::-moz-selection, .cm-s-mbo .CodeMirror-line > span::-moz-selection, .cm-s-mbo .CodeMirror-line > span > span::-moz-selection { background: rgba(113, 108, 98, .99); }\n.cm-s-mbo .CodeMirror-gutters { background: #4e4e4e; border-right: 0px; }\n.cm-s-mbo .CodeMirror-guttermarker { color: white; }\n.cm-s-mbo .CodeMirror-guttermarker-subtle { color: grey; }\n.cm-s-mbo .CodeMirror-linenumber { color: #dadada; }\n.cm-s-mbo .CodeMirror-cursor { border-left: 1px solid #ffffec; }\n\n.cm-s-mbo span.cm-comment { color: #95958a; }\n.cm-s-mbo span.cm-atom { color: #00a8c6; }\n.cm-s-mbo span.cm-number { color: #00a8c6; }\n\n.cm-s-mbo span.cm-property, .cm-s-mbo span.cm-attribute { color: #9ddfe9; }\n.cm-s-mbo span.cm-keyword { color: #ffb928; }\n.cm-s-mbo span.cm-string { color: #ffcf6c; }\n.cm-s-mbo span.cm-string.cm-property { color: #ffffec; }\n\n.cm-s-mbo span.cm-variable { color: #ffffec; }\n.cm-s-mbo span.cm-variable-2 { color: #00a8c6; }\n.cm-s-mbo span.cm-def { color: #ffffec; }\n.cm-s-mbo span.cm-bracket { color: #fffffc; font-weight: bold; }\n.cm-s-mbo span.cm-tag { color: #9ddfe9; }\n.cm-s-mbo span.cm-link { color: #f54b07; }\n.cm-s-mbo span.cm-error { border-bottom: #636363; color: #ffffec; }\n.cm-s-mbo span.cm-qualifier { color: #ffffec; }\n\n.cm-s-mbo .CodeMirror-activeline-background { background: #494b41; }\n.cm-s-mbo .CodeMirror-matchingbracket { color: #ffb928 !important; }\n.cm-s-mbo .CodeMirror-matchingtag { background: rgba(255, 255, 255, .37); }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/mdn-like.css",
    "content": "/*\n  MDN-LIKE Theme - Mozilla\n  Ported to CodeMirror by Peter Kroon <plakroon@gmail.com>\n  Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues\n  GitHub: @peterkroon\n\n  The mdn-like theme is inspired on the displayed code examples at: https://developer.mozilla.org/en-US/docs/Web/CSS/animation\n\n*/\n.cm-s-mdn-like.CodeMirror { color: #999; background-color: #fff; }\n.cm-s-mdn-like div.CodeMirror-selected { background: #cfc; }\n.cm-s-mdn-like .CodeMirror-line::selection, .cm-s-mdn-like .CodeMirror-line > span::selection, .cm-s-mdn-like .CodeMirror-line > span > span::selection { background: #cfc; }\n.cm-s-mdn-like .CodeMirror-line::-moz-selection, .cm-s-mdn-like .CodeMirror-line > span::-moz-selection, .cm-s-mdn-like .CodeMirror-line > span > span::-moz-selection { background: #cfc; }\n\n.cm-s-mdn-like .CodeMirror-gutters { background: #f8f8f8; border-left: 6px solid rgba(0,83,159,0.65); color: #333; }\n.cm-s-mdn-like .CodeMirror-linenumber { color: #aaa; padding-left: 8px; }\n.cm-s-mdn-like .CodeMirror-cursor { border-left: 2px solid #222; }\n\n.cm-s-mdn-like .cm-keyword { color: #6262FF; }\n.cm-s-mdn-like .cm-atom { color: #F90; }\n.cm-s-mdn-like .cm-number { color:  #ca7841; }\n.cm-s-mdn-like .cm-def { color: #8DA6CE; }\n.cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; }\n.cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def, .cm-s-mdn-like span.cm-type { color: #07a; }\n\n.cm-s-mdn-like .cm-variable { color: #07a; }\n.cm-s-mdn-like .cm-property { color: #905; }\n.cm-s-mdn-like .cm-qualifier { color: #690; }\n\n.cm-s-mdn-like .cm-operator { color: #cda869; }\n.cm-s-mdn-like .cm-comment { color:#777; font-weight:normal; }\n.cm-s-mdn-like .cm-string { color:#07a; font-style:italic; }\n.cm-s-mdn-like .cm-string-2 { color:#bd6b18; } /*?*/\n.cm-s-mdn-like .cm-meta { color: #000; } /*?*/\n.cm-s-mdn-like .cm-builtin { color: #9B7536; } /*?*/\n.cm-s-mdn-like .cm-tag { color: #997643; }\n.cm-s-mdn-like .cm-attribute { color: #d6bb6d; } /*?*/\n.cm-s-mdn-like .cm-header { color: #FF6400; }\n.cm-s-mdn-like .cm-hr { color: #AEAEAE; }\n.cm-s-mdn-like .cm-link { color:#ad9361; font-style:italic; text-decoration:none; }\n.cm-s-mdn-like .cm-error { border-bottom: 1px solid red; }\n\ndiv.cm-s-mdn-like .CodeMirror-activeline-background { background: #efefff; }\ndiv.cm-s-mdn-like span.CodeMirror-matchingbracket { outline:1px solid grey; color: inherit; }\n\n.cm-s-mdn-like.CodeMirror { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFcAAAAyCAYAAAAp8UeFAAAHvklEQVR42s2b63bcNgyEQZCSHCdt2vd/0tWF7I+Q6XgMXiTtuvU5Pl57ZQKkKHzEAOtF5KeIJBGJ8uvL599FRFREZhFx8DeXv8trn68RuGaC8TRfo3SNp9dlDDHedyLyTUTeRWStXKPZrjtpZxaRw5hPqozRs1N8/enzIiQRWcCgy4MUA0f+XWliDhyL8Lfyvx7ei/Ae3iQFHyw7U/59pQVIMEEPEz0G7XiwdRjzSfC3UTtz9vchIntxvry5iMgfIhJoEflOz2CQr3F5h/HfeFe+GTdLaKcu9L8LTeQb/R/7GgbsfKedyNdoHsN31uRPWrfZ5wsj/NzzRQHuToIdU3ahwnsKPxXCjJITuOsi7XLc7SG/v5GdALs7wf8JjTFiB5+QvTEfRyGOfX3Lrx8wxyQi3sNq46O7QahQiCsRFgqddjBouVEHOKDgXAQHD9gJCr5sMKkEdjwsarG/ww3BMHBU7OBjXnzdyY7SfCxf5/z6ATccrwlKuwC/jhznnPF4CgVzhhVf4xp2EixcBActO75iZ8/fM9zAs2OMzKdslgXWJ9XG8PQoOAMA5fGcsvORgv0doBXyHrCwfLJAOwo71QLNkb8n2Pl6EWiR7OCibtkPaz4Kc/0NNAze2gju3zOwekALDaCFPI5vjPFmgGY5AZqyGEvH1x7QfIb8YtxMnA/b+QQ0aQDAwc6JMFg8CbQZ4qoYEEHbRwNojuK3EHwd7VALSgq+MNDKzfT58T8qdpADrgW0GmgcAS1lhzztJmkAzcPNOQbsWEALBDSlMKUG0Eq4CLAQWvEVQ9WU57gZJwZtgPO3r9oBTQ9WO8TjqXINx8R0EYpiZEUWOF3FxkbJkgU9B2f41YBrIj5ZfsQa0M5kTgiAAqM3ShXLgu8XMqcrQBvJ0CL5pnTsfMB13oB8athpAq2XOQmcGmoACCLydx7nToa23ATaSIY2ichfOdPTGxlasXMLaL0MLZAOwAKIM+y8CmicobGdCcbbK9DzN+yYGVoNNI5iUKTMyYOjPse4A8SM1MmcXgU0toOq1yO/v8FOxlASyc7TgeYaAMBJHcY1CcCwGI/TK4AmDbDyKYBBtFUkRwto8gygiQEaByFgJ00BH2M8JWwQS1nafDXQCidWyOI8AcjDCSjCLk8ngObuAm3JAHAdubAmOaK06V8MNEsKPJOhobSprwQa6gD7DclRQdqcwL4zxqgBrQcabUiBLclRDKAlWp+etPkBaNMA0AKlrHwTdEByZAA4GM+SNluSY6wAzcMNewxmgig5Ks0nkrSpBvSaQHMdKTBAnLojOdYyGpQ254602ZILPdTD1hdlggdIm74jbTp8vDwF5ZYUeLWGJpWsh6XNyXgcYwVoJQTEhhTYkxzZjiU5npU2TaB979TQehlaAVq4kaGpiPwwwLkYUuBbQwocyQTv1tA0+1UFWoJF3iv1oq+qoSk8EQdJmwHkziIF7oOZk14EGitibAdjLYYK78H5vZOhtWpoI0ATGHs0Q8OMb4Ey+2bU2UYztCtA0wFAs7TplGLRVQCcqaFdGSPCeTI1QNIC52iWNzof6Uib7xjEp07mNNoUYmVosVItHrHzRlLgBn9LFyRHaQCtVUMbtTNhoXWiTOO9k/V8BdAc1Oq0ArSQs6/5SU0hckNy9NnXqQY0PGYo5dWJ7nINaN6o958FWin27aBaWRka1r5myvLOAm0j30eBJqCxHLReVclxhxOEN2JfDWjxBtAC7MIH1fVaGdoOp4qJYDgKtKPSFNID2gSnGldrCqkFZ+5UeQXQBIRrSwocbdZYQT/2LwRahBPBXoHrB8nxaGROST62DKUbQOMMzZIC9abkuELfQzQALWTnDNAm8KHWFOJgJ5+SHIvTPcmx1xQyZRhNL5Qci689aXMEaN/uNIWkEwDAvFpOZmgsBaaGnbs1NPa1Jm32gBZAIh1pCtG7TSH4aE0y1uVY4uqoFPisGlpP2rSA5qTecWn5agK6BzSpgAyD+wFaqhnYoSZ1Vwr8CmlTQbrcO3ZaX0NAEyMbYaAlyquFoLKK3SPby9CeVUPThrSJmkCAE0CrKUQadi4DrdSlWhmah0YL9z9vClH59YGbHx1J8VZTyAjQepJjmXwAKTDQI3omc3p1U4gDUf6RfcdYfrUp5ClAi2J3Ba6UOXGo+K+bQrjjssitG2SJzshaLwMtXgRagUNpYYoVkMSBLM+9GGiJZMvduG6DRZ4qc04DMPtQQxOjEtACmhO7K1AbNbQDEggZyJwscFpAGwENhoBeUwh3bWolhe8BTYVKxQEWrSUn/uhcM5KhvUu/+eQu0Lzhi+VrK0PrZZNDQKs9cpYUuFYgMVpD4/NxenJTiMCNqdUEUf1qZWjppLT5qSkkUZbCwkbZMSuVnu80hfSkzRbQeqCZSAh6huR4VtoM2gHAlLf72smuWgE+VV7XpE25Ab2WFDgyhnSuKbs4GuGzCjR+tIoUuMFg3kgcWKLTwRqanJQ2W00hAsenfaApRC42hbCvK1SlE0HtE9BGgneJO+ELamitD1YjjOYnNYVcraGhtKkW0EqVVeDx733I2NH581k1NNxNLG0i0IJ8/NjVaOZ0tYZ2Vtr0Xv7tPV3hkWp9EFkgS/J0vosngTaSoaG06WHi+xObQkaAdlbanP8B2+2l0f90LmUAAAAASUVORK5CYII=); }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/midnight.css",
    "content": "/* Based on the theme at http://bonsaiden.github.com/JavaScript-Garden */\n\n/*<!--activeline-->*/\n.cm-s-midnight .CodeMirror-activeline-background { background: #253540; }\n\n.cm-s-midnight.CodeMirror {\n    background: #0F192A;\n    color: #D1EDFF;\n}\n\n.cm-s-midnight div.CodeMirror-selected { background: #314D67; }\n.cm-s-midnight .CodeMirror-line::selection, .cm-s-midnight .CodeMirror-line > span::selection, .cm-s-midnight .CodeMirror-line > span > span::selection { background: rgba(49, 77, 103, .99); }\n.cm-s-midnight .CodeMirror-line::-moz-selection, .cm-s-midnight .CodeMirror-line > span::-moz-selection, .cm-s-midnight .CodeMirror-line > span > span::-moz-selection { background: rgba(49, 77, 103, .99); }\n.cm-s-midnight .CodeMirror-gutters { background: #0F192A; border-right: 1px solid; }\n.cm-s-midnight .CodeMirror-guttermarker { color: white; }\n.cm-s-midnight .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-midnight .CodeMirror-linenumber { color: #D0D0D0; }\n.cm-s-midnight .CodeMirror-cursor { border-left: 1px solid #F8F8F0; }\n\n.cm-s-midnight span.cm-comment { color: #428BDD; }\n.cm-s-midnight span.cm-atom { color: #AE81FF; }\n.cm-s-midnight span.cm-number { color: #D1EDFF; }\n\n.cm-s-midnight span.cm-property, .cm-s-midnight span.cm-attribute { color: #A6E22E; }\n.cm-s-midnight span.cm-keyword { color: #E83737; }\n.cm-s-midnight span.cm-string { color: #1DC116; }\n\n.cm-s-midnight span.cm-variable { color: #FFAA3E; }\n.cm-s-midnight span.cm-variable-2 { color: #FFAA3E; }\n.cm-s-midnight span.cm-def { color: #4DD; }\n.cm-s-midnight span.cm-bracket { color: #D1EDFF; }\n.cm-s-midnight span.cm-tag { color: #449; }\n.cm-s-midnight span.cm-link { color: #AE81FF; }\n.cm-s-midnight span.cm-error { background: #F92672; color: #F8F8F0; }\n\n.cm-s-midnight .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/monokai.css",
    "content": "/* Based on Sublime Text's Monokai theme */\n\n.cm-s-monokai.CodeMirror { background: #272822; color: #f8f8f2; }\n.cm-s-monokai div.CodeMirror-selected { background: #49483E; }\n.cm-s-monokai .CodeMirror-line::selection, .cm-s-monokai .CodeMirror-line > span::selection, .cm-s-monokai .CodeMirror-line > span > span::selection { background: rgba(73, 72, 62, .99); }\n.cm-s-monokai .CodeMirror-line::-moz-selection, .cm-s-monokai .CodeMirror-line > span::-moz-selection, .cm-s-monokai .CodeMirror-line > span > span::-moz-selection { background: rgba(73, 72, 62, .99); }\n.cm-s-monokai .CodeMirror-gutters { background: #272822; border-right: 0px; }\n.cm-s-monokai .CodeMirror-guttermarker { color: white; }\n.cm-s-monokai .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-monokai .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-monokai .CodeMirror-cursor { border-left: 1px solid #f8f8f0; }\n\n.cm-s-monokai span.cm-comment { color: #75715e; }\n.cm-s-monokai span.cm-atom { color: #ae81ff; }\n.cm-s-monokai span.cm-number { color: #ae81ff; }\n\n.cm-s-monokai span.cm-comment.cm-attribute { color: #97b757; }\n.cm-s-monokai span.cm-comment.cm-def { color: #bc9262; }\n.cm-s-monokai span.cm-comment.cm-tag { color: #bc6283; }\n.cm-s-monokai span.cm-comment.cm-type { color: #5998a6; }\n\n.cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute { color: #a6e22e; }\n.cm-s-monokai span.cm-keyword { color: #f92672; }\n.cm-s-monokai span.cm-builtin { color: #66d9ef; }\n.cm-s-monokai span.cm-string { color: #e6db74; }\n\n.cm-s-monokai span.cm-variable { color: #f8f8f2; }\n.cm-s-monokai span.cm-variable-2 { color: #9effff; }\n.cm-s-monokai span.cm-variable-3, .cm-s-monokai span.cm-type { color: #66d9ef; }\n.cm-s-monokai span.cm-def { color: #fd971f; }\n.cm-s-monokai span.cm-bracket { color: #f8f8f2; }\n.cm-s-monokai span.cm-tag { color: #f92672; }\n.cm-s-monokai span.cm-header { color: #ae81ff; }\n.cm-s-monokai span.cm-link { color: #ae81ff; }\n.cm-s-monokai span.cm-error { background: #f92672; color: #f8f8f0; }\n\n.cm-s-monokai .CodeMirror-activeline-background { background: #373831; }\n.cm-s-monokai .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/moxer.css",
    "content": "/*\n  Name:       Moxer Theme\n  Author:     Mattia Astorino (http://github.com/equinusocio)\n  Website:    https://github.com/moxer-theme/moxer-code\n*/\n\n.cm-s-moxer.CodeMirror {\n  background-color: #090A0F;\n  color: #8E95B4;\n  line-height: 1.8;\n}\n\n.cm-s-moxer .CodeMirror-gutters {\n  background: #090A0F;\n  color: #35394B;\n  border: none;\n}\n\n.cm-s-moxer .CodeMirror-guttermarker,\n.cm-s-moxer .CodeMirror-guttermarker-subtle,\n.cm-s-moxer .CodeMirror-linenumber {\n  color: #35394B;\n}\n\n\n.cm-s-moxer .CodeMirror-cursor {\n  border-left: 1px solid #FFCC00;\n}\n\n.cm-s-moxer div.CodeMirror-selected {\n  background: rgba(128, 203, 196, 0.2);\n}\n\n.cm-s-moxer.CodeMirror-focused div.CodeMirror-selected {\n  background: #212431;\n}\n\n.cm-s-moxer .CodeMirror-line::selection,\n.cm-s-moxer .CodeMirror-line>span::selection,\n.cm-s-moxer .CodeMirror-line>span>span::selection {\n  background: #212431;\n}\n\n.cm-s-moxer .CodeMirror-line::-moz-selection,\n.cm-s-moxer .CodeMirror-line>span::-moz-selection,\n.cm-s-moxer .CodeMirror-line>span>span::-moz-selection {\n  background: #212431;\n}\n\n.cm-s-moxer .CodeMirror-activeline-background,\n.cm-s-moxer .CodeMirror-activeline-gutter .CodeMirror-linenumber {\n  background: rgba(33, 36, 49, 0.5);\n}\n\n.cm-s-moxer .cm-keyword {\n  color: #D46C6C;\n}\n\n.cm-s-moxer .cm-operator {\n  color: #D46C6C;\n}\n\n.cm-s-moxer .cm-variable-2 {\n  color: #81C5DA;\n}\n\n\n.cm-s-moxer .cm-variable-3,\n.cm-s-moxer .cm-type {\n  color: #f07178;\n}\n\n.cm-s-moxer .cm-builtin {\n  color: #FFCB6B;\n}\n\n.cm-s-moxer .cm-atom {\n  color: #A99BE2;\n}\n\n.cm-s-moxer .cm-number {\n  color: #7CA4C0;\n}\n\n.cm-s-moxer .cm-def {\n  color: #F5DFA5;\n}\n\n.cm-s-moxer .CodeMirror-line .cm-def ~ .cm-def {\n  color: #81C5DA;\n}\n\n.cm-s-moxer .cm-string {\n  color: #B2E4AE;\n}\n\n.cm-s-moxer .cm-string-2 {\n  color: #f07178;\n}\n\n.cm-s-moxer .cm-comment {\n  color: #3F445A;\n}\n\n.cm-s-moxer .cm-variable {\n  color: #8E95B4;\n}\n\n.cm-s-moxer .cm-tag {\n  color: #FF5370;\n}\n\n.cm-s-moxer .cm-meta {\n  color: #FFCB6B;\n}\n\n.cm-s-moxer .cm-attribute {\n  color: #C792EA;\n}\n\n.cm-s-moxer .cm-property {\n  color: #81C5DA;\n}\n\n.cm-s-moxer .cm-qualifier {\n  color: #DECB6B;\n}\n\n.cm-s-moxer .cm-variable-3,\n.cm-s-moxer .cm-type {\n  color: #DECB6B;\n}\n\n\n.cm-s-moxer .cm-error {\n  color: rgba(255, 255, 255, 1.0);\n  background-color: #FF5370;\n}\n\n.cm-s-moxer .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/neat.css",
    "content": ".cm-s-neat span.cm-comment { color: #a86; }\n.cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; }\n.cm-s-neat span.cm-string { color: #a22; }\n.cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; }\n.cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; }\n.cm-s-neat span.cm-variable { color: black; }\n.cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; }\n.cm-s-neat span.cm-meta { color: #555; }\n.cm-s-neat span.cm-link { color: #3a3; }\n\n.cm-s-neat .CodeMirror-activeline-background { background: #e8f2ff; }\n.cm-s-neat .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/neo.css",
    "content": "/* neo theme for codemirror */\n\n/* Color scheme */\n\n.cm-s-neo.CodeMirror {\n  background-color:#ffffff;\n  color:#2e383c;\n  line-height:1.4375;\n}\n.cm-s-neo .cm-comment { color:#75787b; }\n.cm-s-neo .cm-keyword, .cm-s-neo .cm-property { color:#1d75b3; }\n.cm-s-neo .cm-atom,.cm-s-neo .cm-number { color:#75438a; }\n.cm-s-neo .cm-node,.cm-s-neo .cm-tag { color:#9c3328; }\n.cm-s-neo .cm-string { color:#b35e14; }\n.cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier { color:#047d65; }\n\n\n/* Editor styling */\n\n.cm-s-neo pre {\n  padding:0;\n}\n\n.cm-s-neo .CodeMirror-gutters {\n  border:none;\n  border-right:10px solid transparent;\n  background-color:transparent;\n}\n\n.cm-s-neo .CodeMirror-linenumber {\n  padding:0;\n  color:#e0e2e5;\n}\n\n.cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; }\n.cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; }\n\n.cm-s-neo .CodeMirror-cursor {\n  width: auto;\n  border: 0;\n  background: rgba(155,157,162,0.37);\n  z-index: 1;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/night.css",
    "content": "/* Loosely based on the Midnight Textmate theme */\n\n.cm-s-night.CodeMirror { background: #0a001f; color: #f8f8f8; }\n.cm-s-night div.CodeMirror-selected { background: #447; }\n.cm-s-night .CodeMirror-line::selection, .cm-s-night .CodeMirror-line > span::selection, .cm-s-night .CodeMirror-line > span > span::selection { background: rgba(68, 68, 119, .99); }\n.cm-s-night .CodeMirror-line::-moz-selection, .cm-s-night .CodeMirror-line > span::-moz-selection, .cm-s-night .CodeMirror-line > span > span::-moz-selection { background: rgba(68, 68, 119, .99); }\n.cm-s-night .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; }\n.cm-s-night .CodeMirror-guttermarker { color: white; }\n.cm-s-night .CodeMirror-guttermarker-subtle { color: #bbb; }\n.cm-s-night .CodeMirror-linenumber { color: #f8f8f8; }\n.cm-s-night .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-night span.cm-comment { color: #8900d1; }\n.cm-s-night span.cm-atom { color: #845dc4; }\n.cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; }\n.cm-s-night span.cm-keyword { color: #599eff; }\n.cm-s-night span.cm-string { color: #37f14a; }\n.cm-s-night span.cm-meta { color: #7678e2; }\n.cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; }\n.cm-s-night span.cm-variable-3, .cm-s-night span.cm-def, .cm-s-night span.cm-type { color: white; }\n.cm-s-night span.cm-bracket { color: #8da6ce; }\n.cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; }\n.cm-s-night span.cm-link { color: #845dc4; }\n.cm-s-night span.cm-error { color: #9d1e15; }\n\n.cm-s-night .CodeMirror-activeline-background { background: #1C005A; }\n.cm-s-night .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/nord.css",
    "content": "/* Based on arcticicestudio's Nord theme */\n/* https://github.com/arcticicestudio/nord */\n\n.cm-s-nord.CodeMirror { background: #2e3440; color: #d8dee9; }\n.cm-s-nord div.CodeMirror-selected { background: #434c5e; }\n.cm-s-nord .CodeMirror-line::selection, .cm-s-nord .CodeMirror-line > span::selection, .cm-s-nord .CodeMirror-line > span > span::selection { background: #3b4252; }\n.cm-s-nord .CodeMirror-line::-moz-selection, .cm-s-nord .CodeMirror-line > span::-moz-selection, .cm-s-nord .CodeMirror-line > span > span::-moz-selection { background: #3b4252; }\n.cm-s-nord .CodeMirror-gutters { background: #2e3440; border-right: 0px; }\n.cm-s-nord .CodeMirror-guttermarker { color: #4c566a; }\n.cm-s-nord .CodeMirror-guttermarker-subtle { color: #4c566a; }\n.cm-s-nord .CodeMirror-linenumber { color: #4c566a; }\n.cm-s-nord .CodeMirror-cursor { border-left: 1px solid #f8f8f0; }\n\n.cm-s-nord span.cm-comment { color: #4c566a; }\n.cm-s-nord span.cm-atom { color: #b48ead; }\n.cm-s-nord span.cm-number { color: #b48ead; }\n\n.cm-s-nord span.cm-comment.cm-attribute { color: #97b757; }\n.cm-s-nord span.cm-comment.cm-def { color: #bc9262; }\n.cm-s-nord span.cm-comment.cm-tag { color: #bc6283; }\n.cm-s-nord span.cm-comment.cm-type { color: #5998a6; }\n\n.cm-s-nord span.cm-property, .cm-s-nord span.cm-attribute { color: #8FBCBB; }\n.cm-s-nord span.cm-keyword { color: #81A1C1; }\n.cm-s-nord span.cm-builtin { color: #81A1C1; }\n.cm-s-nord span.cm-string { color: #A3BE8C; }\n\n.cm-s-nord span.cm-variable { color: #d8dee9; }\n.cm-s-nord span.cm-variable-2 { color: #d8dee9; }\n.cm-s-nord span.cm-variable-3, .cm-s-nord span.cm-type { color: #d8dee9; }\n.cm-s-nord span.cm-def { color: #8FBCBB; }\n.cm-s-nord span.cm-bracket { color: #81A1C1; }\n.cm-s-nord span.cm-tag { color: #bf616a; }\n.cm-s-nord span.cm-header { color: #b48ead; }\n.cm-s-nord span.cm-link { color: #b48ead; }\n.cm-s-nord span.cm-error { background: #bf616a; color: #f8f8f0; }\n\n.cm-s-nord .CodeMirror-activeline-background { background: #3b4252; }\n.cm-s-nord .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/oceanic-next.css",
    "content": "/*\n\n    Name:       oceanic-next\n    Author:     Filype Pereira (https://github.com/fpereira1)\n\n    Original oceanic-next color scheme by Dmitri Voronianski (https://github.com/voronianski/oceanic-next-color-scheme)\n\n*/\n\n.cm-s-oceanic-next.CodeMirror { background: #304148; color: #f8f8f2; }\n.cm-s-oceanic-next div.CodeMirror-selected { background: rgba(101, 115, 126, 0.33); }\n.cm-s-oceanic-next .CodeMirror-line::selection, .cm-s-oceanic-next .CodeMirror-line > span::selection, .cm-s-oceanic-next .CodeMirror-line > span > span::selection { background: rgba(101, 115, 126, 0.33); }\n.cm-s-oceanic-next .CodeMirror-line::-moz-selection, .cm-s-oceanic-next .CodeMirror-line > span::-moz-selection, .cm-s-oceanic-next .CodeMirror-line > span > span::-moz-selection { background: rgba(101, 115, 126, 0.33); }\n.cm-s-oceanic-next .CodeMirror-gutters { background: #304148; border-right: 10px; }\n.cm-s-oceanic-next .CodeMirror-guttermarker { color: white; }\n.cm-s-oceanic-next .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-oceanic-next .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-oceanic-next .CodeMirror-cursor { border-left: 1px solid #f8f8f0; }\n.cm-s-oceanic-next.cm-fat-cursor .CodeMirror-cursor { background-color: #a2a8a175 !important; }\n.cm-s-oceanic-next .cm-animate-fat-cursor { background-color: #a2a8a175 !important; }\n\n.cm-s-oceanic-next span.cm-comment { color: #65737E; }\n.cm-s-oceanic-next span.cm-atom { color: #C594C5; }\n.cm-s-oceanic-next span.cm-number { color: #F99157; }\n\n.cm-s-oceanic-next span.cm-property { color: #99C794; }\n.cm-s-oceanic-next span.cm-attribute,\n.cm-s-oceanic-next span.cm-keyword { color: #C594C5; }\n.cm-s-oceanic-next span.cm-builtin { color: #66d9ef; }\n.cm-s-oceanic-next span.cm-string { color: #99C794; }\n\n.cm-s-oceanic-next span.cm-variable,\n.cm-s-oceanic-next span.cm-variable-2,\n.cm-s-oceanic-next span.cm-variable-3 { color: #f8f8f2; }\n.cm-s-oceanic-next span.cm-def { color: #6699CC; }\n.cm-s-oceanic-next span.cm-bracket { color: #5FB3B3; }\n.cm-s-oceanic-next span.cm-tag { color: #C594C5; }\n.cm-s-oceanic-next span.cm-header { color: #C594C5; }\n.cm-s-oceanic-next span.cm-link { color: #C594C5; }\n.cm-s-oceanic-next span.cm-error { background: #C594C5; color: #f8f8f0; }\n\n.cm-s-oceanic-next .CodeMirror-activeline-background { background: rgba(101, 115, 126, 0.33); }\n.cm-s-oceanic-next .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/panda-syntax.css",
    "content": "/*\n\tName:       Panda Syntax\n\tAuthor:     Siamak Mokhtari (http://github.com/siamak/)\n\tCodeMirror template by Siamak Mokhtari (https://github.com/siamak/atom-panda-syntax)\n*/\n.cm-s-panda-syntax {\n\tbackground: #292A2B;\n\tcolor: #E6E6E6;\n\tline-height: 1.5;\n\tfont-family: 'Operator Mono', 'Source Code Pro', Menlo, Monaco, Consolas, Courier New, monospace;\n}\n.cm-s-panda-syntax .CodeMirror-cursor { border-color: #ff2c6d; }\n.cm-s-panda-syntax .CodeMirror-activeline-background {\n\tbackground: rgba(99, 123, 156, 0.1);\n}\n.cm-s-panda-syntax .CodeMirror-selected {\n\tbackground: #FFF;\n}\n.cm-s-panda-syntax .cm-comment {\n\tfont-style: italic;\n\tcolor: #676B79;\n}\n.cm-s-panda-syntax .cm-operator {\n\tcolor: #f3f3f3;\n}\n.cm-s-panda-syntax .cm-string {\n\tcolor: #19F9D8;\n}\n.cm-s-panda-syntax .cm-string-2 {\n    color: #FFB86C;\n}\n\n.cm-s-panda-syntax .cm-tag {\n\tcolor: #ff2c6d;\n}\n.cm-s-panda-syntax .cm-meta {\n\tcolor: #b084eb;\n}\n\n.cm-s-panda-syntax .cm-number {\n\tcolor: #FFB86C;\n}\n.cm-s-panda-syntax .cm-atom {\n\tcolor: #ff2c6d;\n}\n.cm-s-panda-syntax .cm-keyword {\n\tcolor: #FF75B5;\n}\n.cm-s-panda-syntax .cm-variable {\n\tcolor: #ffb86c;\n}\n.cm-s-panda-syntax .cm-variable-2 {\n\tcolor: #ff9ac1;\n}\n.cm-s-panda-syntax .cm-variable-3, .cm-s-panda-syntax .cm-type {\n\tcolor: #ff9ac1;\n}\n\n.cm-s-panda-syntax .cm-def {\n\tcolor: #e6e6e6;\n}\n.cm-s-panda-syntax .cm-property {\n\tcolor: #f3f3f3;\n}\n.cm-s-panda-syntax .cm-unit {\n    color: #ffb86c;\n}\n\n.cm-s-panda-syntax .cm-attribute {\n    color: #ffb86c;\n}\n\n.cm-s-panda-syntax .CodeMirror-matchingbracket {\n    border-bottom: 1px dotted #19F9D8;\n    padding-bottom: 2px;\n    color: #e6e6e6;\n}\n.cm-s-panda-syntax .CodeMirror-gutters {\n    background: #292a2b;\n    border-right-color: rgba(255, 255, 255, 0.1);\n}\n.cm-s-panda-syntax .CodeMirror-linenumber {\n    color: #e6e6e6;\n    opacity: 0.6;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/paraiso-dark.css",
    "content": "/*\n\n    Name:       Paraíso (Dark)\n    Author:     Jan T. Sott\n\n    Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n\n*/\n\n.cm-s-paraiso-dark.CodeMirror { background: #2f1e2e; color: #b9b6b0; }\n.cm-s-paraiso-dark div.CodeMirror-selected { background: #41323f; }\n.cm-s-paraiso-dark .CodeMirror-line::selection, .cm-s-paraiso-dark .CodeMirror-line > span::selection, .cm-s-paraiso-dark .CodeMirror-line > span > span::selection { background: rgba(65, 50, 63, .99); }\n.cm-s-paraiso-dark .CodeMirror-line::-moz-selection, .cm-s-paraiso-dark .CodeMirror-line > span::-moz-selection, .cm-s-paraiso-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(65, 50, 63, .99); }\n.cm-s-paraiso-dark .CodeMirror-gutters { background: #2f1e2e; border-right: 0px; }\n.cm-s-paraiso-dark .CodeMirror-guttermarker { color: #ef6155; }\n.cm-s-paraiso-dark .CodeMirror-guttermarker-subtle { color: #776e71; }\n.cm-s-paraiso-dark .CodeMirror-linenumber { color: #776e71; }\n.cm-s-paraiso-dark .CodeMirror-cursor { border-left: 1px solid #8d8687; }\n\n.cm-s-paraiso-dark span.cm-comment { color: #e96ba8; }\n.cm-s-paraiso-dark span.cm-atom { color: #815ba4; }\n.cm-s-paraiso-dark span.cm-number { color: #815ba4; }\n\n.cm-s-paraiso-dark span.cm-property, .cm-s-paraiso-dark span.cm-attribute { color: #48b685; }\n.cm-s-paraiso-dark span.cm-keyword { color: #ef6155; }\n.cm-s-paraiso-dark span.cm-string { color: #fec418; }\n\n.cm-s-paraiso-dark span.cm-variable { color: #48b685; }\n.cm-s-paraiso-dark span.cm-variable-2 { color: #06b6ef; }\n.cm-s-paraiso-dark span.cm-def { color: #f99b15; }\n.cm-s-paraiso-dark span.cm-bracket { color: #b9b6b0; }\n.cm-s-paraiso-dark span.cm-tag { color: #ef6155; }\n.cm-s-paraiso-dark span.cm-link { color: #815ba4; }\n.cm-s-paraiso-dark span.cm-error { background: #ef6155; color: #8d8687; }\n\n.cm-s-paraiso-dark .CodeMirror-activeline-background { background: #4D344A; }\n.cm-s-paraiso-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/paraiso-light.css",
    "content": "/*\n\n    Name:       Paraíso (Light)\n    Author:     Jan T. Sott\n\n    Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n\n*/\n\n.cm-s-paraiso-light.CodeMirror { background: #e7e9db; color: #41323f; }\n.cm-s-paraiso-light div.CodeMirror-selected { background: #b9b6b0; }\n.cm-s-paraiso-light .CodeMirror-line::selection, .cm-s-paraiso-light .CodeMirror-line > span::selection, .cm-s-paraiso-light .CodeMirror-line > span > span::selection { background: #b9b6b0; }\n.cm-s-paraiso-light .CodeMirror-line::-moz-selection, .cm-s-paraiso-light .CodeMirror-line > span::-moz-selection, .cm-s-paraiso-light .CodeMirror-line > span > span::-moz-selection { background: #b9b6b0; }\n.cm-s-paraiso-light .CodeMirror-gutters { background: #e7e9db; border-right: 0px; }\n.cm-s-paraiso-light .CodeMirror-guttermarker { color: black; }\n.cm-s-paraiso-light .CodeMirror-guttermarker-subtle { color: #8d8687; }\n.cm-s-paraiso-light .CodeMirror-linenumber { color: #8d8687; }\n.cm-s-paraiso-light .CodeMirror-cursor { border-left: 1px solid #776e71; }\n\n.cm-s-paraiso-light span.cm-comment { color: #e96ba8; }\n.cm-s-paraiso-light span.cm-atom { color: #815ba4; }\n.cm-s-paraiso-light span.cm-number { color: #815ba4; }\n\n.cm-s-paraiso-light span.cm-property, .cm-s-paraiso-light span.cm-attribute { color: #48b685; }\n.cm-s-paraiso-light span.cm-keyword { color: #ef6155; }\n.cm-s-paraiso-light span.cm-string { color: #fec418; }\n\n.cm-s-paraiso-light span.cm-variable { color: #48b685; }\n.cm-s-paraiso-light span.cm-variable-2 { color: #06b6ef; }\n.cm-s-paraiso-light span.cm-def { color: #f99b15; }\n.cm-s-paraiso-light span.cm-bracket { color: #41323f; }\n.cm-s-paraiso-light span.cm-tag { color: #ef6155; }\n.cm-s-paraiso-light span.cm-link { color: #815ba4; }\n.cm-s-paraiso-light span.cm-error { background: #ef6155; color: #776e71; }\n\n.cm-s-paraiso-light .CodeMirror-activeline-background { background: #CFD1C4; }\n.cm-s-paraiso-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/pastel-on-dark.css",
    "content": "/**\n * Pastel On Dark theme ported from ACE editor\n * @license MIT\n * @copyright AtomicPages LLC 2014\n * @author Dennis Thompson, AtomicPages LLC\n * @version 1.1\n * @source https://github.com/atomicpages/codemirror-pastel-on-dark-theme\n */\n\n.cm-s-pastel-on-dark.CodeMirror {\n\tbackground: #2c2827;\n\tcolor: #8F938F;\n\tline-height: 1.5;\n}\n.cm-s-pastel-on-dark div.CodeMirror-selected { background: rgba(221,240,255,0.2); }\n.cm-s-pastel-on-dark .CodeMirror-line::selection, .cm-s-pastel-on-dark .CodeMirror-line > span::selection, .cm-s-pastel-on-dark .CodeMirror-line > span > span::selection { background: rgba(221,240,255,0.2); }\n.cm-s-pastel-on-dark .CodeMirror-line::-moz-selection, .cm-s-pastel-on-dark .CodeMirror-line > span::-moz-selection, .cm-s-pastel-on-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(221,240,255,0.2); }\n\n.cm-s-pastel-on-dark .CodeMirror-gutters {\n\tbackground: #34302f;\n\tborder-right: 0px;\n\tpadding: 0 3px;\n}\n.cm-s-pastel-on-dark .CodeMirror-guttermarker { color: white; }\n.cm-s-pastel-on-dark .CodeMirror-guttermarker-subtle { color: #8F938F; }\n.cm-s-pastel-on-dark .CodeMirror-linenumber { color: #8F938F; }\n.cm-s-pastel-on-dark .CodeMirror-cursor { border-left: 1px solid #A7A7A7; }\n.cm-s-pastel-on-dark span.cm-comment { color: #A6C6FF; }\n.cm-s-pastel-on-dark span.cm-atom { color: #DE8E30; }\n.cm-s-pastel-on-dark span.cm-number { color: #CCCCCC; }\n.cm-s-pastel-on-dark span.cm-property { color: #8F938F; }\n.cm-s-pastel-on-dark span.cm-attribute { color: #a6e22e; }\n.cm-s-pastel-on-dark span.cm-keyword { color: #AEB2F8; }\n.cm-s-pastel-on-dark span.cm-string { color: #66A968; }\n.cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; }\n.cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; }\n.cm-s-pastel-on-dark span.cm-variable-3, .cm-s-pastel-on-dark span.cm-type { color: #DE8E30; }\n.cm-s-pastel-on-dark span.cm-def { color: #757aD8; }\n.cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; }\n.cm-s-pastel-on-dark span.cm-tag { color: #C1C144; }\n.cm-s-pastel-on-dark span.cm-link { color: #ae81ff; }\n.cm-s-pastel-on-dark span.cm-qualifier,.cm-s-pastel-on-dark span.cm-builtin { color: #C1C144; }\n.cm-s-pastel-on-dark span.cm-error {\n\tbackground: #757aD8;\n\tcolor: #f8f8f0;\n}\n.cm-s-pastel-on-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.031); }\n.cm-s-pastel-on-dark .CodeMirror-matchingbracket {\n\tborder: 1px solid rgba(255,255,255,0.25);\n\tcolor: #8F938F !important;\n\tmargin: -1px -1px 0 -1px;\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/railscasts.css",
    "content": "/*\n\n    Name:       Railscasts\n    Author:     Ryan Bates (http://railscasts.com)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-railscasts.CodeMirror {background: #2b2b2b; color: #f4f1ed;}\n.cm-s-railscasts div.CodeMirror-selected {background: #272935 !important;}\n.cm-s-railscasts .CodeMirror-gutters {background: #2b2b2b; border-right: 0px;}\n.cm-s-railscasts .CodeMirror-linenumber {color: #5a647e;}\n.cm-s-railscasts .CodeMirror-cursor {border-left: 1px solid #d4cfc9 !important;}\n\n.cm-s-railscasts span.cm-comment {color: #bc9458;}\n.cm-s-railscasts span.cm-atom {color: #b6b3eb;}\n.cm-s-railscasts span.cm-number {color: #b6b3eb;}\n\n.cm-s-railscasts span.cm-property, .cm-s-railscasts span.cm-attribute {color: #a5c261;}\n.cm-s-railscasts span.cm-keyword {color: #da4939;}\n.cm-s-railscasts span.cm-string {color: #ffc66d;}\n\n.cm-s-railscasts span.cm-variable {color: #a5c261;}\n.cm-s-railscasts span.cm-variable-2 {color: #6d9cbe;}\n.cm-s-railscasts span.cm-def {color: #cc7833;}\n.cm-s-railscasts span.cm-error {background: #da4939; color: #d4cfc9;}\n.cm-s-railscasts span.cm-bracket {color: #f4f1ed;}\n.cm-s-railscasts span.cm-tag {color: #da4939;}\n.cm-s-railscasts span.cm-link {color: #b6b3eb;}\n\n.cm-s-railscasts .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n.cm-s-railscasts .CodeMirror-activeline-background { background: #303040; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/rubyblue.css",
    "content": ".cm-s-rubyblue.CodeMirror { background: #112435; color: white; }\n.cm-s-rubyblue div.CodeMirror-selected { background: #38566F; }\n.cm-s-rubyblue .CodeMirror-line::selection, .cm-s-rubyblue .CodeMirror-line > span::selection, .cm-s-rubyblue .CodeMirror-line > span > span::selection { background: rgba(56, 86, 111, 0.99); }\n.cm-s-rubyblue .CodeMirror-line::-moz-selection, .cm-s-rubyblue .CodeMirror-line > span::-moz-selection, .cm-s-rubyblue .CodeMirror-line > span > span::-moz-selection { background: rgba(56, 86, 111, 0.99); }\n.cm-s-rubyblue .CodeMirror-gutters { background: #1F4661; border-right: 7px solid #3E7087; }\n.cm-s-rubyblue .CodeMirror-guttermarker { color: white; }\n.cm-s-rubyblue .CodeMirror-guttermarker-subtle { color: #3E7087; }\n.cm-s-rubyblue .CodeMirror-linenumber { color: white; }\n.cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; }\n.cm-s-rubyblue span.cm-atom { color: #F4C20B; }\n.cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; }\n.cm-s-rubyblue span.cm-keyword { color: #F0F; }\n.cm-s-rubyblue span.cm-string { color: #F08047; }\n.cm-s-rubyblue span.cm-meta { color: #F0F; }\n.cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; }\n.cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def, .cm-s-rubyblue span.cm-type { color: white; }\n.cm-s-rubyblue span.cm-bracket { color: #F0F; }\n.cm-s-rubyblue span.cm-link { color: #F4C20B; }\n.cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; }\n.cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; }\n.cm-s-rubyblue span.cm-error { color: #AF2018; }\n\n.cm-s-rubyblue .CodeMirror-activeline-background { background: #173047; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/seti.css",
    "content": "/*\n\n    Name:       seti\n    Author:     Michael Kaminsky (http://github.com/mkaminsky11)\n\n    Original seti color scheme by Jesse Weed (https://github.com/jesseweed/seti-syntax)\n\n*/\n\n\n.cm-s-seti.CodeMirror {\n  background-color: #151718 !important;\n  color: #CFD2D1 !important;\n  border: none;\n}\n.cm-s-seti .CodeMirror-gutters {\n  color: #404b53;\n  background-color: #0E1112;\n  border: none;\n}\n.cm-s-seti .CodeMirror-cursor { border-left: solid thin #f8f8f0; }\n.cm-s-seti .CodeMirror-linenumber { color: #6D8A88; }\n.cm-s-seti.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-seti .CodeMirror-line::selection, .cm-s-seti .CodeMirror-line > span::selection, .cm-s-seti .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-seti .CodeMirror-line::-moz-selection, .cm-s-seti .CodeMirror-line > span::-moz-selection, .cm-s-seti .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-seti span.cm-comment { color: #41535b; }\n.cm-s-seti span.cm-string, .cm-s-seti span.cm-string-2 { color: #55b5db; }\n.cm-s-seti span.cm-number { color: #cd3f45; }\n.cm-s-seti span.cm-variable { color: #55b5db; }\n.cm-s-seti span.cm-variable-2 { color: #a074c4; }\n.cm-s-seti span.cm-def { color: #55b5db; }\n.cm-s-seti span.cm-keyword { color: #ff79c6; }\n.cm-s-seti span.cm-operator { color: #9fca56; }\n.cm-s-seti span.cm-keyword { color: #e6cd69; }\n.cm-s-seti span.cm-atom { color: #cd3f45; }\n.cm-s-seti span.cm-meta { color: #55b5db; }\n.cm-s-seti span.cm-tag { color: #55b5db; }\n.cm-s-seti span.cm-attribute { color: #9fca56; }\n.cm-s-seti span.cm-qualifier { color: #9fca56; }\n.cm-s-seti span.cm-property { color: #a074c4; }\n.cm-s-seti span.cm-variable-3, .cm-s-seti span.cm-type { color: #9fca56; }\n.cm-s-seti span.cm-builtin { color: #9fca56; }\n.cm-s-seti .CodeMirror-activeline-background { background: #101213; }\n.cm-s-seti .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/shadowfox.css",
    "content": "/*\n\n    Name:       shadowfox\n    Author:     overdodactyl (http://github.com/overdodactyl)\n\n    Original shadowfox color scheme by Firefox\n\n*/\n\n.cm-s-shadowfox.CodeMirror { background: #2a2a2e; color: #b1b1b3; }\n.cm-s-shadowfox div.CodeMirror-selected { background: #353B48; }\n.cm-s-shadowfox .CodeMirror-line::selection, .cm-s-shadowfox .CodeMirror-line > span::selection, .cm-s-shadowfox .CodeMirror-line > span > span::selection { background: #353B48; }\n.cm-s-shadowfox .CodeMirror-line::-moz-selection, .cm-s-shadowfox .CodeMirror-line > span::-moz-selection, .cm-s-shadowfox .CodeMirror-line > span > span::-moz-selection { background: #353B48; }\n.cm-s-shadowfox .CodeMirror-gutters { background: #0c0c0d ; border-right: 1px solid #0c0c0d; }\n.cm-s-shadowfox .CodeMirror-guttermarker { color: #555; }\n.cm-s-shadowfox .CodeMirror-linenumber { color: #939393; }\n.cm-s-shadowfox .CodeMirror-cursor { border-left: 1px solid #fff; }\n\n.cm-s-shadowfox span.cm-comment { color: #939393; }\n.cm-s-shadowfox span.cm-atom { color: #FF7DE9; }\n.cm-s-shadowfox span.cm-quote { color: #FF7DE9; }\n.cm-s-shadowfox span.cm-builtin { color: #FF7DE9; }\n.cm-s-shadowfox span.cm-attribute { color: #FF7DE9; }\n.cm-s-shadowfox span.cm-keyword { color: #FF7DE9; }\n.cm-s-shadowfox span.cm-error { color: #FF7DE9; }\n\n.cm-s-shadowfox span.cm-number { color: #6B89FF; }\n.cm-s-shadowfox span.cm-string { color: #6B89FF; }\n.cm-s-shadowfox span.cm-string-2 { color: #6B89FF; }\n\n.cm-s-shadowfox span.cm-meta { color: #939393; }\n.cm-s-shadowfox span.cm-hr { color: #939393; }\n\n.cm-s-shadowfox span.cm-header { color: #75BFFF; }\n.cm-s-shadowfox span.cm-qualifier { color: #75BFFF; }\n.cm-s-shadowfox span.cm-variable-2 { color: #75BFFF; }\n\n.cm-s-shadowfox span.cm-property { color: #86DE74; }\n\n.cm-s-shadowfox span.cm-def { color: #75BFFF; }\n.cm-s-shadowfox span.cm-bracket { color: #75BFFF; }\n.cm-s-shadowfox span.cm-tag { color: #75BFFF; }\n.cm-s-shadowfox span.cm-link:visited { color: #75BFFF; }\n\n.cm-s-shadowfox span.cm-variable { color: #B98EFF; }\n.cm-s-shadowfox span.cm-variable-3 { color: #d7d7db; }\n.cm-s-shadowfox span.cm-link { color: #737373; }\n.cm-s-shadowfox span.cm-operator { color: #b1b1b3; }\n.cm-s-shadowfox span.cm-special { color: #d7d7db; }\n\n.cm-s-shadowfox .CodeMirror-activeline-background { background: rgba(185, 215, 253, .15) }\n.cm-s-shadowfox .CodeMirror-matchingbracket { outline: solid 1px rgba(255, 255, 255, .25); color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/solarized.css",
    "content": "/*\nSolarized theme for code-mirror\nhttp://ethanschoonover.com/solarized\n*/\n\n/*\nSolarized color palette\nhttp://ethanschoonover.com/solarized/img/solarized-palette.png\n*/\n\n.solarized.base03 { color: #002b36; }\n.solarized.base02 { color: #073642; }\n.solarized.base01 { color: #586e75; }\n.solarized.base00 { color: #657b83; }\n.solarized.base0 { color: #839496; }\n.solarized.base1 { color: #93a1a1; }\n.solarized.base2 { color: #eee8d5; }\n.solarized.base3  { color: #fdf6e3; }\n.solarized.solar-yellow  { color: #b58900; }\n.solarized.solar-orange  { color: #cb4b16; }\n.solarized.solar-red { color: #dc322f; }\n.solarized.solar-magenta { color: #d33682; }\n.solarized.solar-violet  { color: #6c71c4; }\n.solarized.solar-blue { color: #268bd2; }\n.solarized.solar-cyan { color: #2aa198; }\n.solarized.solar-green { color: #859900; }\n\n/* Color scheme for code-mirror */\n\n.cm-s-solarized {\n  line-height: 1.45em;\n  color-profile: sRGB;\n  rendering-intent: auto;\n}\n.cm-s-solarized.cm-s-dark {\n  color: #839496;\n  background-color: #002b36;\n}\n.cm-s-solarized.cm-s-light {\n  background-color: #fdf6e3;\n  color: #657b83;\n}\n\n.cm-s-solarized .CodeMirror-widget {\n  text-shadow: none;\n}\n\n.cm-s-solarized .cm-header { color: #586e75; }\n.cm-s-solarized .cm-quote { color: #93a1a1; }\n\n.cm-s-solarized .cm-keyword { color: #cb4b16; }\n.cm-s-solarized .cm-atom { color: #d33682; }\n.cm-s-solarized .cm-number { color: #d33682; }\n.cm-s-solarized .cm-def { color: #2aa198; }\n\n.cm-s-solarized .cm-variable { color: #839496; }\n.cm-s-solarized .cm-variable-2 { color: #b58900; }\n.cm-s-solarized .cm-variable-3, .cm-s-solarized .cm-type { color: #6c71c4; }\n\n.cm-s-solarized .cm-property { color: #2aa198; }\n.cm-s-solarized .cm-operator { color: #6c71c4; }\n\n.cm-s-solarized .cm-comment { color: #586e75; font-style:italic; }\n\n.cm-s-solarized .cm-string { color: #859900; }\n.cm-s-solarized .cm-string-2 { color: #b58900; }\n\n.cm-s-solarized .cm-meta { color: #859900; }\n.cm-s-solarized .cm-qualifier { color: #b58900; }\n.cm-s-solarized .cm-builtin { color: #d33682; }\n.cm-s-solarized .cm-bracket { color: #cb4b16; }\n.cm-s-solarized .CodeMirror-matchingbracket { color: #859900; }\n.cm-s-solarized .CodeMirror-nonmatchingbracket { color: #dc322f; }\n.cm-s-solarized .cm-tag { color: #93a1a1; }\n.cm-s-solarized .cm-attribute { color: #2aa198; }\n.cm-s-solarized .cm-hr {\n  color: transparent;\n  border-top: 1px solid #586e75;\n  display: block;\n}\n.cm-s-solarized .cm-link { color: #93a1a1; cursor: pointer; }\n.cm-s-solarized .cm-special { color: #6c71c4; }\n.cm-s-solarized .cm-em {\n  color: #999;\n  text-decoration: underline;\n  text-decoration-style: dotted;\n}\n.cm-s-solarized .cm-error,\n.cm-s-solarized .cm-invalidchar {\n  color: #586e75;\n  border-bottom: 1px dotted #dc322f;\n}\n\n.cm-s-solarized.cm-s-dark div.CodeMirror-selected { background: #073642; }\n.cm-s-solarized.cm-s-dark.CodeMirror ::selection { background: rgba(7, 54, 66, 0.99); }\n.cm-s-solarized.cm-s-dark .CodeMirror-line::-moz-selection, .cm-s-dark .CodeMirror-line > span::-moz-selection, .cm-s-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(7, 54, 66, 0.99); }\n\n.cm-s-solarized.cm-s-light div.CodeMirror-selected { background: #eee8d5; }\n.cm-s-solarized.cm-s-light .CodeMirror-line::selection, .cm-s-light .CodeMirror-line > span::selection, .cm-s-light .CodeMirror-line > span > span::selection { background: #eee8d5; }\n.cm-s-solarized.cm-s-light .CodeMirror-line::-moz-selection, .cm-s-light .CodeMirror-line > span::-moz-selection, .cm-s-light .CodeMirror-line > span > span::-moz-selection { background: #eee8d5; }\n\n/* Editor styling */\n\n\n\n/* Little shadow on the view-port of the buffer view */\n.cm-s-solarized.CodeMirror {\n  -moz-box-shadow: inset 7px 0 12px -6px #000;\n  -webkit-box-shadow: inset 7px 0 12px -6px #000;\n  box-shadow: inset 7px 0 12px -6px #000;\n}\n\n/* Remove gutter border */\n.cm-s-solarized .CodeMirror-gutters {\n  border-right: 0;\n}\n\n/* Gutter colors and line number styling based of color scheme (dark / light) */\n\n/* Dark */\n.cm-s-solarized.cm-s-dark .CodeMirror-gutters {\n  background-color: #073642;\n}\n\n.cm-s-solarized.cm-s-dark .CodeMirror-linenumber {\n  color: #586e75;\n}\n\n/* Light */\n.cm-s-solarized.cm-s-light .CodeMirror-gutters {\n  background-color: #eee8d5;\n}\n\n.cm-s-solarized.cm-s-light .CodeMirror-linenumber {\n  color: #839496;\n}\n\n/* Common */\n.cm-s-solarized .CodeMirror-linenumber {\n  padding: 0 5px;\n}\n.cm-s-solarized .CodeMirror-guttermarker-subtle { color: #586e75; }\n.cm-s-solarized.cm-s-dark .CodeMirror-guttermarker { color: #ddd; }\n.cm-s-solarized.cm-s-light .CodeMirror-guttermarker { color: #cb4b16; }\n\n.cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text {\n  color: #586e75;\n}\n\n/* Cursor */\n.cm-s-solarized .CodeMirror-cursor { border-left: 1px solid #819090; }\n\n/* Fat cursor */\n.cm-s-solarized.cm-s-light.cm-fat-cursor .CodeMirror-cursor { background: #77ee77; }\n.cm-s-solarized.cm-s-light .cm-animate-fat-cursor { background-color: #77ee77; }\n.cm-s-solarized.cm-s-dark.cm-fat-cursor .CodeMirror-cursor { background: #586e75; }\n.cm-s-solarized.cm-s-dark .cm-animate-fat-cursor { background-color: #586e75; }\n\n/* Active line */\n.cm-s-solarized.cm-s-dark .CodeMirror-activeline-background {\n  background: rgba(255, 255, 255, 0.06);\n}\n.cm-s-solarized.cm-s-light .CodeMirror-activeline-background {\n  background: rgba(0, 0, 0, 0.06);\n}\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/ssms.css",
    "content": ".cm-s-ssms span.cm-keyword { color: blue; }\n.cm-s-ssms span.cm-comment { color: darkgreen; }\n.cm-s-ssms span.cm-string { color: red; }\n.cm-s-ssms span.cm-def { color: black; }\n.cm-s-ssms span.cm-variable { color: black; }\n.cm-s-ssms span.cm-variable-2 { color: black; }\n.cm-s-ssms span.cm-atom { color: darkgray; }\n.cm-s-ssms .CodeMirror-linenumber { color: teal; }\n.cm-s-ssms .CodeMirror-activeline-background { background: #ffffff; }\n.cm-s-ssms span.cm-string-2 { color: #FF00FF; }\n.cm-s-ssms span.cm-operator, \n.cm-s-ssms span.cm-bracket, \n.cm-s-ssms span.cm-punctuation { color: darkgray; }\n.cm-s-ssms .CodeMirror-gutters { border-right: 3px solid #ffee62; background-color: #ffffff; }\n.cm-s-ssms div.CodeMirror-selected { background: #ADD6FF; }\n\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/the-matrix.css",
    "content": ".cm-s-the-matrix.CodeMirror { background: #000000; color: #00FF00; }\n.cm-s-the-matrix div.CodeMirror-selected { background: #2D2D2D; }\n.cm-s-the-matrix .CodeMirror-line::selection, .cm-s-the-matrix .CodeMirror-line > span::selection, .cm-s-the-matrix .CodeMirror-line > span > span::selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-the-matrix .CodeMirror-line::-moz-selection, .cm-s-the-matrix .CodeMirror-line > span::-moz-selection, .cm-s-the-matrix .CodeMirror-line > span > span::-moz-selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-the-matrix .CodeMirror-gutters { background: #060; border-right: 2px solid #00FF00; }\n.cm-s-the-matrix .CodeMirror-guttermarker { color: #0f0; }\n.cm-s-the-matrix .CodeMirror-guttermarker-subtle { color: white; }\n.cm-s-the-matrix .CodeMirror-linenumber { color: #FFFFFF; }\n.cm-s-the-matrix .CodeMirror-cursor { border-left: 1px solid #00FF00; }\n\n.cm-s-the-matrix span.cm-keyword { color: #008803; font-weight: bold; }\n.cm-s-the-matrix span.cm-atom { color: #3FF; }\n.cm-s-the-matrix span.cm-number { color: #FFB94F; }\n.cm-s-the-matrix span.cm-def { color: #99C; }\n.cm-s-the-matrix span.cm-variable { color: #F6C; }\n.cm-s-the-matrix span.cm-variable-2 { color: #C6F; }\n.cm-s-the-matrix span.cm-variable-3, .cm-s-the-matrix span.cm-type { color: #96F; }\n.cm-s-the-matrix span.cm-property { color: #62FFA0; }\n.cm-s-the-matrix span.cm-operator { color: #999; }\n.cm-s-the-matrix span.cm-comment { color: #CCCCCC; }\n.cm-s-the-matrix span.cm-string { color: #39C; }\n.cm-s-the-matrix span.cm-meta { color: #C9F; }\n.cm-s-the-matrix span.cm-qualifier { color: #FFF700; }\n.cm-s-the-matrix span.cm-builtin { color: #30a; }\n.cm-s-the-matrix span.cm-bracket { color: #cc7; }\n.cm-s-the-matrix span.cm-tag { color: #FFBD40; }\n.cm-s-the-matrix span.cm-attribute { color: #FFF700; }\n.cm-s-the-matrix span.cm-error { color: #FF0000; }\n\n.cm-s-the-matrix .CodeMirror-activeline-background { background: #040; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/tomorrow-night-bright.css",
    "content": "/*\n\n    Name:       Tomorrow Night - Bright\n    Author:     Chris Kempson\n\n    Port done by Gerard Braad <me@gbraad.nl>\n\n*/\n\n.cm-s-tomorrow-night-bright.CodeMirror { background: #000000; color: #eaeaea; }\n.cm-s-tomorrow-night-bright div.CodeMirror-selected { background: #424242; }\n.cm-s-tomorrow-night-bright .CodeMirror-gutters { background: #000000; border-right: 0px; }\n.cm-s-tomorrow-night-bright .CodeMirror-guttermarker { color: #e78c45; }\n.cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle { color: #777; }\n.cm-s-tomorrow-night-bright .CodeMirror-linenumber { color: #424242; }\n.cm-s-tomorrow-night-bright .CodeMirror-cursor { border-left: 1px solid #6A6A6A; }\n\n.cm-s-tomorrow-night-bright span.cm-comment { color: #d27b53; }\n.cm-s-tomorrow-night-bright span.cm-atom { color: #a16a94; }\n.cm-s-tomorrow-night-bright span.cm-number { color: #a16a94; }\n\n.cm-s-tomorrow-night-bright span.cm-property, .cm-s-tomorrow-night-bright span.cm-attribute { color: #99cc99; }\n.cm-s-tomorrow-night-bright span.cm-keyword { color: #d54e53; }\n.cm-s-tomorrow-night-bright span.cm-string { color: #e7c547; }\n\n.cm-s-tomorrow-night-bright span.cm-variable { color: #b9ca4a; }\n.cm-s-tomorrow-night-bright span.cm-variable-2 { color: #7aa6da; }\n.cm-s-tomorrow-night-bright span.cm-def { color: #e78c45; }\n.cm-s-tomorrow-night-bright span.cm-bracket { color: #eaeaea; }\n.cm-s-tomorrow-night-bright span.cm-tag { color: #d54e53; }\n.cm-s-tomorrow-night-bright span.cm-link { color: #a16a94; }\n.cm-s-tomorrow-night-bright span.cm-error { background: #d54e53; color: #6A6A6A; }\n\n.cm-s-tomorrow-night-bright .CodeMirror-activeline-background { background: #2a2a2a; }\n.cm-s-tomorrow-night-bright .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/tomorrow-night-eighties.css",
    "content": "/*\n\n    Name:       Tomorrow Night - Eighties\n    Author:     Chris Kempson\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-tomorrow-night-eighties.CodeMirror { background: #000000; color: #CCCCCC; }\n.cm-s-tomorrow-night-eighties div.CodeMirror-selected { background: #2D2D2D; }\n.cm-s-tomorrow-night-eighties .CodeMirror-line::selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span::selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span > span::selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-tomorrow-night-eighties .CodeMirror-line::-moz-selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span::-moz-selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span > span::-moz-selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-tomorrow-night-eighties .CodeMirror-gutters { background: #000000; border-right: 0px; }\n.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker { color: #f2777a; }\n.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker-subtle { color: #777; }\n.cm-s-tomorrow-night-eighties .CodeMirror-linenumber { color: #515151; }\n.cm-s-tomorrow-night-eighties .CodeMirror-cursor { border-left: 1px solid #6A6A6A; }\n\n.cm-s-tomorrow-night-eighties span.cm-comment { color: #d27b53; }\n.cm-s-tomorrow-night-eighties span.cm-atom { color: #a16a94; }\n.cm-s-tomorrow-night-eighties span.cm-number { color: #a16a94; }\n\n.cm-s-tomorrow-night-eighties span.cm-property, .cm-s-tomorrow-night-eighties span.cm-attribute { color: #99cc99; }\n.cm-s-tomorrow-night-eighties span.cm-keyword { color: #f2777a; }\n.cm-s-tomorrow-night-eighties span.cm-string { color: #ffcc66; }\n\n.cm-s-tomorrow-night-eighties span.cm-variable { color: #99cc99; }\n.cm-s-tomorrow-night-eighties span.cm-variable-2 { color: #6699cc; }\n.cm-s-tomorrow-night-eighties span.cm-def { color: #f99157; }\n.cm-s-tomorrow-night-eighties span.cm-bracket { color: #CCCCCC; }\n.cm-s-tomorrow-night-eighties span.cm-tag { color: #f2777a; }\n.cm-s-tomorrow-night-eighties span.cm-link { color: #a16a94; }\n.cm-s-tomorrow-night-eighties span.cm-error { background: #f2777a; color: #6A6A6A; }\n\n.cm-s-tomorrow-night-eighties .CodeMirror-activeline-background { background: #343600; }\n.cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/ttcn.css",
    "content": ".cm-s-ttcn .cm-quote { color: #090; }\n.cm-s-ttcn .cm-negative { color: #d44; }\n.cm-s-ttcn .cm-positive { color: #292; }\n.cm-s-ttcn .cm-header, .cm-strong { font-weight: bold; }\n.cm-s-ttcn .cm-em { font-style: italic; }\n.cm-s-ttcn .cm-link { text-decoration: underline; }\n.cm-s-ttcn .cm-strikethrough { text-decoration: line-through; }\n.cm-s-ttcn .cm-header { color: #00f; font-weight: bold; }\n\n.cm-s-ttcn .cm-atom { color: #219; }\n.cm-s-ttcn .cm-attribute { color: #00c; }\n.cm-s-ttcn .cm-bracket { color: #997; }\n.cm-s-ttcn .cm-comment { color: #333333; }\n.cm-s-ttcn .cm-def { color: #00f; }\n.cm-s-ttcn .cm-em { font-style: italic; }\n.cm-s-ttcn .cm-error { color: #f00; }\n.cm-s-ttcn .cm-hr { color: #999; }\n.cm-s-ttcn .cm-invalidchar { color: #f00; }\n.cm-s-ttcn .cm-keyword { font-weight:bold; }\n.cm-s-ttcn .cm-link { color: #00c; text-decoration: underline; }\n.cm-s-ttcn .cm-meta { color: #555; }\n.cm-s-ttcn .cm-negative { color: #d44; }\n.cm-s-ttcn .cm-positive { color: #292; }\n.cm-s-ttcn .cm-qualifier { color: #555; }\n.cm-s-ttcn .cm-strikethrough { text-decoration: line-through; }\n.cm-s-ttcn .cm-string { color: #006400; }\n.cm-s-ttcn .cm-string-2 { color: #f50; }\n.cm-s-ttcn .cm-strong { font-weight: bold; }\n.cm-s-ttcn .cm-tag { color: #170; }\n.cm-s-ttcn .cm-variable { color: #8B2252; }\n.cm-s-ttcn .cm-variable-2 { color: #05a; }\n.cm-s-ttcn .cm-variable-3, .cm-s-ttcn .cm-type { color: #085; }\n\n.cm-s-ttcn .cm-invalidchar { color: #f00; }\n\n/* ASN */\n.cm-s-ttcn .cm-accessTypes,\n.cm-s-ttcn .cm-compareTypes { color: #27408B; }\n.cm-s-ttcn .cm-cmipVerbs { color: #8B2252; }\n.cm-s-ttcn .cm-modifier { color:#D2691E; }\n.cm-s-ttcn .cm-status { color:#8B4545; }\n.cm-s-ttcn .cm-storage { color:#A020F0; }\n.cm-s-ttcn .cm-tags { color:#006400; }\n\n/* CFG */\n.cm-s-ttcn .cm-externalCommands { color: #8B4545; font-weight:bold; }\n.cm-s-ttcn .cm-fileNCtrlMaskOptions,\n.cm-s-ttcn .cm-sectionTitle { color: #2E8B57; font-weight:bold; }\n\n/* TTCN */\n.cm-s-ttcn .cm-booleanConsts,\n.cm-s-ttcn .cm-otherConsts,\n.cm-s-ttcn .cm-verdictConsts { color: #006400; }\n.cm-s-ttcn .cm-configOps,\n.cm-s-ttcn .cm-functionOps,\n.cm-s-ttcn .cm-portOps,\n.cm-s-ttcn .cm-sutOps,\n.cm-s-ttcn .cm-timerOps,\n.cm-s-ttcn .cm-verdictOps { color: #0000FF; }\n.cm-s-ttcn .cm-preprocessor,\n.cm-s-ttcn .cm-templateMatch,\n.cm-s-ttcn .cm-ttcn3Macros { color: #27408B; }\n.cm-s-ttcn .cm-types { color: #A52A2A; font-weight:bold; }\n.cm-s-ttcn .cm-visibilityModifiers { font-weight:bold; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/twilight.css",
    "content": ".cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/\n.cm-s-twilight div.CodeMirror-selected { background: #323232; } /**/\n.cm-s-twilight .CodeMirror-line::selection, .cm-s-twilight .CodeMirror-line > span::selection, .cm-s-twilight .CodeMirror-line > span > span::selection { background: rgba(50, 50, 50, 0.99); }\n.cm-s-twilight .CodeMirror-line::-moz-selection, .cm-s-twilight .CodeMirror-line > span::-moz-selection, .cm-s-twilight .CodeMirror-line > span > span::-moz-selection { background: rgba(50, 50, 50, 0.99); }\n\n.cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; }\n.cm-s-twilight .CodeMirror-guttermarker { color: white; }\n.cm-s-twilight .CodeMirror-guttermarker-subtle { color: #aaa; }\n.cm-s-twilight .CodeMirror-linenumber { color: #aaa; }\n.cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-twilight .cm-keyword { color: #f9ee98; } /**/\n.cm-s-twilight .cm-atom { color: #FC0; }\n.cm-s-twilight .cm-number { color:  #ca7841; } /**/\n.cm-s-twilight .cm-def { color: #8DA6CE; }\n.cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/\n.cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def, .cm-s-twilight span.cm-type { color: #607392; } /**/\n.cm-s-twilight .cm-operator { color: #cda869; } /**/\n.cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/\n.cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/\n.cm-s-twilight .cm-string-2 { color:#bd6b18; } /*?*/\n.cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/\n.cm-s-twilight .cm-builtin { color: #cda869; } /*?*/\n.cm-s-twilight .cm-tag { color: #997643; } /**/\n.cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/\n.cm-s-twilight .cm-header { color: #FF6400; }\n.cm-s-twilight .cm-hr { color: #AEAEAE; }\n.cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/\n.cm-s-twilight .cm-error { border-bottom: 1px solid red; }\n\n.cm-s-twilight .CodeMirror-activeline-background { background: #27282E; }\n.cm-s-twilight .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/vibrant-ink.css",
    "content": "/* Taken from the popular Visual Studio Vibrant Ink Schema */\n\n.cm-s-vibrant-ink.CodeMirror { background: black; color: white; }\n.cm-s-vibrant-ink div.CodeMirror-selected { background: #35493c; }\n.cm-s-vibrant-ink .CodeMirror-line::selection, .cm-s-vibrant-ink .CodeMirror-line > span::selection, .cm-s-vibrant-ink .CodeMirror-line > span > span::selection { background: rgba(53, 73, 60, 0.99); }\n.cm-s-vibrant-ink .CodeMirror-line::-moz-selection, .cm-s-vibrant-ink .CodeMirror-line > span::-moz-selection, .cm-s-vibrant-ink .CodeMirror-line > span > span::-moz-selection { background: rgba(53, 73, 60, 0.99); }\n\n.cm-s-vibrant-ink .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; }\n.cm-s-vibrant-ink .CodeMirror-guttermarker { color: white; }\n.cm-s-vibrant-ink .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-vibrant-ink .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-vibrant-ink .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-vibrant-ink .cm-keyword { color: #CC7832; }\n.cm-s-vibrant-ink .cm-atom { color: #FC0; }\n.cm-s-vibrant-ink .cm-number { color:  #FFEE98; }\n.cm-s-vibrant-ink .cm-def { color: #8DA6CE; }\n.cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D; }\n.cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def, .cm-s-vibrant span.cm-type { color: #FFC66D; }\n.cm-s-vibrant-ink .cm-operator { color: #888; }\n.cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; }\n.cm-s-vibrant-ink .cm-string { color:  #A5C25C; }\n.cm-s-vibrant-ink .cm-string-2 { color: red; }\n.cm-s-vibrant-ink .cm-meta { color: #D8FA3C; }\n.cm-s-vibrant-ink .cm-builtin { color: #8DA6CE; }\n.cm-s-vibrant-ink .cm-tag { color: #8DA6CE; }\n.cm-s-vibrant-ink .cm-attribute { color: #8DA6CE; }\n.cm-s-vibrant-ink .cm-header { color: #FF6400; }\n.cm-s-vibrant-ink .cm-hr { color: #AEAEAE; }\n.cm-s-vibrant-ink .cm-link { color: #5656F3; }\n.cm-s-vibrant-ink .cm-error { border-bottom: 1px solid red; }\n\n.cm-s-vibrant-ink .CodeMirror-activeline-background { background: #27282E; }\n.cm-s-vibrant-ink .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/xq-dark.css",
    "content": "/*\nCopyright (C) 2011 by MarkLogic Corporation\nAuthor: Mike Brevoort <mike@brevoort.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n.cm-s-xq-dark.CodeMirror { background: #0a001f; color: #f8f8f8; }\n.cm-s-xq-dark div.CodeMirror-selected { background: #27007A; }\n.cm-s-xq-dark .CodeMirror-line::selection, .cm-s-xq-dark .CodeMirror-line > span::selection, .cm-s-xq-dark .CodeMirror-line > span > span::selection { background: rgba(39, 0, 122, 0.99); }\n.cm-s-xq-dark .CodeMirror-line::-moz-selection, .cm-s-xq-dark .CodeMirror-line > span::-moz-selection, .cm-s-xq-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(39, 0, 122, 0.99); }\n.cm-s-xq-dark .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; }\n.cm-s-xq-dark .CodeMirror-guttermarker { color: #FFBD40; }\n.cm-s-xq-dark .CodeMirror-guttermarker-subtle { color: #f8f8f8; }\n.cm-s-xq-dark .CodeMirror-linenumber { color: #f8f8f8; }\n.cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white; }\n\n.cm-s-xq-dark span.cm-keyword { color: #FFBD40; }\n.cm-s-xq-dark span.cm-atom { color: #6C8CD5; }\n.cm-s-xq-dark span.cm-number { color: #164; }\n.cm-s-xq-dark span.cm-def { color: #FFF; text-decoration:underline; }\n.cm-s-xq-dark span.cm-variable { color: #FFF; }\n.cm-s-xq-dark span.cm-variable-2 { color: #EEE; }\n.cm-s-xq-dark span.cm-variable-3, .cm-s-xq-dark span.cm-type { color: #DDD; }\n.cm-s-xq-dark span.cm-property {}\n.cm-s-xq-dark span.cm-operator {}\n.cm-s-xq-dark span.cm-comment { color: gray; }\n.cm-s-xq-dark span.cm-string { color: #9FEE00; }\n.cm-s-xq-dark span.cm-meta { color: yellow; }\n.cm-s-xq-dark span.cm-qualifier { color: #FFF700; }\n.cm-s-xq-dark span.cm-builtin { color: #30a; }\n.cm-s-xq-dark span.cm-bracket { color: #cc7; }\n.cm-s-xq-dark span.cm-tag { color: #FFBD40; }\n.cm-s-xq-dark span.cm-attribute { color: #FFF700; }\n.cm-s-xq-dark span.cm-error { color: #f00; }\n\n.cm-s-xq-dark .CodeMirror-activeline-background { background: #27282E; }\n.cm-s-xq-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/xq-light.css",
    "content": "/*\nCopyright (C) 2011 by MarkLogic Corporation\nAuthor: Mike Brevoort <mike@brevoort.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n.cm-s-xq-light span.cm-keyword { line-height: 1em; font-weight: bold; color: #5A5CAD; }\n.cm-s-xq-light span.cm-atom { color: #6C8CD5; }\n.cm-s-xq-light span.cm-number { color: #164; }\n.cm-s-xq-light span.cm-def { text-decoration:underline; }\n.cm-s-xq-light span.cm-variable { color: black; }\n.cm-s-xq-light span.cm-variable-2 { color:black; }\n.cm-s-xq-light span.cm-variable-3, .cm-s-xq-light span.cm-type { color: black; }\n.cm-s-xq-light span.cm-property {}\n.cm-s-xq-light span.cm-operator {}\n.cm-s-xq-light span.cm-comment { color: #0080FF; font-style: italic; }\n.cm-s-xq-light span.cm-string { color: red; }\n.cm-s-xq-light span.cm-meta { color: yellow; }\n.cm-s-xq-light span.cm-qualifier { color: grey; }\n.cm-s-xq-light span.cm-builtin { color: #7EA656; }\n.cm-s-xq-light span.cm-bracket { color: #cc7; }\n.cm-s-xq-light span.cm-tag { color: #3F7F7F; }\n.cm-s-xq-light span.cm-attribute { color: #7F007F; }\n.cm-s-xq-light span.cm-error { color: #f00; }\n\n.cm-s-xq-light .CodeMirror-activeline-background { background: #e8f2ff; }\n.cm-s-xq-light .CodeMirror-matchingbracket { outline:1px solid grey;color:black !important;background:yellow; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/yeti.css",
    "content": "/*\n\n    Name:       yeti\n    Author:     Michael Kaminsky (http://github.com/mkaminsky11)\n\n    Original yeti color scheme by Jesse Weed (https://github.com/jesseweed/yeti-syntax)\n\n*/\n\n\n.cm-s-yeti.CodeMirror {\n  background-color: #ECEAE8 !important;\n  color: #d1c9c0 !important;\n  border: none;\n}\n\n.cm-s-yeti .CodeMirror-gutters {\n  color: #adaba6;\n  background-color: #E5E1DB;\n  border: none;\n}\n.cm-s-yeti .CodeMirror-cursor { border-left: solid thin #d1c9c0; }\n.cm-s-yeti .CodeMirror-linenumber { color: #adaba6; }\n.cm-s-yeti.CodeMirror-focused div.CodeMirror-selected { background: #DCD8D2; }\n.cm-s-yeti .CodeMirror-line::selection, .cm-s-yeti .CodeMirror-line > span::selection, .cm-s-yeti .CodeMirror-line > span > span::selection { background: #DCD8D2; }\n.cm-s-yeti .CodeMirror-line::-moz-selection, .cm-s-yeti .CodeMirror-line > span::-moz-selection, .cm-s-yeti .CodeMirror-line > span > span::-moz-selection { background: #DCD8D2; }\n.cm-s-yeti span.cm-comment { color: #d4c8be; }\n.cm-s-yeti span.cm-string, .cm-s-yeti span.cm-string-2 { color: #96c0d8; }\n.cm-s-yeti span.cm-number { color: #a074c4; }\n.cm-s-yeti span.cm-variable { color: #55b5db; }\n.cm-s-yeti span.cm-variable-2 { color: #a074c4; }\n.cm-s-yeti span.cm-def { color: #55b5db; }\n.cm-s-yeti span.cm-operator { color: #9fb96e; }\n.cm-s-yeti span.cm-keyword { color: #9fb96e; }\n.cm-s-yeti span.cm-atom { color: #a074c4; }\n.cm-s-yeti span.cm-meta { color: #96c0d8; }\n.cm-s-yeti span.cm-tag { color: #96c0d8; }\n.cm-s-yeti span.cm-attribute { color: #9fb96e; }\n.cm-s-yeti span.cm-qualifier { color: #96c0d8; }\n.cm-s-yeti span.cm-property { color: #a074c4; }\n.cm-s-yeti span.cm-builtin { color: #a074c4; }\n.cm-s-yeti span.cm-variable-3, .cm-s-yeti span.cm-type { color: #96c0d8; }\n.cm-s-yeti .CodeMirror-activeline-background { background: #E7E4E0; }\n.cm-s-yeti .CodeMirror-matchingbracket { text-decoration: underline; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/yonce.css",
    "content": "/*\n\n    Name:       yoncé\n    Author:     Thomas MacLean (http://github.com/thomasmaclean)\n\n    Original yoncé color scheme by Mina Markham (https://github.com/minamarkham)\n\n*/\n\n.cm-s-yonce.CodeMirror { background: #1C1C1C; color: #d4d4d4; } /**/\n.cm-s-yonce div.CodeMirror-selected { background: rgba(252, 69, 133, 0.478); } /**/\n.cm-s-yonce .CodeMirror-selectedtext,\n.cm-s-yonce .CodeMirror-selected,\n.cm-s-yonce .CodeMirror-line::selection,\n.cm-s-yonce .CodeMirror-line > span::selection,\n.cm-s-yonce .CodeMirror-line > span > span::selection,\n.cm-s-yonce .CodeMirror-line::-moz-selection,\n.cm-s-yonce .CodeMirror-line > span::-moz-selection,\n.cm-s-yonce .CodeMirror-line > span > span::-moz-selection { background: rgba(252, 67, 132, 0.47); }\n\n.cm-s-yonce.CodeMirror pre { padding-left: 0px; }\n.cm-s-yonce .CodeMirror-gutters {background: #1C1C1C; border-right: 0px;}\n.cm-s-yonce .CodeMirror-linenumber {color: #777777;  padding-right: 10px; }\n.cm-s-yonce .CodeMirror-activeline .CodeMirror-linenumber.CodeMirror-gutter-elt { background: #1C1C1C; color: #fc4384; }\n.cm-s-yonce .CodeMirror-linenumber { color: #777; }\n.cm-s-yonce .CodeMirror-cursor { border-left: 2px solid #FC4384; }\n.cm-s-yonce .cm-searching { background: rgba(243, 155, 53, .3) !important; outline: 1px solid #F39B35; }\n.cm-s-yonce .cm-searching.CodeMirror-selectedtext { background: rgba(243, 155, 53, .7) !important; color: white; }\n\n.cm-s-yonce .cm-keyword { color: #00A7AA; } /**/\n.cm-s-yonce .cm-atom { color: #F39B35; }\n.cm-s-yonce .cm-number, .cm-s-yonce span.cm-type { color:  #A06FCA; } /**/\n.cm-s-yonce .cm-def { color: #98E342; }\n.cm-s-yonce .cm-property,\n.cm-s-yonce span.cm-variable { color: #D4D4D4; font-style: italic; }\n.cm-s-yonce span.cm-variable-2 { color: #da7dae; font-style: italic; }\n.cm-s-yonce span.cm-variable-3 { color: #A06FCA; }\n.cm-s-yonce .cm-type.cm-def { color: #FC4384; font-style: normal; text-decoration: underline; }\n.cm-s-yonce .cm-property.cm-def { color: #FC4384; font-style: normal; }\n.cm-s-yonce .cm-callee { color: #FC4384; font-style: normal; }\n.cm-s-yonce .cm-operator { color: #FC4384; } /**/\n.cm-s-yonce .cm-qualifier,\n.cm-s-yonce .cm-tag { color: #FC4384; }\n.cm-s-yonce .cm-tag.cm-bracket { color: #D4D4D4; }\n.cm-s-yonce .cm-attribute { color: #A06FCA; }\n.cm-s-yonce .cm-comment { color:#696d70; font-style:italic; font-weight:normal; } /**/\n.cm-s-yonce .cm-comment.cm-tag { color: #FC4384 }\n.cm-s-yonce .cm-comment.cm-attribute { color: #D4D4D4; }\n.cm-s-yonce .cm-string { color:#E6DB74; } /**/\n.cm-s-yonce .cm-string-2 { color:#F39B35; } /*?*/\n.cm-s-yonce .cm-meta { color: #D4D4D4; background: inherit; }\n.cm-s-yonce .cm-builtin { color: #FC4384; } /*?*/\n.cm-s-yonce .cm-header { color: #da7dae; }\n.cm-s-yonce .cm-hr { color: #98E342; }\n.cm-s-yonce .cm-link { color:#696d70; font-style:italic; text-decoration:none; } /**/\n.cm-s-yonce .cm-error { border-bottom: 1px solid #C42412; }\n\n.cm-s-yonce .CodeMirror-activeline-background { background: #272727; }\n.cm-s-yonce .CodeMirror-matchingbracket { outline:1px solid grey; color:#D4D4D4 !important; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/codemirror/5.65.2/theme/zenburn.css",
    "content": "/**\n * \"\n *  Using Zenburn color palette from the Emacs Zenburn Theme\n *  https://github.com/bbatsov/zenburn-emacs/blob/master/zenburn-theme.el\n *\n *  Also using parts of https://github.com/xavi/coderay-lighttable-theme\n * \"\n * From: https://github.com/wisenomad/zenburn-lighttable-theme/blob/master/zenburn.css\n */\n\n.cm-s-zenburn .CodeMirror-gutters { background: #3f3f3f !important; }\n.cm-s-zenburn .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { color: #999; }\n.cm-s-zenburn .CodeMirror-cursor { border-left: 1px solid white; }\n.cm-s-zenburn.CodeMirror { background-color: #3f3f3f; color: #dcdccc; }\n.cm-s-zenburn span.cm-builtin { color: #dcdccc; font-weight: bold; }\n.cm-s-zenburn span.cm-comment { color: #7f9f7f; }\n.cm-s-zenburn span.cm-keyword { color: #f0dfaf; font-weight: bold; }\n.cm-s-zenburn span.cm-atom { color: #bfebbf; }\n.cm-s-zenburn span.cm-def { color: #dcdccc; }\n.cm-s-zenburn span.cm-variable { color: #dfaf8f; }\n.cm-s-zenburn span.cm-variable-2 { color: #dcdccc; }\n.cm-s-zenburn span.cm-string { color: #cc9393; }\n.cm-s-zenburn span.cm-string-2 { color: #cc9393; }\n.cm-s-zenburn span.cm-number { color: #dcdccc; }\n.cm-s-zenburn span.cm-tag { color: #93e0e3; }\n.cm-s-zenburn span.cm-property { color: #dfaf8f; }\n.cm-s-zenburn span.cm-attribute { color: #dfaf8f; }\n.cm-s-zenburn span.cm-qualifier { color: #7cb8bb; }\n.cm-s-zenburn span.cm-meta { color: #f0dfaf; }\n.cm-s-zenburn span.cm-header { color: #f0efd0; }\n.cm-s-zenburn span.cm-operator { color: #f0efd0; }\n.cm-s-zenburn span.CodeMirror-matchingbracket { box-sizing: border-box; background: transparent; border-bottom: 1px solid; }\n.cm-s-zenburn span.CodeMirror-nonmatchingbracket { border-bottom: 1px solid; background: none; }\n.cm-s-zenburn .CodeMirror-activeline { background: #000000; }\n.cm-s-zenburn .CodeMirror-activeline-background { background: #000000; }\n.cm-s-zenburn div.CodeMirror-selected { background: #545454; }\n.cm-s-zenburn .CodeMirror-focused div.CodeMirror-selected { background: #4f4f4f; }\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/easymde/codemirror/tablist.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\nvar CodeMirror = require('codemirror');\n\nCodeMirror.commands.tabAndIndentMarkdownList = function (cm) {\n    var ranges = cm.listSelections();\n    var pos = ranges[0].head;\n    var eolState = cm.getStateAfter(pos.line);\n    var inList = eolState.list !== false;\n\n    if (inList) {\n        cm.execCommand('indentMore');\n        return;\n    }\n\n    if (cm.options.indentWithTabs) {\n        cm.execCommand('insertTab');\n    } else {\n        var spaces = Array(cm.options.tabSize + 1).join(' ');\n        cm.replaceSelection(spaces);\n    }\n};\n\nCodeMirror.commands.shiftTabAndUnindentMarkdownList = function (cm) {\n    var ranges = cm.listSelections();\n    var pos = ranges[0].head;\n    var eolState = cm.getStateAfter(pos.line);\n    var inList = eolState.list !== false;\n\n    if (inList) {\n        cm.execCommand('indentLess');\n        return;\n    }\n\n    if (cm.options.indentWithTabs) {\n        cm.execCommand('insertTab');\n    } else {\n        var spaces = Array(cm.options.tabSize + 1).join(' ');\n        cm.replaceSelection(spaces);\n    }\n};\n"
  },
  {
    "path": "配套插件/BsCore/assets/vendors/sweetalert2/bootstrap-4.css",
    "content": "/*\n* @sweetalert2/themes v5.0.8\n* Released under the MIT License.\n*/\n\n@-webkit-keyframes fadeInDown {\n  from {\n    transform: translate3d(0, -100%, 0);\n    opacity: 0;\n  }\n  to {\n    transform: translate3d(0, 0, 0);\n    opacity: 1;\n  }\n}\n@keyframes fadeInDown {\n  from {\n    transform: translate3d(0, -100%, 0);\n    opacity: 0;\n  }\n  to {\n    transform: translate3d(0, 0, 0);\n    opacity: 1;\n  }\n}\n@-webkit-keyframes fadeOutUp {\n  from {\n    opacity: 1;\n  }\n  to {\n    transform: translate3d(0, -100%, 0);\n    opacity: 0;\n  }\n}\n@keyframes fadeOutUp {\n  from {\n    opacity: 1;\n  }\n  to {\n    transform: translate3d(0, -100%, 0);\n    opacity: 0;\n  }\n}\n.swal2-popup.swal2-toast {\n  box-sizing: border-box;\n  grid-column: 1/4 !important;\n  grid-row: 1/4 !important;\n  grid-template-columns: 1fr 99fr 1fr;\n  padding: 0.75rem 0.25rem;\n  overflow-y: hidden;\n  background: #fff;\n  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n  pointer-events: all;\n}\n.swal2-popup.swal2-toast > * {\n  grid-column: 2;\n}\n.swal2-popup.swal2-toast .swal2-title {\n  margin: 0.5em 1em;\n  padding: 0;\n  font-size: 0.875rem;\n  text-align: initial;\n}\n.swal2-popup.swal2-toast .swal2-loading {\n  justify-content: center;\n}\n.swal2-popup.swal2-toast .swal2-input {\n  height: 2em;\n  margin: 0.5em;\n  font-size: 0.875rem;\n}\n.swal2-popup.swal2-toast .swal2-validation-message {\n  font-size: 0.875rem;\n}\n.swal2-popup.swal2-toast .swal2-footer {\n  margin: 0.5em 0 0;\n  padding: 0.5em 0 0;\n  font-size: 0.8em;\n}\n.swal2-popup.swal2-toast .swal2-close {\n  grid-column: 3/3;\n  grid-row: 1/99;\n  align-self: center;\n  width: 0.8em;\n  height: 0.8em;\n  margin: 0;\n  font-size: 2em;\n}\n.swal2-popup.swal2-toast .swal2-html-container {\n  margin: 0.5em 1em;\n  padding: 0;\n  font-size: 0.875rem;\n  text-align: initial;\n}\n.swal2-popup.swal2-toast .swal2-html-container:empty {\n  padding: 0;\n}\n.swal2-popup.swal2-toast .swal2-loader {\n  grid-column: 1;\n  grid-row: 1/99;\n  align-self: center;\n  width: 2em;\n  height: 2em;\n  margin: 0.25em;\n}\n.swal2-popup.swal2-toast .swal2-icon {\n  grid-column: 1;\n  grid-row: 1/99;\n  align-self: center;\n  width: 2em;\n  min-width: 2em;\n  height: 2em;\n  margin: 0 0.5em 0 0;\n}\n.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content {\n  display: flex;\n  align-items: center;\n  font-size: 1.8em;\n  font-weight: bold;\n}\n.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring {\n  width: 2em;\n  height: 2em;\n}\n.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line] {\n  top: 0.875em;\n  width: 1.375em;\n}\n.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left] {\n  left: 0.3125em;\n}\n.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right] {\n  right: 0.3125em;\n}\n.swal2-popup.swal2-toast .swal2-actions {\n  justify-content: flex-start;\n  height: auto;\n  margin: 0;\n  margin-top: 0.5em;\n  padding: 0 0.5em;\n}\n.swal2-popup.swal2-toast .swal2-styled {\n  margin: 0.25em 0.5em;\n  padding: 0.4em 0.6em;\n  font-size: 0.875rem;\n}\n.swal2-popup.swal2-toast .swal2-success {\n  border-color: #28a745;\n}\n.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line] {\n  position: absolute;\n  width: 1.6em;\n  height: 3em;\n  transform: rotate(45deg);\n  border-radius: 50%;\n}\n.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left] {\n  top: -0.8em;\n  left: -0.5em;\n  transform: rotate(-45deg);\n  transform-origin: 2em 2em;\n  border-radius: 4em 0 0 4em;\n}\n.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right] {\n  top: -0.25em;\n  left: 0.9375em;\n  transform-origin: 0 1.5em;\n  border-radius: 0 4em 4em 0;\n}\n.swal2-popup.swal2-toast .swal2-success .swal2-success-ring {\n  width: 2em;\n  height: 2em;\n}\n.swal2-popup.swal2-toast .swal2-success .swal2-success-fix {\n  top: 0;\n  left: 0.4375em;\n  width: 0.4375em;\n  height: 2.6875em;\n}\n.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line] {\n  height: 0.3125em;\n}\n.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip] {\n  top: 1.125em;\n  left: 0.1875em;\n  width: 0.75em;\n}\n.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long] {\n  top: 0.9375em;\n  right: 0.1875em;\n  width: 1.375em;\n}\n.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip {\n  -webkit-animation: swal2-toast-animate-success-line-tip 0.75s;\n          animation: swal2-toast-animate-success-line-tip 0.75s;\n}\n.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long {\n  -webkit-animation: swal2-toast-animate-success-line-long 0.75s;\n          animation: swal2-toast-animate-success-line-long 0.75s;\n}\n.swal2-popup.swal2-toast.swal2-show {\n  -webkit-animation: swal2-toast-show 0.5s;\n          animation: swal2-toast-show 0.5s;\n}\n.swal2-popup.swal2-toast.swal2-hide {\n  -webkit-animation: swal2-toast-hide 0.1s forwards;\n          animation: swal2-toast-hide 0.1s forwards;\n}\n\n.swal2-container {\n  display: grid;\n  position: fixed;\n  z-index: 1060;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  box-sizing: border-box;\n  grid-template-areas: \"top-start     top            top-end\" \"center-start  center         center-end\" \"bottom-start  bottom-center  bottom-end\";\n  grid-template-rows: minmax(-webkit-min-content, auto) minmax(-webkit-min-content, auto) minmax(-webkit-min-content, auto);\n  grid-template-rows: minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);\n  height: 100%;\n  padding: 0.625em;\n  overflow-x: hidden;\n  transition: background-color 0.5s;\n  -webkit-overflow-scrolling: touch;\n}\n.swal2-container.swal2-backdrop-show, .swal2-container.swal2-noanimation {\n  background: rgba(0, 0, 0, 0.5);\n}\n.swal2-container.swal2-backdrop-hide {\n  background: transparent !important;\n}\n.swal2-container.swal2-top-start, .swal2-container.swal2-center-start, .swal2-container.swal2-bottom-start {\n  grid-template-columns: minmax(0, 1fr) auto auto;\n}\n.swal2-container.swal2-top, .swal2-container.swal2-center, .swal2-container.swal2-bottom {\n  grid-template-columns: auto minmax(0, 1fr) auto;\n}\n.swal2-container.swal2-top-end, .swal2-container.swal2-center-end, .swal2-container.swal2-bottom-end {\n  grid-template-columns: auto auto minmax(0, 1fr);\n}\n.swal2-container.swal2-top-start > .swal2-popup {\n  align-self: start;\n}\n.swal2-container.swal2-top > .swal2-popup {\n  grid-column: 2;\n  align-self: start;\n  justify-self: center;\n}\n.swal2-container.swal2-top-end > .swal2-popup, .swal2-container.swal2-top-right > .swal2-popup {\n  grid-column: 3;\n  align-self: start;\n  justify-self: end;\n}\n.swal2-container.swal2-center-start > .swal2-popup, .swal2-container.swal2-center-left > .swal2-popup {\n  grid-row: 2;\n  align-self: center;\n}\n.swal2-container.swal2-center > .swal2-popup {\n  grid-column: 2;\n  grid-row: 2;\n  align-self: center;\n  justify-self: center;\n}\n.swal2-container.swal2-center-end > .swal2-popup, .swal2-container.swal2-center-right > .swal2-popup {\n  grid-column: 3;\n  grid-row: 2;\n  align-self: center;\n  justify-self: end;\n}\n.swal2-container.swal2-bottom-start > .swal2-popup, .swal2-container.swal2-bottom-left > .swal2-popup {\n  grid-column: 1;\n  grid-row: 3;\n  align-self: end;\n}\n.swal2-container.swal2-bottom > .swal2-popup {\n  grid-column: 2;\n  grid-row: 3;\n  justify-self: center;\n  align-self: end;\n}\n.swal2-container.swal2-bottom-end > .swal2-popup, .swal2-container.swal2-bottom-right > .swal2-popup {\n  grid-column: 3;\n  grid-row: 3;\n  align-self: end;\n  justify-self: end;\n}\n.swal2-container.swal2-grow-row > .swal2-popup, .swal2-container.swal2-grow-fullscreen > .swal2-popup {\n  grid-column: 1/4;\n  width: 100%;\n}\n.swal2-container.swal2-grow-column > .swal2-popup, .swal2-container.swal2-grow-fullscreen > .swal2-popup {\n  grid-row: 1/4;\n  align-self: stretch;\n}\n.swal2-container.swal2-no-transition {\n  transition: none !important;\n}\n\n.swal2-popup {\n  display: none;\n  position: relative;\n  box-sizing: border-box;\n  grid-template-columns: minmax(0, 100%);\n  width: 32em;\n  max-width: 100%;\n  padding: 1rem;\n  border: none;\n  border-radius: 0.3rem;\n  background: #fff;\n  color: #545454;\n  font-family: inherit;\n  font-size: 1rem;\n}\n.swal2-popup:focus {\n  outline: none;\n}\n.swal2-popup.swal2-loading {\n  overflow-y: hidden;\n}\n\n.swal2-title {\n  position: relative;\n  max-width: 100%;\n  margin: 0;\n  padding: 0.8em 1em 0;\n  color: #595959;\n  font-size: 1.875em;\n  font-weight: 600;\n  text-align: center;\n  text-transform: none;\n  word-wrap: break-word;\n}\n\n.swal2-actions {\n  display: flex;\n  z-index: 1;\n  box-sizing: border-box;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: center;\n  width: auto;\n  margin: 1.25em auto 0;\n  padding: 0;\n}\n.swal2-actions:not(.swal2-loading) .swal2-styled[disabled] {\n  opacity: 0.4;\n}\n.swal2-actions:not(.swal2-loading) .swal2-styled:hover {\n  background-image: linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1));\n}\n.swal2-actions:not(.swal2-loading) .swal2-styled:active {\n  background-image: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2));\n}\n\n.swal2-loader {\n  display: none;\n  align-items: center;\n  justify-content: center;\n  width: 2.2em;\n  height: 2.2em;\n  margin: 0 1.875em;\n  -webkit-animation: swal2-rotate-loading 1.5s linear 0s infinite normal;\n          animation: swal2-rotate-loading 1.5s linear 0s infinite normal;\n  border-width: 0.25em;\n  border-style: solid;\n  border-radius: 100%;\n  border-color: #2778c4 transparent #2778c4 transparent;\n}\n\n.swal2-styled {\n  margin: 0.3125em;\n  padding: 0.625em 1.1em;\n  transition: box-shadow 0.1s;\n  box-shadow: 0 0 0 3px transparent;\n  font-weight: 500;\n}\n.swal2-styled:not([disabled]) {\n  cursor: pointer;\n}\n.swal2-styled.swal2-confirm {\n  border: 0;\n  border-radius: 0.25em;\n  background: initial;\n  background-color: #007bff;\n  color: #fff;\n  font-size: 1em;\n}\n.swal2-styled.swal2-confirm:focus {\n  box-shadow: 0 0 0 3px rgba(115, 103, 240, 0.5);\n}\n.swal2-styled.swal2-deny {\n  border: 0;\n  border-radius: 0.25em;\n  background: initial;\n  background-color: #ea5455;\n  color: #fff;\n  font-size: 1em;\n}\n.swal2-styled.swal2-deny:focus {\n  box-shadow: 0 0 0 3px rgba(234, 84, 85, 0.5);\n}\n.swal2-styled.swal2-cancel {\n  border: 0;\n  border-radius: 0.25em;\n  background: initial;\n  background-color: #6c757d;\n  color: #fff;\n  font-size: 1em;\n}\n.swal2-styled.swal2-cancel:focus {\n  box-shadow: 0 0 0 3px rgba(110, 125, 136, 0.5);\n}\n.swal2-styled.swal2-default-outline:focus {\n  box-shadow: 0 0 0 3px rgba(100, 150, 200, 0.5);\n}\n.swal2-styled:focus {\n  outline: none;\n}\n.swal2-styled::-moz-focus-inner {\n  border: 0;\n}\n\n.swal2-footer {\n  justify-content: center;\n  margin: 1em 0 0;\n  padding: 1em 1em 0;\n  border-top: 1px solid #eee;\n  color: #545454;\n  font-size: 1em;\n}\n\n.swal2-timer-progress-bar-container {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  grid-column: auto !important;\n  height: 0.25em;\n  overflow: hidden;\n  border-bottom-right-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.swal2-timer-progress-bar {\n  width: 100%;\n  height: 0.25em;\n  background: rgba(0, 0, 0, 0.2);\n}\n\n.swal2-image {\n  max-width: 100%;\n  margin: 2em auto 1em;\n}\n\n.swal2-close {\n  z-index: 2;\n  align-items: center;\n  justify-content: center;\n  width: 2em;\n  height: 2em;\n  margin-top: 0;\n  margin-right: 0;\n  margin-bottom: -2em;\n  padding: 0;\n  overflow: hidden;\n  transition: color 0.1s, box-shadow 0.1s;\n  border: none;\n  border-radius: 5px;\n  background: transparent;\n  color: rgba(0, 0, 0, 0.5);\n  font-family: serif;\n  font-family: monospace;\n  font-size: 1.5rem;\n  cursor: pointer;\n  justify-self: end;\n}\n.swal2-close:hover {\n  transform: none;\n  background: transparent;\n  color: #000;\n}\n.swal2-close:focus {\n  outline: none;\n  box-shadow: inset 0 0 0 3px rgba(100, 150, 200, 0.5);\n}\n.swal2-close::-moz-focus-inner {\n  border: 0;\n}\n\n.swal2-html-container {\n  z-index: 1;\n  justify-content: center;\n  margin: 1em 1.6em 0.3em;\n  padding: 0;\n  overflow: auto;\n  color: #545454;\n  font-size: 1.125em;\n  font-weight: normal;\n  line-height: normal;\n  text-align: center;\n  word-wrap: break-word;\n  word-break: break-word;\n}\n\n.swal2-input,\n.swal2-file,\n.swal2-textarea,\n.swal2-select,\n.swal2-radio,\n.swal2-checkbox {\n  margin: 1em 2em 0;\n}\n\n.swal2-input,\n.swal2-file,\n.swal2-textarea {\n  box-sizing: border-box;\n  width: auto;\n  transition: border-color 0.1s, box-shadow 0.1s;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  background: inherit;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;\n  color: inherit;\n  font-size: 1rem;\n}\n.swal2-input.swal2-inputerror,\n.swal2-file.swal2-inputerror,\n.swal2-textarea.swal2-inputerror {\n  border-color: #dc3545 !important;\n  box-shadow: 0 0 2px #dc3545 !important;\n}\n.swal2-input:focus,\n.swal2-file:focus,\n.swal2-textarea:focus {\n  border: 1px solid #b4dbed;\n  outline: none;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px rgba(100, 150, 200, 0.5);\n}\n.swal2-input::-moz-placeholder, .swal2-file::-moz-placeholder, .swal2-textarea::-moz-placeholder {\n  color: #ccc;\n}\n.swal2-input:-ms-input-placeholder, .swal2-file:-ms-input-placeholder, .swal2-textarea:-ms-input-placeholder {\n  color: #ccc;\n}\n.swal2-input::placeholder,\n.swal2-file::placeholder,\n.swal2-textarea::placeholder {\n  color: #ccc;\n}\n\n.swal2-range {\n  margin: 1em 2em 0;\n  background: #fff;\n}\n.swal2-range input {\n  width: 80%;\n}\n.swal2-range output {\n  width: 20%;\n  color: inherit;\n  font-weight: 600;\n  text-align: center;\n}\n.swal2-range input,\n.swal2-range output {\n  height: 2.625em;\n  padding: 0;\n  font-size: 1rem;\n  line-height: 2.625em;\n}\n\n.swal2-input {\n  height: 2.625em;\n  padding: 0.375rem 0.75rem;\n}\n\n.swal2-file {\n  width: 75%;\n  margin-right: auto;\n  margin-left: auto;\n  background: inherit;\n  font-size: 1rem;\n}\n\n.swal2-textarea {\n  height: 6.75em;\n  padding: 0.75em;\n}\n\n.swal2-select {\n  min-width: 50%;\n  max-width: 100%;\n  padding: 0.375em 0.625em;\n  background: inherit;\n  color: inherit;\n  font-size: 1rem;\n}\n\n.swal2-radio,\n.swal2-checkbox {\n  align-items: center;\n  justify-content: center;\n  background: #fff;\n  color: inherit;\n}\n.swal2-radio label,\n.swal2-checkbox label {\n  margin: 0 0.6em;\n  font-size: 1rem;\n}\n.swal2-radio input,\n.swal2-checkbox input {\n  flex-shrink: 0;\n  margin: 0 0.4em;\n}\n\n.swal2-input-label {\n  display: flex;\n  justify-content: center;\n  margin: 1em auto 0;\n}\n\n.swal2-validation-message {\n  align-items: center;\n  justify-content: center;\n  margin: 1em 0 0;\n  padding: 0.625em;\n  overflow: hidden;\n  background: #f0f0f0;\n  color: #666666;\n  font-size: 1em;\n  font-weight: 300;\n}\n.swal2-validation-message::before {\n  content: \"!\";\n  display: inline-block;\n  width: 1.5em;\n  min-width: 1.5em;\n  height: 1.5em;\n  margin: 0 0.625em;\n  border-radius: 50%;\n  background-color: #f27474;\n  color: #fff;\n  font-weight: 600;\n  line-height: 1.5em;\n  text-align: center;\n}\n\n.swal2-icon {\n  position: relative;\n  box-sizing: content-box;\n  justify-content: center;\n  width: 5em;\n  height: 5em;\n  margin: 2.5em auto 0.6em;\n  border: 0.25em solid transparent;\n  border-radius: 50%;\n  border-color: #000;\n  font-family: inherit;\n  line-height: 5em;\n  cursor: default;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n.swal2-icon .swal2-icon-content {\n  display: flex;\n  align-items: center;\n  font-size: 3.75em;\n}\n.swal2-icon.swal2-error {\n  border-color: #dc3545;\n  color: #dc3545;\n}\n.swal2-icon.swal2-error .swal2-x-mark {\n  position: relative;\n  flex-grow: 1;\n}\n.swal2-icon.swal2-error [class^=swal2-x-mark-line] {\n  display: block;\n  position: absolute;\n  top: 2.3125em;\n  width: 2.9375em;\n  height: 0.3125em;\n  border-radius: 0.125em;\n  background-color: #dc3545;\n}\n.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left] {\n  left: 1.0625em;\n  transform: rotate(45deg);\n}\n.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right] {\n  right: 1em;\n  transform: rotate(-45deg);\n}\n.swal2-icon.swal2-error.swal2-icon-show {\n  -webkit-animation: swal2-animate-error-icon 0.5s;\n          animation: swal2-animate-error-icon 0.5s;\n}\n.swal2-icon.swal2-error.swal2-icon-show .swal2-x-mark {\n  -webkit-animation: swal2-animate-error-x-mark 0.5s;\n          animation: swal2-animate-error-x-mark 0.5s;\n}\n.swal2-icon.swal2-warning {\n  border-color: #ffca2b;\n  color: #ffc107;\n}\n.swal2-icon.swal2-info {\n  border-color: #4cd3e9;\n  color: #17a2b8;\n}\n.swal2-icon.swal2-question {\n  border-color: #a1a8ae;\n  color: #6c757d;\n}\n.swal2-icon.swal2-success {\n  border-color: #28a745;\n  color: #28a745;\n}\n.swal2-icon.swal2-success [class^=swal2-success-circular-line] {\n  position: absolute;\n  width: 3.75em;\n  height: 7.5em;\n  transform: rotate(45deg);\n  border-radius: 50%;\n}\n.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left] {\n  top: -0.4375em;\n  left: -2.0635em;\n  transform: rotate(-45deg);\n  transform-origin: 3.75em 3.75em;\n  border-radius: 7.5em 0 0 7.5em;\n}\n.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right] {\n  top: -0.6875em;\n  left: 1.875em;\n  transform: rotate(-45deg);\n  transform-origin: 0 3.75em;\n  border-radius: 0 7.5em 7.5em 0;\n}\n.swal2-icon.swal2-success .swal2-success-ring {\n  position: absolute;\n  z-index: 2;\n  top: -0.25em;\n  left: -0.25em;\n  box-sizing: content-box;\n  width: 100%;\n  height: 100%;\n  border: 0.25em solid rgba(165, 220, 134, 0.3);\n  border-radius: 50%;\n}\n.swal2-icon.swal2-success .swal2-success-fix {\n  position: absolute;\n  z-index: 1;\n  top: 0.5em;\n  left: 1.625em;\n  width: 0.4375em;\n  height: 5.625em;\n  transform: rotate(-45deg);\n}\n.swal2-icon.swal2-success [class^=swal2-success-line] {\n  display: block;\n  position: absolute;\n  z-index: 2;\n  height: 0.3125em;\n  border-radius: 0.125em;\n  background-color: #28a745;\n}\n.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip] {\n  top: 2.875em;\n  left: 0.8125em;\n  width: 1.5625em;\n  transform: rotate(45deg);\n}\n.swal2-icon.swal2-success [class^=swal2-success-line][class$=long] {\n  top: 2.375em;\n  right: 0.5em;\n  width: 2.9375em;\n  transform: rotate(-45deg);\n}\n.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-tip {\n  -webkit-animation: swal2-animate-success-line-tip 0.75s;\n          animation: swal2-animate-success-line-tip 0.75s;\n}\n.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-long {\n  -webkit-animation: swal2-animate-success-line-long 0.75s;\n          animation: swal2-animate-success-line-long 0.75s;\n}\n.swal2-icon.swal2-success.swal2-icon-show .swal2-success-circular-line-right {\n  -webkit-animation: swal2-rotate-success-circular-line 4.25s ease-in;\n          animation: swal2-rotate-success-circular-line 4.25s ease-in;\n}\n\n.swal2-progress-steps {\n  flex-wrap: wrap;\n  align-items: center;\n  max-width: 100%;\n  margin: 1.25em auto;\n  padding: 0;\n  background: inherit;\n  font-weight: 600;\n}\n.swal2-progress-steps li {\n  display: inline-block;\n  position: relative;\n}\n.swal2-progress-steps .swal2-progress-step {\n  z-index: 20;\n  flex-shrink: 0;\n  width: 2em;\n  height: 2em;\n  border-radius: 2em;\n  background: #2778c4;\n  color: #fff;\n  line-height: 2em;\n  text-align: center;\n}\n.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step {\n  background: #2778c4;\n}\n.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step {\n  background: #add8e6;\n  color: #fff;\n}\n.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step-line {\n  background: #add8e6;\n}\n.swal2-progress-steps .swal2-progress-step-line {\n  z-index: 10;\n  flex-shrink: 0;\n  width: 2.5em;\n  height: 0.4em;\n  margin: 0 -1px;\n  background: #2778c4;\n}\n\n[class^=swal2] {\n  -webkit-tap-highlight-color: transparent;\n}\n\n.swal2-show {\n  -webkit-animation: fadeInDown 0.5s;\n          animation: fadeInDown 0.5s;\n}\n\n.swal2-hide {\n  -webkit-animation: fadeOutUp 0.5s;\n          animation: fadeOutUp 0.5s;\n}\n\n.swal2-noanimation {\n  transition: none;\n}\n\n.swal2-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n.swal2-rtl .swal2-close {\n  margin-right: initial;\n  margin-left: 0;\n}\n.swal2-rtl .swal2-timer-progress-bar {\n  right: 0;\n  left: auto;\n}\n\n@-webkit-keyframes swal2-toast-show {\n  0% {\n    transform: translateY(-0.625em) rotateZ(2deg);\n  }\n  33% {\n    transform: translateY(0) rotateZ(-2deg);\n  }\n  66% {\n    transform: translateY(0.3125em) rotateZ(2deg);\n  }\n  100% {\n    transform: translateY(0) rotateZ(0deg);\n  }\n}\n\n@keyframes swal2-toast-show {\n  0% {\n    transform: translateY(-0.625em) rotateZ(2deg);\n  }\n  33% {\n    transform: translateY(0) rotateZ(-2deg);\n  }\n  66% {\n    transform: translateY(0.3125em) rotateZ(2deg);\n  }\n  100% {\n    transform: translateY(0) rotateZ(0deg);\n  }\n}\n@-webkit-keyframes swal2-toast-hide {\n  100% {\n    transform: rotateZ(1deg);\n    opacity: 0;\n  }\n}\n@keyframes swal2-toast-hide {\n  100% {\n    transform: rotateZ(1deg);\n    opacity: 0;\n  }\n}\n@-webkit-keyframes swal2-toast-animate-success-line-tip {\n  0% {\n    top: 0.5625em;\n    left: 0.0625em;\n    width: 0;\n  }\n  54% {\n    top: 0.125em;\n    left: 0.125em;\n    width: 0;\n  }\n  70% {\n    top: 0.625em;\n    left: -0.25em;\n    width: 1.625em;\n  }\n  84% {\n    top: 1.0625em;\n    left: 0.75em;\n    width: 0.5em;\n  }\n  100% {\n    top: 1.125em;\n    left: 0.1875em;\n    width: 0.75em;\n  }\n}\n@keyframes swal2-toast-animate-success-line-tip {\n  0% {\n    top: 0.5625em;\n    left: 0.0625em;\n    width: 0;\n  }\n  54% {\n    top: 0.125em;\n    left: 0.125em;\n    width: 0;\n  }\n  70% {\n    top: 0.625em;\n    left: -0.25em;\n    width: 1.625em;\n  }\n  84% {\n    top: 1.0625em;\n    left: 0.75em;\n    width: 0.5em;\n  }\n  100% {\n    top: 1.125em;\n    left: 0.1875em;\n    width: 0.75em;\n  }\n}\n@-webkit-keyframes swal2-toast-animate-success-line-long {\n  0% {\n    top: 1.625em;\n    right: 1.375em;\n    width: 0;\n  }\n  65% {\n    top: 1.25em;\n    right: 0.9375em;\n    width: 0;\n  }\n  84% {\n    top: 0.9375em;\n    right: 0;\n    width: 1.125em;\n  }\n  100% {\n    top: 0.9375em;\n    right: 0.1875em;\n    width: 1.375em;\n  }\n}\n@keyframes swal2-toast-animate-success-line-long {\n  0% {\n    top: 1.625em;\n    right: 1.375em;\n    width: 0;\n  }\n  65% {\n    top: 1.25em;\n    right: 0.9375em;\n    width: 0;\n  }\n  84% {\n    top: 0.9375em;\n    right: 0;\n    width: 1.125em;\n  }\n  100% {\n    top: 0.9375em;\n    right: 0.1875em;\n    width: 1.375em;\n  }\n}\n@-webkit-keyframes swal2-show {\n  0% {\n    transform: scale(0.7);\n  }\n  45% {\n    transform: scale(1.05);\n  }\n  80% {\n    transform: scale(0.95);\n  }\n  100% {\n    transform: scale(1);\n  }\n}\n@keyframes swal2-show {\n  0% {\n    transform: scale(0.7);\n  }\n  45% {\n    transform: scale(1.05);\n  }\n  80% {\n    transform: scale(0.95);\n  }\n  100% {\n    transform: scale(1);\n  }\n}\n@-webkit-keyframes swal2-hide {\n  0% {\n    transform: scale(1);\n    opacity: 1;\n  }\n  100% {\n    transform: scale(0.5);\n    opacity: 0;\n  }\n}\n@keyframes swal2-hide {\n  0% {\n    transform: scale(1);\n    opacity: 1;\n  }\n  100% {\n    transform: scale(0.5);\n    opacity: 0;\n  }\n}\n@-webkit-keyframes swal2-animate-success-line-tip {\n  0% {\n    top: 1.1875em;\n    left: 0.0625em;\n    width: 0;\n  }\n  54% {\n    top: 1.0625em;\n    left: 0.125em;\n    width: 0;\n  }\n  70% {\n    top: 2.1875em;\n    left: -0.375em;\n    width: 3.125em;\n  }\n  84% {\n    top: 3em;\n    left: 1.3125em;\n    width: 1.0625em;\n  }\n  100% {\n    top: 2.8125em;\n    left: 0.8125em;\n    width: 1.5625em;\n  }\n}\n@keyframes swal2-animate-success-line-tip {\n  0% {\n    top: 1.1875em;\n    left: 0.0625em;\n    width: 0;\n  }\n  54% {\n    top: 1.0625em;\n    left: 0.125em;\n    width: 0;\n  }\n  70% {\n    top: 2.1875em;\n    left: -0.375em;\n    width: 3.125em;\n  }\n  84% {\n    top: 3em;\n    left: 1.3125em;\n    width: 1.0625em;\n  }\n  100% {\n    top: 2.8125em;\n    left: 0.8125em;\n    width: 1.5625em;\n  }\n}\n@-webkit-keyframes swal2-animate-success-line-long {\n  0% {\n    top: 3.375em;\n    right: 2.875em;\n    width: 0;\n  }\n  65% {\n    top: 3.375em;\n    right: 2.875em;\n    width: 0;\n  }\n  84% {\n    top: 2.1875em;\n    right: 0;\n    width: 3.4375em;\n  }\n  100% {\n    top: 2.375em;\n    right: 0.5em;\n    width: 2.9375em;\n  }\n}\n@keyframes swal2-animate-success-line-long {\n  0% {\n    top: 3.375em;\n    right: 2.875em;\n    width: 0;\n  }\n  65% {\n    top: 3.375em;\n    right: 2.875em;\n    width: 0;\n  }\n  84% {\n    top: 2.1875em;\n    right: 0;\n    width: 3.4375em;\n  }\n  100% {\n    top: 2.375em;\n    right: 0.5em;\n    width: 2.9375em;\n  }\n}\n@-webkit-keyframes swal2-rotate-success-circular-line {\n  0% {\n    transform: rotate(-45deg);\n  }\n  5% {\n    transform: rotate(-45deg);\n  }\n  12% {\n    transform: rotate(-405deg);\n  }\n  100% {\n    transform: rotate(-405deg);\n  }\n}\n@keyframes swal2-rotate-success-circular-line {\n  0% {\n    transform: rotate(-45deg);\n  }\n  5% {\n    transform: rotate(-45deg);\n  }\n  12% {\n    transform: rotate(-405deg);\n  }\n  100% {\n    transform: rotate(-405deg);\n  }\n}\n@-webkit-keyframes swal2-animate-error-x-mark {\n  0% {\n    margin-top: 1.625em;\n    transform: scale(0.4);\n    opacity: 0;\n  }\n  50% {\n    margin-top: 1.625em;\n    transform: scale(0.4);\n    opacity: 0;\n  }\n  80% {\n    margin-top: -0.375em;\n    transform: scale(1.15);\n  }\n  100% {\n    margin-top: 0;\n    transform: scale(1);\n    opacity: 1;\n  }\n}\n@keyframes swal2-animate-error-x-mark {\n  0% {\n    margin-top: 1.625em;\n    transform: scale(0.4);\n    opacity: 0;\n  }\n  50% {\n    margin-top: 1.625em;\n    transform: scale(0.4);\n    opacity: 0;\n  }\n  80% {\n    margin-top: -0.375em;\n    transform: scale(1.15);\n  }\n  100% {\n    margin-top: 0;\n    transform: scale(1);\n    opacity: 1;\n  }\n}\n@-webkit-keyframes swal2-animate-error-icon {\n  0% {\n    transform: rotateX(100deg);\n    opacity: 0;\n  }\n  100% {\n    transform: rotateX(0deg);\n    opacity: 1;\n  }\n}\n@keyframes swal2-animate-error-icon {\n  0% {\n    transform: rotateX(100deg);\n    opacity: 0;\n  }\n  100% {\n    transform: rotateX(0deg);\n    opacity: 1;\n  }\n}\n@-webkit-keyframes swal2-rotate-loading {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n@keyframes swal2-rotate-loading {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\nbody.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) {\n  overflow: hidden;\n}\nbody.swal2-height-auto {\n  height: auto !important;\n}\nbody.swal2-no-backdrop .swal2-container {\n  background-color: transparent !important;\n  pointer-events: none;\n}\nbody.swal2-no-backdrop .swal2-container .swal2-popup {\n  pointer-events: all;\n}\nbody.swal2-no-backdrop .swal2-container .swal2-modal {\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n}\n@media print {\n  body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) {\n    overflow-y: scroll !important;\n  }\n  body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) > [aria-hidden=true] {\n    display: none;\n  }\n  body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container {\n    position: static !important;\n  }\n}\nbody.swal2-toast-shown .swal2-container {\n  box-sizing: border-box;\n  width: 360px;\n  max-width: 100%;\n  background-color: transparent;\n  pointer-events: none;\n}\nbody.swal2-toast-shown .swal2-container.swal2-top {\n  top: 0;\n  right: auto;\n  bottom: auto;\n  left: 50%;\n  transform: translateX(-50%);\n}\nbody.swal2-toast-shown .swal2-container.swal2-top-end, body.swal2-toast-shown .swal2-container.swal2-top-right {\n  top: 0;\n  right: 0;\n  bottom: auto;\n  left: auto;\n}\nbody.swal2-toast-shown .swal2-container.swal2-top-start, body.swal2-toast-shown .swal2-container.swal2-top-left {\n  top: 0;\n  right: auto;\n  bottom: auto;\n  left: 0;\n}\nbody.swal2-toast-shown .swal2-container.swal2-center-start, body.swal2-toast-shown .swal2-container.swal2-center-left {\n  top: 50%;\n  right: auto;\n  bottom: auto;\n  left: 0;\n  transform: translateY(-50%);\n}\nbody.swal2-toast-shown .swal2-container.swal2-center {\n  top: 50%;\n  right: auto;\n  bottom: auto;\n  left: 50%;\n  transform: translate(-50%, -50%);\n}\nbody.swal2-toast-shown .swal2-container.swal2-center-end, body.swal2-toast-shown .swal2-container.swal2-center-right {\n  top: 50%;\n  right: 0;\n  bottom: auto;\n  left: auto;\n  transform: translateY(-50%);\n}\nbody.swal2-toast-shown .swal2-container.swal2-bottom-start, body.swal2-toast-shown .swal2-container.swal2-bottom-left {\n  top: auto;\n  right: auto;\n  bottom: 0;\n  left: 0;\n}\nbody.swal2-toast-shown .swal2-container.swal2-bottom {\n  top: auto;\n  right: auto;\n  bottom: 0;\n  left: 50%;\n  transform: translateX(-50%);\n}\nbody.swal2-toast-shown .swal2-container.swal2-bottom-end, body.swal2-toast-shown .swal2-container.swal2-bottom-right {\n  top: auto;\n  right: 0;\n  bottom: 0;\n  left: auto;\n}\n\n.swal2-confirm,\n.swal2-deny,\n.swal2-cancel {\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n.swal2-popup {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n}\n.swal2-popup.swal2-toast {\n  padding: 0.25rem 0.75rem;\n  font-size: 0.875rem;\n}\n.swal2-popup.swal2-toast .swal2-title {\n  margin: 0;\n  color: #6c757d;\n}\n.swal2-popup.swal2-toast .swal2-actions {\n  flex-basis: 0 !important;\n  margin: 0;\n  padding: 0;\n}\n.swal2-popup.swal2-toast .swal2-styled {\n  margin: 0;\n}\n\n.swal2-title {\n  margin: 0;\n  font-size: 1.25rem;\n}\n\n.swal2-actions {\n  border-radius: 0.25rem;\n}\n\n.swal2-footer {\n  padding: 1rem;\n  border-top: 1px solid #dee2e6;\n}\n\n.swal2-close {\n  height: auto;\n  padding: 1rem 1.2rem 1rem 1rem;\n  font-weight: 700;\n}\n\n.swal2-input,\n.swal2-textarea {\n  height: inherit;\n  padding: 0.375rem 0.75rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  line-height: 1.5;\n}\n.swal2-input:focus,\n.swal2-textarea:focus {\n  border: 1px solid #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n  color: #495057;\n}\n.swal2-input.swal2-inputerror,\n.swal2-textarea.swal2-inputerror {\n  box-shadow: none !important;\n}\n.swal2-input.swal2-inputerror:focus,\n.swal2-textarea.swal2-inputerror:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25) !important;\n}\n\n.swal2-styled.swal2-confirm {\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n}\n.swal2-styled.swal2-confirm:hover {\n  border-color: #0062cc;\n  background-color: #0069d9;\n}\n.swal2-styled.swal2-confirm:focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.swal2-styled.swal2-confirm:active {\n  border-color: #005cbf;\n  background-color: #0062cc;\n}\n.swal2-styled.swal2-confirm:active:focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.swal2-styled.swal2-deny {\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n}\n.swal2-styled.swal2-cancel {\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n}\n.swal2-styled.swal2-cancel:hover {\n  border-color: #545b62;\n  background-color: #5a6268;\n}\n.swal2-styled.swal2-cancel:focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.25);\n}\n.swal2-styled.swal2-cancel:active {\n  border-color: #4e555b;\n  background-color: #545b62;\n}\n.swal2-styled.swal2-cancel:active:focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.25);\n}\n\n.swal2-select {\n  display: inline-block;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  background: url('data:image/svg+xml,%3csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 4 5\"%3e%3cpath fill=\"%23343a40\" d=\"M2 0L0 2h4zm0 5L0 3h4z\"/%3e%3c/svg%3e') no-repeat right 0.75rem center/8px 10px;\n  background-color: #fff;\n  color: #495057;\n  vertical-align: middle;\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n}\n.swal2-select:focus {\n  border: 1px solid #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.swal2-select:focus::-ms-value {\n  background-color: #fff;\n  color: #495057;\n}\n.swal2-select[multiple], .swal2-select[size]:not([size=\"1\"]) {\n  height: auto;\n  padding-right: 0.75rem;\n  background-image: none;\n}\n.swal2-select:disabled {\n  background-color: #e9ecef;\n  color: #fff;\n}\n.swal2-select::-ms-expand {\n  display: none;\n}\n\n.swal2-radio label {\n  position: relative;\n  margin-right: 1rem;\n  margin-left: 1.5rem;\n}\n.swal2-radio label input {\n  position: absolute;\n  z-index: -1;\n  opacity: 0;\n}\n.swal2-radio label input:checked ~ .swal2-label::before {\n  border-color: #007bff;\n  background: #007bff;\n  color: #fff;\n}\n.swal2-radio label input:focus ~ .swal2-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.swal2-radio label input:focus:not(:checked) ~ .swal2-label::before {\n  border-color: #80bdff;\n}\n.swal2-radio label input:not(:disabled):active ~ .swal2-label::before {\n  border-color: #b3d7ff;\n  background-color: #b3d7ff;\n  color: #fff;\n}\n.swal2-radio label input:checked ~ .swal2-label::after {\n  background-image: url('data:image/svg+xml,%3csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-4 -4 8 8\"%3e%3ccircle r=\"3\" fill=\"%23fff\"/%3e%3c/svg%3e');\n}\n.swal2-radio label input:disabled:checked ~ .swal2-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n.swal2-radio .swal2-label::before {\n  content: \"\";\n  display: block;\n  position: absolute;\n  top: 0.0833333333rem;\n  /* stylelint-disable-line */\n  left: -1.5rem;\n  width: 1rem;\n  height: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  border: #adb5bd solid 1px;\n  border-radius: 50%;\n  background-color: #fff;\n  pointer-events: none;\n}\n.swal2-radio .swal2-label::after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  top: 0.0833333333rem;\n  /* stylelint-disable-line */\n  left: -1.5rem;\n  width: 1rem;\n  height: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  border: transparent solid 1px;\n  background: no-repeat 50%/50% 50%;\n}\n\n.swal2-checkbox {\n  margin-right: 1rem;\n  padding-left: 1.5rem;\n}\n.swal2-checkbox input {\n  z-index: -1;\n  opacity: 0;\n}\n.swal2-checkbox input:checked ~ .swal2-label::before {\n  border-color: #007bff;\n  background: #007bff;\n  color: #fff;\n}\n.swal2-checkbox input:focus ~ .swal2-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.swal2-checkbox input:focus:not(:checked) ~ .swal2-label::before {\n  border-color: #80bdff;\n}\n.swal2-checkbox input:not(:disabled):active ~ .swal2-label::before {\n  border-color: #b3d7ff;\n  background-color: #b3d7ff;\n  color: #fff;\n}\n.swal2-checkbox input:checked ~ .swal2-label::after {\n  background-image: url('data:image/svg+xml,%3csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 8 8\"%3e%3cpath fill=\"%23fff\" d=\"M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z\"/%3e%3c/svg%3e');\n}\n.swal2-checkbox input:disabled:checked ~ .swal2-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n.swal2-checkbox .swal2-label {\n  position: relative;\n}\n.swal2-checkbox .swal2-label::before {\n  content: \"\";\n  display: block;\n  position: absolute;\n  top: 0.25rem;\n  /* stylelint-disable-line */\n  left: -1.5rem;\n  width: 1rem;\n  height: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  border: #adb5bd solid 1px;\n  background-color: #fff;\n  pointer-events: none;\n}\n.swal2-checkbox .swal2-label::after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  top: 0.25rem;\n  /* stylelint-disable-line */\n  left: -1.5rem;\n  width: 1rem;\n  height: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  border: transparent solid 1px;\n  background: no-repeat 50%/50% 50%;\n}\n\n.swal2-range {\n  align-items: center;\n}\n.swal2-range input {\n  width: 100%;\n  height: calc(1rem + 0.6rem);\n  padding: 0;\n  background-color: transparent;\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n}\n.swal2-range input:focus {\n  outline: none;\n}\n.swal2-range input:focus::-webkit-slider-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.swal2-range input:focus::-moz-range-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.swal2-range input:focus::-ms-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.swal2-range input::-moz-focus-outer {\n  border: 0;\n}\n.swal2-range input::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  /* stylelint-disable-line */\n  -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  border: 0;\n  border-radius: 1rem;\n  background: #007bff;\n  box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1);\n  -webkit-appearance: none;\n          appearance: none;\n}\n.swal2-range input::-webkit-slider-thumb:active {\n  background: #b3d7ff;\n}\n.swal2-range input::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  border-radius: 1rem;\n  border-color: transparent;\n  background-color: #dee2e6;\n  box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1);\n  color: transparent;\n  cursor: pointer;\n}\n.swal2-range input::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: 1rem;\n  -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  border: 0;\n  border-radius: 1rem;\n  background: #007bff;\n  box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1);\n  -moz-appearance: none;\n       appearance: none;\n}\n.swal2-range input::-moz-range-thumb:active {\n  background: #b3d7ff;\n}\n.swal2-range input::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  border-radius: 1rem;\n  border-color: transparent;\n  background-color: #dee2e6;\n  box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1);\n  color: transparent;\n  cursor: pointer;\n}\n.swal2-range input::-ms-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: 0;\n  margin-right: 0.2rem;\n  margin-left: 0.2rem;\n  -ms-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  border: 0;\n  border-radius: 1rem;\n  background: #007bff;\n  box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1);\n  appearance: none;\n}\n.swal2-range input::-ms-thumb:active {\n  background: #b3d7ff;\n}\n.swal2-range input::-ms-track {\n  width: 100%;\n  height: 0.5rem;\n  border-width: 0.5rem;\n  /* stylelint-disable-line */\n  border-color: transparent;\n  background-color: transparent;\n  box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1);\n  color: transparent;\n  cursor: pointer;\n}\n.swal2-range input::-ms-fill-lower {\n  border-radius: 1rem;\n  background-color: #dee2e6;\n}\n.swal2-range input::-ms-fill-upper {\n  margin-right: 15px;\n  border-radius: 1rem;\n  background-color: #dee2e6;\n}\n.swal2-range input:disabled::-webkit-slider-thumb {\n  background-color: #adb5bd;\n}\n.swal2-range input:disabled::-webkit-slider-runnable-track {\n  cursor: default;\n}\n.swal2-range input:disabled::-moz-range-thumb {\n  background-color: #adb5bd;\n}\n.swal2-range input:disabled::-moz-range-track {\n  cursor: default;\n}\n.swal2-range input:disabled::-ms-thumb {\n  background-color: #adb5bd;\n}\n\n.swal2-validation-message {\n  position: relative;\n  margin-bottom: 1rem;\n  padding: 0.75rem 1.25rem;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n  border-color: #d6d8db;\n  background: #e2e3e5;\n  color: #383d41;\n  font-size: 1rem;\n}\n.swal2-validation-message::before {\n  background-color: #e4606d;\n}\n\n.swal2-toast {\n  max-width: 350px;\n  border-radius: 0.25rem;\n  background-color: rgba(255, 255, 255, 0.85);\n}"
  },
  {
    "path": "配套插件/BsCore/bsOptions.php",
    "content": "<?php\n/**\n * Json\n * https://www.bearnotion.org/\n */\n\nuse Typecho\\Db;\nrequire_once 'functions/options.php';\n\nif (!class_exists('bsOptions')) {\n    class bsOptions {\n\n        private static $instance = null;\n\n        public function __construct()\n        {\n\n        }\n\n        public static function getInstance(): bsOptions\n        {\n            if (is_null(self::$instance)) {\n                self::$instance = new self();\n            }\n            return self::$instance;\n        }\n\n        public static function get_option($option, $default = false)\n        {\n            return get_option($option, $default);\n        }\n\n        public static function update_option($option, $value, $autoload = null): void\n        {\n            update_option($option, $value, $autoload);\n        }\npublic static function getValue($array, $key, $default = null)\n        {\n            if (is_array($key)) {\n                $lastKey = array_pop($key);\n                foreach ($key as $keyPart) {\n                    $array = self::getValue($array, $keyPart);\n                }\n                $key = $lastKey;\n            }\n            if (is_array($array) && array_key_exists($key, $array)) {\n                return $array[$key];\n            }\n            if (($pos = strrpos($key, '.')) !== false) {\n                $array = self::getValue($array, substr($key, 0, $pos), $default);\n                $key = substr($key, $pos + 1);\n            }\n            if (is_object($array)) {\n                return $array->$key;\n            } elseif (is_array($array)) {\n                return array_key_exists($key, $array) ? $array[$key] : $default;\n            } else {\n                return $default;\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "配套插件/BsCore/bsRouter.php",
    "content": "<?php\n/**\n * Rules\n * https://www.bearnotion.ru/\n */\nnamespace TypechoPlugin\\BsCore;\n\nrequire_once 'functions/defines.php';\nrequire_once 'bsoptions-framework.php';\nuse CSF;\nuse Utils\\Helper;\n\nglobal $cfs_options;\n$cfs_options = [];\n\nclass bsRouter extends \\Typecho\\Widget\n{\n\n    public static function initRouter()\n    {\n        Helper::addRoute('saveBSoptions', '/bsoptions/save', __CLASS__, 'saveBSoptions');\n        //Helper::addRoute('saveBSoptions_ajax', '/bsoptions/ajax', __CLASS__, 'saveBSoptionsByAjax');\n    }\n\n    public static function removeRouter()\n    {\n        Helper::removeRoute('saveBSoptions');\n        Helper::removeRoute('saveBSoptions_ajax');\n    }\n\n    public function saveBSoptions()\n    {\n        $user = \\Typecho\\Widget::widget('Widget_User');\n        if (!$user->hasLogin()) {\n            echo '用户未登录';\n            die();\n        }\n\n        // Set variables.\n        $plugin = $this->request->get('plugin');\n\n        $obj = get_bs_key_params($plugin);\n        $obj->set_options(true);\n        $this->response->goBack();\n    }\n\n    public function saveBSoptionsByAjax()\n    {\n        $user = \\Typecho\\Widget::widget('Widget_User');\n        if (!$user->hasLogin()) {\n            $data = [\n                'data' => [\n                    'notice' => '未登录',\n                    'errors' => []\n                ],\n                'success' => false\n            ];\n            $this->response->throwJson($data);\n        }\n\n        $action = $this->request->get('action', null);\n        if (!$action) {\n            $data = [\n                'data' => [\n                    'notice' => '参数错误',\n                    'errors' => []\n                ],\n                'success' => false\n            ];\n            $this->response->throwJson($data);\n        }\n        if (preg_match('/csf_(.*)_ajax_save/i', $action)) {\n            $data = json_decode($_POST['data'], true);\n            $plugin = $data['plugin'];\n\n\n            $obj = get_bs_key_params($plugin);\n            $ret = $obj->set_options(true);\n\n            if ($ret and empty($obj->errors)) {\n                $data = [\n                    'data' => [\n                        'notice' => $obj->notice,\n                        'errors' => $obj->errors\n                    ],\n                    'success' => true\n                ];\n                $this->response->throwJson($data);\n            } else {\n                $data = [\n                    'data' => [\n                        'notice' => $obj->notice,\n                        'errors' => $obj->errors\n                    ],\n                    'success' => true\n                ];\n                $this->response->throwJson($data);\n            }\n\n        } else {\n            $action = str_replace('-', '_', $action);\n            CSF::include_plugin_file('functions/actions.php');\n            $action($this->response);\n        }\n\n    }\n}\n\n"
  },
  {
    "path": "配套插件/BsCore/bsoptions-framework.php",
    "content": "<?php\n\nif ( ! defined( 'ABSPATH' ) ) {\n    define( 'ABSPATH', __DIR__ . '/' );\n}\n/**\n *\n * BsCore\n * https://www.bearnotion.ru/\n *\n */\nuse Typecho\\I18n;\nuse TypechoPlugin\\BsCore\\bsRouter;\n\nif (!function_exists('untrailingslashit')){\n    function untrailingslashit( $string ) {\n        return rtrim( $string, '/\\\\' );\n    }\n}\n\nif (!function_exists('trailingslashit')) {\n    function trailingslashit($string)\n    {\n        return untrailingslashit($string) . '/';\n    }\n}\nif (!function_exists('plugin_dir_path')) {\n\n    function plugin_dir_path($file)\n    {\n        return trailingslashit(dirname($file));\n    }\n}\nif (class_exists('\\Typecho\\I18n')){\n    I18n::setLang(plugin_dir_path(__FILE__) . 'languages/zh_CN.mo');\n}\n\n// 仅在插件页或者主题页添加 class\n// Add admin body class\nif (strpos($_SERVER['REQUEST_URI'], 'plugin.php')!==false or strpos($_SERVER['REQUEST_URI'], 'theme.php')){\n    // set body class\n    global $bodyClass;\n    $bodyClass = $bodyClass.'wp-core-ui csf-fa5-shims';\n}\n\nrequire_once plugin_dir_path(__FILE__) . 'functions/defines.php';\nrequire_once plugin_dir_path(__FILE__) . 'functions/plugin.php';\nrequire_once plugin_dir_path(__FILE__) . 'functions/media-template.php';\n\nrequire_once plugin_dir_path(__FILE__) . 'functions/wp_query.php';\nrequire_once plugin_dir_path(__FILE__) . 'functions/class.wp_term_query.php';\nrequire_once plugin_dir_path(__FILE__) . 'functions/class.wp_user_query.php';\nrequire_once plugin_dir_path(__FILE__) . 'functions/class.wp_meta_query.php';\n\n\n// init cache\nrequire_once plugin_dir_path(__FILE__) . 'functions/class.wp_object_cache.php';\n\nif ( function_exists( 'wp_cache_init' ) ) {\n    wp_cache_init();\n}\n//导入路由\nrequire_once 'bsRouter.php';\n\nrequire_once plugin_dir_path(__FILE__) . 'functions/class.wp_roles.php';\n$GLOBALS['wp_roles'] = new WP_Roles();\n\nrequire_once plugin_dir_path(__FILE__) . 'classes/setup.class.php';\n\nif (!class_exists('CSF')) {\n    class CSF extends CSF_Setup\n    {\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/classes/abstract.class.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Abstract Class\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Abstract' ) ) {\n  abstract class CSF_Abstract {\n\n    public $abstract   = '';\n    public $output_css = '';\n\n    public function __construct() {\n\n      // Collect output css and typography\n      if ( ! empty( $this->args['output_css'] ) || ! empty( $this->args['enqueue_webfont'] ) ) {\n//        add_action( 'wp_enqueue_scripts', array( $this, 'collect_output_css_and_typography' ), 10 );\n        CSF::$css = apply_filters( \"csf_{$this->unique}_output_css\", CSF::$css, $this );\n      }\n\n    }\n\n    public function collect_output_css_and_typography() {\n      $this->recursive_output_css( $this->pre_fields );\n    }\n\n    public function recursive_output_css( $fields = array(), $combine_field = array() ) {\n\n      if ( ! empty( $fields ) ) {\n\n        foreach ( $fields as $field ) {\n\n          $field_id     = ( ! empty( $field['id'] ) ) ? $field['id'] : '';\n          $field_type   = ( ! empty( $field['type'] ) ) ? $field['type'] : '';\n          $field_output = ( ! empty( $field['output'] ) ) ? $field['output'] : '';\n          $field_check  = ( $field_type === 'typography' || $field_output ) ? true : false;\n          $field_class  = 'CSF_Field_' . $field_type;\n\n          if ( $field_type && $field_id ) {\n\n\n            if( $field_type === 'fieldset' ) {\n              if ( ! empty( $field['fields'] ) ) {\n                $this->recursive_output_css( $field['fields'], $field );\n              }\n            }\n\n            if( $field_type === 'accordion' ) {\n              if ( ! empty( $field['accordions'] ) ) {\n                foreach ( $field['accordions'] as $accordion ) {\n                  $this->recursive_output_css( $accordion['fields'], $field );\n                }\n              }\n            }\n\n            if( $field_type === 'tabbed' ) {\n              if ( ! empty( $field['tabs'] ) ) {\n                foreach ( $field['tabs'] as $accordion ) {\n                  $this->recursive_output_css( $accordion['fields'], $field );\n                }\n              }\n            }\n\n            if ( class_exists( $field_class ) ) {\n\n              if ( method_exists( $field_class, 'output' ) || method_exists( $field_class, 'enqueue_google_fonts' ) ) {\n\n                $field_value = '';\n\n                if ( $field_check && ( $this->abstract === 'options' || $this->abstract === 'customize' ) ) {\n\n                  if( ! empty( $combine_field ) ) {\n\n                    $field_value = ( isset( $this->options[$combine_field['id']][$field_id] ) ) ? $this->options[$combine_field['id']][$field_id] : '';\n\n                  } else {\n\n                    $field_value = ( isset( $this->options[$field_id] ) ) ? $this->options[$field_id] : '';\n\n                  }\n\n                } else if ( $field_check && ( $this->abstract === 'metabox' && is_singular() || $this->abstract === 'taxonomy' && is_archive() ) ) {\n\n                  if( ! empty( $combine_field ) ) {\n\n                    $meta_value  = $this->get_meta_value( $combine_field );\n                    $field_value = ( isset( $meta_value[$field_id] ) ) ? $meta_value[$field_id] : '';\n\n                  } else {\n\n                    $meta_value  = $this->get_meta_value( $field );\n                    $field_value = ( isset( $meta_value ) ) ? $meta_value : '';\n\n                  }\n\n                }\n\n                $instance = new $field_class( $field, $field_value, $this->unique, 'wp/enqueue', $this );\n\n                // typography enqueue and embed google web fonts\n                if ( $field_type === 'typography' && $this->args['enqueue_webfont'] && ! empty( $field_value['font-family'] ) ) {\n\n                  $method = ( ! empty( $this->args['async_webfont'] ) ) ? 'async' : 'enqueue';\n\n                  $instance->enqueue_google_fonts( $method );\n\n                }\n\n                // output css\n                if ( $field_output && $this->args['output_css'] ) {\n                  CSF::$css .= $instance->output();\n                }\n\n                unset( $instance );\n\n              }\n\n            }\n\n          }\n\n        }\n\n      }\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/classes/admin-options.class.php",
    "content": "<?php if (!defined('ABSPATH')) {\n    die;\n} // Cannot access directly.\n/**\n *\n * Options Class\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif (!class_exists('CSF_Options')) {\n    class CSF_Options extends CSF_Abstract\n    {\n\n        // constans\n        public $unique = '';\n        public $notice = '';\n        public $abstract = 'options';\n        public $sections = array();\n        public $options = array();\n        public $errors = array();\n        public $pre_tabs = array();\n        public $pre_fields = array();\n        public $pre_sections = array();\n        public $args = array(\n\n            // framework title\n            'framework_title' => 'BearSimple OptionsFramework',\n            'framework_class' => '',\n\n            // menu settings\n            'menu_title' => '配置中心',\n            'menu_slug' => '',\n            'menu_type' => 'menu',\n            'menu_capability' => 'manage_options',\n            'menu_icon' => null,\n            'menu_position' => null,\n            'menu_hidden' => false,\n            'menu_parent' => '',\n            'sub_menu_title' => '',\n\n            // menu extras\n            'show_bar_menu' => true,\n            'show_sub_menu' => true,\n            'show_in_network' => true,\n            'show_in_customizer' => true,\n\n            'show_search' => true,\n            'show_reset_all' => true,\n            'show_reset_section' => true,\n            'show_footer' => true,\n            'show_all_options' => true,\n            'show_form_warning' => true,\n            'sticky_header' => true,\n            'save_defaults' => true,\n            'ajax_save' => true,\n            'form_action' => '',\n\n            // admin bar menu settings\n            'admin_bar_menu_icon' => '',\n            'admin_bar_menu_priority' => 50,\n\n            // footer\n            'footer_text' => 'Bearsimple',\n            'footer_after' => '',\n            'footer_credit' => '',\n\n            // database model\n            'database' => '', // options, transient, theme_mod, network\n            'transient_time' => 0,\n\n            // contextual help\n            'contextual_help' => array(),\n            'contextual_help_sidebar' => '',\n\n            // typography options\n            'enqueue_webfont' => true,\n            'async_webfont' => false,\n\n            // others\n            'output_css' => true,\n\n            // theme\n            'nav' => 'normal',\n            'theme' => 'light',\n            'class' => '',\n\n            // external default values\n            'defaults' => array(),\n\n        );\n\n        // run framework construct\n        public function __construct($key, $params = array())\n        {\n            $this->unique = $key;\n            $this->args = apply_filters(\"csf_{$this->unique}_args\", wp_parse_args($params['args'], $this->args), $this);\n            $this->sections = apply_filters(\"csf_{$this->unique}_sections\", $params['sections'], $this);\n\n            // run only is admin panel options, avoid performance loss\n            $this->pre_tabs = $this->pre_tabs($this->sections);\n            $this->pre_fields = $this->pre_fields($this->sections);\n            $this->pre_sections = $this->pre_sections($this->sections);\n\n            $this->get_options();\n            // 设置默认值\n            $this->set_options();\n            $this->save_defaults();\n\n            // convert add_action\n            $this->add_admin_menu();\n//      add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );\n//      add_action( 'admin_bar_menu', array( $this, 'add_admin_bar_menu' ), $this->args['admin_bar_menu_priority'] );\n//            add_action( 'wp_ajax_csf_'. $this->unique .'_ajax_save', array( $this, 'ajax_save' ) );\n\n//            if ($this->args['database'] === 'network' && !empty($this->args['show_in_network'])) {\n//        add_action( 'network_admin_menu', array( $this, 'add_admin_menu' ) );\n//            }\n\n            // wp enqeueu for typography and output css\n            parent::__construct();\n\n        }\n\n        // instance\n        public static function instance($key, $params = array())\n        {\n            return new self($key, $params);\n        }\n\n        public function pre_tabs($sections)\n        {\n\n            $result = array();\n            $parents = array();\n            $count = 100;\n\n            foreach ($sections as $key => $section) {\n                if (!empty($section['parent'])) {\n                    $section['priority'] = (isset($section['priority'])) ? $section['priority'] : $count;\n                    $parents[$section['parent']][] = $section;\n                    unset($sections[$key]);\n                }\n                $count++;\n            }\n\n            foreach ($sections as $key => $section) {\n                $section['priority'] = (isset($section['priority'])) ? $section['priority'] : $count;\n                if (!empty($section['id']) && !empty($parents[$section['id']])) {\n                    $section['subs'] = wp_list_sort($parents[$section['id']], array('priority' => 'ASC'), 'ASC', true);\n                }\n                $result[] = $section;\n                $count++;\n            }\n\n            return wp_list_sort($result, array('priority' => 'ASC'), 'ASC', true);\n        }\n\n        public function pre_fields($sections)\n        {\n\n            $result = array();\n\n            foreach ($sections as $key => $section) {\n                if (!empty($section['fields'])) {\n                    foreach ($section['fields'] as $field) {\n                        $result[] = $field;\n                    }\n                }\n            }\n\n            return $result;\n        }\n\n        public function pre_sections($sections)\n        {\n\n            $result = array();\n\n            foreach ($this->pre_tabs as $tab) {\n                if (!empty($tab['subs'])) {\n                    foreach ($tab['subs'] as $sub) {\n                        $sub['ptitle'] = $tab['title'];\n                        $result[] = $sub;\n                    }\n                }\n                if (empty($tab['subs'])) {\n                    $result[] = $tab;\n                }\n            }\n\n            return $result;\n        }\n\n        // add admin bar menu\n        public function add_admin_bar_menu($wp_admin_bar)\n        {\n\n            if (!current_user_can($this->args['menu_capability'])) {\n                return;\n            }\n\n            if (is_network_admin() && ($this->args['database'] !== 'network' || $this->args['show_in_network'] !== true)) {\n                return;\n            }\n\n            if (!empty($this->args['show_bar_menu']) && empty($this->args['menu_hidden'])) {\n\n                global $submenu;\n\n                $menu_slug = $this->args['menu_slug'];\n                $menu_icon = (!empty($this->args['admin_bar_menu_icon'])) ? '<span class=\"csf-ab-icon ab-icon ' . esc_attr($this->args['admin_bar_menu_icon']) . '\"></span>' : '';\n\n                $wp_admin_bar->add_node(array(\n                    'id' => $menu_slug,\n                    'title' => $menu_icon . esc_attr($this->args['menu_title']),\n                    'href' => esc_url((is_network_admin()) ? network_admin_url('admin.php?page=' . $menu_slug) : admin_url('admin.php?page=' . $menu_slug)),\n                ));\n\n                if (!empty($submenu[$menu_slug])) {\n                    foreach ($submenu[$menu_slug] as $menu_key => $menu_value) {\n                        $wp_admin_bar->add_node(array(\n                            'parent' => $menu_slug,\n                            'id' => $menu_slug . '-' . $menu_key,\n                            'title' => $menu_value[0],\n                            'href' => esc_url((is_network_admin()) ? network_admin_url('admin.php?page=' . $menu_value[2]) : admin_url('admin.php?page=' . $menu_value[2])),\n                        ));\n                    }\n                }\n\n            }\n\n        }\n\n        public function ajax_save()\n        {\n\n            $result = $this->set_options(true);\n\n            if (!$result) {\n                wp_send_json_error(array('error' => esc_html__('Error while saving the changes.', 'csf')));\n            } else {\n                wp_send_json_success(array('notice' => $this->notice, 'errors' => $this->errors));\n            }\n\n        }\n\n        // get default value\n        public function get_default($field)\n        {\n\n            $default = (isset($field['default'])) ? $field['default'] : '';\n            $default = (isset($this->args['defaults'][$field['id']])) ? $this->args['defaults'][$field['id']] : $default;\n\n            return $default;\n\n        }\n\n        // save defaults and set new fields value to main options\n        public function save_defaults()\n        {\n\n            $tmp_options = $this->options;\n\n            foreach ($this->pre_fields as $field) {\n                if (!empty($field['id'])) {\n                    $this->options[$field['id']] = (isset($this->options[$field['id']])) ? $this->options[$field['id']] : $this->get_default($field);\n                }\n            }\n\n            if ($this->args['save_defaults'] && empty($tmp_options)) {\n                $this->save_options($this->options);\n            }\n\n        }\n\n        // set options\n        public function set_options($ajax = false)\n        {\n\n            // XSS ok.\n            // No worries, This \"POST\" requests is sanitizing in the below foreach. see #L337 - #L341\n            $response = ($ajax && !empty($_POST['data'])) ? json_decode((trim($_POST['data'])), true) : $_POST;\n\n            // Set variables.\n            $data = array();\n            $noncekey = 'csf_options_nonce' . $this->unique;\n            $nonce = (!empty($response[$noncekey])) ? $response[$noncekey] : '';\n            $options = (!empty($response[$this->unique])) ? $response[$this->unique] : get_option($this->unique);\n            $transient = (!empty($response['csf_transient'])) ? $response['csf_transient'] : array();\n//            var_dump($response);\n\n            if (wp_verify_nonce($nonce, 'csf_options_nonce')) {\n\n                $importing = false;\n                $section_id = (!empty($transient['section'])) ? $transient['section'] : '';\n\n                if (!$ajax && !empty($response['csf_import_data'])) {\n\n                    // XSS ok.\n                    // No worries, This \"POST\" requests is sanitizing in the below foreach. see #L337 - #L341\n                    $import_data = json_decode(wp_unslash(trim($response['csf_import_data'])), true);\n                    $options = (is_array($import_data) && !empty($import_data)) ? $import_data : array();\n                    $importing = true;\n                    $this->notice = esc_html__('Settings successfully imported.', 'csf');\n\n                }\n\n                if (!empty($transient['reset'])) {\n\n                    foreach ($this->pre_fields as $field) {\n                        if (!empty($field['id'])) {\n                            $data[$field['id']] = $this->get_default($field);\n                        }\n                    }\n\n                    $this->notice = esc_html__('Default settings restored.', 'csf');\n\n                } else if (!empty($transient['reset_section']) && !empty($section_id)) {\n\n                    if (!empty($this->pre_sections[$section_id - 1]['fields'])) {\n\n                        foreach ($this->pre_sections[$section_id - 1]['fields'] as $field) {\n                            if (!empty($field['id'])) {\n                                $data[$field['id']] = $this->get_default($field);\n                            }\n                        }\n\n                    }\n\n                    $data = wp_parse_args($data, $this->options);\n\n                    $this->notice = esc_html__('Default settings restored.', 'csf');\n\n                } else {\n                    // sanitize and validate\n                    foreach ($this->pre_fields as $field) {\n\n                        if (!empty($field['id'])) {\n\n                            $field_id = $field['id'];\n                            $field_value = isset($options[$field_id]) ? $options[$field_id] : '';\n\n                            // Ajax and Importing doing wp_unslash already.\n                            if (!$ajax && !$importing) {\n                                $field_value = wp_unslash($field_value);\n                            }\n\n                            // Sanitize \"post\" request of field.\n                            if (!isset($field['sanitize'])) {\n                                $data[$field_id] = $field_value;\n\n                                // 暂时取消过滤\n//                                if (is_array($field_value)) {\n//\n//                                    $data[$field_id] = wp_kses_post_deep($field_value);\n//\n//                                } else {\n//\n//                                    $data[$field_id] = wp_kses_post($field_value);\n//\n//                                }\n\n                            } else if (isset($field['sanitize']) && is_callable($field['sanitize'])) {\n\n                                $data[$field_id] = call_user_func($field['sanitize'], $field_value);\n\n                            } else {\n\n                                $data[$field_id] = $field_value;\n\n                            }\n\n                            // Validate \"post\" request of field.\n                            if (isset($field['validate']) && is_callable($field['validate'])) {\n\n                                $has_validated = call_user_func($field['validate'], $field_value);\n\n                                if (!empty($has_validated)) {\n\n                                    $data[$field_id] = (isset($this->options[$field_id])) ? $this->options[$field_id] : '';\n                                    $this->errors[$field_id] = $has_validated;\n\n                                }\n\n                            }\n\n                        }\n\n                    }\n\n                }\n                $data = apply_filters(\"csf_{$this->unique}_save\", $data, $this);\n\n//        do_action( \"csf_{$this->unique}_save_before\", $data, $this );\n\n                $this->options = $data;\n\n                $this->save_options($data);\n\n//        do_action( \"csf_{$this->unique}_save_after\", $data, $this );\n\n                if (empty($this->notice)) {\n                    $this->notice = esc_html__('Settings saved.', 'csf');\n                }\n\n                return true;\n\n            }\n\n            return false;\n\n        }\n\n        // save options database\n        public function save_options($data)\n        {\n\n            if ($this->args['database'] === 'transient') {\n                set_transient($this->unique, $data, $this->args['transient_time']);\n            } else if ($this->args['database'] === 'theme_mod') {\n                set_theme_mod($this->unique, $data);\n            } else if ($this->args['database'] === 'network') {\n                update_site_option($this->unique, $data);\n            } else {\n                update_option($this->unique, $data);\n            }\n\n//      do_action( \"csf_{$this->unique}_saved\", $data, $this );\n\n        }\n\n        // get options from database\n        public function get_options()\n        {\n\n            if ($this->args['database'] === 'transient') {\n                $this->options = get_transient($this->unique);\n            } else if ($this->args['database'] === 'theme_mod') {\n                $this->options = get_theme_mod($this->unique);\n            } else if ($this->args['database'] === 'network') {\n                $this->options = get_site_option($this->unique);\n            } else {\n//                var_dump(get_option($this->unique));\n                $this->options = get_option($this->unique);\n            }\n\n            if (empty($this->options)) {\n                $this->options = array();\n            }\n\n            return $this->options;\n\n        }\n\n        // admin menu\n        public function add_admin_menu()\n        {\n\n            extract($this->args);\n            // 直接调用\n            $this->add_options_html();\n\n//            if ($menu_type === 'submenu') {\n//\n//                $menu_page = call_user_func('add_submenu_page', $menu_parent, esc_attr($menu_title), esc_attr($menu_title), $menu_capability, $menu_slug, array($this, 'add_options_html'));\n//\n//            } else {\n//\n//                $menu_page = call_user_func('add_menu_page', esc_attr($menu_title), esc_attr($menu_title), $menu_capability, $menu_slug, array($this, 'add_options_html'), $menu_icon, $menu_position);\n//\n//                if (!empty($sub_menu_title)) {\n//                    call_user_func('add_submenu_page', $menu_slug, esc_attr($sub_menu_title), esc_attr($sub_menu_title), $menu_capability, $menu_slug, array($this, 'add_options_html'));\n//                }\n//\n//                if (!empty($this->args['show_sub_menu']) && count($this->pre_tabs) > 1) {\n//\n//                    // create submenus\n//                    foreach ($this->pre_tabs as $section) {\n//                        call_user_func('add_submenu_page', $menu_slug, esc_attr($section['title']), esc_attr($section['title']), $menu_capability, $menu_slug . '#tab=' . sanitize_title($section['title']), '__return_null');\n//                    }\n//\n//                    remove_submenu_page($menu_slug, $menu_slug);\n//\n//                }\n//\n//                if (!empty($menu_hidden)) {\n//                    remove_menu_page($menu_slug);\n//                }\n//\n//            }\n\n//      add_action( 'load-'. $menu_page, array( $this, 'add_page_on_load' ) );\n\n        }\n\n        public function add_page_on_load()\n        {\n\n            if (!empty($this->args['contextual_help'])) {\n\n                $screen = get_current_screen();\n\n                foreach ($this->args['contextual_help'] as $tab) {\n                    $screen->add_help_tab($tab);\n                }\n\n                if (!empty($this->args['contextual_help_sidebar'])) {\n                    $screen->set_help_sidebar($this->args['contextual_help_sidebar']);\n                }\n\n            }\n\n            if (!empty($this->args['footer_credit'])) {\n                add_filter('admin_footer_text', array($this, 'add_admin_footer_text'));\n            }\n\n        }\n\n        public function add_admin_footer_text()\n        {\n            echo wp_kses_post($this->args['footer_credit']);\n        }\n\n        public function error_check($sections, $err = '')\n        {\n\n            if (!$this->args['ajax_save']) {\n\n                if (!empty($sections['fields'])) {\n                    foreach ($sections['fields'] as $field) {\n                        if (!empty($field['id'])) {\n                            if (array_key_exists($field['id'], $this->errors)) {\n                                $err = '<span class=\"csf-label-error\">!</span>';\n                            }\n                        }\n                    }\n                }\n\n                if (!empty($sections['subs'])) {\n                    foreach ($sections['subs'] as $sub) {\n                        $err = $this->error_check($sub, $err);\n                    }\n                }\n\n                if (!empty($sections['id']) && array_key_exists($sections['id'], $this->errors)) {\n                    $err = $this->errors[$sections['id']];\n                }\n\n            }\n\n            return $err;\n        }\n\n        // option page html output\n        public function add_options_html()\n        {\n\n            $has_nav = (count($this->pre_tabs) > 1) ? true : false;\n            $show_all = (!$has_nav) ? ' csf-show-all' : '';\n            $ajax_class = ($this->args['ajax_save']) ? ' csf-save-ajax' : '';\n            $sticky_class = ($this->args['sticky_header']) ? ' csf-sticky-header' : '';\n            $wrapper_class = ($this->args['framework_class']) ? ' ' . $this->args['framework_class'] : '';\n            $theme = ($this->args['theme']) ? ' csf-theme-' . $this->args['theme'] : '';\n            $class = ($this->args['class']) ? ' ' . $this->args['class'] : '';\n            $nav_type = ($this->args['nav'] === 'inline') ? 'inline' : 'normal';\n            $form_action = ($this->args['form_action']) ? $this->args['form_action'] : '';\n\n//      do_action( 'csf_options_before' );\n\n            echo '<div id=\"wpwrap\" class=\"wp-core-ui ui-content\"><div id=\"wpcontent\"><div id=\"wpbody\" role=\"main\">';\n            echo '<div class=\"csf csf-options' . esc_attr($theme . $class . $wrapper_class) . '\" data-slug=\"' . esc_attr($this->args['menu_slug']) . '\" data-unique=\"' . esc_attr($this->unique) . '\">';\n\n            echo '<div class=\"csf-container\">';\n\n            echo '<form method=\"post\" action=\"' . esc_attr($form_action) . '\" enctype=\"multipart/form-data\" id=\"csf-form\" autocomplete=\"off\" novalidate=\"novalidate\">';\n\n            echo '<input type=\"hidden\" class=\"csf-section-id\" name=\"csf_transient[section]\" value=\"1\">';\n            // add plugin\n            echo '<input type=\"hidden\" class=\"\" name=\"plugin\" value=\"'.CSF::$plugin_name.'\">';\n\n            wp_nonce_field('csf_options_nonce', 'csf_options_nonce' . $this->unique);\n\n            echo '<div class=\"csf-header' . esc_attr($sticky_class) . '\">';\n            echo '<div class=\"csf-header-inner\">';\n\n            echo '<div class=\"csf-header-left\">';\n            echo '<h1>' . $this->args['framework_title'] . '</h1>';\n            echo '</div>';\n\n            echo '<div class=\"csf-header-right\">';\n\n            $notice_class = (!empty($this->notice)) ? 'csf-form-show' : '';\n            $notice_text = (!empty($this->notice)) ? $this->notice : '';\n\n            echo '<div class=\"csf-form-result csf-form-success ' . esc_attr($notice_class) . '\">' . $notice_text . '</div>';\n\n            echo ($this->args['show_form_warning']) ? '<div class=\"csf-form-result csf-form-warning\">' . esc_html__('You have unsaved changes, save your changes!', 'csf') . '</div>' : '';\n\n            echo ($has_nav && $this->args['show_all_options']) ? '<div class=\"csf-expand-all\" title=\"' . esc_html__('show all settings', 'csf') . '\"><i class=\"fas fa-outdent\"></i></div>' : '';\n\n            echo ($this->args['show_search']) ? '<div class=\"csf-search\"><input type=\"text\" name=\"csf-search\" placeholder=\"' . esc_html__('Search...', 'csf') . '\" autocomplete=\"off\" /></div>' : '';\n\n            echo '<div class=\"csf-buttons\">';\n            echo '<input type=\"submit\" name=\"' . esc_attr($this->unique) . '[_nonce][save]\" class=\"button button-primary csf-top-save csf-save' . esc_attr($ajax_class) . '\" value=\"' . esc_html__('Save', 'csf') . '\" data-save=\"' . esc_html__('Saving...', 'csf') . '\">';\n            echo ($this->args['show_reset_section']) ? '<input type=\"submit\" name=\"csf_transient[reset_section]\" class=\"button button-secondary csf-reset-section csf-confirm\" value=\"' . esc_html__('Reset Section', 'csf') . '\" data-confirm=\"' . esc_html__('Are you sure to reset this section options?', 'csf') . '\">' : '';\n            echo ($this->args['show_reset_all']) ? '<input type=\"submit\" name=\"csf_transient[reset]\" class=\"button csf-warning-primary csf-reset-all csf-confirm\" value=\"' . (($this->args['show_reset_section']) ? esc_html__('Reset All', 'csf') : esc_html__('Reset', 'csf')) . '\" data-confirm=\"' . esc_html__('Are you sure you want to reset all settings to default values?', 'csf') . '\">' : '';\n            echo '</div>';\n\n            echo '</div>';\n\n            echo '<div class=\"clear\"></div>';\n            echo '</div>';\n            echo '</div>';\n\n            echo '<div class=\"csf-wrapper' . esc_attr($show_all) . '\">';\n\n            if ($has_nav) {\n\n                echo '<div class=\"csf-nav csf-nav-' . esc_attr($nav_type) . ' csf-nav-options\">';\n\n                echo '<ul>';\n\n                foreach ($this->pre_tabs as $tab) {\n\n                    $tab_id = sanitize_title($tab['title']);\n                    $tab_error = $this->error_check($tab);\n                    $tab_icon = (!empty($tab['icon'])) ? '<i class=\"csf-tab-icon ' . esc_attr($tab['icon']) . '\"></i>' : '';\n\n                    if (!empty($tab['subs'])) {\n\n                        echo '<li class=\"csf-tab-item\">';\n\n                        echo '<a href=\"#tab=' . esc_attr($tab_id) . '\" data-tab-id=\"' . esc_attr($tab_id) . '\" class=\"csf-arrow\">' . $tab_icon . $tab['title'] . $tab_error . '</a>';\n\n                        echo '<ul>';\n\n                        foreach ($tab['subs'] as $sub) {\n\n                            $sub_id = $tab_id . '/' . sanitize_title($sub['title']);\n                            $sub_error = $this->error_check($sub);\n                            $sub_icon = (!empty($sub['icon'])) ? '<i class=\"csf-tab-icon ' . esc_attr($sub['icon']) . '\"></i>' : '';\n\n                            echo '<li><a href=\"#tab=' . esc_attr($sub_id) . '\" data-tab-id=\"' . esc_attr($sub_id) . '\">' . $sub_icon . $sub['title'] . $sub_error . '</a></li>';\n\n                        }\n\n                        echo '</ul>';\n\n                        echo '</li>';\n\n                    } else {\n\n                        echo '<li class=\"csf-tab-item\"><a href=\"#tab=' . esc_attr($tab_id) . '\" data-tab-id=\"' . esc_attr($tab_id) . '\">' . $tab_icon . $tab['title'] . $tab_error . '</a></li>';\n\n                    }\n\n                }\n\n                echo '</ul>';\n\n                echo '</div>';\n\n            }\n\n            echo '<div class=\"csf-content\">';\n\n            echo '<div class=\"csf-sections\">';\n\n            foreach ($this->pre_sections as $section) {\n\n                $section_onload = (!$has_nav) ? ' csf-onload' : '';\n                $section_class = (!empty($section['class'])) ? ' ' . $section['class'] : '';\n                $section_icon = (!empty($section['icon'])) ? '<i class=\"csf-section-icon ' . esc_attr($section['icon']) . '\"></i>' : '';\n                $section_title = (!empty($section['title'])) ? $section['title'] : '';\n                $section_parent = (!empty($section['ptitle'])) ? sanitize_title($section['ptitle']) . '/' : '';\n                $section_slug = (!empty($section['title'])) ? sanitize_title($section_title) : '';\n\n                echo '<div class=\"csf-section hidden' . esc_attr($section_onload . $section_class) . '\" data-section-id=\"' . esc_attr($section_parent . $section_slug) . '\">';\n\n                echo ($has_nav) ? '<div class=\"csf-section-title\"><h3>' . $section_icon . $section_title . '</h3></div>' : '';\n                echo (!empty($section['description'])) ? '<div class=\"csf-field csf-section-description\">' . $section['description'] . '</div>' : '';\n\n\n                if (!empty($section['fields'])) {\n\n                    foreach ($section['fields'] as $field) {\n\n                        $is_field_error = $this->error_check($field);\n\n                        if (!empty($is_field_error)) {\n                            $field['_error'] = $is_field_error;\n                        }\n\n                        if (!empty($field['id'])) {\n                            $field['default'] = $this->get_default($field);\n                        }\n\n                        $value = (!empty($field['id']) && isset($this->options[$field['id']])) ? $this->options[$field['id']] : '';\n\n                        CSF::field($field, $value, $this->unique, 'options');\n\n                    }\n\n                } else {\n\n                    echo '<div class=\"csf-no-option\">' . esc_html__('No data available.', 'csf') . '</div>';\n\n                }\n\n                echo '</div>';\n\n            }\n\n            echo '</div>';\n\n            echo '<div class=\"clear\"></div>';\n\n            echo '</div>';\n\n            echo ($has_nav && $nav_type === 'normal') ? '<div class=\"csf-nav-background\"></div>' : '';\n\n            echo '</div>';\n\n            if (!empty($this->args['show_footer'])) {\n\n                echo '<div class=\"csf-footer\">';\n\n                echo '<div class=\"csf-buttons\">';\n                echo '<input type=\"submit\" name=\"csf_transient[save]\" class=\"button button-primary csf-save' . esc_attr($ajax_class) . '\" value=\"' . esc_html__('Save', 'csf') . '\" data-save=\"' . esc_html__('Saving...', 'csf') . '\">';\n                echo ($this->args['show_reset_section']) ? '<input type=\"submit\" name=\"csf_transient[reset_section]\" class=\"button button-secondary csf-reset-section csf-confirm\" value=\"' . esc_html__('Reset Section', 'csf') . '\" data-confirm=\"' . esc_html__('Are you sure to reset this section options?', 'csf') . '\">' : '';\n                echo ($this->args['show_reset_all']) ? '<input type=\"submit\" name=\"csf_transient[reset]\" class=\"button csf-warning-primary csf-reset-all csf-confirm\" value=\"' . (($this->args['show_reset_section']) ? esc_html__('Reset All', 'csf') : esc_html__('Reset', 'csf')) . '\" data-confirm=\"' . esc_html__('Are you sure you want to reset all settings to default values?', 'csf') . '\">' : '';\n                echo '</div>';\n\n                echo (!empty($this->args['footer_text'])) ? '<div class=\"csf-copyright\">' . $this->args['footer_text'] . '</div>' : '';\n\n                echo '<div class=\"clear\"></div>';\n                echo '</div>';\n\n            }\n\n            echo '</form>';\n\n            echo '</div>';\n\n            echo '<div class=\"clear\"></div>';\n\n            echo (!empty($this->args['footer_after'])) ? $this->args['footer_after'] : '';\n\n            echo '</div>';\n\n            echo '</div></div></div>';\n\n//      do_action( 'csf_options_after' );\n\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/classes/fields.class.php",
    "content": "<?php if (!defined('ABSPATH')) {\n    die;\n} // Cannot access directly.\n/**\n *\n * Fields Class\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif (!class_exists('CSF_Fields')) {\n    abstract class CSF_Fields extends CSF_Abstract\n    {\n\n        public function __construct($field = array(), $value = '', $unique = '', $where = '', $parent = '')\n        {\n            $this->field = $field;\n            $this->value = $value;\n            $this->unique = $unique;\n            $this->where = $where;\n            $this->parent = $parent;\n        }\n\n        public function field_name($nested_name = '')\n        {\n\n            $field_id = (!empty($this->field['id'])) ? $this->field['id'] : '';\n            $unique_id = (!empty($this->unique)) ? $this->unique . '[' . $field_id . ']' : $field_id;\n\n            $field_name = (!empty($this->field['name'])) ? $this->field['name'] : $unique_id;\n            $tag_prefix = (!empty($this->field['tag_prefix'])) ? $this->field['tag_prefix'] : '';\n\n            if (!empty($tag_prefix)) {\n                $nested_name = str_replace('[', '[' . $tag_prefix, $nested_name);\n            }\n\n            return $field_name . $nested_name;\n\n        }\n\n        public function field_attributes($custom_atts = array())\n        {\n\n            $field_id = (!empty($this->field['id'])) ? $this->field['id'] : '';\n            $attributes = (!empty($this->field['attributes'])) ? $this->field['attributes'] : array();\n\n            if (!empty($field_id) && empty($attributes['data-depend-id'])) {\n                $attributes['data-depend-id'] = $field_id;\n            }\n\n            if (!empty($this->field['placeholder'])) {\n                $attributes['placeholder'] = $this->field['placeholder'];\n            }\n\n            $attributes = wp_parse_args($attributes, $custom_atts);\n\n            $atts = '';\n\n            if (!empty($attributes)) {\n                foreach ($attributes as $key => $value) {\n                    if ($value === 'only-key') {\n                        $atts .= ' ' . esc_attr($key);\n                    } else {\n                        $atts .= ' ' . esc_attr($key) . '=\"' . esc_attr($value) . '\"';\n                    }\n                }\n            }\n\n            return $atts;\n\n        }\n\n        public function field_before()\n        {\n            return (!empty($this->field['before'])) ? '<div class=\"csf-before-text\">' . $this->field['before'] . '</div>' : '';\n        }\n\n        public function field_after()\n        {\n\n            $output = (!empty($this->field['after'])) ? '<div class=\"csf-after-text\">' . $this->field['after'] . '</div>' : '';\n            $output .= (!empty($this->field['desc'])) ? '<div class=\"clear\"></div><div class=\"csf-desc-text\">' . $this->field['desc'] . '</div>' : '';\n            $output .= (!empty($this->field['help'])) ? '<div class=\"csf-help\"><span class=\"csf-help-text\">' . $this->field['help'] . '</span><i class=\"fas fa-question-circle\"></i></div>' : '';\n            $output .= (!empty($this->field['_error'])) ? '<div class=\"csf-error-text\">' . $this->field['_error'] . '</div>' : '';\n\n            return $output;\n\n        }\n\n        public static function field_data($type = '', $term = false, $query_args = array())\n        {\n\n            $options = array();\n            $array_search = false;\n\n            // sanitize type name\n            if (in_array($type, array('page', 'pages'))) {\n                $option = 'page';\n            } else if (in_array($type, array('post', 'posts'))) {\n                $option = 'post';\n            } else if (in_array($type, array('category', 'categories'))) {\n                $option = 'category';\n            } else if (in_array($type, array('tag', 'tags'))) {\n                $option = 'tag';\n            } else if (in_array($type, array('menu', 'menus'))) {\n                $option = 'nav_menu';\n            } else {\n                $option = '';\n            }\n\n            // switch type\n            switch ($type) {\n\n                case 'page':\n                case 'pages':\n                case 'post':\n                case 'posts':\n\n                    // term query required for ajax select\n                    if (!empty($term)) {\n\n                        $query = new WP_Query(wp_parse_args($query_args, array(\n                            's' => $term,\n                            'post_type' => $option,\n                            'post_status' => 'publish',\n                            'posts_per_page' => 25,\n                        )));\n\n                    } else {\n\n                        $query = new WP_Query(wp_parse_args($query_args, array(\n                            'post_type' => $option,\n                            'post_status' => 'publish',\n                            'posts_per_page' => 25,\n                        )));\n\n                    }\n\n                    if (!is_wp_error($query) && !empty($query->posts)) {\n                        foreach ($query->posts as $item) {\n                            $options[$item->cid] = $item->title;\n                        }\n                    }\n\n                    break;\n\n                case 'category':\n                case 'categories':\n                case 'tag':\n                case 'tags':\n\n                    if (!empty($term)) {\n\n                        $query = new WP_Term_Query(wp_parse_args($query_args, array(\n                            'search' => $term,\n                            'taxonomy' => $option,\n                            'hide_empty' => false,\n                            'number' => 25,\n                        )));\n\n                    } else {\n\n                        $query = new WP_Term_Query(wp_parse_args($query_args, array(\n                            'taxonomy' => $option,\n                            'hide_empty' => false,\n                        )));\n\n                    }\n                    if (!is_wp_error($query) && !empty($query->terms)) {\n                        foreach ($query->terms as $item) {\n                            $options[$item->mid] = $item->name;\n                        }\n                    }\n\n                    break;\n\n                case 'user':\n                case 'users':\n\n                    if (!empty($term)) {\n\n                        $query = new WP_User_Query(array(\n                            'search' => '*' . $term . '*',\n                            'number' => 25,\n                            'orderby' => 'uid',\n                            'order' => 'ASC',\n                            'fields' => array('screenName', 'uid')\n                        ));\n\n                    } else {\n\n                        $query = new WP_User_Query(array('fields' => array('screenName', 'uid')));\n\n                    }\n\n                    if (!is_wp_error($query) && !empty($query->get_results())) {\n                        foreach ($query->get_results() as $item) {\n                            $options[$item->uid] = $item->screenname;\n                        }\n                    }\n\n                    break;\n\n\n                case 'role':\n                case 'roles':\n\n                    global $wp_roles;\n\n                    if (!empty($wp_roles)) {\n                        if (!empty($wp_roles->roles)) {\n                            foreach ($wp_roles->roles as $role_key => $role_value) {\n                                $options[$role_key] = $role_value['name'];\n                            }\n                        }\n                    }\n\n                    $array_search = true;\n\n                    break;\n\n//                case 'post_type':\n//                case 'post_types':\n//\n//                    $post_types = get_post_types(array('show_in_nav_menus' => true), 'objects');\n//\n//                    if (!is_wp_error($post_types) && !empty($post_types)) {\n//                        foreach ($post_types as $post_type) {\n//                            $options[$post_type->name] = $post_type->labels->name;\n//                        }\n//                    }\n//\n//                    $array_search = true;\n//\n//                    break;\n\n                default:\n\n                    if (is_callable($type)) {\n                        if (!empty($term)) {\n                            $options = call_user_func($type, $query_args);\n                        } else {\n                            $options = call_user_func($type, $term, $query_args);\n                        }\n                    }\n\n                    break;\n\n            }\n\n            // Array search by \"term\"\n            if (!empty($term) && !empty($options) && !empty($array_search)) {\n                $options = preg_grep('/' . $term . '/i', $options);\n            }\n\n            // Make multidimensional array for ajax search\n            if (!empty($term) && !empty($options)) {\n                $arr = array();\n                foreach ($options as $option_key => $option_value) {\n                    $arr[] = array('value' => $option_key, 'text' => $option_value);\n                }\n                $options = $arr;\n            }\n\n            return $options;\n\n        }\n\n        public function field_wp_query_data_title($type, $values)\n        {\n\n            $options = array();\n\n            if (!empty($values) && is_array($values)) {\n\n                foreach ($values as $value) {\n\n                    $options[$value] = ucfirst($value);\n\n                    switch ($type) {\n\n                        case 'post':\n                        case 'posts':\n                        case 'page':\n                        case 'pages':\n                            $title = get_the_title($value);\n\n                            if (!is_wp_error($title) && !empty($title)) {\n                                $options[$value] = $title;\n                            }\n\n                            break;\n\n                        case 'category':\n                        case 'categories':\n                        case 'tag':\n                        case 'tags':\n                        case 'menu':\n                        case 'menus':\n\n                            $term = get_term($value);\n\n                            if (!is_wp_error($term) && !empty($term)) {\n                                $options[$value] = $term->name;\n                            }\n\n                            break;\n\n                        case 'user':\n                        case 'users':\n\n                            $user = get_user_by('id', $value);\n\n                            if (!is_wp_error($user) && !empty($user)) {\n                                $options[$value] = $user->display_name;\n                            }\n\n                            break;\n\n                        case 'sidebar':\n                        case 'sidebars':\n\n                            global $wp_registered_sidebars;\n\n                            if (!empty($wp_registered_sidebars[$value])) {\n                                $options[$value] = $wp_registered_sidebars[$value]['name'];\n                            }\n\n                            break;\n\n                        case 'role':\n                        case 'roles':\n\n                            global $wp_roles;\n\n                            if (!empty($wp_roles) && !empty($wp_roles->roles) && !empty($wp_roles->roles[$value])) {\n                                $options[$value] = $wp_roles->roles[$value]['name'];\n                            }\n\n                            break;\n\n                        case 'post_type':\n                        case 'post_types':\n\n                            $post_types = get_post_types(array('show_in_nav_menus' => true));\n\n                            if (!is_wp_error($post_types) && !empty($post_types) && !empty($post_types[$value])) {\n                                $options[$value] = ucfirst($value);\n                            }\n\n                            break;\n\n                        case 'location':\n                        case 'locations':\n\n                            $nav_menus = get_registered_nav_menus();\n\n                            if (!is_wp_error($nav_menus) && !empty($nav_menus) && !empty($nav_menus[$value])) {\n                                $options[$value] = $nav_menus[$value];\n                            }\n\n                            break;\n\n                        default:\n\n                            if (is_callable($type . '_title')) {\n                                $options[$value] = call_user_func($type . '_title', $value);\n                            }\n\n                            break;\n\n                    }\n\n                }\n\n            }\n\n            return $options;\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/classes/setup.class.php",
    "content": "<?php\n\nuse Typecho\\Common;\nuse Typecho\\Plugin;\nuse Utils\\Helper;\nuse Typecho\\I18n;\nuse Widget\\Themes\\Config;\n\nif (!defined('ABSPATH')) {\n    die;\n} // Cannot access directly.\n/**\n *\n * Setup Class\n * 入口文件\n * @since 1.0.0\n * @version 1.0.0\n *\n */\n\nif (!defined('WP_PLUGIN_URL')){\n    define('WP_PLUGIN_URL', Helper::options()->pluginUrl);\n}\nif (!class_exists('CSF_Setup')) {\n    class CSF_Setup\n    {\n\n        // Default constants\n        public static $premium = false;\n        public static $version = '1.1.0';\n        public static $dir = '';\n        public static $url = '';\n        public static $css = '';\n        public static $file = '';\n        public static $enqueue = false;\n        public static $webfonts = array();\n        public static $subsets = array();\n        public static $inited = array();\n        public static $fields = array();\n        public static $args = array(\n            'admin_options' => array(),\n            'customize_options' => array(),\n            'metabox_options' => array(),\n            'nav_menu_options' => array(),\n            'profile_options' => array(),\n            'taxonomy_options' => array(),\n            'widget_options' => array(),\n            'comment_options' => array(),\n            'shortcode_options' => array(),\n        );\n\n        public static $plugin_name = '';\n\n        // Shortcode instances\n        public static $shortcode_instances = array();\n\n        private static $instance = null;\n\n        public static $cfs_options = array();\n        private static $enqueue_media = false;\n\n        public static $render_static_style = false;\n        public static $render_static_script = false;\n\n        public static function initCFS($file = __FILE__, $premium = false)\n        {\n\n            // Set file constant\n            self::$file = $file;\n\n            // Set file constant\n            self::$premium = $premium;\n\n            // Set constants\n            self::constants();\n            // Include files\n            self::includes();\n\n            if (is_null(self::$instance)) {\n                self::$instance = new self();\n            }\n            return self::$instance;\n\n        }\n\n        public static function activateEvent()\n        {\n            $db = \\Typecho\\Db::get();\n            $adapter = $db->getAdapterName();\n            if (\"Pdo_Mysql\" === $adapter || \"Mysql\" === $adapter|| \"Mysqli\" === $adapter) {\n            $option_val_type = $db->fetchObject($db->query('SELECT DATA_TYPE as dt FROM INFORMATION_SCHEMA.COLUMNS  WHERE table_name = \\''.$db->getPrefix().'options\\' and column_name=\\'value\\''))->dt;\n            if ($option_val_type == 'text')\n            {\n                $db->query('alter table `'.$db->getPrefix().'options` modify column `value` longtext');\n            }\n            }\n        }\n\n        public static function load_statics(){\n            $requestObject = \\Typecho\\Request::getInstance();\n            $curUri = $requestObject->getRequestUri();\n\n            $isPlugin = strpos($curUri, 'options-plugin.php')!==false;\n            $isTheme = strpos($curUri, 'options-theme.php')!==false;\n            $usingBSF = true;\n            if ($isTheme){\n                if (!Config::isExists()){\n                    return false;\n                }\n            } elseif ($isPlugin){\n                $pluginName = get_plugin_theme_name();\n                /** 获取插件入口 */\n                [$pluginFileName, $className] = Plugin::portal(\n                    $pluginName,\n                    __TYPECHO_ROOT_DIR__ . '/' . __TYPECHO_PLUGIN_DIR__\n                );\n                // 引入插件文件，主要是为了在 header 获取相应配置，否则 $fields 获取不到\n                require_once $pluginFileName;\n\n//                /** 判断实例化是否成功 */\n//                if (\n//                    class_exists($className) || method_exists($className, 'activate')\n//                ) {\n//                    call_user_func([$className, 'activate']);\n//                }\n\n                //\n                if (empty(CSF::$fields[$pluginName])) {\n                    $usingBSF = false;\n                }\n            }\n            $loads_statics = ($isPlugin || $isTheme) && $usingBSF;\n\n\n            return $loads_statics;\n        }\n        public static function get_enqueue_style($header = null)\n        {\n            $loads_statics = self::load_statics();\n            $fas1 = Helper::options()->themeUrl.'/assets/vendors/fontawesome/all.min.css';\n            $fas2 = Helper::options()->themeUrl.'/assets/vendors/fontawesome/v4-shims.min.css';\n            $sem = Helper::options()->themeUrl.'/assets/vendors/fomantic-ui/semantic.min.css';\n            // 仅在插件页或者主题页添加\n            if ($loads_statics) { // if is plugin\n                if (self::$render_static_style) return $header;\n                $style = '<link rel=\"stylesheet\" href=\"'.$fas1.'\">' .\n                    '<link rel=\"stylesheet\" href=\"'.$fas2.'\">'.\n                    '<link rel=\"stylesheet\" href=\"' . self::include_plugin_url2('assets/css/style.min.css') . '?v=4\">'.\n                    '<link rel=\"stylesheet\" href=\"' . self::include_plugin_url2('assets/css/color-picker.min.css') . '\">'.\n                    '<link href=\"'.$sem.'\" rel=\"stylesheet\">' .\n                    '<link href=\"' . self::include_plugin_url2('assets/vendors/toastr.js/toastr.min.css') . '\" type=\"text/css\" rel=\"stylesheet\" />' .\n                    '<style>ul.token-input-list { list-style: none; margin: 0; padding: 0 4px; min-height: 32px;  cursor: text; z-index: 99999!important; background-color: #FFF; clear: left; border-radius: 8px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }\n\nul.token-input-list li { margin: 4px 0;border-radius: 8px; }\n\nul.token-input-list li input { padding: 0; border: 0; width: 100%; -webkit-appearance: caret; }\n\nli.token-input-token { padding: 0 6px; height: 37px; line-height: 37px; background-color: #F3F3F0; cursor: default; font-size: .92857em; text-align: right; white-space: nowrap; }\n\nli.token-input-token p { float: left; display: inline; margin: 8px 0; }\n\nli.token-input-token span { color: #BBB; font-weight: bold; cursor: pointer; }\n\nli.token-input-selected-token { background-color: #E9E9E6; }\n\nli.token-input-input-token { padding: 0 4px; }\n\ndiv.token-input-dropdown { position: absolute; background-color: #FFF; overflow: hidden; border: 1px solid #D9D9D6; border-top-width: 0; cursor: default; z-index: 999999999999!important; font-size: .92857em;border-radius: 8px; }\n\ndiv.token-input-dropdown p { margin: 0; padding: 5px 10px; color: #777; font-weight: bold; }\n\ndiv.token-input-dropdown ul { list-style: none; margin: 0; padding: 0; }\n\ndiv.token-input-dropdown ul li { padding: 4px 10px; background-color: #FFF; }\n\ndiv.token-input-dropdown ul li.token-input-dropdown-item { background-color: #FFF; }\n\ndiv.token-input-dropdown ul li em { font-style: normal; }\n\ndiv.token-input-dropdown ul li.token-input-selected-dropdown-item { background-color: #467B96; color: #FFF; }\n.typecho-page-title{\n    margin-top:30px;\n}\n.typecho-option-tabs{\nmargin-top:20px!important;\n}\n.typecho-page-title,\n.typecho-option-tabs{\nmargin-left:20px;\n}\n</style>'.\n                    self::add_admin_enqueue_scripts(false).\n                    '<script>_wpUtilSettings={ajax:{url: \"'. Common::url('/bsoptions/ajax', Helper::options()->index).'\"}};window.ajaxurl=_wpUtilSettings.ajax.url;</script>';\n                     \n                self::$render_static_style = true;\n                return $header . $style;\n            }\n            return $header;\n        }\n\n        public static function get_enqueue_script($old = null)\n        {\n            $loads_statics = self::load_statics();\n            // 仅在插件页或者主题页添加 class\n            if ($loads_statics) { // if is plugin\n                if (self::$render_static_script) return $old;\n                $script = '<script src=\"' . self::include_plugin_url2('assets/js/lodash.min.js') . '?v=2.2.4\"></script>' .\n                    '<script src=\"' . self::include_plugin_url2('assets/js/plugins.min.js') . '?v=2.2.4\"></script>' .\n                    '<script src=\"' . self::include_plugin_url2('assets/js/main.min.js') . '?v=2.2.4\"></script>' .\n                    '<script src=\"' . self::include_plugin_url2('assets/js/iris.min.js') . '?v=2.2.4\"></script>' .\n                    '<script src=\"' . self::include_plugin_url2('assets/js/jquery.tokeninput.min.js') . '\"></script>'.\n                    '<script src=\"' . self::include_plugin_url2('assets/js/color-picker.min.js') . '?v=2.2.4\"></script>' .\n                    '<script src=\"' . self::include_plugin_url2('assets/js/jquery/ui/core.min.js') . '?v=2.2.4\"></script>' .\n                    '<script src=\"' . self::include_plugin_url2('assets/js/jquery/ui/draggable.min.js') . '?v=2.2.4\"></script>' .\n                    '<script src=\"' . self::include_plugin_url2('assets/js/jquery/ui/mouse.min.js') . '?v=2.2.4\"></script>' .\n                    '<script src=\"' . self::include_plugin_url2('assets/js/jquery/ui/menu.min.js') . '?v=2.2.4\"></script>' .\n                    '<script src=\"' . self::include_plugin_url2('assets/js/toastr.min.js') . '\"></script>'.\n                    '<script src=\"' . self::include_plugin_url2('assets/js/backend.js') . '?v=2.9.8\"></script>'.\n                    '<script src=\"' . self::include_plugin_url2('assets/js/uuidv4.min.js') . '?v=2.2.4\"></script>'.\n                    '<script src=\"' . self::include_plugin_url2('assets/js/IndexNowViewScript.js') . '?v=2.2.4\"></script>'.\n                    self::add_admin_enqueue_scripts().\n\n                    '<script>handleGenerate();csf_vars={color_palette:{},i18n:{confirm:\"确定吗？\",typing_text:\"请输入 %s 个或更多字\",searching_text:\"搜索...\",no_results_text:\"没有搜到\"}}</script>';\n                echo $old . $script;\n                if (self::$enqueue_media){\n                    wp_print_media_templates();\n                }\n                self::$render_static_script = true;\n                return $old . $script;\n            }\n            return $old ;\n        }\n\n        // Initalize\n        public function __construct()\n        {\n            // reset enqueue\n            reset_enqueue_array();\n//      // Init action\n//      do_action( 'csf_init' );\n//\n//      // Setup textdomain\n            self::textdomain();\n//\n//      add_action( 'after_setup_theme', array( 'CSF', 'setup' ) );\n//      add_action( 'init', array( 'CSF', 'setup' ) );\n//      add_action( 'switch_theme', array( 'CSF', 'setup' ) );\n//      add_action( 'admin_enqueue_scripts', array( 'CSF', 'add_admin_enqueue_scripts' ) );\n//      add_action( 'wp_enqueue_scripts', array( 'CSF', 'add_typography_enqueue_styles' ), 80 );\n\n//      add_action( 'wp_enqueue_scripts', array( 'CSF', 'Widget' ), 80 );\n//      add_action( 'wp_head', array( 'CSF', 'add_custom_css' ), 80 );\n//      add_filter( 'admin_body_class', array( 'CSF', 'add_admin_body_class' ) );\n        }\n\n        // Setup frameworks\n        public static function setup($pluginName, $params_ = null)\n        {\n            self::$plugin_name = $pluginName;\n            // Welcome\n//            self::include_plugin_file('views/welcome.php');\n\n            // Setup admin option framework\n            $params = array();\n            // set default form action\n            $form_action = Helper::security()->getIndex('/bsoptions/save?plugin=' . $pluginName);\n            // 默认之类 key value 只有一个，否则会出现处理异常\n            if (class_exists('CSF_Options') && !empty(self::$args['admin_options'])) {\n                foreach (self::$args['admin_options'] as $key => $value) {\n                    if ($key != $pluginName){\n                        continue;\n                    }\n                    if (!empty(self::$args['sections'][$key]) && !isset(self::$inited[$key])) {\n                        $value['form_action'] = $form_action;\n                        $value['ajax_save'] = true;\n\n                        $params['args'] = $value;\n                        $params['sections'] = self::$args['sections'][$key];\n\n                        self::$inited[$key] = true;\n                        if (is_array($params_)){\n                            $params = array_merge($params,$params_);\n                        }\n\n                        $op_obj = CSF_Options::instance($key, $params);\n                        update_bs_key_params($key, $op_obj);\n\n                        if (!empty($value['show_in_customizer'])) {\n                            $value['output_css'] = false;\n                            $value['enqueue_webfont'] = false;\n                            self::$args['customize_options'][$key] = $value;\n                            self::$inited[$key] = null;\n                        }\n\n                    }\n                }\n            }\n\n            // todo:\n//            // Setup customize option framework\n//            $params = array();\n//            if (class_exists('CSF_Customize_Options') && !empty(self::$args['customize_options'])) {\n//                foreach (self::$args['customize_options'] as $key => $value) {\n//                    if (!empty(self::$args['sections'][$key]) && !isset(self::$inited[$key])) {\n//\n//                        $params['args'] = $value;\n//                        $params['sections'] = self::$args['sections'][$key];\n//                        self::$inited[$key] = true;\n//\n//                        CSF_Customize_Options::instance($key, $params);\n//\n//                    }\n//                }\n//            }\n//\n//            // Setup metabox option framework\n//            $params = array();\n//            if (class_exists('CSF_Metabox') && !empty(self::$args['metabox_options'])) {\n//                foreach (self::$args['metabox_options'] as $key => $value) {\n//                    if (!empty(self::$args['sections'][$key]) && !isset(self::$inited[$key])) {\n//\n//                        $params['args'] = $value;\n//                        $params['sections'] = self::$args['sections'][$key];\n//                        self::$inited[$key] = true;\n//\n//                        CSF_Metabox::instance($key, $params);\n//\n//                    }\n//                }\n//            }\n//\n//            // Setup nav menu option framework\n//            $params = array();\n//            if (class_exists('CSF_Nav_Menu_Options') && !empty(self::$args['nav_menu_options'])) {\n//                foreach (self::$args['nav_menu_options'] as $key => $value) {\n//                    if (!empty(self::$args['sections'][$key]) && !isset(self::$inited[$key])) {\n//\n//                        $params['args'] = $value;\n//                        $params['sections'] = self::$args['sections'][$key];\n//                        self::$inited[$key] = true;\n//\n//                        CSF_Nav_Menu_Options::instance($key, $params);\n//\n//                    }\n//                }\n//            }\n//\n//            // Setup profile option framework\n//            $params = array();\n//            if (class_exists('CSF_Profile_Options') && !empty(self::$args['profile_options'])) {\n//                foreach (self::$args['profile_options'] as $key => $value) {\n//                    if (!empty(self::$args['sections'][$key]) && !isset(self::$inited[$key])) {\n//\n//                        $params['args'] = $value;\n//                        $params['sections'] = self::$args['sections'][$key];\n//                        self::$inited[$key] = true;\n//\n//                        CSF_Profile_Options::instance($key, $params);\n//\n//                    }\n//                }\n//            }\n//\n//            // Setup taxonomy option framework\n//            $params = array();\n//            if (class_exists('CSF_Taxonomy_Options') && !empty(self::$args['taxonomy_options'])) {\n//                $taxonomy = (isset($_GET['taxonomy'])) ? sanitize_text_field(wp_unslash($_GET['taxonomy'])) : '';\n//                foreach (self::$args['taxonomy_options'] as $key => $value) {\n//                    if (!empty(self::$args['sections'][$key]) && !isset(self::$inited[$key])) {\n//\n//                        $params['args'] = $value;\n//                        $params['sections'] = self::$args['sections'][$key];\n//                        self::$inited[$key] = true;\n//\n//                        CSF_Taxonomy_Options::instance($key, $params);\n//\n//                    }\n//                }\n//            }\n//\n//            // Setup widget option framework\n//            if (class_exists('CSF_Widget') && class_exists('WP_Widget_Factory') && !empty(self::$args['widget_options'])) {\n//                $wp_widget_factory = new WP_Widget_Factory();\n//                global $wp_widget_factory;\n//                foreach (self::$args['widget_options'] as $key => $value) {\n//                    if (!isset(self::$inited[$key])) {\n//\n//                        self::$inited[$key] = true;\n//                        $wp_widget_factory->register(CSF_Widget::instance($key, $value));\n//\n//                    }\n//                }\n//            }\n//\n//            // Setup comment option framework\n//            $params = array();\n//            if (class_exists('CSF_Comment_Metabox') && !empty(self::$args['comment_options'])) {\n//                foreach (self::$args['comment_options'] as $key => $value) {\n//                    if (!empty(self::$args['sections'][$key]) && !isset(self::$inited[$key])) {\n//\n//                        $params['args'] = $value;\n//                        $params['sections'] = self::$args['sections'][$key];\n//                        self::$inited[$key] = true;\n//\n//                        CSF_Comment_Metabox::instance($key, $params);\n//\n//                    }\n//                }\n//            }\n//\n//            // Setup shortcode option framework\n//            $params = array();\n//            if (class_exists('CSF_Shortcoder') && !empty(self::$args['shortcode_options'])) {\n//                foreach (self::$args['shortcode_options'] as $key => $value) {\n//                    if (!empty(self::$args['sections'][$key]) && !isset(self::$inited[$key])) {\n//\n//                        $params['args'] = $value;\n//                        $params['sections'] = self::$args['sections'][$key];\n//                        self::$inited[$key] = true;\n//\n//                        CSF_Shortcoder::instance($key, $params);\n//\n//                    }\n//                }\n//\n//                // Once editor setup for gutenberg and media buttons\n//                if (class_exists('CSF_Shortcoder') && !empty(self::$shortcode_instances)) {\n//                    foreach (self::$shortcode_instances as $instance) {\n//                        if (!empty($instance['show_in_editor'])) {\n//                            CSF_Shortcoder::once_editor_setup();\n//                            break;\n//                        }\n//                    }\n//                }\n//\n//            }\n\n//            do_action('csf_loaded');\n\n        }\n\n        public static function setTypechoOptionForm($form)\n        {\n            $val = new \\Typecho\\Widget\\Helper\\Form\\Element\\Hidden('bsOptionsHide',\n                NULL,\n                \"bsOptionsHide\",\n                'bs选项框架隐藏val',\n                '');\n            $form->addInput($val);\n            $form->setAttribute('style','display:none');\n\n            return $form;\n        }\n\n        // Create options\n        public static function createOptions($id, $args = array())\n        {\n            self::$args['admin_options'][$id] = $args;\n        }\n\n        // Create customize options\n        public static function createCustomizeOptions($id, $args = array())\n        {\n            self::$args['customize_options'][$id] = $args;\n        }\n\n        // Create metabox options\n        public static function createMetabox($id, $args = array())\n        {\n            self::$args['metabox_options'][$id] = $args;\n        }\n\n        // Create menu options\n        public static function createNavMenuOptions($id, $args = array())\n        {\n            self::$args['nav_menu_options'][$id] = $args;\n        }\n\n        // Create shortcoder options\n        public static function createShortcoder($id, $args = array())\n        {\n            self::$args['shortcode_options'][$id] = $args;\n        }\n\n        // Create taxonomy options\n        public static function createTaxonomyOptions($id, $args = array())\n        {\n            self::$args['taxonomy_options'][$id] = $args;\n        }\n\n        // Create profile options\n        public static function createProfileOptions($id, $args = array())\n        {\n            self::$args['profile_options'][$id] = $args;\n        }\n\n        // Create widget\n        public static function createWidget($id, $args = array())\n        {\n            self::$args['widget_options'][$id] = $args;\n            self::set_used_fields($args);\n        }\n\n        // Create comment metabox\n        public static function createCommentMetabox($id, $args = array())\n        {\n            self::$args['comment_options'][$id] = $args;\n        }\n\n        // Create section\n        public static function createSection($id, $sections)\n        {\n            self::$args['sections'][$id][] = $sections;\n            self::set_used_fields($sections, $id);\n        }\n\n        // Set directory constants\n        public static function constants()\n        {\n\n            // We need this path-finder code for set URL of framework\n            $dirname = str_replace('//', '/', wp_normalize_path(dirname(dirname(self::$file))));\n//      \\Typecho\\Widget::widget('Widget_Archive')\n            $theme_dir = str_replace('//', '/', wp_normalize_path(Helper::options()->pluginDir));\n            $theme_dir = str_replace('usr/plugins', 'usr/themes', $theme_dir);\n\n            $plugin_dir = Helper::options()->pluginDir;\n            $plugin_dir = str_replace('\\\\', '/', $plugin_dir);\n            $plugin_dir = str_replace('/opt/bitnami', '/bitnami', $plugin_dir);\n\n            $located_plugin = (preg_match('#' . self::sanitize_dirname($plugin_dir) . '#', self::sanitize_dirname($dirname))) ? true : false;\n            $directory = ($located_plugin) ? $plugin_dir : $theme_dir;\n            $directory_uri = ($located_plugin) ? WP_PLUGIN_URL : get_parent_theme_file_uri();\n\n            $foldername = str_replace($directory, '', $dirname);\n\n//            $protocol_uri = (is_ssl()) ? 'https' : 'http';\n//      $directory_uri  = set_url_scheme( $directory_uri, $protocol_uri );\n\n            self::$dir = $dirname;\n            self::$url = $directory_uri . $foldername;\n        }\n\n        public static function located_plugin(): bool\n        {\n            $dirname = str_replace('//', '/', wp_normalize_path(dirname(self::$file, 2)));\n            $plugin_dir = Helper::options()->pluginDir;\n            $plugin_dir = str_replace('\\\\', '/', $plugin_dir);\n            $plugin_dir = str_replace('/opt/bitnami', '/bitnami', $plugin_dir);\n            return (bool)preg_match('#' . self::sanitize_dirname($plugin_dir) . '#', self::sanitize_dirname($dirname));\n        }\n\n        // Include file helper\n        public static function include_plugin_file($file, $load = true)\n        {\n\n            $path = '';\n            $file = ltrim($file, '/');\n\n            if (file_exists(self::$dir . '/' . $file)) {\n                $path = self::$dir . '/' . $file;\n            }\n\n            if (!empty($path) && !empty($file) && $load) {\n\n                global $wp_query;\n\n                if (is_object($wp_query) && function_exists('load_template')) {\n\n                    load_template($path, true);\n\n                } else {\n                    require_once($path);\n\n                }\n\n            } else {\n\n                return self::$dir . '/' . $file;\n\n            }\n\n        }\n\n        // Is active plugin helper\n        public static function is_active_plugin($file = '')\n        {\n            return in_array($file, (array)get_option('active_plugins', array()));\n        }\n\n        // Sanitize dirname\n        public static function sanitize_dirname($dirname)\n        {\n            return preg_replace('/[^A-Za-z]/', '', $dirname);\n        }\n        \n        public static function include_plugin_url2($file)\n        {\n          \n            return Helper::options()->siteUrl.'usr/plugins/BsCore/'.$file;\n        }\n        \n        \n        // Set url constant\n        public static function include_plugin_url($file)\n        {\n\n            return esc_url(self::$url) . '/' . ltrim($file, '/');\n        }\n\n        // Include files\n        public static function includes()\n        {\n            // include router\n            self::include_plugin_file('classes/bsRouter.class.php');\n\n            // Include common functions\n            self::include_plugin_file('functions/actions.php');\n            self::include_plugin_file('functions/helpers.php');\n            self::include_plugin_file('functions/sanitize.php');\n            self::include_plugin_file('functions/validate.php');\n\n            // Include free version classes\n            self::include_plugin_file('classes/abstract.class.php');\n            self::include_plugin_file('classes/fields.class.php');\n            self::include_plugin_file('classes/admin-options.class.php');\n\n            // Include premium version classes\n            if (self::$premium) {\n                self::include_plugin_file('classes/customize-options.class.php');\n                self::include_plugin_file('classes/metabox-options.class.php');\n                self::include_plugin_file('classes/nav-menu-options.class.php');\n                self::include_plugin_file('classes/profile-options.class.php');\n                self::include_plugin_file('classes/shortcode-options.class.php');\n                self::include_plugin_file('classes/taxonomy-options.class.php');\n                self::include_plugin_file('classes/widget-options.class.php');\n                self::include_plugin_file('classes/comment-options.class.php');\n            }\n\n            // Include all framework fields\n            $fields = apply_filters('csf_fields', array(\n                'accordion',\n                'background',\n                'backup',\n                'border',\n                'button_set',\n                'callback',\n                'checkbox',\n                'code_editor',\n                'color',\n                'color_group',\n                'content',\n                'date',\n                'datetime',\n                'dimensions',\n                'fieldset',\n                'gallery',\n                'group',\n                'heading',\n                'icon',\n                'image_select',\n                'link',\n                'link_color',\n                'map',\n                'media',\n                'notice',\n                'number',\n                'palette',\n                'radio',\n                'repeater',\n                'select',\n                'slider',\n                'sortable',\n                'sorter',\n                'spacing',\n                'spinner',\n                'subheading',\n                'submessage',\n                'switcher',\n                'tabbed',\n                'text',\n                'textarea',\n                'typography',\n                'upload',\n                'wp_editor',\n            ));\n\n            if (!empty($fields)) {\n                foreach ($fields as $field) {\n                    if (!class_exists('CSF_Field_' . $field) && class_exists('CSF_Fields')) {\n                        self::include_plugin_file('fields/' . $field . '/' . $field . '.php');\n                    }\n                }\n            }\n\n        }\n\n        // Setup textdomain\n        public static function textdomain()\n        {\n        }\n\n        // Set all of used fields\n        public static function set_used_fields($sections, $id)\n        {\n\n            if (!empty($sections['fields'])) {\n\n                foreach ($sections['fields'] as $field) {\n\n                    if (!empty($field['fields'])) {\n                        self::set_used_fields($field, $id);\n                    }\n\n                    if (!empty($field['tabs'])) {\n                        self::set_used_fields(array('fields' => $field['tabs']), $id);\n                    }\n\n                    if (!empty($field['accordions'])) {\n                        self::set_used_fields(array('fields' => $field['accordions']), $id);\n                    }\n\n                    if (!empty($field['type'])) {\n                        self::$fields[$id][$field['type']] = $field;\n                    }\n\n                }\n\n            }\n\n        }\n\n        // Enqueue admin and fields styles and scripts\n\n        /**\n         * @throws \\IXR\\Exception\n         */\n        public static function add_admin_enqueue_scripts($enq_js = true)\n        {\n\n//            if (!self::$enqueue) {\n//\n//                // Loads scripts and styles only when needed\n//                $wpscreen = get_current_screen();\n//\n//                if (!empty(self::$args['admin_options'])) {\n//                    foreach (self::$args['admin_options'] as $argument) {\n//                        if (substr($wpscreen->id, -strlen($argument['menu_slug'])) === $argument['menu_slug']) {\n//                            self::$enqueue = true;\n//                        }\n//                    }\n//                }\n//\n//                if (!empty(self::$args['metabox_options'])) {\n//                    foreach (self::$args['metabox_options'] as $argument) {\n//                        if (in_array($wpscreen->post_type, (array)$argument['post_type'])) {\n//                            self::$enqueue = true;\n//                        }\n//                    }\n//                }\n//\n//                if (!empty(self::$args['taxonomy_options'])) {\n//                    foreach (self::$args['taxonomy_options'] as $argument) {\n//                        if (in_array($wpscreen->taxonomy, (array)$argument['taxonomy'])) {\n//                            self::$enqueue = true;\n//                        }\n//                    }\n//                }\n//\n//                if (!empty(self::$shortcode_instances)) {\n//                    foreach (self::$shortcode_instances as $argument) {\n//                        if (($argument['show_in_editor'] && $wpscreen->base === 'post') || $argument['show_in_custom']) {\n//                            self::$enqueue = true;\n//                        }\n//                    }\n//                }\n//\n//                if (!empty(self::$args['widget_options']) && ($wpscreen->id === 'widgets' || $wpscreen->id === 'customize')) {\n//                    self::$enqueue = true;\n//                }\n//\n//                if (!empty(self::$args['customize_options']) && $wpscreen->id === 'customize') {\n//                    self::$enqueue = true;\n//                }\n//\n//                if (!empty(self::$args['nav_menu_options']) && $wpscreen->id === 'nav-menus') {\n//                    self::$enqueue = true;\n//                }\n//\n//                if (!empty(self::$args['profile_options']) && ($wpscreen->id === 'profile' || $wpscreen->id === 'user-edit')) {\n//                    self::$enqueue = true;\n//                }\n//\n//                if (!empty(self::$args['comment_options']) && $wpscreen->id === 'comment') {\n//                    self::$enqueue = true;\n//                }\n//\n//                if ($wpscreen->id === 'tools_page_csf-welcome') {\n//                    self::$enqueue = true;\n//                }\n//\n//            }\n\n//            if (!apply_filters('csf_enqueue_assets', self::$enqueue)) {\n//                return;\n//            }\n\n            // todo:Admin utilities\n//            wp_enqueue_media();\n\n\n            // Enqueue fields scripts and styles\n\n            $enqueued = array();\n            $style_or_script = '';\n            // get plugin or theme first 根据主题或者插件的名字配置\n            $ptid = get_plugin_theme_name();\n            if ($ptid == null){\n                return $style_or_script;\n            }\n\n            if (!empty(self::$fields[$ptid])) {\n                foreach (self::$fields[$ptid] as $field) {\n                    if (!empty($field['type'])) {\n                        $type = $field['type'];\n                        if (in_array($type,['media','upload'])){\n                            self::$enqueue_media = true;\n                        }else {\n                            $classname = 'CSF_Field_' . $type;\n                            if (class_exists($classname) && method_exists($classname, 'enqueue')) {\n                                $instance = new $classname($field);\n                                if (method_exists($classname, 'enqueue')) {\n                                    $style_or_script = $style_or_script.$instance->enqueue($enq_js);\n                                }\n                                unset($instance);\n                            }\n                        }\n\n                    }\n                }\n            }\n\n\n\n            return $style_or_script;\n//\n//            do_action('csf_enqueue');\n\n        }\n\n\n        // Add custom css to front page\n        public static function add_custom_css()\n        {\n\n            if (!empty(self::$css)) {\n                echo '<style type=\"text/css\">' . wp_strip_all_tags(self::$css) . '</style>';\n            }\n\n        }\n\n        // Add a new framework field\n        public static function field($field = array(), $value = '', $unique = '', $where = '', $parent = '')\n        {\n\n            // Check for unallow fields\n            if (!empty($field['_notice'])) {\n\n                $field_type = $field['type'];\n\n                $field = array();\n                $field['content'] = esc_html__('Oops! Not allowed.', 'csf') . ' <strong>(' . $field_type . ')</strong>';\n                $field['type'] = 'notice';\n                $field['style'] = 'danger';\n\n            }\n\n            $depend = '';\n            $visible = '';\n            $unique = (!empty($unique)) ? $unique : '';\n\n            $class = (!empty($field['class'])) ? ' ' . esc_attr($field['class']) : '';\n            $is_pseudo = (!empty($field['pseudo'])) ? ' csf-pseudo-field' : '';\n            $field_type = (!empty($field['type'])) ? esc_attr($field['type']) : '';\n\n            if (!empty($field['dependency'])) {\n\n                $dependency = $field['dependency'];\n                $depend_visible = '';\n                $data_controller = '';\n                $data_condition = '';\n                $data_value = '';\n                $data_global = '';\n\n                if (is_array($dependency[0])) {\n                    $data_controller = implode('|', array_column($dependency, 0));\n                    $data_condition = implode('|', array_column($dependency, 1));\n                    $data_value = implode('|', array_column($dependency, 2));\n                    $data_global = implode('|', array_column($dependency, 3));\n                    $depend_visible = implode('|', array_column($dependency, 4));\n                } else {\n                    $data_controller = (!empty($dependency[0])) ? $dependency[0] : '';\n                    $data_condition = (!empty($dependency[1])) ? $dependency[1] : '';\n                    $data_value = (!empty($dependency[2])) ? $dependency[2] : '';\n                    $data_global = (!empty($dependency[3])) ? $dependency[3] : '';\n                    $depend_visible = (!empty($dependency[4])) ? $dependency[4] : '';\n                }\n\n                $depend .= ' data-controller=\"' . esc_attr($data_controller) . '\"';\n                $depend .= ' data-condition=\"' . esc_attr($data_condition) . '\"';\n                $depend .= ' data-value=\"' . esc_attr($data_value) . '\"';\n                $depend .= (!empty($data_global)) ? ' data-depend-global=\"true\"' : '';\n\n                $visible = (!empty($depend_visible)) ? ' csf-depend-visible' : ' csf-depend-hidden';\n\n            }\n\n            // These attributes has been sanitized above.\n            echo '<div class=\"csf-field csf-field-' . $field_type . $is_pseudo . $class . $visible . '\"' . $depend . '>';\n            if (!empty($field_type)) {\n\n                if (!empty($field['title'])) {\n                    echo '<div class=\"csf-title\">';\n                    echo '<h4>' . $field['title'] . '</h4>';\n                    echo (!empty($field['subtitle'])) ? '<div class=\"csf-subtitle-text\">' . $field['subtitle'] . '</div>' : '';\n                    echo '</div>';\n                }\n\n                echo (!empty($field['title'])) ? '<div class=\"csf-fieldset\">' : '';\n                if ($value == \"\") $value = null;\n                if (is_array($value)){\n//                    $notset = false;\n                    foreach ($value as $key => $val){\n\n                        if (empty($val)){\n//                            $notset = true;\n                        }\n                    }\n//                    if ($notset){\n//                        $value = null;\n//                    }\n                }\n                $value = (!isset($value) && isset($field['default'])) ? $field['default'] : $value;\n\n                $value = (isset($field['value'])) ? $field['value'] : $value;\n\n                $classname = 'CSF_Field_' . $field_type;\n\n                if (class_exists($classname)) {\n                    $instance = new $classname($field, $value, $unique, $where, $parent);\n                    $instance->render();\n                } else {\n                    echo '<p>' . esc_html__('Field not found!', 'csf') . '</p>';\n                }\n\n            } else {\n                echo '<p>' . esc_html__('Field not found!', 'csf') . '</p>';\n            }\n\n            echo (!empty($field['title'])) ? '</div>' : '';\n            echo '<div class=\"clear\"></div>';\n            echo '</div>';\n\n        }\n\n    }\n\n}\n\nCSF_Setup::initCFS(__FILE__, false);\n\n"
  },
  {
    "path": "配套插件/BsCore/fields/accordion/accordion.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: accordion\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_accordion' ) ) {\n  class CSF_Field_accordion extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $unallows = array( 'accordion' );\n\n      echo $this->field_before();\n\n      echo '<div class=\"csf-accordion-items\" data-depend-id=\"'. esc_attr( $this->field['id'] ) .'\">';\n\n      foreach ( $this->field['accordions'] as $key => $accordion ) {\n\n        echo '<div class=\"csf-accordion-item\">';\n\n          $icon = ( ! empty( $accordion['icon'] ) ) ? 'csf--icon '. $accordion['icon'] : 'csf-accordion-icon fas fa-angle-right';\n\n          echo '<h4 class=\"csf-accordion-title\">';\n          echo '<i class=\"'. esc_attr( $icon ) .'\"></i>';\n          echo esc_html( $accordion['title'] );\n          echo '</h4>';\n\n          echo '<div class=\"csf-accordion-content\">';\n\n          foreach ( $accordion['fields'] as $field ) {\n\n            if ( in_array( $field['type'], $unallows ) ) { $field['_notice'] = true; }\n\n            $field_id      = ( isset( $field['id'] ) ) ? $field['id'] : '';\n            $field_default = ( isset( $field['default'] ) ) ? $field['default'] : '';\n            $field_value   = ( isset( $this->value[$field_id] ) ) ? $this->value[$field_id] : $field_default;\n            $unique_id     = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']' : $this->field['id'];\n\n            CSF::field( $field, $field_value, $unique_id, 'field/accordion' );\n\n          }\n\n          echo '</div>';\n\n        echo '</div>';\n\n      }\n\n      echo '</div>';\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/background/background.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: background\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_background' ) ) {\n  class CSF_Field_background extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args                             = wp_parse_args( $this->field, array(\n        'background_color'              => true,\n        'background_image'              => true,\n        'background_position'           => true,\n        'background_repeat'             => true,\n        'background_attachment'         => true,\n        'background_size'               => true,\n        'background_origin'             => false,\n        'background_clip'               => false,\n        'background_blend_mode'         => false,\n        'background_gradient'           => false,\n        'background_gradient_color'     => true,\n        'background_gradient_direction' => true,\n        'background_image_preview'      => true,\n        'background_auto_attributes'    => false,\n        'compact'                       => false,\n        'background_image_library'      => 'image',\n        'background_image_placeholder'  => esc_html__( 'Not selected', 'csf' ),\n      ) );\n\n      if ( $args['compact'] ) {\n        $args['background_color']           = false;\n        $args['background_auto_attributes'] = true;\n      }\n\n      $default_value                    = array(\n        'background-color'              => '',\n        'background-image'              => '',\n        'background-position'           => '',\n        'background-repeat'             => '',\n        'background-attachment'         => '',\n        'background-size'               => '',\n        'background-origin'             => '',\n        'background-clip'               => '',\n        'background-blend-mode'         => '',\n        'background-gradient-color'     => '',\n        'background-gradient-direction' => '',\n      );\n\n      $default_value = ( ! empty( $this->field['default'] ) ) ? wp_parse_args( $this->field['default'], $default_value ) : $default_value;\n\n      $this->value = wp_parse_args( $this->value, $default_value );\n\n      echo $this->field_before();\n\n      echo '<div class=\"csf--background-colors\">';\n\n      //\n      // Background Color\n      if ( ! empty( $args['background_color'] ) ) {\n\n        echo '<div class=\"csf--color\">';\n\n        echo ( ! empty( $args['background_gradient'] ) ) ? '<div class=\"csf--title\">'. esc_html__( 'From', 'csf' ) .'</div>' : '';\n\n        CSF::field( array(\n          'id'      => 'background-color',\n          'type'    => 'color',\n          'default' => $default_value['background-color'],\n        ), $this->value['background-color'], $this->field_name(), 'field/background' );\n\n        echo '</div>';\n\n      }\n\n      //\n      // Background Gradient Color\n      if ( ! empty( $args['background_gradient_color'] ) && ! empty( $args['background_gradient'] ) ) {\n\n        echo '<div class=\"csf--color\">';\n\n        echo ( ! empty( $args['background_gradient'] ) ) ? '<div class=\"csf--title\">'. esc_html__( 'To', 'csf' ) .'</div>' : '';\n\n        CSF::field( array(\n          'id'      => 'background-gradient-color',\n          'type'    => 'color',\n          'default' => $default_value['background-gradient-color'],\n        ), $this->value['background-gradient-color'], $this->field_name(), 'field/background' );\n\n        echo '</div>';\n\n      }\n\n      //\n      // Background Gradient Direction\n      if ( ! empty( $args['background_gradient_direction'] ) && ! empty( $args['background_gradient'] ) ) {\n\n        echo '<div class=\"csf--color\">';\n\n        echo ( ! empty( $args['background_gradient'] ) ) ? '<div class=\"csf---title\">'. esc_html__( 'Direction', 'csf' ) .'</div>' : '';\n\n        CSF::field( array(\n          'id'          => 'background-gradient-direction',\n          'type'        => 'select',\n          'options'     => array(\n            ''          => esc_html__( 'Gradient Direction', 'csf' ),\n            'to bottom' => esc_html__( '&#8659; top to bottom', 'csf' ),\n            'to right'  => esc_html__( '&#8658; left to right', 'csf' ),\n            '135deg'    => esc_html__( '&#8664; corner top to right', 'csf' ),\n            '-135deg'   => esc_html__( '&#8665; corner top to left', 'csf' ),\n          ),\n        ), $this->value['background-gradient-direction'], $this->field_name(), 'field/background' );\n\n        echo '</div>';\n\n      }\n\n      echo '</div>';\n\n      //\n      // Background Image\n      if ( ! empty( $args['background_image'] ) ) {\n\n        echo '<div class=\"csf--background-image\">';\n\n        CSF::field( array(\n          'id'          => 'background-image',\n          'type'        => 'media',\n          'class'       => 'csf-assign-field-background',\n          'library'     => $args['background_image_library'],\n          'preview'     => $args['background_image_preview'],\n          'placeholder' => $args['background_image_placeholder'],\n          'attributes'  => array( 'data-depend-id' => $this->field['id'] ),\n        ), $this->value['background-image'], $this->field_name(), 'field/background' );\n\n        echo '</div>';\n\n      }\n\n      $auto_class   = ( ! empty( $args['background_auto_attributes'] ) ) ? ' csf--auto-attributes' : '';\n      $hidden_class = ( ! empty( $args['background_auto_attributes'] ) && empty( $this->value['background-image']['url'] ) ) ? ' csf--attributes-hidden' : '';\n\n      echo '<div class=\"csf--background-attributes'. esc_attr( $auto_class . $hidden_class ) .'\">';\n\n      //\n      // Background Position\n      if ( ! empty( $args['background_position'] ) ) {\n\n        CSF::field( array(\n          'id'              => 'background-position',\n          'type'            => 'select',\n          'options'         => array(\n            ''              => esc_html__( 'Background Position', 'csf' ),\n            'left top'      => esc_html__( 'Left Top', 'csf' ),\n            'left center'   => esc_html__( 'Left Center', 'csf' ),\n            'left bottom'   => esc_html__( 'Left Bottom', 'csf' ),\n            'center top'    => esc_html__( 'Center Top', 'csf' ),\n            'center center' => esc_html__( 'Center Center', 'csf' ),\n            'center bottom' => esc_html__( 'Center Bottom', 'csf' ),\n            'right top'     => esc_html__( 'Right Top', 'csf' ),\n            'right center'  => esc_html__( 'Right Center', 'csf' ),\n            'right bottom'  => esc_html__( 'Right Bottom', 'csf' ),\n          ),\n        ), $this->value['background-position'], $this->field_name(), 'field/background' );\n\n      }\n\n      //\n      // Background Repeat\n      if ( ! empty( $args['background_repeat'] ) ) {\n\n        CSF::field( array(\n          'id'          => 'background-repeat',\n          'type'        => 'select',\n          'options'     => array(\n            ''          => esc_html__( 'Background Repeat', 'csf' ),\n            'repeat'    => esc_html__( 'Repeat', 'csf' ),\n            'no-repeat' => esc_html__( 'No Repeat', 'csf' ),\n            'repeat-x'  => esc_html__( 'Repeat Horizontally', 'csf' ),\n            'repeat-y'  => esc_html__( 'Repeat Vertically', 'csf' ),\n          ),\n        ), $this->value['background-repeat'], $this->field_name(), 'field/background' );\n\n      }\n\n      //\n      // Background Attachment\n      if ( ! empty( $args['background_attachment'] ) ) {\n\n        CSF::field( array(\n          'id'       => 'background-attachment',\n          'type'     => 'select',\n          'options'  => array(\n            ''       => esc_html__( 'Background Attachment', 'csf' ),\n            'scroll' => esc_html__( 'Scroll', 'csf' ),\n            'fixed'  => esc_html__( 'Fixed', 'csf' ),\n          ),\n        ), $this->value['background-attachment'], $this->field_name(), 'field/background' );\n\n      }\n\n      //\n      // Background Size\n      if ( ! empty( $args['background_size'] ) ) {\n\n        CSF::field( array(\n          'id'        => 'background-size',\n          'type'      => 'select',\n          'options'   => array(\n            ''        => esc_html__( 'Background Size', 'csf' ),\n            'cover'   => esc_html__( 'Cover', 'csf' ),\n            'contain' => esc_html__( 'Contain', 'csf' ),\n            'auto'    => esc_html__( 'Auto', 'csf' ),\n          ),\n        ), $this->value['background-size'], $this->field_name(), 'field/background' );\n\n      }\n\n      //\n      // Background Origin\n      if ( ! empty( $args['background_origin'] ) ) {\n\n        CSF::field( array(\n          'id'            => 'background-origin',\n          'type'          => 'select',\n          'options'       => array(\n            ''            => esc_html__( 'Background Origin', 'csf' ),\n            'padding-box' => esc_html__( 'Padding Box', 'csf' ),\n            'border-box'  => esc_html__( 'Border Box', 'csf' ),\n            'content-box' => esc_html__( 'Content Box', 'csf' ),\n          ),\n        ), $this->value['background-origin'], $this->field_name(), 'field/background' );\n\n      }\n\n      //\n      // Background Clip\n      if ( ! empty( $args['background_clip'] ) ) {\n\n        CSF::field( array(\n          'id'            => 'background-clip',\n          'type'          => 'select',\n          'options'       => array(\n            ''            => esc_html__( 'Background Clip', 'csf' ),\n            'border-box'  => esc_html__( 'Border Box', 'csf' ),\n            'padding-box' => esc_html__( 'Padding Box', 'csf' ),\n            'content-box' => esc_html__( 'Content Box', 'csf' ),\n          ),\n        ), $this->value['background-clip'], $this->field_name(), 'field/background' );\n\n      }\n\n      //\n      // Background Blend Mode\n      if ( ! empty( $args['background_blend_mode'] ) ) {\n\n        CSF::field( array(\n          'id'            => 'background-blend-mode',\n          'type'          => 'select',\n          'options'       => array(\n            ''            => esc_html__( 'Background Blend Mode', 'csf' ),\n            'normal'      => esc_html__( 'Normal', 'csf' ),\n            'multiply'    => esc_html__( 'Multiply', 'csf' ),\n            'screen'      => esc_html__( 'Screen', 'csf' ),\n            'overlay'     => esc_html__( 'Overlay', 'csf' ),\n            'darken'      => esc_html__( 'Darken', 'csf' ),\n            'lighten'     => esc_html__( 'Lighten', 'csf' ),\n            'color-dodge' => esc_html__( 'Color Dodge', 'csf' ),\n            'saturation'  => esc_html__( 'Saturation', 'csf' ),\n            'color'       => esc_html__( 'Color', 'csf' ),\n            'luminosity'  => esc_html__( 'Luminosity', 'csf' ),\n          ),\n        ), $this->value['background-blend-mode'], $this->field_name(), 'field/background' );\n\n      }\n\n      echo '</div>';\n\n      echo $this->field_after();\n\n    }\n\n    public function output() {\n\n      $output    = '';\n      $bg_image  = array();\n      $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : '';\n      $element   = ( is_array( $this->field['output'] ) ) ? join( ',', $this->field['output'] ) : $this->field['output'];\n\n      // Background image and gradient\n      $background_color        = ( ! empty( $this->value['background-color']              ) ) ? $this->value['background-color']              : '';\n      $background_gd_color     = ( ! empty( $this->value['background-gradient-color']     ) ) ? $this->value['background-gradient-color']     : '';\n      $background_gd_direction = ( ! empty( $this->value['background-gradient-direction'] ) ) ? $this->value['background-gradient-direction'] : '';\n      $background_image        = ( ! empty( $this->value['background-image']['url']       ) ) ? $this->value['background-image']['url']       : '';\n\n\n      if ( $background_color && $background_gd_color ) {\n        $gd_direction   = ( $background_gd_direction ) ? $background_gd_direction .',' : '';\n        $bg_image[] = 'linear-gradient('. $gd_direction . $background_color .','. $background_gd_color .')';\n        unset( $this->value['background-color'] );\n      }\n\n      if ( $background_image ) {\n        $bg_image[] = 'url('. $background_image .')';\n      }\n\n      if ( ! empty( $bg_image ) ) {\n        $output .= 'background-image:'. implode( ',', $bg_image ) . $important .';';\n      }\n\n      // Common background properties\n      $properties = array( 'color', 'position', 'repeat', 'attachment', 'size', 'origin', 'clip', 'blend-mode' );\n\n      foreach ( $properties as $property ) {\n        $property = 'background-'. $property;\n        if ( ! empty( $this->value[$property] ) ) {\n          $output .= $property .':'. $this->value[$property] . $important .';';\n        }\n      }\n\n      if ( $output ) {\n        $output = $element .'{'. $output .'}';\n      }\n\n      $this->parent->output_css .= $output;\n\n      return $output;\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/backup/backup.php",
    "content": "<?php use Typecho\\Common;\n\nif ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: backup\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_backup' ) ) {\n  class CSF_Field_backup extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $unique = $this->unique;\n      $nonce  = wp_create_nonce( 'csf_backup_nonce' );\n      $export = add_query_arg( array( 'action' => 'csf-export', 'unique' => $unique, 'nonce' => $nonce ), Common::url('/bsoptions/ajax', Helper::options()->index) );\n\n      echo $this->field_before();\n\n      echo '<textarea name=\"csf_import_data\" class=\"csf-import-data\"></textarea>';\n      echo '<div class=\"button button-primary csf-import\" data-unique=\"'. esc_attr( $unique ) .'\" data-nonce=\"'. esc_attr( $nonce ) .'\">'. esc_html__( 'Import', 'csf' ) .'</div>';\n      echo '<hr />';\n      echo '<textarea readonly=\"readonly\" class=\"csf-export-data\">'. esc_attr( json_encode( get_option( $unique ) ) ) .'</textarea>';\n      echo '<a href=\"'. esc_url( $export ) .'\" class=\"button button-primary csf-export\" target=\"_blank\">'. esc_html__( 'Export & Download', 'csf' ) .'</a>';\n      echo '<hr />';\n      echo '<div type=\"submit\" name=\"csf_transient[reset]\" value=\"reset\" class=\"button csf-warning-primary csf-reset\" data-unique=\"'. esc_attr( $unique ) .'\" data-nonce=\"'. esc_attr( $nonce ) .'\">'. esc_html__( 'Reset', 'csf' ) .'</div>';\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/border/border.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: border\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_border' ) ) {\n  class CSF_Field_border extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'top_icon'           => '<i class=\"fas fa-long-arrow-alt-up\"></i>',\n        'left_icon'          => '<i class=\"fas fa-long-arrow-alt-left\"></i>',\n        'bottom_icon'        => '<i class=\"fas fa-long-arrow-alt-down\"></i>',\n        'right_icon'         => '<i class=\"fas fa-long-arrow-alt-right\"></i>',\n        'all_icon'           => '<i class=\"fas fa-arrows-alt\"></i>',\n        'top_placeholder'    => esc_html__( 'top', 'csf' ),\n        'right_placeholder'  => esc_html__( 'right', 'csf' ),\n        'bottom_placeholder' => esc_html__( 'bottom', 'csf' ),\n        'left_placeholder'   => esc_html__( 'left', 'csf' ),\n        'all_placeholder'    => esc_html__( 'all', 'csf' ),\n        'top'                => true,\n        'left'               => true,\n        'bottom'             => true,\n        'right'              => true,\n        'all'                => false,\n        'color'              => true,\n        'style'              => true,\n        'unit'               => 'px',\n      ) );\n\n      $default_value = array(\n        'top'        => '',\n        'right'      => '',\n        'bottom'     => '',\n        'left'       => '',\n        'color'      => '',\n        'style'      => 'solid',\n        'all'        => '',\n      );\n\n      $border_props = array(\n        'solid'     => esc_html__( 'Solid', 'csf' ),\n        'dashed'    => esc_html__( 'Dashed', 'csf' ),\n        'dotted'    => esc_html__( 'Dotted', 'csf' ),\n        'double'    => esc_html__( 'Double', 'csf' ),\n        'inset'     => esc_html__( 'Inset', 'csf' ),\n        'outset'    => esc_html__( 'Outset', 'csf' ),\n        'groove'    => esc_html__( 'Groove', 'csf' ),\n        'ridge'     => esc_html__( 'ridge', 'csf' ),\n        'none'      => esc_html__( 'None', 'csf' )\n      );\n\n      $default_value = ( ! empty( $this->field['default'] ) ) ? wp_parse_args( $this->field['default'], $default_value ) : $default_value;\n\n      $value = wp_parse_args( $this->value, $default_value );\n\n      echo $this->field_before();\n\n      echo '<div class=\"csf--inputs\" data-depend-id=\"'. esc_attr( $this->field['id'] ) .'\">';\n\n      if ( ! empty( $args['all'] ) ) {\n\n        $placeholder = ( ! empty( $args['all_placeholder'] ) ) ? ' placeholder=\"'. esc_attr( $args['all_placeholder'] ) .'\"' : '';\n\n        echo '<div class=\"csf--input\">';\n        echo ( ! empty( $args['all_icon'] ) ) ? '<span class=\"csf--label csf--icon\">'. $args['all_icon'] .'</span>' : '';\n        echo '<input type=\"number\" name=\"'. esc_attr( $this->field_name( '[all]' ) ) .'\" value=\"'. esc_attr( $value['all'] ) .'\"'. $placeholder .' class=\"csf-input-number csf--is-unit\" step=\"any\" />';\n        echo ( ! empty( $args['unit'] ) ) ? '<span class=\"csf--label csf--unit\">'. esc_attr( $args['unit'] ) .'</span>' : '';\n        echo '</div>';\n\n      } else {\n\n        $properties = array();\n\n        foreach ( array( 'top', 'right', 'bottom', 'left' ) as $prop ) {\n          if ( ! empty( $args[$prop] ) ) {\n            $properties[] = $prop;\n          }\n        }\n\n        $properties = ( $properties === array( 'right', 'left' ) ) ? array_reverse( $properties ) : $properties;\n\n        foreach ( $properties as $property ) {\n\n          $placeholder = ( ! empty( $args[$property.'_placeholder'] ) ) ? ' placeholder=\"'. esc_attr( $args[$property.'_placeholder'] ) .'\"' : '';\n\n          echo '<div class=\"csf--input\">';\n          echo ( ! empty( $args[$property.'_icon'] ) ) ? '<span class=\"csf--label csf--icon\">'. $args[$property.'_icon'] .'</span>' : '';\n          echo '<input type=\"number\" name=\"'. esc_attr( $this->field_name( '['. $property .']' ) ) .'\" value=\"'. esc_attr( $value[$property] ) .'\"'. $placeholder .' class=\"csf-input-number csf--is-unit\" step=\"any\" />';\n          echo ( ! empty( $args['unit'] ) ) ? '<span class=\"csf--label csf--unit\">'. esc_attr( $args['unit'] ) .'</span>' : '';\n          echo '</div>';\n\n        }\n\n      }\n\n      if ( ! empty( $args['style'] ) ) {\n        echo '<div class=\"csf--input\">';\n        echo '<select name=\"'. esc_attr( $this->field_name( '[style]' ) ) .'\">';\n        foreach ( $border_props as $border_prop_key => $border_prop_value ) {\n          $selected = ( $value['style'] === $border_prop_key ) ? ' selected' : '';\n          echo '<option value=\"'. esc_attr( $border_prop_key ) .'\"'. esc_attr( $selected ) .'>'. esc_attr( $border_prop_value ) .'</option>';\n        }\n        echo '</select>';\n        echo '</div>';\n      }\n\n      echo '</div>';\n\n      if ( ! empty( $args['color'] ) ) {\n        $default_color_attr = ( ! empty( $default_value['color'] ) ) ? ' data-default-color=\"'. esc_attr( $default_value['color'] ) .'\"' : '';\n        echo '<div class=\"csf--color\">';\n        echo '<div class=\"csf-field-color\">';\n        echo '<input type=\"text\" name=\"'. esc_attr( $this->field_name( '[color]' ) ) .'\" value=\"'. esc_attr( $value['color'] ) .'\" class=\"csf-color\"'. $default_color_attr .' />';\n        echo '</div>';\n        echo '</div>';\n      }\n\n      echo $this->field_after();\n\n    }\n\n    public function output() {\n\n      $output    = '';\n      $unit      = ( ! empty( $this->value['unit'] ) ) ? $this->value['unit'] : 'px';\n      $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : '';\n      $element   = ( is_array( $this->field['output'] ) ) ? join( ',', $this->field['output'] ) : $this->field['output'];\n\n      // properties\n      $top     = ( isset( $this->value['top'] )    && $this->value['top']    !== '' ) ? $this->value['top']    : '';\n      $right   = ( isset( $this->value['right'] )  && $this->value['right']  !== '' ) ? $this->value['right']  : '';\n      $bottom  = ( isset( $this->value['bottom'] ) && $this->value['bottom'] !== '' ) ? $this->value['bottom'] : '';\n      $left    = ( isset( $this->value['left'] )   && $this->value['left']   !== '' ) ? $this->value['left']   : '';\n      $style   = ( isset( $this->value['style'] )  && $this->value['style']  !== '' ) ? $this->value['style']  : '';\n      $color   = ( isset( $this->value['color'] )  && $this->value['color']  !== '' ) ? $this->value['color']  : '';\n      $all     = ( isset( $this->value['all'] )    && $this->value['all']    !== '' ) ? $this->value['all']    : '';\n\n      if ( ! empty( $this->field['all'] ) && ( $all !== '' || $color !== '' ) ) {\n\n        $output  = $element .'{';\n        $output .= ( $all   !== '' ) ? 'border-width:'. $all . $unit . $important .';' : '';\n        $output .= ( $color !== '' ) ? 'border-color:'. $color . $important .';'       : '';\n        $output .= ( $style !== '' ) ? 'border-style:'. $style . $important .';'       : '';\n        $output .= '}';\n\n      } else if ( $top !== '' || $right !== '' || $bottom !== '' || $left !== '' || $color !== '' ) {\n\n        $output  = $element .'{';\n        $output .= ( $top    !== '' ) ? 'border-top-width:'. $top . $unit . $important .';'       : '';\n        $output .= ( $right  !== '' ) ? 'border-right-width:'. $right . $unit . $important .';'   : '';\n        $output .= ( $bottom !== '' ) ? 'border-bottom-width:'. $bottom . $unit . $important .';' : '';\n        $output .= ( $left   !== '' ) ? 'border-left-width:'. $left . $unit . $important .';'     : '';\n        $output .= ( $color  !== '' ) ? 'border-color:'. $color . $important .';'                 : '';\n        $output .= ( $style  !== '' ) ? 'border-style:'. $style . $important .';'                 : '';\n        $output .= '}';\n\n      }\n\n      $this->parent->output_css .= $output;\n\n      return $output;\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/button_set/button_set.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: button_set\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_button_set' ) ) {\n  class CSF_Field_button_set extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'multiple'   => false,\n        'options'    => array(),\n        'query_args' => array(),\n      ) );\n\n      $value = ( is_array( $this->value ) ) ? $this->value : array_filter( (array) $this->value );\n\n      echo $this->field_before();\n\n      if ( isset( $this->field['options'] ) ) {\n\n        $options = $this->field['options'];\n        $options = ( is_array( $options ) ) ? $options : array_filter( $this->field_data( $options, false, $args['query_args'] ) );\n\n        if ( is_array( $options ) && ! empty( $options ) ) {\n\n          echo '<div class=\"csf-siblings csf--button-group\" data-multiple=\"'. esc_attr( $args['multiple'] ) .'\">';\n\n          foreach ( $options as $key => $option ) {\n\n            $type    = ( $args['multiple'] ) ? 'checkbox' : 'radio';\n            $extra   = ( $args['multiple'] ) ? '[]' : '';\n            $active  = ( in_array( $key, $value ) || ( empty( $value ) && empty( $key ) )  ) ? ' csf--active' : '';\n            $checked = ( in_array( $key, $value ) || ( empty( $value ) && empty( $key ) ) ) ? ' checked' : '';\n\n            echo '<div class=\"csf--sibling csf--button'. esc_attr( $active ) .'\">';\n            echo '<input type=\"'. esc_attr( $type ) .'\" name=\"'. esc_attr( $this->field_name( $extra ) ) .'\" value=\"'. esc_attr( $key ) .'\"'. $this->field_attributes() . esc_attr( $checked ) .'/>';\n            echo $option;\n            echo '</div>';\n\n          }\n\n          echo '</div>';\n\n        } else {\n\n          echo ( ! empty( $this->field['empty_message'] ) ) ? esc_attr( $this->field['empty_message'] ) : esc_html__( 'No data available.', 'csf' );\n\n        }\n\n      }\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/callback/callback.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: callback\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_callback' ) ) {\n  class CSF_Field_callback extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      if ( isset( $this->field['function'] ) && is_callable( $this->field['function'] ) ) {\n\n        $args = ( isset( $this->field['args'] ) ) ? $this->field['args'] : null;\n\n        call_user_func( $this->field['function'], $args );\n\n      }\n\n    }\n\n  }\n}\n\n"
  },
  {
    "path": "配套插件/BsCore/fields/checkbox/checkbox.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: checkbox\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_checkbox' ) ) {\n  class CSF_Field_checkbox extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'inline'     => false,\n        'query_args' => array(),\n      ) );\n\n      $inline_class = ( $args['inline'] ) ? ' class=\"csf--inline-list\"' : '';\n\n      echo $this->field_before();\n\n      if ( isset( $this->field['options'] ) ) {\n\n        $value   = ( is_array( $this->value ) ) ? $this->value : array_filter( (array) $this->value );\n        $options = $this->field['options'];\n        $options = ( is_array( $options ) ) ? $options : array_filter( $this->field_data( $options, false, $args['query_args'] ) );\n\n        if ( is_array( $options ) && ! empty( $options ) ) {\n\n          echo '<ul'. $inline_class .'>';\n\n          foreach ( $options as $option_key => $option_value ) {\n\n            if ( is_array( $option_value ) && ! empty( $option_value ) ) {\n\n              echo '<li>';\n                echo '<ul>';\n                  echo '<li><strong>'. esc_attr( $option_key ) .'</strong></li>';\n                  foreach ( $option_value as $sub_key => $sub_value ) {\n                    $checked = ( in_array( $sub_key, $value ) ) ? ' checked' : '';\n                    echo '<li>';\n                    echo '<label>';\n                    echo '<input type=\"checkbox\" name=\"'. esc_attr( $this->field_name( '[]' ) ) .'\" value=\"'. esc_attr( $sub_key ) .'\"'. $this->field_attributes() . esc_attr( $checked ) .'/>';\n                    echo '<span class=\"csf--text\">'. esc_attr( $sub_value ) .'</span>';\n                    echo '</label>';\n                    echo '</li>';\n                  }\n                echo '</ul>';\n              echo '</li>';\n\n            } else {\n\n              $checked = ( in_array( $option_key, $value ) ) ? ' checked' : '';\n\n              echo '<li>';\n              echo '<label>';\n              echo '<input type=\"checkbox\" name=\"'. esc_attr( $this->field_name( '[]' ) ) .'\" value=\"'. esc_attr( $option_key ) .'\"'. $this->field_attributes() . esc_attr( $checked ) .'/>';\n              echo '<span class=\"csf--text\">'. esc_attr( $option_value ) .'</span>';\n              echo '</label>';\n              echo '</li>';\n\n            }\n\n          }\n\n          echo '</ul>';\n\n        } else {\n\n          echo ( ! empty( $this->field['empty_message'] ) ) ? esc_attr( $this->field['empty_message'] ) : esc_html__( 'No data available.', 'csf' );\n\n        }\n\n      } else {\n\n        echo '<label class=\"csf-checkbox\">';\n        echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. $this->value .'\" class=\"csf--input\"'. $this->field_attributes() .'/>';\n        echo '<input type=\"checkbox\" name=\"_pseudo\" class=\"csf--checkbox\"'. esc_attr( checked( $this->value, 1, false ) ) . $this->field_attributes() .'/>';\n        echo ( ! empty( $this->field['label'] ) ) ? '<span class=\"csf--text\">'. esc_attr( $this->field['label'] ) .'</span>' : '';\n        echo '</label>';\n\n      }\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/code_editor/code_editor.php",
    "content": "<?php if (!defined('ABSPATH')) {\n    die;\n} // Cannot access directly.\n/**\n *\n * Field: code_editor\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif (!class_exists('CSF_Field_code_editor')) {\n    \n    class CSF_Field_code_editor extends CSF_Fields\n    {\n        public $cdn_url = '/usr/plugins/BsCore/assets/vendors/codemirror/5.65.2';\n        public $theme_url = '/usr/plugins/BsCore/assets/vendors/codemirror/5.65.2/theme/shadowfox.css';\n\n        public function __construct($field, $value = '', $unique = '', $where = '', $parent = '')\n        {\n            parent::__construct($field, $value, $unique, $where, $parent);\n        }\n\n        public function render()\n        {\n            \n            $default_settings = array(\n                'tabSize' => 2,\n                'lineNumbers' => true,\n                'theme' => 'default',\n                'mode' => 'htmlmixed',\n                'cdnURL' => $this->cdn_url,\n            );\n\n            $settings = (!empty($this->field['settings'])) ? $this->field['settings'] : array();\n            $settings = wp_parse_args($settings, $default_settings);\n\n            echo $this->field_before();\n            echo '<textarea name=\"' . esc_attr($this->field_name()) . '\"' . $this->field_attributes() . ' data-editor=\"' . esc_attr(json_encode($settings)) . '\">' . $this->value . '</textarea>';\n            echo $this->field_after();\n\n        }\n\n        public function enqueue($enq_js = true)\n        {\n\n            $page = (!empty($_GET['page'])) ? sanitize_text_field(wp_unslash($_GET['page'])) : '';\n\n            // Do not loads CodeMirror in revslider page.\n            if (in_array($page, array('revslider'))) {\n                return '';\n            }\n            if ($enq_js){\n                return enqueue_script_helper('csf-codemirror', esc_url($this->cdn_url  . '/codemirror.min.js')).\n                    enqueue_script_helper('csf-codemirror-loadmode', esc_url($this->cdn_url  . '/addon/mode/loadmode.js'));\n            } else {\n                return enqueue_style_helper('csf-codemirror-css', esc_url($this->cdn_url  . '/codemirror.min.css'));\n            }\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/color/color.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: color\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_color' ) ) {\n  class CSF_Field_color extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $default_attr = ( ! empty( $this->field['default'] ) ) ? ' data-default-color=\"'. esc_attr( $this->field['default'] ) .'\"' : '';\n\n      echo $this->field_before();\n      echo '<input type=\"text\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $this->value ) .'\" class=\"csf-color\"'. $default_attr . $this->field_attributes() .'/>';\n      echo $this->field_after();\n\n    }\n\n    public function output() {\n\n      $output    = '';\n      $elements  = ( is_array( $this->field['output'] ) ) ? $this->field['output'] : array_filter( (array) $this->field['output'] );\n      $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : '';\n      $mode      = ( ! empty( $this->field['output_mode'] ) ) ? $this->field['output_mode'] : 'color';\n\n      if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) {\n        foreach ( $elements as $key_property => $element ) {\n          if ( is_numeric( $key_property ) ) {\n            $output = implode( ',', $elements ) .'{'. $mode .':'. $this->value . $important .';}';\n            break;\n          } else {\n            $output .= $element .'{'. $key_property .':'. $this->value . $important .'}';\n          }\n        }\n      }\n\n      $this->parent->output_css .= $output;\n\n      return $output;\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/color_group/color_group.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: color_group\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_color_group' ) ) {\n  class CSF_Field_color_group extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $options = ( ! empty( $this->field['options'] ) ) ? $this->field['options'] : array();\n\n      echo $this->field_before();\n\n      if ( ! empty( $options ) ) {\n        foreach ( $options as $key => $option ) {\n\n          $color_value  = ( ! empty( $this->value[$key] ) ) ? $this->value[$key] : '';\n          $default_attr = ( ! empty( $this->field['default'][$key] ) ) ? ' data-default-color=\"'. esc_attr( $this->field['default'][$key] ) .'\"' : '';\n\n          echo '<div class=\"csf--left csf-field-color\">';\n          echo '<div class=\"csf--title\">'. $option .'</div>';\n          echo '<input type=\"text\" name=\"'. esc_attr( $this->field_name( '['. $key .']' ) ) .'\" value=\"'. esc_attr( $color_value ) .'\" class=\"csf-color\"'. $default_attr . $this->field_attributes() .'/>';\n          echo '</div>';\n\n        }\n      }\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/content/content.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: content\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_content' ) ) {\n  class CSF_Field_content extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      if ( ! empty( $this->field['content'] ) ) {\n\n        echo $this->field['content'];\n\n      }\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/date/date.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: date\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_date' ) ) {\n  class CSF_Field_date extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $default_settings = array(\n        'dateFormat' => 'mm/dd/yy',\n      );\n\n      $settings = ( ! empty( $this->field['settings'] ) ) ? $this->field['settings'] : array();\n      $settings = wp_parse_args( $settings, $default_settings );\n\n      echo $this->field_before();\n\n      if ( ! empty( $this->field['from_to'] ) ) {\n\n        $args = wp_parse_args( $this->field, array(\n          'text_from' => esc_html__( 'From', 'csf' ),\n          'text_to'   => esc_html__( 'To', 'csf' ),\n        ) );\n\n        $value = wp_parse_args( $this->value, array(\n          'from' => '',\n          'to'   => '',\n        ) );\n\n        echo '<label class=\"csf--from\">'. esc_attr( $args['text_from'] ) .' <input type=\"text\" name=\"'. esc_attr( $this->field_name( '[from]' ) ) .'\" value=\"'. esc_attr( $value['from'] ) .'\"'. $this->field_attributes() .'/></label>';\n        echo '<label class=\"csf--to\">'. esc_attr( $args['text_to'] ) .' <input type=\"text\" name=\"'. esc_attr( $this->field_name( '[to]' ) ) .'\" value=\"'. esc_attr( $value['to'] ) .'\"'. $this->field_attributes() .'/></label>';\n\n      } else {\n\n        echo '<input type=\"text\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $this->value ) .'\"'. $this->field_attributes() .'/>';\n\n      }\n\n      echo '<div class=\"csf-date-settings\" data-settings=\"'. esc_attr( json_encode( $settings ) ) .'\"></div>';\n\n      echo $this->field_after();\n\n    }\n\n    public function enqueue($enq_js = true) {\n\n//      if ( ! wp_script_is( 'jquery-ui-datepicker' ) ) {\n//        wp_enqueue_script( 'jquery-ui-datepicker' );\n//      }\n        if ($enq_js){\n            return enqueue_script_helper('jquery-ui-datepicker');\n        }\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/datetime/datetime.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: datetime\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_datetime' ) ) {\n  class CSF_Field_datetime extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $defaults = array(\n        'allowInput' => true,\n      );\n\n      $settings = ( ! empty( $this->field['settings'] ) ) ? $this->field['settings'] : array();\n\n      if ( ! isset( $settings['noCalendar'] ) ) {\n        $defaults['dateFormat'] = 'm/d/Y';\n      }\n\n      $settings = wp_parse_args( $settings, $defaults );\n\n      echo $this->field_before();\n\n      if ( ! empty( $this->field['from_to'] ) ) {\n\n        $args = wp_parse_args( $this->field, array(\n          'text_from' => esc_html__( 'From', 'csf' ),\n          'text_to'   => esc_html__( 'To', 'csf' ),\n        ) );\n\n        $value = wp_parse_args( $this->value, array(\n          'from' => '',\n          'to'   => '',\n        ) );\n\n        echo '<label class=\"csf--from\">'. esc_attr( $args['text_from'] ) .' <input type=\"text\" name=\"'. esc_attr( $this->field_name( '[from]' ) ) .'\" value=\"'. esc_attr( $value['from'] ) .'\"'. $this->field_attributes() .' data-type=\"from\" /></label>';\n        echo '<label class=\"csf--to\">'. esc_attr( $args['text_to'] ) .' <input type=\"text\" name=\"'. esc_attr( $this->field_name( '[to]' ) ) .'\" value=\"'. esc_attr( $value['to'] ) .'\"'. $this->field_attributes() .' data-type=\"to\" /></label>';\n\n      } else {\n\n        echo '<input type=\"text\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $this->value ) .'\"'. $this->field_attributes() .'/>';\n\n      }\n\n      echo '<div class=\"csf-datetime-settings\" data-settings=\"'. esc_attr( json_encode( $settings ) ) .'\"></div>';\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/dimensions/dimensions.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: dimensions\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_dimensions' ) ) {\n  class CSF_Field_dimensions extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'width_icon'         => '<i class=\"fas fa-arrows-alt-h\"></i>',\n        'height_icon'        => '<i class=\"fas fa-arrows-alt-v\"></i>',\n        'width_placeholder'  => esc_html__( 'width', 'csf' ),\n        'height_placeholder' => esc_html__( 'height', 'csf' ),\n        'width'              => true,\n        'height'             => true,\n        'unit'               => true,\n        'show_units'         => true,\n        'units'              => array( 'px', '%', 'em' )\n      ) );\n\n      $default_values = array(\n        'width'  => '',\n        'height' => '',\n        'unit'   => 'px',\n      );\n\n      $value   = wp_parse_args( $this->value, $default_values );\n      $unit    = ( count( $args['units'] ) === 1 && ! empty( $args['unit'] ) ) ? $args['units'][0] : '';\n      $is_unit = ( ! empty( $unit ) ) ? ' csf--is-unit' : '';\n\n      echo $this->field_before();\n\n      echo '<div class=\"csf--inputs\" data-depend-id=\"'. esc_attr( $this->field['id'] ) .'\">';\n\n      if ( ! empty( $args['width'] ) ) {\n        $placeholder = ( ! empty( $args['width_placeholder'] ) ) ? ' placeholder=\"'. esc_attr( $args['width_placeholder'] ) .'\"' : '';\n        echo '<div class=\"csf--input\">';\n        echo ( ! empty( $args['width_icon'] ) ) ? '<span class=\"csf--label csf--icon\">'. $args['width_icon'] .'</span>' : '';\n        echo '<input type=\"number\" name=\"'. esc_attr( $this->field_name( '[width]' ) ) .'\" value=\"'. esc_attr( $value['width'] ) .'\"'. $placeholder .' class=\"csf-input-number'. esc_attr( $is_unit ) .'\" step=\"any\" />';\n        echo ( ! empty( $unit ) ) ? '<span class=\"csf--label csf--unit\">'. esc_attr( $args['units'][0] ) .'</span>' : '';\n        echo '</div>';\n      }\n\n      if ( ! empty( $args['height'] ) ) {\n        $placeholder = ( ! empty( $args['height_placeholder'] ) ) ? ' placeholder=\"'. esc_attr( $args['height_placeholder'] ) .'\"' : '';\n        echo '<div class=\"csf--input\">';\n        echo ( ! empty( $args['height_icon'] ) ) ? '<span class=\"csf--label csf--icon\">'. $args['height_icon'] .'</span>' : '';\n        echo '<input type=\"number\" name=\"'. esc_attr( $this->field_name( '[height]' ) ) .'\" value=\"'. esc_attr( $value['height'] ) .'\"'. $placeholder .' class=\"csf-input-number'. esc_attr( $is_unit ) .'\" step=\"any\" />';\n        echo ( ! empty( $unit ) ) ? '<span class=\"csf--label csf--unit\">'. esc_attr( $args['units'][0] ) .'</span>' : '';\n        echo '</div>';\n      }\n\n      if ( ! empty( $args['unit'] ) && ! empty( $args['show_units'] ) && count( $args['units'] ) > 1 ) {\n        echo '<div class=\"csf--input\">';\n        echo '<select name=\"'. esc_attr( $this->field_name( '[unit]' ) ) .'\">';\n        foreach ( $args['units'] as $unit ) {\n          $selected = ( $value['unit'] === $unit ) ? ' selected' : '';\n          echo '<option value=\"'. esc_attr( $unit ) .'\"'. esc_attr( $selected ) .'>'. esc_attr( $unit ) .'</option>';\n        }\n        echo '</select>';\n        echo '</div>';\n      }\n\n      echo '</div>';\n\n      echo $this->field_after();\n\n    }\n\n    public function output() {\n\n      $output    = '';\n      $element   = ( is_array( $this->field['output'] ) ) ? join( ',', $this->field['output'] ) : $this->field['output'];\n      $prefix    = ( ! empty( $this->field['output_prefix'] ) ) ? $this->field['output_prefix'] .'-' : '';\n      $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : '';\n      $unit      = ( ! empty( $this->value['unit'] ) ) ? $this->value['unit'] : 'px';\n      $width     = ( isset( $this->value['width'] ) && $this->value['width'] !== '' ) ? $prefix .'width:'. $this->value['width'] . $unit . $important .';' : '';\n      $height    = ( isset( $this->value['height'] ) && $this->value['height'] !== '' ) ? $prefix .'height:'. $this->value['height'] . $unit . $important .';' : '';\n\n      if ( $width !== '' || $height !== '' ) {\n        $output = $element .'{'. $width . $height .'}';\n      }\n\n      $this->parent->output_css .= $output;\n\n      return $output;\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/fieldset/fieldset.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: fieldset\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_fieldset' ) ) {\n  class CSF_Field_fieldset extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      echo $this->field_before();\n\n      echo '<div class=\"csf-fieldset-content\" data-depend-id=\"'. esc_attr( $this->field['id'] ) .'\">';\n\n      foreach ( $this->field['fields'] as $field ) {\n\n        $field_id      = ( isset( $field['id'] ) ) ? $field['id'] : '';\n        $field_default = ( isset( $field['default'] ) ) ? $field['default'] : '';\n        $field_value   = ( isset( $this->value[$field_id] ) ) ? $this->value[$field_id] : $field_default;\n        $unique_id     = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']' : $this->field['id'];\n\n        CSF::field( $field, $field_value, $unique_id, 'field/fieldset' );\n\n      }\n\n      echo '</div>';\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/gallery/gallery.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: gallery\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_gallery' ) ) {\n  class CSF_Field_gallery extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'add_title'   => esc_html__( 'Add Gallery', 'csf' ),\n        'edit_title'  => esc_html__( 'Edit Gallery', 'csf' ),\n        'clear_title' => esc_html__( 'Clear', 'csf' ),\n      ) );\n\n      $hidden = ( empty( $this->value ) ) ? ' hidden' : '';\n\n      echo $this->field_before();\n\n      echo '<ul>';\n      if ( ! empty( $this->value ) ) {\n\n        $values = explode( ',', $this->value );\n\n        foreach ( $values as $id ) {\n          $attachment = wp_get_attachment_image_src( $id, 'thumbnail' );\n          echo '<li><img src=\"'. esc_url( $attachment[0] ) .'\" /></li>';\n        }\n\n      }\n      echo '</ul>';\n\n      echo '<a href=\"#\" class=\"button button-primary csf-button\">'. $args['add_title'] .'</a>';\n      echo '<a href=\"#\" class=\"button csf-edit-gallery'. esc_attr( $hidden ) .'\">'. $args['edit_title'] .'</a>';\n      echo '<a href=\"#\" class=\"button csf-warning-primary csf-clear-gallery'. esc_attr( $hidden ) .'\">'. $args['clear_title'] .'</a>';\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $this->value ) .'\"'. $this->field_attributes() .'/>';\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/group/group.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: group\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_group' ) ) {\n  class CSF_Field_group extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'max'                       => 0,\n        'min'                       => 0,\n        'fields'                    => array(),\n        'button_title'              => esc_html__( 'Add New', 'csf' ),\n        'accordion_title_prefix'    => '',\n        'accordion_title_number'    => false,\n        'accordion_title_auto'      => true,\n        'accordion_title_by'        => array(),\n        'accordion_title_by_prefix' => ' ',\n      ) );\n\n      $title_prefix    = ( ! empty( $args['accordion_title_prefix'] ) ) ? $args['accordion_title_prefix'] : '';\n      $title_number    = ( ! empty( $args['accordion_title_number'] ) ) ? true : false;\n      $title_auto      = ( ! empty( $args['accordion_title_auto'] ) ) ? true : false;\n      $title_first     = ( isset( $this->field['fields'][0]['id'] ) ) ? $this->field['fields'][0]['id'] : $this->field['fields'][1]['id'];\n      $title_by        = ( is_array( $args['accordion_title_by'] ) ) ? $args['accordion_title_by'] : (array) $args['accordion_title_by'];\n      $title_by        = ( empty( $title_by ) ) ? array( $title_first ) : $title_by;\n      $title_by_prefix = ( ! empty( $args['accordion_title_by_prefix'] ) ) ? $args['accordion_title_by_prefix'] : '';\n\n      if ( preg_match( '/'. preg_quote( '['. $this->field['id'] .']' ) .'/', $this->unique ) ) {\n\n        echo '<div class=\"csf-notice csf-notice-danger\">'. esc_html__( 'Error: Field ID conflict.', 'csf' ) .'</div>';\n\n      } else {\n\n        echo $this->field_before();\n\n        echo '<div class=\"csf-cloneable-item csf-cloneable-hidden\" data-depend-id=\"'. esc_attr( $this->field['id'] ) .'\">';\n\n          echo '<div class=\"csf-cloneable-helper\">';\n          echo '<i class=\"csf-cloneable-sort fas fa-arrows-alt\"></i>';\n          echo '<i class=\"csf-cloneable-clone far fa-clone\"></i>';\n          echo '<i class=\"csf-cloneable-remove csf-confirm fas fa-times\" data-confirm=\"'. esc_html__( 'Are you sure to delete this item?', 'csf' ) .'\"></i>';\n          echo '</div>';\n\n          echo '<h4 class=\"csf-cloneable-title\">';\n          echo '<span class=\"csf-cloneable-text\">';\n          echo ( $title_number ) ? '<span class=\"csf-cloneable-title-number\"></span>' : '';\n          echo ( $title_prefix ) ? '<span class=\"csf-cloneable-title-prefix\">'. esc_attr( $title_prefix ) .'</span>' : '';\n          echo ( $title_auto ) ? '<span class=\"csf-cloneable-value\"><span class=\"csf-cloneable-placeholder\"></span></span>' : '';\n          echo '</span>';\n          echo '</h4>';\n\n          echo '<div class=\"csf-cloneable-content\">';\n          foreach ( $this->field['fields'] as $field ) {\n\n            $field_default = ( isset( $field['default'] ) ) ? $field['default'] : '';\n            $field_unique  = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .'][0]' : $this->field['id'] .'[0]';\n\n            CSF::field( $field, $field_default, $field_unique, 'field/group' );\n\n          }\n          echo '</div>';\n\n        echo '</div>';\n\n        echo '<div class=\"csf-cloneable-wrapper csf-data-wrapper\" data-title-by=\"'. esc_attr( json_encode( $title_by ) ) .'\" data-title-by-prefix=\"'. esc_attr( $title_by_prefix ) .'\" data-title-number=\"'. esc_attr( $title_number ) .'\" data-field-id=\"['. esc_attr( $this->field['id'] ) .']\" data-max=\"'. esc_attr( $args['max'] ) .'\" data-min=\"'. esc_attr( $args['min'] ) .'\">';\n\n        if ( ! empty( $this->value ) ) {\n\n          $num = 0;\n\n          foreach ( $this->value as $value ) {\n\n            $title = '';\n\n            if ( ! empty( $title_by ) ) {\n\n              $titles = array();\n\n              foreach ( $title_by as $title_key ) {\n                if ( isset( $value[ $title_key ] ) ) {\n                  $titles[] = $value[ $title_key ];\n                }\n              }\n\n              $title = join( $title_by_prefix, $titles );\n\n            }\n\n            $title = ( is_array( $title ) ) ? reset( $title ) : $title;\n\n            echo '<div class=\"csf-cloneable-item\">';\n\n              echo '<div class=\"csf-cloneable-helper\">';\n              echo '<i class=\"csf-cloneable-sort fas fa-arrows-alt\"></i>';\n              echo '<i class=\"csf-cloneable-clone far fa-clone\"></i>';\n              echo '<i class=\"csf-cloneable-remove csf-confirm fas fa-times\" data-confirm=\"'. esc_html__( 'Are you sure to delete this item?', 'csf' ) .'\"></i>';\n              echo '</div>';\n\n              echo '<h4 class=\"csf-cloneable-title\">';\n              echo '<span class=\"csf-cloneable-text\">';\n              echo ( $title_number ) ? '<span class=\"csf-cloneable-title-number\">'. esc_attr( $num+1 ) .'.</span>' : '';\n              echo ( $title_prefix ) ? '<span class=\"csf-cloneable-title-prefix\">'. esc_attr( $title_prefix ) .'</span>' : '';\n              echo ( $title_auto ) ? '<span class=\"csf-cloneable-value\">' . esc_attr( $title ) .'</span>' : '';\n              echo '</span>';\n              echo '</h4>';\n\n              echo '<div class=\"csf-cloneable-content\">';\n\n              foreach ( $this->field['fields'] as $field ) {\n\n                $field_unique = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']['. $num .']' : $this->field['id'] .'['. $num .']';\n                $field_value  = ( isset( $field['id'] ) && isset( $value[$field['id']] ) ) ? $value[$field['id']] : '';\n\n                CSF::field( $field, $field_value, $field_unique, 'field/group' );\n\n              }\n\n              echo '</div>';\n\n            echo '</div>';\n\n            $num++;\n\n          }\n\n        }\n\n        echo '</div>';\n\n        echo '<div class=\"csf-cloneable-alert csf-cloneable-max\">'. esc_html__( 'You cannot add more.', 'csf' ) .'</div>';\n        echo '<div class=\"csf-cloneable-alert csf-cloneable-min\">'. esc_html__( 'You cannot remove more.', 'csf' ) .'</div>';\n        echo '<a href=\"#\" class=\"button button-primary csf-cloneable-add\">'. $args['button_title'] .'</a>';\n\n        echo $this->field_after();\n\n      }\n\n    }\n\n    public function enqueue($enq_js = true) {\n\n//      if ( ! wp_script_is( 'jquery-ui-accordion' ) ) {\n//        wp_enqueue_script( 'jquery-ui-accordion' );\n//      }\n//\n//      if ( ! wp_script_is( 'jquery-ui-sortable' ) ) {\n//        wp_enqueue_script( 'jquery-ui-sortable' );\n//      }\n        if ($enq_js){\n            return enqueue_script_helper('jquery-ui-accordion').enqueue_script_helper('jquery-ui-sortable');\n        }\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/heading/heading.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: heading\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_heading' ) ) {\n  class CSF_Field_heading extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      echo ( ! empty( $this->field['content'] ) ) ? $this->field['content'] : '';\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/icon/fa4-icons.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n//\n// Font Awesome 4 Icons\n//\nif ( ! function_exists( 'csf_get_default_icons' ) ) {\n  function csf_get_default_icons() {\n    return array( array(\n      'title' => 'Font Awesome',\n      'icons' => array( 'fa fa-glass','fa fa-music','fa fa-search','fa fa-envelope-o','fa fa-heart','fa fa-star','fa fa-star-o','fa fa-user','fa fa-film','fa fa-th-large','fa fa-th','fa fa-th-list','fa fa-check','fa fa-times','fa fa-search-plus','fa fa-search-minus','fa fa-power-off','fa fa-signal','fa fa-cog','fa fa-trash-o','fa fa-home','fa fa-file-o','fa fa-clock-o','fa fa-road','fa fa-download','fa fa-arrow-circle-o-down','fa fa-arrow-circle-o-up','fa fa-inbox','fa fa-play-circle-o','fa fa-repeat','fa fa-refresh','fa fa-list-alt','fa fa-lock','fa fa-flag','fa fa-headphones','fa fa-volume-off','fa fa-volume-down','fa fa-volume-up','fa fa-qrcode','fa fa-barcode','fa fa-tag','fa fa-tags','fa fa-book','fa fa-bookmark','fa fa-print','fa fa-camera','fa fa-font','fa fa-bold','fa fa-italic','fa fa-text-height','fa fa-text-width','fa fa-align-left','fa fa-align-center','fa fa-align-right','fa fa-align-justify','fa fa-list','fa fa-outdent','fa fa-indent','fa fa-video-camera','fa fa-picture-o','fa fa-pencil','fa fa-map-marker','fa fa-adjust','fa fa-tint','fa fa-pencil-square-o','fa fa-share-square-o','fa fa-check-square-o','fa fa-arrows','fa fa-step-backward','fa fa-fast-backward','fa fa-backward','fa fa-play','fa fa-pause','fa fa-stop','fa fa-forward','fa fa-fast-forward','fa fa-step-forward','fa fa-eject','fa fa-chevron-left','fa fa-chevron-right','fa fa-plus-circle','fa fa-minus-circle','fa fa-times-circle','fa fa-check-circle','fa fa-question-circle','fa fa-info-circle','fa fa-crosshairs','fa fa-times-circle-o','fa fa-check-circle-o','fa fa-ban','fa fa-arrow-left','fa fa-arrow-right','fa fa-arrow-up','fa fa-arrow-down','fa fa-share','fa fa-expand','fa fa-compress','fa fa-plus','fa fa-minus','fa fa-asterisk','fa fa-exclamation-circle','fa fa-gift','fa fa-leaf','fa fa-fire','fa fa-eye','fa fa-eye-slash','fa fa-exclamation-triangle','fa fa-plane','fa fa-calendar','fa fa-random','fa fa-comment','fa fa-magnet','fa fa-chevron-up','fa fa-chevron-down','fa fa-retweet','fa fa-shopping-cart','fa fa-folder','fa fa-folder-open','fa fa-arrows-v','fa fa-arrows-h','fa fa-bar-chart','fa fa-twitter-square','fa fa-facebook-square','fa fa-camera-retro','fa fa-key','fa fa-cogs','fa fa-comments','fa fa-thumbs-o-up','fa fa-thumbs-o-down','fa fa-star-half','fa fa-heart-o','fa fa-sign-out','fa fa-linkedin-square','fa fa-thumb-tack','fa fa-external-link','fa fa-sign-in','fa fa-trophy','fa fa-github-square','fa fa-upload','fa fa-lemon-o','fa fa-phone','fa fa-square-o','fa fa-bookmark-o','fa fa-phone-square','fa fa-twitter','fa fa-facebook','fa fa-github','fa fa-unlock','fa fa-credit-card','fa fa-rss','fa fa-hdd-o','fa fa-bullhorn','fa fa-bell','fa fa-certificate','fa fa-hand-o-right','fa fa-hand-o-left','fa fa-hand-o-up','fa fa-hand-o-down','fa fa-arrow-circle-left','fa fa-arrow-circle-right','fa fa-arrow-circle-up','fa fa-arrow-circle-down','fa fa-globe','fa fa-wrench','fa fa-tasks','fa fa-filter','fa fa-briefcase','fa fa-arrows-alt','fa fa-users','fa fa-link','fa fa-cloud','fa fa-flask','fa fa-scissors','fa fa-files-o','fa fa-paperclip','fa fa-floppy-o','fa fa-square','fa fa-bars','fa fa-list-ul','fa fa-list-ol','fa fa-strikethrough','fa fa-underline','fa fa-table','fa fa-magic','fa fa-truck','fa fa-pinterest','fa fa-pinterest-square','fa fa-google-plus-square','fa fa-google-plus','fa fa-money','fa fa-caret-down','fa fa-caret-up','fa fa-caret-left','fa fa-caret-right','fa fa-columns','fa fa-sort','fa fa-sort-desc','fa fa-sort-asc','fa fa-envelope','fa fa-linkedin','fa fa-undo','fa fa-gavel','fa fa-tachometer','fa fa-comment-o','fa fa-comments-o','fa fa-bolt','fa fa-sitemap','fa fa-umbrella','fa fa-clipboard','fa fa-lightbulb-o','fa fa-exchange','fa fa-cloud-download','fa fa-cloud-upload','fa fa-user-md','fa fa-stethoscope','fa fa-suitcase','fa fa-bell-o','fa fa-coffee','fa fa-cutlery','fa fa-file-text-o','fa fa-building-o','fa fa-hospital-o','fa fa-ambulance','fa fa-medkit','fa fa-fighter-jet','fa fa-beer','fa fa-h-square','fa fa-plus-square','fa fa-angle-double-left','fa fa-angle-double-right','fa fa-angle-double-up','fa fa-angle-double-down','fa fa-angle-left','fa fa-angle-right','fa fa-angle-up','fa fa-angle-down','fa fa-desktop','fa fa-laptop','fa fa-tablet','fa fa-mobile','fa fa-circle-o','fa fa-quote-left','fa fa-quote-right','fa fa-spinner','fa fa-circle','fa fa-reply','fa fa-github-alt','fa fa-folder-o','fa fa-folder-open-o','fa fa-smile-o','fa fa-frown-o','fa fa-meh-o','fa fa-gamepad','fa fa-keyboard-o','fa fa-flag-o','fa fa-flag-checkered','fa fa-terminal','fa fa-code','fa fa-reply-all','fa fa-star-half-o','fa fa-location-arrow','fa fa-crop','fa fa-code-fork','fa fa-chain-broken','fa fa-question','fa fa-info','fa fa-exclamation','fa fa-superscript','fa fa-subscript','fa fa-eraser','fa fa-puzzle-piece','fa fa-microphone','fa fa-microphone-slash','fa fa-shield','fa fa-calendar-o','fa fa-fire-extinguisher','fa fa-rocket','fa fa-maxcdn','fa fa-chevron-circle-left','fa fa-chevron-circle-right','fa fa-chevron-circle-up','fa fa-chevron-circle-down','fa fa-html5','fa fa-css3','fa fa-anchor','fa fa-unlock-alt','fa fa-bullseye','fa fa-ellipsis-h','fa fa-ellipsis-v','fa fa-rss-square','fa fa-play-circle','fa fa-ticket','fa fa-minus-square','fa fa-minus-square-o','fa fa-level-up','fa fa-level-down','fa fa-check-square','fa fa-pencil-square','fa fa-external-link-square','fa fa-share-square','fa fa-compass','fa fa-caret-square-o-down','fa fa-caret-square-o-up','fa fa-caret-square-o-right','fa fa-eur','fa fa-gbp','fa fa-usd','fa fa-inr','fa fa-jpy','fa fa-rub','fa fa-krw','fa fa-btc','fa fa-file','fa fa-file-text','fa fa-sort-alpha-asc','fa fa-sort-alpha-desc','fa fa-sort-amount-asc','fa fa-sort-amount-desc','fa fa-sort-numeric-asc','fa fa-sort-numeric-desc','fa fa-thumbs-up','fa fa-thumbs-down','fa fa-youtube-square','fa fa-youtube','fa fa-xing','fa fa-xing-square','fa fa-youtube-play','fa fa-dropbox','fa fa-stack-overflow','fa fa-instagram','fa fa-flickr','fa fa-adn','fa fa-bitbucket','fa fa-bitbucket-square','fa fa-tumblr','fa fa-tumblr-square','fa fa-long-arrow-down','fa fa-long-arrow-up','fa fa-long-arrow-left','fa fa-long-arrow-right','fa fa-apple','fa fa-windows','fa fa-android','fa fa-linux','fa fa-dribbble','fa fa-skype','fa fa-foursquare','fa fa-trello','fa fa-female','fa fa-male','fa fa-gratipay','fa fa-sun-o','fa fa-moon-o','fa fa-archive','fa fa-bug','fa fa-vk','fa fa-weibo','fa fa-renren','fa fa-pagelines','fa fa-stack-exchange','fa fa-arrow-circle-o-right','fa fa-arrow-circle-o-left','fa fa-caret-square-o-left','fa fa-dot-circle-o','fa fa-wheelchair','fa fa-vimeo-square','fa fa-try','fa fa-plus-square-o','fa fa-space-shuttle','fa fa-slack','fa fa-envelope-square','fa fa-wordpress','fa fa-openid','fa fa-university','fa fa-graduation-cap','fa fa-yahoo','fa fa-google','fa fa-reddit','fa fa-reddit-square','fa fa-stumbleupon-circle','fa fa-stumbleupon','fa fa-delicious','fa fa-digg','fa fa-pied-piper-pp','fa fa-pied-piper-alt','fa fa-drupal','fa fa-joomla','fa fa-language','fa fa-fax','fa fa-building','fa fa-child','fa fa-paw','fa fa-spoon','fa fa-cube','fa fa-cubes','fa fa-behance','fa fa-behance-square','fa fa-steam','fa fa-steam-square','fa fa-recycle','fa fa-car','fa fa-taxi','fa fa-tree','fa fa-spotify','fa fa-deviantart','fa fa-soundcloud','fa fa-database','fa fa-file-pdf-o','fa fa-file-word-o','fa fa-file-excel-o','fa fa-file-powerpoint-o','fa fa-file-image-o','fa fa-file-archive-o','fa fa-file-audio-o','fa fa-file-video-o','fa fa-file-code-o','fa fa-vine','fa fa-codepen','fa fa-jsfiddle','fa fa-life-ring','fa fa-circle-o-notch','fa fa-rebel','fa fa-empire','fa fa-git-square','fa fa-git','fa fa-hacker-news','fa fa-tencent-weibo','fa fa-qq','fa fa-weixin','fa fa-paper-plane','fa fa-paper-plane-o','fa fa-history','fa fa-circle-thin','fa fa-header','fa fa-paragraph','fa fa-sliders','fa fa-share-alt','fa fa-share-alt-square','fa fa-bomb','fa fa-futbol-o','fa fa-tty','fa fa-binoculars','fa fa-plug','fa fa-slideshare','fa fa-twitch','fa fa-yelp','fa fa-newspaper-o','fa fa-wifi','fa fa-calculator','fa fa-paypal','fa fa-google-wallet','fa fa-cc-visa','fa fa-cc-mastercard','fa fa-cc-discover','fa fa-cc-amex','fa fa-cc-paypal','fa fa-cc-stripe','fa fa-bell-slash','fa fa-bell-slash-o','fa fa-trash','fa fa-copyright','fa fa-at','fa fa-eyedropper','fa fa-paint-brush','fa fa-birthday-cake','fa fa-area-chart','fa fa-pie-chart','fa fa-line-chart','fa fa-lastfm','fa fa-lastfm-square','fa fa-toggle-off','fa fa-toggle-on','fa fa-bicycle','fa fa-bus','fa fa-ioxhost','fa fa-angellist','fa fa-cc','fa fa-ils','fa fa-meanpath','fa fa-buysellads','fa fa-connectdevelop','fa fa-dashcube','fa fa-forumbee','fa fa-leanpub','fa fa-sellsy','fa fa-shirtsinbulk','fa fa-simplybuilt','fa fa-skyatlas','fa fa-cart-plus','fa fa-cart-arrow-down','fa fa-diamond','fa fa-ship','fa fa-user-secret','fa fa-motorcycle','fa fa-street-view','fa fa-heartbeat','fa fa-venus','fa fa-mars','fa fa-mercury','fa fa-transgender','fa fa-transgender-alt','fa fa-venus-double','fa fa-mars-double','fa fa-venus-mars','fa fa-mars-stroke','fa fa-mars-stroke-v','fa fa-mars-stroke-h','fa fa-neuter','fa fa-genderless','fa fa-facebook-official','fa fa-pinterest-p','fa fa-whatsapp','fa fa-server','fa fa-user-plus','fa fa-user-times','fa fa-bed','fa fa-viacoin','fa fa-train','fa fa-subway','fa fa-medium','fa fa-y-combinator','fa fa-optin-monster','fa fa-opencart','fa fa-expeditedssl','fa fa-battery-full','fa fa-battery-three-quarters','fa fa-battery-half','fa fa-battery-quarter','fa fa-battery-empty','fa fa-mouse-pointer','fa fa-i-cursor','fa fa-object-group','fa fa-object-ungroup','fa fa-sticky-note','fa fa-sticky-note-o','fa fa-cc-jcb','fa fa-cc-diners-club','fa fa-clone','fa fa-balance-scale','fa fa-hourglass-o','fa fa-hourglass-start','fa fa-hourglass-half','fa fa-hourglass-end','fa fa-hourglass','fa fa-hand-rock-o','fa fa-hand-paper-o','fa fa-hand-scissors-o','fa fa-hand-lizard-o','fa fa-hand-spock-o','fa fa-hand-pointer-o','fa fa-hand-peace-o','fa fa-trademark','fa fa-registered','fa fa-creative-commons','fa fa-gg','fa fa-gg-circle','fa fa-tripadvisor','fa fa-odnoklassniki','fa fa-odnoklassniki-square','fa fa-get-pocket','fa fa-wikipedia-w','fa fa-safari','fa fa-chrome','fa fa-firefox','fa fa-opera','fa fa-internet-explorer','fa fa-television','fa fa-contao','fa fa-500px','fa fa-amazon','fa fa-calendar-plus-o','fa fa-calendar-minus-o','fa fa-calendar-times-o','fa fa-calendar-check-o','fa fa-industry','fa fa-map-pin','fa fa-map-signs','fa fa-map-o','fa fa-map','fa fa-commenting','fa fa-commenting-o','fa fa-houzz','fa fa-vimeo','fa fa-black-tie','fa fa-fonticons','fa fa-reddit-alien','fa fa-edge','fa fa-credit-card-alt','fa fa-codiepie','fa fa-modx','fa fa-fort-awesome','fa fa-usb','fa fa-product-hunt','fa fa-mixcloud','fa fa-scribd','fa fa-pause-circle','fa fa-pause-circle-o','fa fa-stop-circle','fa fa-stop-circle-o','fa fa-shopping-bag','fa fa-shopping-basket','fa fa-hashtag','fa fa-bluetooth','fa fa-bluetooth-b','fa fa-percent','fa fa-gitlab','fa fa-wpbeginner','fa fa-wpforms','fa fa-envira','fa fa-universal-access','fa fa-wheelchair-alt','fa fa-question-circle-o','fa fa-blind','fa fa-audio-description','fa fa-volume-control-phone','fa fa-braille','fa fa-assistive-listening-systems','fa fa-american-sign-language-interpreting','fa fa-deaf','fa fa-glide','fa fa-glide-g','fa fa-sign-language','fa fa-low-vision','fa fa-viadeo','fa fa-viadeo-square','fa fa-snapchat','fa fa-snapchat-ghost','fa fa-snapchat-square','fa fa-pied-piper','fa fa-first-order','fa fa-yoast','fa fa-themeisle','fa fa-google-plus-official','fa fa-font-awesome','fa fa-handshake-o','fa fa-envelope-open','fa fa-envelope-open-o','fa fa-linode','fa fa-address-book','fa fa-address-book-o','fa fa-address-card','fa fa-address-card-o','fa fa-user-circle','fa fa-user-circle-o','fa fa-user-o','fa fa-id-badge','fa fa-id-card','fa fa-id-card-o','fa fa-quora','fa fa-free-code-camp','fa fa-telegram','fa fa-thermometer-full','fa fa-thermometer-three-quarters','fa fa-thermometer-half','fa fa-thermometer-quarter','fa fa-thermometer-empty','fa fa-shower','fa fa-bath','fa fa-podcast','fa fa-window-maximize','fa fa-window-minimize','fa fa-window-restore','fa fa-window-close','fa fa-window-close-o','fa fa-bandcamp','fa fa-grav','fa fa-etsy','fa fa-imdb','fa fa-ravelry','fa fa-eercast','fa fa-microchip','fa fa-snowflake-o','fa fa-superpowers','fa fa-wpexplorer','fa fa-meetup' )\n    ) );\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/icon/fa5-icons.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n//\n// Font Awesome 5 Free Icons\n//\nif ( ! function_exists( 'csf_get_default_icons' ) ) {\n  function csf_get_default_icons() {\n    return array( array(\n      'title' => 'Font Awesome 5 Free',\n      'icons' => array( 'fab fa-500px','fab fa-accessible-icon','fab fa-accusoft','fab fa-acquisitions-incorporated','fas fa-ad','fas fa-address-book','far fa-address-book','fas fa-address-card','far fa-address-card','fas fa-adjust','fab fa-adn','fab fa-adversal','fab fa-affiliatetheme','fas fa-air-freshener','fab fa-airbnb','fab fa-algolia','fas fa-align-center','fas fa-align-justify','fas fa-align-left','fas fa-align-right','fab fa-alipay','fas fa-allergies','fab fa-amazon','fab fa-amazon-pay','fas fa-ambulance','fas fa-american-sign-language-interpreting','fab fa-amilia','fas fa-anchor','fab fa-android','fab fa-angellist','fas fa-angle-double-down','fas fa-angle-double-left','fas fa-angle-double-right','fas fa-angle-double-up','fas fa-angle-down','fas fa-angle-left','fas fa-angle-right','fas fa-angle-up','fas fa-angry','far fa-angry','fab fa-angrycreative','fab fa-angular','fas fa-ankh','fab fa-app-store','fab fa-app-store-ios','fab fa-apper','fab fa-apple','fas fa-apple-alt','fab fa-apple-pay','fas fa-archive','fas fa-archway','fas fa-arrow-alt-circle-down','far fa-arrow-alt-circle-down','fas fa-arrow-alt-circle-left','far fa-arrow-alt-circle-left','fas fa-arrow-alt-circle-right','far fa-arrow-alt-circle-right','fas fa-arrow-alt-circle-up','far fa-arrow-alt-circle-up','fas fa-arrow-circle-down','fas fa-arrow-circle-left','fas fa-arrow-circle-right','fas fa-arrow-circle-up','fas fa-arrow-down','fas fa-arrow-left','fas fa-arrow-right','fas fa-arrow-up','fas fa-arrows-alt','fas fa-arrows-alt-h','fas fa-arrows-alt-v','fab fa-artstation','fas fa-assistive-listening-systems','fas fa-asterisk','fab fa-asymmetrik','fas fa-at','fas fa-atlas','fab fa-atlassian','fas fa-atom','fab fa-audible','fas fa-audio-description','fab fa-autoprefixer','fab fa-avianex','fab fa-aviato','fas fa-award','fab fa-aws','fas fa-baby','fas fa-baby-carriage','fas fa-backspace','fas fa-backward','fas fa-bacon','fas fa-bacteria','fas fa-bacterium','fas fa-bahai','fas fa-balance-scale','fas fa-balance-scale-left','fas fa-balance-scale-right','fas fa-ban','fas fa-band-aid','fab fa-bandcamp','fas fa-barcode','fas fa-bars','fas fa-baseball-ball','fas fa-basketball-ball','fas fa-bath','fas fa-battery-empty','fas fa-battery-full','fas fa-battery-half','fas fa-battery-quarter','fas fa-battery-three-quarters','fab fa-battle-net','fas fa-bed','fas fa-beer','fab fa-behance','fab fa-behance-square','fas fa-bell','far fa-bell','fas fa-bell-slash','far fa-bell-slash','fas fa-bezier-curve','fas fa-bible','fas fa-bicycle','fas fa-biking','fab fa-bimobject','fas fa-binoculars','fas fa-biohazard','fas fa-birthday-cake','fab fa-bitbucket','fab fa-bitcoin','fab fa-bity','fab fa-black-tie','fab fa-blackberry','fas fa-blender','fas fa-blender-phone','fas fa-blind','fas fa-blog','fab fa-blogger','fab fa-blogger-b','fab fa-bluetooth','fab fa-bluetooth-b','fas fa-bold','fas fa-bolt','fas fa-bomb','fas fa-bone','fas fa-bong','fas fa-book','fas fa-book-dead','fas fa-book-medical','fas fa-book-open','fas fa-book-reader','fas fa-bookmark','far fa-bookmark','fab fa-bootstrap','fas fa-border-all','fas fa-border-none','fas fa-border-style','fas fa-bowling-ball','fas fa-box','fas fa-box-open','fas fa-box-tissue','fas fa-boxes','fas fa-braille','fas fa-brain','fas fa-bread-slice','fas fa-briefcase','fas fa-briefcase-medical','fas fa-broadcast-tower','fas fa-broom','fas fa-brush','fab fa-btc','fab fa-buffer','fas fa-bug','fas fa-building','far fa-building','fas fa-bullhorn','fas fa-bullseye','fas fa-burn','fab fa-buromobelexperte','fas fa-bus','fas fa-bus-alt','fas fa-business-time','fab fa-buy-n-large','fab fa-buysellads','fas fa-calculator','fas fa-calendar','far fa-calendar','fas fa-calendar-alt','far fa-calendar-alt','fas fa-calendar-check','far fa-calendar-check','fas fa-calendar-day','fas fa-calendar-minus','far fa-calendar-minus','fas fa-calendar-plus','far fa-calendar-plus','fas fa-calendar-times','far fa-calendar-times','fas fa-calendar-week','fas fa-camera','fas fa-camera-retro','fas fa-campground','fab fa-canadian-maple-leaf','fas fa-candy-cane','fas fa-cannabis','fas fa-capsules','fas fa-car','fas fa-car-alt','fas fa-car-battery','fas fa-car-crash','fas fa-car-side','fas fa-caravan','fas fa-caret-down','fas fa-caret-left','fas fa-caret-right','fas fa-caret-square-down','far fa-caret-square-down','fas fa-caret-square-left','far fa-caret-square-left','fas fa-caret-square-right','far fa-caret-square-right','fas fa-caret-square-up','far fa-caret-square-up','fas fa-caret-up','fas fa-carrot','fas fa-cart-arrow-down','fas fa-cart-plus','fas fa-cash-register','fas fa-cat','fab fa-cc-amazon-pay','fab fa-cc-amex','fab fa-cc-apple-pay','fab fa-cc-diners-club','fab fa-cc-discover','fab fa-cc-jcb','fab fa-cc-mastercard','fab fa-cc-paypal','fab fa-cc-stripe','fab fa-cc-visa','fab fa-centercode','fab fa-centos','fas fa-certificate','fas fa-chair','fas fa-chalkboard','fas fa-chalkboard-teacher','fas fa-charging-station','fas fa-chart-area','fas fa-chart-bar','far fa-chart-bar','fas fa-chart-line','fas fa-chart-pie','fas fa-check','fas fa-check-circle','far fa-check-circle','fas fa-check-double','fas fa-check-square','far fa-check-square','fas fa-cheese','fas fa-chess','fas fa-chess-bishop','fas fa-chess-board','fas fa-chess-king','fas fa-chess-knight','fas fa-chess-pawn','fas fa-chess-queen','fas fa-chess-rook','fas fa-chevron-circle-down','fas fa-chevron-circle-left','fas fa-chevron-circle-right','fas fa-chevron-circle-up','fas fa-chevron-down','fas fa-chevron-left','fas fa-chevron-right','fas fa-chevron-up','fas fa-child','fab fa-chrome','fab fa-chromecast','fas fa-church','fas fa-circle','far fa-circle','fas fa-circle-notch','fas fa-city','fas fa-clinic-medical','fas fa-clipboard','far fa-clipboard','fas fa-clipboard-check','fas fa-clipboard-list','fas fa-clock','far fa-clock','fas fa-clone','far fa-clone','fas fa-closed-captioning','far fa-closed-captioning','fas fa-cloud','fas fa-cloud-download-alt','fas fa-cloud-meatball','fas fa-cloud-moon','fas fa-cloud-moon-rain','fas fa-cloud-rain','fas fa-cloud-showers-heavy','fas fa-cloud-sun','fas fa-cloud-sun-rain','fas fa-cloud-upload-alt','fab fa-cloudflare','fab fa-cloudscale','fab fa-cloudsmith','fab fa-cloudversify','fas fa-cocktail','fas fa-code','fas fa-code-branch','fab fa-codepen','fab fa-codiepie','fas fa-coffee','fas fa-cog','fas fa-cogs','fas fa-coins','fas fa-columns','fas fa-comment','far fa-comment','fas fa-comment-alt','far fa-comment-alt','fas fa-comment-dollar','fas fa-comment-dots','far fa-comment-dots','fas fa-comment-medical','fas fa-comment-slash','fas fa-comments','far fa-comments','fas fa-comments-dollar','fas fa-compact-disc','fas fa-compass','far fa-compass','fas fa-compress','fas fa-compress-alt','fas fa-compress-arrows-alt','fas fa-concierge-bell','fab fa-confluence','fab fa-connectdevelop','fab fa-contao','fas fa-cookie','fas fa-cookie-bite','fas fa-copy','far fa-copy','fas fa-copyright','far fa-copyright','fab fa-cotton-bureau','fas fa-couch','fab fa-cpanel','fab fa-creative-commons','fab fa-creative-commons-by','fab fa-creative-commons-nc','fab fa-creative-commons-nc-eu','fab fa-creative-commons-nc-jp','fab fa-creative-commons-nd','fab fa-creative-commons-pd','fab fa-creative-commons-pd-alt','fab fa-creative-commons-remix','fab fa-creative-commons-sa','fab fa-creative-commons-sampling','fab fa-creative-commons-sampling-plus','fab fa-creative-commons-share','fab fa-creative-commons-zero','fas fa-credit-card','far fa-credit-card','fab fa-critical-role','fas fa-crop','fas fa-crop-alt','fas fa-cross','fas fa-crosshairs','fas fa-crow','fas fa-crown','fas fa-crutch','fab fa-css3','fab fa-css3-alt','fas fa-cube','fas fa-cubes','fas fa-cut','fab fa-cuttlefish','fab fa-d-and-d','fab fa-d-and-d-beyond','fab fa-dailymotion','fab fa-dashcube','fas fa-database','fas fa-deaf','fab fa-deezer','fab fa-delicious','fas fa-democrat','fab fa-deploydog','fab fa-deskpro','fas fa-desktop','fab fa-dev','fab fa-deviantart','fas fa-dharmachakra','fab fa-dhl','fas fa-diagnoses','fab fa-diaspora','fas fa-dice','fas fa-dice-d20','fas fa-dice-d6','fas fa-dice-five','fas fa-dice-four','fas fa-dice-one','fas fa-dice-six','fas fa-dice-three','fas fa-dice-two','fab fa-digg','fab fa-digital-ocean','fas fa-digital-tachograph','fas fa-directions','fab fa-discord','fab fa-discourse','fas fa-disease','fas fa-divide','fas fa-dizzy','far fa-dizzy','fas fa-dna','fab fa-dochub','fab fa-docker','fas fa-dog','fas fa-dollar-sign','fas fa-dolly','fas fa-dolly-flatbed','fas fa-donate','fas fa-door-closed','fas fa-door-open','fas fa-dot-circle','far fa-dot-circle','fas fa-dove','fas fa-download','fab fa-draft2digital','fas fa-drafting-compass','fas fa-dragon','fas fa-draw-polygon','fab fa-dribbble','fab fa-dribbble-square','fab fa-dropbox','fas fa-drum','fas fa-drum-steelpan','fas fa-drumstick-bite','fab fa-drupal','fas fa-dumbbell','fas fa-dumpster','fas fa-dumpster-fire','fas fa-dungeon','fab fa-dyalog','fab fa-earlybirds','fab fa-ebay','fab fa-edge','fab fa-edge-legacy','fas fa-edit','far fa-edit','fas fa-egg','fas fa-eject','fab fa-elementor','fas fa-ellipsis-h','fas fa-ellipsis-v','fab fa-ello','fab fa-ember','fab fa-empire','fas fa-envelope','far fa-envelope','fas fa-envelope-open','far fa-envelope-open','fas fa-envelope-open-text','fas fa-envelope-square','fab fa-envira','fas fa-equals','fas fa-eraser','fab fa-erlang','fab fa-ethereum','fas fa-ethernet','fab fa-etsy','fas fa-euro-sign','fab fa-evernote','fas fa-exchange-alt','fas fa-exclamation','fas fa-exclamation-circle','fas fa-exclamation-triangle','fas fa-expand','fas fa-expand-alt','fas fa-expand-arrows-alt','fab fa-expeditedssl','fas fa-external-link-alt','fas fa-external-link-square-alt','fas fa-eye','far fa-eye','fas fa-eye-dropper','fas fa-eye-slash','far fa-eye-slash','fab fa-facebook','fab fa-facebook-f','fab fa-facebook-messenger','fab fa-facebook-square','fas fa-fan','fab fa-fantasy-flight-games','fas fa-fast-backward','fas fa-fast-forward','fas fa-faucet','fas fa-fax','fas fa-feather','fas fa-feather-alt','fab fa-fedex','fab fa-fedora','fas fa-female','fas fa-fighter-jet','fab fa-figma','fas fa-file','far fa-file','fas fa-file-alt','far fa-file-alt','fas fa-file-archive','far fa-file-archive','fas fa-file-audio','far fa-file-audio','fas fa-file-code','far fa-file-code','fas fa-file-contract','fas fa-file-csv','fas fa-file-download','fas fa-file-excel','far fa-file-excel','fas fa-file-export','fas fa-file-image','far fa-file-image','fas fa-file-import','fas fa-file-invoice','fas fa-file-invoice-dollar','fas fa-file-medical','fas fa-file-medical-alt','fas fa-file-pdf','far fa-file-pdf','fas fa-file-powerpoint','far fa-file-powerpoint','fas fa-file-prescription','fas fa-file-signature','fas fa-file-upload','fas fa-file-video','far fa-file-video','fas fa-file-word','far fa-file-word','fas fa-fill','fas fa-fill-drip','fas fa-film','fas fa-filter','fas fa-fingerprint','fas fa-fire','fas fa-fire-alt','fas fa-fire-extinguisher','fab fa-firefox','fab fa-firefox-browser','fas fa-first-aid','fab fa-first-order','fab fa-first-order-alt','fab fa-firstdraft','fas fa-fish','fas fa-fist-raised','fas fa-flag','far fa-flag','fas fa-flag-checkered','fas fa-flag-usa','fas fa-flask','fab fa-flickr','fab fa-flipboard','fas fa-flushed','far fa-flushed','fab fa-fly','fas fa-folder','far fa-folder','fas fa-folder-minus','fas fa-folder-open','far fa-folder-open','fas fa-folder-plus','fas fa-font','fab fa-font-awesome','fab fa-font-awesome-alt','fab fa-font-awesome-flag','far fa-font-awesome-logo-full','fas fa-font-awesome-logo-full','fab fa-font-awesome-logo-full','fab fa-fonticons','fab fa-fonticons-fi','fas fa-football-ball','fab fa-fort-awesome','fab fa-fort-awesome-alt','fab fa-forumbee','fas fa-forward','fab fa-foursquare','fab fa-free-code-camp','fab fa-freebsd','fas fa-frog','fas fa-frown','far fa-frown','fas fa-frown-open','far fa-frown-open','fab fa-fulcrum','fas fa-funnel-dollar','fas fa-futbol','far fa-futbol','fab fa-galactic-republic','fab fa-galactic-senate','fas fa-gamepad','fas fa-gas-pump','fas fa-gavel','fas fa-gem','far fa-gem','fas fa-genderless','fab fa-get-pocket','fab fa-gg','fab fa-gg-circle','fas fa-ghost','fas fa-gift','fas fa-gifts','fab fa-git','fab fa-git-alt','fab fa-git-square','fab fa-github','fab fa-github-alt','fab fa-github-square','fab fa-gitkraken','fab fa-gitlab','fab fa-gitter','fas fa-glass-cheers','fas fa-glass-martini','fas fa-glass-martini-alt','fas fa-glass-whiskey','fas fa-glasses','fab fa-glide','fab fa-glide-g','fas fa-globe','fas fa-globe-africa','fas fa-globe-americas','fas fa-globe-asia','fas fa-globe-europe','fab fa-gofore','fas fa-golf-ball','fab fa-goodreads','fab fa-goodreads-g','fab fa-google','fab fa-google-drive','fab fa-google-pay','fab fa-google-play','fab fa-google-plus','fab fa-google-plus-g','fab fa-google-plus-square','fab fa-google-wallet','fas fa-gopuram','fas fa-graduation-cap','fab fa-gratipay','fab fa-grav','fas fa-greater-than','fas fa-greater-than-equal','fas fa-grimace','far fa-grimace','fas fa-grin','far fa-grin','fas fa-grin-alt','far fa-grin-alt','fas fa-grin-beam','far fa-grin-beam','fas fa-grin-beam-sweat','far fa-grin-beam-sweat','fas fa-grin-hearts','far fa-grin-hearts','fas fa-grin-squint','far fa-grin-squint','fas fa-grin-squint-tears','far fa-grin-squint-tears','fas fa-grin-stars','far fa-grin-stars','fas fa-grin-tears','far fa-grin-tears','fas fa-grin-tongue','far fa-grin-tongue','fas fa-grin-tongue-squint','far fa-grin-tongue-squint','fas fa-grin-tongue-wink','far fa-grin-tongue-wink','fas fa-grin-wink','far fa-grin-wink','fas fa-grip-horizontal','fas fa-grip-lines','fas fa-grip-lines-vertical','fas fa-grip-vertical','fab fa-gripfire','fab fa-grunt','fab fa-guilded','fas fa-guitar','fab fa-gulp','fas fa-h-square','fab fa-hacker-news','fab fa-hacker-news-square','fab fa-hackerrank','fas fa-hamburger','fas fa-hammer','fas fa-hamsa','fas fa-hand-holding','fas fa-hand-holding-heart','fas fa-hand-holding-medical','fas fa-hand-holding-usd','fas fa-hand-holding-water','fas fa-hand-lizard','far fa-hand-lizard','fas fa-hand-middle-finger','fas fa-hand-paper','far fa-hand-paper','fas fa-hand-peace','far fa-hand-peace','fas fa-hand-point-down','far fa-hand-point-down','fas fa-hand-point-left','far fa-hand-point-left','fas fa-hand-point-right','far fa-hand-point-right','fas fa-hand-point-up','far fa-hand-point-up','fas fa-hand-pointer','far fa-hand-pointer','fas fa-hand-rock','far fa-hand-rock','fas fa-hand-scissors','far fa-hand-scissors','fas fa-hand-sparkles','fas fa-hand-spock','far fa-hand-spock','fas fa-hands','fas fa-hands-helping','fas fa-hands-wash','fas fa-handshake','far fa-handshake','fas fa-handshake-alt-slash','fas fa-handshake-slash','fas fa-hanukiah','fas fa-hard-hat','fas fa-hashtag','fas fa-hat-cowboy','fas fa-hat-cowboy-side','fas fa-hat-wizard','fas fa-hdd','far fa-hdd','fas fa-head-side-cough','fas fa-head-side-cough-slash','fas fa-head-side-mask','fas fa-head-side-virus','fas fa-heading','fas fa-headphones','fas fa-headphones-alt','fas fa-headset','fas fa-heart','far fa-heart','fas fa-heart-broken','fas fa-heartbeat','fas fa-helicopter','fas fa-highlighter','fas fa-hiking','fas fa-hippo','fab fa-hips','fab fa-hire-a-helper','fas fa-history','fab fa-hive','fas fa-hockey-puck','fas fa-holly-berry','fas fa-home','fab fa-hooli','fab fa-hornbill','fas fa-horse','fas fa-horse-head','fas fa-hospital','far fa-hospital','fas fa-hospital-alt','fas fa-hospital-symbol','fas fa-hospital-user','fas fa-hot-tub','fas fa-hotdog','fas fa-hotel','fab fa-hotjar','fas fa-hourglass','far fa-hourglass','fas fa-hourglass-end','fas fa-hourglass-half','fas fa-hourglass-start','fas fa-house-damage','fas fa-house-user','fab fa-houzz','fas fa-hryvnia','fab fa-html5','fab fa-hubspot','fas fa-i-cursor','fas fa-ice-cream','fas fa-icicles','fas fa-icons','fas fa-id-badge','far fa-id-badge','fas fa-id-card','far fa-id-card','fas fa-id-card-alt','fab fa-ideal','fas fa-igloo','fas fa-image','far fa-image','fas fa-images','far fa-images','fab fa-imdb','fas fa-inbox','fas fa-indent','fas fa-industry','fas fa-infinity','fas fa-info','fas fa-info-circle','fab fa-innosoft','fab fa-instagram','fab fa-instagram-square','fab fa-instalod','fab fa-intercom','fab fa-internet-explorer','fab fa-invision','fab fa-ioxhost','fas fa-italic','fab fa-itch-io','fab fa-itunes','fab fa-itunes-note','fab fa-java','fas fa-jedi','fab fa-jedi-order','fab fa-jenkins','fab fa-jira','fab fa-joget','fas fa-joint','fab fa-joomla','fas fa-journal-whills','fab fa-js','fab fa-js-square','fab fa-jsfiddle','fas fa-kaaba','fab fa-kaggle','fas fa-key','fab fa-keybase','fas fa-keyboard','far fa-keyboard','fab fa-keycdn','fas fa-khanda','fab fa-kickstarter','fab fa-kickstarter-k','fas fa-kiss','far fa-kiss','fas fa-kiss-beam','far fa-kiss-beam','fas fa-kiss-wink-heart','far fa-kiss-wink-heart','fas fa-kiwi-bird','fab fa-korvue','fas fa-landmark','fas fa-language','fas fa-laptop','fas fa-laptop-code','fas fa-laptop-house','fas fa-laptop-medical','fab fa-laravel','fab fa-lastfm','fab fa-lastfm-square','fas fa-laugh','far fa-laugh','fas fa-laugh-beam','far fa-laugh-beam','fas fa-laugh-squint','far fa-laugh-squint','fas fa-laugh-wink','far fa-laugh-wink','fas fa-layer-group','fas fa-leaf','fab fa-leanpub','fas fa-lemon','far fa-lemon','fab fa-less','fas fa-less-than','fas fa-less-than-equal','fas fa-level-down-alt','fas fa-level-up-alt','fas fa-life-ring','far fa-life-ring','fas fa-lightbulb','far fa-lightbulb','fab fa-line','fas fa-link','fab fa-linkedin','fab fa-linkedin-in','fab fa-linode','fab fa-linux','fas fa-lira-sign','fas fa-list','fas fa-list-alt','far fa-list-alt','fas fa-list-ol','fas fa-list-ul','fas fa-location-arrow','fas fa-lock','fas fa-lock-open','fas fa-long-arrow-alt-down','fas fa-long-arrow-alt-left','fas fa-long-arrow-alt-right','fas fa-long-arrow-alt-up','fas fa-low-vision','fas fa-luggage-cart','fas fa-lungs','fas fa-lungs-virus','fab fa-lyft','fab fa-magento','fas fa-magic','fas fa-magnet','fas fa-mail-bulk','fab fa-mailchimp','fas fa-male','fab fa-mandalorian','fas fa-map','far fa-map','fas fa-map-marked','fas fa-map-marked-alt','fas fa-map-marker','fas fa-map-marker-alt','fas fa-map-pin','fas fa-map-signs','fab fa-markdown','fas fa-marker','fas fa-mars','fas fa-mars-double','fas fa-mars-stroke','fas fa-mars-stroke-h','fas fa-mars-stroke-v','fas fa-mask','fab fa-mastodon','fab fa-maxcdn','fab fa-mdb','fas fa-medal','fab fa-medapps','fab fa-medium','fab fa-medium-m','fas fa-medkit','fab fa-medrt','fab fa-meetup','fab fa-megaport','fas fa-meh','far fa-meh','fas fa-meh-blank','far fa-meh-blank','fas fa-meh-rolling-eyes','far fa-meh-rolling-eyes','fas fa-memory','fab fa-mendeley','fas fa-menorah','fas fa-mercury','fas fa-meteor','fab fa-microblog','fas fa-microchip','fas fa-microphone','fas fa-microphone-alt','fas fa-microphone-alt-slash','fas fa-microphone-slash','fas fa-microscope','fab fa-microsoft','fas fa-minus','fas fa-minus-circle','fas fa-minus-square','far fa-minus-square','fas fa-mitten','fab fa-mix','fab fa-mixcloud','fab fa-mixer','fab fa-mizuni','fas fa-mobile','fas fa-mobile-alt','fab fa-modx','fab fa-monero','fas fa-money-bill','fas fa-money-bill-alt','far fa-money-bill-alt','fas fa-money-bill-wave','fas fa-money-bill-wave-alt','fas fa-money-check','fas fa-money-check-alt','fas fa-monument','fas fa-moon','far fa-moon','fas fa-mortar-pestle','fas fa-mosque','fas fa-motorcycle','fas fa-mountain','fas fa-mouse','fas fa-mouse-pointer','fas fa-mug-hot','fas fa-music','fab fa-napster','fab fa-neos','fas fa-network-wired','fas fa-neuter','fas fa-newspaper','far fa-newspaper','fab fa-nimblr','fab fa-node','fab fa-node-js','fas fa-not-equal','fas fa-notes-medical','fab fa-npm','fab fa-ns8','fab fa-nutritionix','fas fa-object-group','far fa-object-group','fas fa-object-ungroup','far fa-object-ungroup','fab fa-octopus-deploy','fab fa-odnoklassniki','fab fa-odnoklassniki-square','fas fa-oil-can','fab fa-old-republic','fas fa-om','fab fa-opencart','fab fa-openid','fab fa-opera','fab fa-optin-monster','fab fa-orcid','fab fa-osi','fas fa-otter','fas fa-outdent','fab fa-page4','fab fa-pagelines','fas fa-pager','fas fa-paint-brush','fas fa-paint-roller','fas fa-palette','fab fa-palfed','fas fa-pallet','fas fa-paper-plane','far fa-paper-plane','fas fa-paperclip','fas fa-parachute-box','fas fa-paragraph','fas fa-parking','fas fa-passport','fas fa-pastafarianism','fas fa-paste','fab fa-patreon','fas fa-pause','fas fa-pause-circle','far fa-pause-circle','fas fa-paw','fab fa-paypal','fas fa-peace','fas fa-pen','fas fa-pen-alt','fas fa-pen-fancy','fas fa-pen-nib','fas fa-pen-square','fas fa-pencil-alt','fas fa-pencil-ruler','fab fa-penny-arcade','fas fa-people-arrows','fas fa-people-carry','fas fa-pepper-hot','fab fa-perbyte','fas fa-percent','fas fa-percentage','fab fa-periscope','fas fa-person-booth','fab fa-phabricator','fab fa-phoenix-framework','fab fa-phoenix-squadron','fas fa-phone','fas fa-phone-alt','fas fa-phone-slash','fas fa-phone-square','fas fa-phone-square-alt','fas fa-phone-volume','fas fa-photo-video','fab fa-php','fab fa-pied-piper','fab fa-pied-piper-alt','fab fa-pied-piper-hat','fab fa-pied-piper-pp','fab fa-pied-piper-square','fas fa-piggy-bank','fas fa-pills','fab fa-pinterest','fab fa-pinterest-p','fab fa-pinterest-square','fas fa-pizza-slice','fas fa-place-of-worship','fas fa-plane','fas fa-plane-arrival','fas fa-plane-departure','fas fa-plane-slash','fas fa-play','fas fa-play-circle','far fa-play-circle','fab fa-playstation','fas fa-plug','fas fa-plus','fas fa-plus-circle','fas fa-plus-square','far fa-plus-square','fas fa-podcast','fas fa-poll','fas fa-poll-h','fas fa-poo','fas fa-poo-storm','fas fa-poop','fas fa-portrait','fas fa-pound-sign','fas fa-power-off','fas fa-pray','fas fa-praying-hands','fas fa-prescription','fas fa-prescription-bottle','fas fa-prescription-bottle-alt','fas fa-print','fas fa-procedures','fab fa-product-hunt','fas fa-project-diagram','fas fa-pump-medical','fas fa-pump-soap','fab fa-pushed','fas fa-puzzle-piece','fab fa-python','fab fa-qq','fas fa-qrcode','fas fa-question','fas fa-question-circle','far fa-question-circle','fas fa-quidditch','fab fa-quinscape','fab fa-quora','fas fa-quote-left','fas fa-quote-right','fas fa-quran','fab fa-r-project','fas fa-radiation','fas fa-radiation-alt','fas fa-rainbow','fas fa-random','fab fa-raspberry-pi','fab fa-ravelry','fab fa-react','fab fa-reacteurope','fab fa-readme','fab fa-rebel','fas fa-receipt','fas fa-record-vinyl','fas fa-recycle','fab fa-red-river','fab fa-reddit','fab fa-reddit-alien','fab fa-reddit-square','fab fa-redhat','fas fa-redo','fas fa-redo-alt','fas fa-registered','far fa-registered','fas fa-remove-format','fab fa-renren','fas fa-reply','fas fa-reply-all','fab fa-replyd','fas fa-republican','fab fa-researchgate','fab fa-resolving','fas fa-restroom','fas fa-retweet','fab fa-rev','fas fa-ribbon','fas fa-ring','fas fa-road','fas fa-robot','fas fa-rocket','fab fa-rocketchat','fab fa-rockrms','fas fa-route','fas fa-rss','fas fa-rss-square','fas fa-ruble-sign','fas fa-ruler','fas fa-ruler-combined','fas fa-ruler-horizontal','fas fa-ruler-vertical','fas fa-running','fas fa-rupee-sign','fab fa-rust','fas fa-sad-cry','far fa-sad-cry','fas fa-sad-tear','far fa-sad-tear','fab fa-safari','fab fa-salesforce','fab fa-sass','fas fa-satellite','fas fa-satellite-dish','fas fa-save','far fa-save','fab fa-schlix','fas fa-school','fas fa-screwdriver','fab fa-scribd','fas fa-scroll','fas fa-sd-card','fas fa-search','fas fa-search-dollar','fas fa-search-location','fas fa-search-minus','fas fa-search-plus','fab fa-searchengin','fas fa-seedling','fab fa-sellcast','fab fa-sellsy','fas fa-server','fab fa-servicestack','fas fa-shapes','fas fa-share','fas fa-share-alt','fas fa-share-alt-square','fas fa-share-square','far fa-share-square','fas fa-shekel-sign','fas fa-shield-alt','fas fa-shield-virus','fas fa-ship','fas fa-shipping-fast','fab fa-shirtsinbulk','fas fa-shoe-prints','fab fa-shopify','fas fa-shopping-bag','fas fa-shopping-basket','fas fa-shopping-cart','fab fa-shopware','fas fa-shower','fas fa-shuttle-van','fas fa-sign','fas fa-sign-in-alt','fas fa-sign-language','fas fa-sign-out-alt','fas fa-signal','fas fa-signature','fas fa-sim-card','fab fa-simplybuilt','fas fa-sink','fab fa-sistrix','fas fa-sitemap','fab fa-sith','fas fa-skating','fab fa-sketch','fas fa-skiing','fas fa-skiing-nordic','fas fa-skull','fas fa-skull-crossbones','fab fa-skyatlas','fab fa-skype','fab fa-slack','fab fa-slack-hash','fas fa-slash','fas fa-sleigh','fas fa-sliders-h','fab fa-slideshare','fas fa-smile','far fa-smile','fas fa-smile-beam','far fa-smile-beam','fas fa-smile-wink','far fa-smile-wink','fas fa-smog','fas fa-smoking','fas fa-smoking-ban','fas fa-sms','fab fa-snapchat','fab fa-snapchat-ghost','fab fa-snapchat-square','fas fa-snowboarding','fas fa-snowflake','far fa-snowflake','fas fa-snowman','fas fa-snowplow','fas fa-soap','fas fa-socks','fas fa-solar-panel','fas fa-sort','fas fa-sort-alpha-down','fas fa-sort-alpha-down-alt','fas fa-sort-alpha-up','fas fa-sort-alpha-up-alt','fas fa-sort-amount-down','fas fa-sort-amount-down-alt','fas fa-sort-amount-up','fas fa-sort-amount-up-alt','fas fa-sort-down','fas fa-sort-numeric-down','fas fa-sort-numeric-down-alt','fas fa-sort-numeric-up','fas fa-sort-numeric-up-alt','fas fa-sort-up','fab fa-soundcloud','fab fa-sourcetree','fas fa-spa','fas fa-space-shuttle','fab fa-speakap','fab fa-speaker-deck','fas fa-spell-check','fas fa-spider','fas fa-spinner','fas fa-splotch','fab fa-spotify','fas fa-spray-can','fas fa-square','far fa-square','fas fa-square-full','fas fa-square-root-alt','fab fa-squarespace','fab fa-stack-exchange','fab fa-stack-overflow','fab fa-stackpath','fas fa-stamp','fas fa-star','far fa-star','fas fa-star-and-crescent','fas fa-star-half','far fa-star-half','fas fa-star-half-alt','fas fa-star-of-david','fas fa-star-of-life','fab fa-staylinked','fab fa-steam','fab fa-steam-square','fab fa-steam-symbol','fas fa-step-backward','fas fa-step-forward','fas fa-stethoscope','fab fa-sticker-mule','fas fa-sticky-note','far fa-sticky-note','fas fa-stop','fas fa-stop-circle','far fa-stop-circle','fas fa-stopwatch','fas fa-stopwatch-20','fas fa-store','fas fa-store-alt','fas fa-store-alt-slash','fas fa-store-slash','fab fa-strava','fas fa-stream','fas fa-street-view','fas fa-strikethrough','fab fa-stripe','fab fa-stripe-s','fas fa-stroopwafel','fab fa-studiovinari','fab fa-stumbleupon','fab fa-stumbleupon-circle','fas fa-subscript','fas fa-subway','fas fa-suitcase','fas fa-suitcase-rolling','fas fa-sun','far fa-sun','fab fa-superpowers','fas fa-superscript','fab fa-supple','fas fa-surprise','far fa-surprise','fab fa-suse','fas fa-swatchbook','fab fa-swift','fas fa-swimmer','fas fa-swimming-pool','fab fa-symfony','fas fa-synagogue','fas fa-sync','fas fa-sync-alt','fas fa-syringe','fas fa-table','fas fa-table-tennis','fas fa-tablet','fas fa-tablet-alt','fas fa-tablets','fas fa-tachometer-alt','fas fa-tag','fas fa-tags','fas fa-tape','fas fa-tasks','fas fa-taxi','fab fa-teamspeak','fas fa-teeth','fas fa-teeth-open','fab fa-telegram','fab fa-telegram-plane','fas fa-temperature-high','fas fa-temperature-low','fab fa-tencent-weibo','fas fa-tenge','fas fa-terminal','fas fa-text-height','fas fa-text-width','fas fa-th','fas fa-th-large','fas fa-th-list','fab fa-the-red-yeti','fas fa-theater-masks','fab fa-themeco','fab fa-themeisle','fas fa-thermometer','fas fa-thermometer-empty','fas fa-thermometer-full','fas fa-thermometer-half','fas fa-thermometer-quarter','fas fa-thermometer-three-quarters','fab fa-think-peaks','fas fa-thumbs-down','far fa-thumbs-down','fas fa-thumbs-up','far fa-thumbs-up','fas fa-thumbtack','fas fa-ticket-alt','fab fa-tiktok','fas fa-times','fas fa-times-circle','far fa-times-circle','fas fa-tint','fas fa-tint-slash','fas fa-tired','far fa-tired','fas fa-toggle-off','fas fa-toggle-on','fas fa-toilet','fas fa-toilet-paper','fas fa-toilet-paper-slash','fas fa-toolbox','fas fa-tools','fas fa-tooth','fas fa-torah','fas fa-torii-gate','fas fa-tractor','fab fa-trade-federation','fas fa-trademark','fas fa-traffic-light','fas fa-trailer','fas fa-train','fas fa-tram','fas fa-transgender','fas fa-transgender-alt','fas fa-trash','fas fa-trash-alt','far fa-trash-alt','fas fa-trash-restore','fas fa-trash-restore-alt','fas fa-tree','fab fa-trello','fas fa-trophy','fas fa-truck','fas fa-truck-loading','fas fa-truck-monster','fas fa-truck-moving','fas fa-truck-pickup','fas fa-tshirt','fas fa-tty','fab fa-tumblr','fab fa-tumblr-square','fas fa-tv','fab fa-twitch','fab fa-twitter','fab fa-twitter-square','fab fa-typo3','fab fa-uber','fab fa-ubuntu','fab fa-uikit','fab fa-umbraco','fas fa-umbrella','fas fa-umbrella-beach','fab fa-uncharted','fas fa-underline','fas fa-undo','fas fa-undo-alt','fab fa-uniregistry','fab fa-unity','fas fa-universal-access','fas fa-university','fas fa-unlink','fas fa-unlock','fas fa-unlock-alt','fab fa-unsplash','fab fa-untappd','fas fa-upload','fab fa-ups','fab fa-usb','fas fa-user','far fa-user','fas fa-user-alt','fas fa-user-alt-slash','fas fa-user-astronaut','fas fa-user-check','fas fa-user-circle','far fa-user-circle','fas fa-user-clock','fas fa-user-cog','fas fa-user-edit','fas fa-user-friends','fas fa-user-graduate','fas fa-user-injured','fas fa-user-lock','fas fa-user-md','fas fa-user-minus','fas fa-user-ninja','fas fa-user-nurse','fas fa-user-plus','fas fa-user-secret','fas fa-user-shield','fas fa-user-slash','fas fa-user-tag','fas fa-user-tie','fas fa-user-times','fas fa-users','fas fa-users-cog','fas fa-users-slash','fab fa-usps','fab fa-ussunnah','fas fa-utensil-spoon','fas fa-utensils','fab fa-vaadin','fas fa-vector-square','fas fa-venus','fas fa-venus-double','fas fa-venus-mars','fas fa-vest','fas fa-vest-patches','fab fa-viacoin','fab fa-viadeo','fab fa-viadeo-square','fas fa-vial','fas fa-vials','fab fa-viber','fas fa-video','fas fa-video-slash','fas fa-vihara','fab fa-vimeo','fab fa-vimeo-square','fab fa-vimeo-v','fab fa-vine','fas fa-virus','fas fa-virus-slash','fas fa-viruses','fab fa-vk','fab fa-vnv','fas fa-voicemail','fas fa-volleyball-ball','fas fa-volume-down','fas fa-volume-mute','fas fa-volume-off','fas fa-volume-up','fas fa-vote-yea','fas fa-vr-cardboard','fab fa-vuejs','fas fa-walking','fas fa-wallet','fas fa-warehouse','fab fa-watchman-monitoring','fas fa-water','fas fa-wave-square','fab fa-waze','fab fa-weebly','fab fa-weibo','fas fa-weight','fas fa-weight-hanging','fab fa-weixin','fab fa-whatsapp','fab fa-whatsapp-square','fas fa-wheelchair','fab fa-whmcs','fas fa-wifi','fab fa-wikipedia-w','fas fa-wind','fas fa-window-close','far fa-window-close','fas fa-window-maximize','far fa-window-maximize','fas fa-window-minimize','far fa-window-minimize','fas fa-window-restore','far fa-window-restore','fab fa-windows','fas fa-wine-bottle','fas fa-wine-glass','fas fa-wine-glass-alt','fab fa-wix','fab fa-wizards-of-the-coast','fab fa-wodu','fab fa-wolf-pack-battalion','fas fa-won-sign','fab fa-wordpress','fab fa-wordpress-simple','fab fa-wpbeginner','fab fa-wpexplorer','fab fa-wpforms','fab fa-wpressr','fas fa-wrench','fas fa-x-ray','fab fa-xbox','fab fa-xing','fab fa-xing-square','fab fa-y-combinator','fab fa-yahoo','fab fa-yammer','fab fa-yandex','fab fa-yandex-international','fab fa-yarn','fab fa-yelp','fas fa-yen-sign','fas fa-yin-yang','fab fa-yoast','fab fa-youtube','fab fa-youtube-square','fab fa-zhihu' )\n    ) );\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/icon/icon.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: icon\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_icon' ) ) {\n  class CSF_Field_icon extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'button_title' => esc_html__( 'Add Icon', 'csf' ),\n        'remove_title' => esc_html__( 'Remove Icon', 'csf' ),\n      ) );\n\n      echo $this->field_before();\n\n      $nonce  = wp_create_nonce( 'csf_icon_nonce' );\n      $hidden = ( empty( $this->value ) ) ? ' hidden' : '';\n\n      echo '<div class=\"csf-icon-select\">';\n      echo '<span class=\"csf-icon-preview'. esc_attr( $hidden ) .'\"><i class=\"'. esc_attr( $this->value ) .'\"></i></span>';\n      echo '<a href=\"#\" class=\"button button-primary csf-icon-add\" data-nonce=\"'. esc_attr( $nonce ) .'\">'. $args['button_title'] .'</a>';\n      echo '<a href=\"#\" class=\"button csf-warning-primary csf-icon-remove'. esc_attr( $hidden ) .'\">'. $args['remove_title'] .'</a>';\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $this->value ) .'\" class=\"csf-icon-value\"'. $this->field_attributes() .' />';\n      echo '</div>';\n\n      echo $this->field_after();\n\n    }\n\n    public function enqueue($enq_js = true) {\n//      add_action( 'admin_footer', array( 'CSF_Field_icon', 'add_footer_modal_icon' ) );\n//      add_action( 'customize_controls_print_footer_scripts', array( 'CSF_Field_icon', 'add_footer_modal_icon' ) );\n        if ($enq_js){\n            self::add_footer_modal_icon();\n        }\n    }\n\n    public static function add_footer_modal_icon() {\n    ?>\n      <div id=\"csf-modal-icon\" class=\"csf-modal csf-modal-icon hidden\">\n        <div class=\"csf-modal-table\">\n          <div class=\"csf-modal-table-cell\">\n            <div class=\"csf-modal-overlay\"></div>\n            <div class=\"csf-modal-inner\">\n              <div class=\"csf-modal-title\">\n                <?php esc_html_e( 'Add Icon', 'csf' ); ?>\n                <div class=\"csf-modal-close csf-icon-close\"></div>\n              </div>\n              <div class=\"csf-modal-header\">\n                <input type=\"text\" placeholder=\"<?php esc_html_e( 'Search...', 'csf' ); ?>\" class=\"csf-icon-search\" />\n              </div>\n              <div class=\"csf-modal-content\">\n                <div class=\"csf-modal-loading\"><div class=\"csf-loading\"></div></div>\n                <div class=\"csf-modal-load\"></div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    <?php\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/image_select/image_select.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: image_select\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_image_select' ) ) {\n  class CSF_Field_image_select extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'multiple' => false,\n        'inline'   => false,\n        'options'  => array(),\n      ) );\n\n      $inline = ( $args['inline'] ) ? ' csf--inline-list' : '';\n\n      $value = ( is_array( $this->value ) ) ? $this->value : array_filter( (array) $this->value );\n\n      echo $this->field_before();\n\n      if ( ! empty( $args['options'] ) ) {\n\n        echo '<div class=\"csf-siblings csf--image-group'. esc_attr( $inline ) .'\" data-multiple=\"'. esc_attr( $args['multiple'] ) .'\">';\n\n        $num = 1;\n\n        foreach ( $args['options'] as $key => $option ) {\n\n          $type    = ( $args['multiple'] ) ? 'checkbox' : 'radio';\n          $extra   = ( $args['multiple'] ) ? '[]' : '';\n          $active  = ( in_array( $key, $value ) ) ? ' csf--active' : '';\n          $checked = ( in_array( $key, $value ) ) ? ' checked' : '';\n\n          echo '<div class=\"csf--sibling csf--image'. esc_attr( $active ) .'\">';\n            echo '<figure>';\n              echo '<img src=\"'. esc_url( $option ) .'\" alt=\"img-'. esc_attr( $num++ ) .'\" />';\n              echo '<input type=\"'. esc_attr( $type ) .'\" name=\"'. esc_attr( $this->field_name( $extra ) ) .'\" value=\"'. esc_attr( $key ) .'\"'. $this->field_attributes() . esc_attr( $checked ) .'/>';\n            echo '</figure>';\n          echo '</div>';\n\n        }\n\n        echo '</div>';\n\n      }\n\n      echo $this->field_after();\n\n    }\n\n    public function output() {\n\n      $output    = '';\n      $bg_image  = array();\n      $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : '';\n      $elements  = ( is_array( $this->field['output'] ) ) ? join( ',', $this->field['output'] ) : $this->field['output'];\n\n      if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) {\n        $output = $elements .'{background-image:url('. $this->value .')'. $important .';}';\n      }\n\n      $this->parent->output_css .= $output;\n\n      return $output;\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/index.php",
    "content": "<?php // Silence is golden.\n"
  },
  {
    "path": "配套插件/BsCore/fields/link/link.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: link\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_link' ) ) {\n  class CSF_Field_link extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'add_title'    => esc_html__( 'Add Link', 'csf' ),\n        'edit_title'   => esc_html__( 'Edit Link', 'csf' ),\n        'remove_title' => esc_html__( 'Remove Link', 'csf' ),\n      ) );\n\n      $default_values = array(\n        'url'    => '',\n        'text'  => '',\n        'target' => '',\n      );\n\n      $value = wp_parse_args( $this->value, $default_values );\n\n      $hidden = ( ! empty( $value['url'] ) || ! empty( $value['url'] ) || ! empty( $value['url'] ) ) ? ' hidden' : '';\n\n      $maybe_hidden = ( empty( $hidden ) ) ? ' hidden' : '';\n\n      echo $this->field_before();\n\n      echo '<textarea readonly=\"readonly\" class=\"csf--link hidden\"></textarea>';\n\n      echo '<div class=\"'. esc_attr( $maybe_hidden ) .'\"><div class=\"csf--result\">'. sprintf( '{url:\"%s\", text:\"%s\", target:\"%s\"}', $value['url'], $value['text'], $value['target'] ) .'</div></div>';\n\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[url]' ) ) .'\" value=\"'. esc_attr( $value['url'] ) .'\"'. $this->field_attributes( array( 'class' => 'csf--url' ) ) .' />';\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[text]' ) ) .'\" value=\"'. esc_attr( $value['text'] ) .'\" class=\"csf--text\" />';\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[target]' ) ) .'\" value=\"'. esc_attr( $value['target'] ) .'\" class=\"csf--target\" />';\n\n      echo '<a href=\"#\" class=\"button button-primary csf--add'. esc_attr( $hidden ) .'\">'. $args['add_title'] .'</a> ';\n      echo '<a href=\"#\" class=\"button csf--edit'. esc_attr( $maybe_hidden ) .'\">'. $args['edit_title'] .'</a> ';\n      echo '<a href=\"#\" class=\"button csf-warning-primary csf--remove'. esc_attr( $maybe_hidden ) .'\">'. $args['remove_title'] .'</a>';\n\n      echo $this->field_after();\n\n    }\n\n    public function enqueue($enq_js = true) {\n\n//      if ( ! wp_script_is( 'wplink' ) ) {\n//        wp_enqueue_script( 'wplink' );\n//      }\n//\n//      if ( ! wp_script_is( 'jquery-ui-autocomplete' ) ) {\n//        wp_enqueue_script( 'jquery-ui-autocomplete' );\n//      }\n\n//      add_action( 'admin_print_footer_scripts', array( $this, 'add_wp_link_dialog' ) );\n        if ($enq_js){\n            $js_ = wp_localize_script('wplink',\n                'wpLinkL10n',\n                array(\n                    'title'          => __( 'Insert/edit link' ),\n                    'update'         => __( 'Update' ),\n                    'save'           => __( 'Add Link' ),\n                    'noTitle'        => __( '(no title)' ),\n                    'noMatchesFound' => __( 'No results found.' ),\n                    'linkSelected'   => __( 'Link selected.' ),\n                    'linkInserted'   => __( 'Link inserted.' ),\n                    /* translators: Minimum input length in characters to start searching posts in the \"Insert/edit link\" modal. */\n                    'minInputLength' => \"3\"// __( 'minimum input length for searching post links' ),\n                )). enqueue_script_helper('wplink');\n            $this->wp_link_dialog();\n            return $js_;\n        }\n    }\n\n    public function add_wp_link_dialog() {\n\n//      if ( ! class_exists( '_WP_Editors' ) ) {\n//        require_once ABSPATH . WPINC .'/class-wp-editor.php';\n//      }\n\n//      wp_print_styles( 'editor-buttons' );\n//\n//      _WP_Editors::wp_link_dialog();\n\n    }\n    public function wp_link_dialog() {\n          // `display: none` is required here, see #WP27605.\n          ?>\n          <div id=\"wp-link-backdrop\" style=\"display: none\"></div>\n          <div id=\"wp-link-wrap\" class=\"wp-core-ui\" style=\"display: none\" role=\"dialog\" aria-labelledby=\"link-modal-title\">\n              <form id=\"wp-link\" tabindex=\"-1\">\n                  <?php wp_nonce_field( 'internal-linking', '_ajax_linking_nonce', false ); ?>\n                  <h1 id=\"link-modal-title\"><?php _e( '插入/编辑 链接' ); ?></h1>\n                  <button type=\"button\" id=\"wp-link-close\"><span class=\"screen-reader-text\"><?php _e( '关闭' ); ?></span></button>\n                  <div id=\"link-selector\">\n                      <div id=\"link-options\">\n                          <p class=\"howto\" id=\"wplink-enter-url\"><?php _e( '输入目标网址' ); ?></p>\n                          <div>\n                              <label><span><?php _e( '网址' ); ?></span>\n                                  <input id=\"wp-link-url\" type=\"text\" aria-describedby=\"wplink-enter-url\" /></label>\n                          </div>\n                          <div class=\"wp-link-text-field\">\n                              <label><span><?php _e( '文本' ); ?></span>\n                                  <input id=\"wp-link-text\" type=\"text\" /></label>\n                          </div>\n                          <div class=\"link-target\">\n                              <label><span></span>\n                                  <input type=\"checkbox\" id=\"wp-link-target\" /> <?php _e( '在新标签打开' ); ?></label>\n                          </div>\n                      </div>\n                      <!--                        <p class=\"howto\" id=\"wplink-link-existing-content\">--><?php //_e( '或者链接到已存在的内容' ); ?><!--</p>-->\n                      <!--                        <div id=\"search-panel\">-->\n                      <!--                            <div class=\"link-search-wrapper\">-->\n                      <!--                                <label>-->\n                      <!--                                    <span class=\"search-label\">--><?php //_e( '搜索' ); ?><!--</span>-->\n                      <!--                                    <input type=\"search\" id=\"wp-link-search\" class=\"link-search-field\" autocomplete=\"off\" aria-describedby=\"wplink-link-existing-content\" />-->\n                      <!--                                    <span class=\"spinner\"></span>-->\n                      <!--                                </label>-->\n                      <!--                            </div>-->\n                      <!--                            <div id=\"search-results\" class=\"query-results\" tabindex=\"0\">-->\n                      <!--                                <ul></ul>-->\n                      <!--                                <div class=\"river-waiting\">-->\n                      <!--                                    <span class=\"spinner\"></span>-->\n                      <!--                                </div>-->\n                      <!--                            </div>-->\n                      <!--                            <div id=\"most-recent-results\" class=\"query-results\" tabindex=\"0\">-->\n                      <!--                                <div class=\"query-notice\" id=\"query-notice-message\">-->\n                      <!--                                    <em class=\"query-notice-default\">--><?php //_e( '未指定搜索词。 显示最近的项目。' ); ?><!--</em>-->\n                      <!--                                    <em class=\"query-notice-hint screen-reader-text\">--><?php //__( '搜索或使用向上和向下箭头键选择项目。' ); ?><!--</em>-->\n                      <!--                                </div>-->\n                      <!--                                <ul></ul>-->\n                      <!--                                <div class=\"river-waiting\">-->\n                      <!--                                    <span class=\"spinner\"></span>-->\n                      <!--                                </div>-->\n                      <!--                            </div>-->\n                      <!--                        </div>-->\n                  </div>\n                  <div class=\"submitbox\">\n                      <div id=\"wp-link-cancel\">\n                          <button type=\"button\" class=\"button\"><?php _e( '取消' ); ?></button>\n                      </div>\n                      <div id=\"wp-link-update\">\n                          <input type=\"submit\" value=\"<?php _e( '添加链接' ); ?>\" class=\"button button-primary\" id=\"wp-link-submit\" name=\"wp-link-submit\">\n                      </div>\n                  </div>\n              </form>\n          </div>\n          <?php\n\n      }\n\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/link_color/link_color.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: link_color\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_link_color' ) ) {\n  class CSF_Field_link_color extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'color'   => true,\n        'hover'   => true,\n        'active'  => false,\n        'visited' => false,\n        'focus'   => false,\n      ) );\n\n      $default_values = array(\n        'color'   => '',\n        'hover'   => '',\n        'active'  => '',\n        'visited' => '',\n        'focus'   => '',\n      );\n\n      $color_props = array(\n        'color'    => esc_html__( 'Normal', 'csf' ),\n        'hover'    => esc_html__( 'Hover', 'csf' ),\n        'active'   => esc_html__( 'Active', 'csf' ),\n        'visited'  => esc_html__( 'Visited', 'csf' ),\n        'focus'    => esc_html__( 'Focus', 'csf' )\n      );\n\n      $value = wp_parse_args( $this->value, $default_values );\n\n      echo $this->field_before();\n\n      foreach ( $color_props as $color_prop_key => $color_prop_value ) {\n\n        if ( ! empty( $args[$color_prop_key] ) ) {\n\n          $default_attr = ( ! empty( $this->field['default'][$color_prop_key] ) ) ? ' data-default-color=\"'. esc_attr( $this->field['default'][$color_prop_key] ) .'\"' : '';\n\n          echo '<div class=\"csf--left csf-field-color\">';\n          echo '<div class=\"csf--title\">'. esc_attr( $color_prop_value ) .'</div>';\n          echo '<input type=\"text\" name=\"'. esc_attr( $this->field_name( '['. $color_prop_key .']' ) ) .'\" value=\"'. esc_attr( $value[$color_prop_key] ) .'\" class=\"csf-color\"'. $default_attr . $this->field_attributes() .'/>';\n          echo '</div>';\n\n        }\n\n      }\n\n      echo $this->field_after();\n\n    }\n\n    public function output() {\n\n      $output    = '';\n      $elements  = ( is_array( $this->field['output'] ) ) ? $this->field['output'] : array_filter( (array) $this->field['output'] );\n      $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : '';\n\n      if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) {\n        foreach ( $elements as $element ) {\n\n          if ( isset( $this->value['color']   ) && $this->value['color']   !== '' ) { $output .= $element .'{color:'.         $this->value['color']   . $important .';}'; }\n          if ( isset( $this->value['hover']   ) && $this->value['hover']   !== '' ) { $output .= $element .':hover{color:'.   $this->value['hover']   . $important .';}'; }\n          if ( isset( $this->value['active']  ) && $this->value['active']  !== '' ) { $output .= $element .':active{color:'.  $this->value['active']  . $important .';}'; }\n          if ( isset( $this->value['visited'] ) && $this->value['visited'] !== '' ) { $output .= $element .':visited{color:'. $this->value['visited'] . $important .';}'; }\n          if ( isset( $this->value['focus']   ) && $this->value['focus']   !== '' ) { $output .= $element .':focus{color:'.   $this->value['focus']   . $important .';}'; }\n\n        }\n      }\n\n      $this->parent->output_css .= $output;\n\n      return $output;\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/map/map.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: map\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_map' ) ) {\n  class CSF_Field_map extends CSF_Fields {\n\n    public $version = '1.7.1';\n    public $cdn_url = 'https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/leaflet/';\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args              = wp_parse_args( $this->field, array(\n        'placeholder'    => esc_html__( 'Search...', 'csf' ),\n        'latitude_text'  => esc_html__( 'Latitude', 'csf' ),\n        'longitude_text' => esc_html__( 'Longitude', 'csf' ),\n        'address_field'  => '',\n        'height'         => '',\n      ) );\n\n      $value             = wp_parse_args( $this->value, array(\n        'address'        => '',\n        'latitude'       => '20',\n        'longitude'      => '0',\n        'zoom'           => '2',\n      ) );\n\n      $default_settings   = array(\n        'center'          => array( $value['latitude'], $value['longitude'] ),\n        'zoom'            => $value['zoom'],\n        'scrollWheelZoom' => false,\n      );\n\n      $settings = ( ! empty( $this->field['settings'] ) ) ? $this->field['settings'] : array();\n      $settings = wp_parse_args( $settings, $default_settings );\n\n      $style_attr  = ( ! empty( $args['height'] ) ) ? ' style=\"min-height:'. esc_attr( $args['height'] ) .';\"' : '';\n      $placeholder = ( ! empty( $args['placeholder'] ) ) ? array( 'placeholder' => $args['placeholder'] ) : '';\n\n      echo $this->field_before();\n\n      if ( empty( $args['address_field'] ) ) {\n        echo '<div class=\"csf--map-search\">';\n        echo '<input type=\"text\" name=\"'. esc_attr( $this->field_name( '[address]' ) ) .'\" value=\"'. esc_attr( $value['address'] ) .'\"'. $this->field_attributes( $placeholder ) .' />';\n        echo '</div>';\n      } else {\n        echo '<div class=\"csf--address-field\" data-address-field=\"'. esc_attr( $args['address_field'] ) .'\"></div>';\n      }\n\n      echo '<div class=\"csf--map-osm-wrap\"><div class=\"csf--map-osm\" data-map=\"'. esc_attr( json_encode( $settings ) ) .'\"'. $style_attr .'></div></div>';\n\n      echo '<div class=\"csf--map-inputs\">';\n\n        echo '<div class=\"csf--map-input\">';\n        echo '<label>'. esc_attr( $args['latitude_text'] ) .'</label>';\n        echo '<input type=\"text\" name=\"'. esc_attr( $this->field_name( '[latitude]' ) ) .'\" value=\"'. esc_attr( $value['latitude'] ) .'\" class=\"csf--latitude\" />';\n        echo '</div>';\n\n        echo '<div class=\"csf--map-input\">';\n        echo '<label>'. esc_attr( $args['longitude_text'] ) .'</label>';\n        echo '<input type=\"text\" name=\"'. esc_attr( $this->field_name( '[longitude]' ) ) .'\" value=\"'. esc_attr( $value['longitude'] ) .'\" class=\"csf--longitude\" />';\n        echo '</div>';\n\n      echo '</div>';\n\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[zoom]' ) ) .'\" value=\"'. esc_attr( $value['zoom'] ) .'\" class=\"csf--zoom\" />';\n\n      echo $this->field_after();\n\n    }\n\n    public function enqueue($enq_js = true) {\n\n//      if ( ! wp_script_is( 'csf-leaflet' ) ) {\n//        wp_enqueue_script( 'csf-leaflet', esc_url( $this->cdn_url . $this->version .'/dist/leaflet.js' ), array( 'csf' ), $this->version, true );\n//      }\n//\n//      if ( ! wp_style_is( 'csf-leaflet' ) ) {\n//        wp_enqueue_style( 'csf-leaflet', esc_url( $this->cdn_url . $this->version .'/dist/leaflet.css' ), array(), $this->version );\n//      }\n//\n//      if ( ! wp_script_is( 'jquery-ui-autocomplete' ) ) {\n//        wp_enqueue_script( 'jquery-ui-autocomplete' );\n//      }\n\n        if ($enq_js){\n            return enqueue_script_helper('csf-leaflet', esc_url( $this->cdn_url . $this->version .'/leaflet.min.js' )).enqueue_script_helper('jquery-ui-autocomplete');\n        } else {\n            return enqueue_style_helper('csf-leaflet', esc_url( $this->cdn_url . $this->version .'/leaflet.min.css'));\n        }\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/media/media.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: media\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_media' ) ) {\n  class CSF_Field_media extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'url'            => true,\n        'preview'        => true,\n        'preview_width'  => '',\n        'preview_height' => '',\n        'library'        => array(),\n        'button_title'   => esc_html__( 'Upload', 'csf' ),\n        'remove_title'   => esc_html__( 'Remove', 'csf' ),\n        'preview_size'   => 'thumbnail',\n      ) );\n\n      $default_values = array(\n        'url'         => '',\n        'id'          => '',\n        'width'       => '',\n        'height'      => '',\n        'thumbnail'   => '',\n        'alt'         => '',\n        'title'       => '',\n        'description' => ''\n      );\n\n      // fallback\n      if ( is_numeric( $this->value ) ) {\n\n        $this->value  = array(\n          'id'        => $this->value,\n          'url'       => wp_get_attachment_url( $this->value ),\n          'thumbnail' => wp_get_attachment_image_src( $this->value, 'thumbnail', true )[0],\n        );\n\n      }\n\n      $this->value = wp_parse_args( $this->value, $default_values );\n\n      $library     = ( is_array( $args['library'] ) ) ? $args['library'] : array_filter( (array) $args['library'] );\n      $library     = ( ! empty( $library ) ) ? implode(',', $library ) : '';\n      $preview_src = ( $args['preview_size'] !== 'thumbnail' ) ? $this->value['url'] : $this->value['thumbnail'];\n      $hidden_url  = ( empty( $args['url'] ) ) ? ' hidden' : '';\n      $hidden_auto = ( empty( $this->value['url'] ) ) ? ' hidden' : '';\n      $placeholder = ( empty( $this->field['placeholder'] ) ) ? ' placeholder=\"'.  esc_html__( 'Not selected', 'csf' ) .'\"' : '';\n\n      echo $this->field_before();\n\n      if ( ! empty( $args['preview'] ) ) {\n\n        $preview_width  = ( ! empty( $args['preview_width'] ) ) ? 'max-width:'. esc_attr( $args['preview_width'] ) .'px;' : '';\n        $preview_height = ( ! empty( $args['preview_height'] ) ) ? 'max-height:'. esc_attr( $args['preview_height'] ) .'px;' : '';\n        $preview_style  = ( ! empty( $preview_width ) || ! empty( $preview_height ) ) ? ' style=\"'. esc_attr( $preview_width . $preview_height ) .'\"': '';\n\n        echo '<div class=\"csf--preview'. esc_attr( $hidden_auto ) .'\">';\n        echo '<div class=\"csf-image-preview\"'. $preview_style .'>';\n        echo '<i class=\"csf--remove fas fa-times\"></i><span><img src=\"'. esc_url( $preview_src ) .'\" class=\"csf--src\" /></span>';\n        echo '</div>';\n        echo '</div>';\n\n      }\n\n      echo '<div class=\"csf--placeholder\">';\n      echo '<input type=\"text\" name=\"'. esc_attr( $this->field_name( '[url]' ) ) .'\" value=\"'. esc_attr( $this->value['url'] ) .'\" class=\"csf--url'. esc_attr( $hidden_url ) .'\" readonly=\"readonly\"'. $this->field_attributes() . $placeholder .' />';\n      echo '<a href=\"#\" class=\"button button-primary csf--button\" data-library=\"'. esc_attr( $library ) .'\" data-preview-size=\"'. esc_attr( $args['preview_size'] ) .'\">'. $args['button_title'] .'</a>';\n      echo ( empty( $args['preview'] ) ) ? '<a href=\"#\" class=\"button button-secondary csf-warning-primary csf--remove'. esc_attr( $hidden_auto ) .'\">'. $args['remove_title'] .'</a>' : '';\n      echo '</div>';\n\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[id]' ) ) .'\" value=\"'. esc_attr( $this->value['id'] ) .'\" class=\"csf--id\"/>';\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[width]' ) ) .'\" value=\"'. esc_attr( $this->value['width'] ) .'\" class=\"csf--width\"/>';\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[height]' ) ) .'\" value=\"'. esc_attr( $this->value['height'] ) .'\" class=\"csf--height\"/>';\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[thumbnail]' ) ) .'\" value=\"'. esc_attr( $this->value['thumbnail'] ) .'\" class=\"csf--thumbnail\"/>';\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[alt]' ) ) .'\" value=\"'. esc_attr( $this->value['alt'] ) .'\" class=\"csf--alt\"/>';\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[title]' ) ) .'\" value=\"'. esc_attr( $this->value['title'] ) .'\" class=\"csf--title\"/>';\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[description]' ) ) .'\" value=\"'. esc_attr( $this->value['description'] ) .'\" class=\"csf--description\"/>';\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/notice/notice.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: notice\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_notice' ) ) {\n  class CSF_Field_notice extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $style = ( ! empty( $this->field['style'] ) ) ? $this->field['style'] : 'normal';\n\n      echo ( ! empty( $this->field['content'] ) ) ? '<div class=\"csf-notice csf-notice-'. esc_attr( $style ) .'\">'. $this->field['content'] .'</div>' : '';\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/number/number.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: number\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_number' ) ) {\n  class CSF_Field_number extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'min'  => 'any',\n        'max'  => 'any',\n        'step' => 'any',\n        'unit' => '',\n      ) );\n\n      echo $this->field_before();\n      echo '<div class=\"csf--wrap\">';\n      echo '<input type=\"number\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $this->value ) .'\"'. $this->field_attributes() .' min=\"'. esc_attr( $args['min'] ) .'\" max=\"'. esc_attr( $args['max'] ) .'\" step=\"'. esc_attr( $args['step'] ) .'\"/>';\n      echo ( ! empty( $args['unit'] ) ) ? '<span class=\"csf--unit\">'. esc_attr( $args['unit'] ) .'</span>' : '';\n      echo '</div>';\n      echo $this->field_after();\n\n    }\n\n    public function output() {\n\n      $output    = '';\n      $elements  = ( is_array( $this->field['output'] ) ) ? $this->field['output'] : array_filter( (array) $this->field['output'] );\n      $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : '';\n      $mode      = ( ! empty( $this->field['output_mode'] ) ) ? $this->field['output_mode'] : 'width';\n      $unit      = ( ! empty( $this->field['unit'] ) ) ? $this->field['unit'] : 'px';\n\n      if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) {\n        foreach ( $elements as $key_property => $element ) {\n          if ( is_numeric( $key_property ) ) {\n            if ( $mode ) {\n              $output = implode( ',', $elements ) .'{'. $mode .':'. $this->value . $unit . $important .';}';\n            }\n            break;\n          } else {\n            $output .= $element .'{'. $key_property .':'. $this->value . $unit . $important .'}';\n          }\n        }\n      }\n\n      $this->parent->output_css .= $output;\n\n      return $output;\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/palette/palette.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: palette\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_palette' ) ) {\n  class CSF_Field_palette extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $palette = ( ! empty( $this->field['options'] ) ) ? $this->field['options'] : array();\n\n      echo $this->field_before();\n\n      if ( ! empty( $palette ) ) {\n\n        echo '<div class=\"csf-siblings csf--palettes\">';\n\n        foreach ( $palette as $key => $colors ) {\n\n          $active  = ( $key === $this->value ) ? ' csf--active' : '';\n          $checked = ( $key === $this->value ) ? ' checked' : '';\n\n          echo '<div class=\"csf--sibling csf--palette'. esc_attr( $active ) .'\">';\n\n          if ( ! empty( $colors ) ) {\n\n            foreach ( $colors as $color ) {\n\n              echo '<span style=\"background-color: '. esc_attr( $color ) .';\"></span>';\n\n            }\n\n          }\n\n          echo '<input type=\"radio\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $key ) .'\"'. $this->field_attributes() . esc_attr( $checked ) .'/>';\n          echo '</div>';\n\n        }\n\n        echo '</div>';\n\n      }\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/radio/radio.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: radio\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_radio' ) ) {\n  class CSF_Field_radio extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'inline'     => false,\n        'query_args' => array(),\n      ) );\n\n      $inline_class = ( $args['inline'] ) ? ' class=\"csf--inline-list\"' : '';\n\n      echo $this->field_before();\n\n      if ( isset( $this->field['options'] ) ) {\n\n        $options = $this->field['options'];\n        $options = ( is_array( $options ) ) ? $options : array_filter( $this->field_data( $options, false, $args['query_args'] ) );\n\n        if ( is_array( $options ) && ! empty( $options ) ) {\n\n          echo '<ul'. $inline_class .'>';\n\n          foreach ( $options as $option_key => $option_value ) {\n\n            if ( is_array( $option_value ) && ! empty( $option_value ) ) {\n\n              echo '<li>';\n                echo '<ul>';\n                  echo '<li><strong>'. esc_attr( $option_key ) .'</strong></li>';\n                  foreach ( $option_value as $sub_key => $sub_value ) {\n                    $checked = ( $sub_key == $this->value ) ? ' checked' : '';\n                    echo '<li>';\n                    echo '<label>';\n                    echo '<input type=\"radio\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $sub_key ) .'\"'. $this->field_attributes() . esc_attr( $checked ) .'/>';\n                    echo '<span class=\"csf--text\">'. esc_attr( $sub_value ) .'</span>';\n                    echo '</label>';\n                    echo '</li>';\n                  }\n                echo '</ul>';\n              echo '</li>';\n\n            } else {\n\n              $checked = ( $option_key == $this->value ) ? ' checked' : '';\n\n              echo '<li>';\n              echo '<label>';\n              echo '<input type=\"radio\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $option_key ) .'\"'. $this->field_attributes() . esc_attr( $checked ) .'/>';\n              echo '<span class=\"csf--text\">'. esc_attr( $option_value ) .'</span>';\n              echo '</label>';\n              echo '</li>';\n\n            }\n\n          }\n\n          echo '</ul>';\n\n        } else {\n\n          echo ( ! empty( $this->field['empty_message'] ) ) ? esc_attr( $this->field['empty_message'] ) : esc_html__( 'No data available.', 'csf' );\n\n        }\n\n      } else {\n\n        $label = ( isset( $this->field['label'] ) ) ? $this->field['label'] : '';\n        echo '<label><input type=\"radio\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"1\"'. $this->field_attributes() . esc_attr( checked( $this->value, 1, false ) ) .'/>';\n        echo ( ! empty( $this->field['label'] ) ) ? '<span class=\"csf--text\">'. esc_attr( $this->field['label'] ) .'</span>' : '';\n        echo '</label>';\n\n      }\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/repeater/repeater.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: repeater\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_repeater' ) ) {\n  class CSF_Field_repeater extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'max'          => 0,\n        'min'          => 0,\n        'button_title' => '<i class=\"fas fa-plus-circle\"></i>',\n      ) );\n\n      if ( preg_match( '/'. preg_quote( '['. $this->field['id'] .']' ) .'/', $this->unique ) ) {\n\n        echo '<div class=\"csf-notice csf-notice-danger\">'. esc_html__( 'Error: Field ID conflict.', 'csf' ) .'</div>';\n\n      } else {\n\n        echo $this->field_before();\n\n        echo '<div class=\"csf-repeater-item csf-repeater-hidden\" data-depend-id=\"'. esc_attr( $this->field['id'] ) .'\">';\n        echo '<div class=\"csf-repeater-content\">';\n        foreach ( $this->field['fields'] as $field ) {\n\n          $field_default = ( isset( $field['default'] ) ) ? $field['default'] : '';\n          $field_unique  = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .'][0]' : $this->field['id'] .'[0]';\n\n          CSF::field( $field, $field_default,  $field_unique, 'field/repeater' );\n\n        }\n        echo '</div>';\n        echo '<div class=\"csf-repeater-helper\">';\n        echo '<div class=\"csf-repeater-helper-inner\">';\n        echo '<i class=\"csf-repeater-sort fas fa-arrows-alt\"></i>';\n        echo '<i class=\"csf-repeater-clone far fa-clone\"></i>';\n        echo '<i class=\"csf-repeater-remove csf-confirm fas fa-times\" data-confirm=\"'. esc_html__( 'Are you sure to delete this item?', 'csf' ) .'\"></i>';\n        echo '</div>';\n        echo '</div>';\n        echo '</div>';\n\n        echo '<div class=\"csf-repeater-wrapper csf-data-wrapper\" data-field-id=\"['. esc_attr( $this->field['id'] ) .']\" data-max=\"'. esc_attr( $args['max'] ) .'\" data-min=\"'. esc_attr( $args['min'] ) .'\">';\n\n        if ( ! empty( $this->value ) && is_array( $this->value ) ) {\n\n          $num = 0;\n\n          foreach ( $this->value as $key => $value ) {\n\n            echo '<div class=\"csf-repeater-item\">';\n            echo '<div class=\"csf-repeater-content\">';\n            foreach ( $this->field['fields'] as $field ) {\n\n              $field_unique = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']['. $num .']' : $this->field['id'] .'['. $num .']';\n              $field_value  = ( isset( $field['id'] ) && isset( $this->value[$key][$field['id']] ) ) ? $this->value[$key][$field['id']] : '';\n\n              CSF::field( $field, $field_value, $field_unique, 'field/repeater' );\n\n            }\n            echo '</div>';\n            echo '<div class=\"csf-repeater-helper\">';\n            echo '<div class=\"csf-repeater-helper-inner\">';\n            echo '<i class=\"csf-repeater-sort fas fa-arrows-alt\"></i>';\n            echo '<i class=\"csf-repeater-clone far fa-clone\"></i>';\n            echo '<i class=\"csf-repeater-remove csf-confirm fas fa-times\" data-confirm=\"'. esc_html__( 'Are you sure to delete this item?', 'csf' ) .'\"></i>';\n            echo '</div>';\n            echo '</div>';\n            echo '</div>';\n\n            $num++;\n\n          }\n\n        }\n\n        echo '</div>';\n\n        echo '<div class=\"csf-repeater-alert csf-repeater-max\">'. esc_html__( 'You cannot add more.', 'csf' ) .'</div>';\n        echo '<div class=\"csf-repeater-alert csf-repeater-min\">'. esc_html__( 'You cannot remove more.', 'csf' ) .'</div>';\n        echo '<a href=\"#\" class=\"button button-primary csf-repeater-add\">'. $args['button_title'] .'</a>';\n\n        echo $this->field_after();\n\n      }\n\n    }\n\n    public function enqueue($enq_js = true) {\n//\n//      if ( ! wp_script_is( 'jquery-ui-sortable' ) ) {\n//        wp_enqueue_script( 'jquery-ui-sortable' );\n//      }\n        if ($enq_js){\n            return enqueue_script_helper('jquery-ui-sortable');\n        }\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/select/select.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: select\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_select' ) ) {\n  class CSF_Field_select extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'placeholder' => '',\n        'chosen'      => false,\n        'multiple'    => false,\n        'sortable'    => false,\n        'ajax'        => false,\n        'settings'    => array(),\n        'query_args'  => array(),\n      ) );\n\n      $this->value = ( is_array( $this->value ) ) ? $this->value : array_filter( (array) $this->value );\n\n      echo $this->field_before();\n\n      if ( isset( $this->field['options'] ) ) {\n\n        if ( ! empty( $args['ajax'] ) ) {\n          $args['settings']['data']['type']  = $args['options'];\n          $args['settings']['data']['nonce'] = wp_create_nonce( 'csf_chosen_ajax_nonce' );\n          if ( ! empty( $args['query_args'] ) ) {\n            $args['settings']['data']['query_args'] = $args['query_args'];\n          }\n        }\n\n        $chosen_rtl       = ( is_rtl() ) ? ' chosen-rtl' : '';\n        $multiple_name    = ( $args['multiple'] ) ? '[]' : '';\n        $multiple_attr    = ( $args['multiple'] ) ? ' multiple=\"multiple\"' : '';\n        $chosen_sortable  = ( $args['chosen'] && $args['sortable'] ) ? ' csf-chosen-sortable' : '';\n        $chosen_ajax      = ( $args['chosen'] && $args['ajax'] ) ? ' csf-chosen-ajax' : '';\n        $placeholder_attr = ( $args['chosen'] && $args['placeholder'] ) ? ' data-placeholder=\"'. esc_attr( $args['placeholder'] ) .'\"' : '';\n        $field_class      = ( $args['chosen'] ) ? ' class=\"csf-chosen '. esc_attr( $chosen_rtl . $chosen_sortable . $chosen_ajax ) .'\"' : '';\n        $field_name       = $this->field_name( $multiple_name );\n        $field_attr       = $this->field_attributes();\n        $maybe_options    = $this->field['options'];\n        $chosen_data_attr = ( $args['chosen'] && ! empty( $args['settings'] ) ) ? ' data-chosen-settings=\"'. esc_attr( json_encode( $args['settings'] ) ) .'\"' : '';\n\n        if ( is_string( $maybe_options ) && ! empty( $args['chosen'] ) && ! empty( $args['ajax'] ) ) {\n          $options = $this->field_wp_query_data_title( $maybe_options, $this->value );\n        } else if ( is_string( $maybe_options ) ) {\n          $options = $this->field_data( $maybe_options, false, $args['query_args'] );\n        } else {\n          $options = $maybe_options;\n        }\n\n        if ( ( is_array( $options ) && ! empty( $options ) ) || ( ! empty( $args['chosen'] ) && ! empty( $args['ajax'] ) ) ) {\n\n          if ( ! empty( $args['chosen'] ) && ! empty( $args['multiple'] ) ) {\n\n            echo '<select name=\"'. $field_name .'\" class=\"csf-hide-select hidden\"'. $multiple_attr . $field_attr .'>';\n            foreach ( $this->value as $option_key ) {\n              echo '<option value=\"'. esc_attr( $option_key ) .'\" selected>'. esc_attr( $option_key ) .'</option>';\n            }\n            echo '</select>';\n\n            $field_name = '_pseudo';\n            $field_attr = '';\n\n          }\n\n          // These attributes has been serialized above.\n          echo '<select name=\"'. esc_attr( $field_name ) .'\"'. $field_class . $multiple_attr . $placeholder_attr . $field_attr . $chosen_data_attr .'>';\n\n          if ( $args['placeholder'] && empty( $args['multiple'] ) ) {\n            if ( ! empty( $args['chosen'] ) ) {\n              echo '<option value=\"\"></option>';\n            } else {\n              echo '<option value=\"\">'. esc_attr( $args['placeholder'] ) .'</option>';\n            }\n          }\n\n          foreach ( $options as $option_key => $option ) {\n\n            if ( is_array( $option ) && ! empty( $option ) ) {\n\n              echo '<optgroup label=\"'. esc_attr( $option_key ) .'\">';\n\n              foreach ( $option as $sub_key => $sub_value ) {\n                $selected = ( in_array( $sub_key, $this->value ) ) ? ' selected' : '';\n                echo '<option value=\"'. esc_attr( $sub_key ) .'\" '. esc_attr( $selected ) .'>'. esc_attr( $sub_value ) .'</option>';\n              }\n\n              echo '</optgroup>';\n\n            } else {\n              $selected = ( in_array( $option_key, $this->value ) ) ? ' selected' : '';\n              echo '<option value=\"'. esc_attr( $option_key ) .'\" '. esc_attr( $selected ) .'>'. esc_attr( $option ) .'</option>';\n            }\n\n          }\n\n          echo '</select>';\n\n        } else {\n\n          echo ( ! empty( $this->field['empty_message'] ) ) ? esc_attr( $this->field['empty_message'] ) : esc_html__( 'No data available.', 'csf' );\n\n        }\n\n      }\n\n      echo $this->field_after();\n\n    }\n\n    public function enqueue($enq_js = true) {\n\n//      if ( ! wp_script_is( 'jquery-ui-sortable' ) ) {\n//        wp_enqueue_script( 'jquery-ui-sortable' );\n//      }\n        if ($enq_js){\n            return enqueue_script_helper('jquery-ui-sortable');\n        }\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/slider/slider.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: slider\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_slider' ) ) {\n  class CSF_Field_slider extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'max'  => 100,\n        'min'  => 0,\n        'step' => 1,\n        'unit' => '',\n      ) );\n\n      $is_unit = ( ! empty( $args['unit'] ) ) ? ' csf--is-unit' : '';\n\n      echo $this->field_before();\n\n      echo '<div class=\"csf--wrap\">';\n      echo '<div class=\"csf-slider-ui\"></div>';\n      echo '<div class=\"csf--input\">';\n      echo '<input type=\"number\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $this->value ) .'\"'. $this->field_attributes( array( 'class' => 'csf-input-number'. esc_attr( $is_unit ) ) ) .' data-min=\"'. esc_attr( $args['min'] ) .'\" data-max=\"'. esc_attr( $args['max'] ) .'\" data-step=\"'. esc_attr( $args['step'] ) .'\" step=\"any\" />';\n      echo ( ! empty( $args['unit'] ) ) ? '<span class=\"csf--unit\">'. esc_attr( $args['unit'] ) .'</span>' : '';\n      echo '</div>';\n      echo '</div>';\n\n      echo $this->field_after();\n\n    }\n\n    public function enqueue($enq_js = true) {\n\n//      if ( ! wp_script_is( 'jquery-ui-slider' ) ) {\n//        wp_enqueue_script( 'jquery-ui-slider' );\n//      }\n        if ($enq_js){\n            return enqueue_script_helper('jquery-ui-slider');\n        }\n    }\n\n    public function output() {\n\n      $output    = '';\n      $elements  = ( is_array( $this->field['output'] ) ) ? $this->field['output'] : array_filter( (array) $this->field['output'] );\n      $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : '';\n      $mode      = ( ! empty( $this->field['output_mode'] ) ) ? $this->field['output_mode'] : 'width';\n      $unit      = ( ! empty( $this->field['unit'] ) ) ? $this->field['unit'] : 'px';\n\n      if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) {\n        foreach ( $elements as $key_property => $element ) {\n          if ( is_numeric( $key_property ) ) {\n            if ( $mode ) {\n              $output = implode( ',', $elements ) .'{'. $mode .':'. $this->value . $unit . $important .';}';\n            }\n            break;\n          } else {\n            $output .= $element .'{'. $key_property .':'. $this->value . $unit . $important .'}';\n          }\n        }\n      }\n\n      $this->parent->output_css .= $output;\n\n      return $output;\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/sortable/sortable.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: sortable\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_sortable' ) ) {\n  class CSF_Field_sortable extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      echo $this->field_before();\n\n      echo '<div class=\"csf-sortable\" data-depend-id=\"'. esc_attr( $this->field['id'] ) .'\">';\n\n      $pre_sortby = array();\n      $pre_fields = array();\n\n      // Add array-keys to defined fields for sort by\n      foreach ( $this->field['fields'] as $key => $field ) {\n        $pre_fields[$field['id']] = $field;\n      }\n\n      // Set sort by by saved-value or default-value\n      if ( ! empty( $this->value ) ) {\n\n        foreach ( $this->value as $key => $value ) {\n          $pre_sortby[$key] = $pre_fields[$key];\n        }\n\n        $diff = array_diff_key( $pre_fields, $this->value );\n\n        if( ! empty( $diff ) ) {\n          $pre_sortby = array_merge( $pre_sortby, $diff );\n        }\n\n      } else {\n\n        foreach ( $pre_fields as $key => $value ) {\n          $pre_sortby[$key] = $value;\n        }\n\n      }\n\n      foreach ( $pre_sortby as $key => $field ) {\n\n        echo '<div class=\"csf-sortable-item\">';\n\n          echo '<div class=\"csf-sortable-content\">';\n\n          $field_default = ( isset( $this->field['default'][$key] ) ) ? $this->field['default'][$key] : '';\n          $field_value   = ( isset( $this->value[$key] ) ) ? $this->value[$key] : $field_default;\n          $unique_id     = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']' : $this->field['id'];\n\n          CSF::field( $field, $field_value, $unique_id, 'field/sortable' );\n\n          echo '</div>';\n\n          echo '<div class=\"csf-sortable-helper\"><i class=\"fas fa-arrows-alt\"></i></div>';\n\n        echo '</div>';\n\n      }\n\n      echo '</div>';\n\n      echo $this->field_after();\n\n    }\n\n      public function enqueue($enq_js = true) {\n\n//      if ( ! wp_script_is( 'jquery-ui-sortable' ) ) {\n//        wp_enqueue_script( 'jquery-ui-sortable' );\n//      }\n          if ($enq_js){\n              return enqueue_script_helper('jquery-ui-sortable');\n          }\n\n      }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/sorter/sorter.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: sorter\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_sorter' ) ) {\n  class CSF_Field_sorter extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'disabled'       => true,\n        'enabled_title'  => esc_html__( 'Enabled', 'csf' ),\n        'disabled_title' => esc_html__( 'Disabled', 'csf' ),\n      ) );\n\n      echo $this->field_before();\n\n      $this->value      = ( ! empty( $this->value ) ) ? $this->value : $this->field['default'];\n      $enabled_options  = ( ! empty( $this->value['enabled'] ) ) ? $this->value['enabled'] : array();\n      $disabled_options = ( ! empty( $this->value['disabled'] ) ) ? $this->value['disabled'] : array();\n\n      echo '<div class=\"csf-sorter\" data-depend-id=\"'. esc_attr( $this->field['id'] ) .'\"></div>';\n\n      echo ( $args['disabled'] ) ? '<div class=\"csf-modules\">' : '';\n\n      echo ( ! empty( $args['enabled_title'] ) ) ? '<div class=\"csf-sorter-title\">'. esc_attr( $args['enabled_title'] ) .'</div>' : '';\n      echo '<ul class=\"csf-enabled\">';\n      if ( ! empty( $enabled_options ) ) {\n        foreach ( $enabled_options as $key => $value ) {\n          echo '<li><input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[enabled]['. $key .']' ) ) .'\" value=\"'. esc_attr( $value ) .'\"/><label>'. esc_attr( $value ) .'</label></li>';\n        }\n      }\n      echo '</ul>';\n\n      // Check for hide/show disabled section\n      if ( $args['disabled'] ) {\n\n        echo '</div>';\n\n        echo '<div class=\"csf-modules\">';\n        echo ( ! empty( $args['disabled_title'] ) ) ? '<div class=\"csf-sorter-title\">'. esc_attr( $args['disabled_title'] ) .'</div>' : '';\n        echo '<ul class=\"csf-disabled\">';\n        if ( ! empty( $disabled_options ) ) {\n          foreach ( $disabled_options as $key => $value ) {\n          echo '<li><input type=\"hidden\" name=\"'. esc_attr( $this->field_name( '[disabled]['. $key .']' ) ) .'\" value=\"'. esc_attr( $value ) .'\"/><label>'. esc_attr( $value ) .'</label></li>';\n          }\n        }\n        echo '</ul>';\n        echo '</div>';\n\n      }\n\n\n      echo $this->field_after();\n\n    }\n\n      public function enqueue($enq_js = true) {\n\n//      if ( ! wp_script_is( 'jquery-ui-sortable' ) ) {\n//        wp_enqueue_script( 'jquery-ui-sortable' );\n//      }\n          if ($enq_js){\n              return enqueue_script_helper('jquery-ui-sortable');\n          }\n\n      }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/spacing/spacing.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: spacing\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_spacing' ) ) {\n  class CSF_Field_spacing extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'top_icon'           => '<i class=\"fas fa-long-arrow-alt-up\"></i>',\n        'right_icon'         => '<i class=\"fas fa-long-arrow-alt-right\"></i>',\n        'bottom_icon'        => '<i class=\"fas fa-long-arrow-alt-down\"></i>',\n        'left_icon'          => '<i class=\"fas fa-long-arrow-alt-left\"></i>',\n        'all_icon'           => '<i class=\"fas fa-arrows-alt\"></i>',\n        'top_placeholder'    => esc_html__( 'top', 'csf' ),\n        'right_placeholder'  => esc_html__( 'right', 'csf' ),\n        'bottom_placeholder' => esc_html__( 'bottom', 'csf' ),\n        'left_placeholder'   => esc_html__( 'left', 'csf' ),\n        'all_placeholder'    => esc_html__( 'all', 'csf' ),\n        'top'                => true,\n        'left'               => true,\n        'bottom'             => true,\n        'right'              => true,\n        'unit'               => true,\n        'show_units'         => true,\n        'all'                => false,\n        'units'              => array( 'px', '%', 'em' )\n      ) );\n\n      $default_values = array(\n        'top'    => '',\n        'right'  => '',\n        'bottom' => '',\n        'left'   => '',\n        'all'    => '',\n        'unit'   => 'px',\n      );\n\n      $value   = wp_parse_args( $this->value, $default_values );\n      $unit    = ( count( $args['units'] ) === 1 && ! empty( $args['unit'] ) ) ? $args['units'][0] : '';\n      $is_unit = ( ! empty( $unit ) ) ? ' csf--is-unit' : '';\n\n      echo $this->field_before();\n\n      echo '<div class=\"csf--inputs\" data-depend-id=\"'. esc_attr( $this->field['id'] ) .'\">';\n\n      if ( ! empty( $args['all'] ) ) {\n\n        $placeholder = ( ! empty( $args['all_placeholder'] ) ) ? ' placeholder=\"'. esc_attr( $args['all_placeholder'] ) .'\"' : '';\n\n        echo '<div class=\"csf--input\">';\n        echo ( ! empty( $args['all_icon'] ) ) ? '<span class=\"csf--label csf--icon\">'. $args['all_icon'] .'</span>' : '';\n        echo '<input type=\"number\" name=\"'. esc_attr( $this->field_name( '[all]' ) ) .'\" value=\"'. esc_attr( $value['all'] ) .'\"'. $placeholder .' class=\"csf-input-number'. esc_attr( $is_unit ) .'\" step=\"any\" />';\n        echo ( $unit ) ? '<span class=\"csf--label csf--unit\">'. esc_attr( $args['units'][0] ) .'</span>' : '';\n        echo '</div>';\n\n      } else {\n\n        $properties = array();\n\n        foreach ( array( 'top', 'right', 'bottom', 'left' ) as $prop ) {\n          if ( ! empty( $args[$prop] ) ) {\n            $properties[] = $prop;\n          }\n        }\n\n        $properties = ( $properties === array( 'right', 'left' ) ) ? array_reverse( $properties ) : $properties;\n\n        foreach ( $properties as $property ) {\n\n          $placeholder = ( ! empty( $args[$property.'_placeholder'] ) ) ? ' placeholder=\"'. esc_attr( $args[$property.'_placeholder'] ) .'\"' : '';\n\n          echo '<div class=\"csf--input\">';\n          echo ( ! empty( $args[$property.'_icon'] ) ) ? '<span class=\"csf--label csf--icon\">'. $args[$property.'_icon'] .'</span>' : '';\n          echo '<input type=\"number\" name=\"'. esc_attr( $this->field_name( '['. $property .']' ) ) .'\" value=\"'. esc_attr( $value[$property] ) .'\"'. $placeholder .' class=\"csf-input-number'. esc_attr( $is_unit ) .'\" step=\"any\" />';\n          echo ( $unit ) ? '<span class=\"csf--label csf--unit\">'. esc_attr( $args['units'][0] ) .'</span>' : '';\n          echo '</div>';\n\n        }\n\n      }\n\n      if ( ! empty( $args['unit'] ) && ! empty( $args['show_units'] ) && count( $args['units'] ) > 1 ) {\n        echo '<div class=\"csf--input\">';\n        echo '<select name=\"'. esc_attr( $this->field_name( '[unit]' ) ) .'\">';\n        foreach ( $args['units'] as $unit ) {\n          $selected = ( $value['unit'] === $unit ) ? ' selected' : '';\n          echo '<option value=\"'. esc_attr( $unit ) .'\"'. esc_attr( $selected ) .'>'. esc_attr( $unit ) .'</option>';\n        }\n        echo '</select>';\n        echo '</div>';\n      }\n\n      echo '</div>';\n\n      echo $this->field_after();\n\n    }\n\n    public function output() {\n\n      $output    = '';\n      $element   = ( is_array( $this->field['output'] ) ) ? join( ',', $this->field['output'] ) : $this->field['output'];\n      $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : '';\n      $unit      = ( ! empty( $this->value['unit'] ) ) ? $this->value['unit'] : 'px';\n\n      $mode = ( ! empty( $this->field['output_mode'] ) ) ? $this->field['output_mode'] : 'padding';\n\n      if ( $mode === 'border-radius' || $mode === 'radius' ) {\n\n        $top    = 'border-top-left-radius';\n        $right  = 'border-top-right-radius';\n        $bottom = 'border-bottom-right-radius';\n        $left   = 'border-bottom-left-radius';\n\n      } else if ( $mode === 'relative' || $mode === 'absolute' || $mode === 'none' ) {\n\n        $top    = 'top';\n        $right  = 'right';\n        $bottom = 'bottom';\n        $left   = 'left';\n\n      } else {\n\n        $top    = $mode .'-top';\n        $right  = $mode .'-right';\n        $bottom = $mode .'-bottom';\n        $left   = $mode .'-left';\n\n      }\n\n      if ( ! empty( $this->field['all'] ) && isset( $this->value['all'] ) && $this->value['all'] !== '' ) {\n\n        $output  = $element .'{';\n        $output .= $top    .':'. $this->value['all'] . $unit . $important .';';\n        $output .= $right  .':'. $this->value['all'] . $unit . $important .';';\n        $output .= $bottom .':'. $this->value['all'] . $unit . $important .';';\n        $output .= $left   .':'. $this->value['all'] . $unit . $important .';';\n        $output .= '}';\n\n      } else {\n\n        $top    = ( isset( $this->value['top']    ) && $this->value['top']    !== '' ) ? $top    .':'. $this->value['top']    . $unit . $important .';' : '';\n        $right  = ( isset( $this->value['right']  ) && $this->value['right']  !== '' ) ? $right  .':'. $this->value['right']  . $unit . $important .';' : '';\n        $bottom = ( isset( $this->value['bottom'] ) && $this->value['bottom'] !== '' ) ? $bottom .':'. $this->value['bottom'] . $unit . $important .';' : '';\n        $left   = ( isset( $this->value['left']   ) && $this->value['left']   !== '' ) ? $left   .':'. $this->value['left']   . $unit . $important .';' : '';\n\n        if ( $top !== '' || $right !== '' || $bottom !== '' || $left !== '' ) {\n          $output = $element .'{'. $top . $right . $bottom . $left .'}';\n        }\n\n      }\n\n      $this->parent->output_css .= $output;\n\n      return $output;\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/spinner/spinner.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: spinner\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_spinner' ) ) {\n  class CSF_Field_spinner extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'max'  => 100,\n        'min'  => 0,\n        'step' => 1,\n        'unit' => '',\n      ) );\n\n      echo $this->field_before();\n\n      echo '<div class=\"csf--spin\"><input type=\"number\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $this->value ) .'\"'. $this->field_attributes( array( 'class' => 'csf-input-number' ) ) .' data-min=\"'. esc_attr( $args['min'] ) .'\" data-max=\"'. esc_attr( $args['max'] ) .'\" data-step=\"'. esc_attr( $args['step'] ) .'\" data-unit=\"'. esc_attr( $args['unit'] ) .'\" step=\"any\" /></div>';\n\n      echo $this->field_after();\n\n    }\n\n    public function enqueue($enq_js = true) {\n\n//      if ( ! wp_script_is( 'jquery-ui-spinner' ) ) {\n//        wp_enqueue_script( 'jquery-ui-spinner' );\n//      }\n        if ($enq_js){\n            return enqueue_script_helper('jquery-ui-button').enqueue_script_helper('jquery-ui-spinner');\n        }\n\n    }\n\n    public function output() {\n\n      $output    = '';\n      $elements  = ( is_array( $this->field['output'] ) ) ? $this->field['output'] : array_filter( (array) $this->field['output'] );\n      $important = ( ! empty( $this->field['output_important'] ) ) ? '!important' : '';\n      $mode      = ( ! empty( $this->field['output_mode'] ) ) ? $this->field['output_mode'] : 'width';\n      $unit      = ( ! empty( $this->field['unit'] ) ) ? $this->field['unit'] : 'px';\n\n      if ( ! empty( $elements ) && isset( $this->value ) && $this->value !== '' ) {\n        foreach ( $elements as $key_property => $element ) {\n          if ( is_numeric( $key_property ) ) {\n            if ( $mode ) {\n              $output = implode( ',', $elements ) .'{'. $mode .':'. $this->value . $unit . $important .';}';\n            }\n            break;\n          } else {\n            $output .= $element .'{'. $key_property .':'. $this->value . $unit . $important .'}';\n          }\n        }\n      }\n\n      $this->parent->output_css .= $output;\n\n      return $output;\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/subheading/subheading.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: subheading\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_subheading' ) ) {\n  class CSF_Field_subheading extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      echo ( ! empty( $this->field['content'] ) ) ? $this->field['content'] : '';\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/submessage/submessage.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: submessage\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_submessage' ) ) {\n  class CSF_Field_submessage extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $style = ( ! empty( $this->field['style'] ) ) ? $this->field['style'] : 'normal';\n\n      echo '<div class=\"csf-submessage csf-submessage-'. esc_attr( $style ) .'\">'. $this->field['content'] .'</div>';\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/switcher/switcher.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: switcher\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_switcher' ) ) {\n  class CSF_Field_switcher extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $active     = ( ! empty( $this->value ) ) ? ' csf--active' : '';\n      $text_on    = ( ! empty( $this->field['text_on'] ) ) ? $this->field['text_on'] : esc_html__( 'On', 'csf' );\n      $text_off   = ( ! empty( $this->field['text_off'] ) ) ? $this->field['text_off'] : esc_html__( 'Off', 'csf' );\n      $text_width = ( ! empty( $this->field['text_width'] ) ) ? ' style=\"width: '. esc_attr( $this->field['text_width'] ) .'px;\"': '';\n\n      echo $this->field_before();\n\n      echo '<div class=\"csf--switcher'. esc_attr( $active ) .'\"'. $text_width .'>';\n      echo '<span class=\"csf--on\">'. esc_attr( $text_on ) .'</span>';\n      echo '<span class=\"csf--off\">'. esc_attr( $text_off ) .'</span>';\n      echo '<span class=\"csf--ball\"></span>';\n      echo '<input type=\"hidden\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $this->value ) .'\"'. $this->field_attributes() .' />';\n      echo '</div>';\n\n      echo ( ! empty( $this->field['label'] ) ) ? '<span class=\"csf--label\">'. esc_attr( $this->field['label'] ) . '</span>' : '';\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/tabbed/tabbed.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: tabbed\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_tabbed' ) ) {\n  class CSF_Field_tabbed extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $unallows = array( 'tabbed' );\n\n      echo $this->field_before();\n\n      echo '<div class=\"csf-tabbed-nav\" data-depend-id=\"'. esc_attr( $this->field['id'] ) .'\">';\n      foreach ( $this->field['tabs'] as $key => $tab ) {\n\n        $tabbed_icon   = ( ! empty( $tab['icon'] ) ) ? '<i class=\"csf--icon '. esc_attr( $tab['icon'] ) .'\"></i>' : '';\n        $tabbed_active = ( empty( $key ) ) ? 'csf-tabbed-active' : '';\n\n        echo '<a href=\"#\" class=\"'. esc_attr( $tabbed_active ) .'\"\">'. $tabbed_icon . esc_attr( $tab['title'] ) .'</a>';\n\n      }\n      echo '</div>';\n\n      echo '<div class=\"csf-tabbed-contents\">';\n      foreach ( $this->field['tabs'] as $key => $tab ) {\n\n        $tabbed_hidden = ( ! empty( $key ) ) ? ' hidden' : '';\n\n        echo '<div class=\"csf-tabbed-content'. esc_attr( $tabbed_hidden ) .'\">';\n\n        foreach ( $tab['fields'] as $field ) {\n\n          if ( in_array( $field['type'], $unallows ) ) { $field['_notice'] = true; }\n\n          $field_id      = ( isset( $field['id'] ) ) ? $field['id'] : '';\n          $field_default = ( isset( $field['default'] ) ) ? $field['default'] : '';\n          $field_value   = ( isset( $this->value[$field_id] ) ) ? $this->value[$field_id] : $field_default;\n          $unique_id     = ( ! empty( $this->unique ) ) ? $this->unique .'['. $this->field['id'] .']' : $this->field['id'];\n\n          CSF::field( $field, $field_value, $unique_id, 'field/tabbed' );\n\n        }\n\n        echo '</div>';\n\n      }\n      echo '</div>';\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/text/text.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: text\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_text' ) ) {\n  class CSF_Field_text extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $type = ( ! empty( $this->field['attributes']['type'] ) ) ? $this->field['attributes']['type'] : 'text';\n\n      echo $this->field_before();\n\n      echo '<input type=\"'. esc_attr( $type ) .'\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $this->value ) .'\"'. $this->field_attributes() .' />';\n\n      echo $this->field_after();\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/textarea/textarea.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: textarea\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_textarea' ) ) {\n  class CSF_Field_textarea extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      echo $this->field_before();\n      echo $this->shortcoder();\n      echo '<textarea name=\"'. esc_attr( $this->field_name() ) .'\"'. $this->field_attributes() .'>'. $this->value .'</textarea>';\n      echo $this->field_after();\n\n    }\n\n    public function shortcoder() {\n\n      if ( ! empty( $this->field['shortcoder'] ) ) {\n\n        $instances = ( is_array( $this->field['shortcoder'] ) ) ? $this->field['shortcoder'] : array_filter( (array) $this->field['shortcoder'] );\n\n        foreach ( $instances as $instance_key ) {\n\n          if ( isset( CSF::$shortcode_instances[$instance_key] ) ) {\n\n            $button_title = CSF::$shortcode_instances[$instance_key]['button_title'];\n\n            echo '<a href=\"#\" class=\"button button-primary csf-shortcode-button\" data-modal-id=\"'. esc_attr( $instance_key ) .'\">'. $button_title .'</a>';\n\n          }\n\n        }\n\n      }\n\n    }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/typography/google-fonts.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n\nif ( ! function_exists( 'csf_get_google_fonts' ) ) {\n  function csf_get_google_fonts() {\n    return [\n      'ABeeZee'=>[['normal','italic'],['latin']],\n      'Abel'=>[['normal'],['latin']],\n      'Abhaya Libre'=>[['normal','500','600','700','800'],['latin','latin-ext','sinhala']],\n      'Abril Fatface'=>[['normal'],['latin','latin-ext']],\n      'Aclonica'=>[['normal'],['latin']],\n      'Acme'=>[['normal'],['latin']],\n      'Actor'=>[['normal'],['latin']],\n      'Adamina'=>[['normal'],['latin']],\n      'Advent Pro'=>[['100','200','300','normal','500','600','700'],['greek','latin','latin-ext']],\n      'Aguafina Script'=>[['normal'],['latin','latin-ext']],\n      'Akaya Kanadaka'=>[['normal'],['kannada','latin','latin-ext']],\n      'Akaya Telivigala'=>[['normal'],['latin','latin-ext','telugu']],\n      'Akronim'=>[['normal'],['latin','latin-ext']],\n      'Aladin'=>[['normal'],['latin','latin-ext']],\n      'Alata'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Alatsi'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Aldrich'=>[['normal'],['latin']],\n      'Alef'=>[['normal','700'],['hebrew','latin']],\n      'Alegreya'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Alegreya SC'=>[['normal','italic','500','500italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Alegreya Sans'=>[['100','100italic','300','300italic','normal','italic','500','500italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Alegreya Sans SC'=>[['100','100italic','300','300italic','normal','italic','500','500italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Aleo'=>[['300','300italic','normal','italic','700','700italic'],['latin','latin-ext']],\n      'Alex Brush'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Alfa Slab One'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Alice'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'Alike'=>[['normal'],['latin']],\n      'Alike Angular'=>[['normal'],['latin']],\n      'Allan'=>[['normal','700'],['latin','latin-ext']],\n      'Allerta'=>[['normal'],['latin']],\n      'Allerta Stencil'=>[['normal'],['latin']],\n      'Allison'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Allura'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Almarai'=>[['300','normal','700','800'],['arabic']],\n      'Almendra'=>[['normal','italic','700','700italic'],['latin','latin-ext']],\n      'Almendra Display'=>[['normal'],['latin','latin-ext']],\n      'Almendra SC'=>[['normal'],['latin']],\n      'Alumni Sans'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Amarante'=>[['normal'],['latin','latin-ext']],\n      'Amaranth'=>[['normal','italic','700','700italic'],['latin']],\n      'Amatic SC'=>[['normal','700'],['cyrillic','hebrew','latin','latin-ext','vietnamese']],\n      'Amethysta'=>[['normal'],['latin']],\n      'Amiko'=>[['normal','600','700'],['devanagari','latin','latin-ext']],\n      'Amiri'=>[['normal','italic','700','700italic'],['arabic','latin','latin-ext']],\n      'Amita'=>[['normal','700'],['devanagari','latin','latin-ext']],\n      'Anaheim'=>[['normal'],['latin','latin-ext']],\n      'Andada Pro'=>[['normal','500','600','700','800','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext','vietnamese']],\n      'Andika'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Andika New Basic'=>[['normal','italic','700','700italic'],['latin','latin-ext','vietnamese']],\n      'Angkor'=>[['normal'],['khmer','latin']],\n      'Annie Use Your Telescope'=>[['normal'],['latin']],\n      'Anonymous Pro'=>[['normal','italic','700','700italic'],['cyrillic','greek','latin','latin-ext']],\n      'Antic'=>[['normal'],['latin']],\n      'Antic Didone'=>[['normal'],['latin']],\n      'Antic Slab'=>[['normal'],['latin']],\n      'Anton'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Antonio'=>[['100','200','300','normal','500','600','700'],['latin','latin-ext']],\n      'Arapey'=>[['normal','italic'],['latin']],\n      'Arbutus'=>[['normal'],['latin','latin-ext']],\n      'Arbutus Slab'=>[['normal'],['latin','latin-ext']],\n      'Architects Daughter'=>[['normal'],['latin']],\n      'Archivo'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Archivo Black'=>[['normal'],['latin','latin-ext']],\n      'Archivo Narrow'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']],\n      'Are You Serious'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Aref Ruqaa'=>[['normal','700'],['arabic','latin','latin-ext']],\n      'Arima Madurai'=>[['100','200','300','normal','500','700','800','900'],['latin','latin-ext','tamil','vietnamese']],\n      'Arimo'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','latin','latin-ext','vietnamese']],\n      'Arizonia'=>[['normal'],['latin','latin-ext']],\n      'Armata'=>[['normal'],['latin','latin-ext']],\n      'Arsenal'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Artifika'=>[['normal'],['latin']],\n      'Arvo'=>[['normal','italic','700','700italic'],['latin']],\n      'Arya'=>[['normal','700'],['devanagari','latin','latin-ext']],\n      'Asap'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']],\n      'Asap Condensed'=>[['normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','vietnamese']],\n      'Asar'=>[['normal'],['devanagari','latin','latin-ext']],\n      'Asset'=>[['normal'],['latin']],\n      'Assistant'=>[['200','300','normal','500','600','700','800'],['hebrew','latin','latin-ext']],\n      'Astloch'=>[['normal','700'],['latin']],\n      'Asul'=>[['normal','700'],['latin']],\n      'Athiti'=>[['200','300','normal','500','600','700'],['latin','latin-ext','thai','vietnamese']],\n      'Atkinson Hyperlegible'=>[['normal','italic','700','700italic'],['latin','latin-ext']],\n      'Atma'=>[['300','normal','500','600','700'],['bengali','latin','latin-ext']],\n      'Atomic Age'=>[['normal'],['latin']],\n      'Aubrey'=>[['normal'],['latin']],\n      'Audiowide'=>[['normal'],['latin','latin-ext']],\n      'Autour One'=>[['normal'],['latin','latin-ext']],\n      'Average'=>[['normal'],['latin','latin-ext']],\n      'Average Sans'=>[['normal'],['latin','latin-ext']],\n      'Averia Gruesa Libre'=>[['normal'],['latin','latin-ext']],\n      'Averia Libre'=>[['300','300italic','normal','italic','700','700italic'],['latin']],\n      'Averia Sans Libre'=>[['300','300italic','normal','italic','700','700italic'],['latin']],\n      'Averia Serif Libre'=>[['300','300italic','normal','italic','700','700italic'],['latin']],\n      'Azeret Mono'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']],\n      'B612'=>[['normal','italic','700','700italic'],['latin']],\n      'B612 Mono'=>[['normal','italic','700','700italic'],['latin']],\n      'Bad Script'=>[['normal'],['cyrillic','latin']],\n      'Bahiana'=>[['normal'],['latin','latin-ext']],\n      'Bahianita'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Bai Jamjuree'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']],\n      'Bakbak One'=>[['normal'],['devanagari','latin','latin-ext']],\n      'Ballet'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Baloo 2'=>[['normal','500','600','700','800'],['devanagari','latin','latin-ext','vietnamese']],\n      'Baloo Bhai 2'=>[['normal','500','600','700','800'],['gujarati','latin','latin-ext','vietnamese']],\n      'Baloo Bhaijaan 2'=>[['normal','500','600','700','800'],['arabic','latin','latin-ext','vietnamese']],\n      'Baloo Bhaina 2'=>[['normal','500','600','700','800'],['latin','latin-ext','oriya','vietnamese']],\n      'Baloo Chettan 2'=>[['normal','500','600','700','800'],['latin','latin-ext','malayalam','vietnamese']],\n      'Baloo Da 2'=>[['normal','500','600','700','800'],['bengali','latin','latin-ext','vietnamese']],\n      'Baloo Paaji 2'=>[['normal','500','600','700','800'],['gurmukhi','latin','latin-ext','vietnamese']],\n      'Baloo Tamma 2'=>[['normal','500','600','700','800'],['kannada','latin','latin-ext','vietnamese']],\n      'Baloo Tammudu 2'=>[['normal','500','600','700','800'],['latin','latin-ext','telugu','vietnamese']],\n      'Baloo Thambi 2'=>[['normal','500','600','700','800'],['latin','latin-ext','tamil','vietnamese']],\n      'Balsamiq Sans'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'Balthazar'=>[['normal'],['latin']],\n      'Bangers'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Barlow'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','vietnamese']],\n      'Barlow Condensed'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','vietnamese']],\n      'Barlow Semi Condensed'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','vietnamese']],\n      'Barriecito'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Barrio'=>[['normal'],['latin','latin-ext']],\n      'Basic'=>[['normal'],['latin','latin-ext']],\n      'Baskervville'=>[['normal','italic'],['latin','latin-ext']],\n      'Battambang'=>[['100','300','normal','700','900'],['khmer','latin']],\n      'Baumans'=>[['normal'],['latin']],\n      'Bayon'=>[['normal'],['khmer','latin']],\n      'Be Vietnam Pro'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','vietnamese']],\n      'Bebas Neue'=>[['normal'],['latin','latin-ext']],\n      'Belgrano'=>[['normal'],['latin']],\n      'Bellefair'=>[['normal'],['hebrew','latin','latin-ext']],\n      'Belleza'=>[['normal'],['latin','latin-ext']],\n      'Bellota'=>[['300','300italic','normal','italic','700','700italic'],['cyrillic','latin','latin-ext','vietnamese']],\n      'Bellota Text'=>[['300','300italic','normal','italic','700','700italic'],['cyrillic','latin','latin-ext','vietnamese']],\n      'BenchNine'=>[['300','normal','700'],['latin','latin-ext']],\n      'Benne'=>[['normal'],['kannada','latin','latin-ext']],\n      'Bentham'=>[['normal'],['latin']],\n      'Berkshire Swash'=>[['normal'],['latin','latin-ext']],\n      'Besley'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']],\n      'Beth Ellen'=>[['normal'],['latin']],\n      'Bevan'=>[['normal','italic'],['latin','latin-ext','vietnamese']],\n      'BhuTuka Expanded One'=>[['normal'],['gurmukhi','latin','latin-ext']],\n      'Big Shoulders Display'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Big Shoulders Inline Display'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Big Shoulders Inline Text'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Big Shoulders Stencil Display'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Big Shoulders Stencil Text'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Big Shoulders Text'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Bigelow Rules'=>[['normal'],['latin','latin-ext']],\n      'Bigshot One'=>[['normal'],['latin']],\n      'Bilbo'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Bilbo Swash Caps'=>[['normal'],['latin','latin-ext']],\n      'BioRhyme'=>[['200','300','normal','700','800'],['latin','latin-ext']],\n      'BioRhyme Expanded'=>[['200','300','normal','700','800'],['latin','latin-ext']],\n      'Birthstone'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Birthstone Bounce'=>[['normal','500'],['latin','latin-ext','vietnamese']],\n      'Biryani'=>[['200','300','normal','600','700','800','900'],['devanagari','latin','latin-ext']],\n      'Bitter'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Black And White Picture'=>[['normal'],['korean','latin']],\n      'Black Han Sans'=>[['normal'],['korean','latin']],\n      'Black Ops One'=>[['normal'],['latin','latin-ext']],\n      'Blinker'=>[['100','200','300','normal','600','700','800','900'],['latin','latin-ext']],\n      'Bodoni Moda'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']],\n      'Bokor'=>[['normal'],['khmer','latin']],\n      'Bona Nova'=>[['normal','italic','700'],['cyrillic','cyrillic-ext','greek','hebrew','latin','latin-ext','vietnamese']],\n      'Bonbon'=>[['normal'],['latin']],\n      'Bonheur Royale'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Boogaloo'=>[['normal'],['latin']],\n      'Bowlby One'=>[['normal'],['latin']],\n      'Bowlby One SC'=>[['normal'],['latin','latin-ext']],\n      'Brawler'=>[['normal','700'],['latin']],\n      'Bree Serif'=>[['normal'],['latin','latin-ext']],\n      'Brygada 1918'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'Bubblegum Sans'=>[['normal'],['latin','latin-ext']],\n      'Bubbler One'=>[['normal'],['latin','latin-ext']],\n      'Buda'=>[['300'],['latin']],\n      'Buenard'=>[['normal','700'],['latin','latin-ext']],\n      'Bungee'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Bungee Hairline'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Bungee Inline'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Bungee Outline'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Bungee Shade'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Butcherman'=>[['normal'],['latin','latin-ext']],\n      'Butterfly Kids'=>[['normal'],['latin','latin-ext']],\n      'Cabin'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']],\n      'Cabin Condensed'=>[['normal','500','600','700'],['latin','latin-ext','vietnamese']],\n      'Cabin Sketch'=>[['normal','700'],['latin']],\n      'Caesar Dressing'=>[['normal'],['latin']],\n      'Cagliostro'=>[['normal'],['latin']],\n      'Cairo'=>[['200','300','normal','500','600','700','800','900'],['arabic','latin','latin-ext']],\n      'Caladea'=>[['normal','italic','700','700italic'],['latin','latin-ext']],\n      'Calistoga'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Calligraffitti'=>[['normal'],['latin']],\n      'Cambay'=>[['normal','italic','700','700italic'],['devanagari','latin','latin-ext']],\n      'Cambo'=>[['normal'],['latin']],\n      'Candal'=>[['normal'],['latin']],\n      'Cantarell'=>[['normal','italic','700','700italic'],['latin']],\n      'Cantata One'=>[['normal'],['latin','latin-ext']],\n      'Cantora One'=>[['normal'],['latin','latin-ext']],\n      'Capriola'=>[['normal'],['latin','latin-ext']],\n      'Caramel'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Carattere'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Cardo'=>[['normal','italic','700'],['greek','greek-ext','latin','latin-ext']],\n      'Carme'=>[['normal'],['latin']],\n      'Carrois Gothic'=>[['normal'],['latin']],\n      'Carrois Gothic SC'=>[['normal'],['latin']],\n      'Carter One'=>[['normal'],['latin']],\n      'Castoro'=>[['normal','italic'],['latin','latin-ext']],\n      'Catamaran'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','tamil']],\n      'Caudex'=>[['normal','italic','700','700italic'],['greek','greek-ext','latin','latin-ext']],\n      'Caveat'=>[['normal','500','600','700'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'Caveat Brush'=>[['normal'],['latin','latin-ext']],\n      'Cedarville Cursive'=>[['normal'],['latin']],\n      'Ceviche One'=>[['normal'],['latin','latin-ext']],\n      'Chakra Petch'=>[['300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']],\n      'Changa'=>[['200','300','normal','500','600','700','800'],['arabic','latin','latin-ext']],\n      'Changa One'=>[['normal','italic'],['latin']],\n      'Chango'=>[['normal'],['latin','latin-ext']],\n      'Charm'=>[['normal','700'],['latin','latin-ext','thai','vietnamese']],\n      'Charmonman'=>[['normal','700'],['latin','latin-ext','thai','vietnamese']],\n      'Chathura'=>[['100','300','normal','700','800'],['latin','telugu']],\n      'Chau Philomene One'=>[['normal','italic'],['latin','latin-ext']],\n      'Chela One'=>[['normal'],['latin','latin-ext']],\n      'Chelsea Market'=>[['normal'],['latin','latin-ext']],\n      'Chenla'=>[['normal'],['khmer']],\n      'Cherish'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Cherry Cream Soda'=>[['normal'],['latin']],\n      'Cherry Swash'=>[['normal','700'],['latin','latin-ext']],\n      'Chewy'=>[['normal'],['latin']],\n      'Chicle'=>[['normal'],['latin','latin-ext']],\n      'Chilanka'=>[['normal'],['latin','malayalam']],\n      'Chivo'=>[['300','300italic','normal','italic','700','700italic','900','900italic'],['latin','latin-ext']],\n      'Chonburi'=>[['normal'],['latin','latin-ext','thai','vietnamese']],\n      'Cinzel'=>[['normal','500','600','700','800','900'],['latin','latin-ext']],\n      'Cinzel Decorative'=>[['normal','700','900'],['latin']],\n      'Clicker Script'=>[['normal'],['latin','latin-ext']],\n      'Coda'=>[['normal','800'],['latin','latin-ext']],\n      'Coda Caption'=>[['800'],['latin','latin-ext']],\n      'Codystar'=>[['300','normal'],['latin','latin-ext']],\n      'Coiny'=>[['normal'],['latin','latin-ext','tamil','vietnamese']],\n      'Combo'=>[['normal'],['latin','latin-ext']],\n      'Comfortaa'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'Comforter'=>[['normal'],['cyrillic','latin','latin-ext','vietnamese']],\n      'Comforter Brush'=>[['normal'],['cyrillic','latin','latin-ext','vietnamese']],\n      'Comic Neue'=>[['300','300italic','normal','italic','700','700italic'],['latin']],\n      'Coming Soon'=>[['normal'],['latin']],\n      'Commissioner'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'Concert One'=>[['normal'],['latin','latin-ext']],\n      'Condiment'=>[['normal'],['latin','latin-ext']],\n      'Content'=>[['normal','700'],['khmer']],\n      'Contrail One'=>[['normal'],['latin']],\n      'Convergence'=>[['normal'],['latin','latin-ext']],\n      'Cookie'=>[['normal'],['latin']],\n      'Copse'=>[['normal'],['latin']],\n      'Corben'=>[['normal','700'],['latin','latin-ext']],\n      'Corinthia'=>[['normal','700'],['latin','latin-ext','vietnamese']],\n      'Cormorant'=>[['300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Cormorant Garamond'=>[['300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Cormorant Infant'=>[['300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Cormorant SC'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Cormorant Unicase'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Cormorant Upright'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']],\n      'Courgette'=>[['normal'],['latin','latin-ext']],\n      'Courier Prime'=>[['normal','italic','700','700italic'],['latin','latin-ext']],\n      'Cousine'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','latin','latin-ext','vietnamese']],\n      'Coustard'=>[['normal','900'],['latin']],\n      'Covered By Your Grace'=>[['normal'],['latin']],\n      'Crafty Girls'=>[['normal'],['latin']],\n      'Creepster'=>[['normal'],['latin']],\n      'Crete Round'=>[['normal','italic'],['latin','latin-ext']],\n      'Crimson Pro'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Croissant One'=>[['normal'],['latin','latin-ext']],\n      'Crushed'=>[['normal'],['latin']],\n      'Cuprum'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Cute Font'=>[['normal'],['korean','latin']],\n      'Cutive'=>[['normal'],['latin','latin-ext']],\n      'Cutive Mono'=>[['normal'],['latin','latin-ext']],\n      'DM Mono'=>[['300','300italic','normal','italic','500','500italic'],['latin','latin-ext']],\n      'DM Sans'=>[['normal','italic','500','500italic','700','700italic'],['latin','latin-ext']],\n      'DM Serif Display'=>[['normal','italic'],['latin','latin-ext']],\n      'DM Serif Text'=>[['normal','italic'],['latin','latin-ext']],\n      'Damion'=>[['normal'],['latin']],\n      'Dancing Script'=>[['normal','500','600','700'],['latin','latin-ext','vietnamese']],\n      'Dangrek'=>[['normal'],['khmer','latin']],\n      'Darker Grotesque'=>[['300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'David Libre'=>[['normal','500','700'],['hebrew','latin','latin-ext','vietnamese']],\n      'Dawning of a New Day'=>[['normal'],['latin']],\n      'Days One'=>[['normal'],['latin']],\n      'Dekko'=>[['normal'],['devanagari','latin','latin-ext']],\n      'Dela Gothic One'=>[['normal'],['cyrillic','greek','japanese','latin','latin-ext','vietnamese']],\n      'Delius'=>[['normal'],['latin']],\n      'Delius Swash Caps'=>[['normal'],['latin']],\n      'Delius Unicase'=>[['normal','700'],['latin']],\n      'Della Respira'=>[['normal'],['latin']],\n      'Denk One'=>[['normal'],['latin','latin-ext']],\n      'Devonshire'=>[['normal'],['latin','latin-ext']],\n      'Dhurjati'=>[['normal'],['latin','telugu']],\n      'Didact Gothic'=>[['normal'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']],\n      'Diplomata'=>[['normal'],['latin','latin-ext']],\n      'Diplomata SC'=>[['normal'],['latin','latin-ext']],\n      'Do Hyeon'=>[['normal'],['korean','latin']],\n      'Dokdo'=>[['normal'],['korean','latin']],\n      'Domine'=>[['normal','500','600','700'],['latin','latin-ext']],\n      'Donegal One'=>[['normal'],['latin','latin-ext']],\n      'Dongle'=>[['300','normal','700'],['korean','latin','latin-ext','vietnamese']],\n      'Doppio One'=>[['normal'],['latin','latin-ext']],\n      'Dorsa'=>[['normal'],['latin']],\n      'Dosis'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext','vietnamese']],\n      'DotGothic16'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Dr Sugiyama'=>[['normal'],['latin','latin-ext']],\n      'Duru Sans'=>[['normal'],['latin','latin-ext']],\n      'Dynalight'=>[['normal'],['latin','latin-ext']],\n      'EB Garamond'=>[['normal','500','600','700','800','italic','500italic','600italic','700italic','800italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Eagle Lake'=>[['normal'],['latin','latin-ext']],\n      'East Sea Dokdo'=>[['normal'],['korean','latin']],\n      'Eater'=>[['normal'],['latin','latin-ext']],\n      'Economica'=>[['normal','italic','700','700italic'],['latin','latin-ext']],\n      'Eczar'=>[['normal','500','600','700','800'],['devanagari','latin','latin-ext']],\n      'El Messiri'=>[['normal','500','600','700'],['arabic','cyrillic','latin','latin-ext']],\n      'Electrolize'=>[['normal'],['latin']],\n      'Elsie'=>[['normal','900'],['latin','latin-ext']],\n      'Elsie Swash Caps'=>[['normal','900'],['latin','latin-ext']],\n      'Emblema One'=>[['normal'],['latin','latin-ext']],\n      'Emilys Candy'=>[['normal'],['latin','latin-ext']],\n      'Encode Sans'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Encode Sans Condensed'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Encode Sans Expanded'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Encode Sans SC'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Encode Sans Semi Condensed'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Encode Sans Semi Expanded'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Engagement'=>[['normal'],['latin']],\n      'Englebert'=>[['normal'],['latin','latin-ext']],\n      'Enriqueta'=>[['normal','500','600','700'],['latin','latin-ext']],\n      'Ephesis'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Epilogue'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Erica One'=>[['normal'],['latin','latin-ext']],\n      'Esteban'=>[['normal'],['latin','latin-ext']],\n      'Estonia'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Euphoria Script'=>[['normal'],['latin','latin-ext']],\n      'Ewert'=>[['normal'],['latin','latin-ext']],\n      'Exo'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Exo 2'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Expletus Sans'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext']],\n      'Explora'=>[['normal'],['cherokee','latin','latin-ext','vietnamese']],\n      'Fahkwang'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']],\n      'Fanwood Text'=>[['normal','italic'],['latin']],\n      'Farro'=>[['300','normal','500','700'],['latin','latin-ext']],\n      'Farsan'=>[['normal'],['gujarati','latin','latin-ext','vietnamese']],\n      'Fascinate'=>[['normal'],['latin']],\n      'Fascinate Inline'=>[['normal'],['latin']],\n      'Faster One'=>[['normal'],['latin']],\n      'Fasthand'=>[['normal'],['khmer','latin']],\n      'Fauna One'=>[['normal'],['latin','latin-ext']],\n      'Faustina'=>[['300','normal','500','600','700','800','300italic','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext','vietnamese']],\n      'Federant'=>[['normal'],['latin']],\n      'Federo'=>[['normal'],['latin']],\n      'Felipa'=>[['normal'],['latin','latin-ext']],\n      'Fenix'=>[['normal'],['latin','latin-ext']],\n      'Festive'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Finger Paint'=>[['normal'],['latin']],\n      'Fira Code'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']],\n      'Fira Mono'=>[['normal','500','700'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']],\n      'Fira Sans'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Fira Sans Condensed'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Fira Sans Extra Condensed'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Fjalla One'=>[['normal'],['latin','latin-ext']],\n      'Fjord One'=>[['normal'],['latin']],\n      'Flamenco'=>[['300','normal'],['latin']],\n      'Flavors'=>[['normal'],['latin','latin-ext']],\n      'Fleur De Leah'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Flow Block'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Flow Circular'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Flow Rounded'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Fondamento'=>[['normal','italic'],['latin','latin-ext']],\n      'Fontdiner Swanky'=>[['normal'],['latin']],\n      'Forum'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'Francois One'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Frank Ruhl Libre'=>[['300','normal','500','700','900'],['hebrew','latin','latin-ext']],\n      'Fraunces'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Freckle Face'=>[['normal'],['latin','latin-ext']],\n      'Fredericka the Great'=>[['normal'],['latin','latin-ext']],\n      'Fredoka'=>[['300','normal','500','600','700'],['hebrew','latin','latin-ext']],\n      'Fredoka One'=>[['normal'],['latin']],\n      'Freehand'=>[['normal'],['khmer','latin']],\n      'Fresca'=>[['normal'],['latin','latin-ext']],\n      'Frijole'=>[['normal'],['latin']],\n      'Fruktur'=>[['normal'],['latin','latin-ext']],\n      'Fugaz One'=>[['normal'],['latin']],\n      'Fuggles'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Fuzzy Bubbles'=>[['normal','700'],['latin','latin-ext','vietnamese']],\n      'GFS Didot'=>[['normal'],['greek']],\n      'GFS Neohellenic'=>[['normal','italic','700','700italic'],['greek']],\n      'Gabriela'=>[['normal'],['cyrillic','cyrillic-ext','latin']],\n      'Gaegu'=>[['300','normal','700'],['korean','latin']],\n      'Gafata'=>[['normal'],['latin','latin-ext']],\n      'Galada'=>[['normal'],['bengali','latin']],\n      'Galdeano'=>[['normal'],['latin']],\n      'Galindo'=>[['normal'],['latin','latin-ext']],\n      'Gamja Flower'=>[['normal'],['korean','latin']],\n      'Gayathri'=>[['100','normal','700'],['latin','malayalam']],\n      'Gelasio'=>[['normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','vietnamese']],\n      'Gemunu Libre'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext','sinhala']],\n      'Genos'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cherokee','latin','latin-ext','vietnamese']],\n      'Gentium Basic'=>[['normal','italic','700','700italic'],['latin','latin-ext']],\n      'Gentium Book Basic'=>[['normal','italic','700','700italic'],['latin','latin-ext']],\n      'Geo'=>[['normal','italic'],['latin']],\n      'Georama'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Geostar'=>[['normal'],['latin']],\n      'Geostar Fill'=>[['normal'],['latin']],\n      'Germania One'=>[['normal'],['latin']],\n      'Gideon Roman'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Gidugu'=>[['normal'],['latin','telugu']],\n      'Gilda Display'=>[['normal'],['latin','latin-ext']],\n      'Girassol'=>[['normal'],['latin','latin-ext']],\n      'Give You Glory'=>[['normal'],['latin']],\n      'Glass Antiqua'=>[['normal'],['latin','latin-ext']],\n      'Glegoo'=>[['normal','700'],['devanagari','latin','latin-ext']],\n      'Gloria Hallelujah'=>[['normal'],['latin']],\n      'Glory'=>[['100','200','300','normal','500','600','700','800','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext','vietnamese']],\n      'Gluten'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Goblin One'=>[['normal'],['latin']],\n      'Gochi Hand'=>[['normal'],['latin']],\n      'Goldman'=>[['normal','700'],['latin','latin-ext','vietnamese']],\n      'Gorditas'=>[['normal','700'],['latin']],\n      'Gothic A1'=>[['100','200','300','normal','500','600','700','800','900'],['korean','latin']],\n      'Gotu'=>[['normal'],['devanagari','latin','latin-ext','vietnamese']],\n      'Goudy Bookletter 1911'=>[['normal'],['latin']],\n      'Gowun Batang'=>[['normal','700'],['korean','latin','latin-ext','vietnamese']],\n      'Gowun Dodum'=>[['normal'],['korean','latin','latin-ext','vietnamese']],\n      'Graduate'=>[['normal'],['latin']],\n      'Grand Hotel'=>[['normal'],['latin','latin-ext']],\n      'Grandstander'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Gravitas One'=>[['normal'],['latin']],\n      'Great Vibes'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Grechen Fuemen'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Grenze'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','vietnamese']],\n      'Grenze Gotisch'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Grey Qo'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Griffy'=>[['normal'],['latin','latin-ext']],\n      'Gruppo'=>[['normal'],['latin','latin-ext']],\n      'Gudea'=>[['normal','italic','700'],['latin','latin-ext']],\n      'Gugi'=>[['normal'],['korean','latin']],\n      'Gupter'=>[['normal','500','700'],['latin']],\n      'Gurajada'=>[['normal'],['latin','telugu']],\n      'Gwendolyn'=>[['normal','700'],['latin','latin-ext','vietnamese']],\n      'Habibi'=>[['normal'],['latin','latin-ext']],\n      'Hachi Maru Pop'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Hahmlet'=>[['100','200','300','normal','500','600','700','800','900'],['korean','latin','latin-ext','vietnamese']],\n      'Halant'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']],\n      'Hammersmith One'=>[['normal'],['latin','latin-ext']],\n      'Hanalei'=>[['normal'],['latin','latin-ext']],\n      'Hanalei Fill'=>[['normal'],['latin','latin-ext']],\n      'Handlee'=>[['normal'],['latin']],\n      'Hanuman'=>[['100','300','normal','700','900'],['khmer','latin']],\n      'Happy Monkey'=>[['normal'],['latin','latin-ext']],\n      'Harmattan'=>[['normal','700'],['arabic','latin','latin-ext']],\n      'Headland One'=>[['normal'],['latin','latin-ext']],\n      'Heebo'=>[['100','200','300','normal','500','600','700','800','900'],['hebrew','latin']],\n      'Henny Penny'=>[['normal'],['latin']],\n      'Hepta Slab'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Herr Von Muellerhoff'=>[['normal'],['latin','latin-ext']],\n      'Hi Melody'=>[['normal'],['korean','latin']],\n      'Hina Mincho'=>[['normal'],['cyrillic','japanese','latin','latin-ext','vietnamese']],\n      'Hind'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']],\n      'Hind Guntur'=>[['300','normal','500','600','700'],['latin','latin-ext','telugu']],\n      'Hind Madurai'=>[['300','normal','500','600','700'],['latin','latin-ext','tamil']],\n      'Hind Siliguri'=>[['300','normal','500','600','700'],['bengali','latin','latin-ext']],\n      'Hind Vadodara'=>[['300','normal','500','600','700'],['gujarati','latin','latin-ext']],\n      'Holtwood One SC'=>[['normal'],['latin']],\n      'Homemade Apple'=>[['normal'],['latin']],\n      'Homenaje'=>[['normal'],['latin']],\n      'Hubballi'=>[['normal'],['kannada','latin','latin-ext']],\n      'Hurricane'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'IBM Plex Mono'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'IBM Plex Sans'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'IBM Plex Sans Arabic'=>[['100','200','300','normal','500','600','700'],['arabic','cyrillic-ext','latin','latin-ext']],\n      'IBM Plex Sans Condensed'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic-ext','latin','latin-ext','vietnamese']],\n      'IBM Plex Sans Devanagari'=>[['100','200','300','normal','500','600','700'],['cyrillic-ext','devanagari','latin','latin-ext']],\n      'IBM Plex Sans Hebrew'=>[['100','200','300','normal','500','600','700'],['cyrillic-ext','hebrew','latin','latin-ext']],\n      'IBM Plex Sans KR'=>[['100','200','300','normal','500','600','700'],['korean','latin','latin-ext']],\n      'IBM Plex Sans Thai'=>[['100','200','300','normal','500','600','700'],['cyrillic-ext','latin','latin-ext','thai']],\n      'IBM Plex Sans Thai Looped'=>[['100','200','300','normal','500','600','700'],['cyrillic-ext','latin','latin-ext','thai']],\n      'IBM Plex Serif'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'IM Fell DW Pica'=>[['normal','italic'],['latin']],\n      'IM Fell DW Pica SC'=>[['normal'],['latin']],\n      'IM Fell Double Pica'=>[['normal','italic'],['latin']],\n      'IM Fell Double Pica SC'=>[['normal'],['latin']],\n      'IM Fell English'=>[['normal','italic'],['latin']],\n      'IM Fell English SC'=>[['normal'],['latin']],\n      'IM Fell French Canon'=>[['normal','italic'],['latin']],\n      'IM Fell French Canon SC'=>[['normal'],['latin']],\n      'IM Fell Great Primer'=>[['normal','italic'],['latin']],\n      'IM Fell Great Primer SC'=>[['normal'],['latin']],\n      'Ibarra Real Nova'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['latin','latin-ext']],\n      'Iceberg'=>[['normal'],['latin']],\n      'Iceland'=>[['normal'],['latin']],\n      'Imbue'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Imperial Script'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Imprima'=>[['normal'],['latin','latin-ext']],\n      'Inconsolata'=>[['200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Inder'=>[['normal'],['latin','latin-ext']],\n      'Indie Flower'=>[['normal'],['latin']],\n      'Inika'=>[['normal','700'],['latin','latin-ext']],\n      'Inknut Antiqua'=>[['300','normal','500','600','700','800','900'],['devanagari','latin','latin-ext']],\n      'Inria Sans'=>[['300','300italic','normal','italic','700','700italic'],['latin','latin-ext']],\n      'Inria Serif'=>[['300','300italic','normal','italic','700','700italic'],['latin','latin-ext']],\n      'Inspiration'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Inter'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Irish Grover'=>[['normal'],['latin']],\n      'Island Moments'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Istok Web'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'Italiana'=>[['normal'],['latin']],\n      'Italianno'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Itim'=>[['normal'],['latin','latin-ext','thai','vietnamese']],\n      'Jacques Francois'=>[['normal'],['latin']],\n      'Jacques Francois Shadow'=>[['normal'],['latin']],\n      'Jaldi'=>[['normal','700'],['devanagari','latin','latin-ext']],\n      'JetBrains Mono'=>[['100','200','300','normal','500','600','700','800','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'Jim Nightshade'=>[['normal'],['latin','latin-ext']],\n      'Jockey One'=>[['normal'],['latin','latin-ext']],\n      'Jolly Lodger'=>[['normal'],['latin','latin-ext']],\n      'Jomhuria'=>[['normal'],['arabic','latin','latin-ext']],\n      'Jomolhari'=>[['normal'],['latin','tibetan']],\n      'Josefin Sans'=>[['100','200','300','normal','500','600','700','100italic','200italic','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']],\n      'Josefin Slab'=>[['100','200','300','normal','500','600','700','100italic','200italic','300italic','italic','500italic','600italic','700italic'],['latin']],\n      'Jost'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','latin','latin-ext']],\n      'Joti One'=>[['normal'],['latin','latin-ext']],\n      'Jua'=>[['normal'],['korean','latin']],\n      'Judson'=>[['normal','italic','700'],['latin','latin-ext','vietnamese']],\n      'Julee'=>[['normal'],['latin']],\n      'Julius Sans One'=>[['normal'],['latin','latin-ext']],\n      'Junge'=>[['normal'],['latin']],\n      'Jura'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','greek','greek-ext','kayah-li','latin','latin-ext','vietnamese']],\n      'Just Another Hand'=>[['normal'],['latin']],\n      'Just Me Again Down Here'=>[['normal'],['latin','latin-ext']],\n      'K2D'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic'],['latin','latin-ext','thai','vietnamese']],\n      'Kadwa'=>[['normal','700'],['devanagari','latin']],\n      'Kaisei Decol'=>[['normal','500','700'],['cyrillic','japanese','latin','latin-ext']],\n      'Kaisei HarunoUmi'=>[['normal','500','700'],['cyrillic','japanese','latin','latin-ext']],\n      'Kaisei Opti'=>[['normal','500','700'],['cyrillic','japanese','latin','latin-ext']],\n      'Kaisei Tokumin'=>[['normal','500','700','800'],['cyrillic','japanese','latin','latin-ext']],\n      'Kalam'=>[['300','normal','700'],['devanagari','latin','latin-ext']],\n      'Kameron'=>[['normal','700'],['latin']],\n      'Kanit'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','thai','vietnamese']],\n      'Kantumruy'=>[['300','normal','700'],['khmer']],\n      'Karantina'=>[['300','normal','700'],['hebrew','latin','latin-ext']],\n      'Karla'=>[['200','300','normal','500','600','700','800','200italic','300italic','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext']],\n      'Karma'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']],\n      'Katibeh'=>[['normal'],['arabic','latin','latin-ext']],\n      'Kaushan Script'=>[['normal'],['latin','latin-ext']],\n      'Kavivanar'=>[['normal'],['latin','latin-ext','tamil']],\n      'Kavoon'=>[['normal'],['latin','latin-ext']],\n      'Kdam Thmor'=>[['normal'],['khmer']],\n      'Keania One'=>[['normal'],['latin','latin-ext']],\n      'Kelly Slab'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Kenia'=>[['normal'],['latin']],\n      'Khand'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']],\n      'Khmer'=>[['normal'],['khmer']],\n      'Khula'=>[['300','normal','600','700','800'],['devanagari','latin','latin-ext']],\n      'Kings'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Kirang Haerang'=>[['normal'],['korean','latin']],\n      'Kite One'=>[['normal'],['latin']],\n      'Kiwi Maru'=>[['300','normal','500'],['cyrillic','japanese','latin','latin-ext']],\n      'Klee One'=>[['normal','600'],['cyrillic','greek-ext','japanese','latin','latin-ext']],\n      'Knewave'=>[['normal'],['latin','latin-ext']],\n      'KoHo'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']],\n      'Kodchasan'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']],\n      'Koh Santepheap'=>[['100','300','normal','700','900'],['khmer','latin']],\n      'Kolker Brush'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Kosugi'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Kosugi Maru'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Kotta One'=>[['normal'],['latin','latin-ext']],\n      'Koulen'=>[['normal'],['khmer','latin']],\n      'Kranky'=>[['normal'],['latin']],\n      'Kreon'=>[['300','normal','500','600','700'],['latin','latin-ext']],\n      'Kristi'=>[['normal'],['latin']],\n      'Krona One'=>[['normal'],['latin','latin-ext']],\n      'Krub'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']],\n      'Kufam'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['arabic','latin','latin-ext','vietnamese']],\n      'Kulim Park'=>[['200','200italic','300','300italic','normal','italic','600','600italic','700','700italic'],['latin','latin-ext']],\n      'Kumar One'=>[['normal'],['gujarati','latin','latin-ext']],\n      'Kumar One Outline'=>[['normal'],['gujarati','latin','latin-ext']],\n      'Kumbh Sans'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext']],\n      'Kurale'=>[['normal'],['cyrillic','cyrillic-ext','devanagari','latin','latin-ext']],\n      'La Belle Aurore'=>[['normal'],['latin']],\n      'Lacquer'=>[['normal'],['latin']],\n      'Laila'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']],\n      'Lakki Reddy'=>[['normal'],['latin','telugu']],\n      'Lalezar'=>[['normal'],['arabic','latin','latin-ext','vietnamese']],\n      'Lancelot'=>[['normal'],['latin','latin-ext']],\n      'Langar'=>[['normal'],['gurmukhi','latin','latin-ext']],\n      'Lateef'=>[['normal'],['arabic','latin']],\n      'Lato'=>[['100','100italic','300','300italic','normal','italic','700','700italic','900','900italic'],['latin','latin-ext']],\n      'League Gothic'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'League Script'=>[['normal'],['latin']],\n      'League Spartan'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Leckerli One'=>[['normal'],['latin']],\n      'Ledger'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Lekton'=>[['normal','italic','700'],['latin','latin-ext']],\n      'Lemon'=>[['normal'],['latin']],\n      'Lemonada'=>[['300','normal','500','600','700'],['arabic','latin','latin-ext','vietnamese']],\n      'Lexend'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Lexend Deca'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Lexend Exa'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Lexend Giga'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Lexend Mega'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Lexend Peta'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Lexend Tera'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Lexend Zetta'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Libre Barcode 128'=>[['normal'],['latin']],\n      'Libre Barcode 128 Text'=>[['normal'],['latin']],\n      'Libre Barcode 39'=>[['normal'],['latin']],\n      'Libre Barcode 39 Extended'=>[['normal'],['latin']],\n      'Libre Barcode 39 Extended Text'=>[['normal'],['latin']],\n      'Libre Barcode 39 Text'=>[['normal'],['latin']],\n      'Libre Barcode EAN13 Text'=>[['normal'],['latin']],\n      'Libre Baskerville'=>[['normal','italic','700'],['latin','latin-ext']],\n      'Libre Caslon Display'=>[['normal'],['latin','latin-ext']],\n      'Libre Caslon Text'=>[['normal','italic','700'],['latin','latin-ext']],\n      'Libre Franklin'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Licorice'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Life Savers'=>[['normal','700','800'],['latin','latin-ext']],\n      'Lilita One'=>[['normal'],['latin','latin-ext']],\n      'Lily Script One'=>[['normal'],['latin','latin-ext']],\n      'Limelight'=>[['normal'],['latin','latin-ext']],\n      'Linden Hill'=>[['normal','italic'],['latin']],\n      'Literata'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Liu Jian Mao Cao'=>[['normal'],['chinese-simplified','latin']],\n      'Livvic'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','900','900italic'],['latin','latin-ext','vietnamese']],\n      'Lobster'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Lobster Two'=>[['normal','italic','700','700italic'],['latin']],\n      'Londrina Outline'=>[['normal'],['latin']],\n      'Londrina Shadow'=>[['normal'],['latin']],\n      'Londrina Sketch'=>[['normal'],['latin']],\n      'Londrina Solid'=>[['100','300','normal','900'],['latin']],\n      'Long Cang'=>[['normal'],['chinese-simplified','latin']],\n      'Lora'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Love Light'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Love Ya Like A Sister'=>[['normal'],['latin']],\n      'Loved by the King'=>[['normal'],['latin']],\n      'Lovers Quarrel'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Luckiest Guy'=>[['normal'],['latin']],\n      'Lusitana'=>[['normal','700'],['latin']],\n      'Lustria'=>[['normal'],['latin']],\n      'Luxurious Roman'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Luxurious Script'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'M PLUS 1'=>[['100','200','300','normal','500','600','700','800','900'],['japanese','latin','latin-ext','vietnamese']],\n      'M PLUS 1 Code'=>[['100','200','300','normal','500','600','700'],['japanese','latin','latin-ext','vietnamese']],\n      'M PLUS 1p'=>[['100','300','normal','500','700','800','900'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','japanese','latin','latin-ext','vietnamese']],\n      'M PLUS 2'=>[['100','200','300','normal','500','600','700','800','900'],['japanese','latin','latin-ext','vietnamese']],\n      'M PLUS Code Latin'=>[['100','200','300','normal','500','600','700'],['latin','latin-ext','vietnamese']],\n      'M PLUS Rounded 1c'=>[['100','300','normal','500','700','800','900'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','japanese','latin','latin-ext','vietnamese']],\n      'Ma Shan Zheng'=>[['normal'],['chinese-simplified','latin']],\n      'Macondo'=>[['normal'],['latin']],\n      'Macondo Swash Caps'=>[['normal'],['latin']],\n      'Mada'=>[['200','300','normal','500','600','700','900'],['arabic','latin']],\n      'Magra'=>[['normal','700'],['latin','latin-ext']],\n      'Maiden Orange'=>[['normal'],['latin']],\n      'Maitree'=>[['200','300','normal','500','600','700'],['latin','latin-ext','thai','vietnamese']],\n      'Major Mono Display'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Mako'=>[['normal'],['latin']],\n      'Mali'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']],\n      'Mallanna'=>[['normal'],['latin','telugu']],\n      'Mandali'=>[['normal'],['latin','telugu']],\n      'Manjari'=>[['100','normal','700'],['latin','latin-ext','malayalam']],\n      'Manrope'=>[['200','300','normal','500','600','700','800'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'Mansalva'=>[['normal'],['latin']],\n      'Manuale'=>[['300','normal','500','600','700','800','300italic','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext','vietnamese']],\n      'Marcellus'=>[['normal'],['latin','latin-ext']],\n      'Marcellus SC'=>[['normal'],['latin','latin-ext']],\n      'Marck Script'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Margarine'=>[['normal'],['latin','latin-ext']],\n      'Markazi Text'=>[['normal','500','600','700'],['arabic','latin','latin-ext','vietnamese']],\n      'Marko One'=>[['normal'],['latin']],\n      'Marmelad'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Martel'=>[['200','300','normal','600','700','800','900'],['devanagari','latin','latin-ext']],\n      'Martel Sans'=>[['200','300','normal','600','700','800','900'],['devanagari','latin','latin-ext']],\n      'Marvel'=>[['normal','italic','700','700italic'],['latin']],\n      'Mate'=>[['normal','italic'],['latin']],\n      'Mate SC'=>[['normal'],['latin']],\n      'Maven Pro'=>[['normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'McLaren'=>[['normal'],['latin','latin-ext']],\n      'Mea Culpa'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Meddon'=>[['normal'],['latin']],\n      'MedievalSharp'=>[['normal'],['latin','latin-ext']],\n      'Medula One'=>[['normal'],['latin']],\n      'Meera Inimai'=>[['normal'],['latin','tamil']],\n      'Megrim'=>[['normal'],['latin']],\n      'Meie Script'=>[['normal'],['latin','latin-ext']],\n      'Meow Script'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Merienda'=>[['normal','700'],['latin','latin-ext']],\n      'Merienda One'=>[['normal'],['latin']],\n      'Merriweather'=>[['300','300italic','normal','italic','700','700italic','900','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Merriweather Sans'=>[['300','normal','500','600','700','800','300italic','italic','500italic','600italic','700italic','800italic'],['cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Metal'=>[['normal'],['khmer','latin']],\n      'Metal Mania'=>[['normal'],['latin','latin-ext']],\n      'Metamorphous'=>[['normal'],['latin','latin-ext']],\n      'Metrophobic'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Michroma'=>[['normal'],['latin']],\n      'Milonga'=>[['normal'],['latin','latin-ext']],\n      'Miltonian'=>[['normal'],['latin']],\n      'Miltonian Tattoo'=>[['normal'],['latin']],\n      'Mina'=>[['normal','700'],['bengali','latin','latin-ext']],\n      'Miniver'=>[['normal'],['latin']],\n      'Miriam Libre'=>[['normal','700'],['hebrew','latin','latin-ext']],\n      'Mirza'=>[['normal','500','600','700'],['arabic','latin','latin-ext']],\n      'Miss Fajardose'=>[['normal'],['latin','latin-ext']],\n      'Mitr'=>[['200','300','normal','500','600','700'],['latin','latin-ext','thai','vietnamese']],\n      'Mochiy Pop One'=>[['normal'],['japanese','latin']],\n      'Mochiy Pop P One'=>[['normal'],['japanese','latin']],\n      'Modak'=>[['normal'],['devanagari','latin','latin-ext']],\n      'Modern Antiqua'=>[['normal'],['latin','latin-ext']],\n      'Mogra'=>[['normal'],['gujarati','latin','latin-ext']],\n      'Mohave'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext']],\n      'Molengo'=>[['normal'],['latin','latin-ext']],\n      'Molle'=>[['italic'],['latin','latin-ext']],\n      'Monda'=>[['normal','700'],['latin','latin-ext','vietnamese']],\n      'Monofett'=>[['normal'],['latin']],\n      'Monoton'=>[['normal'],['latin']],\n      'Monsieur La Doulaise'=>[['normal'],['latin','latin-ext']],\n      'Montaga'=>[['normal'],['latin']],\n      'Montagu Slab'=>[['100','200','300','normal','500','600','700'],['latin','latin-ext','vietnamese']],\n      'MonteCarlo'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Montez'=>[['normal'],['latin']],\n      'Montserrat'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Montserrat Alternates'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Montserrat Subrayada'=>[['normal','700'],['latin']],\n      'Moo Lah Lah'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Moon Dance'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Moul'=>[['normal'],['khmer','latin']],\n      'Moulpali'=>[['normal'],['khmer','latin']],\n      'Mountains of Christmas'=>[['normal','700'],['latin']],\n      'Mouse Memoirs'=>[['normal'],['latin','latin-ext']],\n      'Mr Bedfort'=>[['normal'],['latin','latin-ext']],\n      'Mr Dafoe'=>[['normal'],['latin','latin-ext']],\n      'Mr De Haviland'=>[['normal'],['latin','latin-ext']],\n      'Mrs Saint Delafield'=>[['normal'],['latin','latin-ext']],\n      'Mrs Sheppards'=>[['normal'],['latin','latin-ext']],\n      'Mukta'=>[['200','300','normal','500','600','700','800'],['devanagari','latin','latin-ext']],\n      'Mukta Mahee'=>[['200','300','normal','500','600','700','800'],['gurmukhi','latin','latin-ext']],\n      'Mukta Malar'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext','tamil']],\n      'Mukta Vaani'=>[['200','300','normal','500','600','700','800'],['gujarati','latin','latin-ext']],\n      'Mulish'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Murecho'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','japanese','latin','latin-ext']],\n      'MuseoModerno'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Mystery Quest'=>[['normal'],['latin','latin-ext']],\n      'NTR'=>[['normal'],['latin','telugu']],\n      'Nanum Brush Script'=>[['normal'],['korean','latin']],\n      'Nanum Gothic'=>[['normal','700','800'],['korean','latin']],\n      'Nanum Gothic Coding'=>[['normal','700'],['korean','latin']],\n      'Nanum Myeongjo'=>[['normal','700','800'],['korean','latin']],\n      'Nanum Pen Script'=>[['normal'],['korean','latin']],\n      'Neonderthaw'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Nerko One'=>[['normal'],['latin','latin-ext']],\n      'Neucha'=>[['normal'],['cyrillic','latin']],\n      'Neuton'=>[['200','300','normal','italic','700','800'],['latin','latin-ext']],\n      'New Rocker'=>[['normal'],['latin','latin-ext']],\n      'New Tegomin'=>[['normal'],['japanese','latin','latin-ext']],\n      'News Cycle'=>[['normal','700'],['latin','latin-ext']],\n      'Newsreader'=>[['200','300','normal','500','600','700','800','200italic','300italic','italic','500italic','600italic','700italic','800italic'],['latin','latin-ext','vietnamese']],\n      'Niconne'=>[['normal'],['latin','latin-ext']],\n      'Niramit'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext','thai','vietnamese']],\n      'Nixie One'=>[['normal'],['latin']],\n      'Nobile'=>[['normal','italic','500','500italic','700','700italic'],['latin','latin-ext']],\n      'Nokora'=>[['100','300','normal','700','900'],['khmer','latin']],\n      'Norican'=>[['normal'],['latin','latin-ext']],\n      'Nosifer'=>[['normal'],['latin','latin-ext']],\n      'Notable'=>[['normal'],['latin']],\n      'Nothing You Could Do'=>[['normal'],['latin']],\n      'Noticia Text'=>[['normal','italic','700','700italic'],['latin','latin-ext','vietnamese']],\n      'Noto Kufi Arabic'=>[['100','200','300','normal','500','600','700','800','900'],['arabic']],\n      'Noto Music'=>[['normal'],['music']],\n      'Noto Naskh Arabic'=>[['normal','500','600','700'],['arabic']],\n      'Noto Nastaliq Urdu'=>[['normal','700'],['arabic']],\n      'Noto Rashi Hebrew'=>[['100','200','300','normal','500','600','700','800','900'],['hebrew']],\n      'Noto Sans'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','devanagari','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Noto Sans Adlam'=>[['normal','500','600','700'],['adlam']],\n      'Noto Sans Adlam Unjoined'=>[['normal','500','600','700'],['adlam']],\n      'Noto Sans Anatolian Hieroglyphs'=>[['normal'],['anatolian-hieroglyphs']],\n      'Noto Sans Arabic'=>[['100','200','300','normal','500','600','700','800','900'],['arabic']],\n      'Noto Sans Armenian'=>[['100','200','300','normal','500','600','700','800','900'],['armenian']],\n      'Noto Sans Avestan'=>[['normal'],['avestan']],\n      'Noto Sans Balinese'=>[['normal','500','600','700'],['balinese']],\n      'Noto Sans Bamum'=>[['normal','500','600','700'],['bamum']],\n      'Noto Sans Bassa Vah'=>[['normal'],['bassa-vah']],\n      'Noto Sans Batak'=>[['normal'],['batak']],\n      'Noto Sans Bengali'=>[['100','200','300','normal','500','600','700','800','900'],['bengali']],\n      'Noto Sans Bhaiksuki'=>[['normal'],['bhaiksuki']],\n      'Noto Sans Brahmi'=>[['normal'],['brahmi']],\n      'Noto Sans Buginese'=>[['normal'],['buginese']],\n      'Noto Sans Buhid'=>[['normal'],['buhid']],\n      'Noto Sans Canadian Aboriginal'=>[['100','200','300','normal','500','600','700','800','900'],['canadian-aboriginal']],\n      'Noto Sans Carian'=>[['normal'],['carian']],\n      'Noto Sans Caucasian Albanian'=>[['normal'],['caucasian-albanian']],\n      'Noto Sans Chakma'=>[['normal'],['chakma']],\n      'Noto Sans Cham'=>[['100','200','300','normal','500','600','700','800','900'],['cham']],\n      'Noto Sans Cherokee'=>[['100','200','300','normal','500','600','700','800','900'],['cherokee']],\n      'Noto Sans Coptic'=>[['normal'],['coptic']],\n      'Noto Sans Cuneiform'=>[['normal'],['cuneiform']],\n      'Noto Sans Cypriot'=>[['normal'],['cypriot']],\n      'Noto Sans Deseret'=>[['normal'],['deseret']],\n      'Noto Sans Devanagari'=>[['100','200','300','normal','500','600','700','800','900'],['devanagari']],\n      'Noto Sans Display'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Noto Sans Duployan'=>[['normal'],['duployan']],\n      'Noto Sans Egyptian Hieroglyphs'=>[['normal'],['egyptian-hieroglyphs']],\n      'Noto Sans Elbasan'=>[['normal'],['elbasan']],\n      'Noto Sans Elymaic'=>[['normal'],['elymaic']],\n      'Noto Sans Georgian'=>[['100','200','300','normal','500','600','700','800','900'],['georgian']],\n      'Noto Sans Glagolitic'=>[['normal'],['glagolitic']],\n      'Noto Sans Gothic'=>[['normal'],['gothic']],\n      'Noto Sans Grantha'=>[['normal'],['grantha']],\n      'Noto Sans Gujarati'=>[['100','200','300','normal','500','600','700','800','900'],['gujarati']],\n      'Noto Sans Gunjala Gondi'=>[['normal'],['gunjala-gondi']],\n      'Noto Sans Gurmukhi'=>[['100','200','300','normal','500','600','700','800','900'],['gurmukhi']],\n      'Noto Sans HK'=>[['100','300','normal','500','700','900'],['chinese-hongkong','latin']],\n      'Noto Sans Hanifi Rohingya'=>[['normal','500','600','700'],['hanifi-rohingya']],\n      'Noto Sans Hanunoo'=>[['normal'],['hanunoo']],\n      'Noto Sans Hatran'=>[['normal'],['hatran']],\n      'Noto Sans Hebrew'=>[['100','200','300','normal','500','600','700','800','900'],['hebrew']],\n      'Noto Sans Imperial Aramaic'=>[['normal'],['imperial-aramaic']],\n      'Noto Sans Indic Siyaq Numbers'=>[['normal'],['indic-siyaq-numbers']],\n      'Noto Sans Inscriptional Pahlavi'=>[['normal'],['inscriptional-pahlavi']],\n      'Noto Sans Inscriptional Parthian'=>[['normal'],['inscriptional-parthian']],\n      'Noto Sans JP'=>[['100','300','normal','500','700','900'],['japanese','latin']],\n      'Noto Sans Javanese'=>[['normal','700'],['javanese']],\n      'Noto Sans KR'=>[['100','300','normal','500','700','900'],['korean','latin']],\n      'Noto Sans Kaithi'=>[['normal'],['kaithi']],\n      'Noto Sans Kannada'=>[['100','200','300','normal','500','600','700','800','900'],['kannada']],\n      'Noto Sans Kayah Li'=>[['normal','500','600','700'],['kayah-li']],\n      'Noto Sans Kharoshthi'=>[['normal'],['kharoshthi']],\n      'Noto Sans Khmer'=>[['100','200','300','normal','500','600','700','800','900'],['khmer']],\n      'Noto Sans Khojki'=>[['normal'],['khojki']],\n      'Noto Sans Khudawadi'=>[['normal'],['khudawadi']],\n      'Noto Sans Lao'=>[['100','200','300','normal','500','600','700','800','900'],['lao']],\n      'Noto Sans Lepcha'=>[['normal'],['lepcha']],\n      'Noto Sans Limbu'=>[['normal'],['limbu']],\n      'Noto Sans Linear A'=>[['normal'],['linear-a']],\n      'Noto Sans Linear B'=>[['normal'],['linear-b']],\n      'Noto Sans Lisu'=>[['normal','500','600','700'],['lisu']],\n      'Noto Sans Lycian'=>[['normal'],['lycian']],\n      'Noto Sans Lydian'=>[['normal'],['lydian']],\n      'Noto Sans Mahajani'=>[['normal'],['mahajani']],\n      'Noto Sans Malayalam'=>[['100','200','300','normal','500','600','700','800','900'],['malayalam']],\n      'Noto Sans Mandaic'=>[['normal'],['mandaic']],\n      'Noto Sans Manichaean'=>[['normal'],['manichaean']],\n      'Noto Sans Marchen'=>[['normal'],['marchen']],\n      'Noto Sans Masaram Gondi'=>[['normal'],['masaram-gondi']],\n      'Noto Sans Math'=>[['normal'],['math']],\n      'Noto Sans Mayan Numerals'=>[['normal'],['mayan-numerals']],\n      'Noto Sans Medefaidrin'=>[['normal','500','600','700'],['medefaidrin']],\n      'Noto Sans Meetei Mayek'=>[['100','200','300','normal','500','600','700','800','900'],['meetei-mayek']],\n      'Noto Sans Meroitic'=>[['normal'],['meroitic']],\n      'Noto Sans Miao'=>[['normal'],['miao']],\n      'Noto Sans Modi'=>[['normal'],['modi']],\n      'Noto Sans Mongolian'=>[['normal'],['mongolian']],\n      'Noto Sans Mono'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Noto Sans Mro'=>[['normal'],['mro']],\n      'Noto Sans Multani'=>[['normal'],['multani']],\n      'Noto Sans Myanmar'=>[['100','200','300','normal','500','600','700','800','900'],['myanmar']],\n      'Noto Sans N Ko'=>[['normal'],['nko']],\n      'Noto Sans Nabataean'=>[['normal'],['nabataean']],\n      'Noto Sans New Tai Lue'=>[['normal'],['new-tai-lue']],\n      'Noto Sans Newa'=>[['normal'],['newa']],\n      'Noto Sans Nushu'=>[['normal'],['nushu']],\n      'Noto Sans Ogham'=>[['normal'],['ogham']],\n      'Noto Sans Ol Chiki'=>[['normal','500','600','700'],['ol-chiki']],\n      'Noto Sans Old Hungarian'=>[['normal'],['old-hungarian']],\n      'Noto Sans Old Italic'=>[['normal'],['old-italic']],\n      'Noto Sans Old North Arabian'=>[['normal'],['old-north-arabian']],\n      'Noto Sans Old Permic'=>[['normal'],['old-permic']],\n      'Noto Sans Old Persian'=>[['normal'],['old-persian']],\n      'Noto Sans Old Sogdian'=>[['normal'],['old-sogdian']],\n      'Noto Sans Old South Arabian'=>[['normal'],['old-south-arabian']],\n      'Noto Sans Old Turkic'=>[['normal'],['old-turkic']],\n      'Noto Sans Oriya'=>[['100','normal','700','900'],['oriya']],\n      'Noto Sans Osage'=>[['normal'],['osage']],\n      'Noto Sans Osmanya'=>[['normal'],['osmanya']],\n      'Noto Sans Pahawh Hmong'=>[['normal'],['pahawh-hmong']],\n      'Noto Sans Palmyrene'=>[['normal'],['palmyrene']],\n      'Noto Sans Pau Cin Hau'=>[['normal'],['pau-cin-hau']],\n      'Noto Sans Phags Pa'=>[['normal'],['phags-pa']],\n      'Noto Sans Phoenician'=>[['normal'],['phoenician']],\n      'Noto Sans Psalter Pahlavi'=>[['normal'],['psalter-pahlavi']],\n      'Noto Sans Rejang'=>[['normal'],['rejang']],\n      'Noto Sans Runic'=>[['normal'],['runic']],\n      'Noto Sans SC'=>[['100','300','normal','500','700','900'],['chinese-simplified','latin']],\n      'Noto Sans Samaritan'=>[['normal'],['samaritan']],\n      'Noto Sans Saurashtra'=>[['normal'],['saurashtra']],\n      'Noto Sans Sharada'=>[['normal'],['sharada']],\n      'Noto Sans Shavian'=>[['normal'],['shavian']],\n      'Noto Sans Siddham'=>[['normal'],['siddham']],\n      'Noto Sans Sinhala'=>[['100','200','300','normal','500','600','700','800','900'],['sinhala']],\n      'Noto Sans Sogdian'=>[['normal'],['sogdian']],\n      'Noto Sans Sora Sompeng'=>[['normal','500','600','700'],['sora-sompeng']],\n      'Noto Sans Soyombo'=>[['normal'],['soyombo']],\n      'Noto Sans Sundanese'=>[['normal','500','600','700'],['sundanese']],\n      'Noto Sans Syloti Nagri'=>[['normal'],['syloti-nagri']],\n      'Noto Sans Symbols'=>[['100','200','300','normal','500','600','700','800','900'],['symbols']],\n      'Noto Sans Symbols 2'=>[['normal'],['symbols']],\n      'Noto Sans Syriac'=>[['100','normal','900'],['syriac']],\n      'Noto Sans TC'=>[['100','300','normal','500','700','900'],['chinese-traditional','latin']],\n      'Noto Sans Tagalog'=>[['normal'],['tagalog']],\n      'Noto Sans Tagbanwa'=>[['normal'],['tagbanwa']],\n      'Noto Sans Tai Le'=>[['normal'],['tai-le']],\n      'Noto Sans Tai Tham'=>[['normal','500','600','700'],['tai-tham']],\n      'Noto Sans Tai Viet'=>[['normal'],['tai-viet']],\n      'Noto Sans Takri'=>[['normal'],['takri']],\n      'Noto Sans Tamil'=>[['100','200','300','normal','500','600','700','800','900'],['tamil']],\n      'Noto Sans Tamil Supplement'=>[['normal'],['tamil-supplement']],\n      'Noto Sans Telugu'=>[['100','200','300','normal','500','600','700','800','900'],['telugu']],\n      'Noto Sans Thaana'=>[['100','200','300','normal','500','600','700','800','900'],['thaana']],\n      'Noto Sans Thai'=>[['100','200','300','normal','500','600','700','800','900'],['thai']],\n      'Noto Sans Thai Looped'=>[['100','200','300','normal','500','600','700','800','900'],['thai']],\n      'Noto Sans Tifinagh'=>[['normal'],['tifinagh']],\n      'Noto Sans Tirhuta'=>[['normal'],['tirhuta']],\n      'Noto Sans Ugaritic'=>[['normal'],['ugaritic']],\n      'Noto Sans Vai'=>[['normal'],['vai']],\n      'Noto Sans Wancho'=>[['normal'],['wancho']],\n      'Noto Sans Warang Citi'=>[['normal'],['warang-citi']],\n      'Noto Sans Yi'=>[['normal'],['yi']],\n      'Noto Sans Zanabazar Square'=>[['normal'],['zanabazar-square']],\n      'Noto Serif'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Noto Serif Ahom'=>[['normal'],['ahom']],\n      'Noto Serif Armenian'=>[['100','200','300','normal','500','600','700','800','900'],['armenian']],\n      'Noto Serif Balinese'=>[['normal'],['balinese']],\n      'Noto Serif Bengali'=>[['100','200','300','normal','500','600','700','800','900'],['bengali']],\n      'Noto Serif Devanagari'=>[['100','200','300','normal','500','600','700','800','900'],['devanagari']],\n      'Noto Serif Display'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Noto Serif Dogra'=>[['normal'],['dogra']],\n      'Noto Serif Ethiopic'=>[['100','200','300','normal','500','600','700','800','900'],['ethiopic']],\n      'Noto Serif Georgian'=>[['100','200','300','normal','500','600','700','800','900'],['georgian']],\n      'Noto Serif Grantha'=>[['normal'],['grantha']],\n      'Noto Serif Gujarati'=>[['100','200','300','normal','500','600','700','800','900'],['gujarati']],\n      'Noto Serif Gurmukhi'=>[['100','200','300','normal','500','600','700','800','900'],['gurmukhi']],\n      'Noto Serif Hebrew'=>[['100','200','300','normal','500','600','700','800','900'],['hebrew']],\n      'Noto Serif JP'=>[['200','300','normal','500','600','700','900'],['japanese','latin']],\n      'Noto Serif KR'=>[['200','300','normal','500','600','700','900'],['korean','latin']],\n      'Noto Serif Kannada'=>[['100','200','300','normal','500','600','700','800','900'],['kannada']],\n      'Noto Serif Khmer'=>[['100','200','300','normal','500','600','700','800','900'],['khmer']],\n      'Noto Serif Lao'=>[['100','200','300','normal','500','600','700','800','900'],['lao']],\n      'Noto Serif Malayalam'=>[['100','200','300','normal','500','600','700','800','900'],['malayalam']],\n      'Noto Serif Myanmar'=>[['100','200','300','normal','500','600','700','800','900'],['myanmar']],\n      'Noto Serif Nyiakeng Puachue Hmong'=>[['normal','500','600','700'],['nyiakeng-puachue-hmong']],\n      'Noto Serif SC'=>[['200','300','normal','500','600','700','900'],['chinese-simplified','latin']],\n      'Noto Serif Sinhala'=>[['100','200','300','normal','500','600','700','800','900'],['sinhala']],\n      'Noto Serif TC'=>[['200','300','normal','500','600','700','900'],['chinese-traditional','latin']],\n      'Noto Serif Tamil'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['tamil']],\n      'Noto Serif Tangut'=>[['normal'],['tangut']],\n      'Noto Serif Telugu'=>[['100','200','300','normal','500','600','700','800','900'],['telugu']],\n      'Noto Serif Thai'=>[['100','200','300','normal','500','600','700','800','900'],['thai']],\n      'Noto Serif Tibetan'=>[['100','200','300','normal','500','600','700','800','900'],['tibetan']],\n      'Noto Serif Yezidi'=>[['normal','500','600','700'],['yezidi']],\n      'Noto Traditional Nushu'=>[['normal'],['nushu']],\n      'Nova Cut'=>[['normal'],['latin']],\n      'Nova Flat'=>[['normal'],['latin']],\n      'Nova Mono'=>[['normal'],['greek','latin']],\n      'Nova Oval'=>[['normal'],['latin']],\n      'Nova Round'=>[['normal'],['latin']],\n      'Nova Script'=>[['normal'],['latin']],\n      'Nova Slim'=>[['normal'],['latin']],\n      'Nova Square'=>[['normal'],['latin']],\n      'Numans'=>[['normal'],['latin']],\n      'Nunito'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Nunito Sans'=>[['200','200italic','300','300italic','normal','italic','600','600italic','700','700italic','800','800italic','900','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Odibee Sans'=>[['normal'],['latin']],\n      'Odor Mean Chey'=>[['normal'],['khmer','latin']],\n      'Offside'=>[['normal'],['latin']],\n      'Oi'=>[['normal'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','tamil','vietnamese']],\n      'Old Standard TT'=>[['normal','italic','700'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Oldenburg'=>[['normal'],['latin','latin-ext']],\n      'Ole'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Oleo Script'=>[['normal','700'],['latin','latin-ext']],\n      'Oleo Script Swash Caps'=>[['normal','700'],['latin','latin-ext']],\n      'Oooh Baby'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Open Sans'=>[['300','normal','500','600','700','800','300italic','italic','500italic','600italic','700italic','800italic'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','latin','latin-ext','vietnamese']],\n      'Oranienbaum'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'Orbitron'=>[['normal','500','600','700','800','900'],['latin']],\n      'Oregano'=>[['normal','italic'],['latin','latin-ext']],\n      'Orelega One'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'Orienta'=>[['normal'],['latin','latin-ext']],\n      'Original Surfer'=>[['normal'],['latin']],\n      'Oswald'=>[['200','300','normal','500','600','700'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Otomanopee One'=>[['normal'],['japanese','latin','latin-ext']],\n      'Outfit'=>[['100','200','300','normal','500','600','700','800','900'],['latin']],\n      'Over the Rainbow'=>[['normal'],['latin']],\n      'Overlock'=>[['normal','italic','700','700italic','900','900italic'],['latin','latin-ext']],\n      'Overlock SC'=>[['normal'],['latin','latin-ext']],\n      'Overpass'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Overpass Mono'=>[['300','normal','500','600','700'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Ovo'=>[['normal'],['latin']],\n      'Oxanium'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext']],\n      'Oxygen'=>[['300','normal','700'],['latin','latin-ext']],\n      'Oxygen Mono'=>[['normal'],['latin','latin-ext']],\n      'PT Mono'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'PT Sans'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'PT Sans Caption'=>[['normal','700'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'PT Sans Narrow'=>[['normal','700'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'PT Serif'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'PT Serif Caption'=>[['normal','italic'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'Pacifico'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Padauk'=>[['normal','700'],['latin','myanmar']],\n      'Palanquin'=>[['100','200','300','normal','500','600','700'],['devanagari','latin','latin-ext']],\n      'Palanquin Dark'=>[['normal','500','600','700'],['devanagari','latin','latin-ext']],\n      'Palette Mosaic'=>[['normal'],['japanese','latin']],\n      'Pangolin'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Paprika'=>[['normal'],['latin']],\n      'Parisienne'=>[['normal'],['latin','latin-ext']],\n      'Passero One'=>[['normal'],['latin','latin-ext']],\n      'Passion One'=>[['normal','700','900'],['latin','latin-ext']],\n      'Passions Conflict'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Pathway Gothic One'=>[['normal'],['latin','latin-ext']],\n      'Patrick Hand'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Patrick Hand SC'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Pattaya'=>[['normal'],['cyrillic','latin','latin-ext','thai','vietnamese']],\n      'Patua One'=>[['normal'],['latin']],\n      'Pavanam'=>[['normal'],['latin','latin-ext','tamil']],\n      'Paytone One'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Peddana'=>[['normal'],['latin','telugu']],\n      'Peralta'=>[['normal'],['latin','latin-ext']],\n      'Permanent Marker'=>[['normal'],['latin']],\n      'Petemoss'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Petit Formal Script'=>[['normal'],['latin','latin-ext']],\n      'Petrona'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Philosopher'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','vietnamese']],\n      'Piazzolla'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Piedra'=>[['normal'],['latin','latin-ext']],\n      'Pinyon Script'=>[['normal'],['latin']],\n      'Pirata One'=>[['normal'],['latin','latin-ext']],\n      'Plaster'=>[['normal'],['latin','latin-ext']],\n      'Play'=>[['normal','700'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'Playball'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Playfair Display'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','latin','latin-ext','vietnamese']],\n      'Playfair Display SC'=>[['normal','italic','700','700italic','900','900italic'],['cyrillic','latin','latin-ext','vietnamese']],\n      'Podkova'=>[['normal','500','600','700','800'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Poiret One'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Poller One'=>[['normal'],['latin']],\n      'Poly'=>[['normal','italic'],['latin']],\n      'Pompiere'=>[['normal'],['latin']],\n      'Pontano Sans'=>[['normal'],['latin','latin-ext']],\n      'Poor Story'=>[['normal'],['korean','latin']],\n      'Poppins'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['devanagari','latin','latin-ext']],\n      'Port Lligat Sans'=>[['normal'],['latin']],\n      'Port Lligat Slab'=>[['normal'],['latin']],\n      'Potta One'=>[['normal'],['japanese','latin','latin-ext','vietnamese']],\n      'Pragati Narrow'=>[['normal','700'],['devanagari','latin','latin-ext']],\n      'Praise'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Prata'=>[['normal'],['cyrillic','cyrillic-ext','latin','vietnamese']],\n      'Preahvihear'=>[['normal'],['khmer','latin']],\n      'Press Start 2P'=>[['normal'],['cyrillic','cyrillic-ext','greek','latin','latin-ext']],\n      'Pridi'=>[['200','300','normal','500','600','700'],['latin','latin-ext','thai','vietnamese']],\n      'Princess Sofia'=>[['normal'],['latin','latin-ext']],\n      'Prociono'=>[['normal'],['latin']],\n      'Prompt'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','thai','vietnamese']],\n      'Prosto One'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Proza Libre'=>[['normal','italic','500','500italic','600','600italic','700','700italic','800','800italic'],['latin','latin-ext']],\n      'Public Sans'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']],\n      'Puppies Play'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Puritan'=>[['normal','italic','700','700italic'],['latin']],\n      'Purple Purse'=>[['normal'],['latin','latin-ext']],\n      'Qahiri'=>[['normal'],['arabic','latin']],\n      'Quando'=>[['normal'],['latin','latin-ext']],\n      'Quantico'=>[['normal','italic','700','700italic'],['latin']],\n      'Quattrocento'=>[['normal','700'],['latin','latin-ext']],\n      'Quattrocento Sans'=>[['normal','italic','700','700italic'],['latin','latin-ext']],\n      'Questrial'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Quicksand'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']],\n      'Quintessential'=>[['normal'],['latin','latin-ext']],\n      'Qwigley'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Qwitcher Grypen'=>[['normal','700'],['latin','latin-ext','vietnamese']],\n      'Racing Sans One'=>[['normal'],['latin','latin-ext']],\n      'Radley'=>[['normal','italic'],['latin','latin-ext']],\n      'Rajdhani'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']],\n      'Rakkas'=>[['normal'],['arabic','latin','latin-ext']],\n      'Raleway'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Raleway Dots'=>[['normal'],['latin','latin-ext']],\n      'Ramabhadra'=>[['normal'],['latin','telugu']],\n      'Ramaraja'=>[['normal'],['latin','telugu']],\n      'Rambla'=>[['normal','italic','700','700italic'],['latin','latin-ext']],\n      'Rammetto One'=>[['normal'],['latin','latin-ext']],\n      'Rampart One'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Ranchers'=>[['normal'],['latin','latin-ext']],\n      'Rancho'=>[['normal'],['latin']],\n      'Ranga'=>[['normal','700'],['devanagari','latin','latin-ext']],\n      'Rasa'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['gujarati','latin','latin-ext','vietnamese']],\n      'Rationale'=>[['normal'],['latin']],\n      'Ravi Prakash'=>[['normal'],['latin','telugu']],\n      'Readex Pro'=>[['200','300','normal','500','600','700'],['arabic','latin','latin-ext','vietnamese']],\n      'Recursive'=>[['300','normal','500','600','700','800','900'],['cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Red Hat Display'=>[['300','normal','500','600','700','800','900','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']],\n      'Red Hat Mono'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext']],\n      'Red Hat Text'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext']],\n      'Red Rose'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']],\n      'Redacted'=>[['normal'],['latin','latin-ext']],\n      'Redacted Script'=>[['300','normal','700'],['latin','latin-ext']],\n      'Redressed'=>[['normal'],['latin']],\n      'Reem Kufi'=>[['normal','500','600','700'],['arabic','latin']],\n      'Reenie Beanie'=>[['normal'],['latin']],\n      'Reggae One'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Revalia'=>[['normal'],['latin','latin-ext']],\n      'Rhodium Libre'=>[['normal'],['devanagari','latin','latin-ext']],\n      'Ribeye'=>[['normal'],['latin','latin-ext']],\n      'Ribeye Marrow'=>[['normal'],['latin','latin-ext']],\n      'Righteous'=>[['normal'],['latin','latin-ext']],\n      'Risque'=>[['normal'],['latin','latin-ext']],\n      'Road Rage'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Roboto'=>[['100','100italic','300','300italic','normal','italic','500','500italic','700','700italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Roboto Condensed'=>[['300','300italic','normal','italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Roboto Mono'=>[['100','200','300','normal','500','600','700','100italic','200italic','300italic','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'Roboto Serif'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Roboto Slab'=>[['100','200','300','normal','500','600','700','800','900'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Rochester'=>[['normal'],['latin']],\n      'Rock 3D'=>[['normal'],['japanese','latin']],\n      'Rock Salt'=>[['normal'],['latin']],\n      'RocknRoll One'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Rokkitt'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Romanesco'=>[['normal'],['latin','latin-ext']],\n      'Ropa Sans'=>[['normal','italic'],['latin','latin-ext']],\n      'Rosario'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']],\n      'Rosarivo'=>[['normal','italic'],['latin','latin-ext']],\n      'Rouge Script'=>[['normal'],['latin']],\n      'Rowdies'=>[['300','normal','700'],['latin','latin-ext','vietnamese']],\n      'Rozha One'=>[['normal'],['devanagari','latin','latin-ext']],\n      'Rubik'=>[['300','normal','500','600','700','800','900','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']],\n      'Rubik Beastly'=>[['normal'],['cyrillic','cyrillic-ext','hebrew','latin','latin-ext']],\n      'Rubik Mono One'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Ruda'=>[['normal','500','600','700','800','900'],['cyrillic','latin','latin-ext','vietnamese']],\n      'Rufina'=>[['normal','700'],['latin','latin-ext']],\n      'Ruge Boogie'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Ruluko'=>[['normal'],['latin','latin-ext']],\n      'Rum Raisin'=>[['normal'],['latin','latin-ext']],\n      'Ruslan Display'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Russo One'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Ruthie'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Rye'=>[['normal'],['latin','latin-ext']],\n      'STIX Two Text'=>[['normal','500','600','700','italic','500italic','600italic','700italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'Sacramento'=>[['normal'],['latin','latin-ext']],\n      'Sahitya'=>[['normal','700'],['devanagari','latin']],\n      'Sail'=>[['normal'],['latin','latin-ext']],\n      'Saira'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Saira Condensed'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Saira Extra Condensed'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Saira Semi Condensed'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Saira Stencil One'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Salsa'=>[['normal'],['latin']],\n      'Sanchez'=>[['normal','italic'],['latin','latin-ext']],\n      'Sancreek'=>[['normal'],['latin','latin-ext']],\n      'Sansita'=>[['normal','italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext']],\n      'Sansita Swashed'=>[['300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Sarabun'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic'],['latin','latin-ext','thai','vietnamese']],\n      'Sarala'=>[['normal','700'],['devanagari','latin','latin-ext']],\n      'Sarina'=>[['normal'],['latin','latin-ext']],\n      'Sarpanch'=>[['normal','500','600','700','800','900'],['devanagari','latin','latin-ext']],\n      'Sassy Frass'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Satisfy'=>[['normal'],['latin']],\n      'Sawarabi Gothic'=>[['normal'],['cyrillic','japanese','latin','latin-ext','vietnamese']],\n      'Sawarabi Mincho'=>[['normal'],['japanese','latin','latin-ext']],\n      'Scada'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','latin','latin-ext']],\n      'Scheherazade New'=>[['normal','700'],['arabic','latin','latin-ext']],\n      'Schoolbell'=>[['normal'],['latin']],\n      'Scope One'=>[['normal'],['latin','latin-ext']],\n      'Seaweed Script'=>[['normal'],['latin','latin-ext']],\n      'Secular One'=>[['normal'],['hebrew','latin','latin-ext']],\n      'Sedgwick Ave'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Sedgwick Ave Display'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Sen'=>[['normal','700','800'],['latin','latin-ext']],\n      'Sevillana'=>[['normal'],['latin','latin-ext']],\n      'Seymour One'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Shadows Into Light'=>[['normal'],['latin']],\n      'Shadows Into Light Two'=>[['normal'],['latin','latin-ext']],\n      'Shalimar'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Shanti'=>[['normal'],['latin']],\n      'Share'=>[['normal','italic','700','700italic'],['latin','latin-ext']],\n      'Share Tech'=>[['normal'],['latin']],\n      'Share Tech Mono'=>[['normal'],['latin']],\n      'Shippori Antique'=>[['normal'],['japanese','latin','latin-ext']],\n      'Shippori Antique B1'=>[['normal'],['japanese','latin','latin-ext']],\n      'Shippori Mincho'=>[['normal','500','600','700','800'],['japanese','latin','latin-ext']],\n      'Shippori Mincho B1'=>[['normal','500','600','700','800'],['japanese','latin','latin-ext']],\n      'Shizuru'=>[['normal'],['japanese','latin']],\n      'Shojumaru'=>[['normal'],['latin','latin-ext']],\n      'Short Stack'=>[['normal'],['latin']],\n      'Shrikhand'=>[['normal'],['gujarati','latin','latin-ext']],\n      'Siemreap'=>[['normal'],['khmer']],\n      'Sigmar One'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Signika'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']],\n      'Signika Negative'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']],\n      'Simonetta'=>[['normal','italic','900','900italic'],['latin','latin-ext']],\n      'Single Day'=>[['normal'],['korean']],\n      'Sintony'=>[['normal','700'],['latin','latin-ext']],\n      'Sirin Stencil'=>[['normal'],['latin']],\n      'Six Caps'=>[['normal'],['latin']],\n      'Skranji'=>[['normal','700'],['latin','latin-ext']],\n      'Slabo 13px'=>[['normal'],['latin','latin-ext']],\n      'Slabo 27px'=>[['normal'],['latin','latin-ext']],\n      'Slackey'=>[['normal'],['latin']],\n      'Smokum'=>[['normal'],['latin']],\n      'Smooch'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Smooch Sans'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Smythe'=>[['normal'],['latin']],\n      'Sniglet'=>[['normal','800'],['latin','latin-ext']],\n      'Snippet'=>[['normal'],['latin']],\n      'Snowburst One'=>[['normal'],['latin','latin-ext']],\n      'Sofadi One'=>[['normal'],['latin']],\n      'Sofia'=>[['normal'],['latin']],\n      'Solway'=>[['300','normal','500','700','800'],['latin']],\n      'Song Myung'=>[['normal'],['korean','latin']],\n      'Sonsie One'=>[['normal'],['latin','latin-ext']],\n      'Sora'=>[['100','200','300','normal','500','600','700','800'],['latin','latin-ext']],\n      'Sorts Mill Goudy'=>[['normal','italic'],['latin','latin-ext']],\n      'Source Code Pro'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Source Sans 3'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Source Sans Pro'=>[['200','200italic','300','300italic','normal','italic','600','600italic','700','700italic','900','900italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext','vietnamese']],\n      'Source Serif 4'=>[['200','300','normal','500','600','700','800','900','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'Source Serif Pro'=>[['200','200italic','300','300italic','normal','italic','600','600italic','700','700italic','900','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'Space Grotesk'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']],\n      'Space Mono'=>[['normal','italic','700','700italic'],['latin','latin-ext','vietnamese']],\n      'Spartan'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext']],\n      'Special Elite'=>[['normal'],['latin']],\n      'Spectral'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic'],['cyrillic','latin','latin-ext','vietnamese']],\n      'Spectral SC'=>[['200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic'],['cyrillic','latin','latin-ext','vietnamese']],\n      'Spicy Rice'=>[['normal'],['latin']],\n      'Spinnaker'=>[['normal'],['latin','latin-ext']],\n      'Spirax'=>[['normal'],['latin']],\n      'Spline Sans'=>[['300','normal','500','600','700'],['latin','latin-ext']],\n      'Squada One'=>[['normal'],['latin']],\n      'Sree Krushnadevaraya'=>[['normal'],['latin','telugu']],\n      'Sriracha'=>[['normal'],['latin','latin-ext','thai','vietnamese']],\n      'Srisakdi'=>[['normal','700'],['latin','latin-ext','thai','vietnamese']],\n      'Staatliches'=>[['normal'],['latin','latin-ext']],\n      'Stalemate'=>[['normal'],['latin','latin-ext']],\n      'Stalinist One'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Stardos Stencil'=>[['normal','700'],['latin']],\n      'Stick'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Stick No Bills'=>[['200','300','normal','500','600','700','800'],['latin','latin-ext','sinhala']],\n      'Stint Ultra Condensed'=>[['normal'],['latin','latin-ext']],\n      'Stint Ultra Expanded'=>[['normal'],['latin','latin-ext']],\n      'Stoke'=>[['300','normal'],['latin','latin-ext']],\n      'Strait'=>[['normal'],['latin']],\n      'Style Script'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Stylish'=>[['normal'],['korean','latin']],\n      'Sue Ellen Francisco'=>[['normal'],['latin']],\n      'Suez One'=>[['normal'],['hebrew','latin','latin-ext']],\n      'Sulphur Point'=>[['300','normal','700'],['latin','latin-ext']],\n      'Sumana'=>[['normal','700'],['devanagari','latin','latin-ext']],\n      'Sunflower'=>[['300','500','700'],['korean','latin']],\n      'Sunshiney'=>[['normal'],['latin']],\n      'Supermercado One'=>[['normal'],['latin']],\n      'Sura'=>[['normal','700'],['devanagari','latin','latin-ext']],\n      'Suranna'=>[['normal'],['latin','telugu']],\n      'Suravaram'=>[['normal'],['latin','telugu']],\n      'Suwannaphum'=>[['100','300','normal','700','900'],['khmer','latin']],\n      'Swanky and Moo Moo'=>[['normal'],['latin']],\n      'Syncopate'=>[['normal','700'],['latin']],\n      'Syne'=>[['normal','500','600','700','800'],['latin','latin-ext']],\n      'Syne Mono'=>[['normal'],['latin','latin-ext']],\n      'Syne Tactile'=>[['normal'],['latin','latin-ext']],\n      'Tajawal'=>[['200','300','normal','500','700','800','900'],['arabic','latin']],\n      'Tangerine'=>[['normal','700'],['latin']],\n      'Taprom'=>[['normal'],['khmer','latin']],\n      'Tauri'=>[['normal'],['latin','latin-ext']],\n      'Taviraj'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','thai','vietnamese']],\n      'Teko'=>[['300','normal','500','600','700'],['devanagari','latin','latin-ext']],\n      'Telex'=>[['normal'],['latin','latin-ext']],\n      'Tenali Ramakrishna'=>[['normal'],['latin','telugu']],\n      'Tenor Sans'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Text Me One'=>[['normal'],['latin','latin-ext']],\n      'Texturina'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Thasadith'=>[['normal','italic','700','700italic'],['latin','latin-ext','thai','vietnamese']],\n      'The Girl Next Door'=>[['normal'],['latin']],\n      'The Nautigal'=>[['normal','700'],['latin','latin-ext','vietnamese']],\n      'Tienne'=>[['normal','700','900'],['latin']],\n      'Tillana'=>[['normal','500','600','700','800'],['devanagari','latin','latin-ext']],\n      'Timmana'=>[['normal'],['latin','telugu']],\n      'Tinos'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','hebrew','latin','latin-ext','vietnamese']],\n      'Titan One'=>[['normal'],['latin','latin-ext']],\n      'Titillium Web'=>[['200','200italic','300','300italic','normal','italic','600','600italic','700','700italic','900'],['latin','latin-ext']],\n      'Tomorrow'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext']],\n      'Tourney'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Trade Winds'=>[['normal'],['latin']],\n      'Train One'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Trirong'=>[['100','100italic','200','200italic','300','300italic','normal','italic','500','500italic','600','600italic','700','700italic','800','800italic','900','900italic'],['latin','latin-ext','thai','vietnamese']],\n      'Trispace'=>[['100','200','300','normal','500','600','700','800'],['latin','latin-ext','vietnamese']],\n      'Trocchi'=>[['normal'],['latin','latin-ext']],\n      'Trochut'=>[['normal','italic','700'],['latin']],\n      'Truculenta'=>[['100','200','300','normal','500','600','700','800','900'],['latin','latin-ext','vietnamese']],\n      'Trykker'=>[['normal'],['latin','latin-ext']],\n      'Tulpen One'=>[['normal'],['latin']],\n      'Turret Road'=>[['200','300','normal','500','700','800'],['latin','latin-ext']],\n      'Twinkle Star'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Ubuntu'=>[['300','300italic','normal','italic','500','500italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']],\n      'Ubuntu Condensed'=>[['normal'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']],\n      'Ubuntu Mono'=>[['normal','italic','700','700italic'],['cyrillic','cyrillic-ext','greek','greek-ext','latin','latin-ext']],\n      'Uchen'=>[['normal'],['latin','tibetan']],\n      'Ultra'=>[['normal'],['latin']],\n      'Uncial Antiqua'=>[['normal'],['latin']],\n      'Underdog'=>[['normal'],['cyrillic','latin','latin-ext']],\n      'Unica One'=>[['normal'],['latin','latin-ext']],\n      'UnifrakturCook'=>[['700'],['latin']],\n      'UnifrakturMaguntia'=>[['normal'],['latin']],\n      'Unkempt'=>[['normal','700'],['latin']],\n      'Unlock'=>[['normal'],['latin']],\n      'Unna'=>[['normal','italic','700','700italic'],['latin','latin-ext']],\n      'Urbanist'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext']],\n      'VT323'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Vampiro One'=>[['normal'],['latin','latin-ext']],\n      'Varela'=>[['normal'],['latin','latin-ext']],\n      'Varela Round'=>[['normal'],['hebrew','latin','latin-ext','vietnamese']],\n      'Varta'=>[['300','normal','500','600','700'],['latin','latin-ext','vietnamese']],\n      'Vast Shadow'=>[['normal'],['latin']],\n      'Vesper Libre'=>[['normal','500','700','900'],['devanagari','latin','latin-ext']],\n      'Viaoda Libre'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Vibes'=>[['normal'],['arabic','latin']],\n      'Vibur'=>[['normal'],['latin']],\n      'Vidaloka'=>[['normal'],['latin']],\n      'Viga'=>[['normal'],['latin','latin-ext']],\n      'Voces'=>[['normal'],['latin','latin-ext']],\n      'Volkhov'=>[['normal','italic','700','700italic'],['latin']],\n      'Vollkorn'=>[['normal','500','600','700','800','900','italic','500italic','600italic','700italic','800italic','900italic'],['cyrillic','cyrillic-ext','greek','latin','latin-ext','vietnamese']],\n      'Vollkorn SC'=>[['normal','600','700','900'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Voltaire'=>[['normal'],['latin']],\n      'Vujahday Script'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Waiting for the Sunrise'=>[['normal'],['latin']],\n      'Wallpoet'=>[['normal'],['latin']],\n      'Walter Turncoat'=>[['normal'],['latin']],\n      'Warnes'=>[['normal'],['latin','latin-ext']],\n      'Waterfall'=>[['normal'],['latin','latin-ext','vietnamese']],\n      'Wellfleet'=>[['normal'],['latin','latin-ext']],\n      'Wendy One'=>[['normal'],['latin','latin-ext']],\n      'WindSong'=>[['normal','500'],['latin','latin-ext','vietnamese']],\n      'Wire One'=>[['normal'],['latin']],\n      'Work Sans'=>[['100','200','300','normal','500','600','700','800','900','100italic','200italic','300italic','italic','500italic','600italic','700italic','800italic','900italic'],['latin','latin-ext','vietnamese']],\n      'Xanh Mono'=>[['normal','italic'],['latin','latin-ext','vietnamese']],\n      'Yaldevi'=>[['200','300','normal','500','600','700'],['latin','latin-ext','sinhala']],\n      'Yanone Kaffeesatz'=>[['200','300','normal','500','600','700'],['cyrillic','latin','latin-ext','vietnamese']],\n      'Yantramanav'=>[['100','300','normal','500','700','900'],['devanagari','latin','latin-ext']],\n      'Yatra One'=>[['normal'],['devanagari','latin','latin-ext']],\n      'Yellowtail'=>[['normal'],['latin']],\n      'Yeon Sung'=>[['normal'],['korean','latin']],\n      'Yeseva One'=>[['normal'],['cyrillic','cyrillic-ext','latin','latin-ext','vietnamese']],\n      'Yesteryear'=>[['normal'],['latin']],\n      'Yomogi'=>[['normal'],['cyrillic','japanese','latin','latin-ext','vietnamese']],\n      'Yrsa'=>[['300','normal','500','600','700','300italic','italic','500italic','600italic','700italic'],['latin','latin-ext','vietnamese']],\n      'Yuji Boku'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Yuji Hentaigana Akari'=>[['normal'],['japanese','latin','latin-ext']],\n      'Yuji Hentaigana Akebono'=>[['normal'],['japanese','latin','latin-ext']],\n      'Yuji Mai'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Yuji Syuku'=>[['normal'],['cyrillic','japanese','latin','latin-ext']],\n      'Yusei Magic'=>[['normal'],['japanese','latin','latin-ext']],\n      'ZCOOL KuaiLe'=>[['normal'],['chinese-simplified','latin']],\n      'ZCOOL QingKe HuangYou'=>[['normal'],['chinese-simplified','latin']],\n      'ZCOOL XiaoWei'=>[['normal'],['chinese-simplified','latin']],\n      'Zen Antique'=>[['normal'],['cyrillic','greek','japanese','latin','latin-ext']],\n      'Zen Antique Soft'=>[['normal'],['cyrillic','greek','japanese','latin','latin-ext']],\n      'Zen Dots'=>[['normal'],['latin','latin-ext']],\n      'Zen Kaku Gothic Antique'=>[['300','normal','500','700','900'],['cyrillic','japanese','latin','latin-ext']],\n      'Zen Kaku Gothic New'=>[['300','normal','500','700','900'],['cyrillic','japanese','latin','latin-ext']],\n      'Zen Kurenaido'=>[['normal'],['cyrillic','greek','japanese','latin','latin-ext']],\n      'Zen Loop'=>[['normal','italic'],['latin','latin-ext']],\n      'Zen Maru Gothic'=>[['300','normal','500','700','900'],['cyrillic','greek','japanese','latin','latin-ext']],\n      'Zen Old Mincho'=>[['normal','700','900'],['cyrillic','greek','japanese','latin','latin-ext']],\n      'Zen Tokyo Zoo'=>[['normal'],['latin','latin-ext']],\n      'Zeyada'=>[['normal'],['latin']],\n      'Zhi Mang Xing'=>[['normal'],['chinese-simplified','latin']],\n      'Zilla Slab'=>[['300','300italic','normal','italic','500','500italic','600','600italic','700','700italic'],['latin','latin-ext']],\n      'Zilla Slab Highlight'=>[['normal','700'],['latin','latin-ext']],\n    ];\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/typography/typography.php",
    "content": "<?php if (!defined('ABSPATH')) {\n    die;\n} // Cannot access directly.\n/**\n *\n * Field: typography\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif (!class_exists('CSF_Field_typography')) {\n    class CSF_Field_typography extends CSF_Fields\n    {\n\n        public $chosen = false;\n\n        public $value = array();\n\n        public function __construct($field, $value = '', $unique = '', $where = '', $parent = '')\n        {\n            parent::__construct($field, $value, $unique, $where, $parent);\n        }\n\n        public function render()\n        {\n\n            echo $this->field_before();\n\n            $args = wp_parse_args($this->field, array(\n                'font_family' => true,\n                'font_weight' => true,\n                'font_style' => true,\n                'font_size' => true,\n                'line_height' => true,\n                'letter_spacing' => true,\n                'text_align' => true,\n                'text_transform' => true,\n                'color' => true,\n                'chosen' => true,\n                'preview' => true,\n                'subset' => true,\n                'multi_subset' => false,\n                'extra_styles' => false,\n                'backup_font_family' => false,\n                'font_variant' => false,\n                'word_spacing' => false,\n                'text_decoration' => false,\n                'custom_style' => false,\n                'compact' => false,\n                'exclude' => '',\n                'unit' => 'px',\n                'line_height_unit' => '',\n                'preview_text' => 'The quick brown fox jumps over the lazy dog',\n            ));\n\n            if ($args['compact']) {\n                $args['text_transform'] = false;\n                $args['text_align'] = false;\n                $args['font_size'] = false;\n                $args['line_height'] = false;\n                $args['letter_spacing'] = false;\n                $args['preview'] = false;\n                $args['color'] = false;\n            }\n\n            $default_value = array(\n                'font-family' => '',\n                'font-weight' => '',\n                'font-style' => '',\n                'font-variant' => '',\n                'font-size' => '',\n                'line-height' => '',\n                'letter-spacing' => '',\n                'word-spacing' => '',\n                'text-align' => '',\n                'text-transform' => '',\n                'text-decoration' => '',\n                'backup-font-family' => '',\n                'color' => '',\n                'custom-style' => '',\n                'type' => '',\n                'subset' => '',\n                'extra-styles' => array(),\n            );\n\n            $default_value = (!empty($this->field['default'])) ? wp_parse_args($this->field['default'], $default_value) : $default_value;\n            $this->value = wp_parse_args($this->value, $default_value);\n            $this->chosen = $args['chosen'];\n            $chosen_class = ($this->chosen) ? ' csf--chosen' : '';\n            $line_height_unit = (!empty($args['line_height_unit'])) ? $args['line_height_unit'] : $args['unit'];\n\n            echo '<div class=\"csf--typography' . esc_attr($chosen_class) . '\" data-depend-id=\"' . esc_attr($this->field['id']) . '\" data-unit=\"' . esc_attr($args['unit']) . '\" data-line-height-unit=\"' . esc_attr($line_height_unit) . '\" data-exclude=\"' . esc_attr($args['exclude']) . '\">';\n\n            echo '<div class=\"csf--blocks csf--blocks-selects\">';\n\n            //\n            // Font Family\n            if (!empty($args['font_family'])) {\n                echo '<div class=\"csf--block\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Font Family', 'csf') . '</div>';\n                echo $this->create_select(array($this->value['font-family'] => $this->value['font-family']), 'font-family', esc_html__('Select a font', 'csf'));\n                echo '</div>';\n            }\n\n            //\n            // Backup Font Family\n            if (!empty($args['backup_font_family'])) {\n                echo '<div class=\"csf--block csf--block-backup-font-family hidden\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Backup Font Family', 'csf') . '</div>';\n                echo $this->create_select(apply_filters('csf_field_typography_backup_font_family', array(\n                    'Arial, Helvetica, sans-serif',\n                    \"'Arial Black', Gadget, sans-serif\",\n                    \"'Comic Sans MS', cursive, sans-serif\",\n                    'Impact, Charcoal, sans-serif',\n                    \"'Lucida Sans Unicode', 'Lucida Grande', sans-serif\",\n                    'Tahoma, Geneva, sans-serif',\n                    \"'Trebuchet MS', Helvetica, sans-serif'\",\n                    'Verdana, Geneva, sans-serif',\n                    \"'Courier New', Courier, monospace\",\n                    \"'Lucida Console', Monaco, monospace\",\n                    'Georgia, serif',\n                    'Palatino Linotype'\n                )), 'backup-font-family', esc_html__('Default', 'csf'));\n                echo '</div>';\n            }\n\n            //\n            // Font Style and Extra Style Select\n            if (!empty($args['font_weight']) || !empty($args['font_style'])) {\n\n                //\n                // Font Style Select\n                echo '<div class=\"csf--block csf--block-font-style hidden\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Font Style', 'csf') . '</div>';\n                echo '<select class=\"csf--font-style-select\" data-placeholder=\"Default\">';\n                echo '<option value=\"\">' . (!$this->chosen ? esc_html__('Default', 'csf') : '') . '</option>';\n                if (!empty($this->value['font-weight']) || !empty($this->value['font-style'])) {\n                    echo '<option value=\"' . esc_attr(strtolower($this->value['font-weight'] . $this->value['font-style'])) . '\" selected></option>';\n                }\n                echo '</select>';\n                echo '<input type=\"hidden\" name=\"' . esc_attr($this->field_name('[font-weight]')) . '\" class=\"csf--font-weight\" value=\"' . esc_attr($this->value['font-weight']) . '\" />';\n                echo '<input type=\"hidden\" name=\"' . esc_attr($this->field_name('[font-style]')) . '\" class=\"csf--font-style\" value=\"' . esc_attr($this->value['font-style']) . '\" />';\n\n                //\n                // Extra Font Style Select\n                if (!empty($args['extra_styles'])) {\n                    echo '<div class=\"csf--block-extra-styles hidden\">';\n                    echo (!$this->chosen) ? '<div class=\"csf--title\">' . esc_html__('Load Extra Styles', 'csf') . '</div>' : '';\n                    $placeholder = ($this->chosen) ? esc_html__('Load Extra Styles', 'csf') : esc_html__('Default', 'csf');\n                    echo $this->create_select($this->value['extra-styles'], 'extra-styles', $placeholder, true);\n                    echo '</div>';\n                }\n\n                echo '</div>';\n\n            }\n\n            //\n            // Subset\n            if (!empty($args['subset'])) {\n                echo '<div class=\"csf--block csf--block-subset hidden\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Subset', 'csf') . '</div>';\n                $subset = (is_array($this->value['subset'])) ? $this->value['subset'] : array_filter((array)$this->value['subset']);\n                echo $this->create_select($subset, 'subset', esc_html__('Default', 'csf'), $args['multi_subset']);\n                echo '</div>';\n            }\n\n            //\n            // Text Align\n            if (!empty($args['text_align'])) {\n                echo '<div class=\"csf--block\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Text Align', 'csf') . '</div>';\n                echo $this->create_select(array(\n                    'inherit' => esc_html__('Inherit', 'csf'),\n                    'left' => esc_html__('Left', 'csf'),\n                    'center' => esc_html__('Center', 'csf'),\n                    'right' => esc_html__('Right', 'csf'),\n                    'justify' => esc_html__('Justify', 'csf'),\n                    'initial' => esc_html__('Initial', 'csf')\n                ), 'text-align', esc_html__('Default', 'csf'));\n                echo '</div>';\n            }\n\n            //\n            // Font Variant\n            if (!empty($args['font_variant'])) {\n                echo '<div class=\"csf--block\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Font Variant', 'csf') . '</div>';\n                echo $this->create_select(array(\n                    'normal' => esc_html__('Normal', 'csf'),\n                    'small-caps' => esc_html__('Small Caps', 'csf'),\n                    'all-small-caps' => esc_html__('All Small Caps', 'csf')\n                ), 'font-variant', esc_html__('Default', 'csf'));\n                echo '</div>';\n            }\n\n            //\n            // Text Transform\n            if (!empty($args['text_transform'])) {\n                echo '<div class=\"csf--block\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Text Transform', 'csf') . '</div>';\n                echo $this->create_select(array(\n                    'none' => esc_html__('None', 'csf'),\n                    'capitalize' => esc_html__('Capitalize', 'csf'),\n                    'uppercase' => esc_html__('Uppercase', 'csf'),\n                    'lowercase' => esc_html__('Lowercase', 'csf')\n                ), 'text-transform', esc_html__('Default', 'csf'));\n                echo '</div>';\n            }\n\n            //\n            // Text Decoration\n            if (!empty($args['text_decoration'])) {\n                echo '<div class=\"csf--block\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Text Decoration', 'csf') . '</div>';\n                echo $this->create_select(array(\n                    'none' => esc_html__('None', 'csf'),\n                    'underline' => esc_html__('Solid', 'csf'),\n                    'underline double' => esc_html__('Double', 'csf'),\n                    'underline dotted' => esc_html__('Dotted', 'csf'),\n                    'underline dashed' => esc_html__('Dashed', 'csf'),\n                    'underline wavy' => esc_html__('Wavy', 'csf'),\n                    'underline overline' => esc_html__('Overline', 'csf'),\n                    'line-through' => esc_html__('Line-through', 'csf')\n                ), 'text-decoration', esc_html__('Default', 'csf'));\n                echo '</div>';\n            }\n\n            echo '</div>';\n\n            echo '<div class=\"csf--blocks csf--blocks-inputs\">';\n\n            //\n            // Font Size\n            if (!empty($args['font_size'])) {\n                echo '<div class=\"csf--block\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Font Size', 'csf') . '</div>';\n                echo '<div class=\"csf--input-wrap\">';\n                echo '<input type=\"number\" name=\"' . esc_attr($this->field_name('[font-size]')) . '\" class=\"csf--font-size csf--input csf-input-number\" value=\"' . esc_attr($this->value['font-size']) . '\" step=\"any\" />';\n                echo '<span class=\"csf--unit\">' . esc_attr($args['unit']) . '</span>';\n                echo '</div>';\n                echo '</div>';\n            }\n\n            //\n            // Line Height\n            if (!empty($args['line_height'])) {\n                echo '<div class=\"csf--block\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Line Height', 'csf') . '</div>';\n                echo '<div class=\"csf--input-wrap\">';\n                echo '<input type=\"number\" name=\"' . esc_attr($this->field_name('[line-height]')) . '\" class=\"csf--line-height csf--input csf-input-number\" value=\"' . esc_attr($this->value['line-height']) . '\" step=\"any\" />';\n                echo '<span class=\"csf--unit\">' . esc_attr($line_height_unit) . '</span>';\n                echo '</div>';\n                echo '</div>';\n            }\n\n            //\n            // Letter Spacing\n            if (!empty($args['letter_spacing'])) {\n                echo '<div class=\"csf--block\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Letter Spacing', 'csf') . '</div>';\n                echo '<div class=\"csf--input-wrap\">';\n                echo '<input type=\"number\" name=\"' . esc_attr($this->field_name('[letter-spacing]')) . '\" class=\"csf--letter-spacing csf--input csf-input-number\" value=\"' . esc_attr($this->value['letter-spacing']) . '\" step=\"any\" />';\n                echo '<span class=\"csf--unit\">' . esc_attr($args['unit']) . '</span>';\n                echo '</div>';\n                echo '</div>';\n            }\n\n            //\n            // Word Spacing\n            if (!empty($args['word_spacing'])) {\n                echo '<div class=\"csf--block\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Word Spacing', 'csf') . '</div>';\n                echo '<div class=\"csf--input-wrap\">';\n                echo '<input type=\"number\" name=\"' . esc_attr($this->field_name('[word-spacing]')) . '\" class=\"csf--word-spacing csf--input csf-input-number\" value=\"' . esc_attr($this->value['word-spacing']) . '\" step=\"any\" />';\n                echo '<span class=\"csf--unit\">' . esc_attr($args['unit']) . '</span>';\n                echo '</div>';\n                echo '</div>';\n            }\n\n            echo '</div>';\n\n            //\n            // Font Color\n            if (!empty($args['color'])) {\n                $default_color_attr = (!empty($default_value['color'])) ? ' data-default-color=\"' . esc_attr($default_value['color']) . '\"' : '';\n                echo '<div class=\"csf--block csf--block-font-color\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Font Color', 'csf') . '</div>';\n                echo '<div class=\"csf-field-color\">';\n                echo '<input type=\"text\" name=\"' . esc_attr($this->field_name('[color]')) . '\" class=\"csf-color csf--color\" value=\"' . esc_attr($this->value['color']) . '\"' . $default_color_attr . ' />';\n                echo '</div>';\n                echo '</div>';\n            }\n\n            //\n            // Custom style\n            if (!empty($args['custom_style'])) {\n                echo '<div class=\"csf--block csf--block-custom-style\">';\n                echo '<div class=\"csf--title\">' . esc_html__('Custom Style', 'csf') . '</div>';\n                echo '<textarea name=\"' . esc_attr($this->field_name('[custom-style]')) . '\" class=\"csf--custom-style\">' . esc_attr($this->value['custom-style']) . '</textarea>';\n                echo '</div>';\n            }\n\n            //\n            // Preview\n            $always_preview = ($args['preview'] !== 'always') ? ' hidden' : '';\n\n            if (!empty($args['preview'])) {\n                echo '<div class=\"csf--block csf--block-preview' . esc_attr($always_preview) . '\">';\n                echo '<div class=\"csf--toggle fas fa-toggle-off\"></div>';\n                echo '<div class=\"csf--preview\">' . esc_attr($args['preview_text']) . '</div>';\n                echo '</div>';\n            }\n\n            echo '<input type=\"hidden\" name=\"' . esc_attr($this->field_name('[type]')) . '\" class=\"csf--type\" value=\"' . esc_attr($this->value['type']) . '\" />';\n            echo '<input type=\"hidden\" name=\"' . esc_attr($this->field_name('[unit]')) . '\" class=\"csf--unit-save\" value=\"' . esc_attr($args['unit']) . '\" />';\n\n            echo '</div>';\n\n            echo $this->field_after();\n\n        }\n\n        public function create_select($options, $name, $placeholder = '', $is_multiple = false)\n        {\n\n            $multiple_name = ($is_multiple) ? '[]' : '';\n            $multiple_attr = ($is_multiple) ? ' multiple data-multiple=\"true\"' : '';\n            $chosen_rtl = ($this->chosen && is_rtl()) ? ' chosen-rtl' : '';\n\n            $output = '<select name=\"' . esc_attr($this->field_name('[' . $name . ']' . $multiple_name)) . '\" class=\"csf--' . esc_attr($name) . esc_attr($chosen_rtl) . '\" data-placeholder=\"' . esc_attr($placeholder) . '\"' . $multiple_attr . '>';\n            $output .= (!empty($placeholder)) ? '<option value=\"\">' . esc_attr((!$this->chosen) ? $placeholder : '') . '</option>' : '';\n\n            if (!empty($options)) {\n                foreach ($options as $option_key => $option_value) {\n                    if ($is_multiple) {\n                        $selected = (in_array($option_value, $this->value[$name])) ? ' selected' : '';\n                        $output .= '<option value=\"' . esc_attr($option_value) . '\"' . esc_attr($selected) . '>' . esc_attr($option_value) . '</option>';\n                    } else {\n                        $option_key = (is_numeric($option_key)) ? $option_value : $option_key;\n                        $selected = ($option_key === $this->value[$name]) ? ' selected' : '';\n                        $output .= '<option value=\"' . esc_attr($option_key) . '\"' . esc_attr($selected) . '>' . esc_attr($option_value) . '</option>';\n                    }\n                }\n            }\n\n            $output .= '</select>';\n\n            return $output;\n\n        }\n\n        /**\n         * @throws \\IXR\\Exception\n         */\n        public function enqueue($enq_js = true)\n        {\n            CSF::include_plugin_file('fields/typography/google-fonts.php');\n\n            if ($enq_js) {\n                $js_ = enqueue_script_helper('csf-webfontloader', 'https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/webfont/1.6.28/webfontloader.js');\n                $webfonts = array();\n\n                $customwebfonts = apply_filters('csf_field_typography_customwebfonts', array());\n\n                if (!empty($customwebfonts)) {\n                    $webfonts['custom'] = array(\n                        'label' => esc_html__('Custom Web Fonts', 'csf'),\n                        'fonts' => $customwebfonts\n                    );\n                }\n\n                $webfonts['safe'] = array(\n                    'label' => esc_html__('Safe Web Fonts', 'csf'),\n                    'fonts' => apply_filters('csf_field_typography_safewebfonts', array(\n                            'Arial',\n                            'Arial Black',\n                            'Helvetica',\n                            'Times New Roman',\n                            'Courier New',\n                            'Tahoma',\n                            'Verdana',\n                            'Impact',\n                            'Trebuchet MS',\n                            'Comic Sans MS',\n                            'Lucida Console',\n                            'Lucida Sans Unicode',\n                            'Georgia, serif',\n                            'Palatino Linotype'\n                        )\n                    ));\n\n                $webfonts['google'] = array(\n                    'label' => esc_html__('Google Web Fonts', 'csf'),\n                    'fonts' => apply_filters('csf_field_typography_googlewebfonts', csf_get_google_fonts()\n                    ));\n\n                $defaultstyles = apply_filters('csf_field_typography_defaultstyles', array('normal', 'italic', '700', '700italic'));\n\n                $googlestyles = apply_filters('csf_field_typography_googlestyles', array(\n                    '100' => 'Thin 100',\n                    '100italic' => 'Thin 100 Italic',\n                    '200' => 'Extra-Light 200',\n                    '200italic' => 'Extra-Light 200 Italic',\n                    '300' => 'Light 300',\n                    '300italic' => 'Light 300 Italic',\n                    'normal' => 'Normal 400',\n                    'italic' => 'Normal 400 Italic',\n                    '500' => 'Medium 500',\n                    '500italic' => 'Medium 500 Italic',\n                    '600' => 'Semi-Bold 600',\n                    '600italic' => 'Semi-Bold 600 Italic',\n                    '700' => 'Bold 700',\n                    '700italic' => 'Bold 700 Italic',\n                    '800' => 'Extra-Bold 800',\n                    '800italic' => 'Extra-Bold 800 Italic',\n                    '900' => 'Black 900',\n                    '900italic' => 'Black 900 Italic'\n                ));\n\n                $webfonts = apply_filters('csf_field_typography_webfonts', $webfonts);\n\n                $js_ = $js_.wp_localize_script('csf', 'csf_typography_json', array(\n                    'webfonts' => $webfonts,\n                    'defaultstyles' => $defaultstyles,\n                    'googlestyles' => $googlestyles\n                ));\n                return $js_;\n\n            }\n\n\n        }\n\n        public function enqueue_google_fonts($method = 'enqueue')\n        {\n\n            $is_google = false;\n\n            if (!empty($this->value['type'])) {\n                $is_google = ($this->value['type'] === 'google') ? true : false;\n            } else {\n                CSF::include_plugin_file('fields/typography/google-fonts.php');\n                $is_google = (array_key_exists($this->value['font-family'], csf_get_google_fonts())) ? true : false;\n            }\n\n            if ($is_google) {\n\n                // set style\n                $font_family = (!empty($this->value['font-family'])) ? $this->value['font-family'] : '';\n                $font_weight = (!empty($this->value['font-weight'])) ? $this->value['font-weight'] : '';\n                $font_style = (!empty($this->value['font-style'])) ? $this->value['font-style'] : '';\n\n                if ($font_weight || $font_style) {\n                    $style = $font_weight . $font_style;\n                    if (!empty($style)) {\n                        $style = ($style === 'normal') ? '400' : $style;\n                        CSF::$webfonts[$method][$font_family][$style] = $style;\n                    }\n                } else {\n                    CSF::$webfonts[$method][$font_family] = array();\n                }\n\n                // set extra styles\n                if (!empty($this->value['extra-styles'])) {\n                    foreach ($this->value['extra-styles'] as $extra_style) {\n                        if (!empty($extra_style)) {\n                            $extra_style = ($extra_style === 'normal') ? '400' : $extra_style;\n                            CSF::$webfonts[$method][$font_family][$extra_style] = $extra_style;\n                        }\n                    }\n                }\n\n                // set subsets\n                if (!empty($this->value['subset'])) {\n                    $this->value['subset'] = (is_array($this->value['subset'])) ? $this->value['subset'] : array_filter((array)$this->value['subset']);\n                    foreach ($this->value['subset'] as $subset) {\n                        if (!empty($subset)) {\n                            CSF::$subsets[$subset] = $subset;\n                        }\n                    }\n                }\n\n                return true;\n\n            }\n\n            return false;\n\n        }\n\n        public function output()\n        {\n\n            $output = '';\n            $bg_image = array();\n            $important = (!empty($this->field['output_important'])) ? '!important' : '';\n            $element = (is_array($this->field['output'])) ? join(',', $this->field['output']) : $this->field['output'];\n\n            $font_family = (!empty($this->value['font-family'])) ? $this->value['font-family'] : '';\n            $backup_family = (!empty($this->value['backup-font-family'])) ? ', ' . $this->value['backup-font-family'] : '';\n\n            if ($font_family) {\n                $output .= 'font-family:\"' . $font_family . '\"' . $backup_family . $important . ';';\n            }\n\n            // Common font properties\n            $properties = array(\n                'color',\n                'font-weight',\n                'font-style',\n                'font-variant',\n                'text-align',\n                'text-transform',\n                'text-decoration',\n            );\n\n            foreach ($properties as $property) {\n                if (isset($this->value[$property]) && $this->value[$property] !== '') {\n                    $output .= $property . ':' . $this->value[$property] . $important . ';';\n                }\n            }\n\n            $properties = array(\n                'font-size',\n                'line-height',\n                'letter-spacing',\n                'word-spacing',\n            );\n\n            $unit = (!empty($this->value['unit'])) ? $this->value['unit'] : 'px';\n            $line_height_unit = (!empty($this->value['line_height_unit'])) ? $this->value['line_height_unit'] : $unit;\n\n            foreach ($properties as $property) {\n                if (isset($this->value[$property]) && $this->value[$property] !== '') {\n                    $unit = ($property === 'line-height') ? $line_height_unit : $unit;\n                    $output .= $property . ':' . $this->value[$property] . $unit . $important . ';';\n                }\n            }\n\n            $custom_style = (!empty($this->value['custom-style'])) ? $this->value['custom-style'] : '';\n\n            if ($output) {\n                $output = $element . '{' . $output . $custom_style . '}';\n            }\n\n            $this->parent->output_css .= $output;\n\n            return $output;\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/upload/upload.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: upload\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_upload' ) ) {\n  class CSF_Field_upload extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'library'        => array(),\n        'preview'        => true,\n        'preview_width'  => '',\n        'preview_height' => '',\n        'button_title'   => esc_html__( 'Upload', 'csf' ),\n        'remove_title'   => esc_html__( 'Remove', 'csf' ),\n      ) );\n\n      echo $this->field_before();\n\n      $library = ( is_array( $args['library'] ) ) ? $args['library'] : array_filter( (array) $args['library'] );\n      $library = ( ! empty( $library ) ) ? implode(',', $library ) : '';\n      $hidden  = ( empty( $this->value ) ) ? ' hidden' : '';\n\n      if ( ! empty( $args['preview'] ) ) {\n\n        $preview_type   = ( ! empty( $this->value ) ) ? strtolower( substr( strrchr( $this->value, '.' ), 1 ) ) : '';\n        $preview_src    = ( ! empty( $preview_type ) && in_array( $preview_type, array( 'jpg', 'jpeg', 'gif', 'png', 'svg', 'webp' ) ) ) ? $this->value : '';\n        $preview_width  = ( ! empty( $args['preview_width'] ) ) ? 'max-width:'. esc_attr( $args['preview_width'] ) .'px;' : '';\n        $preview_height = ( ! empty( $args['preview_height'] ) ) ? 'max-height:'. esc_attr( $args['preview_height'] ) .'px;' : '';\n        $preview_style  = ( ! empty( $preview_width ) || ! empty( $preview_height ) ) ? ' style=\"'. esc_attr( $preview_width . $preview_height ) .'\"': '';\n        $preview_hidden = ( empty( $preview_src ) ) ? ' hidden' : '';\n\n        echo '<div class=\"csf--preview'. esc_attr( $preview_hidden ) .'\">';\n        echo '<div class=\"csf-image-preview\"'. $preview_style .'>';\n        echo '<i class=\"csf--remove fas fa-times\"></i><span><img src=\"'. esc_url( $preview_src ) .'\" class=\"csf--src\" /></span>';\n        echo '</div>';\n        echo '</div>';\n\n      }\n\n      echo '<div class=\"csf--wrap\">';\n      echo '<input type=\"text\" name=\"'. esc_attr( $this->field_name() ) .'\" value=\"'. esc_attr( $this->value ) .'\"'. $this->field_attributes() .'/>';\n      echo '<a href=\"#\" class=\"button button-primary csf--button\" data-library=\"'. esc_attr( $library ) .'\">'. $args['button_title'] .'</a>';\n      echo '<a href=\"#\" class=\"button button-secondary csf-warning-primary csf--remove'. esc_attr( $hidden ) .'\">'. $args['remove_title'] .'</a>';\n      echo '</div>';\n\n      echo $this->field_after();\n\n    }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/fields/wp_editor/wp_editor.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Field: wp_editor\n *\n * not support in typecho\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Field_wp_editor' ) ) {\n  class CSF_Field_wp_editor extends CSF_Fields {\n\n    public function __construct( $field, $value = '', $unique = '', $where = '', $parent = '' ) {\n      parent::__construct( $field, $value, $unique, $where, $parent );\n    }\n\n    public function render() {\n\n      $args = wp_parse_args( $this->field, array(\n        'tinymce'       => true,\n        'quicktags'     => true,\n        'media_buttons' => true,\n        'wpautop'       => false,\n        'height'        => '',\n      ) );\n\n      $attributes = array(\n        'rows'         => 10,\n        'class'        => 'wp-editor-area',\n        'autocomplete' => 'off',\n      );\n\n      $editor_height = ( ! empty( $args['height'] ) ) ? ' style=\"height:'. esc_attr( $args['height'] ) .';\"' : '';\n\n      $editor_settings  = array(\n        'tinymce'       => $args['tinymce'],\n        'quicktags'     => $args['quicktags'],\n        'media_buttons' => $args['media_buttons'],\n        'wpautop'       => $args['wpautop'],\n      );\n\n      echo $this->field_before();\n\n      echo ( csf_wp_editor_api() ) ? '<div class=\"csf-wp-editor\" data-editor-settings=\"'. esc_attr( json_encode( $editor_settings ) ) .'\">' : '';\n\n      echo '<textarea name=\"'. esc_attr( $this->field_name() ) .'\"'. $this->field_attributes( $attributes ) . $editor_height .'>'. $this->value .'</textarea>';\n\n      echo ( csf_wp_editor_api() ) ? '</div>' : '';\n\n      echo $this->field_after();\n\n    }\n\n    public function enqueue() {\n\n      if ( csf_wp_editor_api() && function_exists( 'wp_enqueue_editor' ) ) {\n\n        wp_enqueue_editor();\n\n        $this->setup_wp_editor_settings();\n\n//        add_action( 'print_default_editor_scripts', array( $this, 'setup_wp_editor_media_buttons' ) );\n\n      }\n\n    }\n\n    // Setup wp editor media buttons\n    public function setup_wp_editor_media_buttons() {\n\n      if ( ! function_exists( 'media_buttons' ) ) {\n        return;\n      }\n\n      ob_start();\n        echo '<div class=\"wp-media-buttons\">';\n          do_action( 'media_buttons' );\n        echo '</div>';\n      $media_buttons = ob_get_clean();\n\n      echo '<script type=\"text/javascript\">';\n      echo 'var csf_media_buttons = '. json_encode( $media_buttons ) .';';\n      echo '</script>';\n\n    }\n\n    // Setup wp editor settings\n    public function setup_wp_editor_settings() {\n\n      if ( csf_wp_editor_api() && class_exists( '_WP_Editors') ) {\n\n        $defaults = apply_filters( 'csf_wp_editor', array(\n          'tinymce' => array(\n            'wp_skip_init' => true\n          ),\n        ) );\n\n        $setup = _WP_Editors::parse_settings( 'csf_wp_editor', $defaults );\n\n        _WP_Editors::editor_settings( 'csf_wp_editor', $setup );\n\n      }\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/Attachments.php",
    "content": "<?php\n\n\nuse Typecho\\Config;\nuse Typecho\\Db;\nuse Typecho\\Db\\Exception;\nuse Typecho\\Db\\Query;\nuse Typecho\\Widget\\Helper\\PageNavigator\\Box;\nuse Widget\\Base\\Contents;\n\nif (!defined('__TYPECHO_ROOT_DIR__')) {\n    exit;\n}\n\n/**\n * 文件管理列表组件\n *\n * @category typecho\n * @package Widget\n * @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org)\n * @license GNU General Public License 2.0\n */\nif (!class_exists('Attachments')) {\n    class Attachments extends Contents\n    {\n        /**\n         * 用于计算数值的语句对象\n         *\n         * @var Query\n         */\n        private $countSql;\n\n        /**\n         * 所有文章个数\n         *\n         * @var integer\n         */\n        private $total = false;\n\n        /**\n         * 当前页\n         *\n         * @var integer\n         */\n        private $currentPage;\n\n\n        /**\n         * @return int\n         */\n        public function getCurrentPage(): int\n        {\n            return $this->currentPage;\n        }\n\n        /**\n         * _currentPage\n         *\n         * @return int\n         */\n        public function ____currentPage(): int\n        {\n            return $this->getCurrentPage();\n        }\n\n        /**\n         * 获取页数\n         *\n         * @return integer\n         */\n        public function getTotalPage(): int\n        {\n            return ceil($this->getTotal() / $this->parameter->pageSize);\n        }\n\n        public function getPageSize(): int\n        {\n            return $this->parameter->pageSize;\n        }\n\n        /**\n         * @return int\n         * @throws Db\\Exception\n         */\n        public function getTotal(): int\n        {\n            if (false === $this->total) {\n                $this->total = $this->size($this->countSql);\n            }\n\n            return $this->total;\n        }\n\n        /**\n         * 执行函数\n         *\n         * @return void\n         * @throws Exception|\\Typecho\\Widget\\Exception\n         */\n        public function execute()\n        {\n            $this->parameter->setDefault('pageSize=20');\n            $this->currentPage = $this->request->get('page', 1);\n\n            /** 构建基础查询 */\n            $select = $this->select()->where('table.contents.type = ?', 'attachment');\n\n            /** 如果具有编辑以上权限,可以查看所有文件,反之只能查看自己的文件 */\n            if (!$this->user->pass('editor', true)) {\n                $select->where('table.contents.authorId = ?', $this->user->uid);\n            }\n\n            /** 过滤标题 */\n            if (null != ($keywords = $this->request->filter('search')->keywords)) {\n                $args = [];\n                $keywordsList = explode(' ', $keywords);\n                $args[] = implode(' OR ', array_fill(0, count($keywordsList), 'table.contents.title LIKE ?'));\n\n                foreach ($keywordsList as $keyword) {\n                    $args[] = '%' . $keyword . '%';\n                }\n\n                call_user_func_array([$select, 'where'], $args);\n            }\n\n            /** 给计算数目对象赋值,克隆对象 */\n            $this->countSql = clone $select;\n\n            /** 提交查询 */\n            $select->order('table.contents.created', Db::SORT_DESC)\n                ->page($this->currentPage, $this->parameter->pageSize);\n\n            $this->db->fetchAll($select, [$this, 'push']);\n        }\n\n        /**\n         * 输出分页\n         *\n         * @return void\n         * @throws Exception|\\Typecho\\Widget\\Exception\n         */\n        public function pageNav()\n        {\n            $query = $this->request->makeUriByRequest('page={page}');\n\n            /** 使用盒状分页 */\n            $nav = new Box(\n                false === $this->total ? $this->total = $this->size($this->countSql) : $this->total,\n                $this->currentPage,\n                $this->parameter->pageSize,\n                $query\n            );\n\n            $nav->render('&laquo;', '&raquo;');\n        }\n\n        /**\n         * 所属文章\n         *\n         * @return Config\n         * @throws Exception\n         */\n        protected function ___parentPost(): Config\n        {\n            return new Config($this->db->fetchRow(\n                $this->select()->where('table.contents.cid = ?', $this->parentId)->limit(1)\n            ));\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/actions.php",
    "content": "<?php if (!defined('ABSPATH')) {\n    die;\n} // Cannot access directly.\n/**\n *\n * Get icons from admin ajax\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif (!function_exists('csf_get_icons')) {\n    function csf_get_icons($responseObj)\n    {\n        $nonce = (!empty($_POST['nonce'])) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : '';\n\n        if (!wp_verify_nonce($nonce, 'csf_icon_nonce')) {\n            wp_send_json_error($responseObj, array('error' => esc_html__('Error: Invalid nonce verification.', 'csf')));\n        }\n\n        ob_start();\n\n        $icon_library = (apply_filters('csf_fa4', false)) ? 'fa4' : 'fa5';\n\n        CSF::include_plugin_file('fields/icon/' . $icon_library . '-icons.php');\n\n        $icon_lists = apply_filters('csf_field_icon_add_icons', csf_get_default_icons());\n\n        if (!empty($icon_lists)) {\n\n            foreach ($icon_lists as $list) {\n\n                echo (count($icon_lists) >= 2) ? '<div class=\"csf-icon-title\">' . esc_attr($list['title']) . '</div>' : '';\n\n                foreach ($list['icons'] as $icon) {\n                    echo '<i title=\"' . esc_attr($icon) . '\" class=\"' . esc_attr($icon) . '\"></i>';\n                }\n\n            }\n\n        } else {\n\n            echo '<div class=\"csf-error-text\">' . esc_html__('No data available.', 'csf') . '</div>';\n\n        }\n\n        $content = ob_get_clean();\n\n        wp_send_json_success($responseObj, array('content' => $content));\n\n    }\n//  add_action( 'wp_ajax_csf-get-icons', 'csf_get_icons' );\n}\n\n/**\n *\n * Export\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif (!function_exists('csf_export')) {\n    function csf_export($responseObj)\n    {\n\n        $nonce = (!empty($_GET['nonce'])) ? sanitize_text_field(wp_unslash($_GET['nonce'])) : '';\n        $unique = (!empty($_GET['unique'])) ? sanitize_text_field(wp_unslash($_GET['unique'])) : '';\n\n        if (!wp_verify_nonce($nonce, 'csf_backup_nonce')) {\n            die(esc_html__('Error: Invalid nonce verification.', 'csf'));\n        }\n\n        if (empty($unique)) {\n            die(esc_html__('Error: Invalid key.', 'csf'));\n        }\n\n        // Export\n        header('Content-Type: application/json');\n        header('Content-disposition: attachment; filename=backup-' . gmdate('d-m-Y') . '.json');\n        header('Content-Transfer-Encoding: binary');\n        header('Pragma: no-cache');\n        header('Expires: 0');\n\n        echo json_encode(get_option($unique));\n\n        die();\n\n    }\n//  add_action( 'wp_ajax_csf-export', 'csf_export' );\n}\n\n/**\n *\n * Import Ajax\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif (!function_exists('csf_import')) {\n    function csf_import($responseObj)\n    {\n\n        $nonce = (!empty($_POST['nonce'])) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : '';\n        $unique = (!empty($_POST['unique'])) ? sanitize_text_field(wp_unslash($_POST['unique'])) : '';\n        $data = (!empty($_POST['data'])) ? json_decode((trim($_POST['data'])), true) : array(); //wp_unslash\n        if (!wp_verify_nonce($nonce, 'csf_backup_nonce')) {\n            wp_send_json_error($responseObj, array('error' => esc_html__('Error: Invalid nonce verification.', 'csf')));\n        }\n\n        if (empty($unique)) {\n            wp_send_json_error($responseObj, array('error' => esc_html__('Error: Invalid key.', 'csf')));\n        }\n\n        if (empty($data) || !is_array($data)) {\n            wp_send_json_error($responseObj, array('error' => esc_html__('Error: The response is not a valid JSON response.', 'csf')));\n        }\n\n        // Success\n        update_option($unique, $data);\n\n        wp_send_json_success($responseObj);\n\n    }\n//  add_action( 'wp_ajax_csf-import', 'csf_import_ajax' );\n}\n\n/**\n *\n * Reset Ajax\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif (!function_exists('csf_reset')) {\n    function csf_reset($responseObj)\n    {\n\n        $nonce = (!empty($_POST['nonce'])) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : '';\n        $unique = (!empty($_POST['unique'])) ? sanitize_text_field(wp_unslash($_POST['unique'])) : '';\n\n        if (!wp_verify_nonce($nonce, 'csf_backup_nonce')) {\n            wp_send_json_error($responseObj,array('error' => esc_html__('Error: Invalid nonce verification.', 'csf')));\n        }\n\n        // Success\n        delete_option($unique);\n\n        wp_send_json_success($responseObj);\n\n    }\n//  add_action( 'wp_ajax_csf-reset', 'csf_reset_ajax' );\n}\n\n/**\n *\n * Chosen Ajax\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif (!function_exists('csf_chosen')) {\n    function csf_chosen($responseObj)\n    {\n\n        $nonce = (!empty($_POST['nonce'])) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : '';\n        $type = (!empty($_POST['type'])) ? sanitize_text_field(wp_unslash($_POST['type'])) : '';\n        $term = (!empty($_POST['term'])) ? sanitize_text_field(wp_unslash($_POST['term'])) : '';\n        $query = (!empty($_POST['query_args'])) ? wp_kses_post_deep($_POST['query_args']) : array();\n\n        if (!wp_verify_nonce($nonce, 'csf_chosen_ajax_nonce')) {\n            wp_send_json_error(array('error' => esc_html__('Error: Invalid nonce verification.', 'csf')));\n        }\n\n        if (empty($type) || empty($term)) {\n            wp_send_json_error(array('error' => esc_html__('Error: Invalid term ID.', 'csf')));\n        }\n\n        // todo: author capability\n//    $capability = apply_filters( 'csf_chosen_ajax_capability', 'manage_options' );\n//\n//    if ( ! current_user_can( $capability ) ) {\n//      wp_send_json_error( array( 'error' => esc_html__( 'Error: You do not have permission to do that.', 'csf' ) ) );\n//    }\n\n        // Success\n        $options = CSF_Fields::field_data($type, $term, $query);\n\n        wp_send_json_success($responseObj, $options);\n\n    }\n//  add_action( 'wp_ajax_csf-chosen', 'csf_chosen_ajax' );\n}\n\nif (!function_exists('wp_link_ajax')) {\n    function wp_link_ajax($responseObj)\n    {\n        check_ajax_referer('internal-linking', '_ajax_linking_nonce');\n\n        $args = array();\n\n        if (isset($_POST['search'])) {\n            $args['s'] = wp_unslash($_POST['search']);\n        }\n\n        if (isset($_POST['term'])) {\n            $args['s'] = wp_unslash($_POST['term']);\n        }\n\n        $args['pagenum'] = !empty($_POST['page']) ? absint($_POST['page']) : 1;\n        // todo:\n\n//        if ( ! class_exists( '_WP_Editors', false ) ) {\n//            require ABSPATH . WPINC . '/class-wp-editor.php';\n//        }\n//\n//        $results = _WP_Editors::wp_link_query( $args );\n//\n//        if ( ! isset( $results ) ) {\n//            wp_die( 0 );\n//        }\n//\n//        echo wp_json_encode( $results );\n        echo \"\\n\";\n\n        die();\n    }\n\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/class-list-util.php",
    "content": "<?php\n/**\n * WordPress List utility class\n *\n * @package WordPress\n * @since 4.7.0\n */\n\n/**\n * List utility.\n *\n * Utility class to handle operations on an array of objects or arrays.\n *\n * @since 4.7.0\n */\nif (!class_exists('WP_List_Util')) {\n\n    class WP_List_Util\n    {\n        /**\n         * The input array.\n         *\n         * @since 4.7.0\n         * @var array\n         */\n        private $input = array();\n\n        /**\n         * The output array.\n         *\n         * @since 4.7.0\n         * @var array\n         */\n        private $output = array();\n\n        /**\n         * Temporary arguments for sorting.\n         *\n         * @since 4.7.0\n         * @var array\n         */\n        private $orderby = array();\n\n        /**\n         * Constructor.\n         *\n         * Sets the input array.\n         *\n         * @param array $input Array to perform operations on.\n         * @since 4.7.0\n         *\n         */\n        public function __construct($input)\n        {\n            $this->output = $input;\n            $this->input = $input;\n        }\n\n        /**\n         * Returns the original input array.\n         *\n         * @return array The input array.\n         * @since 4.7.0\n         *\n         */\n        public function get_input()\n        {\n            return $this->input;\n        }\n\n        /**\n         * Returns the output array.\n         *\n         * @return array The output array.\n         * @since 4.7.0\n         *\n         */\n        public function get_output()\n        {\n            return $this->output;\n        }\n\n        /**\n         * Filters the list, based on a set of key => value arguments.\n         *\n         * Retrieves the objects from the list that match the given arguments.\n         * Key represents property name, and value represents property value.\n         *\n         * If an object has more properties than those specified in arguments,\n         * that will not disqualify it. When using the 'AND' operator,\n         * any missing properties will disqualify it.\n         *\n         * @param array $args Optional. An array of key => value arguments to match\n         *                         against each object. Default empty array.\n         * @param string $operator Optional. The logical operation to perform. 'AND' means\n         *                         all elements from the array must match. 'OR' means only\n         *                         one element needs to match. 'NOT' means no elements may\n         *                         match. Default 'AND'.\n         * @return array Array of found values.\n         * @since 4.7.0\n         *\n         */\n        public function filter($args = array(), $operator = 'AND')\n        {\n            if (empty($args)) {\n                return $this->output;\n            }\n\n            $operator = strtoupper($operator);\n\n            if (!in_array($operator, array('AND', 'OR', 'NOT'), true)) {\n                $this->output = array();\n                return $this->output;\n            }\n\n            $count = count($args);\n            $filtered = array();\n\n            foreach ($this->output as $key => $obj) {\n                $matched = 0;\n\n                foreach ($args as $m_key => $m_value) {\n                    if (is_array($obj)) {\n                        // Treat object as an array.\n                        if (array_key_exists($m_key, $obj) && ($m_value == $obj[$m_key])) {\n                            $matched++;\n                        }\n                    } elseif (is_object($obj)) {\n                        // Treat object as an object.\n                        if (isset($obj->{$m_key}) && ($m_value == $obj->{$m_key})) {\n                            $matched++;\n                        }\n                    }\n                }\n\n                if (('AND' === $operator && $matched === $count)\n                    || ('OR' === $operator && $matched > 0)\n                    || ('NOT' === $operator && 0 === $matched)\n                ) {\n                    $filtered[$key] = $obj;\n                }\n            }\n\n            $this->output = $filtered;\n\n            return $this->output;\n        }\n\n        /**\n         * Plucks a certain field out of each element in the input array.\n         *\n         * This has the same functionality and prototype of\n         * array_column() (PHP 5.5) but also supports objects.\n         *\n         * @param int|string $field Field to fetch from the object or array.\n         * @param int|string $index_key Optional. Field from the element to use as keys for the new array.\n         *                              Default null.\n         * @return array Array of found values. If `$index_key` is set, an array of found values with keys\n         *               corresponding to `$index_key`. If `$index_key` is null, array keys from the original\n         *               `$list` will be preserved in the results.\n         * @since 4.7.0\n         *\n         */\n        public function pluck($field, $index_key = null)\n        {\n            $newlist = array();\n\n            if (!$index_key) {\n                /*\n                 * This is simple. Could at some point wrap array_column()\n                 * if we knew we had an array of arrays.\n                 */\n                foreach ($this->output as $key => $value) {\n                    if (is_object($value)) {\n                        $newlist[$key] = $value->$field;\n                    } else {\n                        $newlist[$key] = $value[$field];\n                    }\n                }\n\n                $this->output = $newlist;\n\n                return $this->output;\n            }\n\n            /*\n             * When index_key is not set for a particular item, push the value\n             * to the end of the stack. This is how array_column() behaves.\n             */\n            foreach ($this->output as $value) {\n                if (is_object($value)) {\n                    if (isset($value->$index_key)) {\n                        $newlist[$value->$index_key] = $value->$field;\n                    } else {\n                        $newlist[] = $value->$field;\n                    }\n                } else {\n                    if (isset($value[$index_key])) {\n                        $newlist[$value[$index_key]] = $value[$field];\n                    } else {\n                        $newlist[] = $value[$field];\n                    }\n                }\n            }\n\n            $this->output = $newlist;\n\n            return $this->output;\n        }\n\n        /**\n         * Sorts the input array based on one or more orderby arguments.\n         *\n         * @param string|array $orderby Optional. Either the field name to order by or an array\n         *                                    of multiple orderby fields as $orderby => $order.\n         * @param string $order Optional. Either 'ASC' or 'DESC'. Only used if $orderby\n         *                                    is a string.\n         * @param bool $preserve_keys Optional. Whether to preserve keys. Default false.\n         * @return array The sorted array.\n         * @since 4.7.0\n         *\n         */\n        public function sort($orderby = array(), $order = 'ASC', $preserve_keys = false)\n        {\n            if (empty($orderby)) {\n                return $this->output;\n            }\n\n            if (is_string($orderby)) {\n                $orderby = array($orderby => $order);\n            }\n\n            foreach ($orderby as $field => $direction) {\n                $orderby[$field] = 'DESC' === strtoupper($direction) ? 'DESC' : 'ASC';\n            }\n\n            $this->orderby = $orderby;\n\n            if ($preserve_keys) {\n                uasort($this->output, array($this, 'sort_callback'));\n            } else {\n                usort($this->output, array($this, 'sort_callback'));\n            }\n\n            $this->orderby = array();\n\n            return $this->output;\n        }\n\n        /**\n         * Callback to sort an array by specific fields.\n         *\n         * @param object|array $a One object to compare.\n         * @param object|array $b The other object to compare.\n         * @return int 0 if both objects equal. -1 if second object should come first, 1 otherwise.\n         * @see WP_List_Util::sort()\n         *\n         * @since 4.7.0\n         *\n         */\n        private function sort_callback($a, $b)\n        {\n            if (empty($this->orderby)) {\n                return 0;\n            }\n\n            $a = (array)$a;\n            $b = (array)$b;\n\n            foreach ($this->orderby as $field => $direction) {\n                if (!isset($a[$field]) || !isset($b[$field])) {\n                    continue;\n                }\n\n                if ($a[$field] == $b[$field]) {\n                    continue;\n                }\n\n                $results = 'DESC' === $direction ? array(1, -1) : array(-1, 1);\n\n                if (is_numeric($a[$field]) && is_numeric($b[$field])) {\n                    return ($a[$field] < $b[$field]) ? $results[0] : $results[1];\n                }\n\n                return 0 > strcmp($a[$field], $b[$field]) ? $results[0] : $results[1];\n            }\n\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/class.wp_meta_query.php",
    "content": "<?php\n/**\n * Meta API: WP_Meta_Query class\n *\n * @package WordPress\n * @subpackage Meta\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement meta queries for the Meta API.\n *\n * Used for generating SQL clauses that filter a primary query according to metadata keys and values.\n *\n * WP_Meta_Query is a helper that allows primary query classes, such as WP_Query and WP_User_Query,\n *\n * to filter their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be attached\n * to the primary SQL query string.\n *\n * @since 3.2.0\n */\nif (!class_exists('WP_Meta_Query')) {\n\n    class WP_Meta_Query\n    {\n        /**\n         * Array of metadata queries.\n         *\n         * See WP_Meta_Query::__construct() for information on meta query arguments.\n         *\n         * @since 3.2.0\n         * @var array\n         */\n        public $queries = array();\n\n        /**\n         * The relation between the queries. Can be one of 'AND' or 'OR'.\n         *\n         * @since 3.2.0\n         * @var string\n         */\n        public $relation;\n\n        /**\n         * Database table to query for the metadata.\n         *\n         * @since 4.1.0\n         * @var string\n         */\n        public $meta_table;\n\n        /**\n         * Column in meta_table that represents the ID of the object the metadata belongs to.\n         *\n         * @since 4.1.0\n         * @var string\n         */\n        public $meta_id_column;\n\n        /**\n         * Database table that where the metadata's objects are stored (eg $wpdb->users).\n         *\n         * @since 4.1.0\n         * @var string\n         */\n        public $primary_table;\n\n        /**\n         * Column in primary_table that represents the ID of the object.\n         *\n         * @since 4.1.0\n         * @var string\n         */\n        public $primary_id_column;\n\n        /**\n         * A flat list of table aliases used in JOIN clauses.\n         *\n         * @since 4.1.0\n         * @var array\n         */\n        protected $table_aliases = array();\n\n        /**\n         * A flat list of clauses, keyed by clause 'name'.\n         *\n         * @since 4.2.0\n         * @var array\n         */\n        protected $clauses = array();\n\n        /**\n         * Whether the query contains any OR relations.\n         *\n         * @since 4.3.0\n         * @var bool\n         */\n        protected $has_or_relation = false;\n\n        /**\n         * Constructor.\n         *\n         * @param array $meta_query {\n         *     Array of meta query clauses. When first-order clauses or sub-clauses use strings as\n         *     their array keys, they may be referenced in the 'orderby' parameter of the parent query.\n         *\n         * @type string $relation Optional. The MySQL keyword used to join the clauses of the query.\n         *                            Accepts 'AND' or 'OR'. Default 'AND'.\n         * @type array  ...$0 {\n         *         Optional. An array of first-order clause parameters, or another fully-formed meta query.\n         *\n         * @type string|string[] $key Meta key or keys to filter by.\n         * @type string $compare_key MySQL operator used for comparing the $key. Accepts:\n         *                                            - '='\n         *                                            - '!='\n         *                                            - 'LIKE'\n         *                                            - 'NOT LIKE'\n         *                                            - 'IN'\n         *                                            - 'NOT IN'\n         *                                            - 'REGEXP'\n         *                                            - 'NOT REGEXP'\n         *                                            - 'RLIKE',\n         *                                            - 'EXISTS' (alias of '=')\n         *                                            - 'NOT EXISTS' (alias of '!=')\n         *                                            Default is 'IN' when `$key` is an array, '=' otherwise.\n         * @type string $type_key MySQL data type that the meta_key column will be CAST to for\n         *                                            comparisons. Accepts 'BINARY' for case-sensitive regular expression\n         *                                            comparisons. Default is ''.\n         * @type string|string[] $value Meta value or values to filter by.\n         * @type string $compare MySQL operator used for comparing the $value. Accepts:\n         *                                            - '=',\n         *                                            - '!='\n         *                                            - '>'\n         *                                            - '>='\n         *                                            - '<'\n         *                                            - '<='\n         *                                            - 'LIKE'\n         *                                            - 'NOT LIKE'\n         *                                            - 'IN'\n         *                                            - 'NOT IN'\n         *                                            - 'BETWEEN'\n         *                                            - 'NOT BETWEEN'\n         *                                            - 'REGEXP'\n         *                                            - 'NOT REGEXP'\n         *                                            - 'RLIKE'\n         *                                            - 'EXISTS'\n         *                                            - 'NOT EXISTS'\n         *                                            Default is 'IN' when `$value` is an array, '=' otherwise.\n         * @type string $type MySQL data type that the meta_value column will be CAST to for\n         *                                            comparisons. Accepts:\n         *                                            - 'NUMERIC'\n         *                                            - 'BINARY'\n         *                                            - 'CHAR'\n         *                                            - 'DATE'\n         *                                            - 'DATETIME'\n         *                                            - 'DECIMAL'\n         *                                            - 'SIGNED'\n         *                                            - 'TIME'\n         *                                            - 'UNSIGNED'\n         *                                            Default is 'CHAR'.\n         *     }\n         * }\n         * @since 4.2.0 Introduced support for naming query clauses by associative array keys.\n         * @since 5.1.0 Introduced `$compare_key` clause parameter, which enables LIKE key matches.\n         * @since 5.3.0 Increased the number of operators available to `$compare_key`. Introduced `$type_key`,\n         *              which enables the `$key` to be cast to a new data type for comparisons.\n         *\n         * @since 3.2.0\n         */\n        public function __construct($meta_query = false)\n        {\n            if (!$meta_query) {\n                return;\n            }\n\n            if (isset($meta_query['relation']) && 'OR' === strtoupper($meta_query['relation'])) {\n                $this->relation = 'OR';\n            } else {\n                $this->relation = 'AND';\n            }\n\n            $this->queries = $this->sanitize_query($meta_query);\n        }\n\n        /**\n         * Ensure the 'meta_query' argument passed to the class constructor is well-formed.\n         *\n         * Eliminates empty items and ensures that a 'relation' is set.\n         *\n         * @param array $queries Array of query clauses.\n         * @return array Sanitized array of query clauses.\n         * @since 4.1.0\n         *\n         */\n        public function sanitize_query($queries)\n        {\n            $clean_queries = array();\n\n            if (!is_array($queries)) {\n                return $clean_queries;\n            }\n\n            foreach ($queries as $key => $query) {\n                if ('relation' === $key) {\n                    $relation = $query;\n\n                } elseif (!is_array($query)) {\n                    continue;\n\n                    // First-order clause.\n                } elseif ($this->is_first_order_clause($query)) {\n                    if (isset($query['value']) && array() === $query['value']) {\n                        unset($query['value']);\n                    }\n\n                    $clean_queries[$key] = $query;\n\n                    // Otherwise, it's a nested query, so we recurse.\n                } else {\n                    $cleaned_query = $this->sanitize_query($query);\n\n                    if (!empty($cleaned_query)) {\n                        $clean_queries[$key] = $cleaned_query;\n                    }\n                }\n            }\n\n            if (empty($clean_queries)) {\n                return $clean_queries;\n            }\n\n            // Sanitize the 'relation' key provided in the query.\n            if (isset($relation) && 'OR' === strtoupper($relation)) {\n                $clean_queries['relation'] = 'OR';\n                $this->has_or_relation = true;\n\n                /*\n                * If there is only a single clause, call the relation 'OR'.\n                * This value will not actually be used to join clauses, but it\n                * simplifies the logic around combining key-only queries.\n                */\n            } elseif (1 === count($clean_queries)) {\n                $clean_queries['relation'] = 'OR';\n\n                // Default to AND.\n            } else {\n                $clean_queries['relation'] = 'AND';\n            }\n\n            return $clean_queries;\n        }\n\n        /**\n         * Determine whether a query clause is first-order.\n         *\n         * A first-order meta query clause is one that has either a 'key' or\n         * a 'value' array key.\n         *\n         * @param array $query Meta query arguments.\n         * @return bool Whether the query clause is a first-order clause.\n         * @since 4.1.0\n         *\n         */\n        protected function is_first_order_clause($query)\n        {\n            return isset($query['key']) || isset($query['value']);\n        }\n\n        /**\n         * Constructs a meta query based on 'meta_*' query vars\n         *\n         * @param array $qv The query variables\n         * @since 3.2.0\n         *\n         */\n        public function parse_query_vars($qv)\n        {\n            $meta_query = array();\n\n            /*\n             * For orderby=meta_value to work correctly, simple query needs to be\n             * first (so that its table join is against an unaliased meta table) and\n             * needs to be its own clause (so it doesn't interfere with the logic of\n             * the rest of the meta_query).\n             */\n            $primary_meta_query = array();\n            foreach (array('key', 'compare', 'type', 'compare_key', 'type_key') as $key) {\n                if (!empty($qv[\"meta_$key\"])) {\n                    $primary_meta_query[$key] = $qv[\"meta_$key\"];\n                }\n            }\n\n            // WP_Query sets 'meta_value' = '' by default.\n            if (isset($qv['meta_value']) && '' !== $qv['meta_value'] && (!is_array($qv['meta_value']) || $qv['meta_value'])) {\n                $primary_meta_query['value'] = $qv['meta_value'];\n            }\n\n            $existing_meta_query = isset($qv['meta_query']) && is_array($qv['meta_query']) ? $qv['meta_query'] : array();\n\n            if (!empty($primary_meta_query) && !empty($existing_meta_query)) {\n                $meta_query = array(\n                    'relation' => 'AND',\n                    $primary_meta_query,\n                    $existing_meta_query,\n                );\n            } elseif (!empty($primary_meta_query)) {\n                $meta_query = array(\n                    $primary_meta_query,\n                );\n            } elseif (!empty($existing_meta_query)) {\n                $meta_query = $existing_meta_query;\n            }\n\n            $this->__construct($meta_query);\n        }\n\n        /**\n         * Return the appropriate alias for the given meta type if applicable.\n         *\n         * @param string $type MySQL type to cast meta_value.\n         * @return string MySQL type.\n         * @since 3.7.0\n         *\n         */\n        public function get_cast_for_type($type = '')\n        {\n            if (empty($type)) {\n                return 'CHAR';\n            }\n\n            $meta_type = strtoupper($type);\n\n            if (!preg_match('/^(?:BINARY|CHAR|DATE|DATETIME|SIGNED|UNSIGNED|TIME|NUMERIC(?:\\(\\d+(?:,\\s?\\d+)?\\))?|DECIMAL(?:\\(\\d+(?:,\\s?\\d+)?\\))?)$/', $meta_type)) {\n                return 'CHAR';\n            }\n\n            if ('NUMERIC' === $meta_type) {\n                $meta_type = 'SIGNED';\n            }\n\n            return $meta_type;\n        }\n\n        /**\n         * Generates SQL clauses to be appended to a main query.\n         *\n         * @param string $type Type of meta. Possible values include but are not limited\n         *                                  to 'post', 'comment', 'blog', 'term', and 'user'.\n         * @param string $primary_table Database table where the object being filtered is stored (eg wp_users).\n         * @param string $primary_id_column ID column for the filtered object in $primary_table.\n         * @param object $context Optional. The main query object that corresponds to the type, for\n         *                                  example a `WP_Query`, `WP_User_Query`, or `WP_Site_Query`.\n         * @return string[]|false {\n         *     Array containing JOIN and WHERE SQL clauses to append to the main query,\n         *     or false if no table exists for the requested meta type.\n         *\n         * @type string $join SQL fragment to append to the main JOIN clause.\n         * @type string $where SQL fragment to append to the main WHERE clause.\n         * }\n         * @since 3.2.0\n         *\n         */\n        public function get_sql($type, $primary_table, $primary_id_column, $context = null)\n        {\n            $meta_table = _get_meta_table($type);\n            if (!$meta_table) {\n                return false;\n            }\n\n            $this->table_aliases = array();\n\n            $this->meta_table = $meta_table;\n            $this->meta_id_column = sanitize_key($type . '_id');\n\n            $this->primary_table = $primary_table;\n            $this->primary_id_column = $primary_id_column;\n\n            $sql = $this->get_sql_clauses();\n\n            /*\n             * If any JOINs are LEFT JOINs (as in the case of NOT EXISTS), then all JOINs should\n             * be LEFT. Otherwise posts with no metadata will be excluded from results.\n             */\n            if (false !== strpos($sql['join'], 'LEFT JOIN')) {\n                $sql['join'] = str_replace('INNER JOIN', 'LEFT JOIN', $sql['join']);\n            }\n\n            /**\n             * Filters the meta query's generated SQL.\n             *\n             * @param string[] $sql Array containing the query's JOIN and WHERE clauses.\n             * @param array $queries Array of meta queries.\n             * @param string $type Type of meta. Possible values include but are not limited\n             *                                    to 'post', 'comment', 'blog', 'term', and 'user'.\n             * @param string $primary_table Primary table.\n             * @param string $primary_id_column Primary column ID.\n             * @param object $context The main query object that corresponds to the type, for\n             *                                    example a `WP_Query`, `WP_User_Query`, or `WP_Site_Query`.\n             * @since 3.1.0\n             *\n             */\n            return apply_filters_ref_array('get_meta_sql', array($sql, $this->queries, $type, $primary_table, $primary_id_column, $context));\n        }\n\n        /**\n         * Generate SQL clauses to be appended to a main query.\n         *\n         * Called by the public WP_Meta_Query::get_sql(), this method is abstracted\n         * out to maintain parity with the other Query classes.\n         *\n         * @return string[] {\n         *     Array containing JOIN and WHERE SQL clauses to append to the main query.\n         *\n         * @type string $join SQL fragment to append to the main JOIN clause.\n         * @type string $where SQL fragment to append to the main WHERE clause.\n         * }\n         * @since 4.1.0\n         *\n         */\n        protected function get_sql_clauses()\n        {\n            /*\n             * $queries are passed by reference to get_sql_for_query() for recursion.\n             * To keep $this->queries unaltered, pass a copy.\n             */\n            $queries = $this->queries;\n            $sql = $this->get_sql_for_query($queries);\n\n            if (!empty($sql['where'])) {\n                $sql['where'] = ' AND ' . $sql['where'];\n            }\n\n            return $sql;\n        }\n\n        /**\n         * Generate SQL clauses for a single query array.\n         *\n         * If nested subqueries are found, this method recurses the tree to\n         * produce the properly nested SQL.\n         *\n         * @param array $query Query to parse (passed by reference).\n         * @param int $depth Optional. Number of tree levels deep we currently are.\n         *                     Used to calculate indentation. Default 0.\n         * @return string[] {\n         *     Array containing JOIN and WHERE SQL clauses to append to a single query array.\n         *\n         * @type string $join SQL fragment to append to the main JOIN clause.\n         * @type string $where SQL fragment to append to the main WHERE clause.\n         * }\n         * @since 4.1.0\n         *\n         */\n        protected function get_sql_for_query(&$query, $depth = 0)\n        {\n            $sql_chunks = array(\n                'join' => array(),\n                'where' => array(),\n            );\n\n            $sql = array(\n                'join' => '',\n                'where' => '',\n            );\n\n            $indent = '';\n            for ($i = 0; $i < $depth; $i++) {\n                $indent .= '  ';\n            }\n\n            foreach ($query as $key => &$clause) {\n                if ('relation' === $key) {\n                    $relation = $query['relation'];\n                } elseif (is_array($clause)) {\n\n                    // This is a first-order clause.\n                    if ($this->is_first_order_clause($clause)) {\n                        $clause_sql = $this->get_sql_for_clause($clause, $query, $key);\n\n                        $where_count = count($clause_sql['where']);\n                        if (!$where_count) {\n                            $sql_chunks['where'][] = '';\n                        } elseif (1 === $where_count) {\n                            $sql_chunks['where'][] = $clause_sql['where'][0];\n                        } else {\n                            $sql_chunks['where'][] = '( ' . implode(' AND ', $clause_sql['where']) . ' )';\n                        }\n\n                        $sql_chunks['join'] = array_merge($sql_chunks['join'], $clause_sql['join']);\n                        // This is a subquery, so we recurse.\n                    } else {\n                        $clause_sql = $this->get_sql_for_query($clause, $depth + 1);\n\n                        $sql_chunks['where'][] = $clause_sql['where'];\n                        $sql_chunks['join'][] = $clause_sql['join'];\n                    }\n                }\n            }\n\n            // Filter to remove empties.\n            $sql_chunks['join'] = array_filter($sql_chunks['join']);\n            $sql_chunks['where'] = array_filter($sql_chunks['where']);\n\n            if (empty($relation)) {\n                $relation = 'AND';\n            }\n\n            // Filter duplicate JOIN clauses and combine into a single string.\n            if (!empty($sql_chunks['join'])) {\n                $sql['join'] = implode(' ', array_unique($sql_chunks['join']));\n            }\n\n            // Generate a single WHERE clause with proper brackets and indentation.\n            if (!empty($sql_chunks['where'])) {\n                $sql['where'] = '( ' . \"\\n  \" . $indent . implode(' ' . \"\\n  \" . $indent . $relation . ' ' . \"\\n  \" . $indent, $sql_chunks['where']) . \"\\n\" . $indent . ')';\n            }\n\n            return $sql;\n        }\n\n        /**\n         * Generate SQL JOIN and WHERE clauses for a first-order query clause.\n         *\n         * \"First-order\" means that it's an array with a 'key' or 'value'.\n         *\n         * @param array $clause Query clause (passed by reference).\n         * @param array $parent_query Parent query array.\n         * @param string $clause_key Optional. The array key used to name the clause in the original `$meta_query`\n         *                             parameters. If not provided, a key will be generated automatically.\n         * @return string[] {\n         *     Array containing JOIN and WHERE SQL clauses to append to a first-order query.\n         *\n         * @type string $join SQL fragment to append to the main JOIN clause.\n         * @type string $where SQL fragment to append to the main WHERE clause.\n         * }\n         * @since 4.1.0\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         */\n        public function get_sql_for_clause(&$clause, $parent_query, $clause_key = '')\n        {\n            global $wpdb;\n\n            $sql_chunks = array(\n                'where' => array(),\n                'join' => array(),\n            );\n\n            if (isset($clause['compare'])) {\n                $clause['compare'] = strtoupper($clause['compare']);\n            } else {\n                $clause['compare'] = isset($clause['value']) && is_array($clause['value']) ? 'IN' : '=';\n            }\n\n            $non_numeric_operators = array(\n                '=',\n                '!=',\n                'LIKE',\n                'NOT LIKE',\n                'IN',\n                'NOT IN',\n                'EXISTS',\n                'NOT EXISTS',\n                'RLIKE',\n                'REGEXP',\n                'NOT REGEXP',\n            );\n\n            $numeric_operators = array(\n                '>',\n                '>=',\n                '<',\n                '<=',\n                'BETWEEN',\n                'NOT BETWEEN',\n            );\n\n            if (!in_array($clause['compare'], $non_numeric_operators, true) && !in_array($clause['compare'], $numeric_operators, true)) {\n                $clause['compare'] = '=';\n            }\n\n            if (isset($clause['compare_key'])) {\n                $clause['compare_key'] = strtoupper($clause['compare_key']);\n            } else {\n                $clause['compare_key'] = isset($clause['key']) && is_array($clause['key']) ? 'IN' : '=';\n            }\n\n            if (!in_array($clause['compare_key'], $non_numeric_operators, true)) {\n                $clause['compare_key'] = '=';\n            }\n\n            $meta_compare = $clause['compare'];\n            $meta_compare_key = $clause['compare_key'];\n\n            // First build the JOIN clause, if one is required.\n            $join = '';\n\n            // We prefer to avoid joins if possible. Look for an existing join compatible with this clause.\n            $alias = $this->find_compatible_table_alias($clause, $parent_query);\n            if (false === $alias) {\n                $i = count($this->table_aliases);\n                $alias = $i ? 'mt' . $i : $this->meta_table;\n\n                // JOIN clauses for NOT EXISTS have their own syntax.\n                if ('NOT EXISTS' === $meta_compare) {\n                    $join .= \" LEFT JOIN $this->meta_table\";\n                    $join .= $i ? \" AS $alias\" : '';\n\n                    if ('LIKE' === $meta_compare_key) {\n                        $join .= $wpdb->prepare(\" ON ( $this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key LIKE %s )\", '%' . $wpdb->esc_like($clause['key']) . '%');\n                    } else {\n                        $join .= $wpdb->prepare(\" ON ( $this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key = %s )\", $clause['key']);\n                    }\n\n                    // All other JOIN clauses.\n                } else {\n                    $join .= \" INNER JOIN $this->meta_table\";\n                    $join .= $i ? \" AS $alias\" : '';\n                    $join .= \" ON ( $this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column )\";\n                }\n\n                $this->table_aliases[] = $alias;\n                $sql_chunks['join'][] = $join;\n            }\n\n            // Save the alias to this clause, for future siblings to find.\n            $clause['alias'] = $alias;\n\n            // Determine the data type.\n            $_meta_type = isset($clause['type']) ? $clause['type'] : '';\n            $meta_type = $this->get_cast_for_type($_meta_type);\n            $clause['cast'] = $meta_type;\n\n            // Fallback for clause keys is the table alias. Key must be a string.\n            if (is_int($clause_key) || !$clause_key) {\n                $clause_key = $clause['alias'];\n            }\n\n            // Ensure unique clause keys, so none are overwritten.\n            $iterator = 1;\n            $clause_key_base = $clause_key;\n            while (isset($this->clauses[$clause_key])) {\n                $clause_key = $clause_key_base . '-' . $iterator;\n                $iterator++;\n            }\n\n            // Store the clause in our flat array.\n            $this->clauses[$clause_key] =& $clause;\n\n            // Next, build the WHERE clause.\n\n            // meta_key.\n            if (array_key_exists('key', $clause)) {\n                if ('NOT EXISTS' === $meta_compare) {\n                    $sql_chunks['where'][] = $alias . '.' . $this->meta_id_column . ' IS NULL';\n                } else {\n                    /**\n                     * In joined clauses negative operators have to be nested into a\n                     * NOT EXISTS clause and flipped, to avoid returning records with\n                     * matching post IDs but different meta keys. Here we prepare the\n                     * nested clause.\n                     */\n                    if (in_array($meta_compare_key, array('!=', 'NOT IN', 'NOT LIKE', 'NOT EXISTS', 'NOT REGEXP'), true)) {\n                        // Negative clauses may be reused.\n                        $i = count($this->table_aliases);\n                        $subquery_alias = $i ? 'mt' . $i : $this->meta_table;\n                        $this->table_aliases[] = $subquery_alias;\n\n                        $meta_compare_string_start = 'NOT EXISTS (';\n                        $meta_compare_string_start .= \"SELECT 1 FROM $wpdb->postmeta $subquery_alias \";\n                        $meta_compare_string_start .= \"WHERE $subquery_alias.post_ID = $alias.post_ID \";\n                        $meta_compare_string_end = 'LIMIT 1';\n                        $meta_compare_string_end .= ')';\n                    }\n\n                    switch ($meta_compare_key) {\n                        case '=':\n                        case 'EXISTS':\n                            $where = $wpdb->prepare(\"$alias.meta_key = %s\", trim($clause['key'])); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared\n                            break;\n                        case 'LIKE':\n                            $meta_compare_value = '%' . $wpdb->esc_like(trim($clause['key'])) . '%';\n                            $where = $wpdb->prepare(\"$alias.meta_key LIKE %s\", $meta_compare_value); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared\n                            break;\n                        case 'IN':\n                            $meta_compare_string = \"$alias.meta_key IN (\" . substr(str_repeat(',%s', count($clause['key'])), 1) . ')';\n                            $where = $wpdb->prepare($meta_compare_string, $clause['key']); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared\n                            break;\n                        case 'RLIKE':\n                        case 'REGEXP':\n                            $operator = $meta_compare_key;\n                            if (isset($clause['type_key']) && 'BINARY' === strtoupper($clause['type_key'])) {\n                                $cast = 'BINARY';\n                            } else {\n                                $cast = '';\n                            }\n                            $where = $wpdb->prepare(\"$alias.meta_key $operator $cast %s\", trim($clause['key'])); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared\n                            break;\n\n                        case '!=':\n                        case 'NOT EXISTS':\n                            $meta_compare_string = $meta_compare_string_start . \"AND $subquery_alias.meta_key = %s \" . $meta_compare_string_end;\n                            $where = $wpdb->prepare($meta_compare_string, $clause['key']); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared\n                            break;\n                        case 'NOT LIKE':\n                            $meta_compare_string = $meta_compare_string_start . \"AND $subquery_alias.meta_key LIKE %s \" . $meta_compare_string_end;\n\n                            $meta_compare_value = '%' . $wpdb->esc_like(trim($clause['key'])) . '%';\n                            $where = $wpdb->prepare($meta_compare_string, $meta_compare_value); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared\n                            break;\n                        case 'NOT IN':\n                            $array_subclause = '(' . substr(str_repeat(',%s', count($clause['key'])), 1) . ') ';\n                            $meta_compare_string = $meta_compare_string_start . \"AND $subquery_alias.meta_key IN \" . $array_subclause . $meta_compare_string_end;\n                            $where = $wpdb->prepare($meta_compare_string, $clause['key']); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared\n                            break;\n                        case 'NOT REGEXP':\n                            $operator = $meta_compare_key;\n                            if (isset($clause['type_key']) && 'BINARY' === strtoupper($clause['type_key'])) {\n                                $cast = 'BINARY';\n                            } else {\n                                $cast = '';\n                            }\n\n                            $meta_compare_string = $meta_compare_string_start . \"AND $subquery_alias.meta_key REGEXP $cast %s \" . $meta_compare_string_end;\n                            $where = $wpdb->prepare($meta_compare_string, $clause['key']); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared\n                            break;\n                    }\n\n                    $sql_chunks['where'][] = $where;\n                }\n            }\n\n            // meta_value.\n            if (array_key_exists('value', $clause)) {\n                $meta_value = $clause['value'];\n\n                if (in_array($meta_compare, array('IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'), true)) {\n                    if (!is_array($meta_value)) {\n                        $meta_value = preg_split('/[,\\s]+/', $meta_value);\n                    }\n                } elseif (is_string($meta_value)) {\n                    $meta_value = trim($meta_value);\n                }\n\n                switch ($meta_compare) {\n                    case 'IN':\n                    case 'NOT IN':\n                        $meta_compare_string = '(' . substr(str_repeat(',%s', count($meta_value)), 1) . ')';\n                        $where = $wpdb->prepare($meta_compare_string, $meta_value);\n                        break;\n\n                    case 'BETWEEN':\n                    case 'NOT BETWEEN':\n                        $where = $wpdb->prepare('%s AND %s', $meta_value[0], $meta_value[1]);\n                        break;\n\n                    case 'LIKE':\n                    case 'NOT LIKE':\n                        $meta_value = '%' . $wpdb->esc_like($meta_value) . '%';\n                        $where = $wpdb->prepare('%s', $meta_value);\n                        break;\n\n                    // EXISTS with a value is interpreted as '='.\n                    case 'EXISTS':\n                        $meta_compare = '=';\n                        $where = $wpdb->prepare('%s', $meta_value);\n                        break;\n\n                    // 'value' is ignored for NOT EXISTS.\n                    case 'NOT EXISTS':\n                        $where = '';\n                        break;\n\n                    default:\n                        $where = $wpdb->prepare('%s', $meta_value);\n                        break;\n\n                }\n\n                if ($where) {\n                    if ('CHAR' === $meta_type) {\n                        $sql_chunks['where'][] = \"$alias.meta_value {$meta_compare} {$where}\";\n                    } else {\n                        $sql_chunks['where'][] = \"CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}\";\n                    }\n                }\n            }\n\n            /*\n             * Multiple WHERE clauses (for meta_key and meta_value) should\n             * be joined in parentheses.\n             */\n            if (1 < count($sql_chunks['where'])) {\n                $sql_chunks['where'] = array('( ' . implode(' AND ', $sql_chunks['where']) . ' )');\n            }\n\n            return $sql_chunks;\n        }\n\n        /**\n         * Get a flattened list of sanitized meta clauses.\n         *\n         * This array should be used for clause lookup, as when the table alias and CAST type must be determined for\n         * a value of 'orderby' corresponding to a meta clause.\n         *\n         * @return array Meta clauses.\n         * @since 4.2.0\n         *\n         */\n        public function get_clauses()\n        {\n            return $this->clauses;\n        }\n\n        /**\n         * Identify an existing table alias that is compatible with the current\n         * query clause.\n         *\n         * We avoid unnecessary table joins by allowing each clause to look for\n         * an existing table alias that is compatible with the query that it\n         * needs to perform.\n         *\n         * An existing alias is compatible if (a) it is a sibling of `$clause`\n         * (ie, it's under the scope of the same relation), and (b) the combination\n         * of operator and relation between the clauses allows for a shared table join.\n         * In the case of WP_Meta_Query, this only applies to 'IN' clauses that are\n         * connected by the relation 'OR'.\n         *\n         * @param array $clause Query clause.\n         * @param array $parent_query Parent query of $clause.\n         * @return string|false Table alias if found, otherwise false.\n         * @since 4.1.0\n         *\n         */\n        protected function find_compatible_table_alias($clause, $parent_query)\n        {\n            $alias = false;\n\n            foreach ($parent_query as $sibling) {\n                // If the sibling has no alias yet, there's nothing to check.\n                if (empty($sibling['alias'])) {\n                    continue;\n                }\n\n                // We're only interested in siblings that are first-order clauses.\n                if (!is_array($sibling) || !$this->is_first_order_clause($sibling)) {\n                    continue;\n                }\n\n                $compatible_compares = array();\n\n                // Clauses connected by OR can share joins as long as they have \"positive\" operators.\n                if ('OR' === $parent_query['relation']) {\n                    $compatible_compares = array('=', 'IN', 'BETWEEN', 'LIKE', 'REGEXP', 'RLIKE', '>', '>=', '<', '<=');\n\n                    // Clauses joined by AND with \"negative\" operators share a join only if they also share a key.\n                } elseif (isset($sibling['key']) && isset($clause['key']) && $sibling['key'] === $clause['key']) {\n                    $compatible_compares = array('!=', 'NOT IN', 'NOT LIKE');\n                }\n\n                $clause_compare = strtoupper($clause['compare']);\n                $sibling_compare = strtoupper($sibling['compare']);\n                if (in_array($clause_compare, $compatible_compares, true) && in_array($sibling_compare, $compatible_compares, true)) {\n                    $alias = preg_replace('/\\W/', '_', $sibling['alias']);\n                    break;\n                }\n            }\n\n            /**\n             * Filters the table alias identified as compatible with the current clause.\n             *\n             * @param string|false $alias Table alias, or false if none was found.\n             * @param array $clause First-order query clause.\n             * @param array $parent_query Parent of $clause.\n             * @param WP_Meta_Query $query WP_Meta_Query object.\n             * @since 4.1.0\n             *\n             */\n            return apply_filters('meta_query_find_compatible_table_alias', $alias, $clause, $parent_query, $this);\n        }\n\n        /**\n         * Checks whether the current query has any OR relations.\n         *\n         * In some cases, the presence of an OR relation somewhere in the query will require\n         * the use of a `DISTINCT` or `GROUP BY` keyword in the `SELECT` clause. The current\n         * method can be used in these cases to determine whether such a clause is necessary.\n         *\n         * @return bool True if the query contains any `OR` relations, otherwise false.\n         * @since 4.3.0\n         *\n         */\n        public function has_or_relation()\n        {\n            return $this->has_or_relation;\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/class.wp_object_cache.php",
    "content": "<?php\n/**\n * Object Cache API: WP_Object_Cache class\n *\n * @package WordPress\n * @subpackage Cache\n * @since 5.4.0\n */\n\n/**\n * Core class that implements an object cache.\n *\n * The WordPress Object Cache is used to save on trips to the database. The\n * Object Cache stores all of the cache data to memory and makes the cache\n * contents available by using a key, which is used to name and later retrieve\n * the cache contents.\n *\n * The Object Cache can be replaced by other caching mechanisms by placing files\n * in the wp-content folder which is looked at in wp-settings. If that file\n * exists, then this file will not be included.\n *\n * @since 2.0.0\n */\nif (!class_exists('WP_Object_Cache')) {\n\n    class WP_Object_Cache\n    {\n\n        /**\n         * Holds the cached objects.\n         *\n         * @since 2.0.0\n         * @var array\n         */\n        private $cache = array();\n\n        /**\n         * The amount of times the cache data was already stored in the cache.\n         *\n         * @since 2.5.0\n         * @var int\n         */\n        public $cache_hits = 0;\n\n        /**\n         * Amount of times the cache did not have the request in cache.\n         *\n         * @since 2.0.0\n         * @var int\n         */\n        public $cache_misses = 0;\n\n        /**\n         * List of global cache groups.\n         *\n         * @since 3.0.0\n         * @var array\n         */\n        protected $global_groups = array();\n\n        /**\n         * The blog prefix to prepend to keys in non-global groups.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        private $blog_prefix;\n\n        /**\n         * Holds the value of is_multisite().\n         *\n         * @since 3.5.0\n         * @var bool\n         */\n        private $multisite;\n\n        /**\n         * Sets up object properties; PHP 5 style constructor.\n         *\n         * @since 2.0.8\n         */\n        public function __construct()\n        {\n            $this->multisite = is_multisite();\n            $this->blog_prefix = $this->multisite ? get_current_blog_id() . ':' : '';\n        }\n\n        /**\n         * Makes private properties readable for backward compatibility.\n         *\n         * @param string $name Property to get.\n         * @return mixed Property.\n         * @since 4.0.0\n         *\n         */\n        public function __get($name)\n        {\n            return $this->$name;\n        }\n\n        /**\n         * Makes private properties settable for backward compatibility.\n         *\n         * @param string $name Property to set.\n         * @param mixed $value Property value.\n         * @return mixed Newly-set property.\n         * @since 4.0.0\n         *\n         */\n        public function __set($name, $value)\n        {\n            return $this->$name = $value;\n        }\n\n        /**\n         * Makes private properties checkable for backward compatibility.\n         *\n         * @param string $name Property to check if set.\n         * @return bool Whether the property is set.\n         * @since 4.0.0\n         *\n         */\n        public function __isset($name)\n        {\n            return isset($this->$name);\n        }\n\n        /**\n         * Makes private properties un-settable for backward compatibility.\n         *\n         * @param string $name Property to unset.\n         * @since 4.0.0\n         *\n         */\n        public function __unset($name)\n        {\n            unset($this->$name);\n        }\n\n        /**\n         * Adds data to the cache if it doesn't already exist.\n         *\n         * @param int|string $key What to call the contents in the cache.\n         * @param mixed $data The contents to store in the cache.\n         * @param string $group Optional. Where to group the cache contents. Default 'default'.\n         * @param int $expire Optional. When to expire the cache contents. Default 0 (no expiration).\n         * @return bool True on success, false if cache key and group already exist.\n         * @uses WP_Object_Cache::set()     Sets the data after the checking the cache\n         *                                  contents existence.\n         *\n         * @since 2.0.0\n         *\n         * @uses WP_Object_Cache::_exists() Checks to see if the cache already has data.\n         */\n        public function add($key, $data, $group = 'default', $expire = 0)\n        {\n            if (wp_suspend_cache_addition()) {\n                return false;\n            }\n\n            if (empty($group)) {\n                $group = 'default';\n            }\n\n            $id = $key;\n            if ($this->multisite && !isset($this->global_groups[$group])) {\n                $id = $this->blog_prefix . $key;\n            }\n\n            if ($this->_exists($id, $group)) {\n                return false;\n            }\n\n            return $this->set($key, $data, $group, (int)$expire);\n        }\n\n        /**\n         * Sets the list of global cache groups.\n         *\n         * @param string|string[] $groups List of groups that are global.\n         * @since 3.0.0\n         *\n         */\n        public function add_global_groups($groups)\n        {\n            $groups = (array)$groups;\n\n            $groups = array_fill_keys($groups, true);\n            $this->global_groups = array_merge($this->global_groups, $groups);\n        }\n\n        /**\n         * Decrements numeric cache item's value.\n         *\n         * @param int|string $key The cache key to decrement.\n         * @param int $offset Optional. The amount by which to decrement the item's value. Default 1.\n         * @param string $group Optional. The group the key is in. Default 'default'.\n         * @return int|false The item's new value on success, false on failure.\n         * @since 3.3.0\n         *\n         */\n        public function decr($key, $offset = 1, $group = 'default')\n        {\n            if (empty($group)) {\n                $group = 'default';\n            }\n\n            if ($this->multisite && !isset($this->global_groups[$group])) {\n                $key = $this->blog_prefix . $key;\n            }\n\n            if (!$this->_exists($key, $group)) {\n                return false;\n            }\n\n            if (!is_numeric($this->cache[$group][$key])) {\n                $this->cache[$group][$key] = 0;\n            }\n\n            $offset = (int)$offset;\n\n            $this->cache[$group][$key] -= $offset;\n\n            if ($this->cache[$group][$key] < 0) {\n                $this->cache[$group][$key] = 0;\n            }\n\n            return $this->cache[$group][$key];\n        }\n\n        /**\n         * Removes the contents of the cache key in the group.\n         *\n         * If the cache key does not exist in the group, then nothing will happen.\n         *\n         * @param int|string $key What the contents in the cache are called.\n         * @param string $group Optional. Where the cache contents are grouped. Default 'default'.\n         * @param bool $deprecated Optional. Unused. Default false.\n         * @return bool False if the contents weren't deleted and true on success.\n         * @since 2.0.0\n         *\n         */\n        public function delete($key, $group = 'default', $deprecated = false)\n        {\n            if (empty($group)) {\n                $group = 'default';\n            }\n\n            if ($this->multisite && !isset($this->global_groups[$group])) {\n                $key = $this->blog_prefix . $key;\n            }\n\n            if (!$this->_exists($key, $group)) {\n                return false;\n            }\n\n            unset($this->cache[$group][$key]);\n            return true;\n        }\n\n        /**\n         * Clears the object cache of all data.\n         *\n         * @return true Always returns true.\n         * @since 2.0.0\n         *\n         */\n        public function flush()\n        {\n            $this->cache = array();\n\n            return true;\n        }\n\n        /**\n         * Retrieves the cache contents, if it exists.\n         *\n         * The contents will be first attempted to be retrieved by searching by the\n         * key in the cache group. If the cache is hit (success) then the contents\n         * are returned.\n         *\n         * On failure, the number of cache misses will be incremented.\n         *\n         * @param int|string $key The key under which the cache contents are stored.\n         * @param string $group Optional. Where the cache contents are grouped. Default 'default'.\n         * @param bool $force Optional. Unused. Whether to force an update of the local cache\n         *                          from the persistent cache. Default false.\n         * @param bool $found Optional. Whether the key was found in the cache (passed by reference).\n         *                          Disambiguates a return of false, a storable value. Default null.\n         * @return mixed|false The cache contents on success, false on failure to retrieve contents.\n         * @since 2.0.0\n         *\n         */\n        public function get($key, $group = 'default', $force = false, &$found = null)\n        {\n            if (empty($group)) {\n                $group = 'default';\n            }\n\n            if ($this->multisite && !isset($this->global_groups[$group])) {\n                $key = $this->blog_prefix . $key;\n            }\n\n            if ($this->_exists($key, $group)) {\n                $found = true;\n                $this->cache_hits += 1;\n                if (is_object($this->cache[$group][$key])) {\n                    return clone $this->cache[$group][$key];\n                } else {\n                    return $this->cache[$group][$key];\n                }\n            }\n\n            $found = false;\n            $this->cache_misses += 1;\n            return false;\n        }\n\n        /**\n         * Retrieves multiple values from the cache in one call.\n         *\n         * @param array $keys Array of keys under which the cache contents are stored.\n         * @param string $group Optional. Where the cache contents are grouped. Default 'default'.\n         * @param bool $force Optional. Whether to force an update of the local cache\n         *                      from the persistent cache. Default false.\n         * @return array Array of values organized into groups.\n         * @since 5.5.0\n         *\n         */\n        public function get_multiple($keys, $group = 'default', $force = false)\n        {\n            $values = array();\n\n            foreach ($keys as $key) {\n                $values[$key] = $this->get($key, $group, $force);\n            }\n\n            return $values;\n        }\n\n        /**\n         * Increments numeric cache item's value.\n         *\n         * @param int|string $key The cache key to increment\n         * @param int $offset Optional. The amount by which to increment the item's value. Default 1.\n         * @param string $group Optional. The group the key is in. Default 'default'.\n         * @return int|false The item's new value on success, false on failure.\n         * @since 3.3.0\n         *\n         */\n        public function incr($key, $offset = 1, $group = 'default')\n        {\n            if (empty($group)) {\n                $group = 'default';\n            }\n\n            if ($this->multisite && !isset($this->global_groups[$group])) {\n                $key = $this->blog_prefix . $key;\n            }\n\n            if (!$this->_exists($key, $group)) {\n                return false;\n            }\n\n            if (!is_numeric($this->cache[$group][$key])) {\n                $this->cache[$group][$key] = 0;\n            }\n\n            $offset = (int)$offset;\n\n            $this->cache[$group][$key] += $offset;\n\n            if ($this->cache[$group][$key] < 0) {\n                $this->cache[$group][$key] = 0;\n            }\n\n            return $this->cache[$group][$key];\n        }\n\n        /**\n         * Replaces the contents in the cache, if contents already exist.\n         *\n         * @param int|string $key What to call the contents in the cache.\n         * @param mixed $data The contents to store in the cache.\n         * @param string $group Optional. Where to group the cache contents. Default 'default'.\n         * @param int $expire Optional. When to expire the cache contents. Default 0 (no expiration).\n         * @return bool False if not exists, true if contents were replaced.\n         * @see WP_Object_Cache::set()\n         *\n         * @since 2.0.0\n         *\n         */\n        public function replace($key, $data, $group = 'default', $expire = 0)\n        {\n            if (empty($group)) {\n                $group = 'default';\n            }\n\n            $id = $key;\n            if ($this->multisite && !isset($this->global_groups[$group])) {\n                $id = $this->blog_prefix . $key;\n            }\n\n            if (!$this->_exists($id, $group)) {\n                return false;\n            }\n\n            return $this->set($key, $data, $group, (int)$expire);\n        }\n\n        /**\n         * Resets cache keys.\n         *\n         * @since 3.0.0\n         *\n         * @deprecated 3.5.0 Use switch_to_blog()\n         * @see switch_to_blog()\n         */\n        public function reset()\n        {\n\n            // Clear out non-global caches since the blog ID has changed.\n            foreach (array_keys($this->cache) as $group) {\n                if (!isset($this->global_groups[$group])) {\n                    unset($this->cache[$group]);\n                }\n            }\n        }\n\n        /**\n         * Sets the data contents into the cache.\n         *\n         * The cache contents are grouped by the $group parameter followed by the\n         * $key. This allows for duplicate IDs in unique groups. Therefore, naming of\n         * the group should be used with care and should follow normal function\n         * naming guidelines outside of core WordPress usage.\n         *\n         * The $expire parameter is not used, because the cache will automatically\n         * expire for each time a page is accessed and PHP finishes. The method is\n         * more for cache plugins which use files.\n         *\n         * @param int|string $key What to call the contents in the cache.\n         * @param mixed $data The contents to store in the cache.\n         * @param string $group Optional. Where to group the cache contents. Default 'default'.\n         * @param int $expire Not Used.\n         * @return true Always returns true.\n         * @since 2.0.0\n         *\n         */\n        public function set($key, $data, $group = 'default', $expire = 0)\n        {\n            if (empty($group)) {\n                $group = 'default';\n            }\n\n            if ($this->multisite && !isset($this->global_groups[$group])) {\n                $key = $this->blog_prefix . $key;\n            }\n\n            if (is_object($data)) {\n                $data = clone $data;\n            }\n\n            $this->cache[$group][$key] = $data;\n            return true;\n        }\n\n        /**\n         * Echoes the stats of the caching.\n         *\n         * Gives the cache hits, and cache misses. Also prints every cached group,\n         * key and the data.\n         *\n         * @since 2.0.0\n         */\n        public function stats()\n        {\n            echo '<p>';\n            echo \"<strong>Cache Hits:</strong> {$this->cache_hits}<br />\";\n            echo \"<strong>Cache Misses:</strong> {$this->cache_misses}<br />\";\n            echo '</p>';\n            echo '<ul>';\n            foreach ($this->cache as $group => $cache) {\n                echo '<li><strong>Group:</strong> ' . esc_html($group) . ' - ( ' . number_format(strlen(serialize($cache)) / KB_IN_BYTES, 2) . 'k )</li>';\n            }\n            echo '</ul>';\n        }\n\n        /**\n         * Switches the internal blog ID.\n         *\n         * This changes the blog ID used to create keys in blog specific groups.\n         *\n         * @param int $blog_id Blog ID.\n         * @since 3.5.0\n         *\n         */\n        public function switch_to_blog($blog_id)\n        {\n            $blog_id = (int)$blog_id;\n            $this->blog_prefix = $this->multisite ? $blog_id . ':' : '';\n        }\n\n        /**\n         * Serves as a utility function to determine whether a key exists in the cache.\n         *\n         * @param int|string $key Cache key to check for existence.\n         * @param string $group Cache group for the key existence check.\n         * @return bool Whether the key exists in the cache for the given group.\n         * @since 3.4.0\n         *\n         */\n        protected function _exists($key, $group)\n        {\n            return isset($this->cache[$group]) && (isset($this->cache[$group][$key]) || array_key_exists($key, $this->cache[$group]));\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/class.wp_post.php",
    "content": "<?php\n/**\n * Post API: WP_Post class\n *\n * @package WordPress\n * @subpackage Post\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement the WP_Post object.\n *\n * @since 3.5.0\n *\n * @property string $page_template\n *\n * @property-read int[]  $ancestors\n * @property-read int    $post_category\n * @property-read string $tag_input\n */\nif (!class_exists('WP_Post')) {\n\n    final class WP_Post\n    {\n\n        /**\n         * Post ID.\n         *\n         * @since 3.5.0\n         * @var int\n         */\n        public $ID;\n\n        /**\n         * ID of post author.\n         *\n         * A numeric string, for compatibility reasons.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_author = 0;\n\n        /**\n         * The post's local publication time.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_date = '0000-00-00 00:00:00';\n\n        /**\n         * The post's GMT publication time.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_date_gmt = '0000-00-00 00:00:00';\n\n        /**\n         * The post's content.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_content = '';\n\n        /**\n         * The post's title.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_title = '';\n\n        /**\n         * The post's excerpt.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_excerpt = '';\n\n        /**\n         * The post's status.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_status = 'publish';\n\n        /**\n         * Whether comments are allowed.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $comment_status = 'open';\n\n        /**\n         * Whether pings are allowed.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $ping_status = 'open';\n\n        /**\n         * The post's password in plain text.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_password = '';\n\n        /**\n         * The post's slug.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_name = '';\n\n        /**\n         * URLs queued to be pinged.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $to_ping = '';\n\n        /**\n         * URLs that have been pinged.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $pinged = '';\n\n        /**\n         * The post's local modified time.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_modified = '0000-00-00 00:00:00';\n\n        /**\n         * The post's GMT modified time.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_modified_gmt = '0000-00-00 00:00:00';\n\n        /**\n         * A utility DB field for post content.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_content_filtered = '';\n\n        /**\n         * ID of a post's parent post.\n         *\n         * @since 3.5.0\n         * @var int\n         */\n        public $post_parent = 0;\n\n        /**\n         * The unique identifier for a post, not necessarily a URL, used as the feed GUID.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $guid = '';\n\n        /**\n         * A field used for ordering posts.\n         *\n         * @since 3.5.0\n         * @var int\n         */\n        public $menu_order = 0;\n\n        /**\n         * The post's type, like post or page.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_type = 'post';\n\n        /**\n         * An attachment's mime type.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $post_mime_type = '';\n\n        /**\n         * Cached comment count.\n         *\n         * A numeric string, for compatibility reasons.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $comment_count = 0;\n\n        /**\n         * Stores the post object's sanitization level.\n         *\n         * Does not correspond to a DB field.\n         *\n         * @since 3.5.0\n         * @var string\n         */\n        public $filter;\n\n        /**\n         * Retrieve WP_Post instance.\n         *\n         * @param int $post_id Post ID.\n         * @return WP_Post|false Post object, false otherwise.\n         * @since 3.5.0\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         */\n        public static function get_instance($post_id)\n        {\n            global $wpdb;\n\n            $post_id = (int)$post_id;\n            if (!$post_id) {\n                return false;\n            }\n\n            $_post = wp_cache_get($post_id, 'posts');\n\n            if (!$_post) {\n                $_post = $wpdb->get_row($wpdb->prepare(\"SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1\", $post_id));\n\n                if (!$_post) {\n                    return false;\n                }\n\n                $_post = sanitize_post($_post, 'raw');\n                wp_cache_add($_post->ID, $_post, 'posts');\n            } elseif (empty($_post->filter)) {\n                $_post = sanitize_post($_post, 'raw');\n            }\n\n            return new WP_Post($_post);\n        }\n\n        /**\n         * Constructor.\n         *\n         * @param WP_Post|object $post Post object.\n         * @since 3.5.0\n         *\n         */\n        public function __construct($post)\n        {\n            foreach (get_object_vars($post) as $key => $value) {\n                $this->$key = $value;\n            }\n        }\n\n        /**\n         * Isset-er.\n         *\n         * @param string $key Property to check if set.\n         * @return bool\n         * @since 3.5.0\n         *\n         */\n        public function __isset($key)\n        {\n            if ('ancestors' === $key) {\n                return true;\n            }\n\n            if ('page_template' === $key) {\n                return true;\n            }\n\n            if ('post_category' === $key) {\n                return true;\n            }\n\n            if ('tags_input' === $key) {\n                return true;\n            }\n\n            return metadata_exists('post', $this->ID, $key);\n        }\n\n        /**\n         * Getter.\n         *\n         * @param string $key Key to get.\n         * @return mixed\n         * @since 3.5.0\n         *\n         */\n        public function __get($key)\n        {\n            if ('page_template' === $key && $this->__isset($key)) {\n                return get_post_meta($this->ID, '_wp_page_template', true);\n            }\n\n            if ('post_category' === $key) {\n                if (is_object_in_taxonomy($this->post_type, 'category')) {\n                    $terms = get_the_terms($this, 'category');\n                }\n\n                if (empty($terms)) {\n                    return array();\n                }\n\n                return wp_list_pluck($terms, 'term_id');\n            }\n\n            if ('tags_input' === $key) {\n                if (is_object_in_taxonomy($this->post_type, 'post_tag')) {\n                    $terms = get_the_terms($this, 'post_tag');\n                }\n\n                if (empty($terms)) {\n                    return array();\n                }\n\n                return wp_list_pluck($terms, 'name');\n            }\n\n            // Rest of the values need filtering.\n            if ('ancestors' === $key) {\n                $value = get_post_ancestors($this);\n            } else {\n                $value = get_post_meta($this->ID, $key, true);\n            }\n\n            if ($this->filter) {\n                $value = sanitize_post_field($key, $value, $this->ID, $this->filter);\n            }\n\n            return $value;\n        }\n\n        /**\n         * {@Missing Summary}\n         *\n         * @param string $filter Filter.\n         * @return WP_Post\n         * @since 3.5.0\n         *\n         */\n        public function filter($filter)\n        {\n            if ($this->filter === $filter) {\n                return $this;\n            }\n\n            if ('raw' === $filter) {\n                return self::get_instance($this->ID);\n            }\n\n            return sanitize_post($this, $filter);\n        }\n\n        /**\n         * Convert object to array.\n         *\n         * @return array Object as array.\n         * @since 3.5.0\n         *\n         */\n        public function to_array()\n        {\n            $post = get_object_vars($this);\n\n            foreach (array('ancestors', 'page_template', 'post_category', 'tags_input') as $key) {\n                if ($this->__isset($key)) {\n                    $post[$key] = $this->__get($key);\n                }\n            }\n\n            return $post;\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/class.wp_roles.php",
    "content": "<?php\n\nif (!class_exists('WP_Roles')) {\n\n    class WP_Roles\n    {\n        /**\n         * @var array[]\n         */\n        /**\n         * List of roles and capabilities.\n         *\n         * @since 2.0.0\n         * @var array[]\n         */\n        public $roles;\n\n        public function __construct($site_id = null)\n        {\n\n            $this->roles = [\n                'administrator' => [\n                    'name' => '管理员'\n                ],\n                'editor' => [\n                    'name' => '编辑'\n                ],\n                'contributor' => [\n                    'name' => '贡献者'\n                ],\n                'subscriber' => [\n                    'name' => '关注者'\n                ],\n                'visitor' => [\n                    'name' => '访问者'\n                ],\n            ];\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/class.wp_term_query.php",
    "content": "<?php\n\n/**\n * Taxonomy API: WP_Term_Query class.\n *\n * @package WordPress\n * @subpackage Taxonomy\n * @since 4.6.0\n */\n\nuse Typecho\\Db;\nuse Typecho\\Widget;\n\n/**\n * Class used for querying terms.\n *\n * @since 4.6.0\n *\n * @see WP_Term_Query::__construct() for accepted arguments.\n */\nif (!class_exists('WP_Term_Query')) {\n\n    class WP_Term_Query\n    {\n\n        /**\n         * SQL string used to perform database query.\n         *\n         * @since 4.6.0\n         * @var string\n         */\n        public $request;\n\n        /**\n         * Metadata query container.\n         *\n         * @since 4.6.0\n         * @var WP_Meta_Query A meta query instance.\n         */\n        public $meta_query = false;\n\n        /**\n         * Metadata query clauses.\n         *\n         * @since 4.6.0\n         * @var array\n         */\n        protected $meta_query_clauses;\n\n        /**\n         * SQL query clauses.\n         *\n         * @since 4.6.0\n         * @var array\n         */\n        protected $sql_clauses = array(\n            'select' => '',\n            'from' => '',\n            'where' => array(),\n            'orderby' => '',\n            'limits' => '',\n        );\n\n        /**\n         * Query vars set by the user.\n         *\n         * @since 4.6.0\n         * @var array\n         */\n        public $query_vars;\n\n        /**\n         * Default values for query vars.\n         *\n         * @since 4.6.0\n         * @var array\n         */\n        public $query_var_defaults;\n\n        /**\n         * List of terms located by the query.\n         *\n         * @since 4.6.0\n         * @var array\n         */\n        public $terms;\n\n        /**\n         * Constructor.\n         *\n         * Sets up the term query, based on the query vars passed.\n         *\n         * @param string|array $query {\n         *     Optional. Array or query string of term query parameters. Default empty.\n         *\n         * @type string|string[] $taxonomy Taxonomy name, or array of taxonomy names, to which results\n         *                                                   should be limited.\n         * @type int|int[] $object_ids Object ID, or array of object IDs. Results will be\n         *                                                   limited to terms associated with these objects.\n         * @type string $orderby Field(s) to order terms by. Accepts:\n         *                                                   - Term fields ('name', 'slug', 'term_group', 'term_id', 'id',\n         *                                                     'description', 'parent', 'term_order'). Unless `$object_ids`\n         *                                                     is not empty, 'term_order' is treated the same as 'term_id'.\n         *                                                   - 'count' to use the number of objects associated with the term.\n         *                                                   - 'include' to match the 'order' of the `$include` param.\n         *                                                   - 'slug__in' to match the 'order' of the `$slug` param.\n         *                                                   - 'meta_value'\n         *                                                   - 'meta_value_num'.\n         *                                                   - The value of `$meta_key`.\n         *                                                   - The array keys of `$meta_query`.\n         *                                                   - 'none' to omit the ORDER BY clause.\n         *                                                   Default 'name'.\n         * @type string $order Whether to order terms in ascending or descending order.\n         *                                                   Accepts 'ASC' (ascending) or 'DESC' (descending).\n         *                                                   Default 'ASC'.\n         * @type bool|int $hide_empty Whether to hide terms not assigned to any posts. Accepts\n         *                                                   1|true or 0|false. Default 1|true.\n         * @type int[]|string $include Array or comma/space-separated string of term IDs to include.\n         *                                                   Default empty array.\n         * @type int[]|string $exclude Array or comma/space-separated string of term IDs to exclude.\n         *                                                   If `$include` is non-empty, `$exclude` is ignored.\n         *                                                   Default empty array.\n         * @type int[]|string $exclude_tree Array or comma/space-separated string of term IDs to exclude\n         *                                                   along with all of their descendant terms. If `$include` is\n         *                                                   non-empty, `$exclude_tree` is ignored. Default empty array.\n         * @type int|string $number Maximum number of terms to return. Accepts ''|0 (all) or any\n         *                                                   positive number. Default ''|0 (all). Note that `$number` may\n         *                                                   not return accurate results when coupled with `$object_ids`.\n         *                                                   See #41796 for details.\n         * @type int $offset The number by which to offset the terms query. Default empty.\n         * @type string $fields Term fields to query for. Accepts:\n         *                                                   - 'all' Returns an array of complete term objects (`WP_Term[]`).\n         *                                                   - 'all_with_object_id' Returns an array of term objects\n         *                                                     with the 'object_id' param (`WP_Term[]`). Works only\n         *                                                     when the `$object_ids` parameter is populated.\n         *                                                   - 'ids' Returns an array of term IDs (`int[]`).\n         *                                                   - 'tt_ids' Returns an array of term taxonomy IDs (`int[]`).\n         *                                                   - 'names' Returns an array of term names (`string[]`).\n         *                                                   - 'slugs' Returns an array of term slugs (`string[]`).\n         *                                                   - 'count' Returns the number of matching terms (`int`).\n         *                                                   - 'id=>parent' Returns an associative array of parent term IDs,\n         *                                                      keyed by term ID (`int[]`).\n         *                                                   - 'id=>name' Returns an associative array of term names,\n         *                                                      keyed by term ID (`string[]`).\n         *                                                   - 'id=>slug' Returns an associative array of term slugs,\n         *                                                      keyed by term ID (`string[]`).\n         *                                                   Default 'all'.\n         * @type bool $count Whether to return a term count. If true, will take precedence\n         *                                                   over `$fields`. Default false.\n         * @type string|string[] $name Name or array of names to return term(s) for.\n         *                                                   Default empty.\n         * @type string|string[] $slug Slug or array of slugs to return term(s) for.\n         *                                                   Default empty.\n         * @type int|int[] $term_taxonomy_id Term taxonomy ID, or array of term taxonomy IDs,\n         *                                                   to match when querying terms.\n         * @type bool $hierarchical Whether to include terms that have non-empty descendants\n         *                                                   (even if `$hide_empty` is set to true). Default true.\n         * @type string $search Search criteria to match terms. Will be SQL-formatted with\n         *                                                   wildcards before and after. Default empty.\n         * @type string $name__like Retrieve terms with criteria by which a term is LIKE\n         *                                                   `$name__like`. Default empty.\n         * @type string $description__like Retrieve terms where the description is LIKE\n         *                                                   `$description__like`. Default empty.\n         * @type bool $pad_counts Whether to pad the quantity of a term's children in the\n         *                                                   quantity of each term's \"count\" object variable.\n         *                                                   Default false.\n         * @type string $get Whether to return terms regardless of ancestry or whether the\n         *                                                   terms are empty. Accepts 'all' or '' (disabled).\n         *                                                   Default ''.\n         * @type int $child_of Term ID to retrieve child terms of. If multiple taxonomies\n         *                                                   are passed, `$child_of` is ignored. Default 0.\n         * @type int $parent Parent term ID to retrieve direct-child terms of.\n         *                                                   Default empty.\n         * @type bool $childless True to limit results to terms that have no children.\n         *                                                   This parameter has no effect on non-hierarchical taxonomies.\n         *                                                   Default false.\n         * @type string $cache_domain Unique cache key to be produced when this query is stored in\n         *                                                   an object cache. Default 'core'.\n         * @type bool $update_term_meta_cache Whether to prime meta caches for matched terms. Default true.\n         * @type string|string[] $meta_key Meta key or keys to filter by.\n         * @type string|string[] $meta_value Meta value or values to filter by.\n         * @type string $meta_compare MySQL operator used for comparing the meta value.\n         *                                                   See WP_Meta_Query::__construct for accepted values and default value.\n         * @type string $meta_compare_key MySQL operator used for comparing the meta key.\n         *                                                   See WP_Meta_Query::__construct for accepted values and default value.\n         * @type string $meta_type MySQL data type that the meta_value column will be CAST to for comparisons.\n         *                                                   See WP_Meta_Query::__construct for accepted values and default value.\n         * @type string $meta_type_key MySQL data type that the meta_key column will be CAST to for comparisons.\n         *                                                   See WP_Meta_Query::__construct for accepted values and default value.\n         * @type array $meta_query An associative array of WP_Meta_Query arguments.\n         *                                                   See WP_Meta_Query::__construct for accepted values.\n         * }\n         * @since 4.6.0 Introduced 'term_taxonomy_id' parameter.\n         * @since 4.7.0 Introduced 'object_ids' parameter.\n         * @since 4.9.0 Added 'slug__in' support for 'orderby'.\n         * @since 5.1.0 Introduced the 'meta_compare_key' parameter.\n         * @since 5.3.0 Introduced the 'meta_type_key' parameter.\n         *\n         * @since 4.6.0\n         */\n        public function __construct($query = '')\n        {\n            $this->query_var_defaults = array(\n                'taxonomy' => null,\n                'object_ids' => null,\n                'orderby' => 'name',\n                'order' => 'ASC',\n                'hide_empty' => true,\n                'include' => array(),\n                'exclude' => array(),\n                'exclude_tree' => array(),\n                'number' => '',\n                'offset' => '',\n                'fields' => 'all',\n                'count' => false,\n                'name' => '',\n                'slug' => '',\n                'term_taxonomy_id' => '',\n                'hierarchical' => true,\n                'search' => '',\n                'name__like' => '',\n                'description__like' => '',\n                'pad_counts' => false,\n                'get' => '',\n                'child_of' => 0,\n                'parent' => '',\n                'childless' => false,\n                'cache_domain' => 'core',\n                'update_term_meta_cache' => true,\n                'meta_query' => '',\n                'meta_key' => '',\n                'meta_value' => '',\n                'meta_type' => '',\n                'meta_compare' => '',\n            );\n\n            if (!empty($query)) {\n                $this->query($query);\n            }\n        }\n\n        /**\n         * Parse arguments passed to the term query with default query parameters.\n         *\n         * @param string|array $query WP_Term_Query arguments. See WP_Term_Query::__construct()\n         * @since 4.6.0\n         *\n         */\n        public function parse_query($query = '')\n        {\n            if (empty($query)) {\n                $query = $this->query_vars;\n            }\n\n            $taxonomies = isset($query['taxonomy']) ? (array)$query['taxonomy'] : null;\n\n            /**\n             * Filters the terms query default arguments.\n             *\n             * Use {@see 'get_terms_args'} to filter the passed arguments.\n             *\n             * @param array $defaults An array of default get_terms() arguments.\n             * @param string[] $taxonomies An array of taxonomy names.\n             * @since 4.4.0\n             *\n             */\n            $this->query_var_defaults = apply_filters('get_terms_defaults', $this->query_var_defaults, $taxonomies);\n\n            $query = wp_parse_args($query, $this->query_var_defaults);\n\n            $query['number'] = absint($query['number']);\n            $query['offset'] = absint($query['offset']);\n\n            // 'parent' overrides 'child_of'.\n            if (0 < (int)$query['parent']) {\n                $query['child_of'] = false;\n            }\n\n            if ('all' === $query['get']) {\n                $query['childless'] = false;\n                $query['child_of'] = 0;\n                $query['hide_empty'] = 0;\n                $query['hierarchical'] = false;\n                $query['pad_counts'] = false;\n            }\n\n            $query['taxonomy'] = $taxonomies;\n\n            $this->query_vars = $query;\n\n            /**\n             * Fires after term query vars have been parsed.\n             *\n             * @param WP_Term_Query $query Current instance of WP_Term_Query.\n             * @since 4.6.0\n             *\n             */\n//        do_action( 'parse_term_query', $this );\n        }\n\n        /**\n         * Sets up the query and retrieves the results.\n         *\n         * The return type varies depending on the value passed to `$args['fields']`. See\n         * WP_Term_Query::get_terms() for details.\n         *\n         * @param string|array $query Array or URL query string of parameters.\n         * @return WP_Term[]|int[]|string[]|string Array of terms, or number of terms as numeric string\n         *                                         when 'count' is passed as a query var.\n         * @since 4.6.0\n         *\n         */\n        public function query($query)\n        {\n            $this->query_vars = wp_parse_args($query);\n            return $this->get_terms();\n        }\n\n        /**\n         * Retrieves the query results.\n         *\n         * The return type varies depending on the value passed to `$args['fields']`.\n         *\n         * The following will result in an array of `WP_Term` objects being returned:\n         *\n         *   - 'all'\n         *   - 'all_with_object_id'\n         *\n         * The following will result in a numeric string being returned:\n         *\n         *   - 'count'\n         *\n         * The following will result in an array of text strings being returned:\n         *\n         *   - 'id=>name'\n         *   - 'id=>slug'\n         *   - 'names'\n         *   - 'slugs'\n         *\n         * The following will result in an array of numeric strings being returned:\n         *\n         *   - 'id=>parent'\n         *\n         * The following will result in an array of integers being returned:\n         *\n         *   - 'ids'\n         *   - 'tt_ids'\n         *\n         * @return WP_Term[]|int[]|string[]|string Array of terms, or number of terms as numeric string\n         *                                         when 'count' is passed as a query var.\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         * @since 4.6.0\n         *\n         */\n        public function get_terms()\n        {\n            $wpdb = Db::get();\n\n            $this->parse_query($this->query_vars);\n            $args = &$this->query_vars;\n\n            // Set up meta_query so it's available to 'pre_get_terms'.\n            $this->meta_query = new WP_Meta_Query();\n            $this->meta_query->parse_query_vars($args);\n\n\n            $taxonomies = (array)$args['taxonomy'];\n\n//        // Save queries by not crawling the tree in the case of multiple taxes or a flat tax.\n//        $has_hierarchical_tax = false;\n//        if ( $taxonomies ) {\n//            foreach ( $taxonomies as $_tax ) {\n//                if ( is_taxonomy_hierarchical( $_tax ) ) {\n//                    $has_hierarchical_tax = true;\n//                }\n//            }\n//        } else {\n//            // When no taxonomies are provided, assume we have to descend the tree.\n//            $has_hierarchical_tax = true;\n//        }\n\n//        if ( ! $has_hierarchical_tax ) {\n//            $args['hierarchical'] = false;\n//            $args['pad_counts']   = false;\n//        }\n\n            // 'parent' overrides 'child_of'.\n            if (0 < (int)$args['parent']) {\n                $args['child_of'] = false;\n            }\n\n            if ('all' === $args['get']) {\n                $args['childless'] = false;\n                $args['child_of'] = 0;\n                $args['hide_empty'] = 0;\n                $args['hierarchical'] = false;\n                $args['pad_counts'] = false;\n            }\n\n            /**\n             * Filters the terms query arguments.\n             *\n             * @param array $args An array of get_terms() arguments.\n             * @param string[] $taxonomies An array of taxonomy names.\n             * @since 3.1.0\n             *\n             */\n            $args = apply_filters('get_terms_args', $args, $taxonomies);\n\n            // Avoid the query if the queried parent/child_of term has no descendants.\n            $child_of = $args['child_of'];\n            $parent = $args['parent'];\n\n            if ($child_of) {\n                $_parent = $child_of;\n            } elseif ($parent) {\n                $_parent = $parent;\n            } else {\n                $_parent = false;\n            }\n\n            if ($_parent) {\n                $in_hierarchy = false;\n                foreach ($taxonomies as $_tax) {\n                    $hierarchy = _get_term_hierarchy($_tax);\n\n                    if (isset($hierarchy[$_parent])) {\n                        $in_hierarchy = true;\n                    }\n                }\n\n                if (!$in_hierarchy) {\n                    if ('count' === $args['fields']) {\n                        return 0;\n                    } else {\n                        $this->terms = array();\n                        return $this->terms;\n                    }\n                }\n            }\n\n            // 'term_order' is a legal sort order only when joining the relationship table.\n            $_orderby = $this->query_vars['orderby'];\n            if ('term_order' === $_orderby && empty($this->query_vars['object_ids'])) {\n                $_orderby = 'term_id';\n            }\n\n            $orderby = $this->parse_orderby($_orderby);\n\n            if ($orderby) {\n                $orderby = \"ORDER BY $orderby\";\n            }\n\n            $order = $this->parse_order($this->query_vars['order']);\n\n            if ($taxonomies) {\n                $this->sql_clauses['where']['taxonomy'] = \"t.type IN ('\" . implode(\"', '\", array_map('esc_sql', $taxonomies)) . \"')\";\n            }\n\n            $exclude = $args['exclude'];\n            $exclude_tree = $args['exclude_tree'];\n            $include = $args['include'];\n\n            $inclusions = '';\n            if (!empty($include)) {\n                $exclude = '';\n                $exclude_tree = '';\n                $inclusions = implode(',', wp_parse_id_list($include));\n            }\n\n            if (!empty($inclusions)) {\n                $this->sql_clauses['where']['inclusions'] = 't.term_id IN ( ' . $inclusions . ' )';\n            }\n\n            $exclusions = array();\n            if (!empty($exclude_tree)) {\n                $exclude_tree = wp_parse_id_list($exclude_tree);\n                $excluded_children = $exclude_tree;\n                foreach ($exclude_tree as $extrunk) {\n                    $excluded_children = array_merge(\n                        $excluded_children,\n                        (array)get_terms(\n                            array(\n                                'taxonomy' => reset($taxonomies),\n                                'child_of' => (int)$extrunk,\n                                'fields' => 'ids',\n                                'hide_empty' => 0,\n                            )\n                        )\n                    );\n                }\n                $exclusions = array_merge($excluded_children, $exclusions);\n            }\n\n            if (!empty($exclude)) {\n                $exclusions = array_merge(wp_parse_id_list($exclude), $exclusions);\n            }\n\n            // 'childless' terms are those without an entry in the flattened term hierarchy.\n            $childless = (bool)$args['childless'];\n            if ($childless) {\n                foreach ($taxonomies as $_tax) {\n                    $term_hierarchy = _get_term_hierarchy($_tax);\n                    $exclusions = array_merge(array_keys($term_hierarchy), $exclusions);\n                }\n            }\n\n            if (!empty($exclusions)) {\n                $exclusions = 't.term_id NOT IN (' . implode(',', array_map('intval', $exclusions)) . ')';\n            } else {\n                $exclusions = '';\n            }\n\n            /**\n             * Filters the terms to exclude from the terms query.\n             *\n             * @param string $exclusions `NOT IN` clause of the terms query.\n             * @param array $args An array of terms query arguments.\n             * @param string[] $taxonomies An array of taxonomy names.\n             * @since 2.3.0\n             *\n             */\n            $exclusions = apply_filters('list_terms_exclusions', $exclusions, $args, $taxonomies);\n\n            if (!empty($exclusions)) {\n                // Must do string manipulation here for backward compatibility with filter.\n                $this->sql_clauses['where']['exclusions'] = preg_replace('/^\\s*AND\\s*/', '', $exclusions);\n            }\n\n            if (\n                (!empty($args['name'])) ||\n                (is_string($args['name']) && 0 !== strlen($args['name']))\n            ) {\n                $names = (array)$args['name'];\n                foreach ($names as &$_name) {\n                    // `sanitize_term_field()` returns slashed data.\n                    $_name = stripslashes(sanitize_term_field('name', $_name, 0, reset($taxonomies), 'db'));\n                }\n\n                $this->sql_clauses['where']['name'] = \"t.name IN ('\" . implode(\"', '\", array_map('esc_sql', $names)) . \"')\";\n            }\n\n            if (\n                (!empty($args['slug'])) ||\n                (is_string($args['slug']) && 0 !== strlen($args['slug']))\n            ) {\n                if (is_array($args['slug'])) {\n                    $slug = array_map('sanitize_title', $args['slug']);\n                    $this->sql_clauses['where']['slug'] = \"t.slug IN ('\" . implode(\"', '\", $slug) . \"')\";\n                } else {\n                    $slug = sanitize_title($args['slug']);\n                    $this->sql_clauses['where']['slug'] = \"t.slug = '$slug'\";\n                }\n            }\n\n            if (!empty($args['term_taxonomy_id'])) {\n                if (is_array($args['term_taxonomy_id'])) {\n                    $tt_ids = implode(',', array_map('intval', $args['term_taxonomy_id']));\n                    $this->sql_clauses['where']['term_taxonomy_id'] = \"tt.term_taxonomy_id IN ({$tt_ids})\";\n                } else {\n                    $this->sql_clauses['where']['term_taxonomy_id'] = $wpdb->prepare('tt.term_taxonomy_id = %d', $args['term_taxonomy_id']);\n                }\n            }\n\n            if (!empty($args['name__like'])) {\n                $this->sql_clauses['where']['name__like'] = $wpdb->prepare('t.name LIKE %s', '%' . $wpdb->esc_like($args['name__like']) . '%');\n            }\n\n            if (!empty($args['description__like'])) {\n                $this->sql_clauses['where']['description__like'] = $wpdb->prepare('tt.description LIKE %s', '%' . $wpdb->esc_like($args['description__like']) . '%');\n            }\n\n            if (!empty($args['object_ids'])) {\n                $object_ids = $args['object_ids'];\n                if (!is_array($object_ids)) {\n                    $object_ids = array($object_ids);\n                }\n\n                $object_ids = implode(', ', array_map('intval', $object_ids));\n                $this->sql_clauses['where']['object_ids'] = \"tr.object_id IN ($object_ids)\";\n            }\n\n            /*\n             * When querying for object relationships, the 'count > 0' check\n             * added by 'hide_empty' is superfluous.\n             */\n            if (!empty($args['object_ids'])) {\n                $args['hide_empty'] = false;\n            }\n\n            if ('' !== $parent) {\n                $parent = (int)$parent;\n                $this->sql_clauses['where']['parent'] = \"tt.parent = '$parent'\";\n            }\n\n            $hierarchical = $args['hierarchical'];\n            if ('count' === $args['fields']) {\n                $hierarchical = false;\n            }\n            if ($args['hide_empty'] && !$hierarchical) {\n                $this->sql_clauses['where']['count'] = 'tt.count > 0';\n            }\n\n            $number = $args['number'];\n            $offset = $args['offset'];\n\n            // Don't limit the query results when we have to descend the family tree.\n            if ($number && !$hierarchical && !$child_of && '' === $parent) {\n                if ($offset) {\n                    $limits = 'LIMIT ' . $offset . ',' . $number;\n                } else {\n                    $limits = 'LIMIT ' . $number;\n                }\n            } else {\n                $limits = '';\n            }\n\n            if (!empty($args['search'])) {\n                $this->sql_clauses['where']['search'] = $this->get_search_sql($args['search']);\n            }\n\n            // Meta query support.\n            $join = '';\n            $distinct = '';\n\n            // Reparse meta_query query_vars, in case they were modified in a 'pre_get_terms' callback.\n            $this->meta_query->parse_query_vars($this->query_vars);\n//        $mq_sql       = $this->meta_query->get_sql( 'term', 't', 'term_id' );\n//        $meta_clauses = $this->meta_query->get_clauses();\n//\n//        if ( ! empty( $meta_clauses ) ) {\n//            $join                                    .= $mq_sql['join'];\n//            $this->sql_clauses['where']['meta_query'] = preg_replace( '/^\\s*AND\\s*/', '', $mq_sql['where'] );\n//            $distinct                                .= 'DISTINCT';\n//\n//        }\n\n            $selects = array();\n            switch ($args['fields']) {\n                case 'all':\n                case 'all_with_object_id':\n                case 'tt_ids':\n                case 'slugs':\n                    $selects = array('t.*'); // tt.*\n                    if ('all_with_object_id' === $args['fields'] && !empty($args['object_ids'])) {\n                        $selects[] = 'tr.object_id';\n                    }\n                    break;\n                case 'ids':\n                case 'id=>parent':\n                    $selects = array('t.term_id', 'tt.parent', 'tt.count', 'tt.type');\n                    break;\n                case 'names':\n                    $selects = array('t.term_id', 'tt.parent', 'tt.count', 't.name', 'tt.type');\n                    break;\n                case 'count':\n                    $orderby = '';\n                    $order = '';\n                    $selects = array('COUNT(*)');\n                    break;\n                case 'id=>name':\n                    $selects = array('t.term_id', 't.name', 'tt.parent', 'tt.count', 'tt.type');\n                    break;\n                case 'id=>slug':\n                    $selects = array('t.term_id', 't.slug', 'tt.parent', 'tt.count', 'tt.type');\n                    break;\n            }\n\n            $_fields = $args['fields'];\n\n            /**\n             * Filters the fields to select in the terms query.\n             *\n             * Field lists modified using this filter will only modify the term fields returned\n             * by the function when the `$fields` parameter set to 'count' or 'all'. In all other\n             * cases, the term fields in the results array will be determined by the `$fields`\n             * parameter alone.\n             *\n             * Use of this filter can result in unpredictable behavior, and is not recommended.\n             *\n             * @param string[] $selects An array of fields to select for the terms query.\n             * @param array $args An array of term query arguments.\n             * @param string[] $taxonomies An array of taxonomy names.\n             * @since 2.8.0\n             *\n             */\n            $fields = implode(', ', apply_filters('get_terms_fields', $selects, $args, $taxonomies));\n\n            // typecho don't need join term_taxonomy\n//        $join .= \" INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id\";\n//\n//        if ( ! empty( $this->query_vars['object_ids'] ) ) {\n//            $join .= \" INNER JOIN {$wpdb->term_relationships} AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id\";\n//        }\n\n            $where = implode(' AND ', $this->sql_clauses['where']);\n\n            /**\n             * Filters the terms query SQL clauses.\n             *\n             * @param string[] $pieces Array of query SQL clauses.\n             * @param string[] $taxonomies An array of taxonomy names.\n             * @param array $args An array of term query arguments.\n             * @since 3.1.0\n             *\n             */\n            $clauses = apply_filters('terms_clauses', compact('fields', 'join', 'where', 'distinct', 'orderby', 'order', 'limits'), $taxonomies, $args);\n\n            $fields = isset($clauses['fields']) ? $clauses['fields'] : '';\n            $join = isset($clauses['join']) ? $clauses['join'] : '';\n            $where = isset($clauses['where']) ? $clauses['where'] : '';\n            $distinct = isset($clauses['distinct']) ? $clauses['distinct'] : '';\n            $orderby = isset($clauses['orderby']) ? $clauses['orderby'] : '';\n            $order = isset($clauses['order']) ? $clauses['order'] : '';\n            $limits = isset($clauses['limits']) ? $clauses['limits'] : '';\n\n            if ($where) {\n                $where = \"WHERE $where\";\n            }\n            $table__ = $wpdb->getPrefix() . 'metas';\n            $this->sql_clauses['select'] = \"SELECT $distinct $fields\";\n            $this->sql_clauses['from'] = \"FROM $table__ AS t $join\";\n            $this->sql_clauses['orderby'] = $orderby ? \"$orderby $order\" : '';\n            $this->sql_clauses['limits'] = $limits;\n\n            $this->request = \"{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}\";\n\n            $this->terms = null;\n\n            if (null !== $this->terms) {\n                return $this->terms;\n            }\n\n            // $args can be anything. Only use the args defined in defaults to compute the key.\n            $key = md5(serialize(wp_array_slice_assoc($args, array_keys($this->query_var_defaults))) . $this->request);\n            $last_changed = wp_cache_get_last_changed('terms');\n            $cache_key = \"get_terms:$key:$last_changed\";\n            $cache = wp_cache_get($cache_key, 'terms');\n\n            if (false !== $cache) {\n//            if ('all' === $_fields || 'all_with_object_id' === $_fields) {\n//                $cache = $this->populate_terms($cache);\n//            }\n\n                $this->terms = $cache;\n                return $this->terms;\n            }\n\n            if ('count' === $_fields) {\n                $count = $wpdb->fetchRow($this->request)['count'];\n                wp_cache_set($cache_key, $count, 'terms');\n                return $count;\n            }\n\n            $terms_ = $wpdb->fetchAll($this->request);\n            $terms = [];\n            foreach ($terms_ as $cat) {\n                $tmpcat = (object)$cat;\n                $terms [] = $tmpcat;\n            }\n\n            if ('all' === $_fields || 'all_with_object_id' === $_fields) {\n                update_term_cache($terms);\n            }\n\n            // Prime termmeta cache.\n//        if ( $args['update_term_meta_cache'] ) {\n//            // todo: many term id\n////            $term_ids = wp_list_pluck( $terms, 'term_id' );\n////            update_termmeta_cache( $term_ids );\n//        }\n\n            if (empty($terms)) {\n                wp_cache_add($cache_key, array(), 'terms', DAY_IN_SECONDS);\n                return array();\n            }\n\n\n            /*\n             * When querying for terms connected to objects, we may get\n             * duplicate results. The duplicates should be preserved if\n             * `$fields` is 'all_with_object_id', but should otherwise be\n             * removed.\n             */\n            if (!empty($args['object_ids']) && 'all_with_object_id' !== $_fields) {\n                $_tt_ids = array();\n                $_terms = array();\n                foreach ($terms as $term) {\n                    if (isset($_tt_ids[$term->term_id])) {\n                        continue;\n                    }\n\n                    $_tt_ids[$term->term_id] = 1;\n                    $_terms[] = $term;\n                }\n\n                $terms = $_terms;\n            }\n\n            $_terms = array();\n            if ('id=>parent' === $_fields) {\n                foreach ($terms as $term) {\n                    $_terms[$term->term_id] = $term->parent;\n                }\n            } elseif ('ids' === $_fields) {\n                foreach ($terms as $term) {\n                    $_terms[] = (int)$term->term_id;\n                }\n            } elseif ('tt_ids' === $_fields) {\n                foreach ($terms as $term) {\n                    $_terms[] = (int)$term->term_taxonomy_id;\n                }\n            } elseif ('names' === $_fields) {\n                foreach ($terms as $term) {\n                    $_terms[] = $term->name;\n                }\n            } elseif ('slugs' === $_fields) {\n                foreach ($terms as $term) {\n                    $_terms[] = $term->slug;\n                }\n            } elseif ('id=>name' === $_fields) {\n                foreach ($terms as $term) {\n                    $_terms[$term->term_id] = $term->name;\n                }\n            } elseif ('id=>slug' === $_fields) {\n                foreach ($terms as $term) {\n                    $_terms[$term->term_id] = $term->slug;\n                }\n            }\n\n            if (!empty($_terms)) {\n                $terms = $_terms;\n            }\n\n            // Hierarchical queries are not limited, so 'offset' and 'number' must be handled now.\n            if ($hierarchical && $number && is_array($terms)) {\n                if ($offset >= count($terms)) {\n                    $terms = array();\n                } else {\n                    $terms = array_slice($terms, $offset, $number, true);\n                }\n            }\n\n            wp_cache_add($cache_key, $terms, 'terms', DAY_IN_SECONDS);\n\n//        if ('all' === $_fields || 'all_with_object_id' === $_fields) {\n//            $terms = $this->populate_terms($terms);\n//        }\n\n            $this->terms = $terms;\n            return $this->terms;\n        }\n\n        /**\n         * Parse and sanitize 'orderby' keys passed to the term query.\n         *\n         * @param string $orderby_raw Alias for the field to order by.\n         * @return string|false Value to used in the ORDER clause. False otherwise.\n         * @since 4.6.0\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         */\n        protected function parse_orderby($orderby_raw)\n        {\n            $_orderby = strtolower($orderby_raw);\n            $maybe_orderby_meta = false;\n\n            if (in_array($_orderby, array('term_id', 'name', 'slug', 'term_group'), true)) {\n                $orderby = \"t.$_orderby\";\n            } elseif (in_array($_orderby, array('count', 'parent', 'taxonomy', 'term_taxonomy_id', 'description'), true)) {\n                $orderby = \"tt.$_orderby\";\n            } elseif ('term_order' === $_orderby) {\n                $orderby = 'tr.term_order';\n            } elseif ('include' === $_orderby && !empty($this->query_vars['include'])) {\n                $include = implode(',', wp_parse_id_list($this->query_vars['include']));\n                $orderby = \"FIELD( t.term_id, $include )\";\n            } elseif ('slug__in' === $_orderby && !empty($this->query_vars['slug']) && is_array($this->query_vars['slug'])) {\n                $slugs = implode(\"', '\", array_map('sanitize_title_for_query', $this->query_vars['slug']));\n                $orderby = \"FIELD( t.slug, '\" . $slugs . \"')\";\n            } elseif ('none' === $_orderby) {\n                $orderby = '';\n            } elseif (empty($_orderby) || 'id' === $_orderby || 'term_id' === $_orderby) {\n                $orderby = 't.term_id';\n            } else {\n                $orderby = 't.name';\n\n                // This may be a value of orderby related to meta.\n                $maybe_orderby_meta = true;\n            }\n\n            /**\n             * Filters the ORDERBY clause of the terms query.\n             *\n             * @param string $orderby `ORDERBY` clause of the terms query.\n             * @param array $args An array of term query arguments.\n             * @param string[] $taxonomies An array of taxonomy names.\n             * @since 2.8.0\n             *\n             */\n            $orderby = apply_filters('get_terms_orderby', $orderby, $this->query_vars, $this->query_vars['taxonomy']);\n\n            // Run after the 'get_terms_orderby' filter for backward compatibility.\n            if ($maybe_orderby_meta) {\n                $maybe_orderby_meta = $this->parse_orderby_meta($_orderby);\n                if ($maybe_orderby_meta) {\n                    $orderby = $maybe_orderby_meta;\n                }\n            }\n\n            return $orderby;\n        }\n\n        /**\n         * Generate the ORDER BY clause for an 'orderby' param that is potentially related to a meta query.\n         *\n         * @param string $orderby_raw Raw 'orderby' value passed to WP_Term_Query.\n         * @return string ORDER BY clause.\n         * @since 4.6.0\n         *\n         */\n        protected function parse_orderby_meta($orderby_raw)\n        {\n            $orderby = '';\n\n            // Tell the meta query to generate its SQL, so we have access to table aliases.\n            $this->meta_query->get_sql('term', 't', 'term_id');\n            $meta_clauses = $this->meta_query->get_clauses();\n            if (!$meta_clauses || !$orderby_raw) {\n                return $orderby;\n            }\n\n            $allowed_keys = array();\n            $primary_meta_key = null;\n            $primary_meta_query = reset($meta_clauses);\n            if (!empty($primary_meta_query['key'])) {\n                $primary_meta_key = $primary_meta_query['key'];\n                $allowed_keys[] = $primary_meta_key;\n            }\n            $allowed_keys[] = 'meta_value';\n            $allowed_keys[] = 'meta_value_num';\n            $allowed_keys = array_merge($allowed_keys, array_keys($meta_clauses));\n\n            if (!in_array($orderby_raw, $allowed_keys, true)) {\n                return $orderby;\n            }\n\n            switch ($orderby_raw) {\n                case $primary_meta_key:\n                case 'meta_value':\n                    if (!empty($primary_meta_query['type'])) {\n                        $orderby = \"CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})\";\n                    } else {\n                        $orderby = \"{$primary_meta_query['alias']}.meta_value\";\n                    }\n                    break;\n\n                case 'meta_value_num':\n                    $orderby = \"{$primary_meta_query['alias']}.meta_value+0\";\n                    break;\n\n                default:\n                    if (array_key_exists($orderby_raw, $meta_clauses)) {\n                        // $orderby corresponds to a meta_query clause.\n                        $meta_clause = $meta_clauses[$orderby_raw];\n                        $orderby = \"CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})\";\n                    }\n                    break;\n            }\n\n            return $orderby;\n        }\n\n        /**\n         * Parse an 'order' query variable and cast it to ASC or DESC as necessary.\n         *\n         * @param string $order The 'order' query variable.\n         * @return string The sanitized 'order' query variable.\n         * @since 4.6.0\n         *\n         */\n        protected function parse_order($order)\n        {\n            if (!is_string($order) || empty($order)) {\n                return 'DESC';\n            }\n\n            if ('ASC' === strtoupper($order)) {\n                return 'ASC';\n            } else {\n                return 'DESC';\n            }\n        }\n\n        /**\n         * Used internally to generate a SQL string related to the 'search' parameter.\n         *\n         * @param string $string\n         * @return string\n         * @since 4.6.0\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         */\n        protected function get_search_sql($string)\n        {\n            global $wpdb;\n\n            $like = '%' . esc_like($string) . '%';\n\n            return sprintf(\"((t.name LIKE '%s') OR (t.slug LIKE '%s'))\", $like, $like);\n        }\n\n        /**\n         * Creates an array of term objects from an array of term IDs.\n         *\n         * Also discards invalid term objects.\n         *\n         * @param array $term_ids Term IDs.\n         * @return array\n         * @since 4.9.8\n         *\n         */\n        protected function populate_terms($term_ids)\n        {\n            $terms = array();\n\n            if (!is_array($term_ids)) {\n                return $terms;\n            }\n\n            foreach ($term_ids as $key => $term_id) {\n                $term = get_term($term_id);\n                if ($term instanceof WP_Term) {\n                    $terms[$key] = $term;\n                }\n            }\n\n            return $terms;\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/class.wp_user_query.php",
    "content": "<?php\n/**\n * User API: WP_User_Query class\n *\n * @package WordPress\n * @subpackage Users\n * @since 4.4.0\n */\n\nuse Typecho\\Db;\n\n/**\n * Core class used for querying users.\n *\n * @since 3.1.0\n *\n * @see WP_User_Query::prepare_query() for information on accepted arguments.\n */\nif (!class_exists('WP_User_Query')) {\n\n    class WP_User_Query\n    {\n\n        /**\n         * Query vars, after parsing\n         *\n         * @since 3.5.0\n         * @var array\n         */\n        public $query_vars = array();\n\n        /**\n         * List of found user IDs.\n         *\n         * @since 3.1.0\n         * @var array\n         */\n        private $results;\n\n        /**\n         * Total number of found users for the current query\n         *\n         * @since 3.1.0\n         * @var int\n         */\n        private $total_users = 0;\n\n        /**\n         * Metadata query container.\n         *\n         * @since 4.2.0\n         * @var WP_Meta_Query\n         */\n        public $meta_query = false;\n\n        /**\n         * The SQL query used to fetch matching users.\n         *\n         * @since 4.4.0\n         * @var string\n         */\n        public $request;\n\n        private $compat_fields = array('results', 'total_users');\n\n        // SQL clauses.\n        public $query_fields;\n        public $query_from;\n        public $query_where;\n        public $query_orderby;\n        public $query_limit;\n\n        /**\n         * PHP5 constructor.\n         *\n         * @param null|string|array $query Optional. The query variables.\n         * @since 3.1.0\n         *\n         */\n        public function __construct($query = null)\n        {\n            if (!empty($query)) {\n                $this->prepare_query($query);\n                $this->query();\n            }\n        }\n\n        /**\n         * Fills in missing query variables with default values.\n         *\n         * @param array $args Query vars, as passed to `WP_User_Query`.\n         * @return array Complete query variables with undefined ones filled in with defaults.\n         * @since 4.4.0\n         *\n         */\n        public static function fill_query_vars($args)\n        {\n            $defaults = array(\n                'blog_id' => get_current_blog_id(),\n                'role' => '',\n                'role__in' => array(),\n                'role__not_in' => array(),\n                'capability' => '',\n                'capability__in' => array(),\n                'capability__not_in' => array(),\n                'meta_key' => '',\n                'meta_value' => '',\n                'meta_compare' => '',\n                'include' => array(),\n                'exclude' => array(),\n                'search' => '',\n                'search_columns' => array(),\n                'orderby' => 'login',\n                'order' => 'ASC',\n                'offset' => '',\n                'number' => '',\n                'paged' => 1,\n                'count_total' => true,\n                'fields' => 'all',\n                'who' => '',\n                'has_published_posts' => null,\n                'nicename' => '',\n                'nicename__in' => array(),\n                'nicename__not_in' => array(),\n                'login' => '',\n                'login__in' => array(),\n                'login__not_in' => array(),\n            );\n\n            return wp_parse_args($args, $defaults);\n        }\n\n        /**\n         * Prepare the query variables.\n         *\n         * @param string|array $query {\n         *     Optional. Array or string of Query parameters.\n         *\n         * @type int $blog_id The site ID. Default is the current site.\n         * @type string|string[] $role An array or a comma-separated list of role names that users must match\n         *                                                to be included in results. Note that this is an inclusive list: users\n         *                                                must match *each* role. Default empty.\n         * @type string[] $role__in An array of role names. Matched users must have at least one of these\n         *                                                roles. Default empty array.\n         * @type string[] $role__not_in An array of role names to exclude. Users matching one or more of these\n         *                                                roles will not be included in results. Default empty array.\n         * @type string|string[] $meta_key Meta key or keys to filter by.\n         * @type string|string[] $meta_value Meta value or values to filter by.\n         * @type string $meta_compare MySQL operator used for comparing the meta value.\n         *                                                See WP_Meta_Query::__construct for accepted values and default value.\n         * @type string $meta_compare_key MySQL operator used for comparing the meta key.\n         *                                                See WP_Meta_Query::__construct for accepted values and default value.\n         * @type string $meta_type MySQL data type that the meta_value column will be CAST to for comparisons.\n         *                                                See WP_Meta_Query::__construct for accepted values and default value.\n         * @type string $meta_type_key MySQL data type that the meta_key column will be CAST to for comparisons.\n         *                                                See WP_Meta_Query::__construct for accepted values and default value.\n         * @type array $meta_query An associative array of WP_Meta_Query arguments.\n         *                                                See WP_Meta_Query::__construct for accepted values.\n         * @type string $capability An array or a comma-separated list of capability names that users must match\n         *                                                to be included in results. Note that this is an inclusive list: users\n         *                                                must match *each* capability.\n         *                                                Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.\n         *                                                Default empty.\n         * @type string[] $capability__in An array of capability names. Matched users must have at least one of these\n         *                                                capabilities.\n         *                                                Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.\n         *                                                Default empty array.\n         * @type string[] $capability__not_in An array of capability names to exclude. Users matching one or more of these\n         *                                                capabilities will not be included in results.\n         *                                                Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.\n         *                                                Default empty array.\n         * @type int[] $include An array of user IDs to include. Default empty array.\n         * @type int[] $exclude An array of user IDs to exclude. Default empty array.\n         * @type string $search Search keyword. Searches for possible string matches on columns.\n         *                                                When `$search_columns` is left empty, it tries to determine which\n         *                                                column to search in based on search string. Default empty.\n         * @type string[] $search_columns Array of column names to be searched. Accepts 'ID',\n         *                                                'mail', 'url', 'name', 'display_name'.\n         *                                                Default empty array.\n         * @type string|array $orderby Field(s) to sort the retrieved users by. May be a single value,\n         *                                                an array of values, or a multi-dimensional array with fields as\n         *                                                keys and orders ('ASC' or 'DESC') as values. Accepted values are:\n         *                                                - 'ID'\n         *                                                - 'display_name' (or 'name')\n         *                                                - 'include'\n         *                                                - 'login__in'\n         *                                                - 'name' (or 'nicename'),\n         *                                                - 'nicename__in'\n         *                                                - 'mail (or 'email')\n         *                                                - 'url' (or 'url'),\n         *                                                - 'user_registered' (or 'registered')\n         *                                                - 'post_count'\n         *                                                - 'meta_value',\n         *                                                - 'meta_value_num'\n         *                                                - The value of `$meta_key`\n         *                                                - An array key of `$meta_query`\n         *                                                To use 'meta_value' or 'meta_value_num', `$meta_key`\n         * @type string $order Designates ascending or descending order of users. Order values\n         *                                                passed as part of an `$orderby` array take precedence over this\n         *                                                parameter. Accepts 'ASC', 'DESC'. Default 'ASC'.\n         * @type int $offset Number of users to offset in retrieved results. Can be used in\n         *                                                conjunction with pagination. Default 0.\n         * @type int $number Number of users to limit the query for. Can be used in\n         *                                                conjunction with pagination. Value -1 (all) is supported, but\n         *                                                should be used with caution on larger sites.\n         *                                                Default -1 (all users).\n         * @type int $paged When used with number, defines the page of results to return.\n         *                                                Default 1.\n         * @type bool $count_total Whether to count the total number of users found. If pagination\n         *                                                is not needed, setting this to false can improve performance.\n         *                                                Default true.\n         * @type string|string[] $fields Which fields to return. Single or all fields (string), or array\n         *                                                of fields. Accepts:\n         *                                                - 'ID'\n         *                                                - 'display_name'\n         *                                                - 'name'\n         *                                                - 'mail'\n         *                                                - 'url'\n         *                                                - 'user_registered'\n         *                                                - 'all' for all fields\n         *                                                - 'all_with_meta' to include meta fields.\n         *                                                Default 'all'.\n         * @type string $who Type of users to query. Accepts 'authors'.\n         *                                                Default empty (all users).\n         * @type bool|string[] $has_published_posts Pass an array of post types to filter results to users who have\n         *                                                published posts in those post types. `true` is an alias for all\n         *                                                public post types.\n         * @type string $nicename The user nicename. Default empty.\n         * @type string[] $nicename__in An array of nicenames to include. Users matching one of these\n         *                                                nicenames will be included in results. Default empty array.\n         * @type string[] $nicename__not_in An array of nicenames to exclude. Users matching one of these\n         *                                                nicenames will not be included in results. Default empty array.\n         * @type string $login The user login. Default empty.\n         * @type string[] $login__in An array of logins to include. Users matching one of these\n         *                                                logins will be included in results. Default empty array.\n         * @type string[] $login__not_in An array of logins to exclude. Users matching one of these\n         *                                                logins will not be included in results. Default empty array.\n         * }\n         * @since 3.1.0\n         * @since 4.1.0 Added the ability to order by the `include` value.\n         * @since 4.2.0 Added 'meta_value_num' support for `$orderby` parameter. Added multi-dimensional array syntax\n         *              for `$orderby` parameter.\n         * @since 4.3.0 Added 'has_published_posts' parameter.\n         * @since 4.4.0 Added 'paged', 'role__in', and 'role__not_in' parameters. The 'role' parameter was updated to\n         *              permit an array or comma-separated list of values. The 'number' parameter was updated to support\n         *              querying for all users with using -1.\n         * @since 4.7.0 Added 'nicename', 'nicename__in', 'nicename__not_in', 'login', 'login__in',\n         *              and 'login__not_in' parameters.\n         * @since 5.1.0 Introduced the 'meta_compare_key' parameter.\n         * @since 5.3.0 Introduced the 'meta_type_key' parameter.\n         * @since 5.9.0 Added 'capability', 'capability__in', and 'capability__not_in' parameters.\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         * @global int $blog_id\n         *\n         */\n        public function prepare_query($query = array())\n        {\n            $wpdb = Db::get();\n\n            if (empty($this->query_vars) || !empty($query)) {\n                $this->query_limit = null;\n                $this->query_vars = $this->fill_query_vars($query);\n            }\n\n            /**\n             * Fires before the WP_User_Query has been parsed.\n             *\n             * The passed WP_User_Query object contains the query variables,\n             * not yet passed into SQL.\n             *\n             * @param WP_User_Query $query Current instance of WP_User_Query (passed by reference).\n             * @since 4.0.0\n             *\n             */\n//        do_action_ref_array( 'pre_get_users', array( &$this ) );\n\n            // Ensure that query vars are filled after 'pre_get_users'.\n            $qv =& $this->query_vars;\n            $qv = $this->fill_query_vars($qv);\n            $user_table = $wpdb->getPrefix() . 'users';\n            if (is_array($qv['fields'])) {\n                $qv['fields'] = array_unique($qv['fields']);\n\n                $this->query_fields = array();\n                foreach ($qv['fields'] as $field) {\n                    $field = 'uid' === $field ? 'uid' : sanitize_key($field);\n                    $this->query_fields[] = \"$user_table.$field\";\n                }\n                $this->query_fields = implode(',', $this->query_fields);\n            } elseif ('all' === $qv['fields']) {\n                $this->query_fields = \"$user_table.*\";\n            } else {\n                $this->query_fields = \"$user_table.uid\";\n            }\n\n            if (isset($qv['count_total']) && $qv['count_total']) {\n                $this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields;\n            }\n\n            $this->query_from = \"FROM $user_table\";\n            $this->query_where = 'WHERE 1=1';\n\n            // Parse and sanitize 'include', for use by 'orderby' as well as 'include' below.\n            if (!empty($qv['include'])) {\n                $include = wp_parse_id_list($qv['include']);\n            } else {\n                $include = false;\n            }\n\n            $blog_id = 0;\n            if (isset($qv['blog_id'])) {\n                $blog_id = absint($qv['blog_id']);\n            }\n\n            if ($qv['has_published_posts'] && $blog_id) {\n                if (true === $qv['has_published_posts']) {\n                    $post_types = get_post_types(array('public' => true));\n                } else {\n                    $post_types = (array)$qv['has_published_posts'];\n                }\n\n                foreach ($post_types as &$post_type) {\n                    $post_type = $wpdb->prepare('%s', $post_type);\n                }\n\n                $posts_table = $wpdb->get_blog_prefix($blog_id) . 'posts';\n                $this->query_where .= \" AND $user_table.uid IN ( SELECT DISTINCT $posts_table.post_author FROM $posts_table WHERE $posts_table.post_status = 'publish' AND $posts_table.post_type IN ( \" . implode(', ', $post_types) . ' ) )';\n            }\n\n            // nicename\n            if ('' !== $qv['nicename']) {\n                $this->query_where .= $wpdb->prepare(' AND name = %s', $qv['nicename']);\n            }\n\n            if (!empty($qv['nicename__in'])) {\n                $sanitized_nicename__in = array_map('esc_sql', $qv['nicename__in']);\n                $nicename__in = implode(\"','\", $sanitized_nicename__in);\n                $this->query_where .= \" AND name IN ( '$nicename__in' )\";\n            }\n\n            if (!empty($qv['nicename__not_in'])) {\n                $sanitized_nicename__not_in = array_map('esc_sql', $qv['nicename__not_in']);\n                $nicename__not_in = implode(\"','\", $sanitized_nicename__not_in);\n                $this->query_where .= \" AND name NOT IN ( '$nicename__not_in' )\";\n            }\n\n            // login\n//        if ( '' !== $qv['login'] ) {\n//            $this->query_where .= $wpdb->prepare( ' AND user_login = %s', $qv['login'] );\n//        }\n\n//        if ( ! empty( $qv['login__in'] ) ) {\n//            $sanitized_login__in = array_map( 'esc_sql', $qv['login__in'] );\n//            $login__in           = implode( \"','\", $sanitized_login__in );\n//            $this->query_where  .= \" AND user_login IN ( '$login__in' )\";\n//        }\n\n//        if ( ! empty( $qv['login__not_in'] ) ) {\n//            $sanitized_login__not_in = array_map( 'esc_sql', $qv['login__not_in'] );\n//            $login__not_in           = implode( \"','\", $sanitized_login__not_in );\n//            $this->query_where      .= \" AND user_login NOT IN ( '$login__not_in' )\";\n//        }\n\n            // Meta query.\n            $this->meta_query = new WP_Meta_Query();\n            $this->meta_query->parse_query_vars($qv);\n\n            if (isset($qv['who']) && 'authors' === $qv['who'] && $blog_id) {\n                _deprecated_argument(\n                    'WP_User_Query',\n                    '5.9.0',\n                    sprintf(\n                    /* translators: 1: who, 2: capability */\n                        __('%1$s is deprecated. Use %2$s instead.'),\n                        '<code>who</code>',\n                        '<code>capability</code>'\n                    )\n                );\n\n                $who_query = array(\n                    'key' => $wpdb->get_blog_prefix($blog_id) . 'user_level',\n                    'value' => 0,\n                    'compare' => '!=',\n                );\n\n                // Prevent extra meta query.\n                $qv['blog_id'] = 0;\n                $blog_id = 0;\n\n                if (empty($this->meta_query->queries)) {\n                    $this->meta_query->queries = array($who_query);\n                } else {\n                    // Append the cap query to the original queries and reparse the query.\n                    $this->meta_query->queries = array(\n                        'relation' => 'AND',\n                        array($this->meta_query->queries, $who_query),\n                    );\n                }\n\n                $this->meta_query->parse_query_vars($this->meta_query->queries);\n            }\n\n            // Roles.\n            $roles = array();\n            if (isset($qv['role'])) {\n                if (is_array($qv['role'])) {\n                    $roles = $qv['role'];\n                } elseif (is_string($qv['role']) && !empty($qv['role'])) {\n                    $roles = array_map('trim', explode(',', $qv['role']));\n                }\n            }\n\n            $role__in = array();\n            if (isset($qv['role__in'])) {\n                $role__in = (array)$qv['role__in'];\n            }\n\n            $role__not_in = array();\n            if (isset($qv['role__not_in'])) {\n                $role__not_in = (array)$qv['role__not_in'];\n            }\n\n            // Capabilities.\n            $available_roles = array();\n\n            if (!empty($qv['capability']) || !empty($qv['capability__in']) || !empty($qv['capability__not_in'])) {\n                global $wp_roles;\n\n                $wp_roles->for_site($blog_id);\n                $available_roles = $wp_roles->roles;\n            }\n\n            $capabilities = array();\n            if (!empty($qv['capability'])) {\n                if (is_array($qv['capability'])) {\n                    $capabilities = $qv['capability'];\n                } elseif (is_string($qv['capability'])) {\n                    $capabilities = array_map('trim', explode(',', $qv['capability']));\n                }\n            }\n\n            $capability__in = array();\n            if (!empty($qv['capability__in'])) {\n                $capability__in = (array)$qv['capability__in'];\n            }\n\n            $capability__not_in = array();\n            if (!empty($qv['capability__not_in'])) {\n                $capability__not_in = (array)$qv['capability__not_in'];\n            }\n\n            // Keep track of all capabilities and the roles they're added on.\n            $caps_with_roles = array();\n\n            foreach ($available_roles as $role => $role_data) {\n                $role_caps = array_keys(array_filter($role_data['capabilities']));\n\n                foreach ($capabilities as $cap) {\n                    if (in_array($cap, $role_caps, true)) {\n                        $caps_with_roles[$cap][] = $role;\n                        break;\n                    }\n                }\n\n                foreach ($capability__in as $cap) {\n                    if (in_array($cap, $role_caps, true)) {\n                        $role__in[] = $role;\n                        break;\n                    }\n                }\n\n                foreach ($capability__not_in as $cap) {\n                    if (in_array($cap, $role_caps, true)) {\n                        $role__not_in[] = $role;\n                        break;\n                    }\n                }\n            }\n\n            $role__in = array_merge($role__in, $capability__in);\n            $role__not_in = array_merge($role__not_in, $capability__not_in);\n\n            $roles = array_unique($roles);\n            $role__in = array_unique($role__in);\n            $role__not_in = array_unique($role__not_in);\n\n            // Support querying by capabilities added directly to users.\n            if ($blog_id && !empty($capabilities)) {\n                $capabilities_clauses = array('relation' => 'AND');\n\n                foreach ($capabilities as $cap) {\n                    $clause = array('relation' => 'OR');\n\n                    $clause[] = array(\n                        'key' => $wpdb->get_blog_prefix($blog_id) . 'capabilities',\n                        'value' => '\"' . $cap . '\"',\n                        'compare' => 'LIKE',\n                    );\n\n                    if (!empty($caps_with_roles[$cap])) {\n                        foreach ($caps_with_roles[$cap] as $role) {\n                            $clause[] = array(\n                                'key' => $wpdb->get_blog_prefix($blog_id) . 'capabilities',\n                                'value' => '\"' . $role . '\"',\n                                'compare' => 'LIKE',\n                            );\n                        }\n                    }\n\n                    $capabilities_clauses[] = $clause;\n                }\n\n                $role_queries[] = $capabilities_clauses;\n\n                if (empty($this->meta_query->queries)) {\n                    $this->meta_query->queries[] = $capabilities_clauses;\n                } else {\n                    // Append the cap query to the original queries and reparse the query.\n                    $this->meta_query->queries = array(\n                        'relation' => 'AND',\n                        array($this->meta_query->queries, array($capabilities_clauses)),\n                    );\n                }\n\n                $this->meta_query->parse_query_vars($this->meta_query->queries);\n            }\n\n            if ($blog_id && (!empty($roles) || !empty($role__in) || !empty($role__not_in) || is_multisite())) {\n                $role_queries = array();\n\n                $roles_clauses = array('relation' => 'AND');\n                if (!empty($roles)) {\n                    foreach ($roles as $role) {\n                        $roles_clauses[] = array(\n                            'key' => $wpdb->get_blog_prefix($blog_id) . 'capabilities',\n                            'value' => '\"' . $role . '\"',\n                            'compare' => 'LIKE',\n                        );\n                    }\n\n                    $role_queries[] = $roles_clauses;\n                }\n\n                $role__in_clauses = array('relation' => 'OR');\n                if (!empty($role__in)) {\n                    foreach ($role__in as $role) {\n                        $role__in_clauses[] = array(\n                            'key' => $wpdb->get_blog_prefix($blog_id) . 'capabilities',\n                            'value' => '\"' . $role . '\"',\n                            'compare' => 'LIKE',\n                        );\n                    }\n\n                    $role_queries[] = $role__in_clauses;\n                }\n\n                $role__not_in_clauses = array('relation' => 'AND');\n                if (!empty($role__not_in)) {\n                    foreach ($role__not_in as $role) {\n                        $role__not_in_clauses[] = array(\n                            'key' => $wpdb->get_blog_prefix($blog_id) . 'capabilities',\n                            'value' => '\"' . $role . '\"',\n                            'compare' => 'NOT LIKE',\n                        );\n                    }\n\n                    $role_queries[] = $role__not_in_clauses;\n                }\n\n                // If there are no specific roles named, make sure the user is a member of the site.\n                if (empty($role_queries)) {\n                    $role_queries[] = array(\n                        'key' => $wpdb->get_blog_prefix($blog_id) . 'capabilities',\n                        'compare' => 'EXISTS',\n                    );\n                }\n\n                // Specify that role queries should be joined with AND.\n                $role_queries['relation'] = 'AND';\n\n                if (empty($this->meta_query->queries)) {\n                    $this->meta_query->queries = $role_queries;\n                } else {\n                    // Append the cap query to the original queries and reparse the query.\n                    $this->meta_query->queries = array(\n                        'relation' => 'AND',\n                        array($this->meta_query->queries, $role_queries),\n                    );\n                }\n\n                $this->meta_query->parse_query_vars($this->meta_query->queries);\n            }\n\n            if (!empty($this->meta_query->queries)) {\n                $clauses = $this->meta_query->get_sql('user', $user_table, 'uid', $this);\n                $this->query_from .= $clauses['join'];\n                $this->query_where .= $clauses['where'];\n\n                if ($this->meta_query->has_or_relation()) {\n                    $this->query_fields = 'DISTINCT ' . $this->query_fields;\n                }\n            }\n\n            // Sorting.\n            $qv['order'] = isset($qv['order']) ? strtoupper($qv['order']) : '';\n            $order = $this->parse_order($qv['order']);\n\n            if (empty($qv['orderby'])) {\n                // Default order is by 'user_login'.\n                $ordersby = array('uid' => $order);\n            } elseif (is_array($qv['orderby'])) {\n                $ordersby = $qv['orderby'];\n            } else {\n                // 'orderby' values may be a comma- or space-separated list.\n                $ordersby = preg_split('/[,\\s]+/', $qv['orderby']);\n            }\n\n            $orderby_array = array();\n            foreach ($ordersby as $_key => $_value) {\n                if (!$_value) {\n                    continue;\n                }\n\n                if (is_int($_key)) {\n                    // Integer key means this is a flat array of 'orderby' fields.\n                    $_orderby = $_value;\n                    $_order = $order;\n                } else {\n                    // Non-integer key means this the key is the field and the value is ASC/DESC.\n                    $_orderby = $_key;\n                    $_order = $_value;\n                }\n\n                $parsed = $this->parse_orderby($_orderby);\n\n                if (!$parsed) {\n                    continue;\n                }\n\n                if ('nicename__in' === $_orderby || 'login__in' === $_orderby) {\n                    $orderby_array[] = $parsed;\n                } else {\n                    $orderby_array[] = $parsed . ' ' . $this->parse_order($_order);\n                }\n            }\n\n            // If no valid clauses were found, order by user_login.\n            if (empty($orderby_array)) {\n                $orderby_array[] = \"uid $order\";\n            }\n\n            $this->query_orderby = 'ORDER BY ' . implode(', ', $orderby_array);\n            // Limit.\n            if (isset($qv['number']) && $qv['number'] > 0) {\n                if ($qv['offset']) {\n                    $this->query_limit = $wpdb->prepare('LIMIT %d, %d', $qv['offset'], $qv['number']);\n                } else {\n                    $this->query_limit = $wpdb->prepare('LIMIT %d, %d', $qv['number'] * ($qv['paged'] - 1), $qv['number']);\n                }\n            }\n\n            $search = '';\n            if (isset($qv['search'])) {\n                $search = trim($qv['search']);\n            }\n\n            if ($search) {\n                $leading_wild = (ltrim($search, '*') != $search);\n                $trailing_wild = (rtrim($search, '*') != $search);\n                if ($leading_wild && $trailing_wild) {\n                    $wild = 'both';\n                } elseif ($leading_wild) {\n                    $wild = 'leading';\n                } elseif ($trailing_wild) {\n                    $wild = 'trailing';\n                } else {\n                    $wild = false;\n                }\n                if ($wild) {\n                    $search = trim($search, '*');\n                }\n\n                $search_columns = array();\n                if ($qv['search_columns']) {\n                    $search_columns = array_intersect($qv['search_columns'], array('uid', 'mail', 'url', 'name', 'screenName'));\n                }\n                if (!$search_columns) {\n                    if (false !== strpos($search, '@')) {\n                        $search_columns = array('mail');\n                    } elseif (is_numeric($search)) {\n                        $search_columns = array('uid');\n                    } elseif (preg_match('|^https?://|', $search) && !(is_multisite() && wp_is_large_network('users'))) {\n                        $search_columns = array('url');\n                    } else {\n                        $search_columns = array('url', 'mail', 'name', 'screenName');\n                    }\n                }\n\n                /**\n                 * Filters the columns to search in a WP_User_Query search.\n                 *\n                 * The default columns depend on the search term, and include 'ID',\n                 * 'mail', 'url', 'name', and 'screenName'.\n                 *\n                 * @param string[] $search_columns Array of column names to be searched.\n                 * @param string $search Text being searched.\n                 * @param WP_User_Query $query The current WP_User_Query instance.\n                 * @since 3.6.0\n                 *\n                 */\n                $search_columns = apply_filters('user_search_columns', $search_columns, $search, $this);\n\n                $this->query_where .= $this->get_search_sql($search, $search_columns, $wild);\n            }\n\n            if (!empty($include)) {\n                // Sanitized earlier.\n                $ids = implode(',', $include);\n                $this->query_where .= \" AND $user_table.uid IN ($ids)\";\n            } elseif (!empty($qv['exclude'])) {\n                $ids = implode(',', wp_parse_id_list($qv['exclude']));\n                $this->query_where .= \" AND $user_table.uid NOT IN ($ids)\";\n            }\n\n            // Date queries are allowed for the user_registered field.\n            if (!empty($qv['date_query']) && is_array($qv['date_query'])) {\n                $date_query = new WP_Date_Query($qv['date_query'], 'user_registered');\n                $this->query_where .= $date_query->get_sql();\n            }\n\n            /**\n             * Fires after the WP_User_Query has been parsed, and before\n             * the query is executed.\n             *\n             * The passed WP_User_Query object contains SQL parts formed\n             * from parsing the given query.\n             *\n             * @param WP_User_Query $query Current instance of WP_User_Query (passed by reference).\n             * @since 3.1.0\n             *\n             */\n//        do_action_ref_array( 'pre_user_query', array( &$this ) );\n        }\n\n        /**\n         * Execute the query, with the current variables.\n         *\n         * @since 3.1.0\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         */\n        public function query()\n        {\n            $wpdb = Db::get();\n\n            $qv =& $this->query_vars;\n\n            if (null === $this->results) {\n                $this->request = \"SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit\";\n                if (is_array($qv['fields']) || 'all' === $qv['fields']) {\n                    $this->results = $wpdb->fetchAll($this->request);\n                } else {\n                    $this->results = $wpdb->fetchRow($this->request);\n                }\n\n                if (isset($qv['count_total']) && $qv['count_total']) {\n                    /**\n                     * Filters SELECT FOUND_ROWS() query for the current WP_User_Query instance.\n                     *\n                     * @param string $sql The SELECT FOUND_ROWS() query for the current WP_User_Query.\n                     * @param WP_User_Query $query The current WP_User_Query instance.\n                     * @global wpdb $wpdb WordPress database abstraction object.\n                     *\n                     * @since 3.2.0\n                     * @since 5.1.0 Added the `$this` parameter.\n                     *\n                     */\n                    $found_users_query = apply_filters('found_users_query', 'SELECT FOUND_ROWS()', $this);\n                    $this->total_users = (int)$wpdb->fetchRow($found_users_query) [\"FOUND_ROWS()\"];\n                }\n            }\n\n            if (!$this->results) {\n                return;\n            }\n            $this->results = array_map('convert_to_object', $this->results);\n\n//        if ( 'all_with_meta' === $qv['fields'] ) {\n//            cache_users( $this->results );\n//\n//            $r = array();\n//            foreach ( $this->results as $userid ) {\n//                $r[ $userid ] = new WP_User( $userid, '', $qv['blog_id'] );\n//            }\n//\n//            $this->results = $r;\n//        } elseif ( 'all' === $qv['fields'] ) {\n//            foreach ( $this->results as $key => $user ) {\n//                $this->results[ $key ] = new WP_User( $user, '', $qv['blog_id'] );\n//            }\n//        }\n        }\n\n        /**\n         * Retrieve query variable.\n         *\n         * @param string $query_var Query variable key.\n         * @return mixed\n         * @since 3.5.0\n         *\n         */\n        public function get($query_var)\n        {\n            if (isset($this->query_vars[$query_var])) {\n                return $this->query_vars[$query_var];\n            }\n\n            return null;\n        }\n\n        /**\n         * Set query variable.\n         *\n         * @param string $query_var Query variable key.\n         * @param mixed $value Query variable value.\n         * @since 3.5.0\n         *\n         */\n        public function set($query_var, $value)\n        {\n            $this->query_vars[$query_var] = $value;\n        }\n\n        /**\n         * Used internally to generate an SQL string for searching across multiple columns\n         *\n         * @param string $string\n         * @param array $cols\n         * @param bool $wild Whether to allow wildcard searches. Default is false for Network Admin, true for single site.\n         *                       Single site allows leading and trailing wildcards, Network Admin only trailing.\n         * @return string\n         * @since 3.1.0\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         */\n        protected function get_search_sql($string, $cols, $wild = false)\n        {\n            global $wpdb;\n\n            $searches = array();\n            $leading_wild = ('leading' === $wild || 'both' === $wild) ? '%' : '';\n            $trailing_wild = ('trailing' === $wild || 'both' === $wild) ? '%' : '';\n            $like = $leading_wild . $wpdb->esc_like($string) . $trailing_wild;\n\n            foreach ($cols as $col) {\n                if ('uid' === $col) {\n                    $searches[] = $wpdb->prepare(\"$col = %s\", $string);\n                } else {\n                    $searches[] = $wpdb->prepare(\"$col LIKE %s\", $like);\n                }\n            }\n\n            return ' AND (' . implode(' OR ', $searches) . ')';\n        }\n\n        /**\n         * Return the list of users.\n         *\n         * @return array Array of results.\n         * @since 3.1.0\n         *\n         */\n        public function get_results()\n        {\n            return $this->results;\n        }\n\n        /**\n         * Return the total number of users for the current query.\n         *\n         * @return int Number of total users.\n         * @since 3.1.0\n         *\n         */\n        public function get_total()\n        {\n            return $this->total_users;\n        }\n\n        /**\n         * Parse and sanitize 'orderby' keys passed to the user query.\n         *\n         * @param string $orderby Alias for the field to order by.\n         * @return string Value to used in the ORDER clause, if `$orderby` is valid.\n         * @since 4.2.0\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         */\n        protected function parse_orderby($orderby)\n        {\n            $wpdb = Db::get();\n            $user_table = $wpdb->getPrefix() . 'users';\n\n            $meta_query_clauses = $this->meta_query->get_clauses();\n\n            $_orderby = '';\n            if (in_array($orderby, array('uid', 'nicename', 'email', 'url', 'registered'), true)) {\n                $_orderby = $orderby;\n            } elseif (in_array($orderby, array('name', 'mail', 'url', 'user_registered'), true)) {\n                $_orderby = $orderby;\n            } elseif ('name' === $orderby || 'screenName' === $orderby) {\n                $_orderby = 'screenName';\n            } elseif ('post_count' === $orderby) {\n                // @todo Avoid the JOIN.\n                $where = get_posts_by_author_sql('post');\n                $this->query_from .= \" LEFT OUTER JOIN (\n\t\t\t\tSELECT post_author, COUNT(*) as post_count\n\t\t\t\tFROM $wpdb->posts\n\t\t\t\t$where\n\t\t\t\tGROUP BY post_author\n\t\t\t) p ON ({$user_table}.uid = p.post_author)\n\t\t\t\";\n                $_orderby = 'post_count';\n            } elseif ('uid' === $orderby || 'id' === $orderby) {\n                $_orderby = 'uid';\n            } elseif ('meta_value' === $orderby || $this->get('meta_key') == $orderby) {\n                $_orderby = \"$wpdb->usermeta.meta_value\";\n            } elseif ('meta_value_num' === $orderby) {\n                $_orderby = \"$wpdb->usermeta.meta_value+0\";\n            } elseif ('include' === $orderby && !empty($this->query_vars['include'])) {\n                $include = wp_parse_id_list($this->query_vars['include']);\n                $include_sql = implode(',', $include);\n                $_orderby = \"FIELD( $user_table.uid, $include_sql )\";\n            } elseif ('nicename__in' === $orderby) {\n                $sanitized_nicename__in = array_map('esc_sql', $this->query_vars['nicename__in']);\n                $nicename__in = implode(\"','\", $sanitized_nicename__in);\n                $_orderby = \"FIELD( name, '$nicename__in' )\";\n            } elseif (isset($meta_query_clauses[$orderby])) {\n                $meta_clause = $meta_query_clauses[$orderby];\n                $_orderby = sprintf('CAST(%s.meta_value AS %s)', esc_sql($meta_clause['alias']), esc_sql($meta_clause['cast']));\n            }\n\n            return $_orderby;\n        }\n\n        /**\n         * Parse an 'order' query variable and cast it to ASC or DESC as necessary.\n         *\n         * @param string $order The 'order' query variable.\n         * @return string The sanitized 'order' query variable.\n         * @since 4.2.0\n         *\n         */\n        protected function parse_order($order)\n        {\n            if (!is_string($order) || empty($order)) {\n                return 'DESC';\n            }\n\n            if ('ASC' === strtoupper($order)) {\n                return 'ASC';\n            } else {\n                return 'DESC';\n            }\n        }\n\n        /**\n         * Make private properties readable for backward compatibility.\n         *\n         * @param string $name Property to get.\n         * @return mixed Property.\n         * @since 4.0.0\n         *\n         */\n        public function __get($name)\n        {\n            if (in_array($name, $this->compat_fields, true)) {\n                return $this->$name;\n            }\n        }\n\n        /**\n         * Make private properties settable for backward compatibility.\n         *\n         * @param string $name Property to check if set.\n         * @param mixed $value Property value.\n         * @return mixed Newly-set property.\n         * @since 4.0.0\n         *\n         */\n        public function __set($name, $value)\n        {\n            if (in_array($name, $this->compat_fields, true)) {\n                return $this->$name = $value;\n            }\n        }\n\n        /**\n         * Make private properties checkable for backward compatibility.\n         *\n         * @param string $name Property to check if set.\n         * @return bool Whether the property is set.\n         * @since 4.0.0\n         *\n         */\n        public function __isset($name)\n        {\n            if (in_array($name, $this->compat_fields, true)) {\n                return isset($this->$name);\n            }\n        }\n\n        /**\n         * Make private properties un-settable for backward compatibility.\n         *\n         * @param string $name Property to unset.\n         * @since 4.0.0\n         *\n         */\n        public function __unset($name)\n        {\n            if (in_array($name, $this->compat_fields, true)) {\n                unset($this->$name);\n            }\n        }\n\n        /**\n         * Make private/protected methods readable for backward compatibility.\n         *\n         * @param string $name Method to call.\n         * @param array $arguments Arguments to pass when calling.\n         * @return mixed Return value of the callback, false otherwise.\n         * @since 4.0.0\n         *\n         */\n        public function __call($name, $arguments)\n        {\n            if ('get_search_sql' === $name) {\n                return $this->get_search_sql(...$arguments);\n            }\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/customize.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * WP Customize custom panel\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'WP_Customize_Panel_CSF' ) && class_exists( 'WP_Customize_Panel' ) ) {\n  class WP_Customize_Panel_CSF extends WP_Customize_Panel {\n    public $type = 'csf';\n  }\n}\n\n/**\n *\n * WP Customize custom section\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'WP_Customize_Section_CSF' ) && class_exists( 'WP_Customize_Section' ) ) {\n  class WP_Customize_Section_CSF extends WP_Customize_Section {\n    public $type = 'csf';\n  }\n}\n\n/**\n *\n * WP Customize custom control\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'WP_Customize_Control_CSF' ) && class_exists( 'WP_Customize_Control' ) ) {\n  class WP_Customize_Control_CSF extends WP_Customize_Control {\n\n    public $type   = 'csf';\n    public $field  = '';\n    public $unique = '';\n\n    public function render() {\n\n      $depend  = '';\n      $visible = '';\n\n      if ( ! empty( $this->field['dependency'] ) ) {\n\n        $dependency      = $this->field['dependency'];\n        $depend_visible  = '';\n        $data_controller = '';\n        $data_condition  = '';\n        $data_value      = '';\n        $data_global     = '';\n\n        if ( is_array( $dependency[0] ) ) {\n          $data_controller = implode( '|', array_column( $dependency, 0 ) );\n          $data_condition  = implode( '|', array_column( $dependency, 1 ) );\n          $data_value      = implode( '|', array_column( $dependency, 2 ) );\n          $data_global     = implode( '|', array_column( $dependency, 3 ) );\n          $depend_visible  = implode( '|', array_column( $dependency, 4 ) );\n        } else {\n          $data_controller = ( ! empty( $dependency[0] ) ) ? $dependency[0] : '';\n          $data_condition  = ( ! empty( $dependency[1] ) ) ? $dependency[1] : '';\n          $data_value      = ( ! empty( $dependency[2] ) ) ? $dependency[2] : '';\n          $data_global     = ( ! empty( $dependency[3] ) ) ? $dependency[3] : '';\n          $depend_visible  = ( ! empty( $dependency[4] ) ) ? $dependency[4] : '';\n        }\n\n        $depend .= ' data-controller=\"'. esc_attr( $data_controller ) .'\"';\n        $depend .= ' data-condition=\"'. esc_attr( $data_condition ) .'\"';\n        $depend .= ' data-value=\"'. esc_attr( $data_value ) .'\"';\n        $depend .= ( ! empty( $data_global ) ) ? ' data-depend-global=\"true\"' : '';\n\n        $visible  = ' csf-dependency-control';\n        $visible .= ( ! empty( $depend_visible ) ) ? ' csf-depend-visible' : ' csf-depend-hidden';\n\n      }\n\n      $id    = 'customize-control-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id );\n      $class = 'customize-control customize-control-'. $this->type . $visible;\n\n      echo '<li id=\"'. esc_attr( $id ) .'\" class=\"'. esc_attr( $class ) .'\"'. $depend .'>';\n      $this->render_field_content();\n      echo '</li>';\n\n    }\n\n    public function render_field_content() {\n\n      $complex = apply_filters( 'csf_customize_complex_fields', array(\n        'accordion',\n        'background',\n        'border',\n        'button_set',\n        'checkbox',\n        'color_group',\n        'date',\n        'dimensions',\n        'fieldset',\n        'group',\n        'image_select',\n        'link',\n        'link_color',\n        'media',\n        'palette',\n        'repeater',\n        'sortable',\n        'sorter',\n        'spacing',\n        'switcher',\n        'tabbed',\n        'typography'\n      ) );\n\n      $field_id   = ( ! empty( $this->field['id'] ) ) ? $this->field['id'] : '';\n      $custom     = ( ! empty( $this->field['customizer'] ) ) ? true : false;\n      $is_complex = ( in_array( $this->field['type'], $complex ) ) ? true : false;\n      $class      = ( $is_complex || $custom ) ? ' csf-customize-complex' : '';\n      $atts       = ( $is_complex || $custom ) ? ' data-unique-id=\"'. esc_attr( $this->unique ) .'\" data-option-id=\"'. esc_attr( $field_id ) .'\"' : '';\n\n      if ( ! $is_complex && ! $custom ) {\n        $this->field['attributes']['data-customize-setting-link'] = $this->settings['default']->id;\n      }\n\n      $this->field['name'] = $this->settings['default']->id;\n\n      $this->field['dependency'] = array();\n\n      echo '<div class=\"csf-customize-field'. esc_attr( $class ) .'\"'. $atts .'>';\n\n      CSF::field( $this->field, $this->value(), $this->unique, 'customize' );\n\n      echo '</div>';\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/defines.php",
    "content": "<?php\n\n\nuse IXR\\Exception;\nuse Typecho\\Common;\nuse Typecho\\Cookie;\nuse Typecho\\Db;\nuse Typecho\\Widget;\nrequire_once 'options.php';\nrequire_once 'class-list-util.php';\nrequire_once 'kses.php';\n\n\nif (!defined('KB_IN_BYTES')){\n    define( 'KB_IN_BYTES', 1024 );\n}\nif (!defined('MB_IN_BYTES')) {\n    define( 'MB_IN_BYTES', 1024 * KB_IN_BYTES );\n}\nif (!defined('GB_IN_BYTES')) {\n    define( 'GB_IN_BYTES', 1024 * MB_IN_BYTES );\n}\nif (!defined('TB_IN_BYTES')) {\n    define( 'TB_IN_BYTES', 1024 * GB_IN_BYTES );\n}\n\n\nif (!function_exists('wp_is_stream')) {\n\n    function wp_is_stream($path)\n    {\n        $scheme_separator = strpos($path, '://');\n\n        if (false === $scheme_separator) {\n            // $path isn't a stream.\n            return false;\n        }\n\n        $stream = substr($path, 0, $scheme_separator);\n\n        return in_array($stream, stream_get_wrappers(), true);\n    }\n}\nif (!function_exists('wp_normalize_path')) {\n\n    function wp_normalize_path($path)\n    {\n        $wrapper = '';\n\n        if (wp_is_stream($path)) {\n            list($wrapper, $path) = explode('://', $path, 2);\n\n            $wrapper .= '://';\n        }\n\n        // Standardise all paths to use '/'.\n        $path = str_replace('\\\\', '/', $path);\n\n        // Replace multiple slashes down to a singular, allowing for network shares having two slashes.\n        $path = preg_replace('|(?<=.)/+|', '/', $path);\n\n        // Windows paths should uppercase the drive letter.\n        if (':' === substr($path, 1, 1)) {\n            $path = ucfirst($path);\n        }\n\n        return $wrapper . $path;\n    }\n\n}\nif (!function_exists('is_ssl')) {\n\n    function is_ssl()\n    {\n        if (isset($_SERVER['HTTPS'])) {\n            if ('on' === strtolower($_SERVER['HTTPS'])) {\n                return true;\n            }\n\n            if ('1' == $_SERVER['HTTPS']) {\n                return true;\n            }\n        } elseif (isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'])) {\n            return true;\n        }\n        return false;\n    }\n\n}\nif (!function_exists('get_parent_theme_file_uri')) {\n\n    function get_parent_theme_file_uri()\n    {\n        return str_replace('/'.Helper::options()->theme, '', Helper::options()->themeUrl);\n    }\n}\nif (!function_exists('apply_filters')) {\n\n    function apply_filters($hook_name, $value)\n    {\n        //todo: do nothing now\n        return $value;\n    }\n}\nif (!function_exists('wp_check_invalid_utf8')) {\n    function wp_check_invalid_utf8($string, $strip = false)\n    {\n        $string = (string)$string;\n\n        if (0 === strlen($string)) {\n            return '';\n        }\n\n        // must be utf-8 here!\n\n        // Check for support for utf8 in the installed PCRE library once and store the result in a static.\n        static $utf8_pcre = null;\n        if (!isset($utf8_pcre)) {\n            // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged\n            $utf8_pcre = @preg_match('/^./u', 'a');\n        }\n        // We can't demand utf8 in the PCRE installation, so just return the string in those cases.\n        if (!$utf8_pcre) {\n            return $string;\n        }\n\n        // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- preg_match fails when it encounters invalid UTF8 in $string.\n        if (1 === @preg_match('/^./us', $string)) {\n            return $string;\n        }\n\n        // Attempt to strip the bad chars if requested (not recommended).\n        if ($strip && function_exists('iconv')) {\n            return iconv('utf-8', 'utf-8', $string);\n        }\n\n        return '';\n    }\n}\nif (!function_exists('wp_kses_normalize_entities')) {\n    function wp_kses_normalize_entities($string, $context = 'html')\n    {\n        // Disarm all entities by converting & to &amp;\n        $string = str_replace('&', '&amp;', $string);\n\n        // Change back the allowed entities in our list of allowed entities.\n        if ('xml' === $context) {\n            $string = preg_replace_callback('/&amp;([A-Za-z]{2,8}[0-9]{0,2});/', 'wp_kses_xml_named_entities', $string);\n        } else {\n            $string = preg_replace_callback('/&amp;([A-Za-z]{2,8}[0-9]{0,2});/', 'wp_kses_named_entities', $string);\n        }\n        $string = preg_replace_callback('/&amp;#(0*[0-9]{1,7});/', 'wp_kses_normalize_entities2', $string);\n        $string = preg_replace_callback('/&amp;#[Xx](0*[0-9A-Fa-f]{1,6});/', 'wp_kses_normalize_entities3', $string);\n\n        return $string;\n    }\n}\nif (!function_exists('_wp_specialchars')) {\n\n    function _wp_specialchars($string, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false)\n    {\n        $string = (string)$string;\n\n        if (0 === strlen($string)) {\n            return '';\n        }\n\n        // Don't bother if there are no specialchars - saves some processing.\n        if (!preg_match('/[&<>\"\\']/', $string)) {\n            return $string;\n        }\n\n        // Account for the previous behaviour of the function when the $quote_style is not an accepted value.\n        if (empty($quote_style)) {\n            $quote_style = ENT_NOQUOTES;\n        } elseif (ENT_XML1 === $quote_style) {\n            $quote_style = ENT_QUOTES | ENT_XML1;\n        } elseif (!in_array($quote_style, array(ENT_NOQUOTES, ENT_COMPAT, ENT_QUOTES, 'single', 'double'), true)) {\n            $quote_style = ENT_QUOTES;\n        }\n\n        // Store the site charset as a static to avoid multiple calls to wp_load_alloptions().\n        $charset = 'UTF-8';\n\n\n        $_quote_style = $quote_style;\n\n        if ('double' === $quote_style) {\n            $quote_style = ENT_COMPAT;\n            $_quote_style = ENT_COMPAT;\n        } elseif ('single' === $quote_style) {\n            $quote_style = ENT_NOQUOTES;\n        }\n\n        if (!$double_encode) {\n            // Guarantee every &entity; is valid, convert &garbage; into &amp;garbage;\n            // This is required for PHP < 5.4.0 because ENT_HTML401 flag is unavailable.\n            $string = wp_kses_normalize_entities($string, ($quote_style & ENT_XML1) ? 'xml' : 'html');\n        }\n\n        $string = htmlspecialchars($string, $quote_style, $charset, $double_encode);\n\n        // Back-compat.\n        if ('single' === $_quote_style) {\n            $string = str_replace(\"'\", '&#039;', $string);\n        }\n\n        return $string;\n    }\n}\nif (!function_exists('esc_attr')) {\n\n    function esc_attr($text)\n    {\n        $safe_text = wp_check_invalid_utf8($text);\n        $safe_text = _wp_specialchars($safe_text, ENT_QUOTES);\n        /**\n         * Filters a string cleaned and escaped for output in an HTML attribute.\n         *\n         * Text passed to esc_attr() is stripped of invalid or special characters\n         * before output.\n         *\n         * @param string $safe_text The text after it has been escaped.\n         * @param string $text The text prior to being escaped.\n         * @since 2.0.6\n         *\n         */\n        return apply_filters('attribute_escape', $safe_text, $text);\n    }\n}\nif (!function_exists('load_template')) {\n\n    function load_template($_template_file, $require_once = true, $args = array())\n    {\n        global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;\n\n        if (is_array($wp_query->query_vars)) {\n            /*\n             * This use of extract() cannot be removed. There are many possible ways that\n             * templates could depend on variables that it creates existing, and no way to\n             * detect and deprecate it.\n             *\n             * Passing the EXTR_SKIP flag is the safest option, ensuring globals and\n             * function variables cannot be overwritten.\n             */\n            // phpcs:ignore WordPress.PHP.DontExtract.extract_extract\n            extract($wp_query->query_vars, EXTR_SKIP);\n        }\n\n        if (isset($s)) {\n            $s = esc_attr($s);\n        }\n\n        if ($require_once) {\n            require_once $_template_file;\n        } else {\n            require $_template_file;\n        }\n    }\n}\nif (!function_exists('wp_pre_kses_less_than')) {\n\n    function wp_pre_kses_less_than($text)\n    {\n        return preg_replace_callback('%<[^>]*?((?=<)|>|$)%', 'wp_pre_kses_less_than_callback', $text);\n    }\n}\nif (!function_exists('wp_strip_all_tags')) {\n\n    function wp_strip_all_tags($string, $remove_breaks = false)\n    {\n        $string = preg_replace('@<(script|style)[^>]*?>.*?</\\\\1>@si', '', $string);\n        $string = strip_tags($string);\n\n        if ($remove_breaks) {\n            $string = preg_replace('/[\\r\\n\\t ]+/', ' ', $string);\n        }\n\n        return trim($string);\n    }\n}\nif (!function_exists('_sanitize_text_fields')) {\n\n    function _sanitize_text_fields($str, $keep_newlines = false)\n    {\n        if (is_object($str) || is_array($str)) {\n            return '';\n        }\n\n        $str = (string)$str;\n\n        $filtered = wp_check_invalid_utf8($str);\n\n        if (strpos($filtered, '<') !== false) {\n            $filtered = wp_pre_kses_less_than($filtered);\n            // This will strip extra whitespace for us.\n            $filtered = wp_strip_all_tags($filtered, false);\n\n            // Use HTML entities in a special case to make sure no later\n            // newline stripping stage could lead to a functional tag.\n            $filtered = str_replace(\"<\\n\", \"&lt;\\n\", $filtered);\n        }\n\n        if (!$keep_newlines) {\n            $filtered = preg_replace('/[\\r\\n\\t ]+/', ' ', $filtered);\n        }\n        $filtered = trim($filtered);\n\n        $found = false;\n        while (preg_match('/%[a-f0-9]{2}/i', $filtered, $match)) {\n            $filtered = str_replace($match[0], '', $filtered);\n            $found = true;\n        }\n\n        if ($found) {\n            // Strip out the whitespace that may now exist after removing the octets.\n            $filtered = trim(preg_replace('/ +/', ' ', $filtered));\n        }\n\n        return $filtered;\n    }\n}\nif (!function_exists('sanitize_text_field')) {\n\n    function sanitize_text_field($str)\n    {\n        $filtered = _sanitize_text_fields($str, false);\n\n        /**\n         * Filters a sanitized text field string.\n         *\n         * @param string $filtered The sanitized string.\n         * @param string $str The string prior to being sanitized.\n         * @since 2.9.0\n         *\n         */\n        return apply_filters('sanitize_text_field', $filtered, $str);\n    }\n}\nif (!function_exists('stripslashes_from_strings_only')) {\n\n    function stripslashes_from_strings_only($value)\n    {\n        return is_string($value) ? stripslashes($value) : $value;\n    }\n}\nif (!function_exists('map_deep')) {\n\n    function map_deep($value, $callback)\n    {\n        if (is_array($value)) {\n            foreach ($value as $index => $item) {\n                $value[$index] = map_deep($item, $callback);\n            }\n        } elseif (is_object($value)) {\n            $object_vars = get_object_vars($value);\n            foreach ($object_vars as $property_name => $property_value) {\n                $value->$property_name = map_deep($property_value, $callback);\n            }\n        } else {\n            $value = call_user_func($callback, $value);\n        }\n\n        return $value;\n    }\n}\nif (!function_exists('stripslashes_deep')) {\n\n    function stripslashes_deep($value)\n    {\n        return map_deep($value, 'stripslashes_from_strings_only');\n    }\n}\nif (!function_exists('wp_unslash')) {\n\n    function wp_unslash($value)\n    {\n        return stripslashes_deep($value);\n    }\n}\n\nif (!function_exists('wp_parse_str')) {\n    function wp_parse_str($string, &$array)\n    {\n        parse_str((string)$string, $array);\n\n        /**\n         * Filters the array of variables derived from a parsed string.\n         *\n         * @param array $array The array populated with variables.\n         * @since 2.2.1\n         *\n         */\n        $array = apply_filters('wp_parse_str', $array);\n    }\n}\nif (!function_exists('wp_parse_args')) {\n\n    function wp_parse_args($args, $defaults = array())\n    {\n        if (is_object($args)) {\n            $parsed_args = get_object_vars($args);\n        } elseif (is_array($args)) {\n            $parsed_args =& $args;\n        } else {\n            wp_parse_str($args, $parsed_args);\n        }\n\n        if (is_array($defaults) && $defaults) {\n            return array_merge($defaults, $parsed_args);\n        }\n        return $parsed_args;\n    }\n}\nif (!function_exists('wp_list_sort')) {\n\n    function wp_list_sort($list, $orderby = array(), $order = 'ASC', $preserve_keys = false)\n    {\n        if (!is_array($list)) {\n            return array();\n        }\n\n        $util = new WP_List_Util($list);\n\n        return $util->sort($orderby, $order, $preserve_keys);\n    }\n}\nif (!function_exists('wp_verify_nonce')) {\n\n    function wp_verify_nonce($nonce, $action = -1)\n    {\n        // todo:Verifies that a correct security nonce was used with time limit.\n        return true;\n    }\n}\nif (!function_exists('wp_allowed_protocols')) {\n\n    function wp_allowed_protocols()\n    {\n        static $protocols = array();\n\n        if (empty($protocols)) {\n            $protocols = array('http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'irc6', 'ircs', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'sms', 'svn', 'tel', 'fax', 'xmpp', 'webcal', 'urn');\n        }\n\n        return $protocols;\n    }\n}\nif (!function_exists('wp_kses_no_null')) {\n\n    function wp_kses_no_null($string, $options = null)\n    {\n        if (!isset($options['slash_zero'])) {\n            $options = array('slash_zero' => 'remove');\n        }\n\n        $string = preg_replace('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/', '', $string);\n        if ('remove' === $options['slash_zero']) {\n            $string = preg_replace('/\\\\\\\\+0+/', '', $string);\n        }\n\n        return $string;\n    }\n}\nif (!function_exists('wp_kses_split')) {\n\n    function wp_kses_split($string, $allowed_html, $allowed_protocols)\n    {\n        global $pass_allowed_html, $pass_allowed_protocols;\n\n        $pass_allowed_html = $allowed_html;\n        $pass_allowed_protocols = $allowed_protocols;\n\n        return preg_replace_callback('%(<!--.*?(-->|$))|(<[^>]*(>|$)|>)%', '_wp_kses_split_callback', $string);\n    }\n}\nif (!function_exists('wp_kses')) {\n\n    function wp_kses($string, $allowed_html, $allowed_protocols = array())\n    {\n        if (empty($allowed_protocols)) {\n            $allowed_protocols = wp_allowed_protocols();\n        }\n\n        $string = wp_kses_no_null($string, array('slash_zero' => 'keep'));\n        $string = wp_kses_normalize_entities($string);\n\n        return wp_kses_split($string, $allowed_html, $allowed_protocols);\n    }\n}\nif (!function_exists('wp_kses_post')) {\n\n    function wp_kses_post($data)\n    {\n        return wp_kses($data, 'post');\n    }\n}\nif (!function_exists('wp_kses_post_deep')) {\n\n    function wp_kses_post_deep($data)\n    {\n        return map_deep($data, 'wp_kses_post');\n    }\n}\nif (!function_exists('esc_html')) {\n\n    function esc_html($text)\n    {\n        $safe_text = wp_check_invalid_utf8($text);\n        $safe_text = _wp_specialchars($safe_text, ENT_QUOTES);\n        /**\n         * Filters a string cleaned and escaped for output in HTML.\n         *\n         * Text passed to esc_html() is stripped of invalid or special characters\n         * before output.\n         *\n         * @param string $safe_text The text after it has been escaped.\n         * @param string $text The text prior to being escaped.\n         * @since 2.8.0\n         *\n         */\n        return apply_filters('esc_html', $safe_text, $text);\n    }\n}\nif (!function_exists('esc_html__')) {\n\n    function esc_html__($text, $domain = 'default')\n    {\n        return esc_html(\\Typecho\\I18n::translate($text));\n    }\n}\nif (!function_exists('esc_html_e')) {\n\n    function esc_html_e($text, $domain = 'default')\n    {\n        echo esc_html(\\Typecho\\I18n::translate($text));\n    }\n}\nif (!function_exists('__')) {\n\n    function __($text, $domain = 'default')\n    {\n        return \\Typecho\\I18n::translate($text);\n    }\n}\nif (!function_exists('_x')) {\n\n    function _x($text, $context, $domain = 'default')\n    {\n        return \\Typecho\\I18n::translate($text);\n    }\n}\nif (!function_exists('_ex')) {\n\n    function _ex($text, $context, $domain = 'default')\n    {\n        echo _x($text, $context, $domain);\n    }\n}\nif (!function_exists('esc_like')) {\n\n    function esc_like($text)\n    {\n        return addcslashes($text, '_%\\\\');\n    }\n}\nif (!function_exists('esc_attr_e')) {\n\n    function esc_attr_e($text, $domain = 'default')\n    {\n        echo esc_attr(\\Typecho\\I18n::translate($text));\n    }\n}\nif (!function_exists('is_user_logged_in')) {\n\n    function is_user_logged_in()\n    {\n        $user = \\Typecho\\Widget::widget('Widget_User');\n        return $user->hasLogin();\n    }\n}\nif (!function_exists('wp_referer_field')) {\n    function wp_referer_field($echo = true)\n    {\n        $referer_field = '<input type=\"hidden\" name=\"_wp_http_referer\" value=\"' . esc_attr(wp_unslash($_SERVER['REQUEST_URI'])) . '\" />';\n\n        if ($echo) {\n            echo $referer_field;\n        }\n\n        return $referer_field;\n    }\n}\nif (!function_exists('wp_nonce_field')) {\n\n    function wp_nonce_field($action = -1, $name = '_wpnonce', $referer = true, $echo = true)\n    {\n        $name = esc_attr($name);\n        $nonce_field = '<input type=\"hidden\" id=\"' . $name . '\" name=\"' . $name . '\" value=\"' . $action . '\" />';\n\n        if ($referer) {\n            $nonce_field .= wp_referer_field(false);\n        }\n\n        if ($echo) {\n            echo $nonce_field;\n        }\n\n        return $nonce_field;\n    }\n}\nif (!function_exists('mbstring_binary_safe_encoding')) {\n\n    function mbstring_binary_safe_encoding($reset = false)\n    {\n        static $encodings = array();\n        static $overloaded = null;\n\n        if (is_null($overloaded)) {\n            if (function_exists('mb_internal_encoding')\n                && ((int)ini_get('mbstring.func_overload') & 2) // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated\n            ) {\n                $overloaded = true;\n            } else {\n                $overloaded = false;\n            }\n        }\n\n        if (false === $overloaded) {\n            return;\n        }\n\n        if (!$reset) {\n            $encoding = mb_internal_encoding();\n            array_push($encodings, $encoding);\n            mb_internal_encoding('ISO-8859-1');\n        }\n\n        if ($reset && $encodings) {\n            $encoding = array_pop($encodings);\n            mb_internal_encoding($encoding);\n        }\n    }\n}\nif (!function_exists('reset_mbstring_encoding')) {\n\n    function reset_mbstring_encoding()\n    {\n        mbstring_binary_safe_encoding(true);\n    }\n}\nif (!function_exists('seems_utf8')) {\n\n    function seems_utf8($str)\n    {\n        mbstring_binary_safe_encoding();\n        $length = strlen($str);\n        reset_mbstring_encoding();\n        for ($i = 0; $i < $length; $i++) {\n            $c = ord($str[$i]);\n            if ($c < 0x80) {\n                $n = 0; // 0bbbbbbb\n            } elseif (($c & 0xE0) == 0xC0) {\n                $n = 1; // 110bbbbb\n            } elseif (($c & 0xF0) == 0xE0) {\n                $n = 2; // 1110bbbb\n            } elseif (($c & 0xF8) == 0xF0) {\n                $n = 3; // 11110bbb\n            } elseif (($c & 0xFC) == 0xF8) {\n                $n = 4; // 111110bb\n            } elseif (($c & 0xFE) == 0xFC) {\n                $n = 5; // 1111110b\n            } else {\n                return false; // Does not match any model.\n            }\n            for ($j = 0; $j < $n; $j++) { // n bytes matching 10bbbbbb follow ?\n                if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80)) {\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n}\nif (!function_exists('remove_accents')) {\n\n    function remove_accents($string)\n    {\n        if (!preg_match('/[\\x80-\\xff]/', $string)) {\n            return $string;\n        }\n\n        if (seems_utf8($string)) {\n            $chars = array(\n                // Decompositions for Latin-1 Supplement.\n                'ª' => 'a',\n                'º' => 'o',\n                'À' => 'A',\n                'Á' => 'A',\n                'Â' => 'A',\n                'Ã' => 'A',\n                'Ä' => 'A',\n                'Å' => 'A',\n                'Æ' => 'AE',\n                'Ç' => 'C',\n                'È' => 'E',\n                'É' => 'E',\n                'Ê' => 'E',\n                'Ë' => 'E',\n                'Ì' => 'I',\n                'Í' => 'I',\n                'Î' => 'I',\n                'Ï' => 'I',\n                'Ð' => 'D',\n                'Ñ' => 'N',\n                'Ò' => 'O',\n                'Ó' => 'O',\n                'Ô' => 'O',\n                'Õ' => 'O',\n                'Ö' => 'O',\n                'Ù' => 'U',\n                'Ú' => 'U',\n                'Û' => 'U',\n                'Ü' => 'U',\n                'Ý' => 'Y',\n                'Þ' => 'TH',\n                'ß' => 's',\n                'à' => 'a',\n                'á' => 'a',\n                'â' => 'a',\n                'ã' => 'a',\n                'ä' => 'a',\n                'å' => 'a',\n                'æ' => 'ae',\n                'ç' => 'c',\n                'è' => 'e',\n                'é' => 'e',\n                'ê' => 'e',\n                'ë' => 'e',\n                'ì' => 'i',\n                'í' => 'i',\n                'î' => 'i',\n                'ï' => 'i',\n                'ð' => 'd',\n                'ñ' => 'n',\n                'ò' => 'o',\n                'ó' => 'o',\n                'ô' => 'o',\n                'õ' => 'o',\n                'ö' => 'o',\n                'ø' => 'o',\n                'ù' => 'u',\n                'ú' => 'u',\n                'û' => 'u',\n                'ü' => 'u',\n                'ý' => 'y',\n                'þ' => 'th',\n                'ÿ' => 'y',\n                'Ø' => 'O',\n                // Decompositions for Latin Extended-A.\n                'Ā' => 'A',\n                'ā' => 'a',\n                'Ă' => 'A',\n                'ă' => 'a',\n                'Ą' => 'A',\n                'ą' => 'a',\n                'Ć' => 'C',\n                'ć' => 'c',\n                'Ĉ' => 'C',\n                'ĉ' => 'c',\n                'Ċ' => 'C',\n                'ċ' => 'c',\n                'Č' => 'C',\n                'č' => 'c',\n                'Ď' => 'D',\n                'ď' => 'd',\n                'Đ' => 'D',\n                'đ' => 'd',\n                'Ē' => 'E',\n                'ē' => 'e',\n                'Ĕ' => 'E',\n                'ĕ' => 'e',\n                'Ė' => 'E',\n                'ė' => 'e',\n                'Ę' => 'E',\n                'ę' => 'e',\n                'Ě' => 'E',\n                'ě' => 'e',\n                'Ĝ' => 'G',\n                'ĝ' => 'g',\n                'Ğ' => 'G',\n                'ğ' => 'g',\n                'Ġ' => 'G',\n                'ġ' => 'g',\n                'Ģ' => 'G',\n                'ģ' => 'g',\n                'Ĥ' => 'H',\n                'ĥ' => 'h',\n                'Ħ' => 'H',\n                'ħ' => 'h',\n                'Ĩ' => 'I',\n                'ĩ' => 'i',\n                'Ī' => 'I',\n                'ī' => 'i',\n                'Ĭ' => 'I',\n                'ĭ' => 'i',\n                'Į' => 'I',\n                'į' => 'i',\n                'İ' => 'I',\n                'ı' => 'i',\n                'Ĳ' => 'IJ',\n                'ĳ' => 'ij',\n                'Ĵ' => 'J',\n                'ĵ' => 'j',\n                'Ķ' => 'K',\n                'ķ' => 'k',\n                'ĸ' => 'k',\n                'Ĺ' => 'L',\n                'ĺ' => 'l',\n                'Ļ' => 'L',\n                'ļ' => 'l',\n                'Ľ' => 'L',\n                'ľ' => 'l',\n                'Ŀ' => 'L',\n                'ŀ' => 'l',\n                'Ł' => 'L',\n                'ł' => 'l',\n                'Ń' => 'N',\n                'ń' => 'n',\n                'Ņ' => 'N',\n                'ņ' => 'n',\n                'Ň' => 'N',\n                'ň' => 'n',\n                'ŉ' => 'n',\n                'Ŋ' => 'N',\n                'ŋ' => 'n',\n                'Ō' => 'O',\n                'ō' => 'o',\n                'Ŏ' => 'O',\n                'ŏ' => 'o',\n                'Ő' => 'O',\n                'ő' => 'o',\n                'Œ' => 'OE',\n                'œ' => 'oe',\n                'Ŕ' => 'R',\n                'ŕ' => 'r',\n                'Ŗ' => 'R',\n                'ŗ' => 'r',\n                'Ř' => 'R',\n                'ř' => 'r',\n                'Ś' => 'S',\n                'ś' => 's',\n                'Ŝ' => 'S',\n                'ŝ' => 's',\n                'Ş' => 'S',\n                'ş' => 's',\n                'Š' => 'S',\n                'š' => 's',\n                'Ţ' => 'T',\n                'ţ' => 't',\n                'Ť' => 'T',\n                'ť' => 't',\n                'Ŧ' => 'T',\n                'ŧ' => 't',\n                'Ũ' => 'U',\n                'ũ' => 'u',\n                'Ū' => 'U',\n                'ū' => 'u',\n                'Ŭ' => 'U',\n                'ŭ' => 'u',\n                'Ů' => 'U',\n                'ů' => 'u',\n                'Ű' => 'U',\n                'ű' => 'u',\n                'Ų' => 'U',\n                'ų' => 'u',\n                'Ŵ' => 'W',\n                'ŵ' => 'w',\n                'Ŷ' => 'Y',\n                'ŷ' => 'y',\n                'Ÿ' => 'Y',\n                'Ź' => 'Z',\n                'ź' => 'z',\n                'Ż' => 'Z',\n                'ż' => 'z',\n                'Ž' => 'Z',\n                'ž' => 'z',\n                'ſ' => 's',\n                // Decompositions for Latin Extended-B.\n                'Ș' => 'S',\n                'ș' => 's',\n                'Ț' => 'T',\n                'ț' => 't',\n                // Euro sign.\n                '€' => 'E',\n                // GBP (Pound) sign.\n                '£' => '',\n                // Vowels with diacritic (Vietnamese).\n                // Unmarked.\n                'Ơ' => 'O',\n                'ơ' => 'o',\n                'Ư' => 'U',\n                'ư' => 'u',\n                // Grave accent.\n                'Ầ' => 'A',\n                'ầ' => 'a',\n                'Ằ' => 'A',\n                'ằ' => 'a',\n                'Ề' => 'E',\n                'ề' => 'e',\n                'Ồ' => 'O',\n                'ồ' => 'o',\n                'Ờ' => 'O',\n                'ờ' => 'o',\n                'Ừ' => 'U',\n                'ừ' => 'u',\n                'Ỳ' => 'Y',\n                'ỳ' => 'y',\n                // Hook.\n                'Ả' => 'A',\n                'ả' => 'a',\n                'Ẩ' => 'A',\n                'ẩ' => 'a',\n                'Ẳ' => 'A',\n                'ẳ' => 'a',\n                'Ẻ' => 'E',\n                'ẻ' => 'e',\n                'Ể' => 'E',\n                'ể' => 'e',\n                'Ỉ' => 'I',\n                'ỉ' => 'i',\n                'Ỏ' => 'O',\n                'ỏ' => 'o',\n                'Ổ' => 'O',\n                'ổ' => 'o',\n                'Ở' => 'O',\n                'ở' => 'o',\n                'Ủ' => 'U',\n                'ủ' => 'u',\n                'Ử' => 'U',\n                'ử' => 'u',\n                'Ỷ' => 'Y',\n                'ỷ' => 'y',\n                // Tilde.\n                'Ẫ' => 'A',\n                'ẫ' => 'a',\n                'Ẵ' => 'A',\n                'ẵ' => 'a',\n                'Ẽ' => 'E',\n                'ẽ' => 'e',\n                'Ễ' => 'E',\n                'ễ' => 'e',\n                'Ỗ' => 'O',\n                'ỗ' => 'o',\n                'Ỡ' => 'O',\n                'ỡ' => 'o',\n                'Ữ' => 'U',\n                'ữ' => 'u',\n                'Ỹ' => 'Y',\n                'ỹ' => 'y',\n                // Acute accent.\n                'Ấ' => 'A',\n                'ấ' => 'a',\n                'Ắ' => 'A',\n                'ắ' => 'a',\n                'Ế' => 'E',\n                'ế' => 'e',\n                'Ố' => 'O',\n                'ố' => 'o',\n                'Ớ' => 'O',\n                'ớ' => 'o',\n                'Ứ' => 'U',\n                'ứ' => 'u',\n                // Dot below.\n                'Ạ' => 'A',\n                'ạ' => 'a',\n                'Ậ' => 'A',\n                'ậ' => 'a',\n                'Ặ' => 'A',\n                'ặ' => 'a',\n                'Ẹ' => 'E',\n                'ẹ' => 'e',\n                'Ệ' => 'E',\n                'ệ' => 'e',\n                'Ị' => 'I',\n                'ị' => 'i',\n                'Ọ' => 'O',\n                'ọ' => 'o',\n                'Ộ' => 'O',\n                'ộ' => 'o',\n                'Ợ' => 'O',\n                'ợ' => 'o',\n                'Ụ' => 'U',\n                'ụ' => 'u',\n                'Ự' => 'U',\n                'ự' => 'u',\n                'Ỵ' => 'Y',\n                'ỵ' => 'y',\n                // Vowels with diacritic (Chinese, Hanyu Pinyin).\n                'ɑ' => 'a',\n                // Macron.\n                'Ǖ' => 'U',\n                'ǖ' => 'u',\n                // Acute accent.\n                'Ǘ' => 'U',\n                'ǘ' => 'u',\n                // Caron.\n                'Ǎ' => 'A',\n                'ǎ' => 'a',\n                'Ǐ' => 'I',\n                'ǐ' => 'i',\n                'Ǒ' => 'O',\n                'ǒ' => 'o',\n                'Ǔ' => 'U',\n                'ǔ' => 'u',\n                'Ǚ' => 'U',\n                'ǚ' => 'u',\n                // Grave accent.\n                'Ǜ' => 'U',\n                'ǜ' => 'u',\n            );\n\n            // Used for locale-specific rules.\n            $locale = get_locale();\n\n            if (in_array($locale, array('de_DE', 'de_DE_formal', 'de_CH', 'de_CH_informal', 'de_AT'), true)) {\n                $chars['Ä'] = 'Ae';\n                $chars['ä'] = 'ae';\n                $chars['Ö'] = 'Oe';\n                $chars['ö'] = 'oe';\n                $chars['Ü'] = 'Ue';\n                $chars['ü'] = 'ue';\n                $chars['ß'] = 'ss';\n            } elseif ('da_DK' === $locale) {\n                $chars['Æ'] = 'Ae';\n                $chars['æ'] = 'ae';\n                $chars['Ø'] = 'Oe';\n                $chars['ø'] = 'oe';\n                $chars['Å'] = 'Aa';\n                $chars['å'] = 'aa';\n            } elseif ('ca' === $locale) {\n                $chars['l·l'] = 'll';\n            } elseif ('sr_RS' === $locale || 'bs_BA' === $locale) {\n                $chars['Đ'] = 'DJ';\n                $chars['đ'] = 'dj';\n            }\n\n            $string = strtr($string, $chars);\n        } else {\n            $chars = array();\n            // Assume ISO-8859-1 if not UTF-8.\n            $chars['in'] = \"\\x80\\x83\\x8a\\x8e\\x9a\\x9e\"\n                . \"\\x9f\\xa2\\xa5\\xb5\\xc0\\xc1\\xc2\"\n                . \"\\xc3\\xc4\\xc5\\xc7\\xc8\\xc9\\xca\"\n                . \"\\xcb\\xcc\\xcd\\xce\\xcf\\xd1\\xd2\"\n                . \"\\xd3\\xd4\\xd5\\xd6\\xd8\\xd9\\xda\"\n                . \"\\xdb\\xdc\\xdd\\xe0\\xe1\\xe2\\xe3\"\n                . \"\\xe4\\xe5\\xe7\\xe8\\xe9\\xea\\xeb\"\n                . \"\\xec\\xed\\xee\\xef\\xf1\\xf2\\xf3\"\n                . \"\\xf4\\xf5\\xf6\\xf8\\xf9\\xfa\\xfb\"\n                . \"\\xfc\\xfd\\xff\";\n\n            $chars['out'] = 'EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy';\n\n            $string = strtr($string, $chars['in'], $chars['out']);\n            $double_chars = array();\n            $double_chars['in'] = array(\"\\x8c\", \"\\x9c\", \"\\xc6\", \"\\xd0\", \"\\xde\", \"\\xdf\", \"\\xe6\", \"\\xf0\", \"\\xfe\");\n            $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');\n            $string = str_replace($double_chars['in'], $double_chars['out'], $string);\n        }\n\n        return $string;\n    }\n}\nif (!function_exists('sanitize_title')) {\n\n    function sanitize_title($title, $fallback_title = '', $context = 'save')\n    {\n        $raw_title = $title;\n\n        if ('save' === $context) {\n            $title = remove_accents($title);\n        }\n\n        /**\n         * Filters a sanitized title string.\n         *\n         * @param string $title Sanitized title.\n         * @param string $raw_title The title prior to sanitization.\n         * @param string $context The context for which the title is being sanitized.\n         * @since 1.2.0\n         *\n         */\n        $title = apply_filters('sanitize_title', $title, $raw_title, $context);\n\n        if ('' === $title || false === $title) {\n            $title = $fallback_title;\n        }\n\n        return $title;\n    }\n}\nglobal $allowedposttags, $allowedtags, $allowedentitynames, $allowedxmlentitynames;\nif (!function_exists('wp_kses_named_entities')) {\n\n    function wp_kses_named_entities($matches)\n    {\n        global $allowedentitynames;\n\n        if (empty($matches[1])) {\n            return '';\n        }\n\n        $i = $matches[1];\n        return (!in_array($i, $allowedentitynames, true)) ? \"&amp;$i;\" : \"&$i;\";\n    }\n}\nif (!function_exists('valid_unicode')) {\n\n    function valid_unicode($i)\n    {\n        return (0x9 == $i || 0xa == $i || 0xd == $i ||\n            (0x20 <= $i && $i <= 0xd7ff) ||\n            (0xe000 <= $i && $i <= 0xfffd) ||\n            (0x10000 <= $i && $i <= 0x10ffff));\n    }\n}\nif (!function_exists('wp_kses_normalize_entities2')) {\n\n    function wp_kses_normalize_entities2($matches)\n    {\n        if (empty($matches[1])) {\n            return '';\n        }\n\n        $i = $matches[1];\n        if (valid_unicode($i)) {\n            $i = str_pad(ltrim($i, '0'), 3, '0', STR_PAD_LEFT);\n            $i = \"&#$i;\";\n        } else {\n            $i = \"&amp;#$i;\";\n        }\n\n        return $i;\n    }\n}\nif (!function_exists('wp_kses_normalize_entities3')) {\n\n    function wp_kses_normalize_entities3($matches)\n    {\n        if (empty($matches[1])) {\n            return '';\n        }\n\n        $hexchars = $matches[1];\n        return (!valid_unicode(hexdec($hexchars))) ? \"&amp;#x$hexchars;\" : '&#x' . ltrim($hexchars, '0') . ';';\n    }\n}\nif (!function_exists('_wp_kses_split_callback')) {\n\n    function _wp_kses_split_callback($match)\n    {\n        global $pass_allowed_html, $pass_allowed_protocols;\n\n        return wp_kses_split2($match[0], $pass_allowed_html, $pass_allowed_protocols);\n    }\n}\nif (!function_exists('wp_kses_stripslashes')) {\n\n    function wp_kses_stripslashes($string)\n    {\n        return preg_replace('%\\\\\\\\\"%', '\"', $string);\n    }\n}\nif (!defined('CUSTOM_TAGS')) {\n    define('CUSTOM_TAGS', false);\n}\nif (!function_exists('wp_kses_allowed_html')) {\n\n    function wp_kses_allowed_html($context = '')\n    {\n        global $allowedposttags, $allowedtags, $allowedentitynames;\n\n        if (is_array($context)) {\n            // When `$context` is an array it's actually an array of allowed HTML elements and attributes.\n            $html = $context;\n            $context = 'explicit';\n\n            /**\n             * Filters the HTML tags that are allowed for a given context.\n             *\n             * @param array[] $html Allowed HTML tags.\n             * @param string $context Context name.\n             * @since 3.5.0\n             *\n             */\n            return apply_filters('wp_kses_allowed_html', $html, $context);\n        }\n\n        switch ($context) {\n            case 'post':\n                /** This filter is documented in wp-includes/kses.php */\n                $tags = apply_filters('wp_kses_allowed_html', $allowedposttags, $context);\n\n                // 5.0.1 removed the `<form>` tag, allow it if a filter is allowing it's sub-elements `<input>` or `<select>`.\n                if (!CUSTOM_TAGS && !isset($tags['form']) && (isset($tags['input']) || isset($tags['select']))) {\n                    $tags = $allowedposttags;\n\n                    $tags['form'] = array(\n                        'action' => true,\n                        'accept' => true,\n                        'accept-charset' => true,\n                        'enctype' => true,\n                        'method' => true,\n                        'name' => true,\n                        'target' => true,\n                    );\n\n                    /** This filter is documented in wp-includes/kses.php */\n                    $tags = apply_filters('wp_kses_allowed_html', $tags, $context);\n                }\n\n                return $tags;\n\n            case 'user_description':\n            case 'pre_user_description':\n                $tags = $allowedtags;\n                $tags['a']['rel'] = true;\n                /** This filter is documented in wp-includes/kses.php */\n                return apply_filters('wp_kses_allowed_html', $tags, $context);\n\n            case 'strip':\n                /** This filter is documented in wp-includes/kses.php */\n                return apply_filters('wp_kses_allowed_html', array(), $context);\n\n            case 'entities':\n                /** This filter is documented in wp-includes/kses.php */\n                return apply_filters('wp_kses_allowed_html', $allowedentitynames, $context);\n\n            case 'data':\n            default:\n                /** This filter is documented in wp-includes/kses.php */\n                return apply_filters('wp_kses_allowed_html', $allowedtags, $context);\n        }\n    }\n}\nif (!function_exists('wp_kses_uri_attributes')) {\n\n    function wp_kses_uri_attributes()\n    {\n        $uri_attributes = array(\n            'action',\n            'archive',\n            'background',\n            'cite',\n            'classid',\n            'codebase',\n            'data',\n            'formaction',\n            'href',\n            'icon',\n            'longdesc',\n            'manifest',\n            'poster',\n            'profile',\n            'src',\n            'usemap',\n            'xmlns',\n        );\n\n        /**\n         * Filters the list of attributes that are required to contain a URL.\n         *\n         * Use this filter to add any `data-` attributes that are required to be\n         * validated as a URL.\n         *\n         * @param string[] $uri_attributes HTML attribute names whose value contains a URL.\n         * @since 5.0.1\n         *\n         */\n        $uri_attributes = apply_filters('wp_kses_uri_attributes', $uri_attributes);\n\n        return $uri_attributes;\n    }\n}\nif (!function_exists('wp_kses_bad_protocol_once')) {\n\n    function wp_kses_bad_protocol_once($string, $allowed_protocols, $count = 1)\n    {\n        $string = preg_replace('/(&#0*58(?![;0-9])|&#x0*3a(?![;a-f0-9]))/i', '$1;', $string);\n        $string2 = preg_split('/:|&#0*58;|&#x0*3a;|&colon;/i', $string, 2);\n        if (isset($string2[1]) && !preg_match('%/\\?%', $string2[0])) {\n            $string = trim($string2[1]);\n            $protocol = wp_kses_bad_protocol_once2($string2[0], $allowed_protocols);\n            if ('feed:' === $protocol) {\n                if ($count > 2) {\n                    return '';\n                }\n                $string = wp_kses_bad_protocol_once($string, $allowed_protocols, ++$count);\n                if (empty($string)) {\n                    return $string;\n                }\n            }\n            $string = $protocol . $string;\n        }\n\n        return $string;\n    }\n}\nif (!function_exists('wp_kses_decode_entities')) {\n\n    function wp_kses_decode_entities($string)\n    {\n        $string = preg_replace_callback('/&#([0-9]+);/', '_wp_kses_decode_entities_chr', $string);\n        $string = preg_replace_callback('/&#[Xx]([0-9A-Fa-f]+);/', '_wp_kses_decode_entities_chr_hexdec', $string);\n\n        return $string;\n    }\n}\nif (!function_exists('wp_kses_bad_protocol_once2')) {\n\n    function wp_kses_bad_protocol_once2($string, $allowed_protocols)\n    {\n        $string2 = wp_kses_decode_entities($string);\n        $string2 = preg_replace('/\\s/', '', $string2);\n        $string2 = wp_kses_no_null($string2);\n        $string2 = strtolower($string2);\n\n        $allowed = false;\n        foreach ((array)$allowed_protocols as $one_protocol) {\n            if (strtolower($one_protocol) == $string2) {\n                $allowed = true;\n                break;\n            }\n        }\n\n        if ($allowed) {\n            return \"$string2:\";\n        } else {\n            return '';\n        }\n    }\n}\nif (!function_exists('wp_kses_bad_protocol')) {\n\n    function wp_kses_bad_protocol($string, $allowed_protocols)\n    {\n        $string = wp_kses_no_null($string);\n        $iterations = 0;\n\n        do {\n            $original_string = $string;\n            $string = wp_kses_bad_protocol_once($string, $allowed_protocols);\n        } while ($original_string != $string && ++$iterations < 6);\n\n        if ($original_string != $string) {\n            return '';\n        }\n\n        return $string;\n    }\n}\nif (!function_exists('wp_kses_hair')) {\n\n    function wp_kses_hair($attr, $allowed_protocols)\n    {\n        $attrarr = array();\n        $mode = 0;\n        $attrname = '';\n        $uris = wp_kses_uri_attributes();\n\n        // Loop through the whole attribute list.\n\n        while (strlen($attr) != 0) {\n            $working = 0; // Was the last operation successful?\n\n            switch ($mode) {\n                case 0:\n                    if (preg_match('/^([_a-zA-Z][-_a-zA-Z0-9:.]*)/', $attr, $match)) {\n                        $attrname = $match[1];\n                        $working = 1;\n                        $mode = 1;\n                        $attr = preg_replace('/^[_a-zA-Z][-_a-zA-Z0-9:.]*/', '', $attr);\n                    }\n\n                    break;\n\n                case 1:\n                    if (preg_match('/^\\s*=\\s*/', $attr)) { // Equals sign.\n                        $working = 1;\n                        $mode = 2;\n                        $attr = preg_replace('/^\\s*=\\s*/', '', $attr);\n                        break;\n                    }\n\n                    if (preg_match('/^\\s+/', $attr)) { // Valueless.\n                        $working = 1;\n                        $mode = 0;\n                        if (false === array_key_exists($attrname, $attrarr)) {\n                            $attrarr[$attrname] = array(\n                                'name' => $attrname,\n                                'value' => '',\n                                'whole' => $attrname,\n                                'vless' => 'y',\n                            );\n                        }\n                        $attr = preg_replace('/^\\s+/', '', $attr);\n                    }\n\n                    break;\n\n                case 2:\n                    if (preg_match('%^\"([^\"]*)\"(\\s+|/?$)%', $attr, $match)) {\n                        // \"value\"\n                        $thisval = $match[1];\n                        if (in_array(strtolower($attrname), $uris, true)) {\n                            $thisval = wp_kses_bad_protocol($thisval, $allowed_protocols);\n                        }\n\n                        if (false === array_key_exists($attrname, $attrarr)) {\n                            $attrarr[$attrname] = array(\n                                'name' => $attrname,\n                                'value' => $thisval,\n                                'whole' => \"$attrname=\\\"$thisval\\\"\",\n                                'vless' => 'n',\n                            );\n                        }\n                        $working = 1;\n                        $mode = 0;\n                        $attr = preg_replace('/^\"[^\"]*\"(\\s+|$)/', '', $attr);\n                        break;\n                    }\n\n                    if (preg_match(\"%^'([^']*)'(\\s+|/?$)%\", $attr, $match)) {\n                        // 'value'\n                        $thisval = $match[1];\n                        if (in_array(strtolower($attrname), $uris, true)) {\n                            $thisval = wp_kses_bad_protocol($thisval, $allowed_protocols);\n                        }\n\n                        if (false === array_key_exists($attrname, $attrarr)) {\n                            $attrarr[$attrname] = array(\n                                'name' => $attrname,\n                                'value' => $thisval,\n                                'whole' => \"$attrname='$thisval'\",\n                                'vless' => 'n',\n                            );\n                        }\n                        $working = 1;\n                        $mode = 0;\n                        $attr = preg_replace(\"/^'[^']*'(\\s+|$)/\", '', $attr);\n                        break;\n                    }\n\n                    if (preg_match(\"%^([^\\s\\\"']+)(\\s+|/?$)%\", $attr, $match)) {\n                        // value\n                        $thisval = $match[1];\n                        if (in_array(strtolower($attrname), $uris, true)) {\n                            $thisval = wp_kses_bad_protocol($thisval, $allowed_protocols);\n                        }\n\n                        if (false === array_key_exists($attrname, $attrarr)) {\n                            $attrarr[$attrname] = array(\n                                'name' => $attrname,\n                                'value' => $thisval,\n                                'whole' => \"$attrname=\\\"$thisval\\\"\",\n                                'vless' => 'n',\n                            );\n                        }\n                        // We add quotes to conform to W3C's HTML spec.\n                        $working = 1;\n                        $mode = 0;\n                        $attr = preg_replace(\"%^[^\\s\\\"']+(\\s+|$)%\", '', $attr);\n                    }\n\n                    break;\n            } // End switch.\n\n            if (0 == $working) { // Not well-formed, remove and try again.\n                $attr = wp_kses_html_error($attr);\n                $mode = 0;\n            }\n        } // End while.\n\n        if (1 == $mode && false === array_key_exists($attrname, $attrarr)) {\n            // Special case, for when the attribute list ends with a valueless\n            // attribute like \"selected\".\n            $attrarr[$attrname] = array(\n                'name' => $attrname,\n                'value' => '',\n                'whole' => $attrname,\n                'vless' => 'y',\n            );\n        }\n\n        return $attrarr;\n    }\n}\nif (!function_exists('wp_kses_html_error')) {\n\n    function wp_kses_html_error($string)\n    {\n        return preg_replace('/^(\"[^\"]*(\"|$)|\\'[^\\']*(\\'|$)|\\S)*\\s*/', '', $string);\n    }\n}\nif (!function_exists('wp_kses_attr')) {\n\n    function wp_kses_attr($element, $attr, $allowed_html, $allowed_protocols)\n    {\n        if (!is_array($allowed_html)) {\n            $allowed_html = wp_kses_allowed_html($allowed_html);\n        }\n\n        // Is there a closing XHTML slash at the end of the attributes?\n        $xhtml_slash = '';\n        if (preg_match('%\\s*/\\s*$%', $attr)) {\n            $xhtml_slash = ' /';\n        }\n\n        // Are any attributes allowed at all for this element?\n        $element_low = strtolower($element);\n        if (empty($allowed_html[$element_low]) || true === $allowed_html[$element_low]) {\n            return \"<$element$xhtml_slash>\";\n        }\n\n        // Split it.\n        $attrarr = wp_kses_hair($attr, $allowed_protocols);\n\n        // Check if there are attributes that are required.\n        $required_attrs = array_filter(\n            $allowed_html[$element_low],\n            function ($required_attr_limits) {\n                return isset($required_attr_limits['required']) && true === $required_attr_limits['required'];\n            }\n        );\n\n        /*\n         * If a required attribute check fails, we can return nothing for a self-closing tag,\n         * but for a non-self-closing tag the best option is to return the element with attributes,\n         * as KSES doesn't handle matching the relevant closing tag.\n         */\n        $stripped_tag = '';\n        if (empty($xhtml_slash)) {\n            $stripped_tag = \"<$element>\";\n        }\n\n        // Go through $attrarr, and save the allowed attributes for this element in $attr2.\n        $attr2 = '';\n        foreach ($attrarr as $arreach) {\n            // Check if this attribute is required.\n            $required = isset($required_attrs[strtolower($arreach['name'])]);\n\n            if (wp_kses_attr_check($arreach['name'], $arreach['value'], $arreach['whole'], $arreach['vless'], $element, $allowed_html)) {\n                $attr2 .= ' ' . $arreach['whole'];\n\n                // If this was a required attribute, we can mark it as found.\n                if ($required) {\n                    unset($required_attrs[strtolower($arreach['name'])]);\n                }\n            } elseif ($required) {\n                // This attribute was required, but didn't pass the check. The entire tag is not allowed.\n                return $stripped_tag;\n            }\n        }\n\n        // If some required attributes weren't set, the entire tag is not allowed.\n        if (!empty($required_attrs)) {\n            return $stripped_tag;\n        }\n\n        // Remove any \"<\" or \">\" characters.\n        $attr2 = preg_replace('/[<>]/', '', $attr2);\n\n        return \"<$element$attr2$xhtml_slash>\";\n    }\n}\nif (!function_exists('wp_kses_attr_check')) {\n\n    function wp_kses_attr_check(&$name, &$value, &$whole, $vless, $element, $allowed_html)\n    {\n        $name_low = strtolower($name);\n        $element_low = strtolower($element);\n\n        if (!isset($allowed_html[$element_low])) {\n            $name = '';\n            $value = '';\n            $whole = '';\n            return false;\n        }\n\n        $allowed_attr = $allowed_html[$element_low];\n\n        if (!isset($allowed_attr[$name_low]) || '' === $allowed_attr[$name_low]) {\n            /*\n             * Allow `data-*` attributes.\n             *\n             * When specifying `$allowed_html`, the attribute name should be set as\n             * `data-*` (not to be mixed with the HTML 4.0 `data` attribute, see\n             * https://www.w3.org/TR/html40/struct/objects.html#adef-data).\n             *\n             * Note: the attribute name should only contain `A-Za-z0-9_-` chars,\n             * double hyphens `--` are not accepted by WordPress.\n             */\n            if (strpos($name_low, 'data-') === 0 && !empty($allowed_attr['data-*']) && preg_match('/^data(?:-[a-z0-9_]+)+$/', $name_low, $match)) {\n                /*\n                 * Add the whole attribute name to the allowed attributes and set any restrictions\n                 * for the `data-*` attribute values for the current element.\n                 */\n                $allowed_attr[$match[0]] = $allowed_attr['data-*'];\n            } else {\n                $name = '';\n                $value = '';\n                $whole = '';\n                return false;\n            }\n        }\n\n        if ('style' === $name_low) {\n            $new_value = safecss_filter_attr($value);\n\n            if (empty($new_value)) {\n                $name = '';\n                $value = '';\n                $whole = '';\n                return false;\n            }\n\n            $whole = str_replace($value, $new_value, $whole);\n            $value = $new_value;\n        }\n\n        if (is_array($allowed_attr[$name_low])) {\n            // There are some checks.\n            foreach ($allowed_attr[$name_low] as $currkey => $currval) {\n                if (!wp_kses_check_attr_val($value, $vless, $currkey, $currval)) {\n                    $name = '';\n                    $value = '';\n                    $whole = '';\n                    return false;\n                }\n            }\n        }\n\n        return true;\n    }\n}\nif (!function_exists('wp_kses_check_attr_val')) {\n\n    function wp_kses_check_attr_val($value, $vless, $checkname, $checkvalue)\n    {\n        $ok = true;\n\n        switch (strtolower($checkname)) {\n            case 'maxlen':\n                /*\n                 * The maxlen check makes sure that the attribute value has a length not\n                 * greater than the given value. This can be used to avoid Buffer Overflows\n                 * in WWW clients and various Internet servers.\n                 */\n\n                if (strlen($value) > $checkvalue) {\n                    $ok = false;\n                }\n                break;\n\n            case 'minlen':\n                /*\n                 * The minlen check makes sure that the attribute value has a length not\n                 * smaller than the given value.\n                 */\n\n                if (strlen($value) < $checkvalue) {\n                    $ok = false;\n                }\n                break;\n\n            case 'maxval':\n                /*\n                 * The maxval check does two things: it checks that the attribute value is\n                 * an integer from 0 and up, without an excessive amount of zeroes or\n                 * whitespace (to avoid Buffer Overflows). It also checks that the attribute\n                 * value is not greater than the given value.\n                 * This check can be used to avoid Denial of Service attacks.\n                 */\n\n                if (!preg_match('/^\\s{0,6}[0-9]{1,6}\\s{0,6}$/', $value)) {\n                    $ok = false;\n                }\n                if ($value > $checkvalue) {\n                    $ok = false;\n                }\n                break;\n\n            case 'minval':\n                /*\n                 * The minval check makes sure that the attribute value is a positive integer,\n                 * and that it is not smaller than the given value.\n                 */\n\n                if (!preg_match('/^\\s{0,6}[0-9]{1,6}\\s{0,6}$/', $value)) {\n                    $ok = false;\n                }\n                if ($value < $checkvalue) {\n                    $ok = false;\n                }\n                break;\n\n            case 'valueless':\n                /*\n                 * The valueless check makes sure if the attribute has a value\n                 * (like `<a href=\"blah\">`) or not (`<option selected>`). If the given value\n                 * is a \"y\" or a \"Y\", the attribute must not have a value.\n                 * If the given value is an \"n\" or an \"N\", the attribute must have a value.\n                 */\n\n                if (strtolower($checkvalue) != $vless) {\n                    $ok = false;\n                }\n                break;\n\n            case 'values':\n                /*\n                 * The values check is used when you want to make sure that the attribute\n                 * has one of the given values.\n                 */\n\n                if (false === array_search(strtolower($value), $checkvalue, true)) {\n                    $ok = false;\n                }\n                break;\n\n            case 'value_callback':\n                /*\n                 * The value_callback check is used when you want to make sure that the attribute\n                 * value is accepted by the callback function.\n                 */\n\n                if (!call_user_func($checkvalue, $value)) {\n                    $ok = false;\n                }\n                break;\n        } // End switch.\n\n        return $ok;\n    }\n}\nif (!function_exists('safecss_filter_attr')) {\n\n    function safecss_filter_attr($css, $deprecated = '')\n    {\n\n        $css = wp_kses_no_null($css);\n        $css = str_replace(array(\"\\n\", \"\\r\", \"\\t\"), '', $css);\n\n        $allowed_protocols = wp_allowed_protocols();\n\n        $css_array = explode(';', trim($css));\n\n        /**\n         * Filters the list of allowed CSS attributes.\n         *\n         * @param string[] $attr Array of allowed CSS attributes.\n         * @since 2.8.1\n         *\n         */\n        $allowed_attr = apply_filters(\n            'safe_style_css',\n            array(\n                'background',\n                'background-color',\n                'background-image',\n                'background-position',\n                'background-size',\n                'background-attachment',\n                'background-blend-mode',\n\n                'border',\n                'border-radius',\n                'border-width',\n                'border-color',\n                'border-style',\n                'border-right',\n                'border-right-color',\n                'border-right-style',\n                'border-right-width',\n                'border-bottom',\n                'border-bottom-color',\n                'border-bottom-left-radius',\n                'border-bottom-right-radius',\n                'border-bottom-style',\n                'border-bottom-width',\n                'border-bottom-right-radius',\n                'border-bottom-left-radius',\n                'border-left',\n                'border-left-color',\n                'border-left-style',\n                'border-left-width',\n                'border-top',\n                'border-top-color',\n                'border-top-left-radius',\n                'border-top-right-radius',\n                'border-top-style',\n                'border-top-width',\n                'border-top-left-radius',\n                'border-top-right-radius',\n\n                'border-spacing',\n                'border-collapse',\n                'caption-side',\n\n                'columns',\n                'column-count',\n                'column-fill',\n                'column-gap',\n                'column-rule',\n                'column-span',\n                'column-width',\n\n                'color',\n                'filter',\n                'font',\n                'font-family',\n                'font-size',\n                'font-style',\n                'font-variant',\n                'font-weight',\n                'letter-spacing',\n                'line-height',\n                'text-align',\n                'text-decoration',\n                'text-indent',\n                'text-transform',\n\n                'height',\n                'min-height',\n                'max-height',\n\n                'width',\n                'min-width',\n                'max-width',\n\n                'margin',\n                'margin-right',\n                'margin-bottom',\n                'margin-left',\n                'margin-top',\n\n                'padding',\n                'padding-right',\n                'padding-bottom',\n                'padding-left',\n                'padding-top',\n\n                'flex',\n                'flex-basis',\n                'flex-direction',\n                'flex-flow',\n                'flex-grow',\n                'flex-shrink',\n\n                'grid-template-columns',\n                'grid-auto-columns',\n                'grid-column-start',\n                'grid-column-end',\n                'grid-column-gap',\n                'grid-template-rows',\n                'grid-auto-rows',\n                'grid-row-start',\n                'grid-row-end',\n                'grid-row-gap',\n                'grid-gap',\n\n                'justify-content',\n                'justify-items',\n                'justify-self',\n                'align-content',\n                'align-items',\n                'align-self',\n\n                'clear',\n                'cursor',\n                'direction',\n                'float',\n                'list-style-type',\n                'object-position',\n                'overflow',\n                'vertical-align',\n            )\n        );\n\n        /*\n         * CSS attributes that accept URL data types.\n         *\n         * This is in accordance to the CSS spec and unrelated to\n         * the sub-set of supported attributes above.\n         *\n         * See: https://developer.mozilla.org/en-US/docs/Web/CSS/url\n         */\n        $css_url_data_types = array(\n            'background',\n            'background-image',\n\n            'cursor',\n\n            'list-style',\n            'list-style-image',\n        );\n\n        /*\n         * CSS attributes that accept gradient data types.\n         *\n         */\n        $css_gradient_data_types = array(\n            'background',\n            'background-image',\n        );\n\n        if (empty($allowed_attr)) {\n            return $css;\n        }\n\n        $css = '';\n        foreach ($css_array as $css_item) {\n            if ('' === $css_item) {\n                continue;\n            }\n\n            $css_item = trim($css_item);\n            $css_test_string = $css_item;\n            $found = false;\n            $url_attr = false;\n            $gradient_attr = false;\n\n            if (strpos($css_item, ':') === false) {\n                $found = true;\n            } else {\n                $parts = explode(':', $css_item, 2);\n                $css_selector = trim($parts[0]);\n\n                if (in_array($css_selector, $allowed_attr, true)) {\n                    $found = true;\n                    $url_attr = in_array($css_selector, $css_url_data_types, true);\n                    $gradient_attr = in_array($css_selector, $css_gradient_data_types, true);\n                }\n            }\n\n            if ($found && $url_attr) {\n                // Simplified: matches the sequence `url(*)`.\n                preg_match_all('/url\\([^)]+\\)/', $parts[1], $url_matches);\n\n                foreach ($url_matches[0] as $url_match) {\n                    // Clean up the URL from each of the matches above.\n                    preg_match('/^url\\(\\s*([\\'\\\"]?)(.*)(\\g1)\\s*\\)$/', $url_match, $url_pieces);\n\n                    if (empty($url_pieces[2])) {\n                        $found = false;\n                        break;\n                    }\n\n                    $url = trim($url_pieces[2]);\n\n                    if (empty($url) || wp_kses_bad_protocol($url, $allowed_protocols) !== $url) {\n                        $found = false;\n                        break;\n                    } else {\n                        // Remove the whole `url(*)` bit that was matched above from the CSS.\n                        $css_test_string = str_replace($url_match, '', $css_test_string);\n                    }\n                }\n            }\n\n            if ($found && $gradient_attr) {\n                $css_value = trim($parts[1]);\n                if (preg_match('/^(repeating-)?(linear|radial|conic)-gradient\\(([^()]|rgb[a]?\\([^()]*\\))*\\)$/', $css_value)) {\n                    // Remove the whole `gradient` bit that was matched above from the CSS.\n                    $css_test_string = str_replace($css_value, '', $css_test_string);\n                }\n            }\n\n            if ($found) {\n                // Allow CSS calc().\n                $css_test_string = preg_replace('/calc\\(((?:\\([^()]*\\)?|[^()])*)\\)/', '', $css_test_string);\n                // Allow CSS var().\n                $css_test_string = preg_replace('/\\(?var\\(--[a-zA-Z0-9_-]*\\)/', '', $css_test_string);\n\n                // Check for any CSS containing \\ ( & } = or comments,\n                // except for url(), calc(), or var() usage checked above.\n                $allow_css = !preg_match('%[\\\\\\(&=}]|/\\*%', $css_test_string);\n\n                /**\n                 * Filters the check for unsafe CSS in `safecss_filter_attr`.\n                 *\n                 * Enables developers to determine whether a section of CSS should be allowed or discarded.\n                 * By default, the value will be false if the part contains \\ ( & } = or comments.\n                 * Return true to allow the CSS part to be included in the output.\n                 *\n                 * @param bool $allow_css Whether the CSS in the test string is considered safe.\n                 * @param string $css_test_string The CSS string to test.\n                 * @since 5.5.0\n                 *\n                 */\n                $allow_css = apply_filters('safecss_filter_attr_allow_css', $allow_css, $css_test_string);\n\n                // Only add the CSS part if it passes the regex check.\n                if ($allow_css) {\n                    if ('' !== $css) {\n                        $css .= ';';\n                    }\n\n                    $css .= $css_item;\n                }\n            }\n        }\n\n        return $css;\n    }\n}\nif (!function_exists('wp_kses_split2')) {\n\n    function wp_kses_split2($string, $allowed_html, $allowed_protocols)\n    {\n        $string = wp_kses_stripslashes($string);\n\n        // It matched a \">\" character.\n        if ('<' !== substr($string, 0, 1)) {\n            return '&gt;';\n        }\n\n        // Allow HTML comments.\n        if ('<!--' === substr($string, 0, 4)) {\n            $string = str_replace(array('<!--', '-->'), '', $string);\n            while (($newstring = wp_kses($string, $allowed_html, $allowed_protocols)) != $string) {\n                $string = $newstring;\n            }\n            if ('' === $string) {\n                return '';\n            }\n            // Prevent multiple dashes in comments.\n            $string = preg_replace('/--+/', '-', $string);\n            // Prevent three dashes closing a comment.\n            $string = preg_replace('/-$/', '', $string);\n            return \"<!--{$string}-->\";\n        }\n\n        // It's seriously malformed.\n        if (!preg_match('%^<\\s*(/\\s*)?([a-zA-Z0-9-]+)([^>]*)>?$%', $string, $matches)) {\n            return '';\n        }\n\n        $slash = trim($matches[1]);\n        $elem = $matches[2];\n        $attrlist = $matches[3];\n\n        if (!is_array($allowed_html)) {\n            $allowed_html = wp_kses_allowed_html($allowed_html);\n        }\n\n        // They are using a not allowed HTML element.\n        if (!isset($allowed_html[strtolower($elem)])) {\n            return '';\n        }\n\n        // No attributes are allowed for closing elements.\n        if ('' !== $slash) {\n            return \"</$elem>\";\n        }\n\n        return wp_kses_attr($elem, $attrlist, $allowed_html, $allowed_protocols);\n    }\n}\nif (!function_exists('_wp_kses_decode_entities_chr_hexdec')) {\n\n    function _wp_kses_decode_entities_chr_hexdec($match)\n    {\n        return chr(hexdec($match[1]));\n    }\n}\nif (!function_exists('_wp_kses_decode_entities_chr')) {\n\n    function _wp_kses_decode_entities_chr($match)\n    {\n        return chr($match[1]);\n    }\n}\nif (!function_exists('_deep_replace')) {\n\n    function _deep_replace($search, $subject)\n    {\n        $subject = (string)$subject;\n\n        $count = 1;\n        while ($count) {\n            $subject = str_replace($search, '', $subject, $count);\n        }\n\n        return $subject;\n    }\n}\nif (!function_exists('_wp_translate_php_url_constant_to_key')) {\n\n    function _wp_translate_php_url_constant_to_key($constant)\n    {\n        $translation = array(\n            PHP_URL_SCHEME => 'scheme',\n            PHP_URL_HOST => 'host',\n            PHP_URL_PORT => 'port',\n            PHP_URL_USER => 'user',\n            PHP_URL_PASS => 'pass',\n            PHP_URL_PATH => 'path',\n            PHP_URL_QUERY => 'query',\n            PHP_URL_FRAGMENT => 'fragment',\n        );\n\n        if (isset($translation[$constant])) {\n            return $translation[$constant];\n        } else {\n            return false;\n        }\n    }\n}\nif (!function_exists('_get_component_from_parsed_url_array')) {\n\n    function _get_component_from_parsed_url_array($url_parts, $component = -1)\n    {\n        if (-1 === $component) {\n            return $url_parts;\n        }\n\n        $key = _wp_translate_php_url_constant_to_key($component);\n        if (false !== $key && is_array($url_parts) && isset($url_parts[$key])) {\n            return $url_parts[$key];\n        } else {\n            return null;\n        }\n    }\n}\nif (!function_exists('wp_parse_url')) {\n\n    function wp_parse_url($url, $component = -1)\n    {\n        $to_unset = array();\n        $url = (string)$url;\n\n        if ('//' === substr($url, 0, 2)) {\n            $to_unset[] = 'scheme';\n            $url = 'placeholder:' . $url;\n        } elseif ('/' === substr($url, 0, 1)) {\n            $to_unset[] = 'scheme';\n            $to_unset[] = 'host';\n            $url = 'placeholder://placeholder' . $url;\n        }\n\n        $parts = parse_url($url);\n\n        if (false === $parts) {\n            // Parsing failure.\n            return $parts;\n        }\n\n        // Remove the placeholder values.\n        foreach ($to_unset as $key) {\n            unset($parts[$key]);\n        }\n\n        return _get_component_from_parsed_url_array($parts, $component);\n    }\n}\nif (!function_exists('esc_url')) {\n\n    function esc_url($url, $protocols = null, $_context = 'display')\n    {\n        $original_url = $url;\n\n        if ('' === $url) {\n            return $url;\n        }\n\n        $url = str_replace(' ', '%20', ltrim($url));\n        $url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\\|*\\'()\\[\\]\\\\x80-\\\\xff]|i', '', $url);\n\n        if ('' === $url) {\n            return $url;\n        }\n\n        if (0 !== stripos($url, 'mailto:')) {\n            $strip = array('%0d', '%0a', '%0D', '%0A');\n            $url = _deep_replace($strip, $url);\n        }\n\n        $url = str_replace(';//', '://', $url);\n        /*\n         * If the URL doesn't appear to contain a scheme, we presume\n         * it needs http:// prepended (unless it's a relative link\n         * starting with /, # or ?, or a PHP file).\n         */\n        if (strpos($url, ':') === false && !in_array($url[0], array('/', '#', '?'), true) &&\n            !preg_match('/^[a-z0-9-]+?\\.php/i', $url)) {\n            $url = 'http://' . $url;\n        }\n\n        // Replace ampersands and single quotes only when displaying.\n        if ('display' === $_context) {\n            $url = wp_kses_normalize_entities($url);\n            $url = str_replace('&amp;', '&#038;', $url);\n            $url = str_replace(\"'\", '&#039;', $url);\n        }\n\n        if ((false !== strpos($url, '[')) || (false !== strpos($url, ']'))) {\n\n            $parsed = wp_parse_url($url);\n            $front = '';\n\n            if (isset($parsed['scheme'])) {\n                $front .= $parsed['scheme'] . '://';\n            } elseif ('/' === $url[0]) {\n                $front .= '//';\n            }\n\n            if (isset($parsed['user'])) {\n                $front .= $parsed['user'];\n            }\n\n            if (isset($parsed['pass'])) {\n                $front .= ':' . $parsed['pass'];\n            }\n\n            if (isset($parsed['user']) || isset($parsed['pass'])) {\n                $front .= '@';\n            }\n\n            if (isset($parsed['host'])) {\n                $front .= $parsed['host'];\n            }\n\n            if (isset($parsed['port'])) {\n                $front .= ':' . $parsed['port'];\n            }\n\n            $end_dirty = str_replace($front, '', $url);\n            $end_clean = str_replace(array('[', ']'), array('%5B', '%5D'), $end_dirty);\n            $url = str_replace($end_dirty, $end_clean, $url);\n\n        }\n\n        if ('/' === $url[0]) {\n            $good_protocol_url = $url;\n        } else {\n            if (!is_array($protocols)) {\n                $protocols = wp_allowed_protocols();\n            }\n            $good_protocol_url = wp_kses_bad_protocol($url, $protocols);\n            if (strtolower($good_protocol_url) != strtolower($url)) {\n                return '';\n            }\n        }\n\n        /**\n         * Filters a string cleaned and escaped for output as a URL.\n         *\n         * @param string $good_protocol_url The cleaned URL to be returned.\n         * @param string $original_url The URL prior to cleaning.\n         * @param string $_context If 'display', replace ampersands and single quotes only.\n         * @since 2.3.0\n         *\n         */\n        return apply_filters('clean_url', $good_protocol_url, $original_url, $_context);\n    }\n}\nif (!function_exists('__checked_selected_helper')) {\n\n    function __checked_selected_helper($helper, $current, $echo, $type)\n    { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore\n        if ((string)$helper === (string)$current) {\n            $result = \" $type='$type'\";\n        } else {\n            $result = '';\n        }\n\n        if ($echo) {\n            echo $result;\n        }\n\n        return $result;\n    }\n}\nif (!function_exists('checked')) {\n\n    function checked($checked, $current = true, $echo = true)\n    {\n        return __checked_selected_helper($checked, $current, $echo, 'checked');\n    }\n}\nif (!function_exists('selected')) {\n\n    function selected($selected, $current = true, $echo = true)\n    {\n        return __checked_selected_helper($selected, $current, $echo, 'selected');\n    }\n}\nif (!function_exists('disabled')) {\n\n    function disabled($disabled, $current = true, $echo = true)\n    {\n        return __checked_selected_helper($disabled, $current, $echo, 'disabled');\n    }\n}\nif (!function_exists('wp_readonly')) {\n\n    function wp_readonly($readonly, $current = true, $echo = true)\n    {\n        return __checked_selected_helper($readonly, $current, $echo, 'readonly');\n    }\n}\n\nif (!function_exists('is_rtl')) {\n\n    function is_rtl()\n    {\n        // nont support this mode\n        return false;\n    }\n}\n/**\n * Returns the time-dependent variable for nonce creation.\n *\n * A nonce has a lifespan of two ticks. Nonces in their second tick may be\n * updated, e.g. by autosave.\n *\n * @return float Float value rounded up to the next highest integer.\n * @since 2.5.0\n *\n */\nif (!defined('MINUTE_IN_SECONDS')){\n    define('MINUTE_IN_SECONDS', 60);\n}\nif (!defined('HOUR_IN_SECONDS')){\n    define('HOUR_IN_SECONDS', 60 * MINUTE_IN_SECONDS);\n}\nif (!defined('DAY_IN_SECONDS')){\n    define('DAY_IN_SECONDS', 24 * HOUR_IN_SECONDS);\n}\nif (!defined('WEEK_IN_SECONDS')){\n    define('WEEK_IN_SECONDS', 7 * DAY_IN_SECONDS);\n}\nif (!defined('MONTH_IN_SECONDS')){\n    define('MONTH_IN_SECONDS', 30 * DAY_IN_SECONDS);\n}\nif (!defined('YEAR_IN_SECONDS')){\n    define('YEAR_IN_SECONDS', 365 * DAY_IN_SECONDS);\n}\nif (!function_exists('wp_nonce_tick')) :\n\n    function wp_nonce_tick()\n    {\n        /**\n         * Filters the lifespan of nonces in seconds.\n         *\n         * @param int $lifespan Lifespan of nonces in seconds. Default 86,400 seconds, or one day.\n         * @since 2.5.0\n         *\n         */\n        $nonce_life = apply_filters('nonce_life', DAY_IN_SECONDS);\n\n        return ceil(time() / ($nonce_life / 2));\n    }\nendif;\n\n\nif (!function_exists('wp_create_nonce')) :\n    /**\n     * Creates a cryptographic token tied to a specific action, user, user session,\n     * and window of time.\n     *\n     * @param string|int $action Scalar value to add context to the nonce.\n     * @return string The token.\n     * @since 2.0.3\n     * @since 4.0.0 Session tokens were integrated with nonce creation\n     *\n     */\n    function wp_create_nonce($action = -1)\n    {\n        // todo:add token\n//        $user = wp_get_current_user();\n//        $uid  = (int) $user->ID;\n        $uid = 0;\n        if (!$uid) {\n            /** This filter is documented in wp-includes/pluggable.php */\n            $uid = apply_filters('nonce_user_logged_out', $uid, $action);\n        }\n\n//        $token = wp_get_session_token();\n        $token = 'todotoken';\n        $i = wp_nonce_tick();\n\n        return substr(\\Typecho\\Common::hash($i . '|' . $action . '|' . $uid . '|' . $token, 'nonce'), -12, 10);\n    }\nendif;\nif (!function_exists('get_locale')) :\n    function get_locale()\n    {\n        return 'zh_CN';\n    }\n\nendif;\nif (!function_exists('absint')) {\n\n    function absint($maybeint)\n    {\n        return abs((int)$maybeint);\n    }\n}\nif (!function_exists('get_post_type_object')) {\n\n    function get_post_type_object($post_type)\n    {\n        // todo:fix global\n        global $wp_post_types;\n\n        if (!is_scalar($post_type) || empty($wp_post_types[$post_type])) {\n            return null;\n        }\n\n        return $wp_post_types[$post_type];\n    }\n}\nif (!function_exists('ty_is_admin')) {\n\n    function ty_is_admin()\n    {\n        $user = Widget::widget('Widget_User');\n        return $user->pass('administrator', false);\n    }\n}\nif (!function_exists('sanitize_key')) {\n\n    function sanitize_key($key)\n    {\n        $sanitized_key = '';\n\n        if (is_scalar($key)) {\n            $sanitized_key = strtolower($key);\n            $sanitized_key = preg_replace('/[^a-z0-9_\\-]/', '', $sanitized_key);\n        }\n\n        /**\n         * Filters a sanitized key string.\n         *\n         * @param string $sanitized_key Sanitized key.\n         * @param string $key The key prior to sanitization.\n         * @since 3.0.0\n         *\n         */\n        return apply_filters('sanitize_key', $sanitized_key, $key);\n    }\n}\nif (!function_exists('is_wp_error')) {\n\n    function is_wp_error($thing)\n    {\n        // todo:check this func\n        $is_wp_error = ($thing instanceof \\Typecho\\Exception);\n\n\n        return $is_wp_error;\n    }\n}\nif (!function_exists('get_current_blog_id')) {\n\n    function get_current_blog_id()\n    {\n        global $blog_id;\n        if (!isset($blog_id)) {\n            $blog_id = 1;\n        }\n        return absint($blog_id);\n    }\n}\nif (!function_exists('get_registered_nav_menus')) {\n\n    function get_registered_nav_menus()\n    {\n        global $_wp_registered_nav_menus;\n        if (isset($_wp_registered_nav_menus)) {\n            return $_wp_registered_nav_menus;\n        }\n        return array();\n    }\n}\nif (!function_exists('is_multisite')) {\n\n    function is_multisite()\n    {\n        if (defined('MULTISITE')) {\n            return MULTISITE;\n        }\n\n        if (defined('SUBDOMAIN_INSTALL') || defined('VHOST') || defined('SUNRISE')) {\n            return true;\n        }\n\n        return false;\n    }\n}\nif (!function_exists('get_post_types')) {\n\n    function get_post_types($args = array(), $output = 'names', $operator = 'and')\n    {\n//    global $wp_post_types;\n//\n//    $field = ('names' === $output) ? 'name' : false;\n//\n//    return wp_filter_object_list($wp_post_types, $args, $operator, $field);\n        if ($output == 'names') {\n            return ['post', 'page', 'post_draft', 'attachment'];\n        }\n    }\n}\nif (!function_exists('esc_textarea')) {\n\n    function esc_textarea($text)\n    {\n        $safe_text = htmlspecialchars($text, ENT_QUOTES, get_option('blog_charset'));\n        /**\n         * Filters a string cleaned and escaped for output in a textarea element.\n         *\n         * @param string $safe_text The text after it has been escaped.\n         * @param string $text The text prior to being escaped.\n         * @since 3.1.0\n         *\n         */\n        return apply_filters('esc_textarea', $safe_text, $text);\n    }\n}\nif (!function_exists('format_to_edit')) {\n\n    function format_to_edit($content, $rich_text = false)\n    {\n        /**\n         * Filters the text to be formatted for editing.\n         *\n         * @param string $content The text, prior to formatting for editing.\n         * @since 1.2.0\n         *\n         */\n        $content = apply_filters('format_to_edit', $content);\n        if (!$rich_text) {\n            $content = esc_textarea($content);\n        }\n        return $content;\n    }\n}\nif (!function_exists('wp_is_mobile')) {\n\n    function wp_is_mobile()\n    {\n        if (empty($_SERVER['HTTP_USER_AGENT'])) {\n            $is_mobile = false;\n        } elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false // Many mobile devices (all iPhone, iPad, etc.)\n            || strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false\n            || strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false\n            || strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false\n            || strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false\n            || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false\n            || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false) {\n            $is_mobile = true;\n        } else {\n            $is_mobile = false;\n        }\n\n        /**\n         * Filters whether the request should be treated as coming from a mobile device or not.\n         *\n         * @param bool $is_mobile Whether the request is from a mobile device or not.\n         * @since 4.9.0\n         *\n         */\n        return apply_filters('wp_is_mobile', $is_mobile);\n    }\n}\nif (!function_exists('option_value')) {\n\n    function option_value($key)\n    {\n        $db = Typecho\\Db::get();\n        $options = $db->fetchObject($db->select('value')->from('table.options')\n            ->where('name = ?', $key));\n\n\n        return $options->$key;\n    }\n}\nif (!function_exists('user_can_richedit')) {\n\n    function user_can_richedit()\n    {\n        global $wp_rich_edit, $is_gecko, $is_opera, $is_safari, $is_chrome, $is_IE, $is_edge;\n\n        if (!isset($wp_rich_edit)) {\n            $wp_rich_edit = false;\n            $user = Widget::widget('Widget_User');\n\n            if ('true' === option_value('useRichEditor') || !$user->hasLogin()) { // Default to 'true' for logged out users.\n                if ($is_safari) {\n                    $wp_rich_edit = !wp_is_mobile() || (preg_match('!AppleWebKit/(\\d+)!', $_SERVER['HTTP_USER_AGENT'], $match) && (int)$match[1] >= 534);\n                } elseif ($is_IE) {\n                    $wp_rich_edit = (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0;') !== false);\n                } elseif ($is_gecko || $is_chrome || $is_edge || ($is_opera && !wp_is_mobile())) {\n                    $wp_rich_edit = true;\n                }\n            }\n        }\n\n        /**\n         * Filters whether the user can access the visual editor.\n         *\n         * @param bool $wp_rich_edit Whether the user can access the visual editor.\n         * @since 2.1.0\n         *\n         */\n        return apply_filters('user_can_richedit', $wp_rich_edit);\n    }\n}\nif (!function_exists('sanitize_post_field')) {\n\n    function sanitize_post_field($field, $value, $post_id, $context = 'display')\n    {\n        $int_fields = array('ID', 'post_parent', 'menu_order');\n        if (in_array($field, $int_fields, true)) {\n            $value = (int)$value;\n        }\n\n        // Fields which contain arrays of integers.\n        $array_int_fields = array('ancestors');\n        if (in_array($field, $array_int_fields, true)) {\n            $value = array_map('absint', $value);\n            return $value;\n        }\n\n        if ('raw' === $context) {\n            return $value;\n        }\n\n        $prefixed = false;\n        if (false !== strpos($field, 'post_')) {\n            $prefixed = true;\n            $field_no_prefix = str_replace('post_', '', $field);\n        }\n\n        if ('edit' === $context) {\n            $format_to_edit = array('post_content', 'post_excerpt', 'post_title', 'post_password');\n\n            if ($prefixed) {\n\n                /**\n                 * Filters the value of a specific post field to edit.\n                 *\n                 * The dynamic portion of the hook name, `$field`, refers to the post\n                 * field name.\n                 *\n                 * @param mixed $value Value of the post field.\n                 * @param int $post_id Post ID.\n                 * @since 2.3.0\n                 *\n                 */\n                $value = apply_filters(\"edit_{$field}\", $value, $post_id);\n\n                /**\n                 * Filters the value of a specific post field to edit.\n                 *\n                 * The dynamic portion of the hook name, `$field_no_prefix`, refers to\n                 * the post field name.\n                 *\n                 * @param mixed $value Value of the post field.\n                 * @param int $post_id Post ID.\n                 * @since 2.3.0\n                 *\n                 */\n                $value = apply_filters(\"{$field_no_prefix}_edit_pre\", $value, $post_id);\n            } else {\n                $value = apply_filters(\"edit_post_{$field}\", $value, $post_id);\n            }\n\n            if (in_array($field, $format_to_edit, true)) {\n                if ('post_content' === $field) {\n                    $value = format_to_edit($value, user_can_richedit());\n                } else {\n                    $value = format_to_edit($value);\n                }\n            } else {\n                $value = esc_attr($value);\n            }\n        } elseif ('db' === $context) {\n            if ($prefixed) {\n\n                /**\n                 * Filters the value of a specific post field before saving.\n                 *\n                 * The dynamic portion of the hook name, `$field`, refers to the post\n                 * field name.\n                 *\n                 * @param mixed $value Value of the post field.\n                 * @since 2.3.0\n                 *\n                 */\n                $value = apply_filters(\"pre_{$field}\", $value);\n\n                /**\n                 * Filters the value of a specific field before saving.\n                 *\n                 * The dynamic portion of the hook name, `$field_no_prefix`, refers\n                 * to the post field name.\n                 *\n                 * @param mixed $value Value of the post field.\n                 * @since 2.3.0\n                 *\n                 */\n                $value = apply_filters(\"{$field_no_prefix}_save_pre\", $value);\n            } else {\n                $value = apply_filters(\"pre_post_{$field}\", $value);\n\n                /**\n                 * Filters the value of a specific post field before saving.\n                 *\n                 * The dynamic portion of the hook name, `$field`, refers to the post\n                 * field name.\n                 *\n                 * @param mixed $value Value of the post field.\n                 * @since 2.3.0\n                 *\n                 */\n                $value = apply_filters(\"{$field}_pre\", $value);\n            }\n        } else {\n\n            // Use display filters by default.\n            if ($prefixed) {\n\n                /**\n                 * Filters the value of a specific post field for display.\n                 *\n                 * The dynamic portion of the hook name, `$field`, refers to the post\n                 * field name.\n                 *\n                 * @param mixed $value Value of the prefixed post field.\n                 * @param int $post_id Post ID.\n                 * @param string $context Context for how to sanitize the field.\n                 *                        Accepts 'raw', 'edit', 'db', 'display',\n                 *                        'attribute', or 'js'. Default 'display'.\n                 * @since 2.3.0\n                 *\n                 */\n                $value = apply_filters(\"{$field}\", $value, $post_id, $context);\n            } else {\n                $value = apply_filters(\"post_{$field}\", $value, $post_id, $context);\n            }\n\n            if ('attribute' === $context) {\n                $value = esc_attr($value);\n            } elseif ('js' === $context) {\n                $value = esc_js($value);\n            }\n        }\n\n        // Restore the type for integer fields after esc_attr().\n        if (in_array($field, $int_fields, true)) {\n            $value = (int)$value;\n        }\n\n        return $value;\n    }\n}\nif (!function_exists('esc_js')) {\n\n    function esc_js($text)\n    {\n        $safe_text = wp_check_invalid_utf8($text);\n        $safe_text = _wp_specialchars($safe_text, ENT_COMPAT);\n        $safe_text = preg_replace('/&#(x)?0*(?(1)27|39);?/i', \"'\", stripslashes($safe_text));\n        $safe_text = str_replace(\"\\r\", '', $safe_text);\n        $safe_text = str_replace(\"\\n\", '\\\\n', addslashes($safe_text));\n        /**\n         * Filters a string cleaned and escaped for output in JavaScript.\n         *\n         * Text passed to esc_js() is stripped of invalid or special characters,\n         * and properly slashed for output.\n         *\n         * @param string $safe_text The text after it has been escaped.\n         * @param string $text The text prior to being escaped.\n         * @since 2.0.6\n         *\n         */\n        return apply_filters('js_escape', $safe_text, $text);\n    }\n}\nif (!function_exists('sanitize_post')) {\n\n    function sanitize_post($post, $context = 'display')\n    {\n        if (is_object($post)) {\n            // Check if post already filtered for this context.\n            if (isset($post->filter) && $context == $post->filter) {\n                return $post;\n            }\n            if (!isset($post->ID)) {\n                $post->ID = 0;\n            }\n            foreach (array_keys(get_object_vars($post)) as $field) {\n                $post->$field = sanitize_post_field($field, $post->$field, $post->ID, $context);\n            }\n            $post->filter = $context;\n        } elseif (is_array($post)) {\n            // Check if post already filtered for this context.\n            if (isset($post['filter']) && $context == $post['filter']) {\n                return $post;\n            }\n            if (!isset($post['cid'])) {\n                $post['cid'] = 0;\n            }\n            foreach (array_keys($post) as $field) {\n                $post[$field] = sanitize_post_field($field, $post[$field], $post['ID'], $context);\n            }\n            $post['filter'] = $context;\n        }\n        return $post;\n    }\n}\nif (!defined('OBJECT')){\n    define('OBJECT', 'OBJECT');\n}\n// phpcs:ignore Generic.NamingConventions.UpperCaseConstantName.ConstantNotUpperCase\nif (!defined('object')) {\n    define('object', 'OBJECT'); // Back compat.\n}\n\nif (!defined('OBJECT_K')){\n    define('OBJECT_K', 'OBJECT_K');\n}\n\nif (!defined('ARRAY_A')){\n    define('ARRAY_A', 'ARRAY_A');\n}\n\nif (!defined('ARRAY_N')) {\n    define('ARRAY_N', 'ARRAY_N');\n}\n\nif (!function_exists('get_post')) {\n    function get_post($post = null, $output = OBJECT, $filter = 'raw')\n    {\n        if (empty($post) && isset($GLOBALS['post'])) {\n            $post = $GLOBALS['post'];\n        }\n        $db = Db::get();\n        if ($post instanceof \\Widget\\Base\\Contents) {\n            $_post = $post;\n        } elseif (is_object($post)) { // not work\n            return $post;\n        } else {\n            if (is_array($post) and array_key_exists('cid', $post)) {\n                $_post = (object)$post;\n\n            } else {\n                $_post = $db->fetchObject($db->select()->from('table.contents')->where('cid = ?', $post));\n            }\n\n        }\n\n        if (!$_post) {\n            return null;\n        }\n\n//    $_post = $_post->filter($filter);\n\n        if (ARRAY_A === $output) {\n            return $_post->to_array();\n        } elseif (ARRAY_N === $output) {\n            return array_values($_post->to_array());\n        }\n\n        return $_post;\n    }\n}\nif (!function_exists('get_term')) {\n\n    function get_term($cat = null, $output = OBJECT, $filter = 'raw')\n    {\n        $db = Db::get();\n        $_cat = $db->fetchRow($db->select()->from('table.metas')->where('mid = ?',$cat));\n        if (ARRAY_A === $output) {\n            return $_cat;\n        } elseif (ARRAY_N === $output) {\n            return array_values($_cat);\n        }\n        return (OBJECT)$_cat;\n    }\n}\nif (!function_exists('convert_to_object')) {\n\n    function convert_to_object($data)\n    {\n        return (object)$data;\n    }\n}\nif (!function_exists('get_the_title')) {\n\n    function get_the_title($post = 0)\n    {\n        $post = get_post($post);\n\n        $title = isset($post->title) ? $post->title : '';\n        $id = isset($post->cid) ? $post->cid : 0;\n\n        if (!ty_is_admin()) {\n            if (!empty($post->post_password)) {\n\n                /* translators: %s: Protected post title. */\n                $prepend = __('Protected: %s');\n\n                /**\n                 * Filters the text prepended to the post title for protected posts.\n                 *\n                 * The filter is only applied on the front end.\n                 *\n                 * @param string $prepend Text displayed before the post title.\n                 *                         Default 'Protected: %s'.\n                 * @param WP_Post $post Current post object.\n                 * @since 2.8.0\n                 *\n                 */\n                $protected_title_format = apply_filters('protected_title_format', $prepend, $post);\n                $title = sprintf($protected_title_format, $title);\n            } elseif (isset($post->status) && 'private' === $post->status) {\n\n                /* translators: %s: Private post title. */\n                $prepend = __('Private: %s');\n\n                /**\n                 * Filters the text prepended to the post title of private posts.\n                 *\n                 * The filter is only applied on the front end.\n                 *\n                 * @param string $prepend Text displayed before the post title.\n                 *                         Default 'Private: %s'.\n                 * @param WP_Post $post Current post object.\n                 * @since 2.8.0\n                 *\n                 */\n                $private_title_format = apply_filters('private_title_format', $prepend, $post);\n                $title = sprintf($private_title_format, $title);\n            }\n        }\n\n        /**\n         * Filters the post title.\n         *\n         * @param string $title The post title.\n         * @param int $id The post ID.\n         * @since 0.71\n         *\n         */\n        return apply_filters('the_title', $title, $id);\n    }\n}\nif (!function_exists('get_user_by')) {\n\n    function get_user_by($type, $key)\n    {\n        $db = Typecho\\Db::get();\n\n        return $db->fetchObject($db->select()->from('table.users')->where($type . ' = ?', $key));\n    }\n}\nif (!function_exists('urlencode_deep')) {\n\n    function urlencode_deep($value)\n    {\n        return map_deep($value, 'urlencode');\n    }\n}\nif (!function_exists('build_query')) {\n\n    function build_query($data)\n    {\n        return _http_build_query($data, null, '&', '', false);\n    }\n}\nif (!function_exists('add_query_arg')) {\n\n    function add_query_arg(...$args)\n    {\n        if (is_array($args[0])) {\n            if (count($args) < 2 || false === $args[1]) {\n                $uri = $_SERVER['REQUEST_URI'];\n            } else {\n                $uri = $args[1];\n            }\n        } else {\n            if (count($args) < 3 || false === $args[2]) {\n                $uri = $_SERVER['REQUEST_URI'];\n            } else {\n                $uri = $args[2];\n            }\n        }\n\n        $frag = strstr($uri, '#');\n        if ($frag) {\n            $uri = substr($uri, 0, -strlen($frag));\n        } else {\n            $frag = '';\n        }\n\n        if (0 === stripos($uri, 'http://')) {\n            $protocol = 'http://';\n            $uri = substr($uri, 7);\n        } elseif (0 === stripos($uri, 'https://')) {\n            $protocol = 'https://';\n            $uri = substr($uri, 8);\n        } else {\n            $protocol = '';\n        }\n\n        if (strpos($uri, '?') !== false) {\n            list($base, $query) = explode('?', $uri, 2);\n            $base .= '?';\n        } elseif ($protocol || strpos($uri, '=') === false) {\n            $base = $uri . '?';\n            $query = '';\n        } else {\n            $base = '';\n            $query = $uri;\n        }\n\n        wp_parse_str($query, $qs);\n        $qs = urlencode_deep($qs); // This re-URL-encodes things that were already in the query string.\n        if (is_array($args[0])) {\n            foreach ($args[0] as $k => $v) {\n                $qs[$k] = $v;\n            }\n        } else {\n            $qs[$args[0]] = $args[1];\n        }\n\n        foreach ($qs as $k => $v) {\n            if (false === $v) {\n                unset($qs[$k]);\n            }\n        }\n\n        $ret = build_query($qs);\n        $ret = trim($ret, '?');\n        $ret = preg_replace('#=(&|$)#', '$1', $ret);\n        $ret = $protocol . $base . $ret . $frag;\n        $ret = rtrim($ret, '?');\n        $ret = str_replace('?#', '#', $ret);\n        return $ret;\n    }\n}\nif (!function_exists('remove_query_arg')) {\n\n    /**\n     * Removes an item or items from a query string.\n     *\n     * @param string|string[] $key Query key or keys to remove.\n     * @param false|string $query Optional. When false uses the current URL. Default false.\n     * @return string New URL query string.\n     * @since 1.5.0\n     *\n     */\n    function remove_query_arg($key, $query = false)\n    {\n        if (is_array($key)) { // Removing multiple keys.\n            foreach ($key as $k) {\n                $query = add_query_arg($k, false, $query);\n            }\n            return $query;\n        }\n        return add_query_arg($key, false, $query);\n    }\n}\nif (!function_exists('admin_url')) {\n\n    function admin_url($path = '', $scheme = 'admin')\n    {\n        return get_admin_url(null, $path, $scheme);\n    }\n}\nif (!function_exists('get_admin_url')) {\n\n    /**\n     * Retrieves the URL to the admin area for a given site.\n     *\n     * @param int|null $blog_id Optional. Site ID. Default null (current site).\n     * @param string $path Optional. Path relative to the admin URL. Default empty.\n     * @param string $scheme Optional. The scheme to use. Accepts 'http' or 'https',\n     *                          to force those schemes. Default 'admin', which obeys\n     *                          force_ssl_admin() and is_ssl().\n     * @return string Admin URL link with optional path appended.\n     * @since 3.0.0\n     *\n     */\n    function get_admin_url($blog_id = null, $path = '', $scheme = 'admin')\n    {\n        $url = Helper::options()->adminUrl;\n\n        if ($path && is_string($path)) {\n            $url .= ltrim($path, '/');\n        }\n\n        /**\n         * Filters the admin area URL.\n         *\n         * @param string $url The complete admin area URL including scheme and path.\n         * @param string $path Path relative to the admin area URL. Blank string if no path is specified.\n         * @param int|null $blog_id Site ID, or null for the current site.\n         * @param string|null $scheme The scheme to use. Accepts 'http', 'https',\n         *                             'admin', or null. Default 'admin', which obeys force_ssl_admin() and is_ssl().\n         * @since 2.8.0\n         * @since 5.8.0 The `$scheme` parameter was added.\n         *\n         */\n        return apply_filters('admin_url', $url, $path, $blog_id, $scheme);\n    }\n}\nif (!function_exists('_http_build_query')) {\n\n    function _http_build_query($data, $prefix = null, $sep = null, $key = '', $urlencode = true)\n    {\n        $ret = array();\n\n        foreach ((array)$data as $k => $v) {\n            if ($urlencode) {\n                $k = urlencode($k);\n            }\n            if (is_int($k) && null != $prefix) {\n                $k = $prefix . $k;\n            }\n            if (!empty($key)) {\n                $k = $key . '%5B' . $k . '%5D';\n            }\n            if (null === $v) {\n                continue;\n            } elseif (false === $v) {\n                $v = '0';\n            }\n\n            if (is_array($v) || is_object($v)) {\n                array_push($ret, _http_build_query($v, '', $sep, $k, $urlencode));\n            } elseif ($urlencode) {\n                array_push($ret, $k . '=' . urlencode($v));\n            } else {\n                array_push($ret, $k . '=' . $v);\n            }\n        }\n\n        if (null === $sep) {\n            $sep = ini_get('arg_separator.output');\n        }\n\n        return implode($sep, $ret);\n    }\n}\n\nglobal $register_script;\n$register_script = [];\nif (!function_exists('enqueue_script_helper')) {\n\n    function enqueue_script_helper($script_name, $src = '', $ret = true)\n    {\n        global $register_script;\n        if (in_array($script_name, $register_script)) {\n            return '';\n        } else {\n            $register_script [] = $script_name;\n        }\n\n        $script_name = str_replace('-', '/', $script_name);\n        if ($src) {\n            if (!$ret) {\n                echo '<script type=\"text/javascript\" src=\"' . $src . '\"></script>';\n                return '';\n            }\n            return '<script type=\"text/javascript\" src=\"' . $src . '\"></script>';\n        } else {\n            if (!$ret) {\n                echo '<script type=\"text/javascript\" src=\"' . CSF::include_plugin_url2('assets/js/' . $script_name . '.min.js') . '\"></script>';\n                return '';\n            }\n            return '<script type=\"text/javascript\" src=\"' . CSF::include_plugin_url2('assets/js/' . $script_name . '.min.js') . '\"></script>';\n        }\n\n    }\n}\n\nglobal $register_style;\n$register_style = [];\nif (!function_exists('enqueue_style_helper')) {\n    function enqueue_style_helper($style_name, $src = '', $ret = true)\n    {\n        global $register_style;\n        if (in_array($style_name, $register_style)) {\n            return '';\n        } else {\n            $register_style [] = $style_name;\n        }\n        $style_path_name = str_replace($style_name, '-', '/');\n        if ($src) {\n            if (!$ret) {\n                echo '<link id=\"' . $style_name . '\" rel=\"stylesheet\" type=\"text/css\" href=\"' . $src . '\" media=\"screen\">';\n                return '';\n            }\n            return '<link id=\"' . $style_name . '\" rel=\"stylesheet\" type=\"text/css\" href=\"' . $src . '\" media=\"screen\">';\n        } else {\n            if (!$ret) {\n                echo '<script id=\"' . $style_name . '\" type=\"text/javascript\" src=\"' . CSF::include_plugin_url2('assets/js/' . $style_path_name . '.min.js') . '\"></script>';\n                return '';\n            }\n            return '<script id=\"' . $style_name . '\" type=\"text/javascript\" src=\"' . CSF::include_plugin_url2('assets/js/' . $style_path_name . '.min.js') . '\"></script>';\n        }\n\n    }\n}\nif (!function_exists('wp_localize_script')) {\n\n    function wp_localize_script($handle, $object_name, $l10n)\n    {\n        global $register_script;\n\n        if ('jquery' === $handle) {\n            $handle = 'jquery-core';\n        }\n\n        if (is_array($l10n) && isset($l10n['l10n_print_after'])) { // back compat, preserve the code in 'l10n_print_after' if present.\n            $after = $l10n['l10n_print_after'];\n            unset($l10n['l10n_print_after']);\n        }\n\n        if (!is_array($l10n)) {\n            throw new Exception('l10n 参数必须为数组', 50);\n        }\n\n        if (is_string($l10n)) {\n            $l10n = html_entity_decode($l10n, ENT_QUOTES, 'UTF-8');\n        } else {\n            foreach ((array)$l10n as $key => $value) {\n                if (!is_scalar($value)) {\n                    continue;\n                }\n\n                $l10n[$key] = html_entity_decode((string)$value, ENT_QUOTES, 'UTF-8');\n            }\n        }\n\n        $script = \"var $object_name = \" . json_encode($l10n) . ';';\n\n        if (!empty($after)) {\n            $script .= \"\\n$after;\";\n        }\n\n        if (!array_key_exists($handle, $register_script)) {\n            $register_script[$handle] = [];\n        }\n        $data_ = $register_script[$handle];\n\n        if (!array_key_exists('data', $data_)) {\n            $data_['data'] = '';\n        }\n        $data = $data_['data'];\n\n        if (!empty($data)) {\n            $script = \"$data\\n$script\";\n        }\n        $register_script[$handle]['data'] = $script;\n        return '<script type=\"text/javascript\">' . $script . '</script>';\n    }\n}\nif (!function_exists('reset_enqueue_array')) {\n\n    function reset_enqueue_array()\n    {\n        global $register_script;\n        global $register_style;\n        $register_script = [];\n        $register_style = [];\n    }\n}\nif (!function_exists('get_status_header_desc')) {\n    function get_status_header_desc($code)\n    {\n        global $wp_header_to_desc;\n\n        $code = absint($code);\n\n        if (!isset($wp_header_to_desc)) {\n            $wp_header_to_desc = array(\n                100 => 'Continue',\n                101 => 'Switching Protocols',\n                102 => 'Processing',\n                103 => 'Early Hints',\n\n                200 => 'OK',\n                201 => 'Created',\n                202 => 'Accepted',\n                203 => 'Non-Authoritative Information',\n                204 => 'No Content',\n                205 => 'Reset Content',\n                206 => 'Partial Content',\n                207 => 'Multi-Status',\n                226 => 'IM Used',\n\n                300 => 'Multiple Choices',\n                301 => 'Moved Permanently',\n                302 => 'Found',\n                303 => 'See Other',\n                304 => 'Not Modified',\n                305 => 'Use Proxy',\n                306 => 'Reserved',\n                307 => 'Temporary Redirect',\n                308 => 'Permanent Redirect',\n\n                400 => 'Bad Request',\n                401 => 'Unauthorized',\n                402 => 'Payment Required',\n                403 => 'Forbidden',\n                404 => 'Not Found',\n                405 => 'Method Not Allowed',\n                406 => 'Not Acceptable',\n                407 => 'Proxy Authentication Required',\n                408 => 'Request Timeout',\n                409 => 'Conflict',\n                410 => 'Gone',\n                411 => 'Length Required',\n                412 => 'Precondition Failed',\n                413 => 'Request Entity Too Large',\n                414 => 'Request-URI Too Long',\n                415 => 'Unsupported Media Type',\n                416 => 'Requested Range Not Satisfiable',\n                417 => 'Expectation Failed',\n                418 => 'I\\'m a teapot',\n                421 => 'Misdirected Request',\n                422 => 'Unprocessable Entity',\n                423 => 'Locked',\n                424 => 'Failed Dependency',\n                426 => 'Upgrade Required',\n                428 => 'Precondition Required',\n                429 => 'Too Many Requests',\n                431 => 'Request Header Fields Too Large',\n                451 => 'Unavailable For Legal Reasons',\n\n                500 => 'Internal Server Error',\n                501 => 'Not Implemented',\n                502 => 'Bad Gateway',\n                503 => 'Service Unavailable',\n                504 => 'Gateway Timeout',\n                505 => 'HTTP Version Not Supported',\n                506 => 'Variant Also Negotiates',\n                507 => 'Insufficient Storage',\n                510 => 'Not Extended',\n                511 => 'Network Authentication Required',\n            );\n        }\n\n        if (isset($wp_header_to_desc[$code])) {\n            return $wp_header_to_desc[$code];\n        } else {\n            return '';\n        }\n    }\n}\nif (!function_exists('wp_get_server_protocol')) {\n    function wp_get_server_protocol()\n    {\n        $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : '';\n        if (!in_array($protocol, array('HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3'), true)) {\n            $protocol = 'HTTP/1.0';\n        }\n        return $protocol;\n    }\n}\nif (!function_exists('status_header')) {\n    function status_header($code, $description = '')\n    {\n        if (!$description) {\n            $description = get_status_header_desc($code);\n        }\n\n        if (empty($description)) {\n            return;\n        }\n\n        $protocol = wp_get_server_protocol();\n        $status_header = \"$protocol $code $description\";\n        if (function_exists('apply_filters')) {\n\n            /**\n             * Filters an HTTP status header.\n             *\n             * @param string $status_header HTTP status header.\n             * @param int $code HTTP status code.\n             * @param string $description Description for the status code.\n             * @param string $protocol Server protocol.\n             * @since 2.2.0\n             *\n             */\n            $status_header = apply_filters('status_header', $status_header, $code, $description, $protocol);\n        }\n\n        if (!headers_sent()) {\n            header($status_header, true, $code);\n        }\n    }\n}\nif (!function_exists('wp_send_json_error')) {\n    function wp_send_json_error($responseObj, $data = null, $status_code = null, $options = 0)\n    {\n        $response = array('success' => false);\n\n        if (isset($data)) {\n            if (is_wp_error($data)) {\n                $result = array();\n                foreach ($data->errors as $code => $messages) {\n                    foreach ($messages as $message) {\n                        $result[] = array(\n                            'code' => $code,\n                            'message' => $message,\n                        );\n                    }\n                }\n\n                $response['data'] = $result;\n            } else {\n                $response['data'] = $data;\n            }\n        }\n        if (!headers_sent()) {\n            header('Content-Type: application/json; charset=' . get_option('blog_charset'));\n            if (null !== $status_code) {\n                status_header($status_code);\n            }\n        }\n        $responseObj->throwJson($response);\n    }\n}\nif (!function_exists('wp_send_json_success')) {\n    function wp_send_json_success($responseObj, $data = null, $status_code = null, $options = 0)\n    {\n        $response = array('success' => true);\n\n        if (isset($data)) {\n            $response['data'] = $data;\n        }\n\n        if (!headers_sent()) {\n            header('Content-Type: application/json; charset=' . get_option('blog_charset'));\n            if (null !== $status_code) {\n                status_header($status_code);\n            }\n        }\n        $responseObj->throwJson($response);\n    }\n}\nif (!function_exists('wp_protect_special_option')) {\n    function wp_protect_special_option($option)\n    {\n        if ('alloptions' === $option || 'notoptions' === $option) {\n            die(\n            sprintf(\n            /* translators: %s: Option name. */\n                __('%s is a protected WP option and may not be modified'),\n                esc_html($option)\n            )\n            );\n        }\n    }\n}\nif ( ! function_exists( 'check_ajax_referer' ) ) :\n    /**\n     * Verifies the Ajax request to prevent processing requests external of the blog.\n     *\n     * @since 2.0.3\n     *\n     * @param int|string   $action    Action nonce.\n     * @param false|string $query_arg Optional. Key to check for the nonce in `$_REQUEST` (since 2.5). If false,\n     *                                `$_REQUEST` values will be evaluated for '_ajax_nonce', and '_wpnonce'\n     *                                (in that order). Default false.\n     * @param bool         $die       Optional. Whether to die early when the nonce cannot be verified.\n     *                                Default true.\n     * @return int|false 1 if the nonce is valid and generated between 0-12 hours ago,\n     *                   2 if the nonce is valid and generated between 12-24 hours ago.\n     *                   False if the nonce is invalid.\n     */\n    function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) {\n        if ( -1 == $action ) {\n            throw new \\Typecho\\Exception( __( 'You should specify an action to be verified by using the first parameter.' ));\n        }\n\n        $nonce = '';\n\n        if ( $query_arg && isset( $_REQUEST[ $query_arg ] ) ) {\n            $nonce = $_REQUEST[ $query_arg ];\n        } elseif ( isset( $_REQUEST['_ajax_nonce'] ) ) {\n            $nonce = $_REQUEST['_ajax_nonce'];\n        } elseif ( isset( $_REQUEST['_wpnonce'] ) ) {\n            $nonce = $_REQUEST['_wpnonce'];\n        }\n\n        $result = wp_verify_nonce( $nonce, $action );\n\n\n\n        if ( $die && false === $result ) {\n            die( '-1' );\n        }\n\n        return $result;\n    }\nendif;\n\n\nif (!function_exists('wp_using_ext_object_cache')) {\n    function wp_using_ext_object_cache($using = null)\n    {\n        global $_wp_using_ext_object_cache;\n        $current_using = $_wp_using_ext_object_cache;\n        if (null !== $using) {\n            $_wp_using_ext_object_cache = $using;\n        }\n        return $current_using;\n    }\n}\nif (!function_exists('get_current_user_id')) {\n    function get_current_user_id()\n    {\n        $cookieUid = Cookie::get('__typecho_uid');\n        $db = Db::get();\n        if (null !== $cookieUid) {\n            /** 验证登陆 */\n            $user = $db->fetchRow($db->select()->from('table.users')\n                ->where('uid = ?', intval($cookieUid))\n                ->limit(1));\n\n            $cookieAuthCode = Cookie::get('__typecho_authCode');\n            if ($user && Common::hashValidate($user['authCode'], $cookieAuthCode)) {\n                return (isset($user->id) ? (int)$user->id : 0);\n            }\n\n        }\n        return 0;\n    }\n}\nif (!function_exists('get_post_stati')) {\n    function get_post_stati($args = array(), $output = 'names', $operator = 'and')\n    {\n        //todo: post status\n\n        return ['publish', 'hidden', 'private'];\n\n    }\n}\nif (!function_exists('_real_escape')) {\n    function _real_escape($string)\n    {\n        if (!is_scalar($string)) {\n            return '';\n        }\n        // not working\n//    $adapter = Db::get()->getAdapterName();\n//    Db::get()->getConfig()\n//    if ( $adapter == 'Mysqli' ) {\n//        $escaped = mysqli_real_escape_string( $this->dbh, $string );\n//    } else {\n//        $escaped = mysql_real_escape_string( $string, $this->dbh );\n//    }\n//    return $this->add_placeholder_escape( $escaped );\n        return $string;\n    }\n}\nif (!function_exists('esc_sql')) {\n    function esc_sql($data)\n    {\n        if (is_array($data)) {\n            foreach ($data as $k => $v) {\n                if (is_array($v)) {\n                    $data[$k] = esc_sql($v);\n                } else {\n                    $data[$k] = _real_escape($v);\n                }\n            }\n        } else {\n            $data = _real_escape($data);\n        }\n\n        return $data;\n    }\n}\n\nif (!function_exists('wp_parse_list')) {\n    function wp_parse_list($list)\n    {\n        if (!is_array($list)) {\n            return preg_split('/[\\s,]+/', $list, -1, PREG_SPLIT_NO_EMPTY);\n        }\n\n        return $list;\n    }\n}\nif (!function_exists('wp_parse_id_list')) {\n    function wp_parse_id_list($list)\n    {\n        $list = wp_parse_list($list);\n\n        return array_unique(array_map('absint', $list));\n    }\n}\nif (!function_exists('wp_array_slice_assoc')) {\n    function wp_array_slice_assoc($array, $keys)\n    {\n        $slice = array();\n\n        foreach ($keys as $key) {\n            if (isset($array[$key])) {\n                $slice[$key] = $array[$key];\n            }\n        }\n\n        return $slice;\n    }\n}\nif (!function_exists('wp_cache_init')) {\n    function wp_cache_init()\n    {\n        $GLOBALS['wp_object_cache'] = new WP_Object_Cache();\n    }\n}\nif (!function_exists('wp_suspend_cache_addition')) {\n    function wp_suspend_cache_addition($suspend = null)\n    {\n        static $_suspend = false;\n\n        if (is_bool($suspend)) {\n            $_suspend = $suspend;\n        }\n\n        return $_suspend;\n    }\n}\nif (!function_exists('wp_cache_add')) {\n    function wp_cache_add($key, $data, $group = '', $expire = 0)\n    {\n        global $wp_object_cache;\n\n        return $wp_object_cache->add($key, $data, $group, (int)$expire);\n    }\n}\nif (!function_exists('wp_cache_get')) {\n    function wp_cache_get($key, $group = '', $force = false, &$found = null)\n    {\n        global $wp_object_cache;\n\n        return $wp_object_cache->get($key, $group, $force, $found);\n    }\n}\nif (!function_exists('wp_cache_set')) {\n    function wp_cache_set($key, $data, $group = '', $expire = 0)\n    {\n        global $wp_object_cache;\n\n        return $wp_object_cache->set($key, $data, $group, (int)$expire);\n    }\n}\nif (!function_exists('wp_cache_get_multiple')) {\n    function wp_cache_get_multiple($keys, $group = '', $force = false)\n    {\n        global $wp_object_cache;\n\n        return $wp_object_cache->get_multiple($keys, $group, $force);\n    }\n}\nif (!function_exists('wp_cache_flush')) {\n    function wp_cache_flush()\n    {\n        global $wp_object_cache;\n\n        return $wp_object_cache->flush();\n    }\n}\nif (!function_exists('wp_cache_delete')) {\n    function wp_cache_delete($key, $group = '')\n    {\n        global $wp_object_cache;\n\n        return $wp_object_cache->delete($key, $group);\n    }\n}\nif (!function_exists('wp_cache_get_last_changed')) {\n    function wp_cache_get_last_changed($group)\n    {\n        $last_changed = wp_cache_get('last_changed', $group);\n\n        if (!$last_changed) {\n            $last_changed = microtime();\n            wp_cache_set('last_changed', $last_changed, $group);\n        }\n\n        return $last_changed;\n    }\n}\nif (!function_exists('update_term_cache')) {\n    function update_term_cache($terms, $taxonomy = '')\n    {\n        foreach ((array)$terms as $term) {\n            // Create a copy in case the array was passed by reference.\n\n            $_term = clone $term;\n            // Object ID should not be cached.\n            unset($_term->object_id);\n\n            wp_cache_add($term->mid, $_term, 'terms');\n        }\n    }\n}\n\nif (!function_exists('_device_can_upload')) {\n    function _device_can_upload()\n    {\n        if (!wp_is_mobile()) {\n            return true;\n        }\n\n        $ua = $_SERVER['HTTP_USER_AGENT'];\n\n        if (strpos($ua, 'iPhone') !== false\n            || strpos($ua, 'iPad') !== false\n            || strpos($ua, 'iPod') !== false) {\n            return preg_match('#OS ([\\d_]+) like Mac OS X#', $ua, $version) && version_compare($version[1], '6', '>=');\n        }\n\n        return true;\n    }\n}\nif (!function_exists('is_upload_space_available')) {\n    function is_upload_space_available()\n    {\n        // todo: add button control\n        return true;\n    }\n}\nif (!function_exists('wp_convert_hr_to_bytes')) {\n    function wp_convert_hr_to_bytes($value)\n    {\n        $value = strtolower(trim($value));\n        $bytes = (int)$value;\n\n        if (false !== strpos($value, 'g')) {\n            $bytes *= GB_IN_BYTES;\n        } elseif (false !== strpos($value, 'm')) {\n            $bytes *= MB_IN_BYTES;\n        } elseif (false !== strpos($value, 'k')) {\n            $bytes *= KB_IN_BYTES;\n        }\n\n        // Deal with large (float) values which run into the maximum integer size.\n        return min($bytes, PHP_INT_MAX);\n    }\n}\nif (!function_exists('wp_max_upload_size')) {\n    function wp_max_upload_size()\n    {\n        $u_bytes = wp_convert_hr_to_bytes(ini_get('upload_max_filesize'));\n        $p_bytes = wp_convert_hr_to_bytes(ini_get('post_max_size'));\n\n        /**\n         * Filters the maximum upload size allowed in php.ini.\n         *\n         * @param int $size Max upload size limit in bytes.\n         * @param int $u_bytes Maximum upload filesize in bytes.\n         * @param int $p_bytes Maximum size of POST data in bytes.\n         * @since 2.5.0\n         *\n         */\n        return apply_filters('upload_size_limit', min($u_bytes, $p_bytes), $u_bytes, $p_bytes);\n    }\n}\nif (!function_exists('number_format_i18n')) {\n    function number_format_i18n($number, $decimals = 0)\n    {\n        global $wp_locale;\n\n        if (isset($wp_locale)) {\n            $formatted = number_format($number, absint($decimals), $wp_locale->number_format['decimal_point'], $wp_locale->number_format['thousands_sep']);\n        } else {\n            $formatted = number_format($number, absint($decimals));\n        }\n\n        /**\n         * Filters the number formatted based on the locale.\n         *\n         * @param string $formatted Converted number in string format.\n         * @param float $number The number to convert based on locale.\n         * @param int $decimals Precision of the number of decimal places.\n         * @since 4.9.0 The `$number` and `$decimals` parameters were added.\n         *\n         * @since 2.8.0\n         */\n        return apply_filters('number_format_i18n', $formatted, $number, $decimals);\n    }\n}\nif (!function_exists('size_format')) {\n    function size_format($bytes, $decimals = 0)\n    {\n        $quant = array(\n            /* translators: Unit symbol for terabyte. */\n            _x('TB', 'unit symbol') => TB_IN_BYTES,\n            /* translators: Unit symbol for gigabyte. */\n            _x('GB', 'unit symbol') => GB_IN_BYTES,\n            /* translators: Unit symbol for megabyte. */\n            _x('MB', 'unit symbol') => MB_IN_BYTES,\n            /* translators: Unit symbol for kilobyte. */\n            _x('KB', 'unit symbol') => KB_IN_BYTES,\n            /* translators: Unit symbol for byte. */\n            _x('B', 'unit symbol') => 1,\n        );\n\n        if (0 === $bytes) {\n            /* translators: Unit symbol for byte. */\n            return number_format_i18n(0, $decimals) . ' ' . _x('B', 'unit symbol');\n        }\n\n        foreach ($quant as $unit => $mag) {\n            if ((float)$bytes >= $mag) {\n                return number_format_i18n($bytes / $mag, $decimals) . ' ' . $unit;\n            }\n        }\n\n        return false;\n    }\n}\nif (!function_exists('wp_get_audio_extensions')) {\n    function wp_get_audio_extensions()\n    {\n        /**\n         * Filters the list of supported audio formats.\n         *\n         * @param string[] $extensions An array of supported audio formats. Defaults are\n         *                            'mp3', 'ogg', 'flac', 'm4a', 'wav'.\n         * @since 3.6.0\n         *\n         */\n        return apply_filters('wp_audio_extensions', array('mp3', 'ogg', 'flac', 'm4a', 'wav'));\n    }\n}\nif (!function_exists('wp_get_video_extensions')) {\n    function wp_get_video_extensions()\n    {\n        /**\n         * Filters the list of supported video formats.\n         *\n         * @param string[] $extensions An array of supported video formats. Defaults are\n         *                             'mp4', 'm4v', 'webm', 'ogv', 'flv'.\n         * @since 3.6.0\n         *\n         */\n        return apply_filters('wp_video_extensions', array('mp4', 'm4v', 'webm', 'ogv', 'flv'));\n    }\n}\n\nif (!function_exists('getAttachmentTypes')) {\n    function getAttachmentTypes()\n    {\n\n        $attachmentTypesResult = [];\n\n        if (null != Helper::options()->attachmentTypes) {\n            $attachmentTypes = str_replace(\n                ['@image@', '@media@', '@doc@'],\n                [\n                    'gif,jpg,jpeg,png,tiff,bmp,webp', 'mp3,mp4,mov,wmv,wma,rmvb,rm,avi,flv,ogg,oga,ogv',\n                    'txt,doc,docx,xls,xlsx,ppt,pptx,zip,rar,pdf'\n                ],\n                Helper::options()->attachmentTypes\n            );\n            $attachmentTypesResult = array_unique(array_map('trim', preg_split(\"/(,|\\.)/\", $attachmentTypes)));\n\n        }\n        return $attachmentTypesResult;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/helpers.php",
    "content": "<?php use Widget\\Options;\n\nif ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Array search key & value\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_array_search' ) ) {\n  function csf_array_search( $array, $key, $value ) {\n\n    $results = array();\n\n    if ( is_array( $array ) ) {\n      if ( isset( $array[$key] ) && $array[$key] == $value ) {\n        $results[] = $array;\n      }\n\n      foreach ( $array as $sub_array ) {\n        $results = array_merge( $results, csf_array_search( $sub_array, $key, $value ) );\n      }\n\n    }\n\n    return $results;\n\n  }\n}\n\n/**\n *\n * Between Microtime\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_timeout' ) ) {\n  function csf_timeout( $timenow, $starttime, $timeout = 30 ) {\n    return ( ( $timenow - $starttime ) < $timeout ) ? true : false;\n  }\n}\n\n/**\n *\n * Check for wp editor api\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_wp_editor_api' ) ) {\n  function csf_wp_editor_api() {\n    global $wp_version;\n    return version_compare( $wp_version, '4.8', '>=' );\n  }\n}\n\n\nif (!function_exists('get_plugin_theme_name')){\n    function get_plugin_theme_name(){\n        $requestObject = \\Typecho\\Request::getInstance();\n        $curUri = $requestObject->getRequestUri();\n        if (strpos($curUri, 'options-plugin.php')!==false){ // if is plugin\n            parse_str(parse_url($curUri,PHP_URL_QUERY),$query_arr);\n\n            if (array_key_exists('config', $query_arr)){\n                return $query_arr['config'];\n\n            }\n        } elseif (strpos($curUri, 'options-theme.php')!==false){\n            $options = Options::alloc();\n            return $options->theme;\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/kses.php",
    "content": "<?php\n\nif ( ! defined( 'CUSTOM_TAGS' ) ) {\n    define( 'CUSTOM_TAGS', false );\n}\n\n// Ensure that these variables are added to the global namespace\n// (e.g. if using namespaces / autoload in the current PHP environment).\nglobal $allowedposttags, $allowedtags, $allowedentitynames, $allowedxmlentitynames;\n\n\n/**\n * Helper function to add global attributes to a tag in the allowed HTML list.\n *\n * @since 3.5.0\n * @since 5.0.0 Added support for `data-*` wildcard attributes.\n * @since 6.0.0 Added `dir`, `lang`, and `xml:lang` to global attributes.\n *\n * @access private\n * @ignore\n *\n * @param array $value An array of attributes.\n * @return array The array of attributes with global attributes added.\n */\nif (!function_exists('_wp_add_global_attributes')){\n    function _wp_add_global_attributes( $value ) {\n        $global_attributes = array(\n            'aria-describedby' => true,\n            'aria-details'     => true,\n            'aria-label'       => true,\n            'aria-labelledby'  => true,\n            'aria-hidden'      => true,\n            'class'            => true,\n            'data-*'           => true,\n            'dir'              => true,\n            'id'               => true,\n            'lang'             => true,\n            'style'            => true,\n            'title'            => true,\n            'role'             => true,\n            'xml:lang'         => true,\n        );\n\n        if ( true === $value ) {\n            $value = array();\n        }\n\n        if ( is_array( $value ) ) {\n            return array_merge( $value, $global_attributes );\n        }\n\n        return $value;\n    }\n}\n\n\nif ( ! CUSTOM_TAGS ) {\n    /**\n     * KSES global for default allowable HTML tags.\n     *\n     * Can be overridden with the `CUSTOM_TAGS` constant.\n     *\n     * @var array[] $allowedposttags Array of default allowable HTML tags.\n     * @since 2.0.0\n     */\n    $allowedposttags = array(\n        'address'    => array(),\n        'a'          => array(\n            'href'     => true,\n            'rel'      => true,\n            'rev'      => true,\n            'name'     => true,\n            'target'   => true,\n            'download' => array(\n                'valueless' => 'y',\n            ),\n        ),\n        'abbr'       => array(),\n        'acronym'    => array(),\n        'area'       => array(\n            'alt'    => true,\n            'coords' => true,\n            'href'   => true,\n            'nohref' => true,\n            'shape'  => true,\n            'target' => true,\n        ),\n        'article'    => array(\n            'align' => true,\n        ),\n        'aside'      => array(\n            'align' => true,\n        ),\n        'audio'      => array(\n            'autoplay' => true,\n            'controls' => true,\n            'loop'     => true,\n            'muted'    => true,\n            'preload'  => true,\n            'src'      => true,\n        ),\n        'b'          => array(),\n        'bdo'        => array(),\n        'big'        => array(),\n        'blockquote' => array(\n            'cite' => true,\n        ),\n        'br'         => array(),\n        'button'     => array(\n            'disabled' => true,\n            'name'     => true,\n            'type'     => true,\n            'value'    => true,\n        ),\n        'caption'    => array(\n            'align' => true,\n        ),\n        'cite'       => array(),\n        'code'       => array(),\n        'col'        => array(\n            'align'   => true,\n            'char'    => true,\n            'charoff' => true,\n            'span'    => true,\n            'valign'  => true,\n            'width'   => true,\n        ),\n        'colgroup'   => array(\n            'align'   => true,\n            'char'    => true,\n            'charoff' => true,\n            'span'    => true,\n            'valign'  => true,\n            'width'   => true,\n        ),\n        'del'        => array(\n            'datetime' => true,\n        ),\n        'dd'         => array(),\n        'dfn'        => array(),\n        'details'    => array(\n            'align' => true,\n            'open'  => true,\n        ),\n        'div'        => array(\n            'align' => true,\n        ),\n        'dl'         => array(),\n        'dt'         => array(),\n        'em'         => array(),\n        'fieldset'   => array(),\n        'figure'     => array(\n            'align' => true,\n        ),\n        'figcaption' => array(\n            'align' => true,\n        ),\n        'font'       => array(\n            'color' => true,\n            'face'  => true,\n            'size'  => true,\n        ),\n        'footer'     => array(\n            'align' => true,\n        ),\n        'h1'         => array(\n            'align' => true,\n        ),\n        'h2'         => array(\n            'align' => true,\n        ),\n        'h3'         => array(\n            'align' => true,\n        ),\n        'h4'         => array(\n            'align' => true,\n        ),\n        'h5'         => array(\n            'align' => true,\n        ),\n        'h6'         => array(\n            'align' => true,\n        ),\n        'header'     => array(\n            'align' => true,\n        ),\n        'hgroup'     => array(\n            'align' => true,\n        ),\n        'hr'         => array(\n            'align'   => true,\n            'noshade' => true,\n            'size'    => true,\n            'width'   => true,\n        ),\n        'i'          => array(),\n        'img'        => array(\n            'alt'      => true,\n            'align'    => true,\n            'border'   => true,\n            'height'   => true,\n            'hspace'   => true,\n            'loading'  => true,\n            'longdesc' => true,\n            'vspace'   => true,\n            'src'      => true,\n            'usemap'   => true,\n            'width'    => true,\n        ),\n        'ins'        => array(\n            'datetime' => true,\n            'cite'     => true,\n        ),\n        'kbd'        => array(),\n        'label'      => array(\n            'for' => true,\n        ),\n        'legend'     => array(\n            'align' => true,\n        ),\n        'li'         => array(\n            'align' => true,\n            'value' => true,\n        ),\n        'main'       => array(\n            'align' => true,\n        ),\n        'map'        => array(\n            'name' => true,\n        ),\n        'mark'       => array(),\n        'menu'       => array(\n            'type' => true,\n        ),\n        'nav'        => array(\n            'align' => true,\n        ),\n        'object'     => array(\n            'data' => array(\n                'required'       => true,\n                'value_callback' => '_wp_kses_allow_pdf_objects',\n            ),\n            'type' => array(\n                'required' => true,\n                'values'   => array( 'application/pdf' ),\n            ),\n        ),\n        'p'          => array(\n            'align' => true,\n        ),\n        'pre'        => array(\n            'width' => true,\n        ),\n        'q'          => array(\n            'cite' => true,\n        ),\n        'rb'         => array(),\n        'rp'         => array(),\n        'rt'         => array(),\n        'rtc'        => array(),\n        'ruby'       => array(),\n        's'          => array(),\n        'samp'       => array(),\n        'span'       => array(\n            'align' => true,\n        ),\n        'section'    => array(\n            'align' => true,\n        ),\n        'small'      => array(),\n        'strike'     => array(),\n        'strong'     => array(),\n        'sub'        => array(),\n        'summary'    => array(\n            'align' => true,\n        ),\n        'sup'        => array(),\n        'table'      => array(\n            'align'       => true,\n            'bgcolor'     => true,\n            'border'      => true,\n            'cellpadding' => true,\n            'cellspacing' => true,\n            'rules'       => true,\n            'summary'     => true,\n            'width'       => true,\n        ),\n        'tbody'      => array(\n            'align'   => true,\n            'char'    => true,\n            'charoff' => true,\n            'valign'  => true,\n        ),\n        'td'         => array(\n            'abbr'    => true,\n            'align'   => true,\n            'axis'    => true,\n            'bgcolor' => true,\n            'char'    => true,\n            'charoff' => true,\n            'colspan' => true,\n            'headers' => true,\n            'height'  => true,\n            'nowrap'  => true,\n            'rowspan' => true,\n            'scope'   => true,\n            'valign'  => true,\n            'width'   => true,\n        ),\n        'textarea'   => array(\n            'cols'     => true,\n            'rows'     => true,\n            'disabled' => true,\n            'name'     => true,\n            'readonly' => true,\n        ),\n        'tfoot'      => array(\n            'align'   => true,\n            'char'    => true,\n            'charoff' => true,\n            'valign'  => true,\n        ),\n        'th'         => array(\n            'abbr'    => true,\n            'align'   => true,\n            'axis'    => true,\n            'bgcolor' => true,\n            'char'    => true,\n            'charoff' => true,\n            'colspan' => true,\n            'headers' => true,\n            'height'  => true,\n            'nowrap'  => true,\n            'rowspan' => true,\n            'scope'   => true,\n            'valign'  => true,\n            'width'   => true,\n        ),\n        'thead'      => array(\n            'align'   => true,\n            'char'    => true,\n            'charoff' => true,\n            'valign'  => true,\n        ),\n        'title'      => array(),\n        'tr'         => array(\n            'align'   => true,\n            'bgcolor' => true,\n            'char'    => true,\n            'charoff' => true,\n            'valign'  => true,\n        ),\n        'track'      => array(\n            'default' => true,\n            'kind'    => true,\n            'label'   => true,\n            'src'     => true,\n            'srclang' => true,\n        ),\n        'tt'         => array(),\n        'u'          => array(),\n        'ul'         => array(\n            'type' => true,\n        ),\n        'ol'         => array(\n            'start'    => true,\n            'type'     => true,\n            'reversed' => true,\n        ),\n        'var'        => array(),\n        'video'      => array(\n            'autoplay'    => true,\n            'controls'    => true,\n            'height'      => true,\n            'loop'        => true,\n            'muted'       => true,\n            'playsinline' => true,\n            'poster'      => true,\n            'preload'     => true,\n            'src'         => true,\n            'width'       => true,\n        ),\n    );\n\n    /**\n     * @var array[] $allowedtags Array of KSES allowed HTML elements.\n     * @since 1.0.0\n     */\n    $allowedtags = array(\n        'a'          => array(\n            'href'  => true,\n            'title' => true,\n        ),\n        'abbr'       => array(\n            'title' => true,\n        ),\n        'acronym'    => array(\n            'title' => true,\n        ),\n        'b'          => array(),\n        'blockquote' => array(\n            'cite' => true,\n        ),\n        'cite'       => array(),\n        'code'       => array(),\n        'del'        => array(\n            'datetime' => true,\n        ),\n        'em'         => array(),\n        'i'          => array(),\n        'q'          => array(\n            'cite' => true,\n        ),\n        's'          => array(),\n        'strike'     => array(),\n        'strong'     => array(),\n    );\n\n    /**\n     * @var string[] $allowedentitynames Array of KSES allowed HTML entity names.\n     * @since 1.0.0\n     */\n    $allowedentitynames = array(\n        'nbsp',\n        'iexcl',\n        'cent',\n        'pound',\n        'curren',\n        'yen',\n        'brvbar',\n        'sect',\n        'uml',\n        'copy',\n        'ordf',\n        'laquo',\n        'not',\n        'shy',\n        'reg',\n        'macr',\n        'deg',\n        'plusmn',\n        'acute',\n        'micro',\n        'para',\n        'middot',\n        'cedil',\n        'ordm',\n        'raquo',\n        'iquest',\n        'Agrave',\n        'Aacute',\n        'Acirc',\n        'Atilde',\n        'Auml',\n        'Aring',\n        'AElig',\n        'Ccedil',\n        'Egrave',\n        'Eacute',\n        'Ecirc',\n        'Euml',\n        'Igrave',\n        'Iacute',\n        'Icirc',\n        'Iuml',\n        'ETH',\n        'Ntilde',\n        'Ograve',\n        'Oacute',\n        'Ocirc',\n        'Otilde',\n        'Ouml',\n        'times',\n        'Oslash',\n        'Ugrave',\n        'Uacute',\n        'Ucirc',\n        'Uuml',\n        'Yacute',\n        'THORN',\n        'szlig',\n        'agrave',\n        'aacute',\n        'acirc',\n        'atilde',\n        'auml',\n        'aring',\n        'aelig',\n        'ccedil',\n        'egrave',\n        'eacute',\n        'ecirc',\n        'euml',\n        'igrave',\n        'iacute',\n        'icirc',\n        'iuml',\n        'eth',\n        'ntilde',\n        'ograve',\n        'oacute',\n        'ocirc',\n        'otilde',\n        'ouml',\n        'divide',\n        'oslash',\n        'ugrave',\n        'uacute',\n        'ucirc',\n        'uuml',\n        'yacute',\n        'thorn',\n        'yuml',\n        'quot',\n        'amp',\n        'lt',\n        'gt',\n        'apos',\n        'OElig',\n        'oelig',\n        'Scaron',\n        'scaron',\n        'Yuml',\n        'circ',\n        'tilde',\n        'ensp',\n        'emsp',\n        'thinsp',\n        'zwnj',\n        'zwj',\n        'lrm',\n        'rlm',\n        'ndash',\n        'mdash',\n        'lsquo',\n        'rsquo',\n        'sbquo',\n        'ldquo',\n        'rdquo',\n        'bdquo',\n        'dagger',\n        'Dagger',\n        'permil',\n        'lsaquo',\n        'rsaquo',\n        'euro',\n        'fnof',\n        'Alpha',\n        'Beta',\n        'Gamma',\n        'Delta',\n        'Epsilon',\n        'Zeta',\n        'Eta',\n        'Theta',\n        'Iota',\n        'Kappa',\n        'Lambda',\n        'Mu',\n        'Nu',\n        'Xi',\n        'Omicron',\n        'Pi',\n        'Rho',\n        'Sigma',\n        'Tau',\n        'Upsilon',\n        'Phi',\n        'Chi',\n        'Psi',\n        'Omega',\n        'alpha',\n        'beta',\n        'gamma',\n        'delta',\n        'epsilon',\n        'zeta',\n        'eta',\n        'theta',\n        'iota',\n        'kappa',\n        'lambda',\n        'mu',\n        'nu',\n        'xi',\n        'omicron',\n        'pi',\n        'rho',\n        'sigmaf',\n        'sigma',\n        'tau',\n        'upsilon',\n        'phi',\n        'chi',\n        'psi',\n        'omega',\n        'thetasym',\n        'upsih',\n        'piv',\n        'bull',\n        'hellip',\n        'prime',\n        'Prime',\n        'oline',\n        'frasl',\n        'weierp',\n        'image',\n        'real',\n        'trade',\n        'alefsym',\n        'larr',\n        'uarr',\n        'rarr',\n        'darr',\n        'harr',\n        'crarr',\n        'lArr',\n        'uArr',\n        'rArr',\n        'dArr',\n        'hArr',\n        'forall',\n        'part',\n        'exist',\n        'empty',\n        'nabla',\n        'isin',\n        'notin',\n        'ni',\n        'prod',\n        'sum',\n        'minus',\n        'lowast',\n        'radic',\n        'prop',\n        'infin',\n        'ang',\n        'and',\n        'or',\n        'cap',\n        'cup',\n        'int',\n        'sim',\n        'cong',\n        'asymp',\n        'ne',\n        'equiv',\n        'le',\n        'ge',\n        'sub',\n        'sup',\n        'nsub',\n        'sube',\n        'supe',\n        'oplus',\n        'otimes',\n        'perp',\n        'sdot',\n        'lceil',\n        'rceil',\n        'lfloor',\n        'rfloor',\n        'lang',\n        'rang',\n        'loz',\n        'spades',\n        'clubs',\n        'hearts',\n        'diams',\n        'sup1',\n        'sup2',\n        'sup3',\n        'frac14',\n        'frac12',\n        'frac34',\n        'there4',\n    );\n\n    /**\n     * @var string[] $allowedxmlentitynames Array of KSES allowed XML entity names.\n     * @since 5.5.0\n     */\n    $allowedxmlentitynames = array(\n        'amp',\n        'lt',\n        'gt',\n        'apos',\n        'quot',\n    );\n\n    $allowedposttags = array_map( '_wp_add_global_attributes', $allowedposttags );\n} else {\n    $allowedtags     = wp_kses_array_lc( $allowedtags );\n    $allowedposttags = wp_kses_array_lc( $allowedposttags );\n}\n\n/**\n * Converts the keys of an array to lowercase.\n *\n * @since 1.0.0\n *\n * @param array $inarray Unfiltered array.\n * @return array Fixed array with all lowercase keys.\n */\nif (!function_exists('wp_kses_array_lc')) {\n    function wp_kses_array_lc($inarray)\n    {\n        $outarray = array();\n\n        foreach ((array)$inarray as $inkey => $inval) {\n            $outkey = strtolower($inkey);\n            $outarray[$outkey] = array();\n\n            foreach ((array)$inval as $inkey2 => $inval2) {\n                $outkey2 = strtolower($inkey2);\n                $outarray[$outkey][$outkey2] = $inval2;\n            }\n        }\n\n        return $outarray;\n    }\n}\n\n"
  },
  {
    "path": "配套插件/BsCore/functions/media-template.php",
    "content": "<?php\n\n/**\n * Prints the templates used in the media manager.\n *\n * @since 3.5.0\n */\n\n\nif (!defined('MEDIA_TRASH')) {\n    define('MEDIA_TRASH', false);\n}\nif (class_exists('Widget\\Base\\Contents')){\n    require_once 'Attachments.php';\n}\n\nif (!function_exists('wp_print_media_templates')) {\n    function wp_print_media_templates()\n    {\n\n        ?>\n\n        <?php // Template for the media frame: used both in the media grid and in the media modal.\n        $attachments = Attachments::alloc();\n\n        ?>\n        <div id=\"__wp-uploader\" style=\"position: relative; display: none;\"\n             class=\"supports-drag-drop media-modal wp-core-ui\">\n            <div tabindex=\"0\" class=\"media-modal wp-core-ui\" role=\"dialog\" aria-labelledby=\"media-frame-title\">\n                <button type=\"button\" class=\"media-modal-close\"><span class=\"media-modal-icon\"><span\n                            class=\"screen-reader-text\">关闭</span></span></button>\n                <div class=\"media-modal-content\" role=\"document\">\n                    <div class=\"media-frame mode-select wp-core-ui hide-menu\" id=\"__wp-uploader-id-1\">\n                        <div class=\"media-frame-title\" id=\"media-frame-title\"><h1>媒体</h1></div>\n                        <h2 class=\"media-frame-menu-heading\">Actions</h2>\n                        <button type=\"button\" class=\"button button-link media-frame-menu-toggle\" aria-expanded=\"false\">\n                            Menu <span class=\"dashicons dashicons-arrow-down\" aria-hidden=\"true\"></span>\n                        </button>\n                        <div class=\"media-frame-menu\">\n                            <div role=\"tablist\" aria-orientation=\"vertical\" class=\"media-menu\">\n                                <button type=\"button\" role=\"tab\" class=\"media-menu-item active\" id=\"menu-item-library\"\n                                        aria-selected=\"true\">媒体\n                                </button>\n                            </div>\n                        </div>\n                        <div class=\"media-frame-tab-panel\">\n                            <div class=\"media-frame-router\">\n                                <div role=\"tablist\" aria-orientation=\"horizontal\" class=\"media-router\">\n                                    <button type=\"button\" role=\"tab\" class=\"media-menu-item active\"\n                                            id=\"menu-item-upload\"\n                                            aria-selected=\"false\" tabindex=\"-1\">上传\n                                    </button>\n                                    <button type=\"button\" role=\"tab\" class=\"media-menu-item\" id=\"menu-item-browse\"\n                                            aria-selected=\"true\">媒体库\n                                    </button>\n                                </div>\n                            </div>\n                            <div id=\"menu-item-upload-tab\" class=\"media-frame-content\" data-columns=\"10\" role=\"tabpanel\"\n                                 aria-labelledby=\"menu-item-upload\" tabindex=\"0\">\n                                <div class=\"uploader-inline\">\n                                    <div class=\"uploader-inline-content no-upload-message\">\n                                        <?php\n                                        $options = Helper::options();\n                                        $security = Helper::security();\n                                        ?>\n\n                                        <div class=\"upload-ui\">\n                                            <h2 class=\"upload-instructions drop-instructions\">拖拽文件上传</h2>\n                                            <p class=\"upload-instructions drop-instructions\">或</p>\n                                            <button type=\"button\" class=\"browser button button-hero upload-file\"\n                                                    style=\"position: relative; z-index: 1;\"\n                                                    aria-labelledby=\"__wp-uploader-id-1 post-upload-info\">选择文件\n                                            </button>\n                                        </div>\n\n                                        <div class=\"upload-inline-status\">\n                                            <div class=\"media-uploader-status\" style=\"display: none;\">\n                                                <h2>上传中</h2>\n                                                <div class=\"media-progress-bar\"></div>\n                                                <div class=\"upload-details\">\n                                                <span class=\"upload-count\">\n                                                    <span class=\"upload-index\"></span> / <span\n                                                        class=\"upload-total\"></span>\n                                                </span>\n                                                    <span class=\"upload-detail-separator\">–</span>\n                                                    <span class=\"upload-filename\"></span>\n                                                </div>\n                                                <div class=\"upload-errors\"></div>\n                                                <button type=\"button\" class=\"button upload-dismiss-errors\">忽略错误\n                                                </button>\n                                            </div>\n                                            <ul id=\"file-list\"></ul>\n                                        </div>\n                                        <div class=\"post-upload-ui\" id=\"post-upload-info\">\n                                            <p class=\"max-upload-size\">\n                                                最大文件上传大小: <?php\n                                                $max_upload_size = wp_max_upload_size();\n                                                if (!$max_upload_size) {\n                                                    $max_upload_size = 0;\n                                                }\n                                                echo size_format($max_upload_size);\n                                                ?>. </p>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div id=\"menu-item-browse-tab\" style=\"display: none\" class=\"media-frame-content\"\n                                 data-columns=\"10\" role=\"tabpanel\"\n                                 aria-labelledby=\"menu-item-browse\" tabindex=\"0\">\n                                <div class=\"attachments-browser has-load-more\">\n                                    <div class=\"media-toolbar\">\n                                        <!--                                    <div class=\"media-toolbar-secondary\"><h2 class=\"media-attachments-filter-heading\">-->\n                                        <!--                                            Filter media</h2><label for=\"media-attachment-date-filters\"-->\n                                        <!--                                                                    class=\"screen-reader-text\">Filter by-->\n                                        <!--                                            date</label><select id=\"media-attachment-date-filters\"-->\n                                        <!--                                                                class=\"attachment-filters\">-->\n                                        <!--                                            <option value=\"all\">All dates</option>-->\n                                        <!--                                            <option value=\"0\">January 2022</option>-->\n                                        <!--                                        </select><span class=\"spinner\"></span></div>-->\n                                        <div class=\"media-toolbar-primary search-form\"><label for=\"media-search-input\"\n                                                                                              class=\"media-search-input-label\">搜索</label><input\n                                                type=\"search\" id=\"media-search-input\" class=\"search\"></div>\n                                    </div>\n                                    <h2 class=\"media-views-heading screen-reader-text\">Media list</h2>\n                                    <div class=\"attachments-wrapper\">\n                                        <?php if ($attachments->have()): ?>\n                                            <ul tabindex=\"-1\" class=\"attachments ui-sortable ui-sortable-disabled\">\n                                                <?php $img_index = 0;\n                                                while ($attachments->next()): ?>\n                                                    <li tabindex=\"0\" role=\"checkbox\"\n                                                        data-date=\"<?php $attachments->dateWord(); ?>\"\n                                                        aria-label=\"photo-<?php _e($img_index); ?>\"\n                                                        data-name=\"<?php $attachments->attachment->name(); ?>\"\n                                                        aria-checked=\"false\"\n                                                        data-id=\"<?php $attachments->theId(); ?>\"\n                                                        data-edit=\"<?php $options->adminUrl('media.php?cid=' . $attachments->cid); ?>\"\n                                                        class=\"attachment save-ready\">\n                                                        <div\n                                                            class=\"attachment-preview js--select-attachment type-image subtype-jpeg landscape\">\n                                                            <div class=\"thumbnail\">\n                                                                <div class=\"centered\">\n                                                                    <img src=\"<?php $attachments->attachment->url(); ?>\"\n                                                                         draggable=\"false\"\n                                                                         alt=\"<?php $attachments->attachment->name(); ?>\">\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                        <button type=\"button\" class=\"check\" tabindex=\"0\"><span\n                                                                class=\"media-modal-icon\"></span><span\n                                                                class=\"screen-reader-text\">Deselect</span></button>\n                                                    </li>\n                                                    <?php $img_index++;endwhile; ?>\n                                            </ul>\n                                        <?php else: ?>\n                                            <p>没有项目。</p>\n                                        <?php endif; ?>\n\n                                        <div class=\"load-more-wrapper\"><span class=\"spinner\"></span>\n                                            <?php\n                                            $currentPage = $attachments->getCurrentPage();\n                                            $perPage = $attachments->getPageSize();\n                                            if ($attachments->have()): ?>\n                                                <p class=\"load-more-count\">显示 <?php echo($attachments->getTotal()); ?>中的\n                                                    <?php _e(min($currentPage * $perPage, $attachments->getTotal())); ?>\n                                                    个媒体项目</p>\n                                            <?php endif; ?>\n                                            <button type=\"button\" class=\"button load-more hidden button-primary\"\n                                                    data-page=\"<?php _e($currentPage); ?>\"\n                                                    data-totalpage=\"<?php _e($attachments->getTotalPage()); ?>\">加载更多\n                                            </button>\n                                            <button type=\"button\" class=\"button load-more-jump hidden\">跳至首个加载的项目\n                                            </button>\n                                        </div>\n                                        <script>window.ty_media = {\n                                                keywords: '',\n                                                curpage:<?php _e($currentPage); ?>,\n                                                pagesize:<?php _e($perPage); ?>,\n                                                total:<?php _e($attachments->getTotal());?>,\n                                                totalpage:<?php _e($attachments->getTotalPage());?>}</script>\n                                    </div>\n                                    <div class=\"media-sidebar\">\n                                        <div class=\"media-uploader-status\" style=\"display: none;\">\n                                            <h2>Uploading</h2>\n                                            <div class=\"media-progress-bar\">\n                                                <div></div>\n                                            </div>\n                                            <div class=\"upload-details\">\n                                            <span class=\"upload-count\">\n                                                <span class=\"upload-index\"></span> / <span class=\"upload-total\"></span>\n                                            </span>\n                                                <span class=\"upload-detail-separator\">–</span>\n                                                <span class=\"upload-filename\"></span>\n                                            </div>\n                                            <div class=\"upload-errors\"></div>\n                                            <button type=\"button\" class=\"button upload-dismiss-errors\">Dismiss errors\n                                            </button>\n                                        </div>\n                                        <div class=\"attachment-details save-ready\">\n                                            <h2>附件信息<span class=\"settings-save-status\" role=\"status\"><span\n                                                        class=\"spinner\"></span><span class=\"saved\">Saved.</span></span>\n                                            </h2>\n                                            <div class=\"attachment-info\">\n                                                <div class=\"thumbnail thumbnail-image\">\n                                                    <img src=\"\" draggable=\"false\" alt=\"\">\n                                                </div>\n                                                <div class=\"details\">\n                                                    <div class=\"filename\">未选择</div>\n                                                    <div class=\"uploaded\"></div>\n                                                    <a class=\"edit-attachment\" href=\"\" target=\"_blank\">编辑图片</a>\n                                                    <div class=\"compat-meta\"></div>\n                                                </div>\n                                            </div>\n                                            <span class=\"setting\" data-setting=\"url\">\n                                            <label for=\"attachment-details-copy-link\" class=\"name\">文件 URL:</label>\n                                            <input type=\"text\" class=\"attachment-details-copy-link\"\n                                                   id=\"attachment-details-copy-link\" value=\"\" readonly=\"\">\n                                            <div class=\"copy-to-clipboard-container\">\n                                                <button type=\"button\" class=\"button button-small copy-attachment-url\"\n                                                        data-clipboard-target=\"#attachment-details-copy-link\">复制到剪切板</button>\n                                                <span class=\"success hidden\" aria-hidden=\"true\">已复制!</span>\n                                            </div>\n                                        </span>\n                                        </div>\n                                        <form class=\"compat-item\"></form>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        <h2 class=\"media-frame-actions-heading screen-reader-text\">选择媒体动作</h2>\n                        <div class=\"media-frame-toolbar\">\n                            <div class=\"media-toolbar\">\n                                <div class=\"media-toolbar-secondary\"></div>\n                                <div class=\"media-toolbar-primary search-form\">\n                                    <button type=\"button\"\n                                            class=\"button media-button button-primary button-large media-button-select\">\n                                        选择\n                                    </button>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div class=\"media-modal-backdrop\"></div>\n        </div>\n        <script src=\"<?php $options->pluginUrl('BsCore/assets/js/clipboard.min.js'); ?>\"\n                type=\"application/javascript\"></script>\n        <script src=\"<?php $options->pluginUrl('BsCore/assets/js/moxie.js'); ?>\"></script>\n        <script src=\"<?php $options->pluginUrl('BsCore/assets/js/plupload.js'); ?>\"></script>\n        <script type=\"text/javascript\">\n            $(document).ready(function () {\n                $('#menu-item-upload-tab').bind({\n                    dragenter: function () {\n                        $(this).parent().addClass('drag');\n                    },\n                    dragover: function (e) {\n                        $(this).parent().addClass('drag');\n                    },\n                    drop: function () {\n                        $(this).parent().removeClass('drag');\n                    },\n                    dragend: function () {\n                        $(this).parent().removeClass('drag');\n                    },\n                    dragleave: function () {\n                        $(this).parent().removeClass('drag');\n                    }\n                });\n\n                function fileUploadStart(file) {\n                    $('<ul id=\"file-list\"></ul>').appendTo('.upload-inline-status');\n                    $('<li id=\"' + file.id + '\" class=\"loading\">'\n                        + file.name + '</li>').prependTo('#file-list');\n                }\n\n                function fileUploadError(error) {\n                    var file = error.file, code = error.code, word;\n\n                    switch (code) {\n                        case plupload.FILE_SIZE_ERROR:\n                            word = '<?php _e('文件大小超过限制'); ?>';\n                            break;\n                        case plupload.FILE_EXTENSION_ERROR:\n                            word = '<?php _e('文件扩展名不被支持'); ?>';\n                            break;\n                        case plupload.FILE_DUPLICATE_ERROR:\n                            word = '<?php _e('文件已经上传过'); ?>';\n                            break;\n                        case plupload.HTTP_ERROR:\n                        default:\n                            word = '<?php _e('上传出现错误'); ?>';\n                            break;\n                    }\n\n                    var fileError = '<?php _e('%s 上传失败'); ?>'.replace('%s', file.name),\n                        li, exist = $('#' + file.id);\n\n                    if (exist.length > 0) {\n                        li = exist.removeClass('loading').html(fileError);\n                    } else {\n                        $('<ul id=\"file-list\"></ul>').appendTo('.upload-inline-status');\n                        li = $('<li>' + fileError + '<br />' + word + '</li>').prependTo('#file-list');\n                    }\n\n                    li.effect('highlight', {color: '#FBC2C4'}, 2000, function () {\n                        $(this).remove();\n                    });\n                }\n\n                function imageToggleFunc($this, e) {\n                    e.preventDefault();\n                    var instance = $this;\n                    instance.attr('aria-checked', function (index, attr) {\n                        return attr !== true;\n                    });\n                    instance.siblings().attr('aria-checked', false);\n                    instance.siblings().removeClass('selected details');\n                    instance.toggleClass('selected details');\n                    // 附件信息\n                    var info = $('.attachment-info')\n                    info.find('.thumbnail img').attr('src', instance.find('img').attr('src'))\n                    info.find('.details .filename').text(instance.data('name'))\n                    info.find('.details .uploaded').text(instance.data('date'))\n                    info.find('.details .edit-attachment').attr('href', instance.data('edit'))\n                    $('#attachment-details-copy-link').val(instance.find('img').attr('src'))\n                    window.cur_media_select_instance = instance\n                }\n\n                function fileUploadComplete(id, url, data) {\nvar date = new Date();\n      var year = date.getFullYear();\n      var month = date.getMonth() + 1;\n      var strDate = date.getDate();\n      var fullDate = year+'年'+month+'月'+strDate+'日';\n                    $('#' + id).html('<?php _e('文件 %s 已经上传'); ?>'.replace('%s', data.title))\n                        .effect('highlight', 2000, function () {\n                            $(this).remove();\n                            $('#file-list').remove();\n                        });\n                    $('#menu-item-browse').click();\n                    var eachImg = $(\".attachments-wrapper .attachments li\")\n                    eachImg.attr('aria-checked', false);\n                    eachImg.removeClass('selected details');\n                    var html = `<li tabindex=\"0\" role=\"checkbox\" aria-label=\"bsphoto\" aria-checked=\"true\" data-name=\"${data.title}\" data-date=\"${fullDate}\" data-id=\"${id}\"  data-edit=\"<?php $options->adminUrl('media.php?cid='); ?>${data.cid}\" class=\"attachment save-ready selected details\"><div class=\"attachment-preview js--select-attachment type-image subtype-jpeg landscape\"><div class=\"thumbnail\"><div class=\"centered\"><img src=\"${url}\" draggable=\"false\" alt=\"\"></div></div></div><button type=\"button\" class=\"check\" tabindex=\"-1\"><span class=\"media-modal-icon\"></span><span class=\"screen-reader-text\">Deselect</span></button></li>`\n                    $('.attachments-wrapper .attachments').prepend(html);\n                    // rebind\n                    \n                    \n                    \n                    $(\".attachments-wrapper .attachments li\").unbind('click').bind('click', function (e) {\n                        imageToggleFunc($(this), e)\n                        window.cur_media_select_instance = $('.attachments-wrapper ul li').eq(0);\n                    })\n                     //默认选择第一个\n                    $('.attachments-wrapper .attachments li').eq(0).click();\n                    \n                    \n                }\n\n                var uploader = new plupload.Uploader({\n                    browse_button: $('.upload-file').get(0),\n                    url: '<?php $security->index('/action/upload'); ?>',\n                    runtimes: 'html5,flash,html4',\n                    flash_swf_url: '<?php $options->adminStaticUrl('js', 'Moxie.swf'); ?>',\n                    drop_element: $('#menu-item-upload-tab').get(0),\n                    filters: {\n                        max_file_size: '<?php echo size_format($max_upload_size); ?>',\n                        mime_types: [{\n                            'title': '<?php _e('允许上传的文件'); ?>',\n                            'extensions': '<?php echo(implode(',', getAttachmentTypes())); ?>'\n                        }],\n                        prevent_duplicates: true\n                    },\n                    multi_selection: false,\n\n                    init: {\n                        FilesAdded: function (up, files) {\n                            plupload.each(files, function (file) {\n                                fileUploadStart(file);\n                            });\n\n                            uploader.start();\n                        },\n\n                        FileUploaded: function (up, file, result) {\n                            if (200 == result.status) {\n                                var data = $.parseJSON(result.response);\n                                if (data) {\n                                    fileUploadComplete(file.id, data[0], data[1]);\n                                    //alert(data[1].cid);\n                                    $.ajax({\n                        type: \"POST\",\n                        async:true,\n                        url: document.location.protocol+\"/index.php/bsBackendAction\",\n                        data: {\n                            \"type\": 'editmedia',\n                            \"media-cid\":data[1].cid,\n                        },\n                        dateType: \"json\",\n                        success: function(data) {\n                            json = JSON.parse(data);\ntoastr.success('上传成功');\n                        },\n                        complete: function() {\n                        },\n                        error: function() {\n                            toastr.warning('数据获取错误，请稍后再试~~');\n                        }\n                    });\n                    \n                    \n                                    return;\n                                }\n                            }\n\n                            fileUploadError({\n                                code: plupload.HTTP_ERROR,\n                                file: file\n                            });\n                        },\n\n                        Error: function (up, error) {\n                            fileUploadError(error);\n                        }\n                    }\n                });\n                uploader.init();\n\n                //\n                function rebind_imgs_click() {\n                    $(\".attachments-wrapper .attachments li\").unbind('click').bind('click', function (e) {\n                        imageToggleFunc($(this), e)\n                    })\n                }\n\n                var ty_loadmore = $('.button.load-more');\n                var ty_loadmore_jump = $('.button.load-more-jump');\n                var ty_media_search = $('#media-search-input');\n\n                function check_ty_loadmore_show() {\n                    if (window.ty_media.curpage * window.ty_media.pagesize < window.ty_media.total) {\n                        ty_loadmore.text('加载更多')\n                        ty_loadmore.show();\n                    } else {\n                        ty_loadmore.text('加载完成')\n                    }\n                    if (window.ty_media.curpage > 1) {\n                        ty_loadmore_jump.show();\n                    }\n                }\n\n                function ty_loadmore_event_init() {\n                    ty_loadmore.on('click', function (e) {\n                        if (window.ty_media.curpage >= window.ty_media.totalpage) {\n                            return\n                        }\n                        var query;\n                        if (window.ty_media.keywords) {\n                            query = $.query.set('page', window.ty_media.curpage + 1).set('keywords', window.ty_media.keywords).toString();\n                        } else {\n                            query = $.query.set('page', window.ty_media.curpage + 1).toString()\n                        }\n\n                        var url = location.origin + location.pathname + query;\n                        $.get(url, function (res) {\n                            var imgs = $('.attachments-wrapper ul', $(res)).html()\n                            if (imgs) {\n                                $('.attachments-wrapper ul').append(imgs)\n                                rebind_imgs_click()\n                                window.ty_media.curpage = window.ty_media.curpage + 1\n                                check_ty_loadmore_show()\n                                $('.load-more-count').html($('.load-more-count', $(res)).html())\n                            }\n\n                        })\n                    })\n                    ty_loadmore_jump.on('click', function (e) {\n                        $('.attachments-wrapper ul li').eq(1).focus()\n                    })\n                    ty_media_search.on('keypress', function (e) {\n                        if (e.key === \"Enter\") {\n                            var keywords = ty_media_search.val()\n                            var url = location.origin + location.pathname + $.query.set('page', 1).set('keywords', keywords);\n                            $.get(url, function (res) {\n                                var imgs = $('.attachments-wrapper ul', $(res)).html()\n                                if (imgs) {\n                                    $('.attachments-wrapper ul').html(imgs)\n                                    rebind_imgs_click()\n                                    window.ty_media.curpage = 1\n                                    window.ty_media.keywords = keywords\n                                    check_ty_loadmore_show()\n                                    $('.load-more-count').html($('.load-more-count', $(res)).html())\n                                    window.ty_media.curpage = $('.load-more-wrapper .button.load-more', $(res)).data('page')\n                                    window.ty_media.totalpage = $('.load-more-wrapper .button.load-more', $(res)).data('totalpage')\n                                } else {\n                                    window.ty_media.keywords = ''\n                                }\n                                check_ty_loadmore_show()\n                            })\n                        }\n                    })\n                }\n\n                function clipboardInit() {\n                    var clipboard = new ClipboardJS('.copy-attachment-url'),\n                        successTimeout;\n\n                    clipboard.on('success', function (event) {\n                        var triggerElement = $(event.trigger),\n                            successElement = $('.success', triggerElement.closest('.copy-to-clipboard-container'));\n\n                        // Clear the selection and move focus back to the trigger.\n                        event.clearSelection();\n                        // Handle ClipboardJS focus bug, see https://github.com/zenorocha/clipboard.js/issues/680\n                        triggerElement.trigger('focus');\n\n                        // Show success visual feedback.\n                        clearTimeout(successTimeout);\n                        successElement.removeClass('hidden');\n\n                        // Hide success visual feedback after 3 seconds since last success.\n                        successTimeout = setTimeout(function () {\n                            successElement.addClass('hidden');\n                        }, 3000);\n\n                    });\n                }\n\n                function select_func_init() {\n                    $('.media-toolbar .media-button-select').on('click', function (e) {\n                        if (window.cur_media_click_instance && window.cur_media_select_instance) { // in main.js\n                            var input_ele = window.cur_media_click_instance.siblings('input')\n                            var parent = window.cur_media_click_instance.parent()\n                            var img_url = window.cur_media_select_instance.find('img').attr('src')\n                            input_ele.val(img_url)\n                            $('#__wp-uploader').toggle()\n                            var preview = parent.prev()\n                            if (preview.hasClass('csf--preview')) {\n                                preview.find('img').attr('src', img_url)\n                                preview.removeClass('hidden')\n                            }\n                        }\n                    })\n                }\n\n                rebind_imgs_click()\n                check_ty_loadmore_show()\n                ty_loadmore_event_init()\n                select_func_init()\n                clipboardInit()\n\n            });\n        </script>\n        <?php\n\n\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/options.php",
    "content": "<?php\n\n\nuse Typecho\\Db;\n\nconst FRAMEWORK_PLUGIN_NAME = 'plugin:BsCore_';\nconst FRAMEWORK_KEY_PARMAS_NAME = 'plugin:bsOF_key_params';\n\nif (!function_exists('get_option')) {\n\n// get option for framework\n    function get_option($option, $default = false)\n    {\n        $db = Db::get();\n        $pluginName = FRAMEWORK_PLUGIN_NAME;\n        $select = $db->select()->from('table.options')\n            ->where('name = ?', $pluginName);\n\n        $options = $db->fetchRow($select);\n        if (empty($options)) {\n            return $default;\n        } else {\n\n            $options = unserialize($options['value']);\n            if (array_key_exists($option, $options)) {\n                return $options[$option];\n            } else {\n                return $default;\n            }\n        }\n    }\n}\n\n\nif (!function_exists('update_option')) {\n    function update_option($option, $value, $autoload = null)\n    {\n        $db = Db::get();\n        $pluginName = FRAMEWORK_PLUGIN_NAME;\n        $select = $db->select()->from('table.options')\n            ->where('name = ?', $pluginName);\n\n        $options = $db->fetchRow($select);\n        $settings = [$option => $value];\n        if (empty($options)) {\n            $db->query($db->insert('table.options')\n                ->rows([\n                    'name' => $pluginName,\n                    'value' => serialize($settings),\n                    'user' => 0\n                ]));\n        } else {\n            $options = unserialize($options['value']);\n            $options[$option] = $value;\n            $db->query($db->update('table.options')\n                ->rows(['value' => serialize($options)])\n                ->where('name = ?', $pluginName)\n                ->where('user = ?', 0));\n        }\n\n        return true;\n    }\n}\nif (!function_exists('update_bs_key_params')) {\n    function update_bs_key_params($option, $value, $autoload = null)\n    {\n        $db = Db::get();\n        $pluginName = FRAMEWORK_KEY_PARMAS_NAME;\n        $select = $db->select()->from('table.options')\n            ->where('name = ?', $pluginName);\n\n        $options = $db->fetchRow($select);\n        $settings = [$option => $value];\n        if (empty($options)) {\n            $db->query($db->insert('table.options')\n                ->rows([\n                    'name' => $pluginName,\n                    'value' => serialize($settings),\n                    'user' => 0\n                ]));\n        } else {\n            $options = unserialize($options['value']);\n            $options[$option] = $value;\n            $db->query($db->update('table.options')\n                ->rows(['value' => serialize($options)])\n                ->where('name = ?', $pluginName)\n                ->where('user = ?', 0));\n        }\n    }\n}\nif (!function_exists('get_bs_key_params')) {\n\n// get option for framework\n    function get_bs_key_params($option, $default = false)\n    {\n        $db = Db::get();\n        $pluginName = FRAMEWORK_KEY_PARMAS_NAME;\n        $select = $db->select()->from('table.options')\n            ->where('name = ?', $pluginName);\n\n        $options = $db->fetchRow($select);\n        if (empty($options)) {\n            return $default;\n        } else {\n            $options = unserialize($options['value']);\n            if (array_key_exists($option, $options)) {\n                return $options[$option];\n            } else {\n                return $default;\n            }\n        }\n    }\n}\nif (!function_exists('delete_option')) {\n\n    function delete_option($option)\n    {\n        $db = Db::get();\n        $pluginName = FRAMEWORK_PLUGIN_NAME;\n        if (is_scalar($option)) {\n            $option = trim($option);\n        }\n\n        if (empty($option)) {\n            return false;\n        }\n\n        wp_protect_special_option($option);\n\n        // Get the ID, if no ID then return.\n        $select = $db->select()->from('table.options')\n            ->where('name = ?', $pluginName);\n\n        $row = $db->fetchRow($select);\n        if (is_null($row)) {\n            return false;\n        }\n\n        $result = $db->query($db->delete('table.options')->where('name = ?', 'plugin:' . $pluginName));\n\n\n        if ($result) {\n\n            return true;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/plugin.php",
    "content": "<?php\n\n/** @var WP_Hook[] $wp_filter */\nglobal $wp_filter;\n\n/** @var int[] $wp_actions */\nglobal $wp_actions;\n\n/** @var string[] $wp_current_filter */\nglobal $wp_current_filter;\n\nif ( $wp_filter ) {\n    $wp_filter = WP_Hook::build_preinitialized_hooks( $wp_filter );\n} else {\n    $wp_filter = array();\n}\n\nif ( ! isset( $wp_actions ) ) {\n    $wp_actions = array();\n}\n\nif ( ! isset( $wp_current_filter ) ) {\n    $wp_current_filter = array();\n}\nif (!function_exists('add_action')) {\n\n    function add_action($hook_name, $callback, $priority = 10, $accepted_args = 1)\n    {\n        return add_filter($hook_name, $callback, $priority, $accepted_args);\n    }\n}\nif (!function_exists('add_filter')) {\n\n    function add_filter($hook_name, $callback, $priority = 10, $accepted_args = 1)\n    {\n        global $wp_filter;\n\n        if (!isset($wp_filter[$hook_name])) {\n            $wp_filter[$hook_name] = new WP_Hook();\n        }\n\n        $wp_filter[$hook_name]->add_filter($hook_name, $callback, $priority, $accepted_args);\n        return true;\n    }\n}\nif (!function_exists('_wp_filter_build_unique_id')) {\n\n    function _wp_filter_build_unique_id($hook_name, $callback, $priority)\n    {\n        if (is_string($callback)) {\n            return $callback;\n        }\n\n        if (is_object($callback)) {\n            // Closures are currently implemented as objects.\n            $callback = array($callback, '');\n        } else {\n            $callback = (array)$callback;\n        }\n\n        if (is_object($callback[0])) {\n            // Object class calling.\n            return spl_object_hash($callback[0]) . $callback[1];\n        } elseif (is_string($callback[0])) {\n            // Static calling.\n            return $callback[0] . '::' . $callback[1];\n        }\n    }\n}\nif (!function_exists('_wp_call_all_hook')) {\n\n    function _wp_call_all_hook($args)\n    {\n        global $wp_filter;\n\n        $wp_filter['all']->do_all_hook($args);\n    }\n}\nif (!function_exists('do_action')) {\n    function do_action($hook_name, ...$arg)\n    {\n        global $wp_filter, $wp_actions, $wp_current_filter;\n        if (!isset($wp_actions[$hook_name])) {\n            $wp_actions[$hook_name] = 1;\n        } else {\n            ++$wp_actions[$hook_name];\n        }\n\n        // Do 'all' actions first.\n        if (isset($wp_filter['all'])) {\n            $wp_current_filter[] = $hook_name;\n            $all_args = func_get_args(); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection\n            _wp_call_all_hook($all_args);\n        }\n\n        if (!isset($wp_filter[$hook_name])) {\n            if (isset($wp_filter['all'])) {\n                array_pop($wp_current_filter);\n            }\n\n            return;\n        }\n\n        if (!isset($wp_filter['all'])) {\n            $wp_current_filter[] = $hook_name;\n        }\n\n        if (empty($arg)) {\n            $arg[] = '';\n        } elseif (is_array($arg[0]) && 1 === count($arg[0]) && isset($arg[0][0]) && is_object($arg[0][0])) {\n            // Backward compatibility for PHP4-style passing of `array( &$this )` as action `$arg`.\n            $arg[0] = $arg[0][0];\n        }\n\n        $wp_filter[$hook_name]->do_action($arg);\n\n        array_pop($wp_current_filter);\n    }\n}\nif (!function_exists('remove_filter')) {\n    function remove_filter($hook_name, $callback, $priority = 10)\n    {\n        global $wp_filter;\n\n        $r = false;\n\n        if (isset($wp_filter[$hook_name])) {\n            $r = $wp_filter[$hook_name]->remove_filter($hook_name, $callback, $priority);\n\n            if (!$wp_filter[$hook_name]->callbacks) {\n                unset($wp_filter[$hook_name]);\n            }\n        }\n\n        return $r;\n    }\n}\nif (!function_exists('remove_action')) {\n    function remove_action($hook_name, $callback, $priority = 10)\n    {\n        return remove_filter($hook_name, $callback, $priority);\n    }\n}\nif (!class_exists('WP_Hook')) {\n\n    final class WP_Hook implements Iterator, ArrayAccess\n    {\n\n        /**\n         * Hook callbacks.\n         *\n         * @since 4.7.0\n         * @var array\n         */\n        public $callbacks = array();\n\n        /**\n         * The priority keys of actively running iterations of a hook.\n         *\n         * @since 4.7.0\n         * @var array\n         */\n        private $iterations = array();\n\n        /**\n         * The current priority of actively running iterations of a hook.\n         *\n         * @since 4.7.0\n         * @var array\n         */\n        private $current_priority = array();\n\n        /**\n         * Number of levels this hook can be recursively called.\n         *\n         * @since 4.7.0\n         * @var int\n         */\n        private $nesting_level = 0;\n\n        /**\n         * Flag for if we're currently doing an action, rather than a filter.\n         *\n         * @since 4.7.0\n         * @var bool\n         */\n        private $doing_action = false;\n\n        /**\n         * Adds a callback function to a filter hook.\n         *\n         * @param string $hook_name The name of the filter to add the callback to.\n         * @param callable $callback The callback to be run when the filter is applied.\n         * @param int $priority The order in which the functions associated with a particular filter\n         *                                are executed. Lower numbers correspond with earlier execution,\n         *                                and functions with the same priority are executed in the order\n         *                                in which they were added to the filter.\n         * @param int $accepted_args The number of arguments the function accepts.\n         * @since 4.7.0\n         *\n         */\n        public function add_filter($hook_name, $callback, $priority, $accepted_args)\n        {\n            $idx = _wp_filter_build_unique_id($hook_name, $callback, $priority);\n\n            $priority_existed = isset($this->callbacks[$priority]);\n\n            $this->callbacks[$priority][$idx] = array(\n                'function' => $callback,\n                'accepted_args' => $accepted_args,\n            );\n\n            // If we're adding a new priority to the list, put them back in sorted order.\n            if (!$priority_existed && count($this->callbacks) > 1) {\n                ksort($this->callbacks, SORT_NUMERIC);\n            }\n\n            if ($this->nesting_level > 0) {\n                $this->resort_active_iterations($priority, $priority_existed);\n            }\n        }\n\n        /**\n         * Handles resetting callback priority keys mid-iteration.\n         *\n         * @param false|int $new_priority Optional. The priority of the new filter being added. Default false,\n         *                                    for no priority being added.\n         * @param bool $priority_existed Optional. Flag for whether the priority already existed before the new\n         *                                    filter was added. Default false.\n         * @since 4.7.0\n         *\n         */\n        private function resort_active_iterations($new_priority = false, $priority_existed = false)\n        {\n            $new_priorities = array_keys($this->callbacks);\n\n            // If there are no remaining hooks, clear out all running iterations.\n            if (!$new_priorities) {\n                foreach ($this->iterations as $index => $iteration) {\n                    $this->iterations[$index] = $new_priorities;\n                }\n\n                return;\n            }\n\n            $min = min($new_priorities);\n\n            foreach ($this->iterations as $index => &$iteration) {\n                $current = current($iteration);\n\n                // If we're already at the end of this iteration, just leave the array pointer where it is.\n                if (false === $current) {\n                    continue;\n                }\n\n                $iteration = $new_priorities;\n\n                if ($current < $min) {\n                    array_unshift($iteration, $current);\n                    continue;\n                }\n\n                while (current($iteration) < $current) {\n                    if (false === next($iteration)) {\n                        break;\n                    }\n                }\n\n                // If we have a new priority that didn't exist, but ::apply_filters() or ::do_action() thinks it's the current priority...\n                if ($new_priority === $this->current_priority[$index] && !$priority_existed) {\n                    /*\n                     * ...and the new priority is the same as what $this->iterations thinks is the previous\n                     * priority, we need to move back to it.\n                     */\n\n                    if (false === current($iteration)) {\n                        // If we've already moved off the end of the array, go back to the last element.\n                        $prev = end($iteration);\n                    } else {\n                        // Otherwise, just go back to the previous element.\n                        $prev = prev($iteration);\n                    }\n\n                    if (false === $prev) {\n                        // Start of the array. Reset, and go about our day.\n                        reset($iteration);\n                    } elseif ($new_priority !== $prev) {\n                        // Previous wasn't the same. Move forward again.\n                        next($iteration);\n                    }\n                }\n            }\n\n            unset($iteration);\n        }\n\n        /**\n         * Removes a callback function from a filter hook.\n         *\n         * @param string $hook_name The filter hook to which the function to be removed is hooked.\n         * @param callable|string|array $callback The callback to be removed from running when the filter is applied.\n         *                                         This method can be called unconditionally to speculatively remove\n         *                                         a callback that may or may not exist.\n         * @param int $priority The exact priority used when adding the original filter callback.\n         * @return bool Whether the callback existed before it was removed.\n         * @since 4.7.0\n         *\n         */\n        public function remove_filter($hook_name, $callback, $priority)\n        {\n            $function_key = _wp_filter_build_unique_id($hook_name, $callback, $priority);\n\n            $exists = isset($this->callbacks[$priority][$function_key]);\n\n            if ($exists) {\n                unset($this->callbacks[$priority][$function_key]);\n\n                if (!$this->callbacks[$priority]) {\n                    unset($this->callbacks[$priority]);\n\n                    if ($this->nesting_level > 0) {\n                        $this->resort_active_iterations();\n                    }\n                }\n            }\n\n            return $exists;\n        }\n\n        /**\n         * Checks if a specific callback has been registered for this hook.\n         *\n         * When using the `$callback` argument, this function may return a non-boolean value\n         * that evaluates to false (e.g. 0), so use the `===` operator for testing the return value.\n         *\n         * @param string $hook_name Optional. The name of the filter hook. Default empty.\n         * @param callable|string|array|false $callback Optional. The callback to check for.\n         *                                               This method can be called unconditionally to speculatively check\n         *                                               a callback that may or may not exist. Default false.\n         * @return bool|int If `$callback` is omitted, returns boolean for whether the hook has\n         *                  anything registered. When checking a specific function, the priority\n         *                  of that hook is returned, or false if the function is not attached.\n         * @since 4.7.0\n         *\n         */\n        public function has_filter($hook_name = '', $callback = false)\n        {\n            if (false === $callback) {\n                return $this->has_filters();\n            }\n\n            $function_key = _wp_filter_build_unique_id($hook_name, $callback, false);\n\n            if (!$function_key) {\n                return false;\n            }\n\n            foreach ($this->callbacks as $priority => $callbacks) {\n                if (isset($callbacks[$function_key])) {\n                    return $priority;\n                }\n            }\n\n            return false;\n        }\n\n        /**\n         * Checks if any callbacks have been registered for this hook.\n         *\n         * @return bool True if callbacks have been registered for the current hook, otherwise false.\n         * @since 4.7.0\n         *\n         */\n        public function has_filters()\n        {\n            foreach ($this->callbacks as $callbacks) {\n                if ($callbacks) {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        /**\n         * Removes all callbacks from the current filter.\n         *\n         * @param int|false $priority Optional. The priority number to remove. Default false.\n         * @since 4.7.0\n         *\n         */\n        public function remove_all_filters($priority = false)\n        {\n            if (!$this->callbacks) {\n                return;\n            }\n\n            if (false === $priority) {\n                $this->callbacks = array();\n            } elseif (isset($this->callbacks[$priority])) {\n                unset($this->callbacks[$priority]);\n            }\n\n            if ($this->nesting_level > 0) {\n                $this->resort_active_iterations();\n            }\n        }\n\n        /**\n         * Calls the callback functions that have been added to a filter hook.\n         *\n         * @param mixed $value The value to filter.\n         * @param array $args Additional parameters to pass to the callback functions.\n         *                     This array is expected to include $value at index 0.\n         * @return mixed The filtered value after all hooked functions are applied to it.\n         * @since 4.7.0\n         *\n         */\n        public function apply_filters($value, $args)\n        {\n            if (!$this->callbacks) {\n                return $value;\n            }\n\n            $nesting_level = $this->nesting_level++;\n\n            $this->iterations[$nesting_level] = array_keys($this->callbacks);\n            $num_args = count($args);\n\n            do {\n                $this->current_priority[$nesting_level] = current($this->iterations[$nesting_level]);\n                $priority = $this->current_priority[$nesting_level];\n\n                foreach ($this->callbacks[$priority] as $the_) {\n                    if (!$this->doing_action) {\n                        $args[0] = $value;\n                    }\n\n                    // Avoid the array_slice() if possible.\n                    if (0 == $the_['accepted_args']) {\n                        $value = call_user_func($the_['function']);\n                    } elseif ($the_['accepted_args'] >= $num_args) {\n                        $value = call_user_func_array($the_['function'], $args);\n                    } else {\n                        $value = call_user_func_array($the_['function'], array_slice($args, 0, (int)$the_['accepted_args']));\n                    }\n                }\n            } while (false !== next($this->iterations[$nesting_level]));\n\n            unset($this->iterations[$nesting_level]);\n            unset($this->current_priority[$nesting_level]);\n\n            $this->nesting_level--;\n\n            return $value;\n        }\n\n        /**\n         * Calls the callback functions that have been added to an action hook.\n         *\n         * @param array $args Parameters to pass to the callback functions.\n         * @since 4.7.0\n         *\n         */\n        public function do_action($args)\n        {\n            $this->doing_action = true;\n            $this->apply_filters('', $args);\n\n            // If there are recursive calls to the current action, we haven't finished it until we get to the last one.\n            if (!$this->nesting_level) {\n                $this->doing_action = false;\n            }\n        }\n\n        /**\n         * Processes the functions hooked into the 'all' hook.\n         *\n         * @param array $args Arguments to pass to the hook callbacks. Passed by reference.\n         * @since 4.7.0\n         *\n         */\n        public function do_all_hook(&$args)\n        {\n            $nesting_level = $this->nesting_level++;\n            $this->iterations[$nesting_level] = array_keys($this->callbacks);\n\n            do {\n                $priority = current($this->iterations[$nesting_level]);\n\n                foreach ($this->callbacks[$priority] as $the_) {\n                    call_user_func_array($the_['function'], $args);\n                }\n            } while (false !== next($this->iterations[$nesting_level]));\n\n            unset($this->iterations[$nesting_level]);\n            $this->nesting_level--;\n        }\n\n        /**\n         * Return the current priority level of the currently running iteration of the hook.\n         *\n         * @return int|false If the hook is running, return the current priority level.\n         *                   If it isn't running, return false.\n         * @since 4.7.0\n         *\n         */\n        public function current_priority()\n        {\n            if (false === current($this->iterations)) {\n                return false;\n            }\n\n            return current(current($this->iterations));\n        }\n\n        /**\n         * Normalizes filters set up before WordPress has initialized to WP_Hook objects.\n         *\n         * The `$filters` parameter should be an array keyed by hook name, with values\n         * containing either:\n         *\n         *  - A `WP_Hook` instance\n         *  - An array of callbacks keyed by their priorities\n         *\n         * Examples:\n         *\n         *     $filters = array(\n         *         'wp_fatal_error_handler_enabled' => array(\n         *             10 => array(\n         *                 array(\n         *                     'accepted_args' => 0,\n         *                     'function'      => function() {\n         *                         return false;\n         *                     },\n         *                 ),\n         *             ),\n         *         ),\n         *     );\n         *\n         * @param array $filters Filters to normalize. See documentation above for details.\n         * @return WP_Hook[] Array of normalized filters.\n         * @since 4.7.0\n         *\n         */\n        public static function build_preinitialized_hooks($filters)\n        {\n            /** @var WP_Hook[] $normalized */\n            $normalized = array();\n\n            foreach ($filters as $hook_name => $callback_groups) {\n                if (is_object($callback_groups) && $callback_groups instanceof WP_Hook) {\n                    $normalized[$hook_name] = $callback_groups;\n                    continue;\n                }\n\n                $hook = new WP_Hook();\n\n                // Loop through callback groups.\n                foreach ($callback_groups as $priority => $callbacks) {\n\n                    // Loop through callbacks.\n                    foreach ($callbacks as $cb) {\n                        $hook->add_filter($hook_name, $cb['function'], $priority, $cb['accepted_args']);\n                    }\n                }\n\n                $normalized[$hook_name] = $hook;\n            }\n\n            return $normalized;\n        }\n\n        /**\n         * Determines whether an offset value exists.\n         *\n         * @param mixed $offset An offset to check for.\n         * @return bool True if the offset exists, false otherwise.\n         * @since 4.7.0\n         *\n         * @link https://www.php.net/manual/en/arrayaccess.offsetexists.php\n         *\n         */\n        #[ReturnTypeWillChange]\n        public function offsetExists($offset)\n        {\n            return isset($this->callbacks[$offset]);\n        }\n\n        /**\n         * Retrieves a value at a specified offset.\n         *\n         * @param mixed $offset The offset to retrieve.\n         * @return mixed If set, the value at the specified offset, null otherwise.\n         * @since 4.7.0\n         *\n         * @link https://www.php.net/manual/en/arrayaccess.offsetget.php\n         *\n         */\n        #[ReturnTypeWillChange]\n        public function offsetGet($offset)\n        {\n            return isset($this->callbacks[$offset]) ? $this->callbacks[$offset] : null;\n        }\n\n        /**\n         * Sets a value at a specified offset.\n         *\n         * @param mixed $offset The offset to assign the value to.\n         * @param mixed $value The value to set.\n         * @since 4.7.0\n         *\n         * @link https://www.php.net/manual/en/arrayaccess.offsetset.php\n         *\n         */\n        #[ReturnTypeWillChange]\n        public function offsetSet($offset, $value)\n        {\n            if (is_null($offset)) {\n                $this->callbacks[] = $value;\n            } else {\n                $this->callbacks[$offset] = $value;\n            }\n        }\n\n        /**\n         * Unsets a specified offset.\n         *\n         * @param mixed $offset The offset to unset.\n         * @link https://www.php.net/manual/en/arrayaccess.offsetunset.php\n         *\n         * @since 4.7.0\n         *\n         */\n        #[ReturnTypeWillChange]\n        public function offsetUnset($offset)\n        {\n            unset($this->callbacks[$offset]);\n        }\n\n        /**\n         * Returns the current element.\n         *\n         * @return array Of callbacks at current priority.\n         * @link https://www.php.net/manual/en/iterator.current.php\n         *\n         * @since 4.7.0\n         *\n         */\n        #[ReturnTypeWillChange]\n        public function current()\n        {\n            return current($this->callbacks);\n        }\n\n        /**\n         * Moves forward to the next element.\n         *\n         * @return array Of callbacks at next priority.\n         * @link https://www.php.net/manual/en/iterator.next.php\n         *\n         * @since 4.7.0\n         *\n         */\n        #[ReturnTypeWillChange]\n        public function next()\n        {\n            return next($this->callbacks);\n        }\n\n        /**\n         * Returns the key of the current element.\n         *\n         * @return mixed Returns current priority on success, or NULL on failure\n         * @link https://www.php.net/manual/en/iterator.key.php\n         *\n         * @since 4.7.0\n         *\n         */\n        #[ReturnTypeWillChange]\n        public function key()\n        {\n            return key($this->callbacks);\n        }\n\n        /**\n         * Checks if current position is valid.\n         *\n         * @return bool Whether the current position is valid.\n         * @link https://www.php.net/manual/en/iterator.valid.php\n         *\n         * @since 4.7.0\n         *\n         */\n        #[ReturnTypeWillChange]\n        public function valid()\n        {\n            return key($this->callbacks) !== null;\n        }\n\n        /**\n         * Rewinds the Iterator to the first element.\n         *\n         * @since 4.7.0\n         *\n         * @link https://www.php.net/manual/en/iterator.rewind.php\n         */\n        #[ReturnTypeWillChange]\n        public function rewind()\n        {\n            reset($this->callbacks);\n        }\n\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/sanitize.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Sanitize\n * Replace letter a to letter b\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_sanitize_replace_a_to_b' ) ) {\n  function csf_sanitize_replace_a_to_b( $value ) {\n    return str_replace( 'a', 'b', $value );\n  }\n}\n\n/**\n *\n * Sanitize title\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_sanitize_title' ) ) {\n  function csf_sanitize_title( $value ) {\n    return sanitize_title( $value );\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/validate.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Email validate\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_validate_email' ) ) {\n  function csf_validate_email( $value ) {\n\n    if ( ! filter_var( $value, FILTER_VALIDATE_EMAIL ) ) {\n      return esc_html__( 'Please enter a valid email address.', 'csf' );\n    }\n\n  }\n}\n\n/**\n *\n * Numeric validate\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_validate_numeric' ) ) {\n  function csf_validate_numeric( $value ) {\n\n    if ( ! is_numeric( $value ) ) {\n      return esc_html__( 'Please enter a valid number.', 'csf' );\n    }\n\n  }\n}\n\n/**\n *\n * Required validate\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_validate_required' ) ) {\n  function csf_validate_required( $value ) {\n\n    if ( empty( $value ) ) {\n      return esc_html__( 'This field is required.', 'csf' );\n    }\n\n  }\n}\n\n/**\n *\n * URL validate\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_validate_url' ) ) {\n  function csf_validate_url( $value ) {\n\n    if ( ! filter_var( $value, FILTER_VALIDATE_URL ) ) {\n      return esc_html__( 'Please enter a valid URL.', 'csf' );\n    }\n\n  }\n}\n\n/**\n *\n * Email validate for Customizer\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_customize_validate_email' ) ) {\n  function csf_customize_validate_email( $validity, $value, $wp_customize ) {\n\n    if ( ! sanitize_email( $value ) ) {\n      $validity->add( 'required', esc_html__( 'Please enter a valid email address.', 'csf' ) );\n    }\n\n    return $validity;\n\n  }\n}\n\n/**\n *\n * Numeric validate for Customizer\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_customize_validate_numeric' ) ) {\n  function csf_customize_validate_numeric( $validity, $value, $wp_customize ) {\n\n    if ( ! is_numeric( $value ) ) {\n      $validity->add( 'required', esc_html__( 'Please enter a valid number.', 'csf' ) );\n    }\n\n    return $validity;\n\n  }\n}\n\n/**\n *\n * Required validate for Customizer\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_customize_validate_required' ) ) {\n  function csf_customize_validate_required( $validity, $value, $wp_customize ) {\n\n    if ( empty( $value ) ) {\n      $validity->add( 'required', esc_html__( 'This field is required.', 'csf' ) );\n    }\n\n    return $validity;\n\n  }\n}\n\n/**\n *\n * URL validate for Customizer\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! function_exists( 'csf_customize_validate_url' ) ) {\n  function csf_customize_validate_url( $validity, $value, $wp_customize ) {\n\n    if ( ! filter_var( $value, FILTER_VALIDATE_URL ) ) {\n      $validity->add( 'required', esc_html__( 'Please enter a valid URL.', 'csf' ) );\n    }\n\n    return $validity;\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/walker.php",
    "content": "<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.\n/**\n *\n * Custom Walker for Nav Menu Edit\n *\n * @since 1.0.0\n * @version 1.0.0\n *\n */\nif ( ! class_exists( 'CSF_Walker_Nav_Menu_Edit' ) && class_exists( 'Walker_Nav_Menu_Edit' ) ) {\n  class CSF_Walker_Nav_Menu_Edit extends Walker_Nav_Menu_Edit {\n\n    public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {\n\n      $html = '';\n\n      parent::start_el( $html, $item, $depth, $args, $id );\n\n      ob_start();\n      do_action( 'wp_nav_menu_item_custom_fields', $item->ID, $item, $depth, $args );\n      $custom_fields = ob_get_clean();\n\n      $output .= preg_replace( '/(?=<(fieldset|p)[^>]+class=\"[^\"]*field-move)/', $custom_fields, $html );\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/functions/wp_query.php",
    "content": "<?php\n/**\n * Query API: WP_Query class\n *\n * @package WordPress\n * @subpackage Query\n * @since 4.7.0\n */\nif (!function_exists('wp_filter_object_list')) {\n\n    function wp_filter_object_list($list, $args = array(), $operator = 'and', $field = false)\n    {\n        if (!is_array($list)) {\n            return array();\n        }\n\n        $util = new WP_List_Util($list);\n\n        $util->filter($args, $operator);\n\n        if ($field) {\n            $util->pluck($field);\n        }\n\n        return $util->get_output();\n    }\n}\nif (!function_exists('get_taxonomies')) {\n    function get_taxonomies($args = array(), $output = 'names', $operator = 'and')\n    {\n        global $wp_taxonomies;\n\n        $field = ('names' === $output) ? 'name' : false;\n\n        return wp_filter_object_list($wp_taxonomies, $args, $operator, $field);\n    }\n}\n/**\n * The WordPress Query class.\n *\n * @link https://developer.wordpress.org/reference/classes/wp_query/\n *\n * @since 1.5.0\n * @since 4.5.0 Removed the `$comments_popup` property.\n */\nif (!class_exists('WP_Query')) {\n    class WP_Query\n    {\n\n        /**\n         * Query vars set by the user.\n         *\n         * @since 1.5.0\n         * @var array\n         */\n        public $query;\n\n        /**\n         * Query vars, after parsing.\n         *\n         * @since 1.5.0\n         * @var array\n         */\n        public $query_vars = array();\n\n        /**\n         * Taxonomy query, as passed to get_tax_sql().\n         *\n         * @since 3.1.0\n         * @var WP_Tax_Query A taxonomy query instance.\n         */\n        public $tax_query;\n\n        /**\n         * Metadata query container.\n         *\n         * @since 3.2.0\n         * @var WP_Meta_Query A meta query instance.\n         */\n        public $meta_query = false;\n\n        /**\n         * Date query container.\n         *\n         * @since 3.7.0\n         * @var WP_Date_Query A date query instance.\n         */\n        public $date_query = false;\n\n        /**\n         * Holds the data for a single object that is queried.\n         *\n         * Holds the contents of a post, page, category, attachment.\n         *\n         * @since 1.5.0\n         * @var WP_Term|WP_Post_Type|WP_Post|WP_User|null\n         */\n        public $queried_object;\n\n        /**\n         * The ID of the queried object.\n         *\n         * @since 1.5.0\n         * @var int\n         */\n        public $queried_object_id;\n\n        /**\n         * SQL for the database query.\n         *\n         * @since 2.0.1\n         * @var string\n         */\n        public $request;\n\n        /**\n         * Array of post objects or post IDs.\n         *\n         * @since 1.5.0\n         * @var WP_Post[]|int[]\n         */\n        public $posts;\n\n        /**\n         * The number of posts for the current query.\n         *\n         * @since 1.5.0\n         * @var int\n         */\n        public $post_count = 0;\n\n        /**\n         * Index of the current item in the loop.\n         *\n         * @since 1.5.0\n         * @var int\n         */\n        public $current_post = -1;\n\n        /**\n         * Whether the loop has started and the caller is in the loop.\n         *\n         * @since 2.0.0\n         * @var bool\n         */\n        public $in_the_loop = false;\n\n        /**\n         * The current post.\n         *\n         * This property does not get populated when the `fields` argument is set to\n         * `ids` or `id=>parent`.\n         *\n         * @since 1.5.0\n         * @var WP_Post|null\n         */\n        public $post;\n\n        /**\n         * The list of comments for current post.\n         *\n         * @since 2.2.0\n         * @var WP_Comment[]\n         */\n        public $comments;\n\n        /**\n         * The number of comments for the posts.\n         *\n         * @since 2.2.0\n         * @var int\n         */\n        public $comment_count = 0;\n\n        /**\n         * The index of the comment in the comment loop.\n         *\n         * @since 2.2.0\n         * @var int\n         */\n        public $current_comment = -1;\n\n        /**\n         * Current comment object.\n         *\n         * @since 2.2.0\n         * @var WP_Comment\n         */\n        public $comment;\n\n        /**\n         * The number of found posts for the current query.\n         *\n         * If limit clause was not used, equals $post_count.\n         *\n         * @since 2.1.0\n         * @var int\n         */\n        public $found_posts = 0;\n\n        /**\n         * The number of pages.\n         *\n         * @since 2.1.0\n         * @var int\n         */\n        public $max_num_pages = 0;\n\n        /**\n         * The number of comment pages.\n         *\n         * @since 2.7.0\n         * @var int\n         */\n        public $max_num_comment_pages = 0;\n\n        /**\n         * Signifies whether the current query is for a single post.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_single = false;\n\n        /**\n         * Signifies whether the current query is for a preview.\n         *\n         * @since 2.0.0\n         * @var bool\n         */\n        public $is_preview = false;\n\n        /**\n         * Signifies whether the current query is for a page.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_page = false;\n\n        /**\n         * Signifies whether the current query is for an archive.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_archive = false;\n\n        /**\n         * Signifies whether the current query is for a date archive.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_date = false;\n\n        /**\n         * Signifies whether the current query is for a year archive.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_year = false;\n\n        /**\n         * Signifies whether the current query is for a month archive.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_month = false;\n\n        /**\n         * Signifies whether the current query is for a day archive.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_day = false;\n\n        /**\n         * Signifies whether the current query is for a specific time.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_time = false;\n\n        /**\n         * Signifies whether the current query is for an author archive.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_author = false;\n\n        /**\n         * Signifies whether the current query is for a category archive.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_category = false;\n\n        /**\n         * Signifies whether the current query is for a tag archive.\n         *\n         * @since 2.3.0\n         * @var bool\n         */\n        public $is_tag = false;\n\n        /**\n         * Signifies whether the current query is for a taxonomy archive.\n         *\n         * @since 2.5.0\n         * @var bool\n         */\n        public $is_tax = false;\n\n        /**\n         * Signifies whether the current query is for a search.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_search = false;\n\n        /**\n         * Signifies whether the current query is for a feed.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_feed = false;\n\n        /**\n         * Signifies whether the current query is for a comment feed.\n         *\n         * @since 2.2.0\n         * @var bool\n         */\n        public $is_comment_feed = false;\n\n        /**\n         * Signifies whether the current query is for trackback endpoint call.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_trackback = false;\n\n        /**\n         * Signifies whether the current query is for the site homepage.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_home = false;\n\n        /**\n         * Signifies whether the current query is for the Privacy Policy page.\n         *\n         * @since 5.2.0\n         * @var bool\n         */\n        public $is_privacy_policy = false;\n\n        /**\n         * Signifies whether the current query couldn't find anything.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_404 = false;\n\n        /**\n         * Signifies whether the current query is for an embed.\n         *\n         * @since 4.4.0\n         * @var bool\n         */\n        public $is_embed = false;\n\n        /**\n         * Signifies whether the current query is for a paged result and not for the first page.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_paged = false;\n\n        /**\n         * Signifies whether the current query is for an administrative interface page.\n         *\n         * @since 1.5.0\n         * @var bool\n         */\n        public $is_admin = false;\n\n        /**\n         * Signifies whether the current query is for an attachment page.\n         *\n         * @since 2.0.0\n         * @var bool\n         */\n        public $is_attachment = false;\n\n        /**\n         * Signifies whether the current query is for an existing single post of any post type\n         * (post, attachment, page, custom post types).\n         *\n         * @since 2.1.0\n         * @var bool\n         */\n        public $is_singular = false;\n\n        /**\n         * Signifies whether the current query is for the robots.txt file.\n         *\n         * @since 2.1.0\n         * @var bool\n         */\n        public $is_robots = false;\n\n        /**\n         * Signifies whether the current query is for the favicon.ico file.\n         *\n         * @since 5.4.0\n         * @var bool\n         */\n        public $is_favicon = false;\n\n        /**\n         * Signifies whether the current query is for the page_for_posts page.\n         *\n         * Basically, the homepage if the option isn't set for the static homepage.\n         *\n         * @since 2.1.0\n         * @var bool\n         */\n        public $is_posts_page = false;\n\n        /**\n         * Signifies whether the current query is for a post type archive.\n         *\n         * @since 3.1.0\n         * @var bool\n         */\n        public $is_post_type_archive = false;\n\n        /**\n         * Stores the ->query_vars state like md5(serialize( $this->query_vars ) ) so we know\n         * whether we have to re-parse because something has changed\n         *\n         * @since 3.1.0\n         * @var bool|string\n         */\n        private $query_vars_hash = false;\n\n        /**\n         * Whether query vars have changed since the initial parse_query() call. Used to catch modifications to query vars made\n         * via pre_get_posts hooks.\n         *\n         * @since 3.1.1\n         */\n        private $query_vars_changed = true;\n\n        /**\n         * Set if post thumbnails are cached\n         *\n         * @since 3.2.0\n         * @var bool\n         */\n        public $thumbnails_cached = false;\n\n        /**\n         * Cached list of search stopwords.\n         *\n         * @since 3.7.0\n         * @var array\n         */\n        private $stopwords;\n\n        private $compat_fields = array('query_vars_hash', 'query_vars_changed');\n\n        private $compat_methods = array('init_query_flags', 'parse_tax_query');\n\n        /**\n         * Resets query flags to false.\n         *\n         * The query flags are what page info WordPress was able to figure out.\n         *\n         * @since 2.0.0\n         */\n        private function init_query_flags()\n        {\n            $this->is_single = false;\n            $this->is_preview = false;\n            $this->is_page = false;\n            $this->is_archive = false;\n            $this->is_date = false;\n            $this->is_year = false;\n            $this->is_month = false;\n            $this->is_day = false;\n            $this->is_time = false;\n            $this->is_author = false;\n            $this->is_category = false;\n            $this->is_tag = false;\n            $this->is_tax = false;\n            $this->is_search = false;\n            $this->is_feed = false;\n            $this->is_comment_feed = false;\n            $this->is_trackback = false;\n            $this->is_home = false;\n            $this->is_privacy_policy = false;\n            $this->is_404 = false;\n            $this->is_paged = false;\n            $this->is_admin = false;\n            $this->is_attachment = false;\n            $this->is_singular = false;\n            $this->is_robots = false;\n            $this->is_favicon = false;\n            $this->is_posts_page = false;\n            $this->is_post_type_archive = false;\n        }\n\n        /**\n         * Initiates object properties and sets default values.\n         *\n         * @since 1.5.0\n         */\n        public function init()\n        {\n            unset($this->posts);\n            unset($this->query);\n            $this->query_vars = array();\n            unset($this->queried_object);\n            unset($this->queried_object_id);\n            $this->post_count = 0;\n            $this->current_post = -1;\n            $this->in_the_loop = false;\n            unset($this->request);\n            unset($this->post);\n            unset($this->comments);\n            unset($this->comment);\n            $this->comment_count = 0;\n            $this->current_comment = -1;\n            $this->found_posts = 0;\n            $this->max_num_pages = 0;\n            $this->max_num_comment_pages = 0;\n\n            $this->init_query_flags();\n        }\n\n        /**\n         * Reparse the query vars.\n         *\n         * @since 1.5.0\n         */\n        public function parse_query_vars()\n        {\n            $this->parse_query();\n        }\n\n        /**\n         * Fills in the query variables, which do not exist within the parameter.\n         *\n         * @param array $array Defined query variables.\n         * @return array Complete query variables with undefined ones filled in empty.\n         * @since 2.1.0\n         * @since 4.5.0 Removed the `comments_popup` public query variable.\n         *\n         */\n        public function fill_query_vars($array)\n        {\n            $keys = array(\n                'error',\n                'm',\n                'p',\n                'post_parent',\n                'subpost',\n                'subpost_id',\n                'attachment',\n                'attachment_id',\n                'name',\n                'pagename',\n                'page_id',\n                'second',\n                'minute',\n                'hour',\n                'day',\n                'monthnum',\n                'year',\n                'w',\n                'category_name',\n                'tag',\n                'cat',\n                'tag_id',\n                'author',\n                'author_name',\n                'feed',\n                'tb',\n                'paged',\n                'meta_key',\n                'meta_value',\n                'preview',\n                's',\n                'sentence',\n                'title',\n                'fields',\n                'menu_order',\n                'embed',\n            );\n\n            foreach ($keys as $key) {\n                if (!isset($array[$key])) {\n                    $array[$key] = '';\n                }\n            }\n\n            $array_keys = array(\n                'category__in',\n                'category__not_in',\n                'category__and',\n                'post__in',\n                'post__not_in',\n                'post_name__in',\n                'tag__in',\n                'tag__not_in',\n                'tag__and',\n                'tag_slug__in',\n                'tag_slug__and',\n                'post_parent__in',\n                'post_parent__not_in',\n                'author__in',\n                'author__not_in',\n            );\n\n            foreach ($array_keys as $key) {\n                if (!isset($array[$key])) {\n                    $array[$key] = array();\n                }\n            }\n            return $array;\n        }\n\n        /**\n         * Parse a query string and set query type booleans.\n         *\n         * @param string|array $query {\n         *     Optional. Array or string of Query parameters.\n         *\n         * @type int $attachment_id Attachment post ID. Used for 'attachment' post_type.\n         * @type int|string $author Author ID, or comma-separated list of IDs.\n         * @type string $author_name User 'user_nicename'.\n         * @type int[] $author__in An array of author IDs to query from.\n         * @type int[] $author__not_in An array of author IDs not to query from.\n         * @type bool $cache_results Whether to cache post information. Default true.\n         * @type int|string $cat Category ID or comma-separated list of IDs (this or any children).\n         * @type int[] $category__and An array of category IDs (AND in).\n         * @type int[] $category__in An array of category IDs (OR in, no children).\n         * @type int[] $category__not_in An array of category IDs (NOT in).\n         * @type string $category_name Use category slug (not name, this or any children).\n         * @type array|int $comment_count Filter results by comment count. Provide an integer to match\n         *                                                    comment count exactly. Provide an array with integer 'value'\n         *                                                    and 'compare' operator ('=', '!=', '>', '>=', '<', '<=' ) to\n         *                                                    compare against comment_count in a specific way.\n         * @type string $comment_status Comment status.\n         * @type int $comments_per_page The number of comments to return per page.\n         *                                                    Default 'comments_per_page' option.\n         * @type array $date_query An associative array of WP_Date_Query arguments.\n         *                                                    See WP_Date_Query::__construct().\n         * @type int $day Day of the month. Default empty. Accepts numbers 1-31.\n         * @type bool $exact Whether to search by exact keyword. Default false.\n         * @type string $fields Post fields to query for. Accepts:\n         *                                                    - '' Returns an array of complete post objects (`WP_Post[]`).\n         *                                                    - 'ids' Returns an array of post IDs (`int[]`).\n         *                                                    - 'id=>parent' Returns an associative array of parent post IDs,\n         *                                                      keyed by post ID (`int[]`).\n         *                                                    Default ''.\n         * @type int $hour Hour of the day. Default empty. Accepts numbers 0-23.\n         * @type int|bool $ignore_sticky_posts Whether to ignore sticky posts or not. Setting this to false\n         *                                                    excludes stickies from 'post__in'. Accepts 1|true, 0|false.\n         *                                                    Default false.\n         * @type int $m Combination YearMonth. Accepts any four-digit year and month\n         *                                                    numbers 1-12. Default empty.\n         * @type string|string[] $meta_key Meta key or keys to filter by.\n         * @type string|string[] $meta_value Meta value or values to filter by.\n         * @type string $meta_compare MySQL operator used for comparing the meta value.\n         *                                                    See WP_Meta_Query::__construct for accepted values and default value.\n         * @type string $meta_compare_key MySQL operator used for comparing the meta key.\n         *                                                    See WP_Meta_Query::__construct for accepted values and default value.\n         * @type string $meta_type MySQL data type that the meta_value column will be CAST to for comparisons.\n         *                                                    See WP_Meta_Query::__construct for accepted values and default value.\n         * @type string $meta_type_key MySQL data type that the meta_key column will be CAST to for comparisons.\n         *                                                    See WP_Meta_Query::__construct for accepted values and default value.\n         * @type array $meta_query An associative array of WP_Meta_Query arguments.\n         *                                                    See WP_Meta_Query::__construct for accepted values.\n         * @type int $menu_order The menu order of the posts.\n         * @type int $minute Minute of the hour. Default empty. Accepts numbers 0-59.\n         * @type int $monthnum The two-digit month. Default empty. Accepts numbers 1-12.\n         * @type string $name Post slug.\n         * @type bool $nopaging Show all posts (true) or paginate (false). Default false.\n         * @type bool $no_found_rows Whether to skip counting the total rows found. Enabling can improve\n         *                                                    performance. Default false.\n         * @type int $offset The number of posts to offset before retrieval.\n         * @type string $order Designates ascending or descending order of posts. Default 'DESC'.\n         *                                                    Accepts 'ASC', 'DESC'.\n         * @type string|array $orderby Sort retrieved posts by parameter. One or more options may be passed.\n         *                                                    To use 'meta_value', or 'meta_value_num', 'meta_key=keyname' must be\n         *                                                    also be defined. To sort by a specific `$meta_query` clause, use that\n         *                                                    clause's array key. Accepts:\n         *                                                    - 'none'\n         *                                                    - 'name'\n         *                                                    - 'author'\n         *                                                    - 'date'\n         *                                                    - 'title'\n         *                                                    - 'modified'\n         *                                                    - 'menu_order'\n         *                                                    - 'parent'\n         *                                                    - 'ID'\n         *                                                    - 'rand'\n         *                                                    - 'relevance'\n         *                                                    - 'RAND(x)' (where 'x' is an integer seed value)\n         *                                                    - 'comment_count'\n         *                                                    - 'meta_value'\n         *                                                    - 'meta_value_num'\n         *                                                    - 'post__in'\n         *                                                    - 'post_name__in'\n         *                                                    - 'post_parent__in'\n         *                                                    - The array keys of `$meta_query`.\n         *                                                    Default is 'date', except when a search is being performed, when\n         *                                                    the default is 'relevance'.\n         * @type int $p Post ID.\n         * @type int $page Show the number of posts that would show up on page X of a\n         *                                                    static front page.\n         * @type int $paged The number of the current page.\n         * @type int $page_id Page ID.\n         * @type string $pagename Page slug.\n         * @type string $perm Show posts if user has the appropriate capability.\n         * @type string $ping_status Ping status.\n         * @type int[] $post__in An array of post IDs to retrieve, sticky posts will be included.\n         * @type int[] $post__not_in An array of post IDs not to retrieve. Note: a string of comma-\n         *                                                    separated IDs will NOT work.\n         * @type string $post_mime_type The mime type of the post. Used for 'attachment' post_type.\n         * @type string[] $post_name__in An array of post slugs that results must match.\n         * @type int $post_parent Page ID to retrieve child pages for. Use 0 to only retrieve\n         *                                                    top-level pages.\n         * @type int[] $post_parent__in An array containing parent page IDs to query child pages from.\n         * @type int[] $post_parent__not_in An array containing parent page IDs not to query child pages from.\n         * @type string|string[] $post_type A post type slug (string) or array of post type slugs.\n         *                                                    Default 'any' if using 'tax_query'.\n         * @type string|string[] $post_status A post status (string) or array of post statuses.\n         * @type int $posts_per_page The number of posts to query for. Use -1 to request all posts.\n         * @type int $posts_per_archive_page The number of posts to query for by archive page. Overrides\n         *                                                    'posts_per_page' when is_archive(), or is_search() are true.\n         * @type string $s Search keyword(s). Prepending a term with a hyphen will\n         *                                                    exclude posts matching that term. Eg, 'pillow -sofa' will\n         *                                                    return posts containing 'pillow' but not 'sofa'. The\n         *                                                    character used for exclusion can be modified using the\n         *                                                    the 'wp_query_search_exclusion_prefix' filter.\n         * @type int $second Second of the minute. Default empty. Accepts numbers 0-59.\n         * @type bool $sentence Whether to search by phrase. Default false.\n         * @type bool $suppress_filters Whether to suppress filters. Default false.\n         * @type string $tag Tag slug. Comma-separated (either), Plus-separated (all).\n         * @type int[] $tag__and An array of tag IDs (AND in).\n         * @type int[] $tag__in An array of tag IDs (OR in).\n         * @type int[] $tag__not_in An array of tag IDs (NOT in).\n         * @type int $tag_id Tag id or comma-separated list of IDs.\n         * @type string[] $tag_slug__and An array of tag slugs (AND in).\n         * @type string[] $tag_slug__in An array of tag slugs (OR in). unless 'ignore_sticky_posts' is\n         *                                                    true. Note: a string of comma-separated IDs will NOT work.\n         * @type array $tax_query An associative array of WP_Tax_Query arguments.\n         *                                                    See WP_Tax_Query->__construct().\n         * @type string $title Post title.\n         * @type bool $update_post_meta_cache Whether to update the post meta cache. Default true.\n         * @type bool $update_post_term_cache Whether to update the post term cache. Default true.\n         * @type bool $lazy_load_term_meta Whether to lazy-load term meta. Setting to false will\n         *                                                    disable cache priming for term meta, so that each\n         *                                                    get_term_meta() call will hit the database.\n         *                                                    Defaults to the value of `$update_post_term_cache`.\n         * @type int $w The week number of the year. Default empty. Accepts numbers 0-53.\n         * @type int $year The four-digit year. Default empty. Accepts any four-digit year.\n         * }\n         * @since 4.2.0 Introduced the ability to order by specific clauses of a `$meta_query`, by passing the clause's\n         *              array key to `$orderby`.\n         * @since 4.4.0 Introduced `$post_name__in` and `$title` parameters. `$s` was updated to support excluded\n         *              search terms, by prepending a hyphen.\n         * @since 4.5.0 Removed the `$comments_popup` parameter.\n         *              Introduced the `$comment_status` and `$ping_status` parameters.\n         *              Introduced `RAND(x)` syntax for `$orderby`, which allows an integer seed value to random sorts.\n         * @since 4.6.0 Added 'post_name__in' support for `$orderby`. Introduced the `$lazy_load_term_meta` argument.\n         * @since 4.9.0 Introduced the `$comment_count` parameter.\n         * @since 5.1.0 Introduced the `$meta_compare_key` parameter.\n         * @since 5.3.0 Introduced the `$meta_type_key` parameter.\n         *\n         * @since 1.5.0\n         */\n        public function parse_query($query = '')\n        {\n            if (!empty($query)) {\n                $this->init();\n                $this->query = wp_parse_args($query);\n                $this->query_vars = $this->query;\n            } elseif (!isset($this->query)) {\n                $this->query = $this->query_vars;\n            }\n\n            $this->query_vars = $this->fill_query_vars($this->query_vars);\n            $qv = &$this->query_vars;\n            $this->query_vars_changed = true;\n\n            if (!empty($qv['robots'])) {\n                $this->is_robots = true;\n            } elseif (!empty($qv['favicon'])) {\n                $this->is_favicon = true;\n            }\n\n            if (!is_scalar($qv['p']) || (int)$qv['p'] < 0) {\n                $qv['p'] = 0;\n                $qv['error'] = '404';\n            } else {\n                $qv['p'] = (int)$qv['p'];\n            }\n\n            $qv['page_id'] = absint($qv['page_id']);\n            $qv['year'] = absint($qv['year']);\n            $qv['monthnum'] = absint($qv['monthnum']);\n            $qv['day'] = absint($qv['day']);\n            $qv['w'] = absint($qv['w']);\n            $qv['m'] = is_scalar($qv['m']) ? preg_replace('|[^0-9]|', '', $qv['m']) : '';\n            $qv['paged'] = absint($qv['paged']);\n            $qv['cat'] = preg_replace('|[^0-9,-]|', '', $qv['cat']);    // Comma-separated list of positive or negative integers.\n            $qv['author'] = preg_replace('|[^0-9,-]|', '', $qv['author']); // Comma-separated list of positive or negative integers.\n            $qv['pagename'] = trim($qv['pagename']);\n            $qv['name'] = trim($qv['name']);\n            $qv['title'] = trim($qv['title']);\n            if ('' !== $qv['hour']) {\n                $qv['hour'] = absint($qv['hour']);\n            }\n            if ('' !== $qv['minute']) {\n                $qv['minute'] = absint($qv['minute']);\n            }\n            if ('' !== $qv['second']) {\n                $qv['second'] = absint($qv['second']);\n            }\n            if ('' !== $qv['menu_order']) {\n                $qv['menu_order'] = absint($qv['menu_order']);\n            }\n\n            // Fairly large, potentially too large, upper bound for search string lengths.\n            if (!is_scalar($qv['s']) || (!empty($qv['s']) && strlen($qv['s']) > 1600)) {\n                $qv['s'] = '';\n            }\n\n            // Compat. Map subpost to attachment.\n            if ('' != $qv['subpost']) {\n                $qv['attachment'] = $qv['subpost'];\n            }\n            if ('' != $qv['subpost_id']) {\n                $qv['attachment_id'] = $qv['subpost_id'];\n            }\n\n            $qv['attachment_id'] = absint($qv['attachment_id']);\n\n            if (('' !== $qv['attachment']) || !empty($qv['attachment_id'])) {\n                $this->is_single = true;\n                $this->is_attachment = true;\n            } elseif ('' !== $qv['name']) {\n                $this->is_single = true;\n            } elseif ($qv['p']) {\n                $this->is_single = true;\n            } elseif ('' !== $qv['pagename'] || !empty($qv['page_id'])) {\n                $this->is_page = true;\n                $this->is_single = false;\n            } else {\n                // Look for archive queries. Dates, categories, authors, search, post type archives.\n\n                if (isset($this->query['s'])) {\n                    $this->is_search = true;\n                }\n\n                if ('' !== $qv['second']) {\n                    $this->is_time = true;\n                    $this->is_date = true;\n                }\n\n                if ('' !== $qv['minute']) {\n                    $this->is_time = true;\n                    $this->is_date = true;\n                }\n\n                if ('' !== $qv['hour']) {\n                    $this->is_time = true;\n                    $this->is_date = true;\n                }\n\n                if ($qv['day']) {\n                    if (!$this->is_date) {\n                        $date = sprintf('%04d-%02d-%02d', $qv['year'], $qv['monthnum'], $qv['day']);\n                        if ($qv['monthnum'] && $qv['year'] && !wp_checkdate($qv['monthnum'], $qv['day'], $qv['year'], $date)) {\n                            $qv['error'] = '404';\n                        } else {\n                            $this->is_day = true;\n                            $this->is_date = true;\n                        }\n                    }\n                }\n\n                if ($qv['monthnum']) {\n                    if (!$this->is_date) {\n                        if (12 < $qv['monthnum']) {\n                            $qv['error'] = '404';\n                        } else {\n                            $this->is_month = true;\n                            $this->is_date = true;\n                        }\n                    }\n                }\n\n                if ($qv['year']) {\n                    if (!$this->is_date) {\n                        $this->is_year = true;\n                        $this->is_date = true;\n                    }\n                }\n\n                if ($qv['m']) {\n                    $this->is_date = true;\n                    if (strlen($qv['m']) > 9) {\n                        $this->is_time = true;\n                    } elseif (strlen($qv['m']) > 7) {\n                        $this->is_day = true;\n                    } elseif (strlen($qv['m']) > 5) {\n                        $this->is_month = true;\n                    } else {\n                        $this->is_year = true;\n                    }\n                }\n\n                if ($qv['w']) {\n                    $this->is_date = true;\n                }\n\n                $this->query_vars_hash = false;\n                // there is no tax in typecho, so we don't concern it\n\n//            $this->parse_tax_query( $qv );\n//\n//            foreach ( $this->tax_query->queries as $tax_query ) {\n//                if ( ! is_array( $tax_query ) ) {\n//                    continue;\n//                }\n//\n//                if ( isset( $tax_query['operator'] ) && 'NOT IN' !== $tax_query['operator'] ) {\n//                    switch ( $tax_query['taxonomy'] ) {\n//                        case 'category':\n//                            $this->is_category = true;\n//                            break;\n//                        case 'tag':\n//                            $this->is_tag = true;\n//                            break;\n//                        default:\n//                            $this->is_tax = true;\n//                    }\n//                }\n//            }\n//            unset( $tax_query );\n\n                if (empty($qv['author']) || ('0' == $qv['author'])) {\n                    $this->is_author = false;\n                } else {\n                    $this->is_author = true;\n                }\n\n                if ('' !== $qv['author_name']) {\n                    $this->is_author = true;\n                }\n\n                if (!empty($qv['post_type']) && !is_array($qv['post_type'])) {\n                    $post_type_obj = get_post_type_object($qv['post_type']);\n                    if (!empty($post_type_obj->has_archive)) {\n                        $this->is_post_type_archive = true;\n                    }\n                }\n\n                if ($this->is_post_type_archive || $this->is_date || $this->is_author || $this->is_category || $this->is_tag || $this->is_tax) {\n                    $this->is_archive = true;\n                }\n            }\n\n            if ('' != $qv['feed']) {\n                $this->is_feed = true;\n            }\n\n            if ('' != $qv['embed']) {\n                $this->is_embed = true;\n            }\n\n            if ('' != $qv['tb']) {\n                $this->is_trackback = true;\n            }\n\n            if ('' != $qv['paged'] && ((int)$qv['paged'] > 1)) {\n                $this->is_paged = true;\n            }\n\n            // If we're previewing inside the write screen.\n            if ('' != $qv['preview']) {\n                $this->is_preview = true;\n            }\n\n            if (ty_is_admin()) {\n                $this->is_admin = true;\n            }\n\n            if (false !== strpos($qv['feed'], 'comments-')) {\n                $qv['feed'] = str_replace('comments-', '', $qv['feed']);\n                $qv['withcomments'] = 1;\n            }\n\n            $this->is_singular = $this->is_single || $this->is_page || $this->is_attachment;\n\n            if ($this->is_feed && (!empty($qv['withcomments']) || (empty($qv['withoutcomments']) && $this->is_singular))) {\n                $this->is_comment_feed = true;\n            }\n\n            if (!($this->is_singular || $this->is_archive || $this->is_search || $this->is_feed\n                || (defined('REST_REQUEST') && REST_REQUEST && $this->is_main_query())\n                || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_robots || $this->is_favicon)) {\n                $this->is_home = true;\n            }\n\n            // Correct `is_*` for 'page_on_front' and 'page_for_posts'.\n            if ($this->is_home && 'page' === get_option('show_on_front') && get_option('page_on_front')) {\n                $_query = wp_parse_args($this->query);\n                // 'pagename' can be set and empty depending on matched rewrite rules. Ignore an empty 'pagename'.\n                if (isset($_query['pagename']) && '' === $_query['pagename']) {\n                    unset($_query['pagename']);\n                }\n\n                unset($_query['embed']);\n\n                if (empty($_query) || !array_diff(array_keys($_query), array('preview', 'page', 'paged', 'cpage'))) {\n                    $this->is_page = true;\n                    $this->is_home = false;\n                    $qv['page_id'] = get_option('page_on_front');\n                    // Correct <!--nextpage--> for 'page_on_front'.\n                    if (!empty($qv['paged'])) {\n                        $qv['page'] = $qv['paged'];\n                        unset($qv['paged']);\n                    }\n                }\n            }\n\n            if ('' !== $qv['pagename']) {\n                $this->queried_object = get_page_by_path($qv['pagename']);\n\n                if ($this->queried_object && 'attachment' === $this->queried_object->post_type) {\n                    if (preg_match('/^[^%]*%(?:postname)%/', get_option('permalink_structure'))) {\n                        // See if we also have a post with the same slug.\n                        $post = get_page_by_path($qv['pagename'], OBJECT, 'post');\n                        if ($post) {\n                            $this->queried_object = $post;\n                            $this->is_page = false;\n                            $this->is_single = true;\n                        }\n                    }\n                }\n\n                if (!empty($this->queried_object)) {\n                    $this->queried_object_id = (int)$this->queried_object->ID;\n                } else {\n                    unset($this->queried_object);\n                }\n\n                if ('page' === get_option('show_on_front') && isset($this->queried_object_id) && get_option('page_for_posts') == $this->queried_object_id) {\n                    $this->is_page = false;\n                    $this->is_home = true;\n                    $this->is_posts_page = true;\n                }\n\n                if (isset($this->queried_object_id) && get_option('wp_page_for_privacy_policy') == $this->queried_object_id) {\n                    $this->is_privacy_policy = true;\n                }\n            }\n\n            if ($qv['page_id']) {\n                if ('page' === get_option('show_on_front') && get_option('page_for_posts') == $qv['page_id']) {\n                    $this->is_page = false;\n                    $this->is_home = true;\n                    $this->is_posts_page = true;\n                }\n\n                if (get_option('wp_page_for_privacy_policy') == $qv['page_id']) {\n                    $this->is_privacy_policy = true;\n                }\n            }\n\n            if (!empty($qv['post_type'])) {\n                if (is_array($qv['post_type'])) {\n                    $qv['post_type'] = array_map('sanitize_key', $qv['post_type']);\n                } else {\n                    $qv['post_type'] = sanitize_key($qv['post_type']);\n                }\n            }\n\n            if (!empty($qv['status'])) {\n                if (is_array($qv['status'])) {\n                    $qv['status'] = array_map('sanitize_key', $qv['status']);\n                } else {\n                    $qv['status'] = preg_replace('|[^a-z0-9_,-]|', '', $qv['status']);\n                }\n            }\n\n            if ($this->is_posts_page && (!isset($qv['withcomments']) || !$qv['withcomments'])) {\n                $this->is_comment_feed = false;\n            }\n\n            $this->is_singular = $this->is_single || $this->is_page || $this->is_attachment;\n            // Done correcting `is_*` for 'page_on_front' and 'page_for_posts'.\n\n            if ('404' == $qv['error']) {\n                $this->set_404();\n            }\n\n            $this->is_embed = $this->is_embed && ($this->is_singular || $this->is_404);\n\n            $this->query_vars_hash = md5(serialize($this->query_vars));\n            $this->query_vars_changed = false;\n\n            /**\n             * Fires after the main query vars have been parsed.\n             *\n             * @param WP_Query $query The WP_Query instance (passed by reference).\n             * @since 1.5.0\n             *\n             */\n//        do_action_ref_array( 'parse_query', array( &$this ) );\n        }\n\n        /**\n         * Parses various taxonomy related query vars.\n         *\n         * For BC, this method is not marked as protected. See [28987].\n         *\n         * @param array $q The query variables. Passed by reference.\n         * @since 3.1.0\n         *\n         */\n        public function parse_tax_query(&$q)\n        {\n            if (!empty($q['tax_query']) && is_array($q['tax_query'])) {\n                $tax_query = $q['tax_query'];\n            } else {\n                $tax_query = array();\n            }\n\n            if (!empty($q['taxonomy']) && !empty($q['term'])) {\n                $tax_query[] = array(\n                    'taxonomy' => $q['taxonomy'],\n                    'terms' => array($q['term']),\n                    'field' => 'slug',\n                );\n            }\n\n            foreach (get_taxonomies(array(), 'objects') as $taxonomy => $t) {\n                if ('tag' === $taxonomy) {\n                    continue; // Handled further down in the $q['tag'] block.\n                }\n\n                if ($t->query_var && !empty($q[$t->query_var])) {\n                    $tax_query_defaults = array(\n                        'taxonomy' => $taxonomy,\n                        'field' => 'slug',\n                    );\n\n                    if (!empty($t->rewrite['hierarchical'])) {\n                        $q[$t->query_var] = wp_basename($q[$t->query_var]);\n                    }\n\n                    $term = $q[$t->query_var];\n\n                    if (is_array($term)) {\n                        $term = implode(',', $term);\n                    }\n\n                    if (strpos($term, '+') !== false) {\n                        $terms = preg_split('/[+]+/', $term);\n                        foreach ($terms as $term) {\n                            $tax_query[] = array_merge(\n                                $tax_query_defaults,\n                                array(\n                                    'terms' => array($term),\n                                )\n                            );\n                        }\n                    } else {\n                        $tax_query[] = array_merge(\n                            $tax_query_defaults,\n                            array(\n                                'terms' => preg_split('/[,]+/', $term),\n                            )\n                        );\n                    }\n                }\n            }\n\n            // If query string 'cat' is an array, implode it.\n            if (is_array($q['cat'])) {\n                $q['cat'] = implode(',', $q['cat']);\n            }\n\n            // Category stuff.\n\n            if (!empty($q['cat']) && !$this->is_singular) {\n                $cat_in = array();\n                $cat_not_in = array();\n\n                $cat_array = preg_split('/[,\\s]+/', urldecode($q['cat']));\n                $cat_array = array_map('intval', $cat_array);\n                $q['cat'] = implode(',', $cat_array);\n\n                foreach ($cat_array as $cat) {\n                    if ($cat > 0) {\n                        $cat_in[] = $cat;\n                    } elseif ($cat < 0) {\n                        $cat_not_in[] = abs($cat);\n                    }\n                }\n\n                if (!empty($cat_in)) {\n                    $tax_query[] = array(\n                        'taxonomy' => 'category',\n                        'terms' => $cat_in,\n                        'field' => 'term_id',\n                        'include_children' => true,\n                    );\n                }\n\n                if (!empty($cat_not_in)) {\n                    $tax_query[] = array(\n                        'taxonomy' => 'category',\n                        'terms' => $cat_not_in,\n                        'field' => 'term_id',\n                        'operator' => 'NOT IN',\n                        'include_children' => true,\n                    );\n                }\n                unset($cat_array, $cat_in, $cat_not_in);\n            }\n\n            if (!empty($q['category__and']) && 1 === count((array)$q['category__and'])) {\n                $q['category__and'] = (array)$q['category__and'];\n                if (!isset($q['category__in'])) {\n                    $q['category__in'] = array();\n                }\n                $q['category__in'][] = absint(reset($q['category__and']));\n                unset($q['category__and']);\n            }\n\n            if (!empty($q['category__in'])) {\n                $q['category__in'] = array_map('absint', array_unique((array)$q['category__in']));\n                $tax_query[] = array(\n                    'taxonomy' => 'category',\n                    'terms' => $q['category__in'],\n                    'field' => 'term_id',\n                    'include_children' => false,\n                );\n            }\n\n            if (!empty($q['category__not_in'])) {\n                $q['category__not_in'] = array_map('absint', array_unique((array)$q['category__not_in']));\n                $tax_query[] = array(\n                    'taxonomy' => 'category',\n                    'terms' => $q['category__not_in'],\n                    'operator' => 'NOT IN',\n                    'include_children' => false,\n                );\n            }\n\n            if (!empty($q['category__and'])) {\n                $q['category__and'] = array_map('absint', array_unique((array)$q['category__and']));\n                $tax_query[] = array(\n                    'taxonomy' => 'category',\n                    'terms' => $q['category__and'],\n                    'field' => 'term_id',\n                    'operator' => 'AND',\n                    'include_children' => false,\n                );\n            }\n\n            // If query string 'tag' is array, implode it.\n            if (is_array($q['tag'])) {\n                $q['tag'] = implode(',', $q['tag']);\n            }\n\n            // Tag stuff.\n\n            if ('' !== $q['tag'] && !$this->is_singular && $this->query_vars_changed) {\n                if (strpos($q['tag'], ',') !== false) {\n                    $tags = preg_split('/[,\\r\\n\\t ]+/', $q['tag']);\n                    foreach ((array)$tags as $tag) {\n                        $tag = sanitize_term_field('slug', $tag, 0, 'tag', 'db');\n                        $q['tag_slug__in'][] = $tag;\n                    }\n                } elseif (preg_match('/[+\\r\\n\\t ]+/', $q['tag']) || !empty($q['cat'])) {\n                    $tags = preg_split('/[+\\r\\n\\t ]+/', $q['tag']);\n                    foreach ((array)$tags as $tag) {\n                        $tag = sanitize_term_field('slug', $tag, 0, 'tag', 'db');\n                        $q['tag_slug__and'][] = $tag;\n                    }\n                } else {\n                    $q['tag'] = sanitize_term_field('slug', $q['tag'], 0, 'tag', 'db');\n                    $q['tag_slug__in'][] = $q['tag'];\n                }\n            }\n\n            if (!empty($q['tag_id'])) {\n                $q['tag_id'] = absint($q['tag_id']);\n                $tax_query[] = array(\n                    'taxonomy' => 'tag',\n                    'terms' => $q['tag_id'],\n                );\n            }\n\n            if (!empty($q['tag__in'])) {\n                $q['tag__in'] = array_map('absint', array_unique((array)$q['tag__in']));\n                $tax_query[] = array(\n                    'taxonomy' => 'tag',\n                    'terms' => $q['tag__in'],\n                );\n            }\n\n            if (!empty($q['tag__not_in'])) {\n                $q['tag__not_in'] = array_map('absint', array_unique((array)$q['tag__not_in']));\n                $tax_query[] = array(\n                    'taxonomy' => 'tag',\n                    'terms' => $q['tag__not_in'],\n                    'operator' => 'NOT IN',\n                );\n            }\n\n            if (!empty($q['tag__and'])) {\n                $q['tag__and'] = array_map('absint', array_unique((array)$q['tag__and']));\n                $tax_query[] = array(\n                    'taxonomy' => 'tag',\n                    'terms' => $q['tag__and'],\n                    'operator' => 'AND',\n                );\n            }\n\n            if (!empty($q['tag_slug__in'])) {\n                $q['tag_slug__in'] = array_map('sanitize_title_for_query', array_unique((array)$q['tag_slug__in']));\n                $tax_query[] = array(\n                    'taxonomy' => 'tag',\n                    'terms' => $q['tag_slug__in'],\n                    'field' => 'slug',\n                );\n            }\n\n            if (!empty($q['tag_slug__and'])) {\n                $q['tag_slug__and'] = array_map('sanitize_title_for_query', array_unique((array)$q['tag_slug__and']));\n                $tax_query[] = array(\n                    'taxonomy' => 'tag',\n                    'terms' => $q['tag_slug__and'],\n                    'field' => 'slug',\n                    'operator' => 'AND',\n                );\n            }\n\n//        $this->tax_query = new WP_Tax_Query( $tax_query );\n\n            /**\n             * Fires after taxonomy-related query vars have been parsed.\n             *\n             * @param WP_Query $query The WP_Query instance.\n             * @since 3.7.0\n             *\n             */\n//        do_action( 'parse_tax_query', $this );\n        }\n\n        /**\n         * Generates SQL for the WHERE clause based on passed search terms.\n         *\n         * @param array $q Query variables.\n         * @return string WHERE clause.\n         * @since 3.7.0\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         */\n        protected function parse_search(&$q)\n        {\n            $wpdb = \\Typecho\\Db::get();\n            $wpdb->posts = $wpdb->getPrefix() . 'contents';\n            $search = '';\n\n            // Added slashes screw with quote grouping when done early, so done later.\n            $q['s'] = stripslashes($q['s']);\n            if (empty($_GET['s']) && $this->is_main_query()) {\n                $q['s'] = urldecode($q['s']);\n            }\n            // There are no line breaks in <input /> fields.\n            $q['s'] = str_replace(array(\"\\r\", \"\\n\"), '', $q['s']);\n            $q['search_terms_count'] = 1;\n            if (!empty($q['sentence'])) {\n                $q['search_terms'] = array($q['s']);\n            } else {\n                if (preg_match_all('/\".*?(\"|$)|((?<=[\\t \",+])|^)[^\\t \",+]+/', $q['s'], $matches)) {\n                    $q['search_terms_count'] = count($matches[0]);\n                    $q['search_terms'] = $this->parse_search_terms($matches[0]);\n                    // If the search string has only short terms or stopwords, or is 10+ terms long, match it as sentence.\n                    if (empty($q['search_terms']) || count($q['search_terms']) > 9) {\n                        $q['search_terms'] = array($q['s']);\n                    }\n                } else {\n                    $q['search_terms'] = array($q['s']);\n                }\n            }\n\n            $n = !empty($q['exact']) ? '' : '%';\n            $searchand = '';\n            $q['search_orderby_title'] = array();\n\n            /**\n             * Filters the prefix that indicates that a search term should be excluded from results.\n             *\n             * @param string $exclusion_prefix The prefix. Default '-'. Returning\n             *                                 an empty value disables exclusions.\n             * @since 4.7.0\n             *\n             */\n            $exclusion_prefix = apply_filters('wp_query_search_exclusion_prefix', '-');\n\n            foreach ($q['search_terms'] as $term) {\n                // If there is an $exclusion_prefix, terms prefixed with it should be excluded.\n                $exclude = $exclusion_prefix && (substr($term, 0, 1) === $exclusion_prefix);\n                if ($exclude) {\n                    $like_op = 'NOT LIKE';\n                    $andor_op = 'AND';\n                    $term = substr($term, 1);\n                } else {\n                    $like_op = 'LIKE';\n                    $andor_op = 'OR';\n                }\n\n                if ($n && !$exclude) {\n                    $like = '%' . esc_like($term) . '%';\n                    $q['search_orderby_title'][] = \"{$wpdb->posts}.title LIKE '$like'\";\n                }\n\n                $like = $n . esc_like($term) . $n;\n                $search .= sprintf(\"{$searchand}({$wpdb->posts}.title $like_op '%s' $andor_op {$wpdb->posts}.text $like_op '%s')\", $like, $like);\n                $searchand = ' AND ';\n            }\n\n            if (!empty($search)) {\n                $search = \" AND ({$search}) \";\n                if (!is_user_logged_in()) {\n                    $search .= \" AND ({$wpdb->posts}.post_password = '') \";\n                }\n            }\n\n            return $search;\n        }\n\n        /**\n         * Check if the terms are suitable for searching.\n         *\n         * Uses an array of stopwords (terms) that are excluded from the separate\n         * term matching when searching for posts. The list of English stopwords is\n         * the approximate search engines list, and is translatable.\n         *\n         * @param string[] $terms Array of terms to check.\n         * @return string[] Terms that are not stopwords.\n         * @since 3.7.0\n         *\n         */\n        protected function parse_search_terms($terms)\n        {\n            $strtolower = function_exists('mb_strtolower') ? 'mb_strtolower' : 'strtolower';\n            $checked = array();\n\n            $stopwords = $this->get_search_stopwords();\n\n            foreach ($terms as $term) {\n                // Keep before/after spaces when term is for exact match.\n                if (preg_match('/^\".+\"$/', $term)) {\n                    $term = trim($term, \"\\\"'\");\n                } else {\n                    $term = trim($term, \"\\\"' \");\n                }\n\n                // Avoid single A-Z and single dashes.\n                if (!$term || (1 === strlen($term) && preg_match('/^[a-z\\-]$/i', $term))) {\n                    continue;\n                }\n\n                if (in_array(call_user_func($strtolower, $term), $stopwords, true)) {\n                    continue;\n                }\n\n                $checked[] = $term;\n            }\n\n            return $checked;\n        }\n\n        /**\n         * Retrieve stopwords used when parsing search terms.\n         *\n         * @return string[] Stopwords.\n         * @since 3.7.0\n         *\n         */\n        protected function get_search_stopwords()\n        {\n            if (isset($this->stopwords)) {\n                return $this->stopwords;\n            }\n\n            /*\n\t\t * translators: This is a comma-separated list of very common words that should be excluded from a search,\n\t\t * like a, an, and the. These are usually called \"stopwords\". You should not simply translate these individual\n\t\t * words into your language. Instead, look for and provide commonly accepted stopwords in your language.\n\t\t */\n            $words = explode(\n                ',',\n                _x(\n                    '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',\n                    'Comma-separated list of search stopwords in your language'\n                )\n            );\n\n            $stopwords = array();\n            foreach ($words as $word) {\n                $word = trim($word, \"\\r\\n\\t \");\n                if ($word) {\n                    $stopwords[] = $word;\n                }\n            }\n\n            /**\n             * Filters stopwords used when parsing search terms.\n             *\n             * @param string[] $stopwords Array of stopwords.\n             * @since 3.7.0\n             *\n             */\n            $this->stopwords = apply_filters('wp_search_stopwords', $stopwords);\n            return $this->stopwords;\n        }\n\n        /**\n         * Generates SQL for the ORDER BY condition based on passed search terms.\n         *\n         * @param array $q Query variables.\n         * @return string ORDER BY clause.\n         * @since 3.7.0\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         */\n        protected function parse_search_order(&$q)\n        {\n            $wpdb = \\Typecho\\Db::get();\n\n            if ($q['search_terms_count'] > 1) {\n                $num_terms = count($q['search_orderby_title']);\n\n                // If the search terms contain negative queries, don't bother ordering by sentence matches.\n                $like = '';\n                if (!preg_match('/(?:\\s|^)\\-/', $q['s'])) {\n                    $like = '%' . esc_like($q['s']) . '%';\n                }\n\n                $search_orderby = '';\n\n                // Sentence match in 'title'.\n                if ($like) {\n                    $search_orderby .= sprintf(\"WHEN {$wpdb->posts}.title LIKE %s THEN 1 \", $like);\n                }\n\n                // Sanity limit, sort as sentence when more than 6 terms\n                // (few searches are longer than 6 terms and most titles are not).\n                if ($num_terms < 7) {\n                    // All words in title.\n                    $search_orderby .= 'WHEN ' . implode(' AND ', $q['search_orderby_title']) . ' THEN 2 ';\n                    // Any word in title, not needed when $num_terms == 1.\n                    if ($num_terms > 1) {\n                        $search_orderby .= 'WHEN ' . implode(' OR ', $q['search_orderby_title']) . ' THEN 3 ';\n                    }\n                }\n\n                // Sentence match in 'text' and 'post_excerpt'.\n                if ($like) {\n                    $search_orderby .= sprintf(\"WHEN {$wpdb->posts}.text LIKE %s THEN 5 \", $like);\n                }\n\n                if ($search_orderby) {\n                    $search_orderby = '(CASE ' . $search_orderby . 'ELSE 6 END)';\n                }\n\n            } else {\n\n                // Single word or sentence search.\n                $search_orderby = reset($q['search_orderby_title']) . ' DESC';\n            }\n            return $search_orderby;\n        }\n\n        /**\n         * Converts the given orderby alias (if allowed) to a properly-prefixed value.\n         *\n         * @param string $orderby Alias for the field to order by.\n         * @return string|false Table-prefixed value to used in the ORDER clause. False otherwise.\n         * @since 4.0.0\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         */\n        protected function parse_orderby($orderby)\n        {\n            global $wpdb;\n\n            // Used to filter values.\n            $allowed_keys = array(\n                'post_name',\n                'post_author',\n                'post_date',\n                'title',\n                'post_modified',\n                'post_parent',\n                'post_type',\n                'name',\n                'author',\n                'date',\n                'title',\n                'modified',\n                'parent',\n                'type',\n                'ID',\n                'menu_order',\n                'comment_count',\n                'rand',\n                'post__in',\n                'post_parent__in',\n                'post_name__in',\n            );\n\n            $primary_meta_key = '';\n            $primary_meta_query = false;\n            $meta_clauses = $this->meta_query->get_clauses();\n            if (!empty($meta_clauses)) {\n                $primary_meta_query = reset($meta_clauses);\n\n                if (!empty($primary_meta_query['key'])) {\n                    $primary_meta_key = $primary_meta_query['key'];\n                    $allowed_keys[] = $primary_meta_key;\n                }\n\n                $allowed_keys[] = 'meta_value';\n                $allowed_keys[] = 'meta_value_num';\n                $allowed_keys = array_merge($allowed_keys, array_keys($meta_clauses));\n            }\n\n            // If RAND() contains a seed value, sanitize and add to allowed keys.\n            $rand_with_seed = false;\n            if (preg_match('/RAND\\(([0-9]+)\\)/i', $orderby, $matches)) {\n                $orderby = sprintf('RAND(%s)', (int)$matches[1]);\n                $allowed_keys[] = $orderby;\n                $rand_with_seed = true;\n            }\n\n            if (!in_array($orderby, $allowed_keys, true)) {\n                return false;\n            }\n\n            $orderby_clause = '';\n\n            switch ($orderby) {\n                case 'post_name':\n                case 'post_author':\n                case 'post_date':\n                case 'title':\n                case 'post_modified':\n                case 'post_parent':\n                case 'post_type':\n                case 'ID':\n                case 'menu_order':\n                case 'comment_count':\n                    $orderby_clause = \"{$wpdb->posts}.{$orderby}\";\n                    break;\n                case 'rand':\n                    $orderby_clause = 'RAND()';\n                    break;\n                case $primary_meta_key:\n                case 'meta_value':\n                    if (!empty($primary_meta_query['type'])) {\n                        $orderby_clause = \"CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})\";\n                    } else {\n                        $orderby_clause = \"{$primary_meta_query['alias']}.meta_value\";\n                    }\n                    break;\n                case 'meta_value_num':\n                    $orderby_clause = \"{$primary_meta_query['alias']}.meta_value+0\";\n                    break;\n                case 'post__in':\n                    if (!empty($this->query_vars['post__in'])) {\n                        $orderby_clause = \"FIELD({$wpdb->posts}.ID,\" . implode(',', array_map('absint', $this->query_vars['post__in'])) . ')';\n                    }\n                    break;\n                case 'post_parent__in':\n                    if (!empty($this->query_vars['post_parent__in'])) {\n                        $orderby_clause = \"FIELD( {$wpdb->posts}.post_parent,\" . implode(', ', array_map('absint', $this->query_vars['post_parent__in'])) . ' )';\n                    }\n                    break;\n                case 'post_name__in':\n                    if (!empty($this->query_vars['post_name__in'])) {\n                        $post_name__in = array_map('sanitize_title_for_query', $this->query_vars['post_name__in']);\n                        $post_name__in_string = \"'\" . implode(\"','\", $post_name__in) . \"'\";\n                        $orderby_clause = \"FIELD( {$wpdb->posts}.post_name,\" . $post_name__in_string . ' )';\n                    }\n                    break;\n                default:\n                    if (array_key_exists($orderby, $meta_clauses)) {\n                        // $orderby corresponds to a meta_query clause.\n                        $meta_clause = $meta_clauses[$orderby];\n                        $orderby_clause = \"CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})\";\n                    } elseif ($rand_with_seed) {\n                        $orderby_clause = $orderby;\n                    } else {\n                        // Default: order by post field.\n                        $orderby_clause = \"{$wpdb->posts}.post_\" . sanitize_key($orderby);\n                    }\n\n                    break;\n            }\n\n            return $orderby_clause;\n        }\n\n        /**\n         * Parse an 'order' query variable and cast it to ASC or DESC as necessary.\n         *\n         * @param string $order The 'order' query variable.\n         * @return string The sanitized 'order' query variable.\n         * @since 4.0.0\n         *\n         */\n        protected function parse_order($order)\n        {\n            if (!is_string($order) || empty($order)) {\n                return 'DESC';\n            }\n\n            if ('ASC' === strtoupper($order)) {\n                return 'ASC';\n            } else {\n                return 'DESC';\n            }\n        }\n\n        /**\n         * Sets the 404 property and saves whether query is feed.\n         *\n         * @since 2.0.0\n         */\n        public function set_404()\n        {\n            $is_feed = $this->is_feed;\n\n            $this->init_query_flags();\n            $this->is_404 = true;\n\n            $this->is_feed = $is_feed;\n\n            /**\n             * Fires after a 404 is triggered.\n             *\n             * @param WP_Query $query The WP_Query instance (passed by reference).\n             * @since 5.5.0\n             *\n             */\n//        do_action_ref_array( 'set_404', array( $this ) );\n        }\n\n        /**\n         * Retrieves the value of a query variable.\n         *\n         * @param string $query_var Query variable key.\n         * @param mixed $default Optional. Value to return if the query variable is not set. Default empty string.\n         * @return mixed Contents of the query variable.\n         * @since 3.9.0 The `$default` argument was introduced.\n         *\n         * @since 1.5.0\n         */\n        public function get($query_var, $default = '')\n        {\n            if (isset($this->query_vars[$query_var])) {\n                return $this->query_vars[$query_var];\n            }\n\n            return $default;\n        }\n\n        /**\n         * Sets the value of a query variable.\n         *\n         * @param string $query_var Query variable key.\n         * @param mixed $value Query variable value.\n         * @since 1.5.0\n         *\n         */\n        public function set($query_var, $value)\n        {\n            $this->query_vars[$query_var] = $value;\n        }\n\n        /**\n         * Retrieves an array of posts based on query variables.\n         *\n         * There are a few filters and actions that can be used to modify the post\n         * database query.\n         *\n         * @return WP_Post[]|int[] Array of post objects or post IDs.\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         * @since 1.5.0\n         *\n         */\n        public function get_posts()\n        {\n            $wpdb = Typecho\\Db::get();\n\n            $this->parse_query();\n\n            // Shorthand.\n            $q = &$this->query_vars;\n\n            // Fill again in case 'pre_get_posts' unset some vars.\n            $q = $this->fill_query_vars($q);\n\n            // Parse meta query.\n//        $this->meta_query = new WP_Meta_Query();\n//        $this->meta_query->parse_query_vars( $q );\n\n            // Set a flag if a 'pre_get_posts' hook changed the query vars.\n            $hash = md5(serialize($this->query_vars));\n            if ($hash != $this->query_vars_hash) {\n                $this->query_vars_changed = true;\n                $this->query_vars_hash = $hash;\n            }\n            unset($hash);\n\n            // First let's clear some variables.\n            $distinct = '';\n            $whichauthor = '';\n            $whichmimetype = '';\n            $where = '';\n            $limits = '';\n            $join = '';\n            $search = '';\n            $groupby = '';\n            $post_status_join = false;\n            $page = 1;\n\n            if (isset($q['caller_get_posts'])) {\n\n                if (!isset($q['ignore_sticky_posts'])) {\n                    $q['ignore_sticky_posts'] = $q['caller_get_posts'];\n                }\n            }\n\n            if (!isset($q['ignore_sticky_posts'])) {\n                $q['ignore_sticky_posts'] = false;\n            }\n\n            if (!isset($q['suppress_filters'])) {\n                $q['suppress_filters'] = false;\n            }\n\n            if (!isset($q['cache_results'])) {\n                if (wp_using_ext_object_cache()) {\n                    $q['cache_results'] = false;\n                } else {\n                    $q['cache_results'] = true;\n                }\n            }\n\n            if (!isset($q['update_post_term_cache'])) {\n                $q['update_post_term_cache'] = true;\n            }\n\n            if (!isset($q['lazy_load_term_meta'])) {\n                $q['lazy_load_term_meta'] = $q['update_post_term_cache'];\n            }\n\n            if (!isset($q['update_post_meta_cache'])) {\n                $q['update_post_meta_cache'] = true;\n            }\n\n            if (!isset($q['post_type'])) {\n                if ($this->is_search) {\n                    $q['post_type'] = 'any';\n                } else {\n                    $q['post_type'] = '';\n                }\n            }\n            $post_type = $q['post_type'];\n            if (empty($q['posts_per_page'])) {\n                $q['posts_per_page'] = get_option('posts_per_page');\n            }\n            if (isset($q['showposts']) && $q['showposts']) {\n                $q['showposts'] = (int)$q['showposts'];\n                $q['posts_per_page'] = $q['showposts'];\n            }\n            if ((isset($q['posts_per_archive_page']) && 0 != $q['posts_per_archive_page']) && ($this->is_archive || $this->is_search)) {\n                $q['posts_per_page'] = $q['posts_per_archive_page'];\n            }\n            if (!isset($q['nopaging'])) {\n                if (-1 == $q['posts_per_page']) {\n                    $q['nopaging'] = true;\n                } else {\n                    $q['nopaging'] = false;\n                }\n            }\n\n            if ($this->is_feed) {\n                // This overrides 'posts_per_page'.\n                if (!empty($q['posts_per_rss'])) {\n                    $q['posts_per_page'] = $q['posts_per_rss'];\n                } else {\n                    $q['posts_per_page'] = get_option('posts_per_rss');\n                }\n                $q['nopaging'] = false;\n            }\n            $q['posts_per_page'] = (int)$q['posts_per_page'];\n            if ($q['posts_per_page'] < -1) {\n                $q['posts_per_page'] = abs($q['posts_per_page']);\n            } elseif (0 == $q['posts_per_page']) {\n                $q['posts_per_page'] = 1;\n            }\n\n            if (!isset($q['comments_per_page']) || 0 == $q['comments_per_page']) {\n                $q['comments_per_page'] = get_option('comments_per_page');\n            }\n\n            if ($this->is_home && (empty($this->query) || 'true' === $q['preview']) && ('page' === get_option('show_on_front')) && get_option('page_on_front')) {\n                $this->is_page = true;\n                $this->is_home = false;\n                $q['page_id'] = get_option('page_on_front');\n            }\n\n            if (isset($q['page'])) {\n                $q['page'] = trim($q['page'], '/');\n                $q['page'] = absint($q['page']);\n            }\n\n            // If true, forcibly turns off SQL_CALC_FOUND_ROWS even when limits are present.\n            if (isset($q['no_found_rows'])) {\n                $q['no_found_rows'] = (bool)$q['no_found_rows'];\n            } else {\n                $q['no_found_rows'] = false;\n            }\n\n            switch ($q['fields']) {\n                case 'ids':\n                    $fields = \"{$wpdb->getPrefix()}contents.ID\";\n                    break;\n//            case 'id=>parent':\n//                $fields = \"{$db->getPrefix()}contents.ID, {$wpdb->posts}.post_parent\";\n//                break;\n                default:\n                    $fields = \"{$wpdb->getPrefix()}contents.*\";\n            }\n\n            if ('' !== $q['menu_order']) {\n                $where .= \" AND {$wpdb->posts}.menu_order = \" . $q['menu_order'];\n            }\n            // The \"m\" parameter is meant for months but accepts datetimes of varying specificity.\n            if ($q['m']) {\n                $where .= \" AND YEAR({$wpdb->posts}.post_date)=\" . substr($q['m'], 0, 4);\n                if (strlen($q['m']) > 5) {\n                    $where .= \" AND MONTH({$wpdb->posts}.post_date)=\" . substr($q['m'], 4, 2);\n                }\n                if (strlen($q['m']) > 7) {\n                    $where .= \" AND DAYOFMONTH({$wpdb->posts}.post_date)=\" . substr($q['m'], 6, 2);\n                }\n                if (strlen($q['m']) > 9) {\n                    $where .= \" AND HOUR({$wpdb->posts}.post_date)=\" . substr($q['m'], 8, 2);\n                }\n                if (strlen($q['m']) > 11) {\n                    $where .= \" AND MINUTE({$wpdb->posts}.post_date)=\" . substr($q['m'], 10, 2);\n                }\n                if (strlen($q['m']) > 13) {\n                    $where .= \" AND SECOND({$wpdb->posts}.post_date)=\" . substr($q['m'], 12, 2);\n                }\n            }\n\n            // Handle the other individual date parameters.\n            $date_parameters = array();\n\n            if ('' !== $q['hour']) {\n                $date_parameters['hour'] = $q['hour'];\n            }\n\n            if ('' !== $q['minute']) {\n                $date_parameters['minute'] = $q['minute'];\n            }\n\n            if ('' !== $q['second']) {\n                $date_parameters['second'] = $q['second'];\n            }\n\n            if ($q['year']) {\n                $date_parameters['year'] = $q['year'];\n            }\n\n            if ($q['monthnum']) {\n                $date_parameters['monthnum'] = $q['monthnum'];\n            }\n\n            if ($q['w']) {\n                $date_parameters['week'] = $q['w'];\n            }\n\n            if ($q['day']) {\n                $date_parameters['day'] = $q['day'];\n            }\n\n            if ($date_parameters) {\n                $date_query = new WP_Date_Query(array($date_parameters));\n                $where .= $date_query->get_sql();\n            }\n            unset($date_parameters, $date_query);\n\n            // Handle complex date queries.\n            if (!empty($q['date_query'])) {\n                $this->date_query = new WP_Date_Query($q['date_query']);\n                $where .= $this->date_query->get_sql();\n            }\n\n            // If we've got a post_type AND it's not \"any\" post_type.\n            if (!empty($q['post_type']) && 'any' !== $q['post_type']) {\n                foreach ((array)$q['post_type'] as $_post_type) {\n                    $ptype_obj = get_post_type_object($_post_type);\n                    if (!$ptype_obj || !$ptype_obj->query_var || empty($q[$ptype_obj->query_var])) {\n                        continue;\n                    }\n\n                    if (!$ptype_obj->hierarchical) {\n                        // Non-hierarchical post types can directly use 'name'.\n                        $q['name'] = $q[$ptype_obj->query_var];\n                    } else {\n                        // Hierarchical post types will operate through 'pagename'.\n                        $q['pagename'] = $q[$ptype_obj->query_var];\n                        $q['name'] = '';\n                    }\n\n                    // Only one request for a slug is possible, this is why name & pagename are overwritten above.\n                    break;\n                } // End foreach.\n                unset($ptype_obj);\n            }\n\n            if ('' !== $q['title']) {\n                $where .= sprintf(\" AND {$wpdb->posts}.title = %s\", stripslashes($q['title']));\n            }\n\n            // Parameters related to 'post_name'.\n            if ('' !== $q['name']) {\n//            $q['name'] = sanitize_title_for_query( $q['name'] );\n                $where .= \" AND {$wpdb->posts}.post_name = '\" . $q['name'] . \"'\";\n            } elseif ('' !== $q['pagename']) {\n                if (isset($this->queried_object_id)) {\n                    $reqpage = $this->queried_object_id;\n                } else {\n                    if ('page' !== $q['post_type']) {\n                        foreach ((array)$q['post_type'] as $_post_type) {\n                            $ptype_obj = get_post_type_object($_post_type);\n                            if (!$ptype_obj || !$ptype_obj->hierarchical) {\n                                continue;\n                            }\n\n                            $reqpage = get_page_by_path($q['pagename'], OBJECT, $_post_type);\n                            if ($reqpage) {\n                                break;\n                            }\n                        }\n                        unset($ptype_obj);\n                    } else {\n                        $reqpage = get_page_by_path($q['pagename']);\n                    }\n                    if (!empty($reqpage)) {\n                        $reqpage = $reqpage->ID;\n                    } else {\n                        $reqpage = 0;\n                    }\n                }\n\n                $page_for_posts = get_option('page_for_posts');\n                if (('page' !== get_option('show_on_front')) || empty($page_for_posts) || ($reqpage != $page_for_posts)) {\n                    $q['pagename'] = sanitize_title_for_query(wp_basename($q['pagename']));\n                    $q['name'] = $q['pagename'];\n                    $where .= \" AND ({$wpdb->posts}.ID = '$reqpage')\";\n                    $reqpage_obj = get_post($reqpage);\n                    if (is_object($reqpage_obj) && 'attachment' === $reqpage_obj->post_type) {\n                        $this->is_attachment = true;\n                        $post_type = 'attachment';\n                        $q['post_type'] = 'attachment';\n                        $this->is_page = true;\n                        $q['attachment_id'] = $reqpage;\n                    }\n                }\n            } elseif ('' !== $q['attachment']) {\n                $q['attachment'] = sanitize_title_for_query(wp_basename($q['attachment']));\n                $q['name'] = $q['attachment'];\n                $where .= \" AND {$wpdb->posts}.post_name = '\" . $q['attachment'] . \"'\";\n            } elseif (is_array($q['post_name__in']) && !empty($q['post_name__in'])) {\n                $q['post_name__in'] = array_map('sanitize_title_for_query', $q['post_name__in']);\n                $post_name__in = \"'\" . implode(\"','\", $q['post_name__in']) . \"'\";\n                $where .= \" AND {$wpdb->posts}.post_name IN ($post_name__in)\";\n            }\n            // If an attachment is requested by number, let it supersede any post number.\n            if ($q['attachment_id']) {\n                $q['p'] = absint($q['attachment_id']);\n            }\n\n            // If a post number is specified, load that post.\n            if ($q['p']) {\n                $where .= \" AND {$wpdb->posts}.ID = \" . $q['p'];\n            } elseif ($q['post__in']) {\n                $post__in = implode(',', array_map('absint', $q['post__in']));\n                $where .= \" AND {$wpdb->posts}.ID IN ($post__in)\";\n            } elseif ($q['post__not_in']) {\n                $post__not_in = implode(',', array_map('absint', $q['post__not_in']));\n                $where .= \" AND {$wpdb->posts}.ID NOT IN ($post__not_in)\";\n            }\n\n            if (is_numeric($q['post_parent'])) {\n                $where .= sprintf(\" AND {$wpdb->posts}.post_parent = %d \", $q['post_parent']);\n            } elseif ($q['post_parent__in']) {\n                $post_parent__in = implode(',', array_map('absint', $q['post_parent__in']));\n                $where .= \" AND {$wpdb->posts}.post_parent IN ($post_parent__in)\";\n            } elseif ($q['post_parent__not_in']) {\n                $post_parent__not_in = implode(',', array_map('absint', $q['post_parent__not_in']));\n                $where .= \" AND {$wpdb->posts}.post_parent NOT IN ($post_parent__not_in)\";\n            }\n\n            if ($q['page_id']) {\n                if (('page' !== get_option('show_on_front')) || (get_option('page_for_posts') != $q['page_id'])) {\n                    $q['p'] = $q['page_id'];\n                    $where = \" AND {$wpdb->posts}.ID = \" . $q['page_id'];\n                }\n            }\n\n            // If a search pattern is specified, load the posts that match.\n            if (strlen($q['s'])) {\n                $search = $this->parse_search($q);\n            }\n            // Author/user stuff.\n\n            if (!empty($q['author']) && '0' != $q['author']) {\n                $q['author'] = addslashes_gpc('' . urldecode($q['author']));\n                $authors = array_unique(array_map('intval', preg_split('/[,\\s]+/', $q['author'])));\n                foreach ($authors as $author) {\n                    $key = $author > 0 ? 'author__in' : 'author__not_in';\n                    $q[$key][] = abs($author);\n                }\n                $q['author'] = implode(',', $authors);\n            }\n\n            if (!empty($q['author__not_in'])) {\n                $author__not_in = implode(',', array_map('absint', array_unique((array)$q['author__not_in'])));\n                $where .= \" AND {$wpdb->posts}.post_author NOT IN ($author__not_in) \";\n            } elseif (!empty($q['author__in'])) {\n                $author__in = implode(',', array_map('absint', array_unique((array)$q['author__in'])));\n                $where .= \" AND {$wpdb->posts}.post_author IN ($author__in) \";\n            }\n\n            // Author stuff for nice URLs.\n\n            if ('' !== $q['author_name']) {\n                if (strpos($q['author_name'], '/') !== false) {\n                    $q['author_name'] = explode('/', $q['author_name']);\n                    if ($q['author_name'][count($q['author_name']) - 1]) {\n                        $q['author_name'] = $q['author_name'][count($q['author_name']) - 1]; // No trailing slash.\n                    } else {\n                        $q['author_name'] = $q['author_name'][count($q['author_name']) - 2]; // There was a trailing slash.\n                    }\n                }\n                $q['author_name'] = sanitize_title_for_query($q['author_name']);\n                $q['author'] = get_user_by('slug', $q['author_name']);\n                if ($q['author']) {\n                    $q['author'] = $q['author']->ID;\n                }\n                $whichauthor .= \" AND ({$wpdb->posts}.post_author = \" . absint($q['author']) . ')';\n            }\n\n            // Matching by comment count.\n            if (isset($q['comment_count'])) {\n                // Numeric comment count is converted to array format.\n                if (is_numeric($q['comment_count'])) {\n                    $q['comment_count'] = array(\n                        'value' => (int)$q['comment_count'],\n                    );\n                }\n\n                if (isset($q['comment_count']['value'])) {\n                    $q['comment_count'] = array_merge(\n                        array(\n                            'compare' => '=',\n                        ),\n                        $q['comment_count']\n                    );\n\n                    // Fallback for invalid compare operators is '='.\n                    $compare_operators = array('=', '!=', '>', '>=', '<', '<=');\n                    if (!in_array($q['comment_count']['compare'], $compare_operators, true)) {\n                        $q['comment_count']['compare'] = '=';\n                    }\n\n                    $where .= sprintf(\" AND {$wpdb->posts}.comment_count {$q['comment_count']['compare']} %d\", $q['comment_count']['value']);\n                }\n            }\n\n            // MIME-Type stuff for attachment browsing.\n\n//        if ( isset( $q['post_mime_type'] ) && '' !== $q['post_mime_type'] ) {\n//            $whichmimetype = wp_post_mime_type_where( $q['post_mime_type'], $wpdb->posts );\n//        }\n//        $where .= $search . $whichauthor . $whichmimetype;\n            if (!empty($this->meta_query->queries)) {\n                $clauses = $this->meta_query->get_sql('post', $wpdb->posts, 'ID', $this);\n                $join .= $clauses['join'];\n                $where .= $clauses['where'];\n            }\n\n            $rand = (isset($q['orderby']) && 'rand' === $q['orderby']);\n            if (!isset($q['order'])) {\n                $q['order'] = $rand ? '' : 'DESC';\n            } else {\n                $q['order'] = $rand ? '' : $this->parse_order($q['order']);\n            }\n\n            // These values of orderby should ignore the 'order' parameter.\n            $force_asc = array('post__in', 'post_name__in', 'post_parent__in');\n            if (isset($q['orderby']) && in_array($q['orderby'], $force_asc, true)) {\n                $q['order'] = '';\n            }\n\n            // Order by.\n            if (empty($q['orderby'])) {\n                /*\n             * Boolean false or empty array blanks out ORDER BY,\n             * while leaving the value unset or otherwise empty sets the default.\n             */\n                if (isset($q['orderby']) && (is_array($q['orderby']) || false === $q['orderby'])) {\n                    $orderby = '';\n                } else {\n                    $orderby = \"{$wpdb->getPrefix()}contents.created \" . $q['order'];\n                }\n            } elseif ('none' === $q['orderby']) {\n                $orderby = '';\n            } else {\n                $orderby_array = array();\n                if (is_array($q['orderby'])) {\n                    foreach ($q['orderby'] as $_orderby => $order) {\n                        $orderby = addslashes_gpc(urldecode($_orderby));\n                        $parsed = $this->parse_orderby($orderby);\n\n                        if (!$parsed) {\n                            continue;\n                        }\n\n                        $orderby_array[] = $parsed . ' ' . $this->parse_order($order);\n                    }\n                    $orderby = implode(', ', $orderby_array);\n\n                } else {\n                    $q['orderby'] = urldecode($q['orderby']);\n                    $q['orderby'] = addslashes_gpc($q['orderby']);\n\n                    foreach (explode(' ', $q['orderby']) as $i => $orderby) {\n                        $parsed = $this->parse_orderby($orderby);\n                        // Only allow certain values for safety.\n                        if (!$parsed) {\n                            continue;\n                        }\n\n                        $orderby_array[] = $parsed;\n                    }\n                    $orderby = implode(' ' . $q['order'] . ', ', $orderby_array);\n\n                    if (empty($orderby)) {\n                        $orderby = \"{$wpdb->posts}.post_date \" . $q['order'];\n                    } elseif (!empty($q['order'])) {\n                        $orderby .= \" {$q['order']}\";\n                    }\n                }\n            }\n\n//        // Order search results by relevance only when another \"orderby\" is not specified in the query.\n//        if ( ! empty( $q['s'] ) ) {\n//            $search_orderby = '';\n//            if ( ! empty( $q['search_orderby_title'] ) && ( empty( $q['orderby'] ) && ! $this->is_feed ) || ( isset( $q['orderby'] ) && 'relevance' === $q['orderby'] ) ) {\n//                $search_orderby = $this->parse_search_order( $q );\n//            }\n//\n//            if ( ! $q['suppress_filters'] ) {\n//                /**\n//                 * Filters the ORDER BY used when ordering search results.\n//                 *\n//                 * @since 3.7.0\n//                 *\n//                 * @param string   $search_orderby The ORDER BY clause.\n//                 * @param WP_Query $query          The current WP_Query instance.\n//                 */\n//                $search_orderby = apply_filters( 'posts_search_orderby', $search_orderby, $this );\n//            }\n//            if ( $search_orderby ) {\n//                $orderby = $orderby ? $search_orderby . ', ' . $orderby : $search_orderby;\n//            }\n//        }\n\n            if (is_array($post_type) && count($post_type) > 1) {\n                $post_type_cap = 'multiple_post_type';\n            } else {\n                if (is_array($post_type)) {\n                    $post_type = reset($post_type);\n                }\n                $post_type_object = get_post_type_object($post_type);\n                if (empty($post_type_object)) {\n                    $post_type_cap = $post_type;\n                }\n            }\n\n            if (isset($q['post_password'])) {\n                $where .= sprintf(\" AND {$wpdb->posts}.post_password = %s\", $q['post_password']);\n                if (empty($q['perm'])) {\n                    $q['perm'] = 'readable';\n                }\n            } elseif (isset($q['has_password'])) {\n                $where .= sprintf(\" AND {$wpdb->posts}.post_password %s ''\", $q['has_password'] ? '!=' : '=');\n            }\n\n            if (!empty($q['comment_status'])) {\n                $where .= sprintf(\" AND {$wpdb->posts}.comment_status = %s \", $q['comment_status']);\n            }\n\n            if (!empty($q['ping_status'])) {\n                $where .= sprintf(\" AND {$wpdb->posts}.ping_status = %s \", $q['ping_status']);\n            }\n\n            $skip_post_status = false;\n            if ('any' === $post_type) {\n                $in_search_post_types = get_post_types(array('exclude_from_search' => false));\n                if (empty($in_search_post_types)) {\n                    $post_type_where = ' AND 1=0 ';\n                    $skip_post_status = true;\n                } else {\n                    $post_type_where = \" AND {$wpdb->posts}.post_type IN ('\" . implode(\"', '\", array_map('esc_sql', $in_search_post_types)) . \"')\";\n                }\n            } elseif (!empty($post_type) && is_array($post_type)) {\n                $post_type_where = \" AND {$wpdb->posts}.post_type IN ('\" . implode(\"', '\", esc_sql($post_type)) . \"')\";\n            } elseif (!empty($post_type)) {\n                $post_type_where = sprintf(\" AND {$wpdb->getPrefix()}contents.post_type = '%s'\", $post_type);\n                $post_type_object = get_post_type_object($post_type);\n            } elseif ($this->is_attachment) {\n                $post_type_where = \" AND {$wpdb->posts}.post_type = 'attachment'\";\n                $post_type_object = get_post_type_object('attachment');\n            } elseif ($this->is_page) {\n                $post_type_where = \" AND {$wpdb->posts}.post_type = 'page'\";\n                $post_type_object = get_post_type_object('page');\n            } else {\n                $post_type_where = \" AND {$wpdb->posts}.post_type = 'post'\";\n                $post_type_object = get_post_type_object('post');\n            }\n\n            $edit_cap = 'edit_post';\n            $read_cap = 'read_post';\n\n            if (!empty($post_type_object)) {\n                $edit_others_cap = $post_type_object->cap->edit_others_posts;\n                $read_private_cap = $post_type_object->cap->read_private_posts;\n            } else {\n                $edit_others_cap = 'edit_others_' . $post_type_cap . 's';\n                $read_private_cap = 'read_private_' . $post_type_cap . 's';\n            }\n\n            $user_id = get_current_user_id();\n\n            $q_status = array();\n            if ($skip_post_status) {\n                $where .= $post_type_where;\n            } elseif (!empty($q['status'])) {\n\n                $where .= $post_type_where;\n\n                $statuswheres = array();\n                $q_status = $q['status'];\n                if (!is_array($q_status)) {\n                    $q_status = explode(',', $q_status);\n                }\n                $r_status = array();\n                $p_status = array();\n                $e_status = array();\n                if (in_array('any', $q_status, true)) {\n                    foreach (get_post_stati(array('exclude_from_search' => true)) as $status) {\n                        if (!in_array($status, $q_status, true)) {\n                            $e_status[] = \"{$wpdb->getPrefix()}contents.status <> '$status'\";\n                        }\n                    }\n                } else {\n\n                    foreach (get_post_stati() as $status) {\n                        if (in_array($status, $q_status, true)) {\n                            if ('private' === $status) {\n                                $p_status[] = \"{$wpdb->getPrefix()}contents.status = '$status'\";\n                            } else {\n                                $r_status[] = \"{$wpdb->getPrefix()}contents.status = '$status'\";\n                            }\n                        }\n                    }\n                }\n\n                if (empty($q['perm']) || 'readable' !== $q['perm']) {\n                    $r_status = array_merge($r_status, $p_status);\n                    unset($p_status);\n                }\n\n                if (!empty($e_status)) {\n                    $statuswheres[] = '(' . implode(' AND ', $e_status) . ')';\n                }\n                if (!empty($r_status)) {\n                    if (!empty($q['perm']) && 'editable' === $q['perm'] && !current_user_can($edit_others_cap)) {\n                        $statuswheres[] = \"({$wpdb->posts}.post_author = $user_id \" . 'AND (' . implode(' OR ', $r_status) . '))';\n                    } else {\n                        $statuswheres[] = '(' . implode(' OR ', $r_status) . ')';\n                    }\n                }\n                if (!empty($p_status)) {\n                    if (!empty($q['perm']) && 'readable' === $q['perm'] && !current_user_can($read_private_cap)) {\n                        $statuswheres[] = \"({$wpdb->posts}.post_author = $user_id \" . 'AND (' . implode(' OR ', $p_status) . '))';\n                    } else {\n                        $statuswheres[] = '(' . implode(' OR ', $p_status) . ')';\n                    }\n                }\n                if ($post_status_join) {\n                    $join .= \" LEFT JOIN {$wpdb->posts} AS p2 ON ({$wpdb->posts}.post_parent = p2.ID) \";\n                    foreach ($statuswheres as $index => $statuswhere) {\n                        $statuswheres[$index] = \"($statuswhere OR ({$wpdb->getPrefix()}contents.status = 'inherit' AND \" . str_replace($wpdb->posts, 'p2', $statuswhere) . '))';\n                    }\n                }\n                $where_status = implode(' OR ', $statuswheres);\n                if (!empty($where_status)) {\n                    $where .= \" AND ($where_status)\";\n                }\n            } elseif (!$this->is_singular) {\n                if ('any' === $post_type) {\n                    $queried_post_types = get_post_types(array('exclude_from_search' => false));\n                } elseif (is_array($post_type)) {\n                    $queried_post_types = $post_type;\n                } elseif (!empty($post_type)) {\n                    $queried_post_types = array($post_type);\n                } else {\n                    $queried_post_types = array('post');\n                }\n\n                if (!empty($queried_post_types)) {\n\n                    $status_type_clauses = array();\n\n                    foreach ($queried_post_types as $queried_post_type) {\n\n                        $queried_post_type_object = get_post_type_object($queried_post_type);\n\n                        $type_where = '(' . \"{$wpdb->getPrefix()}contents.post_type = '$queried_post_type' AND (\";\n\n                        // Public statuses.\n                        $public_statuses = get_post_stati(array('public' => true));\n                        $status_clauses = array();\n                        foreach ($public_statuses as $public_status) {\n                            $status_clauses[] = \"{$wpdb->getPrefix()}contents.status = '$public_status'\";\n                        }\n                        $type_where .= implode(' OR ', $status_clauses);\n\n//                    // Add protected states that should show in the admin all list.\n//                    if ( $this->is_admin ) {\n//                        $admin_all_statuses = get_post_stati(\n//                            array(\n//                                'protected'              => true,\n//                                'show_in_admin_all_list' => true,\n//                            )\n//                        );\n//                        foreach ( $admin_all_statuses as $admin_all_status ) {\n//                            $type_where .= \" OR {$wpdb->getPrefix()}contents.status = '$admin_all_status'\";\n//                        }\n//                    }\n\n                        // Add private states that are visible to current user.\n                        if (is_user_logged_in() && $queried_post_type_object instanceof WP_Post_Type) {\n                            $read_private_cap = $queried_post_type_object->cap->read_private_posts;\n                            $private_statuses = get_post_stati(array('private' => true));\n                            foreach ($private_statuses as $private_status) {\n                                $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')\";\n                            }\n                        }\n\n                        $type_where .= '))';\n\n                        $status_type_clauses[] = $type_where;\n                    }\n\n                    if (!empty($status_type_clauses)) {\n                        $where .= ' AND (' . implode(' OR ', $status_type_clauses) . ')';\n                    }\n                } else {\n                    $where .= ' AND 1=0 ';\n                }\n            } else {\n                $where .= $post_type_where;\n            }\n            $where .= $search;\n\n            // Paging.\n            if (empty($q['nopaging']) && !$this->is_singular) {\n                $page = absint($q['paged']);\n                if (!$page) {\n                    $page = 1;\n                }\n\n                // If 'offset' is provided, it takes precedence over 'paged'.\n                if (isset($q['offset']) && is_numeric($q['offset'])) {\n                    $q['offset'] = absint($q['offset']);\n                    $pgstrt = $q['offset'] . ', ';\n                } else {\n                    $pgstrt = absint(($page - 1) * $q['posts_per_page']) . ', ';\n                }\n                $limits = 'LIMIT ' . $pgstrt . $q['posts_per_page'];\n            }\n\n//        // Comments feeds.\n//        if ( $this->is_comment_feed && ! $this->is_singular ) {\n//            if ( $this->is_archive || $this->is_search ) {\n//                $cjoin    = \"JOIN {$wpdb->posts} ON ( {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID ) $join \";\n//                $cwhere   = \"WHERE comment_approved = '1' $where\";\n//                $cgroupby = \"{$wpdb->comments}.comment_id\";\n//            } else { // Other non-singular, e.g. front.\n//                $cjoin    = \"JOIN {$wpdb->posts} ON ( {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID )\";\n//                $cwhere   = \"WHERE ( status = 'publish' OR ( status = 'inherit' AND post_type = 'attachment' ) ) AND comment_approved = '1'\";\n//                $cgroupby = '';\n//            }\n//\n//\n//            $cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : '';\n//            $corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : '';\n//            $climits  = ( ! empty( $climits ) ) ? $climits : '';\n//\n//            $comments = (array) $wpdb->get_results( \"SELECT $distinct {$wpdb->comments}.* FROM {$wpdb->comments} $cjoin $cwhere $cgroupby $corderby $climits\" );\n//            // Convert to WP_Comment.\n//            /** @var WP_Comment[] */\n//            $this->comments      = array_map( 'get_comment', $comments );\n//            $this->comment_count = count( $this->comments );\n//\n//            $post_ids = array();\n//\n//            foreach ( $this->comments as $comment ) {\n//                $post_ids[] = (int) $comment->comment_post_ID;\n//            }\n//\n//            $post_ids = implode( ',', $post_ids );\n//            $join     = '';\n//            if ( $post_ids ) {\n//                $where = \"AND {$wpdb->posts}.ID IN ($post_ids) \";\n//            } else {\n//                $where = 'AND 0';\n//            }\n//        }\n\n            $pieces = array('where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits');\n\n\n            if (!empty($groupby)) {\n                $groupby = 'GROUP BY ' . $groupby;\n            }\n            if (!empty($orderby)) {\n                $orderby = 'ORDER BY ' . $orderby;\n            }\n\n            $found_rows = '';\n            if (!$q['no_found_rows'] && !empty($limits)) {\n                $found_rows = 'SQL_CALC_FOUND_ROWS';\n            }\n            $old_request = \"SELECT $found_rows $distinct $fields FROM {$wpdb->getPrefix()}contents $join WHERE 1=1 $where $groupby $orderby $limits\";\n            $old_request = str_replace('post_type', 'type', $old_request);\n            $this->request = $old_request;\n            if ('ids' === $q['fields']) {\n                if (null === $this->posts) {\n                    $this->posts = $wpdb->get_col($this->request);\n                }\n\n                /** @var int[] */\n                $this->posts = array_map('intval', $this->posts);\n                $this->post_count = count($this->posts);\n                $this->set_found_posts($q, $limits);\n\n                return $this->posts;\n            }\n\n            if ('id=>parent' === $q['fields']) {\n                if (null === $this->posts) {\n                    $this->posts = $wpdb->get_results($this->request);\n                }\n\n                $this->post_count = count($this->posts);\n                $this->set_found_posts($q, $limits);\n\n                /** @var int[] */\n                $r = array();\n                foreach ($this->posts as $key => $post) {\n                    $this->posts[$key]->ID = (int)$post->ID;\n                    $this->posts[$key]->post_parent = (int)$post->post_parent;\n\n                    $r[(int)$post->ID] = (int)$post->post_parent;\n                }\n\n                return $r;\n            }\n\n            if (null === $this->posts) {\n                $split_the_query = ($old_request == $this->request && \"{$wpdb->getPrefix()}contents.*\" === $fields && !empty($limits) && $q['posts_per_page'] < 500);\n\n                /**\n                 * Filters whether to split the query.\n                 *\n                 * Splitting the query will cause it to fetch just the IDs of the found posts\n                 * (and then individually fetch each post by ID), rather than fetching every\n                 * complete row at once. One massive result vs. many small results.\n                 *\n                 * @param bool $split_the_query Whether or not to split the query.\n                 * @param WP_Query $query The WP_Query instance.\n                 * @since 3.4.0\n                 *\n                 */\n                $split_the_query = apply_filters('split_the_query', $split_the_query, $this);\n\n                if ($split_the_query) {\n                    // First get the IDs and then fill in the objects.\n\n                    $this->request = \"SELECT {$wpdb->getPrefix()}contents.cid FROM {$wpdb->getPrefix()}contents  WHERE 1=1 $where $groupby $orderby\";\n                    //echo \"SELECT $found_rows $distinct {$wpdb->getPrefix()}contents.cid FROM {$wpdb->getPrefix()}contents  WHERE 1=1 $where $groupby $orderby $limits\";\n\n                    /**\n                     * Filters the Post IDs SQL request before sending.\n                     *\n                     * @param string $request The post ID request.\n                     * @param WP_Query $query The WP_Query instance.\n                     * @since 3.4.0\n                     *\n                     */\n                    $this->request = apply_filters('posts_request_ids', $this->request, $this);\n                    $this->request = str_replace('post_type', 'type', $this->request);\n\n                    $ids = $wpdb->fetchAll($this->request);\n                    $ids = array_column($ids, 'cid');\n                    if ($ids) {\n                        $this->posts = $ids;\n                        $this->set_found_posts($q, $limits);\n//                    _prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] );\n                    } else {\n                        $this->posts = array();\n                    }\n                } else {\n                    $this->request = str_replace('post_type', 'type', $this->request);\n\n                    $this->posts = $wpdb->fetchAll($this->request);\n\n                    $this->set_found_posts($q, $limits);\n                }\n            }\n            // Convert to WP_Post objects.\n            if ($this->posts) {\n                /** @var WP_Post[] */\n                $this->posts = array_map('get_post', $this->posts);\n\n            }\n\n            // Check post status to determine if post should be displayed.\n            if (!empty($this->posts) && ($this->is_single || $this->is_page)) {\n                $status = get_post_status($this->posts[0]);\n\n                if ('attachment' === $this->posts[0]->post_type && 0 === (int)$this->posts[0]->post_parent) {\n                    $this->is_page = false;\n                    $this->is_single = true;\n                    $this->is_attachment = true;\n                }\n\n                // If the status was specifically requested, let it pass through.\n                if (!in_array($status, $q_status, true)) {\n                    $post_status_obj = get_post_status_object($status);\n\n                    if ($post_status_obj && !$post_status_obj->public) {\n                        if (!is_user_logged_in()) {\n                            // User must be logged in to view unpublished posts.\n                            $this->posts = array();\n                        } else {\n                            if ($post_status_obj->protected) {\n                                // User must have edit permissions on the draft to preview.\n                                if (!current_user_can($edit_cap, $this->posts[0]->ID)) {\n                                    $this->posts = array();\n                                } else {\n                                    $this->is_preview = true;\n                                    if ('future' !== $status) {\n                                        $this->posts[0]->post_date = current_time('mysql');\n                                    }\n                                }\n                            } elseif ($post_status_obj->private) {\n                                if (!current_user_can($read_cap, $this->posts[0]->ID)) {\n                                    $this->posts = array();\n                                }\n                            } else {\n                                $this->posts = array();\n                            }\n                        }\n                    } elseif (!$post_status_obj) {\n                        // Post status is not registered, assume it's not public.\n                        if (!current_user_can($edit_cap, $this->posts[0]->ID)) {\n                            $this->posts = array();\n                        }\n                    }\n                }\n\n\n            }\n\n            // Put sticky posts at the top of the posts array.\n            $sticky_posts = get_option('sticky_posts');\n            if ($this->is_home && $page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$q['ignore_sticky_posts']) {\n                $num_posts = count($this->posts);\n                $sticky_offset = 0;\n                // Loop over posts and relocate stickies to the front.\n                for ($i = 0; $i < $num_posts; $i++) {\n                    if (in_array($this->posts[$i]->ID, $sticky_posts, true)) {\n                        $sticky_post = $this->posts[$i];\n                        // Remove sticky from current position.\n                        array_splice($this->posts, $i, 1);\n                        // Move to front, after other stickies.\n                        array_splice($this->posts, $sticky_offset, 0, array($sticky_post));\n                        // Increment the sticky offset. The next sticky will be placed at this offset.\n                        $sticky_offset++;\n                        // Remove post from sticky posts array.\n                        $offset = array_search($sticky_post->ID, $sticky_posts, true);\n                        unset($sticky_posts[$offset]);\n                    }\n                }\n\n                // If any posts have been excluded specifically, Ignore those that are sticky.\n                if (!empty($sticky_posts) && !empty($q['post__not_in'])) {\n                    $sticky_posts = array_diff($sticky_posts, $q['post__not_in']);\n                }\n\n                // Fetch sticky posts that weren't in the query results.\n                if (!empty($sticky_posts)) {\n                    $stickies = get_posts(\n                        array(\n                            'post__in' => $sticky_posts,\n                            'post_type' => $post_type,\n                            'status' => 'publish',\n                            'nopaging' => true,\n                        )\n                    );\n\n                    foreach ($stickies as $sticky_post) {\n                        array_splice($this->posts, $sticky_offset, 0, array($sticky_post));\n                        $sticky_offset++;\n                    }\n                }\n            }\n\n            // If comments have been fetched as part of the query, make sure comment meta lazy-loading is set up.\n            if (!empty($this->comments)) {\n                wp_queue_comments_for_comment_meta_lazyload($this->comments);\n            }\n\n            // Ensure that any posts added/modified via one of the filters above are\n            // of the type WP_Post and are filtered.\n            if ($this->posts) {\n                $this->post_count = count($this->posts);\n\n                /** @var WP_Post[] */\n                $this->posts = array_map('get_post', $this->posts);\n\n                if ($q['cache_results']) {\n                    // todo: add cache\n//                update_post_caches( $this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache'] );\n                }\n\n                /** @var WP_Post */\n                $this->post = reset($this->posts);\n            } else {\n                $this->post_count = 0;\n                $this->posts = array();\n            }\n\n            if ($q['lazy_load_term_meta']) {\n                // tudo: add cache\n//            wp_queue_posts_for_term_meta_lazyload( $this->posts );\n            }\n\n            // fix: typecho cid\n\n\n            return $this->posts;\n        }\n\n        /**\n         * Set up the amount of found posts and the number of pages (if limit clause was used)\n         * for the current query.\n         *\n         * @param array $q Query variables.\n         * @param string $limits LIMIT clauses of the query.\n         * @since 3.5.0\n         *\n         * @global wpdb $wpdb WordPress database abstraction object.\n         *\n         */\n        private function set_found_posts($q, $limits)\n        {\n            global $wpdb;\n\n            // Bail if posts is an empty array. Continue if posts is an empty string,\n            // null, or false to accommodate caching plugins that fill posts later.\n            if ($q['no_found_rows'] || (is_array($this->posts) && !$this->posts)) {\n                return;\n            }\n\n            if (!empty($limits)) {\n                /**\n                 * Filters the query to run for retrieving the found posts.\n                 *\n                 * @param string $found_posts_query The query to run to find the found posts.\n                 * @param WP_Query $query The WP_Query instance (passed by reference).\n                 * @since 2.1.0\n                 *\n                 */\n//            $found_posts_query = apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) );\n\n//            $this->found_posts = (int) $wpdb->get_var( $found_posts_query );\n            } else {\n                if (is_array($this->posts)) {\n                    $this->found_posts = count($this->posts);\n                } else {\n                    if (null === $this->posts) {\n                        $this->found_posts = 0;\n                    } else {\n                        $this->found_posts = 1;\n                    }\n                }\n            }\n\n            /**\n             * Filters the number of found posts for the query.\n             *\n             * @param int $found_posts The number of posts found.\n             * @param WP_Query $query The WP_Query instance (passed by reference).\n             * @since 2.1.0\n             *\n             */\n//        $this->found_posts = (int) apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) );\n\n            if (!empty($limits)) {\n                $this->max_num_pages = ceil($this->found_posts / $q['posts_per_page']);\n            }\n        }\n\n        /**\n         * Set up the next post and iterate current post index.\n         *\n         * @return WP_Post Next post.\n         * @since 1.5.0\n         *\n         */\n        public function next_post()\n        {\n\n            $this->current_post++;\n\n            /** @var WP_Post */\n            $this->post = $this->posts[$this->current_post];\n            return $this->post;\n        }\n\n        /**\n         * Sets up the current post.\n         *\n         * Retrieves the next post, sets up the post, sets the 'in the loop'\n         * property to true.\n         *\n         * @since 1.5.0\n         *\n         * @global WP_Post $post Global post object.\n         */\n        public function the_post()\n        {\n            global $post;\n            $this->in_the_loop = true;\n\n            if (-1 == $this->current_post) { // Loop has just started.\n                /**\n                 * Fires once the loop is started.\n                 *\n                 * @param WP_Query $query The WP_Query instance (passed by reference).\n                 * @since 2.0.0\n                 *\n                 */\n//            do_action_ref_array( 'loop_start', array( &$this ) );\n            }\n\n            $post = $this->next_post();\n            $this->setup_postdata($post);\n        }\n\n        /**\n         * Determines whether there are more posts available in the loop.\n         *\n         * Calls the {@see 'loop_end'} action when the loop is complete.\n         *\n         * @return bool True if posts are available, false if end of the loop.\n         * @since 1.5.0\n         *\n         */\n        public function have_posts()\n        {\n            if ($this->current_post + 1 < $this->post_count) {\n                return true;\n            } elseif ($this->current_post + 1 == $this->post_count && $this->post_count > 0) {\n                /**\n                 * Fires once the loop has ended.\n                 *\n                 * @param WP_Query $query The WP_Query instance (passed by reference).\n                 * @since 2.0.0\n                 *\n                 */\n//            do_action_ref_array( 'loop_end', array( &$this ) );\n                // Do some cleaning up after the loop.\n                $this->rewind_posts();\n            } elseif (0 === $this->post_count) {\n                /**\n                 * Fires if no results are found in a post query.\n                 *\n                 * @param WP_Query $query The WP_Query instance.\n                 * @since 4.9.0\n                 *\n                 */\n//            do_action( 'loop_no_results', $this );\n            }\n\n            $this->in_the_loop = false;\n            return false;\n        }\n\n        /**\n         * Rewind the posts and reset post index.\n         *\n         * @since 1.5.0\n         */\n        public function rewind_posts()\n        {\n            $this->current_post = -1;\n            if ($this->post_count > 0) {\n                $this->post = $this->posts[0];\n            }\n        }\n\n        /**\n         * Iterate current comment index and return WP_Comment object.\n         *\n         * @return WP_Comment Comment object.\n         * @since 2.2.0\n         *\n         */\n        public function next_comment()\n        {\n            $this->current_comment++;\n\n            /** @var WP_Comment */\n            $this->comment = $this->comments[$this->current_comment];\n            return $this->comment;\n        }\n\n        /**\n         * Sets up the current comment.\n         *\n         * @since 2.2.0\n         *\n         * @global WP_Comment $comment Global comment object.\n         */\n        public function the_comment()\n        {\n            global $comment;\n\n            $comment = $this->next_comment();\n\n            if (0 == $this->current_comment) {\n                /**\n                 * Fires once the comment loop is started.\n                 *\n                 * @since 2.2.0\n                 */\n                do_action('comment_loop_start');\n            }\n        }\n\n        /**\n         * Whether there are more comments available.\n         *\n         * Automatically rewinds comments when finished.\n         *\n         * @return bool True if comments are available, false if no more comments.\n         * @since 2.2.0\n         *\n         */\n        public function have_comments()\n        {\n            if ($this->current_comment + 1 < $this->comment_count) {\n                return true;\n            } elseif ($this->current_comment + 1 == $this->comment_count) {\n                $this->rewind_comments();\n            }\n\n            return false;\n        }\n\n        /**\n         * Rewind the comments, resets the comment index and comment to first.\n         *\n         * @since 2.2.0\n         */\n        public function rewind_comments()\n        {\n            $this->current_comment = -1;\n            if ($this->comment_count > 0) {\n                $this->comment = $this->comments[0];\n            }\n        }\n\n        /**\n         * Sets up the WordPress query by parsing query string.\n         *\n         * @param string|array $query URL query string or array of query arguments.\n         * @return WP_Post[]|int[] Array of post objects or post IDs.\n         * @since 1.5.0\n         *\n         * @see WP_Query::parse_query() for all available arguments.\n         *\n         */\n        public function query($query)\n        {\n            $this->init();\n            $this->query = wp_parse_args($query);\n            $this->query_vars = $this->query;\n            return $this->get_posts();\n        }\n\n        /**\n         * Retrieves the currently queried object.\n         *\n         * If queried object is not set, then the queried object will be set from\n         * the category, tag, taxonomy, posts page, single post, page, or author\n         * query variable. After it is set up, it will be returned.\n         *\n         * @return WP_Term|WP_Post_Type|WP_Post|WP_User|null The queried object.\n         * @since 1.5.0\n         *\n         */\n        public function get_queried_object()\n        {\n            if (isset($this->queried_object)) {\n                return $this->queried_object;\n            }\n\n            $this->queried_object = null;\n            $this->queried_object_id = null;\n            // todo\n            return null;\n\n            if ($this->is_category || $this->is_tag || $this->is_tax) {\n                if ($this->is_category) {\n                    if ($this->get('cat')) {\n                        $term = get_term($this->get('cat'), 'category');\n                    } elseif ($this->get('category_name')) {\n                        $term = get_term_by('slug', $this->get('category_name'), 'category');\n                    }\n                } elseif ($this->is_tag) {\n                    if ($this->get('tag_id')) {\n                        $term = get_term($this->get('tag_id'), 'tag');\n                    } elseif ($this->get('tag')) {\n                        $term = get_term_by('slug', $this->get('tag'), 'tag');\n                    }\n                } else {\n                    // For other tax queries, grab the first term from the first clause.\n                    if (!empty($this->tax_query->queried_terms)) {\n                        $queried_taxonomies = array_keys($this->tax_query->queried_terms);\n                        $matched_taxonomy = reset($queried_taxonomies);\n                        $query = $this->tax_query->queried_terms[$matched_taxonomy];\n\n                        if (!empty($query['terms'])) {\n                            if ('term_id' === $query['field']) {\n                                $term = get_term(reset($query['terms']), $matched_taxonomy);\n                            } else {\n                                $term = get_term_by($query['field'], reset($query['terms']), $matched_taxonomy);\n                            }\n                        }\n                    }\n                }\n\n                if (!empty($term) && !is_wp_error($term)) {\n                    $this->queried_object = $term;\n                    $this->queried_object_id = (int)$term->term_id;\n\n                    if ($this->is_category && 'category' === $this->queried_object->taxonomy) {\n                        _make_cat_compat($this->queried_object);\n                    }\n                }\n            } elseif ($this->is_post_type_archive) {\n                $post_type = $this->get('post_type');\n                if (is_array($post_type)) {\n                    $post_type = reset($post_type);\n                }\n                $this->queried_object = get_post_type_object($post_type);\n            } elseif ($this->is_posts_page) {\n                $page_for_posts = get_option('page_for_posts');\n                $this->queried_object = get_post($page_for_posts);\n                $this->queried_object_id = (int)$this->queried_object->ID;\n            } elseif ($this->is_singular && !empty($this->post)) {\n                $this->queried_object = $this->post;\n                $this->queried_object_id = (int)$this->post->ID;\n            } elseif ($this->is_author) {\n                $this->queried_object_id = (int)$this->get('author');\n                $this->queried_object = get_userdata($this->queried_object_id);\n            }\n\n            return $this->queried_object;\n        }\n\n        /**\n         * Retrieves the ID of the currently queried object.\n         *\n         * @return int\n         * @since 1.5.0\n         *\n         */\n        public function get_queried_object_id()\n        {\n            $this->get_queried_object();\n\n            if (isset($this->queried_object_id)) {\n                return $this->queried_object_id;\n            }\n\n            return 0;\n        }\n\n        /**\n         * Constructor.\n         *\n         * Sets up the WordPress query, if parameter is not empty.\n         *\n         * @param string|array $query URL query string or array of vars.\n         * @see WP_Query::parse_query() for all available arguments.\n         *\n         * @since 1.5.0\n         *\n         */\n        public function __construct($query = '')\n        {\n            if (!empty($query)) {\n                $this->query($query);\n            }\n        }\n\n        /**\n         * Make private properties readable for backward compatibility.\n         *\n         * @param string $name Property to get.\n         * @return mixed Property.\n         * @since 4.0.0\n         *\n         */\n        public function __get($name)\n        {\n            if (in_array($name, $this->compat_fields, true)) {\n                return $this->$name;\n            }\n        }\n\n        /**\n         * Make private properties checkable for backward compatibility.\n         *\n         * @param string $name Property to check if set.\n         * @return bool Whether the property is set.\n         * @since 4.0.0\n         *\n         */\n        public function __isset($name)\n        {\n            if (in_array($name, $this->compat_fields, true)) {\n                return isset($this->$name);\n            }\n        }\n\n        /**\n         * Make private/protected methods readable for backward compatibility.\n         *\n         * @param string $name Method to call.\n         * @param array $arguments Arguments to pass when calling.\n         * @return mixed|false Return value of the callback, false otherwise.\n         * @since 4.0.0\n         *\n         */\n        public function __call($name, $arguments)\n        {\n            if (in_array($name, $this->compat_methods, true)) {\n                return $this->$name(...$arguments);\n            }\n            return false;\n        }\n\n        /**\n         * Is the query for an existing archive page?\n         *\n         * Archive pages include category, tag, author, date, custom post type,\n         * and custom taxonomy based archives.\n         *\n         * @return bool Whether the query is for an existing archive page.\n         * @see WP_Query::is_category()\n         * @see WP_Query::is_tag()\n         * @see WP_Query::is_author()\n         * @see WP_Query::is_date()\n         * @see WP_Query::is_post_type_archive()\n         * @see WP_Query::is_tax()\n         *\n         * @since 3.1.0\n         *\n         */\n        public function is_archive()\n        {\n            return (bool)$this->is_archive;\n        }\n\n        /**\n         * Is the query for an existing post type archive page?\n         *\n         * @param string|string[] $post_types Optional. Post type or array of posts types\n         *                                    to check against. Default empty.\n         * @return bool Whether the query is for an existing post type archive page.\n         * @since 3.1.0\n         *\n         */\n        public function is_post_type_archive($post_types = '')\n        {\n            if (empty($post_types) || !$this->is_post_type_archive) {\n                return (bool)$this->is_post_type_archive;\n            }\n\n            $post_type = $this->get('post_type');\n            if (is_array($post_type)) {\n                $post_type = reset($post_type);\n            }\n            $post_type_object = get_post_type_object($post_type);\n\n            return in_array($post_type_object->name, (array)$post_types, true);\n        }\n\n        /**\n         * Is the query for an existing attachment page?\n         *\n         * @param int|string|int[]|string[] $attachment Optional. Attachment ID, title, slug, or array of such\n         *                                              to check against. Default empty.\n         * @return bool Whether the query is for an existing attachment page.\n         * @since 3.1.0\n         *\n         */\n        public function is_attachment($attachment = '')\n        {\n            if (!$this->is_attachment) {\n                return false;\n            }\n\n            if (empty($attachment)) {\n                return true;\n            }\n\n            $attachment = array_map('strval', (array)$attachment);\n\n            $post_obj = $this->get_queried_object();\n\n            if (in_array((string)$post_obj->ID, $attachment, true)) {\n                return true;\n            } elseif (in_array($post_obj->title, $attachment, true)) {\n                return true;\n            } elseif (in_array($post_obj->post_name, $attachment, true)) {\n                return true;\n            }\n            return false;\n        }\n\n        /**\n         * Is the query for an existing author archive page?\n         *\n         * If the $author parameter is specified, this function will additionally\n         * check if the query is for one of the authors specified.\n         *\n         * @param int|string|int[]|string[] $author Optional. User ID, nickname, nicename, or array of such\n         *                                          to check against. Default empty.\n         * @return bool Whether the query is for an existing author archive page.\n         * @since 3.1.0\n         *\n         */\n        public function is_author($author = '')\n        {\n            if (!$this->is_author) {\n                return false;\n            }\n\n            if (empty($author)) {\n                return true;\n            }\n\n            $author_obj = $this->get_queried_object();\n\n            $author = array_map('strval', (array)$author);\n\n            if (in_array((string)$author_obj->ID, $author, true)) {\n                return true;\n            } elseif (in_array($author_obj->nickname, $author, true)) {\n                return true;\n            } elseif (in_array($author_obj->user_nicename, $author, true)) {\n                return true;\n            }\n\n            return false;\n        }\n\n        /**\n         * Is the query for an existing category archive page?\n         *\n         * If the $category parameter is specified, this function will additionally\n         * check if the query is for one of the categories specified.\n         *\n         * @param int|string|int[]|string[] $category Optional. Category ID, name, slug, or array of such\n         *                                            to check against. Default empty.\n         * @return bool Whether the query is for an existing category archive page.\n         * @since 3.1.0\n         *\n         */\n        public function is_category($category = '')\n        {\n            if (!$this->is_category) {\n                return false;\n            }\n\n            if (empty($category)) {\n                return true;\n            }\n\n            $cat_obj = $this->get_queried_object();\n\n            $category = array_map('strval', (array)$category);\n\n            if (in_array((string)$cat_obj->term_id, $category, true)) {\n                return true;\n            } elseif (in_array($cat_obj->name, $category, true)) {\n                return true;\n            } elseif (in_array($cat_obj->slug, $category, true)) {\n                return true;\n            }\n\n            return false;\n        }\n\n        /**\n         * Is the query for an existing tag archive page?\n         *\n         * If the $tag parameter is specified, this function will additionally\n         * check if the query is for one of the tags specified.\n         *\n         * @param int|string|int[]|string[] $tag Optional. Tag ID, name, slug, or array of such\n         *                                       to check against. Default empty.\n         * @return bool Whether the query is for an existing tag archive page.\n         * @since 3.1.0\n         *\n         */\n        public function is_tag($tag = '')\n        {\n            if (!$this->is_tag) {\n                return false;\n            }\n\n            if (empty($tag)) {\n                return true;\n            }\n\n            $tag_obj = $this->get_queried_object();\n\n            $tag = array_map('strval', (array)$tag);\n\n            if (in_array((string)$tag_obj->term_id, $tag, true)) {\n                return true;\n            } elseif (in_array($tag_obj->name, $tag, true)) {\n                return true;\n            } elseif (in_array($tag_obj->slug, $tag, true)) {\n                return true;\n            }\n\n            return false;\n        }\n\n        /**\n         * Is the query for an existing custom taxonomy archive page?\n         *\n         * If the $taxonomy parameter is specified, this function will additionally\n         * check if the query is for that specific $taxonomy.\n         *\n         * If the $term parameter is specified in addition to the $taxonomy parameter,\n         * this function will additionally check if the query is for one of the terms\n         * specified.\n         *\n         * @param string|string[] $taxonomy Optional. Taxonomy slug or slugs to check against.\n         *                                            Default empty.\n         * @param int|string|int[]|string[] $term Optional. Term ID, name, slug, or array of such\n         *                                            to check against. Default empty.\n         * @return bool Whether the query is for an existing custom taxonomy archive page.\n         *              True for custom taxonomy archive pages, false for built-in taxonomies\n         *              (category and tag archives).\n         * @global WP_Taxonomy[] $wp_taxonomies Registered taxonomies.\n         *\n         * @since 3.1.0\n         *\n         */\n        public function is_tax($taxonomy = '', $term = '')\n        {\n            global $wp_taxonomies;\n\n            if (!$this->is_tax) {\n                return false;\n            }\n\n            if (empty($taxonomy)) {\n                return true;\n            }\n\n            $queried_object = $this->get_queried_object();\n            $tax_array = array_intersect(array_keys($wp_taxonomies), (array)$taxonomy);\n            $term_array = (array)$term;\n\n            // Check that the taxonomy matches.\n            if (!(isset($queried_object->taxonomy) && count($tax_array) && in_array($queried_object->taxonomy, $tax_array, true))) {\n                return false;\n            }\n\n            // Only a taxonomy provided.\n            if (empty($term)) {\n                return true;\n            }\n\n            return isset($queried_object->term_id) &&\n                count(\n                    array_intersect(\n                        array($queried_object->term_id, $queried_object->name, $queried_object->slug),\n                        $term_array\n                    )\n                );\n        }\n\n        /**\n         * Whether the current URL is within the comments popup window.\n         *\n         * @return false Always returns false.\n         * @deprecated 4.5.0\n         *\n         * @since 3.1.0\n         */\n        public function is_comments_popup()\n        {\n            _deprecated_function(__FUNCTION__, '4.5.0');\n\n            return false;\n        }\n\n        /**\n         * Is the query for an existing date archive?\n         *\n         * @return bool Whether the query is for an existing date archive.\n         * @since 3.1.0\n         *\n         */\n        public function is_date()\n        {\n            return (bool)$this->is_date;\n        }\n\n        /**\n         * Is the query for an existing day archive?\n         *\n         * @return bool Whether the query is for an existing day archive.\n         * @since 3.1.0\n         *\n         */\n        public function is_day()\n        {\n            return (bool)$this->is_day;\n        }\n\n        /**\n         * Is the query for a feed?\n         *\n         * @param string|string[] $feeds Optional. Feed type or array of feed types\n         *                                         to check against. Default empty.\n         * @return bool Whether the query is for a feed.\n         * @since 3.1.0\n         *\n         */\n        public function is_feed($feeds = '')\n        {\n            if (empty($feeds) || !$this->is_feed) {\n                return (bool)$this->is_feed;\n            }\n\n            $qv = $this->get('feed');\n            if ('feed' === $qv) {\n                $qv = get_default_feed();\n            }\n\n            return in_array($qv, (array)$feeds, true);\n        }\n\n        /**\n         * Is the query for a comments feed?\n         *\n         * @return bool Whether the query is for a comments feed.\n         * @since 3.1.0\n         *\n         */\n        public function is_comment_feed()\n        {\n            return (bool)$this->is_comment_feed;\n        }\n\n        /**\n         * Is the query for the front page of the site?\n         *\n         * This is for what is displayed at your site's main URL.\n         *\n         * Depends on the site's \"Front page displays\" Reading Settings 'show_on_front' and 'page_on_front'.\n         *\n         * If you set a static page for the front page of your site, this function will return\n         * true when viewing that page.\n         *\n         * Otherwise the same as @return bool Whether the query is for the front page of the site.\n         * @since 3.1.0\n         *\n         * @see WP_Query::is_home()\n         *\n         */\n        public function is_front_page()\n        {\n            // Most likely case.\n            if ('posts' === get_option('show_on_front') && $this->is_home()) {\n                return true;\n            } elseif ('page' === get_option('show_on_front') && get_option('page_on_front')\n                && $this->is_page(get_option('page_on_front'))\n            ) {\n                return true;\n            } else {\n                return false;\n            }\n        }\n\n        /**\n         * Is the query for the blog homepage?\n         *\n         * This is the page which shows the time based blog content of your site.\n         *\n         * Depends on the site's \"Front page displays\" Reading Settings 'show_on_front' and 'page_for_posts'.\n         *\n         * If you set a static page for the front page of your site, this function will return\n         * true only on the page you set as the \"Posts page\".\n         *\n         * @return bool Whether the query is for the blog homepage.\n         * @see WP_Query::is_front_page()\n         *\n         * @since 3.1.0\n         *\n         */\n        public function is_home()\n        {\n            return (bool)$this->is_home;\n        }\n\n        /**\n         * Is the query for the Privacy Policy page?\n         *\n         * This is the page which shows the Privacy Policy content of your site.\n         *\n         * Depends on the site's \"Change your Privacy Policy page\" Privacy Settings 'wp_page_for_privacy_policy'.\n         *\n         * This function will return true only on the page you set as the \"Privacy Policy page\".\n         *\n         * @return bool Whether the query is for the Privacy Policy page.\n         * @since 5.2.0\n         *\n         */\n        public function is_privacy_policy()\n        {\n            if (get_option('wp_page_for_privacy_policy')\n                && $this->is_page(get_option('wp_page_for_privacy_policy'))\n            ) {\n                return true;\n            } else {\n                return false;\n            }\n        }\n\n        /**\n         * Is the query for an existing month archive?\n         *\n         * @return bool Whether the query is for an existing month archive.\n         * @since 3.1.0\n         *\n         */\n        public function is_month()\n        {\n            return (bool)$this->is_month;\n        }\n\n        /**\n         * Is the query for an existing single page?\n         *\n         * If the $page parameter is specified, this function will additionally\n         * check if the query is for one of the pages specified.\n         *\n         * @param int|string|int[]|string[] $page Optional. Page ID, title, slug, path, or array of such\n         *                                        to check against. Default empty.\n         * @return bool Whether the query is for an existing single page.\n         * @see WP_Query::is_singular()\n         *\n         * @since 3.1.0\n         *\n         * @see WP_Query::is_single()\n         */\n        public function is_page($page = '')\n        {\n            if (!$this->is_page) {\n                return false;\n            }\n\n            if (empty($page)) {\n                return true;\n            }\n\n            $page_obj = $this->get_queried_object();\n\n            $page = array_map('strval', (array)$page);\n\n            if (in_array((string)$page_obj->ID, $page, true)) {\n                return true;\n            } elseif (in_array($page_obj->title, $page, true)) {\n                return true;\n            } elseif (in_array($page_obj->post_name, $page, true)) {\n                return true;\n            } else {\n                foreach ($page as $pagepath) {\n                    if (!strpos($pagepath, '/')) {\n                        continue;\n                    }\n                    $pagepath_obj = get_page_by_path($pagepath);\n\n                    if ($pagepath_obj && ($pagepath_obj->ID == $page_obj->ID)) {\n                        return true;\n                    }\n                }\n            }\n\n            return false;\n        }\n\n        /**\n         * Is the query for a paged result and not for the first page?\n         *\n         * @return bool Whether the query is for a paged result.\n         * @since 3.1.0\n         *\n         */\n        public function is_paged()\n        {\n            return (bool)$this->is_paged;\n        }\n\n        /**\n         * Is the query for a post or page preview?\n         *\n         * @return bool Whether the query is for a post or page preview.\n         * @since 3.1.0\n         *\n         */\n        public function is_preview()\n        {\n            return (bool)$this->is_preview;\n        }\n\n        /**\n         * Is the query for the robots.txt file?\n         *\n         * @return bool Whether the query is for the robots.txt file.\n         * @since 3.1.0\n         *\n         */\n        public function is_robots()\n        {\n            return (bool)$this->is_robots;\n        }\n\n        /**\n         * Is the query for the favicon.ico file?\n         *\n         * @return bool Whether the query is for the favicon.ico file.\n         * @since 5.4.0\n         *\n         */\n        public function is_favicon()\n        {\n            return (bool)$this->is_favicon;\n        }\n\n        /**\n         * Is the query for a search?\n         *\n         * @return bool Whether the query is for a search.\n         * @since 3.1.0\n         *\n         */\n        public function is_search()\n        {\n            return (bool)$this->is_search;\n        }\n\n        /**\n         * Is the query for an existing single post?\n         *\n         * Works for any post type excluding pages.\n         *\n         * If the $post parameter is specified, this function will additionally\n         * check if the query is for one of the Posts specified.\n         *\n         * @param int|string|int[]|string[] $post Optional. Post ID, title, slug, path, or array of such\n         *                                        to check against. Default empty.\n         * @return bool Whether the query is for an existing single post.\n         * @see WP_Query::is_singular()\n         *\n         * @since 3.1.0\n         *\n         * @see WP_Query::is_page()\n         */\n        public function is_single($post = '')\n        {\n            if (!$this->is_single) {\n                return false;\n            }\n\n            if (empty($post)) {\n                return true;\n            }\n\n            $post_obj = $this->get_queried_object();\n\n            $post = array_map('strval', (array)$post);\n\n            if (in_array((string)$post_obj->ID, $post, true)) {\n                return true;\n            } elseif (in_array($post_obj->title, $post, true)) {\n                return true;\n            } elseif (in_array($post_obj->post_name, $post, true)) {\n                return true;\n            } else {\n                foreach ($post as $postpath) {\n                    if (!strpos($postpath, '/')) {\n                        continue;\n                    }\n                    $postpath_obj = get_page_by_path($postpath, OBJECT, $post_obj->post_type);\n\n                    if ($postpath_obj && ($postpath_obj->ID == $post_obj->ID)) {\n                        return true;\n                    }\n                }\n            }\n            return false;\n        }\n\n        /**\n         * Is the query for an existing single post of any post type (post, attachment, page,\n         * custom post types)?\n         *\n         * If the $post_types parameter is specified, this function will additionally\n         * check if the query is for one of the Posts Types specified.\n         *\n         * @param string|string[] $post_types Optional. Post type or array of post types\n         *                                    to check against. Default empty.\n         * @return bool Whether the query is for an existing single post\n         *              or any of the given post types.\n         * @see WP_Query::is_single()\n         *\n         * @since 3.1.0\n         *\n         * @see WP_Query::is_page()\n         */\n        public function is_singular($post_types = '')\n        {\n            if (empty($post_types) || !$this->is_singular) {\n                return (bool)$this->is_singular;\n            }\n\n            $post_obj = $this->get_queried_object();\n\n            return in_array($post_obj->post_type, (array)$post_types, true);\n        }\n\n        /**\n         * Is the query for a specific time?\n         *\n         * @return bool Whether the query is for a specific time.\n         * @since 3.1.0\n         *\n         */\n        public function is_time()\n        {\n            return (bool)$this->is_time;\n        }\n\n        /**\n         * Is the query for a trackback endpoint call?\n         *\n         * @return bool Whether the query is for a trackback endpoint call.\n         * @since 3.1.0\n         *\n         */\n        public function is_trackback()\n        {\n            return (bool)$this->is_trackback;\n        }\n\n        /**\n         * Is the query for an existing year archive?\n         *\n         * @return bool Whether the query is for an existing year archive.\n         * @since 3.1.0\n         *\n         */\n        public function is_year()\n        {\n            return (bool)$this->is_year;\n        }\n\n        /**\n         * Is the query a 404 (returns no results)?\n         *\n         * @return bool Whether the query is a 404 error.\n         * @since 3.1.0\n         *\n         */\n        public function is_404()\n        {\n            return (bool)$this->is_404;\n        }\n\n        /**\n         * Is the query for an embedded post?\n         *\n         * @return bool Whether the query is for an embedded post.\n         * @since 4.4.0\n         *\n         */\n        public function is_embed()\n        {\n            return (bool)$this->is_embed;\n        }\n\n        /**\n         * Is the query the main query?\n         *\n         * @return bool Whether the query is the main query.\n         * @global WP_Query $wp_query WordPress Query object.\n         *\n         * @since 3.3.0\n         *\n         */\n        public function is_main_query()\n        {\n            global $wp_the_query;\n            return $wp_the_query === $this;\n        }\n\n        /**\n         * Set up global post data.\n         *\n         * @param WP_Post|object|int $post WP_Post instance or Post ID/object.\n         * @return true True when finished.\n         * @since 4.1.0\n         * @since 4.4.0 Added the ability to pass a post ID to `$post`.\n         *\n         * @global int $id\n         * @global WP_User $authordata\n         * @global string $currentday\n         * @global string $currentmonth\n         * @global int $page\n         * @global array $pages\n         * @global int $multipage\n         * @global int $more\n         * @global int $numpages\n         *\n         */\n        public function setup_postdata($post)\n        {\n            global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages;\n\n            if (!($post instanceof WP_Post)) {\n                $post = get_post($post);\n            }\n\n            if (!$post) {\n                return;\n            }\n\n            $elements = $this->generate_postdata($post);\n            if (false === $elements) {\n                return;\n            }\n\n            $id = $elements['id'];\n            $authordata = $elements['authordata'];\n            $currentday = $elements['currentday'];\n            $currentmonth = $elements['currentmonth'];\n            $page = $elements['page'];\n            $pages = $elements['pages'];\n            $multipage = $elements['multipage'];\n            $more = $elements['more'];\n            $numpages = $elements['numpages'];\n\n            /**\n             * Fires once the post data has been set up.\n             *\n             * @param WP_Post $post The Post object (passed by reference).\n             * @param WP_Query $query The current Query object (passed by reference).\n             * @since 2.8.0\n             * @since 4.1.0 Introduced `$query` parameter.\n             *\n             */\n            do_action_ref_array('the_post', array(&$post, &$this));\n\n            return true;\n        }\n\n        /**\n         * Generate post data.\n         *\n         * @param WP_Post|object|int $post WP_Post instance or Post ID/object.\n         * @return array|false Elements of post or false on failure.\n         * @since 5.2.0\n         *\n         */\n        public function generate_postdata($post)\n        {\n\n            if (!($post instanceof WP_Post)) {\n                $post = get_post($post);\n            }\n\n            if (!$post) {\n                return false;\n            }\n\n            $id = (int)$post->ID;\n\n            $authordata = get_userdata($post->post_author);\n\n            $currentday = mysql2date('d.m.y', $post->post_date, false);\n            $currentmonth = mysql2date('m', $post->post_date, false);\n            $numpages = 1;\n            $multipage = 0;\n            $page = $this->get('page');\n            if (!$page) {\n                $page = 1;\n            }\n\n            /*\n\t\t * Force full post content when viewing the permalink for the $post,\n\t\t * or when on an RSS feed. Otherwise respect the 'more' tag.\n\t\t */\n            if (get_queried_object_id() === $post->ID && ($this->is_page() || $this->is_single())) {\n                $more = 1;\n            } elseif ($this->is_feed()) {\n                $more = 1;\n            } else {\n                $more = 0;\n            }\n\n            $content = $post->text;\n            if (false !== strpos($content, '<!--nextpage-->')) {\n                $content = str_replace(\"\\n<!--nextpage-->\\n\", '<!--nextpage-->', $content);\n                $content = str_replace(\"\\n<!--nextpage-->\", '<!--nextpage-->', $content);\n                $content = str_replace(\"<!--nextpage-->\\n\", '<!--nextpage-->', $content);\n\n                // Remove the nextpage block delimiters, to avoid invalid block structures in the split content.\n                $content = str_replace('<!-- wp:nextpage -->', '', $content);\n                $content = str_replace('<!-- /wp:nextpage -->', '', $content);\n\n                // Ignore nextpage at the beginning of the content.\n                if (0 === strpos($content, '<!--nextpage-->')) {\n                    $content = substr($content, 15);\n                }\n\n                $pages = explode('<!--nextpage-->', $content);\n            } else {\n                $pages = array($post->text);\n            }\n\n            /**\n             * Filters the \"pages\" derived from splitting the post content.\n             *\n             * \"Pages\" are determined by splitting the post content based on the presence\n             * of `<!-- nextpage -->` tags.\n             *\n             * @param string[] $pages Array of \"pages\" from the post content split by `<!-- nextpage -->` tags.\n             * @param WP_Post $post Current post object.\n             * @since 4.4.0\n             *\n             */\n            $pages = apply_filters('content_pagination', $pages, $post);\n\n            $numpages = count($pages);\n\n            if ($numpages > 1) {\n                if ($page > 1) {\n                    $more = 1;\n                }\n                $multipage = 1;\n            } else {\n                $multipage = 0;\n            }\n\n            $elements = compact('id', 'authordata', 'currentday', 'currentmonth', 'page', 'pages', 'multipage', 'more', 'numpages');\n\n            return $elements;\n        }\n\n        /**\n         * After looping through a nested query, this function\n         * restores the $post global to the current post in this query.\n         *\n         * @since 3.7.0\n         *\n         * @global WP_Post $post Global post object.\n         */\n        public function reset_postdata()\n        {\n            if (!empty($this->post)) {\n                $GLOBALS['post'] = $this->post;\n                $this->setup_postdata($this->post);\n            }\n        }\n\n        /**\n         * Lazyload term meta for posts in the loop.\n         *\n         * @param mixed $check\n         * @param int $term_id\n         * @return mixed\n         * @deprecated 4.5.0 See wp_queue_posts_for_term_meta_lazyload().\n         *\n         * @since 4.4.0\n         */\n        public function lazyload_term_meta($check, $term_id)\n        {\n            return $check;\n        }\n\n        /**\n         * Lazyload comment meta for comments in the loop.\n         *\n         * @param mixed $check\n         * @param int $comment_id\n         * @return mixed\n         * @deprecated 4.5.0 See wp_queue_comments_for_comment_meta_lazyload().\n         *\n         * @since 4.4.0\n         */\n        public function lazyload_comment_meta($check, $comment_id)\n        {\n            return $check;\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/index.php",
    "content": "<?php\n"
  },
  {
    "path": "配套插件/BsCore/languages/zh_CN.po",
    "content": "# Copyright (C) 2021 Codestar\n# This file is distributed under the same license as the Codestar Framework package.\nmsgid \"\"\nmsgstr \"\"\n\"POT-Creation-Date: 2021-06-25 12:32:35+00:00\\n\"\n\"PO-Revision-Date: 2021-08-19 12:18+0800\\n\"\n\"Last-Translator: Seaton Jiang <seatonjiang@vtrois.com>\\n\"\n\"Language-Team: \\n\"\n\"Language: zh_CN\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 2.4.3\\n\"\n\"Project-Id-Version: \\n\"\n\n#: classes/admin-options.class.php:226\nmsgid \"Error while saving the changes.\"\nmsgstr \"保存失败\"\n\n#: classes/admin-options.class.php:286\nmsgid \"Settings successfully imported.\"\nmsgstr \"导入成功\"\n\n#: classes/admin-options.class.php:298 classes/admin-options.class.php:314\nmsgid \"Default settings restored.\"\nmsgstr \"恢复完成\"\n\n#: classes/admin-options.class.php:385\nmsgid \"Settings saved.\"\nmsgstr \"保存成功\"\n\n#: classes/admin-options.class.php:565\nmsgid \"You have unsaved changes, save your changes!\"\nmsgstr \"配置发生改变，请勿忘记保存！\"\n\n#: classes/admin-options.class.php:567\nmsgid \"show all settings\"\nmsgstr \"显示所有设置\"\n\n#: classes/admin-options.class.php:569 fields/icon/icon.php:57\n#: fields/map/map.php:23\nmsgid \"Search...\"\nmsgstr \"请输入关键词\"\n\n#: classes/admin-options.class.php:572 classes/admin-options.class.php:695\nmsgid \"Save\"\nmsgstr \"保存配置\"\n\n#: classes/admin-options.class.php:572 classes/admin-options.class.php:695\nmsgid \"Saving...\"\nmsgstr \"正在保存\"\n\n#: classes/admin-options.class.php:573 classes/admin-options.class.php:696\nmsgid \"Reset Section\"\nmsgstr \"恢复此页\"\n\n#: classes/admin-options.class.php:573 classes/admin-options.class.php:696\nmsgid \"Are you sure to reset this section options?\"\nmsgstr \"单击「确定」进行恢复，当前页面的配置将会丢失！\"\n\n#: classes/admin-options.class.php:574 classes/admin-options.class.php:697\nmsgid \"Reset All\"\nmsgstr \"恢复全部\"\n\n#: classes/admin-options.class.php:574 classes/admin-options.class.php:697\n#: classes/comment-options.class.php:216 classes/metabox-options.class.php:294\n#: fields/backup/backup.php:31\nmsgid \"Reset\"\nmsgstr \"恢复默认\"\n\n#: classes/admin-options.class.php:574 classes/admin-options.class.php:697\nmsgid \"Are you sure you want to reset all settings to default values?\"\nmsgstr \"单击「确定」进行恢复，所有页面的配置都将丢失！\"\n\n#: classes/admin-options.class.php:672 classes/comment-options.class.php:199\n#: classes/metabox-options.class.php:277 fields/button_set/button_set.php:56\n#: fields/checkbox/checkbox.php:76 fields/radio/radio.php:75\n#: fields/select/select.php:113 functions/actions.php:41\nmsgid \"No data available.\"\nmsgstr \"没有可用数据\"\n\n#: classes/comment-options.class.php:217 classes/metabox-options.class.php:295\nmsgid \"update post\"\nmsgstr \"更新文章\"\n\n#: classes/comment-options.class.php:217 classes/metabox-options.class.php:295\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: classes/setup.class.php:592\nmsgid \"Are you sure?\"\nmsgstr \"单击「确定」进行下一步操作，该操作可能会丢失部分配置！\"\n\n#: classes/setup.class.php:593\nmsgid \"Please enter %s or more characters\"\nmsgstr \"请输入 %s 或更多字符\"\n\n#: classes/setup.class.php:594\nmsgid \"Searching...\"\nmsgstr \"搜索中...\"\n\n#: classes/setup.class.php:595\nmsgid \"No results found.\"\nmsgstr \"未找到结果。\"\n\n#: classes/setup.class.php:696\nmsgid \"Oops! Not allowed.\"\nmsgstr \"哎呀！不允许。\"\n\n#: classes/setup.class.php:768 classes/setup.class.php:772\nmsgid \"Field not found!\"\nmsgstr \"没有找到任何数据\"\n\n#: classes/shortcode-options.class.php:253 fields/group/group.php:23\nmsgid \"Add New\"\nmsgstr \"新增\"\n\n#: classes/shortcode-options.class.php:290 functions/actions.php:16\n#: functions/actions.php:68 functions/actions.php:106 functions/actions.php:141\n#: functions/actions.php:170\nmsgid \"Error: Invalid nonce verification.\"\nmsgstr \"错误: 无效的nonce验证。\"\n\n#: fields/background/background.php:36 fields/media/media.php:59\nmsgid \"Not selected\"\nmsgstr \"未选择\"\n\n#: fields/background/background.php:72 fields/date/date.php:31\nmsgid \"From\"\nmsgstr \"从\"\n\n#: fields/background/background.php:90 fields/date/date.php:32\nmsgid \"To\"\nmsgstr \"到\"\n\n#: fields/background/background.php:108\nmsgid \"Direction\"\nmsgstr \"方向\"\n\n#: fields/background/background.php:114\nmsgid \"Gradient Direction\"\nmsgstr \"渐变方向\"\n\n#: fields/background/background.php:115\nmsgid \"&#8659; top to bottom\"\nmsgstr \"&#8659; 从上到下\"\n\n#: fields/background/background.php:116\nmsgid \"&#8658; left to right\"\nmsgstr \"&#8658;从左到右\"\n\n#: fields/background/background.php:117\nmsgid \"&#8664; corner top to right\"\nmsgstr \"&#8664; 右上角\"\n\n#: fields/background/background.php:118\nmsgid \"&#8665; corner top to left\"\nmsgstr \"&#8664; 左上角\"\n\n#: fields/background/background.php:161\nmsgid \"Background Position\"\nmsgstr \"背景位置\"\n\n#: fields/background/background.php:162\nmsgid \"Left Top\"\nmsgstr \"左上\"\n\n#: fields/background/background.php:163\nmsgid \"Left Center\"\nmsgstr \"左中\"\n\n#: fields/background/background.php:164\nmsgid \"Left Bottom\"\nmsgstr \"左下\"\n\n#: fields/background/background.php:165\nmsgid \"Center Top\"\nmsgstr \"中上\"\n\n#: fields/background/background.php:166\nmsgid \"Center Center\"\nmsgstr \"居中\"\n\n#: fields/background/background.php:167\nmsgid \"Center Bottom\"\nmsgstr \"中下\"\n\n#: fields/background/background.php:168\nmsgid \"Right Top\"\nmsgstr \"右上\"\n\n#: fields/background/background.php:169\nmsgid \"Right Center\"\nmsgstr \"右中\"\n\n#: fields/background/background.php:170\nmsgid \"Right Bottom\"\nmsgstr \"右下\"\n\n#: fields/background/background.php:184\nmsgid \"Background Repeat\"\nmsgstr \"背景重复\"\n\n#: fields/background/background.php:185\nmsgid \"Repeat\"\nmsgstr \"重复\"\n\n#: fields/background/background.php:186\nmsgid \"No Repeat\"\nmsgstr \"不重复\"\n\n#: fields/background/background.php:187\nmsgid \"Repeat Horizontally\"\nmsgstr \"水平重复\"\n\n#: fields/background/background.php:188\nmsgid \"Repeat Vertically\"\nmsgstr \"垂直重复\"\n\n#: fields/background/background.php:202\nmsgid \"Background Attachment\"\nmsgstr \"背景附件\"\n\n#: fields/background/background.php:203\nmsgid \"Scroll\"\nmsgstr \"滚动\"\n\n#: fields/background/background.php:204\nmsgid \"Fixed\"\nmsgstr \"固定\"\n\n#: fields/background/background.php:218\nmsgid \"Background Size\"\nmsgstr \"背景大小\"\n\n#: fields/background/background.php:219\nmsgid \"Cover\"\nmsgstr \"覆盖\"\n\n#: fields/background/background.php:220\nmsgid \"Contain\"\nmsgstr \"包含\"\n\n#: fields/background/background.php:221\nmsgid \"Auto\"\nmsgstr \"自动\"\n\n#: fields/background/background.php:235\nmsgid \"Background Origin\"\nmsgstr \"背景起源\"\n\n#: fields/background/background.php:236 fields/background/background.php:254\nmsgid \"Padding Box\"\nmsgstr \"框内边距\"\n\n#: fields/background/background.php:237 fields/background/background.php:253\nmsgid \"Border Box\"\nmsgstr \"边框\"\n\n#: fields/background/background.php:238 fields/background/background.php:255\nmsgid \"Content Box\"\nmsgstr \"内容框\"\n\n#: fields/background/background.php:252\nmsgid \"Background Clip\"\nmsgstr \"背景剪辑\"\n\n#: fields/background/background.php:269\nmsgid \"Background Blend Mode\"\nmsgstr \"背景混合模式\"\n\n#: fields/background/background.php:270 fields/link_color/link_color.php:36\n#: fields/typography/typography.php:186\nmsgid \"Normal\"\nmsgstr \"正常\"\n\n#: fields/background/background.php:271\nmsgid \"Multiply\"\nmsgstr \"乘\"\n\n#: fields/background/background.php:272\nmsgid \"Screen\"\nmsgstr \"屏幕\"\n\n#: fields/background/background.php:273\nmsgid \"Overlay\"\nmsgstr \"覆盖\"\n\n#: fields/background/background.php:274\nmsgid \"Darken\"\nmsgstr \"变黑\"\n\n#: fields/background/background.php:275\nmsgid \"Lighten\"\nmsgstr \"减轻\"\n\n#: fields/background/background.php:276\nmsgid \"Color Dodge\"\nmsgstr \"颜色减淡\"\n\n#: fields/background/background.php:277\nmsgid \"Saturation\"\nmsgstr \"饱和度\"\n\n#: fields/background/background.php:278\nmsgid \"Color\"\nmsgstr \"颜色\"\n\n#: fields/background/background.php:279\nmsgid \"Luminosity\"\nmsgstr \"光度\"\n\n#: fields/backup/backup.php:26\nmsgid \"Import\"\nmsgstr \"导入\"\n\n#: fields/backup/backup.php:29\nmsgid \"Export & Download\"\nmsgstr \"导出和下载\"\n\n#: fields/border/border.php:25 fields/spacing/spacing.php:25\nmsgid \"top\"\nmsgstr \"顶部\"\n\n#: fields/border/border.php:26 fields/spacing/spacing.php:26\nmsgid \"right\"\nmsgstr \"右\"\n\n#: fields/border/border.php:27 fields/spacing/spacing.php:27\nmsgid \"bottom\"\nmsgstr \"底部\"\n\n#: fields/border/border.php:28 fields/spacing/spacing.php:28\nmsgid \"left\"\nmsgstr \"左\"\n\n#: fields/border/border.php:29 fields/spacing/spacing.php:29\nmsgid \"all\"\nmsgstr \"所有\"\n\n#: fields/border/border.php:51 fields/typography/typography.php:214\nmsgid \"Solid\"\nmsgstr \"实线\"\n\n#: fields/border/border.php:52 fields/typography/typography.php:217\nmsgid \"Dashed\"\nmsgstr \"虚线\"\n\n#: fields/border/border.php:53 fields/typography/typography.php:216\nmsgid \"Dotted\"\nmsgstr \"点线\"\n\n#: fields/border/border.php:54 fields/typography/typography.php:215\nmsgid \"Double\"\nmsgstr \"双线\"\n\n#: fields/border/border.php:55\nmsgid \"Inset\"\nmsgstr \"插入\"\n\n#: fields/border/border.php:56\nmsgid \"Outset\"\nmsgstr \"开始\"\n\n#: fields/border/border.php:57\nmsgid \"Groove\"\nmsgstr \"凹槽\"\n\n#: fields/border/border.php:58\nmsgid \"ridge\"\nmsgstr \"凸出\"\n\n#: fields/border/border.php:59 fields/typography/typography.php:199\n#: fields/typography/typography.php:213\nmsgid \"None\"\nmsgstr \"无\"\n\n#: fields/dimensions/dimensions.php:22\nmsgid \"width\"\nmsgstr \"宽度\"\n\n#: fields/dimensions/dimensions.php:23\nmsgid \"height\"\nmsgstr \"高度\"\n\n#: fields/gallery/gallery.php:20\nmsgid \"Add Gallery\"\nmsgstr \"添加图库\"\n\n#: fields/gallery/gallery.php:21\nmsgid \"Edit Gallery\"\nmsgstr \"编辑图库\"\n\n#: fields/gallery/gallery.php:22\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: fields/group/group.php:35 fields/repeater/repeater.php:27\nmsgid \"Error: Field ID conflict.\"\nmsgstr \"错误：字段ID冲突。\"\n\n#: fields/group/group.php:46 fields/group/group.php:87\n#: fields/repeater/repeater.php:48 fields/repeater/repeater.php:76\nmsgid \"Are you sure to delete this item?\"\nmsgstr \"确定要删除这个项目吗？\"\n\n#: fields/group/group.php:121 fields/repeater/repeater.php:89\nmsgid \"You cannot add more.\"\nmsgstr \"无法添加更多\"\n\n#: fields/group/group.php:122 fields/repeater/repeater.php:90\nmsgid \"You cannot remove more.\"\nmsgstr \"无法删除更多\"\n\n#: fields/icon/icon.php:20 fields/icon/icon.php:53\nmsgid \"Add Icon\"\nmsgstr \"添加图标\"\n\n#: fields/icon/icon.php:21\nmsgid \"Remove Icon\"\nmsgstr \"删除图标\"\n\n#: fields/link/link.php:20\nmsgid \"Add Link\"\nmsgstr \"添加链接\"\n\n#: fields/link/link.php:21\nmsgid \"Edit Link\"\nmsgstr \"编辑链接\"\n\n#: fields/link/link.php:22\nmsgid \"Remove Link\"\nmsgstr \"移除链接\"\n\n#: fields/link_color/link_color.php:37\nmsgid \"Hover\"\nmsgstr \"悬停\"\n\n#: fields/link_color/link_color.php:38\nmsgid \"Active\"\nmsgstr \"启用\"\n\n#: fields/link_color/link_color.php:39\nmsgid \"Visited\"\nmsgstr \"访问\"\n\n#: fields/link_color/link_color.php:40\nmsgid \"Focus\"\nmsgstr \"焦点\"\n\n#: fields/map/map.php:24\nmsgid \"Latitude\"\nmsgstr \"纬度\"\n\n#: fields/map/map.php:25\nmsgid \"Longitude\"\nmsgstr \"经度\"\n\n#: fields/media/media.php:25 fields/upload/upload.php:25\nmsgid \"Upload\"\nmsgstr \"上传\"\n\n#: fields/media/media.php:26 fields/upload/upload.php:26\nmsgid \"Remove\"\nmsgstr \"删除\"\n\n#: fields/sorter/sorter.php:21\nmsgid \"Enabled\"\nmsgstr \"启用\"\n\n#: fields/sorter/sorter.php:22\nmsgid \"Disabled\"\nmsgstr \"禁用\"\n\n#: fields/switcher/switcher.php:20\nmsgid \"On\"\nmsgstr \"启用\"\n\n#: fields/switcher/switcher.php:21\nmsgid \"Off\"\nmsgstr \"禁用\"\n\n#: fields/typography/typography.php:96\nmsgid \"Font Family\"\nmsgstr \"字体\"\n\n#: fields/typography/typography.php:97\nmsgid \"Select a font\"\nmsgstr \"选择字体\"\n\n#: fields/typography/typography.php:105\nmsgid \"Backup Font Family\"\nmsgstr \"备份字体系列\"\n\n#: fields/typography/typography.php:119 fields/typography/typography.php:132\n#: fields/typography/typography.php:145 fields/typography/typography.php:160\n#: fields/typography/typography.php:176 fields/typography/typography.php:189\n#: fields/typography/typography.php:203 fields/typography/typography.php:221\nmsgid \"Default\"\nmsgstr \"默认\"\n\n#: fields/typography/typography.php:130\nmsgid \"Font Style\"\nmsgstr \"字体样式\"\n\n#: fields/typography/typography.php:144 fields/typography/typography.php:145\nmsgid \"Load Extra Styles\"\nmsgstr \"加载额外样式\"\n\n#: fields/typography/typography.php:158\nmsgid \"Subset\"\nmsgstr \"子集\"\n\n#: fields/typography/typography.php:168\nmsgid \"Text Align\"\nmsgstr \"文本对齐\"\n\n#: fields/typography/typography.php:170\nmsgid \"Inherit\"\nmsgstr \"继承\"\n\n#: fields/typography/typography.php:171\nmsgid \"Left\"\nmsgstr \"左侧\"\n\n#: fields/typography/typography.php:172\nmsgid \"Center\"\nmsgstr \"居中\"\n\n#: fields/typography/typography.php:173\nmsgid \"Right\"\nmsgstr \"右侧\"\n\n#: fields/typography/typography.php:174\nmsgid \"Justify\"\nmsgstr \"两端对齐\"\n\n#: fields/typography/typography.php:175\nmsgid \"Initial\"\nmsgstr \"初始\"\n\n#: fields/typography/typography.php:184\nmsgid \"Font Variant\"\nmsgstr \"字体变体\"\n\n#: fields/typography/typography.php:187\nmsgid \"Small Caps\"\nmsgstr \"小写\"\n\n#: fields/typography/typography.php:188\nmsgid \"All Small Caps\"\nmsgstr \"所有字母小写\"\n\n#: fields/typography/typography.php:197\nmsgid \"Text Transform\"\nmsgstr \"文本转换\"\n\n#: fields/typography/typography.php:200\nmsgid \"Capitalize\"\nmsgstr \"大写\"\n\n#: fields/typography/typography.php:201\nmsgid \"Uppercase\"\nmsgstr \"大写\"\n\n#: fields/typography/typography.php:202\nmsgid \"Lowercase\"\nmsgstr \"小写\"\n\n#: fields/typography/typography.php:211\nmsgid \"Text Decoration\"\nmsgstr \"文本装饰\"\n\n#: fields/typography/typography.php:218\nmsgid \"Wavy\"\nmsgstr \"波浪\"\n\n#: fields/typography/typography.php:219\nmsgid \"Overline\"\nmsgstr \"上划线\"\n\n#: fields/typography/typography.php:220\nmsgid \"Line-through\"\nmsgstr \"删除线\"\n\n#: fields/typography/typography.php:233\nmsgid \"Font Size\"\nmsgstr \"字体大小\"\n\n#: fields/typography/typography.php:245\nmsgid \"Line Height\"\nmsgstr \"线高度\"\n\n#: fields/typography/typography.php:257\nmsgid \"Letter Spacing\"\nmsgstr \"字母间距\"\n\n#: fields/typography/typography.php:269\nmsgid \"Word Spacing\"\nmsgstr \"字间距\"\n\n#: fields/typography/typography.php:284\nmsgid \"Font Color\"\nmsgstr \"字体颜色\"\n\n#: fields/typography/typography.php:295\nmsgid \"Custom Style\"\nmsgstr \"自定义样式\"\n\n#: fields/typography/typography.php:362\nmsgid \"Custom Web Fonts\"\nmsgstr \"自定义 Web 字体\"\n\n#: fields/typography/typography.php:368\nmsgid \"Safe Web Fonts\"\nmsgstr \"Web 安全字体\"\n\n#: fields/typography/typography.php:388\nmsgid \"Google Web Fonts\"\nmsgstr \"Google Web 字体\"\n\n#: functions/actions.php:72 functions/actions.php:110\nmsgid \"Error: Invalid key.\"\nmsgstr \"错误：无效密钥。\"\n\n#: functions/actions.php:114\nmsgid \"Error: The response is not a valid JSON response.\"\nmsgstr \"错误：响应不是有效的 JSON 响应。\"\n\n#: functions/actions.php:174\nmsgid \"Error: Invalid term ID.\"\nmsgstr \"错误：无效的项目ID。\"\n\n#: functions/actions.php:180\nmsgid \"Error: You do not have permission to do that.\"\nmsgstr \"错误：您无权这样做。\"\n\n#: functions/validate.php:14 functions/validate.php:86\nmsgid \"Please enter a valid email address.\"\nmsgstr \"请输入正确的电子邮件地址。\"\n\n#: functions/validate.php:32 functions/validate.php:106\nmsgid \"Please enter a valid number.\"\nmsgstr \"请输入有效的数字\"\n\n#: functions/validate.php:50 functions/validate.php:126\nmsgid \"This field is required.\"\nmsgstr \"这是必填栏。\"\n\n#: functions/validate.php:68 functions/validate.php:146\nmsgid \"Please enter a valid URL.\"\nmsgstr \"请输入有效网址\"\n\n#. Plugin Name of the plugin/theme\nmsgid \"Codestar Framework\"\nmsgstr \"Codestar Framework\"\n\n#. Plugin URI of the plugin/theme\nmsgid \"http://codestarframework.com/\"\nmsgstr \"http://codestarframework.com/\"\n\n#. Description of the plugin/theme\nmsgid \"A Simple and Lightweight WordPress Option Framework for Themes and Plugins\"\nmsgstr \"一个简单且轻量的 WordPress 主题和插件选项框架\"\n\n#. Author of the plugin/theme\nmsgid \"Codestar\"\nmsgstr \"Codestar\"\n\n#. Author URI of the plugin/theme\nmsgid \"http://codestarthemes.com/\"\nmsgstr \"http://codestarthemes.com/\"\n"
  },
  {
    "path": "配套插件/BsCore/lib/phpmailer/DSNConfigurator.php",
    "content": "<?php\n\n/**\n * PHPMailer - PHP email creation and transport class.\n * PHP Version 5.5.\n *\n * @see https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n *\n * @author    Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author    Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author    Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author    Brent R. Matzelle (original founder)\n * @copyright 2012 - 2023 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license   http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note      This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\nnamespace PHPMailer\\PHPMailer;\n\n/**\n * Configure PHPMailer with DSN string.\n *\n * @see https://en.wikipedia.org/wiki/Data_source_name\n *\n * @author Oleg Voronkovich <oleg-voronkovich@yandex.ru>\n */\nclass DSNConfigurator\n{\n    /**\n     * Create new PHPMailer instance configured by DSN.\n     *\n     * @param string $dsn        DSN\n     * @param bool   $exceptions Should we throw external exceptions?\n     *\n     * @return PHPMailer\n     */\n    public static function mailer($dsn, $exceptions = null)\n    {\n        static $configurator = null;\n\n        if (null === $configurator) {\n            $configurator = new DSNConfigurator();\n        }\n\n        return $configurator->configure(new PHPMailer($exceptions), $dsn);\n    }\n\n    /**\n     * Configure PHPMailer instance with DSN string.\n     *\n     * @param PHPMailer $mailer PHPMailer instance\n     * @param string    $dsn    DSN\n     *\n     * @return PHPMailer\n     */\n    public function configure(PHPMailer $mailer, $dsn)\n    {\n        $config = $this->parseDSN($dsn);\n\n        $this->applyConfig($mailer, $config);\n\n        return $mailer;\n    }\n\n    /**\n     * Parse DSN string.\n     *\n     * @param string $dsn DSN\n     *\n     * @throws Exception If DSN is malformed\n     *\n     * @return array Configuration\n     */\n    private function parseDSN($dsn)\n    {\n        $config = $this->parseUrl($dsn);\n\n        if (false === $config || !isset($config['scheme']) || !isset($config['host'])) {\n            throw new Exception(\n                sprintf('Malformed DSN: \"%s\".', $dsn)\n            );\n        }\n\n        if (isset($config['query'])) {\n            parse_str($config['query'], $config['query']);\n        }\n\n        return $config;\n    }\n\n    /**\n     * Apply configuration to mailer.\n     *\n     * @param PHPMailer $mailer PHPMailer instance\n     * @param array     $config Configuration\n     *\n     * @throws Exception If scheme is invalid\n     */\n    private function applyConfig(PHPMailer $mailer, $config)\n    {\n        switch ($config['scheme']) {\n            case 'mail':\n                $mailer->isMail();\n                break;\n            case 'sendmail':\n                $mailer->isSendmail();\n                break;\n            case 'qmail':\n                $mailer->isQmail();\n                break;\n            case 'smtp':\n            case 'smtps':\n                $mailer->isSMTP();\n                $this->configureSMTP($mailer, $config);\n                break;\n            default:\n                throw new Exception(\n                    sprintf(\n                        'Invalid scheme: \"%s\". Allowed values: \"mail\", \"sendmail\", \"qmail\", \"smtp\", \"smtps\".',\n                        $config['scheme']\n                    )\n                );\n        }\n\n        if (isset($config['query'])) {\n            $this->configureOptions($mailer, $config['query']);\n        }\n    }\n\n    /**\n     * Configure SMTP.\n     *\n     * @param PHPMailer $mailer PHPMailer instance\n     * @param array     $config Configuration\n     */\n    private function configureSMTP($mailer, $config)\n    {\n        $isSMTPS = 'smtps' === $config['scheme'];\n\n        if ($isSMTPS) {\n            $mailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;\n        }\n\n        $mailer->Host = $config['host'];\n\n        if (isset($config['port'])) {\n            $mailer->Port = $config['port'];\n        } elseif ($isSMTPS) {\n            $mailer->Port = SMTP::DEFAULT_SECURE_PORT;\n        }\n\n        $mailer->SMTPAuth = isset($config['user']) || isset($config['pass']);\n\n        if (isset($config['user'])) {\n            $mailer->Username = $config['user'];\n        }\n\n        if (isset($config['pass'])) {\n            $mailer->Password = $config['pass'];\n        }\n    }\n\n    /**\n     * Configure options.\n     *\n     * @param PHPMailer $mailer  PHPMailer instance\n     * @param array     $options Options\n     *\n     * @throws Exception If option is unknown\n     */\n    private function configureOptions(PHPMailer $mailer, $options)\n    {\n        $allowedOptions = get_object_vars($mailer);\n\n        unset($allowedOptions['Mailer']);\n        unset($allowedOptions['SMTPAuth']);\n        unset($allowedOptions['Username']);\n        unset($allowedOptions['Password']);\n        unset($allowedOptions['Hostname']);\n        unset($allowedOptions['Port']);\n        unset($allowedOptions['ErrorInfo']);\n\n        $allowedOptions = \\array_keys($allowedOptions);\n\n        foreach ($options as $key => $value) {\n            if (!in_array($key, $allowedOptions)) {\n                throw new Exception(\n                    sprintf(\n                        'Unknown option: \"%s\". Allowed values: \"%s\"',\n                        $key,\n                        implode('\", \"', $allowedOptions)\n                    )\n                );\n            }\n\n            switch ($key) {\n                case 'AllowEmpty':\n                case 'SMTPAutoTLS':\n                case 'SMTPKeepAlive':\n                case 'SingleTo':\n                case 'UseSendmailOptions':\n                case 'do_verp':\n                case 'DKIM_copyHeaderFields':\n                    $mailer->$key = (bool) $value;\n                    break;\n                case 'Priority':\n                case 'SMTPDebug':\n                case 'WordWrap':\n                    $mailer->$key = (int) $value;\n                    break;\n                default:\n                    $mailer->$key = $value;\n                    break;\n            }\n        }\n    }\n\n    /**\n     * Parse a URL.\n     * Wrapper for the built-in parse_url function to work around a bug in PHP 5.5.\n     *\n     * @param string $url URL\n     *\n     * @return array|false\n     */\n    protected function parseUrl($url)\n    {\n        if (\\PHP_VERSION_ID >= 50600 || false === strpos($url, '?')) {\n            return parse_url($url);\n        }\n\n        $chunks = explode('?', $url);\n        if (is_array($chunks)) {\n            $result = parse_url($chunks[0]);\n            if (is_array($result)) {\n                $result['query'] = $chunks[1];\n            }\n            return $result;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/lib/phpmailer/Exception.php",
    "content": "<?php\n\n/**\n * PHPMailer Exception class.\n * PHP Version 5.5.\n *\n * @see       https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n *\n * @author    Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author    Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author    Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author    Brent R. Matzelle (original founder)\n * @copyright 2012 - 2020 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license   http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note      This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\nnamespace PHPMailer\\PHPMailer;\n\n/**\n * PHPMailer exception handler.\n *\n * @author Marcus Bointon <phpmailer@synchromedia.co.uk>\n */\nclass Exception extends \\Exception\n{\n    /**\n     * Prettify error message output.\n     *\n     * @return string\n     */\n    public function errorMessage()\n    {\n        return '<strong>' . htmlspecialchars($this->getMessage(), ENT_COMPAT | ENT_HTML401) . \"</strong><br />\\n\";\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/lib/phpmailer/OAuth.php",
    "content": "<?php\n\n/**\n * PHPMailer - PHP email creation and transport class.\n * PHP Version 5.5.\n *\n * @see       https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n *\n * @author    Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author    Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author    Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author    Brent R. Matzelle (original founder)\n * @copyright 2012 - 2020 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license   http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note      This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\nnamespace PHPMailer\\PHPMailer;\n\nuse League\\OAuth2\\Client\\Grant\\RefreshToken;\nuse League\\OAuth2\\Client\\Provider\\AbstractProvider;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\n\n/**\n * OAuth - OAuth2 authentication wrapper class.\n * Uses the oauth2-client package from the League of Extraordinary Packages.\n *\n * @see     http://oauth2-client.thephpleague.com\n *\n * @author  Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n */\nclass OAuth implements OAuthTokenProvider\n{\n    /**\n     * An instance of the League OAuth Client Provider.\n     *\n     * @var AbstractProvider\n     */\n    protected $provider;\n\n    /**\n     * The current OAuth access token.\n     *\n     * @var AccessToken\n     */\n    protected $oauthToken;\n\n    /**\n     * The user's email address, usually used as the login ID\n     * and also the from address when sending email.\n     *\n     * @var string\n     */\n    protected $oauthUserEmail = '';\n\n    /**\n     * The client secret, generated in the app definition of the service you're connecting to.\n     *\n     * @var string\n     */\n    protected $oauthClientSecret = '';\n\n    /**\n     * The client ID, generated in the app definition of the service you're connecting to.\n     *\n     * @var string\n     */\n    protected $oauthClientId = '';\n\n    /**\n     * The refresh token, used to obtain new AccessTokens.\n     *\n     * @var string\n     */\n    protected $oauthRefreshToken = '';\n\n    /**\n     * OAuth constructor.\n     *\n     * @param array $options Associative array containing\n     *                       `provider`, `userName`, `clientSecret`, `clientId` and `refreshToken` elements\n     */\n    public function __construct($options)\n    {\n        $this->provider = $options['provider'];\n        $this->oauthUserEmail = $options['userName'];\n        $this->oauthClientSecret = $options['clientSecret'];\n        $this->oauthClientId = $options['clientId'];\n        $this->oauthRefreshToken = $options['refreshToken'];\n    }\n\n    /**\n     * Get a new RefreshToken.\n     *\n     * @return RefreshToken\n     */\n    protected function getGrant()\n    {\n        return new RefreshToken();\n    }\n\n    /**\n     * Get a new AccessToken.\n     *\n     * @return AccessToken\n     */\n    protected function getToken()\n    {\n        return $this->provider->getAccessToken(\n            $this->getGrant(),\n            ['refresh_token' => $this->oauthRefreshToken]\n        );\n    }\n\n    /**\n     * Generate a base64-encoded OAuth token.\n     *\n     * @return string\n     */\n    public function getOauth64()\n    {\n        //Get a new token if it's not available or has expired\n        if (null === $this->oauthToken || $this->oauthToken->hasExpired()) {\n            $this->oauthToken = $this->getToken();\n        }\n\n        return base64_encode(\n            'user=' .\n            $this->oauthUserEmail .\n            \"\\001auth=Bearer \" .\n            $this->oauthToken .\n            \"\\001\\001\"\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/lib/phpmailer/OAuthTokenProvider.php",
    "content": "<?php\n\n/**\n * PHPMailer - PHP email creation and transport class.\n * PHP Version 5.5.\n *\n * @see https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n *\n * @author    Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author    Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author    Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author    Brent R. Matzelle (original founder)\n * @copyright 2012 - 2020 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license   http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note      This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\nnamespace PHPMailer\\PHPMailer;\n\n/**\n * OAuthTokenProvider - OAuth2 token provider interface.\n * Provides base64 encoded OAuth2 auth strings for SMTP authentication.\n *\n * @see     OAuth\n * @see     SMTP::authenticate()\n *\n * @author  Peter Scopes (pdscopes)\n * @author  Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n */\ninterface OAuthTokenProvider\n{\n    /**\n     * Generate a base64-encoded OAuth token ensuring that the access token has not expired.\n     * The string to be base 64 encoded should be in the form:\n     * \"user=<user_email_address>\\001auth=Bearer <access_token>\\001\\001\"\n     *\n     * @return string\n     */\n    public function getOauth64();\n}\n"
  },
  {
    "path": "配套插件/BsCore/lib/phpmailer/PHPMailer.php",
    "content": "<?php\n\n/**\n * PHPMailer - PHP email creation and transport class.\n * PHP Version 5.5.\n *\n * @see https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n *\n * @author    Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author    Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author    Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author    Brent R. Matzelle (original founder)\n * @copyright 2012 - 2020 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license   http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note      This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\nnamespace PHPMailer\\PHPMailer;\n\n/**\n * PHPMailer - PHP email creation and transport class.\n *\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n */\nclass PHPMailer\n{\n    const CHARSET_ASCII = 'us-ascii';\n    const CHARSET_ISO88591 = 'iso-8859-1';\n    const CHARSET_UTF8 = 'utf-8';\n\n    const CONTENT_TYPE_PLAINTEXT = 'text/plain';\n    const CONTENT_TYPE_TEXT_CALENDAR = 'text/calendar';\n    const CONTENT_TYPE_TEXT_HTML = 'text/html';\n    const CONTENT_TYPE_MULTIPART_ALTERNATIVE = 'multipart/alternative';\n    const CONTENT_TYPE_MULTIPART_MIXED = 'multipart/mixed';\n    const CONTENT_TYPE_MULTIPART_RELATED = 'multipart/related';\n\n    const ENCODING_7BIT = '7bit';\n    const ENCODING_8BIT = '8bit';\n    const ENCODING_BASE64 = 'base64';\n    const ENCODING_BINARY = 'binary';\n    const ENCODING_QUOTED_PRINTABLE = 'quoted-printable';\n\n    const ENCRYPTION_STARTTLS = 'tls';\n    const ENCRYPTION_SMTPS = 'ssl';\n\n    const ICAL_METHOD_REQUEST = 'REQUEST';\n    const ICAL_METHOD_PUBLISH = 'PUBLISH';\n    const ICAL_METHOD_REPLY = 'REPLY';\n    const ICAL_METHOD_ADD = 'ADD';\n    const ICAL_METHOD_CANCEL = 'CANCEL';\n    const ICAL_METHOD_REFRESH = 'REFRESH';\n    const ICAL_METHOD_COUNTER = 'COUNTER';\n    const ICAL_METHOD_DECLINECOUNTER = 'DECLINECOUNTER';\n\n    /**\n     * Email priority.\n     * Options: null (default), 1 = High, 3 = Normal, 5 = low.\n     * When null, the header is not set at all.\n     *\n     * @var int|null\n     */\n    public $Priority;\n\n    /**\n     * The character set of the message.\n     *\n     * @var string\n     */\n    public $CharSet = self::CHARSET_ISO88591;\n\n    /**\n     * The MIME Content-type of the message.\n     *\n     * @var string\n     */\n    public $ContentType = self::CONTENT_TYPE_PLAINTEXT;\n\n    /**\n     * The message encoding.\n     * Options: \"8bit\", \"7bit\", \"binary\", \"base64\", and \"quoted-printable\".\n     *\n     * @var string\n     */\n    public $Encoding = self::ENCODING_8BIT;\n\n    /**\n     * Holds the most recent mailer error message.\n     *\n     * @var string\n     */\n    public $ErrorInfo = '';\n\n    /**\n     * The From email address for the message.\n     *\n     * @var string\n     */\n    public $From = '';\n\n    /**\n     * The From name of the message.\n     *\n     * @var string\n     */\n    public $FromName = '';\n\n    /**\n     * The envelope sender of the message.\n     * This will usually be turned into a Return-Path header by the receiver,\n     * and is the address that bounces will be sent to.\n     * If not empty, will be passed via `-f` to sendmail or as the 'MAIL FROM' value over SMTP.\n     *\n     * @var string\n     */\n    public $Sender = '';\n\n    /**\n     * The Subject of the message.\n     *\n     * @var string\n     */\n    public $Subject = '';\n\n    /**\n     * An HTML or plain text message body.\n     * If HTML then call isHTML(true).\n     *\n     * @var string\n     */\n    public $Body = '';\n\n    /**\n     * The plain-text message body.\n     * This body can be read by mail clients that do not have HTML email\n     * capability such as mutt & Eudora.\n     * Clients that can read HTML will view the normal Body.\n     *\n     * @var string\n     */\n    public $AltBody = '';\n\n    /**\n     * An iCal message part body.\n     * Only supported in simple alt or alt_inline message types\n     * To generate iCal event structures, use classes like EasyPeasyICS or iCalcreator.\n     *\n     * @see http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/\n     * @see http://kigkonsult.se/iCalcreator/\n     *\n     * @var string\n     */\n    public $Ical = '';\n\n    /**\n     * Value-array of \"method\" in Contenttype header \"text/calendar\"\n     *\n     * @var string[]\n     */\n    protected static $IcalMethods = [\n        self::ICAL_METHOD_REQUEST,\n        self::ICAL_METHOD_PUBLISH,\n        self::ICAL_METHOD_REPLY,\n        self::ICAL_METHOD_ADD,\n        self::ICAL_METHOD_CANCEL,\n        self::ICAL_METHOD_REFRESH,\n        self::ICAL_METHOD_COUNTER,\n        self::ICAL_METHOD_DECLINECOUNTER,\n    ];\n\n    /**\n     * The complete compiled MIME message body.\n     *\n     * @var string\n     */\n    protected $MIMEBody = '';\n\n    /**\n     * The complete compiled MIME message headers.\n     *\n     * @var string\n     */\n    protected $MIMEHeader = '';\n\n    /**\n     * Extra headers that createHeader() doesn't fold in.\n     *\n     * @var string\n     */\n    protected $mailHeader = '';\n\n    /**\n     * Word-wrap the message body to this number of chars.\n     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.\n     *\n     * @see static::STD_LINE_LENGTH\n     *\n     * @var int\n     */\n    public $WordWrap = 0;\n\n    /**\n     * Which method to use to send mail.\n     * Options: \"mail\", \"sendmail\", or \"smtp\".\n     *\n     * @var string\n     */\n    public $Mailer = 'mail';\n\n    /**\n     * The path to the sendmail program.\n     *\n     * @var string\n     */\n    public $Sendmail = '/usr/sbin/sendmail';\n\n    /**\n     * Whether mail() uses a fully sendmail-compatible MTA.\n     * One which supports sendmail's \"-oi -f\" options.\n     *\n     * @var bool\n     */\n    public $UseSendmailOptions = true;\n\n    /**\n     * The email address that a reading confirmation should be sent to, also known as read receipt.\n     *\n     * @var string\n     */\n    public $ConfirmReadingTo = '';\n\n    /**\n     * The hostname to use in the Message-ID header and as default HELO string.\n     * If empty, PHPMailer attempts to find one with, in order,\n     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value\n     * 'localhost.localdomain'.\n     *\n     * @see PHPMailer::$Helo\n     *\n     * @var string\n     */\n    public $Hostname = '';\n\n    /**\n     * An ID to be used in the Message-ID header.\n     * If empty, a unique id will be generated.\n     * You can set your own, but it must be in the format \"<id@domain>\",\n     * as defined in RFC5322 section 3.6.4 or it will be ignored.\n     *\n     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4\n     *\n     * @var string\n     */\n    public $MessageID = '';\n\n    /**\n     * The message Date to be used in the Date header.\n     * If empty, the current date will be added.\n     *\n     * @var string\n     */\n    public $MessageDate = '';\n\n    /**\n     * SMTP hosts.\n     * Either a single hostname or multiple semicolon-delimited hostnames.\n     * You can also specify a different port\n     * for each host by using this format: [hostname:port]\n     * (e.g. \"smtp1.example.com:25;smtp2.example.com\").\n     * You can also specify encryption type, for example:\n     * (e.g. \"tls://smtp1.example.com:587;ssl://smtp2.example.com:465\").\n     * Hosts will be tried in order.\n     *\n     * @var string\n     */\n    public $Host = 'localhost';\n\n    /**\n     * The default SMTP server port.\n     *\n     * @var int\n     */\n    public $Port = 25;\n\n    /**\n     * The SMTP HELO/EHLO name used for the SMTP connection.\n     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find\n     * one with the same method described above for $Hostname.\n     *\n     * @see PHPMailer::$Hostname\n     *\n     * @var string\n     */\n    public $Helo = '';\n\n    /**\n     * What kind of encryption to use on the SMTP connection.\n     * Options: '', static::ENCRYPTION_STARTTLS, or static::ENCRYPTION_SMTPS.\n     *\n     * @var string\n     */\n    public $SMTPSecure = '';\n\n    /**\n     * Whether to enable TLS encryption automatically if a server supports it,\n     * even if `SMTPSecure` is not set to 'tls'.\n     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.\n     *\n     * @var bool\n     */\n    public $SMTPAutoTLS = true;\n\n    /**\n     * Whether to use SMTP authentication.\n     * Uses the Username and Password properties.\n     *\n     * @see PHPMailer::$Username\n     * @see PHPMailer::$Password\n     *\n     * @var bool\n     */\n    public $SMTPAuth = false;\n\n    /**\n     * Options array passed to stream_context_create when connecting via SMTP.\n     *\n     * @var array\n     */\n    public $SMTPOptions = [];\n\n    /**\n     * SMTP username.\n     *\n     * @var string\n     */\n    public $Username = '';\n\n    /**\n     * SMTP password.\n     *\n     * @var string\n     */\n    public $Password = '';\n\n    /**\n     * SMTP authentication type. Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2.\n     * If not specified, the first one from that list that the server supports will be selected.\n     *\n     * @var string\n     */\n    public $AuthType = '';\n\n    /**\n     * An implementation of the PHPMailer OAuthTokenProvider interface.\n     *\n     * @var OAuthTokenProvider\n     */\n    protected $oauth;\n\n    /**\n     * The SMTP server timeout in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2.\n     *\n     * @var int\n     */\n    public $Timeout = 300;\n\n    /**\n     * Comma separated list of DSN notifications\n     * 'NEVER' under no circumstances a DSN must be returned to the sender.\n     *         If you use NEVER all other notifications will be ignored.\n     * 'SUCCESS' will notify you when your mail has arrived at its destination.\n     * 'FAILURE' will arrive if an error occurred during delivery.\n     * 'DELAY'   will notify you if there is an unusual delay in delivery, but the actual\n     *           delivery's outcome (success or failure) is not yet decided.\n     *\n     * @see https://tools.ietf.org/html/rfc3461 See section 4.1 for more information about NOTIFY\n     */\n    public $dsn = '';\n\n    /**\n     * SMTP class debug output mode.\n     * Debug output level.\n     * Options:\n     * @see SMTP::DEBUG_OFF: No output\n     * @see SMTP::DEBUG_CLIENT: Client messages\n     * @see SMTP::DEBUG_SERVER: Client and server messages\n     * @see SMTP::DEBUG_CONNECTION: As SERVER plus connection status\n     * @see SMTP::DEBUG_LOWLEVEL: Noisy, low-level data output, rarely needed\n     *\n     * @see SMTP::$do_debug\n     *\n     * @var int\n     */\n    public $SMTPDebug = 0;\n\n    /**\n     * How to handle debug output.\n     * Options:\n     * * `echo` Output plain-text as-is, appropriate for CLI\n     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n     * * `error_log` Output to error log as configured in php.ini\n     * By default PHPMailer will use `echo` if run from a `cli` or `cli-server` SAPI, `html` otherwise.\n     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n     *\n     * ```php\n     * $mail->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n     * ```\n     *\n     * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug`\n     * level output is used:\n     *\n     * ```php\n     * $mail->Debugoutput = new myPsr3Logger;\n     * ```\n     *\n     * @see SMTP::$Debugoutput\n     *\n     * @var string|callable|\\Psr\\Log\\LoggerInterface\n     */\n    public $Debugoutput = 'echo';\n\n    /**\n     * Whether to keep the SMTP connection open after each message.\n     * If this is set to true then the connection will remain open after a send,\n     * and closing the connection will require an explicit call to smtpClose().\n     * It's a good idea to use this if you are sending multiple messages as it reduces overhead.\n     * See the mailing list example for how to use it.\n     *\n     * @var bool\n     */\n    public $SMTPKeepAlive = false;\n\n    /**\n     * Whether to split multiple to addresses into multiple messages\n     * or send them all in one message.\n     * Only supported in `mail` and `sendmail` transports, not in SMTP.\n     *\n     * @var bool\n     *\n     * @deprecated 6.0.0 PHPMailer isn't a mailing list manager!\n     */\n    public $SingleTo = false;\n\n    /**\n     * Storage for addresses when SingleTo is enabled.\n     *\n     * @var array\n     */\n    protected $SingleToArray = [];\n\n    /**\n     * Whether to generate VERP addresses on send.\n     * Only applicable when sending via SMTP.\n     *\n     * @see https://en.wikipedia.org/wiki/Variable_envelope_return_path\n     * @see http://www.postfix.org/VERP_README.html Postfix VERP info\n     *\n     * @var bool\n     */\n    public $do_verp = false;\n\n    /**\n     * Whether to allow sending messages with an empty body.\n     *\n     * @var bool\n     */\n    public $AllowEmpty = false;\n\n    /**\n     * DKIM selector.\n     *\n     * @var string\n     */\n    public $DKIM_selector = '';\n\n    /**\n     * DKIM Identity.\n     * Usually the email address used as the source of the email.\n     *\n     * @var string\n     */\n    public $DKIM_identity = '';\n\n    /**\n     * DKIM passphrase.\n     * Used if your key is encrypted.\n     *\n     * @var string\n     */\n    public $DKIM_passphrase = '';\n\n    /**\n     * DKIM signing domain name.\n     *\n     * @example 'example.com'\n     *\n     * @var string\n     */\n    public $DKIM_domain = '';\n\n    /**\n     * DKIM Copy header field values for diagnostic use.\n     *\n     * @var bool\n     */\n    public $DKIM_copyHeaderFields = true;\n\n    /**\n     * DKIM Extra signing headers.\n     *\n     * @example ['List-Unsubscribe', 'List-Help']\n     *\n     * @var array\n     */\n    public $DKIM_extraHeaders = [];\n\n    /**\n     * DKIM private key file path.\n     *\n     * @var string\n     */\n    public $DKIM_private = '';\n\n    /**\n     * DKIM private key string.\n     *\n     * If set, takes precedence over `$DKIM_private`.\n     *\n     * @var string\n     */\n    public $DKIM_private_string = '';\n\n    /**\n     * Callback Action function name.\n     *\n     * The function that handles the result of the send email action.\n     * It is called out by send() for each email sent.\n     *\n     * Value can be any php callable: http://www.php.net/is_callable\n     *\n     * Parameters:\n     *   bool $result        result of the send action\n     *   array   $to            email addresses of the recipients\n     *   array   $cc            cc email addresses\n     *   array   $bcc           bcc email addresses\n     *   string  $subject       the subject\n     *   string  $body          the email body\n     *   string  $from          email address of sender\n     *   string  $extra         extra information of possible use\n     *                          \"smtp_transaction_id' => last smtp transaction id\n     *\n     * @var string\n     */\n    public $action_function = '';\n\n    /**\n     * What to put in the X-Mailer header.\n     * Options: An empty string for PHPMailer default, whitespace/null for none, or a string to use.\n     *\n     * @var string|null\n     */\n    public $XMailer = '';\n\n    /**\n     * Which validator to use by default when validating email addresses.\n     * May be a callable to inject your own validator, but there are several built-in validators.\n     * The default validator uses PHP's FILTER_VALIDATE_EMAIL filter_var option.\n     *\n     * @see PHPMailer::validateAddress()\n     *\n     * @var string|callable\n     */\n    public static $validator = 'php';\n\n    /**\n     * An instance of the SMTP sender class.\n     *\n     * @var SMTP\n     */\n    protected $smtp;\n\n    /**\n     * The array of 'to' names and addresses.\n     *\n     * @var array\n     */\n    protected $to = [];\n\n    /**\n     * The array of 'cc' names and addresses.\n     *\n     * @var array\n     */\n    protected $cc = [];\n\n    /**\n     * The array of 'bcc' names and addresses.\n     *\n     * @var array\n     */\n    protected $bcc = [];\n\n    /**\n     * The array of reply-to names and addresses.\n     *\n     * @var array\n     */\n    protected $ReplyTo = [];\n\n    /**\n     * An array of all kinds of addresses.\n     * Includes all of $to, $cc, $bcc.\n     *\n     * @see PHPMailer::$to\n     * @see PHPMailer::$cc\n     * @see PHPMailer::$bcc\n     *\n     * @var array\n     */\n    protected $all_recipients = [];\n\n    /**\n     * An array of names and addresses queued for validation.\n     * In send(), valid and non duplicate entries are moved to $all_recipients\n     * and one of $to, $cc, or $bcc.\n     * This array is used only for addresses with IDN.\n     *\n     * @see PHPMailer::$to\n     * @see PHPMailer::$cc\n     * @see PHPMailer::$bcc\n     * @see PHPMailer::$all_recipients\n     *\n     * @var array\n     */\n    protected $RecipientsQueue = [];\n\n    /**\n     * An array of reply-to names and addresses queued for validation.\n     * In send(), valid and non duplicate entries are moved to $ReplyTo.\n     * This array is used only for addresses with IDN.\n     *\n     * @see PHPMailer::$ReplyTo\n     *\n     * @var array\n     */\n    protected $ReplyToQueue = [];\n\n    /**\n     * The array of attachments.\n     *\n     * @var array\n     */\n    protected $attachment = [];\n\n    /**\n     * The array of custom headers.\n     *\n     * @var array\n     */\n    protected $CustomHeader = [];\n\n    /**\n     * The most recent Message-ID (including angular brackets).\n     *\n     * @var string\n     */\n    protected $lastMessageID = '';\n\n    /**\n     * The message's MIME type.\n     *\n     * @var string\n     */\n    protected $message_type = '';\n\n    /**\n     * The array of MIME boundary strings.\n     *\n     * @var array\n     */\n    protected $boundary = [];\n\n    /**\n     * The array of available text strings for the current language.\n     *\n     * @var array\n     */\n    protected $language = [];\n\n    /**\n     * The number of errors encountered.\n     *\n     * @var int\n     */\n    protected $error_count = 0;\n\n    /**\n     * The S/MIME certificate file path.\n     *\n     * @var string\n     */\n    protected $sign_cert_file = '';\n\n    /**\n     * The S/MIME key file path.\n     *\n     * @var string\n     */\n    protected $sign_key_file = '';\n\n    /**\n     * The optional S/MIME extra certificates (\"CA Chain\") file path.\n     *\n     * @var string\n     */\n    protected $sign_extracerts_file = '';\n\n    /**\n     * The S/MIME password for the key.\n     * Used only if the key is encrypted.\n     *\n     * @var string\n     */\n    protected $sign_key_pass = '';\n\n    /**\n     * Whether to throw exceptions for errors.\n     *\n     * @var bool\n     */\n    protected $exceptions = false;\n\n    /**\n     * Unique ID used for message ID and boundaries.\n     *\n     * @var string\n     */\n    protected $uniqueid = '';\n\n    /**\n     * The PHPMailer Version number.\n     *\n     * @var string\n     */\n    const VERSION = '6.8.0';\n\n    /**\n     * Error severity: message only, continue processing.\n     *\n     * @var int\n     */\n    const STOP_MESSAGE = 0;\n\n    /**\n     * Error severity: message, likely ok to continue processing.\n     *\n     * @var int\n     */\n    const STOP_CONTINUE = 1;\n\n    /**\n     * Error severity: message, plus full stop, critical error reached.\n     *\n     * @var int\n     */\n    const STOP_CRITICAL = 2;\n\n    /**\n     * The SMTP standard CRLF line break.\n     * If you want to change line break format, change static::$LE, not this.\n     */\n    const CRLF = \"\\r\\n\";\n\n    /**\n     * \"Folding White Space\" a white space string used for line folding.\n     */\n    const FWS = ' ';\n\n    /**\n     * SMTP RFC standard line ending; Carriage Return, Line Feed.\n     *\n     * @var string\n     */\n    protected static $LE = self::CRLF;\n\n    /**\n     * The maximum line length supported by mail().\n     *\n     * Background: mail() will sometimes corrupt messages\n     * with headers headers longer than 65 chars, see #818.\n     *\n     * @var int\n     */\n    const MAIL_MAX_LINE_LENGTH = 63;\n\n    /**\n     * The maximum line length allowed by RFC 2822 section 2.1.1.\n     *\n     * @var int\n     */\n    const MAX_LINE_LENGTH = 998;\n\n    /**\n     * The lower maximum line length allowed by RFC 2822 section 2.1.1.\n     * This length does NOT include the line break\n     * 76 means that lines will be 77 or 78 chars depending on whether\n     * the line break format is LF or CRLF; both are valid.\n     *\n     * @var int\n     */\n    const STD_LINE_LENGTH = 76;\n\n    /**\n     * Constructor.\n     *\n     * @param bool $exceptions Should we throw external exceptions?\n     */\n    public function __construct($exceptions = null)\n    {\n        if (null !== $exceptions) {\n            $this->exceptions = (bool) $exceptions;\n        }\n        //Pick an appropriate debug output format automatically\n        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');\n    }\n\n    /**\n     * Destructor.\n     */\n    public function __destruct()\n    {\n        //Close any open SMTP connection nicely\n        $this->smtpClose();\n    }\n\n    /**\n     * Call mail() in a safe_mode-aware fashion.\n     * Also, unless sendmail_path points to sendmail (or something that\n     * claims to be sendmail), don't pass params (not a perfect fix,\n     * but it will do).\n     *\n     * @param string      $to      To\n     * @param string      $subject Subject\n     * @param string      $body    Message Body\n     * @param string      $header  Additional Header(s)\n     * @param string|null $params  Params\n     *\n     * @return bool\n     */\n    private function mailPassthru($to, $subject, $body, $header, $params)\n    {\n        //Check overloading of mail function to avoid double-encoding\n        if ((int)ini_get('mbstring.func_overload') & 1) {\n            $subject = $this->secureHeader($subject);\n        } else {\n            $subject = $this->encodeHeader($this->secureHeader($subject));\n        }\n        //Calling mail() with null params breaks\n        $this->edebug('Sending with mail()');\n        $this->edebug('Sendmail path: ' . ini_get('sendmail_path'));\n        $this->edebug(\"Envelope sender: {$this->Sender}\");\n        $this->edebug(\"To: {$to}\");\n        $this->edebug(\"Subject: {$subject}\");\n        $this->edebug(\"Headers: {$header}\");\n        if (!$this->UseSendmailOptions || null === $params) {\n            $result = @mail($to, $subject, $body, $header);\n        } else {\n            $this->edebug(\"Additional params: {$params}\");\n            $result = @mail($to, $subject, $body, $header, $params);\n        }\n        $this->edebug('Result: ' . ($result ? 'true' : 'false'));\n        return $result;\n    }\n\n    /**\n     * Output debugging info via a user-defined method.\n     * Only generates output if debug output is enabled.\n     *\n     * @see PHPMailer::$Debugoutput\n     * @see PHPMailer::$SMTPDebug\n     *\n     * @param string $str\n     */\n    protected function edebug($str)\n    {\n        if ($this->SMTPDebug <= 0) {\n            return;\n        }\n        //Is this a PSR-3 logger?\n        if ($this->Debugoutput instanceof \\Psr\\Log\\LoggerInterface) {\n            $this->Debugoutput->debug($str);\n\n            return;\n        }\n        //Avoid clash with built-in function names\n        if (is_callable($this->Debugoutput) && !in_array($this->Debugoutput, ['error_log', 'html', 'echo'])) {\n            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);\n\n            return;\n        }\n        switch ($this->Debugoutput) {\n            case 'error_log':\n                //Don't output, just log\n                /** @noinspection ForgottenDebugOutputInspection */\n                error_log($str);\n                break;\n            case 'html':\n                //Cleans up output a bit for a better looking, HTML-safe output\n                echo htmlentities(\n                    preg_replace('/[\\r\\n]+/', '', $str),\n                    ENT_QUOTES,\n                    'UTF-8'\n                ), \"<br>\\n\";\n                break;\n            case 'echo':\n            default:\n                //Normalize line breaks\n                $str = preg_replace('/\\r\\n|\\r/m', \"\\n\", $str);\n                echo gmdate('Y-m-d H:i:s'),\n                \"\\t\",\n                    //Trim trailing space\n                trim(\n                    //Indent for readability, except for trailing break\n                    str_replace(\n                        \"\\n\",\n                        \"\\n                   \\t                  \",\n                        trim($str)\n                    )\n                ),\n                \"\\n\";\n        }\n    }\n\n    /**\n     * Sets message type to HTML or plain.\n     *\n     * @param bool $isHtml True for HTML mode\n     */\n    public function isHTML($isHtml = true)\n    {\n        if ($isHtml) {\n            $this->ContentType = static::CONTENT_TYPE_TEXT_HTML;\n        } else {\n            $this->ContentType = static::CONTENT_TYPE_PLAINTEXT;\n        }\n    }\n\n    /**\n     * Send messages using SMTP.\n     */\n    public function isSMTP()\n    {\n        $this->Mailer = 'smtp';\n    }\n\n    /**\n     * Send messages using PHP's mail() function.\n     */\n    public function isMail()\n    {\n        $this->Mailer = 'mail';\n    }\n\n    /**\n     * Send messages using $Sendmail.\n     */\n    public function isSendmail()\n    {\n        $ini_sendmail_path = ini_get('sendmail_path');\n\n        if (false === stripos($ini_sendmail_path, 'sendmail')) {\n            $this->Sendmail = '/usr/sbin/sendmail';\n        } else {\n            $this->Sendmail = $ini_sendmail_path;\n        }\n        $this->Mailer = 'sendmail';\n    }\n\n    /**\n     * Send messages using qmail.\n     */\n    public function isQmail()\n    {\n        $ini_sendmail_path = ini_get('sendmail_path');\n\n        if (false === stripos($ini_sendmail_path, 'qmail')) {\n            $this->Sendmail = '/var/qmail/bin/qmail-inject';\n        } else {\n            $this->Sendmail = $ini_sendmail_path;\n        }\n        $this->Mailer = 'qmail';\n    }\n\n    /**\n     * Add a \"To\" address.\n     *\n     * @param string $address The email address to send to\n     * @param string $name\n     *\n     * @throws Exception\n     *\n     * @return bool true on success, false if address already used or invalid in some way\n     */\n    public function addAddress($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('to', $address, $name);\n    }\n\n    /**\n     * Add a \"CC\" address.\n     *\n     * @param string $address The email address to send to\n     * @param string $name\n     *\n     * @throws Exception\n     *\n     * @return bool true on success, false if address already used or invalid in some way\n     */\n    public function addCC($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('cc', $address, $name);\n    }\n\n    /**\n     * Add a \"BCC\" address.\n     *\n     * @param string $address The email address to send to\n     * @param string $name\n     *\n     * @throws Exception\n     *\n     * @return bool true on success, false if address already used or invalid in some way\n     */\n    public function addBCC($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('bcc', $address, $name);\n    }\n\n    /**\n     * Add a \"Reply-To\" address.\n     *\n     * @param string $address The email address to reply to\n     * @param string $name\n     *\n     * @throws Exception\n     *\n     * @return bool true on success, false if address already used or invalid in some way\n     */\n    public function addReplyTo($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);\n    }\n\n    /**\n     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer\n     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still\n     * be modified after calling this function), addition of such addresses is delayed until send().\n     * Addresses that have been added already return false, but do not throw exceptions.\n     *\n     * @param string $kind    One of 'to', 'cc', 'bcc', or 'ReplyTo'\n     * @param string $address The email address\n     * @param string $name    An optional username associated with the address\n     *\n     * @throws Exception\n     *\n     * @return bool true on success, false if address already used or invalid in some way\n     */\n    protected function addOrEnqueueAnAddress($kind, $address, $name)\n    {\n        $pos = false;\n        if ($address !== null) {\n            $address = trim($address);\n            $pos = strrpos($address, '@');\n        }\n        if (false === $pos) {\n            //At-sign is missing.\n            $error_message = sprintf(\n                '%s (%s): %s',\n                $this->lang('invalid_address'),\n                $kind,\n                $address\n            );\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new Exception($error_message);\n            }\n\n            return false;\n        }\n        if ($name !== null && is_string($name)) {\n            $name = trim(preg_replace('/[\\r\\n]+/', '', $name)); //Strip breaks and trim\n        } else {\n            $name = '';\n        }\n        $params = [$kind, $address, $name];\n        //Enqueue addresses with IDN until we know the PHPMailer::$CharSet.\n        //Domain is assumed to be whatever is after the last @ symbol in the address\n        if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) {\n            if ('Reply-To' !== $kind) {\n                if (!array_key_exists($address, $this->RecipientsQueue)) {\n                    $this->RecipientsQueue[$address] = $params;\n\n                    return true;\n                }\n            } elseif (!array_key_exists($address, $this->ReplyToQueue)) {\n                $this->ReplyToQueue[$address] = $params;\n\n                return true;\n            }\n\n            return false;\n        }\n\n        //Immediately add standard addresses without IDN.\n        return call_user_func_array([$this, 'addAnAddress'], $params);\n    }\n\n    /**\n     * Set the boundaries to use for delimiting MIME parts.\n     * If you override this, ensure you set all 3 boundaries to unique values.\n     * The default boundaries include a \"=_\" sequence which cannot occur in quoted-printable bodies,\n     * as suggested by https://www.rfc-editor.org/rfc/rfc2045#section-6.7\n     *\n     * @return void\n     */\n    public function setBoundaries()\n    {\n        $this->uniqueid = $this->generateId();\n        $this->boundary[1] = 'b1=_' . $this->uniqueid;\n        $this->boundary[2] = 'b2=_' . $this->uniqueid;\n        $this->boundary[3] = 'b3=_' . $this->uniqueid;\n    }\n\n    /**\n     * Add an address to one of the recipient arrays or to the ReplyTo array.\n     * Addresses that have been added already return false, but do not throw exceptions.\n     *\n     * @param string $kind    One of 'to', 'cc', 'bcc', or 'ReplyTo'\n     * @param string $address The email address to send, resp. to reply to\n     * @param string $name\n     *\n     * @throws Exception\n     *\n     * @return bool true on success, false if address already used or invalid in some way\n     */\n    protected function addAnAddress($kind, $address, $name = '')\n    {\n        if (!in_array($kind, ['to', 'cc', 'bcc', 'Reply-To'])) {\n            $error_message = sprintf(\n                '%s: %s',\n                $this->lang('Invalid recipient kind'),\n                $kind\n            );\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new Exception($error_message);\n            }\n\n            return false;\n        }\n        if (!static::validateAddress($address)) {\n            $error_message = sprintf(\n                '%s (%s): %s',\n                $this->lang('invalid_address'),\n                $kind,\n                $address\n            );\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new Exception($error_message);\n            }\n\n            return false;\n        }\n        if ('Reply-To' !== $kind) {\n            if (!array_key_exists(strtolower($address), $this->all_recipients)) {\n                $this->{$kind}[] = [$address, $name];\n                $this->all_recipients[strtolower($address)] = true;\n\n                return true;\n            }\n        } elseif (!array_key_exists(strtolower($address), $this->ReplyTo)) {\n            $this->ReplyTo[strtolower($address)] = [$address, $name];\n\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses\n     * of the form \"display name <address>\" into an array of name/address pairs.\n     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.\n     * Note that quotes in the name part are removed.\n     *\n     * @see http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation\n     *\n     * @param string $addrstr The address list string\n     * @param bool   $useimap Whether to use the IMAP extension to parse the list\n     * @param string $charset The charset to use when decoding the address list string.\n     *\n     * @return array\n     */\n    public static function parseAddresses($addrstr, $useimap = true, $charset = self::CHARSET_ISO88591)\n    {\n        $addresses = [];\n        if ($useimap && function_exists('imap_rfc822_parse_adrlist')) {\n            //Use this built-in parser if it's available\n            $list = imap_rfc822_parse_adrlist($addrstr, '');\n            // Clear any potential IMAP errors to get rid of notices being thrown at end of script.\n            imap_errors();\n            foreach ($list as $address) {\n                if (\n                    '.SYNTAX-ERROR.' !== $address->host &&\n                    static::validateAddress($address->mailbox . '@' . $address->host)\n                ) {\n                    //Decode the name part if it's present and encoded\n                    if (\n                        property_exists($address, 'personal') &&\n                        //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled\n                        defined('MB_CASE_UPPER') &&\n                        preg_match('/^=\\?.*\\?=$/s', $address->personal)\n                    ) {\n                        $origCharset = mb_internal_encoding();\n                        mb_internal_encoding($charset);\n                        //Undo any RFC2047-encoded spaces-as-underscores\n                        $address->personal = str_replace('_', '=20', $address->personal);\n                        //Decode the name\n                        $address->personal = mb_decode_mimeheader($address->personal);\n                        mb_internal_encoding($origCharset);\n                    }\n\n                    $addresses[] = [\n                        'name' => (property_exists($address, 'personal') ? $address->personal : ''),\n                        'address' => $address->mailbox . '@' . $address->host,\n                    ];\n                }\n            }\n        } else {\n            //Use this simpler parser\n            $list = explode(',', $addrstr);\n            foreach ($list as $address) {\n                $address = trim($address);\n                //Is there a separate name part?\n                if (strpos($address, '<') === false) {\n                    //No separate name, just use the whole thing\n                    if (static::validateAddress($address)) {\n                        $addresses[] = [\n                            'name' => '',\n                            'address' => $address,\n                        ];\n                    }\n                } else {\n                    list($name, $email) = explode('<', $address);\n                    $email = trim(str_replace('>', '', $email));\n                    $name = trim($name);\n                    if (static::validateAddress($email)) {\n                        //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled\n                        //If this name is encoded, decode it\n                        if (defined('MB_CASE_UPPER') && preg_match('/^=\\?.*\\?=$/s', $name)) {\n                            $origCharset = mb_internal_encoding();\n                            mb_internal_encoding($charset);\n                            //Undo any RFC2047-encoded spaces-as-underscores\n                            $name = str_replace('_', '=20', $name);\n                            //Decode the name\n                            $name = mb_decode_mimeheader($name);\n                            mb_internal_encoding($origCharset);\n                        }\n                        $addresses[] = [\n                            //Remove any surrounding quotes and spaces from the name\n                            'name' => trim($name, '\\'\" '),\n                            'address' => $email,\n                        ];\n                    }\n                }\n            }\n        }\n\n        return $addresses;\n    }\n\n    /**\n     * Set the From and FromName properties.\n     *\n     * @param string $address\n     * @param string $name\n     * @param bool   $auto    Whether to also set the Sender address, defaults to true\n     *\n     * @throws Exception\n     *\n     * @return bool\n     */\n    public function setFrom($address, $name = '', $auto = true)\n    {\n        $address = trim((string)$address);\n        $name = trim(preg_replace('/[\\r\\n]+/', '', $name)); //Strip breaks and trim\n        //Don't validate now addresses with IDN. Will be done in send().\n        $pos = strrpos($address, '@');\n        if (\n            (false === $pos)\n            || ((!$this->has8bitChars(substr($address, ++$pos)) || !static::idnSupported())\n            && !static::validateAddress($address))\n        ) {\n            $error_message = sprintf(\n                '%s (From): %s',\n                $this->lang('invalid_address'),\n                $address\n            );\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new Exception($error_message);\n            }\n\n            return false;\n        }\n        $this->From = $address;\n        $this->FromName = $name;\n        if ($auto && empty($this->Sender)) {\n            $this->Sender = $address;\n        }\n\n        return true;\n    }\n\n    /**\n     * Return the Message-ID header of the last email.\n     * Technically this is the value from the last time the headers were created,\n     * but it's also the message ID of the last sent message except in\n     * pathological cases.\n     *\n     * @return string\n     */\n    public function getLastMessageID()\n    {\n        return $this->lastMessageID;\n    }\n\n    /**\n     * Check that a string looks like an email address.\n     * Validation patterns supported:\n     * * `auto` Pick best pattern automatically;\n     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0;\n     * * `pcre` Use old PCRE implementation;\n     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;\n     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.\n     * * `noregex` Don't use a regex: super fast, really dumb.\n     * Alternatively you may pass in a callable to inject your own validator, for example:\n     *\n     * ```php\n     * PHPMailer::validateAddress('user@example.com', function($address) {\n     *     return (strpos($address, '@') !== false);\n     * });\n     * ```\n     *\n     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.\n     *\n     * @param string          $address       The email address to check\n     * @param string|callable $patternselect Which pattern to use\n     *\n     * @return bool\n     */\n    public static function validateAddress($address, $patternselect = null)\n    {\n        if (null === $patternselect) {\n            $patternselect = static::$validator;\n        }\n        //Don't allow strings as callables, see SECURITY.md and CVE-2021-3603\n        if (is_callable($patternselect) && !is_string($patternselect)) {\n            return call_user_func($patternselect, $address);\n        }\n        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321\n        if (strpos($address, \"\\n\") !== false || strpos($address, \"\\r\") !== false) {\n            return false;\n        }\n        switch ($patternselect) {\n            case 'pcre': //Kept for BC\n            case 'pcre8':\n                /*\n                 * A more complex and more permissive version of the RFC5322 regex on which FILTER_VALIDATE_EMAIL\n                 * is based.\n                 * In addition to the addresses allowed by filter_var, also permits:\n                 *  * dotless domains: `a@b`\n                 *  * comments: `1234 @ local(blah) .machine .example`\n                 *  * quoted elements: `'\"test blah\"@example.org'`\n                 *  * numeric TLDs: `a@b.123`\n                 *  * unbracketed IPv4 literals: `a@192.168.0.1`\n                 *  * IPv6 literals: 'first.last@[IPv6:a1::]'\n                 * Not all of these will necessarily work for sending!\n                 *\n                 * @see       http://squiloople.com/2009/12/20/email-address-validation/\n                 * @copyright 2009-2010 Michael Rushton\n                 * Feel free to use and redistribute this code. But please keep this copyright notice.\n                 */\n                return (bool) preg_match(\n                    '/^(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){255,})(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){65,}@)' .\n                    '((?>(?>(?>((?>(?>(?>\\x0D\\x0A)?[\\t ])+|(?>[\\t ]*\\x0D\\x0A)?[\\t ]+)?)(\\((?>(?2)' .\n                    '(?>[\\x01-\\x08\\x0B\\x0C\\x0E-\\'*-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]|(?3)))*(?2)\\)))+(?2))|(?2))?)' .\n                    '([!#-\\'*+\\/-9=?^-~-]+|\"(?>(?2)(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]))*' .\n                    '(?2)\")(?>(?1)\\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .\n                    '(?>(?1)\\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .\n                    '|(?!(?:.*[a-f0-9][:\\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .\n                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n                    '|[1-9]?[0-9])(?>\\.(?9)){3}))\\])(?1)$/isD',\n                    $address\n                );\n            case 'html5':\n                /*\n                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.\n                 *\n                 * @see https://html.spec.whatwg.org/#e-mail-state-(type=email)\n                 */\n                return (bool) preg_match(\n                    '/^[a-zA-Z0-9.!#$%&\\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .\n                    '[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',\n                    $address\n                );\n            case 'php':\n            default:\n                return filter_var($address, FILTER_VALIDATE_EMAIL) !== false;\n        }\n    }\n\n    /**\n     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the\n     * `intl` and `mbstring` PHP extensions.\n     *\n     * @return bool `true` if required functions for IDN support are present\n     */\n    public static function idnSupported()\n    {\n        return function_exists('idn_to_ascii') && function_exists('mb_convert_encoding');\n    }\n\n    /**\n     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.\n     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.\n     * This function silently returns unmodified address if:\n     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)\n     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)\n     *   or fails for any reason (e.g. domain contains characters not allowed in an IDN).\n     *\n     * @see PHPMailer::$CharSet\n     *\n     * @param string $address The email address to convert\n     *\n     * @return string The encoded address in ASCII form\n     */\n    public function punyencodeAddress($address)\n    {\n        //Verify we have required functions, CharSet, and at-sign.\n        $pos = strrpos($address, '@');\n        if (\n            !empty($this->CharSet) &&\n            false !== $pos &&\n            static::idnSupported()\n        ) {\n            $domain = substr($address, ++$pos);\n            //Verify CharSet string is a valid one, and domain properly encoded in this CharSet.\n            if ($this->has8bitChars($domain) && @mb_check_encoding($domain, $this->CharSet)) {\n                //Convert the domain from whatever charset it's in to UTF-8\n                $domain = mb_convert_encoding($domain, self::CHARSET_UTF8, $this->CharSet);\n                //Ignore IDE complaints about this line - method signature changed in PHP 5.4\n                $errorcode = 0;\n                if (defined('INTL_IDNA_VARIANT_UTS46')) {\n                    //Use the current punycode standard (appeared in PHP 7.2)\n                    $punycode = idn_to_ascii(\n                        $domain,\n                        \\IDNA_DEFAULT | \\IDNA_USE_STD3_RULES | \\IDNA_CHECK_BIDI |\n                            \\IDNA_CHECK_CONTEXTJ | \\IDNA_NONTRANSITIONAL_TO_ASCII,\n                        \\INTL_IDNA_VARIANT_UTS46\n                    );\n                } elseif (defined('INTL_IDNA_VARIANT_2003')) {\n                    //Fall back to this old, deprecated/removed encoding\n                    $punycode = idn_to_ascii($domain, $errorcode, \\INTL_IDNA_VARIANT_2003);\n                } else {\n                    //Fall back to a default we don't know about\n                    $punycode = idn_to_ascii($domain, $errorcode);\n                }\n                if (false !== $punycode) {\n                    return substr($address, 0, $pos) . $punycode;\n                }\n            }\n        }\n\n        return $address;\n    }\n\n    /**\n     * Create a message and send it.\n     * Uses the sending method specified by $Mailer.\n     *\n     * @throws Exception\n     *\n     * @return bool false on error - See the ErrorInfo property for details of the error\n     */\n    public function send()\n    {\n        try {\n            if (!$this->preSend()) {\n                return false;\n            }\n\n            return $this->postSend();\n        } catch (Exception $exc) {\n            $this->mailHeader = '';\n            $this->setError($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n\n            return false;\n        }\n    }\n\n    /**\n     * Prepare a message for sending.\n     *\n     * @throws Exception\n     *\n     * @return bool\n     */\n    public function preSend()\n    {\n        if (\n            'smtp' === $this->Mailer\n            || ('mail' === $this->Mailer && (\\PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0))\n        ) {\n            //SMTP mandates RFC-compliant line endings\n            //and it's also used with mail() on Windows\n            static::setLE(self::CRLF);\n        } else {\n            //Maintain backward compatibility with legacy Linux command line mailers\n            static::setLE(PHP_EOL);\n        }\n        //Check for buggy PHP versions that add a header with an incorrect line break\n        if (\n            'mail' === $this->Mailer\n            && ((\\PHP_VERSION_ID >= 70000 && \\PHP_VERSION_ID < 70017)\n                || (\\PHP_VERSION_ID >= 70100 && \\PHP_VERSION_ID < 70103))\n            && ini_get('mail.add_x_header') === '1'\n            && stripos(PHP_OS, 'WIN') === 0\n        ) {\n            trigger_error($this->lang('buggy_php'), E_USER_WARNING);\n        }\n\n        try {\n            $this->error_count = 0; //Reset errors\n            $this->mailHeader = '';\n\n            //Dequeue recipient and Reply-To addresses with IDN\n            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {\n                $params[1] = $this->punyencodeAddress($params[1]);\n                call_user_func_array([$this, 'addAnAddress'], $params);\n            }\n            if (count($this->to) + count($this->cc) + count($this->bcc) < 1) {\n                throw new Exception($this->lang('provide_address'), self::STOP_CRITICAL);\n            }\n\n            //Validate From, Sender, and ConfirmReadingTo addresses\n            foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) {\n                $this->{$address_kind} = trim($this->{$address_kind});\n                if (empty($this->{$address_kind})) {\n                    continue;\n                }\n                $this->{$address_kind} = $this->punyencodeAddress($this->{$address_kind});\n                if (!static::validateAddress($this->{$address_kind})) {\n                    $error_message = sprintf(\n                        '%s (%s): %s',\n                        $this->lang('invalid_address'),\n                        $address_kind,\n                        $this->{$address_kind}\n                    );\n                    $this->setError($error_message);\n                    $this->edebug($error_message);\n                    if ($this->exceptions) {\n                        throw new Exception($error_message);\n                    }\n\n                    return false;\n                }\n            }\n\n            //Set whether the message is multipart/alternative\n            if ($this->alternativeExists()) {\n                $this->ContentType = static::CONTENT_TYPE_MULTIPART_ALTERNATIVE;\n            }\n\n            $this->setMessageType();\n            //Refuse to send an empty message unless we are specifically allowing it\n            if (!$this->AllowEmpty && empty($this->Body)) {\n                throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL);\n            }\n\n            //Trim subject consistently\n            $this->Subject = trim($this->Subject);\n            //Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)\n            $this->MIMEHeader = '';\n            $this->MIMEBody = $this->createBody();\n            //createBody may have added some headers, so retain them\n            $tempheaders = $this->MIMEHeader;\n            $this->MIMEHeader = $this->createHeader();\n            $this->MIMEHeader .= $tempheaders;\n\n            //To capture the complete message when using mail(), create\n            //an extra header list which createHeader() doesn't fold in\n            if ('mail' === $this->Mailer) {\n                if (count($this->to) > 0) {\n                    $this->mailHeader .= $this->addrAppend('To', $this->to);\n                } else {\n                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');\n                }\n                $this->mailHeader .= $this->headerLine(\n                    'Subject',\n                    $this->encodeHeader($this->secureHeader($this->Subject))\n                );\n            }\n\n            //Sign with DKIM if enabled\n            if (\n                !empty($this->DKIM_domain)\n                && !empty($this->DKIM_selector)\n                && (!empty($this->DKIM_private_string)\n                    || (!empty($this->DKIM_private)\n                        && static::isPermittedPath($this->DKIM_private)\n                        && file_exists($this->DKIM_private)\n                    )\n                )\n            ) {\n                $header_dkim = $this->DKIM_Add(\n                    $this->MIMEHeader . $this->mailHeader,\n                    $this->encodeHeader($this->secureHeader($this->Subject)),\n                    $this->MIMEBody\n                );\n                $this->MIMEHeader = static::stripTrailingWSP($this->MIMEHeader) . static::$LE .\n                    static::normalizeBreaks($header_dkim) . static::$LE;\n            }\n\n            return true;\n        } catch (Exception $exc) {\n            $this->setError($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n\n            return false;\n        }\n    }\n\n    /**\n     * Actually send a message via the selected mechanism.\n     *\n     * @throws Exception\n     *\n     * @return bool\n     */\n    public function postSend()\n    {\n        try {\n            //Choose the mailer and send through it\n            switch ($this->Mailer) {\n                case 'sendmail':\n                case 'qmail':\n                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);\n                case 'smtp':\n                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);\n                case 'mail':\n                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n                default:\n                    $sendMethod = $this->Mailer . 'Send';\n                    if (method_exists($this, $sendMethod)) {\n                        return $this->{$sendMethod}($this->MIMEHeader, $this->MIMEBody);\n                    }\n\n                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n            }\n        } catch (Exception $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true && $this->smtp->connected()) {\n                $this->smtp->reset();\n            }\n            if ($this->exceptions) {\n                throw $exc;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Send mail using the $Sendmail program.\n     *\n     * @see PHPMailer::$Sendmail\n     *\n     * @param string $header The message headers\n     * @param string $body   The message body\n     *\n     * @throws Exception\n     *\n     * @return bool\n     */\n    protected function sendmailSend($header, $body)\n    {\n        if ($this->Mailer === 'qmail') {\n            $this->edebug('Sending with qmail');\n        } else {\n            $this->edebug('Sending with sendmail');\n        }\n        $header = static::stripTrailingWSP($header) . static::$LE . static::$LE;\n        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver\n        //A space after `-f` is optional, but there is a long history of its presence\n        //causing problems, so we don't use one\n        //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html\n        //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html\n        //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html\n        //Example problem: https://www.drupal.org/node/1057954\n\n        //PHP 5.6 workaround\n        $sendmail_from_value = ini_get('sendmail_from');\n        if (empty($this->Sender) && !empty($sendmail_from_value)) {\n            //PHP config has a sender address we can use\n            $this->Sender = ini_get('sendmail_from');\n        }\n        //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n        if (!empty($this->Sender) && static::validateAddress($this->Sender) && self::isShellSafe($this->Sender)) {\n            if ($this->Mailer === 'qmail') {\n                $sendmailFmt = '%s -f%s';\n            } else {\n                $sendmailFmt = '%s -oi -f%s -t';\n            }\n        } else {\n            //allow sendmail to choose a default envelope sender. It may\n            //seem preferable to force it to use the From header as with\n            //SMTP, but that introduces new problems (see\n            //<https://github.com/PHPMailer/PHPMailer/issues/2298>), and\n            //it has historically worked this way.\n            $sendmailFmt = '%s -oi -t';\n        }\n\n        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);\n        $this->edebug('Sendmail path: ' . $this->Sendmail);\n        $this->edebug('Sendmail command: ' . $sendmail);\n        $this->edebug('Envelope sender: ' . $this->Sender);\n        $this->edebug(\"Headers: {$header}\");\n\n        if ($this->SingleTo) {\n            foreach ($this->SingleToArray as $toAddr) {\n                $mail = @popen($sendmail, 'w');\n                if (!$mail) {\n                    throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n                }\n                $this->edebug(\"To: {$toAddr}\");\n                fwrite($mail, 'To: ' . $toAddr . \"\\n\");\n                fwrite($mail, $header);\n                fwrite($mail, $body);\n                $result = pclose($mail);\n                $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet);\n                $this->doCallback(\n                    ($result === 0),\n                    [[$addrinfo['address'], $addrinfo['name']]],\n                    $this->cc,\n                    $this->bcc,\n                    $this->Subject,\n                    $body,\n                    $this->From,\n                    []\n                );\n                $this->edebug(\"Result: \" . ($result === 0 ? 'true' : 'false'));\n                if (0 !== $result) {\n                    throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n                }\n            }\n        } else {\n            $mail = @popen($sendmail, 'w');\n            if (!$mail) {\n                throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n            }\n            fwrite($mail, $header);\n            fwrite($mail, $body);\n            $result = pclose($mail);\n            $this->doCallback(\n                ($result === 0),\n                $this->to,\n                $this->cc,\n                $this->bcc,\n                $this->Subject,\n                $body,\n                $this->From,\n                []\n            );\n            $this->edebug(\"Result: \" . ($result === 0 ? 'true' : 'false'));\n            if (0 !== $result) {\n                throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.\n     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.\n     *\n     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report\n     *\n     * @param string $string The string to be validated\n     *\n     * @return bool\n     */\n    protected static function isShellSafe($string)\n    {\n        //It's not possible to use shell commands safely (which includes the mail() function) without escapeshellarg,\n        //but some hosting providers disable it, creating a security problem that we don't want to have to deal with,\n        //so we don't.\n        if (!function_exists('escapeshellarg') || !function_exists('escapeshellcmd')) {\n            return false;\n        }\n\n        if (\n            escapeshellcmd($string) !== $string\n            || !in_array(escapeshellarg($string), [\"'$string'\", \"\\\"$string\\\"\"])\n        ) {\n            return false;\n        }\n\n        $length = strlen($string);\n\n        for ($i = 0; $i < $length; ++$i) {\n            $c = $string[$i];\n\n            //All other characters have a special meaning in at least one common shell, including = and +.\n            //Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.\n            //Note that this does permit non-Latin alphanumeric characters based on the current locale.\n            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Check whether a file path is of a permitted type.\n     * Used to reject URLs and phar files from functions that access local file paths,\n     * such as addAttachment.\n     *\n     * @param string $path A relative or absolute path to a file\n     *\n     * @return bool\n     */\n    protected static function isPermittedPath($path)\n    {\n        //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1\n        return !preg_match('#^[a-z][a-z\\d+.-]*://#i', $path);\n    }\n\n    /**\n     * Check whether a file path is safe, accessible, and readable.\n     *\n     * @param string $path A relative or absolute path to a file\n     *\n     * @return bool\n     */\n    protected static function fileIsAccessible($path)\n    {\n        if (!static::isPermittedPath($path)) {\n            return false;\n        }\n        $readable = is_file($path);\n        //If not a UNC path (expected to start with \\\\), check read permission, see #2069\n        if (strpos($path, '\\\\\\\\') !== 0) {\n            $readable = $readable && is_readable($path);\n        }\n        return  $readable;\n    }\n\n    /**\n     * Send mail using the PHP mail() function.\n     *\n     * @see http://www.php.net/manual/en/book.mail.php\n     *\n     * @param string $header The message headers\n     * @param string $body   The message body\n     *\n     * @throws Exception\n     *\n     * @return bool\n     */\n    protected function mailSend($header, $body)\n    {\n        $header = static::stripTrailingWSP($header) . static::$LE . static::$LE;\n\n        $toArr = [];\n        foreach ($this->to as $toaddr) {\n            $toArr[] = $this->addrFormat($toaddr);\n        }\n        $to = trim(implode(', ', $toArr));\n\n        //If there are no To-addresses (e.g. when sending only to BCC-addresses)\n        //the following should be added to get a correct DKIM-signature.\n        //Compare with $this->preSend()\n        if ($to === '') {\n            $to = 'undisclosed-recipients:;';\n        }\n\n        $params = null;\n        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver\n        //A space after `-f` is optional, but there is a long history of its presence\n        //causing problems, so we don't use one\n        //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html\n        //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html\n        //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html\n        //Example problem: https://www.drupal.org/node/1057954\n        //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n\n        //PHP 5.6 workaround\n        $sendmail_from_value = ini_get('sendmail_from');\n        if (empty($this->Sender) && !empty($sendmail_from_value)) {\n            //PHP config has a sender address we can use\n            $this->Sender = ini_get('sendmail_from');\n        }\n        if (!empty($this->Sender) && static::validateAddress($this->Sender)) {\n            if (self::isShellSafe($this->Sender)) {\n                $params = sprintf('-f%s', $this->Sender);\n            }\n            $old_from = ini_get('sendmail_from');\n            ini_set('sendmail_from', $this->Sender);\n        }\n        $result = false;\n        if ($this->SingleTo && count($toArr) > 1) {\n            foreach ($toArr as $toAddr) {\n                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);\n                $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet);\n                $this->doCallback(\n                    $result,\n                    [[$addrinfo['address'], $addrinfo['name']]],\n                    $this->cc,\n                    $this->bcc,\n                    $this->Subject,\n                    $body,\n                    $this->From,\n                    []\n                );\n            }\n        } else {\n            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);\n            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From, []);\n        }\n        if (isset($old_from)) {\n            ini_set('sendmail_from', $old_from);\n        }\n        if (!$result) {\n            throw new Exception($this->lang('instantiate'), self::STOP_CRITICAL);\n        }\n\n        return true;\n    }\n\n    /**\n     * Get an instance to use for SMTP operations.\n     * Override this function to load your own SMTP implementation,\n     * or set one with setSMTPInstance.\n     *\n     * @return SMTP\n     */\n    public function getSMTPInstance()\n    {\n        if (!is_object($this->smtp)) {\n            $this->smtp = new SMTP();\n        }\n\n        return $this->smtp;\n    }\n\n    /**\n     * Provide an instance to use for SMTP operations.\n     *\n     * @return SMTP\n     */\n    public function setSMTPInstance(SMTP $smtp)\n    {\n        $this->smtp = $smtp;\n\n        return $this->smtp;\n    }\n\n    /**\n     * Send mail via SMTP.\n     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.\n     *\n     * @see PHPMailer::setSMTPInstance() to use a different class.\n     *\n     * @uses \\PHPMailer\\PHPMailer\\SMTP\n     *\n     * @param string $header The message headers\n     * @param string $body   The message body\n     *\n     * @throws Exception\n     *\n     * @return bool\n     */\n    protected function smtpSend($header, $body)\n    {\n        $header = static::stripTrailingWSP($header) . static::$LE . static::$LE;\n        $bad_rcpt = [];\n        if (!$this->smtpConnect($this->SMTPOptions)) {\n            throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);\n        }\n        //Sender already validated in preSend()\n        if ('' === $this->Sender) {\n            $smtp_from = $this->From;\n        } else {\n            $smtp_from = $this->Sender;\n        }\n        if (!$this->smtp->mail($smtp_from)) {\n            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));\n            throw new Exception($this->ErrorInfo, self::STOP_CRITICAL);\n        }\n\n        $callbacks = [];\n        //Attempt to send to all recipients\n        foreach ([$this->to, $this->cc, $this->bcc] as $togroup) {\n            foreach ($togroup as $to) {\n                if (!$this->smtp->recipient($to[0], $this->dsn)) {\n                    $error = $this->smtp->getError();\n                    $bad_rcpt[] = ['to' => $to[0], 'error' => $error['detail']];\n                    $isSent = false;\n                } else {\n                    $isSent = true;\n                }\n\n                $callbacks[] = ['issent' => $isSent, 'to' => $to[0], 'name' => $to[1]];\n            }\n        }\n\n        //Only send the DATA command if we have viable recipients\n        if ((count($this->all_recipients) > count($bad_rcpt)) && !$this->smtp->data($header . $body)) {\n            throw new Exception($this->lang('data_not_accepted'), self::STOP_CRITICAL);\n        }\n\n        $smtp_transaction_id = $this->smtp->getLastTransactionID();\n\n        if ($this->SMTPKeepAlive) {\n            $this->smtp->reset();\n        } else {\n            $this->smtp->quit();\n            $this->smtp->close();\n        }\n\n        foreach ($callbacks as $cb) {\n            $this->doCallback(\n                $cb['issent'],\n                [[$cb['to'], $cb['name']]],\n                [],\n                [],\n                $this->Subject,\n                $body,\n                $this->From,\n                ['smtp_transaction_id' => $smtp_transaction_id]\n            );\n        }\n\n        //Create error message for any bad addresses\n        if (count($bad_rcpt) > 0) {\n            $errstr = '';\n            foreach ($bad_rcpt as $bad) {\n                $errstr .= $bad['to'] . ': ' . $bad['error'];\n            }\n            throw new Exception($this->lang('recipients_failed') . $errstr, self::STOP_CONTINUE);\n        }\n\n        return true;\n    }\n\n    /**\n     * Initiate a connection to an SMTP server.\n     * Returns false if the operation failed.\n     *\n     * @param array $options An array of options compatible with stream_context_create()\n     *\n     * @throws Exception\n     *\n     * @uses \\PHPMailer\\PHPMailer\\SMTP\n     *\n     * @return bool\n     */\n    public function smtpConnect($options = null)\n    {\n        if (null === $this->smtp) {\n            $this->smtp = $this->getSMTPInstance();\n        }\n\n        //If no options are provided, use whatever is set in the instance\n        if (null === $options) {\n            $options = $this->SMTPOptions;\n        }\n\n        //Already connected?\n        if ($this->smtp->connected()) {\n            return true;\n        }\n\n        $this->smtp->setTimeout($this->Timeout);\n        $this->smtp->setDebugLevel($this->SMTPDebug);\n        $this->smtp->setDebugOutput($this->Debugoutput);\n        $this->smtp->setVerp($this->do_verp);\n        if ($this->Host === null) {\n            $this->Host = 'localhost';\n        }\n        $hosts = explode(';', $this->Host);\n        $lastexception = null;\n\n        foreach ($hosts as $hostentry) {\n            $hostinfo = [];\n            if (\n                !preg_match(\n                    '/^(?:(ssl|tls):\\/\\/)?(.+?)(?::(\\d+))?$/',\n                    trim($hostentry),\n                    $hostinfo\n                )\n            ) {\n                $this->edebug($this->lang('invalid_hostentry') . ' ' . trim($hostentry));\n                //Not a valid host entry\n                continue;\n            }\n            //$hostinfo[1]: optional ssl or tls prefix\n            //$hostinfo[2]: the hostname\n            //$hostinfo[3]: optional port number\n            //The host string prefix can temporarily override the current setting for SMTPSecure\n            //If it's not specified, the default value is used\n\n            //Check the host name is a valid name or IP address before trying to use it\n            if (!static::isValidHost($hostinfo[2])) {\n                $this->edebug($this->lang('invalid_host') . ' ' . $hostinfo[2]);\n                continue;\n            }\n            $prefix = '';\n            $secure = $this->SMTPSecure;\n            $tls = (static::ENCRYPTION_STARTTLS === $this->SMTPSecure);\n            if ('ssl' === $hostinfo[1] || ('' === $hostinfo[1] && static::ENCRYPTION_SMTPS === $this->SMTPSecure)) {\n                $prefix = 'ssl://';\n                $tls = false; //Can't have SSL and TLS at the same time\n                $secure = static::ENCRYPTION_SMTPS;\n            } elseif ('tls' === $hostinfo[1]) {\n                $tls = true;\n                //TLS doesn't use a prefix\n                $secure = static::ENCRYPTION_STARTTLS;\n            }\n            //Do we need the OpenSSL extension?\n            $sslext = defined('OPENSSL_ALGO_SHA256');\n            if (static::ENCRYPTION_STARTTLS === $secure || static::ENCRYPTION_SMTPS === $secure) {\n                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n                if (!$sslext) {\n                    throw new Exception($this->lang('extension_missing') . 'openssl', self::STOP_CRITICAL);\n                }\n            }\n            $host = $hostinfo[2];\n            $port = $this->Port;\n            if (\n                array_key_exists(3, $hostinfo) &&\n                is_numeric($hostinfo[3]) &&\n                $hostinfo[3] > 0 &&\n                $hostinfo[3] < 65536\n            ) {\n                $port = (int) $hostinfo[3];\n            }\n            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n                try {\n                    if ($this->Helo) {\n                        $hello = $this->Helo;\n                    } else {\n                        $hello = $this->serverHostname();\n                    }\n                    $this->smtp->hello($hello);\n                    //Automatically enable TLS encryption if:\n                    //* it's not disabled\n                    //* we have openssl extension\n                    //* we are not already using SSL\n                    //* the server offers STARTTLS\n                    if ($this->SMTPAutoTLS && $sslext && 'ssl' !== $secure && $this->smtp->getServerExt('STARTTLS')) {\n                        $tls = true;\n                    }\n                    if ($tls) {\n                        if (!$this->smtp->startTLS()) {\n                            $message = $this->getSmtpErrorMessage('connect_host');\n                            throw new Exception($message);\n                        }\n                        //We must resend EHLO after TLS negotiation\n                        $this->smtp->hello($hello);\n                    }\n                    if (\n                        $this->SMTPAuth && !$this->smtp->authenticate(\n                            $this->Username,\n                            $this->Password,\n                            $this->AuthType,\n                            $this->oauth\n                        )\n                    ) {\n                        throw new Exception($this->lang('authenticate'));\n                    }\n\n                    return true;\n                } catch (Exception $exc) {\n                    $lastexception = $exc;\n                    $this->edebug($exc->getMessage());\n                    //We must have connected, but then failed TLS or Auth, so close connection nicely\n                    $this->smtp->quit();\n                }\n            }\n        }\n        //If we get here, all connection attempts have failed, so close connection hard\n        $this->smtp->close();\n        //As we've caught all exceptions, just report whatever the last one was\n        if ($this->exceptions && null !== $lastexception) {\n            throw $lastexception;\n        }\n        if ($this->exceptions) {\n            // no exception was thrown, likely $this->smtp->connect() failed\n            $message = $this->getSmtpErrorMessage('connect_host');\n            throw new Exception($message);\n        }\n\n        return false;\n    }\n\n    /**\n     * Close the active SMTP session if one exists.\n     */\n    public function smtpClose()\n    {\n        if ((null !== $this->smtp) && $this->smtp->connected()) {\n            $this->smtp->quit();\n            $this->smtp->close();\n        }\n    }\n\n    /**\n     * Set the language for error messages.\n     * The default language is English.\n     *\n     * @param string $langcode  ISO 639-1 2-character language code (e.g. French is \"fr\")\n     *                          Optionally, the language code can be enhanced with a 4-character\n     *                          script annotation and/or a 2-character country annotation.\n     * @param string $lang_path Path to the language file directory, with trailing separator (slash)\n     *                          Do not set this from user input!\n     *\n     * @return bool Returns true if the requested language was loaded, false otherwise.\n     */\n    public function setLanguage($langcode = 'en', $lang_path = '')\n    {\n        //Backwards compatibility for renamed language codes\n        $renamed_langcodes = [\n            'br' => 'pt_br',\n            'cz' => 'cs',\n            'dk' => 'da',\n            'no' => 'nb',\n            'se' => 'sv',\n            'rs' => 'sr',\n            'tg' => 'tl',\n            'am' => 'hy',\n        ];\n\n        if (array_key_exists($langcode, $renamed_langcodes)) {\n            $langcode = $renamed_langcodes[$langcode];\n        }\n\n        //Define full set of translatable strings in English\n        $PHPMAILER_LANG = [\n            'authenticate' => 'SMTP Error: Could not authenticate.',\n            'buggy_php' => 'Your version of PHP is affected by a bug that may result in corrupted messages.' .\n                ' To fix it, switch to sending using SMTP, disable the mail.add_x_header option in' .\n                ' your php.ini, switch to MacOS or Linux, or upgrade your PHP to version 7.0.17+ or 7.1.3+.',\n            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',\n            'data_not_accepted' => 'SMTP Error: data not accepted.',\n            'empty_message' => 'Message body empty',\n            'encoding' => 'Unknown encoding: ',\n            'execute' => 'Could not execute: ',\n            'extension_missing' => 'Extension missing: ',\n            'file_access' => 'Could not access file: ',\n            'file_open' => 'File Error: Could not open file: ',\n            'from_failed' => 'The following From address failed: ',\n            'instantiate' => 'Could not instantiate mail function.',\n            'invalid_address' => 'Invalid address: ',\n            'invalid_header' => 'Invalid header name or value',\n            'invalid_hostentry' => 'Invalid hostentry: ',\n            'invalid_host' => 'Invalid host: ',\n            'mailer_not_supported' => ' mailer is not supported.',\n            'provide_address' => 'You must provide at least one recipient email address.',\n            'recipients_failed' => 'SMTP Error: The following recipients failed: ',\n            'signing' => 'Signing Error: ',\n            'smtp_code' => 'SMTP code: ',\n            'smtp_code_ex' => 'Additional SMTP info: ',\n            'smtp_connect_failed' => 'SMTP connect() failed.',\n            'smtp_detail' => 'Detail: ',\n            'smtp_error' => 'SMTP server error: ',\n            'variable_set' => 'Cannot set or reset variable: ',\n        ];\n        if (empty($lang_path)) {\n            //Calculate an absolute path so it can work if CWD is not here\n            $lang_path = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR;\n        }\n\n        //Validate $langcode\n        $foundlang = true;\n        $langcode  = strtolower($langcode);\n        if (\n            !preg_match('/^(?P<lang>[a-z]{2})(?P<script>_[a-z]{4})?(?P<country>_[a-z]{2})?$/', $langcode, $matches)\n            && $langcode !== 'en'\n        ) {\n            $foundlang = false;\n            $langcode = 'en';\n        }\n\n        //There is no English translation file\n        if ('en' !== $langcode) {\n            $langcodes = [];\n            if (!empty($matches['script']) && !empty($matches['country'])) {\n                $langcodes[] = $matches['lang'] . $matches['script'] . $matches['country'];\n            }\n            if (!empty($matches['country'])) {\n                $langcodes[] = $matches['lang'] . $matches['country'];\n            }\n            if (!empty($matches['script'])) {\n                $langcodes[] = $matches['lang'] . $matches['script'];\n            }\n            $langcodes[] = $matches['lang'];\n\n            //Try and find a readable language file for the requested language.\n            $foundFile = false;\n            foreach ($langcodes as $code) {\n                $lang_file = $lang_path . 'phpmailer.lang-' . $code . '.php';\n                if (static::fileIsAccessible($lang_file)) {\n                    $foundFile = true;\n                    break;\n                }\n            }\n\n            if ($foundFile === false) {\n                $foundlang = false;\n            } else {\n                $lines = file($lang_file);\n                foreach ($lines as $line) {\n                    //Translation file lines look like this:\n                    //$PHPMAILER_LANG['authenticate'] = 'SMTP-Fehler: Authentifizierung fehlgeschlagen.';\n                    //These files are parsed as text and not PHP so as to avoid the possibility of code injection\n                    //See https://blog.stevenlevithan.com/archives/match-quoted-string\n                    $matches = [];\n                    if (\n                        preg_match(\n                            '/^\\$PHPMAILER_LANG\\[\\'([a-z\\d_]+)\\'\\]\\s*=\\s*([\"\\'])(.+)*?\\2;/',\n                            $line,\n                            $matches\n                        ) &&\n                        //Ignore unknown translation keys\n                        array_key_exists($matches[1], $PHPMAILER_LANG)\n                    ) {\n                        //Overwrite language-specific strings so we'll never have missing translation keys.\n                        $PHPMAILER_LANG[$matches[1]] = (string)$matches[3];\n                    }\n                }\n            }\n        }\n        $this->language = $PHPMAILER_LANG;\n\n        return $foundlang; //Returns false if language not found\n    }\n\n    /**\n     * Get the array of strings for the current language.\n     *\n     * @return array\n     */\n    public function getTranslations()\n    {\n        if (empty($this->language)) {\n            $this->setLanguage(); // Set the default language.\n        }\n\n        return $this->language;\n    }\n\n    /**\n     * Create recipient headers.\n     *\n     * @param string $type\n     * @param array  $addr An array of recipients,\n     *                     where each recipient is a 2-element indexed array with element 0 containing an address\n     *                     and element 1 containing a name, like:\n     *                     [['joe@example.com', 'Joe User'], ['zoe@example.com', 'Zoe User']]\n     *\n     * @return string\n     */\n    public function addrAppend($type, $addr)\n    {\n        $addresses = [];\n        foreach ($addr as $address) {\n            $addresses[] = $this->addrFormat($address);\n        }\n\n        return $type . ': ' . implode(', ', $addresses) . static::$LE;\n    }\n\n    /**\n     * Format an address for use in a message header.\n     *\n     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name like\n     *                    ['joe@example.com', 'Joe User']\n     *\n     * @return string\n     */\n    public function addrFormat($addr)\n    {\n        if (!isset($addr[1]) || ($addr[1] === '')) { //No name provided\n            return $this->secureHeader($addr[0]);\n        }\n\n        return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') .\n            ' <' . $this->secureHeader($addr[0]) . '>';\n    }\n\n    /**\n     * Word-wrap message.\n     * For use with mailers that do not automatically perform wrapping\n     * and for quoted-printable encoded messages.\n     * Original written by philippe.\n     *\n     * @param string $message The message to wrap\n     * @param int    $length  The line length to wrap to\n     * @param bool   $qp_mode Whether to run in Quoted-Printable mode\n     *\n     * @return string\n     */\n    public function wrapText($message, $length, $qp_mode = false)\n    {\n        if ($qp_mode) {\n            $soft_break = sprintf(' =%s', static::$LE);\n        } else {\n            $soft_break = static::$LE;\n        }\n        //If utf-8 encoding is used, we will need to make sure we don't\n        //split multibyte characters when we wrap\n        $is_utf8 = static::CHARSET_UTF8 === strtolower($this->CharSet);\n        $lelen = strlen(static::$LE);\n        $crlflen = strlen(static::$LE);\n\n        $message = static::normalizeBreaks($message);\n        //Remove a trailing line break\n        if (substr($message, -$lelen) === static::$LE) {\n            $message = substr($message, 0, -$lelen);\n        }\n\n        //Split message into lines\n        $lines = explode(static::$LE, $message);\n        //Message will be rebuilt in here\n        $message = '';\n        foreach ($lines as $line) {\n            $words = explode(' ', $line);\n            $buf = '';\n            $firstword = true;\n            foreach ($words as $word) {\n                if ($qp_mode && (strlen($word) > $length)) {\n                    $space_left = $length - strlen($buf) - $crlflen;\n                    if (!$firstword) {\n                        if ($space_left > 20) {\n                            $len = $space_left;\n                            if ($is_utf8) {\n                                $len = $this->utf8CharBoundary($word, $len);\n                            } elseif ('=' === substr($word, $len - 1, 1)) {\n                                --$len;\n                            } elseif ('=' === substr($word, $len - 2, 1)) {\n                                $len -= 2;\n                            }\n                            $part = substr($word, 0, $len);\n                            $word = substr($word, $len);\n                            $buf .= ' ' . $part;\n                            $message .= $buf . sprintf('=%s', static::$LE);\n                        } else {\n                            $message .= $buf . $soft_break;\n                        }\n                        $buf = '';\n                    }\n                    while ($word !== '') {\n                        if ($length <= 0) {\n                            break;\n                        }\n                        $len = $length;\n                        if ($is_utf8) {\n                            $len = $this->utf8CharBoundary($word, $len);\n                        } elseif ('=' === substr($word, $len - 1, 1)) {\n                            --$len;\n                        } elseif ('=' === substr($word, $len - 2, 1)) {\n                            $len -= 2;\n                        }\n                        $part = substr($word, 0, $len);\n                        $word = (string) substr($word, $len);\n\n                        if ($word !== '') {\n                            $message .= $part . sprintf('=%s', static::$LE);\n                        } else {\n                            $buf = $part;\n                        }\n                    }\n                } else {\n                    $buf_o = $buf;\n                    if (!$firstword) {\n                        $buf .= ' ';\n                    }\n                    $buf .= $word;\n\n                    if ('' !== $buf_o && strlen($buf) > $length) {\n                        $message .= $buf_o . $soft_break;\n                        $buf = $word;\n                    }\n                }\n                $firstword = false;\n            }\n            $message .= $buf . static::$LE;\n        }\n\n        return $message;\n    }\n\n    /**\n     * Find the last character boundary prior to $maxLength in a utf-8\n     * quoted-printable encoded string.\n     * Original written by Colin Brown.\n     *\n     * @param string $encodedText utf-8 QP text\n     * @param int    $maxLength   Find the last character boundary prior to this length\n     *\n     * @return int\n     */\n    public function utf8CharBoundary($encodedText, $maxLength)\n    {\n        $foundSplitPos = false;\n        $lookBack = 3;\n        while (!$foundSplitPos) {\n            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);\n            $encodedCharPos = strpos($lastChunk, '=');\n            if (false !== $encodedCharPos) {\n                //Found start of encoded character byte within $lookBack block.\n                //Check the encoded byte value (the 2 chars after the '=')\n                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);\n                $dec = hexdec($hex);\n                if ($dec < 128) {\n                    //Single byte character.\n                    //If the encoded char was found at pos 0, it will fit\n                    //otherwise reduce maxLength to start of the encoded char\n                    if ($encodedCharPos > 0) {\n                        $maxLength -= $lookBack - $encodedCharPos;\n                    }\n                    $foundSplitPos = true;\n                } elseif ($dec >= 192) {\n                    //First byte of a multi byte character\n                    //Reduce maxLength to split at start of character\n                    $maxLength -= $lookBack - $encodedCharPos;\n                    $foundSplitPos = true;\n                } elseif ($dec < 192) {\n                    //Middle byte of a multi byte character, look further back\n                    $lookBack += 3;\n                }\n            } else {\n                //No encoded character found\n                $foundSplitPos = true;\n            }\n        }\n\n        return $maxLength;\n    }\n\n    /**\n     * Apply word wrapping to the message body.\n     * Wraps the message body to the number of chars set in the WordWrap property.\n     * You should only do this to plain-text bodies as wrapping HTML tags may break them.\n     * This is called automatically by createBody(), so you don't need to call it yourself.\n     */\n    public function setWordWrap()\n    {\n        if ($this->WordWrap < 1) {\n            return;\n        }\n\n        switch ($this->message_type) {\n            case 'alt':\n            case 'alt_inline':\n            case 'alt_attach':\n            case 'alt_inline_attach':\n                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);\n                break;\n            default:\n                $this->Body = $this->wrapText($this->Body, $this->WordWrap);\n                break;\n        }\n    }\n\n    /**\n     * Assemble message headers.\n     *\n     * @return string The assembled headers\n     */\n    public function createHeader()\n    {\n        $result = '';\n\n        $result .= $this->headerLine('Date', '' === $this->MessageDate ? self::rfcDate() : $this->MessageDate);\n\n        //The To header is created automatically by mail(), so needs to be omitted here\n        if ('mail' !== $this->Mailer) {\n            if ($this->SingleTo) {\n                foreach ($this->to as $toaddr) {\n                    $this->SingleToArray[] = $this->addrFormat($toaddr);\n                }\n            } elseif (count($this->to) > 0) {\n                $result .= $this->addrAppend('To', $this->to);\n            } elseif (count($this->cc) === 0) {\n                $result .= $this->headerLine('To', 'undisclosed-recipients:;');\n            }\n        }\n        $result .= $this->addrAppend('From', [[trim($this->From), $this->FromName]]);\n\n        //sendmail and mail() extract Cc from the header before sending\n        if (count($this->cc) > 0) {\n            $result .= $this->addrAppend('Cc', $this->cc);\n        }\n\n        //sendmail and mail() extract Bcc from the header before sending\n        if (\n            (\n                'sendmail' === $this->Mailer || 'qmail' === $this->Mailer || 'mail' === $this->Mailer\n            )\n            && count($this->bcc) > 0\n        ) {\n            $result .= $this->addrAppend('Bcc', $this->bcc);\n        }\n\n        if (count($this->ReplyTo) > 0) {\n            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);\n        }\n\n        //mail() sets the subject itself\n        if ('mail' !== $this->Mailer) {\n            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));\n        }\n\n        //Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4\n        //https://tools.ietf.org/html/rfc5322#section-3.6.4\n        if (\n            '' !== $this->MessageID &&\n            preg_match(\n                '/^<((([a-z\\d!#$%&\\'*+\\/=?^_`{|}~-]+(\\.[a-z\\d!#$%&\\'*+\\/=?^_`{|}~-]+)*)' .\n                '|(\"(([\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]|[\\x21\\x23-\\x5B\\x5D-\\x7E])' .\n                '|(\\\\[\\x01-\\x09\\x0B\\x0C\\x0E-\\x7F]))*\"))@(([a-z\\d!#$%&\\'*+\\/=?^_`{|}~-]+' .\n                '(\\.[a-z\\d!#$%&\\'*+\\/=?^_`{|}~-]+)*)|(\\[(([\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]' .\n                '|[\\x21-\\x5A\\x5E-\\x7E])|(\\\\[\\x01-\\x09\\x0B\\x0C\\x0E-\\x7F]))*\\])))>$/Di',\n                $this->MessageID\n            )\n        ) {\n            $this->lastMessageID = $this->MessageID;\n        } else {\n            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());\n        }\n        $result .= $this->headerLine('Message-ID', $this->lastMessageID);\n        if (null !== $this->Priority) {\n            $result .= $this->headerLine('X-Priority', $this->Priority);\n        }\n        if ('' === $this->XMailer) {\n            //Empty string for default X-Mailer header\n            $result .= $this->headerLine(\n                'X-Mailer',\n                'PHPMailer ' . self::VERSION . ' (https://github.com/PHPMailer/PHPMailer)'\n            );\n        } elseif (is_string($this->XMailer) && trim($this->XMailer) !== '') {\n            //Some string\n            $result .= $this->headerLine('X-Mailer', trim($this->XMailer));\n        } //Other values result in no X-Mailer header\n\n        if ('' !== $this->ConfirmReadingTo) {\n            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');\n        }\n\n        //Add custom headers\n        foreach ($this->CustomHeader as $header) {\n            $result .= $this->headerLine(\n                trim($header[0]),\n                $this->encodeHeader(trim($header[1]))\n            );\n        }\n        if (!$this->sign_key_file) {\n            $result .= $this->headerLine('MIME-Version', '1.0');\n            $result .= $this->getMailMIME();\n        }\n\n        return $result;\n    }\n\n    /**\n     * Get the message MIME type headers.\n     *\n     * @return string\n     */\n    public function getMailMIME()\n    {\n        $result = '';\n        $ismultipart = true;\n        switch ($this->message_type) {\n            case 'inline':\n                $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';');\n                $result .= $this->textLine(' boundary=\"' . $this->boundary[1] . '\"');\n                break;\n            case 'attach':\n            case 'inline_attach':\n            case 'alt_attach':\n            case 'alt_inline_attach':\n                $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_MIXED . ';');\n                $result .= $this->textLine(' boundary=\"' . $this->boundary[1] . '\"');\n                break;\n            case 'alt':\n            case 'alt_inline':\n                $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';');\n                $result .= $this->textLine(' boundary=\"' . $this->boundary[1] . '\"');\n                break;\n            default:\n                //Catches case 'plain': and case '':\n                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);\n                $ismultipart = false;\n                break;\n        }\n        //RFC1341 part 5 says 7bit is assumed if not specified\n        if (static::ENCODING_7BIT !== $this->Encoding) {\n            //RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE\n            if ($ismultipart) {\n                if (static::ENCODING_8BIT === $this->Encoding) {\n                    $result .= $this->headerLine('Content-Transfer-Encoding', static::ENCODING_8BIT);\n                }\n                //The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible\n            } else {\n                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);\n            }\n        }\n\n        return $result;\n    }\n\n    /**\n     * Returns the whole MIME message.\n     * Includes complete headers and body.\n     * Only valid post preSend().\n     *\n     * @see PHPMailer::preSend()\n     *\n     * @return string\n     */\n    public function getSentMIMEMessage()\n    {\n        return static::stripTrailingWSP($this->MIMEHeader . $this->mailHeader) .\n            static::$LE . static::$LE . $this->MIMEBody;\n    }\n\n    /**\n     * Create a unique ID to use for boundaries.\n     *\n     * @return string\n     */\n    protected function generateId()\n    {\n        $len = 32; //32 bytes = 256 bits\n        $bytes = '';\n        if (function_exists('random_bytes')) {\n            try {\n                $bytes = random_bytes($len);\n            } catch (\\Exception $e) {\n                //Do nothing\n            }\n        } elseif (function_exists('openssl_random_pseudo_bytes')) {\n            /** @noinspection CryptographicallySecureRandomnessInspection */\n            $bytes = openssl_random_pseudo_bytes($len);\n        }\n        if ($bytes === '') {\n            //We failed to produce a proper random string, so make do.\n            //Use a hash to force the length to the same as the other methods\n            $bytes = hash('sha256', uniqid((string) mt_rand(), true), true);\n        }\n\n        //We don't care about messing up base64 format here, just want a random string\n        return str_replace(['=', '+', '/'], '', base64_encode(hash('sha256', $bytes, true)));\n    }\n\n    /**\n     * Assemble the message body.\n     * Returns an empty string on failure.\n     *\n     * @throws Exception\n     *\n     * @return string The assembled message body\n     */\n    public function createBody()\n    {\n        $body = '';\n        //Create unique IDs and preset boundaries\n        $this->setBoundaries();\n\n        if ($this->sign_key_file) {\n            $body .= $this->getMailMIME() . static::$LE;\n        }\n\n        $this->setWordWrap();\n\n        $bodyEncoding = $this->Encoding;\n        $bodyCharSet = $this->CharSet;\n        //Can we do a 7-bit downgrade?\n        if (static::ENCODING_8BIT === $bodyEncoding && !$this->has8bitChars($this->Body)) {\n            $bodyEncoding = static::ENCODING_7BIT;\n            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n            $bodyCharSet = static::CHARSET_ASCII;\n        }\n        //If lines are too long, and we're not already using an encoding that will shorten them,\n        //change to quoted-printable transfer encoding for the body part only\n        if (static::ENCODING_BASE64 !== $this->Encoding && static::hasLineLongerThanMax($this->Body)) {\n            $bodyEncoding = static::ENCODING_QUOTED_PRINTABLE;\n        }\n\n        $altBodyEncoding = $this->Encoding;\n        $altBodyCharSet = $this->CharSet;\n        //Can we do a 7-bit downgrade?\n        if (static::ENCODING_8BIT === $altBodyEncoding && !$this->has8bitChars($this->AltBody)) {\n            $altBodyEncoding = static::ENCODING_7BIT;\n            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n            $altBodyCharSet = static::CHARSET_ASCII;\n        }\n        //If lines are too long, and we're not already using an encoding that will shorten them,\n        //change to quoted-printable transfer encoding for the alt body part only\n        if (static::ENCODING_BASE64 !== $altBodyEncoding && static::hasLineLongerThanMax($this->AltBody)) {\n            $altBodyEncoding = static::ENCODING_QUOTED_PRINTABLE;\n        }\n        //Use this as a preamble in all multipart message types\n        $mimepre = '';\n        switch ($this->message_type) {\n            case 'inline':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= static::$LE;\n                $body .= $this->attachAll('inline', $this->boundary[1]);\n                break;\n            case 'attach':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= static::$LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'inline_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';');\n                $body .= $this->textLine(' boundary=\"' . $this->boundary[2] . '\";');\n                $body .= $this->textLine(' type=\"' . static::CONTENT_TYPE_TEXT_HTML . '\"');\n                $body .= static::$LE;\n                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= static::$LE;\n                $body .= $this->attachAll('inline', $this->boundary[2]);\n                $body .= static::$LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'alt':\n                $body .= $mimepre;\n                $body .= $this->getBoundary(\n                    $this->boundary[1],\n                    $altBodyCharSet,\n                    static::CONTENT_TYPE_PLAINTEXT,\n                    $altBodyEncoding\n                );\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= static::$LE;\n                $body .= $this->getBoundary(\n                    $this->boundary[1],\n                    $bodyCharSet,\n                    static::CONTENT_TYPE_TEXT_HTML,\n                    $bodyEncoding\n                );\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= static::$LE;\n                if (!empty($this->Ical)) {\n                    $method = static::ICAL_METHOD_REQUEST;\n                    foreach (static::$IcalMethods as $imethod) {\n                        if (stripos($this->Ical, 'METHOD:' . $imethod) !== false) {\n                            $method = $imethod;\n                            break;\n                        }\n                    }\n                    $body .= $this->getBoundary(\n                        $this->boundary[1],\n                        '',\n                        static::CONTENT_TYPE_TEXT_CALENDAR . '; method=' . $method,\n                        ''\n                    );\n                    $body .= $this->encodeString($this->Ical, $this->Encoding);\n                    $body .= static::$LE;\n                }\n                $body .= $this->endBoundary($this->boundary[1]);\n                break;\n            case 'alt_inline':\n                $body .= $mimepre;\n                $body .= $this->getBoundary(\n                    $this->boundary[1],\n                    $altBodyCharSet,\n                    static::CONTENT_TYPE_PLAINTEXT,\n                    $altBodyEncoding\n                );\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= static::$LE;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';');\n                $body .= $this->textLine(' boundary=\"' . $this->boundary[2] . '\";');\n                $body .= $this->textLine(' type=\"' . static::CONTENT_TYPE_TEXT_HTML . '\"');\n                $body .= static::$LE;\n                $body .= $this->getBoundary(\n                    $this->boundary[2],\n                    $bodyCharSet,\n                    static::CONTENT_TYPE_TEXT_HTML,\n                    $bodyEncoding\n                );\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= static::$LE;\n                $body .= $this->attachAll('inline', $this->boundary[2]);\n                $body .= static::$LE;\n                $body .= $this->endBoundary($this->boundary[1]);\n                break;\n            case 'alt_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';');\n                $body .= $this->textLine(' boundary=\"' . $this->boundary[2] . '\"');\n                $body .= static::$LE;\n                $body .= $this->getBoundary(\n                    $this->boundary[2],\n                    $altBodyCharSet,\n                    static::CONTENT_TYPE_PLAINTEXT,\n                    $altBodyEncoding\n                );\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= static::$LE;\n                $body .= $this->getBoundary(\n                    $this->boundary[2],\n                    $bodyCharSet,\n                    static::CONTENT_TYPE_TEXT_HTML,\n                    $bodyEncoding\n                );\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= static::$LE;\n                if (!empty($this->Ical)) {\n                    $method = static::ICAL_METHOD_REQUEST;\n                    foreach (static::$IcalMethods as $imethod) {\n                        if (stripos($this->Ical, 'METHOD:' . $imethod) !== false) {\n                            $method = $imethod;\n                            break;\n                        }\n                    }\n                    $body .= $this->getBoundary(\n                        $this->boundary[2],\n                        '',\n                        static::CONTENT_TYPE_TEXT_CALENDAR . '; method=' . $method,\n                        ''\n                    );\n                    $body .= $this->encodeString($this->Ical, $this->Encoding);\n                }\n                $body .= $this->endBoundary($this->boundary[2]);\n                $body .= static::$LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'alt_inline_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';');\n                $body .= $this->textLine(' boundary=\"' . $this->boundary[2] . '\"');\n                $body .= static::$LE;\n                $body .= $this->getBoundary(\n                    $this->boundary[2],\n                    $altBodyCharSet,\n                    static::CONTENT_TYPE_PLAINTEXT,\n                    $altBodyEncoding\n                );\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= static::$LE;\n                $body .= $this->textLine('--' . $this->boundary[2]);\n                $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';');\n                $body .= $this->textLine(' boundary=\"' . $this->boundary[3] . '\";');\n                $body .= $this->textLine(' type=\"' . static::CONTENT_TYPE_TEXT_HTML . '\"');\n                $body .= static::$LE;\n                $body .= $this->getBoundary(\n                    $this->boundary[3],\n                    $bodyCharSet,\n                    static::CONTENT_TYPE_TEXT_HTML,\n                    $bodyEncoding\n                );\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= static::$LE;\n                $body .= $this->attachAll('inline', $this->boundary[3]);\n                $body .= static::$LE;\n                $body .= $this->endBoundary($this->boundary[2]);\n                $body .= static::$LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            default:\n                //Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types\n                //Reset the `Encoding` property in case we changed it for line length reasons\n                $this->Encoding = $bodyEncoding;\n                $body .= $this->encodeString($this->Body, $this->Encoding);\n                break;\n        }\n\n        if ($this->isError()) {\n            $body = '';\n            if ($this->exceptions) {\n                throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL);\n            }\n        } elseif ($this->sign_key_file) {\n            try {\n                if (!defined('PKCS7_TEXT')) {\n                    throw new Exception($this->lang('extension_missing') . 'openssl');\n                }\n\n                $file = tempnam(sys_get_temp_dir(), 'srcsign');\n                $signed = tempnam(sys_get_temp_dir(), 'mailsign');\n                file_put_contents($file, $body);\n\n                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197\n                if (empty($this->sign_extracerts_file)) {\n                    $sign = @openssl_pkcs7_sign(\n                        $file,\n                        $signed,\n                        'file://' . realpath($this->sign_cert_file),\n                        ['file://' . realpath($this->sign_key_file), $this->sign_key_pass],\n                        []\n                    );\n                } else {\n                    $sign = @openssl_pkcs7_sign(\n                        $file,\n                        $signed,\n                        'file://' . realpath($this->sign_cert_file),\n                        ['file://' . realpath($this->sign_key_file), $this->sign_key_pass],\n                        [],\n                        PKCS7_DETACHED,\n                        $this->sign_extracerts_file\n                    );\n                }\n\n                @unlink($file);\n                if ($sign) {\n                    $body = file_get_contents($signed);\n                    @unlink($signed);\n                    //The message returned by openssl contains both headers and body, so need to split them up\n                    $parts = explode(\"\\n\\n\", $body, 2);\n                    $this->MIMEHeader .= $parts[0] . static::$LE . static::$LE;\n                    $body = $parts[1];\n                } else {\n                    @unlink($signed);\n                    throw new Exception($this->lang('signing') . openssl_error_string());\n                }\n            } catch (Exception $exc) {\n                $body = '';\n                if ($this->exceptions) {\n                    throw $exc;\n                }\n            }\n        }\n\n        return $body;\n    }\n\n    /**\n     * Get the boundaries that this message will use\n     * @return array\n     */\n    public function getBoundaries()\n    {\n        if (empty($this->boundary)) {\n            $this->setBoundaries();\n        }\n        return $this->boundary;\n    }\n\n    /**\n     * Return the start of a message boundary.\n     *\n     * @param string $boundary\n     * @param string $charSet\n     * @param string $contentType\n     * @param string $encoding\n     *\n     * @return string\n     */\n    protected function getBoundary($boundary, $charSet, $contentType, $encoding)\n    {\n        $result = '';\n        if ('' === $charSet) {\n            $charSet = $this->CharSet;\n        }\n        if ('' === $contentType) {\n            $contentType = $this->ContentType;\n        }\n        if ('' === $encoding) {\n            $encoding = $this->Encoding;\n        }\n        $result .= $this->textLine('--' . $boundary);\n        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);\n        $result .= static::$LE;\n        //RFC1341 part 5 says 7bit is assumed if not specified\n        if (static::ENCODING_7BIT !== $encoding) {\n            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);\n        }\n        $result .= static::$LE;\n\n        return $result;\n    }\n\n    /**\n     * Return the end of a message boundary.\n     *\n     * @param string $boundary\n     *\n     * @return string\n     */\n    protected function endBoundary($boundary)\n    {\n        return static::$LE . '--' . $boundary . '--' . static::$LE;\n    }\n\n    /**\n     * Set the message type.\n     * PHPMailer only supports some preset message types, not arbitrary MIME structures.\n     */\n    protected function setMessageType()\n    {\n        $type = [];\n        if ($this->alternativeExists()) {\n            $type[] = 'alt';\n        }\n        if ($this->inlineImageExists()) {\n            $type[] = 'inline';\n        }\n        if ($this->attachmentExists()) {\n            $type[] = 'attach';\n        }\n        $this->message_type = implode('_', $type);\n        if ('' === $this->message_type) {\n            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text\n            $this->message_type = 'plain';\n        }\n    }\n\n    /**\n     * Format a header line.\n     *\n     * @param string     $name\n     * @param string|int $value\n     *\n     * @return string\n     */\n    public function headerLine($name, $value)\n    {\n        return $name . ': ' . $value . static::$LE;\n    }\n\n    /**\n     * Return a formatted mail line.\n     *\n     * @param string $value\n     *\n     * @return string\n     */\n    public function textLine($value)\n    {\n        return $value . static::$LE;\n    }\n\n    /**\n     * Add an attachment from a path on the filesystem.\n     * Never use a user-supplied path to a file!\n     * Returns false if the file could not be found or read.\n     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.\n     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.\n     *\n     * @param string $path        Path to the attachment\n     * @param string $name        Overrides the attachment name\n     * @param string $encoding    File encoding (see $Encoding)\n     * @param string $type        MIME type, e.g. `image/jpeg`; determined automatically from $path if not specified\n     * @param string $disposition Disposition to use\n     *\n     * @throws Exception\n     *\n     * @return bool\n     */\n    public function addAttachment(\n        $path,\n        $name = '',\n        $encoding = self::ENCODING_BASE64,\n        $type = '',\n        $disposition = 'attachment'\n    ) {\n        try {\n            if (!static::fileIsAccessible($path)) {\n                throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE);\n            }\n\n            //If a MIME type is not specified, try to work it out from the file name\n            if ('' === $type) {\n                $type = static::filenameToType($path);\n            }\n\n            $filename = (string) static::mb_pathinfo($path, PATHINFO_BASENAME);\n            if ('' === $name) {\n                $name = $filename;\n            }\n            if (!$this->validateEncoding($encoding)) {\n                throw new Exception($this->lang('encoding') . $encoding);\n            }\n\n            $this->attachment[] = [\n                0 => $path,\n                1 => $filename,\n                2 => $name,\n                3 => $encoding,\n                4 => $type,\n                5 => false, //isStringAttachment\n                6 => $disposition,\n                7 => $name,\n            ];\n        } catch (Exception $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Return the array of attachments.\n     *\n     * @return array\n     */\n    public function getAttachments()\n    {\n        return $this->attachment;\n    }\n\n    /**\n     * Attach all file, string, and binary attachments to the message.\n     * Returns an empty string on failure.\n     *\n     * @param string $disposition_type\n     * @param string $boundary\n     *\n     * @throws Exception\n     *\n     * @return string\n     */\n    protected function attachAll($disposition_type, $boundary)\n    {\n        //Return text of body\n        $mime = [];\n        $cidUniq = [];\n        $incl = [];\n\n        //Add all attachments\n        foreach ($this->attachment as $attachment) {\n            //Check if it is a valid disposition_filter\n            if ($attachment[6] === $disposition_type) {\n                //Check for string attachment\n                $string = '';\n                $path = '';\n                $bString = $attachment[5];\n                if ($bString) {\n                    $string = $attachment[0];\n                } else {\n                    $path = $attachment[0];\n                }\n\n                $inclhash = hash('sha256', serialize($attachment));\n                if (in_array($inclhash, $incl, true)) {\n                    continue;\n                }\n                $incl[] = $inclhash;\n                $name = $attachment[2];\n                $encoding = $attachment[3];\n                $type = $attachment[4];\n                $disposition = $attachment[6];\n                $cid = $attachment[7];\n                if ('inline' === $disposition && array_key_exists($cid, $cidUniq)) {\n                    continue;\n                }\n                $cidUniq[$cid] = true;\n\n                $mime[] = sprintf('--%s%s', $boundary, static::$LE);\n                //Only include a filename property if we have one\n                if (!empty($name)) {\n                    $mime[] = sprintf(\n                        'Content-Type: %s; name=%s%s',\n                        $type,\n                        static::quotedString($this->encodeHeader($this->secureHeader($name))),\n                        static::$LE\n                    );\n                } else {\n                    $mime[] = sprintf(\n                        'Content-Type: %s%s',\n                        $type,\n                        static::$LE\n                    );\n                }\n                //RFC1341 part 5 says 7bit is assumed if not specified\n                if (static::ENCODING_7BIT !== $encoding) {\n                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, static::$LE);\n                }\n\n                //Only set Content-IDs on inline attachments\n                if ((string) $cid !== '' && $disposition === 'inline') {\n                    $mime[] = 'Content-ID: <' . $this->encodeHeader($this->secureHeader($cid)) . '>' . static::$LE;\n                }\n\n                //Allow for bypassing the Content-Disposition header\n                if (!empty($disposition)) {\n                    $encoded_name = $this->encodeHeader($this->secureHeader($name));\n                    if (!empty($encoded_name)) {\n                        $mime[] = sprintf(\n                            'Content-Disposition: %s; filename=%s%s',\n                            $disposition,\n                            static::quotedString($encoded_name),\n                            static::$LE . static::$LE\n                        );\n                    } else {\n                        $mime[] = sprintf(\n                            'Content-Disposition: %s%s',\n                            $disposition,\n                            static::$LE . static::$LE\n                        );\n                    }\n                } else {\n                    $mime[] = static::$LE;\n                }\n\n                //Encode as string attachment\n                if ($bString) {\n                    $mime[] = $this->encodeString($string, $encoding);\n                } else {\n                    $mime[] = $this->encodeFile($path, $encoding);\n                }\n                if ($this->isError()) {\n                    return '';\n                }\n                $mime[] = static::$LE;\n            }\n        }\n\n        $mime[] = sprintf('--%s--%s', $boundary, static::$LE);\n\n        return implode('', $mime);\n    }\n\n    /**\n     * Encode a file attachment in requested format.\n     * Returns an empty string on failure.\n     *\n     * @param string $path     The full path to the file\n     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n     *\n     * @return string\n     */\n    protected function encodeFile($path, $encoding = self::ENCODING_BASE64)\n    {\n        try {\n            if (!static::fileIsAccessible($path)) {\n                throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE);\n            }\n            $file_buffer = file_get_contents($path);\n            if (false === $file_buffer) {\n                throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE);\n            }\n            $file_buffer = $this->encodeString($file_buffer, $encoding);\n\n            return $file_buffer;\n        } catch (Exception $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n\n            return '';\n        }\n    }\n\n    /**\n     * Encode a string in requested format.\n     * Returns an empty string on failure.\n     *\n     * @param string $str      The text to encode\n     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n     *\n     * @throws Exception\n     *\n     * @return string\n     */\n    public function encodeString($str, $encoding = self::ENCODING_BASE64)\n    {\n        $encoded = '';\n        switch (strtolower($encoding)) {\n            case static::ENCODING_BASE64:\n                $encoded = chunk_split(\n                    base64_encode($str),\n                    static::STD_LINE_LENGTH,\n                    static::$LE\n                );\n                break;\n            case static::ENCODING_7BIT:\n            case static::ENCODING_8BIT:\n                $encoded = static::normalizeBreaks($str);\n                //Make sure it ends with a line break\n                if (substr($encoded, -(strlen(static::$LE))) !== static::$LE) {\n                    $encoded .= static::$LE;\n                }\n                break;\n            case static::ENCODING_BINARY:\n                $encoded = $str;\n                break;\n            case static::ENCODING_QUOTED_PRINTABLE:\n                $encoded = $this->encodeQP($str);\n                break;\n            default:\n                $this->setError($this->lang('encoding') . $encoding);\n                if ($this->exceptions) {\n                    throw new Exception($this->lang('encoding') . $encoding);\n                }\n                break;\n        }\n\n        return $encoded;\n    }\n\n    /**\n     * Encode a header value (not including its label) optimally.\n     * Picks shortest of Q, B, or none. Result includes folding if needed.\n     * See RFC822 definitions for phrase, comment and text positions.\n     *\n     * @param string $str      The header value to encode\n     * @param string $position What context the string will be used in\n     *\n     * @return string\n     */\n    public function encodeHeader($str, $position = 'text')\n    {\n        $matchcount = 0;\n        switch (strtolower($position)) {\n            case 'phrase':\n                if (!preg_match('/[\\200-\\377]/', $str)) {\n                    //Can't use addslashes as we don't know the value of magic_quotes_sybase\n                    $encoded = addcslashes($str, \"\\0..\\37\\177\\\\\\\"\");\n                    if (($str === $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\\'*+\\/=?^_`{|}~ -]/', $str)) {\n                        return $encoded;\n                    }\n\n                    return \"\\\"$encoded\\\"\";\n                }\n                $matchcount = preg_match_all('/[^\\040\\041\\043-\\133\\135-\\176]/', $str, $matches);\n                break;\n            /* @noinspection PhpMissingBreakStatementInspection */\n            case 'comment':\n                $matchcount = preg_match_all('/[()\"]/', $str, $matches);\n            //fallthrough\n            case 'text':\n            default:\n                $matchcount += preg_match_all('/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]/', $str, $matches);\n                break;\n        }\n\n        if ($this->has8bitChars($str)) {\n            $charset = $this->CharSet;\n        } else {\n            $charset = static::CHARSET_ASCII;\n        }\n\n        //Q/B encoding adds 8 chars and the charset (\"` =?<charset>?[QB]?<content>?=`\").\n        $overhead = 8 + strlen($charset);\n\n        if ('mail' === $this->Mailer) {\n            $maxlen = static::MAIL_MAX_LINE_LENGTH - $overhead;\n        } else {\n            $maxlen = static::MAX_LINE_LENGTH - $overhead;\n        }\n\n        //Select the encoding that produces the shortest output and/or prevents corruption.\n        if ($matchcount > strlen($str) / 3) {\n            //More than 1/3 of the content needs encoding, use B-encode.\n            $encoding = 'B';\n        } elseif ($matchcount > 0) {\n            //Less than 1/3 of the content needs encoding, use Q-encode.\n            $encoding = 'Q';\n        } elseif (strlen($str) > $maxlen) {\n            //No encoding needed, but value exceeds max line length, use Q-encode to prevent corruption.\n            $encoding = 'Q';\n        } else {\n            //No reformatting needed\n            $encoding = false;\n        }\n\n        switch ($encoding) {\n            case 'B':\n                if ($this->hasMultiBytes($str)) {\n                    //Use a custom function which correctly encodes and wraps long\n                    //multibyte strings without breaking lines within a character\n                    $encoded = $this->base64EncodeWrapMB($str, \"\\n\");\n                } else {\n                    $encoded = base64_encode($str);\n                    $maxlen -= $maxlen % 4;\n                    $encoded = trim(chunk_split($encoded, $maxlen, \"\\n\"));\n                }\n                $encoded = preg_replace('/^(.*)$/m', ' =?' . $charset . \"?$encoding?\\\\1?=\", $encoded);\n                break;\n            case 'Q':\n                $encoded = $this->encodeQ($str, $position);\n                $encoded = $this->wrapText($encoded, $maxlen, true);\n                $encoded = str_replace('=' . static::$LE, \"\\n\", trim($encoded));\n                $encoded = preg_replace('/^(.*)$/m', ' =?' . $charset . \"?$encoding?\\\\1?=\", $encoded);\n                break;\n            default:\n                return $str;\n        }\n\n        return trim(static::normalizeBreaks($encoded));\n    }\n\n    /**\n     * Check if a string contains multi-byte characters.\n     *\n     * @param string $str multi-byte text to wrap encode\n     *\n     * @return bool\n     */\n    public function hasMultiBytes($str)\n    {\n        if (function_exists('mb_strlen')) {\n            return strlen($str) > mb_strlen($str, $this->CharSet);\n        }\n\n        //Assume no multibytes (we can't handle without mbstring functions anyway)\n        return false;\n    }\n\n    /**\n     * Does a string contain any 8-bit chars (in any charset)?\n     *\n     * @param string $text\n     *\n     * @return bool\n     */\n    public function has8bitChars($text)\n    {\n        return (bool) preg_match('/[\\x80-\\xFF]/', $text);\n    }\n\n    /**\n     * Encode and wrap long multibyte strings for mail headers\n     * without breaking lines within a character.\n     * Adapted from a function by paravoid.\n     *\n     * @see http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283\n     *\n     * @param string $str       multi-byte text to wrap encode\n     * @param string $linebreak string to use as linefeed/end-of-line\n     *\n     * @return string\n     */\n    public function base64EncodeWrapMB($str, $linebreak = null)\n    {\n        $start = '=?' . $this->CharSet . '?B?';\n        $end = '?=';\n        $encoded = '';\n        if (null === $linebreak) {\n            $linebreak = static::$LE;\n        }\n\n        $mb_length = mb_strlen($str, $this->CharSet);\n        //Each line must have length <= 75, including $start and $end\n        $length = 75 - strlen($start) - strlen($end);\n        //Average multi-byte ratio\n        $ratio = $mb_length / strlen($str);\n        //Base64 has a 4:3 ratio\n        $avgLength = floor($length * $ratio * .75);\n\n        $offset = 0;\n        for ($i = 0; $i < $mb_length; $i += $offset) {\n            $lookBack = 0;\n            do {\n                $offset = $avgLength - $lookBack;\n                $chunk = mb_substr($str, $i, $offset, $this->CharSet);\n                $chunk = base64_encode($chunk);\n                ++$lookBack;\n            } while (strlen($chunk) > $length);\n            $encoded .= $chunk . $linebreak;\n        }\n\n        //Chomp the last linefeed\n        return substr($encoded, 0, -strlen($linebreak));\n    }\n\n    /**\n     * Encode a string in quoted-printable format.\n     * According to RFC2045 section 6.7.\n     *\n     * @param string $string The text to encode\n     *\n     * @return string\n     */\n    public function encodeQP($string)\n    {\n        return static::normalizeBreaks(quoted_printable_encode($string));\n    }\n\n    /**\n     * Encode a string using Q encoding.\n     *\n     * @see http://tools.ietf.org/html/rfc2047#section-4.2\n     *\n     * @param string $str      the text to encode\n     * @param string $position Where the text is going to be used, see the RFC for what that means\n     *\n     * @return string\n     */\n    public function encodeQ($str, $position = 'text')\n    {\n        //There should not be any EOL in the string\n        $pattern = '';\n        $encoded = str_replace([\"\\r\", \"\\n\"], '', $str);\n        switch (strtolower($position)) {\n            case 'phrase':\n                //RFC 2047 section 5.3\n                $pattern = '^A-Za-z0-9!*+\\/ -';\n                break;\n            /*\n             * RFC 2047 section 5.2.\n             * Build $pattern without including delimiters and []\n             */\n            /* @noinspection PhpMissingBreakStatementInspection */\n            case 'comment':\n                $pattern = '\\(\\)\"';\n            /* Intentional fall through */\n            case 'text':\n            default:\n                //RFC 2047 section 5.1\n                //Replace every high ascii, control, =, ? and _ characters\n                $pattern = '\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377' . $pattern;\n                break;\n        }\n        $matches = [];\n        if (preg_match_all(\"/[{$pattern}]/\", $encoded, $matches)) {\n            //If the string contains an '=', make sure it's the first thing we replace\n            //so as to avoid double-encoding\n            $eqkey = array_search('=', $matches[0], true);\n            if (false !== $eqkey) {\n                unset($matches[0][$eqkey]);\n                array_unshift($matches[0], '=');\n            }\n            foreach (array_unique($matches[0]) as $char) {\n                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);\n            }\n        }\n        //Replace spaces with _ (more readable than =20)\n        //RFC 2047 section 4.2(2)\n        return str_replace(' ', '_', $encoded);\n    }\n\n    /**\n     * Add a string or binary attachment (non-filesystem).\n     * This method can be used to attach ascii or binary data,\n     * such as a BLOB record from a database.\n     *\n     * @param string $string      String attachment data\n     * @param string $filename    Name of the attachment\n     * @param string $encoding    File encoding (see $Encoding)\n     * @param string $type        File extension (MIME) type\n     * @param string $disposition Disposition to use\n     *\n     * @throws Exception\n     *\n     * @return bool True on successfully adding an attachment\n     */\n    public function addStringAttachment(\n        $string,\n        $filename,\n        $encoding = self::ENCODING_BASE64,\n        $type = '',\n        $disposition = 'attachment'\n    ) {\n        try {\n            //If a MIME type is not specified, try to work it out from the file name\n            if ('' === $type) {\n                $type = static::filenameToType($filename);\n            }\n\n            if (!$this->validateEncoding($encoding)) {\n                throw new Exception($this->lang('encoding') . $encoding);\n            }\n\n            //Append to $attachment array\n            $this->attachment[] = [\n                0 => $string,\n                1 => $filename,\n                2 => static::mb_pathinfo($filename, PATHINFO_BASENAME),\n                3 => $encoding,\n                4 => $type,\n                5 => true, //isStringAttachment\n                6 => $disposition,\n                7 => 0,\n            ];\n        } catch (Exception $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Add an embedded (inline) attachment from a file.\n     * This can include images, sounds, and just about any other document type.\n     * These differ from 'regular' attachments in that they are intended to be\n     * displayed inline with the message, not just attached for download.\n     * This is used in HTML messages that embed the images\n     * the HTML refers to using the `$cid` value in `img` tags, for example `<img src=\"cid:mylogo\">`.\n     * Never use a user-supplied path to a file!\n     *\n     * @param string $path        Path to the attachment\n     * @param string $cid         Content ID of the attachment; Use this to reference\n     *                            the content when using an embedded image in HTML\n     * @param string $name        Overrides the attachment filename\n     * @param string $encoding    File encoding (see $Encoding) defaults to `base64`\n     * @param string $type        File MIME type (by default mapped from the `$path` filename's extension)\n     * @param string $disposition Disposition to use: `inline` (default) or `attachment`\n     *                            (unlikely you want this – {@see `addAttachment()`} instead)\n     *\n     * @return bool True on successfully adding an attachment\n     * @throws Exception\n     *\n     */\n    public function addEmbeddedImage(\n        $path,\n        $cid,\n        $name = '',\n        $encoding = self::ENCODING_BASE64,\n        $type = '',\n        $disposition = 'inline'\n    ) {\n        try {\n            if (!static::fileIsAccessible($path)) {\n                throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE);\n            }\n\n            //If a MIME type is not specified, try to work it out from the file name\n            if ('' === $type) {\n                $type = static::filenameToType($path);\n            }\n\n            if (!$this->validateEncoding($encoding)) {\n                throw new Exception($this->lang('encoding') . $encoding);\n            }\n\n            $filename = (string) static::mb_pathinfo($path, PATHINFO_BASENAME);\n            if ('' === $name) {\n                $name = $filename;\n            }\n\n            //Append to $attachment array\n            $this->attachment[] = [\n                0 => $path,\n                1 => $filename,\n                2 => $name,\n                3 => $encoding,\n                4 => $type,\n                5 => false, //isStringAttachment\n                6 => $disposition,\n                7 => $cid,\n            ];\n        } catch (Exception $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Add an embedded stringified attachment.\n     * This can include images, sounds, and just about any other document type.\n     * If your filename doesn't contain an extension, be sure to set the $type to an appropriate MIME type.\n     *\n     * @param string $string      The attachment binary data\n     * @param string $cid         Content ID of the attachment; Use this to reference\n     *                            the content when using an embedded image in HTML\n     * @param string $name        A filename for the attachment. If this contains an extension,\n     *                            PHPMailer will attempt to set a MIME type for the attachment.\n     *                            For example 'file.jpg' would get an 'image/jpeg' MIME type.\n     * @param string $encoding    File encoding (see $Encoding), defaults to 'base64'\n     * @param string $type        MIME type - will be used in preference to any automatically derived type\n     * @param string $disposition Disposition to use\n     *\n     * @throws Exception\n     *\n     * @return bool True on successfully adding an attachment\n     */\n    public function addStringEmbeddedImage(\n        $string,\n        $cid,\n        $name = '',\n        $encoding = self::ENCODING_BASE64,\n        $type = '',\n        $disposition = 'inline'\n    ) {\n        try {\n            //If a MIME type is not specified, try to work it out from the name\n            if ('' === $type && !empty($name)) {\n                $type = static::filenameToType($name);\n            }\n\n            if (!$this->validateEncoding($encoding)) {\n                throw new Exception($this->lang('encoding') . $encoding);\n            }\n\n            //Append to $attachment array\n            $this->attachment[] = [\n                0 => $string,\n                1 => $name,\n                2 => $name,\n                3 => $encoding,\n                4 => $type,\n                5 => true, //isStringAttachment\n                6 => $disposition,\n                7 => $cid,\n            ];\n        } catch (Exception $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Validate encodings.\n     *\n     * @param string $encoding\n     *\n     * @return bool\n     */\n    protected function validateEncoding($encoding)\n    {\n        return in_array(\n            $encoding,\n            [\n                self::ENCODING_7BIT,\n                self::ENCODING_QUOTED_PRINTABLE,\n                self::ENCODING_BASE64,\n                self::ENCODING_8BIT,\n                self::ENCODING_BINARY,\n            ],\n            true\n        );\n    }\n\n    /**\n     * Check if an embedded attachment is present with this cid.\n     *\n     * @param string $cid\n     *\n     * @return bool\n     */\n    protected function cidExists($cid)\n    {\n        foreach ($this->attachment as $attachment) {\n            if ('inline' === $attachment[6] && $cid === $attachment[7]) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Check if an inline attachment is present.\n     *\n     * @return bool\n     */\n    public function inlineImageExists()\n    {\n        foreach ($this->attachment as $attachment) {\n            if ('inline' === $attachment[6]) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Check if an attachment (non-inline) is present.\n     *\n     * @return bool\n     */\n    public function attachmentExists()\n    {\n        foreach ($this->attachment as $attachment) {\n            if ('attachment' === $attachment[6]) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Check if this message has an alternative body set.\n     *\n     * @return bool\n     */\n    public function alternativeExists()\n    {\n        return !empty($this->AltBody);\n    }\n\n    /**\n     * Clear queued addresses of given kind.\n     *\n     * @param string $kind 'to', 'cc', or 'bcc'\n     */\n    public function clearQueuedAddresses($kind)\n    {\n        $this->RecipientsQueue = array_filter(\n            $this->RecipientsQueue,\n            static function ($params) use ($kind) {\n                return $params[0] !== $kind;\n            }\n        );\n    }\n\n    /**\n     * Clear all To recipients.\n     */\n    public function clearAddresses()\n    {\n        foreach ($this->to as $to) {\n            unset($this->all_recipients[strtolower($to[0])]);\n        }\n        $this->to = [];\n        $this->clearQueuedAddresses('to');\n    }\n\n    /**\n     * Clear all CC recipients.\n     */\n    public function clearCCs()\n    {\n        foreach ($this->cc as $cc) {\n            unset($this->all_recipients[strtolower($cc[0])]);\n        }\n        $this->cc = [];\n        $this->clearQueuedAddresses('cc');\n    }\n\n    /**\n     * Clear all BCC recipients.\n     */\n    public function clearBCCs()\n    {\n        foreach ($this->bcc as $bcc) {\n            unset($this->all_recipients[strtolower($bcc[0])]);\n        }\n        $this->bcc = [];\n        $this->clearQueuedAddresses('bcc');\n    }\n\n    /**\n     * Clear all ReplyTo recipients.\n     */\n    public function clearReplyTos()\n    {\n        $this->ReplyTo = [];\n        $this->ReplyToQueue = [];\n    }\n\n    /**\n     * Clear all recipient types.\n     */\n    public function clearAllRecipients()\n    {\n        $this->to = [];\n        $this->cc = [];\n        $this->bcc = [];\n        $this->all_recipients = [];\n        $this->RecipientsQueue = [];\n    }\n\n    /**\n     * Clear all filesystem, string, and binary attachments.\n     */\n    public function clearAttachments()\n    {\n        $this->attachment = [];\n    }\n\n    /**\n     * Clear all custom headers.\n     */\n    public function clearCustomHeaders()\n    {\n        $this->CustomHeader = [];\n    }\n\n    /**\n     * Add an error message to the error container.\n     *\n     * @param string $msg\n     */\n    protected function setError($msg)\n    {\n        ++$this->error_count;\n        if ('smtp' === $this->Mailer && null !== $this->smtp) {\n            $lasterror = $this->smtp->getError();\n            if (!empty($lasterror['error'])) {\n                $msg .= $this->lang('smtp_error') . $lasterror['error'];\n                if (!empty($lasterror['detail'])) {\n                    $msg .= ' ' . $this->lang('smtp_detail') . $lasterror['detail'];\n                }\n                if (!empty($lasterror['smtp_code'])) {\n                    $msg .= ' ' . $this->lang('smtp_code') . $lasterror['smtp_code'];\n                }\n                if (!empty($lasterror['smtp_code_ex'])) {\n                    $msg .= ' ' . $this->lang('smtp_code_ex') . $lasterror['smtp_code_ex'];\n                }\n            }\n        }\n        $this->ErrorInfo = $msg;\n    }\n\n    /**\n     * Return an RFC 822 formatted date.\n     *\n     * @return string\n     */\n    public static function rfcDate()\n    {\n        //Set the time zone to whatever the default is to avoid 500 errors\n        //Will default to UTC if it's not set properly in php.ini\n        date_default_timezone_set(@date_default_timezone_get());\n\n        return date('D, j M Y H:i:s O');\n    }\n\n    /**\n     * Get the server hostname.\n     * Returns 'localhost.localdomain' if unknown.\n     *\n     * @return string\n     */\n    protected function serverHostname()\n    {\n        $result = '';\n        if (!empty($this->Hostname)) {\n            $result = $this->Hostname;\n        } elseif (isset($_SERVER) && array_key_exists('SERVER_NAME', $_SERVER)) {\n            $result = $_SERVER['SERVER_NAME'];\n        } elseif (function_exists('gethostname') && gethostname() !== false) {\n            $result = gethostname();\n        } elseif (php_uname('n') !== false) {\n            $result = php_uname('n');\n        }\n        if (!static::isValidHost($result)) {\n            return 'localhost.localdomain';\n        }\n\n        return $result;\n    }\n\n    /**\n     * Validate whether a string contains a valid value to use as a hostname or IP address.\n     * IPv6 addresses must include [], e.g. `[::1]`, not just `::1`.\n     *\n     * @param string $host The host name or IP address to check\n     *\n     * @return bool\n     */\n    public static function isValidHost($host)\n    {\n        //Simple syntax limits\n        if (\n            empty($host)\n            || !is_string($host)\n            || strlen($host) > 256\n            || !preg_match('/^([a-zA-Z\\d.-]*|\\[[a-fA-F\\d:]+\\])$/', $host)\n        ) {\n            return false;\n        }\n        //Looks like a bracketed IPv6 address\n        if (strlen($host) > 2 && substr($host, 0, 1) === '[' && substr($host, -1, 1) === ']') {\n            return filter_var(substr($host, 1, -1), FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false;\n        }\n        //If removing all the dots results in a numeric string, it must be an IPv4 address.\n        //Need to check this first because otherwise things like `999.0.0.0` are considered valid host names\n        if (is_numeric(str_replace('.', '', $host))) {\n            //Is it a valid IPv4 address?\n            return filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false;\n        }\n        //Is it a syntactically valid hostname (when embeded in a URL)?\n        return filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false;\n    }\n\n    /**\n     * Get an error message in the current language.\n     *\n     * @param string $key\n     *\n     * @return string\n     */\n    protected function lang($key)\n    {\n        if (count($this->language) < 1) {\n            $this->setLanguage(); //Set the default language\n        }\n\n        if (array_key_exists($key, $this->language)) {\n            if ('smtp_connect_failed' === $key) {\n                //Include a link to troubleshooting docs on SMTP connection failure.\n                //This is by far the biggest cause of support questions\n                //but it's usually not PHPMailer's fault.\n                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';\n            }\n\n            return $this->language[$key];\n        }\n\n        //Return the key as a fallback\n        return $key;\n    }\n\n    /**\n     * Build an error message starting with a generic one and adding details if possible.\n     *\n     * @param string $base_key\n     * @return string\n     */\n    private function getSmtpErrorMessage($base_key)\n    {\n        $message = $this->lang($base_key);\n        $error = $this->smtp->getError();\n        if (!empty($error['error'])) {\n            $message .= ' ' . $error['error'];\n            if (!empty($error['detail'])) {\n                $message .= ' ' . $error['detail'];\n            }\n        }\n\n        return $message;\n    }\n\n    /**\n     * Check if an error occurred.\n     *\n     * @return bool True if an error did occur\n     */\n    public function isError()\n    {\n        return $this->error_count > 0;\n    }\n\n    /**\n     * Add a custom header.\n     * $name value can be overloaded to contain\n     * both header name and value (name:value).\n     *\n     * @param string      $name  Custom header name\n     * @param string|null $value Header value\n     *\n     * @return bool True if a header was set successfully\n     * @throws Exception\n     */\n    public function addCustomHeader($name, $value = null)\n    {\n        if (null === $value && strpos($name, ':') !== false) {\n            //Value passed in as name:value\n            list($name, $value) = explode(':', $name, 2);\n        }\n        $name = trim($name);\n        $value = (null === $value) ? '' : trim($value);\n        //Ensure name is not empty, and that neither name nor value contain line breaks\n        if (empty($name) || strpbrk($name . $value, \"\\r\\n\") !== false) {\n            if ($this->exceptions) {\n                throw new Exception($this->lang('invalid_header'));\n            }\n\n            return false;\n        }\n        $this->CustomHeader[] = [$name, $value];\n\n        return true;\n    }\n\n    /**\n     * Returns all custom headers.\n     *\n     * @return array\n     */\n    public function getCustomHeaders()\n    {\n        return $this->CustomHeader;\n    }\n\n    /**\n     * Create a message body from an HTML string.\n     * Automatically inlines images and creates a plain-text version by converting the HTML,\n     * overwriting any existing values in Body and AltBody.\n     * Do not source $message content from user input!\n     * $basedir is prepended when handling relative URLs, e.g. <img src=\"/images/a.png\"> and must not be empty\n     * will look for an image file in $basedir/images/a.png and convert it to inline.\n     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)\n     * Converts data-uri images into embedded attachments.\n     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.\n     *\n     * @param string        $message  HTML message string\n     * @param string        $basedir  Absolute path to a base directory to prepend to relative paths to images\n     * @param bool|callable $advanced Whether to use the internal HTML to text converter\n     *                                or your own custom converter\n     * @return string The transformed message body\n     *\n     * @throws Exception\n     *\n     * @see PHPMailer::html2text()\n     */\n    public function msgHTML($message, $basedir = '', $advanced = false)\n    {\n        preg_match_all('/(?<!-)(src|background)=[\"\\'](.*)[\"\\']/Ui', $message, $images);\n        if (array_key_exists(2, $images)) {\n            if (strlen($basedir) > 1 && '/' !== substr($basedir, -1)) {\n                //Ensure $basedir has a trailing /\n                $basedir .= '/';\n            }\n            foreach ($images[2] as $imgindex => $url) {\n                //Convert data URIs into embedded images\n                //e.g. \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n                $match = [];\n                if (preg_match('#^data:(image/(?:jpe?g|gif|png));?(base64)?,(.+)#', $url, $match)) {\n                    if (count($match) === 4 && static::ENCODING_BASE64 === $match[2]) {\n                        $data = base64_decode($match[3]);\n                    } elseif ('' === $match[2]) {\n                        $data = rawurldecode($match[3]);\n                    } else {\n                        //Not recognised so leave it alone\n                        continue;\n                    }\n                    //Hash the decoded data, not the URL, so that the same data-URI image used in multiple places\n                    //will only be embedded once, even if it used a different encoding\n                    $cid = substr(hash('sha256', $data), 0, 32) . '@phpmailer.0'; //RFC2392 S 2\n\n                    if (!$this->cidExists($cid)) {\n                        $this->addStringEmbeddedImage(\n                            $data,\n                            $cid,\n                            'embed' . $imgindex,\n                            static::ENCODING_BASE64,\n                            $match[1]\n                        );\n                    }\n                    $message = str_replace(\n                        $images[0][$imgindex],\n                        $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n                        $message\n                    );\n                    continue;\n                }\n                if (\n                    //Only process relative URLs if a basedir is provided (i.e. no absolute local paths)\n                    !empty($basedir)\n                    //Ignore URLs containing parent dir traversal (..)\n                    && (strpos($url, '..') === false)\n                    //Do not change urls that are already inline images\n                    && 0 !== strpos($url, 'cid:')\n                    //Do not change absolute URLs, including anonymous protocol\n                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)\n                ) {\n                    $filename = static::mb_pathinfo($url, PATHINFO_BASENAME);\n                    $directory = dirname($url);\n                    if ('.' === $directory) {\n                        $directory = '';\n                    }\n                    //RFC2392 S 2\n                    $cid = substr(hash('sha256', $url), 0, 32) . '@phpmailer.0';\n                    if (strlen($basedir) > 1 && '/' !== substr($basedir, -1)) {\n                        $basedir .= '/';\n                    }\n                    if (strlen($directory) > 1 && '/' !== substr($directory, -1)) {\n                        $directory .= '/';\n                    }\n                    if (\n                        $this->addEmbeddedImage(\n                            $basedir . $directory . $filename,\n                            $cid,\n                            $filename,\n                            static::ENCODING_BASE64,\n                            static::_mime_types((string) static::mb_pathinfo($filename, PATHINFO_EXTENSION))\n                        )\n                    ) {\n                        $message = preg_replace(\n                            '/' . $images[1][$imgindex] . '=[\"\\']' . preg_quote($url, '/') . '[\"\\']/Ui',\n                            $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n                            $message\n                        );\n                    }\n                }\n            }\n        }\n        $this->isHTML();\n        //Convert all message body line breaks to LE, makes quoted-printable encoding work much better\n        $this->Body = static::normalizeBreaks($message);\n        $this->AltBody = static::normalizeBreaks($this->html2text($message, $advanced));\n        if (!$this->alternativeExists()) {\n            $this->AltBody = 'This is an HTML-only message. To view it, activate HTML in your email application.'\n                . static::$LE;\n        }\n\n        return $this->Body;\n    }\n\n    /**\n     * Convert an HTML string into plain text.\n     * This is used by msgHTML().\n     * Note - older versions of this function used a bundled advanced converter\n     * which was removed for license reasons in #232.\n     * Example usage:\n     *\n     * ```php\n     * //Use default conversion\n     * $plain = $mail->html2text($html);\n     * //Use your own custom converter\n     * $plain = $mail->html2text($html, function($html) {\n     *     $converter = new MyHtml2text($html);\n     *     return $converter->get_text();\n     * });\n     * ```\n     *\n     * @param string        $html     The HTML text to convert\n     * @param bool|callable $advanced Any boolean value to use the internal converter,\n     *                                or provide your own callable for custom conversion.\n     *                                *Never* pass user-supplied data into this parameter\n     *\n     * @return string\n     */\n    public function html2text($html, $advanced = false)\n    {\n        if (is_callable($advanced)) {\n            return call_user_func($advanced, $html);\n        }\n\n        return html_entity_decode(\n            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\\/\\\\1>/si', '', $html))),\n            ENT_QUOTES,\n            $this->CharSet\n        );\n    }\n\n    /**\n     * Get the MIME type for a file extension.\n     *\n     * @param string $ext File extension\n     *\n     * @return string MIME type of file\n     */\n    public static function _mime_types($ext = '')\n    {\n        $mimes = [\n            'xl' => 'application/excel',\n            'js' => 'application/javascript',\n            'hqx' => 'application/mac-binhex40',\n            'cpt' => 'application/mac-compactpro',\n            'bin' => 'application/macbinary',\n            'doc' => 'application/msword',\n            'word' => 'application/msword',\n            'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n            'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n            'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',\n            'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n            'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n            'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',\n            'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n            'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n            'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',\n            'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\n            'class' => 'application/octet-stream',\n            'dll' => 'application/octet-stream',\n            'dms' => 'application/octet-stream',\n            'exe' => 'application/octet-stream',\n            'lha' => 'application/octet-stream',\n            'lzh' => 'application/octet-stream',\n            'psd' => 'application/octet-stream',\n            'sea' => 'application/octet-stream',\n            'so' => 'application/octet-stream',\n            'oda' => 'application/oda',\n            'pdf' => 'application/pdf',\n            'ai' => 'application/postscript',\n            'eps' => 'application/postscript',\n            'ps' => 'application/postscript',\n            'smi' => 'application/smil',\n            'smil' => 'application/smil',\n            'mif' => 'application/vnd.mif',\n            'xls' => 'application/vnd.ms-excel',\n            'ppt' => 'application/vnd.ms-powerpoint',\n            'wbxml' => 'application/vnd.wap.wbxml',\n            'wmlc' => 'application/vnd.wap.wmlc',\n            'dcr' => 'application/x-director',\n            'dir' => 'application/x-director',\n            'dxr' => 'application/x-director',\n            'dvi' => 'application/x-dvi',\n            'gtar' => 'application/x-gtar',\n            'php3' => 'application/x-httpd-php',\n            'php4' => 'application/x-httpd-php',\n            'php' => 'application/x-httpd-php',\n            'phtml' => 'application/x-httpd-php',\n            'phps' => 'application/x-httpd-php-source',\n            'swf' => 'application/x-shockwave-flash',\n            'sit' => 'application/x-stuffit',\n            'tar' => 'application/x-tar',\n            'tgz' => 'application/x-tar',\n            'xht' => 'application/xhtml+xml',\n            'xhtml' => 'application/xhtml+xml',\n            'zip' => 'application/zip',\n            'mid' => 'audio/midi',\n            'midi' => 'audio/midi',\n            'mp2' => 'audio/mpeg',\n            'mp3' => 'audio/mpeg',\n            'm4a' => 'audio/mp4',\n            'mpga' => 'audio/mpeg',\n            'aif' => 'audio/x-aiff',\n            'aifc' => 'audio/x-aiff',\n            'aiff' => 'audio/x-aiff',\n            'ram' => 'audio/x-pn-realaudio',\n            'rm' => 'audio/x-pn-realaudio',\n            'rpm' => 'audio/x-pn-realaudio-plugin',\n            'ra' => 'audio/x-realaudio',\n            'wav' => 'audio/x-wav',\n            'mka' => 'audio/x-matroska',\n            'bmp' => 'image/bmp',\n            'gif' => 'image/gif',\n            'jpeg' => 'image/jpeg',\n            'jpe' => 'image/jpeg',\n            'jpg' => 'image/jpeg',\n            'png' => 'image/png',\n            'tiff' => 'image/tiff',\n            'tif' => 'image/tiff',\n            'webp' => 'image/webp',\n            'avif' => 'image/avif',\n            'heif' => 'image/heif',\n            'heifs' => 'image/heif-sequence',\n            'heic' => 'image/heic',\n            'heics' => 'image/heic-sequence',\n            'eml' => 'message/rfc822',\n            'css' => 'text/css',\n            'html' => 'text/html',\n            'htm' => 'text/html',\n            'shtml' => 'text/html',\n            'log' => 'text/plain',\n            'text' => 'text/plain',\n            'txt' => 'text/plain',\n            'rtx' => 'text/richtext',\n            'rtf' => 'text/rtf',\n            'vcf' => 'text/vcard',\n            'vcard' => 'text/vcard',\n            'ics' => 'text/calendar',\n            'xml' => 'text/xml',\n            'xsl' => 'text/xml',\n            'csv' => 'text/csv',\n            'wmv' => 'video/x-ms-wmv',\n            'mpeg' => 'video/mpeg',\n            'mpe' => 'video/mpeg',\n            'mpg' => 'video/mpeg',\n            'mp4' => 'video/mp4',\n            'm4v' => 'video/mp4',\n            'mov' => 'video/quicktime',\n            'qt' => 'video/quicktime',\n            'rv' => 'video/vnd.rn-realvideo',\n            'avi' => 'video/x-msvideo',\n            'movie' => 'video/x-sgi-movie',\n            'webm' => 'video/webm',\n            'mkv' => 'video/x-matroska',\n        ];\n        $ext = strtolower($ext);\n        if (array_key_exists($ext, $mimes)) {\n            return $mimes[$ext];\n        }\n\n        return 'application/octet-stream';\n    }\n\n    /**\n     * Map a file name to a MIME type.\n     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.\n     *\n     * @param string $filename A file name or full path, does not need to exist as a file\n     *\n     * @return string\n     */\n    public static function filenameToType($filename)\n    {\n        //In case the path is a URL, strip any query string before getting extension\n        $qpos = strpos($filename, '?');\n        if (false !== $qpos) {\n            $filename = substr($filename, 0, $qpos);\n        }\n        $ext = static::mb_pathinfo($filename, PATHINFO_EXTENSION);\n\n        return static::_mime_types($ext);\n    }\n\n    /**\n     * Multi-byte-safe pathinfo replacement.\n     * Drop-in replacement for pathinfo(), but multibyte- and cross-platform-safe.\n     *\n     * @see http://www.php.net/manual/en/function.pathinfo.php#107461\n     *\n     * @param string     $path    A filename or path, does not need to exist as a file\n     * @param int|string $options Either a PATHINFO_* constant,\n     *                            or a string name to return only the specified piece\n     *\n     * @return string|array\n     */\n    public static function mb_pathinfo($path, $options = null)\n    {\n        $ret = ['dirname' => '', 'basename' => '', 'extension' => '', 'filename' => ''];\n        $pathinfo = [];\n        if (preg_match('#^(.*?)[\\\\\\\\/]*(([^/\\\\\\\\]*?)(\\.([^.\\\\\\\\/]+?)|))[\\\\\\\\/.]*$#m', $path, $pathinfo)) {\n            if (array_key_exists(1, $pathinfo)) {\n                $ret['dirname'] = $pathinfo[1];\n            }\n            if (array_key_exists(2, $pathinfo)) {\n                $ret['basename'] = $pathinfo[2];\n            }\n            if (array_key_exists(5, $pathinfo)) {\n                $ret['extension'] = $pathinfo[5];\n            }\n            if (array_key_exists(3, $pathinfo)) {\n                $ret['filename'] = $pathinfo[3];\n            }\n        }\n        switch ($options) {\n            case PATHINFO_DIRNAME:\n            case 'dirname':\n                return $ret['dirname'];\n            case PATHINFO_BASENAME:\n            case 'basename':\n                return $ret['basename'];\n            case PATHINFO_EXTENSION:\n            case 'extension':\n                return $ret['extension'];\n            case PATHINFO_FILENAME:\n            case 'filename':\n                return $ret['filename'];\n            default:\n                return $ret;\n        }\n    }\n\n    /**\n     * Set or reset instance properties.\n     * You should avoid this function - it's more verbose, less efficient, more error-prone and\n     * harder to debug than setting properties directly.\n     * Usage Example:\n     * `$mail->set('SMTPSecure', static::ENCRYPTION_STARTTLS);`\n     *   is the same as:\n     * `$mail->SMTPSecure = static::ENCRYPTION_STARTTLS;`.\n     *\n     * @param string $name  The property name to set\n     * @param mixed  $value The value to set the property to\n     *\n     * @return bool\n     */\n    public function set($name, $value = '')\n    {\n        if (property_exists($this, $name)) {\n            $this->{$name} = $value;\n\n            return true;\n        }\n        $this->setError($this->lang('variable_set') . $name);\n\n        return false;\n    }\n\n    /**\n     * Strip newlines to prevent header injection.\n     *\n     * @param string $str\n     *\n     * @return string\n     */\n    public function secureHeader($str)\n    {\n        return trim(str_replace([\"\\r\", \"\\n\"], '', $str));\n    }\n\n    /**\n     * Normalize line breaks in a string.\n     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.\n     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.\n     *\n     * @param string $text\n     * @param string $breaktype What kind of line break to use; defaults to static::$LE\n     *\n     * @return string\n     */\n    public static function normalizeBreaks($text, $breaktype = null)\n    {\n        if (null === $breaktype) {\n            $breaktype = static::$LE;\n        }\n        //Normalise to \\n\n        $text = str_replace([self::CRLF, \"\\r\"], \"\\n\", $text);\n        //Now convert LE as needed\n        if (\"\\n\" !== $breaktype) {\n            $text = str_replace(\"\\n\", $breaktype, $text);\n        }\n\n        return $text;\n    }\n\n    /**\n     * Remove trailing whitespace from a string.\n     *\n     * @param string $text\n     *\n     * @return string The text to remove whitespace from\n     */\n    public static function stripTrailingWSP($text)\n    {\n        return rtrim($text, \" \\r\\n\\t\");\n    }\n\n    /**\n     * Strip trailing line breaks from a string.\n     *\n     * @param string $text\n     *\n     * @return string The text to remove breaks from\n     */\n    public static function stripTrailingBreaks($text)\n    {\n        return rtrim($text, \"\\r\\n\");\n    }\n\n    /**\n     * Return the current line break format string.\n     *\n     * @return string\n     */\n    public static function getLE()\n    {\n        return static::$LE;\n    }\n\n    /**\n     * Set the line break format string, e.g. \"\\r\\n\".\n     *\n     * @param string $le\n     */\n    protected static function setLE($le)\n    {\n        static::$LE = $le;\n    }\n\n    /**\n     * Set the public and private key files and password for S/MIME signing.\n     *\n     * @param string $cert_filename\n     * @param string $key_filename\n     * @param string $key_pass            Password for private key\n     * @param string $extracerts_filename Optional path to chain certificate\n     */\n    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')\n    {\n        $this->sign_cert_file = $cert_filename;\n        $this->sign_key_file = $key_filename;\n        $this->sign_key_pass = $key_pass;\n        $this->sign_extracerts_file = $extracerts_filename;\n    }\n\n    /**\n     * Quoted-Printable-encode a DKIM header.\n     *\n     * @param string $txt\n     *\n     * @return string\n     */\n    public function DKIM_QP($txt)\n    {\n        $line = '';\n        $len = strlen($txt);\n        for ($i = 0; $i < $len; ++$i) {\n            $ord = ord($txt[$i]);\n            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord === 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {\n                $line .= $txt[$i];\n            } else {\n                $line .= '=' . sprintf('%02X', $ord);\n            }\n        }\n\n        return $line;\n    }\n\n    /**\n     * Generate a DKIM signature.\n     *\n     * @param string $signHeader\n     *\n     * @throws Exception\n     *\n     * @return string The DKIM signature value\n     */\n    public function DKIM_Sign($signHeader)\n    {\n        if (!defined('PKCS7_TEXT')) {\n            if ($this->exceptions) {\n                throw new Exception($this->lang('extension_missing') . 'openssl');\n            }\n\n            return '';\n        }\n        $privKeyStr = !empty($this->DKIM_private_string) ?\n            $this->DKIM_private_string :\n            file_get_contents($this->DKIM_private);\n        if ('' !== $this->DKIM_passphrase) {\n            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);\n        } else {\n            $privKey = openssl_pkey_get_private($privKeyStr);\n        }\n        if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {\n            if (\\PHP_MAJOR_VERSION < 8) {\n                openssl_pkey_free($privKey);\n            }\n\n            return base64_encode($signature);\n        }\n        if (\\PHP_MAJOR_VERSION < 8) {\n            openssl_pkey_free($privKey);\n        }\n\n        return '';\n    }\n\n    /**\n     * Generate a DKIM canonicalization header.\n     * Uses the 'relaxed' algorithm from RFC6376 section 3.4.2.\n     * Canonicalized headers should *always* use CRLF, regardless of mailer setting.\n     *\n     * @see https://tools.ietf.org/html/rfc6376#section-3.4.2\n     *\n     * @param string $signHeader Header\n     *\n     * @return string\n     */\n    public function DKIM_HeaderC($signHeader)\n    {\n        //Normalize breaks to CRLF (regardless of the mailer)\n        $signHeader = static::normalizeBreaks($signHeader, self::CRLF);\n        //Unfold header lines\n        //Note PCRE \\s is too broad a definition of whitespace; RFC5322 defines it as `[ \\t]`\n        //@see https://tools.ietf.org/html/rfc5322#section-2.2\n        //That means this may break if you do something daft like put vertical tabs in your headers.\n        $signHeader = preg_replace('/\\r\\n[ \\t]+/', ' ', $signHeader);\n        //Break headers out into an array\n        $lines = explode(self::CRLF, $signHeader);\n        foreach ($lines as $key => $line) {\n            //If the header is missing a :, skip it as it's invalid\n            //This is likely to happen because the explode() above will also split\n            //on the trailing LE, leaving an empty line\n            if (strpos($line, ':') === false) {\n                continue;\n            }\n            list($heading, $value) = explode(':', $line, 2);\n            //Lower-case header name\n            $heading = strtolower($heading);\n            //Collapse white space within the value, also convert WSP to space\n            $value = preg_replace('/[ \\t]+/', ' ', $value);\n            //RFC6376 is slightly unclear here - it says to delete space at the *end* of each value\n            //But then says to delete space before and after the colon.\n            //Net result is the same as trimming both ends of the value.\n            //By elimination, the same applies to the field name\n            $lines[$key] = trim($heading, \" \\t\") . ':' . trim($value, \" \\t\");\n        }\n\n        return implode(self::CRLF, $lines);\n    }\n\n    /**\n     * Generate a DKIM canonicalization body.\n     * Uses the 'simple' algorithm from RFC6376 section 3.4.3.\n     * Canonicalized bodies should *always* use CRLF, regardless of mailer setting.\n     *\n     * @see https://tools.ietf.org/html/rfc6376#section-3.4.3\n     *\n     * @param string $body Message Body\n     *\n     * @return string\n     */\n    public function DKIM_BodyC($body)\n    {\n        if (empty($body)) {\n            return self::CRLF;\n        }\n        //Normalize line endings to CRLF\n        $body = static::normalizeBreaks($body, self::CRLF);\n\n        //Reduce multiple trailing line breaks to a single one\n        return static::stripTrailingBreaks($body) . self::CRLF;\n    }\n\n    /**\n     * Create the DKIM header and body in a new message header.\n     *\n     * @param string $headers_line Header lines\n     * @param string $subject      Subject\n     * @param string $body         Body\n     *\n     * @throws Exception\n     *\n     * @return string\n     */\n    public function DKIM_Add($headers_line, $subject, $body)\n    {\n        $DKIMsignatureType = 'rsa-sha256'; //Signature & hash algorithms\n        $DKIMcanonicalization = 'relaxed/simple'; //Canonicalization methods of header & body\n        $DKIMquery = 'dns/txt'; //Query method\n        $DKIMtime = time();\n        //Always sign these headers without being asked\n        //Recommended list from https://tools.ietf.org/html/rfc6376#section-5.4.1\n        $autoSignHeaders = [\n            'from',\n            'to',\n            'cc',\n            'date',\n            'subject',\n            'reply-to',\n            'message-id',\n            'content-type',\n            'mime-version',\n            'x-mailer',\n        ];\n        if (stripos($headers_line, 'Subject') === false) {\n            $headers_line .= 'Subject: ' . $subject . static::$LE;\n        }\n        $headerLines = explode(static::$LE, $headers_line);\n        $currentHeaderLabel = '';\n        $currentHeaderValue = '';\n        $parsedHeaders = [];\n        $headerLineIndex = 0;\n        $headerLineCount = count($headerLines);\n        foreach ($headerLines as $headerLine) {\n            $matches = [];\n            if (preg_match('/^([^ \\t]*?)(?::[ \\t]*)(.*)$/', $headerLine, $matches)) {\n                if ($currentHeaderLabel !== '') {\n                    //We were previously in another header; This is the start of a new header, so save the previous one\n                    $parsedHeaders[] = ['label' => $currentHeaderLabel, 'value' => $currentHeaderValue];\n                }\n                $currentHeaderLabel = $matches[1];\n                $currentHeaderValue = $matches[2];\n            } elseif (preg_match('/^[ \\t]+(.*)$/', $headerLine, $matches)) {\n                //This is a folded continuation of the current header, so unfold it\n                $currentHeaderValue .= ' ' . $matches[1];\n            }\n            ++$headerLineIndex;\n            if ($headerLineIndex >= $headerLineCount) {\n                //This was the last line, so finish off this header\n                $parsedHeaders[] = ['label' => $currentHeaderLabel, 'value' => $currentHeaderValue];\n            }\n        }\n        $copiedHeaders = [];\n        $headersToSignKeys = [];\n        $headersToSign = [];\n        foreach ($parsedHeaders as $header) {\n            //Is this header one that must be included in the DKIM signature?\n            if (in_array(strtolower($header['label']), $autoSignHeaders, true)) {\n                $headersToSignKeys[] = $header['label'];\n                $headersToSign[] = $header['label'] . ': ' . $header['value'];\n                if ($this->DKIM_copyHeaderFields) {\n                    $copiedHeaders[] = $header['label'] . ':' . //Note no space after this, as per RFC\n                        str_replace('|', '=7C', $this->DKIM_QP($header['value']));\n                }\n                continue;\n            }\n            //Is this an extra custom header we've been asked to sign?\n            if (in_array($header['label'], $this->DKIM_extraHeaders, true)) {\n                //Find its value in custom headers\n                foreach ($this->CustomHeader as $customHeader) {\n                    if ($customHeader[0] === $header['label']) {\n                        $headersToSignKeys[] = $header['label'];\n                        $headersToSign[] = $header['label'] . ': ' . $header['value'];\n                        if ($this->DKIM_copyHeaderFields) {\n                            $copiedHeaders[] = $header['label'] . ':' . //Note no space after this, as per RFC\n                                str_replace('|', '=7C', $this->DKIM_QP($header['value']));\n                        }\n                        //Skip straight to the next header\n                        continue 2;\n                    }\n                }\n            }\n        }\n        $copiedHeaderFields = '';\n        if ($this->DKIM_copyHeaderFields && count($copiedHeaders) > 0) {\n            //Assemble a DKIM 'z' tag\n            $copiedHeaderFields = ' z=';\n            $first = true;\n            foreach ($copiedHeaders as $copiedHeader) {\n                if (!$first) {\n                    $copiedHeaderFields .= static::$LE . ' |';\n                }\n                //Fold long values\n                if (strlen($copiedHeader) > self::STD_LINE_LENGTH - 3) {\n                    $copiedHeaderFields .= substr(\n                        chunk_split($copiedHeader, self::STD_LINE_LENGTH - 3, static::$LE . self::FWS),\n                        0,\n                        -strlen(static::$LE . self::FWS)\n                    );\n                } else {\n                    $copiedHeaderFields .= $copiedHeader;\n                }\n                $first = false;\n            }\n            $copiedHeaderFields .= ';' . static::$LE;\n        }\n        $headerKeys = ' h=' . implode(':', $headersToSignKeys) . ';' . static::$LE;\n        $headerValues = implode(static::$LE, $headersToSign);\n        $body = $this->DKIM_BodyC($body);\n        //Base64 of packed binary SHA-256 hash of body\n        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body)));\n        $ident = '';\n        if ('' !== $this->DKIM_identity) {\n            $ident = ' i=' . $this->DKIM_identity . ';' . static::$LE;\n        }\n        //The DKIM-Signature header is included in the signature *except for* the value of the `b` tag\n        //which is appended after calculating the signature\n        //https://tools.ietf.org/html/rfc6376#section-3.5\n        $dkimSignatureHeader = 'DKIM-Signature: v=1;' .\n            ' d=' . $this->DKIM_domain . ';' .\n            ' s=' . $this->DKIM_selector . ';' . static::$LE .\n            ' a=' . $DKIMsignatureType . ';' .\n            ' q=' . $DKIMquery . ';' .\n            ' t=' . $DKIMtime . ';' .\n            ' c=' . $DKIMcanonicalization . ';' . static::$LE .\n            $headerKeys .\n            $ident .\n            $copiedHeaderFields .\n            ' bh=' . $DKIMb64 . ';' . static::$LE .\n            ' b=';\n        //Canonicalize the set of headers\n        $canonicalizedHeaders = $this->DKIM_HeaderC(\n            $headerValues . static::$LE . $dkimSignatureHeader\n        );\n        $signature = $this->DKIM_Sign($canonicalizedHeaders);\n        $signature = trim(chunk_split($signature, self::STD_LINE_LENGTH - 3, static::$LE . self::FWS));\n\n        return static::normalizeBreaks($dkimSignatureHeader . $signature);\n    }\n\n    /**\n     * Detect if a string contains a line longer than the maximum line length\n     * allowed by RFC 2822 section 2.1.1.\n     *\n     * @param string $str\n     *\n     * @return bool\n     */\n    public static function hasLineLongerThanMax($str)\n    {\n        return (bool) preg_match('/^(.{' . (self::MAX_LINE_LENGTH + strlen(static::$LE)) . ',})/m', $str);\n    }\n\n    /**\n     * If a string contains any \"special\" characters, double-quote the name,\n     * and escape any double quotes with a backslash.\n     *\n     * @param string $str\n     *\n     * @return string\n     *\n     * @see RFC822 3.4.1\n     */\n    public static function quotedString($str)\n    {\n        if (preg_match('/[ ()<>@,;:\"\\/\\[\\]?=]/', $str)) {\n            //If the string contains any of these chars, it must be double-quoted\n            //and any double quotes must be escaped with a backslash\n            return '\"' . str_replace('\"', '\\\\\"', $str) . '\"';\n        }\n\n        //Return the string untouched, it doesn't need quoting\n        return $str;\n    }\n\n    /**\n     * Allows for public read access to 'to' property.\n     * Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     *\n     * @return array\n     */\n    public function getToAddresses()\n    {\n        return $this->to;\n    }\n\n    /**\n     * Allows for public read access to 'cc' property.\n     * Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     *\n     * @return array\n     */\n    public function getCcAddresses()\n    {\n        return $this->cc;\n    }\n\n    /**\n     * Allows for public read access to 'bcc' property.\n     * Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     *\n     * @return array\n     */\n    public function getBccAddresses()\n    {\n        return $this->bcc;\n    }\n\n    /**\n     * Allows for public read access to 'ReplyTo' property.\n     * Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     *\n     * @return array\n     */\n    public function getReplyToAddresses()\n    {\n        return $this->ReplyTo;\n    }\n\n    /**\n     * Allows for public read access to 'all_recipients' property.\n     * Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     *\n     * @return array\n     */\n    public function getAllRecipientAddresses()\n    {\n        return $this->all_recipients;\n    }\n\n    /**\n     * Perform a callback.\n     *\n     * @param bool   $isSent\n     * @param array  $to\n     * @param array  $cc\n     * @param array  $bcc\n     * @param string $subject\n     * @param string $body\n     * @param string $from\n     * @param array  $extra\n     */\n    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from, $extra)\n    {\n        if (!empty($this->action_function) && is_callable($this->action_function)) {\n            call_user_func($this->action_function, $isSent, $to, $cc, $bcc, $subject, $body, $from, $extra);\n        }\n    }\n\n    /**\n     * Get the OAuthTokenProvider instance.\n     *\n     * @return OAuthTokenProvider\n     */\n    public function getOAuth()\n    {\n        return $this->oauth;\n    }\n\n    /**\n     * Set an OAuthTokenProvider instance.\n     */\n    public function setOAuth(OAuthTokenProvider $oauth)\n    {\n        $this->oauth = $oauth;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/lib/phpmailer/POP3.php",
    "content": "<?php\n\n/**\n * PHPMailer POP-Before-SMTP Authentication Class.\n * PHP Version 5.5.\n *\n * @see https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n *\n * @author    Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author    Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author    Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author    Brent R. Matzelle (original founder)\n * @copyright 2012 - 2020 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license   http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note      This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\nnamespace PHPMailer\\PHPMailer;\n\n/**\n * PHPMailer POP-Before-SMTP Authentication Class.\n * Specifically for PHPMailer to use for RFC1939 POP-before-SMTP authentication.\n * 1) This class does not support APOP authentication.\n * 2) Opening and closing lots of POP3 connections can be quite slow. If you need\n *   to send a batch of emails then just perform the authentication once at the start,\n *   and then loop through your mail sending script. Providing this process doesn't\n *   take longer than the verification period lasts on your POP3 server, you should be fine.\n * 3) This is really ancient technology; you should only need to use it to talk to very old systems.\n * 4) This POP3 class is deliberately lightweight and incomplete, implementing just\n *   enough to do authentication.\n *   If you want a more complete class there are other POP3 classes for PHP available.\n *\n * @author Richard Davey (original author) <rich@corephp.co.uk>\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n */\nclass POP3\n{\n    /**\n     * The POP3 PHPMailer Version number.\n     *\n     * @var string\n     */\n    const VERSION = '6.8.0';\n\n    /**\n     * Default POP3 port number.\n     *\n     * @var int\n     */\n    const DEFAULT_PORT = 110;\n\n    /**\n     * Default timeout in seconds.\n     *\n     * @var int\n     */\n    const DEFAULT_TIMEOUT = 30;\n\n    /**\n     * POP3 class debug output mode.\n     * Debug output level.\n     * Options:\n     * @see POP3::DEBUG_OFF: No output\n     * @see POP3::DEBUG_SERVER: Server messages, connection/server errors\n     * @see POP3::DEBUG_CLIENT: Client and Server messages, connection/server errors\n     *\n     * @var int\n     */\n    public $do_debug = self::DEBUG_OFF;\n\n    /**\n     * POP3 mail server hostname.\n     *\n     * @var string\n     */\n    public $host;\n\n    /**\n     * POP3 port number.\n     *\n     * @var int\n     */\n    public $port;\n\n    /**\n     * POP3 Timeout Value in seconds.\n     *\n     * @var int\n     */\n    public $tval;\n\n    /**\n     * POP3 username.\n     *\n     * @var string\n     */\n    public $username;\n\n    /**\n     * POP3 password.\n     *\n     * @var string\n     */\n    public $password;\n\n    /**\n     * Resource handle for the POP3 connection socket.\n     *\n     * @var resource\n     */\n    protected $pop_conn;\n\n    /**\n     * Are we connected?\n     *\n     * @var bool\n     */\n    protected $connected = false;\n\n    /**\n     * Error container.\n     *\n     * @var array\n     */\n    protected $errors = [];\n\n    /**\n     * Line break constant.\n     */\n    const LE = \"\\r\\n\";\n\n    /**\n     * Debug level for no output.\n     *\n     * @var int\n     */\n    const DEBUG_OFF = 0;\n\n    /**\n     * Debug level to show server -> client messages\n     * also shows clients connection errors or errors from server\n     *\n     * @var int\n     */\n    const DEBUG_SERVER = 1;\n\n    /**\n     * Debug level to show client -> server and server -> client messages.\n     *\n     * @var int\n     */\n    const DEBUG_CLIENT = 2;\n\n    /**\n     * Simple static wrapper for all-in-one POP before SMTP.\n     *\n     * @param string   $host        The hostname to connect to\n     * @param int|bool $port        The port number to connect to\n     * @param int|bool $timeout     The timeout value\n     * @param string   $username\n     * @param string   $password\n     * @param int      $debug_level\n     *\n     * @return bool\n     */\n    public static function popBeforeSmtp(\n        $host,\n        $port = false,\n        $timeout = false,\n        $username = '',\n        $password = '',\n        $debug_level = 0\n    ) {\n        $pop = new self();\n\n        return $pop->authorise($host, $port, $timeout, $username, $password, $debug_level);\n    }\n\n    /**\n     * Authenticate with a POP3 server.\n     * A connect, login, disconnect sequence\n     * appropriate for POP-before SMTP authorisation.\n     *\n     * @param string   $host        The hostname to connect to\n     * @param int|bool $port        The port number to connect to\n     * @param int|bool $timeout     The timeout value\n     * @param string   $username\n     * @param string   $password\n     * @param int      $debug_level\n     *\n     * @return bool\n     */\n    public function authorise($host, $port = false, $timeout = false, $username = '', $password = '', $debug_level = 0)\n    {\n        $this->host = $host;\n        //If no port value provided, use default\n        if (false === $port) {\n            $this->port = static::DEFAULT_PORT;\n        } else {\n            $this->port = (int) $port;\n        }\n        //If no timeout value provided, use default\n        if (false === $timeout) {\n            $this->tval = static::DEFAULT_TIMEOUT;\n        } else {\n            $this->tval = (int) $timeout;\n        }\n        $this->do_debug = $debug_level;\n        $this->username = $username;\n        $this->password = $password;\n        //Reset the error log\n        $this->errors = [];\n        //Connect\n        $result = $this->connect($this->host, $this->port, $this->tval);\n        if ($result) {\n            $login_result = $this->login($this->username, $this->password);\n            if ($login_result) {\n                $this->disconnect();\n\n                return true;\n            }\n        }\n        //We need to disconnect regardless of whether the login succeeded\n        $this->disconnect();\n\n        return false;\n    }\n\n    /**\n     * Connect to a POP3 server.\n     *\n     * @param string   $host\n     * @param int|bool $port\n     * @param int      $tval\n     *\n     * @return bool\n     */\n    public function connect($host, $port = false, $tval = 30)\n    {\n        //Are we already connected?\n        if ($this->connected) {\n            return true;\n        }\n\n        //On Windows this will raise a PHP Warning error if the hostname doesn't exist.\n        //Rather than suppress it with @fsockopen, capture it cleanly instead\n        set_error_handler([$this, 'catchWarning']);\n\n        if (false === $port) {\n            $port = static::DEFAULT_PORT;\n        }\n\n        //Connect to the POP3 server\n        $errno = 0;\n        $errstr = '';\n        $this->pop_conn = fsockopen(\n            $host, //POP3 Host\n            $port, //Port #\n            $errno, //Error Number\n            $errstr, //Error Message\n            $tval\n        ); //Timeout (seconds)\n        //Restore the error handler\n        restore_error_handler();\n\n        //Did we connect?\n        if (false === $this->pop_conn) {\n            //It would appear not...\n            $this->setError(\n                \"Failed to connect to server $host on port $port. errno: $errno; errstr: $errstr\"\n            );\n\n            return false;\n        }\n\n        //Increase the stream time-out\n        stream_set_timeout($this->pop_conn, $tval, 0);\n\n        //Get the POP3 server response\n        $pop3_response = $this->getResponse();\n        //Check for the +OK\n        if ($this->checkResponse($pop3_response)) {\n            //The connection is established and the POP3 server is talking\n            $this->connected = true;\n\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Log in to the POP3 server.\n     * Does not support APOP (RFC 2828, 4949).\n     *\n     * @param string $username\n     * @param string $password\n     *\n     * @return bool\n     */\n    public function login($username = '', $password = '')\n    {\n        if (!$this->connected) {\n            $this->setError('Not connected to POP3 server');\n            return false;\n        }\n        if (empty($username)) {\n            $username = $this->username;\n        }\n        if (empty($password)) {\n            $password = $this->password;\n        }\n\n        //Send the Username\n        $this->sendString(\"USER $username\" . static::LE);\n        $pop3_response = $this->getResponse();\n        if ($this->checkResponse($pop3_response)) {\n            //Send the Password\n            $this->sendString(\"PASS $password\" . static::LE);\n            $pop3_response = $this->getResponse();\n            if ($this->checkResponse($pop3_response)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Disconnect from the POP3 server.\n     */\n    public function disconnect()\n    {\n        // If could not connect at all, no need to disconnect\n        if ($this->pop_conn === false) {\n            return;\n        }\n\n        $this->sendString('QUIT' . static::LE);\n\n        // RFC 1939 shows POP3 server sending a +OK response to the QUIT command.\n        // Try to get it.  Ignore any failures here.\n        try {\n            $this->getResponse();\n        } catch (Exception $e) {\n            //Do nothing\n        }\n\n        //The QUIT command may cause the daemon to exit, which will kill our connection\n        //So ignore errors here\n        try {\n            @fclose($this->pop_conn);\n        } catch (Exception $e) {\n            //Do nothing\n        }\n\n        // Clean up attributes.\n        $this->connected = false;\n        $this->pop_conn  = false;\n    }\n\n    /**\n     * Get a response from the POP3 server.\n     *\n     * @param int $size The maximum number of bytes to retrieve\n     *\n     * @return string\n     */\n    protected function getResponse($size = 128)\n    {\n        $response = fgets($this->pop_conn, $size);\n        if ($this->do_debug >= self::DEBUG_SERVER) {\n            echo 'Server -> Client: ', $response;\n        }\n\n        return $response;\n    }\n\n    /**\n     * Send raw data to the POP3 server.\n     *\n     * @param string $string\n     *\n     * @return int\n     */\n    protected function sendString($string)\n    {\n        if ($this->pop_conn) {\n            if ($this->do_debug >= self::DEBUG_CLIENT) { //Show client messages when debug >= 2\n                echo 'Client -> Server: ', $string;\n            }\n\n            return fwrite($this->pop_conn, $string, strlen($string));\n        }\n\n        return 0;\n    }\n\n    /**\n     * Checks the POP3 server response.\n     * Looks for for +OK or -ERR.\n     *\n     * @param string $string\n     *\n     * @return bool\n     */\n    protected function checkResponse($string)\n    {\n        if (strpos($string, '+OK') !== 0) {\n            $this->setError(\"Server reported an error: $string\");\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Add an error to the internal error store.\n     * Also display debug output if it's enabled.\n     *\n     * @param string $error\n     */\n    protected function setError($error)\n    {\n        $this->errors[] = $error;\n        if ($this->do_debug >= self::DEBUG_SERVER) {\n            echo '<pre>';\n            foreach ($this->errors as $e) {\n                print_r($e);\n            }\n            echo '</pre>';\n        }\n    }\n\n    /**\n     * Get an array of error messages, if any.\n     *\n     * @return array\n     */\n    public function getErrors()\n    {\n        return $this->errors;\n    }\n\n    /**\n     * POP3 connection error handler.\n     *\n     * @param int    $errno\n     * @param string $errstr\n     * @param string $errfile\n     * @param int    $errline\n     */\n    protected function catchWarning($errno, $errstr, $errfile, $errline)\n    {\n        $this->setError(\n            'Connecting to the POP3 server raised a PHP warning:' .\n            \"errno: $errno errstr: $errstr; errfile: $errfile; errline: $errline\"\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/lib/phpmailer/SMTP.php",
    "content": "<?php\n\n/**\n * PHPMailer RFC821 SMTP email transport class.\n * PHP Version 5.5.\n *\n * @see       https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n *\n * @author    Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author    Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author    Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author    Brent R. Matzelle (original founder)\n * @copyright 2012 - 2020 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license   http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note      This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\nnamespace PHPMailer\\PHPMailer;\n\n/**\n * PHPMailer RFC821 SMTP email transport class.\n * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.\n *\n * @author Chris Ryan\n * @author Marcus Bointon <phpmailer@synchromedia.co.uk>\n */\nclass SMTP\n{\n    /**\n     * The PHPMailer SMTP version number.\n     *\n     * @var string\n     */\n    const VERSION = '6.8.0';\n\n    /**\n     * SMTP line break constant.\n     *\n     * @var string\n     */\n    const LE = \"\\r\\n\";\n\n    /**\n     * The SMTP port to use if one is not specified.\n     *\n     * @var int\n     */\n    const DEFAULT_PORT = 25;\n\n    /**\n     * The SMTPs port to use if one is not specified.\n     *\n     * @var int\n     */\n    const DEFAULT_SECURE_PORT = 465;\n\n    /**\n     * The maximum line length allowed by RFC 5321 section 4.5.3.1.6,\n     * *excluding* a trailing CRLF break.\n     *\n     * @see https://tools.ietf.org/html/rfc5321#section-4.5.3.1.6\n     *\n     * @var int\n     */\n    const MAX_LINE_LENGTH = 998;\n\n    /**\n     * The maximum line length allowed for replies in RFC 5321 section 4.5.3.1.5,\n     * *including* a trailing CRLF line break.\n     *\n     * @see https://tools.ietf.org/html/rfc5321#section-4.5.3.1.5\n     *\n     * @var int\n     */\n    const MAX_REPLY_LENGTH = 512;\n\n    /**\n     * Debug level for no output.\n     *\n     * @var int\n     */\n    const DEBUG_OFF = 0;\n\n    /**\n     * Debug level to show client -> server messages.\n     *\n     * @var int\n     */\n    const DEBUG_CLIENT = 1;\n\n    /**\n     * Debug level to show client -> server and server -> client messages.\n     *\n     * @var int\n     */\n    const DEBUG_SERVER = 2;\n\n    /**\n     * Debug level to show connection status, client -> server and server -> client messages.\n     *\n     * @var int\n     */\n    const DEBUG_CONNECTION = 3;\n\n    /**\n     * Debug level to show all messages.\n     *\n     * @var int\n     */\n    const DEBUG_LOWLEVEL = 4;\n\n    /**\n     * Debug output level.\n     * Options:\n     * * self::DEBUG_OFF (`0`) No debug output, default\n     * * self::DEBUG_CLIENT (`1`) Client commands\n     * * self::DEBUG_SERVER (`2`) Client commands and server responses\n     * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status\n     * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages.\n     *\n     * @var int\n     */\n    public $do_debug = self::DEBUG_OFF;\n\n    /**\n     * How to handle debug output.\n     * Options:\n     * * `echo` Output plain-text as-is, appropriate for CLI\n     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n     * * `error_log` Output to error log as configured in php.ini\n     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n     *\n     * ```php\n     * $smtp->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n     * ```\n     *\n     * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug`\n     * level output is used:\n     *\n     * ```php\n     * $mail->Debugoutput = new myPsr3Logger;\n     * ```\n     *\n     * @var string|callable|\\Psr\\Log\\LoggerInterface\n     */\n    public $Debugoutput = 'echo';\n\n    /**\n     * Whether to use VERP.\n     *\n     * @see http://en.wikipedia.org/wiki/Variable_envelope_return_path\n     * @see http://www.postfix.org/VERP_README.html Info on VERP\n     *\n     * @var bool\n     */\n    public $do_verp = false;\n\n    /**\n     * The timeout value for connection, in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2.\n     * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.\n     *\n     * @see http://tools.ietf.org/html/rfc2821#section-4.5.3.2\n     *\n     * @var int\n     */\n    public $Timeout = 300;\n\n    /**\n     * How long to wait for commands to complete, in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2.\n     *\n     * @var int\n     */\n    public $Timelimit = 300;\n\n    /**\n     * Patterns to extract an SMTP transaction id from reply to a DATA command.\n     * The first capture group in each regex will be used as the ID.\n     * MS ESMTP returns the message ID, which may not be correct for internal tracking.\n     *\n     * @var string[]\n     */\n    protected $smtp_transaction_id_patterns = [\n        'exim' => '/[\\d]{3} OK id=(.*)/',\n        'sendmail' => '/[\\d]{3} 2.0.0 (.*) Message/',\n        'postfix' => '/[\\d]{3} 2.0.0 Ok: queued as (.*)/',\n        'Microsoft_ESMTP' => '/[0-9]{3} 2.[\\d].0 (.*)@(?:.*) Queued mail for delivery/',\n        'Amazon_SES' => '/[\\d]{3} Ok (.*)/',\n        'SendGrid' => '/[\\d]{3} Ok: queued as (.*)/',\n        'CampaignMonitor' => '/[\\d]{3} 2.0.0 OK:([a-zA-Z\\d]{48})/',\n        'Haraka' => '/[\\d]{3} Message Queued \\((.*)\\)/',\n        'ZoneMTA' => '/[\\d]{3} Message queued as (.*)/',\n        'Mailjet' => '/[\\d]{3} OK queued as (.*)/',\n    ];\n\n    /**\n     * The last transaction ID issued in response to a DATA command,\n     * if one was detected.\n     *\n     * @var string|bool|null\n     */\n    protected $last_smtp_transaction_id;\n\n    /**\n     * The socket for the server connection.\n     *\n     * @var ?resource\n     */\n    protected $smtp_conn;\n\n    /**\n     * Error information, if any, for the last SMTP command.\n     *\n     * @var array\n     */\n    protected $error = [\n        'error' => '',\n        'detail' => '',\n        'smtp_code' => '',\n        'smtp_code_ex' => '',\n    ];\n\n    /**\n     * The reply the server sent to us for HELO.\n     * If null, no HELO string has yet been received.\n     *\n     * @var string|null\n     */\n    protected $helo_rply;\n\n    /**\n     * The set of SMTP extensions sent in reply to EHLO command.\n     * Indexes of the array are extension names.\n     * Value at index 'HELO' or 'EHLO' (according to command that was sent)\n     * represents the server name. In case of HELO it is the only element of the array.\n     * Other values can be boolean TRUE or an array containing extension options.\n     * If null, no HELO/EHLO string has yet been received.\n     *\n     * @var array|null\n     */\n    protected $server_caps;\n\n    /**\n     * The most recent reply received from the server.\n     *\n     * @var string\n     */\n    protected $last_reply = '';\n\n    /**\n     * Output debugging info via a user-selected method.\n     *\n     * @param string $str   Debug string to output\n     * @param int    $level The debug level of this message; see DEBUG_* constants\n     *\n     * @see SMTP::$Debugoutput\n     * @see SMTP::$do_debug\n     */\n    protected function edebug($str, $level = 0)\n    {\n        if ($level > $this->do_debug) {\n            return;\n        }\n        //Is this a PSR-3 logger?\n        if ($this->Debugoutput instanceof \\Psr\\Log\\LoggerInterface) {\n            $this->Debugoutput->debug($str);\n\n            return;\n        }\n        //Avoid clash with built-in function names\n        if (is_callable($this->Debugoutput) && !in_array($this->Debugoutput, ['error_log', 'html', 'echo'])) {\n            call_user_func($this->Debugoutput, $str, $level);\n\n            return;\n        }\n        switch ($this->Debugoutput) {\n            case 'error_log':\n                //Don't output, just log\n                error_log($str);\n                break;\n            case 'html':\n                //Cleans up output a bit for a better looking, HTML-safe output\n                echo gmdate('Y-m-d H:i:s'), ' ', htmlentities(\n                    preg_replace('/[\\r\\n]+/', '', $str),\n                    ENT_QUOTES,\n                    'UTF-8'\n                ), \"<br>\\n\";\n                break;\n            case 'echo':\n            default:\n                //Normalize line breaks\n                $str = preg_replace('/\\r\\n|\\r/m', \"\\n\", $str);\n                echo gmdate('Y-m-d H:i:s'),\n                \"\\t\",\n                    //Trim trailing space\n                trim(\n                    //Indent for readability, except for trailing break\n                    str_replace(\n                        \"\\n\",\n                        \"\\n                   \\t                  \",\n                        trim($str)\n                    )\n                ),\n                \"\\n\";\n        }\n    }\n\n    /**\n     * Connect to an SMTP server.\n     *\n     * @param string $host    SMTP server IP or host name\n     * @param int    $port    The port number to connect to\n     * @param int    $timeout How long to wait for the connection to open\n     * @param array  $options An array of options for stream_context_create()\n     *\n     * @return bool\n     */\n    public function connect($host, $port = null, $timeout = 30, $options = [])\n    {\n        //Clear errors to avoid confusion\n        $this->setError('');\n        //Make sure we are __not__ connected\n        if ($this->connected()) {\n            //Already connected, generate error\n            $this->setError('Already connected to a server');\n\n            return false;\n        }\n        if (empty($port)) {\n            $port = self::DEFAULT_PORT;\n        }\n        //Connect to the SMTP server\n        $this->edebug(\n            \"Connection: opening to $host:$port, timeout=$timeout, options=\" .\n            (count($options) > 0 ? var_export($options, true) : 'array()'),\n            self::DEBUG_CONNECTION\n        );\n\n        $this->smtp_conn = $this->getSMTPConnection($host, $port, $timeout, $options);\n\n        if ($this->smtp_conn === false) {\n            //Error info already set inside `getSMTPConnection()`\n            return false;\n        }\n\n        $this->edebug('Connection: opened', self::DEBUG_CONNECTION);\n\n        //Get any announcement\n        $this->last_reply = $this->get_lines();\n        $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);\n        $responseCode = (int)substr($this->last_reply, 0, 3);\n        if ($responseCode === 220) {\n            return true;\n        }\n        //Anything other than a 220 response means something went wrong\n        //RFC 5321 says the server will wait for us to send a QUIT in response to a 554 error\n        //https://tools.ietf.org/html/rfc5321#section-3.1\n        if ($responseCode === 554) {\n            $this->quit();\n        }\n        //This will handle 421 responses which may not wait for a QUIT (e.g. if the server is being shut down)\n        $this->edebug('Connection: closing due to error', self::DEBUG_CONNECTION);\n        $this->close();\n        return false;\n    }\n\n    /**\n     * Create connection to the SMTP server.\n     *\n     * @param string $host    SMTP server IP or host name\n     * @param int    $port    The port number to connect to\n     * @param int    $timeout How long to wait for the connection to open\n     * @param array  $options An array of options for stream_context_create()\n     *\n     * @return false|resource\n     */\n    protected function getSMTPConnection($host, $port = null, $timeout = 30, $options = [])\n    {\n        static $streamok;\n        //This is enabled by default since 5.0.0 but some providers disable it\n        //Check this once and cache the result\n        if (null === $streamok) {\n            $streamok = function_exists('stream_socket_client');\n        }\n\n        $errno = 0;\n        $errstr = '';\n        if ($streamok) {\n            $socket_context = stream_context_create($options);\n            set_error_handler([$this, 'errorHandler']);\n            $connection = stream_socket_client(\n                $host . ':' . $port,\n                $errno,\n                $errstr,\n                $timeout,\n                STREAM_CLIENT_CONNECT,\n                $socket_context\n            );\n        } else {\n            //Fall back to fsockopen which should work in more places, but is missing some features\n            $this->edebug(\n                'Connection: stream_socket_client not available, falling back to fsockopen',\n                self::DEBUG_CONNECTION\n            );\n            set_error_handler([$this, 'errorHandler']);\n            $connection = fsockopen(\n                $host,\n                $port,\n                $errno,\n                $errstr,\n                $timeout\n            );\n        }\n        restore_error_handler();\n\n        //Verify we connected properly\n        if (!is_resource($connection)) {\n            $this->setError(\n                'Failed to connect to server',\n                '',\n                (string) $errno,\n                $errstr\n            );\n            $this->edebug(\n                'SMTP ERROR: ' . $this->error['error']\n                . \": $errstr ($errno)\",\n                self::DEBUG_CLIENT\n            );\n\n            return false;\n        }\n\n        //SMTP server can take longer to respond, give longer timeout for first read\n        //Windows does not have support for this timeout function\n        if (strpos(PHP_OS, 'WIN') !== 0) {\n            $max = (int)ini_get('max_execution_time');\n            //Don't bother if unlimited, or if set_time_limit is disabled\n            if (0 !== $max && $timeout > $max && strpos(ini_get('disable_functions'), 'set_time_limit') === false) {\n                @set_time_limit($timeout);\n            }\n            stream_set_timeout($connection, $timeout, 0);\n        }\n\n        return $connection;\n    }\n\n    /**\n     * Initiate a TLS (encrypted) session.\n     *\n     * @return bool\n     */\n    public function startTLS()\n    {\n        if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {\n            return false;\n        }\n\n        //Allow the best TLS version(s) we can\n        $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;\n\n        //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT\n        //so add them back in manually if we can\n        if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {\n            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;\n            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;\n        }\n\n        //Begin encrypted connection\n        set_error_handler([$this, 'errorHandler']);\n        $crypto_ok = stream_socket_enable_crypto(\n            $this->smtp_conn,\n            true,\n            $crypto_method\n        );\n        restore_error_handler();\n\n        return (bool) $crypto_ok;\n    }\n\n    /**\n     * Perform SMTP authentication.\n     * Must be run after hello().\n     *\n     * @see    hello()\n     *\n     * @param string $username The user name\n     * @param string $password The password\n     * @param string $authtype The auth type (CRAM-MD5, PLAIN, LOGIN, XOAUTH2)\n     * @param OAuthTokenProvider $OAuth An optional OAuthTokenProvider instance for XOAUTH2 authentication\n     *\n     * @return bool True if successfully authenticated\n     */\n    public function authenticate(\n        $username,\n        $password,\n        $authtype = null,\n        $OAuth = null\n    ) {\n        if (!$this->server_caps) {\n            $this->setError('Authentication is not allowed before HELO/EHLO');\n\n            return false;\n        }\n\n        if (array_key_exists('EHLO', $this->server_caps)) {\n            //SMTP extensions are available; try to find a proper authentication method\n            if (!array_key_exists('AUTH', $this->server_caps)) {\n                $this->setError('Authentication is not allowed at this stage');\n                //'at this stage' means that auth may be allowed after the stage changes\n                //e.g. after STARTTLS\n\n                return false;\n            }\n\n            $this->edebug('Auth method requested: ' . ($authtype ?: 'UNSPECIFIED'), self::DEBUG_LOWLEVEL);\n            $this->edebug(\n                'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),\n                self::DEBUG_LOWLEVEL\n            );\n\n            //If we have requested a specific auth type, check the server supports it before trying others\n            if (null !== $authtype && !in_array($authtype, $this->server_caps['AUTH'], true)) {\n                $this->edebug('Requested auth method not available: ' . $authtype, self::DEBUG_LOWLEVEL);\n                $authtype = null;\n            }\n\n            if (empty($authtype)) {\n                //If no auth mechanism is specified, attempt to use these, in this order\n                //Try CRAM-MD5 first as it's more secure than the others\n                foreach (['CRAM-MD5', 'LOGIN', 'PLAIN', 'XOAUTH2'] as $method) {\n                    if (in_array($method, $this->server_caps['AUTH'], true)) {\n                        $authtype = $method;\n                        break;\n                    }\n                }\n                if (empty($authtype)) {\n                    $this->setError('No supported authentication methods found');\n\n                    return false;\n                }\n                $this->edebug('Auth method selected: ' . $authtype, self::DEBUG_LOWLEVEL);\n            }\n\n            if (!in_array($authtype, $this->server_caps['AUTH'], true)) {\n                $this->setError(\"The requested authentication method \\\"$authtype\\\" is not supported by the server\");\n\n                return false;\n            }\n        } elseif (empty($authtype)) {\n            $authtype = 'LOGIN';\n        }\n        switch ($authtype) {\n            case 'PLAIN':\n                //Start authentication\n                if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {\n                    return false;\n                }\n                //Send encoded username and password\n                if (\n                    //Format from https://tools.ietf.org/html/rfc4616#section-2\n                    //We skip the first field (it's forgery), so the string starts with a null byte\n                    !$this->sendCommand(\n                        'User & Password',\n                        base64_encode(\"\\0\" . $username . \"\\0\" . $password),\n                        235\n                    )\n                ) {\n                    return false;\n                }\n                break;\n            case 'LOGIN':\n                //Start authentication\n                if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {\n                    return false;\n                }\n                if (!$this->sendCommand('Username', base64_encode($username), 334)) {\n                    return false;\n                }\n                if (!$this->sendCommand('Password', base64_encode($password), 235)) {\n                    return false;\n                }\n                break;\n            case 'CRAM-MD5':\n                //Start authentication\n                if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {\n                    return false;\n                }\n                //Get the challenge\n                $challenge = base64_decode(substr($this->last_reply, 4));\n\n                //Build the response\n                $response = $username . ' ' . $this->hmac($challenge, $password);\n\n                //send encoded credentials\n                return $this->sendCommand('Username', base64_encode($response), 235);\n            case 'XOAUTH2':\n                //The OAuth instance must be set up prior to requesting auth.\n                if (null === $OAuth) {\n                    return false;\n                }\n                $oauth = $OAuth->getOauth64();\n\n                //Start authentication\n                if (!$this->sendCommand('AUTH', 'AUTH XOAUTH2 ' . $oauth, 235)) {\n                    return false;\n                }\n                break;\n            default:\n                $this->setError(\"Authentication method \\\"$authtype\\\" is not supported\");\n\n                return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Calculate an MD5 HMAC hash.\n     * Works like hash_hmac('md5', $data, $key)\n     * in case that function is not available.\n     *\n     * @param string $data The data to hash\n     * @param string $key  The key to hash with\n     *\n     * @return string\n     */\n    protected function hmac($data, $key)\n    {\n        if (function_exists('hash_hmac')) {\n            return hash_hmac('md5', $data, $key);\n        }\n\n        //The following borrowed from\n        //http://php.net/manual/en/function.mhash.php#27225\n\n        //RFC 2104 HMAC implementation for php.\n        //Creates an md5 HMAC.\n        //Eliminates the need to install mhash to compute a HMAC\n        //by Lance Rushing\n\n        $bytelen = 64; //byte length for md5\n        if (strlen($key) > $bytelen) {\n            $key = pack('H*', md5($key));\n        }\n        $key = str_pad($key, $bytelen, chr(0x00));\n        $ipad = str_pad('', $bytelen, chr(0x36));\n        $opad = str_pad('', $bytelen, chr(0x5c));\n        $k_ipad = $key ^ $ipad;\n        $k_opad = $key ^ $opad;\n\n        return md5($k_opad . pack('H*', md5($k_ipad . $data)));\n    }\n\n    /**\n     * Check connection state.\n     *\n     * @return bool True if connected\n     */\n    public function connected()\n    {\n        if (is_resource($this->smtp_conn)) {\n            $sock_status = stream_get_meta_data($this->smtp_conn);\n            if ($sock_status['eof']) {\n                //The socket is valid but we are not connected\n                $this->edebug(\n                    'SMTP NOTICE: EOF caught while checking if connected',\n                    self::DEBUG_CLIENT\n                );\n                $this->close();\n\n                return false;\n            }\n\n            return true; //everything looks good\n        }\n\n        return false;\n    }\n\n    /**\n     * Close the socket and clean up the state of the class.\n     * Don't use this function without first trying to use QUIT.\n     *\n     * @see quit()\n     */\n    public function close()\n    {\n        $this->server_caps = null;\n        $this->helo_rply = null;\n        if (is_resource($this->smtp_conn)) {\n            //Close the connection and cleanup\n            fclose($this->smtp_conn);\n            $this->smtp_conn = null; //Makes for cleaner serialization\n            $this->edebug('Connection: closed', self::DEBUG_CONNECTION);\n        }\n    }\n\n    /**\n     * Send an SMTP DATA command.\n     * Issues a data command and sends the msg_data to the server,\n     * finalizing the mail transaction. $msg_data is the message\n     * that is to be send with the headers. Each header needs to be\n     * on a single line followed by a <CRLF> with the message headers\n     * and the message body being separated by an additional <CRLF>.\n     * Implements RFC 821: DATA <CRLF>.\n     *\n     * @param string $msg_data Message data to send\n     *\n     * @return bool\n     */\n    public function data($msg_data)\n    {\n        //This will use the standard timelimit\n        if (!$this->sendCommand('DATA', 'DATA', 354)) {\n            return false;\n        }\n\n        /* The server is ready to accept data!\n         * According to rfc821 we should not send more than 1000 characters on a single line (including the LE)\n         * so we will break the data up into lines by \\r and/or \\n then if needed we will break each of those into\n         * smaller lines to fit within the limit.\n         * We will also look for lines that start with a '.' and prepend an additional '.'.\n         * NOTE: this does not count towards line-length limit.\n         */\n\n        //Normalize line breaks before exploding\n        $lines = explode(\"\\n\", str_replace([\"\\r\\n\", \"\\r\"], \"\\n\", $msg_data));\n\n        /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field\n         * of the first line (':' separated) does not contain a space then it _should_ be a header and we will\n         * process all lines before a blank line as headers.\n         */\n\n        $field = substr($lines[0], 0, strpos($lines[0], ':'));\n        $in_headers = false;\n        if (!empty($field) && strpos($field, ' ') === false) {\n            $in_headers = true;\n        }\n\n        foreach ($lines as $line) {\n            $lines_out = [];\n            if ($in_headers && $line === '') {\n                $in_headers = false;\n            }\n            //Break this line up into several smaller lines if it's too long\n            //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len),\n            while (isset($line[self::MAX_LINE_LENGTH])) {\n                //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on\n                //so as to avoid breaking in the middle of a word\n                $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');\n                //Deliberately matches both false and 0\n                if (!$pos) {\n                    //No nice break found, add a hard break\n                    $pos = self::MAX_LINE_LENGTH - 1;\n                    $lines_out[] = substr($line, 0, $pos);\n                    $line = substr($line, $pos);\n                } else {\n                    //Break at the found point\n                    $lines_out[] = substr($line, 0, $pos);\n                    //Move along by the amount we dealt with\n                    $line = substr($line, $pos + 1);\n                }\n                //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1\n                if ($in_headers) {\n                    $line = \"\\t\" . $line;\n                }\n            }\n            $lines_out[] = $line;\n\n            //Send the lines to the server\n            foreach ($lines_out as $line_out) {\n                //Dot-stuffing as per RFC5321 section 4.5.2\n                //https://tools.ietf.org/html/rfc5321#section-4.5.2\n                if (!empty($line_out) && $line_out[0] === '.') {\n                    $line_out = '.' . $line_out;\n                }\n                $this->client_send($line_out . static::LE, 'DATA');\n            }\n        }\n\n        //Message data has been sent, complete the command\n        //Increase timelimit for end of DATA command\n        $savetimelimit = $this->Timelimit;\n        $this->Timelimit *= 2;\n        $result = $this->sendCommand('DATA END', '.', 250);\n        $this->recordLastTransactionID();\n        //Restore timelimit\n        $this->Timelimit = $savetimelimit;\n\n        return $result;\n    }\n\n    /**\n     * Send an SMTP HELO or EHLO command.\n     * Used to identify the sending server to the receiving server.\n     * This makes sure that client and server are in a known state.\n     * Implements RFC 821: HELO <SP> <domain> <CRLF>\n     * and RFC 2821 EHLO.\n     *\n     * @param string $host The host name or IP to connect to\n     *\n     * @return bool\n     */\n    public function hello($host = '')\n    {\n        //Try extended hello first (RFC 2821)\n        if ($this->sendHello('EHLO', $host)) {\n            return true;\n        }\n\n        //Some servers shut down the SMTP service here (RFC 5321)\n        if (substr($this->helo_rply, 0, 3) == '421') {\n            return false;\n        }\n\n        return $this->sendHello('HELO', $host);\n    }\n\n    /**\n     * Send an SMTP HELO or EHLO command.\n     * Low-level implementation used by hello().\n     *\n     * @param string $hello The HELO string\n     * @param string $host  The hostname to say we are\n     *\n     * @return bool\n     *\n     * @see hello()\n     */\n    protected function sendHello($hello, $host)\n    {\n        $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);\n        $this->helo_rply = $this->last_reply;\n        if ($noerror) {\n            $this->parseHelloFields($hello);\n        } else {\n            $this->server_caps = null;\n        }\n\n        return $noerror;\n    }\n\n    /**\n     * Parse a reply to HELO/EHLO command to discover server extensions.\n     * In case of HELO, the only parameter that can be discovered is a server name.\n     *\n     * @param string $type `HELO` or `EHLO`\n     */\n    protected function parseHelloFields($type)\n    {\n        $this->server_caps = [];\n        $lines = explode(\"\\n\", $this->helo_rply);\n\n        foreach ($lines as $n => $s) {\n            //First 4 chars contain response code followed by - or space\n            $s = trim(substr($s, 4));\n            if (empty($s)) {\n                continue;\n            }\n            $fields = explode(' ', $s);\n            if (!empty($fields)) {\n                if (!$n) {\n                    $name = $type;\n                    $fields = $fields[0];\n                } else {\n                    $name = array_shift($fields);\n                    switch ($name) {\n                        case 'SIZE':\n                            $fields = ($fields ? $fields[0] : 0);\n                            break;\n                        case 'AUTH':\n                            if (!is_array($fields)) {\n                                $fields = [];\n                            }\n                            break;\n                        default:\n                            $fields = true;\n                    }\n                }\n                $this->server_caps[$name] = $fields;\n            }\n        }\n    }\n\n    /**\n     * Send an SMTP MAIL command.\n     * Starts a mail transaction from the email address specified in\n     * $from. Returns true if successful or false otherwise. If True\n     * the mail transaction is started and then one or more recipient\n     * commands may be called followed by a data command.\n     * Implements RFC 821: MAIL <SP> FROM:<reverse-path> <CRLF>.\n     *\n     * @param string $from Source address of this message\n     *\n     * @return bool\n     */\n    public function mail($from)\n    {\n        $useVerp = ($this->do_verp ? ' XVERP' : '');\n\n        return $this->sendCommand(\n            'MAIL FROM',\n            'MAIL FROM:<' . $from . '>' . $useVerp,\n            250\n        );\n    }\n\n    /**\n     * Send an SMTP QUIT command.\n     * Closes the socket if there is no error or the $close_on_error argument is true.\n     * Implements from RFC 821: QUIT <CRLF>.\n     *\n     * @param bool $close_on_error Should the connection close if an error occurs?\n     *\n     * @return bool\n     */\n    public function quit($close_on_error = true)\n    {\n        $noerror = $this->sendCommand('QUIT', 'QUIT', 221);\n        $err = $this->error; //Save any error\n        if ($noerror || $close_on_error) {\n            $this->close();\n            $this->error = $err; //Restore any error from the quit command\n        }\n\n        return $noerror;\n    }\n\n    /**\n     * Send an SMTP RCPT command.\n     * Sets the TO argument to $toaddr.\n     * Returns true if the recipient was accepted false if it was rejected.\n     * Implements from RFC 821: RCPT <SP> TO:<forward-path> <CRLF>.\n     *\n     * @param string $address The address the message is being sent to\n     * @param string $dsn     Comma separated list of DSN notifications. NEVER, SUCCESS, FAILURE\n     *                        or DELAY. If you specify NEVER all other notifications are ignored.\n     *\n     * @return bool\n     */\n    public function recipient($address, $dsn = '')\n    {\n        if (empty($dsn)) {\n            $rcpt = 'RCPT TO:<' . $address . '>';\n        } else {\n            $dsn = strtoupper($dsn);\n            $notify = [];\n\n            if (strpos($dsn, 'NEVER') !== false) {\n                $notify[] = 'NEVER';\n            } else {\n                foreach (['SUCCESS', 'FAILURE', 'DELAY'] as $value) {\n                    if (strpos($dsn, $value) !== false) {\n                        $notify[] = $value;\n                    }\n                }\n            }\n\n            $rcpt = 'RCPT TO:<' . $address . '> NOTIFY=' . implode(',', $notify);\n        }\n\n        return $this->sendCommand(\n            'RCPT TO',\n            $rcpt,\n            [250, 251]\n        );\n    }\n\n    /**\n     * Send an SMTP RSET command.\n     * Abort any transaction that is currently in progress.\n     * Implements RFC 821: RSET <CRLF>.\n     *\n     * @return bool True on success\n     */\n    public function reset()\n    {\n        return $this->sendCommand('RSET', 'RSET', 250);\n    }\n\n    /**\n     * Send a command to an SMTP server and check its return code.\n     *\n     * @param string    $command       The command name - not sent to the server\n     * @param string    $commandstring The actual command to send\n     * @param int|array $expect        One or more expected integer success codes\n     *\n     * @return bool True on success\n     */\n    protected function sendCommand($command, $commandstring, $expect)\n    {\n        if (!$this->connected()) {\n            $this->setError(\"Called $command without being connected\");\n\n            return false;\n        }\n        //Reject line breaks in all commands\n        if ((strpos($commandstring, \"\\n\") !== false) || (strpos($commandstring, \"\\r\") !== false)) {\n            $this->setError(\"Command '$command' contained line breaks\");\n\n            return false;\n        }\n        $this->client_send($commandstring . static::LE, $command);\n\n        $this->last_reply = $this->get_lines();\n        //Fetch SMTP code and possible error code explanation\n        $matches = [];\n        if (preg_match('/^([\\d]{3})[ -](?:([\\d]\\\\.[\\d]\\\\.[\\d]{1,2}) )?/', $this->last_reply, $matches)) {\n            $code = (int) $matches[1];\n            $code_ex = (count($matches) > 2 ? $matches[2] : null);\n            //Cut off error code from each response line\n            $detail = preg_replace(\n                \"/{$code}[ -]\" .\n                ($code_ex ? str_replace('.', '\\\\.', $code_ex) . ' ' : '') . '/m',\n                '',\n                $this->last_reply\n            );\n        } else {\n            //Fall back to simple parsing if regex fails\n            $code = (int) substr($this->last_reply, 0, 3);\n            $code_ex = null;\n            $detail = substr($this->last_reply, 4);\n        }\n\n        $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);\n\n        if (!in_array($code, (array) $expect, true)) {\n            $this->setError(\n                \"$command command failed\",\n                $detail,\n                $code,\n                $code_ex\n            );\n            $this->edebug(\n                'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,\n                self::DEBUG_CLIENT\n            );\n\n            return false;\n        }\n\n        //Don't clear the error store when using keepalive\n        if ($command !== 'RSET') {\n            $this->setError('');\n        }\n\n        return true;\n    }\n\n    /**\n     * Send an SMTP SAML command.\n     * Starts a mail transaction from the email address specified in $from.\n     * Returns true if successful or false otherwise. If True\n     * the mail transaction is started and then one or more recipient\n     * commands may be called followed by a data command. This command\n     * will send the message to the users terminal if they are logged\n     * in and send them an email.\n     * Implements RFC 821: SAML <SP> FROM:<reverse-path> <CRLF>.\n     *\n     * @param string $from The address the message is from\n     *\n     * @return bool\n     */\n    public function sendAndMail($from)\n    {\n        return $this->sendCommand('SAML', \"SAML FROM:$from\", 250);\n    }\n\n    /**\n     * Send an SMTP VRFY command.\n     *\n     * @param string $name The name to verify\n     *\n     * @return bool\n     */\n    public function verify($name)\n    {\n        return $this->sendCommand('VRFY', \"VRFY $name\", [250, 251]);\n    }\n\n    /**\n     * Send an SMTP NOOP command.\n     * Used to keep keep-alives alive, doesn't actually do anything.\n     *\n     * @return bool\n     */\n    public function noop()\n    {\n        return $this->sendCommand('NOOP', 'NOOP', 250);\n    }\n\n    /**\n     * Send an SMTP TURN command.\n     * This is an optional command for SMTP that this class does not support.\n     * This method is here to make the RFC821 Definition complete for this class\n     * and _may_ be implemented in future.\n     * Implements from RFC 821: TURN <CRLF>.\n     *\n     * @return bool\n     */\n    public function turn()\n    {\n        $this->setError('The SMTP TURN command is not implemented');\n        $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);\n\n        return false;\n    }\n\n    /**\n     * Send raw data to the server.\n     *\n     * @param string $data    The data to send\n     * @param string $command Optionally, the command this is part of, used only for controlling debug output\n     *\n     * @return int|bool The number of bytes sent to the server or false on error\n     */\n    public function client_send($data, $command = '')\n    {\n        //If SMTP transcripts are left enabled, or debug output is posted online\n        //it can leak credentials, so hide credentials in all but lowest level\n        if (\n            self::DEBUG_LOWLEVEL > $this->do_debug &&\n            in_array($command, ['User & Password', 'Username', 'Password'], true)\n        ) {\n            $this->edebug('CLIENT -> SERVER: [credentials hidden]', self::DEBUG_CLIENT);\n        } else {\n            $this->edebug('CLIENT -> SERVER: ' . $data, self::DEBUG_CLIENT);\n        }\n        set_error_handler([$this, 'errorHandler']);\n        $result = fwrite($this->smtp_conn, $data);\n        restore_error_handler();\n\n        return $result;\n    }\n\n    /**\n     * Get the latest error.\n     *\n     * @return array\n     */\n    public function getError()\n    {\n        return $this->error;\n    }\n\n    /**\n     * Get SMTP extensions available on the server.\n     *\n     * @return array|null\n     */\n    public function getServerExtList()\n    {\n        return $this->server_caps;\n    }\n\n    /**\n     * Get metadata about the SMTP server from its HELO/EHLO response.\n     * The method works in three ways, dependent on argument value and current state:\n     *   1. HELO/EHLO has not been sent - returns null and populates $this->error.\n     *   2. HELO has been sent -\n     *     $name == 'HELO': returns server name\n     *     $name == 'EHLO': returns boolean false\n     *     $name == any other string: returns null and populates $this->error\n     *   3. EHLO has been sent -\n     *     $name == 'HELO'|'EHLO': returns the server name\n     *     $name == any other string: if extension $name exists, returns True\n     *       or its options (e.g. AUTH mechanisms supported). Otherwise returns False.\n     *\n     * @param string $name Name of SMTP extension or 'HELO'|'EHLO'\n     *\n     * @return string|bool|null\n     */\n    public function getServerExt($name)\n    {\n        if (!$this->server_caps) {\n            $this->setError('No HELO/EHLO was sent');\n\n            return null;\n        }\n\n        if (!array_key_exists($name, $this->server_caps)) {\n            if ('HELO' === $name) {\n                return $this->server_caps['EHLO'];\n            }\n            if ('EHLO' === $name || array_key_exists('EHLO', $this->server_caps)) {\n                return false;\n            }\n            $this->setError('HELO handshake was used; No information about server extensions available');\n\n            return null;\n        }\n\n        return $this->server_caps[$name];\n    }\n\n    /**\n     * Get the last reply from the server.\n     *\n     * @return string\n     */\n    public function getLastReply()\n    {\n        return $this->last_reply;\n    }\n\n    /**\n     * Read the SMTP server's response.\n     * Either before eof or socket timeout occurs on the operation.\n     * With SMTP we can tell if we have more lines to read if the\n     * 4th character is '-' symbol. If it is a space then we don't\n     * need to read anything else.\n     *\n     * @return string\n     */\n    protected function get_lines()\n    {\n        //If the connection is bad, give up straight away\n        if (!is_resource($this->smtp_conn)) {\n            return '';\n        }\n        $data = '';\n        $endtime = 0;\n        stream_set_timeout($this->smtp_conn, $this->Timeout);\n        if ($this->Timelimit > 0) {\n            $endtime = time() + $this->Timelimit;\n        }\n        $selR = [$this->smtp_conn];\n        $selW = null;\n        while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {\n            //Must pass vars in here as params are by reference\n            //solution for signals inspired by https://github.com/symfony/symfony/pull/6540\n            set_error_handler([$this, 'errorHandler']);\n            $n = stream_select($selR, $selW, $selW, $this->Timelimit);\n            restore_error_handler();\n\n            if ($n === false) {\n                $message = $this->getError()['detail'];\n\n                $this->edebug(\n                    'SMTP -> get_lines(): select failed (' . $message . ')',\n                    self::DEBUG_LOWLEVEL\n                );\n\n                //stream_select returns false when the `select` system call is interrupted\n                //by an incoming signal, try the select again\n                if (stripos($message, 'interrupted system call') !== false) {\n                    $this->edebug(\n                        'SMTP -> get_lines(): retrying stream_select',\n                        self::DEBUG_LOWLEVEL\n                    );\n                    $this->setError('');\n                    continue;\n                }\n\n                break;\n            }\n\n            if (!$n) {\n                $this->edebug(\n                    'SMTP -> get_lines(): select timed-out in (' . $this->Timelimit . ' sec)',\n                    self::DEBUG_LOWLEVEL\n                );\n                break;\n            }\n\n            //Deliberate noise suppression - errors are handled afterwards\n            $str = @fgets($this->smtp_conn, self::MAX_REPLY_LENGTH);\n            $this->edebug('SMTP INBOUND: \"' . trim($str) . '\"', self::DEBUG_LOWLEVEL);\n            $data .= $str;\n            //If response is only 3 chars (not valid, but RFC5321 S4.2 says it must be handled),\n            //or 4th character is a space or a line break char, we are done reading, break the loop.\n            //String array access is a significant micro-optimisation over strlen\n            if (!isset($str[3]) || $str[3] === ' ' || $str[3] === \"\\r\" || $str[3] === \"\\n\") {\n                break;\n            }\n            //Timed-out? Log and break\n            $info = stream_get_meta_data($this->smtp_conn);\n            if ($info['timed_out']) {\n                $this->edebug(\n                    'SMTP -> get_lines(): stream timed-out (' . $this->Timeout . ' sec)',\n                    self::DEBUG_LOWLEVEL\n                );\n                break;\n            }\n            //Now check if reads took too long\n            if ($endtime && time() > $endtime) {\n                $this->edebug(\n                    'SMTP -> get_lines(): timelimit reached (' .\n                    $this->Timelimit . ' sec)',\n                    self::DEBUG_LOWLEVEL\n                );\n                break;\n            }\n        }\n\n        return $data;\n    }\n\n    /**\n     * Enable or disable VERP address generation.\n     *\n     * @param bool $enabled\n     */\n    public function setVerp($enabled = false)\n    {\n        $this->do_verp = $enabled;\n    }\n\n    /**\n     * Get VERP address generation mode.\n     *\n     * @return bool\n     */\n    public function getVerp()\n    {\n        return $this->do_verp;\n    }\n\n    /**\n     * Set error messages and codes.\n     *\n     * @param string $message      The error message\n     * @param string $detail       Further detail on the error\n     * @param string $smtp_code    An associated SMTP error code\n     * @param string $smtp_code_ex Extended SMTP code\n     */\n    protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '')\n    {\n        $this->error = [\n            'error' => $message,\n            'detail' => $detail,\n            'smtp_code' => $smtp_code,\n            'smtp_code_ex' => $smtp_code_ex,\n        ];\n    }\n\n    /**\n     * Set debug output method.\n     *\n     * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it\n     */\n    public function setDebugOutput($method = 'echo')\n    {\n        $this->Debugoutput = $method;\n    }\n\n    /**\n     * Get debug output method.\n     *\n     * @return string\n     */\n    public function getDebugOutput()\n    {\n        return $this->Debugoutput;\n    }\n\n    /**\n     * Set debug output level.\n     *\n     * @param int $level\n     */\n    public function setDebugLevel($level = 0)\n    {\n        $this->do_debug = $level;\n    }\n\n    /**\n     * Get debug output level.\n     *\n     * @return int\n     */\n    public function getDebugLevel()\n    {\n        return $this->do_debug;\n    }\n\n    /**\n     * Set SMTP timeout.\n     *\n     * @param int $timeout The timeout duration in seconds\n     */\n    public function setTimeout($timeout = 0)\n    {\n        $this->Timeout = $timeout;\n    }\n\n    /**\n     * Get SMTP timeout.\n     *\n     * @return int\n     */\n    public function getTimeout()\n    {\n        return $this->Timeout;\n    }\n\n    /**\n     * Reports an error number and string.\n     *\n     * @param int    $errno   The error number returned by PHP\n     * @param string $errmsg  The error message returned by PHP\n     * @param string $errfile The file the error occurred in\n     * @param int    $errline The line number the error occurred on\n     */\n    protected function errorHandler($errno, $errmsg, $errfile = '', $errline = 0)\n    {\n        $notice = 'Connection failed.';\n        $this->setError(\n            $notice,\n            $errmsg,\n            (string) $errno\n        );\n        $this->edebug(\n            \"$notice Error #$errno: $errmsg [$errfile line $errline]\",\n            self::DEBUG_CONNECTION\n        );\n    }\n\n    /**\n     * Extract and return the ID of the last SMTP transaction based on\n     * a list of patterns provided in SMTP::$smtp_transaction_id_patterns.\n     * Relies on the host providing the ID in response to a DATA command.\n     * If no reply has been received yet, it will return null.\n     * If no pattern was matched, it will return false.\n     *\n     * @return bool|string|null\n     */\n    protected function recordLastTransactionID()\n    {\n        $reply = $this->getLastReply();\n\n        if (empty($reply)) {\n            $this->last_smtp_transaction_id = null;\n        } else {\n            $this->last_smtp_transaction_id = false;\n            foreach ($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) {\n                $matches = [];\n                if (preg_match($smtp_transaction_id_pattern, $reply, $matches)) {\n                    $this->last_smtp_transaction_id = trim($matches[1]);\n                    break;\n                }\n            }\n        }\n\n        return $this->last_smtp_transaction_id;\n    }\n\n    /**\n     * Get the queue/transaction ID of the last SMTP transaction\n     * If no reply has been received yet, it will return null.\n     * If no pattern was matched, it will return false.\n     *\n     * @return bool|string|null\n     *\n     * @see recordLastTransactionID()\n     */\n    public function getLastTransactionID()\n    {\n        return $this->last_smtp_transaction_id;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/CaptchaClient.php",
    "content": "<?php\r\n\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/24\r\n * Time: 21:05\r\n */\r\ninclude (\"model/CaptchaResponse.php\");\r\n\r\nclass CaptchaClient\r\n{\r\n    private $captchaUrl = \"https://cap.dingxiang-inc.com/api/tokenVerify\";     // 顶象验证码服务后台token验证URL\r\n    private $appId;\r\n    private $appSecret;\r\n    private $captchaResponse;\r\n    private $timeout = 2;\r\n\r\n    function __construct($appId, $appSecret)\r\n    {\r\n        $this->appId = $appId;\r\n        $this->appSecret = $appSecret;\r\n    }\r\n\r\n    public function setTimeOut($timeout) {\r\n        if ($timeout < 0) {\r\n            # code...\r\n            return;\r\n        }\r\n        $this->timeout = $timeout;\r\n    }\r\n    public function setCaptchaUrl($captchaUrl) {\r\n        $this->captchaUrl = $captchaUrl;\r\n    }\r\n\r\n    public function verifyToken($token)\r\n    {\r\n        $captchaResponse = new CaptchaResponse(false, \"\");\r\n\r\n        if (is_null($this->appId) || is_null($this->appSecret) || is_null($token)) {\r\n            $captchaResponse->setServerStatus(\"参数错误\");\r\n            return $captchaResponse;\r\n        }\r\n\r\n        $params = explode(\":\", $token);\r\n        $constId = null;\r\n        if (count($params) == 2) {\r\n            $constId = $params[1];\r\n        }\r\n        $sign = md5($this->appSecret.$params[0].$this->appSecret);\r\n\r\n        $requestUrl = $this->captchaUrl . \"?appKey=\" . $this->appId . \"&constId=\" . $constId . \"&token=\" . $params[0].\"&sign=\".$sign;\r\n\r\n        $httpResponse = $this->do_request($requestUrl, $this->timeout, $captchaResponse);\r\n    \r\n        return $captchaResponse;\r\n    }\r\n\r\n\r\n    private function do_request($requestUrl, $timeout, $captchaResponse)\r\n    {\r\n        $params = array('http' => array(\r\n            'method' => 'GET',\r\n            'header' => 'Content-type:text/html',\r\n            'timeout' => $timeout\r\n        ));\r\n        $ctx = stream_context_create($params);\r\n\r\n        $fp = @fopen($requestUrl, 'r', false, $ctx);\r\n\r\n        if (!$fp) {\r\n            $this->setResponse($captchaResponse, \"server connect failed!\", $fp);\r\n            return;\r\n        }\r\n  \r\n        $response = @stream_get_contents($fp);\r\n        if ($response === false) {\r\n            $this->setResponse($captchaResponse, \"get response failed!\", $fp);\r\n            $this->close($fp);\r\n            return;\r\n        }\r\n    \r\n        $obj = json_decode($response);\r\n        \r\n        if ($obj == null) {\r\n            $this->setResponse($captchaResponse, \"get response failed!\", $fp);\r\n            $this->close($fp);\r\n            return;\r\n        }\r\n        $captchaResponse->setServerStatus(\"SERVER_SUCCESS\");\r\n        $captchaResponse->setResult($obj->success);\r\n\r\n        $this->close($fp);\r\n    }\r\n\r\n    public function __set($property_name, $value)\r\n    {\r\n        $this->$property_name = $value;\r\n    }\r\n\r\n    public function setResponse($captchaResponse, $msg, $fp) {\r\n        $captchaResponse->setResult(true);\r\n        $captchaResponse->setServerStatus($msg);\r\n        $this->close($fp);\r\n    }\r\n\r\n    public function close($fp){\r\n        try {\r\n            if ($fp != null) {\r\n                fclose($fp);\r\n            }\r\n        } catch (Exception $e) {\r\n            echo \"close error:\" . $e->getMessage();\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/CaptchaDemo.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/25\r\n * Time: 9:26\r\n */\r\ninclude (\"CaptchaClient.php\");\r\n/**\r\n * 构造入参为appId和appSecret\r\n * appId和前端验证码的appId保持一致，appId可公开\r\n * appSecret为秘钥，请勿公开\r\n * token在前端完成验证后可以获取到，随业务请求发送到后台，token有效期为两分钟\r\n **/\r\n$appId = \"appId\";\r\n$appSecret = \"appSecret\";\r\n$client = new CaptchaClient($appId,$appSecret);\r\n$client->setTimeOut(2);      //设置超时时间\r\n# $client->setCaptchaUrl(\"http://cap.dingxiang-inc.com/api/tokenVerify\");   //特殊情况需要额外指定服务器,可以在这个指定，默认情况下不需要设置\r\n$response = $client->verifyToken(\"token:213123\");\r\necho $response->serverStatus;\r\n//确保验证状态是SERVER_SUCCESS，SDK中有容错机制，在网络出现异常的情况会返回通过\r\nif($response->result){\r\n    echo \"true\";\r\n    /**token验证通过，继续其他流程**/\r\n}else{\r\n    echo \"false\";\r\n    /**token验证失败**/\r\n}\r\n"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/CtuClient.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/19\r\n * Time: 下午1:29\r\n */\r\n\r\n\r\ninclude (\"./model/CtuRequest.php\");\r\ninclude (\"./model/CtuResponse.php\");\r\ninclude (\"./util/SignUtil.php\");\r\n\r\nclass CtuClient\r\n{\r\n    public $url;           // 风险防控服务URL\r\n    public $appId;         // 颁发的公钥,可公开\r\n    public $appSecret;     // 颁发的秘钥,严禁公开,请保管好,千万不要泄露!\r\n    public $connectTimeout = 3000;\r\n    public $connectionRequestTimeout = 2000;\r\n    public $socketTimeout = 5000;\r\n    const UTF8_ENCODE = \"UTF-8\";\r\n    const VERSION = 1;     //client版本号  从1开始\r\n\r\n    /**\r\n     * CtuClient constructor.\r\n     * @param $url\r\n     * @param $appId\r\n     * @param $appSecret\r\n     */\r\n    public function __construct($url, $appId, $appSecret)\r\n    {\r\n        $this->url = $url;\r\n        $this->appId = $appId;\r\n        $this->appSecret = $appSecret;\r\n    }\r\n\r\n    /**\r\n     * @param $ctuRequest\r\n     */\r\n    public function checkRisk($ctuRequest, $timeout) {\r\n        // 计算签名\r\n        $sign = SignUtil::sign($this->appSecret, $ctuRequest);\r\n        // 拼接请求URL\r\n        $requestUrl = $this->url .\"?appKey=\". $this->appId .\"&sign=\". $sign. \"&version=\". CtuClient::VERSION;\r\n        $reqJsonString = json_encode($ctuRequest, JSON_UNESCAPED_UNICODE);\r\n        $data = base64_encode($reqJsonString);\r\n\r\n        return $this -> do_post_request($requestUrl, $data, $timeout);\r\n    }\r\n\r\n    public function do_post_request($url, $data, $timeout = 2)\r\n    {\r\n        $ctuResponse = new CtuResponse(\"\");\r\n        $params = array('http' => array(\r\n            'method' => 'POST',\r\n            'content' => $data,\r\n            'header' => 'Content-type:text/html',\r\n            'timeout' => $timeout\r\n        ));\r\n\r\n        $ctx = stream_context_create($params);\r\n        $fp = @fopen($url, 'rb', false, $ctx);\r\n        if (!$fp) {\r\n            $ctuResponse->result = array('riskLevel' => 'ACCEPT', 'msg' => 'server connect failed!');\r\n            $this->close($fp);\r\n            return json_encode($ctuResponse, JSON_FORCE_OBJECT);\r\n        }\r\n        $response = @stream_get_contents($fp);\r\n        if ($response === false) {\r\n            $ctuResponse->result = array('riskLevel' => 'ACCEPT', 'msg' => 'get response failed!');\r\n            $this->close($fp);\r\n            return json_encode($ctuResponse, JSON_FORCE_OBJECT);\r\n        }\r\n        $this->close($fp);\r\n        return $response;\r\n    }\r\n\r\n    public function close($fp){\r\n        try {\r\n            if ($fp != null) {\r\n                fclose($fp);\r\n            }\r\n        } catch (Exception $e) {\r\n            echo \"close error:\" . $e->getMessage();\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"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/CtuDemo.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/21\r\n * Time: 上午10:35\r\n */\r\n\r\ninclude \"./CtuClient.php\";\r\n\r\n$url = \"http://sec.dingxiang-inc.com/ctu/event.do\";\r\n$appId = \"appId\";\r\n$appSecret = \"appSecret\";\r\n\r\n// 时区\r\nini_set('date.timezone','Asia/Shanghai');\r\n\r\n// 构造请求参数\r\n$request = new CtuClient($url, $appId, $appSecret);\r\n$reqJsonString =  json_encode($request, JSON_UNESCAPED_UNICODE);\r\n$ctuRequest = new CtuRequest();\r\n// $data 具体的业务参数,根据业务实际情况传入\r\n$data = array (\r\n    \"const_id\" => \"egUbLWXKgiPKBMmcwbZsF1PqoflWOyhKLIhAzw9X1\",\r\n    \"user_id\" => \"438699324\",\r\n    \"phone_number\" => \"15958004277\",\r\n    \"source\" => 2,\r\n    \"activity_id\" => 1,\r\n    \"ext_prov_name\" => \"北京市\",\r\n    \"register_date\" => date('Y-m-d H:i:s'),\r\n    \"ext_answer_end_date\" => date('Y-m-d H:i:s'),\r\n    \"ext_answer_start_date\" => date('Y-m-d H:i:s'),\r\n    \"ext_user_level\" => 5,\r\n    \"ext_open_id\" => \"58483ea3174dde1f\",\r\n    \"ip\" => \"127.0.0.1\");\r\n// $eventCode 事件code\r\n$ctuRequest -> eventCode = \"event_code\";\r\n$ctuRequest -> flag = \"activity_\" . time();\r\n$ctuRequest -> data = $data;\r\n\r\n// 请求超时时间,单位秒\r\n$timeout = 2;\r\n//调用风控引擎\r\n$responseData = $request -> checkRisk($ctuRequest, $timeout);\r\necho \"风险引擎返回结果:\" . $responseData. \"\\n\";\r\n$jsonResult = json_decode($responseData, true);\r\n$result = $jsonResult['result'][\"riskLevel\"];\r\n\r\n// ... 根据不同风险做出相关处理\r\nif ($result == \"ACCEPT\") {\r\n    // 无风险,建议放过\r\n    echo \"风险结果:无风险,建议放过\" . \"\\n\";\r\n} else if ($result == \"REVIEW\") {\r\n    // 不确定,需要进一步审核\r\n    echo \"风险结果:不确定,需要进一步审核\" . \"\\n\";\r\n} else if ($result == \"REJECT\") {\r\n    // 有风险,建议拒绝\r\n    echo \"风险结果:有风险,建议拒绝\" . \"\\n\";\r\n}\r\n?>\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/model/CaptchaResponse.php",
    "content": "<?php\r\nclass CaptchaResponse\r\n{\r\n    public $result;             // 调用结果\r\n    public $serverStatus;       // 标记调用服务状态 \"\" 表示调用正常 不为空，表明调用服务异常\r\n\r\n    public function __construct($result, $serverStatus){\r\n    \t$this->result = $result;\r\n    \t$this->serverStatus = $serverStatus;\r\n    }\r\n\r\n    public function setResult($result){\r\n    \t$this->result = $result;\r\n    }\r\n\r\n    public function setServerStatus($serverStatus){\r\n    \t$this->serverStatus = $serverStatus;\r\n    }\r\n}"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/model/CtuRequest.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/19\r\n * Time: 上午11:39\r\n */\r\n\r\nclass CtuRequest\r\n{\r\n    public $eventCode;             // 事件code\r\n    public $flag;                  // 客户端请求标记,用来标识该次请求\r\n    public $data;                  // 事件参数\r\n}\r\n"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/model/CtuResponse.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/19\r\n * Time: 下午12:45\r\n */\r\n\r\nclass CtuResponse\r\n{\r\n    public $uuid;              // 服务端返回的请求标识码，供服务端排查问题\r\n    public $status;            // 状态码\r\n    public $result;            // 防控结果\r\n\r\n    /**\r\n     * CtuResponse constructor.\r\n     * @param $uuid\r\n     */\r\n    public function __construct($uuid)\r\n    {\r\n        $this->uuid = $uuid;\r\n    }\r\n\r\n}"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/model/CtuResponseStatus.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/19\r\n * Time: 下午12:50\r\n */\r\n\r\nclass CtuResponseStatus\r\n{\r\n    const SUCCESS = \"成功\";\r\n    const INVALID_REQUEST_PARAMS = \"请求不合法,缺少必须参数\";\r\n    const INVALID_REQUEST_BODY = \"请求不合法,请求body为空\";\r\n    const INVALID_REQUEST_NO_EVENT_DATA = \"请求不合法,请求事件的数据为空\";\r\n    const INVALID_REQUEST_SIGN = \"请求签名错误\";\r\n    const INVALID_APP_ID = \"不合法的appId\";\r\n    const INVALID_EVENT_CODE = \"不合法的事件\";\r\n    const INVALID_APP_EVENT_RELATION = \"应用和事件的绑定关系错误\";\r\n    const EVENT_GRAY_SCALE = \"事件有灰度控制,非灰度请求\";\r\n    const NO_POLICY_FOUND = \"没有找到防控策略\";\r\n    const POLICY_HAS_ERROR = \"防控策略配置有错误\";\r\n    const NOT_SUPPORTED_POLICY_OPERATOR = \"不支持防控策略里的操作符\";\r\n    const QPS_EXCEEDING_MAXIMUM_THRESHOLD = \"QPS超过最大阀值\";\r\n    const SERVICE_INTERNAL_ERROR = \"服务器内部错误\";\r\n\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/model/CtuResult.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/19\r\n * Time: 下午1:01\r\n */\r\n\r\nclass CtuResult\r\n{\r\n    public $riskLevel;           // 请求的风险级别\r\n    public $riskType;            // 风险类型\r\n    public $hitPolicyCode;       // 命中策略code\r\n    public $hitPolicyName;       // 命中策略标题\r\n    public $hitRules;            // 命中规则\r\n    public $suggestPolicies;     // 建议防控策略\r\n    public $suggestion;          // 命中策略处置建议\r\n    public $flag;                // 客户端请求带上来的标记\r\n    public $extraInfo;           // 附加信息\r\n\r\n    /**\r\n     * CtuResult constructor.\r\n     * @param $riskLevel\r\n     */\r\n    public function __construct($riskLevel)\r\n    {\r\n        $this->riskLevel = $riskLevel;\r\n    }\r\n\r\n    public function hasRisk() {\r\n        return $this->riskLevel == RiskLevel::REJECT || $this->riskLevel == RiskLevel::REVIEW;\r\n    }\r\n\r\n}"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/model/HitRule.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/19\r\n * Time: 下午1:05\r\n */\r\n\r\nclass HitRule\r\n{\r\n    public $id;\r\n    public $leftValue;\r\n\r\n    /**\r\n     * HitRule constructor.\r\n     * @param $id\r\n     * @param $leftValue\r\n     */\r\n    public function __construct($id, $leftValue)\r\n    {\r\n        $this->id = $id;\r\n        $this->leftValue = $leftValue;\r\n    }\r\n\r\n}"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/model/RiskLevel.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/19\r\n * Time: 下午1:06\r\n */\r\n\r\nclass RiskLevel\r\n{\r\n    const ACCEPT = 'ACCEPT';\r\n    const REVIEW = 'REVIEW';\r\n    const REJECT = 'REJECT';\r\n}"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/model/RiskType.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/19\r\n * Time: 下午1:07\r\n */\r\n\r\nclass RiskType\r\n{\r\n    const RUBBISH_REGISTRATION = \"垃圾注册\";\r\n    const ACCOUNT_STOLEN = \"账号盗用\";\r\n    const MACHINE_CRAWLING = \"机器爬取\";\r\n    const BATCH_LOGON = \"批量登陆\";\r\n    const MALICIOUS_GRAB = \"黄牛抢单\";\r\n    const UNKNOWN = \"未定义\";\r\n}"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/model/SuggestPolicy.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/19\r\n * Time: 下午1:09\r\n */\r\n\r\nclass SuggestPolicy\r\n{\r\n    public $code;\r\n    public $name;\r\n\r\n    /**\r\n     * SuggestPolicy constructor.\r\n     * @param $code\r\n     * @param $name\r\n     */\r\n    public function __construct($code, $name)\r\n    {\r\n        $this->code = $code;\r\n        $this->name = $name;\r\n    }\r\n\r\n}"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/model/Suggestion.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/11/30\r\n * Time: 下午8:30\r\n */\r\n\r\nclass Suggestion\r\n{\r\n    public $code;\r\n    public $message;\r\n\r\n    /**\r\n     * Suggestion constructor.\r\n     * @param $code\r\n     * @param $message\r\n     */\r\n    public function __construct($code, $message)\r\n    {\r\n        $this->code = $code;\r\n        $this->message = $message;\r\n    }\r\n\r\n}"
  },
  {
    "path": "配套插件/BsCore/modules/DX_Captcha/util/SignUtil.php",
    "content": "<?php\r\n/**\r\n * Created by PhpStorm.\r\n * User: dingxiang-inc\r\n * Date: 2017/8/19\r\n * Time: 下午1:39\r\n */\r\n\r\nclass SignUtil\r\n{\r\n\r\n    private static $EVENT_CODE = \"eventCode\";\r\n    private static $FLAG = \"flag\";\r\n\r\n    public static function sign($appSecret, $ctuRequest)\r\n    {\r\n        $sortedParams = self::sortedParams($ctuRequest);\r\n        return md5($appSecret . $sortedParams . $appSecret);\r\n\r\n    }\r\n\r\n    private static function sortedParams($ctuRequest)\r\n    {\r\n\r\n        $eventCode = $ctuRequest->eventCode;\r\n        $flag = $ctuRequest->flag;\r\n        $data = $ctuRequest->data;\r\n\r\n        ksort($data);\r\n\r\n        $paramStr = self::$EVENT_CODE . $eventCode . self::$FLAG . $flag;\r\n        foreach ($data as $key => $value) {\r\n            if (is_null($value)) {\r\n                $paramStr .= $key . \"null\";\r\n            } else {\r\n                $paramStr .= $key . $value;\r\n            }\r\n        }\r\n        return $paramStr;\r\n    }\r\n\r\n}"
  },
  {
    "path": "配套插件/BsCore/modules/MailServices/friendlink_approved.html",
    "content": "<table style=\"width: 99.8%;height:99.8% \"><tbody><tr><td style=\"background:#fafafa\">\n    <div style=\"border-radius: 10px 10px 10px 10px;font-size:13px;    color: #555555;width: 666px;font-family:'Century Gothic','Trebuchet MS','Hiragino Sans GB',微软雅黑,'Microsoft Yahei',Tahoma,Helvetica,Arial,'SimSun',sans-serif;margin:50px auto;border:1px solid #eee;max-width:100%;background: #ffffff repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15);\">\n        <div style=\"width:100%;background:#49BDAD;color:#ffffff;border-radius: 10px 10px 0 0;background-image: -moz-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));background-image: -webkit-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));height: 66px;\">\n            <p style=\"font-size:15px;word-break:break-all;padding: 23px 32px;margin:0;background-color: hsla(0,0%,100%,.4);border-radius: 10px 10px 0 0;\">您好，[{friendname}]的站长:\n            </p>\n        </div>\n        <div style=\"margin:40px auto;width:90%\">\n            <p>您在本站(<a style=\"text-decoration:none;color:#12addb;\" href=\"{siteurl}\"> {siteTitle} </a>)所提交的友链已通过审核。</p>\n              <p>请注意：此邮件由 <a style=\"text-decoration:none; color:#12addb\" href=\"{siteurl}\"> {siteTitle} </a> 自动发送，请勿直接回复。</p>\n              <p>祝您生活愉快！</p>\n        </div>\n    </div>\n</td></tr></tbody></table>"
  },
  {
    "path": "配套插件/BsCore/modules/MailServices/friendlink_notify.html",
    "content": "<table style=\"width: 99.8%;height:99.8% \"><tbody><tr><td style=\"background:#fafafa\">\n    <div style=\"border-radius: 10px 10px 10px 10px;font-size:13px;    color: #555555;width: 666px;font-family:'Century Gothic','Trebuchet MS','Hiragino Sans GB',微软雅黑,'Microsoft Yahei',Tahoma,Helvetica,Arial,'SimSun',sans-serif;margin:50px auto;border:1px solid #eee;max-width:100%;background: #ffffff repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15);\">\n        <div style=\"width:100%;background:#49BDAD;color:#ffffff;border-radius: 10px 10px 0 0;background-image: -moz-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));background-image: -webkit-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));height: 66px;\">\n            <p style=\"font-size:15px;word-break:break-all;padding: 23px 32px;margin:0;background-color: hsla(0,0%,100%,.4);border-radius: 10px 10px 0 0;\">博主~有新的友链等待您的审核！\n            </p>\n        </div>\n        <div style=\"margin:40px auto;width:90%\">\n            <p>[{friendname}]的站长已提交了友链申请，快去审核吧~</p>\n              <p>请注意：此邮件由 <a style=\"text-decoration:none; color:#12addb\" href=\"{siteurl}\"> {siteTitle} </a> 自动发送，请勿直接回复。</p>\n              <p>祝您生活愉快！</p>\n        </div>\n    </div>\n</td></tr></tbody></table>"
  },
  {
    "path": "配套插件/BsCore/modules/MailServices/friendlink_reject.html",
    "content": "<table style=\"width: 99.8%;height:99.8% \"><tbody><tr><td style=\"background:#fafafa\">\n    <div style=\"border-radius: 10px 10px 10px 10px;font-size:13px;    color: #555555;width: 666px;font-family:'Century Gothic','Trebuchet MS','Hiragino Sans GB',微软雅黑,'Microsoft Yahei',Tahoma,Helvetica,Arial,'SimSun',sans-serif;margin:50px auto;border:1px solid #eee;max-width:100%;background: #ffffff repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15);\">\n        <div style=\"width:100%;background:#49BDAD;color:#ffffff;border-radius: 10px 10px 0 0;background-image: -moz-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));background-image: -webkit-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));height: 66px;\">\n            <p style=\"font-size:15px;word-break:break-all;padding: 23px 32px;margin:0;background-color: hsla(0,0%,100%,.4);border-radius: 10px 10px 0 0;\">您好，[{friendname}]的站长:\n            </p>\n        </div>\n        <div style=\"margin:40px auto;width:90%\">\n            <p>您在本站(<a style=\"text-decoration:none;color:#12addb;\" href=\"{siteurl}\"> {siteTitle} </a>)所提交的友链审核不通过。</p>\n              <p>请注意：此邮件由 <a style=\"text-decoration:none; color:#12addb\" href=\"{siteurl}\"> {siteTitle} </a> 自动发送，请勿直接回复。</p>\n              <p>祝您生活愉快！</p>\n        </div>\n    </div>\n</td></tr></tbody></table>"
  },
  {
    "path": "配套插件/BsCore/modules/MailServices/guest.html",
    "content": "<table style=\"width: 99.8%;height:99.8% \"><tbody><tr><td style=\"background:#fafafa\">\n    <div style=\"border-radius: 10px 10px 10px 10px;font-size:13px;    color: #555555;width: 666px;font-family:'Century Gothic','Trebuchet MS','Hiragino Sans GB',微软雅黑,'Microsoft Yahei',Tahoma,Helvetica,Arial,'SimSun',sans-serif;margin:50px auto;border:1px solid #eee;max-width:100%;background: #ffffff repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15);\">\n        <div style=\"width:100%;background:#49BDAD;color:#ffffff;border-radius: 10px 10px 0 0;background-image: -moz-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));background-image: -webkit-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));height: 66px;\">\n            <p style=\"font-size:15px;word-break:break-all;padding: 23px 32px;margin:0;background-color: hsla(0,0%,100%,.4);border-radius: 10px 10px 0 0;\">您在<a style=\"text-decoration:none;color: #ffffff;\" href=\"{siteurl}\"> {siteTitle} </a>上的评论有了新的回复！\n            </p>\n        </div>\n        <div style=\"margin:40px auto;width:90%\">\n            <p>{author_p} 童鞋，您曾在 [{title}] 上发表评论:</p>\n            <p style=\"background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:14px;color:#555555;\">{text_p}</p>\n            <p>{author} 给您的回复如下：</p>\n            <p style=\"background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:14px;color:#555555;\">{text}</p>\n              <p>您可以点击 <a style=\"text-decoration:none; color:#12addb\" href=\"{permalink}\">查看回复的完整內容 </a>，欢迎再次光临 <a style=\"text-decoration:none; color:#12addb\" href=\"{siteurl}\"> {siteTitle} </a>。</p>\n              <p>请注意：此邮件由 <a style=\"text-decoration:none; color:#12addb\" href=\"{siteurl}\"> {siteTitle} </a> 自动发送，请勿直接回复。</p>\n              <p>祝您生活愉快！</p>\n        </div>\n    </div>\n</td></tr></tbody></table>"
  },
  {
    "path": "配套插件/BsCore/modules/MailServices/owner.html",
    "content": "<style>\r\n    .wrap span {\r\n        display: inline-block;\r\n    }\r\n    .w260{ width: 260px;}\r\n    .w20{ width: 20px;}\r\n    .wauto{ width: auto;}\r\n</style>\r\n<table style=\"width: 99.8%;height:99.8% \"><tbody><tr><td style=\"background:#fafafa\">\r\n    <div style=\"border-radius: 10px 10px 10px 10px;font-size:13px;    color: #555555;width: 666px;font-family:'Century Gothic','Trebuchet MS','Hiragino Sans GB',微软雅黑,'Microsoft Yahei',Tahoma,Helvetica,Arial,'SimSun',sans-serif;margin:50px auto;border:1px solid #eee;max-width:100%;background: #ffffff repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15);\">\r\n        <div style=\"width:100%;background:#49BDAD;color:#ffffff;border-radius: 10px 10px 0 0;background-image: -moz-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));background-image: -webkit-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));height: 66px;\">\r\n            <p style=\"font-size:15px;word-break:break-all;padding: 23px 32px;margin:0;background-color: hsla(0,0%,100%,.4);border-radius: 10px 10px 0 0;\">主人您的<a style=\"text-decoration:none;color: #ffffff;\"> {siteTitle} </a>上有新的评论啦！\r\n            </p>\r\n        </div>\r\n        <div style=\"margin:40px auto;width:90%\">\r\n            <p>{author} 在您文章《{title}》上发表了评论:</p>\r\n            <p style=\"background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:14px;color:#555555;\">{text}</p>\r\n        \r\n            <p class=\"wrap\" style=\"text-decoration:none\"><span class=\"w260\">时间：{time}</span><span class=\"w20\"> </span><span class=\"wauto\">IP：{ip}</span></p>\r\n            <p class=\"wrap\" style=\"text-decoration:none\"><span class=\"w260\">邮箱：{mail}</span><span class=\"w20\"> </span><span class=\"wauto\">状态：{status}</span></p>\r\n            <p><a style=\"text-decoration:none; color:#12addb\" href=\"{permalink}\" target='_blank'>[查看评论]</a>&nbsp;|&nbsp;<a style=\"text-decoration:none; color:#12addb\" href=\"{manage}\" target='_blank'>[管理评论] </a></p>\r\n        </div>\r\n    </div>\r\n</td></tr></tbody></table>"
  },
  {
    "path": "配套插件/BsCore/modules/Markdown/Parsedown.php",
    "content": "<?php\n\n#\n#\n# Parsedown\n# http://parsedown.org\n#\n# (c) Emanuil Rusev\n# http://erusev.com\n#\n# For the full license information, view the LICENSE file that was distributed\n# with this source code.\n#\n#\n\nclass Parsedown\n{\n    # ~\n\n    const version = '1.8.0-beta-7';\n\n    # ~\n\n    function text($text)\n    {\n        $Elements = $this->textElements($text);\n\n        # convert to markup\n        $markup = $this->elements($Elements);\n\n        # trim line breaks\n        $markup = trim($markup, \"\\n\");\n\n        return $markup;\n    }\n\n    protected function textElements($text)\n    {\n        # make sure no definitions are set\n        $this->DefinitionData = [];\n\n        # standardize line breaks\n        $text = str_replace([\"\\r\\n\", \"\\r\"], \"\\n\", $text);\n\n        # remove surrounding line breaks\n        $text = trim($text, \"\\n\");\n\n        # split text into lines\n        $lines = explode(\"\\n\", $text);\n\n        # iterate through lines to identify blocks\n        return $this->linesElements($lines);\n    }\n\n    #\n    # Setters\n    #\n\n    function setBreaksEnabled($breaksEnabled)\n    {\n        $this->breaksEnabled = $breaksEnabled;\n\n        return $this;\n    }\n\n    protected $breaksEnabled;\n\n    function setMarkupEscaped($markupEscaped)\n    {\n        $this->markupEscaped = $markupEscaped;\n\n        return $this;\n    }\n\n    protected $markupEscaped;\n\n    function setUrlsLinked($urlsLinked)\n    {\n        $this->urlsLinked = $urlsLinked;\n\n        return $this;\n    }\n\n    protected $urlsLinked = true;\n\n    function setSafeMode($safeMode)\n    {\n        $this->safeMode = (bool)$safeMode;\n\n        return $this;\n    }\n\n    protected $safeMode;\n\n    function setStrictMode($strictMode)\n    {\n        $this->strictMode = (bool)$strictMode;\n\n        return $this;\n    }\n\n    protected $strictMode;\n\n    protected $safeLinksWhitelist = [\n        'http://',\n        'https://',\n        'ftp://',\n        'ftps://',\n        'mailto:',\n        'tel:',\n        'data:image/png;base64,',\n        'data:image/gif;base64,',\n        'data:image/jpeg;base64,',\n        'irc:',\n        'ircs:',\n        'git:',\n        'ssh:',\n        'news:',\n        'steam:',\n    ];\n\n    #\n    # Lines\n    #\n\n    protected $BlockTypes = [\n        '#' => ['Header'],\n        '*' => ['Rule', 'List'],\n        '+' => ['List'],\n        '-' => ['SetextHeader', 'Table', 'Rule', 'List'],\n        '0' => ['List'],\n        '1' => ['List'],\n        '2' => ['List'],\n        '3' => ['List'],\n        '4' => ['List'],\n        '5' => ['List'],\n        '6' => ['List'],\n        '7' => ['List'],\n        '8' => ['List'],\n        '9' => ['List'],\n        ':' => ['Table'],\n        '<' => ['Comment', 'Markup'],\n        '=' => ['SetextHeader'],\n        '>' => ['Quote'],\n        '[' => ['Reference'],\n        '_' => ['Rule'],\n        '`' => ['FencedCode'],\n        '|' => ['Table'],\n        '~' => ['FencedCode'],\n    ];\n\n    # ~\n\n    protected $unmarkedBlockTypes = [\n        'Code',\n    ];\n\n    #\n    # Blocks\n    #\n\n    protected function lines(array $lines)\n    {\n        return $this->elements($this->linesElements($lines));\n    }\n\n    protected function linesElements(array $lines)\n    {\n        $Elements     = [];\n        $CurrentBlock = null;\n\n        foreach ($lines as $line) {\n            if (chop($line) === '') {\n                if (isset($CurrentBlock)) {\n                    $CurrentBlock['interrupted'] = (isset($CurrentBlock['interrupted'])\n                        ? $CurrentBlock['interrupted'] + 1 : 1\n                    );\n                }\n\n                continue;\n            }\n\n            while (($beforeTab = strstr($line, \"\\t\", true)) !== false) {\n                $shortage = 4 - mb_strlen($beforeTab, 'utf-8') % 4;\n\n                $line = $beforeTab\n                        . str_repeat(' ', $shortage)\n                        . substr($line, strlen($beforeTab) + 1);\n            }\n\n            $indent = strspn($line, ' ');\n\n            $text = $indent > 0 ? substr($line, $indent) : $line;\n\n            # ~\n\n            $Line = ['body' => $line, 'indent' => $indent, 'text' => $text];\n\n            # ~\n\n            if (isset($CurrentBlock['continuable'])) {\n                $methodName = 'block' . $CurrentBlock['type'] . 'Continue';\n                $Block      = $this->$methodName($Line, $CurrentBlock);\n\n                if (isset($Block)) {\n                    $CurrentBlock = $Block;\n\n                    continue;\n                } else {\n                    if ($this->isBlockCompletable($CurrentBlock['type'])) {\n                        $methodName   = 'block' . $CurrentBlock['type'] . 'Complete';\n                        $CurrentBlock = $this->$methodName($CurrentBlock);\n                    }\n                }\n            }\n\n            # ~\n\n            $marker = $text[0];\n\n            # ~\n\n            $blockTypes = $this->unmarkedBlockTypes;\n\n            if (isset($this->BlockTypes[$marker])) {\n                foreach ($this->BlockTypes[$marker] as $blockType) {\n                    $blockTypes [] = $blockType;\n                }\n            }\n\n            #\n            # ~\n\n            foreach ($blockTypes as $blockType) {\n                $Block = $this->{\"block$blockType\"}($Line, $CurrentBlock);\n\n                if (isset($Block)) {\n                    $Block['type'] = $blockType;\n\n                    if (!isset($Block['identified'])) {\n                        if (isset($CurrentBlock)) {\n                            $Elements[] = $this->extractElement($CurrentBlock);\n                        }\n\n                        $Block['identified'] = true;\n                    }\n\n                    if ($this->isBlockContinuable($blockType)) {\n                        $Block['continuable'] = true;\n                    }\n\n                    $CurrentBlock = $Block;\n\n                    continue 2;\n                }\n            }\n\n            # ~\n\n            if (isset($CurrentBlock) and $CurrentBlock['type'] === 'Paragraph') {\n                $Block = $this->paragraphContinue($Line, $CurrentBlock);\n            }\n\n            if (isset($Block)) {\n                $CurrentBlock = $Block;\n            } else {\n                if (isset($CurrentBlock)) {\n                    $Elements[] = $this->extractElement($CurrentBlock);\n                }\n\n                $CurrentBlock = $this->paragraph($Line);\n\n                $CurrentBlock['identified'] = true;\n            }\n        }\n\n        # ~\n\n        if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) {\n            $methodName   = 'block' . $CurrentBlock['type'] . 'Complete';\n            $CurrentBlock = $this->$methodName($CurrentBlock);\n        }\n\n        # ~\n\n        if (isset($CurrentBlock)) {\n            $Elements[] = $this->extractElement($CurrentBlock);\n        }\n\n        # ~\n\n        return $Elements;\n    }\n\n    protected function extractElement(array $Component)\n    {\n        if (!isset($Component['element'])) {\n            if (isset($Component['markup'])) {\n                $Component['element'] = ['rawHtml' => $Component['markup']];\n            } elseif (isset($Component['hidden'])) {\n                $Component['element'] = [];\n            }\n        }\n\n        return $Component['element'];\n    }\n\n    protected function isBlockContinuable($Type)\n    {\n        return method_exists($this, 'block' . $Type . 'Continue');\n    }\n\n    protected function isBlockCompletable($Type)\n    {\n        return method_exists($this, 'block' . $Type . 'Complete');\n    }\n\n    #\n    # Code\n\n    protected function blockCode($Line, $Block = null)\n    {\n        if (isset($Block) and $Block['type'] === 'Paragraph' and !isset($Block['interrupted'])) {\n            return;\n        }\n\n        if ($Line['indent'] >= 4) {\n            $text = substr($Line['body'], 4);\n\n            $Block = [\n                'element' => [\n                    'name'    => 'pre',\n                    'element' => [\n                        'name' => 'code',\n                        'text' => $text,\n                    ],\n                ],\n            ];\n\n            return $Block;\n        }\n    }\n\n    protected function blockCodeContinue($Line, $Block)\n    {\n        if ($Line['indent'] >= 4) {\n            if (isset($Block['interrupted'])) {\n                $Block['element']['element']['text'] .= str_repeat(\"\\n\", $Block['interrupted']);\n\n                unset($Block['interrupted']);\n            }\n\n            $Block['element']['element']['text'] .= \"\\n\";\n\n            $text = substr($Line['body'], 4);\n\n            $Block['element']['element']['text'] .= $text;\n\n            return $Block;\n        }\n    }\n\n    protected function blockCodeComplete($Block)\n    {\n        return $Block;\n    }\n\n    #\n    # Comment\n\n    protected function blockComment($Line)\n    {\n        if ($this->markupEscaped or $this->safeMode) {\n            return;\n        }\n\n        if (strpos($Line['text'], '<!--') === 0) {\n            $Block = [\n                'element' => [\n                    'rawHtml'   => $Line['body'],\n                    'autobreak' => true,\n                ],\n            ];\n\n            if (strpos($Line['text'], '-->') !== false) {\n                $Block['closed'] = true;\n            }\n\n            return $Block;\n        }\n    }\n\n    protected function blockCommentContinue($Line, array $Block)\n    {\n        if (isset($Block['closed'])) {\n            return;\n        }\n\n        $Block['element']['rawHtml'] .= \"\\n\" . $Line['body'];\n\n        if (strpos($Line['text'], '-->') !== false) {\n            $Block['closed'] = true;\n        }\n\n        return $Block;\n    }\n\n    #\n    # Fenced Code\n\n    protected function blockFencedCode($Line)\n    {\n        $marker = $Line['text'][0];\n\n        $openerLength = strspn($Line['text'], $marker);\n\n        if ($openerLength < 3) {\n            return;\n        }\n\n        $infostring = trim(substr($Line['text'], $openerLength), \"\\t \");\n\n        if (strpos($infostring, '`') !== false) {\n            return;\n        }\n\n        $Element = [\n            'name' => 'code',\n            'text' => '',\n        ];\n\n        if ($infostring !== '') {\n            /**\n             * https://www.w3.org/TR/2011/WD-html5-20110525/elements.html#classes\n             * Every HTML element may have a class attribute specified.\n             * The attribute, if specified, must have a value that is a set\n             * of space-separated tokens representing the various classes\n             * that the element belongs to.\n             * [...]\n             * The space characters, for the purposes of this specification,\n             * are U+0020 SPACE, U+0009 CHARACTER TABULATION (tab),\n             * U+000A LINE FEED (LF), U+000C FORM FEED (FF), and\n             * U+000D CARRIAGE RETURN (CR).\n             */\n            $language = substr($infostring, 0, strcspn($infostring, \" \\t\\n\\f\\r\"));\n\n            $Element['attributes'] = ['class' => \"language-$language\"];\n        }\n\n        $Block = [\n            'char'         => $marker,\n            'openerLength' => $openerLength,\n            'element'      => [\n                'name'    => 'pre',\n                'element' => $Element,\n            ],\n        ];\n\n        return $Block;\n    }\n\n    protected function blockFencedCodeContinue($Line, $Block)\n    {\n        if (isset($Block['complete'])) {\n            return;\n        }\n\n        if (isset($Block['interrupted'])) {\n            $Block['element']['element']['text'] .= str_repeat(\"\\n\", $Block['interrupted']);\n\n            unset($Block['interrupted']);\n        }\n\n        if (($len = strspn($Line['text'], $Block['char'])) >= $Block['openerLength']\n            and chop(substr($Line['text'], $len), ' ') === ''\n        ) {\n            $Block['element']['element']['text'] = substr($Block['element']['element']['text'], 1);\n\n            $Block['complete'] = true;\n\n            return $Block;\n        }\n\n        $Block['element']['element']['text'] .= \"\\n\" . $Line['body'];\n\n        return $Block;\n    }\n\n    protected function blockFencedCodeComplete($Block)\n    {\n        return $Block;\n    }\n\n    #\n    # Header\n\n    protected function blockHeader($Line)\n    {\n        $level = strspn($Line['text'], '#');\n\n        if ($level > 6) {\n            return;\n        }\n\n        $text = trim($Line['text'], '#');\n\n        if ($this->strictMode and isset($text[0]) and $text[0] !== ' ') {\n            return;\n        }\n\n        $text = trim($text, ' ');\n\n        $Block = [\n            'element' => [\n                'name'    => 'h' . $level,\n                'handler' => [\n                    'function'    => 'lineElements',\n                    'argument'    => $text,\n                    'destination' => 'elements',\n                ],\n            ],\n        ];\n\n        return $Block;\n    }\n\n    #\n    # List\n\n    protected function blockList($Line, array $CurrentBlock = null)\n    {\n        list($name, $pattern) = $Line['text'][0] <= '-' ? ['ul', '[*+-]'] : ['ol', '[0-9]{1,9}+[.\\)]'];\n\n        if (preg_match('/^(' . $pattern . '([ ]++|$))(.*+)/', $Line['text'], $matches)) {\n            $contentIndent = strlen($matches[2]);\n\n            if ($contentIndent >= 5) {\n                $contentIndent -= 1;\n                $matches[1]    = substr($matches[1], 0, -$contentIndent);\n                $matches[3]    = str_repeat(' ', $contentIndent) . $matches[3];\n            } elseif ($contentIndent === 0) {\n                $matches[1] .= ' ';\n            }\n\n            $markerWithoutWhitespace = strstr($matches[1], ' ', true);\n\n            $Block                            = [\n                'indent'  => $Line['indent'],\n                'pattern' => $pattern,\n                'data'    => [\n                    'type'       => $name,\n                    'marker'     => $matches[1],\n                    'markerType' => ($name === 'ul' ? $markerWithoutWhitespace : substr($markerWithoutWhitespace, -1)),\n                ],\n                'element' => [\n                    'name'     => $name,\n                    'elements' => [],\n                ],\n            ];\n            $Block['data']['markerTypeRegex'] = preg_quote($Block['data']['markerType'], '/');\n\n            if ($name === 'ol') {\n                $listStart = ltrim(strstr($matches[1], $Block['data']['markerType'], true), '0') ?: '0';\n\n                if ($listStart !== '1') {\n                    if (\n                        isset($CurrentBlock)\n                        and $CurrentBlock['type'] === 'Paragraph'\n                            and !isset($CurrentBlock['interrupted'])\n                    ) {\n                        return;\n                    }\n\n                    $Block['element']['attributes'] = ['start' => $listStart];\n                }\n            }\n\n            $Block['li'] = [\n                'name'    => 'li',\n                'handler' => [\n                    'function'    => 'li',\n                    'argument'    => !empty($matches[3]) ? [$matches[3]] : [],\n                    'destination' => 'elements',\n                ],\n            ];\n\n            $Block['element']['elements'] [] = &$Block['li'];\n\n            return $Block;\n        }\n    }\n\n    protected function blockListContinue($Line, array $Block)\n    {\n        if (isset($Block['interrupted']) and empty($Block['li']['handler']['argument'])) {\n            return null;\n        }\n\n        $requiredIndent = ($Block['indent'] + strlen($Block['data']['marker']));\n\n        if ($Line['indent'] < $requiredIndent\n            and (\n                (\n                    $Block['data']['type'] === 'ol'\n                    and preg_match('/^[0-9]++' . $Block['data']['markerTypeRegex'] . '(?:[ ]++(.*)|$)/', $Line['text'], $matches)\n                ) or (\n                    $Block['data']['type'] === 'ul'\n                    and preg_match('/^' . $Block['data']['markerTypeRegex'] . '(?:[ ]++(.*)|$)/', $Line['text'], $matches)\n                )\n            )\n        ) {\n            if (isset($Block['interrupted'])) {\n                $Block['li']['handler']['argument'] [] = '';\n\n                $Block['loose'] = true;\n\n                unset($Block['interrupted']);\n            }\n\n            unset($Block['li']);\n\n            $text = isset($matches[1]) ? $matches[1] : '';\n\n            $Block['indent'] = $Line['indent'];\n\n            $Block['li'] = [\n                'name'    => 'li',\n                'handler' => [\n                    'function'    => 'li',\n                    'argument'    => [$text],\n                    'destination' => 'elements',\n                ],\n            ];\n\n            $Block['element']['elements'] [] = &$Block['li'];\n\n            return $Block;\n        } elseif ($Line['indent'] < $requiredIndent and $this->blockList($Line)) {\n            return null;\n        }\n\n        if ($Line['text'][0] === '[' and $this->blockReference($Line)) {\n            return $Block;\n        }\n\n        if ($Line['indent'] >= $requiredIndent) {\n            if (isset($Block['interrupted'])) {\n                $Block['li']['handler']['argument'] [] = '';\n\n                $Block['loose'] = true;\n\n                unset($Block['interrupted']);\n            }\n\n            $text = substr($Line['body'], $requiredIndent);\n\n            $Block['li']['handler']['argument'] [] = $text;\n\n            return $Block;\n        }\n\n        if (!isset($Block['interrupted'])) {\n            $text = preg_replace('/^[ ]{0,' . $requiredIndent . '}+/', '', $Line['body']);\n\n            $Block['li']['handler']['argument'] [] = $text;\n\n            return $Block;\n        }\n    }\n\n    protected function blockListComplete(array $Block)\n    {\n        if (isset($Block['loose'])) {\n            foreach ($Block['element']['elements'] as &$li) {\n                if (end($li['handler']['argument']) !== '') {\n                    $li['handler']['argument'] [] = '';\n                }\n            }\n        }\n\n        return $Block;\n    }\n\n    #\n    # Quote\n\n    protected function blockQuote($Line)\n    {\n        if (preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) {\n            $Block = [\n                'element' => [\n                    'name'    => 'blockquote',\n                    'handler' => [\n                        'function'    => 'linesElements',\n                        'argument'    => (array)$matches[1],\n                        'destination' => 'elements',\n                    ],\n                ],\n            ];\n\n            return $Block;\n        }\n    }\n\n    protected function blockQuoteContinue($Line, array $Block)\n    {\n        if (isset($Block['interrupted'])) {\n            return;\n        }\n\n        if ($Line['text'][0] === '>' and preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) {\n            $Block['element']['handler']['argument'] [] = $matches[1];\n\n            return $Block;\n        }\n\n        if (!isset($Block['interrupted'])) {\n            $Block['element']['handler']['argument'] [] = $Line['text'];\n\n            return $Block;\n        }\n    }\n\n    #\n    # Rule\n\n    protected function blockRule($Line)\n    {\n        $marker = $Line['text'][0];\n\n        if (substr_count($Line['text'], $marker) >= 3 and chop($Line['text'], \" $marker\") === '') {\n            $Block = [\n                'element' => [\n                    'name' => 'hr',\n                ],\n            ];\n\n            return $Block;\n        }\n    }\n\n    #\n    # Setext\n\n    protected function blockSetextHeader($Line, array $Block = null)\n    {\n        if (!isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) {\n            return;\n        }\n\n        if ($Line['indent'] < 4 and chop(chop($Line['text'], ' '), $Line['text'][0]) === '') {\n            $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2';\n\n            return $Block;\n        }\n    }\n\n    #\n    # Markup\n\n    protected function blockMarkup($Line)\n    {\n        if ($this->markupEscaped or $this->safeMode) {\n            return;\n        }\n\n        if (preg_match('/^<[\\/]?+(\\w*)(?:[ ]*+' . $this->regexHtmlAttribute . ')*+[ ]*+(\\/)?>/', $Line['text'], $matches)) {\n            $element = strtolower($matches[1]);\n\n            if (in_array($element, $this->textLevelElements)) {\n                return;\n            }\n\n            $Block = [\n                'name'    => $matches[1],\n                'element' => [\n                    'rawHtml'   => $Line['text'],\n                    'autobreak' => true,\n                ],\n            ];\n\n            return $Block;\n        }\n    }\n\n    protected function blockMarkupContinue($Line, array $Block)\n    {\n        if (isset($Block['closed']) or isset($Block['interrupted'])) {\n            return;\n        }\n\n        $Block['element']['rawHtml'] .= \"\\n\" . $Line['body'];\n\n        return $Block;\n    }\n\n    #\n    # Reference\n\n    protected function blockReference($Line)\n    {\n        if (strpos($Line['text'], ']') !== false\n            and preg_match('/^\\[(.+?)\\]:[ ]*+<?(\\S+?)>?(?:[ ]+[\"\\'(](.+)[\"\\')])?[ ]*+$/', $Line['text'], $matches)\n        ) {\n            $id = strtolower($matches[1]);\n\n            $Data = [\n                'url'   => $matches[2],\n                'title' => isset($matches[3]) ? $matches[3] : null,\n            ];\n\n            $this->DefinitionData['Reference'][$id] = $Data;\n\n            $Block = [\n                'element' => [],\n            ];\n\n            return $Block;\n        }\n    }\n\n    #\n    # Table\n\n    protected function blockTable($Line, array $Block = null)\n    {\n        if (!isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) {\n            return;\n        }\n\n        if (\n            strpos($Block['element']['handler']['argument'], '|') === false\n            and strpos($Line['text'], '|') === false\n                and strpos($Line['text'], ':') === false\n            or strpos($Block['element']['handler']['argument'], \"\\n\") !== false\n        ) {\n            return;\n        }\n\n        if (chop($Line['text'], ' -:|') !== '') {\n            return;\n        }\n\n        $alignments = [];\n\n        $divider = $Line['text'];\n\n        $divider = trim($divider);\n        $divider = trim($divider, '|');\n\n        $dividerCells = explode('|', $divider);\n\n        foreach ($dividerCells as $dividerCell) {\n            $dividerCell = trim($dividerCell);\n\n            if ($dividerCell === '') {\n                return;\n            }\n\n            $alignment = null;\n\n            if ($dividerCell[0] === ':') {\n                $alignment = 'left';\n            }\n\n            if (substr($dividerCell, -1) === ':') {\n                $alignment = $alignment === 'left' ? 'center' : 'right';\n            }\n\n            $alignments [] = $alignment;\n        }\n\n        # ~\n\n        $HeaderElements = [];\n\n        $header = $Block['element']['handler']['argument'];\n\n        $header = trim($header);\n        $header = trim($header, '|');\n\n        $headerCells = explode('|', $header);\n\n        if (count($headerCells) !== count($alignments)) {\n            return;\n        }\n\n        foreach ($headerCells as $index => $headerCell) {\n            $headerCell = trim($headerCell);\n\n            $HeaderElement = [\n                'name'    => 'th',\n                'handler' => [\n                    'function'    => 'lineElements',\n                    'argument'    => $headerCell,\n                    'destination' => 'elements',\n                ],\n            ];\n\n            if (isset($alignments[$index])) {\n                $alignment = $alignments[$index];\n\n                $HeaderElement['attributes'] = [\n                    'style' => \"text-align: $alignment;\",\n                ];\n            }\n\n            $HeaderElements [] = $HeaderElement;\n        }\n\n        # ~\n\n        $Block = [\n            'alignments' => $alignments,\n            'identified' => true,\n            'element'    => [\n                'name'     => 'table',\n                'elements' => [],\n            ],\n        ];\n\n        $Block['element']['elements'] [] = [\n            'name' => 'thead',\n        ];\n\n        $Block['element']['elements'] [] = [\n            'name'     => 'tbody',\n            'elements' => [],\n        ];\n\n        $Block['element']['elements'][0]['elements'] [] = [\n            'name'     => 'tr',\n            'elements' => $HeaderElements,\n        ];\n\n        return $Block;\n    }\n\n    protected function blockTableContinue($Line, array $Block)\n    {\n        if (isset($Block['interrupted'])) {\n            return;\n        }\n\n        if (count($Block['alignments']) === 1 or $Line['text'][0] === '|' or strpos($Line['text'], '|')) {\n            $Elements = [];\n\n            $row = $Line['text'];\n\n            $row = trim($row);\n            $row = trim($row, '|');\n\n            preg_match_all('/(?:(\\\\\\\\[|])|[^|`]|`[^`]++`|`)++/', $row, $matches);\n\n            $cells = array_slice($matches[0], 0, count($Block['alignments']));\n\n            foreach ($cells as $index => $cell) {\n                $cell = trim($cell);\n\n                $Element = [\n                    'name'    => 'td',\n                    'handler' => [\n                        'function'    => 'lineElements',\n                        'argument'    => $cell,\n                        'destination' => 'elements',\n                    ],\n                ];\n\n                if (isset($Block['alignments'][$index])) {\n                    $Element['attributes'] = [\n                        'style' => 'text-align: ' . $Block['alignments'][$index] . ';',\n                    ];\n                }\n\n                $Elements [] = $Element;\n            }\n\n            $Element = [\n                'name'     => 'tr',\n                'elements' => $Elements,\n            ];\n\n            $Block['element']['elements'][1]['elements'] [] = $Element;\n\n            return $Block;\n        }\n    }\n\n    #\n    # ~\n    #\n\n    protected function paragraph($Line)\n    {\n        return [\n            'type'    => 'Paragraph',\n            'element' => [\n                'name'    => 'p',\n                'handler' => [\n                    'function'    => 'lineElements',\n                    'argument'    => $Line['text'],\n                    'destination' => 'elements',\n                ],\n            ],\n        ];\n    }\n\n    protected function paragraphContinue($Line, array $Block)\n    {\n        if (isset($Block['interrupted'])) {\n            return;\n        }\n\n        $Block['element']['handler']['argument'] .= \"\\n\" . $Line['text'];\n\n        return $Block;\n    }\n\n    #\n    # Inline Elements\n    #\n\n    protected $InlineTypes = [\n        '!'  => ['Image'],\n        '&'  => ['SpecialCharacter'],\n        '*'  => ['Emphasis'],\n        ':'  => ['Url'],\n        '<'  => ['UrlTag', 'EmailTag', 'Markup'],\n        '['  => ['Link'],\n        '_'  => ['Emphasis'],\n        '`'  => ['Code'],\n        '~'  => ['Strikethrough'],\n        '\\\\' => ['EscapeSequence'],\n    ];\n\n    # ~\n\n    protected $inlineMarkerList = '!*_&[:<`~\\\\';\n\n    #\n    # ~\n    #\n\n    public function line($text, $nonNestables = [])\n    {\n        return $this->elements($this->lineElements($text, $nonNestables));\n    }\n\n    protected function lineElements($text, $nonNestables = [])\n    {\n        # standardize line breaks\n        $text = str_replace([\"\\r\\n\", \"\\r\"], \"\\n\", $text);\n\n        $Elements = [];\n\n        $nonNestables = (empty($nonNestables)\n            ? []\n            : array_combine($nonNestables, $nonNestables)\n        );\n\n        # $excerpt is based on the first occurrence of a marker\n\n        while ($excerpt = strpbrk($text, $this->inlineMarkerList)) {\n            $marker = $excerpt[0];\n\n            $markerPosition = strlen($text) - strlen($excerpt);\n\n            $Excerpt = ['text' => $excerpt, 'context' => $text];\n\n            foreach ($this->InlineTypes[$marker] as $inlineType) {\n                # check to see if the current inline type is nestable in the current context\n\n                if (isset($nonNestables[$inlineType])) {\n                    continue;\n                }\n\n                $Inline = $this->{\"inline$inlineType\"}($Excerpt);\n\n                if (!isset($Inline)) {\n                    continue;\n                }\n\n                # makes sure that the inline belongs to \"our\" marker\n\n                if (isset($Inline['position']) and $Inline['position'] > $markerPosition) {\n                    continue;\n                }\n\n                # sets a default inline position\n\n                if (!isset($Inline['position'])) {\n                    $Inline['position'] = $markerPosition;\n                }\n\n                # cause the new element to 'inherit' our non nestables\n\n\n                $Inline['element']['nonNestables'] = isset($Inline['element']['nonNestables'])\n                    ? array_merge($Inline['element']['nonNestables'], $nonNestables)\n                    : $nonNestables;\n\n                # the text that comes before the inline\n                $unmarkedText = substr($text, 0, $Inline['position']);\n\n                # compile the unmarked text\n                $InlineText = $this->inlineText($unmarkedText);\n                $Elements[] = $InlineText['element'];\n\n                # compile the inline\n                $Elements[] = $this->extractElement($Inline);\n\n                # remove the examined text\n                $text = substr($text, $Inline['position'] + $Inline['extent']);\n\n                continue 2;\n            }\n\n            # the marker does not belong to an inline\n\n            $unmarkedText = substr($text, 0, $markerPosition + 1);\n\n            $InlineText = $this->inlineText($unmarkedText);\n            $Elements[] = $InlineText['element'];\n\n            $text = substr($text, $markerPosition + 1);\n        }\n\n        $InlineText = $this->inlineText($text);\n        $Elements[] = $InlineText['element'];\n\n        foreach ($Elements as &$Element) {\n            if (!isset($Element['autobreak'])) {\n                $Element['autobreak'] = false;\n            }\n        }\n\n        return $Elements;\n    }\n\n    #\n    # ~\n    #\n\n    protected function inlineText($text)\n    {\n        $Inline = [\n            'extent'  => strlen($text),\n            'element' => [],\n        ];\n\n        $Inline['element']['elements'] = self::pregReplaceElements(\n            $this->breaksEnabled ? '/[ ]*+\\n/' : '/(?:[ ]*+\\\\\\\\|[ ]{2,}+)\\n/',\n            [\n                ['name' => 'br'],\n                ['text' => \"\\n\"],\n            ],\n            $text\n        );\n\n        return $Inline;\n    }\n\n    protected function inlineCode($Excerpt)\n    {\n        $marker = $Excerpt['text'][0];\n\n        if (preg_match('/^([' . $marker . ']++)[ ]*+(.+?)[ ]*+(?<![' . $marker . '])\\1(?!' . $marker . ')/s', $Excerpt['text'], $matches)) {\n            $text = $matches[2];\n            $text = preg_replace('/[ ]*+\\n/', ' ', $text);\n\n            return [\n                'extent'  => strlen($matches[0]),\n                'element' => [\n                    'name' => 'code',\n                    'text' => $text,\n                ],\n            ];\n        }\n    }\n\n    protected function inlineEmailTag($Excerpt)\n    {\n        $hostnameLabel = '[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?';\n\n        $commonMarkEmail = '[a-zA-Z0-9.!#$%&\\'*+\\/=?^_`{|}~-]++@'\n                           . $hostnameLabel . '(?:\\.' . $hostnameLabel . ')*';\n\n        if (strpos($Excerpt['text'], '>') !== false\n            and preg_match(\"/^<((mailto:)?$commonMarkEmail)>/i\", $Excerpt['text'], $matches)\n        ) {\n            $url = $matches[1];\n\n            if (!isset($matches[2])) {\n                $url = \"mailto:$url\";\n            }\n\n            return [\n                'extent'  => strlen($matches[0]),\n                'element' => [\n                    'name'       => 'a',\n                    'text'       => $matches[1],\n                    'attributes' => [\n                        'href' => $url,\n                    ],\n                ],\n            ];\n        }\n    }\n\n    protected function inlineEmphasis($Excerpt)\n    {\n        if (!isset($Excerpt['text'][1])) {\n            return;\n        }\n\n        $marker = $Excerpt['text'][0];\n\n        if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) {\n            $emphasis = 'strong';\n        } elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) {\n            $emphasis = 'em';\n        } else {\n            return;\n        }\n\n        return [\n            'extent'  => strlen($matches[0]),\n            'element' => [\n                'name'    => $emphasis,\n                'handler' => [\n                    'function'    => 'lineElements',\n                    'argument'    => $matches[1],\n                    'destination' => 'elements',\n                ],\n            ],\n        ];\n    }\n\n    protected function inlineEscapeSequence($Excerpt)\n    {\n        if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) {\n            return [\n                'element' => ['rawHtml' => $Excerpt['text'][1]],\n                'extent'  => 2,\n            ];\n        }\n    }\n\n    protected function inlineImage($Excerpt)\n    {\n        if (!isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') {\n            return;\n        }\n\n        $Excerpt['text'] = substr($Excerpt['text'], 1);\n\n        $Link = $this->inlineLink($Excerpt);\n\n        if ($Link === null) {\n            return;\n        }\n\n        $Inline = [\n            'extent'  => $Link['extent'] + 1,\n            'element' => [\n                'name'       => 'img',\n                'attributes' => [\n                    'src'     => $Link['element']['attributes']['href'],\n                    'alt'     => $Link['element']['handler']['argument'],\n                    'loading' => 'lazy',\n                ],\n                'autobreak'  => true,\n            ],\n        ];\n\n        $Inline['element']['attributes'] += $Link['element']['attributes'];\n\n        unset($Inline['element']['attributes']['href']);\n\n        return $Inline;\n    }\n\n    protected function inlineLink($Excerpt)\n    {\n        $Element = [\n            'name'         => 'a',\n            'handler'      => [\n                'function'    => 'lineElements',\n                'argument'    => null,\n                'destination' => 'elements',\n            ],\n            'nonNestables' => ['Url', 'Link'],\n            'attributes'   => [\n                'href'  => null,\n                'title' => null,\n            ],\n        ];\n\n        $extent = 0;\n\n        $remainder = $Excerpt['text'];\n\n        if (preg_match('/\\[((?:[^][]++|(?R))*+)\\]/', $remainder, $matches)) {\n            $Element['handler']['argument'] = $matches[1];\n\n            $extent += strlen($matches[0]);\n\n            $remainder = substr($remainder, $extent);\n        } else {\n            return;\n        }\n\n        if (preg_match('/^[(]\\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+(\"[^\"]*+\"|\\'[^\\']*+\\'))?\\s*+[)]/', $remainder, $matches)) {\n            $Element['attributes']['href'] = $matches[1];\n\n            if (isset($matches[2])) {\n                $Element['attributes']['title'] = substr($matches[2], 1, -1);\n            }\n\n            $extent += strlen($matches[0]);\n        } else {\n            if (preg_match('/^\\s*\\[(.*?)\\]/', $remainder, $matches)) {\n                $definition = strlen($matches[1]) ? $matches[1] : $Element['handler']['argument'];\n                $definition = strtolower($definition);\n\n                $extent += strlen($matches[0]);\n            } else {\n                $definition = strtolower($Element['handler']['argument']);\n            }\n\n            if (!isset($this->DefinitionData['Reference'][$definition])) {\n                return;\n            }\n\n            $Definition = $this->DefinitionData['Reference'][$definition];\n\n            $Element['attributes']['href']  = $Definition['url'];\n            $Element['attributes']['title'] = $Definition['title'];\n        }\n\n        return [\n            'extent'  => $extent,\n            'element' => $Element,\n        ];\n    }\n\n    protected function inlineMarkup($Excerpt)\n    {\n        if ($this->markupEscaped or $this->safeMode or strpos($Excerpt['text'], '>') === false) {\n            return;\n        }\n\n        if ($Excerpt['text'][1] === '/' and preg_match('/^<\\/\\w[\\w-]*+[ ]*+>/s', $Excerpt['text'], $matches)) {\n            return [\n                'element' => ['rawHtml' => $matches[0]],\n                'extent'  => strlen($matches[0]),\n            ];\n        }\n\n        if ($Excerpt['text'][1] === '!' and preg_match('/^<!---?[^>-](?:-?+[^-])*-->/s', $Excerpt['text'], $matches)) {\n            return [\n                'element' => ['rawHtml' => $matches[0]],\n                'extent'  => strlen($matches[0]),\n            ];\n        }\n\n        if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\\w[\\w-]*+(?:[ ]*+' . $this->regexHtmlAttribute . ')*+[ ]*+\\/?>/s', $Excerpt['text'], $matches)) {\n            return [\n                'element' => ['rawHtml' => $matches[0]],\n                'extent'  => strlen($matches[0]),\n            ];\n        }\n    }\n\n    protected function inlineSpecialCharacter($Excerpt)\n    {\n        if (substr($Excerpt['text'], 1, 1) !== ' ' and strpos($Excerpt['text'], ';') !== false\n                                                       and preg_match('/^&(#?+[0-9a-zA-Z]++);/', $Excerpt['text'], $matches)\n        ) {\n            return [\n                'element' => ['rawHtml' => '&' . $matches[1] . ';'],\n                'extent'  => strlen($matches[0]),\n            ];\n        }\n\n        return;\n    }\n\n    protected function inlineStrikethrough($Excerpt)\n    {\n        if (!isset($Excerpt['text'][1])) {\n            return;\n        }\n\n        if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\\S)(.+?)(?<=\\S)~~/', $Excerpt['text'], $matches)) {\n            return [\n                'extent'  => strlen($matches[0]),\n                'element' => [\n                    'name'    => 'del',\n                    'handler' => [\n                        'function'    => 'lineElements',\n                        'argument'    => $matches[1],\n                        'destination' => 'elements',\n                    ],\n                ],\n            ];\n        }\n    }\n\n    protected function inlineUrl($Excerpt)\n    {\n        if ($this->urlsLinked !== true or !isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') {\n            return;\n        }\n\n        if (strpos($Excerpt['context'], 'http') !== false\n            and preg_match('/\\bhttps?+:[\\/]{2}[^\\s<]+\\b\\/*+/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)\n        ) {\n            $url = $matches[0][0];\n\n\n            return $Inline;\n        }\n    }\n\n    protected function inlineUrlTag($Excerpt)\n    {\n        if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\\w++:\\/{2}[^ >]++)>/i', $Excerpt['text'], $matches)) {\n            $url = $matches[1];\n\n            return [\n                'extent'  => strlen($matches[0]),\n                'element' => [\n                    'name'       => 'a',\n                    'text'       => $url,\n                    'attributes' => [\n                        'href' => $url,\n                    ],\n                ],\n            ];\n        }\n    }\n\n    # ~\n\n    protected function unmarkedText($text)\n    {\n        $Inline = $this->inlineText($text);\n        return $this->element($Inline['element']);\n    }\n\n    #\n    # Handlers\n    #\n\n    protected function handle(array $Element)\n    {\n        if (isset($Element['handler'])) {\n            if (!isset($Element['nonNestables'])) {\n                $Element['nonNestables'] = [];\n            }\n\n            if (is_string($Element['handler'])) {\n                $function = $Element['handler'];\n                $argument = $Element['text'];\n                unset($Element['text']);\n                $destination = 'rawHtml';\n            } else {\n                $function    = $Element['handler']['function'];\n                $argument    = $Element['handler']['argument'];\n                $destination = $Element['handler']['destination'];\n            }\n\n            $Element[$destination] = $this->{$function}($argument, $Element['nonNestables']);\n\n            if ($destination === 'handler') {\n                $Element = $this->handle($Element);\n            }\n\n            unset($Element['handler']);\n        }\n\n        return $Element;\n    }\n\n    protected function handleElementRecursive(array $Element)\n    {\n        return $this->elementApplyRecursive([$this, 'handle'], $Element);\n    }\n\n    protected function handleElementsRecursive(array $Elements)\n    {\n        return $this->elementsApplyRecursive([$this, 'handle'], $Elements);\n    }\n\n    protected function elementApplyRecursive($closure, array $Element)\n    {\n        $Element = call_user_func($closure, $Element);\n\n        if (isset($Element['elements'])) {\n            $Element['elements'] = $this->elementsApplyRecursive($closure, $Element['elements']);\n        } elseif (isset($Element['element'])) {\n            $Element['element'] = $this->elementApplyRecursive($closure, $Element['element']);\n        }\n\n        return $Element;\n    }\n\n    protected function elementApplyRecursiveDepthFirst($closure, array $Element)\n    {\n        if (isset($Element['elements'])) {\n            $Element['elements'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['elements']);\n        } elseif (isset($Element['element'])) {\n            $Element['element'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['element']);\n        }\n\n        $Element = call_user_func($closure, $Element);\n\n        return $Element;\n    }\n\n    protected function elementsApplyRecursive($closure, array $Elements)\n    {\n        foreach ($Elements as &$Element) {\n            $Element = $this->elementApplyRecursive($closure, $Element);\n        }\n\n        return $Elements;\n    }\n\n    protected function elementsApplyRecursiveDepthFirst($closure, array $Elements)\n    {\n        foreach ($Elements as &$Element) {\n            $Element = $this->elementApplyRecursiveDepthFirst($closure, $Element);\n        }\n\n        return $Elements;\n    }\n\n    protected function element(array $Element)\n    {\n        if ($this->safeMode) {\n            $Element = $this->sanitiseElement($Element);\n        }\n\n        # identity map if element has no handler\n        $Element = $this->handle($Element);\n\n        $hasName = isset($Element['name']);\n\n        $markup = '';\n\n        if ($hasName) {\n            $markup .= '<' . $Element['name'];\n\n            if (isset($Element['attributes'])) {\n                foreach ($Element['attributes'] as $name => $value) {\n                    if ($value === null) {\n                        continue;\n                    }\n\n                    $markup .= \" $name=\\\"\" . self::escape($value) . '\"';\n                }\n            }\n        }\n\n        $permitRawHtml = false;\n\n        if (isset($Element['text'])) {\n            $text = $Element['text'];\n        }\n        // very strongly consider an alternative if you're writing an\n        // extension\n        elseif (isset($Element['rawHtml'])) {\n            $text = $Element['rawHtml'];\n\n            $allowRawHtmlInSafeMode = isset($Element['allowRawHtmlInSafeMode']) && $Element['allowRawHtmlInSafeMode'];\n            $permitRawHtml          = !$this->safeMode || $allowRawHtmlInSafeMode;\n        }\n\n        $hasContent = isset($text) || isset($Element['element']) || isset($Element['elements']);\n\n        if ($hasContent) {\n            $markup .= $hasName ? '>' : '';\n\n            if (isset($Element['elements'])) {\n                $markup .= $this->elements($Element['elements']);\n            } elseif (isset($Element['element'])) {\n                $markup .= $this->element($Element['element']);\n            } else {\n                if (!$permitRawHtml) {\n                    $markup .= self::escape($text, true);\n                } else {\n                    $markup .= $text;\n                }\n            }\n\n            $markup .= $hasName ? '</' . $Element['name'] . '>' : '';\n        } elseif ($hasName) {\n            $markup .= ' />';\n        }\n\n        return $markup;\n    }\n\n    protected function elements(array $Elements)\n    {\n        $markup = '';\n\n        $autoBreak = true;\n\n        foreach ($Elements as $Element) {\n            if (empty($Element)) {\n                continue;\n            }\n\n            $autoBreakNext = (isset($Element['autobreak'])\n                ? $Element['autobreak'] : isset($Element['name'])\n            );\n            // (autobreak === false) covers both sides of an element\n            $autoBreak = !$autoBreak ? $autoBreak : $autoBreakNext;\n\n            $markup    .= ($autoBreak ? \"\\n\" : '') . $this->element($Element);\n            $autoBreak = $autoBreakNext;\n        }\n\n        $markup .= $autoBreak ? \"\\n\" : '';\n\n        return $markup;\n    }\n\n    # ~\n\n    protected function li($lines)\n    {\n        $Elements = $this->linesElements($lines);\n\n        if (!in_array('', $lines)\n            and isset($Elements[0]) and isset($Elements[0]['name'])\n                                        and $Elements[0]['name'] === 'p'\n        ) {\n            unset($Elements[0]['name']);\n        }\n\n        return $Elements;\n    }\n\n    #\n    # AST Convenience\n    #\n\n    /**\n     * Replace occurrences $regexp with $Elements in $text. Return an array of\n     * elements representing the replacement.\n     */\n    protected static function pregReplaceElements($regexp, $Elements, $text)\n    {\n        $newElements = [];\n\n        while (preg_match($regexp, $text, $matches, PREG_OFFSET_CAPTURE)) {\n            $offset = $matches[0][1];\n            $before = substr($text, 0, $offset);\n            $after  = substr($text, $offset + strlen($matches[0][0]));\n\n            $newElements[] = ['text' => $before];\n\n            foreach ($Elements as $Element) {\n                $newElements[] = $Element;\n            }\n\n            $text = $after;\n        }\n\n        $newElements[] = ['text' => $text];\n\n        return $newElements;\n    }\n\n    #\n    # Deprecated Methods\n    #\n\n    function parse($text)\n    {\n        $markup = $this->text($text);\n\n        return $markup;\n    }\n\n    protected function sanitiseElement(array $Element)\n    {\n        static $goodAttribute = '/^[a-zA-Z0-9][a-zA-Z0-9-_]*+$/';\n        static $safeUrlNameToAtt = [\n            'a'   => 'href',\n            'img' => 'src',\n        ];\n\n        if (!isset($Element['name'])) {\n            unset($Element['attributes']);\n            return $Element;\n        }\n\n        if (isset($safeUrlNameToAtt[$Element['name']])) {\n            $Element = $this->filterUnsafeUrlInAttribute($Element, $safeUrlNameToAtt[$Element['name']]);\n        }\n\n        if (!empty($Element['attributes'])) {\n            foreach ($Element['attributes'] as $att => $val) {\n                # filter out badly parsed attribute\n                if (!preg_match($goodAttribute, $att)) {\n                    unset($Element['attributes'][$att]);\n                } # dump onevent attribute\n                elseif (self::striAtStart($att, 'on')) {\n                    unset($Element['attributes'][$att]);\n                }\n            }\n        }\n\n        return $Element;\n    }\n\n    protected function filterUnsafeUrlInAttribute(array $Element, $attribute)\n    {\n        foreach ($this->safeLinksWhitelist as $scheme) {\n            if (self::striAtStart($Element['attributes'][$attribute], $scheme)) {\n                return $Element;\n            }\n        }\n\n        $Element['attributes'][$attribute] = str_replace(':', '%3A', $Element['attributes'][$attribute]);\n\n        return $Element;\n    }\n\n    #\n    # Static Methods\n    #\n\n    protected static function escape($text, $allowQuotes = false)\n    {\n        return htmlspecialchars($text, $allowQuotes ? ENT_NOQUOTES : ENT_QUOTES, 'UTF-8');\n    }\n\n    protected static function striAtStart($string, $needle)\n    {\n        $len = strlen($needle);\n\n        if ($len > strlen($string)) {\n            return false;\n        } else {\n            return strtolower(substr($string, 0, $len)) === strtolower($needle);\n        }\n    }\n\n    static function instance($name = 'default')\n    {\n        if (isset(self::$instances[$name])) {\n            return self::$instances[$name];\n        }\n\n        $instance = new static();\n\n        self::$instances[$name] = $instance;\n\n        return $instance;\n    }\n\n    private static $instances = [];\n\n    #\n    # Fields\n    #\n\n    protected $DefinitionData;\n\n    #\n    # Read-Only\n\n    protected $specialCharacters = [\n        '\\\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', '~',\n    ];\n\n    protected $StrongRegex = [\n        '*' => '/^[*]{2}((?:\\\\\\\\\\*|[^*]|[*][^*]*+[*])+?)[*]{2}(?![*])/s',\n        '_' => '/^__((?:\\\\\\\\_|[^_]|_[^_]*+_)+?)__(?!_)/us',\n    ];\n\n    protected $EmRegex = [\n        '*' => '/^[*]((?:\\\\\\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s',\n        '_' => '/^_((?:\\\\\\\\_|[^_]|__[^_]*__)+?)_(?!_)\\b/us',\n    ];\n\n    protected $regexHtmlAttribute = '[a-zA-Z_:][\\w:.-]*+(?:\\s*+=\\s*+(?:[^\"\\'=<>`\\s]+|\"[^\"]*+\"|\\'[^\\']*+\\'))?+';\n\n    protected $voidElements = [\n        'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source',\n    ];\n\n    protected $textLevelElements = [\n        'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont',\n        'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing',\n        'i', 'rp', 'del', 'code', 'strike', 'marquee',\n        'q', 'rt', 'ins', 'font', 'strong',\n        's', 'tt', 'kbd', 'mark',\n        'u', 'xm', 'sub', 'nobr',\n        'sup', 'ruby',\n        'var', 'span',\n        'wbr', 'time',\n    ];\n}"
  },
  {
    "path": "配套插件/BsCore/modules/Markdown/ParsedownExtension.php",
    "content": "<?php\n\nrequire_once 'ParsedownExtra.php';\n\nclass ParsedownExtension extends ParsedownExtra\n{\n    protected $findTocSyntaxRule     = '/^<p>\\s*\\[TOC\\]\\s*<\\/p>$/m';\n    protected $originalBlockRuleList = ['$' => '/\\${1,2}[^`]*?\\${1,2}/m'];\n    protected $absoluteUrl           = '';\n\n    private $isMatureTocEnable = false; // for performance\n    private $rawTocList        = [];    // temp store\n\n    public $isTocEnable   = false;\n    public $isNeedMermaid = false;\n    public $isNeedLaTex   = false;\n\n    /**\n     * Singleton Pattern\n     *\n     * @param  string  $name\n     *\n     * @return ParsedownExtension\n     */\n    public static function instance($name = 'default')\n    {\n        $instance = parent::instance($name);\n\n        $instance->initInstance();\n\n        return $instance;\n    }\n\n    /**\n     * Set toc parse rule\n     *\n     * @param  string  $findTocSyntaxRule\n     *\n     * @return $this\n     */\n    public function setTocSyntaxRule($findTocSyntaxRule)\n    {\n        $this->findTocSyntaxRule = $findTocSyntaxRule;\n\n        return $this;\n    }\n\n    /**\n     * Set original block parse rule\n     *\n     * @param  array  $originalBlockRule\n     *\n     * @return $this\n     */\n    public function addOriginalBlockRule($originalBlockRule)\n    {\n        $this->originalBlockRuleList = array_merge($this->originalBlockRuleList, $originalBlockRule);\n\n        return $this;\n    }\n\n    /**\n     * Set absolute url for toc\n     *\n     * @param  string  $absoluteUrl\n     *\n     * @return $this\n     */\n    public function setAbsoluteUrl($absoluteUrl)\n    {\n        $this->absoluteUrl = $absoluteUrl;\n\n        return $this;\n    }\n\n    /**\n     * Parse text\n     *\n     * @param  string  $text\n     *\n     * @return string\n     */\n    public function text($text)\n    {\n        return $this->handleAfter(parent::text($this->handleBefore($text)));\n    }\n\n    /**\n     * Hook before parse\n     *\n     * @param  string  $text\n     *\n     * @return string\n     */\n    protected function handleBefore($text)\n    {\n        // register elements handles\n        array_map(function ($originalBlockMark) {\n            $this->addInlineElements($originalBlockMark, ['Original']);\n        }, array_keys($this->originalBlockRuleList));\n\n        // init toc switch\n        $this->isMatureTocEnable = $this->isTocEnable && preg_match('/\\s*\\[TOC\\]\\s*/m', $text);\n\n        return $text;\n    }\n\n    /**\n     * Hook after parse\n     *\n     * @param  string  $text\n     *\n     * @return string\n     */\n    protected function handleAfter($text)\n    {\n        if ($this->isMatureTocEnable) {\n            $text = preg_replace($this->findTocSyntaxRule, $this->buildToc(), $text);\n            // cleanup\n            $this->rawTocList = [];\n        }\n\n        return $text;\n    }\n\n    /**\n     * Build toc\n     *\n     * @return string\n     */\n    protected function buildToc()\n    {\n        if (empty($this->rawTocList)) {\n            return '';\n        }\n\n        $tocMarkdownContent = '';\n        $topHeadLevel       = min(array_column($this->rawTocList, 'level'));\n\n        foreach ($this->rawTocList as $tocItem) {\n            $tocMarkdownContent .= sprintf('%s- [%s](%s#%s)' . PHP_EOL, str_repeat('  ', $tocItem['level'] - $topHeadLevel), $this->line($tocItem['text']), $this->absoluteUrl, $tocItem['id']);\n        }\n\n        return parent::text($tocMarkdownContent);\n    }\n\n    /**\n     * Add inline elements,applies the given handle list to the marker, handle function name like \"inline{$handle}\"\n     *\n     * @param  string  $inlineMarker\n     * @param  array  $inlineHandleList\n     *\n     * @return $this\n     */\n    public function addInlineElements($inlineMarker, $inlineHandleList)\n    {\n        if (strpos($this->inlineMarkerList, $inlineMarker) === false) {\n            $this->inlineMarkerList .= $inlineMarker;\n        }\n\n        $this->InlineTypes[$inlineMarker] = array_merge(isset($this->InlineTypes[$inlineMarker]) ? $this->InlineTypes[$inlineMarker] : [], is_array($inlineHandleList) ? $inlineHandleList : (array)$inlineHandleList);\n\n        return $this;\n    }\n\n    /**\n     * Add block elements, applies the given handle list to the marker, handle function name like \"block{$handle}\"\n     *\n     * @param  string  $blockMarker\n     * @param  array  $blockHandleList\n     *\n     * @return $this\n     */\n    public function addBlockElements($blockMarker, $blockHandleList)\n    {\n        $this->BlockTypes[$blockMarker] = array_merge(isset($this->BlockTypes[$blockMarker]) ? $this->BlockTypes[$blockMarker] : [], is_array($blockHandleList) ? $blockHandleList : (array)$blockHandleList);\n\n        return $this;\n    }\n\n    /**\n     * Parse header\n     *\n     * @param $line\n     *\n     * @return array\n     */\n    protected function blockHeader($line)\n    {\n        $block = parent::blockHeader($line);\n\n        if (!$this->isMatureTocEnable) {\n            return $block;\n        }\n\n        $text = $block['element']['handler']['argument'];\n        $id   = urlencode($this->line($text));\n\n        $block['element']['attributes'] = [\n            'id' => $id,\n        ];\n\n        $this->rawTocList[] = [\n            'id'    => $id,\n            'text'  => $text,\n            'level' => str_replace('h', '', $block['element']['name']),\n        ];\n\n        return $block;\n    }\n\n    /**\n     * Hook for mermaid\n     *\n     * @param $Line\n     *\n     * @return array\n     */\n    protected function blockFencedCode($Line)\n    {\n        $block = parent::blockFencedCode($Line);\n\n        if ('language-mermaid' === (isset($block['element']['element']['attributes']['class']) ? $block['element']['element']['attributes']['class'] : '')) {\n            $this->isNeedMermaid = true;\n            $block['element']    = [\n                'name'       => 'pre',\n                'attributes' => [\n                    'class' => 'mermaid',\n                ],\n                'element'    => [\n                    'text' => '',\n                ],\n            ];\n        }\n\n        return $block;\n    }\n\n    /**\n     * Parse original\n     *\n     * @see https://github.com/mrgeneralgoo/typecho-markdown/pull/7\n     *\n     * @param  array  $excerpt\n     *\n     * @return array|null\n     */\n    protected function inlineOriginal($excerpt)\n    {\n        $originalBlockMark = substr($excerpt['text'], 0, 1);\n\n        if (!isset($this->originalBlockRuleList[$originalBlockMark]) || !preg_match($this->originalBlockRuleList[$originalBlockMark], $excerpt['text'], $originalBlock) || empty($originalBlock[0])) {\n            return null;\n        }\n\n        if ($originalBlockMark === '$') {\n            $this->isNeedLaTex = true;\n        }\n\n        return $this->inlineText($originalBlock[0]);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/Markdown/ParsedownExtra.php",
    "content": "<?php\n\nrequire_once 'Parsedown.php';\n\n#\n#\n# Parsedown Extra\n# https://github.com/erusev/parsedown-extra\n#\n# (c) Emanuil Rusev\n# http://erusev.com\n#\n# For the full license information, view the LICENSE file that was distributed\n# with this source code.\n#\n#\n\nclass ParsedownExtra extends Parsedown\n{\n    # ~\n\n    const version = '0.8.0';\n\n    # ~\n\n    function __construct()\n    {\n        if (version_compare(parent::version, '1.7.1') < 0) {\n            throw new Exception('ParsedownExtra requires a later version of Parsedown');\n        }\n\n        $this->BlockTypes[':'] [] = 'DefinitionList';\n        $this->BlockTypes['*'] [] = 'Abbreviation';\n\n        # identify footnote definitions before reference definitions\n        array_unshift($this->BlockTypes['['], 'Footnote');\n\n        # identify footnote markers before before links\n        array_unshift($this->InlineTypes['['], 'FootnoteMarker');\n    }\n\n    #\n    # ~\n\n    function text($text)\n    {\n        $Elements = $this->textElements($text);\n\n        # convert to markup\n        $markup = $this->elements($Elements);\n\n        # trim line breaks\n        $markup = trim($markup, \"\\n\");\n\n        # merge consecutive dl elements\n\n        $markup = preg_replace('/<\\/dl>\\s+<dl>\\s+/', '', $markup);\n\n        # add footnotes\n\n        if (isset($this->DefinitionData['Footnote'])) {\n            $Element = $this->buildFootnoteElement();\n\n            $markup .= \"\\n\" . $this->element($Element);\n        }\n\n        return $markup;\n    }\n\n    #\n    # Blocks\n    #\n\n    #\n    # Abbreviation\n\n    protected function blockAbbreviation($Line)\n    {\n        if (preg_match('/^\\*\\[(.+?)\\]:[ ]*(.+?)[ ]*$/', $Line['text'], $matches)) {\n            $this->DefinitionData['Abbreviation'][$matches[1]] = $matches[2];\n\n            $Block = [\n                'hidden' => true,\n            ];\n\n            return $Block;\n        }\n    }\n\n    #\n    # Footnote\n\n    protected function blockFootnote($Line)\n    {\n        if (preg_match('/^\\[\\^(.+?)\\]:[ ]?(.*)$/', $Line['text'], $matches)) {\n            $Block = [\n                'label'  => $matches[1],\n                'text'   => $matches[2],\n                'hidden' => true,\n            ];\n\n            return $Block;\n        }\n    }\n\n    protected function blockFootnoteContinue($Line, $Block)\n    {\n        if ($Line['text'][0] === '[' and preg_match('/^\\[\\^(.+?)\\]:/', $Line['text'])) {\n            return;\n        }\n\n        if (isset($Block['interrupted'])) {\n            if ($Line['indent'] >= 4) {\n                $Block['text'] .= \"\\n\\n\" . $Line['text'];\n\n                return $Block;\n            }\n        } else {\n            $Block['text'] .= \"\\n\" . $Line['text'];\n\n            return $Block;\n        }\n    }\n\n    protected function blockFootnoteComplete($Block)\n    {\n        $this->DefinitionData['Footnote'][$Block['label']] = [\n            'text'   => $Block['text'],\n            'count'  => null,\n            'number' => null,\n        ];\n\n        return $Block;\n    }\n\n    #\n    # Definition List\n\n    protected function blockDefinitionList($Line, $Block)\n    {\n        if (!isset($Block) or $Block['type'] !== 'Paragraph') {\n            return;\n        }\n\n        $Element = [\n            'name'     => 'dl',\n            'elements' => [],\n        ];\n\n        $terms = explode(\"\\n\", $Block['element']['handler']['argument']);\n\n        foreach ($terms as $term) {\n            $Element['elements'] [] = [\n                'name'    => 'dt',\n                'handler' => [\n                    'function'    => 'lineElements',\n                    'argument'    => $term,\n                    'destination' => 'elements',\n                ],\n            ];\n        }\n\n        $Block['element'] = $Element;\n\n        $Block = $this->addDdElement($Line, $Block);\n\n        return $Block;\n    }\n\n    protected function blockDefinitionListContinue($Line, array $Block)\n    {\n        if ($Line['text'][0] === ':') {\n            $Block = $this->addDdElement($Line, $Block);\n\n            return $Block;\n        } else {\n            if (isset($Block['interrupted']) and $Line['indent'] === 0) {\n                return;\n            }\n\n            if (isset($Block['interrupted'])) {\n                $Block['dd']['handler']['function'] = 'textElements';\n                $Block['dd']['handler']['argument'] .= \"\\n\\n\";\n\n                $Block['dd']['handler']['destination'] = 'elements';\n\n                unset($Block['interrupted']);\n            }\n\n            $text = substr($Line['body'], min($Line['indent'], 4));\n\n            $Block['dd']['handler']['argument'] .= \"\\n\" . $text;\n\n            return $Block;\n        }\n    }\n\n    #\n    # Header\n\n    protected function blockHeader($Line)\n    {\n        $Block = parent::blockHeader($Line);\n\n        if ($Block !== null && preg_match('/[ #]*{(' . $this->regexAttribute . '+)}[ ]*$/', $Block['element']['handler']['argument'], $matches, PREG_OFFSET_CAPTURE)) {\n            $attributeString = $matches[1][0];\n\n            $Block['element']['attributes'] = $this->parseAttributeData($attributeString);\n\n            $Block['element']['handler']['argument'] = substr($Block['element']['handler']['argument'], 0, $matches[0][1]);\n        }\n\n        return $Block;\n    }\n\n    #\n    # Markup\n\n    protected function blockMarkup($Line)\n    {\n        if ($this->markupEscaped or $this->safeMode) {\n            return;\n        }\n\n        if (preg_match('/^<(\\w[\\w-]*)(?:[ ]*' . $this->regexHtmlAttribute . ')*[ ]*(\\/)?>/', $Line['text'], $matches)) {\n            $element = strtolower($matches[1]);\n\n            if (in_array($element, $this->textLevelElements)) {\n                return;\n            }\n\n            $Block = [\n                'name'    => $matches[1],\n                'depth'   => 0,\n                'element' => [\n                    'rawHtml'   => $Line['text'],\n                    'autobreak' => true,\n                ],\n            ];\n\n            $length    = strlen($matches[0]);\n            $remainder = substr($Line['text'], $length);\n\n            if (trim($remainder) === '') {\n                if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) {\n                    $Block['closed'] = true;\n                    $Block['void']   = true;\n                }\n            } else {\n                if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) {\n                    return;\n                }\n                if (preg_match('/<\\/' . $matches[1] . '>[ ]*$/i', $remainder)) {\n                    $Block['closed'] = true;\n                }\n            }\n\n            return $Block;\n        }\n    }\n\n    protected function blockMarkupContinue($Line, array $Block)\n    {\n        if (isset($Block['closed'])) {\n            return;\n        }\n\n        if (preg_match('/^<' . $Block['name'] . '(?:[ ]*' . $this->regexHtmlAttribute . ')*[ ]*>/i', $Line['text'])) # open\n        {\n            $Block['depth']++;\n        }\n\n        if (preg_match('/(.*?)<\\/' . $Block['name'] . '>[ ]*$/i', $Line['text'], $matches)) # close\n        {\n            if ($Block['depth'] > 0) {\n                $Block['depth']--;\n            } else {\n                $Block['closed'] = true;\n            }\n        }\n\n        if (isset($Block['interrupted'])) {\n            $Block['element']['rawHtml'] .= \"\\n\";\n            unset($Block['interrupted']);\n        }\n\n        $Block['element']['rawHtml'] .= \"\\n\" . $Line['body'];\n\n        return $Block;\n    }\n\n    protected function blockMarkupComplete($Block)\n    {\n        if (!isset($Block['void'])) {\n            $Block['element']['rawHtml'] = $this->processTag($Block['element']['rawHtml']);\n        }\n\n        return $Block;\n    }\n\n    #\n    # Setext\n\n    protected function blockSetextHeader($Line, array $Block = null)\n    {\n        $Block = parent::blockSetextHeader($Line, $Block);\n\n        if ($Block !== null && preg_match('/[ ]*{(' . $this->regexAttribute . '+)}[ ]*$/', $Block['element']['handler']['argument'], $matches, PREG_OFFSET_CAPTURE)) {\n            $attributeString = $matches[1][0];\n\n            $Block['element']['attributes'] = $this->parseAttributeData($attributeString);\n\n            $Block['element']['handler']['argument'] = substr($Block['element']['handler']['argument'], 0, $matches[0][1]);\n        }\n\n        return $Block;\n    }\n\n    #\n    # Inline Elements\n    #\n\n    #\n    # Footnote Marker\n\n    protected function inlineFootnoteMarker($Excerpt)\n    {\n        if (preg_match('/^\\[\\^(.+?)\\]/', $Excerpt['text'], $matches)) {\n            $name = $matches[1];\n\n            if (!isset($this->DefinitionData['Footnote'][$name])) {\n                return;\n            }\n\n            $this->DefinitionData['Footnote'][$name]['count']++;\n\n            if (!isset($this->DefinitionData['Footnote'][$name]['number'])) {\n                $this->DefinitionData['Footnote'][$name]['number'] = ++$this->footnoteCount; # » &\n            }\n\n            $Element = [\n                'name'       => 'sup',\n                'attributes' => ['id' => 'fnref' . $this->DefinitionData['Footnote'][$name]['count'] . ':' . $name],\n                'element'    => [\n                    'name'       => 'a',\n                    'attributes' => ['href' => '#fn:' . $name, 'class' => 'footnote-ref'],\n                    'text'       => $this->DefinitionData['Footnote'][$name]['number'],\n                ],\n            ];\n\n            return [\n                'extent'  => strlen($matches[0]),\n                'element' => $Element,\n            ];\n        }\n    }\n\n    private $footnoteCount = 0;\n\n    public function initInstance()\n    {\n        $this->footnoteCount      = 0;\n        $this->currentAbreviation = '';\n        $this->currentMeaning     = '';\n    }\n\n    #\n    # Link\n\n    protected function inlineLink($Excerpt)\n    {\n        $Link = parent::inlineLink($Excerpt);\n\n        $remainder = $Link !== null ? substr($Excerpt['text'], $Link['extent']) : '';\n\n        if (preg_match('/^[ ]*{(' . $this->regexAttribute . '+)}/', $remainder, $matches)) {\n            $Link['element']['attributes'] += $this->parseAttributeData($matches[1]);\n\n            $Link['extent'] += strlen($matches[0]);\n        }\n\n        return $Link;\n    }\n\n    #\n    # ~\n    #\n\n    private $currentAbreviation;\n    private $currentMeaning;\n\n    protected function insertAbreviation(array $Element)\n    {\n        if (isset($Element['text'])) {\n            $Element['elements'] = self::pregReplaceElements(\n                '/\\b' . preg_quote($this->currentAbreviation, '/') . '\\b/',\n                [\n                    [\n                        'name'       => 'abbr',\n                        'attributes' => [\n                            'title' => $this->currentMeaning,\n                        ],\n                        'text'       => $this->currentAbreviation,\n                    ],\n                ],\n                $Element['text']\n            );\n\n            unset($Element['text']);\n        }\n\n        return $Element;\n    }\n\n    protected function inlineText($text)\n    {\n        $Inline = parent::inlineText($text);\n\n        if (isset($this->DefinitionData['Abbreviation'])) {\n            foreach ($this->DefinitionData['Abbreviation'] as $abbreviation => $meaning) {\n                $this->currentAbreviation = $abbreviation;\n                $this->currentMeaning     = $meaning;\n\n                $Inline['element'] = $this->elementApplyRecursiveDepthFirst(\n                    [$this, 'insertAbreviation'],\n                    $Inline['element']\n                );\n            }\n        }\n\n        return $Inline;\n    }\n\n    #\n    # Util Methods\n    #\n\n    protected function addDdElement(array $Line, array $Block)\n    {\n        $text = substr($Line['text'], 1);\n        $text = trim($text);\n\n        unset($Block['dd']);\n\n        $Block['dd'] = [\n            'name'    => 'dd',\n            'handler' => [\n                'function'    => 'lineElements',\n                'argument'    => $text,\n                'destination' => 'elements',\n            ],\n        ];\n\n        if (isset($Block['interrupted'])) {\n            $Block['dd']['handler']['function'] = 'textElements';\n\n            unset($Block['interrupted']);\n        }\n\n        $Block['element']['elements'] [] = &$Block['dd'];\n\n        return $Block;\n    }\n\n    protected function buildFootnoteElement()\n    {\n        $Element = [\n            'name'       => 'div',\n            'attributes' => ['class' => 'footnotes'],\n            'elements'   => [\n                ['name' => 'hr'],\n                [\n                    'name'     => 'ol',\n                    'elements' => [],\n                ],\n            ],\n        ];\n\n        uasort($this->DefinitionData['Footnote'], 'self::sortFootnotes');\n\n        foreach ($this->DefinitionData['Footnote'] as $definitionId => $DefinitionData) {\n            if (!isset($DefinitionData['number'])) {\n                continue;\n            }\n\n            $text = $DefinitionData['text'];\n\n            $textElements = parent::textElements($text);\n\n            $numbers = range(1, $DefinitionData['count']);\n\n            $backLinkElements = [];\n\n            foreach ($numbers as $number) {\n                $backLinkElements[] = ['text' => ' '];\n                $backLinkElements[] = [\n                    'name'                   => 'a',\n                    'attributes'             => [\n                        'href'  => \"#fnref$number:$definitionId\",\n                        'rev'   => 'footnote',\n                        'class' => 'footnote-backref',\n                    ],\n                    'rawHtml'                => '&#8617;',\n                    'allowRawHtmlInSafeMode' => true,\n                    'autobreak'              => false,\n                ];\n            }\n\n            unset($backLinkElements[0]);\n\n            $n = count($textElements) - 1;\n\n            if ($textElements[$n]['name'] === 'p') {\n                $backLinkElements = array_merge(\n                    [\n                        [\n                            'rawHtml'                => '&#160;',\n                            'allowRawHtmlInSafeMode' => true,\n                        ],\n                    ],\n                    $backLinkElements\n                );\n\n                unset($textElements[$n]['name']);\n\n                $textElements[$n] = [\n                    'name'     => 'p',\n                    'elements' => array_merge(\n                        [$textElements[$n]],\n                        $backLinkElements\n                    ),\n                ];\n            } else {\n                $textElements[] = [\n                    'name'     => 'p',\n                    'elements' => $backLinkElements,\n                ];\n            }\n\n            $Element['elements'][1]['elements'] [] = [\n                'name'       => 'li',\n                'attributes' => ['id' => 'fn:' . $definitionId],\n                'elements'   => array_merge(\n                    $textElements\n                ),\n            ];\n        }\n\n        return $Element;\n    }\n\n    # ~\n\n    protected function parseAttributeData($attributeString)\n    {\n        $Data = [];\n\n        $attributes = preg_split('/[ ]+/', $attributeString, -1, PREG_SPLIT_NO_EMPTY);\n\n        foreach ($attributes as $attribute) {\n            if ($attribute[0] === '#') {\n                $Data['id'] = substr($attribute, 1);\n            } else # \".\"\n            {\n                $classes [] = substr($attribute, 1);\n            }\n        }\n\n        if (isset($classes)) {\n            $Data['class'] = implode(' ', $classes);\n        }\n\n        return $Data;\n    }\n\n    # ~\n\n    protected function processTag($elementMarkup) # recursive\n    {\n        # http://stackoverflow.com/q/1148928/200145\n        libxml_use_internal_errors(true);\n\n        $DOMDocument = new DOMDocument;\n\n        # http://stackoverflow.com/q/11309194/200145\n        $elementMarkup = mb_convert_encoding($elementMarkup, 'HTML-ENTITIES', 'UTF-8');\n\n        # http://stackoverflow.com/q/4879946/200145\n        $DOMDocument->loadHTML($elementMarkup);\n        $DOMDocument->removeChild($DOMDocument->doctype);\n        $DOMDocument->replaceChild($DOMDocument->firstChild->firstChild->firstChild, $DOMDocument->firstChild);\n\n        $elementText = '';\n\n        if ($DOMDocument->documentElement->getAttribute('markdown') === '1') {\n            foreach ($DOMDocument->documentElement->childNodes as $Node) {\n                $elementText .= $DOMDocument->saveHTML($Node);\n            }\n\n            $DOMDocument->documentElement->removeAttribute('markdown');\n\n            $elementText = \"\\n\" . $this->text($elementText) . \"\\n\";\n        } else {\n            foreach ($DOMDocument->documentElement->childNodes as $Node) {\n                $nodeMarkup = $DOMDocument->saveHTML($Node);\n\n                if ($Node instanceof DOMElement and !in_array($Node->nodeName, $this->textLevelElements)) {\n                    $elementText .= $this->processTag($nodeMarkup);\n                } else {\n                    $elementText .= $nodeMarkup;\n                }\n            }\n        }\n\n        # because we don't want for markup to get encoded\n        $DOMDocument->documentElement->nodeValue = 'placeholder\\x1A';\n\n        $markup = $DOMDocument->saveHTML($DOMDocument->documentElement);\n        $markup = str_replace('placeholder\\x1A', $elementText, $markup);\n\n        return $markup;\n    }\n\n    # ~\n\n    protected function sortFootnotes($A, $B) # callback\n    {\n        return $A['number'] - $B['number'];\n    }\n\n    #\n    # Fields\n    #\n\n    protected $regexAttribute = '(?:[#.][-\\w]+[ ]*)';\n}"
  },
  {
    "path": "配套插件/BsCore/modules/Markdown/Parser.php",
    "content": "<?php\n\nnamespace HyperDown;\n\n/**\n * Parser\n *\n * @copyright Copyright (c) 2012 SegmentFault Team. (http://segmentfault.com)\n * @author Joyqi <joyqi@segmentfault.com>\n * @修改: WhiteBear <whitebear@msn.com>\n * @license BSD License\n */\nclass Parser\n{\n    /**\n     * _whiteList\n     *\n     * @var string\n     */\n    private $_commonWhiteList = 'div|h1|h2|h3|h4|h5|h6|table|blockquote|pre|dl|ol|kbd|b|i|strong|em|sup|sub|br|code|del|a|hr|small|center|p|img|li|ul|iframe|svg';\n\n    /**\n     * html tags\n     *\n     * @var string\n     */\n    private $_blockHtmlTags = 'p|div|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend|article|section|nav|aside|hgroup|header|footer|figcaption|svg|script|noscript';\n\n    /**\n     * _specialWhiteList\n     *\n     * @var mixed\n     * @access private\n     */\n    private $_specialWhiteList = array(\n        'table'  =>  'table|tbody|thead|tfoot|tr|td|th'\n    );\n\n    /**\n     * _footnotes\n     *\n     * @var array\n     */\n    private $_footnotes;\n\n    /**\n     * @var bool\n     */\n    private $_html = false;\n\n    /**\n     * @var bool\n     */\n    private $_line = false;\n\n    /**\n     * @var array\n     */\n    private $blockParsers = array(\n        array('code', 10),\n        array('shtml', 20),\n        array('pre', 30),\n        array('ahtml', 40),\n        array('shr', 50),\n        array('list', 60),\n        array('math', 70),\n        array('html', 80),\n        array('footnote', 90),\n        array('definition', 100),\n        array('quote', 110),\n        array('table', 120),\n        array('sh', 130),\n        array('mh', 140),\n        array('dhr', 150),\n        array('default', 9999)\n    );\n\n    /**\n     * _blocks\n     *\n     * @var array\n     */\n    private $_blocks;\n\n    /**\n     * _current\n     *\n     * @var string\n     */\n    private $_current;\n\n    /**\n     * _pos\n     *\n     * @var int\n     */\n    private $_pos;\n\n    /**\n     * _definitions\n     *\n     * @var array\n     */\n    private $_definitions;\n\n    /**\n     * @var array\n     */\n    private $_hooks = array();\n\n    /**\n     * @var array\n     */\n    private $_holders;\n\n    /**\n     * @var string\n     */\n    private $_uniqid;\n\n    /**\n     * @var int\n     */\n    private $_id;\n\n    /**\n     * @var array\n     */\n    private $_parsers = array();\n\n    /**\n     * makeHtml\n     *\n     * @param mixed $text\n     * @return string\n     */\n    public function makeHtml($text)\n    {\n        $this->_footnotes = array();\n        $this->_definitions = array();\n        $this->_holders = array();\n        $this->_uniqid = md5(uniqid());\n        $this->_id = 0;\n\n        usort($this->blockParsers, function ($a, $b) {\n            return $a[1] < $b[1] ? -1 : 1;\n        });\n\n        foreach ($this->blockParsers as $parser) {\n            list($name) = $parser;\n\n            if (isset($parser[2])) {\n                $this->_parsers[$name] = $parser[2];\n            } else {\n                $this->_parsers[$name] = array($this, 'parseBlock' . ucfirst($name));\n            }\n        }\n\n        $text = $this->initText($text);\n        $html = $this->parse($text);\n        $html = $this->makeFootnotes($html);\n        $html = $this->optimizeLines($html);\n\n        return $this->call('makeHtml', $html);\n    }\n\n    /**\n     * @param $html\n     */\n    public function enableHtml($html = true)\n    {\n        $this->_html = $html;\n    }\n\n    /**\n     * @param bool $line\n     */\n    public function enableLine($line = true)\n    {\n        $this->_line = $line;\n    }\n\n    /**\n     * @param $type\n     * @param $callback\n     */\n    public function hook($type, $callback)\n    {\n        $this->_hooks[$type][] = $callback;\n    }\n\n    /**\n     * @param $str\n     * @return string\n     */\n    public function makeHolder($str)\n    {\n        $key = \"\\r\" . $this->_uniqid . $this->_id . \"\\r\";\n        $this->_id ++;\n        $this->_holders[$key] = $str;\n\n        return $key;\n    }\n\n    /**\n     * @param $text\n     * @return mixed\n     */\n    private function initText($text)\n    {\n        $text = str_replace(array(\"\\t\", \"\\r\"),  array('    ', ''),  $text);\n        return $text;\n    }\n\n    /**\n     * @param $html\n     * @return string\n     */\n    private function makeFootnotes($html)\n    {\n        if (count($this->_footnotes) > 0) {\n            $html .= '<div class=\"footnotes\"><hr><ol>';\n            $index = 1;\n\n            while ($val = array_shift($this->_footnotes)) {\n                if (is_string($val)) {\n                    $val .= \" <a href=\\\"#fnref-{$index}\\\" class=\\\"footnote-backref\\\">&#8617;</a>\";\n                } else {\n                    $val[count($val) - 1] .= \" <a href=\\\"#fnref-{$index}\\\" class=\\\"footnote-backref\\\">&#8617;</a>\";\n                    $val = count($val) > 1 ? $this->parse(implode(\"\\n\", $val)) : $this->parseInline($val[0]);\n                }\n\n                $html .= \"<li id=\\\"fn-{$index}\\\">{$val}</li>\";\n                $index ++;\n            }\n\n            $html .= '</ol></div>';\n        }\n\n        return $html;\n    }\n\n    /**\n     * parse\n     *\n     * @param string $text\n     * @param bool $inline\n     * @param int $offset\n     * @return string\n     */\n    private function parse($text, $inline = false, $offset = 0)\n    {\n        $blocks = $this->parseBlock($text, $lines);\n        $html = '';\n\n        // inline mode for single normal block\n        if ($inline && count($blocks) == 1 && $blocks[0][0] == 'normal') {\n            $blocks[0][3] = true;\n        }\n\n        foreach ($blocks as $block) {\n            list($type, $start, $end, $value) = $block;\n            $extract = array_slice($lines, $start, $end - $start + 1);\n            $method = 'parse' . ucfirst($type);\n\n            $extract = $this->call('before' . ucfirst($method), $extract, $value);\n            $result = $this->{$method}($extract, $value, $start + $offset, $end + $offset);\n            $result = $this->call('after' . ucfirst($method), $result, $value);\n\n            $html .= $result;\n        }\n\n        return $html;\n    }\n\n    /**\n     * @param $text\n     * @param $clearHolders\n     * @return string\n     */\n    private function releaseHolder($text, $clearHolders = true)\n    {\n        $deep = 0;\n        while (strpos($text, \"\\r\") !== false && $deep < 10) {\n            $text = str_replace(array_keys($this->_holders), array_values($this->_holders), $text);\n            $deep ++;\n        }\n\n        if ($clearHolders) {\n            $this->_holders = array();\n        }\n\n        return $text;\n    }\n\n    /**\n     * @param $start\n     * @param int $end\n     * @return string\n     */\n    private function markLine($start, $end = -1)\n    {\n        if ($this->_line) {\n            $end = $end < 0 ? $start : $end;\n            return '<span class=\"line\" data-start=\"' . $start\n                . '\" data-end=\"' . $end . '\" data-id=\"' . $this->_uniqid . '\"></span>';\n        }\n\n        return '';\n    }\n\n    /**\n     * @param array $lines\n     * @param $start\n     * @return string[]\n     */\n    private function markLines(array $lines, $start)\n    {\n        $i = -1;\n\n        return $this->_line ? array_map(function ($line) use ($start, &$i) {\n            $i ++;\n            return $this->markLine($start + $i) . $line;\n        }, $lines) : $lines;\n    }\n\n    /**\n     * @param $html\n     * @return string\n     */\n    private function optimizeLines($html)\n    {\n        $last = 0;\n\n        return $this->_line ?\n            preg_replace_callback(\"/class=\\\"line\\\" data\\-start=\\\"([0-9]+)\\\" data\\-end=\\\"([0-9]+)\\\" (data\\-id=\\\"{$this->_uniqid}\\\")/\",\n                function ($matches) use (&$last) {\n                    if ($matches[1] != $last) {\n                        $replace = 'class=\"line\" data-start=\"' . $last . '\" data-start-original=\"' . $matches[1] . '\" data-end=\"' . $matches[2] . '\" ' . $matches[3];\n                    } else {\n                        $replace = $matches[0];\n                    }\n\n                    $last = $matches[2] + 1;\n                    return $replace;\n                }, $html) : $html;\n    }\n\n    /**\n     * @param $type\n     * @param $value\n     * @return mixed\n     */\n    private function call($type, $value)\n    {\n        if (empty($this->_hooks[$type])) {\n            return $value;\n        }\n\n        $args = func_get_args();\n        $args = array_slice($args, 1);\n\n        foreach ($this->_hooks[$type] as $callback) {\n            $value = call_user_func_array($callback, $args);\n            $args[0] = $value;\n        }\n\n        return $value;\n    }\n\n    /**\n     * parseInline\n     *\n     * @param string $text\n     * @param string $whiteList\n     * @param bool $clearHolders\n     * @param bool $enableAutoLink\n     * @return string\n     */\n    private function parseInline($text, $whiteList = '', $clearHolders = true, $enableAutoLink = true)\n    {\n        $text = $this->call('beforeParseInline', $text);\n        // code\n        $text = preg_replace_callback(\n            \"/(^|[^\\\\\\])(`+)(.+?)\\\\2/\",\n            function ($matches) {\n                return  $matches[1] . $this->makeHolder(\n                    '<code>' . htmlspecialchars($matches[3]) . '</code>'\n                );\n            },\n            $text\n        );\n\n        // mathjax\n        $text = preg_replace_callback(\n            \"/(^|[^\\\\\\])(\\\\$+)(.+?)\\\\2/\",\n            function ($matches) {\n                return  $matches[1] . $this->makeHolder(\n                    $matches[2] . htmlspecialchars($matches[3]) . $matches[2]\n                );\n            },\n            $text\n        );\n\n        // escape\n        $text = preg_replace_callback(\n            \"/\\\\\\(.)/u\",\n            function ($matches) {\n                $prefix = preg_match(\"/^[-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]$/\", $matches[1]) ? '' : '\\\\';\n                $escaped = htmlspecialchars($matches[1]);\n                $escaped = str_replace('$', '&dollar;', $escaped);\n                return  $this->makeHolder($prefix . $escaped);\n            },\n            $text\n        );\n\n        // link\n        $text = preg_replace_callback(\n            \"/<(https?:\\/\\/.+|(?:mailto:)?[_a-z0-9-\\.\\+]+@[_\\w-]+(?:\\.[a-z]{2,})+)>/i\",\n            function ($matches) {\n                $url = $this->cleanUrl($matches[1]);\n                $link = $this->call('parseLink', $url);\n\n                return $this->makeHolder(\n                    \"<a href=\\\"{$url}\\\">{$link}</a>\"\n                );\n            },\n            $text\n        );\n\n        // encode unsafe tags\n        $text = preg_replace_callback(\n            \"/<(\\/?)([a-z0-9-]+)(\\s+[^>]*)?>/i\",\n            function ($matches) use ($whiteList) {\n                if ($this->_html || false !== stripos(\n                    '|' . $this->_commonWhiteList . '|' . $whiteList . '|', '|' . $matches[2] . '|'\n                )) {\n                    return $this->makeHolder($matches[0]);\n                } else {\n                    return $this->makeHolder($matches[0]);\n                }\n            },\n            $text\n        );\n\n        if ($this->_html) {\n            $text = preg_replace_callback(\"/<!\\-\\-(.*?)\\-\\->/\", function ($matches) {\n                return $this->makeHolder($matches[0]);\n            }, $text);\n        }\n\n        $text = str_replace(array('<', '>'),  array('&lt;', '&gt;'),  $text);\n\n        // footnote\n        $text = preg_replace_callback(\n            \"/\\[\\^((?:[^\\]]|\\\\\\\\\\]|\\\\\\\\\\[)+?)\\]/\",\n            function ($matches) {\n                $id = array_search($matches[1], $this->_footnotes);\n\n                if (false === $id) {\n                    $id = count($this->_footnotes) + 1;\n                    $this->_footnotes[$id] = $this->parseInline($matches[1], '', false);\n                }\n\n                return $this->makeHolder(\n                    \"<sup id=\\\"fnref-{$id}\\\"><a href=\\\"#fn-{$id}\\\" class=\\\"footnote-ref\\\">{$id}</a></sup>\"\n                );\n            },\n            $text\n        );\n\n        // image\n        $text = preg_replace_callback(\n            \"/!\\[((?:[^\\]]|\\\\\\\\\\]|\\\\\\\\\\[)*?)\\]\\(((?:[^\\)]|\\\\\\\\\\)|\\\\\\\\\\()+?)\\)/\",\n            function ($matches) {\n                $escaped = htmlspecialchars($this->escapeBracket($matches[1]));\n                $url = $this->escapeBracket($matches[2]);\n                list ($url, $title) = $this->cleanUrl($url, true);\n                $title = empty($title)? $escaped : \" title=\\\"{$title}\\\"\";\n\n                return $this->makeHolder(\n                    \"<img src=\\\"{$url}\\\" alt=\\\"{$title}\\\" title=\\\"{$title}\\\">\"\n                );\n            },\n            $text\n        );\n\n        $text = preg_replace_callback(\n            \"/!\\[((?:[^\\]]|\\\\\\\\\\]|\\\\\\\\\\[)*?)\\]\\[((?:[^\\]]|\\\\\\\\\\]|\\\\\\\\\\[)+?)\\]/\",\n            function ($matches) {\n                $escaped = htmlspecialchars($this->escapeBracket($matches[1]));\n\n                $result = isset( $this->_definitions[$matches[2]] ) ?\n                    \"<img src=\\\"{$this->_definitions[$matches[2]]}\\\" alt=\\\"{$escaped}\\\" title=\\\"{$escaped}\\\">\"\n                    : $escaped;\n\n                return $this->makeHolder($result);\n            },\n            $text\n        );\n\n        // link\n        $text = preg_replace_callback(\n            \"/\\[((?:[^\\]]|\\\\\\\\\\]|\\\\\\\\\\[)+?)\\]\\(((?:[^\\)]|\\\\\\\\\\)|\\\\\\\\\\()+?)\\)/\",\n            function ($matches) {\n                $escaped = $this->parseInline(\n                    $this->escapeBracket($matches[1]),  '',  false, false\n                );\n                $url = $this->escapeBracket($matches[2]);\n                list ($url, $title) = $this->cleanUrl($url, true);\n                $title = empty($title) ? '' : \" title=\\\"{$title}\\\"\";\n\n                return $this->makeHolder(\"<a href=\\\"{$url}\\\"{$title}>{$escaped}</a>\");\n            },\n            $text\n        );\n\n        $text = preg_replace_callback(\n            \"/\\[((?:[^\\]]|\\\\\\\\\\]|\\\\\\\\\\[)+?)\\]\\[((?:[^\\]]|\\\\\\\\\\]|\\\\\\\\\\[)+?)\\]/\",\n            function ($matches) {\n                $escaped = $this->parseInline(\n                    $this->escapeBracket($matches[1]),  '',  false\n                );\n                $result = isset( $this->_definitions[$matches[2]] ) ?\n                    \"<a href=\\\"{$this->_definitions[$matches[2]]}\\\">{$escaped}</a>\"\n                    : $escaped;\n\n                return $this->makeHolder($result);\n            },\n            $text\n        );\n\n        // strong and em and some fuck\n        $text = $this->parseInlineCallback($text);\n        $text = preg_replace(\n            \"/<([_a-z0-9-\\.\\+]+@[^@]+\\.[a-z]{2,})>/i\",\n            \"<a href=\\\"mailto:\\\\1\\\">\\\\1</a>\",\n            $text\n        );\n\n        // autolink url\n        if ($enableAutoLink) {\n            $text = preg_replace_callback(\n                \"/(^|[^\\\"])(https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\b([-a-zA-Z0-9@:%_\\+.~#?&\\/=]*)|(?:mailto:)?[_a-z0-9-\\.\\+]+@[_\\w-]+(?:\\.[a-z]{2,})+)($|[^\\\"])/\",\n                function ($matches) {\n                    $url = $this->cleanUrl($matches[2]);\n                    $link = $this->call('parseLink', $matches[2]);\n                    return \"{$matches[1]}<a href=\\\"{$url}\\\">{$link}</a>{$matches[5]}\";\n                },\n                $text\n            );\n        }\n\n        $text = $this->call('afterParseInlineBeforeRelease', $text);\n        $text = $this->releaseHolder($text, $clearHolders);\n\n        $text = $this->call('afterParseInline', $text);\n\n        return $text;\n    }\n\n    /**\n     * @param $text\n     * @return mixed\n     */\n    private function parseInlineCallback($text)\n    {\n        $text = preg_replace_callback(\n            \"/(\\*{3})(.+?)\\\\1/\",\n            function ($matches) {\n                return  '<strong><em>' .\n                    $this->parseInlineCallback($matches[2]) .\n                    '</em></strong>';\n            },\n            $text\n        );\n\n        $text = preg_replace_callback(\n            \"/(\\*{2})(.+?)\\\\1/\",\n            function ($matches) {\n                return  '<strong>' .\n                    $this->parseInlineCallback($matches[2]) .\n                    '</strong>';\n            },\n            $text\n        );\n\n        $text = preg_replace_callback(\n            \"/(\\*)(.+?)\\\\1/\",\n            function ($matches) {\n                return  '<em>' .\n                    $this->parseInlineCallback($matches[2]) .\n                    '</em>';\n            },\n            $text\n        );\n\n        $text = preg_replace_callback(\n            \"/(\\s+|^)(_{3})(.+?)\\\\2(\\s+|$)/\",\n            function ($matches) {\n                return  $matches[1] . '<strong><em>' .\n                    $this->parseInlineCallback($matches[3]) .\n                    '</em></strong>' . $matches[4];\n            },\n            $text\n        );\n\n        $text = preg_replace_callback(\n            \"/(\\s+|^)(_{2})(.+?)\\\\2(\\s+|$)/\",\n            function ($matches) {\n                return  $matches[1] . '<strong>' .\n                    $this->parseInlineCallback($matches[3]) .\n                    '</strong>' . $matches[4];\n            },\n            $text\n        );\n\n        $text = preg_replace_callback(\n            \"/(\\s+|^)(_)(.+?)\\\\2(\\s+|$)/\",\n            function ($matches) {\n                return  $matches[1] . '<em>' .\n                    $this->parseInlineCallback($matches[3]) .\n                    '</em>' . $matches[4];\n            },\n            $text\n        );\n\n        $text = preg_replace_callback(\n            \"/(~{2})(.+?)\\\\1/\",\n            function ($matches) {\n                return  '<del>' .\n                    $this->parseInlineCallback($matches[2]) .\n                    '</del>';\n            },\n            $text\n        );\n\n        return $text;\n    }\n\n    /**\n     * parseBlock\n     *\n     * @param string $text\n     * @param array $lines\n     * @return array\n     */\n    private function parseBlock($text, &$lines)\n    {\n        $lines = explode(\"\\n\", $text);\n        $this->_blocks = array();\n        $this->_current = 'normal';\n        $this->_pos = -1;\n\n        $state = array(\n            'special'   =>  implode(\"|\", array_keys($this->_specialWhiteList)),\n            'empty'     =>  0,\n            'html'      =>  false\n        );\n\n        // analyze by line\n        foreach ($lines as $key => $line) {\n            $block = $this->getBlock();\n            $args = array($block, $key, $line, &$state, $lines);\n\n            if ($this->_current != 'normal') {\n                $pass = call_user_func_array($this->_parsers[$this->_current], $args);\n\n                if (!$pass) {\n                    continue;\n                }\n            }\n\n            foreach ($this->_parsers as $name => $parser) {\n                if ($name != $this->_current) {\n                    $pass = call_user_func_array($parser, $args);\n\n                    if (!$pass) {\n                        break;\n                    }\n                }\n            }\n        }\n\n        return $this->optimizeBlocks($this->_blocks, $lines);\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @param $state\n     * @return bool\n     */\n    private function parseBlockList($block, $key, $line, &$state)\n    {\n        if ($this->isBlock('list') && !preg_match(\"/^\\s*\\[((?:[^\\]]|\\\\]|\\\\[)+?)\\]:\\s*(.+)$/\", $line)) {\n            if (preg_match(\"/^(\\s*)(~{3,}|`{3,})([^`~]*)$/i\", $line)) {\n                // ignore code\n                return true;\n            } elseif ($state['empty'] <= 1\n                && preg_match(\"/^(\\s*)\\S+/\", $line, $matches)\n                && strlen($matches[1]) >= ($block[3][0] + $state['empty'])) {\n\n                $state['empty'] = 0;\n                $this->setBlock($key);\n                return false;\n            } elseif (preg_match(\"/^(\\s*)$/\", $line) && $state['empty'] == 0) {\n                $state['empty'] ++;\n                $this->setBlock($key);\n                return false;\n            }\n        }\n\n        if (preg_match(\"/^(\\s*)((?:[0-9]+\\.)|\\-|\\+|\\*)\\s+/i\", $line, $matches)) {\n            $space = strlen($matches[1]);\n            $tab = strlen($matches[0]) - $space;\n            $state['empty'] = 0;\n            $type = false !== strpos('+-*', $matches[2]) ? 'ul' : 'ol';\n\n            // opened\n            if ($this->isBlock('list')) {\n                if ($space < $block[3][0] || ($space == $block[3][0] && $type != $block[3][1])) {\n                    $this->startBlock('list', $key, [$space, $type, $tab]);\n                } else {\n                    $this->setBlock($key);\n                }\n            } else {\n                $this->startBlock('list', $key, [$space, $type, $tab]);\n            }\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @param $state\n     * @return bool\n     */\n    private function parseBlockCode($block, $key, $line, &$state)\n    {\n        if (preg_match(\"/^(\\s*)(~{3,}|`{3,})([^`~]*)$/i\", $line, $matches)) {\n            if ($this->isBlock('code')) {\n                if ($state['code'] != $matches[2]) {\n                    $this->setBlock($key);\n                    return false;\n                }\n\n                $isAfterList = $block[3][2];\n\n                if ($isAfterList) {\n                    $state['empty'] = 0;\n                    $this->combineBlock()\n                        ->setBlock($key);\n                } else {\n                    $this->setBlock($key)\n                        ->endBlock();\n                }\n            } else {\n                $isAfterList = false;\n\n                if ($this->isBlock('list')) {\n                    $space = $block[3][0];\n\n                    $isAfterList = strlen($matches[1]) >= $space + $state['empty'];\n                }\n\n                $state['code'] = $matches[2];\n\n                $this->startBlock('code', $key, array(\n                    $matches[1],  $matches[3],  $isAfterList\n                ));\n            }\n\n            return false;\n        } elseif ($this->isBlock('code')) {\n            $this->setBlock($key);\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @param $state\n     * @return bool\n     */\n    private function parseBlockShtml($block, $key, $line, &$state)\n    {\n        if ($this->_html) {\n            if (preg_match(\"/^(\\s*)!!!(\\s*)$/\", $line, $matches)) {\n                if ($this->isBlock('shtml')) {\n                    $this->setBlock($key)->endBlock();\n                } else {\n                    $this->startBlock('shtml', $key);\n                }\n\n                return false;\n            } elseif ($this->isBlock('shtml')) {\n                $this->setBlock($key);\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @param $state\n     * @return bool\n     */\n    private function parseBlockAhtml($block, $key, $line, &$state)\n    {\n        if ($this->_html) {\n            if (preg_match(\"/^\\s*<({$this->_blockHtmlTags})(\\s+[^>]*)?>/i\", $line, $matches)) {\n                if ($this->isBlock('ahtml')) {\n                    $this->setBlock($key);\n                    return false;\n                } elseif (empty($matches[2]) || $matches[2] != '/') {\n                    $this->startBlock('ahtml', $key);\n                    preg_match_all(\"/<({$this->_blockHtmlTags})(\\s+[^>]*)?>/i\", $line, $allMatches);\n                    $lastMatch = $allMatches[1][count($allMatches[0]) - 1];\n\n                    if (strpos($line, \"</{$lastMatch}>\") !== false) {\n                        $this->endBlock();\n                    } else {\n                        $state['html'] = $lastMatch;\n                    }\n                    return false;\n                }\n            } elseif (!!$state['html'] && strpos($line, \"</{$state['html']}>\") !== false) {\n                $this->setBlock($key)->endBlock();\n                $state['html'] = false;\n                return false;\n            } elseif ($this->isBlock('ahtml')) {\n                $this->setBlock($key);\n                return false;\n            } elseif (preg_match(\"/^\\s*<!\\-\\-(.*?)\\-\\->\\s*$/\", $line, $matches)) {\n                $this->startBlock('ahtml', $key)->endBlock();\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @return bool\n     */\n    private function parseBlockMath($block, $key, $line)\n    {\n        if (preg_match(\"/^(\\s*)\\\\$\\\\$(\\s*)$/\", $line, $matches)) {\n            if ($this->isBlock('math')) {\n                $this->setBlock($key)->endBlock();\n            } else {\n                $this->startBlock('math', $key);\n            }\n\n            return false;\n        } elseif ($this->isBlock('math')) {\n            $this->setBlock($key);\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @param $state\n     * @return bool\n     */\n    private function parseBlockPre($block, $key, $line, &$state)\n    {\n        if (preg_match(\"/^ {4}/\", $line)) {\n            if ($this->isBlock('pre')) {\n                $this->setBlock($key);\n            } else {\n                $this->startBlock('pre', $key);\n            }\n\n            return false;\n        } elseif ($this->isBlock('pre') && preg_match(\"/^\\s*$/\", $line)) {\n            $this->setBlock($key);\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @param $state\n     * @return bool\n     */\n    private function parseBlockHtml($block, $key, $line, &$state)\n    {\n        if (preg_match(\"/^\\s*<({$state['special']})(\\s+[^>]*)?>/i\", $line, $matches)) {\n            $tag = strtolower($matches[1]);\n            if (!$this->isBlock('html', $tag) && !$this->isBlock('pre')) {\n                $this->startBlock('html', $key, $tag);\n            }\n\n            return false;\n        } elseif (preg_match(\"/<\\/({$state['special']})>\\s*$/i\", $line, $matches)) {\n            $tag = strtolower($matches[1]);\n\n            if ($this->isBlock('html', $tag)) {\n                $this->setBlock($key)\n                    ->endBlock();\n            }\n\n            return false;\n        } elseif ($this->isBlock('html')) {\n            $this->setBlock($key);\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @return bool\n     */\n    private function parseBlockFootnote($block, $key, $line)\n    {\n        if (preg_match(\"/^\\[\\^((?:[^\\]]|\\\\]|\\\\[)+?)\\]:/\", $line, $matches)) {\n            $space = strlen($matches[0]) - 1;\n            $this->startBlock('footnote', $key, array(\n                $space, $matches[1]\n            ));\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @return bool\n     */\n    private function parseBlockDefinition($block, $key, $line)\n    {\n        if (preg_match(\"/^\\s*\\[((?:[^\\]]|\\\\]|\\\\[)+?)\\]:\\s*(.+)$/\", $line, $matches)) {\n            $this->_definitions[$matches[1]] = $this->cleanUrl($matches[2]);\n            $this->startBlock('definition', $key)\n                ->endBlock();\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @return bool\n     */\n    private function parseBlockQuote($block, $key, $line)\n    {\n        if (preg_match(\"/^(\\s*)>/\", $line, $matches)) {\n            if ($this->isBlock('list') && strlen($matches[1]) > 0) {\n                $this->setBlock($key);\n            } elseif ($this->isBlock('quote')) {\n                $this->setBlock($key);\n            } else {\n                $this->startBlock('quote', $key);\n            }\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @param $state\n     * @param $lines\n     * @return bool\n     */\n    private function parseBlockTable($block, $key, $line, &$state, $lines)\n    {\n        if (preg_match(\"/^((?:(?:(?:\\||\\+)(?:[ :]*\\-+[ :]*)(?:\\||\\+))|(?:(?:[ :]*\\-+[ :]*)(?:\\||\\+)(?:[ :]*\\-+[ :]*))|(?:(?:[ :]*\\-+[ :]*)(?:\\||\\+))|(?:(?:\\||\\+)(?:[ :]*\\-+[ :]*)))+)$/\", $line, $matches)) {\n            if ($this->isBlock('table')) {\n                $block[3][0][] = $block[3][2];\n                $block[3][2]++;\n                $this->setBlock($key, $block[3]);\n            } else {\n                $head = 0;\n\n                if (empty($block) ||\n                    $block[0] != 'normal' ||\n                    preg_match(\"/^\\s*$/\", $lines[$block[2]])) {\n                    $this->startBlock('table', $key);\n                } else {\n                    $head = 1;\n                    $this->backBlock(1, 'table');\n                }\n\n                if ($matches[1][0] == '|') {\n                    $matches[1] = substr($matches[1], 1);\n\n                    if ($matches[1][strlen($matches[1]) - 1] == '|') {\n                        $matches[1] = substr($matches[1], 0, -1);\n                    }\n                }\n\n                $rows = preg_split(\"/(\\+|\\|)/\", $matches[1]);\n                $aligns = array();\n                foreach ($rows as $row) {\n                    $align = 'none';\n\n                    if (preg_match(\"/^\\s*(:?)\\-+(:?)\\s*$/\", $row, $matches)) {\n                        if (!empty($matches[1]) && !empty($matches[2])) {\n                            $align = 'center';\n                        } elseif (!empty($matches[1])) {\n                            $align = 'left';\n                        } elseif (!empty($matches[2])) {\n                            $align = 'right';\n                        }\n                    }\n\n                    $aligns[] = $align;\n                }\n\n                $this->setBlock($key, array(array($head), $aligns, $head + 1));\n            }\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @return bool\n     */\n    private function parseBlockSh($block, $key, $line)\n    {\n        if (preg_match(\"/^(#+)(.*)$/\", $line, $matches)) {\n            $num = min(strlen($matches[1]), 6);\n            $this->startBlock('sh', $key, $num)\n                ->endBlock();\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @param $state\n     * @param $lines\n     * @return bool\n     */\n    private function parseBlockMh($block, $key, $line, &$state, $lines)\n    {\n        if (preg_match(\"/^\\s*((=|-){2,})\\s*$/\", $line, $matches)\n                    && ($block && $block[0] == \"normal\" && !preg_match(\"/^\\s*$/\", $lines[$block[2]]))) {    // check if last line isn't empty\n            if ($this->isBlock('normal')) {\n                $this->backBlock(1, 'mh', $matches[1][0] == '=' ? 1 : 2)\n                    ->setBlock($key)\n                    ->endBlock();\n            } else {\n                $this->startBlock('normal', $key);\n            }\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @return bool\n     */\n    private function parseBlockShr($block, $key, $line)\n    {\n        if (preg_match(\"/^(\\* *){3,}\\s*$/\", $line)) {\n            $this->startBlock('hr', $key)\n                ->endBlock();\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @return bool\n     */\n    private function parseBlockDhr($block, $key, $line)\n    {\n        if (preg_match(\"/^(- *){3,}\\s*$/\", $line)) {\n            $this->startBlock('hr', $key)\n                ->endBlock();\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param $block\n     * @param $key\n     * @param $line\n     * @param $state\n     * @return bool\n     */\n    private function parseBlockDefault($block, $key, $line, &$state)\n    {\n        if ($this->isBlock('footnote')) {\n            preg_match(\"/^(\\s*)/\", $line, $matches);\n            if (strlen($matches[1]) >= $block[3][0]) {\n                $this->setBlock($key);\n            } else {\n                $this->startBlock('normal', $key);\n            }\n        } elseif ($this->isBlock('table')) {\n            if (false !== strpos($line, '|')) {\n                $block[3][2] ++;\n                $this->setBlock($key, $block[3]);\n            } else {\n                $this->startBlock('normal', $key);\n            }\n        } elseif ($this->isBlock('quote')) {\n            if (!preg_match(\"/^(\\s*)$/\", $line)) { // empty line\n                $this->setBlock($key);\n            } else {\n                $this->startBlock('normal', $key);\n            }\n        } else {\n            if (empty($block) || $block[0] != 'normal') {\n                $this->startBlock('normal', $key);\n            } else {\n                $this->setBlock($key);\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * @param array $blocks\n     * @param array $lines\n     * @return array\n     */\n    private function optimizeBlocks(array $blocks, array $lines)\n    {\n        $blocks = $this->call('beforeOptimizeBlocks', $blocks, $lines);\n\n        $key = 0;\n        while (isset($blocks[$key])) {\n            $moved = false;\n\n            $block = &$blocks[$key];\n            $prevBlock = isset($blocks[$key - 1]) ? $blocks[$key - 1] : NULL;\n            $nextBlock = isset($blocks[$key + 1]) ? $blocks[$key + 1] : NULL;\n\n            list($type, $from, $to) = $block;\n\n            if ('pre' == $type) {\n                $isEmpty = array_reduce(\n                    array_slice($lines, $block[1], $block[2] - $block[1] + 1),\n                    function ($result, $line) {\n                        return preg_match(\"/^\\s*$/\", $line) && $result;\n                    },\n                    true\n                );\n\n                if ($isEmpty) {\n                    $block[0] = $type = 'normal';\n                }\n            }\n\n            if ('normal' == $type) {\n                // combine two blocks\n                $types = array('list', 'quote');\n\n                if ($from == $to && preg_match(\"/^\\s*$/\", $lines[$from])\n                    && !empty($prevBlock) && !empty($nextBlock)) {\n                    if ($prevBlock[0] == $nextBlock[0] && in_array($prevBlock[0], $types)\n                        && ($prevBlock[0] != 'list'\n                            || ($prevBlock[3][0] == $nextBlock[3][0] && $prevBlock[3][1] == $nextBlock[3][1]))) {\n                        // combine 3 blocks\n                        $blocks[$key - 1] = array(\n                            $prevBlock[0],  $prevBlock[1],  $nextBlock[2], $prevBlock[3] ?? null\n                        );\n                        array_splice($blocks, $key, 2);\n\n                        // do not move\n                        $moved = true;\n                    }\n                }\n            }\n\n            if (!$moved) {\n                $key ++;\n            }\n        }\n\n        return $this->call('afterOptimizeBlocks', $blocks, $lines);\n    }\n\n    /**\n     * parseCode\n     *\n     * @param array $lines\n     * @param array $parts\n     * @param int $start\n     * @return string\n     */\n    private function parseCode(array $lines, array $parts, $start)\n    {\n        list($blank, $lang) = $parts;\n        $lang = trim($lang);\n        $count = strlen($blank);\n\n        if (!preg_match(\"/^[_a-z0-9-\\+\\#\\:\\.]+$/i\", $lang)) {\n            $lang = NULL;\n        } else {\n            $parts = explode(':', $lang);\n            if (count($parts) > 1) {\n                list($lang, $rel) = $parts;\n                $lang = trim($lang);\n                $rel = trim($rel);\n            }\n        }\n\n        $isEmpty = true;\n\n        $lines = array_map(function ($line) use ($count, &$isEmpty) {\n            $line = preg_replace(\"/^[ ]{{$count}}/\", '', $line);\n            if ($isEmpty && !preg_match(\"/^\\s*$/\", $line)) {\n                $isEmpty = false;\n            }\n\n            return htmlspecialchars($line);\n        }, array_slice($lines, 1, -1));\n        $str = implode(\"\\n\", $this->markLines($lines, $start + 1));\n if ($lang == 'mermaid') {\n        return $isEmpty ? '' :\n            '<div' . (!empty($lang) ? \" class=\\\"{$lang}\\\"\" : '')\n            . (!empty($rel) ? \" rel=\\\"{$rel}\\\"\" : '') . '>'\n            . $str . '</div>';\n   }\n   else{\n        return $isEmpty ? '' :\n            '<pre><code' . (!empty($lang) ? \" class=\\\"lang-{$lang}\\\"\" : '')\n            . (!empty($rel) ? \" rel=\\\"{$rel}\\\"\" : '') . '>'\n            . $str . '</code></pre>';\n   }\n    }\n\n    /**\n     * parsePre\n     *\n     * @param array $lines\n     * @param mixed $value\n     * @param int $start\n     * @return string\n     */\n    private function parsePre(array $lines, $value, $start)\n    {\n        foreach ($lines as &$line) {\n            $line = htmlspecialchars(substr($line, 4));\n        }\n\n        $str = implode(\"\\n\", $this->markLines($lines, $start));\n        return preg_match(\"/^\\s*$/\", $str) ? '' : '<pre><code>' . $str . '</code></pre>';\n    }\n\n    /**\n     * parseAhtml\n     *\n     * @param array $lines\n     * @param mixed $value\n     * @param int $start\n     * @return string\n     */\n    private function parseAhtml(array $lines, $value, $start)\n    {\n        return trim(implode(\"\\n\", $this->markLines($lines, $start)));\n    }\n\n    /**\n     * parseShtml\n     *\n     * @param array $lines\n     * @param mixed $value\n     * @param int $start\n     * @return string\n     */\n    private function parseShtml(array $lines, $value, $start)\n    {\n        return trim(implode(\"\\n\", $this->markLines(array_slice($lines, 1, -1), $start + 1)));\n    }\n\n    /**\n     * parseMath\n     *\n     * @param array $lines\n     * @param mixed $value\n     * @param int $start\n     * @param int $end\n     * @return string\n     */\n    private function parseMath(array $lines, $value, $start, $end)\n    {\n        return '<p>' . $this->markLine($start, $end) . htmlspecialchars(implode(\"\\n\", $lines)) . '</p>';\n    }\n\n    /**\n     * parseSh\n     *\n     * @param array $lines\n     * @param int $num\n     * @param int $start\n     * @param int $end\n     * @return string\n     */\n    private function parseSh(array $lines, $num, $start, $end)\n    {\n        $line = $this->markLine($start, $end) . $this->parseInline(trim($lines[0], '# '));\n        return preg_match(\"/^\\s*$/\", $line) ? '' : \"<h{$num}>{$line}</h{$num}>\";\n    }\n\n    /**\n     * parseMh\n     *\n     * @param array $lines\n     * @param int $num\n     * @param int $start\n     * @param int $end\n     * @return string\n     */\n    private function parseMh(array $lines, $num, $start, $end)\n    {\n        return $this->parseSh($lines, $num, $start, $end);\n    }\n\n    /**\n     * parseQuote\n     *\n     * @param array $lines\n     * @param mixed $value\n     * @param int $start\n     * @return string\n     */\n    private function parseQuote(array $lines, $value, $start)\n    {\n        foreach ($lines as &$line) {\n            $line = preg_replace(\"/^\\s*> ?/\", '', $line);\n        }\n        $str = implode(\"\\n\", $lines);\n\n        return preg_match(\"/^\\s*$/\", $str) ? '' : '<blockquote>' . $this->parse($str, true, $start) . '</blockquote>';\n    }\n\n    /**\n     * parseList\n     *\n     * @param array $lines\n     * @param mixed $value\n     * @param int $start\n     * @return string\n     */\n    private function parseList(array $lines, $value, $start)\n    {\n        $html = '';\n        list($space, $type, $tab) = $value;\n        $rows = array();\n        $suffix = '';\n        $last = 0;\n\n        foreach ($lines as $key => $line) {\n            if (preg_match(\"/^(\\s{\" . $space . \"})((?:[0-9]+\\.?)|\\-|\\+|\\*)(\\s+)(.*)$/i\", $line, $matches)) {\n                if ($type == 'ol' && $key == 0) {\n                    $start = intval($matches[2]);\n\n                    if ($start != 1) {\n                        $suffix = ' start=\"' . $start . '\"';\n                    }\n                }\n\n                $rows[] = [$matches[4]];\n                $last = count($rows) - 1;\n            } else {\n                $rows[$last][] = preg_replace(\"/^\\s{\" . ($tab + $space) . \"}/\", '', $line);\n            }\n        }\n\n        foreach ($rows as $row) {\n            $html .= \"<li>\" . $this->parse(implode(\"\\n\", $row), true, $start) . \"</li>\";\n            $start += count($row);\n        }\n\n        return \"<{$type}{$suffix}>{$html}</{$type}>\";\n    }\n\n    /**\n     * @param array $lines\n     * @param array $value\n     * @param int $start\n     * @return string\n     */\n    private function parseTable(array $lines, array $value, $start)\n    {\n        list($ignores, $aligns) = $value;\n        $head = count($ignores) > 0 && array_sum($ignores) > 0;\n\n        $html = '<table>';\n        $body = $head ? NULL : true;\n        $output = false;\n\n        foreach ($lines as $key => $line) {\n            if (in_array($key, $ignores)) {\n                if ($head && $output) {\n                    $head = false;\n                    $body = true;\n                }\n\n                continue;\n            }\n\n            $line = trim($line);\n            $output = true;\n\n            if ($line[0] == '|') {\n                $line = substr($line, 1);\n\n                if ($line[strlen($line) - 1] == '|') {\n                    $line = substr($line, 0, -1);\n                }\n            }\n\n\n            $rows = array_map(function ($row) {\n                if (preg_match(\"/^\\s*$/\", $row)) {\n                    return ' ';\n                } else {\n                    return trim($row);\n                }\n            }, explode('|', $line));\n            $columns = array();\n            $last = -1;\n\n            foreach ($rows as $row) {\n                if (strlen($row) > 0) {\n                    $last ++;\n                    $columns[$last] = array(\n                        isset($columns[$last]) ? $columns[$last][0] + 1 : 1,  $row\n                    );\n                } elseif (isset($columns[$last])) {\n                    $columns[$last][0] ++;\n                } else {\n                    $columns[0] = array(1, $row);\n                }\n            }\n\n            if ($head) {\n                $html .= '<thead>';\n            } elseif ($body) {\n                $html .= '<tbody>';\n            }\n\n            $html .= '<tr' . ($this->_line ? ' class=\"line\" data-start=\"'\n                    . ($start + $key) . '\" data-end=\"' . ($start + $key)\n                    . '\" data-id=\"' . $this->_uniqid . '\"' : '') . '>';\n\n            foreach ($columns as $key => $column) {\n                list($num, $text) = $column;\n                $tag = $head ? 'th' : 'td';\n\n                $html .= \"<{$tag}\";\n                if ($num > 1) {\n                    $html .= \" colspan=\\\"{$num}\\\"\";\n                }\n\n                if (isset($aligns[$key]) && $aligns[$key] != 'none') {\n                    $html .= \" align=\\\"{$aligns[$key]}\\\"\";\n                }\n\n                $html .= '>' . $this->parseInline($text) . \"</{$tag}>\";\n            }\n\n            $html .= '</tr>';\n\n            if ($head) {\n                $html .= '</thead>';\n            } elseif ($body) {\n                $body = false;\n            }\n        }\n\n        if ($body !== NULL) {\n            $html .= '</tbody>';\n        }\n\n        $html .= '</table>';\n        return $html;\n    }\n\n    /**\n     * parseHr\n     *\n     * @param array $lines\n     * @param array $value\n     * @param int $start\n     * @return string\n     */\n    private function parseHr($lines, $value, $start)\n    {\n        return $this->_line ? '<hr class=\"line\" data-start=\"' . $start . '\" data-end=\"' . $start . '\">' : '<hr>';\n    }\n\n    /**\n     * parseNormal\n     *\n     * @param array $lines\n     * @param bool $inline\n     * @param int $start\n     * @return string\n     */\n    private function parseNormal(array $lines, $inline, $start)\n    {\n        foreach ($lines as $key => &$line) {\n            $line = $this->parseInline($line);\n\n            if (!preg_match(\"/^\\s*$/\", $line)) {\n                $line = $this->markLine($start + $key) . $line;\n            }\n        }\n\n        $str = trim(implode(\"\\n\", $lines));\n        $str = preg_replace_callback(\"/(\\n\\s*){2,}/\", function () use (&$inline) {\n            $inline = false;\n            return \"</p><p>\";\n        }, $str);\n        $str = preg_replace(\"/\\n/\", \"<br>\", $str);\n\n        return preg_match(\"/^\\s*$/\", $str) ? '' : ($inline ? $str : \"<p>{$str}</p>\");\n    }\n\n    /**\n     * parseFootnote\n     *\n     * @param array $lines\n     * @param array $value\n     * @return string\n     */\n    private function parseFootnote(array $lines, array $value)\n    {\n        list($space, $note) = $value;\n        $index = array_search($note, $this->_footnotes);\n\n        if (false !== $index) {\n            $lines[0] = preg_replace(\"/^\\[\\^((?:[^\\]]|\\\\]|\\\\[)+?)\\]:/\", '', $lines[0]);\n            $this->_footnotes[$index] = $lines;\n        }\n\n        return '';\n    }\n\n    /**\n     * parseDefine\n     *\n     * @return string\n     */\n    private function parseDefinition()\n    {\n        return '';\n    }\n\n    /**\n     * parseHtml\n     *\n     * @param array $lines\n     * @param string $type\n     * @param int $start\n     * @return string\n     */\n    private function parseHtml(array $lines, $type, $start)\n    {\n        foreach ($lines as &$line) {\n            $line = $this->parseInline($line,\n                isset($this->_specialWhiteList[$type]) ? $this->_specialWhiteList[$type] : '');\n        }\n\n        return implode(\"\\n\", $this->markLines($lines, $start));\n    }\n\n    /**\n     * @param $url\n     * @param bool $parseTitle\n     *\n     * @return mixed\n     */\n    private function cleanUrl($url, $parseTitle = false)\n    {\n        $title = null;\n        $url = trim($url);\n\n        if ($parseTitle) {\n            $pos = strpos($url, ' ');\n\n            if ($pos !== false) {\n                $title = htmlspecialchars(trim(substr($url, $pos + 1), ' \"\\''));\n                $url = substr($url, 0, $pos);\n            }\n        }\n\n        $url = preg_replace(\"/[\\\"'<>\\s]/\", '', $url);\n\n        if (preg_match(\"/^(mailto:)?[_a-z0-9-\\.\\+]+@[_\\w-]+(?:\\.[a-z]{2,})+$/i\", $url, $matches)) {\n            if (empty($matches[1])) {\n                $url = 'mailto:' . $url;\n            }\n        }\n\n        if (preg_match(\"/^\\w+:/i\", $url) && !preg_match(\"/^(https?|mailto):/i\", $url)) {\n            return '#';\n        }\n\n        return $parseTitle ? [$url, $title] : $url;\n    }\n\n    /**\n     * @param $str\n     * @return mixed\n     */\n    private function escapeBracket($str)\n    {\n        return str_replace(\n            array('\\[', '\\]', '\\(', '\\)'),  array('[', ']', '(', ')'),  $str\n        );\n    }\n\n    /**\n     * startBlock\n     *\n     * @param mixed $type\n     * @param mixed $start\n     * @param mixed $value\n     * @return $this\n     */\n    private function startBlock($type, $start, $value = NULL)\n    {\n        $this->_pos ++;\n        $this->_current = $type;\n\n        $this->_blocks[$this->_pos] = array($type, $start, $start, $value);\n\n        return $this;\n    }\n\n    /**\n     * endBlock\n     *\n     * @return $this\n     */\n    private function endBlock()\n    {\n        $this->_current = 'normal';\n        return $this;\n    }\n\n    /**\n     * isBlock\n     *\n     * @param mixed $type\n     * @param mixed $value\n     * @return bool\n     */\n    private function isBlock($type, $value = NULL)\n    {\n        return $this->_current == $type\n            && (NULL === $value ? true : $this->_blocks[$this->_pos][3] == $value);\n    }\n\n    /**\n     * getBlock\n     *\n     * @return array\n     */\n    private function getBlock()\n    {\n        return isset($this->_blocks[$this->_pos]) ? $this->_blocks[$this->_pos] : NULL;\n    }\n\n    /**\n     * setBlock\n     *\n     * @param mixed $to\n     * @param mixed $value\n     * @return $this\n     */\n    private function setBlock($to = NULL, $value = NULL)\n    {\n        if (NULL !== $to) {\n            $this->_blocks[$this->_pos][2] = $to;\n        }\n\n        if (NULL !== $value) {\n            $this->_blocks[$this->_pos][3] = $value;\n        }\n\n        return $this;\n    }\n\n    /**\n     * backBlock\n     *\n     * @param mixed $step\n     * @param mixed $type\n     * @param mixed $value\n     * @return $this\n     */\n    private function backBlock($step, $type, $value = NULL)\n    {\n        if ($this->_pos < 0) {\n            return $this->startBlock($type, 0, $value);\n        }\n\n        $last = $this->_blocks[$this->_pos][2];\n        $this->_blocks[$this->_pos][2] = $last - $step;\n\n        if ($this->_blocks[$this->_pos][1] <= $this->_blocks[$this->_pos][2]) {\n            $this->_pos ++;\n        }\n\n        $this->_current = $type;\n        $this->_blocks[$this->_pos] = array(\n            $type,  $last - $step + 1,  $last,  $value\n        );\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    private function combineBlock()\n    {\n        if ($this->_pos < 1) {\n            return $this;\n        }\n\n        $prev = $this->_blocks[$this->_pos - 1];\n        $current = $this->_blocks[$this->_pos];\n\n        $prev[2] = $current[2];\n        $this->_blocks[$this->_pos - 1] = $prev;\n        $this->_current = $prev[0];\n        unset($this->_blocks[$this->_pos]);\n        $this->_pos --;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/Tinypng/Tinify/Client.php",
    "content": "<?php\n\nnamespace Tinify;\n\nclass Client {\n    const API_ENDPOINT = \"https://api.tinify.com\";\n\n    const RETRY_COUNT = 1;\n    const RETRY_DELAY = 500;\n\n    private $options;\n\n    public static function userAgent() {\n        $curl = curl_version();\n        return \"Tinify/\" . VERSION . \" PHP/\" . PHP_VERSION . \" curl/\" . $curl[\"version\"];\n    }\n\n    private static function caBundle() {\n        return __DIR__ . \"/../data/cacert.pem\";\n    }\n\n    function __construct($key, $app_identifier = NULL, $proxy = NULL) {\n        $this->options = array(\n            CURLOPT_BINARYTRANSFER => true,\n            CURLOPT_RETURNTRANSFER => true,\n            CURLOPT_HEADER => true,\n            CURLOPT_USERPWD => \"api:\" . $key,\n            CURLOPT_CAINFO => self::caBundle(),\n            CURLOPT_SSL_VERIFYPEER => true,\n            CURLOPT_USERAGENT => join(\" \", array_filter(array(self::userAgent(), $app_identifier))),\n        );\n\n        if ($proxy) {\n            $parts = parse_url($proxy);\n            if (isset($parts[\"host\"])) {\n                $this->options[CURLOPT_PROXYTYPE] = CURLPROXY_HTTP;\n                $this->options[CURLOPT_PROXY] = $parts[\"host\"];\n            } else {\n                throw new ConnectionException(\"Invalid proxy\");\n            }\n\n            if (isset($parts[\"port\"])) {\n                $this->options[CURLOPT_PROXYPORT] = $parts[\"port\"];\n            }\n\n            $creds = \"\";\n            if (isset($parts[\"user\"])) $creds .= $parts[\"user\"];\n            if (isset($parts[\"pass\"])) $creds .= \":\" . $parts[\"pass\"];\n\n            if ($creds) {\n                $this->options[CURLOPT_PROXYAUTH] = CURLAUTH_ANY;\n                $this->options[CURLOPT_PROXYUSERPWD] = $creds;\n            }\n        }\n    }\n\n    function request($method, $url, $body = NULL) {\n        $header = array();\n        if (is_array($body)) {\n            if (!empty($body)) {\n                $body = json_encode($body);\n                array_push($header, \"Content-Type: application/json\");\n            } else {\n                $body = NULL;\n            }\n        }\n\n        for ($retries = self::RETRY_COUNT; $retries >= 0; $retries--) {\n            if ($retries < self::RETRY_COUNT) {\n                usleep(self::RETRY_DELAY * 1000);\n            }\n\n            $request = curl_init();\n            if ($request === false || $request === null) {\n                throw new ConnectionException(\n                    \"Error while connecting: curl extension is not functional or disabled.\"\n                );\n            }\n\n            curl_setopt_array($request, $this->options);\n\n            $url = strtolower(substr($url, 0, 6)) == \"https:\" ? $url : self::API_ENDPOINT . $url;\n            curl_setopt($request, CURLOPT_URL, $url);\n            curl_setopt($request, CURLOPT_CUSTOMREQUEST, strtoupper($method));\n\n            if (count($header) > 0) {\n                curl_setopt($request, CURLOPT_HTTPHEADER, $header);\n            }\n\n            if ($body) {\n                curl_setopt($request, CURLOPT_POSTFIELDS, $body);\n            }\n\n            $response = curl_exec($request);\n\n            if (is_string($response)) {\n                $status = curl_getinfo($request, CURLINFO_HTTP_CODE);\n                $headerSize = curl_getinfo($request, CURLINFO_HEADER_SIZE);\n                curl_close($request);\n\n                $headers = self::parseHeaders(substr($response, 0, $headerSize));\n                $body = substr($response, $headerSize);\n\n                if (isset($headers[\"compression-count\"])) {\n                    Tinify::setCompressionCount(intval($headers[\"compression-count\"]));\n                }\n\n                if ($status >= 200 && $status <= 299) {\n                    return (object) array(\"body\" => $body, \"headers\" => $headers);\n                }\n\n                $details = json_decode($body);\n                if (!$details) {\n                    $message = sprintf(\"Error while parsing response: %s (#%d)\",\n                        PHP_VERSION_ID >= 50500 ? json_last_error_msg() : \"Error\",\n                        json_last_error());\n                    $details = (object) array(\n                        \"message\" => $message,\n                        \"error\" => \"ParseError\"\n                    );\n                }\n\n                if ($retries > 0 && $status >= 500) continue;\n                throw Exception::create($details->message, $details->error, $status);\n            } else {\n                $message = sprintf(\"%s (#%d)\", curl_error($request), curl_errno($request));\n                curl_close($request);\n                if ($retries > 0) continue;\n                throw new ConnectionException(\"Error while connecting: \" . $message);\n            }\n        }\n    }\n\n    protected static function parseHeaders($headers) {\n        if (!is_array($headers)) {\n            $headers = explode(\"\\r\\n\", $headers);\n        }\n\n        $res = array();\n        foreach ($headers as $header) {\n            if (empty($header)) continue;\n            $split = explode(\":\", $header, 2);\n            if (count($split) === 2) {\n                $res[strtolower($split[0])] = trim($split[1]);\n            }\n        }\n        return $res;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/Tinypng/Tinify/Exception.php",
    "content": "<?php\n\nnamespace Tinify;\n\nclass Exception extends \\Exception {\n    public static function create($message, $type, $status) {\n        if ($status == 401 || $status == 429) {\n            $klass = \"Tinify\\AccountException\";\n        } else if($status >= 400 && $status <= 499) {\n            $klass = \"Tinify\\ClientException\";\n        } else if($status >= 500 && $status <= 599) {\n            $klass = \"Tinify\\ServerException\";\n        } else {\n            $klass = \"Tinify\\Exception\";\n        }\n\n        if (empty($message)) $message = \"No message was provided\";\n        return new $klass($message, $type, $status);\n    }\n\n    function __construct($message, $type = NULL, $status = NULL) {\n        if ($status) {\n            $this->status = $status;\n            parent::__construct($message . \" (HTTP \" . $status . \"/\" . $type . \")\");\n        } else {\n            parent::__construct($message);\n        }\n    }\n}\n\nclass AccountException extends Exception {}\nclass ClientException extends Exception {}\nclass ServerException extends Exception {}\nclass ConnectionException extends Exception {}\n"
  },
  {
    "path": "配套插件/BsCore/modules/Tinypng/Tinify/Result.php",
    "content": "<?php\n\nnamespace Tinify;\n\nclass Result extends ResultMeta {\n    protected $data;\n\n    public function __construct($meta, $data) {\n        $this->meta = $meta;\n        $this->data = $data;\n    }\n\n    public function data() {\n        return $this->data;\n    }\n\n    public function toBuffer() {\n        return $this->data;\n    }\n\n    public function toFile($path) {\n        return file_put_contents($path, $this->toBuffer());\n    }\n\n    public function size() {\n        return intval($this->meta[\"content-length\"]);\n    }\n\n    public function mediaType() {\n        return $this->meta[\"content-type\"];\n    }\n\n    public function contentType() {\n        return $this->mediaType();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/Tinypng/Tinify/ResultMeta.php",
    "content": "<?php\n\nnamespace Tinify;\n\nclass ResultMeta {\n    protected $meta;\n\n    public function __construct($meta) {\n        $this->meta = $meta;\n    }\n\n    public function width() {\n        return intval($this->meta[\"image-width\"]);\n    }\n\n    public function height() {\n        return intval($this->meta[\"image-height\"]);\n    }\n\n    public function location() {\n        return isset($this->meta[\"location\"]) ? $this->meta[\"location\"] : null;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/Tinypng/Tinify/Source.php",
    "content": "<?php\n\nnamespace Tinify;\n\nclass Source {\n    private $url, $commands;\n\n    public static function fromFile($path) {\n        return self::fromBuffer(file_get_contents($path));\n    }\n\n    public static function fromBuffer($string) {\n        $response = Tinify::getClient()->request(\"post\", \"/shrink\", $string);\n        return new self($response->headers[\"location\"]);\n    }\n\n    public static function fromUrl($url) {\n        $body = array(\"source\" => array(\"url\" => $url));\n        $response = Tinify::getClient()->request(\"post\", \"/shrink\", $body);\n        return new self($response->headers[\"location\"]);\n    }\n\n    public function __construct($url, $commands = array()) {\n        $this->url = $url;\n        $this->commands = $commands;\n    }\n\n    public function preserve() {\n        $options = $this->flatten(func_get_args());\n        $commands = array_merge($this->commands, array(\"preserve\" => $options));\n        return new self($this->url, $commands);\n    }\n\n    public function resize($options) {\n        $commands = array_merge($this->commands, array(\"resize\" => $options));\n        return new self($this->url, $commands);\n    }\n\n    public function store($options) {\n        $response = Tinify::getClient()->request(\"post\", $this->url,\n            array_merge($this->commands, array(\"store\" => $options)));\n        return new Result($response->headers, $response->body);\n    }\n\n    public function result() {\n        $response = Tinify::getClient()->request(\"get\", $this->url, $this->commands);\n        return new Result($response->headers, $response->body);\n    }\n\n    public function toFile($path) {\n        return $this->result()->toFile($path);\n    }\n\n    public function toBuffer() {\n        return $this->result()->toBuffer();\n    }\n\n    private static function flatten($options) {\n        $flattened = array();\n        foreach ($options as $option) {\n            if (is_array($option)) {\n                $flattened = array_merge($flattened, $option);\n            } else {\n                array_push($flattened, $option);\n            }\n        }\n        return $flattened;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/Tinypng/Tinify.php",
    "content": "<?php\n\nnamespace Tinify;\n\nconst VERSION = \"1.5.0\";\n\nclass Tinify {\n    private static $key = NULL;\n    private static $appIdentifier = NULL;\n    private static $proxy = NULL;\n\n    private static $compressionCount = NULL;\n    private static $client = NULL;\n\n    public static function setKey($key) {\n        self::$key = $key;\n        self::$client = NULL;\n    }\n\n    public static function setAppIdentifier($appIdentifier) {\n        self::$appIdentifier = $appIdentifier;\n        self::$client = NULL;\n    }\n\n    public static function setProxy($proxy) {\n        self::$proxy = $proxy;\n        self::$client = NULL;\n    }\n\n    public static function getCompressionCount() {\n        return self::$compressionCount;\n    }\n\n    public static function setCompressionCount($compressionCount) {\n        self::$compressionCount = $compressionCount;\n    }\n\n    public static function getClient() {\n        if (!self::$key) {\n            throw new AccountException(\"Provide an API key with Tinify\\setKey(...)\");\n        }\n\n        if (!self::$client) {\n            self::$client = new Client(self::$key, self::$appIdentifier, self::$proxy);\n        }\n\n        return self::$client;\n    }\n\n    public static function setClient($client) {\n        self::$client = $client;\n    }\n}\n\nfunction setKey($key) {\n    return Tinify::setKey($key);\n}\n\nfunction setAppIdentifier($appIdentifier) {\n    return Tinify::setAppIdentifier($appIdentifier);\n}\n\nfunction setProxy($proxy) {\n    return Tinify::setProxy($proxy);\n}\n\nfunction getCompressionCount() {\n    return Tinify::getCompressionCount();\n}\n\nfunction compressionCount() {\n    return Tinify::getCompressionCount();\n}\n\nfunction fromFile($path) {\n    return Source::fromFile($path);\n}\n\nfunction fromBuffer($string) {\n    return Source::fromBuffer($string);\n}\n\nfunction fromUrl($string) {\n    return Source::fromUrl($string);\n}\n\nfunction validate() {\n    try {\n        Tinify::getClient()->request(\"post\", \"/shrink\");\n    } catch (AccountException $err) {\n        if ($err->status == 429) return true;\n        throw $err;\n    } catch (ClientException $err) {\n        return true;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/Tinypng/data/cacert.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx\nGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds\nb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV\nBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD\nVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa\nDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc\nTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb\nKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP\nc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX\ngzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF\nAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj\nY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG\nj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH\nhm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC\nX4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv\nYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\nbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\naWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\nbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6\nErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp\ns6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN\nS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL\nTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C\nygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\nFgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i\nYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN\nBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp\n9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu\n01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7\n9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\nTBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ncmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw\nCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy\ndXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1\nEUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc\ncLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw\nEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj\n055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA\nERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f\nj267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC\n/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0\nxuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa\nt20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u\nZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp\nbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV\nBAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx\nNzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3\nd3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl\nMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u\nZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL\nGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr\nhRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW\nnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi\nVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ\nKoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy\nT/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf\nzX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT\nJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e\nnNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE\nChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li\nZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC\nSUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs\ndGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME\nuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB\nUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C\nG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9\nXbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr\nl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI\nVDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB\nBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh\ncL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5\nhbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa\nY71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H\nRCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU\ncnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw\nCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO\nZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB\nAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6\n54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr\noulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1\nZmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui\nGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w\nHQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD\nAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT\nRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw\nHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt\nZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph\niVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY\neDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr\nmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj\nccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD\nVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw\nNDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU\ncnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg\nUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821\n+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw\nTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo\naSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy\n2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7\n7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P\nBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL\nVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk\nVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB\nIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl\nj7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\n6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355\ne6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u\nG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU\ncnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ\nBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l\ndHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu\nnyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i\nd9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG\nAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw\nHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G\nA1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux\nFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G\nA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4\nJNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL\n+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao\nGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9\nYjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H\nEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU\ncnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx\nCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ\nIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx\n64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3\nKP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o\nL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR\nwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU\nMIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/\nBAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE\nBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y\nazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD\nggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG\nGuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X\ndgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze\nRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB\niFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV\nBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw\nb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG\nA1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0\nMloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu\nMTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu\nY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v\ndCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz\nA9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww\nCj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68\nj6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN\nrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw\nDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1\nMzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH\nhmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA\nA4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM\nY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa\nv52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS\nW3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0\ntHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK\nEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw\nMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\nLjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo\nBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet\n8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc\nT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU\nvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD\nAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk\nDBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q\nzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4\nd0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2\nmqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p\nXE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm\nMw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw\nMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\nLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/\nNTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k\nLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA\nVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b\nHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF\nMAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH\nK266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7\nsrJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh\nZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL\nOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC\nx1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF\nH4z1Ir+rzoPz4iIprn2DQKi6bA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1\nMDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu\nYy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP\nADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t\nJPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e\nRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs\n7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d\n8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V\nqnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga\nRr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB\nZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu\nKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08\nni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0\nXG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB\nhjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc\naanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2\nqaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL\noJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK\nxr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF\nKyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2\nDFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK\nxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU\np8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI\nP/rmMuGNG2+k5o7Y+SlIis5z/iw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0\nMDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg\nSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0\nDE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17\nj1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q\nJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a\nQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2\nWP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP\n20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn\nZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC\nSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG\n8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2\n+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E\nBAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z\ndXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ\n4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+\nmbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq\nA1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg\nY+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP\npm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d\nFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp\ngn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm\nX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG\nEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug\nQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2\nWhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm\nVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv\nbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL\nF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b\nRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0\nTP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI\n/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs\nGHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG\nMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc\nCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW\nYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz\nzkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu\nYQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt\n398znM/jra6O1I7mT1GvFpLgXPYHDw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK\nExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla\nFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u\nby4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x\nwS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL\nkKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ\n89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K\nUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P\nNSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq\nhkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+\nGXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg\nGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/\n0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS\nqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw\nMFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl\nc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV\nBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG\nC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs\ni14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW\nY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH\nYpy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK\nIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f\nBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl\ncy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz\nLmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm\n7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\nRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z\n8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C\n12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw\nMDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu\nY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi\nBgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP\n9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc\nrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC\noznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V\np6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E\nFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w\ngYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj\nYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm\naWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm\n4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj\nZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL\nDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw\npCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H\nRR3B7Hzs/Sk=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw\nMDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h\nbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw\nIwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7\n3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y\n/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6\njuljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS\nivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud\nDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp\nZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl\ncnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw\nuleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32\npSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA\nBHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l\nR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O\n9y5Xt5hwXsjEeLBi\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE\nChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz\nMTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp\ncyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD\nEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk\nJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL\nF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL\nYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen\nAScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w\nPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y\nZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7\nMIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj\nYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs\nZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh\nY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW\nFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu\nBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw\nFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6\ntlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo\nfFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul\nLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x\ngI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi\n5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi\n5nrQNiOKSnQ2+Q==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\nEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx\nODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\naW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6\nXJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk\nlvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB\nlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy\nlZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt\n66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn\nwQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh\nD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy\nBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie\nJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud\nDgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU\na6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT\nElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv\nZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3\nUIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm\nVjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK\n+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW\nIozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1\nWVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X\nf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II\n4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8\nVCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\nEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx\nOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\naW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg\nDhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij\nKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K\nDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv\nBNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp\np5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8\nnT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX\nMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM\nGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz\nuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT\nBgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj\nYXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0\naWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB\nBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD\nVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4\nywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE\nAxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV\nqyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s\nhvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z\nPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2\nPb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp\n8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC\nbjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu\ng/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p\nvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr\nqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\nU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\nHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\nU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw\n8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM\nDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX\n5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd\nDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2\nJChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw\nDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g\n0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a\nmCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ\ns58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ\n6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi\nFL39vmwLAw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG\nU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw\nNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh\nIENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3\n/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT\ndXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG\nf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P\ntOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH\nnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT\nXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt\n0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI\ncbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph\nOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx\nEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH\nllpwrN9M\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE\nBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl\nIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd\nBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx\nOTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0\neTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz\nZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI\nwrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd\ntqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8\ni4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf\nPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw\ngbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF\nlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF\nUkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF\nBwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM\n//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW\nXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2\nlzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn\niCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67\nnfhmqA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe\nQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i\nZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx\nNjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp\ncm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn\nMSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC\nAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU\nxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH\nNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW\nDA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV\nd9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud\nEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v\ncmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P\nAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh\nbWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD\nVR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz\naWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi\nfJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD\nL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN\nUPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n\nADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1\nerfutGWaIZDgqtCYvDi1czyL+Nw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe\nQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i\nZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx\nNDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt\nYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg\nMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw\nggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J\n1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O\nby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl\n6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c\n8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/\nBAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j\naGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B\nAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj\naGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y\nZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh\nbWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA\nPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y\ngOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ\nPJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4\nIBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes\nt2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE\nBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj\ndXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx\nHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg\nU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ndHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu\nIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx\nfoArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE\nzG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs\nAxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry\nxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap\noCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC\nAQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc\n/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt\nqZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n\nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz\n8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY\nVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG\nA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g\nRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD\nggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv\n2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32\nqRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j\nYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY\nvLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O\nBBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o\natTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu\nMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG\nA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim\nPQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt\nI3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\nHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI\nLs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b\nvZ8=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc\nU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo\nMQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG\nA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG\nSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY\nbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ\nJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm\nepsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN\nF4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF\nMIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f\nhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo\nbm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g\nQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs\nafPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM\nPUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\nxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD\nKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3\nQBFGmh95DmK/D5fs4C8fF5Q=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN\nU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu\nZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0\nNjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk\nLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg\nU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\nggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y\no4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/\nHo/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d\neMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt\n2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z\n6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ\nosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/\nuntp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc\nUjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT\n37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE\nFE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0\nY29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj\nYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH\nAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw\nOi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg\nU3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5\nLCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl\ncnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh\ncnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT\ndGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC\nAgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh\n3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm\nvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk\nfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3\nfsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ\nEoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq\nyvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl\n1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/\nlwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro\ng14=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG\nEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X\nDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv\ndmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN\nw8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5\nBtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O\n1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO\nhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov\nJ5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7\nQ3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t\nB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB\nO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8\nlSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV\nHRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2\n09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ\nTulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj\nZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2\nNe//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU\nD7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz\nDxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk\nZ6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk\n7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ\nCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy\n+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG\nEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy\ndmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4\nMTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln\naXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM\nMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF\nNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe\nAR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC\nb6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn\n7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN\ncA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp\nWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5\nhaa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY\nMUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw\nHQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j\nBBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9\nMA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn\njgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ\nMbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H\nVtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl\nvrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl\nOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3\n1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq\nnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy\nx/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW\nNY6E0F/6MBr1mmz0DlP5OlvRHA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\nIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx\nMTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\nExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO\n9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy\nUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW\n/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy\noeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf\nGHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF\n66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq\nhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc\nEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn\nSbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i\n8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\n+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\nHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw\nMDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ndy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn\nTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5\nBmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H\n4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y\n7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB\no2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm\n8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF\nBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr\nEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt\ntep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886\nUAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw\nKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw\nMFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ\nMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu\nY2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t\nMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS\nOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3\nMRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ\nNAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe\nh10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB\nAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY\nJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ\nV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp\nmyPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK\nmNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\nvEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE\nBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN\nOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy\ndHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR\n5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ\nVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO\nYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e\ne++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME\nCDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ\nYIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t\nL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD\nP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R\nTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+\n7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW\n//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7\nl7+ijrRU\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK\nExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X\nDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1\ncmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT\nrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9\nUL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy\nxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d\nutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T\nAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ\nMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug\ndB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE\nGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw\nRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS\nfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT\nMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha\nMFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE\nCxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI\nDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa\npCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow\nGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy\nMjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud\nEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu\nY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy\ndXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU\nCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2\n5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t\nFr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq\nnExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs\nvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3\noKfN5XozNmr6mis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw\nEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN\nMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp\nc3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq\nt2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C\njCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg\nvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF\nylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR\nAiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend\njIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO\npeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR\n7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi\nGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64\nOfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov\nL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm\n5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr\n44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf\nMke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m\nGu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp\nmo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk\nvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf\nKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br\nNU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj\nviOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT\nBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X\nDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3\naXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG\n9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644\nN0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm\n+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH\n6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu\nMGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h\nqAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5\nFZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs\nROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc\ncelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X\nCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB\ntjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0\ncDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P\n4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F\nkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L\n3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx\n/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa\nDGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP\ne97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu\nWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ\nDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub\nDgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG\nEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD\nZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx\nCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ\ncmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN\nb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9\nnceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge\nRwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt\ntm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI\nhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K\nTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN\nNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa\nFloxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG\n1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE\nBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\naWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3\nMDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg\nSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv\nKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT\nFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs\noPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ\n1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc\nq/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K\naAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p\nafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD\nVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF\nAAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE\nuzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX\nxPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89\njxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH\nz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE\nBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\nZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\nIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB\nyjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln\nbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh\ndXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt\nYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz\nj/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD\nY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/\nArr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r\nfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/\nBAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv\nZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\naXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG\nSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+\nX6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE\nKQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC\nKm0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE\nZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy\ndXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe\nBgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX\nOZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t\nDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH\nGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b\n01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH\nursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj\naHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\nKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu\nSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf\nmbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ\nnMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR\n3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH\nbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg\nMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg\nQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx\nYDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ\nbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g\n8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV\nHDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi\n0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn\noCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA\nMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+\nOYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn\nCDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5\n3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc\nf8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE\nBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\nA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb\nMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD\nT01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH\n+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww\nxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV\n4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA\n1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI\nrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k\nb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC\nAQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP\nOGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/\nRxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc\nIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN\n+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG\nEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr\nIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx\nMjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu\nMTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx\njOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT\naaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT\ncrA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc\n/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB\nAAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv\nbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA\nA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q\n4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/\nGGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv\nwKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD\nydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM\nF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw\nNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN\nMDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl\nbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD\nVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1\niGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13\ni0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8\nbJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB\nK0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB\nAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu\ncGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm\nlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB\ni6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww\nGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg\nUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI\nK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0\nbh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj\nqHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es\nE2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ\ntylv2G0xffX8oRAHh84vWdw+WNs=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC\nR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\nChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix\nGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\nQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo\nb3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X\n4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni\nwz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG\nFAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA\nU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\nU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh\ndGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE\nBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl\nY3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO\n/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX\nWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z\nZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4\nbepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK\n9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG\nSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm\niEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG\nAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW\nmHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW\nT1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE\nBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG\nA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH\nbG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD\nVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw\nIAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5\nIEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9\nNt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg\nAsj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD\nd50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ\n/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R\nLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\nKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm\nMMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4\n+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa\nhNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY\nokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE\nBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL\nEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0\nMDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz\ndDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT\nGU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\nAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG\nd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N\noqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc\nQR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ\nPqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb\nMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG\nIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD\nVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3\nLmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A\ndAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn\nAGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA\n4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg\nAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA\negBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6\nLy93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO\nPU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv\nc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h\ncnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw\nIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT\nWjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV\nMIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER\nMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp\nZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal\nHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT\nnGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE\naGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a\n86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK\nyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB\nS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw\nEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3\nMDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI\nQ2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q\nXOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH\nGxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p\nogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg\nDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf\nIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ\ntCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ\nBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J\nSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA\nhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+\nImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu\nPBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY\n1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw\nWyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT\nRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG\nA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5\nMjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G\nA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS\nb290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5\nbzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI\nKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY\nAUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK\nSe5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV\njlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV\nHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr\nE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy\nzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8\nrZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G\ndyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\nCm26OWMohpLzGITY+9HPBVZkVw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li\nZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4\nMDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD\nExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW\n0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL\nAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin\n89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT\n8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2\nMDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G\nA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO\nlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi\n5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2\nhO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T\nX3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW\nWL1WMRJOEcgh4LMRkWXbtKaIOM5V\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG\nEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg\nUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx\nMjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq\nMCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs\nIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi\nlTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv\nqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX\n12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O\nWQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+\nETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao\nlQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/\nvv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi\nZo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi\nMAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH\nClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0\n1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq\nKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV\nxrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP\nNXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r\nGNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE\nxJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx\ngMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy\nsP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD\nBCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH\nDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q\naWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry\nb25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV\nBAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg\nS8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4\nMjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl\nIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF\nn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl\nIEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft\ndSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl\ncnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B\nAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO\nEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1\nxnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR\n6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL\nhmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd\nBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\nMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4\nN5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT\ny9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh\nLBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M\ndqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD\nVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa\nFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE\nCxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I\nJUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH\nrfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2\nssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD\n0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943\nAAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B\nAf8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB\nAQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8\nSG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0\nx2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt\nvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz\nTogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE\nChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw\nOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD\no+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz\nVHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT\nVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or\nczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK\ny5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC\nwQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S\nlgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5\nGv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM\nO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8\nBS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2\nG8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m\nmxE=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT\nSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw\nMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl\ncm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4\nfl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN\nwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE\njP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu\nnyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU\nWssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV\nBAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD\nvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs\no2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g\n/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD\nio+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW\ndupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL\nrosot4LKGAfmt1t06SAZf7IbiVQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE\nBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0\nIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz\nNTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo\nYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT\nLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j\nK/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE\nc5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C\nIShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu\ndlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr\n2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9\ncr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE\nAp7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD\nAWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s\nt/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC\nVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu\nIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg\nQ0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV\nMBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG\nb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt\nIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS\nLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5\n8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU\nmtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN\nG4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K\nrr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE\nBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\naWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w\nODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh\nd3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD\nVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG\nA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At\nP0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC\n+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY\n7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW\nvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ\nKoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK\nA3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu\nt8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC\n8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm\ner/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC\nVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu\nYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD\nZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1\nOVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg\nMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl\nb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG\nBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc\nKiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD\nVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+\nEVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m\nndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2\nnpaqBA+K\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE\nBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\nZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\nIHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u\nIEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ncmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj\n1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP\nMiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72\n9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I\nAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR\ntPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G\nCCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O\na8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud\nDgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3\nY8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx\nY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx\nP/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P\nwGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4\nmJO37M2CYfE45k+XmCpajQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC\nVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3\nb3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz\nZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj\nYXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL\nMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU\ncnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo\nb3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5\nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8\nUtpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz\nrl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB\n/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw\nHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u\nY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD\nA2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx\nAJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G\nA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610\ndsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB\ncmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx\nMjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO\nZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv\nbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6\nc8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu\n0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw\n/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk\nH3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw\nfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1\nneWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB\nBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW\nqZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta\nYtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\nbLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna\nNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu\ndZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\nCgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\nUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC\nTkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\nZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ\n5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn\nvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj\nCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil\ne7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR\nOME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI\nCT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65\n48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi\ntrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737\nqWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB\nAAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC\nARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV\nHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA\nA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz\n+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj\nf/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN\nkqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk\nCpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF\nURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb\nCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h\noKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV\nIPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm\n66+KAQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT\nDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx\nNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n\nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1\nApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr\nauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh\nqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY\nV18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV\nHRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i\nh9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio\nl7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei\nIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps\nT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT\nc4afU9hDDl3WY4JxHYB0yvbiAmvZWg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi\nSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS\nb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw\nKQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1\ncmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL\nTJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO\nwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq\ng6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP\nO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA\nbpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX\nt94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh\nOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r\nbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ\nOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01\ny8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061\nlgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD\nT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4\nMDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG\nA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF\nAAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk\nWLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD\nYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew\nMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb\nm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk\nHQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT\nxKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2\n3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9\n2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq\nTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz\n4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU\n9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv\nbS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg\naHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP\neGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk\nzQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1\nThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI\nKiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq\nnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE\nI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp\nMCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o\ntkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER\nMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv\nc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o\ndTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE\nBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt\nU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA\nfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG\n0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA\npxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm\n1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC\nAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf\nQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE\nFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o\nlZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX\nI/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775\ntyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02\nyULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi\nLXpUq3DDfSJlgnCW\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv\nYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\nbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\naWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\nbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt\niHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ\n0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3\nrHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl\nOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2\nxmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7\nlgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8\nEpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E\nbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18\nYIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r\nkpeDMdmztcpHWD9f\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA\nBgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\nMjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw\nQAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB\nNjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD\nUtd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P\nB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY\n7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH\nECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI\nplD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX\nMbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX\nLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK\nbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU\nvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud\nEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH\nDhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp\ncm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA\nbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx\nADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx\n51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk\nR71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP\nT481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f\nJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl\nosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR\ncrHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR\nsaS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD\nKCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi\n6Et8Vcad+qMUu2WFbm5PEn4KPJ2V\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG\nEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz\nMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu\nQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ\n03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK\nClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU\n+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC\nPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT\nOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK\nF7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK\n0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+\n0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB\nleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID\nAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+\nSVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG\nNjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx\nMCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O\nBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l\nFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga\nkEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q\nhT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs\ng1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5\naTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5\nnXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC\nClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo\nQ0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z\nWrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD\nMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\nbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\nQS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy\nMjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl\nZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF\nEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl\ncnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\nAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA\nXuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj\nh40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/\nikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk\nNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g\nD2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331\nlubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ\n0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj\nya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2\nEQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI\nG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ\nBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh\nbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh\nbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC\nCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH\nAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1\nwqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH\n3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU\nRWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6\nM6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1\nYJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF\n9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK\nzBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG\nnrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg\nOGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD\nMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\nbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\nQS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx\nNDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg\nY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ\nQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD\naGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf\nVtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf\nXjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0\nZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB\n/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA\nTH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M\nH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe\nOx2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF\nHTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh\nwZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB\nAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT\nBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE\nBhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm\naXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm\naXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp\n1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0\ndHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG\n/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6\nReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s\ndZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg\n9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH\nfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du\nqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr\nP3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq\nc5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z\n09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu\nMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\nMDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\nb25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G\nA1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq\n9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD\n+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd\nfMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl\nNAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9\nBUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac\nvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r\n5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV\nN8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\nLPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\nb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0\neSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw\nDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg\nVGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB\ndXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv\nW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs\nbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk\nN3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf\nZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU\nJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol\nTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx\n4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw\nF5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\npL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ\nc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\nb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl\nIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV\nBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT\ndGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg\nUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2\nh/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa\nhHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP\nLJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB\nrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\nAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG\nSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP\nE95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy\nxQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\niEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza\nYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw\nMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\nbVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb\nDuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV\nC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6\nBfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww\nMmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV\nHQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG\nhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi\nqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv\n0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh\nsUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw\nMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\nbVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE\nHi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI\ndIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24\n/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb\nh+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV\nHQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu\nUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6\n12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23\nWJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9\n/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy\nOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy\ndXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\nMIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn\nBKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV\n5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs\n+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd\nGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R\np9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI\nS+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04\n6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5\n/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo\n+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv\nMiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg\nNt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC\n6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S\nL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK\n+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV\nBtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg\nIxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60\ng2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb\nzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV\nBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx\nMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U\ncnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA\nIgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ\nN8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW\nBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK\nBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X\n57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM\neQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK\nExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy\nMTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU\nZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nMSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC\nl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J\nJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4\nfOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0\ncvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw\nDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj\njSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1\nmS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj\nZt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI\n03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK\nQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg\nLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG\nA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw\nJAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa\nwE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly\nLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw\n2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N\njMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q\nc1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC\nlrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb\nxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g\n530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna\n4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G\nA1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ\nKoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x\nWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva\nR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40\nnJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B\nCxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv\nJL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE\nqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b\nWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE\nwk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/\nvgt2Fl43N+bYdJeimUV5\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ\nVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG\nEwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB\nIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\nAoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx\nQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC\noi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP\n4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r\ny+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB\nBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG\n9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC\nmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW\nQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY\nT0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny\nYh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\nU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh\ndGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC\nSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy\naXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++\n+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R\n3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV\nspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K\nEOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8\nQIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB\nCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj\nu/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk\n3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q\ntnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29\nmvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE\nBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w\nODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD\nVQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE\nCxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT\nBkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7\nMDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt\nSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl\nZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh\ncnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK\nw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT\nae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4\nHvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a\nE9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw\n0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E\nBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD\nVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0\nLm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l\ndC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ\nlF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa\nAl6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe\nl+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2\nE/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D\n5EI=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT\nO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y\naXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\nIFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT\nAkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\nIENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo\nIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI\n1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa\n71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u\n8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH\n3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/\nMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8\nMAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu\nb3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt\nXdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8\nTqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD\n/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N\n7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM\nBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE\nAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky\nMjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz\nIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290\nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ\nwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa\nby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6\nzfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f\nYVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2\noxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l\nEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7\nhNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8\nEBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5\njF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY\niDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt\nifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI\nWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0\nJZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx\nK3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+\nXlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC\n4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo\n2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz\nlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem\nOR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9\nvwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG\nEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290\nIENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV\nBAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ\nRUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk\nH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa\ncY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt\no3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA\nAaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd\nBgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c\nGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC\nyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P\n8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV\nl/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl\niB6XzCGcKQENZetX2fNXlrtIzYE=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN\nU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu\nZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0\nNjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk\nLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg\nU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\nggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y\no4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/\nHo/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d\neMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt\n2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z\n6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ\nosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/\nuntp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc\nUjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT\n37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD\nVR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ\nQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0\ndHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu\nc3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv\nbW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0\naGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0\naW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t\nL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG\ncmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5\nfPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm\nN3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN\nOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T\ntn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX\ne2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA\n2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs\nHvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE\nJnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib\nD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN\nU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\nRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE\nChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ndHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O\no1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG\n4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi\nAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul\nQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs\nO+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H\nvKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L\nnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS\nFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa\nz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ\nKoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K\n2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk\nJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+\nJYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG\n/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc\nnIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld\nblhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc\nl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm\n7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm\nobp573PYtlNXLfbQ4ddI\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X\nDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\neXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1\ng1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn\n9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b\n/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU\nCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff\nawrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI\nzRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn\nBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX\nUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs\nM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\nAAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s\nA20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI\nosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S\naq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd\nDnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD\nLfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0\noyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC\nwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS\nCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN\nrJgWVqA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X\nDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\neXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH\nsJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR\n5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh\n7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ\nZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH\n2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV\n/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ\nRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA\nXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq\nj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\nAAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV\ncSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G\nuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG\nQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8\nZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2\nKSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz\n6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug\nUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe\neOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi\nCp/HuZc=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\nIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ncnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx\nMDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ndGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\nZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK\n9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU\nNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF\niP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W\n0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA\nMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr\nAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb\nfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT\nucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h\nP0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml\ne9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG\nEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy\ndGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw\nMTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB\nUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy\nZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM\nTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2\nrpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw\n93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN\nP2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T\nAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ\nMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF\nBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj\nxY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM\nlIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u\nuSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU\n3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM\ndcGWxZ0=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF\nbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP\nMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg\nQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X\nDTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl\na3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN\nBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp\nbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N\nYvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv\nKUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya\nKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT\nrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC\nAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s\nPx+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I\naE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO\nXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb\nBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK\npoRq0Tl9\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK\nDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe\nFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE\nLVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD\nER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA\nBF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv\nKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z\np+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC\nAwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ\n4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y\neS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw\nMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G\nPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw\nOS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm\n2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0\no3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV\ndT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph\nX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\nDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\nOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\nDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\nOTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS\negpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh\nzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T\n7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60\nsUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35\n11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv\ncop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v\nZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El\nMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp\nb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh\nc3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+\nPPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05\nnsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX\nANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA\nNCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv\nw9y4AyHqnxbxLFS1\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk\nZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ\nMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz\ndGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl\ncmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw\nIwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw\nMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w\nDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD\nZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp\nY2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC\nwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA\n3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh\nRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO\nEO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2\n0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH\n0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU\ntd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw\nBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp\nr2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/\nAgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz\nNi0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId\nxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp\nZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH\nEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h\nY2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k\nZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG\n9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG\nMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG\nLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52\nZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy\nYWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v\nY3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o\ndHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq\nT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN\ng7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q\nuxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1\nn8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn\nFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo\n5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq\n3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5\npoLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y\neMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV\nBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D\naGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg\nUm9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG\nA1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM\nPkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl\ncyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y\njUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV\n98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H\nklY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23\nKzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC\n7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV\nHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD\nglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5\n0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM\n7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws\nZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0\n5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG\nEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy\ndmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2\nMjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln\naXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM\nLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo\nysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ\nwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH\nWrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a\nSgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS\nNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab\nmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY\nYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3\nqPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw\nHQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O\nBBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu\nMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO\nv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ\n82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz\no9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs\na0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx\nOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW\nmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o\n+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC\nrvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX\n5OfNeOI5wSsSnqaeG8XmDtkx2Q==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE\nBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl\ncnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN\nMzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT\nHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg\nQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz\no3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy\nXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti\nGZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li\nqG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH\nZa0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG\nalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa\nm3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox\nbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi\nxzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/\nBAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED\nMB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB\nbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL\nj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU\nwp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7\nXwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH\n59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/\n23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq\nJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA\nHmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi\nuMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW\nl8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw\nEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp\nZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx\nEzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp\nc2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy\n3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8\nu8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2\nm6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk\nCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa\nYVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6\nvpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL\nLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX\nZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is\nXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV\nHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ\n04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR\nxVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B\nLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM\nCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb\nVSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85\nYmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS\nds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix\nlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N\nUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ\na7+h89n07eLw4+1knj0vllJPgFOL\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw\nEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp\nZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx\nEzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp\nc2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC\nw3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia\nxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7\nA7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S\nGBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV\ng8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa\n5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE\nkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A\nAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i\nFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV\nHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u\nQu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM\ntCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV\nsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je\ndR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8\n1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx\nmHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01\nutI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0\nsorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg\nUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV\n7+ZtsH8tZ/3zbBt1RqPlShfppNcL\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB\nSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1\nMDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH\nUEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM\njmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0\nRGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD\naaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ\n0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG\nWuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7\n8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR\n5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J\n9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK\nQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw\nOi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu\nY3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2\nVuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM\nHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA\nQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh\nAO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA\nYwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj\nAHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA\nIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk\naHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0\ndHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2\nMV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI\nhvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E\nR9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN\nYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49\nnCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ\nTS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3\nsCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h\nI6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg\nNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd\n3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p\nEfbRD0tVNEYqi4Y7\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT\nCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD\nQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK\nEwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg\nQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C\nnJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV\nr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR\nQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV\ntTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W\nKKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99\nsy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p\nyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn\nkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI\nzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC\nAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g\ncFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn\nLhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M\n8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg\n/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg\nlPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP\nA9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m\ni4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8\nEHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3\nzqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE\nCgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4\nMTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW\nVGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+\n6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA\n3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k\nB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn\nXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH\noLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3\nF0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ\noWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7\ngUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc\nTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB\nAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW\nDNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm\nzqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx\n0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW\npb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV\nG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc\nc41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT\nJsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2\nqReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6\nY2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems\nWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w\nDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls\nZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN\nZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw\nNTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx\nQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl\ncmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD\nDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\nMIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd\nhQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K\nCKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g\nElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ\nBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0\nE+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz\nrt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq\njqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn\nrFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5\ndUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB\n/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG\nMA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK\nkEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO\nXKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807\nVRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo\na2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc\ndlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV\nKV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT\nDx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0\n8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G\nC7TbO6Orb1wdtn7os4I07QZcJA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\nIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ncnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx\nMDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ndGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\nZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ\nSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F\nvudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970\n2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV\nWOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA\nMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy\nYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4\nr6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf\nvNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR\n3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN\n9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU\ncnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4\nMzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG\nA1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV\nhTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr\n54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+\nDgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320\nHLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR\nz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R\nl+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ\nbNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\nCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h\nk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh\nTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9\n61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G\n3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG\nA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\nb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN\nMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg\nRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE\nPBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm\nPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6\nPser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN\nofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l\ng6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV\n7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX\n9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f\niyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg\nt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI\nhvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC\nMTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3\nGPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct\nTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP\n+V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh\n3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa\nwx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6\nO0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0\nFU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV\nhMJKzRwuJIczYOXD\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG\nA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\nb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN\nMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg\nRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh\nZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY\nNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t\noIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o\nMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l\nV0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo\nL1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ\nsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD\n6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh\nlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI\nhvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66\nAarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K\npVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9\nx52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz\ndWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X\nU/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw\nmNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD\nzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN\nJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr\nO3jtZsSOeWmD3n+M\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG\nA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\nb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN\nMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg\nRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286\nIxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL\nMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe\n6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3\nI4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U\nVDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7\n5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi\nMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM\ndyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt\nrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI\nhvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px\nKGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS\nt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ\nTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du\nDcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib\nIh6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD\nhPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX\n0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW\ndSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2\nPpxxVJkES/1Y+Zj0\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\nIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw\nMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\nExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH\n35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq\nbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw\nVWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP\nYLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn\nlTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO\nw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv\n0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz\nd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW\nhsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M\njomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo\nIhNzbM8m9Yop5w==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV\nUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD\nVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\nMTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ\nBgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb\nRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs\nKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF\nUaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy\nYZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy\n1vUhZscv6pZjamVFkpUBtA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\nHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx\nMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ndy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ\nkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO\n3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV\nBJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM\nUNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB\no0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu\n5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr\nF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U\nWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH\nQRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/\niyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\nMrY=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV\nUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD\nVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw\nMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k\naWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C\nAQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O\nYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP\nBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp\nYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y\n3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34\nVOKa5Vt8sycX\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw\nHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\nMTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G\nCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp\npz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o\nk3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa\nvOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY\nQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6\nMUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm\nmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7\nf/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH\ndL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8\noR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud\nDwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD\nggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY\nZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr\nyF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy\n7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah\nixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN\n5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb\n/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa\n5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK\nG48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP\n82Z+\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG\nEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g\nQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ\nBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\nvcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO\nCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX\n2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5\nKIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR\n+ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez\nEC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk\nlWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2\n8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY\nyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C\nAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R\n8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1\nLOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq\nT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj\ny+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC\n2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes\n5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/\nEaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh\nmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx\nkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi\nkpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG\nEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv\ngeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD\nVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN\nBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k\n8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5\nuQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85\ndE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5\nEd+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy\nb7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc\n76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m\n+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6\nyke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX\nGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA\nA4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6\nyAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY\nr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115\nj0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A\nkLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97\nqA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y\njj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB\nONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv\nT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO\nkI26oQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE\nBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\nA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC\nR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\nChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn\ndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ\nFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+\n5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG\nx8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX\n2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL\nOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3\nsgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C\nGCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5\nWdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E\nFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w\nDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt\nrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+\nnq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg\ntZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW\nsRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp\npC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA\nzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq\nZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52\n7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I\nLaZRfyHBNVOFBkpdn627G190\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE\nBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK\nExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE\nBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK\nExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz\n0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j\nY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn\nRghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O\n+T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq\n/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE\nY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM\nlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8\nyexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+\neLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd\nBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\nMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW\nFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ\n7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ\nEg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM\n8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi\nFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi\nyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c\nJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw\nsAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx\nQ+6IHdfGjjxDah2nGN59PRbxYvnKkKj9\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC\nVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\naGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC\nVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\naGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2\n0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez\nnPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV\nHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB\nHU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu\n9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb\nR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\nEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb\nR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\nEwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl\nOQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P\nAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV\nMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF\nJzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb\nR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\nEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb\nR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\nEwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6\nSFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS\nh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd\nBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx\nuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7\nyFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\nCgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\nUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC\nTkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\nZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y\nolQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t\nx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy\nEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K\nTj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur\nmkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5\n1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp\n07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo\nFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE\n41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB\nAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu\nyjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD\nU5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq\nKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1\nv0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA\n8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b\n8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r\nmj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq\n1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI\nJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV\ntzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE\nCgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\nRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M\nMR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl\ncmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk\nSzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW\nO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r\n0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8\nKj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV\nXJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr\n08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV\n0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd\n74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx\nfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa\nivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI\neK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu\nc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq\n5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN\nb/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN\nf1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi\n5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4\nWeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK\nDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy\neUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG\nEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS\nb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES\nMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB\nIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld\nhNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/\nmNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi\n1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C\nXZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl\n3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy\nNeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV\nWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg\nxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix\nuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC\nAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI\nhvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH\n6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg\nghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt\nozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV\nYjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX\nfeu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro\nkTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe\n2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz\nZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R\ncGzM7vRX+Bi6hG6H\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG\nEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv\nciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV\nUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS\nb290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy\nP4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6\nHi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI\nrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf\nqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS\nmJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn\nol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh\nLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v\niDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL\n4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B\nAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw\nDQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj\nt2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A\nmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt\nGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt\nm6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx\nNRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4\nMhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI\najjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC\nZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ\n3Wl9af0AVqW3rLatt8o+Ae+c\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV\nBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy\nbXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug\nb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw\nHhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT\nDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx\nOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s\neTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP\n/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz\nHHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU\ns/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y\nTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx\nAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6\n0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z\niXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ\nRkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi\nnWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+\nvGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO\ne4pIb4tF9g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx\nFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn\nYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl\nZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nIC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw\nFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs\nLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg\ndXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt\nIEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy\nAsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef\n9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h\nvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8\nkmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE\nCgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB\nIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw\nMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD\nDAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV\nBU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD\n7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN\nuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW\nZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7\nxzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f\npy25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K\ngWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol\nhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ\ntqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf\nBgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\n/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB\nACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q\necsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua\n4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG\nE5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX\nBDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn\naH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy\nPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX\nkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C\nekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN\nBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp\nbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg\nRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw\nODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w\nSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE\nn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp\nZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537\njVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m\nep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP\n9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV\n4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH\nHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI\nhvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo\nBP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq\nURawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl\nlpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8\nB59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G\nA1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls\nacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF\nbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5\nMDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL\nBgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf\naSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm\naWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\nAoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a\n2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED\nwnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb\nHH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV\n+DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT\n9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG\n9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R\nfdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy\no4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW\nhvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1\nO6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK\nQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg\nLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx\nEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD\nZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos\nP5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo\nd5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap\nz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00\n8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x\nRLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE\n6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t\nFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV\nPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH\ni5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj\nYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I\n6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF\nAAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV\nWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw\nPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX\nlCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ\ny29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9\nIff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng\nDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi\nI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM\ncyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr\nhkIGuUE=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG\nEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl\nZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw\nMzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD\nVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds\nb2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX\nscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP\nrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk\n9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o\nQnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg\nGUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB\n/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI\nhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD\ndHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0\nVQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui\nHZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic\nNc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG\nEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g\nQXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx\nCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm\naWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai\nXW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du\nW/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9\n5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK\nv0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC\nAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI\nhvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY\nP0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3\nTgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu\n+sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+\n7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD\nTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v\ndDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK\nExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI\nzj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU\nt5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw\nQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R\nMluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0\nDaupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu\na/GRspBl9JrmkO5K\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG\nA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV\nBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ\nBgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD\nVQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q\nqEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK\nDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE\n2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ\nckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi\nieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P\nAQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC\nAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5\nO/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67\noPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul\n4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6\n+/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE\nBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1\nbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y\nayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ\nTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl\ncnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB\nIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9\n7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o\nCgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b\nRr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p\nuTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130\nGO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ\n9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB\nRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye\nhizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM\nBhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI\nhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW\nAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA\nL55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo\nclm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM\npkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb\nw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo\nJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm\nypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX\nis7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7\nzAYspsbiDrW5viSP\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT\nBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0\naW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl\nYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx\nMTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg\nQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV\nBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw\nMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv\nbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh\niGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+\n6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd\nFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr\ni5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F\nGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2\nfu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu\niNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc\nBw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI\nhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+\nD1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM\nd/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y\nd+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn\n82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb\ndavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F\nJej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt\nJ94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa\nJI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q\np/UsQu0yrbYhnr68\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0\naGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u\ncyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj\naCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw\nMzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj\nIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD\nVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290\nQ0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP\ndJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK\nVlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O\nBBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA\nGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn\ndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV\nBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe\nFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD\nZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN\nr49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx\nQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj\nBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv\nLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2\nz4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc\n4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd\n4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj\njy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+\nob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY\nlwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh\n66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG\nYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/\n2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F\n6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX\nCNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe\ntUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC\nVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/\n+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+\nqsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT\nAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x\nNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0\ncGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA\nBM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN\nAm8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD\nAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud\nIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV\nHdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl\nvPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV\nBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx\nMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM\nCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB\nAQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa\nYp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87\nay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO\nYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9\nxNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO\n9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq\n3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi\nn6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9\nURQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr\nTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px\nN3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E\nPLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv\nuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK\nn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh\nX4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80\nnR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm\nGS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/\nbw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o\n4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA\nOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV\nBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy\nMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM\nCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB\nAQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+\nNtmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz\n4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV\neYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt\nUdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz\n3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj\n3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz\n9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0\n0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT\ny3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59\nM4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz\nGj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI\nmUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG\nS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp\nEndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ\n6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr\ngCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo\nSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0\nYJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm\nu7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT\nAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X\nDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w\nZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA\nIgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B\nta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB\n/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf\nBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM\nBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta\n3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE\nBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD\nEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG\nEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT\nDElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r\nVygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1\n3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K\nb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN\nAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ\n4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf\n1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu\nhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH\nusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r\nOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G\nA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY\n9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\nubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV\n0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt\nhDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw\nTdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx\ne5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA\nJzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD\nYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n\nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ\nm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT\nAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw\nMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD\nTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\nggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf\nqQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr\nbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL\nj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou\n08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw\nWsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT\ntOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ\n47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC\nll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa\ni0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE\nFPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o\ndHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD\nnFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s\nD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ\nj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT\nQfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW\n+YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7\nIxjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d\n8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm\n5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG\nrp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD\nVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1\nMDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv\nbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH\nFzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ\ngLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t\ndHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce\nVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB\n/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3\nDQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM\nCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy\n8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa\n2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2\nxJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD\nVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1\nMDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv\nbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\nggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4\nkHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp\nN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9\nAElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd\nfLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx\nkv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS\nbtqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0\nQ5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN\nc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+\n3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw\nDPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA\nA7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY\n+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE\nYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW\nxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ\ngj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW\naQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV\nYh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3\nKadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi\nJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG\nEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy\nNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ\nMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB\nf8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr\nZt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43\nrDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc\neGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG\nEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy\nNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ\nMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN\n/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri\n83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\nHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA\nMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1\nAE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG\nA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh\nbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW\nMBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC\nAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm\nKb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2\nxjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC\nwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm\n1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm\nFRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF\nwpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/\na4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U\nubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ\nMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB\n/zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5\nLmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT\n+Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ\nFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN\nH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW\n7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu\nZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA\nVWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR\nTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt\n/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc\n7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I\niyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "配套插件/BsCore/modules/bs-emoji/bs-emoji.css",
    "content": "#face {\r\n    position: absolute;\r\n  transform:translate(10px,-60px);\r\n   \r\n}\r\n#facecross { \r\n\r\n  transform:translate(10px,-60px);\r\n\r\n}\r\n#emotions{\r\nz-index:94361;\r\n\tfont-size:12px;\r\n\tbackground:#fff;\r\n        width:auto;\r\nmax-width:500px;\r\n\tborder: 1px solid #E8E8E8;\r\nborder-radius:10px;\r\n}\r\n#emotions a{\r\n\tcolor: #000000;\r\n\tpadding:2px 7px;\r\n\ttext-decoration:none;\r\n}\r\n#emotions img{\r\n\tborder:0;\r\n}\r\n#emotions div{\r\n\tmargin:5px 10px;\r\n\tpadding:1px;\r\n\toverflow: hidden;\r\n\t\r\n}\r\n#emotions #prev,\r\n#emotions #next\r\n{\r\n\tmargin-left:3px;\r\n\tbackground:#eee;\r\n}\r\n#emotions .categorys{\r\n\tcolor:#ccc;\r\n\theight:43px;\r\n\tcolor: #9ABBC8;\r\n\r\n\toverflow:hidden;\r\n\tborder-radius:10px;\r\n}\r\n#emotions .categorys a{\r\n\tdisplay: inline-block;\r\n}\r\n#emotions .categorys a.current{\r\n\tcursor: default;\r\n\tbackground: #F0F0F0;\r\n\t-moz-border-radius: 3px;\r\n\t-webkit-border-radius: 3px;\r\n\tborder-radius:10px;\r\n}\r\n#emotions .container{\r\n\tpadding:1px;\r\n\toverflow: auto;\r\n\t\r\n}\r\n#emotions .container a{\r\n\tfloat:left;\r\n\twidth:50px;\r\n\theight:30px;\r\n\ttext-align:center;\r\n\tpadding: 4px 2px;\r\n\tmargin: -1px 0 0 -1px;\r\n\tborder: 1px solid #e8e8e8;\r\n}\r\n#emotions .container a:hover{\r\n\tz-index:2;\r\n\tposition:relative;\r\n\tborder:1px solid #0095cd;\r\n}\r\n#emotions .page{\r\n\ttext-align:right;\r\n}\r\n#emotions .page a.current{\r\n\tcolor: #666;\r\n\tbackground-color:#fff;\r\n}\r\n#emotions .page a{\r\n\tmargin-left:3px;\r\n\tcolor: #0078B6;\r\n\tbackground-color:#f3f3f3;\r\n\tborder-radius:10px;\r\n}\r\n#emotions .page a:hover{\r\n\tbackground-color:#e7e7e7;\r\n}"
  },
  {
    "path": "配套插件/BsCore/modules/bs-emoji/bs-emoji.js",
    "content": "/*\n*\n* Emoji\n*\n*/\nfunction Hashtable() {\n    this._hash = new Object();\n    this.put = function(key, value) {\n        if (typeof (key) != \"undefined\") {\n            if (this.containsKey(key) == false) {\n                this._hash[key] = typeof (value) == \"undefined\" ? null : value;\n                return true;\n            } else {\n                return false;\n            }\n        } else {\n            return false;\n        }\n    }\n    this.remove = function(key) { delete this._hash[key]; }\n    this.size = function() { var i = 0; for (var k in this._hash) { i++; } return i; }\n    this.get = function(key) { return this._hash[key]; }\n    this.containsKey = function(key) { return typeof (this._hash[key]) != \"undefined\"; }\n    this.clear = function() { for (var k in this._hash) { delete this._hash[k]; } }\n}\n\nvar emotions = new Array();\nvar categorys = new Array();// 分组\nvar uBsEmotionsHt = new Hashtable();\n\n// 初始化缓存，页面仅仅加载一次就可以了\n$(function() {\n\t$.ajax( {\n\t\tdataType : 'json',\n\t\turl : '/index.php/bearEmoji',\n\t\tsuccess : function(response) {\n\t\t\tvar data = response;\n\t\t\tfor ( var i in data) {\n\t\t\t\tif (data[i].category == '') {\n\t\t\t\t\tdata[i].category = 'OwO颜文字';\n\t\t\t\t}\n\t\t\t\tif (emotions[data[i].category] == undefined) {\n\t\t\t\t\temotions[data[i].category] = new Array();\n\t\t\t\t\tcategorys.push(data[i].category);\n\t\t\t\t}\n\t\t\t\temotions[data[i].category].push( {\n\t\t\t\t\tname : data[i].data,\n\t\t\t\t\ticon : data[i].icon,\n\t\t\t\t\ttext : data[i].text\n\t\t\t\t});\n\t\t\t\tuBsEmotionsHt.put(data[i].data, data[i].icon, data[i].text);\n\t\t\t}\n\t\t}\n\t});\n});\n\n//替换\nfunction AnalyticEmotion(s) {\n\tif(typeof (s) != \"undefined\") {\n\t\tvar sArr = s.match(/\\[.*?\\]/g);\n\t\tfor(var i = 0; i < sArr.length; i++){\n\t\t\tif(uBsEmotionsHt.containsKey(sArr[i])) {\n\t\t\t\tvar reStr = \"<img  src=\\\"\" + uBsEmotionsHt.get(sArr[i]) + \"\\\" height=\\\"22\\\" width=\\\"22\\\" />\";\n\t\t\t\ts = s.replace(sArr[i], reStr);\n\t\t\t}\n\t\t}\n\t}\n\treturn s;\n}\n\n(function($){\n\t$.fn.BearsimpleEmoji = function(target){\n\t\tvar cat_current;\n\t\tvar cat_page;\n\t\t$(this).click(function(event){\n\t\t\tevent.stopPropagation();\n\t\t\t\n\t\t\tvar eTop = target.offset().top + target.height() + 15;\n\t\t\tvar eLeft = target.offset().left - 1;\n\t\t\t\n\t\t\tif($('#emotions .categorys')[0]){\n\t\t\t\t$('#emotions').css({top: eTop, left: eLeft});\n\t\t\t\t$('#emotions').toggle();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t$('#emoemo').append('<div id=\"emotions\"></div>');\n\t\t\t$('#emotions').css({top: eTop, left: eLeft});\n\t\t\t$('#emotions').html('<div>正在加载，请稍候...</div>');\n\t\t\t$('#emotions').click(function(event){\n\t\t\t\tevent.stopPropagation();\n\t\t\t});\n\t\t\t\n\t\t\t$('#emotions').html('<div style=\"float:right;\"><a href=\"javascript:void(0);\" id=\"prev\">&laquo;</a><a href=\"javascript:void(0);\" id=\"next\">&raquo;</a></div><div class=\"categorys\"></div><div class=\"container\"></div><div class=\"page\"></div>');\n\t\t\t$('#emotions #prev').click(function(){\n\t\t\t\tshowCategorys(cat_page - 1);\n\t\t\t});\n\t\t\t$('#emotions #next').click(function(){\n\t\t\t\tshowCategorys(cat_page + 1);\n\t\t\t});\n\t\t\tshowCategorys();\n\t\t\tshowEmotions();\n\t\t\t\n\t\t});\n\t\t$('body').click(function(){\n\t\t\t$('#emotions').fadeOut();\n\t\t});\n\t\t\n\t\tfunction showCategorys(){\n\t\t    \n\t\t\tvar page = arguments[0]?arguments[0]:0;\n\t\t\tif(page < 0 || page >= categorys.length / 5){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t$('#emotions .categorys').html('');\n\t\t\tcat_page = page;\n\t\t\tfor(var i = page * 5; i < (page + 1) * 5 && i < categorys.length; ++i){\n\t\t\t\t$('#emotions .categorys').append($('<a href=\"javascript:void(0);\">' + categorys[i] + '</a>'));\n\t\t\t}\n\t\t\t$('#emotions .categorys a').click(function(){\n\t\t\t\tshowEmotions($(this).text());\n\t\t\t});\n\t\t\t$('#emotions .categorys a').each(function(){\n\t\t\t\tif($(this).text() == cat_current){\n\t\t\t\t\t$(this).addClass('current');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tfunction showEmotions(){\n\t\t\tvar category = arguments[0]?arguments[0]:'OwO颜文字';\n\t\t\tvar page = arguments[1]?arguments[1] - 1:0;\n\t\t\t$('#emotions .container').html('');\n\t\t\t$('#emotions .page').html('');\n\t\t\tcat_current = category;\n\t\t\tfor(var i = page * 72; i < (page + 1) * 72 && i < emotions[category].length; ++i){\n\t\t\t    if(cat_current == 'OwO颜文字'){\n\t\t\t   $('#emotions .container').append($('<a style=\"margin-left:5px;margin-bottom:5px;padding-bottom:2px;width:auto\" href=\"javascript:void(0);\" title=\"' + emotions[category][i].name + '\">' +emotions[category][i].name + ' </a>'));     \n\t\t\t    }\n\t\t\t    else{\n\t\t\t\t$('#emotions .container').append($('<a href=\"javascript:void(0);\" title=\"' + emotions[category][i].name + '\"><img src=\"' + emotions[category][i].icon + '\" alt=\"' + emotions[category][i].text + '\" width=\"22\" height=\"22\" /></a>'));\n\t\t\t    }\n\t\t\t}\n\t\t\t$('#emotions .container a').click(function(){\n\t\t\t\ttarget.insertText($(this).attr('title'));\n\t\t\t\t$('#emotions').remove();\n\t\t\t});\n\t\t\tfor(var i = 1; i < emotions[category].length / 72 + 1; ++i){\n\t\t\t\t$('#emotions .page').append($('<a href=\"javascript:void(0);\"' + (i == page + 1?' class=\"current\"':'') + '>' + i + '</a>'));\n\t\t\t}\n\t\t\t$('#emotions .page a').click(function(){\n\t\t\t\tshowEmotions(category, $(this).text());\n\t\t\t});\n\t\t\t$('#emotions .categorys a.current').removeClass('current');\n\t\t\t$('#emotions .categorys a').each(function(){\n\t\t\t\tif($(this).text() == category){\n\t\t\t\t\t$(this).addClass('current');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n})(jQuery);\n"
  },
  {
    "path": "配套插件/BsCore/modules/bs-emoji/bs-emoji.json",
    "content": "[{\r\n\t\t\"data\": \"OωO\",\r\n\t\t\"text\": \"owo\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"|´・ω・)ノ\",\r\n\t\t\"text\": \"Hi\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"ヾ(≧∇≦*)ゝ\",\r\n\t\t\"text\": \"开心\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(☆ω☆)\",\r\n\t\t\"text\": \"星星眼\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"（╯‵□′）╯︵┴─┴\",\r\n\t\t\"text\": \"掀桌\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"￣﹃￣\",\r\n\t\t\"text\": \"流口水\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(/ω＼)\",\r\n\t\t\"text\": \"捂脸\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"∠( ᐛ 」∠)＿\",\r\n\t\t\"text\": \"给跪\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(๑•̀ㅁ•́ฅ)\",\r\n\t\t\"text\": \"Hi\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"→_→\",\r\n\t\t\"text\": \"斜眼\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"୧(๑•̀⌄•́๑)૭\",\r\n\t\t\"text\": \"加油\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"٩(ˊᗜˋ*)و\",\r\n\t\t\"text\": \"有木有WiFi\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(ノ°ο°)ノ\",\r\n\t\t\"text\": \"前方高能预警\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(´இ皿இ｀)\",\r\n\t\t\"text\": \"我从未见过如此厚颜无耻之人\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"⌇●﹏●⌇\",\r\n\t\t\"text\": \"吓死宝宝惹\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(ฅ´ω`ฅ)\",\r\n\t\t\"text\": \"已阅留爪\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(╯°A°)╯︵○○○\",\r\n\t\t\"text\": \"去吧大师球\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"φ(￣∇￣o)\",\r\n\t\t\"text\": \"太萌惹\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"ヾ(´･ ･｀｡)ノ\",\r\n\t\t\"text\": \"咦咦咦\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃\",\r\n\t\t\"text\": \"气呼呼\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(ó﹏ò｡)\",\r\n\t\t\"text\": \"我受到了惊吓\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"Σ(っ °Д °;)っ\",\r\n\t\t\"text\": \"什么鬼\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"( ,,´･ω･)ﾉ\\\"(´っω･｀｡)\",\r\n\t\t\"text\": \"摸摸头\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"╮(╯▽╰)╭ \",\r\n\t\t\"text\": \"无奈\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"o(*////▽////*)q \",\r\n\t\t\"text\": \"脸红\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"＞﹏＜\",\r\n\t\t\"text\": \"\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"( ๑´•ω•) \\\"(ㆆᴗㆆ)\",\r\n\t\t\"text\": \"\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"data\": \"(｡•ˇ‸ˇ•｡)\",\r\n\t\t\"text\": \"(｡•ˇ‸ˇ•｡)\",\r\n\t\t\"category\": \"\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/ablobcatheart.png\",\r\n\t\t\"data\": \":[ablobcatheart]\",\r\n\t\t\"text\": \"ablobcatheart\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/ablobcatheartbroken.png\",\r\n\t\t\"data\": \":[ablobcatheartbroken]\",\r\n\t\t\"text\": \"ablobcatheartbroken\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatheart.png\",\r\n\t\t\"data\": \":[blobcatheart]\",\r\n\t\t\"text\": \"blobcatheart\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatheartpride.png\",\r\n\t\t\"data\": \":[blobcatheartpride]\",\r\n\t\t\"text\": \"blobcatheartpride\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatlove.png\",\r\n\t\t\"data\": \":[blobcatlove]\",\r\n\t\t\"text\": \"blobcatlove\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatkissheart.png\",\r\n\t\t\"data\": \":[blobcatkissheart]\",\r\n\t\t\"text\": \"blobcatkissheart\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatsnuggle.png\",\r\n\t\t\"data\": \":[blobcatsnuggle]\",\r\n\t\t\"text\": \"blobcatsnuggle\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/comfyuee.png\",\r\n\t\t\"data\": \":[comfyuee]\",\r\n\t\t\"text\": \"comfyuee\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/comfyslep.png\",\r\n\t\t\"data\": \":[comfyslep]\",\r\n\t\t\"text\": \"comfyslep\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/comfynight.png\",\r\n\t\t\"data\": \":[comfynight]\",\r\n\t\t\"text\": \"comfynight\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatcomfysweat.png\",\r\n\t\t\"data\": \":[blobcatcomfysweat]\",\r\n\t\t\"text\": \"blobcatcomfysweat\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatcomfy.png\",\r\n\t\t\"data\": \":[blobcatcomfy]\",\r\n\t\t\"text\": \"blobcatcomfy\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatcomftears.png\",\r\n\t\t\"data\": \":[blobcatcomftears]\",\r\n\t\t\"text\": \"blobcatcomftears\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatfacepalm.png\",\r\n\t\t\"data\": \":[blobcatfacepalm]\",\r\n\t\t\"text\": \"blobcatfacepalm\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcat0_0.png\",\r\n\t\t\"data\": \":[blobcat0_0]\",\r\n\t\t\"text\": \"blobcat0_0\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatangry.png\",\r\n\t\t\"data\": \":[blobcatangry]\",\r\n\t\t\"text\": \"blobcatangry\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobbanhammerr.png\",\r\n\t\t\"data\": \":[blobbanhammerr]\",\r\n\t\t\"text\": \"blobbanhammerr\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatt.png\",\r\n\t\t\"data\": \":[blobcatt]\",\r\n\t\t\"text\": \"blobcatt\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatblush.png\",\r\n\t\t\"data\": \":[blobcatblush]\",\r\n\t\t\"text\": \"blobcatblush\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatcoffee.png\",\r\n\t\t\"data\": \":[blobcatcoffee]\",\r\n\t\t\"text\": \"blobcatcoffee\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatcry.png\",\r\n\t\t\"data\": \":[blobcatcry]\",\r\n\t\t\"text\": \"blobcatcry\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatdead.png\",\r\n\t\t\"data\": \":[blobcatdead]\",\r\n\t\t\"text\": \"blobcatdead\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatdied.png\",\r\n\t\t\"data\": \":[blobcatdied]\",\r\n\t\t\"text\": \"blobcatdied\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatdisturbed.png\",\r\n\t\t\"data\": \":[blobcatdisturbed]\",\r\n\t\t\"text\": \"blobcatdisturbed\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatfearful.png\",\r\n\t\t\"data\": \":[blobcatfearful]\",\r\n\t\t\"text\": \"blobcatfearful\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatfingerguns.png\",\r\n\t\t\"data\": \":[blobcatfingerguns]\",\r\n\t\t\"text\": \"blobcatfingerguns\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatflip.png\",\r\n\t\t\"data\": \":[blobcatflip]\",\r\n\t\t\"text\": \"blobcatflip\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatflower.png\",\r\n\t\t\"data\": \":[blobcatflower]\",\r\n\t\t\"text\": \"blobcatflower\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatgay.png\",\r\n\t\t\"data\": \":[blobcatgay]\",\r\n\t\t\"text\": \"blobcatgay\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatgooglycry.png\",\r\n\t\t\"data\": \":[blobcatgooglycry]\",\r\n\t\t\"text\": \"blobcatgooglycry\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatneutral.png\",\r\n\t\t\"data\": \":[blobcatneutral]\",\r\n\t\t\"text\": \"blobcatneutral\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatopenmouth.png\",\r\n\t\t\"data\": \":[blobcatopenmouth]\",\r\n\t\t\"text\": \"blobcatopenmouth\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatsadreach.png\",\r\n\t\t\"data\": \":[blobcatsadreach]\",\r\n\t\t\"text\": \"blobcatsadreach\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatscared.png\",\r\n\t\t\"data\": \":[blobcatscared]\",\r\n\t\t\"text\": \"blobcatscared\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatnomblobcat.png\",\r\n\t\t\"data\": \":[blobcatnomblobcat]\",\r\n\t\t\"text\": \"blobcatnomblobcat\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatpresentred.png\",\r\n\t\t\"data\": \":[blobcatpresentred]\",\r\n\t\t\"text\": \"blobcatpresentred\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatread.png\",\r\n\t\t\"data\": \":[blobcatread]\",\r\n\t\t\"text\": \"blobcatread\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatsipsweat.png\",\r\n\t\t\"data\": \":[blobcatsipsweat]\",\r\n\t\t\"text\": \"blobcatsipsweat\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatsnapped.png\",\r\n\t\t\"data\": \":[blobcatsnapped]\",\r\n\t\t\"text\": \"blobcatsnapped\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatthink.png\",\r\n\t\t\"data\": \":[blobcatthink]\",\r\n\t\t\"text\": \"blobcatthink\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcattriumph.png\",\r\n\t\t\"data\": \":[blobcattriumph]\",\r\n\t\t\"text\": \"blobcattriumph\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatumm.png\",\r\n\t\t\"data\": \":[blobcatumm]\",\r\n\t\t\"text\": \"blobcatumm\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatverified.png\",\r\n\t\t\"data\": \":[blobcatverified]\",\r\n\t\t\"text\": \"blobcatverified\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatbox.png\",\r\n\t\t\"data\": \":[blobcatbox]\",\r\n\t\t\"text\": \"blobcatbox\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatcaged.png\",\r\n\t\t\"data\": \":[blobcatcaged]\",\r\n\t\t\"text\": \"blobcatcaged\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatgooglytrash.png\",\r\n\t\t\"data\": \":[blobcatgooglytrash]\",\r\n\t\t\"text\": \"blobcatgooglytrash\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatheadphones.png\",\r\n\t\t\"data\": \":[blobcatheadphones]\",\r\n\t\t\"text\": \"blobcatheadphones\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcathighfive.png\",\r\n\t\t\"data\": \":[blobcathighfive]\",\r\n\t\t\"text\": \"blobcathighfive\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatmelt.png\",\r\n\t\t\"data\": \":[blobcatmelt]\",\r\n\t\t\"text\": \"blobcatmelt\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatmeltthumb.png\",\r\n\t\t\"data\": \":[blobcatmeltthumb]\",\r\n\t\t\"text\": \"blobcatmeltthumb\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatnotlikethis.png\",\r\n\t\t\"data\": \":[blobcatnotlikethis]\",\r\n\t\t\"text\": \"blobcatnotlikethis\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatsaitama.png\",\r\n\t\t\"data\": \":[blobcatsaitama]\",\r\n\t\t\"text\": \"blobcatsaitama\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatyandere.png\",\r\n\t\t\"data\": \":[blobcatyandere]\",\r\n\t\t\"text\": \"blobcatyandere\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatpeek2.png\",\r\n\t\t\"data\": \":[blobcatpeek2]\",\r\n\t\t\"text\": \"blobcatpeek2\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatpeekaboo.png\",\r\n\t\t\"data\": \":[blobcatpeekaboo]\",\r\n\t\t\"text\": \"blobcatpeekaboo\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatphoto.png\",\r\n\t\t\"data\": \":[blobcatphoto]\",\r\n\t\t\"text\": \"blobcatphoto\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/ablobcatattentionreverse.png\",\r\n\t\t\"data\": \":[ablobcatattentionreverse]\",\r\n\t\t\"text\": \"ablobcatattentionreverse\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/ablobcatreachrev.png\",\r\n\t\t\"data\": \":[ablobcatreachrev]\",\r\n\t\t\"text\": \"ablobcatreachrev\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/ablobcatwave.png\",\r\n\t\t\"data\": \":[ablobcatwave]\",\r\n\t\t\"text\": \"ablobcatwave\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatalt.png\",\r\n\t\t\"data\": \":[blobcatalt]\",\r\n\t\t\"text\": \"blobcatalt\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatpolice.png\",\r\n\t\t\"data\": \":[blobcatpolice]\",\r\n\t\t\"text\": \"blobcatpolice\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/blobcatshocked.png\",\r\n\t\t\"data\": \":[blobcatshocked]\",\r\n\t\t\"text\": \"blobcatshocked\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/cat/ablobcatrainbow.png\",\r\n\t\t\"data\": \":[ablobcatrainbow]\",\r\n\t\t\"text\": \"ablobcatrainbow\",\r\n\t\t\"category\": \"Cat\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/3d眼镜.png\",\r\n\t\t\"data\": \":[3d眼镜]\",\r\n\t\t\"text\": \"3d眼镜\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/EDG.png\",\r\n\t\t\"data\": \":[EDG]\",\r\n\t\t\"text\": \"EDG\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/LPL.png\",\r\n\t\t\"data\": \":[LPL]\",\r\n\t\t\"text\": \"LPL\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/beluga.png\",\r\n\t\t\"data\": \":[beluga]\",\r\n\t\t\"text\": \"beluga\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/不好意思.png\",\r\n\t\t\"data\": \":[不好意思]\",\r\n\t\t\"text\": \"不好意思\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/不服吗.png\",\r\n\t\t\"data\": \":[不服吗]\",\r\n\t\t\"text\": \"不服吗\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/亲亲.png\",\r\n\t\t\"data\": \":[亲亲]\",\r\n\t\t\"text\": \"亲亲\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/伞兵.png\",\r\n\t\t\"data\": \":[伞兵]\",\r\n\t\t\"text\": \"伞兵\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/倚墙笑.png\",\r\n\t\t\"data\": \":[倚墙笑]\",\r\n\t\t\"text\": \"倚墙笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/值得肯定.png\",\r\n\t\t\"data\": \":[值得肯定]\",\r\n\t\t\"text\": \"值得肯定\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/偷偷看.png\",\r\n\t\t\"data\": \":[偷偷看]\",\r\n\t\t\"text\": \"偷偷看\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/傻笑.png\",\r\n\t\t\"data\": \":[傻笑]\",\r\n\t\t\"text\": \"傻笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/再见.png\",\r\n\t\t\"data\": \":[再见]\",\r\n\t\t\"text\": \"再见\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/出家人.png\",\r\n\t\t\"data\": \":[出家人]\",\r\n\t\t\"text\": \"出家人\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/击剑.png\",\r\n\t\t\"data\": \":[击剑]\",\r\n\t\t\"text\": \"击剑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/加班.png\",\r\n\t\t\"data\": \":[加班]\",\r\n\t\t\"text\": \"加班\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/勉强笑.png\",\r\n\t\t\"data\": \":[勉强笑]\",\r\n\t\t\"text\": \"勉强笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/危险.png\",\r\n\t\t\"data\": \":[危险]\",\r\n\t\t\"text\": \"危险\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/发红包.png\",\r\n\t\t\"data\": \":[发红包]\",\r\n\t\t\"text\": \"发红包\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/吃手.png\",\r\n\t\t\"data\": \":[吃手]\",\r\n\t\t\"text\": \"吃手\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/吃瓜.png\",\r\n\t\t\"data\": \":[吃瓜]\",\r\n\t\t\"text\": \"吃瓜\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/吐血.png\",\r\n\t\t\"data\": \":[吐血]\",\r\n\t\t\"text\": \"吐血\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/吵架.png\",\r\n\t\t\"data\": \":[吵架]\",\r\n\t\t\"text\": \"吵架\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/呦吼.png\",\r\n\t\t\"data\": \":[呦吼]\",\r\n\t\t\"text\": \"呦吼\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/呲牙笑.png\",\r\n\t\t\"data\": \":[呲牙笑]\",\r\n\t\t\"text\": \"呲牙笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/哈士奇.png\",\r\n\t\t\"data\": \":[哈士奇]\",\r\n\t\t\"text\": \"哈士奇\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/哈士奇失去意识.png\",\r\n\t\t\"data\": \":[哈士奇失去意识]\",\r\n\t\t\"text\": \"哈士奇失去意识\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/哈士奇失望.png\",\r\n\t\t\"data\": \":[哈士奇失望]\",\r\n\t\t\"text\": \"哈士奇失望\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/哭泣.png\",\r\n\t\t\"data\": \":[哭泣]\",\r\n\t\t\"text\": \"哭泣\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/唱歌.png\",\r\n\t\t\"data\": \":[唱歌]\",\r\n\t\t\"text\": \"唱歌\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/喜欢.png\",\r\n\t\t\"data\": \":[喜欢]\",\r\n\t\t\"text\": \"喜欢\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/嘿哈.png\",\r\n\t\t\"data\": \":[嘿哈]\",\r\n\t\t\"text\": \"嘿哈\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/大笑.png\",\r\n\t\t\"data\": \":[大笑]\",\r\n\t\t\"text\": \"大笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/失去信号.png\",\r\n\t\t\"data\": \":[失去信号]\",\r\n\t\t\"text\": \"失去信号\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/失望.png\",\r\n\t\t\"data\": \":[失望]\",\r\n\t\t\"text\": \"失望\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/头秃.png\",\r\n\t\t\"data\": \":[头秃]\",\r\n\t\t\"text\": \"头秃\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/奋斗.png\",\r\n\t\t\"data\": \":[奋斗]\",\r\n\t\t\"text\": \"奋斗\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/好奇.png\",\r\n\t\t\"data\": \":[好奇]\",\r\n\t\t\"text\": \"好奇\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/好的.png\",\r\n\t\t\"data\": \":[好的]\",\r\n\t\t\"text\": \"好的\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/害羞.png\",\r\n\t\t\"data\": \":[害羞]\",\r\n\t\t\"text\": \"害羞\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/小丑.png\",\r\n\t\t\"data\": \":[小丑]\",\r\n\t\t\"text\": \"小丑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/小偷.png\",\r\n\t\t\"data\": \":[小偷]\",\r\n\t\t\"text\": \"小偷\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/尬笑.png\",\r\n\t\t\"data\": \":[尬笑]\",\r\n\t\t\"text\": \"尬笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/尴尬.png\",\r\n\t\t\"data\": \":[尴尬]\",\r\n\t\t\"text\": \"尴尬\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/应援.png\",\r\n\t\t\"data\": \":[应援]\",\r\n\t\t\"text\": \"应援\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/开心.png\",\r\n\t\t\"data\": \":[开心]\",\r\n\t\t\"text\": \"开心\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/引起不适.png\",\r\n\t\t\"data\": \":[引起不适]\",\r\n\t\t\"text\": \"引起不适\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/微笑.png\",\r\n\t\t\"data\": \":[微笑]\",\r\n\t\t\"text\": \"微笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/思考.png\",\r\n\t\t\"data\": \":[思考]\",\r\n\t\t\"text\": \"思考\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/恶心.png\",\r\n\t\t\"data\": \":[恶心]\",\r\n\t\t\"text\": \"恶心\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/恶魔.png\",\r\n\t\t\"data\": \":[恶魔]\",\r\n\t\t\"text\": \"恶魔\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/恶魔恐惧.png\",\r\n\t\t\"data\": \":[恶魔恐惧]\",\r\n\t\t\"text\": \"恶魔恐惧\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/惊吓.png\",\r\n\t\t\"data\": \":[惊吓]\",\r\n\t\t\"text\": \"惊吓\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/惊吓白眼.png\",\r\n\t\t\"data\": \":[惊吓白眼]\",\r\n\t\t\"text\": \"惊吓白眼\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/惊讶.png\",\r\n\t\t\"data\": \":[惊讶]\",\r\n\t\t\"text\": \"惊讶\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/惬意.png\",\r\n\t\t\"data\": \":[惬意]\",\r\n\t\t\"text\": \"惬意\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/感动.png\",\r\n\t\t\"data\": \":[感动]\",\r\n\t\t\"text\": \"感动\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/愤怒.png\",\r\n\t\t\"data\": \":[愤怒]\",\r\n\t\t\"text\": \"愤怒\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/我看好你.png\",\r\n\t\t\"data\": \":[我看好你]\",\r\n\t\t\"text\": \"我看好你\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/手机相机.png\",\r\n\t\t\"data\": \":[手机相机]\",\r\n\t\t\"text\": \"手机相机\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/打咩.png\",\r\n\t\t\"data\": \":[打咩]\",\r\n\t\t\"text\": \"打咩\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/打牌.png\",\r\n\t\t\"data\": \":[打牌]\",\r\n\t\t\"text\": \"打牌\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/托腮.png\",\r\n\t\t\"data\": \":[托腮]\",\r\n\t\t\"text\": \"托腮\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/扶额.png\",\r\n\t\t\"data\": \":[扶额]\",\r\n\t\t\"text\": \"扶额\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/抠鼻.png\",\r\n\t\t\"data\": \":[抠鼻]\",\r\n\t\t\"text\": \"抠鼻\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/抬眼镜.png\",\r\n\t\t\"data\": \":[抬眼镜]\",\r\n\t\t\"text\": \"抬眼镜\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/拜托.png\",\r\n\t\t\"data\": \":[拜托]\",\r\n\t\t\"text\": \"拜托\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/捂嘴笑.png\",\r\n\t\t\"data\": \":[捂嘴笑]\",\r\n\t\t\"text\": \"捂嘴笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/捂脸.png\",\r\n\t\t\"data\": \":[捂脸]\",\r\n\t\t\"text\": \"捂脸\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/擦汗.png\",\r\n\t\t\"data\": \":[擦汗]\",\r\n\t\t\"text\": \"擦汗\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/放鞭炮.png\",\r\n\t\t\"data\": \":[放鞭炮]\",\r\n\t\t\"text\": \"放鞭炮\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/敬礼.png\",\r\n\t\t\"data\": \":[敬礼]\",\r\n\t\t\"text\": \"敬礼\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/整理发型.png\",\r\n\t\t\"data\": \":[整理发型]\",\r\n\t\t\"text\": \"整理发型\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/斗鸡眼.png\",\r\n\t\t\"data\": \":[斗鸡眼]\",\r\n\t\t\"text\": \"斗鸡眼\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/智慧的眼神.png\",\r\n\t\t\"data\": \":[智慧的眼神]\",\r\n\t\t\"text\": \"智慧的眼神\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/月饼.png\",\r\n\t\t\"data\": \":[月饼]\",\r\n\t\t\"text\": \"月饼\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/有没有搞错.png\",\r\n\t\t\"data\": \":[有没有搞错]\",\r\n\t\t\"text\": \"有没有搞错\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/正确.png\",\r\n\t\t\"data\": \":[正确]\",\r\n\t\t\"text\": \"正确\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/没招.png\",\r\n\t\t\"data\": \":[没招]\",\r\n\t\t\"text\": \"没招\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/波吉.png\",\r\n\t\t\"data\": \":[波吉]\",\r\n\t\t\"text\": \"波吉\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/泪奔.png\",\r\n\t\t\"data\": \":[泪奔]\",\r\n\t\t\"text\": \"泪奔\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/流汗微笑.png\",\r\n\t\t\"data\": \":[流汗微笑]\",\r\n\t\t\"text\": \"流汗微笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/流鼻涕.png\",\r\n\t\t\"data\": \":[流鼻涕]\",\r\n\t\t\"text\": \"流鼻涕\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/深思.png\",\r\n\t\t\"data\": \":[深思]\",\r\n\t\t\"text\": \"深思\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/滑稽.png\",\r\n\t\t\"data\": \":[滑稽]\",\r\n\t\t\"text\": \"滑稽\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/滑稽吃瓜.png\",\r\n\t\t\"data\": \":[滑稽吃瓜]\",\r\n\t\t\"text\": \"滑稽吃瓜\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/滑稽喝水.png\",\r\n\t\t\"data\": \":[滑稽喝水]\",\r\n\t\t\"text\": \"滑稽喝水\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/滑稽奶茶.png\",\r\n\t\t\"data\": \":[滑稽奶茶]\",\r\n\t\t\"text\": \"滑稽奶茶\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/滑稽柠檬.png\",\r\n\t\t\"data\": \":[滑稽柠檬]\",\r\n\t\t\"text\": \"滑稽柠檬\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/滑稽狂汗.png\",\r\n\t\t\"data\": \":[滑稽狂汗]\",\r\n\t\t\"text\": \"滑稽狂汗\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/滑稽被子.png\",\r\n\t\t\"data\": \":[滑稽被子]\",\r\n\t\t\"text\": \"滑稽被子\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/烦恼.png\",\r\n\t\t\"data\": \":[烦恼]\",\r\n\t\t\"text\": \"烦恼\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/熊熊.png\",\r\n\t\t\"data\": \":[熊熊]\",\r\n\t\t\"text\": \"熊熊\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/熊猫.png\",\r\n\t\t\"data\": \":[熊猫]\",\r\n\t\t\"text\": \"熊猫\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/熊猫唱歌.png\",\r\n\t\t\"data\": \":[熊猫唱歌]\",\r\n\t\t\"text\": \"熊猫唱歌\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/熊猫喜欢.png\",\r\n\t\t\"data\": \":[熊猫喜欢]\",\r\n\t\t\"text\": \"熊猫喜欢\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/熊猫失望.png\",\r\n\t\t\"data\": \":[熊猫失望]\",\r\n\t\t\"text\": \"熊猫失望\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/熊猫意外.png\",\r\n\t\t\"data\": \":[熊猫意外]\",\r\n\t\t\"text\": \"熊猫意外\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/熬夜.png\",\r\n\t\t\"data\": \":[熬夜]\",\r\n\t\t\"text\": \"熬夜\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/爆炸.png\",\r\n\t\t\"data\": \":[爆炸]\",\r\n\t\t\"text\": \"爆炸\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/牛年进宝.png\",\r\n\t\t\"data\": \":[牛年进宝]\",\r\n\t\t\"text\": \"牛年进宝\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/狂热.png\",\r\n\t\t\"data\": \":[狂热]\",\r\n\t\t\"text\": \"狂热\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/狗头.png\",\r\n\t\t\"data\": \":[狗头]\",\r\n\t\t\"text\": \"狗头\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/狗头围脖.png\",\r\n\t\t\"data\": \":[狗头围脖]\",\r\n\t\t\"text\": \"狗头围脖\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/狗头失望.png\",\r\n\t\t\"data\": \":[狗头失望]\",\r\n\t\t\"text\": \"狗头失望\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/狗头意外.png\",\r\n\t\t\"data\": \":[狗头意外]\",\r\n\t\t\"text\": \"狗头意外\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/狗头胖次.png\",\r\n\t\t\"data\": \":[狗头胖次]\",\r\n\t\t\"text\": \"狗头胖次\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/狗头花.png\",\r\n\t\t\"data\": \":[狗头花]\",\r\n\t\t\"text\": \"狗头花\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/狗头草.png\",\r\n\t\t\"data\": \":[狗头草]\",\r\n\t\t\"text\": \"狗头草\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/猪头.png\",\r\n\t\t\"data\": \":[猪头]\",\r\n\t\t\"text\": \"猪头\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/猪头意外.png\",\r\n\t\t\"data\": \":[猪头意外]\",\r\n\t\t\"text\": \"猪头意外\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/生病.png\",\r\n\t\t\"data\": \":[生病]\",\r\n\t\t\"text\": \"生病\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/电话.png\",\r\n\t\t\"data\": \":[电话]\",\r\n\t\t\"text\": \"电话\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/疑问.png\",\r\n\t\t\"data\": \":[疑问]\",\r\n\t\t\"text\": \"疑问\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/疼痛.png\",\r\n\t\t\"data\": \":[疼痛]\",\r\n\t\t\"text\": \"疼痛\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/痛哭.png\",\r\n\t\t\"data\": \":[痛哭]\",\r\n\t\t\"text\": \"痛哭\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/看穿一切.png\",\r\n\t\t\"data\": \":[看穿一切]\",\r\n\t\t\"text\": \"看穿一切\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/眩晕.png\",\r\n\t\t\"data\": \":[眩晕]\",\r\n\t\t\"text\": \"眩晕\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/睡觉.png\",\r\n\t\t\"data\": \":[睡觉]\",\r\n\t\t\"text\": \"睡觉\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/禁言.png\",\r\n\t\t\"data\": \":[禁言]\",\r\n\t\t\"text\": \"禁言\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/笑哭.png\",\r\n\t\t\"data\": \":[笑哭]\",\r\n\t\t\"text\": \"笑哭\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/纠结.png\",\r\n\t\t\"data\": \":[纠结]\",\r\n\t\t\"text\": \"纠结\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/绿帽.png\",\r\n\t\t\"data\": \":[绿帽]\",\r\n\t\t\"text\": \"绿帽\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/缺牙笑.png\",\r\n\t\t\"data\": \":[缺牙笑]\",\r\n\t\t\"text\": \"缺牙笑\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/翻白眼.png\",\r\n\t\t\"data\": \":[翻白眼]\",\r\n\t\t\"text\": \"翻白眼\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/老虎意外.png\",\r\n\t\t\"data\": \":[老虎意外]\",\r\n\t\t\"text\": \"老虎意外\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/耍酷.png\",\r\n\t\t\"data\": \":[耍酷]\",\r\n\t\t\"text\": \"耍酷\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/胡子.png\",\r\n\t\t\"data\": \":[胡子]\",\r\n\t\t\"text\": \"胡子\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/菜狗.png\",\r\n\t\t\"data\": \":[菜狗]\",\r\n\t\t\"text\": \"菜狗\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/菜狗花.png\",\r\n\t\t\"data\": \":[菜狗花]\",\r\n\t\t\"text\": \"菜狗花\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/蒙面滑稽.png\",\r\n\t\t\"data\": \":[蒙面滑稽]\",\r\n\t\t\"text\": \"蒙面滑稽\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/虎年进宝.png\",\r\n\t\t\"data\": \":[虎年进宝]\",\r\n\t\t\"text\": \"虎年进宝\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/被打.png\",\r\n\t\t\"data\": \":[被打]\",\r\n\t\t\"text\": \"被打\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/裂开.png\",\r\n\t\t\"data\": \":[裂开]\",\r\n\t\t\"text\": \"裂开\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/警告.png\",\r\n\t\t\"data\": \":[警告]\",\r\n\t\t\"text\": \"警告\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/读书.png\",\r\n\t\t\"data\": \":[读书]\",\r\n\t\t\"text\": \"读书\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/财神红包.png\",\r\n\t\t\"data\": \":[财神红包]\",\r\n\t\t\"text\": \"财神红包\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/超爱.png\",\r\n\t\t\"data\": \":[超爱]\",\r\n\t\t\"text\": \"超爱\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/这是啥.png\",\r\n\t\t\"data\": \":[这是啥]\",\r\n\t\t\"text\": \"这是啥\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/送福.png\",\r\n\t\t\"data\": \":[送福]\",\r\n\t\t\"text\": \"送福\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/送花.png\",\r\n\t\t\"data\": \":[送花]\",\r\n\t\t\"text\": \"送花\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/错误.png\",\r\n\t\t\"data\": \":[错误]\",\r\n\t\t\"text\": \"错误\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/阴险.png\",\r\n\t\t\"data\": \":[阴险]\",\r\n\t\t\"text\": \"阴险\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/难以置信.png\",\r\n\t\t\"data\": \":[难以置信]\",\r\n\t\t\"text\": \"难以置信\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/面具.png\",\r\n\t\t\"data\": \":[面具]\",\r\n\t\t\"text\": \"面具\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/饥渴.png\",\r\n\t\t\"data\": \":[饥渴]\",\r\n\t\t\"text\": \"饥渴\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/鬼脸.png\",\r\n\t\t\"data\": \":[鬼脸]\",\r\n\t\t\"text\": \"鬼脸\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/黑线.png\",\r\n\t\t\"data\": \":[黑线]\",\r\n\t\t\"text\": \"黑线\",\r\n\t\t\"category\": \"Heo\"\r\n\t},{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/heo/鼓掌.png\",\r\n\t\t\"data\": \":[鼓掌]\",\r\n\t\t\"text\": \"鼓掌\",\r\n\t\t\"category\": \"Heo\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/微笑.gif\",\r\n\t\t\"data\": \":^(微笑)\",\r\n\t\t\"text\": \"微笑\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/撇嘴.gif\",\r\n\t\t\"data\": \":^(撇嘴)\",\r\n\t\t\"text\": \"撇嘴\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/色.gif\",\r\n\t\t\"data\": \":^(色)\",\r\n\t\t\"text\": \"色\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/发呆.gif\",\r\n\t\t\"data\": \":^(发呆)\",\r\n\t\t\"text\": \"发呆\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/得意.gif\",\r\n\t\t\"data\": \":^(得意)\",\r\n\t\t\"text\": \"得意\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/流泪.gif\",\r\n\t\t\"data\": \":^(流泪)\",\r\n\t\t\"text\": \"流泪\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/害羞.gif\",\r\n\t\t\"data\": \":^(害羞)\",\r\n\t\t\"text\": \"害羞\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/闭嘴.gif\",\r\n\t\t\"data\": \":^(闭嘴)\",\r\n\t\t\"text\": \"闭嘴\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/睡.gif\",\r\n\t\t\"data\": \":^(睡)\",\r\n\t\t\"text\": \"睡\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/大哭.gif\",\r\n\t\t\"data\": \":^(大哭)\",\r\n\t\t\"text\": \"大哭\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/尴尬.gif\",\r\n\t\t\"data\": \":^(尴尬)\",\r\n\t\t\"text\": \"尴尬\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/呲牙.gif\",\r\n\t\t\"data\": \":^(呲牙)\",\r\n\t\t\"text\": \"呲牙\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/发怒.gif\",\r\n\t\t\"data\": \":^(发怒)\",\r\n\t\t\"text\": \"发怒\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/调皮.gif\",\r\n\t\t\"data\": \":^(调皮)\",\r\n\t\t\"text\": \"调皮\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/惊讶.gif\",\r\n\t\t\"data\": \":^(惊讶)\",\r\n\t\t\"text\": \"惊讶\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/难过.gif\",\r\n\t\t\"data\": \":^(难过)\",\r\n\t\t\"text\": \"难过\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/酷.gif\",\r\n\t\t\"data\": \":^(酷)\",\r\n\t\t\"text\": \"酷\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/冷汗.gif\",\r\n\t\t\"data\": \":^(冷汗)\",\r\n\t\t\"text\": \"冷汗\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/抓狂.gif\",\r\n\t\t\"data\": \":^(抓狂)\",\r\n\t\t\"text\": \"抓狂\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/吐.gif\",\r\n\t\t\"data\": \":^(吐)\",\r\n\t\t\"text\": \"吐\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/偷笑.gif\",\r\n\t\t\"data\": \":^(偷笑)\",\r\n\t\t\"text\": \"偷笑\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/可爱.gif\",\r\n\t\t\"data\": \":^(可爱)\",\r\n\t\t\"text\": \"可爱\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/白眼.gif\",\r\n\t\t\"data\": \":^(白眼)\",\r\n\t\t\"text\": \"白眼\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/傲慢.gif\",\r\n\t\t\"data\": \":^(傲慢)\",\r\n\t\t\"text\": \"傲慢\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/饥饿.gif\",\r\n\t\t\"data\": \":^(饥饿)\",\r\n\t\t\"text\": \"饥饿\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/困.gif\",\r\n\t\t\"data\": \":^(困)\",\r\n\t\t\"text\": \"困\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/惊恐.gif\",\r\n\t\t\"data\": \":^(惊恐)\",\r\n\t\t\"text\": \"惊恐\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/流汗.gif\",\r\n\t\t\"data\": \":^(流汗)\",\r\n\t\t\"text\": \"流汗\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/憨笑.gif\",\r\n\t\t\"data\": \":^(憨笑)\",\r\n\t\t\"text\": \"憨笑\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/大兵.gif\",\r\n\t\t\"data\": \":^(大兵)\",\r\n\t\t\"text\": \"大兵\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/奋斗.gif\",\r\n\t\t\"data\": \":^(奋斗)\",\r\n\t\t\"text\": \"奋斗\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/咒骂.gif\",\r\n\t\t\"data\": \":^(咒骂)\",\r\n\t\t\"text\": \"咒骂\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/疑问.gif\",\r\n\t\t\"data\": \":^(疑问)\",\r\n\t\t\"text\": \"疑问\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/嘘.gif\",\r\n\t\t\"data\": \":^(嘘)\",\r\n\t\t\"text\": \"嘘\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/晕.gif\",\r\n\t\t\"data\": \":^(晕)\",\r\n\t\t\"text\": \"晕\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/折磨.gif\",\r\n\t\t\"data\": \":^(折磨)\",\r\n\t\t\"text\": \"折磨\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/衰.gif\",\r\n\t\t\"data\": \":^(衰)\",\r\n\t\t\"text\": \"衰\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/骷髅.gif\",\r\n\t\t\"data\": \":^(骷髅)\",\r\n\t\t\"text\": \"骷髅\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/敲打.gif\",\r\n\t\t\"data\": \":^(敲打)\",\r\n\t\t\"text\": \"敲打\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/再见.gif\",\r\n\t\t\"data\": \":^(再见)\",\r\n\t\t\"text\": \"再见\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/擦汗.gif\",\r\n\t\t\"data\": \":^(擦汗)\",\r\n\t\t\"text\": \"擦汗\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/抠鼻.gif\",\r\n\t\t\"data\": \":^(抠鼻)\",\r\n\t\t\"text\": \"抠鼻\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/鼓掌.gif\",\r\n\t\t\"data\": \":^(鼓掌)\",\r\n\t\t\"text\": \"鼓掌\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/嗅大了.gif\",\r\n\t\t\"data\": \":^(嗅大了)\",\r\n\t\t\"text\": \"嗅大了\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/坏笑.gif\",\r\n\t\t\"data\": \":^(坏笑)\",\r\n\t\t\"text\": \"坏笑\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/左哼哼.gif\",\r\n\t\t\"data\": \":^(左哼哼)\",\r\n\t\t\"text\": \"左哼哼\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/右哼哼.gif\",\r\n\t\t\"data\": \":^(右哼哼)\",\r\n\t\t\"text\": \"右哼哼\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/哈欠.gif\",\r\n\t\t\"data\": \":^(哈欠)\",\r\n\t\t\"text\": \"哈欠\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/鄙视.gif\",\r\n\t\t\"data\": \":^(鄙视)\",\r\n\t\t\"text\": \"鄙视\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/委屈.gif\",\r\n\t\t\"data\": \":^(委屈)\",\r\n\t\t\"text\": \"委屈\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/可怜.gif\",\r\n\t\t\"data\": \":^(可怜)\",\r\n\t\t\"text\": \"可怜\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/阴险.gif\",\r\n\t\t\"data\": \":^(阴险)\",\r\n\t\t\"text\": \"阴险\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/亲亲.gif\",\r\n\t\t\"data\": \":^(亲亲)\",\r\n\t\t\"text\": \"亲亲\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/吓.gif\",\r\n\t\t\"data\": \":^(吓)\",\r\n\t\t\"text\": \"吓\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/快哭了.gif\",\r\n\t\t\"data\": \":^(快哭了)\",\r\n\t\t\"text\": \"快哭了\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/菜刀.gif\",\r\n\t\t\"data\": \":^(菜刀)\",\r\n\t\t\"text\": \"菜刀\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/西瓜.gif\",\r\n\t\t\"data\": \":^(西瓜)\",\r\n\t\t\"text\": \"西瓜\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/啤酒.gif\",\r\n\t\t\"data\": \":^(啤酒)\",\r\n\t\t\"text\": \"啤酒\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/篮球.gif\",\r\n\t\t\"data\": \":^(篮球)\",\r\n\t\t\"text\": \"篮球\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/乒乓.gif\",\r\n\t\t\"data\": \":^(乒乓)\",\r\n\t\t\"text\": \"乒乓\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/咖啡.gif\",\r\n\t\t\"data\": \":^(咖啡)\",\r\n\t\t\"text\": \"咖啡\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/饭.gif\",\r\n\t\t\"data\": \":^(饭)\",\r\n\t\t\"text\": \"饭\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/猪头.gif\",\r\n\t\t\"data\": \":^(猪头)\",\r\n\t\t\"text\": \"猪头\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/玫瑰.gif\",\r\n\t\t\"data\": \":^(玫瑰)\",\r\n\t\t\"text\": \"玫瑰\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/凋谢.gif\",\r\n\t\t\"data\": \":^(凋谢)\",\r\n\t\t\"text\": \"凋谢\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/心.gif\",\r\n\t\t\"data\": \":^(心)\",\r\n\t\t\"text\": \"心\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/心碎.gif\",\r\n\t\t\"data\": \":^(心碎)\",\r\n\t\t\"text\": \"心碎\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/蛋糕.gif\",\r\n\t\t\"data\": \":^(蛋糕)\",\r\n\t\t\"text\": \"蛋糕\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/炸弹.gif\",\r\n\t\t\"data\": \":^(炸弹)\",\r\n\t\t\"text\": \"炸弹\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/刀.gif\",\r\n\t\t\"data\": \":^(刀)\",\r\n\t\t\"text\": \"刀\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/足球.gif\",\r\n\t\t\"data\": \":^(足球)\",\r\n\t\t\"text\": \"足球\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/瓢虫.gif\",\r\n\t\t\"data\": \":^(瓢虫)\",\r\n\t\t\"text\": \"瓢虫\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/便便.gif\",\r\n\t\t\"data\": \":^(便便)\",\r\n\t\t\"text\": \"便便\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/夜晚.gif\",\r\n\t\t\"data\": \":^(夜晚)\",\r\n\t\t\"text\": \"夜晚\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/太阳.gif\",\r\n\t\t\"data\": \":^(太阳)\",\r\n\t\t\"text\": \"太阳\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/礼物.gif\",\r\n\t\t\"data\": \":^(礼物)\",\r\n\t\t\"text\": \"礼物\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/拥抱.gif\",\r\n\t\t\"data\": \":^(拥抱)\",\r\n\t\t\"text\": \"拥抱\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/强.gif\",\r\n\t\t\"data\": \":^(强)\",\r\n\t\t\"text\": \"强\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/弱.gif\",\r\n\t\t\"data\": \":^(弱)\",\r\n\t\t\"text\": \"弱\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/握手.gif\",\r\n\t\t\"data\": \":^(握手)\",\r\n\t\t\"text\": \"握手\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/胜利.gif\",\r\n\t\t\"data\": \":^(胜利)\",\r\n\t\t\"text\": \"胜利\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/抱拳.gif\",\r\n\t\t\"data\": \":^(抱拳)\",\r\n\t\t\"text\": \"抱拳\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/勾引.gif\",\r\n\t\t\"data\": \":^(勾引)\",\r\n\t\t\"text\": \"勾引\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/拳头.gif\",\r\n\t\t\"data\": \":^(拳头)\",\r\n\t\t\"text\": \"拳头\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/差劲.gif\",\r\n\t\t\"data\": \":^(差劲)\",\r\n\t\t\"text\": \"差劲\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/爱你.gif\",\r\n\t\t\"data\": \":^(爱你)\",\r\n\t\t\"text\": \"爱你\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/NO.gif\",\r\n\t\t\"data\": \":^(NO)\",\r\n\t\t\"text\": \"NO\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/OK.gif\",\r\n\t\t\"data\": \":^(OK)\",\r\n\t\t\"text\": \"OK\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/爱情.gif\",\r\n\t\t\"data\": \":^(爱情)\",\r\n\t\t\"text\": \"爱情\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/飞吻.gif\",\r\n\t\t\"data\": \":^(飞吻)\",\r\n\t\t\"text\": \"飞吻\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/发财.gif\",\r\n\t\t\"data\": \":^(发财)\",\r\n\t\t\"text\": \"发财\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/帅.gif\",\r\n\t\t\"data\": \":^(帅)\",\r\n\t\t\"text\": \"帅\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/雨伞.gif\",\r\n\t\t\"data\": \":^(雨伞)\",\r\n\t\t\"text\": \"雨伞\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/高铁左车头.gif\",\r\n\t\t\"data\": \":^(高铁左车头)\",\r\n\t\t\"text\": \"高铁左车头\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/车厢.gif\",\r\n\t\t\"data\": \":^(车厢)\",\r\n\t\t\"text\": \"车厢\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/高铁右车头.gif\",\r\n\t\t\"data\": \":^(高铁右车头)\",\r\n\t\t\"text\": \"高铁右车头\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/纸巾.gif\",\r\n\t\t\"data\": \":^(纸巾)\",\r\n\t\t\"text\": \"纸巾\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/右太极.gif\",\r\n\t\t\"data\": \":^(右太极)\",\r\n\t\t\"text\": \"右太极\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/左太极.gif\",\r\n\t\t\"data\": \":^(左太极)\",\r\n\t\t\"text\": \"左太极\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/献吻.gif\",\r\n\t\t\"data\": \":^(献吻)\",\r\n\t\t\"text\": \"献吻\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/街舞.gif\",\r\n\t\t\"data\": \":^(街舞)\",\r\n\t\t\"text\": \"街舞\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/激动.gif\",\r\n\t\t\"data\": \":^(激动)\",\r\n\t\t\"text\": \"激动\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/挥动.gif\",\r\n\t\t\"data\": \":^(挥动)\",\r\n\t\t\"text\": \"挥动\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/跳绳.gif\",\r\n\t\t\"data\": \":^(跳绳)\",\r\n\t\t\"text\": \"跳绳\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/回头.gif\",\r\n\t\t\"data\": \":^(回头)\",\r\n\t\t\"text\": \"回头\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/磕头.gif\",\r\n\t\t\"data\": \":^(磕头)\",\r\n\t\t\"text\": \"磕头\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/转圈.gif\",\r\n\t\t\"data\": \":^(转圈)\",\r\n\t\t\"text\": \"转圈\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/怄火.gif\",\r\n\t\t\"data\": \":^(怄火)\",\r\n\t\t\"text\": \"怄火\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/发抖.gif\",\r\n\t\t\"data\": \":^(发抖)\",\r\n\t\t\"text\": \"发抖\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/跳跳.gif\",\r\n\t\t\"data\": \":^(跳跳)\",\r\n\t\t\"text\": \"跳跳\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/爆筋.gif\",\r\n\t\t\"data\": \":^(爆筋)\",\r\n\t\t\"text\": \"爆筋\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/沙发.gif\",\r\n\t\t\"data\": \":^(沙发)\",\r\n\t\t\"text\": \"沙发\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/钱.gif\",\r\n\t\t\"data\": \":^(钱)\",\r\n\t\t\"text\": \"钱\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/蜡烛.gif\",\r\n\t\t\"data\": \":^(蜡烛)\",\r\n\t\t\"text\": \"蜡烛\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/枪.gif\",\r\n\t\t\"data\": \":^(枪)\",\r\n\t\t\"text\": \"枪\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/灯.gif\",\r\n\t\t\"data\": \":^(灯)\",\r\n\t\t\"text\": \"灯\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/香蕉.gif\",\r\n\t\t\"data\": \":^(香蕉)\",\r\n\t\t\"text\": \"香蕉\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/吻.gif\",\r\n\t\t\"data\": \":^(吻)\",\r\n\t\t\"text\": \"吻\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/下雨.gif\",\r\n\t\t\"data\": \":^(下雨)\",\r\n\t\t\"text\": \"下雨\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/闹钟.gif\",\r\n\t\t\"data\": \":^(闹钟)\",\r\n\t\t\"text\": \"闹钟\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/囍.gif\",\r\n\t\t\"data\": \":^(囍)\",\r\n\t\t\"text\": \"囍\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/棒棒糖.gif\",\r\n\t\t\"data\": \":^(棒棒糖)\",\r\n\t\t\"text\": \"棒棒糖\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/面条.gif\",\r\n\t\t\"data\": \":^(面条)\",\r\n\t\t\"text\": \"面条\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/车.gif\",\r\n\t\t\"data\": \":^(车)\",\r\n\t\t\"text\": \"车\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/邮件.gif\",\r\n\t\t\"data\": \":^(邮件)\",\r\n\t\t\"text\": \"邮件\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/风车.gif\",\r\n\t\t\"data\": \":^(风车)\",\r\n\t\t\"text\": \"风车\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/药丸.gif\",\r\n\t\t\"data\": \":^(药丸)\",\r\n\t\t\"text\": \"药丸\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/奶瓶.gif\",\r\n\t\t\"data\": \":^(奶瓶)\",\r\n\t\t\"text\": \"奶瓶\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/灯笼.gif\",\r\n\t\t\"data\": \":^(灯笼)\",\r\n\t\t\"text\": \"灯笼\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/青蛙.gif\",\r\n\t\t\"data\": \":^(青蛙)\",\r\n\t\t\"text\": \"青蛙\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/戒指.gif\",\r\n\t\t\"data\": \":^(戒指)\",\r\n\t\t\"text\": \"戒指\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/K歌.gif\",\r\n\t\t\"data\": \":^(K歌)\",\r\n\t\t\"text\": \"K歌\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/熊猫.gif\",\r\n\t\t\"data\": \":^(熊猫)\",\r\n\t\t\"text\": \"熊猫\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/喝彩.gif\",\r\n\t\t\"data\": \":^(喝彩)\",\r\n\t\t\"text\": \"喝彩\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/购物.gif\",\r\n\t\t\"data\": \":^(购物)\",\r\n\t\t\"text\": \"购物\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/多云.gif\",\r\n\t\t\"data\": \":^(多云)\",\r\n\t\t\"text\": \"多云\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/鞭炮.gif\",\r\n\t\t\"data\": \":^(鞭炮)\",\r\n\t\t\"text\": \"鞭炮\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/飞机.gif\",\r\n\t\t\"data\": \":^(飞机)\",\r\n\t\t\"text\": \"飞机\",\r\n\t\t\"category\": \"QQ\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/qq/气球.gif\",\r\n\t\t\"data\": \":^(气球)\",\r\n\t\t\"text\": \"气球\",\r\n\t\t\"category\": \"QQ\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/doge.png\",\r\n\t\t\"data\": \":)(doge)\",\r\n\t\t\"text\": \"doge\",\r\n\t\t\"category\": \"微博\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/miao.png\",\r\n\t\t\"data\": \":)(miao)\",\r\n\t\t\"text\": \"miao\",\r\n\t\t\"category\": \"微博\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog1.png\",\r\n\t\t\"data\": \":)(dog1)\",\r\n\t\t\"text\": \"dog1\",\r\n\t\t\"category\": \"微博\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/erha.png\",\r\n\t\t\"data\": \":)(erha)\",\r\n\t\t\"text\": \"erha\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog2.png\",\r\n\t\t\"data\": \":)(doge2)\",\r\n\t\t\"text\": \"doge2\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog3.png\",\r\n\t\t\"data\": \":)(doge3)\",\r\n\t\t\"text\": \"doge3\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog4.png\",\r\n\t\t\"data\": \":)(doge4)\",\r\n\t\t\"text\": \"doge4\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog5.png\",\r\n\t\t\"data\": \":)(doge5)\",\r\n\t\t\"text\": \"doge5\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog6.png\",\r\n\t\t\"data\": \":)(doge6)\",\r\n\t\t\"text\": \"doge6\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog7.png\",\r\n\t\t\"data\": \":)(doge7)\",\r\n\t\t\"text\": \"doge7\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog8.png\",\r\n\t\t\"data\": \":)(doge8)\",\r\n\t\t\"text\": \"doge8\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog9.png\",\r\n\t\t\"data\": \":)(doge9)\",\r\n\t\t\"text\": \"doge9\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog10.png\",\r\n\t\t\"data\": \":)(doge10)\",\r\n\t\t\"text\": \"doge10\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog11.png\",\r\n\t\t\"data\": \":)(doge11)\",\r\n\t\t\"text\": \"doge11\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog12.png\",\r\n\t\t\"data\": \":)(doge12)\",\r\n\t\t\"text\": \"doge12\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog13.png\",\r\n\t\t\"data\": \":)(doge13)\",\r\n\t\t\"text\": \"doge13\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog14.png\",\r\n\t\t\"data\": \":)(doge14)\",\r\n\t\t\"text\": \"doge14\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dog15.png\",\r\n\t\t\"data\": \":)(doge15)\",\r\n\t\t\"text\": \"doge15\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/aini.png\",\r\n\t\t\"data\": \":)(aini)\",\r\n\t\t\"text\": \"aini\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/aoteman.png\",\r\n\t\t\"data\": \":)(aoteman)\",\r\n\t\t\"text\": \"aoteman\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/baibai.png\",\r\n\t\t\"data\": \":)(baibai)\",\r\n\t\t\"text\": \"baibai\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/beishang.png\",\r\n\t\t\"data\": \":)(beishang)\",\r\n\t\t\"text\": \"beishang\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/bishi.png\",\r\n\t\t\"data\": \":)(bishi)\",\r\n\t\t\"text\": \"bishi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/bizui.png\",\r\n\t\t\"data\": \":)(bizui)\",\r\n\t\t\"text\": \"bizui\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/chanzui.png\",\r\n\t\t\"data\": \":)(chanzui)\",\r\n\t\t\"text\": \"chanzui\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/chijing.png\",\r\n\t\t\"data\": \":)(chijing)\",\r\n\t\t\"text\": \"chijing\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dahaqi.png\",\r\n\t\t\"data\": \":)(dahaqi)\",\r\n\t\t\"text\": \"dahaqi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/dalian.png\",\r\n\t\t\"data\": \":)(dalian)\",\r\n\t\t\"text\": \"dalian\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/ding.png\",\r\n\t\t\"data\": \":)(ding)\",\r\n\t\t\"text\": \"ding\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/feizao.png\",\r\n\t\t\"data\": \":)(feizao)\",\r\n\t\t\"text\": \"feizao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/ganmao.png\",\r\n\t\t\"data\": \":)(ganmao)\",\r\n\t\t\"text\": \"ganmao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/guzhang.png\",\r\n\t\t\"data\": \":)(guzhang)\",\r\n\t\t\"text\": \"guzhang\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/haha.png\",\r\n\t\t\"data\": \":)(haha)\",\r\n\t\t\"text\": \"haha\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/haixiu.png\",\r\n\t\t\"data\": \":)(haixiu)\",\r\n\t\t\"text\": \"haixiu\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/hehe.png\",\r\n\t\t\"data\": \":)(hehe)\",\r\n\t\t\"text\": \"hehe\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/heixian.png\",\r\n\t\t\"data\": \":)(heixian)\",\r\n\t\t\"text\": \"heixian\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/heng.png\",\r\n\t\t\"data\": \":)(heng)\",\r\n\t\t\"text\": \"heng\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/huaxin.png\",\r\n\t\t\"data\": \":)(huaxin)\",\r\n\t\t\"text\": \"huaxin\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/jiyan.png\",\r\n\t\t\"data\": \":)(jiyan)\",\r\n\t\t\"text\": \"jiyan\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/keai.png\",\r\n\t\t\"data\": \":)(keai)\",\r\n\t\t\"text\": \"keai\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/kelian.png\",\r\n\t\t\"data\": \":)(kelian)\",\r\n\t\t\"text\": \"kelian\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/ku.png\",\r\n\t\t\"data\": \":)(ku)\",\r\n\t\t\"text\": \"ku\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/kun.png\",\r\n\t\t\"data\": \":)(kun)\",\r\n\t\t\"text\": \"kun\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/landelini.png\",\r\n\t\t\"data\": \":)(landelini)\",\r\n\t\t\"text\": \"landelini\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/lei.png\",\r\n\t\t\"data\": \":)(lei)\",\r\n\t\t\"text\": \"lei\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/nanhaier.png\",\r\n\t\t\"data\": \":)(nanhaier)\",\r\n\t\t\"text\": \"nanhaier\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/nu.png\",\r\n\t\t\"data\": \":)(nu)\",\r\n\t\t\"text\": \"nu\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/numa.png\",\r\n\t\t\"data\": \":)(numa)\",\r\n\t\t\"text\": \"numa\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/nvhaier.png\",\r\n\t\t\"data\": \":)(nvhaier)\",\r\n\t\t\"text\": \"nvhaier\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/qian.png\",\r\n\t\t\"data\": \":)(qian)\",\r\n\t\t\"text\": \"qian\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/qinqin.png\",\r\n\t\t\"data\": \":)(qinqin)\",\r\n\t\t\"text\": \"qinqin\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/shayan.png\",\r\n\t\t\"data\": \":)(shayan)\",\r\n\t\t\"text\": \"shayan\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/shengbing.png\",\r\n\t\t\"data\": \":)(shengbing)\",\r\n\t\t\"text\": \"shengbing\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/shenshou.png\",\r\n\t\t\"data\": \":)(shenshou)\",\r\n\t\t\"text\": \"shenshou\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/shiwang.png\",\r\n\t\t\"data\": \":)(shiwang)\",\r\n\t\t\"text\": \"shiwang\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/shuai.png\",\r\n\t\t\"data\": \":)(shuai)\",\r\n\t\t\"text\": \"shuai\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/shuijiao.png\",\r\n\t\t\"data\": \":)(shuijiao)\",\r\n\t\t\"text\": \"shuijiao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/sikao.png\",\r\n\t\t\"data\": \":)(sikao)\",\r\n\t\t\"text\": \"sikao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/taikaixin.png\",\r\n\t\t\"data\": \":)(taikaixin)\",\r\n\t\t\"text\": \"taikaixin\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/touxiao.png\",\r\n\t\t\"data\": \":)(touxiao)\",\r\n\t\t\"text\": \"touxiao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/tu.png\",\r\n\t\t\"data\": \":)(tu)\",\r\n\t\t\"text\": \"tu\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/tuzi.png\",\r\n\t\t\"data\": \":)(tuzi)\",\r\n\t\t\"text\": \"tuzi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/wabishi.png\",\r\n\t\t\"data\": \":)(wabishi)\",\r\n\t\t\"text\": \"wabishi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/weiqu.png\",\r\n\t\t\"data\": \":)(weiqu)\",\r\n\t\t\"text\": \"weiqu\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/xiaoku.png\",\r\n\t\t\"data\": \":)(xiaoku)\",\r\n\t\t\"text\": \"xiaoku\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/xiongmao.png\",\r\n\t\t\"data\": \":)(xiongmao)\",\r\n\t\t\"text\": \"xiongmao\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/xixi.png\",\r\n\t\t\"data\": \":)(xixi)\",\r\n\t\t\"text\": \"xixi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/xu.png\",\r\n\t\t\"data\": \":)(xu)\",\r\n\t\t\"text\": \"xu\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/yinxian.png\",\r\n\t\t\"data\": \":)(yinxian)\",\r\n\t\t\"text\": \"yinxian\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/yiwen.png\",\r\n\t\t\"data\": \":)(yiwen)\",\r\n\t\t\"text\": \"yiwen\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/youhengheng.png\",\r\n\t\t\"data\": \":)(youhengheng)\",\r\n\t\t\"text\": \"youhengheng\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/yun.png\",\r\n\t\t\"data\": \":)(yun)\",\r\n\t\t\"text\": \"yun\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/zhuakuang.png\",\r\n\t\t\"data\": \":)(zhuakuang)\",\r\n\t\t\"text\": \"zhuakuang\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/zhutou.png\",\r\n\t\t\"data\": \":)(zhutou)\",\r\n\t\t\"text\": \"zhutou\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/zuiyou.png\",\r\n\t\t\"data\": \":)(zuiyou)\",\r\n\t\t\"text\": \"zuiyou\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/zuohengheng.png\",\r\n\t\t\"data\": \":)(zuohengheng)\",\r\n\t\t\"text\": \"zuohengheng\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/geili.png\",\r\n\t\t\"data\": \":)(geili)\",\r\n\t\t\"text\": \"geili\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/hufen.png\",\r\n\t\t\"data\": \":)(hufen)\",\r\n\t\t\"text\": \"hufen\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/jiong.png\",\r\n\t\t\"data\": \":)(jiong)\",\r\n\t\t\"text\": \"jiong\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/meng.png\",\r\n\t\t\"data\": \":)(meng)\",\r\n\t\t\"text\": \"meng\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/shenma.png\",\r\n\t\t\"data\": \":)(shenma)\",\r\n\t\t\"text\": \"shenma\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/v5.png\",\r\n\t\t\"data\": \":)(v5)\",\r\n\t\t\"text\": \"v5\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/xi.png\",\r\n\t\t\"data\": \":)(xi)\",\r\n\t\t\"text\": \"xi\",\r\n\t\t\"category\": \"微博\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/weibo/zhi.png\",\r\n\t\t\"data\": \":)(zhi)\",\r\n\t\t\"text\": \"zhi\",\r\n\t\t\"category\": \"微博\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/呵呵.png\",\r\n\t\t\"data\": \":u(呵呵)\",\r\n\t\t\"text\": \"呵呵\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/哈哈.png\",\r\n\t\t\"data\": \":u(哈哈)\",\r\n\t\t\"text\": \"哈哈\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/吐舌.png\",\r\n\t\t\"data\": \":u(吐舌)\",\r\n\t\t\"text\": \"吐舌\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/太开心.png\",\r\n\t\t\"data\": \":u(太开心)\",\r\n\t\t\"text\": \"太开心\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/笑眼.png\",\r\n\t\t\"data\": \":u(笑眼)\",\r\n\t\t\"text\": \"笑眼\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/花心.png\",\r\n\t\t\"data\": \":u(花心)\",\r\n\t\t\"text\": \"花心\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/小乖.png\",\r\n\t\t\"data\": \":u(小乖)\",\r\n\t\t\"text\": \"小乖\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/乖.png\",\r\n\t\t\"data\": \":u(乖)\",\r\n\t\t\"text\": \"乖\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/捂嘴笑.png\",\r\n\t\t\"data\": \":u(捂嘴笑)\",\r\n\t\t\"text\": \"捂嘴笑\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/滑稽.png\",\r\n\t\t\"data\": \":u(滑稽)\",\r\n\t\t\"text\": \"滑稽\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/你懂的.png\",\r\n\t\t\"data\": \":u(你懂的)\",\r\n\t\t\"text\": \"你懂的\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/不高兴.png\",\r\n\t\t\"data\": \":u(不高兴)\",\r\n\t\t\"text\": \"不高兴\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/怒.png\",\r\n\t\t\"data\": \":u(怒)\",\r\n\t\t\"text\": \"怒\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/汗.png\",\r\n\t\t\"data\": \":u(汗)\",\r\n\t\t\"text\": \"汗\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/黑线.png\",\r\n\t\t\"data\": \":u(黑线)\",\r\n\t\t\"text\": \"黑线\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/泪.png\",\r\n\t\t\"data\": \":u(泪)\",\r\n\t\t\"text\": \"泪\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/喷.png\",\r\n\t\t\"data\": \":u(喷)\",\r\n\t\t\"text\": \"喷\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/惊哭.png\",\r\n\t\t\"data\": \":u(惊哭)\",\r\n\t\t\"text\": \"惊哭\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/阴险.png\",\r\n\t\t\"data\": \":u(阴险)\",\r\n\t\t\"text\": \"阴险\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/鄙视.png\",\r\n\t\t\"data\": \":u(鄙视)\",\r\n\t\t\"text\": \"鄙视\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/酷.png\",\r\n\t\t\"data\": \":u(酷)\",\r\n\t\t\"text\": \"酷\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/啊.png\",\r\n\t\t\"data\": \":u(啊)\",\r\n\t\t\"text\": \"啊\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/狂汗.png\",\r\n\t\t\"data\": \":u(狂汗)\",\r\n\t\t\"text\": \"狂汗\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/what.png\",\r\n\t\t\"data\": \":u(what)\",\r\n\t\t\"text\": \"what\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/疑问.png\",\r\n\t\t\"data\": \":u(疑问)\",\r\n\t\t\"text\": \"疑问\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/酸爽.png\",\r\n\t\t\"data\": \":u(酸爽)\",\r\n\t\t\"text\": \"酸爽\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/呀咩爹.png\",\r\n\t\t\"data\": \":u(呀咩爹)\",\r\n\t\t\"text\": \"呀咩爹\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/委屈.png\",\r\n\t\t\"data\": \":u(委屈)\",\r\n\t\t\"text\": \"委屈\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/惊讶.png\",\r\n\t\t\"data\": \":u(惊讶)\",\r\n\t\t\"text\": \"惊讶\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/睡觉.png\",\r\n\t\t\"data\": \":u(睡觉)\",\r\n\t\t\"text\": \"睡觉\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/笑尿.png\",\r\n\t\t\"data\": \":u(笑尿)\",\r\n\t\t\"text\": \"笑尿\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/挖鼻.png\",\r\n\t\t\"data\": \":u(挖鼻)\",\r\n\t\t\"text\": \"挖鼻\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/吐.png\",\r\n\t\t\"data\": \":u(吐)\",\r\n\t\t\"text\": \"吐\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/犀利.png\",\r\n\t\t\"data\": \":u(犀利)\",\r\n\t\t\"text\": \"犀利\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/小红脸.png\",\r\n\t\t\"data\": \":u(小红脸)\",\r\n\t\t\"text\": \"小红脸\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/懒得理.png\",\r\n\t\t\"data\": \":u(懒得理)\",\r\n\t\t\"text\": \"懒得理\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/勉强.png\",\r\n\t\t\"data\": \":u(勉强)\",\r\n\t\t\"text\": \"勉强\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/爱心.png\",\r\n\t\t\"data\": \":u(爱心)\",\r\n\t\t\"text\": \"爱心\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/心碎.png\",\r\n\t\t\"data\": \":u(心碎)\",\r\n\t\t\"text\": \"心碎\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/玫瑰.png\",\r\n\t\t\"data\": \":u(玫瑰)\",\r\n\t\t\"text\": \"玫瑰\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/礼物.png\",\r\n\t\t\"data\": \":u(礼物)\",\r\n\t\t\"text\": \"礼物\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/彩虹.png\",\r\n\t\t\"data\": \":u(彩虹)\",\r\n\t\t\"text\": \"彩虹\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/太阳.png\",\r\n\t\t\"data\": \":u(太阳)\",\r\n\t\t\"text\": \"太阳\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/星星月亮.png\",\r\n\t\t\"data\": \":u(星星月亮)\",\r\n\t\t\"text\": \"星星月亮\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/钱币.png\",\r\n\t\t\"data\": \":u(钱币)\",\r\n\t\t\"text\": \"钱币\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/茶杯.png\",\r\n\t\t\"data\": \":u(茶杯)\",\r\n\t\t\"text\": \"茶杯\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/蛋糕.png\",\r\n\t\t\"data\": \":u(蛋糕)\",\r\n\t\t\"text\": \"蛋糕\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/大拇指.png\",\r\n\t\t\"data\": \":u(大拇指)\",\r\n\t\t\"text\": \"大拇指\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/胜利.png\",\r\n\t\t\"data\": \":u(胜利)\",\r\n\t\t\"text\": \"胜利\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/haha.png\",\r\n\t\t\"data\": \":u(haha)\",\r\n\t\t\"text\": \"haha\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/OK.png\",\r\n\t\t\"data\": \":u(OK)\",\r\n\t\t\"text\": \"OK\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/沙发.png\",\r\n\t\t\"data\": \":u(沙发)\",\r\n\t\t\"text\": \"沙发\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/手纸.png\",\r\n\t\t\"data\": \":u(手纸)\",\r\n\t\t\"text\": \"手纸\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/香蕉.png\",\r\n\t\t\"data\": \":u(香蕉)\",\r\n\t\t\"text\": \"香蕉\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/便便.png\",\r\n\t\t\"data\": \":u(便便)\",\r\n\t\t\"text\": \"便便\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/药丸.png\",\r\n\t\t\"data\": \":u(药丸)\",\r\n\t\t\"text\": \"药丸\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/红领巾.png\",\r\n\t\t\"data\": \":u(红领巾)\",\r\n\t\t\"text\": \"红领巾\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/蜡烛.png\",\r\n\t\t\"data\": \":u(蜡烛)\",\r\n\t\t\"text\": \"蜡烛\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/音乐.png\",\r\n\t\t\"data\": \":u(音乐)\",\r\n\t\t\"text\": \"音乐\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/newtieba/灯泡.png\",\r\n\t\t\"data\": \":u(灯泡)\",\r\n\t\t\"text\": \"灯泡\",\r\n\t\t\"category\": \"新贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/呵呵.png\",\r\n\t\t\"data\": \":w(呵呵)\",\r\n\t\t\"text\": \"呵呵\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/哈哈.png\",\r\n\t\t\"data\": \":w(哈哈)\",\r\n\t\t\"text\": \"哈哈\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/吐舌.png\",\r\n\t\t\"data\": \":w(吐舌)\",\r\n\t\t\"text\": \"吐舌\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/啊.png\",\r\n\t\t\"data\": \":w(啊)\",\r\n\t\t\"text\": \"啊\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/酷.png\",\r\n\t\t\"data\": \":w(酷)\",\r\n\t\t\"text\": \"酷\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/怒.png\",\r\n\t\t\"data\": \":w(怒)\",\r\n\t\t\"text\": \"怒\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/开心.png\",\r\n\t\t\"data\": \":w(开心)\",\r\n\t\t\"text\": \"开心\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/汗.png\",\r\n\t\t\"data\": \":w(汗)\",\r\n\t\t\"text\": \"汗\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/泪.png\",\r\n\t\t\"data\": \":w(泪)\",\r\n\t\t\"text\": \"泪\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/黑线.png\",\r\n\t\t\"data\": \":w(黑线)\",\r\n\t\t\"text\": \"黑线\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/鄙视.png\",\r\n\t\t\"data\": \":w(鄙视)\",\r\n\t\t\"text\": \"鄙视\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/不高兴.png\",\r\n\t\t\"data\": \":w(不高兴)\",\r\n\t\t\"text\": \"不高兴\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/真棒.png\",\r\n\t\t\"data\": \":w(真棒)\",\r\n\t\t\"text\": \"真棒\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/钱.png\",\r\n\t\t\"data\": \":w(钱)\",\r\n\t\t\"text\": \"钱\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/疑问.png\",\r\n\t\t\"data\": \":w(疑问)\",\r\n\t\t\"text\": \"疑问\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/阴险.png\",\r\n\t\t\"data\": \":w(阴险)\",\r\n\t\t\"text\": \"阴险\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/吐.png\",\r\n\t\t\"data\": \":w(吐)\",\r\n\t\t\"text\": \"吐\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/咦.png\",\r\n\t\t\"data\": \":w(咦)\",\r\n\t\t\"text\": \"咦\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/委屈.png\",\r\n\t\t\"data\": \":w(委屈)\",\r\n\t\t\"text\": \"委屈\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/花心.png\",\r\n\t\t\"data\": \":w(花心)\",\r\n\t\t\"text\": \"花心\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/呼.png\",\r\n\t\t\"data\": \":w(呼)\",\r\n\t\t\"text\": \"呼\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/笑眼.png\",\r\n\t\t\"data\": \":w(笑眼)\",\r\n\t\t\"text\": \"笑眼\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/冷.png\",\r\n\t\t\"data\": \":w(冷)\",\r\n\t\t\"text\": \"冷\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/太开心.png\",\r\n\t\t\"data\": \":w(太开心)\",\r\n\t\t\"text\": \"太开心\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/滑稽.png\",\r\n\t\t\"data\": \":w(滑稽)\",\r\n\t\t\"text\": \"滑稽\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/勉强.png\",\r\n\t\t\"data\": \":w(勉强)\",\r\n\t\t\"text\": \"勉强\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/狂汗.png\",\r\n\t\t\"data\": \":w(狂汗)\",\r\n\t\t\"text\": \"狂汗\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/乖.png\",\r\n\t\t\"data\": \":w(乖)\",\r\n\t\t\"text\": \"乖\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/睡觉.png\",\r\n\t\t\"data\": \":w(睡觉)\",\r\n\t\t\"text\": \"睡觉\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/惊哭.png\",\r\n\t\t\"data\": \":w(惊哭)\",\r\n\t\t\"text\": \"惊哭\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/生气.png\",\r\n\t\t\"data\": \":w(生气)\",\r\n\t\t\"text\": \"生气\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/惊讶.png\",\r\n\t\t\"data\": \":w(惊讶)\",\r\n\t\t\"text\": \"惊讶\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/喷.png\",\r\n\t\t\"data\": \":w(喷)\",\r\n\t\t\"text\": \"喷\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/玫瑰.png\",\r\n\t\t\"data\": \":w(玫瑰)\",\r\n\t\t\"text\": \"玫瑰\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/礼物.png\",\r\n\t\t\"data\": \":w(礼物)\",\r\n\t\t\"text\": \"礼物\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/彩虹.png\",\r\n\t\t\"data\": \":w(彩虹)\",\r\n\t\t\"text\": \"彩虹\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/钱币.png\",\r\n\t\t\"data\": \":w(钱币)\",\r\n\t\t\"text\": \"钱币\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/灯泡.png\",\r\n\t\t\"data\": \":w(灯泡)\",\r\n\t\t\"text\": \"灯泡\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/茶杯.png\",\r\n\t\t\"data\": \":w(茶杯)\",\r\n\t\t\"text\": \"茶杯\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/音乐.png\",\r\n\t\t\"data\": \":w(音乐)\",\r\n\t\t\"text\": \"音乐\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/haha.png\",\r\n\t\t\"data\": \":w(haha)\",\r\n\t\t\"text\": \"haha\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/胜利.png\",\r\n\t\t\"data\": \":w(胜利)\",\r\n\t\t\"text\": \"胜利\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/大拇指.png\",\r\n\t\t\"data\": \":w(大拇指)\",\r\n\t\t\"text\": \"大拇指\",\r\n\t\t\"category\": \"贴吧\"\r\n\t}, {\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/tieba/弱.png\",\r\n\t\t\"data\": \":w(弱)\",\r\n\t\t\"text\": \"弱\",\r\n\t\t\"category\": \"贴吧\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E9AB98E585B4_2x.png\",\r\n\t\t\"data\": \":@(高兴)\",\r\n\t\t\"text\": \"高兴\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E5B08FE68092_2x.png\",\r\n\t\t\"data\": \":@(小怒)\",\r\n\t\t\"text\": \"小怒\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E884B8E7BAA2_2x.png\",\r\n\t\t\"data\": \":@(脸红)\",\r\n\t\t\"text\": \"脸红\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E58685E4BCA4_2x.png\",\r\n\t\t\"data\": \":@(内伤)\",\r\n\t\t\"text\": \"内伤\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E8A385E5A4A7E6ACBE_2x.png\",\r\n\t\t\"data\": \":@(装大款)\",\r\n\t\t\"text\": \"装大款\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E8B59EE4B880E4B8AA_2x.png\",\r\n\t\t\"data\": \":@(赞一个)\",\r\n\t\t\"text\": \"赞一个\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E5AEB3E7BE9E_2x.png\",\r\n\t\t\"data\": \":@(害羞)\",\r\n\t\t\"text\": \"害羞\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E6B197_2x.png\",\r\n\t\t\"data\": \":@(汗)\",\r\n\t\t\"text\": \"汗\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E59090E8A180E58092E59CB0_2x.png\",\r\n\t\t\"data\": \":@(吐血倒地)\",\r\n\t\t\"text\": \"吐血倒地\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E6B7B1E6809D_2x.png\",\r\n\t\t\"data\": \":@(深思)\",\r\n\t\t\"text\": \"深思\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E4B88DE9AB98E585B4_2x.png\",\r\n\t\t\"data\": \":@(不高兴)\",\r\n\t\t\"text\": \"不高兴\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E697A0E8AFAD_2x.png\",\r\n\t\t\"data\": \":@(无语)\",\r\n\t\t\"text\": \"无语\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E4BAB2E4BAB2_2x.png\",\r\n\t\t\"data\": \":@(亲亲)\",\r\n\t\t\"text\": \"亲亲\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E58FA3E6B0B4_2x.png\",\r\n\t\t\"data\": \":@(口水)\",\r\n\t\t\"text\": \"口水\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E5B0B4E5B0AC_2x.png\",\r\n\t\t\"data\": \":@(尴尬)\",\r\n\t\t\"text\": \"尴尬\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E4B8ADE68C87_2x.png\",\r\n\t\t\"data\": \":@(中指)\",\r\n\t\t\"text\": \"中指\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E683B3E4B880E683B3_2x.png\",\r\n\t\t\"data\": \":@(想一想)\",\r\n\t\t\"text\": \"想一想\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E593ADE6B3A3_2x.png\",\r\n\t\t\"data\": \":@(哭泣)\",\r\n\t\t\"text\": \"哭泣\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E4BEBFE4BEBF_2x.png\",\r\n\t\t\"data\": \":@(便便)\",\r\n\t\t\"text\": \"便便\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E78CAEE88AB1_2x.png\",\r\n\t\t\"data\": \":@(献花)\",\r\n\t\t\"text\": \"献花\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E79AB1E79C89_2x.png\",\r\n\t\t\"data\": \":@(皱眉)\",\r\n\t\t\"text\": \"皱眉\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E582BBE7AC91_2x.png\",\r\n\t\t\"data\": \":@(傻笑)\",\r\n\t\t\"text\": \"傻笑\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E78B82E6B197_2x.png\",\r\n\t\t\"data\": \":@(狂汗)\",\r\n\t\t\"text\": \"狂汗\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E59090_2x.png\",\r\n\t\t\"data\": \":@(吐)\",\r\n\t\t\"text\": \"吐\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E596B7E6B0B4_2x.png\",\r\n\t\t\"data\": \":@(喷水)\",\r\n\t\t\"text\": \"喷水\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E79C8BE4B88DE8A781_2x.png\",\r\n\t\t\"data\": \":@(看不见)\",\r\n\t\t\"text\": \"看不见\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E9BC93E68E8C_2x.png\",\r\n\t\t\"data\": \":@(鼓掌)\",\r\n\t\t\"text\": \"鼓掌\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E998B4E69A97_2x.png\",\r\n\t\t\"data\": \":@(阴暗)\",\r\n\t\t\"text\": \"阴暗\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E995BFE88D89_2x.png\",\r\n\t\t\"data\": \":@(长草)\",\r\n\t\t\"text\": \"长草\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E78CAEE9BB84E7939C_2x.png\",\r\n\t\t\"data\": \":@(献黄瓜)\",\r\n\t\t\"text\": \"献黄瓜\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E982AAE681B6_2x.png\",\r\n\t\t\"data\": \":@(邪恶)\",\r\n\t\t\"text\": \"邪恶\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E69C9FE5BE85_2x.png\",\r\n\t\t\"data\": \":@(期待)\",\r\n\t\t\"text\": \"期待\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E5BE97E6848F_2x.png\",\r\n\t\t\"data\": \":@(得意)\",\r\n\t\t\"text\": \"得意\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E59090E8888C_2x.png\",\r\n\t\t\"data\": \":@(吐舌)\",\r\n\t\t\"text\": \"吐舌\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E596B7E8A180_2x.png\",\r\n\t\t\"data\": \":@(喷血)\",\r\n\t\t\"text\": \"喷血\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E697A0E68980E8B093_2x.png\",\r\n\t\t\"data\": \":@(无所谓)\",\r\n\t\t\"text\": \"无所谓\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E8A782E5AF9F_2x.png\",\r\n\t\t\"data\": \":@(观察)\",\r\n\t\t\"text\": \"观察\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E69A97E59CB0E8A782E5AF9F_2x.png\",\r\n\t\t\"data\": \":@(暗地观察)\",\r\n\t\t\"text\": \"暗地观察\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E882BFE58C85_2x.png\",\r\n\t\t\"data\": \":@(肿包)\",\r\n\t\t\"text\": \"肿包\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E4B8ADE69EAA_2x.png\",\r\n\t\t\"data\": \":@(中枪)\",\r\n\t\t\"text\": \"中枪\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E5A4A7E59BA7_2x.png\",\r\n\t\t\"data\": \":@(大囧)\",\r\n\t\t\"text\": \"大囧\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E591B2E78999_2x.png\",\r\n\t\t\"data\": \":@(呲牙)\",\r\n\t\t\"text\": \"呲牙\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E68AA0E9BCBB_2x.png\",\r\n\t\t\"data\": \":@(抠鼻)\",\r\n\t\t\"text\": \"抠鼻\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E4B88DE8AFB4E8AF9D_2x.png\",\r\n\t\t\"data\": \":@(不说话)\",\r\n\t\t\"text\": \"不说话\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E592BDE6B094_2x.png\",\r\n\t\t\"data\": \":@(咽气)\",\r\n\t\t\"text\": \"咽气\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E6ACA2E591BC_2x.png\",\r\n\t\t\"data\": \":@(欢呼)\",\r\n\t\t\"text\": \"欢呼\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E99481E79C89_2x.png\",\r\n\t\t\"data\": \":@(锁眉)\",\r\n\t\t\"text\": \"锁眉\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E89CA1E7839B_2x.png\",\r\n\t\t\"data\": \":@(蜡烛)\",\r\n\t\t\"text\": \"蜡烛\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E59D90E7AD89_2x.png\",\r\n\t\t\"data\": \":@(坐等)\",\r\n\t\t\"text\": \"坐等\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E587BBE68E8C_2x.png\",\r\n\t\t\"data\": \":@(击掌)\",\r\n\t\t\"text\": \"击掌\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E6838AE5969C_2x.png\",\r\n\t\t\"data\": \":@(惊喜)\",\r\n\t\t\"text\": \"惊喜\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E5969CE69E81E8808CE6B3A3_2x.png\",\r\n\t\t\"data\": \":@(喜极而泣)\",\r\n\t\t\"text\": \"喜极而泣\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E68ABDE7839F_2x.png\",\r\n\t\t\"data\": \":@(抽烟)\",\r\n\t\t\"text\": \"抽烟\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E4B88DE587BAE68980E69699_2x.png\",\r\n\t\t\"data\": \":@(不出所料)\",\r\n\t\t\"text\": \"不出所料\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E684A4E68092_2x.png\",\r\n\t\t\"data\": \":@(愤怒)\",\r\n\t\t\"text\": \"愤怒\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E697A0E5A588_2x.png\",\r\n\t\t\"data\": \":@(无奈)\",\r\n\t\t\"text\": \"无奈\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E9BB91E7BABF_2x.png\",\r\n\t\t\"data\": \":@(黑线)\",\r\n\t\t\"text\": \"黑线\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E68A95E9998D_2x.png\",\r\n\t\t\"data\": \":@(投降)\",\r\n\t\t\"text\": \"投降\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E79C8BE783ADE997B9_2x.png\",\r\n\t\t\"data\": \":@(看热闹)\",\r\n\t\t\"text\": \"看热闹\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E68987E880B3E58589_2x.png\",\r\n\t\t\"data\": \":@(扇耳光)\",\r\n\t\t\"text\": \"扇耳光\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E5B08FE79CBCE79D9B_2x.png\",\r\n\t\t\"data\": \":@(小眼睛)\",\r\n\t\t\"text\": \"小眼睛\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/aru/E4B8ADE58880_2x.png\",\r\n\t\t\"data\": \":@(中刀)\",\r\n\t\t\"text\": \"中刀\",\r\n\t\t\"category\": \"阿鲁\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E581B7E79C8B.png\",\r\n\t\t\"data\": \":&(蛆音娘_偷看)\",\r\n\t\t\"text\": \"蛆音娘_偷看\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E6918AE6898B.png\",\r\n\t\t\"data\": \":&(蛆音娘_摊手)\",\r\n\t\t\"text\": \"蛆音娘_摊手\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E697A0E8AFAD.png\",\r\n\t\t\"data\": \":&(蛆音娘_无语)\",\r\n\t\t\"text\": \"蛆音娘_无语\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E5AEB3E68095.png\",\r\n\t\t\"data\": \":&(蛆音娘_害怕)\",\r\n\t\t\"text\": \"蛆音娘_害怕\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E58EBBE4B896.png\",\r\n\t\t\"data\": \":&(蛆音娘_去世)\",\r\n\t\t\"text\": \"蛆音娘_去世\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E79DA1E8A789.png\",\r\n\t\t\"data\": \":&(蛆音娘_睡觉)\",\r\n\t\t\"text\": \"蛆音娘_睡觉\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E593ADE6B3A3.png\",\r\n\t\t\"data\": \":&(蛆音娘_哭泣)\",\r\n\t\t\"text\": \"蛆音娘_哭泣\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E6BB91E7A8BD.png\",\r\n\t\t\"data\": \":&(蛆音娘_滑稽)\",\r\n\t\t\"text\": \"蛆音娘_滑稽\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E882A5E79A82.png\",\r\n\t\t\"data\": \":&(蛆音娘_肥皂)\",\r\n\t\t\"text\": \"蛆音娘_肥皂\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E7949FE6B094.png\",\r\n\t\t\"data\": \":&(蛆音娘_生气)\",\r\n\t\t\"text\": \"蛆音娘_生气\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E4B88DE684A7E698AFE68891.png\",\r\n\t\t\"data\": \":&(蛆音娘_不愧是我)\",\r\n\t\t\"text\": \"蛆音娘_不愧是我\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E59083E6838A.png\",\r\n\t\t\"data\": \":&(蛆音娘_吃惊)\",\r\n\t\t\"text\": \"蛆音娘_吃惊\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E689B6E9A29D.png\",\r\n\t\t\"data\": \":&(蛆音娘_扶额)\",\r\n\t\t\"text\": \"蛆音娘_扶额\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E5A4A7E7AC91.png\",\r\n\t\t\"data\": \":&(蛆音娘_大笑)\",\r\n\t\t\"text\": \"蛆音娘_大笑\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E58D96E8908C.png\",\r\n\t\t\"data\": \":&(蛆音娘_卖萌)\",\r\n\t\t\"text\": \"蛆音娘_卖萌\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E59083E7939C.png\",\r\n\t\t\"data\": \":&(蛆音娘_吃瓜)\",\r\n\t\t\"text\": \"蛆音娘_吃瓜\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E59090E8A180.png\",\r\n\t\t\"data\": \":&(蛆音娘_吐血)\",\r\n\t\t\"text\": \"蛆音娘_吐血\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_OK.png\",\r\n\t\t\"data\": \":&(蛆音娘_OK)\",\r\n\t\t\"text\": \"蛆音娘_OK\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E593BC.png\",\r\n\t\t\"data\": \":&(蛆音娘_哼)\",\r\n\t\t\"text\": \"蛆音娘_哼\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t},\r\n\t{\r\n\t\t\"icon\": \"https://jsd.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E79691E997AE.png\",\r\n\t\t\"data\": \":&(蛆音娘_疑问)\",\r\n\t\t\"text\": \"蛆音娘_疑问\",\r\n\t\t\"category\": \"蛆音娘\"\r\n\t}\r\n]"
  },
  {
    "path": "配套插件/BsCore/modules/cache/autoload.php",
    "content": "<?php\n\n// autoload.php @generated by Composer\n\nrequire_once __DIR__ . '/composer/autoload_real.php';\n\nreturn ComposerAutoloaderInitba417bf535fd8cb801c504d4bd4fbf74::getLoader();\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/cache.interface.php",
    "content": "<?php\ninterface BsCache\n{\n\tpublic function init($option);\n\tpublic function add($key, $value);\n\tpublic function delete($key);\n\tpublic function set($key, $value);\n\tpublic function get($key);\n\tpublic function flush();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/composer/ClassLoader.php",
    "content": "<?php\n\n/*\n * This file is part of Composer.\n *\n * (c) Nils Adermann <naderman@naderman.de>\n *     Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Composer\\Autoload;\n\n/**\n * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.\n *\n *     $loader = new \\Composer\\Autoload\\ClassLoader();\n *\n *     // register classes with namespaces\n *     $loader->add('Symfony\\Component', __DIR__.'/component');\n *     $loader->add('Symfony',           __DIR__.'/framework');\n *\n *     // activate the autoloader\n *     $loader->register();\n *\n *     // to enable searching the include path (eg. for PEAR packages)\n *     $loader->setUseIncludePath(true);\n *\n * In this example, if you try to use a class in the Symfony\\Component\n * namespace or one of its children (Symfony\\Component\\Console for instance),\n * the autoloader will first look for the class under the component/\n * directory, and it will then fallback to the framework/ directory if not\n * found before giving up.\n *\n * This class is loosely based on the Symfony UniversalClassLoader.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @see    https://www.php-fig.org/psr/psr-0/\n * @see    https://www.php-fig.org/psr/psr-4/\n */\nclass ClassLoader\n{\n    private $vendorDir;\n\n    // PSR-4\n    private $prefixLengthsPsr4 = array();\n    private $prefixDirsPsr4 = array();\n    private $fallbackDirsPsr4 = array();\n\n    // PSR-0\n    private $prefixesPsr0 = array();\n    private $fallbackDirsPsr0 = array();\n\n    private $useIncludePath = false;\n    private $classMap = array();\n    private $classMapAuthoritative = false;\n    private $missingClasses = array();\n    private $apcuPrefix;\n\n    private static $registeredLoaders = array();\n\n    public function __construct($vendorDir = null)\n    {\n        $this->vendorDir = $vendorDir;\n    }\n\n    public function getPrefixes()\n    {\n        if (!empty($this->prefixesPsr0)) {\n            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));\n        }\n\n        return array();\n    }\n\n    public function getPrefixesPsr4()\n    {\n        return $this->prefixDirsPsr4;\n    }\n\n    public function getFallbackDirs()\n    {\n        return $this->fallbackDirsPsr0;\n    }\n\n    public function getFallbackDirsPsr4()\n    {\n        return $this->fallbackDirsPsr4;\n    }\n\n    public function getClassMap()\n    {\n        return $this->classMap;\n    }\n\n    /**\n     * @param array $classMap Class to filename map\n     */\n    public function addClassMap(array $classMap)\n    {\n        if ($this->classMap) {\n            $this->classMap = array_merge($this->classMap, $classMap);\n        } else {\n            $this->classMap = $classMap;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix, either\n     * appending or prepending to the ones previously set for this prefix.\n     *\n     * @param string       $prefix  The prefix\n     * @param array|string $paths   The PSR-0 root directories\n     * @param bool         $prepend Whether to prepend the directories\n     */\n    public function add($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            if ($prepend) {\n                $this->fallbackDirsPsr0 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr0\n                );\n            } else {\n                $this->fallbackDirsPsr0 = array_merge(\n                    $this->fallbackDirsPsr0,\n                    (array) $paths\n                );\n            }\n\n            return;\n        }\n\n        $first = $prefix[0];\n        if (!isset($this->prefixesPsr0[$first][$prefix])) {\n            $this->prefixesPsr0[$first][$prefix] = (array) $paths;\n\n            return;\n        }\n        if ($prepend) {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixesPsr0[$first][$prefix]\n            );\n        } else {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                $this->prefixesPsr0[$first][$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace, either\n     * appending or prepending to the ones previously set for this namespace.\n     *\n     * @param string       $prefix  The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths   The PSR-4 base directories\n     * @param bool         $prepend Whether to prepend the directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function addPsr4($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            // Register directories for the root namespace.\n            if ($prepend) {\n                $this->fallbackDirsPsr4 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr4\n                );\n            } else {\n                $this->fallbackDirsPsr4 = array_merge(\n                    $this->fallbackDirsPsr4,\n                    (array) $paths\n                );\n            }\n        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {\n            // Register directories for a new namespace.\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        } elseif ($prepend) {\n            // Prepend directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixDirsPsr4[$prefix]\n            );\n        } else {\n            // Append directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                $this->prefixDirsPsr4[$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix,\n     * replacing any others previously set for this prefix.\n     *\n     * @param string       $prefix The prefix\n     * @param array|string $paths  The PSR-0 base directories\n     */\n    public function set($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr0 = (array) $paths;\n        } else {\n            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace,\n     * replacing any others previously set for this namespace.\n     *\n     * @param string       $prefix The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths  The PSR-4 base directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function setPsr4($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr4 = (array) $paths;\n        } else {\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Turns on searching the include path for class files.\n     *\n     * @param bool $useIncludePath\n     */\n    public function setUseIncludePath($useIncludePath)\n    {\n        $this->useIncludePath = $useIncludePath;\n    }\n\n    /**\n     * Can be used to check if the autoloader uses the include path to check\n     * for classes.\n     *\n     * @return bool\n     */\n    public function getUseIncludePath()\n    {\n        return $this->useIncludePath;\n    }\n\n    /**\n     * Turns off searching the prefix and fallback directories for classes\n     * that have not been registered with the class map.\n     *\n     * @param bool $classMapAuthoritative\n     */\n    public function setClassMapAuthoritative($classMapAuthoritative)\n    {\n        $this->classMapAuthoritative = $classMapAuthoritative;\n    }\n\n    /**\n     * Should class lookup fail if not found in the current class map?\n     *\n     * @return bool\n     */\n    public function isClassMapAuthoritative()\n    {\n        return $this->classMapAuthoritative;\n    }\n\n    /**\n     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.\n     *\n     * @param string|null $apcuPrefix\n     */\n    public function setApcuPrefix($apcuPrefix)\n    {\n        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;\n    }\n\n    /**\n     * The APCu prefix in use, or null if APCu caching is not enabled.\n     *\n     * @return string|null\n     */\n    public function getApcuPrefix()\n    {\n        return $this->apcuPrefix;\n    }\n\n    /**\n     * Registers this instance as an autoloader.\n     *\n     * @param bool $prepend Whether to prepend the autoloader or not\n     */\n    public function register($prepend = false)\n    {\n        spl_autoload_register(array($this, 'loadClass'), true, $prepend);\n\n        if (null === $this->vendorDir) {\n            return;\n        }\n\n        if ($prepend) {\n            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;\n        } else {\n            unset(self::$registeredLoaders[$this->vendorDir]);\n            self::$registeredLoaders[$this->vendorDir] = $this;\n        }\n    }\n\n    /**\n     * Unregisters this instance as an autoloader.\n     */\n    public function unregister()\n    {\n        spl_autoload_unregister(array($this, 'loadClass'));\n\n        if (null !== $this->vendorDir) {\n            unset(self::$registeredLoaders[$this->vendorDir]);\n        }\n    }\n\n    /**\n     * Loads the given class or interface.\n     *\n     * @param  string    $class The name of the class\n     * @return bool|null True if loaded, null otherwise\n     */\n    public function loadClass($class)\n    {\n        if ($file = $this->findFile($class)) {\n            includeFile($file);\n\n            return true;\n        }\n    }\n\n    /**\n     * Finds the path to the file where the class is defined.\n     *\n     * @param string $class The name of the class\n     *\n     * @return string|false The path if found, false otherwise\n     */\n    public function findFile($class)\n    {\n        // class map lookup\n        if (isset($this->classMap[$class])) {\n            return $this->classMap[$class];\n        }\n        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {\n            return false;\n        }\n        if (null !== $this->apcuPrefix) {\n            $file = apcu_fetch($this->apcuPrefix.$class, $hit);\n            if ($hit) {\n                return $file;\n            }\n        }\n\n        $file = $this->findFileWithExtension($class, '.php');\n\n        // Search for Hack files if we are running on HHVM\n        if (false === $file && defined('HHVM_VERSION')) {\n            $file = $this->findFileWithExtension($class, '.hh');\n        }\n\n        if (null !== $this->apcuPrefix) {\n            apcu_add($this->apcuPrefix.$class, $file);\n        }\n\n        if (false === $file) {\n            // Remember that this class does not exist.\n            $this->missingClasses[$class] = true;\n        }\n\n        return $file;\n    }\n\n    /**\n     * Returns the currently registered loaders indexed by their corresponding vendor directories.\n     *\n     * @return self[]\n     */\n    public static function getRegisteredLoaders()\n    {\n        return self::$registeredLoaders;\n    }\n\n    private function findFileWithExtension($class, $ext)\n    {\n        // PSR-4 lookup\n        $logicalPathPsr4 = strtr($class, '\\\\', DIRECTORY_SEPARATOR) . $ext;\n\n        $first = $class[0];\n        if (isset($this->prefixLengthsPsr4[$first])) {\n            $subPath = $class;\n            while (false !== $lastPos = strrpos($subPath, '\\\\')) {\n                $subPath = substr($subPath, 0, $lastPos);\n                $search = $subPath . '\\\\';\n                if (isset($this->prefixDirsPsr4[$search])) {\n                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);\n                    foreach ($this->prefixDirsPsr4[$search] as $dir) {\n                        if (file_exists($file = $dir . $pathEnd)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-4 fallback dirs\n        foreach ($this->fallbackDirsPsr4 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 lookup\n        if (false !== $pos = strrpos($class, '\\\\')) {\n            // namespaced class name\n            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)\n                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);\n        } else {\n            // PEAR-like class name\n            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;\n        }\n\n        if (isset($this->prefixesPsr0[$first])) {\n            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {\n                if (0 === strpos($class, $prefix)) {\n                    foreach ($dirs as $dir) {\n                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-0 fallback dirs\n        foreach ($this->fallbackDirsPsr0 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 include paths.\n        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {\n            return $file;\n        }\n\n        return false;\n    }\n}\n\n/**\n * Scope isolated include.\n *\n * Prevents access to $this/self from included files.\n */\nfunction includeFile($file)\n{\n    include $file;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/composer/InstalledVersions.php",
    "content": "<?php\n\n\n\n\n\n\n\n\n\n\n\nnamespace Composer;\n\nuse Composer\\Autoload\\ClassLoader;\nuse Composer\\Semver\\VersionParser;\n\n\n\n\n\n\n\n\nclass InstalledVersions\n{\nprivate static $installed = array (\n  'root' => \n  array (\n    'pretty_version' => '1.0.0+no-version-set',\n    'version' => '1.0.0.0',\n    'aliases' => \n    array (\n    ),\n    'reference' => NULL,\n    'name' => '__root__',\n  ),\n  'versions' => \n  array (\n    '__root__' => \n    array (\n      'pretty_version' => '1.0.0+no-version-set',\n      'version' => '1.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => NULL,\n    ),\n    'league/flysystem' => \n    array (\n      'pretty_version' => '3.28.0',\n      'version' => '3.28.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c',\n    ),\n    'league/flysystem-local' => \n    array (\n      'pretty_version' => '3.28.0',\n      'version' => '3.28.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '13f22ea8be526ea58c2ddff9e158ef7c296e4f40',\n    ),\n    'league/mime-type-detection' => \n    array (\n      'pretty_version' => '1.15.0',\n      'version' => '1.15.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301',\n    ),\n    'matthiasmullie/scrapbook' => \n    array (\n      'pretty_version' => '1.5.3',\n      'version' => '1.5.3.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'c339d56e136713aab532718eff453663b4b38efe',\n    ),\n    'psr/cache' => \n    array (\n      'pretty_version' => '3.0.0',\n      'version' => '3.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf',\n    ),\n    'psr/cache-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '^1.0||^2.0||^3.0',\n      ),\n    ),\n    'psr/simple-cache' => \n    array (\n      'pretty_version' => '3.0.0',\n      'version' => '3.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '764e0b3939f5ca87cb904f570ef9be2d78a07865',\n    ),\n    'psr/simple-cache-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '^1.0||^2.0||^3.0',\n      ),\n    ),\n  ),\n);\nprivate static $canGetVendors;\nprivate static $installedByVendor = array();\n\n\n\n\n\n\n\npublic static function getInstalledPackages()\n{\n$packages = array();\nforeach (self::getInstalled() as $installed) {\n$packages[] = array_keys($installed['versions']);\n}\n\nif (1 === \\count($packages)) {\nreturn $packages[0];\n}\n\nreturn array_keys(array_flip(\\call_user_func_array('array_merge', $packages)));\n}\n\n\n\n\n\n\n\n\n\npublic static function isInstalled($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (isset($installed['versions'][$packageName])) {\nreturn true;\n}\n}\n\nreturn false;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\npublic static function satisfies(VersionParser $parser, $packageName, $constraint)\n{\n$constraint = $parser->parseConstraints($constraint);\n$provided = $parser->parseConstraints(self::getVersionRanges($packageName));\n\nreturn $provided->matches($constraint);\n}\n\n\n\n\n\n\n\n\n\n\npublic static function getVersionRanges($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\n$ranges = array();\nif (isset($installed['versions'][$packageName]['pretty_version'])) {\n$ranges[] = $installed['versions'][$packageName]['pretty_version'];\n}\nif (array_key_exists('aliases', $installed['versions'][$packageName])) {\n$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);\n}\nif (array_key_exists('replaced', $installed['versions'][$packageName])) {\n$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);\n}\nif (array_key_exists('provided', $installed['versions'][$packageName])) {\n$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);\n}\n\nreturn implode(' || ', $ranges);\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getVersion($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\nif (!isset($installed['versions'][$packageName]['version'])) {\nreturn null;\n}\n\nreturn $installed['versions'][$packageName]['version'];\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getPrettyVersion($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\nif (!isset($installed['versions'][$packageName]['pretty_version'])) {\nreturn null;\n}\n\nreturn $installed['versions'][$packageName]['pretty_version'];\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getReference($packageName)\n{\nforeach (self::getInstalled() as $installed) {\nif (!isset($installed['versions'][$packageName])) {\ncontinue;\n}\n\nif (!isset($installed['versions'][$packageName]['reference'])) {\nreturn null;\n}\n\nreturn $installed['versions'][$packageName]['reference'];\n}\n\nthrow new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n}\n\n\n\n\n\npublic static function getRootPackage()\n{\n$installed = self::getInstalled();\n\nreturn $installed[0]['root'];\n}\n\n\n\n\n\n\n\n\npublic static function getRawData()\n{\n@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);\n\nreturn self::$installed;\n}\n\n\n\n\n\n\n\npublic static function getAllRawData()\n{\nreturn self::getInstalled();\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\npublic static function reload($data)\n{\nself::$installed = $data;\nself::$installedByVendor = array();\n}\n\n\n\n\n\nprivate static function getInstalled()\n{\nif (null === self::$canGetVendors) {\nself::$canGetVendors = method_exists('Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders');\n}\n\n$installed = array();\n\nif (self::$canGetVendors) {\nforeach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {\nif (isset(self::$installedByVendor[$vendorDir])) {\n$installed[] = self::$installedByVendor[$vendorDir];\n} elseif (is_file($vendorDir.'/composer/installed.php')) {\n$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';\n}\n}\n}\n\n$installed[] = self::$installed;\n\nreturn $installed;\n}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/composer/LICENSE",
    "content": "\nCopyright (c) Nils Adermann, Jordi Boggiano\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/composer/autoload_classmap.php",
    "content": "<?php\n\n// autoload_classmap.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'Composer\\\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/composer/autoload_namespaces.php",
    "content": "<?php\n\n// autoload_namespaces.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/composer/autoload_psr4.php",
    "content": "<?php\n\n// autoload_psr4.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'Psr\\\\SimpleCache\\\\' => array($vendorDir . '/psr/simple-cache/src'),\n    'Psr\\\\Cache\\\\' => array($vendorDir . '/psr/cache/src'),\n    'MatthiasMullie\\\\Scrapbook\\\\' => array($vendorDir . '/matthiasmullie/scrapbook/src'),\n    'League\\\\MimeTypeDetection\\\\' => array($vendorDir . '/league/mime-type-detection/src'),\n    'League\\\\Flysystem\\\\Local\\\\' => array($vendorDir . '/league/flysystem-local'),\n    'League\\\\Flysystem\\\\' => array($vendorDir . '/league/flysystem/src'),\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/composer/autoload_real.php",
    "content": "<?php\n\n// autoload_real.php @generated by Composer\n\nclass ComposerAutoloaderInitba417bf535fd8cb801c504d4bd4fbf74\n{\n    private static $loader;\n\n    public static function loadClassLoader($class)\n    {\n        if ('Composer\\Autoload\\ClassLoader' === $class) {\n            require __DIR__ . '/ClassLoader.php';\n        }\n    }\n\n    /**\n     * @return \\Composer\\Autoload\\ClassLoader\n     */\n    public static function getLoader()\n    {\n        if (null !== self::$loader) {\n            return self::$loader;\n        }\n\n        require __DIR__ . '/platform_check.php';\n\n        spl_autoload_register(array('ComposerAutoloaderInitba417bf535fd8cb801c504d4bd4fbf74', 'loadClassLoader'), true, true);\n        self::$loader = $loader = new \\Composer\\Autoload\\ClassLoader(\\dirname(\\dirname(__FILE__)));\n        spl_autoload_unregister(array('ComposerAutoloaderInitba417bf535fd8cb801c504d4bd4fbf74', 'loadClassLoader'));\n\n        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());\n        if ($useStaticLoader) {\n            require __DIR__ . '/autoload_static.php';\n\n            call_user_func(\\Composer\\Autoload\\ComposerStaticInitba417bf535fd8cb801c504d4bd4fbf74::getInitializer($loader));\n        } else {\n            $map = require __DIR__ . '/autoload_namespaces.php';\n            foreach ($map as $namespace => $path) {\n                $loader->set($namespace, $path);\n            }\n\n            $map = require __DIR__ . '/autoload_psr4.php';\n            foreach ($map as $namespace => $path) {\n                $loader->setPsr4($namespace, $path);\n            }\n\n            $classMap = require __DIR__ . '/autoload_classmap.php';\n            if ($classMap) {\n                $loader->addClassMap($classMap);\n            }\n        }\n\n        $loader->register(true);\n\n        return $loader;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/composer/autoload_static.php",
    "content": "<?php\n\n// autoload_static.php @generated by Composer\n\nnamespace Composer\\Autoload;\n\nclass ComposerStaticInitba417bf535fd8cb801c504d4bd4fbf74\n{\n    public static $prefixLengthsPsr4 = array (\n        'P' => \n        array (\n            'Psr\\\\SimpleCache\\\\' => 16,\n            'Psr\\\\Cache\\\\' => 10,\n        ),\n        'M' => \n        array (\n            'MatthiasMullie\\\\Scrapbook\\\\' => 25,\n        ),\n        'L' => \n        array (\n            'League\\\\MimeTypeDetection\\\\' => 25,\n            'League\\\\Flysystem\\\\Local\\\\' => 23,\n            'League\\\\Flysystem\\\\' => 17,\n        ),\n    );\n\n    public static $prefixDirsPsr4 = array (\n        'Psr\\\\SimpleCache\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/simple-cache/src',\n        ),\n        'Psr\\\\Cache\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/cache/src',\n        ),\n        'MatthiasMullie\\\\Scrapbook\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/matthiasmullie/scrapbook/src',\n        ),\n        'League\\\\MimeTypeDetection\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/league/mime-type-detection/src',\n        ),\n        'League\\\\Flysystem\\\\Local\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/league/flysystem-local',\n        ),\n        'League\\\\Flysystem\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/league/flysystem/src',\n        ),\n    );\n\n    public static $classMap = array (\n        'Composer\\\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',\n    );\n\n    public static function getInitializer(ClassLoader $loader)\n    {\n        return \\Closure::bind(function () use ($loader) {\n            $loader->prefixLengthsPsr4 = ComposerStaticInitba417bf535fd8cb801c504d4bd4fbf74::$prefixLengthsPsr4;\n            $loader->prefixDirsPsr4 = ComposerStaticInitba417bf535fd8cb801c504d4bd4fbf74::$prefixDirsPsr4;\n            $loader->classMap = ComposerStaticInitba417bf535fd8cb801c504d4bd4fbf74::$classMap;\n\n        }, null, ClassLoader::class);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/composer/installed.json",
    "content": "{\n    \"packages\": [\n        {\n            \"name\": \"league/flysystem\",\n            \"version\": \"3.28.0\",\n            \"version_normalized\": \"3.28.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/thephpleague/flysystem.git\",\n                \"reference\": \"e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c\",\n                \"reference\": \"e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"league/flysystem-local\": \"^3.0.0\",\n                \"league/mime-type-detection\": \"^1.0.0\",\n                \"php\": \"^8.0.2\"\n            },\n            \"conflict\": {\n                \"async-aws/core\": \"<1.19.0\",\n                \"async-aws/s3\": \"<1.14.0\",\n                \"aws/aws-sdk-php\": \"3.209.31 || 3.210.0\",\n                \"guzzlehttp/guzzle\": \"<7.0\",\n                \"guzzlehttp/ringphp\": \"<1.1.1\",\n                \"phpseclib/phpseclib\": \"3.0.15\",\n                \"symfony/http-client\": \"<5.2\"\n            },\n            \"require-dev\": {\n                \"async-aws/s3\": \"^1.5 || ^2.0\",\n                \"async-aws/simple-s3\": \"^1.1 || ^2.0\",\n                \"aws/aws-sdk-php\": \"^3.295.10\",\n                \"composer/semver\": \"^3.0\",\n                \"ext-fileinfo\": \"*\",\n                \"ext-ftp\": \"*\",\n                \"ext-mongodb\": \"^1.3\",\n                \"ext-zip\": \"*\",\n                \"friendsofphp/php-cs-fixer\": \"^3.5\",\n                \"google/cloud-storage\": \"^1.23\",\n                \"guzzlehttp/psr7\": \"^2.6\",\n                \"microsoft/azure-storage-blob\": \"^1.1\",\n                \"mongodb/mongodb\": \"^1.2\",\n                \"phpseclib/phpseclib\": \"^3.0.36\",\n                \"phpstan/phpstan\": \"^1.10\",\n                \"phpunit/phpunit\": \"^9.5.11|^10.0\",\n                \"sabre/dav\": \"^4.6.0\"\n            },\n            \"time\": \"2024-05-22T10:09:12+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"League\\\\Flysystem\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Frank de Jonge\",\n                    \"email\": \"info@frankdejonge.nl\"\n                }\n            ],\n            \"description\": \"File storage abstraction for PHP\",\n            \"keywords\": [\n                \"WebDAV\",\n                \"aws\",\n                \"cloud\",\n                \"file\",\n                \"files\",\n                \"filesystem\",\n                \"filesystems\",\n                \"ftp\",\n                \"s3\",\n                \"sftp\",\n                \"storage\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/thephpleague/flysystem/issues\",\n                \"source\": \"https://github.com/thephpleague/flysystem/tree/3.28.0\"\n            },\n            \"install-path\": \"../league/flysystem\"\n        },\n        {\n            \"name\": \"league/flysystem-local\",\n            \"version\": \"3.28.0\",\n            \"version_normalized\": \"3.28.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/thephpleague/flysystem-local.git\",\n                \"reference\": \"13f22ea8be526ea58c2ddff9e158ef7c296e4f40\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40\",\n                \"reference\": \"13f22ea8be526ea58c2ddff9e158ef7c296e4f40\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-fileinfo\": \"*\",\n                \"league/flysystem\": \"^3.0.0\",\n                \"league/mime-type-detection\": \"^1.0.0\",\n                \"php\": \"^8.0.2\"\n            },\n            \"time\": \"2024-05-06T20:05:52+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"League\\\\Flysystem\\\\Local\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Frank de Jonge\",\n                    \"email\": \"info@frankdejonge.nl\"\n                }\n            ],\n            \"description\": \"Local filesystem adapter for Flysystem.\",\n            \"keywords\": [\n                \"Flysystem\",\n                \"file\",\n                \"files\",\n                \"filesystem\",\n                \"local\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/thephpleague/flysystem-local/tree/3.28.0\"\n            },\n            \"install-path\": \"../league/flysystem-local\"\n        },\n        {\n            \"name\": \"league/mime-type-detection\",\n            \"version\": \"1.15.0\",\n            \"version_normalized\": \"1.15.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/thephpleague/mime-type-detection.git\",\n                \"reference\": \"ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301\",\n                \"reference\": \"ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-fileinfo\": \"*\",\n                \"php\": \"^7.4 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"friendsofphp/php-cs-fixer\": \"^3.2\",\n                \"phpstan/phpstan\": \"^0.12.68\",\n                \"phpunit/phpunit\": \"^8.5.8 || ^9.3 || ^10.0\"\n            },\n            \"time\": \"2024-01-28T23:22:08+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"League\\\\MimeTypeDetection\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Frank de Jonge\",\n                    \"email\": \"info@frankdejonge.nl\"\n                }\n            ],\n            \"description\": \"Mime-type detection for Flysystem\",\n            \"support\": {\n                \"issues\": \"https://github.com/thephpleague/mime-type-detection/issues\",\n                \"source\": \"https://github.com/thephpleague/mime-type-detection/tree/1.15.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/frankdejonge\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/league/flysystem\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../league/mime-type-detection\"\n        },\n        {\n            \"name\": \"matthiasmullie/scrapbook\",\n            \"version\": \"1.5.3\",\n            \"version_normalized\": \"1.5.3.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/matthiasmullie/scrapbook.git\",\n                \"reference\": \"c339d56e136713aab532718eff453663b4b38efe\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/matthiasmullie/scrapbook/zipball/c339d56e136713aab532718eff453663b4b38efe\",\n                \"reference\": \"c339d56e136713aab532718eff453663b4b38efe\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.0.0\",\n                \"psr/cache\": \"^2.0||^3.0\",\n                \"psr/simple-cache\": \"^2.0||^3.0\"\n            },\n            \"provide\": {\n                \"psr/cache-implementation\": \"^1.0||^2.0||^3.0\",\n                \"psr/simple-cache-implementation\": \"^1.0||^2.0||^3.0\"\n            },\n            \"require-dev\": {\n                \"ext-pcntl\": \"*\",\n                \"friendsofphp/php-cs-fixer\": \">=2.0\",\n                \"phpunit/phpunit\": \">=10.0\",\n                \"squizlabs/php_codesniffer\": \">=3.0\"\n            },\n            \"suggest\": {\n                \"couchbase/couchbase\": \">=3.0\",\n                \"ext-apcu\": \">=4.0.0\",\n                \"ext-couchbase\": \">=3.0.0\",\n                \"ext-memcached\": \">=2.0.0\",\n                \"ext-pdo\": \">=0.1.0\",\n                \"ext-redis\": \">=2.2.0||0.0.0.0\",\n                \"league/flysystem\": \">=1.0\"\n            },\n            \"time\": \"2024-04-02T13:33:01+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"MatthiasMullie\\\\Scrapbook\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Matthias Mullie\",\n                    \"email\": \"scrapbook@mullie.eu\",\n                    \"homepage\": \"https://www.mullie.eu\",\n                    \"role\": \"Developer\"\n                }\n            ],\n            \"description\": \"Scrapbook is a PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APCu, SQL and additional capabilities (e.g. transactions, stampede protection) built on top.\",\n            \"homepage\": \"https://scrapbook.cash\",\n            \"keywords\": [\n                \"Buffer\",\n                \"Flysystem\",\n                \"apc\",\n                \"buffered\",\n                \"cache\",\n                \"caching\",\n                \"commit\",\n                \"couchbase\",\n                \"filesystem\",\n                \"key\",\n                \"memcached\",\n                \"mitigation\",\n                \"mysql\",\n                \"postgresql\",\n                \"protection\",\n                \"psr-16\",\n                \"psr-6\",\n                \"psr-cache\",\n                \"psr-simple-cache\",\n                \"redis\",\n                \"rollback\",\n                \"sql\",\n                \"sqlite\",\n                \"stampede\",\n                \"store\",\n                \"transaction\",\n                \"transactional\",\n                \"value\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/matthiasmullie/scrapbook/issues\",\n                \"source\": \"https://github.com/matthiasmullie/scrapbook/tree/1.5.3\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/matthiasmullie\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"install-path\": \"../matthiasmullie/scrapbook\"\n        },\n        {\n            \"name\": \"psr/cache\",\n            \"version\": \"3.0.0\",\n            \"version_normalized\": \"3.0.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/cache.git\",\n                \"reference\": \"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\",\n                \"reference\": \"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.0.0\"\n            },\n            \"time\": \"2021-02-03T23:26:27+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"1.0.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Cache\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interface for caching libraries\",\n            \"keywords\": [\n                \"cache\",\n                \"psr\",\n                \"psr-6\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/cache/tree/3.0.0\"\n            },\n            \"install-path\": \"../psr/cache\"\n        },\n        {\n            \"name\": \"psr/simple-cache\",\n            \"version\": \"3.0.0\",\n            \"version_normalized\": \"3.0.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/simple-cache.git\",\n                \"reference\": \"764e0b3939f5ca87cb904f570ef9be2d78a07865\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865\",\n                \"reference\": \"764e0b3939f5ca87cb904f570ef9be2d78a07865\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.0.0\"\n            },\n            \"time\": \"2021-10-29T13:26:27+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"3.0.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\SimpleCache\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interfaces for simple caching\",\n            \"keywords\": [\n                \"cache\",\n                \"caching\",\n                \"psr\",\n                \"psr-16\",\n                \"simple-cache\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/simple-cache/tree/3.0.0\"\n            },\n            \"install-path\": \"../psr/simple-cache\"\n        }\n    ],\n    \"dev\": true,\n    \"dev-package-names\": []\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/composer/installed.php",
    "content": "<?php return array (\n  'root' => \n  array (\n    'pretty_version' => '1.0.0+no-version-set',\n    'version' => '1.0.0.0',\n    'aliases' => \n    array (\n    ),\n    'reference' => NULL,\n    'name' => '__root__',\n  ),\n  'versions' => \n  array (\n    '__root__' => \n    array (\n      'pretty_version' => '1.0.0+no-version-set',\n      'version' => '1.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => NULL,\n    ),\n    'league/flysystem' => \n    array (\n      'pretty_version' => '3.28.0',\n      'version' => '3.28.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c',\n    ),\n    'league/flysystem-local' => \n    array (\n      'pretty_version' => '3.28.0',\n      'version' => '3.28.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '13f22ea8be526ea58c2ddff9e158ef7c296e4f40',\n    ),\n    'league/mime-type-detection' => \n    array (\n      'pretty_version' => '1.15.0',\n      'version' => '1.15.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301',\n    ),\n    'matthiasmullie/scrapbook' => \n    array (\n      'pretty_version' => '1.5.3',\n      'version' => '1.5.3.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'c339d56e136713aab532718eff453663b4b38efe',\n    ),\n    'psr/cache' => \n    array (\n      'pretty_version' => '3.0.0',\n      'version' => '3.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf',\n    ),\n    'psr/cache-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '^1.0||^2.0||^3.0',\n      ),\n    ),\n    'psr/simple-cache' => \n    array (\n      'pretty_version' => '3.0.0',\n      'version' => '3.0.0.0',\n      'aliases' => \n      array (\n      ),\n      'reference' => '764e0b3939f5ca87cb904f570ef9be2d78a07865',\n    ),\n    'psr/simple-cache-implementation' => \n    array (\n      'provided' => \n      array (\n        0 => '^1.0||^2.0||^3.0',\n      ),\n    ),\n  ),\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/composer/platform_check.php",
    "content": "<?php\n\n// platform_check.php @generated by Composer\n\n$issues = array();\n\nif ($issues) {\n    if (!headers_sent()) {\n        header('HTTP/1.1 500 Internal Server Error');\n    }\n    if (!ini_get('display_errors')) {\n        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {\n            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);\n        } elseif (!headers_sent()) {\n            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;\n        }\n    }\n    trigger_error(\n        'Composer detected issues in your platform: ' . implode(' ', $issues),\n        E_USER_ERROR\n    );\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/INFO.md",
    "content": "View the docs at: https://flysystem.thephpleague.com/docs/  \nChangelog at: https://github.com/thephpleague/flysystem/blob/3.x/CHANGELOG.md\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/LICENSE",
    "content": "Copyright (c) 2013-2024 Frank de Jonge\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/composer.json",
    "content": "{\n    \"name\": \"league/flysystem\",\n    \"description\": \"File storage abstraction for PHP\",\n    \"keywords\": [\n        \"filesystem\", \"filesystems\", \"files\", \"storage\", \"aws\",\n        \"s3\", \"ftp\", \"sftp\", \"webdav\", \"file\", \"cloud\"\n    ],\n    \"scripts\": {\n        \"phpstan\": \"vendor/bin/phpstan analyse -l 6 src\"\n    },\n    \"type\": \"library\",\n    \"minimum-stability\": \"dev\",\n    \"prefer-stable\": true,\n    \"autoload\": {\n        \"psr-4\": {\n            \"League\\\\Flysystem\\\\\": \"src\"\n        }\n    },\n    \"require\": {\n        \"php\": \"^8.0.2\",\n        \"league/flysystem-local\":  \"^3.0.0\",\n        \"league/mime-type-detection\": \"^1.0.0\"\n    },\n    \"require-dev\": {\n        \"ext-zip\": \"*\",\n        \"ext-fileinfo\": \"*\",\n        \"ext-ftp\": \"*\",\n        \"ext-mongodb\": \"^1.3\",\n        \"microsoft/azure-storage-blob\": \"^1.1\",\n        \"phpunit/phpunit\": \"^9.5.11|^10.0\",\n        \"phpstan/phpstan\": \"^1.10\",\n        \"phpseclib/phpseclib\": \"^3.0.36\",\n        \"aws/aws-sdk-php\": \"^3.295.10\",\n        \"composer/semver\": \"^3.0\",\n        \"friendsofphp/php-cs-fixer\": \"^3.5\",\n        \"google/cloud-storage\": \"^1.23\",\n        \"async-aws/s3\": \"^1.5 || ^2.0\",\n        \"async-aws/simple-s3\": \"^1.1 || ^2.0\",\n        \"mongodb/mongodb\": \"^1.2\",\n        \"sabre/dav\": \"^4.6.0\",\n        \"guzzlehttp/psr7\": \"^2.6\"\n    },\n    \"conflict\": {\n        \"async-aws/core\": \"<1.19.0\",\n        \"async-aws/s3\": \"<1.14.0\",\n        \"symfony/http-client\": \"<5.2\",\n        \"guzzlehttp/ringphp\": \"<1.1.1\",\n        \"guzzlehttp/guzzle\": \"<7.0\",\n        \"aws/aws-sdk-php\": \"3.209.31 || 3.210.0\",\n        \"phpseclib/phpseclib\": \"3.0.15\"\n    },\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Frank de Jonge\",\n            \"email\": \"info@frankdejonge.nl\"\n        }\n    ],\n    \"repositories\": [\n        {\n            \"type\": \"package\",\n            \"package\": {\n                \"name\": \"league/flysystem-local\",\n                \"version\": \"3.0.0\",\n                \"dist\": {\n                    \"type\": \"path\",\n                    \"url\": \"src/Local\"\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/readme.md",
    "content": "# League\\Flysystem\n\n[![Author](https://img.shields.io/badge/author-@frankdejonge-blue.svg)](https://twitter.com/frankdejonge)\n[![Source Code](https://img.shields.io/badge/source-thephpleague/flysystem-blue.svg)](https://github.com/thephpleague/flysystem)\n[![Latest Version](https://img.shields.io/github/tag/thephpleague/flysystem.svg)](https://github.com/thephpleague/flysystem/releases)\n[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://github.com/thephpleague/flysystem/blob/master/LICENSE)\n[![Quality Assurance](https://github.com/thephpleague/flysystem/workflows/Quality%20Assurance/badge.svg?branch=2.x)](https://github.com/thephpleague/flysystem/actions?query=workflow%3A%22Quality+Assurance%22)\n[![Total Downloads](https://img.shields.io/packagist/dt/league/flysystem.svg)](https://packagist.org/packages/league/flysystem)\n![php 7.2+](https://img.shields.io/badge/php-min%208.0.2-red.svg)\n\n## About Flysystem\n\nFlysystem is a file storage library for PHP. It provides one interface to\ninteract with many types of filesystems. When you use Flysystem, you're\nnot only protected from vendor lock-in, you'll also have a consistent experience\nfor which ever storage is right for you. \n\n## Getting Started\n\n* **[New in V3](https://flysystem.thephpleague.com/docs/what-is-new/)**: What is new in Flysystem V2/V3?\n* **[Architecture](https://flysystem.thephpleague.com/docs/architecture/)**: Flysystem's internal architecture\n* **[Flysystem API](https://flysystem.thephpleague.com/docs/usage/filesystem-api/)**: How to interact with your Flysystem instance\n* **[Upgrade from 1x](https://flysystem.thephpleague.com/docs/upgrade-from-1.x/)**: How to upgrade from 1.x/2.x\n\n### Officially supported adapters\n\n* **[Local](https://flysystem.thephpleague.com/docs/adapter/local/)**\n* **[FTP](https://flysystem.thephpleague.com/docs/adapter/ftp/)**\n* **[SFTP](https://flysystem.thephpleague.com/docs/adapter/sftp-v3/)**\n* **[Memory](https://flysystem.thephpleague.com/docs/adapter/in-memory/)**\n* **[AWS S3](https://flysystem.thephpleague.com/docs/adapter/aws-s3-v3/)**\n* **[AsyncAws S3](https://flysystem.thephpleague.com/docs/adapter/async-aws-s3/)**\n* **[Google Cloud Storage](https://flysystem.thephpleague.com/docs/adapter/google-cloud-storage/)**\n* **[Azure Blob Storage](https://flysystem.thephpleague.com/docs/adapter/azure-blob-storage/)**\n* **[WebDAV](https://flysystem.thephpleague.com/docs/adapter/webdav/)**\n* **[ZipArchive](https://flysystem.thephpleague.com/docs/adapter/zip-archive/)**\n\n### Third party Adapters\n\n* **[Gitlab](https://github.com/RoyVoetman/flysystem-gitlab-storage)**\n* **[Google Drive (using regular paths)](https://github.com/masbug/flysystem-google-drive-ext)**\n* **[bunny.net / BunnyCDN](https://github.com/PlatformCommunity/flysystem-bunnycdn/tree/v3)**\n* **[Sharepoint 365 / One Drive (Using MS Graph)](https://github.com/shitware-ltd/flysystem-msgraph)**\n* **[OneDrive](https://github.com/doerffler/flysystem-onedrive)**\n* **[Dropbox](https://github.com/spatie/flysystem-dropbox)**\n* **[ReplicateAdapter](https://github.com/ajgarlag/flysystem-replicate)**\n* **[Uploadcare](https://github.com/vormkracht10/flysystem-uploadcare)**\n* **[Useful adapters (FallbackAdapter, LogAdapter, ReadWriteAdapter, RetryAdapter)](https://github.com/ElGigi/FlysystemUsefulAdapters)**\n\nYou can always [create an adapter](https://flysystem.thephpleague.com/docs/advanced/creating-an-adapter/) yourself.\n\n## Security\n\nIf you discover any security related issues, please email info@frankdejonge.nl instead of using the issue tracker.\n\n## Enjoy\n\nOh, and if you've come down this far, you might as well follow me on [twitter](https://twitter.com/frankdejonge).\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/CalculateChecksumFromStream.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse function hash_final;\nuse function hash_init;\nuse function hash_update_stream;\n\ntrait CalculateChecksumFromStream\n{\n    private function calculateChecksumFromStream(string $path, Config $config): string\n    {\n        try {\n            $stream = $this->readStream($path);\n            $algo = (string) $config->get('checksum_algo', 'md5');\n            $context = hash_init($algo);\n            hash_update_stream($context, $stream);\n\n            return hash_final($context);\n        } catch (FilesystemException $exception) {\n            throw new UnableToProvideChecksum($exception->getMessage(), $path, $exception);\n        }\n    }\n\n    /**\n     * @return resource\n     */\n    abstract public function readStream(string $path);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/ChecksumAlgoIsNotSupported.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse InvalidArgumentException;\n\nfinal class ChecksumAlgoIsNotSupported extends InvalidArgumentException\n{\n\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/ChecksumProvider.php",
    "content": "<?php\n\nnamespace League\\Flysystem;\n\ninterface ChecksumProvider\n{\n    /**\n     * @return string MD5 hash of the file contents\n     *\n     * @throws UnableToProvideChecksum\n     * @throws ChecksumAlgoIsNotSupported\n     */\n    public function checksum(string $path, Config $config): string;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/Config.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse function array_diff_key;\nuse function array_flip;\nuse function array_merge;\n\nclass Config\n{\n    public const OPTION_COPY_IDENTICAL_PATH = 'copy_destination_same_as_source';\n    public const OPTION_MOVE_IDENTICAL_PATH = 'move_destination_same_as_source';\n    public const OPTION_VISIBILITY = 'visibility';\n    public const OPTION_DIRECTORY_VISIBILITY = 'directory_visibility';\n    public const OPTION_RETAIN_VISIBILITY = 'retain_visibility';\n\n    public function __construct(private array $options = [])\n    {\n    }\n\n    /**\n     * @param mixed $default\n     *\n     * @return mixed\n     */\n    public function get(string $property, $default = null)\n    {\n        return $this->options[$property] ?? $default;\n    }\n\n    public function extend(array $options): Config\n    {\n        return new Config(array_merge($this->options, $options));\n    }\n\n    public function withDefaults(array $defaults): Config\n    {\n        return new Config($this->options + $defaults);\n    }\n\n    public function toArray(): array\n    {\n        return $this->options;\n    }\n\n    public function withSetting(string $property, mixed $setting): Config\n    {\n        return $this->extend([$property => $setting]);\n    }\n\n    public function withoutSettings(string ...$settings): Config\n    {\n        return new Config(array_diff_key($this->options, array_flip($settings)));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/CorruptedPathDetected.php",
    "content": "<?php\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\n\nfinal class CorruptedPathDetected extends RuntimeException implements FilesystemException\n{\n    public static function forPath(string $path): CorruptedPathDetected\n    {\n        return new CorruptedPathDetected(\"Corrupted path detected: \" . $path);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/DecoratedAdapter.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nabstract class DecoratedAdapter implements FilesystemAdapter\n{\n    public function __construct(protected FilesystemAdapter $adapter)\n    {\n    }\n\n    public function fileExists(string $path): bool\n    {\n        return $this->adapter->fileExists($path);\n    }\n\n    public function directoryExists(string $path): bool\n    {\n        return $this->adapter->directoryExists($path);\n    }\n\n    public function write(string $path, string $contents, Config $config): void\n    {\n        $this->adapter->write($path, $contents, $config);\n    }\n\n    public function writeStream(string $path, $contents, Config $config): void\n    {\n        $this->adapter->writeStream($path, $contents, $config);\n    }\n\n    public function read(string $path): string\n    {\n        return $this->adapter->read($path);\n    }\n\n    public function readStream(string $path)\n    {\n        return $this->adapter->readStream($path);\n    }\n\n    public function delete(string $path): void\n    {\n        $this->adapter->delete($path);\n    }\n\n    public function deleteDirectory(string $path): void\n    {\n        $this->adapter->deleteDirectory($path);\n    }\n\n    public function createDirectory(string $path, Config $config): void\n    {\n        $this->adapter->createDirectory($path, $config);\n    }\n\n    public function setVisibility(string $path, string $visibility): void\n    {\n        $this->adapter->setVisibility($path, $visibility);\n    }\n\n    public function visibility(string $path): FileAttributes\n    {\n        return $this->adapter->visibility($path);\n    }\n\n    public function mimeType(string $path): FileAttributes\n    {\n        return $this->adapter->mimeType($path);\n    }\n\n    public function lastModified(string $path): FileAttributes\n    {\n        return $this->adapter->lastModified($path);\n    }\n\n    public function fileSize(string $path): FileAttributes\n    {\n        return $this->adapter->fileSize($path);\n    }\n\n    public function listContents(string $path, bool $deep): iterable\n    {\n        return $this->adapter->listContents($path, $deep);\n    }\n\n    public function move(string $source, string $destination, Config $config): void\n    {\n        $this->adapter->move($source, $destination, $config);\n    }\n\n    public function copy(string $source, string $destination, Config $config): void\n    {\n        $this->adapter->copy($source, $destination, $config);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/DirectoryAttributes.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nclass DirectoryAttributes implements StorageAttributes\n{\n    use ProxyArrayAccessToProperties;\n    private string $type = StorageAttributes::TYPE_DIRECTORY;\n\n    public function __construct(\n        private string $path,\n        private ?string $visibility = null,\n        private ?int $lastModified = null,\n        private array $extraMetadata = []\n    ) {\n        $this->path = trim($this->path, '/');\n    }\n\n    public function path(): string\n    {\n        return $this->path;\n    }\n\n    public function type(): string\n    {\n        return $this->type;\n    }\n\n    public function visibility(): ?string\n    {\n        return $this->visibility;\n    }\n\n    public function lastModified(): ?int\n    {\n        return $this->lastModified;\n    }\n\n    public function extraMetadata(): array\n    {\n        return $this->extraMetadata;\n    }\n\n    public function isFile(): bool\n    {\n        return false;\n    }\n\n    public function isDir(): bool\n    {\n        return true;\n    }\n\n    public function withPath(string $path): self\n    {\n        $clone = clone $this;\n        $clone->path = $path;\n\n        return $clone;\n    }\n\n    public static function fromArray(array $attributes): self\n    {\n        return new DirectoryAttributes(\n            $attributes[StorageAttributes::ATTRIBUTE_PATH],\n            $attributes[StorageAttributes::ATTRIBUTE_VISIBILITY] ?? null,\n            $attributes[StorageAttributes::ATTRIBUTE_LAST_MODIFIED] ?? null,\n            $attributes[StorageAttributes::ATTRIBUTE_EXTRA_METADATA] ?? []\n        );\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function jsonSerialize(): array\n    {\n        return [\n            StorageAttributes::ATTRIBUTE_TYPE => $this->type,\n            StorageAttributes::ATTRIBUTE_PATH => $this->path,\n            StorageAttributes::ATTRIBUTE_VISIBILITY => $this->visibility,\n            StorageAttributes::ATTRIBUTE_LAST_MODIFIED => $this->lastModified,\n            StorageAttributes::ATTRIBUTE_EXTRA_METADATA => $this->extraMetadata,\n        ];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/DirectoryListing.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse ArrayIterator;\nuse Generator;\nuse IteratorAggregate;\nuse Traversable;\n\n/**\n * @template T\n */\nclass DirectoryListing implements IteratorAggregate\n{\n    /**\n     * @param iterable<T> $listing\n     */\n    public function __construct(private iterable $listing)\n    {\n    }\n\n    /**\n     * @param callable(T): bool $filter\n     *\n     * @return DirectoryListing<T>\n     */\n    public function filter(callable $filter): DirectoryListing\n    {\n        $generator = (static function (iterable $listing) use ($filter): Generator {\n            foreach ($listing as $item) {\n                if ($filter($item)) {\n                    yield $item;\n                }\n            }\n        })($this->listing);\n\n        return new DirectoryListing($generator);\n    }\n\n    /**\n     * @template R\n     *\n     * @param callable(T): R $mapper\n     *\n     * @return DirectoryListing<R>\n     */\n    public function map(callable $mapper): DirectoryListing\n    {\n        $generator = (static function (iterable $listing) use ($mapper): Generator {\n            foreach ($listing as $item) {\n                yield $mapper($item);\n            }\n        })($this->listing);\n\n        return new DirectoryListing($generator);\n    }\n\n    /**\n     * @return DirectoryListing<T>\n     */\n    public function sortByPath(): DirectoryListing\n    {\n        $listing = $this->toArray();\n\n        usort($listing, function (StorageAttributes $a, StorageAttributes $b) {\n            return $a->path() <=> $b->path();\n        });\n\n        return new DirectoryListing($listing);\n    }\n\n    /**\n     * @return Traversable<T>\n     */\n    public function getIterator(): Traversable\n    {\n        return $this->listing instanceof Traversable\n            ? $this->listing\n            : new ArrayIterator($this->listing);\n    }\n\n    /**\n     * @return T[]\n     */\n    public function toArray(): array\n    {\n        return $this->listing instanceof Traversable\n            ? iterator_to_array($this->listing, false)\n            : (array) $this->listing;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/FileAttributes.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nclass FileAttributes implements StorageAttributes\n{\n    use ProxyArrayAccessToProperties;\n    private string $type = StorageAttributes::TYPE_FILE;\n\n    public function __construct(\n        private string $path,\n        private ?int $fileSize = null,\n        private ?string $visibility = null,\n        private ?int $lastModified = null,\n        private ?string $mimeType = null,\n        private array $extraMetadata = []\n    ) {\n        $this->path = ltrim($this->path, '/');\n    }\n\n    public function type(): string\n    {\n        return $this->type;\n    }\n\n    public function path(): string\n    {\n        return $this->path;\n    }\n\n    public function fileSize(): ?int\n    {\n        return $this->fileSize;\n    }\n\n    public function visibility(): ?string\n    {\n        return $this->visibility;\n    }\n\n    public function lastModified(): ?int\n    {\n        return $this->lastModified;\n    }\n\n    public function mimeType(): ?string\n    {\n        return $this->mimeType;\n    }\n\n    public function extraMetadata(): array\n    {\n        return $this->extraMetadata;\n    }\n\n    public function isFile(): bool\n    {\n        return true;\n    }\n\n    public function isDir(): bool\n    {\n        return false;\n    }\n\n    public function withPath(string $path): self\n    {\n        $clone = clone $this;\n        $clone->path = $path;\n\n        return $clone;\n    }\n\n    public static function fromArray(array $attributes): self\n    {\n        return new FileAttributes(\n            $attributes[StorageAttributes::ATTRIBUTE_PATH],\n            $attributes[StorageAttributes::ATTRIBUTE_FILE_SIZE] ?? null,\n            $attributes[StorageAttributes::ATTRIBUTE_VISIBILITY] ?? null,\n            $attributes[StorageAttributes::ATTRIBUTE_LAST_MODIFIED] ?? null,\n            $attributes[StorageAttributes::ATTRIBUTE_MIME_TYPE] ?? null,\n            $attributes[StorageAttributes::ATTRIBUTE_EXTRA_METADATA] ?? []\n        );\n    }\n\n    public function jsonSerialize(): array\n    {\n        return [\n            StorageAttributes::ATTRIBUTE_TYPE => self::TYPE_FILE,\n            StorageAttributes::ATTRIBUTE_PATH => $this->path,\n            StorageAttributes::ATTRIBUTE_FILE_SIZE => $this->fileSize,\n            StorageAttributes::ATTRIBUTE_VISIBILITY => $this->visibility,\n            StorageAttributes::ATTRIBUTE_LAST_MODIFIED => $this->lastModified,\n            StorageAttributes::ATTRIBUTE_MIME_TYPE => $this->mimeType,\n            StorageAttributes::ATTRIBUTE_EXTRA_METADATA => $this->extraMetadata,\n        ];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/Filesystem.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse DateTimeInterface;\nuse Generator;\nuse League\\Flysystem\\UrlGeneration\\PrefixPublicUrlGenerator;\nuse League\\Flysystem\\UrlGeneration\\PublicUrlGenerator;\nuse League\\Flysystem\\UrlGeneration\\ShardedPrefixPublicUrlGenerator;\nuse League\\Flysystem\\UrlGeneration\\TemporaryUrlGenerator;\nuse Throwable;\n\nuse function array_key_exists;\nuse function is_array;\n\nclass Filesystem implements FilesystemOperator\n{\n    use CalculateChecksumFromStream;\n\n    private Config $config;\n    private PathNormalizer $pathNormalizer;\n\n    public function __construct(\n        private FilesystemAdapter $adapter,\n        array $config = [],\n        ?PathNormalizer $pathNormalizer = null,\n        private ?PublicUrlGenerator $publicUrlGenerator = null,\n        private ?TemporaryUrlGenerator $temporaryUrlGenerator = null,\n    ) {\n        $this->config = new Config($config);\n        $this->pathNormalizer = $pathNormalizer ?? new WhitespacePathNormalizer();\n    }\n\n    public function fileExists(string $location): bool\n    {\n        return $this->adapter->fileExists($this->pathNormalizer->normalizePath($location));\n    }\n\n    public function directoryExists(string $location): bool\n    {\n        return $this->adapter->directoryExists($this->pathNormalizer->normalizePath($location));\n    }\n\n    public function has(string $location): bool\n    {\n        $path = $this->pathNormalizer->normalizePath($location);\n\n        return $this->adapter->fileExists($path) || $this->adapter->directoryExists($path);\n    }\n\n    public function write(string $location, string $contents, array $config = []): void\n    {\n        $this->adapter->write(\n            $this->pathNormalizer->normalizePath($location),\n            $contents,\n            $this->config->extend($config)\n        );\n    }\n\n    public function writeStream(string $location, $contents, array $config = []): void\n    {\n        /* @var resource $contents */\n        $this->assertIsResource($contents);\n        $this->rewindStream($contents);\n        $this->adapter->writeStream(\n            $this->pathNormalizer->normalizePath($location),\n            $contents,\n            $this->config->extend($config)\n        );\n    }\n\n    public function read(string $location): string\n    {\n        return $this->adapter->read($this->pathNormalizer->normalizePath($location));\n    }\n\n    public function readStream(string $location)\n    {\n        return $this->adapter->readStream($this->pathNormalizer->normalizePath($location));\n    }\n\n    public function delete(string $location): void\n    {\n        $this->adapter->delete($this->pathNormalizer->normalizePath($location));\n    }\n\n    public function deleteDirectory(string $location): void\n    {\n        $this->adapter->deleteDirectory($this->pathNormalizer->normalizePath($location));\n    }\n\n    public function createDirectory(string $location, array $config = []): void\n    {\n        $this->adapter->createDirectory(\n            $this->pathNormalizer->normalizePath($location),\n            $this->config->extend($config)\n        );\n    }\n\n    public function listContents(string $location, bool $deep = self::LIST_SHALLOW): DirectoryListing\n    {\n        $path = $this->pathNormalizer->normalizePath($location);\n        $listing = $this->adapter->listContents($path, $deep);\n\n        return new DirectoryListing($this->pipeListing($location, $deep, $listing));\n    }\n\n    private function pipeListing(string $location, bool $deep, iterable $listing): Generator\n    {\n        try {\n            foreach ($listing as $item) {\n                yield $item;\n            }\n        } catch (Throwable $exception) {\n            throw UnableToListContents::atLocation($location, $deep, $exception);\n        }\n    }\n\n    public function move(string $source, string $destination, array $config = []): void\n    {\n        $config = $this->resolveConfigForMoveAndCopy($config);\n        $from = $this->pathNormalizer->normalizePath($source);\n        $to = $this->pathNormalizer->normalizePath($destination);\n\n        if ($from === $to) {\n            $resolutionStrategy = $config->get(Config::OPTION_MOVE_IDENTICAL_PATH, ResolveIdenticalPathConflict::TRY);\n\n            if ($resolutionStrategy === ResolveIdenticalPathConflict::FAIL) {\n                throw UnableToMoveFile::sourceAndDestinationAreTheSame($source, $destination);\n            } elseif ($resolutionStrategy === ResolveIdenticalPathConflict::IGNORE) {\n                return;\n            }\n        }\n\n        $this->adapter->move($from, $to, $config);\n    }\n\n    public function copy(string $source, string $destination, array $config = []): void\n    {\n        $config = $this->resolveConfigForMoveAndCopy($config);\n        $from = $this->pathNormalizer->normalizePath($source);\n        $to = $this->pathNormalizer->normalizePath($destination);\n\n        if ($from === $to) {\n            $resolutionStrategy = $config->get(Config::OPTION_COPY_IDENTICAL_PATH, ResolveIdenticalPathConflict::TRY);\n\n            if ($resolutionStrategy === ResolveIdenticalPathConflict::FAIL) {\n                throw UnableToCopyFile::sourceAndDestinationAreTheSame($source, $destination);\n            } elseif ($resolutionStrategy === ResolveIdenticalPathConflict::IGNORE) {\n                return;\n            }\n        }\n\n        $this->adapter->copy($from, $to, $config);\n    }\n\n    public function lastModified(string $path): int\n    {\n        return $this->adapter->lastModified($this->pathNormalizer->normalizePath($path))->lastModified();\n    }\n\n    public function fileSize(string $path): int\n    {\n        return $this->adapter->fileSize($this->pathNormalizer->normalizePath($path))->fileSize();\n    }\n\n    public function mimeType(string $path): string\n    {\n        return $this->adapter->mimeType($this->pathNormalizer->normalizePath($path))->mimeType();\n    }\n\n    public function setVisibility(string $path, string $visibility): void\n    {\n        $this->adapter->setVisibility($this->pathNormalizer->normalizePath($path), $visibility);\n    }\n\n    public function visibility(string $path): string\n    {\n        return $this->adapter->visibility($this->pathNormalizer->normalizePath($path))->visibility();\n    }\n\n    public function publicUrl(string $path, array $config = []): string\n    {\n        $this->publicUrlGenerator ??= $this->resolvePublicUrlGenerator()\n            ?? throw UnableToGeneratePublicUrl::noGeneratorConfigured($path);\n        $config = $this->config->extend($config);\n\n        return $this->publicUrlGenerator->publicUrl($this->pathNormalizer->normalizePath($path), $config);\n    }\n\n    public function temporaryUrl(string $path, DateTimeInterface $expiresAt, array $config = []): string\n    {\n        $generator = $this->temporaryUrlGenerator ?? $this->adapter;\n\n        if ($generator instanceof TemporaryUrlGenerator) {\n            return $generator->temporaryUrl(\n                $this->pathNormalizer->normalizePath($path),\n                $expiresAt,\n                $this->config->extend($config)\n            );\n        }\n\n        throw UnableToGenerateTemporaryUrl::noGeneratorConfigured($path);\n    }\n\n    public function checksum(string $path, array $config = []): string\n    {\n        $config = $this->config->extend($config);\n\n        if ( ! $this->adapter instanceof ChecksumProvider) {\n            return $this->calculateChecksumFromStream($path, $config);\n        }\n\n        try {\n            return $this->adapter->checksum($path, $config);\n        } catch (ChecksumAlgoIsNotSupported) {\n            return $this->calculateChecksumFromStream($path, $config);\n        }\n    }\n\n    private function resolvePublicUrlGenerator(): ?PublicUrlGenerator\n    {\n        if ($publicUrl = $this->config->get('public_url')) {\n            return match (true) {\n                is_array($publicUrl) => new ShardedPrefixPublicUrlGenerator($publicUrl),\n                default => new PrefixPublicUrlGenerator($publicUrl),\n            };\n        }\n\n        if ($this->adapter instanceof PublicUrlGenerator) {\n            return $this->adapter;\n        }\n\n        return null;\n    }\n\n    /**\n     * @param mixed $contents\n     */\n    private function assertIsResource($contents): void\n    {\n        if (is_resource($contents) === false) {\n            throw new InvalidStreamProvided(\n                \"Invalid stream provided, expected stream resource, received \" . gettype($contents)\n            );\n        } elseif ($type = get_resource_type($contents) !== 'stream') {\n            throw new InvalidStreamProvided(\n                \"Invalid stream provided, expected stream resource, received resource of type \" . $type\n            );\n        }\n    }\n\n    /**\n     * @param resource $resource\n     */\n    private function rewindStream($resource): void\n    {\n        if (ftell($resource) !== 0 && stream_get_meta_data($resource)['seekable']) {\n            rewind($resource);\n        }\n    }\n\n    private function resolveConfigForMoveAndCopy(array $config): Config\n    {\n        $retainVisibility = $this->config->get(Config::OPTION_RETAIN_VISIBILITY, $config[Config::OPTION_RETAIN_VISIBILITY] ?? true);\n        $fullConfig = $this->config->extend($config);\n\n        /*\n         * By default, we retain visibility. When we do not retain visibility, the visibility setting\n         * from the default configuration is ignored. Only when it is set explicitly, we propagate the\n         * setting.\n         */\n        if ($retainVisibility && ! array_key_exists(Config::OPTION_VISIBILITY, $config)) {\n            $fullConfig = $fullConfig->withoutSettings(Config::OPTION_VISIBILITY)->extend($config);\n        }\n\n        return $fullConfig;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/FilesystemAdapter.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\ninterface FilesystemAdapter\n{\n    /**\n     * @throws FilesystemException\n     * @throws UnableToCheckExistence\n     */\n    public function fileExists(string $path): bool;\n\n    /**\n     * @throws FilesystemException\n     * @throws UnableToCheckExistence\n     */\n    public function directoryExists(string $path): bool;\n\n    /**\n     * @throws UnableToWriteFile\n     * @throws FilesystemException\n     */\n    public function write(string $path, string $contents, Config $config): void;\n\n    /**\n     * @param resource $contents\n     *\n     * @throws UnableToWriteFile\n     * @throws FilesystemException\n     */\n    public function writeStream(string $path, $contents, Config $config): void;\n\n    /**\n     * @throws UnableToReadFile\n     * @throws FilesystemException\n     */\n    public function read(string $path): string;\n\n    /**\n     * @return resource\n     *\n     * @throws UnableToReadFile\n     * @throws FilesystemException\n     */\n    public function readStream(string $path);\n\n    /**\n     * @throws UnableToDeleteFile\n     * @throws FilesystemException\n     */\n    public function delete(string $path): void;\n\n    /**\n     * @throws UnableToDeleteDirectory\n     * @throws FilesystemException\n     */\n    public function deleteDirectory(string $path): void;\n\n    /**\n     * @throws UnableToCreateDirectory\n     * @throws FilesystemException\n     */\n    public function createDirectory(string $path, Config $config): void;\n\n    /**\n     * @throws InvalidVisibilityProvided\n     * @throws FilesystemException\n     */\n    public function setVisibility(string $path, string $visibility): void;\n\n    /**\n     * @throws UnableToRetrieveMetadata\n     * @throws FilesystemException\n     */\n    public function visibility(string $path): FileAttributes;\n\n    /**\n     * @throws UnableToRetrieveMetadata\n     * @throws FilesystemException\n     */\n    public function mimeType(string $path): FileAttributes;\n\n    /**\n     * @throws UnableToRetrieveMetadata\n     * @throws FilesystemException\n     */\n    public function lastModified(string $path): FileAttributes;\n\n    /**\n     * @throws UnableToRetrieveMetadata\n     * @throws FilesystemException\n     */\n    public function fileSize(string $path): FileAttributes;\n\n    /**\n     * @return iterable<StorageAttributes>\n     *\n     * @throws FilesystemException\n     */\n    public function listContents(string $path, bool $deep): iterable;\n\n    /**\n     * @throws UnableToMoveFile\n     * @throws FilesystemException\n     */\n    public function move(string $source, string $destination, Config $config): void;\n\n    /**\n     * @throws UnableToCopyFile\n     * @throws FilesystemException\n     */\n    public function copy(string $source, string $destination, Config $config): void;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/FilesystemException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse Throwable;\n\ninterface FilesystemException extends Throwable\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/FilesystemOperationFailed.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\ninterface FilesystemOperationFailed extends FilesystemException\n{\n    public const OPERATION_WRITE = 'WRITE';\n    public const OPERATION_UPDATE = 'UPDATE'; // not used\n    public const OPERATION_EXISTENCE_CHECK = 'EXISTENCE_CHECK';\n    public const OPERATION_DIRECTORY_EXISTS = 'DIRECTORY_EXISTS';\n    public const OPERATION_FILE_EXISTS = 'FILE_EXISTS';\n    public const OPERATION_CREATE_DIRECTORY = 'CREATE_DIRECTORY';\n    public const OPERATION_DELETE = 'DELETE';\n    public const OPERATION_DELETE_DIRECTORY = 'DELETE_DIRECTORY';\n    public const OPERATION_MOVE = 'MOVE';\n    public const OPERATION_RETRIEVE_METADATA = 'RETRIEVE_METADATA';\n    public const OPERATION_COPY = 'COPY';\n    public const OPERATION_READ = 'READ';\n    public const OPERATION_SET_VISIBILITY = 'SET_VISIBILITY';\n    public const OPERATION_LIST_CONTENTS = 'LIST_CONTENTS';\n\n    public function operation(): string;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/FilesystemOperator.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\ninterface FilesystemOperator extends FilesystemReader, FilesystemWriter\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/FilesystemReader.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse DateTimeInterface;\n\n/**\n * This interface contains everything to read from and inspect\n * a filesystem. All methods containing are non-destructive.\n *\n * @method string publicUrl(string $path, array $config = []) Will be added in 4.0\n * @method string temporaryUrl(string $path, DateTimeInterface $expiresAt, array $config = []) Will be added in 4.0\n * @method string checksum(string $path, array $config = []) Will be added in 4.0\n */\ninterface FilesystemReader\n{\n    public const LIST_SHALLOW = false;\n    public const LIST_DEEP = true;\n\n    /**\n     * @throws FilesystemException\n     * @throws UnableToCheckExistence\n     */\n    public function fileExists(string $location): bool;\n\n    /**\n     * @throws FilesystemException\n     * @throws UnableToCheckExistence\n     */\n    public function directoryExists(string $location): bool;\n\n    /**\n     * @throws FilesystemException\n     * @throws UnableToCheckExistence\n     */\n    public function has(string $location): bool;\n\n    /**\n     * @throws UnableToReadFile\n     * @throws FilesystemException\n     */\n    public function read(string $location): string;\n\n    /**\n     * @return resource\n     *\n     * @throws UnableToReadFile\n     * @throws FilesystemException\n     */\n    public function readStream(string $location);\n\n    /**\n     * @return DirectoryListing<StorageAttributes>\n     *\n     * @throws FilesystemException\n     * @throws UnableToListContents\n     */\n    public function listContents(string $location, bool $deep = self::LIST_SHALLOW): DirectoryListing;\n\n    /**\n     * @throws UnableToRetrieveMetadata\n     * @throws FilesystemException\n     */\n    public function lastModified(string $path): int;\n\n    /**\n     * @throws UnableToRetrieveMetadata\n     * @throws FilesystemException\n     */\n    public function fileSize(string $path): int;\n\n    /**\n     * @throws UnableToRetrieveMetadata\n     * @throws FilesystemException\n     */\n    public function mimeType(string $path): string;\n\n    /**\n     * @throws UnableToRetrieveMetadata\n     * @throws FilesystemException\n     */\n    public function visibility(string $path): string;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/FilesystemWriter.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\ninterface FilesystemWriter\n{\n    /**\n     * @throws UnableToWriteFile\n     * @throws FilesystemException\n     */\n    public function write(string $location, string $contents, array $config = []): void;\n\n    /**\n     * @param mixed $contents\n     *\n     * @throws UnableToWriteFile\n     * @throws FilesystemException\n     */\n    public function writeStream(string $location, $contents, array $config = []): void;\n\n    /**\n     * @throws UnableToSetVisibility\n     * @throws FilesystemException\n     */\n    public function setVisibility(string $path, string $visibility): void;\n\n    /**\n     * @throws UnableToDeleteFile\n     * @throws FilesystemException\n     */\n    public function delete(string $location): void;\n\n    /**\n     * @throws UnableToDeleteDirectory\n     * @throws FilesystemException\n     */\n    public function deleteDirectory(string $location): void;\n\n    /**\n     * @throws UnableToCreateDirectory\n     * @throws FilesystemException\n     */\n    public function createDirectory(string $location, array $config = []): void;\n\n    /**\n     * @throws UnableToMoveFile\n     * @throws FilesystemException\n     */\n    public function move(string $source, string $destination, array $config = []): void;\n\n    /**\n     * @throws UnableToCopyFile\n     * @throws FilesystemException\n     */\n    public function copy(string $source, string $destination, array $config = []): void;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/InvalidStreamProvided.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse InvalidArgumentException as BaseInvalidArgumentException;\n\nclass InvalidStreamProvided extends BaseInvalidArgumentException implements FilesystemException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/InvalidVisibilityProvided.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse InvalidArgumentException;\n\nuse function var_export;\n\nclass InvalidVisibilityProvided extends InvalidArgumentException implements FilesystemException\n{\n    public static function withVisibility(string $visibility, string $expectedMessage): InvalidVisibilityProvided\n    {\n        $provided = var_export($visibility, true);\n        $message = \"Invalid visibility provided. Expected {$expectedMessage}, received {$provided}\";\n\n        throw new InvalidVisibilityProvided($message);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/MountManager.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse DateTimeInterface;\nuse Throwable;\n\nuse function compact;\nuse function method_exists;\nuse function sprintf;\n\nclass MountManager implements FilesystemOperator\n{\n    /**\n     * @var array<string, FilesystemOperator>\n     */\n    private $filesystems = [];\n\n    /**\n     * @var Config\n     */\n    private $config;\n\n    /**\n     * MountManager constructor.\n     *\n     * @param array<string,FilesystemOperator> $filesystems\n     */\n    public function __construct(array $filesystems = [], array $config = [])\n    {\n        $this->mountFilesystems($filesystems);\n        $this->config = new Config($config);\n    }\n\n    /**\n     * It is not recommended to mount filesystems after creation because interacting\n     * with the Mount Manager becomes unpredictable. Use this as an escape hatch.\n     */\n    public function dangerouslyMountFilesystems(string $key, FilesystemOperator $filesystem): void\n    {\n        $this->mountFilesystem($key, $filesystem);\n    }\n\n    /**\n     * @param array<string,FilesystemOperator> $filesystems\n     */\n    public function extend(array $filesystems, array $config = []): MountManager\n    {\n        $clone = clone $this;\n        $clone->config = $this->config->extend($config);\n        $clone->mountFilesystems($filesystems);\n\n        return $clone;\n    }\n\n    public function fileExists(string $location): bool\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            return $filesystem->fileExists($path);\n        } catch (Throwable $exception) {\n            throw UnableToCheckFileExistence::forLocation($location, $exception);\n        }\n    }\n\n    public function has(string $location): bool\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            return $filesystem->fileExists($path) || $filesystem->directoryExists($path);\n        } catch (Throwable $exception) {\n            throw UnableToCheckExistence::forLocation($location, $exception);\n        }\n    }\n\n    public function directoryExists(string $location): bool\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            return $filesystem->directoryExists($path);\n        } catch (Throwable $exception) {\n            throw UnableToCheckDirectoryExistence::forLocation($location, $exception);\n        }\n    }\n\n    public function read(string $location): string\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            return $filesystem->read($path);\n        } catch (UnableToReadFile $exception) {\n            throw UnableToReadFile::fromLocation($location, $exception->reason(), $exception);\n        }\n    }\n\n    public function readStream(string $location)\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            return $filesystem->readStream($path);\n        } catch (UnableToReadFile $exception) {\n            throw UnableToReadFile::fromLocation($location, $exception->reason(), $exception);\n        }\n    }\n\n    public function listContents(string $location, bool $deep = self::LIST_SHALLOW): DirectoryListing\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path, $mountIdentifier] = $this->determineFilesystemAndPath($location);\n\n        return\n            $filesystem\n                ->listContents($path, $deep)\n                ->map(\n                    function (StorageAttributes $attributes) use ($mountIdentifier) {\n                        return $attributes->withPath(sprintf('%s://%s', $mountIdentifier, $attributes->path()));\n                    }\n                );\n    }\n\n    public function lastModified(string $location): int\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            return $filesystem->lastModified($path);\n        } catch (UnableToRetrieveMetadata $exception) {\n            throw UnableToRetrieveMetadata::lastModified($location, $exception->reason(), $exception);\n        }\n    }\n\n    public function fileSize(string $location): int\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            return $filesystem->fileSize($path);\n        } catch (UnableToRetrieveMetadata $exception) {\n            throw UnableToRetrieveMetadata::fileSize($location, $exception->reason(), $exception);\n        }\n    }\n\n    public function mimeType(string $location): string\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            return $filesystem->mimeType($path);\n        } catch (UnableToRetrieveMetadata $exception) {\n            throw UnableToRetrieveMetadata::mimeType($location, $exception->reason(), $exception);\n        }\n    }\n\n    public function visibility(string $path): string\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $location] = $this->determineFilesystemAndPath($path);\n\n        try {\n            return $filesystem->visibility($location);\n        } catch (UnableToRetrieveMetadata $exception) {\n            throw UnableToRetrieveMetadata::visibility($path, $exception->reason(), $exception);\n        }\n    }\n\n    public function write(string $location, string $contents, array $config = []): void\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            $filesystem->write($path, $contents, $this->config->extend($config)->toArray());\n        } catch (UnableToWriteFile $exception) {\n            throw UnableToWriteFile::atLocation($location, $exception->reason(), $exception);\n        }\n    }\n\n    public function writeStream(string $location, $contents, array $config = []): void\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n        $filesystem->writeStream($path, $contents, $this->config->extend($config)->toArray());\n    }\n\n    public function setVisibility(string $path, string $visibility): void\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($path);\n        $filesystem->setVisibility($path, $visibility);\n    }\n\n    public function delete(string $location): void\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            $filesystem->delete($path);\n        } catch (UnableToDeleteFile $exception) {\n            throw UnableToDeleteFile::atLocation($location, $exception->reason(), $exception);\n        }\n    }\n\n    public function deleteDirectory(string $location): void\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            $filesystem->deleteDirectory($path);\n        } catch (UnableToDeleteDirectory $exception) {\n            throw UnableToDeleteDirectory::atLocation($location, $exception->reason(), $exception);\n        }\n    }\n\n    public function createDirectory(string $location, array $config = []): void\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($location);\n\n        try {\n            $filesystem->createDirectory($path, $this->config->extend($config)->toArray());\n        } catch (UnableToCreateDirectory $exception) {\n            throw UnableToCreateDirectory::dueToFailure($location, $exception);\n        }\n    }\n\n    public function move(string $source, string $destination, array $config = []): void\n    {\n        /** @var FilesystemOperator $sourceFilesystem */\n        /* @var FilesystemOperator $destinationFilesystem */\n        [$sourceFilesystem, $sourcePath] = $this->determineFilesystemAndPath($source);\n        [$destinationFilesystem, $destinationPath] = $this->determineFilesystemAndPath($destination);\n\n        $sourceFilesystem === $destinationFilesystem ? $this->moveInTheSameFilesystem(\n            $sourceFilesystem,\n            $sourcePath,\n            $destinationPath,\n            $source,\n            $destination,\n            $config,\n        ) : $this->moveAcrossFilesystems($source, $destination, $config);\n    }\n\n    public function copy(string $source, string $destination, array $config = []): void\n    {\n        /** @var FilesystemOperator $sourceFilesystem */\n        /* @var FilesystemOperator $destinationFilesystem */\n        [$sourceFilesystem, $sourcePath] = $this->determineFilesystemAndPath($source);\n        [$destinationFilesystem, $destinationPath] = $this->determineFilesystemAndPath($destination);\n\n        $sourceFilesystem === $destinationFilesystem ? $this->copyInSameFilesystem(\n            $sourceFilesystem,\n            $sourcePath,\n            $destinationPath,\n            $source,\n            $destination,\n            $config,\n        ) : $this->copyAcrossFilesystem(\n            $sourceFilesystem,\n            $sourcePath,\n            $destinationFilesystem,\n            $destinationPath,\n            $source,\n            $destination,\n            $config,\n        );\n    }\n\n    public function publicUrl(string $path, array $config = []): string\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($path);\n\n        if ( ! method_exists($filesystem, 'publicUrl')) {\n            throw new UnableToGeneratePublicUrl(sprintf('%s does not support generating public urls.', $filesystem::class), $path);\n        }\n\n        return $filesystem->publicUrl($path, $config);\n    }\n\n    public function temporaryUrl(string $path, DateTimeInterface $expiresAt, array $config = []): string\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($path);\n\n        if ( ! method_exists($filesystem, 'temporaryUrl')) {\n            throw new UnableToGenerateTemporaryUrl(sprintf('%s does not support generating public urls.', $filesystem::class), $path);\n        }\n\n        return $filesystem->temporaryUrl($path, $expiresAt, $this->config->extend($config)->toArray());\n    }\n\n    public function checksum(string $path, array $config = []): string\n    {\n        /** @var FilesystemOperator $filesystem */\n        [$filesystem, $path] = $this->determineFilesystemAndPath($path);\n\n        if ( ! method_exists($filesystem, 'checksum')) {\n            throw new UnableToProvideChecksum(sprintf('%s does not support providing checksums.', $filesystem::class), $path);\n        }\n\n        return $filesystem->checksum($path, $this->config->extend($config)->toArray());\n    }\n\n    private function mountFilesystems(array $filesystems): void\n    {\n        foreach ($filesystems as $key => $filesystem) {\n            $this->guardAgainstInvalidMount($key, $filesystem);\n            /* @var string $key */\n            /* @var FilesystemOperator $filesystem */\n            $this->mountFilesystem($key, $filesystem);\n        }\n    }\n\n    private function guardAgainstInvalidMount(mixed $key, mixed $filesystem): void\n    {\n        if ( ! is_string($key)) {\n            throw UnableToMountFilesystem::becauseTheKeyIsNotValid($key);\n        }\n\n        if ( ! $filesystem instanceof FilesystemOperator) {\n            throw UnableToMountFilesystem::becauseTheFilesystemWasNotValid($filesystem);\n        }\n    }\n\n    private function mountFilesystem(string $key, FilesystemOperator $filesystem): void\n    {\n        $this->filesystems[$key] = $filesystem;\n    }\n\n    /**\n     * @param string $path\n     *\n     * @return array{0:FilesystemOperator, 1:string, 2:string}\n     */\n    private function determineFilesystemAndPath(string $path): array\n    {\n        if (strpos($path, '://') < 1) {\n            throw UnableToResolveFilesystemMount::becauseTheSeparatorIsMissing($path);\n        }\n\n        /** @var string $mountIdentifier */\n        /** @var string $mountPath */\n        [$mountIdentifier, $mountPath] = explode('://', $path, 2);\n\n        if ( ! array_key_exists($mountIdentifier, $this->filesystems)) {\n            throw UnableToResolveFilesystemMount::becauseTheMountWasNotRegistered($mountIdentifier);\n        }\n\n        return [$this->filesystems[$mountIdentifier], $mountPath, $mountIdentifier];\n    }\n\n    private function copyInSameFilesystem(\n        FilesystemOperator $sourceFilesystem,\n        string $sourcePath,\n        string $destinationPath,\n        string $source,\n        string $destination,\n        array $config,\n    ): void {\n        try {\n            $sourceFilesystem->copy($sourcePath, $destinationPath, $this->config->extend($config)->toArray());\n        } catch (UnableToCopyFile $exception) {\n            throw UnableToCopyFile::fromLocationTo($source, $destination, $exception);\n        }\n    }\n\n    private function copyAcrossFilesystem(\n        FilesystemOperator $sourceFilesystem,\n        string $sourcePath,\n        FilesystemOperator $destinationFilesystem,\n        string $destinationPath,\n        string $source,\n        string $destination,\n        array $config,\n    ): void {\n        $config = $this->config->extend($config);\n        $retainVisibility = (bool) $config->get(Config::OPTION_RETAIN_VISIBILITY, true);\n        $visibility = $config->get(Config::OPTION_VISIBILITY);\n\n        try {\n            if ($visibility == null && $retainVisibility) {\n                $visibility = $sourceFilesystem->visibility($sourcePath);\n                $config = $config->extend(compact('visibility'));\n            }\n\n            $stream = $sourceFilesystem->readStream($sourcePath);\n            $destinationFilesystem->writeStream($destinationPath, $stream, $config->toArray());\n        } catch (UnableToRetrieveMetadata | UnableToReadFile | UnableToWriteFile $exception) {\n            throw UnableToCopyFile::fromLocationTo($source, $destination, $exception);\n        }\n    }\n\n    private function moveInTheSameFilesystem(\n        FilesystemOperator $sourceFilesystem,\n        string $sourcePath,\n        string $destinationPath,\n        string $source,\n        string $destination,\n        array $config,\n    ): void {\n        try {\n            $sourceFilesystem->move($sourcePath, $destinationPath, $this->config->extend($config)->toArray());\n        } catch (UnableToMoveFile $exception) {\n            throw UnableToMoveFile::fromLocationTo($source, $destination, $exception);\n        }\n    }\n\n    private function moveAcrossFilesystems(string $source, string $destination, array $config = []): void\n    {\n        try {\n            $this->copy($source, $destination, $config);\n            $this->delete($source);\n        } catch (UnableToCopyFile | UnableToDeleteFile $exception) {\n            throw UnableToMoveFile::fromLocationTo($source, $destination, $exception);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/PathNormalizer.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\ninterface PathNormalizer\n{\n    public function normalizePath(string $path): string;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/PathPrefixer.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse function rtrim;\nuse function strlen;\nuse function substr;\n\nfinal class PathPrefixer\n{\n    private string $prefix = '';\n\n    public function __construct(string $prefix, private string $separator = '/')\n    {\n        $this->prefix = rtrim($prefix, '\\\\/');\n\n        if ($this->prefix !== '' || $prefix === $separator) {\n            $this->prefix .= $separator;\n        }\n    }\n\n    public function prefixPath(string $path): string\n    {\n        return $this->prefix . ltrim($path, '\\\\/');\n    }\n\n    public function stripPrefix(string $path): string\n    {\n        /* @var string */\n        return substr($path, strlen($this->prefix));\n    }\n\n    public function stripDirectoryPrefix(string $path): string\n    {\n        return rtrim($this->stripPrefix($path), '\\\\/');\n    }\n\n    public function prefixDirectoryPath(string $path): string\n    {\n        $prefixedPath = $this->prefixPath(rtrim($path, '\\\\/'));\n\n        if ($prefixedPath === '' || substr($prefixedPath, -1) === $this->separator) {\n            return $prefixedPath;\n        }\n\n        return $prefixedPath . $this->separator;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/PathTraversalDetected.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\n\nclass PathTraversalDetected extends RuntimeException implements FilesystemException\n{\n    private string $path;\n\n    public function path(): string\n    {\n        return $this->path;\n    }\n\n    public static function forPath(string $path): PathTraversalDetected\n    {\n        $e = new PathTraversalDetected(\"Path traversal detected: {$path}\");\n        $e->path = $path;\n\n        return $e;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/PortableVisibilityGuard.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nfinal class PortableVisibilityGuard\n{\n    public static function guardAgainstInvalidInput(string $visibility): void\n    {\n        if ($visibility !== Visibility::PUBLIC && $visibility !== Visibility::PRIVATE) {\n            $className = Visibility::class;\n            throw InvalidVisibilityProvided::withVisibility(\n                $visibility,\n                \"either {$className}::PUBLIC or {$className}::PRIVATE\"\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/ProxyArrayAccessToProperties.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\n\n/**\n * @internal\n */\ntrait ProxyArrayAccessToProperties\n{\n    private function formatPropertyName(string $offset): string\n    {\n        return str_replace('_', '', lcfirst(ucwords($offset, '_')));\n    }\n\n    /**\n     * @param mixed $offset\n     *\n     * @return bool\n     */\n    public function offsetExists($offset): bool\n    {\n        $property = $this->formatPropertyName((string) $offset);\n\n        return isset($this->{$property});\n    }\n\n    /**\n     * @param mixed $offset\n     *\n     * @return mixed\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetGet($offset)\n    {\n        $property = $this->formatPropertyName((string) $offset);\n\n        return $this->{$property};\n    }\n\n    /**\n     * @param mixed $offset\n     * @param mixed $value\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetSet($offset, $value): void\n    {\n        throw new RuntimeException('Properties can not be manipulated');\n    }\n\n    /**\n     * @param mixed $offset\n     */\n    #[\\ReturnTypeWillChange]\n    public function offsetUnset($offset): void\n    {\n        throw new RuntimeException('Properties can not be manipulated');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/ResolveIdenticalPathConflict.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nclass ResolveIdenticalPathConflict\n{\n    public const IGNORE = 'ignore';\n    public const FAIL = 'fail';\n    public const TRY = 'try';\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/StorageAttributes.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse ArrayAccess;\nuse JsonSerializable;\n\ninterface StorageAttributes extends JsonSerializable, ArrayAccess\n{\n    public const ATTRIBUTE_PATH = 'path';\n    public const ATTRIBUTE_TYPE = 'type';\n    public const ATTRIBUTE_FILE_SIZE = 'file_size';\n    public const ATTRIBUTE_VISIBILITY = 'visibility';\n    public const ATTRIBUTE_LAST_MODIFIED = 'last_modified';\n    public const ATTRIBUTE_MIME_TYPE = 'mime_type';\n    public const ATTRIBUTE_EXTRA_METADATA = 'extra_metadata';\n\n    public const TYPE_FILE = 'file';\n    public const TYPE_DIRECTORY = 'dir';\n\n    public function path(): string;\n\n    public function type(): string;\n\n    public function visibility(): ?string;\n\n    public function lastModified(): ?int;\n\n    public static function fromArray(array $attributes): StorageAttributes;\n\n    public function isFile(): bool;\n\n    public function isDir(): bool;\n\n    public function withPath(string $path): StorageAttributes;\n\n    public function extraMetadata(): array;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/SymbolicLinkEncountered.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\n\nfinal class SymbolicLinkEncountered extends RuntimeException implements FilesystemException\n{\n    private string $location;\n\n    public function location(): string\n    {\n        return $this->location;\n    }\n\n    public static function atLocation(string $pathName): SymbolicLinkEncountered\n    {\n        $e = new static(\"Unsupported symbolic link encountered at location $pathName\");\n        $e->location = $pathName;\n\n        return $e;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToCheckDirectoryExistence.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nclass UnableToCheckDirectoryExistence extends UnableToCheckExistence\n{\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_DIRECTORY_EXISTS;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToCheckExistence.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nclass UnableToCheckExistence extends RuntimeException implements FilesystemOperationFailed\n{\n    final public function __construct(string $message = \"\", int $code = 0, ?Throwable $previous = null)\n    {\n        parent::__construct($message, $code, $previous);\n    }\n\n    public static function forLocation(string $path, ?Throwable $exception = null): static\n    {\n        return new static(\"Unable to check existence for: {$path}\", 0, $exception);\n    }\n\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_EXISTENCE_CHECK;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToCheckFileExistence.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nclass UnableToCheckFileExistence extends UnableToCheckExistence\n{\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_FILE_EXISTS;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToCopyFile.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToCopyFile extends RuntimeException implements FilesystemOperationFailed\n{\n    /**\n     * @var string\n     */\n    private $source;\n\n    /**\n     * @var string\n     */\n    private $destination;\n\n    public function source(): string\n    {\n        return $this->source;\n    }\n\n    public function destination(): string\n    {\n        return $this->destination;\n    }\n\n    public static function fromLocationTo(\n        string $sourcePath,\n        string $destinationPath,\n        ?Throwable $previous = null\n    ): UnableToCopyFile {\n        $e = new static(\"Unable to copy file from $sourcePath to $destinationPath\", 0 , $previous);\n        $e->source = $sourcePath;\n        $e->destination = $destinationPath;\n\n        return $e;\n    }\n\n    public static function sourceAndDestinationAreTheSame(string $source, string $destination): UnableToCopyFile\n    {\n        return UnableToCopyFile::because('Source and destination are the same', $source, $destination);\n    }\n\n    public static function because(string $reason, string $sourcePath, string $destinationPath): UnableToCopyFile\n    {\n        $e = new static(\"Unable to copy file from $sourcePath to $destinationPath, because $reason\");\n        $e->source = $sourcePath;\n        $e->destination = $destinationPath;\n\n        return $e;\n    }\n\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_COPY;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToCreateDirectory.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToCreateDirectory extends RuntimeException implements FilesystemOperationFailed\n{\n    private string $location;\n    private string $reason = '';\n\n    public static function atLocation(string $dirname, string $errorMessage = '', ?Throwable $previous = null): UnableToCreateDirectory\n    {\n        $message = \"Unable to create a directory at {$dirname}. {$errorMessage}\";\n        $e = new static(rtrim($message), 0, $previous);\n        $e->location = $dirname;\n        $e->reason = $errorMessage;\n\n        return $e;\n    }\n\n    public static function dueToFailure(string $dirname, Throwable $previous): UnableToCreateDirectory\n    {\n        $reason = $previous instanceof UnableToCreateDirectory ? $previous->reason() : '';\n        $message = \"Unable to create a directory at $dirname. $reason\";\n        $e = new static(rtrim($message), 0, $previous);\n        $e->location = $dirname;\n        $e->reason = $reason ?: $message;\n\n        return $e;\n    }\n\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_CREATE_DIRECTORY;\n    }\n\n    public function reason(): string\n    {\n        return $this->reason;\n    }\n\n    public function location(): string\n    {\n        return $this->location;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToDeleteDirectory.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToDeleteDirectory extends RuntimeException implements FilesystemOperationFailed\n{\n    /**\n     * @var string\n     */\n    private $location = '';\n\n    /**\n     * @var string\n     */\n    private $reason;\n\n    public static function atLocation(\n        string $location,\n        string $reason = '',\n        ?Throwable $previous = null\n    ): UnableToDeleteDirectory {\n        $e = new static(rtrim(\"Unable to delete directory located at: {$location}. {$reason}\"), 0, $previous);\n        $e->location = $location;\n        $e->reason = $reason;\n\n        return $e;\n    }\n\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_DELETE_DIRECTORY;\n    }\n\n    public function reason(): string\n    {\n        return $this->reason;\n    }\n\n    public function location(): string\n    {\n        return $this->location;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToDeleteFile.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToDeleteFile extends RuntimeException implements FilesystemOperationFailed\n{\n    /**\n     * @var string\n     */\n    private $location = '';\n\n    /**\n     * @var string\n     */\n    private $reason;\n\n    public static function atLocation(string $location, string $reason = '', ?Throwable $previous = null): UnableToDeleteFile\n    {\n        $e = new static(rtrim(\"Unable to delete file located at: {$location}. {$reason}\"), 0, $previous);\n        $e->location = $location;\n        $e->reason = $reason;\n\n        return $e;\n    }\n\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_DELETE;\n    }\n\n    public function reason(): string\n    {\n        return $this->reason;\n    }\n\n    public function location(): string\n    {\n        return $this->location;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToGeneratePublicUrl.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToGeneratePublicUrl extends RuntimeException implements FilesystemException\n{\n    public function __construct(string $reason, string $path, ?Throwable $previous = null)\n    {\n        parent::__construct(\"Unable to generate public url for $path: $reason\", 0, $previous);\n    }\n\n    public static function dueToError(string $path, Throwable $exception): static\n    {\n        return new static($exception->getMessage(), $path, $exception);\n    }\n\n    public static function noGeneratorConfigured(string $path, string $extraReason = ''): static\n    {\n        return new static('No generator was configured ' . $extraReason, $path);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToGenerateTemporaryUrl.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToGenerateTemporaryUrl extends RuntimeException implements FilesystemException\n{\n    public function __construct(string $reason, string $path, ?Throwable $previous = null)\n    {\n        parent::__construct(\"Unable to generate temporary url for $path: $reason\", 0, $previous);\n    }\n\n    public static function dueToError(string $path, Throwable $exception): static\n    {\n        return new static($exception->getMessage(), $path, $exception);\n    }\n\n    public static function noGeneratorConfigured(string $path, string $extraReason = ''): static\n    {\n        return new static('No generator was configured ' . $extraReason, $path);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToListContents.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToListContents extends RuntimeException implements FilesystemOperationFailed\n{\n    public static function atLocation(string $location, bool $deep, Throwable $previous): UnableToListContents\n    {\n        $message = \"Unable to list contents for '$location', \" . ($deep ? 'deep' : 'shallow') . \" listing\\n\\n\"\n            . 'Reason: ' . $previous->getMessage();\n\n        return new UnableToListContents($message, 0, $previous);\n    }\n\n    public function operation(): string\n    {\n        return self::OPERATION_LIST_CONTENTS;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToMountFilesystem.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse LogicException;\n\nclass UnableToMountFilesystem extends LogicException implements FilesystemException\n{\n    /**\n     * @param mixed $key\n     */\n    public static function becauseTheKeyIsNotValid($key): UnableToMountFilesystem\n    {\n        return new UnableToMountFilesystem(\n            'Unable to mount filesystem, key was invalid. String expected, received: ' . gettype($key)\n        );\n    }\n\n    /**\n     * @param mixed $filesystem\n     */\n    public static function becauseTheFilesystemWasNotValid($filesystem): UnableToMountFilesystem\n    {\n        $received = is_object($filesystem) ? get_class($filesystem) : gettype($filesystem);\n\n        return new UnableToMountFilesystem(\n            'Unable to mount filesystem, filesystem was invalid. Instance of ' . FilesystemOperator::class . ' expected, received: ' . $received\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToMoveFile.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToMoveFile extends RuntimeException implements FilesystemOperationFailed\n{\n    /**\n     * @var string\n     */\n    private $source;\n\n    /**\n     * @var string\n     */\n    private $destination;\n\n    public static function sourceAndDestinationAreTheSame(string $source, string $destination): UnableToMoveFile\n    {\n        return UnableToMoveFile::because('Source and destination are the same', $source, $destination);\n    }\n\n    public function source(): string\n    {\n        return $this->source;\n    }\n\n    public function destination(): string\n    {\n        return $this->destination;\n    }\n\n    public static function fromLocationTo(\n        string $sourcePath,\n        string $destinationPath,\n        ?Throwable $previous = null\n    ): UnableToMoveFile {\n        $message = $previous?->getMessage() ?? \"Unable to move file from $sourcePath to $destinationPath\";\n        $e = new static($message, 0, $previous);\n        $e->source = $sourcePath;\n        $e->destination = $destinationPath;\n\n        return $e;\n    }\n\n    public static function because(\n        string $reason,\n        string $sourcePath,\n        string $destinationPath,\n    ): UnableToMoveFile {\n        $message = \"Unable to move file from $sourcePath to $destinationPath, because $reason\";\n        $e = new static($message);\n        $e->source = $sourcePath;\n        $e->destination = $destinationPath;\n\n        return $e;\n    }\n\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_MOVE;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToProvideChecksum.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToProvideChecksum extends RuntimeException implements FilesystemException\n{\n    public function __construct(string $reason, string $path, ?Throwable $previous = null)\n    {\n        parent::__construct(\"Unable to get checksum for $path: $reason\", 0, $previous);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToReadFile.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToReadFile extends RuntimeException implements FilesystemOperationFailed\n{\n    /**\n     * @var string\n     */\n    private $location = '';\n\n    /**\n     * @var string\n     */\n    private $reason = '';\n\n    public static function fromLocation(string $location, string $reason = '', ?Throwable $previous = null): UnableToReadFile\n    {\n        $e = new static(rtrim(\"Unable to read file from location: {$location}. {$reason}\"), 0, $previous);\n        $e->location = $location;\n        $e->reason = $reason;\n\n        return $e;\n    }\n\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_READ;\n    }\n\n    public function reason(): string\n    {\n        return $this->reason;\n    }\n\n    public function location(): string\n    {\n        return $this->location;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToResolveFilesystemMount.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\n\nclass UnableToResolveFilesystemMount extends RuntimeException implements FilesystemException\n{\n    public static function becauseTheSeparatorIsMissing(string $path): UnableToResolveFilesystemMount\n    {\n        return new UnableToResolveFilesystemMount(\"Unable to resolve the filesystem mount because the path ($path) is missing a separator (://).\");\n    }\n\n    public static function becauseTheMountWasNotRegistered(string $mountIdentifier): UnableToResolveFilesystemMount\n    {\n        return new UnableToResolveFilesystemMount(\"Unable to resolve the filesystem mount because the mount ($mountIdentifier) was not registered.\");\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToRetrieveMetadata.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToRetrieveMetadata extends RuntimeException implements FilesystemOperationFailed\n{\n    /**\n     * @var string\n     */\n    private $location;\n\n    /**\n     * @var string\n     */\n    private $metadataType;\n\n    /**\n     * @var string\n     */\n    private $reason;\n\n    public static function lastModified(string $location, string $reason = '', ?Throwable $previous = null): self\n    {\n        return static::create($location, FileAttributes::ATTRIBUTE_LAST_MODIFIED, $reason, $previous);\n    }\n\n    public static function visibility(string $location, string $reason = '', ?Throwable $previous = null): self\n    {\n        return static::create($location, FileAttributes::ATTRIBUTE_VISIBILITY, $reason, $previous);\n    }\n\n    public static function fileSize(string $location, string $reason = '', ?Throwable $previous = null): self\n    {\n        return static::create($location, FileAttributes::ATTRIBUTE_FILE_SIZE, $reason, $previous);\n    }\n\n    public static function mimeType(string $location, string $reason = '', ?Throwable $previous = null): self\n    {\n        return static::create($location, FileAttributes::ATTRIBUTE_MIME_TYPE, $reason, $previous);\n    }\n\n    public static function create(string $location, string $type, string $reason = '', ?Throwable $previous = null): self\n    {\n        $e = new static(\"Unable to retrieve the $type for file at location: $location. {$reason}\", 0, $previous);\n        $e->reason = $reason;\n        $e->location = $location;\n        $e->metadataType = $type;\n\n        return $e;\n    }\n\n    public function reason(): string\n    {\n        return $this->reason;\n    }\n\n    public function location(): string\n    {\n        return $this->location;\n    }\n\n    public function metadataType(): string\n    {\n        return $this->metadataType;\n    }\n\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_RETRIEVE_METADATA;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToSetVisibility.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\n\nuse Throwable;\n\nuse function rtrim;\n\nfinal class UnableToSetVisibility extends RuntimeException implements FilesystemOperationFailed\n{\n    /**\n     * @var string\n     */\n    private $location;\n\n    /**\n     * @var string\n     */\n    private $reason;\n\n    public function reason(): string\n    {\n        return $this->reason;\n    }\n\n    public static function atLocation(string $filename, string $extraMessage = '', ?Throwable $previous = null): self\n    {\n        $message = \"Unable to set visibility for file {$filename}. $extraMessage\";\n        $e = new static(rtrim($message), 0, $previous);\n        $e->reason = $extraMessage;\n        $e->location = $filename;\n\n        return $e;\n    }\n\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_SET_VISIBILITY;\n    }\n\n    public function location(): string\n    {\n        return $this->location;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnableToWriteFile.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\nuse Throwable;\n\nfinal class UnableToWriteFile extends RuntimeException implements FilesystemOperationFailed\n{\n    /**\n     * @var string\n     */\n    private $location = '';\n\n    /**\n     * @var string\n     */\n    private $reason;\n\n    public static function atLocation(string $location, string $reason = '', ?Throwable $previous = null): UnableToWriteFile\n    {\n        $e = new static(rtrim(\"Unable to write file at location: {$location}. {$reason}\"), 0, $previous);\n        $e->location = $location;\n        $e->reason = $reason;\n\n        return $e;\n    }\n\n    public function operation(): string\n    {\n        return FilesystemOperationFailed::OPERATION_WRITE;\n    }\n\n    public function reason(): string\n    {\n        return $this->reason;\n    }\n\n    public function location(): string\n    {\n        return $this->location;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnixVisibility/PortableVisibilityConverter.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem\\UnixVisibility;\n\nuse League\\Flysystem\\PortableVisibilityGuard;\nuse League\\Flysystem\\Visibility;\n\nclass PortableVisibilityConverter implements VisibilityConverter\n{\n    public function __construct(\n        private int $filePublic = 0644,\n        private int $filePrivate = 0600,\n        private int $directoryPublic = 0755,\n        private int $directoryPrivate = 0700,\n        private string $defaultForDirectories = Visibility::PRIVATE\n    ) {\n    }\n\n    public function forFile(string $visibility): int\n    {\n        PortableVisibilityGuard::guardAgainstInvalidInput($visibility);\n\n        return $visibility === Visibility::PUBLIC\n            ? $this->filePublic\n            : $this->filePrivate;\n    }\n\n    public function forDirectory(string $visibility): int\n    {\n        PortableVisibilityGuard::guardAgainstInvalidInput($visibility);\n\n        return $visibility === Visibility::PUBLIC\n            ? $this->directoryPublic\n            : $this->directoryPrivate;\n    }\n\n    public function inverseForFile(int $visibility): string\n    {\n        if ($visibility === $this->filePublic) {\n            return Visibility::PUBLIC;\n        } elseif ($visibility === $this->filePrivate) {\n            return Visibility::PRIVATE;\n        }\n\n        return Visibility::PUBLIC; // default\n    }\n\n    public function inverseForDirectory(int $visibility): string\n    {\n        if ($visibility === $this->directoryPublic) {\n            return Visibility::PUBLIC;\n        } elseif ($visibility === $this->directoryPrivate) {\n            return Visibility::PRIVATE;\n        }\n\n        return Visibility::PUBLIC; // default\n    }\n\n    public function defaultForDirectories(): int\n    {\n        return $this->defaultForDirectories === Visibility::PUBLIC ? $this->directoryPublic : $this->directoryPrivate;\n    }\n\n    /**\n     * @param array<mixed>  $permissionMap\n     */\n    public static function fromArray(array $permissionMap, string $defaultForDirectories = Visibility::PRIVATE): PortableVisibilityConverter\n    {\n        return new PortableVisibilityConverter(\n            $permissionMap['file']['public'] ?? 0644,\n            $permissionMap['file']['private'] ?? 0600,\n            $permissionMap['dir']['public'] ?? 0755,\n            $permissionMap['dir']['private'] ?? 0700,\n            $defaultForDirectories\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnixVisibility/VisibilityConverter.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem\\UnixVisibility;\n\ninterface VisibilityConverter\n{\n    public function forFile(string $visibility): int;\n    public function forDirectory(string $visibility): int;\n    public function inverseForFile(int $visibility): string;\n    public function inverseForDirectory(int $visibility): string;\n    public function defaultForDirectories(): int;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UnreadableFileEncountered.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nuse RuntimeException;\n\nfinal class UnreadableFileEncountered extends RuntimeException implements FilesystemException\n{\n    /**\n     * @var string\n     */\n    private $location;\n\n    public function location(): string\n    {\n        return $this->location;\n    }\n\n    public static function atLocation(string $location): UnreadableFileEncountered\n    {\n        $e = new static(\"Unreadable file encountered at location {$location}.\");\n        $e->location = $location;\n\n        return $e;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UrlGeneration/ChainedPublicUrlGenerator.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem\\UrlGeneration;\n\nuse League\\Flysystem\\Config;\nuse League\\Flysystem\\UnableToGeneratePublicUrl;\n\nfinal class ChainedPublicUrlGenerator implements PublicUrlGenerator\n{\n    /**\n     * @param PublicUrlGenerator[] $generators\n     */\n    public function __construct(private iterable $generators)\n    {\n    }\n\n    public function publicUrl(string $path, Config $config): string\n    {\n        foreach ($this->generators as $generator) {\n            try {\n                return $generator->publicUrl($path, $config);\n            } catch (UnableToGeneratePublicUrl) {\n            }\n        }\n\n        throw new UnableToGeneratePublicUrl('No supported public url generator found.', $path);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UrlGeneration/PrefixPublicUrlGenerator.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem\\UrlGeneration;\n\nuse League\\Flysystem\\Config;\nuse League\\Flysystem\\PathPrefixer;\n\nclass PrefixPublicUrlGenerator implements PublicUrlGenerator\n{\n    private PathPrefixer $prefixer;\n\n    public function __construct(string $urlPrefix)\n    {\n        $this->prefixer = new PathPrefixer($urlPrefix, '/');\n    }\n\n    public function publicUrl(string $path, Config $config): string\n    {\n        return $this->prefixer->prefixPath($path);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UrlGeneration/PublicUrlGenerator.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem\\UrlGeneration;\n\nuse League\\Flysystem\\Config;\nuse League\\Flysystem\\UnableToGeneratePublicUrl;\n\ninterface PublicUrlGenerator\n{\n    /**\n     * @throws UnableToGeneratePublicUrl\n     */\n    public function publicUrl(string $path, Config $config): string;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UrlGeneration/ShardedPrefixPublicUrlGenerator.php",
    "content": "<?php\n\nnamespace League\\Flysystem\\UrlGeneration;\n\nuse InvalidArgumentException;\nuse League\\Flysystem\\Config;\nuse League\\Flysystem\\PathPrefixer;\n\nuse function array_map;\nuse function count;\nuse function crc32;\n\nfinal class ShardedPrefixPublicUrlGenerator implements PublicUrlGenerator\n{\n    /** @var PathPrefixer[] */\n    private array $prefixes;\n    private int $count;\n\n    /**\n     * @param string[] $prefixes\n     */\n    public function __construct(array $prefixes)\n    {\n        $this->count = count($prefixes);\n\n        if ($this->count === 0) {\n            throw new InvalidArgumentException('At least one prefix is required.');\n        }\n\n        $this->prefixes = array_map(static fn (string $prefix) => new PathPrefixer($prefix, '/'), $prefixes);\n    }\n\n    public function publicUrl(string $path, Config $config): string\n    {\n        $index = abs(crc32($path)) % $this->count;\n\n        return $this->prefixes[$index]->prefixPath($path);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/UrlGeneration/TemporaryUrlGenerator.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem\\UrlGeneration;\n\nuse DateTimeInterface;\nuse League\\Flysystem\\Config;\nuse League\\Flysystem\\UnableToGenerateTemporaryUrl;\n\ninterface TemporaryUrlGenerator\n{\n    /**\n     * @throws UnableToGenerateTemporaryUrl\n     */\n    public function temporaryUrl(string $path, DateTimeInterface $expiresAt, Config $config): string;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/Visibility.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nfinal class Visibility\n{\n    public const PUBLIC = 'public';\n    public const PRIVATE = 'private';\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem/src/WhitespacePathNormalizer.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem;\n\nclass WhitespacePathNormalizer implements PathNormalizer\n{\n    public function normalizePath(string $path): string\n    {\n        $path = str_replace('\\\\', '/', $path);\n        $this->rejectFunkyWhiteSpace($path);\n\n        return $this->normalizeRelativePath($path);\n    }\n\n    private function rejectFunkyWhiteSpace(string $path): void\n    {\n        if (preg_match('#\\p{C}+#u', $path)) {\n            throw CorruptedPathDetected::forPath($path);\n        }\n    }\n\n    private function normalizeRelativePath(string $path): string\n    {\n        $parts = [];\n\n        foreach (explode('/', $path) as $part) {\n            switch ($part) {\n                case '':\n                case '.':\n                    break;\n\n                case '..':\n                    if (empty($parts)) {\n                        throw PathTraversalDetected::forPath($path);\n                    }\n                    array_pop($parts);\n                    break;\n\n                default:\n                    $parts[] = $part;\n                    break;\n            }\n        }\n\n        return implode('/', $parts);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem-local/FallbackMimeTypeDetector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem\\Local;\n\nuse League\\MimeTypeDetection\\MimeTypeDetector;\nuse function in_array;\n\nclass FallbackMimeTypeDetector implements MimeTypeDetector\n{\n    private const INCONCLUSIVE_MIME_TYPES = [\n        'application/x-empty',\n        'text/plain',\n        'text/x-asm',\n        'application/octet-stream',\n        'inode/x-empty',\n    ];\n\n    public function __construct(\n        private MimeTypeDetector $detector,\n        private array $inconclusiveMimetypes = self::INCONCLUSIVE_MIME_TYPES,\n        private bool $useInconclusiveMimeTypeFallback = false,\n    ) {\n    }\n\n    public function detectMimeType(string $path, $contents): ?string\n    {\n        return $this->detector->detectMimeType($path, $contents);\n    }\n\n    public function detectMimeTypeFromBuffer(string $contents): ?string\n    {\n        return $this->detector->detectMimeTypeFromBuffer($contents);\n    }\n\n    public function detectMimeTypeFromPath(string $path): ?string\n    {\n        return $this->detector->detectMimeTypeFromPath($path);\n    }\n\n    public function detectMimeTypeFromFile(string $path): ?string\n    {\n        $mimeType = $this->detector->detectMimeTypeFromFile($path);\n\n        if ($mimeType !== null && ! in_array($mimeType, $this->inconclusiveMimetypes)) {\n            return $mimeType;\n        }\n\n        return $this->detector->detectMimeTypeFromPath($path) ?? ($this->useInconclusiveMimeTypeFallback ? $mimeType : null);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem-local/LICENSE",
    "content": "Copyright (c) 2013-2024 Frank de Jonge\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem-local/LocalFilesystemAdapter.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\Flysystem\\Local;\n\nuse const DIRECTORY_SEPARATOR;\nuse const LOCK_EX;\nuse DirectoryIterator;\nuse FilesystemIterator;\nuse Generator;\nuse League\\Flysystem\\ChecksumProvider;\nuse League\\Flysystem\\Config;\nuse League\\Flysystem\\DirectoryAttributes;\nuse League\\Flysystem\\FileAttributes;\nuse League\\Flysystem\\FilesystemAdapter;\nuse League\\Flysystem\\PathPrefixer;\nuse League\\Flysystem\\SymbolicLinkEncountered;\nuse League\\Flysystem\\UnableToCopyFile;\nuse League\\Flysystem\\UnableToCreateDirectory;\nuse League\\Flysystem\\UnableToDeleteDirectory;\nuse League\\Flysystem\\UnableToDeleteFile;\nuse League\\Flysystem\\UnableToMoveFile;\nuse League\\Flysystem\\UnableToProvideChecksum;\nuse League\\Flysystem\\UnableToReadFile;\nuse League\\Flysystem\\UnableToRetrieveMetadata;\nuse League\\Flysystem\\UnableToSetVisibility;\nuse League\\Flysystem\\UnableToWriteFile;\nuse League\\Flysystem\\UnixVisibility\\PortableVisibilityConverter;\nuse League\\Flysystem\\UnixVisibility\\VisibilityConverter;\nuse League\\MimeTypeDetection\\FinfoMimeTypeDetector;\nuse League\\MimeTypeDetection\\MimeTypeDetector;\nuse RecursiveDirectoryIterator;\nuse RecursiveIteratorIterator;\nuse SplFileInfo;\nuse Throwable;\nuse function chmod;\nuse function clearstatcache;\nuse function dirname;\nuse function error_clear_last;\nuse function error_get_last;\nuse function file_exists;\nuse function file_put_contents;\nuse function hash_file;\nuse function is_dir;\nuse function is_file;\nuse function mkdir;\nuse function rename;\n\nclass LocalFilesystemAdapter implements FilesystemAdapter, ChecksumProvider\n{\n    /**\n     * @var int\n     */\n    public const SKIP_LINKS = 0001;\n\n    /**\n     * @var int\n     */\n    public const DISALLOW_LINKS = 0002;\n\n    private PathPrefixer $prefixer;\n    private VisibilityConverter $visibility;\n    private MimeTypeDetector $mimeTypeDetector;\n    private string $rootLocation;\n\n    /**\n     * @var bool\n     */\n    private $rootLocationIsSetup = false;\n\n    public function __construct(\n        string $location,\n        ?VisibilityConverter $visibility = null,\n        private int $writeFlags = LOCK_EX,\n        private int $linkHandling = self::DISALLOW_LINKS,\n        ?MimeTypeDetector $mimeTypeDetector = null,\n        bool $lazyRootCreation = false,\n        bool $useInconclusiveMimeTypeFallback = false,\n    ) {\n        $this->prefixer = new PathPrefixer($location, DIRECTORY_SEPARATOR);\n        $visibility ??= new PortableVisibilityConverter();\n        $this->visibility = $visibility;\n        $this->rootLocation = $location;\n        $this->mimeTypeDetector = $mimeTypeDetector ?? new FallbackMimeTypeDetector(\n            detector: new FinfoMimeTypeDetector(),\n            useInconclusiveMimeTypeFallback: $useInconclusiveMimeTypeFallback,\n        );\n\n        if ( ! $lazyRootCreation) {\n            $this->ensureRootDirectoryExists();\n        }\n    }\n\n    private function ensureRootDirectoryExists(): void\n    {\n        if ($this->rootLocationIsSetup) {\n            return;\n        }\n\n        $this->ensureDirectoryExists($this->rootLocation, $this->visibility->defaultForDirectories());\n        $this->rootLocationIsSetup = true;\n    }\n\n    public function write(string $path, string $contents, Config $config): void\n    {\n        $this->writeToFile($path, $contents, $config);\n    }\n\n    public function writeStream(string $path, $contents, Config $config): void\n    {\n        $this->writeToFile($path, $contents, $config);\n    }\n\n    /**\n     * @param resource|string $contents\n     */\n    private function writeToFile(string $path, $contents, Config $config): void\n    {\n        $prefixedLocation = $this->prefixer->prefixPath($path);\n        $this->ensureRootDirectoryExists();\n        $this->ensureDirectoryExists(\n            dirname($prefixedLocation),\n            $this->resolveDirectoryVisibility($config->get(Config::OPTION_DIRECTORY_VISIBILITY))\n        );\n        error_clear_last();\n\n        if (@file_put_contents($prefixedLocation, $contents, $this->writeFlags) === false) {\n            throw UnableToWriteFile::atLocation($path, error_get_last()['message'] ?? '');\n        }\n\n        if ($visibility = $config->get(Config::OPTION_VISIBILITY)) {\n            $this->setVisibility($path, (string) $visibility);\n        }\n    }\n\n    public function delete(string $path): void\n    {\n        $location = $this->prefixer->prefixPath($path);\n\n        if ( ! file_exists($location)) {\n            return;\n        }\n\n        error_clear_last();\n\n        if ( ! @unlink($location)) {\n            throw UnableToDeleteFile::atLocation($location, error_get_last()['message'] ?? '');\n        }\n    }\n\n    public function deleteDirectory(string $prefix): void\n    {\n        $location = $this->prefixer->prefixPath($prefix);\n\n        if ( ! is_dir($location)) {\n            return;\n        }\n\n        $contents = $this->listDirectoryRecursively($location, RecursiveIteratorIterator::CHILD_FIRST);\n\n        /** @var SplFileInfo $file */\n        foreach ($contents as $file) {\n            if ( ! $this->deleteFileInfoObject($file)) {\n                throw UnableToDeleteDirectory::atLocation($prefix, \"Unable to delete file at \" . $file->getPathname());\n            }\n        }\n\n        unset($contents);\n\n        if ( ! @rmdir($location)) {\n            throw UnableToDeleteDirectory::atLocation($prefix, error_get_last()['message'] ?? '');\n        }\n    }\n\n    private function listDirectoryRecursively(\n        string $path,\n        int $mode = RecursiveIteratorIterator::SELF_FIRST\n    ): Generator {\n        if ( ! is_dir($path)) {\n            return;\n        }\n\n        yield from new RecursiveIteratorIterator(\n            new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS),\n            $mode\n        );\n    }\n\n    protected function deleteFileInfoObject(SplFileInfo $file): bool\n    {\n        switch ($file->getType()) {\n            case 'dir':\n                return @rmdir((string) $file->getRealPath());\n            case 'link':\n                return @unlink((string) $file->getPathname());\n            default:\n                return @unlink((string) $file->getRealPath());\n        }\n    }\n\n    public function listContents(string $path, bool $deep): iterable\n    {\n        $location = $this->prefixer->prefixPath($path);\n\n        if ( ! is_dir($location)) {\n            return;\n        }\n\n        /** @var SplFileInfo[] $iterator */\n        $iterator = $deep ? $this->listDirectoryRecursively($location) : $this->listDirectory($location);\n\n        foreach ($iterator as $fileInfo) {\n            $pathName = $fileInfo->getPathname();\n\n            try {\n                if ($fileInfo->isLink()) {\n                    if ($this->linkHandling & self::SKIP_LINKS) {\n                        continue;\n                    }\n                    throw SymbolicLinkEncountered::atLocation($pathName);\n                }\n\n                $path = $this->prefixer->stripPrefix($pathName);\n                $lastModified = $fileInfo->getMTime();\n                $isDirectory = $fileInfo->isDir();\n                $permissions = octdec(substr(sprintf('%o', $fileInfo->getPerms()), -4));\n                $visibility = $isDirectory ? $this->visibility->inverseForDirectory($permissions) : $this->visibility->inverseForFile($permissions);\n\n                yield $isDirectory ? new DirectoryAttributes(str_replace('\\\\', '/', $path), $visibility, $lastModified) : new FileAttributes(\n                    str_replace('\\\\', '/', $path),\n                    $fileInfo->getSize(),\n                    $visibility,\n                    $lastModified\n                );\n            } catch (Throwable $exception) {\n                if (file_exists($pathName)) {\n                    throw $exception;\n                }\n            }\n        }\n    }\n\n    public function move(string $source, string $destination, Config $config): void\n    {\n        $sourcePath = $this->prefixer->prefixPath($source);\n        $destinationPath = $this->prefixer->prefixPath($destination);\n\n        $this->ensureRootDirectoryExists();\n        $this->ensureDirectoryExists(\n            dirname($destinationPath),\n            $this->resolveDirectoryVisibility($config->get(Config::OPTION_DIRECTORY_VISIBILITY))\n        );\n\n        if ( ! @rename($sourcePath, $destinationPath)) {\n            throw UnableToMoveFile::because(error_get_last()['message'] ?? 'unknown reason', $source, $destination);\n        }\n\n        if ($visibility = $config->get(Config::OPTION_VISIBILITY)) {\n            $this->setVisibility($destination, (string) $visibility);\n        }\n    }\n\n    public function copy(string $source, string $destination, Config $config): void\n    {\n        $sourcePath = $this->prefixer->prefixPath($source);\n        $destinationPath = $this->prefixer->prefixPath($destination);\n        $this->ensureRootDirectoryExists();\n        $this->ensureDirectoryExists(\n            dirname($destinationPath),\n            $this->resolveDirectoryVisibility($config->get(Config::OPTION_DIRECTORY_VISIBILITY))\n        );\n\n        if ( ! @copy($sourcePath, $destinationPath)) {\n            throw UnableToCopyFile::because(error_get_last()['message'] ?? 'unknown', $source, $destination);\n        }\n\n        $visibility = $config->get(\n            Config::OPTION_VISIBILITY,\n            $config->get(Config::OPTION_RETAIN_VISIBILITY, true)\n                ? $this->visibility($source)->visibility()\n                : null,\n        );\n\n        if ($visibility) {\n            $this->setVisibility($destination, (string) $visibility);\n        }\n    }\n\n    public function read(string $path): string\n    {\n        $location = $this->prefixer->prefixPath($path);\n        error_clear_last();\n        $contents = @file_get_contents($location);\n\n        if ($contents === false) {\n            throw UnableToReadFile::fromLocation($path, error_get_last()['message'] ?? '');\n        }\n\n        return $contents;\n    }\n\n    public function readStream(string $path)\n    {\n        $location = $this->prefixer->prefixPath($path);\n        error_clear_last();\n        $contents = @fopen($location, 'rb');\n\n        if ($contents === false) {\n            throw UnableToReadFile::fromLocation($path, error_get_last()['message'] ?? '');\n        }\n\n        return $contents;\n    }\n\n    protected function ensureDirectoryExists(string $dirname, int $visibility): void\n    {\n        if (is_dir($dirname)) {\n            return;\n        }\n\n        error_clear_last();\n\n        if ( ! @mkdir($dirname, $visibility, true)) {\n            $mkdirError = error_get_last();\n        }\n\n        clearstatcache(true, $dirname);\n\n        if ( ! is_dir($dirname)) {\n            $errorMessage = isset($mkdirError['message']) ? $mkdirError['message'] : '';\n\n            throw UnableToCreateDirectory::atLocation($dirname, $errorMessage);\n        }\n    }\n\n    public function fileExists(string $location): bool\n    {\n        $location = $this->prefixer->prefixPath($location);\n\n        return is_file($location);\n    }\n\n    public function directoryExists(string $location): bool\n    {\n        $location = $this->prefixer->prefixPath($location);\n\n        return is_dir($location);\n    }\n\n    public function createDirectory(string $path, Config $config): void\n    {\n        $this->ensureRootDirectoryExists();\n        $location = $this->prefixer->prefixPath($path);\n        $visibility = $config->get(Config::OPTION_VISIBILITY, $config->get(Config::OPTION_DIRECTORY_VISIBILITY));\n        $permissions = $this->resolveDirectoryVisibility($visibility);\n\n        if (is_dir($location)) {\n            $this->setPermissions($location, $permissions);\n\n            return;\n        }\n\n        error_clear_last();\n\n        if ( ! @mkdir($location, $permissions, true)) {\n            throw UnableToCreateDirectory::atLocation($path, error_get_last()['message'] ?? '');\n        }\n    }\n\n    public function setVisibility(string $path, string $visibility): void\n    {\n        $path = $this->prefixer->prefixPath($path);\n        $visibility = is_dir($path) ? $this->visibility->forDirectory($visibility) : $this->visibility->forFile(\n            $visibility\n        );\n\n        $this->setPermissions($path, $visibility);\n    }\n\n    public function visibility(string $path): FileAttributes\n    {\n        $location = $this->prefixer->prefixPath($path);\n        clearstatcache(false, $location);\n        error_clear_last();\n        $fileperms = @fileperms($location);\n\n        if ($fileperms === false) {\n            throw UnableToRetrieveMetadata::visibility($path, error_get_last()['message'] ?? '');\n        }\n\n        $permissions = $fileperms & 0777;\n        $visibility = $this->visibility->inverseForFile($permissions);\n\n        return new FileAttributes($path, null, $visibility);\n    }\n\n    private function resolveDirectoryVisibility(?string $visibility): int\n    {\n        return $visibility === null ? $this->visibility->defaultForDirectories() : $this->visibility->forDirectory(\n            $visibility\n        );\n    }\n\n    public function mimeType(string $path): FileAttributes\n    {\n        $location = $this->prefixer->prefixPath($path);\n        error_clear_last();\n\n        if ( ! is_file($location)) {\n            throw UnableToRetrieveMetadata::mimeType($location, 'No such file exists.');\n        }\n\n        $mimeType = $this->mimeTypeDetector->detectMimeTypeFromFile($location);\n\n        if ($mimeType === null) {\n            throw UnableToRetrieveMetadata::mimeType($path, error_get_last()['message'] ?? '');\n        }\n\n        return new FileAttributes($path, null, null, null, $mimeType);\n    }\n\n    public function lastModified(string $path): FileAttributes\n    {\n        $location = $this->prefixer->prefixPath($path);\n        error_clear_last();\n        $lastModified = @filemtime($location);\n\n        if ($lastModified === false) {\n            throw UnableToRetrieveMetadata::lastModified($path, error_get_last()['message'] ?? '');\n        }\n\n        return new FileAttributes($path, null, null, $lastModified);\n    }\n\n    public function fileSize(string $path): FileAttributes\n    {\n        $location = $this->prefixer->prefixPath($path);\n        error_clear_last();\n\n        if (is_file($location) && ($fileSize = @filesize($location)) !== false) {\n            return new FileAttributes($path, $fileSize);\n        }\n\n        throw UnableToRetrieveMetadata::fileSize($path, error_get_last()['message'] ?? '');\n    }\n\n    public function checksum(string $path, Config $config): string\n    {\n        $algo = $config->get('checksum_algo', 'md5');\n        $location = $this->prefixer->prefixPath($path);\n        error_clear_last();\n        $checksum = @hash_file($algo, $location);\n\n        if ($checksum === false) {\n            throw new UnableToProvideChecksum(error_get_last()['message'] ?? '', $path);\n        }\n\n        return $checksum;\n    }\n\n    private function listDirectory(string $location): Generator\n    {\n        $iterator = new DirectoryIterator($location);\n\n        foreach ($iterator as $item) {\n            if ($item->isDot()) {\n                continue;\n            }\n\n            yield $item;\n        }\n    }\n\n    private function setPermissions(string $location, int $visibility): void\n    {\n        error_clear_last();\n        if ( ! @chmod($location, $visibility)) {\n            $extraMessage = error_get_last()['message'] ?? '';\n            throw UnableToSetVisibility::atLocation($this->prefixer->stripPrefix($location), $extraMessage);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/flysystem-local/composer.json",
    "content": "{\n    \"name\": \"league/flysystem-local\",\n    \"description\": \"Local filesystem adapter for Flysystem.\",\n    \"keywords\": [\"flysystem\", \"filesystem\", \"local\", \"file\", \"files\"],\n    \"type\": \"library\",\n    \"prefer-stable\": true,\n    \"autoload\": {\n        \"psr-4\": {\n            \"League\\\\Flysystem\\\\Local\\\\\": \"\"\n        }\n    },\n    \"require\": {\n        \"php\": \"^8.0.2\",\n        \"ext-fileinfo\": \"*\",\n        \"league/flysystem\": \"^3.0.0\",\n        \"league/mime-type-detection\": \"^1.0.0\"\n    },\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Frank de Jonge\",\n            \"email\": \"info@frankdejonge.nl\"\n        }\n    ]\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/mime-type-detection/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.15.0 - 2024-01-28\n\n- Updated lookup\n\n## 1.14.0 - 2022-10-17\n\n### Updated\n\n- Updated lookup\n\n## 1.13.0 - 2023-08-05\n\n### Added\n\n- A reverse lookup mechanism to fetch one or all extensions for a given mimetype\n\n## 1.12.0 - 2023-08-03\n\n### Updated\n\n- Updated lookup\n\n## 1.11.0 - 2023-04-17\n\n### Updated\n\n- Updated lookup\n\n## 1.10.0 - 2022-04-11\n\n### Fixed\n\n- Added Flysystem v1 inconclusive mime-types and made it configurable as a constructor parameter.\n\n## 1.9.0 - 2021-11-21\n\n### Updated\n\n- Updated lookup\n\n## 1.8.0 - 2021-09-25\n\n### Added\n\n- Added the decorator `OverridingExtensionToMimeTypeMap` which allows you to override values.\n\n## 1.7.0 - 2021-01-18\n\n### Added\n\n- Added a `bufferSampleSize` parameter to the `FinfoMimeTypeDetector` class that allows you to send a reduced content sample which costs less memory.\n\n## 1.6.0 - 2021-01-18\n\n### Changes\n\n- Updated generated mime-type map\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/mime-type-detection/LICENSE",
    "content": "Copyright (c) 2013-2023 Frank de Jonge\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/mime-type-detection/composer.json",
    "content": "{\n    \"name\": \"league/mime-type-detection\",\n    \"description\": \"Mime-type detection for Flysystem\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Frank de Jonge\",\n            \"email\": \"info@frankdejonge.nl\"\n        }\n    ],\n    \"scripts\": {\n        \"test\": \"vendor/bin/phpunit\",\n        \"phpstan\": \"vendor/bin/phpstan analyse -l 6 src\"\n    },\n    \"require\": {\n        \"php\": \"^7.4 || ^8.0\",\n        \"ext-fileinfo\": \"*\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"^8.5.8 || ^9.3 || ^10.0\",\n        \"phpstan/phpstan\": \"^0.12.68\",\n        \"friendsofphp/php-cs-fixer\": \"^3.2\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"League\\\\MimeTypeDetection\\\\\": \"src\"\n        }\n    },\n    \"config\": {\n        \"platform\": {\n            \"php\": \"7.4.0\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\MimeTypeDetection;\n\nclass EmptyExtensionToMimeTypeMap implements ExtensionToMimeTypeMap\n{\n    public function lookupMimeType(string $extension): ?string\n    {\n        return null;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/mime-type-detection/src/ExtensionLookup.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace League\\MimeTypeDetection;\n\ninterface ExtensionLookup\n{\n    public function lookupExtension(string $mimetype): ?string;\n\n    /**\n     * @return string[]\n     */\n    public function lookupAllExtensions(string $mimetype): array;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/mime-type-detection/src/ExtensionMimeTypeDetector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\MimeTypeDetection;\n\nuse const PATHINFO_EXTENSION;\n\nclass ExtensionMimeTypeDetector implements MimeTypeDetector, ExtensionLookup\n{\n    /**\n     * @var ExtensionToMimeTypeMap\n     */\n    private $extensions;\n\n    public function __construct(ExtensionToMimeTypeMap $extensions = null)\n    {\n        $this->extensions = $extensions ?: new GeneratedExtensionToMimeTypeMap();\n    }\n\n    public function detectMimeType(string $path, $contents): ?string\n    {\n        return $this->detectMimeTypeFromPath($path);\n    }\n\n    public function detectMimeTypeFromPath(string $path): ?string\n    {\n        $extension = strtolower(pathinfo($path, PATHINFO_EXTENSION));\n\n        return $this->extensions->lookupMimeType($extension);\n    }\n\n    public function detectMimeTypeFromFile(string $path): ?string\n    {\n        return $this->detectMimeTypeFromPath($path);\n    }\n\n    public function detectMimeTypeFromBuffer(string $contents): ?string\n    {\n        return null;\n    }\n\n    public function lookupExtension(string $mimetype): ?string\n    {\n        return $this->extensions instanceof ExtensionLookup\n            ? $this->extensions->lookupExtension($mimetype)\n            : null;\n    }\n\n    public function lookupAllExtensions(string $mimetype): array\n    {\n        return $this->extensions instanceof ExtensionLookup\n            ? $this->extensions->lookupAllExtensions($mimetype)\n            : [];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/mime-type-detection/src/ExtensionToMimeTypeMap.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\MimeTypeDetection;\n\ninterface ExtensionToMimeTypeMap\n{\n    public function lookupMimeType(string $extension): ?string;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/mime-type-detection/src/FinfoMimeTypeDetector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\MimeTypeDetection;\n\nuse const FILEINFO_MIME_TYPE;\n\nuse const PATHINFO_EXTENSION;\nuse finfo;\n\nclass FinfoMimeTypeDetector implements MimeTypeDetector, ExtensionLookup\n{\n    private const INCONCLUSIVE_MIME_TYPES = [\n        'application/x-empty',\n        'text/plain',\n        'text/x-asm',\n        'application/octet-stream',\n        'inode/x-empty',\n    ];\n\n    /**\n     * @var finfo\n     */\n    private $finfo;\n\n    /**\n     * @var ExtensionToMimeTypeMap\n     */\n    private $extensionMap;\n\n    /**\n     * @var int|null\n     */\n    private $bufferSampleSize;\n\n    /**\n     * @var array<string>\n     */\n    private $inconclusiveMimetypes;\n\n    public function __construct(\n        string $magicFile = '',\n        ExtensionToMimeTypeMap $extensionMap = null,\n        ?int $bufferSampleSize = null,\n        array $inconclusiveMimetypes = self::INCONCLUSIVE_MIME_TYPES\n    ) {\n        $this->finfo = new finfo(FILEINFO_MIME_TYPE, $magicFile);\n        $this->extensionMap = $extensionMap ?: new GeneratedExtensionToMimeTypeMap();\n        $this->bufferSampleSize = $bufferSampleSize;\n        $this->inconclusiveMimetypes = $inconclusiveMimetypes;\n    }\n\n    public function detectMimeType(string $path, $contents): ?string\n    {\n        $mimeType = is_string($contents)\n            ? (@$this->finfo->buffer($this->takeSample($contents)) ?: null)\n            : null;\n\n        if ($mimeType !== null && ! in_array($mimeType, $this->inconclusiveMimetypes)) {\n            return $mimeType;\n        }\n\n        return $this->detectMimeTypeFromPath($path);\n    }\n\n    public function detectMimeTypeFromPath(string $path): ?string\n    {\n        $extension = strtolower(pathinfo($path, PATHINFO_EXTENSION));\n\n        return $this->extensionMap->lookupMimeType($extension);\n    }\n\n    public function detectMimeTypeFromFile(string $path): ?string\n    {\n        return @$this->finfo->file($path) ?: null;\n    }\n\n    public function detectMimeTypeFromBuffer(string $contents): ?string\n    {\n        return @$this->finfo->buffer($this->takeSample($contents)) ?: null;\n    }\n\n    private function takeSample(string $contents): string\n    {\n        if ($this->bufferSampleSize === null) {\n            return $contents;\n        }\n\n        return (string) substr($contents, 0, $this->bufferSampleSize);\n    }\n\n    public function lookupExtension(string $mimetype): ?string\n    {\n        return $this->extensionMap instanceof ExtensionLookup\n            ? $this->extensionMap->lookupExtension($mimetype)\n            : null;\n    }\n\n    public function lookupAllExtensions(string $mimetype): array\n    {\n        return $this->extensionMap instanceof ExtensionLookup\n            ? $this->extensionMap->lookupAllExtensions($mimetype)\n            : [];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\MimeTypeDetection;\n\nclass GeneratedExtensionToMimeTypeMap implements ExtensionToMimeTypeMap, ExtensionLookup\n{\n    /**\n     * @var array<string, string>\n     *\n     * @internal\n     */\n    public const MIME_TYPES_FOR_EXTENSIONS = [\n        '1km' => 'application/vnd.1000minds.decision-model+xml',\n        '3dml' => 'text/vnd.in3d.3dml',\n        '3ds' => 'image/x-3ds',\n        '3g2' => 'video/3gpp2',\n        '3gp' => 'video/3gp',\n        '3gpp' => 'video/3gpp',\n        '3mf' => 'model/3mf',\n        '7z' => 'application/x-7z-compressed',\n        '7zip' => 'application/x-7z-compressed',\n        '123' => 'application/vnd.lotus-1-2-3',\n        'aab' => 'application/x-authorware-bin',\n        'aac' => 'audio/acc',\n        'aam' => 'application/x-authorware-map',\n        'aas' => 'application/x-authorware-seg',\n        'abw' => 'application/x-abiword',\n        'ac' => 'application/vnd.nokia.n-gage.ac+xml',\n        'ac3' => 'audio/ac3',\n        'acc' => 'application/vnd.americandynamics.acc',\n        'ace' => 'application/x-ace-compressed',\n        'acu' => 'application/vnd.acucobol',\n        'acutc' => 'application/vnd.acucorp',\n        'adp' => 'audio/adpcm',\n        'adts' => 'audio/aac',\n        'aep' => 'application/vnd.audiograph',\n        'afm' => 'application/x-font-type1',\n        'afp' => 'application/vnd.ibm.modcap',\n        'age' => 'application/vnd.age',\n        'ahead' => 'application/vnd.ahead.space',\n        'ai' => 'application/pdf',\n        'aif' => 'audio/x-aiff',\n        'aifc' => 'audio/x-aiff',\n        'aiff' => 'audio/x-aiff',\n        'air' => 'application/vnd.adobe.air-application-installer-package+zip',\n        'ait' => 'application/vnd.dvb.ait',\n        'ami' => 'application/vnd.amiga.ami',\n        'aml' => 'application/automationml-aml+xml',\n        'amlx' => 'application/automationml-amlx+zip',\n        'amr' => 'audio/amr',\n        'apk' => 'application/vnd.android.package-archive',\n        'apng' => 'image/apng',\n        'appcache' => 'text/cache-manifest',\n        'appinstaller' => 'application/appinstaller',\n        'application' => 'application/x-ms-application',\n        'appx' => 'application/appx',\n        'appxbundle' => 'application/appxbundle',\n        'apr' => 'application/vnd.lotus-approach',\n        'arc' => 'application/x-freearc',\n        'arj' => 'application/x-arj',\n        'asc' => 'application/pgp-signature',\n        'asf' => 'video/x-ms-asf',\n        'asm' => 'text/x-asm',\n        'aso' => 'application/vnd.accpac.simply.aso',\n        'asx' => 'video/x-ms-asf',\n        'atc' => 'application/vnd.acucorp',\n        'atom' => 'application/atom+xml',\n        'atomcat' => 'application/atomcat+xml',\n        'atomdeleted' => 'application/atomdeleted+xml',\n        'atomsvc' => 'application/atomsvc+xml',\n        'atx' => 'application/vnd.antix.game-component',\n        'au' => 'audio/x-au',\n        'avci' => 'image/avci',\n        'avcs' => 'image/avcs',\n        'avi' => 'video/x-msvideo',\n        'avif' => 'image/avif',\n        'aw' => 'application/applixware',\n        'azf' => 'application/vnd.airzip.filesecure.azf',\n        'azs' => 'application/vnd.airzip.filesecure.azs',\n        'azv' => 'image/vnd.airzip.accelerator.azv',\n        'azw' => 'application/vnd.amazon.ebook',\n        'b16' => 'image/vnd.pco.b16',\n        'bat' => 'application/x-msdownload',\n        'bcpio' => 'application/x-bcpio',\n        'bdf' => 'application/x-font-bdf',\n        'bdm' => 'application/vnd.syncml.dm+wbxml',\n        'bdoc' => 'application/x-bdoc',\n        'bed' => 'application/vnd.realvnc.bed',\n        'bh2' => 'application/vnd.fujitsu.oasysprs',\n        'bin' => 'application/octet-stream',\n        'blb' => 'application/x-blorb',\n        'blorb' => 'application/x-blorb',\n        'bmi' => 'application/vnd.bmi',\n        'bmml' => 'application/vnd.balsamiq.bmml+xml',\n        'bmp' => 'image/bmp',\n        'book' => 'application/vnd.framemaker',\n        'box' => 'application/vnd.previewsystems.box',\n        'boz' => 'application/x-bzip2',\n        'bpk' => 'application/octet-stream',\n        'bpmn' => 'application/octet-stream',\n        'brf' => 'application/braille',\n        'bsp' => 'model/vnd.valve.source.compiled-map',\n        'btf' => 'image/prs.btif',\n        'btif' => 'image/prs.btif',\n        'buffer' => 'application/octet-stream',\n        'bz' => 'application/x-bzip',\n        'bz2' => 'application/x-bzip2',\n        'c' => 'text/x-c',\n        'c4d' => 'application/vnd.clonk.c4group',\n        'c4f' => 'application/vnd.clonk.c4group',\n        'c4g' => 'application/vnd.clonk.c4group',\n        'c4p' => 'application/vnd.clonk.c4group',\n        'c4u' => 'application/vnd.clonk.c4group',\n        'c11amc' => 'application/vnd.cluetrust.cartomobile-config',\n        'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg',\n        'cab' => 'application/vnd.ms-cab-compressed',\n        'caf' => 'audio/x-caf',\n        'cap' => 'application/vnd.tcpdump.pcap',\n        'car' => 'application/vnd.curl.car',\n        'cat' => 'application/vnd.ms-pki.seccat',\n        'cb7' => 'application/x-cbr',\n        'cba' => 'application/x-cbr',\n        'cbr' => 'application/x-cbr',\n        'cbt' => 'application/x-cbr',\n        'cbz' => 'application/x-cbr',\n        'cc' => 'text/x-c',\n        'cco' => 'application/x-cocoa',\n        'cct' => 'application/x-director',\n        'ccxml' => 'application/ccxml+xml',\n        'cdbcmsg' => 'application/vnd.contact.cmsg',\n        'cdf' => 'application/x-netcdf',\n        'cdfx' => 'application/cdfx+xml',\n        'cdkey' => 'application/vnd.mediastation.cdkey',\n        'cdmia' => 'application/cdmi-capability',\n        'cdmic' => 'application/cdmi-container',\n        'cdmid' => 'application/cdmi-domain',\n        'cdmio' => 'application/cdmi-object',\n        'cdmiq' => 'application/cdmi-queue',\n        'cdr' => 'application/cdr',\n        'cdx' => 'chemical/x-cdx',\n        'cdxml' => 'application/vnd.chemdraw+xml',\n        'cdy' => 'application/vnd.cinderella',\n        'cer' => 'application/pkix-cert',\n        'cfs' => 'application/x-cfs-compressed',\n        'cgm' => 'image/cgm',\n        'chat' => 'application/x-chat',\n        'chm' => 'application/vnd.ms-htmlhelp',\n        'chrt' => 'application/vnd.kde.kchart',\n        'cif' => 'chemical/x-cif',\n        'cii' => 'application/vnd.anser-web-certificate-issue-initiation',\n        'cil' => 'application/vnd.ms-artgalry',\n        'cjs' => 'application/node',\n        'cla' => 'application/vnd.claymore',\n        'class' => 'application/octet-stream',\n        'cld' => 'model/vnd.cld',\n        'clkk' => 'application/vnd.crick.clicker.keyboard',\n        'clkp' => 'application/vnd.crick.clicker.palette',\n        'clkt' => 'application/vnd.crick.clicker.template',\n        'clkw' => 'application/vnd.crick.clicker.wordbank',\n        'clkx' => 'application/vnd.crick.clicker',\n        'clp' => 'application/x-msclip',\n        'cmc' => 'application/vnd.cosmocaller',\n        'cmdf' => 'chemical/x-cmdf',\n        'cml' => 'chemical/x-cml',\n        'cmp' => 'application/vnd.yellowriver-custom-menu',\n        'cmx' => 'image/x-cmx',\n        'cod' => 'application/vnd.rim.cod',\n        'coffee' => 'text/coffeescript',\n        'com' => 'application/x-msdownload',\n        'conf' => 'text/plain',\n        'cpio' => 'application/x-cpio',\n        'cpl' => 'application/cpl+xml',\n        'cpp' => 'text/x-c',\n        'cpt' => 'application/mac-compactpro',\n        'crd' => 'application/x-mscardfile',\n        'crl' => 'application/pkix-crl',\n        'crt' => 'application/x-x509-ca-cert',\n        'crx' => 'application/x-chrome-extension',\n        'cryptonote' => 'application/vnd.rig.cryptonote',\n        'csh' => 'application/x-csh',\n        'csl' => 'application/vnd.citationstyles.style+xml',\n        'csml' => 'chemical/x-csml',\n        'csp' => 'application/vnd.commonspace',\n        'csr' => 'application/octet-stream',\n        'css' => 'text/css',\n        'cst' => 'application/x-director',\n        'csv' => 'text/csv',\n        'cu' => 'application/cu-seeme',\n        'curl' => 'text/vnd.curl',\n        'cwl' => 'application/cwl',\n        'cww' => 'application/prs.cww',\n        'cxt' => 'application/x-director',\n        'cxx' => 'text/x-c',\n        'dae' => 'model/vnd.collada+xml',\n        'daf' => 'application/vnd.mobius.daf',\n        'dart' => 'application/vnd.dart',\n        'dataless' => 'application/vnd.fdsn.seed',\n        'davmount' => 'application/davmount+xml',\n        'dbf' => 'application/vnd.dbf',\n        'dbk' => 'application/docbook+xml',\n        'dcr' => 'application/x-director',\n        'dcurl' => 'text/vnd.curl.dcurl',\n        'dd2' => 'application/vnd.oma.dd2+xml',\n        'ddd' => 'application/vnd.fujixerox.ddd',\n        'ddf' => 'application/vnd.syncml.dmddf+xml',\n        'dds' => 'image/vnd.ms-dds',\n        'deb' => 'application/x-debian-package',\n        'def' => 'text/plain',\n        'deploy' => 'application/octet-stream',\n        'der' => 'application/x-x509-ca-cert',\n        'dfac' => 'application/vnd.dreamfactory',\n        'dgc' => 'application/x-dgc-compressed',\n        'dib' => 'image/bmp',\n        'dic' => 'text/x-c',\n        'dir' => 'application/x-director',\n        'dis' => 'application/vnd.mobius.dis',\n        'disposition-notification' => 'message/disposition-notification',\n        'dist' => 'application/octet-stream',\n        'distz' => 'application/octet-stream',\n        'djv' => 'image/vnd.djvu',\n        'djvu' => 'image/vnd.djvu',\n        'dll' => 'application/octet-stream',\n        'dmg' => 'application/x-apple-diskimage',\n        'dmn' => 'application/octet-stream',\n        'dmp' => 'application/vnd.tcpdump.pcap',\n        'dms' => 'application/octet-stream',\n        'dna' => 'application/vnd.dna',\n        'doc' => 'application/msword',\n        'docm' => 'application/vnd.ms-word.template.macroEnabled.12',\n        'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n        'dot' => 'application/msword',\n        'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',\n        'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n        'dp' => 'application/vnd.osgi.dp',\n        'dpg' => 'application/vnd.dpgraph',\n        'dpx' => 'image/dpx',\n        'dra' => 'audio/vnd.dra',\n        'drle' => 'image/dicom-rle',\n        'dsc' => 'text/prs.lines.tag',\n        'dssc' => 'application/dssc+der',\n        'dst' => 'application/octet-stream',\n        'dtb' => 'application/x-dtbook+xml',\n        'dtd' => 'application/xml-dtd',\n        'dts' => 'audio/vnd.dts',\n        'dtshd' => 'audio/vnd.dts.hd',\n        'dump' => 'application/octet-stream',\n        'dvb' => 'video/vnd.dvb.file',\n        'dvi' => 'application/x-dvi',\n        'dwd' => 'application/atsc-dwd+xml',\n        'dwf' => 'model/vnd.dwf',\n        'dwg' => 'image/vnd.dwg',\n        'dxf' => 'image/vnd.dxf',\n        'dxp' => 'application/vnd.spotfire.dxp',\n        'dxr' => 'application/x-director',\n        'ear' => 'application/java-archive',\n        'ecelp4800' => 'audio/vnd.nuera.ecelp4800',\n        'ecelp7470' => 'audio/vnd.nuera.ecelp7470',\n        'ecelp9600' => 'audio/vnd.nuera.ecelp9600',\n        'ecma' => 'application/ecmascript',\n        'edm' => 'application/vnd.novadigm.edm',\n        'edx' => 'application/vnd.novadigm.edx',\n        'efif' => 'application/vnd.picsel',\n        'ei6' => 'application/vnd.pg.osasli',\n        'elc' => 'application/octet-stream',\n        'emf' => 'image/emf',\n        'eml' => 'message/rfc822',\n        'emma' => 'application/emma+xml',\n        'emotionml' => 'application/emotionml+xml',\n        'emz' => 'application/x-msmetafile',\n        'eol' => 'audio/vnd.digital-winds',\n        'eot' => 'application/vnd.ms-fontobject',\n        'eps' => 'application/postscript',\n        'epub' => 'application/epub+zip',\n        'es3' => 'application/vnd.eszigno3+xml',\n        'esa' => 'application/vnd.osgi.subsystem',\n        'esf' => 'application/vnd.epson.esf',\n        'et3' => 'application/vnd.eszigno3+xml',\n        'etx' => 'text/x-setext',\n        'eva' => 'application/x-eva',\n        'evy' => 'application/x-envoy',\n        'exe' => 'application/octet-stream',\n        'exi' => 'application/exi',\n        'exp' => 'application/express',\n        'exr' => 'image/aces',\n        'ext' => 'application/vnd.novadigm.ext',\n        'ez' => 'application/andrew-inset',\n        'ez2' => 'application/vnd.ezpix-album',\n        'ez3' => 'application/vnd.ezpix-package',\n        'f' => 'text/x-fortran',\n        'f4v' => 'video/mp4',\n        'f77' => 'text/x-fortran',\n        'f90' => 'text/x-fortran',\n        'fbs' => 'image/vnd.fastbidsheet',\n        'fcdt' => 'application/vnd.adobe.formscentral.fcdt',\n        'fcs' => 'application/vnd.isac.fcs',\n        'fdf' => 'application/vnd.fdf',\n        'fdt' => 'application/fdt+xml',\n        'fe_launch' => 'application/vnd.denovo.fcselayout-link',\n        'fg5' => 'application/vnd.fujitsu.oasysgp',\n        'fgd' => 'application/x-director',\n        'fh' => 'image/x-freehand',\n        'fh4' => 'image/x-freehand',\n        'fh5' => 'image/x-freehand',\n        'fh7' => 'image/x-freehand',\n        'fhc' => 'image/x-freehand',\n        'fig' => 'application/x-xfig',\n        'fits' => 'image/fits',\n        'flac' => 'audio/x-flac',\n        'fli' => 'video/x-fli',\n        'flo' => 'application/vnd.micrografx.flo',\n        'flv' => 'video/x-flv',\n        'flw' => 'application/vnd.kde.kivio',\n        'flx' => 'text/vnd.fmi.flexstor',\n        'fly' => 'text/vnd.fly',\n        'fm' => 'application/vnd.framemaker',\n        'fnc' => 'application/vnd.frogans.fnc',\n        'fo' => 'application/vnd.software602.filler.form+xml',\n        'for' => 'text/x-fortran',\n        'fpx' => 'image/vnd.fpx',\n        'frame' => 'application/vnd.framemaker',\n        'fsc' => 'application/vnd.fsc.weblaunch',\n        'fst' => 'image/vnd.fst',\n        'ftc' => 'application/vnd.fluxtime.clip',\n        'fti' => 'application/vnd.anser-web-funds-transfer-initiation',\n        'fvt' => 'video/vnd.fvt',\n        'fxp' => 'application/vnd.adobe.fxp',\n        'fxpl' => 'application/vnd.adobe.fxp',\n        'fzs' => 'application/vnd.fuzzysheet',\n        'g2w' => 'application/vnd.geoplan',\n        'g3' => 'image/g3fax',\n        'g3w' => 'application/vnd.geospace',\n        'gac' => 'application/vnd.groove-account',\n        'gam' => 'application/x-tads',\n        'gbr' => 'application/rpki-ghostbusters',\n        'gca' => 'application/x-gca-compressed',\n        'gdl' => 'model/vnd.gdl',\n        'gdoc' => 'application/vnd.google-apps.document',\n        'ged' => 'text/vnd.familysearch.gedcom',\n        'geo' => 'application/vnd.dynageo',\n        'geojson' => 'application/geo+json',\n        'gex' => 'application/vnd.geometry-explorer',\n        'ggb' => 'application/vnd.geogebra.file',\n        'ggt' => 'application/vnd.geogebra.tool',\n        'ghf' => 'application/vnd.groove-help',\n        'gif' => 'image/gif',\n        'gim' => 'application/vnd.groove-identity-message',\n        'glb' => 'model/gltf-binary',\n        'gltf' => 'model/gltf+json',\n        'gml' => 'application/gml+xml',\n        'gmx' => 'application/vnd.gmx',\n        'gnumeric' => 'application/x-gnumeric',\n        'gpg' => 'application/gpg-keys',\n        'gph' => 'application/vnd.flographit',\n        'gpx' => 'application/gpx+xml',\n        'gqf' => 'application/vnd.grafeq',\n        'gqs' => 'application/vnd.grafeq',\n        'gram' => 'application/srgs',\n        'gramps' => 'application/x-gramps-xml',\n        'gre' => 'application/vnd.geometry-explorer',\n        'grv' => 'application/vnd.groove-injector',\n        'grxml' => 'application/srgs+xml',\n        'gsf' => 'application/x-font-ghostscript',\n        'gsheet' => 'application/vnd.google-apps.spreadsheet',\n        'gslides' => 'application/vnd.google-apps.presentation',\n        'gtar' => 'application/x-gtar',\n        'gtm' => 'application/vnd.groove-tool-message',\n        'gtw' => 'model/vnd.gtw',\n        'gv' => 'text/vnd.graphviz',\n        'gxf' => 'application/gxf',\n        'gxt' => 'application/vnd.geonext',\n        'gz' => 'application/gzip',\n        'gzip' => 'application/gzip',\n        'h' => 'text/x-c',\n        'h261' => 'video/h261',\n        'h263' => 'video/h263',\n        'h264' => 'video/h264',\n        'hal' => 'application/vnd.hal+xml',\n        'hbci' => 'application/vnd.hbci',\n        'hbs' => 'text/x-handlebars-template',\n        'hdd' => 'application/x-virtualbox-hdd',\n        'hdf' => 'application/x-hdf',\n        'heic' => 'image/heic',\n        'heics' => 'image/heic-sequence',\n        'heif' => 'image/heif',\n        'heifs' => 'image/heif-sequence',\n        'hej2' => 'image/hej2k',\n        'held' => 'application/atsc-held+xml',\n        'hh' => 'text/x-c',\n        'hjson' => 'application/hjson',\n        'hlp' => 'application/winhlp',\n        'hpgl' => 'application/vnd.hp-hpgl',\n        'hpid' => 'application/vnd.hp-hpid',\n        'hps' => 'application/vnd.hp-hps',\n        'hqx' => 'application/mac-binhex40',\n        'hsj2' => 'image/hsj2',\n        'htc' => 'text/x-component',\n        'htke' => 'application/vnd.kenameaapp',\n        'htm' => 'text/html',\n        'html' => 'text/html',\n        'hvd' => 'application/vnd.yamaha.hv-dic',\n        'hvp' => 'application/vnd.yamaha.hv-voice',\n        'hvs' => 'application/vnd.yamaha.hv-script',\n        'i2g' => 'application/vnd.intergeo',\n        'icc' => 'application/vnd.iccprofile',\n        'ice' => 'x-conference/x-cooltalk',\n        'icm' => 'application/vnd.iccprofile',\n        'ico' => 'image/x-icon',\n        'ics' => 'text/calendar',\n        'ief' => 'image/ief',\n        'ifb' => 'text/calendar',\n        'ifm' => 'application/vnd.shana.informed.formdata',\n        'iges' => 'model/iges',\n        'igl' => 'application/vnd.igloader',\n        'igm' => 'application/vnd.insors.igm',\n        'igs' => 'model/iges',\n        'igx' => 'application/vnd.micrografx.igx',\n        'iif' => 'application/vnd.shana.informed.interchange',\n        'img' => 'application/octet-stream',\n        'imp' => 'application/vnd.accpac.simply.imp',\n        'ims' => 'application/vnd.ms-ims',\n        'in' => 'text/plain',\n        'ini' => 'text/plain',\n        'ink' => 'application/inkml+xml',\n        'inkml' => 'application/inkml+xml',\n        'install' => 'application/x-install-instructions',\n        'iota' => 'application/vnd.astraea-software.iota',\n        'ipfix' => 'application/ipfix',\n        'ipk' => 'application/vnd.shana.informed.package',\n        'irm' => 'application/vnd.ibm.rights-management',\n        'irp' => 'application/vnd.irepository.package+xml',\n        'iso' => 'application/x-iso9660-image',\n        'itp' => 'application/vnd.shana.informed.formtemplate',\n        'its' => 'application/its+xml',\n        'ivp' => 'application/vnd.immervision-ivp',\n        'ivu' => 'application/vnd.immervision-ivu',\n        'jad' => 'text/vnd.sun.j2me.app-descriptor',\n        'jade' => 'text/jade',\n        'jam' => 'application/vnd.jam',\n        'jar' => 'application/java-archive',\n        'jardiff' => 'application/x-java-archive-diff',\n        'java' => 'text/x-java-source',\n        'jhc' => 'image/jphc',\n        'jisp' => 'application/vnd.jisp',\n        'jls' => 'image/jls',\n        'jlt' => 'application/vnd.hp-jlyt',\n        'jng' => 'image/x-jng',\n        'jnlp' => 'application/x-java-jnlp-file',\n        'joda' => 'application/vnd.joost.joda-archive',\n        'jp2' => 'image/jp2',\n        'jpe' => 'image/jpeg',\n        'jpeg' => 'image/jpeg',\n        'jpf' => 'image/jpx',\n        'jpg' => 'image/jpeg',\n        'jpg2' => 'image/jp2',\n        'jpgm' => 'video/jpm',\n        'jpgv' => 'video/jpeg',\n        'jph' => 'image/jph',\n        'jpm' => 'video/jpm',\n        'jpx' => 'image/jpx',\n        'js' => 'application/javascript',\n        'json' => 'application/json',\n        'json5' => 'application/json5',\n        'jsonld' => 'application/ld+json',\n        'jsonml' => 'application/jsonml+json',\n        'jsx' => 'text/jsx',\n        'jt' => 'model/jt',\n        'jxr' => 'image/jxr',\n        'jxra' => 'image/jxra',\n        'jxrs' => 'image/jxrs',\n        'jxs' => 'image/jxs',\n        'jxsc' => 'image/jxsc',\n        'jxsi' => 'image/jxsi',\n        'jxss' => 'image/jxss',\n        'kar' => 'audio/midi',\n        'karbon' => 'application/vnd.kde.karbon',\n        'kdb' => 'application/octet-stream',\n        'kdbx' => 'application/x-keepass2',\n        'key' => 'application/x-iwork-keynote-sffkey',\n        'kfo' => 'application/vnd.kde.kformula',\n        'kia' => 'application/vnd.kidspiration',\n        'kml' => 'application/vnd.google-earth.kml+xml',\n        'kmz' => 'application/vnd.google-earth.kmz',\n        'kne' => 'application/vnd.kinar',\n        'knp' => 'application/vnd.kinar',\n        'kon' => 'application/vnd.kde.kontour',\n        'kpr' => 'application/vnd.kde.kpresenter',\n        'kpt' => 'application/vnd.kde.kpresenter',\n        'kpxx' => 'application/vnd.ds-keypoint',\n        'ksp' => 'application/vnd.kde.kspread',\n        'ktr' => 'application/vnd.kahootz',\n        'ktx' => 'image/ktx',\n        'ktx2' => 'image/ktx2',\n        'ktz' => 'application/vnd.kahootz',\n        'kwd' => 'application/vnd.kde.kword',\n        'kwt' => 'application/vnd.kde.kword',\n        'lasxml' => 'application/vnd.las.las+xml',\n        'latex' => 'application/x-latex',\n        'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',\n        'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',\n        'les' => 'application/vnd.hhe.lesson-player',\n        'less' => 'text/less',\n        'lgr' => 'application/lgr+xml',\n        'lha' => 'application/octet-stream',\n        'link66' => 'application/vnd.route66.link66+xml',\n        'list' => 'text/plain',\n        'list3820' => 'application/vnd.ibm.modcap',\n        'listafp' => 'application/vnd.ibm.modcap',\n        'litcoffee' => 'text/coffeescript',\n        'lnk' => 'application/x-ms-shortcut',\n        'log' => 'text/plain',\n        'lostxml' => 'application/lost+xml',\n        'lrf' => 'application/octet-stream',\n        'lrm' => 'application/vnd.ms-lrm',\n        'ltf' => 'application/vnd.frogans.ltf',\n        'lua' => 'text/x-lua',\n        'luac' => 'application/x-lua-bytecode',\n        'lvp' => 'audio/vnd.lucent.voice',\n        'lwp' => 'application/vnd.lotus-wordpro',\n        'lzh' => 'application/octet-stream',\n        'm1v' => 'video/mpeg',\n        'm2a' => 'audio/mpeg',\n        'm2v' => 'video/mpeg',\n        'm3a' => 'audio/mpeg',\n        'm3u' => 'text/plain',\n        'm3u8' => 'application/vnd.apple.mpegurl',\n        'm4a' => 'audio/x-m4a',\n        'm4p' => 'application/mp4',\n        'm4s' => 'video/iso.segment',\n        'm4u' => 'application/vnd.mpegurl',\n        'm4v' => 'video/x-m4v',\n        'm13' => 'application/x-msmediaview',\n        'm14' => 'application/x-msmediaview',\n        'm21' => 'application/mp21',\n        'ma' => 'application/mathematica',\n        'mads' => 'application/mads+xml',\n        'maei' => 'application/mmt-aei+xml',\n        'mag' => 'application/vnd.ecowin.chart',\n        'maker' => 'application/vnd.framemaker',\n        'man' => 'text/troff',\n        'manifest' => 'text/cache-manifest',\n        'map' => 'application/json',\n        'mar' => 'application/octet-stream',\n        'markdown' => 'text/markdown',\n        'mathml' => 'application/mathml+xml',\n        'mb' => 'application/mathematica',\n        'mbk' => 'application/vnd.mobius.mbk',\n        'mbox' => 'application/mbox',\n        'mc1' => 'application/vnd.medcalcdata',\n        'mcd' => 'application/vnd.mcd',\n        'mcurl' => 'text/vnd.curl.mcurl',\n        'md' => 'text/markdown',\n        'mdb' => 'application/x-msaccess',\n        'mdi' => 'image/vnd.ms-modi',\n        'mdx' => 'text/mdx',\n        'me' => 'text/troff',\n        'mesh' => 'model/mesh',\n        'meta4' => 'application/metalink4+xml',\n        'metalink' => 'application/metalink+xml',\n        'mets' => 'application/mets+xml',\n        'mfm' => 'application/vnd.mfmp',\n        'mft' => 'application/rpki-manifest',\n        'mgp' => 'application/vnd.osgeo.mapguide.package',\n        'mgz' => 'application/vnd.proteus.magazine',\n        'mid' => 'audio/midi',\n        'midi' => 'audio/midi',\n        'mie' => 'application/x-mie',\n        'mif' => 'application/vnd.mif',\n        'mime' => 'message/rfc822',\n        'mj2' => 'video/mj2',\n        'mjp2' => 'video/mj2',\n        'mjs' => 'text/javascript',\n        'mk3d' => 'video/x-matroska',\n        'mka' => 'audio/x-matroska',\n        'mkd' => 'text/x-markdown',\n        'mks' => 'video/x-matroska',\n        'mkv' => 'video/x-matroska',\n        'mlp' => 'application/vnd.dolby.mlp',\n        'mmd' => 'application/vnd.chipnuts.karaoke-mmd',\n        'mmf' => 'application/vnd.smaf',\n        'mml' => 'text/mathml',\n        'mmr' => 'image/vnd.fujixerox.edmics-mmr',\n        'mng' => 'video/x-mng',\n        'mny' => 'application/x-msmoney',\n        'mobi' => 'application/x-mobipocket-ebook',\n        'mods' => 'application/mods+xml',\n        'mov' => 'video/quicktime',\n        'movie' => 'video/x-sgi-movie',\n        'mp2' => 'audio/mpeg',\n        'mp2a' => 'audio/mpeg',\n        'mp3' => 'audio/mpeg',\n        'mp4' => 'video/mp4',\n        'mp4a' => 'audio/mp4',\n        'mp4s' => 'application/mp4',\n        'mp4v' => 'video/mp4',\n        'mp21' => 'application/mp21',\n        'mpc' => 'application/vnd.mophun.certificate',\n        'mpd' => 'application/dash+xml',\n        'mpe' => 'video/mpeg',\n        'mpeg' => 'video/mpeg',\n        'mpf' => 'application/media-policy-dataset+xml',\n        'mpg' => 'video/mpeg',\n        'mpg4' => 'video/mp4',\n        'mpga' => 'audio/mpeg',\n        'mpkg' => 'application/vnd.apple.installer+xml',\n        'mpm' => 'application/vnd.blueice.multipass',\n        'mpn' => 'application/vnd.mophun.application',\n        'mpp' => 'application/vnd.ms-project',\n        'mpt' => 'application/vnd.ms-project',\n        'mpy' => 'application/vnd.ibm.minipay',\n        'mqy' => 'application/vnd.mobius.mqy',\n        'mrc' => 'application/marc',\n        'mrcx' => 'application/marcxml+xml',\n        'ms' => 'text/troff',\n        'mscml' => 'application/mediaservercontrol+xml',\n        'mseed' => 'application/vnd.fdsn.mseed',\n        'mseq' => 'application/vnd.mseq',\n        'msf' => 'application/vnd.epson.msf',\n        'msg' => 'application/vnd.ms-outlook',\n        'msh' => 'model/mesh',\n        'msi' => 'application/x-msdownload',\n        'msix' => 'application/msix',\n        'msixbundle' => 'application/msixbundle',\n        'msl' => 'application/vnd.mobius.msl',\n        'msm' => 'application/octet-stream',\n        'msp' => 'application/octet-stream',\n        'msty' => 'application/vnd.muvee.style',\n        'mtl' => 'model/mtl',\n        'mts' => 'model/vnd.mts',\n        'mus' => 'application/vnd.musician',\n        'musd' => 'application/mmt-usd+xml',\n        'musicxml' => 'application/vnd.recordare.musicxml+xml',\n        'mvb' => 'application/x-msmediaview',\n        'mvt' => 'application/vnd.mapbox-vector-tile',\n        'mwf' => 'application/vnd.mfer',\n        'mxf' => 'application/mxf',\n        'mxl' => 'application/vnd.recordare.musicxml',\n        'mxmf' => 'audio/mobile-xmf',\n        'mxml' => 'application/xv+xml',\n        'mxs' => 'application/vnd.triscape.mxs',\n        'mxu' => 'video/vnd.mpegurl',\n        'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',\n        'n3' => 'text/n3',\n        'nb' => 'application/mathematica',\n        'nbp' => 'application/vnd.wolfram.player',\n        'nc' => 'application/x-netcdf',\n        'ncx' => 'application/x-dtbncx+xml',\n        'ndjson' => 'application/x-ndjson',\n        'nfo' => 'text/x-nfo',\n        'ngdat' => 'application/vnd.nokia.n-gage.data',\n        'nitf' => 'application/vnd.nitf',\n        'nlu' => 'application/vnd.neurolanguage.nlu',\n        'nml' => 'application/vnd.enliven',\n        'nnd' => 'application/vnd.noblenet-directory',\n        'nns' => 'application/vnd.noblenet-sealer',\n        'nnw' => 'application/vnd.noblenet-web',\n        'npx' => 'image/vnd.net-fpx',\n        'nq' => 'application/n-quads',\n        'nsc' => 'application/x-conference',\n        'nsf' => 'application/vnd.lotus-notes',\n        'nt' => 'application/n-triples',\n        'ntf' => 'application/vnd.nitf',\n        'numbers' => 'application/x-iwork-numbers-sffnumbers',\n        'nzb' => 'application/x-nzb',\n        'oa2' => 'application/vnd.fujitsu.oasys2',\n        'oa3' => 'application/vnd.fujitsu.oasys3',\n        'oas' => 'application/vnd.fujitsu.oasys',\n        'obd' => 'application/x-msbinder',\n        'obgx' => 'application/vnd.openblox.game+xml',\n        'obj' => 'model/obj',\n        'oda' => 'application/oda',\n        'odb' => 'application/vnd.oasis.opendocument.database',\n        'odc' => 'application/vnd.oasis.opendocument.chart',\n        'odf' => 'application/vnd.oasis.opendocument.formula',\n        'odft' => 'application/vnd.oasis.opendocument.formula-template',\n        'odg' => 'application/vnd.oasis.opendocument.graphics',\n        'odi' => 'application/vnd.oasis.opendocument.image',\n        'odm' => 'application/vnd.oasis.opendocument.text-master',\n        'odp' => 'application/vnd.oasis.opendocument.presentation',\n        'ods' => 'application/vnd.oasis.opendocument.spreadsheet',\n        'odt' => 'application/vnd.oasis.opendocument.text',\n        'oga' => 'audio/ogg',\n        'ogex' => 'model/vnd.opengex',\n        'ogg' => 'audio/ogg',\n        'ogv' => 'video/ogg',\n        'ogx' => 'application/ogg',\n        'omdoc' => 'application/omdoc+xml',\n        'onepkg' => 'application/onenote',\n        'onetmp' => 'application/onenote',\n        'onetoc' => 'application/onenote',\n        'onetoc2' => 'application/onenote',\n        'opf' => 'application/oebps-package+xml',\n        'opml' => 'text/x-opml',\n        'oprc' => 'application/vnd.palm',\n        'opus' => 'audio/ogg',\n        'org' => 'text/x-org',\n        'osf' => 'application/vnd.yamaha.openscoreformat',\n        'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',\n        'osm' => 'application/vnd.openstreetmap.data+xml',\n        'otc' => 'application/vnd.oasis.opendocument.chart-template',\n        'otf' => 'font/otf',\n        'otg' => 'application/vnd.oasis.opendocument.graphics-template',\n        'oth' => 'application/vnd.oasis.opendocument.text-web',\n        'oti' => 'application/vnd.oasis.opendocument.image-template',\n        'otp' => 'application/vnd.oasis.opendocument.presentation-template',\n        'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',\n        'ott' => 'application/vnd.oasis.opendocument.text-template',\n        'ova' => 'application/x-virtualbox-ova',\n        'ovf' => 'application/x-virtualbox-ovf',\n        'owl' => 'application/rdf+xml',\n        'oxps' => 'application/oxps',\n        'oxt' => 'application/vnd.openofficeorg.extension',\n        'p' => 'text/x-pascal',\n        'p7a' => 'application/x-pkcs7-signature',\n        'p7b' => 'application/x-pkcs7-certificates',\n        'p7c' => 'application/pkcs7-mime',\n        'p7m' => 'application/pkcs7-mime',\n        'p7r' => 'application/x-pkcs7-certreqresp',\n        'p7s' => 'application/pkcs7-signature',\n        'p8' => 'application/pkcs8',\n        'p10' => 'application/x-pkcs10',\n        'p12' => 'application/x-pkcs12',\n        'pac' => 'application/x-ns-proxy-autoconfig',\n        'pages' => 'application/x-iwork-pages-sffpages',\n        'pas' => 'text/x-pascal',\n        'paw' => 'application/vnd.pawaafile',\n        'pbd' => 'application/vnd.powerbuilder6',\n        'pbm' => 'image/x-portable-bitmap',\n        'pcap' => 'application/vnd.tcpdump.pcap',\n        'pcf' => 'application/x-font-pcf',\n        'pcl' => 'application/vnd.hp-pcl',\n        'pclxl' => 'application/vnd.hp-pclxl',\n        'pct' => 'image/x-pict',\n        'pcurl' => 'application/vnd.curl.pcurl',\n        'pcx' => 'image/x-pcx',\n        'pdb' => 'application/x-pilot',\n        'pde' => 'text/x-processing',\n        'pdf' => 'application/pdf',\n        'pem' => 'application/x-x509-user-cert',\n        'pfa' => 'application/x-font-type1',\n        'pfb' => 'application/x-font-type1',\n        'pfm' => 'application/x-font-type1',\n        'pfr' => 'application/font-tdpfr',\n        'pfx' => 'application/x-pkcs12',\n        'pgm' => 'image/x-portable-graymap',\n        'pgn' => 'application/x-chess-pgn',\n        'pgp' => 'application/pgp',\n        'phar' => 'application/octet-stream',\n        'php' => 'application/x-httpd-php',\n        'php3' => 'application/x-httpd-php',\n        'php4' => 'application/x-httpd-php',\n        'phps' => 'application/x-httpd-php-source',\n        'phtml' => 'application/x-httpd-php',\n        'pic' => 'image/x-pict',\n        'pkg' => 'application/octet-stream',\n        'pki' => 'application/pkixcmp',\n        'pkipath' => 'application/pkix-pkipath',\n        'pkpass' => 'application/vnd.apple.pkpass',\n        'pl' => 'application/x-perl',\n        'plb' => 'application/vnd.3gpp.pic-bw-large',\n        'plc' => 'application/vnd.mobius.plc',\n        'plf' => 'application/vnd.pocketlearn',\n        'pls' => 'application/pls+xml',\n        'pm' => 'application/x-perl',\n        'pml' => 'application/vnd.ctc-posml',\n        'png' => 'image/png',\n        'pnm' => 'image/x-portable-anymap',\n        'portpkg' => 'application/vnd.macports.portpkg',\n        'pot' => 'application/vnd.ms-powerpoint',\n        'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\n        'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',\n        'ppa' => 'application/vnd.ms-powerpoint',\n        'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',\n        'ppd' => 'application/vnd.cups-ppd',\n        'ppm' => 'image/x-portable-pixmap',\n        'pps' => 'application/vnd.ms-powerpoint',\n        'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\n        'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n        'ppt' => 'application/powerpoint',\n        'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\n        'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n        'pqa' => 'application/vnd.palm',\n        'prc' => 'model/prc',\n        'pre' => 'application/vnd.lotus-freelance',\n        'prf' => 'application/pics-rules',\n        'provx' => 'application/provenance+xml',\n        'ps' => 'application/postscript',\n        'psb' => 'application/vnd.3gpp.pic-bw-small',\n        'psd' => 'application/x-photoshop',\n        'psf' => 'application/x-font-linux-psf',\n        'pskcxml' => 'application/pskc+xml',\n        'pti' => 'image/prs.pti',\n        'ptid' => 'application/vnd.pvi.ptid1',\n        'pub' => 'application/x-mspublisher',\n        'pv' => 'application/octet-stream',\n        'pvb' => 'application/vnd.3gpp.pic-bw-var',\n        'pwn' => 'application/vnd.3m.post-it-notes',\n        'pxf' => 'application/octet-stream',\n        'pya' => 'audio/vnd.ms-playready.media.pya',\n        'pyo' => 'model/vnd.pytha.pyox',\n        'pyox' => 'model/vnd.pytha.pyox',\n        'pyv' => 'video/vnd.ms-playready.media.pyv',\n        'qam' => 'application/vnd.epson.quickanime',\n        'qbo' => 'application/vnd.intu.qbo',\n        'qfx' => 'application/vnd.intu.qfx',\n        'qps' => 'application/vnd.publishare-delta-tree',\n        'qt' => 'video/quicktime',\n        'qwd' => 'application/vnd.quark.quarkxpress',\n        'qwt' => 'application/vnd.quark.quarkxpress',\n        'qxb' => 'application/vnd.quark.quarkxpress',\n        'qxd' => 'application/vnd.quark.quarkxpress',\n        'qxl' => 'application/vnd.quark.quarkxpress',\n        'qxt' => 'application/vnd.quark.quarkxpress',\n        'ra' => 'audio/x-realaudio',\n        'ram' => 'audio/x-pn-realaudio',\n        'raml' => 'application/raml+yaml',\n        'rapd' => 'application/route-apd+xml',\n        'rar' => 'application/x-rar',\n        'ras' => 'image/x-cmu-raster',\n        'rcprofile' => 'application/vnd.ipunplugged.rcprofile',\n        'rdf' => 'application/rdf+xml',\n        'rdz' => 'application/vnd.data-vision.rdz',\n        'relo' => 'application/p2p-overlay+xml',\n        'rep' => 'application/vnd.businessobjects',\n        'res' => 'application/x-dtbresource+xml',\n        'rgb' => 'image/x-rgb',\n        'rif' => 'application/reginfo+xml',\n        'rip' => 'audio/vnd.rip',\n        'ris' => 'application/x-research-info-systems',\n        'rl' => 'application/resource-lists+xml',\n        'rlc' => 'image/vnd.fujixerox.edmics-rlc',\n        'rld' => 'application/resource-lists-diff+xml',\n        'rm' => 'audio/x-pn-realaudio',\n        'rmi' => 'audio/midi',\n        'rmp' => 'audio/x-pn-realaudio-plugin',\n        'rms' => 'application/vnd.jcp.javame.midlet-rms',\n        'rmvb' => 'application/vnd.rn-realmedia-vbr',\n        'rnc' => 'application/relax-ng-compact-syntax',\n        'rng' => 'application/xml',\n        'roa' => 'application/rpki-roa',\n        'roff' => 'text/troff',\n        'rp9' => 'application/vnd.cloanto.rp9',\n        'rpm' => 'audio/x-pn-realaudio-plugin',\n        'rpss' => 'application/vnd.nokia.radio-presets',\n        'rpst' => 'application/vnd.nokia.radio-preset',\n        'rq' => 'application/sparql-query',\n        'rs' => 'application/rls-services+xml',\n        'rsa' => 'application/x-pkcs7',\n        'rsat' => 'application/atsc-rsat+xml',\n        'rsd' => 'application/rsd+xml',\n        'rsheet' => 'application/urc-ressheet+xml',\n        'rss' => 'application/rss+xml',\n        'rtf' => 'text/rtf',\n        'rtx' => 'text/richtext',\n        'run' => 'application/x-makeself',\n        'rusd' => 'application/route-usd+xml',\n        'rv' => 'video/vnd.rn-realvideo',\n        's' => 'text/x-asm',\n        's3m' => 'audio/s3m',\n        'saf' => 'application/vnd.yamaha.smaf-audio',\n        'sass' => 'text/x-sass',\n        'sbml' => 'application/sbml+xml',\n        'sc' => 'application/vnd.ibm.secure-container',\n        'scd' => 'application/x-msschedule',\n        'scm' => 'application/vnd.lotus-screencam',\n        'scq' => 'application/scvp-cv-request',\n        'scs' => 'application/scvp-cv-response',\n        'scss' => 'text/x-scss',\n        'scurl' => 'text/vnd.curl.scurl',\n        'sda' => 'application/vnd.stardivision.draw',\n        'sdc' => 'application/vnd.stardivision.calc',\n        'sdd' => 'application/vnd.stardivision.impress',\n        'sdkd' => 'application/vnd.solent.sdkm+xml',\n        'sdkm' => 'application/vnd.solent.sdkm+xml',\n        'sdp' => 'application/sdp',\n        'sdw' => 'application/vnd.stardivision.writer',\n        'sea' => 'application/octet-stream',\n        'see' => 'application/vnd.seemail',\n        'seed' => 'application/vnd.fdsn.seed',\n        'sema' => 'application/vnd.sema',\n        'semd' => 'application/vnd.semd',\n        'semf' => 'application/vnd.semf',\n        'senmlx' => 'application/senml+xml',\n        'sensmlx' => 'application/sensml+xml',\n        'ser' => 'application/java-serialized-object',\n        'setpay' => 'application/set-payment-initiation',\n        'setreg' => 'application/set-registration-initiation',\n        'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',\n        'sfs' => 'application/vnd.spotfire.sfs',\n        'sfv' => 'text/x-sfv',\n        'sgi' => 'image/sgi',\n        'sgl' => 'application/vnd.stardivision.writer-global',\n        'sgm' => 'text/sgml',\n        'sgml' => 'text/sgml',\n        'sh' => 'application/x-sh',\n        'shar' => 'application/x-shar',\n        'shex' => 'text/shex',\n        'shf' => 'application/shf+xml',\n        'shtml' => 'text/html',\n        'sid' => 'image/x-mrsid-image',\n        'sieve' => 'application/sieve',\n        'sig' => 'application/pgp-signature',\n        'sil' => 'audio/silk',\n        'silo' => 'model/mesh',\n        'sis' => 'application/vnd.symbian.install',\n        'sisx' => 'application/vnd.symbian.install',\n        'sit' => 'application/x-stuffit',\n        'sitx' => 'application/x-stuffitx',\n        'siv' => 'application/sieve',\n        'skd' => 'application/vnd.koan',\n        'skm' => 'application/vnd.koan',\n        'skp' => 'application/vnd.koan',\n        'skt' => 'application/vnd.koan',\n        'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',\n        'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',\n        'slim' => 'text/slim',\n        'slm' => 'text/slim',\n        'sls' => 'application/route-s-tsid+xml',\n        'slt' => 'application/vnd.epson.salt',\n        'sm' => 'application/vnd.stepmania.stepchart',\n        'smf' => 'application/vnd.stardivision.math',\n        'smi' => 'application/smil',\n        'smil' => 'application/smil',\n        'smv' => 'video/x-smv',\n        'smzip' => 'application/vnd.stepmania.package',\n        'snd' => 'audio/basic',\n        'snf' => 'application/x-font-snf',\n        'so' => 'application/octet-stream',\n        'spc' => 'application/x-pkcs7-certificates',\n        'spdx' => 'text/spdx',\n        'spf' => 'application/vnd.yamaha.smaf-phrase',\n        'spl' => 'application/x-futuresplash',\n        'spot' => 'text/vnd.in3d.spot',\n        'spp' => 'application/scvp-vp-response',\n        'spq' => 'application/scvp-vp-request',\n        'spx' => 'audio/ogg',\n        'sql' => 'application/x-sql',\n        'src' => 'application/x-wais-source',\n        'srt' => 'application/x-subrip',\n        'sru' => 'application/sru+xml',\n        'srx' => 'application/sparql-results+xml',\n        'ssdl' => 'application/ssdl+xml',\n        'sse' => 'application/vnd.kodak-descriptor',\n        'ssf' => 'application/vnd.epson.ssf',\n        'ssml' => 'application/ssml+xml',\n        'sst' => 'application/octet-stream',\n        'st' => 'application/vnd.sailingtracker.track',\n        'stc' => 'application/vnd.sun.xml.calc.template',\n        'std' => 'application/vnd.sun.xml.draw.template',\n        'step' => 'application/STEP',\n        'stf' => 'application/vnd.wt.stf',\n        'sti' => 'application/vnd.sun.xml.impress.template',\n        'stk' => 'application/hyperstudio',\n        'stl' => 'model/stl',\n        'stp' => 'application/STEP',\n        'stpx' => 'model/step+xml',\n        'stpxz' => 'model/step-xml+zip',\n        'stpz' => 'model/step+zip',\n        'str' => 'application/vnd.pg.format',\n        'stw' => 'application/vnd.sun.xml.writer.template',\n        'styl' => 'text/stylus',\n        'stylus' => 'text/stylus',\n        'sub' => 'text/vnd.dvb.subtitle',\n        'sus' => 'application/vnd.sus-calendar',\n        'susp' => 'application/vnd.sus-calendar',\n        'sv4cpio' => 'application/x-sv4cpio',\n        'sv4crc' => 'application/x-sv4crc',\n        'svc' => 'application/vnd.dvb.service',\n        'svd' => 'application/vnd.svd',\n        'svg' => 'image/svg+xml',\n        'svgz' => 'image/svg+xml',\n        'swa' => 'application/x-director',\n        'swf' => 'application/x-shockwave-flash',\n        'swi' => 'application/vnd.aristanetworks.swi',\n        'swidtag' => 'application/swid+xml',\n        'sxc' => 'application/vnd.sun.xml.calc',\n        'sxd' => 'application/vnd.sun.xml.draw',\n        'sxg' => 'application/vnd.sun.xml.writer.global',\n        'sxi' => 'application/vnd.sun.xml.impress',\n        'sxm' => 'application/vnd.sun.xml.math',\n        'sxw' => 'application/vnd.sun.xml.writer',\n        't' => 'text/troff',\n        't3' => 'application/x-t3vm-image',\n        't38' => 'image/t38',\n        'taglet' => 'application/vnd.mynfc',\n        'tao' => 'application/vnd.tao.intent-module-archive',\n        'tap' => 'image/vnd.tencent.tap',\n        'tar' => 'application/x-tar',\n        'tcap' => 'application/vnd.3gpp2.tcap',\n        'tcl' => 'application/x-tcl',\n        'td' => 'application/urc-targetdesc+xml',\n        'teacher' => 'application/vnd.smart.teacher',\n        'tei' => 'application/tei+xml',\n        'teicorpus' => 'application/tei+xml',\n        'tex' => 'application/x-tex',\n        'texi' => 'application/x-texinfo',\n        'texinfo' => 'application/x-texinfo',\n        'text' => 'text/plain',\n        'tfi' => 'application/thraud+xml',\n        'tfm' => 'application/x-tex-tfm',\n        'tfx' => 'image/tiff-fx',\n        'tga' => 'image/x-tga',\n        'tgz' => 'application/x-tar',\n        'thmx' => 'application/vnd.ms-officetheme',\n        'tif' => 'image/tiff',\n        'tiff' => 'image/tiff',\n        'tk' => 'application/x-tcl',\n        'tmo' => 'application/vnd.tmobile-livetv',\n        'toml' => 'application/toml',\n        'torrent' => 'application/x-bittorrent',\n        'tpl' => 'application/vnd.groove-tool-template',\n        'tpt' => 'application/vnd.trid.tpt',\n        'tr' => 'text/troff',\n        'tra' => 'application/vnd.trueapp',\n        'trig' => 'application/trig',\n        'trm' => 'application/x-msterminal',\n        'ts' => 'video/mp2t',\n        'tsd' => 'application/timestamped-data',\n        'tsv' => 'text/tab-separated-values',\n        'ttc' => 'font/collection',\n        'ttf' => 'font/ttf',\n        'ttl' => 'text/turtle',\n        'ttml' => 'application/ttml+xml',\n        'twd' => 'application/vnd.simtech-mindmapper',\n        'twds' => 'application/vnd.simtech-mindmapper',\n        'txd' => 'application/vnd.genomatix.tuxedo',\n        'txf' => 'application/vnd.mobius.txf',\n        'txt' => 'text/plain',\n        'u3d' => 'model/u3d',\n        'u8dsn' => 'message/global-delivery-status',\n        'u8hdr' => 'message/global-headers',\n        'u8mdn' => 'message/global-disposition-notification',\n        'u8msg' => 'message/global',\n        'u32' => 'application/x-authorware-bin',\n        'ubj' => 'application/ubjson',\n        'udeb' => 'application/x-debian-package',\n        'ufd' => 'application/vnd.ufdl',\n        'ufdl' => 'application/vnd.ufdl',\n        'ulx' => 'application/x-glulx',\n        'umj' => 'application/vnd.umajin',\n        'unityweb' => 'application/vnd.unity',\n        'uo' => 'application/vnd.uoml+xml',\n        'uoml' => 'application/vnd.uoml+xml',\n        'uri' => 'text/uri-list',\n        'uris' => 'text/uri-list',\n        'urls' => 'text/uri-list',\n        'usda' => 'model/vnd.usda',\n        'usdz' => 'model/vnd.usdz+zip',\n        'ustar' => 'application/x-ustar',\n        'utz' => 'application/vnd.uiq.theme',\n        'uu' => 'text/x-uuencode',\n        'uva' => 'audio/vnd.dece.audio',\n        'uvd' => 'application/vnd.dece.data',\n        'uvf' => 'application/vnd.dece.data',\n        'uvg' => 'image/vnd.dece.graphic',\n        'uvh' => 'video/vnd.dece.hd',\n        'uvi' => 'image/vnd.dece.graphic',\n        'uvm' => 'video/vnd.dece.mobile',\n        'uvp' => 'video/vnd.dece.pd',\n        'uvs' => 'video/vnd.dece.sd',\n        'uvt' => 'application/vnd.dece.ttml+xml',\n        'uvu' => 'video/vnd.uvvu.mp4',\n        'uvv' => 'video/vnd.dece.video',\n        'uvva' => 'audio/vnd.dece.audio',\n        'uvvd' => 'application/vnd.dece.data',\n        'uvvf' => 'application/vnd.dece.data',\n        'uvvg' => 'image/vnd.dece.graphic',\n        'uvvh' => 'video/vnd.dece.hd',\n        'uvvi' => 'image/vnd.dece.graphic',\n        'uvvm' => 'video/vnd.dece.mobile',\n        'uvvp' => 'video/vnd.dece.pd',\n        'uvvs' => 'video/vnd.dece.sd',\n        'uvvt' => 'application/vnd.dece.ttml+xml',\n        'uvvu' => 'video/vnd.uvvu.mp4',\n        'uvvv' => 'video/vnd.dece.video',\n        'uvvx' => 'application/vnd.dece.unspecified',\n        'uvvz' => 'application/vnd.dece.zip',\n        'uvx' => 'application/vnd.dece.unspecified',\n        'uvz' => 'application/vnd.dece.zip',\n        'vbox' => 'application/x-virtualbox-vbox',\n        'vbox-extpack' => 'application/x-virtualbox-vbox-extpack',\n        'vcard' => 'text/vcard',\n        'vcd' => 'application/x-cdlink',\n        'vcf' => 'text/x-vcard',\n        'vcg' => 'application/vnd.groove-vcard',\n        'vcs' => 'text/x-vcalendar',\n        'vcx' => 'application/vnd.vcx',\n        'vdi' => 'application/x-virtualbox-vdi',\n        'vds' => 'model/vnd.sap.vds',\n        'vhd' => 'application/x-virtualbox-vhd',\n        'vis' => 'application/vnd.visionary',\n        'viv' => 'video/vnd.vivo',\n        'vlc' => 'application/videolan',\n        'vmdk' => 'application/x-virtualbox-vmdk',\n        'vob' => 'video/x-ms-vob',\n        'vor' => 'application/vnd.stardivision.writer',\n        'vox' => 'application/x-authorware-bin',\n        'vrml' => 'model/vrml',\n        'vsd' => 'application/vnd.visio',\n        'vsf' => 'application/vnd.vsf',\n        'vss' => 'application/vnd.visio',\n        'vst' => 'application/vnd.visio',\n        'vsw' => 'application/vnd.visio',\n        'vtf' => 'image/vnd.valve.source.texture',\n        'vtt' => 'text/vtt',\n        'vtu' => 'model/vnd.vtu',\n        'vxml' => 'application/voicexml+xml',\n        'w3d' => 'application/x-director',\n        'wad' => 'application/x-doom',\n        'wadl' => 'application/vnd.sun.wadl+xml',\n        'war' => 'application/java-archive',\n        'wasm' => 'application/wasm',\n        'wav' => 'audio/x-wav',\n        'wax' => 'audio/x-ms-wax',\n        'wbmp' => 'image/vnd.wap.wbmp',\n        'wbs' => 'application/vnd.criticaltools.wbs+xml',\n        'wbxml' => 'application/wbxml',\n        'wcm' => 'application/vnd.ms-works',\n        'wdb' => 'application/vnd.ms-works',\n        'wdp' => 'image/vnd.ms-photo',\n        'weba' => 'audio/webm',\n        'webapp' => 'application/x-web-app-manifest+json',\n        'webm' => 'video/webm',\n        'webmanifest' => 'application/manifest+json',\n        'webp' => 'image/webp',\n        'wg' => 'application/vnd.pmi.widget',\n        'wgsl' => 'text/wgsl',\n        'wgt' => 'application/widget',\n        'wif' => 'application/watcherinfo+xml',\n        'wks' => 'application/vnd.ms-works',\n        'wm' => 'video/x-ms-wm',\n        'wma' => 'audio/x-ms-wma',\n        'wmd' => 'application/x-ms-wmd',\n        'wmf' => 'image/wmf',\n        'wml' => 'text/vnd.wap.wml',\n        'wmlc' => 'application/wmlc',\n        'wmls' => 'text/vnd.wap.wmlscript',\n        'wmlsc' => 'application/vnd.wap.wmlscriptc',\n        'wmv' => 'video/x-ms-wmv',\n        'wmx' => 'video/x-ms-wmx',\n        'wmz' => 'application/x-msmetafile',\n        'woff' => 'font/woff',\n        'woff2' => 'font/woff2',\n        'word' => 'application/msword',\n        'wpd' => 'application/vnd.wordperfect',\n        'wpl' => 'application/vnd.ms-wpl',\n        'wps' => 'application/vnd.ms-works',\n        'wqd' => 'application/vnd.wqd',\n        'wri' => 'application/x-mswrite',\n        'wrl' => 'model/vrml',\n        'wsc' => 'message/vnd.wfa.wsc',\n        'wsdl' => 'application/wsdl+xml',\n        'wspolicy' => 'application/wspolicy+xml',\n        'wtb' => 'application/vnd.webturbo',\n        'wvx' => 'video/x-ms-wvx',\n        'x3d' => 'model/x3d+xml',\n        'x3db' => 'model/x3d+fastinfoset',\n        'x3dbz' => 'model/x3d+binary',\n        'x3dv' => 'model/x3d-vrml',\n        'x3dvz' => 'model/x3d+vrml',\n        'x3dz' => 'model/x3d+xml',\n        'x32' => 'application/x-authorware-bin',\n        'x_b' => 'model/vnd.parasolid.transmit.binary',\n        'x_t' => 'model/vnd.parasolid.transmit.text',\n        'xaml' => 'application/xaml+xml',\n        'xap' => 'application/x-silverlight-app',\n        'xar' => 'application/vnd.xara',\n        'xav' => 'application/xcap-att+xml',\n        'xbap' => 'application/x-ms-xbap',\n        'xbd' => 'application/vnd.fujixerox.docuworks.binder',\n        'xbm' => 'image/x-xbitmap',\n        'xca' => 'application/xcap-caps+xml',\n        'xcs' => 'application/calendar+xml',\n        'xdf' => 'application/xcap-diff+xml',\n        'xdm' => 'application/vnd.syncml.dm+xml',\n        'xdp' => 'application/vnd.adobe.xdp+xml',\n        'xdssc' => 'application/dssc+xml',\n        'xdw' => 'application/vnd.fujixerox.docuworks',\n        'xel' => 'application/xcap-el+xml',\n        'xenc' => 'application/xenc+xml',\n        'xer' => 'application/patch-ops-error+xml',\n        'xfdf' => 'application/xfdf',\n        'xfdl' => 'application/vnd.xfdl',\n        'xht' => 'application/xhtml+xml',\n        'xhtm' => 'application/vnd.pwg-xhtml-print+xml',\n        'xhtml' => 'application/xhtml+xml',\n        'xhvml' => 'application/xv+xml',\n        'xif' => 'image/vnd.xiff',\n        'xl' => 'application/excel',\n        'xla' => 'application/vnd.ms-excel',\n        'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',\n        'xlc' => 'application/vnd.ms-excel',\n        'xlf' => 'application/xliff+xml',\n        'xlm' => 'application/vnd.ms-excel',\n        'xls' => 'application/vnd.ms-excel',\n        'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\n        'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',\n        'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n        'xlt' => 'application/vnd.ms-excel',\n        'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',\n        'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n        'xlw' => 'application/vnd.ms-excel',\n        'xm' => 'audio/xm',\n        'xml' => 'application/xml',\n        'xns' => 'application/xcap-ns+xml',\n        'xo' => 'application/vnd.olpc-sugar',\n        'xop' => 'application/xop+xml',\n        'xpi' => 'application/x-xpinstall',\n        'xpl' => 'application/xproc+xml',\n        'xpm' => 'image/x-xpixmap',\n        'xpr' => 'application/vnd.is-xpr',\n        'xps' => 'application/vnd.ms-xpsdocument',\n        'xpw' => 'application/vnd.intercon.formnet',\n        'xpx' => 'application/vnd.intercon.formnet',\n        'xsd' => 'application/xml',\n        'xsf' => 'application/prs.xsf+xml',\n        'xsl' => 'application/xml',\n        'xslt' => 'application/xslt+xml',\n        'xsm' => 'application/vnd.syncml+xml',\n        'xspf' => 'application/xspf+xml',\n        'xul' => 'application/vnd.mozilla.xul+xml',\n        'xvm' => 'application/xv+xml',\n        'xvml' => 'application/xv+xml',\n        'xwd' => 'image/x-xwindowdump',\n        'xyz' => 'chemical/x-xyz',\n        'xz' => 'application/x-xz',\n        'yaml' => 'text/yaml',\n        'yang' => 'application/yang',\n        'yin' => 'application/yin+xml',\n        'yml' => 'text/yaml',\n        'ymp' => 'text/x-suse-ymp',\n        'z' => 'application/x-compress',\n        'z1' => 'application/x-zmachine',\n        'z2' => 'application/x-zmachine',\n        'z3' => 'application/x-zmachine',\n        'z4' => 'application/x-zmachine',\n        'z5' => 'application/x-zmachine',\n        'z6' => 'application/x-zmachine',\n        'z7' => 'application/x-zmachine',\n        'z8' => 'application/x-zmachine',\n        'zaz' => 'application/vnd.zzazz.deck+xml',\n        'zip' => 'application/zip',\n        'zir' => 'application/vnd.zul',\n        'zirz' => 'application/vnd.zul',\n        'zmm' => 'application/vnd.handheld-entertainment+xml',\n        'zsh' => 'text/x-scriptzsh',\n    ];\n\n    /**\n     * @var array<string, string>\n     *\n     * @internal\n     */\n    public const EXTENSIONS_FOR_MIME_TIMES = [\n        'application/andrew-inset' => ['ez'],\n        'application/appinstaller' => ['appinstaller'],\n        'application/applixware' => ['aw'],\n        'application/appx' => ['appx'],\n        'application/appxbundle' => ['appxbundle'],\n        'application/atom+xml' => ['atom'],\n        'application/atomcat+xml' => ['atomcat'],\n        'application/atomdeleted+xml' => ['atomdeleted'],\n        'application/atomsvc+xml' => ['atomsvc'],\n        'application/atsc-dwd+xml' => ['dwd'],\n        'application/atsc-held+xml' => ['held'],\n        'application/atsc-rsat+xml' => ['rsat'],\n        'application/automationml-aml+xml' => ['aml'],\n        'application/automationml-amlx+zip' => ['amlx'],\n        'application/bdoc' => ['bdoc'],\n        'application/calendar+xml' => ['xcs'],\n        'application/ccxml+xml' => ['ccxml'],\n        'application/cdfx+xml' => ['cdfx'],\n        'application/cdmi-capability' => ['cdmia'],\n        'application/cdmi-container' => ['cdmic'],\n        'application/cdmi-domain' => ['cdmid'],\n        'application/cdmi-object' => ['cdmio'],\n        'application/cdmi-queue' => ['cdmiq'],\n        'application/cpl+xml' => ['cpl'],\n        'application/cu-seeme' => ['cu'],\n        'application/cwl' => ['cwl'],\n        'application/dash+xml' => ['mpd'],\n        'application/dash-patch+xml' => ['mpp'],\n        'application/davmount+xml' => ['davmount'],\n        'application/docbook+xml' => ['dbk'],\n        'application/dssc+der' => ['dssc'],\n        'application/dssc+xml' => ['xdssc'],\n        'application/ecmascript' => ['ecma'],\n        'application/emma+xml' => ['emma'],\n        'application/emotionml+xml' => ['emotionml'],\n        'application/epub+zip' => ['epub'],\n        'application/exi' => ['exi'],\n        'application/express' => ['exp'],\n        'application/fdf' => ['fdf'],\n        'application/fdt+xml' => ['fdt'],\n        'application/font-tdpfr' => ['pfr'],\n        'application/geo+json' => ['geojson'],\n        'application/gml+xml' => ['gml'],\n        'application/gpx+xml' => ['gpx'],\n        'application/gxf' => ['gxf'],\n        'application/gzip' => ['gz', 'gzip'],\n        'application/hjson' => ['hjson'],\n        'application/hyperstudio' => ['stk'],\n        'application/inkml+xml' => ['ink', 'inkml'],\n        'application/ipfix' => ['ipfix'],\n        'application/its+xml' => ['its'],\n        'application/java-archive' => ['jar', 'war', 'ear'],\n        'application/java-serialized-object' => ['ser'],\n        'application/java-vm' => ['class'],\n        'application/javascript' => ['js'],\n        'application/json' => ['json', 'map'],\n        'application/json5' => ['json5'],\n        'application/jsonml+json' => ['jsonml'],\n        'application/ld+json' => ['jsonld'],\n        'application/lgr+xml' => ['lgr'],\n        'application/lost+xml' => ['lostxml'],\n        'application/mac-binhex40' => ['hqx'],\n        'application/mac-compactpro' => ['cpt'],\n        'application/mads+xml' => ['mads'],\n        'application/manifest+json' => ['webmanifest'],\n        'application/marc' => ['mrc'],\n        'application/marcxml+xml' => ['mrcx'],\n        'application/mathematica' => ['ma', 'nb', 'mb'],\n        'application/mathml+xml' => ['mathml'],\n        'application/mbox' => ['mbox'],\n        'application/media-policy-dataset+xml' => ['mpf'],\n        'application/mediaservercontrol+xml' => ['mscml'],\n        'application/metalink+xml' => ['metalink'],\n        'application/metalink4+xml' => ['meta4'],\n        'application/mets+xml' => ['mets'],\n        'application/mmt-aei+xml' => ['maei'],\n        'application/mmt-usd+xml' => ['musd'],\n        'application/mods+xml' => ['mods'],\n        'application/mp21' => ['m21', 'mp21'],\n        'application/mp4' => ['mp4', 'mpg4', 'mp4s', 'm4p'],\n        'application/msix' => ['msix'],\n        'application/msixbundle' => ['msixbundle'],\n        'application/msword' => ['doc', 'dot', 'word'],\n        'application/mxf' => ['mxf'],\n        'application/n-quads' => ['nq'],\n        'application/n-triples' => ['nt'],\n        'application/node' => ['cjs'],\n        'application/octet-stream' => ['bin', 'dms', 'lrf', 'mar', 'so', 'dist', 'distz', 'pkg', 'bpk', 'dump', 'elc', 'deploy', 'exe', 'dll', 'deb', 'dmg', 'iso', 'img', 'msi', 'msp', 'msm', 'buffer', 'phar', 'lha', 'lzh', 'class', 'sea', 'dmn', 'bpmn', 'kdb', 'sst', 'csr', 'dst', 'pv', 'pxf'],\n        'application/oda' => ['oda'],\n        'application/oebps-package+xml' => ['opf'],\n        'application/ogg' => ['ogx'],\n        'application/omdoc+xml' => ['omdoc'],\n        'application/onenote' => ['onetoc', 'onetoc2', 'onetmp', 'onepkg'],\n        'application/oxps' => ['oxps'],\n        'application/p2p-overlay+xml' => ['relo'],\n        'application/patch-ops-error+xml' => ['xer'],\n        'application/pdf' => ['pdf', 'ai'],\n        'application/pgp-encrypted' => ['pgp'],\n        'application/pgp-keys' => ['asc'],\n        'application/pgp-signature' => ['sig', 'asc'],\n        'application/pics-rules' => ['prf'],\n        'application/pkcs10' => ['p10'],\n        'application/pkcs7-mime' => ['p7m', 'p7c'],\n        'application/pkcs7-signature' => ['p7s'],\n        'application/pkcs8' => ['p8'],\n        'application/pkix-attr-cert' => ['ac'],\n        'application/pkix-cert' => ['cer'],\n        'application/pkix-crl' => ['crl'],\n        'application/pkix-pkipath' => ['pkipath'],\n        'application/pkixcmp' => ['pki'],\n        'application/pls+xml' => ['pls'],\n        'application/postscript' => ['ai', 'eps', 'ps'],\n        'application/provenance+xml' => ['provx'],\n        'application/prs.cww' => ['cww'],\n        'application/prs.xsf+xml' => ['xsf'],\n        'application/pskc+xml' => ['pskcxml'],\n        'application/raml+yaml' => ['raml'],\n        'application/rdf+xml' => ['rdf', 'owl'],\n        'application/reginfo+xml' => ['rif'],\n        'application/relax-ng-compact-syntax' => ['rnc'],\n        'application/resource-lists+xml' => ['rl'],\n        'application/resource-lists-diff+xml' => ['rld'],\n        'application/rls-services+xml' => ['rs'],\n        'application/route-apd+xml' => ['rapd'],\n        'application/route-s-tsid+xml' => ['sls'],\n        'application/route-usd+xml' => ['rusd'],\n        'application/rpki-ghostbusters' => ['gbr'],\n        'application/rpki-manifest' => ['mft'],\n        'application/rpki-roa' => ['roa'],\n        'application/rsd+xml' => ['rsd'],\n        'application/rss+xml' => ['rss'],\n        'application/rtf' => ['rtf'],\n        'application/sbml+xml' => ['sbml'],\n        'application/scvp-cv-request' => ['scq'],\n        'application/scvp-cv-response' => ['scs'],\n        'application/scvp-vp-request' => ['spq'],\n        'application/scvp-vp-response' => ['spp'],\n        'application/sdp' => ['sdp'],\n        'application/senml+xml' => ['senmlx'],\n        'application/sensml+xml' => ['sensmlx'],\n        'application/set-payment-initiation' => ['setpay'],\n        'application/set-registration-initiation' => ['setreg'],\n        'application/shf+xml' => ['shf'],\n        'application/sieve' => ['siv', 'sieve'],\n        'application/smil+xml' => ['smi', 'smil'],\n        'application/sparql-query' => ['rq'],\n        'application/sparql-results+xml' => ['srx'],\n        'application/sql' => ['sql'],\n        'application/srgs' => ['gram'],\n        'application/srgs+xml' => ['grxml'],\n        'application/sru+xml' => ['sru'],\n        'application/ssdl+xml' => ['ssdl'],\n        'application/ssml+xml' => ['ssml'],\n        'application/swid+xml' => ['swidtag'],\n        'application/tei+xml' => ['tei', 'teicorpus'],\n        'application/thraud+xml' => ['tfi'],\n        'application/timestamped-data' => ['tsd'],\n        'application/toml' => ['toml'],\n        'application/trig' => ['trig'],\n        'application/ttml+xml' => ['ttml'],\n        'application/ubjson' => ['ubj'],\n        'application/urc-ressheet+xml' => ['rsheet'],\n        'application/urc-targetdesc+xml' => ['td'],\n        'application/vnd.1000minds.decision-model+xml' => ['1km'],\n        'application/vnd.3gpp.pic-bw-large' => ['plb'],\n        'application/vnd.3gpp.pic-bw-small' => ['psb'],\n        'application/vnd.3gpp.pic-bw-var' => ['pvb'],\n        'application/vnd.3gpp2.tcap' => ['tcap'],\n        'application/vnd.3m.post-it-notes' => ['pwn'],\n        'application/vnd.accpac.simply.aso' => ['aso'],\n        'application/vnd.accpac.simply.imp' => ['imp'],\n        'application/vnd.acucobol' => ['acu'],\n        'application/vnd.acucorp' => ['atc', 'acutc'],\n        'application/vnd.adobe.air-application-installer-package+zip' => ['air'],\n        'application/vnd.adobe.formscentral.fcdt' => ['fcdt'],\n        'application/vnd.adobe.fxp' => ['fxp', 'fxpl'],\n        'application/vnd.adobe.xdp+xml' => ['xdp'],\n        'application/vnd.adobe.xfdf' => ['xfdf'],\n        'application/vnd.age' => ['age'],\n        'application/vnd.ahead.space' => ['ahead'],\n        'application/vnd.airzip.filesecure.azf' => ['azf'],\n        'application/vnd.airzip.filesecure.azs' => ['azs'],\n        'application/vnd.amazon.ebook' => ['azw'],\n        'application/vnd.americandynamics.acc' => ['acc'],\n        'application/vnd.amiga.ami' => ['ami'],\n        'application/vnd.android.package-archive' => ['apk'],\n        'application/vnd.anser-web-certificate-issue-initiation' => ['cii'],\n        'application/vnd.anser-web-funds-transfer-initiation' => ['fti'],\n        'application/vnd.antix.game-component' => ['atx'],\n        'application/vnd.apple.installer+xml' => ['mpkg'],\n        'application/vnd.apple.keynote' => ['key'],\n        'application/vnd.apple.mpegurl' => ['m3u8'],\n        'application/vnd.apple.numbers' => ['numbers'],\n        'application/vnd.apple.pages' => ['pages'],\n        'application/vnd.apple.pkpass' => ['pkpass'],\n        'application/vnd.aristanetworks.swi' => ['swi'],\n        'application/vnd.astraea-software.iota' => ['iota'],\n        'application/vnd.audiograph' => ['aep'],\n        'application/vnd.balsamiq.bmml+xml' => ['bmml'],\n        'application/vnd.blueice.multipass' => ['mpm'],\n        'application/vnd.bmi' => ['bmi'],\n        'application/vnd.businessobjects' => ['rep'],\n        'application/vnd.chemdraw+xml' => ['cdxml'],\n        'application/vnd.chipnuts.karaoke-mmd' => ['mmd'],\n        'application/vnd.cinderella' => ['cdy'],\n        'application/vnd.citationstyles.style+xml' => ['csl'],\n        'application/vnd.claymore' => ['cla'],\n        'application/vnd.cloanto.rp9' => ['rp9'],\n        'application/vnd.clonk.c4group' => ['c4g', 'c4d', 'c4f', 'c4p', 'c4u'],\n        'application/vnd.cluetrust.cartomobile-config' => ['c11amc'],\n        'application/vnd.cluetrust.cartomobile-config-pkg' => ['c11amz'],\n        'application/vnd.commonspace' => ['csp'],\n        'application/vnd.contact.cmsg' => ['cdbcmsg'],\n        'application/vnd.cosmocaller' => ['cmc'],\n        'application/vnd.crick.clicker' => ['clkx'],\n        'application/vnd.crick.clicker.keyboard' => ['clkk'],\n        'application/vnd.crick.clicker.palette' => ['clkp'],\n        'application/vnd.crick.clicker.template' => ['clkt'],\n        'application/vnd.crick.clicker.wordbank' => ['clkw'],\n        'application/vnd.criticaltools.wbs+xml' => ['wbs'],\n        'application/vnd.ctc-posml' => ['pml'],\n        'application/vnd.cups-ppd' => ['ppd'],\n        'application/vnd.curl.car' => ['car'],\n        'application/vnd.curl.pcurl' => ['pcurl'],\n        'application/vnd.dart' => ['dart'],\n        'application/vnd.data-vision.rdz' => ['rdz'],\n        'application/vnd.dbf' => ['dbf'],\n        'application/vnd.dece.data' => ['uvf', 'uvvf', 'uvd', 'uvvd'],\n        'application/vnd.dece.ttml+xml' => ['uvt', 'uvvt'],\n        'application/vnd.dece.unspecified' => ['uvx', 'uvvx'],\n        'application/vnd.dece.zip' => ['uvz', 'uvvz'],\n        'application/vnd.denovo.fcselayout-link' => ['fe_launch'],\n        'application/vnd.dna' => ['dna'],\n        'application/vnd.dolby.mlp' => ['mlp'],\n        'application/vnd.dpgraph' => ['dpg'],\n        'application/vnd.dreamfactory' => ['dfac'],\n        'application/vnd.ds-keypoint' => ['kpxx'],\n        'application/vnd.dvb.ait' => ['ait'],\n        'application/vnd.dvb.service' => ['svc'],\n        'application/vnd.dynageo' => ['geo'],\n        'application/vnd.ecowin.chart' => ['mag'],\n        'application/vnd.enliven' => ['nml'],\n        'application/vnd.epson.esf' => ['esf'],\n        'application/vnd.epson.msf' => ['msf'],\n        'application/vnd.epson.quickanime' => ['qam'],\n        'application/vnd.epson.salt' => ['slt'],\n        'application/vnd.epson.ssf' => ['ssf'],\n        'application/vnd.eszigno3+xml' => ['es3', 'et3'],\n        'application/vnd.ezpix-album' => ['ez2'],\n        'application/vnd.ezpix-package' => ['ez3'],\n        'application/vnd.fdf' => ['fdf'],\n        'application/vnd.fdsn.mseed' => ['mseed'],\n        'application/vnd.fdsn.seed' => ['seed', 'dataless'],\n        'application/vnd.flographit' => ['gph'],\n        'application/vnd.fluxtime.clip' => ['ftc'],\n        'application/vnd.framemaker' => ['fm', 'frame', 'maker', 'book'],\n        'application/vnd.frogans.fnc' => ['fnc'],\n        'application/vnd.frogans.ltf' => ['ltf'],\n        'application/vnd.fsc.weblaunch' => ['fsc'],\n        'application/vnd.fujitsu.oasys' => ['oas'],\n        'application/vnd.fujitsu.oasys2' => ['oa2'],\n        'application/vnd.fujitsu.oasys3' => ['oa3'],\n        'application/vnd.fujitsu.oasysgp' => ['fg5'],\n        'application/vnd.fujitsu.oasysprs' => ['bh2'],\n        'application/vnd.fujixerox.ddd' => ['ddd'],\n        'application/vnd.fujixerox.docuworks' => ['xdw'],\n        'application/vnd.fujixerox.docuworks.binder' => ['xbd'],\n        'application/vnd.fuzzysheet' => ['fzs'],\n        'application/vnd.genomatix.tuxedo' => ['txd'],\n        'application/vnd.geogebra.file' => ['ggb'],\n        'application/vnd.geogebra.tool' => ['ggt'],\n        'application/vnd.geometry-explorer' => ['gex', 'gre'],\n        'application/vnd.geonext' => ['gxt'],\n        'application/vnd.geoplan' => ['g2w'],\n        'application/vnd.geospace' => ['g3w'],\n        'application/vnd.gmx' => ['gmx'],\n        'application/vnd.google-apps.document' => ['gdoc'],\n        'application/vnd.google-apps.presentation' => ['gslides'],\n        'application/vnd.google-apps.spreadsheet' => ['gsheet'],\n        'application/vnd.google-earth.kml+xml' => ['kml'],\n        'application/vnd.google-earth.kmz' => ['kmz'],\n        'application/vnd.grafeq' => ['gqf', 'gqs'],\n        'application/vnd.groove-account' => ['gac'],\n        'application/vnd.groove-help' => ['ghf'],\n        'application/vnd.groove-identity-message' => ['gim'],\n        'application/vnd.groove-injector' => ['grv'],\n        'application/vnd.groove-tool-message' => ['gtm'],\n        'application/vnd.groove-tool-template' => ['tpl'],\n        'application/vnd.groove-vcard' => ['vcg'],\n        'application/vnd.hal+xml' => ['hal'],\n        'application/vnd.handheld-entertainment+xml' => ['zmm'],\n        'application/vnd.hbci' => ['hbci'],\n        'application/vnd.hhe.lesson-player' => ['les'],\n        'application/vnd.hp-hpgl' => ['hpgl'],\n        'application/vnd.hp-hpid' => ['hpid'],\n        'application/vnd.hp-hps' => ['hps'],\n        'application/vnd.hp-jlyt' => ['jlt'],\n        'application/vnd.hp-pcl' => ['pcl'],\n        'application/vnd.hp-pclxl' => ['pclxl'],\n        'application/vnd.hydrostatix.sof-data' => ['sfd-hdstx'],\n        'application/vnd.ibm.minipay' => ['mpy'],\n        'application/vnd.ibm.modcap' => ['afp', 'listafp', 'list3820'],\n        'application/vnd.ibm.rights-management' => ['irm'],\n        'application/vnd.ibm.secure-container' => ['sc'],\n        'application/vnd.iccprofile' => ['icc', 'icm'],\n        'application/vnd.igloader' => ['igl'],\n        'application/vnd.immervision-ivp' => ['ivp'],\n        'application/vnd.immervision-ivu' => ['ivu'],\n        'application/vnd.insors.igm' => ['igm'],\n        'application/vnd.intercon.formnet' => ['xpw', 'xpx'],\n        'application/vnd.intergeo' => ['i2g'],\n        'application/vnd.intu.qbo' => ['qbo'],\n        'application/vnd.intu.qfx' => ['qfx'],\n        'application/vnd.ipunplugged.rcprofile' => ['rcprofile'],\n        'application/vnd.irepository.package+xml' => ['irp'],\n        'application/vnd.is-xpr' => ['xpr'],\n        'application/vnd.isac.fcs' => ['fcs'],\n        'application/vnd.jam' => ['jam'],\n        'application/vnd.jcp.javame.midlet-rms' => ['rms'],\n        'application/vnd.jisp' => ['jisp'],\n        'application/vnd.joost.joda-archive' => ['joda'],\n        'application/vnd.kahootz' => ['ktz', 'ktr'],\n        'application/vnd.kde.karbon' => ['karbon'],\n        'application/vnd.kde.kchart' => ['chrt'],\n        'application/vnd.kde.kformula' => ['kfo'],\n        'application/vnd.kde.kivio' => ['flw'],\n        'application/vnd.kde.kontour' => ['kon'],\n        'application/vnd.kde.kpresenter' => ['kpr', 'kpt'],\n        'application/vnd.kde.kspread' => ['ksp'],\n        'application/vnd.kde.kword' => ['kwd', 'kwt'],\n        'application/vnd.kenameaapp' => ['htke'],\n        'application/vnd.kidspiration' => ['kia'],\n        'application/vnd.kinar' => ['kne', 'knp'],\n        'application/vnd.koan' => ['skp', 'skd', 'skt', 'skm'],\n        'application/vnd.kodak-descriptor' => ['sse'],\n        'application/vnd.las.las+xml' => ['lasxml'],\n        'application/vnd.llamagraphics.life-balance.desktop' => ['lbd'],\n        'application/vnd.llamagraphics.life-balance.exchange+xml' => ['lbe'],\n        'application/vnd.lotus-1-2-3' => ['123'],\n        'application/vnd.lotus-approach' => ['apr'],\n        'application/vnd.lotus-freelance' => ['pre'],\n        'application/vnd.lotus-notes' => ['nsf'],\n        'application/vnd.lotus-organizer' => ['org'],\n        'application/vnd.lotus-screencam' => ['scm'],\n        'application/vnd.lotus-wordpro' => ['lwp'],\n        'application/vnd.macports.portpkg' => ['portpkg'],\n        'application/vnd.mapbox-vector-tile' => ['mvt'],\n        'application/vnd.mcd' => ['mcd'],\n        'application/vnd.medcalcdata' => ['mc1'],\n        'application/vnd.mediastation.cdkey' => ['cdkey'],\n        'application/vnd.mfer' => ['mwf'],\n        'application/vnd.mfmp' => ['mfm'],\n        'application/vnd.micrografx.flo' => ['flo'],\n        'application/vnd.micrografx.igx' => ['igx'],\n        'application/vnd.mif' => ['mif'],\n        'application/vnd.mobius.daf' => ['daf'],\n        'application/vnd.mobius.dis' => ['dis'],\n        'application/vnd.mobius.mbk' => ['mbk'],\n        'application/vnd.mobius.mqy' => ['mqy'],\n        'application/vnd.mobius.msl' => ['msl'],\n        'application/vnd.mobius.plc' => ['plc'],\n        'application/vnd.mobius.txf' => ['txf'],\n        'application/vnd.mophun.application' => ['mpn'],\n        'application/vnd.mophun.certificate' => ['mpc'],\n        'application/vnd.mozilla.xul+xml' => ['xul'],\n        'application/vnd.ms-artgalry' => ['cil'],\n        'application/vnd.ms-cab-compressed' => ['cab'],\n        'application/vnd.ms-excel' => ['xls', 'xlm', 'xla', 'xlc', 'xlt', 'xlw'],\n        'application/vnd.ms-excel.addin.macroenabled.12' => ['xlam'],\n        'application/vnd.ms-excel.sheet.binary.macroenabled.12' => ['xlsb'],\n        'application/vnd.ms-excel.sheet.macroenabled.12' => ['xlsm'],\n        'application/vnd.ms-excel.template.macroenabled.12' => ['xltm'],\n        'application/vnd.ms-fontobject' => ['eot'],\n        'application/vnd.ms-htmlhelp' => ['chm'],\n        'application/vnd.ms-ims' => ['ims'],\n        'application/vnd.ms-lrm' => ['lrm'],\n        'application/vnd.ms-officetheme' => ['thmx'],\n        'application/vnd.ms-outlook' => ['msg'],\n        'application/vnd.ms-pki.seccat' => ['cat'],\n        'application/vnd.ms-pki.stl' => ['stl'],\n        'application/vnd.ms-powerpoint' => ['ppt', 'pps', 'pot', 'ppa'],\n        'application/vnd.ms-powerpoint.addin.macroenabled.12' => ['ppam'],\n        'application/vnd.ms-powerpoint.presentation.macroenabled.12' => ['pptm'],\n        'application/vnd.ms-powerpoint.slide.macroenabled.12' => ['sldm'],\n        'application/vnd.ms-powerpoint.slideshow.macroenabled.12' => ['ppsm'],\n        'application/vnd.ms-powerpoint.template.macroenabled.12' => ['potm'],\n        'application/vnd.ms-project' => ['mpp', 'mpt'],\n        'application/vnd.ms-word.document.macroenabled.12' => ['docm'],\n        'application/vnd.ms-word.template.macroenabled.12' => ['dotm'],\n        'application/vnd.ms-works' => ['wps', 'wks', 'wcm', 'wdb'],\n        'application/vnd.ms-wpl' => ['wpl'],\n        'application/vnd.ms-xpsdocument' => ['xps'],\n        'application/vnd.mseq' => ['mseq'],\n        'application/vnd.musician' => ['mus'],\n        'application/vnd.muvee.style' => ['msty'],\n        'application/vnd.mynfc' => ['taglet'],\n        'application/vnd.neurolanguage.nlu' => ['nlu'],\n        'application/vnd.nitf' => ['ntf', 'nitf'],\n        'application/vnd.noblenet-directory' => ['nnd'],\n        'application/vnd.noblenet-sealer' => ['nns'],\n        'application/vnd.noblenet-web' => ['nnw'],\n        'application/vnd.nokia.n-gage.ac+xml' => ['ac'],\n        'application/vnd.nokia.n-gage.data' => ['ngdat'],\n        'application/vnd.nokia.n-gage.symbian.install' => ['n-gage'],\n        'application/vnd.nokia.radio-preset' => ['rpst'],\n        'application/vnd.nokia.radio-presets' => ['rpss'],\n        'application/vnd.novadigm.edm' => ['edm'],\n        'application/vnd.novadigm.edx' => ['edx'],\n        'application/vnd.novadigm.ext' => ['ext'],\n        'application/vnd.oasis.opendocument.chart' => ['odc'],\n        'application/vnd.oasis.opendocument.chart-template' => ['otc'],\n        'application/vnd.oasis.opendocument.database' => ['odb'],\n        'application/vnd.oasis.opendocument.formula' => ['odf'],\n        'application/vnd.oasis.opendocument.formula-template' => ['odft'],\n        'application/vnd.oasis.opendocument.graphics' => ['odg'],\n        'application/vnd.oasis.opendocument.graphics-template' => ['otg'],\n        'application/vnd.oasis.opendocument.image' => ['odi'],\n        'application/vnd.oasis.opendocument.image-template' => ['oti'],\n        'application/vnd.oasis.opendocument.presentation' => ['odp'],\n        'application/vnd.oasis.opendocument.presentation-template' => ['otp'],\n        'application/vnd.oasis.opendocument.spreadsheet' => ['ods'],\n        'application/vnd.oasis.opendocument.spreadsheet-template' => ['ots'],\n        'application/vnd.oasis.opendocument.text' => ['odt'],\n        'application/vnd.oasis.opendocument.text-master' => ['odm'],\n        'application/vnd.oasis.opendocument.text-template' => ['ott'],\n        'application/vnd.oasis.opendocument.text-web' => ['oth'],\n        'application/vnd.olpc-sugar' => ['xo'],\n        'application/vnd.oma.dd2+xml' => ['dd2'],\n        'application/vnd.openblox.game+xml' => ['obgx'],\n        'application/vnd.openofficeorg.extension' => ['oxt'],\n        'application/vnd.openstreetmap.data+xml' => ['osm'],\n        'application/vnd.openxmlformats-officedocument.presentationml.presentation' => ['pptx'],\n        'application/vnd.openxmlformats-officedocument.presentationml.slide' => ['sldx'],\n        'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => ['ppsx'],\n        'application/vnd.openxmlformats-officedocument.presentationml.template' => ['potx'],\n        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => ['xlsx'],\n        'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => ['xltx'],\n        'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => ['docx'],\n        'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => ['dotx'],\n        'application/vnd.osgeo.mapguide.package' => ['mgp'],\n        'application/vnd.osgi.dp' => ['dp'],\n        'application/vnd.osgi.subsystem' => ['esa'],\n        'application/vnd.palm' => ['pdb', 'pqa', 'oprc'],\n        'application/vnd.pawaafile' => ['paw'],\n        'application/vnd.pg.format' => ['str'],\n        'application/vnd.pg.osasli' => ['ei6'],\n        'application/vnd.picsel' => ['efif'],\n        'application/vnd.pmi.widget' => ['wg'],\n        'application/vnd.pocketlearn' => ['plf'],\n        'application/vnd.powerbuilder6' => ['pbd'],\n        'application/vnd.previewsystems.box' => ['box'],\n        'application/vnd.proteus.magazine' => ['mgz'],\n        'application/vnd.publishare-delta-tree' => ['qps'],\n        'application/vnd.pvi.ptid1' => ['ptid'],\n        'application/vnd.pwg-xhtml-print+xml' => ['xhtm'],\n        'application/vnd.quark.quarkxpress' => ['qxd', 'qxt', 'qwd', 'qwt', 'qxl', 'qxb'],\n        'application/vnd.rar' => ['rar'],\n        'application/vnd.realvnc.bed' => ['bed'],\n        'application/vnd.recordare.musicxml' => ['mxl'],\n        'application/vnd.recordare.musicxml+xml' => ['musicxml'],\n        'application/vnd.rig.cryptonote' => ['cryptonote'],\n        'application/vnd.rim.cod' => ['cod'],\n        'application/vnd.rn-realmedia' => ['rm'],\n        'application/vnd.rn-realmedia-vbr' => ['rmvb'],\n        'application/vnd.route66.link66+xml' => ['link66'],\n        'application/vnd.sailingtracker.track' => ['st'],\n        'application/vnd.seemail' => ['see'],\n        'application/vnd.sema' => ['sema'],\n        'application/vnd.semd' => ['semd'],\n        'application/vnd.semf' => ['semf'],\n        'application/vnd.shana.informed.formdata' => ['ifm'],\n        'application/vnd.shana.informed.formtemplate' => ['itp'],\n        'application/vnd.shana.informed.interchange' => ['iif'],\n        'application/vnd.shana.informed.package' => ['ipk'],\n        'application/vnd.simtech-mindmapper' => ['twd', 'twds'],\n        'application/vnd.smaf' => ['mmf'],\n        'application/vnd.smart.teacher' => ['teacher'],\n        'application/vnd.software602.filler.form+xml' => ['fo'],\n        'application/vnd.solent.sdkm+xml' => ['sdkm', 'sdkd'],\n        'application/vnd.spotfire.dxp' => ['dxp'],\n        'application/vnd.spotfire.sfs' => ['sfs'],\n        'application/vnd.stardivision.calc' => ['sdc'],\n        'application/vnd.stardivision.draw' => ['sda'],\n        'application/vnd.stardivision.impress' => ['sdd'],\n        'application/vnd.stardivision.math' => ['smf'],\n        'application/vnd.stardivision.writer' => ['sdw', 'vor'],\n        'application/vnd.stardivision.writer-global' => ['sgl'],\n        'application/vnd.stepmania.package' => ['smzip'],\n        'application/vnd.stepmania.stepchart' => ['sm'],\n        'application/vnd.sun.wadl+xml' => ['wadl'],\n        'application/vnd.sun.xml.calc' => ['sxc'],\n        'application/vnd.sun.xml.calc.template' => ['stc'],\n        'application/vnd.sun.xml.draw' => ['sxd'],\n        'application/vnd.sun.xml.draw.template' => ['std'],\n        'application/vnd.sun.xml.impress' => ['sxi'],\n        'application/vnd.sun.xml.impress.template' => ['sti'],\n        'application/vnd.sun.xml.math' => ['sxm'],\n        'application/vnd.sun.xml.writer' => ['sxw'],\n        'application/vnd.sun.xml.writer.global' => ['sxg'],\n        'application/vnd.sun.xml.writer.template' => ['stw'],\n        'application/vnd.sus-calendar' => ['sus', 'susp'],\n        'application/vnd.svd' => ['svd'],\n        'application/vnd.symbian.install' => ['sis', 'sisx'],\n        'application/vnd.syncml+xml' => ['xsm'],\n        'application/vnd.syncml.dm+wbxml' => ['bdm'],\n        'application/vnd.syncml.dm+xml' => ['xdm'],\n        'application/vnd.syncml.dmddf+xml' => ['ddf'],\n        'application/vnd.tao.intent-module-archive' => ['tao'],\n        'application/vnd.tcpdump.pcap' => ['pcap', 'cap', 'dmp'],\n        'application/vnd.tmobile-livetv' => ['tmo'],\n        'application/vnd.trid.tpt' => ['tpt'],\n        'application/vnd.triscape.mxs' => ['mxs'],\n        'application/vnd.trueapp' => ['tra'],\n        'application/vnd.ufdl' => ['ufd', 'ufdl'],\n        'application/vnd.uiq.theme' => ['utz'],\n        'application/vnd.umajin' => ['umj'],\n        'application/vnd.unity' => ['unityweb'],\n        'application/vnd.uoml+xml' => ['uoml', 'uo'],\n        'application/vnd.vcx' => ['vcx'],\n        'application/vnd.visio' => ['vsd', 'vst', 'vss', 'vsw'],\n        'application/vnd.visionary' => ['vis'],\n        'application/vnd.vsf' => ['vsf'],\n        'application/vnd.wap.wbxml' => ['wbxml'],\n        'application/vnd.wap.wmlc' => ['wmlc'],\n        'application/vnd.wap.wmlscriptc' => ['wmlsc'],\n        'application/vnd.webturbo' => ['wtb'],\n        'application/vnd.wolfram.player' => ['nbp'],\n        'application/vnd.wordperfect' => ['wpd'],\n        'application/vnd.wqd' => ['wqd'],\n        'application/vnd.wt.stf' => ['stf'],\n        'application/vnd.xara' => ['xar'],\n        'application/vnd.xfdl' => ['xfdl'],\n        'application/vnd.yamaha.hv-dic' => ['hvd'],\n        'application/vnd.yamaha.hv-script' => ['hvs'],\n        'application/vnd.yamaha.hv-voice' => ['hvp'],\n        'application/vnd.yamaha.openscoreformat' => ['osf'],\n        'application/vnd.yamaha.openscoreformat.osfpvg+xml' => ['osfpvg'],\n        'application/vnd.yamaha.smaf-audio' => ['saf'],\n        'application/vnd.yamaha.smaf-phrase' => ['spf'],\n        'application/vnd.yellowriver-custom-menu' => ['cmp'],\n        'application/vnd.zul' => ['zir', 'zirz'],\n        'application/vnd.zzazz.deck+xml' => ['zaz'],\n        'application/voicexml+xml' => ['vxml'],\n        'application/wasm' => ['wasm'],\n        'application/watcherinfo+xml' => ['wif'],\n        'application/widget' => ['wgt'],\n        'application/winhlp' => ['hlp'],\n        'application/wsdl+xml' => ['wsdl'],\n        'application/wspolicy+xml' => ['wspolicy'],\n        'application/x-7z-compressed' => ['7z', '7zip'],\n        'application/x-abiword' => ['abw'],\n        'application/x-ace-compressed' => ['ace'],\n        'application/x-apple-diskimage' => ['dmg'],\n        'application/x-arj' => ['arj'],\n        'application/x-authorware-bin' => ['aab', 'x32', 'u32', 'vox'],\n        'application/x-authorware-map' => ['aam'],\n        'application/x-authorware-seg' => ['aas'],\n        'application/x-bcpio' => ['bcpio'],\n        'application/x-bdoc' => ['bdoc'],\n        'application/x-bittorrent' => ['torrent'],\n        'application/x-blorb' => ['blb', 'blorb'],\n        'application/x-bzip' => ['bz'],\n        'application/x-bzip2' => ['bz2', 'boz'],\n        'application/x-cbr' => ['cbr', 'cba', 'cbt', 'cbz', 'cb7'],\n        'application/x-cdlink' => ['vcd'],\n        'application/x-cfs-compressed' => ['cfs'],\n        'application/x-chat' => ['chat'],\n        'application/x-chess-pgn' => ['pgn'],\n        'application/x-chrome-extension' => ['crx'],\n        'application/x-cocoa' => ['cco'],\n        'application/x-conference' => ['nsc'],\n        'application/x-cpio' => ['cpio'],\n        'application/x-csh' => ['csh'],\n        'application/x-debian-package' => ['deb', 'udeb'],\n        'application/x-dgc-compressed' => ['dgc'],\n        'application/x-director' => ['dir', 'dcr', 'dxr', 'cst', 'cct', 'cxt', 'w3d', 'fgd', 'swa'],\n        'application/x-doom' => ['wad'],\n        'application/x-dtbncx+xml' => ['ncx'],\n        'application/x-dtbook+xml' => ['dtb'],\n        'application/x-dtbresource+xml' => ['res'],\n        'application/x-dvi' => ['dvi'],\n        'application/x-envoy' => ['evy'],\n        'application/x-eva' => ['eva'],\n        'application/x-font-bdf' => ['bdf'],\n        'application/x-font-ghostscript' => ['gsf'],\n        'application/x-font-linux-psf' => ['psf'],\n        'application/x-font-pcf' => ['pcf'],\n        'application/x-font-snf' => ['snf'],\n        'application/x-font-type1' => ['pfa', 'pfb', 'pfm', 'afm'],\n        'application/x-freearc' => ['arc'],\n        'application/x-futuresplash' => ['spl'],\n        'application/x-gca-compressed' => ['gca'],\n        'application/x-glulx' => ['ulx'],\n        'application/x-gnumeric' => ['gnumeric'],\n        'application/x-gramps-xml' => ['gramps'],\n        'application/x-gtar' => ['gtar'],\n        'application/x-hdf' => ['hdf'],\n        'application/x-httpd-php' => ['php', 'php4', 'php3', 'phtml'],\n        'application/x-install-instructions' => ['install'],\n        'application/x-iso9660-image' => ['iso'],\n        'application/x-iwork-keynote-sffkey' => ['key'],\n        'application/x-iwork-numbers-sffnumbers' => ['numbers'],\n        'application/x-iwork-pages-sffpages' => ['pages'],\n        'application/x-java-archive-diff' => ['jardiff'],\n        'application/x-java-jnlp-file' => ['jnlp'],\n        'application/x-keepass2' => ['kdbx'],\n        'application/x-latex' => ['latex'],\n        'application/x-lua-bytecode' => ['luac'],\n        'application/x-lzh-compressed' => ['lzh', 'lha'],\n        'application/x-makeself' => ['run'],\n        'application/x-mie' => ['mie'],\n        'application/x-mobipocket-ebook' => ['prc', 'mobi'],\n        'application/x-ms-application' => ['application'],\n        'application/x-ms-shortcut' => ['lnk'],\n        'application/x-ms-wmd' => ['wmd'],\n        'application/x-ms-wmz' => ['wmz'],\n        'application/x-ms-xbap' => ['xbap'],\n        'application/x-msaccess' => ['mdb'],\n        'application/x-msbinder' => ['obd'],\n        'application/x-mscardfile' => ['crd'],\n        'application/x-msclip' => ['clp'],\n        'application/x-msdos-program' => ['exe'],\n        'application/x-msdownload' => ['exe', 'dll', 'com', 'bat', 'msi'],\n        'application/x-msmediaview' => ['mvb', 'm13', 'm14'],\n        'application/x-msmetafile' => ['wmf', 'wmz', 'emf', 'emz'],\n        'application/x-msmoney' => ['mny'],\n        'application/x-mspublisher' => ['pub'],\n        'application/x-msschedule' => ['scd'],\n        'application/x-msterminal' => ['trm'],\n        'application/x-mswrite' => ['wri'],\n        'application/x-netcdf' => ['nc', 'cdf'],\n        'application/x-ns-proxy-autoconfig' => ['pac'],\n        'application/x-nzb' => ['nzb'],\n        'application/x-perl' => ['pl', 'pm'],\n        'application/x-pilot' => ['prc', 'pdb'],\n        'application/x-pkcs12' => ['p12', 'pfx'],\n        'application/x-pkcs7-certificates' => ['p7b', 'spc'],\n        'application/x-pkcs7-certreqresp' => ['p7r'],\n        'application/x-rar-compressed' => ['rar'],\n        'application/x-redhat-package-manager' => ['rpm'],\n        'application/x-research-info-systems' => ['ris'],\n        'application/x-sea' => ['sea'],\n        'application/x-sh' => ['sh'],\n        'application/x-shar' => ['shar'],\n        'application/x-shockwave-flash' => ['swf'],\n        'application/x-silverlight-app' => ['xap'],\n        'application/x-sql' => ['sql'],\n        'application/x-stuffit' => ['sit'],\n        'application/x-stuffitx' => ['sitx'],\n        'application/x-subrip' => ['srt'],\n        'application/x-sv4cpio' => ['sv4cpio'],\n        'application/x-sv4crc' => ['sv4crc'],\n        'application/x-t3vm-image' => ['t3'],\n        'application/x-tads' => ['gam'],\n        'application/x-tar' => ['tar', 'tgz'],\n        'application/x-tcl' => ['tcl', 'tk'],\n        'application/x-tex' => ['tex'],\n        'application/x-tex-tfm' => ['tfm'],\n        'application/x-texinfo' => ['texinfo', 'texi'],\n        'application/x-tgif' => ['obj'],\n        'application/x-ustar' => ['ustar'],\n        'application/x-virtualbox-hdd' => ['hdd'],\n        'application/x-virtualbox-ova' => ['ova'],\n        'application/x-virtualbox-ovf' => ['ovf'],\n        'application/x-virtualbox-vbox' => ['vbox'],\n        'application/x-virtualbox-vbox-extpack' => ['vbox-extpack'],\n        'application/x-virtualbox-vdi' => ['vdi'],\n        'application/x-virtualbox-vhd' => ['vhd'],\n        'application/x-virtualbox-vmdk' => ['vmdk'],\n        'application/x-wais-source' => ['src'],\n        'application/x-web-app-manifest+json' => ['webapp'],\n        'application/x-x509-ca-cert' => ['der', 'crt', 'pem'],\n        'application/x-xfig' => ['fig'],\n        'application/x-xliff+xml' => ['xlf'],\n        'application/x-xpinstall' => ['xpi'],\n        'application/x-xz' => ['xz'],\n        'application/x-zmachine' => ['z1', 'z2', 'z3', 'z4', 'z5', 'z6', 'z7', 'z8'],\n        'application/xaml+xml' => ['xaml'],\n        'application/xcap-att+xml' => ['xav'],\n        'application/xcap-caps+xml' => ['xca'],\n        'application/xcap-diff+xml' => ['xdf'],\n        'application/xcap-el+xml' => ['xel'],\n        'application/xcap-ns+xml' => ['xns'],\n        'application/xenc+xml' => ['xenc'],\n        'application/xfdf' => ['xfdf'],\n        'application/xhtml+xml' => ['xhtml', 'xht'],\n        'application/xliff+xml' => ['xlf'],\n        'application/xml' => ['xml', 'xsl', 'xsd', 'rng'],\n        'application/xml-dtd' => ['dtd'],\n        'application/xop+xml' => ['xop'],\n        'application/xproc+xml' => ['xpl'],\n        'application/xslt+xml' => ['xsl', 'xslt'],\n        'application/xspf+xml' => ['xspf'],\n        'application/xv+xml' => ['mxml', 'xhvml', 'xvml', 'xvm'],\n        'application/yang' => ['yang'],\n        'application/yin+xml' => ['yin'],\n        'application/zip' => ['zip'],\n        'audio/3gpp' => ['3gpp'],\n        'audio/aac' => ['adts', 'aac'],\n        'audio/adpcm' => ['adp'],\n        'audio/amr' => ['amr'],\n        'audio/basic' => ['au', 'snd'],\n        'audio/midi' => ['mid', 'midi', 'kar', 'rmi'],\n        'audio/mobile-xmf' => ['mxmf'],\n        'audio/mp3' => ['mp3'],\n        'audio/mp4' => ['m4a', 'mp4a'],\n        'audio/mpeg' => ['mpga', 'mp2', 'mp2a', 'mp3', 'm2a', 'm3a'],\n        'audio/ogg' => ['oga', 'ogg', 'spx', 'opus'],\n        'audio/s3m' => ['s3m'],\n        'audio/silk' => ['sil'],\n        'audio/vnd.dece.audio' => ['uva', 'uvva'],\n        'audio/vnd.digital-winds' => ['eol'],\n        'audio/vnd.dra' => ['dra'],\n        'audio/vnd.dts' => ['dts'],\n        'audio/vnd.dts.hd' => ['dtshd'],\n        'audio/vnd.lucent.voice' => ['lvp'],\n        'audio/vnd.ms-playready.media.pya' => ['pya'],\n        'audio/vnd.nuera.ecelp4800' => ['ecelp4800'],\n        'audio/vnd.nuera.ecelp7470' => ['ecelp7470'],\n        'audio/vnd.nuera.ecelp9600' => ['ecelp9600'],\n        'audio/vnd.rip' => ['rip'],\n        'audio/wav' => ['wav'],\n        'audio/wave' => ['wav'],\n        'audio/webm' => ['weba'],\n        'audio/x-aac' => ['aac'],\n        'audio/x-aiff' => ['aif', 'aiff', 'aifc'],\n        'audio/x-caf' => ['caf'],\n        'audio/x-flac' => ['flac'],\n        'audio/x-m4a' => ['m4a'],\n        'audio/x-matroska' => ['mka'],\n        'audio/x-mpegurl' => ['m3u'],\n        'audio/x-ms-wax' => ['wax'],\n        'audio/x-ms-wma' => ['wma'],\n        'audio/x-pn-realaudio' => ['ram', 'ra', 'rm'],\n        'audio/x-pn-realaudio-plugin' => ['rmp', 'rpm'],\n        'audio/x-realaudio' => ['ra'],\n        'audio/x-wav' => ['wav'],\n        'audio/xm' => ['xm'],\n        'chemical/x-cdx' => ['cdx'],\n        'chemical/x-cif' => ['cif'],\n        'chemical/x-cmdf' => ['cmdf'],\n        'chemical/x-cml' => ['cml'],\n        'chemical/x-csml' => ['csml'],\n        'chemical/x-xyz' => ['xyz'],\n        'font/collection' => ['ttc'],\n        'font/otf' => ['otf'],\n        'font/ttf' => ['ttf'],\n        'font/woff' => ['woff'],\n        'font/woff2' => ['woff2'],\n        'image/aces' => ['exr'],\n        'image/apng' => ['apng'],\n        'image/avci' => ['avci'],\n        'image/avcs' => ['avcs'],\n        'image/avif' => ['avif'],\n        'image/bmp' => ['bmp', 'dib'],\n        'image/cgm' => ['cgm'],\n        'image/dicom-rle' => ['drle'],\n        'image/dpx' => ['dpx'],\n        'image/emf' => ['emf'],\n        'image/fits' => ['fits'],\n        'image/g3fax' => ['g3'],\n        'image/gif' => ['gif'],\n        'image/heic' => ['heic'],\n        'image/heic-sequence' => ['heics'],\n        'image/heif' => ['heif'],\n        'image/heif-sequence' => ['heifs'],\n        'image/hej2k' => ['hej2'],\n        'image/hsj2' => ['hsj2'],\n        'image/ief' => ['ief'],\n        'image/jls' => ['jls'],\n        'image/jp2' => ['jp2', 'jpg2'],\n        'image/jpeg' => ['jpeg', 'jpg', 'jpe'],\n        'image/jph' => ['jph'],\n        'image/jphc' => ['jhc'],\n        'image/jpm' => ['jpm', 'jpgm'],\n        'image/jpx' => ['jpx', 'jpf'],\n        'image/jxr' => ['jxr'],\n        'image/jxra' => ['jxra'],\n        'image/jxrs' => ['jxrs'],\n        'image/jxs' => ['jxs'],\n        'image/jxsc' => ['jxsc'],\n        'image/jxsi' => ['jxsi'],\n        'image/jxss' => ['jxss'],\n        'image/ktx' => ['ktx'],\n        'image/ktx2' => ['ktx2'],\n        'image/png' => ['png'],\n        'image/prs.btif' => ['btif', 'btf'],\n        'image/prs.pti' => ['pti'],\n        'image/sgi' => ['sgi'],\n        'image/svg+xml' => ['svg', 'svgz'],\n        'image/t38' => ['t38'],\n        'image/tiff' => ['tif', 'tiff'],\n        'image/tiff-fx' => ['tfx'],\n        'image/vnd.adobe.photoshop' => ['psd'],\n        'image/vnd.airzip.accelerator.azv' => ['azv'],\n        'image/vnd.dece.graphic' => ['uvi', 'uvvi', 'uvg', 'uvvg'],\n        'image/vnd.djvu' => ['djvu', 'djv'],\n        'image/vnd.dvb.subtitle' => ['sub'],\n        'image/vnd.dwg' => ['dwg'],\n        'image/vnd.dxf' => ['dxf'],\n        'image/vnd.fastbidsheet' => ['fbs'],\n        'image/vnd.fpx' => ['fpx'],\n        'image/vnd.fst' => ['fst'],\n        'image/vnd.fujixerox.edmics-mmr' => ['mmr'],\n        'image/vnd.fujixerox.edmics-rlc' => ['rlc'],\n        'image/vnd.microsoft.icon' => ['ico'],\n        'image/vnd.ms-dds' => ['dds'],\n        'image/vnd.ms-modi' => ['mdi'],\n        'image/vnd.ms-photo' => ['wdp'],\n        'image/vnd.net-fpx' => ['npx'],\n        'image/vnd.pco.b16' => ['b16'],\n        'image/vnd.tencent.tap' => ['tap'],\n        'image/vnd.valve.source.texture' => ['vtf'],\n        'image/vnd.wap.wbmp' => ['wbmp'],\n        'image/vnd.xiff' => ['xif'],\n        'image/vnd.zbrush.pcx' => ['pcx'],\n        'image/webp' => ['webp'],\n        'image/wmf' => ['wmf'],\n        'image/x-3ds' => ['3ds'],\n        'image/x-cmu-raster' => ['ras'],\n        'image/x-cmx' => ['cmx'],\n        'image/x-freehand' => ['fh', 'fhc', 'fh4', 'fh5', 'fh7'],\n        'image/x-icon' => ['ico'],\n        'image/x-jng' => ['jng'],\n        'image/x-mrsid-image' => ['sid'],\n        'image/x-ms-bmp' => ['bmp'],\n        'image/x-pcx' => ['pcx'],\n        'image/x-pict' => ['pic', 'pct'],\n        'image/x-portable-anymap' => ['pnm'],\n        'image/x-portable-bitmap' => ['pbm'],\n        'image/x-portable-graymap' => ['pgm'],\n        'image/x-portable-pixmap' => ['ppm'],\n        'image/x-rgb' => ['rgb'],\n        'image/x-tga' => ['tga'],\n        'image/x-xbitmap' => ['xbm'],\n        'image/x-xpixmap' => ['xpm'],\n        'image/x-xwindowdump' => ['xwd'],\n        'message/disposition-notification' => ['disposition-notification'],\n        'message/global' => ['u8msg'],\n        'message/global-delivery-status' => ['u8dsn'],\n        'message/global-disposition-notification' => ['u8mdn'],\n        'message/global-headers' => ['u8hdr'],\n        'message/rfc822' => ['eml', 'mime'],\n        'message/vnd.wfa.wsc' => ['wsc'],\n        'model/3mf' => ['3mf'],\n        'model/gltf+json' => ['gltf'],\n        'model/gltf-binary' => ['glb'],\n        'model/iges' => ['igs', 'iges'],\n        'model/jt' => ['jt'],\n        'model/mesh' => ['msh', 'mesh', 'silo'],\n        'model/mtl' => ['mtl'],\n        'model/obj' => ['obj'],\n        'model/prc' => ['prc'],\n        'model/step+xml' => ['stpx'],\n        'model/step+zip' => ['stpz'],\n        'model/step-xml+zip' => ['stpxz'],\n        'model/stl' => ['stl'],\n        'model/u3d' => ['u3d'],\n        'model/vnd.cld' => ['cld'],\n        'model/vnd.collada+xml' => ['dae'],\n        'model/vnd.dwf' => ['dwf'],\n        'model/vnd.gdl' => ['gdl'],\n        'model/vnd.gtw' => ['gtw'],\n        'model/vnd.mts' => ['mts'],\n        'model/vnd.opengex' => ['ogex'],\n        'model/vnd.parasolid.transmit.binary' => ['x_b'],\n        'model/vnd.parasolid.transmit.text' => ['x_t'],\n        'model/vnd.pytha.pyox' => ['pyo', 'pyox'],\n        'model/vnd.sap.vds' => ['vds'],\n        'model/vnd.usda' => ['usda'],\n        'model/vnd.usdz+zip' => ['usdz'],\n        'model/vnd.valve.source.compiled-map' => ['bsp'],\n        'model/vnd.vtu' => ['vtu'],\n        'model/vrml' => ['wrl', 'vrml'],\n        'model/x3d+binary' => ['x3db', 'x3dbz'],\n        'model/x3d+fastinfoset' => ['x3db'],\n        'model/x3d+vrml' => ['x3dv', 'x3dvz'],\n        'model/x3d+xml' => ['x3d', 'x3dz'],\n        'model/x3d-vrml' => ['x3dv'],\n        'text/cache-manifest' => ['appcache', 'manifest'],\n        'text/calendar' => ['ics', 'ifb'],\n        'text/coffeescript' => ['coffee', 'litcoffee'],\n        'text/css' => ['css'],\n        'text/csv' => ['csv'],\n        'text/html' => ['html', 'htm', 'shtml'],\n        'text/jade' => ['jade'],\n        'text/javascript' => ['js', 'mjs'],\n        'text/jsx' => ['jsx'],\n        'text/less' => ['less'],\n        'text/markdown' => ['md', 'markdown'],\n        'text/mathml' => ['mml'],\n        'text/mdx' => ['mdx'],\n        'text/n3' => ['n3'],\n        'text/plain' => ['txt', 'text', 'conf', 'def', 'list', 'log', 'in', 'ini', 'm3u'],\n        'text/prs.lines.tag' => ['dsc'],\n        'text/richtext' => ['rtx'],\n        'text/rtf' => ['rtf'],\n        'text/sgml' => ['sgml', 'sgm'],\n        'text/shex' => ['shex'],\n        'text/slim' => ['slim', 'slm'],\n        'text/spdx' => ['spdx'],\n        'text/stylus' => ['stylus', 'styl'],\n        'text/tab-separated-values' => ['tsv'],\n        'text/troff' => ['t', 'tr', 'roff', 'man', 'me', 'ms'],\n        'text/turtle' => ['ttl'],\n        'text/uri-list' => ['uri', 'uris', 'urls'],\n        'text/vcard' => ['vcard'],\n        'text/vnd.curl' => ['curl'],\n        'text/vnd.curl.dcurl' => ['dcurl'],\n        'text/vnd.curl.mcurl' => ['mcurl'],\n        'text/vnd.curl.scurl' => ['scurl'],\n        'text/vnd.dvb.subtitle' => ['sub'],\n        'text/vnd.familysearch.gedcom' => ['ged'],\n        'text/vnd.fly' => ['fly'],\n        'text/vnd.fmi.flexstor' => ['flx'],\n        'text/vnd.graphviz' => ['gv'],\n        'text/vnd.in3d.3dml' => ['3dml'],\n        'text/vnd.in3d.spot' => ['spot'],\n        'text/vnd.sun.j2me.app-descriptor' => ['jad'],\n        'text/vnd.wap.wml' => ['wml'],\n        'text/vnd.wap.wmlscript' => ['wmls'],\n        'text/vtt' => ['vtt'],\n        'text/wgsl' => ['wgsl'],\n        'text/x-asm' => ['s', 'asm'],\n        'text/x-c' => ['c', 'cc', 'cxx', 'cpp', 'h', 'hh', 'dic'],\n        'text/x-component' => ['htc'],\n        'text/x-fortran' => ['f', 'for', 'f77', 'f90'],\n        'text/x-handlebars-template' => ['hbs'],\n        'text/x-java-source' => ['java'],\n        'text/x-lua' => ['lua'],\n        'text/x-markdown' => ['mkd'],\n        'text/x-nfo' => ['nfo'],\n        'text/x-opml' => ['opml'],\n        'text/x-org' => ['org'],\n        'text/x-pascal' => ['p', 'pas'],\n        'text/x-processing' => ['pde'],\n        'text/x-sass' => ['sass'],\n        'text/x-scss' => ['scss'],\n        'text/x-setext' => ['etx'],\n        'text/x-sfv' => ['sfv'],\n        'text/x-suse-ymp' => ['ymp'],\n        'text/x-uuencode' => ['uu'],\n        'text/x-vcalendar' => ['vcs'],\n        'text/x-vcard' => ['vcf'],\n        'text/xml' => ['xml'],\n        'text/yaml' => ['yaml', 'yml'],\n        'video/3gpp' => ['3gp', '3gpp'],\n        'video/3gpp2' => ['3g2'],\n        'video/h261' => ['h261'],\n        'video/h263' => ['h263'],\n        'video/h264' => ['h264'],\n        'video/iso.segment' => ['m4s'],\n        'video/jpeg' => ['jpgv'],\n        'video/jpm' => ['jpm', 'jpgm'],\n        'video/mj2' => ['mj2', 'mjp2'],\n        'video/mp2t' => ['ts'],\n        'video/mp4' => ['mp4', 'mp4v', 'mpg4', 'f4v'],\n        'video/mpeg' => ['mpeg', 'mpg', 'mpe', 'm1v', 'm2v'],\n        'video/ogg' => ['ogv'],\n        'video/quicktime' => ['qt', 'mov'],\n        'video/vnd.dece.hd' => ['uvh', 'uvvh'],\n        'video/vnd.dece.mobile' => ['uvm', 'uvvm'],\n        'video/vnd.dece.pd' => ['uvp', 'uvvp'],\n        'video/vnd.dece.sd' => ['uvs', 'uvvs'],\n        'video/vnd.dece.video' => ['uvv', 'uvvv'],\n        'video/vnd.dvb.file' => ['dvb'],\n        'video/vnd.fvt' => ['fvt'],\n        'video/vnd.mpegurl' => ['mxu', 'm4u'],\n        'video/vnd.ms-playready.media.pyv' => ['pyv'],\n        'video/vnd.uvvu.mp4' => ['uvu', 'uvvu'],\n        'video/vnd.vivo' => ['viv'],\n        'video/webm' => ['webm'],\n        'video/x-f4v' => ['f4v'],\n        'video/x-fli' => ['fli'],\n        'video/x-flv' => ['flv'],\n        'video/x-m4v' => ['m4v'],\n        'video/x-matroska' => ['mkv', 'mk3d', 'mks'],\n        'video/x-mng' => ['mng'],\n        'video/x-ms-asf' => ['asf', 'asx'],\n        'video/x-ms-vob' => ['vob'],\n        'video/x-ms-wm' => ['wm'],\n        'video/x-ms-wmv' => ['wmv'],\n        'video/x-ms-wmx' => ['wmx'],\n        'video/x-ms-wvx' => ['wvx'],\n        'video/x-msvideo' => ['avi'],\n        'video/x-sgi-movie' => ['movie'],\n        'video/x-smv' => ['smv'],\n        'x-conference/x-cooltalk' => ['ice'],\n        'application/x-photoshop' => ['psd'],\n        'application/smil' => ['smi', 'smil'],\n        'application/powerpoint' => ['ppt'],\n        'application/vnd.ms-powerpoint.addin.macroEnabled.12' => ['ppam'],\n        'application/vnd.ms-powerpoint.presentation.macroEnabled.12' => ['pptm', 'potm'],\n        'application/vnd.ms-powerpoint.slideshow.macroEnabled.12' => ['ppsm'],\n        'application/wbxml' => ['wbxml'],\n        'application/wmlc' => ['wmlc'],\n        'application/x-httpd-php-source' => ['phps'],\n        'application/x-compress' => ['z'],\n        'application/x-rar' => ['rar'],\n        'video/vnd.rn-realvideo' => ['rv'],\n        'application/vnd.ms-word.template.macroEnabled.12' => ['docm', 'dotm'],\n        'application/vnd.ms-excel.sheet.macroEnabled.12' => ['xlsm'],\n        'application/vnd.ms-excel.template.macroEnabled.12' => ['xltm'],\n        'application/vnd.ms-excel.addin.macroEnabled.12' => ['xlam'],\n        'application/vnd.ms-excel.sheet.binary.macroEnabled.12' => ['xlsb'],\n        'application/excel' => ['xl'],\n        'application/x-x509-user-cert' => ['pem'],\n        'application/x-pkcs10' => ['p10'],\n        'application/x-pkcs7-signature' => ['p7a'],\n        'application/pgp' => ['pgp'],\n        'application/gpg-keys' => ['gpg'],\n        'application/x-pkcs7' => ['rsa'],\n        'video/3gp' => ['3gp'],\n        'audio/acc' => ['aac'],\n        'application/vnd.mpegurl' => ['m4u'],\n        'application/videolan' => ['vlc'],\n        'audio/x-au' => ['au'],\n        'audio/ac3' => ['ac3'],\n        'text/x-scriptzsh' => ['zsh'],\n        'application/cdr' => ['cdr'],\n        'application/STEP' => ['step', 'stp'],\n        'application/x-ndjson' => ['ndjson'],\n        'application/braille' => ['brf'],\n    ];\n\n    public function lookupMimeType(string $extension): ?string\n    {\n        return self::MIME_TYPES_FOR_EXTENSIONS[$extension] ?? null;\n    }\n\n    public function lookupExtension(string $mimetype): ?string\n    {\n        return self::EXTENSIONS_FOR_MIME_TIMES[$mimetype][0] ?? null;\n    }\n\n    /**\n     * @return string[]\n     */\n    public function lookupAllExtensions(string $mimetype): array\n    {\n        return self::EXTENSIONS_FOR_MIME_TIMES[$mimetype] ?? [];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/mime-type-detection/src/MimeTypeDetector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace League\\MimeTypeDetection;\n\ninterface MimeTypeDetector\n{\n    /**\n     * @param string|resource $contents\n     */\n    public function detectMimeType(string $path, $contents): ?string;\n\n    public function detectMimeTypeFromBuffer(string $contents): ?string;\n\n    public function detectMimeTypeFromPath(string $path): ?string;\n\n    public function detectMimeTypeFromFile(string $path): ?string;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/league/mime-type-detection/src/OverridingExtensionToMimeTypeMap.php",
    "content": "<?php\n\nnamespace League\\MimeTypeDetection;\n\nclass OverridingExtensionToMimeTypeMap implements ExtensionToMimeTypeMap\n{\n    /**\n     * @var ExtensionToMimeTypeMap\n     */\n    private $innerMap;\n\n    /**\n     * @var string[]\n     */\n    private $overrides;\n\n    /**\n     * @param array<string, string>  $overrides\n     */\n    public function __construct(ExtensionToMimeTypeMap $innerMap, array $overrides)\n    {\n        $this->innerMap = $innerMap;\n        $this->overrides = $overrides;\n    }\n\n    public function lookupMimeType(string $extension): ?string\n    {\n        return $this->overrides[$extension] ?? $this->innerMap->lookupMimeType($extension);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/LICENSE",
    "content": "Copyright (c) 2012 Matthias Mullie\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/composer.json",
    "content": "{\n  \"name\": \"matthiasmullie/scrapbook\",\n  \"type\": \"library\",\n  \"description\": \"Scrapbook is a PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APCu, SQL and additional capabilities (e.g. transactions, stampede protection) built on top.\",\n  \"keywords\": [\n    \"cache\", \"caching\",\n    \"key\", \"value\", \"store\",\n    \"apc\",\n    \"memcached\",\n    \"redis\",\n    \"couchbase\",\n    \"sql\", \"mysql\", \"sqlite\", \"postgresql\",\n    \"filesystem\", \"flysystem\",\n    \"buffer\", \"buffered\",\n    \"transaction\", \"transactional\", \"commit\", \"rollback\",\n    \"stampede\", \"protection\", \"mitigation\",\n    \"psr-6\", \"psr-cache\",\n    \"psr-16\", \"psr-simple-cache\"\n  ],\n  \"homepage\": \"https://scrapbook.cash\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    {\n      \"name\": \"Matthias Mullie\",\n      \"homepage\": \"https://www.mullie.eu\",\n      \"email\": \"scrapbook@mullie.eu\",\n      \"role\": \"Developer\"\n    }\n  ],\n  \"require\": {\n    \"php\": \">=8.0.0\",\n    \"psr/cache\": \"^2.0||^3.0\",\n    \"psr/simple-cache\": \"^2.0||^3.0\"\n  },\n  \"require-dev\": {\n    \"ext-pcntl\": \"*\",\n    \"friendsofphp/php-cs-fixer\": \">=2.0\",\n    \"phpunit/phpunit\": \">=10.0\",\n    \"squizlabs/php_codesniffer\": \">=3.0\"\n  },\n  \"suggest\": {\n    \"ext-apcu\": \">=4.0.0\",\n    \"ext-couchbase\": \">=3.0.0\",\n    \"ext-memcached\": \">=2.0.0\",\n    \"ext-redis\": \">=2.2.0||0.0.0.0\",\n    \"ext-pdo\": \">=0.1.0\",\n    \"couchbase/couchbase\": \">=3.0\",\n    \"league/flysystem\": \">=1.0\"\n  },\n  \"provide\": {\n    \"psr/cache-implementation\": \"^1.0||^2.0||^3.0\",\n    \"psr/simple-cache-implementation\": \"^1.0||^2.0||^3.0\"\n  },\n  \"autoload\": {\n    \"psr-4\": {\n      \"MatthiasMullie\\\\Scrapbook\\\\\": \"src/\"\n    }\n  },\n  \"autoload-dev\": {\n    \"psr-4\": {\n      \"MatthiasMullie\\\\Scrapbook\\\\Tests\\\\\": \"tests/\"\n    }\n  }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/phpunit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" colors=\"true\" bootstrap=\"tests/bootstrap.php\" xsi:noNamespaceSchemaLocation=\"https://schema.phpunit.de/10.2/phpunit.xsd\">\n  <coverage>\n    <report>\n      <clover outputFile=\"build/coverage.clover\"/>\n    </report>\n  </coverage>\n  <testsuites>\n    <testsuite name=\"Apc\">\n      <directory suffix=\"Test.php\">tests/Adapters/Apc</directory>\n    </testsuite>\n    <testsuite name=\"Couchbase\">\n      <directory suffix=\"Test.php\">tests/Adapters/Couchbase</directory>\n    </testsuite>\n    <testsuite name=\"Flysystem\">\n      <directory suffix=\"Test.php\">tests/Adapters/Flysystem</directory>\n    </testsuite>\n    <testsuite name=\"Memcached\">\n      <directory suffix=\"Test.php\">tests/Adapters/Memcached</directory>\n    </testsuite>\n    <testsuite name=\"MemoryStore\">\n      <directory suffix=\"Test.php\">tests/Adapters/MemoryStore</directory>\n    </testsuite>\n    <testsuite name=\"MySQL\">\n      <directory suffix=\"Test.php\">tests/Adapters/MySQL</directory>\n    </testsuite>\n    <testsuite name=\"PostgreSQL\">\n      <directory suffix=\"Test.php\">tests/Adapters/PostgreSQL</directory>\n    </testsuite>\n    <testsuite name=\"Redis\">\n      <directory suffix=\"Test.php\">tests/Adapters/Redis</directory>\n    </testsuite>\n    <testsuite name=\"SQLite\">\n      <directory suffix=\"Test.php\">tests/Adapters/SQLite</directory>\n    </testsuite>\n  </testsuites>\n  <logging/>\n  <source>\n    <include>\n      <directory suffix=\".php\">src</directory>\n    </include>\n  </source>\n</phpunit>\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/ruleset.xml",
    "content": "<?xml version=\"1.0\"?>\n<ruleset>\n    <rule ref=\"PSR12\" />\n\n    <file>./src</file>\n    <file>./tests</file>\n\n    <arg name=\"extensions\" value=\"php\" />\n    <arg name=\"encoding\" value=\"UTF-8\" />\n</ruleset>\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Apc.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Apc as Collection;\nuse MatthiasMullie\\Scrapbook\\Exception\\Exception;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * APC adapter. Basically just a wrapper over apc_* functions, but in an\n * exchangeable (KeyValueStore) interface.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Apc implements KeyValueStore\n{\n    /**\n     * APC does this crazy thing of only deleting expired data on every new\n     * (page) request, not checking it when you actually retrieve the value\n     * (which you may just have set in the same request)\n     * Since it's totally possible to store values that expire in the same\n     * request, we'll keep track of those expiration times here & filter them\n     * out in case they did expire.\n     *\n     * @see http://stackoverflow.com/questions/11750223/apc-user-cache-entries-not-expiring\n     */\n    protected array $expires = [];\n\n    public function __construct()\n    {\n        if (!function_exists('apcu_fetch')) {\n            throw new Exception('ext-apcu is not installed.');\n        }\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        // check for values that were just stored in this request but have\n        // actually expired by now\n        if (isset($this->expires[$key]) && $this->expires[$key] < time()) {\n            return false;\n        }\n\n        $value = $this->fetch($key, $success);\n        if ($success === false) {\n            $token = null;\n\n            return false;\n        }\n\n        $token = serialize($value);\n\n        return $value;\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        $tokens = [];\n        if (empty($keys)) {\n            return [];\n        }\n\n        // check for values that were just stored in this request but have\n        // actually expired by now\n        foreach ($keys as $i => $key) {\n            if (isset($this->expires[$key]) && $this->expires[$key] < time()) {\n                unset($keys[$i]);\n            }\n        }\n\n        $values = $this->fetch($keys);\n        if ($values === false) {\n            return [];\n        }\n\n        foreach ($values as $key => $value) {\n            $tokens[$key] = serialize($value);\n        }\n\n        return $values;\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        $ttl = $this->ttl($expire);\n\n        // negative TTLs don't always seem to properly treat the key as deleted\n        if ($ttl < 0) {\n            $this->delete($key);\n\n            return true;\n        }\n\n        // lock required for CAS\n        if (!$this->lock($key)) {\n            return false;\n        }\n\n        $success = $this->store($key, $value, $ttl);\n        $this->expire($key, $ttl);\n        $this->unlock($key);\n\n        return $success;\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        if (empty($items)) {\n            return [];\n        }\n\n        $ttl = $this->ttl($expire);\n\n        // negative TTLs don't always seem to properly treat the key as deleted\n        if ($ttl < 0) {\n            $this->deleteMulti(array_keys($items));\n\n            return array_fill_keys(array_keys($items), true);\n        }\n\n        // attempt to get locks for all items\n        $locked = $this->lock(array_keys($items));\n        $locked = array_fill_keys($locked, null);\n        $failed = array_diff_key($items, $locked);\n        $items = array_intersect_key($items, $locked);\n\n        if ($items) {\n            // only write to those where lock was acquired\n            $this->store($items, null, $ttl);\n            $this->expire(array_keys($items), $ttl);\n            $this->unlock(array_keys($items));\n        }\n\n        $return = [];\n        foreach ($items as $key => $value) {\n            $return[$key] = !array_key_exists($key, $failed);\n        }\n\n        return $return;\n    }\n\n    public function delete(string $key): bool\n    {\n        // lock required for CAS\n        if (!$this->lock($key)) {\n            return false;\n        }\n\n        $success = apcu_delete($key);\n        unset($this->expires[$key]);\n        $this->unlock($key);\n\n        return $success;\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        if (empty($keys)) {\n            return [];\n        }\n\n        // attempt to get locks for all items\n        $locked = $this->lock($keys);\n        $failed = array_diff($keys, $locked);\n        $keys = array_intersect($keys, $locked);\n\n        // only delete those where lock was acquired\n        if ($keys) {\n            /**\n             * Contrary to the docs, apc_delete also accepts an array of\n             * multiple keys to be deleted. Docs for apcu_delete are ok in this\n             * regard.\n             * But both are flawed in terms of return value in this case: an\n             * array with failed keys is returned.\n             *\n             * @see http://php.net/manual/en/function.apc-delete.php\n             *\n             * @var string[] $result\n             */\n            $result = apcu_delete($keys);\n            $failed = array_merge($failed, $result);\n            $this->unlock($keys);\n        }\n\n        $return = [];\n        foreach ($keys as $key) {\n            $return[$key] = !in_array($key, $failed, true);\n            unset($this->expires[$key]);\n        }\n\n        return $return;\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        $ttl = $this->ttl($expire);\n\n        // negative TTLs don't always seem to properly treat the key as deleted\n        if ($ttl < 0) {\n            // don't add - it's expired already; just check if it already\n            // existed to return true/false as expected from add()\n            return $this->get($key) === false;\n        }\n\n        // lock required for CAS\n        if (!$this->lock($key)) {\n            return false;\n        }\n\n        $success = apcu_add($key, $value, $ttl);\n        $this->expire($key, $ttl);\n        $this->unlock($key);\n\n        return $success;\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        $ttl = $this->ttl($expire);\n\n        // APC doesn't support replace; I'll use get to check key existence,\n        // then safely replace with cas\n        $current = $this->get($key, $token);\n        if ($current === false) {\n            return false;\n        }\n\n        // negative TTLs don't always seem to properly treat the key as deleted\n        if ($ttl < 0) {\n            $this->delete($key);\n\n            return true;\n        }\n\n        // no need for locking - cas will do that\n        return $this->cas($token, $key, $value, $ttl);\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        $ttl = $this->ttl($expire);\n\n        // lock required because we can't perform an atomic CAS\n        if (!$this->lock($key)) {\n            return false;\n        }\n\n        // check for values that were just stored in this request but have\n        // actually expired by now\n        if (isset($this->expires[$key]) && $this->expires[$key] < time()) {\n            return false;\n        }\n\n        // get current value, to compare with token\n        $compare = $this->fetch($key);\n\n        if ($compare === false) {\n            $this->unlock($key);\n\n            return false;\n        }\n\n        if ($token !== serialize($compare)) {\n            $this->unlock($key);\n\n            return false;\n        }\n\n        // negative TTLs don't always seem to properly treat the key as deleted\n        if ($ttl < 0) {\n            apcu_delete($key);\n            unset($this->expires[$key]);\n            $this->unlock($key);\n\n            return true;\n        }\n\n        $success = $this->store($key, $value, $ttl);\n        $this->expire($key, $ttl);\n        $this->unlock($key);\n\n        return $success;\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        // not doing apc_inc because that one it doesn't let us set an initial\n        // value or TTL\n        return $this->doIncrement($key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        // not doing apc_dec because that one it doesn't let us set an initial\n        // value or TTL\n        return $this->doIncrement($key, -$offset, $initial, $expire);\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        $ttl = $this->ttl($expire);\n\n        // shortcut - expiring is similar to deleting, but the former has no\n        // 1-operation equivalent\n        if ($ttl < 0) {\n            return $this->delete($key);\n        }\n\n        // get existing TTL & quit early if it's that one already\n        $iterator = new \\APCUIterator('/^' . preg_quote($key, '/') . '$/', \\APC_ITER_VALUE | \\APC_ITER_TTL, 1, \\APC_LIST_ACTIVE);\n        if (!$iterator->valid()) {\n            return false;\n        }\n        $current = $iterator->current();\n        if (!$current) {\n            // doesn't exist\n            return false;\n        }\n        if ($current['ttl'] === $ttl) {\n            // that's the TTL already, no need to reset it\n            return true;\n        }\n\n        // generate CAS token to safely CAS existing value with new TTL\n        $value = $current['value'];\n        $token = serialize($value);\n\n        return $this->cas($token, $key, $value, $ttl);\n    }\n\n    public function flush(): bool\n    {\n        $this->expires = [];\n\n        return apcu_clear_cache();\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        return new Collection($this, $name);\n    }\n\n    /**\n     * Shared between increment/decrement: both have mostly the same logic\n     * (decrement just increments a negative value), but need their validation\n     * split up (increment won't accept negative values).\n     */\n    protected function doIncrement(string $key, int $offset, int $initial, int $expire): int|false\n    {\n        $ttl = $this->ttl($expire);\n\n        /*\n         * APC has apc_inc & apc_dec, which work great. However, they don't\n         * allow for a TTL to be set.\n         * I could use apc_inc & apc_dec & then do a touch, but touch also\n         * doesn't have an APC implementation & needs a get & cas. That would\n         * be 2 operations + CAS.\n         * Instead, I'll just do a get, implement the increase or decrease in\n         * PHP, then CAS the new value = 1 operation + CAS.\n         */\n        $value = $this->get($key, $token);\n        if ($value === false) {\n            // don't even set initial value, it's already expired...\n            if ($ttl < 0) {\n                return $initial;\n            }\n\n            // no need for locking - set will do that\n            $success = $this->add($key, $initial, $ttl);\n\n            return $success ? $initial : false;\n        }\n\n        if (!is_numeric($value) || $value < 0) {\n            return false;\n        }\n\n        $value += $offset;\n        // value can never be lower than 0\n        $value = max(0, $value);\n\n        // negative TTLs don't always seem to properly treat the key as deleted\n        if ($ttl < 0) {\n            $success = $this->delete($key);\n\n            return $success ? $value : false;\n        }\n\n        // no need for locking - cas will do that\n        $success = $this->cas($token, $key, $value, $ttl);\n\n        return $success ? $value : false;\n    }\n\n    /**\n     * APC expects true TTL, not expiration timestamp.\n     *\n     * @return int TTL in seconds\n     */\n    protected function ttl(int $expire): int\n    {\n        // relative time in seconds, <30 days\n        if ($expire < 30 * 24 * 60 * 60) {\n            $expire += time();\n        }\n\n        return $expire ? $expire - time() : 0;\n    }\n\n    /**\n     * Acquire a lock. If we failed to acquire a lock, it'll automatically try\n     * again in 1ms, for a maximum of 10 times.\n     *\n     * APC provides nothing that would allow us to do CAS. To \"emulate\" CAS,\n     * we'll work with locks: all cache writes also briefly create a lock\n     * cache entry (yup: #writes * 3, for lock & unlock - luckily, they're\n     * not over the network)\n     * Writes are disallows when a lock can't be obtained (= locked by\n     * another write), which makes it possible for us to first retrieve,\n     * compare & then set in a nob-atomic way.\n     * However, there's a possibility for interference with direct APC\n     * access touching the same keys - e.g. other scripts, not using this\n     * class. If CAS is of importance, make sure the only things touching\n     * APC on your server is using these classes!\n     *\n     * @param string|string[] $keys\n     *\n     * @return array Array of successfully locked keys\n     */\n    protected function lock(string|array $keys): array\n    {\n        // both string (single key) and array (multiple) are accepted\n        $keys = (array) $keys;\n\n        $locked = [];\n        for ($i = 0; $i < 10; ++$i) {\n            $locked += $this->acquire($keys);\n            $keys = array_diff($keys, $locked);\n\n            if (empty($keys)) {\n                break;\n            }\n\n            usleep(1);\n        }\n\n        return $locked;\n    }\n\n    /**\n     * Acquire a lock - required to provide CAS functionality.\n     *\n     * @param string|string[] $keys\n     *\n     * @return string[] Array of successfully locked keys\n     */\n    protected function acquire(string|array $keys): array\n    {\n        $keys = (array) $keys;\n\n        $values = [];\n        foreach ($keys as $key) {\n            $values[\"scrapbook.lock.$key\"] = null;\n        }\n\n        // there's no point in locking longer than max allowed execution time\n        // for this script\n        $ttl = (int) ini_get('max_execution_time');\n\n        // lock these keys, then compile a list of successfully locked keys\n        // (using the returned failure array)\n        $result = (array) apcu_add($values, null, $ttl);\n        $failed = [];\n        foreach ($result as $key => $err) {\n            $failed[] = substr($key, strlen('scrapbook.lock.'));\n        }\n\n        return array_diff($keys, $failed);\n    }\n\n    /**\n     * Release a lock.\n     *\n     * @param string|string[] $keys\n     */\n    protected function unlock(string|array $keys): bool\n    {\n        $keys = (array) $keys;\n        foreach ($keys as $i => $key) {\n            $keys[$i] = \"scrapbook.lock.$key\";\n        }\n\n        apcu_delete($keys);\n\n        return true;\n    }\n\n    /**\n     * Store the expiration time for items we're setting in this request, to\n     * work around APC's behavior of only clearing expires per page request.\n     *\n     * @see static::$expires\n     */\n    protected function expire(string|array $key = [], int $ttl = 0): void\n    {\n        if ($ttl === 0) {\n            // when storing indefinitely, there's no point in keeping it around,\n            // it won't just expire\n            return;\n        }\n\n        // $key can be both string (1 key) or array (multiple)\n        $keys = (array) $key;\n\n        $time = time() + $ttl;\n        foreach ($keys as $k) {\n            $this->expires[$k] = $time;\n        }\n    }\n\n    /**\n     * @param string|string[] $key\n     * @param bool            $success\n     *\n     * @return mixed|false\n     */\n    protected function fetch(string|array $key, bool &$success = null): mixed\n    {\n        /*\n         * $key can also be numeric, in which case APC is able to retrieve it,\n         * but will have an invalid $key in the results array, and trying to\n         * locate it by its $key in that array will fail with `undefined index`.\n         * I'll work around this by requesting those values 1 by 1.\n         */\n        if (is_array($key)) {\n            $nums = array_filter($key, 'is_numeric');\n            if ($nums) {\n                $values = [];\n                foreach ($nums as $k) {\n                    $values[$k] = $this->fetch((string) $k, $success);\n                }\n\n                $remaining = array_diff($key, $nums);\n                if ($remaining) {\n                    $values += $this->fetch($remaining, $success2);\n                    $success &= $success2;\n                }\n\n                return $values;\n            }\n        }\n\n        return apcu_fetch($key, $success);\n    }\n\n    /**\n     * @param string|string[] $key\n     *\n     * @return bool|bool[]\n     */\n    protected function store(string|array $key, mixed $var, int $ttl = 0): bool|array\n    {\n        /*\n         * $key can also be a [$key => $value] array, where key is numeric,\n         * but got cast to int by PHP. APC doesn't seem to store such numerical\n         * key, so we'll have to take care of those one by one.\n         */\n        if (is_array($key)) {\n            $nums = array_filter(array_keys($key), 'is_numeric');\n            if ($nums) {\n                $success = [];\n                $nums = array_intersect_key($key, array_fill_keys($nums, null));\n                foreach ($nums as $k => $v) {\n                    $success[$k] = $this->store((string) $k, $v, $ttl);\n                }\n\n                $remaining = array_diff_key($key, $nums);\n                if ($remaining) {\n                    $success += $this->store($remaining, $var, $ttl);\n                }\n\n                return $success;\n            }\n        }\n\n        return apcu_store($key, $var, $ttl);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Collections/Apc.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters\\Collections;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Apc as Adapter;\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Utils\\PrefixKeys;\n\n/**\n * APC adapter for a subset of data, accomplished by prefixing keys.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Apc extends PrefixKeys\n{\n    public function __construct(Adapter $cache, string $name)\n    {\n        parent::__construct($cache, 'collection:' . $name . ':');\n    }\n\n    public function flush(): bool\n    {\n        $iterator = new \\APCUIterator('/^' . preg_quote($this->prefix, '/') . '/', \\APC_ITER_KEY);\n        apcu_delete($iterator);\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Collections/Couchbase.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters\\Collections;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Utils\\PrefixReset;\nuse MatthiasMullie\\Scrapbook\\Adapters\\Couchbase as Adapter;\n\n/**\n * Couchbase adapter for a subset of data, accomplished by prefixing keys.\n *\n * Couchbase supports multiple buckets. However, there's no overarching \"server\"\n * that can flush all the buckets (apart from looping all of them)\n * It may also not be possible to get into another bucket: they may have\n * different credentials.\n * And it's less trivial to \"create\" a new bucket. It could be done (although\n * not from the `CouchbaseBucket` we have in the adapter), but needs config.\n *\n * I'll implement collections similar to how they've been implemented for\n * Memcached: prefix keys & a reference value that can be changed to \"flush\"\n * the cache. If people want multiple different buckets, they can easily create\n * multiple Couchbase adapter objects.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Couchbase extends PrefixReset\n{\n    public function __construct(Adapter $cache, string $name)\n    {\n        parent::__construct($cache, $name);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Collections/Flysystem.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters\\Collections;\n\nuse League\\Flysystem\\FileNotFoundException;\nuse League\\Flysystem\\Filesystem;\nuse League\\Flysystem\\UnableToDeleteFile;\nuse MatthiasMullie\\Scrapbook\\Adapters\\Flysystem as Adapter;\n\n/**\n * Flysystem adapter for a subset of data, in a subfolder.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Flysystem extends Adapter\n{\n    protected string $collection;\n\n    public function __construct(Filesystem $filesystem, string $collection)\n    {\n        parent::__construct($filesystem);\n        $this->collection = $collection;\n    }\n\n    public function flush(): bool\n    {\n        $files = $this->filesystem->listContents($this->collection);\n        foreach ($files as $file) {\n            try {\n                if ($file['type'] === 'dir') {\n                    if ($this->version === 1) {\n                        $this->filesystem->deleteDir($file['path']);\n                    } else {\n                        $this->filesystem->deleteDirectory($file['path']);\n                    }\n                } else {\n                    $this->filesystem->delete($file['path']);\n                }\n            } catch (FileNotFoundException $e) {\n                // v1.x\n                // don't care if we failed to unlink something, might have\n                // been deleted by another process in the meantime...\n            } catch (UnableToDeleteFile $e) {\n                // v2.x/3.x\n                // don't care if we failed to unlink something, might have\n                // been deleted by another process in the meantime...\n            }\n        }\n\n        return true;\n    }\n\n    protected function path(string $key): string\n    {\n        return $this->collection . '/' . parent::path($key);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Collections/Memcached.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters\\Collections;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Utils\\PrefixReset;\nuse MatthiasMullie\\Scrapbook\\Adapters\\Memcached as Adapter;\n\n/**\n * Memcached adapter for a subset of data, accomplished by prefixing keys.\n *\n * I would like to OPT_PREFIX_KEY on the client, but since $client is a\n * reference to the one in parent, that prefix would also be applied\n * there. Instead, I'll manually apply the prefix to all keys prior to\n * them going out to the server - this will have the exact same result!\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Memcached extends PrefixReset\n{\n    public function __construct(Adapter $cache, string $name)\n    {\n        parent::__construct($cache, $name);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Collections/MemoryStore.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters\\Collections;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Utils\\PrefixKeys;\nuse MatthiasMullie\\Scrapbook\\Adapters\\MemoryStore as Adapter;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * MemoryStore adapter for a subset of data.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass MemoryStore extends PrefixKeys\n{\n    /**\n     * @var Adapter\n     */\n    protected KeyValueStore $cache;\n\n    public function __construct(Adapter $cache, string $name)\n    {\n        parent::__construct($cache, $name . ':');\n    }\n\n    public function flush(): bool\n    {\n        foreach ($this->cache->items as $key => $value) {\n            if (str_starts_with($key, $this->prefix)) {\n                $this->cache->delete($key);\n            }\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Collections/Redis.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters\\Collections;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Redis as Adapter;\n\n/**\n * Redis adapter for a subset of data, in a different database.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Redis extends Adapter\n{\n    public function __construct(\\Redis $client, int $database)\n    {\n        parent::__construct($client);\n        $this->client->select($database);\n    }\n\n    public function flush(): bool\n    {\n        return $this->client->flushDB();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Collections/SQL.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters\\Collections;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Utils\\PrefixKeys;\nuse MatthiasMullie\\Scrapbook\\Adapters\\SQL as Adapter;\n\n/**\n * SQL adapter for a subset of data, accomplished by prefixing keys.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass SQL extends PrefixKeys\n{\n    protected \\PDO $client;\n\n    protected string $table;\n\n    public function __construct(Adapter $cache, \\PDO $client, string $table, string $name)\n    {\n        parent::__construct($cache, 'collection:' . $name . ':');\n        $this->client = $client;\n        $this->table = $table;\n    }\n\n    public function flush(): bool\n    {\n        // deleting key with a prefixed LIKE should be fast, they're indexed\n        $statement = $this->client->prepare(\n            \"DELETE FROM $this->table\n            WHERE k LIKE :key\"\n        );\n\n        return $statement->execute([\n            ':key' => $this->prefix . '%',\n        ]);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Collections/Utils/PrefixKeys.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Utils;\n\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass PrefixKeys implements KeyValueStore\n{\n    protected KeyValueStore $cache;\n\n    protected string $prefix;\n\n    public function __construct(KeyValueStore $cache, string $prefix)\n    {\n        $this->cache = $cache;\n        $this->setPrefix($prefix);\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        $key = $this->prefix($key);\n\n        return $this->cache->get($key, $token);\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        $keys = array_map([$this, 'prefix'], $keys);\n        $results = $this->cache->getMulti($keys, $tokens);\n        $keys = array_map([$this, 'unfix'], array_keys($results));\n        $tokens = array_combine($keys, $tokens);\n\n        return array_combine($keys, $results);\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        $key = $this->prefix($key);\n\n        return $this->cache->set($key, $value, $expire);\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        $keys = array_map([$this, 'prefix'], array_keys($items));\n        $items = array_combine($keys, $items);\n        $results = $this->cache->setMulti($items, $expire);\n        $keys = array_map([$this, 'unfix'], array_keys($results));\n\n        return array_combine($keys, $results);\n    }\n\n    public function delete(string $key): bool\n    {\n        $key = $this->prefix($key);\n\n        return $this->cache->delete($key);\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        $keys = array_map([$this, 'prefix'], $keys);\n        $results = $this->cache->deleteMulti($keys);\n        $keys = array_map([$this, 'unfix'], array_keys($results));\n\n        return array_combine($keys, $results);\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        $key = $this->prefix($key);\n\n        return $this->cache->add($key, $value, $expire);\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        $key = $this->prefix($key);\n\n        return $this->cache->replace($key, $value, $expire);\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        $key = $this->prefix($key);\n\n        return $this->cache->cas($token, $key, $value, $expire);\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        $key = $this->prefix($key);\n\n        return $this->cache->increment($key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        $key = $this->prefix($key);\n\n        return $this->cache->decrement($key, $offset, $initial, $expire);\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        $key = $this->prefix($key);\n\n        return $this->cache->touch($key, $expire);\n    }\n\n    public function flush(): bool\n    {\n        return $this->cache->flush();\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        return $this->cache->getCollection($name);\n    }\n\n    protected function setPrefix(string $prefix): void\n    {\n        $this->prefix = $prefix;\n    }\n\n    protected function prefix(string $key): string\n    {\n        return $this->prefix . $key;\n    }\n\n    protected function unfix(string $key): string\n    {\n        return preg_replace('/^' . preg_quote($this->prefix, '/') . '/', '', $key);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Collections/Utils/PrefixReset.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Utils;\n\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass PrefixReset extends PrefixKeys\n{\n    protected string $collection;\n\n    public function __construct(KeyValueStore $cache, string $name)\n    {\n        $this->cache = $cache;\n        $this->collection = $name;\n        parent::__construct($cache, $this->getPrefix());\n    }\n\n    public function flush(): bool\n    {\n        $index = $this->cache->increment($this->collection);\n        $this->setPrefix($this->collection . ':' . $index . ':');\n\n        return $index !== false;\n    }\n\n    protected function getPrefix(): string\n    {\n        /*\n         * It's easy enough to just set a prefix to be used, but we can not\n         * flush only a prefix!\n         * Instead, we'll generate a unique prefix key, based on some name.\n         * If we want to flush, we just create a new prefix and use that one.\n         */\n        $index = $this->cache->get($this->collection);\n\n        if ($index === false) {\n            $index = $this->cache->set($this->collection, 1);\n        }\n\n        return $this->collection . ':' . $index . ':';\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Couchbase.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters;\n\nuse DateTime;\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Couchbase as Collection;\nuse MatthiasMullie\\Scrapbook\\Exception\\InvalidKey;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * Couchbase adapter. Basically just a wrapper over \\CouchbaseBucket, but in an\n * exchangeable (KeyValueStore) interface.\n *\n * @see https://docs.couchbase.com/sdk-api/couchbase-php-client/namespaces/couchbase.html\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Couchbase implements KeyValueStore\n{\n    protected \\Couchbase\\Collection $collection;\n\n    protected \\Couchbase\\BucketManager|\\Couchbase\\Management\\BucketManager $bucketManager;\n\n    protected \\Couchbase\\Bucket $bucket;\n\n    /**\n     * @var int|null Timeout in ms\n     */\n    protected int|null $timeout;\n\n    /**\n     * @param int|null $timeout K/V timeout in ms\n     */\n    public function __construct(\n        \\Couchbase\\Collection $client,\n        \\Couchbase\\BucketManager|\\Couchbase\\Management\\BucketManager $bucketManager,\n        \\Couchbase\\Bucket $bucket,\n        int $timeout = null\n    ) {\n        $this->collection = $client;\n        $this->bucketManager = $bucketManager;\n        $this->bucket = $bucket;\n        $this->timeout = $timeout;\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        $this->assertValidKey($key);\n\n        try {\n            $options = new \\Couchbase\\GetOptions();\n            $options = $this->timeout === null ? $options : $options->timeout($this->timeout);\n            $result = $this->collection->get($key, $options);\n            $token = $result->cas();\n\n            return $this->unserialize($result->content());\n        } catch (\\Couchbase\\Exception\\CouchbaseException $e) {\n            // SDK >=4.0\n            $token = null;\n\n            return false;\n        } catch (\\Couchbase\\BaseException $e) {\n            // SDK >=3.0 & <4.0\n            $token = null;\n\n            return false;\n        }\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        // SDK >=3.0 no longer provides *multi operations\n        $results = [];\n        $tokens = [];\n        foreach ($keys as $key) {\n            $token = null;\n            $value = $this->get($key, $token);\n\n            if ($token !== null) {\n                $results[$key] = $value;\n                $tokens[$key] = $token;\n            }\n        }\n\n        return $results;\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        $this->assertValidKey($key);\n\n        if ($this->deleteIfExpired($key, $expire)) {\n            return true;\n        }\n\n        $value = $this->serialize($value);\n\n        try {\n            $options = new \\Couchbase\\UpsertOptions();\n            $options = $this->timeout === null ? $options : $options->timeout($this->timeout);\n            $options = $options->expiry($this->expire($expire));\n            $this->collection->upsert($key, $value, $options);\n\n            return true;\n        } catch (\\Couchbase\\Exception\\CouchbaseException $e) {\n            // SDK >=4.0\n            return false;\n        } catch (\\Couchbase\\BaseException $e) {\n            // SDK >=3.0 & <4.0\n            return false;\n        }\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        // SDK >=3.0 no longer provides *multi operations\n        $success = [];\n        foreach ($items as $key => $value) {\n            // PHP treats numeric keys as integers, but they're allowed\n            $key = (string) $key;\n            $success[$key] = $this->set($key, $value, $expire);\n        }\n\n        return $success;\n    }\n\n    public function delete(string $key): bool\n    {\n        $this->assertValidKey($key);\n\n        try {\n            $options = new \\Couchbase\\RemoveOptions();\n            $options = $this->timeout === null ? $options : $options->timeout($this->timeout);\n            $this->collection->remove($key, $options);\n\n            return true;\n        } catch (\\Couchbase\\Exception\\CouchbaseException $e) {\n            // SDK >=4.0\n            return false;\n        } catch (\\Couchbase\\BaseException $e) {\n            // SDK >=3.0 & <4.0\n            return false;\n        }\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        // SDK >=3.0 no longer provides *multi operations\n        $success = [];\n        foreach ($keys as $key) {\n            $success[$key] = $this->delete($key);\n        }\n\n        return $success;\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        $this->assertValidKey($key);\n\n        $value = $this->serialize($value);\n\n        try {\n            $options = new \\Couchbase\\InsertOptions();\n            $options = $this->timeout === null ? $options : $options->timeout($this->timeout);\n            $options = $options->expiry($this->expire($expire));\n            $this->collection->insert($key, $value, $options);\n\n            $this->deleteIfExpired($key, $expire);\n\n            return true;\n        } catch (\\Couchbase\\Exception\\CouchbaseException $e) {\n            // SDK >=4.0\n            return false;\n        } catch (\\Couchbase\\BaseException $e) {\n            // SDK >=3.0 & <4.0\n            return false;\n        }\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        $this->assertValidKey($key);\n\n        $value = $this->serialize($value);\n\n        try {\n            $options = new \\Couchbase\\ReplaceOptions();\n            $options = $this->timeout === null ? $options : $options->timeout($this->timeout);\n            $options = $options->expiry($this->expire($expire));\n            $this->collection->replace($key, $value, $options);\n\n            $this->deleteIfExpired($key, $expire);\n\n            return true;\n        } catch (\\Couchbase\\Exception\\CouchbaseException $e) {\n            // SDK >=4.0\n            return false;\n        } catch (\\Couchbase\\BaseException $e) {\n            // SDK >=3.0 & <4.0\n            return false;\n        }\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        $this->assertValidKey($key);\n\n        $value = $this->serialize($value);\n\n        if ($token === null) {\n            return false;\n        }\n        try {\n            $options = new \\Couchbase\\ReplaceOptions();\n            $options = $this->timeout === null ? $options : $options->timeout($this->timeout);\n            $options = $options->expiry($this->expire($expire));\n            $options = $options->cas($token);\n            $this->collection->replace($key, $value, $options);\n\n            $this->deleteIfExpired($key, $expire);\n\n            return true;\n        } catch (\\Couchbase\\Exception\\CouchbaseException $e) {\n            // SDK >=4.0\n            return false;\n        } catch (\\Couchbase\\BaseException $e) {\n            // SDK >=3.0 & <4.0\n            return false;\n        }\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        $this->assertValidKey($key);\n\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        return $this->doIncrement($key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        $this->assertValidKey($key);\n\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        return $this->doIncrement($key, -$offset, $initial, $expire);\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        $this->assertValidKey($key);\n\n        if ($this->deleteIfExpired($key, $expire)) {\n            return true;\n        }\n\n        try {\n            $options = new \\Couchbase\\GetAndTouchOptions();\n            $options = $this->timeout === null ? $options : $options->timeout($this->timeout);\n            $this->collection->getAndTouch($key, $this->expire($expire), $options);\n\n            return true;\n        } catch (\\Couchbase\\Exception\\CouchbaseException $e) {\n            // SDK >=4.0\n            return false;\n        } catch (\\Couchbase\\BaseException $e) {\n            // SDK >=3.0 & <4.0\n            return false;\n        }\n    }\n\n    public function flush(): bool\n    {\n        $bucketSettings = $this->bucketManager->getBucket($this->bucket->name());\n        if (!$bucketSettings->flushEnabled()) {\n            // `enableFlush` exists, but whether or not it is enabled is config\n            // that doesn't belong here; Scrapbook shouldn't alter that\n            return false;\n        }\n\n        $this->bucketManager->flush($this->bucket->name());\n\n        return true;\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        return new Collection($this, $name);\n    }\n\n    /**\n     * We could use `$this->collection->counter()`, but it doesn't seem to respect\n     * data types and stores the values as strings instead of integers.\n     *\n     * Shared between increment/decrement: both have mostly the same logic\n     * (decrement just increments a negative value), but need their validation\n     * split up (increment won't accept negative values).\n     */\n    protected function doIncrement(string $key, int $offset, int $initial, int $expire): int|false\n    {\n        $this->assertValidKey($key);\n\n        $value = $this->get($key, $token);\n        if ($value === false) {\n            $success = $this->add($key, $initial, $expire);\n\n            return $success ? $initial : false;\n        }\n\n        if (!is_numeric($value) || $value < 0) {\n            return false;\n        }\n\n        $value += $offset;\n        // value can never be lower than 0\n        $value = max(0, $value);\n        $success = $this->cas($token, $key, $value, $expire);\n\n        return $success ? $value : false;\n    }\n\n    /**\n     * Couchbase doesn't properly remember the data type being stored:\n     * arrays and objects are turned into stdClass instances, or the\n     * other way around.\n     */\n    protected function serialize(mixed $value): mixed\n    {\n        // binary data doesn't roundtrip well\n        if (is_string($value) && !preg_match('//u', $value)) {\n            return serialize(base64_encode($value));\n        }\n\n        // and neither do arrays/objects\n        if (is_array($value) || is_object($value)) {\n            return serialize($value);\n        }\n\n        return $value;\n    }\n\n    /**\n     * Restore serialized data.\n     */\n    protected function unserialize(mixed $value): mixed\n    {\n        // more efficient quick check whether value is unserializable\n        if (!is_string($value) || !preg_match('/^[saOC]:[0-9]+:/', $value)) {\n            return $value;\n        }\n\n        $unserialized = @unserialize($value, ['allowed_classes' => true]);\n        if ($unserialized === false) {\n            return $value;\n        }\n\n        if (is_string($unserialized)) {\n            return base64_decode($unserialized);\n        }\n\n        return $unserialized;\n    }\n\n    /**\n     * Couchbase seems to not timely purge items the way it should when\n     * storing it with an expired timestamp, so we'll detect that and\n     * delete it (instead of performing the already expired operation).\n     *\n     * @param string|string[] $key\n     *\n     * @return bool True if expired\n     */\n    protected function deleteIfExpired(string|array $key, int $expire): bool\n    {\n        if ($expire < 0 || ($expire > 2592000 && $expire < time())) {\n            $this->deleteMulti((array) $key);\n\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Couchbase expects an integer TTL (under 1576800000) for relative\n     * times, or a \\DateTimeInterface for absolute times.\n     *\n     * @return int|\\DateTime expiration in seconds or \\DateTimeInterface\n     */\n    protected function expire(int $expire): int|\\DateTime\n    {\n        // relative time in seconds, <30 days\n        if ($expire < 30 * 24 * 60 * 60) {\n            flush();\n\n            return $expire;\n        }\n\n        if ($expire < time()) {\n            // a timestamp (whether int or DateTimeInterface) larger than\n            // 1576800000 is not accepted; let's just go with -1, result\n            // is the same: it's expired & should be evicted\n            return -1; // @todo this if statement should be useless; this case should be fine as DateTime\n        }\n\n        return (new \\DateTime())->setTimestamp($expire);\n    }\n\n    /**\n     * @throws InvalidKey\n     */\n    protected function assertValidKey(string $key): void\n    {\n        if (strlen($key) > 255) {\n            throw new InvalidKey(\"Invalid key: $key. Couchbase keys can not exceed 255 chars.\");\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Flysystem.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters;\n\nuse League\\Flysystem\\FileExistsException;\nuse League\\Flysystem\\FileNotFoundException;\nuse League\\Flysystem\\Filesystem;\nuse League\\Flysystem\\Local\\LocalFilesystemAdapter;\nuse League\\Flysystem\\UnableToDeleteFile;\nuse League\\Flysystem\\UnableToReadFile;\nuse League\\Flysystem\\UnableToWriteFile;\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Flysystem as Collection;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * Flysystem adapter. Data will be written to League\\Flysystem\\Filesystem.\n *\n * Flysystem doesn't allow locking files, though. To guarantee interference from\n * other processes, we'll create separate lock-files to flag a cache key in use.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Flysystem implements KeyValueStore\n{\n    protected Filesystem $filesystem;\n\n    protected int $version;\n\n    public function __construct(Filesystem $filesystem)\n    {\n        $this->filesystem = $filesystem;\n\n        if (!class_exists(LocalFilesystemAdapter::class)) {\n            $this->version = 1;\n        } elseif (!method_exists($filesystem, 'has')) {\n            $this->version = 2;\n        } else {\n            $this->version = 3;\n        }\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        $token = null;\n\n        // let expired-but-not-yet-deleted files be deleted first\n        if (!$this->exists($key)) {\n            return false;\n        }\n\n        $data = $this->read($key);\n        if ($data === false) {\n            return false;\n        }\n\n        $value = unserialize($data[1], ['allowed_classes' => true]);\n        $token = $data[1];\n\n        return $value;\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        $results = [];\n        $tokens = [];\n        foreach ($keys as $key) {\n            $token = null;\n            $value = $this->get($key, $token);\n\n            if ($token !== null) {\n                $results[$key] = $value;\n                $tokens[$key] = $token;\n            }\n        }\n\n        return $results;\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        // we don't really need a lock for this operation, but we need to make\n        // sure it's not locked by another operation, which we could overwrite\n        if (!$this->lock($key)) {\n            return false;\n        }\n\n        $expire = $this->normalizeTime($expire);\n        if ($expire !== 0 && $expire < time()) {\n            $this->unlock($key);\n\n            // don't waste time storing (and later comparing expiration\n            // timestamp) data that is already expired; just delete it already\n            return !$this->exists($key) || $this->delete($key);\n        }\n\n        $path = $this->path($key);\n        $data = $this->wrap($value, $expire);\n        try {\n            if ($this->version === 1) {\n                $this->filesystem->put($path, $data);\n            } else {\n                $this->filesystem->write($path, $data);\n            }\n        } catch (FileExistsException $e) {\n            // v1.x\n            $this->unlock($key);\n\n            return false;\n        } catch (UnableToWriteFile $e) {\n            // v2.x/3.x\n            $this->unlock($key);\n\n            return false;\n        }\n\n        return $this->unlock($key);\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        $success = [];\n        foreach ($items as $key => $value) {\n            // PHP treats numeric keys as integers, but they're allowed\n            $key = (string) $key;\n            $success[$key] = $this->set($key, $value, $expire);\n        }\n\n        return $success;\n    }\n\n    public function delete(string $key): bool\n    {\n        if (!$this->exists($key)) {\n            return false;\n        }\n\n        if (!$this->lock($key)) {\n            return false;\n        }\n\n        $path = $this->path($key);\n\n        try {\n            $this->filesystem->delete($path);\n\n            return $this->unlock($key);\n        } catch (FileNotFoundException $e) {\n            // v1.x\n            $this->unlock($key);\n\n            return false;\n        } catch (UnableToDeleteFile $e) {\n            // v2.x/3.x\n            $this->unlock($key);\n\n            return false;\n        }\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        $success = [];\n        foreach ($keys as $key) {\n            $success[$key] = $this->delete($key);\n        }\n\n        return $success;\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        if (!$this->lock($key)) {\n            return false;\n        }\n\n        if ($this->exists($key)) {\n            $this->unlock($key);\n\n            return false;\n        }\n\n        $path = $this->path($key);\n        $data = $this->wrap($value, $expire);\n\n        try {\n            $this->filesystem->write($path, $data);\n\n            return $this->unlock($key);\n        } catch (FileExistsException $e) {\n            // v1.x\n            $this->unlock($key);\n\n            return false;\n        } catch (UnableToWriteFile $e) {\n            // v2.x/3.x\n            $this->unlock($key);\n\n            return false;\n        }\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        if (!$this->lock($key)) {\n            return false;\n        }\n\n        if (!$this->exists($key)) {\n            $this->unlock($key);\n\n            return false;\n        }\n\n        $path = $this->path($key);\n        $data = $this->wrap($value, $expire);\n\n        try {\n            if ($this->version === 1) {\n                $this->filesystem->update($path, $data);\n            } else {\n                $this->filesystem->write($path, $data);\n            }\n\n            return $this->unlock($key);\n        } catch (FileNotFoundException $e) {\n            // v1.x\n            $this->unlock($key);\n\n            return false;\n        } catch (UnableToWriteFile $e) {\n            // v2.x/3.x\n            $this->unlock($key);\n\n            return false;\n        }\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        if (!$this->lock($key)) {\n            return false;\n        }\n\n        $current = $this->get($key);\n        if ($token !== serialize($current)) {\n            $this->unlock($key);\n\n            return false;\n        }\n\n        $path = $this->path($key);\n        $data = $this->wrap($value, $expire);\n\n        try {\n            if ($this->version === 1) {\n                $this->filesystem->update($path, $data);\n            } else {\n                $this->filesystem->write($path, $data);\n            }\n\n            return $this->unlock($key);\n        } catch (FileNotFoundException $e) {\n            // v1.x\n            $this->unlock($key);\n\n            return false;\n        } catch (UnableToWriteFile $e) {\n            // v2.x/3.x\n            $this->unlock($key);\n\n            return false;\n        }\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        return $this->doIncrement($key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        return $this->doIncrement($key, -$offset, $initial, $expire);\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        if (!$this->lock($key)) {\n            return false;\n        }\n\n        $value = $this->get($key);\n        if ($value === false) {\n            $this->unlock($key);\n\n            return false;\n        }\n\n        $path = $this->path($key);\n        $data = $this->wrap($value, $expire);\n\n        try {\n            if ($this->version === 1) {\n                $this->filesystem->update($path, $data);\n            } else {\n                $this->filesystem->write($path, $data);\n            }\n\n            return $this->unlock($key);\n        } catch (FileNotFoundException $e) {\n            // v1.x\n            $this->unlock($key);\n\n            return false;\n        } catch (UnableToWriteFile $e) {\n            // v2.x/3.x\n            $this->unlock($key);\n\n            return false;\n        }\n    }\n\n    public function flush(): bool\n    {\n        $files = $this->filesystem->listContents('.');\n        foreach ($files as $file) {\n            try {\n                if ($file['type'] === 'dir') {\n                    if ($this->version === 1) {\n                        $this->filesystem->deleteDir($file['path']);\n                    } else {\n                        $this->filesystem->deleteDirectory($file['path']);\n                    }\n                } else {\n                    $this->filesystem->delete($file['path']);\n                }\n            } catch (FileNotFoundException $e) {\n                // v1.x\n                // don't care if we failed to unlink something, might have\n                // been deleted by another process in the meantime...\n            } catch (UnableToDeleteFile $e) {\n                // v2.x/3.x\n                // don't care if we failed to unlink something, might have\n                // been deleted by another process in the meantime...\n            }\n        }\n\n        return true;\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        /*\n         * A better solution could be to simply construct a new object for a\n         * subfolder, but we can't reliably create a new\n         * `League\\Flysystem\\Filesystem` object for a subfolder from the\n         * `$this->filesystem` object we have. I could `->getAdapter` and fetch\n         * the path from there, but only if we can assume that the adapter is\n         * `League\\Flysystem\\Adapter\\Local` (1.x) or\n         * `League\\Flysystem\\Local\\LocalFilesystemAdapter` (2.x), which it may not be.\n         * But I can just create a new object that changes the path to write at,\n         * by prefixing it with a subfolder!\n         */\n        if ($this->version === 1) {\n            $this->filesystem->createDir($name);\n        } else {\n            $this->filesystem->createDirectory($name);\n        }\n\n        return new Collection($this->filesystem, $name);\n    }\n\n    /**\n     * Shared between increment/decrement: both have mostly the same logic\n     * (decrement just increments a negative value), but need their validation\n     * split up (increment won't accept negative values).\n     */\n    protected function doIncrement(string $key, int $offset, int $initial, int $expire): int|false\n    {\n        $current = $this->get($key, $token);\n        if ($current === false) {\n            $success = $this->add($key, $initial, $expire);\n\n            return $success ? $initial : false;\n        }\n\n        // NaN, doesn't compute\n        if (!is_numeric($current)) {\n            return false;\n        }\n\n        $value = $current + $offset;\n        $value = max(0, $value);\n\n        $success = $this->cas($token, $key, $value, $expire);\n\n        return $success ? $value : false;\n    }\n\n    protected function exists(string $key): bool\n    {\n        $data = $this->read($key);\n        if ($data === false) {\n            return false;\n        }\n\n        $expire = $data[0];\n        if ($expire !== 0 && $expire < time()) {\n            // expired, don't keep it around\n            $path = $this->path($key);\n            $this->filesystem->delete($path);\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Obtain a lock for a given key.\n     * It'll try to get a lock for a couple of times, but ultimately give up if\n     * no lock can be obtained in a reasonable time.\n     */\n    protected function lock(string $key): bool\n    {\n        $path = md5($key) . '.lock';\n\n        for ($i = 0; $i < 25; ++$i) {\n            try {\n                $this->filesystem->write($path, '');\n\n                return true;\n            } catch (FileExistsException $e) {\n                // v1.x\n                usleep(200);\n            } catch (UnableToWriteFile $e) {\n                // v2.x/3.x\n                usleep(200);\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Release the lock for a given key.\n     */\n    protected function unlock(string $key): bool\n    {\n        $path = md5($key) . '.lock';\n        try {\n            $this->filesystem->delete($path);\n        } catch (FileNotFoundException $e) {\n            // v1.x\n            return false;\n        } catch (UnableToDeleteFile $e) {\n            // v2.x/3.x\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Times can be:\n     * * relative (in seconds) to current time, within 30 days\n     * * absolute unix timestamp\n     * * 0, for infinity.\n     *\n     * The first case (relative time) will be normalized into a fixed absolute\n     * timestamp.\n     */\n    protected function normalizeTime(int $time): int\n    {\n        // 0 = infinity\n        if (!$time) {\n            return 0;\n        }\n\n        // relative time in seconds, <30 days\n        if ($time < 30 * 24 * 60 * 60) {\n            $time += time();\n        }\n\n        return $time;\n    }\n\n    /**\n     * Build value, token & expiration time to be stored in cache file.\n     */\n    protected function wrap(mixed $value, int $expire): string\n    {\n        $expire = $this->normalizeTime($expire);\n\n        return $expire . \"\\n\" . serialize($value);\n    }\n\n    /**\n     * Fetch stored data from cache file.\n     */\n    protected function read(string $key): array|false\n    {\n        $path = $this->path($key);\n        try {\n            $data = $this->filesystem->read($path);\n        } catch (FileNotFoundException $e) {\n            // v1.x\n            // unlikely given previous 'exists' check, but let's play safe...\n            // (outside process may have removed it since)\n            return false;\n        } catch (UnableToReadFile $e) {\n            // v2.x/3.x\n            // unlikely given previous 'exists' check, but let's play safe...\n            // (outside process may have removed it since)\n            return false;\n        }\n\n        if ($data === false) {\n            // in theory, a file could still be deleted between Flysystem's\n            // assertPresent & the time it actually fetched the content;\n            // extremely unlikely though\n            return false;\n        }\n\n        $data = explode(\"\\n\", $data, 2);\n        $data[0] = (int) $data[0];\n\n        return $data;\n    }\n\n    protected function path(string $key): string\n    {\n        return md5($key) . '.cache';\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Memcached.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Memcached as Collection;\nuse MatthiasMullie\\Scrapbook\\Exception\\InvalidKey;\nuse MatthiasMullie\\Scrapbook\\Exception\\OperationFailed;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * Memcached adapter. Basically just a wrapper over \\Memcached, but in an\n * exchangeable (KeyValueStore) interface.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Memcached implements KeyValueStore\n{\n    protected \\Memcached $client;\n\n    public function __construct(\\Memcached $client)\n    {\n        $this->client = $client;\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        /**\n         * Wouldn't it be awesome if I just used the obvious method?\n         *\n         * I'm going to use getMulti() instead of get() because the latter is\n         * flawed in earlier versions, where it was known to mess up some\n         * operations that are followed by it (increment/decrement have been\n         * reported, also seen it make CAS return result unreliable)\n         *\n         * @see https://github.com/php-memcached-dev/php-memcached/issues/21\n         */\n        $values = $this->getMulti([$key], $tokens);\n\n        if (!isset($values[$key])) {\n            $token = null;\n\n            return false;\n        }\n\n        $token = $tokens[$key];\n\n        return $values[$key];\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        $tokens = [];\n        if (empty($keys)) {\n            return [];\n        }\n\n        $keys = array_map([$this, 'encode'], $keys);\n\n        if (defined('\\Memcached::GET_EXTENDED')) {\n            $return = $this->client->getMulti($keys, \\Memcached::GET_EXTENDED);\n            $this->throwExceptionOnClientCallFailure($return);\n            foreach ($return as $key => $value) {\n                // once PHP<5.5 support is dropped, just use array_column\n                $tokens[$key] = $value['cas'];\n                $return[$key] = $value['value'];\n            }\n        } else {\n            $return = $this->client->getMulti($keys, $tokens);\n            $this->throwExceptionOnClientCallFailure($return);\n        }\n\n        $keys = array_map([$this, 'decode'], array_keys($return));\n        $return = array_combine($keys, $return);\n\n        // HHVMs getMulti() returns null instead of empty array for no results,\n        // so normalize that\n        $tokens = $tokens ?: [];\n        $tokens = array_combine($keys, $tokens);\n\n        return $return ?: [];\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        if ($this->deleteIfExpired($key, $expire)) {\n            return true;\n        }\n\n        $key = $this->encode($key);\n\n        return $this->client->set($key, $value, $expire);\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        if (empty($items)) {\n            return [];\n        }\n\n        $keys = array_keys($items);\n        if ($this->deleteIfExpired($keys, $expire)) {\n            return array_fill_keys($keys, true);\n        }\n\n        if (defined('HHVM_VERSION')) {\n            $nums = array_filter(array_keys($items), 'is_numeric');\n            if (!empty($nums)) {\n                return $this->setMultiNumericItemsForHHVM($items, $nums, $expire);\n            }\n        }\n\n        $keys = array_map([$this, 'encode'], array_keys($items));\n        $items = array_combine($keys, $items);\n        $success = $this->client->setMulti($items, $expire);\n        $keys = array_map([$this, 'decode'], array_keys($items));\n\n        return array_fill_keys($keys, $success);\n    }\n\n    public function delete(string $key): bool\n    {\n        $key = $this->encode($key);\n\n        return $this->client->delete($key);\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        if (empty($keys)) {\n            return [];\n        }\n\n        if (!method_exists($this->client, 'deleteMulti')) {\n            /**\n             * HHVM didn't always support deleteMulti, so I'll hack around it by\n             * setting all items expired.\n             * I could also delete() all items one by one, but that would\n             * probably take more network requests (this version always takes 2).\n             *\n             * @see http://docs.hhvm.com/manual/en/memcached.deletemulti.php\n             */\n            $values = $this->getMulti($keys);\n\n            $keys = array_map([$this, 'encode'], array_keys($values));\n            $this->client->setMulti(array_fill_keys($keys, ''), time() - 1);\n\n            $return = [];\n            foreach ($keys as $key) {\n                $key = $this->decode($key);\n                $return[$key] = array_key_exists($key, $values);\n            }\n\n            return $return;\n        }\n\n        $keys = array_map([$this, 'encode'], $keys);\n        $result = (array) $this->client->deleteMulti($keys);\n        $keys = array_map([$this, 'decode'], array_keys($result));\n        $result = array_combine($keys, $result);\n\n        /*\n         * Contrary to docs (http://php.net/manual/en/memcached.deletemulti.php)\n         * deleteMulti returns an array of [key => true] (for successfully\n         * deleted values) and [key => error code] (for failures)\n         * Pretty good because I want an array of true/false, so I'll just have\n         * to replace the error codes by falses.\n         */\n        foreach ($result as $key => $status) {\n            $result[$key] = $status === true;\n        }\n\n        return $result;\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        $key = $this->encode($key);\n\n        $success = $this->client->add($key, $value, $expire);\n        if ($success) {\n            $this->deleteIfExpired($key, $expire);\n        }\n\n        return $success;\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        $key = $this->encode($key);\n\n        $success = $this->client->replace($key, $value, $expire);\n        if ($success) {\n            $this->deleteIfExpired($key, $expire);\n        }\n\n        return $success;\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        if (!is_float($token) && !is_int($token)) {\n            return false;\n        }\n\n        $key = $this->encode($key);\n\n        $success = $this->client->cas($token, $key, $value, $expire);\n        if ($success) {\n            $this->deleteIfExpired($key, $expire);\n        }\n\n        return $success;\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        /*\n         * Not doing \\Memcached::increment because that one:\n         * * needs \\Memcached::OPT_BINARY_PROTOCOL == true\n         * * is prone to errors after a flush (\"merges\" with pruned data) in at\n         *   least some particular versions of Memcached\n         */\n        return $this->doIncrement($key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        /*\n         * Not doing \\Memcached::decrement for the reasons described in:\n         * @see increment()\n         */\n        return $this->doIncrement($key, -$offset, $initial, $expire);\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        if ($this->deleteIfExpired($key, $expire)) {\n            return true;\n        }\n\n        /**\n         * HHVM doesn't support touch.\n         *\n         * @see http://docs.hhvm.com/manual/en/memcached.touch.php\n         *\n         * PHP does, but only with \\Memcached::OPT_BINARY_PROTOCOL == true,\n         * and even then, it appears to be buggy on particular versions of\n         * Memcached.\n         *\n         * I'll just work around it!\n         */\n        $value = $this->get($key, $token);\n\n        return $this->cas($token, $key, $value, $expire);\n    }\n\n    public function flush(): bool\n    {\n        return $this->client->flush();\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        return new Collection($this, $name);\n    }\n\n    /**\n     * Shared between increment/decrement: both have mostly the same logic\n     * (decrement just increments a negative value), but need their validation\n     * split up (increment won't accept negative values).\n     */\n    protected function doIncrement(string $key, int $offset, int $initial, int $expire): int|false\n    {\n        $value = $this->get($key, $token);\n        if ($value === false) {\n            $success = $this->add($key, $initial, $expire);\n\n            return $success ? $initial : false;\n        }\n\n        if (!is_numeric($value) || $value < 0) {\n            return false;\n        }\n\n        $value += $offset;\n        // value can never be lower than 0\n        $value = max(0, $value);\n        $key = $this->encode($key);\n        $success = $this->client->cas($token, $key, $value, $expire);\n\n        return $success ? $value : false;\n    }\n\n    /**\n     * Encode a key for use on the wire inside the memcached protocol.\n     *\n     * We encode spaces and line breaks to avoid protocol errors. We encode\n     * the other control characters for compatibility with libmemcached\n     * verify_key. We leave other punctuation alone, to maximise backwards\n     * compatibility.\n     *\n     * @see https://github.com/wikimedia/mediawiki/commit/be76d869#diff-75b7c03970b5e43de95ff95f5faa6ef1R100\n     * @see https://github.com/wikimedia/mediawiki/blob/master/includes/libs/objectcache/MemcachedBagOStuff.php#L116\n     *\n     * @throws InvalidKey\n     */\n    protected function encode(string $key): string\n    {\n        $regex = '/[^\\x21\\x22\\x24\\x26-\\x39\\x3b-\\x7e]+/';\n        $key = preg_replace_callback($regex, static function (array $match): string {\n            return rawurlencode($match[0]);\n        }, $key);\n\n        if (strlen($key) > 255) {\n            throw new InvalidKey(\"Invalid key: $key. Encoded Memcached keys can not exceed 255 chars.\");\n        }\n\n        return $key;\n    }\n\n    /**\n     * Decode a key encoded with encode().\n     */\n    protected function decode(string $key): string\n    {\n        // matches %20, %7F, ... but not %21, %22, ...\n        // (=the encoded versions for those encoded in encode)\n        $regex = '/%(?!2[1246789]|3[0-9]|3[B-F]|[4-6][0-9A-F]|5[0-9A-E])[0-9A-Z]{2}/i';\n\n        return preg_replace_callback($regex, static function (array $match): string {\n            return rawurldecode($match[0]);\n        }, $key);\n    }\n\n    /**\n     * Memcached seems to not timely purge items the way it should when\n     * storing it with an expired timestamp, so we'll detect that and\n     * delete it (instead of performing the already expired operation).\n     *\n     * @param string|string[] $key\n     *\n     * @return bool True if expired\n     */\n    protected function deleteIfExpired(string|array $key, int $expire): bool\n    {\n        if ($expire < 0 || ($expire > 2592000 && $expire < time())) {\n            $this->deleteMulti((array) $key);\n\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Numerical strings turn into integers when used as array keys, and\n     * HHVM (used to) reject(s) such cache keys.\n     *\n     * @see https://github.com/facebook/hhvm/pull/7654\n     */\n    protected function setMultiNumericItemsForHHVM(array $items, array $nums, int $expire = 0): array\n    {\n        $success = [];\n        $nums = array_intersect_key($items, array_fill_keys($nums, null));\n        foreach ($nums as $k => $v) {\n            $success[$k] = $this->set((string) $k, $v, $expire);\n        }\n\n        $remaining = array_diff_key($items, $nums);\n        if ($remaining) {\n            $success += $this->setMulti($remaining, $expire);\n        }\n\n        return $success;\n    }\n\n    /**\n     * Will throw an exception if the returned result from a Memcached call\n     * indicates a failure in the operation.\n     * The exception will contain debug information about the failure.\n     *\n     * @throws OperationFailed\n     */\n    protected function throwExceptionOnClientCallFailure(mixed $result): void\n    {\n        if ($result !== false) {\n            return;\n        }\n\n        throw new OperationFailed($this->client->getResultMessage(), $this->client->getResultCode());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/MemoryStore.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\MemoryStore as Collection;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * No-storage cache: all values will be \"cached\" in memory, in a simple PHP\n * array. Values will only be valid for 1 request: whatever is in memory at the\n * end of the request just dies. Other requests will start from a blank slate.\n *\n * This is mainly useful for testing purposes, where this class can let you test\n * application logic against cache, without having to run a cache server.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass MemoryStore implements KeyValueStore\n{\n    public array $items = [];\n\n    protected int $limit = 0;\n\n    protected int $size = 0;\n\n    /**\n     * @param int|string|null $limit Memory limit in bytes (defaults to 10% of memory_limit)\n     */\n    public function __construct(int|string $limit = null)\n    {\n        if ($limit === null) {\n            $phpLimit = ini_get('memory_limit');\n            if ($phpLimit <= 0) {\n                $this->limit = PHP_INT_MAX;\n            } else {\n                $this->limit = (int) ($this->shorthandToBytes($phpLimit) / 10);\n            }\n        } else {\n            $this->limit = $this->shorthandToBytes($limit);\n        }\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        if (!$this->exists($key)) {\n            $token = null;\n\n            return false;\n        }\n\n        $value = $this->items[$key][0];\n\n        // use serialized version of stored value as CAS token\n        $token = $value;\n\n        return unserialize($value, ['allowed_classes' => true]);\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        $items = [];\n        $tokens = [];\n\n        foreach ($keys as $key) {\n            if (!$this->exists($key)) {\n                // omit missing keys from return array\n                continue;\n            }\n\n            $items[$key] = $this->get($key, $token);\n            $tokens[$key] = $token;\n        }\n\n        return $items;\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        $this->size -= isset($this->items[$key]) ? strlen($this->items[$key][0]) : 0;\n\n        $value = serialize($value);\n        $expire = $this->normalizeTime($expire);\n        $this->items[$key] = [$value, $expire];\n\n        $this->size += strlen($value);\n        $this->lru($key);\n        $this->evict();\n\n        return true;\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        $success = [];\n        foreach ($items as $key => $value) {\n            // PHP treats numeric keys as integers, but they're allowed\n            $key = (string) $key;\n            $success[$key] = $this->set($key, $value, $expire);\n        }\n\n        return $success;\n    }\n\n    public function delete(string $key): bool\n    {\n        $exists = $this->exists($key);\n\n        if ($exists) {\n            $this->size -= strlen($this->items[$key][0]);\n            unset($this->items[$key]);\n        }\n\n        return $exists;\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        $success = [];\n\n        foreach ($keys as $key) {\n            $success[$key] = $this->delete($key);\n        }\n\n        return $success;\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        if ($this->exists($key)) {\n            return false;\n        }\n\n        return $this->set($key, $value, $expire);\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        if (!$this->exists($key)) {\n            return false;\n        }\n\n        return $this->set($key, $value, $expire);\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        if (!$this->exists($key)) {\n            return false;\n        }\n\n        $this->get($key, $comparison);\n        if ($comparison !== $token) {\n            return false;\n        }\n\n        return $this->set($key, $value, $expire);\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        return $this->doIncrement($key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        return $this->doIncrement($key, -$offset, $initial, $expire);\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        $expire = $this->normalizeTime($expire);\n\n        // get current value & re-save it, with new expiration\n        $value = $this->get($key, $token);\n\n        return $this->cas($token, $key, $value, $expire);\n    }\n\n    public function flush(): bool\n    {\n        $this->items = [];\n        $this->size = 0;\n\n        return true;\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        return new Collection($this, $name);\n    }\n\n    /**\n     * Checks if a value exists in cache and is not yet expired.\n     */\n    protected function exists(string $key): bool\n    {\n        if (!array_key_exists($key, $this->items)) {\n            // key not in cache\n            return false;\n        }\n\n        $expire = $this->items[$key][1];\n        if ($expire !== 0 && $expire < time()) {\n            // not permanent & already expired\n            $this->size -= strlen($this->items[$key][0]);\n            unset($this->items[$key]);\n\n            return false;\n        }\n\n        $this->lru($key);\n\n        return true;\n    }\n\n    /**\n     * Shared between increment/decrement: both have mostly the same logic\n     * (decrement just increments a negative value), but need their validation\n     * split up (increment won't accept negative values).\n     */\n    protected function doIncrement(string $key, int $offset, int $initial, int $expire): int|false\n    {\n        if (!$this->exists($key)) {\n            $this->set($key, $initial, $expire);\n\n            return $initial;\n        }\n\n        $value = $this->get($key);\n        if (!is_numeric($value) || $value < 0) {\n            return false;\n        }\n\n        $value += $offset;\n        // value can never be lower than 0\n        $value = max(0, $value);\n        $this->set($key, $value, $expire);\n\n        return $value;\n    }\n\n    /**\n     * Times can be:\n     * * relative (in seconds) to current time, within 30 days\n     * * absolute unix timestamp\n     * * 0, for infinity.\n     *\n     * The first case (relative time) will be normalized into a fixed absolute\n     * timestamp.\n     */\n    protected function normalizeTime(int $time): int\n    {\n        // 0 = infinity\n        if (!$time) {\n            return 0;\n        }\n\n        // relative time in seconds, <30 days\n        if ($time < 30 * 24 * 60 * 60) {\n            $time += time();\n        }\n\n        return $time;\n    }\n\n    /**\n     * This cache uses least recently used algorithm. This is to be called\n     * with the key to be marked as just used.\n     */\n    protected function lru(string $key): void\n    {\n        // move key that has just been used to last position in the array\n        $value = $this->items[$key];\n        unset($this->items[$key]);\n        $this->items[$key] = $value;\n    }\n\n    /**\n     * Least recently used cache values will be evicted from cache should\n     * it fill up too much.\n     */\n    protected function evict(): void\n    {\n        while ($this->size > $this->limit && !empty($this->items)) {\n            $item = array_shift($this->items);\n            $this->size -= strlen($item[0]);\n        }\n    }\n\n    /**\n     * Understands shorthand byte values (as used in e.g. memory_limit ini\n     * setting) and converts them into bytes.\n     *\n     * @see http://php.net/manual/en/faq.using.php#faq.using.shorthandbytes\n     *\n     * @param string|int $shorthand Amount of bytes (int) or shorthand value (e.g. 512M)\n     */\n    protected function shorthandToBytes(string|int $shorthand): int\n    {\n        if (is_numeric($shorthand)) {\n            // make sure that when float(1.234E17) is passed in, it doesn't get\n            // cast to string('1.234E17'), then to int(1)\n            return $shorthand;\n        }\n\n        $units = ['B' => 1024, 'M' => 1024 ** 2, 'G' => 1024 ** 3];\n\n        return (int) preg_replace_callback(\n            '/^([0-9]+)(' . implode('|', array_keys($units)) . ')$/',\n            static function ($match) use ($units): int {\n                return $match[1] * $units[$match[2]];\n            },\n            $shorthand\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/MySQL.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters;\n\n/**\n * MySQL adapter. Basically just a wrapper over \\PDO, but in an exchangeable\n * (KeyValueStore) interface.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass MySQL extends SQL\n{\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        $value = $this->serialize($value);\n        $expire = $this->expire($expire);\n\n        $this->clearExpired();\n\n        $statement = $this->client->prepare(\n            \"REPLACE INTO $this->table (k, v, e)\n            VALUES (:key, :value, :expire)\"\n        );\n\n        $statement->execute([\n            ':key' => $key,\n            ':value' => $value,\n            ':expire' => $expire,\n        ]);\n\n        // 1 = insert; 2 = update\n        return $statement->rowCount() === 1 || $statement->rowCount() === 2;\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        if (empty($items)) {\n            return [];\n        }\n\n        $i = 1;\n        $query = [];\n        $params = [];\n        $expire = $this->expire($expire);\n\n        $this->clearExpired();\n\n        foreach ($items as $key => $value) {\n            $value = $this->serialize($value);\n\n            $query[] = \"(:key$i, :value$i, :expire$i)\";\n            $params += [\n                \":key$i\" => $key,\n                \":value$i\" => $value,\n                \":expire$i\" => $expire,\n            ];\n\n            ++$i;\n        }\n\n        $statement = $this->client->prepare(\n            \"REPLACE INTO $this->table (k, v, e)\n            VALUES \" . implode(',', $query)\n        );\n\n        $statement->execute($params);\n\n        /*\n         * As far as I can tell, there are no conditions under which this can go\n         * wrong (if item exists or not, REPLACE INTO will work either way),\n         * except for connection problems, in which case all or none will be\n         * stored.\n         * Can't compare with count($items) because rowCount could be 1 or 2,\n         * depending on if REPLACE was an INSERT or UPDATE.\n         */\n        $success = $statement->rowCount() > 0;\n\n        return array_fill_keys(array_keys($items), $success);\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        $value = $this->serialize($value);\n        $expire = $this->expire($expire);\n\n        $this->clearExpired();\n\n        // MySQL-specific way to ignore insert-on-duplicate errors\n        $statement = $this->client->prepare(\n            \"INSERT IGNORE INTO $this->table (k, v, e)\n            VALUES (:key, :value, :expire)\"\n        );\n\n        $statement->execute([\n            ':key' => $key,\n            ':value' => $value,\n            ':expire' => $expire,\n        ]);\n\n        return $statement->rowCount() === 1;\n    }\n\n    public function flush(): bool\n    {\n        return $this->client->exec(\"TRUNCATE TABLE $this->table\") !== false;\n    }\n\n    protected function init(): void\n    {\n        $this->client->exec(\n            \"CREATE TABLE IF NOT EXISTS $this->table (\n                k VARBINARY(1000) NOT NULL PRIMARY KEY,\n                v LONGBLOB,\n                e TIMESTAMP NULL DEFAULT NULL,\n                KEY e (e)\n            )\"\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/PostgreSQL.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters;\n\n/**\n * PostgreSQL adapter. Basically just a wrapper over \\PDO, but in an\n * exchangeable (KeyValueStore) interface.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass PostgreSQL extends SQL\n{\n    protected bool $conflictSupport = true;\n\n    public function flush(): bool\n    {\n        return $this->client->exec(\"TRUNCATE TABLE $this->table\") !== false;\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        $return = parent::get($key, $token);\n\n        if ($token !== null) {\n            // BYTEA data return streams - we actually need the data in\n            // serialized format, not some silly stream\n            $token = $this->serialize($return);\n        }\n\n        return $return;\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        $return = parent::getMulti($keys, $tokens);\n\n        foreach ($return as $key => $value) {\n            // BYTEA data return streams - we actually need the data in\n            // serialized format, not some silly stream\n            $tokens[$key] = $this->serialize($value);\n        }\n\n        return $return;\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        if (!$this->conflictSupport) {\n            return parent::set($key, $value, $expire);\n        }\n\n        $this->clearExpired();\n\n        $serialized = $this->serialize($value);\n        $expiration = $this->expire($expire);\n\n        $statement = $this->client->prepare(\n            \"INSERT INTO $this->table (k, v, e)\n            VALUES (:key, :value, :expire) \n            ON CONFLICT (k) DO UPDATE SET v=EXCLUDED.v, e=EXCLUDED.e\"\n        );\n\n        $statement->bindParam(':key', $key);\n        $statement->bindParam(':value', $serialized, \\PDO::PARAM_LOB, strlen($serialized));\n        $statement->bindParam(':expire', $expiration);\n        $statement->execute();\n\n        // ON CONFLICT is not supported in versions < 9.5, in which case we'll\n        // have to fall back on add/replace\n        if ($statement->errorCode() === '42601') {\n            $this->conflictSupport = false;\n\n            return $this->set($key, $value, $expire);\n        }\n\n        return $statement->rowCount() === 1;\n    }\n\n    protected function init(): void\n    {\n        $this->client->exec(\n            \"CREATE TABLE IF NOT EXISTS $this->table (\n                k VARCHAR NOT NULL PRIMARY KEY,\n                v BYTEA,\n                e TIMESTAMP NULL DEFAULT NULL\n            )\"\n        );\n        $this->client->exec(\"CREATE INDEX IF NOT EXISTS e_index ON $this->table (e)\");\n    }\n\n    protected function unserialize(mixed $value): mixed\n    {\n        // BYTEA data return streams. Even though it's not how init() will\n        // configure the DB by default, it could be used instead!\n        if (is_resource($value)) {\n            $value = stream_get_contents($value);\n        }\n\n        return parent::unserialize($value);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/Redis.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\Redis as Collection;\nuse MatthiasMullie\\Scrapbook\\Exception\\InvalidCollection;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * Redis adapter. Basically just a wrapper over \\Redis, but in an exchangeable\n * (KeyValueStore) interface.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Redis implements KeyValueStore\n{\n    protected \\Redis $client;\n\n    protected string|null $version = null;\n\n    public function __construct(\\Redis $client)\n    {\n        $this->client = $client;\n\n        // set a serializer if none is set already\n        if ($this->client->getOption(\\Redis::OPT_SERIALIZER) === \\Redis::SERIALIZER_NONE) {\n            $this->client->setOption(\\Redis::OPT_SERIALIZER, \\Redis::SERIALIZER_PHP);\n        }\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        $this->client->multi();\n\n        $this->client->get($key);\n        $this->client->exists($key);\n\n        /** @var array $return */\n        $return = $this->client->exec();\n        if ($return === false) {\n            return false;\n        }\n\n        [$value, $exists] = $return;\n\n        // no value = quit early, don't generate a useless token\n        if (!$exists) {\n            $token = null;\n\n            return false;\n        }\n\n        // serializing to make sure we don't pass objects (by-reference) ;)\n        $token = serialize($value);\n\n        return $value;\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        $tokens = [];\n        if (empty($keys)) {\n            return [];\n        }\n\n        $this->client->multi();\n\n        $this->client->mget($keys);\n        foreach ($keys as $key) {\n            $this->client->exists($key);\n        }\n\n        /** @var array $return */\n        $return = $this->client->exec();\n        if ($return === false) {\n            return [];\n        }\n\n        $values = array_shift($return);\n        $exists = $return;\n\n        if ($values === false) {\n            $values = array_fill_keys($keys, false);\n        }\n        $values = array_combine($keys, $values);\n        $exists = array_combine($keys, $exists);\n\n        foreach ($values as $key => $value) {\n            // filter out non-existing values\n            if (!$exists[$key]) {\n                unset($values[$key]);\n                continue;\n            }\n\n            // serializing to make sure we don't pass objects (by-reference) ;)\n            $tokens[$key] = serialize($value);\n        }\n\n        return $values;\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        $ttl = $this->ttl($expire);\n\n        /*\n         * Negative ttl behavior isn't properly documented & doesn't always\n         * appear to treat the value as non-existing. Let's play safe and just\n         * delete it right away!\n         */\n        if ($ttl < 0) {\n            $this->delete($key);\n\n            return true;\n        }\n\n        /*\n         * phpredis advises: \"Calling setex() is preferred if you want a Time To\n         * Live\". It seems that setex it what set will fall back to if you pass\n         * it a TTL anyway.\n         * Redis advises: \"Note: Since the SET command options can replace\n         * SETNX, SETEX, PSETEX, it is possible that in future versions of Redis\n         * these three commands will be deprecated and finally removed.\"\n         * I'll just go with set() - it works and seems the desired path for the\n         * future.\n         *\n         * @see https://github.com/ukko/phpredis-phpdoc/blob/master/src/Redis.php#L190\n         * @see https://github.com/phpredis/phpredis#set\n         * @see http://redis.io/commands/SET\n         */\n        return $this->client->set($key, $value, $ttl);\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        if (empty($items)) {\n            return [];\n        }\n\n        $ttl = $this->ttl($expire);\n\n        /*\n         * Negative ttl behavior isn't properly documented & doesn't always\n         * appear to treat the value as non-existing. Let's play safe and just\n         * delete it right away!\n         */\n        if ($ttl < 0) {\n            $this->deleteMulti(array_keys($items));\n\n            return array_fill_keys(array_keys($items), true);\n        }\n\n        if ($ttl === null) {\n            $success = $this->client->mset($items);\n\n            return array_fill_keys(array_keys($items), $success);\n        }\n\n        $this->client->multi();\n        $this->client->mset($items);\n\n        // Redis has no convenient multi-expire method\n        foreach ($items as $key => $value) {\n            $this->client->expire($key, $ttl);\n        }\n\n        /* @var bool[] $return */\n        $result = (array) $this->client->exec();\n\n        $return = [];\n        $keys = array_keys($items);\n        $success = array_shift($result);\n        foreach ($result as $i => $value) {\n            $key = $keys[$i];\n            $return[$key] = $success && $value;\n        }\n\n        return $return;\n    }\n\n    public function delete(string $key): bool\n    {\n        return (bool) $this->client->del($key);\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        if (empty($keys)) {\n            return [];\n        }\n\n        /*\n         * del will only return the amount of deleted entries, but we also want\n         * to know which failed. Deletes will only fail for items that don't\n         * exist, so we'll just ask for those and see which are missing.\n         */\n        $items = $this->getMulti($keys);\n\n        $this->client->del($keys);\n\n        $return = [];\n        foreach ($keys as $key) {\n            $return[$key] = array_key_exists($key, $items);\n        }\n\n        return $return;\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        $ttl = $this->ttl($expire);\n\n        /*\n         * Negative ttl behavior isn't properly documented & doesn't always\n         * appear to treat the value as non-existing. Let's play safe and not\n         * even create the value (also saving a request)\n         */\n        if ($ttl < 0) {\n            return true;\n        }\n\n        if ($ttl === null) {\n            return $this->client->setnx($key, $value);\n        }\n\n        /*\n         * Redis supports passing set() an extended options array since >=2.6.12\n         * which allows for an easy and 1-request way to replace a value.\n         * That version already comes with Ubuntu 14.04. Ubuntu 12.04 (still\n         * widely used and in LTS) comes with an older version, however, so I\n         * want to support that too.\n         * Supporting both versions comes at a cost.\n         * I'll optimize for recent versions, which will get (in case of add\n         * failure) 1 additional network request (for version info). Older\n         * versions will get 2 additional network requests: a failed add\n         * (because the options are unknown) & a version check.\n         */\n        if ($this->version === null || $this->supportsOptionsArray()) {\n            $options = ['nx'];\n            if ($ttl > 0) {\n                /*\n                 * Not adding 0 TTL to options:\n                 * * HHVM (used to) interpret(s) wrongly & throw an exception\n                 * * it's not needed anyway, for 0...\n                 * @see https://github.com/facebook/hhvm/pull/4833\n                 */\n                $options['ex'] = $ttl;\n            }\n\n            // either we support options array or we haven't yet checked, in\n            // which case I'll assume a recent server is running\n            $result = $this->client->set($key, $value, $options);\n            if ($result !== false) {\n                return $result;\n            }\n\n            if ($this->supportsOptionsArray()) {\n                // failed execution, but not because our Redis version is too old\n                return false;\n            }\n        }\n\n        // workaround for old Redis versions\n        $this->client->watch($key);\n\n        $exists = $this->client->exists('key');\n        if ($exists) {\n            /*\n             * HHVM Redis only got unwatch recently\n             * @see https://github.com/asgrim/hhvm/commit/bf5a259cece5df8a7617133c85043608d1ad5316\n             */\n            if (method_exists($this->client, 'unwatch')) {\n                $this->client->unwatch();\n            } else {\n                // this should also kill the watch...\n                $this->client->multi()->discard();\n            }\n\n            return false;\n        }\n\n        // since we're watching the key, this will fail should it change in the\n        // meantime\n        $this->client->multi();\n\n        $this->client->set($key, $value, $ttl);\n\n        /** @var bool[] $return */\n        $return = (array) $this->client->exec();\n\n        return !in_array(false, $return, true);\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        $ttl = $this->ttl($expire);\n\n        /*\n         * Negative ttl behavior isn't properly documented & doesn't always\n         * appear to treat the value as non-existing. Let's play safe and just\n         * delete it right away!\n         */\n        if ($ttl < 0) {\n            return $this->delete($key);\n        }\n\n        /*\n         * Redis supports passing set() an extended options array since >=2.6.12\n         * which allows for an easy and 1-request way to replace a value.\n         * That version already comes with Ubuntu 14.04. Ubuntu 12.04 (still\n         * widely used and in LTS) comes with an older version, however, so I\n         * want to support that too.\n         * Supporting both versions comes at a cost.\n         * I'll optimize for recent versions, which will get (in case of replace\n         * failure) 1 additional network request (for version info). Older\n         * versions will get 2 additional network requests: a failed replace\n         * (because the options are unknown) & a version check.\n         */\n        if ($this->version === null || $this->supportsOptionsArray()) {\n            $options = ['xx'];\n            if ($ttl > 0) {\n                /*\n                 * Not adding 0 TTL to options:\n                 * * HHVM (used to) interpret(s) wrongly & throw an exception\n                 * * it's not needed anyway, for 0...\n                 * @see https://github.com/facebook/hhvm/pull/4833\n                 */\n                $options['ex'] = $ttl;\n            }\n\n            // either we support options array or we haven't yet checked, in\n            // which case I'll assume a recent server is running\n            $result = $this->client->set($key, $value, $options);\n            if ($result !== false) {\n                return $result;\n            }\n\n            if ($this->supportsOptionsArray()) {\n                // failed execution, but not because our Redis version is too old\n                return false;\n            }\n        }\n\n        // workaround for old Redis versions\n        $this->client->watch($key);\n\n        $exists = $this->client->exists('key');\n        if (!$exists) {\n            /*\n             * HHVM Redis only got unwatch recently\n             * @see https://github.com/asgrim/hhvm/commit/bf5a259cece5df8a7617133c85043608d1ad5316\n             */\n            if (method_exists($this->client, 'unwatch')) {\n                $this->client->unwatch();\n            } else {\n                // this should also kill the watch...\n                $this->client->multi()->discard();\n            }\n\n            return false;\n        }\n\n        // since we're watching the key, this will fail should it change in the\n        // meantime\n        $this->client->multi();\n\n        $this->client->set($key, $value, $ttl);\n\n        /** @var bool[] $return */\n        $return = (array) $this->client->exec();\n\n        return !in_array(false, $return, true);\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        $this->client->watch($key);\n\n        // check if the value still matches CAS token\n        $comparison = $this->client->get($key);\n        if (serialize($comparison) !== $token) {\n            /*\n             * HHVM Redis only got unwatch recently\n             * @see https://github.com/asgrim/hhvm/commit/bf5a259cece5df8a7617133c85043608d1ad5316\n             */\n            if (method_exists($this->client, 'unwatch')) {\n                $this->client->unwatch();\n            } else {\n                // this should also kill the watch...\n                $this->client->multi()->discard();\n            }\n\n            return false;\n        }\n\n        $ttl = $this->ttl($expire);\n\n        // since we're watching the key, this will fail should it change in the\n        // meantime\n        $this->client->multi();\n\n        /*\n         * Negative ttl behavior isn't properly documented & doesn't always\n         * appear to treat the value as non-existing. Let's play safe and just\n         * delete it right away!\n         */\n        if ($ttl < 0) {\n            $this->client->del($key);\n        } else {\n            $this->client->set($key, $value, $ttl);\n        }\n\n        /** @var bool[] $return */\n        $return = (array) $this->client->exec();\n\n        return !in_array(false, $return, true);\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        // INCRBY initializes (at 0) & immediately increments, whereas we\n        // only do initialization if the value does not yet exist\n        if ($initial + $offset === 0 && $expire === 0) {\n            return $this->client->incrBy($key, $offset);\n        }\n\n        return $this->doIncrement($key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        // DECRBY can't be used. Not even if we don't need an initial\n        // value (it auto-initializes at 0) or expire. Problem is it\n        // will decrement below 0, which is something we don't support.\n\n        return $this->doIncrement($key, -$offset, $initial, $expire);\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        $ttl = $this->ttl($expire);\n\n        if ($ttl < 0) {\n            // Redis can't set expired, so just remove in that case ;)\n            return (bool) $this->client->del($key);\n        }\n\n        return $this->client->expire($key, $ttl);\n    }\n\n    public function flush(): bool\n    {\n        return $this->client->flushAll();\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        if (!is_numeric($name)) {\n            throw new InvalidCollection('Redis database names must be numeric. ' . serialize($name) . ' given.');\n        }\n\n        // we can't reuse $this->client in a different object, because it'll\n        // operate on a different database\n        $client = new \\Redis();\n\n        if ($this->client->getPersistentID() !== null) {\n            $client->pconnect(\n                $this->client->getHost(),\n                $this->client->getPort(),\n                $this->client->getTimeout()\n            );\n        } else {\n            $client->connect(\n                $this->client->getHost(),\n                $this->client->getPort(),\n                $this->client->getTimeout()\n            );\n        }\n\n        $auth = $this->client->getAuth();\n        if ($auth !== null) {\n            $client->auth($auth);\n        }\n\n        $readTimeout = $this->client->getReadTimeout();\n        if ($readTimeout) {\n            $client->setOption(\\Redis::OPT_READ_TIMEOUT, $this->client->getReadTimeout());\n        }\n\n        return new Collection($client, (int) $name);\n    }\n\n    /**\n     * Redis expects true TTL, not expiration timestamp.\n     *\n     * @return int|null TTL in seconds, or `null` for no expiration\n     */\n    protected function ttl(int $expire): int|null\n    {\n        if ($expire === 0) {\n            return null;\n        }\n\n        // relative time in seconds, <30 days\n        if ($expire < 30 * 24 * 60 * 60) {\n            return $expire;\n        }\n\n        return $expire - time();\n    }\n\n    /**\n     * Shared between increment/decrement: both have mostly the same logic\n     * (decrement just increments a negative value), but need their validation\n     * & use of non-ttl native methods split up.\n     */\n    protected function doIncrement(string $key, int $offset, int $initial, int $expire): int|false\n    {\n        $ttl = $this->ttl($expire);\n\n        $this->client->watch($key);\n\n        $value = $this->client->get($key);\n\n        if ($value === false) {\n            /*\n             * Negative ttl behavior isn't properly documented & doesn't always\n             * appear to treat the value as non-existing. Let's play safe and not\n             * even create the value (also saving a request)\n             */\n            if ($ttl < 0) {\n                return $initial;\n            }\n\n            // value is not yet set, store initial value!\n            $this->client->multi();\n            $this->client->set($key, $initial, $ttl);\n\n            /** @var bool[] $return */\n            $return = (array) $this->client->exec();\n\n            return !in_array(false, $return, true) ? $initial : false;\n        }\n\n        // can't increment if a non-numeric value is set\n        if (!is_numeric($value) || $value < 0) {\n            /*\n             * HHVM Redis only got unwatch recently.\n             * @see https://github.com/asgrim/hhvm/commit/bf5a259cece5df8a7617133c85043608d1ad5316\n             */\n            if (method_exists($this->client, 'unwatch')) {\n                $this->client->unwatch();\n            } else {\n                // this should also kill the watch...\n                $this->client->multi()->discard();\n            }\n\n            return false;\n        }\n\n        $value += $offset;\n        // value can never be lower than 0\n        $value = max(0, $value);\n\n        $this->client->multi();\n\n        /*\n         * Negative ttl behavior isn't properly documented & doesn't always\n         * appear to treat the value as non-existing. Let's play safe and just\n         * delete it right away!\n         */\n        if ($ttl < 0) {\n            $this->client->del($key);\n        } else {\n            $this->client->set($key, $value, $ttl);\n        }\n\n        /** @var bool[] $return */\n        $return = (array) $this->client->exec();\n\n        return !in_array(false, $return, true) ? $value : false;\n    }\n\n    /**\n     * Returns the version of the Redis server we're connecting to.\n     */\n    protected function getVersion(): string\n    {\n        if ($this->version === null) {\n            $info = $this->client->info();\n            $this->version = $info['redis_version'];\n        }\n\n        return $this->version;\n    }\n\n    /**\n     * Version-based check to test if passing an options array to set() is\n     * supported.\n     */\n    protected function supportsOptionsArray(): bool\n    {\n        return version_compare($this->getVersion(), '2.6.12') >= 0;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/SQL.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\SQL as Collection;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * SQL adapter. Basically just a wrapper over \\PDO, but in an exchangeable\n * (KeyValueStore) interface.\n *\n * This abstract class should be a \"fits all DB engines\" normalization. It's up\n * to extending classes to optimize for that specific engine.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nabstract class SQL implements KeyValueStore\n{\n    protected \\PDO $client;\n\n    protected string $table;\n\n    /**\n     * Create the database/indices if it does not already exist.\n     */\n    abstract protected function init();\n\n    public function __construct(\\PDO $client, string $table = 'cache')\n    {\n        $this->client = $client;\n        $this->table = $table;\n\n        // don't throw exceptions - it's ok to fail, as long as the return value\n        // reflects that!\n        $this->client->setAttribute(\\PDO::ATTR_ERRMODE, \\PDO::ERRMODE_SILENT);\n\n        // make sure the database exists (or just \"fail\" silently)\n        $this->init();\n\n        // now's a great time to clean up all expired items\n        $this->clearExpired();\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        $statement = $this->client->prepare(\n            \"SELECT v\n            FROM $this->table\n            WHERE k = :key AND (e IS NULL OR e > :expire)\"\n        );\n        $statement->execute([\n            ':key' => $key,\n            ':expire' => date('Y-m-d H:i:s'), // right now!\n        ]);\n\n        $result = $statement->fetch(\\PDO::FETCH_ASSOC);\n\n        if (!isset($result['v'])) {\n            $token = null;\n\n            return false;\n        }\n\n        $token = $result['v'];\n\n        return $this->unserialize($result['v']);\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        $tokens = [];\n        if (empty($keys)) {\n            return [];\n        }\n\n        // escape input, can't bind multiple params for IN()\n        $quoted = [];\n        foreach ($keys as $key) {\n            $quoted[] = $this->client->quote($key);\n        }\n\n        $statement = $this->client->prepare(\n            \"SELECT k, v\n            FROM $this->table\n            WHERE\n                k IN (\" . implode(',', $quoted) . ') AND\n                (e IS NULL OR e > :expire)'\n        );\n        $statement->execute([':expire' => date('Y-m-d H:i:s')]);\n        $values = $statement->fetchAll(\\PDO::FETCH_ASSOC);\n\n        $result = [];\n        foreach ($values as $value) {\n            $tokens[$value['k']] = $value['v'];\n            $result[$value['k']] = $this->unserialize($value['v']);\n        }\n\n        return $result;\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        // PostgreSQL doesn't have a decent UPSERT (like REPLACE or even INSERT\n        // ... ON DUPLICATE KEY UPDATE ...); here's a \"works for all\" downgrade\n        $success = $this->add($key, $value, $expire);\n        if ($success) {\n            return true;\n        }\n\n        $success = $this->replace($key, $value, $expire);\n        if ($success) {\n            return true;\n        }\n\n        return false;\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        $success = [];\n\n        // PostgreSQL's lack of a decent UPSERT is even worse for multiple\n        // values - we can only do them one at a time...\n        foreach ($items as $key => $value) {\n            // PHP treats numeric keys as integers, but they're allowed\n            $key = (string) $key;\n            $success[$key] = $this->set($key, $value, $expire);\n        }\n\n        return $success;\n    }\n\n    public function delete(string $key): bool\n    {\n        $statement = $this->client->prepare(\n            \"DELETE FROM $this->table\n            WHERE k = :key\"\n        );\n\n        $statement->execute([':key' => $key]);\n\n        return $statement->rowCount() === 1;\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        if (empty($keys)) {\n            return [];\n        }\n\n        // we'll need these to figure out which could not be deleted...\n        $items = $this->getMulti($keys);\n\n        // escape input, can't bind multiple params for IN()\n        $quoted = [];\n        foreach ($keys as $key) {\n            $quoted[] = $this->client->quote($key);\n        }\n\n        $statement = $this->client->query(\n            \"DELETE FROM $this->table\n            WHERE k IN (\" . implode(',', $quoted) . ')'\n        );\n\n        /*\n         * In case of connection problems, we may not have been able to delete\n         * any. Otherwise, we'll use the getMulti() results to figure out which\n         * couldn't be deleted because they didn't exist at that time.\n         */\n        $success = $statement->rowCount() !== 0;\n        $success = array_fill_keys($keys, $success);\n        foreach ($keys as $key) {\n            if (!array_key_exists($key, $items)) {\n                $success[$key] = false;\n            }\n        }\n\n        return $success;\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        $value = $this->serialize($value);\n        $expire = $this->expire($expire);\n\n        $this->clearExpired();\n\n        $statement = $this->client->prepare(\n            \"INSERT INTO $this->table (k, v, e)\n            VALUES (:key, :value, :expire)\"\n        );\n\n        $statement->execute([\n            ':key' => $key,\n            ':value' => $value,\n            ':expire' => $expire,\n        ]);\n\n        return $statement->rowCount() === 1;\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        $value = $this->serialize($value);\n        $expire = $this->expire($expire);\n\n        $this->clearExpired();\n\n        $statement = $this->client->prepare(\n            \"UPDATE $this->table\n            SET v = :value, e = :expire\n            WHERE k = :key\"\n        );\n\n        $statement->execute([\n            ':key' => $key,\n            ':value' => $value,\n            ':expire' => $expire,\n        ]);\n\n        if ($statement->rowCount() === 1) {\n            return true;\n        }\n\n        // if the value we've just replaced was the same as the replacement, as\n        // well as the same expiration time, rowCount will have been 0, but the\n        // operation was still a success\n        $statement = $this->client->prepare(\n            \"SELECT e\n            FROM $this->table\n            WHERE k = :key AND v = :value\"\n        );\n        $statement->execute([\n            ':key' => $key,\n            ':value' => $value,\n        ]);\n\n        return $statement->fetchColumn(0) === $expire;\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        $value = $this->serialize($value);\n        $expire = $this->expire($expire);\n\n        $this->clearExpired();\n\n        $statement = $this->client->prepare(\n            \"UPDATE $this->table\n            SET v = :value, e = :expire\n            WHERE k = :key AND v = :token\"\n        );\n\n        $statement->execute([\n            ':key' => $key,\n            ':value' => $value,\n            ':expire' => $expire,\n            ':token' => $token,\n        ]);\n\n        if ($statement->rowCount() === 1) {\n            return true;\n        }\n\n        // if the value we've just cas'ed was the same as the replacement, as\n        // well as the same expiration time, rowCount will have been 0, but the\n        // operation was still a success\n        $statement = $this->client->prepare(\n            \"SELECT e\n            FROM $this->table\n            WHERE k = :key AND v = :value AND v = :token\"\n        );\n        $statement->execute([\n            ':key' => $key,\n            ':value' => $value,\n            ':token' => $token,\n        ]);\n\n        return $statement->fetchColumn(0) === $expire;\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        return $this->doIncrement($key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        return $this->doIncrement($key, -$offset, $initial, $expire);\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        $expire = $this->expire($expire);\n\n        $this->clearExpired();\n\n        $statement = $this->client->prepare(\n            \"UPDATE $this->table\n            SET e = :expire\n            WHERE k = :key\"\n        );\n\n        $statement->execute([\n            ':key' => $key,\n            ':expire' => $expire,\n        ]);\n\n        return $statement->rowCount() === 1;\n    }\n\n    public function flush(): bool\n    {\n        // TRUNCATE doesn't work on SQLite - DELETE works for all\n        return $this->client->exec(\"DELETE FROM $this->table\") !== false;\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        return new Collection($this, $this->client, $this->table, $name);\n    }\n\n    /**\n     * Shared between increment/decrement: both have mostly the same logic\n     * (decrement just increments a negative value), but need their validation\n     * & use of non-ttl native methods split up.\n     */\n    protected function doIncrement(string $key, int $offset, int $initial, int $expire): int|false\n    {\n        /*\n         * I used to have all this logic in a huge & ugly query, but getting\n         * that right on multiple SQL engines proved challenging (SQLite doesn't\n         * do INSERT ... ON DUPLICATE KEY UPDATE ..., for example)\n         * I'll just stuff it in a transaction & leverage existing methods.\n         */\n        $this->client->beginTransaction();\n        $this->clearExpired();\n\n        $value = $this->get($key);\n        if ($value === false) {\n            $return = $this->add($key, $initial, $expire);\n\n            if ($return) {\n                $this->client->commit();\n\n                return $initial;\n            }\n        } elseif (is_numeric($value)) {\n            $value += $offset;\n            // < 0 is never possible\n            $value = max(0, $value);\n            $return = $this->replace($key, $value, $expire);\n\n            if ($return) {\n                $this->client->commit();\n\n                return (int) $value;\n            }\n        }\n\n        $this->client->rollBack();\n\n        return false;\n    }\n\n    /**\n     * Expired entries shouldn't keep filling up the database. Additionally,\n     * we will want to remove those in order to properly rely on INSERT (for\n     * add) and UPDATE (for replace), which assume a column exists or not, not\n     * taking the expiration status into consideration.\n     * An expired column should simply not exist.\n     */\n    protected function clearExpired(): void\n    {\n        $statement = $this->client->prepare(\n            \"DELETE FROM $this->table\n            WHERE e < :expire\"\n        );\n\n        $statement->execute([':expire' => date('Y-m-d H:i:s')]);\n    }\n\n    /**\n     * Transforms expiration times into TIMESTAMP (Y-m-d H:i:s) format, which DB\n     * will understand and be able to compare with other dates.\n     */\n    protected function expire(int $expire): string|null\n    {\n        if ($expire === 0) {\n            return null;\n        }\n\n        // relative time in seconds, <30 days\n        if ($expire < 30 * 24 * 60 * 60) {\n            $expire += time();\n        }\n\n        return date('Y-m-d H:i:s', $expire);\n    }\n\n    /**\n     * I originally didn't want to serialize numeric values because I planned\n     * on incrementing them in the DB, but revisited that idea.\n     * However, not serializing numbers still causes some small DB storage gains\n     * and it's safe (serialized data can never be confused for an int).\n     */\n    protected function serialize(mixed $value): string\n    {\n        return is_int($value) || is_float($value) ? (string) $value : serialize($value);\n    }\n\n    /**\n     * Numbers aren't serialized for storage size purposes.\n     */\n    protected function unserialize(mixed $value): mixed\n    {\n        if (is_numeric($value)) {\n            $int = (int) $value;\n            if ((string) $int === $value) {\n                return $int;\n            }\n\n            $float = (float) $value;\n            if ((string) $float === $value) {\n                return $float;\n            }\n\n            return $value;\n        }\n\n        return unserialize($value, ['allowed_classes' => true]);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Adapters/SQLite.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Adapters;\n\n/**\n * SQLite adapter. Basically just a wrapper over \\PDO, but in an exchangeable\n * (KeyValueStore) interface.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass SQLite extends MySQL\n{\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        if (empty($items)) {\n            return [];\n        }\n\n        $expire = $this->expire($expire);\n\n        $this->clearExpired();\n\n        // SQLite < 3.7.11 doesn't support multi-insert/replace!\n\n        $statement = $this->client->prepare(\n            \"REPLACE INTO $this->table (k, v, e)\n            VALUES (:key, :value, :expire)\"\n        );\n\n        $success = [];\n        foreach ($items as $key => $value) {\n            $value = $this->serialize($value);\n\n            $statement->execute([\n                ':key' => $key,\n                ':value' => $value,\n                ':expire' => $expire,\n            ]);\n\n            $success[$key] = (bool) $statement->rowCount();\n        }\n\n        return $success;\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        $value = $this->serialize($value);\n        $expire = $this->expire($expire);\n\n        $this->clearExpired();\n\n        // SQLite-specific way to ignore insert-on-duplicate errors\n        $statement = $this->client->prepare(\n            \"INSERT OR IGNORE INTO $this->table (k, v, e)\n            VALUES (:key, :value, :expire)\"\n        );\n\n        $statement->execute([\n            ':key' => $key,\n            ':value' => $value,\n            ':expire' => $expire,\n        ]);\n\n        return $statement->rowCount() === 1;\n    }\n\n    public function flush(): bool\n    {\n        return $this->client->exec(\"DELETE FROM $this->table\") !== false;\n    }\n\n    protected function init(): void\n    {\n        $this->client->exec(\n            \"CREATE TABLE IF NOT EXISTS $this->table (\n                k VARCHAR(255) NOT NULL PRIMARY KEY,\n                v BLOB,\n                e TIMESTAMP NULL DEFAULT NULL,\n                KEY e\n            )\"\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Buffered/BufferedStore.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Buffered;\n\nuse MatthiasMullie\\Scrapbook\\Buffered\\Utils\\Buffer;\nuse MatthiasMullie\\Scrapbook\\Buffered\\Utils\\Transaction;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * This class will serve as a local buffer to the real cache: anything read from\n * & written to the real cache will be stored in memory, so if any of those keys\n * is again requested in the same request, we can just grab it from memory\n * instead of having to get it over the wire.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass BufferedStore implements KeyValueStore\n{\n    /**\n     * Transaction will already buffer all writes (until the transaction\n     * has been committed/rolled back). As long as we immediately commit\n     * to real store, it'll look as if no transaction is in progress &\n     * all we'll be left with is the local copy of all data that can act\n     * as buffer for follow-up requests.\n     * All we'll need to add is also buffering non-write results.\n     */\n    protected Transaction $transaction;\n\n    /**\n     * Local in-memory storage, for the data we've already requested from\n     * or written to the real cache.\n     */\n    protected Buffer $local;\n\n    /**\n     * @var BufferedStore[]\n     */\n    protected array $collections = [];\n\n    /**\n     * @param KeyValueStore $cache The real cache we'll buffer for\n     */\n    public function __construct(KeyValueStore $cache)\n    {\n        $this->local = new Buffer();\n        $this->transaction = new Transaction($this->local, $cache);\n    }\n\n    /**\n     * In addition to all writes being stored to $local, we'll also\n     * keep get() values around ;).\n     *\n     * {@inheritdoc}\n     */\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        $value = $this->transaction->get($key, $token);\n\n        // only store if we managed to retrieve a value (valid token) and it's\n        // not already in cache (or we may mess up tokens)\n        if ($value !== false && $this->local->get($key, $localToken) === false && $localToken === null) {\n            $this->local->set($key, $value);\n        }\n\n        return $value;\n    }\n\n    /**\n     * In addition to all writes being stored to $local, we'll also\n     * keep get() values around ;).\n     *\n     * {@inheritdoc}\n     */\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        $values = $this->transaction->getMulti($keys, $tokens);\n\n        $missing = array_diff_key($values, $this->local->getMulti($keys));\n        if (!empty($missing)) {\n            $this->local->setMulti($missing);\n        }\n\n        return $values;\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        $result = $this->transaction->set($key, $value, $expire);\n        $this->transaction->commit();\n\n        return $result;\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        $result = $this->transaction->setMulti($items, $expire);\n        $this->transaction->commit();\n\n        return $result;\n    }\n\n    public function delete(string $key): bool\n    {\n        $result = $this->transaction->delete($key);\n        $this->transaction->commit();\n\n        return $result;\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        $result = $this->transaction->deleteMulti($keys);\n        $this->transaction->commit();\n\n        return $result;\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        $result = $this->transaction->add($key, $value, $expire);\n        $this->transaction->commit();\n\n        return $result;\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        $result = $this->transaction->replace($key, $value, $expire);\n        $this->transaction->commit();\n\n        return $result;\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        $result = $this->transaction->cas($token, $key, $value, $expire);\n        $this->transaction->commit();\n\n        return $result;\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        $result = $this->transaction->increment($key, $offset, $initial, $expire);\n        $this->transaction->commit();\n\n        return $result;\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        $result = $this->transaction->decrement($key, $offset, $initial, $expire);\n        $this->transaction->commit();\n\n        return $result;\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        $result = $this->transaction->touch($key, $expire);\n        $this->transaction->commit();\n\n        return $result;\n    }\n\n    public function flush(): bool\n    {\n        foreach ($this->collections as $collection) {\n            $collection->flush();\n        }\n\n        $result = $this->transaction->flush();\n        $this->transaction->commit();\n\n        return $result;\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        if (!isset($this->collections[$name])) {\n            $collection = $this->transaction->getCollection($name);\n            $this->collections[$name] = new static($collection);\n        }\n\n        return $this->collections[$name];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Buffered/TransactionalStore.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Buffered;\n\nuse MatthiasMullie\\Scrapbook\\Buffered\\Utils\\Buffer;\nuse MatthiasMullie\\Scrapbook\\Buffered\\Utils\\Transaction;\nuse MatthiasMullie\\Scrapbook\\Exception\\UnbegunTransaction;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * In addition to buffering cache data in memory (see BufferedStore), this class\n * will add transactional capabilities. Writes can be deferred by starting a\n * transaction & all of them will only go out when you commit them.\n * This makes it possible to defer cache updates until we can guarantee it's\n * safe (e.g. until we successfully committed everything to persistent storage).\n *\n * There will be some trickery to make sure that, after we've made changes to\n * cache (but not yet committed), we don't read from the real cache anymore, but\n * instead serve the in-memory equivalent that we'll be writing to real cache\n * when all goes well.\n *\n * If a commit fails, all keys affected will be deleted to ensure no corrupt\n * data stays behind.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass TransactionalStore implements KeyValueStore\n{\n    /**\n     * Array of KeyValueStore objects. Every cache action will be executed\n     * on the last item in this array, so transactions can be nested.\n     *\n     * @var KeyValueStore[]\n     */\n    protected array $transactions = [];\n\n    /**\n     * @param KeyValueStore $cache The real cache we'll buffer for\n     */\n    public function __construct(KeyValueStore $cache)\n    {\n        $this->transactions[] = $cache;\n    }\n\n    /**\n     * Roll back uncommitted transactions.\n     */\n    public function __destruct()\n    {\n        while (count($this->transactions) > 1) {\n            /** @var Transaction $transaction */\n            $transaction = array_pop($this->transactions);\n            $transaction->rollback();\n        }\n    }\n\n    /**\n     * Initiate a transaction: this will defer all writes to real cache until\n     * commit() is called.\n     */\n    public function begin(): void\n    {\n        // we'll rely on buffer to respond data that has not yet committed, so\n        // it must never evict from cache - I'd even rather see the app crash\n        $buffer = new Buffer(ini_get('memory_limit'));\n\n        // transactions can be nested: the previous transaction will serve as\n        // cache backend for the new cache (so when committing a nested\n        // transaction, it will commit to the parent transaction)\n        $cache = end($this->transactions);\n        $this->transactions[] = new Transaction($buffer, $cache);\n    }\n\n    /**\n     * Commits all deferred updates to real cache.\n     * If the any write fails, all subsequent writes will be aborted & all keys\n     * that had already been written to will be deleted.\n     *\n     * @throws UnbegunTransaction\n     */\n    public function commit(): bool\n    {\n        if (count($this->transactions) <= 1) {\n            throw new UnbegunTransaction('Attempted to commit without having begun a transaction.');\n        }\n\n        /** @var Transaction $transaction */\n        $transaction = array_pop($this->transactions);\n\n        return $transaction->commit();\n    }\n\n    /**\n     * Roll back all scheduled changes.\n     *\n     * @throws UnbegunTransaction\n     */\n    public function rollback(): bool\n    {\n        if (count($this->transactions) <= 1) {\n            throw new UnbegunTransaction('Attempted to rollback without having begun a transaction.');\n        }\n\n        /** @var Transaction $transaction */\n        $transaction = array_pop($this->transactions);\n\n        return $transaction->rollback();\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        return end($this->transactions)->get($key, $token);\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        return end($this->transactions)->getMulti($keys, $tokens);\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        return end($this->transactions)->set($key, $value, $expire);\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        return end($this->transactions)->setMulti($items, $expire);\n    }\n\n    public function delete(string $key): bool\n    {\n        return end($this->transactions)->delete($key);\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        return end($this->transactions)->deleteMulti($keys);\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        return end($this->transactions)->add($key, $value, $expire);\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        return end($this->transactions)->replace($key, $value, $expire);\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        return end($this->transactions)->cas($token, $key, $value, $expire);\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        return end($this->transactions)->increment($key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        return end($this->transactions)->decrement($key, $offset, $initial, $expire);\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        return end($this->transactions)->touch($key, $expire);\n    }\n\n    public function flush(): bool\n    {\n        return end($this->transactions)->flush();\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        return new static(end($this->transactions)->getCollection($name));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Buffered/Utils/Buffer.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Buffered\\Utils;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\MemoryStore;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * This is a helper class for BufferedStore & TransactionalStore, which buffer\n * real cache requests in memory.\n * The memory-part can easily be handled by MemoryStore. There's just 1 gotcha:\n * when an item is to be deleted (but not yet committed), it needs to be deleted\n * from the MemoryStore too, but we need to be able to make a distinction\n * between \"this is deleted\" and \"this value is not known in this memory cache,\n * fall back to real cache\".\n *\n * This is where this class comes in to play: we'll add an additional \"expired\"\n * method, which allows BufferedStore to just expire the keys that are supposed\n * to be deleted (instead of deleting them) - then we can keep track of when\n * a key is just not known, or known-but-deleted (=expired)\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Buffer extends MemoryStore\n{\n    /**\n     * Checks if a value exists in cache and is not yet expired.\n     * Contrary to default MemoryStore, expired items must *not* be deleted\n     * from memory: we need to remember that they were expired, so we don't\n     * reach out to real cache (only to get nothing, since it's expired...).\n     */\n    protected function exists(string $key): bool\n    {\n        if (!array_key_exists($key, $this->items)) {\n            // key not in cache\n            return false;\n        }\n\n        $expire = $this->items[$key][1];\n        if ($expire !== 0 && $expire < time()) {\n            // not permanent & already expired\n            return false;\n        }\n\n        $this->lru($key);\n\n        return true;\n    }\n\n    /**\n     * Check if a key existed in local storage, but is now expired.\n     *\n     * Because our local buffer is also just a real cache, expired items will\n     * just return nothing, which will lead us to believe no such item exists in\n     * that local cache, and we'll reach out to the real cache (where the value\n     * may not yet have been expired because that may have been part of an\n     * uncommitted write)\n     * So we'll want to know when a value is in local cache, but expired!\n     */\n    public function expired(string $key): bool\n    {\n        if ($this->get($key) !== false) {\n            // returned a value, clearly not yet expired\n            return false;\n        }\n\n        // a known item, not returned by get, is expired\n        return array_key_exists($key, $this->items);\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        return new BufferCollection($this, $name);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Buffered/Utils/BufferCollection.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Buffered\\Utils;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\MemoryStore as MemoryStoreCollection;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * A collection implementation for Buffer.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass BufferCollection extends MemoryStoreCollection\n{\n    /**\n     * @var Buffer\n     */\n    protected KeyValueStore $cache;\n\n    public function __construct(Buffer $cache, string $name)\n    {\n        parent::__construct($cache, $name);\n    }\n\n    /**\n     * Check if a key existed in local storage, but is now expired.\n     *\n     * Because our local buffer is also just a real cache, expired items will\n     * just return nothing, which will lead us to believe no such item exists in\n     * that local cache, and we'll reach out to the real cache (where the value\n     * may not yet have been expired because that may have been part of an\n     * uncommitted write)\n     * So we'll want to know when a value is in local cache, but expired!\n     */\n    public function expired(string $key): bool\n    {\n        if ($this->get($key) !== false) {\n            // returned a value, clearly not yet expired\n            return false;\n        }\n\n        // a known item, not returned by get, is expired\n        return array_key_exists($key, $this->cache->items);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Buffered/Utils/Defer.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Buffered\\Utils;\n\nuse MatthiasMullie\\Scrapbook\\Exception\\UncommittedTransaction;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * This is a helper class for transactions. It will optimize the write going\n * out and take care of rolling back.\n *\n * Optimizations will be:\n * * multiple set() values (with the same expiration) will be applied in a\n *   single setMulti()\n * * for a set() followed by another set() on the same key, only the latter\n *   one will be applied\n * * same for an replace() followed by an increment(), or whatever operation\n *   happens on the same key: if we can pre-calculate the end result, we'll\n *   only execute 1 operation with the end result\n * * operations before a flush() will not be executed, they'll just be lost\n *\n * Rollback strategy includes:\n * * fetching the original value of operations prone to fail (add, replace &\n *   cas) prior to executing them\n * * executing said operations before the others, to minimize changes of\n *   interfering concurrent writes\n * * if the commit fails, said original values will be restored in case the\n *   new value had already been stored\n *\n * This class must never receive invalid data. E.g. a \"replace\" can never\n * follow a \"delete\" of the same key. This should be guaranteed by whatever\n * uses this class: there is no point in re-implementing these checks here.\n * The only acceptable conflicts are when cache values have changed outside,\n * from another process. Those will be handled by this class.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Defer\n{\n    /**\n     * Cache to write to.\n     */\n    protected KeyValueStore $cache;\n\n    /**\n     * All updates will be scheduled by key. If there are multiple updates\n     * for a key, they can just be folded together.\n     * E.g. 2 sets, the later will override the former.\n     * E.g. set + increment, might as well set incremented value immediately.\n     *\n     * This is going to be an array that holds horrible arrays of update data,\n     * being:\n     * * 0: the operation name (set, add, ...) so we're able to sort them\n     * * 1: a callable, to apply the update to cache\n     * * 2: the array of data to supply to the callable\n     *\n     * @var array[]\n     */\n    protected array $keys = [];\n\n    /**\n     * Flush is special - it's not specific to (a) key(s), so we can't store\n     * it to $keys.\n     */\n    protected bool $flush = false;\n\n    public function __construct(KeyValueStore $cache)\n    {\n        $this->cache = $cache;\n    }\n\n    /**\n     * @throws UncommittedTransaction\n     */\n    public function __destruct()\n    {\n        if (!empty($this->keys)) {\n            throw new UncommittedTransaction('Transaction is about to be destroyed without having been committed or rolled back.');\n        }\n    }\n\n    public function set(string $key, mixed $value, int $expire): void\n    {\n        $args = [\n            'key' => $key,\n            'value' => $value,\n            'expire' => $expire,\n        ];\n        $this->keys[$key] = [__FUNCTION__, [$this->cache, __FUNCTION__], $args];\n    }\n\n    public function setMulti(array $items, int $expire): void\n    {\n        foreach ($items as $key => $value) {\n            // PHP treats numeric keys as integers, but they're allowed\n            $key = (string) $key;\n            $this->set($key, $value, $expire);\n        }\n    }\n\n    public function delete(string $key): void\n    {\n        $args = ['key' => $key];\n        $this->keys[$key] = [__FUNCTION__, [$this->cache, __FUNCTION__], $args];\n    }\n\n    /**\n     * @param string[] $keys\n     */\n    public function deleteMulti(array $keys): void\n    {\n        foreach ($keys as $key) {\n            $this->delete($key);\n        }\n    }\n\n    public function add(string $key, mixed $value, int $expire): void\n    {\n        $args = [\n            'key' => $key,\n            'value' => $value,\n            'expire' => $expire,\n        ];\n        $this->keys[$key] = [__FUNCTION__, [$this->cache, __FUNCTION__], $args];\n    }\n\n    public function replace(string $key, mixed $value, int $expire): void\n    {\n        $args = [\n            'key' => $key,\n            'value' => $value,\n            'expire' => $expire,\n        ];\n        $this->keys[$key] = [__FUNCTION__, [$this->cache, __FUNCTION__], $args];\n    }\n\n    /**\n     * @param mixed $originalValue No real CAS token, but the original value for this key\n     */\n    public function cas(mixed $originalValue, string $key, mixed $value, int $expire): void\n    {\n        /*\n         * If we made it here, we're sure that logically, the CAS applies with\n         * respect to other operations in this transaction. That means we don't\n         * have to verify the token here: whatever has already been set/add/\n         * replace/cas will have taken care of that and we already know this one\n         * applies on top op that change. We can just fold it in there & update\n         * the value we set initially.\n         */\n        if (isset($this->keys[$key]) && in_array($this->keys[$key][0], ['set', 'add', 'replace', 'cas'])) {\n            $this->keys[$key][2]['value'] = $value;\n            $this->keys[$key][2]['expire'] = $expire;\n\n            return;\n        }\n\n        $cache = $this->cache;\n        $callback = static function (mixed $originalValue, string $key, mixed $value, int $expire) use ($cache): bool {\n            // check if given (local) CAS token was known\n            if ($originalValue === null) {\n                return false;\n            }\n\n            // fetch data from real cache, getting new valid CAS token\n            $current = $cache->get($key, $token);\n\n            // check if the value we just read from real cache is still the same\n            // as the one we saved when doing the original fetch\n            if (serialize($current) === $originalValue) {\n                // everything still checked out, CAS the value for real now\n                return $cache->cas($token, $key, $value, $expire);\n            }\n\n            return false;\n        };\n\n        $args = [\n            'originalValue' => $originalValue,\n            'key' => $key,\n            'value' => $value,\n            'expire' => $expire,\n        ];\n        $this->keys[$key] = [__FUNCTION__, $callback, $args];\n    }\n\n    public function increment(string $key, int $offset, int $initial, int $expire): void\n    {\n        $this->doIncrement(__FUNCTION__, $key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset, int $initial, int $expire): void\n    {\n        $this->doIncrement(__FUNCTION__, $key, $offset, $initial, $expire);\n    }\n\n    protected function doIncrement(string $operation, string $key, int $offset, int $initial, int $expire): void\n    {\n        if (isset($this->keys[$key])) {\n            if (in_array($this->keys[$key][0], ['set', 'add', 'replace', 'cas'])) {\n                // we're trying to increment a key that's only just being stored\n                // in this transaction - might as well combine those\n                $symbol = $this->keys[$key][1] === 'increment' ? 1 : -1;\n                $this->keys[$key][2]['value'] += $symbol * $offset;\n                $this->keys[$key][2]['expire'] = $expire;\n            } elseif (in_array($this->keys[$key][0], ['increment', 'decrement'])) {\n                // we're trying to increment a key that's already being incremented\n                // or decremented in this transaction - might as well combine those\n\n                // we may be combining an increment with a decrement\n                // we must carefully figure out how these 2 apply against each other\n                $symbol = $this->keys[$key][0] === 'increment' ? 1 : -1;\n                $previous = $symbol * $this->keys[$key][2]['offset'];\n\n                $symbol = $operation === 'increment' ? 1 : -1;\n                $current = $symbol * $offset;\n\n                $offset = (int) ($previous + $current);\n\n                $this->keys[$key][2]['offset'] = abs($offset);\n                // initial value must also be adjusted to include the new offset\n                $this->keys[$key][2]['initial'] += $current;\n                $this->keys[$key][2]['expire'] = $expire;\n\n                // adjust operation - it might just have switched from increment to\n                // decrement or vice versa\n                $operation = $offset >= 0 ? 'increment' : 'decrement';\n                $this->keys[$key][0] = $operation;\n                $this->keys[$key][1] = [$this->cache, $operation];\n            } else {\n                // touch & delete become useless if incrementing/decrementing after\n                unset($this->keys[$key]);\n            }\n        }\n\n        if (!isset($this->keys[$key])) {\n            $args = [\n                'key' => $key,\n                'offset' => $offset,\n                'initial' => $initial,\n                'expire' => $expire,\n            ];\n            $this->keys[$key] = [$operation, [$this->cache, $operation], $args];\n        }\n    }\n\n    public function touch(string $key, int $expire): void\n    {\n        if (isset($this->keys[$key][2]['expire'])) {\n            // changing expiration time of a value we're already storing in\n            // this transaction - might as well just set new expiration time\n            // right away\n            $this->keys[$key][2]['expire'] = $expire;\n        } else {\n            $args = [\n                'key' => $key,\n                'expire' => $expire,\n            ];\n            $this->keys[$key] = [__FUNCTION__, [$this->cache, __FUNCTION__], $args];\n        }\n    }\n\n    public function flush(): void\n    {\n        // clear all scheduled updates, they'll be wiped out after this anyway\n        $this->keys = [];\n        $this->flush = true;\n    }\n\n    /**\n     * Clears all scheduled writes.\n     */\n    public function clear(): void\n    {\n        $this->keys = [];\n        $this->flush = false;\n    }\n\n    /**\n     * Commit all deferred writes to cache.\n     *\n     * When the commit fails, no changes in this transaction will be applied\n     * (and those that had already been applied will be undone). False will\n     * be returned in that case.\n     */\n    public function commit(): bool\n    {\n        [$old, $new] = $this->generateRollback();\n        $updates = $this->generateUpdates();\n        $updates = $this->combineUpdates($updates);\n        usort($updates, [$this, 'sortUpdates']);\n\n        foreach ($updates as $update) {\n            // apply update to cache & receive a simple bool to indicate\n            // success (true) or failure (false)\n            [, $callback, $args] = $update;\n            $success = call_user_func_array($callback, $args);\n            if ($success === false) {\n                $this->rollback($old, $new);\n\n                return false;\n            }\n        }\n\n        $this->clear();\n\n        return true;\n    }\n\n    /**\n     * Roll the cache back to pre-transaction state by comparing the current\n     * cache values with what we planned to set them to.\n     */\n    protected function rollback(array $old, array $new): void\n    {\n        foreach ($old as $key => $value) {\n            $current = $this->cache->get($key, $token);\n\n            /*\n             * If the value right now equals the one we planned to write, it\n             * should be restored to what it was before. If it's yet something\n             * else, another process must've stored it and we should leave it\n             * alone.\n             */\n            if ($current === $new) {\n                /*\n                 * CAS the rollback. If it fails, that means another process\n                 * has stored in the meantime and we can just leave it alone.\n                 * Note that we can't know the original expiration time!\n                 */\n                $this->cas($token, $key, $value, 0);\n            }\n        }\n\n        $this->clear();\n    }\n\n    /**\n     * Since we can't perform true atomic transactions, we'll fake it.\n     * Most of the operations (set, touch, ...) can't fail. We'll do those last.\n     * We'll first schedule the operations that can fail (cas, replace, add)\n     * to minimize chances of another process overwriting those values in the\n     * meantime.\n     * But it could still happen, so we should fetch the current values for all\n     * unsafe operations. If the transaction fails, we can then restore them.\n     *\n     * @return array[] Array of 2 [key => value] maps: current & scheduled data\n     */\n    protected function generateRollback(): array\n    {\n        $keys = [];\n        $new = [];\n\n        foreach ($this->keys as $key => $data) {\n            $operation = $data[0];\n\n            // we only need values for cas & replace - recovering from an 'add'\n            // is just deleting the value...\n            if (in_array($operation, ['cas', 'replace'])) {\n                $keys[] = $key;\n                $new[$key] = $data[2]['value'];\n            }\n        }\n\n        if (empty($keys)) {\n            return [[], []];\n        }\n\n        // fetch the existing data & return the planned new data as well\n        $current = $this->cache->getMulti($keys);\n\n        return [$current, $new];\n    }\n\n    /**\n     * By storing all updates by key, we've already made sure we don't perform\n     * redundant operations on a per-key basis. Now we'll turn those into\n     * actual updates.\n     */\n    protected function generateUpdates(): array\n    {\n        $updates = [];\n\n        if ($this->flush) {\n            $updates[] = ['flush', [$this->cache, 'flush'], []];\n        }\n\n        foreach ($this->keys as $data) {\n            $updates[] = $data;\n        }\n\n        return $updates;\n    }\n\n    /**\n     * We may have multiple sets & deletes, which can be combined into a single\n     * setMulti or deleteMulti operation.\n     */\n    protected function combineUpdates(array $updates): array\n    {\n        $setMulti = [];\n        $deleteMulti = [];\n\n        foreach ($updates as $i => $update) {\n            [$operation, , $args] = $update;\n\n            switch ($operation) {\n                // all set & delete operations can be grouped into setMulti & deleteMulti\n                case 'set':\n                    unset($updates[$i]);\n\n                    // only group sets with same expiration\n                    $setMulti[$args['expire']][$args['key']] = $args['value'];\n                    break;\n                case 'delete':\n                    unset($updates[$i]);\n\n                    $deleteMulti[] = $args['key'];\n                    break;\n                default:\n                    break;\n            }\n        }\n\n        if (!empty($setMulti)) {\n            $cache = $this->cache;\n\n            /*\n             * We'll use the return value of all deferred writes to check if they\n             * should be rolled back.\n             * commit() expects a single bool, not a per-key array of success bools.\n             */\n            $callback = static function (array $items, int $expire) use ($cache): bool {\n                $success = $cache->setMulti($items, $expire);\n\n                return !in_array(false, $success, true);\n            };\n\n            foreach ($setMulti as $expire => $items) {\n                $updates[] = ['setMulti', $callback, [$items, $expire]];\n            }\n        }\n\n        if (!empty($deleteMulti)) {\n            $cache = $this->cache;\n\n            /*\n             * commit() expected a single bool, not an array of success bools.\n             * Besides, deleteMulti() is never cause for failure here: if the\n             * key didn't exist because it has been deleted elsewhere already,\n             * the data isn't corrupt, it's still as we'd expect it.\n             */\n            $callback = static function (array $keys) use ($cache): bool {\n                $cache->deleteMulti($keys);\n\n                return true;\n            };\n\n            $updates[] = ['deleteMulti', $callback, [$deleteMulti]];\n        }\n\n        return $updates;\n    }\n\n    /**\n     * Change the order of the updates in this transaction to ensure we have those\n     * most likely to fail first. That'll decrease odds of having to roll back, and\n     * make rolling back easier.\n     *\n     * @param array $a Update, where index 0 is the operation name\n     * @param array $b Update, where index 0 is the operation name\n     */\n    protected function sortUpdates(array $a, array $b): int\n    {\n        $updateOrder = [\n            // there's no point in applying this after doing the below updates\n            // we also shouldn't really worry about cas/replace failing after this,\n            // there won't be any after cache having been flushed\n            'flush',\n\n            // prone to fail: they depend on certain conditions (token must match\n            // or value must (not) exist)\n            'cas',\n            'replace',\n            'add',\n\n            // unlikely/impossible to fail, assuming the input is valid\n            'touch',\n            'increment',\n            'decrement',\n            'set', 'setMulti',\n            'delete', 'deleteMulti',\n        ];\n\n        if ($a[0] === $b[0]) {\n            return 0;\n        }\n\n        return array_search($a[0], $updateOrder, true) < array_search($b[0], $updateOrder, true) ? -1 : 1;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Buffered/Utils/Transaction.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Buffered\\Utils;\n\nuse MatthiasMullie\\Scrapbook\\Adapters\\Collections\\MemoryStore as BufferCollection;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * This is a helper class for BufferedStore & TransactionalStore, which buffer\n * real cache requests in memory.\n *\n * This class accepts 2 caches: a KeyValueStore object (the real cache) and a\n * Buffer instance (to read data from as long as it hasn't been committed)\n *\n * Every write action will first store the data in the Buffer instance, and\n * then pas update along to $defer.\n * Once commit() is called, $defer will execute all these updates against the\n * real cache. All deferred writes that fail to apply will cause that cache key\n * to be deleted, to ensure cache consistency.\n * Until commit() is called, all data is read from the temporary Buffer instance.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Transaction implements KeyValueStore\n{\n    protected KeyValueStore $cache;\n\n    protected Buffer|BufferCollection $local;\n\n    /**\n     * We'll return stub CAS tokens in order to reliably replay the CAS actions\n     * to the real cache. This will hold a map of stub token => value, used to\n     * verify when we do the actual CAS.\n     *\n     * @see cas()\n     */\n    protected array $tokens = [];\n\n    /**\n     * Deferred updates to be committed to real cache.\n     */\n    protected Defer $defer;\n\n    /**\n     * Suspend reads from real cache. This is used when a flush is issued but it\n     * has not yet been committed. In that case, we don't want to fall back to\n     * real cache values, because they're about to be flushed.\n     */\n    protected bool $suspend = false;\n\n    /**\n     * @var Transaction[]\n     */\n    protected array $collections = [];\n\n    public function __construct(Buffer|BufferCollection $local, KeyValueStore $cache)\n    {\n        $this->cache = $cache;\n\n        // (uncommitted) writes must never be evicted (even if that means\n        // crashing because we run out of memory)\n        $this->local = $local;\n\n        $this->defer = new Defer($this->cache);\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        $value = $this->local->get($key, $token);\n\n        // short-circuit reading from real cache if we have an uncommitted flush\n        if ($this->suspend && $token === null) {\n            // flush hasn't been committed yet, don't read from real cache!\n            return false;\n        }\n\n        if ($value === false) {\n            if ($this->local->expired($key)) {\n                /*\n                 * Item used to exist in local cache, but is now expired. This\n                 * is used when values are to be deleted: we don't want to reach\n                 * out to real storage because that would respond with the not-\n                 * yet-deleted value.\n                 */\n\n                return false;\n            }\n\n            // unknown in local cache = fetch from source cache\n            $value = $this->cache->get($key, $token);\n        }\n\n        // no value = quit early, don't generate a useless token\n        if ($value === false) {\n            return false;\n        }\n\n        /*\n         * $token will be unreliable to the deferred updates so generate\n         * a custom one and keep the associated value around.\n         * Read more details in PHPDoc for function cas().\n         * uniqid is ok here. Doesn't really have to be unique across\n         * servers, just has to be unique every time it's called in this\n         * one particular request - which it is.\n         */\n        $token = uniqid('', false);\n        $this->tokens[$token] = serialize($value);\n\n        return $value;\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        // retrieve all that we can from local cache\n        $values = $this->local->getMulti($keys);\n        $tokens = [];\n\n        // short-circuit reading from real cache if we have an uncommitted flush\n        if (!$this->suspend) {\n            // figure out which missing key we need to get from real cache\n            $keys = array_diff($keys, array_keys($values));\n            foreach ($keys as $i => $key) {\n                // don't reach out to real cache for keys that are about to be gone\n                if ($this->local->expired($key)) {\n                    unset($keys[$i]);\n                }\n            }\n\n            // fetch missing values from real cache\n            if ($keys) {\n                $missing = $this->cache->getMulti($keys);\n                $values += $missing;\n            }\n        }\n\n        // any tokens we get will be unreliable, so generate some replacements\n        // (more elaborate explanation in get())\n        foreach ($values as $key => $value) {\n            $token = uniqid('', false);\n            $tokens[$key] = $token;\n            $this->tokens[$token] = serialize($value);\n        }\n\n        return $values;\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        // store the value in memory, so that when we ask for it again later in\n        // this same request, we get the value we just set\n        $success = $this->local->set($key, $value, $expire);\n        if ($success === false) {\n            return false;\n        }\n\n        $this->defer->set($key, $value, $expire);\n\n        return true;\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        // store the values in memory, so that when we ask for it again later in\n        // this same request, we get the value we just set\n        $success = $this->local->setMulti($items, $expire);\n\n        // only attempt to store those that we've set successfully to local\n        $successful = array_intersect_key($items, $success);\n        if (!empty($successful)) {\n            $this->defer->setMulti($successful, $expire);\n        }\n\n        return $success;\n    }\n\n    public function delete(string $key): bool\n    {\n        // check the current value to see if it currently exists, so we can\n        // properly return true/false as would be expected from KeyValueStore\n        $value = $this->get($key);\n        if ($value === false) {\n            return false;\n        }\n\n        /*\n         * To make sure that subsequent get() calls for this key don't return\n         * a value (it's supposed to be deleted), we'll make it expired in our\n         * temporary bag (as opposed to deleting it from out bag, in which case\n         * we'd fall back to fetching it from real store, where the transaction\n         * might not yet be committed)\n         */\n        $this->local->set($key, true, -1);\n\n        $this->defer->delete($key);\n\n        return true;\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        // check the current values to see if they currently exists, so we can\n        // properly return true/false as would be expected from KeyValueStore\n        $items = $this->getMulti($keys);\n        $success = [];\n        foreach ($keys as $key) {\n            $success[$key] = array_key_exists($key, $items);\n        }\n\n        // only attempt to store those that we've deleted successfully to local\n        $values = array_intersect_key($success, array_flip($keys));\n        if (empty($values)) {\n            return [];\n        }\n\n        // mark all as expired in local cache (see comment in delete())\n        $this->local->setMulti($values, -1);\n\n        $this->defer->deleteMulti(array_keys($values));\n\n        return $success;\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        // before adding, make sure the value doesn't yet exist (in real cache,\n        // nor in memory)\n        if ($this->get($key) !== false) {\n            return false;\n        }\n\n        // store the value in memory, so that when we ask for it again later\n        // in this same request, we get the value we just set\n        $success = $this->local->set($key, $value, $expire);\n        if ($success === false) {\n            return false;\n        }\n\n        $this->defer->add($key, $value, $expire);\n\n        return true;\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        // before replacing, make sure the value actually exists (in real cache,\n        // or already created in memory)\n        if ($this->get($key) === false) {\n            return false;\n        }\n\n        // store the value in memory, so that when we ask for it again later\n        // in this same request, we get the value we just set\n        $success = $this->local->set($key, $value, $expire);\n        if ($success === false) {\n            return false;\n        }\n\n        $this->defer->replace($key, $value, $expire);\n\n        return true;\n    }\n\n    /**\n     * Since our CAS is deferred, the CAS token we got from our original\n     * get() will likely not be valid by the time we want to store it to\n     * the real cache. Imagine this scenario:\n     * * a value is fetched from (real) cache\n     * * an new value key is CAS'ed (into temp cache - real CAS is deferred)\n     * * this key's value is fetched again (this time from temp cache)\n     * * and a new value is CAS'ed again (into temp cache...).\n     *\n     * In this scenario, when we finally want to replay the write actions\n     * onto the real cache, the first 3 actions would likely work fine.\n     * The last (second CAS) however would not, since it never got a real\n     * updated $token from the real cache.\n     *\n     * To work around this problem, all get() calls will return a unique\n     * CAS token and store the value-at-that-time associated with that\n     * token. All we have to do when we want to write the data to real cache\n     * is, right before was CAS for real, get the value & (real) cas token\n     * from storage & compare that value to the one we had stored. If that\n     * checks out, we can safely resume the CAS with the real token we just\n     * received.\n     *\n     * {@inheritdoc}\n     */\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        $originalValue = $this->tokens[$token] ?? null;\n\n        // value is no longer the same as what we used for token\n        if (serialize($this->get($key)) !== $originalValue) {\n            return false;\n        }\n\n        // \"CAS\" value to local cache/memory\n        $success = $this->local->set($key, $value, $expire);\n        if ($success === false) {\n            return false;\n        }\n\n        // only schedule the CAS to be performed on real cache if it was OK on\n        // local cache\n        $this->defer->cas($originalValue, $key, $value, $expire);\n\n        return true;\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        // get existing value (from real cache or memory) so we know what to\n        // increment in memory (where we may not have anything yet, so we should\n        // adjust our initial value to what's already in real cache)\n        $value = $this->get($key);\n        if ($value === false) {\n            $value = $initial - $offset;\n        }\n\n        if (!is_numeric($value) || !is_numeric($offset)) {\n            return false;\n        }\n\n        // store the value in memory, so that when we ask for it again later\n        // in this same request, we get the value we just set\n        $value = max(0, $value + $offset);\n        $success = $this->local->set($key, $value, $expire);\n        if ($success === false) {\n            return false;\n        }\n\n        $this->defer->increment($key, $offset, $initial, $expire);\n\n        return $value;\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        if ($offset <= 0 || $initial < 0) {\n            return false;\n        }\n\n        // get existing value (from real cache or memory) so we know what to\n        // increment in memory (where we may not have anything yet, so we should\n        // adjust our initial value to what's already in real cache)\n        $value = $this->get($key);\n        if ($value === false) {\n            $value = $initial + $offset;\n        }\n\n        if (!is_numeric($value) || !is_numeric($offset)) {\n            return false;\n        }\n\n        // store the value in memory, so that when we ask for it again later\n        // in this same request, we get the value we just set\n        $value = max(0, $value - $offset);\n        $success = $this->local->set($key, $value, $expire);\n        if ($success === false) {\n            return false;\n        }\n\n        $this->defer->decrement($key, $offset, $initial, $expire);\n\n        return $value;\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        // grab existing value (from real cache or memory) and re-save (to\n        // memory) with updated expiration time\n        $value = $this->get($key);\n        if ($value === false) {\n            return false;\n        }\n\n        $success = $this->local->set($key, true, $expire);\n        if ($success === false) {\n            return false;\n        }\n\n        $this->defer->touch($key, $expire);\n\n        return true;\n    }\n\n    public function flush(): bool\n    {\n        foreach ($this->collections as $collection) {\n            $collection->flush();\n        }\n\n        $success = $this->local->flush();\n        if ($success === false) {\n            return false;\n        }\n\n        // clear all buffered writes, flush wipes them out anyway\n        $this->clear();\n\n        // make sure that reads, from now on until commit, don't read from cache\n        $this->suspend = true;\n\n        $this->defer->flush();\n\n        return true;\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        if (!isset($this->collections[$name])) {\n            /** @var BufferCollection $local */\n            $local = $this->local->getCollection($name);\n            $cache = $this->cache->getCollection($name);\n            $this->collections[$name] = new static($local, $cache);\n        }\n\n        return $this->collections[$name];\n    }\n\n    /**\n     * Commits all deferred updates to real cache.\n     * that had already been written to will be deleted.\n     */\n    public function commit(): bool\n    {\n        $this->clear();\n\n        return $this->defer->commit();\n    }\n\n    /**\n     * Roll back all scheduled changes.\n     */\n    public function rollback(): bool\n    {\n        $this->clear();\n        $this->defer->clear();\n\n        return true;\n    }\n\n    /**\n     * Clears all transaction-related data stored in memory.\n     */\n    protected function clear(): void\n    {\n        $this->tokens = [];\n        $this->suspend = false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Exception/Exception.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Exception;\n\n/**\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Exception extends \\Exception\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Exception/InvalidCollection.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Exception;\n\n/**\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass InvalidCollection extends Exception\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Exception/InvalidKey.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Exception;\n\n/**\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass InvalidKey extends Exception\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Exception/OperationFailed.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Exception;\n\n/**\n * @author Martin Georgiev <martin.georgiev@gmail.com>\n * @copyright Copyright (c) 2017, Martin Georgiev. All rights reserved\n * @license LICENSE MIT\n */\nclass OperationFailed extends Exception\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Exception/UnbegunTransaction.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Exception;\n\n/**\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass UnbegunTransaction extends Exception\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Exception/UncommittedTransaction.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Exception;\n\n/**\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass UncommittedTransaction extends Exception\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/KeyValueStore.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook;\n\n/**\n * Interface for key-value storage engines.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\ninterface KeyValueStore\n{\n    /**\n     * Retrieves an item from the cache.\n     *\n     * Optionally, an 2nd variable can be passed to this function. It will be\n     * filled with a value that can be used for cas()\n     *\n     * @param mixed $token Will be filled with the CAS token\n     *\n     * @return mixed|bool Value, or false on failure\n     */\n    public function get(string $key, mixed &$token = null): mixed;\n\n    /**\n     * Retrieves multiple items at once.\n     *\n     * Return value will be an associative array in [key => value] format. Keys\n     * missing in cache will be omitted from the array.\n     *\n     * Optionally, an 2nd variable can be passed to this function. It will be\n     * filled with values that can be used for cas(), in an associative array in\n     * [key => token] format. Keys missing in cache will be omitted from the\n     * array.\n     *\n     * getMulti is preferred over multiple individual get operations as you'll\n     * get them all in 1 request.\n     *\n     * @param mixed[]|null $tokens Will be filled with the CAS tokens, in [key => token] format\n     *\n     * @return mixed[] [key => value]\n     */\n    public function getMulti(array $keys, array &$tokens = null): array;\n\n    /**\n     * Stores a value, regardless of whether or not the key already exists (in\n     * which case it will overwrite the existing value for that key).\n     *\n     * Return value is a boolean true when the operation succeeds, or false on\n     * failure.\n     *\n     * @param int $expire Time when item falls out of the cache:\n     *                    0 = permanent (doesn't expires);\n     *                    under 2592000 (30 days) = relative time, in seconds from now;\n     *                    over 2592000 = absolute time, unix timestamp\n     */\n    public function set(string $key, mixed $value, int $expire = 0): bool;\n\n    /**\n     * Store multiple values at once.\n     *\n     * Return value will be an associative array in [key => status] form, where\n     * status is a boolean true for success, or false for failure.\n     *\n     * setMulti is preferred over multiple individual set operations as you'll\n     * set them all in 1 request.\n     *\n     * @param mixed[] $items  [key => value]\n     * @param int     $expire Time when item falls out of the cache:\n     *                        0 = permanent (doesn't expires);\n     *                        under 2592000 (30 days) = relative time, in seconds from now;\n     *                        over 2592000 = absolute time, unix timestamp\n     *\n     * @return bool[]\n     */\n    public function setMulti(array $items, int $expire = 0): array;\n\n    /**\n     * Deletes an item from the cache.\n     * Returns true if item existed & was successfully deleted, false otherwise.\n     *\n     * Return value is a boolean true when the operation succeeds, or false on\n     * failure.\n     */\n    public function delete(string $key): bool;\n\n    /**\n     * Deletes multiple items at once (reduced network traffic compared to\n     * individual operations).\n     *\n     * Return value will be an associative array in [key => status] form, where\n     * status is a boolean true for success, or false for failure.\n     *\n     * @param string[] $keys\n     *\n     * @return bool[]\n     */\n    public function deleteMulti(array $keys): array;\n\n    /**\n     * Adds an item under new key.\n     *\n     * This operation fails (returns false) if the key already exists in cache.\n     * If the operation succeeds, true will be returned.\n     *\n     * @param int $expire Time when item falls out of the cache:\n     *                    0 = permanent (doesn't expires);\n     *                    under 2592000 (30 days) = relative time, in seconds from now;\n     *                    over 2592000 = absolute time, unix timestamp\n     */\n    public function add(string $key, mixed $value, int $expire = 0): bool;\n\n    /**\n     * Replaces an item.\n     *\n     * This operation fails (returns false) if the key does not yet exist in\n     * cache. If the operation succeeds, true will be returned.\n     *\n     * @param int $expire Time when item falls out of the cache:\n     *                    0 = permanent (doesn't expires);\n     *                    under 2592000 (30 days) = relative time, in seconds from now;\n     *                    over 2592000 = absolute time, unix timestamp\n     */\n    public function replace(string $key, mixed $value, int $expire = 0): bool;\n\n    /**\n     * Replaces an item in 1 atomic operation, to ensure it didn't change since\n     * it was originally read, when the CAS token was issued.\n     *\n     * This operation fails (returns false) if the CAS token didn't match with\n     * what's currently in cache, when a new value has been written to cache\n     * after we've fetched it. If the operation succeeds, true will be returned.\n     *\n     * @param mixed $token  Token received from get() or getMulti()\n     * @param int   $expire Time when item falls out of the cache:\n     *                      0 = permanent (doesn't expires);\n     *                      under 2592000 (30 days) = relative time, in seconds from now;\n     *                      over 2592000 = absolute time, unix timestamp\n     */\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool;\n\n    /**\n     * Increments a counter value, or sets an initial value if it does not yet\n     * exist.\n     *\n     * The new counter value will be returned if this operation succeeds, or\n     * false for failure (e.g. when the value currently in cache is not a\n     * number, in which case it can't be incremented)\n     *\n     * @param int $offset  Value to increment with\n     * @param int $initial Initial value (if item doesn't yet exist)\n     * @param int $expire  Time when item falls out of the cache:\n     *                     0 = permanent (doesn't expires);\n     *                     under 2592000 (30 days) = relative time, in seconds from now;\n     *                     over 2592000 = absolute time, unix timestamp\n     *\n     * @return int|false New value or false on failure\n     */\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false;\n\n    /**\n     * Decrements a counter value, or sets an initial value if it does not yet\n     * exist.\n     *\n     * The new counter value will be returned if this operation succeeds, or\n     * false for failure (e.g. when the value currently in cache is not a\n     * number, in which case it can't be decremented)\n     *\n     * @param int $offset  Value to decrement with\n     * @param int $initial Initial value (if item doesn't yet exist)\n     * @param int $expire  Time when item falls out of the cache:\n     *                     0 = permanent (doesn't expires);\n     *                     under 2592000 (30 days) = relative time, in seconds from now;\n     *                     over 2592000 = absolute time, unix timestamp\n     *\n     * @return int|false New value or false on failure\n     */\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false;\n\n    /**\n     * Updates an item's expiration time without altering the stored value.\n     *\n     * Return value is a boolean true when the operation succeeds, or false on\n     * failure.\n     *\n     * @param int $expire Time when item falls out of the cache:\n     *                    0 = permanent (doesn't expires);\n     *                    under 2592000 (30 days) = relative time, in seconds from now;\n     *                    over 2592000 = absolute time, unix timestamp\n     */\n    public function touch(string $key, int $expire): bool;\n\n    /**\n     * Clears the entire cache (or the everything for the given collection).\n     *\n     * Return value is a boolean true when the operation succeeds, or false on\n     * failure.\n     */\n    public function flush(): bool;\n\n    /**\n     * Returns an isolated subset (collection) in which to store or fetch data\n     * from.\n     *\n     * A new KeyValueStore object will be returned, one that will only have\n     * access to this particular subset of data. Exact implementation can vary\n     * between adapters (e.g. separate database, prefixed keys, ...), but it\n     * will only ever provide access to data within this collection.\n     *\n     * It is not possible to set/fetch data across collections.\n     * Setting the same key in 2 different collections will store 2 different\n     * values, that can only be retrieved from their respective collections.\n     * Flushing a collection will only flush those specific keys and will leave\n     * keys in other collections untouched.\n     * Flushing the server, however, will wipe out everything, including data in\n     * any of the collections on that server.\n     *\n     * @return KeyValueStore A new KeyValueStore instance representing only a\n     *                       subset of data on this server\n     */\n    public function getCollection(string $name): KeyValueStore;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Psr16/InvalidArgumentException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Psr16;\n\nuse MatthiasMullie\\Scrapbook\\Exception\\Exception;\n\nclass InvalidArgumentException extends Exception implements \\Psr\\SimpleCache\\InvalidArgumentException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Psr16/SimpleCache.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Psr16;\n\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\nuse Psr\\SimpleCache\\CacheInterface;\n\n/**\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass SimpleCache implements CacheInterface\n{\n    /**\n     * List of invalid (or reserved) key characters.\n     *\n     * @var string\n     */\n    protected const KEY_INVALID_CHARACTERS = '{}()/\\@:';\n\n    protected KeyValueStore $store;\n\n    public function __construct(KeyValueStore $store)\n    {\n        $this->store = $store;\n    }\n\n    public function get(string $key, mixed $default = null): mixed\n    {\n        $this->assertValidKey($key);\n\n        // KeyValueStore::get returns false for cache misses (which could also\n        // be confused for a `false` value), so we'll check existence with getMulti\n        $multi = $this->store->getMulti([$key]);\n\n        return $multi[$key] ?? $default;\n    }\n\n    public function set(string $key, mixed $value, int|\\DateInterval $ttl = null): bool\n    {\n        $this->assertValidKey($key);\n        $ttl = $this->ttl($ttl);\n\n        return $this->store->set($key, $value, $ttl);\n    }\n\n    public function delete(string $key): bool\n    {\n        $this->assertValidKey($key);\n\n        $this->store->delete($key);\n\n        // as long as the item is gone from the cache (even if it never existed\n        // and delete failed because of that), we should return `true`\n        return true;\n    }\n\n    public function clear(): bool\n    {\n        return $this->store->flush();\n    }\n\n    public function getMultiple(iterable $keys, mixed $default = null): iterable\n    {\n        if ($keys instanceof \\Traversable) {\n            $keys = iterator_to_array($keys, false);\n        }\n\n        if (!is_array($keys)) {\n            throw new InvalidArgumentException('Invalid keys: ' . var_export($keys, true) . '. Keys should be an array or Traversable of strings.');\n        }\n        array_map([$this, 'assertValidKey'], $keys);\n\n        $results = $this->store->getMulti($keys);\n\n        // KeyValueStore omits values that are not in cache, while PSR-16 will\n        // have them with a default value\n        $nulls = array_fill_keys($keys, $default);\n\n        return array_merge($nulls, $results);\n    }\n\n    public function setMultiple(iterable $values, int|\\DateInterval $ttl = null): bool\n    {\n        if ($values instanceof \\Traversable) {\n            // we also need the keys, and an array is stricter about what it can\n            // have as keys than a Traversable is, so we can't use\n            // iterator_to_array...\n            $array = [];\n            foreach ($values as $key => $value) {\n                if (!is_string($key) && !is_int($key)) {\n                    throw new InvalidArgumentException('Invalid values: ' . var_export($values, true) . '. Only strings are allowed as keys.');\n                }\n                $array[$key] = $value;\n            }\n            $values = $array;\n        }\n\n        foreach ($values as $key => $value) {\n            // $key is also allowed to be an integer, since ['0' => ...] will\n            // automatically convert to [0 => ...]\n            $key = is_int($key) ? (string) $key : $key;\n            $this->assertValidKey($key);\n        }\n\n        $ttl = $this->ttl($ttl);\n        $success = $this->store->setMulti($values, $ttl);\n\n        return !in_array(false, $success, true);\n    }\n\n    public function deleteMultiple(iterable $keys): bool\n    {\n        if ($keys instanceof \\Traversable) {\n            $keys = iterator_to_array($keys, false);\n        }\n\n        array_map([$this, 'assertValidKey'], $keys);\n\n        $this->store->deleteMulti($keys);\n\n        // as long as the item is gone from the cache (even if it never existed\n        // and delete failed because of that), we should return `true`\n        return true;\n    }\n\n    public function has(string $key): bool\n    {\n        $this->assertValidKey($key);\n\n        // KeyValueStore::get returns false for cache misses (which could also\n        // be confused for a `false` value), so we'll check existence with getMulti\n        $multi = $this->store->getMulti([$key]);\n\n        return isset($multi[$key]);\n    }\n\n    /**\n     * Throws an exception if $key is invalid.\n     *\n     * @throws InvalidArgumentException\n     */\n    protected function assertValidKey(string $key): void\n    {\n        if ($key === '') {\n            throw new InvalidArgumentException('Invalid key. Key should not be empty.');\n        }\n\n        // valid key according to PSR-16 rules\n        $invalid = preg_quote(static::KEY_INVALID_CHARACTERS, '/');\n        if (preg_match('/[' . $invalid . ']/', $key)) {\n            throw new InvalidArgumentException('Invalid key: ' . $key . '. Contains (a) character(s) reserved for future extension: ' . static::KEY_INVALID_CHARACTERS);\n        }\n    }\n\n    /**\n     * Accepts all TTL inputs valid in PSR-16 (null|int|DateInterval) and\n     * converts them into TTL for KeyValueStore (int).\n     */\n    protected function ttl(null|int|\\DateInterval $ttl): int\n    {\n        if ($ttl === null) {\n            return 0;\n        }\n\n        if ($ttl instanceof \\DateInterval) {\n            // convert DateInterval to integer by adding it to a 0 DateTime\n            $datetime = new \\DateTime();\n            $datetime->setTimestamp(0);\n            $datetime->add($ttl);\n            $ttl = (int) $datetime->format('U');\n        }\n\n        /*\n         * PSR-16 specifies that if `0` is provided, it must be treated as\n         * expired, whereas KeyValueStore will interpret 0 to mean \"never\n         * expire\".\n         */\n        if ($ttl === 0) {\n            return -1;\n        }\n\n        /*\n         * PSR-16 only accepts relative timestamps, whereas KeyValueStore\n         * accepts both relative & absolute, depending on what the timestamp\n         * is. We'll convert all timestamps > 30 days into absolute\n         * timestamps; the others can remain relative, as KeyValueStore will\n         * already treat those values as such.\n         * @see https://github.com/dragoonis/psr-simplecache/issues/3\n         */\n        if ($ttl > 30 * 24 * 60 * 60) {\n            return $ttl + time();\n        }\n\n        return $ttl;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Psr6/InvalidArgumentException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Psr6;\n\nuse MatthiasMullie\\Scrapbook\\Exception\\Exception;\n\nclass InvalidArgumentException extends Exception implements \\Psr\\Cache\\InvalidArgumentException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Psr6/Item.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Psr6;\n\nuse Psr\\Cache\\CacheItemInterface;\n\n/**\n * Representation of a cache item, both existing & non-existing (to be created).\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Item implements CacheItemInterface\n{\n    protected string $hash;\n\n    protected string $key;\n\n    protected Repository $repository;\n\n    protected mixed $value = null;\n\n    protected int $expire = 0;\n\n    protected bool|null $isHit;\n\n    protected bool $changed = false;\n\n    public function __construct(string $key, Repository $repository)\n    {\n        $this->key = $key;\n\n        /*\n         * Register this key (tied to this particular object) to the value\n         * repository.\n         *\n         * If 1 key is requested multiple times, the value could be an object\n         * that could be altered (by reference) and if all objects-for-same-key\n         * reference that same value, all would've been changed (because all\n         * would be that exact same value.)\n         *\n         * I'm using spl_object_hash to get a unique identifier linking $key to\n         * this particular object, without using this object itself (I could use\n         * SplObjectStorage.) If I stored this object, it wouldn't be destructed\n         * when it's no longer needed, and I want it to destruct so I can free\n         * up this value in the repository when it's no longer needed.\n         */\n        $this->repository = $repository;\n        $this->hash = spl_object_hash($this);\n        $this->repository->add($this->hash, $this->key);\n    }\n\n    /**\n     * When this item is being killed, we should no longer keep its value around\n     * in the repository. Free up some memory!\n     */\n    public function __destruct()\n    {\n        $this->repository->remove($this->hash);\n    }\n\n    public function getKey(): string\n    {\n        return $this->key;\n    }\n\n    public function get(): mixed\n    {\n        // value was already set on this object, return that one!\n        if ($this->value !== null) {\n            return $this->value;\n        }\n\n        // sanity check\n        if (!$this->isHit()) {\n            return null;\n        }\n\n        return $this->repository->get($this->hash);\n    }\n\n    public function set(mixed $value): static\n    {\n        $this->value = $value;\n        $this->changed = true;\n\n        return $this;\n    }\n\n    public function isHit(): bool\n    {\n        return $this->isHit ?? $this->repository->exists($this->hash);\n    }\n\n    public function expiresAt(?\\DateTimeInterface $expiration): static\n    {\n        $this->changed = true;\n\n        if ($expiration === null) {\n            $this->expire = 0;\n        } else {\n            // convert datetime to unix timestamp\n            $this->expire = (int) $expiration->format('U');\n        }\n\n        return $this;\n    }\n\n    public function expiresAfter(int|\\DateInterval|null $time): static\n    {\n        if ($time instanceof \\DateInterval) {\n            $expire = new \\DateTime();\n            $expire->add($time);\n            // convert datetime to unix timestamp\n            $this->expire = (int) $expire->format('U');\n        } elseif (is_int($time)) {\n            $this->expire = time() + $time;\n        } elseif (is_null($time)) {\n            // this is allowed, but just defaults to infinite\n            $this->expire = 0;\n        } else {\n            throw new InvalidArgumentException('Invalid time: ' . serialize($time) . '. Must be integer or instance of DateInterval.');\n        }\n        $this->changed = true;\n\n        return $this;\n    }\n\n    /**\n     * Returns the set expiration time in integer form (as it's what\n     * KeyValueStore expects).\n     */\n    public function getExpiration(): int\n    {\n        return $this->expire;\n    }\n\n    /**\n     * Returns true if the item is already expired, false otherwise.\n     */\n    public function isExpired(): bool\n    {\n        $expire = $this->getExpiration();\n\n        return $expire !== 0 && $expire < time();\n    }\n\n    /**\n     * We'll want to know if this Item was altered (value or expiration date)\n     * once we'll want to store it.\n     */\n    public function hasChanged(): bool\n    {\n        return $this->changed;\n    }\n\n    /**\n     * Allow isHit to be override, in case it's a value that is returned from\n     * memory, when a value is being saved deferred.\n     */\n    public function overrideIsHit(bool $isHit): void\n    {\n        $this->isHit = $isHit;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Psr6/Pool.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Psr6;\n\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\nuse Psr\\Cache\\CacheItemInterface;\nuse Psr\\Cache\\CacheItemPoolInterface;\n\n/**\n * Representation of the cache storage, which lets you read items from, and add\n * values to the cache.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Pool implements CacheItemPoolInterface\n{\n    /**\n     * List of invalid (or reserved) key characters.\n     *\n     * @var string\n     */\n    protected const KEY_INVALID_CHARACTERS = '{}()/\\@:';\n\n    protected KeyValueStore $store;\n\n    protected Repository $repository;\n\n    /**\n     * @var Item[]\n     */\n    protected array $deferred = [];\n\n    public function __construct(KeyValueStore $store)\n    {\n        $this->store = $store;\n        $this->repository = new Repository($store);\n    }\n\n    public function __destruct()\n    {\n        // make sure all deferred items are actually saved\n        $this->commit();\n    }\n\n    public function getItem(string $key): CacheItemInterface\n    {\n        $this->assertValidKey($key);\n        if (array_key_exists($key, $this->deferred)) {\n            /*\n             * In theory, we could request & change a deferred value. In the\n             * case of objects, we'll clone them to make sure that when the\n             * value for 1 item is manipulated, it doesn't affect the value of\n             * the one about to be stored to cache (because those objects would\n             * be passed by-ref without the cloning)\n             */\n            $value = $this->deferred[$key];\n            $item = is_object($value) ? clone $value : $value;\n\n            /*\n             * Deferred items should identify as being hit, unless if expired:\n             * @see https://groups.google.com/forum/?fromgroups#!topic/php-fig/pxy_VYgm2sU\n             */\n            $item->overrideIsHit(!$item->isExpired());\n\n            return $item;\n        }\n\n        // return a stub object - the real call to the cache store will only be\n        // done once we actually want to access data from this object\n        return new Item($key, $this->repository);\n    }\n\n    /**\n     * @return Item[]\n     */\n    public function getItems(array $keys = []): iterable\n    {\n        $items = [];\n        foreach ($keys as $key) {\n            $this->assertValidKey($key);\n\n            $items[$key] = $this->getItem($key);\n        }\n\n        return $items;\n    }\n\n    public function hasItem(string $key): bool\n    {\n        $this->assertValidKey($key);\n\n        return $this->getItem($key)->isHit();\n    }\n\n    public function clear(): bool\n    {\n        $this->deferred = [];\n\n        return $this->store->flush();\n    }\n\n    public function deleteItem(string $key): bool\n    {\n        $this->assertValidKey($key);\n\n        $this->store->delete($key);\n        unset($this->deferred[$key]);\n\n        // as long as the item is gone from the cache (even if it never existed\n        // and delete failed because of that), we should return `true`\n        return true;\n    }\n\n    public function deleteItems(array $keys): bool\n    {\n        foreach ($keys as $key) {\n            $this->assertValidKey($key);\n\n            unset($this->deferred[$key]);\n        }\n\n        $this->store->deleteMulti($keys);\n\n        // as long as the item is gone from the cache (even if it never existed\n        // and delete failed because of that), we should return `true`\n        return true;\n    }\n\n    public function save(CacheItemInterface $item): bool\n    {\n        if (!$item instanceof Item) {\n            throw new InvalidArgumentException('MatthiasMullie\\Scrapbook\\Psr6\\Pool can only save MatthiasMullie\\Scrapbook\\Psr6\\Item objects');\n        }\n\n        if (!$item->hasChanged()) {\n            /*\n             * If the item didn't change, we don't have to re-save it. We do,\n             * however, need to check if the item actually holds a value: if it\n             * does, it should be considered \"saved\" (even though nothing has\n             * changed, the value for this key is in cache) and if it doesn't,\n             * well then nothing is in cache.\n             */\n            return $item->get() !== null;\n        }\n\n        $expire = $item->getExpiration();\n\n        return $this->store->set($item->getKey(), $item->get(), $expire);\n    }\n\n    public function saveDeferred(CacheItemInterface $item): bool\n    {\n        if (!$item instanceof Item) {\n            throw new InvalidArgumentException('MatthiasMullie\\Scrapbook\\Psr6\\Pool can only save MatthiasMullie\\Scrapbook\\Psr6\\Item objects');\n        }\n\n        $this->deferred[$item->getKey()] = $item;\n        // let's pretend that this actually comes from cache (we'll store it\n        // there soon), unless if it's already expired (in which case it will\n        // never reach cache...)\n        $item->overrideIsHit(!$item->isExpired());\n\n        return true;\n    }\n\n    public function commit(): bool\n    {\n        $deferred = [];\n        foreach ($this->deferred as $item) {\n            if ($item->isExpired()) {\n                // already expired: don't even save it\n                continue;\n            }\n\n            // setMulti doesn't allow to set expiration times on a per-item basis,\n            // so we'll have to group our requests per expiration date\n            $expire = $item->getExpiration();\n            $deferred[$expire][$item->getKey()] = $item->get();\n        }\n\n        // setMulti doesn't allow to set expiration times on a per-item basis,\n        // so we'll have to group our requests per expiration date\n        $success = true;\n        foreach ($deferred as $expire => $items) {\n            $status = $this->store->setMulti($items, $expire);\n            $success = $success && !in_array(false, $status, true);\n            unset($deferred[$expire]);\n        }\n\n        return $success;\n    }\n\n    /**\n     * Throws an exception if $key is invalid.\n     *\n     * @throws InvalidArgumentException\n     */\n    protected function assertValidKey(string $key): void\n    {\n        // valid key according to PSR-6 rules\n        $invalid = preg_quote(static::KEY_INVALID_CHARACTERS, '/');\n        if (preg_match('/[' . $invalid . ']/', $key)) {\n            throw new InvalidArgumentException('Invalid key: ' . $key . '. Contains (a) character(s) reserved for future extension: ' . static::KEY_INVALID_CHARACTERS);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Psr6/Repository.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Psr6;\n\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * Helper object to serve as glue between pool & item.\n *\n * New items are created by first get()-ing them from the pool. It would be\n * inefficient to let such a get() immediately query the real cache (because it\n * may not be meant to retrieve real data, but just to set a new value)\n *\n * Instead, every Item returned by get() will be a \"placeholder\", and once the\n * values are actually needed, this object will be called to go do that (along\n * with every other value that has not yet been resolved, while we're at it)\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Repository\n{\n    protected KeyValueStore $store;\n\n    /**\n     * Array of resolved items.\n     *\n     * @var mixed[] [unique => value]\n     */\n    protected array $resolved = [];\n\n    /**\n     * Array of unresolved items.\n     *\n     * @var string[] [unique => key]\n     */\n    protected array $unresolved = [];\n\n    public function __construct(KeyValueStore $store)\n    {\n        $this->store = $store;\n    }\n\n    /**\n     * Add a to-be-resolved cache key.\n     */\n    public function add(string $unique, string $key): void\n    {\n        $this->unresolved[$unique] = $key;\n    }\n\n    /**\n     * This repository holds the real values for all Item objects. However, if\n     * such an item gets garbage collected, there is no point in wasting any\n     * more memory storing that value.\n     * In that case, this method can be called to remove those values.\n     */\n    public function remove(string $unique): void\n    {\n        unset($this->unresolved[$unique], $this->resolved[$unique]);\n    }\n\n    /**\n     * @return mixed|null Value, of null if non-existent\n     */\n    public function get(string $unique): mixed\n    {\n        return $this->exists($unique) ? $this->resolved[$unique] : null;\n    }\n\n    public function exists(string $unique): bool\n    {\n        if (array_key_exists($unique, $this->unresolved)) {\n            $this->resolve();\n        }\n\n        return array_key_exists($unique, $this->resolved);\n    }\n\n    /**\n     * Resolve all unresolved keys at once.\n     */\n    protected function resolve(): void\n    {\n        $keys = array_unique(array_values($this->unresolved));\n        $values = $this->store->getMulti($keys);\n\n        foreach ($this->unresolved as $unique => $key) {\n            if (!array_key_exists($key, $values)) {\n                // key doesn't exist in cache\n                continue;\n            }\n\n            /*\n             * In theory, there could've been multiple unresolved requests for\n             * the same cache key. In the case of objects, we'll clone them\n             * to make sure that when the value for 1 item is manipulated, it\n             * doesn't affect the value of the other item (because those objects\n             * would be passed by-ref without the cloning)\n             */\n            $value = $values[$key];\n            $value = is_object($value) ? clone $value : $value;\n\n            $this->resolved[$unique] = $value;\n        }\n\n        $this->unresolved = [];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Scale/Shard.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Scale;\n\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * This class lets you scale your cache cluster by sharding the data across\n * multiple cache servers.\n *\n * Pass the individual KeyValueStore objects that compose the cache server pool\n * into this constructor how you want the data to be sharded. The cache data\n * will be sharded over them according to the order they were in when they were\n * passed into this constructor (so make sure to always keep the order the same)\n *\n * The sharding is spread evenly and all cache servers will roughly receive the\n * same amount of cache keys. If some servers are bigger than others, you can\n * offset this by adding the KeyValueStore object more than once.\n *\n * Data can even be sharded among different adapters: one server in the shard\n * pool can be Redis while another can be Memcached. Not sure why you would even\n * want that, but you could!\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass Shard implements KeyValueStore\n{\n    /**\n     * @var KeyValueStore[]\n     */\n    protected array $caches = [];\n\n    /**\n     * Overloadable with multiple KeyValueStore objects.\n     */\n    public function __construct(KeyValueStore $cache1, KeyValueStore $cache2 = null /* , [KeyValueStore $cache3, [...]] */)\n    {\n        $caches = func_get_args();\n        $caches = array_filter($caches);\n        $this->caches = $caches;\n    }\n\n    public function addCache(KeyValueStore $cache): void\n    {\n        $this->caches[] = $cache;\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        return $this->getShard($key)->get($key, $token);\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        $shards = $this->getShards($keys);\n        $results = [];\n        $tokens = [];\n\n        /** @var KeyValueStore $shard */\n        foreach ($shards as $shard) {\n            $keysOnShard = $shards[$shard];\n            $results += $shard->getMulti($keysOnShard, $shardTokens);\n            $tokens += $shardTokens ?: [];\n        }\n\n        return $results;\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        return $this->getShard($key)->set($key, $value, $expire);\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        $shards = $this->getShards(array_keys($items));\n        $results = [];\n\n        /** @var KeyValueStore $shard */\n        foreach ($shards as $shard) {\n            $keysOnShard = $shards[$shard];\n            $itemsOnShard = array_intersect_key($items, array_flip($keysOnShard));\n            $results += $shard->setMulti($itemsOnShard, $expire);\n        }\n\n        return $results;\n    }\n\n    public function delete(string $key): bool\n    {\n        return $this->getShard($key)->delete($key);\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        $shards = $this->getShards($keys);\n        $results = [];\n\n        /** @var KeyValueStore $shard */\n        foreach ($shards as $shard) {\n            $keysOnShard = $shards[$shard];\n            $results += $shard->deleteMulti($keysOnShard);\n        }\n\n        return $results;\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        return $this->getShard($key)->add($key, $value, $expire);\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        return $this->getShard($key)->replace($key, $value, $expire);\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        return $this->getShard($key)->cas($token, $key, $value, $expire);\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        return $this->getShard($key)->increment($key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        return $this->getShard($key)->decrement($key, $offset, $initial, $expire);\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        return $this->getShard($key)->touch($key, $expire);\n    }\n\n    public function flush(): bool\n    {\n        $result = true;\n\n        foreach ($this->caches as $cache) {\n            $result = $result && $cache->flush();\n        }\n\n        return $result;\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        $shard = new static($this->caches[0]->getCollection($name));\n\n        $count = count($this->caches);\n        for ($i = 1; $i < $count; ++$i) {\n            $shard->addCache($this->caches[$i]->getCollection($name));\n        }\n\n        return $shard;\n    }\n\n    /**\n     * Get the shard (KeyValueStore object) that corresponds to a particular\n     * cache key.\n     */\n    protected function getShard(string $key): KeyValueStore\n    {\n        /*\n         * The hash is so we can deterministically randomize the spread of keys\n         * over servers: if we were to just spread them based on key name, we\n         * may end up with a large chunk of similarly prefixed keys on the same\n         * server. Hashing the key will ensure similar looking keys can still\n         * result in very different values, yet they result will be the same\n         * every time it's repeated for the same key.\n         * Since we don't use the hash for encryption, the fastest algorithm\n         * will do just fine here.\n         */\n        $hash = crc32($key);\n\n        // crc32 on 32-bit machines can produce a negative int\n        $hash = abs($hash);\n\n        $index = $hash % count($this->caches);\n\n        return $this->caches[$index];\n    }\n\n    /**\n     * Get a [KeyValueStore => array of cache keys] map (SplObjectStorage) for\n     * multiple cache keys.\n     */\n    protected function getShards(array $keys): \\SplObjectStorage\n    {\n        $shards = new \\SplObjectStorage();\n\n        foreach ($keys as $key) {\n            // PHP treats numeric keys as integers, but they're allowed\n            $key = (string) $key;\n            $shard = $this->getShard($key);\n            if (!isset($shards[$shard])) {\n                $shards[$shard] = [];\n            }\n\n            $shards[$shard] = array_merge($shards[$shard], [$key]);\n        }\n\n        return $shards;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/matthiasmullie/scrapbook/src/Scale/StampedeProtector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace MatthiasMullie\\Scrapbook\\Scale;\n\nuse MatthiasMullie\\Scrapbook\\Exception\\InvalidKey;\nuse MatthiasMullie\\Scrapbook\\KeyValueStore;\n\n/**\n * Cache is usually used to reduce performing a complex operation. In case of a\n * cache miss, that operation is executed & the result is stored.\n *\n * A cache stampede happens when there are a lot of requests for data that is\n * not currently in cache. Examples could be:\n * * cache expires for something that is often under very heavy load\n * * sudden unexpected high load on something that is likely to not be in cache\n * In those cases, this huge amount of requests for data that is not at that\n * time in cache, causes that expensive operation to be executed a lot of times,\n * all at once.\n *\n * This class is designed to counteract that: if a value can't be found in cache\n * we'll write something else to cache for a short period of time, to indicate\n * that another process has already requested this same key (and is probably\n * already performing that complex operation that will result in the key being\n * filled)\n *\n * All of the follow-up requests (that find that the \"stampede indicator\" has\n * already been set) will just wait (usleep): instead of crippling the servers\n * by all having to execute the same operation, these processes will just idle\n * to give the first process the chance to fill in the cache. Periodically,\n * these processes will poll the cache to see if the value has already been\n * stored in the meantime.\n *\n * The stampede protection will only be temporary, for $sla milliseconds. We\n * need to limit it because the first process (tasked with filling the cache\n * after executing the expensive operation) may fail/crash/... If the expensive\n * operation fails to conclude in < $sla milliseconds.\n * This class guarantees that the stampede will hold off for $sla amount of time\n * but after that, all follow-up requests will go through without cached values\n * and cause a stampede after all, if the initial process fails to complete\n * within that time.\n *\n * @author Matthias Mullie <scrapbook@mullie.eu>\n * @copyright Copyright (c) 2014, Matthias Mullie. All rights reserved\n * @license LICENSE MIT\n */\nclass StampedeProtector implements KeyValueStore\n{\n    protected KeyValueStore $cache;\n\n    /**\n     * Amount of time, in milliseconds, this class guarantees protection.\n     */\n    protected int $sla;\n\n    /**\n     * Amount of times every process will poll within $sla time.\n     */\n    protected int $attempts = 10;\n\n    /**\n     * @param KeyValueStore $cache The real cache we'll buffer for\n     * @param int           $sla   Stampede protection time, in milliseconds\n     */\n    public function __construct(KeyValueStore $cache, int $sla = 1000)\n    {\n        $this->cache = $cache;\n        $this->sla = $sla;\n    }\n\n    public function get(string $key, mixed &$token = null): mixed\n    {\n        $values = $this->getMulti([$key], $tokens);\n        $token = $tokens[$key] ?? null;\n\n        return $values[$key] ?? false;\n    }\n\n    public function getMulti(array $keys, array &$tokens = null): array\n    {\n        // fetch both requested keys + stampede protection indicators at once\n        $stampedeKeys = array_combine($keys, array_map([$this, 'stampedeKey'], $keys));\n        $values = $this->cache->getMulti(array_merge($keys, $stampedeKeys), $tokens);\n\n        // figure out which of the requested keys are protected, and which need\n        // protection (=currently empty & not yet protected)\n        $protected = array_keys(array_intersect($stampedeKeys, array_keys($values)));\n        $protect = array_diff($keys, array_keys($values), $protected);\n\n        // protect keys that we couldn't find, and remove them from the list of\n        // keys we want results from, because we'll keep fetching empty keys\n        // (that are currently protected)\n        $done = $this->protect($protect);\n        $keys = array_diff($keys, $done);\n\n        // we may have failed to protect some keys after all (race condition\n        // with another process), in which case we also have to keep polling\n        // those keys (which the other process is likely working on already)\n        $protected += array_diff($protect, $done);\n\n        // we over-fetched (to include stampede indicators), now limit the\n        // results to only the keys we requested\n        $results = array_intersect_key($values, array_flip($keys));\n        // we may have fetched the values but the stampede protector is still up\n        $protected = array_diff($protected, array_keys($results));\n        $tokens = array_intersect_key($tokens, $results);\n\n        // we may not have been able to retrieve all keys yet: some may have\n        // been \"protected\" (and are being regenerated in another process) in\n        // which case we'll retry a couple of times, hoping the other process\n        // stores the new value in the meantime\n        $attempts = $this->attempts;\n        while (--$attempts > 0 && !empty($protected) && $this->sleep()) {\n            $values = $this->cache->getMulti($protected, $tokens2);\n\n            $results += array_intersect_key($values, array_flip($keys));\n            $tokens += array_intersect_key($tokens2, array_flip($keys));\n\n            // don't keep polling for values we just fetched...\n            $protected = array_diff($protected, array_keys($values));\n        }\n\n        return $results;\n    }\n\n    public function set(string $key, mixed $value, int $expire = 0): bool\n    {\n        return $this->cache->set($key, $value, $expire);\n    }\n\n    public function setMulti(array $items, int $expire = 0): array\n    {\n        return $this->cache->setMulti($items, $expire);\n    }\n\n    public function delete(string $key): bool\n    {\n        return $this->cache->delete($key);\n    }\n\n    public function deleteMulti(array $keys): array\n    {\n        return $this->cache->deleteMulti($keys);\n    }\n\n    public function add(string $key, mixed $value, int $expire = 0): bool\n    {\n        return $this->cache->add($key, $value, $expire);\n    }\n\n    public function replace(string $key, mixed $value, int $expire = 0): bool\n    {\n        return $this->cache->replace($key, $value, $expire);\n    }\n\n    public function cas(mixed $token, string $key, mixed $value, int $expire = 0): bool\n    {\n        return $this->cache->cas($token, $key, $value, $expire);\n    }\n\n    public function increment(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        return $this->cache->increment($key, $offset, $initial, $expire);\n    }\n\n    public function decrement(string $key, int $offset = 1, int $initial = 0, int $expire = 0): int|false\n    {\n        return $this->cache->decrement($key, $offset, $initial, $expire);\n    }\n\n    public function touch(string $key, int $expire): bool\n    {\n        return $this->cache->touch($key, $expire);\n    }\n\n    public function flush(): bool\n    {\n        return $this->cache->flush();\n    }\n\n    public function getCollection(string $name): KeyValueStore\n    {\n        $collection = $this->cache->getCollection($name);\n\n        return new static($collection);\n    }\n\n    /**\n     * As soon as a key turns up empty (doesn't yet exist in cache), we'll\n     * \"protect\" it for some time. This will be done by writing to a key similar\n     * to the original key name. If this key is present (which it will only be\n     * for a short amount of time) we'll know it's protected.\n     *\n     * @return string[] Array of keys that were successfully protected\n     */\n    protected function protect(array $keys): array\n    {\n        if (empty($keys)) {\n            return [];\n        }\n\n        $success = [];\n        foreach ($keys as $key) {\n            /*\n             * Key is add()ed because there may be multiple concurrent processes\n             * that are both in the process of protecting - first one to add()\n             * wins (and those are returned by the function, so those that are\n             * failed to protect can be considered protected)\n             *\n             * Note: lock is held for longer (rounded up to the closest second)\n             * than SLA because it can't be held in milliseconds. Should be fine.\n             * @see https://github.com/matthiasmullie/scrapbook/issues/48#issuecomment-1309990096\n             */\n            $success[$key] = $this->cache->add(\n                $this->stampedeKey($key),\n                '',\n                (int) ceil($this->sla / 1000)\n            );\n        }\n\n        return array_keys(array_filter($success));\n    }\n\n    /**\n     * When waiting for stampede-protected keys, we'll just sleep, not using\n     * much resources.\n     */\n    protected function sleep(): bool\n    {\n        $break = $this->sla / $this->attempts;\n        usleep(1000 * $break);\n\n        return true;\n    }\n\n    /**\n     * To figure out if something has recently been requested already (and is\n     * likely in the process of being recalculated), we'll temporarily write to\n     * another key, so follow-up requests know another process is likely already\n     * re-processing the value.\n     *\n     * @throws InvalidKey\n     */\n    protected function stampedeKey(string $key): string\n    {\n        $suffix = '.stampede';\n\n        if (str_ends_with($key, $suffix)) {\n            throw new InvalidKey(\"Invalid key: $key. Keys with suffix '$suffix' are reserved.\");\n        }\n\n        return $key . $suffix;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/cache/CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to this project will be documented in this file, in reverse chronological order by release.\n\n## 1.0.1 - 2016-08-06\n\n### Fixed\n\n- Make spacing consistent in phpdoc annotations php-fig/cache#9 - chalasr\n- Fix grammar in phpdoc annotations php-fig/cache#10 - chalasr\n- Be more specific in docblocks that `getItems()` and `deleteItems()` take an array of strings (`string[]`) compared to just `array` php-fig/cache#8 - GrahamCampbell\n- 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\n\n## 1.0.0 - 2015-12-11\n\nInitial stable release; reflects accepted PSR-6 specification\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/cache/LICENSE.txt",
    "content": "Copyright (c) 2015 PHP Framework Interoperability Group\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/cache/README.md",
    "content": "Caching Interface\n==============\n\nThis repository holds all interfaces related to [PSR-6 (Caching Interface)][psr-url].\n\nNote that this is not a Caching implementation of its own. It is merely interfaces that describe the components of a Caching mechanism.\n\nThe installable [package][package-url] and [implementations][implementation-url] are listed on Packagist.\n\n[psr-url]: https://www.php-fig.org/psr/psr-6/\n[package-url]: https://packagist.org/packages/psr/cache\n[implementation-url]: https://packagist.org/providers/psr/cache-implementation\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/cache/composer.json",
    "content": "{\n    \"name\": \"psr/cache\",\n    \"description\": \"Common interface for caching libraries\",\n    \"keywords\": [\"psr\", \"psr-6\", \"cache\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"https://www.php-fig.org/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.0.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\Cache\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.0.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/cache/src/CacheException.php",
    "content": "<?php\n\nnamespace Psr\\Cache;\n\n/**\n * Exception interface for all exceptions thrown by an Implementing Library.\n */\ninterface CacheException extends \\Throwable\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/cache/src/CacheItemInterface.php",
    "content": "<?php\n\nnamespace Psr\\Cache;\n\n/**\n * CacheItemInterface defines an interface for interacting with objects inside a cache.\n *\n * Each Item object MUST be associated with a specific key, which can be set\n * according to the implementing system and is typically passed by the\n * Cache\\CacheItemPoolInterface object.\n *\n * The Cache\\CacheItemInterface object encapsulates the storage and retrieval of\n * cache items. Each Cache\\CacheItemInterface is generated by a\n * Cache\\CacheItemPoolInterface object, which is responsible for any required\n * setup as well as associating the object with a unique Key.\n * Cache\\CacheItemInterface objects MUST be able to store and retrieve any type\n * of PHP value defined in the Data section of the specification.\n *\n * Calling Libraries MUST NOT instantiate Item objects themselves. They may only\n * be requested from a Pool object via the getItem() method.  Calling Libraries\n * SHOULD NOT assume that an Item created by one Implementing Library is\n * compatible with a Pool from another Implementing Library.\n */\ninterface CacheItemInterface\n{\n    /**\n     * Returns the key for the current cache item.\n     *\n     * The key is loaded by the Implementing Library, but should be available to\n     * the higher level callers when needed.\n     *\n     * @return string\n     *   The key string for this cache item.\n     */\n    public function getKey(): string;\n\n    /**\n     * Retrieves the value of the item from the cache associated with this object's key.\n     *\n     * The value returned must be identical to the value originally stored by set().\n     *\n     * If isHit() returns false, this method MUST return null. Note that null\n     * is a legitimate cached value, so the isHit() method SHOULD be used to\n     * differentiate between \"null value was found\" and \"no value was found.\"\n     *\n     * @return mixed\n     *   The value corresponding to this cache item's key, or null if not found.\n     */\n    public function get(): mixed;\n\n    /**\n     * Confirms if the cache item lookup resulted in a cache hit.\n     *\n     * Note: This method MUST NOT have a race condition between calling isHit()\n     * and calling get().\n     *\n     * @return bool\n     *   True if the request resulted in a cache hit. False otherwise.\n     */\n    public function isHit(): bool;\n\n    /**\n     * Sets the value represented by this cache item.\n     *\n     * The $value argument may be any item that can be serialized by PHP,\n     * although the method of serialization is left up to the Implementing\n     * Library.\n     *\n     * @param mixed $value\n     *   The serializable value to be stored.\n     *\n     * @return static\n     *   The invoked object.\n     */\n    public function set(mixed $value): static;\n\n    /**\n     * Sets the expiration time for this cache item.\n     *\n     * @param ?\\DateTimeInterface $expiration\n     *   The point in time after which the item MUST be considered expired.\n     *   If null is passed explicitly, a default value MAY be used. If none is set,\n     *   the value should be stored permanently or for as long as the\n     *   implementation allows.\n     *\n     * @return static\n     *   The called object.\n     */\n    public function expiresAt(?\\DateTimeInterface $expiration): static;\n\n    /**\n     * Sets the expiration time for this cache item.\n     *\n     * @param int|\\DateInterval|null $time\n     *   The period of time from the present after which the item MUST be considered\n     *   expired. An integer parameter is understood to be the time in seconds until\n     *   expiration. If null is passed explicitly, a default value MAY be used.\n     *   If none is set, the value should be stored permanently or for as long as the\n     *   implementation allows.\n     *\n     * @return static\n     *   The called object.\n     */\n    public function expiresAfter(int|\\DateInterval|null $time): static;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/cache/src/CacheItemPoolInterface.php",
    "content": "<?php\n\nnamespace Psr\\Cache;\n\n/**\n * CacheItemPoolInterface generates CacheItemInterface objects.\n *\n * The primary purpose of Cache\\CacheItemPoolInterface is to accept a key from\n * the Calling Library and return the associated Cache\\CacheItemInterface object.\n * It is also the primary point of interaction with the entire cache collection.\n * All configuration and initialization of the Pool is left up to an\n * Implementing Library.\n */\ninterface CacheItemPoolInterface\n{\n    /**\n     * Returns a Cache Item representing the specified key.\n     *\n     * This method must always return a CacheItemInterface object, even in case of\n     * a cache miss. It MUST NOT return null.\n     *\n     * @param string $key\n     *   The key for which to return the corresponding Cache Item.\n     *\n     * @throws InvalidArgumentException\n     *   If the $key string is not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return CacheItemInterface\n     *   The corresponding Cache Item.\n     */\n    public function getItem(string $key): CacheItemInterface;\n\n    /**\n     * Returns a traversable set of cache items.\n     *\n     * @param string[] $keys\n     *   An indexed array of keys of items to retrieve.\n     *\n     * @throws InvalidArgumentException\n     *   If any of the keys in $keys are not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return iterable\n     *   An iterable collection of Cache Items keyed by the cache keys of\n     *   each item. A Cache item will be returned for each key, even if that\n     *   key is not found. However, if no keys are specified then an empty\n     *   traversable MUST be returned instead.\n     */\n    public function getItems(array $keys = []): iterable;\n\n    /**\n     * Confirms if the cache contains specified cache item.\n     *\n     * Note: This method MAY avoid retrieving the cached value for performance reasons.\n     * This could result in a race condition with CacheItemInterface::get(). To avoid\n     * such situation use CacheItemInterface::isHit() instead.\n     *\n     * @param string $key\n     *   The key for which to check existence.\n     *\n     * @throws InvalidArgumentException\n     *   If the $key string is not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return bool\n     *   True if item exists in the cache, false otherwise.\n     */\n    public function hasItem(string $key): bool;\n\n    /**\n     * Deletes all items in the pool.\n     *\n     * @return bool\n     *   True if the pool was successfully cleared. False if there was an error.\n     */\n    public function clear(): bool;\n\n    /**\n     * Removes the item from the pool.\n     *\n     * @param string $key\n     *   The key to delete.\n     *\n     * @throws InvalidArgumentException\n     *   If the $key string is not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return bool\n     *   True if the item was successfully removed. False if there was an error.\n     */\n    public function deleteItem(string $key): bool;\n\n    /**\n     * Removes multiple items from the pool.\n     *\n     * @param string[] $keys\n     *   An array of keys that should be removed from the pool.\n     *\n     * @throws InvalidArgumentException\n     *   If any of the keys in $keys are not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return bool\n     *   True if the items were successfully removed. False if there was an error.\n     */\n    public function deleteItems(array $keys): bool;\n\n    /**\n     * Persists a cache item immediately.\n     *\n     * @param CacheItemInterface $item\n     *   The cache item to save.\n     *\n     * @return bool\n     *   True if the item was successfully persisted. False if there was an error.\n     */\n    public function save(CacheItemInterface $item): bool;\n\n    /**\n     * Sets a cache item to be persisted later.\n     *\n     * @param CacheItemInterface $item\n     *   The cache item to save.\n     *\n     * @return bool\n     *   False if the item could not be queued or if a commit was attempted and failed. True otherwise.\n     */\n    public function saveDeferred(CacheItemInterface $item): bool;\n\n    /**\n     * Persists any deferred cache items.\n     *\n     * @return bool\n     *   True if all not-yet-saved items were successfully saved or there were none. False otherwise.\n     */\n    public function commit(): bool;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/cache/src/InvalidArgumentException.php",
    "content": "<?php\n\nnamespace Psr\\Cache;\n\n/**\n * Exception interface for invalid cache arguments.\n *\n * Any time an invalid argument is passed into a method it must throw an\n * exception class which implements Psr\\Cache\\InvalidArgumentException.\n */\ninterface InvalidArgumentException extends CacheException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/simple-cache/.editorconfig",
    "content": "; This file is for unifying the coding style for different editors and IDEs.\n; More information at http://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nindent_size = 4\nindent_style = space\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/simple-cache/LICENSE.md",
    "content": "# The MIT License (MIT)\n\nCopyright (c) 2016 PHP Framework Interoperability Group\n\n> Permission is hereby granted, free of charge, to any person obtaining a copy\n> of this software and associated documentation files (the \"Software\"), to deal\n> in the Software without restriction, including without limitation the rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n> The above copyright notice and this permission notice shall be included in\n> all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/simple-cache/README.md",
    "content": "PHP FIG Simple Cache PSR\n========================\n\nThis repository holds all interfaces related to PSR-16.\n\nNote 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.\n\nYou 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.\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/simple-cache/composer.json",
    "content": "{\n    \"name\": \"psr/simple-cache\",\n    \"description\": \"Common interfaces for simple caching\",\n    \"keywords\": [\"psr\", \"psr-16\", \"cache\", \"simple-cache\", \"caching\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"https://www.php-fig.org/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.0.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\SimpleCache\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"3.0.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/simple-cache/src/CacheException.php",
    "content": "<?php\n\nnamespace Psr\\SimpleCache;\n\n/**\n * Interface used for all types of exceptions thrown by the implementing library.\n */\ninterface CacheException extends \\Throwable\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/simple-cache/src/CacheInterface.php",
    "content": "<?php\n\nnamespace Psr\\SimpleCache;\n\ninterface CacheInterface\n{\n    /**\n     * Fetches a value from the cache.\n     *\n     * @param string $key     The unique key of this item in the cache.\n     * @param mixed  $default Default value to return if the key does not exist.\n     *\n     * @return mixed The value of the item from the cache, or $default in case of cache miss.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if the $key string is not a legal value.\n     */\n    public function get(string $key, mixed $default = null): mixed;\n\n    /**\n     * Persists data in the cache, uniquely referenced by a key with an optional expiration TTL time.\n     *\n     * @param string                 $key   The key of the item to store.\n     * @param mixed                  $value The value of the item to store, must be serializable.\n     * @param null|int|\\DateInterval $ttl   Optional. The TTL value of this item. If no value is sent and\n     *                                      the driver supports TTL then the library may set a default value\n     *                                      for it or let the driver take care of that.\n     *\n     * @return bool True on success and false on failure.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if the $key string is not a legal value.\n     */\n    public function set(string $key, mixed $value, null|int|\\DateInterval $ttl = null): bool;\n\n    /**\n     * Delete an item from the cache by its unique key.\n     *\n     * @param string $key The unique cache key of the item to delete.\n     *\n     * @return bool True if the item was successfully removed. False if there was an error.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if the $key string is not a legal value.\n     */\n    public function delete(string $key): bool;\n\n    /**\n     * Wipes clean the entire cache's keys.\n     *\n     * @return bool True on success and false on failure.\n     */\n    public function clear(): bool;\n\n    /**\n     * Obtains multiple cache items by their unique keys.\n     *\n     * @param iterable<string> $keys    A list of keys that can be obtained in a single operation.\n     * @param mixed            $default Default value to return for keys that do not exist.\n     *\n     * @return iterable<string, mixed> A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if $keys is neither an array nor a Traversable,\n     *   or if any of the $keys are not a legal value.\n     */\n    public function getMultiple(iterable $keys, mixed $default = null): iterable;\n\n    /**\n     * Persists a set of key => value pairs in the cache, with an optional TTL.\n     *\n     * @param iterable               $values A list of key => value pairs for a multiple-set operation.\n     * @param null|int|\\DateInterval $ttl    Optional. The TTL value of this item. If no value is sent and\n     *                                       the driver supports TTL then the library may set a default value\n     *                                       for it or let the driver take care of that.\n     *\n     * @return bool True on success and false on failure.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if $values is neither an array nor a Traversable,\n     *   or if any of the $values are not a legal value.\n     */\n    public function setMultiple(iterable $values, null|int|\\DateInterval $ttl = null): bool;\n\n    /**\n     * Deletes multiple cache items in a single operation.\n     *\n     * @param iterable<string> $keys A list of string-based keys to be deleted.\n     *\n     * @return bool True if the items were successfully removed. False if there was an error.\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if $keys is neither an array nor a Traversable,\n     *   or if any of the $keys are not a legal value.\n     */\n    public function deleteMultiple(iterable $keys): bool;\n\n    /**\n     * Determines whether an item is present in the cache.\n     *\n     * NOTE: It is recommended that has() is only to be used for cache warming type purposes\n     * and not to be used within your live applications operations for get/set, as this method\n     * is subject to a race condition where your has() will return true and immediately after,\n     * another script can remove it making the state of your app out of date.\n     *\n     * @param string $key The cache item key.\n     *\n     * @return bool\n     *\n     * @throws \\Psr\\SimpleCache\\InvalidArgumentException\n     *   MUST be thrown if the $key string is not a legal value.\n     */\n    public function has(string $key): bool;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/psr/simple-cache/src/InvalidArgumentException.php",
    "content": "<?php\n\nnamespace Psr\\SimpleCache;\n\n/**\n * Exception interface for invalid cache arguments.\n *\n * When an invalid argument is passed it must throw an exception which implements\n * this interface\n */\ninterface InvalidArgumentException extends CacheException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/typecho_apcu.class.php",
    "content": "<?php\nclass typecho_apcu implements BsCache\n{\n\tprivate static $_instance = null;\n\tprivate $apcu = null;\n\tprivate $expire = 86400;\n\n\tprivate function __construct($option = null)\n\t{\n\t\t$this->expire = $option->expire;\n\t\t$this->init($option);\n\t}\n\n\tstatic public function getInstance($option)\n\t{\n\t\tif (!isset(self::$_instance)) {\n\t\t\tself::$_instance = new self($option);\n\t\t}\n\t\treturn !is_null(self::$_instance->apcu) ? self::$_instance : null;\n\t}\n\n\tpublic function init($option)\n\t{\n\t\ttry {\n\t\t\t$this->apcuc = new \\MatthiasMullie\\Scrapbook\\Adapters\\Apc();\n            $this->apcu = new \\MatthiasMullie\\Scrapbook\\Scale\\StampedeProtector($this->apcuc);\n\t\t} catch (Exception $e){\n\t\t\t$this->apcu = null;\n\t\t\techo $m->getResultCode().$e->getMessage();\n\t\t}\n\t}\n\n\tpublic function add($key, $value)\n\t{\n\t\treturn $this->apcu->set($key, $value, $this->expire);\n\t}\n\n\tpublic function delete($key)\n\t{\n\t\treturn $this->apcu->delete($key);\n\t}\n\n\tpublic function set($key, $value)\n\t{\n\t\treturn $this->apcu->set($key, $value, $this->expire);\n\t}\n\n\tpublic function get($key)\n\t{\n\t\treturn $this->apcu->get($key);\n\t}\n\n\tpublic function flush()\n\t{\n\t\treturn $this->apcu->flush();\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/typecho_flysystem.class.php",
    "content": "<?php\nclass typecho_flysystem implements BsCache\n{\n\tprivate static $_instance = null;\n\tprivate $sqlite = null;\n\tprivate $expire = 86400;\n\n\tprivate function __construct($option = null)\n\t{\n\t\t$this->expire = $option->expire;\n\t\t$this->init($option);\n\t}\n\n\tstatic public function getInstance($option)\n\t{\n\t\tif (!isset(self::$_instance)) {\n\t\t\tself::$_instance = new self($option);\n\t\t}\n\t\treturn !is_null(self::$_instance->flysystem) ? self::$_instance : null;\n\t}\n\n\tpublic function init($option)\n\t{\n\t\ttry {\n\t\t    $adapter = new \\League\\Flysystem\\Local\\LocalFilesystemAdapter('caches', null, LOCK_EX);\n           $filesystem = new \\League\\Flysystem\\Filesystem($adapter);\n          $this->flysystem = new \\MatthiasMullie\\Scrapbook\\Adapters\\Flysystem($filesystem);\n\t\t} catch (Exception $e){\n\t\t\t$this->flysystem = null;\n\t\t\techo $e->getMessage();\n\t\t}\n\t}\n\n\tpublic function add($key, $value)\n\t{\n\t\treturn $this->flysystem->set($key, $value, $this->expire);\n\t}\n\n\tpublic function delete($key)\n\t{\n\t\treturn $this->flysystem->delete($key);\n\t}\n\n\tpublic function set($key, $value)\n\t{\n\t\treturn $this->flysystem->set($key, $value, $this->expire);\n\t}\n\n\tpublic function get($key)\n\t{\n\t\treturn $this->flysystem->get($key);\n\t}\n\n\tpublic function flush()\n\t{\n\t\treturn $this->flysystem->flush();\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/typecho_memcached.class.php",
    "content": "<?php\nuse Memcached;\nclass typecho_memcached implements BsCache\n{\n\tprivate static $_instance = null;\n\tprivate $mc = null;\n\tprivate $host = '127.0.0.1';\n\tprivate $port = 11211;\n\tprivate $expire = 86400;\n\n\tprivate function __construct($option = null)\n\t{\n\t\t$this->host = $option->host;\n\t\t$this->port = $option->port;\n\t\t$this->expire = $option->expire;\n\t\t$this->init($option);\n\t}\n\n\tstatic public function getInstance($option)\n\t{\n\t\tif (!isset(self::$_instance)) {\n\t\t\tself::$_instance = new self($option);\n\t\t}\n\t\treturn !is_null(self::$_instance->mc) ? self::$_instance : null;\n\t}\n\n\tpublic function init($option)\n\t{\n\t\ttry {\n\t\t\t$this->mcd = new Memcached;\n\t\t\t$this->mcd->addServer($this->host, $this->port);\n\t\t\t$this->mc = new \\MatthiasMullie\\Scrapbook\\Adapters\\Memcached($this->mcd);\n            $this->mc = new \\MatthiasMullie\\Scrapbook\\Scale\\StampedeProtector($this->mc);\n\t\t} catch (Exception $e){\n\t\t\t$this->mc = null;\n\t\t\techo $m->getResultCode().$e->getMessage();\n\t\t}\n\t}\n\n\tpublic function add($key, $value)\n\t{\n\t\treturn $this->mc->set($key, $value, $this->expire);\n\t}\n\n\tpublic function delete($key)\n\t{\n\t\treturn $this->mc->delete($key);\n\t}\n\n\tpublic function set($key, $value)\n\t{\n\t\treturn $this->mc->set($key, $value, $this->expire);\n\t}\n\n\tpublic function get($key)\n\t{\n\t\treturn $this->mc->get($key);\n\t}\n\n\tpublic function flush()\n\t{\n\t\treturn $this->mc->flush();\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/typecho_memory.class.php",
    "content": "<?php\nclass typecho_memory implements BsCache\n{\n\tprivate static $_instance = null;\n\tprivate $memory = null;\n\tprivate $expire = 86400;\n\n\tprivate function __construct($option = null)\n\t{\n\t\t$this->expire = $option->expire;\n\t\t$this->init($option);\n\t}\n\n\tstatic public function getInstance($option)\n\t{\n\t\tif (!isset(self::$_instance)) {\n\t\t\tself::$_instance = new self($option);\n\t\t}\n\t\treturn !is_null(self::$_instance->memory) ? self::$_instance : null;\n\t}\n\n\tpublic function init($option)\n\t{\n\t\ttry {\n\t\t\t$this->memoryc = new \\MatthiasMullie\\Scrapbook\\Adapters\\MemoryStore();\n            $this->memory = new \\MatthiasMullie\\Scrapbook\\Scale\\StampedeProtector($this->memoryc);\n\t\t} catch (Exception $e){\n\t\t\t$this->memory = null;\n\t\t\techo $m->getResultCode().$e->getMessage();\n\t\t}\n\t}\n\n\tpublic function add($key, $value)\n\t{\n\t\treturn $this->memory->set($key, $value, $this->expire);\n\t}\n\n\tpublic function delete($key)\n\t{\n\t\treturn $this->memory->delete($key);\n\t}\n\n\tpublic function set($key, $value)\n\t{\n\t\treturn $this->memory->set($key, $value, $this->expire);\n\t}\n\n\tpublic function get($key)\n\t{\n\t\treturn $this->memory->get($key);\n\t}\n\n\tpublic function flush()\n\t{\n\t\treturn $this->memory->flush();\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/typecho_redis.class.php",
    "content": "<?php\nuse Redis;\nclass typecho_redis implements BsCache\n{\n\tprivate static $_instance = null;\n\tprivate $redis = null;\n\tprivate $host = '127.0.0.1';\n\tprivate $port = 6379;\n\tprivate $expire = 86400;\n\n\tprivate function __construct($option = null)\n\t{\n\t\t$this->host = $option->host;\n\t\t$this->port = $option->port;\n\t\t$this->password = $option->rpassword;\n\t\t$this->expire = $option->expire;\n\t\t$this->init($option);\n\t}\n\n\tstatic public function getInstance($option)\n\t{\n\t\tif (!isset(self::$_instance)) {\n\t\t\tself::$_instance = new self($option);\n\t\t}\n\t\treturn !is_null(self::$_instance->redis) ? self::$_instance : null;\n\t}\n \n\tpublic function init($option)\n\t{\n\t\ttry {\n\t\t\t$this->redisc = new \\Redis();;\n\t\t\t$this->redisc->connect($this->host, $this->port);\n\t\t\tif($this->password !==''){\n\t\t\t$this->redisc->auth($this->password);\n\t\t\t}\n            $this->redis = new \\MatthiasMullie\\Scrapbook\\Adapters\\Redis($this->redisc);\n            $this->redis = new \\MatthiasMullie\\Scrapbook\\Scale\\StampedeProtector($this->redis);\n\t\t} catch (Exception $e){\n\t\t\t$this->redis = null;\n\t\t\techo $e->getMessage();\n\t\t}\n\t}\n\n\tpublic function add($key, $value)\n\t{\n\t\treturn $this->redis->set($key, $value, $this->expire);\n\t}\n\n\tpublic function delete($key)\n\t{\n\t\treturn $this->redis->delete($key);\n\t}\n\n\tpublic function set($key, $value)\n\t{\n\t\treturn $this->redis->set($key, $value,$this->expire);\n\t}\n\n\tpublic function get($key)\n\t{\n\t\treturn $this->redis->get($key);\n\t}\n\n\tpublic function flush()\n\t{\n\t\treturn $this->redis->flush();\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/cache/typecho_sqlite.class.php",
    "content": "<?php\nclass typecho_sqlite implements BsCache\n{\n\tprivate static $_instance = null;\n\tprivate $sqlite = null;\n\tprivate $expire = 86400;\n\n\tprivate function __construct($option = null)\n\t{\n\t\t$this->expire = $option->expire;\n\t\t$this->init($option);\n\t}\n\n\tstatic public function getInstance($option)\n\t{\n\t\tif (!isset(self::$_instance)) {\n\t\t\tself::$_instance = new self($option);\n\t\t}\n\t\treturn !is_null(self::$_instance->sqlite) ? self::$_instance : null;\n\t}\n\n\tpublic function init($option)\n\t{\n\t\ttry {\n\t\t\t$this->sqlitec = new \\PDO('sqlite:caches/cache.db');\n            $this->sqlite = new \\MatthiasMullie\\Scrapbook\\Adapters\\SQLite($this->sqlitec);\n            $this->sqlite = new \\MatthiasMullie\\Scrapbook\\Scale\\StampedeProtector($this->sqlite);\n\t\t} catch (Exception $e){\n\t\t\t$this->sqlite = null;\n\t\t\techo $e->getMessage();\n\t\t}\n\t}\n\n\tpublic function add($key, $value)\n\t{\n\t\treturn $this->sqlite->set($key, $value, $this->expire);\n\t}\n\n\tpublic function delete($key)\n\t{\n\t\treturn $this->sqlite->delete($key);\n\t}\n\n\tpublic function set($key, $value)\n\t{\n\t\treturn $this->sqlite->set($key, $value, $this->expire);\n\t}\n\n\tpublic function get($key)\n\t{\n\t\treturn $this->sqlite->get($key);\n\t}\n\n\tpublic function flush()\n\t{\n\t\treturn $this->sqlite->flush();\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Common/CheckoutStream.php",
    "content": "<?php\nnamespace Obs\\Internal\\Common;\n\nuse Psr\\Http\\Message\\StreamInterface;\nuse GuzzleHttp\\Psr7\\StreamDecoratorTrait;\nuse Obs\\ObsException;\n\nclass CheckoutStream implements StreamInterface {\n    use StreamDecoratorTrait;\n    \n    private $expectedLength;\n    private $readedCount = 0;\n\n    public function __construct(StreamInterface $stream, $expectedLength) {\n        $this->stream = $stream;\n        $this->expectedLength = $expectedLength;\n    }\n\n    public function getContents() {\n        $contents = $this->stream->getContents();\n        $length = strlen($contents);\n        if ($this->expectedLength !== null && floatval($length) !== $this->expectedLength) {\n            $this -> throwObsException($this->expectedLength, $length);\n        }\n        return $contents;\n    }\n\n    public function read($length) {\n        $string = $this->stream->read($length);\n        if ($this->expectedLength !== null) {\n            $this->readedCount += strlen($string);\n            if ($this->stream->eof()) {\n                if (floatval($this->readedCount) !== $this->expectedLength) {\n                    $this -> throwObsException($this->expectedLength, $this->readedCount);\n                }\n            }\n        }    \n        return $string;\n    }\n\n    public function throwObsException($expectedLength, $reaLength) {\n        $obsException = new ObsException('premature end of Content-Length delimiter message body (expected:' . $expectedLength . '; received:' . $reaLength . ')');\n        $obsException->setExceptionType('server');\n        throw $obsException;\n    }\n}\n\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Common/ITransform.php",
    "content": "<?php\nnamespace Obs\\Internal\\Common;\n\ninterface ITransform {\n    public function transform($sign, $para);\n}\n\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Common/Model.php",
    "content": "<?php\n\nnamespace Obs\\Internal\\Common;\n\nclass Model implements \\ArrayAccess, \\IteratorAggregate, \\Countable, ToArrayInterface\n{\n\t/** @var array Data associated with the object. */\n\tprotected $data;\n\t\n\t/**\n\t * @param array $data Associative array of data to set\n\t */\n\tpublic function __construct(array $data = [])\n\t{\n\t\t$this->data = $data;\n\t}\n\t\n\tpublic function count()\n\t{\n\t\treturn count($this->data);\n\t}\n\t\n\tpublic function getIterator()\n\t{\n\t\treturn new \\ArrayIterator($this->data);\n\t}\n\t\n\tpublic function toArray()\n\t{\n\t\treturn $this->data;\n\t}\n\t\n\t/**\n\t * Removes all key value pairs\n\t *\n\t * @return Collection\n\t */\n\tpublic function clear()\n\t{\n\t\t$this->data = [];\n\t\t\n\t\treturn $this;\n\t}\n\t\n\t/**\n\t * Get all or a subset of matching key value pairs\n\t *\n\t * @param array $keys Pass an array of keys to retrieve only a subset of key value pairs\n\t *\n\t * @return array Returns an array of all matching key value pairs\n\t */\n\tpublic function getAll(array $keys = null)\n\t{\n\t\treturn $keys ? array_intersect_key($this->data, array_flip($keys)) : $this->data;\n\t}\n\t\n\t/**\n\t * Get a specific key value.\n\t *\n\t * @param string $key Key to retrieve.\n\t *\n\t * @return mixed|null Value of the key or NULL\n\t */\n\tpublic function get($key)\n\t{\n\t\treturn isset($this->data[$key]) ? $this->data[$key] : null;\n\t}\n\t\n\t/**\n\t * Set a key value pair\n\t *\n\t * @param string $key   Key to set\n\t * @param mixed  $value Value to set\n\t *\n\t * @return Collection Returns a reference to the object\n\t */\n\tpublic function set($key, $value)\n\t{\n\t\t$this->data[$key] = $value;\n\t\t\n\t\treturn $this;\n\t}\n\t\n\t/**\n\t * Add a value to a key.  If a key of the same name has already been added, the key value will be converted into an\n\t * array and the new value will be pushed to the end of the array.\n\t *\n\t * @param string $key   Key to add\n\t * @param mixed  $value Value to add to the key\n\t *\n\t * @return Collection Returns a reference to the object.\n\t */\n\tpublic function add($key, $value)\n\t{\n\t\tif (!array_key_exists($key, $this->data)) {\n\t\t\t$this->data[$key] = $value;\n\t\t} elseif (is_array($this->data[$key])) {\n\t\t\t$this->data[$key][] = $value;\n\t\t} else {\n\t\t\t$this->data[$key] = [$this->data[$key], $value];\n\t\t}\n\t\t\n\t\treturn $this;\n\t}\n\t\n\t/**\n\t * Remove a specific key value pair\n\t *\n\t * @param string $key A key to remove\n\t *\n\t * @return Collection\n\t */\n\tpublic function remove($key)\n\t{\n\t\tunset($this->data[$key]);\n\t\t\n\t\treturn $this;\n\t}\n\t\n\t/**\n\t * Get all keys in the collection\n\t *\n\t * @return array\n\t */\n\tpublic function getKeys()\n\t{\n\t\treturn array_keys($this->data);\n\t}\n\t\n\t/**\n\t * Returns whether or not the specified key is present.\n\t *\n\t * @param string $key The key for which to check the existence.\n\t *\n\t * @return bool\n\t */\n\tpublic function hasKey($key)\n\t{\n\t\treturn array_key_exists($key, $this->data);\n\t}\n\t\n\t/**\n\t * Case insensitive search the keys in the collection\n\t *\n\t * @param string $key Key to search for\n\t *\n\t * @return bool|string Returns false if not found, otherwise returns the key\n\t */\n\tpublic function keySearch($key)\n\t{\n\t\tforeach (array_keys($this->data) as $k) {\n\t\t\tif (!strcasecmp($k, $key)) {\n\t\t\t\treturn $k;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t\n\t/**\n\t * Checks if any keys contains a certain value\n\t *\n\t * @param string $value Value to search for\n\t *\n\t * @return mixed Returns the key if the value was found FALSE if the value was not found.\n\t */\n\tpublic function hasValue($value)\n\t{\n\t\treturn array_search($value, $this->data);\n\t}\n\t\n\t/**\n\t * Replace the data of the object with the value of an array\n\t *\n\t * @param array $data Associative array of data\n\t *\n\t * @return Collection Returns a reference to the object\n\t */\n\tpublic function replace(array $data)\n\t{\n\t\t$this->data = $data;\n\t\t\n\t\treturn $this;\n\t}\n\t\n\t/**\n\t * Add and merge in a Collection or array of key value pair data.\n\t *\n\t * @param Collection|array $data Associative array of key value pair data\n\t *\n\t * @return Collection Returns a reference to the object.\n\t */\n\tpublic function merge($data)\n\t{\n\t\tforeach ($data as $key => $value) {\n\t\t\t$this->add($key, $value);\n\t\t}\n\t\t\n\t\treturn $this;\n\t}\n\t\n\t/**\n\t * Over write key value pairs in this collection with all of the data from an array or collection.\n\t *\n\t * @param array|\\Traversable $data Values to override over this config\n\t *\n\t * @return self\n\t */\n\tpublic function overwriteWith($data)\n\t{\n\t\tif (is_array($data)) {\n\t\t\t$this->data = $data + $this->data;\n\t\t} else {\n\t\t\tforeach ($data as $key => $value) {\n\t\t\t\t$this->data[$key] = $value;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn $this;\n\t}\n\t\n\t/**\n\t * Returns a Collection containing all the elements of the collection after applying the callback function to each\n\t * one. The Closure should accept three parameters: (string) $key, (string) $value, (array) $context and return a\n\t * modified value\n\t *\n\t * @param \\Closure $closure Closure to apply\n\t * @param array    $context Context to pass to the closure\n\t * @param bool     $static  Set to TRUE to use the same class as the return rather than returning a Collection\n\t *\n\t * @return Collection\n\t */\n\tpublic function map(\\Closure $closure, array $context = [], $static = true)\n\t{\n\t\t$collection = $static ? new static() : new self();\n\t\tforeach ($this as $key => $value) {\n\t\t\t$collection->add($key, $closure($key, $value, $context));\n\t\t}\n\t\t\n\t\treturn $collection;\n\t}\n\t\n\t/**\n\t * Iterates over each key value pair in the collection passing them to the Closure. If the  Closure function returns\n\t * true, the current value from input is returned into the result Collection.  The Closure must accept three\n\t * parameters: (string) $key, (string) $value and return Boolean TRUE or FALSE for each value.\n\t *\n\t * @param \\Closure $closure Closure evaluation function\n\t * @param bool     $static  Set to TRUE to use the same class as the return rather than returning a Collection\n\t *\n\t * @return Collection\n\t */\n\tpublic function filter(\\Closure $closure, $static = true)\n\t{\n\t\t$collection = ($static) ? new static() : new self();\n\t\tforeach ($this->data as $key => $value) {\n\t\t\tif ($closure($key, $value)) {\n\t\t\t\t$collection->add($key, $value);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn $collection;\n\t}\n\t\n\tpublic function offsetExists($offset)\n\t{\n\t\treturn isset($this->data[$offset]);\n\t}\n\t\n\tpublic function offsetGet($offset)\n\t{\n\t\treturn isset($this->data[$offset]) ? $this->data[$offset] : null;\n\t}\n\t\n\tpublic function offsetSet($offset, $value)\n\t{\n\t\t$this->data[$offset] = $value;\n\t}\n\t\n\tpublic function offsetUnset($offset)\n\t{\n\t\tunset($this->data[$offset]);\n\t}\n\t\n\t/**\n\t * Set a value into a nested array key. Keys will be created as needed to set the value.\n\t *\n\t * @param string $path  Path to set\n\t * @param mixed  $value Value to set at the key\n\t *\n\t * @return self\n\t * @throws \\RuntimeException when trying to setPath using a nested path that travels through a scalar value\n\t */\n\tpublic function setPath($path, $value)\n\t{\n\t\t$current =& $this->data;\n\t\t$queue = explode('/', $path);\n\t\twhile (null !== ($key = array_shift($queue))) {\n\t\t\tif (!is_array($current)) {\n\t\t\t\tthrow new \\RuntimeException(\"Trying to setPath {$path}, but {$key} is set and is not an array\");\n\t\t\t} elseif (!$queue) {\n\t\t\t\t$current[$key] = $value;\n\t\t\t} elseif (isset($current[$key])) {\n\t\t\t\t$current =& $current[$key];\n\t\t\t} else {\n\t\t\t\t$current[$key] = [];\n\t\t\t\t$current =& $current[$key];\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn $this;\n\t}\n\t\n\t/**\n\t * Gets a value from the collection using an array path (e.g. foo/baz/bar would retrieve bar from two nested arrays)\n\t * Allows for wildcard searches which recursively combine matches up to the level at which the wildcard occurs. This\n\t * can be useful for accepting any key of a sub-array and combining matching keys from each diverging path.\n\t *\n\t * @param string $path      Path to traverse and retrieve a value from\n\t * @param string $separator Character used to add depth to the search\n\t * @param mixed  $data      Optional data to descend into (used when wildcards are encountered)\n\t *\n\t * @return mixed|null\n\t */\n\tpublic function getPath($path, $separator = '/', $data = null)\n\t{\n\t\tif ($data === null) {\n\t\t\t$data =& $this->data;\n\t\t}\n\t\t\n\t\t$path = is_array($path) ? $path : explode($separator, $path);\n\t\twhile (null !== ($part = array_shift($path))) {\n\t\t\tif (!is_array($data)) {\n\t\t\t\treturn null;\n\t\t\t} elseif (isset($data[$part])) {\n\t\t\t\t$data =& $data[$part];\n\t\t\t} elseif ($part != '*') {\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\t// Perform a wildcard search by diverging and merging paths\n\t\t\t\t$result = [];\n\t\t\t\tforeach ($data as $value) {\n\t\t\t\t\tif (!$path) {\n\t\t\t\t\t\t$result = array_merge_recursive($result, (array) $value);\n\t\t\t\t\t} elseif (null !== ($test = $this->getPath($path, $separator, $value))) {\n\t\t\t\t\t\t$result = array_merge_recursive($result, (array) $test);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn $result;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn $data;\n\t}\n\t\n\t/**\n\t * Provides debug information about the model object\n\t *\n\t * @return string\n\t */\n\tpublic function __toString()\n\t{\n\t\t$output = 'Debug output of ';\n\t\t$output .= 'model';\n\t\t$output = str_repeat('=', strlen($output)) . \"\\n\" . $output . \"\\n\" . str_repeat('=', strlen($output)) . \"\\n\\n\";\n\t\t$output .= \"Model data\\n-----------\\n\\n\";\n\t\t$output .= \"This data can be retrieved from the model object using the get() method of the model \"\n\t\t\t\t. \"(e.g. \\$model->get(\\$key)) or accessing the model like an associative array (e.g. \\$model['key']).\\n\\n\";\n\t\t$lines = array_slice(explode(\"\\n\", trim(print_r($this->toArray(), true))), 2, -1);\n\t\t$output .=  implode(\"\\n\", $lines);\n\t\t\n\t\treturn $output . \"\\n\";\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Common/ObsTransform.php",
    "content": "<?php\nnamespace Obs\\Internal\\Common;\n\nuse Obs\\ObsClient;\n\nclass ObsTransform implements ITransform {\n    private static $instance;\n    \n    private function __construct(){}\n    \n    public static function getInstance() {\n        if (!(self::$instance instanceof ObsTransform)) {\n            self::$instance = new ObsTransform();\n        }\n        return self::$instance;\n    }\n     \n    \n    public function transform($sign, $para) {\n        if ($sign === 'aclHeader') {\n            $para = $this->transAclHeader($para);\n        } else if ($sign === 'aclUri') {\n            $para = $this->transAclGroupUri($para);\n        } else if ($sign == 'event') {\n            $para = $this->transNotificationEvent($para);\n        }\n        return $para;\n    }\n    \n    private function transAclHeader($para) {\n        if ($para === ObsClient::AclAuthenticatedRead || $para === ObsClient::AclBucketOwnerRead || \n                $para === ObsClient::AclBucketOwnerFullControl || $para === ObsClient::AclLogDeliveryWrite) {\n            $para = null;\n        }\n        return $para;\n    }\n    \n    private function transAclGroupUri($para) {\n        if ($para === ObsClient::GroupAllUsers) {\n            $para = ObsClient::AllUsers;\n        }\n        return $para;\n    }\n    \n    private function transNotificationEvent($para) {\n        $pos = strpos($para, 's3:');\n        if ($pos !== false && $pos === 0) {\n            $para = substr($para, 3);\n        }\n        return $para;\n    }\n}\n\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Common/SchemaFormatter.php",
    "content": "<?php\n\nnamespace Obs\\Internal\\Common;\n\n\n/**\n * JSON Schema formatter class\n */\nclass SchemaFormatter\n{\n    /** @var \\DateTimeZone */\n    protected static $utcTimeZone;\n\n    /**\n     * Format a value by a registered format name\n     *\n     * @param string $format Registered format used to format the value\n     * @param mixed  $value  Value being formatted\n     *\n     * @return mixed\n     */\n    public static function format($format, $value)\n    {\n        switch ($format) {\n            case 'date-time':\n                return self::formatDateTime($value);\n            case 'date-time-http':\n                return self::formatDateTimeHttp($value);\n            case 'date':\n                return self::formatDate($value);\n            case 'time':\n                return self::formatTime($value);\n            case 'timestamp':\n                return self::formatTimestamp($value);\n            case 'boolean-string':\n                return self::formatBooleanAsString($value);\n            case 'date-time-middle':\n            \treturn self::formatDateTimeMiddle($value);\n            default:\n                return $value;\n        }\n    }\n    \n    /**\n     * Treat $dateTime as UTC time\n     * @param unknown $dateTime\n     * @return unknown|NULL\n     */\n    public static function formatDateTimeMiddle($dateTime)\n    {\n    \tif (is_string($dateTime)) {\n    \t\t$dateTime = new \\DateTime($dateTime);\n    \t}\n    \t\n    \tif ($dateTime instanceof \\DateTime) {\n    \t\treturn $dateTime -> format('Y-m-d\\T00:00:00\\Z');\n    \t}\n    \treturn null;\n    }\n\n    /**\n     * Create a ISO 8601 (YYYY-MM-DDThh:mm:ssZ) formatted date time value in UTC time\n     *\n     * @param string|integer|\\DateTime $value Date time value\n     *\n     * @return string\n     */\n    public static function formatDateTime($value)\n    {\n        return self::dateFormatter($value, 'Y-m-d\\TH:i:s\\Z');\n    }\n\n    /**\n     * Create an HTTP date (RFC 1123 / RFC 822) formatted UTC date-time string\n     *\n     * @param string|integer|\\DateTime $value Date time value\n     *\n     * @return string\n     */\n    public static function formatDateTimeHttp($value)\n    {\n        return self::dateFormatter($value, 'D, d M Y H:i:s \\G\\M\\T');\n    }\n\n    /**\n     * Create a YYYY-MM-DD formatted string\n     *\n     * @param string|integer|\\DateTime $value Date time value\n     *\n     * @return string\n     */\n    public static function formatDate($value)\n    {\n        return self::dateFormatter($value, 'Y-m-d');\n    }\n\n    /**\n     * Create a hh:mm:ss formatted string\n     *\n     * @param string|integer|\\DateTime $value Date time value\n     *\n     * @return string\n     */\n    public static function formatTime($value)\n    {\n        return self::dateFormatter($value, 'H:i:s');\n    }\n\n    /**\n     * Formats a boolean value as a string\n     *\n     * @param string|integer|bool $value Value to convert to a boolean 'true' / 'false' value\n     *\n     * @return string\n     */\n    public static function formatBooleanAsString($value)\n    {\n        return filter_var($value, FILTER_VALIDATE_BOOLEAN) ? 'true' : 'false';\n    }\n\n    /**\n     * Return a UNIX timestamp in the UTC timezone\n     *\n     * @param string|integer|\\DateTime $value Time value\n     *\n     * @return int\n     */\n    public static function formatTimestamp($value)\n    {\n        return (int) self::dateFormatter($value, 'U');\n    }\n\n    /**\n     * Get a UTC DateTimeZone object\n     *\n     * @return \\DateTimeZone\n     */\n    protected static function getUtcTimeZone()\n    {\n        // @codeCoverageIgnoreStart\n        if (!self::$utcTimeZone) {\n            self::$utcTimeZone = new \\DateTimeZone('UTC');\n        }\n        // @codeCoverageIgnoreEnd\n\n        return self::$utcTimeZone;\n    }\n\n    /**\n     * Perform the actual DateTime formatting\n     *\n     * @param int|string|\\DateTime $dateTime Date time value\n     * @param string               $format   Format of the result\n     *\n     * @return string\n     * @throws InvalidArgumentException\n     */\n    protected static function dateFormatter($dateTime, $format)\n    {\n        if (is_numeric($dateTime)) {\n            return gmdate($format, (int) $dateTime);\n        }\n\n        if (is_string($dateTime)) {\n            $dateTime = new \\DateTime($dateTime);\n        }\n\n        if ($dateTime instanceof \\DateTime) {\n            return $dateTime->setTimezone(self::getUtcTimeZone())->format($format);\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Common/SdkCurlFactory.php",
    "content": "<?php\nnamespace Obs\\Internal\\Common;\n\nuse GuzzleHttp\\Psr7;\nuse GuzzleHttp\\Psr7\\LazyOpenStream;\nuse Psr\\Http\\Message\\RequestInterface;\nuse GuzzleHttp\\Handler\\CurlFactoryInterface;\nuse GuzzleHttp\\Handler\\EasyHandle;\n\n/**\n * Creates curl resources from a request\n */\nclass SdkCurlFactory implements CurlFactoryInterface\n{\n    /** @var array */\n    private $handles = [];\n\n    /** @var int Total number of idle handles to keep in cache */\n    private $maxHandles;\n\n    /**\n     * @param int $maxHandles Maximum number of idle handles.\n     */\n    public function __construct($maxHandles)\n    {\n        $this->maxHandles = $maxHandles;\n    }\n\n    public function create(RequestInterface $request, array $options)\n    {\n        if (isset($options['curl']['body_as_string'])) {\n            $options['_body_as_string'] = $options['curl']['body_as_string'];\n            unset($options['curl']['body_as_string']);\n        }\n        \n        $easy = new EasyHandle;\n        $easy->request = $request;\n        $easy->options = $options;\n        $conf = $this->getDefaultConf($easy);\n        $this->applyMethod($easy, $conf);\n        $this->applyHandlerOptions($easy, $conf);\n        $this->applyHeaders($easy, $conf);\n        \n        \n        unset($conf['_headers']);\n\n        if (isset($options['curl'])) {\n            $conf = array_replace($conf, $options['curl']);\n        }\n\n        $conf[CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy);\n        if($this->handles){\n           $easy->handle = array_pop($this->handles);\n        }else{\n           $easy->handle = curl_init();\n        }\n        curl_setopt_array($easy->handle, $conf);\n\n        return $easy;\n    }\n    \n    public function close()\n    {\n    \tif($this->handles){\n    \t\tforeach ($this->handles as $handle){\n    \t\t\tcurl_close($handle);\n    \t\t}\n \t\t\tunset($this->handles);\n \t\t\t$this->handles = [];\n    \t}\n    }\n\n    public function release(EasyHandle $easy)\n    {\n        $resource = $easy->handle;\n        unset($easy->handle);\n\n        if (count($this->handles) >= $this->maxHandles) {\n            curl_close($resource);\n        } else {\n            curl_setopt($resource, CURLOPT_HEADERFUNCTION, null);\n            curl_setopt($resource, CURLOPT_READFUNCTION, null);\n            curl_setopt($resource, CURLOPT_WRITEFUNCTION, null);\n            curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, null);\n            curl_reset($resource);\n            $this->handles[] = $resource;\n        }\n    }\n\n    private function getDefaultConf(EasyHandle $easy)\n    {\n        $conf = [\n            '_headers'             => $easy->request->getHeaders(),\n            CURLOPT_CUSTOMREQUEST  => $easy->request->getMethod(),\n            CURLOPT_URL            => (string) $easy->request->getUri()->withFragment(''),\n            CURLOPT_RETURNTRANSFER => false,\n            CURLOPT_HEADER         => false,\n            CURLOPT_CONNECTTIMEOUT => 150,\n        ];\n\n        if (defined('CURLOPT_PROTOCOLS')) {\n            $conf[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS;\n        }\n\n        $version = $easy->request->getProtocolVersion();\n        if ($version == 1.1) {\n            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1;\n        } elseif ($version == 2.0) {\n            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2_0;\n        } else {\n            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0;\n        }\n\n        return $conf;\n    }\n\n    private function applyMethod(EasyHandle $easy, array &$conf)\n    {\n        $body = $easy->request->getBody();\n        $size = $body->getSize();\n        \n        if ($size === null || $size > 0) {\n            $this->applyBody($easy->request, $easy->options, $conf);\n            return;\n        }\n\n        $method = $easy->request->getMethod();\n        if ($method === 'PUT' || $method === 'POST') {\n            if (!$easy->request->hasHeader('Content-Length')) {\n                $conf[CURLOPT_HTTPHEADER][] = 'Content-Length: 0';\n            }\n        } elseif ($method === 'HEAD') {\n            $conf[CURLOPT_NOBODY] = true;\n            unset(\n                $conf[CURLOPT_WRITEFUNCTION],\n                $conf[CURLOPT_READFUNCTION],\n                $conf[CURLOPT_FILE],\n                $conf[CURLOPT_INFILE]\n            );\n        }\n    }\n\n    private function applyBody(RequestInterface $request, array $options, array &$conf)\n    {\n        $size = $request->hasHeader('Content-Length')\n            ? (int) $request->getHeaderLine('Content-Length')\n            : $request->getBody()->getSize();\n\t\t            \n        if($request->getBody()->getSize() === $size && $request -> getBody() ->tell() <= 0){\n\t        if (($size !== null && $size < 1000000) ||\n\t            !empty($options['_body_as_string'])\n\t        ) {\n\t            $conf[CURLOPT_POSTFIELDS] = (string) $request->getBody();\n\t            $this->removeHeader('Content-Length', $conf);\n\t            $this->removeHeader('Transfer-Encoding', $conf);\n\t        } else {\n\t            $conf[CURLOPT_UPLOAD] = true;\n\t            if ($size !== null) {\n\t                $conf[CURLOPT_INFILESIZE] = $size;\n\t                $this->removeHeader('Content-Length', $conf);\n\t            }\n\t            $body = $request->getBody();\n\t            if ($body->isSeekable()) {\n\t                $body->rewind();\n\t            }\n\t            $conf[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) {\n\t                return $body->read($length);\n\t            };\n\t        }\n        }else{\n        \t$body = $request->getBody();\n        \t$conf[CURLOPT_UPLOAD] = true;\n        \t$conf[CURLOPT_INFILESIZE] = $size;\n        \t$readCount = 0;\n        \t$conf[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body, $readCount, $size) {\n        \t\tif($readCount >= $size){\n        \t\t\t$body -> close();\n        \t\t\treturn '';\n        \t\t}\n        \t\t$readCountOnce = $length <= $size ? $length : $size;\n        \t\t$readCount += $readCountOnce;\n        \t\treturn $body->read($readCountOnce);\n        \t};\n        }\n            \n            \n\n        if (!$request->hasHeader('Expect')) {\n            $conf[CURLOPT_HTTPHEADER][] = 'Expect:';\n        }\n\n        if (!$request->hasHeader('Content-Type')) {\n            $conf[CURLOPT_HTTPHEADER][] = 'Content-Type:';\n        }\n    }\n\n    private function applyHeaders(EasyHandle $easy, array &$conf)\n    {\n        foreach ($conf['_headers'] as $name => $values) {\n            foreach ($values as $value) {\n                $conf[CURLOPT_HTTPHEADER][] = \"$name: $value\";\n            }\n        }\n\n        // Remove the Accept header if one was not set\n        if (!$easy->request->hasHeader('Accept')) {\n            $conf[CURLOPT_HTTPHEADER][] = 'Accept:';\n        }\n    }\n\n    /**\n     * Remove a header from the options array.\n     *\n     * @param string $name    Case-insensitive header to remove\n     * @param array  $options Array of options to modify\n     */\n    private function removeHeader($name, array &$options)\n    {\n        foreach (array_keys($options['_headers']) as $key) {\n            if (!strcasecmp($key, $name)) {\n                unset($options['_headers'][$key]);\n                return;\n            }\n        }\n    }\n\n    private function applyHandlerOptions(EasyHandle $easy, array &$conf)\n    {\n        $options = $easy->options;\n        if (isset($options['verify'])) {\n        \t$conf[CURLOPT_SSL_VERIFYHOST] = 0;\n            if ($options['verify'] === false) {\n                unset($conf[CURLOPT_CAINFO]);\n                $conf[CURLOPT_SSL_VERIFYPEER] = false;\n            } else {\n                $conf[CURLOPT_SSL_VERIFYPEER] = true;\n                if (is_string($options['verify'])) {\n                    if (!file_exists($options['verify'])) {\n                        throw new \\InvalidArgumentException(\n                            \"SSL CA bundle not found: {$options['verify']}\"\n                        );\n                    }\n                    if (is_dir($options['verify']) ||\n                        (is_link($options['verify']) && is_dir(readlink($options['verify'])))) {\n                        $conf[CURLOPT_CAPATH] = $options['verify'];\n                    } else {\n                        $conf[CURLOPT_CAINFO] = $options['verify'];\n                    }\n                }\n            }\n        }\n\n        if (!empty($options['decode_content'])) {\n            $accept = $easy->request->getHeaderLine('Accept-Encoding');\n            if ($accept) {\n                $conf[CURLOPT_ENCODING] = $accept;\n            } else {\n                $conf[CURLOPT_ENCODING] = '';\n                $conf[CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';\n            }\n        }\n\n        if (isset($options['sink'])) {\n            $sink = $options['sink'];\n            if (!is_string($sink)) {\n                $sink = \\GuzzleHttp\\Psr7\\stream_for($sink);\n            } elseif (!is_dir(dirname($sink))) {\n                throw new \\RuntimeException(sprintf(\n                    'Directory %s does not exist for sink value of %s',\n                    dirname($sink),\n                    $sink\n                ));\n            } else {\n                $sink = new LazyOpenStream($sink, 'w+');\n            }\n            $easy->sink = $sink;\n            $conf[CURLOPT_WRITEFUNCTION] = function ($ch, $write) use ($sink) {\n                return $sink->write($write);\n            };\n        } else {\n            $conf[CURLOPT_FILE] = fopen('php://temp', 'w+');\n            $easy->sink = Psr7\\stream_for($conf[CURLOPT_FILE]);\n        }\n        $timeoutRequiresNoSignal = false;\n        if (isset($options['timeout'])) {\n            $timeoutRequiresNoSignal |= $options['timeout'] < 1;\n            $conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;\n        }\n\n        if (isset($options['force_ip_resolve'])) {\n            if ('v4' === $options['force_ip_resolve']) {\n                $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;\n            } else if ('v6' === $options['force_ip_resolve']) {\n                $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6;\n            }\n        }\n\n        if (isset($options['connect_timeout'])) {\n            $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1;\n            $conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;\n        }\n\n        if ($timeoutRequiresNoSignal && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') {\n            $conf[CURLOPT_NOSIGNAL] = true;\n        }\n\n        if (isset($options['proxy'])) {\n            if (!is_array($options['proxy'])) {\n                $conf[CURLOPT_PROXY] = $options['proxy'];\n            } else {\n                $scheme = $easy->request->getUri()->getScheme();\n                if (isset($options['proxy'][$scheme])) {\n                    $host = $easy->request->getUri()->getHost();\n                    if (!isset($options['proxy']['no']) ||\n                        !\\GuzzleHttp\\is_host_in_noproxy($host, $options['proxy']['no'])\n                    ) {\n                        $conf[CURLOPT_PROXY] = $options['proxy'][$scheme];\n                    }\n                }\n            }\n        }\n\n        if (isset($options['cert'])) {\n            $cert = $options['cert'];\n            if (is_array($cert)) {\n                $conf[CURLOPT_SSLCERTPASSWD] = $cert[1];\n                $cert = $cert[0];\n            }\n            if (!file_exists($cert)) {\n                throw new \\InvalidArgumentException(\n                    \"SSL certificate not found: {$cert}\"\n                );\n            }\n            $conf[CURLOPT_SSLCERT] = $cert;\n        }\n\n        if (isset($options['ssl_key'])) {\n            $sslKey = $options['ssl_key'];\n            if (is_array($sslKey)) {\n                $conf[CURLOPT_SSLKEYPASSWD] = $sslKey[1];\n                $sslKey = $sslKey[0];\n            }\n            if (!file_exists($sslKey)) {\n                throw new \\InvalidArgumentException(\n                    \"SSL private key not found: {$sslKey}\"\n                );\n            }\n            $conf[CURLOPT_SSLKEY] = $sslKey;\n        }\n\n        if (isset($options['progress'])) {\n            $progress = $options['progress'];\n            if (!is_callable($progress)) {\n                throw new \\InvalidArgumentException(\n                    'progress client option must be callable'\n                );\n            }\n            $conf[CURLOPT_NOPROGRESS] = false;\n            $conf[CURLOPT_PROGRESSFUNCTION] = function () use ($progress) {\n                $args = func_get_args();\n                if (is_resource($args[0])) {\n                    array_shift($args);\n                }\n                call_user_func_array($progress, $args);\n            };\n        }\n\n        if (!empty($options['debug'])) {\n            $conf[CURLOPT_STDERR] = \\GuzzleHttp\\debug_resource($options['debug']);\n            $conf[CURLOPT_VERBOSE] = true;\n        }\n    }\n\n\n    private function createHeaderFn(EasyHandle $easy)\n    {\n        if (isset($easy->options['on_headers'])) {\n            $onHeaders = $easy->options['on_headers'];\n\n            if (!is_callable($onHeaders)) {\n                throw new \\InvalidArgumentException('on_headers must be callable');\n            }\n        } else {\n            $onHeaders = null;\n        }\n\n        return function ($ch, $h) use (\n            $onHeaders,\n            $easy,\n            &$startingResponse\n        ) {\n            $value = trim($h);\n            if ($value === '') {\n                $startingResponse = true;\n                $easy->createResponse();\n                if ($onHeaders !== null) {\n                    try {\n                        $onHeaders($easy->response);\n                    } catch (\\Exception $e) {\n                        $easy->onHeadersException = $e;\n                        return -1;\n                    }\n                }\n            } elseif ($startingResponse) {\n                $startingResponse = false;\n                $easy->headers = [$value];\n            } else {\n                $easy->headers[] = $value;\n            }\n            return strlen($h);\n        };\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Common/SdkStreamHandler.php",
    "content": "<?php\n\nnamespace Obs\\Internal\\Common;\n\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Exception\\ConnectException;\nuse GuzzleHttp\\Promise\\FulfilledPromise;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Psr7;\nuse GuzzleHttp\\TransferStats;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * HTTP handler that uses PHP's HTTP stream wrapper.\n */\nclass SdkStreamHandler\n{\n    private $lastHeaders = [];\n\n    /**\n     * Sends an HTTP request.\n     *\n     * @param RequestInterface $request Request to send.\n     * @param array            $options Request transfer options.\n     *\n     * @return PromiseInterface\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        if (isset($options['delay'])) {\n            usleep($options['delay'] * 1000);\n        }\n\n        $startTime = isset($options['on_stats']) ? microtime(true) : null;\n\n        try {\n            $request = $request->withoutHeader('Expect');\n\n            if (0 === $request->getBody()->getSize()) {\n                $request = $request->withHeader('Content-Length', 0);\n            }\n\n            return $this->createResponse(\n                $request,\n                $options,\n                $this->createStream($request, $options),\n                $startTime\n            );\n        } catch (\\InvalidArgumentException $e) {\n            throw $e;\n        } catch (\\Exception $e) {\n            $message = $e->getMessage();\n            if (strpos($message, 'getaddrinfo')\n                || strpos($message, 'Connection refused')\n                || strpos($message, \"couldn't connect to host\")\n            ) {\n                $e = new ConnectException($e->getMessage(), $request, $e);\n            }\n            $e = RequestException::wrapException($request, $e);\n            $this->invokeStats($options, $request, $startTime, null, $e);\n\n            return \\GuzzleHttp\\Promise\\rejection_for($e);\n        }\n    }\n\n    private function invokeStats(\n        array $options,\n        RequestInterface $request,\n        $startTime,\n        ResponseInterface $response = null,\n        $error = null\n    ) {\n        if (isset($options['on_stats'])) {\n            $stats = new TransferStats(\n                $request,\n                $response,\n                microtime(true) - $startTime,\n                $error,\n                []\n            );\n            call_user_func($options['on_stats'], $stats);\n        }\n    }\n\n    private function createResponse(\n        RequestInterface $request,\n        array $options,\n        $stream,\n        $startTime\n    ) {\n        $hdrs = $this->lastHeaders;\n        $this->lastHeaders = [];\n        $parts = explode(' ', array_shift($hdrs), 3);\n        $ver = explode('/', $parts[0])[1];\n        $status = $parts[1];\n        $reason = isset($parts[2]) ? $parts[2] : null;\n        $headers = \\GuzzleHttp\\headers_from_lines($hdrs);\n        list ($stream, $headers) = $this->checkDecode($options, $headers, $stream);\n        $stream = Psr7\\stream_for($stream);\n        $sink = $stream;\n\n        if (strcasecmp('HEAD', $request->getMethod())) {\n            $sink = $this->createSink($stream, $options);\n        }\n\n        $response = new Psr7\\Response($status, $headers, $sink, $ver, $reason);\n\n        if (isset($options['on_headers'])) {\n            try {\n                $options['on_headers']($response);\n            } catch (\\Exception $e) {\n                $msg = 'An error was encountered during the on_headers event';\n                $ex = new RequestException($msg, $request, $response, $e);\n                return \\GuzzleHttp\\Promise\\rejection_for($ex);\n            }\n        }\n\n        if ($sink !== $stream) {\n            $this->drain(\n                $stream,\n                $sink,\n                $response->getHeaderLine('Content-Length')\n            );\n        }\n\n        $this->invokeStats($options, $request, $startTime, $response, null);\n\n        return new FulfilledPromise($response);\n    }\n\n    private function createSink(StreamInterface $stream, array $options)\n    {\n        if (!empty($options['stream'])) {\n            return $stream;\n        }\n\n        $sink = isset($options['sink'])\n            ? $options['sink']\n            : fopen('php://temp', 'r+');\n\n        return is_string($sink)\n            ? new Psr7\\LazyOpenStream($sink, 'w+')\n            : Psr7\\stream_for($sink);\n    }\n\n    private function checkDecode(array $options, array $headers, $stream)\n    {\n        if (!empty($options['decode_content'])) {\n            $normalizedKeys = \\GuzzleHttp\\normalize_header_keys($headers);\n            if (isset($normalizedKeys['content-encoding'])) {\n                $encoding = $headers[$normalizedKeys['content-encoding']];\n                if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') {\n                    $stream = new Psr7\\InflateStream(\n                        Psr7\\stream_for($stream)\n                    );\n                    $headers['x-encoded-content-encoding']\n                        = $headers[$normalizedKeys['content-encoding']];\n                    unset($headers[$normalizedKeys['content-encoding']]);\n                    if (isset($normalizedKeys['content-length'])) {\n                        $headers['x-encoded-content-length']\n                            = $headers[$normalizedKeys['content-length']];\n\n                        $length = (int) $stream->getSize();\n                        if ($length === 0) {\n                            unset($headers[$normalizedKeys['content-length']]);\n                        } else {\n                            $headers[$normalizedKeys['content-length']] = [$length];\n                        }\n                    }\n                }\n            }\n        }\n\n        return [$stream, $headers];\n    }\n\n    /**\n     * Drains the source stream into the \"sink\" client option.\n     *\n     * @param StreamInterface $source\n     * @param StreamInterface $sink\n     * @param string          $contentLength Header specifying the amount of\n     *                                       data to read.\n     *\n     * @return StreamInterface\n     * @throws \\RuntimeException when the sink option is invalid.\n     */\n    private function drain(\n        StreamInterface $source,\n        StreamInterface $sink,\n        $contentLength\n    ) {\n        Psr7\\copy_to_stream(\n            $source,\n            $sink,\n            (strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1\n        );\n\n        $sink->seek(0);\n        $source->close();\n\n        return $sink;\n    }\n\n    /**\n     * Create a resource and check to ensure it was created successfully\n     *\n     * @param callable $callback Callable that returns stream resource\n     *\n     * @return resource\n     * @throws \\RuntimeException on error\n     */\n    private function createResource(callable $callback)\n    {\n        $errors = null;\n        set_error_handler(function ($_, $msg, $file, $line) use (&$errors) {\n            $errors[] = [\n                'message' => $msg,\n                'file'    => $file,\n                'line'    => $line\n            ];\n            return true;\n        });\n\n        $resource = $callback();\n        restore_error_handler();\n\n        if (!$resource) {\n            $message = 'Error creating resource: ';\n            foreach ($errors as $err) {\n                foreach ($err as $key => $value) {\n                    $message .= \"[$key] $value\" . PHP_EOL;\n                }\n            }\n            throw new \\RuntimeException(trim($message));\n        }\n\n        return $resource;\n    }\n\n    private function createStream(RequestInterface $request, array $options)\n    {\n        static $methods;\n        if (!$methods) {\n            $methods = array_flip(get_class_methods(__CLASS__));\n        }\n\n        if ($request->getProtocolVersion() == '1.1'\n            && !$request->hasHeader('Connection')\n        ) {\n            $request = $request->withHeader('Connection', 'close');\n        }\n\n        if (!isset($options['verify'])) {\n            $options['verify'] = true;\n        }\n\n        $params = [];\n        $context = $this->getDefaultContext($request, $options);\n\n        if (isset($options['on_headers']) && !is_callable($options['on_headers'])) {\n            throw new \\InvalidArgumentException('on_headers must be callable');\n        }\n\n        if (!empty($options)) {\n            foreach ($options as $key => $value) {\n                $method = \"add_{$key}\";\n                if (isset($methods[$method])) {\n                    $this->{$method}($request, $context, $value, $params);\n                }\n            }\n        }\n\n        if (isset($options['stream_context'])) {\n            if (!is_array($options['stream_context'])) {\n                throw new \\InvalidArgumentException('stream_context must be an array');\n            }\n            $context = array_replace_recursive(\n                $context,\n                $options['stream_context']\n            );\n        }\n\n        if (isset($options['auth'])\n            && is_array($options['auth'])\n            && isset($options['auth'][2])\n            && 'ntlm' == $options['auth'][2]\n        ) {\n\n            throw new \\InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler');\n        }\n\n        $uri = $this->resolveHost($request, $options);\n\n        $context = $this->createResource(\n            function () use ($context, $params) {\n                return stream_context_create($context, $params);\n            }\n        );\n\n        return $this->createResource(\n            function () use ($uri, &$http_response_header, $context, $options) {\n                $resource = fopen((string) $uri, 'r', null, $context);\n                $this->lastHeaders = $http_response_header;\n\n                if (isset($options['read_timeout'])) {\n                    $readTimeout = $options['read_timeout'];\n                    $sec = (int) $readTimeout;\n                    $usec = ($readTimeout - $sec) * 100000;\n                    stream_set_timeout($resource, $sec, $usec);\n                }\n\n                return $resource;\n            }\n        );\n    }\n\n    private function resolveHost(RequestInterface $request, array $options)\n    {\n        $uri = $request->getUri();\n\n        if (isset($options['force_ip_resolve']) && !filter_var($uri->getHost(), FILTER_VALIDATE_IP)) {\n            if ('v4' === $options['force_ip_resolve']) {\n                $records = dns_get_record($uri->getHost(), DNS_A);\n                if (!isset($records[0]['ip'])) {\n                    throw new ConnectException(sprintf(\"Could not resolve IPv4 address for host '%s'\", $uri->getHost()), $request);\n                }\n                $uri = $uri->withHost($records[0]['ip']);\n            } elseif ('v6' === $options['force_ip_resolve']) {\n                $records = dns_get_record($uri->getHost(), DNS_AAAA);\n                if (!isset($records[0]['ipv6'])) {\n                    throw new ConnectException(sprintf(\"Could not resolve IPv6 address for host '%s'\", $uri->getHost()), $request);\n                }\n                $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']');\n            }\n        }\n\n        return $uri;\n    }\n\n    private function getDefaultContext(RequestInterface $request)\n    {\n        $headers = '';\n        foreach ($request->getHeaders() as $name => $value) {\n            foreach ($value as $val) {\n                $headers .= \"$name: $val\\r\\n\";\n            }\n        }\n\n        $context = [\n            'http' => [\n                'method'           => $request->getMethod(),\n                'header'           => $headers,\n                'protocol_version' => $request->getProtocolVersion(),\n                'ignore_errors'    => true,\n                'follow_location'  => 0,\n            ],\n        ];\n\n        $body = (string) $request->getBody();\n\n        if (!empty($body)) {\n            $context['http']['content'] = $body;\n            if (!$request->hasHeader('Content-Type')) {\n                $context['http']['header'] .= \"Content-Type:\\r\\n\";\n            }\n        }\n\n        $context['http']['header'] = rtrim($context['http']['header']);\n\n        return $context;\n    }\n\n    private function add_proxy(RequestInterface $request, &$options, $value, &$params)\n    {\n        if (!is_array($value)) {\n            $options['http']['proxy'] = $value;\n        } else {\n            $scheme = $request->getUri()->getScheme();\n            if (isset($value[$scheme])) {\n                if (!isset($value['no'])\n                    || !\\GuzzleHttp\\is_host_in_noproxy(\n                        $request->getUri()->getHost(),\n                        $value['no']\n                    )\n                ) {\n                    $options['http']['proxy'] = $value[$scheme];\n                }\n            }\n        }\n    }\n\n    private function add_timeout(RequestInterface $request, &$options, $value, &$params)\n    {\n        if ($value > 0) {\n            $options['http']['timeout'] = $value;\n        }\n    }\n\n    private function add_verify(RequestInterface $request, &$options, $value, &$params)\n    {\n        if ($value === true) {\n            if (PHP_VERSION_ID < 50600) {\n                $options['ssl']['cafile'] = \\GuzzleHttp\\default_ca_bundle();\n            }\n        } elseif (is_string($value)) {\n            $options['ssl']['cafile'] = $value;\n            if (!file_exists($value)) {\n                throw new \\RuntimeException(\"SSL CA bundle not found: $value\");\n            }\n        } elseif ($value === false) {\n            $options['ssl']['verify_peer'] = false;\n            $options['ssl']['verify_peer_name'] = false;\n            return;\n        } else {\n            throw new \\InvalidArgumentException('Invalid verify request option');\n        }\n\n        $options['ssl']['verify_peer'] = true;\n        $options['ssl']['verify_peer_name'] = true;\n        $options['ssl']['allow_self_signed'] = false;\n    }\n\n    private function add_cert(RequestInterface $request, &$options, $value, &$params)\n    {\n        if (is_array($value)) {\n            $options['ssl']['passphrase'] = $value[1];\n            $value = $value[0];\n        }\n\n        if (!file_exists($value)) {\n            throw new \\RuntimeException(\"SSL certificate not found: {$value}\");\n        }\n\n        $options['ssl']['local_cert'] = $value;\n    }\n\n    private function add_progress(RequestInterface $request, &$options, $value, &$params)\n    {\n        $this->addNotification(\n            $params,\n            function ($code, $a, $b, $c, $transferred, $total) use ($value) {\n                if ($code == STREAM_NOTIFY_PROGRESS) {\n                    $value($total, $transferred, null, null);\n                }\n            }\n        );\n    }\n\n    private function add_debug(RequestInterface $request, &$options, $value, &$params)\n    {\n        if ($value === false) {\n            return;\n        }\n\n        static $map = [\n            STREAM_NOTIFY_CONNECT       => 'CONNECT',\n            STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',\n            STREAM_NOTIFY_AUTH_RESULT   => 'AUTH_RESULT',\n            STREAM_NOTIFY_MIME_TYPE_IS  => 'MIME_TYPE_IS',\n            STREAM_NOTIFY_FILE_SIZE_IS  => 'FILE_SIZE_IS',\n            STREAM_NOTIFY_REDIRECTED    => 'REDIRECTED',\n            STREAM_NOTIFY_PROGRESS      => 'PROGRESS',\n            STREAM_NOTIFY_FAILURE       => 'FAILURE',\n            STREAM_NOTIFY_COMPLETED     => 'COMPLETED',\n            STREAM_NOTIFY_RESOLVE       => 'RESOLVE',\n        ];\n        static $args = ['severity', 'message', 'message_code',\n            'bytes_transferred', 'bytes_max'];\n\n        $value = \\GuzzleHttp\\debug_resource($value);\n        $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment('');\n        $this->addNotification(\n            $params,\n            function () use ($ident, $value, $map, $args) {\n                $passed = func_get_args();\n                $code = array_shift($passed);\n                fprintf($value, '<%s> [%s] ', $ident, $map[$code]);\n                foreach (array_filter($passed) as $i => $v) {\n                    fwrite($value, $args[$i] . ': \"' . $v . '\" ');\n                }\n                fwrite($value, \"\\n\");\n            }\n        );\n    }\n\n    private function addNotification(array &$params, callable $notify)\n    {\n        if (!isset($params['notification'])) {\n            $params['notification'] = $notify;\n        } else {\n            $params['notification'] = $this->callArray([\n                $params['notification'],\n                $notify\n            ]);\n        }\n    }\n\n    private function callArray(array $functions)\n    {\n        return function () use ($functions) {\n            $args = func_get_args();\n            foreach ($functions as $fn) {\n                call_user_func_array($fn, $args);\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Common/ToArrayInterface.php",
    "content": "<?php\n\nnamespace Obs\\Internal\\Common;\n\n/**\n * An object that can be represented as an array\n */\ninterface ToArrayInterface\n{\n\t/**\n\t * Get the array representation of an object\n\t *\n\t * @return array\n\t */\n\tpublic function toArray();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Common/V2Transform.php",
    "content": "<?php\nnamespace Obs\\Internal\\Common;\n\nuse Obs\\ObsClient;\nuse Obs\\Internal\\Resource\\V2Constants;\n\nclass V2Transform implements ITransform{\n    private static $instance;\n    \n    private function __construct(){}\n    \n    public static function getInstance() {\n        if (!(self::$instance instanceof V2Transform)) {\n            self::$instance = new V2Transform();\n        }\n        return self::$instance;\n    }\n     \n    public function transform($sign, $para) {\n        if ($sign === 'storageClass') {\n            $para = $this->transStorageClass($para);\n        } else if ($sign === 'aclHeader') {\n            $para = $this->transAclHeader($para);\n        } else if ($sign === 'aclUri') {\n            $para = $this->transAclGroupUri($para);\n        } else if ($sign == 'event') {\n            $para = $this->transNotificationEvent($para);\n        }\n        return $para;\n    }\n    \n    private function transStorageClass($para) {\n        $search = array(ObsClient::StorageClassStandard, ObsClient::StorageClassWarm, ObsClient::StorageClassCold);\n        $repalce = array('STANDARD', 'STANDARD_IA', 'GLACIER');\n        $para = str_replace($search, $repalce, $para);\n        return $para;\n    }\n    \n    private function transAclHeader($para) {\n        if ($para === ObsClient::AclPublicReadDelivered || $para === ObsClient::AclPublicReadWriteDelivered) {\n            $para = null;\n        }\n        return $para;                    \n    }\n    \n    private function transAclGroupUri($para) {\n        if ($para === ObsClient::GroupAllUsers) {\n            $para = V2Constants::GROUP_ALL_USERS_PREFIX . $para;\n        } else if ($para === ObsClient::GroupAuthenticatedUsers) {\n            $para = V2Constants::GROUP_AUTHENTICATED_USERS_PREFIX . $para; \n        } else if ($para === ObsClient::GroupLogDelivery) {\n            $para = V2Constants::GROUP_LOG_DELIVERY_PREFIX . $para;\n        } else if ($para === ObsClient::AllUsers) {\n            $para = V2Constants::GROUP_ALL_USERS_PREFIX . ObsClient::GroupAllUsers;\n        }\n        return $para;\n    }\n    \n    private function transNotificationEvent($para) {\n        $pos = strpos($para, 's3:');\n        if ($pos === false || $pos !== 0) {\n            $para = 's3:' . $para;\n        }\n        return $para;\n    }\n}\n\n\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/GetResponseTrait.php",
    "content": "<?php\n\nnamespace Obs\\Internal;\nuse GuzzleHttp\\Psr7\\Request;\nuse GuzzleHttp\\Psr7\\Response;\nuse GuzzleHttp\\Exception\\RequestException;\nuse Obs\\ObsException;\nuse Obs\\Internal\\Common\\Model;\nuse Obs\\Internal\\Resource\\Constants;\nuse Obs\\Log\\ObsLog;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Obs\\Internal\\Common\\CheckoutStream;\n\ntrait GetResponseTrait\n{\n\n\tprotected $exceptionResponseMode = true;\n\t\n\tprotected $chunkSize = 65536;\n\t\n\tprotected function isClientError(Response $response)\n\t{\n\t\treturn $response -> getStatusCode() >= 400 && $response -> getStatusCode() < 500;\n\t}\n\t\n\tprotected function parseXmlByType($searchPath, $key, &$value, $xml, $prefix)\n\t{\t\n\t\t$type = 'string';\n\t\t\n\t\tif(isset($value['sentAs'])){\n\t\t\t$key = $value['sentAs'];\n\t\t}\n\t\t\n\t\tif($searchPath === null){\n\t\t\t$searchPath = '//'.$prefix.$key;\n\t\t}\n\t\t\n\t\tif(isset($value['type'])){\n\t\t\t$type = $value['type'];\n\t\t\tif($type === 'array'){\n\t\t\t\t$items = $value['items'];\n\t\t\t\tif(isset($value['wrapper'])){\n\t\t\t\t    $paths = explode('/', $searchPath);\n\t\t\t\t    $size = count($paths);\n\t\t\t\t    if ($size > 1) {\n\t\t\t\t        $end = $paths[$size - 1];\n\t\t\t\t        $paths[$size - 1] = $value['wrapper'];\n\t\t\t\t        $paths[] = $end;\n\t\t\t\t        $searchPath = implode('/', $paths) .'/' . $prefix;\n\t\t\t\t    }\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$array = [];\n\t\t\t\tif(!isset($value['data']['xmlFlattened'])){\n\t\t\t\t\t$pkey = isset($items['sentAs']) ? $items['sentAs'] : $items['name'];\n\t\t\t\t\t$_searchPath = $searchPath .'/' . $prefix .$pkey;\n\t\t\t\t}else{\n\t\t\t\t\t$pkey = $key;\n\t\t\t\t\t$_searchPath = $searchPath;\n\t\t\t\t}\n\t\t\t\tif($result = $xml -> xpath($_searchPath)){\n\t\t\t\t\tif(is_array($result)){\n\t\t\t\t\t\tforeach ($result as $subXml){\n\t\t\t\t\t\t\t$subXml = simplexml_load_string($subXml -> asXML());\n\t\t\t\t\t\t\t$subPrefix = $this->getXpathPrefix($subXml);\n\t\t\t\t\t\t\t$array[] = $this->parseXmlByType('//'.$subPrefix. $pkey, $pkey, $items, $subXml, $subPrefix);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn $array;\n\t\t\t}else if($type === 'object'){\n\t\t\t\t$properties = $value['properties'];\n\t\t\t\t$array = [];\n\t\t\t\tforeach ($properties as $pkey => $pvalue){\n\t\t\t\t\t$name = isset($pvalue['sentAs']) ? $pvalue['sentAs'] : $pkey;\n\t\t\t\t\t$array[$pkey] = $this->parseXmlByType($searchPath.'/' . $prefix .$name, $name, $pvalue, $xml, $prefix);\n\t\t\t\t}\n\t\t\t\treturn $array;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif($result = $xml -> xpath($searchPath)){\n\t\t\tif($type === 'boolean'){\n\t\t\t\treturn strval($result[0]) !== 'false';\n\t\t\t}else if($type === 'numeric' || $type === 'float'){\n\t\t\t\treturn floatval($result[0]);\n\t\t\t}else if($type === 'int' || $type === 'integer'){\n\t\t\t\treturn intval($result[0]);\n\t\t\t}else{\n\t\t\t\treturn strval($result[0]);\n\t\t\t}\n\t\t}else{\n\t\t\tif($type === 'boolean'){\n\t\t\t\treturn false;\n\t\t\t}else if($type === 'numeric' || $type === 'float' || $type === 'int' || $type === 'integer'){\n\t\t\t\treturn null;\n\t\t\t}else{\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate function parseCommonHeaders($model, $response){\n\t    $constants = Constants::selectConstants($this -> signature);\n\t    foreach($constants::COMMON_HEADERS as $key => $value){\n\t\t\t$model[$value] = $response -> getHeaderLine($key);\n\t\t}\n\t}\n\t\n\tprotected function parseItems($responseParameters, $model, $response, $body)\n\t{\n\t\t$prefix = '';\n\t\t\n\t\t$this->parseCommonHeaders($model, $response);\n\t\t\n\t\t$closeBody = false;\n\t\ttry{\n\t\t\tforeach ($responseParameters as $key => $value){\n\t\t\t\tif(isset($value['location'])){\n\t\t\t\t\t$location = $value['location'];\n\t\t\t\t\tif($location === 'header'){\n\t\t\t\t\t\t$name = isset($value['sentAs']) ? $value['sentAs'] : $key;\n\t\t\t\t\t\t$isSet = false;\n\t\t\t\t\t\tif(isset($value['type'])){\n\t\t\t\t\t\t\t$type = $value['type'];\n\t\t\t\t\t\t\tif($type === 'object'){\n\t\t\t\t\t\t\t\t$headers = $response -> getHeaders();\n\t\t\t\t\t\t\t\t$temp = [];\n\t\t\t\t\t\t\t\tforeach ($headers as $headerName => $headerValue){\n\t\t\t\t\t\t\t\t\tif(stripos($headerName, $name) === 0){\n\t\t\t\t\t\t\t\t\t    $temp[substr($headerName, strlen($name))] = rawurldecode($response -> getHeaderLine($headerName));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$model[$key] = $temp;\n\t\t\t\t\t\t\t\t$isSet = true;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tif($response -> hasHeader($name)){\n\t\t\t\t\t\t\t\t\tif($type === 'boolean'){\n\t\t\t\t\t\t\t\t\t\t$model[$key] = ($response -> getHeaderLine($name)) !== 'false';\n\t\t\t\t\t\t\t\t\t\t$isSet = true;\n\t\t\t\t\t\t\t\t\t}else if($type === 'numeric' || $type === 'float'){\n\t\t\t\t\t\t\t\t\t\t$model[$key] = floatval($response -> getHeaderLine($name));\n\t\t\t\t\t\t\t\t\t\t$isSet = true;\n\t\t\t\t\t\t\t\t\t}else if($type === 'int' || $type === 'integer'){\n\t\t\t\t\t\t\t\t\t\t$model[$key] = intval($response -> getHeaderLine($name));\n\t\t\t\t\t\t\t\t\t\t$isSet = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!$isSet){\n\t\t\t\t\t\t\t$model[$key] = $response -> getHeaderLine($name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if($location === 'xml' && $body !== null){\n\t\t\t\t\t    if(!isset($xml) && ($xml = simplexml_load_string($body -> getContents()))){\n\t\t\t\t\t\t\t$prefix = $this ->getXpathPrefix($xml);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$closeBody = true;\n\t\t\t\t\t\t$model[$key] = $this -> parseXmlByType(null, $key,$value, $xml, $prefix);\n\t\t\t\t\t}else if($location === 'body' && $body !== null){\n\t\t\t\t\t\tif(isset($value['type']) && $value['type'] === 'stream'){\n\t\t\t\t\t\t\t$model[$key] = $body;\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$model[$key] = $body -> getContents();\n\t\t\t\t\t\t\t$closeBody = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}finally {\n\t\t\tif($closeBody && $body !== null){\n\t\t\t\t$body -> close();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate function writeFile($filePath, StreamInterface &$body, $contentLength)\n\t{\n\t\t$filePath = iconv('UTF-8', 'GBK', $filePath);\n\t\tif(is_string($filePath) && $filePath !== '')\n\t\t{\n\t\t\t$fp = null;\n\t\t\t$dir = dirname($filePath);\n\t\t\ttry{\n\t\t\t\tif(!is_dir($dir))\n\t\t\t\t{\n\t\t\t\t\tmkdir($dir,0755,true);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(($fp = fopen($filePath, 'w')))\n\t\t\t\t{\n\t\t\t\t\twhile(!$body->eof())\n\t\t\t\t\t{\n\t\t\t\t\t\t$str = $body->read($this->chunkSize);\n\t\t\t\t\t\tfwrite($fp, $str);\n\t\t\t\t\t}\n\t\t\t\t\tfflush($fp);\n\t\t\t\t\tObsLog::commonLog(DEBUG, \"write file %s ok\",$filePath);\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tObsLog::commonLog(ERROR, \"open file error,file path:%s\",$filePath);\n\t\t\t\t}\n\t\t\t}finally{\n\t\t\t\tif($fp){\n\t\t\t\t\tfclose($fp);\n\t\t\t\t}\n\t\t\t\t$body->close();\n\t\t\t\t$body = null;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate function parseXmlToException($body, $obsException){\n\t\ttry{\n\t\t\t$xmlErrorBody = trim($body -> getContents());\n\t\t\tif($xmlErrorBody && ($xml = simplexml_load_string($xmlErrorBody))){\n\t\t\t\t$prefix = $this->getXpathPrefix($xml);\n\t\t\t\tif ($tempXml = $xml->xpath('//'.$prefix . 'Code')) {\n\t\t\t\t\t$obsException-> setExceptionCode(strval($tempXml[0]));\n\t\t\t\t}\n\t\t\t\tif ($tempXml = $xml->xpath('//'.$prefix . 'RequestId')) {\n\t\t\t\t\t$obsException-> setRequestId(strval($tempXml[0]));\n\t\t\t\t}\n\t\t\t\tif ($tempXml = $xml->xpath('//'.$prefix . 'Message')) {\n\t\t\t\t\t$obsException-> setExceptionMessage(strval($tempXml[0]));\n\t\t\t\t}\n\t\t\t\tif ($tempXml = $xml->xpath('//'.$prefix . 'HostId')) {\n\t\t\t\t\t$obsException -> setHostId(strval($tempXml[0]));\n\t\t\t\t}\n\t\t\t}\n\t\t}finally{\n\t\t\t$body -> close();\n\t\t}\n\t}\n\t\n\tprivate function parseXmlToModel($body, $model){\n\t\ttry{\n\t\t\t$xmlErrorBody = trim($body -> getContents());\n\t\t\tif($xmlErrorBody && ($xml = simplexml_load_string($xmlErrorBody))){\n\t\t\t\t$prefix = $this->getXpathPrefix($xml);\n\t\t\t\tif ($tempXml = $xml->xpath('//'.$prefix . 'Code')) {\n\t\t\t\t\t$model['Code'] = strval($tempXml[0]);\n\t\t\t\t}\n\t\t\t\tif ($tempXml = $xml->xpath('//'.$prefix . 'RequestId')) {\n\t\t\t\t\t$model['RequestId'] = strval($tempXml[0]);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ($tempXml = $xml->xpath('//'.$prefix . 'HostId')) {\n\t\t\t\t\t$model['HostId'] = strval($tempXml[0]);\n\t\t\t\t}\n\t\t\t\tif ($tempXml = $xml->xpath('//'.$prefix . 'Resource')) {\n\t\t\t\t\t$model['Resource'] = strval($tempXml[0]);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ($tempXml = $xml->xpath('//'.$prefix . 'Message')) {\n\t\t\t\t\t$model['Message']  = strval($tempXml[0]);\n\t\t\t\t}\n\t\t\t}\n\t\t}finally {\n\t\t\t$body -> close();\n\t\t}\n\t}\n\t\n\tprotected function parseResponse(Model $model, Request $request, Response $response, array $requestConfig)\n\t{\n\t\t$statusCode = $response -> getStatusCode();\n\t\t$expectedLength = $response -> getHeaderLine('content-length');\n\t\t$expectedLength = is_numeric($expectedLength) ? floatval($expectedLength) : null;\n\t\t\n\t\t$body = new CheckoutStream($response->getBody(), $expectedLength);\n\t\t\n\t\tif($statusCode >= 300){\n\t\t\tif($this-> exceptionResponseMode){\n\t\t\t\t$obsException= new ObsException();\n\t\t\t\t$obsException-> setRequest($request);\n\t\t\t\t$obsException-> setResponse($response);\n\t\t\t\t$obsException-> setExceptionType($this->isClientError($response) ? 'client' : 'server');\n\t\t\t\t$this->parseXmlToException($body, $obsException);\n\t\t\t\tthrow $obsException;\n\t\t\t}else{\n\t\t\t\t$this->parseCommonHeaders($model, $response);\n\t\t\t\t$this->parseXmlToModel($body, $model);\n\t\t\t}\n\t\t\t\n\t\t}else{\n\t\t\tif(!empty($model)){\n\t\t\t\tforeach ($model as $key => $value){\n\t\t\t\t\tif($key === 'method'){\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif(isset($value['type']) && $value['type'] === 'file'){\n\t\t\t\t\t    $this->writeFile($value['value'], $body, $expectedLength);\n\t\t\t\t\t}\n\t\t\t\t\t$model[$key] = $value['value'];\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(isset($requestConfig['responseParameters'])){\n\t\t\t\t$responseParameters = $requestConfig['responseParameters'];\n\t\t\t\tif(isset($responseParameters['type']) && $responseParameters['type'] === 'object'){\n\t\t\t\t\t$responseParameters = $responseParameters['properties'];\n\t\t\t\t}\n\t\t\t\t$this->parseItems($responseParameters, $model, $response, $body);\n\t\t\t}\n\t\t}\n\t\t\n\t\t$model['HttpStatusCode'] = $statusCode;\n\t\t$model['Reason'] = $response -> getReasonPhrase();\n\t}\n\t\n\tprotected function getXpathPrefix($xml)\n\t{\n\t\t$namespaces = $xml -> getDocNamespaces();\n\t\tif (isset($namespaces[''])) {\n\t\t\t$xml->registerXPathNamespace('ns', $namespaces['']);\n\t\t\t$prefix = 'ns:';\n\t\t} else {\n\t\t\t$prefix = '';\n\t\t}\n\t\treturn $prefix;\n\t}\n\t\n\tprotected function buildException(Request $request, RequestException $exception, $message)\n\t{\n\t\t$response = $exception-> hasResponse() ? $exception-> getResponse() : null;\n\t\t$obsException= new ObsException($message ? $message : $exception-> getMessage());\n\t\t$obsException-> setExceptionType('client');\n\t\t$obsException-> setRequest($request);\n\t\tif($response){\n\t\t\t$obsException-> setResponse($response);\n\t\t\t$obsException-> setExceptionType($this->isClientError($response) ? 'client' : 'server');\n\t\t\t$this->parseXmlToException($response -> getBody(), $obsException);\n\t\t}\n\t\treturn $obsException;\n\t}\n\t\n\tprotected function parseExceptionAsync(Request $request, RequestException $exception, $message=null)\n\t{\n\t\treturn $this->buildException($request, $exception, $message);\n\t}\n\t\n\tprotected function parseException(Model $model, Request $request, RequestException $exception, $message=null)\n\t{\n\t\t$response = $exception-> hasResponse() ? $exception-> getResponse() : null;\n\t\t\n\t\tif($this-> exceptionResponseMode){\n\t\t\tthrow $this->buildException($request, $exception, $message);\n\t\t}else{\n\t\t\tif($response){\n\t\t\t\t$model['HttpStatusCode'] = $response -> getStatusCode();\n\t\t\t\t$model['Reason'] = $response -> getReasonPhrase();\n\t\t\t\t$this->parseXmlToModel($response -> getBody(), $model);\n\t\t\t}else{\n\t\t\t\t$model['HttpStatusCode'] = -1;\n\t\t\t\t$model['Message'] = $exception -> getMessage();\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Resource/Constants.php",
    "content": "<?php\n\nnamespace Obs\\Internal\\Resource;\n\nclass Constants {\n    const ALLOWED_RESOURCE_PARAMTER_NAMES = [ \n            'acl',\n            'policy',\n            'torrent',\n            'logging',\n            'location',\n            'storageinfo',\n            'quota',\n            'storagepolicy',\n            'requestpayment',\n            'versions',\n            'versioning',\n            'versionid',\n            'uploads',\n            'uploadid',\n            'partnumber',\n            'website',\n            'notification',\n            'lifecycle',\n            'deletebucket',\n            'delete',\n            'cors',\n            'restore',\n            'tagging',\n            'response-content-type',\n            'response-content-language',\n            'response-expires',\n            'response-cache-control',\n            'response-content-disposition',\n            'response-content-encoding',\n            'x-image-process',\n\n            'backtosource',\n            'storageclass',\n            'replication',\n            'append',\n            'position',\n            'x-oss-process'\n    ];\n    const ALLOWED_REQUEST_HTTP_HEADER_METADATA_NAMES = [ \n            'content-type',\n            'content-md5',\n            'content-length',\n            'content-language',\n            'expires',\n            'origin',\n            'cache-control',\n            'content-disposition',\n            'content-encoding',\n            'access-control-request-method',\n            'access-control-request-headers',\n            'x-default-storage-class',\n            'location',\n            'date',\n            'etag',\n            'range',\n            'host',\n            'if-modified-since',\n            'if-unmodified-since',\n            'if-match',\n            'if-none-match',\n            'last-modified',\n            'content-range',\n\n            'success-action-redirect'\n    ];\n    const ALLOWED_RESPONSE_HTTP_HEADER_METADATA_NAMES = [ \n            'content-type',\n            'content-md5',\n            'content-length',\n            'content-language',\n            'expires',\n            'origin',\n            'cache-control',\n            'content-disposition',\n            'content-encoding',\n            'x-default-storage-class',\n            'location',\n            'date',\n            'etag',\n            'host',\n            'last-modified',\n            'content-range',\n            'x-reserved',\n            'access-control-allow-origin',\n            'access-control-allow-headers',\n            'access-control-max-age',\n            'access-control-allow-methods',\n            'access-control-expose-headers',\n            'connection'\n    ];\n    \n    public static function selectConstants($signature) {\n        $signature = (strcasecmp ( $signature, 'obs' ) === 0) ? 'OBS' : 'V2';\n        return __NAMESPACE__ . '\\\\' . $signature . 'Constants';\n    }\n    \n    public static function selectRequestResource($signature) {\n        $signature = (strcasecmp ( $signature, 'obs' ) === 0) ? 'OBS' : 'V2';\n        return (__NAMESPACE__ . '\\\\' . $signature . 'RequestResource');\n    }\n\n}"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Resource/OBSConstants.php",
    "content": "<?php\nnamespace Obs\\Internal\\Resource;\n\nclass OBSConstants extends Constants {\n    const FLAG = 'OBS';\n    const METADATA_PREFIX = 'x-obs-meta-';\n    const HEADER_PREFIX = 'x-obs-';\n    const ALTERNATIVE_DATE_HEADER = 'x-obs-date';\n    const SECURITY_TOKEN_HEAD = 'x-obs-security-token';\n    const TEMPURL_AK_HEAD = 'AccessKeyId';\n    \n    const COMMON_HEADERS = [\n        'content-length' => 'ContentLength',\n        'date' => 'Date',\n        'x-obs-request-id' => 'RequestId',\n        'x-obs-id-2' => 'Id2',\n        'x-reserved' => 'Reserved'\n    ];\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Resource/OBSRequestResource.php",
    "content": "<?php\nnamespace Obs\\Internal\\Resource;\n\nclass OBSRequestResource {\n    public static $RESOURCE_ARRAY = [ \n            'operations' => [ \n                    'createBucket' => [ \n                            'httpMethod' => 'PUT',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'CreateBucketConfiguration'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'LocationConstraint' => [ \n                                            'type' => 'string',\n                                            'location' => 'xml'\n                                    ],\n                                    'StorageClass' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-storage-class'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'Location' => [ \n                                            'type' => 'string',\n                                            'location' => 'header'\n                                    ],\n                                    'RequestId' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-request-id'\n                                    ]\n                            ]\n                    ],\n\n                    'listBuckets' => [ \n                            'httpMethod' => 'GET',\n                            'responseParameters' => [ \n                                    'Buckets' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'Buckets',\n                                            'items' => [ \n                                                    'name' => 'Bucket',\n                                                    'type' => 'object',\n                                                    'sentAs' => 'Bucket',\n                                                    'properties' => [ \n                                                            'Name' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'CreationDate' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Location' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ],\n                                    'Owner' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'ID' => [ \n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'RequestId' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-request-id'\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucket' => [ \n                            'httpMethod' => 'DELETE',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'listObjects' => [ \n                            'httpMethod' => 'GET',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Delimiter' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'delimiter'\n                                    ],\n                                    'Marker' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'marker'\n                                    ],\n                                    'MaxKeys' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'max-keys'\n                                    ],\n                                    'Prefix' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'prefix'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'IsTruncated' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Marker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Contents' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Contents',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'Object',\n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'LastModified' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'ETag' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Size' => [ \n                                                                            'type' => 'integer'\n                                                                    ],\n                                                                    'StorageClass' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Type' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Owner' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Name' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Prefix' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Delimiter' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'MaxKeys' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'xml'\n                                            ],\n                                            'CommonPrefixes' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'CommonPrefix',\n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'Prefix' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'Location' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-bucket-location'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'listVersions' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'versions',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Delimiter' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'delimiter'\n                                    ],\n                                    'KeyMarker' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'key-marker'\n                                    ],\n                                    'MaxKeys' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'max-keys'\n                                    ],\n                                    'Prefix' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'prefix'\n                                    ],\n                                    'VersionIdMarker' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'version-id-marker'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'IsTruncated' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'xml'\n                                            ],\n                                            'KeyMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'VersionIdMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextKeyMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextVersionIdMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Versions' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Version',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'ObjectVersion',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Version',\n                                                            'properties' => [ \n                                                                    'ETag' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Size' => [ \n                                                                            'type' => 'integer'\n                                                                    ],\n                                                                    'StorageClass' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'VersionId' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'IsLatest' => [ \n                                                                            'type' => 'boolean'\n                                                                    ],\n                                                                    'LastModified' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Type' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Owner' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'DeleteMarkers' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'DeleteMarker',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'DeleteMarkerEntry',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'DeleteMarker',\n                                                            'properties' => [ \n                                                                    'Owner' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'VersionId' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'IsLatest' => [ \n                                                                            'type' => 'boolean'\n                                                                    ],\n                                                                    'LastModified' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Name' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Prefix' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Delimiter' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'MaxKeys' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'xml'\n                                            ],\n                                            'CommonPrefixes' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'CommonPrefix',\n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'Prefix' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'Location' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-bucket-location'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketMetadata' => [ \n                            'httpMethod' => 'HEAD',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Origin' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Origin'\n                                    ],\n                                    'RequestHeader' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Access-Control-Request-Headers'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'RequestId' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-request-id'\n                                    ],\n                                    'StorageClass' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-storage-class'\n                                    ],\n\n                                    'Location' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-bucket-location'\n                                    ],\n\n                                    'AllowOrigin' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'access-control-allow-origin'\n                                    ],\n                                    'MaxAgeSeconds' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'access-control-max-age',\n                                            'type' => 'integer'\n                                    ],\n                                    'ExposeHeader' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'access-control-expose-headers'\n                                    ],\n                                    'AllowMethod' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'access-control-allow-methods'\n                                    ],\n                                    'AllowHeader' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'access-control-allow-headers'\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketLocation' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'location',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Location' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketStorageInfo' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'storageinfo',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Size' => [ \n                                                    'type' => 'numeric',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Size'\n                                            ],\n                                            'ObjectNumber' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'xml'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n                    'setBucketQuota' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'quota',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'Quota'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'StorageQuota' => [ \n                                            'required' => true,\n                                            'type' => 'numeric',\n                                            'location' => 'xml'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketQuota' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'quota',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'StorageQuota' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'StorageQuota'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketStoragePolicy' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'storageClass',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'StorageClass'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'StorageClass' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'xml',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketStoragePolicy' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'storagePolicy',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'StorageClass' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketAcl' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'acl',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'AccessControlPolicy'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'GrantRead' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-read'\n                                    ],\n                                    'GrantWrite' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-write'\n                                    ],\n                                    'GrantReadAcp' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-read-acp'\n                                    ],\n                                    'GrantWriteAcp' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-write-acp'\n                                    ],\n                                    'GrantFullControl' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-full-control'\n                                    ],\n                                    'GrantDeliveryRead' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-read-delivered'\n                                    ],\n                                    'GrantDeliveryFullControl' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-full-control-delivered'\n                                    ],\n                                    'Owner' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'ID' => [ \n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'Grants' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'AccessControlList',\n                                            'items' => [ \n                                                    'name' => 'Grant',\n                                                    'type' => 'object',\n                                                    'properties' => [ \n                                                            'Grantee' => [ \n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'ID' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'URI' => [ \n                                                                                    'type' => 'string',\n                                                                                    'sentAs' => 'Canned',\n                                                                                    'transform' => 'aclUri'\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'Permission' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Delivered' => [\n                                                                    'type' => 'boolean'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketAcl' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'acl',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'Owner' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Grants' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'AccessControlList',\n                                                    'items' => [ \n                                                            'name' => 'Grant',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Grant',\n                                                            'properties' => [ \n                                                                    'Grantee' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'URI' => [ \n                                                                                            'type' => 'string',\n                                                                                            'sentAs' => 'Canned'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Permission' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Delivered' => [ \n                                                                            'type' => 'boolean'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketLoggingConfiguration' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'logging',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'BucketLoggingStatus'\n                                    ],\n                                    'xmlAllowEmpty' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Agency' => [\n                                            'type' => 'string',\n                                            'location' => 'xml'\n                                    ],\n                                    'LoggingEnabled' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'TargetBucket' => [ \n                                                            'type' => 'string'\n                                                    ],\n                                                    'TargetPrefix' => [ \n                                                            'type' => 'string'\n                                                    ],\n                                                    'TargetGrants' => [ \n                                                            'type' => 'array',\n                                                            'items' => [ \n                                                                    'name' => 'Grant',\n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'Grantee' => [ \n                                                                                    'type' => 'object',\n                                                                                    'properties' => [ \n                                                                                            'ID' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ],\n                                                                                            'URI' => [ \n                                                                                                    'type' => 'string',\n                                                                                                    'sentAs' => 'Canned',\n                                                                                                    'transform' => 'aclUri'\n                                                                                            ]\n                                                                                    ]\n                                                                            ],\n                                                                            'Permission' => [ \n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketLoggingConfiguration' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'logging',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [\n                                            'Agency' => [\n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'LoggingEnabled' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'TargetBucket' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'TargetGrants' => [ \n                                                                    'type' => 'array',\n                                                                    'sentAs' => 'TargetGrants',\n                                                                    'items' => [ \n                                                                            'name' => 'Grant',\n                                                                            'type' => 'object',\n                                                                            'sentAs' => 'Grant',\n                                                                            'properties' => [ \n                                                                                    'Grantee' => [ \n                                                                                            'type' => 'object',\n                                                                                            'properties' => [ \n                                                                                                    'ID' => [ \n                                                                                                            'type' => 'string'\n                                                                                                    ],\n                                                                                                    'URI' => [ \n                                                                                                            'type' => 'string',\n                                                                                                            'sentAs' => 'Canned'\n                                                                                                    ]\n                                                                                            ]\n                                                                                    ],\n                                                                                    'Permission' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'TargetPrefix' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketPolicy' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'policy',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Policy' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'body'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketPolicy' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'policy',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Policy' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'body'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucketPolicy' => [ \n                            'httpMethod' => 'DELETE',\n                            'specialParam' => 'policy',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketLifecycleConfiguration' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'lifecycle',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'LifecycleConfiguration'\n                                    ],\n                                    'contentMd5' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Rules' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'Rule',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'name' => 'Rule',\n                                                    'type' => 'object',\n                                                    'sentAs' => 'Rule',\n                                                    'properties' => [ \n                                                            'Transitions' => [ \n                                                                    'type' => 'array',\n                                                                    'sentAs' => 'Transition',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'type' => 'object',\n                                                                            'sentAs' => 'Transition',\n                                                                            'properties' => [ \n                                                                                    'StorageClass' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'Date' => [ \n                                                                                            'type' => 'string',\n                                                                                            'format' => 'date-time-middle'\n                                                                                    ],\n                                                                                    'Days' => [ \n                                                                                            'type' => 'numeric'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'Expiration' => [ \n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'Date' => [ \n                                                                                    'type' => 'string',\n                                                                                    'format' => 'date-time-middle'\n                                                                            ],\n                                                                            'Days' => [ \n                                                                                    'type' => 'numeric'\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'NoncurrentVersionTransitions' => [ \n                                                                    'type' => 'array',\n                                                                    'sentAs' => 'NoncurrentVersionTransition',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'type' => 'object',\n                                                                            'sentAs' => 'NoncurrentVersionTransition',\n                                                                            'properties' => [ \n                                                                                    'StorageClass' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'NoncurrentDays' => [ \n                                                                                            'type' => 'numeric'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'NoncurrentVersionExpiration' => [ \n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'NoncurrentDays' => [ \n                                                                                    'type' => 'numeric'\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Prefix' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'string',\n                                                                    'canEmpty' => true\n                                                            ],\n                                                            'Status' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketLifecycleConfiguration' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'lifecycle',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'Rules' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Rule',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'Rule',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Rule',\n                                                            'properties' => [ \n                                                                    'Transitions' => [ \n                                                                            'type' => 'array',\n                                                                            'sentAs' => 'Transition',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'type' => 'object',\n                                                                                    'sentAs' => 'Transition',\n                                                                                    'properties' => [ \n                                                                                            'StorageClass' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ],\n                                                                                            'Date' => [ \n                                                                                                    'type' => 'string',\n                                                                                                    'format' => 'date-time-middle'\n                                                                                            ],\n                                                                                            'Days' => [ \n                                                                                                    'type' => 'numeric'\n                                                                                            ]\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Expiration' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'Date' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'Days' => [ \n                                                                                            'type' => 'integer'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'NoncurrentVersionTransitions' => [ \n                                                                            'type' => 'array',\n                                                                            'sentAs' => 'NoncurrentVersionTransition',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'type' => 'object',\n                                                                                    'sentAs' => 'NoncurrentVersionTransition',\n                                                                                    'properties' => [ \n                                                                                            'StorageClass' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ],\n                                                                                            'NoncurrentDays' => [ \n                                                                                                    'type' => 'numeric'\n                                                                                            ]\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'NoncurrentVersionExpiration' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'NoncurrentDays' => [ \n                                                                                            'type' => 'integer'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'ID' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Prefix' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Status' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucketLifecycleConfiguration' => [ \n                            'httpMethod' => 'DELETE',\n                            'specialParam' => 'lifecycle',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketWebsiteConfiguration' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'website',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'WebsiteConfiguration'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'ErrorDocument' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'Key' => [ \n                                                            'required' => true,\n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'IndexDocument' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'Suffix' => [ \n                                                            'required' => true,\n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'RedirectAllRequestsTo' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'HostName' => [ \n                                                            'required' => true,\n                                                            'type' => 'string'\n                                                    ],\n                                                    'Protocol' => [ \n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'RoutingRules' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'items' => [ \n                                                    'name' => 'RoutingRule',\n                                                    'type' => 'object',\n                                                    'properties' => [ \n                                                            'Condition' => [ \n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'HttpErrorCodeReturnedEquals' => [ \n                                                                                    'type' => 'numeric'\n                                                                            ],\n                                                                            'KeyPrefixEquals' => [ \n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'Redirect' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'HostName' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'HttpRedirectCode' => [ \n                                                                                    'type' => 'numeric'\n                                                                            ],\n                                                                            'Protocol' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'ReplaceKeyPrefixWith' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'ReplaceKeyWith' => [ \n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketWebsiteConfiguration' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'website',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'RedirectAllRequestsTo' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'HostName' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Protocol' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'IndexDocument' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'Suffix' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'ErrorDocument' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'Key' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RoutingRules' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'items' => [ \n                                                            'name' => 'RoutingRule',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'RoutingRule',\n                                                            'properties' => [ \n                                                                    'Condition' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'HttpErrorCodeReturnedEquals' => [ \n                                                                                            'type' => 'integer'\n                                                                                    ],\n                                                                                    'KeyPrefixEquals' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Redirect' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'HostName' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'HttpRedirectCode' => [ \n                                                                                            'type' => 'integer'\n                                                                                    ],\n                                                                                    'Protocol' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'ReplaceKeyPrefixWith' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'ReplaceKeyWith' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucketWebsiteConfiguration' => [ \n                            'httpMethod' => 'DELETE',\n                            'specialParam' => 'website',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketVersioningConfiguration' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'versioning',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'VersioningConfiguration'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Status' => [ \n                                            'type' => 'string',\n                                            'location' => 'xml'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketVersioningConfiguration' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'versioning',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'Status' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketCors' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'cors',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'CORSConfiguration'\n                                    ],\n                                    'contentMd5' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'CorsRules' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'CORSRule',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'type' => 'object',\n                                                    'sentAs' => 'CORSRule',\n                                                    'properties' => [ \n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'AllowedMethod' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'array',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'type' => 'string',\n                                                                            'sentAs' => 'AllowedMethod'\n                                                                    ]\n                                                            ],\n                                                            'AllowedOrigin' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'array',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'sentAs' => 'AllowedOrigin',\n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ],\n                                                            'AllowedHeader' => [ \n                                                                    'type' => 'array',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'name' => 'AllowedHeader',\n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ],\n                                                            'MaxAgeSeconds' => [ \n                                                                    'type' => 'numeric'\n                                                            ],\n                                                            'ExposeHeader' => [ \n                                                                    'type' => 'array',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'name' => 'ExposeHeader',\n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketCors' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'cors',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'CorsRules' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'CORSRule',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'ID' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'AllowedMethod' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'type' => 'string',\n                                                                                    'sentAs' => 'AllowedMethod'\n                                                                            ]\n                                                                    ],\n                                                                    'AllowedOrigin' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'sentAs' => 'AllowedOrigin',\n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ],\n                                                                    'AllowedHeader' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'name' => 'AllowedHeader',\n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ],\n                                                                    'MaxAgeSeconds' => [ \n                                                                            'type' => 'integer'\n                                                                    ],\n                                                                    'ExposeHeader' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'name' => 'ExposeHeader',\n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucketCors' => [ \n                            'httpMethod' => 'DELETE',\n                            'specialParam' => 'cors',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'optionsBucket' => [ \n                            'httpMethod' => 'OPTIONS',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Origin' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'header'\n                                    ],\n                                    'AccessControlRequestMethods' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'header',\n                                            'items' => [ \n                                                    'sentAs' => 'Access-Control-Request-Method',\n                                                    'type' => 'string'\n                                            ]\n                                    ],\n                                    'AccessControlRequestHeaders' => [ \n                                            'type' => 'array',\n                                            'location' => 'header',\n                                            'items' => [ \n                                                    'sentAs' => 'Access-Control-Request-Headers',\n                                                    'type' => 'string'\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'AllowOrigin' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-origin'\n                                            ],\n                                            'AllowHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-headers'\n                                            ],\n                                            'AllowMethod' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-methods'\n                                            ],\n                                            'ExposeHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-expose-headers'\n                                            ],\n                                            'MaxAgeSeconds' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-max-age'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketTagging' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'tagging',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'Tagging'\n                                    ],\n                                    'contentMd5' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Tags' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'TagSet',\n                                            'items' => [ \n                                                    'required' => true,\n                                                    'type' => 'object',\n                                                    'name' => 'Tag',\n                                                    'properties' => [ \n                                                            'Key' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Value' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketTagging' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'tagging',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'Tags' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'TagSet',\n                                                    'items' => [ \n                                                            'type' => 'object',\n                                                            'name' => 'Tag',\n                                                            'properties' => [ \n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Value' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucketTagging' => [ \n                            'httpMethod' => 'DELETE',\n                            'specialParam' => 'tagging',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketNotification' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'notification',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'NotificationConfiguration'\n                                    ],\n                                    'xmlAllowEmpty' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'TopicConfigurations' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'TopicConfiguration',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'TopicConfiguration',\n                                                    'properties' => [ \n                                                            'ID' => [ \n                                                                    'type' => 'string',\n                                                                    'sentAs' => 'Id'\n                                                            ],\n                                                            'Filter' => [\n                                                                'type' => 'array',\n                                                                'wrapper' => 'Filter',\n                                                                'sentAs' => 'Object',\n                                                                'items' => [\n                                                                    'type' => 'object',\n                                                                    'sentAs' => 'FilterRule',\n                                                                    'properties' => [\n                                                                        'Name' => [\n                                                                            'type' => 'string'\n                                                                        ],\n                                                                        \n                                                                        'Value' => [\n                                                                            'type' => 'string'\n                                                                        ]\n                                                                    ]\n                                                                ]\n                                                            ],\n                                                            'Topic' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Event' => [ \n                                                                    'type' => 'array',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'type' => 'string',\n                                                                            'sentAs' => 'Event',\n                                                                            'transform' => 'event'\n                                                                    ]\n                                                            ],\n                                                    ]\n                                            ]\n                                    ],\n                                    'FunctionStageConfigurations' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'FunctionStageConfiguration',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'FunctionStageConfiguration',\n                                                    'properties' => [ \n                                                            'ID' => [ \n                                                                    'type' => 'string',\n                                                                    'sentAs' => 'Id'\n                                                            ],\n                                                            'FunctionStage' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Event' => [ \n                                                                    'type' => 'array',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'type' => 'string',\n                                                                            'sentAs' => 'Event'\n                                                                    ]\n                                                            ],\n                                                            'Filter' => [ \n                                                                    'type' => 'array',\n                                                                    'wrapper' => 'Filter',\n                                                                    'sentAs' => 'Object',\n                                                                    'items' => [ \n                                                                            'type' => 'object',\n                                                                            'sentAs' => 'FilterRule',\n                                                                            'properties' => [ \n                                                                                    'Name' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n\n                                                                                    'Value' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ],\n                                    'FunctionGraphConfigurations' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'FunctionGraphConfiguration',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'FunctionGraphConfiguration',\n                                                    'properties' => [ \n                                                            'ID' => [ \n                                                                    'type' => 'string',\n                                                                    'sentAs' => 'Id'\n                                                            ],\n                                                            'FunctionGraph' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Event' => [ \n                                                                    'type' => 'array',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'type' => 'string',\n                                                                            'sentAs' => 'Event'\n                                                                    ]\n                                                            ],\n                                                            'Filter' => [ \n                                                                    'type' => 'array',\n                                                                    'wrapper' => 'Filter',\n                                                                    'sentAs' => 'Object',\n                                                                    'items' => [ \n                                                                            'type' => 'object',\n                                                                            'sentAs' => 'FilterRule',\n                                                                            'properties' => [ \n                                                                                    'Name' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n\n                                                                                    'Value' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketNotification' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'notification',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'TopicConfigurations' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'TopicConfiguration',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'type' => 'object',\n                                                            'location' => 'xml',\n                                                            'sentAs' => 'TopicConfiguration',\n                                                            'properties' => [ \n                                                                    'ID' => [ \n                                                                            'type' => 'string',\n                                                                            'sentAs' => 'Id'\n                                                                    ],\n                                                                    'Topic' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Event' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'type' => 'string',\n                                                                                    'sentAs' => 'Event'\n                                                                            ]\n                                                                    ],\n                                                                    'Filter' => [ \n                                                                            'type' => 'array',\n                                                                            'wrapper' => 'Filter',\n                                                                            'sentAs' => 'Object',\n                                                                            'items' => [ \n                                                                                    'type' => 'object',\n                                                                                    'sentAs' => 'FilterRule',\n                                                                                    'properties' => [ \n                                                                                            'Name' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ],\n\n                                                                                            'Value' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ]\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'FunctionStageConfigurations' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'FunctionStageConfiguration',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'type' => 'object',\n                                                            'location' => 'xml',\n                                                            'sentAs' => 'FunctionStageConfiguration',\n                                                            'properties' => [ \n                                                                    'ID' => [ \n                                                                            'type' => 'string',\n                                                                            'sentAs' => 'Id'\n                                                                    ],\n                                                                    'FunctionStage' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Event' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'type' => 'string',\n                                                                                    'sentAs' => 'Event'\n                                                                            ]\n                                                                    ],\n                                                                    'Filter' => [ \n                                                                            'type' => 'array',\n                                                                            'wrapper' => 'Filter',\n                                                                            'sentAs' => 'Object',\n                                                                            'items' => [ \n                                                                                    'type' => 'object',\n                                                                                    'sentAs' => 'FilterRule',\n                                                                                    'properties' => [ \n                                                                                            'Name' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ],\n\n                                                                                            'Value' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ]\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'FunctionGraphConfigurations' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'FunctionGraphConfiguration',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'type' => 'object',\n                                                            'location' => 'xml',\n                                                            'sentAs' => 'FunctionGraphConfiguration',\n                                                            'properties' => [ \n                                                                    'ID' => [ \n                                                                            'type' => 'string',\n                                                                            'sentAs' => 'Id'\n                                                                    ],\n                                                                    'FunctionGraph' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Event' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'type' => 'string',\n                                                                                    'sentAs' => 'Event'\n                                                                            ]\n                                                                    ],\n                                                                    'Filter' => [ \n                                                                            'type' => 'array',\n                                                                            'wrapper' => 'Filter',\n                                                                            'sentAs' => 'Object',\n                                                                            'items' => [ \n                                                                                    'type' => 'object',\n                                                                                    'sentAs' => 'FilterRule',\n                                                                                    'properties' => [ \n                                                                                            'Name' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ],\n\n                                                                                            'Value' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ]\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'optionsObject' => [ \n                            'httpMethod' => 'OPTIONS',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'Origin' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'header'\n                                    ],\n                                    'AccessControlRequestMethods' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'header',\n                                            'items' => [ \n                                                    'sentAs' => 'Access-Control-Request-Method',\n                                                    'type' => 'string'\n                                            ]\n                                    ],\n                                    'AccessControlRequestHeaders' => [ \n                                            'type' => 'array',\n                                            'location' => 'header',\n                                            'items' => [ \n                                                    'sentAs' => 'Access-Control-Request-Headers',\n                                                    'type' => 'string'\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'AllowOrigin' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-origin'\n                                            ],\n                                            'AllowHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-headers'\n                                            ],\n                                            'AllowMethod' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-methods'\n                                            ],\n                                            'ExposeHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-expose-headers'\n                                            ],\n                                            'MaxAgeSeconds' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-max-age'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteObject' => [ \n                            'httpMethod' => 'DELETE',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'DeleteMarker' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-delete-marker'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-version-id'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n                    'deleteObjects' => [ \n                            'httpMethod' => 'POST',\n                            'specialParam' => 'delete',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'Delete'\n                                    ],\n                                    'contentMd5' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Quiet' => [ \n                                            'type' => 'boolean',\n                                            'location' => 'xml'\n                                    ],\n                                    'Objects' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'type' => 'object',\n                                                    'sentAs' => 'Object',\n                                                    'properties' => [ \n                                                            'Key' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'string'\n                                                            ],\n                                                            'VersionId' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Deleteds' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Deleted',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'DeletedObject',\n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'VersionId' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'DeleteMarker' => [ \n                                                                            'type' => 'boolean'\n                                                                    ],\n                                                                    'DeleteMarkerVersionId' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Errors' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Error',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'Error',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Error',\n                                                            'properties' => [ \n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'VersionId' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Code' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Message' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setObjectAcl' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'acl',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'AccessControlPolicy'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ],\n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'GrantRead' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-read'\n                                    ],\n                                    'GrantWrite' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-write'\n                                    ],\n                                    'GrantReadAcp' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-read-acp'\n                                    ],\n                                    'GrantWriteAcp' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-write-acp'\n                                    ],\n                                    'GrantFullControl' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-grant-full-control'\n                                    ],\n                                    'Owner' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'ID' => [ \n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'Delivered' => [ \n                                            'type' => 'boolean'\n                                    ],\n                                    'Grants' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'AccessControlList',\n                                            'items' => [ \n                                                    'name' => 'Grant',\n                                                    'type' => 'object',\n                                                    'properties' => [ \n                                                            'Grantee' => [ \n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'ID' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'URI' => [ \n                                                                                    'type' => 'string',\n                                                                                    'sentAs' => 'Canned',\n                                                                                    'transform' => 'aclUri'\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'Permission' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'RequestId' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-request-id'\n                                    ]\n                            ]\n                    ],\n\n                    'getObjectAcl' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'acl',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Owner' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Delivered' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Grants' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'AccessControlList',\n                                                    'items' => [ \n                                                            'name' => 'Grant',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Grant',\n                                                            'properties' => [ \n                                                                    'Grantee' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'URI' => [ \n                                                                                            'type' => 'string',\n                                                                                            'sentAs' => 'Canned'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Permission' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'VersionId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-version-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'restoreObject' => [ \n                            'httpMethod' => 'POST',\n                            'specialParam' => 'restore',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'RestoreRequest'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ],\n                                    'Days' => [ \n                                            'required' => true,\n                                            'type' => 'numeric',\n                                            'location' => 'xml',\n                                            'sentAs' => 'Days'\n                                    ],\n                                    'Tier' => [ \n                                            'wrapper' => 'RestoreJob',\n                                            'type' => 'string',\n                                            'sentAs' => 'Tier',\n                                            'location' => 'xml'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'RequestId' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-request-id'\n                                    ]\n                            ]\n                    ],\n\n                    'putObject' => [ \n                            'httpMethod' => 'PUT',\n                            'requestParameters' => [ \n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'StorageClass' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-storage-class'\n                                    ],\n                                    'Body' => [ \n                                            'type' => 'stream',\n                                            'location' => 'body'\n                                    ],\n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'ContentMD5' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-MD5'\n                                    ],\n                                    'ContentType' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-Type'\n                                    ],\n                                    'ContentLength' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-Length'\n                                    ],\n                                    'Metadata' => [ \n                                            'type' => 'object',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-meta-'\n                                    ],\n                                    'SourceFile' => [ \n                                            'type' => 'file',\n                                            'location' => 'body'\n                                    ],\n                                    'WebsiteRedirectLocation' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-website-redirect-location'\n                                    ],\n                                    'SseKms' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption'\n                                    ],\n                                    'SseKmsKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-aws-kms-key-id'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ],\n                                    'SuccessRedirect' => [ \n                                            'location' => 'header',\n                                            'type' => 'string',\n                                            'sentAs' => 'success-action-redirect'\n                                    ],\n                                    'Expires' => [ \n                                            'location' => 'header',\n                                            'type' => 'string',\n                                            'sentAs' => 'x-obs-expires'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-version-id'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'StorageClass' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-storage-class'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getObject' => [ \n                            'httpMethod' => 'GET',\n                            'stream' => true,\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'IfMatch' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'If-Match'\n                                    ],\n                                    'IfModifiedSince' => [ \n                                            'type' => 'string',\n                                            'format' => 'date-time-http',\n                                            'location' => 'header',\n                                            'sentAs' => 'If-Modified-Since'\n                                    ],\n                                    'IfNoneMatch' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'If-None-Match'\n                                    ],\n                                    'IfUnmodifiedSince' => [ \n                                            'type' => 'string',\n                                            'format' => 'date-time-http',\n                                            'location' => 'header',\n                                            'sentAs' => 'If-Unmodified-Since'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'Range' => [ \n                                            'type' => 'string',\n                                            'location' => 'header'\n                                    ],\n                                    'ImageProcess' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'x-image-process'\n                                    ],\n                                    'ResponseCacheControl' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-cache-control'\n                                    ],\n                                    'ResponseContentDisposition' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-content-disposition'\n                                    ],\n                                    'ResponseContentEncoding' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-content-encoding'\n                                    ],\n                                    'ResponseContentLanguage' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-content-language'\n                                    ],\n                                    'ResponseContentType' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-content-type'\n                                    ],\n                                    'ResponseExpires' => [ \n                                            'type' => 'string',\n                                            'format' => 'date-time-http',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-expires'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ],\n                                    'SaveAsFile' => [ \n                                            'type' => 'file',\n                                            'location' => 'response'\n                                    ],\n                                    'FilePath' => [ \n                                            'type' => 'file',\n                                            'location' => 'response'\n                                    ],\n\n                                    'Origin' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Origin'\n                                    ],\n                                    'RequestHeader' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Access-Control-Request-Headers'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Body' => [ \n                                                    'type' => 'stream',\n                                                    'location' => 'body'\n                                            ],\n                                            'DeleteMarker' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-delete-marker'\n                                            ],\n                                            'Expiration' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-expiration'\n                                            ],\n                                            'LastModified' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'last-modified'\n                                            ],\n                                            'ContentLength' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-length'\n                                            ],\n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'etag'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-version-id'\n                                            ],\n                                            'CacheControl' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'cache-control'\n                                            ],\n                                            'ContentDisposition' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-disposition'\n                                            ],\n                                            'ContentEncoding' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-encoding'\n                                            ],\n                                            'ContentLanguage' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-language'\n                                            ],\n                                            'ContentType' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-type'\n                                            ],\n                                            'Expires' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header'\n                                            ],\n                                            'WebsiteRedirectLocation' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-website-redirect-location'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'StorageClass' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-storage-class'\n                                            ],\n                                            'Restore' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-restore'\n                                            ],\n                                            'AllowOrigin' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-origin'\n                                            ],\n                                            'MaxAgeSeconds' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-max-age'\n                                            ],\n                                            'ExposeHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-expose-headers'\n                                            ],\n                                            'AllowMethod' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-methods'\n                                            ],\n                                            'AllowHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-headers'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-key-MD5'\n                                            ],\n                                            'Metadata' => [ \n                                                    'location' => 'header',\n                                                    'type' => 'object',\n                                                    'sentAs' => 'x-obs-meta-'\n                                            ],\n                                            'ObjectType' => [ \n                                                    'location' => 'header',\n                                                    'type' => 'string',\n                                                    'sentAs' => 'x-obs-object-type'\n                                            ],\n                                            'AppendPosition' => [ \n                                                    'location' => 'header',\n                                                    'type' => 'string',\n                                                    'sentAs' => 'x-obs-next-append-position'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'copyObject' => [ \n                            'httpMethod' => 'PUT',\n                            'requestParameters' => [ \n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'StorageClass' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-storage-class'\n                                    ],\n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'CopySource' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-copy-source'\n                                    ],\n                                    'CopySourceIfMatch' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-copy-source-if-match'\n                                    ],\n                                    'CopySourceIfModifiedSince' => [ \n                                            'type' => 'string',\n                                            'format' => 'date-time-http',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-copy-source-if-modified-since'\n                                    ],\n                                    'CopySourceIfNoneMatch' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-copy-source-if-none-match'\n                                    ],\n                                    'CopySourceIfUnmodifiedSince' => [ \n                                            'type' => 'string',\n                                            'format' => 'date-time-http',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-copy-source-if-unmodified-since'\n                                    ],\n                                    'MetadataDirective' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-metadata-directive'\n                                    ],\n                                    'ContentType' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'content-type'\n                                    ],\n                                    'ContentEncoding' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'content-encoding'\n                                    ],\n                                    'ContentLanguage' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'content-language'\n                                    ],\n                                    'ContentDisposition' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'content-disposition'\n                                    ],\n                                    'CacheControl' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'cache-control'\n                                    ],\n                                    'Expires' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'expires'\n                                    ],\n                                    'Metadata' => [ \n                                            'type' => 'object',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-meta-'\n                                    ],\n                                    'WebsiteRedirectLocation' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-website-redirect-location'\n                                    ],\n                                    'SseKms' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption'\n                                    ],\n                                    'SseKmsKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-aws-kms-key-id'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ],\n                                    'CopySourceSseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-copy-source-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'CopySourceSseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-copy-source-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'LastModified' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-version-id'\n                                            ],\n                                            'CopySourceVersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-copy-source-version-id'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getObjectMetadata' => [ \n                            'httpMethod' => 'HEAD',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ],\n                                    'Origin' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Origin'\n                                    ],\n                                    'RequestHeader' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Access-Control-Request-Headers'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Expiration' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-expiration'\n                                            ],\n                                            'LastModified' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'last-modified'\n                                            ],\n                                            'ContentLength' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-length'\n                                            ],\n                                            'ContentType' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-type'\n                                            ],\n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-version-id'\n                                            ],\n                                            'WebsiteRedirectLocation' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-website-redirect-location'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'StorageClass' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-storage-class'\n                                            ],\n                                            'AllowOrigin' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-origin'\n                                            ],\n                                            'MaxAgeSeconds' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-max-age'\n                                            ],\n                                            'ExposeHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-expose-headers'\n                                            ],\n                                            'AllowMethod' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-methods'\n                                            ],\n                                            'AllowHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-headers'\n                                            ],\n                                            'Restore' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-restore'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-key-MD5'\n                                            ],\n                                            'Metadata' => [ \n                                                    'location' => 'header',\n                                                    'type' => 'object',\n                                                    'sentAs' => 'x-obs-meta-'\n                                            ],\n                                            'ObjectType' => [ \n                                                    'location' => 'header',\n                                                    'type' => 'string',\n                                                    'sentAs' => 'x-obs-object-type'\n                                            ],\n                                            'AppendPosition' => [ \n                                                    'location' => 'header',\n                                                    'type' => 'string',\n                                                    'sentAs' => 'x-obs-next-append-position'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'initiateMultipartUpload' => [ \n                            'httpMethod' => 'POST',\n                            'specialParam' => 'uploads',\n                            'requestParameters' => [ \n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'StorageClass' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-storage-class'\n                                    ],\n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'ContentType' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-Type'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'Metadata' => [ \n                                            'type' => 'object',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-meta-'\n                                    ],\n                                    'WebsiteRedirectLocation' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-website-redirect-location'\n                                    ],\n                                    'SseKms' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption'\n                                    ],\n                                    'SseKmsKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-aws-kms-key-id'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ],\n                                    'Expires' => [ \n                                            'location' => 'header',\n                                            'type' => 'string',\n                                            'sentAs' => 'x-obs-expires'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Bucket' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Bucket'\n                                            ],\n                                            'Key' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'UploadId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'listMultipartUploads' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'uploads',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Delimiter' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'delimiter'\n                                    ],\n                                    'KeyMarker' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'key-marker'\n                                    ],\n                                    'MaxUploads' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'max-uploads'\n                                    ],\n                                    'Prefix' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'prefix'\n                                    ],\n                                    'UploadIdMarker' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'upload-id-marker'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Bucket' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'KeyMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'UploadIdMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextKeyMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Prefix' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Delimiter' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextUploadIdMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'MaxUploads' => [ \n                                                    'type' => 'numeric',\n                                                    'location' => 'xml'\n                                            ],\n                                            'IsTruncated' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Uploads' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Upload',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'MultipartUpload',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Upload',\n                                                            'properties' => [ \n                                                                    'UploadId' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Initiated' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'StorageClass' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Owner' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Initiator' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'CommonPrefixes' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'CommonPrefix',\n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'Prefix' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'abortMultipartUpload' => [ \n                            'httpMethod' => 'DELETE',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'UploadId' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'uploadId'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'uploadPart' => [ \n                            'httpMethod' => 'PUT',\n                            'requestParameters' => [ \n                                    'Body' => [ \n                                            'type' => 'stream',\n                                            'location' => 'body'\n                                    ],\n                                    'SourceFile' => [ \n                                            'type' => 'file',\n                                            'location' => 'body'\n                                    ],\n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'PartNumber' => [ \n                                            'required' => true,\n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'partNumber'\n                                    ],\n                                    'UploadId' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'uploadId'\n                                    ],\n                                    'Offset' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'response'\n                                    ],\n                                    'PartSize' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'response'\n                                    ],\n                                    'ContentMD5' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-MD5'\n                                    ],\n                                    'ContentType' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-Type'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'completeMultipartUpload' => [ \n                            'httpMethod' => 'POST',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'CompleteMultipartUpload'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'Parts' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'name' => 'CompletedPart',\n                                                    'type' => 'object',\n                                                    'sentAs' => 'Part',\n                                                    'properties' => [ \n                                                            'PartNumber' => [ \n                                                                    'type' => 'numeric'\n                                                            ],\n                                                            'ETag' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ],\n                                    'UploadId' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'uploadId'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Location' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Bucket' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Key' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Location' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-version-id'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'listParts' => [ \n                            'httpMethod' => 'GET',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'MaxParts' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'max-parts'\n                                    ],\n                                    'PartNumberMarker' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'part-number-marker'\n                                    ],\n                                    'UploadId' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'uploadId'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Bucket' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Key' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'UploadId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'PartNumberMarker' => [ \n                                                    'type' => 'numeric',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextPartNumberMarker' => [ \n                                                    'type' => 'numeric',\n                                                    'location' => 'xml'\n                                            ],\n                                            'MaxParts' => [ \n                                                    'type' => 'numeric',\n                                                    'location' => 'xml'\n                                            ],\n                                            'IsTruncated' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Parts' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Part',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'Part',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Part',\n                                                            'properties' => [ \n                                                                    'PartNumber' => [ \n                                                                            'type' => 'integer'\n                                                                    ],\n                                                                    'LastModified' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'ETag' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Size' => [ \n                                                                            'type' => 'integer'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Initiator' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Owner' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'StorageClass' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'copyPart' => [ \n                            'httpMethod' => 'PUT',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'CopySource' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-copy-source'\n                                    ],\n                                    'CopySourceRange' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-copy-source-range'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'PartNumber' => [ \n                                            'required' => true,\n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'partNumber'\n                                    ],\n                                    'UploadId' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'uploadId'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ],\n                                    'CopySourceSseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-copy-source-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'CopySourceSseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-obs-copy-source-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'LastModified' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-request-id'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-obs-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ]\n            ],\n\n            'aliases' => [ \n                    'headBucket' => 'getBucketMetadata',\n\n                    'getBucketLogging' => 'getBucketLoggingConfiguration',\n                    'setBucketLogging' => 'setBucketLoggingConfiguration',\n                    'getBucketVersioning' => 'getBucketVersioningConfiguration',\n                    'setBucketVersioning' => 'setBucketVersioningConfiguration',\n                    'setBucketWebsite' => 'setBucketWebsiteConfiguration',\n                    'getBucketWebsite' => 'getBucketWebsiteConfiguration',\n                    'deleteBucketWebsite' => 'deleteBucketWebsiteConfiguration',\n                    'setBucketLifecycle' => 'setBucketLifecycleConfiguration',\n                    'getBucketLifecycle' => 'getBucketLifecycleConfiguration',\n                    'deleteBucketLifecycle' => 'deleteBucketLifecycleConfiguration'\n            ]\n    ];\n}"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Resource/V2Constants.php",
    "content": "<?php\nnamespace Obs\\Internal\\Resource;\n\nclass V2Constants extends Constants {\n    const FLAG = 'AWS';\n    const METADATA_PREFIX = 'x-amz-meta-';\n    const HEADER_PREFIX = 'x-amz-';\n    const ALTERNATIVE_DATE_HEADER = 'x-amz-date';\n    const SECURITY_TOKEN_HEAD = 'x-amz-security-token';\n    const TEMPURL_AK_HEAD = 'AWSAccessKeyId';\n    \n    const GROUP_ALL_USERS_PREFIX = 'http://acs.amazonaws.com/groups/global/';\n    const GROUP_AUTHENTICATED_USERS_PREFIX = 'http://acs.amazonaws.com/groups/global/';\n    const GROUP_LOG_DELIVERY_PREFIX = 'http://acs.amazonaws.com/groups/s3/';\n    \n    const COMMON_HEADERS = [\n        'content-length' => 'ContentLength',\n        'date' => 'Date',\n        'x-amz-request-id' => 'RequestId',\n        'x-amz-id-2' => 'Id2',\n        'x-reserved' => 'Reserved'\n    ];\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Resource/V2RequestResource.php",
    "content": "<?php\nnamespace Obs\\Internal\\Resource;\n\nclass V2RequestResource {\n    public static $RESOURCE_ARRAY = [ \n            'operations' => [ \n                    'createBucket' => [ \n                            'httpMethod' => 'PUT',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'CreateBucketConfiguration'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'LocationConstraint' => [ \n                                            'type' => 'string',\n                                            'location' => 'xml'\n                                    ],\n                                    'StorageClass' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-default-storage-class',\n                                            'transform' => 'storageClass'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'Location' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                    ],\n                                    'RequestId' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-request-id'\n                                    ]\n                            ]\n                    ],\n\n                    'listBuckets' => [ \n                            'httpMethod' => 'GET',\n                            'requestParameters' => [\n                                'QueryLocation' => [\n                                    'type' => 'boolean',\n                                    'location' => 'header',\n                                    'sentAs' => 'x-amz-location',\n                                ],\n                            ],\n                            'responseParameters' => [ \n                                    'Buckets' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'Buckets',\n                                            'items' => [ \n                                                    'name' => 'Bucket',\n                                                    'type' => 'object',\n                                                    'sentAs' => 'Bucket',\n                                                    'properties' => [ \n                                                            'Name' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'CreationDate' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Location' => [\n                                                                'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ],\n                                    'Owner' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'DisplayName' => [ \n                                                            'type' => 'string'\n                                                    ],\n                                                    'ID' => [ \n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'RequestId' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-request-id'\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucket' => [ \n                            'httpMethod' => 'DELETE',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'listObjects' => [ \n                            'httpMethod' => 'GET',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Delimiter' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'delimiter'\n                                    ],\n                                    'Marker' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'marker'\n                                    ],\n                                    'MaxKeys' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'max-keys'\n                                    ],\n                                    'Prefix' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'prefix'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'IsTruncated' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Marker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Contents' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Contents',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'Object',\n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'LastModified' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'ETag' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Size' => [ \n                                                                            'type' => 'integer'\n                                                                    ],\n                                                                    'StorageClass' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Owner' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'DisplayName' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Name' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Prefix' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Delimiter' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'MaxKeys' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'xml'\n                                            ],\n                                            'CommonPrefixes' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'CommonPrefix',\n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'Prefix' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'Location' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-bucket-region'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'listVersions' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'versions',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Delimiter' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'delimiter'\n                                    ],\n                                    'KeyMarker' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'key-marker'\n                                    ],\n                                    'MaxKeys' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'max-keys'\n                                    ],\n                                    'Prefix' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'prefix'\n                                    ],\n                                    'VersionIdMarker' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'version-id-marker'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'IsTruncated' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'xml'\n                                            ],\n                                            'KeyMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'VersionIdMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextKeyMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextVersionIdMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Versions' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Version',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'ObjectVersion',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Version',\n                                                            'properties' => [ \n                                                                    'ETag' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Size' => [ \n                                                                            'type' => 'integer'\n                                                                    ],\n                                                                    'StorageClass' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'VersionId' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'IsLatest' => [ \n                                                                            'type' => 'boolean'\n                                                                    ],\n                                                                    'LastModified' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Owner' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'DisplayName' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'DeleteMarkers' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'DeleteMarker',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'DeleteMarkerEntry',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'DeleteMarker',\n                                                            'properties' => [ \n                                                                    'Owner' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'DisplayName' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'VersionId' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'IsLatest' => [ \n                                                                            'type' => 'boolean'\n                                                                    ],\n                                                                    'LastModified' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Name' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Prefix' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Delimiter' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'MaxKeys' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'xml'\n                                            ],\n                                            'CommonPrefixes' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'CommonPrefix',\n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'Prefix' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'Location' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-bucket-region'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketMetadata' => [ \n                            'httpMethod' => 'HEAD',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Origin' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Origin'\n                                    ],\n                                    'RequestHeader' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Access-Control-Request-Headers'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'RequestId' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-request-id'\n                                    ],\n                                    'StorageClass' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-default-storage-class'\n                                    ],\n\n                                    'Location' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-bucket-region'\n                                    ],\n\n                                    'AllowOrigin' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'access-control-allow-origin'\n                                    ],\n                                    'MaxAgeSeconds' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'access-control-max-age',\n                                            'type' => 'integer'\n                                    ],\n                                    'ExposeHeader' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'access-control-expose-headers'\n                                    ],\n                                    'AllowMethod' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'access-control-allow-methods'\n                                    ],\n                                    'AllowHeader' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'access-control-allow-headers'\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketLocation' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'location',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Location' => [ \n                                                    'type' => 'string',\n                                                    'sentAs' => 'LocationConstraint',\n                                                    'location' => 'xml'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketStorageInfo' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'storageinfo',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Size' => [ \n                                                    'type' => 'numeric',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Size'\n                                            ],\n                                            'ObjectNumber' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'xml'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n                    'setBucketQuota' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'quota',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'Quota'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'StorageQuota' => [ \n                                            'required' => true,\n                                            'type' => 'numeric',\n                                            'location' => 'xml'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketQuota' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'quota',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'StorageQuota' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'StorageQuota'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketStoragePolicy' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'storagePolicy',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'StoragePolicy'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'StorageClass' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'xml',\n                                            'sentAs' => 'DefaultStorageClass',\n                                            'transform' => 'storageClass'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketStoragePolicy' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'storagePolicy',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'StorageClass' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'DefaultStorageClass'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketAcl' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'acl',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'AccessControlPolicy'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'GrantRead' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-grant-read'\n                                    ],\n                                    'GrantWrite' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-grant-write'\n                                    ],\n                                    'GrantReadAcp' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-grant-read-acp'\n                                    ],\n                                    'GrantWriteAcp' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-grant-write-acp'\n                                    ],\n                                    'GrantFullControl' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-grant-full-control'\n                                    ],\n                                    'Owner' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'DisplayName' => [ \n                                                            'type' => 'string'\n                                                    ],\n                                                    'ID' => [ \n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'Grants' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'AccessControlList',\n                                            'items' => [ \n                                                    'name' => 'Grant',\n                                                    'type' => 'object',\n                                                    'properties' => [ \n                                                            'Grantee' => [ \n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'DisplayName' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'ID' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'Type' => [ \n                                                                                    'required' => true,\n                                                                                    'type' => 'string',\n                                                                                    'sentAs' => 'xsi:type',\n                                                                                    'data' => [ \n                                                                                            'xmlAttribute' => true,\n                                                                                            'xmlNamespace' => 'http://www.w3.org/2001/XMLSchema-instance'\n                                                                                    ]\n                                                                            ],\n                                                                            'URI' => [ \n                                                                                    'type' => 'string',\n                                                                                    'transform' => 'aclUri'\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'Permission' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketAcl' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'acl',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'Owner' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'DisplayName' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Grants' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'AccessControlList',\n                                                    'items' => [ \n                                                            'name' => 'Grant',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Grant',\n                                                            'properties' => [ \n                                                                    'Grantee' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'DisplayName' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'URI' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Permission' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketLoggingConfiguration' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'logging',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'BucketLoggingStatus'\n                                    ],\n                                    'xmlAllowEmpty' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'LoggingEnabled' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'TargetBucket' => [ \n                                                            'type' => 'string'\n                                                    ],\n                                                    'TargetPrefix' => [ \n                                                            'type' => 'string'\n                                                    ],\n                                                    'TargetGrants' => [ \n                                                            'type' => 'array',\n                                                            'items' => [ \n                                                                    'name' => 'Grant',\n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'Grantee' => [ \n                                                                                    'type' => 'object',\n                                                                                    'properties' => [ \n                                                                                            'DisplayName' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ],\n                                                                                            'ID' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ],\n                                                                                            'Type' => [ \n                                                                                                    'required' => true,\n                                                                                                    'type' => 'string',\n                                                                                                    'sentAs' => 'xsi:type',\n                                                                                                    'data' => [ \n                                                                                                            'xmlAttribute' => true,\n                                                                                                            'xmlNamespace' => 'http://www.w3.org/2001/XMLSchema-instance'\n                                                                                                    ]\n                                                                                            ],\n                                                                                            'URI' => [ \n                                                                                                    'type' => 'string',\n                                                                                                    'transform' => 'aclUri'\n                                                                                            ]\n                                                                                    ]\n                                                                            ],\n                                                                            'Permission' => [ \n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketLoggingConfiguration' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'logging',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'LoggingEnabled' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'TargetBucket' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'TargetGrants' => [ \n                                                                    'type' => 'array',\n                                                                    'sentAs' => 'TargetGrants',\n                                                                    'items' => [ \n                                                                            'name' => 'Grant',\n                                                                            'type' => 'object',\n                                                                            'sentAs' => 'Grant',\n                                                                            'properties' => [ \n                                                                                    'Grantee' => [ \n                                                                                            'type' => 'object',\n                                                                                            'properties' => [ \n                                                                                                    'DisplayName' => [ \n                                                                                                            'type' => 'string'\n                                                                                                    ],\n                                                                                                    'ID' => [ \n                                                                                                            'type' => 'string'\n                                                                                                    ],\n                                                                                                    'URI' => [ \n                                                                                                            'type' => 'string'\n                                                                                                    ]\n                                                                                            ]\n                                                                                    ],\n                                                                                    'Permission' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'TargetPrefix' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketPolicy' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'policy',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Policy' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'body'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketPolicy' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'policy',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Policy' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'body'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucketPolicy' => [ \n                            'httpMethod' => 'DELETE',\n                            'specialParam' => 'policy',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketLifecycleConfiguration' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'lifecycle',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'LifecycleConfiguration'\n                                    ],\n                                    'contentMd5' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Rules' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'Rule',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'name' => 'Rule',\n                                                    'type' => 'object',\n                                                    'sentAs' => 'Rule',\n                                                    'properties' => [ \n                                                            'Transitions' => [ \n                                                                    'type' => 'array',\n                                                                    'sentAs' => 'Transition',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'type' => 'object',\n                                                                            'sentAs' => 'Transition',\n                                                                            'properties' => [ \n                                                                                    'StorageClass' => [ \n                                                                                            'type' => 'string',\n                                                                                            'transform' => 'storageClass'\n                                                                                    ],\n                                                                                    'Date' => [ \n                                                                                            'type' => 'string',\n                                                                                            'format' => 'date-time-middle'\n                                                                                    ],\n                                                                                    'Days' => [ \n                                                                                            'type' => 'numeric'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'Expiration' => [ \n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'Date' => [ \n                                                                                    'type' => 'string',\n                                                                                    'format' => 'date-time-middle'\n                                                                            ],\n                                                                            'Days' => [ \n                                                                                    'type' => 'numeric'\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'NoncurrentVersionTransitions' => [ \n                                                                    'type' => 'array',\n                                                                    'sentAs' => 'NoncurrentVersionTransition',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'type' => 'object',\n                                                                            'sentAs' => 'NoncurrentVersionTransition',\n                                                                            'properties' => [ \n                                                                                    'StorageClass' => [ \n                                                                                            'type' => 'string',\n                                                                                            'transform' => 'storageClass'\n                                                                                    ],\n                                                                                    'NoncurrentDays' => [ \n                                                                                            'type' => 'numeric'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'NoncurrentVersionExpiration' => [ \n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'NoncurrentDays' => [ \n                                                                                    'type' => 'numeric'\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Prefix' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'string',\n                                                                    'canEmpty' => true\n                                                            ],\n                                                            'Status' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketLifecycleConfiguration' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'lifecycle',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'Rules' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Rule',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'Rule',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Rule',\n                                                            'properties' => [ \n                                                                    'Transitions' => [ \n                                                                            'type' => 'array',\n                                                                            'sentAs' => 'Transition',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'type' => 'object',\n                                                                                    'sentAs' => 'Transition',\n                                                                                    'properties' => [ \n                                                                                            'StorageClass' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ],\n                                                                                            'Date' => [ \n                                                                                                    'type' => 'string',\n                                                                                                    'format' => 'date-time-middle'\n                                                                                            ],\n                                                                                            'Days' => [ \n                                                                                                    'type' => 'numeric'\n                                                                                            ]\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Expiration' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'Date' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'Days' => [ \n                                                                                            'type' => 'integer'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'NoncurrentVersionTransitions' => [ \n                                                                            'type' => 'array',\n                                                                            'sentAs' => 'NoncurrentVersionTransition',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'type' => 'object',\n                                                                                    'sentAs' => 'NoncurrentVersionTransition',\n                                                                                    'properties' => [ \n                                                                                            'StorageClass' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ],\n                                                                                            'NoncurrentDays' => [ \n                                                                                                    'type' => 'numeric'\n                                                                                            ]\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'NoncurrentVersionExpiration' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'NoncurrentDays' => [ \n                                                                                            'type' => 'integer'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'ID' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Prefix' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Status' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucketLifecycleConfiguration' => [ \n                            'httpMethod' => 'DELETE',\n                            'specialParam' => 'lifecycle',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketWebsiteConfiguration' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'website',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'WebsiteConfiguration'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'ErrorDocument' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'Key' => [ \n                                                            'required' => true,\n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'IndexDocument' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'Suffix' => [ \n                                                            'required' => true,\n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'RedirectAllRequestsTo' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'HostName' => [ \n                                                            'required' => true,\n                                                            'type' => 'string'\n                                                    ],\n                                                    'Protocol' => [ \n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'RoutingRules' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'items' => [ \n                                                    'name' => 'RoutingRule',\n                                                    'type' => 'object',\n                                                    'properties' => [ \n                                                            'Condition' => [ \n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'HttpErrorCodeReturnedEquals' => [ \n                                                                                    'type' => 'numeric'\n                                                                            ],\n                                                                            'KeyPrefixEquals' => [ \n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'Redirect' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'HostName' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'HttpRedirectCode' => [ \n                                                                                    'type' => 'numeric'\n                                                                            ],\n                                                                            'Protocol' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'ReplaceKeyPrefixWith' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'ReplaceKeyWith' => [ \n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketWebsiteConfiguration' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'website',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'RedirectAllRequestsTo' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'HostName' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Protocol' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'IndexDocument' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'Suffix' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'ErrorDocument' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'Key' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RoutingRules' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'items' => [ \n                                                            'name' => 'RoutingRule',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'RoutingRule',\n                                                            'properties' => [ \n                                                                    'Condition' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'HttpErrorCodeReturnedEquals' => [ \n                                                                                            'type' => 'integer'\n                                                                                    ],\n                                                                                    'KeyPrefixEquals' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Redirect' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'HostName' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'HttpRedirectCode' => [ \n                                                                                            'type' => 'integer'\n                                                                                    ],\n                                                                                    'Protocol' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'ReplaceKeyPrefixWith' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'ReplaceKeyWith' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucketWebsiteConfiguration' => [ \n                            'httpMethod' => 'DELETE',\n                            'specialParam' => 'website',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketVersioningConfiguration' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'versioning',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'VersioningConfiguration'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Status' => [ \n                                            'type' => 'string',\n                                            'location' => 'xml'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketVersioningConfiguration' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'versioning',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'Status' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketCors' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'cors',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'CORSConfiguration'\n                                    ],\n                                    'contentMd5' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'CorsRules' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'CORSRule',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'type' => 'object',\n                                                    'sentAs' => 'CORSRule',\n                                                    'properties' => [ \n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'AllowedMethod' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'array',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'type' => 'string',\n                                                                            'sentAs' => 'AllowedMethod'\n                                                                    ]\n                                                            ],\n                                                            'AllowedOrigin' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'array',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'sentAs' => 'AllowedOrigin',\n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ],\n                                                            'AllowedHeader' => [ \n                                                                    'type' => 'array',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'name' => 'AllowedHeader',\n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ],\n                                                            'MaxAgeSeconds' => [ \n                                                                    'type' => 'numeric'\n                                                            ],\n                                                            'ExposeHeader' => [ \n                                                                    'type' => 'array',\n                                                                    'data' => [ \n                                                                            'xmlFlattened' => true\n                                                                    ],\n                                                                    'items' => [ \n                                                                            'name' => 'ExposeHeader',\n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketCors' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'cors',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'CorsRules' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'CORSRule',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'ID' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'AllowedMethod' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'type' => 'string',\n                                                                                    'sentAs' => 'AllowedMethod'\n                                                                            ]\n                                                                    ],\n                                                                    'AllowedOrigin' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'sentAs' => 'AllowedOrigin',\n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ],\n                                                                    'AllowedHeader' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'name' => 'AllowedHeader',\n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ],\n                                                                    'MaxAgeSeconds' => [ \n                                                                            'type' => 'integer'\n                                                                    ],\n                                                                    'ExposeHeader' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'name' => 'ExposeHeader',\n                                                                                    'type' => 'string'\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucketCors' => [ \n                            'httpMethod' => 'DELETE',\n                            'specialParam' => 'cors',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'optionsBucket' => [ \n                            'httpMethod' => 'OPTIONS',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Origin' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'header'\n                                    ],\n                                    'AccessControlRequestMethods' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'header',\n                                            'items' => [ \n                                                    'sentAs' => 'Access-Control-Request-Method',\n                                                    'type' => 'string'\n                                            ]\n                                    ],\n                                    'AccessControlRequestHeaders' => [ \n                                            'type' => 'array',\n                                            'location' => 'header',\n                                            'items' => [ \n                                                    'sentAs' => 'Access-Control-Request-Headers',\n                                                    'type' => 'string'\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'AllowOrigin' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-origin'\n                                            ],\n                                            'AllowHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-headers'\n                                            ],\n                                            'AllowMethod' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-methods'\n                                            ],\n                                            'ExposeHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-expose-headers'\n                                            ],\n                                            'MaxAgeSeconds' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-max-age'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketTagging' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'tagging',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'Tagging'\n                                    ],\n                                    'contentMd5' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Tags' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'TagSet',\n                                            'items' => [ \n                                                    'required' => true,\n                                                    'type' => 'object',\n                                                    'name' => 'Tag',\n                                                    'properties' => [ \n                                                            'Key' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'string'\n                                                            ],\n                                                            'Value' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketTagging' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'tagging',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'Tags' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'TagSet',\n                                                    'items' => [ \n                                                            'type' => 'object',\n                                                            'name' => 'Tag',\n                                                            'properties' => [ \n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Value' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteBucketTagging' => [ \n                            'httpMethod' => 'DELETE',\n                            'specialParam' => 'tagging',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setBucketNotification' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'notification',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'NotificationConfiguration'\n                                    ],\n                                    'xmlAllowEmpty' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n\n                                    'TopicConfigurations' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'TopicConfiguration',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'TopicConfiguration',\n                                                    'properties' => [ \n                                                            'ID' => [ \n                                                                    'type' => 'string',\n                                                                    'sentAs' => 'Id'\n                                                            ],\n                                                            'Filter' => [ \n                                                                    'type' => 'array',\n                                                                    'wrapper' => 'Filter',\n                                                                    'sentAs' => 'S3Key',\n                                                                    'items' => [ \n                                                                            'type' => 'object',\n                                                                            'sentAs' => 'FilterRule',\n                                                                            'properties' => [ \n                                                                                    'Name' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n\n                                                                                    'Value' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'Topic' => [\n                                                                'type' => 'string'\n                                                            ],\n                                                            'Event' => [\n                                                                'type' => 'array',\n                                                                'data' => [\n                                                                    'xmlFlattened' => true\n                                                                ],\n                                                                'items' => [\n                                                                    'type' => 'string',\n                                                                    'sentAs' => 'Event',\n                                                                    'transform' => 'event'\n                                                                ]\n                                                            ],\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getBucketNotification' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'notification',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'TopicConfigurations' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'TopicConfiguration',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'type' => 'object',\n                                                            'location' => 'xml',\n                                                            'sentAs' => 'TopicConfiguration',\n                                                            'properties' => [ \n                                                                    'ID' => [ \n                                                                            'type' => 'string',\n                                                                            'sentAs' => 'Id'\n                                                                    ],\n                                                                    'Topic' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Event' => [ \n                                                                            'type' => 'array',\n                                                                            'data' => [ \n                                                                                    'xmlFlattened' => true\n                                                                            ],\n                                                                            'items' => [ \n                                                                                    'type' => 'string',\n                                                                                    'sentAs' => 'Event'\n                                                                            ]\n                                                                    ],\n                                                                    'Filter' => [ \n                                                                            'type' => 'array',\n                                                                            'wrapper' => 'Filter',\n                                                                            'sentAs' => 'S3Key',\n                                                                            'items' => [ \n                                                                                    'type' => 'object',\n                                                                                    'sentAs' => 'FilterRule',\n                                                                                    'properties' => [ \n                                                                                            'Name' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ],\n\n                                                                                            'Value' => [ \n                                                                                                    'type' => 'string'\n                                                                                            ]\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'optionsObject' => [ \n                            'httpMethod' => 'OPTIONS',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'Origin' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'header'\n                                    ],\n                                    'AccessControlRequestMethods' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'header',\n                                            'items' => [ \n                                                    'sentAs' => 'Access-Control-Request-Method',\n                                                    'type' => 'string'\n                                            ]\n                                    ],\n                                    'AccessControlRequestHeaders' => [ \n                                            'type' => 'array',\n                                            'location' => 'header',\n                                            'items' => [ \n                                                    'sentAs' => 'Access-Control-Request-Headers',\n                                                    'type' => 'string'\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'AllowOrigin' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-origin'\n                                            ],\n                                            'AllowHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-headers'\n                                            ],\n                                            'AllowMethod' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-methods'\n                                            ],\n                                            'ExposeHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-expose-headers'\n                                            ],\n                                            'MaxAgeSeconds' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-max-age'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'deleteObject' => [ \n                            'httpMethod' => 'DELETE',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'DeleteMarker' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-delete-marker'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-version-id'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n                    'deleteObjects' => [ \n                            'httpMethod' => 'POST',\n                            'specialParam' => 'delete',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'Delete'\n                                    ],\n                                    'contentMd5' => true\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Quiet' => [ \n                                            'type' => 'boolean',\n                                            'location' => 'xml'\n                                    ],\n                                    'Objects' => [ \n                                            'required' => true,\n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'type' => 'object',\n                                                    'sentAs' => 'Object',\n                                                    'properties' => [ \n                                                            'Key' => [ \n                                                                    'required' => true,\n                                                                    'type' => 'string'\n                                                            ],\n                                                            'VersionId' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Deleteds' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Deleted',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'DeletedObject',\n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'VersionId' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'DeleteMarker' => [ \n                                                                            'type' => 'boolean'\n                                                                    ],\n                                                                    'DeleteMarkerVersionId' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Errors' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Error',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'Error',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Error',\n                                                            'properties' => [ \n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'VersionId' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Code' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Message' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'setObjectAcl' => [ \n                            'httpMethod' => 'PUT',\n                            'specialParam' => 'acl',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'AccessControlPolicy'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ],\n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'GrantRead' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-grant-read'\n                                    ],\n                                    'GrantWrite' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-grant-write'\n                                    ],\n                                    'GrantReadAcp' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-grant-read-acp'\n                                    ],\n                                    'GrantWriteAcp' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-grant-write-acp'\n                                    ],\n                                    'GrantFullControl' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-grant-full-control'\n                                    ],\n                                    'Owner' => [ \n                                            'type' => 'object',\n                                            'location' => 'xml',\n                                            'properties' => [ \n                                                    'DisplayName' => [ \n                                                            'type' => 'string'\n                                                    ],\n                                                    'ID' => [ \n                                                            'type' => 'string'\n                                                    ]\n                                            ]\n                                    ],\n                                    'Grants' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'sentAs' => 'AccessControlList',\n                                            'items' => [ \n                                                    'name' => 'Grant',\n                                                    'type' => 'object',\n                                                    'properties' => [ \n                                                            'Grantee' => [ \n                                                                    'type' => 'object',\n                                                                    'properties' => [ \n                                                                            'DisplayName' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'ID' => [ \n                                                                                    'type' => 'string'\n                                                                            ],\n                                                                            'Type' => [ \n                                                                                    'required' => true,\n                                                                                    'type' => 'string',\n                                                                                    'sentAs' => 'xsi:type',\n                                                                                    'data' => [ \n                                                                                            'xmlAttribute' => true,\n                                                                                            'xmlNamespace' => 'http://www.w3.org/2001/XMLSchema-instance'\n                                                                                    ]\n                                                                            ],\n                                                                            'URI' => [ \n                                                                                    'type' => 'string',\n                                                                                    'transform' => 'aclUri'\n                                                                            ]\n                                                                    ]\n                                                            ],\n                                                            'Permission' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'RequestId' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-request-id'\n                                    ]\n                            ]\n                    ],\n\n                    'getObjectAcl' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'acl',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Owner' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'DisplayName' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Grants' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'AccessControlList',\n                                                    'items' => [ \n                                                            'name' => 'Grant',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Grant',\n                                                            'properties' => [ \n                                                                    'Grantee' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'DisplayName' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'URI' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Permission' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'VersionId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-version-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'restoreObject' => [ \n                            'httpMethod' => 'POST',\n                            'specialParam' => 'restore',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'RestoreRequest'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ],\n                                    'Days' => [ \n                                            'required' => true,\n                                            'type' => 'numeric',\n                                            'location' => 'xml',\n                                            'sentAs' => 'Days'\n                                    ],\n                                    'Tier' => [ \n                                            'wrapper' => 'GlacierJobParameters',\n                                            'type' => 'string',\n                                            'sentAs' => 'Tier',\n                                            'location' => 'xml'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'RequestId' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-request-id'\n                                    ]\n                            ]\n                    ],\n\n                    'putObject' => [ \n                            'httpMethod' => 'PUT',\n                            'requestParameters' => [ \n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'StorageClass' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-storage-class',\n                                            'transform' => 'storageClass'\n                                    ],\n                                    'Body' => [ \n                                            'type' => 'stream',\n                                            'location' => 'body'\n                                    ],\n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'ContentMD5' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-MD5'\n                                    ],\n                                    'ContentType' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-Type'\n                                    ],\n                                    'ContentLength' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-Length'\n                                    ],\n                                    'Metadata' => [ \n                                            'type' => 'object',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-meta-'\n                                    ],\n                                    'SourceFile' => [ \n                                            'type' => 'file',\n                                            'location' => 'body'\n                                    ],\n                                    'WebsiteRedirectLocation' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-website-redirect-location'\n                                    ],\n                                    'SseKms' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption'\n                                    ],\n                                    'SseKmsKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-version-id'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'StorageClass' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-storage-class'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getObject' => [ \n                            'httpMethod' => 'GET',\n                            'stream' => true,\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'IfMatch' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'If-Match'\n                                    ],\n                                    'IfModifiedSince' => [ \n                                            'type' => 'string',\n                                            'format' => 'date-time-http',\n                                            'location' => 'header',\n                                            'sentAs' => 'If-Modified-Since'\n                                    ],\n                                    'IfNoneMatch' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'If-None-Match'\n                                    ],\n                                    'IfUnmodifiedSince' => [ \n                                            'type' => 'string',\n                                            'format' => 'date-time-http',\n                                            'location' => 'header',\n                                            'sentAs' => 'If-Unmodified-Since'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'Range' => [ \n                                            'type' => 'string',\n                                            'location' => 'header'\n                                    ],\n                                    'ImageProcess' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'x-image-process'\n                                    ],\n                                    'ResponseCacheControl' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-cache-control'\n                                    ],\n                                    'ResponseContentDisposition' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-content-disposition'\n                                    ],\n                                    'ResponseContentEncoding' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-content-encoding'\n                                    ],\n                                    'ResponseContentLanguage' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-content-language'\n                                    ],\n                                    'ResponseContentType' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-content-type'\n                                    ],\n                                    'ResponseExpires' => [ \n                                            'type' => 'string',\n                                            'format' => 'date-time-http',\n                                            'location' => 'query',\n                                            'sentAs' => 'response-expires'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ],\n                                    'SaveAsFile' => [ \n                                            'type' => 'file',\n                                            'location' => 'response'\n                                    ],\n                                    'FilePath' => [ \n                                            'type' => 'file',\n                                            'location' => 'response'\n                                    ],\n\n                                    'Origin' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Origin'\n                                    ],\n                                    'RequestHeader' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Access-Control-Request-Headers'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Body' => [ \n                                                    'type' => 'stream',\n                                                    'location' => 'body'\n                                            ],\n                                            'DeleteMarker' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-delete-marker'\n                                            ],\n                                            'Expiration' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-expiration'\n                                            ],\n                                            'LastModified' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'last-modified'\n                                            ],\n                                            'ContentLength' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-length'\n                                            ],\n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'etag'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-version-id'\n                                            ],\n                                            'CacheControl' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'cache-control'\n                                            ],\n                                            'ContentDisposition' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-disposition'\n                                            ],\n                                            'ContentEncoding' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-encoding'\n                                            ],\n                                            'ContentLanguage' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-language'\n                                            ],\n                                            'ContentType' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-type'\n                                            ],\n                                            'Expires' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header'\n                                            ],\n                                            'WebsiteRedirectLocation' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-website-redirect-location'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'StorageClass' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-storage-class'\n                                            ],\n                                            'Restore' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-restore'\n                                            ],\n                                            'AllowOrigin' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-origin'\n                                            ],\n                                            'MaxAgeSeconds' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-max-age'\n                                            ],\n                                            'ExposeHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-expose-headers'\n                                            ],\n                                            'AllowMethod' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-methods'\n                                            ],\n                                            'AllowHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-headers'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'\n                                            ],\n                                            'Metadata' => [ \n                                                    'location' => 'header',\n                                                    'type' => 'object',\n                                                    'sentAs' => 'x-amz-meta-'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'copyObject' => [ \n                            'httpMethod' => 'PUT',\n                            'requestParameters' => [ \n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'StorageClass' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-storage-class',\n                                            'transform' => 'storageClass'\n                                    ],\n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'CopySource' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-copy-source'\n                                    ],\n                                    'CopySourceIfMatch' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-copy-source-if-match'\n                                    ],\n                                    'CopySourceIfModifiedSince' => [ \n                                            'type' => 'string',\n                                            'format' => 'date-time-http',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-copy-source-if-modified-since'\n                                    ],\n                                    'CopySourceIfNoneMatch' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-copy-source-if-none-match'\n                                    ],\n                                    'CopySourceIfUnmodifiedSince' => [ \n                                            'type' => 'string',\n                                            'format' => 'date-time-http',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-copy-source-if-unmodified-since'\n                                    ],\n                                    'MetadataDirective' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-metadata-directive'\n                                    ],\n                                    'ContentType' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'content-type'\n                                    ],\n                                    'ContentEncoding' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'content-encoding'\n                                    ],\n                                    'ContentLanguage' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'content-language'\n                                    ],\n                                    'ContentDisposition' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'content-disposition'\n                                    ],\n                                    'CacheControl' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'cache-control'\n                                    ],\n                                    'Expires' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'expires'\n                                    ],\n                                    'Metadata' => [ \n                                            'type' => 'object',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-meta-'\n                                    ],\n                                    'WebsiteRedirectLocation' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-website-redirect-location'\n                                    ],\n                                    'SseKms' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption'\n                                    ],\n                                    'SseKmsKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ],\n                                    'CopySourceSseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'CopySourceSseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'LastModified' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-version-id'\n                                            ],\n                                            'CopySourceVersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-copy-source-version-id'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'getObjectMetadata' => [ \n                            'httpMethod' => 'HEAD',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'VersionId' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'versionId'\n                                    ],\n                                    'Origin' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Origin'\n                                    ],\n                                    'RequestHeader' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Access-Control-Request-Headers'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Expiration' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-expiration'\n                                            ],\n                                            'LastModified' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'last-modified'\n                                            ],\n                                            'ContentLength' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-length'\n                                            ],\n                                            'ContentType' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'content-type'\n                                            ],\n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-version-id'\n                                            ],\n                                            'WebsiteRedirectLocation' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-website-redirect-location'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'StorageClass' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-storage-class'\n                                            ],\n                                            'AllowOrigin' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-origin'\n                                            ],\n                                            'MaxAgeSeconds' => [ \n                                                    'type' => 'integer',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-max-age'\n                                            ],\n                                            'ExposeHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-expose-headers'\n                                            ],\n                                            'AllowMethod' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-methods'\n                                            ],\n                                            'AllowHeader' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'access-control-allow-headers'\n                                            ],\n                                            'Restore' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-restore'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'\n                                            ],\n                                            'Metadata' => [ \n                                                    'location' => 'header',\n                                                    'type' => 'object',\n                                                    'sentAs' => 'x-amz-meta-'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'initiateMultipartUpload' => [ \n                            'httpMethod' => 'POST',\n                            'specialParam' => 'uploads',\n                            'requestParameters' => [ \n                                    'ACL' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-acl',\n                                            'transform' => 'aclHeader'\n                                    ],\n                                    'StorageClass' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-storage-class',\n                                            'transform' => 'storageClass'\n                                    ],\n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'ContentType' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-Type'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'Metadata' => [ \n                                            'type' => 'object',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-meta-'\n                                    ],\n                                    'WebsiteRedirectLocation' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-website-redirect-location'\n                                    ],\n                                    'SseKms' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption'\n                                    ],\n                                    'SseKmsKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Bucket' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Bucket'\n                                            ],\n                                            'Key' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'UploadId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'listMultipartUploads' => [ \n                            'httpMethod' => 'GET',\n                            'specialParam' => 'uploads',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Delimiter' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'delimiter'\n                                    ],\n                                    'KeyMarker' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'key-marker'\n                                    ],\n                                    'MaxUploads' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'max-uploads'\n                                    ],\n                                    'Prefix' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'prefix'\n                                    ],\n                                    'UploadIdMarker' => [ \n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'upload-id-marker'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Bucket' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'KeyMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'UploadIdMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextKeyMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Prefix' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Delimiter' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextUploadIdMarker' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'MaxUploads' => [ \n                                                    'type' => 'numeric',\n                                                    'location' => 'xml'\n                                            ],\n                                            'IsTruncated' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Uploads' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Upload',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'MultipartUpload',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Upload',\n                                                            'properties' => [ \n                                                                    'UploadId' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Key' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Initiated' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'StorageClass' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Owner' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'DisplayName' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ],\n                                                                    'Initiator' => [ \n                                                                            'type' => 'object',\n                                                                            'properties' => [ \n                                                                                    'ID' => [ \n                                                                                            'type' => 'string'\n                                                                                    ],\n                                                                                    'DisplayName' => [ \n                                                                                            'type' => 'string'\n                                                                                    ]\n                                                                            ]\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'CommonPrefixes' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'CommonPrefix',\n                                                            'type' => 'object',\n                                                            'properties' => [ \n                                                                    'Prefix' => [ \n                                                                            'type' => 'string'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'abortMultipartUpload' => [ \n                            'httpMethod' => 'DELETE',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'UploadId' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'uploadId'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'uploadPart' => [ \n                            'httpMethod' => 'PUT',\n                            'requestParameters' => [ \n                                    'Body' => [ \n                                            'type' => 'stream',\n                                            'location' => 'body'\n                                    ],\n                                    'SourceFile' => [ \n                                            'type' => 'file',\n                                            'location' => 'body'\n                                    ],\n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'PartNumber' => [ \n                                            'required' => true,\n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'partNumber'\n                                    ],\n                                    'UploadId' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'uploadId'\n                                    ],\n                                    'Offset' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'response'\n                                    ],\n                                    'PartSize' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'response'\n                                    ],\n                                    'ContentMD5' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-MD5'\n                                    ],\n                                    'ContentType' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'Content-Type'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'completeMultipartUpload' => [ \n                            'httpMethod' => 'POST',\n                            'data' => [ \n                                    'xmlRoot' => [ \n                                            'name' => 'CompleteMultipartUpload'\n                                    ]\n                            ],\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'Parts' => [ \n                                            'type' => 'array',\n                                            'location' => 'xml',\n                                            'data' => [ \n                                                    'xmlFlattened' => true\n                                            ],\n                                            'items' => [ \n                                                    'name' => 'CompletedPart',\n                                                    'type' => 'object',\n                                                    'sentAs' => 'Part',\n                                                    'properties' => [ \n                                                            'PartNumber' => [ \n                                                                    'type' => 'numeric'\n                                                            ],\n                                                            'ETag' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ]\n                                    ],\n                                    'UploadId' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'uploadId'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Location' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Bucket' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Key' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Location' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'VersionId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-version-id'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'listParts' => [ \n                            'httpMethod' => 'GET',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'MaxParts' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'max-parts'\n                                    ],\n                                    'PartNumberMarker' => [ \n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'part-number-marker'\n                                    ],\n                                    'UploadId' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'uploadId'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'Bucket' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Key' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'UploadId' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'PartNumberMarker' => [ \n                                                    'type' => 'numeric',\n                                                    'location' => 'xml'\n                                            ],\n                                            'NextPartNumberMarker' => [ \n                                                    'type' => 'numeric',\n                                                    'location' => 'xml'\n                                            ],\n                                            'MaxParts' => [ \n                                                    'type' => 'numeric',\n                                                    'location' => 'xml'\n                                            ],\n                                            'IsTruncated' => [ \n                                                    'type' => 'boolean',\n                                                    'location' => 'xml'\n                                            ],\n                                            'Parts' => [ \n                                                    'type' => 'array',\n                                                    'location' => 'xml',\n                                                    'sentAs' => 'Part',\n                                                    'data' => [ \n                                                            'xmlFlattened' => true\n                                                    ],\n                                                    'items' => [ \n                                                            'name' => 'Part',\n                                                            'type' => 'object',\n                                                            'sentAs' => 'Part',\n                                                            'properties' => [ \n                                                                    'PartNumber' => [ \n                                                                            'type' => 'integer'\n                                                                    ],\n                                                                    'LastModified' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'ETag' => [ \n                                                                            'type' => 'string'\n                                                                    ],\n                                                                    'Size' => [ \n                                                                            'type' => 'integer'\n                                                                    ]\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Initiator' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'DisplayName' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'Owner' => [ \n                                                    'type' => 'object',\n                                                    'location' => 'xml',\n                                                    'properties' => [ \n                                                            'DisplayName' => [ \n                                                                    'type' => 'string'\n                                                            ],\n                                                            'ID' => [ \n                                                                    'type' => 'string'\n                                                            ]\n                                                    ]\n                                            ],\n                                            'StorageClass' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ]\n                                    ]\n                            ]\n                    ],\n\n                    'copyPart' => [ \n                            'httpMethod' => 'PUT',\n                            'requestParameters' => [ \n                                    'Bucket' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'dns'\n                                    ],\n                                    'CopySource' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-copy-source'\n                                    ],\n                                    'CopySourceRange' => [ \n                                            'type' => 'string',\n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-copy-source-range'\n                                    ],\n                                    'Key' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'uri'\n                                    ],\n                                    'PartNumber' => [ \n                                            'required' => true,\n                                            'type' => 'numeric',\n                                            'location' => 'query',\n                                            'sentAs' => 'partNumber'\n                                    ],\n                                    'UploadId' => [ \n                                            'required' => true,\n                                            'type' => 'string',\n                                            'location' => 'query',\n                                            'sentAs' => 'uploadId'\n                                    ],\n                                    'SseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'SseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ],\n                                    'CopySourceSseC' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-algorithm'\n                                    ],\n                                    'CopySourceSseCKey' => [ \n                                            'location' => 'header',\n                                            'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-key',\n                                            'type' => 'password'\n                                    ]\n                            ],\n                            'responseParameters' => [ \n                                    'type' => 'object',\n                                    'properties' => [ \n                                            'ETag' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'LastModified' => [ \n                                                    'type' => 'string',\n                                                    'location' => 'xml'\n                                            ],\n                                            'RequestId' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-request-id'\n                                            ],\n                                            'SseKms' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption'\n                                            ],\n                                            'SseKmsKey' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id'\n                                            ],\n                                            'SseC' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-algorithm'\n                                            ],\n                                            'SseCKeyMd5' => [ \n                                                    'location' => 'header',\n                                                    'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5'\n                                            ]\n                                    ]\n                            ]\n                    ]\n            ],\n\n            'aliases' => [ \n                    'headBucket' => 'getBucketMetadata',\n\n                    'getBucketLogging' => 'getBucketLoggingConfiguration',\n                    'setBucketLogging' => 'setBucketLoggingConfiguration',\n                    'getBucketVersioning' => 'getBucketVersioningConfiguration',\n                    'setBucketVersioning' => 'setBucketVersioningConfiguration',\n                    'setBucketWebsite' => 'setBucketWebsiteConfiguration',\n                    'getBucketWebsite' => 'getBucketWebsiteConfiguration',\n                    'deleteBucketWebsite' => 'deleteBucketWebsiteConfiguration',\n                    'setBucketLifecycle' => 'setBucketLifecycleConfiguration',\n                    'getBucketLifecycle' => 'getBucketLifecycleConfiguration',\n                    'deleteBucketLifecycle' => 'deleteBucketLifecycleConfiguration'\n            ]            \n    ];\n}"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/SendRequestTrait.php",
    "content": "<?php\n\nnamespace Obs\\Internal;\n\nuse GuzzleHttp\\Psr7;\nuse Obs\\Log\\ObsLog;\nuse GuzzleHttp\\Psr7\\Request;\nuse GuzzleHttp\\Psr7\\Response;\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Exception\\ConnectException;\nuse Obs\\Internal\\Common\\Model;\nuse Obs\\Internal\\Resource\\V2Constants;\nuse Obs\\ObsException;\nuse Obs\\Internal\\Signature\\V4Signature;\nuse Obs\\Internal\\Signature\\DefaultSignature;\nuse GuzzleHttp\\Client;\nuse Obs\\Internal\\Resource\\Constants;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Obs\\Internal\\Resource\\V2RequestResource;\n\ntrait SendRequestTrait\n{\n\tprotected $ak;\n\t\n\tprotected $sk;\n\t\n\tprotected $securityToken = false;\n\t\n\tprotected $endpoint = '';\n\t\n\tprotected $pathStyle = false;\n\t\n\tprotected $region = 'region';\n\t\n\tprotected $signature = 'v2';\n\t\n\tprotected $sslVerify = false;\n\t\n\tprotected $maxRetryCount = 3;\n\t\n\tprotected $timeout = 0;\n\t\n\tprotected $socketTimeout = 60; \n\t\n\tprotected $connectTimeout = 60;\n\t\n\t/** @var Client */\n\tprotected $httpClient;\n\t\n\tpublic function createSignedUrl(array $args=[]){\n\t    if (strcasecmp($this -> signature, 'v4') === 0) {\n\t        return $this -> createV4SignedUrl($args);\n\t    }\n\t    return $this->createCommonSignedUrl($args, $this->signature);\n\t}\n\t\n\tpublic function createV2SignedUrl(array $args=[]) {\n\t    return $this->createCommonSignedUrl($args, 'v2');\n\t}\n\t\n\tprivate function createCommonSignedUrl(array $args=[], $signature) {\n\t    if(!isset($args['Method'])){\n\t        $obsException = new ObsException('Method param must be specified, allowed values: GET | PUT | HEAD | POST | DELETE | OPTIONS');\n\t        $obsException-> setExceptionType('client');\n\t        throw $obsException;\n\t    }\n\t    $method = strval($args['Method']);\n\t    $bucketName = isset($args['Bucket'])? strval($args['Bucket']): null;\n\t    $objectKey =  isset($args['Key'])? strval($args['Key']): null;\n\t    $specialParam = isset($args['SpecialParam'])? strval($args['SpecialParam']): null;\n\t    $expires = isset($args['Expires']) && is_numeric($args['Expires']) ? intval($args['Expires']): 300;\n\t    \n\t    $headers = [];\n\t    if(isset($args['Headers']) && is_array($args['Headers']) ){\n\t        foreach ($args['Headers'] as $key => $val){\n\t            if(is_string($key) && $key !== ''){\n\t                $headers[$key] = $val;\n\t            }\n\t        }\n\t    }\n\t    \n\t    $queryParams = [];\n\t    if(isset($args['QueryParams']) && is_array($args['QueryParams']) ){\n\t        foreach ($args['QueryParams'] as $key => $val){\n\t            if(is_string($key) && $key !== ''){\n    \t            $queryParams[$key] = $val;\n\t            }\n\t        }\n\t    }\n\t    \n\t    $constants = Constants::selectConstants($signature);\n\t    if($this->securityToken && !isset($queryParams[$constants::SECURITY_TOKEN_HEAD])){\n\t        $queryParams[$constants::SECURITY_TOKEN_HEAD] = $this->securityToken;\n\t    }\n\t    \n\t    $sign = new DefaultSignature($this->ak, $this->sk, $this->pathStyle, $this->endpoint, $method, $this->signature);\n\t    \n\t    $url = parse_url($this->endpoint);\n\t    $host = $url['host'];\n\t    \n\t    $result = '';\n\t    \n\t    if($bucketName){\n\t        if($this-> pathStyle){\n\t            $result = '/' . $bucketName;\n\t        }else{\n\t            $host = $bucketName . '.' . $host;\n\t        }\n\t    }\n\t    \n\t    if($objectKey){\n\t        $objectKey = $sign ->urlencodeWithSafe($objectKey);\n\t        $result .= '/' . $objectKey;\n\t    }\n\t    \n\t    $result .= '?';\n\t    \n\t    if($specialParam){\n\t        $queryParams[$specialParam] = '';\n\t    }\n\t    \n\t    $queryParams[$constants::TEMPURL_AK_HEAD] = $this->ak;\n\t    \n\t    \n\t    if(!is_numeric($expires) || $expires < 0){\n\t        $expires = 300;\n\t    }\n\t    $expires = intval($expires) + intval(microtime(true));\n\t    \n\t    $queryParams['Expires'] = strval($expires);\n\t    \n\t    $_queryParams = [];\n\t    \n\t    foreach ($queryParams as $key => $val){\n\t        $key = $sign -> urlencodeWithSafe($key);\n\t        $val = $sign -> urlencodeWithSafe($val);\n\t        $_queryParams[$key] = $val;\n\t        $result .= $key;\n\t        if($val){\n\t            $result .= '=' . $val;\n\t        }\n\t        $result .= '&';\n\t    }\n\t    \n\t    $canonicalstring = $sign ->makeCanonicalstring($method, $headers, $_queryParams, $bucketName, $objectKey, $expires);\n\t    $signatureContent = base64_encode(hash_hmac('sha1', $canonicalstring, $this->sk, true));\n\t    \n\t    $result .= 'Signature=' . $sign->urlencodeWithSafe($signatureContent);\n\t    \n\t    $model = new Model();\n\t    $model['ActualSignedRequestHeaders'] = $headers;\n\t    $model['SignedUrl'] = $url['scheme'] . '://' . $host . ':' . (isset($url['port']) ? $url['port'] : (strtolower($url['scheme']) === 'https' ? '443' : '80')) . $result;\n\t    return $model;\n\t}\n\t\n\tpublic function createV4SignedUrl(array $args=[]){\n\t\tif(!isset($args['Method'])){\n\t\t\t$obsException= new ObsException('Method param must be specified, allowed values: GET | PUT | HEAD | POST | DELETE | OPTIONS');\n\t\t\t$obsException-> setExceptionType('client');\n\t\t\tthrow $obsException;\n\t\t}\n\t\t$method = strval($args['Method']);\n\t\t$bucketName = isset($args['Bucket'])? strval($args['Bucket']): null;\n\t\t$objectKey =  isset($args['Key'])? strval($args['Key']): null;\n\t\t$specialParam = isset($args['SpecialParam'])? strval($args['SpecialParam']): null;\n\t\t$expires = isset($args['Expires']) && is_numeric($args['Expires']) ? intval($args['Expires']): 300;\n\t\t$headers = [];\n\t\tif(isset($args['Headers']) && is_array($args['Headers']) ){\n\t\t\tforeach ($args['Headers'] as $key => $val){\n\t\t\t    if(is_string($key) && $key !== ''){\n\t\t\t        $headers[$key] = $val;\n\t\t\t    }\n\t\t\t}\n\t\t}\n\t\t\n\t\t$queryParams = [];\n\t\tif(isset($args['QueryParams']) && is_array($args['QueryParams']) ){\n\t\t\tforeach ($args['QueryParams'] as $key => $val){\n\t\t\t    if(is_string($key) && $key !== ''){\n\t\t\t        $queryParams[$key] = $val;\n\t\t\t    }\n\t\t\t}\n\t\t}\n\t\t\n\t\tif($this->securityToken && !isset($queryParams['x-amz-security-token'])){\n\t\t    $queryParams['x-amz-security-token'] = $this->securityToken;\n\t\t}\n\t\t\n\t\t$v4 = new V4Signature($this->ak, $this->sk, $this->pathStyle, $this->endpoint, $this->region, $method, $this->signature);\n\t\t\n\t\t$url = parse_url($this->endpoint);\n\t\t$host = $url['host'];\n\t\t\n\t\t$result = '';\n\t\t\n\t\tif($bucketName){\n\t\t\tif($this-> pathStyle){\n\t\t\t\t$result = '/' . $bucketName;\n\t\t\t}else{\n\t\t\t\t$host = $bucketName . '.' . $host;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif($objectKey){\n\t\t\t$objectKey = $v4 -> urlencodeWithSafe($objectKey);\n\t\t\t$result .= '/' . $objectKey;\n\t\t}\n\t\t\n\t\t$result .= '?';\n\t\t\n\t\tif($specialParam){\n\t\t\t$queryParams[$specialParam] = '';\n\t\t}\n\t\t\n\t\tif(!is_numeric($expires) || $expires < 0){\n\t\t\t$expires = 300;\n\t\t}\n\t\t\n\t\t$expires = strval($expires);\n\t\t\n\t\t$date = isset($headers['date']) ? $headers['date'] : (isset($headers['Date']) ? $headers['Date'] : null);\n\t\t\n\t\t$timestamp = $date ? date_create_from_format('D, d M Y H:i:s \\G\\M\\T', $date, new \\DateTimeZone ('UTC')) -> getTimestamp()\n\t\t\t:time();\n\t\t\n\t\t$longDate = gmdate('Ymd\\THis\\Z', $timestamp);\n\t\t$shortDate = substr($longDate, 0, 8);\n\t\t\n\t\t$headers['host'] = $host;\n\t\tif(isset($url['port'])){\n\t\t    $port = $url['port'];\n\t\t    if($port !== 443 && $port !== 80){\n\t\t        $headers['host'] = $headers['host'] . ':' . $port;\n\t\t    }\n\t\t}\n\t\t\n\t\t$signedHeaders = $v4 -> getSignedHeaders($headers);\n\t\t\n\t\t$queryParams['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256';\n\t\t$queryParams['X-Amz-Credential'] = $v4 -> getCredential($shortDate);\n\t\t$queryParams['X-Amz-Date'] = $longDate;\n\t\t$queryParams['X-Amz-Expires'] = $expires;\n\t\t$queryParams['X-Amz-SignedHeaders'] = $signedHeaders;\n\t\t\n\t\t$_queryParams = [];\n\t\t\n\t\tforeach ($queryParams as $key => $val){\n\t\t\t$key = rawurlencode($key);\n\t\t\t$val = rawurlencode($val);\n\t\t\t$_queryParams[$key] = $val;\n\t\t\t$result .= $key;\n\t\t\tif($val){\n\t\t\t\t$result .= '=' . $val;\n\t\t\t}\n\t\t\t$result .= '&';\n\t\t}\n\t\t\n\t\t$canonicalstring = $v4 -> makeCanonicalstring($method, $headers, $_queryParams, $bucketName, $objectKey, $signedHeaders, 'UNSIGNED-PAYLOAD');\n\t\t\n\t\t$signatureContent = $v4 -> getSignature($canonicalstring, $longDate, $shortDate);\n\t\t\n\t\t$result .= 'X-Amz-Signature=' . $v4 -> urlencodeWithSafe($signatureContent);\n\t\t\n\t\t$model = new Model();\n\t\t$model['ActualSignedRequestHeaders'] = $headers;\n\t\t$model['SignedUrl'] = $url['scheme'] . '://' . $host . ':' . (isset($url['port']) ? $url['port'] : (strtolower($url['scheme']) === 'https' ? '443' : '80')) . $result;\n\t\treturn $model;\n\t}\n\t\n\tpublic function createPostSignature(array $args=[]) {\n\t    if (strcasecmp($this -> signature, 'v4') === 0) {\n\t        return $this -> createV4PostSignature($args);\n\t    }\n\t    \n\t    $bucketName = isset($args['Bucket'])? strval($args['Bucket']): null;\n\t    $objectKey =  isset($args['Key'])? strval($args['Key']): null;\n\t    $expires = isset($args['Expires']) && is_numeric($args['Expires']) ? intval($args['Expires']): 300;\n\t    \n\t    $formParams = [];\n\t    \n\t    if(isset($args['FormParams']) && is_array($args['FormParams'])){\n\t        foreach ($args['FormParams'] as $key => $val){\n\t            $formParams[$key] = $val;\n\t        }\n\t    }\n\t    \n\t    $constants = Constants::selectConstants($this -> signature);\n\t    if($this->securityToken && !isset($formParams[$constants::SECURITY_TOKEN_HEAD])){\n\t        $formParams[$constants::SECURITY_TOKEN_HEAD] = $this->securityToken;\n\t    }\n\t    \n\t    $timestamp = time();\n\t    $expires = gmdate('Y-m-d\\TH:i:s\\Z', $timestamp + $expires);\n\t    \n\t    if($bucketName){\n\t        $formParams['bucket'] = $bucketName;\n\t    }\n\t    \n\t    if($objectKey){\n\t        $formParams['key'] = $objectKey;\n\t    }\n\t    \n\t    $policy = [];\n\t    \n\t    $policy[] = '{\"expiration\":\"';\n\t    $policy[] = $expires;\n\t    $policy[] = '\", \"conditions\":[';\n\t    \n\t    $matchAnyBucket = true;\n\t    $matchAnyKey = true;\n\t    \n\t    $conditionAllowKeys = ['acl', 'bucket', 'key', 'success_action_redirect', 'redirect', 'success_action_status'];\n\t    \n\t    foreach($formParams as $key => $val){\n\t        if($key){\n\t            $key = strtolower(strval($key));\n\t            \n\t            if($key === 'bucket'){\n\t                $matchAnyBucket = false;\n\t            }else if($key === 'key'){\n\t                $matchAnyKey = false;\n\t            }\n\t            \n\t            if(!in_array($key, Constants::ALLOWED_REQUEST_HTTP_HEADER_METADATA_NAMES) && strpos($key, $constants::HEADER_PREFIX) !== 0 && !in_array($key, $conditionAllowKeys)){\n\t                $key = $constants::METADATA_PREFIX . $key;\n\t            }\n\t            \n\t            $policy[] = '{\"';\n\t            $policy[] = $key;\n\t            $policy[] = '\":\"';\n\t            $policy[] = $val !== null ? strval($val) : '';\n\t            $policy[] = '\"},';\n\t        }\n\t    }\n\t    \n\t    if($matchAnyBucket){\n\t        $policy[] = '[\"starts-with\", \"$bucket\", \"\"],';\n\t    }\n\t    \n\t    if($matchAnyKey){\n\t        $policy[] = '[\"starts-with\", \"$key\", \"\"],';\n\t    }\n\t    \n\t    $policy[] = ']}';\n\t    \n\t    $originPolicy = implode('', $policy);\n\t    \n\t    $policy = base64_encode($originPolicy);\n\t    \n\t    $signatureContent = base64_encode(hash_hmac('sha1', $policy, $this->sk, true));\n\t    \n\t    $model = new Model();\n\t    $model['OriginPolicy'] = $originPolicy;\n\t    $model['Policy'] = $policy;\n\t    $model['Signature'] = $signatureContent;\n\t    return $model;\n\t}\n\t\n\tpublic function createV4PostSignature(array $args=[]){\n\t\t$bucketName = isset($args['Bucket'])? strval($args['Bucket']): null;\n\t\t$objectKey =  isset($args['Key'])? strval($args['Key']): null;\n\t\t$expires = isset($args['Expires']) && is_numeric($args['Expires']) ? intval($args['Expires']): 300;\n\t\t\n\t\t$formParams = [];\n\t\t\n\t\tif(isset($args['FormParams']) && is_array($args['FormParams'])){\n\t\t\tforeach ($args['FormParams'] as $key => $val){\n\t\t\t\t$formParams[$key] = $val;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif($this->securityToken && !isset($formParams['x-amz-security-token'])){\n\t\t    $formParams['x-amz-security-token'] = $this->securityToken;\n\t\t}\n\t\t\n\t\t$timestamp = time();\n\t\t$longDate = gmdate('Ymd\\THis\\Z', $timestamp);\n\t\t$shortDate = substr($longDate, 0, 8);\n\t\t\n\t\t$credential = sprintf('%s/%s/%s/s3/aws4_request', $this->ak, $shortDate, $this->region);\n\t\t\n\t\t$expires = gmdate('Y-m-d\\TH:i:s\\Z', $timestamp + $expires);\n\t\t\n\t\t$formParams['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256';\n\t\t$formParams['X-Amz-Date'] = $longDate;\n\t\t$formParams['X-Amz-Credential'] = $credential;\n\t\t\n\t\tif($bucketName){\n\t\t\t$formParams['bucket'] = $bucketName;\n\t\t}\n\t\t\n\t\tif($objectKey){\n\t\t\t$formParams['key'] = $objectKey;\n\t\t}\n\t\t\n\t\t$policy = [];\n\t\t\n\t\t$policy[] = '{\"expiration\":\"';\n\t\t$policy[] = $expires;\n\t\t$policy[] = '\", \"conditions\":[';\n\t\t\n\t\t$matchAnyBucket = true;\n\t\t$matchAnyKey = true;\n\t\t\n\t\t$conditionAllowKeys = ['acl', 'bucket', 'key', 'success_action_redirect', 'redirect', 'success_action_status'];\n\t\t\n\t\tforeach($formParams as $key => $val){\n\t\t\tif($key){\n\t\t\t\t$key = strtolower(strval($key));\n\t\t\t\t\n\t\t\t\tif($key === 'bucket'){\n\t\t\t\t\t$matchAnyBucket = false;\n\t\t\t\t}else if($key === 'key'){\n\t\t\t\t\t$matchAnyKey = false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(!in_array($key, Constants::ALLOWED_REQUEST_HTTP_HEADER_METADATA_NAMES) && strpos($key, V2Constants::HEADER_PREFIX) !== 0 && !in_array($key, $conditionAllowKeys)){\n\t\t\t\t\t$key = V2Constants::METADATA_PREFIX . $key;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$policy[] = '{\"';\n\t\t\t\t$policy[] = $key;\n\t\t\t\t$policy[] = '\":\"';\n\t\t\t\t$policy[] = $val !== null ? strval($val) : '';\n\t\t\t\t$policy[] = '\"},';\n\t\t\t}\n\t\t}\n\t\t\n\t\tif($matchAnyBucket){\n\t\t\t$policy[] = '[\"starts-with\", \"$bucket\", \"\"],';\n\t\t}\n\t\t\n\t\tif($matchAnyKey){\n\t\t\t$policy[] = '[\"starts-with\", \"$key\", \"\"],';\n\t\t}\n\t\t\n\t\t$policy[] = ']}';\n\t\t\n\t\t$originPolicy = implode('', $policy);\n\t\t\n\t\t$policy = base64_encode($originPolicy);\n\t\t\n\t\t$dateKey = hash_hmac('sha256', $shortDate, 'AWS4' . $this -> sk, true);\n\t\t$regionKey = hash_hmac('sha256', $this->region, $dateKey, true);\n\t\t$serviceKey = hash_hmac('sha256', 's3', $regionKey, true);\n\t\t$signingKey = hash_hmac('sha256', 'aws4_request', $serviceKey, true);\n\t\t$signatureContent = hash_hmac('sha256', $policy, $signingKey);\n\t\t\n\t\t$model = new Model();\n\t\t$model['OriginPolicy'] = $originPolicy;\n\t\t$model['Policy'] = $policy;\n\t\t$model['Algorithm'] = $formParams['X-Amz-Algorithm'];\n\t\t$model['Credential'] = $formParams['X-Amz-Credential'];\n\t\t$model['Date'] = $formParams['X-Amz-Date'];\n\t\t$model['Signature'] = $signatureContent;\n\t\treturn $model;\n\t}\n\t\n\tpublic function __call($originMethod, $args)\n\t{\n\t\t$method = $originMethod;\n\t\t\n\t\t$contents = Constants::selectRequestResource($this->signature);\n\t\t$resource = &$contents::$RESOURCE_ARRAY;\n\t\t$async = false;\n\t\tif(strpos($method, 'Async') === (strlen($method) - 5)){\n\t\t\t$method = substr($method, 0, strlen($method) - 5);\n\t\t\t$async = true;\n\t\t}\n\t\t\n\t\tif(isset($resource['aliases'][$method])){\n\t\t    $method = $resource['aliases'][$method];\n\t\t}\n\t\t\n\t\t$method = lcfirst($method);\n\t\t\n\t\t\n\t\t$operation = isset($resource['operations'][$method]) ? \n\t\t\t$resource['operations'][$method] : null;\n\t\t\n\t\tif(!$operation){\n\t\t\tObsLog::commonLog(WARNING, 'unknow method ' . $originMethod);\n\t\t\t$obsException= new ObsException('unknow method '. $originMethod);\n\t\t\t$obsException-> setExceptionType('client');\n\t\t\tthrow $obsException;\n\t\t}\n\t\t\n\t\t$start = microtime(true);\n\t\tif(!$async){\n\t\t\tObsLog::commonLog(INFO, 'enter method '. $originMethod. '...');\n\t\t\t$model = new Model();\n\t\t\t$model['method'] = $method;\n\t\t\t$params = empty($args) ? [] : $args[0];\n\t\t\t$this->checkMimeType($method, $params);\n\t\t\t$this->doRequest($model, $operation, $params);\n\t\t\tObsLog::commonLog(INFO, 'obsclient cost ' . round(microtime(true) - $start, 3) * 1000 . ' ms to execute '. $originMethod);\n\t\t\tunset($model['method']);\n\t\t\treturn $model;\n\t\t}else{\n\t\t\tif(empty($args) || !(is_callable($callback = $args[count($args) -1]))){\n\t\t\t\tObsLog::commonLog(WARNING, 'async method ' . $originMethod . ' must pass a CallbackInterface as param');\n\t\t\t\t$obsException= new ObsException('async method ' . $originMethod . ' must pass a CallbackInterface as param');\n\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\tthrow $obsException;\n\t\t\t}\n\t\t\tObsLog::commonLog(INFO, 'enter method '. $originMethod. '...');\n\t\t\t$params = count($args) === 1 ? [] : $args[0];\n\t\t\t$this->checkMimeType($method, $params);\n\t\t\t$model = new Model();\n\t\t\t$model['method'] = $method;\n\t\t\treturn $this->doRequestAsync($model, $operation, $params, $callback, $start, $originMethod);\n\t\t}\n\t}\n\t\n\tprivate function checkMimeType($method, &$params){\n\t\t// fix bug that guzzlehttp lib will add the content-type if not set\n\t\tif(($method === 'putObject' || $method === 'initiateMultipartUpload' || $method === 'uploadPart') && (!isset($params['ContentType']) || $params['ContentType'] === null)){\n\t\t\tif(isset($params['Key'])){\n\t\t\t\t$params['ContentType'] = Psr7\\mimetype_from_filename($params['Key']);\n\t\t\t}\n\t\t\t\n\t\t\tif((!isset($params['ContentType']) || $params['ContentType'] === null) && isset($params['SourceFile'])){\n\t\t\t\t$params['ContentType'] = Psr7\\mimetype_from_filename($params['SourceFile']);\n\t\t\t}\n\t\t\t\n\t\t\tif(!isset($params['ContentType']) || $params['ContentType'] === null){\n\t\t\t\t$params['ContentType'] = 'binary/octet-stream';\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprotected function makeRequest($model, &$operation, $params, $endpoint = null)\n\t{\n\t\tif($endpoint === null){\n\t\t\t$endpoint = $this->endpoint;\n\t\t}\n\t\t$signatureInterface = strcasecmp($this-> signature, 'v4') === 0 ? \n\t\tnew V4Signature($this->ak, $this->sk, $this->pathStyle, $endpoint, $this->region, $model['method'], $this->signature, $this->securityToken) : \n\t\tnew DefaultSignature($this->ak, $this->sk, $this->pathStyle, $endpoint, $model['method'], $this->signature, $this->securityToken);\n\t\t$authResult = $signatureInterface -> doAuth($operation, $params, $model);\n\t\t$httpMethod = $authResult['method'];\n\t\tObsLog::commonLog(DEBUG, 'perform '. strtolower($httpMethod) . ' request with url ' . $authResult['requestUrl']);\n\t\tObsLog::commonLog(DEBUG, 'cannonicalRequest:' . $authResult['cannonicalRequest']);\n\t\tObsLog::commonLog(DEBUG, 'request headers ' . var_export($authResult['headers'],true));\n\t\t$authResult['headers']['User-Agent'] = self::default_user_agent();\n\t\tif($model['method'] === 'putObject'){\n\t\t\t$model['ObjectURL'] = ['value' => $authResult['requestUrl']];\n\t\t}\n\t\treturn new Request($httpMethod, $authResult['requestUrl'], $authResult['headers'], $authResult['body']);\n\t}\n\t\n\t\n\tprotected function doRequest($model, &$operation, $params, $endpoint = null)\n\t{\n\t\t$request = $this -> makeRequest($model, $operation, $params, $endpoint);\n\t\t$this->sendRequest($model, $operation, $params, $request);\n\t}\n\t\n\tprotected function sendRequest($model, &$operation, $params, $request, $requestCount = 1)\n\t{\n\t\t$start = microtime(true);\n\t\t$saveAsStream = false;\n\t\tif(isset($operation['stream']) && $operation['stream']){\n\t\t\t$saveAsStream = isset($params['SaveAsStream']) ? $params['SaveAsStream'] : false;\n\t\t\t\n\t\t\tif(isset($params['SaveAsFile'])){\n\t\t\t\tif($saveAsStream){\n\t\t\t\t\t$obsException = new ObsException('SaveAsStream cannot be used with SaveAsFile together');\n\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\tthrow $obsException;\n\t\t\t\t}\n\t\t\t\t$saveAsStream = true;\n\t\t\t}\n\t\t\tif(isset($params['FilePath'])){\n\t\t\t\tif($saveAsStream){\n\t\t\t\t\t$obsException = new ObsException('SaveAsStream cannot be used with FilePath together');\n\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\tthrow $obsException;\n\t\t\t\t}\n\t\t\t\t$saveAsStream = true;\n\t\t\t}\n\t\t\t\n\t\t\tif(isset($params['SaveAsFile']) && isset($params['FilePath'])){\n\t\t\t\t$obsException = new ObsException('SaveAsFile cannot be used with FilePath together');\n\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\tthrow $obsException;\n\t\t\t}\n\t\t}\n\t\t\n\t\t$promise = $this->httpClient->sendAsync($request, ['stream' => $saveAsStream])->then(\n\t\t\t\tfunction(Response $response) use ($model, $operation, $params, $request, $start){\n\t\t\t\t\t\n\t\t\t\t\tObsLog::commonLog(INFO, 'http request cost ' . round(microtime(true) - $start, 3) * 1000 . ' ms');\n\t\t\t\t\t\n\t\t\t\t\t$statusCode = $response -> getStatusCode();\n\t\t\t\t\t$readable = isset($params['Body']) && ($params['Body'] instanceof StreamInterface || is_resource($params['Body']));\n\t\t\t\t\tif($statusCode === 307 && !$readable){\n\t\t\t\t\t\tif($location = $response -> getHeaderLine('location')){\n\t\t\t\t\t\t\t$url = parse_url($this->endpoint);\n\t\t\t\t\t\t\t$newUrl = parse_url($location);\n\t\t\t\t\t\t\t$scheme = (isset($newUrl['scheme']) ? $newUrl['scheme'] : $url['scheme']);\n\t\t\t\t\t\t\t$defaultPort = strtolower($scheme) === 'https' ? '443' : '80';\n\t\t\t\t\t\t\t$this->doRequest($model, $operation, $params, $scheme. '://' . $newUrl['host'] .\n\t\t\t\t\t\t\t\t\t':' . (isset($newUrl['port']) ? $newUrl['port'] : $defaultPort));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$this -> parseResponse($model, $request, $response, $operation);\n\t\t\t\t},\n\t\t\t\tfunction (RequestException $exception) use ($model, $operation, $params, $request, $requestCount, $start) {\n\t\t\t\t\t\n\t\t\t\t\tObsLog::commonLog(INFO, 'http request cost ' . round(microtime(true) - $start, 3) * 1000 . ' ms');\n\t\t\t\t\t$message = null;\n\t\t\t\t\tif($exception instanceof ConnectException){\n\t\t\t\t\t\tif($requestCount <= $this->maxRetryCount){\n\t\t\t\t\t\t\t$this -> sendRequest($model, $operation, $params, $request, $requestCount + 1);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$message = 'Exceeded retry limitation, max retry count:'. $this->maxRetryCount . ', error message:' . $exception -> getMessage();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$this -> parseException($model, $request, $exception, $message);\n\t\t\t\t});\n\t\t$promise -> wait();\n\t}\n\t\n\t\n\tprotected function doRequestAsync($model, &$operation, $params, $callback, $startAsync, $originMethod, $endpoint = null){\n\t\t$request = $this -> makeRequest($model, $operation, $params, $endpoint);\n\t\treturn $this->sendRequestAsync($model, $operation, $params, $callback, $startAsync, $originMethod, $request);\n\t}\n\t\n\tprotected function sendRequestAsync($model, &$operation, $params, $callback, $startAsync, $originMethod, $request, $requestCount = 1)\n\t{\n\t\t$start = microtime(true);\n\t\t\n\t\t$saveAsStream = false;\n\t\tif(isset($operation['stream']) && $operation['stream']){\n\t\t\t$saveAsStream = isset($params['SaveAsStream']) ? $params['SaveAsStream'] : false;\n\t\t\t\n\t\t\tif($saveAsStream){\n\t\t\t\tif(isset($params['SaveAsFile'])){\n\t\t\t\t\t$obsException = new ObsException('SaveAsStream cannot be used with SaveAsFile together');\n\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\tthrow $obsException;\n\t\t\t\t}\n\t\t\t\tif(isset($params['FilePath'])){\n\t\t\t\t\t$obsException = new ObsException('SaveAsStream cannot be used with FilePath together');\n\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\tthrow $obsException;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(isset($params['SaveAsFile']) && isset($params['FilePath'])){\n\t\t\t\t$obsException = new ObsException('SaveAsFile cannot be used with FilePath together');\n\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\tthrow $obsException;\n\t\t\t}\n\t\t}\n\t\treturn $this->httpClient->sendAsync($request, ['stream' => $saveAsStream])->then(\n\t\t\t\tfunction(Response $response) use ($model, $operation, $params, $callback, $startAsync, $originMethod, $request, $start){\n\t\t\t\t\tObsLog::commonLog(INFO, 'http request cost ' . round(microtime(true) - $start, 3) * 1000 . ' ms');\n\t\t\t\t\t$statusCode = $response -> getStatusCode();\n\t\t\t\t\t$readable = isset($params['Body']) && ($params['Body'] instanceof StreamInterface || is_resource($params['Body']));\n\t\t\t\t\tif($statusCode === 307 && !$readable){\n\t\t\t\t\t\tif($location = $response -> getHeaderLine('location')){\n\t\t\t\t\t\t\t$url = parse_url($this->endpoint);\n\t\t\t\t\t\t\t$newUrl = parse_url($location);\n\t\t\t\t\t\t\t$scheme = (isset($newUrl['scheme']) ? $newUrl['scheme'] : $url['scheme']);\n\t\t\t\t\t\t\t$defaultPort = strtolower($scheme) === 'https' ? '443' : '80';\n\t\t\t\t\t\t\treturn $this->doRequestAsync($model, $operation, $params, $callback, $startAsync, $originMethod, $scheme. '://' . $newUrl['host'] .\n\t\t\t\t\t\t\t\t\t':' . (isset($newUrl['port']) ? $newUrl['port'] : $defaultPort));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$this -> parseResponse($model, $request, $response, $operation);\n\t\t\t\t\tObsLog::commonLog(INFO, 'obsclient cost ' . round(microtime(true) - $startAsync, 3) * 1000 . ' ms to execute '. $originMethod);\n\t\t\t\t\tunset($model['method']);\n\t\t\t\t\t$callback(null, $model);\n\t\t\t\t},\n\t\t\t\tfunction (RequestException $exception) use ($model, $operation, $params, $callback, $startAsync, $originMethod, $request, $start, $requestCount){\n\t\t\t\t\tObsLog::commonLog(INFO, 'http request cost ' . round(microtime(true) - $start, 3) * 1000 . ' ms');\n\t\t\t\t\t$message = null;\n\t\t\t\t\tif($exception instanceof ConnectException){\n\t\t\t\t\t\tif($requestCount <= $this->maxRetryCount){\n\t\t\t\t\t\t\treturn $this -> sendRequestAsync($model, $operation, $params, $callback, $startAsync, $originMethod, $request, $requestCount + 1);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$message = 'Exceeded retry limitation, max retry count:'. $this->maxRetryCount . ', error message:' . $exception -> getMessage();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$obsException = $this -> parseExceptionAsync($request, $exception, $message);\n\t\t\t\t\tObsLog::commonLog(INFO, 'obsclient cost ' . round(microtime(true) - $startAsync, 3) * 1000 . ' ms to execute '. $originMethod);\n\t\t\t\t\t$callback($obsException, null);\n\t\t\t\t}\n\t\t);\n\t}\n}"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Signature/AbstractSignature.php",
    "content": "<?php\n\nnamespace Obs\\Internal\\Signature;\n\nuse Obs\\Log\\ObsLog;\nuse Obs\\Internal\\Resource\\Constants;\nuse Obs\\ObsException;\nuse Obs\\Internal\\Common\\SchemaFormatter;\nuse GuzzleHttp\\Psr7\\Stream;\nuse Obs\\Internal\\Common\\Model;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Obs\\Internal\\Common\\ObsTransform;\nuse Obs\\Internal\\Common\\V2Transform;\n\nabstract class AbstractSignature implements SignatureInterface\n{\n\t\n\tprotected $ak;\n\t\n\tprotected $sk;\n\t\n\tprotected $pathStyle;\n\t\n\tprotected $endpoint;\n\t\n\tprotected $methodName;\n\t\n\tprotected $securityToken;\n\t\n\tprotected $signature;\n\t\n\tpublic static function urlencodeWithSafe($val, $safe='/'){\n\t\tif(($len = strlen($val)) === 0){\n\t\t\treturn '';\n\t\t}\n\t\t$buffer = [];\n\t\tfor ($index=0;$index<$len;$index++){\n\t\t\t$str = $val[$index];\t\t\n\t\t\t$buffer[] = !($pos = strpos($safe, $str)) && $pos !== 0 ? rawurlencode($str) : $str;\n\t\t}\n\t\treturn implode('', $buffer);\n\t}\n\t\n\tprotected function __construct($ak, $sk, $pathStyle, $endpoint, $methodName, $signature, $securityToken=false)\n\t{\n\t\t$this -> ak = $ak;\n\t\t$this -> sk = $sk;\n\t\t$this -> pathStyle = $pathStyle;\n\t\t$this -> endpoint = $endpoint;\n\t\t$this -> methodName = $methodName;\n\t\t$this -> signature = $signature;\n\t\t$this -> securityToken = $securityToken;\n\t}\n\t\n\tprotected function transXmlByType($key, &$value, &$subParams, $transHolder)\n\t{\n\t\t$xml = [];\n\t\t$treatAsString = false;\n\t\tif(isset($value['type'])){\n\t\t\t$type = $value['type'];\n\t\t\tif($type === 'array'){\n\t\t\t\t$name = isset($value['sentAs']) ? $value['sentAs'] : $key;\n\t\t\t\t$subXml = [];\n\t\t\t\tforeach($subParams as $item){\n\t\t\t\t    $temp = $this->transXmlByType($key, $value['items'], $item, $transHolder);\n\t\t\t\t\tif($temp !== ''){\n\t\t\t\t\t\t$subXml[] = $temp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(!empty($subXml)){\n\t\t\t\t    if(!isset($value['data']['xmlFlattened'])){\n\t\t\t\t\t\t$xml[] = '<' . $name . '>';\n\t\t\t\t\t\t$xml[] = implode('', $subXml);\n\t\t\t\t\t\t$xml[] = '</' . $name . '>';\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$xml[] = implode('', $subXml);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else if($type === 'object'){\n\t\t\t\t$name = isset($value['sentAs']) ? $value['sentAs'] : (isset($value['name']) ? $value['name'] : $key);\n\t\t\t\t$properties = $value['properties'];\n\t\t\t\t$subXml = [];\n\t\t\t\t$attr = [];\n\t\t\t\tforeach ($properties as $pkey => $pvalue){\n\t\t\t\t\tif(isset($pvalue['required']) && $pvalue['required'] && !isset($subParams[$pkey])){\n\t\t\t\t\t\t$obsException= new ObsException('param:' .$pkey. ' is required');\n\t\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\t\tthrow $obsException;\n\t\t\t\t\t}\n\t\t\t\t\tif(isset($subParams[$pkey])){\n\t\t\t\t\t\tif(isset($pvalue['data']) && isset($pvalue['data']['xmlAttribute']) && $pvalue['data']['xmlAttribute']){\n\t\t\t\t\t\t    $attrValue = $this->xml_tansfer(trim(strval($subParams[$pkey])));\n\t\t\t\t\t\t    $attr[$pvalue['sentAs']] = '\"' . $attrValue . '\"';\n\t\t\t\t\t\t\tif(isset($pvalue['data']['xmlNamespace'])){\n\t\t\t\t\t\t\t\t$ns = substr($pvalue['sentAs'], 0, strpos($pvalue['sentAs'], ':'));\n\t\t\t\t\t\t\t\t$attr['xmlns:' . $ns] = '\"' . $pvalue['data']['xmlNamespace'] . '\"';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t    $subXml[] = $this -> transXmlByType($pkey, $pvalue, $subParams[$pkey], $transHolder);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$val = implode('', $subXml);\n\t\t\t\tif($val !== ''){\n\t\t\t\t\t$_name = $name;\n\t\t\t\t\tif(!empty($attr)){\n\t\t\t\t\t\tforeach ($attr as $akey => $avalue){\n\t\t\t\t\t\t\t$_name .= ' ' . $akey . '=' . $avalue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!isset($value['data']['xmlFlattened'])){ \n\t\t\t\t\t    $xml[] = '<' . $_name . '>';\n\t\t\t\t\t    $xml[] = $val;\n\t\t\t\t\t    $xml[] = '</' . $name . '>';\n\t\t\t\t\t} else {\n\t\t\t\t\t    $xml[] = $val;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t$treatAsString = true;\n\t\t\t}\n\t\t}else{\n\t\t\t$treatAsString = true;\n\t\t\t$type = null;\n\t\t}\n\t\t\n\t\tif($treatAsString){\n\t\t\tif($type === 'boolean'){\n\t\t\t\tif(!is_bool($subParams) && strval($subParams) !== 'false' && strval($subParams) !== 'true'){\n\t\t\t\t\t$obsException= new ObsException('param:' .$key. ' is not a boolean value');\n\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\tthrow $obsException;\n\t\t\t\t}\n\t\t\t}else if($type === 'numeric'){\n\t\t\t\tif(!is_numeric($subParams)){\n\t\t\t\t\t$obsException= new ObsException('param:' .$key. ' is not a numeric value');\n\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\tthrow $obsException;\n\t\t\t\t}\n\t\t\t}else if($type === 'float'){\n\t\t\t\tif(!is_float($subParams)){\n\t\t\t\t\t$obsException= new ObsException('param:' .$key. ' is not a float value');\n\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\tthrow $obsException;\n\t\t\t\t}\n\t\t\t}else if($type === 'int' || $type === 'integer'){\n\t\t\t\tif(!is_int($subParams)){\n\t\t\t\t\t$obsException= new ObsException('param:' .$key. ' is not a int value');\n\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\tthrow $obsException;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t$name = isset($value['sentAs']) ? $value['sentAs'] : $key;\n\t\t\tif(is_bool($subParams)){\n\t\t\t\t$val = \t$subParams ? 'true' : 'false';\n\t\t\t}else{\n\t\t\t\t$val = strval($subParams);\n\t\t\t}\n\t\t\tif(isset($value['format'])){\n\t\t\t\t$val = SchemaFormatter::format($value['format'], $val);\n\t\t\t}\n\t\t\tif (isset($value['transform'])) {\n\t\t\t    $val = $transHolder->transform($value['transform'], $val);\n\t\t\t}\t\t\t\n\t\t\tif(isset($val) && $val !== ''){\n\t\t\t    if(!isset($value['data']['xmlFlattened'])){\n\t\t\t        $xml[] = '<' . $name . '>';\n\t\t\t        $xml[] = $val;\n\t\t\t        $xml[] = '</' . $name . '>';\n\t\t\t    } else {\n\t\t\t        $xml[] = $val;\n\t\t\t    }\t\t\t    \n\t\t\t}else if(isset($value['canEmpty']) && $value['canEmpty']){\n\t\t\t    $xml[] = '<' . $name . '>';\n\t\t\t    $xml[] = $val;\n\t\t\t    $xml[] = '</' . $name . '>';\n\t\t\t}\n\t\t}\n\t\t$ret = implode('', $xml);\n\t\t\n\t\tif(isset($value['wrapper'])){\n\t\t    $ret = '<'. $value['wrapper'] . '>' . $ret . '</'. $value['wrapper'] . '>';\n\t\t}\n\t\t\n\t\treturn $ret;\n\t}\n\t\n\tprivate function xml_tansfer($tag) {\n\t    $search = array('&', '<', '>', '\\'', '\"');\n\t    $repalce = array('&amp;', '&lt;', '&gt;', '&apos;', '&quot;');\n\t    $transferXml = str_replace($search, $repalce, $tag);\n\t    return $transferXml;\n\t}\n\t\n\tprotected function prepareAuth(array &$requestConfig, array &$params, Model $model)\n\t{\n\t    $transHolder = strcasecmp($this-> signature, 'obs') === 0 ? ObsTransform::getInstance() : V2Transform::getInstance();\n\t\t$method = $requestConfig['httpMethod'];\n\t\t$requestUrl = $this->endpoint;\n\t\t$headers = [];\n\t\t$pathArgs = [];\n\t\t$dnsParam = null;\n\t\t$uriParam = null;\n\t\t$body = [];\n\t\t$xml = [];\n\t\t\n\t\tif(isset($requestConfig['specialParam'])){\n\t\t\t$pathArgs[$requestConfig['specialParam']] = '';\n\t\t}\n\t\t\n\t\t$result = ['body' => null];\n\t\t$url = parse_url($requestUrl);\n\t\t$host = $url['host'];\n\t\t\n\t\t$fileFlag = false;\n\t\t\n\t\tif(isset($requestConfig['requestParameters'])){\n\t\t\t$paramsMetadata = $requestConfig['requestParameters'];\n\t\t\tforeach ($paramsMetadata as $key => $value){\n\t\t\t\tif(isset($value['required']) && $value['required'] && !isset($params[$key])){\n\t\t\t\t\t$obsException= new ObsException('param:' .$key. ' is required');\n\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\tthrow $obsException;\n\t\t\t\t}\n\t\t\t\tif(isset($params[$key]) && isset($value['location'])){\n\t\t\t\t\t$location = $value['location'];\n\t\t\t\t\t$val = $params[$key];\n\t\t\t\t\t$type = 'string';\n\t\t\t\t\tif($val !== '' && isset($value['type'])){\n\t\t\t\t\t\t$type = $value['type'];\n\t\t\t\t\t\tif($type === 'boolean'){\n\t\t\t\t\t\t\tif(!is_bool($val) && strval($val) !== 'false' && strval($val) !== 'true'){\n\t\t\t\t\t\t\t\t$obsException= new ObsException('param:' .$key. ' is not a boolean value');\n\t\t\t\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\t\t\t\tthrow $obsException;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else if($type === 'numeric'){\n\t\t\t\t\t\t\tif(!is_numeric($val)){\n\t\t\t\t\t\t\t\t$obsException= new ObsException('param:' .$key. ' is not a numeric value');\n\t\t\t\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\t\t\t\tthrow $obsException;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else if($type === 'float'){\n\t\t\t\t\t\t\tif(!is_float($val)){\n\t\t\t\t\t\t\t\t$obsException= new ObsException('param:' .$key. ' is not a float value');\n\t\t\t\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\t\t\t\tthrow $obsException;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else if($type === 'int' || $type === 'integer'){\n\t\t\t\t\t\t\tif(!is_int($val)){\n\t\t\t\t\t\t\t\t$obsException= new ObsException('param:' .$key. ' is not a int value');\n\t\t\t\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\t\t\t\tthrow $obsException;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif($location === 'header'){\n\t\t\t\t\t\tif($type === 'object'){\n\t\t\t\t\t\t\tif(is_array($val)){\n\t\t\t\t\t\t\t\t$sentAs = strtolower($value['sentAs']);\n\t\t\t\t\t\t\t\tforeach ($val as $k => $v){\n\t\t\t\t\t\t\t\t\t$k = strtolower($k);\n\t\t\t\t\t\t\t\t\t$name = strpos($k, $sentAs) === 0 ? $k : $sentAs . $k;\n\t\t\t\t\t\t\t\t\t$headers[$name] = self::urlencodeWithSafe($v);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else if($type === 'array'){\n\t\t\t\t\t\t\tif(is_array($val)){\n\t\t\t\t\t\t\t\t$name = isset($value['sentAs']) ? $value['sentAs'] : (isset($value['items']['sentAs']) ? $value['items']['sentAs'] : $key);\n\t\t\t\t\t\t\t\t$temp = [];\n\t\t\t\t\t\t\t\tforeach ($val as $v){\n\t\t\t\t\t\t\t\t\tif(($v = strval($v)) !== ''){\n\t\t\t\t\t\t\t\t\t\t$temp[] =  self::urlencodeWithSafe($v);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$headers[$name] = $temp;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else if($type === 'password'){\n\t\t\t\t\t\t\tif(($val = strval($val)) !== ''){\n\t\t\t\t\t\t\t\t$name = isset($value['sentAs']) ? $value['sentAs'] : $key;\n\t\t\t\t\t\t\t\t$pwdName = isset($value['pwdSentAs']) ? $value['pwdSentAs'] : $name . '-MD5';\n\t\t\t\t\t\t\t\t$val1 = base64_encode($val);\n\t\t\t\t\t\t\t\t$val2 = base64_encode(md5($val, true));\n\t\t\t\t\t\t\t\t$headers[$name] = $val1;\n\t\t\t\t\t\t\t\t$headers[$pwdName] = $val2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t    if (isset($value['transform'])) {\n\t\t\t\t\t\t        $val = $transHolder->transform($value['transform'], strval($val));\n\t\t\t\t\t\t    }\n\t\t\t\t\t\t\tif(isset($val)){ \n\t\t\t\t\t\t\t    if(is_bool($val)){\n\t\t\t\t\t\t\t        $val = $val ? 'true' : 'false';\n\t\t\t\t\t\t\t    }else{\n\t\t\t\t\t\t\t        $val = strval($val);\n\t\t\t\t\t\t\t    }\n\t\t\t\t\t\t\t    if($val !== ''){\n    \t\t\t\t\t\t\t\t$name = isset($value['sentAs']) ? $value['sentAs'] : $key;\n    \t\t\t\t\t\t\t\tif(isset($value['format'])){\n    \t\t\t\t\t\t\t\t\t$val = SchemaFormatter::format($value['format'], $val);\n    \t\t\t\t\t\t\t\t}\n    \t\t\t\t\t\t\t\t$headers[$name] = self::urlencodeWithSafe($val);\n\t\t\t\t\t\t\t    }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if($location === 'uri' && $uriParam === null){\n\t\t\t\t\t\t$uriParam = self::urlencodeWithSafe($val);\n\t\t\t\t\t}else if($location === 'dns' && $dnsParam === null){\n\t\t\t\t\t\t$dnsParam = $val;\n\t\t\t\t\t}else if($location === 'query'){\n\t\t\t\t\t\t$name = isset($value['sentAs']) ? $value['sentAs'] : $key;\n\t\t\t\t\t\tif(strval($val) !== ''){\n\t\t\t\t\t\t    if (strcasecmp ( $this->signature, 'v4' ) === 0) {\n\t\t\t\t\t\t        $pathArgs[rawurlencode($name)] = rawurlencode(strval($val));\n\t\t\t\t\t\t    } else {\n\t\t\t\t\t\t        $pathArgs[self::urlencodeWithSafe($name)] = self::urlencodeWithSafe(strval($val));\n\t\t\t\t\t\t    }\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if($location === 'xml'){\n\t\t\t\t\t    $val = $this->transXmlByType($key, $value, $val, $transHolder);\n\t\t\t\t\t\tif($val !== ''){\n\t\t\t\t\t\t\t$xml[] = $val;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if($location === 'body'){\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(isset($result['body'])){\n\t\t\t\t\t\t\t$obsException= new ObsException('duplicated body provided');\n\t\t\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\t\t\tthrow $obsException;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($type === 'file'){\n\t\t\t\t\t\t\tif(!file_exists($val)){\n\t\t\t\t\t\t\t\t$obsException= new ObsException('file[' .$val. '] does not exist');\n\t\t\t\t\t\t\t\t$obsException-> setExceptionType('client');\n\t\t\t\t\t\t\t\tthrow $obsException;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$result['body'] = new Stream(fopen($val, 'r'));\n\t\t\t\t\t\t\t$fileFlag = true;\n\t\t\t\t\t\t}else if($type === 'stream'){\n\t\t\t\t\t\t\t$result['body'] = $val;\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$result['body'] = strval($val);\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if($location === 'response'){\n\t\t\t\t\t\t$model[$key] = ['value' => $val, 'type' => $type];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\tif($dnsParam){\n\t\t\t\tif($this -> pathStyle){\n\t\t\t\t\t$requestUrl = $requestUrl . '/' .  $dnsParam;\n\t\t\t\t}else{\n\t\t\t\t\t$defaultPort = strtolower($url['scheme']) === 'https' ? '443' : '80';\n\t\t\t\t\t$host = $dnsParam. '.' . $host;\n\t\t\t\t\t$requestUrl = $url['scheme'] . '://' . $host . ':' . (isset($url['port']) ? $url['port'] : $defaultPort);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif($uriParam){\n\t\t\t\t$requestUrl = $requestUrl . '/' . $uriParam;\n\t\t\t}\n\t\t\t\n\t\t\tif(!empty($pathArgs)){\n\t\t\t\t$requestUrl .= '?';\n\t\t\t\t$_pathArgs = [];\n\t\t\t\tforeach ($pathArgs as $key => $value){\n\t\t\t\t\t$_pathArgs[] = $value === null || $value === '' ? $key : $key . '=' . $value;\n\t\t\t\t}\n\t\t\t\t$requestUrl .= implode('&', $_pathArgs);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif($xml || (isset($requestConfig['data']['xmlAllowEmpty']) && $requestConfig['data']['xmlAllowEmpty'])){\n\t\t\t$body[] = '<';\n\t\t\t$xmlRoot = $requestConfig['data']['xmlRoot']['name'];\n\t\t\t\n\t\t\t$body[] = $xmlRoot;\n\t\t\t$body[] = '>';\n\t\t\t$body[] = implode('', $xml);\n\t\t\t$body[] = '</';\n\t\t\t$body[] = $xmlRoot;\n\t\t\t$body[] = '>';\n\t\t\t$headers['Content-Type'] = 'application/xml';\n\t\t\t$result['body'] = implode('', $body);\n\t\t\t\n\t\t\tObsLog::commonLog(DEBUG, 'request content ' . $result['body']);\n\t\t\t\n\t\t\tif(isset($requestConfig['data']['contentMd5']) && $requestConfig['data']['contentMd5']){\n\t\t\t\t$headers['Content-MD5'] = base64_encode(md5($result['body'],true));\n\t\t\t}\n\t\t}\n\t\t\n\t\tif($fileFlag && ($result['body'] instanceof StreamInterface)){\n\t\t\tif($this->methodName === 'uploadPart' && (isset($model['Offset']) || isset($model['PartSize']))){\n\t\t\t\t$bodySize = $result['body'] ->getSize();\n\t\t\t\tif(isset($model['Offset'])){\n\t\t\t\t\t$offset = intval($model['Offset']['value']);\n\t\t\t\t\t$offset = $offset >= 0 && $offset < $bodySize ? $offset : 0;\n\t\t\t\t}else{\n\t\t\t\t\t$offset = 0;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(isset($model['PartSize'])){\n\t\t\t\t\t$partSize = intval($model['PartSize']['value']);\n\t\t\t\t\t$partSize = $partSize > 0 && $partSize  <= ($bodySize - $offset) ? $partSize : $bodySize - $offset;\n\t\t\t\t}else{\n\t\t\t\t\t$partSize = $bodySize - $offset;\n\t\t\t\t}\n\t\t\t\t$result['body'] -> rewind();\n\t\t\t\t$result['body'] -> seek($offset);\n\t\t\t\t$headers['Content-Length'] = $partSize;\n\t\t\t}else if(isset($headers['Content-Length'])){\n\t\t\t\t$bodySize = $result['body'] -> getSize();\n\t\t\t\tif(intval($headers['Content-Length']) > $bodySize){\n\t\t\t\t\t$headers['Content-Length'] =  $bodySize;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t$constants = Constants::selectConstants($this -> signature);\n\t\t\n\t\tif($this->securityToken){\n\t\t    $headers[$constants::SECURITY_TOKEN_HEAD] = $this->securityToken; \n\t\t}\n\t\t\n\t\t$result['host'] = $host;\n\t\t$result['method'] = $method;\n\t\t$result['headers'] = $headers;\n\t\t$result['pathArgs'] = $pathArgs;\n\t\t$result['dnsParam'] = $dnsParam;\n\t\t$result['uriParam'] = $uriParam;\n\t\t$result['requestUrl'] = $requestUrl;\n\t\t\n\t\treturn $result;\n\t}\n}"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Signature/DefaultSignature.php",
    "content": "<?php\n\nnamespace Obs\\Internal\\Signature;\n\n\nuse Obs\\Internal\\Resource\\Constants;\nuse Obs\\Internal\\Common\\Model;\nuse Obs\\Internal\\Resource\\V2Constants;\n\nclass DefaultSignature extends AbstractSignature\n{\n\tconst INTEREST_HEADER_KEY_LIST = array('content-type', 'content-md5', 'date');\n\t\n\t\n\tpublic function __construct($ak, $sk, $pathStyle, $endpoint, $methodName, $signature, $securityToken=false)\n\t{\n\t    \n\t    parent::__construct($ak, $sk, $pathStyle, $endpoint, $methodName, $signature, $securityToken);\n\t}\n\t\n\tpublic function doAuth(array &$requestConfig, array &$params, Model $model)\n\t{   \n\t\t$result = $this -> prepareAuth($requestConfig, $params, $model);\n\t\t\n\t\t$result['headers']['Date'] = gmdate('D, d M Y H:i:s \\G\\M\\T');\n\t\t\n\t\t$canonicalstring = $this-> makeCanonicalstring($result['method'], $result['headers'], $result['pathArgs'], $result['dnsParam'], $result['uriParam']);\n\t\t\n\t\t$result['cannonicalRequest'] = $canonicalstring;\n\t\t\n\t\t$signature = base64_encode(hash_hmac('sha1', $canonicalstring, $this->sk, true));\n\t\t\n\t\t$constants = Constants::selectConstants($this -> signature);\n\t\t$signatureFlag = $constants::FLAG;\n\t\t\n\t\t$authorization = $signatureFlag . ' ' . $this->ak . ':' . $signature;\n\t\t\n\t\t$result['headers']['Authorization'] = $authorization;\n\t\t\n\t\treturn $result;\n\t}\t\n\t\n\tpublic function makeCanonicalstring($method, $headers, $pathArgs, $bucketName, $objectKey, $expires = null)\n\t{\n\t\t$buffer = [];\n\t\t$buffer[] = $method;\n\t\t$buffer[] = \"\\n\";\t\n\t\t$interestHeaders = [];\n\t\t$constants = Constants::selectConstants($this -> signature);\n\t\t\n\t\tforeach ($headers as $key => $value){\n\t\t\t$key = strtolower($key);\n\t\t\tif(in_array($key, self::INTEREST_HEADER_KEY_LIST) || strpos($key, $constants::HEADER_PREFIX) === 0){\n\t\t\t\t$interestHeaders[$key] = $value;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(array_key_exists($constants::ALTERNATIVE_DATE_HEADER, $interestHeaders)){\n\t\t\t$interestHeaders['date'] = '';\n\t\t} \n\t\t\n\t\tif($expires !== null){\n\t\t\t$interestHeaders['date'] = strval($expires);\n\t\t}\n\t\t\n\t\tif(!array_key_exists('content-type', $interestHeaders)){\n\t\t\t$interestHeaders['content-type'] = '';\n\t\t}\n\t\t\n\t\tif(!array_key_exists('content-md5', $interestHeaders)){\n\t\t\t$interestHeaders['content-md5'] = '';\n\t\t}\n\t\t\n\t\tksort($interestHeaders);\n\t\t\n\t\tforeach ($interestHeaders as $key => $value){\n\t\t    if(strpos($key, $constants::HEADER_PREFIX) === 0){\n\t\t\t\t$buffer[] = $key . ':' . $value;\n\t\t\t}else{\n\t\t\t\t$buffer[] = $value;\n\t\t\t}\n\t\t\t$buffer[] = \"\\n\";\n\t\t}\n\t\t\n\t\t$uri = '';\n\t\t\n\t\tif($bucketName){\n\t\t\t$uri .= '/';\n\t\t\t$uri .= $bucketName;\n\t\t\tif(!$this->pathStyle){\n\t\t\t\t$uri .= '/';\n\t\t\t}\n\t\t}\n\t\t\n\t\tif($objectKey){\n\t\t\tif(!($pos=strripos($uri, '/')) || strlen($uri)-1 !== $pos){\n\t\t\t\t$uri .= '/';\n\t\t\t}\n\t\t\t$uri .= $objectKey;\n\t\t}\n\t\t\n\t\t$buffer[] = $uri === ''? '/' : $uri;\n\t\t\n\t\tif(!empty($pathArgs)){\n\t\t\tksort($pathArgs);\n\t\t\t$_pathArgs = [];\n\t\t\tforeach ($pathArgs as $key => $value){\n\t\t\t    if(in_array(strtolower($key), $constants::ALLOWED_RESOURCE_PARAMTER_NAMES)){\n\t\t\t\t\t$_pathArgs[] = $value === null || $value === '' ? $key : $key . '=' . urldecode($value);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!empty($_pathArgs)){\n\t\t\t\t$buffer[] = '?';\n\t\t\t\t$buffer[] = implode('&', $_pathArgs);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn implode('', $buffer);\n\t}\n\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Signature/SignatureInterface.php",
    "content": "<?php\n\nnamespace Obs\\Internal\\Signature;\n\nuse Obs\\Internal\\Common\\Model;\n\ninterface SignatureInterface\n{\n\tfunction doAuth(array &$requestConfig, array &$params, Model $model);\n}"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Internal/Signature/V4Signature.php",
    "content": "<?php\n\nnamespace Obs\\Internal\\Signature;\n\nuse Obs\\Internal\\Common\\Model;\n\nclass V4Signature extends AbstractSignature\n{\n\tconst CONTENT_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';\n\t\n\tprotected $region;\n\t\n\tprotected $utcTimeZone;\n\t\n\tpublic function __construct($ak, $sk, $pathStyle, $endpoint, $region, $methodName, $signature, $securityToken=false)\n\t{\n\t    parent::__construct($ak, $sk, $pathStyle, $endpoint, $methodName, $signature, $securityToken);\n\t\t$this->region = $region;\n\t\t$this->utcTimeZone = new \\DateTimeZone ('UTC');\n\t}\n\t\n\tpublic function doAuth(array &$requestConfig, array &$params, Model $model)\n\t{\n\t\t$result = $this -> prepareAuth($requestConfig, $params, $model);\n\t\t\n\t\t$result['headers']['x-amz-content-sha256'] = self::CONTENT_SHA256;\n\t\t\n\t\t$bucketName = $result['dnsParam'];\n\t\t\n\t\t$result['headers']['Host'] = $result['host'];\n\t\t\n\t\t$time = null;\n\t\tif(array_key_exists('x-amz-date', $result['headers'])){\n\t\t\t$time = $result['headers']['x-amz-date'];\n\t\t}else if(array_key_exists('X-Amz-Date', $result['headers'])){\n\t\t\t$time = $result['headers']['X-Amz-Date'];\n\t\t}\n\t\t$timestamp = $time ? date_create_from_format('Ymd\\THis\\Z', $time, $this->utcTimeZone) -> getTimestamp()\n\t\t\t\t:time();\n\t\t\n\t\t$result['headers']['Date'] = gmdate('D, d M Y H:i:s \\G\\M\\T', $timestamp);\n\t\t\t\t\n\t\t$longDate = gmdate('Ymd\\THis\\Z', $timestamp);\n\t\t$shortDate = substr($longDate, 0, 8);\n\t\t\n\t\t$credential = $this-> getCredential($shortDate);\n\t\t\n\t\t$signedHeaders = $this->getSignedHeaders($result['headers']);\n\t\t\n\t\t$canonicalstring = $this-> makeCanonicalstring($result['method'], $result['headers'], $result['pathArgs'], $bucketName, $result['uriParam'], $signedHeaders);\n\t\t\n\t\t$result['cannonicalRequest'] = $canonicalstring;\n\t\t\n\t\t$signature = $this -> getSignature($canonicalstring, $longDate, $shortDate);\n\t\t\n\t\t$authorization = 'AWS4-HMAC-SHA256 ' . 'Credential=' . $credential. ',' . 'SignedHeaders=' . $signedHeaders . ',' . 'Signature=' . $signature;\n\t\t\n\t\t$result['headers']['Authorization'] = $authorization;\n\t\t\n\t\treturn $result;\n\t}\n\t\n\tpublic function getSignature($canonicalstring, $longDate, $shortDate)\n\t{\n\t\t$stringToSign = [];\n\t\t$stringToSign[] = 'AWS4-HMAC-SHA256';\n\t\t\n\t\t$stringToSign[] = \"\\n\";\n\t\t\n\t\t$stringToSign[] = $longDate;\n\t\t\n\t\t$stringToSign[] = \"\\n\";\n\t\t$stringToSign[] = $this -> getScope($shortDate);\n\t\t$stringToSign[] = \"\\n\";\n\t\t\n\t\t$stringToSign[] = hash('sha256', $canonicalstring);\n\t\t\n\t\t$dateKey = hash_hmac('sha256', $shortDate, 'AWS4' . $this -> sk, true);\n\t\t$regionKey = hash_hmac('sha256', $this->region, $dateKey, true);\n\t\t$serviceKey = hash_hmac('sha256', 's3', $regionKey, true);\n\t\t$signingKey = hash_hmac('sha256', 'aws4_request', $serviceKey, true);\n\t\t$signature = hash_hmac('sha256', implode('', $stringToSign), $signingKey);\n\t\treturn $signature;\n\t}\n\t\n\tpublic function getCanonicalQueryString($pathArgs)\n\t{\n\t\t$queryStr = '';\n\t\t\n\t\tksort($pathArgs);\n\t\t$index = 0;\n\t\tforeach ($pathArgs as $key => $value){\n\t\t\t$queryStr .=  $key . '=' . $value;\n\t\t\tif($index++ !== count($pathArgs) - 1){\n\t\t\t\t$queryStr .= '&';\n\t\t\t}\n\t\t}\n\t\treturn $queryStr;\n\t}\n\t\n\tpublic function getCanonicalHeaders($headers)\n\t{\n\t\t$_headers = [];\n\t\tforeach ($headers as $key => $value) {\n\t\t\t$_headers[strtolower($key)] = $value;\n\t\t}\n\t\tksort($_headers);\n\t\t\n\t\t$canonicalHeaderStr = '';\n\t\t\n\t\tforeach ($_headers as $key => $value){\n\t\t\t$value = is_array($value) ? implode(',', $value) : $value; \n\t\t\t$canonicalHeaderStr .= $key . ':' . $value;\n\t\t\t$canonicalHeaderStr .= \"\\n\";\n\t\t}\n\t\treturn $canonicalHeaderStr;\n\t}\n\t\n\tpublic function getCanonicalURI($bucketName, $objectKey)\n\t{\n\t\t$uri = '';\n\t\tif($this -> pathStyle && $bucketName){\n\t\t\t$uri .= '/' . $bucketName;\n\t\t}\n\t\t\n\t\tif($objectKey){\n\t\t\t$uri .= '/' . $objectKey;\n\t\t}\n\t\t\n\t\tif($uri === ''){\n\t\t\t$uri = '/';\n\t\t}\n\t\treturn $uri;\n\t}\n\t\n\tpublic function makeCanonicalstring($method, $headers, $pathArgs, $bucketName, $objectKey, $signedHeaders=null, $payload=null)\n\t{\n\t\t$buffer = [];\n\t\t$buffer[] = $method;\n\t\t$buffer[] = \"\\n\";\n\t\t$buffer[] = $this->getCanonicalURI($bucketName, $objectKey);\n\t\t$buffer[] = \"\\n\";\n\t\t$buffer[] = $this->getCanonicalQueryString($pathArgs);\n\t\t$buffer[] = \"\\n\";\n\t\t$buffer[] = $this->getCanonicalHeaders($headers);\n\t\t$buffer[] = \"\\n\";\n\t\t$buffer[] = $signedHeaders ? $signedHeaders : $this->getSignedHeaders($headers);\n\t\t$buffer[] = \"\\n\";\n\t\t$buffer[] = $payload ? strval($payload) : self::CONTENT_SHA256;\n\t\t\n\t\treturn implode('', $buffer);\n\t}\n\t\n\tpublic function getSignedHeaders($headers)\n\t{\n\t\t$_headers = [];\n\t\t\n\t\tforeach ($headers as $key => $value) {\n\t\t\t$_headers[] = strtolower($key);\n\t\t}\n\t\t\n\t\tsort($_headers);\n\t\t\n\t\t$signedHeaders = '';\n\t\t\n\t\tforeach ($_headers as $key => $value){\n\t\t\t$signedHeaders .= $value;\n\t\t\tif($key !== count($_headers) - 1){\n\t\t\t\t$signedHeaders .= ';';\n\t\t\t}\n\t\t}\n\t\treturn $signedHeaders;\n\t}\n\t\n\tpublic function getScope($shortDate)\n\t{\n\t\treturn $shortDate . '/' . $this->region . '/s3/aws4_request';\n\t}\n\t\n\tpublic function getCredential($shortDate)\n\t{\n\t\treturn $this->ak . '/' . $this->getScope($shortDate);\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Log/ObsConfig.php",
    "content": "<?php\n\nnamespace Obs\\Log;\n\nclass ObsConfig\n{\n\tconst LOG_FILE_CONFIG = [\n\t\t\t'FilePath'=>'./logs',\n\t\t\t'FileName'=>'eSDK-OBS-PHP.log',\n\t\t\t'MaxFiles'=>10,\n\t\t\t'Level'=>INFO\n\t];\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/Log/ObsLog.php",
    "content": "<?php\n\nnamespace Obs\\Log;\n\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Handler\\RotatingFileHandler;\nuse Monolog\\Logger;\n\nclass ObsLog extends Logger\n{\n\tpublic static $log = null;\n\t\n\tprotected $log_path = './';\n\tprotected $log_name = null;\n\tprotected $log_level = Logger::DEBUG;\n\tprotected $log_maxFiles = 0;\n\t\n\tprivate $formatter = null;\n\tprivate $handler = null;\n\tprivate $filepath = '';\n\t\n\tpublic static function initLog($logConfig= [])\n\t{\n\t\t$s3log = new ObsLog(''); \n\t\t$s3log->setConfig($logConfig);\n\t\t$s3log->cheakDir();\n\t\t$s3log->setFilePath();\n\t\t$s3log->setFormat();\n\t\t$s3log->setHande();\n\t}\n\tprivate function setFormat()\n\t{\n\t\t$output = '[%datetime%][%level_name%]'.'%message%' . \"\\n\";\n\t\t$this->formatter = new LineFormatter($output);\n\t\t\n\t}\n\tprivate function setHande()\n\t{\n\t\tself::$log = new Logger('obs_logger');\n\t\t$rotating = new RotatingFileHandler($this->filepath, $this->log_maxFiles, $this->log_level);\n\t\t$rotating->setFormatter($this->formatter);\n\t\tself::$log->pushHandler($rotating);\n\t}\n\tprivate function setConfig($logConfig= [])\n\t{\n\t\t$arr = empty($logConfig) ? ObsConfig::LOG_FILE_CONFIG : $logConfig;\n\t\t$this->log_path = iconv('UTF-8', 'GBK',$arr['FilePath']);\n\t\t$this->log_name = iconv('UTF-8', 'GBK',$arr['FileName']);\n\t\t$this->log_maxFiles = is_numeric($arr['MaxFiles']) ? 0 : intval($arr['MaxFiles']);\n\t\t$this->log_level = $arr['Level'];\n\t}\n\tprivate function cheakDir()\n\t{\n\t\tif (!is_dir($this->log_path)){\n\t\t\tmkdir($this->log_path, 0755, true);\n\t\t}\n\t} \n\tprivate function setFilePath()\n\t{\n\t\t$this->filepath =  $this->log_path.'/'.$this->log_name;\n\t}\n\tprivate static function writeLog($level, $msg)\n\t{\n\t\tswitch ($level) {\n\t\t\tcase DEBUG:\n\t\t\t\tself::$log->debug($msg);\n\t\t\t\tbreak;\n\t\t\tcase INFO:\n\t\t\t\tself::$log->info($msg);\n\t\t\t\tbreak;\n\t\t\tcase NOTICE:\n\t\t\t\tself::$log->notice($msg);\n\t\t\t\tbreak;\n\t\t\tcase WARNING:\n\t\t\t\tself::$log->warning($msg);\n\t\t\t\tbreak;\n\t\t\tcase ERROR:\n\t\t\t\tself::$log->error($msg);\n\t\t\t\tbreak;\n\t\t\tcase CRITICAL:\n\t\t\t\tself::$log->critical($msg);\n\t\t\t\tbreak;\n\t\t\tcase ALERT:\n\t\t\t\tself::$log->alert($msg);\n\t\t\t\tbreak;\n\t\t\tcase EMERGENCY:\n\t\t\t\tself::$log->emergency($msg);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t}\n\t\n\tpublic static function commonLog($level, $format, $args1 = null, $arg2 = null)\n\t{\n\t\tif(ObsLog::$log){\n\t\t\t$msg = sprintf(urldecode($format),$args1,$arg2);\n\t\t\t$back = debug_backtrace();\n\t\t\t$line = $back[0]['line'];\n\t\t\t$funcname = $back[1]['function'];\n\t\t\t$filename = basename($back[0]['file']);\n\t\t\t$message = '['.$filename.':'.$line.']: '.$msg;\n\t\t\tObsLog::writeLog($level, $message);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/ObsClient.php",
    "content": "<?php\n\n\nnamespace Obs;\n\nuse Obs\\Log\\ObsLog;\nuse Obs\\Internal\\Common\\SdkCurlFactory;\nuse Obs\\Internal\\Common\\SdkStreamHandler;\nuse Obs\\Internal\\Common\\Model;\nuse Monolog\\Logger;\nuse GuzzleHttp\\Client;\nuse GuzzleHttp\\HandlerStack;\nuse GuzzleHttp\\Handler\\CurlHandler;\nuse GuzzleHttp\\Handler\\CurlMultiHandler;\nuse GuzzleHttp\\Handler\\Proxy;\nuse GuzzleHttp\\Promise\\Promise;\nuse Obs\\Internal\\Resource\\Constants;\n\n\ndefine('DEBUG', Logger::DEBUG);\ndefine('INFO', Logger::INFO);\ndefine('NOTICE', Logger::NOTICE);\ndefine('WARNING', Logger::WARNING);\ndefine('WARN', Logger::WARNING);\ndefine('ERROR', Logger::ERROR);\ndefine('CRITICAL', Logger::CRITICAL);\ndefine('ALERT', Logger::ALERT);\ndefine('EMERGENCY', Logger::EMERGENCY);\n\n/**\n * @method Model createPostSignature(array $args=[]);\n * @method Model createSignedUrl(array $args=[]);\n * @method Model createBucket(array $args = []);\n * @method Model listBuckets();\n * @method Model deleteBucket(array $args = []);\n * @method Model listObjects(array $args = []);\n * @method Model listVersions(array $args = []);\n * @method Model headBucket(array $args = []);\n * @method Model getBucketMetadata(array $args = []);\n * @method Model getBucketLocation(array $args = []);\n * @method Model getBucketStorageInfo(array $args = []);\n * @method Model setBucketQuota(array $args = []);\n * @method Model getBucketQuota(array $args = []);\n * @method Model setBucketStoragePolicy(array $args = []);\n * @method Model getBucketStoragePolicy(array $args = []);\n * @method Model setBucketAcl(array $args = []);\n * @method Model getBucketAcl(array $args = []);\n * @method Model setBucketLogging(array $args = []);\n * @method Model getBucketLogging(array $args = []);\n * @method Model setBucketPolicy(array $args = []);\n * @method Model getBucketPolicy(array $args = []);\n * @method Model deleteBucketPolicy(array $args = []);\n * @method Model setBucketLifecycle(array $args = []);\n * @method Model getBucketLifecycle(array $args = []);\n * @method Model deleteBucketLifecycle(array $args = []);\n * @method Model setBucketWebsite(array $args = []);\n * @method Model getBucketWebsite(array $args = []);\n * @method Model deleteBucketWebsite(array $args = []);\n * @method Model setBucketVersioning(array $args = []);\n * @method Model getBucketVersioning(array $args = []);\n * @method Model setBucketCors(array $args = []);\n * @method Model getBucketCors(array $args = []);\n * @method Model deleteBucketCors(array $args = []);\n * @method Model setBucketNotification(array $args = []);\n * @method Model getBucketNotification(array $args = []);\n * @method Model setBucketTagging(array $args = []);\n * @method Model getBucketTagging(array $args = []);\n * @method Model deleteBucketTagging(array $args = []);\n * @method Model optionsBucket(array $args = []);\n * \n * @method Model putObject(array $args = []);\n * @method Model getObject(array $args = []);\n * @method Model copyObject(array $args = []);\n * @method Model deleteObject(array $args = []);\n * @method Model deleteObjects(array $args = []);\n * @method Model getObjectMetadata(array $args = []);\n * @method Model setObjectAcl(array $args = []);\n * @method Model getObjectAcl(array $args = []);\n * @method Model initiateMultipartUpload(array $args = []);\n * @method Model uploadPart(array $args = []);\n * @method Model copyPart(array $args = []);\n * @method Model listParts(array $args = []);\n * @method Model completeMultipartUpload(array $args = []);\n * @method Model abortMultipartUpload(array $args = []);\n * @method Model listMultipartUploads(array $args = []);\n * @method Model optionsObject(array $args = []);\n * @method Model restoreObject(array $args = []);\n *  \n * @method Promise createBucketAsync(array $args = [], callable $callback);\n * @method Promise listBucketsAsync(callable $callback);\n * @method Promise deleteBucketAsync(array $args = [], callable $callback);\n * @method Promise listObjectsAsync(array $args = [], callable $callback);\n * @method Promise listVersionsAsync(array $args = [], callable $callback);\n * @method Promise headBucketAsync(array $args = [], callable $callback);\n * @method Promise getBucketMetadataAsync(array $args = [], callable $callback);\n * @method Promise getBucketLocationAsync(array $args = [], callable $callback);\n * @method Promise getBucketStorageInfoAsync(array $args = [], callable $callback);\n * @method Promise setBucketQuotaAsync(array $args = [], callable $callback);\n * @method Promise getBucketQuotaAsync(array $args = [], callable $callback);\n * @method Promise setBucketStoragePolicyAsync(array $args = [], callable $callback);\n * @method Promise getBucketStoragePolicyAsync(array $args = [], callable $callback);\n * @method Promise setBucketAclAsync(array $args = [], callable $callback);\n * @method Promise getBucketAclAsync(array $args = [], callable $callback);\n * @method Promise setBucketLoggingAsync(array $args = [], callable $callback);\n * @method Promise getBucketLoggingAsync(array $args = [], callable $callback);\n * @method Promise setBucketPolicyAsync(array $args = [], callable $callback);\n * @method Promise getBucketPolicyAsync(array $args = [], callable $callback);\n * @method Promise deleteBucketPolicyAsync(array $args = [], callable $callback);\n * @method Promise setBucketLifecycleAsync(array $args = [], callable $callback);\n * @method Promise getBucketLifecycleAsync(array $args = [], callable $callback);\n * @method Promise deleteBucketLifecycleAsync(array $args = [], callable $callback);\n * @method Promise setBucketWebsiteAsync(array $args = [], callable $callback);\n * @method Promise getBucketWebsiteAsync(array $args = [], callable $callback);\n * @method Promise deleteBucketWebsiteAsync(array $args = [], callable $callback);\n * @method Promise setBucketVersioningAsync(array $args = [], callable $callback);\n * @method Promise getBucketVersioningAsync(array $args = [], callable $callback);\n * @method Promise setBucketCorsAsync(array $args = [], callable $callback);\n * @method Promise getBucketCorsAsync(array $args = [], callable $callback);\n * @method Promise deleteBucketCorsAsync(array $args = [], callable $callback);\n * @method Promise setBucketNotificationAsync(array $args = [], callable $callback);\n * @method Promise getBucketNotificationAsync(array $args = [], callable $callback);\n * @method Promise setBucketTaggingAsync(array $args = [], callable $callback);\n * @method Promise getBucketTaggingAsync(array $args = [], callable $callback);\n * @method Promise deleteBucketTaggingAsync(array $args = [], callable $callback);\n * @method Promise optionsBucketAsync(array $args = [], callable $callback);\n * \n * @method Promise putObjectAsync(array $args = [], callable $callback);\n * @method Promise getObjectAsync(array $args = [], callable $callback);\n * @method Promise copyObjectAsync(array $args = [], callable $callback);\n * @method Promise deleteObjectAsync(array $args = [], callable $callback);\n * @method Promise deleteObjectsAsync(array $args = [], callable $callback);\n * @method Promise getObjectMetadataAsync(array $args = [], callable $callback);\n * @method Promise setObjectAclAsync(array $args = [], callable $callback);\n * @method Promise getObjectAclAsync(array $args = [], callable $callback);\n * @method Promise initiateMultipartUploadAsync(array $args = [], callable $callback);\n * @method Promise uploadPartAsync(array $args = [], callable $callback);\n * @method Promise copyPartAsync(array $args = [], callable $callback);\n * @method Promise listPartsAsync(array $args = [], callable $callback);\n * @method Promise completeMultipartUploadAsync(array $args = [], callable $callback);\n * @method Promise abortMultipartUploadAsync(array $args = [], callable $callback);\n * @method Promise listMultipartUploadsAsync(array $args = [], callable $callback);\n * @method Promise optionsObjectAsync(array $args = [], callable $callback);\n * @method Promise restoreObjectAsync(array $args = [], callable $callback);\n * \n */\nclass ObsClient\n{\n\t\n\tconst SDK_VERSION = '3.0.1';\n\t\n\tconst AclPrivate = 'private';\n\tconst AclPublicRead = 'public-read';\n\tconst AclPublicReadWrite = 'public-read-write';\n\tconst AclPublicReadDelivered = 'public-read-delivered';\n\tconst AclPublicReadWriteDelivered = 'public-read-write-delivered';\n\t\n\tconst AclAuthenticatedRead = 'authenticated-read';\n\tconst AclBucketOwnerRead = 'bucket-owner-read';\n\tconst AclBucketOwnerFullControl = 'bucket-owner-full-control';\n\tconst AclLogDeliveryWrite = 'log-delivery-write';\n\t\n\tconst StorageClassStandard = 'STANDARD';\n\tconst StorageClassWarm = 'WARM';\n\tconst StorageClassCold = 'COLD';\n\t\n\tconst PermissionRead = 'READ';\n\tconst PermissionWrite = 'WRITE';\n\tconst PermissionReadAcp = 'READ_ACP';\n\tconst PermissionWriteAcp = 'WRITE_ACP';\n\tconst PermissionFullControl = 'FULL_CONTROL';\n\t\n\tconst AllUsers = 'Everyone';\n\t\n\tconst GroupAllUsers = 'AllUsers';\n\tconst GroupAuthenticatedUsers = 'AuthenticatedUsers';\n\tconst GroupLogDelivery = 'LogDelivery';\n\t\n\tconst RestoreTierExpedited = 'Expedited';\n\tconst RestoreTierStandard = 'Standard';\n\tconst RestoreTierBulk = 'Bulk';\n\t\n\tconst GranteeGroup = 'Group';\n\tconst GranteeUser = 'CanonicalUser';\n\t\n\tconst CopyMetadata = 'COPY';\n\tconst ReplaceMetadata = 'REPLACE';\n\t\n\tconst SignatureV2 = 'v2';\n\tconst SignatureV4 = 'v4';\n\tconst SigantureObs = 'obs';\n\t\n\tconst ObjectCreatedAll = 'ObjectCreated:*';\n\tconst ObjectCreatedPut = 'ObjectCreated:Put';\n\tconst ObjectCreatedPost = 'ObjectCreated:Post';\n\tconst ObjectCreatedCopy = 'ObjectCreated:Copy';\n\tconst ObjectCreatedCompleteMultipartUpload = 'ObjectCreated:CompleteMultipartUpload';\n\tconst ObjectRemovedAll = 'ObjectRemoved:*';\n\tconst ObjectRemovedDelete = 'ObjectRemoved:Delete';\n\tconst ObjectRemovedDeleteMarkerCreated = 'ObjectRemoved:DeleteMarkerCreated';\n\t\n\tuse Internal\\SendRequestTrait;\n\tuse Internal\\GetResponseTrait;\n\t\n\tprivate $factorys;\n\n\tpublic function __construct(array $config = []){\n\t\t$this ->factorys = [];\n\t\t\n\t\t$this -> ak = strval($config['key']);\n\t\t$this -> sk = strval($config['secret']);\n\t\t\n\t\tif(isset($config['security_token'])){\n\t\t    $this -> securityToken = strval($config['security_token']);\n\t\t}\n\t\t\n\t\tif(isset($config['endpoint'])){\n\t\t\t$this -> endpoint = trim(strval($config['endpoint']));\n\t\t}\n\t\t\n\t\tif($this -> endpoint === ''){\n\t\t\tthrow new \\RuntimeException('endpoint is not set');\n\t\t}\n\t\t\n\t\twhile($this -> endpoint[strlen($this -> endpoint)-1] === '/'){\n\t\t\t$this -> endpoint = substr($this -> endpoint, 0, strlen($this -> endpoint)-1);\n\t\t}\n\t\t\n\t\tif(strpos($this-> endpoint, 'http') !== 0){\n\t\t\t$this -> endpoint = 'https://' . $this -> endpoint;\n\t\t}\n\t\t\n\t\tif(isset($config['signature'])){\n\t\t    $this -> signature = strval($config['signature']);\n\t\t}\n\t\t\n\t\tif(isset($config['path_style'])){\n\t\t\t$this -> pathStyle = $config['path_style'];\n\t\t}\n\t\t\n\t\tif(isset($config['region'])){\n\t\t\t$this -> region = strval($config['region']);\n\t\t}\n\t\t\n\t\tif(isset($config['ssl_verify'])){\n\t\t\t$this -> sslVerify = $config['ssl_verify'];\n\t\t}else if(isset($config['ssl.certificate_authority'])){\n\t\t\t$this -> sslVerify = $config['ssl.certificate_authority'];\n\t\t}\n\t\t\n\t\tif(isset($config['max_retry_count'])){\n\t\t\t$this -> maxRetryCount = intval($config['max_retry_count']);\n\t\t}\n\t\t\n\t\tif(isset($config['timeout'])){\n\t\t\t$this -> timeout = intval($config['timeout']);\n\t\t}\n\t\t\n\t\tif(isset($config['socket_timeout'])){\n\t\t\t$this -> socketTimeout = intval($config['socket_timeout']);\n\t\t}\n\t\t\n\t\tif(isset($config['connect_timeout'])){\n\t\t\t$this -> connectTimeout = intval($config['connect_timeout']);\n\t\t}\n\t\t\n\t\tif(isset($config['chunk_size'])){\n\t\t\t$this -> chunkSize = intval($config['chunk_size']);\n\t\t}\n\t\t\n\t\tif(isset($config['exception_response_mode'])){\n\t\t\t$this -> exceptionResponseMode = $config['exception_response_mode'];\n\t\t}\n\t\t\n\t\t$host = parse_url($this -> endpoint)['host'];\n\t\tif(filter_var($host, FILTER_VALIDATE_IP) !== false) {\n\t\t    $this -> pathStyle = true;\n\t\t}\n\t\t\t\t\n\t\t$handler = self::choose_handler($this);\n\t\t\n\t\t$this -> httpClient = new Client(\n\t\t\t\t[\n\t\t\t\t\t\t'timeout' => 0,\n\t\t\t\t\t\t'read_timeout' => $this -> socketTimeout,\n\t\t\t\t\t\t'connect_timeout' => $this -> connectTimeout,\n\t\t\t\t\t\t'allow_redirects' => false,\n\t\t\t\t\t\t'verify' => $this -> sslVerify,\n\t\t\t\t\t\t'expect' => false,\n\t\t\t\t\t\t'handler' => HandlerStack::create($handler),\n\t\t\t\t\t\t'curl' => [\n\t\t\t\t\t\t\t\tCURLOPT_BUFFERSIZE => $this -> chunkSize\n\t\t\t\t\t\t]\n\t\t\t\t]\n\t\t);\n\t\t\n\t}\n\t\n\tpublic function __destruct(){\n\t\t$this-> close();\n\t}\n\t\n\tpublic function refresh($key, $secret, $security_token=false){\n\t    $this -> ak = strval($key);\n\t    $this -> sk = strval($secret);\n\t    if($security_token){\n\t        $this -> securityToken = strval($security_token);\n\t    }\n\t}\n\t\n\t/**\n\t * Get the default User-Agent string to use with Guzzle\n\t *\n\t * @return string\n\t */\n\tprivate static function default_user_agent()\n\t{\n\t\tstatic $defaultAgent = '';\n\t\tif (!$defaultAgent) {\n\t\t\t$defaultAgent = 'obs-sdk-php/' . self::SDK_VERSION;\n\t\t}\n\t\t\n\t\treturn $defaultAgent;\n\t}\n\t\n\t/**\n\t * Factory method to create a new Obs client using an array of configuration options.\n\t *\n\t * @param array $config Client configuration data\n\t *\n\t * @return ObsClient\n\t */\n\tpublic static function factory(array $config = [])\n\t{\n\t\treturn new ObsClient($config);\n\t}\n\t\n\tpublic function close(){\n\t\tif($this->factorys){\n\t\t\tforeach ($this->factorys as $factory){\n\t\t\t\t$factory->close();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic function initLog(array $logConfig= [])\n\t{\n\t\tObsLog::initLog($logConfig);\n\t\t\n\t\t$msg = [];\n\t\t$msg[] = '[OBS SDK Version=' . self::SDK_VERSION;\n\t\t$msg[] = 'Endpoint=' . $this->endpoint;\n\t\t$msg[] = 'Access Mode=' . ($this->pathStyle ? 'Path' : 'Virtual Hosting').']';\n\t\t\n\t\tObsLog::commonLog(WARNING, implode(\"];[\", $msg));\n\t}\n\t\n\tprivate static function choose_handler($obsclient)\n\t{\n\t\t$handler = null;\n\t\tif (function_exists('curl_multi_exec') && function_exists('curl_exec')) {\n\t\t\t$f1 = new SdkCurlFactory(50);\n\t\t\t$f2 = new SdkCurlFactory(3);\n\t\t\t$obsclient->factorys[] = $f1;\n\t\t\t$obsclient->factorys[] = $f2;\n\t\t\t$handler = Proxy::wrapSync(new CurlMultiHandler(['handle_factory' => $f1]), new CurlHandler(['handle_factory' => $f2]));\n\t\t} elseif (function_exists('curl_exec')) {\n\t\t\t$f = new SdkCurlFactory(3);\n\t\t\t$obsclient->factorys[] = $f;\n\t\t\t$handler = new CurlHandler(['handle_factory' => $f]);\n\t\t} elseif (function_exists('curl_multi_exec')) {\n\t\t\t$f = new SdkCurlFactory(50);\n\t\t\t$obsclient->factorys[] = $f;\n\t\t\t$handler = new CurlMultiHandler(['handle_factory' => $f1]);\n\t\t}\n\t\t\n\t\tif (ini_get('allow_url_fopen')) {\n\t\t\t$handler = $handler\n\t\t\t? Proxy::wrapStreaming($handler, new SdkStreamHandler())\n\t\t\t: new SdkStreamHandler();\n\t\t} elseif (!$handler) {\n\t\t\tthrow new \\RuntimeException('GuzzleHttp requires cURL, the '\n\t\t\t\t\t. 'allow_url_fopen ini setting, or a custom HTTP handler.');\n\t\t}\n\t\t\n\t\treturn $handler;\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/Obs/ObsException.php",
    "content": "<?php\n\nnamespace Obs;\n\nuse GuzzleHttp\\Psr7\\Request;\nuse GuzzleHttp\\Psr7\\Response;\nuse Obs\\Log\\ObsLog;\n\nclass ObsException extends \\RuntimeException\n{\n\tconst CLIENT = 'client';\n\t\n\tconst SERVER = 'server';\n\t\n    /**\n     * @var Response\n     */\n    protected $response;\n\n    /**\n     * @var Request\n     */\n    protected $request;\n\n    /**\n     * @var string Request ID\n     */\n    protected $requestId;\n\n    /**\n     * @var string Exception type (client / server)\n     */\n    protected $exceptionType;\n        \n    /**\n     * @var string Exception code\n     */\n    protected $exceptionCode;\n    \n    /**\n     * @var string Exception message\n     */\n    protected $exceptionMessage;\n    \n    /**\n     * @var string Host ID\n     */\n    protected $hostId;\n\t\n    public function __construct ($message = null, $code = null, $previous = null) \n    {\n    \tparent::__construct($message, $code, $previous);\n    }\n    \n    /**\n     * Set the exception code\n     *\n     * @param string $code Exception code\n     */\n    public function setExceptionCode($code)\n    {\n        $this->exceptionCode = $code;\n    }\n    /**\n     * Get the exception code\n     *\n     * @return string|null\n     */\n    public function getExceptionCode()\n    {\n        return $this->exceptionCode;\n    }\n    \n    public function setExceptionMessage($message)\n    {\n    \t$this->exceptionMessage = $message;\n    }\n    \n    public function getExceptionMessage()\n    {\n    \treturn $this->exceptionMessage ? $this->exceptionMessage : $this->message;\n    }\n\n    /**\n     * Set the exception type\n     *\n     * @param string $type Exception type\n     */\n    public function setExceptionType($type)\n    {\n        $this->exceptionType = $type;\n    }\n\n    /**\n     * Get the exception type (one of client or server)\n     *\n     * @return string|null\n     */\n    public function getExceptionType()\n    {\n        return $this->exceptionType;\n    }\n\n    /**\n     * Set the request ID\n     *\n     * @param string $id Request ID\n     */\n    public function setRequestId($id)\n    {\n        $this->requestId = $id;\n    }\n\n    /**\n     * Get the Request ID\n     *\n     * @return string|null\n     */\n    public function getRequestId()\n    {\n        return $this->requestId;\n    }\n\n    /**\n     * Set the associated response\n     *\n     * @param Response $response Response\n     */\n    public function setResponse(Response $response)\n    {\n        $this->response = $response;\n    }\n\n    /**\n     * Get the associated response object\n     *\n     * @return Response|null\n     */\n    public function getResponse()\n    {\n        return $this->response;\n    }\n\n    /**\n     * Set the associated request\n     *\n     * @param Request $request\n     */\n    public function setRequest(Request $request)\n    {\n        $this->request = $request;\n    }\n\n    /**\n     * Get the associated request object\n     *\n     * @return RequestInterface|null\n     */\n    public function getRequest()\n    {\n        return $this->request;\n    }\n\n    /**\n     * Get the status code of the response\n     *\n     * @return int|null\n     */\n    public function getStatusCode()\n    {\n        return $this->response ? $this->response->getStatusCode() : -1;\n    }\n    \n    public function setHostId($hostId){\n    \t$this->hostId = $hostId;\n    }\n    \n    public function getHostId(){\n    \treturn $this->hostId;\n    }\n\n    /**\n     * Cast to a string\n     *\n     * @return string\n     */\n    public function __toString()\n    {\n        $message = get_class($this) . ': '\n            . 'OBS Error Code: ' . $this->getExceptionCode() . ', '\n            . 'Status Code: ' . $this->getStatusCode() . ', '\n            . 'OBS Error Type: ' . $this->getExceptionType() . ', '\n            . 'OBS Error Message: ' . ($this->getExceptionMessage() ? $this->getExceptionMessage():$this->getMessage());\n\n        // Add the User-Agent if available\n        if ($this->request) {\n            $message .= ', ' . 'User-Agent: ' . $this->request->getHeaderLine('User-Agent');\n        }\n        $message .= \"\\n\";\n        \n        ObsLog::commonLog(INFO, \"http request:status:%d, %s\",$this->getStatusCode(),\"code:\".$this->getExceptionCode().\", message:\".$this->getMessage());\n        return $message;\n    }\n    \n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/composer.json",
    "content": "{\n\t\"require\" : {\n\t\t\"php\" : \">=5.6.0\",\n\t\t\"guzzlehttp/guzzle\" : \"6.3.0\",\n\t\t\"guzzlehttp/psr7\" : \"1.4.2\",\n\t\t\"guzzlehttp/promises\" : \"1.3.1\",\n\t\t\"psr/http-message\" : \"1.0.1\",\n\t\t\"monolog/monolog\" : \"1.23.0\",\n\t\t\"psr/log\" : \"1.0.2\"\n\t}\n}"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/obs-autoloader.php",
    "content": "<?php\r\n\r\r\n$mapping = [\r\n\t'Obs\\Internal\\Common\\CheckoutStream' => __DIR__.'/Obs/Internal/Common/CheckoutStream.php',\r\n\t'Obs\\Internal\\Common\\ITransform' => __DIR__.'/Obs/Internal/Common/ITransform.php',\r\n\t'Obs\\Internal\\Common\\Model' => __DIR__.'/Obs/Internal/Common/Model.php',\r\n\t'Obs\\Internal\\Common\\ObsTransform' => __DIR__.'/Obs/Internal/Common/ObsTransform.php',\r\n\t'Obs\\Internal\\Common\\SchemaFormatter' => __DIR__.'/Obs/Internal/Common/SchemaFormatter.php',\r\n\t'Obs\\Internal\\Common\\SdkCurlFactory' => __DIR__.'/Obs/Internal/Common/SdkCurlFactory.php',\r\n\t'Obs\\Internal\\Common\\SdkStreamHandler' => __DIR__.'/Obs/Internal/Common/SdkStreamHandler.php',\r\n\t'Obs\\Internal\\Common\\ToArrayInterface' => __DIR__.'/Obs/Internal/Common/ToArrayInterface.php',\r\n\t'Obs\\Internal\\Common\\V2Transform' => __DIR__.'/Obs/Internal/Common/V2Transform.php',\r\n\t'Obs\\Internal\\GetResponseTrait' => __DIR__.'/Obs/Internal/GetResponseTrait.php',\r\n\t'Obs\\Internal\\Resource\\Constants' => __DIR__.'/Obs/Internal/Resource/Constants.php',\r\n\t'Obs\\Internal\\Resource\\OBSConstants' => __DIR__.'/Obs/Internal/Resource/OBSConstants.php',\r\n\t'Obs\\Internal\\Resource\\OBSRequestResource' => __DIR__.'/Obs/Internal/Resource/OBSRequestResource.php',\r\n\t'Obs\\Internal\\Resource\\V2Constants' => __DIR__.'/Obs/Internal/Resource/V2Constants.php',\r\n\t'Obs\\Internal\\Resource\\V2RequestResource' => __DIR__.'/Obs/Internal/Resource/V2RequestResource.php',\r\n\t'Obs\\Internal\\SendRequestTrait' => __DIR__.'/Obs/Internal/SendRequestTrait.php',\r\n\t'Obs\\Internal\\Signature\\AbstractSignature' => __DIR__.'/Obs/Internal/Signature/AbstractSignature.php',\r\n\t'Obs\\Internal\\Signature\\DefaultSignature' => __DIR__.'/Obs/Internal/Signature/DefaultSignature.php',\r\n\t'Obs\\Internal\\Signature\\SignatureInterface' => __DIR__.'/Obs/Internal/Signature/SignatureInterface.php',\r\n\t'Obs\\Internal\\Signature\\V4Signature' => __DIR__.'/Obs/Internal/Signature/V4Signature.php',\r\n\t'Obs\\Log\\ObsConfig' => __DIR__.'/Obs/Log/ObsConfig.php',\r\n\t'Obs\\Log\\ObsLog' => __DIR__.'/Obs/Log/ObsLog.php',\r\n\t'Obs\\ObsClient' => __DIR__.'/Obs/ObsClient.php',\r\n\t'Obs\\ObsException' => __DIR__.'/Obs/ObsException.php',\r\n];\r\n\r\r\nspl_autoload_register(function ($class) use ($mapping) {\r\n    if (isset($mapping[$class])) {\r\n        require $mapping[$class];\r\n    }\r\n}, true);\r\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/autoload.php",
    "content": "<?php\n\n// autoload.php @generated by Composer\n\nrequire_once __DIR__ . '/composer/autoload_real.php';\n\nreturn ComposerAutoloaderInitce16f47fb1de3e331b7a3a7183946dec::getLoader();\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/composer/ClassLoader.php",
    "content": "<?php\n\n/*\n * This file is part of Composer.\n *\n * (c) Nils Adermann <naderman@naderman.de>\n *     Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Composer\\Autoload;\n\n/**\n * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.\n *\n *     $loader = new \\Composer\\Autoload\\ClassLoader();\n *\n *     // register classes with namespaces\n *     $loader->add('Symfony\\Component', __DIR__.'/component');\n *     $loader->add('Symfony',           __DIR__.'/framework');\n *\n *     // activate the autoloader\n *     $loader->register();\n *\n *     // to enable searching the include path (eg. for PEAR packages)\n *     $loader->setUseIncludePath(true);\n *\n * In this example, if you try to use a class in the Symfony\\Component\n * namespace or one of its children (Symfony\\Component\\Console for instance),\n * the autoloader will first look for the class under the component/\n * directory, and it will then fallback to the framework/ directory if not\n * found before giving up.\n *\n * This class is loosely based on the Symfony UniversalClassLoader.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @see    http://www.php-fig.org/psr/psr-0/\n * @see    http://www.php-fig.org/psr/psr-4/\n */\nclass ClassLoader\n{\n    // PSR-4\n    private $prefixLengthsPsr4 = array();\n    private $prefixDirsPsr4 = array();\n    private $fallbackDirsPsr4 = array();\n\n    // PSR-0\n    private $prefixesPsr0 = array();\n    private $fallbackDirsPsr0 = array();\n\n    private $useIncludePath = false;\n    private $classMap = array();\n    private $classMapAuthoritative = false;\n    private $missingClasses = array();\n    private $apcuPrefix;\n\n    public function getPrefixes()\n    {\n        if (!empty($this->prefixesPsr0)) {\n            return call_user_func_array('array_merge', $this->prefixesPsr0);\n        }\n\n        return array();\n    }\n\n    public function getPrefixesPsr4()\n    {\n        return $this->prefixDirsPsr4;\n    }\n\n    public function getFallbackDirs()\n    {\n        return $this->fallbackDirsPsr0;\n    }\n\n    public function getFallbackDirsPsr4()\n    {\n        return $this->fallbackDirsPsr4;\n    }\n\n    public function getClassMap()\n    {\n        return $this->classMap;\n    }\n\n    /**\n     * @param array $classMap Class to filename map\n     */\n    public function addClassMap(array $classMap)\n    {\n        if ($this->classMap) {\n            $this->classMap = array_merge($this->classMap, $classMap);\n        } else {\n            $this->classMap = $classMap;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix, either\n     * appending or prepending to the ones previously set for this prefix.\n     *\n     * @param string       $prefix  The prefix\n     * @param array|string $paths   The PSR-0 root directories\n     * @param bool         $prepend Whether to prepend the directories\n     */\n    public function add($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            if ($prepend) {\n                $this->fallbackDirsPsr0 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr0\n                );\n            } else {\n                $this->fallbackDirsPsr0 = array_merge(\n                    $this->fallbackDirsPsr0,\n                    (array) $paths\n                );\n            }\n\n            return;\n        }\n\n        $first = $prefix[0];\n        if (!isset($this->prefixesPsr0[$first][$prefix])) {\n            $this->prefixesPsr0[$first][$prefix] = (array) $paths;\n\n            return;\n        }\n        if ($prepend) {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixesPsr0[$first][$prefix]\n            );\n        } else {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                $this->prefixesPsr0[$first][$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace, either\n     * appending or prepending to the ones previously set for this namespace.\n     *\n     * @param string       $prefix  The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths   The PSR-4 base directories\n     * @param bool         $prepend Whether to prepend the directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function addPsr4($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            // Register directories for the root namespace.\n            if ($prepend) {\n                $this->fallbackDirsPsr4 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr4\n                );\n            } else {\n                $this->fallbackDirsPsr4 = array_merge(\n                    $this->fallbackDirsPsr4,\n                    (array) $paths\n                );\n            }\n        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {\n            // Register directories for a new namespace.\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        } elseif ($prepend) {\n            // Prepend directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixDirsPsr4[$prefix]\n            );\n        } else {\n            // Append directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                $this->prefixDirsPsr4[$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix,\n     * replacing any others previously set for this prefix.\n     *\n     * @param string       $prefix The prefix\n     * @param array|string $paths  The PSR-0 base directories\n     */\n    public function set($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr0 = (array) $paths;\n        } else {\n            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace,\n     * replacing any others previously set for this namespace.\n     *\n     * @param string       $prefix The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths  The PSR-4 base directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function setPsr4($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr4 = (array) $paths;\n        } else {\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Turns on searching the include path for class files.\n     *\n     * @param bool $useIncludePath\n     */\n    public function setUseIncludePath($useIncludePath)\n    {\n        $this->useIncludePath = $useIncludePath;\n    }\n\n    /**\n     * Can be used to check if the autoloader uses the include path to check\n     * for classes.\n     *\n     * @return bool\n     */\n    public function getUseIncludePath()\n    {\n        return $this->useIncludePath;\n    }\n\n    /**\n     * Turns off searching the prefix and fallback directories for classes\n     * that have not been registered with the class map.\n     *\n     * @param bool $classMapAuthoritative\n     */\n    public function setClassMapAuthoritative($classMapAuthoritative)\n    {\n        $this->classMapAuthoritative = $classMapAuthoritative;\n    }\n\n    /**\n     * Should class lookup fail if not found in the current class map?\n     *\n     * @return bool\n     */\n    public function isClassMapAuthoritative()\n    {\n        return $this->classMapAuthoritative;\n    }\n\n    /**\n     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.\n     *\n     * @param string|null $apcuPrefix\n     */\n    public function setApcuPrefix($apcuPrefix)\n    {\n        $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;\n    }\n\n    /**\n     * The APCu prefix in use, or null if APCu caching is not enabled.\n     *\n     * @return string|null\n     */\n    public function getApcuPrefix()\n    {\n        return $this->apcuPrefix;\n    }\n\n    /**\n     * Registers this instance as an autoloader.\n     *\n     * @param bool $prepend Whether to prepend the autoloader or not\n     */\n    public function register($prepend = false)\n    {\n        spl_autoload_register(array($this, 'loadClass'), true, $prepend);\n    }\n\n    /**\n     * Unregisters this instance as an autoloader.\n     */\n    public function unregister()\n    {\n        spl_autoload_unregister(array($this, 'loadClass'));\n    }\n\n    /**\n     * Loads the given class or interface.\n     *\n     * @param  string    $class The name of the class\n     * @return bool|null True if loaded, null otherwise\n     */\n    public function loadClass($class)\n    {\n        if ($file = $this->findFile($class)) {\n            includeFile($file);\n\n            return true;\n        }\n    }\n\n    /**\n     * Finds the path to the file where the class is defined.\n     *\n     * @param string $class The name of the class\n     *\n     * @return string|false The path if found, false otherwise\n     */\n    public function findFile($class)\n    {\n        // class map lookup\n        if (isset($this->classMap[$class])) {\n            return $this->classMap[$class];\n        }\n        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {\n            return false;\n        }\n        if (null !== $this->apcuPrefix) {\n            $file = apcu_fetch($this->apcuPrefix.$class, $hit);\n            if ($hit) {\n                return $file;\n            }\n        }\n\n        $file = $this->findFileWithExtension($class, '.php');\n\n        // Search for Hack files if we are running on HHVM\n        if (false === $file && defined('HHVM_VERSION')) {\n            $file = $this->findFileWithExtension($class, '.hh');\n        }\n\n        if (null !== $this->apcuPrefix) {\n            apcu_add($this->apcuPrefix.$class, $file);\n        }\n\n        if (false === $file) {\n            // Remember that this class does not exist.\n            $this->missingClasses[$class] = true;\n        }\n\n        return $file;\n    }\n\n    private function findFileWithExtension($class, $ext)\n    {\n        // PSR-4 lookup\n        $logicalPathPsr4 = strtr($class, '\\\\', DIRECTORY_SEPARATOR) . $ext;\n\n        $first = $class[0];\n        if (isset($this->prefixLengthsPsr4[$first])) {\n            $subPath = $class;\n            while (false !== $lastPos = strrpos($subPath, '\\\\')) {\n                $subPath = substr($subPath, 0, $lastPos);\n                $search = $subPath.'\\\\';\n                if (isset($this->prefixDirsPsr4[$search])) {\n                    foreach ($this->prefixDirsPsr4[$search] as $dir) {\n                        $length = $this->prefixLengthsPsr4[$first][$search];\n                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-4 fallback dirs\n        foreach ($this->fallbackDirsPsr4 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 lookup\n        if (false !== $pos = strrpos($class, '\\\\')) {\n            // namespaced class name\n            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)\n                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);\n        } else {\n            // PEAR-like class name\n            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;\n        }\n\n        if (isset($this->prefixesPsr0[$first])) {\n            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {\n                if (0 === strpos($class, $prefix)) {\n                    foreach ($dirs as $dir) {\n                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-0 fallback dirs\n        foreach ($this->fallbackDirsPsr0 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 include paths.\n        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {\n            return $file;\n        }\n\n        return false;\n    }\n}\n\n/**\n * Scope isolated include.\n *\n * Prevents access to $this/self from included files.\n */\nfunction includeFile($file)\n{\n    include $file;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/composer/LICENSE",
    "content": "\nCopyright (c) Nils Adermann, Jordi Boggiano\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/composer/autoload_classmap.php",
    "content": "<?php\n\n// autoload_classmap.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/composer/autoload_files.php",
    "content": "<?php\n\n// autoload_files.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',\n    'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',\n    '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/composer/autoload_namespaces.php",
    "content": "<?php\n\n// autoload_namespaces.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/composer/autoload_psr4.php",
    "content": "<?php\n\n// autoload_psr4.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'Psr\\\\Log\\\\' => array($vendorDir . '/psr/log/Psr/Log'),\n    'Psr\\\\Http\\\\Message\\\\' => array($vendorDir . '/psr/http-message/src'),\n    'Monolog\\\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),\n    'GuzzleHttp\\\\Psr7\\\\' => array($vendorDir . '/guzzlehttp/psr7/src'),\n    'GuzzleHttp\\\\Promise\\\\' => array($vendorDir . '/guzzlehttp/promises/src'),\n    'GuzzleHttp\\\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/composer/autoload_real.php",
    "content": "<?php\n\n// autoload_real.php @generated by Composer\n\nclass ComposerAutoloaderInitce16f47fb1de3e331b7a3a7183946dec\n{\n    private static $loader;\n\n    public static function loadClassLoader($class)\n    {\n        if ('Composer\\Autoload\\ClassLoader' === $class) {\n            require __DIR__ . '/ClassLoader.php';\n        }\n    }\n\n    public static function getLoader()\n    {\n        if (null !== self::$loader) {\n            return self::$loader;\n        }\n\n        spl_autoload_register(array('ComposerAutoloaderInitce16f47fb1de3e331b7a3a7183946dec', 'loadClassLoader'), true, true);\n        self::$loader = $loader = new \\Composer\\Autoload\\ClassLoader();\n        spl_autoload_unregister(array('ComposerAutoloaderInitce16f47fb1de3e331b7a3a7183946dec', 'loadClassLoader'));\n\n        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());\n        if ($useStaticLoader) {\n            require_once __DIR__ . '/autoload_static.php';\n\n            call_user_func(\\Composer\\Autoload\\ComposerStaticInitce16f47fb1de3e331b7a3a7183946dec::getInitializer($loader));\n        } else {\n            $map = require __DIR__ . '/autoload_namespaces.php';\n            foreach ($map as $namespace => $path) {\n                $loader->set($namespace, $path);\n            }\n\n            $map = require __DIR__ . '/autoload_psr4.php';\n            foreach ($map as $namespace => $path) {\n                $loader->setPsr4($namespace, $path);\n            }\n\n            $classMap = require __DIR__ . '/autoload_classmap.php';\n            if ($classMap) {\n                $loader->addClassMap($classMap);\n            }\n        }\n\n        $loader->register(true);\n\n        if ($useStaticLoader) {\n            $includeFiles = Composer\\Autoload\\ComposerStaticInitce16f47fb1de3e331b7a3a7183946dec::$files;\n        } else {\n            $includeFiles = require __DIR__ . '/autoload_files.php';\n        }\n        foreach ($includeFiles as $fileIdentifier => $file) {\n            composerRequirece16f47fb1de3e331b7a3a7183946dec($fileIdentifier, $file);\n        }\n\n        return $loader;\n    }\n}\n\nfunction composerRequirece16f47fb1de3e331b7a3a7183946dec($fileIdentifier, $file)\n{\n    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {\n        require $file;\n\n        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/composer/autoload_static.php",
    "content": "<?php\n\n// autoload_static.php @generated by Composer\n\nnamespace Composer\\Autoload;\n\nclass ComposerStaticInitce16f47fb1de3e331b7a3a7183946dec\n{\n    public static $files = array (\n        'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',\n        'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',\n        '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',\n    );\n\n    public static $prefixLengthsPsr4 = array (\n        'P' => \n        array (\n            'Psr\\\\Log\\\\' => 8,\n            'Psr\\\\Http\\\\Message\\\\' => 17,\n        ),\n        'M' => \n        array (\n            'Monolog\\\\' => 8,\n        ),\n        'G' => \n        array (\n            'GuzzleHttp\\\\Psr7\\\\' => 16,\n            'GuzzleHttp\\\\Promise\\\\' => 19,\n            'GuzzleHttp\\\\' => 11,\n        ),\n    );\n\n    public static $prefixDirsPsr4 = array (\n        'Psr\\\\Log\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/log/Psr/Log',\n        ),\n        'Psr\\\\Http\\\\Message\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/http-message/src',\n        ),\n        'Monolog\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog',\n        ),\n        'GuzzleHttp\\\\Psr7\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',\n        ),\n        'GuzzleHttp\\\\Promise\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/guzzlehttp/promises/src',\n        ),\n        'GuzzleHttp\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',\n        ),\n    );\n\n    public static function getInitializer(ClassLoader $loader)\n    {\n        return \\Closure::bind(function () use ($loader) {\n            $loader->prefixLengthsPsr4 = ComposerStaticInitce16f47fb1de3e331b7a3a7183946dec::$prefixLengthsPsr4;\n            $loader->prefixDirsPsr4 = ComposerStaticInitce16f47fb1de3e331b7a3a7183946dec::$prefixDirsPsr4;\n\n        }, null, ClassLoader::class);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/composer/installed.json",
    "content": "[\n    {\n        \"name\": \"guzzlehttp/promises\",\n        \"version\": \"v1.3.1\",\n        \"version_normalized\": \"1.3.1.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/guzzle/promises.git\",\n            \"reference\": \"a59da6cf61d80060647ff4d3eb2c03a2bc694646\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://files.phpcomposer.com/files/guzzle/promises/a59da6cf61d80060647ff4d3eb2c03a2bc694646.zip\",\n            \"reference\": \"a59da6cf61d80060647ff4d3eb2c03a2bc694646\",\n            \"shasum\": \"\"\n        },\n        \"require\": {\n            \"php\": \">=5.5.0\"\n        },\n        \"require-dev\": {\n            \"phpunit/phpunit\": \"^4.0\"\n        },\n        \"time\": \"2016-12-20T10:07:11+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"1.4-dev\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"GuzzleHttp\\\\Promise\\\\\": \"src/\"\n            },\n            \"files\": [\n                \"src/functions_include.php\"\n            ]\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"Michael Dowling\",\n                \"email\": \"mtdowling@gmail.com\",\n                \"homepage\": \"https://github.com/mtdowling\"\n            }\n        ],\n        \"description\": \"Guzzle promises library\",\n        \"keywords\": [\n            \"promise\"\n        ]\n    },\n    {\n        \"name\": \"psr/http-message\",\n        \"version\": \"1.0.1\",\n        \"version_normalized\": \"1.0.1.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/php-fig/http-message.git\",\n            \"reference\": \"f6561bf28d520154e4b0ec72be95418abe6d9363\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://files.phpcomposer.com/files/php-fig/http-message/f6561bf28d520154e4b0ec72be95418abe6d9363.zip\",\n            \"reference\": \"f6561bf28d520154e4b0ec72be95418abe6d9363\",\n            \"shasum\": \"\"\n        },\n        \"require\": {\n            \"php\": \">=5.3.0\"\n        },\n        \"time\": \"2016-08-06T14:39:51+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"1.0.x-dev\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n            }\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"PHP-FIG\",\n                \"homepage\": \"http://www.php-fig.org/\"\n            }\n        ],\n        \"description\": \"Common interface for HTTP messages\",\n        \"homepage\": \"https://github.com/php-fig/http-message\",\n        \"keywords\": [\n            \"http\",\n            \"http-message\",\n            \"psr\",\n            \"psr-7\",\n            \"request\",\n            \"response\"\n        ]\n    },\n    {\n        \"name\": \"guzzlehttp/psr7\",\n        \"version\": \"1.4.2\",\n        \"version_normalized\": \"1.4.2.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/guzzle/psr7.git\",\n            \"reference\": \"f5b8a8512e2b58b0071a7280e39f14f72e05d87c\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://files.phpcomposer.com/files/guzzle/psr7/f5b8a8512e2b58b0071a7280e39f14f72e05d87c.zip\",\n            \"reference\": \"f5b8a8512e2b58b0071a7280e39f14f72e05d87c\",\n            \"shasum\": \"\"\n        },\n        \"require\": {\n            \"php\": \">=5.4.0\",\n            \"psr/http-message\": \"~1.0\"\n        },\n        \"provide\": {\n            \"psr/http-message-implementation\": \"1.0\"\n        },\n        \"require-dev\": {\n            \"phpunit/phpunit\": \"~4.0\"\n        },\n        \"time\": \"2017-03-20T17:10:46+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"1.4-dev\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"GuzzleHttp\\\\Psr7\\\\\": \"src/\"\n            },\n            \"files\": [\n                \"src/functions_include.php\"\n            ]\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"Michael Dowling\",\n                \"email\": \"mtdowling@gmail.com\",\n                \"homepage\": \"https://github.com/mtdowling\"\n            },\n            {\n                \"name\": \"Tobias Schultze\",\n                \"homepage\": \"https://github.com/Tobion\"\n            }\n        ],\n        \"description\": \"PSR-7 message implementation that also provides common utility methods\",\n        \"keywords\": [\n            \"http\",\n            \"message\",\n            \"request\",\n            \"response\",\n            \"stream\",\n            \"uri\",\n            \"url\"\n        ]\n    },\n    {\n        \"name\": \"guzzlehttp/guzzle\",\n        \"version\": \"6.3.0\",\n        \"version_normalized\": \"6.3.0.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/guzzle/guzzle.git\",\n            \"reference\": \"f4db5a78a5ea468d4831de7f0bf9d9415e348699\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://files.phpcomposer.com/files/guzzle/guzzle/f4db5a78a5ea468d4831de7f0bf9d9415e348699.zip\",\n            \"reference\": \"f4db5a78a5ea468d4831de7f0bf9d9415e348699\",\n            \"shasum\": \"\"\n        },\n        \"require\": {\n            \"guzzlehttp/promises\": \"^1.0\",\n            \"guzzlehttp/psr7\": \"^1.4\",\n            \"php\": \">=5.5\"\n        },\n        \"require-dev\": {\n            \"ext-curl\": \"*\",\n            \"phpunit/phpunit\": \"^4.0 || ^5.0\",\n            \"psr/log\": \"^1.0\"\n        },\n        \"suggest\": {\n            \"psr/log\": \"Required for using the Log middleware\"\n        },\n        \"time\": \"2017-06-22T18:50:49+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"6.2-dev\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"files\": [\n                \"src/functions_include.php\"\n            ],\n            \"psr-4\": {\n                \"GuzzleHttp\\\\\": \"src/\"\n            }\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"Michael Dowling\",\n                \"email\": \"mtdowling@gmail.com\",\n                \"homepage\": \"https://github.com/mtdowling\"\n            }\n        ],\n        \"description\": \"Guzzle is a PHP HTTP client library\",\n        \"homepage\": \"http://guzzlephp.org/\",\n        \"keywords\": [\n            \"client\",\n            \"curl\",\n            \"framework\",\n            \"http\",\n            \"http client\",\n            \"rest\",\n            \"web service\"\n        ]\n    },\n    {\n        \"name\": \"psr/log\",\n        \"version\": \"1.0.2\",\n        \"version_normalized\": \"1.0.2.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/php-fig/log.git\",\n            \"reference\": \"4ebe3a8bf773a19edfe0a84b6585ba3d401b724d\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://files.phpcomposer.com/files/php-fig/log/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d.zip\",\n            \"reference\": \"4ebe3a8bf773a19edfe0a84b6585ba3d401b724d\",\n            \"shasum\": \"\"\n        },\n        \"require\": {\n            \"php\": \">=5.3.0\"\n        },\n        \"time\": \"2016-10-10T12:19:37+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"1.0.x-dev\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"Psr\\\\Log\\\\\": \"Psr/Log/\"\n            }\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"PHP-FIG\",\n                \"homepage\": \"http://www.php-fig.org/\"\n            }\n        ],\n        \"description\": \"Common interface for logging libraries\",\n        \"homepage\": \"https://github.com/php-fig/log\",\n        \"keywords\": [\n            \"log\",\n            \"psr\",\n            \"psr-3\"\n        ]\n    },\n    {\n        \"name\": \"monolog/monolog\",\n        \"version\": \"1.23.0\",\n        \"version_normalized\": \"1.23.0.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/Seldaek/monolog.git\",\n            \"reference\": \"fd8c787753b3a2ad11bc60c063cff1358a32a3b4\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://files.phpcomposer.com/files/Seldaek/monolog/fd8c787753b3a2ad11bc60c063cff1358a32a3b4.zip\",\n            \"reference\": \"fd8c787753b3a2ad11bc60c063cff1358a32a3b4\",\n            \"shasum\": \"\"\n        },\n        \"require\": {\n            \"php\": \">=5.3.0\",\n            \"psr/log\": \"~1.0\"\n        },\n        \"provide\": {\n            \"psr/log-implementation\": \"1.0.0\"\n        },\n        \"require-dev\": {\n            \"aws/aws-sdk-php\": \"^2.4.9 || ^3.0\",\n            \"doctrine/couchdb\": \"~1.0@dev\",\n            \"graylog2/gelf-php\": \"~1.0\",\n            \"jakub-onderka/php-parallel-lint\": \"0.9\",\n            \"php-amqplib/php-amqplib\": \"~2.4\",\n            \"php-console/php-console\": \"^3.1.3\",\n            \"phpunit/phpunit\": \"~4.5\",\n            \"phpunit/phpunit-mock-objects\": \"2.3.0\",\n            \"ruflin/elastica\": \">=0.90 <3.0\",\n            \"sentry/sentry\": \"^0.13\",\n            \"swiftmailer/swiftmailer\": \"^5.3|^6.0\"\n        },\n        \"suggest\": {\n            \"aws/aws-sdk-php\": \"Allow sending log messages to AWS services like DynamoDB\",\n            \"doctrine/couchdb\": \"Allow sending log messages to a CouchDB server\",\n            \"ext-amqp\": \"Allow sending log messages to an AMQP server (1.0+ required)\",\n            \"ext-mongo\": \"Allow sending log messages to a MongoDB server\",\n            \"graylog2/gelf-php\": \"Allow sending log messages to a GrayLog2 server\",\n            \"mongodb/mongodb\": \"Allow sending log messages to a MongoDB server via PHP Driver\",\n            \"php-amqplib/php-amqplib\": \"Allow sending log messages to an AMQP server using php-amqplib\",\n            \"php-console/php-console\": \"Allow sending log messages to Google Chrome\",\n            \"rollbar/rollbar\": \"Allow sending log messages to Rollbar\",\n            \"ruflin/elastica\": \"Allow sending log messages to an Elastic Search server\",\n            \"sentry/sentry\": \"Allow sending log messages to a Sentry server\"\n        },\n        \"time\": \"2017-06-19T01:22:40+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"2.0.x-dev\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"Monolog\\\\\": \"src/Monolog\"\n            }\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"Jordi Boggiano\",\n                \"email\": \"j.boggiano@seld.be\",\n                \"homepage\": \"http://seld.be\"\n            }\n        ],\n        \"description\": \"Sends your logs to files, sockets, inboxes, databases and various web services\",\n        \"homepage\": \"http://github.com/Seldaek/monolog\",\n        \"keywords\": [\n            \"log\",\n            \"logging\",\n            \"psr-3\"\n        ]\n    }\n]\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/CHANGELOG.md",
    "content": "# CHANGELOG\n\n## 6.3.0 - 2017-06-22\n\n* Feature: force IP resolution (ipv4 or ipv6) [#1608](https://github.com/guzzle/guzzle/pull/1608), [#1659](https://github.com/guzzle/guzzle/pull/1659)\n* Improvement: Don't include summary in exception message when body is empty [#1621](https://github.com/guzzle/guzzle/pull/1621)\n* Improvement: Handle `on_headers` option in MockHandler [#1580](https://github.com/guzzle/guzzle/pull/1580)\n* Improvement: Added SUSE Linux CA path [#1609](https://github.com/guzzle/guzzle/issues/1609)\n* Improvement: Use class reference for getting the name of the class instead of using hardcoded strings [#1641](https://github.com/guzzle/guzzle/pull/1641)\n* Feature: Added `read_timeout` option [#1611](https://github.com/guzzle/guzzle/pull/1611)\n* 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)\n* Deprecation: BadResponseException instantiation without a response [#1642](https://github.com/guzzle/guzzle/pull/1642)\n* Feature: Added NTLM auth [#1569](https://github.com/guzzle/guzzle/pull/1569)\n* Feature: Track redirect HTTP status codes [#1711](https://github.com/guzzle/guzzle/pull/1711)\n* Improvement: Check handler type during construction [#1745](https://github.com/guzzle/guzzle/pull/1745)\n* Improvement: Always include the Content-Length if there's a body [#1721](https://github.com/guzzle/guzzle/pull/1721)\n* Feature: Added convenience method to access a cookie by name [#1318](https://github.com/guzzle/guzzle/pull/1318)\n* Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684)\n* Improvement:  \tUse `\\GuzzleHttp\\Promise\\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827)\n\n\n+ Minor code cleanups, documentation fixes and clarifications.\n\n## 6.2.3 - 2017-02-28\n\n* Fix deprecations with guzzle/psr7 version 1.4\n\n## 6.2.2 - 2016-10-08\n\n* Allow to pass nullable Response to delay callable\n* Only add scheme when host is present\n* Fix drain case where content-length is the literal string zero\n* Obfuscate in-URL credentials in exceptions\n\n## 6.2.1 - 2016-07-18\n\n* Address HTTP_PROXY security vulnerability, CVE-2016-5385:\n  https://httpoxy.org/\n* Fixing timeout bug with StreamHandler:\n  https://github.com/guzzle/guzzle/pull/1488\n* Only read up to `Content-Length` in PHP StreamHandler to avoid timeouts when\n  a server does not honor `Connection: close`.\n* Ignore URI fragment when sending requests.\n\n## 6.2.0 - 2016-03-21\n\n* Feature: added `GuzzleHttp\\json_encode` and `GuzzleHttp\\json_decode`.\n  https://github.com/guzzle/guzzle/pull/1389\n* Bug fix: Fix sleep calculation when waiting for delayed requests.\n  https://github.com/guzzle/guzzle/pull/1324\n* Feature: More flexible history containers.\n  https://github.com/guzzle/guzzle/pull/1373\n* Bug fix: defer sink stream opening in StreamHandler.\n  https://github.com/guzzle/guzzle/pull/1377\n* Bug fix: do not attempt to escape cookie values.\n  https://github.com/guzzle/guzzle/pull/1406\n* Feature: report original content encoding and length on decoded responses.\n  https://github.com/guzzle/guzzle/pull/1409\n* Bug fix: rewind seekable request bodies before dispatching to cURL.\n  https://github.com/guzzle/guzzle/pull/1422\n* Bug fix: provide an empty string to `http_build_query` for HHVM workaround.\n  https://github.com/guzzle/guzzle/pull/1367\n\n## 6.1.1 - 2015-11-22\n\n* Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler\n  https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f63e4e4\n* Feature: HandlerStack is now more generic.\n  https://github.com/guzzle/guzzle/commit/f2102941331cda544745eedd97fc8fd46e1ee33e\n* Bug fix: setting verify to false in the StreamHandler now disables peer\n  verification. https://github.com/guzzle/guzzle/issues/1256\n* Feature: Middleware now uses an exception factory, including more error\n  context. https://github.com/guzzle/guzzle/pull/1282\n* Feature: better support for disabled functions.\n  https://github.com/guzzle/guzzle/pull/1287\n* Bug fix: fixed regression where MockHandler was not using `sink`.\n  https://github.com/guzzle/guzzle/pull/1292\n\n## 6.1.0 - 2015-09-08\n\n* Feature: Added the `on_stats` request option to provide access to transfer\n  statistics for requests. https://github.com/guzzle/guzzle/pull/1202\n* Feature: Added the ability to persist session cookies in CookieJars.\n  https://github.com/guzzle/guzzle/pull/1195\n* Feature: Some compatibility updates for Google APP Engine\n  https://github.com/guzzle/guzzle/pull/1216\n* Feature: Added support for NO_PROXY to prevent the use of a proxy based on\n  a simple set of rules. https://github.com/guzzle/guzzle/pull/1197\n* Feature: Cookies can now contain square brackets.\n  https://github.com/guzzle/guzzle/pull/1237\n* Bug fix: Now correctly parsing `=` inside of quotes in Cookies.\n  https://github.com/guzzle/guzzle/pull/1232\n* Bug fix: Cusotm cURL options now correctly override curl options of the\n  same name. https://github.com/guzzle/guzzle/pull/1221\n* Bug fix: Content-Type header is now added when using an explicitly provided\n  multipart body. https://github.com/guzzle/guzzle/pull/1218\n* Bug fix: Now ignoring Set-Cookie headers that have no name.\n* Bug fix: Reason phrase is no longer cast to an int in some cases in the\n  cURL handler. https://github.com/guzzle/guzzle/pull/1187\n* Bug fix: Remove the Authorization header when redirecting if the Host\n  header changes. https://github.com/guzzle/guzzle/pull/1207\n* Bug fix: Cookie path matching fixes\n  https://github.com/guzzle/guzzle/issues/1129\n* Bug fix: Fixing the cURL `body_as_string` setting\n  https://github.com/guzzle/guzzle/pull/1201\n* Bug fix: quotes are no longer stripped when parsing cookies.\n  https://github.com/guzzle/guzzle/issues/1172\n* Bug fix: `form_params` and `query` now always uses the `&` separator.\n  https://github.com/guzzle/guzzle/pull/1163\n* Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set.\n  https://github.com/guzzle/guzzle/pull/1189\n\n## 6.0.2 - 2015-07-04\n\n* Fixed a memory leak in the curl handlers in which references to callbacks\n  were not being removed by `curl_reset`.\n* Cookies are now extracted properly before redirects.\n* Cookies now allow more character ranges.\n* Decoded Content-Encoding responses are now modified to correctly reflect\n  their state if the encoding was automatically removed by a handler. This\n  means that the `Content-Encoding` header may be removed an the\n  `Content-Length` modified to reflect the message size after removing the\n  encoding.\n* Added a more explicit error message when trying to use `form_params` and\n  `multipart` in the same request.\n* Several fixes for HHVM support.\n* Functions are now conditionally required using an additional level of\n  indirection to help with global Composer installations.\n\n## 6.0.1 - 2015-05-27\n\n* Fixed a bug with serializing the `query` request option where the `&`\n  separator was missing.\n* Added a better error message for when `body` is provided as an array. Please\n  use `form_params` or `multipart` instead.\n* Various doc fixes.\n\n## 6.0.0 - 2015-05-26\n\n* See the UPGRADING.md document for more information.\n* Added `multipart` and `form_params` request options.\n* Added `synchronous` request option.\n* Added the `on_headers` request option.\n* Fixed `expect` handling.\n* No longer adding default middlewares in the client ctor. These need to be\n  present on the provided handler in order to work.\n* Requests are no longer initiated when sending async requests with the\n  CurlMultiHandler. This prevents unexpected recursion from requests completing\n  while ticking the cURL loop.\n* Removed the semantics of setting `default` to `true`. This is no longer\n  required now that the cURL loop is not ticked for async requests.\n* Added request and response logging middleware.\n* No longer allowing self signed certificates when using the StreamHandler.\n* Ensuring that `sink` is valid if saving to a file.\n* Request exceptions now include a \"handler context\" which provides handler\n  specific contextual information.\n* Added `GuzzleHttp\\RequestOptions` to allow request options to be applied\n  using constants.\n* `$maxHandles` has been removed from CurlMultiHandler.\n* `MultipartPostBody` is now part of the `guzzlehttp/psr7` package.\n\n## 5.3.0 - 2015-05-19\n\n* Mock now supports `save_to`\n* Marked `AbstractRequestEvent::getTransaction()` as public.\n* Fixed a bug in which multiple headers using different casing would overwrite\n  previous headers in the associative array.\n* Added `Utils::getDefaultHandler()`\n* Marked `GuzzleHttp\\Client::getDefaultUserAgent` as deprecated.\n* URL scheme is now always lowercased.\n\n## 6.0.0-beta.1\n\n* Requires PHP >= 5.5\n* Updated to use PSR-7\n  * Requires immutable messages, which basically means an event based system\n    owned by a request instance is no longer possible.\n  * Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7).\n  * Removed the dependency on `guzzlehttp/streams`. These stream abstractions\n    are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\\Psr7`\n    namespace.\n* Added middleware and handler system\n  * Replaced the Guzzle event and subscriber system with a middleware system.\n  * No longer depends on RingPHP, but rather places the HTTP handlers directly\n    in Guzzle, operating on PSR-7 messages.\n  * Retry logic is now encapsulated in `GuzzleHttp\\Middleware::retry`, which\n    means the `guzzlehttp/retry-subscriber` is now obsolete.\n  * Mocking responses is now handled using `GuzzleHttp\\Handler\\MockHandler`.\n* Asynchronous responses\n  * No longer supports the `future` request option to send an async request.\n    Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`,\n    `getAsync`, etc.).\n  * Utilizing `GuzzleHttp\\Promise` instead of React's promise library to avoid\n    recursion required by chaining and forwarding react promises. See\n    https://github.com/guzzle/promises\n  * Added `requestAsync` and `sendAsync` to send request asynchronously.\n  * Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests\n    asynchronously.\n* Request options\n  * POST and form updates\n    * Added the `form_fields` and `form_files` request options.\n    * Removed the `GuzzleHttp\\Post` namespace.\n    * The `body` request option no longer accepts an array for POST requests.\n  * The `exceptions` request option has been deprecated in favor of the\n    `http_errors` request options.\n  * The `save_to` request option has been deprecated in favor of `sink` request\n    option.\n* Clients no longer accept an array of URI template string and variables for\n  URI variables. You will need to expand URI templates before passing them\n  into a client constructor or request method.\n* Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are\n  now magic methods that will send synchronous requests.\n* Replaced `Utils.php` with plain functions in `functions.php`.\n* Removed `GuzzleHttp\\Collection`.\n* Removed `GuzzleHttp\\BatchResults`. Batched pool results are now returned as\n  an array.\n* Removed `GuzzleHttp\\Query`. Query string handling is now handled using an\n  associative array passed into the `query` request option. The query string\n  is serialized using PHP's `http_build_query`. If you need more control, you\n  can pass the query string in as a string.\n* `GuzzleHttp\\QueryParser` has been replaced with the\n  `GuzzleHttp\\Psr7\\parse_query`.\n\n## 5.2.0 - 2015-01-27\n\n* Added `AppliesHeadersInterface` to make applying headers to a request based\n  on the body more generic and not specific to `PostBodyInterface`.\n* Reduced the number of stack frames needed to send requests.\n* Nested futures are now resolved in the client rather than the RequestFsm\n* Finishing state transitions is now handled in the RequestFsm rather than the\n  RingBridge.\n* Added a guard in the Pool class to not use recursion for request retries.\n\n## 5.1.0 - 2014-12-19\n\n* Pool class no longer uses recursion when a request is intercepted.\n* The size of a Pool can now be dynamically adjusted using a callback.\n  See https://github.com/guzzle/guzzle/pull/943.\n* Setting a request option to `null` when creating a request with a client will\n  ensure that the option is not set. This allows you to overwrite default\n  request options on a per-request basis.\n  See https://github.com/guzzle/guzzle/pull/937.\n* Added the ability to limit which protocols are allowed for redirects by\n  specifying a `protocols` array in the `allow_redirects` request option.\n* Nested futures due to retries are now resolved when waiting for synchronous\n  responses. See https://github.com/guzzle/guzzle/pull/947.\n* `\"0\"` is now an allowed URI path. See\n  https://github.com/guzzle/guzzle/pull/935.\n* `Query` no longer typehints on the `$query` argument in the constructor,\n  allowing for strings and arrays.\n* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle\n  specific exceptions if necessary.\n\n## 5.0.3 - 2014-11-03\n\nThis change updates query strings so that they are treated as un-encoded values\nby default where the value represents an un-encoded value to send over the\nwire. A Query object then encodes the value before sending over the wire. This\nmeans that even value query string values (e.g., \":\") are url encoded. This\nmakes the Query class match PHP's http_build_query function. However, if you\nwant to send requests over the wire using valid query string characters that do\nnot need to be encoded, then you can provide a string to Url::setQuery() and\npass true as the second argument to specify that the query string is a raw\nstring that should not be parsed or encoded (unless a call to getQuery() is\nsubsequently made, forcing the query-string to be converted into a Query\nobject).\n\n## 5.0.2 - 2014-10-30\n\n* Added a trailing `\\r\\n` to multipart/form-data payloads. See\n  https://github.com/guzzle/guzzle/pull/871\n* Added a `GuzzleHttp\\Pool::send()` convenience method to match the docs.\n* Status codes are now returned as integers. See\n  https://github.com/guzzle/guzzle/issues/881\n* No longer overwriting an existing `application/x-www-form-urlencoded` header\n  when sending POST requests, allowing for customized headers. See\n  https://github.com/guzzle/guzzle/issues/877\n* Improved path URL serialization.\n\n  * No longer double percent-encoding characters in the path or query string if\n    they are already encoded.\n  * Now properly encoding the supplied path to a URL object, instead of only\n    encoding ' ' and '?'.\n  * Note: This has been changed in 5.0.3 to now encode query string values by\n    default unless the `rawString` argument is provided when setting the query\n    string on a URL: Now allowing many more characters to be present in the\n    query string without being percent encoded. See http://tools.ietf.org/html/rfc3986#appendix-A\n\n## 5.0.1 - 2014-10-16\n\nBugfix release.\n\n* Fixed an issue where connection errors still returned response object in\n  error and end events event though the response is unusable. This has been\n  corrected so that a response is not returned in the `getResponse` method of\n  these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867\n* Fixed an issue where transfer statistics were not being populated in the\n  RingBridge. https://github.com/guzzle/guzzle/issues/866\n\n## 5.0.0 - 2014-10-12\n\nAdding support for non-blocking responses and some minor API cleanup.\n\n### New Features\n\n* Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`.\n* Added a public API for creating a default HTTP adapter.\n* Updated the redirect plugin to be non-blocking so that redirects are sent\n  concurrently. Other plugins like this can now be updated to be non-blocking.\n* Added a \"progress\" event so that you can get upload and download progress\n  events.\n* Added `GuzzleHttp\\Pool` which implements FutureInterface and transfers\n  requests concurrently using a capped pool size as efficiently as possible.\n* Added `hasListeners()` to EmitterInterface.\n* Removed `GuzzleHttp\\ClientInterface::sendAll` and marked\n  `GuzzleHttp\\Client::sendAll` as deprecated (it's still there, just not the\n  recommended way).\n\n### Breaking changes\n\nThe breaking changes in this release are relatively minor. The biggest thing to\nlook out for is that request and response objects no longer implement fluent\ninterfaces.\n\n* Removed the fluent interfaces (i.e., `return $this`) from requests,\n  responses, `GuzzleHttp\\Collection`, `GuzzleHttp\\Url`,\n  `GuzzleHttp\\Query`, `GuzzleHttp\\Post\\PostBody`, and\n  `GuzzleHttp\\Cookie\\SetCookie`. This blog post provides a good outline of\n  why I did this: http://ocramius.github.io/blog/fluent-interfaces-are-evil/.\n  This also makes the Guzzle message interfaces compatible with the current\n  PSR-7 message proposal.\n* Removed \"functions.php\", so that Guzzle is truly PSR-4 compliant. Except\n  for the HTTP request functions from function.php, these functions are now\n  implemented in `GuzzleHttp\\Utils` using camelCase. `GuzzleHttp\\json_decode`\n  moved to `GuzzleHttp\\Utils::jsonDecode`. `GuzzleHttp\\get_path` moved to\n  `GuzzleHttp\\Utils::getPath`. `GuzzleHttp\\set_path` moved to\n  `GuzzleHttp\\Utils::setPath`. `GuzzleHttp\\batch` should now be\n  `GuzzleHttp\\Pool::batch`, which returns an `objectStorage`. Using functions.php\n  caused problems for many users: they aren't PSR-4 compliant, require an\n  explicit include, and needed an if-guard to ensure that the functions are not\n  declared multiple times.\n* Rewrote adapter layer.\n    * Removing all classes from `GuzzleHttp\\Adapter`, these are now\n      implemented as callables that are stored in `GuzzleHttp\\Ring\\Client`.\n    * Removed the concept of \"parallel adapters\". Sending requests serially or\n      concurrently is now handled using a single adapter.\n    * Moved `GuzzleHttp\\Adapter\\Transaction` to `GuzzleHttp\\Transaction`. The\n      Transaction object now exposes the request, response, and client as public\n      properties. The getters and setters have been removed.\n* Removed the \"headers\" event. This event was only useful for changing the\n  body a response once the headers of the response were known. You can implement\n  a similar behavior in a number of ways. One example might be to use a\n  FnStream that has access to the transaction being sent. For example, when the\n  first byte is written, you could check if the response headers match your\n  expectations, and if so, change the actual stream body that is being\n  written to.\n* Removed the `asArray` parameter from\n  `GuzzleHttp\\Message\\MessageInterface::getHeader`. If you want to get a header\n  value as an array, then use the newly added `getHeaderAsArray()` method of\n  `MessageInterface`. This change makes the Guzzle interfaces compatible with\n  the PSR-7 interfaces.\n* `GuzzleHttp\\Message\\MessageFactory` no longer allows subclasses to add\n  custom request options using double-dispatch (this was an implementation\n  detail). Instead, you should now provide an associative array to the\n  constructor which is a mapping of the request option name mapping to a\n  function that applies the option value to a request.\n* Removed the concept of \"throwImmediately\" from exceptions and error events.\n  This control mechanism was used to stop a transfer of concurrent requests\n  from completing. This can now be handled by throwing the exception or by\n  cancelling a pool of requests or each outstanding future request individually.\n* Updated to \"GuzzleHttp\\Streams\" 3.0.\n    * `GuzzleHttp\\Stream\\StreamInterface::getContents()` no longer accepts a\n      `maxLen` parameter. This update makes the Guzzle streams project\n      compatible with the current PSR-7 proposal.\n    * `GuzzleHttp\\Stream\\Stream::__construct`,\n      `GuzzleHttp\\Stream\\Stream::factory`, and\n      `GuzzleHttp\\Stream\\Utils::create` no longer accept a size in the second\n      argument. They now accept an associative array of options, including the\n      \"size\" key and \"metadata\" key which can be used to provide custom metadata.\n\n## 4.2.2 - 2014-09-08\n\n* Fixed a memory leak in the CurlAdapter when reusing cURL handles.\n* No longer using `request_fulluri` in stream adapter proxies.\n* Relative redirects are now based on the last response, not the first response.\n\n## 4.2.1 - 2014-08-19\n\n* Ensuring that the StreamAdapter does not always add a Content-Type header\n* Adding automated github releases with a phar and zip\n\n## 4.2.0 - 2014-08-17\n\n* Now merging in default options using a case-insensitive comparison.\n  Closes https://github.com/guzzle/guzzle/issues/767\n* Added the ability to automatically decode `Content-Encoding` response bodies\n  using the `decode_content` request option. This is set to `true` by default\n  to decode the response body if it comes over the wire with a\n  `Content-Encoding`. Set this value to `false` to disable decoding the\n  response content, and pass a string to provide a request `Accept-Encoding`\n  header and turn on automatic response decoding. This feature now allows you\n  to pass an `Accept-Encoding` header in the headers of a request but still\n  disable automatic response decoding.\n  Closes https://github.com/guzzle/guzzle/issues/764\n* Added the ability to throw an exception immediately when transferring\n  requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760\n* Updating guzzlehttp/streams dependency to ~2.1\n* No longer utilizing the now deprecated namespaced methods from the stream\n  package.\n\n## 4.1.8 - 2014-08-14\n\n* Fixed an issue in the CurlFactory that caused setting the `stream=false`\n  request option to throw an exception.\n  See: https://github.com/guzzle/guzzle/issues/769\n* TransactionIterator now calls rewind on the inner iterator.\n  See: https://github.com/guzzle/guzzle/pull/765\n* You can now set the `Content-Type` header to `multipart/form-data`\n  when creating POST requests to force multipart bodies.\n  See https://github.com/guzzle/guzzle/issues/768\n\n## 4.1.7 - 2014-08-07\n\n* Fixed an error in the HistoryPlugin that caused the same request and response\n  to be logged multiple times when an HTTP protocol error occurs.\n* Ensuring that cURL does not add a default Content-Type when no Content-Type\n  has been supplied by the user. This prevents the adapter layer from modifying\n  the request that is sent over the wire after any listeners may have already\n  put the request in a desired state (e.g., signed the request).\n* Throwing an exception when you attempt to send requests that have the\n  \"stream\" set to true in parallel using the MultiAdapter.\n* Only calling curl_multi_select when there are active cURL handles. This was\n  previously changed and caused performance problems on some systems due to PHP\n  always selecting until the maximum select timeout.\n* Fixed a bug where multipart/form-data POST fields were not correctly\n  aggregated (e.g., values with \"&\").\n\n## 4.1.6 - 2014-08-03\n\n* Added helper methods to make it easier to represent messages as strings,\n  including getting the start line and getting headers as a string.\n\n## 4.1.5 - 2014-08-02\n\n* Automatically retrying cURL \"Connection died, retrying a fresh connect\"\n  errors when possible.\n* cURL implementation cleanup\n* Allowing multiple event subscriber listeners to be registered per event by\n  passing an array of arrays of listener configuration.\n\n## 4.1.4 - 2014-07-22\n\n* Fixed a bug that caused multi-part POST requests with more than one field to\n  serialize incorrectly.\n* Paths can now be set to \"0\"\n* `ResponseInterface::xml` now accepts a `libxml_options` option and added a\n  missing default argument that was required when parsing XML response bodies.\n* A `save_to` stream is now created lazily, which means that files are not\n  created on disk unless a request succeeds.\n\n## 4.1.3 - 2014-07-15\n\n* Various fixes to multipart/form-data POST uploads\n* Wrapping function.php in an if-statement to ensure Guzzle can be used\n  globally and in a Composer install\n* Fixed an issue with generating and merging in events to an event array\n* POST headers are only applied before sending a request to allow you to change\n  the query aggregator used before uploading\n* Added much more robust query string parsing\n* Fixed various parsing and normalization issues with URLs\n* Fixing an issue where multi-valued headers were not being utilized correctly\n  in the StreamAdapter\n\n## 4.1.2 - 2014-06-18\n\n* Added support for sending payloads with GET requests\n\n## 4.1.1 - 2014-06-08\n\n* Fixed an issue related to using custom message factory options in subclasses\n* Fixed an issue with nested form fields in a multi-part POST\n* Fixed an issue with using the `json` request option for POST requests\n* Added `ToArrayInterface` to `GuzzleHttp\\Cookie\\CookieJar`\n\n## 4.1.0 - 2014-05-27\n\n* Added a `json` request option to easily serialize JSON payloads.\n* Added a `GuzzleHttp\\json_decode()` wrapper to safely parse JSON.\n* Added `setPort()` and `getPort()` to `GuzzleHttp\\Message\\RequestInterface`.\n* Added the ability to provide an emitter to a client in the client constructor.\n* Added the ability to persist a cookie session using $_SESSION.\n* Added a trait that can be used to add event listeners to an iterator.\n* Removed request method constants from RequestInterface.\n* Fixed warning when invalid request start-lines are received.\n* Updated MessageFactory to work with custom request option methods.\n* Updated cacert bundle to latest build.\n\n4.0.2 (2014-04-16)\n------------------\n\n* Proxy requests using the StreamAdapter now properly use request_fulluri (#632)\n* Added the ability to set scalars as POST fields (#628)\n\n## 4.0.1 - 2014-04-04\n\n* The HTTP status code of a response is now set as the exception code of\n  RequestException objects.\n* 303 redirects will now correctly switch from POST to GET requests.\n* The default parallel adapter of a client now correctly uses the MultiAdapter.\n* HasDataTrait now initializes the internal data array as an empty array so\n  that the toArray() method always returns an array.\n\n## 4.0.0 - 2014-03-29\n\n* For more information on the 4.0 transition, see:\n  http://mtdowling.com/blog/2014/03/15/guzzle-4-rc/\n* For information on changes and upgrading, see:\n  https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40\n* Added `GuzzleHttp\\batch()` as a convenience function for sending requests in\n  parallel without needing to write asynchronous code.\n* Restructured how events are added to `GuzzleHttp\\ClientInterface::sendAll()`.\n  You can now pass a callable or an array of associative arrays where each\n  associative array contains the \"fn\", \"priority\", and \"once\" keys.\n\n## 4.0.0.rc-2 - 2014-03-25\n\n* Removed `getConfig()` and `setConfig()` from clients to avoid confusion\n  around whether things like base_url, message_factory, etc. should be able to\n  be retrieved or modified.\n* Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface\n* functions.php functions were renamed using snake_case to match PHP idioms\n* Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and\n  `GUZZLE_CURL_SELECT_TIMEOUT` environment variables\n* Added the ability to specify custom `sendAll()` event priorities\n* Added the ability to specify custom stream context options to the stream\n  adapter.\n* Added a functions.php function for `get_path()` and `set_path()`\n* CurlAdapter and MultiAdapter now use a callable to generate curl resources\n* MockAdapter now properly reads a body and emits a `headers` event\n* Updated Url class to check if a scheme and host are set before adding \":\"\n  and \"//\". This allows empty Url (e.g., \"\") to be serialized as \"\".\n* Parsing invalid XML no longer emits warnings\n* Curl classes now properly throw AdapterExceptions\n* Various performance optimizations\n* Streams are created with the faster `Stream\\create()` function\n* Marked deprecation_proxy() as internal\n* Test server is now a collection of static methods on a class\n\n## 4.0.0-rc.1 - 2014-03-15\n\n* See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40\n\n## 3.8.1 - 2014-01-28\n\n* Bug: Always using GET requests when redirecting from a 303 response\n* Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in\n  `Guzzle\\Http\\ClientInterface::setSslVerification()`\n* Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL\n* Bug: The body of a request can now be set to `\"0\"`\n* Sending PHP stream requests no longer forces `HTTP/1.0`\n* Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of\n  each sub-exception\n* Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than\n  clobbering everything).\n* Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators)\n* Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`.\n  For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`.\n* Now properly escaping the regular expression delimiter when matching Cookie domains.\n* Network access is now disabled when loading XML documents\n\n## 3.8.0 - 2013-12-05\n\n* Added the ability to define a POST name for a file\n* JSON response parsing now properly walks additionalProperties\n* cURL error code 18 is now retried automatically in the BackoffPlugin\n* Fixed a cURL error when URLs contain fragments\n* Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were\n  CurlExceptions\n* CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e)\n* Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS`\n* Fixed a bug that was encountered when parsing empty header parameters\n* UriTemplate now has a `setRegex()` method to match the docs\n* The `debug` request parameter now checks if it is truthy rather than if it exists\n* Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin\n* Added the ability to combine URLs using strict RFC 3986 compliance\n* Command objects can now return the validation errors encountered by the command\n* Various fixes to cache revalidation (#437 and 29797e5)\n* Various fixes to the AsyncPlugin\n* Cleaned up build scripts\n\n## 3.7.4 - 2013-10-02\n\n* Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430)\n* Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp\n  (see https://github.com/aws/aws-sdk-php/issues/147)\n* Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots\n* Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420)\n* Updated the bundled cacert.pem (#419)\n* OauthPlugin now supports adding authentication to headers or query string (#425)\n\n## 3.7.3 - 2013-09-08\n\n* Added the ability to get the exception associated with a request/command when using `MultiTransferException` and\n  `CommandTransferException`.\n* Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description\n* Schemas are only injected into response models when explicitly configured.\n* No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of\n  an EntityBody.\n* Bug fix: ChunkedIterator can now properly chunk a \\Traversable as well as an \\Iterator.\n* Bug fix: FilterIterator now relies on `\\Iterator` instead of `\\Traversable`.\n* Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody()\n* Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin\n* Bug fix: Visiting XML attributes first before visiting XML children when serializing requests\n* Bug fix: Properly parsing headers that contain commas contained in quotes\n* Bug fix: mimetype guessing based on a filename is now case-insensitive\n\n## 3.7.2 - 2013-08-02\n\n* Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander\n  See https://github.com/guzzle/guzzle/issues/371\n* Bug fix: Cookie domains are now matched correctly according to RFC 6265\n  See https://github.com/guzzle/guzzle/issues/377\n* Bug fix: GET parameters are now used when calculating an OAuth signature\n* Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted\n* `Guzzle\\Common\\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched\n* `Guzzle\\Http\\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input.\n  See https://github.com/guzzle/guzzle/issues/379\n* Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See\n  https://github.com/guzzle/guzzle/pull/380\n* cURL multi cleanup and optimizations\n\n## 3.7.1 - 2013-07-05\n\n* Bug fix: Setting default options on a client now works\n* Bug fix: Setting options on HEAD requests now works. See #352\n* Bug fix: Moving stream factory before send event to before building the stream. See #353\n* Bug fix: Cookies no longer match on IP addresses per RFC 6265\n* Bug fix: Correctly parsing header parameters that are in `<>` and quotes\n* Added `cert` and `ssl_key` as request options\n* `Host` header can now diverge from the host part of a URL if the header is set manually\n* `Guzzle\\Service\\Command\\LocationVisitor\\Request\\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter\n* OAuth parameters are only added via the plugin if they aren't already set\n* Exceptions are now thrown when a URL cannot be parsed\n* Returning `false` if `Guzzle\\Http\\EntityBody::getContentMd5()` fails\n* Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin\n\n## 3.7.0 - 2013-06-10\n\n* See UPGRADING.md for more information on how to upgrade.\n* Requests now support the ability to specify an array of $options when creating a request to more easily modify a\n  request. You can pass a 'request.options' configuration setting to a client to apply default request options to\n  every request created by a client (e.g. default query string variables, headers, curl options, etc.).\n* Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\\Guzzle`.\n  See `Guzzle\\Http\\StaticClient::mount`.\n* Added `command.request_options` to `Guzzle\\Service\\Command\\AbstractCommand` to pass request options to requests\n      created by a command (e.g. custom headers, query string variables, timeout settings, etc.).\n* Stream size in `Guzzle\\Stream\\PhpStreamRequestFactory` will now be set if Content-Length is returned in the\n  headers of a response\n* Added `Guzzle\\Common\\Collection::setPath($path, $value)` to set a value into an array using a nested key\n  (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`)\n* ServiceBuilders now support storing and retrieving arbitrary data\n* CachePlugin can now purge all resources for a given URI\n* CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource\n* CachePlugin now uses the Vary header to determine if a resource is a cache hit\n* `Guzzle\\Http\\Message\\Response` now implements `\\Serializable`\n* Added `Guzzle\\Cache\\CacheAdapterFactory::fromCache()` to more easily create cache adapters\n* `Guzzle\\Service\\ClientInterface::execute()` now accepts an array, single command, or Traversable\n* Fixed a bug in `Guzzle\\Http\\Message\\Header\\Link::addLink()`\n* Better handling of calculating the size of a stream in `Guzzle\\Stream\\Stream` using fstat() and caching the size\n* `Guzzle\\Common\\Exception\\ExceptionCollection` now creates a more readable exception message\n* Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older\n  Symfony users can still use the old version of Monolog.\n* Fixing BC break: Added the implementation back in for `Guzzle\\Http\\Message\\AbstractMessage::getTokenizedHeader()`.\n  Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`.\n* Several performance improvements to `Guzzle\\Common\\Collection`\n* Added an `$options` argument to the end of the following methods of `Guzzle\\Http\\ClientInterface`:\n  createRequest, head, delete, put, patch, post, options, prepareRequest\n* Added an `$options` argument to the end of `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface::createRequest()`\n* Added an `applyOptions()` method to `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface`\n* Changed `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $body = null)` to\n  `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a\n  resource, string, or EntityBody into the $options parameter to specify the download location of the response.\n* Changed `Guzzle\\Common\\Collection::__construct($data)` to no longer accepts a null value for `$data` but a\n  default `array()`\n* Added `Guzzle\\Stream\\StreamInterface::isRepeatable`\n* Removed `Guzzle\\Http\\ClientInterface::setDefaultHeaders(). Use\n  $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or\n  $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`.\n* Removed `Guzzle\\Http\\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`.\n* Removed `Guzzle\\Http\\ClientInterface::expandTemplate()`\n* Removed `Guzzle\\Http\\ClientInterface::setRequestFactory()`\n* Removed `Guzzle\\Http\\ClientInterface::getCurlMulti()`\n* Removed `Guzzle\\Http\\Message\\RequestInterface::canCache`\n* Removed `Guzzle\\Http\\Message\\RequestInterface::setIsRedirect`\n* Removed `Guzzle\\Http\\Message\\RequestInterface::isRedirect`\n* Made `Guzzle\\Http\\Client::expandTemplate` and `getUriTemplate` protected methods.\n* You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting\n  `Guzzle\\Common\\Version::$emitWarnings` to true.\n* Marked `Guzzle\\Http\\Message\\Request::isResponseBodyRepeatable()` as deprecated. Use\n      `$request->getResponseBody()->isRepeatable()` instead.\n* Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use\n  `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n* Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use\n  `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n* Marked `Guzzle\\Http\\Message\\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.\n* Marked `Guzzle\\Http\\Message\\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.\n* Marked `Guzzle\\Cache\\CacheAdapterFactory::factory()` as deprecated\n* Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand.\n  These will work through Guzzle 4.0\n* Marked 'request.params' for `Guzzle\\Http\\Client` as deprecated. Use [request.options][params].\n* Marked `Guzzle\\Service\\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\\Service\\Client.\n* Marked `Guzzle\\Service\\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`.\n* Marked `Guzzle\\Service\\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`.\n* Marked `Guzzle\\Parser\\Url\\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.\n* Marked `Guzzle\\Common\\Collection::inject()` as deprecated.\n* Marked `Guzzle\\Plugin\\CurlAuth\\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');`\n* CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a\n  CacheStorageInterface. These two objects and interface will be removed in a future version.\n* Always setting X-cache headers on cached responses\n* Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin\n* `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface\n  $request, Response $response);`\n* `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`\n* `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`\n* Added `CacheStorageInterface::purge($url)`\n* `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin\n  $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,\n  CanCacheStrategyInterface $canCache = null)`\n* Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`\n\n## 3.6.0 - 2013-05-29\n\n* ServiceDescription now implements ToArrayInterface\n* Added command.hidden_params to blacklist certain headers from being treated as additionalParameters\n* Guzzle can now correctly parse incomplete URLs\n* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.\n* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution\n* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().\n* Specific header implementations can be created for complex headers. When a message creates a header, it uses a\n  HeaderFactory which can map specific headers to specific header classes. There is now a Link header and\n  CacheControl header implementation.\n* Removed from interface: Guzzle\\Http\\ClientInterface::setUriTemplate\n* Removed from interface: Guzzle\\Http\\ClientInterface::setCurlMulti()\n* Removed Guzzle\\Http\\Message\\Request::receivedRequestHeader() and implemented this functionality in\n  Guzzle\\Http\\Curl\\RequestMediator\n* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.\n* Removed the optional $tryChunkedTransfer option from Guzzle\\Http\\Message\\EntityEnclosingRequestInterface\n* Removed the $asObjects argument from Guzzle\\Http\\Message\\MessageInterface::getHeaders()\n* Removed Guzzle\\Parser\\ParserRegister::get(). Use getParser()\n* Removed Guzzle\\Parser\\ParserRegister::set(). Use registerParser().\n* All response header helper functions return a string rather than mixing Header objects and strings inconsistently\n* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle\n  directly via interfaces\n* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist\n  but are a no-op until removed.\n* Most classes that used to require a `Guzzle\\Service\\Command\\CommandInterface` typehint now request a\n  `Guzzle\\Service\\Command\\ArrayCommandInterface`.\n* Added `Guzzle\\Http\\Message\\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response\n  on a request while the request is still being transferred\n* The ability to case-insensitively search for header values\n* Guzzle\\Http\\Message\\Header::hasExactHeader\n* Guzzle\\Http\\Message\\Header::raw. Use getAll()\n* Deprecated cache control specific methods on Guzzle\\Http\\Message\\AbstractMessage. Use the CacheControl header object\n  instead.\n* `Guzzle\\Service\\Command\\CommandInterface` now extends from ToArrayInterface and ArrayAccess\n* Added the ability to cast Model objects to a string to view debug information.\n\n## 3.5.0 - 2013-05-13\n\n* Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times\n* Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove\n  itself from the EventDispatcher)\n* Bug: `Guzzle\\Log\\MessageFormatter` now properly writes \"total_time\" and \"connect_time\" values\n* Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too\n* Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a\n  non-existent key\n* Bug: All __call() method arguments are now required (helps with mocking frameworks)\n* Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference\n  to help with refcount based garbage collection of resources created by sending a request\n* Deprecating ZF1 cache and log adapters. These will be removed in the next major version.\n* Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the\n  HistoryPlugin for a history.\n* Added a `responseBody` alias for the `response_body` location\n* Refactored internals to no longer rely on Response::getRequest()\n* HistoryPlugin can now be cast to a string\n* HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests\n  and responses that are sent over the wire\n* Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects\n\n## 3.4.3 - 2013-04-30\n\n* Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response\n* Added a check to re-extract the temp cacert bundle from the phar before sending each request\n\n## 3.4.2 - 2013-04-29\n\n* Bug fix: Stream objects now work correctly with \"a\" and \"a+\" modes\n* Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present\n* Bug fix: AsyncPlugin no longer forces HEAD requests\n* Bug fix: DateTime timezones are now properly handled when using the service description schema formatter\n* Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails\n* Setting a response on a request will write to the custom request body from the response body if one is specified\n* LogPlugin now writes to php://output when STDERR is undefined\n* Added the ability to set multiple POST files for the same key in a single call\n* application/x-www-form-urlencoded POSTs now use the utf-8 charset by default\n* Added the ability to queue CurlExceptions to the MockPlugin\n* Cleaned up how manual responses are queued on requests (removed \"queued_response\" and now using request.before_send)\n* Configuration loading now allows remote files\n\n## 3.4.1 - 2013-04-16\n\n* Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti\n  handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost.\n* Exceptions are now properly grouped when sending requests in parallel\n* Redirects are now properly aggregated when a multi transaction fails\n* Redirects now set the response on the original object even in the event of a failure\n* Bug fix: Model names are now properly set even when using $refs\n* Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax\n* Added support for oauth_callback in OAuth signatures\n* Added support for oauth_verifier in OAuth signatures\n* Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection\n\n## 3.4.0 - 2013-04-11\n\n* Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289\n* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289\n* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263\n* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264.\n* Bug fix: Added `number` type to service descriptions.\n* Bug fix: empty parameters are removed from an OAuth signature\n* Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header\n* Bug fix: Fixed \"array to string\" error when validating a union of types in a service description\n* Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream\n* Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin.\n* Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs.\n* The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections.\n* Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if\n  the Content-Type can be determined based on the entity body or the path of the request.\n* Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder.\n* Added support for a PSR-3 LogAdapter.\n* Added a `command.after_prepare` event\n* Added `oauth_callback` parameter to the OauthPlugin\n* Added the ability to create a custom stream class when using a stream factory\n* Added a CachingEntityBody decorator\n* Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized.\n* The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar.\n* You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies\n* POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This\n  means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use\n  POST fields or files (the latter is only used when emulating a form POST in the browser).\n* Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest\n\n## 3.3.1 - 2013-03-10\n\n* Added the ability to create PHP streaming responses from HTTP requests\n* Bug fix: Running any filters when parsing response headers with service descriptions\n* Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing\n* Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across\n  response location visitors.\n* Bug fix: Removed the possibility of creating configuration files with circular dependencies\n* RequestFactory::create() now uses the key of a POST file when setting the POST file name\n* Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set\n\n## 3.3.0 - 2013-03-03\n\n* A large number of performance optimizations have been made\n* Bug fix: Added 'wb' as a valid write mode for streams\n* Bug fix: `Guzzle\\Http\\Message\\Response::json()` now allows scalar values to be returned\n* Bug fix: Fixed bug in `Guzzle\\Http\\Message\\Response` where wrapping quotes were stripped from `getEtag()`\n* BC: Removed `Guzzle\\Http\\Utils` class\n* BC: Setting a service description on a client will no longer modify the client's command factories.\n* BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using\n  the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'\n* BC: `Guzzle\\Stream\\Stream::getWrapper()` and `Guzzle\\Stream\\Stream::getSteamType()` are no longer converted to\n  lowercase\n* Operation parameter objects are now lazy loaded internally\n* Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses\n* Added support for instantiating responseType=class responseClass classes. Classes must implement\n  `Guzzle\\Service\\Command\\ResponseClassInterface`\n* Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These\n  additional properties also support locations and can be used to parse JSON responses where the outermost part of the\n  JSON is an array\n* Added support for nested renaming of JSON models (rename sentAs to name)\n* CachePlugin\n    * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error\n    * Debug headers can now added to cached response in the CachePlugin\n\n## 3.2.0 - 2013-02-14\n\n* CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients.\n* URLs with no path no longer contain a \"/\" by default\n* Guzzle\\Http\\QueryString does no longer manages the leading \"?\". This is now handled in Guzzle\\Http\\Url.\n* BadResponseException no longer includes the full request and response message\n* Adding setData() to Guzzle\\Service\\Description\\ServiceDescriptionInterface\n* Adding getResponseBody() to Guzzle\\Http\\Message\\RequestInterface\n* Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription\n* Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list\n* xmlEncoding can now be customized for the XML declaration of a XML service description operation\n* Guzzle\\Http\\QueryString now uses Guzzle\\Http\\QueryAggregator\\QueryAggregatorInterface objects to add custom value\n  aggregation and no longer uses callbacks\n* The URL encoding implementation of Guzzle\\Http\\QueryString can now be customized\n* Bug fix: Filters were not always invoked for array service description parameters\n* Bug fix: Redirects now use a target response body rather than a temporary response body\n* Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded\n* Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives\n\n## 3.1.2 - 2013-01-27\n\n* Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the\n  response body. For example, the XmlVisitor now parses the XML response into an array in the before() method.\n* Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent\n* CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444)\n* Fixed a bug where redirect responses were not chained correctly using getPreviousResponse()\n* Setting default headers on a client after setting the user-agent will not erase the user-agent setting\n\n## 3.1.1 - 2013-01-20\n\n* Adding wildcard support to Guzzle\\Common\\Collection::getPath()\n* Adding alias support to ServiceBuilder configs\n* Adding Guzzle\\Service\\Resource\\CompositeResourceIteratorFactory and cleaning up factory interface\n\n## 3.1.0 - 2013-01-12\n\n* BC: CurlException now extends from RequestException rather than BadResponseException\n* BC: Renamed Guzzle\\Plugin\\Cache\\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse()\n* Added getData to ServiceDescriptionInterface\n* Added context array to RequestInterface::setState()\n* Bug: Removing hard dependency on the BackoffPlugin from Guzzle\\Http\n* Bug: Adding required content-type when JSON request visitor adds JSON to a command\n* Bug: Fixing the serialization of a service description with custom data\n* Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing\n  an array of successful and failed responses\n* Moved getPath from Guzzle\\Service\\Resource\\Model to Guzzle\\Common\\Collection\n* Added Guzzle\\Http\\IoEmittingEntityBody\n* Moved command filtration from validators to location visitors\n* Added `extends` attributes to service description parameters\n* Added getModels to ServiceDescriptionInterface\n\n## 3.0.7 - 2012-12-19\n\n* Fixing phar detection when forcing a cacert to system if null or true\n* Allowing filename to be passed to `Guzzle\\Http\\Message\\Request::setResponseBody()`\n* Cleaning up `Guzzle\\Common\\Collection::inject` method\n* Adding a response_body location to service descriptions\n\n## 3.0.6 - 2012-12-09\n\n* CurlMulti performance improvements\n* Adding setErrorResponses() to Operation\n* composer.json tweaks\n\n## 3.0.5 - 2012-11-18\n\n* Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin\n* Bug: Response body can now be a string containing \"0\"\n* Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert\n* Bug: QueryString::fromString now properly parses query string parameters that contain equal signs\n* Added support for XML attributes in service description responses\n* DefaultRequestSerializer now supports array URI parameter values for URI template expansion\n* Added better mimetype guessing to requests and post files\n\n## 3.0.4 - 2012-11-11\n\n* Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value\n* Bug: Cookies can now be added that have a name, domain, or value set to \"0\"\n* Bug: Using the system cacert bundle when using the Phar\n* Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures\n* Enhanced cookie jar de-duplication\n* Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added\n* Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies\n* Added the ability to create any sort of hash for a stream rather than just an MD5 hash\n\n## 3.0.3 - 2012-11-04\n\n* Implementing redirects in PHP rather than cURL\n* Added PECL URI template extension and using as default parser if available\n* Bug: Fixed Content-Length parsing of Response factory\n* Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams.\n* Adding ToArrayInterface throughout library\n* Fixing OauthPlugin to create unique nonce values per request\n\n## 3.0.2 - 2012-10-25\n\n* Magic methods are enabled by default on clients\n* Magic methods return the result of a command\n* Service clients no longer require a base_url option in the factory\n* Bug: Fixed an issue with URI templates where null template variables were being expanded\n\n## 3.0.1 - 2012-10-22\n\n* Models can now be used like regular collection objects by calling filter, map, etc.\n* Models no longer require a Parameter structure or initial data in the constructor\n* Added a custom AppendIterator to get around a PHP bug with the `\\AppendIterator`\n\n## 3.0.0 - 2012-10-15\n\n* Rewrote service description format to be based on Swagger\n    * Now based on JSON schema\n    * Added nested input structures and nested response models\n    * Support for JSON and XML input and output models\n    * Renamed `commands` to `operations`\n    * Removed dot class notation\n    * Removed custom types\n* Broke the project into smaller top-level namespaces to be more component friendly\n* Removed support for XML configs and descriptions. Use arrays or JSON files.\n* Removed the Validation component and Inspector\n* Moved all cookie code to Guzzle\\Plugin\\Cookie\n* Magic methods on a Guzzle\\Service\\Client now return the command un-executed.\n* Calling getResult() or getResponse() on a command will lazily execute the command if needed.\n* Now shipping with cURL's CA certs and using it by default\n* Added previousResponse() method to response objects\n* No longer sending Accept and Accept-Encoding headers on every request\n* Only sending an Expect header by default when a payload is greater than 1MB\n* Added/moved client options:\n    * curl.blacklist to curl.option.blacklist\n    * Added ssl.certificate_authority\n* Added a Guzzle\\Iterator component\n* Moved plugins from Guzzle\\Http\\Plugin to Guzzle\\Plugin\n* Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin)\n* Added a more robust caching plugin\n* Added setBody to response objects\n* Updating LogPlugin to use a more flexible MessageFormatter\n* Added a completely revamped build process\n* Cleaning up Collection class and removing default values from the get method\n* Fixed ZF2 cache adapters\n\n## 2.8.8 - 2012-10-15\n\n* Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did\n\n## 2.8.7 - 2012-09-30\n\n* Bug: Fixed config file aliases for JSON includes\n* Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests\n* Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload\n* Bug: Hardening request and response parsing to account for missing parts\n* Bug: Fixed PEAR packaging\n* Bug: Fixed Request::getInfo\n* Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail\n* Adding the ability for the namespace Iterator factory to look in multiple directories\n* Added more getters/setters/removers from service descriptions\n* Added the ability to remove POST fields from OAuth signatures\n* OAuth plugin now supports 2-legged OAuth\n\n## 2.8.6 - 2012-09-05\n\n* Added the ability to modify and build service descriptions\n* Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command\n* Added a `json` parameter location\n* Now allowing dot notation for classes in the CacheAdapterFactory\n* Using the union of two arrays rather than an array_merge when extending service builder services and service params\n* Ensuring that a service is a string before doing strpos() checks on it when substituting services for references\n  in service builder config files.\n* Services defined in two different config files that include one another will by default replace the previously\n  defined service, but you can now create services that extend themselves and merge their settings over the previous\n* The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like\n  '_default' with a default JSON configuration file.\n\n## 2.8.5 - 2012-08-29\n\n* Bug: Suppressed empty arrays from URI templates\n* Bug: Added the missing $options argument from ServiceDescription::factory to enable caching\n* Added support for HTTP responses that do not contain a reason phrase in the start-line\n* AbstractCommand commands are now invokable\n* Added a way to get the data used when signing an Oauth request before a request is sent\n\n## 2.8.4 - 2012-08-15\n\n* Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin\n* 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.\n* Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\\Common\\Stream\n* Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream\n* Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5())\n* Added additional response status codes\n* Removed SSL information from the default User-Agent header\n* DELETE requests can now send an entity body\n* Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries\n* Added the ability of the MockPlugin to consume mocked request bodies\n* LogPlugin now exposes request and response objects in the extras array\n\n## 2.8.3 - 2012-07-30\n\n* Bug: Fixed a case where empty POST requests were sent as GET requests\n* Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body\n* Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new\n* Added multiple inheritance to service description commands\n* Added an ApiCommandInterface and added `getParamNames()` and `hasParam()`\n* Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything\n* Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles\n\n## 2.8.2 - 2012-07-24\n\n* Bug: Query string values set to 0 are no longer dropped from the query string\n* Bug: A Collection object is no longer created each time a call is made to `Guzzle\\Service\\Command\\AbstractCommand::getRequestHeaders()`\n* Bug: `+` is now treated as an encoded space when parsing query strings\n* QueryString and Collection performance improvements\n* Allowing dot notation for class paths in filters attribute of a service descriptions\n\n## 2.8.1 - 2012-07-16\n\n* Loosening Event Dispatcher dependency\n* POST redirects can now be customized using CURLOPT_POSTREDIR\n\n## 2.8.0 - 2012-07-15\n\n* BC: Guzzle\\Http\\Query\n    * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl)\n    * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding()\n    * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool)\n    * Changed the aggregation functions of QueryString to be static methods\n    * Can now use fromString() with querystrings that have a leading ?\n* cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters\n* Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body\n* Cookies are no longer URL decoded by default\n* Bug: URI template variables set to null are no longer expanded\n\n## 2.7.2 - 2012-07-02\n\n* BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\\Http\\Parser to Guzzle\\Parser.\n* BC: Removing Guzzle\\Common\\Batch\\Batch::count() and replacing it with isEmpty()\n* CachePlugin now allows for a custom request parameter function to check if a request can be cached\n* Bug fix: CachePlugin now only caches GET and HEAD requests by default\n* Bug fix: Using header glue when transferring headers over the wire\n* Allowing deeply nested arrays for composite variables in URI templates\n* Batch divisors can now return iterators or arrays\n\n## 2.7.1 - 2012-06-26\n\n* Minor patch to update version number in UA string\n* Updating build process\n\n## 2.7.0 - 2012-06-25\n\n* BC: Inflection classes moved to Guzzle\\Inflection. No longer static methods. Can now inject custom inflectors into classes.\n* BC: Removed magic setX methods from commands\n* BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method\n* Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable.\n* Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity)\n* Guzzle\\Service\\Resource\\ResourceIteratorApplyBatched now internally uses the Guzzle\\Common\\Batch namespace\n* Added Guzzle\\Service\\Plugin namespace and a PluginCollectionPlugin\n* Added the ability to set POST fields and files in a service description\n* Guzzle\\Http\\EntityBody::factory() now accepts objects with a __toString() method\n* Adding a command.before_prepare event to clients\n* Added BatchClosureTransfer and BatchClosureDivisor\n* BatchTransferException now includes references to the batch divisor and transfer strategies\n* Fixed some tests so that they pass more reliably\n* Added Guzzle\\Common\\Log\\ArrayLogAdapter\n\n## 2.6.6 - 2012-06-10\n\n* BC: Removing Guzzle\\Http\\Plugin\\BatchQueuePlugin\n* BC: Removing Guzzle\\Service\\Command\\CommandSet\n* Adding generic batching system (replaces the batch queue plugin and command set)\n* Updating ZF cache and log adapters and now using ZF's composer repository\n* Bug: Setting the name of each ApiParam when creating through an ApiCommand\n* Adding result_type, result_doc, deprecated, and doc_url to service descriptions\n* Bug: Changed the default cookie header casing back to 'Cookie'\n\n## 2.6.5 - 2012-06-03\n\n* BC: Renaming Guzzle\\Http\\Message\\RequestInterface::getResourceUri() to getResource()\n* BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from\n* BC: Guzzle\\Http\\Cookie is now used to manage Set-Cookie data, not Cookie data\n* BC: Renaming methods in the CookieJarInterface\n* Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations\n* Making the default glue for HTTP headers ';' instead of ','\n* Adding a removeValue to Guzzle\\Http\\Message\\Header\n* Adding getCookies() to request interface.\n* Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber()\n\n## 2.6.4 - 2012-05-30\n\n* BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class.\n* BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand\n* Bug: Fixing magic method command calls on clients\n* Bug: Email constraint only validates strings\n* Bug: Aggregate POST fields when POST files are present in curl handle\n* Bug: Fixing default User-Agent header\n* Bug: Only appending or prepending parameters in commands if they are specified\n* Bug: Not requiring response reason phrases or status codes to match a predefined list of codes\n* Allowing the use of dot notation for class namespaces when using instance_of constraint\n* Added any_match validation constraint\n* Added an AsyncPlugin\n* Passing request object to the calculateWait method of the ExponentialBackoffPlugin\n* Allowing the result of a command object to be changed\n* Parsing location and type sub values when instantiating a service description rather than over and over at runtime\n\n## 2.6.3 - 2012-05-23\n\n* [BC] Guzzle\\Common\\FromConfigInterface no longer requires any config options.\n* [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields.\n* You can now use an array of data when creating PUT request bodies in the request factory.\n* Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable.\n* [Http] Adding support for Content-Type in multipart POST uploads per upload\n* [Http] Added support for uploading multiple files using the same name (foo[0], foo[1])\n* Adding more POST data operations for easier manipulation of POST data.\n* You can now set empty POST fields.\n* The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files.\n* Split the Guzzle\\Service\\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate.\n* CS updates\n\n## 2.6.2 - 2012-05-19\n\n* [Http] Better handling of nested scope requests in CurlMulti.  Requests are now always prepares in the send() method rather than the addRequest() method.\n\n## 2.6.1 - 2012-05-19\n\n* [BC] Removing 'path' support in service descriptions.  Use 'uri'.\n* [BC] Guzzle\\Service\\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache.\n* [BC] Removing Guzzle\\Common\\NullObject.  Use https://github.com/mtdowling/NullObject if you need it.\n* [BC] Removing Guzzle\\Common\\XmlElement.\n* All commands, both dynamic and concrete, have ApiCommand objects.\n* Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits.\n* Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored.\n* Making the method signature of Guzzle\\Service\\Builder\\ServiceBuilder::factory more flexible.\n\n## 2.6.0 - 2012-05-15\n\n* [BC] Moving Guzzle\\Service\\Builder to Guzzle\\Service\\Builder\\ServiceBuilder\n* [BC] Executing a Command returns the result of the command rather than the command\n* [BC] Moving all HTTP parsing logic to Guzzle\\Http\\Parsers. Allows for faster C implementations if needed.\n* [BC] Changing the Guzzle\\Http\\Message\\Response::setProtocol() method to accept a protocol and version in separate args.\n* [BC] Moving ResourceIterator* to Guzzle\\Service\\Resource\n* [BC] Completely refactored ResourceIterators to iterate over a cloned command object\n* [BC] Moved Guzzle\\Http\\UriTemplate to Guzzle\\Http\\Parser\\UriTemplate\\UriTemplate\n* [BC] Guzzle\\Guzzle is now deprecated\n* Moving Guzzle\\Common\\Guzzle::inject to Guzzle\\Common\\Collection::inject\n* Adding Guzzle\\Version class to give version information about Guzzle\n* Adding Guzzle\\Http\\Utils class to provide getDefaultUserAgent() and getHttpDate()\n* Adding Guzzle\\Curl\\CurlVersion to manage caching curl_version() data\n* ServiceDescription and ServiceBuilder are now cacheable using similar configs\n* Changing the format of XML and JSON service builder configs.  Backwards compatible.\n* Cleaned up Cookie parsing\n* Trimming the default Guzzle User-Agent header\n* Adding a setOnComplete() method to Commands that is called when a command completes\n* Keeping track of requests that were mocked in the MockPlugin\n* Fixed a caching bug in the CacheAdapterFactory\n* Inspector objects can be injected into a Command object\n* Refactoring a lot of code and tests to be case insensitive when dealing with headers\n* Adding Guzzle\\Http\\Message\\HeaderComparison for easy comparison of HTTP headers using a DSL\n* Adding the ability to set global option overrides to service builder configs\n* Adding the ability to include other service builder config files from within XML and JSON files\n* Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method.\n\n## 2.5.0 - 2012-05-08\n\n* Major performance improvements\n* [BC] Simplifying Guzzle\\Common\\Collection.  Please check to see if you are using features that are now deprecated.\n* [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component.\n* [BC] No longer supporting \"{{ }}\" for injecting into command or UriTemplates.  Use \"{}\"\n* Added the ability to passed parameters to all requests created by a client\n* Added callback functionality to the ExponentialBackoffPlugin\n* Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies.\n* Rewinding request stream bodies when retrying requests\n* Exception is thrown when JSON response body cannot be decoded\n* Added configurable magic method calls to clients and commands.  This is off by default.\n* Fixed a defect that added a hash to every parsed URL part\n* Fixed duplicate none generation for OauthPlugin.\n* Emitting an event each time a client is generated by a ServiceBuilder\n* Using an ApiParams object instead of a Collection for parameters of an ApiCommand\n* cache.* request parameters should be renamed to params.cache.*\n* Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle.\n* Added the ability to disable type validation of service descriptions\n* ServiceDescriptions and ServiceBuilders are now Serializable\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/LICENSE",
    "content": "Copyright (c) 2011-2016 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/README.md",
    "content": "Guzzle, PHP HTTP client\n=======================\n\n[![Build Status](https://travis-ci.org/guzzle/guzzle.svg?branch=master)](https://travis-ci.org/guzzle/guzzle)\n\nGuzzle is a PHP HTTP client that makes it easy to send HTTP requests and\ntrivial to integrate with web services.\n\n- Simple interface for building query strings, POST requests, streaming large\n  uploads, streaming large downloads, using HTTP cookies, uploading JSON data,\n  etc...\n- Can send both synchronous and asynchronous requests using the same interface.\n- Uses PSR-7 interfaces for requests, responses, and streams. This allows you\n  to utilize other PSR-7 compatible libraries with Guzzle.\n- Abstracts away the underlying HTTP transport, allowing you to write\n  environment and transport agnostic code; i.e., no hard dependency on cURL,\n  PHP streams, sockets, or non-blocking event loops.\n- Middleware system allows you to augment and compose client behavior.\n\n```php\n$client = new \\GuzzleHttp\\Client();\n$res = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');\necho $res->getStatusCode();\n// 200\necho $res->getHeaderLine('content-type');\n// 'application/json; charset=utf8'\necho $res->getBody();\n// '{\"id\": 1420053, \"name\": \"guzzle\", ...}'\n\n// Send an asynchronous request.\n$request = new \\GuzzleHttp\\Psr7\\Request('GET', 'http://httpbin.org');\n$promise = $client->sendAsync($request)->then(function ($response) {\n    echo 'I completed! ' . $response->getBody();\n});\n$promise->wait();\n```\n\n## Help and docs\n\n- [Documentation](http://guzzlephp.org/)\n- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle)\n- [Gitter](https://gitter.im/guzzle/guzzle)\n\n\n## Installing Guzzle\n\nThe recommended way to install Guzzle is through\n[Composer](http://getcomposer.org).\n\n```bash\n# Install Composer\ncurl -sS https://getcomposer.org/installer | php\n```\n\nNext, run the Composer command to install the latest stable version of Guzzle:\n\n```bash\nphp composer.phar require guzzlehttp/guzzle\n```\n\nAfter installing, you need to require Composer's autoloader:\n\n```php\nrequire 'vendor/autoload.php';\n```\n\nYou can then later update Guzzle using composer:\n\n ```bash\ncomposer.phar update\n ```\n\n\n## Version Guidance\n\n| Version | Status     | Packagist           | Namespace    | Repo                | Docs                | PSR-7 | PHP Version |\n|---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------|\n| 3.x     | EOL        | `guzzle/guzzle`     | `Guzzle`     | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No    | >= 5.3.3    |\n| 4.x     | EOL        | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A                 | No    | >= 5.4      |\n| 5.x     | Maintained | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No    | >= 5.4      |\n| 6.x     | Latest     | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes   | >= 5.5      |\n\n[guzzle-3-repo]: https://github.com/guzzle/guzzle3\n[guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x\n[guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3\n[guzzle-6-repo]: https://github.com/guzzle/guzzle\n[guzzle-3-docs]: http://guzzle3.readthedocs.org/en/latest/\n[guzzle-5-docs]: http://guzzle.readthedocs.org/en/5.3/\n[guzzle-6-docs]: http://guzzle.readthedocs.org/en/latest/\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/UPGRADING.md",
    "content": "Guzzle Upgrade Guide\n====================\n\n5.0 to 6.0\n----------\n\nGuzzle now uses [PSR-7](http://www.php-fig.org/psr/psr-7/) for HTTP messages.\nDue to the fact that these messages are immutable, this prompted a refactoring\nof Guzzle to use a middleware based system rather than an event system. Any\nHTTP message interaction (e.g., `GuzzleHttp\\Message\\Request`) need to be\nupdated to work with the new immutable PSR-7 request and response objects. Any\nevent listeners or subscribers need to be updated to become middleware\nfunctions that wrap handlers (or are injected into a\n`GuzzleHttp\\HandlerStack`).\n\n- Removed `GuzzleHttp\\BatchResults`\n- Removed `GuzzleHttp\\Collection`\n- Removed `GuzzleHttp\\HasDataTrait`\n- Removed `GuzzleHttp\\ToArrayInterface`\n- The `guzzlehttp/streams` dependency has been removed. Stream functionality\n  is now present in the `GuzzleHttp\\Psr7` namespace provided by the\n  `guzzlehttp/psr7` package.\n- Guzzle no longer uses ReactPHP promises and now uses the\n  `guzzlehttp/promises` library. We use a custom promise library for three\n  significant reasons:\n  1. React promises (at the time of writing this) are recursive. Promise\n     chaining and promise resolution will eventually blow the stack. Guzzle\n     promises are not recursive as they use a sort of trampolining technique.\n     Note: there has been movement in the React project to modify promises to\n     no longer utilize recursion.\n  2. Guzzle needs to have the ability to synchronously block on a promise to\n     wait for a result. Guzzle promises allows this functionality (and does\n     not require the use of recursion).\n  3. Because we need to be able to wait on a result, doing so using React\n     promises requires wrapping react promises with RingPHP futures. This\n     overhead is no longer needed, reducing stack sizes, reducing complexity,\n     and improving performance.\n- `GuzzleHttp\\Mimetypes` has been moved to a function in\n  `GuzzleHttp\\Psr7\\mimetype_from_extension` and\n  `GuzzleHttp\\Psr7\\mimetype_from_filename`.\n- `GuzzleHttp\\Query` and `GuzzleHttp\\QueryParser` have been removed. Query\n  strings must now be passed into request objects as strings, or provided to\n  the `query` request option when creating requests with clients. The `query`\n  option uses PHP's `http_build_query` to convert an array to a string. If you\n  need a different serialization technique, you will need to pass the query\n  string in as a string. There are a couple helper functions that will make\n  working with query strings easier: `GuzzleHttp\\Psr7\\parse_query` and\n  `GuzzleHttp\\Psr7\\build_query`.\n- Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware\n  system based on PSR-7, using RingPHP and it's middleware system as well adds\n  more complexity than the benefits it provides. All HTTP handlers that were\n  present in RingPHP have been modified to work directly with PSR-7 messages\n  and placed in the `GuzzleHttp\\Handler` namespace. This significantly reduces\n  complexity in Guzzle, removes a dependency, and improves performance. RingPHP\n  will be maintained for Guzzle 5 support, but will no longer be a part of\n  Guzzle 6.\n- As Guzzle now uses a middleware based systems the event system and RingPHP\n  integration has been removed. Note: while the event system has been removed,\n  it is possible to add your own type of event system that is powered by the\n  middleware system.\n  - Removed the `Event` namespace.\n  - Removed the `Subscriber` namespace.\n  - Removed `Transaction` class\n  - Removed `RequestFsm`\n  - Removed `RingBridge`\n  - `GuzzleHttp\\Subscriber\\Cookie` is now provided by\n    `GuzzleHttp\\Middleware::cookies`\n  - `GuzzleHttp\\Subscriber\\HttpError` is now provided by\n    `GuzzleHttp\\Middleware::httpError`\n  - `GuzzleHttp\\Subscriber\\History` is now provided by\n    `GuzzleHttp\\Middleware::history`\n  - `GuzzleHttp\\Subscriber\\Mock` is now provided by\n    `GuzzleHttp\\Handler\\MockHandler`\n  - `GuzzleHttp\\Subscriber\\Prepare` is now provided by\n    `GuzzleHttp\\PrepareBodyMiddleware`\n  - `GuzzleHttp\\Subscriber\\Redirect` is now provided by\n    `GuzzleHttp\\RedirectMiddleware`\n- Guzzle now uses `Psr\\Http\\Message\\UriInterface` (implements in\n  `GuzzleHttp\\Psr7\\Uri`) for URI support. `GuzzleHttp\\Url` is now gone.\n- Static functions in `GuzzleHttp\\Utils` have been moved to namespaced\n  functions under the `GuzzleHttp` namespace. This requires either a Composer\n  based autoloader or you to include functions.php.\n- `GuzzleHttp\\ClientInterface::getDefaultOption` has been renamed to\n  `GuzzleHttp\\ClientInterface::getConfig`.\n- `GuzzleHttp\\ClientInterface::setDefaultOption` has been removed.\n- The `json` and `xml` methods of response objects has been removed. With the\n  migration to strictly adhering to PSR-7 as the interface for Guzzle messages,\n  adding methods to message interfaces would actually require Guzzle messages\n  to extend from PSR-7 messages rather then work with them directly.\n\n## Migrating to middleware\n\nThe change to PSR-7 unfortunately required significant refactoring to Guzzle\ndue to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event\nsystem from plugins. The event system relied on mutability of HTTP messages and\nside effects in order to work. With immutable messages, you have to change your\nworkflow to become more about either returning a value (e.g., functional\nmiddlewares) or setting a value on an object. Guzzle v6 has chosen the\nfunctional middleware approach.\n\nInstead of using the event system to listen for things like the `before` event,\nyou now create a stack based middleware function that intercepts a request on\nthe way in and the promise of the response on the way out. This is a much\nsimpler and more predictable approach than the event system and works nicely\nwith PSR-7 middleware. Due to the use of promises, the middleware system is\nalso asynchronous.\n\nv5:\n\n```php\nuse GuzzleHttp\\Event\\BeforeEvent;\n$client = new GuzzleHttp\\Client();\n// Get the emitter and listen to the before event.\n$client->getEmitter()->on('before', function (BeforeEvent $e) {\n    // Guzzle v5 events relied on mutation\n    $e->getRequest()->setHeader('X-Foo', 'Bar');\n});\n```\n\nv6:\n\nIn v6, you can modify the request before it is sent using the `mapRequest`\nmiddleware. The idiomatic way in v6 to modify the request/response lifecycle is\nto setup a handler middleware stack up front and inject the handler into a\nclient.\n\n```php\nuse GuzzleHttp\\Middleware;\n// Create a handler stack that has all of the default middlewares attached\n$handler = GuzzleHttp\\HandlerStack::create();\n// Push the handler onto the handler stack\n$handler->push(Middleware::mapRequest(function (RequestInterface $request) {\n    // Notice that we have to return a request object\n    return $request->withHeader('X-Foo', 'Bar');\n}));\n// Inject the handler into the client\n$client = new GuzzleHttp\\Client(['handler' => $handler]);\n```\n\n## POST Requests\n\nThis version added the [`form_params`](http://guzzle.readthedocs.org/en/latest/request-options.html#form_params)\nand `multipart` request options. `form_params` is an associative array of\nstrings or array of strings and is used to serialize an\n`application/x-www-form-urlencoded` POST request. The\n[`multipart`](http://guzzle.readthedocs.org/en/latest/request-options.html#multipart)\noption is now used to send a multipart/form-data POST request.\n\n`GuzzleHttp\\Post\\PostFile` has been removed. Use the `multipart` option to add\nPOST files to a multipart/form-data request.\n\nThe `body` option no longer accepts an array to send POST requests. Please use\n`multipart` or `form_params` instead.\n\nThe `base_url` option has been renamed to `base_uri`.\n\n4.x to 5.0\n----------\n\n## Rewritten Adapter Layer\n\nGuzzle now uses [RingPHP](http://ringphp.readthedocs.org/en/latest) to send\nHTTP requests. The `adapter` option in a `GuzzleHttp\\Client` constructor\nis still supported, but it has now been renamed to `handler`. Instead of\npassing a `GuzzleHttp\\Adapter\\AdapterInterface`, you must now pass a PHP\n`callable` that follows the RingPHP specification.\n\n## Removed Fluent Interfaces\n\n[Fluent interfaces were removed](http://ocramius.github.io/blog/fluent-interfaces-are-evil)\nfrom the following classes:\n\n- `GuzzleHttp\\Collection`\n- `GuzzleHttp\\Url`\n- `GuzzleHttp\\Query`\n- `GuzzleHttp\\Post\\PostBody`\n- `GuzzleHttp\\Cookie\\SetCookie`\n\n## Removed functions.php\n\nRemoved \"functions.php\", so that Guzzle is truly PSR-4 compliant. The following\nfunctions can be used as replacements.\n\n- `GuzzleHttp\\json_decode` -> `GuzzleHttp\\Utils::jsonDecode`\n- `GuzzleHttp\\get_path` -> `GuzzleHttp\\Utils::getPath`\n- `GuzzleHttp\\Utils::setPath` -> `GuzzleHttp\\set_path`\n- `GuzzleHttp\\Pool::batch` -> `GuzzleHttp\\batch`. This function is, however,\n  deprecated in favor of using `GuzzleHttp\\Pool::batch()`.\n\nThe \"procedural\" global client has been removed with no replacement (e.g.,\n`GuzzleHttp\\get()`, `GuzzleHttp\\post()`, etc.). Use a `GuzzleHttp\\Client`\nobject as a replacement.\n\n## `throwImmediately` has been removed\n\nThe concept of \"throwImmediately\" has been removed from exceptions and error\nevents. This control mechanism was used to stop a transfer of concurrent\nrequests from completing. This can now be handled by throwing the exception or\nby cancelling a pool of requests or each outstanding future request\nindividually.\n\n## headers event has been removed\n\nRemoved the \"headers\" event. This event was only useful for changing the\nbody a response once the headers of the response were known. You can implement\na similar behavior in a number of ways. One example might be to use a\nFnStream that has access to the transaction being sent. For example, when the\nfirst byte is written, you could check if the response headers match your\nexpectations, and if so, change the actual stream body that is being\nwritten to.\n\n## Updates to HTTP Messages\n\nRemoved the `asArray` parameter from\n`GuzzleHttp\\Message\\MessageInterface::getHeader`. If you want to get a header\nvalue as an array, then use the newly added `getHeaderAsArray()` method of\n`MessageInterface`. This change makes the Guzzle interfaces compatible with\nthe PSR-7 interfaces.\n\n3.x to 4.0\n----------\n\n## Overarching changes:\n\n- Now requires PHP 5.4 or greater.\n- No longer requires cURL to send requests.\n- Guzzle no longer wraps every exception it throws. Only exceptions that are\n  recoverable are now wrapped by Guzzle.\n- Various namespaces have been removed or renamed.\n- No longer requiring the Symfony EventDispatcher. A custom event dispatcher\n  based on the Symfony EventDispatcher is\n  now utilized in `GuzzleHttp\\Event\\EmitterInterface` (resulting in significant\n  speed and functionality improvements).\n\nChanges per Guzzle 3.x namespace are described below.\n\n## Batch\n\nThe `Guzzle\\Batch` namespace has been removed. This is best left to\nthird-parties to implement on top of Guzzle's core HTTP library.\n\n## Cache\n\nThe `Guzzle\\Cache` namespace has been removed. (Todo: No suitable replacement\nhas been implemented yet, but hoping to utilize a PSR cache interface).\n\n## Common\n\n- Removed all of the wrapped exceptions. It's better to use the standard PHP\n  library for unrecoverable exceptions.\n- `FromConfigInterface` has been removed.\n- `Guzzle\\Common\\Version` has been removed. The VERSION constant can be found\n  at `GuzzleHttp\\ClientInterface::VERSION`.\n\n### Collection\n\n- `getAll` has been removed. Use `toArray` to convert a collection to an array.\n- `inject` has been removed.\n- `keySearch` has been removed.\n- `getPath` no longer supports wildcard expressions. Use something better like\n  JMESPath for this.\n- `setPath` now supports appending to an existing array via the `[]` notation.\n\n### Events\n\nGuzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses\n`GuzzleHttp\\Event\\Emitter`.\n\n- `Symfony\\Component\\EventDispatcher\\EventDispatcherInterface` is replaced by\n  `GuzzleHttp\\Event\\EmitterInterface`.\n- `Symfony\\Component\\EventDispatcher\\EventDispatcher` is replaced by\n  `GuzzleHttp\\Event\\Emitter`.\n- `Symfony\\Component\\EventDispatcher\\Event` is replaced by\n  `GuzzleHttp\\Event\\Event`, and Guzzle now has an EventInterface in\n  `GuzzleHttp\\Event\\EventInterface`.\n- `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and\n  `HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the\n  event emitter of a request, client, etc. now uses the `getEmitter` method\n  rather than the `getDispatcher` method.\n\n#### Emitter\n\n- Use the `once()` method to add a listener that automatically removes itself\n  the first time it is invoked.\n- Use the `listeners()` method to retrieve a list of event listeners rather than\n  the `getListeners()` method.\n- Use `emit()` instead of `dispatch()` to emit an event from an emitter.\n- Use `attach()` instead of `addSubscriber()` and `detach()` instead of\n  `removeSubscriber()`.\n\n```php\n$mock = new Mock();\n// 3.x\n$request->getEventDispatcher()->addSubscriber($mock);\n$request->getEventDispatcher()->removeSubscriber($mock);\n// 4.x\n$request->getEmitter()->attach($mock);\n$request->getEmitter()->detach($mock);\n```\n\nUse the `on()` method to add a listener rather than the `addListener()` method.\n\n```php\n// 3.x\n$request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } );\n// 4.x\n$request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } );\n```\n\n## Http\n\n### General changes\n\n- The cacert.pem certificate has been moved to `src/cacert.pem`.\n- Added the concept of adapters that are used to transfer requests over the\n  wire.\n- Simplified the event system.\n- Sending requests in parallel is still possible, but batching is no longer a\n  concept of the HTTP layer. Instead, you must use the `complete` and `error`\n  events to asynchronously manage parallel request transfers.\n- `Guzzle\\Http\\Url` has moved to `GuzzleHttp\\Url`.\n- `Guzzle\\Http\\QueryString` has moved to `GuzzleHttp\\Query`.\n- QueryAggregators have been rewritten so that they are simply callable\n  functions.\n- `GuzzleHttp\\StaticClient` has been removed. Use the functions provided in\n  `functions.php` for an easy to use static client instance.\n- Exceptions in `GuzzleHttp\\Exception` have been updated to all extend from\n  `GuzzleHttp\\Exception\\TransferException`.\n\n### Client\n\nCalling methods like `get()`, `post()`, `head()`, etc. no longer create and\nreturn a request, but rather creates a request, sends the request, and returns\nthe response.\n\n```php\n// 3.0\n$request = $client->get('/');\n$response = $request->send();\n\n// 4.0\n$response = $client->get('/');\n\n// or, to mirror the previous behavior\n$request = $client->createRequest('GET', '/');\n$response = $client->send($request);\n```\n\n`GuzzleHttp\\ClientInterface` has changed.\n\n- The `send` method no longer accepts more than one request. Use `sendAll` to\n  send multiple requests in parallel.\n- `setUserAgent()` has been removed. Use a default request option instead. You\n  could, for example, do something like:\n  `$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`.\n- `setSslVerification()` has been removed. Use default request options instead,\n  like `$client->setConfig('defaults/verify', true)`.\n\n`GuzzleHttp\\Client` has changed.\n\n- The constructor now accepts only an associative array. You can include a\n  `base_url` string or array to use a URI template as the base URL of a client.\n  You can also specify a `defaults` key that is an associative array of default\n  request options. You can pass an `adapter` to use a custom adapter,\n  `batch_adapter` to use a custom adapter for sending requests in parallel, or\n  a `message_factory` to change the factory used to create HTTP requests and\n  responses.\n- The client no longer emits a `client.create_request` event.\n- Creating requests with a client no longer automatically utilize a URI\n  template. You must pass an array into a creational method (e.g.,\n  `createRequest`, `get`, `put`, etc.) in order to expand a URI template.\n\n### Messages\n\nMessages no longer have references to their counterparts (i.e., a request no\nlonger has a reference to it's response, and a response no loger has a\nreference to its request). This association is now managed through a\n`GuzzleHttp\\Adapter\\TransactionInterface` object. You can get references to\nthese transaction objects using request events that are emitted over the\nlifecycle of a request.\n\n#### Requests with a body\n\n- `GuzzleHttp\\Message\\EntityEnclosingRequest` and\n  `GuzzleHttp\\Message\\EntityEnclosingRequestInterface` have been removed. The\n  separation between requests that contain a body and requests that do not\n  contain a body has been removed, and now `GuzzleHttp\\Message\\RequestInterface`\n  handles both use cases.\n- Any method that previously accepts a `GuzzleHttp\\Response` object now accept a\n  `GuzzleHttp\\Message\\ResponseInterface`.\n- `GuzzleHttp\\Message\\RequestFactoryInterface` has been renamed to\n  `GuzzleHttp\\Message\\MessageFactoryInterface`. This interface is used to create\n  both requests and responses and is implemented in\n  `GuzzleHttp\\Message\\MessageFactory`.\n- POST field and file methods have been removed from the request object. You\n  must now use the methods made available to `GuzzleHttp\\Post\\PostBodyInterface`\n  to control the format of a POST body. Requests that are created using a\n  standard `GuzzleHttp\\Message\\MessageFactoryInterface` will automatically use\n  a `GuzzleHttp\\Post\\PostBody` body if the body was passed as an array or if\n  the method is POST and no body is provided.\n\n```php\n$request = $client->createRequest('POST', '/');\n$request->getBody()->setField('foo', 'bar');\n$request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r')));\n```\n\n#### Headers\n\n- `GuzzleHttp\\Message\\Header` has been removed. Header values are now simply\n  represented by an array of values or as a string. Header values are returned\n  as a string by default when retrieving a header value from a message. You can\n  pass an optional argument of `true` to retrieve a header value as an array\n  of strings instead of a single concatenated string.\n- `GuzzleHttp\\PostFile` and `GuzzleHttp\\PostFileInterface` have been moved to\n  `GuzzleHttp\\Post`. This interface has been simplified and now allows the\n  addition of arbitrary headers.\n- Custom headers like `GuzzleHttp\\Message\\Header\\Link` have been removed. Most\n  of the custom headers are now handled separately in specific\n  subscribers/plugins, and `GuzzleHttp\\Message\\HeaderValues::parseParams()` has\n  been updated to properly handle headers that contain parameters (like the\n  `Link` header).\n\n#### Responses\n\n- `GuzzleHttp\\Message\\Response::getInfo()` and\n  `GuzzleHttp\\Message\\Response::setInfo()` have been removed. Use the event\n  system to retrieve this type of information.\n- `GuzzleHttp\\Message\\Response::getRawHeaders()` has been removed.\n- `GuzzleHttp\\Message\\Response::getMessage()` has been removed.\n- `GuzzleHttp\\Message\\Response::calculateAge()` and other cache specific\n  methods have moved to the CacheSubscriber.\n- Header specific helper functions like `getContentMd5()` have been removed.\n  Just use `getHeader('Content-MD5')` instead.\n- `GuzzleHttp\\Message\\Response::setRequest()` and\n  `GuzzleHttp\\Message\\Response::getRequest()` have been removed. Use the event\n  system to work with request and response objects as a transaction.\n- `GuzzleHttp\\Message\\Response::getRedirectCount()` has been removed. Use the\n  Redirect subscriber instead.\n- `GuzzleHttp\\Message\\Response::isSuccessful()` and other related methods have\n  been removed. Use `getStatusCode()` instead.\n\n#### Streaming responses\n\nStreaming requests can now be created by a client directly, returning a\n`GuzzleHttp\\Message\\ResponseInterface` object that contains a body stream\nreferencing an open PHP HTTP stream.\n\n```php\n// 3.0\nuse Guzzle\\Stream\\PhpStreamRequestFactory;\n$request = $client->get('/');\n$factory = new PhpStreamRequestFactory();\n$stream = $factory->fromRequest($request);\n$data = $stream->read(1024);\n\n// 4.0\n$response = $client->get('/', ['stream' => true]);\n// Read some data off of the stream in the response body\n$data = $response->getBody()->read(1024);\n```\n\n#### Redirects\n\nThe `configureRedirects()` method has been removed in favor of a\n`allow_redirects` request option.\n\n```php\n// Standard redirects with a default of a max of 5 redirects\n$request = $client->createRequest('GET', '/', ['allow_redirects' => true]);\n\n// Strict redirects with a custom number of redirects\n$request = $client->createRequest('GET', '/', [\n    'allow_redirects' => ['max' => 5, 'strict' => true]\n]);\n```\n\n#### EntityBody\n\nEntityBody interfaces and classes have been removed or moved to\n`GuzzleHttp\\Stream`. All classes and interfaces that once required\n`GuzzleHttp\\EntityBodyInterface` now require\n`GuzzleHttp\\Stream\\StreamInterface`. Creating a new body for a request no\nlonger uses `GuzzleHttp\\EntityBody::factory` but now uses\n`GuzzleHttp\\Stream\\Stream::factory` or even better:\n`GuzzleHttp\\Stream\\create()`.\n\n- `Guzzle\\Http\\EntityBodyInterface` is now `GuzzleHttp\\Stream\\StreamInterface`\n- `Guzzle\\Http\\EntityBody` is now `GuzzleHttp\\Stream\\Stream`\n- `Guzzle\\Http\\CachingEntityBody` is now `GuzzleHttp\\Stream\\CachingStream`\n- `Guzzle\\Http\\ReadLimitEntityBody` is now `GuzzleHttp\\Stream\\LimitStream`\n- `Guzzle\\Http\\IoEmittyinEntityBody` has been removed.\n\n#### Request lifecycle events\n\nRequests previously submitted a large number of requests. The number of events\nemitted over the lifecycle of a request has been significantly reduced to make\nit easier to understand how to extend the behavior of a request. All events\nemitted during the lifecycle of a request now emit a custom\n`GuzzleHttp\\Event\\EventInterface` object that contains context providing\nmethods and a way in which to modify the transaction at that specific point in\ntime (e.g., intercept the request and set a response on the transaction).\n\n- `request.before_send` has been renamed to `before` and now emits a\n  `GuzzleHttp\\Event\\BeforeEvent`\n- `request.complete` has been renamed to `complete` and now emits a\n  `GuzzleHttp\\Event\\CompleteEvent`.\n- `request.sent` has been removed. Use `complete`.\n- `request.success` has been removed. Use `complete`.\n- `error` is now an event that emits a `GuzzleHttp\\Event\\ErrorEvent`.\n- `request.exception` has been removed. Use `error`.\n- `request.receive.status_line` has been removed.\n- `curl.callback.progress` has been removed. Use a custom `StreamInterface` to\n  maintain a status update.\n- `curl.callback.write` has been removed. Use a custom `StreamInterface` to\n  intercept writes.\n- `curl.callback.read` has been removed. Use a custom `StreamInterface` to\n  intercept reads.\n\n`headers` is a new event that is emitted after the response headers of a\nrequest have been received before the body of the response is downloaded. This\nevent emits a `GuzzleHttp\\Event\\HeadersEvent`.\n\nYou can intercept a request and inject a response using the `intercept()` event\nof a `GuzzleHttp\\Event\\BeforeEvent`, `GuzzleHttp\\Event\\CompleteEvent`, and\n`GuzzleHttp\\Event\\ErrorEvent` event.\n\nSee: http://docs.guzzlephp.org/en/latest/events.html\n\n## Inflection\n\nThe `Guzzle\\Inflection` namespace has been removed. This is not a core concern\nof Guzzle.\n\n## Iterator\n\nThe `Guzzle\\Iterator` namespace has been removed.\n\n- `Guzzle\\Iterator\\AppendIterator`, `Guzzle\\Iterator\\ChunkedIterator`, and\n  `Guzzle\\Iterator\\MethodProxyIterator` are nice, but not a core requirement of\n  Guzzle itself.\n- `Guzzle\\Iterator\\FilterIterator` is no longer needed because an equivalent\n  class is shipped with PHP 5.4.\n- `Guzzle\\Iterator\\MapIterator` is not really needed when using PHP 5.5 because\n  it's easier to just wrap an iterator in a generator that maps values.\n\nFor a replacement of these iterators, see https://github.com/nikic/iter\n\n## Log\n\nThe LogPlugin has moved to https://github.com/guzzle/log-subscriber. The\n`Guzzle\\Log` namespace has been removed. Guzzle now relies on\n`Psr\\Log\\LoggerInterface` for all logging. The MessageFormatter class has been\nmoved to `GuzzleHttp\\Subscriber\\Log\\Formatter`.\n\n## Parser\n\nThe `Guzzle\\Parser` namespace has been removed. This was previously used to\nmake it possible to plug in custom parsers for cookies, messages, URI\ntemplates, and URLs; however, this level of complexity is not needed in Guzzle\nso it has been removed.\n\n- Cookie: Cookie parsing logic has been moved to\n  `GuzzleHttp\\Cookie\\SetCookie::fromString`.\n- Message: Message parsing logic for both requests and responses has been moved\n  to `GuzzleHttp\\Message\\MessageFactory::fromMessage`. Message parsing is only\n  used in debugging or deserializing messages, so it doesn't make sense for\n  Guzzle as a library to add this level of complexity to parsing messages.\n- UriTemplate: URI template parsing has been moved to\n  `GuzzleHttp\\UriTemplate`. The Guzzle library will automatically use the PECL\n  URI template library if it is installed.\n- Url: URL parsing is now performed in `GuzzleHttp\\Url::fromString` (previously\n  it was `Guzzle\\Http\\Url::factory()`). If custom URL parsing is necessary,\n  then developers are free to subclass `GuzzleHttp\\Url`.\n\n## Plugin\n\nThe `Guzzle\\Plugin` namespace has been renamed to `GuzzleHttp\\Subscriber`.\nSeveral plugins are shipping with the core Guzzle library under this namespace.\n\n- `GuzzleHttp\\Subscriber\\Cookie`: Replaces the old CookiePlugin. Cookie jar\n  code has moved to `GuzzleHttp\\Cookie`.\n- `GuzzleHttp\\Subscriber\\History`: Replaces the old HistoryPlugin.\n- `GuzzleHttp\\Subscriber\\HttpError`: Throws errors when a bad HTTP response is\n  received.\n- `GuzzleHttp\\Subscriber\\Mock`: Replaces the old MockPlugin.\n- `GuzzleHttp\\Subscriber\\Prepare`: Prepares the body of a request just before\n  sending. This subscriber is attached to all requests by default.\n- `GuzzleHttp\\Subscriber\\Redirect`: Replaces the RedirectPlugin.\n\nThe following plugins have been removed (third-parties are free to re-implement\nthese if needed):\n\n- `GuzzleHttp\\Plugin\\Async` has been removed.\n- `GuzzleHttp\\Plugin\\CurlAuth` has been removed.\n- `GuzzleHttp\\Plugin\\ErrorResponse\\ErrorResponsePlugin` has been removed. This\n  functionality should instead be implemented with event listeners that occur\n  after normal response parsing occurs in the guzzle/command package.\n\nThe following plugins are not part of the core Guzzle package, but are provided\nin separate repositories:\n\n- `Guzzle\\Http\\Plugin\\BackoffPlugin` has been rewritten to be much simpler\n  to build custom retry policies using simple functions rather than various\n  chained classes. See: https://github.com/guzzle/retry-subscriber\n- `Guzzle\\Http\\Plugin\\Cache\\CachePlugin` has moved to\n  https://github.com/guzzle/cache-subscriber\n- `Guzzle\\Http\\Plugin\\Log\\LogPlugin` has moved to\n  https://github.com/guzzle/log-subscriber\n- `Guzzle\\Http\\Plugin\\Md5\\Md5Plugin` has moved to\n  https://github.com/guzzle/message-integrity-subscriber\n- `Guzzle\\Http\\Plugin\\Mock\\MockPlugin` has moved to\n  `GuzzleHttp\\Subscriber\\MockSubscriber`.\n- `Guzzle\\Http\\Plugin\\Oauth\\OauthPlugin` has moved to\n  https://github.com/guzzle/oauth-subscriber\n\n## Service\n\nThe service description layer of Guzzle has moved into two separate packages:\n\n- http://github.com/guzzle/command Provides a high level abstraction over web\n  services by representing web service operations using commands.\n- http://github.com/guzzle/guzzle-services Provides an implementation of\n  guzzle/command that provides request serialization and response parsing using\n  Guzzle service descriptions.\n\n## Stream\n\nStream have moved to a separate package available at\nhttps://github.com/guzzle/streams.\n\n`Guzzle\\Stream\\StreamInterface` has been given a large update to cleanly take\non the responsibilities of `Guzzle\\Http\\EntityBody` and\n`Guzzle\\Http\\EntityBodyInterface` now that they have been removed. The number\nof methods implemented by the `StreamInterface` has been drastically reduced to\nallow developers to more easily extend and decorate stream behavior.\n\n## Removed methods from StreamInterface\n\n- `getStream` and `setStream` have been removed to better encapsulate streams.\n- `getMetadata` and `setMetadata` have been removed in favor of\n  `GuzzleHttp\\Stream\\MetadataStreamInterface`.\n- `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been\n  removed. This data is accessible when\n  using streams that implement `GuzzleHttp\\Stream\\MetadataStreamInterface`.\n- `rewind` has been removed. Use `seek(0)` for a similar behavior.\n\n## Renamed methods\n\n- `detachStream` has been renamed to `detach`.\n- `feof` has been renamed to `eof`.\n- `ftell` has been renamed to `tell`.\n- `readLine` has moved from an instance method to a static class method of\n  `GuzzleHttp\\Stream\\Stream`.\n\n## Metadata streams\n\n`GuzzleHttp\\Stream\\MetadataStreamInterface` has been added to denote streams\nthat contain additional metadata accessible via `getMetadata()`.\n`GuzzleHttp\\Stream\\StreamInterface::getMetadata` and\n`GuzzleHttp\\Stream\\StreamInterface::setMetadata` have been removed.\n\n## StreamRequestFactory\n\nThe entire concept of the StreamRequestFactory has been removed. The way this\nwas used in Guzzle 3 broke the actual interface of sending streaming requests\n(instead of getting back a Response, you got a StreamInterface). Streaming\nPHP requests are now implemented through the `GuzzleHttp\\Adapter\\StreamAdapter`.\n\n3.6 to 3.7\n----------\n\n### Deprecations\n\n- You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.:\n\n```php\n\\Guzzle\\Common\\Version::$emitWarnings = true;\n```\n\nThe following APIs and options have been marked as deprecated:\n\n- Marked `Guzzle\\Http\\Message\\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead.\n- Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n- Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n- Marked `Guzzle\\Http\\Message\\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.\n- Marked `Guzzle\\Http\\Message\\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.\n- Marked `Guzzle\\Cache\\CacheAdapterFactory::factory()` as deprecated\n- Marked `Guzzle\\Service\\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\\Service\\Client.\n- Marked `Guzzle\\Parser\\Url\\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.\n- Marked `Guzzle\\Common\\Collection::inject()` as deprecated.\n- Marked `Guzzle\\Plugin\\CurlAuth\\CurlAuthPlugin` as deprecated. Use\n  `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or\n  `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));`\n\n3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational\nrequest methods. When paired with a client's configuration settings, these options allow you to specify default settings\nfor various aspects of a request. Because these options make other previous configuration options redundant, several\nconfiguration options and methods of a client and AbstractCommand have been deprecated.\n\n- Marked `Guzzle\\Service\\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`.\n- Marked `Guzzle\\Service\\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`.\n- Marked 'request.params' for `Guzzle\\Http\\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')`\n- Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0\n\n        $command = $client->getCommand('foo', array(\n            'command.headers' => array('Test' => '123'),\n            'command.response_body' => '/path/to/file'\n        ));\n\n        // Should be changed to:\n\n        $command = $client->getCommand('foo', array(\n            'command.request_options' => array(\n                'headers' => array('Test' => '123'),\n                'save_as' => '/path/to/file'\n            )\n        ));\n\n### Interface changes\n\nAdditions and changes (you will need to update any implementations or subclasses you may have created):\n\n- Added an `$options` argument to the end of the following methods of `Guzzle\\Http\\ClientInterface`:\n  createRequest, head, delete, put, patch, post, options, prepareRequest\n- Added an `$options` argument to the end of `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface::createRequest()`\n- Added an `applyOptions()` method to `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface`\n- Changed `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $body = null)` to\n  `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a\n  resource, string, or EntityBody into the $options parameter to specify the download location of the response.\n- Changed `Guzzle\\Common\\Collection::__construct($data)` to no longer accepts a null value for `$data` but a\n  default `array()`\n- Added `Guzzle\\Stream\\StreamInterface::isRepeatable`\n- Made `Guzzle\\Http\\Client::expandTemplate` and `getUriTemplate` protected methods.\n\nThe following methods were removed from interfaces. All of these methods are still available in the concrete classes\nthat implement them, but you should update your code to use alternative methods:\n\n- Removed `Guzzle\\Http\\ClientInterface::setDefaultHeaders(). Use\n  `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or\n  `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or\n  `$client->setDefaultOption('headers/{header_name}', 'value')`. or\n  `$client->setDefaultOption('headers', array('header_name' => 'value'))`.\n- Removed `Guzzle\\Http\\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`.\n- Removed `Guzzle\\Http\\ClientInterface::expandTemplate()`. This is an implementation detail.\n- Removed `Guzzle\\Http\\ClientInterface::setRequestFactory()`. This is an implementation detail.\n- Removed `Guzzle\\Http\\ClientInterface::getCurlMulti()`. This is a very specific implementation detail.\n- Removed `Guzzle\\Http\\Message\\RequestInterface::canCache`. Use the CachePlugin.\n- Removed `Guzzle\\Http\\Message\\RequestInterface::setIsRedirect`. Use the HistoryPlugin.\n- Removed `Guzzle\\Http\\Message\\RequestInterface::isRedirect`. Use the HistoryPlugin.\n\n### Cache plugin breaking changes\n\n- CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a\n  CacheStorageInterface. These two objects and interface will be removed in a future version.\n- Always setting X-cache headers on cached responses\n- Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin\n- `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface\n  $request, Response $response);`\n- `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`\n- `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`\n- Added `CacheStorageInterface::purge($url)`\n- `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin\n  $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,\n  CanCacheStrategyInterface $canCache = null)`\n- Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`\n\n3.5 to 3.6\n----------\n\n* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.\n* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution\n* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().\n  For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader().\n  Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request.\n* Specific header implementations can be created for complex headers. When a message creates a header, it uses a\n  HeaderFactory which can map specific headers to specific header classes. There is now a Link header and\n  CacheControl header implementation.\n* Moved getLinks() from Response to just be used on a Link header object.\n\nIf you previously relied on Guzzle\\Http\\Message\\Header::raw(), then you will need to update your code to use the\nHeaderInterface (e.g. toArray(), getAll(), etc.).\n\n### Interface changes\n\n* Removed from interface: Guzzle\\Http\\ClientInterface::setUriTemplate\n* Removed from interface: Guzzle\\Http\\ClientInterface::setCurlMulti()\n* Removed Guzzle\\Http\\Message\\Request::receivedRequestHeader() and implemented this functionality in\n  Guzzle\\Http\\Curl\\RequestMediator\n* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.\n* Removed the optional $tryChunkedTransfer option from Guzzle\\Http\\Message\\EntityEnclosingRequestInterface\n* Removed the $asObjects argument from Guzzle\\Http\\Message\\MessageInterface::getHeaders()\n\n### Removed deprecated functions\n\n* Removed Guzzle\\Parser\\ParserRegister::get(). Use getParser()\n* Removed Guzzle\\Parser\\ParserRegister::set(). Use registerParser().\n\n### Deprecations\n\n* The ability to case-insensitively search for header values\n* Guzzle\\Http\\Message\\Header::hasExactHeader\n* Guzzle\\Http\\Message\\Header::raw. Use getAll()\n* Deprecated cache control specific methods on Guzzle\\Http\\Message\\AbstractMessage. Use the CacheControl header object\n  instead.\n\n### Other changes\n\n* All response header helper functions return a string rather than mixing Header objects and strings inconsistently\n* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle\n  directly via interfaces\n* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist\n  but are a no-op until removed.\n* Most classes that used to require a `Guzzle\\Service\\Command\\CommandInterface` typehint now request a\n  `Guzzle\\Service\\Command\\ArrayCommandInterface`.\n* Added `Guzzle\\Http\\Message\\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response\n  on a request while the request is still being transferred\n* `Guzzle\\Service\\Command\\CommandInterface` now extends from ToArrayInterface and ArrayAccess\n\n3.3 to 3.4\n----------\n\nBase URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs.\n\n3.2 to 3.3\n----------\n\n### Response::getEtag() quote stripping removed\n\n`Guzzle\\Http\\Message\\Response::getEtag()` no longer strips quotes around the ETag response header\n\n### Removed `Guzzle\\Http\\Utils`\n\nThe `Guzzle\\Http\\Utils` class was removed. This class was only used for testing.\n\n### Stream wrapper and type\n\n`Guzzle\\Stream\\Stream::getWrapper()` and `Guzzle\\Stream\\Stream::getStreamType()` are no longer converted to lowercase.\n\n### curl.emit_io became emit_io\n\nEmitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the\n'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'\n\n3.1 to 3.2\n----------\n\n### CurlMulti is no longer reused globally\n\nBefore 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added\nto a single client can pollute requests dispatched from other clients.\n\nIf you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the\nServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is\ncreated.\n\n```php\n$multi = new Guzzle\\Http\\Curl\\CurlMulti();\n$builder = Guzzle\\Service\\Builder\\ServiceBuilder::factory('/path/to/config.json');\n$builder->addListener('service_builder.create_client', function ($event) use ($multi) {\n    $event['client']->setCurlMulti($multi);\n}\n});\n```\n\n### No default path\n\nURLs no longer have a default path value of '/' if no path was specified.\n\nBefore:\n\n```php\n$request = $client->get('http://www.foo.com');\necho $request->getUrl();\n// >> http://www.foo.com/\n```\n\nAfter:\n\n```php\n$request = $client->get('http://www.foo.com');\necho $request->getUrl();\n// >> http://www.foo.com\n```\n\n### Less verbose BadResponseException\n\nThe exception message for `Guzzle\\Http\\Exception\\BadResponseException` no longer contains the full HTTP request and\nresponse information. You can, however, get access to the request and response object by calling `getRequest()` or\n`getResponse()` on the exception object.\n\n### Query parameter aggregation\n\nMulti-valued query parameters are no longer aggregated using a callback function. `Guzzle\\Http\\Query` now has a\nsetAggregator() method that accepts a `Guzzle\\Http\\QueryAggregator\\QueryAggregatorInterface` object. This object is\nresponsible for handling the aggregation of multi-valued query string variables into a flattened hash.\n\n2.8 to 3.x\n----------\n\n### Guzzle\\Service\\Inspector\n\nChange `\\Guzzle\\Service\\Inspector::fromConfig` to `\\Guzzle\\Common\\Collection::fromConfig`\n\n**Before**\n\n```php\nuse Guzzle\\Service\\Inspector;\n\nclass YourClient extends \\Guzzle\\Service\\Client\n{\n    public static function factory($config = array())\n    {\n        $default = array();\n        $required = array('base_url', 'username', 'api_key');\n        $config = Inspector::fromConfig($config, $default, $required);\n\n        $client = new self(\n            $config->get('base_url'),\n            $config->get('username'),\n            $config->get('api_key')\n        );\n        $client->setConfig($config);\n\n        $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));\n\n        return $client;\n    }\n```\n\n**After**\n\n```php\nuse Guzzle\\Common\\Collection;\n\nclass YourClient extends \\Guzzle\\Service\\Client\n{\n    public static function factory($config = array())\n    {\n        $default = array();\n        $required = array('base_url', 'username', 'api_key');\n        $config = Collection::fromConfig($config, $default, $required);\n\n        $client = new self(\n            $config->get('base_url'),\n            $config->get('username'),\n            $config->get('api_key')\n        );\n        $client->setConfig($config);\n\n        $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));\n\n        return $client;\n    }\n```\n\n### Convert XML Service Descriptions to JSON\n\n**Before**\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<client>\n    <commands>\n        <!-- Groups -->\n        <command name=\"list_groups\" method=\"GET\" uri=\"groups.json\">\n            <doc>Get a list of groups</doc>\n        </command>\n        <command name=\"search_groups\" method=\"GET\" uri='search.json?query=\"{{query}} type:group\"'>\n            <doc>Uses a search query to get a list of groups</doc>\n            <param name=\"query\" type=\"string\" required=\"true\" />\n        </command>\n        <command name=\"create_group\" method=\"POST\" uri=\"groups.json\">\n            <doc>Create a group</doc>\n            <param name=\"data\" type=\"array\" location=\"body\" filters=\"json_encode\" doc=\"Group JSON\"/>\n            <param name=\"Content-Type\" location=\"header\" static=\"application/json\"/>\n        </command>\n        <command name=\"delete_group\" method=\"DELETE\" uri=\"groups/{{id}}.json\">\n            <doc>Delete a group by ID</doc>\n            <param name=\"id\" type=\"integer\" required=\"true\"/>\n        </command>\n        <command name=\"get_group\" method=\"GET\" uri=\"groups/{{id}}.json\">\n            <param name=\"id\" type=\"integer\" required=\"true\"/>\n        </command>\n        <command name=\"update_group\" method=\"PUT\" uri=\"groups/{{id}}.json\">\n            <doc>Update a group</doc>\n            <param name=\"id\" type=\"integer\" required=\"true\"/>\n            <param name=\"data\" type=\"array\" location=\"body\" filters=\"json_encode\" doc=\"Group JSON\"/>\n            <param name=\"Content-Type\" location=\"header\" static=\"application/json\"/>\n        </command>\n    </commands>\n</client>\n```\n\n**After**\n\n```json\n{\n    \"name\":       \"Zendesk REST API v2\",\n    \"apiVersion\": \"2012-12-31\",\n    \"description\":\"Provides access to Zendesk views, groups, tickets, ticket fields, and users\",\n    \"operations\": {\n        \"list_groups\":  {\n            \"httpMethod\":\"GET\",\n            \"uri\":       \"groups.json\",\n            \"summary\":   \"Get a list of groups\"\n        },\n        \"search_groups\":{\n            \"httpMethod\":\"GET\",\n            \"uri\":       \"search.json?query=\\\"{query} type:group\\\"\",\n            \"summary\":   \"Uses a search query to get a list of groups\",\n            \"parameters\":{\n                \"query\":{\n                    \"location\":   \"uri\",\n                    \"description\":\"Zendesk Search Query\",\n                    \"type\":       \"string\",\n                    \"required\":   true\n                }\n            }\n        },\n        \"create_group\": {\n            \"httpMethod\":\"POST\",\n            \"uri\":       \"groups.json\",\n            \"summary\":   \"Create a group\",\n            \"parameters\":{\n                \"data\":        {\n                    \"type\":       \"array\",\n                    \"location\":   \"body\",\n                    \"description\":\"Group JSON\",\n                    \"filters\":    \"json_encode\",\n                    \"required\":   true\n                },\n                \"Content-Type\":{\n                    \"type\":    \"string\",\n                    \"location\":\"header\",\n                    \"static\":  \"application/json\"\n                }\n            }\n        },\n        \"delete_group\": {\n            \"httpMethod\":\"DELETE\",\n            \"uri\":       \"groups/{id}.json\",\n            \"summary\":   \"Delete a group\",\n            \"parameters\":{\n                \"id\":{\n                    \"location\":   \"uri\",\n                    \"description\":\"Group to delete by ID\",\n                    \"type\":       \"integer\",\n                    \"required\":   true\n                }\n            }\n        },\n        \"get_group\":    {\n            \"httpMethod\":\"GET\",\n            \"uri\":       \"groups/{id}.json\",\n            \"summary\":   \"Get a ticket\",\n            \"parameters\":{\n                \"id\":{\n                    \"location\":   \"uri\",\n                    \"description\":\"Group to get by ID\",\n                    \"type\":       \"integer\",\n                    \"required\":   true\n                }\n            }\n        },\n        \"update_group\": {\n            \"httpMethod\":\"PUT\",\n            \"uri\":       \"groups/{id}.json\",\n            \"summary\":   \"Update a group\",\n            \"parameters\":{\n                \"id\":          {\n                    \"location\":   \"uri\",\n                    \"description\":\"Group to update by ID\",\n                    \"type\":       \"integer\",\n                    \"required\":   true\n                },\n                \"data\":        {\n                    \"type\":       \"array\",\n                    \"location\":   \"body\",\n                    \"description\":\"Group JSON\",\n                    \"filters\":    \"json_encode\",\n                    \"required\":   true\n                },\n                \"Content-Type\":{\n                    \"type\":    \"string\",\n                    \"location\":\"header\",\n                    \"static\":  \"application/json\"\n                }\n            }\n        }\n}\n```\n\n### Guzzle\\Service\\Description\\ServiceDescription\n\nCommands are now called Operations\n\n**Before**\n\n```php\nuse Guzzle\\Service\\Description\\ServiceDescription;\n\n$sd = new ServiceDescription();\n$sd->getCommands();     // @returns ApiCommandInterface[]\n$sd->hasCommand($name);\n$sd->getCommand($name); // @returns ApiCommandInterface|null\n$sd->addCommand($command); // @param ApiCommandInterface $command\n```\n\n**After**\n\n```php\nuse Guzzle\\Service\\Description\\ServiceDescription;\n\n$sd = new ServiceDescription();\n$sd->getOperations();           // @returns OperationInterface[]\n$sd->hasOperation($name);\n$sd->getOperation($name);       // @returns OperationInterface|null\n$sd->addOperation($operation);  // @param OperationInterface $operation\n```\n\n### Guzzle\\Common\\Inflection\\Inflector\n\nNamespace is now `Guzzle\\Inflection\\Inflector`\n\n### Guzzle\\Http\\Plugin\n\nNamespace is now `Guzzle\\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below.\n\n### Guzzle\\Http\\Plugin\\LogPlugin and Guzzle\\Common\\Log\n\nNow `Guzzle\\Plugin\\Log\\LogPlugin` and `Guzzle\\Log` respectively.\n\n**Before**\n\n```php\nuse Guzzle\\Common\\Log\\ClosureLogAdapter;\nuse Guzzle\\Http\\Plugin\\LogPlugin;\n\n/** @var \\Guzzle\\Http\\Client */\n$client;\n\n// $verbosity is an integer indicating desired message verbosity level\n$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE);\n```\n\n**After**\n\n```php\nuse Guzzle\\Log\\ClosureLogAdapter;\nuse Guzzle\\Log\\MessageFormatter;\nuse Guzzle\\Plugin\\Log\\LogPlugin;\n\n/** @var \\Guzzle\\Http\\Client */\n$client;\n\n// $format is a string indicating desired message format -- @see MessageFormatter\n$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT);\n```\n\n### Guzzle\\Http\\Plugin\\CurlAuthPlugin\n\nNow `Guzzle\\Plugin\\CurlAuth\\CurlAuthPlugin`.\n\n### Guzzle\\Http\\Plugin\\ExponentialBackoffPlugin\n\nNow `Guzzle\\Plugin\\Backoff\\BackoffPlugin`, and other changes.\n\n**Before**\n\n```php\nuse Guzzle\\Http\\Plugin\\ExponentialBackoffPlugin;\n\n$backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge(\n        ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429)\n    ));\n\n$client->addSubscriber($backoffPlugin);\n```\n\n**After**\n\n```php\nuse Guzzle\\Plugin\\Backoff\\BackoffPlugin;\nuse Guzzle\\Plugin\\Backoff\\HttpBackoffStrategy;\n\n// Use convenient factory method instead -- see implementation for ideas of what\n// you can do with chaining backoff strategies\n$backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge(\n        HttpBackoffStrategy::getDefaultFailureCodes(), array(429)\n    ));\n$client->addSubscriber($backoffPlugin);\n```\n\n### Known Issues\n\n#### [BUG] Accept-Encoding header behavior changed unintentionally.\n\n(See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e)\n\nIn version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to\nproperly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen.\nSee issue #217 for a workaround, or use a version containing the fix.\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/composer.json",
    "content": "{\n    \"name\": \"guzzlehttp/guzzle\",\n    \"type\": \"library\",\n    \"description\": \"Guzzle is a PHP HTTP client library\",\n    \"keywords\": [\"framework\", \"http\", \"rest\", \"web service\", \"curl\", \"client\", \"HTTP client\"],\n    \"homepage\": \"http://guzzlephp.org/\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Michael Dowling\",\n            \"email\": \"mtdowling@gmail.com\",\n            \"homepage\": \"https://github.com/mtdowling\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.5\",\n        \"guzzlehttp/psr7\": \"^1.4\",\n        \"guzzlehttp/promises\": \"^1.0\"\n    },\n    \"require-dev\": {\n        \"ext-curl\": \"*\",\n        \"phpunit/phpunit\": \"^4.0 || ^5.0\",\n        \"psr/log\": \"^1.0\"\n    },\n    \"autoload\": {\n        \"files\": [\"src/functions_include.php\"],\n        \"psr-4\": {\n            \"GuzzleHttp\\\\\": \"src/\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Tests\\\\\": \"tests/\"\n        }\n    },\n    \"suggest\": {\n        \"psr/log\": \"Required for using the Log middleware\"\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"6.2-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Client.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Cookie\\CookieJar;\nuse GuzzleHttp\\Promise;\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\UriInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * @method ResponseInterface get(string|UriInterface $uri, array $options = [])\n * @method ResponseInterface head(string|UriInterface $uri, array $options = [])\n * @method ResponseInterface put(string|UriInterface $uri, array $options = [])\n * @method ResponseInterface post(string|UriInterface $uri, array $options = [])\n * @method ResponseInterface patch(string|UriInterface $uri, array $options = [])\n * @method ResponseInterface delete(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface getAsync(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface headAsync(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface putAsync(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface postAsync(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface patchAsync(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface deleteAsync(string|UriInterface $uri, array $options = [])\n */\nclass Client implements ClientInterface\n{\n    /** @var array Default request options */\n    private $config;\n\n    /**\n     * Clients accept an array of constructor parameters.\n     *\n     * Here's an example of creating a client using a base_uri and an array of\n     * default request options to apply to each request:\n     *\n     *     $client = new Client([\n     *         'base_uri'        => 'http://www.foo.com/1.0/',\n     *         'timeout'         => 0,\n     *         'allow_redirects' => false,\n     *         'proxy'           => '192.168.16.1:10'\n     *     ]);\n     *\n     * Client configuration settings include the following options:\n     *\n     * - handler: (callable) Function that transfers HTTP requests over the\n     *   wire. The function is called with a Psr7\\Http\\Message\\RequestInterface\n     *   and array of transfer options, and must return a\n     *   GuzzleHttp\\Promise\\PromiseInterface that is fulfilled with a\n     *   Psr7\\Http\\Message\\ResponseInterface on success. \"handler\" is a\n     *   constructor only option that cannot be overridden in per/request\n     *   options. If no handler is provided, a default handler will be created\n     *   that enables all of the request options below by attaching all of the\n     *   default middleware to the handler.\n     * - base_uri: (string|UriInterface) Base URI of the client that is merged\n     *   into relative URIs. Can be a string or instance of UriInterface.\n     * - **: any request option\n     *\n     * @param array $config Client configuration settings.\n     *\n     * @see \\GuzzleHttp\\RequestOptions for a list of available request options.\n     */\n    public function __construct(array $config = [])\n    {\n        if (!isset($config['handler'])) {\n            $config['handler'] = HandlerStack::create();\n        } elseif (!is_callable($config['handler'])) {\n            throw new \\InvalidArgumentException('handler must be a callable');\n        }\n\n        // Convert the base_uri to a UriInterface\n        if (isset($config['base_uri'])) {\n            $config['base_uri'] = Psr7\\uri_for($config['base_uri']);\n        }\n\n        $this->configureDefaults($config);\n    }\n\n    public function __call($method, $args)\n    {\n        if (count($args) < 1) {\n            throw new \\InvalidArgumentException('Magic request methods require a URI and optional options array');\n        }\n\n        $uri = $args[0];\n        $opts = isset($args[1]) ? $args[1] : [];\n\n        return substr($method, -5) === 'Async'\n            ? $this->requestAsync(substr($method, 0, -5), $uri, $opts)\n            : $this->request($method, $uri, $opts);\n    }\n\n    public function sendAsync(RequestInterface $request, array $options = [])\n    {\n        // Merge the base URI into the request URI if needed.\n        $options = $this->prepareDefaults($options);\n\n        return $this->transfer(\n            $request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')),\n            $options\n        );\n    }\n\n    public function send(RequestInterface $request, array $options = [])\n    {\n        $options[RequestOptions::SYNCHRONOUS] = true;\n        return $this->sendAsync($request, $options)->wait();\n    }\n\n    public function requestAsync($method, $uri = '', array $options = [])\n    {\n        $options = $this->prepareDefaults($options);\n        // Remove request modifying parameter because it can be done up-front.\n        $headers = isset($options['headers']) ? $options['headers'] : [];\n        $body = isset($options['body']) ? $options['body'] : null;\n        $version = isset($options['version']) ? $options['version'] : '1.1';\n        // Merge the URI into the base URI.\n        $uri = $this->buildUri($uri, $options);\n        if (is_array($body)) {\n            $this->invalidBody();\n        }\n        $request = new Psr7\\Request($method, $uri, $headers, $body, $version);\n        // Remove the option so that they are not doubly-applied.\n        unset($options['headers'], $options['body'], $options['version']);\n\n        return $this->transfer($request, $options);\n    }\n\n    public function request($method, $uri = '', array $options = [])\n    {\n        $options[RequestOptions::SYNCHRONOUS] = true;\n        return $this->requestAsync($method, $uri, $options)->wait();\n    }\n\n    public function getConfig($option = null)\n    {\n        return $option === null\n            ? $this->config\n            : (isset($this->config[$option]) ? $this->config[$option] : null);\n    }\n\n    private function buildUri($uri, array $config)\n    {\n        // for BC we accept null which would otherwise fail in uri_for\n        $uri = Psr7\\uri_for($uri === null ? '' : $uri);\n\n        if (isset($config['base_uri'])) {\n            $uri = Psr7\\UriResolver::resolve(Psr7\\uri_for($config['base_uri']), $uri);\n        }\n\n        return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri;\n    }\n\n    /**\n     * Configures the default options for a client.\n     *\n     * @param array $config\n     */\n    private function configureDefaults(array $config)\n    {\n        $defaults = [\n            'allow_redirects' => RedirectMiddleware::$defaultSettings,\n            'http_errors'     => true,\n            'decode_content'  => true,\n            'verify'          => true,\n            'cookies'         => false\n        ];\n\n        // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.\n\n        // We can only trust the HTTP_PROXY environment variable in a CLI\n        // process due to the fact that PHP has no reliable mechanism to\n        // get environment variables that start with \"HTTP_\".\n        if (php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) {\n            $defaults['proxy']['http'] = getenv('HTTP_PROXY');\n        }\n\n        if ($proxy = getenv('HTTPS_PROXY')) {\n            $defaults['proxy']['https'] = $proxy;\n        }\n\n        if ($noProxy = getenv('NO_PROXY')) {\n            $cleanedNoProxy = str_replace(' ', '', $noProxy);\n            $defaults['proxy']['no'] = explode(',', $cleanedNoProxy);\n        }\n\n        $this->config = $config + $defaults;\n\n        if (!empty($config['cookies']) && $config['cookies'] === true) {\n            $this->config['cookies'] = new CookieJar();\n        }\n\n        // Add the default user-agent header.\n        if (!isset($this->config['headers'])) {\n            $this->config['headers'] = ['User-Agent' => default_user_agent()];\n        } else {\n            // Add the User-Agent header if one was not already set.\n            foreach (array_keys($this->config['headers']) as $name) {\n                if (strtolower($name) === 'user-agent') {\n                    return;\n                }\n            }\n            $this->config['headers']['User-Agent'] = default_user_agent();\n        }\n    }\n\n    /**\n     * Merges default options into the array.\n     *\n     * @param array $options Options to modify by reference\n     *\n     * @return array\n     */\n    private function prepareDefaults($options)\n    {\n        $defaults = $this->config;\n\n        if (!empty($defaults['headers'])) {\n            // Default headers are only added if they are not present.\n            $defaults['_conditional'] = $defaults['headers'];\n            unset($defaults['headers']);\n        }\n\n        // Special handling for headers is required as they are added as\n        // conditional headers and as headers passed to a request ctor.\n        if (array_key_exists('headers', $options)) {\n            // Allows default headers to be unset.\n            if ($options['headers'] === null) {\n                $defaults['_conditional'] = null;\n                unset($options['headers']);\n            } elseif (!is_array($options['headers'])) {\n                throw new \\InvalidArgumentException('headers must be an array');\n            }\n        }\n\n        // Shallow merge defaults underneath options.\n        $result = $options + $defaults;\n\n        // Remove null values.\n        foreach ($result as $k => $v) {\n            if ($v === null) {\n                unset($result[$k]);\n            }\n        }\n\n        return $result;\n    }\n\n    /**\n     * Transfers the given request and applies request options.\n     *\n     * The URI of the request is not modified and the request options are used\n     * as-is without merging in default options.\n     *\n     * @param RequestInterface $request\n     * @param array            $options\n     *\n     * @return Promise\\PromiseInterface\n     */\n    private function transfer(RequestInterface $request, array $options)\n    {\n        // save_to -> sink\n        if (isset($options['save_to'])) {\n            $options['sink'] = $options['save_to'];\n            unset($options['save_to']);\n        }\n\n        // exceptions -> http_errors\n        if (isset($options['exceptions'])) {\n            $options['http_errors'] = $options['exceptions'];\n            unset($options['exceptions']);\n        }\n\n        $request = $this->applyOptions($request, $options);\n        $handler = $options['handler'];\n\n        try {\n            return Promise\\promise_for($handler($request, $options));\n        } catch (\\Exception $e) {\n            return Promise\\rejection_for($e);\n        }\n    }\n\n    /**\n     * Applies the array of request options to a request.\n     *\n     * @param RequestInterface $request\n     * @param array            $options\n     *\n     * @return RequestInterface\n     */\n    private function applyOptions(RequestInterface $request, array &$options)\n    {\n        $modify = [];\n\n        if (isset($options['form_params'])) {\n            if (isset($options['multipart'])) {\n                throw new \\InvalidArgumentException('You cannot use '\n                    . 'form_params and multipart at the same time. Use the '\n                    . 'form_params option if you want to send application/'\n                    . 'x-www-form-urlencoded requests, and the multipart '\n                    . 'option to send multipart/form-data requests.');\n            }\n            $options['body'] = http_build_query($options['form_params'], '', '&');\n            unset($options['form_params']);\n            $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded';\n        }\n\n        if (isset($options['multipart'])) {\n            $options['body'] = new Psr7\\MultipartStream($options['multipart']);\n            unset($options['multipart']);\n        }\n\n        if (isset($options['json'])) {\n            $options['body'] = \\GuzzleHttp\\json_encode($options['json']);\n            unset($options['json']);\n            $options['_conditional']['Content-Type'] = 'application/json';\n        }\n\n        if (!empty($options['decode_content'])\n            && $options['decode_content'] !== true\n        ) {\n            $modify['set_headers']['Accept-Encoding'] = $options['decode_content'];\n        }\n\n        if (isset($options['headers'])) {\n            if (isset($modify['set_headers'])) {\n                $modify['set_headers'] = $options['headers'] + $modify['set_headers'];\n            } else {\n                $modify['set_headers'] = $options['headers'];\n            }\n            unset($options['headers']);\n        }\n\n        if (isset($options['body'])) {\n            if (is_array($options['body'])) {\n                $this->invalidBody();\n            }\n            $modify['body'] = Psr7\\stream_for($options['body']);\n            unset($options['body']);\n        }\n\n        if (!empty($options['auth']) && is_array($options['auth'])) {\n            $value = $options['auth'];\n            $type = isset($value[2]) ? strtolower($value[2]) : 'basic';\n            switch ($type) {\n                case 'basic':\n                    $modify['set_headers']['Authorization'] = 'Basic '\n                        . base64_encode(\"$value[0]:$value[1]\");\n                    break;\n                case 'digest':\n                    // @todo: Do not rely on curl\n                    $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_DIGEST;\n                    $options['curl'][CURLOPT_USERPWD] = \"$value[0]:$value[1]\";\n                    break;\n                case 'ntlm':\n                    $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_NTLM;\n                    $options['curl'][CURLOPT_USERPWD] = \"$value[0]:$value[1]\";\n                    break;\n            }\n        }\n\n        if (isset($options['query'])) {\n            $value = $options['query'];\n            if (is_array($value)) {\n                $value = http_build_query($value, null, '&', PHP_QUERY_RFC3986);\n            }\n            if (!is_string($value)) {\n                throw new \\InvalidArgumentException('query must be a string or array');\n            }\n            $modify['query'] = $value;\n            unset($options['query']);\n        }\n\n        // Ensure that sink is not an invalid value.\n        if (isset($options['sink'])) {\n            // TODO: Add more sink validation?\n            if (is_bool($options['sink'])) {\n                throw new \\InvalidArgumentException('sink must not be a boolean');\n            }\n        }\n\n        $request = Psr7\\modify_request($request, $modify);\n        if ($request->getBody() instanceof Psr7\\MultipartStream) {\n            // Use a multipart/form-data POST if a Content-Type is not set.\n            $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary='\n                . $request->getBody()->getBoundary();\n        }\n\n        // Merge in conditional headers if they are not present.\n        if (isset($options['_conditional'])) {\n            // Build up the changes so it's in a single clone of the message.\n            $modify = [];\n            foreach ($options['_conditional'] as $k => $v) {\n                if (!$request->hasHeader($k)) {\n                    $modify['set_headers'][$k] = $v;\n                }\n            }\n            $request = Psr7\\modify_request($request, $modify);\n            // Don't pass this internal value along to middleware/handlers.\n            unset($options['_conditional']);\n        }\n\n        return $request;\n    }\n\n    private function invalidBody()\n    {\n        throw new \\InvalidArgumentException('Passing in the \"body\" request '\n            . 'option as an array to send a POST request has been deprecated. '\n            . 'Please use the \"form_params\" request option to send a '\n            . 'application/x-www-form-urlencoded request, or the \"multipart\" '\n            . 'request option to send a multipart/form-data request.');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/ClientInterface.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Client interface for sending HTTP requests.\n */\ninterface ClientInterface\n{\n    const VERSION = '6.2.1';\n\n    /**\n     * Send an HTTP request.\n     *\n     * @param RequestInterface $request Request to send\n     * @param array            $options Request options to apply to the given\n     *                                  request and to the transfer.\n     *\n     * @return ResponseInterface\n     * @throws GuzzleException\n     */\n    public function send(RequestInterface $request, array $options = []);\n\n    /**\n     * Asynchronously send an HTTP request.\n     *\n     * @param RequestInterface $request Request to send\n     * @param array            $options Request options to apply to the given\n     *                                  request and to the transfer.\n     *\n     * @return PromiseInterface\n     */\n    public function sendAsync(RequestInterface $request, array $options = []);\n\n    /**\n     * Create and send an HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string              $method  HTTP method.\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @return ResponseInterface\n     * @throws GuzzleException\n     */\n    public function request($method, $uri, array $options = []);\n\n    /**\n     * Create and send an asynchronous HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string              $method  HTTP method\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @return PromiseInterface\n     */\n    public function requestAsync($method, $uri, array $options = []);\n\n    /**\n     * Get a client configuration option.\n     *\n     * These options include default request options of the client, a \"handler\"\n     * (if utilized by the concrete client), and a \"base_uri\" if utilized by\n     * the concrete client.\n     *\n     * @param string|null $option The config option to retrieve.\n     *\n     * @return mixed\n     */\n    public function getConfig($option = null);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php",
    "content": "<?php\nnamespace GuzzleHttp\\Cookie;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Cookie jar that stores cookies as an array\n */\nclass CookieJar implements CookieJarInterface\n{\n    /** @var SetCookie[] Loaded cookie data */\n    private $cookies = [];\n\n    /** @var bool */\n    private $strictMode;\n\n    /**\n     * @param bool $strictMode   Set to true to throw exceptions when invalid\n     *                           cookies are added to the cookie jar.\n     * @param array $cookieArray Array of SetCookie objects or a hash of\n     *                           arrays that can be used with the SetCookie\n     *                           constructor\n     */\n    public function __construct($strictMode = false, $cookieArray = [])\n    {\n        $this->strictMode = $strictMode;\n\n        foreach ($cookieArray as $cookie) {\n            if (!($cookie instanceof SetCookie)) {\n                $cookie = new SetCookie($cookie);\n            }\n            $this->setCookie($cookie);\n        }\n    }\n\n    /**\n     * Create a new Cookie jar from an associative array and domain.\n     *\n     * @param array  $cookies Cookies to create the jar from\n     * @param string $domain  Domain to set the cookies to\n     *\n     * @return self\n     */\n    public static function fromArray(array $cookies, $domain)\n    {\n        $cookieJar = new self();\n        foreach ($cookies as $name => $value) {\n            $cookieJar->setCookie(new SetCookie([\n                'Domain'  => $domain,\n                'Name'    => $name,\n                'Value'   => $value,\n                'Discard' => true\n            ]));\n        }\n\n        return $cookieJar;\n    }\n\n    /**\n     * @deprecated\n     */\n    public static function getCookieValue($value)\n    {\n        return $value;\n    }\n\n    /**\n     * Evaluate if this cookie should be persisted to storage\n     * that survives between requests.\n     *\n     * @param SetCookie $cookie Being evaluated.\n     * @param bool $allowSessionCookies If we should persist session cookies\n     * @return bool\n     */\n    public static function shouldPersist(\n        SetCookie $cookie,\n        $allowSessionCookies = false\n    ) {\n        if ($cookie->getExpires() || $allowSessionCookies) {\n            if (!$cookie->getDiscard()) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Finds and returns the cookie based on the name\n     *\n     * @param string $name cookie name to search for\n     * @return SetCookie|null cookie that was found or null if not found\n     */\n    public function getCookieByName($name)\n    {\n        // don't allow a null name\n        if($name === null) {\n            return null;\n        }\n        foreach($this->cookies as $cookie) {\n            if($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) {\n                return $cookie;\n            }\n        }\n    }\n\n    public function toArray()\n    {\n        return array_map(function (SetCookie $cookie) {\n            return $cookie->toArray();\n        }, $this->getIterator()->getArrayCopy());\n    }\n\n    public function clear($domain = null, $path = null, $name = null)\n    {\n        if (!$domain) {\n            $this->cookies = [];\n            return;\n        } elseif (!$path) {\n            $this->cookies = array_filter(\n                $this->cookies,\n                function (SetCookie $cookie) use ($path, $domain) {\n                    return !$cookie->matchesDomain($domain);\n                }\n            );\n        } elseif (!$name) {\n            $this->cookies = array_filter(\n                $this->cookies,\n                function (SetCookie $cookie) use ($path, $domain) {\n                    return !($cookie->matchesPath($path) &&\n                        $cookie->matchesDomain($domain));\n                }\n            );\n        } else {\n            $this->cookies = array_filter(\n                $this->cookies,\n                function (SetCookie $cookie) use ($path, $domain, $name) {\n                    return !($cookie->getName() == $name &&\n                        $cookie->matchesPath($path) &&\n                        $cookie->matchesDomain($domain));\n                }\n            );\n        }\n    }\n\n    public function clearSessionCookies()\n    {\n        $this->cookies = array_filter(\n            $this->cookies,\n            function (SetCookie $cookie) {\n                return !$cookie->getDiscard() && $cookie->getExpires();\n            }\n        );\n    }\n\n    public function setCookie(SetCookie $cookie)\n    {\n        // If the name string is empty (but not 0), ignore the set-cookie\n        // string entirely.\n        $name = $cookie->getName();\n        if (!$name && $name !== '0') {\n            return false;\n        }\n\n        // Only allow cookies with set and valid domain, name, value\n        $result = $cookie->validate();\n        if ($result !== true) {\n            if ($this->strictMode) {\n                throw new \\RuntimeException('Invalid cookie: ' . $result);\n            } else {\n                $this->removeCookieIfEmpty($cookie);\n                return false;\n            }\n        }\n\n        // Resolve conflicts with previously set cookies\n        foreach ($this->cookies as $i => $c) {\n\n            // Two cookies are identical, when their path, and domain are\n            // identical.\n            if ($c->getPath() != $cookie->getPath() ||\n                $c->getDomain() != $cookie->getDomain() ||\n                $c->getName() != $cookie->getName()\n            ) {\n                continue;\n            }\n\n            // The previously set cookie is a discard cookie and this one is\n            // not so allow the new cookie to be set\n            if (!$cookie->getDiscard() && $c->getDiscard()) {\n                unset($this->cookies[$i]);\n                continue;\n            }\n\n            // If the new cookie's expiration is further into the future, then\n            // replace the old cookie\n            if ($cookie->getExpires() > $c->getExpires()) {\n                unset($this->cookies[$i]);\n                continue;\n            }\n\n            // If the value has changed, we better change it\n            if ($cookie->getValue() !== $c->getValue()) {\n                unset($this->cookies[$i]);\n                continue;\n            }\n\n            // The cookie exists, so no need to continue\n            return false;\n        }\n\n        $this->cookies[] = $cookie;\n\n        return true;\n    }\n\n    public function count()\n    {\n        return count($this->cookies);\n    }\n\n    public function getIterator()\n    {\n        return new \\ArrayIterator(array_values($this->cookies));\n    }\n\n    public function extractCookies(\n        RequestInterface $request,\n        ResponseInterface $response\n    ) {\n        if ($cookieHeader = $response->getHeader('Set-Cookie')) {\n            foreach ($cookieHeader as $cookie) {\n                $sc = SetCookie::fromString($cookie);\n                if (!$sc->getDomain()) {\n                    $sc->setDomain($request->getUri()->getHost());\n                }\n                if (0 !== strpos($sc->getPath(), '/')) {\n                    $sc->setPath($this->getCookiePathFromRequest($request));\n                }\n                $this->setCookie($sc);\n            }\n        }\n    }\n\n    /**\n     * Computes cookie path following RFC 6265 section 5.1.4\n     *\n     * @link https://tools.ietf.org/html/rfc6265#section-5.1.4\n     *\n     * @param RequestInterface $request\n     * @return string\n     */\n    private function getCookiePathFromRequest(RequestInterface $request)\n    {\n        $uriPath = $request->getUri()->getPath();\n        if (''  === $uriPath) {\n            return '/';\n        }\n        if (0 !== strpos($uriPath, '/')) {\n            return '/';\n        }\n        if ('/' === $uriPath) {\n            return '/';\n        }\n        if (0 === $lastSlashPos = strrpos($uriPath, '/')) {\n            return '/';\n        }\n\n        return substr($uriPath, 0, $lastSlashPos);\n    }\n\n    public function withCookieHeader(RequestInterface $request)\n    {\n        $values = [];\n        $uri = $request->getUri();\n        $scheme = $uri->getScheme();\n        $host = $uri->getHost();\n        $path = $uri->getPath() ?: '/';\n\n        foreach ($this->cookies as $cookie) {\n            if ($cookie->matchesPath($path) &&\n                $cookie->matchesDomain($host) &&\n                !$cookie->isExpired() &&\n                (!$cookie->getSecure() || $scheme === 'https')\n            ) {\n                $values[] = $cookie->getName() . '='\n                    . $cookie->getValue();\n            }\n        }\n\n        return $values\n            ? $request->withHeader('Cookie', implode('; ', $values))\n            : $request;\n    }\n\n    /**\n     * If a cookie already exists and the server asks to set it again with a\n     * null value, the cookie must be deleted.\n     *\n     * @param SetCookie $cookie\n     */\n    private function removeCookieIfEmpty(SetCookie $cookie)\n    {\n        $cookieValue = $cookie->getValue();\n        if ($cookieValue === null || $cookieValue === '') {\n            $this->clear(\n                $cookie->getDomain(),\n                $cookie->getPath(),\n                $cookie->getName()\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php",
    "content": "<?php\nnamespace GuzzleHttp\\Cookie;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Stores HTTP cookies.\n *\n * It extracts cookies from HTTP requests, and returns them in HTTP responses.\n * CookieJarInterface instances automatically expire contained cookies when\n * necessary. Subclasses are also responsible for storing and retrieving\n * cookies from a file, database, etc.\n *\n * @link http://docs.python.org/2/library/cookielib.html Inspiration\n */\ninterface CookieJarInterface extends \\Countable, \\IteratorAggregate\n{\n    /**\n     * Create a request with added cookie headers.\n     *\n     * If no matching cookies are found in the cookie jar, then no Cookie\n     * header is added to the request and the same request is returned.\n     *\n     * @param RequestInterface $request Request object to modify.\n     *\n     * @return RequestInterface returns the modified request.\n     */\n    public function withCookieHeader(RequestInterface $request);\n\n    /**\n     * Extract cookies from an HTTP response and store them in the CookieJar.\n     *\n     * @param RequestInterface  $request  Request that was sent\n     * @param ResponseInterface $response Response that was received\n     */\n    public function extractCookies(\n        RequestInterface $request,\n        ResponseInterface $response\n    );\n\n    /**\n     * Sets a cookie in the cookie jar.\n     *\n     * @param SetCookie $cookie Cookie to set.\n     *\n     * @return bool Returns true on success or false on failure\n     */\n    public function setCookie(SetCookie $cookie);\n\n    /**\n     * Remove cookies currently held in the cookie jar.\n     *\n     * Invoking this method without arguments will empty the whole cookie jar.\n     * If given a $domain argument only cookies belonging to that domain will\n     * be removed. If given a $domain and $path argument, cookies belonging to\n     * the specified path within that domain are removed. If given all three\n     * arguments, then the cookie with the specified name, path and domain is\n     * removed.\n     *\n     * @param string $domain Clears cookies matching a domain\n     * @param string $path   Clears cookies matching a domain and path\n     * @param string $name   Clears cookies matching a domain, path, and name\n     *\n     * @return CookieJarInterface\n     */\n    public function clear($domain = null, $path = null, $name = null);\n\n    /**\n     * Discard all sessions cookies.\n     *\n     * Removes cookies that don't have an expire field or a have a discard\n     * field set to true. To be called when the user agent shuts down according\n     * to RFC 2965.\n     */\n    public function clearSessionCookies();\n\n    /**\n     * Converts the cookie jar to an array.\n     *\n     * @return array\n     */\n    public function toArray();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php",
    "content": "<?php\nnamespace GuzzleHttp\\Cookie;\n\n/**\n * Persists non-session cookies using a JSON formatted file\n */\nclass FileCookieJar extends CookieJar\n{\n    /** @var string filename */\n    private $filename;\n\n    /** @var bool Control whether to persist session cookies or not. */\n    private $storeSessionCookies;\n\n    /**\n     * Create a new FileCookieJar object\n     *\n     * @param string $cookieFile        File to store the cookie data\n     * @param bool $storeSessionCookies Set to true to store session cookies\n     *                                  in the cookie jar.\n     *\n     * @throws \\RuntimeException if the file cannot be found or created\n     */\n    public function __construct($cookieFile, $storeSessionCookies = false)\n    {\n        $this->filename = $cookieFile;\n        $this->storeSessionCookies = $storeSessionCookies;\n\n        if (file_exists($cookieFile)) {\n            $this->load($cookieFile);\n        }\n    }\n\n    /**\n     * Saves the file when shutting down\n     */\n    public function __destruct()\n    {\n        $this->save($this->filename);\n    }\n\n    /**\n     * Saves the cookies to a file.\n     *\n     * @param string $filename File to save\n     * @throws \\RuntimeException if the file cannot be found or created\n     */\n    public function save($filename)\n    {\n        $json = [];\n        foreach ($this as $cookie) {\n            /** @var SetCookie $cookie */\n            if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {\n                $json[] = $cookie->toArray();\n            }\n        }\n\n        $jsonStr = \\GuzzleHttp\\json_encode($json);\n        if (false === file_put_contents($filename, $jsonStr)) {\n            throw new \\RuntimeException(\"Unable to save file {$filename}\");\n        }\n    }\n\n    /**\n     * Load cookies from a JSON formatted file.\n     *\n     * Old cookies are kept unless overwritten by newly loaded ones.\n     *\n     * @param string $filename Cookie file to load.\n     * @throws \\RuntimeException if the file cannot be loaded.\n     */\n    public function load($filename)\n    {\n        $json = file_get_contents($filename);\n        if (false === $json) {\n            throw new \\RuntimeException(\"Unable to load file {$filename}\");\n        } elseif ($json === '') {\n            return;\n        }\n\n        $data = \\GuzzleHttp\\json_decode($json, true);\n        if (is_array($data)) {\n            foreach (json_decode($json, true) as $cookie) {\n                $this->setCookie(new SetCookie($cookie));\n            }\n        } elseif (strlen($data)) {\n            throw new \\RuntimeException(\"Invalid cookie file: {$filename}\");\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php",
    "content": "<?php\nnamespace GuzzleHttp\\Cookie;\n\n/**\n * Persists cookies in the client session\n */\nclass SessionCookieJar extends CookieJar\n{\n    /** @var string session key */\n    private $sessionKey;\n    \n    /** @var bool Control whether to persist session cookies or not. */\n    private $storeSessionCookies;\n\n    /**\n     * Create a new SessionCookieJar object\n     *\n     * @param string $sessionKey        Session key name to store the cookie \n     *                                  data in session\n     * @param bool $storeSessionCookies Set to true to store session cookies\n     *                                  in the cookie jar.\n     */\n    public function __construct($sessionKey, $storeSessionCookies = false)\n    {\n        $this->sessionKey = $sessionKey;\n        $this->storeSessionCookies = $storeSessionCookies;\n        $this->load();\n    }\n\n    /**\n     * Saves cookies to session when shutting down\n     */\n    public function __destruct()\n    {\n        $this->save();\n    }\n\n    /**\n     * Save cookies to the client session\n     */\n    public function save()\n    {\n        $json = [];\n        foreach ($this as $cookie) {\n            /** @var SetCookie $cookie */\n            if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {\n                $json[] = $cookie->toArray();\n            }\n        }\n\n        $_SESSION[$this->sessionKey] = json_encode($json);\n    }\n\n    /**\n     * Load the contents of the client session into the data array\n     */\n    protected function load()\n    {\n        if (!isset($_SESSION[$this->sessionKey])) {\n            return;\n        }\n        $data = json_decode($_SESSION[$this->sessionKey], true);\n        if (is_array($data)) {\n            foreach ($data as $cookie) {\n                $this->setCookie(new SetCookie($cookie));\n            }\n        } elseif (strlen($data)) {\n            throw new \\RuntimeException(\"Invalid cookie data\");\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php",
    "content": "<?php\nnamespace GuzzleHttp\\Cookie;\n\n/**\n * Set-Cookie object\n */\nclass SetCookie\n{\n    /** @var array */\n    private static $defaults = [\n        'Name'     => null,\n        'Value'    => null,\n        'Domain'   => null,\n        'Path'     => '/',\n        'Max-Age'  => null,\n        'Expires'  => null,\n        'Secure'   => false,\n        'Discard'  => false,\n        'HttpOnly' => false\n    ];\n\n    /** @var array Cookie data */\n    private $data;\n\n    /**\n     * Create a new SetCookie object from a string\n     *\n     * @param string $cookie Set-Cookie header string\n     *\n     * @return self\n     */\n    public static function fromString($cookie)\n    {\n        // Create the default return array\n        $data = self::$defaults;\n        // Explode the cookie string using a series of semicolons\n        $pieces = array_filter(array_map('trim', explode(';', $cookie)));\n        // The name of the cookie (first kvp) must include an equal sign.\n        if (empty($pieces) || !strpos($pieces[0], '=')) {\n            return new self($data);\n        }\n\n        // Add the cookie pieces into the parsed data array\n        foreach ($pieces as $part) {\n\n            $cookieParts = explode('=', $part, 2);\n            $key = trim($cookieParts[0]);\n            $value = isset($cookieParts[1])\n                ? trim($cookieParts[1], \" \\n\\r\\t\\0\\x0B\")\n                : true;\n\n            // Only check for non-cookies when cookies have been found\n            if (empty($data['Name'])) {\n                $data['Name'] = $key;\n                $data['Value'] = $value;\n            } else {\n                foreach (array_keys(self::$defaults) as $search) {\n                    if (!strcasecmp($search, $key)) {\n                        $data[$search] = $value;\n                        continue 2;\n                    }\n                }\n                $data[$key] = $value;\n            }\n        }\n\n        return new self($data);\n    }\n\n    /**\n     * @param array $data Array of cookie data provided by a Cookie parser\n     */\n    public function __construct(array $data = [])\n    {\n        $this->data = array_replace(self::$defaults, $data);\n        // Extract the Expires value and turn it into a UNIX timestamp if needed\n        if (!$this->getExpires() && $this->getMaxAge()) {\n            // Calculate the Expires date\n            $this->setExpires(time() + $this->getMaxAge());\n        } elseif ($this->getExpires() && !is_numeric($this->getExpires())) {\n            $this->setExpires($this->getExpires());\n        }\n    }\n\n    public function __toString()\n    {\n        $str = $this->data['Name'] . '=' . $this->data['Value'] . '; ';\n        foreach ($this->data as $k => $v) {\n            if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) {\n                if ($k === 'Expires') {\n                    $str .= 'Expires=' . gmdate('D, d M Y H:i:s \\G\\M\\T', $v) . '; ';\n                } else {\n                    $str .= ($v === true ? $k : \"{$k}={$v}\") . '; ';\n                }\n            }\n        }\n\n        return rtrim($str, '; ');\n    }\n\n    public function toArray()\n    {\n        return $this->data;\n    }\n\n    /**\n     * Get the cookie name\n     *\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->data['Name'];\n    }\n\n    /**\n     * Set the cookie name\n     *\n     * @param string $name Cookie name\n     */\n    public function setName($name)\n    {\n        $this->data['Name'] = $name;\n    }\n\n    /**\n     * Get the cookie value\n     *\n     * @return string\n     */\n    public function getValue()\n    {\n        return $this->data['Value'];\n    }\n\n    /**\n     * Set the cookie value\n     *\n     * @param string $value Cookie value\n     */\n    public function setValue($value)\n    {\n        $this->data['Value'] = $value;\n    }\n\n    /**\n     * Get the domain\n     *\n     * @return string|null\n     */\n    public function getDomain()\n    {\n        return $this->data['Domain'];\n    }\n\n    /**\n     * Set the domain of the cookie\n     *\n     * @param string $domain\n     */\n    public function setDomain($domain)\n    {\n        $this->data['Domain'] = $domain;\n    }\n\n    /**\n     * Get the path\n     *\n     * @return string\n     */\n    public function getPath()\n    {\n        return $this->data['Path'];\n    }\n\n    /**\n     * Set the path of the cookie\n     *\n     * @param string $path Path of the cookie\n     */\n    public function setPath($path)\n    {\n        $this->data['Path'] = $path;\n    }\n\n    /**\n     * Maximum lifetime of the cookie in seconds\n     *\n     * @return int|null\n     */\n    public function getMaxAge()\n    {\n        return $this->data['Max-Age'];\n    }\n\n    /**\n     * Set the max-age of the cookie\n     *\n     * @param int $maxAge Max age of the cookie in seconds\n     */\n    public function setMaxAge($maxAge)\n    {\n        $this->data['Max-Age'] = $maxAge;\n    }\n\n    /**\n     * The UNIX timestamp when the cookie Expires\n     *\n     * @return mixed\n     */\n    public function getExpires()\n    {\n        return $this->data['Expires'];\n    }\n\n    /**\n     * Set the unix timestamp for which the cookie will expire\n     *\n     * @param int $timestamp Unix timestamp\n     */\n    public function setExpires($timestamp)\n    {\n        $this->data['Expires'] = is_numeric($timestamp)\n            ? (int) $timestamp\n            : strtotime($timestamp);\n    }\n\n    /**\n     * Get whether or not this is a secure cookie\n     *\n     * @return null|bool\n     */\n    public function getSecure()\n    {\n        return $this->data['Secure'];\n    }\n\n    /**\n     * Set whether or not the cookie is secure\n     *\n     * @param bool $secure Set to true or false if secure\n     */\n    public function setSecure($secure)\n    {\n        $this->data['Secure'] = $secure;\n    }\n\n    /**\n     * Get whether or not this is a session cookie\n     *\n     * @return null|bool\n     */\n    public function getDiscard()\n    {\n        return $this->data['Discard'];\n    }\n\n    /**\n     * Set whether or not this is a session cookie\n     *\n     * @param bool $discard Set to true or false if this is a session cookie\n     */\n    public function setDiscard($discard)\n    {\n        $this->data['Discard'] = $discard;\n    }\n\n    /**\n     * Get whether or not this is an HTTP only cookie\n     *\n     * @return bool\n     */\n    public function getHttpOnly()\n    {\n        return $this->data['HttpOnly'];\n    }\n\n    /**\n     * Set whether or not this is an HTTP only cookie\n     *\n     * @param bool $httpOnly Set to true or false if this is HTTP only\n     */\n    public function setHttpOnly($httpOnly)\n    {\n        $this->data['HttpOnly'] = $httpOnly;\n    }\n\n    /**\n     * Check if the cookie matches a path value.\n     *\n     * A request-path path-matches a given cookie-path if at least one of\n     * the following conditions holds:\n     *\n     * - The cookie-path and the request-path are identical.\n     * - The cookie-path is a prefix of the request-path, and the last\n     *   character of the cookie-path is %x2F (\"/\").\n     * - The cookie-path is a prefix of the request-path, and the first\n     *   character of the request-path that is not included in the cookie-\n     *   path is a %x2F (\"/\") character.\n     *\n     * @param string $requestPath Path to check against\n     *\n     * @return bool\n     */\n    public function matchesPath($requestPath)\n    {\n        $cookiePath = $this->getPath();\n\n        // Match on exact matches or when path is the default empty \"/\"\n        if ($cookiePath === '/' || $cookiePath == $requestPath) {\n            return true;\n        }\n\n        // Ensure that the cookie-path is a prefix of the request path.\n        if (0 !== strpos($requestPath, $cookiePath)) {\n            return false;\n        }\n\n        // Match if the last character of the cookie-path is \"/\"\n        if (substr($cookiePath, -1, 1) === '/') {\n            return true;\n        }\n\n        // Match if the first character not included in cookie path is \"/\"\n        return substr($requestPath, strlen($cookiePath), 1) === '/';\n    }\n\n    /**\n     * Check if the cookie matches a domain value\n     *\n     * @param string $domain Domain to check against\n     *\n     * @return bool\n     */\n    public function matchesDomain($domain)\n    {\n        // Remove the leading '.' as per spec in RFC 6265.\n        // http://tools.ietf.org/html/rfc6265#section-5.2.3\n        $cookieDomain = ltrim($this->getDomain(), '.');\n\n        // Domain not set or exact match.\n        if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) {\n            return true;\n        }\n\n        // Matching the subdomain according to RFC 6265.\n        // http://tools.ietf.org/html/rfc6265#section-5.1.3\n        if (filter_var($domain, FILTER_VALIDATE_IP)) {\n            return false;\n        }\n\n        return (bool) preg_match('/\\.' . preg_quote($cookieDomain) . '$/', $domain);\n    }\n\n    /**\n     * Check if the cookie is expired\n     *\n     * @return bool\n     */\n    public function isExpired()\n    {\n        return $this->getExpires() && time() > $this->getExpires();\n    }\n\n    /**\n     * Check if the cookie is valid according to RFC 6265\n     *\n     * @return bool|string Returns true if valid or an error message if invalid\n     */\n    public function validate()\n    {\n        // Names must not be empty, but can be 0\n        $name = $this->getName();\n        if (empty($name) && !is_numeric($name)) {\n            return 'The cookie name must not be empty';\n        }\n\n        // Check if any of the invalid characters are present in the cookie name\n        if (preg_match(\n            '/[\\x00-\\x20\\x22\\x28-\\x29\\x2c\\x2f\\x3a-\\x40\\x5c\\x7b\\x7d\\x7f]/',\n            $name)\n        ) {\n            return 'Cookie name must not contain invalid characters: ASCII '\n                . 'Control characters (0-31;127), space, tab and the '\n                . 'following characters: ()<>@,;:\\\"/?={}';\n        }\n\n        // Value must not be empty, but can be 0\n        $value = $this->getValue();\n        if (empty($value) && !is_numeric($value)) {\n            return 'The cookie value must not be empty';\n        }\n\n        // Domains must not be empty, but can be 0\n        // A \"0\" is not a valid internet domain, but may be used as server name\n        // in a private network.\n        $domain = $this->getDomain();\n        if (empty($domain) && !is_numeric($domain)) {\n            return 'The cookie domain must not be empty';\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Exception when an HTTP error occurs (4xx or 5xx error)\n */\nclass BadResponseException extends RequestException\n{\n    public function __construct(\n        $message,\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        \\Exception $previous = null,\n        array $handlerContext = []\n    ) {\n        if (null === $response) {\n            @trigger_error(\n                'Instantiating the ' . __CLASS__ . ' class without a Response is deprecated since version 6.3 and will be removed in 7.0.',\n                E_USER_DEPRECATED\n            );\n        }\n        parent::__construct($message, $request, $response, $previous, $handlerContext);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\n/**\n * Exception when a client error is encountered (4xx codes)\n */\nclass ClientException extends BadResponseException {}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Exception thrown when a connection cannot be established.\n *\n * Note that no response is present for a ConnectException\n */\nclass ConnectException extends RequestException\n{\n    public function __construct(\n        $message,\n        RequestInterface $request,\n        \\Exception $previous = null,\n        array $handlerContext = []\n    ) {\n        parent::__construct($message, $request, null, $previous, $handlerContext);\n    }\n\n    /**\n     * @return null\n     */\n    public function getResponse()\n    {\n        return null;\n    }\n\n    /**\n     * @return bool\n     */\n    public function hasResponse()\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\ninterface GuzzleException {}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * HTTP Request exception\n */\nclass RequestException extends TransferException\n{\n    /** @var RequestInterface */\n    private $request;\n\n    /** @var ResponseInterface */\n    private $response;\n\n    /** @var array */\n    private $handlerContext;\n\n    public function __construct(\n        $message,\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        \\Exception $previous = null,\n        array $handlerContext = []\n    ) {\n        // Set the code of the exception if the response is set and not future.\n        $code = $response && !($response instanceof PromiseInterface)\n            ? $response->getStatusCode()\n            : 0;\n        parent::__construct($message, $code, $previous);\n        $this->request = $request;\n        $this->response = $response;\n        $this->handlerContext = $handlerContext;\n    }\n\n    /**\n     * Wrap non-RequestExceptions with a RequestException\n     *\n     * @param RequestInterface $request\n     * @param \\Exception       $e\n     *\n     * @return RequestException\n     */\n    public static function wrapException(RequestInterface $request, \\Exception $e)\n    {\n        return $e instanceof RequestException\n            ? $e\n            : new RequestException($e->getMessage(), $request, null, $e);\n    }\n\n    /**\n     * Factory method to create a new exception with a normalized error message\n     *\n     * @param RequestInterface  $request  Request\n     * @param ResponseInterface $response Response received\n     * @param \\Exception        $previous Previous exception\n     * @param array             $ctx      Optional handler context.\n     *\n     * @return self\n     */\n    public static function create(\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        \\Exception $previous = null,\n        array $ctx = []\n    ) {\n        if (!$response) {\n            return new self(\n                'Error completing request',\n                $request,\n                null,\n                $previous,\n                $ctx\n            );\n        }\n\n        $level = (int) floor($response->getStatusCode() / 100);\n        if ($level === 4) {\n            $label = 'Client error';\n            $className = ClientException::class;\n        } elseif ($level === 5) {\n            $label = 'Server error';\n            $className = ServerException::class;\n        } else {\n            $label = 'Unsuccessful request';\n            $className = __CLASS__;\n        }\n\n        $uri = $request->getUri();\n        $uri = static::obfuscateUri($uri);\n\n        // Client Error: `GET /` resulted in a `404 Not Found` response:\n        // <html> ... (truncated)\n        $message = sprintf(\n            '%s: `%s %s` resulted in a `%s %s` response',\n            $label,\n            $request->getMethod(),\n            $uri,\n            $response->getStatusCode(),\n            $response->getReasonPhrase()\n        );\n\n        $summary = static::getResponseBodySummary($response);\n\n        if ($summary !== null) {\n            $message .= \":\\n{$summary}\\n\";\n        }\n\n        return new $className($message, $request, $response, $previous, $ctx);\n    }\n\n    /**\n     * Get a short summary of the response\n     *\n     * Will return `null` if the response is not printable.\n     *\n     * @param ResponseInterface $response\n     *\n     * @return string|null\n     */\n    public static function getResponseBodySummary(ResponseInterface $response)\n    {\n        $body = $response->getBody();\n\n        if (!$body->isSeekable()) {\n            return null;\n        }\n\n        $size = $body->getSize();\n\n        if ($size === 0) {\n            return null;\n        }\n\n        $summary = $body->read(120);\n        $body->rewind();\n\n        if ($size > 120) {\n            $summary .= ' (truncated...)';\n        }\n\n        // Matches any printable character, including unicode characters:\n        // letters, marks, numbers, punctuation, spacing, and separators.\n        if (preg_match('/[^\\pL\\pM\\pN\\pP\\pS\\pZ\\n\\r\\t]/', $summary)) {\n            return null;\n        }\n\n        return $summary;\n    }\n\n    /**\n     * Obfuscates URI if there is an username and a password present\n     *\n     * @param UriInterface $uri\n     *\n     * @return UriInterface\n     */\n    private static function obfuscateUri($uri)\n    {\n        $userInfo = $uri->getUserInfo();\n\n        if (false !== ($pos = strpos($userInfo, ':'))) {\n            return $uri->withUserInfo(substr($userInfo, 0, $pos), '***');\n        }\n\n        return $uri;\n    }\n\n    /**\n     * Get the request that caused the exception\n     *\n     * @return RequestInterface\n     */\n    public function getRequest()\n    {\n        return $this->request;\n    }\n\n    /**\n     * Get the associated response\n     *\n     * @return ResponseInterface|null\n     */\n    public function getResponse()\n    {\n        return $this->response;\n    }\n\n    /**\n     * Check if a response was received\n     *\n     * @return bool\n     */\n    public function hasResponse()\n    {\n        return $this->response !== null;\n    }\n\n    /**\n     * Get contextual information about the error from the underlying handler.\n     *\n     * The contents of this array will vary depending on which handler you are\n     * using. It may also be just an empty array. Relying on this data will\n     * couple you to a specific handler, but can give more debug information\n     * when needed.\n     *\n     * @return array\n     */\n    public function getHandlerContext()\n    {\n        return $this->handlerContext;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Exception thrown when a seek fails on a stream.\n */\nclass SeekException extends \\RuntimeException implements GuzzleException\n{\n    private $stream;\n\n    public function __construct(StreamInterface $stream, $pos = 0, $msg = '')\n    {\n        $this->stream = $stream;\n        $msg = $msg ?: 'Could not seek the stream to position ' . $pos;\n        parent::__construct($msg);\n    }\n\n    /**\n     * @return StreamInterface\n     */\n    public function getStream()\n    {\n        return $this->stream;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\n/**\n * Exception when a server error is encountered (5xx codes)\n */\nclass ServerException extends BadResponseException {}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nclass TooManyRedirectsException extends RequestException {}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nclass TransferException extends \\RuntimeException implements GuzzleException {}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Exception\\ConnectException;\nuse GuzzleHttp\\Promise\\FulfilledPromise;\nuse GuzzleHttp\\Promise\\RejectedPromise;\nuse GuzzleHttp\\Psr7;\nuse GuzzleHttp\\Psr7\\LazyOpenStream;\nuse GuzzleHttp\\TransferStats;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Creates curl resources from a request\n */\nclass CurlFactory implements CurlFactoryInterface\n{\n    /** @var array */\n    private $handles = [];\n\n    /** @var int Total number of idle handles to keep in cache */\n    private $maxHandles;\n\n    /**\n     * @param int $maxHandles Maximum number of idle handles.\n     */\n    public function __construct($maxHandles)\n    {\n        $this->maxHandles = $maxHandles;\n    }\n\n    public function create(RequestInterface $request, array $options)\n    {\n        if (isset($options['curl']['body_as_string'])) {\n            $options['_body_as_string'] = $options['curl']['body_as_string'];\n            unset($options['curl']['body_as_string']);\n        }\n\n        $easy = new EasyHandle;\n        $easy->request = $request;\n        $easy->options = $options;\n        $conf = $this->getDefaultConf($easy);\n        $this->applyMethod($easy, $conf);\n        $this->applyHandlerOptions($easy, $conf);\n        $this->applyHeaders($easy, $conf);\n        unset($conf['_headers']);\n\n        // Add handler options from the request configuration options\n        if (isset($options['curl'])) {\n            $conf = array_replace($conf, $options['curl']);\n        }\n\n        $conf[CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy);\n        $easy->handle = $this->handles\n            ? array_pop($this->handles)\n            : curl_init();\n        curl_setopt_array($easy->handle, $conf);\n\n        return $easy;\n    }\n\n    public function release(EasyHandle $easy)\n    {\n        $resource = $easy->handle;\n        unset($easy->handle);\n\n        if (count($this->handles) >= $this->maxHandles) {\n            curl_close($resource);\n        } else {\n            // Remove all callback functions as they can hold onto references\n            // and are not cleaned up by curl_reset. Using curl_setopt_array\n            // does not work for some reason, so removing each one\n            // individually.\n            curl_setopt($resource, CURLOPT_HEADERFUNCTION, null);\n            curl_setopt($resource, CURLOPT_READFUNCTION, null);\n            curl_setopt($resource, CURLOPT_WRITEFUNCTION, null);\n            curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, null);\n            curl_reset($resource);\n            $this->handles[] = $resource;\n        }\n    }\n\n    /**\n     * Completes a cURL transaction, either returning a response promise or a\n     * rejected promise.\n     *\n     * @param callable             $handler\n     * @param EasyHandle           $easy\n     * @param CurlFactoryInterface $factory Dictates how the handle is released\n     *\n     * @return \\GuzzleHttp\\Promise\\PromiseInterface\n     */\n    public static function finish(\n        callable $handler,\n        EasyHandle $easy,\n        CurlFactoryInterface $factory\n    ) {\n        if (isset($easy->options['on_stats'])) {\n            self::invokeStats($easy);\n        }\n\n        if (!$easy->response || $easy->errno) {\n            return self::finishError($handler, $easy, $factory);\n        }\n\n        // Return the response if it is present and there is no error.\n        $factory->release($easy);\n\n        // Rewind the body of the response if possible.\n        $body = $easy->response->getBody();\n        if ($body->isSeekable()) {\n            $body->rewind();\n        }\n\n        return new FulfilledPromise($easy->response);\n    }\n\n    private static function invokeStats(EasyHandle $easy)\n    {\n        $curlStats = curl_getinfo($easy->handle);\n        $stats = new TransferStats(\n            $easy->request,\n            $easy->response,\n            $curlStats['total_time'],\n            $easy->errno,\n            $curlStats\n        );\n        call_user_func($easy->options['on_stats'], $stats);\n    }\n\n    private static function finishError(\n        callable $handler,\n        EasyHandle $easy,\n        CurlFactoryInterface $factory\n    ) {\n        // Get error information and release the handle to the factory.\n        $ctx = [\n            'errno' => $easy->errno,\n            'error' => curl_error($easy->handle),\n        ] + curl_getinfo($easy->handle);\n        $factory->release($easy);\n\n        // Retry when nothing is present or when curl failed to rewind.\n        if (empty($easy->options['_err_message'])\n            && (!$easy->errno || $easy->errno == 65)\n        ) {\n            return self::retryFailedRewind($handler, $easy, $ctx);\n        }\n\n        return self::createRejection($easy, $ctx);\n    }\n\n    private static function createRejection(EasyHandle $easy, array $ctx)\n    {\n        static $connectionErrors = [\n            CURLE_OPERATION_TIMEOUTED  => true,\n            CURLE_COULDNT_RESOLVE_HOST => true,\n            CURLE_COULDNT_CONNECT      => true,\n            CURLE_SSL_CONNECT_ERROR    => true,\n            CURLE_GOT_NOTHING          => true,\n        ];\n\n        // If an exception was encountered during the onHeaders event, then\n        // return a rejected promise that wraps that exception.\n        if ($easy->onHeadersException) {\n            return \\GuzzleHttp\\Promise\\rejection_for(\n                new RequestException(\n                    'An error was encountered during the on_headers event',\n                    $easy->request,\n                    $easy->response,\n                    $easy->onHeadersException,\n                    $ctx\n                )\n            );\n        }\n\n        $message = sprintf(\n            'cURL error %s: %s (%s)',\n            $ctx['errno'],\n            $ctx['error'],\n            'see http://curl.haxx.se/libcurl/c/libcurl-errors.html'\n        );\n\n        // Create a connection exception if it was a specific error code.\n        $error = isset($connectionErrors[$easy->errno])\n            ? new ConnectException($message, $easy->request, null, $ctx)\n            : new RequestException($message, $easy->request, $easy->response, null, $ctx);\n\n        return \\GuzzleHttp\\Promise\\rejection_for($error);\n    }\n\n    private function getDefaultConf(EasyHandle $easy)\n    {\n        $conf = [\n            '_headers'             => $easy->request->getHeaders(),\n            CURLOPT_CUSTOMREQUEST  => $easy->request->getMethod(),\n            CURLOPT_URL            => (string) $easy->request->getUri()->withFragment(''),\n            CURLOPT_RETURNTRANSFER => false,\n            CURLOPT_HEADER         => false,\n            CURLOPT_CONNECTTIMEOUT => 150,\n        ];\n\n        if (defined('CURLOPT_PROTOCOLS')) {\n            $conf[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS;\n        }\n\n        $version = $easy->request->getProtocolVersion();\n        if ($version == 1.1) {\n            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1;\n        } elseif ($version == 2.0) {\n            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2_0;\n        } else {\n            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0;\n        }\n\n        return $conf;\n    }\n\n    private function applyMethod(EasyHandle $easy, array &$conf)\n    {\n        $body = $easy->request->getBody();\n        $size = $body->getSize();\n\n        if ($size === null || $size > 0) {\n            $this->applyBody($easy->request, $easy->options, $conf);\n            return;\n        }\n\n        $method = $easy->request->getMethod();\n        if ($method === 'PUT' || $method === 'POST') {\n            // See http://tools.ietf.org/html/rfc7230#section-3.3.2\n            if (!$easy->request->hasHeader('Content-Length')) {\n                $conf[CURLOPT_HTTPHEADER][] = 'Content-Length: 0';\n            }\n        } elseif ($method === 'HEAD') {\n            $conf[CURLOPT_NOBODY] = true;\n            unset(\n                $conf[CURLOPT_WRITEFUNCTION],\n                $conf[CURLOPT_READFUNCTION],\n                $conf[CURLOPT_FILE],\n                $conf[CURLOPT_INFILE]\n            );\n        }\n    }\n\n    private function applyBody(RequestInterface $request, array $options, array &$conf)\n    {\n        $size = $request->hasHeader('Content-Length')\n            ? (int) $request->getHeaderLine('Content-Length')\n            : null;\n\n        // Send the body as a string if the size is less than 1MB OR if the\n        // [curl][body_as_string] request value is set.\n        if (($size !== null && $size < 1000000) ||\n            !empty($options['_body_as_string'])\n        ) {\n            $conf[CURLOPT_POSTFIELDS] = (string) $request->getBody();\n            // Don't duplicate the Content-Length header\n            $this->removeHeader('Content-Length', $conf);\n            $this->removeHeader('Transfer-Encoding', $conf);\n        } else {\n            $conf[CURLOPT_UPLOAD] = true;\n            if ($size !== null) {\n                $conf[CURLOPT_INFILESIZE] = $size;\n                $this->removeHeader('Content-Length', $conf);\n            }\n            $body = $request->getBody();\n            if ($body->isSeekable()) {\n                $body->rewind();\n            }\n            $conf[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) {\n                return $body->read($length);\n            };\n        }\n\n        // If the Expect header is not present, prevent curl from adding it\n        if (!$request->hasHeader('Expect')) {\n            $conf[CURLOPT_HTTPHEADER][] = 'Expect:';\n        }\n\n        // cURL sometimes adds a content-type by default. Prevent this.\n        if (!$request->hasHeader('Content-Type')) {\n            $conf[CURLOPT_HTTPHEADER][] = 'Content-Type:';\n        }\n    }\n\n    private function applyHeaders(EasyHandle $easy, array &$conf)\n    {\n        foreach ($conf['_headers'] as $name => $values) {\n            foreach ($values as $value) {\n                $conf[CURLOPT_HTTPHEADER][] = \"$name: $value\";\n            }\n        }\n\n        // Remove the Accept header if one was not set\n        if (!$easy->request->hasHeader('Accept')) {\n            $conf[CURLOPT_HTTPHEADER][] = 'Accept:';\n        }\n    }\n\n    /**\n     * Remove a header from the options array.\n     *\n     * @param string $name    Case-insensitive header to remove\n     * @param array  $options Array of options to modify\n     */\n    private function removeHeader($name, array &$options)\n    {\n        foreach (array_keys($options['_headers']) as $key) {\n            if (!strcasecmp($key, $name)) {\n                unset($options['_headers'][$key]);\n                return;\n            }\n        }\n    }\n\n    private function applyHandlerOptions(EasyHandle $easy, array &$conf)\n    {\n        $options = $easy->options;\n        if (isset($options['verify'])) {\n            if ($options['verify'] === false) {\n                unset($conf[CURLOPT_CAINFO]);\n                $conf[CURLOPT_SSL_VERIFYHOST] = 0;\n                $conf[CURLOPT_SSL_VERIFYPEER] = false;\n            } else {\n                $conf[CURLOPT_SSL_VERIFYHOST] = 2;\n                $conf[CURLOPT_SSL_VERIFYPEER] = true;\n                if (is_string($options['verify'])) {\n                    // Throw an error if the file/folder/link path is not valid or doesn't exist.\n                    if (!file_exists($options['verify'])) {\n                        throw new \\InvalidArgumentException(\n                            \"SSL CA bundle not found: {$options['verify']}\"\n                        );\n                    }\n                    // If it's a directory or a link to a directory use CURLOPT_CAPATH.\n                    // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.\n                    if (is_dir($options['verify']) ||\n                        (is_link($options['verify']) && is_dir(readlink($options['verify'])))) {\n                        $conf[CURLOPT_CAPATH] = $options['verify'];\n                    } else {\n                        $conf[CURLOPT_CAINFO] = $options['verify'];\n                    }\n                }\n            }\n        }\n\n        if (!empty($options['decode_content'])) {\n            $accept = $easy->request->getHeaderLine('Accept-Encoding');\n            if ($accept) {\n                $conf[CURLOPT_ENCODING] = $accept;\n            } else {\n                $conf[CURLOPT_ENCODING] = '';\n                // Don't let curl send the header over the wire\n                $conf[CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';\n            }\n        }\n\n        if (isset($options['sink'])) {\n            $sink = $options['sink'];\n            if (!is_string($sink)) {\n                $sink = \\GuzzleHttp\\Psr7\\stream_for($sink);\n            } elseif (!is_dir(dirname($sink))) {\n                // Ensure that the directory exists before failing in curl.\n                throw new \\RuntimeException(sprintf(\n                    'Directory %s does not exist for sink value of %s',\n                    dirname($sink),\n                    $sink\n                ));\n            } else {\n                $sink = new LazyOpenStream($sink, 'w+');\n            }\n            $easy->sink = $sink;\n            $conf[CURLOPT_WRITEFUNCTION] = function ($ch, $write) use ($sink) {\n                return $sink->write($write);\n            };\n        } else {\n            // Use a default temp stream if no sink was set.\n            $conf[CURLOPT_FILE] = fopen('php://temp', 'w+');\n            $easy->sink = Psr7\\stream_for($conf[CURLOPT_FILE]);\n        }\n        $timeoutRequiresNoSignal = false;\n        if (isset($options['timeout'])) {\n            $timeoutRequiresNoSignal |= $options['timeout'] < 1;\n            $conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;\n        }\n\n        // CURL default value is CURL_IPRESOLVE_WHATEVER\n        if (isset($options['force_ip_resolve'])) {\n            if ('v4' === $options['force_ip_resolve']) {\n                $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;\n            } else if ('v6' === $options['force_ip_resolve']) {\n                $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6;\n            }\n        }\n\n        if (isset($options['connect_timeout'])) {\n            $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1;\n            $conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;\n        }\n\n        if ($timeoutRequiresNoSignal && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') {\n            $conf[CURLOPT_NOSIGNAL] = true;\n        }\n\n        if (isset($options['proxy'])) {\n            if (!is_array($options['proxy'])) {\n                $conf[CURLOPT_PROXY] = $options['proxy'];\n            } else {\n                $scheme = $easy->request->getUri()->getScheme();\n                if (isset($options['proxy'][$scheme])) {\n                    $host = $easy->request->getUri()->getHost();\n                    if (!isset($options['proxy']['no']) ||\n                        !\\GuzzleHttp\\is_host_in_noproxy($host, $options['proxy']['no'])\n                    ) {\n                        $conf[CURLOPT_PROXY] = $options['proxy'][$scheme];\n                    }\n                }\n            }\n        }\n\n        if (isset($options['cert'])) {\n            $cert = $options['cert'];\n            if (is_array($cert)) {\n                $conf[CURLOPT_SSLCERTPASSWD] = $cert[1];\n                $cert = $cert[0];\n            }\n            if (!file_exists($cert)) {\n                throw new \\InvalidArgumentException(\n                    \"SSL certificate not found: {$cert}\"\n                );\n            }\n            $conf[CURLOPT_SSLCERT] = $cert;\n        }\n\n        if (isset($options['ssl_key'])) {\n            $sslKey = $options['ssl_key'];\n            if (is_array($sslKey)) {\n                $conf[CURLOPT_SSLKEYPASSWD] = $sslKey[1];\n                $sslKey = $sslKey[0];\n            }\n            if (!file_exists($sslKey)) {\n                throw new \\InvalidArgumentException(\n                    \"SSL private key not found: {$sslKey}\"\n                );\n            }\n            $conf[CURLOPT_SSLKEY] = $sslKey;\n        }\n\n        if (isset($options['progress'])) {\n            $progress = $options['progress'];\n            if (!is_callable($progress)) {\n                throw new \\InvalidArgumentException(\n                    'progress client option must be callable'\n                );\n            }\n            $conf[CURLOPT_NOPROGRESS] = false;\n            $conf[CURLOPT_PROGRESSFUNCTION] = function () use ($progress) {\n                $args = func_get_args();\n                // PHP 5.5 pushed the handle onto the start of the args\n                if (is_resource($args[0])) {\n                    array_shift($args);\n                }\n                call_user_func_array($progress, $args);\n            };\n        }\n\n        if (!empty($options['debug'])) {\n            $conf[CURLOPT_STDERR] = \\GuzzleHttp\\debug_resource($options['debug']);\n            $conf[CURLOPT_VERBOSE] = true;\n        }\n    }\n\n    /**\n     * This function ensures that a response was set on a transaction. If one\n     * was not set, then the request is retried if possible. This error\n     * typically means you are sending a payload, curl encountered a\n     * \"Connection died, retrying a fresh connect\" error, tried to rewind the\n     * stream, and then encountered a \"necessary data rewind wasn't possible\"\n     * error, causing the request to be sent through curl_multi_info_read()\n     * without an error status.\n     */\n    private static function retryFailedRewind(\n        callable $handler,\n        EasyHandle $easy,\n        array $ctx\n    ) {\n        try {\n            // Only rewind if the body has been read from.\n            $body = $easy->request->getBody();\n            if ($body->tell() > 0) {\n                $body->rewind();\n            }\n        } catch (\\RuntimeException $e) {\n            $ctx['error'] = 'The connection unexpectedly failed without '\n                . 'providing an error. The request would have been retried, '\n                . 'but attempting to rewind the request body failed. '\n                . 'Exception: ' . $e;\n            return self::createRejection($easy, $ctx);\n        }\n\n        // Retry no more than 3 times before giving up.\n        if (!isset($easy->options['_curl_retries'])) {\n            $easy->options['_curl_retries'] = 1;\n        } elseif ($easy->options['_curl_retries'] == 2) {\n            $ctx['error'] = 'The cURL request was retried 3 times '\n                . 'and did not succeed. The most likely reason for the failure '\n                . 'is that cURL was unable to rewind the body of the request '\n                . 'and subsequent retries resulted in the same error. Turn on '\n                . 'the debug option to see what went wrong. See '\n                . 'https://bugs.php.net/bug.php?id=47204 for more information.';\n            return self::createRejection($easy, $ctx);\n        } else {\n            $easy->options['_curl_retries']++;\n        }\n\n        return $handler($easy->request, $easy->options);\n    }\n\n    private function createHeaderFn(EasyHandle $easy)\n    {\n        if (isset($easy->options['on_headers'])) {\n            $onHeaders = $easy->options['on_headers'];\n\n            if (!is_callable($onHeaders)) {\n                throw new \\InvalidArgumentException('on_headers must be callable');\n            }\n        } else {\n            $onHeaders = null;\n        }\n\n        return function ($ch, $h) use (\n            $onHeaders,\n            $easy,\n            &$startingResponse\n        ) {\n            $value = trim($h);\n            if ($value === '') {\n                $startingResponse = true;\n                $easy->createResponse();\n                if ($onHeaders !== null) {\n                    try {\n                        $onHeaders($easy->response);\n                    } catch (\\Exception $e) {\n                        // Associate the exception with the handle and trigger\n                        // a curl header write error by returning 0.\n                        $easy->onHeadersException = $e;\n                        return -1;\n                    }\n                }\n            } elseif ($startingResponse) {\n                $startingResponse = false;\n                $easy->headers = [$value];\n            } else {\n                $easy->headers[] = $value;\n            }\n            return strlen($h);\n        };\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse Psr\\Http\\Message\\RequestInterface;\n\ninterface CurlFactoryInterface\n{\n    /**\n     * Creates a cURL handle resource.\n     *\n     * @param RequestInterface $request Request\n     * @param array            $options Transfer options\n     *\n     * @return EasyHandle\n     * @throws \\RuntimeException when an option cannot be applied\n     */\n    public function create(RequestInterface $request, array $options);\n\n    /**\n     * Release an easy handle, allowing it to be reused or closed.\n     *\n     * This function must call unset on the easy handle's \"handle\" property.\n     *\n     * @param EasyHandle $easy\n     */\n    public function release(EasyHandle $easy);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * HTTP handler that uses cURL easy handles as a transport layer.\n *\n * When using the CurlHandler, custom curl options can be specified as an\n * associative array of curl option constants mapping to values in the\n * **curl** key of the \"client\" key of the request.\n */\nclass CurlHandler\n{\n    /** @var CurlFactoryInterface */\n    private $factory;\n\n    /**\n     * Accepts an associative array of options:\n     *\n     * - factory: Optional curl factory used to create cURL handles.\n     *\n     * @param array $options Array of options to use with the handler\n     */\n    public function __construct(array $options = [])\n    {\n        $this->factory = isset($options['handle_factory'])\n            ? $options['handle_factory']\n            : new CurlFactory(3);\n    }\n\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        if (isset($options['delay'])) {\n            usleep($options['delay'] * 1000);\n        }\n\n        $easy = $this->factory->create($request, $options);\n        curl_exec($easy->handle);\n        $easy->errno = curl_errno($easy->handle);\n\n        return CurlFactory::finish($this, $easy, $this->factory);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\Promise;\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Returns an asynchronous response using curl_multi_* functions.\n *\n * When using the CurlMultiHandler, custom curl options can be specified as an\n * associative array of curl option constants mapping to values in the\n * **curl** key of the provided request options.\n *\n * @property resource $_mh Internal use only. Lazy loaded multi-handle.\n */\nclass CurlMultiHandler\n{\n    /** @var CurlFactoryInterface */\n    private $factory;\n    private $selectTimeout;\n    private $active;\n    private $handles = [];\n    private $delays = [];\n\n    /**\n     * This handler accepts the following options:\n     *\n     * - handle_factory: An optional factory  used to create curl handles\n     * - select_timeout: Optional timeout (in seconds) to block before timing\n     *   out while selecting curl handles. Defaults to 1 second.\n     *\n     * @param array $options\n     */\n    public function __construct(array $options = [])\n    {\n        $this->factory = isset($options['handle_factory'])\n            ? $options['handle_factory'] : new CurlFactory(50);\n        $this->selectTimeout = isset($options['select_timeout'])\n            ? $options['select_timeout'] : 1;\n    }\n\n    public function __get($name)\n    {\n        if ($name === '_mh') {\n            return $this->_mh = curl_multi_init();\n        }\n\n        throw new \\BadMethodCallException();\n    }\n\n    public function __destruct()\n    {\n        if (isset($this->_mh)) {\n            curl_multi_close($this->_mh);\n            unset($this->_mh);\n        }\n    }\n\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        $easy = $this->factory->create($request, $options);\n        $id = (int) $easy->handle;\n\n        $promise = new Promise(\n            [$this, 'execute'],\n            function () use ($id) { return $this->cancel($id); }\n        );\n\n        $this->addRequest(['easy' => $easy, 'deferred' => $promise]);\n\n        return $promise;\n    }\n\n    /**\n     * Ticks the curl event loop.\n     */\n    public function tick()\n    {\n        // Add any delayed handles if needed.\n        if ($this->delays) {\n            $currentTime = microtime(true);\n            foreach ($this->delays as $id => $delay) {\n                if ($currentTime >= $delay) {\n                    unset($this->delays[$id]);\n                    curl_multi_add_handle(\n                        $this->_mh,\n                        $this->handles[$id]['easy']->handle\n                    );\n                }\n            }\n        }\n\n        // Step through the task queue which may add additional requests.\n        P\\queue()->run();\n\n        if ($this->active &&\n            curl_multi_select($this->_mh, $this->selectTimeout) === -1\n        ) {\n            // Perform a usleep if a select returns -1.\n            // See: https://bugs.php.net/bug.php?id=61141\n            usleep(250);\n        }\n\n        while (curl_multi_exec($this->_mh, $this->active) === CURLM_CALL_MULTI_PERFORM);\n\n        $this->processMessages();\n    }\n\n    /**\n     * Runs until all outstanding connections have completed.\n     */\n    public function execute()\n    {\n        $queue = P\\queue();\n\n        while ($this->handles || !$queue->isEmpty()) {\n            // If there are no transfers, then sleep for the next delay\n            if (!$this->active && $this->delays) {\n                usleep($this->timeToNext());\n            }\n            $this->tick();\n        }\n    }\n\n    private function addRequest(array $entry)\n    {\n        $easy = $entry['easy'];\n        $id = (int) $easy->handle;\n        $this->handles[$id] = $entry;\n        if (empty($easy->options['delay'])) {\n            curl_multi_add_handle($this->_mh, $easy->handle);\n        } else {\n            $this->delays[$id] = microtime(true) + ($easy->options['delay'] / 1000);\n        }\n    }\n\n    /**\n     * Cancels a handle from sending and removes references to it.\n     *\n     * @param int $id Handle ID to cancel and remove.\n     *\n     * @return bool True on success, false on failure.\n     */\n    private function cancel($id)\n    {\n        // Cannot cancel if it has been processed.\n        if (!isset($this->handles[$id])) {\n            return false;\n        }\n\n        $handle = $this->handles[$id]['easy']->handle;\n        unset($this->delays[$id], $this->handles[$id]);\n        curl_multi_remove_handle($this->_mh, $handle);\n        curl_close($handle);\n\n        return true;\n    }\n\n    private function processMessages()\n    {\n        while ($done = curl_multi_info_read($this->_mh)) {\n            $id = (int) $done['handle'];\n            curl_multi_remove_handle($this->_mh, $done['handle']);\n\n            if (!isset($this->handles[$id])) {\n                // Probably was cancelled.\n                continue;\n            }\n\n            $entry = $this->handles[$id];\n            unset($this->handles[$id], $this->delays[$id]);\n            $entry['easy']->errno = $done['result'];\n            $entry['deferred']->resolve(\n                CurlFactory::finish(\n                    $this,\n                    $entry['easy'],\n                    $this->factory\n                )\n            );\n        }\n    }\n\n    private function timeToNext()\n    {\n        $currentTime = microtime(true);\n        $nextTime = PHP_INT_MAX;\n        foreach ($this->delays as $time) {\n            if ($time < $nextTime) {\n                $nextTime = $time;\n            }\n        }\n\n        return max(0, $nextTime - $currentTime) * 1000000;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Represents a cURL easy handle and the data it populates.\n *\n * @internal\n */\nfinal class EasyHandle\n{\n    /** @var resource cURL resource */\n    public $handle;\n\n    /** @var StreamInterface Where data is being written */\n    public $sink;\n\n    /** @var array Received HTTP headers so far */\n    public $headers = [];\n\n    /** @var ResponseInterface Received response (if any) */\n    public $response;\n\n    /** @var RequestInterface Request being sent */\n    public $request;\n\n    /** @var array Request options */\n    public $options = [];\n\n    /** @var int cURL error number (if any) */\n    public $errno = 0;\n\n    /** @var \\Exception Exception during on_headers (if any) */\n    public $onHeadersException;\n\n    /**\n     * Attach a response to the easy handle based on the received headers.\n     *\n     * @throws \\RuntimeException if no headers have been received.\n     */\n    public function createResponse()\n    {\n        if (empty($this->headers)) {\n            throw new \\RuntimeException('No headers have been received');\n        }\n\n        // HTTP-version SP status-code SP reason-phrase\n        $startLine = explode(' ', array_shift($this->headers), 3);\n        $headers = \\GuzzleHttp\\headers_from_lines($this->headers);\n        $normalizedKeys = \\GuzzleHttp\\normalize_header_keys($headers);\n\n        if (!empty($this->options['decode_content'])\n            && isset($normalizedKeys['content-encoding'])\n        ) {\n            $headers['x-encoded-content-encoding']\n                = $headers[$normalizedKeys['content-encoding']];\n            unset($headers[$normalizedKeys['content-encoding']]);\n            if (isset($normalizedKeys['content-length'])) {\n                $headers['x-encoded-content-length']\n                    = $headers[$normalizedKeys['content-length']];\n\n                $bodyLength = (int) $this->sink->getSize();\n                if ($bodyLength) {\n                    $headers[$normalizedKeys['content-length']] = $bodyLength;\n                } else {\n                    unset($headers[$normalizedKeys['content-length']]);\n                }\n            }\n        }\n\n        // Attach a response to the easy handle with the parsed headers.\n        $this->response = new Response(\n            $startLine[1],\n            $headers,\n            $this->sink,\n            substr($startLine[0], 5),\n            isset($startLine[2]) ? (string) $startLine[2] : null\n        );\n    }\n\n    public function __get($name)\n    {\n        $msg = $name === 'handle'\n            ? 'The EasyHandle has been released'\n            : 'Invalid property: ' . $name;\n        throw new \\BadMethodCallException($msg);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\HandlerStack;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Promise\\RejectedPromise;\nuse GuzzleHttp\\TransferStats;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Handler that returns responses or throw exceptions from a queue.\n */\nclass MockHandler implements \\Countable\n{\n    private $queue = [];\n    private $lastRequest;\n    private $lastOptions;\n    private $onFulfilled;\n    private $onRejected;\n\n    /**\n     * Creates a new MockHandler that uses the default handler stack list of\n     * middlewares.\n     *\n     * @param array $queue Array of responses, callables, or exceptions.\n     * @param callable $onFulfilled Callback to invoke when the return value is fulfilled.\n     * @param callable $onRejected  Callback to invoke when the return value is rejected.\n     *\n     * @return HandlerStack\n     */\n    public static function createWithMiddleware(\n        array $queue = null,\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        return HandlerStack::create(new self($queue, $onFulfilled, $onRejected));\n    }\n\n    /**\n     * The passed in value must be an array of\n     * {@see Psr7\\Http\\Message\\ResponseInterface} objects, Exceptions,\n     * callables, or Promises.\n     *\n     * @param array $queue\n     * @param callable $onFulfilled Callback to invoke when the return value is fulfilled.\n     * @param callable $onRejected  Callback to invoke when the return value is rejected.\n     */\n    public function __construct(\n        array $queue = null,\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        $this->onFulfilled = $onFulfilled;\n        $this->onRejected = $onRejected;\n\n        if ($queue) {\n            call_user_func_array([$this, 'append'], $queue);\n        }\n    }\n\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        if (!$this->queue) {\n            throw new \\OutOfBoundsException('Mock queue is empty');\n        }\n\n        if (isset($options['delay'])) {\n            usleep($options['delay'] * 1000);\n        }\n\n        $this->lastRequest = $request;\n        $this->lastOptions = $options;\n        $response = array_shift($this->queue);\n\n        if (isset($options['on_headers'])) {\n            if (!is_callable($options['on_headers'])) {\n                throw new \\InvalidArgumentException('on_headers must be callable');\n            }\n            try {\n                $options['on_headers']($response);\n            } catch (\\Exception $e) {\n                $msg = 'An error was encountered during the on_headers event';\n                $response = new RequestException($msg, $request, $response, $e);\n            }\n        }\n\n        if (is_callable($response)) {\n            $response = call_user_func($response, $request, $options);\n        }\n\n        $response = $response instanceof \\Exception\n            ? \\GuzzleHttp\\Promise\\rejection_for($response)\n            : \\GuzzleHttp\\Promise\\promise_for($response);\n\n        return $response->then(\n            function ($value) use ($request, $options) {\n                $this->invokeStats($request, $options, $value);\n                if ($this->onFulfilled) {\n                    call_user_func($this->onFulfilled, $value);\n                }\n                if (isset($options['sink'])) {\n                    $contents = (string) $value->getBody();\n                    $sink = $options['sink'];\n\n                    if (is_resource($sink)) {\n                        fwrite($sink, $contents);\n                    } elseif (is_string($sink)) {\n                        file_put_contents($sink, $contents);\n                    } elseif ($sink instanceof \\Psr\\Http\\Message\\StreamInterface) {\n                        $sink->write($contents);\n                    }\n                }\n\n                return $value;\n            },\n            function ($reason) use ($request, $options) {\n                $this->invokeStats($request, $options, null, $reason);\n                if ($this->onRejected) {\n                    call_user_func($this->onRejected, $reason);\n                }\n                return \\GuzzleHttp\\Promise\\rejection_for($reason);\n            }\n        );\n    }\n\n    /**\n     * Adds one or more variadic requests, exceptions, callables, or promises\n     * to the queue.\n     */\n    public function append()\n    {\n        foreach (func_get_args() as $value) {\n            if ($value instanceof ResponseInterface\n                || $value instanceof \\Exception\n                || $value instanceof PromiseInterface\n                || is_callable($value)\n            ) {\n                $this->queue[] = $value;\n            } else {\n                throw new \\InvalidArgumentException('Expected a response or '\n                    . 'exception. Found ' . \\GuzzleHttp\\describe_type($value));\n            }\n        }\n    }\n\n    /**\n     * Get the last received request.\n     *\n     * @return RequestInterface\n     */\n    public function getLastRequest()\n    {\n        return $this->lastRequest;\n    }\n\n    /**\n     * Get the last received request options.\n     *\n     * @return array\n     */\n    public function getLastOptions()\n    {\n        return $this->lastOptions;\n    }\n\n    /**\n     * Returns the number of remaining items in the queue.\n     *\n     * @return int\n     */\n    public function count()\n    {\n        return count($this->queue);\n    }\n\n    private function invokeStats(\n        RequestInterface $request,\n        array $options,\n        ResponseInterface $response = null,\n        $reason = null\n    ) {\n        if (isset($options['on_stats'])) {\n            $stats = new TransferStats($request, $response, 0, $reason);\n            call_user_func($options['on_stats'], $stats);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\RequestOptions;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Provides basic proxies for handlers.\n */\nclass Proxy\n{\n    /**\n     * Sends synchronous requests to a specific handler while sending all other\n     * requests to another handler.\n     *\n     * @param callable $default Handler used for normal responses\n     * @param callable $sync    Handler used for synchronous responses.\n     *\n     * @return callable Returns the composed handler.\n     */\n    public static function wrapSync(\n        callable $default,\n        callable $sync\n    ) {\n        return function (RequestInterface $request, array $options) use ($default, $sync) {\n            return empty($options[RequestOptions::SYNCHRONOUS])\n                ? $default($request, $options)\n                : $sync($request, $options);\n        };\n    }\n\n    /**\n     * Sends streaming requests to a streaming compatible handler while sending\n     * all other requests to a default handler.\n     *\n     * This, for example, could be useful for taking advantage of the\n     * performance benefits of curl while still supporting true streaming\n     * through the StreamHandler.\n     *\n     * @param callable $default   Handler used for non-streaming responses\n     * @param callable $streaming Handler used for streaming responses\n     *\n     * @return callable Returns the composed handler.\n     */\n    public static function wrapStreaming(\n        callable $default,\n        callable $streaming\n    ) {\n        return function (RequestInterface $request, array $options) use ($default, $streaming) {\n            return empty($options['stream'])\n                ? $default($request, $options)\n                : $streaming($request, $options);\n        };\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Exception\\ConnectException;\nuse GuzzleHttp\\Promise\\FulfilledPromise;\nuse GuzzleHttp\\Promise\\RejectedPromise;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Psr7;\nuse GuzzleHttp\\TransferStats;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * HTTP handler that uses PHP's HTTP stream wrapper.\n */\nclass StreamHandler\n{\n    private $lastHeaders = [];\n\n    /**\n     * Sends an HTTP request.\n     *\n     * @param RequestInterface $request Request to send.\n     * @param array            $options Request transfer options.\n     *\n     * @return PromiseInterface\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        // Sleep if there is a delay specified.\n        if (isset($options['delay'])) {\n            usleep($options['delay'] * 1000);\n        }\n\n        $startTime = isset($options['on_stats']) ? microtime(true) : null;\n\n        try {\n            // Does not support the expect header.\n            $request = $request->withoutHeader('Expect');\n\n            // Append a content-length header if body size is zero to match\n            // cURL's behavior.\n            if (0 === $request->getBody()->getSize()) {\n                $request = $request->withHeader('Content-Length', 0);\n            }\n\n            return $this->createResponse(\n                $request,\n                $options,\n                $this->createStream($request, $options),\n                $startTime\n            );\n        } catch (\\InvalidArgumentException $e) {\n            throw $e;\n        } catch (\\Exception $e) {\n            // Determine if the error was a networking error.\n            $message = $e->getMessage();\n            // This list can probably get more comprehensive.\n            if (strpos($message, 'getaddrinfo') // DNS lookup failed\n                || strpos($message, 'Connection refused')\n                || strpos($message, \"couldn't connect to host\") // error on HHVM\n            ) {\n                $e = new ConnectException($e->getMessage(), $request, $e);\n            }\n            $e = RequestException::wrapException($request, $e);\n            $this->invokeStats($options, $request, $startTime, null, $e);\n\n            return \\GuzzleHttp\\Promise\\rejection_for($e);\n        }\n    }\n\n    private function invokeStats(\n        array $options,\n        RequestInterface $request,\n        $startTime,\n        ResponseInterface $response = null,\n        $error = null\n    ) {\n        if (isset($options['on_stats'])) {\n            $stats = new TransferStats(\n                $request,\n                $response,\n                microtime(true) - $startTime,\n                $error,\n                []\n            );\n            call_user_func($options['on_stats'], $stats);\n        }\n    }\n\n    private function createResponse(\n        RequestInterface $request,\n        array $options,\n        $stream,\n        $startTime\n    ) {\n        $hdrs = $this->lastHeaders;\n        $this->lastHeaders = [];\n        $parts = explode(' ', array_shift($hdrs), 3);\n        $ver = explode('/', $parts[0])[1];\n        $status = $parts[1];\n        $reason = isset($parts[2]) ? $parts[2] : null;\n        $headers = \\GuzzleHttp\\headers_from_lines($hdrs);\n        list ($stream, $headers) = $this->checkDecode($options, $headers, $stream);\n        $stream = Psr7\\stream_for($stream);\n        $sink = $stream;\n\n        if (strcasecmp('HEAD', $request->getMethod())) {\n            $sink = $this->createSink($stream, $options);\n        }\n\n        $response = new Psr7\\Response($status, $headers, $sink, $ver, $reason);\n\n        if (isset($options['on_headers'])) {\n            try {\n                $options['on_headers']($response);\n            } catch (\\Exception $e) {\n                $msg = 'An error was encountered during the on_headers event';\n                $ex = new RequestException($msg, $request, $response, $e);\n                return \\GuzzleHttp\\Promise\\rejection_for($ex);\n            }\n        }\n\n        // Do not drain when the request is a HEAD request because they have\n        // no body.\n        if ($sink !== $stream) {\n            $this->drain(\n                $stream,\n                $sink,\n                $response->getHeaderLine('Content-Length')\n            );\n        }\n\n        $this->invokeStats($options, $request, $startTime, $response, null);\n\n        return new FulfilledPromise($response);\n    }\n\n    private function createSink(StreamInterface $stream, array $options)\n    {\n        if (!empty($options['stream'])) {\n            return $stream;\n        }\n\n        $sink = isset($options['sink'])\n            ? $options['sink']\n            : fopen('php://temp', 'r+');\n\n        return is_string($sink)\n            ? new Psr7\\LazyOpenStream($sink, 'w+')\n            : Psr7\\stream_for($sink);\n    }\n\n    private function checkDecode(array $options, array $headers, $stream)\n    {\n        // Automatically decode responses when instructed.\n        if (!empty($options['decode_content'])) {\n            $normalizedKeys = \\GuzzleHttp\\normalize_header_keys($headers);\n            if (isset($normalizedKeys['content-encoding'])) {\n                $encoding = $headers[$normalizedKeys['content-encoding']];\n                if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') {\n                    $stream = new Psr7\\InflateStream(\n                        Psr7\\stream_for($stream)\n                    );\n                    $headers['x-encoded-content-encoding']\n                        = $headers[$normalizedKeys['content-encoding']];\n                    // Remove content-encoding header\n                    unset($headers[$normalizedKeys['content-encoding']]);\n                    // Fix content-length header\n                    if (isset($normalizedKeys['content-length'])) {\n                        $headers['x-encoded-content-length']\n                            = $headers[$normalizedKeys['content-length']];\n\n                        $length = (int) $stream->getSize();\n                        if ($length === 0) {\n                            unset($headers[$normalizedKeys['content-length']]);\n                        } else {\n                            $headers[$normalizedKeys['content-length']] = [$length];\n                        }\n                    }\n                }\n            }\n        }\n\n        return [$stream, $headers];\n    }\n\n    /**\n     * Drains the source stream into the \"sink\" client option.\n     *\n     * @param StreamInterface $source\n     * @param StreamInterface $sink\n     * @param string          $contentLength Header specifying the amount of\n     *                                       data to read.\n     *\n     * @return StreamInterface\n     * @throws \\RuntimeException when the sink option is invalid.\n     */\n    private function drain(\n        StreamInterface $source,\n        StreamInterface $sink,\n        $contentLength\n    ) {\n        // If a content-length header is provided, then stop reading once\n        // that number of bytes has been read. This can prevent infinitely\n        // reading from a stream when dealing with servers that do not honor\n        // Connection: Close headers.\n        Psr7\\copy_to_stream(\n            $source,\n            $sink,\n            (strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1\n        );\n\n        $sink->seek(0);\n        $source->close();\n\n        return $sink;\n    }\n\n    /**\n     * Create a resource and check to ensure it was created successfully\n     *\n     * @param callable $callback Callable that returns stream resource\n     *\n     * @return resource\n     * @throws \\RuntimeException on error\n     */\n    private function createResource(callable $callback)\n    {\n        $errors = null;\n        set_error_handler(function ($_, $msg, $file, $line) use (&$errors) {\n            $errors[] = [\n                'message' => $msg,\n                'file'    => $file,\n                'line'    => $line\n            ];\n            return true;\n        });\n\n        $resource = $callback();\n        restore_error_handler();\n\n        if (!$resource) {\n            $message = 'Error creating resource: ';\n            foreach ($errors as $err) {\n                foreach ($err as $key => $value) {\n                    $message .= \"[$key] $value\" . PHP_EOL;\n                }\n            }\n            throw new \\RuntimeException(trim($message));\n        }\n\n        return $resource;\n    }\n\n    private function createStream(RequestInterface $request, array $options)\n    {\n        static $methods;\n        if (!$methods) {\n            $methods = array_flip(get_class_methods(__CLASS__));\n        }\n\n        // HTTP/1.1 streams using the PHP stream wrapper require a\n        // Connection: close header\n        if ($request->getProtocolVersion() == '1.1'\n            && !$request->hasHeader('Connection')\n        ) {\n            $request = $request->withHeader('Connection', 'close');\n        }\n\n        // Ensure SSL is verified by default\n        if (!isset($options['verify'])) {\n            $options['verify'] = true;\n        }\n\n        $params = [];\n        $context = $this->getDefaultContext($request, $options);\n\n        if (isset($options['on_headers']) && !is_callable($options['on_headers'])) {\n            throw new \\InvalidArgumentException('on_headers must be callable');\n        }\n\n        if (!empty($options)) {\n            foreach ($options as $key => $value) {\n                $method = \"add_{$key}\";\n                if (isset($methods[$method])) {\n                    $this->{$method}($request, $context, $value, $params);\n                }\n            }\n        }\n\n        if (isset($options['stream_context'])) {\n            if (!is_array($options['stream_context'])) {\n                throw new \\InvalidArgumentException('stream_context must be an array');\n            }\n            $context = array_replace_recursive(\n                $context,\n                $options['stream_context']\n            );\n        }\n\n        // Microsoft NTLM authentication only supported with curl handler\n        if (isset($options['auth'])\n            && is_array($options['auth'])\n            && isset($options['auth'][2])\n            && 'ntlm' == $options['auth'][2]\n        ) {\n\n            throw new \\InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler');\n        }\n\n        $uri = $this->resolveHost($request, $options);\n\n        $context = $this->createResource(\n            function () use ($context, $params) {\n                return stream_context_create($context, $params);\n            }\n        );\n\n        return $this->createResource(\n            function () use ($uri, &$http_response_header, $context, $options) {\n                $resource = fopen((string) $uri, 'r', null, $context);\n                $this->lastHeaders = $http_response_header;\n\n                if (isset($options['read_timeout'])) {\n                    $readTimeout = $options['read_timeout'];\n                    $sec = (int) $readTimeout;\n                    $usec = ($readTimeout - $sec) * 100000;\n                    stream_set_timeout($resource, $sec, $usec);\n                }\n\n                return $resource;\n            }\n        );\n    }\n\n    private function resolveHost(RequestInterface $request, array $options)\n    {\n        $uri = $request->getUri();\n\n        if (isset($options['force_ip_resolve']) && !filter_var($uri->getHost(), FILTER_VALIDATE_IP)) {\n            if ('v4' === $options['force_ip_resolve']) {\n                $records = dns_get_record($uri->getHost(), DNS_A);\n                if (!isset($records[0]['ip'])) {\n                    throw new ConnectException(sprintf(\"Could not resolve IPv4 address for host '%s'\", $uri->getHost()), $request);\n                }\n                $uri = $uri->withHost($records[0]['ip']);\n            } elseif ('v6' === $options['force_ip_resolve']) {\n                $records = dns_get_record($uri->getHost(), DNS_AAAA);\n                if (!isset($records[0]['ipv6'])) {\n                    throw new ConnectException(sprintf(\"Could not resolve IPv6 address for host '%s'\", $uri->getHost()), $request);\n                }\n                $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']');\n            }\n        }\n\n        return $uri;\n    }\n\n    private function getDefaultContext(RequestInterface $request)\n    {\n        $headers = '';\n        foreach ($request->getHeaders() as $name => $value) {\n            foreach ($value as $val) {\n                $headers .= \"$name: $val\\r\\n\";\n            }\n        }\n\n        $context = [\n            'http' => [\n                'method'           => $request->getMethod(),\n                'header'           => $headers,\n                'protocol_version' => $request->getProtocolVersion(),\n                'ignore_errors'    => true,\n                'follow_location'  => 0,\n            ],\n        ];\n\n        $body = (string) $request->getBody();\n\n        if (!empty($body)) {\n            $context['http']['content'] = $body;\n            // Prevent the HTTP handler from adding a Content-Type header.\n            if (!$request->hasHeader('Content-Type')) {\n                $context['http']['header'] .= \"Content-Type:\\r\\n\";\n            }\n        }\n\n        $context['http']['header'] = rtrim($context['http']['header']);\n\n        return $context;\n    }\n\n    private function add_proxy(RequestInterface $request, &$options, $value, &$params)\n    {\n        if (!is_array($value)) {\n            $options['http']['proxy'] = $value;\n        } else {\n            $scheme = $request->getUri()->getScheme();\n            if (isset($value[$scheme])) {\n                if (!isset($value['no'])\n                    || !\\GuzzleHttp\\is_host_in_noproxy(\n                        $request->getUri()->getHost(),\n                        $value['no']\n                    )\n                ) {\n                    $options['http']['proxy'] = $value[$scheme];\n                }\n            }\n        }\n    }\n\n    private function add_timeout(RequestInterface $request, &$options, $value, &$params)\n    {\n        if ($value > 0) {\n            $options['http']['timeout'] = $value;\n        }\n    }\n\n    private function add_verify(RequestInterface $request, &$options, $value, &$params)\n    {\n        if ($value === true) {\n            // PHP 5.6 or greater will find the system cert by default. When\n            // < 5.6, use the Guzzle bundled cacert.\n            if (PHP_VERSION_ID < 50600) {\n                $options['ssl']['cafile'] = \\GuzzleHttp\\default_ca_bundle();\n            }\n        } elseif (is_string($value)) {\n            $options['ssl']['cafile'] = $value;\n            if (!file_exists($value)) {\n                throw new \\RuntimeException(\"SSL CA bundle not found: $value\");\n            }\n        } elseif ($value === false) {\n            $options['ssl']['verify_peer'] = false;\n            $options['ssl']['verify_peer_name'] = false;\n            return;\n        } else {\n            throw new \\InvalidArgumentException('Invalid verify request option');\n        }\n\n        $options['ssl']['verify_peer'] = true;\n        $options['ssl']['verify_peer_name'] = true;\n        $options['ssl']['allow_self_signed'] = false;\n    }\n\n    private function add_cert(RequestInterface $request, &$options, $value, &$params)\n    {\n        if (is_array($value)) {\n            $options['ssl']['passphrase'] = $value[1];\n            $value = $value[0];\n        }\n\n        if (!file_exists($value)) {\n            throw new \\RuntimeException(\"SSL certificate not found: {$value}\");\n        }\n\n        $options['ssl']['local_cert'] = $value;\n    }\n\n    private function add_progress(RequestInterface $request, &$options, $value, &$params)\n    {\n        $this->addNotification(\n            $params,\n            function ($code, $a, $b, $c, $transferred, $total) use ($value) {\n                if ($code == STREAM_NOTIFY_PROGRESS) {\n                    $value($total, $transferred, null, null);\n                }\n            }\n        );\n    }\n\n    private function add_debug(RequestInterface $request, &$options, $value, &$params)\n    {\n        if ($value === false) {\n            return;\n        }\n\n        static $map = [\n            STREAM_NOTIFY_CONNECT       => 'CONNECT',\n            STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',\n            STREAM_NOTIFY_AUTH_RESULT   => 'AUTH_RESULT',\n            STREAM_NOTIFY_MIME_TYPE_IS  => 'MIME_TYPE_IS',\n            STREAM_NOTIFY_FILE_SIZE_IS  => 'FILE_SIZE_IS',\n            STREAM_NOTIFY_REDIRECTED    => 'REDIRECTED',\n            STREAM_NOTIFY_PROGRESS      => 'PROGRESS',\n            STREAM_NOTIFY_FAILURE       => 'FAILURE',\n            STREAM_NOTIFY_COMPLETED     => 'COMPLETED',\n            STREAM_NOTIFY_RESOLVE       => 'RESOLVE',\n        ];\n        static $args = ['severity', 'message', 'message_code',\n            'bytes_transferred', 'bytes_max'];\n\n        $value = \\GuzzleHttp\\debug_resource($value);\n        $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment('');\n        $this->addNotification(\n            $params,\n            function () use ($ident, $value, $map, $args) {\n                $passed = func_get_args();\n                $code = array_shift($passed);\n                fprintf($value, '<%s> [%s] ', $ident, $map[$code]);\n                foreach (array_filter($passed) as $i => $v) {\n                    fwrite($value, $args[$i] . ': \"' . $v . '\" ');\n                }\n                fwrite($value, \"\\n\");\n            }\n        );\n    }\n\n    private function addNotification(array &$params, callable $notify)\n    {\n        // Wrap the existing function if needed.\n        if (!isset($params['notification'])) {\n            $params['notification'] = $notify;\n        } else {\n            $params['notification'] = $this->callArray([\n                $params['notification'],\n                $notify\n            ]);\n        }\n    }\n\n    private function callArray(array $functions)\n    {\n        return function () use ($functions) {\n            $args = func_get_args();\n            foreach ($functions as $fn) {\n                call_user_func_array($fn, $args);\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/HandlerStack.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Creates a composed Guzzle handler function by stacking middlewares on top of\n * an HTTP handler function.\n */\nclass HandlerStack\n{\n    /** @var callable */\n    private $handler;\n\n    /** @var array */\n    private $stack = [];\n\n    /** @var callable|null */\n    private $cached;\n\n    /**\n     * Creates a default handler stack that can be used by clients.\n     *\n     * The returned handler will wrap the provided handler or use the most\n     * appropriate default handler for you system. The returned HandlerStack has\n     * support for cookies, redirects, HTTP error exceptions, and preparing a body\n     * before sending.\n     *\n     * The returned handler stack can be passed to a client in the \"handler\"\n     * option.\n     *\n     * @param callable $handler HTTP handler function to use with the stack. If no\n     *                          handler is provided, the best handler for your\n     *                          system will be utilized.\n     *\n     * @return HandlerStack\n     */\n    public static function create(callable $handler = null)\n    {\n        $stack = new self($handler ?: choose_handler());\n        $stack->push(Middleware::httpErrors(), 'http_errors');\n        $stack->push(Middleware::redirect(), 'allow_redirects');\n        $stack->push(Middleware::cookies(), 'cookies');\n        $stack->push(Middleware::prepareBody(), 'prepare_body');\n\n        return $stack;\n    }\n\n    /**\n     * @param callable $handler Underlying HTTP handler.\n     */\n    public function __construct(callable $handler = null)\n    {\n        $this->handler = $handler;\n    }\n\n    /**\n     * Invokes the handler stack as a composed handler\n     *\n     * @param RequestInterface $request\n     * @param array            $options\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        $handler = $this->resolve();\n\n        return $handler($request, $options);\n    }\n\n    /**\n     * Dumps a string representation of the stack.\n     *\n     * @return string\n     */\n    public function __toString()\n    {\n        $depth = 0;\n        $stack = [];\n        if ($this->handler) {\n            $stack[] = \"0) Handler: \" . $this->debugCallable($this->handler);\n        }\n\n        $result = '';\n        foreach (array_reverse($this->stack) as $tuple) {\n            $depth++;\n            $str = \"{$depth}) Name: '{$tuple[1]}', \";\n            $str .= \"Function: \" . $this->debugCallable($tuple[0]);\n            $result = \"> {$str}\\n{$result}\";\n            $stack[] = $str;\n        }\n\n        foreach (array_keys($stack) as $k) {\n            $result .= \"< {$stack[$k]}\\n\";\n        }\n\n        return $result;\n    }\n\n    /**\n     * Set the HTTP handler that actually returns a promise.\n     *\n     * @param callable $handler Accepts a request and array of options and\n     *                          returns a Promise.\n     */\n    public function setHandler(callable $handler)\n    {\n        $this->handler = $handler;\n        $this->cached = null;\n    }\n\n    /**\n     * Returns true if the builder has a handler.\n     *\n     * @return bool\n     */\n    public function hasHandler()\n    {\n        return (bool) $this->handler;\n    }\n\n    /**\n     * Unshift a middleware to the bottom of the stack.\n     *\n     * @param callable $middleware Middleware function\n     * @param string   $name       Name to register for this middleware.\n     */\n    public function unshift(callable $middleware, $name = null)\n    {\n        array_unshift($this->stack, [$middleware, $name]);\n        $this->cached = null;\n    }\n\n    /**\n     * Push a middleware to the top of the stack.\n     *\n     * @param callable $middleware Middleware function\n     * @param string   $name       Name to register for this middleware.\n     */\n    public function push(callable $middleware, $name = '')\n    {\n        $this->stack[] = [$middleware, $name];\n        $this->cached = null;\n    }\n\n    /**\n     * Add a middleware before another middleware by name.\n     *\n     * @param string   $findName   Middleware to find\n     * @param callable $middleware Middleware function\n     * @param string   $withName   Name to register for this middleware.\n     */\n    public function before($findName, callable $middleware, $withName = '')\n    {\n        $this->splice($findName, $withName, $middleware, true);\n    }\n\n    /**\n     * Add a middleware after another middleware by name.\n     *\n     * @param string   $findName   Middleware to find\n     * @param callable $middleware Middleware function\n     * @param string   $withName   Name to register for this middleware.\n     */\n    public function after($findName, callable $middleware, $withName = '')\n    {\n        $this->splice($findName, $withName, $middleware, false);\n    }\n\n    /**\n     * Remove a middleware by instance or name from the stack.\n     *\n     * @param callable|string $remove Middleware to remove by instance or name.\n     */\n    public function remove($remove)\n    {\n        $this->cached = null;\n        $idx = is_callable($remove) ? 0 : 1;\n        $this->stack = array_values(array_filter(\n            $this->stack,\n            function ($tuple) use ($idx, $remove) {\n                return $tuple[$idx] !== $remove;\n            }\n        ));\n    }\n\n    /**\n     * Compose the middleware and handler into a single callable function.\n     *\n     * @return callable\n     */\n    public function resolve()\n    {\n        if (!$this->cached) {\n            if (!($prev = $this->handler)) {\n                throw new \\LogicException('No handler has been specified');\n            }\n\n            foreach (array_reverse($this->stack) as $fn) {\n                $prev = $fn[0]($prev);\n            }\n\n            $this->cached = $prev;\n        }\n\n        return $this->cached;\n    }\n\n    /**\n     * @param $name\n     * @return int\n     */\n    private function findByName($name)\n    {\n        foreach ($this->stack as $k => $v) {\n            if ($v[1] === $name) {\n                return $k;\n            }\n        }\n\n        throw new \\InvalidArgumentException(\"Middleware not found: $name\");\n    }\n\n    /**\n     * Splices a function into the middleware list at a specific position.\n     *\n     * @param          $findName\n     * @param          $withName\n     * @param callable $middleware\n     * @param          $before\n     */\n    private function splice($findName, $withName, callable $middleware, $before)\n    {\n        $this->cached = null;\n        $idx = $this->findByName($findName);\n        $tuple = [$middleware, $withName];\n\n        if ($before) {\n            if ($idx === 0) {\n                array_unshift($this->stack, $tuple);\n            } else {\n                $replacement = [$tuple, $this->stack[$idx]];\n                array_splice($this->stack, $idx, 1, $replacement);\n            }\n        } elseif ($idx === count($this->stack) - 1) {\n            $this->stack[] = $tuple;\n        } else {\n            $replacement = [$this->stack[$idx], $tuple];\n            array_splice($this->stack, $idx, 1, $replacement);\n        }\n    }\n\n    /**\n     * Provides a debug string for a given callable.\n     *\n     * @param array|callable $fn Function to write as a string.\n     *\n     * @return string\n     */\n    private function debugCallable($fn)\n    {\n        if (is_string($fn)) {\n            return \"callable({$fn})\";\n        }\n\n        if (is_array($fn)) {\n            return is_string($fn[0])\n                ? \"callable({$fn[0]}::{$fn[1]})\"\n                : \"callable(['\" . get_class($fn[0]) . \"', '{$fn[1]}'])\";\n        }\n\n        return 'callable(' . spl_object_hash($fn) . ')';\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/MessageFormatter.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Formats log messages using variable substitutions for requests, responses,\n * and other transactional data.\n *\n * The following variable substitutions are supported:\n *\n * - {request}:        Full HTTP request message\n * - {response}:       Full HTTP response message\n * - {ts}:             ISO 8601 date in GMT\n * - {date_iso_8601}   ISO 8601 date in GMT\n * - {date_common_log} Apache common log date using the configured timezone.\n * - {host}:           Host of the request\n * - {method}:         Method of the request\n * - {uri}:            URI of the request\n * - {host}:           Host of the request\n * - {version}:        Protocol version\n * - {target}:         Request target of the request (path + query + fragment)\n * - {hostname}:       Hostname of the machine that sent the request\n * - {code}:           Status code of the response (if available)\n * - {phrase}:         Reason phrase of the response  (if available)\n * - {error}:          Any error messages (if available)\n * - {req_header_*}:   Replace `*` with the lowercased name of a request header to add to the message\n * - {res_header_*}:   Replace `*` with the lowercased name of a response header to add to the message\n * - {req_headers}:    Request headers\n * - {res_headers}:    Response headers\n * - {req_body}:       Request body\n * - {res_body}:       Response body\n */\nclass MessageFormatter\n{\n    /**\n     * Apache Common Log Format.\n     * @link http://httpd.apache.org/docs/2.4/logs.html#common\n     * @var string\n     */\n    const CLF = \"{hostname} {req_header_User-Agent} - [{date_common_log}] \\\"{method} {target} HTTP/{version}\\\" {code} {res_header_Content-Length}\";\n    const DEBUG = \">>>>>>>>\\n{request}\\n<<<<<<<<\\n{response}\\n--------\\n{error}\";\n    const SHORT = '[{ts}] \"{method} {target} HTTP/{version}\" {code}';\n\n    /** @var string Template used to format log messages */\n    private $template;\n\n    /**\n     * @param string $template Log message template\n     */\n    public function __construct($template = self::CLF)\n    {\n        $this->template = $template ?: self::CLF;\n    }\n\n    /**\n     * Returns a formatted message string.\n     *\n     * @param RequestInterface  $request  Request that was sent\n     * @param ResponseInterface $response Response that was received\n     * @param \\Exception        $error    Exception that was received\n     *\n     * @return string\n     */\n    public function format(\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        \\Exception $error = null\n    ) {\n        $cache = [];\n\n        return preg_replace_callback(\n            '/{\\s*([A-Za-z_\\-\\.0-9]+)\\s*}/',\n            function (array $matches) use ($request, $response, $error, &$cache) {\n\n                if (isset($cache[$matches[1]])) {\n                    return $cache[$matches[1]];\n                }\n\n                $result = '';\n                switch ($matches[1]) {\n                    case 'request':\n                        $result = Psr7\\str($request);\n                        break;\n                    case 'response':\n                        $result = $response ? Psr7\\str($response) : '';\n                        break;\n                    case 'req_headers':\n                        $result = trim($request->getMethod()\n                                . ' ' . $request->getRequestTarget())\n                            . ' HTTP/' . $request->getProtocolVersion() . \"\\r\\n\"\n                            . $this->headers($request);\n                        break;\n                    case 'res_headers':\n                        $result = $response ?\n                            sprintf(\n                                'HTTP/%s %d %s',\n                                $response->getProtocolVersion(),\n                                $response->getStatusCode(),\n                                $response->getReasonPhrase()\n                            ) . \"\\r\\n\" . $this->headers($response)\n                            : 'NULL';\n                        break;\n                    case 'req_body':\n                        $result = $request->getBody();\n                        break;\n                    case 'res_body':\n                        $result = $response ? $response->getBody() : 'NULL';\n                        break;\n                    case 'ts':\n                    case 'date_iso_8601':\n                        $result = gmdate('c');\n                        break;\n                    case 'date_common_log':\n                        $result = date('d/M/Y:H:i:s O');\n                        break;\n                    case 'method':\n                        $result = $request->getMethod();\n                        break;\n                    case 'version':\n                        $result = $request->getProtocolVersion();\n                        break;\n                    case 'uri':\n                    case 'url':\n                        $result = $request->getUri();\n                        break;\n                    case 'target':\n                        $result = $request->getRequestTarget();\n                        break;\n                    case 'req_version':\n                        $result = $request->getProtocolVersion();\n                        break;\n                    case 'res_version':\n                        $result = $response\n                            ? $response->getProtocolVersion()\n                            : 'NULL';\n                        break;\n                    case 'host':\n                        $result = $request->getHeaderLine('Host');\n                        break;\n                    case 'hostname':\n                        $result = gethostname();\n                        break;\n                    case 'code':\n                        $result = $response ? $response->getStatusCode() : 'NULL';\n                        break;\n                    case 'phrase':\n                        $result = $response ? $response->getReasonPhrase() : 'NULL';\n                        break;\n                    case 'error':\n                        $result = $error ? $error->getMessage() : 'NULL';\n                        break;\n                    default:\n                        // handle prefixed dynamic headers\n                        if (strpos($matches[1], 'req_header_') === 0) {\n                            $result = $request->getHeaderLine(substr($matches[1], 11));\n                        } elseif (strpos($matches[1], 'res_header_') === 0) {\n                            $result = $response\n                                ? $response->getHeaderLine(substr($matches[1], 11))\n                                : 'NULL';\n                        }\n                }\n\n                $cache[$matches[1]] = $result;\n                return $result;\n            },\n            $this->template\n        );\n    }\n\n    private function headers(MessageInterface $message)\n    {\n        $result = '';\n        foreach ($message->getHeaders() as $name => $values) {\n            $result .= $name . ': ' . implode(', ', $values) . \"\\r\\n\";\n        }\n\n        return trim($result);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Middleware.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Cookie\\CookieJarInterface;\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Promise\\RejectedPromise;\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Log\\LoggerInterface;\nuse Psr\\Log\\LogLevel;\n\n/**\n * Functions used to create and wrap handlers with handler middleware.\n */\nfinal class Middleware\n{\n    /**\n     * Middleware that adds cookies to requests.\n     *\n     * The options array must be set to a CookieJarInterface in order to use\n     * cookies. This is typically handled for you by a client.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function cookies()\n    {\n        return function (callable $handler) {\n            return function ($request, array $options) use ($handler) {\n                if (empty($options['cookies'])) {\n                    return $handler($request, $options);\n                } elseif (!($options['cookies'] instanceof CookieJarInterface)) {\n                    throw new \\InvalidArgumentException('cookies must be an instance of GuzzleHttp\\Cookie\\CookieJarInterface');\n                }\n                $cookieJar = $options['cookies'];\n                $request = $cookieJar->withCookieHeader($request);\n                return $handler($request, $options)\n                    ->then(function ($response) use ($cookieJar, $request) {\n                        $cookieJar->extractCookies($request, $response);\n                        return $response;\n                    }\n                );\n            };\n        };\n    }\n\n    /**\n     * Middleware that throws exceptions for 4xx or 5xx responses when the\n     * \"http_error\" request option is set to true.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function httpErrors()\n    {\n        return function (callable $handler) {\n            return function ($request, array $options) use ($handler) {\n                if (empty($options['http_errors'])) {\n                    return $handler($request, $options);\n                }\n                return $handler($request, $options)->then(\n                    function (ResponseInterface $response) use ($request, $handler) {\n                        $code = $response->getStatusCode();\n                        if ($code < 400) {\n                            return $response;\n                        }\n                        throw RequestException::create($request, $response);\n                    }\n                );\n            };\n        };\n    }\n\n    /**\n     * Middleware that pushes history data to an ArrayAccess container.\n     *\n     * @param array $container Container to hold the history (by reference).\n     *\n     * @return callable Returns a function that accepts the next handler.\n     * @throws \\InvalidArgumentException if container is not an array or ArrayAccess.\n     */\n    public static function history(&$container)\n    {\n        if (!is_array($container) && !$container instanceof \\ArrayAccess) {\n            throw new \\InvalidArgumentException('history container must be an array or object implementing ArrayAccess');\n        }\n\n        return function (callable $handler) use (&$container) {\n            return function ($request, array $options) use ($handler, &$container) {\n                return $handler($request, $options)->then(\n                    function ($value) use ($request, &$container, $options) {\n                        $container[] = [\n                            'request'  => $request,\n                            'response' => $value,\n                            'error'    => null,\n                            'options'  => $options\n                        ];\n                        return $value;\n                    },\n                    function ($reason) use ($request, &$container, $options) {\n                        $container[] = [\n                            'request'  => $request,\n                            'response' => null,\n                            'error'    => $reason,\n                            'options'  => $options\n                        ];\n                        return \\GuzzleHttp\\Promise\\rejection_for($reason);\n                    }\n                );\n            };\n        };\n    }\n\n    /**\n     * Middleware that invokes a callback before and after sending a request.\n     *\n     * The provided listener cannot modify or alter the response. It simply\n     * \"taps\" into the chain to be notified before returning the promise. The\n     * before listener accepts a request and options array, and the after\n     * listener accepts a request, options array, and response promise.\n     *\n     * @param callable $before Function to invoke before forwarding the request.\n     * @param callable $after  Function invoked after forwarding.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function tap(callable $before = null, callable $after = null)\n    {\n        return function (callable $handler) use ($before, $after) {\n            return function ($request, array $options) use ($handler, $before, $after) {\n                if ($before) {\n                    $before($request, $options);\n                }\n                $response = $handler($request, $options);\n                if ($after) {\n                    $after($request, $options, $response);\n                }\n                return $response;\n            };\n        };\n    }\n\n    /**\n     * Middleware that handles request redirects.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function redirect()\n    {\n        return function (callable $handler) {\n            return new RedirectMiddleware($handler);\n        };\n    }\n\n    /**\n     * Middleware that retries requests based on the boolean result of\n     * invoking the provided \"decider\" function.\n     *\n     * If no delay function is provided, a simple implementation of exponential\n     * backoff will be utilized.\n     *\n     * @param callable $decider Function that accepts the number of retries,\n     *                          a request, [response], and [exception] and\n     *                          returns true if the request is to be retried.\n     * @param callable $delay   Function that accepts the number of retries and\n     *                          returns the number of milliseconds to delay.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function retry(callable $decider, callable $delay = null)\n    {\n        return function (callable $handler) use ($decider, $delay) {\n            return new RetryMiddleware($decider, $handler, $delay);\n        };\n    }\n\n    /**\n     * Middleware that logs requests, responses, and errors using a message\n     * formatter.\n     *\n     * @param LoggerInterface  $logger Logs messages.\n     * @param MessageFormatter $formatter Formatter used to create message strings.\n     * @param string           $logLevel Level at which to log requests.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = LogLevel::INFO)\n    {\n        return function (callable $handler) use ($logger, $formatter, $logLevel) {\n            return function ($request, array $options) use ($handler, $logger, $formatter, $logLevel) {\n                return $handler($request, $options)->then(\n                    function ($response) use ($logger, $request, $formatter, $logLevel) {\n                        $message = $formatter->format($request, $response);\n                        $logger->log($logLevel, $message);\n                        return $response;\n                    },\n                    function ($reason) use ($logger, $request, $formatter) {\n                        $response = $reason instanceof RequestException\n                            ? $reason->getResponse()\n                            : null;\n                        $message = $formatter->format($request, $response, $reason);\n                        $logger->notice($message);\n                        return \\GuzzleHttp\\Promise\\rejection_for($reason);\n                    }\n                );\n            };\n        };\n    }\n\n    /**\n     * This middleware adds a default content-type if possible, a default\n     * content-length or transfer-encoding header, and the expect header.\n     *\n     * @return callable\n     */\n    public static function prepareBody()\n    {\n        return function (callable $handler) {\n            return new PrepareBodyMiddleware($handler);\n        };\n    }\n\n    /**\n     * Middleware that applies a map function to the request before passing to\n     * the next handler.\n     *\n     * @param callable $fn Function that accepts a RequestInterface and returns\n     *                     a RequestInterface.\n     * @return callable\n     */\n    public static function mapRequest(callable $fn)\n    {\n        return function (callable $handler) use ($fn) {\n            return function ($request, array $options) use ($handler, $fn) {\n                return $handler($fn($request), $options);\n            };\n        };\n    }\n\n    /**\n     * Middleware that applies a map function to the resolved promise's\n     * response.\n     *\n     * @param callable $fn Function that accepts a ResponseInterface and\n     *                     returns a ResponseInterface.\n     * @return callable\n     */\n    public static function mapResponse(callable $fn)\n    {\n        return function (callable $handler) use ($fn) {\n            return function ($request, array $options) use ($handler, $fn) {\n                return $handler($request, $options)->then($fn);\n            };\n        };\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/Pool.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\PromisorInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse GuzzleHttp\\Promise\\EachPromise;\n\n/**\n * Sends and iterator of requests concurrently using a capped pool size.\n *\n * The pool will read from an iterator until it is cancelled or until the\n * iterator is consumed. When a request is yielded, the request is sent after\n * applying the \"request_options\" request options (if provided in the ctor).\n *\n * When a function is yielded by the iterator, the function is provided the\n * \"request_options\" array that should be merged on top of any existing\n * options, and the function MUST then return a wait-able promise.\n */\nclass Pool implements PromisorInterface\n{\n    /** @var EachPromise */\n    private $each;\n\n    /**\n     * @param ClientInterface $client   Client used to send the requests.\n     * @param array|\\Iterator $requests Requests or functions that return\n     *                                  requests to send concurrently.\n     * @param array           $config   Associative array of options\n     *     - concurrency: (int) Maximum number of requests to send concurrently\n     *     - options: Array of request options to apply to each request.\n     *     - fulfilled: (callable) Function to invoke when a request completes.\n     *     - rejected: (callable) Function to invoke when a request is rejected.\n     */\n    public function __construct(\n        ClientInterface $client,\n        $requests,\n        array $config = []\n    ) {\n        // Backwards compatibility.\n        if (isset($config['pool_size'])) {\n            $config['concurrency'] = $config['pool_size'];\n        } elseif (!isset($config['concurrency'])) {\n            $config['concurrency'] = 25;\n        }\n\n        if (isset($config['options'])) {\n            $opts = $config['options'];\n            unset($config['options']);\n        } else {\n            $opts = [];\n        }\n\n        $iterable = \\GuzzleHttp\\Promise\\iter_for($requests);\n        $requests = function () use ($iterable, $client, $opts) {\n            foreach ($iterable as $key => $rfn) {\n                if ($rfn instanceof RequestInterface) {\n                    yield $key => $client->sendAsync($rfn, $opts);\n                } elseif (is_callable($rfn)) {\n                    yield $key => $rfn($opts);\n                } else {\n                    throw new \\InvalidArgumentException('Each value yielded by '\n                        . 'the iterator must be a Psr7\\Http\\Message\\RequestInterface '\n                        . 'or a callable that returns a promise that fulfills '\n                        . 'with a Psr7\\Message\\Http\\ResponseInterface object.');\n                }\n            }\n        };\n\n        $this->each = new EachPromise($requests(), $config);\n    }\n\n    public function promise()\n    {\n        return $this->each->promise();\n    }\n\n    /**\n     * Sends multiple requests concurrently and returns an array of responses\n     * and exceptions that uses the same ordering as the provided requests.\n     *\n     * IMPORTANT: This method keeps every request and response in memory, and\n     * as such, is NOT recommended when sending a large number or an\n     * indeterminate number of requests concurrently.\n     *\n     * @param ClientInterface $client   Client used to send the requests\n     * @param array|\\Iterator $requests Requests to send concurrently.\n     * @param array           $options  Passes through the options available in\n     *                                  {@see GuzzleHttp\\Pool::__construct}\n     *\n     * @return array Returns an array containing the response or an exception\n     *               in the same order that the requests were sent.\n     * @throws \\InvalidArgumentException if the event format is incorrect.\n     */\n    public static function batch(\n        ClientInterface $client,\n        $requests,\n        array $options = []\n    ) {\n        $res = [];\n        self::cmpCallback($options, 'fulfilled', $res);\n        self::cmpCallback($options, 'rejected', $res);\n        $pool = new static($client, $requests, $options);\n        $pool->promise()->wait();\n        ksort($res);\n\n        return $res;\n    }\n\n    private static function cmpCallback(array &$options, $name, array &$results)\n    {\n        if (!isset($options[$name])) {\n            $options[$name] = function ($v, $k) use (&$results) {\n                $results[$k] = $v;\n            };\n        } else {\n            $currentFn = $options[$name];\n            $options[$name] = function ($v, $k) use (&$results, $currentFn) {\n                $currentFn($v, $k);\n                $results[$k] = $v;\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Prepares requests that contain a body, adding the Content-Length,\n * Content-Type, and Expect headers.\n */\nclass PrepareBodyMiddleware\n{\n    /** @var callable  */\n    private $nextHandler;\n\n    /**\n     * @param callable $nextHandler Next handler to invoke.\n     */\n    public function __construct(callable $nextHandler)\n    {\n        $this->nextHandler = $nextHandler;\n    }\n\n    /**\n     * @param RequestInterface $request\n     * @param array            $options\n     *\n     * @return PromiseInterface\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        $fn = $this->nextHandler;\n\n        // Don't do anything if the request has no body.\n        if ($request->getBody()->getSize() === 0) {\n            return $fn($request, $options);\n        }\n\n        $modify = [];\n\n        // Add a default content-type if possible.\n        if (!$request->hasHeader('Content-Type')) {\n            if ($uri = $request->getBody()->getMetadata('uri')) {\n                if ($type = Psr7\\mimetype_from_filename($uri)) {\n                    $modify['set_headers']['Content-Type'] = $type;\n                }\n            }\n        }\n\n        // Add a default content-length or transfer-encoding header.\n        if (!$request->hasHeader('Content-Length')\n            && !$request->hasHeader('Transfer-Encoding')\n        ) {\n            $size = $request->getBody()->getSize();\n            if ($size !== null) {\n                $modify['set_headers']['Content-Length'] = $size;\n            } else {\n                $modify['set_headers']['Transfer-Encoding'] = 'chunked';\n            }\n        }\n\n        // Add the expect header if needed.\n        $this->addExpectHeader($request, $options, $modify);\n\n        return $fn(Psr7\\modify_request($request, $modify), $options);\n    }\n\n    private function addExpectHeader(\n        RequestInterface $request,\n        array $options,\n        array &$modify\n    ) {\n        // Determine if the Expect header should be used\n        if ($request->hasHeader('Expect')) {\n            return;\n        }\n\n        $expect = isset($options['expect']) ? $options['expect'] : null;\n\n        // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0\n        if ($expect === false || $request->getProtocolVersion() < 1.1) {\n            return;\n        }\n\n        // The expect header is unconditionally enabled\n        if ($expect === true) {\n            $modify['set_headers']['Expect'] = '100-Continue';\n            return;\n        }\n\n        // By default, send the expect header when the payload is > 1mb\n        if ($expect === null) {\n            $expect = 1048576;\n        }\n\n        // Always add if the body cannot be rewound, the size cannot be\n        // determined, or the size is greater than the cutoff threshold\n        $body = $request->getBody();\n        $size = $body->getSize();\n\n        if ($size === null || $size >= (int) $expect || !$body->isSeekable()) {\n            $modify['set_headers']['Expect'] = '100-Continue';\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\BadResponseException;\nuse GuzzleHttp\\Exception\\TooManyRedirectsException;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Request redirect middleware.\n *\n * Apply this middleware like other middleware using\n * {@see GuzzleHttp\\Middleware::redirect()}.\n */\nclass RedirectMiddleware\n{\n    const HISTORY_HEADER = 'X-Guzzle-Redirect-History';\n\n    const STATUS_HISTORY_HEADER = 'X-Guzzle-Redirect-Status-History';\n\n    public static $defaultSettings = [\n        'max'             => 5,\n        'protocols'       => ['http', 'https'],\n        'strict'          => false,\n        'referer'         => false,\n        'track_redirects' => false,\n    ];\n\n    /** @var callable  */\n    private $nextHandler;\n\n    /**\n     * @param callable $nextHandler Next handler to invoke.\n     */\n    public function __construct(callable $nextHandler)\n    {\n        $this->nextHandler = $nextHandler;\n    }\n\n    /**\n     * @param RequestInterface $request\n     * @param array            $options\n     *\n     * @return PromiseInterface\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        $fn = $this->nextHandler;\n\n        if (empty($options['allow_redirects'])) {\n            return $fn($request, $options);\n        }\n\n        if ($options['allow_redirects'] === true) {\n            $options['allow_redirects'] = self::$defaultSettings;\n        } elseif (!is_array($options['allow_redirects'])) {\n            throw new \\InvalidArgumentException('allow_redirects must be true, false, or array');\n        } else {\n            // Merge the default settings with the provided settings\n            $options['allow_redirects'] += self::$defaultSettings;\n        }\n\n        if (empty($options['allow_redirects']['max'])) {\n            return $fn($request, $options);\n        }\n\n        return $fn($request, $options)\n            ->then(function (ResponseInterface $response) use ($request, $options) {\n                return $this->checkRedirect($request, $options, $response);\n            });\n    }\n\n    /**\n     * @param RequestInterface  $request\n     * @param array             $options\n     * @param ResponseInterface|PromiseInterface $response\n     *\n     * @return ResponseInterface|PromiseInterface\n     */\n    public function checkRedirect(\n        RequestInterface $request,\n        array $options,\n        ResponseInterface $response\n    ) {\n        if (substr($response->getStatusCode(), 0, 1) != '3'\n            || !$response->hasHeader('Location')\n        ) {\n            return $response;\n        }\n\n        $this->guardMax($request, $options);\n        $nextRequest = $this->modifyRequest($request, $options, $response);\n\n        if (isset($options['allow_redirects']['on_redirect'])) {\n            call_user_func(\n                $options['allow_redirects']['on_redirect'],\n                $request,\n                $response,\n                $nextRequest->getUri()\n            );\n        }\n\n        /** @var PromiseInterface|ResponseInterface $promise */\n        $promise = $this($nextRequest, $options);\n\n        // Add headers to be able to track history of redirects.\n        if (!empty($options['allow_redirects']['track_redirects'])) {\n            return $this->withTracking(\n                $promise,\n                (string) $nextRequest->getUri(),\n                $response->getStatusCode()\n            );\n        }\n\n        return $promise;\n    }\n\n    private function withTracking(PromiseInterface $promise, $uri, $statusCode)\n    {\n        return $promise->then(\n            function (ResponseInterface $response) use ($uri, $statusCode) {\n                // Note that we are pushing to the front of the list as this\n                // would be an earlier response than what is currently present\n                // in the history header.\n                $historyHeader = $response->getHeader(self::HISTORY_HEADER);\n                $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER);\n                array_unshift($historyHeader, $uri);\n                array_unshift($statusHeader, $statusCode);\n                return $response->withHeader(self::HISTORY_HEADER, $historyHeader)\n                                ->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader);\n            }\n        );\n    }\n\n    private function guardMax(RequestInterface $request, array &$options)\n    {\n        $current = isset($options['__redirect_count'])\n            ? $options['__redirect_count']\n            : 0;\n        $options['__redirect_count'] = $current + 1;\n        $max = $options['allow_redirects']['max'];\n\n        if ($options['__redirect_count'] > $max) {\n            throw new TooManyRedirectsException(\n                \"Will not follow more than {$max} redirects\",\n                $request\n            );\n        }\n    }\n\n    /**\n     * @param RequestInterface  $request\n     * @param array             $options\n     * @param ResponseInterface $response\n     *\n     * @return RequestInterface\n     */\n    public function modifyRequest(\n        RequestInterface $request,\n        array $options,\n        ResponseInterface $response\n    ) {\n        // Request modifications to apply.\n        $modify = [];\n        $protocols = $options['allow_redirects']['protocols'];\n\n        // Use a GET request if this is an entity enclosing request and we are\n        // not forcing RFC compliance, but rather emulating what all browsers\n        // would do.\n        $statusCode = $response->getStatusCode();\n        if ($statusCode == 303 ||\n            ($statusCode <= 302 && $request->getBody() && !$options['allow_redirects']['strict'])\n        ) {\n            $modify['method'] = 'GET';\n            $modify['body'] = '';\n        }\n\n        $modify['uri'] = $this->redirectUri($request, $response, $protocols);\n        Psr7\\rewind_body($request);\n\n        // Add the Referer header if it is told to do so and only\n        // add the header if we are not redirecting from https to http.\n        if ($options['allow_redirects']['referer']\n            && $modify['uri']->getScheme() === $request->getUri()->getScheme()\n        ) {\n            $uri = $request->getUri()->withUserInfo('', '');\n            $modify['set_headers']['Referer'] = (string) $uri;\n        } else {\n            $modify['remove_headers'][] = 'Referer';\n        }\n\n        // Remove Authorization header if host is different.\n        if ($request->getUri()->getHost() !== $modify['uri']->getHost()) {\n            $modify['remove_headers'][] = 'Authorization';\n        }\n\n        return Psr7\\modify_request($request, $modify);\n    }\n\n    /**\n     * Set the appropriate URL on the request based on the location header\n     *\n     * @param RequestInterface  $request\n     * @param ResponseInterface $response\n     * @param array             $protocols\n     *\n     * @return UriInterface\n     */\n    private function redirectUri(\n        RequestInterface $request,\n        ResponseInterface $response,\n        array $protocols\n    ) {\n        $location = Psr7\\UriResolver::resolve(\n            $request->getUri(),\n            new Psr7\\Uri($response->getHeaderLine('Location'))\n        );\n\n        // Ensure that the redirect URI is allowed based on the protocols.\n        if (!in_array($location->getScheme(), $protocols)) {\n            throw new BadResponseException(\n                sprintf(\n                    'Redirect URI, %s, does not use one of the allowed redirect protocols: %s',\n                    $location,\n                    implode(', ', $protocols)\n                ),\n                $request,\n                $response\n            );\n        }\n\n        return $location;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/RequestOptions.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\n/**\n * This class contains a list of built-in Guzzle request options.\n *\n * More documentation for each option can be found at http://guzzlephp.org/.\n *\n * @link http://docs.guzzlephp.org/en/v6/request-options.html\n */\nfinal class RequestOptions\n{\n    /**\n     * allow_redirects: (bool|array) Controls redirect behavior. Pass false\n     * to disable redirects, pass true to enable redirects, pass an\n     * associative to provide custom redirect settings. Defaults to \"false\".\n     * This option only works if your handler has the RedirectMiddleware. When\n     * passing an associative array, you can provide the following key value\n     * pairs:\n     *\n     * - max: (int, default=5) maximum number of allowed redirects.\n     * - strict: (bool, default=false) Set to true to use strict redirects\n     *   meaning redirect POST requests with POST requests vs. doing what most\n     *   browsers do which is redirect POST requests with GET requests\n     * - referer: (bool, default=true) Set to false to disable the Referer\n     *   header.\n     * - protocols: (array, default=['http', 'https']) Allowed redirect\n     *   protocols.\n     * - on_redirect: (callable) PHP callable that is invoked when a redirect\n     *   is encountered. The callable is invoked with the request, the redirect\n     *   response that was received, and the effective URI. Any return value\n     *   from the on_redirect function is ignored.\n     */\n    const ALLOW_REDIRECTS = 'allow_redirects';\n\n    /**\n     * auth: (array) Pass an array of HTTP authentication parameters to use\n     * with the request. The array must contain the username in index [0],\n     * the password in index [1], and you can optionally provide a built-in\n     * authentication type in index [2]. Pass null to disable authentication\n     * for a request.\n     */\n    const AUTH = 'auth';\n\n    /**\n     * body: (resource|string|null|int|float|StreamInterface|callable|\\Iterator)\n     * Body to send in the request.\n     */\n    const BODY = 'body';\n\n    /**\n     * cert: (string|array) Set to a string to specify the path to a file\n     * containing a PEM formatted SSL client side certificate. If a password\n     * is required, then set cert to an array containing the path to the PEM\n     * file in the first array element followed by the certificate password\n     * in the second array element.\n     */\n    const CERT = 'cert';\n\n    /**\n     * cookies: (bool|GuzzleHttp\\Cookie\\CookieJarInterface, default=false)\n     * Specifies whether or not cookies are used in a request or what cookie\n     * jar to use or what cookies to send. This option only works if your\n     * handler has the `cookie` middleware. Valid values are `false` and\n     * an instance of {@see GuzzleHttp\\Cookie\\CookieJarInterface}.\n     */\n    const COOKIES = 'cookies';\n\n    /**\n     * connect_timeout: (float, default=0) Float describing the number of\n     * seconds to wait while trying to connect to a server. Use 0 to wait\n     * indefinitely (the default behavior).\n     */\n    const CONNECT_TIMEOUT = 'connect_timeout';\n\n    /**\n     * debug: (bool|resource) Set to true or set to a PHP stream returned by\n     * fopen()  enable debug output with the HTTP handler used to send a\n     * request.\n     */\n    const DEBUG = 'debug';\n\n    /**\n     * decode_content: (bool, default=true) Specify whether or not\n     * Content-Encoding responses (gzip, deflate, etc.) are automatically\n     * decoded.\n     */\n    const DECODE_CONTENT = 'decode_content';\n\n    /**\n     * delay: (int) The amount of time to delay before sending in milliseconds.\n     */\n    const DELAY = 'delay';\n\n    /**\n     * expect: (bool|integer) Controls the behavior of the\n     * \"Expect: 100-Continue\" header.\n     *\n     * Set to `true` to enable the \"Expect: 100-Continue\" header for all\n     * requests that sends a body. Set to `false` to disable the\n     * \"Expect: 100-Continue\" header for all requests. Set to a number so that\n     * the size of the payload must be greater than the number in order to send\n     * the Expect header. Setting to a number will send the Expect header for\n     * all requests in which the size of the payload cannot be determined or\n     * where the body is not rewindable.\n     *\n     * By default, Guzzle will add the \"Expect: 100-Continue\" header when the\n     * size of the body of a request is greater than 1 MB and a request is\n     * using HTTP/1.1.\n     */\n    const EXPECT = 'expect';\n\n    /**\n     * form_params: (array) Associative array of form field names to values\n     * where each value is a string or array of strings. Sets the Content-Type\n     * header to application/x-www-form-urlencoded when no Content-Type header\n     * is already present.\n     */\n    const FORM_PARAMS = 'form_params';\n\n    /**\n     * headers: (array) Associative array of HTTP headers. Each value MUST be\n     * a string or array of strings.\n     */\n    const HEADERS = 'headers';\n\n    /**\n     * http_errors: (bool, default=true) Set to false to disable exceptions\n     * when a non- successful HTTP response is received. By default,\n     * exceptions will be thrown for 4xx and 5xx responses. This option only\n     * works if your handler has the `httpErrors` middleware.\n     */\n    const HTTP_ERRORS = 'http_errors';\n\n    /**\n     * json: (mixed) Adds JSON data to a request. The provided value is JSON\n     * encoded and a Content-Type header of application/json will be added to\n     * the request if no Content-Type header is already present.\n     */\n    const JSON = 'json';\n\n    /**\n     * multipart: (array) Array of associative arrays, each containing a\n     * required \"name\" key mapping to the form field, name, a required\n     * \"contents\" key mapping to a StreamInterface|resource|string, an\n     * optional \"headers\" associative array of custom headers, and an\n     * optional \"filename\" key mapping to a string to send as the filename in\n     * the part. If no \"filename\" key is present, then no \"filename\" attribute\n     * will be added to the part.\n     */\n    const MULTIPART = 'multipart';\n\n    /**\n     * on_headers: (callable) A callable that is invoked when the HTTP headers\n     * of the response have been received but the body has not yet begun to\n     * download.\n     */\n    const ON_HEADERS = 'on_headers';\n\n    /**\n     * on_stats: (callable) allows you to get access to transfer statistics of\n     * a request and access the lower level transfer details of the handler\n     * associated with your client. ``on_stats`` is a callable that is invoked\n     * when a handler has finished sending a request. The callback is invoked\n     * with transfer statistics about the request, the response received, or\n     * the error encountered. Included in the data is the total amount of time\n     * taken to send the request.\n     */\n    const ON_STATS = 'on_stats';\n\n    /**\n     * progress: (callable) Defines a function to invoke when transfer\n     * progress is made. The function accepts the following positional\n     * arguments: the total number of bytes expected to be downloaded, the\n     * number of bytes downloaded so far, the number of bytes expected to be\n     * uploaded, the number of bytes uploaded so far.\n     */\n    const PROGRESS = 'progress';\n\n    /**\n     * proxy: (string|array) Pass a string to specify an HTTP proxy, or an\n     * array to specify different proxies for different protocols (where the\n     * key is the protocol and the value is a proxy string).\n     */\n    const PROXY = 'proxy';\n\n    /**\n     * query: (array|string) Associative array of query string values to add\n     * to the request. This option uses PHP's http_build_query() to create\n     * the string representation. Pass a string value if you need more\n     * control than what this method provides\n     */\n    const QUERY = 'query';\n\n    /**\n     * sink: (resource|string|StreamInterface) Where the data of the\n     * response is written to. Defaults to a PHP temp stream. Providing a\n     * string will write data to a file by the given name.\n     */\n    const SINK = 'sink';\n\n    /**\n     * synchronous: (bool) Set to true to inform HTTP handlers that you intend\n     * on waiting on the response. This can be useful for optimizations. Note\n     * that a promise is still returned if you are using one of the async\n     * client methods.\n     */\n    const SYNCHRONOUS = 'synchronous';\n\n    /**\n     * ssl_key: (array|string) Specify the path to a file containing a private\n     * SSL key in PEM format. If a password is required, then set to an array\n     * containing the path to the SSL key in the first array element followed\n     * by the password required for the certificate in the second element.\n     */\n    const SSL_KEY = 'ssl_key';\n\n    /**\n     * stream: Set to true to attempt to stream a response rather than\n     * download it all up-front.\n     */\n    const STREAM = 'stream';\n\n    /**\n     * verify: (bool|string, default=true) Describes the SSL certificate\n     * verification behavior of a request. Set to true to enable SSL\n     * certificate verification using the system CA bundle when available\n     * (the default). Set to false to disable certificate verification (this\n     * is insecure!). Set to a string to provide the path to a CA bundle on\n     * disk to enable verification using a custom certificate.\n     */\n    const VERIFY = 'verify';\n\n    /**\n     * timeout: (float, default=0) Float describing the timeout of the\n     * request in seconds. Use 0 to wait indefinitely (the default behavior).\n     */\n    const TIMEOUT = 'timeout';\n\n    /**\n     * read_timeout: (float, default=default_socket_timeout ini setting) Float describing\n     * the body read timeout, for stream requests.\n     */\n    const READ_TIMEOUT = 'read_timeout';\n\n    /**\n     * version: (float) Specifies the HTTP protocol version to attempt to use.\n     */\n    const VERSION = 'version';\n\n    /**\n     * force_ip_resolve: (bool) Force client to use only ipv4 or ipv6 protocol\n     */\n    const FORCE_IP_RESOLVE = 'force_ip_resolve';\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Promise\\RejectedPromise;\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Middleware that retries requests based on the boolean result of\n * invoking the provided \"decider\" function.\n */\nclass RetryMiddleware\n{\n    /** @var callable  */\n    private $nextHandler;\n\n    /** @var callable */\n    private $decider;\n\n    /**\n     * @param callable $decider     Function that accepts the number of retries,\n     *                              a request, [response], and [exception] and\n     *                              returns true if the request is to be\n     *                              retried.\n     * @param callable $nextHandler Next handler to invoke.\n     * @param callable $delay       Function that accepts the number of retries\n     *                              and [response] and returns the number of\n     *                              milliseconds to delay.\n     */\n    public function __construct(\n        callable $decider,\n        callable $nextHandler,\n        callable $delay = null\n    ) {\n        $this->decider = $decider;\n        $this->nextHandler = $nextHandler;\n        $this->delay = $delay ?: __CLASS__ . '::exponentialDelay';\n    }\n\n    /**\n     * Default exponential backoff delay function.\n     *\n     * @param $retries\n     *\n     * @return int\n     */\n    public static function exponentialDelay($retries)\n    {\n        return (int) pow(2, $retries - 1);\n    }\n\n    /**\n     * @param RequestInterface $request\n     * @param array            $options\n     *\n     * @return PromiseInterface\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        if (!isset($options['retries'])) {\n            $options['retries'] = 0;\n        }\n\n        $fn = $this->nextHandler;\n        return $fn($request, $options)\n            ->then(\n                $this->onFulfilled($request, $options),\n                $this->onRejected($request, $options)\n            );\n    }\n\n    private function onFulfilled(RequestInterface $req, array $options)\n    {\n        return function ($value) use ($req, $options) {\n            if (!call_user_func(\n                $this->decider,\n                $options['retries'],\n                $req,\n                $value,\n                null\n            )) {\n                return $value;\n            }\n            return $this->doRetry($req, $options, $value);\n        };\n    }\n\n    private function onRejected(RequestInterface $req, array $options)\n    {\n        return function ($reason) use ($req, $options) {\n            if (!call_user_func(\n                $this->decider,\n                $options['retries'],\n                $req,\n                null,\n                $reason\n            )) {\n                return \\GuzzleHttp\\Promise\\rejection_for($reason);\n            }\n            return $this->doRetry($req, $options);\n        };\n    }\n\n    private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null)\n    {\n        $options['delay'] = call_user_func($this->delay, ++$options['retries'], $response);\n\n        return $this($request, $options);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/TransferStats.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Represents data at the point after it was transferred either successfully\n * or after a network error.\n */\nfinal class TransferStats\n{\n    private $request;\n    private $response;\n    private $transferTime;\n    private $handlerStats;\n    private $handlerErrorData;\n\n    /**\n     * @param RequestInterface  $request          Request that was sent.\n     * @param ResponseInterface $response         Response received (if any)\n     * @param null              $transferTime     Total handler transfer time.\n     * @param mixed             $handlerErrorData Handler error data.\n     * @param array             $handlerStats     Handler specific stats.\n     */\n    public function __construct(\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        $transferTime = null,\n        $handlerErrorData = null,\n        $handlerStats = []\n    ) {\n        $this->request = $request;\n        $this->response = $response;\n        $this->transferTime = $transferTime;\n        $this->handlerErrorData = $handlerErrorData;\n        $this->handlerStats = $handlerStats;\n    }\n\n    /**\n     * @return RequestInterface\n     */\n    public function getRequest()\n    {\n        return $this->request;\n    }\n\n    /**\n     * Returns the response that was received (if any).\n     *\n     * @return ResponseInterface|null\n     */\n    public function getResponse()\n    {\n        return $this->response;\n    }\n\n    /**\n     * Returns true if a response was received.\n     *\n     * @return bool\n     */\n    public function hasResponse()\n    {\n        return $this->response !== null;\n    }\n\n    /**\n     * Gets handler specific error data.\n     *\n     * This might be an exception, a integer representing an error code, or\n     * anything else. Relying on this value assumes that you know what handler\n     * you are using.\n     *\n     * @return mixed\n     */\n    public function getHandlerErrorData()\n    {\n        return $this->handlerErrorData;\n    }\n\n    /**\n     * Get the effective URI the request was sent to.\n     *\n     * @return UriInterface\n     */\n    public function getEffectiveUri()\n    {\n        return $this->request->getUri();\n    }\n\n    /**\n     * Get the estimated time the request was being transferred by the handler.\n     *\n     * @return float Time in seconds.\n     */\n    public function getTransferTime()\n    {\n        return $this->transferTime;\n    }\n\n    /**\n     * Gets an array of all of the handler specific transfer data.\n     *\n     * @return array\n     */\n    public function getHandlerStats()\n    {\n        return $this->handlerStats;\n    }\n\n    /**\n     * Get a specific handler statistic from the handler by name.\n     *\n     * @param string $stat Handler specific transfer stat to retrieve.\n     *\n     * @return mixed|null\n     */\n    public function getHandlerStat($stat)\n    {\n        return isset($this->handlerStats[$stat])\n            ? $this->handlerStats[$stat]\n            : null;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/UriTemplate.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\n/**\n * Expands URI templates. Userland implementation of PECL uri_template.\n *\n * @link http://tools.ietf.org/html/rfc6570\n */\nclass UriTemplate\n{\n    /** @var string URI template */\n    private $template;\n\n    /** @var array Variables to use in the template expansion */\n    private $variables;\n\n    /** @var array Hash for quick operator lookups */\n    private static $operatorHash = [\n        ''  => ['prefix' => '',  'joiner' => ',', 'query' => false],\n        '+' => ['prefix' => '',  'joiner' => ',', 'query' => false],\n        '#' => ['prefix' => '#', 'joiner' => ',', 'query' => false],\n        '.' => ['prefix' => '.', 'joiner' => '.', 'query' => false],\n        '/' => ['prefix' => '/', 'joiner' => '/', 'query' => false],\n        ';' => ['prefix' => ';', 'joiner' => ';', 'query' => true],\n        '?' => ['prefix' => '?', 'joiner' => '&', 'query' => true],\n        '&' => ['prefix' => '&', 'joiner' => '&', 'query' => true]\n    ];\n\n    /** @var array Delimiters */\n    private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$',\n        '&', '\\'', '(', ')', '*', '+', ',', ';', '='];\n\n    /** @var array Percent encoded delimiters */\n    private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D',\n        '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C',\n        '%3B', '%3D'];\n\n    public function expand($template, array $variables)\n    {\n        if (false === strpos($template, '{')) {\n            return $template;\n        }\n\n        $this->template = $template;\n        $this->variables = $variables;\n\n        return preg_replace_callback(\n            '/\\{([^\\}]+)\\}/',\n            [$this, 'expandMatch'],\n            $this->template\n        );\n    }\n\n    /**\n     * Parse an expression into parts\n     *\n     * @param string $expression Expression to parse\n     *\n     * @return array Returns an associative array of parts\n     */\n    private function parseExpression($expression)\n    {\n        $result = [];\n\n        if (isset(self::$operatorHash[$expression[0]])) {\n            $result['operator'] = $expression[0];\n            $expression = substr($expression, 1);\n        } else {\n            $result['operator'] = '';\n        }\n\n        foreach (explode(',', $expression) as $value) {\n            $value = trim($value);\n            $varspec = [];\n            if ($colonPos = strpos($value, ':')) {\n                $varspec['value'] = substr($value, 0, $colonPos);\n                $varspec['modifier'] = ':';\n                $varspec['position'] = (int) substr($value, $colonPos + 1);\n            } elseif (substr($value, -1) === '*') {\n                $varspec['modifier'] = '*';\n                $varspec['value'] = substr($value, 0, -1);\n            } else {\n                $varspec['value'] = (string) $value;\n                $varspec['modifier'] = '';\n            }\n            $result['values'][] = $varspec;\n        }\n\n        return $result;\n    }\n\n    /**\n     * Process an expansion\n     *\n     * @param array $matches Matches met in the preg_replace_callback\n     *\n     * @return string Returns the replacement string\n     */\n    private function expandMatch(array $matches)\n    {\n        static $rfc1738to3986 = ['+' => '%20', '%7e' => '~'];\n\n        $replacements = [];\n        $parsed = self::parseExpression($matches[1]);\n        $prefix = self::$operatorHash[$parsed['operator']]['prefix'];\n        $joiner = self::$operatorHash[$parsed['operator']]['joiner'];\n        $useQuery = self::$operatorHash[$parsed['operator']]['query'];\n\n        foreach ($parsed['values'] as $value) {\n\n            if (!isset($this->variables[$value['value']])) {\n                continue;\n            }\n\n            $variable = $this->variables[$value['value']];\n            $actuallyUseQuery = $useQuery;\n            $expanded = '';\n\n            if (is_array($variable)) {\n\n                $isAssoc = $this->isAssoc($variable);\n                $kvp = [];\n                foreach ($variable as $key => $var) {\n\n                    if ($isAssoc) {\n                        $key = rawurlencode($key);\n                        $isNestedArray = is_array($var);\n                    } else {\n                        $isNestedArray = false;\n                    }\n\n                    if (!$isNestedArray) {\n                        $var = rawurlencode($var);\n                        if ($parsed['operator'] === '+' ||\n                            $parsed['operator'] === '#'\n                        ) {\n                            $var = $this->decodeReserved($var);\n                        }\n                    }\n\n                    if ($value['modifier'] === '*') {\n                        if ($isAssoc) {\n                            if ($isNestedArray) {\n                                // Nested arrays must allow for deeply nested\n                                // structures.\n                                $var = strtr(\n                                    http_build_query([$key => $var]),\n                                    $rfc1738to3986\n                                );\n                            } else {\n                                $var = $key . '=' . $var;\n                            }\n                        } elseif ($key > 0 && $actuallyUseQuery) {\n                            $var = $value['value'] . '=' . $var;\n                        }\n                    }\n\n                    $kvp[$key] = $var;\n                }\n\n                if (empty($variable)) {\n                    $actuallyUseQuery = false;\n                } elseif ($value['modifier'] === '*') {\n                    $expanded = implode($joiner, $kvp);\n                    if ($isAssoc) {\n                        // Don't prepend the value name when using the explode\n                        // modifier with an associative array.\n                        $actuallyUseQuery = false;\n                    }\n                } else {\n                    if ($isAssoc) {\n                        // When an associative array is encountered and the\n                        // explode modifier is not set, then the result must be\n                        // a comma separated list of keys followed by their\n                        // respective values.\n                        foreach ($kvp as $k => &$v) {\n                            $v = $k . ',' . $v;\n                        }\n                    }\n                    $expanded = implode(',', $kvp);\n                }\n\n            } else {\n                if ($value['modifier'] === ':') {\n                    $variable = substr($variable, 0, $value['position']);\n                }\n                $expanded = rawurlencode($variable);\n                if ($parsed['operator'] === '+' || $parsed['operator'] === '#') {\n                    $expanded = $this->decodeReserved($expanded);\n                }\n            }\n\n            if ($actuallyUseQuery) {\n                if (!$expanded && $joiner !== '&') {\n                    $expanded = $value['value'];\n                } else {\n                    $expanded = $value['value'] . '=' . $expanded;\n                }\n            }\n\n            $replacements[] = $expanded;\n        }\n\n        $ret = implode($joiner, $replacements);\n        if ($ret && $prefix) {\n            return $prefix . $ret;\n        }\n\n        return $ret;\n    }\n\n    /**\n     * Determines if an array is associative.\n     *\n     * This makes the assumption that input arrays are sequences or hashes.\n     * This assumption is a tradeoff for accuracy in favor of speed, but it\n     * should work in almost every case where input is supplied for a URI\n     * template.\n     *\n     * @param array $array Array to check\n     *\n     * @return bool\n     */\n    private function isAssoc(array $array)\n    {\n        return $array && array_keys($array)[0] !== 0;\n    }\n\n    /**\n     * Removes percent encoding on reserved characters (used with + and #\n     * modifiers).\n     *\n     * @param string $string String to fix\n     *\n     * @return string\n     */\n    private function decodeReserved($string)\n    {\n        return str_replace(self::$delimsPct, self::$delims, $string);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/functions.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Handler\\CurlHandler;\nuse GuzzleHttp\\Handler\\CurlMultiHandler;\nuse GuzzleHttp\\Handler\\Proxy;\nuse GuzzleHttp\\Handler\\StreamHandler;\n\n/**\n * Expands a URI template\n *\n * @param string $template  URI template\n * @param array  $variables Template variables\n *\n * @return string\n */\nfunction uri_template($template, array $variables)\n{\n    if (extension_loaded('uri_template')) {\n        // @codeCoverageIgnoreStart\n        return \\uri_template($template, $variables);\n        // @codeCoverageIgnoreEnd\n    }\n\n    static $uriTemplate;\n    if (!$uriTemplate) {\n        $uriTemplate = new UriTemplate();\n    }\n\n    return $uriTemplate->expand($template, $variables);\n}\n\n/**\n * Debug function used to describe the provided value type and class.\n *\n * @param mixed $input\n *\n * @return string Returns a string containing the type of the variable and\n *                if a class is provided, the class name.\n */\nfunction describe_type($input)\n{\n    switch (gettype($input)) {\n        case 'object':\n            return 'object(' . get_class($input) . ')';\n        case 'array':\n            return 'array(' . count($input) . ')';\n        default:\n            ob_start();\n            var_dump($input);\n            // normalize float vs double\n            return str_replace('double(', 'float(', rtrim(ob_get_clean()));\n    }\n}\n\n/**\n * Parses an array of header lines into an associative array of headers.\n *\n * @param array $lines Header lines array of strings in the following\n *                     format: \"Name: Value\"\n * @return array\n */\nfunction headers_from_lines($lines)\n{\n    $headers = [];\n\n    foreach ($lines as $line) {\n        $parts = explode(':', $line, 2);\n        $headers[trim($parts[0])][] = isset($parts[1])\n            ? trim($parts[1])\n            : null;\n    }\n\n    return $headers;\n}\n\n/**\n * Returns a debug stream based on the provided variable.\n *\n * @param mixed $value Optional value\n *\n * @return resource\n */\nfunction debug_resource($value = null)\n{\n    if (is_resource($value)) {\n        return $value;\n    } elseif (defined('STDOUT')) {\n        return STDOUT;\n    }\n\n    return fopen('php://output', 'w');\n}\n\n/**\n * Chooses and creates a default handler to use based on the environment.\n *\n * The returned handler is not wrapped by any default middlewares.\n *\n * @throws \\RuntimeException if no viable Handler is available.\n * @return callable Returns the best handler for the given system.\n */\nfunction choose_handler()\n{\n    $handler = null;\n    if (function_exists('curl_multi_exec') && function_exists('curl_exec')) {\n        $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler());\n    } elseif (function_exists('curl_exec')) {\n        $handler = new CurlHandler();\n    } elseif (function_exists('curl_multi_exec')) {\n        $handler = new CurlMultiHandler();\n    }\n\n    if (ini_get('allow_url_fopen')) {\n        $handler = $handler\n            ? Proxy::wrapStreaming($handler, new StreamHandler())\n            : new StreamHandler();\n    } elseif (!$handler) {\n        throw new \\RuntimeException('GuzzleHttp requires cURL, the '\n            . 'allow_url_fopen ini setting, or a custom HTTP handler.');\n    }\n\n    return $handler;\n}\n\n/**\n * Get the default User-Agent string to use with Guzzle\n *\n * @return string\n */\nfunction default_user_agent()\n{\n    static $defaultAgent = '';\n\n    if (!$defaultAgent) {\n        $defaultAgent = 'GuzzleHttp/' . Client::VERSION;\n        if (extension_loaded('curl') && function_exists('curl_version')) {\n            $defaultAgent .= ' curl/' . \\curl_version()['version'];\n        }\n        $defaultAgent .= ' PHP/' . PHP_VERSION;\n    }\n\n    return $defaultAgent;\n}\n\n/**\n * Returns the default cacert bundle for the current system.\n *\n * First, the openssl.cafile and curl.cainfo php.ini settings are checked.\n * If those settings are not configured, then the common locations for\n * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X\n * and Windows are checked. If any of these file locations are found on\n * disk, they will be utilized.\n *\n * Note: the result of this function is cached for subsequent calls.\n *\n * @return string\n * @throws \\RuntimeException if no bundle can be found.\n */\nfunction default_ca_bundle()\n{\n    static $cached = null;\n    static $cafiles = [\n        // Red Hat, CentOS, Fedora (provided by the ca-certificates package)\n        '/etc/pki/tls/certs/ca-bundle.crt',\n        // Ubuntu, Debian (provided by the ca-certificates package)\n        '/etc/ssl/certs/ca-certificates.crt',\n        // FreeBSD (provided by the ca_root_nss package)\n        '/usr/local/share/certs/ca-root-nss.crt',\n        // SLES 12 (provided by the ca-certificates package)\n        '/var/lib/ca-certificates/ca-bundle.pem',\n        // OS X provided by homebrew (using the default path)\n        '/usr/local/etc/openssl/cert.pem',\n        // Google app engine\n        '/etc/ca-certificates.crt',\n        // Windows?\n        'C:\\\\windows\\\\system32\\\\curl-ca-bundle.crt',\n        'C:\\\\windows\\\\curl-ca-bundle.crt',\n    ];\n\n    if ($cached) {\n        return $cached;\n    }\n\n    if ($ca = ini_get('openssl.cafile')) {\n        return $cached = $ca;\n    }\n\n    if ($ca = ini_get('curl.cainfo')) {\n        return $cached = $ca;\n    }\n\n    foreach ($cafiles as $filename) {\n        if (file_exists($filename)) {\n            return $cached = $filename;\n        }\n    }\n\n    throw new \\RuntimeException(<<< EOT\nNo system CA bundle could be found in any of the the common system locations.\nPHP versions earlier than 5.6 are not properly configured to use the system's\nCA bundle by default. In order to verify peer certificates, you will need to\nsupply the path on disk to a certificate bundle to the 'verify' request\noption: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not\nneed a specific certificate bundle, then Mozilla provides a commonly used CA\nbundle which can be downloaded here (provided by the maintainer of cURL):\nhttps://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once\nyou have a CA bundle available on disk, you can set the 'openssl.cafile' PHP\nini setting to point to the path to the file, allowing you to omit the 'verify'\nrequest option. See http://curl.haxx.se/docs/sslcerts.html for more\ninformation.\nEOT\n    );\n}\n\n/**\n * Creates an associative array of lowercase header names to the actual\n * header casing.\n *\n * @param array $headers\n *\n * @return array\n */\nfunction normalize_header_keys(array $headers)\n{\n    $result = [];\n    foreach (array_keys($headers) as $key) {\n        $result[strtolower($key)] = $key;\n    }\n\n    return $result;\n}\n\n/**\n * Returns true if the provided host matches any of the no proxy areas.\n *\n * This method will strip a port from the host if it is present. Each pattern\n * can be matched with an exact match (e.g., \"foo.com\" == \"foo.com\") or a\n * partial match: (e.g., \"foo.com\" == \"baz.foo.com\" and \".foo.com\" ==\n * \"baz.foo.com\", but \".foo.com\" != \"foo.com\").\n *\n * Areas are matched in the following cases:\n * 1. \"*\" (without quotes) always matches any hosts.\n * 2. An exact match.\n * 3. The area starts with \".\" and the area is the last part of the host. e.g.\n *    '.mit.edu' will match any host that ends with '.mit.edu'.\n *\n * @param string $host         Host to check against the patterns.\n * @param array  $noProxyArray An array of host patterns.\n *\n * @return bool\n */\nfunction is_host_in_noproxy($host, array $noProxyArray)\n{\n    if (strlen($host) === 0) {\n        throw new \\InvalidArgumentException('Empty host provided');\n    }\n\n    // Strip port if present.\n    if (strpos($host, ':')) {\n        $host = explode($host, ':', 2)[0];\n    }\n\n    foreach ($noProxyArray as $area) {\n        // Always match on wildcards.\n        if ($area === '*') {\n            return true;\n        } elseif (empty($area)) {\n            // Don't match on empty values.\n            continue;\n        } elseif ($area === $host) {\n            // Exact matches.\n            return true;\n        } else {\n            // Special match if the area when prefixed with \".\". Remove any\n            // existing leading \".\" and add a new leading \".\".\n            $area = '.' . ltrim($area, '.');\n            if (substr($host, -(strlen($area))) === $area) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n}\n\n/**\n * Wrapper for json_decode that throws when an error occurs.\n *\n * @param string $json    JSON data to parse\n * @param bool $assoc     When true, returned objects will be converted\n *                        into associative arrays.\n * @param int    $depth   User specified recursion depth.\n * @param int    $options Bitmask of JSON decode options.\n *\n * @return mixed\n * @throws \\InvalidArgumentException if the JSON cannot be decoded.\n * @link http://www.php.net/manual/en/function.json-decode.php\n */\nfunction json_decode($json, $assoc = false, $depth = 512, $options = 0)\n{\n    $data = \\json_decode($json, $assoc, $depth, $options);\n    if (JSON_ERROR_NONE !== json_last_error()) {\n        throw new \\InvalidArgumentException(\n            'json_decode error: ' . json_last_error_msg());\n    }\n\n    return $data;\n}\n\n/**\n * Wrapper for JSON encoding that throws when an error occurs.\n *\n * @param mixed $value   The value being encoded\n * @param int    $options JSON encode option bitmask\n * @param int    $depth   Set the maximum depth. Must be greater than zero.\n *\n * @return string\n * @throws \\InvalidArgumentException if the JSON cannot be encoded.\n * @link http://www.php.net/manual/en/function.json-encode.php\n */\nfunction json_encode($value, $options = 0, $depth = 512)\n{\n    $json = \\json_encode($value, $options, $depth);\n    if (JSON_ERROR_NONE !== json_last_error()) {\n        throw new \\InvalidArgumentException(\n            'json_encode error: ' . json_last_error_msg());\n    }\n\n    return $json;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/guzzle/src/functions_include.php",
    "content": "<?php\n\n// Don't redefine the functions if included multiple times.\nif (!function_exists('GuzzleHttp\\uri_template')) {\n    require __DIR__ . '/functions.php';\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/CHANGELOG.md",
    "content": "# CHANGELOG\n\n\n## 1.3.1 - 2016-12-20\n\n### Fixed\n\n- `wait()` foreign promise compatibility\n\n\n## 1.3.0 - 2016-11-18\n\n### Added\n\n- Adds support for custom task queues.\n\n### Fixed\n\n- Fixed coroutine promise memory leak.\n\n\n## 1.2.0 - 2016-05-18\n\n### Changed\n\n- Update to now catch `\\Throwable` on PHP 7+\n\n\n## 1.1.0 - 2016-03-07\n\n### Changed\n\n- Update EachPromise to prevent recurring on a iterator when advancing, as this\n  could trigger fatal generator errors.\n- Update Promise to allow recursive waiting without unwrapping exceptions.\n\n\n## 1.0.3 - 2015-10-15\n\n### Changed\n\n- Update EachPromise to immediately resolve when the underlying promise iterator\n  is empty. Previously, such a promise would throw an exception when its `wait`\n  function was called.\n\n\n## 1.0.2 - 2015-05-15\n\n### Changed\n\n- Conditionally require functions.php.\n\n\n## 1.0.1 - 2015-06-24\n\n### Changed\n\n- Updating EachPromise to call next on the underlying promise iterator as late\n  as possible to ensure that generators that generate new requests based on\n  callbacks are not iterated until after callbacks are invoked.\n\n\n## 1.0.0 - 2015-05-12\n\n- Initial release\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/LICENSE",
    "content": "Copyright (c) 2015-2016 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/Makefile",
    "content": "all: clean test\n\ntest:\n\tvendor/bin/phpunit\n\ncoverage:\n\tvendor/bin/phpunit --coverage-html=artifacts/coverage\n\nview-coverage:\n\topen artifacts/coverage/index.html\n\nclean:\n\trm -rf artifacts/*\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/README.md",
    "content": "# Guzzle Promises\n\n[Promises/A+](https://promisesaplus.com/) implementation that handles promise\nchaining and resolution iteratively, allowing for \"infinite\" promise chaining\nwhile keeping the stack size constant. Read [this blog post](https://blog.domenic.me/youre-missing-the-point-of-promises/)\nfor a general introduction to promises.\n\n- [Features](#features)\n- [Quick start](#quick-start)\n- [Synchronous wait](#synchronous-wait)\n- [Cancellation](#cancellation)\n- [API](#api)\n  - [Promise](#promise)\n  - [FulfilledPromise](#fulfilledpromise)\n  - [RejectedPromise](#rejectedpromise)\n- [Promise interop](#promise-interop)\n- [Implementation notes](#implementation-notes)\n\n\n# Features\n\n- [Promises/A+](https://promisesaplus.com/) implementation.\n- Promise resolution and chaining is handled iteratively, allowing for\n  \"infinite\" promise chaining.\n- Promises have a synchronous `wait` method.\n- Promises can be cancelled.\n- Works with any object that has a `then` function.\n- C# style async/await coroutine promises using\n  `GuzzleHttp\\Promise\\coroutine()`.\n\n\n# Quick start\n\nA *promise* represents the eventual result of an asynchronous operation. The\nprimary way of interacting with a promise is through its `then` method, which\nregisters callbacks to receive either a promise's eventual value or the reason\nwhy the promise cannot be fulfilled.\n\n\n## Callbacks\n\nCallbacks are registered with the `then` method by providing an optional \n`$onFulfilled` followed by an optional `$onRejected` function.\n\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise->then(\n    // $onFulfilled\n    function ($value) {\n        echo 'The promise was fulfilled.';\n    },\n    // $onRejected\n    function ($reason) {\n        echo 'The promise was rejected.';\n    }\n);\n```\n\n*Resolving* a promise means that you either fulfill a promise with a *value* or\nreject a promise with a *reason*. Resolving a promises triggers callbacks\nregistered with the promises's `then` method. These callbacks are triggered\nonly once and in the order in which they were added.\n\n\n## Resolving a promise\n\nPromises are fulfilled using the `resolve($value)` method. Resolving a promise\nwith any value other than a `GuzzleHttp\\Promise\\RejectedPromise` will trigger\nall of the onFulfilled callbacks (resolving a promise with a rejected promise\nwill reject the promise and trigger the `$onRejected` callbacks).\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise\n    ->then(function ($value) {\n        // Return a value and don't break the chain\n        return \"Hello, \" . $value;\n    })\n    // This then is executed after the first then and receives the value\n    // returned from the first then.\n    ->then(function ($value) {\n        echo $value;\n    });\n\n// Resolving the promise triggers the $onFulfilled callbacks and outputs\n// \"Hello, reader\".\n$promise->resolve('reader.');\n```\n\n\n## Promise forwarding\n\nPromises can be chained one after the other. Each then in the chain is a new\npromise. The return value of a promise is what's forwarded to the next\npromise in the chain. Returning a promise in a `then` callback will cause the\nsubsequent promises in the chain to only be fulfilled when the returned promise\nhas been fulfilled. The next promise in the chain will be invoked with the\nresolved value of the promise.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$nextPromise = new Promise();\n\n$promise\n    ->then(function ($value) use ($nextPromise) {\n        echo $value;\n        return $nextPromise;\n    })\n    ->then(function ($value) {\n        echo $value;\n    });\n\n// Triggers the first callback and outputs \"A\"\n$promise->resolve('A');\n// Triggers the second callback and outputs \"B\"\n$nextPromise->resolve('B');\n```\n\n## Promise rejection\n\nWhen a promise is rejected, the `$onRejected` callbacks are invoked with the\nrejection reason.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise->then(null, function ($reason) {\n    echo $reason;\n});\n\n$promise->reject('Error!');\n// Outputs \"Error!\"\n```\n\n## Rejection forwarding\n\nIf an exception is thrown in an `$onRejected` callback, subsequent\n`$onRejected` callbacks are invoked with the thrown exception as the reason.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise->then(null, function ($reason) {\n    throw new \\Exception($reason);\n})->then(null, function ($reason) {\n    assert($reason->getMessage() === 'Error!');\n});\n\n$promise->reject('Error!');\n```\n\nYou can also forward a rejection down the promise chain by returning a\n`GuzzleHttp\\Promise\\RejectedPromise` in either an `$onFulfilled` or\n`$onRejected` callback.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\nuse GuzzleHttp\\Promise\\RejectedPromise;\n\n$promise = new Promise();\n$promise->then(null, function ($reason) {\n    return new RejectedPromise($reason);\n})->then(null, function ($reason) {\n    assert($reason === 'Error!');\n});\n\n$promise->reject('Error!');\n```\n\nIf an exception is not thrown in a `$onRejected` callback and the callback\ndoes not return a rejected promise, downstream `$onFulfilled` callbacks are\ninvoked using the value returned from the `$onRejected` callback.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\nuse GuzzleHttp\\Promise\\RejectedPromise;\n\n$promise = new Promise();\n$promise\n    ->then(null, function ($reason) {\n        return \"It's ok\";\n    })\n    ->then(function ($value) {\n        assert($value === \"It's ok\");\n    });\n\n$promise->reject('Error!');\n```\n\n# Synchronous wait\n\nYou can synchronously force promises to complete using a promise's `wait`\nmethod. When creating a promise, you can provide a wait function that is used\nto synchronously force a promise to complete. When a wait function is invoked\nit is expected to deliver a value to the promise or reject the promise. If the\nwait function does not deliver a value, then an exception is thrown. The wait\nfunction provided to a promise constructor is invoked when the `wait` function\nof the promise is called.\n\n```php\n$promise = new Promise(function () use (&$promise) {\n    $promise->resolve('foo');\n});\n\n// Calling wait will return the value of the promise.\necho $promise->wait(); // outputs \"foo\"\n```\n\nIf an exception is encountered while invoking the wait function of a promise,\nthe promise is rejected with the exception and the exception is thrown.\n\n```php\n$promise = new Promise(function () use (&$promise) {\n    throw new \\Exception('foo');\n});\n\n$promise->wait(); // throws the exception.\n```\n\nCalling `wait` on a promise that has been fulfilled will not trigger the wait\nfunction. It will simply return the previously resolved value.\n\n```php\n$promise = new Promise(function () { die('this is not called!'); });\n$promise->resolve('foo');\necho $promise->wait(); // outputs \"foo\"\n```\n\nCalling `wait` on a promise that has been rejected will throw an exception. If\nthe rejection reason is an instance of `\\Exception` the reason is thrown.\nOtherwise, a `GuzzleHttp\\Promise\\RejectionException` is thrown and the reason\ncan be obtained by calling the `getReason` method of the exception.\n\n```php\n$promise = new Promise();\n$promise->reject('foo');\n$promise->wait();\n```\n\n> PHP Fatal error:  Uncaught exception 'GuzzleHttp\\Promise\\RejectionException' with message 'The promise was rejected with value: foo'\n\n\n## Unwrapping a promise\n\nWhen synchronously waiting on a promise, you are joining the state of the\npromise into the current state of execution (i.e., return the value of the\npromise if it was fulfilled or throw an exception if it was rejected). This is\ncalled \"unwrapping\" the promise. Waiting on a promise will by default unwrap\nthe promise state.\n\nYou can force a promise to resolve and *not* unwrap the state of the promise\nby passing `false` to the first argument of the `wait` function:\n\n```php\n$promise = new Promise();\n$promise->reject('foo');\n// This will not throw an exception. It simply ensures the promise has\n// been resolved.\n$promise->wait(false);\n```\n\nWhen unwrapping a promise, the resolved value of the promise will be waited\nupon until the unwrapped value is not a promise. This means that if you resolve\npromise A with a promise B and unwrap promise A, the value returned by the\nwait function will be the value delivered to promise B.\n\n**Note**: when you do not unwrap the promise, no value is returned.\n\n\n# Cancellation\n\nYou can cancel a promise that has not yet been fulfilled using the `cancel()`\nmethod of a promise. When creating a promise you can provide an optional\ncancel function that when invoked cancels the action of computing a resolution\nof the promise.\n\n\n# API\n\n\n## Promise\n\nWhen creating a promise object, you can provide an optional `$waitFn` and\n`$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is\nexpected to resolve the promise. `$cancelFn` is a function with no arguments\nthat is expected to cancel the computation of a promise. It is invoked when the\n`cancel()` method of a promise is called.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise(\n    function () use (&$promise) {\n        $promise->resolve('waited');\n    },\n    function () {\n        // do something that will cancel the promise computation (e.g., close\n        // a socket, cancel a database query, etc...)\n    }\n);\n\nassert('waited' === $promise->wait());\n```\n\nA promise has the following methods:\n\n- `then(callable $onFulfilled, callable $onRejected) : PromiseInterface`\n  \n  Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler.\n\n- `otherwise(callable $onRejected) : PromiseInterface`\n  \n  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.\n\n- `wait($unwrap = true) : mixed`\n\n  Synchronously waits on the promise to complete.\n  \n  `$unwrap` controls whether or not the value of the promise is returned for a\n  fulfilled promise or if an exception is thrown if the promise is rejected.\n  This is set to `true` by default.\n\n- `cancel()`\n\n  Attempts to cancel the promise if possible. The promise being cancelled and\n  the parent most ancestor that has not yet been resolved will also be\n  cancelled. Any promises waiting on the cancelled promise to resolve will also\n  be cancelled.\n\n- `getState() : string`\n\n  Returns the state of the promise. One of `pending`, `fulfilled`, or\n  `rejected`.\n\n- `resolve($value)`\n\n  Fulfills the promise with the given `$value`.\n\n- `reject($reason)`\n\n  Rejects the promise with the given `$reason`.\n\n\n## FulfilledPromise\n\nA fulfilled promise can be created to represent a promise that has been\nfulfilled.\n\n```php\nuse GuzzleHttp\\Promise\\FulfilledPromise;\n\n$promise = new FulfilledPromise('value');\n\n// Fulfilled callbacks are immediately invoked.\n$promise->then(function ($value) {\n    echo $value;\n});\n```\n\n\n## RejectedPromise\n\nA rejected promise can be created to represent a promise that has been\nrejected.\n\n```php\nuse GuzzleHttp\\Promise\\RejectedPromise;\n\n$promise = new RejectedPromise('Error');\n\n// Rejected callbacks are immediately invoked.\n$promise->then(null, function ($reason) {\n    echo $reason;\n});\n```\n\n\n# Promise interop\n\nThis library works with foreign promises that have a `then` method. This means\nyou can use Guzzle promises with [React promises](https://github.com/reactphp/promise)\nfor example. When a foreign promise is returned inside of a then method\ncallback, promise resolution will occur recursively.\n\n```php\n// Create a React promise\n$deferred = new React\\Promise\\Deferred();\n$reactPromise = $deferred->promise();\n\n// Create a Guzzle promise that is fulfilled with a React promise.\n$guzzlePromise = new \\GuzzleHttp\\Promise\\Promise();\n$guzzlePromise->then(function ($value) use ($reactPromise) {\n    // Do something something with the value...\n    // Return the React promise\n    return $reactPromise;\n});\n```\n\nPlease note that wait and cancel chaining is no longer possible when forwarding\na foreign promise. You will need to wrap a third-party promise with a Guzzle\npromise in order to utilize wait and cancel functions with foreign promises.\n\n\n## Event Loop Integration\n\nIn order to keep the stack size constant, Guzzle promises are resolved\nasynchronously using a task queue. When waiting on promises synchronously, the\ntask queue will be automatically run to ensure that the blocking promise and\nany forwarded promises are resolved. When using promises asynchronously in an\nevent loop, you will need to run the task queue on each tick of the loop. If\nyou do not run the task queue, then promises will not be resolved.\n\nYou can run the task queue using the `run()` method of the global task queue\ninstance.\n\n```php\n// Get the global task queue\n$queue = \\GuzzleHttp\\Promise\\queue();\n$queue->run();\n```\n\nFor example, you could use Guzzle promises with React using a periodic timer:\n\n```php\n$loop = React\\EventLoop\\Factory::create();\n$loop->addPeriodicTimer(0, [$queue, 'run']);\n```\n\n*TODO*: Perhaps adding a `futureTick()` on each tick would be faster?\n\n\n# Implementation notes\n\n\n## Promise resolution and chaining is handled iteratively\n\nBy shuffling pending handlers from one owner to another, promises are\nresolved iteratively, allowing for \"infinite\" then chaining.\n\n```php\n<?php\nrequire 'vendor/autoload.php';\n\nuse GuzzleHttp\\Promise\\Promise;\n\n$parent = new Promise();\n$p = $parent;\n\nfor ($i = 0; $i < 1000; $i++) {\n    $p = $p->then(function ($v) {\n        // The stack size remains constant (a good thing)\n        echo xdebug_get_stack_depth() . ', ';\n        return $v + 1;\n    });\n}\n\n$parent->resolve(0);\nvar_dump($p->wait()); // int(1000)\n\n```\n\nWhen a promise is fulfilled or rejected with a non-promise value, the promise\nthen takes ownership of the handlers of each child promise and delivers values\ndown the chain without using recursion.\n\nWhen a promise is resolved with another promise, the original promise transfers\nall of its pending handlers to the new promise. When the new promise is\neventually resolved, all of the pending handlers are delivered the forwarded\nvalue.\n\n\n## A promise is the deferred.\n\nSome promise libraries implement promises using a deferred object to represent\na computation and a promise object to represent the delivery of the result of\nthe computation. This is a nice separation of computation and delivery because\nconsumers of the promise cannot modify the value that will be eventually\ndelivered.\n\nOne side effect of being able to implement promise resolution and chaining\niteratively is that you need to be able for one promise to reach into the state\nof another promise to shuffle around ownership of handlers. In order to achieve\nthis without making the handlers of a promise publicly mutable, a promise is\nalso the deferred value, allowing promises of the same parent class to reach\ninto and modify the private properties of promises of the same type. While this\ndoes allow consumers of the value to modify the resolution or rejection of the\ndeferred, it is a small price to pay for keeping the stack size constant.\n\n```php\n$promise = new Promise();\n$promise->then(function ($value) { echo $value; });\n// The promise is the deferred value, so you can deliver a value to it.\n$promise->resolve('foo');\n// prints \"foo\"\n```\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/composer.json",
    "content": "{\n    \"name\": \"guzzlehttp/promises\",\n    \"description\": \"Guzzle promises library\",\n    \"keywords\": [\"promise\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Michael Dowling\",\n            \"email\": \"mtdowling@gmail.com\",\n            \"homepage\": \"https://github.com/mtdowling\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.5.0\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"^4.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Promise\\\\\": \"src/\"\n        },\n        \"files\": [\"src/functions_include.php\"]\n    },\n    \"scripts\": {\n        \"test\": \"vendor/bin/phpunit\",\n        \"test-ci\": \"vendor/bin/phpunit --coverage-text\"\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.4-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/AggregateException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Exception thrown when too many errors occur in the some() or any() methods.\n */\nclass AggregateException extends RejectionException\n{\n    public function __construct($msg, array $reasons)\n    {\n        parent::__construct(\n            $reasons,\n            sprintf('%s; %d rejected promises', $msg, count($reasons))\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/CancellationException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Exception that is set as the reason for a promise that has been cancelled.\n */\nclass CancellationException extends RejectionException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/Coroutine.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\nuse Exception;\nuse Generator;\nuse Throwable;\n\n/**\n * Creates a promise that is resolved using a generator that yields values or\n * promises (somewhat similar to C#'s async keyword).\n *\n * When called, the coroutine function will start an instance of the generator\n * and returns a promise that is fulfilled with its final yielded value.\n *\n * Control is returned back to the generator when the yielded promise settles.\n * This can lead to less verbose code when doing lots of sequential async calls\n * with minimal processing in between.\n *\n *     use GuzzleHttp\\Promise;\n *\n *     function createPromise($value) {\n *         return new Promise\\FulfilledPromise($value);\n *     }\n *\n *     $promise = Promise\\coroutine(function () {\n *         $value = (yield createPromise('a'));\n *         try {\n *             $value = (yield createPromise($value . 'b'));\n *         } catch (\\Exception $e) {\n *             // The promise was rejected.\n *         }\n *         yield $value . 'c';\n *     });\n *\n *     // Outputs \"abc\"\n *     $promise->then(function ($v) { echo $v; });\n *\n * @param callable $generatorFn Generator function to wrap into a promise.\n *\n * @return Promise\n * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration\n */\nfinal class Coroutine implements PromiseInterface\n{\n    /**\n     * @var PromiseInterface|null\n     */\n    private $currentPromise;\n\n    /**\n     * @var Generator\n     */\n    private $generator;\n\n    /**\n     * @var Promise\n     */\n    private $result;\n\n    public function __construct(callable $generatorFn)\n    {\n        $this->generator = $generatorFn();\n        $this->result = new Promise(function () {\n            while (isset($this->currentPromise)) {\n                $this->currentPromise->wait();\n            }\n        });\n        $this->nextCoroutine($this->generator->current());\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        return $this->result->then($onFulfilled, $onRejected);\n    }\n\n    public function otherwise(callable $onRejected)\n    {\n        return $this->result->otherwise($onRejected);\n    }\n\n    public function wait($unwrap = true)\n    {\n        return $this->result->wait($unwrap);\n    }\n\n    public function getState()\n    {\n        return $this->result->getState();\n    }\n\n    public function resolve($value)\n    {\n        $this->result->resolve($value);\n    }\n\n    public function reject($reason)\n    {\n        $this->result->reject($reason);\n    }\n\n    public function cancel()\n    {\n        $this->currentPromise->cancel();\n        $this->result->cancel();\n    }\n\n    private function nextCoroutine($yielded)\n    {\n        $this->currentPromise = promise_for($yielded)\n            ->then([$this, '_handleSuccess'], [$this, '_handleFailure']);\n    }\n\n    /**\n     * @internal\n     */\n    public function _handleSuccess($value)\n    {\n        unset($this->currentPromise);\n        try {\n            $next = $this->generator->send($value);\n            if ($this->generator->valid()) {\n                $this->nextCoroutine($next);\n            } else {\n                $this->result->resolve($value);\n            }\n        } catch (Exception $exception) {\n            $this->result->reject($exception);\n        } catch (Throwable $throwable) {\n            $this->result->reject($throwable);\n        }\n    }\n\n    /**\n     * @internal\n     */\n    public function _handleFailure($reason)\n    {\n        unset($this->currentPromise);\n        try {\n            $nextYield = $this->generator->throw(exception_for($reason));\n            // The throw was caught, so keep iterating on the coroutine\n            $this->nextCoroutine($nextYield);\n        } catch (Exception $exception) {\n            $this->result->reject($exception);\n        } catch (Throwable $throwable) {\n            $this->result->reject($throwable);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/EachPromise.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Represents a promise that iterates over many promises and invokes\n * side-effect functions in the process.\n */\nclass EachPromise implements PromisorInterface\n{\n    private $pending = [];\n\n    /** @var \\Iterator */\n    private $iterable;\n\n    /** @var callable|int */\n    private $concurrency;\n\n    /** @var callable */\n    private $onFulfilled;\n\n    /** @var callable */\n    private $onRejected;\n\n    /** @var Promise */\n    private $aggregate;\n\n    /** @var bool */\n    private $mutex;\n\n    /**\n     * Configuration hash can include the following key value pairs:\n     *\n     * - fulfilled: (callable) Invoked when a promise fulfills. The function\n     *   is invoked with three arguments: the fulfillment value, the index\n     *   position from the iterable list of the promise, and the aggregate\n     *   promise that manages all of the promises. The aggregate promise may\n     *   be resolved from within the callback to short-circuit the promise.\n     * - rejected: (callable) Invoked when a promise is rejected. The\n     *   function is invoked with three arguments: the rejection reason, the\n     *   index position from the iterable list of the promise, and the\n     *   aggregate promise that manages all of the promises. The aggregate\n     *   promise may be resolved from within the callback to short-circuit\n     *   the promise.\n     * - concurrency: (integer) Pass this configuration option to limit the\n     *   allowed number of outstanding concurrently executing promises,\n     *   creating a capped pool of promises. There is no limit by default.\n     *\n     * @param mixed    $iterable Promises or values to iterate.\n     * @param array    $config   Configuration options\n     */\n    public function __construct($iterable, array $config = [])\n    {\n        $this->iterable = iter_for($iterable);\n\n        if (isset($config['concurrency'])) {\n            $this->concurrency = $config['concurrency'];\n        }\n\n        if (isset($config['fulfilled'])) {\n            $this->onFulfilled = $config['fulfilled'];\n        }\n\n        if (isset($config['rejected'])) {\n            $this->onRejected = $config['rejected'];\n        }\n    }\n\n    public function promise()\n    {\n        if ($this->aggregate) {\n            return $this->aggregate;\n        }\n\n        try {\n            $this->createPromise();\n            $this->iterable->rewind();\n            $this->refillPending();\n        } catch (\\Throwable $e) {\n            $this->aggregate->reject($e);\n        } catch (\\Exception $e) {\n            $this->aggregate->reject($e);\n        }\n\n        return $this->aggregate;\n    }\n\n    private function createPromise()\n    {\n        $this->mutex = false;\n        $this->aggregate = new Promise(function () {\n            reset($this->pending);\n            if (empty($this->pending) && !$this->iterable->valid()) {\n                $this->aggregate->resolve(null);\n                return;\n            }\n\n            // Consume a potentially fluctuating list of promises while\n            // ensuring that indexes are maintained (precluding array_shift).\n            while ($promise = current($this->pending)) {\n                next($this->pending);\n                $promise->wait();\n                if ($this->aggregate->getState() !== PromiseInterface::PENDING) {\n                    return;\n                }\n            }\n        });\n\n        // Clear the references when the promise is resolved.\n        $clearFn = function () {\n            $this->iterable = $this->concurrency = $this->pending = null;\n            $this->onFulfilled = $this->onRejected = null;\n        };\n\n        $this->aggregate->then($clearFn, $clearFn);\n    }\n\n    private function refillPending()\n    {\n        if (!$this->concurrency) {\n            // Add all pending promises.\n            while ($this->addPending() && $this->advanceIterator());\n            return;\n        }\n\n        // Add only up to N pending promises.\n        $concurrency = is_callable($this->concurrency)\n            ? call_user_func($this->concurrency, count($this->pending))\n            : $this->concurrency;\n        $concurrency = max($concurrency - count($this->pending), 0);\n        // Concurrency may be set to 0 to disallow new promises.\n        if (!$concurrency) {\n            return;\n        }\n        // Add the first pending promise.\n        $this->addPending();\n        // Note this is special handling for concurrency=1 so that we do\n        // not advance the iterator after adding the first promise. This\n        // helps work around issues with generators that might not have the\n        // next value to yield until promise callbacks are called.\n        while (--$concurrency\n            && $this->advanceIterator()\n            && $this->addPending());\n    }\n\n    private function addPending()\n    {\n        if (!$this->iterable || !$this->iterable->valid()) {\n            return false;\n        }\n\n        $promise = promise_for($this->iterable->current());\n        $idx = $this->iterable->key();\n\n        $this->pending[$idx] = $promise->then(\n            function ($value) use ($idx) {\n                if ($this->onFulfilled) {\n                    call_user_func(\n                        $this->onFulfilled, $value, $idx, $this->aggregate\n                    );\n                }\n                $this->step($idx);\n            },\n            function ($reason) use ($idx) {\n                if ($this->onRejected) {\n                    call_user_func(\n                        $this->onRejected, $reason, $idx, $this->aggregate\n                    );\n                }\n                $this->step($idx);\n            }\n        );\n\n        return true;\n    }\n\n    private function advanceIterator()\n    {\n        // Place a lock on the iterator so that we ensure to not recurse,\n        // preventing fatal generator errors.\n        if ($this->mutex) {\n            return false;\n        }\n\n        $this->mutex = true;\n\n        try {\n            $this->iterable->next();\n            $this->mutex = false;\n            return true;\n        } catch (\\Throwable $e) {\n            $this->aggregate->reject($e);\n            $this->mutex = false;\n            return false;\n        } catch (\\Exception $e) {\n            $this->aggregate->reject($e);\n            $this->mutex = false;\n            return false;\n        }\n    }\n\n    private function step($idx)\n    {\n        // If the promise was already resolved, then ignore this step.\n        if ($this->aggregate->getState() !== PromiseInterface::PENDING) {\n            return;\n        }\n\n        unset($this->pending[$idx]);\n\n        // Only refill pending promises if we are not locked, preventing the\n        // EachPromise to recursively invoke the provided iterator, which\n        // cause a fatal error: \"Cannot resume an already running generator\"\n        if ($this->advanceIterator() && !$this->checkIfFinished()) {\n            // Add more pending promises if possible.\n            $this->refillPending();\n        }\n    }\n\n    private function checkIfFinished()\n    {\n        if (!$this->pending && !$this->iterable->valid()) {\n            // Resolve the promise if there's nothing left to do.\n            $this->aggregate->resolve(null);\n            return true;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/FulfilledPromise.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise that has been fulfilled.\n *\n * Thenning off of this promise will invoke the onFulfilled callback\n * immediately and ignore other callbacks.\n */\nclass FulfilledPromise implements PromiseInterface\n{\n    private $value;\n\n    public function __construct($value)\n    {\n        if (method_exists($value, 'then')) {\n            throw new \\InvalidArgumentException(\n                'You cannot create a FulfilledPromise with a promise.');\n        }\n\n        $this->value = $value;\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        // Return itself if there is no onFulfilled function.\n        if (!$onFulfilled) {\n            return $this;\n        }\n\n        $queue = queue();\n        $p = new Promise([$queue, 'run']);\n        $value = $this->value;\n        $queue->add(static function () use ($p, $value, $onFulfilled) {\n            if ($p->getState() === self::PENDING) {\n                try {\n                    $p->resolve($onFulfilled($value));\n                } catch (\\Throwable $e) {\n                    $p->reject($e);\n                } catch (\\Exception $e) {\n                    $p->reject($e);\n                }\n            }\n        });\n\n        return $p;\n    }\n\n    public function otherwise(callable $onRejected)\n    {\n        return $this->then(null, $onRejected);\n    }\n\n    public function wait($unwrap = true, $defaultDelivery = null)\n    {\n        return $unwrap ? $this->value : null;\n    }\n\n    public function getState()\n    {\n        return self::FULFILLED;\n    }\n\n    public function resolve($value)\n    {\n        if ($value !== $this->value) {\n            throw new \\LogicException(\"Cannot resolve a fulfilled promise\");\n        }\n    }\n\n    public function reject($reason)\n    {\n        throw new \\LogicException(\"Cannot reject a fulfilled promise\");\n    }\n\n    public function cancel()\n    {\n        // pass\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/Promise.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Promises/A+ implementation that avoids recursion when possible.\n *\n * @link https://promisesaplus.com/\n */\nclass Promise implements PromiseInterface\n{\n    private $state = self::PENDING;\n    private $result;\n    private $cancelFn;\n    private $waitFn;\n    private $waitList;\n    private $handlers = [];\n\n    /**\n     * @param callable $waitFn   Fn that when invoked resolves the promise.\n     * @param callable $cancelFn Fn that when invoked cancels the promise.\n     */\n    public function __construct(\n        callable $waitFn = null,\n        callable $cancelFn = null\n    ) {\n        $this->waitFn = $waitFn;\n        $this->cancelFn = $cancelFn;\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        if ($this->state === self::PENDING) {\n            $p = new Promise(null, [$this, 'cancel']);\n            $this->handlers[] = [$p, $onFulfilled, $onRejected];\n            $p->waitList = $this->waitList;\n            $p->waitList[] = $this;\n            return $p;\n        }\n\n        // Return a fulfilled promise and immediately invoke any callbacks.\n        if ($this->state === self::FULFILLED) {\n            return $onFulfilled\n                ? promise_for($this->result)->then($onFulfilled)\n                : promise_for($this->result);\n        }\n\n        // It's either cancelled or rejected, so return a rejected promise\n        // and immediately invoke any callbacks.\n        $rejection = rejection_for($this->result);\n        return $onRejected ? $rejection->then(null, $onRejected) : $rejection;\n    }\n\n    public function otherwise(callable $onRejected)\n    {\n        return $this->then(null, $onRejected);\n    }\n\n    public function wait($unwrap = true)\n    {\n        $this->waitIfPending();\n\n        $inner = $this->result instanceof PromiseInterface\n            ? $this->result->wait($unwrap)\n            : $this->result;\n\n        if ($unwrap) {\n            if ($this->result instanceof PromiseInterface\n                || $this->state === self::FULFILLED\n            ) {\n                return $inner;\n            } else {\n                // It's rejected so \"unwrap\" and throw an exception.\n                throw exception_for($inner);\n            }\n        }\n    }\n\n    public function getState()\n    {\n        return $this->state;\n    }\n\n    public function cancel()\n    {\n        if ($this->state !== self::PENDING) {\n            return;\n        }\n\n        $this->waitFn = $this->waitList = null;\n\n        if ($this->cancelFn) {\n            $fn = $this->cancelFn;\n            $this->cancelFn = null;\n            try {\n                $fn();\n            } catch (\\Throwable $e) {\n                $this->reject($e);\n            } catch (\\Exception $e) {\n                $this->reject($e);\n            }\n        }\n\n        // Reject the promise only if it wasn't rejected in a then callback.\n        if ($this->state === self::PENDING) {\n            $this->reject(new CancellationException('Promise has been cancelled'));\n        }\n    }\n\n    public function resolve($value)\n    {\n        $this->settle(self::FULFILLED, $value);\n    }\n\n    public function reject($reason)\n    {\n        $this->settle(self::REJECTED, $reason);\n    }\n\n    private function settle($state, $value)\n    {\n        if ($this->state !== self::PENDING) {\n            // Ignore calls with the same resolution.\n            if ($state === $this->state && $value === $this->result) {\n                return;\n            }\n            throw $this->state === $state\n                ? new \\LogicException(\"The promise is already {$state}.\")\n                : new \\LogicException(\"Cannot change a {$this->state} promise to {$state}\");\n        }\n\n        if ($value === $this) {\n            throw new \\LogicException('Cannot fulfill or reject a promise with itself');\n        }\n\n        // Clear out the state of the promise but stash the handlers.\n        $this->state = $state;\n        $this->result = $value;\n        $handlers = $this->handlers;\n        $this->handlers = null;\n        $this->waitList = $this->waitFn = null;\n        $this->cancelFn = null;\n\n        if (!$handlers) {\n            return;\n        }\n\n        // If the value was not a settled promise or a thenable, then resolve\n        // it in the task queue using the correct ID.\n        if (!method_exists($value, 'then')) {\n            $id = $state === self::FULFILLED ? 1 : 2;\n            // It's a success, so resolve the handlers in the queue.\n            queue()->add(static function () use ($id, $value, $handlers) {\n                foreach ($handlers as $handler) {\n                    self::callHandler($id, $value, $handler);\n                }\n            });\n        } elseif ($value instanceof Promise\n            && $value->getState() === self::PENDING\n        ) {\n            // We can just merge our handlers onto the next promise.\n            $value->handlers = array_merge($value->handlers, $handlers);\n        } else {\n            // Resolve the handlers when the forwarded promise is resolved.\n            $value->then(\n                static function ($value) use ($handlers) {\n                    foreach ($handlers as $handler) {\n                        self::callHandler(1, $value, $handler);\n                    }\n                },\n                static function ($reason) use ($handlers) {\n                    foreach ($handlers as $handler) {\n                        self::callHandler(2, $reason, $handler);\n                    }\n                }\n            );\n        }\n    }\n\n    /**\n     * Call a stack of handlers using a specific callback index and value.\n     *\n     * @param int   $index   1 (resolve) or 2 (reject).\n     * @param mixed $value   Value to pass to the callback.\n     * @param array $handler Array of handler data (promise and callbacks).\n     *\n     * @return array Returns the next group to resolve.\n     */\n    private static function callHandler($index, $value, array $handler)\n    {\n        /** @var PromiseInterface $promise */\n        $promise = $handler[0];\n\n        // The promise may have been cancelled or resolved before placing\n        // this thunk in the queue.\n        if ($promise->getState() !== self::PENDING) {\n            return;\n        }\n\n        try {\n            if (isset($handler[$index])) {\n                $promise->resolve($handler[$index]($value));\n            } elseif ($index === 1) {\n                // Forward resolution values as-is.\n                $promise->resolve($value);\n            } else {\n                // Forward rejections down the chain.\n                $promise->reject($value);\n            }\n        } catch (\\Throwable $reason) {\n            $promise->reject($reason);\n        } catch (\\Exception $reason) {\n            $promise->reject($reason);\n        }\n    }\n\n    private function waitIfPending()\n    {\n        if ($this->state !== self::PENDING) {\n            return;\n        } elseif ($this->waitFn) {\n            $this->invokeWaitFn();\n        } elseif ($this->waitList) {\n            $this->invokeWaitList();\n        } else {\n            // If there's not wait function, then reject the promise.\n            $this->reject('Cannot wait on a promise that has '\n                . 'no internal wait function. You must provide a wait '\n                . 'function when constructing the promise to be able to '\n                . 'wait on a promise.');\n        }\n\n        queue()->run();\n\n        if ($this->state === self::PENDING) {\n            $this->reject('Invoking the wait callback did not resolve the promise');\n        }\n    }\n\n    private function invokeWaitFn()\n    {\n        try {\n            $wfn = $this->waitFn;\n            $this->waitFn = null;\n            $wfn(true);\n        } catch (\\Exception $reason) {\n            if ($this->state === self::PENDING) {\n                // The promise has not been resolved yet, so reject the promise\n                // with the exception.\n                $this->reject($reason);\n            } else {\n                // The promise was already resolved, so there's a problem in\n                // the application.\n                throw $reason;\n            }\n        }\n    }\n\n    private function invokeWaitList()\n    {\n        $waitList = $this->waitList;\n        $this->waitList = null;\n\n        foreach ($waitList as $result) {\n            while (true) {\n                $result->waitIfPending();\n\n                if ($result->result instanceof Promise) {\n                    $result = $result->result;\n                } else {\n                    if ($result->result instanceof PromiseInterface) {\n                        $result->result->wait(false);\n                    }\n                    break;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/PromiseInterface.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise represents the eventual result of an asynchronous operation.\n *\n * The primary way of interacting with a promise is through its then method,\n * which registers callbacks to receive either a promise’s eventual value or\n * the reason why the promise cannot be fulfilled.\n *\n * @link https://promisesaplus.com/\n */\ninterface PromiseInterface\n{\n    const PENDING = 'pending';\n    const FULFILLED = 'fulfilled';\n    const REJECTED = 'rejected';\n\n    /**\n     * Appends fulfillment and rejection handlers to the promise, and returns\n     * a new promise resolving to the return value of the called handler.\n     *\n     * @param callable $onFulfilled Invoked when the promise fulfills.\n     * @param callable $onRejected  Invoked when the promise is rejected.\n     *\n     * @return PromiseInterface\n     */\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    );\n\n    /**\n     * Appends a rejection handler callback to the promise, and returns a new\n     * promise resolving to the return value of the callback if it is called,\n     * or to its original fulfillment value if the promise is instead\n     * fulfilled.\n     *\n     * @param callable $onRejected Invoked when the promise is rejected.\n     *\n     * @return PromiseInterface\n     */\n    public function otherwise(callable $onRejected);\n\n    /**\n     * Get the state of the promise (\"pending\", \"rejected\", or \"fulfilled\").\n     *\n     * The three states can be checked against the constants defined on\n     * PromiseInterface: PENDING, FULFILLED, and REJECTED.\n     *\n     * @return string\n     */\n    public function getState();\n\n    /**\n     * Resolve the promise with the given value.\n     *\n     * @param mixed $value\n     * @throws \\RuntimeException if the promise is already resolved.\n     */\n    public function resolve($value);\n\n    /**\n     * Reject the promise with the given reason.\n     *\n     * @param mixed $reason\n     * @throws \\RuntimeException if the promise is already resolved.\n     */\n    public function reject($reason);\n\n    /**\n     * Cancels the promise if possible.\n     *\n     * @link https://github.com/promises-aplus/cancellation-spec/issues/7\n     */\n    public function cancel();\n\n    /**\n     * Waits until the promise completes if possible.\n     *\n     * Pass $unwrap as true to unwrap the result of the promise, either\n     * returning the resolved value or throwing the rejected exception.\n     *\n     * If the promise cannot be waited on, then the promise will be rejected.\n     *\n     * @param bool $unwrap\n     *\n     * @return mixed\n     * @throws \\LogicException if the promise has no wait function or if the\n     *                         promise does not settle after waiting.\n     */\n    public function wait($unwrap = true);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/PromisorInterface.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Interface used with classes that return a promise.\n */\ninterface PromisorInterface\n{\n    /**\n     * Returns a promise.\n     *\n     * @return PromiseInterface\n     */\n    public function promise();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/RejectedPromise.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise that has been rejected.\n *\n * Thenning off of this promise will invoke the onRejected callback\n * immediately and ignore other callbacks.\n */\nclass RejectedPromise implements PromiseInterface\n{\n    private $reason;\n\n    public function __construct($reason)\n    {\n        if (method_exists($reason, 'then')) {\n            throw new \\InvalidArgumentException(\n                'You cannot create a RejectedPromise with a promise.');\n        }\n\n        $this->reason = $reason;\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        // If there's no onRejected callback then just return self.\n        if (!$onRejected) {\n            return $this;\n        }\n\n        $queue = queue();\n        $reason = $this->reason;\n        $p = new Promise([$queue, 'run']);\n        $queue->add(static function () use ($p, $reason, $onRejected) {\n            if ($p->getState() === self::PENDING) {\n                try {\n                    // Return a resolved promise if onRejected does not throw.\n                    $p->resolve($onRejected($reason));\n                } catch (\\Throwable $e) {\n                    // onRejected threw, so return a rejected promise.\n                    $p->reject($e);\n                } catch (\\Exception $e) {\n                    // onRejected threw, so return a rejected promise.\n                    $p->reject($e);\n                }\n            }\n        });\n\n        return $p;\n    }\n\n    public function otherwise(callable $onRejected)\n    {\n        return $this->then(null, $onRejected);\n    }\n\n    public function wait($unwrap = true, $defaultDelivery = null)\n    {\n        if ($unwrap) {\n            throw exception_for($this->reason);\n        }\n    }\n\n    public function getState()\n    {\n        return self::REJECTED;\n    }\n\n    public function resolve($value)\n    {\n        throw new \\LogicException(\"Cannot resolve a rejected promise\");\n    }\n\n    public function reject($reason)\n    {\n        if ($reason !== $this->reason) {\n            throw new \\LogicException(\"Cannot reject a rejected promise\");\n        }\n    }\n\n    public function cancel()\n    {\n        // pass\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/RejectionException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A special exception that is thrown when waiting on a rejected promise.\n *\n * The reason value is available via the getReason() method.\n */\nclass RejectionException extends \\RuntimeException\n{\n    /** @var mixed Rejection reason. */\n    private $reason;\n\n    /**\n     * @param mixed $reason       Rejection reason.\n     * @param string $description Optional description\n     */\n    public function __construct($reason, $description = null)\n    {\n        $this->reason = $reason;\n\n        $message = 'The promise was rejected';\n\n        if ($description) {\n            $message .= ' with reason: ' . $description;\n        } elseif (is_string($reason)\n            || (is_object($reason) && method_exists($reason, '__toString'))\n        ) {\n            $message .= ' with reason: ' . $this->reason;\n        } elseif ($reason instanceof \\JsonSerializable) {\n            $message .= ' with reason: '\n                . json_encode($this->reason, JSON_PRETTY_PRINT);\n        }\n\n        parent::__construct($message);\n    }\n\n    /**\n     * Returns the rejection reason.\n     *\n     * @return mixed\n     */\n    public function getReason()\n    {\n        return $this->reason;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/TaskQueue.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A task queue that executes tasks in a FIFO order.\n *\n * This task queue class is used to settle promises asynchronously and\n * maintains a constant stack size. You can use the task queue asynchronously\n * by calling the `run()` function of the global task queue in an event loop.\n *\n *     GuzzleHttp\\Promise\\queue()->run();\n */\nclass TaskQueue implements TaskQueueInterface\n{\n    private $enableShutdown = true;\n    private $queue = [];\n\n    public function __construct($withShutdown = true)\n    {\n        if ($withShutdown) {\n            register_shutdown_function(function () {\n                if ($this->enableShutdown) {\n                    // Only run the tasks if an E_ERROR didn't occur.\n                    $err = error_get_last();\n                    if (!$err || ($err['type'] ^ E_ERROR)) {\n                        $this->run();\n                    }\n                }\n            });\n        }\n    }\n\n    public function isEmpty()\n    {\n        return !$this->queue;\n    }\n\n    public function add(callable $task)\n    {\n        $this->queue[] = $task;\n    }\n\n    public function run()\n    {\n        /** @var callable $task */\n        while ($task = array_shift($this->queue)) {\n            $task();\n        }\n    }\n\n    /**\n     * The task queue will be run and exhausted by default when the process\n     * exits IFF the exit is not the result of a PHP E_ERROR error.\n     *\n     * You can disable running the automatic shutdown of the queue by calling\n     * this function. If you disable the task queue shutdown process, then you\n     * MUST either run the task queue (as a result of running your event loop\n     * or manually using the run() method) or wait on each outstanding promise.\n     *\n     * Note: This shutdown will occur before any destructors are triggered.\n     */\n    public function disableShutdown()\n    {\n        $this->enableShutdown = false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/TaskQueueInterface.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\ninterface TaskQueueInterface\n{\n    /**\n     * Returns true if the queue is empty.\n     *\n     * @return bool\n     */\n    public function isEmpty();\n\n    /**\n     * Adds a task to the queue that will be executed the next time run is\n     * called.\n     *\n     * @param callable $task\n     */\n    public function add(callable $task);\n\n    /**\n     * Execute all of the pending task in the queue.\n     */\n    public function run();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/functions.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Get the global task queue used for promise resolution.\n *\n * This task queue MUST be run in an event loop in order for promises to be\n * settled asynchronously. It will be automatically run when synchronously\n * waiting on a promise.\n *\n * <code>\n * while ($eventLoop->isRunning()) {\n *     GuzzleHttp\\Promise\\queue()->run();\n * }\n * </code>\n *\n * @param TaskQueueInterface $assign Optionally specify a new queue instance.\n *\n * @return TaskQueueInterface\n */\nfunction queue(TaskQueueInterface $assign = null)\n{\n    static $queue;\n\n    if ($assign) {\n        $queue = $assign;\n    } elseif (!$queue) {\n        $queue = new TaskQueue();\n    }\n\n    return $queue;\n}\n\n/**\n * Adds a function to run in the task queue when it is next `run()` and returns\n * a promise that is fulfilled or rejected with the result.\n *\n * @param callable $task Task function to run.\n *\n * @return PromiseInterface\n */\nfunction task(callable $task)\n{\n    $queue = queue();\n    $promise = new Promise([$queue, 'run']);\n    $queue->add(function () use ($task, $promise) {\n        try {\n            $promise->resolve($task());\n        } catch (\\Throwable $e) {\n            $promise->reject($e);\n        } catch (\\Exception $e) {\n            $promise->reject($e);\n        }\n    });\n\n    return $promise;\n}\n\n/**\n * Creates a promise for a value if the value is not a promise.\n *\n * @param mixed $value Promise or value.\n *\n * @return PromiseInterface\n */\nfunction promise_for($value)\n{\n    if ($value instanceof PromiseInterface) {\n        return $value;\n    }\n\n    // Return a Guzzle promise that shadows the given promise.\n    if (method_exists($value, 'then')) {\n        $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null;\n        $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null;\n        $promise = new Promise($wfn, $cfn);\n        $value->then([$promise, 'resolve'], [$promise, 'reject']);\n        return $promise;\n    }\n\n    return new FulfilledPromise($value);\n}\n\n/**\n * Creates a rejected promise for a reason if the reason is not a promise. If\n * the provided reason is a promise, then it is returned as-is.\n *\n * @param mixed $reason Promise or reason.\n *\n * @return PromiseInterface\n */\nfunction rejection_for($reason)\n{\n    if ($reason instanceof PromiseInterface) {\n        return $reason;\n    }\n\n    return new RejectedPromise($reason);\n}\n\n/**\n * Create an exception for a rejected promise value.\n *\n * @param mixed $reason\n *\n * @return \\Exception|\\Throwable\n */\nfunction exception_for($reason)\n{\n    return $reason instanceof \\Exception || $reason instanceof \\Throwable\n        ? $reason\n        : new RejectionException($reason);\n}\n\n/**\n * Returns an iterator for the given value.\n *\n * @param mixed $value\n *\n * @return \\Iterator\n */\nfunction iter_for($value)\n{\n    if ($value instanceof \\Iterator) {\n        return $value;\n    } elseif (is_array($value)) {\n        return new \\ArrayIterator($value);\n    } else {\n        return new \\ArrayIterator([$value]);\n    }\n}\n\n/**\n * Synchronously waits on a promise to resolve and returns an inspection state\n * array.\n *\n * Returns a state associative array containing a \"state\" key mapping to a\n * valid promise state. If the state of the promise is \"fulfilled\", the array\n * will contain a \"value\" key mapping to the fulfilled value of the promise. If\n * the promise is rejected, the array will contain a \"reason\" key mapping to\n * the rejection reason of the promise.\n *\n * @param PromiseInterface $promise Promise or value.\n *\n * @return array\n */\nfunction inspect(PromiseInterface $promise)\n{\n    try {\n        return [\n            'state' => PromiseInterface::FULFILLED,\n            'value' => $promise->wait()\n        ];\n    } catch (RejectionException $e) {\n        return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()];\n    } catch (\\Throwable $e) {\n        return ['state' => PromiseInterface::REJECTED, 'reason' => $e];\n    } catch (\\Exception $e) {\n        return ['state' => PromiseInterface::REJECTED, 'reason' => $e];\n    }\n}\n\n/**\n * Waits on all of the provided promises, but does not unwrap rejected promises\n * as thrown exception.\n *\n * Returns an array of inspection state arrays.\n *\n * @param PromiseInterface[] $promises Traversable of promises to wait upon.\n *\n * @return array\n * @see GuzzleHttp\\Promise\\inspect for the inspection state array format.\n */\nfunction inspect_all($promises)\n{\n    $results = [];\n    foreach ($promises as $key => $promise) {\n        $results[$key] = inspect($promise);\n    }\n\n    return $results;\n}\n\n/**\n * Waits on all of the provided promises and returns the fulfilled values.\n *\n * Returns an array that contains the value of each promise (in the same order\n * the promises were provided). An exception is thrown if any of the promises\n * are rejected.\n *\n * @param mixed $promises Iterable of PromiseInterface objects to wait on.\n *\n * @return array\n * @throws \\Exception on error\n * @throws \\Throwable on error in PHP >=7\n */\nfunction unwrap($promises)\n{\n    $results = [];\n    foreach ($promises as $key => $promise) {\n        $results[$key] = $promise->wait();\n    }\n\n    return $results;\n}\n\n/**\n * Given an array of promises, return a promise that is fulfilled when all the\n * items in the array are fulfilled.\n *\n * The promise's fulfillment value is an array with fulfillment values at\n * respective positions to the original array. If any promise in the array\n * rejects, the returned promise is rejected with the rejection reason.\n *\n * @param mixed $promises Promises or values.\n *\n * @return PromiseInterface\n */\nfunction all($promises)\n{\n    $results = [];\n    return each(\n        $promises,\n        function ($value, $idx) use (&$results) {\n            $results[$idx] = $value;\n        },\n        function ($reason, $idx, Promise $aggregate) {\n            $aggregate->reject($reason);\n        }\n    )->then(function () use (&$results) {\n        ksort($results);\n        return $results;\n    });\n}\n\n/**\n * Initiate a competitive race between multiple promises or values (values will\n * become immediately fulfilled promises).\n *\n * When count amount of promises have been fulfilled, the returned promise is\n * fulfilled with an array that contains the fulfillment values of the winners\n * in order of resolution.\n *\n * This prommise is rejected with a {@see GuzzleHttp\\Promise\\AggregateException}\n * if the number of fulfilled promises is less than the desired $count.\n *\n * @param int   $count    Total number of promises.\n * @param mixed $promises Promises or values.\n *\n * @return PromiseInterface\n */\nfunction some($count, $promises)\n{\n    $results = [];\n    $rejections = [];\n\n    return each(\n        $promises,\n        function ($value, $idx, PromiseInterface $p) use (&$results, $count) {\n            if ($p->getState() !== PromiseInterface::PENDING) {\n                return;\n            }\n            $results[$idx] = $value;\n            if (count($results) >= $count) {\n                $p->resolve(null);\n            }\n        },\n        function ($reason) use (&$rejections) {\n            $rejections[] = $reason;\n        }\n    )->then(\n        function () use (&$results, &$rejections, $count) {\n            if (count($results) !== $count) {\n                throw new AggregateException(\n                    'Not enough promises to fulfill count',\n                    $rejections\n                );\n            }\n            ksort($results);\n            return array_values($results);\n        }\n    );\n}\n\n/**\n * Like some(), with 1 as count. However, if the promise fulfills, the\n * fulfillment value is not an array of 1 but the value directly.\n *\n * @param mixed $promises Promises or values.\n *\n * @return PromiseInterface\n */\nfunction any($promises)\n{\n    return some(1, $promises)->then(function ($values) { return $values[0]; });\n}\n\n/**\n * Returns a promise that is fulfilled when all of the provided promises have\n * been fulfilled or rejected.\n *\n * The returned promise is fulfilled with an array of inspection state arrays.\n *\n * @param mixed $promises Promises or values.\n *\n * @return PromiseInterface\n * @see GuzzleHttp\\Promise\\inspect for the inspection state array format.\n */\nfunction settle($promises)\n{\n    $results = [];\n\n    return each(\n        $promises,\n        function ($value, $idx) use (&$results) {\n            $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value];\n        },\n        function ($reason, $idx) use (&$results) {\n            $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason];\n        }\n    )->then(function () use (&$results) {\n        ksort($results);\n        return $results;\n    });\n}\n\n/**\n * Given an iterator that yields promises or values, returns a promise that is\n * fulfilled with a null value when the iterator has been consumed or the\n * aggregate promise has been fulfilled or rejected.\n *\n * $onFulfilled is a function that accepts the fulfilled value, iterator\n * index, and the aggregate promise. The callback can invoke any necessary side\n * effects and choose to resolve or reject the aggregate promise if needed.\n *\n * $onRejected is a function that accepts the rejection reason, iterator\n * index, and the aggregate promise. The callback can invoke any necessary side\n * effects and choose to resolve or reject the aggregate promise if needed.\n *\n * @param mixed    $iterable    Iterator or array to iterate over.\n * @param callable $onFulfilled\n * @param callable $onRejected\n *\n * @return PromiseInterface\n */\nfunction each(\n    $iterable,\n    callable $onFulfilled = null,\n    callable $onRejected = null\n) {\n    return (new EachPromise($iterable, [\n        'fulfilled' => $onFulfilled,\n        'rejected'  => $onRejected\n    ]))->promise();\n}\n\n/**\n * Like each, but only allows a certain number of outstanding promises at any\n * given time.\n *\n * $concurrency may be an integer or a function that accepts the number of\n * pending promises and returns a numeric concurrency limit value to allow for\n * dynamic a concurrency size.\n *\n * @param mixed        $iterable\n * @param int|callable $concurrency\n * @param callable     $onFulfilled\n * @param callable     $onRejected\n *\n * @return PromiseInterface\n */\nfunction each_limit(\n    $iterable,\n    $concurrency,\n    callable $onFulfilled = null,\n    callable $onRejected = null\n) {\n    return (new EachPromise($iterable, [\n        'fulfilled'   => $onFulfilled,\n        'rejected'    => $onRejected,\n        'concurrency' => $concurrency\n    ]))->promise();\n}\n\n/**\n * Like each_limit, but ensures that no promise in the given $iterable argument\n * is rejected. If any promise is rejected, then the aggregate promise is\n * rejected with the encountered rejection.\n *\n * @param mixed        $iterable\n * @param int|callable $concurrency\n * @param callable     $onFulfilled\n *\n * @return PromiseInterface\n */\nfunction each_limit_all(\n    $iterable,\n    $concurrency,\n    callable $onFulfilled = null\n) {\n    return each_limit(\n        $iterable,\n        $concurrency,\n        $onFulfilled,\n        function ($reason, $idx, PromiseInterface $aggregate) {\n            $aggregate->reject($reason);\n        }\n    );\n}\n\n/**\n * Returns true if a promise is fulfilled.\n *\n * @param PromiseInterface $promise\n *\n * @return bool\n */\nfunction is_fulfilled(PromiseInterface $promise)\n{\n    return $promise->getState() === PromiseInterface::FULFILLED;\n}\n\n/**\n * Returns true if a promise is rejected.\n *\n * @param PromiseInterface $promise\n *\n * @return bool\n */\nfunction is_rejected(PromiseInterface $promise)\n{\n    return $promise->getState() === PromiseInterface::REJECTED;\n}\n\n/**\n * Returns true if a promise is fulfilled or rejected.\n *\n * @param PromiseInterface $promise\n *\n * @return bool\n */\nfunction is_settled(PromiseInterface $promise)\n{\n    return $promise->getState() !== PromiseInterface::PENDING;\n}\n\n/**\n * @see Coroutine\n *\n * @param callable $generatorFn\n *\n * @return PromiseInterface\n */\nfunction coroutine(callable $generatorFn)\n{\n    return new Coroutine($generatorFn);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/promises/src/functions_include.php",
    "content": "<?php\n\n// Don't redefine the functions if included multiple times.\nif (!function_exists('GuzzleHttp\\Promise\\promise_for')) {\n    require __DIR__ . '/functions.php';\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/CHANGELOG.md",
    "content": "# CHANGELOG\n\n## 1.4.2 - 2017-03-20\n\n* Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing \n  calls to `trigger_error` when deprecated methods are invoked.\n\n## 1.4.1 - 2017-02-27\n\n* Reverted BC break by reintroducing behavior to automagically fix a URI with a\n  relative path and an authority by adding a leading slash to the path. It's only\n  deprecated now.\n* Added triggering of silenced deprecation warnings.\n\n## 1.4.0 - 2017-02-21\n\n* Fix `Stream::read` when length parameter <= 0.\n* `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory.\n* Fix `ServerRequest::getUriFromGlobals` when `Host` header contains port.\n* Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form.\n* Allow `parse_response` to parse a response without delimiting space and reason.\n* Ensure each URI modification results in a valid URI according to PSR-7 discussions.\n  Invalid modifications will throw an exception instead of returning a wrong URI or\n  doing some magic.\n  - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception\n    because the path of a URI with an authority must start with a slash \"/\" or be empty\n  - `(new Uri())->withScheme('http')` will return `'http://localhost'`\n* Fix compatibility of URIs with `file` scheme and empty host.\n* Added common URI utility methods based on RFC 3986 (see documentation in the readme):\n  - `Uri::isDefaultPort`\n  - `Uri::isAbsolute`\n  - `Uri::isNetworkPathReference`\n  - `Uri::isAbsolutePathReference`\n  - `Uri::isRelativePathReference`\n  - `Uri::isSameDocumentReference`\n  - `Uri::composeComponents`\n  - `UriNormalizer::normalize`\n  - `UriNormalizer::isEquivalent`\n  - `UriResolver::relativize`\n* Deprecated `Uri::resolve` in favor of `UriResolver::resolve`\n* Deprecated `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments`\n\n## 1.3.1 - 2016-06-25\n\n* Fix `Uri::__toString` for network path references, e.g. `//example.org`.\n* Fix missing lowercase normalization for host.\n* Fix handling of URI components in case they are `'0'` in a lot of places,\n  e.g. as a user info password.\n* Fix `Uri::withAddedHeader` to correctly merge headers with different case.\n* Fix trimming of header values in `Uri::withAddedHeader`. Header values may\n  be surrounded by whitespace which should be ignored according to RFC 7230\n  Section 3.2.4. This does not apply to header names.\n* Fix `Uri::withAddedHeader` with an array of header values.\n* Fix `Uri::resolve` when base path has no slash and handling of fragment.\n* Fix handling of encoding in `Uri::with(out)QueryValue` so one can pass the\n  key/value both in encoded as well as decoded form to those methods. This is\n  consistent with withPath, withQuery etc.\n* Fix `ServerRequest::withoutAttribute` when attribute value is null.\n\n## 1.3.0 - 2016-04-13\n\n* Added remaining interfaces needed for full PSR7 compatibility\n  (ServerRequestInterface, UploadedFileInterface, etc.).\n* Added support for stream_for from scalars.\n* Can now extend Uri.\n* Fixed a bug in validating request methods by making it more permissive.\n\n## 1.2.3 - 2016-02-18\n\n* Fixed support in `GuzzleHttp\\Psr7\\CachingStream` for seeking forward on remote\n  streams, which can sometimes return fewer bytes than requested with `fread`.\n* Fixed handling of gzipped responses with FNAME headers.\n\n## 1.2.2 - 2016-01-22\n\n* Added support for URIs without any authority.\n* Added support for HTTP 451 'Unavailable For Legal Reasons.'\n* Added support for using '0' as a filename.\n* Added support for including non-standard ports in Host headers.\n\n## 1.2.1 - 2015-11-02\n\n* Now supporting negative offsets when seeking to SEEK_END.\n\n## 1.2.0 - 2015-08-15\n\n* Body as `\"0\"` is now properly added to a response.\n* Now allowing forward seeking in CachingStream.\n* Now properly parsing HTTP requests that contain proxy targets in\n  `parse_request`.\n* functions.php is now conditionally required.\n* user-info is no longer dropped when resolving URIs.\n\n## 1.1.0 - 2015-06-24\n\n* URIs can now be relative.\n* `multipart/form-data` headers are now overridden case-insensitively.\n* URI paths no longer encode the following characters because they are allowed\n  in URIs: \"(\", \")\", \"*\", \"!\", \"'\"\n* A port is no longer added to a URI when the scheme is missing and no port is\n  present.\n\n## 1.0.0 - 2015-05-19\n\nInitial release.\n\nCurrently unsupported:\n\n- `Psr\\Http\\Message\\ServerRequestInterface`\n- `Psr\\Http\\Message\\UploadedFileInterface`\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/LICENSE",
    "content": "Copyright (c) 2015 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/README.md",
    "content": "# PSR-7 Message Implementation\n\nThis repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/)\nmessage implementation, several stream decorators, and some helpful\nfunctionality like query string parsing.\n\n\n[![Build Status](https://travis-ci.org/guzzle/psr7.svg?branch=master)](https://travis-ci.org/guzzle/psr7)\n\n\n# Stream implementation\n\nThis package comes with a number of stream implementations and stream\ndecorators.\n\n\n## AppendStream\n\n`GuzzleHttp\\Psr7\\AppendStream`\n\nReads from multiple streams, one after the other.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$a = Psr7\\stream_for('abc, ');\n$b = Psr7\\stream_for('123.');\n$composed = new Psr7\\AppendStream([$a, $b]);\n\n$composed->addStream(Psr7\\stream_for(' Above all listen to me'));\n\necho $composed; // abc, 123. Above all listen to me.\n```\n\n\n## BufferStream\n\n`GuzzleHttp\\Psr7\\BufferStream`\n\nProvides a buffer stream that can be written to fill a buffer, and read\nfrom to remove bytes from the buffer.\n\nThis stream returns a \"hwm\" metadata value that tells upstream consumers\nwhat the configured high water mark of the stream is, or the maximum\npreferred size of the buffer.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n// When more than 1024 bytes are in the buffer, it will begin returning\n// false to writes. This is an indication that writers should slow down.\n$buffer = new Psr7\\BufferStream(1024);\n```\n\n\n## CachingStream\n\nThe CachingStream is used to allow seeking over previously read bytes on\nnon-seekable streams. This can be useful when transferring a non-seekable\nentity body fails due to needing to rewind the stream (for example, resulting\nfrom a redirect). Data that is read from the remote stream will be buffered in\na PHP temp stream so that previously read bytes are cached first in memory,\nthen on disk.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\stream_for(fopen('http://www.google.com', 'r'));\n$stream = new Psr7\\CachingStream($original);\n\n$stream->read(1024);\necho $stream->tell();\n// 1024\n\n$stream->seek(0);\necho $stream->tell();\n// 0\n```\n\n\n## DroppingStream\n\n`GuzzleHttp\\Psr7\\DroppingStream`\n\nStream decorator that begins dropping data once the size of the underlying\nstream becomes too full.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n// Create an empty stream\n$stream = Psr7\\stream_for();\n\n// Start dropping data when the stream has more than 10 bytes\n$dropping = new Psr7\\DroppingStream($stream, 10);\n\n$dropping->write('01234567890123456789');\necho $stream; // 0123456789\n```\n\n\n## FnStream\n\n`GuzzleHttp\\Psr7\\FnStream`\n\nCompose stream implementations based on a hash of functions.\n\nAllows for easy testing and extension of a provided stream without needing\nto create a concrete class for a simple extension point.\n\n```php\n\nuse GuzzleHttp\\Psr7;\n\n$stream = Psr7\\stream_for('hi');\n$fnStream = Psr7\\FnStream::decorate($stream, [\n    'rewind' => function () use ($stream) {\n        echo 'About to rewind - ';\n        $stream->rewind();\n        echo 'rewound!';\n    }\n]);\n\n$fnStream->rewind();\n// Outputs: About to rewind - rewound!\n```\n\n\n## InflateStream\n\n`GuzzleHttp\\Psr7\\InflateStream`\n\nUses PHP's zlib.inflate filter to inflate deflate or gzipped content.\n\nThis stream decorator skips the first 10 bytes of the given stream to remove\nthe gzip header, converts the provided stream to a PHP stream resource,\nthen appends the zlib.inflate filter. The stream is then converted back\nto a Guzzle stream resource to be used as a Guzzle stream.\n\n\n## LazyOpenStream\n\n`GuzzleHttp\\Psr7\\LazyOpenStream`\n\nLazily reads or writes to a file that is opened only after an IO operation\ntake place on the stream.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$stream = new Psr7\\LazyOpenStream('/path/to/file', 'r');\n// The file has not yet been opened...\n\necho $stream->read(10);\n// The file is opened and read from only when needed.\n```\n\n\n## LimitStream\n\n`GuzzleHttp\\Psr7\\LimitStream`\n\nLimitStream can be used to read a subset or slice of an existing stream object.\nThis can be useful for breaking a large file into smaller pieces to be sent in\nchunks (e.g. Amazon S3's multipart upload API).\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\stream_for(fopen('/tmp/test.txt', 'r+'));\necho $original->getSize();\n// >>> 1048576\n\n// Limit the size of the body to 1024 bytes and start reading from byte 2048\n$stream = new Psr7\\LimitStream($original, 1024, 2048);\necho $stream->getSize();\n// >>> 1024\necho $stream->tell();\n// >>> 0\n```\n\n\n## MultipartStream\n\n`GuzzleHttp\\Psr7\\MultipartStream`\n\nStream that when read returns bytes for a streaming multipart or\nmultipart/form-data stream.\n\n\n## NoSeekStream\n\n`GuzzleHttp\\Psr7\\NoSeekStream`\n\nNoSeekStream wraps a stream and does not allow seeking.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\stream_for('foo');\n$noSeek = new Psr7\\NoSeekStream($original);\n\necho $noSeek->read(3);\n// foo\nvar_export($noSeek->isSeekable());\n// false\n$noSeek->seek(0);\nvar_export($noSeek->read(3));\n// NULL\n```\n\n\n## PumpStream\n\n`GuzzleHttp\\Psr7\\PumpStream`\n\nProvides a read only stream that pumps data from a PHP callable.\n\nWhen invoking the provided callable, the PumpStream will pass the amount of\ndata requested to read to the callable. The callable can choose to ignore\nthis value and return fewer or more bytes than requested. Any extra data\nreturned by the provided callable is buffered internally until drained using\nthe read() function of the PumpStream. The provided callable MUST return\nfalse when there is no more data to read.\n\n\n## Implementing stream decorators\n\nCreating a stream decorator is very easy thanks to the\n`GuzzleHttp\\Psr7\\StreamDecoratorTrait`. This trait provides methods that\nimplement `Psr\\Http\\Message\\StreamInterface` by proxying to an underlying\nstream. Just `use` the `StreamDecoratorTrait` and implement your custom\nmethods.\n\nFor example, let's say we wanted to call a specific function each time the last\nbyte is read from a stream. This could be implemented by overriding the\n`read()` method.\n\n```php\nuse Psr\\Http\\Message\\StreamInterface;\nuse GuzzleHttp\\Psr7\\StreamDecoratorTrait;\n\nclass EofCallbackStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    private $callback;\n\n    public function __construct(StreamInterface $stream, callable $cb)\n    {\n        $this->stream = $stream;\n        $this->callback = $cb;\n    }\n\n    public function read($length)\n    {\n        $result = $this->stream->read($length);\n\n        // Invoke the callback when EOF is hit.\n        if ($this->eof()) {\n            call_user_func($this->callback);\n        }\n\n        return $result;\n    }\n}\n```\n\nThis decorator could be added to any existing stream and used like so:\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\stream_for('foo');\n\n$eofStream = new EofCallbackStream($original, function () {\n    echo 'EOF!';\n});\n\n$eofStream->read(2);\n$eofStream->read(1);\n// echoes \"EOF!\"\n$eofStream->seek(0);\n$eofStream->read(3);\n// echoes \"EOF!\"\n```\n\n\n## PHP StreamWrapper\n\nYou can use the `GuzzleHttp\\Psr7\\StreamWrapper` class if you need to use a\nPSR-7 stream as a PHP stream resource.\n\nUse the `GuzzleHttp\\Psr7\\StreamWrapper::getResource()` method to create a PHP\nstream from a PSR-7 stream.\n\n```php\nuse GuzzleHttp\\Psr7\\StreamWrapper;\n\n$stream = GuzzleHttp\\Psr7\\stream_for('hello!');\n$resource = StreamWrapper::getResource($stream);\necho fread($resource, 6); // outputs hello!\n```\n\n\n# Function API\n\nThere are various functions available under the `GuzzleHttp\\Psr7` namespace.\n\n\n## `function str`\n\n`function str(MessageInterface $message)`\n\nReturns the string representation of an HTTP message.\n\n```php\n$request = new GuzzleHttp\\Psr7\\Request('GET', 'http://example.com');\necho GuzzleHttp\\Psr7\\str($request);\n```\n\n\n## `function uri_for`\n\n`function uri_for($uri)`\n\nThis function accepts a string or `Psr\\Http\\Message\\UriInterface` and returns a\nUriInterface for the given value. If the value is already a `UriInterface`, it\nis returned as-is.\n\n```php\n$uri = GuzzleHttp\\Psr7\\uri_for('http://example.com');\nassert($uri === GuzzleHttp\\Psr7\\uri_for($uri));\n```\n\n\n## `function stream_for`\n\n`function stream_for($resource = '', array $options = [])`\n\nCreate a new stream based on the input type.\n\nOptions is an associative array that can contain the following keys:\n\n* - metadata: Array of custom metadata.\n* - size: Size of the stream.\n\nThis method accepts the following `$resource` types:\n\n- `Psr\\Http\\Message\\StreamInterface`: Returns the value as-is.\n- `string`: Creates a stream object that uses the given string as the contents.\n- `resource`: Creates a stream object that wraps the given PHP stream resource.\n- `Iterator`: If the provided value implements `Iterator`, then a read-only\n  stream object will be created that wraps the given iterable. Each time the\n  stream is read from, data from the iterator will fill a buffer and will be\n  continuously called until the buffer is equal to the requested read size.\n  Subsequent read calls will first read from the buffer and then call `next`\n  on the underlying iterator until it is exhausted.\n- `object` with `__toString()`: If the object has the `__toString()` method,\n  the object will be cast to a string and then a stream will be returned that\n  uses the string value.\n- `NULL`: When `null` is passed, an empty stream object is returned.\n- `callable` When a callable is passed, a read-only stream object will be\n  created that invokes the given callable. The callable is invoked with the\n  number of suggested bytes to read. The callable can return any number of\n  bytes, but MUST return `false` when there is no more data to return. The\n  stream object that wraps the callable will invoke the callable until the\n  number of requested bytes are available. Any additional bytes will be\n  buffered and used in subsequent reads.\n\n```php\n$stream = GuzzleHttp\\Psr7\\stream_for('foo');\n$stream = GuzzleHttp\\Psr7\\stream_for(fopen('/path/to/file', 'r'));\n\n$generator function ($bytes) {\n    for ($i = 0; $i < $bytes; $i++) {\n        yield ' ';\n    }\n}\n\n$stream = GuzzleHttp\\Psr7\\stream_for($generator(100));\n```\n\n\n## `function parse_header`\n\n`function parse_header($header)`\n\nParse an array of header values containing \";\" separated data into an array of\nassociative arrays representing the header key value pair data of the header.\nWhen a parameter does not contain a value, but just contains a key, this\nfunction will inject a key with a '' string value.\n\n\n## `function normalize_header`\n\n`function normalize_header($header)`\n\nConverts an array of header values that may contain comma separated headers\ninto an array of headers with no comma separated values.\n\n\n## `function modify_request`\n\n`function modify_request(RequestInterface $request, array $changes)`\n\nClone and modify a request with the given changes. This method is useful for\nreducing the number of clones needed to mutate a message.\n\nThe changes can be one of:\n\n- method: (string) Changes the HTTP method.\n- set_headers: (array) Sets the given headers.\n- remove_headers: (array) Remove the given headers.\n- body: (mixed) Sets the given body.\n- uri: (UriInterface) Set the URI.\n- query: (string) Set the query string value of the URI.\n- version: (string) Set the protocol version.\n\n\n## `function rewind_body`\n\n`function rewind_body(MessageInterface $message)`\n\nAttempts to rewind a message body and throws an exception on failure. The body\nof the message will only be rewound if a call to `tell()` returns a value other\nthan `0`.\n\n\n## `function try_fopen`\n\n`function try_fopen($filename, $mode)`\n\nSafely opens a PHP stream resource using a filename.\n\nWhen fopen fails, PHP normally raises a warning. This function adds an error\nhandler that checks for errors and throws an exception instead.\n\n\n## `function copy_to_string`\n\n`function copy_to_string(StreamInterface $stream, $maxLen = -1)`\n\nCopy the contents of a stream into a string until the given number of bytes\nhave been read.\n\n\n## `function copy_to_stream`\n\n`function copy_to_stream(StreamInterface $source, StreamInterface $dest, $maxLen = -1)`\n\nCopy the contents of a stream into another stream until the given number of\nbytes have been read.\n\n\n## `function hash`\n\n`function hash(StreamInterface $stream, $algo, $rawOutput = false)`\n\nCalculate a hash of a Stream. This method reads the entire stream to calculate\na rolling hash (based on PHP's hash_init functions).\n\n\n## `function readline`\n\n`function readline(StreamInterface $stream, $maxLength = null)`\n\nRead a line from the stream up to the maximum allowed buffer length.\n\n\n## `function parse_request`\n\n`function parse_request($message)`\n\nParses a request message string into a request object.\n\n\n## `function parse_response`\n\n`function parse_response($message)`\n\nParses a response message string into a response object.\n\n\n## `function parse_query`\n\n`function parse_query($str, $urlEncoding = true)`\n\nParse a query string into an associative array.\n\nIf multiple values are found for the same key, the value of that key value pair\nwill become an array. This function does not parse nested PHP style arrays into\nan associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed into\n`['foo[a]' => '1', 'foo[b]' => '2']`).\n\n\n## `function build_query`\n\n`function build_query(array $params, $encoding = PHP_QUERY_RFC3986)`\n\nBuild a query string from an array of key value pairs.\n\nThis function can use the return value of parse_query() to build a query string.\nThis function does not modify the provided keys when an array is encountered\n(like http_build_query would).\n\n\n## `function mimetype_from_filename`\n\n`function mimetype_from_filename($filename)`\n\nDetermines the mimetype of a file by looking at its extension.\n\n\n## `function mimetype_from_extension`\n\n`function mimetype_from_extension($extension)`\n\nMaps a file extensions to a mimetype.\n\n\n# Additional URI Methods\n\nAside from the standard `Psr\\Http\\Message\\UriInterface` implementation in form of the `GuzzleHttp\\Psr7\\Uri` class,\nthis library also provides additional functionality when working with URIs as static methods.\n\n## URI Types\n\nAn instance of `Psr\\Http\\Message\\UriInterface` can either be an absolute URI or a relative reference.\nAn absolute URI has a scheme. A relative reference is used to express a URI relative to another URI,\nthe base URI. Relative references can be divided into several forms according to\n[RFC 3986 Section 4.2](https://tools.ietf.org/html/rfc3986#section-4.2):\n\n- network-path references, e.g. `//example.com/path`\n- absolute-path references, e.g. `/path`\n- relative-path references, e.g. `subpath`\n\nThe following methods can be used to identify the type of the URI.\n\n### `GuzzleHttp\\Psr7\\Uri::isAbsolute`\n\n`public static function isAbsolute(UriInterface $uri): bool`\n\nWhether the URI is absolute, i.e. it has a scheme.\n\n### `GuzzleHttp\\Psr7\\Uri::isNetworkPathReference`\n\n`public static function isNetworkPathReference(UriInterface $uri): bool`\n\nWhether the URI is a network-path reference. A relative reference that begins with two slash characters is\ntermed an network-path reference.\n\n### `GuzzleHttp\\Psr7\\Uri::isAbsolutePathReference`\n\n`public static function isAbsolutePathReference(UriInterface $uri): bool`\n\nWhether the URI is a absolute-path reference. A relative reference that begins with a single slash character is\ntermed an absolute-path reference.\n\n### `GuzzleHttp\\Psr7\\Uri::isRelativePathReference`\n\n`public static function isRelativePathReference(UriInterface $uri): bool`\n\nWhether the URI is a relative-path reference. A relative reference that does not begin with a slash character is\ntermed a relative-path reference.\n\n### `GuzzleHttp\\Psr7\\Uri::isSameDocumentReference`\n\n`public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool`\n\nWhether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its\nfragment component, identical to the base URI. When no base URI is given, only an empty URI reference\n(apart from its fragment) is considered a same-document reference.\n\n## URI Components\n\nAdditional methods to work with URI components.\n\n### `GuzzleHttp\\Psr7\\Uri::isDefaultPort`\n\n`public static function isDefaultPort(UriInterface $uri): bool`\n\nWhether the URI has the default port of the current scheme. `Psr\\Http\\Message\\UriInterface::getPort` may return null\nor the standard port. This method can be used independently of the implementation.\n\n### `GuzzleHttp\\Psr7\\Uri::composeComponents`\n\n`public static function composeComponents($scheme, $authority, $path, $query, $fragment): string`\n\nComposes a URI reference string from its various components according to\n[RFC 3986 Section 5.3](https://tools.ietf.org/html/rfc3986#section-5.3). Usually this method does not need to be called\nmanually but instead is used indirectly via `Psr\\Http\\Message\\UriInterface::__toString`.\n\n### `GuzzleHttp\\Psr7\\Uri::fromParts`\n\n`public static function fromParts(array $parts): UriInterface`\n\nCreates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components.\n\n\n### `GuzzleHttp\\Psr7\\Uri::withQueryValue`\n\n`public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface`\n\nCreates a new URI with a specific query string value. Any existing query string values that exactly match the\nprovided key are removed and replaced with the given key value pair. A value of null will set the query string\nkey without a value, e.g. \"key\" instead of \"key=value\".\n\n\n### `GuzzleHttp\\Psr7\\Uri::withoutQueryValue`\n\n`public static function withoutQueryValue(UriInterface $uri, $key): UriInterface`\n\nCreates a new URI with a specific query string value removed. Any existing query string values that exactly match the\nprovided key are removed.\n\n## Reference Resolution\n\n`GuzzleHttp\\Psr7\\UriResolver` provides methods to resolve a URI reference in the context of a base URI according\nto [RFC 3986 Section 5](https://tools.ietf.org/html/rfc3986#section-5). This is for example also what web browsers\ndo when resolving a link in a website based on the current request URI.\n\n### `GuzzleHttp\\Psr7\\UriResolver::resolve`\n\n`public static function resolve(UriInterface $base, UriInterface $rel): UriInterface`\n\nConverts the relative URI into a new URI that is resolved against the base URI.\n\n### `GuzzleHttp\\Psr7\\UriResolver::removeDotSegments`\n\n`public static function removeDotSegments(string $path): string`\n\nRemoves dot segments from a path and returns the new path according to\n[RFC 3986 Section 5.2.4](https://tools.ietf.org/html/rfc3986#section-5.2.4).\n\n### `GuzzleHttp\\Psr7\\UriResolver::relativize`\n\n`public static function relativize(UriInterface $base, UriInterface $target): UriInterface`\n\nReturns the target URI as a relative reference from the base URI. This method is the counterpart to resolve():\n\n```php\n(string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))\n```\n\nOne use-case is to use the current request URI as base URI and then generate relative links in your documents\nto reduce the document size or offer self-contained downloadable document archives.\n\n```php\n$base = new Uri('http://example.com/a/b/');\necho UriResolver::relativize($base, new Uri('http://example.com/a/b/c'));  // prints 'c'.\necho UriResolver::relativize($base, new Uri('http://example.com/a/x/y'));  // prints '../x/y'.\necho UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.\necho UriResolver::relativize($base, new Uri('http://example.org/a/b/'));   // prints '//example.org/a/b/'.\n```\n\n## Normalization and Comparison\n\n`GuzzleHttp\\Psr7\\UriNormalizer` provides methods to normalize and compare URIs according to\n[RFC 3986 Section 6](https://tools.ietf.org/html/rfc3986#section-6).\n\n### `GuzzleHttp\\Psr7\\UriNormalizer::normalize`\n\n`public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface`\n\nReturns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.\nThis methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask\nof normalizations to apply. The following normalizations are available:\n\n- `UriNormalizer::PRESERVING_NORMALIZATIONS`\n\n    Default normalizations which only include the ones that preserve semantics.\n\n- `UriNormalizer::CAPITALIZE_PERCENT_ENCODING`\n\n    All letters within a percent-encoding triplet (e.g., \"%3A\") are case-insensitive, and should be capitalized.\n\n    Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b`\n\n- `UriNormalizer::DECODE_UNRESERVED_CHARACTERS`\n\n    Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of\n    ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should\n    not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved\n    characters by URI normalizers.\n\n    Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/`\n\n- `UriNormalizer::CONVERT_EMPTY_PATH`\n\n    Converts the empty path to \"/\" for http and https URIs.\n\n    Example: `http://example.org` → `http://example.org/`\n\n- `UriNormalizer::REMOVE_DEFAULT_HOST`\n\n    Removes the default host of the given URI scheme from the URI. Only the \"file\" scheme defines the default host\n    \"localhost\". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to\n    RFC 3986.\n\n    Example: `file://localhost/myfile` → `file:///myfile`\n\n- `UriNormalizer::REMOVE_DEFAULT_PORT`\n\n    Removes the default port of the given URI scheme from the URI.\n\n    Example: `http://example.org:80/` → `http://example.org/`\n\n- `UriNormalizer::REMOVE_DOT_SEGMENTS`\n\n    Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would\n    change the semantics of the URI reference.\n\n    Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html`\n\n- `UriNormalizer::REMOVE_DUPLICATE_SLASHES`\n\n    Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes\n    and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization\n    may change the semantics. Encoded slashes (%2F) are not removed.\n\n    Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html`\n\n- `UriNormalizer::SORT_QUERY_PARAMETERS`\n\n    Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be\n    significant (this is not defined by the standard). So this normalization is not safe and may change the semantics\n    of the URI.\n\n    Example: `?lang=en&article=fred` → `?article=fred&lang=en`\n\n### `GuzzleHttp\\Psr7\\UriNormalizer::isEquivalent`\n\n`public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool`\n\nWhether two URIs can be considered equivalent. Both URIs are normalized automatically before comparison with the given\n`$normalizations` bitmask. The method also accepts relative URI references and returns true when they are equivalent.\nThis of course assumes they will be resolved against the same base URI. If this is not the case, determination of\nequivalence or difference of relative references does not mean anything.\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/composer.json",
    "content": "{\n    \"name\": \"guzzlehttp/psr7\",\n    \"type\": \"library\",\n    \"description\": \"PSR-7 message implementation that also provides common utility methods\",\n    \"keywords\": [\"request\", \"response\", \"message\", \"stream\", \"http\", \"uri\", \"url\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Michael Dowling\",\n            \"email\": \"mtdowling@gmail.com\",\n            \"homepage\": \"https://github.com/mtdowling\"\n        },\n        {\n            \"name\": \"Tobias Schultze\",\n            \"homepage\": \"https://github.com/Tobion\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.4.0\",\n        \"psr/http-message\": \"~1.0\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"~4.0\"\n    },\n    \"provide\": {\n        \"psr/http-message-implementation\": \"1.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Psr7\\\\\": \"src/\"\n        },\n        \"files\": [\"src/functions_include.php\"]\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.4-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/AppendStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Reads from multiple streams, one after the other.\n *\n * This is a read-only stream decorator.\n */\nclass AppendStream implements StreamInterface\n{\n    /** @var StreamInterface[] Streams being decorated */\n    private $streams = [];\n\n    private $seekable = true;\n    private $current = 0;\n    private $pos = 0;\n    private $detached = false;\n\n    /**\n     * @param StreamInterface[] $streams Streams to decorate. Each stream must\n     *                                   be readable.\n     */\n    public function __construct(array $streams = [])\n    {\n        foreach ($streams as $stream) {\n            $this->addStream($stream);\n        }\n    }\n\n    public function __toString()\n    {\n        try {\n            $this->rewind();\n            return $this->getContents();\n        } catch (\\Exception $e) {\n            return '';\n        }\n    }\n\n    /**\n     * Add a stream to the AppendStream\n     *\n     * @param StreamInterface $stream Stream to append. Must be readable.\n     *\n     * @throws \\InvalidArgumentException if the stream is not readable\n     */\n    public function addStream(StreamInterface $stream)\n    {\n        if (!$stream->isReadable()) {\n            throw new \\InvalidArgumentException('Each stream must be readable');\n        }\n\n        // The stream is only seekable if all streams are seekable\n        if (!$stream->isSeekable()) {\n            $this->seekable = false;\n        }\n\n        $this->streams[] = $stream;\n    }\n\n    public function getContents()\n    {\n        return copy_to_string($this);\n    }\n\n    /**\n     * Closes each attached stream.\n     *\n     * {@inheritdoc}\n     */\n    public function close()\n    {\n        $this->pos = $this->current = 0;\n\n        foreach ($this->streams as $stream) {\n            $stream->close();\n        }\n\n        $this->streams = [];\n    }\n\n    /**\n     * Detaches each attached stream\n     *\n     * {@inheritdoc}\n     */\n    public function detach()\n    {\n        $this->close();\n        $this->detached = true;\n    }\n\n    public function tell()\n    {\n        return $this->pos;\n    }\n\n    /**\n     * Tries to calculate the size by adding the size of each stream.\n     *\n     * If any of the streams do not return a valid number, then the size of the\n     * append stream cannot be determined and null is returned.\n     *\n     * {@inheritdoc}\n     */\n    public function getSize()\n    {\n        $size = 0;\n\n        foreach ($this->streams as $stream) {\n            $s = $stream->getSize();\n            if ($s === null) {\n                return null;\n            }\n            $size += $s;\n        }\n\n        return $size;\n    }\n\n    public function eof()\n    {\n        return !$this->streams ||\n            ($this->current >= count($this->streams) - 1 &&\n             $this->streams[$this->current]->eof());\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    /**\n     * Attempts to seek to the given position. Only supports SEEK_SET.\n     *\n     * {@inheritdoc}\n     */\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        if (!$this->seekable) {\n            throw new \\RuntimeException('This AppendStream is not seekable');\n        } elseif ($whence !== SEEK_SET) {\n            throw new \\RuntimeException('The AppendStream can only seek with SEEK_SET');\n        }\n\n        $this->pos = $this->current = 0;\n\n        // Rewind each stream\n        foreach ($this->streams as $i => $stream) {\n            try {\n                $stream->rewind();\n            } catch (\\Exception $e) {\n                throw new \\RuntimeException('Unable to seek stream '\n                    . $i . ' of the AppendStream', 0, $e);\n            }\n        }\n\n        // Seek to the actual position by reading from each stream\n        while ($this->pos < $offset && !$this->eof()) {\n            $result = $this->read(min(8096, $offset - $this->pos));\n            if ($result === '') {\n                break;\n            }\n        }\n    }\n\n    /**\n     * Reads from all of the appended streams until the length is met or EOF.\n     *\n     * {@inheritdoc}\n     */\n    public function read($length)\n    {\n        $buffer = '';\n        $total = count($this->streams) - 1;\n        $remaining = $length;\n        $progressToNext = false;\n\n        while ($remaining > 0) {\n\n            // Progress to the next stream if needed.\n            if ($progressToNext || $this->streams[$this->current]->eof()) {\n                $progressToNext = false;\n                if ($this->current === $total) {\n                    break;\n                }\n                $this->current++;\n            }\n\n            $result = $this->streams[$this->current]->read($remaining);\n\n            // Using a loose comparison here to match on '', false, and null\n            if ($result == null) {\n                $progressToNext = true;\n                continue;\n            }\n\n            $buffer .= $result;\n            $remaining = $length - strlen($buffer);\n        }\n\n        $this->pos += strlen($buffer);\n\n        return $buffer;\n    }\n\n    public function isReadable()\n    {\n        return true;\n    }\n\n    public function isWritable()\n    {\n        return false;\n    }\n\n    public function isSeekable()\n    {\n        return $this->seekable;\n    }\n\n    public function write($string)\n    {\n        throw new \\RuntimeException('Cannot write to an AppendStream');\n    }\n\n    public function getMetadata($key = null)\n    {\n        return $key ? null : [];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/BufferStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Provides a buffer stream that can be written to to fill a buffer, and read\n * from to remove bytes from the buffer.\n *\n * This stream returns a \"hwm\" metadata value that tells upstream consumers\n * what the configured high water mark of the stream is, or the maximum\n * preferred size of the buffer.\n */\nclass BufferStream implements StreamInterface\n{\n    private $hwm;\n    private $buffer = '';\n\n    /**\n     * @param int $hwm High water mark, representing the preferred maximum\n     *                 buffer size. If the size of the buffer exceeds the high\n     *                 water mark, then calls to write will continue to succeed\n     *                 but will return false to inform writers to slow down\n     *                 until the buffer has been drained by reading from it.\n     */\n    public function __construct($hwm = 16384)\n    {\n        $this->hwm = $hwm;\n    }\n\n    public function __toString()\n    {\n        return $this->getContents();\n    }\n\n    public function getContents()\n    {\n        $buffer = $this->buffer;\n        $this->buffer = '';\n\n        return $buffer;\n    }\n\n    public function close()\n    {\n        $this->buffer = '';\n    }\n\n    public function detach()\n    {\n        $this->close();\n    }\n\n    public function getSize()\n    {\n        return strlen($this->buffer);\n    }\n\n    public function isReadable()\n    {\n        return true;\n    }\n\n    public function isWritable()\n    {\n        return true;\n    }\n\n    public function isSeekable()\n    {\n        return false;\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        throw new \\RuntimeException('Cannot seek a BufferStream');\n    }\n\n    public function eof()\n    {\n        return strlen($this->buffer) === 0;\n    }\n\n    public function tell()\n    {\n        throw new \\RuntimeException('Cannot determine the position of a BufferStream');\n    }\n\n    /**\n     * Reads data from the buffer.\n     */\n    public function read($length)\n    {\n        $currentLength = strlen($this->buffer);\n\n        if ($length >= $currentLength) {\n            // No need to slice the buffer because we don't have enough data.\n            $result = $this->buffer;\n            $this->buffer = '';\n        } else {\n            // Slice up the result to provide a subset of the buffer.\n            $result = substr($this->buffer, 0, $length);\n            $this->buffer = substr($this->buffer, $length);\n        }\n\n        return $result;\n    }\n\n    /**\n     * Writes data to the buffer.\n     */\n    public function write($string)\n    {\n        $this->buffer .= $string;\n\n        // TODO: What should happen here?\n        if (strlen($this->buffer) >= $this->hwm) {\n            return false;\n        }\n\n        return strlen($string);\n    }\n\n    public function getMetadata($key = null)\n    {\n        if ($key == 'hwm') {\n            return $this->hwm;\n        }\n\n        return $key ? null : [];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/CachingStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator that can cache previously read bytes from a sequentially\n * read stream.\n */\nclass CachingStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var StreamInterface Stream being wrapped */\n    private $remoteStream;\n\n    /** @var int Number of bytes to skip reading due to a write on the buffer */\n    private $skipReadBytes = 0;\n\n    /**\n     * We will treat the buffer object as the body of the stream\n     *\n     * @param StreamInterface $stream Stream to cache\n     * @param StreamInterface $target Optionally specify where data is cached\n     */\n    public function __construct(\n        StreamInterface $stream,\n        StreamInterface $target = null\n    ) {\n        $this->remoteStream = $stream;\n        $this->stream = $target ?: new Stream(fopen('php://temp', 'r+'));\n    }\n\n    public function getSize()\n    {\n        return max($this->stream->getSize(), $this->remoteStream->getSize());\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        if ($whence == SEEK_SET) {\n            $byte = $offset;\n        } elseif ($whence == SEEK_CUR) {\n            $byte = $offset + $this->tell();\n        } elseif ($whence == SEEK_END) {\n            $size = $this->remoteStream->getSize();\n            if ($size === null) {\n                $size = $this->cacheEntireStream();\n            }\n            $byte = $size + $offset;\n        } else {\n            throw new \\InvalidArgumentException('Invalid whence');\n        }\n\n        $diff = $byte - $this->stream->getSize();\n\n        if ($diff > 0) {\n            // Read the remoteStream until we have read in at least the amount\n            // of bytes requested, or we reach the end of the file.\n            while ($diff > 0 && !$this->remoteStream->eof()) {\n                $this->read($diff);\n                $diff = $byte - $this->stream->getSize();\n            }\n        } else {\n            // We can just do a normal seek since we've already seen this byte.\n            $this->stream->seek($byte);\n        }\n    }\n\n    public function read($length)\n    {\n        // Perform a regular read on any previously read data from the buffer\n        $data = $this->stream->read($length);\n        $remaining = $length - strlen($data);\n\n        // More data was requested so read from the remote stream\n        if ($remaining) {\n            // If data was written to the buffer in a position that would have\n            // been filled from the remote stream, then we must skip bytes on\n            // the remote stream to emulate overwriting bytes from that\n            // position. This mimics the behavior of other PHP stream wrappers.\n            $remoteData = $this->remoteStream->read(\n                $remaining + $this->skipReadBytes\n            );\n\n            if ($this->skipReadBytes) {\n                $len = strlen($remoteData);\n                $remoteData = substr($remoteData, $this->skipReadBytes);\n                $this->skipReadBytes = max(0, $this->skipReadBytes - $len);\n            }\n\n            $data .= $remoteData;\n            $this->stream->write($remoteData);\n        }\n\n        return $data;\n    }\n\n    public function write($string)\n    {\n        // When appending to the end of the currently read stream, you'll want\n        // to skip bytes from being read from the remote stream to emulate\n        // other stream wrappers. Basically replacing bytes of data of a fixed\n        // length.\n        $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell();\n        if ($overflow > 0) {\n            $this->skipReadBytes += $overflow;\n        }\n\n        return $this->stream->write($string);\n    }\n\n    public function eof()\n    {\n        return $this->stream->eof() && $this->remoteStream->eof();\n    }\n\n    /**\n     * Close both the remote stream and buffer stream\n     */\n    public function close()\n    {\n        $this->remoteStream->close() && $this->stream->close();\n    }\n\n    private function cacheEntireStream()\n    {\n        $target = new FnStream(['write' => 'strlen']);\n        copy_to_stream($this, $target);\n\n        return $this->tell();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/DroppingStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator that begins dropping data once the size of the underlying\n * stream becomes too full.\n */\nclass DroppingStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    private $maxLength;\n\n    /**\n     * @param StreamInterface $stream    Underlying stream to decorate.\n     * @param int             $maxLength Maximum size before dropping data.\n     */\n    public function __construct(StreamInterface $stream, $maxLength)\n    {\n        $this->stream = $stream;\n        $this->maxLength = $maxLength;\n    }\n\n    public function write($string)\n    {\n        $diff = $this->maxLength - $this->stream->getSize();\n\n        // Begin returning 0 when the underlying stream is too large.\n        if ($diff <= 0) {\n            return 0;\n        }\n\n        // Write the stream or a subset of the stream if needed.\n        if (strlen($string) < $diff) {\n            return $this->stream->write($string);\n        }\n\n        return $this->stream->write(substr($string, 0, $diff));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/FnStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Compose stream implementations based on a hash of functions.\n *\n * Allows for easy testing and extension of a provided stream without needing\n * to create a concrete class for a simple extension point.\n */\nclass FnStream implements StreamInterface\n{\n    /** @var array */\n    private $methods;\n\n    /** @var array Methods that must be implemented in the given array */\n    private static $slots = ['__toString', 'close', 'detach', 'rewind',\n        'getSize', 'tell', 'eof', 'isSeekable', 'seek', 'isWritable', 'write',\n        'isReadable', 'read', 'getContents', 'getMetadata'];\n\n    /**\n     * @param array $methods Hash of method name to a callable.\n     */\n    public function __construct(array $methods)\n    {\n        $this->methods = $methods;\n\n        // Create the functions on the class\n        foreach ($methods as $name => $fn) {\n            $this->{'_fn_' . $name} = $fn;\n        }\n    }\n\n    /**\n     * Lazily determine which methods are not implemented.\n     * @throws \\BadMethodCallException\n     */\n    public function __get($name)\n    {\n        throw new \\BadMethodCallException(str_replace('_fn_', '', $name)\n            . '() is not implemented in the FnStream');\n    }\n\n    /**\n     * The close method is called on the underlying stream only if possible.\n     */\n    public function __destruct()\n    {\n        if (isset($this->_fn_close)) {\n            call_user_func($this->_fn_close);\n        }\n    }\n\n    /**\n     * Adds custom functionality to an underlying stream by intercepting\n     * specific method calls.\n     *\n     * @param StreamInterface $stream  Stream to decorate\n     * @param array           $methods Hash of method name to a closure\n     *\n     * @return FnStream\n     */\n    public static function decorate(StreamInterface $stream, array $methods)\n    {\n        // If any of the required methods were not provided, then simply\n        // proxy to the decorated stream.\n        foreach (array_diff(self::$slots, array_keys($methods)) as $diff) {\n            $methods[$diff] = [$stream, $diff];\n        }\n\n        return new self($methods);\n    }\n\n    public function __toString()\n    {\n        return call_user_func($this->_fn___toString);\n    }\n\n    public function close()\n    {\n        return call_user_func($this->_fn_close);\n    }\n\n    public function detach()\n    {\n        return call_user_func($this->_fn_detach);\n    }\n\n    public function getSize()\n    {\n        return call_user_func($this->_fn_getSize);\n    }\n\n    public function tell()\n    {\n        return call_user_func($this->_fn_tell);\n    }\n\n    public function eof()\n    {\n        return call_user_func($this->_fn_eof);\n    }\n\n    public function isSeekable()\n    {\n        return call_user_func($this->_fn_isSeekable);\n    }\n\n    public function rewind()\n    {\n        call_user_func($this->_fn_rewind);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        call_user_func($this->_fn_seek, $offset, $whence);\n    }\n\n    public function isWritable()\n    {\n        return call_user_func($this->_fn_isWritable);\n    }\n\n    public function write($string)\n    {\n        return call_user_func($this->_fn_write, $string);\n    }\n\n    public function isReadable()\n    {\n        return call_user_func($this->_fn_isReadable);\n    }\n\n    public function read($length)\n    {\n        return call_user_func($this->_fn_read, $length);\n    }\n\n    public function getContents()\n    {\n        return call_user_func($this->_fn_getContents);\n    }\n\n    public function getMetadata($key = null)\n    {\n        return call_user_func($this->_fn_getMetadata, $key);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/InflateStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Uses PHP's zlib.inflate filter to inflate deflate or gzipped content.\n *\n * This stream decorator skips the first 10 bytes of the given stream to remove\n * the gzip header, converts the provided stream to a PHP stream resource,\n * then appends the zlib.inflate filter. The stream is then converted back\n * to a Guzzle stream resource to be used as a Guzzle stream.\n *\n * @link http://tools.ietf.org/html/rfc1952\n * @link http://php.net/manual/en/filters.compression.php\n */\nclass InflateStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    public function __construct(StreamInterface $stream)\n    {\n        // read the first 10 bytes, ie. gzip header\n        $header = $stream->read(10);\n        $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header);\n        // Skip the header, that is 10 + length of filename + 1 (nil) bytes\n        $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength);\n        $resource = StreamWrapper::getResource($stream);\n        stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ);\n        $this->stream = new Stream($resource);\n    }\n\n    /**\n     * @param StreamInterface $stream\n     * @param $header\n     * @return int\n     */\n    private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header)\n    {\n        $filename_header_length = 0;\n\n        if (substr(bin2hex($header), 6, 2) === '08') {\n            // we have a filename, read until nil\n            $filename_header_length = 1;\n            while ($stream->read(1) !== chr(0)) {\n                $filename_header_length++;\n            }\n        }\n\n        return $filename_header_length;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/LazyOpenStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Lazily reads or writes to a file that is opened only after an IO operation\n * take place on the stream.\n */\nclass LazyOpenStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var string File to open */\n    private $filename;\n\n    /** @var string $mode */\n    private $mode;\n\n    /**\n     * @param string $filename File to lazily open\n     * @param string $mode     fopen mode to use when opening the stream\n     */\n    public function __construct($filename, $mode)\n    {\n        $this->filename = $filename;\n        $this->mode = $mode;\n    }\n\n    /**\n     * Creates the underlying stream lazily when required.\n     *\n     * @return StreamInterface\n     */\n    protected function createStream()\n    {\n        return stream_for(try_fopen($this->filename, $this->mode));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/LimitStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n\n/**\n * Decorator used to return only a subset of a stream\n */\nclass LimitStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var int Offset to start reading from */\n    private $offset;\n\n    /** @var int Limit the number of bytes that can be read */\n    private $limit;\n\n    /**\n     * @param StreamInterface $stream Stream to wrap\n     * @param int             $limit  Total number of bytes to allow to be read\n     *                                from the stream. Pass -1 for no limit.\n     * @param int             $offset Position to seek to before reading (only\n     *                                works on seekable streams).\n     */\n    public function __construct(\n        StreamInterface $stream,\n        $limit = -1,\n        $offset = 0\n    ) {\n        $this->stream = $stream;\n        $this->setLimit($limit);\n        $this->setOffset($offset);\n    }\n\n    public function eof()\n    {\n        // Always return true if the underlying stream is EOF\n        if ($this->stream->eof()) {\n            return true;\n        }\n\n        // No limit and the underlying stream is not at EOF\n        if ($this->limit == -1) {\n            return false;\n        }\n\n        return $this->stream->tell() >= $this->offset + $this->limit;\n    }\n\n    /**\n     * Returns the size of the limited subset of data\n     * {@inheritdoc}\n     */\n    public function getSize()\n    {\n        if (null === ($length = $this->stream->getSize())) {\n            return null;\n        } elseif ($this->limit == -1) {\n            return $length - $this->offset;\n        } else {\n            return min($this->limit, $length - $this->offset);\n        }\n    }\n\n    /**\n     * Allow for a bounded seek on the read limited stream\n     * {@inheritdoc}\n     */\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        if ($whence !== SEEK_SET || $offset < 0) {\n            throw new \\RuntimeException(sprintf(\n                'Cannot seek to offset % with whence %s',\n                $offset,\n                $whence\n            ));\n        }\n\n        $offset += $this->offset;\n\n        if ($this->limit !== -1) {\n            if ($offset > $this->offset + $this->limit) {\n                $offset = $this->offset + $this->limit;\n            }\n        }\n\n        $this->stream->seek($offset);\n    }\n\n    /**\n     * Give a relative tell()\n     * {@inheritdoc}\n     */\n    public function tell()\n    {\n        return $this->stream->tell() - $this->offset;\n    }\n\n    /**\n     * Set the offset to start limiting from\n     *\n     * @param int $offset Offset to seek to and begin byte limiting from\n     *\n     * @throws \\RuntimeException if the stream cannot be seeked.\n     */\n    public function setOffset($offset)\n    {\n        $current = $this->stream->tell();\n\n        if ($current !== $offset) {\n            // If the stream cannot seek to the offset position, then read to it\n            if ($this->stream->isSeekable()) {\n                $this->stream->seek($offset);\n            } elseif ($current > $offset) {\n                throw new \\RuntimeException(\"Could not seek to stream offset $offset\");\n            } else {\n                $this->stream->read($offset - $current);\n            }\n        }\n\n        $this->offset = $offset;\n    }\n\n    /**\n     * Set the limit of bytes that the decorator allows to be read from the\n     * stream.\n     *\n     * @param int $limit Number of bytes to allow to be read from the stream.\n     *                   Use -1 for no limit.\n     */\n    public function setLimit($limit)\n    {\n        $this->limit = $limit;\n    }\n\n    public function read($length)\n    {\n        if ($this->limit == -1) {\n            return $this->stream->read($length);\n        }\n\n        // Check if the current position is less than the total allowed\n        // bytes + original offset\n        $remaining = ($this->offset + $this->limit) - $this->stream->tell();\n        if ($remaining > 0) {\n            // Only return the amount of requested data, ensuring that the byte\n            // limit is not exceeded\n            return $this->stream->read(min($remaining, $length));\n        }\n\n        return '';\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/MessageTrait.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Trait implementing functionality common to requests and responses.\n */\ntrait MessageTrait\n{\n    /** @var array Map of all registered headers, as original name => array of values */\n    private $headers = [];\n\n    /** @var array Map of lowercase header name => original name at registration */\n    private $headerNames  = [];\n\n    /** @var string */\n    private $protocol = '1.1';\n\n    /** @var StreamInterface */\n    private $stream;\n\n    public function getProtocolVersion()\n    {\n        return $this->protocol;\n    }\n\n    public function withProtocolVersion($version)\n    {\n        if ($this->protocol === $version) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->protocol = $version;\n        return $new;\n    }\n\n    public function getHeaders()\n    {\n        return $this->headers;\n    }\n\n    public function hasHeader($header)\n    {\n        return isset($this->headerNames[strtolower($header)]);\n    }\n\n    public function getHeader($header)\n    {\n        $header = strtolower($header);\n\n        if (!isset($this->headerNames[$header])) {\n            return [];\n        }\n\n        $header = $this->headerNames[$header];\n\n        return $this->headers[$header];\n    }\n\n    public function getHeaderLine($header)\n    {\n        return implode(', ', $this->getHeader($header));\n    }\n\n    public function withHeader($header, $value)\n    {\n        if (!is_array($value)) {\n            $value = [$value];\n        }\n\n        $value = $this->trimHeaderValues($value);\n        $normalized = strtolower($header);\n\n        $new = clone $this;\n        if (isset($new->headerNames[$normalized])) {\n            unset($new->headers[$new->headerNames[$normalized]]);\n        }\n        $new->headerNames[$normalized] = $header;\n        $new->headers[$header] = $value;\n\n        return $new;\n    }\n\n    public function withAddedHeader($header, $value)\n    {\n        if (!is_array($value)) {\n            $value = [$value];\n        }\n\n        $value = $this->trimHeaderValues($value);\n        $normalized = strtolower($header);\n\n        $new = clone $this;\n        if (isset($new->headerNames[$normalized])) {\n            $header = $this->headerNames[$normalized];\n            $new->headers[$header] = array_merge($this->headers[$header], $value);\n        } else {\n            $new->headerNames[$normalized] = $header;\n            $new->headers[$header] = $value;\n        }\n\n        return $new;\n    }\n\n    public function withoutHeader($header)\n    {\n        $normalized = strtolower($header);\n\n        if (!isset($this->headerNames[$normalized])) {\n            return $this;\n        }\n\n        $header = $this->headerNames[$normalized];\n\n        $new = clone $this;\n        unset($new->headers[$header], $new->headerNames[$normalized]);\n\n        return $new;\n    }\n\n    public function getBody()\n    {\n        if (!$this->stream) {\n            $this->stream = stream_for('');\n        }\n\n        return $this->stream;\n    }\n\n    public function withBody(StreamInterface $body)\n    {\n        if ($body === $this->stream) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->stream = $body;\n        return $new;\n    }\n\n    private function setHeaders(array $headers)\n    {\n        $this->headerNames = $this->headers = [];\n        foreach ($headers as $header => $value) {\n            if (!is_array($value)) {\n                $value = [$value];\n            }\n\n            $value = $this->trimHeaderValues($value);\n            $normalized = strtolower($header);\n            if (isset($this->headerNames[$normalized])) {\n                $header = $this->headerNames[$normalized];\n                $this->headers[$header] = array_merge($this->headers[$header], $value);\n            } else {\n                $this->headerNames[$normalized] = $header;\n                $this->headers[$header] = $value;\n            }\n        }\n    }\n\n    /**\n     * Trims whitespace from the header values.\n     *\n     * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field.\n     *\n     * header-field = field-name \":\" OWS field-value OWS\n     * OWS          = *( SP / HTAB )\n     *\n     * @param string[] $values Header values\n     *\n     * @return string[] Trimmed header values\n     *\n     * @see https://tools.ietf.org/html/rfc7230#section-3.2.4\n     */\n    private function trimHeaderValues(array $values)\n    {\n        return array_map(function ($value) {\n            return trim($value, \" \\t\");\n        }, $values);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/MultipartStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream that when read returns bytes for a streaming multipart or\n * multipart/form-data stream.\n */\nclass MultipartStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    private $boundary;\n\n    /**\n     * @param array  $elements Array of associative arrays, each containing a\n     *                         required \"name\" key mapping to the form field,\n     *                         name, a required \"contents\" key mapping to a\n     *                         StreamInterface/resource/string, an optional\n     *                         \"headers\" associative array of custom headers,\n     *                         and an optional \"filename\" key mapping to a\n     *                         string to send as the filename in the part.\n     * @param string $boundary You can optionally provide a specific boundary\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function __construct(array $elements = [], $boundary = null)\n    {\n        $this->boundary = $boundary ?: sha1(uniqid('', true));\n        $this->stream = $this->createStream($elements);\n    }\n\n    /**\n     * Get the boundary\n     *\n     * @return string\n     */\n    public function getBoundary()\n    {\n        return $this->boundary;\n    }\n\n    public function isWritable()\n    {\n        return false;\n    }\n\n    /**\n     * Get the headers needed before transferring the content of a POST file\n     */\n    private function getHeaders(array $headers)\n    {\n        $str = '';\n        foreach ($headers as $key => $value) {\n            $str .= \"{$key}: {$value}\\r\\n\";\n        }\n\n        return \"--{$this->boundary}\\r\\n\" . trim($str) . \"\\r\\n\\r\\n\";\n    }\n\n    /**\n     * Create the aggregate stream that will be used to upload the POST data\n     */\n    protected function createStream(array $elements)\n    {\n        $stream = new AppendStream();\n\n        foreach ($elements as $element) {\n            $this->addElement($stream, $element);\n        }\n\n        // Add the trailing boundary with CRLF\n        $stream->addStream(stream_for(\"--{$this->boundary}--\\r\\n\"));\n\n        return $stream;\n    }\n\n    private function addElement(AppendStream $stream, array $element)\n    {\n        foreach (['contents', 'name'] as $key) {\n            if (!array_key_exists($key, $element)) {\n                throw new \\InvalidArgumentException(\"A '{$key}' key is required\");\n            }\n        }\n\n        $element['contents'] = stream_for($element['contents']);\n\n        if (empty($element['filename'])) {\n            $uri = $element['contents']->getMetadata('uri');\n            if (substr($uri, 0, 6) !== 'php://') {\n                $element['filename'] = $uri;\n            }\n        }\n\n        list($body, $headers) = $this->createElement(\n            $element['name'],\n            $element['contents'],\n            isset($element['filename']) ? $element['filename'] : null,\n            isset($element['headers']) ? $element['headers'] : []\n        );\n\n        $stream->addStream(stream_for($this->getHeaders($headers)));\n        $stream->addStream($body);\n        $stream->addStream(stream_for(\"\\r\\n\"));\n    }\n\n    /**\n     * @return array\n     */\n    private function createElement($name, StreamInterface $stream, $filename, array $headers)\n    {\n        // Set a default content-disposition header if one was no provided\n        $disposition = $this->getHeader($headers, 'content-disposition');\n        if (!$disposition) {\n            $headers['Content-Disposition'] = ($filename === '0' || $filename)\n                ? sprintf('form-data; name=\"%s\"; filename=\"%s\"',\n                    $name,\n                    basename($filename))\n                : \"form-data; name=\\\"{$name}\\\"\";\n        }\n\n        // Set a default content-length header if one was no provided\n        $length = $this->getHeader($headers, 'content-length');\n        if (!$length) {\n            if ($length = $stream->getSize()) {\n                $headers['Content-Length'] = (string) $length;\n            }\n        }\n\n        // Set a default Content-Type if one was not supplied\n        $type = $this->getHeader($headers, 'content-type');\n        if (!$type && ($filename === '0' || $filename)) {\n            if ($type = mimetype_from_filename($filename)) {\n                $headers['Content-Type'] = $type;\n            }\n        }\n\n        return [$stream, $headers];\n    }\n\n    private function getHeader(array $headers, $key)\n    {\n        $lowercaseHeader = strtolower($key);\n        foreach ($headers as $k => $v) {\n            if (strtolower($k) === $lowercaseHeader) {\n                return $v;\n            }\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/NoSeekStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator that prevents a stream from being seeked\n */\nclass NoSeekStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        throw new \\RuntimeException('Cannot seek a NoSeekStream');\n    }\n\n    public function isSeekable()\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/PumpStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Provides a read only stream that pumps data from a PHP callable.\n *\n * When invoking the provided callable, the PumpStream will pass the amount of\n * data requested to read to the callable. The callable can choose to ignore\n * this value and return fewer or more bytes than requested. Any extra data\n * returned by the provided callable is buffered internally until drained using\n * the read() function of the PumpStream. The provided callable MUST return\n * false when there is no more data to read.\n */\nclass PumpStream implements StreamInterface\n{\n    /** @var callable */\n    private $source;\n\n    /** @var int */\n    private $size;\n\n    /** @var int */\n    private $tellPos = 0;\n\n    /** @var array */\n    private $metadata;\n\n    /** @var BufferStream */\n    private $buffer;\n\n    /**\n     * @param callable $source Source of the stream data. The callable MAY\n     *                         accept an integer argument used to control the\n     *                         amount of data to return. The callable MUST\n     *                         return a string when called, or false on error\n     *                         or EOF.\n     * @param array $options   Stream options:\n     *                         - metadata: Hash of metadata to use with stream.\n     *                         - size: Size of the stream, if known.\n     */\n    public function __construct(callable $source, array $options = [])\n    {\n        $this->source = $source;\n        $this->size = isset($options['size']) ? $options['size'] : null;\n        $this->metadata = isset($options['metadata']) ? $options['metadata'] : [];\n        $this->buffer = new BufferStream();\n    }\n\n    public function __toString()\n    {\n        try {\n            return copy_to_string($this);\n        } catch (\\Exception $e) {\n            return '';\n        }\n    }\n\n    public function close()\n    {\n        $this->detach();\n    }\n\n    public function detach()\n    {\n        $this->tellPos = false;\n        $this->source = null;\n    }\n\n    public function getSize()\n    {\n        return $this->size;\n    }\n\n    public function tell()\n    {\n        return $this->tellPos;\n    }\n\n    public function eof()\n    {\n        return !$this->source;\n    }\n\n    public function isSeekable()\n    {\n        return false;\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        throw new \\RuntimeException('Cannot seek a PumpStream');\n    }\n\n    public function isWritable()\n    {\n        return false;\n    }\n\n    public function write($string)\n    {\n        throw new \\RuntimeException('Cannot write to a PumpStream');\n    }\n\n    public function isReadable()\n    {\n        return true;\n    }\n\n    public function read($length)\n    {\n        $data = $this->buffer->read($length);\n        $readLen = strlen($data);\n        $this->tellPos += $readLen;\n        $remaining = $length - $readLen;\n\n        if ($remaining) {\n            $this->pump($remaining);\n            $data .= $this->buffer->read($remaining);\n            $this->tellPos += strlen($data) - $readLen;\n        }\n\n        return $data;\n    }\n\n    public function getContents()\n    {\n        $result = '';\n        while (!$this->eof()) {\n            $result .= $this->read(1000000);\n        }\n\n        return $result;\n    }\n\n    public function getMetadata($key = null)\n    {\n        if (!$key) {\n            return $this->metadata;\n        }\n\n        return isset($this->metadata[$key]) ? $this->metadata[$key] : null;\n    }\n\n    private function pump($length)\n    {\n        if ($this->source) {\n            do {\n                $data = call_user_func($this->source, $length);\n                if ($data === false || $data === null) {\n                    $this->source = null;\n                    return;\n                }\n                $this->buffer->write($data);\n                $length -= strlen($data);\n            } while ($length > 0);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/Request.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * PSR-7 request implementation.\n */\nclass Request implements RequestInterface\n{\n    use MessageTrait;\n\n    /** @var string */\n    private $method;\n\n    /** @var null|string */\n    private $requestTarget;\n\n    /** @var UriInterface */\n    private $uri;\n\n    /**\n     * @param string                               $method  HTTP method\n     * @param string|UriInterface                  $uri     URI\n     * @param array                                $headers Request headers\n     * @param string|null|resource|StreamInterface $body    Request body\n     * @param string                               $version Protocol version\n     */\n    public function __construct(\n        $method,\n        $uri,\n        array $headers = [],\n        $body = null,\n        $version = '1.1'\n    ) {\n        if (!($uri instanceof UriInterface)) {\n            $uri = new Uri($uri);\n        }\n\n        $this->method = strtoupper($method);\n        $this->uri = $uri;\n        $this->setHeaders($headers);\n        $this->protocol = $version;\n\n        if (!$this->hasHeader('Host')) {\n            $this->updateHostFromUri();\n        }\n\n        if ($body !== '' && $body !== null) {\n            $this->stream = stream_for($body);\n        }\n    }\n\n    public function getRequestTarget()\n    {\n        if ($this->requestTarget !== null) {\n            return $this->requestTarget;\n        }\n\n        $target = $this->uri->getPath();\n        if ($target == '') {\n            $target = '/';\n        }\n        if ($this->uri->getQuery() != '') {\n            $target .= '?' . $this->uri->getQuery();\n        }\n\n        return $target;\n    }\n\n    public function withRequestTarget($requestTarget)\n    {\n        if (preg_match('#\\s#', $requestTarget)) {\n            throw new InvalidArgumentException(\n                'Invalid request target provided; cannot contain whitespace'\n            );\n        }\n\n        $new = clone $this;\n        $new->requestTarget = $requestTarget;\n        return $new;\n    }\n\n    public function getMethod()\n    {\n        return $this->method;\n    }\n\n    public function withMethod($method)\n    {\n        $new = clone $this;\n        $new->method = strtoupper($method);\n        return $new;\n    }\n\n    public function getUri()\n    {\n        return $this->uri;\n    }\n\n    public function withUri(UriInterface $uri, $preserveHost = false)\n    {\n        if ($uri === $this->uri) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->uri = $uri;\n\n        if (!$preserveHost) {\n            $new->updateHostFromUri();\n        }\n\n        return $new;\n    }\n\n    private function updateHostFromUri()\n    {\n        $host = $this->uri->getHost();\n\n        if ($host == '') {\n            return;\n        }\n\n        if (($port = $this->uri->getPort()) !== null) {\n            $host .= ':' . $port;\n        }\n\n        if (isset($this->headerNames['host'])) {\n            $header = $this->headerNames['host'];\n        } else {\n            $header = 'Host';\n            $this->headerNames['host'] = 'Host';\n        }\n        // Ensure Host is the first header.\n        // See: http://tools.ietf.org/html/rfc7230#section-5.4\n        $this->headers = [$header => [$host]] + $this->headers;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/Response.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * PSR-7 response implementation.\n */\nclass Response implements ResponseInterface\n{\n    use MessageTrait;\n\n    /** @var array Map of standard HTTP status code/reason phrases */\n    private static $phrases = [\n        100 => 'Continue',\n        101 => 'Switching Protocols',\n        102 => 'Processing',\n        200 => 'OK',\n        201 => 'Created',\n        202 => 'Accepted',\n        203 => 'Non-Authoritative Information',\n        204 => 'No Content',\n        205 => 'Reset Content',\n        206 => 'Partial Content',\n        207 => 'Multi-status',\n        208 => 'Already Reported',\n        300 => 'Multiple Choices',\n        301 => 'Moved Permanently',\n        302 => 'Found',\n        303 => 'See Other',\n        304 => 'Not Modified',\n        305 => 'Use Proxy',\n        306 => 'Switch Proxy',\n        307 => 'Temporary Redirect',\n        400 => 'Bad Request',\n        401 => 'Unauthorized',\n        402 => 'Payment Required',\n        403 => 'Forbidden',\n        404 => 'Not Found',\n        405 => 'Method Not Allowed',\n        406 => 'Not Acceptable',\n        407 => 'Proxy Authentication Required',\n        408 => 'Request Time-out',\n        409 => 'Conflict',\n        410 => 'Gone',\n        411 => 'Length Required',\n        412 => 'Precondition Failed',\n        413 => 'Request Entity Too Large',\n        414 => 'Request-URI Too Large',\n        415 => 'Unsupported Media Type',\n        416 => 'Requested range not satisfiable',\n        417 => 'Expectation Failed',\n        418 => 'I\\'m a teapot',\n        422 => 'Unprocessable Entity',\n        423 => 'Locked',\n        424 => 'Failed Dependency',\n        425 => 'Unordered Collection',\n        426 => 'Upgrade Required',\n        428 => 'Precondition Required',\n        429 => 'Too Many Requests',\n        431 => 'Request Header Fields Too Large',\n        451 => 'Unavailable For Legal Reasons',\n        500 => 'Internal Server Error',\n        501 => 'Not Implemented',\n        502 => 'Bad Gateway',\n        503 => 'Service Unavailable',\n        504 => 'Gateway Time-out',\n        505 => 'HTTP Version not supported',\n        506 => 'Variant Also Negotiates',\n        507 => 'Insufficient Storage',\n        508 => 'Loop Detected',\n        511 => 'Network Authentication Required',\n    ];\n\n    /** @var string */\n    private $reasonPhrase = '';\n\n    /** @var int */\n    private $statusCode = 200;\n\n    /**\n     * @param int                                  $status  Status code\n     * @param array                                $headers Response headers\n     * @param string|null|resource|StreamInterface $body    Response body\n     * @param string                               $version Protocol version\n     * @param string|null                          $reason  Reason phrase (when empty a default will be used based on the status code)\n     */\n    public function __construct(\n        $status = 200,\n        array $headers = [],\n        $body = null,\n        $version = '1.1',\n        $reason = null\n    ) {\n        $this->statusCode = (int) $status;\n\n        if ($body !== '' && $body !== null) {\n            $this->stream = stream_for($body);\n        }\n\n        $this->setHeaders($headers);\n        if ($reason == '' && isset(self::$phrases[$this->statusCode])) {\n            $this->reasonPhrase = self::$phrases[$this->statusCode];\n        } else {\n            $this->reasonPhrase = (string) $reason;\n        }\n\n        $this->protocol = $version;\n    }\n\n    public function getStatusCode()\n    {\n        return $this->statusCode;\n    }\n\n    public function getReasonPhrase()\n    {\n        return $this->reasonPhrase;\n    }\n\n    public function withStatus($code, $reasonPhrase = '')\n    {\n        $new = clone $this;\n        $new->statusCode = (int) $code;\n        if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) {\n            $reasonPhrase = self::$phrases[$new->statusCode];\n        }\n        $new->reasonPhrase = $reasonPhrase;\n        return $new;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/ServerRequest.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Psr\\Http\\Message\\UriInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UploadedFileInterface;\n\n/**\n * Server-side HTTP request\n *\n * Extends the Request definition to add methods for accessing incoming data,\n * specifically server parameters, cookies, matched path parameters, query\n * string arguments, body parameters, and upload file information.\n *\n * \"Attributes\" are discovered via decomposing the request (and usually\n * specifically the URI path), and typically will be injected by the application.\n *\n * Requests are considered immutable; all methods that might change state are\n * implemented such that they retain the internal state of the current\n * message and return a new instance that contains the changed state.\n */\nclass ServerRequest extends Request implements ServerRequestInterface\n{\n    /**\n     * @var array\n     */\n    private $attributes = [];\n\n    /**\n     * @var array\n     */\n    private $cookieParams = [];\n\n    /**\n     * @var null|array|object\n     */\n    private $parsedBody;\n\n    /**\n     * @var array\n     */\n    private $queryParams = [];\n\n    /**\n     * @var array\n     */\n    private $serverParams;\n\n    /**\n     * @var array\n     */\n    private $uploadedFiles = [];\n\n    /**\n     * @param string                               $method       HTTP method\n     * @param string|UriInterface                  $uri          URI\n     * @param array                                $headers      Request headers\n     * @param string|null|resource|StreamInterface $body         Request body\n     * @param string                               $version      Protocol version\n     * @param array                                $serverParams Typically the $_SERVER superglobal\n     */\n    public function __construct(\n        $method,\n        $uri,\n        array $headers = [],\n        $body = null,\n        $version = '1.1',\n        array $serverParams = []\n    ) {\n        $this->serverParams = $serverParams;\n\n        parent::__construct($method, $uri, $headers, $body, $version);\n    }\n\n    /**\n     * Return an UploadedFile instance array.\n     *\n     * @param array $files A array which respect $_FILES structure\n     * @throws InvalidArgumentException for unrecognized values\n     * @return array\n     */\n    public static function normalizeFiles(array $files)\n    {\n        $normalized = [];\n\n        foreach ($files as $key => $value) {\n            if ($value instanceof UploadedFileInterface) {\n                $normalized[$key] = $value;\n            } elseif (is_array($value) && isset($value['tmp_name'])) {\n                $normalized[$key] = self::createUploadedFileFromSpec($value);\n            } elseif (is_array($value)) {\n                $normalized[$key] = self::normalizeFiles($value);\n                continue;\n            } else {\n                throw new InvalidArgumentException('Invalid value in files specification');\n            }\n        }\n\n        return $normalized;\n    }\n\n    /**\n     * Create and return an UploadedFile instance from a $_FILES specification.\n     *\n     * If the specification represents an array of values, this method will\n     * delegate to normalizeNestedFileSpec() and return that return value.\n     *\n     * @param array $value $_FILES struct\n     * @return array|UploadedFileInterface\n     */\n    private static function createUploadedFileFromSpec(array $value)\n    {\n        if (is_array($value['tmp_name'])) {\n            return self::normalizeNestedFileSpec($value);\n        }\n\n        return new UploadedFile(\n            $value['tmp_name'],\n            (int) $value['size'],\n            (int) $value['error'],\n            $value['name'],\n            $value['type']\n        );\n    }\n\n    /**\n     * Normalize an array of file specifications.\n     *\n     * Loops through all nested files and returns a normalized array of\n     * UploadedFileInterface instances.\n     *\n     * @param array $files\n     * @return UploadedFileInterface[]\n     */\n    private static function normalizeNestedFileSpec(array $files = [])\n    {\n        $normalizedFiles = [];\n\n        foreach (array_keys($files['tmp_name']) as $key) {\n            $spec = [\n                'tmp_name' => $files['tmp_name'][$key],\n                'size'     => $files['size'][$key],\n                'error'    => $files['error'][$key],\n                'name'     => $files['name'][$key],\n                'type'     => $files['type'][$key],\n            ];\n            $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec);\n        }\n\n        return $normalizedFiles;\n    }\n\n    /**\n     * Return a ServerRequest populated with superglobals:\n     * $_GET\n     * $_POST\n     * $_COOKIE\n     * $_FILES\n     * $_SERVER\n     *\n     * @return ServerRequestInterface\n     */\n    public static function fromGlobals()\n    {\n        $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';\n        $headers = function_exists('getallheaders') ? getallheaders() : [];\n        $uri = self::getUriFromGlobals();\n        $body = new LazyOpenStream('php://input', 'r+');\n        $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1';\n\n        $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER);\n\n        return $serverRequest\n            ->withCookieParams($_COOKIE)\n            ->withQueryParams($_GET)\n            ->withParsedBody($_POST)\n            ->withUploadedFiles(self::normalizeFiles($_FILES));\n    }\n\n    /**\n     * Get a Uri populated with values from $_SERVER.\n     *\n     * @return UriInterface\n     */\n    public static function getUriFromGlobals() {\n        $uri = new Uri('');\n\n        $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http');\n\n        $hasPort = false;\n        if (isset($_SERVER['HTTP_HOST'])) {\n            $hostHeaderParts = explode(':', $_SERVER['HTTP_HOST']);\n            $uri = $uri->withHost($hostHeaderParts[0]);\n            if (isset($hostHeaderParts[1])) {\n                $hasPort = true;\n                $uri = $uri->withPort($hostHeaderParts[1]);\n            }\n        } elseif (isset($_SERVER['SERVER_NAME'])) {\n            $uri = $uri->withHost($_SERVER['SERVER_NAME']);\n        } elseif (isset($_SERVER['SERVER_ADDR'])) {\n            $uri = $uri->withHost($_SERVER['SERVER_ADDR']);\n        }\n\n        if (!$hasPort && isset($_SERVER['SERVER_PORT'])) {\n            $uri = $uri->withPort($_SERVER['SERVER_PORT']);\n        }\n\n        $hasQuery = false;\n        if (isset($_SERVER['REQUEST_URI'])) {\n            $requestUriParts = explode('?', $_SERVER['REQUEST_URI']);\n            $uri = $uri->withPath($requestUriParts[0]);\n            if (isset($requestUriParts[1])) {\n                $hasQuery = true;\n                $uri = $uri->withQuery($requestUriParts[1]);\n            }\n        }\n\n        if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) {\n            $uri = $uri->withQuery($_SERVER['QUERY_STRING']);\n        }\n\n        return $uri;\n    }\n\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getServerParams()\n    {\n        return $this->serverParams;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getUploadedFiles()\n    {\n        return $this->uploadedFiles;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withUploadedFiles(array $uploadedFiles)\n    {\n        $new = clone $this;\n        $new->uploadedFiles = $uploadedFiles;\n\n        return $new;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getCookieParams()\n    {\n        return $this->cookieParams;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withCookieParams(array $cookies)\n    {\n        $new = clone $this;\n        $new->cookieParams = $cookies;\n\n        return $new;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getQueryParams()\n    {\n        return $this->queryParams;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withQueryParams(array $query)\n    {\n        $new = clone $this;\n        $new->queryParams = $query;\n\n        return $new;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getParsedBody()\n    {\n        return $this->parsedBody;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withParsedBody($data)\n    {\n        $new = clone $this;\n        $new->parsedBody = $data;\n\n        return $new;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getAttributes()\n    {\n        return $this->attributes;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getAttribute($attribute, $default = null)\n    {\n        if (false === array_key_exists($attribute, $this->attributes)) {\n            return $default;\n        }\n\n        return $this->attributes[$attribute];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withAttribute($attribute, $value)\n    {\n        $new = clone $this;\n        $new->attributes[$attribute] = $value;\n\n        return $new;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withoutAttribute($attribute)\n    {\n        if (false === array_key_exists($attribute, $this->attributes)) {\n            return $this;\n        }\n\n        $new = clone $this;\n        unset($new->attributes[$attribute]);\n\n        return $new;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/Stream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * PHP stream implementation.\n *\n * @var $stream\n */\nclass Stream implements StreamInterface\n{\n    private $stream;\n    private $size;\n    private $seekable;\n    private $readable;\n    private $writable;\n    private $uri;\n    private $customMetadata;\n\n    /** @var array Hash of readable and writable stream types */\n    private static $readWriteHash = [\n        'read' => [\n            'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true,\n            'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true,\n            'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true,\n            'x+t' => true, 'c+t' => true, 'a+' => true\n        ],\n        'write' => [\n            'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true,\n            'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true,\n            'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true,\n            'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true\n        ]\n    ];\n\n    /**\n     * This constructor accepts an associative array of options.\n     *\n     * - size: (int) If a read stream would otherwise have an indeterminate\n     *   size, but the size is known due to foreknowledge, then you can\n     *   provide that size, in bytes.\n     * - metadata: (array) Any additional metadata to return when the metadata\n     *   of the stream is accessed.\n     *\n     * @param resource $stream  Stream resource to wrap.\n     * @param array    $options Associative array of options.\n     *\n     * @throws \\InvalidArgumentException if the stream is not a stream resource\n     */\n    public function __construct($stream, $options = [])\n    {\n        if (!is_resource($stream)) {\n            throw new \\InvalidArgumentException('Stream must be a resource');\n        }\n\n        if (isset($options['size'])) {\n            $this->size = $options['size'];\n        }\n\n        $this->customMetadata = isset($options['metadata'])\n            ? $options['metadata']\n            : [];\n\n        $this->stream = $stream;\n        $meta = stream_get_meta_data($this->stream);\n        $this->seekable = $meta['seekable'];\n        $this->readable = isset(self::$readWriteHash['read'][$meta['mode']]);\n        $this->writable = isset(self::$readWriteHash['write'][$meta['mode']]);\n        $this->uri = $this->getMetadata('uri');\n    }\n\n    public function __get($name)\n    {\n        if ($name == 'stream') {\n            throw new \\RuntimeException('The stream is detached');\n        }\n\n        throw new \\BadMethodCallException('No value for ' . $name);\n    }\n\n    /**\n     * Closes the stream when the destructed\n     */\n    public function __destruct()\n    {\n        $this->close();\n    }\n\n    public function __toString()\n    {\n        try {\n            $this->seek(0);\n            return (string) stream_get_contents($this->stream);\n        } catch (\\Exception $e) {\n            return '';\n        }\n    }\n\n    public function getContents()\n    {\n        $contents = stream_get_contents($this->stream);\n\n        if ($contents === false) {\n            throw new \\RuntimeException('Unable to read stream contents');\n        }\n\n        return $contents;\n    }\n\n    public function close()\n    {\n        if (isset($this->stream)) {\n            if (is_resource($this->stream)) {\n                fclose($this->stream);\n            }\n            $this->detach();\n        }\n    }\n\n    public function detach()\n    {\n        if (!isset($this->stream)) {\n            return null;\n        }\n\n        $result = $this->stream;\n        unset($this->stream);\n        $this->size = $this->uri = null;\n        $this->readable = $this->writable = $this->seekable = false;\n\n        return $result;\n    }\n\n    public function getSize()\n    {\n        if ($this->size !== null) {\n            return $this->size;\n        }\n\n        if (!isset($this->stream)) {\n            return null;\n        }\n\n        // Clear the stat cache if the stream has a URI\n        if ($this->uri) {\n            clearstatcache(true, $this->uri);\n        }\n\n        $stats = fstat($this->stream);\n        if (isset($stats['size'])) {\n            $this->size = $stats['size'];\n            return $this->size;\n        }\n\n        return null;\n    }\n\n    public function isReadable()\n    {\n        return $this->readable;\n    }\n\n    public function isWritable()\n    {\n        return $this->writable;\n    }\n\n    public function isSeekable()\n    {\n        return $this->seekable;\n    }\n\n    public function eof()\n    {\n        return !$this->stream || feof($this->stream);\n    }\n\n    public function tell()\n    {\n        $result = ftell($this->stream);\n\n        if ($result === false) {\n            throw new \\RuntimeException('Unable to determine stream position');\n        }\n\n        return $result;\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        if (!$this->seekable) {\n            throw new \\RuntimeException('Stream is not seekable');\n        } elseif (fseek($this->stream, $offset, $whence) === -1) {\n            throw new \\RuntimeException('Unable to seek to stream position '\n                . $offset . ' with whence ' . var_export($whence, true));\n        }\n    }\n\n    public function read($length)\n    {\n        if (!$this->readable) {\n            throw new \\RuntimeException('Cannot read from non-readable stream');\n        }\n        if ($length < 0) {\n            throw new \\RuntimeException('Length parameter cannot be negative');\n        }\n\n        if (0 === $length) {\n            return '';\n        }\n\n        $string = fread($this->stream, $length);\n        if (false === $string) {\n            throw new \\RuntimeException('Unable to read from stream');\n        }\n\n        return $string;\n    }\n\n    public function write($string)\n    {\n        if (!$this->writable) {\n            throw new \\RuntimeException('Cannot write to a non-writable stream');\n        }\n\n        // We can't know the size after writing anything\n        $this->size = null;\n        $result = fwrite($this->stream, $string);\n\n        if ($result === false) {\n            throw new \\RuntimeException('Unable to write to stream');\n        }\n\n        return $result;\n    }\n\n    public function getMetadata($key = null)\n    {\n        if (!isset($this->stream)) {\n            return $key ? null : [];\n        } elseif (!$key) {\n            return $this->customMetadata + stream_get_meta_data($this->stream);\n        } elseif (isset($this->customMetadata[$key])) {\n            return $this->customMetadata[$key];\n        }\n\n        $meta = stream_get_meta_data($this->stream);\n\n        return isset($meta[$key]) ? $meta[$key] : null;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator trait\n * @property StreamInterface stream\n */\ntrait StreamDecoratorTrait\n{\n    /**\n     * @param StreamInterface $stream Stream to decorate\n     */\n    public function __construct(StreamInterface $stream)\n    {\n        $this->stream = $stream;\n    }\n\n    /**\n     * Magic method used to create a new stream if streams are not added in\n     * the constructor of a decorator (e.g., LazyOpenStream).\n     *\n     * @param string $name Name of the property (allows \"stream\" only).\n     *\n     * @return StreamInterface\n     */\n    public function __get($name)\n    {\n        if ($name == 'stream') {\n            $this->stream = $this->createStream();\n            return $this->stream;\n        }\n\n        throw new \\UnexpectedValueException(\"$name not found on class\");\n    }\n\n    public function __toString()\n    {\n        try {\n            if ($this->isSeekable()) {\n                $this->seek(0);\n            }\n            return $this->getContents();\n        } catch (\\Exception $e) {\n            // Really, PHP? https://bugs.php.net/bug.php?id=53648\n            trigger_error('StreamDecorator::__toString exception: '\n                . (string) $e, E_USER_ERROR);\n            return '';\n        }\n    }\n\n    public function getContents()\n    {\n        return copy_to_string($this);\n    }\n\n    /**\n     * Allow decorators to implement custom methods\n     *\n     * @param string $method Missing method name\n     * @param array  $args   Method arguments\n     *\n     * @return mixed\n     */\n    public function __call($method, array $args)\n    {\n        $result = call_user_func_array([$this->stream, $method], $args);\n\n        // Always return the wrapped object if the result is a return $this\n        return $result === $this->stream ? $this : $result;\n    }\n\n    public function close()\n    {\n        $this->stream->close();\n    }\n\n    public function getMetadata($key = null)\n    {\n        return $this->stream->getMetadata($key);\n    }\n\n    public function detach()\n    {\n        return $this->stream->detach();\n    }\n\n    public function getSize()\n    {\n        return $this->stream->getSize();\n    }\n\n    public function eof()\n    {\n        return $this->stream->eof();\n    }\n\n    public function tell()\n    {\n        return $this->stream->tell();\n    }\n\n    public function isReadable()\n    {\n        return $this->stream->isReadable();\n    }\n\n    public function isWritable()\n    {\n        return $this->stream->isWritable();\n    }\n\n    public function isSeekable()\n    {\n        return $this->stream->isSeekable();\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        $this->stream->seek($offset, $whence);\n    }\n\n    public function read($length)\n    {\n        return $this->stream->read($length);\n    }\n\n    public function write($string)\n    {\n        return $this->stream->write($string);\n    }\n\n    /**\n     * Implement in subclasses to dynamically create streams when requested.\n     *\n     * @return StreamInterface\n     * @throws \\BadMethodCallException\n     */\n    protected function createStream()\n    {\n        throw new \\BadMethodCallException('Not implemented');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/StreamWrapper.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Converts Guzzle streams into PHP stream resources.\n */\nclass StreamWrapper\n{\n    /** @var resource */\n    public $context;\n\n    /** @var StreamInterface */\n    private $stream;\n\n    /** @var string r, r+, or w */\n    private $mode;\n\n    /**\n     * Returns a resource representing the stream.\n     *\n     * @param StreamInterface $stream The stream to get a resource for\n     *\n     * @return resource\n     * @throws \\InvalidArgumentException if stream is not readable or writable\n     */\n    public static function getResource(StreamInterface $stream)\n    {\n        self::register();\n\n        if ($stream->isReadable()) {\n            $mode = $stream->isWritable() ? 'r+' : 'r';\n        } elseif ($stream->isWritable()) {\n            $mode = 'w';\n        } else {\n            throw new \\InvalidArgumentException('The stream must be readable, '\n                . 'writable, or both.');\n        }\n\n        return fopen('guzzle://stream', $mode, null, stream_context_create([\n            'guzzle' => ['stream' => $stream]\n        ]));\n    }\n\n    /**\n     * Registers the stream wrapper if needed\n     */\n    public static function register()\n    {\n        if (!in_array('guzzle', stream_get_wrappers())) {\n            stream_wrapper_register('guzzle', __CLASS__);\n        }\n    }\n\n    public function stream_open($path, $mode, $options, &$opened_path)\n    {\n        $options = stream_context_get_options($this->context);\n\n        if (!isset($options['guzzle']['stream'])) {\n            return false;\n        }\n\n        $this->mode = $mode;\n        $this->stream = $options['guzzle']['stream'];\n\n        return true;\n    }\n\n    public function stream_read($count)\n    {\n        return $this->stream->read($count);\n    }\n\n    public function stream_write($data)\n    {\n        return (int) $this->stream->write($data);\n    }\n\n    public function stream_tell()\n    {\n        return $this->stream->tell();\n    }\n\n    public function stream_eof()\n    {\n        return $this->stream->eof();\n    }\n\n    public function stream_seek($offset, $whence)\n    {\n        $this->stream->seek($offset, $whence);\n\n        return true;\n    }\n\n    public function stream_stat()\n    {\n        static $modeMap = [\n            'r'  => 33060,\n            'r+' => 33206,\n            'w'  => 33188\n        ];\n\n        return [\n            'dev'     => 0,\n            'ino'     => 0,\n            'mode'    => $modeMap[$this->mode],\n            'nlink'   => 0,\n            'uid'     => 0,\n            'gid'     => 0,\n            'rdev'    => 0,\n            'size'    => $this->stream->getSize() ?: 0,\n            'atime'   => 0,\n            'mtime'   => 0,\n            'ctime'   => 0,\n            'blksize' => 0,\n            'blocks'  => 0\n        ];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/UploadedFile.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UploadedFileInterface;\nuse RuntimeException;\n\nclass UploadedFile implements UploadedFileInterface\n{\n    /**\n     * @var int[]\n     */\n    private static $errors = [\n        UPLOAD_ERR_OK,\n        UPLOAD_ERR_INI_SIZE,\n        UPLOAD_ERR_FORM_SIZE,\n        UPLOAD_ERR_PARTIAL,\n        UPLOAD_ERR_NO_FILE,\n        UPLOAD_ERR_NO_TMP_DIR,\n        UPLOAD_ERR_CANT_WRITE,\n        UPLOAD_ERR_EXTENSION,\n    ];\n\n    /**\n     * @var string\n     */\n    private $clientFilename;\n\n    /**\n     * @var string\n     */\n    private $clientMediaType;\n\n    /**\n     * @var int\n     */\n    private $error;\n\n    /**\n     * @var null|string\n     */\n    private $file;\n\n    /**\n     * @var bool\n     */\n    private $moved = false;\n\n    /**\n     * @var int\n     */\n    private $size;\n\n    /**\n     * @var StreamInterface|null\n     */\n    private $stream;\n\n    /**\n     * @param StreamInterface|string|resource $streamOrFile\n     * @param int $size\n     * @param int $errorStatus\n     * @param string|null $clientFilename\n     * @param string|null $clientMediaType\n     */\n    public function __construct(\n        $streamOrFile,\n        $size,\n        $errorStatus,\n        $clientFilename = null,\n        $clientMediaType = null\n    ) {\n        $this->setError($errorStatus);\n        $this->setSize($size);\n        $this->setClientFilename($clientFilename);\n        $this->setClientMediaType($clientMediaType);\n\n        if ($this->isOk()) {\n            $this->setStreamOrFile($streamOrFile);\n        }\n    }\n\n    /**\n     * Depending on the value set file or stream variable\n     *\n     * @param mixed $streamOrFile\n     * @throws InvalidArgumentException\n     */\n    private function setStreamOrFile($streamOrFile)\n    {\n        if (is_string($streamOrFile)) {\n            $this->file = $streamOrFile;\n        } elseif (is_resource($streamOrFile)) {\n            $this->stream = new Stream($streamOrFile);\n        } elseif ($streamOrFile instanceof StreamInterface) {\n            $this->stream = $streamOrFile;\n        } else {\n            throw new InvalidArgumentException(\n                'Invalid stream or file provided for UploadedFile'\n            );\n        }\n    }\n\n    /**\n     * @param int $error\n     * @throws InvalidArgumentException\n     */\n    private function setError($error)\n    {\n        if (false === is_int($error)) {\n            throw new InvalidArgumentException(\n                'Upload file error status must be an integer'\n            );\n        }\n\n        if (false === in_array($error, UploadedFile::$errors)) {\n            throw new InvalidArgumentException(\n                'Invalid error status for UploadedFile'\n            );\n        }\n\n        $this->error = $error;\n    }\n\n    /**\n     * @param int $size\n     * @throws InvalidArgumentException\n     */\n    private function setSize($size)\n    {\n        if (false === is_int($size)) {\n            throw new InvalidArgumentException(\n                'Upload file size must be an integer'\n            );\n        }\n\n        $this->size = $size;\n    }\n\n    /**\n     * @param mixed $param\n     * @return boolean\n     */\n    private function isStringOrNull($param)\n    {\n        return in_array(gettype($param), ['string', 'NULL']);\n    }\n\n    /**\n     * @param mixed $param\n     * @return boolean\n     */\n    private function isStringNotEmpty($param)\n    {\n        return is_string($param) && false === empty($param);\n    }\n\n    /**\n     * @param string|null $clientFilename\n     * @throws InvalidArgumentException\n     */\n    private function setClientFilename($clientFilename)\n    {\n        if (false === $this->isStringOrNull($clientFilename)) {\n            throw new InvalidArgumentException(\n                'Upload file client filename must be a string or null'\n            );\n        }\n\n        $this->clientFilename = $clientFilename;\n    }\n\n    /**\n     * @param string|null $clientMediaType\n     * @throws InvalidArgumentException\n     */\n    private function setClientMediaType($clientMediaType)\n    {\n        if (false === $this->isStringOrNull($clientMediaType)) {\n            throw new InvalidArgumentException(\n                'Upload file client media type must be a string or null'\n            );\n        }\n\n        $this->clientMediaType = $clientMediaType;\n    }\n\n    /**\n     * Return true if there is no upload error\n     *\n     * @return boolean\n     */\n    private function isOk()\n    {\n        return $this->error === UPLOAD_ERR_OK;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function isMoved()\n    {\n        return $this->moved;\n    }\n\n    /**\n     * @throws RuntimeException if is moved or not ok\n     */\n    private function validateActive()\n    {\n        if (false === $this->isOk()) {\n            throw new RuntimeException('Cannot retrieve stream due to upload error');\n        }\n\n        if ($this->isMoved()) {\n            throw new RuntimeException('Cannot retrieve stream after it has already been moved');\n        }\n    }\n\n    /**\n     * {@inheritdoc}\n     * @throws RuntimeException if the upload was not successful.\n     */\n    public function getStream()\n    {\n        $this->validateActive();\n\n        if ($this->stream instanceof StreamInterface) {\n            return $this->stream;\n        }\n\n        return new LazyOpenStream($this->file, 'r+');\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @see http://php.net/is_uploaded_file\n     * @see http://php.net/move_uploaded_file\n     * @param string $targetPath Path to which to move the uploaded file.\n     * @throws RuntimeException if the upload was not successful.\n     * @throws InvalidArgumentException if the $path specified is invalid.\n     * @throws RuntimeException on any error during the move operation, or on\n     *     the second or subsequent call to the method.\n     */\n    public function moveTo($targetPath)\n    {\n        $this->validateActive();\n\n        if (false === $this->isStringNotEmpty($targetPath)) {\n            throw new InvalidArgumentException(\n                'Invalid path provided for move operation; must be a non-empty string'\n            );\n        }\n\n        if ($this->file) {\n            $this->moved = php_sapi_name() == 'cli'\n                ? rename($this->file, $targetPath)\n                : move_uploaded_file($this->file, $targetPath);\n        } else {\n            copy_to_stream(\n                $this->getStream(),\n                new LazyOpenStream($targetPath, 'w')\n            );\n\n            $this->moved = true;\n        }\n\n        if (false === $this->moved) {\n            throw new RuntimeException(\n                sprintf('Uploaded file could not be moved to %s', $targetPath)\n            );\n        }\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @return int|null The file size in bytes or null if unknown.\n     */\n    public function getSize()\n    {\n        return $this->size;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @see http://php.net/manual/en/features.file-upload.errors.php\n     * @return int One of PHP's UPLOAD_ERR_XXX constants.\n     */\n    public function getError()\n    {\n        return $this->error;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @return string|null The filename sent by the client or null if none\n     *     was provided.\n     */\n    public function getClientFilename()\n    {\n        return $this->clientFilename;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getClientMediaType()\n    {\n        return $this->clientMediaType;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/Uri.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * PSR-7 URI implementation.\n *\n * @author Michael Dowling\n * @author Tobias Schultze\n * @author Matthew Weier O'Phinney\n */\nclass Uri implements UriInterface\n{\n    /**\n     * Absolute http and https URIs require a host per RFC 7230 Section 2.7\n     * but in generic URIs the host can be empty. So for http(s) URIs\n     * we apply this default host when no host is given yet to form a\n     * valid URI.\n     */\n    const HTTP_DEFAULT_HOST = 'localhost';\n\n    private static $defaultPorts = [\n        'http'  => 80,\n        'https' => 443,\n        'ftp' => 21,\n        'gopher' => 70,\n        'nntp' => 119,\n        'news' => 119,\n        'telnet' => 23,\n        'tn3270' => 23,\n        'imap' => 143,\n        'pop' => 110,\n        'ldap' => 389,\n    ];\n\n    private static $charUnreserved = 'a-zA-Z0-9_\\-\\.~';\n    private static $charSubDelims = '!\\$&\\'\\(\\)\\*\\+,;=';\n    private static $replaceQuery = ['=' => '%3D', '&' => '%26'];\n\n    /** @var string Uri scheme. */\n    private $scheme = '';\n\n    /** @var string Uri user info. */\n    private $userInfo = '';\n\n    /** @var string Uri host. */\n    private $host = '';\n\n    /** @var int|null Uri port. */\n    private $port;\n\n    /** @var string Uri path. */\n    private $path = '';\n\n    /** @var string Uri query string. */\n    private $query = '';\n\n    /** @var string Uri fragment. */\n    private $fragment = '';\n\n    /**\n     * @param string $uri URI to parse\n     */\n    public function __construct($uri = '')\n    {\n        // weak type check to also accept null until we can add scalar type hints\n        if ($uri != '') {\n            $parts = parse_url($uri);\n            if ($parts === false) {\n                throw new \\InvalidArgumentException(\"Unable to parse URI: $uri\");\n            }\n            $this->applyParts($parts);\n        }\n    }\n\n    public function __toString()\n    {\n        return self::composeComponents(\n            $this->scheme,\n            $this->getAuthority(),\n            $this->path,\n            $this->query,\n            $this->fragment\n        );\n    }\n\n    /**\n     * Composes a URI reference string from its various components.\n     *\n     * Usually this method does not need to be called manually but instead is used indirectly via\n     * `Psr\\Http\\Message\\UriInterface::__toString`.\n     *\n     * PSR-7 UriInterface treats an empty component the same as a missing component as\n     * getQuery(), getFragment() etc. always return a string. This explains the slight\n     * difference to RFC 3986 Section 5.3.\n     *\n     * Another adjustment is that the authority separator is added even when the authority is missing/empty\n     * for the \"file\" scheme. This is because PHP stream functions like `file_get_contents` only work with\n     * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But\n     * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to\n     * that format).\n     *\n     * @param string $scheme\n     * @param string $authority\n     * @param string $path\n     * @param string $query\n     * @param string $fragment\n     *\n     * @return string\n     *\n     * @link https://tools.ietf.org/html/rfc3986#section-5.3\n     */\n    public static function composeComponents($scheme, $authority, $path, $query, $fragment)\n    {\n        $uri = '';\n\n        // weak type checks to also accept null until we can add scalar type hints\n        if ($scheme != '') {\n            $uri .= $scheme . ':';\n        }\n\n        if ($authority != ''|| $scheme === 'file') {\n            $uri .= '//' . $authority;\n        }\n\n        $uri .= $path;\n\n        if ($query != '') {\n            $uri .= '?' . $query;\n        }\n\n        if ($fragment != '') {\n            $uri .= '#' . $fragment;\n        }\n\n        return $uri;\n    }\n\n    /**\n     * Whether the URI has the default port of the current scheme.\n     *\n     * `Psr\\Http\\Message\\UriInterface::getPort` may return null or the standard port. This method can be used\n     * independently of the implementation.\n     *\n     * @param UriInterface $uri\n     *\n     * @return bool\n     */\n    public static function isDefaultPort(UriInterface $uri)\n    {\n        return $uri->getPort() === null\n            || (isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]);\n    }\n\n    /**\n     * Whether the URI is absolute, i.e. it has a scheme.\n     *\n     * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true\n     * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative\n     * to another URI, the base URI. Relative references can be divided into several forms:\n     * - network-path references, e.g. '//example.com/path'\n     * - absolute-path references, e.g. '/path'\n     * - relative-path references, e.g. 'subpath'\n     *\n     * @param UriInterface $uri\n     *\n     * @return bool\n     * @see Uri::isNetworkPathReference\n     * @see Uri::isAbsolutePathReference\n     * @see Uri::isRelativePathReference\n     * @link https://tools.ietf.org/html/rfc3986#section-4\n     */\n    public static function isAbsolute(UriInterface $uri)\n    {\n        return $uri->getScheme() !== '';\n    }\n\n    /**\n     * Whether the URI is a network-path reference.\n     *\n     * A relative reference that begins with two slash characters is termed an network-path reference.\n     *\n     * @param UriInterface $uri\n     *\n     * @return bool\n     * @link https://tools.ietf.org/html/rfc3986#section-4.2\n     */\n    public static function isNetworkPathReference(UriInterface $uri)\n    {\n        return $uri->getScheme() === '' && $uri->getAuthority() !== '';\n    }\n\n    /**\n     * Whether the URI is a absolute-path reference.\n     *\n     * A relative reference that begins with a single slash character is termed an absolute-path reference.\n     *\n     * @param UriInterface $uri\n     *\n     * @return bool\n     * @link https://tools.ietf.org/html/rfc3986#section-4.2\n     */\n    public static function isAbsolutePathReference(UriInterface $uri)\n    {\n        return $uri->getScheme() === ''\n            && $uri->getAuthority() === ''\n            && isset($uri->getPath()[0])\n            && $uri->getPath()[0] === '/';\n    }\n\n    /**\n     * Whether the URI is a relative-path reference.\n     *\n     * A relative reference that does not begin with a slash character is termed a relative-path reference.\n     *\n     * @param UriInterface $uri\n     *\n     * @return bool\n     * @link https://tools.ietf.org/html/rfc3986#section-4.2\n     */\n    public static function isRelativePathReference(UriInterface $uri)\n    {\n        return $uri->getScheme() === ''\n            && $uri->getAuthority() === ''\n            && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/');\n    }\n\n    /**\n     * Whether the URI is a same-document reference.\n     *\n     * A same-document reference refers to a URI that is, aside from its fragment\n     * component, identical to the base URI. When no base URI is given, only an empty\n     * URI reference (apart from its fragment) is considered a same-document reference.\n     *\n     * @param UriInterface      $uri  The URI to check\n     * @param UriInterface|null $base An optional base URI to compare against\n     *\n     * @return bool\n     * @link https://tools.ietf.org/html/rfc3986#section-4.4\n     */\n    public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null)\n    {\n        if ($base !== null) {\n            $uri = UriResolver::resolve($base, $uri);\n\n            return ($uri->getScheme() === $base->getScheme())\n                && ($uri->getAuthority() === $base->getAuthority())\n                && ($uri->getPath() === $base->getPath())\n                && ($uri->getQuery() === $base->getQuery());\n        }\n\n        return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === '';\n    }\n\n    /**\n     * Removes dot segments from a path and returns the new path.\n     *\n     * @param string $path\n     *\n     * @return string\n     *\n     * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead.\n     * @see UriResolver::removeDotSegments\n     */\n    public static function removeDotSegments($path)\n    {\n        return UriResolver::removeDotSegments($path);\n    }\n\n    /**\n     * Converts the relative URI into a new URI that is resolved against the base URI.\n     *\n     * @param UriInterface        $base Base URI\n     * @param string|UriInterface $rel  Relative URI\n     *\n     * @return UriInterface\n     *\n     * @deprecated since version 1.4. Use UriResolver::resolve instead.\n     * @see UriResolver::resolve\n     */\n    public static function resolve(UriInterface $base, $rel)\n    {\n        if (!($rel instanceof UriInterface)) {\n            $rel = new self($rel);\n        }\n\n        return UriResolver::resolve($base, $rel);\n    }\n\n    /**\n     * Creates a new URI with a specific query string value removed.\n     *\n     * Any existing query string values that exactly match the provided key are\n     * removed.\n     *\n     * @param UriInterface $uri URI to use as a base.\n     * @param string       $key Query string key to remove.\n     *\n     * @return UriInterface\n     */\n    public static function withoutQueryValue(UriInterface $uri, $key)\n    {\n        $current = $uri->getQuery();\n        if ($current === '') {\n            return $uri;\n        }\n\n        $decodedKey = rawurldecode($key);\n        $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) {\n            return rawurldecode(explode('=', $part)[0]) !== $decodedKey;\n        });\n\n        return $uri->withQuery(implode('&', $result));\n    }\n\n    /**\n     * Creates a new URI with a specific query string value.\n     *\n     * Any existing query string values that exactly match the provided key are\n     * removed and replaced with the given key value pair.\n     *\n     * A value of null will set the query string key without a value, e.g. \"key\"\n     * instead of \"key=value\".\n     *\n     * @param UriInterface $uri   URI to use as a base.\n     * @param string       $key   Key to set.\n     * @param string|null  $value Value to set\n     *\n     * @return UriInterface\n     */\n    public static function withQueryValue(UriInterface $uri, $key, $value)\n    {\n        $current = $uri->getQuery();\n\n        if ($current === '') {\n            $result = [];\n        } else {\n            $decodedKey = rawurldecode($key);\n            $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) {\n                return rawurldecode(explode('=', $part)[0]) !== $decodedKey;\n            });\n        }\n\n        // Query string separators (\"=\", \"&\") within the key or value need to be encoded\n        // (while preventing double-encoding) before setting the query string. All other\n        // chars that need percent-encoding will be encoded by withQuery().\n        $key = strtr($key, self::$replaceQuery);\n\n        if ($value !== null) {\n            $result[] = $key . '=' . strtr($value, self::$replaceQuery);\n        } else {\n            $result[] = $key;\n        }\n\n        return $uri->withQuery(implode('&', $result));\n    }\n\n    /**\n     * Creates a URI from a hash of `parse_url` components.\n     *\n     * @param array $parts\n     *\n     * @return UriInterface\n     * @link http://php.net/manual/en/function.parse-url.php\n     *\n     * @throws \\InvalidArgumentException If the components do not form a valid URI.\n     */\n    public static function fromParts(array $parts)\n    {\n        $uri = new self();\n        $uri->applyParts($parts);\n        $uri->validateState();\n\n        return $uri;\n    }\n\n    public function getScheme()\n    {\n        return $this->scheme;\n    }\n\n    public function getAuthority()\n    {\n        $authority = $this->host;\n        if ($this->userInfo !== '') {\n            $authority = $this->userInfo . '@' . $authority;\n        }\n\n        if ($this->port !== null) {\n            $authority .= ':' . $this->port;\n        }\n\n        return $authority;\n    }\n\n    public function getUserInfo()\n    {\n        return $this->userInfo;\n    }\n\n    public function getHost()\n    {\n        return $this->host;\n    }\n\n    public function getPort()\n    {\n        return $this->port;\n    }\n\n    public function getPath()\n    {\n        return $this->path;\n    }\n\n    public function getQuery()\n    {\n        return $this->query;\n    }\n\n    public function getFragment()\n    {\n        return $this->fragment;\n    }\n\n    public function withScheme($scheme)\n    {\n        $scheme = $this->filterScheme($scheme);\n\n        if ($this->scheme === $scheme) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->scheme = $scheme;\n        $new->removeDefaultPort();\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withUserInfo($user, $password = null)\n    {\n        $info = $user;\n        if ($password != '') {\n            $info .= ':' . $password;\n        }\n\n        if ($this->userInfo === $info) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->userInfo = $info;\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withHost($host)\n    {\n        $host = $this->filterHost($host);\n\n        if ($this->host === $host) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->host = $host;\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withPort($port)\n    {\n        $port = $this->filterPort($port);\n\n        if ($this->port === $port) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->port = $port;\n        $new->removeDefaultPort();\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withPath($path)\n    {\n        $path = $this->filterPath($path);\n\n        if ($this->path === $path) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->path = $path;\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withQuery($query)\n    {\n        $query = $this->filterQueryAndFragment($query);\n\n        if ($this->query === $query) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->query = $query;\n\n        return $new;\n    }\n\n    public function withFragment($fragment)\n    {\n        $fragment = $this->filterQueryAndFragment($fragment);\n\n        if ($this->fragment === $fragment) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->fragment = $fragment;\n\n        return $new;\n    }\n\n    /**\n     * Apply parse_url parts to a URI.\n     *\n     * @param array $parts Array of parse_url parts to apply.\n     */\n    private function applyParts(array $parts)\n    {\n        $this->scheme = isset($parts['scheme'])\n            ? $this->filterScheme($parts['scheme'])\n            : '';\n        $this->userInfo = isset($parts['user']) ? $parts['user'] : '';\n        $this->host = isset($parts['host'])\n            ? $this->filterHost($parts['host'])\n            : '';\n        $this->port = isset($parts['port'])\n            ? $this->filterPort($parts['port'])\n            : null;\n        $this->path = isset($parts['path'])\n            ? $this->filterPath($parts['path'])\n            : '';\n        $this->query = isset($parts['query'])\n            ? $this->filterQueryAndFragment($parts['query'])\n            : '';\n        $this->fragment = isset($parts['fragment'])\n            ? $this->filterQueryAndFragment($parts['fragment'])\n            : '';\n        if (isset($parts['pass'])) {\n            $this->userInfo .= ':' . $parts['pass'];\n        }\n\n        $this->removeDefaultPort();\n    }\n\n    /**\n     * @param string $scheme\n     *\n     * @return string\n     *\n     * @throws \\InvalidArgumentException If the scheme is invalid.\n     */\n    private function filterScheme($scheme)\n    {\n        if (!is_string($scheme)) {\n            throw new \\InvalidArgumentException('Scheme must be a string');\n        }\n\n        return strtolower($scheme);\n    }\n\n    /**\n     * @param string $host\n     *\n     * @return string\n     *\n     * @throws \\InvalidArgumentException If the host is invalid.\n     */\n    private function filterHost($host)\n    {\n        if (!is_string($host)) {\n            throw new \\InvalidArgumentException('Host must be a string');\n        }\n\n        return strtolower($host);\n    }\n\n    /**\n     * @param int|null $port\n     *\n     * @return int|null\n     *\n     * @throws \\InvalidArgumentException If the port is invalid.\n     */\n    private function filterPort($port)\n    {\n        if ($port === null) {\n            return null;\n        }\n\n        $port = (int) $port;\n        if (1 > $port || 0xffff < $port) {\n            throw new \\InvalidArgumentException(\n                sprintf('Invalid port: %d. Must be between 1 and 65535', $port)\n            );\n        }\n\n        return $port;\n    }\n\n    private function removeDefaultPort()\n    {\n        if ($this->port !== null && self::isDefaultPort($this)) {\n            $this->port = null;\n        }\n    }\n\n    /**\n     * Filters the path of a URI\n     *\n     * @param string $path\n     *\n     * @return string\n     *\n     * @throws \\InvalidArgumentException If the path is invalid.\n     */\n    private function filterPath($path)\n    {\n        if (!is_string($path)) {\n            throw new \\InvalidArgumentException('Path must be a string');\n        }\n\n        return preg_replace_callback(\n            '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\\/]++|%(?![A-Fa-f0-9]{2}))/',\n            [$this, 'rawurlencodeMatchZero'],\n            $path\n        );\n    }\n\n    /**\n     * Filters the query string or fragment of a URI.\n     *\n     * @param string $str\n     *\n     * @return string\n     *\n     * @throws \\InvalidArgumentException If the query or fragment is invalid.\n     */\n    private function filterQueryAndFragment($str)\n    {\n        if (!is_string($str)) {\n            throw new \\InvalidArgumentException('Query and fragment must be a string');\n        }\n\n        return preg_replace_callback(\n            '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\\/\\?]++|%(?![A-Fa-f0-9]{2}))/',\n            [$this, 'rawurlencodeMatchZero'],\n            $str\n        );\n    }\n\n    private function rawurlencodeMatchZero(array $match)\n    {\n        return rawurlencode($match[0]);\n    }\n\n    private function validateState()\n    {\n        if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) {\n            $this->host = self::HTTP_DEFAULT_HOST;\n        }\n\n        if ($this->getAuthority() === '') {\n            if (0 === strpos($this->path, '//')) {\n                throw new \\InvalidArgumentException('The path of a URI without an authority must not start with two slashes \"//\"');\n            }\n            if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) {\n                throw new \\InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon');\n            }\n        } elseif (isset($this->path[0]) && $this->path[0] !== '/') {\n            @trigger_error(\n                'The path of a URI with an authority must start with a slash \"/\" or be empty. Automagically fixing the URI ' .\n                'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.',\n                E_USER_DEPRECATED\n            );\n            $this->path = '/'. $this->path;\n            //throw new \\InvalidArgumentException('The path of a URI with an authority must start with a slash \"/\" or be empty');\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/UriNormalizer.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Provides methods to normalize and compare URIs.\n *\n * @author Tobias Schultze\n *\n * @link https://tools.ietf.org/html/rfc3986#section-6\n */\nfinal class UriNormalizer\n{\n    /**\n     * Default normalizations which only include the ones that preserve semantics.\n     *\n     * self::CAPITALIZE_PERCENT_ENCODING | self::DECODE_UNRESERVED_CHARACTERS | self::CONVERT_EMPTY_PATH |\n     * self::REMOVE_DEFAULT_HOST | self::REMOVE_DEFAULT_PORT | self::REMOVE_DOT_SEGMENTS\n     */\n    const PRESERVING_NORMALIZATIONS = 63;\n\n    /**\n     * All letters within a percent-encoding triplet (e.g., \"%3A\") are case-insensitive, and should be capitalized.\n     *\n     * Example: http://example.org/a%c2%b1b → http://example.org/a%C2%B1b\n     */\n    const CAPITALIZE_PERCENT_ENCODING = 1;\n\n    /**\n     * Decodes percent-encoded octets of unreserved characters.\n     *\n     * For consistency, percent-encoded octets in the ranges of ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39),\n     * hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should not be created by URI producers and,\n     * when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers.\n     *\n     * Example: http://example.org/%7Eusern%61me/ → http://example.org/~username/\n     */\n    const DECODE_UNRESERVED_CHARACTERS = 2;\n\n    /**\n     * Converts the empty path to \"/\" for http and https URIs.\n     *\n     * Example: http://example.org → http://example.org/\n     */\n    const CONVERT_EMPTY_PATH = 4;\n\n    /**\n     * Removes the default host of the given URI scheme from the URI.\n     *\n     * Only the \"file\" scheme defines the default host \"localhost\".\n     * All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile`\n     * are equivalent according to RFC 3986. The first format is not accepted\n     * by PHPs stream functions and thus already normalized implicitly to the\n     * second format in the Uri class. See `GuzzleHttp\\Psr7\\Uri::composeComponents`.\n     *\n     * Example: file://localhost/myfile → file:///myfile\n     */\n    const REMOVE_DEFAULT_HOST = 8;\n\n    /**\n     * Removes the default port of the given URI scheme from the URI.\n     *\n     * Example: http://example.org:80/ → http://example.org/\n     */\n    const REMOVE_DEFAULT_PORT = 16;\n\n    /**\n     * Removes unnecessary dot-segments.\n     *\n     * Dot-segments in relative-path references are not removed as it would\n     * change the semantics of the URI reference.\n     *\n     * Example: http://example.org/../a/b/../c/./d.html → http://example.org/a/c/d.html\n     */\n    const REMOVE_DOT_SEGMENTS = 32;\n\n    /**\n     * Paths which include two or more adjacent slashes are converted to one.\n     *\n     * Webservers usually ignore duplicate slashes and treat those URIs equivalent.\n     * But in theory those URIs do not need to be equivalent. So this normalization\n     * may change the semantics. Encoded slashes (%2F) are not removed.\n     *\n     * Example: http://example.org//foo///bar.html → http://example.org/foo/bar.html\n     */\n    const REMOVE_DUPLICATE_SLASHES = 64;\n\n    /**\n     * Sort query parameters with their values in alphabetical order.\n     *\n     * However, the order of parameters in a URI may be significant (this is not defined by the standard).\n     * So this normalization is not safe and may change the semantics of the URI.\n     *\n     * Example: ?lang=en&article=fred → ?article=fred&lang=en\n     *\n     * Note: The sorting is neither locale nor Unicode aware (the URI query does not get decoded at all) as the\n     * purpose is to be able to compare URIs in a reproducible way, not to have the params sorted perfectly.\n     */\n    const SORT_QUERY_PARAMETERS = 128;\n\n    /**\n     * Returns a normalized URI.\n     *\n     * The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.\n     * This methods adds additional normalizations that can be configured with the $flags parameter.\n     *\n     * PSR-7 UriInterface cannot distinguish between an empty component and a missing component as\n     * getQuery(), getFragment() etc. always return a string. This means the URIs \"/?#\" and \"/\" are\n     * treated equivalent which is not necessarily true according to RFC 3986. But that difference\n     * is highly uncommon in reality. So this potential normalization is implied in PSR-7 as well.\n     *\n     * @param UriInterface $uri   The URI to normalize\n     * @param int          $flags A bitmask of normalizations to apply, see constants\n     *\n     * @return UriInterface The normalized URI\n     * @link https://tools.ietf.org/html/rfc3986#section-6.2\n     */\n    public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS)\n    {\n        if ($flags & self::CAPITALIZE_PERCENT_ENCODING) {\n            $uri = self::capitalizePercentEncoding($uri);\n        }\n\n        if ($flags & self::DECODE_UNRESERVED_CHARACTERS) {\n            $uri = self::decodeUnreservedCharacters($uri);\n        }\n\n        if ($flags & self::CONVERT_EMPTY_PATH && $uri->getPath() === '' &&\n            ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')\n        ) {\n            $uri = $uri->withPath('/');\n        }\n\n        if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') {\n            $uri = $uri->withHost('');\n        }\n\n        if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) {\n            $uri = $uri->withPort(null);\n        }\n\n        if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) {\n            $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath()));\n        }\n\n        if ($flags & self::REMOVE_DUPLICATE_SLASHES) {\n            $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath()));\n        }\n\n        if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') {\n            $queryKeyValues = explode('&', $uri->getQuery());\n            sort($queryKeyValues);\n            $uri = $uri->withQuery(implode('&', $queryKeyValues));\n        }\n\n        return $uri;\n    }\n\n    /**\n     * Whether two URIs can be considered equivalent.\n     *\n     * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also\n     * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be\n     * resolved against the same base URI. If this is not the case, determination of equivalence or difference of\n     * relative references does not mean anything.\n     *\n     * @param UriInterface $uri1           An URI to compare\n     * @param UriInterface $uri2           An URI to compare\n     * @param int          $normalizations A bitmask of normalizations to apply, see constants\n     *\n     * @return bool\n     * @link https://tools.ietf.org/html/rfc3986#section-6.1\n     */\n    public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS)\n    {\n        return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations);\n    }\n\n    private static function capitalizePercentEncoding(UriInterface $uri)\n    {\n        $regex = '/(?:%[A-Fa-f0-9]{2})++/';\n\n        $callback = function (array $match) {\n            return strtoupper($match[0]);\n        };\n\n        return\n            $uri->withPath(\n                preg_replace_callback($regex, $callback, $uri->getPath())\n            )->withQuery(\n                preg_replace_callback($regex, $callback, $uri->getQuery())\n            );\n    }\n\n    private static function decodeUnreservedCharacters(UriInterface $uri)\n    {\n        $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i';\n\n        $callback = function (array $match) {\n            return rawurldecode($match[0]);\n        };\n\n        return\n            $uri->withPath(\n                preg_replace_callback($regex, $callback, $uri->getPath())\n            )->withQuery(\n                preg_replace_callback($regex, $callback, $uri->getQuery())\n            );\n    }\n\n    private function __construct()\n    {\n        // cannot be instantiated\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/UriResolver.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Resolves a URI reference in the context of a base URI and the opposite way.\n *\n * @author Tobias Schultze\n *\n * @link https://tools.ietf.org/html/rfc3986#section-5\n */\nfinal class UriResolver\n{\n    /**\n     * Removes dot segments from a path and returns the new path.\n     *\n     * @param string $path\n     *\n     * @return string\n     * @link http://tools.ietf.org/html/rfc3986#section-5.2.4\n     */\n    public static function removeDotSegments($path)\n    {\n        if ($path === '' || $path === '/') {\n            return $path;\n        }\n\n        $results = [];\n        $segments = explode('/', $path);\n        foreach ($segments as $segment) {\n            if ($segment === '..') {\n                array_pop($results);\n            } elseif ($segment !== '.') {\n                $results[] = $segment;\n            }\n        }\n\n        $newPath = implode('/', $results);\n\n        if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) {\n            // Re-add the leading slash if necessary for cases like \"/..\"\n            $newPath = '/' . $newPath;\n        } elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) {\n            // Add the trailing slash if necessary\n            // If newPath is not empty, then $segment must be set and is the last segment from the foreach\n            $newPath .= '/';\n        }\n\n        return $newPath;\n    }\n\n    /**\n     * Converts the relative URI into a new URI that is resolved against the base URI.\n     *\n     * @param UriInterface $base Base URI\n     * @param UriInterface $rel  Relative URI\n     *\n     * @return UriInterface\n     * @link http://tools.ietf.org/html/rfc3986#section-5.2\n     */\n    public static function resolve(UriInterface $base, UriInterface $rel)\n    {\n        if ((string) $rel === '') {\n            // we can simply return the same base URI instance for this same-document reference\n            return $base;\n        }\n\n        if ($rel->getScheme() != '') {\n            return $rel->withPath(self::removeDotSegments($rel->getPath()));\n        }\n\n        if ($rel->getAuthority() != '') {\n            $targetAuthority = $rel->getAuthority();\n            $targetPath = self::removeDotSegments($rel->getPath());\n            $targetQuery = $rel->getQuery();\n        } else {\n            $targetAuthority = $base->getAuthority();\n            if ($rel->getPath() === '') {\n                $targetPath = $base->getPath();\n                $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery();\n            } else {\n                if ($rel->getPath()[0] === '/') {\n                    $targetPath = $rel->getPath();\n                } else {\n                    if ($targetAuthority != '' && $base->getPath() === '') {\n                        $targetPath = '/' . $rel->getPath();\n                    } else {\n                        $lastSlashPos = strrpos($base->getPath(), '/');\n                        if ($lastSlashPos === false) {\n                            $targetPath = $rel->getPath();\n                        } else {\n                            $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath();\n                        }\n                    }\n                }\n                $targetPath = self::removeDotSegments($targetPath);\n                $targetQuery = $rel->getQuery();\n            }\n        }\n\n        return new Uri(Uri::composeComponents(\n            $base->getScheme(),\n            $targetAuthority,\n            $targetPath,\n            $targetQuery,\n            $rel->getFragment()\n        ));\n    }\n\n    /**\n     * Returns the target URI as a relative reference from the base URI.\n     *\n     * This method is the counterpart to resolve():\n     *\n     *    (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))\n     *\n     * One use-case is to use the current request URI as base URI and then generate relative links in your documents\n     * to reduce the document size or offer self-contained downloadable document archives.\n     *\n     *    $base = new Uri('http://example.com/a/b/');\n     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c'));  // prints 'c'.\n     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y'));  // prints '../x/y'.\n     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.\n     *    echo UriResolver::relativize($base, new Uri('http://example.org/a/b/'));   // prints '//example.org/a/b/'.\n     *\n     * This method also accepts a target that is already relative and will try to relativize it further. Only a\n     * relative-path reference will be returned as-is.\n     *\n     *    echo UriResolver::relativize($base, new Uri('/a/b/c'));  // prints 'c' as well\n     *\n     * @param UriInterface $base   Base URI\n     * @param UriInterface $target Target URI\n     *\n     * @return UriInterface The relative URI reference\n     */\n    public static function relativize(UriInterface $base, UriInterface $target)\n    {\n        if ($target->getScheme() !== '' &&\n            ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')\n        ) {\n            return $target;\n        }\n\n        if (Uri::isRelativePathReference($target)) {\n            // As the target is already highly relative we return it as-is. It would be possible to resolve\n            // the target with `$target = self::resolve($base, $target);` and then try make it more relative\n            // by removing a duplicate query. But let's not do that automatically.\n            return $target;\n        }\n\n        if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) {\n            return $target->withScheme('');\n        }\n\n        // We must remove the path before removing the authority because if the path starts with two slashes, the URI\n        // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also\n        // invalid.\n        $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost('');\n\n        if ($base->getPath() !== $target->getPath()) {\n            return $emptyPathUri->withPath(self::getRelativePath($base, $target));\n        }\n\n        if ($base->getQuery() === $target->getQuery()) {\n            // Only the target fragment is left. And it must be returned even if base and target fragment are the same.\n            return $emptyPathUri->withQuery('');\n        }\n\n        // If the base URI has a query but the target has none, we cannot return an empty path reference as it would\n        // inherit the base query component when resolving.\n        if ($target->getQuery() === '') {\n            $segments = explode('/', $target->getPath());\n            $lastSegment = end($segments);\n\n            return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment);\n        }\n\n        return $emptyPathUri;\n    }\n\n    private static function getRelativePath(UriInterface $base, UriInterface $target)\n    {\n        $sourceSegments = explode('/', $base->getPath());\n        $targetSegments = explode('/', $target->getPath());\n        array_pop($sourceSegments);\n        $targetLastSegment = array_pop($targetSegments);\n        foreach ($sourceSegments as $i => $segment) {\n            if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) {\n                unset($sourceSegments[$i], $targetSegments[$i]);\n            } else {\n                break;\n            }\n        }\n        $targetSegments[] = $targetLastSegment;\n        $relativePath = str_repeat('../', count($sourceSegments)) . implode('/', $targetSegments);\n\n        // A reference to am empty last segment or an empty first sub-segment must be prefixed with \"./\".\n        // This also applies to a segment with a colon character (e.g., \"file:colon\") that cannot be used\n        // as the first segment of a relative-path reference, as it would be mistaken for a scheme name.\n        if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) {\n            $relativePath = \"./$relativePath\";\n        } elseif ('/' === $relativePath[0]) {\n            if ($base->getAuthority() != '' && $base->getPath() === '') {\n                // In this case an extra slash is added by resolve() automatically. So we must not add one here.\n                $relativePath = \".$relativePath\";\n            } else {\n                $relativePath = \"./$relativePath\";\n            }\n        }\n\n        return $relativePath;\n    }\n\n    private function __construct()\n    {\n        // cannot be instantiated\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/functions.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Returns the string representation of an HTTP message.\n *\n * @param MessageInterface $message Message to convert to a string.\n *\n * @return string\n */\nfunction str(MessageInterface $message)\n{\n    if ($message instanceof RequestInterface) {\n        $msg = trim($message->getMethod() . ' '\n                . $message->getRequestTarget())\n            . ' HTTP/' . $message->getProtocolVersion();\n        if (!$message->hasHeader('host')) {\n            $msg .= \"\\r\\nHost: \" . $message->getUri()->getHost();\n        }\n    } elseif ($message instanceof ResponseInterface) {\n        $msg = 'HTTP/' . $message->getProtocolVersion() . ' '\n            . $message->getStatusCode() . ' '\n            . $message->getReasonPhrase();\n    } else {\n        throw new \\InvalidArgumentException('Unknown message type');\n    }\n\n    foreach ($message->getHeaders() as $name => $values) {\n        $msg .= \"\\r\\n{$name}: \" . implode(', ', $values);\n    }\n\n    return \"{$msg}\\r\\n\\r\\n\" . $message->getBody();\n}\n\n/**\n * Returns a UriInterface for the given value.\n *\n * This function accepts a string or {@see Psr\\Http\\Message\\UriInterface} and\n * returns a UriInterface for the given value. If the value is already a\n * `UriInterface`, it is returned as-is.\n *\n * @param string|UriInterface $uri\n *\n * @return UriInterface\n * @throws \\InvalidArgumentException\n */\nfunction uri_for($uri)\n{\n    if ($uri instanceof UriInterface) {\n        return $uri;\n    } elseif (is_string($uri)) {\n        return new Uri($uri);\n    }\n\n    throw new \\InvalidArgumentException('URI must be a string or UriInterface');\n}\n\n/**\n * Create a new stream based on the input type.\n *\n * Options is an associative array that can contain the following keys:\n * - metadata: Array of custom metadata.\n * - size: Size of the stream.\n *\n * @param resource|string|null|int|float|bool|StreamInterface|callable $resource Entity body data\n * @param array                                                        $options  Additional options\n *\n * @return Stream\n * @throws \\InvalidArgumentException if the $resource arg is not valid.\n */\nfunction stream_for($resource = '', array $options = [])\n{\n    if (is_scalar($resource)) {\n        $stream = fopen('php://temp', 'r+');\n        if ($resource !== '') {\n            fwrite($stream, $resource);\n            fseek($stream, 0);\n        }\n        return new Stream($stream, $options);\n    }\n\n    switch (gettype($resource)) {\n        case 'resource':\n            return new Stream($resource, $options);\n        case 'object':\n            if ($resource instanceof StreamInterface) {\n                return $resource;\n            } elseif ($resource instanceof \\Iterator) {\n                return new PumpStream(function () use ($resource) {\n                    if (!$resource->valid()) {\n                        return false;\n                    }\n                    $result = $resource->current();\n                    $resource->next();\n                    return $result;\n                }, $options);\n            } elseif (method_exists($resource, '__toString')) {\n                return stream_for((string) $resource, $options);\n            }\n            break;\n        case 'NULL':\n            return new Stream(fopen('php://temp', 'r+'), $options);\n    }\n\n    if (is_callable($resource)) {\n        return new PumpStream($resource, $options);\n    }\n\n    throw new \\InvalidArgumentException('Invalid resource type: ' . gettype($resource));\n}\n\n/**\n * Parse an array of header values containing \";\" separated data into an\n * array of associative arrays representing the header key value pair\n * data of the header. When a parameter does not contain a value, but just\n * contains a key, this function will inject a key with a '' string value.\n *\n * @param string|array $header Header to parse into components.\n *\n * @return array Returns the parsed header values.\n */\nfunction parse_header($header)\n{\n    static $trimmed = \"\\\"'  \\n\\t\\r\";\n    $params = $matches = [];\n\n    foreach (normalize_header($header) as $val) {\n        $part = [];\n        foreach (preg_split('/;(?=([^\"]*\"[^\"]*\")*[^\"]*$)/', $val) as $kvp) {\n            if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {\n                $m = $matches[0];\n                if (isset($m[1])) {\n                    $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed);\n                } else {\n                    $part[] = trim($m[0], $trimmed);\n                }\n            }\n        }\n        if ($part) {\n            $params[] = $part;\n        }\n    }\n\n    return $params;\n}\n\n/**\n * Converts an array of header values that may contain comma separated\n * headers into an array of headers with no comma separated values.\n *\n * @param string|array $header Header to normalize.\n *\n * @return array Returns the normalized header field values.\n */\nfunction normalize_header($header)\n{\n    if (!is_array($header)) {\n        return array_map('trim', explode(',', $header));\n    }\n\n    $result = [];\n    foreach ($header as $value) {\n        foreach ((array) $value as $v) {\n            if (strpos($v, ',') === false) {\n                $result[] = $v;\n                continue;\n            }\n            foreach (preg_split('/,(?=([^\"]*\"[^\"]*\")*[^\"]*$)/', $v) as $vv) {\n                $result[] = trim($vv);\n            }\n        }\n    }\n\n    return $result;\n}\n\n/**\n * Clone and modify a request with the given changes.\n *\n * The changes can be one of:\n * - method: (string) Changes the HTTP method.\n * - set_headers: (array) Sets the given headers.\n * - remove_headers: (array) Remove the given headers.\n * - body: (mixed) Sets the given body.\n * - uri: (UriInterface) Set the URI.\n * - query: (string) Set the query string value of the URI.\n * - version: (string) Set the protocol version.\n *\n * @param RequestInterface $request Request to clone and modify.\n * @param array            $changes Changes to apply.\n *\n * @return RequestInterface\n */\nfunction modify_request(RequestInterface $request, array $changes)\n{\n    if (!$changes) {\n        return $request;\n    }\n\n    $headers = $request->getHeaders();\n\n    if (!isset($changes['uri'])) {\n        $uri = $request->getUri();\n    } else {\n        // Remove the host header if one is on the URI\n        if ($host = $changes['uri']->getHost()) {\n            $changes['set_headers']['Host'] = $host;\n\n            if ($port = $changes['uri']->getPort()) {\n                $standardPorts = ['http' => 80, 'https' => 443];\n                $scheme = $changes['uri']->getScheme();\n                if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) {\n                    $changes['set_headers']['Host'] .= ':'.$port;\n                }\n            }\n        }\n        $uri = $changes['uri'];\n    }\n\n    if (!empty($changes['remove_headers'])) {\n        $headers = _caseless_remove($changes['remove_headers'], $headers);\n    }\n\n    if (!empty($changes['set_headers'])) {\n        $headers = _caseless_remove(array_keys($changes['set_headers']), $headers);\n        $headers = $changes['set_headers'] + $headers;\n    }\n\n    if (isset($changes['query'])) {\n        $uri = $uri->withQuery($changes['query']);\n    }\n\n    if ($request instanceof ServerRequestInterface) {\n        return new ServerRequest(\n            isset($changes['method']) ? $changes['method'] : $request->getMethod(),\n            $uri,\n            $headers,\n            isset($changes['body']) ? $changes['body'] : $request->getBody(),\n            isset($changes['version'])\n                ? $changes['version']\n                : $request->getProtocolVersion(),\n            $request->getServerParams()\n        );\n    }\n\n    return new Request(\n        isset($changes['method']) ? $changes['method'] : $request->getMethod(),\n        $uri,\n        $headers,\n        isset($changes['body']) ? $changes['body'] : $request->getBody(),\n        isset($changes['version'])\n            ? $changes['version']\n            : $request->getProtocolVersion()\n    );\n}\n\n/**\n * Attempts to rewind a message body and throws an exception on failure.\n *\n * The body of the message will only be rewound if a call to `tell()` returns a\n * value other than `0`.\n *\n * @param MessageInterface $message Message to rewind\n *\n * @throws \\RuntimeException\n */\nfunction rewind_body(MessageInterface $message)\n{\n    $body = $message->getBody();\n\n    if ($body->tell()) {\n        $body->rewind();\n    }\n}\n\n/**\n * Safely opens a PHP stream resource using a filename.\n *\n * When fopen fails, PHP normally raises a warning. This function adds an\n * error handler that checks for errors and throws an exception instead.\n *\n * @param string $filename File to open\n * @param string $mode     Mode used to open the file\n *\n * @return resource\n * @throws \\RuntimeException if the file cannot be opened\n */\nfunction try_fopen($filename, $mode)\n{\n    $ex = null;\n    set_error_handler(function () use ($filename, $mode, &$ex) {\n        $ex = new \\RuntimeException(sprintf(\n            'Unable to open %s using mode %s: %s',\n            $filename,\n            $mode,\n            func_get_args()[1]\n        ));\n    });\n\n    $handle = fopen($filename, $mode);\n    restore_error_handler();\n\n    if ($ex) {\n        /** @var $ex \\RuntimeException */\n        throw $ex;\n    }\n\n    return $handle;\n}\n\n/**\n * Copy the contents of a stream into a string until the given number of\n * bytes have been read.\n *\n * @param StreamInterface $stream Stream to read\n * @param int             $maxLen Maximum number of bytes to read. Pass -1\n *                                to read the entire stream.\n * @return string\n * @throws \\RuntimeException on error.\n */\nfunction copy_to_string(StreamInterface $stream, $maxLen = -1)\n{\n    $buffer = '';\n\n    if ($maxLen === -1) {\n        while (!$stream->eof()) {\n            $buf = $stream->read(1048576);\n            // Using a loose equality here to match on '' and false.\n            if ($buf == null) {\n                break;\n            }\n            $buffer .= $buf;\n        }\n        return $buffer;\n    }\n\n    $len = 0;\n    while (!$stream->eof() && $len < $maxLen) {\n        $buf = $stream->read($maxLen - $len);\n        // Using a loose equality here to match on '' and false.\n        if ($buf == null) {\n            break;\n        }\n        $buffer .= $buf;\n        $len = strlen($buffer);\n    }\n\n    return $buffer;\n}\n\n/**\n * Copy the contents of a stream into another stream until the given number\n * of bytes have been read.\n *\n * @param StreamInterface $source Stream to read from\n * @param StreamInterface $dest   Stream to write to\n * @param int             $maxLen Maximum number of bytes to read. Pass -1\n *                                to read the entire stream.\n *\n * @throws \\RuntimeException on error.\n */\nfunction copy_to_stream(\n    StreamInterface $source,\n    StreamInterface $dest,\n    $maxLen = -1\n) {\n    $bufferSize = 8192;\n\n    if ($maxLen === -1) {\n        while (!$source->eof()) {\n            if (!$dest->write($source->read($bufferSize))) {\n                break;\n            }\n        }\n    } else {\n        $remaining = $maxLen;\n        while ($remaining > 0 && !$source->eof()) {\n            $buf = $source->read(min($bufferSize, $remaining));\n            $len = strlen($buf);\n            if (!$len) {\n                break;\n            }\n            $remaining -= $len;\n            $dest->write($buf);\n        }\n    }\n}\n\n/**\n * Calculate a hash of a Stream\n *\n * @param StreamInterface $stream    Stream to calculate the hash for\n * @param string          $algo      Hash algorithm (e.g. md5, crc32, etc)\n * @param bool            $rawOutput Whether or not to use raw output\n *\n * @return string Returns the hash of the stream\n * @throws \\RuntimeException on error.\n */\nfunction hash(\n    StreamInterface $stream,\n    $algo,\n    $rawOutput = false\n) {\n    $pos = $stream->tell();\n\n    if ($pos > 0) {\n        $stream->rewind();\n    }\n\n    $ctx = hash_init($algo);\n    while (!$stream->eof()) {\n        hash_update($ctx, $stream->read(1048576));\n    }\n\n    $out = hash_final($ctx, (bool) $rawOutput);\n    $stream->seek($pos);\n\n    return $out;\n}\n\n/**\n * Read a line from the stream up to the maximum allowed buffer length\n *\n * @param StreamInterface $stream    Stream to read from\n * @param int             $maxLength Maximum buffer length\n *\n * @return string|bool\n */\nfunction readline(StreamInterface $stream, $maxLength = null)\n{\n    $buffer = '';\n    $size = 0;\n\n    while (!$stream->eof()) {\n        // Using a loose equality here to match on '' and false.\n        if (null == ($byte = $stream->read(1))) {\n            return $buffer;\n        }\n        $buffer .= $byte;\n        // Break when a new line is found or the max length - 1 is reached\n        if ($byte === \"\\n\" || ++$size === $maxLength - 1) {\n            break;\n        }\n    }\n\n    return $buffer;\n}\n\n/**\n * Parses a request message string into a request object.\n *\n * @param string $message Request message string.\n *\n * @return Request\n */\nfunction parse_request($message)\n{\n    $data = _parse_message($message);\n    $matches = [];\n    if (!preg_match('/^[\\S]+\\s+([a-zA-Z]+:\\/\\/|\\/).*/', $data['start-line'], $matches)) {\n        throw new \\InvalidArgumentException('Invalid request string');\n    }\n    $parts = explode(' ', $data['start-line'], 3);\n    $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1';\n\n    $request = new Request(\n        $parts[0],\n        $matches[1] === '/' ? _parse_request_uri($parts[1], $data['headers']) : $parts[1],\n        $data['headers'],\n        $data['body'],\n        $version\n    );\n\n    return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]);\n}\n\n/**\n * Parses a response message string into a response object.\n *\n * @param string $message Response message string.\n *\n * @return Response\n */\nfunction parse_response($message)\n{\n    $data = _parse_message($message);\n    // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space\n    // between status-code and reason-phrase is required. But browsers accept\n    // responses without space and reason as well.\n    if (!preg_match('/^HTTP\\/.* [0-9]{3}( .*|$)/', $data['start-line'])) {\n        throw new \\InvalidArgumentException('Invalid response string');\n    }\n    $parts = explode(' ', $data['start-line'], 3);\n\n    return new Response(\n        $parts[1],\n        $data['headers'],\n        $data['body'],\n        explode('/', $parts[0])[1],\n        isset($parts[2]) ? $parts[2] : null\n    );\n}\n\n/**\n * Parse a query string into an associative array.\n *\n * If multiple values are found for the same key, the value of that key\n * value pair will become an array. This function does not parse nested\n * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will\n * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']).\n *\n * @param string      $str         Query string to parse\n * @param bool|string $urlEncoding How the query string is encoded\n *\n * @return array\n */\nfunction parse_query($str, $urlEncoding = true)\n{\n    $result = [];\n\n    if ($str === '') {\n        return $result;\n    }\n\n    if ($urlEncoding === true) {\n        $decoder = function ($value) {\n            return rawurldecode(str_replace('+', ' ', $value));\n        };\n    } elseif ($urlEncoding == PHP_QUERY_RFC3986) {\n        $decoder = 'rawurldecode';\n    } elseif ($urlEncoding == PHP_QUERY_RFC1738) {\n        $decoder = 'urldecode';\n    } else {\n        $decoder = function ($str) { return $str; };\n    }\n\n    foreach (explode('&', $str) as $kvp) {\n        $parts = explode('=', $kvp, 2);\n        $key = $decoder($parts[0]);\n        $value = isset($parts[1]) ? $decoder($parts[1]) : null;\n        if (!isset($result[$key])) {\n            $result[$key] = $value;\n        } else {\n            if (!is_array($result[$key])) {\n                $result[$key] = [$result[$key]];\n            }\n            $result[$key][] = $value;\n        }\n    }\n\n    return $result;\n}\n\n/**\n * Build a query string from an array of key value pairs.\n *\n * This function can use the return value of parse_query() to build a query\n * string. This function does not modify the provided keys when an array is\n * encountered (like http_build_query would).\n *\n * @param array     $params   Query string parameters.\n * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986\n *                            to encode using RFC3986, or PHP_QUERY_RFC1738\n *                            to encode using RFC1738.\n * @return string\n */\nfunction build_query(array $params, $encoding = PHP_QUERY_RFC3986)\n{\n    if (!$params) {\n        return '';\n    }\n\n    if ($encoding === false) {\n        $encoder = function ($str) { return $str; };\n    } elseif ($encoding === PHP_QUERY_RFC3986) {\n        $encoder = 'rawurlencode';\n    } elseif ($encoding === PHP_QUERY_RFC1738) {\n        $encoder = 'urlencode';\n    } else {\n        throw new \\InvalidArgumentException('Invalid type');\n    }\n\n    $qs = '';\n    foreach ($params as $k => $v) {\n        $k = $encoder($k);\n        if (!is_array($v)) {\n            $qs .= $k;\n            if ($v !== null) {\n                $qs .= '=' . $encoder($v);\n            }\n            $qs .= '&';\n        } else {\n            foreach ($v as $vv) {\n                $qs .= $k;\n                if ($vv !== null) {\n                    $qs .= '=' . $encoder($vv);\n                }\n                $qs .= '&';\n            }\n        }\n    }\n\n    return $qs ? (string) substr($qs, 0, -1) : '';\n}\n\n/**\n * Determines the mimetype of a file by looking at its extension.\n *\n * @param $filename\n *\n * @return null|string\n */\nfunction mimetype_from_filename($filename)\n{\n    return mimetype_from_extension(pathinfo($filename, PATHINFO_EXTENSION));\n}\n\n/**\n * Maps a file extensions to a mimetype.\n *\n * @param $extension string The file extension.\n *\n * @return string|null\n * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types\n */\nfunction mimetype_from_extension($extension)\n{\n    static $mimetypes = [\n        '7z' => 'application/x-7z-compressed',\n        'aac' => 'audio/x-aac',\n        'ai' => 'application/postscript',\n        'aif' => 'audio/x-aiff',\n        'asc' => 'text/plain',\n        'asf' => 'video/x-ms-asf',\n        'atom' => 'application/atom+xml',\n        'avi' => 'video/x-msvideo',\n        'bmp' => 'image/bmp',\n        'bz2' => 'application/x-bzip2',\n        'cer' => 'application/pkix-cert',\n        'crl' => 'application/pkix-crl',\n        'crt' => 'application/x-x509-ca-cert',\n        'css' => 'text/css',\n        'csv' => 'text/csv',\n        'cu' => 'application/cu-seeme',\n        'deb' => 'application/x-debian-package',\n        'doc' => 'application/msword',\n        'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n        'dvi' => 'application/x-dvi',\n        'eot' => 'application/vnd.ms-fontobject',\n        'eps' => 'application/postscript',\n        'epub' => 'application/epub+zip',\n        'etx' => 'text/x-setext',\n        'flac' => 'audio/flac',\n        'flv' => 'video/x-flv',\n        'gif' => 'image/gif',\n        'gz' => 'application/gzip',\n        'htm' => 'text/html',\n        'html' => 'text/html',\n        'ico' => 'image/x-icon',\n        'ics' => 'text/calendar',\n        'ini' => 'text/plain',\n        'iso' => 'application/x-iso9660-image',\n        'jar' => 'application/java-archive',\n        'jpe' => 'image/jpeg',\n        'jpeg' => 'image/jpeg',\n        'jpg' => 'image/jpeg',\n        'js' => 'text/javascript',\n        'json' => 'application/json',\n        'latex' => 'application/x-latex',\n        'log' => 'text/plain',\n        'm4a' => 'audio/mp4',\n        'm4v' => 'video/mp4',\n        'mid' => 'audio/midi',\n        'midi' => 'audio/midi',\n        'mov' => 'video/quicktime',\n        'mp3' => 'audio/mpeg',\n        'mp4' => 'video/mp4',\n        'mp4a' => 'audio/mp4',\n        'mp4v' => 'video/mp4',\n        'mpe' => 'video/mpeg',\n        'mpeg' => 'video/mpeg',\n        'mpg' => 'video/mpeg',\n        'mpg4' => 'video/mp4',\n        'oga' => 'audio/ogg',\n        'ogg' => 'audio/ogg',\n        'ogv' => 'video/ogg',\n        'ogx' => 'application/ogg',\n        'pbm' => 'image/x-portable-bitmap',\n        'pdf' => 'application/pdf',\n        'pgm' => 'image/x-portable-graymap',\n        'png' => 'image/png',\n        'pnm' => 'image/x-portable-anymap',\n        'ppm' => 'image/x-portable-pixmap',\n        'ppt' => 'application/vnd.ms-powerpoint',\n        'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n        'ps' => 'application/postscript',\n        'qt' => 'video/quicktime',\n        'rar' => 'application/x-rar-compressed',\n        'ras' => 'image/x-cmu-raster',\n        'rss' => 'application/rss+xml',\n        'rtf' => 'application/rtf',\n        'sgm' => 'text/sgml',\n        'sgml' => 'text/sgml',\n        'svg' => 'image/svg+xml',\n        'swf' => 'application/x-shockwave-flash',\n        'tar' => 'application/x-tar',\n        'tif' => 'image/tiff',\n        'tiff' => 'image/tiff',\n        'torrent' => 'application/x-bittorrent',\n        'ttf' => 'application/x-font-ttf',\n        'txt' => 'text/plain',\n        'wav' => 'audio/x-wav',\n        'webm' => 'video/webm',\n        'wma' => 'audio/x-ms-wma',\n        'wmv' => 'video/x-ms-wmv',\n        'woff' => 'application/x-font-woff',\n        'wsdl' => 'application/wsdl+xml',\n        'xbm' => 'image/x-xbitmap',\n        'xls' => 'application/vnd.ms-excel',\n        'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n        'xml' => 'application/xml',\n        'xpm' => 'image/x-xpixmap',\n        'xwd' => 'image/x-xwindowdump',\n        'yaml' => 'text/yaml',\n        'yml' => 'text/yaml',\n        'zip' => 'application/zip',\n    ];\n\n    $extension = strtolower($extension);\n\n    return isset($mimetypes[$extension])\n        ? $mimetypes[$extension]\n        : null;\n}\n\n/**\n * Parses an HTTP message into an associative array.\n *\n * The array contains the \"start-line\" key containing the start line of\n * the message, \"headers\" key containing an associative array of header\n * array values, and a \"body\" key containing the body of the message.\n *\n * @param string $message HTTP request or response to parse.\n *\n * @return array\n * @internal\n */\nfunction _parse_message($message)\n{\n    if (!$message) {\n        throw new \\InvalidArgumentException('Invalid message');\n    }\n\n    // Iterate over each line in the message, accounting for line endings\n    $lines = preg_split('/(\\\\r?\\\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE);\n    $result = ['start-line' => array_shift($lines), 'headers' => [], 'body' => ''];\n    array_shift($lines);\n\n    for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) {\n        $line = $lines[$i];\n        // If two line breaks were encountered, then this is the end of body\n        if (empty($line)) {\n            if ($i < $totalLines - 1) {\n                $result['body'] = implode('', array_slice($lines, $i + 2));\n            }\n            break;\n        }\n        if (strpos($line, ':')) {\n            $parts = explode(':', $line, 2);\n            $key = trim($parts[0]);\n            $value = isset($parts[1]) ? trim($parts[1]) : '';\n            $result['headers'][$key][] = $value;\n        }\n    }\n\n    return $result;\n}\n\n/**\n * Constructs a URI for an HTTP request message.\n *\n * @param string $path    Path from the start-line\n * @param array  $headers Array of headers (each value an array).\n *\n * @return string\n * @internal\n */\nfunction _parse_request_uri($path, array $headers)\n{\n    $hostKey = array_filter(array_keys($headers), function ($k) {\n        return strtolower($k) === 'host';\n    });\n\n    // If no host is found, then a full URI cannot be constructed.\n    if (!$hostKey) {\n        return $path;\n    }\n\n    $host = $headers[reset($hostKey)][0];\n    $scheme = substr($host, -4) === ':443' ? 'https' : 'http';\n\n    return $scheme . '://' . $host . '/' . ltrim($path, '/');\n}\n\n/** @internal */\nfunction _caseless_remove($keys, array $data)\n{\n    $result = [];\n\n    foreach ($keys as &$key) {\n        $key = strtolower($key);\n    }\n\n    foreach ($data as $k => $v) {\n        if (!in_array(strtolower($k), $keys)) {\n            $result[$k] = $v;\n        }\n    }\n\n    return $result;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/guzzlehttp/psr7/src/functions_include.php",
    "content": "<?php\n\n// Don't redefine the functions if included multiple times.\nif (!function_exists('GuzzleHttp\\Psr7\\str')) {\n    require __DIR__ . '/functions.php';\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/.php_cs",
    "content": "<?php\n\n$header = <<<EOF\nThis file is part of the Monolog package.\n\n(c) Jordi Boggiano <j.boggiano@seld.be>\n\nFor the full copyright and license information, please view the LICENSE\nfile that was distributed with this source code.\nEOF;\n\n$finder = Symfony\\CS\\Finder::create()\n    ->files()\n    ->name('*.php')\n    ->exclude('Fixtures')\n    ->in(__DIR__.'/src')\n    ->in(__DIR__.'/tests')\n;\n\nreturn Symfony\\CS\\Config::create()\n    ->setUsingCache(true)\n    //->setUsingLinter(false)\n    ->setRiskyAllowed(true)\n    ->setRules(array(\n        '@PSR2' => true,\n        'binary_operator_spaces' => true,\n        'blank_line_before_return' => true,\n        'header_comment' => array('header' => $header),\n        'include' => true,\n        'long_array_syntax' => true,\n        'method_separation' => true,\n        'no_blank_lines_after_class_opening' => true,\n        'no_blank_lines_after_phpdoc' => true,\n        'no_blank_lines_between_uses' => true,\n        'no_duplicate_semicolons' => true,\n        'no_extra_consecutive_blank_lines' => true,\n        'no_leading_import_slash' => true,\n        'no_leading_namespace_whitespace' => true,\n        'no_trailing_comma_in_singleline_array' => true,\n        'no_unused_imports' => true,\n        'object_operator_without_whitespace' => true,\n        'phpdoc_align' => true,\n        'phpdoc_indent' => true,\n        'phpdoc_no_access' => true,\n        'phpdoc_no_package' => true,\n        'phpdoc_order' => true,\n        'phpdoc_scalar' => true,\n        'phpdoc_trim' => true,\n        'phpdoc_type_to_var' => true,\n        'psr0' => true,\n        'single_blank_line_before_namespace' => true,\n        'spaces_cast' => true,\n        'standardize_not_equals' => true,\n        'ternary_operator_spaces' => true,\n        'trailing_comma_in_multiline_array' => true,\n        'whitespacy_lines' => true,\n    ))\n    ->finder($finder)\n;\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/CHANGELOG.md",
    "content": "### 1.23.0 (2017-06-19)\n\n  * Improved SyslogUdpHandler's support for RFC5424 and added optional `$ident` argument\n  * Fixed GelfHandler truncation to be per field and not per message\n  * Fixed compatibility issue with PHP <5.3.6\n  * Fixed support for headless Chrome in ChromePHPHandler\n  * Fixed support for latest Aws SDK in DynamoDbHandler\n  * Fixed support for SwiftMailer 6.0+ in SwiftMailerHandler\n\n### 1.22.1 (2017-03-13)\n\n  * Fixed lots of minor issues in the new Slack integrations\n  * Fixed support for allowInlineLineBreaks in LineFormatter when formatting exception backtraces\n\n### 1.22.0 (2016-11-26)\n\n  * Added SlackbotHandler and SlackWebhookHandler to set up Slack integration more easily\n  * Added MercurialProcessor to add mercurial revision and branch names to log records\n  * Added support for AWS SDK v3 in DynamoDbHandler\n  * Fixed fatal errors occuring when normalizing generators that have been fully consumed\n  * Fixed RollbarHandler to include a level (rollbar level), monolog_level (original name), channel and datetime (unix)\n  * Fixed RollbarHandler not flushing records automatically, calling close() explicitly is not necessary anymore\n  * Fixed SyslogUdpHandler to avoid sending empty frames\n  * Fixed a few PHP 7.0 and 7.1 compatibility issues\n\n### 1.21.0 (2016-07-29)\n\n  * Break: Reverted the addition of $context when the ErrorHandler handles regular php errors from 1.20.0 as it was causing issues\n  * Added support for more formats in RotatingFileHandler::setFilenameFormat as long as they have Y, m and d in order\n  * Added ability to format the main line of text the SlackHandler sends by explictly setting a formatter on the handler\n  * Added information about SoapFault instances in NormalizerFormatter\n  * Added $handleOnlyReportedErrors option on ErrorHandler::registerErrorHandler (default true) to allow logging of all errors no matter the error_reporting level\n\n### 1.20.0 (2016-07-02)\n\n  * Added FingersCrossedHandler::activate() to manually trigger the handler regardless of the activation policy\n  * Added StreamHandler::getUrl to retrieve the stream's URL\n  * Added ability to override addRow/addTitle in HtmlFormatter\n  * Added the $context to context information when the ErrorHandler handles a regular php error\n  * Deprecated RotatingFileHandler::setFilenameFormat to only support 3 formats: Y, Y-m and Y-m-d\n  * Fixed WhatFailureGroupHandler to work with PHP7 throwables\n  * Fixed a few minor bugs\n\n### 1.19.0 (2016-04-12)\n\n  * Break: StreamHandler will not close streams automatically that it does not own. If you pass in a stream (not a path/url), then it will not close it for you. You can retrieve those using getStream() if needed\n  * Added DeduplicationHandler to remove duplicate records from notifications across multiple requests, useful for email or other notifications on errors\n  * Added ability to use `%message%` and other LineFormatter replacements in the subject line of emails sent with NativeMailHandler and SwiftMailerHandler\n  * Fixed HipChatHandler handling of long messages\n\n### 1.18.2 (2016-04-02)\n\n  * Fixed ElasticaFormatter to use more precise dates\n  * Fixed GelfMessageFormatter sending too long messages\n\n### 1.18.1 (2016-03-13)\n\n  * Fixed SlackHandler bug where slack dropped messages randomly\n  * Fixed RedisHandler issue when using with the PHPRedis extension\n  * Fixed AmqpHandler content-type being incorrectly set when using with the AMQP extension\n  * Fixed BrowserConsoleHandler regression\n\n### 1.18.0 (2016-03-01)\n\n  * Added optional reduction of timestamp precision via `Logger->useMicrosecondTimestamps(false)`, disabling it gets you a bit of performance boost but reduces the precision to the second instead of microsecond\n  * Added possibility to skip some extra stack frames in IntrospectionProcessor if you have some library wrapping Monolog that is always adding frames\n  * Added `Logger->withName` to clone a logger (keeping all handlers) with a new name\n  * Added FluentdFormatter for the Fluentd unix socket protocol\n  * Added HandlerWrapper base class to ease the creation of handler wrappers, just extend it and override as needed\n  * Added support for replacing context sub-keys using `%context.*%` in LineFormatter\n  * Added support for `payload` context value in RollbarHandler\n  * Added setRelease to RavenHandler to describe the application version, sent with every log\n  * Added support for `fingerprint` context value in RavenHandler\n  * Fixed JSON encoding errors that would gobble up the whole log record, we now handle those more gracefully by dropping chars as needed\n  * Fixed write timeouts in SocketHandler and derivatives, set to 10sec by default, lower it with `setWritingTimeout()`\n  * Fixed PHP7 compatibility with regard to Exception/Throwable handling in a few places\n\n### 1.17.2 (2015-10-14)\n\n  * Fixed ErrorHandler compatibility with non-Monolog PSR-3 loggers\n  * Fixed SlackHandler handling to use slack functionalities better\n  * Fixed SwiftMailerHandler bug when sending multiple emails they all had the same id\n  * Fixed 5.3 compatibility regression\n\n### 1.17.1 (2015-08-31)\n\n  * Fixed RollbarHandler triggering PHP notices\n\n### 1.17.0 (2015-08-30)\n\n  * Added support for `checksum` and `release` context/extra values in RavenHandler\n  * Added better support for exceptions in RollbarHandler\n  * Added UidProcessor::getUid\n  * Added support for showing the resource type in NormalizedFormatter\n  * Fixed IntrospectionProcessor triggering PHP notices\n\n### 1.16.0 (2015-08-09)\n\n  * Added IFTTTHandler to notify ifttt.com triggers\n  * Added Logger::setHandlers() to allow setting/replacing all handlers\n  * Added $capSize in RedisHandler to cap the log size\n  * Fixed StreamHandler creation of directory to only trigger when the first log write happens\n  * Fixed bug in the handling of curl failures\n  * Fixed duplicate logging of fatal errors when both error and fatal error handlers are registered in monolog's ErrorHandler\n  * Fixed missing fatal errors records with handlers that need to be closed to flush log records\n  * Fixed TagProcessor::addTags support for associative arrays\n\n### 1.15.0 (2015-07-12)\n\n  * Added addTags and setTags methods to change a TagProcessor\n  * Added automatic creation of directories if they are missing for a StreamHandler to open a log file\n  * Added retry functionality to Loggly, Cube and Mandrill handlers so they retry up to 5 times in case of network failure\n  * Fixed process exit code being incorrectly reset to 0 if ErrorHandler::registerExceptionHandler was used\n  * Fixed HTML/JS escaping in BrowserConsoleHandler\n  * Fixed JSON encoding errors being silently suppressed (PHP 5.5+ only)\n\n### 1.14.0 (2015-06-19)\n\n  * Added PHPConsoleHandler to send record to Chrome's PHP Console extension and library\n  * Added support for objects implementing __toString in the NormalizerFormatter\n  * Added support for HipChat's v2 API in HipChatHandler\n  * Added Logger::setTimezone() to initialize the timezone monolog should use in case date.timezone isn't correct for your app\n  * Added an option to send formatted message instead of the raw record on PushoverHandler via ->useFormattedMessage(true)\n  * Fixed curl errors being silently suppressed\n\n### 1.13.1 (2015-03-09)\n\n  * Fixed regression in HipChat requiring a new token to be created\n\n### 1.13.0 (2015-03-05)\n\n  * Added Registry::hasLogger to check for the presence of a logger instance\n  * Added context.user support to RavenHandler\n  * Added HipChat API v2 support in the HipChatHandler\n  * Added NativeMailerHandler::addParameter to pass params to the mail() process\n  * Added context data to SlackHandler when $includeContextAndExtra is true\n  * Added ability to customize the Swift_Message per-email in SwiftMailerHandler\n  * Fixed SwiftMailerHandler to lazily create message instances if a callback is provided\n  * Fixed serialization of INF and NaN values in Normalizer and LineFormatter\n\n### 1.12.0 (2014-12-29)\n\n  * Break: HandlerInterface::isHandling now receives a partial record containing only a level key. This was always the intent and does not break any Monolog handler but is strictly speaking a BC break and you should check if you relied on any other field in your own handlers.\n  * Added PsrHandler to forward records to another PSR-3 logger\n  * Added SamplingHandler to wrap around a handler and include only every Nth record\n  * Added MongoDBFormatter to support better storage with MongoDBHandler (it must be enabled manually for now)\n  * Added exception codes in the output of most formatters\n  * Added LineFormatter::includeStacktraces to enable exception stack traces in logs (uses more than one line)\n  * Added $useShortAttachment to SlackHandler to minify attachment size and $includeExtra to append extra data\n  * Added $host to HipChatHandler for users of private instances\n  * Added $transactionName to NewRelicHandler and support for a transaction_name context value\n  * Fixed MandrillHandler to avoid outputing API call responses\n  * Fixed some non-standard behaviors in SyslogUdpHandler\n\n### 1.11.0 (2014-09-30)\n\n  * Break: The NewRelicHandler extra and context data are now prefixed with extra_ and context_ to avoid clashes. Watch out if you have scripts reading those from the API and rely on names\n  * Added WhatFailureGroupHandler to suppress any exception coming from the wrapped handlers and avoid chain failures if a logging service fails\n  * Added MandrillHandler to send emails via the Mandrillapp.com API\n  * Added SlackHandler to log records to a Slack.com account\n  * Added FleepHookHandler to log records to a Fleep.io account\n  * Added LogglyHandler::addTag to allow adding tags to an existing handler\n  * Added $ignoreEmptyContextAndExtra to LineFormatter to avoid empty [] at the end\n  * Added $useLocking to StreamHandler and RotatingFileHandler to enable flock() while writing\n  * Added support for PhpAmqpLib in the AmqpHandler\n  * Added FingersCrossedHandler::clear and BufferHandler::clear to reset them between batches in long running jobs\n  * Added support for adding extra fields from $_SERVER in the WebProcessor\n  * Fixed support for non-string values in PrsLogMessageProcessor\n  * Fixed SwiftMailer messages being sent with the wrong date in long running scripts\n  * Fixed minor PHP 5.6 compatibility issues\n  * Fixed BufferHandler::close being called twice\n\n### 1.10.0 (2014-06-04)\n\n  * Added Logger::getHandlers() and Logger::getProcessors() methods\n  * Added $passthruLevel argument to FingersCrossedHandler to let it always pass some records through even if the trigger level is not reached\n  * Added support for extra data in NewRelicHandler\n  * Added $expandNewlines flag to the ErrorLogHandler to create multiple log entries when a message has multiple lines\n\n### 1.9.1 (2014-04-24)\n\n  * Fixed regression in RotatingFileHandler file permissions\n  * Fixed initialization of the BufferHandler to make sure it gets flushed after receiving records\n  * Fixed ChromePHPHandler and FirePHPHandler's activation strategies to be more conservative\n\n### 1.9.0 (2014-04-20)\n\n  * Added LogEntriesHandler to send logs to a LogEntries account\n  * Added $filePermissions to tweak file mode on StreamHandler and RotatingFileHandler\n  * Added $useFormatting flag to MemoryProcessor to make it send raw data in bytes\n  * Added support for table formatting in FirePHPHandler via the table context key\n  * Added a TagProcessor to add tags to records, and support for tags in RavenHandler\n  * Added $appendNewline flag to the JsonFormatter to enable using it when logging to files\n  * Added sound support to the PushoverHandler\n  * Fixed multi-threading support in StreamHandler\n  * Fixed empty headers issue when ChromePHPHandler received no records\n  * Fixed default format of the ErrorLogHandler\n\n### 1.8.0 (2014-03-23)\n\n  * Break: the LineFormatter now strips newlines by default because this was a bug, set $allowInlineLineBreaks to true if you need them\n  * Added BrowserConsoleHandler to send logs to any browser's console via console.log() injection in the output\n  * Added FilterHandler to filter records and only allow those of a given list of levels through to the wrapped handler\n  * Added FlowdockHandler to send logs to a Flowdock account\n  * Added RollbarHandler to send logs to a Rollbar account\n  * Added HtmlFormatter to send prettier log emails with colors for each log level\n  * Added GitProcessor to add the current branch/commit to extra record data\n  * Added a Monolog\\Registry class to allow easier global access to pre-configured loggers\n  * Added support for the new official graylog2/gelf-php lib for GelfHandler, upgrade if you can by replacing the mlehner/gelf-php requirement\n  * Added support for HHVM\n  * Added support for Loggly batch uploads\n  * Added support for tweaking the content type and encoding in NativeMailerHandler\n  * Added $skipClassesPartials to tweak the ignored classes in the IntrospectionProcessor\n  * Fixed batch request support in GelfHandler\n\n### 1.7.0 (2013-11-14)\n\n  * Added ElasticSearchHandler to send logs to an Elastic Search server\n  * Added DynamoDbHandler and ScalarFormatter to send logs to Amazon's Dynamo DB\n  * Added SyslogUdpHandler to send logs to a remote syslogd server\n  * Added LogglyHandler to send logs to a Loggly account\n  * Added $level to IntrospectionProcessor so it only adds backtraces when needed\n  * Added $version to LogstashFormatter to allow using the new v1 Logstash format\n  * Added $appName to NewRelicHandler\n  * Added configuration of Pushover notification retries/expiry\n  * Added $maxColumnWidth to NativeMailerHandler to change the 70 chars default\n  * Added chainability to most setters for all handlers\n  * Fixed RavenHandler batch processing so it takes the message from the record with highest priority\n  * Fixed HipChatHandler batch processing so it sends all messages at once\n  * Fixed issues with eAccelerator\n  * Fixed and improved many small things\n\n### 1.6.0 (2013-07-29)\n\n  * Added HipChatHandler to send logs to a HipChat chat room\n  * Added ErrorLogHandler to send logs to PHP's error_log function\n  * Added NewRelicHandler to send logs to NewRelic's service\n  * Added Monolog\\ErrorHandler helper class to register a Logger as exception/error/fatal handler\n  * Added ChannelLevelActivationStrategy for the FingersCrossedHandler to customize levels by channel\n  * Added stack traces output when normalizing exceptions (json output & co)\n  * Added Monolog\\Logger::API constant (currently 1)\n  * Added support for ChromePHP's v4.0 extension\n  * Added support for message priorities in PushoverHandler, see $highPriorityLevel and $emergencyLevel\n  * Added support for sending messages to multiple users at once with the PushoverHandler\n  * Fixed RavenHandler's support for batch sending of messages (when behind a Buffer or FingersCrossedHandler)\n  * Fixed normalization of Traversables with very large data sets, only the first 1000 items are shown now\n  * Fixed issue in RotatingFileHandler when an open_basedir restriction is active\n  * Fixed minor issues in RavenHandler and bumped the API to Raven 0.5.0\n  * Fixed SyslogHandler issue when many were used concurrently with different facilities\n\n### 1.5.0 (2013-04-23)\n\n  * Added ProcessIdProcessor to inject the PID in log records\n  * Added UidProcessor to inject a unique identifier to all log records of one request/run\n  * Added support for previous exceptions in the LineFormatter exception serialization\n  * Added Monolog\\Logger::getLevels() to get all available levels\n  * Fixed ChromePHPHandler so it avoids sending headers larger than Chrome can handle\n\n### 1.4.1 (2013-04-01)\n\n  * Fixed exception formatting in the LineFormatter to be more minimalistic\n  * Fixed RavenHandler's handling of context/extra data, requires Raven client >0.1.0\n  * Fixed log rotation in RotatingFileHandler to work with long running scripts spanning multiple days\n  * Fixed WebProcessor array access so it checks for data presence\n  * Fixed Buffer, Group and FingersCrossed handlers to make use of their processors\n\n### 1.4.0 (2013-02-13)\n\n  * Added RedisHandler to log to Redis via the Predis library or the phpredis extension\n  * Added ZendMonitorHandler to log to the Zend Server monitor\n  * Added the possibility to pass arrays of handlers and processors directly in the Logger constructor\n  * Added `$useSSL` option to the PushoverHandler which is enabled by default\n  * Fixed ChromePHPHandler and FirePHPHandler issue when multiple instances are used simultaneously\n  * Fixed header injection capability in the NativeMailHandler\n\n### 1.3.1 (2013-01-11)\n\n  * Fixed LogstashFormatter to be usable with stream handlers\n  * Fixed GelfMessageFormatter levels on Windows\n\n### 1.3.0 (2013-01-08)\n\n  * Added PSR-3 compliance, the `Monolog\\Logger` class is now an instance of `Psr\\Log\\LoggerInterface`\n  * Added PsrLogMessageProcessor that you can selectively enable for full PSR-3 compliance\n  * Added LogstashFormatter (combine with SocketHandler or StreamHandler to send logs to Logstash)\n  * Added PushoverHandler to send mobile notifications\n  * Added CouchDBHandler and DoctrineCouchDBHandler\n  * Added RavenHandler to send data to Sentry servers\n  * Added support for the new MongoClient class in MongoDBHandler\n  * Added microsecond precision to log records' timestamps\n  * Added `$flushOnOverflow` param to BufferHandler to flush by batches instead of losing\n    the oldest entries\n  * Fixed normalization of objects with cyclic references\n\n### 1.2.1 (2012-08-29)\n\n  * Added new $logopts arg to SyslogHandler to provide custom openlog options\n  * Fixed fatal error in SyslogHandler\n\n### 1.2.0 (2012-08-18)\n\n  * Added AmqpHandler (for use with AMQP servers)\n  * Added CubeHandler\n  * Added NativeMailerHandler::addHeader() to send custom headers in mails\n  * Added the possibility to specify more than one recipient in NativeMailerHandler\n  * Added the possibility to specify float timeouts in SocketHandler\n  * Added NOTICE and EMERGENCY levels to conform with RFC 5424\n  * Fixed the log records to use the php default timezone instead of UTC\n  * Fixed BufferHandler not being flushed properly on PHP fatal errors\n  * Fixed normalization of exotic resource types\n  * Fixed the default format of the SyslogHandler to avoid duplicating datetimes in syslog\n\n### 1.1.0 (2012-04-23)\n\n  * Added Monolog\\Logger::isHandling() to check if a handler will\n    handle the given log level\n  * Added ChromePHPHandler\n  * Added MongoDBHandler\n  * Added GelfHandler (for use with Graylog2 servers)\n  * Added SocketHandler (for use with syslog-ng for example)\n  * Added NormalizerFormatter\n  * Added the possibility to change the activation strategy of the FingersCrossedHandler\n  * Added possibility to show microseconds in logs\n  * Added `server` and `referer` to WebProcessor output\n\n### 1.0.2 (2011-10-24)\n\n  * Fixed bug in IE with large response headers and FirePHPHandler\n\n### 1.0.1 (2011-08-25)\n\n  * Added MemoryPeakUsageProcessor and MemoryUsageProcessor\n  * Added Monolog\\Logger::getName() to get a logger's channel name\n\n### 1.0.0 (2011-07-06)\n\n  * Added IntrospectionProcessor to get info from where the logger was called\n  * Fixed WebProcessor in CLI\n\n### 1.0.0-RC1 (2011-07-01)\n\n  * Initial release\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/LICENSE",
    "content": "Copyright (c) 2011-2016 Jordi Boggiano\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/README.md",
    "content": "# Monolog - Logging for PHP [![Build Status](https://img.shields.io/travis/Seldaek/monolog.svg)](https://travis-ci.org/Seldaek/monolog)\n\n[![Total Downloads](https://img.shields.io/packagist/dt/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)\n[![Latest Stable Version](https://img.shields.io/packagist/v/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)\n[![Reference Status](https://www.versioneye.com/php/monolog:monolog/reference_badge.svg)](https://www.versioneye.com/php/monolog:monolog/references)\n\n\nMonolog sends your logs to files, sockets, inboxes, databases and various\nweb services. See the complete list of handlers below. Special handlers\nallow you to build advanced logging strategies.\n\nThis library implements the [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)\ninterface that you can type-hint against in your own libraries to keep\na maximum of interoperability. You can also use it in your applications to\nmake sure you can always use another compatible logger at a later time.\nAs of 1.11.0 Monolog public APIs will also accept PSR-3 log levels.\nInternally Monolog still uses its own level scheme since it predates PSR-3.\n\n## Installation\n\nInstall the latest version with\n\n```bash\n$ composer require monolog/monolog\n```\n\n## Basic Usage\n\n```php\n<?php\n\nuse Monolog\\Logger;\nuse Monolog\\Handler\\StreamHandler;\n\n// create a log channel\n$log = new Logger('name');\n$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));\n\n// add records to the log\n$log->addWarning('Foo');\n$log->addError('Bar');\n```\n\n## Documentation\n\n- [Usage Instructions](doc/01-usage.md)\n- [Handlers, Formatters and Processors](doc/02-handlers-formatters-processors.md)\n- [Utility classes](doc/03-utilities.md)\n- [Extending Monolog](doc/04-extending.md)\n\n## Third Party Packages\n\nThird party handlers, formatters and processors are\n[listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You\ncan also add your own there if you publish one.\n\n## About\n\n### Requirements\n\n- Monolog works with PHP 5.3 or above, and is also tested to work with HHVM.\n\n### Submitting bugs and feature requests\n\nBugs and feature request are tracked on [GitHub](https://github.com/Seldaek/monolog/issues)\n\n### Framework Integrations\n\n- Frameworks and libraries using [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)\n  can be used very easily with Monolog since it implements the interface.\n- [Symfony2](http://symfony.com) comes out of the box with Monolog.\n- [Silex](http://silex.sensiolabs.org/) comes out of the box with Monolog.\n- [Laravel 4 & 5](http://laravel.com/) come out of the box with Monolog.\n- [Lumen](http://lumen.laravel.com/) comes out of the box with Monolog.\n- [PPI](http://www.ppi.io/) comes out of the box with Monolog.\n- [CakePHP](http://cakephp.org/) is usable with Monolog via the [cakephp-monolog](https://github.com/jadb/cakephp-monolog) plugin.\n- [Slim](http://www.slimframework.com/) is usable with Monolog via the [Slim-Monolog](https://github.com/Flynsarmy/Slim-Monolog) log writer.\n- [XOOPS 2.6](http://xoops.org/) comes out of the box with Monolog.\n- [Aura.Web_Project](https://github.com/auraphp/Aura.Web_Project) comes out of the box with Monolog.\n- [Nette Framework](http://nette.org/en/) can be used with Monolog via [Kdyby/Monolog](https://github.com/Kdyby/Monolog) extension.\n- [Proton Micro Framework](https://github.com/alexbilbie/Proton) comes out of the box with Monolog.\n\n### Author\n\nJordi Boggiano - <j.boggiano@seld.be> - <http://twitter.com/seldaek><br />\nSee also the list of [contributors](https://github.com/Seldaek/monolog/contributors) which participated in this project.\n\n### License\n\nMonolog is licensed under the MIT License - see the `LICENSE` file for details\n\n### Acknowledgements\n\nThis library is heavily inspired by Python's [Logbook](http://packages.python.org/Logbook/)\nlibrary, although most concepts have been adjusted to fit to the PHP world.\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/composer.json",
    "content": "{\n    \"name\": \"monolog/monolog\",\n    \"description\": \"Sends your logs to files, sockets, inboxes, databases and various web services\",\n    \"keywords\": [\"log\", \"logging\", \"psr-3\"],\n    \"homepage\": \"http://github.com/Seldaek/monolog\",\n    \"type\": \"library\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jordi Boggiano\",\n            \"email\": \"j.boggiano@seld.be\",\n            \"homepage\": \"http://seld.be\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.3.0\",\n        \"psr/log\": \"~1.0\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"~4.5\",\n        \"graylog2/gelf-php\": \"~1.0\",\n        \"sentry/sentry\": \"^0.13\",\n        \"ruflin/elastica\": \">=0.90 <3.0\",\n        \"doctrine/couchdb\": \"~1.0@dev\",\n        \"aws/aws-sdk-php\": \"^2.4.9 || ^3.0\",\n        \"php-amqplib/php-amqplib\": \"~2.4\",\n        \"swiftmailer/swiftmailer\": \"^5.3|^6.0\",\n        \"php-console/php-console\": \"^3.1.3\",\n        \"phpunit/phpunit-mock-objects\": \"2.3.0\",\n        \"jakub-onderka/php-parallel-lint\": \"0.9\"\n    },\n    \"_\": \"phpunit/phpunit-mock-objects required in 2.3.0 due to https://github.com/sebastianbergmann/phpunit-mock-objects/issues/223 - needs hhvm 3.8+ on travis\",\n    \"suggest\": {\n        \"graylog2/gelf-php\": \"Allow sending log messages to a GrayLog2 server\",\n        \"sentry/sentry\": \"Allow sending log messages to a Sentry server\",\n        \"doctrine/couchdb\": \"Allow sending log messages to a CouchDB server\",\n        \"ruflin/elastica\": \"Allow sending log messages to an Elastic Search server\",\n        \"php-amqplib/php-amqplib\": \"Allow sending log messages to an AMQP server using php-amqplib\",\n        \"ext-amqp\": \"Allow sending log messages to an AMQP server (1.0+ required)\",\n        \"ext-mongo\": \"Allow sending log messages to a MongoDB server\",\n        \"mongodb/mongodb\": \"Allow sending log messages to a MongoDB server via PHP Driver\",\n        \"aws/aws-sdk-php\": \"Allow sending log messages to AWS services like DynamoDB\",\n        \"rollbar/rollbar\": \"Allow sending log messages to Rollbar\",\n        \"php-console/php-console\": \"Allow sending log messages to Google Chrome\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\"Monolog\\\\\": \"src/Monolog\"}\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\"Monolog\\\\\": \"tests/Monolog\"}\n    },\n    \"provide\": {\n        \"psr/log-implementation\": \"1.0.0\"\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"2.0.x-dev\"\n        }\n    },\n    \"scripts\": {\n        \"test\": [\n            \"parallel-lint . --exclude vendor\",\n            \"phpunit\"\n        ]\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/doc/01-usage.md",
    "content": "# Using Monolog\n\n- [Installation](#installation)\n- [Core Concepts](#core-concepts)\n- [Log Levels](#log-levels)\n- [Configuring a logger](#configuring-a-logger)\n- [Adding extra data in the records](#adding-extra-data-in-the-records)\n- [Leveraging channels](#leveraging-channels)\n- [Customizing the log format](#customizing-the-log-format)\n\n## Installation\n\nMonolog is available on Packagist ([monolog/monolog](http://packagist.org/packages/monolog/monolog))\nand as such installable via [Composer](http://getcomposer.org/).\n\n```bash\ncomposer require monolog/monolog\n```\n\nIf you do not use Composer, you can grab the code from GitHub, and use any\nPSR-0 compatible autoloader (e.g. the [Symfony2 ClassLoader component](https://github.com/symfony/ClassLoader))\nto load Monolog classes.\n\n## Core Concepts\n\nEvery `Logger` instance has a channel (name) and a stack of handlers. Whenever\nyou add a record to the logger, it traverses the handler stack. Each handler\ndecides whether it fully handled the record, and if so, the propagation of the\nrecord ends there.\n\nThis allows for flexible logging setups, for example having a `StreamHandler` at\nthe bottom of the stack that will log anything to disk, and on top of that add\na `MailHandler` that will send emails only when an error message is logged.\nHandlers also have a `$bubble` property which defines whether they block the\nrecord or not if they handled it. In this example, setting the `MailHandler`'s\n`$bubble` argument to false means that records handled by the `MailHandler` will\nnot propagate to the `StreamHandler` anymore.\n\nYou can create many `Logger`s, each defining a channel (e.g.: db, request,\nrouter, ..) and each of them combining various handlers, which can be shared\nor not. The channel is reflected in the logs and allows you to easily see or\nfilter records.\n\nEach Handler also has a Formatter, a default one with settings that make sense\nwill be created if you don't set one. The formatters normalize and format\nincoming records so that they can be used by the handlers to output useful\ninformation.\n\nCustom severity levels are not available. Only the eight\n[RFC 5424](http://tools.ietf.org/html/rfc5424) levels (debug, info, notice,\nwarning, error, critical, alert, emergency) are present for basic filtering\npurposes, but for sorting and other use cases that would require\nflexibility, you should add Processors to the Logger that can add extra\ninformation (tags, user ip, ..) to the records before they are handled.\n\n## Log Levels\n\nMonolog supports the logging levels described by [RFC 5424](http://tools.ietf.org/html/rfc5424).\n\n- **DEBUG** (100): Detailed debug information.\n\n- **INFO** (200): Interesting events. Examples: User logs in, SQL logs.\n\n- **NOTICE** (250): Normal but significant events.\n\n- **WARNING** (300): Exceptional occurrences that are not errors. Examples:\n  Use of deprecated APIs, poor use of an API, undesirable things that are not\n  necessarily wrong.\n\n- **ERROR** (400): Runtime errors that do not require immediate action but\n  should typically be logged and monitored.\n\n- **CRITICAL** (500): Critical conditions. Example: Application component\n  unavailable, unexpected exception.\n\n- **ALERT** (550): Action must be taken immediately. Example: Entire website\n  down, database unavailable, etc. This should trigger the SMS alerts and wake\n  you up.\n\n- **EMERGENCY** (600): Emergency: system is unusable.\n\n## Configuring a logger\n\nHere is a basic setup to log to a file and to firephp on the DEBUG level:\n\n```php\n<?php\n\nuse Monolog\\Logger;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Handler\\FirePHPHandler;\n\n// Create the logger\n$logger = new Logger('my_logger');\n// Now add some handlers\n$logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG));\n$logger->pushHandler(new FirePHPHandler());\n\n// You can now use your logger\n$logger->addInfo('My logger is now ready');\n```\n\nLet's explain it. The first step is to create the logger instance which will\nbe used in your code. The argument is a channel name, which is useful when\nyou use several loggers (see below for more details about it).\n\nThe logger itself does not know how to handle a record. It delegates it to\nsome handlers. The code above registers two handlers in the stack to allow\nhandling records in two different ways.\n\nNote that the FirePHPHandler is called first as it is added on top of the\nstack. This allows you to temporarily add a logger with bubbling disabled if\nyou want to override other configured loggers.\n\n> If you use Monolog standalone and are looking for an easy way to\n> configure many handlers, the [theorchard/monolog-cascade](https://github.com/theorchard/monolog-cascade)\n> can help you build complex logging configs via PHP arrays, yaml or json configs.\n\n## Adding extra data in the records\n\nMonolog provides two different ways to add extra informations along the simple\ntextual message.\n\n### Using the logging context\n\nThe first way is the context, allowing to pass an array of data along the\nrecord:\n\n```php\n<?php\n\n$logger->addInfo('Adding a new user', array('username' => 'Seldaek'));\n```\n\nSimple handlers (like the StreamHandler for instance) will simply format\nthe array to a string but richer handlers can take advantage of the context\n(FirePHP is able to display arrays in pretty way for instance).\n\n### Using processors\n\nThe second way is to add extra data for all records by using a processor.\nProcessors can be any callable. They will get the record as parameter and\nmust return it after having eventually changed the `extra` part of it. Let's\nwrite a processor adding some dummy data in the record:\n\n```php\n<?php\n\n$logger->pushProcessor(function ($record) {\n    $record['extra']['dummy'] = 'Hello world!';\n\n    return $record;\n});\n```\n\nMonolog provides some built-in processors that can be used in your project.\nLook at the [dedicated chapter](https://github.com/Seldaek/monolog/blob/master/doc/02-handlers-formatters-processors.md#processors) for the list.\n\n> Tip: processors can also be registered on a specific handler instead of\n  the logger to apply only for this handler.\n\n## Leveraging channels\n\nChannels are a great way to identify to which part of the application a record\nis related. This is useful in big applications (and is leveraged by\nMonologBundle in Symfony2).\n\nPicture two loggers sharing a handler that writes to a single log file.\nChannels would allow you to identify the logger that issued every record.\nYou can easily grep through the log files filtering this or that channel.\n\n```php\n<?php\n\nuse Monolog\\Logger;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Handler\\FirePHPHandler;\n\n// Create some handlers\n$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);\n$firephp = new FirePHPHandler();\n\n// Create the main logger of the app\n$logger = new Logger('my_logger');\n$logger->pushHandler($stream);\n$logger->pushHandler($firephp);\n\n// Create a logger for the security-related stuff with a different channel\n$securityLogger = new Logger('security');\n$securityLogger->pushHandler($stream);\n$securityLogger->pushHandler($firephp);\n\n// Or clone the first one to only change the channel\n$securityLogger = $logger->withName('security');\n```\n\n## Customizing the log format\n\nIn Monolog it's easy to customize the format of the logs written into files,\nsockets, mails, databases and other handlers. Most of the handlers use the\n\n```php\n$record['formatted']\n```\n\nvalue to be automatically put into the log device. This value depends on the\nformatter settings. You can choose between predefined formatter classes or\nwrite your own (e.g. a multiline text file for human-readable output).\n\nTo configure a predefined formatter class, just set it as the handler's field:\n\n```php\n// the default date format is \"Y-m-d H:i:s\"\n$dateFormat = \"Y n j, g:i a\";\n// the default output format is \"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\\n\"\n$output = \"%datetime% > %level_name% > %message% %context% %extra%\\n\";\n// finally, create a formatter\n$formatter = new LineFormatter($output, $dateFormat);\n\n// Create a handler\n$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);\n$stream->setFormatter($formatter);\n// bind it to a logger object\n$securityLogger = new Logger('security');\n$securityLogger->pushHandler($stream);\n```\n\nYou may also reuse the same formatter between multiple handlers and share those\nhandlers between multiple loggers.\n\n[Handlers, Formatters and Processors](02-handlers-formatters-processors.md) &rarr;\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md",
    "content": "# Handlers, Formatters and Processors\n\n- [Handlers](#handlers)\n  - [Log to files and syslog](#log-to-files-and-syslog)\n  - [Send alerts and emails](#send-alerts-and-emails)\n  - [Log specific servers and networked logging](#log-specific-servers-and-networked-logging)\n  - [Logging in development](#logging-in-development)\n  - [Log to databases](#log-to-databases)\n  - [Wrappers / Special Handlers](#wrappers--special-handlers)\n- [Formatters](#formatters)\n- [Processors](#processors)\n- [Third Party Packages](#third-party-packages)\n\n## Handlers\n\n### Log to files and syslog\n\n- _StreamHandler_: Logs records into any PHP stream, use this for log files.\n- _RotatingFileHandler_: Logs records to a file and creates one logfile per day.\n  It will also delete files older than `$maxFiles`. You should use\n  [logrotate](http://linuxcommand.org/man_pages/logrotate8.html) for high profile\n  setups though, this is just meant as a quick and dirty solution.\n- _SyslogHandler_: Logs records to the syslog.\n- _ErrorLogHandler_: Logs records to PHP's\n  [`error_log()`](http://docs.php.net/manual/en/function.error-log.php) function.\n\n### Send alerts and emails\n\n- _NativeMailerHandler_: Sends emails using PHP's\n  [`mail()`](http://php.net/manual/en/function.mail.php) function.\n- _SwiftMailerHandler_: Sends emails using a [`Swift_Mailer`](http://swiftmailer.org/) instance.\n- _PushoverHandler_: Sends mobile notifications via the [Pushover](https://www.pushover.net/) API.\n- _HipChatHandler_: Logs records to a [HipChat](http://hipchat.com) chat room using its API.\n- _FlowdockHandler_: Logs records to a [Flowdock](https://www.flowdock.com/) account.\n- _SlackHandler_: Logs records to a [Slack](https://www.slack.com/) account using the Slack API.\n- _SlackbotHandler_: Logs records to a [Slack](https://www.slack.com/) account using the Slackbot incoming hook.\n- _SlackWebhookHandler_: Logs records to a [Slack](https://www.slack.com/) account using Slack Webhooks.\n- _MandrillHandler_: Sends emails via the Mandrill API using a [`Swift_Message`](http://swiftmailer.org/) instance.\n- _FleepHookHandler_: Logs records to a [Fleep](https://fleep.io/) conversation using Webhooks.\n- _IFTTTHandler_: Notifies an [IFTTT](https://ifttt.com/maker) trigger with the log channel, level name and message.\n\n### Log specific servers and networked logging\n\n- _SocketHandler_: Logs records to [sockets](http://php.net/fsockopen), use this\n  for UNIX and TCP sockets. See an [example](sockets.md).\n- _AmqpHandler_: Logs records to an [amqp](http://www.amqp.org/) compatible\n  server. Requires the [php-amqp](http://pecl.php.net/package/amqp) extension (1.0+).\n- _GelfHandler_: Logs records to a [Graylog2](http://www.graylog2.org) server.\n- _CubeHandler_: Logs records to a [Cube](http://square.github.com/cube/) server.\n- _RavenHandler_: Logs records to a [Sentry](http://getsentry.com/) server using\n  [raven](https://packagist.org/packages/raven/raven).\n- _ZendMonitorHandler_: Logs records to the Zend Monitor present in Zend Server.\n- _NewRelicHandler_: Logs records to a [NewRelic](http://newrelic.com/) application.\n- _LogglyHandler_: Logs records to a [Loggly](http://www.loggly.com/) account.\n- _RollbarHandler_: Logs records to a [Rollbar](https://rollbar.com/) account.\n- _SyslogUdpHandler_: Logs records to a remote [Syslogd](http://www.rsyslog.com/) server.\n- _LogEntriesHandler_: Logs records to a [LogEntries](http://logentries.com/) account.\n\n### Logging in development\n\n- _FirePHPHandler_: Handler for [FirePHP](http://www.firephp.org/), providing\n  inline `console` messages within [FireBug](http://getfirebug.com/).\n- _ChromePHPHandler_: Handler for [ChromePHP](http://www.chromephp.com/), providing\n  inline `console` messages within Chrome.\n- _BrowserConsoleHandler_: Handler to send logs to browser's Javascript `console` with\n  no browser extension required. Most browsers supporting `console` API are supported.\n- _PHPConsoleHandler_: Handler for [PHP Console](https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef), providing\n  inline `console` and notification popup messages within Chrome.\n\n### Log to databases\n\n- _RedisHandler_: Logs records to a [redis](http://redis.io) server.\n- _MongoDBHandler_: Handler to write records in MongoDB via a\n  [Mongo](http://pecl.php.net/package/mongo) extension connection.\n- _CouchDBHandler_: Logs records to a CouchDB server.\n- _DoctrineCouchDBHandler_: Logs records to a CouchDB server via the Doctrine CouchDB ODM.\n- _ElasticSearchHandler_: Logs records to an Elastic Search server.\n- _DynamoDbHandler_: Logs records to a DynamoDB table with the [AWS SDK](https://github.com/aws/aws-sdk-php).\n\n### Wrappers / Special Handlers\n\n- _FingersCrossedHandler_: A very interesting wrapper. It takes a logger as\n  parameter and will accumulate log records of all levels until a record\n  exceeds the defined severity level. At which point it delivers all records,\n  including those of lower severity, to the handler it wraps. This means that\n  until an error actually happens you will not see anything in your logs, but\n  when it happens you will have the full information, including debug and info\n  records. This provides you with all the information you need, but only when\n  you need it.\n- _DeduplicationHandler_: Useful if you are sending notifications or emails\n  when critical errors occur. It takes a logger as parameter and will\n  accumulate log records of all levels until the end of the request (or\n  `flush()` is called). At that point it delivers all records to the handler\n  it wraps, but only if the records are unique over a given time period\n  (60seconds by default). If the records are duplicates they are simply\n  discarded. The main use of this is in case of critical failure like if your\n  database is unreachable for example all your requests will fail and that\n  can result in a lot of notifications being sent. Adding this handler reduces\n  the amount of notifications to a manageable level.\n- _WhatFailureGroupHandler_: This handler extends the _GroupHandler_ ignoring\n   exceptions raised by each child handler. This allows you to ignore issues\n   where a remote tcp connection may have died but you do not want your entire\n   application to crash and may wish to continue to log to other handlers.\n- _BufferHandler_: This handler will buffer all the log records it receives\n  until `close()` is called at which point it will call `handleBatch()` on the\n  handler it wraps with all the log messages at once. This is very useful to\n  send an email with all records at once for example instead of having one mail\n  for every log record.\n- _GroupHandler_: This handler groups other handlers. Every record received is\n  sent to all the handlers it is configured with.\n- _FilterHandler_: This handler only lets records of the given levels through\n   to the wrapped handler.\n- _SamplingHandler_: Wraps around another handler and lets you sample records\n   if you only want to store some of them.\n- _NullHandler_: Any record it can handle will be thrown away. This can be used\n  to put on top of an existing handler stack to disable it temporarily.\n- _PsrHandler_: Can be used to forward log records to an existing PSR-3 logger\n- _TestHandler_: Used for testing, it records everything that is sent to it and\n  has accessors to read out the information.\n- _HandlerWrapper_: A simple handler wrapper you can inherit from to create\n your own wrappers easily.\n\n## Formatters\n\n- _LineFormatter_: Formats a log record into a one-line string.\n- _HtmlFormatter_: Used to format log records into a human readable html table, mainly suitable for emails.\n- _NormalizerFormatter_: Normalizes objects/resources down to strings so a record can easily be serialized/encoded.\n- _ScalarFormatter_: Used to format log records into an associative array of scalar values.\n- _JsonFormatter_: Encodes a log record into json.\n- _WildfireFormatter_: Used to format log records into the Wildfire/FirePHP protocol, only useful for the FirePHPHandler.\n- _ChromePHPFormatter_: Used to format log records into the ChromePHP format, only useful for the ChromePHPHandler.\n- _GelfMessageFormatter_: Used to format log records into Gelf message instances, only useful for the GelfHandler.\n- _LogstashFormatter_: Used to format log records into [logstash](http://logstash.net/) event json, useful for any handler listed under inputs [here](http://logstash.net/docs/latest).\n- _ElasticaFormatter_: Used to format log records into an Elastica\\Document object, only useful for the ElasticSearchHandler.\n- _LogglyFormatter_: Used to format log records into Loggly messages, only useful for the LogglyHandler.\n- _FlowdockFormatter_: Used to format log records into Flowdock messages, only useful for the FlowdockHandler.\n- _MongoDBFormatter_: Converts \\DateTime instances to \\MongoDate and objects recursively to arrays, only useful with the MongoDBHandler.\n\n## Processors\n\n- _PsrLogMessageProcessor_: Processes a log record's message according to PSR-3 rules, replacing `{foo}` with the value from `$context['foo']`.\n- _IntrospectionProcessor_: Adds the line/file/class/method from which the log call originated.\n- _WebProcessor_: Adds the current request URI, request method and client IP to a log record.\n- _MemoryUsageProcessor_: Adds the current memory usage to a log record.\n- _MemoryPeakUsageProcessor_: Adds the peak memory usage to a log record.\n- _ProcessIdProcessor_: Adds the process id to a log record.\n- _UidProcessor_: Adds a unique identifier to a log record.\n- _GitProcessor_: Adds the current git branch and commit to a log record.\n- _TagProcessor_: Adds an array of predefined tags to a log record.\n\n## Third Party Packages\n\nThird party handlers, formatters and processors are\n[listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You\ncan also add your own there if you publish one.\n\n&larr; [Usage](01-usage.md) |  [Utility classes](03-utilities.md) &rarr;\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/doc/03-utilities.md",
    "content": "# Utilities\n\n- _Registry_: The `Monolog\\Registry` class lets you configure global loggers that you\n  can then statically access from anywhere. It is not really a best practice but can\n  help in some older codebases or for ease of use.\n- _ErrorHandler_: The `Monolog\\ErrorHandler` class allows you to easily register\n  a Logger instance as an exception handler, error handler or fatal error handler.\n- _ErrorLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain log\n  level is reached.\n- _ChannelLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain\n  log level is reached, depending on which channel received the log record.\n\n&larr; [Handlers, Formatters and Processors](02-handlers-formatters-processors.md) |  [Extending Monolog](04-extending.md) &rarr;\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/doc/04-extending.md",
    "content": "# Extending Monolog\n\nMonolog is fully extensible, allowing you to adapt your logger to your needs.\n\n## Writing your own handler\n\nMonolog provides many built-in handlers. But if the one you need does not\nexist, you can write it and use it in your logger. The only requirement is\nto implement `Monolog\\Handler\\HandlerInterface`.\n\nLet's write a PDOHandler to log records to a database. We will extend the\nabstract class provided by Monolog to keep things DRY.\n\n```php\n<?php\n\nuse Monolog\\Logger;\nuse Monolog\\Handler\\AbstractProcessingHandler;\n\nclass PDOHandler extends AbstractProcessingHandler\n{\n    private $initialized = false;\n    private $pdo;\n    private $statement;\n\n    public function __construct(PDO $pdo, $level = Logger::DEBUG, $bubble = true)\n    {\n        $this->pdo = $pdo;\n        parent::__construct($level, $bubble);\n    }\n\n    protected function write(array $record)\n    {\n        if (!$this->initialized) {\n            $this->initialize();\n        }\n\n        $this->statement->execute(array(\n            'channel' => $record['channel'],\n            'level' => $record['level'],\n            'message' => $record['formatted'],\n            'time' => $record['datetime']->format('U'),\n        ));\n    }\n\n    private function initialize()\n    {\n        $this->pdo->exec(\n            'CREATE TABLE IF NOT EXISTS monolog '\n            .'(channel VARCHAR(255), level INTEGER, message LONGTEXT, time INTEGER UNSIGNED)'\n        );\n        $this->statement = $this->pdo->prepare(\n            'INSERT INTO monolog (channel, level, message, time) VALUES (:channel, :level, :message, :time)'\n        );\n\n        $this->initialized = true;\n    }\n}\n```\n\nYou can now use this handler in your logger:\n\n```php\n<?php\n\n$logger->pushHandler(new PDOHandler(new PDO('sqlite:logs.sqlite')));\n\n// You can now use your logger\n$logger->addInfo('My logger is now ready');\n```\n\nThe `Monolog\\Handler\\AbstractProcessingHandler` class provides most of the\nlogic needed for the handler, including the use of processors and the formatting\nof the record (which is why we use ``$record['formatted']`` instead of ``$record['message']``).\n\n&larr; [Utility classes](03-utilities.md)\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/doc/sockets.md",
    "content": "Sockets Handler\n===============\n\nThis handler allows you to write your logs to sockets using [fsockopen](http://php.net/fsockopen)\nor [pfsockopen](http://php.net/pfsockopen).\n\nPersistent sockets are mainly useful in web environments where you gain some performance not closing/opening\nthe connections between requests.\n\nYou can use a `unix://` prefix to access unix sockets and `udp://` to open UDP sockets instead of the default TCP.\n\nBasic Example\n-------------\n\n```php\n<?php\n\nuse Monolog\\Logger;\nuse Monolog\\Handler\\SocketHandler;\n\n// Create the logger\n$logger = new Logger('my_logger');\n\n// Create the handler\n$handler = new SocketHandler('unix:///var/log/httpd_app_log.socket');\n$handler->setPersistent(true);\n\n// Now add the handler\n$logger->pushHandler($handler, Logger::DEBUG);\n\n// You can now use your logger\n$logger->addInfo('My logger is now ready');\n\n```\n\nIn this example, using syslog-ng, you should see the log on the log server:\n\n    cweb1 [2012-02-26 00:12:03] my_logger.INFO: My logger is now ready [] []\n\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/phpunit.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<phpunit bootstrap=\"vendor/autoload.php\" colors=\"true\">\n    <testsuites>\n        <testsuite name=\"Monolog Test Suite\">\n            <directory>tests/Monolog/</directory>\n        </testsuite>\n    </testsuites>\n\n    <filter>\n        <whitelist>\n            <directory suffix=\".php\">src/Monolog/</directory>\n        </whitelist>\n    </filter>\n\n    <php>\n        <ini name=\"date.timezone\" value=\"UTC\"/>\n    </php>\n</phpunit>\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/ErrorHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse Psr\\Log\\LoggerInterface;\nuse Psr\\Log\\LogLevel;\nuse Monolog\\Handler\\AbstractHandler;\n\n/**\n * Monolog error handler\n *\n * A facility to enable logging of runtime errors, exceptions and fatal errors.\n *\n * Quick setup: <code>ErrorHandler::register($logger);</code>\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass ErrorHandler\n{\n    private $logger;\n\n    private $previousExceptionHandler;\n    private $uncaughtExceptionLevel;\n\n    private $previousErrorHandler;\n    private $errorLevelMap;\n    private $handleOnlyReportedErrors;\n\n    private $hasFatalErrorHandler;\n    private $fatalLevel;\n    private $reservedMemory;\n    private static $fatalErrors = array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR);\n\n    public function __construct(LoggerInterface $logger)\n    {\n        $this->logger = $logger;\n    }\n\n    /**\n     * Registers a new ErrorHandler for a given Logger\n     *\n     * By default it will handle errors, exceptions and fatal errors\n     *\n     * @param  LoggerInterface $logger\n     * @param  array|false     $errorLevelMap  an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling\n     * @param  int|false       $exceptionLevel a LogLevel::* constant, or false to disable exception handling\n     * @param  int|false       $fatalLevel     a LogLevel::* constant, or false to disable fatal error handling\n     * @return ErrorHandler\n     */\n    public static function register(LoggerInterface $logger, $errorLevelMap = array(), $exceptionLevel = null, $fatalLevel = null)\n    {\n        //Forces the autoloader to run for LogLevel. Fixes an autoload issue at compile-time on PHP5.3. See https://github.com/Seldaek/monolog/pull/929\n        class_exists('\\\\Psr\\\\Log\\\\LogLevel', true);\n\n        $handler = new static($logger);\n        if ($errorLevelMap !== false) {\n            $handler->registerErrorHandler($errorLevelMap);\n        }\n        if ($exceptionLevel !== false) {\n            $handler->registerExceptionHandler($exceptionLevel);\n        }\n        if ($fatalLevel !== false) {\n            $handler->registerFatalHandler($fatalLevel);\n        }\n\n        return $handler;\n    }\n\n    public function registerExceptionHandler($level = null, $callPrevious = true)\n    {\n        $prev = set_exception_handler(array($this, 'handleException'));\n        $this->uncaughtExceptionLevel = $level;\n        if ($callPrevious && $prev) {\n            $this->previousExceptionHandler = $prev;\n        }\n    }\n\n    public function registerErrorHandler(array $levelMap = array(), $callPrevious = true, $errorTypes = -1, $handleOnlyReportedErrors = true)\n    {\n        $prev = set_error_handler(array($this, 'handleError'), $errorTypes);\n        $this->errorLevelMap = array_replace($this->defaultErrorLevelMap(), $levelMap);\n        if ($callPrevious) {\n            $this->previousErrorHandler = $prev ?: true;\n        }\n\n        $this->handleOnlyReportedErrors = $handleOnlyReportedErrors;\n    }\n\n    public function registerFatalHandler($level = null, $reservedMemorySize = 20)\n    {\n        register_shutdown_function(array($this, 'handleFatalError'));\n\n        $this->reservedMemory = str_repeat(' ', 1024 * $reservedMemorySize);\n        $this->fatalLevel = $level;\n        $this->hasFatalErrorHandler = true;\n    }\n\n    protected function defaultErrorLevelMap()\n    {\n        return array(\n            E_ERROR             => LogLevel::CRITICAL,\n            E_WARNING           => LogLevel::WARNING,\n            E_PARSE             => LogLevel::ALERT,\n            E_NOTICE            => LogLevel::NOTICE,\n            E_CORE_ERROR        => LogLevel::CRITICAL,\n            E_CORE_WARNING      => LogLevel::WARNING,\n            E_COMPILE_ERROR     => LogLevel::ALERT,\n            E_COMPILE_WARNING   => LogLevel::WARNING,\n            E_USER_ERROR        => LogLevel::ERROR,\n            E_USER_WARNING      => LogLevel::WARNING,\n            E_USER_NOTICE       => LogLevel::NOTICE,\n            E_STRICT            => LogLevel::NOTICE,\n            E_RECOVERABLE_ERROR => LogLevel::ERROR,\n            E_DEPRECATED        => LogLevel::NOTICE,\n            E_USER_DEPRECATED   => LogLevel::NOTICE,\n        );\n    }\n\n    /**\n     * @private\n     */\n    public function handleException($e)\n    {\n        $this->logger->log(\n            $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel,\n            sprintf('Uncaught Exception %s: \"%s\" at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()),\n            array('exception' => $e)\n        );\n\n        if ($this->previousExceptionHandler) {\n            call_user_func($this->previousExceptionHandler, $e);\n        }\n\n        exit(255);\n    }\n\n    /**\n     * @private\n     */\n    public function handleError($code, $message, $file = '', $line = 0, $context = array())\n    {\n        if ($this->handleOnlyReportedErrors && !(error_reporting() & $code)) {\n            return;\n        }\n\n        // fatal error codes are ignored if a fatal error handler is present as well to avoid duplicate log entries\n        if (!$this->hasFatalErrorHandler || !in_array($code, self::$fatalErrors, true)) {\n            $level = isset($this->errorLevelMap[$code]) ? $this->errorLevelMap[$code] : LogLevel::CRITICAL;\n            $this->logger->log($level, self::codeToString($code).': '.$message, array('code' => $code, 'message' => $message, 'file' => $file, 'line' => $line));\n        }\n\n        if ($this->previousErrorHandler === true) {\n            return false;\n        } elseif ($this->previousErrorHandler) {\n            return call_user_func($this->previousErrorHandler, $code, $message, $file, $line, $context);\n        }\n    }\n\n    /**\n     * @private\n     */\n    public function handleFatalError()\n    {\n        $this->reservedMemory = null;\n\n        $lastError = error_get_last();\n        if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) {\n            $this->logger->log(\n                $this->fatalLevel === null ? LogLevel::ALERT : $this->fatalLevel,\n                'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'],\n                array('code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'])\n            );\n\n            if ($this->logger instanceof Logger) {\n                foreach ($this->logger->getHandlers() as $handler) {\n                    if ($handler instanceof AbstractHandler) {\n                        $handler->close();\n                    }\n                }\n            }\n        }\n    }\n\n    private static function codeToString($code)\n    {\n        switch ($code) {\n            case E_ERROR:\n                return 'E_ERROR';\n            case E_WARNING:\n                return 'E_WARNING';\n            case E_PARSE:\n                return 'E_PARSE';\n            case E_NOTICE:\n                return 'E_NOTICE';\n            case E_CORE_ERROR:\n                return 'E_CORE_ERROR';\n            case E_CORE_WARNING:\n                return 'E_CORE_WARNING';\n            case E_COMPILE_ERROR:\n                return 'E_COMPILE_ERROR';\n            case E_COMPILE_WARNING:\n                return 'E_COMPILE_WARNING';\n            case E_USER_ERROR:\n                return 'E_USER_ERROR';\n            case E_USER_WARNING:\n                return 'E_USER_WARNING';\n            case E_USER_NOTICE:\n                return 'E_USER_NOTICE';\n            case E_STRICT:\n                return 'E_STRICT';\n            case E_RECOVERABLE_ERROR:\n                return 'E_RECOVERABLE_ERROR';\n            case E_DEPRECATED:\n                return 'E_DEPRECATED';\n            case E_USER_DEPRECATED:\n                return 'E_USER_DEPRECATED';\n        }\n\n        return 'Unknown PHP error';\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\n\n/**\n * Formats a log message according to the ChromePHP array format\n *\n * @author Christophe Coevoet <stof@notk.org>\n */\nclass ChromePHPFormatter implements FormatterInterface\n{\n    /**\n     * Translates Monolog log levels to Wildfire levels.\n     */\n    private $logLevels = array(\n        Logger::DEBUG     => 'log',\n        Logger::INFO      => 'info',\n        Logger::NOTICE    => 'info',\n        Logger::WARNING   => 'warn',\n        Logger::ERROR     => 'error',\n        Logger::CRITICAL  => 'error',\n        Logger::ALERT     => 'error',\n        Logger::EMERGENCY => 'error',\n    );\n\n    /**\n     * {@inheritdoc}\n     */\n    public function format(array $record)\n    {\n        // Retrieve the line and file if set and remove them from the formatted extra\n        $backtrace = 'unknown';\n        if (isset($record['extra']['file'], $record['extra']['line'])) {\n            $backtrace = $record['extra']['file'].' : '.$record['extra']['line'];\n            unset($record['extra']['file'], $record['extra']['line']);\n        }\n\n        $message = array('message' => $record['message']);\n        if ($record['context']) {\n            $message['context'] = $record['context'];\n        }\n        if ($record['extra']) {\n            $message['extra'] = $record['extra'];\n        }\n        if (count($message) === 1) {\n            $message = reset($message);\n        }\n\n        return array(\n            $record['channel'],\n            $message,\n            $backtrace,\n            $this->logLevels[$record['level']],\n        );\n    }\n\n    public function formatBatch(array $records)\n    {\n        $formatted = array();\n\n        foreach ($records as $record) {\n            $formatted[] = $this->format($record);\n        }\n\n        return $formatted;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Elastica\\Document;\n\n/**\n * Format a log message into an Elastica Document\n *\n * @author Jelle Vink <jelle.vink@gmail.com>\n */\nclass ElasticaFormatter extends NormalizerFormatter\n{\n    /**\n     * @var string Elastic search index name\n     */\n    protected $index;\n\n    /**\n     * @var string Elastic search document type\n     */\n    protected $type;\n\n    /**\n     * @param string $index Elastic Search index name\n     * @param string $type  Elastic Search document type\n     */\n    public function __construct($index, $type)\n    {\n        // elasticsearch requires a ISO 8601 format date with optional millisecond precision.\n        parent::__construct('Y-m-d\\TH:i:s.uP');\n\n        $this->index = $index;\n        $this->type = $type;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function format(array $record)\n    {\n        $record = parent::format($record);\n\n        return $this->getDocument($record);\n    }\n\n    /**\n     * Getter index\n     * @return string\n     */\n    public function getIndex()\n    {\n        return $this->index;\n    }\n\n    /**\n     * Getter type\n     * @return string\n     */\n    public function getType()\n    {\n        return $this->type;\n    }\n\n    /**\n     * Convert a log message into an Elastica Document\n     *\n     * @param  array    $record Log message\n     * @return Document\n     */\n    protected function getDocument($record)\n    {\n        $document = new Document();\n        $document->setData($record);\n        $document->setType($this->type);\n        $document->setIndex($this->index);\n\n        return $document;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\n/**\n * formats the record to be used in the FlowdockHandler\n *\n * @author Dominik Liebler <liebler.dominik@gmail.com>\n */\nclass FlowdockFormatter implements FormatterInterface\n{\n    /**\n     * @var string\n     */\n    private $source;\n\n    /**\n     * @var string\n     */\n    private $sourceEmail;\n\n    /**\n     * @param string $source\n     * @param string $sourceEmail\n     */\n    public function __construct($source, $sourceEmail)\n    {\n        $this->source = $source;\n        $this->sourceEmail = $sourceEmail;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function format(array $record)\n    {\n        $tags = array(\n            '#logs',\n            '#' . strtolower($record['level_name']),\n            '#' . $record['channel'],\n        );\n\n        foreach ($record['extra'] as $value) {\n            $tags[] = '#' . $value;\n        }\n\n        $subject = sprintf(\n            'in %s: %s - %s',\n            $this->source,\n            $record['level_name'],\n            $this->getShortMessage($record['message'])\n        );\n\n        $record['flowdock'] = array(\n            'source' => $this->source,\n            'from_address' => $this->sourceEmail,\n            'subject' => $subject,\n            'content' => $record['message'],\n            'tags' => $tags,\n            'project' => $this->source,\n        );\n\n        return $record;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function formatBatch(array $records)\n    {\n        $formatted = array();\n\n        foreach ($records as $record) {\n            $formatted[] = $this->format($record);\n        }\n\n        return $formatted;\n    }\n\n    /**\n     * @param string $message\n     *\n     * @return string\n     */\n    public function getShortMessage($message)\n    {\n        static $hasMbString;\n\n        if (null === $hasMbString) {\n            $hasMbString = function_exists('mb_strlen');\n        }\n\n        $maxLength = 45;\n\n        if ($hasMbString) {\n            if (mb_strlen($message, 'UTF-8') > $maxLength) {\n                $message = mb_substr($message, 0, $maxLength - 4, 'UTF-8') . ' ...';\n            }\n        } else {\n            if (strlen($message) > $maxLength) {\n                $message = substr($message, 0, $maxLength - 4) . ' ...';\n            }\n        }\n\n        return $message;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\n/**\n * Class FluentdFormatter\n *\n * Serializes a log message to Fluentd unix socket protocol\n *\n * Fluentd config:\n *\n * <source>\n *  type unix\n *  path /var/run/td-agent/td-agent.sock\n * </source>\n *\n * Monolog setup:\n *\n * $logger = new Monolog\\Logger('fluent.tag');\n * $fluentHandler = new Monolog\\Handler\\SocketHandler('unix:///var/run/td-agent/td-agent.sock');\n * $fluentHandler->setFormatter(new Monolog\\Formatter\\FluentdFormatter());\n * $logger->pushHandler($fluentHandler);\n *\n * @author Andrius Putna <fordnox@gmail.com>\n */\nclass FluentdFormatter implements FormatterInterface\n{\n    /**\n     * @var bool $levelTag should message level be a part of the fluentd tag\n     */\n    protected $levelTag = false;\n\n    public function __construct($levelTag = false)\n    {\n        if (!function_exists('json_encode')) {\n            throw new \\RuntimeException('PHP\\'s json extension is required to use Monolog\\'s FluentdUnixFormatter');\n        }\n\n        $this->levelTag = (bool) $levelTag;\n    }\n\n    public function isUsingLevelsInTag()\n    {\n        return $this->levelTag;\n    }\n\n    public function format(array $record)\n    {\n        $tag = $record['channel'];\n        if ($this->levelTag) {\n            $tag .= '.' . strtolower($record['level_name']);\n        }\n\n        $message = array(\n            'message' => $record['message'],\n            'extra' => $record['extra'],\n        );\n\n        if (!$this->levelTag) {\n            $message['level'] = $record['level'];\n            $message['level_name'] = $record['level_name'];\n        }\n\n        return json_encode(array($tag, $record['datetime']->getTimestamp(), $message));\n    }\n\n    public function formatBatch(array $records)\n    {\n        $message = '';\n        foreach ($records as $record) {\n            $message .= $this->format($record);\n        }\n\n        return $message;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\n/**\n * Interface for formatters\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\ninterface FormatterInterface\n{\n    /**\n     * Formats a log record.\n     *\n     * @param  array $record A record to format\n     * @return mixed The formatted record\n     */\n    public function format(array $record);\n\n    /**\n     * Formats a set of log records.\n     *\n     * @param  array $records A set of records to format\n     * @return mixed The formatted set of records\n     */\n    public function formatBatch(array $records);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\nuse Gelf\\Message;\n\n/**\n * Serializes a log message to GELF\n * @see http://www.graylog2.org/about/gelf\n *\n * @author Matt Lehner <mlehner@gmail.com>\n */\nclass GelfMessageFormatter extends NormalizerFormatter\n{\n    const DEFAULT_MAX_LENGTH = 32766;\n\n    /**\n     * @var string the name of the system for the Gelf log message\n     */\n    protected $systemName;\n\n    /**\n     * @var string a prefix for 'extra' fields from the Monolog record (optional)\n     */\n    protected $extraPrefix;\n\n    /**\n     * @var string a prefix for 'context' fields from the Monolog record (optional)\n     */\n    protected $contextPrefix;\n\n    /**\n     * @var int max length per field\n     */\n    protected $maxLength;\n\n    /**\n     * Translates Monolog log levels to Graylog2 log priorities.\n     */\n    private $logLevels = array(\n        Logger::DEBUG     => 7,\n        Logger::INFO      => 6,\n        Logger::NOTICE    => 5,\n        Logger::WARNING   => 4,\n        Logger::ERROR     => 3,\n        Logger::CRITICAL  => 2,\n        Logger::ALERT     => 1,\n        Logger::EMERGENCY => 0,\n    );\n\n    public function __construct($systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $maxLength = null)\n    {\n        parent::__construct('U.u');\n\n        $this->systemName = $systemName ?: gethostname();\n\n        $this->extraPrefix = $extraPrefix;\n        $this->contextPrefix = $contextPrefix;\n        $this->maxLength = is_null($maxLength) ? self::DEFAULT_MAX_LENGTH : $maxLength;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function format(array $record)\n    {\n        $record = parent::format($record);\n\n        if (!isset($record['datetime'], $record['message'], $record['level'])) {\n            throw new \\InvalidArgumentException('The record should at least contain datetime, message and level keys, '.var_export($record, true).' given');\n        }\n\n        $message = new Message();\n        $message\n            ->setTimestamp($record['datetime'])\n            ->setShortMessage((string) $record['message'])\n            ->setHost($this->systemName)\n            ->setLevel($this->logLevels[$record['level']]);\n\n        // message length + system name length + 200 for padding / metadata \n        $len = 200 + strlen((string) $record['message']) + strlen($this->systemName);\n\n        if ($len > $this->maxLength) {\n            $message->setShortMessage(substr($record['message'], 0, $this->maxLength));\n        }\n\n        if (isset($record['channel'])) {\n            $message->setFacility($record['channel']);\n        }\n        if (isset($record['extra']['line'])) {\n            $message->setLine($record['extra']['line']);\n            unset($record['extra']['line']);\n        }\n        if (isset($record['extra']['file'])) {\n            $message->setFile($record['extra']['file']);\n            unset($record['extra']['file']);\n        }\n\n        foreach ($record['extra'] as $key => $val) {\n            $val = is_scalar($val) || null === $val ? $val : $this->toJson($val);\n            $len = strlen($this->extraPrefix . $key . $val);\n            if ($len > $this->maxLength) {\n                $message->setAdditional($this->extraPrefix . $key, substr($val, 0, $this->maxLength));\n                break;\n            }\n            $message->setAdditional($this->extraPrefix . $key, $val);\n        }\n\n        foreach ($record['context'] as $key => $val) {\n            $val = is_scalar($val) || null === $val ? $val : $this->toJson($val);\n            $len = strlen($this->contextPrefix . $key . $val);\n            if ($len > $this->maxLength) {\n                $message->setAdditional($this->contextPrefix . $key, substr($val, 0, $this->maxLength));\n                break;\n            }\n            $message->setAdditional($this->contextPrefix . $key, $val);\n        }\n\n        if (null === $message->getFile() && isset($record['context']['exception']['file'])) {\n            if (preg_match(\"/^(.+):([0-9]+)$/\", $record['context']['exception']['file'], $matches)) {\n                $message->setFile($matches[1]);\n                $message->setLine($matches[2]);\n            }\n        }\n\n        return $message;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php",
    "content": "<?php\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\n\n/**\n * Formats incoming records into an HTML table\n *\n * This is especially useful for html email logging\n *\n * @author Tiago Brito <tlfbrito@gmail.com>\n */\nclass HtmlFormatter extends NormalizerFormatter\n{\n    /**\n     * Translates Monolog log levels to html color priorities.\n     */\n    protected $logLevels = array(\n        Logger::DEBUG     => '#cccccc',\n        Logger::INFO      => '#468847',\n        Logger::NOTICE    => '#3a87ad',\n        Logger::WARNING   => '#c09853',\n        Logger::ERROR     => '#f0ad4e',\n        Logger::CRITICAL  => '#FF7708',\n        Logger::ALERT     => '#C12A19',\n        Logger::EMERGENCY => '#000000',\n    );\n\n    /**\n     * @param string $dateFormat The format of the timestamp: one supported by DateTime::format\n     */\n    public function __construct($dateFormat = null)\n    {\n        parent::__construct($dateFormat);\n    }\n\n    /**\n     * Creates an HTML table row\n     *\n     * @param  string $th       Row header content\n     * @param  string $td       Row standard cell content\n     * @param  bool   $escapeTd false if td content must not be html escaped\n     * @return string\n     */\n    protected function addRow($th, $td = ' ', $escapeTd = true)\n    {\n        $th = htmlspecialchars($th, ENT_NOQUOTES, 'UTF-8');\n        if ($escapeTd) {\n            $td = '<pre>'.htmlspecialchars($td, ENT_NOQUOTES, 'UTF-8').'</pre>';\n        }\n\n        return \"<tr style=\\\"padding: 4px;spacing: 0;text-align: left;\\\">\\n<th style=\\\"background: #cccccc\\\" width=\\\"100px\\\">$th:</th>\\n<td style=\\\"padding: 4px;spacing: 0;text-align: left;background: #eeeeee\\\">\".$td.\"</td>\\n</tr>\";\n    }\n\n    /**\n     * Create a HTML h1 tag\n     *\n     * @param  string $title Text to be in the h1\n     * @param  int    $level Error level\n     * @return string\n     */\n    protected function addTitle($title, $level)\n    {\n        $title = htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8');\n\n        return '<h1 style=\"background: '.$this->logLevels[$level].';color: #ffffff;padding: 5px;\" class=\"monolog-output\">'.$title.'</h1>';\n    }\n\n    /**\n     * Formats a log record.\n     *\n     * @param  array $record A record to format\n     * @return mixed The formatted record\n     */\n    public function format(array $record)\n    {\n        $output = $this->addTitle($record['level_name'], $record['level']);\n        $output .= '<table cellspacing=\"1\" width=\"100%\" class=\"monolog-output\">';\n\n        $output .= $this->addRow('Message', (string) $record['message']);\n        $output .= $this->addRow('Time', $record['datetime']->format($this->dateFormat));\n        $output .= $this->addRow('Channel', $record['channel']);\n        if ($record['context']) {\n            $embeddedTable = '<table cellspacing=\"1\" width=\"100%\">';\n            foreach ($record['context'] as $key => $value) {\n                $embeddedTable .= $this->addRow($key, $this->convertToString($value));\n            }\n            $embeddedTable .= '</table>';\n            $output .= $this->addRow('Context', $embeddedTable, false);\n        }\n        if ($record['extra']) {\n            $embeddedTable = '<table cellspacing=\"1\" width=\"100%\">';\n            foreach ($record['extra'] as $key => $value) {\n                $embeddedTable .= $this->addRow($key, $this->convertToString($value));\n            }\n            $embeddedTable .= '</table>';\n            $output .= $this->addRow('Extra', $embeddedTable, false);\n        }\n\n        return $output.'</table>';\n    }\n\n    /**\n     * Formats a set of log records.\n     *\n     * @param  array $records A set of records to format\n     * @return mixed The formatted set of records\n     */\n    public function formatBatch(array $records)\n    {\n        $message = '';\n        foreach ($records as $record) {\n            $message .= $this->format($record);\n        }\n\n        return $message;\n    }\n\n    protected function convertToString($data)\n    {\n        if (null === $data || is_scalar($data)) {\n            return (string) $data;\n        }\n\n        $data = $this->normalize($data);\n        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {\n            return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);\n        }\n\n        return str_replace('\\\\/', '/', json_encode($data));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Exception;\nuse Throwable;\n\n/**\n * Encodes whatever record data is passed to it as json\n *\n * This can be useful to log to databases or remote APIs\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass JsonFormatter extends NormalizerFormatter\n{\n    const BATCH_MODE_JSON = 1;\n    const BATCH_MODE_NEWLINES = 2;\n\n    protected $batchMode;\n    protected $appendNewline;\n\n    /**\n     * @var bool\n     */\n    protected $includeStacktraces = false;\n\n    /**\n     * @param int $batchMode\n     * @param bool $appendNewline\n     */\n    public function __construct($batchMode = self::BATCH_MODE_JSON, $appendNewline = true)\n    {\n        $this->batchMode = $batchMode;\n        $this->appendNewline = $appendNewline;\n    }\n\n    /**\n     * The batch mode option configures the formatting style for\n     * multiple records. By default, multiple records will be\n     * formatted as a JSON-encoded array. However, for\n     * compatibility with some API endpoints, alternative styles\n     * are available.\n     *\n     * @return int\n     */\n    public function getBatchMode()\n    {\n        return $this->batchMode;\n    }\n\n    /**\n     * True if newlines are appended to every formatted record\n     *\n     * @return bool\n     */\n    public function isAppendingNewlines()\n    {\n        return $this->appendNewline;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function format(array $record)\n    {\n        return $this->toJson($this->normalize($record), true) . ($this->appendNewline ? \"\\n\" : '');\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function formatBatch(array $records)\n    {\n        switch ($this->batchMode) {\n            case static::BATCH_MODE_NEWLINES:\n                return $this->formatBatchNewlines($records);\n\n            case static::BATCH_MODE_JSON:\n            default:\n                return $this->formatBatchJson($records);\n        }\n    }\n\n    /**\n     * @param bool $include\n     */\n    public function includeStacktraces($include = true)\n    {\n        $this->includeStacktraces = $include;\n    }\n\n    /**\n     * Return a JSON-encoded array of records.\n     *\n     * @param  array  $records\n     * @return string\n     */\n    protected function formatBatchJson(array $records)\n    {\n        return $this->toJson($this->normalize($records), true);\n    }\n\n    /**\n     * Use new lines to separate records instead of a\n     * JSON-encoded array.\n     *\n     * @param  array  $records\n     * @return string\n     */\n    protected function formatBatchNewlines(array $records)\n    {\n        $instance = $this;\n\n        $oldNewline = $this->appendNewline;\n        $this->appendNewline = false;\n        array_walk($records, function (&$value, $key) use ($instance) {\n            $value = $instance->format($value);\n        });\n        $this->appendNewline = $oldNewline;\n\n        return implode(\"\\n\", $records);\n    }\n\n    /**\n     * Normalizes given $data.\n     *\n     * @param mixed $data\n     *\n     * @return mixed\n     */\n    protected function normalize($data)\n    {\n        if (is_array($data) || $data instanceof \\Traversable) {\n            $normalized = array();\n\n            $count = 1;\n            foreach ($data as $key => $value) {\n                if ($count++ >= 1000) {\n                    $normalized['...'] = 'Over 1000 items, aborting normalization';\n                    break;\n                }\n                $normalized[$key] = $this->normalize($value);\n            }\n\n            return $normalized;\n        }\n\n        if ($data instanceof Exception || $data instanceof Throwable) {\n            return $this->normalizeException($data);\n        }\n\n        return $data;\n    }\n\n    /**\n     * Normalizes given exception with or without its own stack trace based on\n     * `includeStacktraces` property.\n     *\n     * @param Exception|Throwable $e\n     *\n     * @return array\n     */\n    protected function normalizeException($e)\n    {\n        // TODO 2.0 only check for Throwable\n        if (!$e instanceof Exception && !$e instanceof Throwable) {\n            throw new \\InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e));\n        }\n\n        $data = array(\n            'class' => get_class($e),\n            'message' => $e->getMessage(),\n            'code' => $e->getCode(),\n            'file' => $e->getFile().':'.$e->getLine(),\n        );\n\n        if ($this->includeStacktraces) {\n            $trace = $e->getTrace();\n            foreach ($trace as $frame) {\n                if (isset($frame['file'])) {\n                    $data['trace'][] = $frame['file'].':'.$frame['line'];\n                } elseif (isset($frame['function']) && $frame['function'] === '{closure}') {\n                    // We should again normalize the frames, because it might contain invalid items\n                    $data['trace'][] = $frame['function'];\n                } else {\n                    // We should again normalize the frames, because it might contain invalid items\n                    $data['trace'][] = $this->normalize($frame);\n                }\n            }\n        }\n\n        if ($previous = $e->getPrevious()) {\n            $data['previous'] = $this->normalizeException($previous);\n        }\n\n        return $data;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\n/**\n * Formats incoming records into a one-line string\n *\n * This is especially useful for logging to files\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @author Christophe Coevoet <stof@notk.org>\n */\nclass LineFormatter extends NormalizerFormatter\n{\n    const SIMPLE_FORMAT = \"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\\n\";\n\n    protected $format;\n    protected $allowInlineLineBreaks;\n    protected $ignoreEmptyContextAndExtra;\n    protected $includeStacktraces;\n\n    /**\n     * @param string $format                     The format of the message\n     * @param string $dateFormat                 The format of the timestamp: one supported by DateTime::format\n     * @param bool   $allowInlineLineBreaks      Whether to allow inline line breaks in log entries\n     * @param bool   $ignoreEmptyContextAndExtra\n     */\n    public function __construct($format = null, $dateFormat = null, $allowInlineLineBreaks = false, $ignoreEmptyContextAndExtra = false)\n    {\n        $this->format = $format ?: static::SIMPLE_FORMAT;\n        $this->allowInlineLineBreaks = $allowInlineLineBreaks;\n        $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra;\n        parent::__construct($dateFormat);\n    }\n\n    public function includeStacktraces($include = true)\n    {\n        $this->includeStacktraces = $include;\n        if ($this->includeStacktraces) {\n            $this->allowInlineLineBreaks = true;\n        }\n    }\n\n    public function allowInlineLineBreaks($allow = true)\n    {\n        $this->allowInlineLineBreaks = $allow;\n    }\n\n    public function ignoreEmptyContextAndExtra($ignore = true)\n    {\n        $this->ignoreEmptyContextAndExtra = $ignore;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function format(array $record)\n    {\n        $vars = parent::format($record);\n\n        $output = $this->format;\n\n        foreach ($vars['extra'] as $var => $val) {\n            if (false !== strpos($output, '%extra.'.$var.'%')) {\n                $output = str_replace('%extra.'.$var.'%', $this->stringify($val), $output);\n                unset($vars['extra'][$var]);\n            }\n        }\n\n\n        foreach ($vars['context'] as $var => $val) {\n            if (false !== strpos($output, '%context.'.$var.'%')) {\n                $output = str_replace('%context.'.$var.'%', $this->stringify($val), $output);\n                unset($vars['context'][$var]);\n            }\n        }\n\n        if ($this->ignoreEmptyContextAndExtra) {\n            if (empty($vars['context'])) {\n                unset($vars['context']);\n                $output = str_replace('%context%', '', $output);\n            }\n\n            if (empty($vars['extra'])) {\n                unset($vars['extra']);\n                $output = str_replace('%extra%', '', $output);\n            }\n        }\n\n        foreach ($vars as $var => $val) {\n            if (false !== strpos($output, '%'.$var.'%')) {\n                $output = str_replace('%'.$var.'%', $this->stringify($val), $output);\n            }\n        }\n\n        // remove leftover %extra.xxx% and %context.xxx% if any\n        if (false !== strpos($output, '%')) {\n            $output = preg_replace('/%(?:extra|context)\\..+?%/', '', $output);\n        }\n\n        return $output;\n    }\n\n    public function formatBatch(array $records)\n    {\n        $message = '';\n        foreach ($records as $record) {\n            $message .= $this->format($record);\n        }\n\n        return $message;\n    }\n\n    public function stringify($value)\n    {\n        return $this->replaceNewlines($this->convertToString($value));\n    }\n\n    protected function normalizeException($e)\n    {\n        // TODO 2.0 only check for Throwable\n        if (!$e instanceof \\Exception && !$e instanceof \\Throwable) {\n            throw new \\InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e));\n        }\n\n        $previousText = '';\n        if ($previous = $e->getPrevious()) {\n            do {\n                $previousText .= ', '.get_class($previous).'(code: '.$previous->getCode().'): '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine();\n            } while ($previous = $previous->getPrevious());\n        }\n\n        $str = '[object] ('.get_class($e).'(code: '.$e->getCode().'): '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().$previousText.')';\n        if ($this->includeStacktraces) {\n            $str .= \"\\n[stacktrace]\\n\".$e->getTraceAsString().\"\\n\";\n        }\n\n        return $str;\n    }\n\n    protected function convertToString($data)\n    {\n        if (null === $data || is_bool($data)) {\n            return var_export($data, true);\n        }\n\n        if (is_scalar($data)) {\n            return (string) $data;\n        }\n\n        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {\n            return $this->toJson($data, true);\n        }\n\n        return str_replace('\\\\/', '/', @json_encode($data));\n    }\n\n    protected function replaceNewlines($str)\n    {\n        if ($this->allowInlineLineBreaks) {\n            if (0 === strpos($str, '{')) {\n                return str_replace(array('\\r', '\\n'), array(\"\\r\", \"\\n\"), $str);\n            }\n\n            return $str;\n        }\n\n        return str_replace(array(\"\\r\\n\", \"\\r\", \"\\n\"), ' ', $str);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\n/**\n * Encodes message information into JSON in a format compatible with Loggly.\n *\n * @author Adam Pancutt <adam@pancutt.com>\n */\nclass LogglyFormatter extends JsonFormatter\n{\n    /**\n     * Overrides the default batch mode to new lines for compatibility with the\n     * Loggly bulk API.\n     *\n     * @param int $batchMode\n     */\n    public function __construct($batchMode = self::BATCH_MODE_NEWLINES, $appendNewline = false)\n    {\n        parent::__construct($batchMode, $appendNewline);\n    }\n\n    /**\n     * Appends the 'timestamp' parameter for indexing by Loggly.\n     *\n     * @see https://www.loggly.com/docs/automated-parsing/#json\n     * @see \\Monolog\\Formatter\\JsonFormatter::format()\n     */\n    public function format(array $record)\n    {\n        if (isset($record[\"datetime\"]) && ($record[\"datetime\"] instanceof \\DateTime)) {\n            $record[\"timestamp\"] = $record[\"datetime\"]->format(\"Y-m-d\\TH:i:s.uO\");\n            // TODO 2.0 unset the 'datetime' parameter, retained for BC\n        }\n\n        return parent::format($record);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\n/**\n * Serializes a log message to Logstash Event Format\n *\n * @see http://logstash.net/\n * @see https://github.com/logstash/logstash/blob/master/lib/logstash/event.rb\n *\n * @author Tim Mower <timothy.mower@gmail.com>\n */\nclass LogstashFormatter extends NormalizerFormatter\n{\n    const V0 = 0;\n    const V1 = 1;\n\n    /**\n     * @var string the name of the system for the Logstash log message, used to fill the @source field\n     */\n    protected $systemName;\n\n    /**\n     * @var string an application name for the Logstash log message, used to fill the @type field\n     */\n    protected $applicationName;\n\n    /**\n     * @var string a prefix for 'extra' fields from the Monolog record (optional)\n     */\n    protected $extraPrefix;\n\n    /**\n     * @var string a prefix for 'context' fields from the Monolog record (optional)\n     */\n    protected $contextPrefix;\n\n    /**\n     * @var int logstash format version to use\n     */\n    protected $version;\n\n    /**\n     * @param string $applicationName the application that sends the data, used as the \"type\" field of logstash\n     * @param string $systemName      the system/machine name, used as the \"source\" field of logstash, defaults to the hostname of the machine\n     * @param string $extraPrefix     prefix for extra keys inside logstash \"fields\"\n     * @param string $contextPrefix   prefix for context keys inside logstash \"fields\", defaults to ctxt_\n     * @param int    $version         the logstash format version to use, defaults to 0\n     */\n    public function __construct($applicationName, $systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $version = self::V0)\n    {\n        // logstash requires a ISO 8601 format date with optional millisecond precision.\n        parent::__construct('Y-m-d\\TH:i:s.uP');\n\n        $this->systemName = $systemName ?: gethostname();\n        $this->applicationName = $applicationName;\n        $this->extraPrefix = $extraPrefix;\n        $this->contextPrefix = $contextPrefix;\n        $this->version = $version;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function format(array $record)\n    {\n        $record = parent::format($record);\n\n        if ($this->version === self::V1) {\n            $message = $this->formatV1($record);\n        } else {\n            $message = $this->formatV0($record);\n        }\n\n        return $this->toJson($message) . \"\\n\";\n    }\n\n    protected function formatV0(array $record)\n    {\n        if (empty($record['datetime'])) {\n            $record['datetime'] = gmdate('c');\n        }\n        $message = array(\n            '@timestamp' => $record['datetime'],\n            '@source' => $this->systemName,\n            '@fields' => array(),\n        );\n        if (isset($record['message'])) {\n            $message['@message'] = $record['message'];\n        }\n        if (isset($record['channel'])) {\n            $message['@tags'] = array($record['channel']);\n            $message['@fields']['channel'] = $record['channel'];\n        }\n        if (isset($record['level'])) {\n            $message['@fields']['level'] = $record['level'];\n        }\n        if ($this->applicationName) {\n            $message['@type'] = $this->applicationName;\n        }\n        if (isset($record['extra']['server'])) {\n            $message['@source_host'] = $record['extra']['server'];\n        }\n        if (isset($record['extra']['url'])) {\n            $message['@source_path'] = $record['extra']['url'];\n        }\n        if (!empty($record['extra'])) {\n            foreach ($record['extra'] as $key => $val) {\n                $message['@fields'][$this->extraPrefix . $key] = $val;\n            }\n        }\n        if (!empty($record['context'])) {\n            foreach ($record['context'] as $key => $val) {\n                $message['@fields'][$this->contextPrefix . $key] = $val;\n            }\n        }\n\n        return $message;\n    }\n\n    protected function formatV1(array $record)\n    {\n        if (empty($record['datetime'])) {\n            $record['datetime'] = gmdate('c');\n        }\n        $message = array(\n            '@timestamp' => $record['datetime'],\n            '@version' => 1,\n            'host' => $this->systemName,\n        );\n        if (isset($record['message'])) {\n            $message['message'] = $record['message'];\n        }\n        if (isset($record['channel'])) {\n            $message['type'] = $record['channel'];\n            $message['channel'] = $record['channel'];\n        }\n        if (isset($record['level_name'])) {\n            $message['level'] = $record['level_name'];\n        }\n        if ($this->applicationName) {\n            $message['type'] = $this->applicationName;\n        }\n        if (!empty($record['extra'])) {\n            foreach ($record['extra'] as $key => $val) {\n                $message[$this->extraPrefix . $key] = $val;\n            }\n        }\n        if (!empty($record['context'])) {\n            foreach ($record['context'] as $key => $val) {\n                $message[$this->contextPrefix . $key] = $val;\n            }\n        }\n\n        return $message;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\n/**\n * Formats a record for use with the MongoDBHandler.\n *\n * @author Florian Plattner <me@florianplattner.de>\n */\nclass MongoDBFormatter implements FormatterInterface\n{\n    private $exceptionTraceAsString;\n    private $maxNestingLevel;\n\n    /**\n     * @param int  $maxNestingLevel        0 means infinite nesting, the $record itself is level 1, $record['context'] is 2\n     * @param bool $exceptionTraceAsString set to false to log exception traces as a sub documents instead of strings\n     */\n    public function __construct($maxNestingLevel = 3, $exceptionTraceAsString = true)\n    {\n        $this->maxNestingLevel = max($maxNestingLevel, 0);\n        $this->exceptionTraceAsString = (bool) $exceptionTraceAsString;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function format(array $record)\n    {\n        return $this->formatArray($record);\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function formatBatch(array $records)\n    {\n        foreach ($records as $key => $record) {\n            $records[$key] = $this->format($record);\n        }\n\n        return $records;\n    }\n\n    protected function formatArray(array $record, $nestingLevel = 0)\n    {\n        if ($this->maxNestingLevel == 0 || $nestingLevel <= $this->maxNestingLevel) {\n            foreach ($record as $name => $value) {\n                if ($value instanceof \\DateTime) {\n                    $record[$name] = $this->formatDate($value, $nestingLevel + 1);\n                } elseif ($value instanceof \\Exception) {\n                    $record[$name] = $this->formatException($value, $nestingLevel + 1);\n                } elseif (is_array($value)) {\n                    $record[$name] = $this->formatArray($value, $nestingLevel + 1);\n                } elseif (is_object($value)) {\n                    $record[$name] = $this->formatObject($value, $nestingLevel + 1);\n                }\n            }\n        } else {\n            $record = '[...]';\n        }\n\n        return $record;\n    }\n\n    protected function formatObject($value, $nestingLevel)\n    {\n        $objectVars = get_object_vars($value);\n        $objectVars['class'] = get_class($value);\n\n        return $this->formatArray($objectVars, $nestingLevel);\n    }\n\n    protected function formatException(\\Exception $exception, $nestingLevel)\n    {\n        $formattedException = array(\n            'class' => get_class($exception),\n            'message' => $exception->getMessage(),\n            'code' => $exception->getCode(),\n            'file' => $exception->getFile() . ':' . $exception->getLine(),\n        );\n\n        if ($this->exceptionTraceAsString === true) {\n            $formattedException['trace'] = $exception->getTraceAsString();\n        } else {\n            $formattedException['trace'] = $exception->getTrace();\n        }\n\n        return $this->formatArray($formattedException, $nestingLevel);\n    }\n\n    protected function formatDate(\\DateTime $value, $nestingLevel)\n    {\n        return new \\MongoDate($value->getTimestamp());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Exception;\n\n/**\n * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass NormalizerFormatter implements FormatterInterface\n{\n    const SIMPLE_DATE = \"Y-m-d H:i:s\";\n\n    protected $dateFormat;\n\n    /**\n     * @param string $dateFormat The format of the timestamp: one supported by DateTime::format\n     */\n    public function __construct($dateFormat = null)\n    {\n        $this->dateFormat = $dateFormat ?: static::SIMPLE_DATE;\n        if (!function_exists('json_encode')) {\n            throw new \\RuntimeException('PHP\\'s json extension is required to use Monolog\\'s NormalizerFormatter');\n        }\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function format(array $record)\n    {\n        return $this->normalize($record);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function formatBatch(array $records)\n    {\n        foreach ($records as $key => $record) {\n            $records[$key] = $this->format($record);\n        }\n\n        return $records;\n    }\n\n    protected function normalize($data)\n    {\n        if (null === $data || is_scalar($data)) {\n            if (is_float($data)) {\n                if (is_infinite($data)) {\n                    return ($data > 0 ? '' : '-') . 'INF';\n                }\n                if (is_nan($data)) {\n                    return 'NaN';\n                }\n            }\n\n            return $data;\n        }\n\n        if (is_array($data)) {\n            $normalized = array();\n\n            $count = 1;\n            foreach ($data as $key => $value) {\n                if ($count++ >= 1000) {\n                    $normalized['...'] = 'Over 1000 items ('.count($data).' total), aborting normalization';\n                    break;\n                }\n                $normalized[$key] = $this->normalize($value);\n            }\n\n            return $normalized;\n        }\n\n        if ($data instanceof \\DateTime) {\n            return $data->format($this->dateFormat);\n        }\n\n        if (is_object($data)) {\n            // TODO 2.0 only check for Throwable\n            if ($data instanceof Exception || (PHP_VERSION_ID > 70000 && $data instanceof \\Throwable)) {\n                return $this->normalizeException($data);\n            }\n\n            // non-serializable objects that implement __toString stringified\n            if (method_exists($data, '__toString') && !$data instanceof \\JsonSerializable) {\n                $value = $data->__toString();\n            } else {\n                // the rest is json-serialized in some way\n                $value = $this->toJson($data, true);\n            }\n\n            return sprintf(\"[object] (%s: %s)\", get_class($data), $value);\n        }\n\n        if (is_resource($data)) {\n            return sprintf('[resource] (%s)', get_resource_type($data));\n        }\n\n        return '[unknown('.gettype($data).')]';\n    }\n\n    protected function normalizeException($e)\n    {\n        // TODO 2.0 only check for Throwable\n        if (!$e instanceof Exception && !$e instanceof \\Throwable) {\n            throw new \\InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e));\n        }\n\n        $data = array(\n            'class' => get_class($e),\n            'message' => $e->getMessage(),\n            'code' => $e->getCode(),\n            'file' => $e->getFile().':'.$e->getLine(),\n        );\n\n        if ($e instanceof \\SoapFault) {\n            if (isset($e->faultcode)) {\n                $data['faultcode'] = $e->faultcode;\n            }\n\n            if (isset($e->faultactor)) {\n                $data['faultactor'] = $e->faultactor;\n            }\n\n            if (isset($e->detail)) {\n                $data['detail'] = $e->detail;\n            }\n        }\n\n        $trace = $e->getTrace();\n        foreach ($trace as $frame) {\n            if (isset($frame['file'])) {\n                $data['trace'][] = $frame['file'].':'.$frame['line'];\n            } elseif (isset($frame['function']) && $frame['function'] === '{closure}') {\n                // We should again normalize the frames, because it might contain invalid items\n                $data['trace'][] = $frame['function'];\n            } else {\n                // We should again normalize the frames, because it might contain invalid items\n                $data['trace'][] = $this->toJson($this->normalize($frame), true);\n            }\n        }\n\n        if ($previous = $e->getPrevious()) {\n            $data['previous'] = $this->normalizeException($previous);\n        }\n\n        return $data;\n    }\n\n    /**\n     * Return the JSON representation of a value\n     *\n     * @param  mixed             $data\n     * @param  bool              $ignoreErrors\n     * @throws \\RuntimeException if encoding fails and errors are not ignored\n     * @return string\n     */\n    protected function toJson($data, $ignoreErrors = false)\n    {\n        // suppress json_encode errors since it's twitchy with some inputs\n        if ($ignoreErrors) {\n            return @$this->jsonEncode($data);\n        }\n\n        $json = $this->jsonEncode($data);\n\n        if ($json === false) {\n            $json = $this->handleJsonError(json_last_error(), $data);\n        }\n\n        return $json;\n    }\n\n    /**\n     * @param  mixed  $data\n     * @return string JSON encoded data or null on failure\n     */\n    private function jsonEncode($data)\n    {\n        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {\n            return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);\n        }\n\n        return json_encode($data);\n    }\n\n    /**\n     * Handle a json_encode failure.\n     *\n     * If the failure is due to invalid string encoding, try to clean the\n     * input and encode again. If the second encoding attempt fails, the\n     * inital error is not encoding related or the input can't be cleaned then\n     * raise a descriptive exception.\n     *\n     * @param  int               $code return code of json_last_error function\n     * @param  mixed             $data data that was meant to be encoded\n     * @throws \\RuntimeException if failure can't be corrected\n     * @return string            JSON encoded data after error correction\n     */\n    private function handleJsonError($code, $data)\n    {\n        if ($code !== JSON_ERROR_UTF8) {\n            $this->throwEncodeError($code, $data);\n        }\n\n        if (is_string($data)) {\n            $this->detectAndCleanUtf8($data);\n        } elseif (is_array($data)) {\n            array_walk_recursive($data, array($this, 'detectAndCleanUtf8'));\n        } else {\n            $this->throwEncodeError($code, $data);\n        }\n\n        $json = $this->jsonEncode($data);\n\n        if ($json === false) {\n            $this->throwEncodeError(json_last_error(), $data);\n        }\n\n        return $json;\n    }\n\n    /**\n     * Throws an exception according to a given code with a customized message\n     *\n     * @param  int               $code return code of json_last_error function\n     * @param  mixed             $data data that was meant to be encoded\n     * @throws \\RuntimeException\n     */\n    private function throwEncodeError($code, $data)\n    {\n        switch ($code) {\n            case JSON_ERROR_DEPTH:\n                $msg = 'Maximum stack depth exceeded';\n                break;\n            case JSON_ERROR_STATE_MISMATCH:\n                $msg = 'Underflow or the modes mismatch';\n                break;\n            case JSON_ERROR_CTRL_CHAR:\n                $msg = 'Unexpected control character found';\n                break;\n            case JSON_ERROR_UTF8:\n                $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded';\n                break;\n            default:\n                $msg = 'Unknown error';\n        }\n\n        throw new \\RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true));\n    }\n\n    /**\n     * Detect invalid UTF-8 string characters and convert to valid UTF-8.\n     *\n     * Valid UTF-8 input will be left unmodified, but strings containing\n     * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed\n     * original encoding of ISO-8859-15. This conversion may result in\n     * incorrect output if the actual encoding was not ISO-8859-15, but it\n     * will be clean UTF-8 output and will not rely on expensive and fragile\n     * detection algorithms.\n     *\n     * Function converts the input in place in the passed variable so that it\n     * can be used as a callback for array_walk_recursive.\n     *\n     * @param mixed &$data Input to check and convert if needed\n     * @private\n     */\n    public function detectAndCleanUtf8(&$data)\n    {\n        if (is_string($data) && !preg_match('//u', $data)) {\n            $data = preg_replace_callback(\n                '/[\\x80-\\xFF]+/',\n                function ($m) { return utf8_encode($m[0]); },\n                $data\n            );\n            $data = str_replace(\n                array('¤', '¦', '¨', '´', '¸', '¼', '½', '¾'),\n                array('€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'),\n                $data\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\n/**\n * Formats data into an associative array of scalar values.\n * Objects and arrays will be JSON encoded.\n *\n * @author Andrew Lawson <adlawson@gmail.com>\n */\nclass ScalarFormatter extends NormalizerFormatter\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function format(array $record)\n    {\n        foreach ($record as $key => $value) {\n            $record[$key] = $this->normalizeValue($value);\n        }\n\n        return $record;\n    }\n\n    /**\n     * @param  mixed $value\n     * @return mixed\n     */\n    protected function normalizeValue($value)\n    {\n        $normalized = $this->normalize($value);\n\n        if (is_array($normalized) || is_object($normalized)) {\n            return $this->toJson($normalized, true);\n        }\n\n        return $normalized;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\n\n/**\n * Serializes a log message according to Wildfire's header requirements\n *\n * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com>\n * @author Christophe Coevoet <stof@notk.org>\n * @author Kirill chEbba Chebunin <iam@chebba.org>\n */\nclass WildfireFormatter extends NormalizerFormatter\n{\n    const TABLE = 'table';\n\n    /**\n     * Translates Monolog log levels to Wildfire levels.\n     */\n    private $logLevels = array(\n        Logger::DEBUG     => 'LOG',\n        Logger::INFO      => 'INFO',\n        Logger::NOTICE    => 'INFO',\n        Logger::WARNING   => 'WARN',\n        Logger::ERROR     => 'ERROR',\n        Logger::CRITICAL  => 'ERROR',\n        Logger::ALERT     => 'ERROR',\n        Logger::EMERGENCY => 'ERROR',\n    );\n\n    /**\n     * {@inheritdoc}\n     */\n    public function format(array $record)\n    {\n        // Retrieve the line and file if set and remove them from the formatted extra\n        $file = $line = '';\n        if (isset($record['extra']['file'])) {\n            $file = $record['extra']['file'];\n            unset($record['extra']['file']);\n        }\n        if (isset($record['extra']['line'])) {\n            $line = $record['extra']['line'];\n            unset($record['extra']['line']);\n        }\n\n        $record = $this->normalize($record);\n        $message = array('message' => $record['message']);\n        $handleError = false;\n        if ($record['context']) {\n            $message['context'] = $record['context'];\n            $handleError = true;\n        }\n        if ($record['extra']) {\n            $message['extra'] = $record['extra'];\n            $handleError = true;\n        }\n        if (count($message) === 1) {\n            $message = reset($message);\n        }\n\n        if (isset($record['context'][self::TABLE])) {\n            $type  = 'TABLE';\n            $label = $record['channel'] .': '. $record['message'];\n            $message = $record['context'][self::TABLE];\n        } else {\n            $type  = $this->logLevels[$record['level']];\n            $label = $record['channel'];\n        }\n\n        // Create JSON object describing the appearance of the message in the console\n        $json = $this->toJson(array(\n            array(\n                'Type'  => $type,\n                'File'  => $file,\n                'Line'  => $line,\n                'Label' => $label,\n            ),\n            $message,\n        ), $handleError);\n\n        // The message itself is a serialization of the above JSON object + it's length\n        return sprintf(\n            '%s|%s|',\n            strlen($json),\n            $json\n        );\n    }\n\n    public function formatBatch(array $records)\n    {\n        throw new \\BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter');\n    }\n\n    protected function normalize($data)\n    {\n        if (is_object($data) && !$data instanceof \\DateTime) {\n            return $data;\n        }\n\n        return parent::normalize($data);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\LineFormatter;\n\n/**\n * Base Handler class providing the Handler structure\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nabstract class AbstractHandler implements HandlerInterface\n{\n    protected $level = Logger::DEBUG;\n    protected $bubble = true;\n\n    /**\n     * @var FormatterInterface\n     */\n    protected $formatter;\n    protected $processors = array();\n\n    /**\n     * @param int     $level  The minimum logging level at which this handler will be triggered\n     * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct($level = Logger::DEBUG, $bubble = true)\n    {\n        $this->setLevel($level);\n        $this->bubble = $bubble;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function isHandling(array $record)\n    {\n        return $record['level'] >= $this->level;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handleBatch(array $records)\n    {\n        foreach ($records as $record) {\n            $this->handle($record);\n        }\n    }\n\n    /**\n     * Closes the handler.\n     *\n     * This will be called automatically when the object is destroyed\n     */\n    public function close()\n    {\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function pushProcessor($callback)\n    {\n        if (!is_callable($callback)) {\n            throw new \\InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given');\n        }\n        array_unshift($this->processors, $callback);\n\n        return $this;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function popProcessor()\n    {\n        if (!$this->processors) {\n            throw new \\LogicException('You tried to pop from an empty processor stack.');\n        }\n\n        return array_shift($this->processors);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function setFormatter(FormatterInterface $formatter)\n    {\n        $this->formatter = $formatter;\n\n        return $this;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getFormatter()\n    {\n        if (!$this->formatter) {\n            $this->formatter = $this->getDefaultFormatter();\n        }\n\n        return $this->formatter;\n    }\n\n    /**\n     * Sets minimum logging level at which this handler will be triggered.\n     *\n     * @param  int|string $level Level or level name\n     * @return self\n     */\n    public function setLevel($level)\n    {\n        $this->level = Logger::toMonologLevel($level);\n\n        return $this;\n    }\n\n    /**\n     * Gets minimum logging level at which this handler will be triggered.\n     *\n     * @return int\n     */\n    public function getLevel()\n    {\n        return $this->level;\n    }\n\n    /**\n     * Sets the bubbling behavior.\n     *\n     * @param  Boolean $bubble true means that this handler allows bubbling.\n     *                         false means that bubbling is not permitted.\n     * @return self\n     */\n    public function setBubble($bubble)\n    {\n        $this->bubble = $bubble;\n\n        return $this;\n    }\n\n    /**\n     * Gets the bubbling behavior.\n     *\n     * @return Boolean true means that this handler allows bubbling.\n     *                 false means that bubbling is not permitted.\n     */\n    public function getBubble()\n    {\n        return $this->bubble;\n    }\n\n    public function __destruct()\n    {\n        try {\n            $this->close();\n        } catch (\\Exception $e) {\n            // do nothing\n        } catch (\\Throwable $e) {\n            // do nothing\n        }\n    }\n\n    /**\n     * Gets the default formatter.\n     *\n     * @return FormatterInterface\n     */\n    protected function getDefaultFormatter()\n    {\n        return new LineFormatter();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\n/**\n * Base Handler class providing the Handler structure\n *\n * Classes extending it should (in most cases) only implement write($record)\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @author Christophe Coevoet <stof@notk.org>\n */\nabstract class AbstractProcessingHandler extends AbstractHandler\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function handle(array $record)\n    {\n        if (!$this->isHandling($record)) {\n            return false;\n        }\n\n        $record = $this->processRecord($record);\n\n        $record['formatted'] = $this->getFormatter()->format($record);\n\n        $this->write($record);\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * Writes the record down to the log of the implementing handler\n     *\n     * @param  array $record\n     * @return void\n     */\n    abstract protected function write(array $record);\n\n    /**\n     * Processes a record.\n     *\n     * @param  array $record\n     * @return array\n     */\n    protected function processRecord(array $record)\n    {\n        if ($this->processors) {\n            foreach ($this->processors as $processor) {\n                $record = call_user_func($processor, $record);\n            }\n        }\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\LineFormatter;\n\n/**\n * Common syslog functionality\n */\nabstract class AbstractSyslogHandler extends AbstractProcessingHandler\n{\n    protected $facility;\n\n    /**\n     * Translates Monolog log levels to syslog log priorities.\n     */\n    protected $logLevels = array(\n        Logger::DEBUG     => LOG_DEBUG,\n        Logger::INFO      => LOG_INFO,\n        Logger::NOTICE    => LOG_NOTICE,\n        Logger::WARNING   => LOG_WARNING,\n        Logger::ERROR     => LOG_ERR,\n        Logger::CRITICAL  => LOG_CRIT,\n        Logger::ALERT     => LOG_ALERT,\n        Logger::EMERGENCY => LOG_EMERG,\n    );\n\n    /**\n     * List of valid log facility names.\n     */\n    protected $facilities = array(\n        'auth'     => LOG_AUTH,\n        'authpriv' => LOG_AUTHPRIV,\n        'cron'     => LOG_CRON,\n        'daemon'   => LOG_DAEMON,\n        'kern'     => LOG_KERN,\n        'lpr'      => LOG_LPR,\n        'mail'     => LOG_MAIL,\n        'news'     => LOG_NEWS,\n        'syslog'   => LOG_SYSLOG,\n        'user'     => LOG_USER,\n        'uucp'     => LOG_UUCP,\n    );\n\n    /**\n     * @param mixed   $facility\n     * @param int     $level    The minimum logging level at which this handler will be triggered\n     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct($facility = LOG_USER, $level = Logger::DEBUG, $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        if (!defined('PHP_WINDOWS_VERSION_BUILD')) {\n            $this->facilities['local0'] = LOG_LOCAL0;\n            $this->facilities['local1'] = LOG_LOCAL1;\n            $this->facilities['local2'] = LOG_LOCAL2;\n            $this->facilities['local3'] = LOG_LOCAL3;\n            $this->facilities['local4'] = LOG_LOCAL4;\n            $this->facilities['local5'] = LOG_LOCAL5;\n            $this->facilities['local6'] = LOG_LOCAL6;\n            $this->facilities['local7'] = LOG_LOCAL7;\n        } else {\n            $this->facilities['local0'] = 128; // LOG_LOCAL0\n            $this->facilities['local1'] = 136; // LOG_LOCAL1\n            $this->facilities['local2'] = 144; // LOG_LOCAL2\n            $this->facilities['local3'] = 152; // LOG_LOCAL3\n            $this->facilities['local4'] = 160; // LOG_LOCAL4\n            $this->facilities['local5'] = 168; // LOG_LOCAL5\n            $this->facilities['local6'] = 176; // LOG_LOCAL6\n            $this->facilities['local7'] = 184; // LOG_LOCAL7\n        }\n\n        // convert textual description of facility to syslog constant\n        if (array_key_exists(strtolower($facility), $this->facilities)) {\n            $facility = $this->facilities[strtolower($facility)];\n        } elseif (!in_array($facility, array_values($this->facilities), true)) {\n            throw new \\UnexpectedValueException('Unknown facility value \"'.$facility.'\" given');\n        }\n\n        $this->facility = $facility;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new LineFormatter('%channel%.%level_name%: %message% %context% %extra%');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\JsonFormatter;\nuse PhpAmqpLib\\Message\\AMQPMessage;\nuse PhpAmqpLib\\Channel\\AMQPChannel;\nuse AMQPExchange;\n\nclass AmqpHandler extends AbstractProcessingHandler\n{\n    /**\n     * @var AMQPExchange|AMQPChannel $exchange\n     */\n    protected $exchange;\n\n    /**\n     * @var string\n     */\n    protected $exchangeName;\n\n    /**\n     * @param AMQPExchange|AMQPChannel $exchange     AMQPExchange (php AMQP ext) or PHP AMQP lib channel, ready for use\n     * @param string                   $exchangeName\n     * @param int                      $level\n     * @param bool                     $bubble       Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct($exchange, $exchangeName = 'log', $level = Logger::DEBUG, $bubble = true)\n    {\n        if ($exchange instanceof AMQPExchange) {\n            $exchange->setName($exchangeName);\n        } elseif ($exchange instanceof AMQPChannel) {\n            $this->exchangeName = $exchangeName;\n        } else {\n            throw new \\InvalidArgumentException('PhpAmqpLib\\Channel\\AMQPChannel or AMQPExchange instance required');\n        }\n        $this->exchange = $exchange;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function write(array $record)\n    {\n        $data = $record[\"formatted\"];\n        $routingKey = $this->getRoutingKey($record);\n\n        if ($this->exchange instanceof AMQPExchange) {\n            $this->exchange->publish(\n                $data,\n                $routingKey,\n                0,\n                array(\n                    'delivery_mode' => 2,\n                    'content_type' => 'application/json',\n                )\n            );\n        } else {\n            $this->exchange->basic_publish(\n                $this->createAmqpMessage($data),\n                $this->exchangeName,\n                $routingKey\n            );\n        }\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function handleBatch(array $records)\n    {\n        if ($this->exchange instanceof AMQPExchange) {\n            parent::handleBatch($records);\n\n            return;\n        }\n\n        foreach ($records as $record) {\n            if (!$this->isHandling($record)) {\n                continue;\n            }\n\n            $record = $this->processRecord($record);\n            $data = $this->getFormatter()->format($record);\n\n            $this->exchange->batch_basic_publish(\n                $this->createAmqpMessage($data),\n                $this->exchangeName,\n                $this->getRoutingKey($record)\n            );\n        }\n\n        $this->exchange->publish_batch();\n    }\n\n    /**\n     * Gets the routing key for the AMQP exchange\n     *\n     * @param  array  $record\n     * @return string\n     */\n    protected function getRoutingKey(array $record)\n    {\n        $routingKey = sprintf(\n            '%s.%s',\n            // TODO 2.0 remove substr call\n            substr($record['level_name'], 0, 4),\n            $record['channel']\n        );\n\n        return strtolower($routingKey);\n    }\n\n    /**\n     * @param  string      $data\n     * @return AMQPMessage\n     */\n    private function createAmqpMessage($data)\n    {\n        return new AMQPMessage(\n            (string) $data,\n            array(\n                'delivery_mode' => 2,\n                'content_type' => 'application/json',\n            )\n        );\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\LineFormatter;\n\n/**\n * Handler sending logs to browser's javascript console with no browser extension required\n *\n * @author Olivier Poitrey <rs@dailymotion.com>\n */\nclass BrowserConsoleHandler extends AbstractProcessingHandler\n{\n    protected static $initialized = false;\n    protected static $records = array();\n\n    /**\n     * {@inheritDoc}\n     *\n     * Formatted output may contain some formatting markers to be transferred to `console.log` using the %c format.\n     *\n     * Example of formatted string:\n     *\n     *     You can do [[blue text]]{color: blue} or [[green background]]{background-color: green; color: white}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new LineFormatter('[[%channel%]]{macro: autolabel} [[%level_name%]]{font-weight: bold} %message%');\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function write(array $record)\n    {\n        // Accumulate records\n        self::$records[] = $record;\n\n        // Register shutdown handler if not already done\n        if (!self::$initialized) {\n            self::$initialized = true;\n            $this->registerShutdownFunction();\n        }\n    }\n\n    /**\n     * Convert records to javascript console commands and send it to the browser.\n     * This method is automatically called on PHP shutdown if output is HTML or Javascript.\n     */\n    public static function send()\n    {\n        $format = self::getResponseFormat();\n        if ($format === 'unknown') {\n            return;\n        }\n\n        if (count(self::$records)) {\n            if ($format === 'html') {\n                self::writeOutput('<script>' . self::generateScript() . '</script>');\n            } elseif ($format === 'js') {\n                self::writeOutput(self::generateScript());\n            }\n            self::reset();\n        }\n    }\n\n    /**\n     * Forget all logged records\n     */\n    public static function reset()\n    {\n        self::$records = array();\n    }\n\n    /**\n     * Wrapper for register_shutdown_function to allow overriding\n     */\n    protected function registerShutdownFunction()\n    {\n        if (PHP_SAPI !== 'cli') {\n            register_shutdown_function(array('Monolog\\Handler\\BrowserConsoleHandler', 'send'));\n        }\n    }\n\n    /**\n     * Wrapper for echo to allow overriding\n     *\n     * @param string $str\n     */\n    protected static function writeOutput($str)\n    {\n        echo $str;\n    }\n\n    /**\n     * Checks the format of the response\n     *\n     * If Content-Type is set to application/javascript or text/javascript -> js\n     * If Content-Type is set to text/html, or is unset -> html\n     * If Content-Type is anything else -> unknown\n     *\n     * @return string One of 'js', 'html' or 'unknown'\n     */\n    protected static function getResponseFormat()\n    {\n        // Check content type\n        foreach (headers_list() as $header) {\n            if (stripos($header, 'content-type:') === 0) {\n                // This handler only works with HTML and javascript outputs\n                // text/javascript is obsolete in favour of application/javascript, but still used\n                if (stripos($header, 'application/javascript') !== false || stripos($header, 'text/javascript') !== false) {\n                    return 'js';\n                }\n                if (stripos($header, 'text/html') === false) {\n                    return 'unknown';\n                }\n                break;\n            }\n        }\n\n        return 'html';\n    }\n\n    private static function generateScript()\n    {\n        $script = array();\n        foreach (self::$records as $record) {\n            $context = self::dump('Context', $record['context']);\n            $extra = self::dump('Extra', $record['extra']);\n\n            if (empty($context) && empty($extra)) {\n                $script[] = self::call_array('log', self::handleStyles($record['formatted']));\n            } else {\n                $script = array_merge($script,\n                    array(self::call_array('groupCollapsed', self::handleStyles($record['formatted']))),\n                    $context,\n                    $extra,\n                    array(self::call('groupEnd'))\n                );\n            }\n        }\n\n        return \"(function (c) {if (c && c.groupCollapsed) {\\n\" . implode(\"\\n\", $script) . \"\\n}})(console);\";\n    }\n\n    private static function handleStyles($formatted)\n    {\n        $args = array(self::quote('font-weight: normal'));\n        $format = '%c' . $formatted;\n        preg_match_all('/\\[\\[(.*?)\\]\\]\\{([^}]*)\\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);\n\n        foreach (array_reverse($matches) as $match) {\n            $args[] = self::quote(self::handleCustomStyles($match[2][0], $match[1][0]));\n            $args[] = '\"font-weight: normal\"';\n\n            $pos = $match[0][1];\n            $format = substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . substr($format, $pos + strlen($match[0][0]));\n        }\n\n        array_unshift($args, self::quote($format));\n\n        return $args;\n    }\n\n    private static function handleCustomStyles($style, $string)\n    {\n        static $colors = array('blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey');\n        static $labels = array();\n\n        return preg_replace_callback('/macro\\s*:(.*?)(?:;|$)/', function ($m) use ($string, &$colors, &$labels) {\n            if (trim($m[1]) === 'autolabel') {\n                // Format the string as a label with consistent auto assigned background color\n                if (!isset($labels[$string])) {\n                    $labels[$string] = $colors[count($labels) % count($colors)];\n                }\n                $color = $labels[$string];\n\n                return \"background-color: $color; color: white; border-radius: 3px; padding: 0 2px 0 2px\";\n            }\n\n            return $m[1];\n        }, $style);\n    }\n\n    private static function dump($title, array $dict)\n    {\n        $script = array();\n        $dict = array_filter($dict);\n        if (empty($dict)) {\n            return $script;\n        }\n        $script[] = self::call('log', self::quote('%c%s'), self::quote('font-weight: bold'), self::quote($title));\n        foreach ($dict as $key => $value) {\n            $value = json_encode($value);\n            if (empty($value)) {\n                $value = self::quote('');\n            }\n            $script[] = self::call('log', self::quote('%s: %o'), self::quote($key), $value);\n        }\n\n        return $script;\n    }\n\n    private static function quote($arg)\n    {\n        return '\"' . addcslashes($arg, \"\\\"\\n\\\\\") . '\"';\n    }\n\n    private static function call()\n    {\n        $args = func_get_args();\n        $method = array_shift($args);\n\n        return self::call_array($method, $args);\n    }\n\n    private static function call_array($method, array $args)\n    {\n        return 'c.' . $method . '(' . implode(', ', $args) . ');';\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Buffers all records until closing the handler and then pass them as batch.\n *\n * This is useful for a MailHandler to send only one mail per request instead of\n * sending one per log message.\n *\n * @author Christophe Coevoet <stof@notk.org>\n */\nclass BufferHandler extends AbstractHandler\n{\n    protected $handler;\n    protected $bufferSize = 0;\n    protected $bufferLimit;\n    protected $flushOnOverflow;\n    protected $buffer = array();\n    protected $initialized = false;\n\n    /**\n     * @param HandlerInterface $handler         Handler.\n     * @param int              $bufferLimit     How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.\n     * @param int              $level           The minimum logging level at which this handler will be triggered\n     * @param Boolean          $bubble          Whether the messages that are handled can bubble up the stack or not\n     * @param Boolean          $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded\n     */\n    public function __construct(HandlerInterface $handler, $bufferLimit = 0, $level = Logger::DEBUG, $bubble = true, $flushOnOverflow = false)\n    {\n        parent::__construct($level, $bubble);\n        $this->handler = $handler;\n        $this->bufferLimit = (int) $bufferLimit;\n        $this->flushOnOverflow = $flushOnOverflow;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handle(array $record)\n    {\n        if ($record['level'] < $this->level) {\n            return false;\n        }\n\n        if (!$this->initialized) {\n            // __destructor() doesn't get called on Fatal errors\n            register_shutdown_function(array($this, 'close'));\n            $this->initialized = true;\n        }\n\n        if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) {\n            if ($this->flushOnOverflow) {\n                $this->flush();\n            } else {\n                array_shift($this->buffer);\n                $this->bufferSize--;\n            }\n        }\n\n        if ($this->processors) {\n            foreach ($this->processors as $processor) {\n                $record = call_user_func($processor, $record);\n            }\n        }\n\n        $this->buffer[] = $record;\n        $this->bufferSize++;\n\n        return false === $this->bubble;\n    }\n\n    public function flush()\n    {\n        if ($this->bufferSize === 0) {\n            return;\n        }\n\n        $this->handler->handleBatch($this->buffer);\n        $this->clear();\n    }\n\n    public function __destruct()\n    {\n        // suppress the parent behavior since we already have register_shutdown_function()\n        // to call close(), and the reference contained there will prevent this from being\n        // GC'd until the end of the request\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function close()\n    {\n        $this->flush();\n    }\n\n    /**\n     * Clears the buffer without flushing any messages down to the wrapped handler.\n     */\n    public function clear()\n    {\n        $this->bufferSize = 0;\n        $this->buffer = array();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\ChromePHPFormatter;\nuse Monolog\\Logger;\n\n/**\n * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/)\n *\n * This also works out of the box with Firefox 43+\n *\n * @author Christophe Coevoet <stof@notk.org>\n */\nclass ChromePHPHandler extends AbstractProcessingHandler\n{\n    /**\n     * Version of the extension\n     */\n    const VERSION = '4.0';\n\n    /**\n     * Header name\n     */\n    const HEADER_NAME = 'X-ChromeLogger-Data';\n    \n    /**\n     * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+)\n     */\n    const USER_AGENT_REGEX = '{\\b(?:Chrome/\\d+(?:\\.\\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\\d|\\d{3,})(?:\\.\\d)*)\\b}';\n\n    protected static $initialized = false;\n\n    /**\n     * Tracks whether we sent too much data\n     *\n     * Chrome limits the headers to 256KB, so when we sent 240KB we stop sending\n     *\n     * @var Boolean\n     */\n    protected static $overflowed = false;\n\n    protected static $json = array(\n        'version' => self::VERSION,\n        'columns' => array('label', 'log', 'backtrace', 'type'),\n        'rows' => array(),\n    );\n\n    protected static $sendHeaders = true;\n\n    /**\n     * @param int     $level  The minimum logging level at which this handler will be triggered\n     * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct($level = Logger::DEBUG, $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n        if (!function_exists('json_encode')) {\n            throw new \\RuntimeException('PHP\\'s json extension is required to use Monolog\\'s ChromePHPHandler');\n        }\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handleBatch(array $records)\n    {\n        $messages = array();\n\n        foreach ($records as $record) {\n            if ($record['level'] < $this->level) {\n                continue;\n            }\n            $messages[] = $this->processRecord($record);\n        }\n\n        if (!empty($messages)) {\n            $messages = $this->getFormatter()->formatBatch($messages);\n            self::$json['rows'] = array_merge(self::$json['rows'], $messages);\n            $this->send();\n        }\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new ChromePHPFormatter();\n    }\n\n    /**\n     * Creates & sends header for a record\n     *\n     * @see sendHeader()\n     * @see send()\n     * @param array $record\n     */\n    protected function write(array $record)\n    {\n        self::$json['rows'][] = $record['formatted'];\n\n        $this->send();\n    }\n\n    /**\n     * Sends the log header\n     *\n     * @see sendHeader()\n     */\n    protected function send()\n    {\n        if (self::$overflowed || !self::$sendHeaders) {\n            return;\n        }\n\n        if (!self::$initialized) {\n            self::$initialized = true;\n\n            self::$sendHeaders = $this->headersAccepted();\n            if (!self::$sendHeaders) {\n                return;\n            }\n\n            self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';\n        }\n\n        $json = @json_encode(self::$json);\n        $data = base64_encode(utf8_encode($json));\n        if (strlen($data) > 240 * 1024) {\n            self::$overflowed = true;\n\n            $record = array(\n                'message' => 'Incomplete logs, chrome header size limit reached',\n                'context' => array(),\n                'level' => Logger::WARNING,\n                'level_name' => Logger::getLevelName(Logger::WARNING),\n                'channel' => 'monolog',\n                'datetime' => new \\DateTime(),\n                'extra' => array(),\n            );\n            self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record);\n            $json = @json_encode(self::$json);\n            $data = base64_encode(utf8_encode($json));\n        }\n\n        if (trim($data) !== '') {\n            $this->sendHeader(self::HEADER_NAME, $data);\n        }\n    }\n\n    /**\n     * Send header string to the client\n     *\n     * @param string $header\n     * @param string $content\n     */\n    protected function sendHeader($header, $content)\n    {\n        if (!headers_sent() && self::$sendHeaders) {\n            header(sprintf('%s: %s', $header, $content));\n        }\n    }\n\n    /**\n     * Verifies if the headers are accepted by the current user agent\n     *\n     * @return Boolean\n     */\n    protected function headersAccepted()\n    {\n        if (empty($_SERVER['HTTP_USER_AGENT'])) {\n            return false;\n        }\n\n        return preg_match(self::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']);\n    }\n\n    /**\n     * BC getter for the sendHeaders property that has been made static\n     */\n    public function __get($property)\n    {\n        if ('sendHeaders' !== $property) {\n            throw new \\InvalidArgumentException('Undefined property '.$property);\n        }\n\n        return static::$sendHeaders;\n    }\n\n    /**\n     * BC setter for the sendHeaders property that has been made static\n     */\n    public function __set($property, $value)\n    {\n        if ('sendHeaders' !== $property) {\n            throw new \\InvalidArgumentException('Undefined property '.$property);\n        }\n\n        static::$sendHeaders = $value;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\JsonFormatter;\nuse Monolog\\Logger;\n\n/**\n * CouchDB handler\n *\n * @author Markus Bachmann <markus.bachmann@bachi.biz>\n */\nclass CouchDBHandler extends AbstractProcessingHandler\n{\n    private $options;\n\n    public function __construct(array $options = array(), $level = Logger::DEBUG, $bubble = true)\n    {\n        $this->options = array_merge(array(\n            'host'     => 'localhost',\n            'port'     => 5984,\n            'dbname'   => 'logger',\n            'username' => null,\n            'password' => null,\n        ), $options);\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function write(array $record)\n    {\n        $basicAuth = null;\n        if ($this->options['username']) {\n            $basicAuth = sprintf('%s:%s@', $this->options['username'], $this->options['password']);\n        }\n\n        $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname'];\n        $context = stream_context_create(array(\n            'http' => array(\n                'method'        => 'POST',\n                'content'       => $record['formatted'],\n                'ignore_errors' => true,\n                'max_redirects' => 0,\n                'header'        => 'Content-type: application/json',\n            ),\n        ));\n\n        if (false === @file_get_contents($url, null, $context)) {\n            throw new \\RuntimeException(sprintf('Could not connect to %s', $url));\n        }\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Logs to Cube.\n *\n * @link http://square.github.com/cube/\n * @author Wan Chen <kami@kamisama.me>\n */\nclass CubeHandler extends AbstractProcessingHandler\n{\n    private $udpConnection;\n    private $httpConnection;\n    private $scheme;\n    private $host;\n    private $port;\n    private $acceptedSchemes = array('http', 'udp');\n\n    /**\n     * Create a Cube handler\n     *\n     * @throws \\UnexpectedValueException when given url is not a valid url.\n     *                                   A valid url must consist of three parts : protocol://host:port\n     *                                   Only valid protocols used by Cube are http and udp\n     */\n    public function __construct($url, $level = Logger::DEBUG, $bubble = true)\n    {\n        $urlInfo = parse_url($url);\n\n        if (!isset($urlInfo['scheme'], $urlInfo['host'], $urlInfo['port'])) {\n            throw new \\UnexpectedValueException('URL \"'.$url.'\" is not valid');\n        }\n\n        if (!in_array($urlInfo['scheme'], $this->acceptedSchemes)) {\n            throw new \\UnexpectedValueException(\n                'Invalid protocol (' . $urlInfo['scheme']  . ').'\n                . ' Valid options are ' . implode(', ', $this->acceptedSchemes));\n        }\n\n        $this->scheme = $urlInfo['scheme'];\n        $this->host = $urlInfo['host'];\n        $this->port = $urlInfo['port'];\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * Establish a connection to an UDP socket\n     *\n     * @throws \\LogicException           when unable to connect to the socket\n     * @throws MissingExtensionException when there is no socket extension\n     */\n    protected function connectUdp()\n    {\n        if (!extension_loaded('sockets')) {\n            throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler');\n        }\n\n        $this->udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0);\n        if (!$this->udpConnection) {\n            throw new \\LogicException('Unable to create a socket');\n        }\n\n        if (!socket_connect($this->udpConnection, $this->host, $this->port)) {\n            throw new \\LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port);\n        }\n    }\n\n    /**\n     * Establish a connection to a http server\n     * @throws \\LogicException when no curl extension\n     */\n    protected function connectHttp()\n    {\n        if (!extension_loaded('curl')) {\n            throw new \\LogicException('The curl extension is needed to use http URLs with the CubeHandler');\n        }\n\n        $this->httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put');\n\n        if (!$this->httpConnection) {\n            throw new \\LogicException('Unable to connect to ' . $this->host . ':' . $this->port);\n        }\n\n        curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, \"POST\");\n        curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        $date = $record['datetime'];\n\n        $data = array('time' => $date->format('Y-m-d\\TH:i:s.uO'));\n        unset($record['datetime']);\n\n        if (isset($record['context']['type'])) {\n            $data['type'] = $record['context']['type'];\n            unset($record['context']['type']);\n        } else {\n            $data['type'] = $record['channel'];\n        }\n\n        $data['data'] = $record['context'];\n        $data['data']['level'] = $record['level'];\n\n        if ($this->scheme === 'http') {\n            $this->writeHttp(json_encode($data));\n        } else {\n            $this->writeUdp(json_encode($data));\n        }\n    }\n\n    private function writeUdp($data)\n    {\n        if (!$this->udpConnection) {\n            $this->connectUdp();\n        }\n\n        socket_send($this->udpConnection, $data, strlen($data), 0);\n    }\n\n    private function writeHttp($data)\n    {\n        if (!$this->httpConnection) {\n            $this->connectHttp();\n        }\n\n        curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']');\n        curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, array(\n            'Content-Type: application/json',\n            'Content-Length: ' . strlen('['.$data.']'),\n        ));\n\n        Curl\\Util::execute($this->httpConnection, 5, false);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\Curl;\n\nclass Util\n{\n    private static $retriableErrorCodes = array(\n        CURLE_COULDNT_RESOLVE_HOST,\n        CURLE_COULDNT_CONNECT,\n        CURLE_HTTP_NOT_FOUND,\n        CURLE_READ_ERROR,\n        CURLE_OPERATION_TIMEOUTED,\n        CURLE_HTTP_POST_ERROR,\n        CURLE_SSL_CONNECT_ERROR,\n    );\n\n    /**\n     * Executes a CURL request with optional retries and exception on failure\n     *\n     * @param  resource          $ch curl handler\n     * @throws \\RuntimeException\n     */\n    public static function execute($ch, $retries = 5, $closeAfterDone = true)\n    {\n        while ($retries--) {\n            if (curl_exec($ch) === false) {\n                $curlErrno = curl_errno($ch);\n\n                if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || !$retries) {\n                    $curlError = curl_error($ch);\n\n                    if ($closeAfterDone) {\n                        curl_close($ch);\n                    }\n\n                    throw new \\RuntimeException(sprintf('Curl error (code %s): %s', $curlErrno, $curlError));\n                }\n\n                continue;\n            }\n\n            if ($closeAfterDone) {\n                curl_close($ch);\n            }\n            break;\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Simple handler wrapper that deduplicates log records across multiple requests\n *\n * It also includes the BufferHandler functionality and will buffer\n * all messages until the end of the request or flush() is called.\n *\n * This works by storing all log records' messages above $deduplicationLevel\n * to the file specified by $deduplicationStore. When further logs come in at the end of the\n * request (or when flush() is called), all those above $deduplicationLevel are checked\n * against the existing stored logs. If they match and the timestamps in the stored log is\n * not older than $time seconds, the new log record is discarded. If no log record is new, the\n * whole data set is discarded.\n *\n * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers\n * that send messages to people, to avoid spamming with the same message over and over in case of\n * a major component failure like a database server being down which makes all requests fail in the\n * same way.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass DeduplicationHandler extends BufferHandler\n{\n    /**\n     * @var string\n     */\n    protected $deduplicationStore;\n\n    /**\n     * @var int\n     */\n    protected $deduplicationLevel;\n\n    /**\n     * @var int\n     */\n    protected $time;\n\n    /**\n     * @var bool\n     */\n    private $gc = false;\n\n    /**\n     * @param HandlerInterface $handler            Handler.\n     * @param string           $deduplicationStore The file/path where the deduplication log should be kept\n     * @param int              $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes\n     * @param int              $time               The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through\n     * @param Boolean          $bubble             Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct(HandlerInterface $handler, $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, $time = 60, $bubble = true)\n    {\n        parent::__construct($handler, 0, Logger::DEBUG, $bubble, false);\n\n        $this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore;\n        $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel);\n        $this->time = $time;\n    }\n\n    public function flush()\n    {\n        if ($this->bufferSize === 0) {\n            return;\n        }\n\n        $passthru = null;\n\n        foreach ($this->buffer as $record) {\n            if ($record['level'] >= $this->deduplicationLevel) {\n\n                $passthru = $passthru || !$this->isDuplicate($record);\n                if ($passthru) {\n                    $this->appendRecord($record);\n                }\n            }\n        }\n\n        // default of null is valid as well as if no record matches duplicationLevel we just pass through\n        if ($passthru === true || $passthru === null) {\n            $this->handler->handleBatch($this->buffer);\n        }\n\n        $this->clear();\n\n        if ($this->gc) {\n            $this->collectLogs();\n        }\n    }\n\n    private function isDuplicate(array $record)\n    {\n        if (!file_exists($this->deduplicationStore)) {\n            return false;\n        }\n\n        $store = file($this->deduplicationStore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);\n        if (!is_array($store)) {\n            return false;\n        }\n\n        $yesterday = time() - 86400;\n        $timestampValidity = $record['datetime']->getTimestamp() - $this->time;\n        $expectedMessage = preg_replace('{[\\r\\n].*}', '', $record['message']);\n\n        for ($i = count($store) - 1; $i >= 0; $i--) {\n            list($timestamp, $level, $message) = explode(':', $store[$i], 3);\n\n            if ($level === $record['level_name'] && $message === $expectedMessage && $timestamp > $timestampValidity) {\n                return true;\n            }\n\n            if ($timestamp < $yesterday) {\n                $this->gc = true;\n            }\n        }\n\n        return false;\n    }\n\n    private function collectLogs()\n    {\n        if (!file_exists($this->deduplicationStore)) {\n            return false;\n        }\n\n        $handle = fopen($this->deduplicationStore, 'rw+');\n        flock($handle, LOCK_EX);\n        $validLogs = array();\n\n        $timestampValidity = time() - $this->time;\n\n        while (!feof($handle)) {\n            $log = fgets($handle);\n            if (substr($log, 0, 10) >= $timestampValidity) {\n                $validLogs[] = $log;\n            }\n        }\n\n        ftruncate($handle, 0);\n        rewind($handle);\n        foreach ($validLogs as $log) {\n            fwrite($handle, $log);\n        }\n\n        flock($handle, LOCK_UN);\n        fclose($handle);\n\n        $this->gc = false;\n    }\n\n    private function appendRecord(array $record)\n    {\n        file_put_contents($this->deduplicationStore, $record['datetime']->getTimestamp() . ':' . $record['level_name'] . ':' . preg_replace('{[\\r\\n].*}', '', $record['message']) . \"\\n\", FILE_APPEND);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\NormalizerFormatter;\nuse Doctrine\\CouchDB\\CouchDBClient;\n\n/**\n * CouchDB handler for Doctrine CouchDB ODM\n *\n * @author Markus Bachmann <markus.bachmann@bachi.biz>\n */\nclass DoctrineCouchDBHandler extends AbstractProcessingHandler\n{\n    private $client;\n\n    public function __construct(CouchDBClient $client, $level = Logger::DEBUG, $bubble = true)\n    {\n        $this->client = $client;\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function write(array $record)\n    {\n        $this->client->postDocument($record['formatted']);\n    }\n\n    protected function getDefaultFormatter()\n    {\n        return new NormalizerFormatter;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Aws\\Sdk;\nuse Aws\\DynamoDb\\DynamoDbClient;\nuse Aws\\DynamoDb\\Marshaler;\nuse Monolog\\Formatter\\ScalarFormatter;\nuse Monolog\\Logger;\n\n/**\n * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/)\n *\n * @link https://github.com/aws/aws-sdk-php/\n * @author Andrew Lawson <adlawson@gmail.com>\n */\nclass DynamoDbHandler extends AbstractProcessingHandler\n{\n    const DATE_FORMAT = 'Y-m-d\\TH:i:s.uO';\n\n    /**\n     * @var DynamoDbClient\n     */\n    protected $client;\n\n    /**\n     * @var string\n     */\n    protected $table;\n\n    /**\n     * @var int\n     */\n    protected $version;\n\n    /**\n     * @var Marshaler\n     */\n    protected $marshaler;\n\n    /**\n     * @param DynamoDbClient $client\n     * @param string         $table\n     * @param int            $level\n     * @param bool           $bubble\n     */\n    public function __construct(DynamoDbClient $client, $table, $level = Logger::DEBUG, $bubble = true)\n    {\n        if (defined('Aws\\Sdk::VERSION') && version_compare(Sdk::VERSION, '3.0', '>=')) {\n            $this->version = 3;\n            $this->marshaler = new Marshaler;\n        } else {\n            $this->version = 2;\n        }\n\n        $this->client = $client;\n        $this->table = $table;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        $filtered = $this->filterEmptyFields($record['formatted']);\n        if ($this->version === 3) {\n            $formatted = $this->marshaler->marshalItem($filtered);\n        } else {\n            $formatted = $this->client->formatAttributes($filtered);\n        }\n\n        $this->client->putItem(array(\n            'TableName' => $this->table,\n            'Item' => $formatted,\n        ));\n    }\n\n    /**\n     * @param  array $record\n     * @return array\n     */\n    protected function filterEmptyFields(array $record)\n    {\n        return array_filter($record, function ($value) {\n            return !empty($value) || false === $value || 0 === $value;\n        });\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new ScalarFormatter(self::DATE_FORMAT);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Formatter\\ElasticaFormatter;\nuse Monolog\\Logger;\nuse Elastica\\Client;\nuse Elastica\\Exception\\ExceptionInterface;\n\n/**\n * Elastic Search handler\n *\n * Usage example:\n *\n *    $client = new \\Elastica\\Client();\n *    $options = array(\n *        'index' => 'elastic_index_name',\n *        'type' => 'elastic_doc_type',\n *    );\n *    $handler = new ElasticSearchHandler($client, $options);\n *    $log = new Logger('application');\n *    $log->pushHandler($handler);\n *\n * @author Jelle Vink <jelle.vink@gmail.com>\n */\nclass ElasticSearchHandler extends AbstractProcessingHandler\n{\n    /**\n     * @var Client\n     */\n    protected $client;\n\n    /**\n     * @var array Handler config options\n     */\n    protected $options = array();\n\n    /**\n     * @param Client  $client  Elastica Client object\n     * @param array   $options Handler configuration\n     * @param int     $level   The minimum logging level at which this handler will be triggered\n     * @param Boolean $bubble  Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct(Client $client, array $options = array(), $level = Logger::DEBUG, $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n        $this->client = $client;\n        $this->options = array_merge(\n            array(\n                'index'          => 'monolog',      // Elastic index name\n                'type'           => 'record',       // Elastic document type\n                'ignore_error'   => false,          // Suppress Elastica exceptions\n            ),\n            $options\n        );\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function write(array $record)\n    {\n        $this->bulkSend(array($record['formatted']));\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function setFormatter(FormatterInterface $formatter)\n    {\n        if ($formatter instanceof ElasticaFormatter) {\n            return parent::setFormatter($formatter);\n        }\n        throw new \\InvalidArgumentException('ElasticSearchHandler is only compatible with ElasticaFormatter');\n    }\n\n    /**\n     * Getter options\n     * @return array\n     */\n    public function getOptions()\n    {\n        return $this->options;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new ElasticaFormatter($this->options['index'], $this->options['type']);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handleBatch(array $records)\n    {\n        $documents = $this->getFormatter()->formatBatch($records);\n        $this->bulkSend($documents);\n    }\n\n    /**\n     * Use Elasticsearch bulk API to send list of documents\n     * @param  array             $documents\n     * @throws \\RuntimeException\n     */\n    protected function bulkSend(array $documents)\n    {\n        try {\n            $this->client->addDocuments($documents);\n        } catch (ExceptionInterface $e) {\n            if (!$this->options['ignore_error']) {\n                throw new \\RuntimeException(\"Error sending messages to Elasticsearch\", 0, $e);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Logger;\n\n/**\n * Stores to PHP error_log() handler.\n *\n * @author Elan Ruusamäe <glen@delfi.ee>\n */\nclass ErrorLogHandler extends AbstractProcessingHandler\n{\n    const OPERATING_SYSTEM = 0;\n    const SAPI = 4;\n\n    protected $messageType;\n    protected $expandNewlines;\n\n    /**\n     * @param int     $messageType    Says where the error should go.\n     * @param int     $level          The minimum logging level at which this handler will be triggered\n     * @param Boolean $bubble         Whether the messages that are handled can bubble up the stack or not\n     * @param Boolean $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries\n     */\n    public function __construct($messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, $bubble = true, $expandNewlines = false)\n    {\n        parent::__construct($level, $bubble);\n\n        if (false === in_array($messageType, self::getAvailableTypes())) {\n            $message = sprintf('The given message type \"%s\" is not supported', print_r($messageType, true));\n            throw new \\InvalidArgumentException($message);\n        }\n\n        $this->messageType = $messageType;\n        $this->expandNewlines = $expandNewlines;\n    }\n\n    /**\n     * @return array With all available types\n     */\n    public static function getAvailableTypes()\n    {\n        return array(\n            self::OPERATING_SYSTEM,\n            self::SAPI,\n        );\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%');\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        if ($this->expandNewlines) {\n            $lines = preg_split('{[\\r\\n]+}', (string) $record['formatted']);\n            foreach ($lines as $line) {\n                error_log($line, $this->messageType);\n            }\n        } else {\n            error_log((string) $record['formatted'], $this->messageType);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Simple handler wrapper that filters records based on a list of levels\n *\n * It can be configured with an exact list of levels to allow, or a min/max level.\n *\n * @author Hennadiy Verkh\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass FilterHandler extends AbstractHandler\n{\n    /**\n     * Handler or factory callable($record, $this)\n     *\n     * @var callable|\\Monolog\\Handler\\HandlerInterface\n     */\n    protected $handler;\n\n    /**\n     * Minimum level for logs that are passed to handler\n     *\n     * @var int[]\n     */\n    protected $acceptedLevels;\n\n    /**\n     * Whether the messages that are handled can bubble up the stack or not\n     *\n     * @var Boolean\n     */\n    protected $bubble;\n\n    /**\n     * @param callable|HandlerInterface $handler        Handler or factory callable($record, $this).\n     * @param int|array                 $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided\n     * @param int                       $maxLevel       Maximum level to accept, only used if $minLevelOrList is not an array\n     * @param Boolean                   $bubble         Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, $bubble = true)\n    {\n        $this->handler  = $handler;\n        $this->bubble   = $bubble;\n        $this->setAcceptedLevels($minLevelOrList, $maxLevel);\n\n        if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) {\n            throw new \\RuntimeException(\"The given handler (\".json_encode($this->handler).\") is not a callable nor a Monolog\\Handler\\HandlerInterface object\");\n        }\n    }\n\n    /**\n     * @return array\n     */\n    public function getAcceptedLevels()\n    {\n        return array_flip($this->acceptedLevels);\n    }\n\n    /**\n     * @param int|string|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided\n     * @param int|string       $maxLevel       Maximum level or level name to accept, only used if $minLevelOrList is not an array\n     */\n    public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY)\n    {\n        if (is_array($minLevelOrList)) {\n            $acceptedLevels = array_map('Monolog\\Logger::toMonologLevel', $minLevelOrList);\n        } else {\n            $minLevelOrList = Logger::toMonologLevel($minLevelOrList);\n            $maxLevel = Logger::toMonologLevel($maxLevel);\n            $acceptedLevels = array_values(array_filter(Logger::getLevels(), function ($level) use ($minLevelOrList, $maxLevel) {\n                return $level >= $minLevelOrList && $level <= $maxLevel;\n            }));\n        }\n        $this->acceptedLevels = array_flip($acceptedLevels);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function isHandling(array $record)\n    {\n        return isset($this->acceptedLevels[$record['level']]);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handle(array $record)\n    {\n        if (!$this->isHandling($record)) {\n            return false;\n        }\n\n        // The same logic as in FingersCrossedHandler\n        if (!$this->handler instanceof HandlerInterface) {\n            $this->handler = call_user_func($this->handler, $record, $this);\n            if (!$this->handler instanceof HandlerInterface) {\n                throw new \\RuntimeException(\"The factory callable should return a HandlerInterface\");\n            }\n        }\n\n        if ($this->processors) {\n            foreach ($this->processors as $processor) {\n                $record = call_user_func($processor, $record);\n            }\n        }\n\n        $this->handler->handle($record);\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handleBatch(array $records)\n    {\n        $filtered = array();\n        foreach ($records as $record) {\n            if ($this->isHandling($record)) {\n                $filtered[] = $record;\n            }\n        }\n\n        $this->handler->handleBatch($filtered);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\FingersCrossed;\n\n/**\n * Interface for activation strategies for the FingersCrossedHandler.\n *\n * @author Johannes M. Schmitt <schmittjoh@gmail.com>\n */\ninterface ActivationStrategyInterface\n{\n    /**\n     * Returns whether the given record activates the handler.\n     *\n     * @param  array   $record\n     * @return Boolean\n     */\n    public function isHandlerActivated(array $record);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\FingersCrossed;\n\nuse Monolog\\Logger;\n\n/**\n * Channel and Error level based monolog activation strategy. Allows to trigger activation\n * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except\n * for records of the 'sql' channel; those should trigger activation on level 'WARN'.\n *\n * Example:\n *\n * <code>\n *   $activationStrategy = new ChannelLevelActivationStrategy(\n *       Logger::CRITICAL,\n *       array(\n *           'request' => Logger::ALERT,\n *           'sensitive' => Logger::ERROR,\n *       )\n *   );\n *   $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy);\n * </code>\n *\n * @author Mike Meessen <netmikey@gmail.com>\n */\nclass ChannelLevelActivationStrategy implements ActivationStrategyInterface\n{\n    private $defaultActionLevel;\n    private $channelToActionLevel;\n\n    /**\n     * @param int   $defaultActionLevel   The default action level to be used if the record's category doesn't match any\n     * @param array $channelToActionLevel An array that maps channel names to action levels.\n     */\n    public function __construct($defaultActionLevel, $channelToActionLevel = array())\n    {\n        $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel);\n        $this->channelToActionLevel = array_map('Monolog\\Logger::toMonologLevel', $channelToActionLevel);\n    }\n\n    public function isHandlerActivated(array $record)\n    {\n        if (isset($this->channelToActionLevel[$record['channel']])) {\n            return $record['level'] >= $this->channelToActionLevel[$record['channel']];\n        }\n\n        return $record['level'] >= $this->defaultActionLevel;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\FingersCrossed;\n\nuse Monolog\\Logger;\n\n/**\n * Error level based activation strategy.\n *\n * @author Johannes M. Schmitt <schmittjoh@gmail.com>\n */\nclass ErrorLevelActivationStrategy implements ActivationStrategyInterface\n{\n    private $actionLevel;\n\n    public function __construct($actionLevel)\n    {\n        $this->actionLevel = Logger::toMonologLevel($actionLevel);\n    }\n\n    public function isHandlerActivated(array $record)\n    {\n        return $record['level'] >= $this->actionLevel;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy;\nuse Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface;\nuse Monolog\\Logger;\n\n/**\n * Buffers all records until a certain level is reached\n *\n * The advantage of this approach is that you don't get any clutter in your log files.\n * Only requests which actually trigger an error (or whatever your actionLevel is) will be\n * in the logs, but they will contain all records, not only those above the level threshold.\n *\n * You can find the various activation strategies in the\n * Monolog\\Handler\\FingersCrossed\\ namespace.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass FingersCrossedHandler extends AbstractHandler\n{\n    protected $handler;\n    protected $activationStrategy;\n    protected $buffering = true;\n    protected $bufferSize;\n    protected $buffer = array();\n    protected $stopBuffering;\n    protected $passthruLevel;\n\n    /**\n     * @param callable|HandlerInterface       $handler            Handler or factory callable($record, $fingersCrossedHandler).\n     * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action\n     * @param int                             $bufferSize         How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.\n     * @param Boolean                         $bubble             Whether the messages that are handled can bubble up the stack or not\n     * @param Boolean                         $stopBuffering      Whether the handler should stop buffering after being triggered (default true)\n     * @param int                             $passthruLevel      Minimum level to always flush to handler on close, even if strategy not triggered\n     */\n    public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = true, $stopBuffering = true, $passthruLevel = null)\n    {\n        if (null === $activationStrategy) {\n            $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING);\n        }\n\n        // convert simple int activationStrategy to an object\n        if (!$activationStrategy instanceof ActivationStrategyInterface) {\n            $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy);\n        }\n\n        $this->handler = $handler;\n        $this->activationStrategy = $activationStrategy;\n        $this->bufferSize = $bufferSize;\n        $this->bubble = $bubble;\n        $this->stopBuffering = $stopBuffering;\n\n        if ($passthruLevel !== null) {\n            $this->passthruLevel = Logger::toMonologLevel($passthruLevel);\n        }\n\n        if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) {\n            throw new \\RuntimeException(\"The given handler (\".json_encode($this->handler).\") is not a callable nor a Monolog\\Handler\\HandlerInterface object\");\n        }\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function isHandling(array $record)\n    {\n        return true;\n    }\n\n    /**\n     * Manually activate this logger regardless of the activation strategy\n     */\n    public function activate()\n    {\n        if ($this->stopBuffering) {\n            $this->buffering = false;\n        }\n        if (!$this->handler instanceof HandlerInterface) {\n            $record = end($this->buffer) ?: null;\n\n            $this->handler = call_user_func($this->handler, $record, $this);\n            if (!$this->handler instanceof HandlerInterface) {\n                throw new \\RuntimeException(\"The factory callable should return a HandlerInterface\");\n            }\n        }\n        $this->handler->handleBatch($this->buffer);\n        $this->buffer = array();\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handle(array $record)\n    {\n        if ($this->processors) {\n            foreach ($this->processors as $processor) {\n                $record = call_user_func($processor, $record);\n            }\n        }\n\n        if ($this->buffering) {\n            $this->buffer[] = $record;\n            if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) {\n                array_shift($this->buffer);\n            }\n            if ($this->activationStrategy->isHandlerActivated($record)) {\n                $this->activate();\n            }\n        } else {\n            $this->handler->handle($record);\n        }\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function close()\n    {\n        if (null !== $this->passthruLevel) {\n            $level = $this->passthruLevel;\n            $this->buffer = array_filter($this->buffer, function ($record) use ($level) {\n                return $record['level'] >= $level;\n            });\n            if (count($this->buffer) > 0) {\n                $this->handler->handleBatch($this->buffer);\n                $this->buffer = array();\n            }\n        }\n    }\n\n    /**\n     * Resets the state of the handler. Stops forwarding records to the wrapped handler.\n     */\n    public function reset()\n    {\n        $this->buffering = true;\n    }\n\n    /**\n     * Clears the buffer without flushing any messages down to the wrapped handler.\n     *\n     * It also resets the handler to its initial buffering state.\n     */\n    public function clear()\n    {\n        $this->buffer = array();\n        $this->reset();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\WildfireFormatter;\n\n/**\n * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol.\n *\n * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com>\n */\nclass FirePHPHandler extends AbstractProcessingHandler\n{\n    /**\n     * WildFire JSON header message format\n     */\n    const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2';\n\n    /**\n     * FirePHP structure for parsing messages & their presentation\n     */\n    const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1';\n\n    /**\n     * Must reference a \"known\" plugin, otherwise headers won't display in FirePHP\n     */\n    const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3';\n\n    /**\n     * Header prefix for Wildfire to recognize & parse headers\n     */\n    const HEADER_PREFIX = 'X-Wf';\n\n    /**\n     * Whether or not Wildfire vendor-specific headers have been generated & sent yet\n     */\n    protected static $initialized = false;\n\n    /**\n     * Shared static message index between potentially multiple handlers\n     * @var int\n     */\n    protected static $messageIndex = 1;\n\n    protected static $sendHeaders = true;\n\n    /**\n     * Base header creation function used by init headers & record headers\n     *\n     * @param  array  $meta    Wildfire Plugin, Protocol & Structure Indexes\n     * @param  string $message Log message\n     * @return array  Complete header string ready for the client as key and message as value\n     */\n    protected function createHeader(array $meta, $message)\n    {\n        $header = sprintf('%s-%s', self::HEADER_PREFIX, join('-', $meta));\n\n        return array($header => $message);\n    }\n\n    /**\n     * Creates message header from record\n     *\n     * @see createHeader()\n     * @param  array  $record\n     * @return string\n     */\n    protected function createRecordHeader(array $record)\n    {\n        // Wildfire is extensible to support multiple protocols & plugins in a single request,\n        // but we're not taking advantage of that (yet), so we're using \"1\" for simplicity's sake.\n        return $this->createHeader(\n            array(1, 1, 1, self::$messageIndex++),\n            $record['formatted']\n        );\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new WildfireFormatter();\n    }\n\n    /**\n     * Wildfire initialization headers to enable message parsing\n     *\n     * @see createHeader()\n     * @see sendHeader()\n     * @return array\n     */\n    protected function getInitHeaders()\n    {\n        // Initial payload consists of required headers for Wildfire\n        return array_merge(\n            $this->createHeader(array('Protocol', 1), self::PROTOCOL_URI),\n            $this->createHeader(array(1, 'Structure', 1), self::STRUCTURE_URI),\n            $this->createHeader(array(1, 'Plugin', 1), self::PLUGIN_URI)\n        );\n    }\n\n    /**\n     * Send header string to the client\n     *\n     * @param string $header\n     * @param string $content\n     */\n    protected function sendHeader($header, $content)\n    {\n        if (!headers_sent() && self::$sendHeaders) {\n            header(sprintf('%s: %s', $header, $content));\n        }\n    }\n\n    /**\n     * Creates & sends header for a record, ensuring init headers have been sent prior\n     *\n     * @see sendHeader()\n     * @see sendInitHeaders()\n     * @param array $record\n     */\n    protected function write(array $record)\n    {\n        if (!self::$sendHeaders) {\n            return;\n        }\n\n        // WildFire-specific headers must be sent prior to any messages\n        if (!self::$initialized) {\n            self::$initialized = true;\n\n            self::$sendHeaders = $this->headersAccepted();\n            if (!self::$sendHeaders) {\n                return;\n            }\n\n            foreach ($this->getInitHeaders() as $header => $content) {\n                $this->sendHeader($header, $content);\n            }\n        }\n\n        $header = $this->createRecordHeader($record);\n        if (trim(current($header)) !== '') {\n            $this->sendHeader(key($header), current($header));\n        }\n    }\n\n    /**\n     * Verifies if the headers are accepted by the current user agent\n     *\n     * @return Boolean\n     */\n    protected function headersAccepted()\n    {\n        if (!empty($_SERVER['HTTP_USER_AGENT']) && preg_match('{\\bFirePHP/\\d+\\.\\d+\\b}', $_SERVER['HTTP_USER_AGENT'])) {\n            return true;\n        }\n\n        return isset($_SERVER['HTTP_X_FIREPHP_VERSION']);\n    }\n\n    /**\n     * BC getter for the sendHeaders property that has been made static\n     */\n    public function __get($property)\n    {\n        if ('sendHeaders' !== $property) {\n            throw new \\InvalidArgumentException('Undefined property '.$property);\n        }\n\n        return static::$sendHeaders;\n    }\n\n    /**\n     * BC setter for the sendHeaders property that has been made static\n     */\n    public function __set($property, $value)\n    {\n        if ('sendHeaders' !== $property) {\n            throw new \\InvalidArgumentException('Undefined property '.$property);\n        }\n\n        static::$sendHeaders = $value;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Logger;\n\n/**\n * Sends logs to Fleep.io using Webhook integrations\n *\n * You'll need a Fleep.io account to use this handler.\n *\n * @see https://fleep.io/integrations/webhooks/ Fleep Webhooks Documentation\n * @author Ando Roots <ando@sqroot.eu>\n */\nclass FleepHookHandler extends SocketHandler\n{\n    const FLEEP_HOST = 'fleep.io';\n\n    const FLEEP_HOOK_URI = '/hook/';\n\n    /**\n     * @var string Webhook token (specifies the conversation where logs are sent)\n     */\n    protected $token;\n\n    /**\n     * Construct a new Fleep.io Handler.\n     *\n     * For instructions on how to create a new web hook in your conversations\n     * see https://fleep.io/integrations/webhooks/\n     *\n     * @param  string                    $token  Webhook token\n     * @param  bool|int                  $level  The minimum logging level at which this handler will be triggered\n     * @param  bool                      $bubble Whether the messages that are handled can bubble up the stack or not\n     * @throws MissingExtensionException\n     */\n    public function __construct($token, $level = Logger::DEBUG, $bubble = true)\n    {\n        if (!extension_loaded('openssl')) {\n            throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler');\n        }\n\n        $this->token = $token;\n\n        $connectionString = 'ssl://' . self::FLEEP_HOST . ':443';\n        parent::__construct($connectionString, $level, $bubble);\n    }\n\n    /**\n     * Returns the default formatter to use with this handler\n     *\n     * Overloaded to remove empty context and extra arrays from the end of the log message.\n     *\n     * @return LineFormatter\n     */\n    protected function getDefaultFormatter()\n    {\n        return new LineFormatter(null, null, true, true);\n    }\n\n    /**\n     * Handles a log record\n     *\n     * @param array $record\n     */\n    public function write(array $record)\n    {\n        parent::write($record);\n        $this->closeSocket();\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @param  array  $record\n     * @return string\n     */\n    protected function generateDataStream($record)\n    {\n        $content = $this->buildContent($record);\n\n        return $this->buildHeader($content) . $content;\n    }\n\n    /**\n     * Builds the header of the API Call\n     *\n     * @param  string $content\n     * @return string\n     */\n    private function buildHeader($content)\n    {\n        $header = \"POST \" . self::FLEEP_HOOK_URI . $this->token . \" HTTP/1.1\\r\\n\";\n        $header .= \"Host: \" . self::FLEEP_HOST . \"\\r\\n\";\n        $header .= \"Content-Type: application/x-www-form-urlencoded\\r\\n\";\n        $header .= \"Content-Length: \" . strlen($content) . \"\\r\\n\";\n        $header .= \"\\r\\n\";\n\n        return $header;\n    }\n\n    /**\n     * Builds the body of API call\n     *\n     * @param  array  $record\n     * @return string\n     */\n    private function buildContent($record)\n    {\n        $dataArray = array(\n            'message' => $record['formatted'],\n        );\n\n        return http_build_query($dataArray);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\FlowdockFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\n\n/**\n * Sends notifications through the Flowdock push API\n *\n * This must be configured with a FlowdockFormatter instance via setFormatter()\n *\n * Notes:\n * API token - Flowdock API token\n *\n * @author Dominik Liebler <liebler.dominik@gmail.com>\n * @see https://www.flowdock.com/api/push\n */\nclass FlowdockHandler extends SocketHandler\n{\n    /**\n     * @var string\n     */\n    protected $apiToken;\n\n    /**\n     * @param string   $apiToken\n     * @param bool|int $level    The minimum logging level at which this handler will be triggered\n     * @param bool     $bubble   Whether the messages that are handled can bubble up the stack or not\n     *\n     * @throws MissingExtensionException if OpenSSL is missing\n     */\n    public function __construct($apiToken, $level = Logger::DEBUG, $bubble = true)\n    {\n        if (!extension_loaded('openssl')) {\n            throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler');\n        }\n\n        parent::__construct('ssl://api.flowdock.com:443', $level, $bubble);\n        $this->apiToken = $apiToken;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function setFormatter(FormatterInterface $formatter)\n    {\n        if (!$formatter instanceof FlowdockFormatter) {\n            throw new \\InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\\Formatter\\FlowdockFormatter to function correctly');\n        }\n\n        return parent::setFormatter($formatter);\n    }\n\n    /**\n     * Gets the default formatter.\n     *\n     * @return FormatterInterface\n     */\n    protected function getDefaultFormatter()\n    {\n        throw new \\InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\\Formatter\\FlowdockFormatter to function correctly');\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @param array $record\n     */\n    protected function write(array $record)\n    {\n        parent::write($record);\n\n        $this->closeSocket();\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @param  array  $record\n     * @return string\n     */\n    protected function generateDataStream($record)\n    {\n        $content = $this->buildContent($record);\n\n        return $this->buildHeader($content) . $content;\n    }\n\n    /**\n     * Builds the body of API call\n     *\n     * @param  array  $record\n     * @return string\n     */\n    private function buildContent($record)\n    {\n        return json_encode($record['formatted']['flowdock']);\n    }\n\n    /**\n     * Builds the header of the API Call\n     *\n     * @param  string $content\n     * @return string\n     */\n    private function buildHeader($content)\n    {\n        $header = \"POST /v1/messages/team_inbox/\" . $this->apiToken . \" HTTP/1.1\\r\\n\";\n        $header .= \"Host: api.flowdock.com\\r\\n\";\n        $header .= \"Content-Type: application/json\\r\\n\";\n        $header .= \"Content-Length: \" . strlen($content) . \"\\r\\n\";\n        $header .= \"\\r\\n\";\n\n        return $header;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Gelf\\IMessagePublisher;\nuse Gelf\\PublisherInterface;\nuse Gelf\\Publisher;\nuse InvalidArgumentException;\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\GelfMessageFormatter;\n\n/**\n * Handler to send messages to a Graylog2 (http://www.graylog2.org) server\n *\n * @author Matt Lehner <mlehner@gmail.com>\n * @author Benjamin Zikarsky <benjamin@zikarsky.de>\n */\nclass GelfHandler extends AbstractProcessingHandler\n{\n    /**\n     * @var Publisher the publisher object that sends the message to the server\n     */\n    protected $publisher;\n\n    /**\n     * @param PublisherInterface|IMessagePublisher|Publisher $publisher a publisher object\n     * @param int                                            $level     The minimum logging level at which this handler will be triggered\n     * @param bool                                           $bubble    Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct($publisher, $level = Logger::DEBUG, $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        if (!$publisher instanceof Publisher && !$publisher instanceof IMessagePublisher && !$publisher instanceof PublisherInterface) {\n            throw new InvalidArgumentException('Invalid publisher, expected a Gelf\\Publisher, Gelf\\IMessagePublisher or Gelf\\PublisherInterface instance');\n        }\n\n        $this->publisher = $publisher;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function close()\n    {\n        $this->publisher = null;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        $this->publisher->publish($record['formatted']);\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new GelfMessageFormatter();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\n\n/**\n * Forwards records to multiple handlers\n *\n * @author Lenar Lõhmus <lenar@city.ee>\n */\nclass GroupHandler extends AbstractHandler\n{\n    protected $handlers;\n\n    /**\n     * @param array   $handlers Array of Handlers.\n     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct(array $handlers, $bubble = true)\n    {\n        foreach ($handlers as $handler) {\n            if (!$handler instanceof HandlerInterface) {\n                throw new \\InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.');\n            }\n        }\n\n        $this->handlers = $handlers;\n        $this->bubble = $bubble;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function isHandling(array $record)\n    {\n        foreach ($this->handlers as $handler) {\n            if ($handler->isHandling($record)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handle(array $record)\n    {\n        if ($this->processors) {\n            foreach ($this->processors as $processor) {\n                $record = call_user_func($processor, $record);\n            }\n        }\n\n        foreach ($this->handlers as $handler) {\n            $handler->handle($record);\n        }\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handleBatch(array $records)\n    {\n        if ($this->processors) {\n            $processed = array();\n            foreach ($records as $record) {\n                foreach ($this->processors as $processor) {\n                    $processed[] = call_user_func($processor, $record);\n                }\n            }\n            $records = $processed;\n        }\n\n        foreach ($this->handlers as $handler) {\n            $handler->handleBatch($records);\n        }\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function setFormatter(FormatterInterface $formatter)\n    {\n        foreach ($this->handlers as $handler) {\n            $handler->setFormatter($formatter);\n        }\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\n\n/**\n * Interface that all Monolog Handlers must implement\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\ninterface HandlerInterface\n{\n    /**\n     * Checks whether the given record will be handled by this handler.\n     *\n     * This is mostly done for performance reasons, to avoid calling processors for nothing.\n     *\n     * Handlers should still check the record levels within handle(), returning false in isHandling()\n     * is no guarantee that handle() will not be called, and isHandling() might not be called\n     * for a given record.\n     *\n     * @param array $record Partial log record containing only a level key\n     *\n     * @return Boolean\n     */\n    public function isHandling(array $record);\n\n    /**\n     * Handles a record.\n     *\n     * All records may be passed to this method, and the handler should discard\n     * those that it does not want to handle.\n     *\n     * The return value of this function controls the bubbling process of the handler stack.\n     * Unless the bubbling is interrupted (by returning true), the Logger class will keep on\n     * calling further handlers in the stack with a given log record.\n     *\n     * @param  array   $record The record to handle\n     * @return Boolean true means that this handler handled the record, and that bubbling is not permitted.\n     *                        false means the record was either not processed or that this handler allows bubbling.\n     */\n    public function handle(array $record);\n\n    /**\n     * Handles a set of records at once.\n     *\n     * @param array $records The records to handle (an array of record arrays)\n     */\n    public function handleBatch(array $records);\n\n    /**\n     * Adds a processor in the stack.\n     *\n     * @param  callable $callback\n     * @return self\n     */\n    public function pushProcessor($callback);\n\n    /**\n     * Removes the processor on top of the stack and returns it.\n     *\n     * @return callable\n     */\n    public function popProcessor();\n\n    /**\n     * Sets the formatter.\n     *\n     * @param  FormatterInterface $formatter\n     * @return self\n     */\n    public function setFormatter(FormatterInterface $formatter);\n\n    /**\n     * Gets the formatter.\n     *\n     * @return FormatterInterface\n     */\n    public function getFormatter();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\n\n/**\n * This simple wrapper class can be used to extend handlers functionality.\n *\n * Example: A custom filtering that can be applied to any handler.\n *\n * Inherit from this class and override handle() like this:\n *\n *   public function handle(array $record)\n *   {\n *        if ($record meets certain conditions) {\n *            return false;\n *        }\n *        return $this->handler->handle($record);\n *   }\n *\n * @author Alexey Karapetov <alexey@karapetov.com>\n */\nclass HandlerWrapper implements HandlerInterface\n{\n    /**\n     * @var HandlerInterface\n     */\n    protected $handler;\n\n    /**\n     * HandlerWrapper constructor.\n     * @param HandlerInterface $handler\n     */\n    public function __construct(HandlerInterface $handler)\n    {\n        $this->handler = $handler;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function isHandling(array $record)\n    {\n        return $this->handler->isHandling($record);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handle(array $record)\n    {\n        return $this->handler->handle($record);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handleBatch(array $records)\n    {\n        return $this->handler->handleBatch($records);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function pushProcessor($callback)\n    {\n        $this->handler->pushProcessor($callback);\n\n        return $this;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function popProcessor()\n    {\n        return $this->handler->popProcessor();\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function setFormatter(FormatterInterface $formatter)\n    {\n        $this->handler->setFormatter($formatter);\n\n        return $this;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getFormatter()\n    {\n        return $this->handler->getFormatter();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Sends notifications through the hipchat api to a hipchat room\n *\n * Notes:\n * API token - HipChat API token\n * Room      - HipChat Room Id or name, where messages are sent\n * Name      - Name used to send the message (from)\n * notify    - Should the message trigger a notification in the clients\n * version   - The API version to use (HipChatHandler::API_V1 | HipChatHandler::API_V2)\n *\n * @author Rafael Dohms <rafael@doh.ms>\n * @see    https://www.hipchat.com/docs/api\n */\nclass HipChatHandler extends SocketHandler\n{\n    /**\n     * Use API version 1\n     */\n    const API_V1 = 'v1';\n\n    /**\n     * Use API version v2\n     */\n    const API_V2 = 'v2';\n\n    /**\n     * The maximum allowed length for the name used in the \"from\" field.\n     */\n    const MAXIMUM_NAME_LENGTH = 15;\n\n    /**\n     * The maximum allowed length for the message.\n     */\n    const MAXIMUM_MESSAGE_LENGTH = 9500;\n\n    /**\n     * @var string\n     */\n    private $token;\n\n    /**\n     * @var string\n     */\n    private $room;\n\n    /**\n     * @var string\n     */\n    private $name;\n\n    /**\n     * @var bool\n     */\n    private $notify;\n\n    /**\n     * @var string\n     */\n    private $format;\n\n    /**\n     * @var string\n     */\n    private $host;\n\n    /**\n     * @var string\n     */\n    private $version;\n\n    /**\n     * @param string $token   HipChat API Token\n     * @param string $room    The room that should be alerted of the message (Id or Name)\n     * @param string $name    Name used in the \"from\" field.\n     * @param bool   $notify  Trigger a notification in clients or not\n     * @param int    $level   The minimum logging level at which this handler will be triggered\n     * @param bool   $bubble  Whether the messages that are handled can bubble up the stack or not\n     * @param bool   $useSSL  Whether to connect via SSL.\n     * @param string $format  The format of the messages (default to text, can be set to html if you have html in the messages)\n     * @param string $host    The HipChat server hostname.\n     * @param string $version The HipChat API version (default HipChatHandler::API_V1)\n     */\n    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)\n    {\n        if ($version == self::API_V1 && !$this->validateStringLength($name, static::MAXIMUM_NAME_LENGTH)) {\n            throw new \\InvalidArgumentException('The supplied name is too long. HipChat\\'s v1 API supports names up to 15 UTF-8 characters.');\n        }\n\n        $connectionString = $useSSL ? 'ssl://'.$host.':443' : $host.':80';\n        parent::__construct($connectionString, $level, $bubble);\n\n        $this->token = $token;\n        $this->name = $name;\n        $this->notify = $notify;\n        $this->room = $room;\n        $this->format = $format;\n        $this->host = $host;\n        $this->version = $version;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @param  array  $record\n     * @return string\n     */\n    protected function generateDataStream($record)\n    {\n        $content = $this->buildContent($record);\n\n        return $this->buildHeader($content) . $content;\n    }\n\n    /**\n     * Builds the body of API call\n     *\n     * @param  array  $record\n     * @return string\n     */\n    private function buildContent($record)\n    {\n        $dataArray = array(\n            'notify' => $this->version == self::API_V1 ?\n                ($this->notify ? 1 : 0) :\n                ($this->notify ? 'true' : 'false'),\n            'message' => $record['formatted'],\n            'message_format' => $this->format,\n            'color' => $this->getAlertColor($record['level']),\n        );\n\n        if (!$this->validateStringLength($dataArray['message'], static::MAXIMUM_MESSAGE_LENGTH)) {\n            if (function_exists('mb_substr')) {\n                $dataArray['message'] = mb_substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH).' [truncated]';\n            } else {\n                $dataArray['message'] = substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH).' [truncated]';\n            }\n        }\n\n        // if we are using the legacy API then we need to send some additional information\n        if ($this->version == self::API_V1) {\n            $dataArray['room_id'] = $this->room;\n        }\n\n        // append the sender name if it is set\n        // always append it if we use the v1 api (it is required in v1)\n        if ($this->version == self::API_V1 || $this->name !== null) {\n            $dataArray['from'] = (string) $this->name;\n        }\n\n        return http_build_query($dataArray);\n    }\n\n    /**\n     * Builds the header of the API Call\n     *\n     * @param  string $content\n     * @return string\n     */\n    private function buildHeader($content)\n    {\n        if ($this->version == self::API_V1) {\n            $header = \"POST /v1/rooms/message?format=json&auth_token={$this->token} HTTP/1.1\\r\\n\";\n        } else {\n            // needed for rooms with special (spaces, etc) characters in the name\n            $room = rawurlencode($this->room);\n            $header = \"POST /v2/room/{$room}/notification?auth_token={$this->token} HTTP/1.1\\r\\n\";\n        }\n\n        $header .= \"Host: {$this->host}\\r\\n\";\n        $header .= \"Content-Type: application/x-www-form-urlencoded\\r\\n\";\n        $header .= \"Content-Length: \" . strlen($content) . \"\\r\\n\";\n        $header .= \"\\r\\n\";\n\n        return $header;\n    }\n\n    /**\n     * Assigns a color to each level of log records.\n     *\n     * @param  int    $level\n     * @return string\n     */\n    protected function getAlertColor($level)\n    {\n        switch (true) {\n            case $level >= Logger::ERROR:\n                return 'red';\n            case $level >= Logger::WARNING:\n                return 'yellow';\n            case $level >= Logger::INFO:\n                return 'green';\n            case $level == Logger::DEBUG:\n                return 'gray';\n            default:\n                return 'yellow';\n        }\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @param array $record\n     */\n    protected function write(array $record)\n    {\n        parent::write($record);\n        $this->closeSocket();\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handleBatch(array $records)\n    {\n        if (count($records) == 0) {\n            return true;\n        }\n\n        $batchRecords = $this->combineRecords($records);\n\n        $handled = false;\n        foreach ($batchRecords as $batchRecord) {\n            if ($this->isHandling($batchRecord)) {\n                $this->write($batchRecord);\n                $handled = true;\n            }\n        }\n\n        if (!$handled) {\n            return false;\n        }\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * Combines multiple records into one. Error level of the combined record\n     * will be the highest level from the given records. Datetime will be taken\n     * from the first record.\n     *\n     * @param $records\n     * @return array\n     */\n    private function combineRecords($records)\n    {\n        $batchRecord = null;\n        $batchRecords = array();\n        $messages = array();\n        $formattedMessages = array();\n        $level = 0;\n        $levelName = null;\n        $datetime = null;\n\n        foreach ($records as $record) {\n            $record = $this->processRecord($record);\n\n            if ($record['level'] > $level) {\n                $level = $record['level'];\n                $levelName = $record['level_name'];\n            }\n\n            if (null === $datetime) {\n                $datetime = $record['datetime'];\n            }\n\n            $messages[] = $record['message'];\n            $messageStr = implode(PHP_EOL, $messages);\n            $formattedMessages[] = $this->getFormatter()->format($record);\n            $formattedMessageStr = implode('', $formattedMessages);\n\n            $batchRecord = array(\n                'message'   => $messageStr,\n                'formatted' => $formattedMessageStr,\n                'context'   => array(),\n                'extra'     => array(),\n            );\n\n            if (!$this->validateStringLength($batchRecord['formatted'], static::MAXIMUM_MESSAGE_LENGTH)) {\n                // Pop the last message and implode the remaining messages\n                $lastMessage = array_pop($messages);\n                $lastFormattedMessage = array_pop($formattedMessages);\n                $batchRecord['message'] = implode(PHP_EOL, $messages);\n                $batchRecord['formatted'] = implode('', $formattedMessages);\n\n                $batchRecords[] = $batchRecord;\n                $messages = array($lastMessage);\n                $formattedMessages = array($lastFormattedMessage);\n\n                $batchRecord = null;\n            }\n        }\n\n        if (null !== $batchRecord) {\n            $batchRecords[] = $batchRecord;\n        }\n\n        // Set the max level and datetime for all records\n        foreach ($batchRecords as &$batchRecord) {\n            $batchRecord = array_merge(\n                $batchRecord,\n                array(\n                    'level'      => $level,\n                    'level_name' => $levelName,\n                    'datetime'   => $datetime,\n                )\n            );\n        }\n\n        return $batchRecords;\n    }\n\n    /**\n     * Validates the length of a string.\n     *\n     * If the `mb_strlen()` function is available, it will use that, as HipChat\n     * allows UTF-8 characters. Otherwise, it will fall back to `strlen()`.\n     *\n     * Note that this might cause false failures in the specific case of using\n     * a valid name with less than 16 characters, but 16 or more bytes, on a\n     * system where `mb_strlen()` is unavailable.\n     *\n     * @param string $str\n     * @param int    $length\n     *\n     * @return bool\n     */\n    private function validateStringLength($str, $length)\n    {\n        if (function_exists('mb_strlen')) {\n            return (mb_strlen($str) <= $length);\n        }\n\n        return (strlen($str) <= $length);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * IFTTTHandler uses cURL to trigger IFTTT Maker actions\n *\n * Register a secret key and trigger/event name at https://ifttt.com/maker\n *\n * value1 will be the channel from monolog's Logger constructor,\n * value2 will be the level name (ERROR, WARNING, ..)\n * value3 will be the log record's message\n *\n * @author Nehal Patel <nehal@nehalpatel.me>\n */\nclass IFTTTHandler extends AbstractProcessingHandler\n{\n    private $eventName;\n    private $secretKey;\n\n    /**\n     * @param string  $eventName The name of the IFTTT Maker event that should be triggered\n     * @param string  $secretKey A valid IFTTT secret key\n     * @param int     $level     The minimum logging level at which this handler will be triggered\n     * @param Boolean $bubble    Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct($eventName, $secretKey, $level = Logger::ERROR, $bubble = true)\n    {\n        $this->eventName = $eventName;\n        $this->secretKey = $secretKey;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function write(array $record)\n    {\n        $postData = array(\n            \"value1\" => $record[\"channel\"],\n            \"value2\" => $record[\"level_name\"],\n            \"value3\" => $record[\"message\"],\n        );\n        $postString = json_encode($postData);\n\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, \"https://maker.ifttt.com/trigger/\" . $this->eventName . \"/with/key/\" . $this->secretKey);\n        curl_setopt($ch, CURLOPT_POST, true);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);\n        curl_setopt($ch, CURLOPT_HTTPHEADER, array(\n            \"Content-Type: application/json\",\n        ));\n\n        Curl\\Util::execute($ch);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * @author Robert Kaufmann III <rok3@rok3.me>\n */\nclass LogEntriesHandler extends SocketHandler\n{\n    /**\n     * @var string\n     */\n    protected $logToken;\n\n    /**\n     * @param string $token  Log token supplied by LogEntries\n     * @param bool   $useSSL Whether or not SSL encryption should be used.\n     * @param int    $level  The minimum logging level to trigger this handler\n     * @param bool   $bubble Whether or not messages that are handled should bubble up the stack.\n     *\n     * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing\n     */\n    public function __construct($token, $useSSL = true, $level = Logger::DEBUG, $bubble = true)\n    {\n        if ($useSSL && !extension_loaded('openssl')) {\n            throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler');\n        }\n\n        $endpoint = $useSSL ? 'ssl://data.logentries.com:443' : 'data.logentries.com:80';\n        parent::__construct($endpoint, $level, $bubble);\n        $this->logToken = $token;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @param  array  $record\n     * @return string\n     */\n    protected function generateDataStream($record)\n    {\n        return $this->logToken . ' ' . $record['formatted'];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\LogglyFormatter;\n\n/**\n * Sends errors to Loggly.\n *\n * @author Przemek Sobstel <przemek@sobstel.org>\n * @author Adam Pancutt <adam@pancutt.com>\n * @author Gregory Barchard <gregory@barchard.net>\n */\nclass LogglyHandler extends AbstractProcessingHandler\n{\n    const HOST = 'logs-01.loggly.com';\n    const ENDPOINT_SINGLE = 'inputs';\n    const ENDPOINT_BATCH = 'bulk';\n\n    protected $token;\n\n    protected $tag = array();\n\n    public function __construct($token, $level = Logger::DEBUG, $bubble = true)\n    {\n        if (!extension_loaded('curl')) {\n            throw new \\LogicException('The curl extension is needed to use the LogglyHandler');\n        }\n\n        $this->token = $token;\n\n        parent::__construct($level, $bubble);\n    }\n\n    public function setTag($tag)\n    {\n        $tag = !empty($tag) ? $tag : array();\n        $this->tag = is_array($tag) ? $tag : array($tag);\n    }\n\n    public function addTag($tag)\n    {\n        if (!empty($tag)) {\n            $tag = is_array($tag) ? $tag : array($tag);\n            $this->tag = array_unique(array_merge($this->tag, $tag));\n        }\n    }\n\n    protected function write(array $record)\n    {\n        $this->send($record[\"formatted\"], self::ENDPOINT_SINGLE);\n    }\n\n    public function handleBatch(array $records)\n    {\n        $level = $this->level;\n\n        $records = array_filter($records, function ($record) use ($level) {\n            return ($record['level'] >= $level);\n        });\n\n        if ($records) {\n            $this->send($this->getFormatter()->formatBatch($records), self::ENDPOINT_BATCH);\n        }\n    }\n\n    protected function send($data, $endpoint)\n    {\n        $url = sprintf(\"https://%s/%s/%s/\", self::HOST, $endpoint, $this->token);\n\n        $headers = array('Content-Type: application/json');\n\n        if (!empty($this->tag)) {\n            $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag);\n        }\n\n        $ch = curl_init();\n\n        curl_setopt($ch, CURLOPT_URL, $url);\n        curl_setopt($ch, CURLOPT_POST, true);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);\n        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n\n        Curl\\Util::execute($ch);\n    }\n\n    protected function getDefaultFormatter()\n    {\n        return new LogglyFormatter();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\n/**\n * Base class for all mail handlers\n *\n * @author Gyula Sallai\n */\nabstract class MailHandler extends AbstractProcessingHandler\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function handleBatch(array $records)\n    {\n        $messages = array();\n\n        foreach ($records as $record) {\n            if ($record['level'] < $this->level) {\n                continue;\n            }\n            $messages[] = $this->processRecord($record);\n        }\n\n        if (!empty($messages)) {\n            $this->send((string) $this->getFormatter()->formatBatch($messages), $messages);\n        }\n    }\n\n    /**\n     * Send a mail with the given content\n     *\n     * @param string $content formatted email body to be sent\n     * @param array  $records the array of log records that formed this content\n     */\n    abstract protected function send($content, array $records);\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        $this->send((string) $record['formatted'], array($record));\n    }\n\n    protected function getHighestRecord(array $records)\n    {\n        $highestRecord = null;\n        foreach ($records as $record) {\n            if ($highestRecord === null || $highestRecord['level'] < $record['level']) {\n                $highestRecord = $record;\n            }\n        }\n\n        return $highestRecord;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * MandrillHandler uses cURL to send the emails to the Mandrill API\n *\n * @author Adam Nicholson <adamnicholson10@gmail.com>\n */\nclass MandrillHandler extends MailHandler\n{\n    protected $message;\n    protected $apiKey;\n\n    /**\n     * @param string                  $apiKey  A valid Mandrill API key\n     * @param callable|\\Swift_Message $message An example message for real messages, only the body will be replaced\n     * @param int                     $level   The minimum logging level at which this handler will be triggered\n     * @param Boolean                 $bubble  Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct($apiKey, $message, $level = Logger::ERROR, $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        if (!$message instanceof \\Swift_Message && is_callable($message)) {\n            $message = call_user_func($message);\n        }\n        if (!$message instanceof \\Swift_Message) {\n            throw new \\InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it');\n        }\n        $this->message = $message;\n        $this->apiKey = $apiKey;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function send($content, array $records)\n    {\n        $message = clone $this->message;\n        $message->setBody($content);\n        $message->setDate(time());\n\n        $ch = curl_init();\n\n        curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json');\n        curl_setopt($ch, CURLOPT_POST, 1);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array(\n            'key' => $this->apiKey,\n            'raw_message' => (string) $message,\n            'async' => false,\n        )));\n\n        Curl\\Util::execute($ch);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\n/**\n * Exception can be thrown if an extension for an handler is missing\n *\n * @author  Christian Bergau <cbergau86@gmail.com>\n */\nclass MissingExtensionException extends \\Exception\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\NormalizerFormatter;\n\n/**\n * Logs to a MongoDB database.\n *\n * usage example:\n *\n *   $log = new Logger('application');\n *   $mongodb = new MongoDBHandler(new \\Mongo(\"mongodb://localhost:27017\"), \"logs\", \"prod\");\n *   $log->pushHandler($mongodb);\n *\n * @author Thomas Tourlourat <thomas@tourlourat.com>\n */\nclass MongoDBHandler extends AbstractProcessingHandler\n{\n    protected $mongoCollection;\n\n    public function __construct($mongo, $database, $collection, $level = Logger::DEBUG, $bubble = true)\n    {\n        if (!($mongo instanceof \\MongoClient || $mongo instanceof \\Mongo || $mongo instanceof \\MongoDB\\Client)) {\n            throw new \\InvalidArgumentException('MongoClient, Mongo or MongoDB\\Client instance required');\n        }\n\n        $this->mongoCollection = $mongo->selectCollection($database, $collection);\n\n        parent::__construct($level, $bubble);\n    }\n\n    protected function write(array $record)\n    {\n        if ($this->mongoCollection instanceof \\MongoDB\\Collection) {\n            $this->mongoCollection->insertOne($record[\"formatted\"]);\n        } else {\n            $this->mongoCollection->save($record[\"formatted\"]);\n        }\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new NormalizerFormatter();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\LineFormatter;\n\n/**\n * NativeMailerHandler uses the mail() function to send the emails\n *\n * @author Christophe Coevoet <stof@notk.org>\n * @author Mark Garrett <mark@moderndeveloperllc.com>\n */\nclass NativeMailerHandler extends MailHandler\n{\n    /**\n     * The email addresses to which the message will be sent\n     * @var array\n     */\n    protected $to;\n\n    /**\n     * The subject of the email\n     * @var string\n     */\n    protected $subject;\n\n    /**\n     * Optional headers for the message\n     * @var array\n     */\n    protected $headers = array();\n\n    /**\n     * Optional parameters for the message\n     * @var array\n     */\n    protected $parameters = array();\n\n    /**\n     * The wordwrap length for the message\n     * @var int\n     */\n    protected $maxColumnWidth;\n\n    /**\n     * The Content-type for the message\n     * @var string\n     */\n    protected $contentType = 'text/plain';\n\n    /**\n     * The encoding for the message\n     * @var string\n     */\n    protected $encoding = 'utf-8';\n\n    /**\n     * @param string|array $to             The receiver of the mail\n     * @param string       $subject        The subject of the mail\n     * @param string       $from           The sender of the mail\n     * @param int          $level          The minimum logging level at which this handler will be triggered\n     * @param bool         $bubble         Whether the messages that are handled can bubble up the stack or not\n     * @param int          $maxColumnWidth The maximum column width that the message lines will have\n     */\n    public function __construct($to, $subject, $from, $level = Logger::ERROR, $bubble = true, $maxColumnWidth = 70)\n    {\n        parent::__construct($level, $bubble);\n        $this->to = is_array($to) ? $to : array($to);\n        $this->subject = $subject;\n        $this->addHeader(sprintf('From: %s', $from));\n        $this->maxColumnWidth = $maxColumnWidth;\n    }\n\n    /**\n     * Add headers to the message\n     *\n     * @param  string|array $headers Custom added headers\n     * @return self\n     */\n    public function addHeader($headers)\n    {\n        foreach ((array) $headers as $header) {\n            if (strpos($header, \"\\n\") !== false || strpos($header, \"\\r\") !== false) {\n                throw new \\InvalidArgumentException('Headers can not contain newline characters for security reasons');\n            }\n            $this->headers[] = $header;\n        }\n\n        return $this;\n    }\n\n    /**\n     * Add parameters to the message\n     *\n     * @param  string|array $parameters Custom added parameters\n     * @return self\n     */\n    public function addParameter($parameters)\n    {\n        $this->parameters = array_merge($this->parameters, (array) $parameters);\n\n        return $this;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function send($content, array $records)\n    {\n        $content = wordwrap($content, $this->maxColumnWidth);\n        $headers = ltrim(implode(\"\\r\\n\", $this->headers) . \"\\r\\n\", \"\\r\\n\");\n        $headers .= 'Content-type: ' . $this->getContentType() . '; charset=' . $this->getEncoding() . \"\\r\\n\";\n        if ($this->getContentType() == 'text/html' && false === strpos($headers, 'MIME-Version:')) {\n            $headers .= 'MIME-Version: 1.0' . \"\\r\\n\";\n        }\n\n        $subject = $this->subject;\n        if ($records) {\n            $subjectFormatter = new LineFormatter($this->subject);\n            $subject = $subjectFormatter->format($this->getHighestRecord($records));\n        }\n\n        $parameters = implode(' ', $this->parameters);\n        foreach ($this->to as $to) {\n            mail($to, $subject, $content, $headers, $parameters);\n        }\n    }\n\n    /**\n     * @return string $contentType\n     */\n    public function getContentType()\n    {\n        return $this->contentType;\n    }\n\n    /**\n     * @return string $encoding\n     */\n    public function getEncoding()\n    {\n        return $this->encoding;\n    }\n\n    /**\n     * @param  string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML\n     *                             messages.\n     * @return self\n     */\n    public function setContentType($contentType)\n    {\n        if (strpos($contentType, \"\\n\") !== false || strpos($contentType, \"\\r\") !== false) {\n            throw new \\InvalidArgumentException('The content type can not contain newline characters to prevent email header injection');\n        }\n\n        $this->contentType = $contentType;\n\n        return $this;\n    }\n\n    /**\n     * @param  string $encoding\n     * @return self\n     */\n    public function setEncoding($encoding)\n    {\n        if (strpos($encoding, \"\\n\") !== false || strpos($encoding, \"\\r\") !== false) {\n            throw new \\InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection');\n        }\n\n        $this->encoding = $encoding;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\NormalizerFormatter;\n\n/**\n * Class to record a log on a NewRelic application.\n * Enabling New Relic High Security mode may prevent capture of useful information.\n *\n * @see https://docs.newrelic.com/docs/agents/php-agent\n * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security\n */\nclass NewRelicHandler extends AbstractProcessingHandler\n{\n    /**\n     * Name of the New Relic application that will receive logs from this handler.\n     *\n     * @var string\n     */\n    protected $appName;\n\n    /**\n     * Name of the current transaction\n     *\n     * @var string\n     */\n    protected $transactionName;\n\n    /**\n     * Some context and extra data is passed into the handler as arrays of values. Do we send them as is\n     * (useful if we are using the API), or explode them for display on the NewRelic RPM website?\n     *\n     * @var bool\n     */\n    protected $explodeArrays;\n\n    /**\n     * {@inheritDoc}\n     *\n     * @param string $appName\n     * @param bool   $explodeArrays\n     * @param string $transactionName\n     */\n    public function __construct(\n        $level = Logger::ERROR,\n        $bubble = true,\n        $appName = null,\n        $explodeArrays = false,\n        $transactionName = null\n    ) {\n        parent::__construct($level, $bubble);\n\n        $this->appName       = $appName;\n        $this->explodeArrays = $explodeArrays;\n        $this->transactionName = $transactionName;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function write(array $record)\n    {\n        if (!$this->isNewRelicEnabled()) {\n            throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler');\n        }\n\n        if ($appName = $this->getAppName($record['context'])) {\n            $this->setNewRelicAppName($appName);\n        }\n\n        if ($transactionName = $this->getTransactionName($record['context'])) {\n            $this->setNewRelicTransactionName($transactionName);\n            unset($record['formatted']['context']['transaction_name']);\n        }\n\n        if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \\Exception) {\n            newrelic_notice_error($record['message'], $record['context']['exception']);\n            unset($record['formatted']['context']['exception']);\n        } else {\n            newrelic_notice_error($record['message']);\n        }\n\n        if (isset($record['formatted']['context']) && is_array($record['formatted']['context'])) {\n            foreach ($record['formatted']['context'] as $key => $parameter) {\n                if (is_array($parameter) && $this->explodeArrays) {\n                    foreach ($parameter as $paramKey => $paramValue) {\n                        $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue);\n                    }\n                } else {\n                    $this->setNewRelicParameter('context_' . $key, $parameter);\n                }\n            }\n        }\n\n        if (isset($record['formatted']['extra']) && is_array($record['formatted']['extra'])) {\n            foreach ($record['formatted']['extra'] as $key => $parameter) {\n                if (is_array($parameter) && $this->explodeArrays) {\n                    foreach ($parameter as $paramKey => $paramValue) {\n                        $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue);\n                    }\n                } else {\n                    $this->setNewRelicParameter('extra_' . $key, $parameter);\n                }\n            }\n        }\n    }\n\n    /**\n     * Checks whether the NewRelic extension is enabled in the system.\n     *\n     * @return bool\n     */\n    protected function isNewRelicEnabled()\n    {\n        return extension_loaded('newrelic');\n    }\n\n    /**\n     * Returns the appname where this log should be sent. Each log can override the default appname, set in this\n     * handler's constructor, by providing the appname in it's context.\n     *\n     * @param  array       $context\n     * @return null|string\n     */\n    protected function getAppName(array $context)\n    {\n        if (isset($context['appname'])) {\n            return $context['appname'];\n        }\n\n        return $this->appName;\n    }\n\n    /**\n     * Returns the name of the current transaction. Each log can override the default transaction name, set in this\n     * handler's constructor, by providing the transaction_name in it's context\n     *\n     * @param array $context\n     *\n     * @return null|string\n     */\n    protected function getTransactionName(array $context)\n    {\n        if (isset($context['transaction_name'])) {\n            return $context['transaction_name'];\n        }\n\n        return $this->transactionName;\n    }\n\n    /**\n     * Sets the NewRelic application that should receive this log.\n     *\n     * @param string $appName\n     */\n    protected function setNewRelicAppName($appName)\n    {\n        newrelic_set_appname($appName);\n    }\n\n    /**\n     * Overwrites the name of the current transaction\n     *\n     * @param string $transactionName\n     */\n    protected function setNewRelicTransactionName($transactionName)\n    {\n        newrelic_name_transaction($transactionName);\n    }\n\n    /**\n     * @param string $key\n     * @param mixed  $value\n     */\n    protected function setNewRelicParameter($key, $value)\n    {\n        if (null === $value || is_scalar($value)) {\n            newrelic_add_custom_parameter($key, $value);\n        } else {\n            newrelic_add_custom_parameter($key, @json_encode($value));\n        }\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new NormalizerFormatter();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Blackhole\n *\n * Any record it can handle will be thrown away. This can be used\n * to put on top of an existing stack to override it temporarily.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass NullHandler extends AbstractHandler\n{\n    /**\n     * @param int $level The minimum logging level at which this handler will be triggered\n     */\n    public function __construct($level = Logger::DEBUG)\n    {\n        parent::__construct($level, false);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handle(array $record)\n    {\n        if ($record['level'] < $this->level) {\n            return false;\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Exception;\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Logger;\nuse PhpConsole\\Connector;\nuse PhpConsole\\Handler;\nuse PhpConsole\\Helper;\n\n/**\n * Monolog handler for Google Chrome extension \"PHP Console\"\n *\n * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely\n *\n * Usage:\n * 1. Install Google Chrome extension https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef\n * 2. See overview https://github.com/barbushin/php-console#overview\n * 3. Install PHP Console library https://github.com/barbushin/php-console#installation\n * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png)\n *\n *      $logger = new \\Monolog\\Logger('all', array(new \\Monolog\\Handler\\PHPConsoleHandler()));\n *      \\Monolog\\ErrorHandler::register($logger);\n *      echo $undefinedVar;\n *      $logger->addDebug('SELECT * FROM users', array('db', 'time' => 0.012));\n *      PC::debug($_SERVER); // PHP Console debugger for any type of vars\n *\n * @author Sergey Barbushin https://www.linkedin.com/in/barbushin\n */\nclass PHPConsoleHandler extends AbstractProcessingHandler\n{\n    private $options = array(\n        'enabled' => true, // bool Is PHP Console server enabled\n        'classesPartialsTraceIgnore' => array('Monolog\\\\'), // array Hide calls of classes started with...\n        'debugTagsKeysInContext' => array(0, 'tag'), // bool Is PHP Console server enabled\n        'useOwnErrorsHandler' => false, // bool Enable errors handling\n        'useOwnExceptionsHandler' => false, // bool Enable exceptions handling\n        'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths\n        'registerHelper' => true, // bool Register PhpConsole\\Helper that allows short debug calls like PC::debug($var, 'ta.g.s')\n        'serverEncoding' => null, // string|null Server internal encoding\n        'headersLimit' => null, // int|null Set headers size limit for your web-server\n        'password' => null, // string|null Protect PHP Console connection by password\n        'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed\n        'ipMasks' => array(), // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1')\n        'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required)\n        'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings\n        'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level\n        'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number\n        'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item\n        'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON\n        'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug\n        'dataStorage' => null, // PhpConsole\\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ)\n    );\n\n    /** @var Connector */\n    private $connector;\n\n    /**\n     * @param  array          $options   See \\Monolog\\Handler\\PHPConsoleHandler::$options for more details\n     * @param  Connector|null $connector Instance of \\PhpConsole\\Connector class (optional)\n     * @param  int            $level\n     * @param  bool           $bubble\n     * @throws Exception\n     */\n    public function __construct(array $options = array(), Connector $connector = null, $level = Logger::DEBUG, $bubble = true)\n    {\n        if (!class_exists('PhpConsole\\Connector')) {\n            throw new Exception('PHP Console library not found. See https://github.com/barbushin/php-console#installation');\n        }\n        parent::__construct($level, $bubble);\n        $this->options = $this->initOptions($options);\n        $this->connector = $this->initConnector($connector);\n    }\n\n    private function initOptions(array $options)\n    {\n        $wrongOptions = array_diff(array_keys($options), array_keys($this->options));\n        if ($wrongOptions) {\n            throw new Exception('Unknown options: ' . implode(', ', $wrongOptions));\n        }\n\n        return array_replace($this->options, $options);\n    }\n\n    private function initConnector(Connector $connector = null)\n    {\n        if (!$connector) {\n            if ($this->options['dataStorage']) {\n                Connector::setPostponeStorage($this->options['dataStorage']);\n            }\n            $connector = Connector::getInstance();\n        }\n\n        if ($this->options['registerHelper'] && !Helper::isRegistered()) {\n            Helper::register();\n        }\n\n        if ($this->options['enabled'] && $connector->isActiveClient()) {\n            if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) {\n                $handler = Handler::getInstance();\n                $handler->setHandleErrors($this->options['useOwnErrorsHandler']);\n                $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']);\n                $handler->start();\n            }\n            if ($this->options['sourcesBasePath']) {\n                $connector->setSourcesBasePath($this->options['sourcesBasePath']);\n            }\n            if ($this->options['serverEncoding']) {\n                $connector->setServerEncoding($this->options['serverEncoding']);\n            }\n            if ($this->options['password']) {\n                $connector->setPassword($this->options['password']);\n            }\n            if ($this->options['enableSslOnlyMode']) {\n                $connector->enableSslOnlyMode();\n            }\n            if ($this->options['ipMasks']) {\n                $connector->setAllowedIpMasks($this->options['ipMasks']);\n            }\n            if ($this->options['headersLimit']) {\n                $connector->setHeadersLimit($this->options['headersLimit']);\n            }\n            if ($this->options['detectDumpTraceAndSource']) {\n                $connector->getDebugDispatcher()->detectTraceAndSource = true;\n            }\n            $dumper = $connector->getDumper();\n            $dumper->levelLimit = $this->options['dumperLevelLimit'];\n            $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit'];\n            $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit'];\n            $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit'];\n            $dumper->detectCallbacks = $this->options['dumperDetectCallbacks'];\n            if ($this->options['enableEvalListener']) {\n                $connector->startEvalRequestsListener();\n            }\n        }\n\n        return $connector;\n    }\n\n    public function getConnector()\n    {\n        return $this->connector;\n    }\n\n    public function getOptions()\n    {\n        return $this->options;\n    }\n\n    public function handle(array $record)\n    {\n        if ($this->options['enabled'] && $this->connector->isActiveClient()) {\n            return parent::handle($record);\n        }\n\n        return !$this->bubble;\n    }\n\n    /**\n     * Writes the record down to the log of the implementing handler\n     *\n     * @param  array $record\n     * @return void\n     */\n    protected function write(array $record)\n    {\n        if ($record['level'] < Logger::NOTICE) {\n            $this->handleDebugRecord($record);\n        } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof Exception) {\n            $this->handleExceptionRecord($record);\n        } else {\n            $this->handleErrorRecord($record);\n        }\n    }\n\n    private function handleDebugRecord(array $record)\n    {\n        $tags = $this->getRecordTags($record);\n        $message = $record['message'];\n        if ($record['context']) {\n            $message .= ' ' . json_encode($this->connector->getDumper()->dump(array_filter($record['context'])));\n        }\n        $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']);\n    }\n\n    private function handleExceptionRecord(array $record)\n    {\n        $this->connector->getErrorsDispatcher()->dispatchException($record['context']['exception']);\n    }\n\n    private function handleErrorRecord(array $record)\n    {\n        $context = $record['context'];\n\n        $this->connector->getErrorsDispatcher()->dispatchError(\n            isset($context['code']) ? $context['code'] : null,\n            isset($context['message']) ? $context['message'] : $record['message'],\n            isset($context['file']) ? $context['file'] : null,\n            isset($context['line']) ? $context['line'] : null,\n            $this->options['classesPartialsTraceIgnore']\n        );\n    }\n\n    private function getRecordTags(array &$record)\n    {\n        $tags = null;\n        if (!empty($record['context'])) {\n            $context = & $record['context'];\n            foreach ($this->options['debugTagsKeysInContext'] as $key) {\n                if (!empty($context[$key])) {\n                    $tags = $context[$key];\n                    if ($key === 0) {\n                        array_shift($context);\n                    } else {\n                        unset($context[$key]);\n                    }\n                    break;\n                }\n            }\n        }\n\n        return $tags ?: strtolower($record['level_name']);\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new LineFormatter('%message%');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Psr\\Log\\LoggerInterface;\n\n/**\n * Proxies log messages to an existing PSR-3 compliant logger.\n *\n * @author Michael Moussa <michael.moussa@gmail.com>\n */\nclass PsrHandler extends AbstractHandler\n{\n    /**\n     * PSR-3 compliant logger\n     *\n     * @var LoggerInterface\n     */\n    protected $logger;\n\n    /**\n     * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied\n     * @param int             $level  The minimum logging level at which this handler will be triggered\n     * @param Boolean         $bubble Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        $this->logger = $logger;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function handle(array $record)\n    {\n        if (!$this->isHandling($record)) {\n            return false;\n        }\n\n        $this->logger->log(strtolower($record['level_name']), $record['message'], $record['context']);\n\n        return false === $this->bubble;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Sends notifications through the pushover api to mobile phones\n *\n * @author Sebastian Göttschkes <sebastian.goettschkes@googlemail.com>\n * @see    https://www.pushover.net/api\n */\nclass PushoverHandler extends SocketHandler\n{\n    private $token;\n    private $users;\n    private $title;\n    private $user;\n    private $retry;\n    private $expire;\n\n    private $highPriorityLevel;\n    private $emergencyLevel;\n    private $useFormattedMessage = false;\n\n    /**\n     * All parameters that can be sent to Pushover\n     * @see https://pushover.net/api\n     * @var array\n     */\n    private $parameterNames = array(\n        'token' => true,\n        'user' => true,\n        'message' => true,\n        'device' => true,\n        'title' => true,\n        'url' => true,\n        'url_title' => true,\n        'priority' => true,\n        'timestamp' => true,\n        'sound' => true,\n        'retry' => true,\n        'expire' => true,\n        'callback' => true,\n    );\n\n    /**\n     * Sounds the api supports by default\n     * @see https://pushover.net/api#sounds\n     * @var array\n     */\n    private $sounds = array(\n        'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming',\n        'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb',\n        'persistent', 'echo', 'updown', 'none',\n    );\n\n    /**\n     * @param string       $token             Pushover api token\n     * @param string|array $users             Pushover user id or array of ids the message will be sent to\n     * @param string       $title             Title sent to the Pushover API\n     * @param int          $level             The minimum logging level at which this handler will be triggered\n     * @param Boolean      $bubble            Whether the messages that are handled can bubble up the stack or not\n     * @param Boolean      $useSSL            Whether to connect via SSL. Required when pushing messages to users that are not\n     *                                        the pushover.net app owner. OpenSSL is required for this option.\n     * @param int          $highPriorityLevel The minimum logging level at which this handler will start\n     *                                        sending \"high priority\" requests to the Pushover API\n     * @param int          $emergencyLevel    The minimum logging level at which this handler will start\n     *                                        sending \"emergency\" requests to the Pushover API\n     * @param int          $retry             The retry parameter specifies how often (in seconds) the Pushover servers will send the same notification to the user.\n     * @param int          $expire            The expire parameter specifies how many seconds your notification will continue to be retried for (every retry seconds).\n     */\n    public function __construct($token, $users, $title = null, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $highPriorityLevel = Logger::CRITICAL, $emergencyLevel = Logger::EMERGENCY, $retry = 30, $expire = 25200)\n    {\n        $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80';\n        parent::__construct($connectionString, $level, $bubble);\n\n        $this->token = $token;\n        $this->users = (array) $users;\n        $this->title = $title ?: gethostname();\n        $this->highPriorityLevel = Logger::toMonologLevel($highPriorityLevel);\n        $this->emergencyLevel = Logger::toMonologLevel($emergencyLevel);\n        $this->retry = $retry;\n        $this->expire = $expire;\n    }\n\n    protected function generateDataStream($record)\n    {\n        $content = $this->buildContent($record);\n\n        return $this->buildHeader($content) . $content;\n    }\n\n    private function buildContent($record)\n    {\n        // Pushover has a limit of 512 characters on title and message combined.\n        $maxMessageLength = 512 - strlen($this->title);\n\n        $message = ($this->useFormattedMessage) ? $record['formatted'] : $record['message'];\n        $message = substr($message, 0, $maxMessageLength);\n\n        $timestamp = $record['datetime']->getTimestamp();\n\n        $dataArray = array(\n            'token' => $this->token,\n            'user' => $this->user,\n            'message' => $message,\n            'title' => $this->title,\n            'timestamp' => $timestamp,\n        );\n\n        if (isset($record['level']) && $record['level'] >= $this->emergencyLevel) {\n            $dataArray['priority'] = 2;\n            $dataArray['retry'] = $this->retry;\n            $dataArray['expire'] = $this->expire;\n        } elseif (isset($record['level']) && $record['level'] >= $this->highPriorityLevel) {\n            $dataArray['priority'] = 1;\n        }\n\n        // First determine the available parameters\n        $context = array_intersect_key($record['context'], $this->parameterNames);\n        $extra = array_intersect_key($record['extra'], $this->parameterNames);\n\n        // Least important info should be merged with subsequent info\n        $dataArray = array_merge($extra, $context, $dataArray);\n\n        // Only pass sounds that are supported by the API\n        if (isset($dataArray['sound']) && !in_array($dataArray['sound'], $this->sounds)) {\n            unset($dataArray['sound']);\n        }\n\n        return http_build_query($dataArray);\n    }\n\n    private function buildHeader($content)\n    {\n        $header = \"POST /1/messages.json HTTP/1.1\\r\\n\";\n        $header .= \"Host: api.pushover.net\\r\\n\";\n        $header .= \"Content-Type: application/x-www-form-urlencoded\\r\\n\";\n        $header .= \"Content-Length: \" . strlen($content) . \"\\r\\n\";\n        $header .= \"\\r\\n\";\n\n        return $header;\n    }\n\n    protected function write(array $record)\n    {\n        foreach ($this->users as $user) {\n            $this->user = $user;\n\n            parent::write($record);\n            $this->closeSocket();\n        }\n\n        $this->user = null;\n    }\n\n    public function setHighPriorityLevel($value)\n    {\n        $this->highPriorityLevel = $value;\n    }\n\n    public function setEmergencyLevel($value)\n    {\n        $this->emergencyLevel = $value;\n    }\n\n    /**\n     * Use the formatted message?\n     * @param bool $value\n     */\n    public function useFormattedMessage($value)\n    {\n        $this->useFormattedMessage = (boolean) $value;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Logger;\nuse Raven_Client;\n\n/**\n * Handler to send messages to a Sentry (https://github.com/getsentry/sentry) server\n * using raven-php (https://github.com/getsentry/raven-php)\n *\n * @author Marc Abramowitz <marc@marc-abramowitz.com>\n */\nclass RavenHandler extends AbstractProcessingHandler\n{\n    /**\n     * Translates Monolog log levels to Raven log levels.\n     */\n    private $logLevels = array(\n        Logger::DEBUG     => Raven_Client::DEBUG,\n        Logger::INFO      => Raven_Client::INFO,\n        Logger::NOTICE    => Raven_Client::INFO,\n        Logger::WARNING   => Raven_Client::WARNING,\n        Logger::ERROR     => Raven_Client::ERROR,\n        Logger::CRITICAL  => Raven_Client::FATAL,\n        Logger::ALERT     => Raven_Client::FATAL,\n        Logger::EMERGENCY => Raven_Client::FATAL,\n    );\n\n    /**\n     * @var string should represent the current version of the calling\n     *             software. Can be any string (git commit, version number)\n     */\n    private $release;\n\n    /**\n     * @var Raven_Client the client object that sends the message to the server\n     */\n    protected $ravenClient;\n\n    /**\n     * @var LineFormatter The formatter to use for the logs generated via handleBatch()\n     */\n    protected $batchFormatter;\n\n    /**\n     * @param Raven_Client $ravenClient\n     * @param int          $level       The minimum logging level at which this handler will be triggered\n     * @param Boolean      $bubble      Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct(Raven_Client $ravenClient, $level = Logger::DEBUG, $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        $this->ravenClient = $ravenClient;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handleBatch(array $records)\n    {\n        $level = $this->level;\n\n        // filter records based on their level\n        $records = array_filter($records, function ($record) use ($level) {\n            return $record['level'] >= $level;\n        });\n\n        if (!$records) {\n            return;\n        }\n\n        // the record with the highest severity is the \"main\" one\n        $record = array_reduce($records, function ($highest, $record) {\n            if ($record['level'] > $highest['level']) {\n                return $record;\n            }\n\n            return $highest;\n        });\n\n        // the other ones are added as a context item\n        $logs = array();\n        foreach ($records as $r) {\n            $logs[] = $this->processRecord($r);\n        }\n\n        if ($logs) {\n            $record['context']['logs'] = (string) $this->getBatchFormatter()->formatBatch($logs);\n        }\n\n        $this->handle($record);\n    }\n\n    /**\n     * Sets the formatter for the logs generated by handleBatch().\n     *\n     * @param FormatterInterface $formatter\n     */\n    public function setBatchFormatter(FormatterInterface $formatter)\n    {\n        $this->batchFormatter = $formatter;\n    }\n\n    /**\n     * Gets the formatter for the logs generated by handleBatch().\n     *\n     * @return FormatterInterface\n     */\n    public function getBatchFormatter()\n    {\n        if (!$this->batchFormatter) {\n            $this->batchFormatter = $this->getDefaultBatchFormatter();\n        }\n\n        return $this->batchFormatter;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        $previousUserContext = false;\n        $options = array();\n        $options['level'] = $this->logLevels[$record['level']];\n        $options['tags'] = array();\n        if (!empty($record['extra']['tags'])) {\n            $options['tags'] = array_merge($options['tags'], $record['extra']['tags']);\n            unset($record['extra']['tags']);\n        }\n        if (!empty($record['context']['tags'])) {\n            $options['tags'] = array_merge($options['tags'], $record['context']['tags']);\n            unset($record['context']['tags']);\n        }\n        if (!empty($record['context']['fingerprint'])) {\n            $options['fingerprint'] = $record['context']['fingerprint'];\n            unset($record['context']['fingerprint']);\n        }\n        if (!empty($record['context']['logger'])) {\n            $options['logger'] = $record['context']['logger'];\n            unset($record['context']['logger']);\n        } else {\n            $options['logger'] = $record['channel'];\n        }\n        foreach ($this->getExtraParameters() as $key) {\n            foreach (array('extra', 'context') as $source) {\n                if (!empty($record[$source][$key])) {\n                    $options[$key] = $record[$source][$key];\n                    unset($record[$source][$key]);\n                }\n            }\n        }\n        if (!empty($record['context'])) {\n            $options['extra']['context'] = $record['context'];\n            if (!empty($record['context']['user'])) {\n                $previousUserContext = $this->ravenClient->context->user;\n                $this->ravenClient->user_context($record['context']['user']);\n                unset($options['extra']['context']['user']);\n            }\n        }\n        if (!empty($record['extra'])) {\n            $options['extra']['extra'] = $record['extra'];\n        }\n\n        if (!empty($this->release) && !isset($options['release'])) {\n            $options['release'] = $this->release;\n        }\n\n        if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \\Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \\Throwable))) {\n            $options['extra']['message'] = $record['formatted'];\n            $this->ravenClient->captureException($record['context']['exception'], $options);\n        } else {\n            $this->ravenClient->captureMessage($record['formatted'], array(), $options);\n        }\n\n        if ($previousUserContext !== false) {\n            $this->ravenClient->user_context($previousUserContext);\n        }\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new LineFormatter('[%channel%] %message%');\n    }\n\n    /**\n     * Gets the default formatter for the logs generated by handleBatch().\n     *\n     * @return FormatterInterface\n     */\n    protected function getDefaultBatchFormatter()\n    {\n        return new LineFormatter();\n    }\n\n    /**\n     * Gets extra parameters supported by Raven that can be found in \"extra\" and \"context\"\n     *\n     * @return array\n     */\n    protected function getExtraParameters()\n    {\n        return array('checksum', 'release', 'event_id');\n    }\n\n    /**\n     * @param string $value\n     * @return self\n     */\n    public function setRelease($value)\n    {\n        $this->release = $value;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Logger;\n\n/**\n * Logs to a Redis key using rpush\n *\n * usage example:\n *\n *   $log = new Logger('application');\n *   $redis = new RedisHandler(new Predis\\Client(\"tcp://localhost:6379\"), \"logs\", \"prod\");\n *   $log->pushHandler($redis);\n *\n * @author Thomas Tourlourat <thomas@tourlourat.com>\n */\nclass RedisHandler extends AbstractProcessingHandler\n{\n    private $redisClient;\n    private $redisKey;\n    protected $capSize;\n\n    /**\n     * @param \\Predis\\Client|\\Redis $redis   The redis instance\n     * @param string                $key     The key name to push records to\n     * @param int                   $level   The minimum logging level at which this handler will be triggered\n     * @param bool                  $bubble  Whether the messages that are handled can bubble up the stack or not\n     * @param int                   $capSize Number of entries to limit list size to\n     */\n    public function __construct($redis, $key, $level = Logger::DEBUG, $bubble = true, $capSize = false)\n    {\n        if (!(($redis instanceof \\Predis\\Client) || ($redis instanceof \\Redis))) {\n            throw new \\InvalidArgumentException('Predis\\Client or Redis instance required');\n        }\n\n        $this->redisClient = $redis;\n        $this->redisKey = $key;\n        $this->capSize = $capSize;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function write(array $record)\n    {\n        if ($this->capSize) {\n            $this->writeCapped($record);\n        } else {\n            $this->redisClient->rpush($this->redisKey, $record[\"formatted\"]);\n        }\n    }\n\n    /**\n     * Write and cap the collection\n     * Writes the record to the redis list and caps its\n     *\n     * @param  array $record associative record array\n     * @return void\n     */\n    protected function writeCapped(array $record)\n    {\n        if ($this->redisClient instanceof \\Redis) {\n            $this->redisClient->multi()\n                ->rpush($this->redisKey, $record[\"formatted\"])\n                ->ltrim($this->redisKey, -$this->capSize, -1)\n                ->exec();\n        } else {\n            $redisKey = $this->redisKey;\n            $capSize = $this->capSize;\n            $this->redisClient->transaction(function ($tx) use ($record, $redisKey, $capSize) {\n                $tx->rpush($redisKey, $record[\"formatted\"]);\n                $tx->ltrim($redisKey, -$capSize, -1);\n            });\n        }\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    protected function getDefaultFormatter()\n    {\n        return new LineFormatter();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse RollbarNotifier;\nuse Exception;\nuse Monolog\\Logger;\n\n/**\n * Sends errors to Rollbar\n *\n * If the context data contains a `payload` key, that is used as an array\n * of payload options to RollbarNotifier's report_message/report_exception methods.\n *\n * Rollbar's context info will contain the context + extra keys from the log record\n * merged, and then on top of that a few keys:\n *\n *  - level (rollbar level name)\n *  - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8)\n *  - channel\n *  - datetime (unix timestamp)\n *\n * @author Paul Statezny <paulstatezny@gmail.com>\n */\nclass RollbarHandler extends AbstractProcessingHandler\n{\n    /**\n     * Rollbar notifier\n     *\n     * @var RollbarNotifier\n     */\n    protected $rollbarNotifier;\n\n    protected $levelMap = array(\n        Logger::DEBUG     => 'debug',\n        Logger::INFO      => 'info',\n        Logger::NOTICE    => 'info',\n        Logger::WARNING   => 'warning',\n        Logger::ERROR     => 'error',\n        Logger::CRITICAL  => 'critical',\n        Logger::ALERT     => 'critical',\n        Logger::EMERGENCY => 'critical',\n    );\n\n    /**\n     * Records whether any log records have been added since the last flush of the rollbar notifier\n     *\n     * @var bool\n     */\n    private $hasRecords = false;\n\n    protected $initialized = false;\n\n    /**\n     * @param RollbarNotifier $rollbarNotifier RollbarNotifier object constructed with valid token\n     * @param int             $level           The minimum logging level at which this handler will be triggered\n     * @param bool            $bubble          Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct(RollbarNotifier $rollbarNotifier, $level = Logger::ERROR, $bubble = true)\n    {\n        $this->rollbarNotifier = $rollbarNotifier;\n\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        if (!$this->initialized) {\n            // __destructor() doesn't get called on Fatal errors\n            register_shutdown_function(array($this, 'close'));\n            $this->initialized = true;\n        }\n\n        $context = $record['context'];\n        $payload = array();\n        if (isset($context['payload'])) {\n            $payload = $context['payload'];\n            unset($context['payload']);\n        }\n        $context = array_merge($context, $record['extra'], array(\n            'level' => $this->levelMap[$record['level']],\n            'monolog_level' => $record['level_name'],\n            'channel' => $record['channel'],\n            'datetime' => $record['datetime']->format('U'),\n        ));\n\n        if (isset($context['exception']) && $context['exception'] instanceof Exception) {\n            $payload['level'] = $context['level'];\n            $exception = $context['exception'];\n            unset($context['exception']);\n\n            $this->rollbarNotifier->report_exception($exception, $context, $payload);\n        } else {\n            $this->rollbarNotifier->report_message(\n                $record['message'],\n                $context['level'],\n                $context,\n                $payload\n            );\n        }\n\n        $this->hasRecords = true;\n    }\n\n    public function flush()\n    {\n        if ($this->hasRecords) {\n            $this->rollbarNotifier->flush();\n            $this->hasRecords = false;\n        }\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function close()\n    {\n        $this->flush();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Stores logs to files that are rotated every day and a limited number of files are kept.\n *\n * This rotation is only intended to be used as a workaround. Using logrotate to\n * handle the rotation is strongly encouraged when you can use it.\n *\n * @author Christophe Coevoet <stof@notk.org>\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass RotatingFileHandler extends StreamHandler\n{\n    const FILE_PER_DAY = 'Y-m-d';\n    const FILE_PER_MONTH = 'Y-m';\n    const FILE_PER_YEAR = 'Y';\n\n    protected $filename;\n    protected $maxFiles;\n    protected $mustRotate;\n    protected $nextRotation;\n    protected $filenameFormat;\n    protected $dateFormat;\n\n    /**\n     * @param string   $filename\n     * @param int      $maxFiles       The maximal amount of files to keep (0 means unlimited)\n     * @param int      $level          The minimum logging level at which this handler will be triggered\n     * @param Boolean  $bubble         Whether the messages that are handled can bubble up the stack or not\n     * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write)\n     * @param Boolean  $useLocking     Try to lock log file before doing any writes\n     */\n    public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false)\n    {\n        $this->filename = $filename;\n        $this->maxFiles = (int) $maxFiles;\n        $this->nextRotation = new \\DateTime('tomorrow');\n        $this->filenameFormat = '{filename}-{date}';\n        $this->dateFormat = 'Y-m-d';\n\n        parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function close()\n    {\n        parent::close();\n\n        if (true === $this->mustRotate) {\n            $this->rotate();\n        }\n    }\n\n    public function setFilenameFormat($filenameFormat, $dateFormat)\n    {\n        if (!preg_match('{^Y(([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) {\n            trigger_error(\n                'Invalid date format - format must be one of '.\n                'RotatingFileHandler::FILE_PER_DAY (\"Y-m-d\"), RotatingFileHandler::FILE_PER_MONTH (\"Y-m\") '.\n                'or RotatingFileHandler::FILE_PER_YEAR (\"Y\"), or you can set one of the '.\n                'date formats using slashes, underscores and/or dots instead of dashes.',\n                E_USER_DEPRECATED\n            );\n        }\n        if (substr_count($filenameFormat, '{date}') === 0) {\n            trigger_error(\n                'Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.',\n                E_USER_DEPRECATED\n            );\n        }\n        $this->filenameFormat = $filenameFormat;\n        $this->dateFormat = $dateFormat;\n        $this->url = $this->getTimedFilename();\n        $this->close();\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        // on the first record written, if the log is new, we should rotate (once per day)\n        if (null === $this->mustRotate) {\n            $this->mustRotate = !file_exists($this->url);\n        }\n\n        if ($this->nextRotation < $record['datetime']) {\n            $this->mustRotate = true;\n            $this->close();\n        }\n\n        parent::write($record);\n    }\n\n    /**\n     * Rotates the files.\n     */\n    protected function rotate()\n    {\n        // update filename\n        $this->url = $this->getTimedFilename();\n        $this->nextRotation = new \\DateTime('tomorrow');\n\n        // skip GC of old logs if files are unlimited\n        if (0 === $this->maxFiles) {\n            return;\n        }\n\n        $logFiles = glob($this->getGlobPattern());\n        if ($this->maxFiles >= count($logFiles)) {\n            // no files to remove\n            return;\n        }\n\n        // Sorting the files by name to remove the older ones\n        usort($logFiles, function ($a, $b) {\n            return strcmp($b, $a);\n        });\n\n        foreach (array_slice($logFiles, $this->maxFiles) as $file) {\n            if (is_writable($file)) {\n                // suppress errors here as unlink() might fail if two processes\n                // are cleaning up/rotating at the same time\n                set_error_handler(function ($errno, $errstr, $errfile, $errline) {});\n                unlink($file);\n                restore_error_handler();\n            }\n        }\n\n        $this->mustRotate = false;\n    }\n\n    protected function getTimedFilename()\n    {\n        $fileInfo = pathinfo($this->filename);\n        $timedFilename = str_replace(\n            array('{filename}', '{date}'),\n            array($fileInfo['filename'], date($this->dateFormat)),\n            $fileInfo['dirname'] . '/' . $this->filenameFormat\n        );\n\n        if (!empty($fileInfo['extension'])) {\n            $timedFilename .= '.'.$fileInfo['extension'];\n        }\n\n        return $timedFilename;\n    }\n\n    protected function getGlobPattern()\n    {\n        $fileInfo = pathinfo($this->filename);\n        $glob = str_replace(\n            array('{filename}', '{date}'),\n            array($fileInfo['filename'], '*'),\n            $fileInfo['dirname'] . '/' . $this->filenameFormat\n        );\n        if (!empty($fileInfo['extension'])) {\n            $glob .= '.'.$fileInfo['extension'];\n        }\n\n        return $glob;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\n/**\n * Sampling handler\n *\n * A sampled event stream can be useful for logging high frequency events in\n * a production environment where you only need an idea of what is happening\n * and are not concerned with capturing every occurrence. Since the decision to\n * handle or not handle a particular event is determined randomly, the\n * resulting sampled log is not guaranteed to contain 1/N of the events that\n * occurred in the application, but based on the Law of large numbers, it will\n * tend to be close to this ratio with a large number of attempts.\n *\n * @author Bryan Davis <bd808@wikimedia.org>\n * @author Kunal Mehta <legoktm@gmail.com>\n */\nclass SamplingHandler extends AbstractHandler\n{\n    /**\n     * @var callable|HandlerInterface $handler\n     */\n    protected $handler;\n\n    /**\n     * @var int $factor\n     */\n    protected $factor;\n\n    /**\n     * @param callable|HandlerInterface $handler Handler or factory callable($record, $fingersCrossedHandler).\n     * @param int                       $factor  Sample factor\n     */\n    public function __construct($handler, $factor)\n    {\n        parent::__construct();\n        $this->handler = $handler;\n        $this->factor = $factor;\n\n        if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) {\n            throw new \\RuntimeException(\"The given handler (\".json_encode($this->handler).\") is not a callable nor a Monolog\\Handler\\HandlerInterface object\");\n        }\n    }\n\n    public function isHandling(array $record)\n    {\n        return $this->handler->isHandling($record);\n    }\n\n    public function handle(array $record)\n    {\n        if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) {\n            // The same logic as in FingersCrossedHandler\n            if (!$this->handler instanceof HandlerInterface) {\n                $this->handler = call_user_func($this->handler, $record, $this);\n                if (!$this->handler instanceof HandlerInterface) {\n                    throw new \\RuntimeException(\"The factory callable should return a HandlerInterface\");\n                }\n            }\n\n            if ($this->processors) {\n                foreach ($this->processors as $processor) {\n                    $record = call_user_func($processor, $record);\n                }\n            }\n\n            $this->handler->handle($record);\n        }\n\n        return false === $this->bubble;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\Slack;\n\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\NormalizerFormatter;\nuse Monolog\\Formatter\\FormatterInterface;\n\n/**\n * Slack record utility helping to log to Slack webhooks or API.\n *\n * @author Greg Kedzierski <greg@gregkedzierski.com>\n * @author Haralan Dobrev <hkdobrev@gmail.com>\n * @see    https://api.slack.com/incoming-webhooks\n * @see    https://api.slack.com/docs/message-attachments\n */\nclass SlackRecord\n{\n    const COLOR_DANGER = 'danger';\n\n    const COLOR_WARNING = 'warning';\n\n    const COLOR_GOOD = 'good';\n\n    const COLOR_DEFAULT = '#e3e4e6';\n\n    /**\n     * Slack channel (encoded ID or name)\n     * @var string|null\n     */\n    private $channel;\n\n    /**\n     * Name of a bot\n     * @var string|null\n     */\n    private $username;\n\n    /**\n     * User icon e.g. 'ghost', 'http://example.com/user.png'\n     * @var string\n     */\n    private $userIcon;\n\n    /**\n     * Whether the message should be added to Slack as attachment (plain text otherwise)\n     * @var bool\n     */\n    private $useAttachment;\n\n    /**\n     * Whether the the context/extra messages added to Slack as attachments are in a short style\n     * @var bool\n     */\n    private $useShortAttachment;\n\n    /**\n     * Whether the attachment should include context and extra data\n     * @var bool\n     */\n    private $includeContextAndExtra;\n\n    /**\n     * Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']\n     * @var array\n     */\n    private $excludeFields;\n\n    /**\n     * @var FormatterInterface\n     */\n    private $formatter;\n\n    /**\n     * @var NormalizerFormatter\n     */\n    private $normalizerFormatter;\n\n    public function __construct($channel = null, $username = null, $useAttachment = true, $userIcon = null, $useShortAttachment = false, $includeContextAndExtra = false, array $excludeFields = array(), FormatterInterface $formatter = null)\n    {\n        $this->channel = $channel;\n        $this->username = $username;\n        $this->userIcon = trim($userIcon, ':');\n        $this->useAttachment = $useAttachment;\n        $this->useShortAttachment = $useShortAttachment;\n        $this->includeContextAndExtra = $includeContextAndExtra;\n        $this->excludeFields = $excludeFields;\n        $this->formatter = $formatter;\n\n        if ($this->includeContextAndExtra) {\n            $this->normalizerFormatter = new NormalizerFormatter();\n        }\n    }\n\n    public function getSlackData(array $record)\n    {\n        $dataArray = array();\n        $record = $this->excludeFields($record);\n\n        if ($this->username) {\n            $dataArray['username'] = $this->username;\n        }\n\n        if ($this->channel) {\n            $dataArray['channel'] = $this->channel;\n        }\n\n        if ($this->formatter && !$this->useAttachment) {\n            $message = $this->formatter->format($record);\n        } else {\n            $message = $record['message'];\n        }\n\n        if ($this->useAttachment) {\n            $attachment = array(\n                'fallback'  => $message,\n                'text'      => $message,\n                'color'     => $this->getAttachmentColor($record['level']),\n                'fields'    => array(),\n                'mrkdwn_in' => array('fields'),\n                'ts'        => $record['datetime']->getTimestamp()\n            );\n\n            if ($this->useShortAttachment) {\n                $attachment['title'] = $record['level_name'];\n            } else {\n                $attachment['title'] = 'Message';\n                $attachment['fields'][] = $this->generateAttachmentField('Level', $record['level_name']);\n            }\n\n\n            if ($this->includeContextAndExtra) {\n                foreach (array('extra', 'context') as $key) {\n                    if (empty($record[$key])) {\n                        continue;\n                    }\n\n                    if ($this->useShortAttachment) {\n                        $attachment['fields'][] = $this->generateAttachmentField(\n                            ucfirst($key),\n                            $record[$key]\n                        );\n                    } else {\n                        // Add all extra fields as individual fields in attachment\n                        $attachment['fields'] = array_merge(\n                            $attachment['fields'],\n                            $this->generateAttachmentFields($record[$key])\n                        );\n                    }\n                }\n            }\n\n            $dataArray['attachments'] = array($attachment);\n        } else {\n            $dataArray['text'] = $message;\n        }\n\n        if ($this->userIcon) {\n            if (filter_var($this->userIcon, FILTER_VALIDATE_URL)) {\n                $dataArray['icon_url'] = $this->userIcon;\n            } else {\n                $dataArray['icon_emoji'] = \":{$this->userIcon}:\";\n            }\n        }\n\n        return $dataArray;\n    }\n\n    /**\n     * Returned a Slack message attachment color associated with\n     * provided level.\n     *\n     * @param  int    $level\n     * @return string\n     */\n    public function getAttachmentColor($level)\n    {\n        switch (true) {\n            case $level >= Logger::ERROR:\n                return self::COLOR_DANGER;\n            case $level >= Logger::WARNING:\n                return self::COLOR_WARNING;\n            case $level >= Logger::INFO:\n                return self::COLOR_GOOD;\n            default:\n                return self::COLOR_DEFAULT;\n        }\n    }\n\n    /**\n     * Stringifies an array of key/value pairs to be used in attachment fields\n     *\n     * @param array $fields\n     *\n     * @return string\n     */\n    public function stringify($fields)\n    {\n        $normalized = $this->normalizerFormatter->format($fields);\n        $prettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128;\n\n        $hasSecondDimension = count(array_filter($normalized, 'is_array'));\n        $hasNonNumericKeys = !count(array_filter(array_keys($normalized), 'is_numeric'));\n\n        return $hasSecondDimension || $hasNonNumericKeys\n            ? json_encode($normalized, $prettyPrintFlag)\n            : json_encode($normalized);\n    }\n\n    /**\n     * Sets the formatter\n     *\n     * @param FormatterInterface $formatter\n     */\n    public function setFormatter(FormatterInterface $formatter)\n    {\n        $this->formatter = $formatter;\n    }\n\n    /**\n     * Generates attachment field\n     *\n     * @param string $title\n     * @param string|array $value\\\n     *\n     * @return array\n     */\n    private function generateAttachmentField($title, $value)\n    {\n        $value = is_array($value)\n            ? sprintf('```%s```', $this->stringify($value))\n            : $value;\n\n        return array(\n            'title' => $title,\n            'value' => $value,\n            'short' => false\n        );\n    }\n\n    /**\n     * Generates a collection of attachment fields from array\n     *\n     * @param array $data\n     *\n     * @return array\n     */\n    private function generateAttachmentFields(array $data)\n    {\n        $fields = array();\n        foreach ($data as $key => $value) {\n            $fields[] = $this->generateAttachmentField($key, $value);\n        }\n\n        return $fields;\n    }\n\n    /**\n     * Get a copy of record with fields excluded according to $this->excludeFields\n     *\n     * @param array $record\n     *\n     * @return array\n     */\n    private function excludeFields(array $record)\n    {\n        foreach ($this->excludeFields as $field) {\n            $keys = explode('.', $field);\n            $node = &$record;\n            $lastKey = end($keys);\n            foreach ($keys as $key) {\n                if (!isset($node[$key])) {\n                    break;\n                }\n                if ($lastKey === $key) {\n                    unset($node[$key]);\n                    break;\n                }\n                $node = &$node[$key];\n            }\n        }\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Logger;\nuse Monolog\\Handler\\Slack\\SlackRecord;\n\n/**\n * Sends notifications through Slack API\n *\n * @author Greg Kedzierski <greg@gregkedzierski.com>\n * @see    https://api.slack.com/\n */\nclass SlackHandler extends SocketHandler\n{\n    /**\n     * Slack API token\n     * @var string\n     */\n    private $token;\n\n    /**\n     * Instance of the SlackRecord util class preparing data for Slack API.\n     * @var SlackRecord\n     */\n    private $slackRecord;\n\n    /**\n     * @param  string                    $token                  Slack API token\n     * @param  string                    $channel                Slack channel (encoded ID or name)\n     * @param  string|null               $username               Name of a bot\n     * @param  bool                      $useAttachment          Whether the message should be added to Slack as attachment (plain text otherwise)\n     * @param  string|null               $iconEmoji              The emoji name to use (or null)\n     * @param  int                       $level                  The minimum logging level at which this handler will be triggered\n     * @param  bool                      $bubble                 Whether the messages that are handled can bubble up the stack or not\n     * @param  bool                      $useShortAttachment     Whether the the context/extra messages added to Slack as attachments are in a short style\n     * @param  bool                      $includeContextAndExtra Whether the attachment should include context and extra data\n     * @param  array                     $excludeFields          Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']\n     * @throws MissingExtensionException If no OpenSSL PHP extension configured\n     */\n    public function __construct($token, $channel, $username = null, $useAttachment = true, $iconEmoji = null, $level = Logger::CRITICAL, $bubble = true, $useShortAttachment = false, $includeContextAndExtra = false, array $excludeFields = array())\n    {\n        if (!extension_loaded('openssl')) {\n            throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler');\n        }\n\n        parent::__construct('ssl://slack.com:443', $level, $bubble);\n\n        $this->slackRecord = new SlackRecord(\n            $channel,\n            $username,\n            $useAttachment,\n            $iconEmoji,\n            $useShortAttachment,\n            $includeContextAndExtra,\n            $excludeFields,\n            $this->formatter\n        );\n\n        $this->token = $token;\n    }\n\n    public function getSlackRecord()\n    {\n        return $this->slackRecord;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @param  array  $record\n     * @return string\n     */\n    protected function generateDataStream($record)\n    {\n        $content = $this->buildContent($record);\n\n        return $this->buildHeader($content) . $content;\n    }\n\n    /**\n     * Builds the body of API call\n     *\n     * @param  array  $record\n     * @return string\n     */\n    private function buildContent($record)\n    {\n        $dataArray = $this->prepareContentData($record);\n\n        return http_build_query($dataArray);\n    }\n\n    /**\n     * Prepares content data\n     *\n     * @param  array $record\n     * @return array\n     */\n    protected function prepareContentData($record)\n    {\n        $dataArray = $this->slackRecord->getSlackData($record);\n        $dataArray['token'] = $this->token;\n\n        if (!empty($dataArray['attachments'])) {\n            $dataArray['attachments'] = json_encode($dataArray['attachments']);\n        }\n\n        return $dataArray;\n    }\n\n    /**\n     * Builds the header of the API Call\n     *\n     * @param  string $content\n     * @return string\n     */\n    private function buildHeader($content)\n    {\n        $header = \"POST /api/chat.postMessage HTTP/1.1\\r\\n\";\n        $header .= \"Host: slack.com\\r\\n\";\n        $header .= \"Content-Type: application/x-www-form-urlencoded\\r\\n\";\n        $header .= \"Content-Length: \" . strlen($content) . \"\\r\\n\";\n        $header .= \"\\r\\n\";\n\n        return $header;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @param array $record\n     */\n    protected function write(array $record)\n    {\n        parent::write($record);\n        $this->finalizeWrite();\n    }\n\n    /**\n     * Finalizes the request by reading some bytes and then closing the socket\n     *\n     * If we do not read some but close the socket too early, slack sometimes\n     * drops the request entirely.\n     */\n    protected function finalizeWrite()\n    {\n        $res = $this->getResource();\n        if (is_resource($res)) {\n            @fread($res, 2048);\n        }\n        $this->closeSocket();\n    }\n\n    /**\n     * Returned a Slack message attachment color associated with\n     * provided level.\n     *\n     * @param  int    $level\n     * @return string\n     * @deprecated Use underlying SlackRecord instead\n     */\n    protected function getAttachmentColor($level)\n    {\n        trigger_error(\n            'SlackHandler::getAttachmentColor() is deprecated. Use underlying SlackRecord instead.',\n            E_USER_DEPRECATED\n        );\n\n        return $this->slackRecord->getAttachmentColor($level);\n    }\n\n    /**\n     * Stringifies an array of key/value pairs to be used in attachment fields\n     *\n     * @param  array  $fields\n     * @return string\n     * @deprecated Use underlying SlackRecord instead\n     */\n    protected function stringify($fields)\n    {\n        trigger_error(\n            'SlackHandler::stringify() is deprecated. Use underlying SlackRecord instead.',\n            E_USER_DEPRECATED\n        );\n\n        return $this->slackRecord->stringify($fields);\n    }\n\n    public function setFormatter(FormatterInterface $formatter)\n    {\n        parent::setFormatter($formatter);\n        $this->slackRecord->setFormatter($formatter);\n\n        return $this;\n    }\n\n    public function getFormatter()\n    {\n        $formatter = parent::getFormatter();\n        $this->slackRecord->setFormatter($formatter);\n\n        return $formatter;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FormatterInterface;\nuse Monolog\\Logger;\nuse Monolog\\Handler\\Slack\\SlackRecord;\n\n/**\n * Sends notifications through Slack Webhooks\n *\n * @author Haralan Dobrev <hkdobrev@gmail.com>\n * @see    https://api.slack.com/incoming-webhooks\n */\nclass SlackWebhookHandler extends AbstractProcessingHandler\n{\n    /**\n     * Slack Webhook token\n     * @var string\n     */\n    private $webhookUrl;\n\n    /**\n     * Instance of the SlackRecord util class preparing data for Slack API.\n     * @var SlackRecord\n     */\n    private $slackRecord;\n\n    /**\n     * @param  string      $webhookUrl             Slack Webhook URL\n     * @param  string|null $channel                Slack channel (encoded ID or name)\n     * @param  string|null $username               Name of a bot\n     * @param  bool        $useAttachment          Whether the message should be added to Slack as attachment (plain text otherwise)\n     * @param  string|null $iconEmoji              The emoji name to use (or null)\n     * @param  bool        $useShortAttachment     Whether the the context/extra messages added to Slack as attachments are in a short style\n     * @param  bool        $includeContextAndExtra Whether the attachment should include context and extra data\n     * @param  int         $level                  The minimum logging level at which this handler will be triggered\n     * @param  bool        $bubble                 Whether the messages that are handled can bubble up the stack or not\n     * @param  array       $excludeFields          Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']\n     */\n    public function __construct($webhookUrl, $channel = null, $username = null, $useAttachment = true, $iconEmoji = null, $useShortAttachment = false, $includeContextAndExtra = false, $level = Logger::CRITICAL, $bubble = true, array $excludeFields = array())\n    {\n        parent::__construct($level, $bubble);\n\n        $this->webhookUrl = $webhookUrl;\n\n        $this->slackRecord = new SlackRecord(\n            $channel,\n            $username,\n            $useAttachment,\n            $iconEmoji,\n            $useShortAttachment,\n            $includeContextAndExtra,\n            $excludeFields,\n            $this->formatter\n        );\n    }\n\n    public function getSlackRecord()\n    {\n        return $this->slackRecord;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @param array $record\n     */\n    protected function write(array $record)\n    {\n        $postData = $this->slackRecord->getSlackData($record);\n        $postString = json_encode($postData);\n\n        $ch = curl_init();\n        $options = array(\n            CURLOPT_URL => $this->webhookUrl,\n            CURLOPT_POST => true,\n            CURLOPT_RETURNTRANSFER => true,\n            CURLOPT_HTTPHEADER => array('Content-type: application/json'),\n            CURLOPT_POSTFIELDS => $postString\n        );\n        if (defined('CURLOPT_SAFE_UPLOAD')) {\n            $options[CURLOPT_SAFE_UPLOAD] = true;\n        }\n\n        curl_setopt_array($ch, $options);\n\n        Curl\\Util::execute($ch);\n    }\n\n    public function setFormatter(FormatterInterface $formatter)\n    {\n        parent::setFormatter($formatter);\n        $this->slackRecord->setFormatter($formatter);\n\n        return $this;\n    }\n\n    public function getFormatter()\n    {\n        $formatter = parent::getFormatter();\n        $this->slackRecord->setFormatter($formatter);\n\n        return $formatter;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Sends notifications through Slack's Slackbot\n *\n * @author Haralan Dobrev <hkdobrev@gmail.com>\n * @see    https://slack.com/apps/A0F81R8ET-slackbot\n */\nclass SlackbotHandler extends AbstractProcessingHandler\n{\n    /**\n     * The slug of the Slack team\n     * @var string\n     */\n    private $slackTeam;\n\n    /**\n     * Slackbot token\n     * @var string\n     */\n    private $token;\n\n    /**\n     * Slack channel name\n     * @var string\n     */\n    private $channel;\n\n    /**\n     * @param  string $slackTeam Slack team slug\n     * @param  string $token     Slackbot token\n     * @param  string $channel   Slack channel (encoded ID or name)\n     * @param  int    $level     The minimum logging level at which this handler will be triggered\n     * @param  bool   $bubble    Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct($slackTeam, $token, $channel, $level = Logger::CRITICAL, $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        $this->slackTeam = $slackTeam;\n        $this->token = $token;\n        $this->channel = $channel;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @param array $record\n     */\n    protected function write(array $record)\n    {\n        $slackbotUrl = sprintf(\n            'https://%s.slack.com/services/hooks/slackbot?token=%s&channel=%s',\n            $this->slackTeam,\n            $this->token,\n            $this->channel\n        );\n\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, $slackbotUrl);\n        curl_setopt($ch, CURLOPT_POST, true);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $record['message']);\n\n        Curl\\Util::execute($ch);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Stores to any socket - uses fsockopen() or pfsockopen().\n *\n * @author Pablo de Leon Belloc <pablolb@gmail.com>\n * @see    http://php.net/manual/en/function.fsockopen.php\n */\nclass SocketHandler extends AbstractProcessingHandler\n{\n    private $connectionString;\n    private $connectionTimeout;\n    private $resource;\n    private $timeout = 0;\n    private $writingTimeout = 10;\n    private $lastSentBytes = null;\n    private $persistent = false;\n    private $errno;\n    private $errstr;\n    private $lastWritingAt;\n\n    /**\n     * @param string  $connectionString Socket connection string\n     * @param int     $level            The minimum logging level at which this handler will be triggered\n     * @param Boolean $bubble           Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct($connectionString, $level = Logger::DEBUG, $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n        $this->connectionString = $connectionString;\n        $this->connectionTimeout = (float) ini_get('default_socket_timeout');\n    }\n\n    /**\n     * Connect (if necessary) and write to the socket\n     *\n     * @param array $record\n     *\n     * @throws \\UnexpectedValueException\n     * @throws \\RuntimeException\n     */\n    protected function write(array $record)\n    {\n        $this->connectIfNotConnected();\n        $data = $this->generateDataStream($record);\n        $this->writeToSocket($data);\n    }\n\n    /**\n     * We will not close a PersistentSocket instance so it can be reused in other requests.\n     */\n    public function close()\n    {\n        if (!$this->isPersistent()) {\n            $this->closeSocket();\n        }\n    }\n\n    /**\n     * Close socket, if open\n     */\n    public function closeSocket()\n    {\n        if (is_resource($this->resource)) {\n            fclose($this->resource);\n            $this->resource = null;\n        }\n    }\n\n    /**\n     * Set socket connection to nbe persistent. It only has effect before the connection is initiated.\n     *\n     * @param bool $persistent\n     */\n    public function setPersistent($persistent)\n    {\n        $this->persistent = (boolean) $persistent;\n    }\n\n    /**\n     * Set connection timeout.  Only has effect before we connect.\n     *\n     * @param float $seconds\n     *\n     * @see http://php.net/manual/en/function.fsockopen.php\n     */\n    public function setConnectionTimeout($seconds)\n    {\n        $this->validateTimeout($seconds);\n        $this->connectionTimeout = (float) $seconds;\n    }\n\n    /**\n     * Set write timeout. Only has effect before we connect.\n     *\n     * @param float $seconds\n     *\n     * @see http://php.net/manual/en/function.stream-set-timeout.php\n     */\n    public function setTimeout($seconds)\n    {\n        $this->validateTimeout($seconds);\n        $this->timeout = (float) $seconds;\n    }\n\n    /**\n     * Set writing timeout. Only has effect during connection in the writing cycle.\n     *\n     * @param float $seconds 0 for no timeout\n     */\n    public function setWritingTimeout($seconds)\n    {\n        $this->validateTimeout($seconds);\n        $this->writingTimeout = (float) $seconds;\n    }\n\n    /**\n     * Get current connection string\n     *\n     * @return string\n     */\n    public function getConnectionString()\n    {\n        return $this->connectionString;\n    }\n\n    /**\n     * Get persistent setting\n     *\n     * @return bool\n     */\n    public function isPersistent()\n    {\n        return $this->persistent;\n    }\n\n    /**\n     * Get current connection timeout setting\n     *\n     * @return float\n     */\n    public function getConnectionTimeout()\n    {\n        return $this->connectionTimeout;\n    }\n\n    /**\n     * Get current in-transfer timeout\n     *\n     * @return float\n     */\n    public function getTimeout()\n    {\n        return $this->timeout;\n    }\n\n    /**\n     * Get current local writing timeout\n     *\n     * @return float\n     */\n    public function getWritingTimeout()\n    {\n        return $this->writingTimeout;\n    }\n\n    /**\n     * Check to see if the socket is currently available.\n     *\n     * UDP might appear to be connected but might fail when writing.  See http://php.net/fsockopen for details.\n     *\n     * @return bool\n     */\n    public function isConnected()\n    {\n        return is_resource($this->resource)\n            && !feof($this->resource);  // on TCP - other party can close connection.\n    }\n\n    /**\n     * Wrapper to allow mocking\n     */\n    protected function pfsockopen()\n    {\n        return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout);\n    }\n\n    /**\n     * Wrapper to allow mocking\n     */\n    protected function fsockopen()\n    {\n        return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout);\n    }\n\n    /**\n     * Wrapper to allow mocking\n     *\n     * @see http://php.net/manual/en/function.stream-set-timeout.php\n     */\n    protected function streamSetTimeout()\n    {\n        $seconds = floor($this->timeout);\n        $microseconds = round(($this->timeout - $seconds) * 1e6);\n\n        return stream_set_timeout($this->resource, $seconds, $microseconds);\n    }\n\n    /**\n     * Wrapper to allow mocking\n     */\n    protected function fwrite($data)\n    {\n        return @fwrite($this->resource, $data);\n    }\n\n    /**\n     * Wrapper to allow mocking\n     */\n    protected function streamGetMetadata()\n    {\n        return stream_get_meta_data($this->resource);\n    }\n\n    private function validateTimeout($value)\n    {\n        $ok = filter_var($value, FILTER_VALIDATE_FLOAT);\n        if ($ok === false || $value < 0) {\n            throw new \\InvalidArgumentException(\"Timeout must be 0 or a positive float (got $value)\");\n        }\n    }\n\n    private function connectIfNotConnected()\n    {\n        if ($this->isConnected()) {\n            return;\n        }\n        $this->connect();\n    }\n\n    protected function generateDataStream($record)\n    {\n        return (string) $record['formatted'];\n    }\n\n    /**\n     * @return resource|null\n     */\n    protected function getResource()\n    {\n        return $this->resource;\n    }\n\n    private function connect()\n    {\n        $this->createSocketResource();\n        $this->setSocketTimeout();\n    }\n\n    private function createSocketResource()\n    {\n        if ($this->isPersistent()) {\n            $resource = $this->pfsockopen();\n        } else {\n            $resource = $this->fsockopen();\n        }\n        if (!$resource) {\n            throw new \\UnexpectedValueException(\"Failed connecting to $this->connectionString ($this->errno: $this->errstr)\");\n        }\n        $this->resource = $resource;\n    }\n\n    private function setSocketTimeout()\n    {\n        if (!$this->streamSetTimeout()) {\n            throw new \\UnexpectedValueException(\"Failed setting timeout with stream_set_timeout()\");\n        }\n    }\n\n    private function writeToSocket($data)\n    {\n        $length = strlen($data);\n        $sent = 0;\n        $this->lastSentBytes = $sent;\n        while ($this->isConnected() && $sent < $length) {\n            if (0 == $sent) {\n                $chunk = $this->fwrite($data);\n            } else {\n                $chunk = $this->fwrite(substr($data, $sent));\n            }\n            if ($chunk === false) {\n                throw new \\RuntimeException(\"Could not write to socket\");\n            }\n            $sent += $chunk;\n            $socketInfo = $this->streamGetMetadata();\n            if ($socketInfo['timed_out']) {\n                throw new \\RuntimeException(\"Write timed-out\");\n            }\n\n            if ($this->writingIsTimedOut($sent)) {\n                throw new \\RuntimeException(\"Write timed-out, no data sent for `{$this->writingTimeout}` seconds, probably we got disconnected (sent $sent of $length)\");\n            }\n        }\n        if (!$this->isConnected() && $sent < $length) {\n            throw new \\RuntimeException(\"End-of-file reached, probably we got disconnected (sent $sent of $length)\");\n        }\n    }\n\n    private function writingIsTimedOut($sent)\n    {\n        $writingTimeout = (int) floor($this->writingTimeout);\n        if (0 === $writingTimeout) {\n            return false;\n        }\n\n        if ($sent !== $this->lastSentBytes) {\n            $this->lastWritingAt = time();\n            $this->lastSentBytes = $sent;\n\n            return false;\n        } else {\n            usleep(100);\n        }\n\n        if ((time() - $this->lastWritingAt) >= $writingTimeout) {\n            $this->closeSocket();\n\n            return true;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Stores to any stream resource\n *\n * Can be used to store into php://stderr, remote and local files, etc.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass StreamHandler extends AbstractProcessingHandler\n{\n    protected $stream;\n    protected $url;\n    private $errorMessage;\n    protected $filePermission;\n    protected $useLocking;\n    private $dirCreated;\n\n    /**\n     * @param resource|string $stream\n     * @param int             $level          The minimum logging level at which this handler will be triggered\n     * @param Boolean         $bubble         Whether the messages that are handled can bubble up the stack or not\n     * @param int|null        $filePermission Optional file permissions (default (0644) are only for owner read/write)\n     * @param Boolean         $useLocking     Try to lock log file before doing any writes\n     *\n     * @throws \\Exception                If a missing directory is not buildable\n     * @throws \\InvalidArgumentException If stream is not a resource or string\n     */\n    public function __construct($stream, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false)\n    {\n        parent::__construct($level, $bubble);\n        if (is_resource($stream)) {\n            $this->stream = $stream;\n        } elseif (is_string($stream)) {\n            $this->url = $stream;\n        } else {\n            throw new \\InvalidArgumentException('A stream must either be a resource or a string.');\n        }\n\n        $this->filePermission = $filePermission;\n        $this->useLocking = $useLocking;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function close()\n    {\n        if ($this->url && is_resource($this->stream)) {\n            fclose($this->stream);\n        }\n        $this->stream = null;\n    }\n\n    /**\n     * Return the currently active stream if it is open\n     *\n     * @return resource|null\n     */\n    public function getStream()\n    {\n        return $this->stream;\n    }\n\n    /**\n     * Return the stream URL if it was configured with a URL and not an active resource\n     *\n     * @return string|null\n     */\n    public function getUrl()\n    {\n        return $this->url;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        if (!is_resource($this->stream)) {\n            if (null === $this->url || '' === $this->url) {\n                throw new \\LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().');\n            }\n            $this->createDir();\n            $this->errorMessage = null;\n            set_error_handler(array($this, 'customErrorHandler'));\n            $this->stream = fopen($this->url, 'a');\n            if ($this->filePermission !== null) {\n                @chmod($this->url, $this->filePermission);\n            }\n            restore_error_handler();\n            if (!is_resource($this->stream)) {\n                $this->stream = null;\n                throw new \\UnexpectedValueException(sprintf('The stream or file \"%s\" could not be opened: '.$this->errorMessage, $this->url));\n            }\n        }\n\n        if ($this->useLocking) {\n            // ignoring errors here, there's not much we can do about them\n            flock($this->stream, LOCK_EX);\n        }\n\n        $this->streamWrite($this->stream, $record);\n\n        if ($this->useLocking) {\n            flock($this->stream, LOCK_UN);\n        }\n    }\n\n    /**\n     * Write to stream\n     * @param resource $stream\n     * @param array $record\n     */\n    protected function streamWrite($stream, array $record)\n    {\n        fwrite($stream, (string) $record['formatted']);\n    }\n\n    private function customErrorHandler($code, $msg)\n    {\n        $this->errorMessage = preg_replace('{^(fopen|mkdir)\\(.*?\\): }', '', $msg);\n    }\n\n    /**\n     * @param string $stream\n     *\n     * @return null|string\n     */\n    private function getDirFromStream($stream)\n    {\n        $pos = strpos($stream, '://');\n        if ($pos === false) {\n            return dirname($stream);\n        }\n\n        if ('file://' === substr($stream, 0, 7)) {\n            return dirname(substr($stream, 7));\n        }\n\n        return;\n    }\n\n    private function createDir()\n    {\n        // Do not try to create dir if it has already been tried.\n        if ($this->dirCreated) {\n            return;\n        }\n\n        $dir = $this->getDirFromStream($this->url);\n        if (null !== $dir && !is_dir($dir)) {\n            $this->errorMessage = null;\n            set_error_handler(array($this, 'customErrorHandler'));\n            $status = mkdir($dir, 0777, true);\n            restore_error_handler();\n            if (false === $status) {\n                throw new \\UnexpectedValueException(sprintf('There is no existing directory at \"%s\" and its not buildable: '.$this->errorMessage, $dir));\n            }\n        }\n        $this->dirCreated = true;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\LineFormatter;\nuse Swift;\n\n/**\n * SwiftMailerHandler uses Swift_Mailer to send the emails\n *\n * @author Gyula Sallai\n */\nclass SwiftMailerHandler extends MailHandler\n{\n    protected $mailer;\n    private $messageTemplate;\n\n    /**\n     * @param \\Swift_Mailer           $mailer  The mailer to use\n     * @param callable|\\Swift_Message $message An example message for real messages, only the body will be replaced\n     * @param int                     $level   The minimum logging level at which this handler will be triggered\n     * @param Boolean                 $bubble  Whether the messages that are handled can bubble up the stack or not\n     */\n    public function __construct(\\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true)\n    {\n        parent::__construct($level, $bubble);\n\n        $this->mailer = $mailer;\n        $this->messageTemplate = $message;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function send($content, array $records)\n    {\n        $this->mailer->send($this->buildMessage($content, $records));\n    }\n\n    /**\n     * Creates instance of Swift_Message to be sent\n     *\n     * @param  string         $content formatted email body to be sent\n     * @param  array          $records Log records that formed the content\n     * @return \\Swift_Message\n     */\n    protected function buildMessage($content, array $records)\n    {\n        $message = null;\n        if ($this->messageTemplate instanceof \\Swift_Message) {\n            $message = clone $this->messageTemplate;\n            $message->generateId();\n        } elseif (is_callable($this->messageTemplate)) {\n            $message = call_user_func($this->messageTemplate, $content, $records);\n        }\n\n        if (!$message instanceof \\Swift_Message) {\n            throw new \\InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it');\n        }\n\n        if ($records) {\n            $subjectFormatter = new LineFormatter($message->getSubject());\n            $message->setSubject($subjectFormatter->format($this->getHighestRecord($records)));\n        }\n\n        $message->setBody($content);\n        if (version_compare(Swift::VERSION, '6.0.0', '>=')) {\n            $message->setDate(new \\DateTimeImmutable());\n        } else {\n            $message->setDate(time());\n        }\n\n        return $message;\n    }\n\n    /**\n     * BC getter, to be removed in 2.0\n     */\n    public function __get($name)\n    {\n        if ($name === 'message') {\n            trigger_error('SwiftMailerHandler->message is deprecated, use ->buildMessage() instead to retrieve the message', E_USER_DEPRECATED);\n\n            return $this->buildMessage(null, array());\n        }\n\n        throw new \\InvalidArgumentException('Invalid property '.$name);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\n/**\n * Logs to syslog service.\n *\n * usage example:\n *\n *   $log = new Logger('application');\n *   $syslog = new SyslogHandler('myfacility', 'local6');\n *   $formatter = new LineFormatter(\"%channel%.%level_name%: %message% %extra%\");\n *   $syslog->setFormatter($formatter);\n *   $log->pushHandler($syslog);\n *\n * @author Sven Paulus <sven@karlsruhe.org>\n */\nclass SyslogHandler extends AbstractSyslogHandler\n{\n    protected $ident;\n    protected $logopts;\n\n    /**\n     * @param string  $ident\n     * @param mixed   $facility\n     * @param int     $level    The minimum logging level at which this handler will be triggered\n     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not\n     * @param int     $logopts  Option flags for the openlog() call, defaults to LOG_PID\n     */\n    public function __construct($ident, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $logopts = LOG_PID)\n    {\n        parent::__construct($facility, $level, $bubble);\n\n        $this->ident = $ident;\n        $this->logopts = $logopts;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function close()\n    {\n        closelog();\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        if (!openlog($this->ident, $this->logopts, $this->facility)) {\n            throw new \\LogicException('Can\\'t open syslog for ident \"'.$this->ident.'\" and facility \"'.$this->facility.'\"');\n        }\n        syslog($this->logLevels[$record['level']], (string) $record['formatted']);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\SyslogUdp;\n\nclass UdpSocket\n{\n    const DATAGRAM_MAX_LENGTH = 65023;\n\n    protected $ip;\n    protected $port;\n    protected $socket;\n\n    public function __construct($ip, $port = 514)\n    {\n        $this->ip = $ip;\n        $this->port = $port;\n        $this->socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);\n    }\n\n    public function write($line, $header = \"\")\n    {\n        $this->send($this->assembleMessage($line, $header));\n    }\n\n    public function close()\n    {\n        if (is_resource($this->socket)) {\n            socket_close($this->socket);\n            $this->socket = null;\n        }\n    }\n\n    protected function send($chunk)\n    {\n        if (!is_resource($this->socket)) {\n            throw new \\LogicException('The UdpSocket to '.$this->ip.':'.$this->port.' has been closed and can not be written to anymore');\n        }\n        socket_sendto($this->socket, $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port);\n    }\n\n    protected function assembleMessage($line, $header)\n    {\n        $chunkSize = self::DATAGRAM_MAX_LENGTH - strlen($header);\n\n        return $header . substr($line, 0, $chunkSize);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\Handler\\SyslogUdp\\UdpSocket;\n\n/**\n * A Handler for logging to a remote syslogd server.\n *\n * @author Jesper Skovgaard Nielsen <nulpunkt@gmail.com>\n */\nclass SyslogUdpHandler extends AbstractSyslogHandler\n{\n    protected $socket;\n    protected $ident;\n\n    /**\n     * @param string  $host\n     * @param int     $port\n     * @param mixed   $facility\n     * @param int     $level    The minimum logging level at which this handler will be triggered\n     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not\n     * @param string  $ident    Program name or tag for each log message.\n     */\n    public function __construct($host, $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $ident = 'php')\n    {\n        parent::__construct($facility, $level, $bubble);\n\n        $this->ident = $ident;\n\n        $this->socket = new UdpSocket($host, $port ?: 514);\n    }\n\n    protected function write(array $record)\n    {\n        $lines = $this->splitMessageIntoLines($record['formatted']);\n\n        $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']]);\n\n        foreach ($lines as $line) {\n            $this->socket->write($line, $header);\n        }\n    }\n\n    public function close()\n    {\n        $this->socket->close();\n    }\n\n    private function splitMessageIntoLines($message)\n    {\n        if (is_array($message)) {\n            $message = implode(\"\\n\", $message);\n        }\n\n        return preg_split('/$\\R?^/m', $message, -1, PREG_SPLIT_NO_EMPTY);\n    }\n\n    /**\n     * Make common syslog header (see rfc5424)\n     */\n    protected function makeCommonSyslogHeader($severity)\n    {\n        $priority = $severity + $this->facility;\n\n        if (!$pid = getmypid()) {\n            $pid = '-';\n        }\n\n        if (!$hostname = gethostname()) {\n            $hostname = '-';\n        }\n\n        return \"<$priority>1 \" .\n            $this->getDateTime() . \" \" .\n            $hostname . \" \" .\n            $this->ident . \" \" .\n            $pid . \" - - \";\n    }\n\n    protected function getDateTime()\n    {\n        return date(\\DateTime::RFC3339);\n    }\n\n    /**\n     * Inject your own socket, mainly used for testing\n     */\n    public function setSocket($socket)\n    {\n        $this->socket = $socket;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\n/**\n * Used for testing purposes.\n *\n * It records all records and gives you access to them for verification.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n *\n * @method bool hasEmergency($record)\n * @method bool hasAlert($record)\n * @method bool hasCritical($record)\n * @method bool hasError($record)\n * @method bool hasWarning($record)\n * @method bool hasNotice($record)\n * @method bool hasInfo($record)\n * @method bool hasDebug($record)\n *\n * @method bool hasEmergencyRecords()\n * @method bool hasAlertRecords()\n * @method bool hasCriticalRecords()\n * @method bool hasErrorRecords()\n * @method bool hasWarningRecords()\n * @method bool hasNoticeRecords()\n * @method bool hasInfoRecords()\n * @method bool hasDebugRecords()\n *\n * @method bool hasEmergencyThatContains($message)\n * @method bool hasAlertThatContains($message)\n * @method bool hasCriticalThatContains($message)\n * @method bool hasErrorThatContains($message)\n * @method bool hasWarningThatContains($message)\n * @method bool hasNoticeThatContains($message)\n * @method bool hasInfoThatContains($message)\n * @method bool hasDebugThatContains($message)\n *\n * @method bool hasEmergencyThatMatches($message)\n * @method bool hasAlertThatMatches($message)\n * @method bool hasCriticalThatMatches($message)\n * @method bool hasErrorThatMatches($message)\n * @method bool hasWarningThatMatches($message)\n * @method bool hasNoticeThatMatches($message)\n * @method bool hasInfoThatMatches($message)\n * @method bool hasDebugThatMatches($message)\n *\n * @method bool hasEmergencyThatPasses($message)\n * @method bool hasAlertThatPasses($message)\n * @method bool hasCriticalThatPasses($message)\n * @method bool hasErrorThatPasses($message)\n * @method bool hasWarningThatPasses($message)\n * @method bool hasNoticeThatPasses($message)\n * @method bool hasInfoThatPasses($message)\n * @method bool hasDebugThatPasses($message)\n */\nclass TestHandler extends AbstractProcessingHandler\n{\n    protected $records = array();\n    protected $recordsByLevel = array();\n\n    public function getRecords()\n    {\n        return $this->records;\n    }\n\n    public function clear()\n    {\n        $this->records = array();\n        $this->recordsByLevel = array();\n    }\n\n    public function hasRecords($level)\n    {\n        return isset($this->recordsByLevel[$level]);\n    }\n\n    public function hasRecord($record, $level)\n    {\n        if (is_array($record)) {\n            $record = $record['message'];\n        }\n\n        return $this->hasRecordThatPasses(function ($rec) use ($record) {\n            return $rec['message'] === $record;\n        }, $level);\n    }\n\n    public function hasRecordThatContains($message, $level)\n    {\n        return $this->hasRecordThatPasses(function ($rec) use ($message) {\n            return strpos($rec['message'], $message) !== false;\n        }, $level);\n    }\n\n    public function hasRecordThatMatches($regex, $level)\n    {\n        return $this->hasRecordThatPasses(function ($rec) use ($regex) {\n            return preg_match($regex, $rec['message']) > 0;\n        }, $level);\n    }\n\n    public function hasRecordThatPasses($predicate, $level)\n    {\n        if (!is_callable($predicate)) {\n            throw new \\InvalidArgumentException(\"Expected a callable for hasRecordThatSucceeds\");\n        }\n\n        if (!isset($this->recordsByLevel[$level])) {\n            return false;\n        }\n\n        foreach ($this->recordsByLevel[$level] as $i => $rec) {\n            if (call_user_func($predicate, $rec, $i)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        $this->recordsByLevel[$record['level']][] = $record;\n        $this->records[] = $record;\n    }\n\n    public function __call($method, $args)\n    {\n        if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {\n            $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];\n            $level = constant('Monolog\\Logger::' . strtoupper($matches[2]));\n            if (method_exists($this, $genericMethod)) {\n                $args[] = $level;\n\n                return call_user_func_array(array($this, $genericMethod), $args);\n            }\n        }\n\n        throw new \\BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\n/**\n * Forwards records to multiple handlers suppressing failures of each handler\n * and continuing through to give every handler a chance to succeed.\n *\n * @author Craig D'Amelio <craig@damelio.ca>\n */\nclass WhatFailureGroupHandler extends GroupHandler\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function handle(array $record)\n    {\n        if ($this->processors) {\n            foreach ($this->processors as $processor) {\n                $record = call_user_func($processor, $record);\n            }\n        }\n\n        foreach ($this->handlers as $handler) {\n            try {\n                $handler->handle($record);\n            } catch (\\Exception $e) {\n                // What failure?\n            } catch (\\Throwable $e) {\n                // What failure?\n            }\n        }\n\n        return false === $this->bubble;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function handleBatch(array $records)\n    {\n        foreach ($this->handlers as $handler) {\n            try {\n                $handler->handleBatch($records);\n            } catch (\\Exception $e) {\n                // What failure?\n            } catch (\\Throwable $e) {\n                // What failure?\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php",
    "content": "<?php\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\NormalizerFormatter;\nuse Monolog\\Logger;\n\n/**\n * Handler sending logs to Zend Monitor\n *\n * @author  Christian Bergau <cbergau86@gmail.com>\n */\nclass ZendMonitorHandler extends AbstractProcessingHandler\n{\n    /**\n     * Monolog level / ZendMonitor Custom Event priority map\n     *\n     * @var array\n     */\n    protected $levelMap = array(\n        Logger::DEBUG     => 1,\n        Logger::INFO      => 2,\n        Logger::NOTICE    => 3,\n        Logger::WARNING   => 4,\n        Logger::ERROR     => 5,\n        Logger::CRITICAL  => 6,\n        Logger::ALERT     => 7,\n        Logger::EMERGENCY => 0,\n    );\n\n    /**\n     * Construct\n     *\n     * @param  int                       $level\n     * @param  bool                      $bubble\n     * @throws MissingExtensionException\n     */\n    public function __construct($level = Logger::DEBUG, $bubble = true)\n    {\n        if (!function_exists('zend_monitor_custom_event')) {\n            throw new MissingExtensionException('You must have Zend Server installed in order to use this handler');\n        }\n        parent::__construct($level, $bubble);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    protected function write(array $record)\n    {\n        $this->writeZendMonitorCustomEvent(\n            $this->levelMap[$record['level']],\n            $record['message'],\n            $record['formatted']\n        );\n    }\n\n    /**\n     * Write a record to Zend Monitor\n     *\n     * @param int    $level\n     * @param string $message\n     * @param array  $formatted\n     */\n    protected function writeZendMonitorCustomEvent($level, $message, $formatted)\n    {\n        zend_monitor_custom_event($level, $message, $formatted);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getDefaultFormatter()\n    {\n        return new NormalizerFormatter();\n    }\n\n    /**\n     * Get the level map\n     *\n     * @return array\n     */\n    public function getLevelMap()\n    {\n        return $this->levelMap;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Logger.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse Monolog\\Handler\\HandlerInterface;\nuse Monolog\\Handler\\StreamHandler;\nuse Psr\\Log\\LoggerInterface;\nuse Psr\\Log\\InvalidArgumentException;\n\n/**\n * Monolog log channel\n *\n * It contains a stack of Handlers and a stack of Processors,\n * and uses them to store records that are added to it.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass Logger implements LoggerInterface\n{\n    /**\n     * Detailed debug information\n     */\n    const DEBUG = 100;\n\n    /**\n     * Interesting events\n     *\n     * Examples: User logs in, SQL logs.\n     */\n    const INFO = 200;\n\n    /**\n     * Uncommon events\n     */\n    const NOTICE = 250;\n\n    /**\n     * Exceptional occurrences that are not errors\n     *\n     * Examples: Use of deprecated APIs, poor use of an API,\n     * undesirable things that are not necessarily wrong.\n     */\n    const WARNING = 300;\n\n    /**\n     * Runtime errors\n     */\n    const ERROR = 400;\n\n    /**\n     * Critical conditions\n     *\n     * Example: Application component unavailable, unexpected exception.\n     */\n    const CRITICAL = 500;\n\n    /**\n     * Action must be taken immediately\n     *\n     * Example: Entire website down, database unavailable, etc.\n     * This should trigger the SMS alerts and wake you up.\n     */\n    const ALERT = 550;\n\n    /**\n     * Urgent alert.\n     */\n    const EMERGENCY = 600;\n\n    /**\n     * Monolog API version\n     *\n     * This is only bumped when API breaks are done and should\n     * follow the major version of the library\n     *\n     * @var int\n     */\n    const API = 1;\n\n    /**\n     * Logging levels from syslog protocol defined in RFC 5424\n     *\n     * @var array $levels Logging levels\n     */\n    protected static $levels = array(\n        self::DEBUG     => 'DEBUG',\n        self::INFO      => 'INFO',\n        self::NOTICE    => 'NOTICE',\n        self::WARNING   => 'WARNING',\n        self::ERROR     => 'ERROR',\n        self::CRITICAL  => 'CRITICAL',\n        self::ALERT     => 'ALERT',\n        self::EMERGENCY => 'EMERGENCY',\n    );\n\n    /**\n     * @var \\DateTimeZone\n     */\n    protected static $timezone;\n\n    /**\n     * @var string\n     */\n    protected $name;\n\n    /**\n     * The handler stack\n     *\n     * @var HandlerInterface[]\n     */\n    protected $handlers;\n\n    /**\n     * Processors that will process all log records\n     *\n     * To process records of a single handler instead, add the processor on that specific handler\n     *\n     * @var callable[]\n     */\n    protected $processors;\n\n    /**\n     * @var bool\n     */\n    protected $microsecondTimestamps = true;\n\n    /**\n     * @param string             $name       The logging channel\n     * @param HandlerInterface[] $handlers   Optional stack of handlers, the first one in the array is called first, etc.\n     * @param callable[]         $processors Optional array of processors\n     */\n    public function __construct($name, array $handlers = array(), array $processors = array())\n    {\n        $this->name = $name;\n        $this->handlers = $handlers;\n        $this->processors = $processors;\n    }\n\n    /**\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * Return a new cloned instance with the name changed\n     *\n     * @return static\n     */\n    public function withName($name)\n    {\n        $new = clone $this;\n        $new->name = $name;\n\n        return $new;\n    }\n\n    /**\n     * Pushes a handler on to the stack.\n     *\n     * @param  HandlerInterface $handler\n     * @return $this\n     */\n    public function pushHandler(HandlerInterface $handler)\n    {\n        array_unshift($this->handlers, $handler);\n\n        return $this;\n    }\n\n    /**\n     * Pops a handler from the stack\n     *\n     * @return HandlerInterface\n     */\n    public function popHandler()\n    {\n        if (!$this->handlers) {\n            throw new \\LogicException('You tried to pop from an empty handler stack.');\n        }\n\n        return array_shift($this->handlers);\n    }\n\n    /**\n     * Set handlers, replacing all existing ones.\n     *\n     * If a map is passed, keys will be ignored.\n     *\n     * @param  HandlerInterface[] $handlers\n     * @return $this\n     */\n    public function setHandlers(array $handlers)\n    {\n        $this->handlers = array();\n        foreach (array_reverse($handlers) as $handler) {\n            $this->pushHandler($handler);\n        }\n\n        return $this;\n    }\n\n    /**\n     * @return HandlerInterface[]\n     */\n    public function getHandlers()\n    {\n        return $this->handlers;\n    }\n\n    /**\n     * Adds a processor on to the stack.\n     *\n     * @param  callable $callback\n     * @return $this\n     */\n    public function pushProcessor($callback)\n    {\n        if (!is_callable($callback)) {\n            throw new \\InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given');\n        }\n        array_unshift($this->processors, $callback);\n\n        return $this;\n    }\n\n    /**\n     * Removes the processor on top of the stack and returns it.\n     *\n     * @return callable\n     */\n    public function popProcessor()\n    {\n        if (!$this->processors) {\n            throw new \\LogicException('You tried to pop from an empty processor stack.');\n        }\n\n        return array_shift($this->processors);\n    }\n\n    /**\n     * @return callable[]\n     */\n    public function getProcessors()\n    {\n        return $this->processors;\n    }\n\n    /**\n     * Control the use of microsecond resolution timestamps in the 'datetime'\n     * member of new records.\n     *\n     * Generating microsecond resolution timestamps by calling\n     * microtime(true), formatting the result via sprintf() and then parsing\n     * the resulting string via \\DateTime::createFromFormat() can incur\n     * a measurable runtime overhead vs simple usage of DateTime to capture\n     * a second resolution timestamp in systems which generate a large number\n     * of log events.\n     *\n     * @param bool $micro True to use microtime() to create timestamps\n     */\n    public function useMicrosecondTimestamps($micro)\n    {\n        $this->microsecondTimestamps = (bool) $micro;\n    }\n\n    /**\n     * Adds a log record.\n     *\n     * @param  int     $level   The logging level\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function addRecord($level, $message, array $context = array())\n    {\n        if (!$this->handlers) {\n            $this->pushHandler(new StreamHandler('php://stderr', static::DEBUG));\n        }\n\n        $levelName = static::getLevelName($level);\n\n        // check if any handler will handle this message so we can return early and save cycles\n        $handlerKey = null;\n        reset($this->handlers);\n        while ($handler = current($this->handlers)) {\n            if ($handler->isHandling(array('level' => $level))) {\n                $handlerKey = key($this->handlers);\n                break;\n            }\n\n            next($this->handlers);\n        }\n\n        if (null === $handlerKey) {\n            return false;\n        }\n\n        if (!static::$timezone) {\n            static::$timezone = new \\DateTimeZone(date_default_timezone_get() ?: 'UTC');\n        }\n\n        // php7.1+ always has microseconds enabled, so we do not need this hack\n        if ($this->microsecondTimestamps && PHP_VERSION_ID < 70100) {\n            $ts = \\DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)), static::$timezone);\n        } else {\n            $ts = new \\DateTime(null, static::$timezone);\n        }\n        $ts->setTimezone(static::$timezone);\n\n        $record = array(\n            'message' => (string) $message,\n            'context' => $context,\n            'level' => $level,\n            'level_name' => $levelName,\n            'channel' => $this->name,\n            'datetime' => $ts,\n            'extra' => array(),\n        );\n\n        foreach ($this->processors as $processor) {\n            $record = call_user_func($processor, $record);\n        }\n\n        while ($handler = current($this->handlers)) {\n            if (true === $handler->handle($record)) {\n                break;\n            }\n\n            next($this->handlers);\n        }\n\n        return true;\n    }\n\n    /**\n     * Adds a log record at the DEBUG level.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function addDebug($message, array $context = array())\n    {\n        return $this->addRecord(static::DEBUG, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the INFO level.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function addInfo($message, array $context = array())\n    {\n        return $this->addRecord(static::INFO, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the NOTICE level.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function addNotice($message, array $context = array())\n    {\n        return $this->addRecord(static::NOTICE, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the WARNING level.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function addWarning($message, array $context = array())\n    {\n        return $this->addRecord(static::WARNING, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the ERROR level.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function addError($message, array $context = array())\n    {\n        return $this->addRecord(static::ERROR, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the CRITICAL level.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function addCritical($message, array $context = array())\n    {\n        return $this->addRecord(static::CRITICAL, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the ALERT level.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function addAlert($message, array $context = array())\n    {\n        return $this->addRecord(static::ALERT, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the EMERGENCY level.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function addEmergency($message, array $context = array())\n    {\n        return $this->addRecord(static::EMERGENCY, $message, $context);\n    }\n\n    /**\n     * Gets all supported logging levels.\n     *\n     * @return array Assoc array with human-readable level names => level codes.\n     */\n    public static function getLevels()\n    {\n        return array_flip(static::$levels);\n    }\n\n    /**\n     * Gets the name of the logging level.\n     *\n     * @param  int    $level\n     * @return string\n     */\n    public static function getLevelName($level)\n    {\n        if (!isset(static::$levels[$level])) {\n            throw new InvalidArgumentException('Level \"'.$level.'\" is not defined, use one of: '.implode(', ', array_keys(static::$levels)));\n        }\n\n        return static::$levels[$level];\n    }\n\n    /**\n     * Converts PSR-3 levels to Monolog ones if necessary\n     *\n     * @param string|int Level number (monolog) or name (PSR-3)\n     * @return int\n     */\n    public static function toMonologLevel($level)\n    {\n        if (is_string($level) && defined(__CLASS__.'::'.strtoupper($level))) {\n            return constant(__CLASS__.'::'.strtoupper($level));\n        }\n\n        return $level;\n    }\n\n    /**\n     * Checks whether the Logger has a handler that listens on the given level\n     *\n     * @param  int     $level\n     * @return Boolean\n     */\n    public function isHandling($level)\n    {\n        $record = array(\n            'level' => $level,\n        );\n\n        foreach ($this->handlers as $handler) {\n            if ($handler->isHandling($record)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Adds a log record at an arbitrary level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  mixed   $level   The log level\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function log($level, $message, array $context = array())\n    {\n        $level = static::toMonologLevel($level);\n\n        return $this->addRecord($level, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the DEBUG level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function debug($message, array $context = array())\n    {\n        return $this->addRecord(static::DEBUG, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the INFO level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function info($message, array $context = array())\n    {\n        return $this->addRecord(static::INFO, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the NOTICE level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function notice($message, array $context = array())\n    {\n        return $this->addRecord(static::NOTICE, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the WARNING level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function warn($message, array $context = array())\n    {\n        return $this->addRecord(static::WARNING, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the WARNING level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function warning($message, array $context = array())\n    {\n        return $this->addRecord(static::WARNING, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the ERROR level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function err($message, array $context = array())\n    {\n        return $this->addRecord(static::ERROR, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the ERROR level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function error($message, array $context = array())\n    {\n        return $this->addRecord(static::ERROR, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the CRITICAL level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function crit($message, array $context = array())\n    {\n        return $this->addRecord(static::CRITICAL, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the CRITICAL level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function critical($message, array $context = array())\n    {\n        return $this->addRecord(static::CRITICAL, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the ALERT level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function alert($message, array $context = array())\n    {\n        return $this->addRecord(static::ALERT, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the EMERGENCY level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function emerg($message, array $context = array())\n    {\n        return $this->addRecord(static::EMERGENCY, $message, $context);\n    }\n\n    /**\n     * Adds a log record at the EMERGENCY level.\n     *\n     * This method allows for compatibility with common interfaces.\n     *\n     * @param  string  $message The log message\n     * @param  array   $context The log context\n     * @return Boolean Whether the record has been processed\n     */\n    public function emergency($message, array $context = array())\n    {\n        return $this->addRecord(static::EMERGENCY, $message, $context);\n    }\n\n    /**\n     * Set the timezone to be used for the timestamp of log records.\n     *\n     * This is stored globally for all Logger instances\n     *\n     * @param \\DateTimeZone $tz Timezone object\n     */\n    public static function setTimezone(\\DateTimeZone $tz)\n    {\n        self::$timezone = $tz;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\Logger;\n\n/**\n * Injects Git branch and Git commit SHA in all records\n *\n * @author Nick Otter\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass GitProcessor\n{\n    private $level;\n    private static $cache;\n\n    public function __construct($level = Logger::DEBUG)\n    {\n        $this->level = Logger::toMonologLevel($level);\n    }\n\n    /**\n     * @param  array $record\n     * @return array\n     */\n    public function __invoke(array $record)\n    {\n        // return if the level is not high enough\n        if ($record['level'] < $this->level) {\n            return $record;\n        }\n\n        $record['extra']['git'] = self::getGitInfo();\n\n        return $record;\n    }\n\n    private static function getGitInfo()\n    {\n        if (self::$cache) {\n            return self::$cache;\n        }\n\n        $branches = `git branch -v --no-abbrev`;\n        if (preg_match('{^\\* (.+?)\\s+([a-f0-9]{40})(?:\\s|$)}m', $branches, $matches)) {\n            return self::$cache = array(\n                'branch' => $matches[1],\n                'commit' => $matches[2],\n            );\n        }\n\n        return self::$cache = array();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\Logger;\n\n/**\n * Injects line/file:class/function where the log message came from\n *\n * Warning: This only works if the handler processes the logs directly.\n * If you put the processor on a handler that is behind a FingersCrossedHandler\n * for example, the processor will only be called once the trigger level is reached,\n * and all the log records will have the same file/line/.. data from the call that\n * triggered the FingersCrossedHandler.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass IntrospectionProcessor\n{\n    private $level;\n\n    private $skipClassesPartials;\n\n    private $skipStackFramesCount;\n\n    private $skipFunctions = array(\n        'call_user_func',\n        'call_user_func_array',\n    );\n\n    public function __construct($level = Logger::DEBUG, array $skipClassesPartials = array(), $skipStackFramesCount = 0)\n    {\n        $this->level = Logger::toMonologLevel($level);\n        $this->skipClassesPartials = array_merge(array('Monolog\\\\'), $skipClassesPartials);\n        $this->skipStackFramesCount = $skipStackFramesCount;\n    }\n\n    /**\n     * @param  array $record\n     * @return array\n     */\n    public function __invoke(array $record)\n    {\n        // return if the level is not high enough\n        if ($record['level'] < $this->level) {\n            return $record;\n        }\n\n        /*\n        * http://php.net/manual/en/function.debug-backtrace.php\n        * As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added.\n        * Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'.\n        */\n        $trace = debug_backtrace((PHP_VERSION_ID < 50306) ? 2 : DEBUG_BACKTRACE_IGNORE_ARGS);\n\n        // skip first since it's always the current method\n        array_shift($trace);\n        // the call_user_func call is also skipped\n        array_shift($trace);\n\n        $i = 0;\n\n        while ($this->isTraceClassOrSkippedFunction($trace, $i)) {\n            if (isset($trace[$i]['class'])) {\n                foreach ($this->skipClassesPartials as $part) {\n                    if (strpos($trace[$i]['class'], $part) !== false) {\n                        $i++;\n                        continue 2;\n                    }\n                }\n            } elseif (in_array($trace[$i]['function'], $this->skipFunctions)) {\n                $i++;\n                continue;\n            }\n\n            break;\n        }\n\n        $i += $this->skipStackFramesCount;\n\n        // we should have the call source now\n        $record['extra'] = array_merge(\n            $record['extra'],\n            array(\n                'file'      => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null,\n                'line'      => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null,\n                'class'     => isset($trace[$i]['class']) ? $trace[$i]['class'] : null,\n                'function'  => isset($trace[$i]['function']) ? $trace[$i]['function'] : null,\n            )\n        );\n\n        return $record;\n    }\n\n    private function isTraceClassOrSkippedFunction(array $trace, $index)\n    {\n        if (!isset($trace[$index])) {\n            return false;\n        }\n\n        return isset($trace[$index]['class']) || in_array($trace[$index]['function'], $this->skipFunctions);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\n/**\n * Injects memory_get_peak_usage in all records\n *\n * @see Monolog\\Processor\\MemoryProcessor::__construct() for options\n * @author Rob Jensen\n */\nclass MemoryPeakUsageProcessor extends MemoryProcessor\n{\n    /**\n     * @param  array $record\n     * @return array\n     */\n    public function __invoke(array $record)\n    {\n        $bytes = memory_get_peak_usage($this->realUsage);\n        $formatted = $this->formatBytes($bytes);\n\n        $record['extra']['memory_peak_usage'] = $formatted;\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\n/**\n * Some methods that are common for all memory processors\n *\n * @author Rob Jensen\n */\nabstract class MemoryProcessor\n{\n    /**\n     * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported.\n     */\n    protected $realUsage;\n\n    /**\n     * @var bool If true, then format memory size to human readable string (MB, KB, B depending on size)\n     */\n    protected $useFormatting;\n\n    /**\n     * @param bool $realUsage     Set this to true to get the real size of memory allocated from system.\n     * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size)\n     */\n    public function __construct($realUsage = true, $useFormatting = true)\n    {\n        $this->realUsage = (boolean) $realUsage;\n        $this->useFormatting = (boolean) $useFormatting;\n    }\n\n    /**\n     * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is\n     *\n     * @param  int        $bytes\n     * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as is\n     */\n    protected function formatBytes($bytes)\n    {\n        $bytes = (int) $bytes;\n\n        if (!$this->useFormatting) {\n            return $bytes;\n        }\n\n        if ($bytes > 1024 * 1024) {\n            return round($bytes / 1024 / 1024, 2).' MB';\n        } elseif ($bytes > 1024) {\n            return round($bytes / 1024, 2).' KB';\n        }\n\n        return $bytes . ' B';\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\n/**\n * Injects memory_get_usage in all records\n *\n * @see Monolog\\Processor\\MemoryProcessor::__construct() for options\n * @author Rob Jensen\n */\nclass MemoryUsageProcessor extends MemoryProcessor\n{\n    /**\n     * @param  array $record\n     * @return array\n     */\n    public function __invoke(array $record)\n    {\n        $bytes = memory_get_usage($this->realUsage);\n        $formatted = $this->formatBytes($bytes);\n\n        $record['extra']['memory_usage'] = $formatted;\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jonathan A. Schweder <jonathanschweder@gmail.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\Logger;\n\n/**\n * Injects Hg branch and Hg revision number in all records\n *\n * @author Jonathan A. Schweder <jonathanschweder@gmail.com>\n */\nclass MercurialProcessor\n{\n    private $level;\n    private static $cache;\n\n    public function __construct($level = Logger::DEBUG)\n    {\n        $this->level = Logger::toMonologLevel($level);\n    }\n\n    /**\n     * @param  array $record\n     * @return array\n     */\n    public function __invoke(array $record)\n    {\n        // return if the level is not high enough\n        if ($record['level'] < $this->level) {\n            return $record;\n        }\n\n        $record['extra']['hg'] = self::getMercurialInfo();\n\n        return $record;\n    }\n\n    private static function getMercurialInfo()\n    {\n        if (self::$cache) {\n            return self::$cache;\n        }\n\n        $result = explode(' ', trim(`hg id -nb`));\n        if (count($result) >= 3) {\n            return self::$cache = array(\n                'branch' => $result[1],\n                'revision' => $result[2],\n            );\n        }\n\n        return self::$cache = array();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\n/**\n * Adds value of getmypid into records\n *\n * @author Andreas Hörnicke\n */\nclass ProcessIdProcessor\n{\n    /**\n     * @param  array $record\n     * @return array\n     */\n    public function __invoke(array $record)\n    {\n        $record['extra']['process_id'] = getmypid();\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\n/**\n * Processes a record's message according to PSR-3 rules\n *\n * It replaces {foo} with the value from $context['foo']\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass PsrLogMessageProcessor\n{\n    /**\n     * @param  array $record\n     * @return array\n     */\n    public function __invoke(array $record)\n    {\n        if (false === strpos($record['message'], '{')) {\n            return $record;\n        }\n\n        $replacements = array();\n        foreach ($record['context'] as $key => $val) {\n            if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, \"__toString\"))) {\n                $replacements['{'.$key.'}'] = $val;\n            } elseif (is_object($val)) {\n                $replacements['{'.$key.'}'] = '[object '.get_class($val).']';\n            } else {\n                $replacements['{'.$key.'}'] = '['.gettype($val).']';\n            }\n        }\n\n        $record['message'] = strtr($record['message'], $replacements);\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\n/**\n * Adds a tags array into record\n *\n * @author Martijn Riemers\n */\nclass TagProcessor\n{\n    private $tags;\n\n    public function __construct(array $tags = array())\n    {\n        $this->setTags($tags);\n    }\n\n    public function addTags(array $tags = array())\n    {\n        $this->tags = array_merge($this->tags, $tags);\n    }\n\n    public function setTags(array $tags = array())\n    {\n        $this->tags = $tags;\n    }\n\n    public function __invoke(array $record)\n    {\n        $record['extra']['tags'] = $this->tags;\n\n        return $record;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\n/**\n * Adds a unique identifier into records\n *\n * @author Simon Mönch <sm@webfactory.de>\n */\nclass UidProcessor\n{\n    private $uid;\n\n    public function __construct($length = 7)\n    {\n        if (!is_int($length) || $length > 32 || $length < 1) {\n            throw new \\InvalidArgumentException('The uid length must be an integer between 1 and 32');\n        }\n\n        $this->uid = substr(hash('md5', uniqid('', true)), 0, $length);\n    }\n\n    public function __invoke(array $record)\n    {\n        $record['extra']['uid'] = $this->uid;\n\n        return $record;\n    }\n\n    /**\n     * @return string\n     */\n    public function getUid()\n    {\n        return $this->uid;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\n/**\n * Injects url/method and remote IP of the current web request in all records\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n */\nclass WebProcessor\n{\n    /**\n     * @var array|\\ArrayAccess\n     */\n    protected $serverData;\n\n    /**\n     * Default fields\n     *\n     * Array is structured as [key in record.extra => key in $serverData]\n     *\n     * @var array\n     */\n    protected $extraFields = array(\n        'url'         => 'REQUEST_URI',\n        'ip'          => 'REMOTE_ADDR',\n        'http_method' => 'REQUEST_METHOD',\n        'server'      => 'SERVER_NAME',\n        'referrer'    => 'HTTP_REFERER',\n    );\n\n    /**\n     * @param array|\\ArrayAccess $serverData  Array or object w/ ArrayAccess that provides access to the $_SERVER data\n     * @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\n     */\n    public function __construct($serverData = null, array $extraFields = null)\n    {\n        if (null === $serverData) {\n            $this->serverData = &$_SERVER;\n        } elseif (is_array($serverData) || $serverData instanceof \\ArrayAccess) {\n            $this->serverData = $serverData;\n        } else {\n            throw new \\UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.');\n        }\n\n        if (null !== $extraFields) {\n            if (isset($extraFields[0])) {\n                foreach (array_keys($this->extraFields) as $fieldName) {\n                    if (!in_array($fieldName, $extraFields)) {\n                        unset($this->extraFields[$fieldName]);\n                    }\n                }\n            } else {\n                $this->extraFields = $extraFields;\n            }\n        }\n    }\n\n    /**\n     * @param  array $record\n     * @return array\n     */\n    public function __invoke(array $record)\n    {\n        // skip processing if for some reason request data\n        // is not present (CLI or wonky SAPIs)\n        if (!isset($this->serverData['REQUEST_URI'])) {\n            return $record;\n        }\n\n        $record['extra'] = $this->appendExtraFields($record['extra']);\n\n        return $record;\n    }\n\n    /**\n     * @param  string $extraName\n     * @param  string $serverName\n     * @return $this\n     */\n    public function addExtraField($extraName, $serverName)\n    {\n        $this->extraFields[$extraName] = $serverName;\n\n        return $this;\n    }\n\n    /**\n     * @param  array $extra\n     * @return array\n     */\n    private function appendExtraFields(array $extra)\n    {\n        foreach ($this->extraFields as $extraName => $serverName) {\n            $extra[$extraName] = isset($this->serverData[$serverName]) ? $this->serverData[$serverName] : null;\n        }\n\n        if (isset($this->serverData['UNIQUE_ID'])) {\n            $extra['unique_id'] = $this->serverData['UNIQUE_ID'];\n        }\n\n        return $extra;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Registry.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse InvalidArgumentException;\n\n/**\n * Monolog log registry\n *\n * Allows to get `Logger` instances in the global scope\n * via static method calls on this class.\n *\n * <code>\n * $application = new Monolog\\Logger('application');\n * $api = new Monolog\\Logger('api');\n *\n * Monolog\\Registry::addLogger($application);\n * Monolog\\Registry::addLogger($api);\n *\n * function testLogger()\n * {\n *     Monolog\\Registry::api()->addError('Sent to $api Logger instance');\n *     Monolog\\Registry::application()->addError('Sent to $application Logger instance');\n * }\n * </code>\n *\n * @author Tomas Tatarko <tomas@tatarko.sk>\n */\nclass Registry\n{\n    /**\n     * List of all loggers in the registry (by named indexes)\n     *\n     * @var Logger[]\n     */\n    private static $loggers = array();\n\n    /**\n     * Adds new logging channel to the registry\n     *\n     * @param  Logger                    $logger    Instance of the logging channel\n     * @param  string|null               $name      Name of the logging channel ($logger->getName() by default)\n     * @param  bool                      $overwrite Overwrite instance in the registry if the given name already exists?\n     * @throws \\InvalidArgumentException If $overwrite set to false and named Logger instance already exists\n     */\n    public static function addLogger(Logger $logger, $name = null, $overwrite = false)\n    {\n        $name = $name ?: $logger->getName();\n\n        if (isset(self::$loggers[$name]) && !$overwrite) {\n            throw new InvalidArgumentException('Logger with the given name already exists');\n        }\n\n        self::$loggers[$name] = $logger;\n    }\n\n    /**\n     * Checks if such logging channel exists by name or instance\n     *\n     * @param string|Logger $logger Name or logger instance\n     */\n    public static function hasLogger($logger)\n    {\n        if ($logger instanceof Logger) {\n            $index = array_search($logger, self::$loggers, true);\n\n            return false !== $index;\n        } else {\n            return isset(self::$loggers[$logger]);\n        }\n    }\n\n    /**\n     * Removes instance from registry by name or instance\n     *\n     * @param string|Logger $logger Name or logger instance\n     */\n    public static function removeLogger($logger)\n    {\n        if ($logger instanceof Logger) {\n            if (false !== ($idx = array_search($logger, self::$loggers, true))) {\n                unset(self::$loggers[$idx]);\n            }\n        } else {\n            unset(self::$loggers[$logger]);\n        }\n    }\n\n    /**\n     * Clears the registry\n     */\n    public static function clear()\n    {\n        self::$loggers = array();\n    }\n\n    /**\n     * Gets Logger instance from the registry\n     *\n     * @param  string                    $name Name of the requested Logger instance\n     * @throws \\InvalidArgumentException If named Logger instance is not in the registry\n     * @return Logger                    Requested instance of Logger\n     */\n    public static function getInstance($name)\n    {\n        if (!isset(self::$loggers[$name])) {\n            throw new InvalidArgumentException(sprintf('Requested \"%s\" logger instance is not in the registry', $name));\n        }\n\n        return self::$loggers[$name];\n    }\n\n    /**\n     * Gets Logger instance from the registry via static method call\n     *\n     * @param  string                    $name      Name of the requested Logger instance\n     * @param  array                     $arguments Arguments passed to static method call\n     * @throws \\InvalidArgumentException If named Logger instance is not in the registry\n     * @return Logger                    Requested instance of Logger\n     */\n    public static function __callStatic($name, $arguments)\n    {\n        return self::getInstance($name);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse Monolog\\Handler\\TestHandler;\n\nclass ErrorHandlerTest extends \\PHPUnit_Framework_TestCase\n{\n    public function testHandleError()\n    {\n        $logger = new Logger('test', array($handler = new TestHandler));\n        $errHandler = new ErrorHandler($logger);\n\n        $errHandler->registerErrorHandler(array(E_USER_NOTICE => Logger::EMERGENCY), false);\n        trigger_error('Foo', E_USER_ERROR);\n        $this->assertCount(1, $handler->getRecords());\n        $this->assertTrue($handler->hasErrorRecords());\n        trigger_error('Foo', E_USER_NOTICE);\n        $this->assertCount(2, $handler->getRecords());\n        $this->assertTrue($handler->hasEmergencyRecords());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\n\nclass ChromePHPFormatterTest extends \\PHPUnit_Framework_TestCase\n{\n    /**\n     * @covers Monolog\\Formatter\\ChromePHPFormatter::format\n     */\n    public function testDefaultFormat()\n    {\n        $formatter = new ChromePHPFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('ip' => '127.0.0.1'),\n            'message' => 'log',\n        );\n\n        $message = $formatter->format($record);\n\n        $this->assertEquals(\n            array(\n                'meh',\n                array(\n                    'message' => 'log',\n                    'context' => array('from' => 'logger'),\n                    'extra' => array('ip' => '127.0.0.1'),\n                ),\n                'unknown',\n                'error',\n            ),\n            $message\n        );\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\ChromePHPFormatter::format\n     */\n    public function testFormatWithFileAndLine()\n    {\n        $formatter = new ChromePHPFormatter();\n        $record = array(\n            'level' => Logger::CRITICAL,\n            'level_name' => 'CRITICAL',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14),\n            'message' => 'log',\n        );\n\n        $message = $formatter->format($record);\n\n        $this->assertEquals(\n            array(\n                'meh',\n                array(\n                    'message' => 'log',\n                    'context' => array('from' => 'logger'),\n                    'extra' => array('ip' => '127.0.0.1'),\n                ),\n                'test : 14',\n                'error',\n            ),\n            $message\n        );\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\ChromePHPFormatter::format\n     */\n    public function testFormatWithoutContext()\n    {\n        $formatter = new ChromePHPFormatter();\n        $record = array(\n            'level' => Logger::DEBUG,\n            'level_name' => 'DEBUG',\n            'channel' => 'meh',\n            'context' => array(),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(),\n            'message' => 'log',\n        );\n\n        $message = $formatter->format($record);\n\n        $this->assertEquals(\n            array(\n                'meh',\n                'log',\n                'unknown',\n                'log',\n            ),\n            $message\n        );\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\ChromePHPFormatter::formatBatch\n     */\n    public function testBatchFormatThrowException()\n    {\n        $formatter = new ChromePHPFormatter();\n        $records = array(\n            array(\n                'level' => Logger::INFO,\n                'level_name' => 'INFO',\n                'channel' => 'meh',\n                'context' => array(),\n                'datetime' => new \\DateTime(\"@0\"),\n                'extra' => array(),\n                'message' => 'log',\n            ),\n            array(\n                'level' => Logger::WARNING,\n                'level_name' => 'WARNING',\n                'channel' => 'foo',\n                'context' => array(),\n                'datetime' => new \\DateTime(\"@0\"),\n                'extra' => array(),\n                'message' => 'log2',\n            ),\n        );\n\n        $this->assertEquals(\n            array(\n                array(\n                    'meh',\n                    'log',\n                    'unknown',\n                    'info',\n                ),\n                array(\n                    'foo',\n                    'log2',\n                    'unknown',\n                    'warn',\n                ),\n            ),\n            $formatter->formatBatch($records)\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\n\nclass ElasticaFormatterTest extends \\PHPUnit_Framework_TestCase\n{\n    public function setUp()\n    {\n        if (!class_exists(\"Elastica\\Document\")) {\n            $this->markTestSkipped(\"ruflin/elastica not installed\");\n        }\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\ElasticaFormatter::__construct\n     * @covers Monolog\\Formatter\\ElasticaFormatter::format\n     * @covers Monolog\\Formatter\\ElasticaFormatter::getDocument\n     */\n    public function testFormat()\n    {\n        // test log message\n        $msg = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('foo' => 7, 'bar', 'class' => new \\stdClass),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(),\n            'message' => 'log',\n        );\n\n        // expected values\n        $expected = $msg;\n        $expected['datetime'] = '1970-01-01T00:00:00.000000+00:00';\n        $expected['context'] = array(\n            'class' => '[object] (stdClass: {})',\n            'foo' => 7,\n            0 => 'bar',\n        );\n\n        // format log message\n        $formatter = new ElasticaFormatter('my_index', 'doc_type');\n        $doc = $formatter->format($msg);\n        $this->assertInstanceOf('Elastica\\Document', $doc);\n\n        // Document parameters\n        $params = $doc->getParams();\n        $this->assertEquals('my_index', $params['_index']);\n        $this->assertEquals('doc_type', $params['_type']);\n\n        // Document data values\n        $data = $doc->getData();\n        foreach (array_keys($expected) as $key) {\n            $this->assertEquals($expected[$key], $data[$key]);\n        }\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\ElasticaFormatter::getIndex\n     * @covers Monolog\\Formatter\\ElasticaFormatter::getType\n     */\n    public function testGetters()\n    {\n        $formatter = new ElasticaFormatter('my_index', 'doc_type');\n        $this->assertEquals('my_index', $formatter->getIndex());\n        $this->assertEquals('doc_type', $formatter->getType());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/FlowdockFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\nuse Monolog\\TestCase;\n\nclass FlowdockFormatterTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Formatter\\FlowdockFormatter::format\n     */\n    public function testFormat()\n    {\n        $formatter = new FlowdockFormatter('test_source', 'source@test.com');\n        $record = $this->getRecord();\n\n        $expected = array(\n            'source' => 'test_source',\n            'from_address' => 'source@test.com',\n            'subject' => 'in test_source: WARNING - test',\n            'content' => 'test',\n            'tags' => array('#logs', '#warning', '#test'),\n            'project' => 'test_source',\n        );\n        $formatted = $formatter->format($record);\n\n        $this->assertEquals($expected, $formatted['flowdock']);\n    }\n\n    /**\n     * @ covers Monolog\\Formatter\\FlowdockFormatter::formatBatch\n     */\n    public function testFormatBatch()\n    {\n        $formatter = new FlowdockFormatter('test_source', 'source@test.com');\n        $records = array(\n            $this->getRecord(Logger::WARNING),\n            $this->getRecord(Logger::DEBUG),\n        );\n        $formatted = $formatter->formatBatch($records);\n\n        $this->assertArrayHasKey('flowdock', $formatted[0]);\n        $this->assertArrayHasKey('flowdock', $formatted[1]);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\nuse Monolog\\TestCase;\n\nclass FluentdFormatterTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Formatter\\FluentdFormatter::__construct\n     * @covers Monolog\\Formatter\\FluentdFormatter::isUsingLevelsInTag\n     */\n    public function testConstruct()\n    {\n        $formatter = new FluentdFormatter();\n        $this->assertEquals(false, $formatter->isUsingLevelsInTag());\n        $formatter = new FluentdFormatter(false);\n        $this->assertEquals(false, $formatter->isUsingLevelsInTag());\n        $formatter = new FluentdFormatter(true);\n        $this->assertEquals(true, $formatter->isUsingLevelsInTag());\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\FluentdFormatter::format\n     */\n    public function testFormat()\n    {\n        $record = $this->getRecord(Logger::WARNING);\n        $record['datetime'] = new \\DateTime(\"@0\");\n\n        $formatter = new FluentdFormatter();\n        $this->assertEquals(\n            '[\"test\",0,{\"message\":\"test\",\"extra\":[],\"level\":300,\"level_name\":\"WARNING\"}]',\n            $formatter->format($record)\n        );\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\FluentdFormatter::format\n     */\n    public function testFormatWithTag()\n    {\n        $record = $this->getRecord(Logger::ERROR);\n        $record['datetime'] = new \\DateTime(\"@0\");\n\n        $formatter = new FluentdFormatter(true);\n        $this->assertEquals(\n            '[\"test.error\",0,{\"message\":\"test\",\"extra\":[]}]',\n            $formatter->format($record)\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\n\nclass GelfMessageFormatterTest extends \\PHPUnit_Framework_TestCase\n{\n    public function setUp()\n    {\n        if (!class_exists('\\Gelf\\Message')) {\n            $this->markTestSkipped(\"graylog2/gelf-php or mlehner/gelf-php is not installed\");\n        }\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\GelfMessageFormatter::format\n     */\n    public function testDefaultFormatter()\n    {\n        $formatter = new GelfMessageFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array(),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(),\n            'message' => 'log',\n        );\n\n        $message = $formatter->format($record);\n\n        $this->assertInstanceOf('Gelf\\Message', $message);\n        $this->assertEquals(0, $message->getTimestamp());\n        $this->assertEquals('log', $message->getShortMessage());\n        $this->assertEquals('meh', $message->getFacility());\n        $this->assertEquals(null, $message->getLine());\n        $this->assertEquals(null, $message->getFile());\n        $this->assertEquals($this->isLegacy() ? 3 : 'error', $message->getLevel());\n        $this->assertNotEmpty($message->getHost());\n\n        $formatter = new GelfMessageFormatter('mysystem');\n\n        $message = $formatter->format($record);\n\n        $this->assertInstanceOf('Gelf\\Message', $message);\n        $this->assertEquals('mysystem', $message->getHost());\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\GelfMessageFormatter::format\n     */\n    public function testFormatWithFileAndLine()\n    {\n        $formatter = new GelfMessageFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('file' => 'test', 'line' => 14),\n            'message' => 'log',\n        );\n\n        $message = $formatter->format($record);\n\n        $this->assertInstanceOf('Gelf\\Message', $message);\n        $this->assertEquals('test', $message->getFile());\n        $this->assertEquals(14, $message->getLine());\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\GelfMessageFormatter::format\n     * @expectedException InvalidArgumentException\n     */\n    public function testFormatInvalidFails()\n    {\n        $formatter = new GelfMessageFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n        );\n\n        $formatter->format($record);\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\GelfMessageFormatter::format\n     */\n    public function testFormatWithContext()\n    {\n        $formatter = new GelfMessageFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('key' => 'pair'),\n            'message' => 'log',\n        );\n\n        $message = $formatter->format($record);\n\n        $this->assertInstanceOf('Gelf\\Message', $message);\n\n        $message_array = $message->toArray();\n\n        $this->assertArrayHasKey('_ctxt_from', $message_array);\n        $this->assertEquals('logger', $message_array['_ctxt_from']);\n\n        // Test with extraPrefix\n        $formatter = new GelfMessageFormatter(null, null, 'CTX');\n        $message = $formatter->format($record);\n\n        $this->assertInstanceOf('Gelf\\Message', $message);\n\n        $message_array = $message->toArray();\n\n        $this->assertArrayHasKey('_CTXfrom', $message_array);\n        $this->assertEquals('logger', $message_array['_CTXfrom']);\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\GelfMessageFormatter::format\n     */\n    public function testFormatWithContextContainingException()\n    {\n        $formatter = new GelfMessageFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger', 'exception' => array(\n                'class' => '\\Exception',\n                'file'  => '/some/file/in/dir.php:56',\n                'trace' => array('/some/file/1.php:23', '/some/file/2.php:3'),\n            )),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(),\n            'message' => 'log',\n        );\n\n        $message = $formatter->format($record);\n\n        $this->assertInstanceOf('Gelf\\Message', $message);\n\n        $this->assertEquals(\"/some/file/in/dir.php\", $message->getFile());\n        $this->assertEquals(\"56\", $message->getLine());\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\GelfMessageFormatter::format\n     */\n    public function testFormatWithExtra()\n    {\n        $formatter = new GelfMessageFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('key' => 'pair'),\n            'message' => 'log',\n        );\n\n        $message = $formatter->format($record);\n\n        $this->assertInstanceOf('Gelf\\Message', $message);\n\n        $message_array = $message->toArray();\n\n        $this->assertArrayHasKey('_key', $message_array);\n        $this->assertEquals('pair', $message_array['_key']);\n\n        // Test with extraPrefix\n        $formatter = new GelfMessageFormatter(null, 'EXT');\n        $message = $formatter->format($record);\n\n        $this->assertInstanceOf('Gelf\\Message', $message);\n\n        $message_array = $message->toArray();\n\n        $this->assertArrayHasKey('_EXTkey', $message_array);\n        $this->assertEquals('pair', $message_array['_EXTkey']);\n    }\n\n    public function testFormatWithLargeData()\n    {\n        $formatter = new GelfMessageFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('exception' => str_repeat(' ', 32767)),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('key' => str_repeat(' ', 32767)),\n            'message' => 'log'\n        );\n        $message = $formatter->format($record);\n        $messageArray = $message->toArray();\n\n        // 200 for padding + metadata\n        $length = 200;\n\n        foreach ($messageArray as $key => $value) {\n            if (!in_array($key, array('level', 'timestamp'))) {\n                $length += strlen($value);\n            }\n        }\n\n        $this->assertLessThanOrEqual(65792, $length, 'The message length is no longer than the maximum allowed length');\n    }\n\n    public function testFormatWithUnlimitedLength()\n    {\n        $formatter = new GelfMessageFormatter('LONG_SYSTEM_NAME', null, 'ctxt_', PHP_INT_MAX);\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('exception' => str_repeat(' ', 32767 * 2)),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('key' => str_repeat(' ', 32767 * 2)),\n            'message' => 'log'\n        );\n        $message = $formatter->format($record);\n        $messageArray = $message->toArray();\n\n        // 200 for padding + metadata\n        $length = 200;\n\n        foreach ($messageArray as $key => $value) {\n            if (!in_array($key, array('level', 'timestamp'))) {\n                $length += strlen($value);\n            }\n        }\n\n        $this->assertGreaterThanOrEqual(131289, $length, 'The message should not be truncated');\n    }\n\n    private function isLegacy()\n    {\n        return interface_exists('\\Gelf\\IMessagePublisher');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\nuse Monolog\\TestCase;\n\nclass JsonFormatterTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Formatter\\JsonFormatter::__construct\n     * @covers Monolog\\Formatter\\JsonFormatter::getBatchMode\n     * @covers Monolog\\Formatter\\JsonFormatter::isAppendingNewlines\n     */\n    public function testConstruct()\n    {\n        $formatter = new JsonFormatter();\n        $this->assertEquals(JsonFormatter::BATCH_MODE_JSON, $formatter->getBatchMode());\n        $this->assertEquals(true, $formatter->isAppendingNewlines());\n        $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES, false);\n        $this->assertEquals(JsonFormatter::BATCH_MODE_NEWLINES, $formatter->getBatchMode());\n        $this->assertEquals(false, $formatter->isAppendingNewlines());\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\JsonFormatter::format\n     */\n    public function testFormat()\n    {\n        $formatter = new JsonFormatter();\n        $record = $this->getRecord();\n        $this->assertEquals(json_encode($record).\"\\n\", $formatter->format($record));\n\n        $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false);\n        $record = $this->getRecord();\n        $this->assertEquals(json_encode($record), $formatter->format($record));\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\JsonFormatter::formatBatch\n     * @covers Monolog\\Formatter\\JsonFormatter::formatBatchJson\n     */\n    public function testFormatBatch()\n    {\n        $formatter = new JsonFormatter();\n        $records = array(\n            $this->getRecord(Logger::WARNING),\n            $this->getRecord(Logger::DEBUG),\n        );\n        $this->assertEquals(json_encode($records), $formatter->formatBatch($records));\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\JsonFormatter::formatBatch\n     * @covers Monolog\\Formatter\\JsonFormatter::formatBatchNewlines\n     */\n    public function testFormatBatchNewlines()\n    {\n        $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES);\n        $records = $expected = array(\n            $this->getRecord(Logger::WARNING),\n            $this->getRecord(Logger::DEBUG),\n        );\n        array_walk($expected, function (&$value, $key) {\n            $value = json_encode($value);\n        });\n        $this->assertEquals(implode(\"\\n\", $expected), $formatter->formatBatch($records));\n    }\n\n    public function testDefFormatWithException()\n    {\n        $formatter = new JsonFormatter();\n        $exception = new \\RuntimeException('Foo');\n        $formattedException = $this->formatException($exception);\n\n        $message = $this->formatRecordWithExceptionInContext($formatter, $exception);\n\n        $this->assertContextContainsFormattedException($formattedException, $message);\n    }\n\n    public function testDefFormatWithPreviousException()\n    {\n        $formatter = new JsonFormatter();\n        $exception = new \\RuntimeException('Foo', 0, new \\LogicException('Wut?'));\n        $formattedPrevException = $this->formatException($exception->getPrevious());\n        $formattedException = $this->formatException($exception, $formattedPrevException);\n\n        $message = $this->formatRecordWithExceptionInContext($formatter, $exception);\n\n        $this->assertContextContainsFormattedException($formattedException, $message);\n    }\n\n    public function testDefFormatWithThrowable()\n    {\n        if (!class_exists('Error') || !is_subclass_of('Error', 'Throwable')) {\n            $this->markTestSkipped('Requires PHP >=7');\n        }\n\n        $formatter = new JsonFormatter();\n        $throwable = new \\Error('Foo');\n        $formattedThrowable = $this->formatException($throwable);\n\n        $message = $this->formatRecordWithExceptionInContext($formatter, $throwable);\n\n        $this->assertContextContainsFormattedException($formattedThrowable, $message);\n    }\n\n    /**\n     * @param string $expected\n     * @param string $actual\n     *\n     * @internal param string $exception\n     */\n    private function assertContextContainsFormattedException($expected, $actual)\n    {\n        $this->assertEquals(\n            '{\"level_name\":\"CRITICAL\",\"channel\":\"core\",\"context\":{\"exception\":'.$expected.'},\"datetime\":null,\"extra\":[],\"message\":\"foobar\"}'.\"\\n\",\n            $actual\n        );\n    }\n\n    /**\n     * @param JsonFormatter $formatter\n     * @param \\Exception|\\Throwable $exception\n     *\n     * @return string\n     */\n    private function formatRecordWithExceptionInContext(JsonFormatter $formatter, $exception)\n    {\n        $message = $formatter->format(array(\n            'level_name' => 'CRITICAL',\n            'channel' => 'core',\n            'context' => array('exception' => $exception),\n            'datetime' => null,\n            'extra' => array(),\n            'message' => 'foobar',\n        ));\n        return $message;\n    }\n\n    /**\n     * @param \\Exception|\\Throwable $exception\n     *\n     * @return string\n     */\n    private function formatExceptionFilePathWithLine($exception)\n    {\n        $options = 0;\n        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {\n            $options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;\n        }\n        $path = substr(json_encode($exception->getFile(), $options), 1, -1);\n        return $path . ':' . $exception->getLine();\n    }\n\n    /**\n     * @param \\Exception|\\Throwable $exception\n     *\n     * @param null|string $previous\n     *\n     * @return string\n     */\n    private function formatException($exception, $previous = null)\n    {\n        $formattedException =\n            '{\"class\":\"' . get_class($exception) .\n            '\",\"message\":\"' . $exception->getMessage() .\n            '\",\"code\":' . $exception->getCode() .\n            ',\"file\":\"' . $this->formatExceptionFilePathWithLine($exception) .\n            ($previous ? '\",\"previous\":' . $previous : '\"') .\n            '}';\n        return $formattedException;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\n/**\n * @covers Monolog\\Formatter\\LineFormatter\n */\nclass LineFormatterTest extends \\PHPUnit_Framework_TestCase\n{\n    public function testDefFormatWithString()\n    {\n        $formatter = new LineFormatter(null, 'Y-m-d');\n        $message = $formatter->format(array(\n            'level_name' => 'WARNING',\n            'channel' => 'log',\n            'context' => array(),\n            'message' => 'foo',\n            'datetime' => new \\DateTime,\n            'extra' => array(),\n        ));\n        $this->assertEquals('['.date('Y-m-d').'] log.WARNING: foo [] []'.\"\\n\", $message);\n    }\n\n    public function testDefFormatWithArrayContext()\n    {\n        $formatter = new LineFormatter(null, 'Y-m-d');\n        $message = $formatter->format(array(\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'message' => 'foo',\n            'datetime' => new \\DateTime,\n            'extra' => array(),\n            'context' => array(\n                'foo' => 'bar',\n                'baz' => 'qux',\n                'bool' => false,\n                'null' => null,\n            ),\n        ));\n        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foo {\"foo\":\"bar\",\"baz\":\"qux\",\"bool\":false,\"null\":null} []'.\"\\n\", $message);\n    }\n\n    public function testDefFormatExtras()\n    {\n        $formatter = new LineFormatter(null, 'Y-m-d');\n        $message = $formatter->format(array(\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array(),\n            'datetime' => new \\DateTime,\n            'extra' => array('ip' => '127.0.0.1'),\n            'message' => 'log',\n        ));\n        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] {\"ip\":\"127.0.0.1\"}'.\"\\n\", $message);\n    }\n\n    public function testFormatExtras()\n    {\n        $formatter = new LineFormatter(\"[%datetime%] %channel%.%level_name%: %message% %context% %extra.file% %extra%\\n\", 'Y-m-d');\n        $message = $formatter->format(array(\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array(),\n            'datetime' => new \\DateTime,\n            'extra' => array('ip' => '127.0.0.1', 'file' => 'test'),\n            'message' => 'log',\n        ));\n        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] test {\"ip\":\"127.0.0.1\"}'.\"\\n\", $message);\n    }\n\n    public function testContextAndExtraOptionallyNotShownIfEmpty()\n    {\n        $formatter = new LineFormatter(null, 'Y-m-d', false, true);\n        $message = $formatter->format(array(\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array(),\n            'datetime' => new \\DateTime,\n            'extra' => array(),\n            'message' => 'log',\n        ));\n        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log  '.\"\\n\", $message);\n    }\n\n    public function testContextAndExtraReplacement()\n    {\n        $formatter = new LineFormatter('%context.foo% => %extra.foo%');\n        $message = $formatter->format(array(\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('foo' => 'bar'),\n            'datetime' => new \\DateTime,\n            'extra' => array('foo' => 'xbar'),\n            'message' => 'log',\n        ));\n        $this->assertEquals('bar => xbar', $message);\n    }\n\n    public function testDefFormatWithObject()\n    {\n        $formatter = new LineFormatter(null, 'Y-m-d');\n        $message = $formatter->format(array(\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array(),\n            'datetime' => new \\DateTime,\n            'extra' => array('foo' => new TestFoo, 'bar' => new TestBar, 'baz' => array(), 'res' => fopen('php://memory', 'rb')),\n            'message' => 'foobar',\n        ));\n\n        $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);\n    }\n\n    public function testDefFormatWithException()\n    {\n        $formatter = new LineFormatter(null, 'Y-m-d');\n        $message = $formatter->format(array(\n            'level_name' => 'CRITICAL',\n            'channel' => 'core',\n            'context' => array('exception' => new \\RuntimeException('Foo')),\n            'datetime' => new \\DateTime,\n            'extra' => array(),\n            'message' => 'foobar',\n        ));\n\n        $path = str_replace('\\\\/', '/', json_encode(__FILE__));\n\n        $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {\"exception\":\"[object] (RuntimeException(code: 0): Foo at '.substr($path, 1, -1).':'.(__LINE__ - 8).')\"} []'.\"\\n\", $message);\n    }\n\n    public function testDefFormatWithPreviousException()\n    {\n        $formatter = new LineFormatter(null, 'Y-m-d');\n        $previous = new \\LogicException('Wut?');\n        $message = $formatter->format(array(\n            'level_name' => 'CRITICAL',\n            'channel' => 'core',\n            'context' => array('exception' => new \\RuntimeException('Foo', 0, $previous)),\n            'datetime' => new \\DateTime,\n            'extra' => array(),\n            'message' => 'foobar',\n        ));\n\n        $path = str_replace('\\\\/', '/', json_encode(__FILE__));\n\n        $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);\n    }\n\n    public function testBatchFormat()\n    {\n        $formatter = new LineFormatter(null, 'Y-m-d');\n        $message = $formatter->formatBatch(array(\n            array(\n                'level_name' => 'CRITICAL',\n                'channel' => 'test',\n                'message' => 'bar',\n                'context' => array(),\n                'datetime' => new \\DateTime,\n                'extra' => array(),\n            ),\n            array(\n                'level_name' => 'WARNING',\n                'channel' => 'log',\n                'message' => 'foo',\n                'context' => array(),\n                'datetime' => new \\DateTime,\n                'extra' => array(),\n            ),\n        ));\n        $this->assertEquals('['.date('Y-m-d').'] test.CRITICAL: bar [] []'.\"\\n\".'['.date('Y-m-d').'] log.WARNING: foo [] []'.\"\\n\", $message);\n    }\n\n    public function testFormatShouldStripInlineLineBreaks()\n    {\n        $formatter = new LineFormatter(null, 'Y-m-d');\n        $message = $formatter->format(\n            array(\n                'message' => \"foo\\nbar\",\n                'context' => array(),\n                'extra' => array(),\n            )\n        );\n\n        $this->assertRegExp('/foo bar/', $message);\n    }\n\n    public function testFormatShouldNotStripInlineLineBreaksWhenFlagIsSet()\n    {\n        $formatter = new LineFormatter(null, 'Y-m-d', true);\n        $message = $formatter->format(\n            array(\n                'message' => \"foo\\nbar\",\n                'context' => array(),\n                'extra' => array(),\n            )\n        );\n\n        $this->assertRegExp('/foo\\nbar/', $message);\n    }\n}\n\nclass TestFoo\n{\n    public $foo = 'foo';\n}\n\nclass TestBar\n{\n    public function __toString()\n    {\n        return 'bar';\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/LogglyFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\TestCase;\n\nclass LogglyFormatterTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Formatter\\LogglyFormatter::__construct\n     */\n    public function testConstruct()\n    {\n        $formatter = new LogglyFormatter();\n        $this->assertEquals(LogglyFormatter::BATCH_MODE_NEWLINES, $formatter->getBatchMode());\n        $formatter = new LogglyFormatter(LogglyFormatter::BATCH_MODE_JSON);\n        $this->assertEquals(LogglyFormatter::BATCH_MODE_JSON, $formatter->getBatchMode());\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\LogglyFormatter::format\n     */\n    public function testFormat()\n    {\n        $formatter = new LogglyFormatter();\n        $record = $this->getRecord();\n        $formatted_decoded = json_decode($formatter->format($record), true);\n        $this->assertArrayHasKey(\"timestamp\", $formatted_decoded);\n        $this->assertEquals(new \\DateTime($formatted_decoded[\"timestamp\"]), $record[\"datetime\"]);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\n\nclass LogstashFormatterTest extends \\PHPUnit_Framework_TestCase\n{\n    public function tearDown()\n    {\n        \\PHPUnit_Framework_Error_Warning::$enabled = true;\n\n        return parent::tearDown();\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\LogstashFormatter::format\n     */\n    public function testDefaultFormatter()\n    {\n        $formatter = new LogstashFormatter('test', 'hostname');\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array(),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(),\n            'message' => 'log',\n        );\n\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertEquals(\"1970-01-01T00:00:00.000000+00:00\", $message['@timestamp']);\n        $this->assertEquals('log', $message['@message']);\n        $this->assertEquals('meh', $message['@fields']['channel']);\n        $this->assertContains('meh', $message['@tags']);\n        $this->assertEquals(Logger::ERROR, $message['@fields']['level']);\n        $this->assertEquals('test', $message['@type']);\n        $this->assertEquals('hostname', $message['@source']);\n\n        $formatter = new LogstashFormatter('mysystem');\n\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertEquals('mysystem', $message['@type']);\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\LogstashFormatter::format\n     */\n    public function testFormatWithFileAndLine()\n    {\n        $formatter = new LogstashFormatter('test');\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('file' => 'test', 'line' => 14),\n            'message' => 'log',\n        );\n\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertEquals('test', $message['@fields']['file']);\n        $this->assertEquals(14, $message['@fields']['line']);\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\LogstashFormatter::format\n     */\n    public function testFormatWithContext()\n    {\n        $formatter = new LogstashFormatter('test');\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('key' => 'pair'),\n            'message' => 'log',\n        );\n\n        $message = json_decode($formatter->format($record), true);\n\n        $message_array = $message['@fields'];\n\n        $this->assertArrayHasKey('ctxt_from', $message_array);\n        $this->assertEquals('logger', $message_array['ctxt_from']);\n\n        // Test with extraPrefix\n        $formatter = new LogstashFormatter('test', null, null, 'CTX');\n        $message = json_decode($formatter->format($record), true);\n\n        $message_array = $message['@fields'];\n\n        $this->assertArrayHasKey('CTXfrom', $message_array);\n        $this->assertEquals('logger', $message_array['CTXfrom']);\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\LogstashFormatter::format\n     */\n    public function testFormatWithExtra()\n    {\n        $formatter = new LogstashFormatter('test');\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('key' => 'pair'),\n            'message' => 'log',\n        );\n\n        $message = json_decode($formatter->format($record), true);\n\n        $message_array = $message['@fields'];\n\n        $this->assertArrayHasKey('key', $message_array);\n        $this->assertEquals('pair', $message_array['key']);\n\n        // Test with extraPrefix\n        $formatter = new LogstashFormatter('test', null, 'EXT');\n        $message = json_decode($formatter->format($record), true);\n\n        $message_array = $message['@fields'];\n\n        $this->assertArrayHasKey('EXTkey', $message_array);\n        $this->assertEquals('pair', $message_array['EXTkey']);\n    }\n\n    public function testFormatWithApplicationName()\n    {\n        $formatter = new LogstashFormatter('app', 'test');\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('key' => 'pair'),\n            'message' => 'log',\n        );\n\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertArrayHasKey('@type', $message);\n        $this->assertEquals('app', $message['@type']);\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\LogstashFormatter::format\n     */\n    public function testDefaultFormatterV1()\n    {\n        $formatter = new LogstashFormatter('test', 'hostname', null, 'ctxt_', LogstashFormatter::V1);\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array(),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(),\n            'message' => 'log',\n        );\n\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertEquals(\"1970-01-01T00:00:00.000000+00:00\", $message['@timestamp']);\n        $this->assertEquals(\"1\", $message['@version']);\n        $this->assertEquals('log', $message['message']);\n        $this->assertEquals('meh', $message['channel']);\n        $this->assertEquals('ERROR', $message['level']);\n        $this->assertEquals('test', $message['type']);\n        $this->assertEquals('hostname', $message['host']);\n\n        $formatter = new LogstashFormatter('mysystem', null, null, 'ctxt_', LogstashFormatter::V1);\n\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertEquals('mysystem', $message['type']);\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\LogstashFormatter::format\n     */\n    public function testFormatWithFileAndLineV1()\n    {\n        $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1);\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('file' => 'test', 'line' => 14),\n            'message' => 'log',\n        );\n\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertEquals('test', $message['file']);\n        $this->assertEquals(14, $message['line']);\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\LogstashFormatter::format\n     */\n    public function testFormatWithContextV1()\n    {\n        $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1);\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('key' => 'pair'),\n            'message' => 'log',\n        );\n\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertArrayHasKey('ctxt_from', $message);\n        $this->assertEquals('logger', $message['ctxt_from']);\n\n        // Test with extraPrefix\n        $formatter = new LogstashFormatter('test', null, null, 'CTX', LogstashFormatter::V1);\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertArrayHasKey('CTXfrom', $message);\n        $this->assertEquals('logger', $message['CTXfrom']);\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\LogstashFormatter::format\n     */\n    public function testFormatWithExtraV1()\n    {\n        $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1);\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('key' => 'pair'),\n            'message' => 'log',\n        );\n\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertArrayHasKey('key', $message);\n        $this->assertEquals('pair', $message['key']);\n\n        // Test with extraPrefix\n        $formatter = new LogstashFormatter('test', null, 'EXT', 'ctxt_', LogstashFormatter::V1);\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertArrayHasKey('EXTkey', $message);\n        $this->assertEquals('pair', $message['EXTkey']);\n    }\n\n    public function testFormatWithApplicationNameV1()\n    {\n        $formatter = new LogstashFormatter('app', 'test', null, 'ctxt_', LogstashFormatter::V1);\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('key' => 'pair'),\n            'message' => 'log',\n        );\n\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertArrayHasKey('type', $message);\n        $this->assertEquals('app', $message['type']);\n    }\n\n    public function testFormatWithLatin9Data()\n    {\n        if (version_compare(PHP_VERSION, '5.5.0', '<')) {\n            // Ignore the warning that will be emitted by PHP <5.5.0\n            \\PHPUnit_Framework_Error_Warning::$enabled = false;\n        }\n        $formatter = new LogstashFormatter('test', 'hostname');\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => '¯\\_(ツ)_/¯',\n            'context' => array(),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(\n                'user_agent' => \"\\xD6WN; FBCR/OrangeEspa\\xF1a; Vers\\xE3o/4.0; F\\xE4rist\",\n            ),\n            'message' => 'log',\n        );\n\n        $message = json_decode($formatter->format($record), true);\n\n        $this->assertEquals(\"1970-01-01T00:00:00.000000+00:00\", $message['@timestamp']);\n        $this->assertEquals('log', $message['@message']);\n        $this->assertEquals('¯\\_(ツ)_/¯', $message['@fields']['channel']);\n        $this->assertContains('¯\\_(ツ)_/¯', $message['@tags']);\n        $this->assertEquals(Logger::ERROR, $message['@fields']['level']);\n        $this->assertEquals('test', $message['@type']);\n        $this->assertEquals('hostname', $message['@source']);\n        if (version_compare(PHP_VERSION, '5.5.0', '>=')) {\n            $this->assertEquals('ÖWN; FBCR/OrangeEspaña; Versão/4.0; Färist', $message['@fields']['user_agent']);\n        } else {\n            // PHP <5.5 does not return false for an element encoding failure,\n            // instead it emits a warning (possibly) and nulls the value.\n            $this->assertEquals(null, $message['@fields']['user_agent']);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/MongoDBFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\n\n/**\n * @author Florian Plattner <me@florianplattner.de>\n */\nclass MongoDBFormatterTest extends \\PHPUnit_Framework_TestCase\n{\n    public function setUp()\n    {\n        if (!class_exists('MongoDate')) {\n            $this->markTestSkipped('mongo extension not installed');\n        }\n    }\n\n    public function constructArgumentProvider()\n    {\n        return array(\n            array(1, true, 1, true),\n            array(0, false, 0, false),\n        );\n    }\n\n    /**\n     * @param $traceDepth\n     * @param $traceAsString\n     * @param $expectedTraceDepth\n     * @param $expectedTraceAsString\n     *\n     * @dataProvider constructArgumentProvider\n     */\n    public function testConstruct($traceDepth, $traceAsString, $expectedTraceDepth, $expectedTraceAsString)\n    {\n        $formatter = new MongoDBFormatter($traceDepth, $traceAsString);\n\n        $reflTrace = new \\ReflectionProperty($formatter, 'exceptionTraceAsString');\n        $reflTrace->setAccessible(true);\n        $this->assertEquals($expectedTraceAsString, $reflTrace->getValue($formatter));\n\n        $reflDepth = new\\ReflectionProperty($formatter, 'maxNestingLevel');\n        $reflDepth->setAccessible(true);\n        $this->assertEquals($expectedTraceDepth, $reflDepth->getValue($formatter));\n    }\n\n    public function testSimpleFormat()\n    {\n        $record = array(\n            'message' => 'some log message',\n            'context' => array(),\n            'level' => Logger::WARNING,\n            'level_name' => Logger::getLevelName(Logger::WARNING),\n            'channel' => 'test',\n            'datetime' => new \\DateTime('2014-02-01 00:00:00'),\n            'extra' => array(),\n        );\n\n        $formatter = new MongoDBFormatter();\n        $formattedRecord = $formatter->format($record);\n\n        $this->assertCount(7, $formattedRecord);\n        $this->assertEquals('some log message', $formattedRecord['message']);\n        $this->assertEquals(array(), $formattedRecord['context']);\n        $this->assertEquals(Logger::WARNING, $formattedRecord['level']);\n        $this->assertEquals(Logger::getLevelName(Logger::WARNING), $formattedRecord['level_name']);\n        $this->assertEquals('test', $formattedRecord['channel']);\n        $this->assertInstanceOf('\\MongoDate', $formattedRecord['datetime']);\n        $this->assertEquals('0.00000000 1391212800', $formattedRecord['datetime']->__toString());\n        $this->assertEquals(array(), $formattedRecord['extra']);\n    }\n\n    public function testRecursiveFormat()\n    {\n        $someObject = new \\stdClass();\n        $someObject->foo = 'something';\n        $someObject->bar = 'stuff';\n\n        $record = array(\n            'message' => 'some log message',\n            'context' => array(\n                'stuff' => new \\DateTime('2014-02-01 02:31:33'),\n                'some_object' => $someObject,\n                'context_string' => 'some string',\n                'context_int' => 123456,\n                'except' => new \\Exception('exception message', 987),\n            ),\n            'level' => Logger::WARNING,\n            'level_name' => Logger::getLevelName(Logger::WARNING),\n            'channel' => 'test',\n            'datetime' => new \\DateTime('2014-02-01 00:00:00'),\n            'extra' => array(),\n        );\n\n        $formatter = new MongoDBFormatter();\n        $formattedRecord = $formatter->format($record);\n\n        $this->assertCount(5, $formattedRecord['context']);\n        $this->assertInstanceOf('\\MongoDate', $formattedRecord['context']['stuff']);\n        $this->assertEquals('0.00000000 1391221893', $formattedRecord['context']['stuff']->__toString());\n        $this->assertEquals(\n            array(\n                'foo' => 'something',\n                'bar' => 'stuff',\n                'class' => 'stdClass',\n            ),\n            $formattedRecord['context']['some_object']\n        );\n        $this->assertEquals('some string', $formattedRecord['context']['context_string']);\n        $this->assertEquals(123456, $formattedRecord['context']['context_int']);\n\n        $this->assertCount(5, $formattedRecord['context']['except']);\n        $this->assertEquals('exception message', $formattedRecord['context']['except']['message']);\n        $this->assertEquals(987, $formattedRecord['context']['except']['code']);\n        $this->assertInternalType('string', $formattedRecord['context']['except']['file']);\n        $this->assertInternalType('integer', $formattedRecord['context']['except']['code']);\n        $this->assertInternalType('string', $formattedRecord['context']['except']['trace']);\n        $this->assertEquals('Exception', $formattedRecord['context']['except']['class']);\n    }\n\n    public function testFormatDepthArray()\n    {\n        $record = array(\n            'message' => 'some log message',\n            'context' => array(\n                'nest2' => array(\n                    'property' => 'anything',\n                    'nest3' => array(\n                        'nest4' => 'value',\n                        'property' => 'nothing',\n                    ),\n                ),\n            ),\n            'level' => Logger::WARNING,\n            'level_name' => Logger::getLevelName(Logger::WARNING),\n            'channel' => 'test',\n            'datetime' => new \\DateTime('2014-02-01 00:00:00'),\n            'extra' => array(),\n        );\n\n        $formatter = new MongoDBFormatter(2);\n        $formattedResult = $formatter->format($record);\n\n        $this->assertEquals(\n            array(\n                'nest2' => array(\n                    'property' => 'anything',\n                    'nest3' => '[...]',\n                ),\n            ),\n            $formattedResult['context']\n        );\n    }\n\n    public function testFormatDepthArrayInfiniteNesting()\n    {\n        $record = array(\n            'message' => 'some log message',\n            'context' => array(\n                'nest2' => array(\n                    'property' => 'something',\n                    'nest3' => array(\n                        'property' => 'anything',\n                        'nest4' => array(\n                            'property' => 'nothing',\n                        ),\n                    ),\n                ),\n            ),\n            'level' => Logger::WARNING,\n            'level_name' => Logger::getLevelName(Logger::WARNING),\n            'channel' => 'test',\n            'datetime' => new \\DateTime('2014-02-01 00:00:00'),\n            'extra' => array(),\n        );\n\n        $formatter = new MongoDBFormatter(0);\n        $formattedResult = $formatter->format($record);\n\n        $this->assertEquals(\n            array(\n                'nest2' => array(\n                    'property' => 'something',\n                    'nest3' => array(\n                        'property' => 'anything',\n                        'nest4' => array(\n                            'property' => 'nothing',\n                        ),\n                    ),\n                ),\n            ),\n            $formattedResult['context']\n        );\n    }\n\n    public function testFormatDepthObjects()\n    {\n        $someObject = new \\stdClass();\n        $someObject->property = 'anything';\n        $someObject->nest3 = new \\stdClass();\n        $someObject->nest3->property = 'nothing';\n        $someObject->nest3->nest4 = 'invisible';\n\n        $record = array(\n            'message' => 'some log message',\n            'context' => array(\n                'nest2' => $someObject,\n            ),\n            'level' => Logger::WARNING,\n            'level_name' => Logger::getLevelName(Logger::WARNING),\n            'channel' => 'test',\n            'datetime' => new \\DateTime('2014-02-01 00:00:00'),\n            'extra' => array(),\n        );\n\n        $formatter = new MongoDBFormatter(2, true);\n        $formattedResult = $formatter->format($record);\n\n        $this->assertEquals(\n            array(\n                'nest2' => array(\n                    'property' => 'anything',\n                    'nest3' => '[...]',\n                    'class' => 'stdClass',\n                ),\n            ),\n            $formattedResult['context']\n        );\n    }\n\n    public function testFormatDepthException()\n    {\n        $record = array(\n            'message' => 'some log message',\n            'context' => array(\n                'nest2' => new \\Exception('exception message', 987),\n            ),\n            'level' => Logger::WARNING,\n            'level_name' => Logger::getLevelName(Logger::WARNING),\n            'channel' => 'test',\n            'datetime' => new \\DateTime('2014-02-01 00:00:00'),\n            'extra' => array(),\n        );\n\n        $formatter = new MongoDBFormatter(2, false);\n        $formattedRecord = $formatter->format($record);\n\n        $this->assertEquals('exception message', $formattedRecord['context']['nest2']['message']);\n        $this->assertEquals(987, $formattedRecord['context']['nest2']['code']);\n        $this->assertEquals('[...]', $formattedRecord['context']['nest2']['trace']);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\n/**\n * @covers Monolog\\Formatter\\NormalizerFormatter\n */\nclass NormalizerFormatterTest extends \\PHPUnit_Framework_TestCase\n{\n    public function tearDown()\n    {\n        \\PHPUnit_Framework_Error_Warning::$enabled = true;\n\n        return parent::tearDown();\n    }\n\n    public function testFormat()\n    {\n        $formatter = new NormalizerFormatter('Y-m-d');\n        $formatted = $formatter->format(array(\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'message' => 'foo',\n            'datetime' => new \\DateTime,\n            'extra' => array('foo' => new TestFooNorm, 'bar' => new TestBarNorm, 'baz' => array(), 'res' => fopen('php://memory', 'rb')),\n            'context' => array(\n                'foo' => 'bar',\n                'baz' => 'qux',\n                'inf' => INF,\n                '-inf' => -INF,\n                'nan' => acos(4),\n            ),\n        ));\n\n        $this->assertEquals(array(\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'message' => 'foo',\n            'datetime' => date('Y-m-d'),\n            'extra' => array(\n                'foo' => '[object] (Monolog\\\\Formatter\\\\TestFooNorm: {\"foo\":\"foo\"})',\n                'bar' => '[object] (Monolog\\\\Formatter\\\\TestBarNorm: bar)',\n                'baz' => array(),\n                'res' => '[resource] (stream)',\n            ),\n            'context' => array(\n                'foo' => 'bar',\n                'baz' => 'qux',\n                'inf' => 'INF',\n                '-inf' => '-INF',\n                'nan' => 'NaN',\n            ),\n        ), $formatted);\n    }\n\n    public function testFormatExceptions()\n    {\n        $formatter = new NormalizerFormatter('Y-m-d');\n        $e = new \\LogicException('bar');\n        $e2 = new \\RuntimeException('foo', 0, $e);\n        $formatted = $formatter->format(array(\n            'exception' => $e2,\n        ));\n\n        $this->assertGreaterThan(5, count($formatted['exception']['trace']));\n        $this->assertTrue(isset($formatted['exception']['previous']));\n        unset($formatted['exception']['trace'], $formatted['exception']['previous']);\n\n        $this->assertEquals(array(\n            'exception' => array(\n                'class'   => get_class($e2),\n                'message' => $e2->getMessage(),\n                'code'    => $e2->getCode(),\n                'file'    => $e2->getFile().':'.$e2->getLine(),\n            ),\n        ), $formatted);\n    }\n\n    public function testFormatSoapFaultException()\n    {\n        if (!class_exists('SoapFault')) {\n            $this->markTestSkipped('Requires the soap extension');\n        }\n\n        $formatter = new NormalizerFormatter('Y-m-d');\n        $e = new \\SoapFault('foo', 'bar', 'hello', 'world');\n        $formatted = $formatter->format(array(\n            'exception' => $e,\n        ));\n\n        unset($formatted['exception']['trace']);\n\n        $this->assertEquals(array(\n            'exception' => array(\n                'class' => 'SoapFault',\n                'message' => 'bar',\n                'code' => 0,\n                'file' => $e->getFile().':'.$e->getLine(),\n                'faultcode' => 'foo',\n                'faultactor' => 'hello',\n                'detail' => 'world',\n            ),\n        ), $formatted);\n    }\n\n    public function testFormatToStringExceptionHandle()\n    {\n        $formatter = new NormalizerFormatter('Y-m-d');\n        $this->setExpectedException('RuntimeException', 'Could not convert to string');\n        $formatter->format(array(\n            'myObject' => new TestToStringError(),\n        ));\n    }\n\n    public function testBatchFormat()\n    {\n        $formatter = new NormalizerFormatter('Y-m-d');\n        $formatted = $formatter->formatBatch(array(\n            array(\n                'level_name' => 'CRITICAL',\n                'channel' => 'test',\n                'message' => 'bar',\n                'context' => array(),\n                'datetime' => new \\DateTime,\n                'extra' => array(),\n            ),\n            array(\n                'level_name' => 'WARNING',\n                'channel' => 'log',\n                'message' => 'foo',\n                'context' => array(),\n                'datetime' => new \\DateTime,\n                'extra' => array(),\n            ),\n        ));\n        $this->assertEquals(array(\n            array(\n                'level_name' => 'CRITICAL',\n                'channel' => 'test',\n                'message' => 'bar',\n                'context' => array(),\n                'datetime' => date('Y-m-d'),\n                'extra' => array(),\n            ),\n            array(\n                'level_name' => 'WARNING',\n                'channel' => 'log',\n                'message' => 'foo',\n                'context' => array(),\n                'datetime' => date('Y-m-d'),\n                'extra' => array(),\n            ),\n        ), $formatted);\n    }\n\n    /**\n     * Test issue #137\n     */\n    public function testIgnoresRecursiveObjectReferences()\n    {\n        // set up the recursion\n        $foo = new \\stdClass();\n        $bar = new \\stdClass();\n\n        $foo->bar = $bar;\n        $bar->foo = $foo;\n\n        // set an error handler to assert that the error is not raised anymore\n        $that = $this;\n        set_error_handler(function ($level, $message, $file, $line, $context) use ($that) {\n            if (error_reporting() & $level) {\n                restore_error_handler();\n                $that->fail(\"$message should not be raised\");\n            }\n        });\n\n        $formatter = new NormalizerFormatter();\n        $reflMethod = new \\ReflectionMethod($formatter, 'toJson');\n        $reflMethod->setAccessible(true);\n        $res = $reflMethod->invoke($formatter, array($foo, $bar), true);\n\n        restore_error_handler();\n\n        $this->assertEquals(@json_encode(array($foo, $bar)), $res);\n    }\n\n    public function testIgnoresInvalidTypes()\n    {\n        // set up the recursion\n        $resource = fopen(__FILE__, 'r');\n\n        // set an error handler to assert that the error is not raised anymore\n        $that = $this;\n        set_error_handler(function ($level, $message, $file, $line, $context) use ($that) {\n            if (error_reporting() & $level) {\n                restore_error_handler();\n                $that->fail(\"$message should not be raised\");\n            }\n        });\n\n        $formatter = new NormalizerFormatter();\n        $reflMethod = new \\ReflectionMethod($formatter, 'toJson');\n        $reflMethod->setAccessible(true);\n        $res = $reflMethod->invoke($formatter, array($resource), true);\n\n        restore_error_handler();\n\n        $this->assertEquals(@json_encode(array($resource)), $res);\n    }\n\n    public function testNormalizeHandleLargeArrays()\n    {\n        $formatter = new NormalizerFormatter();\n        $largeArray = range(1, 2000);\n\n        $res = $formatter->format(array(\n            'level_name' => 'CRITICAL',\n            'channel' => 'test',\n            'message' => 'bar',\n            'context' => array($largeArray),\n            'datetime' => new \\DateTime,\n            'extra' => array(),\n        ));\n\n        $this->assertCount(1000, $res['context'][0]);\n        $this->assertEquals('Over 1000 items (2000 total), aborting normalization', $res['context'][0]['...']);\n    }\n\n    /**\n     * @expectedException RuntimeException\n     */\n    public function testThrowsOnInvalidEncoding()\n    {\n        if (version_compare(PHP_VERSION, '5.5.0', '<')) {\n            // Ignore the warning that will be emitted by PHP <5.5.0\n            \\PHPUnit_Framework_Error_Warning::$enabled = false;\n        }\n        $formatter = new NormalizerFormatter();\n        $reflMethod = new \\ReflectionMethod($formatter, 'toJson');\n        $reflMethod->setAccessible(true);\n\n        // send an invalid unicode sequence as a object that can't be cleaned\n        $record = new \\stdClass;\n        $record->message = \"\\xB1\\x31\";\n        $res = $reflMethod->invoke($formatter, $record);\n        if (PHP_VERSION_ID < 50500 && $res === '{\"message\":null}') {\n            throw new \\RuntimeException('PHP 5.3/5.4 throw a warning and null the value instead of returning false entirely');\n        }\n    }\n\n    public function testConvertsInvalidEncodingAsLatin9()\n    {\n        if (version_compare(PHP_VERSION, '5.5.0', '<')) {\n            // Ignore the warning that will be emitted by PHP <5.5.0\n            \\PHPUnit_Framework_Error_Warning::$enabled = false;\n        }\n        $formatter = new NormalizerFormatter();\n        $reflMethod = new \\ReflectionMethod($formatter, 'toJson');\n        $reflMethod->setAccessible(true);\n\n        $res = $reflMethod->invoke($formatter, array('message' => \"\\xA4\\xA6\\xA8\\xB4\\xB8\\xBC\\xBD\\xBE\"));\n\n        if (version_compare(PHP_VERSION, '5.5.0', '>=')) {\n            $this->assertSame('{\"message\":\"€ŠšŽžŒœŸ\"}', $res);\n        } else {\n            // PHP <5.5 does not return false for an element encoding failure,\n            // instead it emits a warning (possibly) and nulls the value.\n            $this->assertSame('{\"message\":null}', $res);\n        }\n    }\n\n    /**\n     * @param mixed $in     Input\n     * @param mixed $expect Expected output\n     * @covers Monolog\\Formatter\\NormalizerFormatter::detectAndCleanUtf8\n     * @dataProvider providesDetectAndCleanUtf8\n     */\n    public function testDetectAndCleanUtf8($in, $expect)\n    {\n        $formatter = new NormalizerFormatter();\n        $formatter->detectAndCleanUtf8($in);\n        $this->assertSame($expect, $in);\n    }\n\n    public function providesDetectAndCleanUtf8()\n    {\n        $obj = new \\stdClass;\n\n        return array(\n            'null' => array(null, null),\n            'int' => array(123, 123),\n            'float' => array(123.45, 123.45),\n            'bool false' => array(false, false),\n            'bool true' => array(true, true),\n            'ascii string' => array('abcdef', 'abcdef'),\n            'latin9 string' => array(\"\\xB1\\x31\\xA4\\xA6\\xA8\\xB4\\xB8\\xBC\\xBD\\xBE\\xFF\", '±1€ŠšŽžŒœŸÿ'),\n            'unicode string' => array('¤¦¨´¸¼½¾€ŠšŽžŒœŸ', '¤¦¨´¸¼½¾€ŠšŽžŒœŸ'),\n            'empty array' => array(array(), array()),\n            'array' => array(array('abcdef'), array('abcdef')),\n            'object' => array($obj, $obj),\n        );\n    }\n\n    /**\n     * @param int    $code\n     * @param string $msg\n     * @dataProvider providesHandleJsonErrorFailure\n     */\n    public function testHandleJsonErrorFailure($code, $msg)\n    {\n        $formatter = new NormalizerFormatter();\n        $reflMethod = new \\ReflectionMethod($formatter, 'handleJsonError');\n        $reflMethod->setAccessible(true);\n\n        $this->setExpectedException('RuntimeException', $msg);\n        $reflMethod->invoke($formatter, $code, 'faked');\n    }\n\n    public function providesHandleJsonErrorFailure()\n    {\n        return array(\n            'depth' => array(JSON_ERROR_DEPTH, 'Maximum stack depth exceeded'),\n            'state' => array(JSON_ERROR_STATE_MISMATCH, 'Underflow or the modes mismatch'),\n            'ctrl' => array(JSON_ERROR_CTRL_CHAR, 'Unexpected control character found'),\n            'default' => array(-1, 'Unknown error'),\n        );\n    }\n\n    public function testExceptionTraceWithArgs()\n    {\n        if (defined('HHVM_VERSION')) {\n            $this->markTestSkipped('Not supported in HHVM since it detects errors differently');\n        }\n\n        // This happens i.e. in React promises or Guzzle streams where stream wrappers are registered\n        // and no file or line are included in the trace because it's treated as internal function\n        set_error_handler(function ($errno, $errstr, $errfile, $errline) {\n            throw new \\ErrorException($errstr, 0, $errno, $errfile, $errline);\n        });\n\n        try {\n            // This will contain $resource and $wrappedResource as arguments in the trace item\n            $resource = fopen('php://memory', 'rw+');\n            fwrite($resource, 'test_resource');\n            $wrappedResource = new TestFooNorm;\n            $wrappedResource->foo = $resource;\n            // Just do something stupid with a resource/wrapped resource as argument\n            array_keys($wrappedResource);\n        } catch (\\Exception $e) {\n            restore_error_handler();\n        }\n\n        $formatter = new NormalizerFormatter();\n        $record = array('context' => array('exception' => $e));\n        $result = $formatter->format($record);\n\n        $this->assertRegExp(\n            '%\"resource\":\"\\[resource\\] \\(stream\\)\"%',\n            $result['context']['exception']['trace'][0]\n        );\n\n        if (version_compare(PHP_VERSION, '5.5.0', '>=')) {\n            $pattern = '%\"wrappedResource\":\"\\[object\\] \\(Monolog\\\\\\\\\\\\\\\\Formatter\\\\\\\\\\\\\\\\TestFooNorm: \\)\"%';\n        } else {\n            $pattern = '%\\\\\\\\\"foo\\\\\\\\\":null%';\n        }\n\n        // Tests that the wrapped resource is ignored while encoding, only works for PHP <= 5.4\n        $this->assertRegExp(\n            $pattern,\n            $result['context']['exception']['trace'][0]\n        );\n    }\n}\n\nclass TestFooNorm\n{\n    public $foo = 'foo';\n}\n\nclass TestBarNorm\n{\n    public function __toString()\n    {\n        return 'bar';\n    }\n}\n\nclass TestStreamFoo\n{\n    public $foo;\n    public $resource;\n\n    public function __construct($resource)\n    {\n        $this->resource = $resource;\n        $this->foo = 'BAR';\n    }\n\n    public function __toString()\n    {\n        fseek($this->resource, 0);\n\n        return $this->foo . ' - ' . (string) stream_get_contents($this->resource);\n    }\n}\n\nclass TestToStringError\n{\n    public function __toString()\n    {\n        throw new \\RuntimeException('Could not convert to string');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nclass ScalarFormatterTest extends \\PHPUnit_Framework_TestCase\n{\n    private $formatter;\n\n    public function setUp()\n    {\n        $this->formatter = new ScalarFormatter();\n    }\n\n    public function buildTrace(\\Exception $e)\n    {\n        $data = array();\n        $trace = $e->getTrace();\n        foreach ($trace as $frame) {\n            if (isset($frame['file'])) {\n                $data[] = $frame['file'].':'.$frame['line'];\n            } else {\n                $data[] = json_encode($frame);\n            }\n        }\n\n        return $data;\n    }\n\n    public function encodeJson($data)\n    {\n        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {\n            return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);\n        }\n\n        return json_encode($data);\n    }\n\n    public function testFormat()\n    {\n        $exception = new \\Exception('foo');\n        $formatted = $this->formatter->format(array(\n            'foo' => 'string',\n            'bar' => 1,\n            'baz' => false,\n            'bam' => array(1, 2, 3),\n            'bat' => array('foo' => 'bar'),\n            'bap' => \\DateTime::createFromFormat(\\DateTime::ISO8601, '1970-01-01T00:00:00+0000'),\n            'ban' => $exception,\n        ));\n\n        $this->assertSame(array(\n            'foo' => 'string',\n            'bar' => 1,\n            'baz' => false,\n            'bam' => $this->encodeJson(array(1, 2, 3)),\n            'bat' => $this->encodeJson(array('foo' => 'bar')),\n            'bap' => '1970-01-01 00:00:00',\n            'ban' => $this->encodeJson(array(\n                'class'   => get_class($exception),\n                'message' => $exception->getMessage(),\n                'code'    => $exception->getCode(),\n                'file'    => $exception->getFile() . ':' . $exception->getLine(),\n                'trace'   => $this->buildTrace($exception),\n            )),\n        ), $formatted);\n    }\n\n    public function testFormatWithErrorContext()\n    {\n        $context = array('file' => 'foo', 'line' => 1);\n        $formatted = $this->formatter->format(array(\n            'context' => $context,\n        ));\n\n        $this->assertSame(array(\n            'context' => $this->encodeJson($context),\n        ), $formatted);\n    }\n\n    public function testFormatWithExceptionContext()\n    {\n        $exception = new \\Exception('foo');\n        $formatted = $this->formatter->format(array(\n            'context' => array(\n                'exception' => $exception,\n            ),\n        ));\n\n        $this->assertSame(array(\n            'context' => $this->encodeJson(array(\n                'exception' => array(\n                    'class'   => get_class($exception),\n                    'message' => $exception->getMessage(),\n                    'code'    => $exception->getCode(),\n                    'file'    => $exception->getFile() . ':' . $exception->getLine(),\n                    'trace'   => $this->buildTrace($exception),\n                ),\n            )),\n        ), $formatted);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Formatter;\n\nuse Monolog\\Logger;\n\nclass WildfireFormatterTest extends \\PHPUnit_Framework_TestCase\n{\n    /**\n     * @covers Monolog\\Formatter\\WildfireFormatter::format\n     */\n    public function testDefaultFormat()\n    {\n        $wildfire = new WildfireFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('ip' => '127.0.0.1'),\n            'message' => 'log',\n        );\n\n        $message = $wildfire->format($record);\n\n        $this->assertEquals(\n            '125|[{\"Type\":\"ERROR\",\"File\":\"\",\"Line\":\"\",\"Label\":\"meh\"},'\n                .'{\"message\":\"log\",\"context\":{\"from\":\"logger\"},\"extra\":{\"ip\":\"127.0.0.1\"}}]|',\n            $message\n        );\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\WildfireFormatter::format\n     */\n    public function testFormatWithFileAndLine()\n    {\n        $wildfire = new WildfireFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('from' => 'logger'),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14),\n            'message' => 'log',\n        );\n\n        $message = $wildfire->format($record);\n\n        $this->assertEquals(\n            '129|[{\"Type\":\"ERROR\",\"File\":\"test\",\"Line\":14,\"Label\":\"meh\"},'\n                .'{\"message\":\"log\",\"context\":{\"from\":\"logger\"},\"extra\":{\"ip\":\"127.0.0.1\"}}]|',\n            $message\n        );\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\WildfireFormatter::format\n     */\n    public function testFormatWithoutContext()\n    {\n        $wildfire = new WildfireFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array(),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(),\n            'message' => 'log',\n        );\n\n        $message = $wildfire->format($record);\n\n        $this->assertEquals(\n            '58|[{\"Type\":\"ERROR\",\"File\":\"\",\"Line\":\"\",\"Label\":\"meh\"},\"log\"]|',\n            $message\n        );\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\WildfireFormatter::formatBatch\n     * @expectedException BadMethodCallException\n     */\n    public function testBatchFormatThrowException()\n    {\n        $wildfire = new WildfireFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array(),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(),\n            'message' => 'log',\n        );\n\n        $wildfire->formatBatch(array($record));\n    }\n\n    /**\n     * @covers Monolog\\Formatter\\WildfireFormatter::format\n     */\n    public function testTableFormat()\n    {\n        $wildfire = new WildfireFormatter();\n        $record = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'table-channel',\n            'context' => array(\n            WildfireFormatter::TABLE => array(\n                    array('col1', 'col2', 'col3'),\n                    array('val1', 'val2', 'val3'),\n                    array('foo1', 'foo2', 'foo3'),\n                    array('bar1', 'bar2', 'bar3'),\n                ),\n            ),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(),\n            'message' => 'table-message',\n        );\n\n        $message = $wildfire->format($record);\n\n        $this->assertEquals(\n            '171|[{\"Type\":\"TABLE\",\"File\":\"\",\"Line\":\"\",\"Label\":\"table-channel: table-message\"},[[\"col1\",\"col2\",\"col3\"],[\"val1\",\"val2\",\"val3\"],[\"foo1\",\"foo2\",\"foo3\"],[\"bar1\",\"bar2\",\"bar3\"]]]|',\n            $message\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Processor\\WebProcessor;\n\nclass AbstractHandlerTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Handler\\AbstractHandler::__construct\n     * @covers Monolog\\Handler\\AbstractHandler::getLevel\n     * @covers Monolog\\Handler\\AbstractHandler::setLevel\n     * @covers Monolog\\Handler\\AbstractHandler::getBubble\n     * @covers Monolog\\Handler\\AbstractHandler::setBubble\n     * @covers Monolog\\Handler\\AbstractHandler::getFormatter\n     * @covers Monolog\\Handler\\AbstractHandler::setFormatter\n     */\n    public function testConstructAndGetSet()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractHandler', array(Logger::WARNING, false));\n        $this->assertEquals(Logger::WARNING, $handler->getLevel());\n        $this->assertEquals(false, $handler->getBubble());\n\n        $handler->setLevel(Logger::ERROR);\n        $handler->setBubble(true);\n        $handler->setFormatter($formatter = new LineFormatter);\n        $this->assertEquals(Logger::ERROR, $handler->getLevel());\n        $this->assertEquals(true, $handler->getBubble());\n        $this->assertSame($formatter, $handler->getFormatter());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\AbstractHandler::handleBatch\n     */\n    public function testHandleBatch()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractHandler');\n        $handler->expects($this->exactly(2))\n            ->method('handle');\n        $handler->handleBatch(array($this->getRecord(), $this->getRecord()));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\AbstractHandler::isHandling\n     */\n    public function testIsHandling()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractHandler', array(Logger::WARNING, false));\n        $this->assertTrue($handler->isHandling($this->getRecord()));\n        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\AbstractHandler::__construct\n     */\n    public function testHandlesPsrStyleLevels()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractHandler', array('warning', false));\n        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));\n        $handler->setLevel('debug');\n        $this->assertTrue($handler->isHandling($this->getRecord(Logger::DEBUG)));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\AbstractHandler::getFormatter\n     * @covers Monolog\\Handler\\AbstractHandler::getDefaultFormatter\n     */\n    public function testGetFormatterInitializesDefault()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractHandler');\n        $this->assertInstanceOf('Monolog\\Formatter\\LineFormatter', $handler->getFormatter());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\AbstractHandler::pushProcessor\n     * @covers Monolog\\Handler\\AbstractHandler::popProcessor\n     * @expectedException LogicException\n     */\n    public function testPushPopProcessor()\n    {\n        $logger = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractHandler');\n        $processor1 = new WebProcessor;\n        $processor2 = new WebProcessor;\n\n        $logger->pushProcessor($processor1);\n        $logger->pushProcessor($processor2);\n\n        $this->assertEquals($processor2, $logger->popProcessor());\n        $this->assertEquals($processor1, $logger->popProcessor());\n        $logger->popProcessor();\n    }\n\n    /**\n     * @covers Monolog\\Handler\\AbstractHandler::pushProcessor\n     * @expectedException InvalidArgumentException\n     */\n    public function testPushProcessorWithNonCallable()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractHandler');\n\n        $handler->pushProcessor(new \\stdClass());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse Monolog\\Processor\\WebProcessor;\n\nclass AbstractProcessingHandlerTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Handler\\AbstractProcessingHandler::handle\n     */\n    public function testHandleLowerLevelMessage()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractProcessingHandler', array(Logger::WARNING, true));\n        $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG)));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\AbstractProcessingHandler::handle\n     */\n    public function testHandleBubbling()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractProcessingHandler', array(Logger::DEBUG, true));\n        $this->assertFalse($handler->handle($this->getRecord()));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\AbstractProcessingHandler::handle\n     */\n    public function testHandleNotBubbling()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractProcessingHandler', array(Logger::DEBUG, false));\n        $this->assertTrue($handler->handle($this->getRecord()));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\AbstractProcessingHandler::handle\n     */\n    public function testHandleIsFalseWhenNotHandled()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractProcessingHandler', array(Logger::WARNING, false));\n        $this->assertTrue($handler->handle($this->getRecord()));\n        $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG)));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\AbstractProcessingHandler::processRecord\n     */\n    public function testProcessRecord()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\AbstractProcessingHandler');\n        $handler->pushProcessor(new WebProcessor(array(\n            'REQUEST_URI' => '',\n            'REQUEST_METHOD' => '',\n            'REMOTE_ADDR' => '',\n            'SERVER_NAME' => '',\n            'UNIQUE_ID' => '',\n        )));\n        $handledRecord = null;\n        $handler->expects($this->once())\n            ->method('write')\n            ->will($this->returnCallback(function ($record) use (&$handledRecord) {\n                $handledRecord = $record;\n            }))\n        ;\n        $handler->handle($this->getRecord());\n        $this->assertEquals(6, count($handledRecord['extra']));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse PhpAmqpLib\\Message\\AMQPMessage;\nuse PhpAmqpLib\\Connection\\AMQPConnection;\n\n/**\n * @covers Monolog\\Handler\\RotatingFileHandler\n */\nclass AmqpHandlerTest extends TestCase\n{\n    public function testHandleAmqpExt()\n    {\n        if (!class_exists('AMQPConnection') || !class_exists('AMQPExchange')) {\n            $this->markTestSkipped(\"amqp-php not installed\");\n        }\n\n        if (!class_exists('AMQPChannel')) {\n            $this->markTestSkipped(\"Please update AMQP to version >= 1.0\");\n        }\n\n        $messages = array();\n\n        $exchange = $this->getMock('AMQPExchange', array('publish', 'setName'), array(), '', false);\n        $exchange->expects($this->once())\n            ->method('setName')\n            ->with('log')\n        ;\n        $exchange->expects($this->any())\n            ->method('publish')\n            ->will($this->returnCallback(function ($message, $routing_key, $flags = 0, $attributes = array()) use (&$messages) {\n                $messages[] = array($message, $routing_key, $flags, $attributes);\n            }))\n        ;\n\n        $handler = new AmqpHandler($exchange, 'log');\n\n        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \\stdClass, 'foo' => 34));\n\n        $expected = array(\n            array(\n                'message' => 'test',\n                'context' => array(\n                    'data' => array(),\n                    'foo' => 34,\n                ),\n                'level' => 300,\n                'level_name' => 'WARNING',\n                'channel' => 'test',\n                'extra' => array(),\n            ),\n            'warn.test',\n            0,\n            array(\n                'delivery_mode' => 2,\n                'content_type' => 'application/json',\n            ),\n        );\n\n        $handler->handle($record);\n\n        $this->assertCount(1, $messages);\n        $messages[0][0] = json_decode($messages[0][0], true);\n        unset($messages[0][0]['datetime']);\n        $this->assertEquals($expected, $messages[0]);\n    }\n\n    public function testHandlePhpAmqpLib()\n    {\n        if (!class_exists('PhpAmqpLib\\Connection\\AMQPConnection')) {\n            $this->markTestSkipped(\"php-amqplib not installed\");\n        }\n\n        $messages = array();\n\n        $exchange = $this->getMock('PhpAmqpLib\\Channel\\AMQPChannel', array('basic_publish', '__destruct'), array(), '', false);\n\n        $exchange->expects($this->any())\n            ->method('basic_publish')\n            ->will($this->returnCallback(function (AMQPMessage $msg, $exchange = \"\", $routing_key = \"\", $mandatory = false, $immediate = false, $ticket = null) use (&$messages) {\n                $messages[] = array($msg, $exchange, $routing_key, $mandatory, $immediate, $ticket);\n            }))\n        ;\n\n        $handler = new AmqpHandler($exchange, 'log');\n\n        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \\stdClass, 'foo' => 34));\n\n        $expected = array(\n            array(\n                'message' => 'test',\n                'context' => array(\n                    'data' => array(),\n                    'foo' => 34,\n                ),\n                'level' => 300,\n                'level_name' => 'WARNING',\n                'channel' => 'test',\n                'extra' => array(),\n            ),\n            'log',\n            'warn.test',\n            false,\n            false,\n            null,\n            array(\n                'delivery_mode' => 2,\n                'content_type' => 'application/json',\n            ),\n        );\n\n        $handler->handle($record);\n\n        $this->assertCount(1, $messages);\n\n        /* @var $msg AMQPMessage */\n        $msg = $messages[0][0];\n        $messages[0][0] = json_decode($msg->body, true);\n        $messages[0][] = $msg->get_properties();\n        unset($messages[0][0]['datetime']);\n\n        $this->assertEquals($expected, $messages[0]);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * @covers Monolog\\Handler\\BrowserConsoleHandlerTest\n */\nclass BrowserConsoleHandlerTest extends TestCase\n{\n    protected function setUp()\n    {\n        BrowserConsoleHandler::reset();\n    }\n\n    protected function generateScript()\n    {\n        $reflMethod = new \\ReflectionMethod('Monolog\\Handler\\BrowserConsoleHandler', 'generateScript');\n        $reflMethod->setAccessible(true);\n\n        return $reflMethod->invoke(null);\n    }\n\n    public function testStyling()\n    {\n        $handler = new BrowserConsoleHandler();\n        $handler->setFormatter($this->getIdentityFormatter());\n\n        $handler->handle($this->getRecord(Logger::DEBUG, 'foo[[bar]]{color: red}'));\n\n        $expected = <<<EOF\n(function (c) {if (c && c.groupCollapsed) {\nc.log(\"%cfoo%cbar%c\", \"font-weight: normal\", \"color: red\", \"font-weight: normal\");\n}})(console);\nEOF;\n\n        $this->assertEquals($expected, $this->generateScript());\n    }\n\n    public function testEscaping()\n    {\n        $handler = new BrowserConsoleHandler();\n        $handler->setFormatter($this->getIdentityFormatter());\n\n        $handler->handle($this->getRecord(Logger::DEBUG, \"[foo] [[\\\"bar\\n[baz]\\\"]]{color: red}\"));\n\n        $expected = <<<EOF\n(function (c) {if (c && c.groupCollapsed) {\nc.log(\"%c[foo] %c\\\"bar\\\\n[baz]\\\"%c\", \"font-weight: normal\", \"color: red\", \"font-weight: normal\");\n}})(console);\nEOF;\n\n        $this->assertEquals($expected, $this->generateScript());\n    }\n\n    public function testAutolabel()\n    {\n        $handler = new BrowserConsoleHandler();\n        $handler->setFormatter($this->getIdentityFormatter());\n\n        $handler->handle($this->getRecord(Logger::DEBUG, '[[foo]]{macro: autolabel}'));\n        $handler->handle($this->getRecord(Logger::DEBUG, '[[bar]]{macro: autolabel}'));\n        $handler->handle($this->getRecord(Logger::DEBUG, '[[foo]]{macro: autolabel}'));\n\n        $expected = <<<EOF\n(function (c) {if (c && c.groupCollapsed) {\nc.log(\"%c%cfoo%c\", \"font-weight: normal\", \"background-color: blue; color: white; border-radius: 3px; padding: 0 2px 0 2px\", \"font-weight: normal\");\nc.log(\"%c%cbar%c\", \"font-weight: normal\", \"background-color: green; color: white; border-radius: 3px; padding: 0 2px 0 2px\", \"font-weight: normal\");\nc.log(\"%c%cfoo%c\", \"font-weight: normal\", \"background-color: blue; color: white; border-radius: 3px; padding: 0 2px 0 2px\", \"font-weight: normal\");\n}})(console);\nEOF;\n\n        $this->assertEquals($expected, $this->generateScript());\n    }\n\n    public function testContext()\n    {\n        $handler = new BrowserConsoleHandler();\n        $handler->setFormatter($this->getIdentityFormatter());\n\n        $handler->handle($this->getRecord(Logger::DEBUG, 'test', array('foo' => 'bar')));\n\n        $expected = <<<EOF\n(function (c) {if (c && c.groupCollapsed) {\nc.groupCollapsed(\"%ctest\", \"font-weight: normal\");\nc.log(\"%c%s\", \"font-weight: bold\", \"Context\");\nc.log(\"%s: %o\", \"foo\", \"bar\");\nc.groupEnd();\n}})(console);\nEOF;\n\n        $this->assertEquals($expected, $this->generateScript());\n    }\n\n    public function testConcurrentHandlers()\n    {\n        $handler1 = new BrowserConsoleHandler();\n        $handler1->setFormatter($this->getIdentityFormatter());\n\n        $handler2 = new BrowserConsoleHandler();\n        $handler2->setFormatter($this->getIdentityFormatter());\n\n        $handler1->handle($this->getRecord(Logger::DEBUG, 'test1'));\n        $handler2->handle($this->getRecord(Logger::DEBUG, 'test2'));\n        $handler1->handle($this->getRecord(Logger::DEBUG, 'test3'));\n        $handler2->handle($this->getRecord(Logger::DEBUG, 'test4'));\n\n        $expected = <<<EOF\n(function (c) {if (c && c.groupCollapsed) {\nc.log(\"%ctest1\", \"font-weight: normal\");\nc.log(\"%ctest2\", \"font-weight: normal\");\nc.log(\"%ctest3\", \"font-weight: normal\");\nc.log(\"%ctest4\", \"font-weight: normal\");\n}})(console);\nEOF;\n\n        $this->assertEquals($expected, $this->generateScript());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\nclass BufferHandlerTest extends TestCase\n{\n    private $shutdownCheckHandler;\n\n    /**\n     * @covers Monolog\\Handler\\BufferHandler::__construct\n     * @covers Monolog\\Handler\\BufferHandler::handle\n     * @covers Monolog\\Handler\\BufferHandler::close\n     */\n    public function testHandleBuffers()\n    {\n        $test = new TestHandler();\n        $handler = new BufferHandler($test);\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        $this->assertFalse($test->hasDebugRecords());\n        $this->assertFalse($test->hasInfoRecords());\n        $handler->close();\n        $this->assertTrue($test->hasInfoRecords());\n        $this->assertTrue(count($test->getRecords()) === 2);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\BufferHandler::close\n     * @covers Monolog\\Handler\\BufferHandler::flush\n     */\n    public function testPropagatesRecordsAtEndOfRequest()\n    {\n        $test = new TestHandler();\n        $handler = new BufferHandler($test);\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $this->shutdownCheckHandler = $test;\n        register_shutdown_function(array($this, 'checkPropagation'));\n    }\n\n    public function checkPropagation()\n    {\n        if (!$this->shutdownCheckHandler->hasWarningRecords() || !$this->shutdownCheckHandler->hasDebugRecords()) {\n            echo '!!! BufferHandlerTest::testPropagatesRecordsAtEndOfRequest failed to verify that the messages have been propagated' . PHP_EOL;\n            exit(1);\n        }\n    }\n\n    /**\n     * @covers Monolog\\Handler\\BufferHandler::handle\n     */\n    public function testHandleBufferLimit()\n    {\n        $test = new TestHandler();\n        $handler = new BufferHandler($test, 2);\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $handler->close();\n        $this->assertTrue($test->hasWarningRecords());\n        $this->assertTrue($test->hasInfoRecords());\n        $this->assertFalse($test->hasDebugRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\BufferHandler::handle\n     */\n    public function testHandleBufferLimitWithFlushOnOverflow()\n    {\n        $test = new TestHandler();\n        $handler = new BufferHandler($test, 3, Logger::DEBUG, true, true);\n\n        // send two records\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $this->assertFalse($test->hasDebugRecords());\n        $this->assertCount(0, $test->getRecords());\n\n        // overflow\n        $handler->handle($this->getRecord(Logger::INFO));\n        $this->assertTrue($test->hasDebugRecords());\n        $this->assertCount(3, $test->getRecords());\n\n        // should buffer again\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertCount(3, $test->getRecords());\n\n        $handler->close();\n        $this->assertCount(5, $test->getRecords());\n        $this->assertTrue($test->hasWarningRecords());\n        $this->assertTrue($test->hasInfoRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\BufferHandler::handle\n     */\n    public function testHandleLevel()\n    {\n        $test = new TestHandler();\n        $handler = new BufferHandler($test, 0, Logger::INFO);\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->close();\n        $this->assertTrue($test->hasWarningRecords());\n        $this->assertTrue($test->hasInfoRecords());\n        $this->assertFalse($test->hasDebugRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\BufferHandler::flush\n     */\n    public function testFlush()\n    {\n        $test = new TestHandler();\n        $handler = new BufferHandler($test, 0);\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        $handler->flush();\n        $this->assertTrue($test->hasInfoRecords());\n        $this->assertTrue($test->hasDebugRecords());\n        $this->assertFalse($test->hasWarningRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\BufferHandler::handle\n     */\n    public function testHandleUsesProcessors()\n    {\n        $test = new TestHandler();\n        $handler = new BufferHandler($test);\n        $handler->pushProcessor(function ($record) {\n            $record['extra']['foo'] = true;\n\n            return $record;\n        });\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $handler->flush();\n        $this->assertTrue($test->hasWarningRecords());\n        $records = $test->getRecords();\n        $this->assertTrue($records[0]['extra']['foo']);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * @covers Monolog\\Handler\\ChromePHPHandler\n */\nclass ChromePHPHandlerTest extends TestCase\n{\n    protected function setUp()\n    {\n        TestChromePHPHandler::reset();\n        $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; Chrome/1.0';\n    }\n\n    /**\n     * @dataProvider agentsProvider\n     */\n    public function testHeaders($agent)\n    {\n        $_SERVER['HTTP_USER_AGENT'] = $agent;\n\n        $handler = new TestChromePHPHandler();\n        $handler->setFormatter($this->getIdentityFormatter());\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::WARNING));\n\n        $expected = array(\n            'X-ChromeLogger-Data'   => base64_encode(utf8_encode(json_encode(array(\n                'version' => ChromePHPHandler::VERSION,\n                'columns' => array('label', 'log', 'backtrace', 'type'),\n                'rows' => array(\n                    'test',\n                    'test',\n                ),\n                'request_uri' => '',\n            )))),\n        );\n\n        $this->assertEquals($expected, $handler->getHeaders());\n    }\n\n    public static function agentsProvider()\n    {\n        return array(\n            array('Monolog Test; Chrome/1.0'),\n            array('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'),\n            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'),\n            array('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36'),\n        );\n    }\n\n    public function testHeadersOverflow()\n    {\n        $handler = new TestChromePHPHandler();\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::WARNING, str_repeat('a', 150 * 1024)));\n\n        // overflow chrome headers limit\n        $handler->handle($this->getRecord(Logger::WARNING, str_repeat('a', 100 * 1024)));\n\n        $expected = array(\n            'X-ChromeLogger-Data'   => base64_encode(utf8_encode(json_encode(array(\n                'version' => ChromePHPHandler::VERSION,\n                'columns' => array('label', 'log', 'backtrace', 'type'),\n                'rows' => array(\n                    array(\n                        'test',\n                        'test',\n                        'unknown',\n                        'log',\n                    ),\n                    array(\n                        'test',\n                        str_repeat('a', 150 * 1024),\n                        'unknown',\n                        'warn',\n                    ),\n                    array(\n                        'monolog',\n                        'Incomplete logs, chrome header size limit reached',\n                        'unknown',\n                        'warn',\n                    ),\n                ),\n                'request_uri' => '',\n            )))),\n        );\n\n        $this->assertEquals($expected, $handler->getHeaders());\n    }\n\n    public function testConcurrentHandlers()\n    {\n        $handler = new TestChromePHPHandler();\n        $handler->setFormatter($this->getIdentityFormatter());\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::WARNING));\n\n        $handler2 = new TestChromePHPHandler();\n        $handler2->setFormatter($this->getIdentityFormatter());\n        $handler2->handle($this->getRecord(Logger::DEBUG));\n        $handler2->handle($this->getRecord(Logger::WARNING));\n\n        $expected = array(\n            'X-ChromeLogger-Data'   => base64_encode(utf8_encode(json_encode(array(\n                'version' => ChromePHPHandler::VERSION,\n                'columns' => array('label', 'log', 'backtrace', 'type'),\n                'rows' => array(\n                    'test',\n                    'test',\n                    'test',\n                    'test',\n                ),\n                'request_uri' => '',\n            )))),\n        );\n\n        $this->assertEquals($expected, $handler2->getHeaders());\n    }\n}\n\nclass TestChromePHPHandler extends ChromePHPHandler\n{\n    protected $headers = array();\n\n    public static function reset()\n    {\n        self::$initialized = false;\n        self::$overflowed = false;\n        self::$sendHeaders = true;\n        self::$json['rows'] = array();\n    }\n\n    protected function sendHeader($header, $content)\n    {\n        $this->headers[$header] = $content;\n    }\n\n    public function getHeaders()\n    {\n        return $this->headers;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\nclass CouchDBHandlerTest extends TestCase\n{\n    public function testHandle()\n    {\n        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \\stdClass, 'foo' => 34));\n\n        $handler = new CouchDBHandler();\n\n        try {\n            $handler->handle($record);\n        } catch (\\RuntimeException $e) {\n            $this->markTestSkipped('Could not connect to couchdb server on http://localhost:5984');\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/DeduplicationHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\nclass DeduplicationHandlerTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Handler\\DeduplicationHandler::flush\n     */\n    public function testFlushPassthruIfAllRecordsUnderTrigger()\n    {\n        $test = new TestHandler();\n        @unlink(sys_get_temp_dir().'/monolog_dedup.log');\n        $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);\n\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n\n        $handler->flush();\n\n        $this->assertTrue($test->hasInfoRecords());\n        $this->assertTrue($test->hasDebugRecords());\n        $this->assertFalse($test->hasWarningRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\DeduplicationHandler::flush\n     * @covers Monolog\\Handler\\DeduplicationHandler::appendRecord\n     */\n    public function testFlushPassthruIfEmptyLog()\n    {\n        $test = new TestHandler();\n        @unlink(sys_get_temp_dir().'/monolog_dedup.log');\n        $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);\n\n        $handler->handle($this->getRecord(Logger::ERROR, 'Foo:bar'));\n        $handler->handle($this->getRecord(Logger::CRITICAL, \"Foo\\nbar\"));\n\n        $handler->flush();\n\n        $this->assertTrue($test->hasErrorRecords());\n        $this->assertTrue($test->hasCriticalRecords());\n        $this->assertFalse($test->hasWarningRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\DeduplicationHandler::flush\n     * @covers Monolog\\Handler\\DeduplicationHandler::appendRecord\n     * @covers Monolog\\Handler\\DeduplicationHandler::isDuplicate\n     * @depends testFlushPassthruIfEmptyLog\n     */\n    public function testFlushSkipsIfLogExists()\n    {\n        $test = new TestHandler();\n        $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);\n\n        $handler->handle($this->getRecord(Logger::ERROR, 'Foo:bar'));\n        $handler->handle($this->getRecord(Logger::CRITICAL, \"Foo\\nbar\"));\n\n        $handler->flush();\n\n        $this->assertFalse($test->hasErrorRecords());\n        $this->assertFalse($test->hasCriticalRecords());\n        $this->assertFalse($test->hasWarningRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\DeduplicationHandler::flush\n     * @covers Monolog\\Handler\\DeduplicationHandler::appendRecord\n     * @covers Monolog\\Handler\\DeduplicationHandler::isDuplicate\n     * @depends testFlushPassthruIfEmptyLog\n     */\n    public function testFlushPassthruIfLogTooOld()\n    {\n        $test = new TestHandler();\n        $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);\n\n        $record = $this->getRecord(Logger::ERROR);\n        $record['datetime']->modify('+62seconds');\n        $handler->handle($record);\n        $record = $this->getRecord(Logger::CRITICAL);\n        $record['datetime']->modify('+62seconds');\n        $handler->handle($record);\n\n        $handler->flush();\n\n        $this->assertTrue($test->hasErrorRecords());\n        $this->assertTrue($test->hasCriticalRecords());\n        $this->assertFalse($test->hasWarningRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\DeduplicationHandler::flush\n     * @covers Monolog\\Handler\\DeduplicationHandler::appendRecord\n     * @covers Monolog\\Handler\\DeduplicationHandler::isDuplicate\n     * @covers Monolog\\Handler\\DeduplicationHandler::collectLogs\n     */\n    public function testGcOldLogs()\n    {\n        $test = new TestHandler();\n        @unlink(sys_get_temp_dir().'/monolog_dedup.log');\n        $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);\n\n        // handle two records from yesterday, and one recent\n        $record = $this->getRecord(Logger::ERROR);\n        $record['datetime']->modify('-1day -10seconds');\n        $handler->handle($record);\n        $record2 = $this->getRecord(Logger::CRITICAL);\n        $record2['datetime']->modify('-1day -10seconds');\n        $handler->handle($record2);\n        $record3 = $this->getRecord(Logger::CRITICAL);\n        $record3['datetime']->modify('-30seconds');\n        $handler->handle($record3);\n\n        // log is written as none of them are duplicate\n        $handler->flush();\n        $this->assertSame(\n            $record['datetime']->getTimestamp() . \":ERROR:test\\n\" .\n            $record2['datetime']->getTimestamp() . \":CRITICAL:test\\n\" .\n            $record3['datetime']->getTimestamp() . \":CRITICAL:test\\n\",\n            file_get_contents(sys_get_temp_dir() . '/monolog_dedup.log')\n        );\n        $this->assertTrue($test->hasErrorRecords());\n        $this->assertTrue($test->hasCriticalRecords());\n        $this->assertFalse($test->hasWarningRecords());\n\n        // clear test handler\n        $test->clear();\n        $this->assertFalse($test->hasErrorRecords());\n        $this->assertFalse($test->hasCriticalRecords());\n\n        // log new records, duplicate log gets GC'd at the end of this flush call\n        $handler->handle($record = $this->getRecord(Logger::ERROR));\n        $handler->handle($record2 = $this->getRecord(Logger::CRITICAL));\n        $handler->flush();\n\n        // log should now contain the new errors and the previous one that was recent enough\n        $this->assertSame(\n            $record3['datetime']->getTimestamp() . \":CRITICAL:test\\n\" .\n            $record['datetime']->getTimestamp() . \":ERROR:test\\n\" .\n            $record2['datetime']->getTimestamp() . \":CRITICAL:test\\n\",\n            file_get_contents(sys_get_temp_dir() . '/monolog_dedup.log')\n        );\n        $this->assertTrue($test->hasErrorRecords());\n        $this->assertTrue($test->hasCriticalRecords());\n        $this->assertFalse($test->hasWarningRecords());\n    }\n\n    public static function tearDownAfterClass()\n    {\n        @unlink(sys_get_temp_dir().'/monolog_dedup.log');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\nclass DoctrineCouchDBHandlerTest extends TestCase\n{\n    protected function setup()\n    {\n        if (!class_exists('Doctrine\\CouchDB\\CouchDBClient')) {\n            $this->markTestSkipped('The \"doctrine/couchdb\" package is not installed');\n        }\n    }\n\n    public function testHandle()\n    {\n        $client = $this->getMockBuilder('Doctrine\\\\CouchDB\\\\CouchDBClient')\n            ->setMethods(array('postDocument'))\n            ->disableOriginalConstructor()\n            ->getMock();\n\n        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \\stdClass, 'foo' => 34));\n\n        $expected = array(\n            'message' => 'test',\n            'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34),\n            'level' => Logger::WARNING,\n            'level_name' => 'WARNING',\n            'channel' => 'test',\n            'datetime' => $record['datetime']->format('Y-m-d H:i:s'),\n            'extra' => array(),\n        );\n\n        $client->expects($this->once())\n            ->method('postDocument')\n            ->with($expected);\n\n        $handler = new DoctrineCouchDBHandler($client);\n        $handler->handle($record);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\n\nclass DynamoDbHandlerTest extends TestCase\n{\n    private $client;\n\n    public function setUp()\n    {\n        if (!class_exists('Aws\\DynamoDb\\DynamoDbClient')) {\n            $this->markTestSkipped('aws/aws-sdk-php not installed');\n        }\n\n        $this->client = $this->getMockBuilder('Aws\\DynamoDb\\DynamoDbClient')\n            ->setMethods(array('formatAttributes', '__call'))\n            ->disableOriginalConstructor()->getMock();\n    }\n\n    public function testConstruct()\n    {\n        $this->assertInstanceOf('Monolog\\Handler\\DynamoDbHandler', new DynamoDbHandler($this->client, 'foo'));\n    }\n\n    public function testInterface()\n    {\n        $this->assertInstanceOf('Monolog\\Handler\\HandlerInterface', new DynamoDbHandler($this->client, 'foo'));\n    }\n\n    public function testGetFormatter()\n    {\n        $handler = new DynamoDbHandler($this->client, 'foo');\n        $this->assertInstanceOf('Monolog\\Formatter\\ScalarFormatter', $handler->getFormatter());\n    }\n\n    public function testHandle()\n    {\n        $record = $this->getRecord();\n        $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');\n        $formatted = array('foo' => 1, 'bar' => 2);\n        $handler = new DynamoDbHandler($this->client, 'foo');\n        $handler->setFormatter($formatter);\n\n        $isV3 = defined('Aws\\Sdk::VERSION') && version_compare(\\Aws\\Sdk::VERSION, '3.0', '>=');\n        if ($isV3) {\n            $expFormatted = array('foo' => array('N' => 1), 'bar' => array('N' => 2));\n        } else {\n            $expFormatted = $formatted;\n        }\n\n        $formatter\n             ->expects($this->once())\n             ->method('format')\n             ->with($record)\n             ->will($this->returnValue($formatted));\n        $this->client\n             ->expects($isV3 ? $this->never() : $this->once())\n             ->method('formatAttributes')\n             ->with($this->isType('array'))\n             ->will($this->returnValue($formatted));\n        $this->client\n             ->expects($this->once())\n             ->method('__call')\n             ->with('putItem', array(array(\n                 'TableName' => 'foo',\n                 'Item' => $expFormatted,\n             )));\n\n        $handler->handle($record);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\ElasticaFormatter;\nuse Monolog\\Formatter\\NormalizerFormatter;\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse Elastica\\Client;\nuse Elastica\\Request;\nuse Elastica\\Response;\n\nclass ElasticSearchHandlerTest extends TestCase\n{\n    /**\n     * @var Client mock\n     */\n    protected $client;\n\n    /**\n     * @var array Default handler options\n     */\n    protected $options = array(\n        'index' => 'my_index',\n        'type'  => 'doc_type',\n    );\n\n    public function setUp()\n    {\n        // Elastica lib required\n        if (!class_exists(\"Elastica\\Client\")) {\n            $this->markTestSkipped(\"ruflin/elastica not installed\");\n        }\n\n        // base mock Elastica Client object\n        $this->client = $this->getMockBuilder('Elastica\\Client')\n            ->setMethods(array('addDocuments'))\n            ->disableOriginalConstructor()\n            ->getMock();\n    }\n\n    /**\n     * @covers Monolog\\Handler\\ElasticSearchHandler::write\n     * @covers Monolog\\Handler\\ElasticSearchHandler::handleBatch\n     * @covers Monolog\\Handler\\ElasticSearchHandler::bulkSend\n     * @covers Monolog\\Handler\\ElasticSearchHandler::getDefaultFormatter\n     */\n    public function testHandle()\n    {\n        // log message\n        $msg = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('foo' => 7, 'bar', 'class' => new \\stdClass),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(),\n            'message' => 'log',\n        );\n\n        // format expected result\n        $formatter = new ElasticaFormatter($this->options['index'], $this->options['type']);\n        $expected = array($formatter->format($msg));\n\n        // setup ES client mock\n        $this->client->expects($this->any())\n            ->method('addDocuments')\n            ->with($expected);\n\n        // perform tests\n        $handler = new ElasticSearchHandler($this->client, $this->options);\n        $handler->handle($msg);\n        $handler->handleBatch(array($msg));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\ElasticSearchHandler::setFormatter\n     */\n    public function testSetFormatter()\n    {\n        $handler = new ElasticSearchHandler($this->client);\n        $formatter = new ElasticaFormatter('index_new', 'type_new');\n        $handler->setFormatter($formatter);\n        $this->assertInstanceOf('Monolog\\Formatter\\ElasticaFormatter', $handler->getFormatter());\n        $this->assertEquals('index_new', $handler->getFormatter()->getIndex());\n        $this->assertEquals('type_new', $handler->getFormatter()->getType());\n    }\n\n    /**\n     * @covers                   Monolog\\Handler\\ElasticSearchHandler::setFormatter\n     * @expectedException        InvalidArgumentException\n     * @expectedExceptionMessage ElasticSearchHandler is only compatible with ElasticaFormatter\n     */\n    public function testSetFormatterInvalid()\n    {\n        $handler = new ElasticSearchHandler($this->client);\n        $formatter = new NormalizerFormatter();\n        $handler->setFormatter($formatter);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\ElasticSearchHandler::__construct\n     * @covers Monolog\\Handler\\ElasticSearchHandler::getOptions\n     */\n    public function testOptions()\n    {\n        $expected = array(\n            'index' => $this->options['index'],\n            'type' => $this->options['type'],\n            'ignore_error' => false,\n        );\n        $handler = new ElasticSearchHandler($this->client, $this->options);\n        $this->assertEquals($expected, $handler->getOptions());\n    }\n\n    /**\n     * @covers       Monolog\\Handler\\ElasticSearchHandler::bulkSend\n     * @dataProvider providerTestConnectionErrors\n     */\n    public function testConnectionErrors($ignore, $expectedError)\n    {\n        $clientOpts = array('host' => '127.0.0.1', 'port' => 1);\n        $client = new Client($clientOpts);\n        $handlerOpts = array('ignore_error' => $ignore);\n        $handler = new ElasticSearchHandler($client, $handlerOpts);\n\n        if ($expectedError) {\n            $this->setExpectedException($expectedError[0], $expectedError[1]);\n            $handler->handle($this->getRecord());\n        } else {\n            $this->assertFalse($handler->handle($this->getRecord()));\n        }\n    }\n\n    /**\n     * @return array\n     */\n    public function providerTestConnectionErrors()\n    {\n        return array(\n            array(false, array('RuntimeException', 'Error sending messages to Elasticsearch')),\n            array(true, false),\n        );\n    }\n\n    /**\n     * Integration test using localhost Elastic Search server\n     *\n     * @covers Monolog\\Handler\\ElasticSearchHandler::__construct\n     * @covers Monolog\\Handler\\ElasticSearchHandler::handleBatch\n     * @covers Monolog\\Handler\\ElasticSearchHandler::bulkSend\n     * @covers Monolog\\Handler\\ElasticSearchHandler::getDefaultFormatter\n     */\n    public function testHandleIntegration()\n    {\n        $msg = array(\n            'level' => Logger::ERROR,\n            'level_name' => 'ERROR',\n            'channel' => 'meh',\n            'context' => array('foo' => 7, 'bar', 'class' => new \\stdClass),\n            'datetime' => new \\DateTime(\"@0\"),\n            'extra' => array(),\n            'message' => 'log',\n        );\n\n        $expected = $msg;\n        $expected['datetime'] = $msg['datetime']->format(\\DateTime::ISO8601);\n        $expected['context'] = array(\n            'class' => '[object] (stdClass: {})',\n            'foo' => 7,\n            0 => 'bar',\n        );\n\n        $client = new Client();\n        $handler = new ElasticSearchHandler($client, $this->options);\n        try {\n            $handler->handleBatch(array($msg));\n        } catch (\\RuntimeException $e) {\n            $this->markTestSkipped(\"Cannot connect to Elastic Search server on localhost\");\n        }\n\n        // check document id from ES server response\n        $documentId = $this->getCreatedDocId($client->getLastResponse());\n        $this->assertNotEmpty($documentId, 'No elastic document id received');\n\n        // retrieve document source from ES and validate\n        $document = $this->getDocSourceFromElastic(\n            $client,\n            $this->options['index'],\n            $this->options['type'],\n            $documentId\n        );\n        $this->assertEquals($expected, $document);\n\n        // remove test index from ES\n        $client->request(\"/{$this->options['index']}\", Request::DELETE);\n    }\n\n    /**\n     * Return last created document id from ES response\n     * @param  Response    $response Elastica Response object\n     * @return string|null\n     */\n    protected function getCreatedDocId(Response $response)\n    {\n        $data = $response->getData();\n        if (!empty($data['items'][0]['create']['_id'])) {\n            return $data['items'][0]['create']['_id'];\n        }\n    }\n\n    /**\n     * Retrieve document by id from Elasticsearch\n     * @param  Client $client     Elastica client\n     * @param  string $index\n     * @param  string $type\n     * @param  string $documentId\n     * @return array\n     */\n    protected function getDocSourceFromElastic(Client $client, $index, $type, $documentId)\n    {\n        $resp = $client->request(\"/{$index}/{$type}/{$documentId}\", Request::GET);\n        $data = $resp->getData();\n        if (!empty($data['_source'])) {\n            return $data['_source'];\n        }\n\n        return array();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\LineFormatter;\n\nfunction error_log()\n{\n    $GLOBALS['error_log'][] = func_get_args();\n}\n\nclass ErrorLogHandlerTest extends TestCase\n{\n    protected function setUp()\n    {\n        $GLOBALS['error_log'] = array();\n    }\n\n    /**\n     * @covers Monolog\\Handler\\ErrorLogHandler::__construct\n     * @expectedException InvalidArgumentException\n     * @expectedExceptionMessage The given message type \"42\" is not supported\n     */\n    public function testShouldNotAcceptAnInvalidTypeOnContructor()\n    {\n        new ErrorLogHandler(42);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\ErrorLogHandler::write\n     */\n    public function testShouldLogMessagesUsingErrorLogFuncion()\n    {\n        $type = ErrorLogHandler::OPERATING_SYSTEM;\n        $handler = new ErrorLogHandler($type);\n        $handler->setFormatter(new LineFormatter('%channel%.%level_name%: %message% %context% %extra%', null, true));\n        $handler->handle($this->getRecord(Logger::ERROR, \"Foo\\nBar\\r\\n\\r\\nBaz\"));\n\n        $this->assertSame(\"test.ERROR: Foo\\nBar\\r\\n\\r\\nBaz [] []\", $GLOBALS['error_log'][0][0]);\n        $this->assertSame($GLOBALS['error_log'][0][1], $type);\n\n        $handler = new ErrorLogHandler($type, Logger::DEBUG, true, true);\n        $handler->setFormatter(new LineFormatter(null, null, true));\n        $handler->handle($this->getRecord(Logger::ERROR, \"Foo\\nBar\\r\\n\\r\\nBaz\"));\n\n        $this->assertStringMatchesFormat('[%s] test.ERROR: Foo', $GLOBALS['error_log'][1][0]);\n        $this->assertSame($GLOBALS['error_log'][1][1], $type);\n\n        $this->assertStringMatchesFormat('Bar', $GLOBALS['error_log'][2][0]);\n        $this->assertSame($GLOBALS['error_log'][2][1], $type);\n\n        $this->assertStringMatchesFormat('Baz [] []', $GLOBALS['error_log'][3][0]);\n        $this->assertSame($GLOBALS['error_log'][3][1], $type);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/FilterHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\TestCase;\n\nclass FilterHandlerTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Handler\\FilterHandler::isHandling\n     */\n    public function testIsHandling()\n    {\n        $test    = new TestHandler();\n        $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE);\n        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));\n        $this->assertTrue($handler->isHandling($this->getRecord(Logger::INFO)));\n        $this->assertTrue($handler->isHandling($this->getRecord(Logger::NOTICE)));\n        $this->assertFalse($handler->isHandling($this->getRecord(Logger::WARNING)));\n        $this->assertFalse($handler->isHandling($this->getRecord(Logger::ERROR)));\n        $this->assertFalse($handler->isHandling($this->getRecord(Logger::CRITICAL)));\n        $this->assertFalse($handler->isHandling($this->getRecord(Logger::ALERT)));\n        $this->assertFalse($handler->isHandling($this->getRecord(Logger::EMERGENCY)));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FilterHandler::handle\n     * @covers Monolog\\Handler\\FilterHandler::setAcceptedLevels\n     * @covers Monolog\\Handler\\FilterHandler::isHandling\n     */\n    public function testHandleProcessOnlyNeededLevels()\n    {\n        $test    = new TestHandler();\n        $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE);\n\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $this->assertFalse($test->hasDebugRecords());\n\n        $handler->handle($this->getRecord(Logger::INFO));\n        $this->assertTrue($test->hasInfoRecords());\n        $handler->handle($this->getRecord(Logger::NOTICE));\n        $this->assertTrue($test->hasNoticeRecords());\n\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertFalse($test->hasWarningRecords());\n        $handler->handle($this->getRecord(Logger::ERROR));\n        $this->assertFalse($test->hasErrorRecords());\n        $handler->handle($this->getRecord(Logger::CRITICAL));\n        $this->assertFalse($test->hasCriticalRecords());\n        $handler->handle($this->getRecord(Logger::ALERT));\n        $this->assertFalse($test->hasAlertRecords());\n        $handler->handle($this->getRecord(Logger::EMERGENCY));\n        $this->assertFalse($test->hasEmergencyRecords());\n\n        $test    = new TestHandler();\n        $handler = new FilterHandler($test, array(Logger::INFO, Logger::ERROR));\n\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $this->assertFalse($test->hasDebugRecords());\n        $handler->handle($this->getRecord(Logger::INFO));\n        $this->assertTrue($test->hasInfoRecords());\n        $handler->handle($this->getRecord(Logger::NOTICE));\n        $this->assertFalse($test->hasNoticeRecords());\n        $handler->handle($this->getRecord(Logger::ERROR));\n        $this->assertTrue($test->hasErrorRecords());\n        $handler->handle($this->getRecord(Logger::CRITICAL));\n        $this->assertFalse($test->hasCriticalRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FilterHandler::setAcceptedLevels\n     * @covers Monolog\\Handler\\FilterHandler::getAcceptedLevels\n     */\n    public function testAcceptedLevelApi()\n    {\n        $test    = new TestHandler();\n        $handler = new FilterHandler($test);\n\n        $levels = array(Logger::INFO, Logger::ERROR);\n        $handler->setAcceptedLevels($levels);\n        $this->assertSame($levels, $handler->getAcceptedLevels());\n\n        $handler->setAcceptedLevels(array('info', 'error'));\n        $this->assertSame($levels, $handler->getAcceptedLevels());\n\n        $levels = array(Logger::CRITICAL, Logger::ALERT, Logger::EMERGENCY);\n        $handler->setAcceptedLevels(Logger::CRITICAL, Logger::EMERGENCY);\n        $this->assertSame($levels, $handler->getAcceptedLevels());\n\n        $handler->setAcceptedLevels('critical', 'emergency');\n        $this->assertSame($levels, $handler->getAcceptedLevels());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FilterHandler::handle\n     */\n    public function testHandleUsesProcessors()\n    {\n        $test    = new TestHandler();\n        $handler = new FilterHandler($test, Logger::DEBUG, Logger::EMERGENCY);\n        $handler->pushProcessor(\n            function ($record) {\n                $record['extra']['foo'] = true;\n\n                return $record;\n            }\n        );\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertTrue($test->hasWarningRecords());\n        $records = $test->getRecords();\n        $this->assertTrue($records[0]['extra']['foo']);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FilterHandler::handle\n     */\n    public function testHandleRespectsBubble()\n    {\n        $test = new TestHandler();\n\n        $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE, false);\n        $this->assertTrue($handler->handle($this->getRecord(Logger::INFO)));\n        $this->assertFalse($handler->handle($this->getRecord(Logger::WARNING)));\n\n        $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE, true);\n        $this->assertFalse($handler->handle($this->getRecord(Logger::INFO)));\n        $this->assertFalse($handler->handle($this->getRecord(Logger::WARNING)));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FilterHandler::handle\n     */\n    public function testHandleWithCallback()\n    {\n        $test    = new TestHandler();\n        $handler = new FilterHandler(\n            function ($record, $handler) use ($test) {\n                return $test;\n            }, Logger::INFO, Logger::NOTICE, false\n        );\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        $this->assertFalse($test->hasDebugRecords());\n        $this->assertTrue($test->hasInfoRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FilterHandler::handle\n     * @expectedException \\RuntimeException\n     */\n    public function testHandleWithBadCallbackThrowsException()\n    {\n        $handler = new FilterHandler(\n            function ($record, $handler) {\n                return 'foo';\n            }\n        );\n        $handler->handle($this->getRecord(Logger::WARNING));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy;\nuse Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy;\nuse Psr\\Log\\LogLevel;\n\nclass FingersCrossedHandlerTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::__construct\n     * @covers Monolog\\Handler\\FingersCrossedHandler::handle\n     * @covers Monolog\\Handler\\FingersCrossedHandler::activate\n     */\n    public function testHandleBuffers()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test);\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        $this->assertFalse($test->hasDebugRecords());\n        $this->assertFalse($test->hasInfoRecords());\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $handler->close();\n        $this->assertTrue($test->hasInfoRecords());\n        $this->assertTrue(count($test->getRecords()) === 3);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::handle\n     * @covers Monolog\\Handler\\FingersCrossedHandler::activate\n     */\n    public function testHandleStopsBufferingAfterTrigger()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test);\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->close();\n        $this->assertTrue($test->hasWarningRecords());\n        $this->assertTrue($test->hasDebugRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::handle\n     * @covers Monolog\\Handler\\FingersCrossedHandler::activate\n     * @covers Monolog\\Handler\\FingersCrossedHandler::reset\n     */\n    public function testHandleRestartBufferingAfterReset()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test);\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->reset();\n        $handler->handle($this->getRecord(Logger::INFO));\n        $handler->close();\n        $this->assertTrue($test->hasWarningRecords());\n        $this->assertTrue($test->hasDebugRecords());\n        $this->assertFalse($test->hasInfoRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::handle\n     * @covers Monolog\\Handler\\FingersCrossedHandler::activate\n     */\n    public function testHandleRestartBufferingAfterBeingTriggeredWhenStopBufferingIsDisabled()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test, Logger::WARNING, 0, false, false);\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $handler->handle($this->getRecord(Logger::INFO));\n        $handler->close();\n        $this->assertTrue($test->hasWarningRecords());\n        $this->assertTrue($test->hasDebugRecords());\n        $this->assertFalse($test->hasInfoRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::handle\n     * @covers Monolog\\Handler\\FingersCrossedHandler::activate\n     */\n    public function testHandleBufferLimit()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test, Logger::WARNING, 2);\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertTrue($test->hasWarningRecords());\n        $this->assertTrue($test->hasInfoRecords());\n        $this->assertFalse($test->hasDebugRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::handle\n     * @covers Monolog\\Handler\\FingersCrossedHandler::activate\n     */\n    public function testHandleWithCallback()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler(function ($record, $handler) use ($test) {\n                    return $test;\n                });\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        $this->assertFalse($test->hasDebugRecords());\n        $this->assertFalse($test->hasInfoRecords());\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertTrue($test->hasInfoRecords());\n        $this->assertTrue(count($test->getRecords()) === 3);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::handle\n     * @covers Monolog\\Handler\\FingersCrossedHandler::activate\n     * @expectedException RuntimeException\n     */\n    public function testHandleWithBadCallbackThrowsException()\n    {\n        $handler = new FingersCrossedHandler(function ($record, $handler) {\n                    return 'foo';\n                });\n        $handler->handle($this->getRecord(Logger::WARNING));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::isHandling\n     */\n    public function testIsHandlingAlways()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test, Logger::ERROR);\n        $this->assertTrue($handler->isHandling($this->getRecord(Logger::DEBUG)));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::__construct\n     * @covers Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy::__construct\n     * @covers Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy::isHandlerActivated\n     */\n    public function testErrorLevelActivationStrategy()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING));\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $this->assertFalse($test->hasDebugRecords());\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertTrue($test->hasDebugRecords());\n        $this->assertTrue($test->hasWarningRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::__construct\n     * @covers Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy::__construct\n     * @covers Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy::isHandlerActivated\n     */\n    public function testErrorLevelActivationStrategyWithPsrLevel()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy('warning'));\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $this->assertFalse($test->hasDebugRecords());\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertTrue($test->hasDebugRecords());\n        $this->assertTrue($test->hasWarningRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::__construct\n     * @covers Monolog\\Handler\\FingersCrossedHandler::activate\n     */\n    public function testOverrideActivationStrategy()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy('warning'));\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $this->assertFalse($test->hasDebugRecords());\n        $handler->activate();\n        $this->assertTrue($test->hasDebugRecords());\n        $handler->handle($this->getRecord(Logger::INFO));\n        $this->assertTrue($test->hasInfoRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy::__construct\n     * @covers Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy::isHandlerActivated\n     */\n    public function testChannelLevelActivationStrategy()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test, new ChannelLevelActivationStrategy(Logger::ERROR, array('othertest' => Logger::DEBUG)));\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertFalse($test->hasWarningRecords());\n        $record = $this->getRecord(Logger::DEBUG);\n        $record['channel'] = 'othertest';\n        $handler->handle($record);\n        $this->assertTrue($test->hasDebugRecords());\n        $this->assertTrue($test->hasWarningRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy::__construct\n     * @covers Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy::isHandlerActivated\n     */\n    public function testChannelLevelActivationStrategyWithPsrLevels()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test, new ChannelLevelActivationStrategy('error', array('othertest' => 'debug')));\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertFalse($test->hasWarningRecords());\n        $record = $this->getRecord(Logger::DEBUG);\n        $record['channel'] = 'othertest';\n        $handler->handle($record);\n        $this->assertTrue($test->hasDebugRecords());\n        $this->assertTrue($test->hasWarningRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::handle\n     * @covers Monolog\\Handler\\FingersCrossedHandler::activate\n     */\n    public function testHandleUsesProcessors()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test, Logger::INFO);\n        $handler->pushProcessor(function ($record) {\n            $record['extra']['foo'] = true;\n\n            return $record;\n        });\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertTrue($test->hasWarningRecords());\n        $records = $test->getRecords();\n        $this->assertTrue($records[0]['extra']['foo']);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::close\n     */\n    public function testPassthruOnClose()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING), 0, true, true, Logger::INFO);\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        $handler->close();\n        $this->assertFalse($test->hasDebugRecords());\n        $this->assertTrue($test->hasInfoRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\FingersCrossedHandler::close\n     */\n    public function testPsrLevelPassthruOnClose()\n    {\n        $test = new TestHandler();\n        $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING), 0, true, true, LogLevel::INFO);\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        $handler->close();\n        $this->assertFalse($test->hasDebugRecords());\n        $this->assertTrue($test->hasInfoRecords());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * @covers Monolog\\Handler\\FirePHPHandler\n */\nclass FirePHPHandlerTest extends TestCase\n{\n    public function setUp()\n    {\n        TestFirePHPHandler::reset();\n        $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; FirePHP/1.0';\n    }\n\n    public function testHeaders()\n    {\n        $handler = new TestFirePHPHandler;\n        $handler->setFormatter($this->getIdentityFormatter());\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::WARNING));\n\n        $expected = array(\n            'X-Wf-Protocol-1'    => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2',\n            'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1',\n            'X-Wf-1-Plugin-1'    => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3',\n            'X-Wf-1-1-1-1'       => 'test',\n            'X-Wf-1-1-1-2'       => 'test',\n        );\n\n        $this->assertEquals($expected, $handler->getHeaders());\n    }\n\n    public function testConcurrentHandlers()\n    {\n        $handler = new TestFirePHPHandler;\n        $handler->setFormatter($this->getIdentityFormatter());\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::WARNING));\n\n        $handler2 = new TestFirePHPHandler;\n        $handler2->setFormatter($this->getIdentityFormatter());\n        $handler2->handle($this->getRecord(Logger::DEBUG));\n        $handler2->handle($this->getRecord(Logger::WARNING));\n\n        $expected = array(\n            'X-Wf-Protocol-1'    => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2',\n            'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1',\n            'X-Wf-1-Plugin-1'    => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3',\n            'X-Wf-1-1-1-1'       => 'test',\n            'X-Wf-1-1-1-2'       => 'test',\n        );\n\n        $expected2 = array(\n            'X-Wf-1-1-1-3'       => 'test',\n            'X-Wf-1-1-1-4'       => 'test',\n        );\n\n        $this->assertEquals($expected, $handler->getHeaders());\n        $this->assertEquals($expected2, $handler2->getHeaders());\n    }\n}\n\nclass TestFirePHPHandler extends FirePHPHandler\n{\n    protected $headers = array();\n\n    public static function reset()\n    {\n        self::$initialized = false;\n        self::$sendHeaders = true;\n        self::$messageIndex = 1;\n    }\n\n    protected function sendHeader($header, $content)\n    {\n        $this->headers[$header] = $content;\n    }\n\n    public function getHeaders()\n    {\n        return $this->headers;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/Fixtures/.gitkeep",
    "content": ""
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/FleepHookHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Logger;\nuse Monolog\\TestCase;\n\n/**\n * @coversDefaultClass \\Monolog\\Handler\\FleepHookHandler\n */\nclass FleepHookHandlerTest extends TestCase\n{\n    /**\n     * Default token to use in tests\n     */\n    const TOKEN = '123abc';\n\n    /**\n     * @var FleepHookHandler\n     */\n    private $handler;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        if (!extension_loaded('openssl')) {\n            $this->markTestSkipped('This test requires openssl extension to run');\n        }\n\n        // Create instances of the handler and logger for convenience\n        $this->handler = new FleepHookHandler(self::TOKEN);\n    }\n\n    /**\n     * @covers ::__construct\n     */\n    public function testConstructorSetsExpectedDefaults()\n    {\n        $this->assertEquals(Logger::DEBUG, $this->handler->getLevel());\n        $this->assertEquals(true, $this->handler->getBubble());\n    }\n\n    /**\n     * @covers ::getDefaultFormatter\n     */\n    public function testHandlerUsesLineFormatterWhichIgnoresEmptyArrays()\n    {\n        $record = array(\n            'message' => 'msg',\n            'context' => array(),\n            'level' => Logger::DEBUG,\n            'level_name' => Logger::getLevelName(Logger::DEBUG),\n            'channel' => 'channel',\n            'datetime' => new \\DateTime(),\n            'extra' => array(),\n        );\n\n        $expectedFormatter = new LineFormatter(null, null, true, true);\n        $expected = $expectedFormatter->format($record);\n\n        $handlerFormatter = $this->handler->getFormatter();\n        $actual = $handlerFormatter->format($record);\n\n        $this->assertEquals($expected, $actual, 'Empty context and extra arrays should not be rendered');\n    }\n\n    /**\n     * @covers ::__construct\n     */\n    public function testConnectionStringisConstructedCorrectly()\n    {\n        $this->assertEquals('ssl://' . FleepHookHandler::FLEEP_HOST . ':443', $this->handler->getConnectionString());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/FlowdockHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\FlowdockFormatter;\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * @author Dominik Liebler <liebler.dominik@gmail.com>\n * @see    https://www.hipchat.com/docs/api\n */\nclass FlowdockHandlerTest extends TestCase\n{\n    /**\n     * @var resource\n     */\n    private $res;\n\n    /**\n     * @var FlowdockHandler\n     */\n    private $handler;\n\n    public function setUp()\n    {\n        if (!extension_loaded('openssl')) {\n            $this->markTestSkipped('This test requires openssl to run');\n        }\n    }\n\n    public function testWriteHeader()\n    {\n        $this->createHandler();\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $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);\n\n        return $content;\n    }\n\n    /**\n     * @depends testWriteHeader\n     */\n    public function testWriteContent($content)\n    {\n        $this->assertRegexp('/\"source\":\"test_source\"/', $content);\n        $this->assertRegexp('/\"from_address\":\"source@test\\.com\"/', $content);\n    }\n\n    private function createHandler($token = 'myToken')\n    {\n        $constructorArgs = array($token, Logger::DEBUG);\n        $this->res = fopen('php://memory', 'a');\n        $this->handler = $this->getMock(\n            '\\Monolog\\Handler\\FlowdockHandler',\n            array('fsockopen', 'streamSetTimeout', 'closeSocket'),\n            $constructorArgs\n        );\n\n        $reflectionProperty = new \\ReflectionProperty('\\Monolog\\Handler\\SocketHandler', 'connectionString');\n        $reflectionProperty->setAccessible(true);\n        $reflectionProperty->setValue($this->handler, 'localhost:1234');\n\n        $this->handler->expects($this->any())\n            ->method('fsockopen')\n            ->will($this->returnValue($this->res));\n        $this->handler->expects($this->any())\n            ->method('streamSetTimeout')\n            ->will($this->returnValue(true));\n        $this->handler->expects($this->any())\n            ->method('closeSocket')\n            ->will($this->returnValue(true));\n\n        $this->handler->setFormatter(new FlowdockFormatter('test_source', 'source@test.com'));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerLegacyTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Gelf\\Message;\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\GelfMessageFormatter;\n\nclass GelfHandlerLegacyTest extends TestCase\n{\n    public function setUp()\n    {\n        if (!class_exists('Gelf\\MessagePublisher') || !class_exists('Gelf\\Message')) {\n            $this->markTestSkipped(\"mlehner/gelf-php not installed\");\n        }\n\n        require_once __DIR__ . '/GelfMockMessagePublisher.php';\n    }\n\n    /**\n     * @covers Monolog\\Handler\\GelfHandler::__construct\n     */\n    public function testConstruct()\n    {\n        $handler = new GelfHandler($this->getMessagePublisher());\n        $this->assertInstanceOf('Monolog\\Handler\\GelfHandler', $handler);\n    }\n\n    protected function getHandler($messagePublisher)\n    {\n        $handler = new GelfHandler($messagePublisher);\n\n        return $handler;\n    }\n\n    protected function getMessagePublisher()\n    {\n        return new GelfMockMessagePublisher('localhost');\n    }\n\n    public function testDebug()\n    {\n        $messagePublisher = $this->getMessagePublisher();\n        $handler = $this->getHandler($messagePublisher);\n\n        $record = $this->getRecord(Logger::DEBUG, \"A test debug message\");\n        $handler->handle($record);\n\n        $this->assertEquals(7, $messagePublisher->lastMessage->getLevel());\n        $this->assertEquals('test', $messagePublisher->lastMessage->getFacility());\n        $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage());\n        $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage());\n    }\n\n    public function testWarning()\n    {\n        $messagePublisher = $this->getMessagePublisher();\n        $handler = $this->getHandler($messagePublisher);\n\n        $record = $this->getRecord(Logger::WARNING, \"A test warning message\");\n        $handler->handle($record);\n\n        $this->assertEquals(4, $messagePublisher->lastMessage->getLevel());\n        $this->assertEquals('test', $messagePublisher->lastMessage->getFacility());\n        $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage());\n        $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage());\n    }\n\n    public function testInjectedGelfMessageFormatter()\n    {\n        $messagePublisher = $this->getMessagePublisher();\n        $handler = $this->getHandler($messagePublisher);\n\n        $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX'));\n\n        $record = $this->getRecord(Logger::WARNING, \"A test warning message\");\n        $record['extra']['blarg'] = 'yep';\n        $record['context']['from'] = 'logger';\n        $handler->handle($record);\n\n        $this->assertEquals('mysystem', $messagePublisher->lastMessage->getHost());\n        $this->assertArrayHasKey('_EXTblarg', $messagePublisher->lastMessage->toArray());\n        $this->assertArrayHasKey('_CTXfrom', $messagePublisher->lastMessage->toArray());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Gelf\\Message;\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\GelfMessageFormatter;\n\nclass GelfHandlerTest extends TestCase\n{\n    public function setUp()\n    {\n        if (!class_exists('Gelf\\Publisher') || !class_exists('Gelf\\Message')) {\n            $this->markTestSkipped(\"graylog2/gelf-php not installed\");\n        }\n    }\n\n    /**\n     * @covers Monolog\\Handler\\GelfHandler::__construct\n     */\n    public function testConstruct()\n    {\n        $handler = new GelfHandler($this->getMessagePublisher());\n        $this->assertInstanceOf('Monolog\\Handler\\GelfHandler', $handler);\n    }\n\n    protected function getHandler($messagePublisher)\n    {\n        $handler = new GelfHandler($messagePublisher);\n\n        return $handler;\n    }\n\n    protected function getMessagePublisher()\n    {\n        return $this->getMock('Gelf\\Publisher', array('publish'), array(), '', false);\n    }\n\n    public function testDebug()\n    {\n        $record = $this->getRecord(Logger::DEBUG, \"A test debug message\");\n        $expectedMessage = new Message();\n        $expectedMessage\n            ->setLevel(7)\n            ->setFacility(\"test\")\n            ->setShortMessage($record['message'])\n            ->setTimestamp($record['datetime'])\n        ;\n\n        $messagePublisher = $this->getMessagePublisher();\n        $messagePublisher->expects($this->once())\n            ->method('publish')\n            ->with($expectedMessage);\n\n        $handler = $this->getHandler($messagePublisher);\n\n        $handler->handle($record);\n    }\n\n    public function testWarning()\n    {\n        $record = $this->getRecord(Logger::WARNING, \"A test warning message\");\n        $expectedMessage = new Message();\n        $expectedMessage\n            ->setLevel(4)\n            ->setFacility(\"test\")\n            ->setShortMessage($record['message'])\n            ->setTimestamp($record['datetime'])\n        ;\n\n        $messagePublisher = $this->getMessagePublisher();\n        $messagePublisher->expects($this->once())\n            ->method('publish')\n            ->with($expectedMessage);\n\n        $handler = $this->getHandler($messagePublisher);\n\n        $handler->handle($record);\n    }\n\n    public function testInjectedGelfMessageFormatter()\n    {\n        $record = $this->getRecord(Logger::WARNING, \"A test warning message\");\n        $record['extra']['blarg'] = 'yep';\n        $record['context']['from'] = 'logger';\n\n        $expectedMessage = new Message();\n        $expectedMessage\n            ->setLevel(4)\n            ->setFacility(\"test\")\n            ->setHost(\"mysystem\")\n            ->setShortMessage($record['message'])\n            ->setTimestamp($record['datetime'])\n            ->setAdditional(\"EXTblarg\", 'yep')\n            ->setAdditional(\"CTXfrom\", 'logger')\n        ;\n\n        $messagePublisher = $this->getMessagePublisher();\n        $messagePublisher->expects($this->once())\n            ->method('publish')\n            ->with($expectedMessage);\n\n        $handler = $this->getHandler($messagePublisher);\n        $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX'));\n        $handler->handle($record);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/GelfMockMessagePublisher.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Gelf\\MessagePublisher;\nuse Gelf\\Message;\n\nclass GelfMockMessagePublisher extends MessagePublisher\n{\n    public function publish(Message $message)\n    {\n        $this->lastMessage = $message;\n    }\n\n    public $lastMessage = null;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\nclass GroupHandlerTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Handler\\GroupHandler::__construct\n     * @expectedException InvalidArgumentException\n     */\n    public function testConstructorOnlyTakesHandler()\n    {\n        new GroupHandler(array(new TestHandler(), \"foo\"));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\GroupHandler::__construct\n     * @covers Monolog\\Handler\\GroupHandler::handle\n     */\n    public function testHandle()\n    {\n        $testHandlers = array(new TestHandler(), new TestHandler());\n        $handler = new GroupHandler($testHandlers);\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        foreach ($testHandlers as $test) {\n            $this->assertTrue($test->hasDebugRecords());\n            $this->assertTrue($test->hasInfoRecords());\n            $this->assertTrue(count($test->getRecords()) === 2);\n        }\n    }\n\n    /**\n     * @covers Monolog\\Handler\\GroupHandler::handleBatch\n     */\n    public function testHandleBatch()\n    {\n        $testHandlers = array(new TestHandler(), new TestHandler());\n        $handler = new GroupHandler($testHandlers);\n        $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO)));\n        foreach ($testHandlers as $test) {\n            $this->assertTrue($test->hasDebugRecords());\n            $this->assertTrue($test->hasInfoRecords());\n            $this->assertTrue(count($test->getRecords()) === 2);\n        }\n    }\n\n    /**\n     * @covers Monolog\\Handler\\GroupHandler::isHandling\n     */\n    public function testIsHandling()\n    {\n        $testHandlers = array(new TestHandler(Logger::ERROR), new TestHandler(Logger::WARNING));\n        $handler = new GroupHandler($testHandlers);\n        $this->assertTrue($handler->isHandling($this->getRecord(Logger::ERROR)));\n        $this->assertTrue($handler->isHandling($this->getRecord(Logger::WARNING)));\n        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\GroupHandler::handle\n     */\n    public function testHandleUsesProcessors()\n    {\n        $test = new TestHandler();\n        $handler = new GroupHandler(array($test));\n        $handler->pushProcessor(function ($record) {\n            $record['extra']['foo'] = true;\n\n            return $record;\n        });\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertTrue($test->hasWarningRecords());\n        $records = $test->getRecords();\n        $this->assertTrue($records[0]['extra']['foo']);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\GroupHandler::handle\n     */\n    public function testHandleBatchUsesProcessors()\n    {\n        $testHandlers = array(new TestHandler(), new TestHandler());\n        $handler = new GroupHandler($testHandlers);\n        $handler->pushProcessor(function ($record) {\n            $record['extra']['foo'] = true;\n\n            return $record;\n        });\n        $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO)));\n        foreach ($testHandlers as $test) {\n            $this->assertTrue($test->hasDebugRecords());\n            $this->assertTrue($test->hasInfoRecords());\n            $this->assertTrue(count($test->getRecords()) === 2);\n            $records = $test->getRecords();\n            $this->assertTrue($records[0]['extra']['foo']);\n            $this->assertTrue($records[1]['extra']['foo']);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/HandlerWrapperTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\n\n/**\n * @author Alexey Karapetov <alexey@karapetov.com>\n */\nclass HandlerWrapperTest extends TestCase\n{\n    /**\n     * @var HandlerWrapper\n     */\n    private $wrapper;\n\n    private $handler;\n\n    public function setUp()\n    {\n        parent::setUp();\n        $this->handler = $this->getMock('Monolog\\\\Handler\\\\HandlerInterface');\n        $this->wrapper = new HandlerWrapper($this->handler);\n    }\n\n    /**\n     * @return array\n     */\n    public function trueFalseDataProvider()\n    {\n        return array(\n            array(true),\n            array(false),\n        );\n    }\n\n    /**\n     * @param $result\n     * @dataProvider trueFalseDataProvider\n     */\n    public function testIsHandling($result)\n    {\n        $record = $this->getRecord();\n        $this->handler->expects($this->once())\n            ->method('isHandling')\n            ->with($record)\n            ->willReturn($result);\n\n        $this->assertEquals($result, $this->wrapper->isHandling($record));\n    }\n\n    /**\n     * @param $result\n     * @dataProvider trueFalseDataProvider\n     */\n    public function testHandle($result)\n    {\n        $record = $this->getRecord();\n        $this->handler->expects($this->once())\n            ->method('handle')\n            ->with($record)\n            ->willReturn($result);\n\n        $this->assertEquals($result, $this->wrapper->handle($record));\n    }\n\n    /**\n     * @param $result\n     * @dataProvider trueFalseDataProvider\n     */\n    public function testHandleBatch($result)\n    {\n        $records = $this->getMultipleRecords();\n        $this->handler->expects($this->once())\n            ->method('handleBatch')\n            ->with($records)\n            ->willReturn($result);\n\n        $this->assertEquals($result, $this->wrapper->handleBatch($records));\n    }\n\n    public function testPushProcessor()\n    {\n        $processor = function () {};\n        $this->handler->expects($this->once())\n            ->method('pushProcessor')\n            ->with($processor);\n\n        $this->assertEquals($this->wrapper, $this->wrapper->pushProcessor($processor));\n    }\n\n    public function testPopProcessor()\n    {\n        $processor = function () {};\n        $this->handler->expects($this->once())\n            ->method('popProcessor')\n            ->willReturn($processor);\n\n        $this->assertEquals($processor, $this->wrapper->popProcessor());\n    }\n\n    public function testSetFormatter()\n    {\n        $formatter = $this->getMock('Monolog\\\\Formatter\\\\FormatterInterface');\n        $this->handler->expects($this->once())\n            ->method('setFormatter')\n            ->with($formatter);\n\n        $this->assertEquals($this->wrapper, $this->wrapper->setFormatter($formatter));\n    }\n\n    public function testGetFormatter()\n    {\n        $formatter = $this->getMock('Monolog\\\\Formatter\\\\FormatterInterface');\n        $this->handler->expects($this->once())\n            ->method('getFormatter')\n            ->willReturn($formatter);\n\n        $this->assertEquals($formatter, $this->wrapper->getFormatter());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * @author Rafael Dohms <rafael@doh.ms>\n * @see    https://www.hipchat.com/docs/api\n */\nclass HipChatHandlerTest extends TestCase\n{\n    private $res;\n    /** @var  HipChatHandler */\n    private $handler;\n\n    public function testWriteHeader()\n    {\n        $this->createHandler();\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $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);\n\n        return $content;\n    }\n\n    public function testWriteCustomHostHeader()\n    {\n        $this->createHandler('myToken', 'room1', 'Monolog', true, 'hipchat.foo.bar');\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $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);\n\n        return $content;\n    }\n\n    public function testWriteV2()\n    {\n        $this->createHandler('myToken', 'room1', 'Monolog', false, 'hipchat.foo.bar', 'v2');\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $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);\n\n        return $content;\n    }\n\n    public function testWriteV2Notify()\n    {\n        $this->createHandler('myToken', 'room1', 'Monolog', true, 'hipchat.foo.bar', 'v2');\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $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);\n\n        return $content;\n    }\n\n    public function testRoomSpaces()\n    {\n        $this->createHandler('myToken', 'room name', 'Monolog', false, 'hipchat.foo.bar', 'v2');\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $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);\n\n        return $content;\n    }\n\n    /**\n     * @depends testWriteHeader\n     */\n    public function testWriteContent($content)\n    {\n        $this->assertRegexp('/notify=0&message=test1&message_format=text&color=red&room_id=room1&from=Monolog$/', $content);\n    }\n\n    public function testWriteContentV1WithoutName()\n    {\n        $this->createHandler('myToken', 'room1', null, false, 'hipchat.foo.bar', 'v1');\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/notify=0&message=test1&message_format=text&color=red&room_id=room1&from=$/', $content);\n\n        return $content;\n    }\n\n    /**\n     * @depends testWriteCustomHostHeader\n     */\n    public function testWriteContentNotify($content)\n    {\n        $this->assertRegexp('/notify=1&message=test1&message_format=text&color=red&room_id=room1&from=Monolog$/', $content);\n    }\n\n    /**\n     * @depends testWriteV2\n     */\n    public function testWriteContentV2($content)\n    {\n        $this->assertRegexp('/notify=false&message=test1&message_format=text&color=red&from=Monolog$/', $content);\n    }\n\n    /**\n     * @depends testWriteV2Notify\n     */\n    public function testWriteContentV2Notify($content)\n    {\n        $this->assertRegexp('/notify=true&message=test1&message_format=text&color=red&from=Monolog$/', $content);\n    }\n\n    public function testWriteContentV2WithoutName()\n    {\n        $this->createHandler('myToken', 'room1', null, false, 'hipchat.foo.bar', 'v2');\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/notify=false&message=test1&message_format=text&color=red$/', $content);\n\n        return $content;\n    }\n\n    public function testWriteWithComplexMessage()\n    {\n        $this->createHandler();\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Backup of database \"example\" finished in 16 minutes.'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/message=Backup\\+of\\+database\\+%22example%22\\+finished\\+in\\+16\\+minutes\\./', $content);\n    }\n\n    public function testWriteTruncatesLongMessage()\n    {\n        $this->createHandler();\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, str_repeat('abcde', 2000)));\n        fseek($this->res, 0);\n        $content = fread($this->res, 12000);\n\n        $this->assertRegexp('/message='.str_repeat('abcde', 1900).'\\+%5Btruncated%5D/', $content);\n    }\n\n    /**\n     * @dataProvider provideLevelColors\n     */\n    public function testWriteWithErrorLevelsAndColors($level, $expectedColor)\n    {\n        $this->createHandler();\n        $this->handler->handle($this->getRecord($level, 'Backup of database \"example\" finished in 16 minutes.'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/color='.$expectedColor.'/', $content);\n    }\n\n    public function provideLevelColors()\n    {\n        return array(\n            array(Logger::DEBUG,    'gray'),\n            array(Logger::INFO,     'green'),\n            array(Logger::WARNING,  'yellow'),\n            array(Logger::ERROR,    'red'),\n            array(Logger::CRITICAL, 'red'),\n            array(Logger::ALERT,    'red'),\n            array(Logger::EMERGENCY,'red'),\n            array(Logger::NOTICE,   'green'),\n        );\n    }\n\n    /**\n     * @dataProvider provideBatchRecords\n     */\n    public function testHandleBatch($records, $expectedColor)\n    {\n        $this->createHandler();\n\n        $this->handler->handleBatch($records);\n\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/color='.$expectedColor.'/', $content);\n    }\n\n    public function provideBatchRecords()\n    {\n        return array(\n            array(\n                array(\n                    array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \\DateTime()),\n                    array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \\DateTime()),\n                    array('level' => Logger::CRITICAL, 'message' => 'Everything is broken!', 'level_name' => 'critical', 'datetime' => new \\DateTime()),\n                ),\n                'red',\n            ),\n            array(\n                array(\n                    array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \\DateTime()),\n                    array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \\DateTime()),\n                ),\n                'yellow',\n            ),\n            array(\n                array(\n                    array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \\DateTime()),\n                    array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \\DateTime()),\n                ),\n                'green',\n            ),\n            array(\n                array(\n                    array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \\DateTime()),\n                ),\n                'gray',\n            ),\n        );\n    }\n\n    private function createHandler($token = 'myToken', $room = 'room1', $name = 'Monolog', $notify = false, $host = 'api.hipchat.com', $version = 'v1')\n    {\n        $constructorArgs = array($token, $room, $name, $notify, Logger::DEBUG, true, true, 'text', $host, $version);\n        $this->res = fopen('php://memory', 'a');\n        $this->handler = $this->getMock(\n            '\\Monolog\\Handler\\HipChatHandler',\n            array('fsockopen', 'streamSetTimeout', 'closeSocket'),\n            $constructorArgs\n        );\n\n        $reflectionProperty = new \\ReflectionProperty('\\Monolog\\Handler\\SocketHandler', 'connectionString');\n        $reflectionProperty->setAccessible(true);\n        $reflectionProperty->setValue($this->handler, 'localhost:1234');\n\n        $this->handler->expects($this->any())\n            ->method('fsockopen')\n            ->will($this->returnValue($this->res));\n        $this->handler->expects($this->any())\n            ->method('streamSetTimeout')\n            ->will($this->returnValue(true));\n        $this->handler->expects($this->any())\n            ->method('closeSocket')\n            ->will($this->returnValue(true));\n\n        $this->handler->setFormatter($this->getIdentityFormatter());\n    }\n\n    /**\n     * @expectedException InvalidArgumentException\n     */\n    public function testCreateWithTooLongName()\n    {\n        $hipChatHandler = new HipChatHandler('token', 'room', 'SixteenCharsHere');\n    }\n\n    public function testCreateWithTooLongNameV2()\n    {\n        // creating a handler with too long of a name but using the v2 api doesn't matter.\n        $hipChatHandler = new HipChatHandler('token', 'room', 'SixteenCharsHere', false, Logger::CRITICAL, true, true, 'test', 'api.hipchat.com', 'v2');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * @author Robert Kaufmann III <rok3@rok3.me>\n */\nclass LogEntriesHandlerTest extends TestCase\n{\n    /**\n     * @var resource\n     */\n    private $res;\n\n    /**\n     * @var LogEntriesHandler\n     */\n    private $handler;\n\n    public function testWriteContent()\n    {\n        $this->createHandler();\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Critical write test'));\n\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/testToken \\[\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\] test.CRITICAL: Critical write test/', $content);\n    }\n\n    public function testWriteBatchContent()\n    {\n        $records = array(\n            $this->getRecord(),\n            $this->getRecord(),\n            $this->getRecord(),\n        );\n        $this->createHandler();\n        $this->handler->handleBatch($records);\n\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/(testToken \\[\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\] .* \\[\\] \\[\\]\\n){3}/', $content);\n    }\n\n    private function createHandler()\n    {\n        $useSSL = extension_loaded('openssl');\n        $args = array('testToken', $useSSL, Logger::DEBUG, true);\n        $this->res = fopen('php://memory', 'a');\n        $this->handler = $this->getMock(\n            '\\Monolog\\Handler\\LogEntriesHandler',\n            array('fsockopen', 'streamSetTimeout', 'closeSocket'),\n            $args\n        );\n\n        $reflectionProperty = new \\ReflectionProperty('\\Monolog\\Handler\\SocketHandler', 'connectionString');\n        $reflectionProperty->setAccessible(true);\n        $reflectionProperty->setValue($this->handler, 'localhost:1234');\n\n        $this->handler->expects($this->any())\n            ->method('fsockopen')\n            ->will($this->returnValue($this->res));\n        $this->handler->expects($this->any())\n            ->method('streamSetTimeout')\n            ->will($this->returnValue(true));\n        $this->handler->expects($this->any())\n            ->method('closeSocket')\n            ->will($this->returnValue(true));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\TestCase;\n\nclass MailHandlerTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Handler\\MailHandler::handleBatch\n     */\n    public function testHandleBatch()\n    {\n        $formatter = $this->getMock('Monolog\\\\Formatter\\\\FormatterInterface');\n        $formatter->expects($this->once())\n            ->method('formatBatch'); // Each record is formatted\n\n        $handler = $this->getMockForAbstractClass('Monolog\\\\Handler\\\\MailHandler');\n        $handler->expects($this->once())\n            ->method('send');\n        $handler->expects($this->never())\n            ->method('write'); // write is for individual records\n\n        $handler->setFormatter($formatter);\n\n        $handler->handleBatch($this->getMultipleRecords());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\MailHandler::handleBatch\n     */\n    public function testHandleBatchNotSendsMailIfMessagesAreBelowLevel()\n    {\n        $records = array(\n            $this->getRecord(Logger::DEBUG, 'debug message 1'),\n            $this->getRecord(Logger::DEBUG, 'debug message 2'),\n            $this->getRecord(Logger::INFO, 'information'),\n        );\n\n        $handler = $this->getMockForAbstractClass('Monolog\\\\Handler\\\\MailHandler');\n        $handler->expects($this->never())\n            ->method('send');\n        $handler->setLevel(Logger::ERROR);\n\n        $handler->handleBatch($records);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\MailHandler::write\n     */\n    public function testHandle()\n    {\n        $handler = $this->getMockForAbstractClass('Monolog\\\\Handler\\\\MailHandler');\n\n        $record = $this->getRecord();\n        $records = array($record);\n        $records[0]['formatted'] = '['.$record['datetime']->format('Y-m-d H:i:s').'] test.WARNING: test [] []'.\"\\n\";\n\n        $handler->expects($this->once())\n            ->method('send')\n            ->with($records[0]['formatted'], $records);\n\n        $handler->handle($record);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Raven_Client;\n\nclass MockRavenClient extends Raven_Client\n{\n    public function capture($data, $stack, $vars = null)\n    {\n        $data = array_merge($this->get_user_data(), $data);\n        $this->lastData = $data;\n        $this->lastStack = $stack;\n    }\n\n    public $lastData;\n    public $lastStack;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\nclass MongoDBHandlerTest extends TestCase\n{\n    /**\n     * @expectedException InvalidArgumentException\n     */\n    public function testConstructorShouldThrowExceptionForInvalidMongo()\n    {\n        new MongoDBHandler(new \\stdClass(), 'DB', 'Collection');\n    }\n\n    public function testHandle()\n    {\n        $mongo = $this->getMock('Mongo', array('selectCollection'), array(), '', false);\n        $collection = $this->getMock('stdClass', array('save'));\n\n        $mongo->expects($this->once())\n            ->method('selectCollection')\n            ->with('DB', 'Collection')\n            ->will($this->returnValue($collection));\n\n        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \\stdClass, 'foo' => 34));\n\n        $expected = array(\n            'message' => 'test',\n            'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34),\n            'level' => Logger::WARNING,\n            'level_name' => 'WARNING',\n            'channel' => 'test',\n            'datetime' => $record['datetime']->format('Y-m-d H:i:s'),\n            'extra' => array(),\n        );\n\n        $collection->expects($this->once())\n            ->method('save')\n            ->with($expected);\n\n        $handler = new MongoDBHandler($mongo, 'DB', 'Collection');\n        $handler->handle($record);\n    }\n}\n\nif (!class_exists('Mongo')) {\n    class Mongo\n    {\n        public function selectCollection()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse InvalidArgumentException;\n\nfunction mail($to, $subject, $message, $additional_headers = null, $additional_parameters = null)\n{\n    $GLOBALS['mail'][] = func_get_args();\n}\n\nclass NativeMailerHandlerTest extends TestCase\n{\n    protected function setUp()\n    {\n        $GLOBALS['mail'] = array();\n    }\n\n    /**\n     * @expectedException InvalidArgumentException\n     */\n    public function testConstructorHeaderInjection()\n    {\n        $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', \"receiver@example.org\\r\\nFrom: faked@attacker.org\");\n    }\n\n    /**\n     * @expectedException InvalidArgumentException\n     */\n    public function testSetterHeaderInjection()\n    {\n        $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org');\n        $mailer->addHeader(\"Content-Type: text/html\\r\\nFrom: faked@attacker.org\");\n    }\n\n    /**\n     * @expectedException InvalidArgumentException\n     */\n    public function testSetterArrayHeaderInjection()\n    {\n        $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org');\n        $mailer->addHeader(array(\"Content-Type: text/html\\r\\nFrom: faked@attacker.org\"));\n    }\n\n    /**\n     * @expectedException InvalidArgumentException\n     */\n    public function testSetterContentTypeInjection()\n    {\n        $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org');\n        $mailer->setContentType(\"text/html\\r\\nFrom: faked@attacker.org\");\n    }\n\n    /**\n     * @expectedException InvalidArgumentException\n     */\n    public function testSetterEncodingInjection()\n    {\n        $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org');\n        $mailer->setEncoding(\"utf-8\\r\\nFrom: faked@attacker.org\");\n    }\n\n    public function testSend()\n    {\n        $to = 'spammer@example.org';\n        $subject = 'dear victim';\n        $from = 'receiver@example.org';\n\n        $mailer = new NativeMailerHandler($to, $subject, $from);\n        $mailer->handleBatch(array());\n\n        // batch is empty, nothing sent\n        $this->assertEmpty($GLOBALS['mail']);\n\n        // non-empty batch\n        $mailer->handle($this->getRecord(Logger::ERROR, \"Foo\\nBar\\r\\n\\r\\nBaz\"));\n        $this->assertNotEmpty($GLOBALS['mail']);\n        $this->assertInternalType('array', $GLOBALS['mail']);\n        $this->assertArrayHasKey('0', $GLOBALS['mail']);\n        $params = $GLOBALS['mail'][0];\n        $this->assertCount(5, $params);\n        $this->assertSame($to, $params[0]);\n        $this->assertSame($subject, $params[1]);\n        $this->assertStringEndsWith(\" test.ERROR: Foo Bar  Baz [] []\\n\", $params[2]);\n        $this->assertSame(\"From: $from\\r\\nContent-type: text/plain; charset=utf-8\\r\\n\", $params[3]);\n        $this->assertSame('', $params[4]);\n    }\n\n    public function testMessageSubjectFormatting()\n    {\n        $mailer = new NativeMailerHandler('to@example.org', 'Alert: %level_name% %message%', 'from@example.org');\n        $mailer->handle($this->getRecord(Logger::ERROR, \"Foo\\nBar\\r\\n\\r\\nBaz\"));\n        $this->assertNotEmpty($GLOBALS['mail']);\n        $this->assertInternalType('array', $GLOBALS['mail']);\n        $this->assertArrayHasKey('0', $GLOBALS['mail']);\n        $params = $GLOBALS['mail'][0];\n        $this->assertCount(5, $params);\n        $this->assertSame('Alert: ERROR Foo Bar  Baz', $params[1]);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\nclass NewRelicHandlerTest extends TestCase\n{\n    public static $appname;\n    public static $customParameters;\n    public static $transactionName;\n\n    public function setUp()\n    {\n        self::$appname = null;\n        self::$customParameters = array();\n        self::$transactionName = null;\n    }\n\n    /**\n     * @expectedException Monolog\\Handler\\MissingExtensionException\n     */\n    public function testThehandlerThrowsAnExceptionIfTheNRExtensionIsNotLoaded()\n    {\n        $handler = new StubNewRelicHandlerWithoutExtension();\n        $handler->handle($this->getRecord(Logger::ERROR));\n    }\n\n    public function testThehandlerCanHandleTheRecord()\n    {\n        $handler = new StubNewRelicHandler();\n        $handler->handle($this->getRecord(Logger::ERROR));\n    }\n\n    public function testThehandlerCanAddContextParamsToTheNewRelicTrace()\n    {\n        $handler = new StubNewRelicHandler();\n        $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('a' => 'b')));\n        $this->assertEquals(array('context_a' => 'b'), self::$customParameters);\n    }\n\n    public function testThehandlerCanAddExplodedContextParamsToTheNewRelicTrace()\n    {\n        $handler = new StubNewRelicHandler(Logger::ERROR, true, self::$appname, true);\n        $handler->handle($this->getRecord(\n            Logger::ERROR,\n            'log message',\n            array('a' => array('key1' => 'value1', 'key2' => 'value2'))\n        ));\n        $this->assertEquals(\n            array('context_a_key1' => 'value1', 'context_a_key2' => 'value2'),\n            self::$customParameters\n        );\n    }\n\n    public function testThehandlerCanAddExtraParamsToTheNewRelicTrace()\n    {\n        $record = $this->getRecord(Logger::ERROR, 'log message');\n        $record['extra'] = array('c' => 'd');\n\n        $handler = new StubNewRelicHandler();\n        $handler->handle($record);\n\n        $this->assertEquals(array('extra_c' => 'd'), self::$customParameters);\n    }\n\n    public function testThehandlerCanAddExplodedExtraParamsToTheNewRelicTrace()\n    {\n        $record = $this->getRecord(Logger::ERROR, 'log message');\n        $record['extra'] = array('c' => array('key1' => 'value1', 'key2' => 'value2'));\n\n        $handler = new StubNewRelicHandler(Logger::ERROR, true, self::$appname, true);\n        $handler->handle($record);\n\n        $this->assertEquals(\n            array('extra_c_key1' => 'value1', 'extra_c_key2' => 'value2'),\n            self::$customParameters\n        );\n    }\n\n    public function testThehandlerCanAddExtraContextAndParamsToTheNewRelicTrace()\n    {\n        $record = $this->getRecord(Logger::ERROR, 'log message', array('a' => 'b'));\n        $record['extra'] = array('c' => 'd');\n\n        $handler = new StubNewRelicHandler();\n        $handler->handle($record);\n\n        $expected = array(\n            'context_a' => 'b',\n            'extra_c' => 'd',\n        );\n\n        $this->assertEquals($expected, self::$customParameters);\n    }\n\n    public function testThehandlerCanHandleTheRecordsFormattedUsingTheLineFormatter()\n    {\n        $handler = new StubNewRelicHandler();\n        $handler->setFormatter(new LineFormatter());\n        $handler->handle($this->getRecord(Logger::ERROR));\n    }\n\n    public function testTheAppNameIsNullByDefault()\n    {\n        $handler = new StubNewRelicHandler();\n        $handler->handle($this->getRecord(Logger::ERROR, 'log message'));\n\n        $this->assertEquals(null, self::$appname);\n    }\n\n    public function testTheAppNameCanBeInjectedFromtheConstructor()\n    {\n        $handler = new StubNewRelicHandler(Logger::DEBUG, false, 'myAppName');\n        $handler->handle($this->getRecord(Logger::ERROR, 'log message'));\n\n        $this->assertEquals('myAppName', self::$appname);\n    }\n\n    public function testTheAppNameCanBeOverriddenFromEachLog()\n    {\n        $handler = new StubNewRelicHandler(Logger::DEBUG, false, 'myAppName');\n        $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('appname' => 'logAppName')));\n\n        $this->assertEquals('logAppName', self::$appname);\n    }\n\n    public function testTheTransactionNameIsNullByDefault()\n    {\n        $handler = new StubNewRelicHandler();\n        $handler->handle($this->getRecord(Logger::ERROR, 'log message'));\n\n        $this->assertEquals(null, self::$transactionName);\n    }\n\n    public function testTheTransactionNameCanBeInjectedFromTheConstructor()\n    {\n        $handler = new StubNewRelicHandler(Logger::DEBUG, false, null, false, 'myTransaction');\n        $handler->handle($this->getRecord(Logger::ERROR, 'log message'));\n\n        $this->assertEquals('myTransaction', self::$transactionName);\n    }\n\n    public function testTheTransactionNameCanBeOverriddenFromEachLog()\n    {\n        $handler = new StubNewRelicHandler(Logger::DEBUG, false, null, false, 'myTransaction');\n        $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('transaction_name' => 'logTransactName')));\n\n        $this->assertEquals('logTransactName', self::$transactionName);\n    }\n}\n\nclass StubNewRelicHandlerWithoutExtension extends NewRelicHandler\n{\n    protected function isNewRelicEnabled()\n    {\n        return false;\n    }\n}\n\nclass StubNewRelicHandler extends NewRelicHandler\n{\n    protected function isNewRelicEnabled()\n    {\n        return true;\n    }\n}\n\nfunction newrelic_notice_error()\n{\n    return true;\n}\n\nfunction newrelic_set_appname($appname)\n{\n    return NewRelicHandlerTest::$appname = $appname;\n}\n\nfunction newrelic_name_transaction($transactionName)\n{\n    return NewRelicHandlerTest::$transactionName = $transactionName;\n}\n\nfunction newrelic_add_custom_parameter($key, $value)\n{\n    NewRelicHandlerTest::$customParameters[$key] = $value;\n\n    return true;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * @covers Monolog\\Handler\\NullHandler::handle\n */\nclass NullHandlerTest extends TestCase\n{\n    public function testHandle()\n    {\n        $handler = new NullHandler();\n        $this->assertTrue($handler->handle($this->getRecord()));\n    }\n\n    public function testHandleLowerLevelRecord()\n    {\n        $handler = new NullHandler(Logger::WARNING);\n        $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG)));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/PHPConsoleHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Exception;\nuse Monolog\\ErrorHandler;\nuse Monolog\\Logger;\nuse Monolog\\TestCase;\nuse PhpConsole\\Connector;\nuse PhpConsole\\Dispatcher\\Debug as DebugDispatcher;\nuse PhpConsole\\Dispatcher\\Errors as ErrorDispatcher;\nuse PhpConsole\\Handler;\nuse PHPUnit_Framework_MockObject_MockObject;\n\n/**\n * @covers Monolog\\Handler\\PHPConsoleHandler\n * @author Sergey Barbushin https://www.linkedin.com/in/barbushin\n */\nclass PHPConsoleHandlerTest extends TestCase\n{\n    /** @var  Connector|PHPUnit_Framework_MockObject_MockObject */\n    protected $connector;\n    /** @var  DebugDispatcher|PHPUnit_Framework_MockObject_MockObject */\n    protected $debugDispatcher;\n    /** @var  ErrorDispatcher|PHPUnit_Framework_MockObject_MockObject */\n    protected $errorDispatcher;\n\n    protected function setUp()\n    {\n        if (!class_exists('PhpConsole\\Connector')) {\n            $this->markTestSkipped('PHP Console library not found. See https://github.com/barbushin/php-console#installation');\n        }\n        $this->connector = $this->initConnectorMock();\n\n        $this->debugDispatcher = $this->initDebugDispatcherMock($this->connector);\n        $this->connector->setDebugDispatcher($this->debugDispatcher);\n\n        $this->errorDispatcher = $this->initErrorDispatcherMock($this->connector);\n        $this->connector->setErrorsDispatcher($this->errorDispatcher);\n    }\n\n    protected function initDebugDispatcherMock(Connector $connector)\n    {\n        return $this->getMockBuilder('PhpConsole\\Dispatcher\\Debug')\n            ->disableOriginalConstructor()\n            ->setMethods(array('dispatchDebug'))\n            ->setConstructorArgs(array($connector, $connector->getDumper()))\n            ->getMock();\n    }\n\n    protected function initErrorDispatcherMock(Connector $connector)\n    {\n        return $this->getMockBuilder('PhpConsole\\Dispatcher\\Errors')\n            ->disableOriginalConstructor()\n            ->setMethods(array('dispatchError', 'dispatchException'))\n            ->setConstructorArgs(array($connector, $connector->getDumper()))\n            ->getMock();\n    }\n\n    protected function initConnectorMock()\n    {\n        $connector = $this->getMockBuilder('PhpConsole\\Connector')\n            ->disableOriginalConstructor()\n            ->setMethods(array(\n                'sendMessage',\n                'onShutDown',\n                'isActiveClient',\n                'setSourcesBasePath',\n                'setServerEncoding',\n                'setPassword',\n                'enableSslOnlyMode',\n                'setAllowedIpMasks',\n                'setHeadersLimit',\n                'startEvalRequestsListener',\n            ))\n            ->getMock();\n\n        $connector->expects($this->any())\n            ->method('isActiveClient')\n            ->will($this->returnValue(true));\n\n        return $connector;\n    }\n\n    protected function getHandlerDefaultOption($name)\n    {\n        $handler = new PHPConsoleHandler(array(), $this->connector);\n        $options = $handler->getOptions();\n\n        return $options[$name];\n    }\n\n    protected function initLogger($handlerOptions = array(), $level = Logger::DEBUG)\n    {\n        return new Logger('test', array(\n            new PHPConsoleHandler($handlerOptions, $this->connector, $level),\n        ));\n    }\n\n    public function testInitWithDefaultConnector()\n    {\n        $handler = new PHPConsoleHandler();\n        $this->assertEquals(spl_object_hash(Connector::getInstance()), spl_object_hash($handler->getConnector()));\n    }\n\n    public function testInitWithCustomConnector()\n    {\n        $handler = new PHPConsoleHandler(array(), $this->connector);\n        $this->assertEquals(spl_object_hash($this->connector), spl_object_hash($handler->getConnector()));\n    }\n\n    public function testDebug()\n    {\n        $this->debugDispatcher->expects($this->once())->method('dispatchDebug')->with($this->equalTo('test'));\n        $this->initLogger()->addDebug('test');\n    }\n\n    public function testDebugContextInMessage()\n    {\n        $message = 'test';\n        $tag = 'tag';\n        $context = array($tag, 'custom' => mt_rand());\n        $expectedMessage = $message . ' ' . json_encode(array_slice($context, 1));\n        $this->debugDispatcher->expects($this->once())->method('dispatchDebug')->with(\n            $this->equalTo($expectedMessage),\n            $this->equalTo($tag)\n        );\n        $this->initLogger()->addDebug($message, $context);\n    }\n\n    public function testDebugTags($tagsContextKeys = null)\n    {\n        $expectedTags = mt_rand();\n        $logger = $this->initLogger($tagsContextKeys ? array('debugTagsKeysInContext' => $tagsContextKeys) : array());\n        if (!$tagsContextKeys) {\n            $tagsContextKeys = $this->getHandlerDefaultOption('debugTagsKeysInContext');\n        }\n        foreach ($tagsContextKeys as $key) {\n            $debugDispatcher = $this->initDebugDispatcherMock($this->connector);\n            $debugDispatcher->expects($this->once())->method('dispatchDebug')->with(\n                $this->anything(),\n                $this->equalTo($expectedTags)\n            );\n            $this->connector->setDebugDispatcher($debugDispatcher);\n            $logger->addDebug('test', array($key => $expectedTags));\n        }\n    }\n\n    public function testError($classesPartialsTraceIgnore = null)\n    {\n        $code = E_USER_NOTICE;\n        $message = 'message';\n        $file = __FILE__;\n        $line = __LINE__;\n        $this->errorDispatcher->expects($this->once())->method('dispatchError')->with(\n            $this->equalTo($code),\n            $this->equalTo($message),\n            $this->equalTo($file),\n            $this->equalTo($line),\n            $classesPartialsTraceIgnore ?: $this->equalTo($this->getHandlerDefaultOption('classesPartialsTraceIgnore'))\n        );\n        $errorHandler = ErrorHandler::register($this->initLogger($classesPartialsTraceIgnore ? array('classesPartialsTraceIgnore' => $classesPartialsTraceIgnore) : array()), false);\n        $errorHandler->registerErrorHandler(array(), false, E_USER_WARNING);\n        $errorHandler->handleError($code, $message, $file, $line);\n    }\n\n    public function testException()\n    {\n        $e = new Exception();\n        $this->errorDispatcher->expects($this->once())->method('dispatchException')->with(\n            $this->equalTo($e)\n        );\n        $handler = $this->initLogger();\n        $handler->log(\n            \\Psr\\Log\\LogLevel::ERROR,\n            sprintf('Uncaught Exception %s: \"%s\" at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()),\n            array('exception' => $e)\n        );\n    }\n\n    /**\n     * @expectedException Exception\n     */\n    public function testWrongOptionsThrowsException()\n    {\n        new PHPConsoleHandler(array('xxx' => 1));\n    }\n\n    public function testOptionEnabled()\n    {\n        $this->debugDispatcher->expects($this->never())->method('dispatchDebug');\n        $this->initLogger(array('enabled' => false))->addDebug('test');\n    }\n\n    public function testOptionClassesPartialsTraceIgnore()\n    {\n        $this->testError(array('Class', 'Namespace\\\\'));\n    }\n\n    public function testOptionDebugTagsKeysInContext()\n    {\n        $this->testDebugTags(array('key1', 'key2'));\n    }\n\n    public function testOptionUseOwnErrorsAndExceptionsHandler()\n    {\n        $this->initLogger(array('useOwnErrorsHandler' => true, 'useOwnExceptionsHandler' => true));\n        $this->assertEquals(array(Handler::getInstance(), 'handleError'), set_error_handler(function () {\n        }));\n        $this->assertEquals(array(Handler::getInstance(), 'handleException'), set_exception_handler(function () {\n        }));\n    }\n\n    public static function provideConnectorMethodsOptionsSets()\n    {\n        return array(\n            array('sourcesBasePath', 'setSourcesBasePath', __DIR__),\n            array('serverEncoding', 'setServerEncoding', 'cp1251'),\n            array('password', 'setPassword', '******'),\n            array('enableSslOnlyMode', 'enableSslOnlyMode', true, false),\n            array('ipMasks', 'setAllowedIpMasks', array('127.0.0.*')),\n            array('headersLimit', 'setHeadersLimit', 2500),\n            array('enableEvalListener', 'startEvalRequestsListener', true, false),\n        );\n    }\n\n    /**\n     * @dataProvider provideConnectorMethodsOptionsSets\n     */\n    public function testOptionCallsConnectorMethod($option, $method, $value, $isArgument = true)\n    {\n        $expectCall = $this->connector->expects($this->once())->method($method);\n        if ($isArgument) {\n            $expectCall->with($value);\n        }\n        new PHPConsoleHandler(array($option => $value), $this->connector);\n    }\n\n    public function testOptionDetectDumpTraceAndSource()\n    {\n        new PHPConsoleHandler(array('detectDumpTraceAndSource' => true), $this->connector);\n        $this->assertTrue($this->connector->getDebugDispatcher()->detectTraceAndSource);\n    }\n\n    public static function provideDumperOptionsValues()\n    {\n        return array(\n            array('dumperLevelLimit', 'levelLimit', 1001),\n            array('dumperItemsCountLimit', 'itemsCountLimit', 1002),\n            array('dumperItemSizeLimit', 'itemSizeLimit', 1003),\n            array('dumperDumpSizeLimit', 'dumpSizeLimit', 1004),\n            array('dumperDetectCallbacks', 'detectCallbacks', true),\n        );\n    }\n\n    /**\n     * @dataProvider provideDumperOptionsValues\n     */\n    public function testDumperOptions($option, $dumperProperty, $value)\n    {\n        new PHPConsoleHandler(array($option => $value), $this->connector);\n        $this->assertEquals($value, $this->connector->getDumper()->$dumperProperty);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/PsrHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * @covers Monolog\\Handler\\PsrHandler::handle\n */\nclass PsrHandlerTest extends TestCase\n{\n    public function logLevelProvider()\n    {\n        $levels = array();\n        $monologLogger = new Logger('');\n\n        foreach ($monologLogger->getLevels() as $levelName => $level) {\n            $levels[] = array($levelName, $level);\n        }\n\n        return $levels;\n    }\n\n    /**\n     * @dataProvider logLevelProvider\n     */\n    public function testHandlesAllLevels($levelName, $level)\n    {\n        $message = 'Hello, world! ' . $level;\n        $context = array('foo' => 'bar', 'level' => $level);\n\n        $psrLogger = $this->getMock('Psr\\Log\\NullLogger');\n        $psrLogger->expects($this->once())\n            ->method('log')\n            ->with(strtolower($levelName), $message, $context);\n\n        $handler = new PsrHandler($psrLogger);\n        $handler->handle(array('level' => $level, 'level_name' => $levelName, 'message' => $message, 'context' => $context));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * Almost all examples (expected header, titles, messages) taken from\n * https://www.pushover.net/api\n * @author Sebastian Göttschkes <sebastian.goettschkes@googlemail.com>\n * @see https://www.pushover.net/api\n */\nclass PushoverHandlerTest extends TestCase\n{\n    private $res;\n    private $handler;\n\n    public function testWriteHeader()\n    {\n        $this->createHandler();\n        $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $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);\n\n        return $content;\n    }\n\n    /**\n     * @depends testWriteHeader\n     */\n    public function testWriteContent($content)\n    {\n        $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog&timestamp=\\d{10}$/', $content);\n    }\n\n    public function testWriteWithComplexTitle()\n    {\n        $this->createHandler('myToken', 'myUser', 'Backup finished - SQL1');\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/title=Backup\\+finished\\+-\\+SQL1/', $content);\n    }\n\n    public function testWriteWithComplexMessage()\n    {\n        $this->createHandler();\n        $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Backup of database \"example\" finished in 16 minutes.'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/message=Backup\\+of\\+database\\+%22example%22\\+finished\\+in\\+16\\+minutes\\./', $content);\n    }\n\n    public function testWriteWithTooLongMessage()\n    {\n        $message = str_pad('test', 520, 'a');\n        $this->createHandler();\n        $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, $message));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $expectedMessage = substr($message, 0, 505);\n\n        $this->assertRegexp('/message=' . $expectedMessage . '&title/', $content);\n    }\n\n    public function testWriteWithHighPriority()\n    {\n        $this->createHandler();\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog&timestamp=\\d{10}&priority=1$/', $content);\n    }\n\n    public function testWriteWithEmergencyPriority()\n    {\n        $this->createHandler();\n        $this->handler->handle($this->getRecord(Logger::EMERGENCY, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog&timestamp=\\d{10}&priority=2&retry=30&expire=25200$/', $content);\n    }\n\n    public function testWriteToMultipleUsers()\n    {\n        $this->createHandler('myToken', array('userA', 'userB'));\n        $this->handler->handle($this->getRecord(Logger::EMERGENCY, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/token=myToken&user=userA&message=test1&title=Monolog&timestamp=\\d{10}&priority=2&retry=30&expire=25200POST/', $content);\n        $this->assertRegexp('/token=myToken&user=userB&message=test1&title=Monolog&timestamp=\\d{10}&priority=2&retry=30&expire=25200$/', $content);\n    }\n\n    private function createHandler($token = 'myToken', $user = 'myUser', $title = 'Monolog')\n    {\n        $constructorArgs = array($token, $user, $title);\n        $this->res = fopen('php://memory', 'a');\n        $this->handler = $this->getMock(\n            '\\Monolog\\Handler\\PushoverHandler',\n            array('fsockopen', 'streamSetTimeout', 'closeSocket'),\n            $constructorArgs\n        );\n\n        $reflectionProperty = new \\ReflectionProperty('\\Monolog\\Handler\\SocketHandler', 'connectionString');\n        $reflectionProperty->setAccessible(true);\n        $reflectionProperty->setValue($this->handler, 'localhost:1234');\n\n        $this->handler->expects($this->any())\n            ->method('fsockopen')\n            ->will($this->returnValue($this->res));\n        $this->handler->expects($this->any())\n            ->method('streamSetTimeout')\n            ->will($this->returnValue(true));\n        $this->handler->expects($this->any())\n            ->method('closeSocket')\n            ->will($this->returnValue(true));\n\n        $this->handler->setFormatter($this->getIdentityFormatter());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\LineFormatter;\n\nclass RavenHandlerTest extends TestCase\n{\n    public function setUp()\n    {\n        if (!class_exists('Raven_Client')) {\n            $this->markTestSkipped('raven/raven not installed');\n        }\n\n        require_once __DIR__ . '/MockRavenClient.php';\n    }\n\n    /**\n     * @covers Monolog\\Handler\\RavenHandler::__construct\n     */\n    public function testConstruct()\n    {\n        $handler = new RavenHandler($this->getRavenClient());\n        $this->assertInstanceOf('Monolog\\Handler\\RavenHandler', $handler);\n    }\n\n    protected function getHandler($ravenClient)\n    {\n        $handler = new RavenHandler($ravenClient);\n\n        return $handler;\n    }\n\n    protected function getRavenClient()\n    {\n        $dsn = 'http://43f6017361224d098402974103bfc53d:a6a0538fc2934ba2bed32e08741b2cd3@marca.python.live.cheggnet.com:9000/1';\n\n        return new MockRavenClient($dsn);\n    }\n\n    public function testDebug()\n    {\n        $ravenClient = $this->getRavenClient();\n        $handler = $this->getHandler($ravenClient);\n\n        $record = $this->getRecord(Logger::DEBUG, 'A test debug message');\n        $handler->handle($record);\n\n        $this->assertEquals($ravenClient::DEBUG, $ravenClient->lastData['level']);\n        $this->assertContains($record['message'], $ravenClient->lastData['message']);\n    }\n\n    public function testWarning()\n    {\n        $ravenClient = $this->getRavenClient();\n        $handler = $this->getHandler($ravenClient);\n\n        $record = $this->getRecord(Logger::WARNING, 'A test warning message');\n        $handler->handle($record);\n\n        $this->assertEquals($ravenClient::WARNING, $ravenClient->lastData['level']);\n        $this->assertContains($record['message'], $ravenClient->lastData['message']);\n    }\n\n    public function testTag()\n    {\n        $ravenClient = $this->getRavenClient();\n        $handler = $this->getHandler($ravenClient);\n\n        $tags = array(1, 2, 'foo');\n        $record = $this->getRecord(Logger::INFO, 'test', array('tags' => $tags));\n        $handler->handle($record);\n\n        $this->assertEquals($tags, $ravenClient->lastData['tags']);\n    }\n\n    public function testExtraParameters()\n    {\n        $ravenClient = $this->getRavenClient();\n        $handler = $this->getHandler($ravenClient);\n\n        $checksum = '098f6bcd4621d373cade4e832627b4f6';\n        $release = '05a671c66aefea124cc08b76ea6d30bb';\n        $eventId = '31423';\n        $record = $this->getRecord(Logger::INFO, 'test', array('checksum' => $checksum, 'release' => $release, 'event_id' => $eventId));\n        $handler->handle($record);\n\n        $this->assertEquals($checksum, $ravenClient->lastData['checksum']);\n        $this->assertEquals($release, $ravenClient->lastData['release']);\n        $this->assertEquals($eventId, $ravenClient->lastData['event_id']);\n    }\n\n    public function testFingerprint()\n    {\n        $ravenClient = $this->getRavenClient();\n        $handler = $this->getHandler($ravenClient);\n\n        $fingerprint = array('{{ default }}', 'other value');\n        $record = $this->getRecord(Logger::INFO, 'test', array('fingerprint' => $fingerprint));\n        $handler->handle($record);\n\n        $this->assertEquals($fingerprint, $ravenClient->lastData['fingerprint']);\n    }\n\n    public function testUserContext()\n    {\n        $ravenClient = $this->getRavenClient();\n        $handler = $this->getHandler($ravenClient);\n\n        $recordWithNoContext = $this->getRecord(Logger::INFO, 'test with default user context');\n        // set user context 'externally'\n\n        $user = array(\n            'id' => '123',\n            'email' => 'test@test.com',\n        );\n\n        $recordWithContext = $this->getRecord(Logger::INFO, 'test', array('user' => $user));\n\n        $ravenClient->user_context(array('id' => 'test_user_id'));\n        // handle context\n        $handler->handle($recordWithContext);\n        $this->assertEquals($user, $ravenClient->lastData['user']);\n\n        // check to see if its reset\n        $handler->handle($recordWithNoContext);\n        $this->assertInternalType('array', $ravenClient->context->user);\n        $this->assertSame('test_user_id', $ravenClient->context->user['id']);\n\n        // handle with null context\n        $ravenClient->user_context(null);\n        $handler->handle($recordWithContext);\n        $this->assertEquals($user, $ravenClient->lastData['user']);\n\n        // check to see if its reset\n        $handler->handle($recordWithNoContext);\n        $this->assertNull($ravenClient->context->user);\n    }\n\n    public function testException()\n    {\n        $ravenClient = $this->getRavenClient();\n        $handler = $this->getHandler($ravenClient);\n\n        try {\n            $this->methodThatThrowsAnException();\n        } catch (\\Exception $e) {\n            $record = $this->getRecord(Logger::ERROR, $e->getMessage(), array('exception' => $e));\n            $handler->handle($record);\n        }\n\n        $this->assertEquals($record['message'], $ravenClient->lastData['message']);\n    }\n\n    public function testHandleBatch()\n    {\n        $records = $this->getMultipleRecords();\n        $records[] = $this->getRecord(Logger::WARNING, 'warning');\n        $records[] = $this->getRecord(Logger::WARNING, 'warning');\n\n        $logFormatter = $this->getMock('Monolog\\\\Formatter\\\\FormatterInterface');\n        $logFormatter->expects($this->once())->method('formatBatch');\n\n        $formatter = $this->getMock('Monolog\\\\Formatter\\\\FormatterInterface');\n        $formatter->expects($this->once())->method('format')->with($this->callback(function ($record) {\n            return $record['level'] == 400;\n        }));\n\n        $handler = $this->getHandler($this->getRavenClient());\n        $handler->setBatchFormatter($logFormatter);\n        $handler->setFormatter($formatter);\n        $handler->handleBatch($records);\n    }\n\n    public function testHandleBatchDoNothingIfRecordsAreBelowLevel()\n    {\n        $records = array(\n            $this->getRecord(Logger::DEBUG, 'debug message 1'),\n            $this->getRecord(Logger::DEBUG, 'debug message 2'),\n            $this->getRecord(Logger::INFO, 'information'),\n        );\n\n        $handler = $this->getMock('Monolog\\Handler\\RavenHandler', null, array($this->getRavenClient()));\n        $handler->expects($this->never())->method('handle');\n        $handler->setLevel(Logger::ERROR);\n        $handler->handleBatch($records);\n    }\n\n    public function testHandleBatchPicksProperMessage()\n    {\n        $records = array(\n            $this->getRecord(Logger::DEBUG, 'debug message 1'),\n            $this->getRecord(Logger::DEBUG, 'debug message 2'),\n            $this->getRecord(Logger::INFO, 'information 1'),\n            $this->getRecord(Logger::ERROR, 'error 1'),\n            $this->getRecord(Logger::WARNING, 'warning'),\n            $this->getRecord(Logger::ERROR, 'error 2'),\n            $this->getRecord(Logger::INFO, 'information 2'),\n        );\n\n        $logFormatter = $this->getMock('Monolog\\\\Formatter\\\\FormatterInterface');\n        $logFormatter->expects($this->once())->method('formatBatch');\n\n        $formatter = $this->getMock('Monolog\\\\Formatter\\\\FormatterInterface');\n        $formatter->expects($this->once())->method('format')->with($this->callback(function ($record) use ($records) {\n            return $record['message'] == 'error 1';\n        }));\n\n        $handler = $this->getHandler($this->getRavenClient());\n        $handler->setBatchFormatter($logFormatter);\n        $handler->setFormatter($formatter);\n        $handler->handleBatch($records);\n    }\n\n    public function testGetSetBatchFormatter()\n    {\n        $ravenClient = $this->getRavenClient();\n        $handler = $this->getHandler($ravenClient);\n\n        $handler->setBatchFormatter($formatter = new LineFormatter());\n        $this->assertSame($formatter, $handler->getBatchFormatter());\n    }\n\n    public function testRelease()\n    {\n        $ravenClient = $this->getRavenClient();\n        $handler = $this->getHandler($ravenClient);\n        $release = 'v42.42.42';\n        $handler->setRelease($release);\n        $record = $this->getRecord(Logger::INFO, 'test');\n        $handler->handle($record);\n        $this->assertEquals($release, $ravenClient->lastData['release']);\n\n        $localRelease = 'v41.41.41';\n        $record = $this->getRecord(Logger::INFO, 'test', array('release' => $localRelease));\n        $handler->handle($record);\n        $this->assertEquals($localRelease, $ravenClient->lastData['release']);\n    }\n\n    private function methodThatThrowsAnException()\n    {\n        throw new \\Exception('This is an exception');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\LineFormatter;\n\nclass RedisHandlerTest extends TestCase\n{\n    /**\n     * @expectedException InvalidArgumentException\n     */\n    public function testConstructorShouldThrowExceptionForInvalidRedis()\n    {\n        new RedisHandler(new \\stdClass(), 'key');\n    }\n\n    public function testConstructorShouldWorkWithPredis()\n    {\n        $redis = $this->getMock('Predis\\Client');\n        $this->assertInstanceof('Monolog\\Handler\\RedisHandler', new RedisHandler($redis, 'key'));\n    }\n\n    public function testConstructorShouldWorkWithRedis()\n    {\n        $redis = $this->getMock('Redis');\n        $this->assertInstanceof('Monolog\\Handler\\RedisHandler', new RedisHandler($redis, 'key'));\n    }\n\n    public function testPredisHandle()\n    {\n        $redis = $this->getMock('Predis\\Client', array('rpush'));\n\n        // Predis\\Client uses rpush\n        $redis->expects($this->once())\n            ->method('rpush')\n            ->with('key', 'test');\n\n        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \\stdClass, 'foo' => 34));\n\n        $handler = new RedisHandler($redis, 'key');\n        $handler->setFormatter(new LineFormatter(\"%message%\"));\n        $handler->handle($record);\n    }\n\n    public function testRedisHandle()\n    {\n        $redis = $this->getMock('Redis', array('rpush'));\n\n        // Redis uses rPush\n        $redis->expects($this->once())\n            ->method('rPush')\n            ->with('key', 'test');\n\n        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \\stdClass, 'foo' => 34));\n\n        $handler = new RedisHandler($redis, 'key');\n        $handler->setFormatter(new LineFormatter(\"%message%\"));\n        $handler->handle($record);\n    }\n\n    public function testRedisHandleCapped()\n    {\n        $redis = $this->getMock('Redis', array('multi', 'rpush', 'ltrim', 'exec'));\n\n        // Redis uses multi\n        $redis->expects($this->once())\n            ->method('multi')\n            ->will($this->returnSelf());\n\n        $redis->expects($this->once())\n            ->method('rpush')\n            ->will($this->returnSelf());\n\n        $redis->expects($this->once())\n            ->method('ltrim')\n            ->will($this->returnSelf());\n\n        $redis->expects($this->once())\n            ->method('exec')\n            ->will($this->returnSelf());\n\n        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \\stdClass, 'foo' => 34));\n\n        $handler = new RedisHandler($redis, 'key', Logger::DEBUG, true, 10);\n        $handler->setFormatter(new LineFormatter(\"%message%\"));\n        $handler->handle($record);\n    }\n\n    public function testPredisHandleCapped()\n    {\n        $redis = $this->getMock('Predis\\Client', array('transaction'));\n\n        $redisTransaction = $this->getMock('Predis\\Client', array('rpush', 'ltrim'));\n\n        $redisTransaction->expects($this->once())\n            ->method('rpush')\n            ->will($this->returnSelf());\n\n        $redisTransaction->expects($this->once())\n            ->method('ltrim')\n            ->will($this->returnSelf());\n\n        // Redis uses multi\n        $redis->expects($this->once())\n            ->method('transaction')\n            ->will($this->returnCallback(function ($cb) use ($redisTransaction) {\n                $cb($redisTransaction);\n            }));\n\n        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \\stdClass, 'foo' => 34));\n\n        $handler = new RedisHandler($redis, 'key', Logger::DEBUG, true, 10);\n        $handler->setFormatter(new LineFormatter(\"%message%\"));\n        $handler->handle($record);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/RollbarHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Exception;\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse PHPUnit_Framework_MockObject_MockObject as MockObject;\n\n/**\n * @author Erik Johansson <erik.pm.johansson@gmail.com>\n * @see    https://rollbar.com/docs/notifier/rollbar-php/\n *\n * @coversDefaultClass Monolog\\Handler\\RollbarHandler\n */\nclass RollbarHandlerTest extends TestCase\n{\n    /**\n     * @var MockObject\n     */\n    private $rollbarNotifier;\n\n    /**\n     * @var array\n     */\n    public $reportedExceptionArguments = null;\n\n    protected function setUp()\n    {\n        parent::setUp();\n\n        $this->setupRollbarNotifierMock();\n    }\n\n    /**\n     * When reporting exceptions to Rollbar the\n     * level has to be set in the payload data\n     */\n    public function testExceptionLogLevel()\n    {\n        $handler = $this->createHandler();\n\n        $handler->handle($this->createExceptionRecord(Logger::DEBUG));\n\n        $this->assertEquals('debug', $this->reportedExceptionArguments['payload']['level']);\n    }\n\n    private function setupRollbarNotifierMock()\n    {\n        $this->rollbarNotifier = $this->getMockBuilder('RollbarNotifier')\n            ->setMethods(array('report_message', 'report_exception', 'flush'))\n            ->getMock();\n\n        $that = $this;\n\n        $this->rollbarNotifier\n            ->expects($this->any())\n            ->method('report_exception')\n            ->willReturnCallback(function ($exception, $context, $payload) use ($that) {\n                $that->reportedExceptionArguments = compact('exception', 'context', 'payload');\n            });\n    }\n\n    private function createHandler()\n    {\n        return new RollbarHandler($this->rollbarNotifier, Logger::DEBUG);\n    }\n\n    private function createExceptionRecord($level = Logger::DEBUG, $message = 'test', $exception = null)\n    {\n        return $this->getRecord($level, $message, array(\n            'exception' => $exception ?: new Exception()\n        ));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse PHPUnit_Framework_Error_Deprecated;\n\n/**\n * @covers Monolog\\Handler\\RotatingFileHandler\n */\nclass RotatingFileHandlerTest extends TestCase\n{\n    /**\n     * This var should be private but then the anonymous function\n     * in the `setUp` method won't be able to set it. `$this` cant't\n     * be used in the anonymous function in `setUp` because PHP 5.3\n     * does not support it.\n     */\n    public $lastError;\n\n    public function setUp()\n    {\n        $dir = __DIR__.'/Fixtures';\n        chmod($dir, 0777);\n        if (!is_writable($dir)) {\n            $this->markTestSkipped($dir.' must be writable to test the RotatingFileHandler.');\n        }\n        $this->lastError = null;\n        $self = $this;\n        // workaround with &$self used for PHP 5.3\n        set_error_handler(function($code, $message) use (&$self) {\n            $self->lastError = array(\n                'code' => $code,\n                'message' => $message,\n            );\n        });\n    }\n\n    private function assertErrorWasTriggered($code, $message)\n    {\n        if (empty($this->lastError)) {\n            $this->fail(\n                sprintf(\n                    'Failed asserting that error with code `%d` and message `%s` was triggered',\n                    $code,\n                    $message\n                )\n            );\n        }\n        $this->assertEquals($code, $this->lastError['code'], sprintf('Expected an error with code %d to be triggered, got `%s` instead', $code, $this->lastError['code']));\n        $this->assertEquals($message, $this->lastError['message'], sprintf('Expected an error with message `%d` to be triggered, got `%s` instead', $message, $this->lastError['message']));\n    }\n\n    public function testRotationCreatesNewFile()\n    {\n        touch(__DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400).'.rot');\n\n        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot');\n        $handler->setFormatter($this->getIdentityFormatter());\n        $handler->handle($this->getRecord());\n\n        $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot';\n        $this->assertTrue(file_exists($log));\n        $this->assertEquals('test', file_get_contents($log));\n    }\n\n    /**\n     * @dataProvider rotationTests\n     */\n    public function testRotation($createFile, $dateFormat, $timeCallback)\n    {\n        touch($old1 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-1)).'.rot');\n        touch($old2 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-2)).'.rot');\n        touch($old3 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-3)).'.rot');\n        touch($old4 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-4)).'.rot');\n\n        $log = __DIR__.'/Fixtures/foo-'.date($dateFormat).'.rot';\n\n        if ($createFile) {\n            touch($log);\n        }\n\n        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);\n        $handler->setFormatter($this->getIdentityFormatter());\n        $handler->setFilenameFormat('{filename}-{date}', $dateFormat);\n        $handler->handle($this->getRecord());\n\n        $handler->close();\n\n        $this->assertTrue(file_exists($log));\n        $this->assertTrue(file_exists($old1));\n        $this->assertEquals($createFile, file_exists($old2));\n        $this->assertEquals($createFile, file_exists($old3));\n        $this->assertEquals($createFile, file_exists($old4));\n        $this->assertEquals('test', file_get_contents($log));\n    }\n\n    public function rotationTests()\n    {\n        $now = time();\n        $dayCallback = function($ago) use ($now) {\n            return $now + 86400 * $ago;\n        };\n        $monthCallback = function($ago) {\n            return gmmktime(0, 0, 0, date('n') + $ago, 1, date('Y'));\n        };\n        $yearCallback = function($ago) {\n            return gmmktime(0, 0, 0, 1, 1, date('Y') + $ago);\n        };\n\n        return array(\n            'Rotation is triggered when the file of the current day is not present'\n                => array(true, RotatingFileHandler::FILE_PER_DAY, $dayCallback),\n            'Rotation is not triggered when the file of the current day is already present'\n                => array(false, RotatingFileHandler::FILE_PER_DAY, $dayCallback),\n\n            'Rotation is triggered when the file of the current month is not present'\n                => array(true, RotatingFileHandler::FILE_PER_MONTH, $monthCallback),\n            'Rotation is not triggered when the file of the current month is already present'\n                => array(false, RotatingFileHandler::FILE_PER_MONTH, $monthCallback),\n\n            'Rotation is triggered when the file of the current year is not present'\n                => array(true, RotatingFileHandler::FILE_PER_YEAR, $yearCallback),\n            'Rotation is not triggered when the file of the current year is already present'\n                => array(false, RotatingFileHandler::FILE_PER_YEAR, $yearCallback),\n        );\n    }\n\n    /**\n     * @dataProvider dateFormatProvider\n     */\n    public function testAllowOnlyFixedDefinedDateFormats($dateFormat, $valid)\n    {\n        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);\n        $handler->setFilenameFormat('{filename}-{date}', $dateFormat);\n        if (!$valid) {\n            $this->assertErrorWasTriggered(\n                E_USER_DEPRECATED,\n                'Invalid date format - format must be one of RotatingFileHandler::FILE_PER_DAY (\"Y-m-d\"), '.\n                'RotatingFileHandler::FILE_PER_MONTH (\"Y-m\") or RotatingFileHandler::FILE_PER_YEAR (\"Y\"), '.\n                'or you can set one of the date formats using slashes, underscores and/or dots instead of dashes.'\n            );\n        }\n    }\n\n    public function dateFormatProvider()\n    {\n        return array(\n            array(RotatingFileHandler::FILE_PER_DAY, true),\n            array(RotatingFileHandler::FILE_PER_MONTH, true),\n            array(RotatingFileHandler::FILE_PER_YEAR, true),\n            array('m-d-Y', false),\n            array('Y-m-d-h-i', false)\n        );\n    }\n\n    /**\n     * @dataProvider filenameFormatProvider\n     */\n    public function testDisallowFilenameFormatsWithoutDate($filenameFormat, $valid)\n    {\n        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);\n        $handler->setFilenameFormat($filenameFormat, RotatingFileHandler::FILE_PER_DAY);\n        if (!$valid) {\n            $this->assertErrorWasTriggered(\n                E_USER_DEPRECATED,\n                'Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.'\n            );\n        }\n    }\n\n    public function filenameFormatProvider()\n    {\n        return array(\n            array('{filename}', false),\n            array('{filename}-{date}', true),\n            array('{date}', true),\n            array('foobar-{date}', true),\n            array('foo-{date}-bar', true),\n            array('{date}-foobar', true),\n            array('foobar', false),\n        );\n    }\n\n    public function testReuseCurrentFile()\n    {\n        $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot';\n        file_put_contents($log, \"foo\");\n        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot');\n        $handler->setFormatter($this->getIdentityFormatter());\n        $handler->handle($this->getRecord());\n        $this->assertEquals('footest', file_get_contents($log));\n    }\n\n    public function tearDown()\n    {\n        foreach (glob(__DIR__.'/Fixtures/*.rot') as $file) {\n            unlink($file);\n        }\n        restore_error_handler();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SamplingHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\n\n/**\n * @covers Monolog\\Handler\\SamplingHandler::handle\n */\nclass SamplingHandlerTest extends TestCase\n{\n    public function testHandle()\n    {\n        $testHandler = new TestHandler();\n        $handler = new SamplingHandler($testHandler, 2);\n        for ($i = 0; $i < 10000; $i++) {\n            $handler->handle($this->getRecord());\n        }\n        $count = count($testHandler->getRecords());\n        // $count should be half of 10k, so between 4k and 6k\n        $this->assertLessThan(6000, $count);\n        $this->assertGreaterThan(4000, $count);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler\\Slack;\n\nuse Monolog\\Logger;\nuse Monolog\\TestCase;\n\n/**\n * @coversDefaultClass Monolog\\Handler\\Slack\\SlackRecord\n */\nclass SlackRecordTest extends TestCase\n{\n    private $jsonPrettyPrintFlag;\n\n    protected function setUp()\n    {\n        $this->jsonPrettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128;\n    }\n\n    public function dataGetAttachmentColor()\n    {\n        return array(\n            array(Logger::DEBUG, SlackRecord::COLOR_DEFAULT),\n            array(Logger::INFO, SlackRecord::COLOR_GOOD),\n            array(Logger::NOTICE, SlackRecord::COLOR_GOOD),\n            array(Logger::WARNING, SlackRecord::COLOR_WARNING),\n            array(Logger::ERROR, SlackRecord::COLOR_DANGER),\n            array(Logger::CRITICAL, SlackRecord::COLOR_DANGER),\n            array(Logger::ALERT, SlackRecord::COLOR_DANGER),\n            array(Logger::EMERGENCY, SlackRecord::COLOR_DANGER),\n        );\n    }\n\n    /**\n     * @dataProvider dataGetAttachmentColor\n     * @param  int $logLevel\n     * @param  string $expectedColour RGB hex color or name of Slack color\n     * @covers ::getAttachmentColor\n     */\n    public function testGetAttachmentColor($logLevel, $expectedColour)\n    {\n        $slackRecord = new SlackRecord();\n        $this->assertSame(\n            $expectedColour,\n            $slackRecord->getAttachmentColor($logLevel)\n        );\n    }\n\n    public function testAddsChannel()\n    {\n        $channel = '#test';\n        $record = new SlackRecord($channel);\n        $data = $record->getSlackData($this->getRecord());\n\n        $this->assertArrayHasKey('channel', $data);\n        $this->assertSame($channel, $data['channel']);\n    }\n\n    public function testNoUsernameByDefault()\n    {\n        $record = new SlackRecord();\n        $data = $record->getSlackData($this->getRecord());\n\n        $this->assertArrayNotHasKey('username', $data);\n    }\n\n    /**\n     * @return array\n     */\n    public function dataStringify()\n    {\n        $jsonPrettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128;\n\n        $multipleDimensions = array(array(1, 2));\n        $numericKeys = array('library' => 'monolog');\n        $singleDimension = array(1, 'Hello', 'Jordi');\n\n        return array(\n            array(array(), '[]'),\n            array($multipleDimensions, json_encode($multipleDimensions, $jsonPrettyPrintFlag)),\n            array($numericKeys, json_encode($numericKeys, $jsonPrettyPrintFlag)),\n            array($singleDimension, json_encode($singleDimension))\n        );\n    }\n\n    /**\n     * @dataProvider dataStringify\n     */\n    public function testStringify($fields, $expectedResult)\n    {\n        $slackRecord = new SlackRecord(\n            '#test',\n            'test',\n            true,\n            null,\n            true,\n            true\n        );\n\n        $this->assertSame($expectedResult, $slackRecord->stringify($fields));\n    }\n\n    public function testAddsCustomUsername()\n    {\n        $username = 'Monolog bot';\n        $record = new SlackRecord(null, $username);\n        $data = $record->getSlackData($this->getRecord());\n\n        $this->assertArrayHasKey('username', $data);\n        $this->assertSame($username, $data['username']);\n    }\n\n    public function testNoIcon()\n    {\n        $record = new SlackRecord();\n        $data = $record->getSlackData($this->getRecord());\n\n        $this->assertArrayNotHasKey('icon_emoji', $data);\n    }\n\n    public function testAddsIcon()\n    {\n        $record = $this->getRecord();\n        $slackRecord = new SlackRecord(null, null, false, 'ghost');\n        $data = $slackRecord->getSlackData($record);\n\n        $slackRecord2 = new SlackRecord(null, null, false, 'http://github.com/Seldaek/monolog');\n        $data2 = $slackRecord2->getSlackData($record);\n\n        $this->assertArrayHasKey('icon_emoji', $data);\n        $this->assertSame(':ghost:', $data['icon_emoji']);\n        $this->assertArrayHasKey('icon_url', $data2);\n        $this->assertSame('http://github.com/Seldaek/monolog', $data2['icon_url']);\n    }\n\n    public function testAttachmentsNotPresentIfNoAttachment()\n    {\n        $record = new SlackRecord(null, null, false);\n        $data = $record->getSlackData($this->getRecord());\n\n        $this->assertArrayNotHasKey('attachments', $data);\n    }\n\n    public function testAddsOneAttachment()\n    {\n        $record = new SlackRecord();\n        $data = $record->getSlackData($this->getRecord());\n\n        $this->assertArrayHasKey('attachments', $data);\n        $this->assertArrayHasKey(0, $data['attachments']);\n        $this->assertInternalType('array', $data['attachments'][0]);\n    }\n\n    public function testTextEqualsMessageIfNoAttachment()\n    {\n        $message = 'Test message';\n        $record = new SlackRecord(null, null, false);\n        $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message));\n\n        $this->assertArrayHasKey('text', $data);\n        $this->assertSame($message, $data['text']);\n    }\n\n    public function testTextEqualsFormatterOutput()\n    {\n        $formatter = $this->getMock('Monolog\\\\Formatter\\\\FormatterInterface');\n        $formatter\n            ->expects($this->any())\n            ->method('format')\n            ->will($this->returnCallback(function ($record) { return $record['message'] . 'test'; }));\n\n        $formatter2 = $this->getMock('Monolog\\\\Formatter\\\\FormatterInterface');\n        $formatter2\n            ->expects($this->any())\n            ->method('format')\n            ->will($this->returnCallback(function ($record) { return $record['message'] . 'test1'; }));\n\n        $message = 'Test message';\n        $record = new SlackRecord(null, null, false, null, false, false, array(), $formatter);\n        $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message));\n\n        $this->assertArrayHasKey('text', $data);\n        $this->assertSame($message . 'test', $data['text']);\n\n        $record->setFormatter($formatter2);\n        $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message));\n\n        $this->assertArrayHasKey('text', $data);\n        $this->assertSame($message . 'test1', $data['text']);\n    }\n\n    public function testAddsFallbackAndTextToAttachment()\n    {\n        $message = 'Test message';\n        $record = new SlackRecord(null);\n        $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message));\n\n        $this->assertSame($message, $data['attachments'][0]['text']);\n        $this->assertSame($message, $data['attachments'][0]['fallback']);\n    }\n\n    public function testMapsLevelToColorAttachmentColor()\n    {\n        $record = new SlackRecord(null);\n        $errorLoggerRecord = $this->getRecord(Logger::ERROR);\n        $emergencyLoggerRecord = $this->getRecord(Logger::EMERGENCY);\n        $warningLoggerRecord = $this->getRecord(Logger::WARNING);\n        $infoLoggerRecord = $this->getRecord(Logger::INFO);\n        $debugLoggerRecord = $this->getRecord(Logger::DEBUG);\n\n        $data = $record->getSlackData($errorLoggerRecord);\n        $this->assertSame(SlackRecord::COLOR_DANGER, $data['attachments'][0]['color']);\n\n        $data = $record->getSlackData($emergencyLoggerRecord);\n        $this->assertSame(SlackRecord::COLOR_DANGER, $data['attachments'][0]['color']);\n\n        $data = $record->getSlackData($warningLoggerRecord);\n        $this->assertSame(SlackRecord::COLOR_WARNING, $data['attachments'][0]['color']);\n\n        $data = $record->getSlackData($infoLoggerRecord);\n        $this->assertSame(SlackRecord::COLOR_GOOD, $data['attachments'][0]['color']);\n\n        $data = $record->getSlackData($debugLoggerRecord);\n        $this->assertSame(SlackRecord::COLOR_DEFAULT, $data['attachments'][0]['color']);\n    }\n\n    public function testAddsShortAttachmentWithoutContextAndExtra()\n    {\n        $level = Logger::ERROR;\n        $levelName = Logger::getLevelName($level);\n        $record = new SlackRecord(null, null, true, null, true);\n        $data = $record->getSlackData($this->getRecord($level, 'test', array('test' => 1)));\n\n        $attachment = $data['attachments'][0];\n        $this->assertArrayHasKey('title', $attachment);\n        $this->assertArrayHasKey('fields', $attachment);\n        $this->assertSame($levelName, $attachment['title']);\n        $this->assertSame(array(), $attachment['fields']);\n    }\n\n    public function testAddsShortAttachmentWithContextAndExtra()\n    {\n        $level = Logger::ERROR;\n        $levelName = Logger::getLevelName($level);\n        $context = array('test' => 1);\n        $extra = array('tags' => array('web'));\n        $record = new SlackRecord(null, null, true, null, true, true);\n        $loggerRecord = $this->getRecord($level, 'test', $context);\n        $loggerRecord['extra'] = $extra;\n        $data = $record->getSlackData($loggerRecord);\n\n        $attachment = $data['attachments'][0];\n        $this->assertArrayHasKey('title', $attachment);\n        $this->assertArrayHasKey('fields', $attachment);\n        $this->assertCount(2, $attachment['fields']);\n        $this->assertSame($levelName, $attachment['title']);\n        $this->assertSame(\n            array(\n                array(\n                    'title' => 'Extra',\n                    'value' => sprintf('```%s```', json_encode($extra, $this->jsonPrettyPrintFlag)),\n                    'short' => false\n                ),\n                array(\n                    'title' => 'Context',\n                    'value' => sprintf('```%s```', json_encode($context, $this->jsonPrettyPrintFlag)),\n                    'short' => false\n                )\n            ),\n            $attachment['fields']\n        );\n    }\n\n    public function testAddsLongAttachmentWithoutContextAndExtra()\n    {\n        $level = Logger::ERROR;\n        $levelName = Logger::getLevelName($level);\n        $record = new SlackRecord(null, null, true, null);\n        $data = $record->getSlackData($this->getRecord($level, 'test', array('test' => 1)));\n\n        $attachment = $data['attachments'][0];\n        $this->assertArrayHasKey('title', $attachment);\n        $this->assertArrayHasKey('fields', $attachment);\n        $this->assertCount(1, $attachment['fields']);\n        $this->assertSame('Message', $attachment['title']);\n        $this->assertSame(\n            array(array(\n                'title' => 'Level',\n                'value' => $levelName,\n                'short' => false\n            )),\n            $attachment['fields']\n        );\n    }\n\n    public function testAddsLongAttachmentWithContextAndExtra()\n    {\n        $level = Logger::ERROR;\n        $levelName = Logger::getLevelName($level);\n        $context = array('test' => 1);\n        $extra = array('tags' => array('web'));\n        $record = new SlackRecord(null, null, true, null, false, true);\n        $loggerRecord = $this->getRecord($level, 'test', $context);\n        $loggerRecord['extra'] = $extra;\n        $data = $record->getSlackData($loggerRecord);\n\n        $expectedFields = array(\n            array(\n                'title' => 'Level',\n                'value' => $levelName,\n                'short' => false,\n            ),\n            array(\n                'title' => 'tags',\n                'value' => sprintf('```%s```', json_encode($extra['tags'])),\n                'short' => false\n            ),\n            array(\n                'title' => 'test',\n                'value' => $context['test'],\n                'short' => false\n            )\n        );\n\n        $attachment = $data['attachments'][0];\n        $this->assertArrayHasKey('title', $attachment);\n        $this->assertArrayHasKey('fields', $attachment);\n        $this->assertCount(3, $attachment['fields']);\n        $this->assertSame('Message', $attachment['title']);\n        $this->assertSame(\n            $expectedFields,\n            $attachment['fields']\n        );\n    }\n\n    public function testAddsTimestampToAttachment()\n    {\n        $record = $this->getRecord();\n        $slackRecord = new SlackRecord();\n        $data = $slackRecord->getSlackData($this->getRecord());\n\n        $attachment = $data['attachments'][0];\n        $this->assertArrayHasKey('ts', $attachment);\n        $this->assertSame($record['datetime']->getTimestamp(), $attachment['ts']);\n    }\n\n    public function testExcludeExtraAndContextFields()\n    {\n        $record = $this->getRecord(\n            Logger::WARNING,\n            'test',\n            array('info' => array('library' => 'monolog', 'author' => 'Jordi'))\n        );\n        $record['extra'] = array('tags' => array('web', 'cli'));\n\n        $slackRecord = new SlackRecord(null, null, true, null, false, true, array('context.info.library', 'extra.tags.1'));\n        $data = $slackRecord->getSlackData($record);\n        $attachment = $data['attachments'][0];\n\n        $expected = array(\n            array(\n                'title' => 'info',\n                'value' => sprintf('```%s```', json_encode(array('author' => 'Jordi'), $this->jsonPrettyPrintFlag)),\n                'short' => false\n            ),\n            array(\n                'title' => 'tags',\n                'value' => sprintf('```%s```', json_encode(array('web'))),\n                'short' => false\n            ),\n        );\n\n        foreach ($expected as $field) {\n            $this->assertNotFalse(array_search($field, $attachment['fields']));\n            break;\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SlackHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Handler\\Slack\\SlackRecord;\n\n/**\n * @author Greg Kedzierski <greg@gregkedzierski.com>\n * @see    https://api.slack.com/\n */\nclass SlackHandlerTest extends TestCase\n{\n    /**\n     * @var resource\n     */\n    private $res;\n\n    /**\n     * @var SlackHandler\n     */\n    private $handler;\n\n    public function setUp()\n    {\n        if (!extension_loaded('openssl')) {\n            $this->markTestSkipped('This test requires openssl to run');\n        }\n    }\n\n    public function testWriteHeader()\n    {\n        $this->createHandler();\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $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);\n    }\n\n    public function testWriteContent()\n    {\n        $this->createHandler();\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegExp('/username=Monolog/', $content);\n        $this->assertRegExp('/channel=channel1/', $content);\n        $this->assertRegExp('/token=myToken/', $content);\n        $this->assertRegExp('/attachments/', $content);\n    }\n\n    public function testWriteContentUsesFormatterIfProvided()\n    {\n        $this->createHandler('myToken', 'channel1', 'Monolog', false);\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->createHandler('myToken', 'channel1', 'Monolog', false);\n        $this->handler->setFormatter(new LineFormatter('foo--%message%'));\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test2'));\n        fseek($this->res, 0);\n        $content2 = fread($this->res, 1024);\n\n        $this->assertRegexp('/text=test1/', $content);\n        $this->assertRegexp('/text=foo--test2/', $content2);\n    }\n\n    public function testWriteContentWithEmoji()\n    {\n        $this->createHandler('myToken', 'channel1', 'Monolog', true, 'alien');\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/icon_emoji=%3Aalien%3A/', $content);\n    }\n\n    /**\n     * @dataProvider provideLevelColors\n     */\n    public function testWriteContentWithColors($level, $expectedColor)\n    {\n        $this->createHandler();\n        $this->handler->handle($this->getRecord($level, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/%22color%22%3A%22'.$expectedColor.'/', $content);\n    }\n\n    public function testWriteContentWithPlainTextMessage()\n    {\n        $this->createHandler('myToken', 'channel1', 'Monolog', false);\n        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));\n        fseek($this->res, 0);\n        $content = fread($this->res, 1024);\n\n        $this->assertRegexp('/text=test1/', $content);\n    }\n\n    public function provideLevelColors()\n    {\n        return array(\n            array(Logger::DEBUG,    urlencode(SlackRecord::COLOR_DEFAULT)),\n            array(Logger::INFO,     SlackRecord::COLOR_GOOD),\n            array(Logger::NOTICE,   SlackRecord::COLOR_GOOD),\n            array(Logger::WARNING,  SlackRecord::COLOR_WARNING),\n            array(Logger::ERROR,    SlackRecord::COLOR_DANGER),\n            array(Logger::CRITICAL, SlackRecord::COLOR_DANGER),\n            array(Logger::ALERT,    SlackRecord::COLOR_DANGER),\n            array(Logger::EMERGENCY,SlackRecord::COLOR_DANGER),\n        );\n    }\n\n    private function createHandler($token = 'myToken', $channel = 'channel1', $username = 'Monolog', $useAttachment = true, $iconEmoji = null, $useShortAttachment = false, $includeExtra = false)\n    {\n        $constructorArgs = array($token, $channel, $username, $useAttachment, $iconEmoji, Logger::DEBUG, true, $useShortAttachment, $includeExtra);\n        $this->res = fopen('php://memory', 'a');\n        $this->handler = $this->getMock(\n            '\\Monolog\\Handler\\SlackHandler',\n            array('fsockopen', 'streamSetTimeout', 'closeSocket'),\n            $constructorArgs\n        );\n\n        $reflectionProperty = new \\ReflectionProperty('\\Monolog\\Handler\\SocketHandler', 'connectionString');\n        $reflectionProperty->setAccessible(true);\n        $reflectionProperty->setValue($this->handler, 'localhost:1234');\n\n        $this->handler->expects($this->any())\n            ->method('fsockopen')\n            ->will($this->returnValue($this->res));\n        $this->handler->expects($this->any())\n            ->method('streamSetTimeout')\n            ->will($this->returnValue(true));\n        $this->handler->expects($this->any())\n            ->method('closeSocket')\n            ->will($this->returnValue(true));\n\n        $this->handler->setFormatter($this->getIdentityFormatter());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SlackWebhookHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Handler\\Slack\\SlackRecord;\n\n/**\n * @author Haralan Dobrev <hkdobrev@gmail.com>\n * @see    https://api.slack.com/incoming-webhooks\n * @coversDefaultClass Monolog\\Handler\\SlackWebhookHandler\n */\nclass SlackWebhookHandlerTest extends TestCase\n{\n    const WEBHOOK_URL = 'https://hooks.slack.com/services/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E';\n\n    /**\n     * @covers ::__construct\n     * @covers ::getSlackRecord\n     */\n    public function testConstructorMinimal()\n    {\n        $handler = new SlackWebhookHandler(self::WEBHOOK_URL);\n        $record = $this->getRecord();\n        $slackRecord = $handler->getSlackRecord();\n        $this->assertInstanceOf('Monolog\\Handler\\Slack\\SlackRecord', $slackRecord);\n        $this->assertEquals(array(\n            'attachments' => array(\n                array(\n                    'fallback' => 'test',\n                    'text' => 'test',\n                    'color' => SlackRecord::COLOR_WARNING,\n                    'fields' => array(\n                        array(\n                            'title' => 'Level',\n                            'value' => 'WARNING',\n                            'short' => false,\n                        ),\n                    ),\n                    'title' => 'Message',\n                    'mrkdwn_in' => array('fields'),\n                    'ts' => $record['datetime']->getTimestamp(),\n                ),\n            ),\n        ), $slackRecord->getSlackData($record));\n    }\n\n    /**\n     * @covers ::__construct\n     * @covers ::getSlackRecord\n     */\n    public function testConstructorFull()\n    {\n        $handler = new SlackWebhookHandler(\n            self::WEBHOOK_URL,\n            'test-channel',\n            'test-username',\n            false,\n            ':ghost:',\n            false,\n            false,\n            Logger::DEBUG,\n            false\n        );\n\n        $slackRecord = $handler->getSlackRecord();\n        $this->assertInstanceOf('Monolog\\Handler\\Slack\\SlackRecord', $slackRecord);\n        $this->assertEquals(array(\n            'username' => 'test-username',\n            'text' => 'test',\n            'channel' => 'test-channel',\n            'icon_emoji' => ':ghost:',\n        ), $slackRecord->getSlackData($this->getRecord()));\n    }\n\n    /**\n     * @covers ::getFormatter\n     */\n    public function testGetFormatter()\n    {\n        $handler = new SlackWebhookHandler(self::WEBHOOK_URL);\n        $formatter = $handler->getFormatter();\n        $this->assertInstanceOf('Monolog\\Formatter\\FormatterInterface', $formatter);\n    }\n\n    /**\n     * @covers ::setFormatter\n     */\n    public function testSetFormatter()\n    {\n        $handler = new SlackWebhookHandler(self::WEBHOOK_URL);\n        $formatter = new LineFormatter();\n        $handler->setFormatter($formatter);\n        $this->assertSame($formatter, $handler->getFormatter());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SlackbotHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * @author Haralan Dobrev <hkdobrev@gmail.com>\n * @see    https://slack.com/apps/A0F81R8ET-slackbot\n * @coversDefaultClass Monolog\\Handler\\SlackbotHandler\n */\nclass SlackbotHandlerTest extends TestCase\n{\n    /**\n     * @covers ::__construct\n     */\n    public function testConstructorMinimal()\n    {\n        $handler = new SlackbotHandler('test-team', 'test-token', 'test-channel');\n        $this->assertInstanceOf('Monolog\\Handler\\AbstractProcessingHandler', $handler);\n    }\n\n    /**\n     * @covers ::__construct\n     */\n    public function testConstructorFull()\n    {\n        $handler = new SlackbotHandler(\n            'test-team',\n            'test-token',\n            'test-channel',\n            Logger::DEBUG,\n            false\n        );\n        $this->assertInstanceOf('Monolog\\Handler\\AbstractProcessingHandler', $handler);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * @author Pablo de Leon Belloc <pablolb@gmail.com>\n */\nclass SocketHandlerTest extends TestCase\n{\n    /**\n     * @var Monolog\\Handler\\SocketHandler\n     */\n    private $handler;\n\n    /**\n     * @var resource\n     */\n    private $res;\n\n    /**\n     * @expectedException UnexpectedValueException\n     */\n    public function testInvalidHostname()\n    {\n        $this->createHandler('garbage://here');\n        $this->writeRecord('data');\n    }\n\n    /**\n     * @expectedException \\InvalidArgumentException\n     */\n    public function testBadConnectionTimeout()\n    {\n        $this->createHandler('localhost:1234');\n        $this->handler->setConnectionTimeout(-1);\n    }\n\n    public function testSetConnectionTimeout()\n    {\n        $this->createHandler('localhost:1234');\n        $this->handler->setConnectionTimeout(10.1);\n        $this->assertEquals(10.1, $this->handler->getConnectionTimeout());\n    }\n\n    /**\n     * @expectedException \\InvalidArgumentException\n     */\n    public function testBadTimeout()\n    {\n        $this->createHandler('localhost:1234');\n        $this->handler->setTimeout(-1);\n    }\n\n    public function testSetTimeout()\n    {\n        $this->createHandler('localhost:1234');\n        $this->handler->setTimeout(10.25);\n        $this->assertEquals(10.25, $this->handler->getTimeout());\n    }\n\n    public function testSetWritingTimeout()\n    {\n        $this->createHandler('localhost:1234');\n        $this->handler->setWritingTimeout(10.25);\n        $this->assertEquals(10.25, $this->handler->getWritingTimeout());\n    }\n\n    public function testSetConnectionString()\n    {\n        $this->createHandler('tcp://localhost:9090');\n        $this->assertEquals('tcp://localhost:9090', $this->handler->getConnectionString());\n    }\n\n    /**\n     * @expectedException UnexpectedValueException\n     */\n    public function testExceptionIsThrownOnFsockopenError()\n    {\n        $this->setMockHandler(array('fsockopen'));\n        $this->handler->expects($this->once())\n            ->method('fsockopen')\n            ->will($this->returnValue(false));\n        $this->writeRecord('Hello world');\n    }\n\n    /**\n     * @expectedException UnexpectedValueException\n     */\n    public function testExceptionIsThrownOnPfsockopenError()\n    {\n        $this->setMockHandler(array('pfsockopen'));\n        $this->handler->expects($this->once())\n            ->method('pfsockopen')\n            ->will($this->returnValue(false));\n        $this->handler->setPersistent(true);\n        $this->writeRecord('Hello world');\n    }\n\n    /**\n     * @expectedException UnexpectedValueException\n     */\n    public function testExceptionIsThrownIfCannotSetTimeout()\n    {\n        $this->setMockHandler(array('streamSetTimeout'));\n        $this->handler->expects($this->once())\n            ->method('streamSetTimeout')\n            ->will($this->returnValue(false));\n        $this->writeRecord('Hello world');\n    }\n\n    /**\n     * @expectedException RuntimeException\n     */\n    public function testWriteFailsOnIfFwriteReturnsFalse()\n    {\n        $this->setMockHandler(array('fwrite'));\n\n        $callback = function ($arg) {\n            $map = array(\n                'Hello world' => 6,\n                'world' => false,\n            );\n\n            return $map[$arg];\n        };\n\n        $this->handler->expects($this->exactly(2))\n            ->method('fwrite')\n            ->will($this->returnCallback($callback));\n\n        $this->writeRecord('Hello world');\n    }\n\n    /**\n     * @expectedException RuntimeException\n     */\n    public function testWriteFailsIfStreamTimesOut()\n    {\n        $this->setMockHandler(array('fwrite', 'streamGetMetadata'));\n\n        $callback = function ($arg) {\n            $map = array(\n                'Hello world' => 6,\n                'world' => 5,\n            );\n\n            return $map[$arg];\n        };\n\n        $this->handler->expects($this->exactly(1))\n            ->method('fwrite')\n            ->will($this->returnCallback($callback));\n        $this->handler->expects($this->exactly(1))\n            ->method('streamGetMetadata')\n            ->will($this->returnValue(array('timed_out' => true)));\n\n        $this->writeRecord('Hello world');\n    }\n\n    /**\n     * @expectedException RuntimeException\n     */\n    public function testWriteFailsOnIncompleteWrite()\n    {\n        $this->setMockHandler(array('fwrite', 'streamGetMetadata'));\n\n        $res = $this->res;\n        $callback = function ($string) use ($res) {\n            fclose($res);\n\n            return strlen('Hello');\n        };\n\n        $this->handler->expects($this->exactly(1))\n            ->method('fwrite')\n            ->will($this->returnCallback($callback));\n        $this->handler->expects($this->exactly(1))\n            ->method('streamGetMetadata')\n            ->will($this->returnValue(array('timed_out' => false)));\n\n        $this->writeRecord('Hello world');\n    }\n\n    public function testWriteWithMemoryFile()\n    {\n        $this->setMockHandler();\n        $this->writeRecord('test1');\n        $this->writeRecord('test2');\n        $this->writeRecord('test3');\n        fseek($this->res, 0);\n        $this->assertEquals('test1test2test3', fread($this->res, 1024));\n    }\n\n    public function testWriteWithMock()\n    {\n        $this->setMockHandler(array('fwrite'));\n\n        $callback = function ($arg) {\n            $map = array(\n                'Hello world' => 6,\n                'world' => 5,\n            );\n\n            return $map[$arg];\n        };\n\n        $this->handler->expects($this->exactly(2))\n            ->method('fwrite')\n            ->will($this->returnCallback($callback));\n\n        $this->writeRecord('Hello world');\n    }\n\n    public function testClose()\n    {\n        $this->setMockHandler();\n        $this->writeRecord('Hello world');\n        $this->assertInternalType('resource', $this->res);\n        $this->handler->close();\n        $this->assertFalse(is_resource($this->res), \"Expected resource to be closed after closing handler\");\n    }\n\n    public function testCloseDoesNotClosePersistentSocket()\n    {\n        $this->setMockHandler();\n        $this->handler->setPersistent(true);\n        $this->writeRecord('Hello world');\n        $this->assertTrue(is_resource($this->res));\n        $this->handler->close();\n        $this->assertTrue(is_resource($this->res));\n    }\n\n    /**\n     * @expectedException \\RuntimeException\n     */\n    public function testAvoidInfiniteLoopWhenNoDataIsWrittenForAWritingTimeoutSeconds()\n    {\n        $this->setMockHandler(array('fwrite', 'streamGetMetadata'));\n\n        $this->handler->expects($this->any())\n            ->method('fwrite')\n            ->will($this->returnValue(0));\n\n        $this->handler->expects($this->any())\n            ->method('streamGetMetadata')\n            ->will($this->returnValue(array('timed_out' => false)));\n\n        $this->handler->setWritingTimeout(1);\n\n        $this->writeRecord('Hello world');\n    }\n\n    private function createHandler($connectionString)\n    {\n        $this->handler = new SocketHandler($connectionString);\n        $this->handler->setFormatter($this->getIdentityFormatter());\n    }\n\n    private function writeRecord($string)\n    {\n        $this->handler->handle($this->getRecord(Logger::WARNING, $string));\n    }\n\n    private function setMockHandler(array $methods = array())\n    {\n        $this->res = fopen('php://memory', 'a');\n\n        $defaultMethods = array('fsockopen', 'pfsockopen', 'streamSetTimeout');\n        $newMethods = array_diff($methods, $defaultMethods);\n\n        $finalMethods = array_merge($defaultMethods, $newMethods);\n\n        $this->handler = $this->getMock(\n            '\\Monolog\\Handler\\SocketHandler', $finalMethods, array('localhost:1234')\n        );\n\n        if (!in_array('fsockopen', $methods)) {\n            $this->handler->expects($this->any())\n                ->method('fsockopen')\n                ->will($this->returnValue($this->res));\n        }\n\n        if (!in_array('pfsockopen', $methods)) {\n            $this->handler->expects($this->any())\n                ->method('pfsockopen')\n                ->will($this->returnValue($this->res));\n        }\n\n        if (!in_array('streamSetTimeout', $methods)) {\n            $this->handler->expects($this->any())\n                ->method('streamSetTimeout')\n                ->will($this->returnValue(true));\n        }\n\n        $this->handler->setFormatter($this->getIdentityFormatter());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\nclass StreamHandlerTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Handler\\StreamHandler::__construct\n     * @covers Monolog\\Handler\\StreamHandler::write\n     */\n    public function testWrite()\n    {\n        $handle = fopen('php://memory', 'a+');\n        $handler = new StreamHandler($handle);\n        $handler->setFormatter($this->getIdentityFormatter());\n        $handler->handle($this->getRecord(Logger::WARNING, 'test'));\n        $handler->handle($this->getRecord(Logger::WARNING, 'test2'));\n        $handler->handle($this->getRecord(Logger::WARNING, 'test3'));\n        fseek($handle, 0);\n        $this->assertEquals('testtest2test3', fread($handle, 100));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\StreamHandler::close\n     */\n    public function testCloseKeepsExternalHandlersOpen()\n    {\n        $handle = fopen('php://memory', 'a+');\n        $handler = new StreamHandler($handle);\n        $this->assertTrue(is_resource($handle));\n        $handler->close();\n        $this->assertTrue(is_resource($handle));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\StreamHandler::close\n     */\n    public function testClose()\n    {\n        $handler = new StreamHandler('php://memory');\n        $handler->handle($this->getRecord(Logger::WARNING, 'test'));\n        $streamProp = new \\ReflectionProperty('Monolog\\Handler\\StreamHandler', 'stream');\n        $streamProp->setAccessible(true);\n        $handle = $streamProp->getValue($handler);\n\n        $this->assertTrue(is_resource($handle));\n        $handler->close();\n        $this->assertFalse(is_resource($handle));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\StreamHandler::write\n     */\n    public function testWriteCreatesTheStreamResource()\n    {\n        $handler = new StreamHandler('php://memory');\n        $handler->handle($this->getRecord());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\StreamHandler::__construct\n     * @covers Monolog\\Handler\\StreamHandler::write\n     */\n    public function testWriteLocking()\n    {\n        $temp = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'monolog_locked_log';\n        $handler = new StreamHandler($temp, Logger::DEBUG, true, null, true);\n        $handler->handle($this->getRecord());\n    }\n\n    /**\n     * @expectedException LogicException\n     * @covers Monolog\\Handler\\StreamHandler::__construct\n     * @covers Monolog\\Handler\\StreamHandler::write\n     */\n    public function testWriteMissingResource()\n    {\n        $handler = new StreamHandler(null);\n        $handler->handle($this->getRecord());\n    }\n\n    public function invalidArgumentProvider()\n    {\n        return array(\n            array(1),\n            array(array()),\n            array(array('bogus://url')),\n        );\n    }\n\n    /**\n     * @dataProvider invalidArgumentProvider\n     * @expectedException InvalidArgumentException\n     * @covers Monolog\\Handler\\StreamHandler::__construct\n     */\n    public function testWriteInvalidArgument($invalidArgument)\n    {\n        $handler = new StreamHandler($invalidArgument);\n    }\n\n    /**\n     * @expectedException UnexpectedValueException\n     * @covers Monolog\\Handler\\StreamHandler::__construct\n     * @covers Monolog\\Handler\\StreamHandler::write\n     */\n    public function testWriteInvalidResource()\n    {\n        $handler = new StreamHandler('bogus://url');\n        $handler->handle($this->getRecord());\n    }\n\n    /**\n     * @expectedException UnexpectedValueException\n     * @covers Monolog\\Handler\\StreamHandler::__construct\n     * @covers Monolog\\Handler\\StreamHandler::write\n     */\n    public function testWriteNonExistingResource()\n    {\n        $handler = new StreamHandler('ftp://foo/bar/baz/'.rand(0, 10000));\n        $handler->handle($this->getRecord());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\StreamHandler::__construct\n     * @covers Monolog\\Handler\\StreamHandler::write\n     */\n    public function testWriteNonExistingPath()\n    {\n        $handler = new StreamHandler(sys_get_temp_dir().'/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000));\n        $handler->handle($this->getRecord());\n    }\n\n    /**\n     * @covers Monolog\\Handler\\StreamHandler::__construct\n     * @covers Monolog\\Handler\\StreamHandler::write\n     */\n    public function testWriteNonExistingFileResource()\n    {\n        $handler = new StreamHandler('file://'.sys_get_temp_dir().'/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000));\n        $handler->handle($this->getRecord());\n    }\n\n    /**\n     * @expectedException Exception\n     * @expectedExceptionMessageRegExp /There is no existing directory at/\n     * @covers Monolog\\Handler\\StreamHandler::__construct\n     * @covers Monolog\\Handler\\StreamHandler::write\n     */\n    public function testWriteNonExistingAndNotCreatablePath()\n    {\n        if (defined('PHP_WINDOWS_VERSION_BUILD')) {\n            $this->markTestSkipped('Permissions checks can not run on windows');\n        }\n        $handler = new StreamHandler('/foo/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000));\n        $handler->handle($this->getRecord());\n    }\n\n    /**\n     * @expectedException Exception\n     * @expectedExceptionMessageRegExp /There is no existing directory at/\n     * @covers Monolog\\Handler\\StreamHandler::__construct\n     * @covers Monolog\\Handler\\StreamHandler::write\n     */\n    public function testWriteNonExistingAndNotCreatableFileResource()\n    {\n        if (defined('PHP_WINDOWS_VERSION_BUILD')) {\n            $this->markTestSkipped('Permissions checks can not run on windows');\n        }\n        $handler = new StreamHandler('file:///foo/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000));\n        $handler->handle($this->getRecord());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SwiftMailerHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\nuse Monolog\\TestCase;\n\nclass SwiftMailerHandlerTest extends TestCase\n{\n    /** @var \\Swift_Mailer|\\PHPUnit_Framework_MockObject_MockObject */\n    private $mailer;\n\n    public function setUp()\n    {\n        $this->mailer = $this\n            ->getMockBuilder('Swift_Mailer')\n            ->disableOriginalConstructor()\n            ->getMock();\n    }\n\n    public function testMessageCreationIsLazyWhenUsingCallback()\n    {\n        $this->mailer->expects($this->never())\n            ->method('send');\n\n        $callback = function () {\n            throw new \\RuntimeException('Swift_Message creation callback should not have been called in this test');\n        };\n        $handler = new SwiftMailerHandler($this->mailer, $callback);\n\n        $records = array(\n            $this->getRecord(Logger::DEBUG),\n            $this->getRecord(Logger::INFO),\n        );\n        $handler->handleBatch($records);\n    }\n\n    public function testMessageCanBeCustomizedGivenLoggedData()\n    {\n        // Wire Mailer to expect a specific Swift_Message with a customized Subject\n        $expectedMessage = new \\Swift_Message();\n        $this->mailer->expects($this->once())\n            ->method('send')\n            ->with($this->callback(function ($value) use ($expectedMessage) {\n                return $value instanceof \\Swift_Message\n                    && $value->getSubject() === 'Emergency'\n                    && $value === $expectedMessage;\n            }));\n\n        // Callback dynamically changes subject based on number of logged records\n        $callback = function ($content, array $records) use ($expectedMessage) {\n            $subject = count($records) > 0 ? 'Emergency' : 'Normal';\n            $expectedMessage->setSubject($subject);\n\n            return $expectedMessage;\n        };\n        $handler = new SwiftMailerHandler($this->mailer, $callback);\n\n        // Logging 1 record makes this an Emergency\n        $records = array(\n            $this->getRecord(Logger::EMERGENCY),\n        );\n        $handler->handleBatch($records);\n    }\n\n    public function testMessageSubjectFormatting()\n    {\n        // Wire Mailer to expect a specific Swift_Message with a customized Subject\n        $messageTemplate = new \\Swift_Message();\n        $messageTemplate->setSubject('Alert: %level_name% %message%');\n        $receivedMessage = null;\n\n        $this->mailer->expects($this->once())\n            ->method('send')\n            ->with($this->callback(function ($value) use (&$receivedMessage) {\n                $receivedMessage = $value;\n                return true;\n            }));\n\n        $handler = new SwiftMailerHandler($this->mailer, $messageTemplate);\n\n        $records = array(\n            $this->getRecord(Logger::EMERGENCY),\n        );\n        $handler->handleBatch($records);\n\n        $this->assertEquals('Alert: EMERGENCY test', $receivedMessage->getSubject());\n    }\n\n    public function testMessageHaveUniqueId()\n    {\n        $messageTemplate = new \\Swift_Message();\n        $handler = new SwiftMailerHandler($this->mailer, $messageTemplate);\n\n        $method = new \\ReflectionMethod('Monolog\\Handler\\SwiftMailerHandler', 'buildMessage');\n        $method->setAccessible(true);\n        $method->invokeArgs($handler, array($messageTemplate, array()));\n\n        $builtMessage1 = $method->invoke($handler, $messageTemplate, array());\n        $builtMessage2 = $method->invoke($handler, $messageTemplate, array());\n\n        $this->assertFalse($builtMessage1->getId() === $builtMessage2->getId(), 'Two different messages have the same id');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\Logger;\n\nclass SyslogHandlerTest extends \\PHPUnit_Framework_TestCase\n{\n    /**\n     * @covers Monolog\\Handler\\SyslogHandler::__construct\n     */\n    public function testConstruct()\n    {\n        $handler = new SyslogHandler('test');\n        $this->assertInstanceOf('Monolog\\Handler\\SyslogHandler', $handler);\n\n        $handler = new SyslogHandler('test', LOG_USER);\n        $this->assertInstanceOf('Monolog\\Handler\\SyslogHandler', $handler);\n\n        $handler = new SyslogHandler('test', 'user');\n        $this->assertInstanceOf('Monolog\\Handler\\SyslogHandler', $handler);\n\n        $handler = new SyslogHandler('test', LOG_USER, Logger::DEBUG, true, LOG_PERROR);\n        $this->assertInstanceOf('Monolog\\Handler\\SyslogHandler', $handler);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\SyslogHandler::__construct\n     */\n    public function testConstructInvalidFacility()\n    {\n        $this->setExpectedException('UnexpectedValueException');\n        $handler = new SyslogHandler('test', 'unknown');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\n\n/**\n * @requires extension sockets\n */\nclass SyslogUdpHandlerTest extends TestCase\n{\n    /**\n     * @expectedException UnexpectedValueException\n     */\n    public function testWeValidateFacilities()\n    {\n        $handler = new SyslogUdpHandler(\"ip\", null, \"invalidFacility\");\n    }\n\n    public function testWeSplitIntoLines()\n    {\n        $time = '2014-01-07T12:34';\n        $pid = getmypid();\n        $host = gethostname();\n\n        $handler = $this->getMockBuilder('\\Monolog\\Handler\\SyslogUdpHandler')\n            ->setConstructorArgs(array(\"127.0.0.1\", 514, \"authpriv\"))\n            ->setMethods(array('getDateTime'))\n            ->getMock();\n\n        $handler->method('getDateTime')\n            ->willReturn($time);\n\n        $handler->setFormatter(new \\Monolog\\Formatter\\ChromePHPFormatter());\n\n        $socket = $this->getMock('\\Monolog\\Handler\\SyslogUdp\\UdpSocket', array('write'), array('lol', 'lol'));\n        $socket->expects($this->at(0))\n            ->method('write')\n            ->with(\"lol\", \"<\".(LOG_AUTHPRIV + LOG_WARNING).\">1 $time $host php $pid - - \");\n        $socket->expects($this->at(1))\n            ->method('write')\n            ->with(\"hej\", \"<\".(LOG_AUTHPRIV + LOG_WARNING).\">1 $time $host php $pid - - \");\n\n        $handler->setSocket($socket);\n\n        $handler->handle($this->getRecordWithMessage(\"hej\\nlol\"));\n    }\n\n    public function testSplitWorksOnEmptyMsg()\n    {\n        $handler = new SyslogUdpHandler(\"127.0.0.1\", 514, \"authpriv\");\n        $handler->setFormatter($this->getIdentityFormatter());\n\n        $socket = $this->getMock('\\Monolog\\Handler\\SyslogUdp\\UdpSocket', array('write'), array('lol', 'lol'));\n        $socket->expects($this->never())\n            ->method('write');\n\n        $handler->setSocket($socket);\n\n        $handler->handle($this->getRecordWithMessage(null));\n    }\n\n    protected function getRecordWithMessage($msg)\n    {\n        return array('message' => $msg, 'level' => \\Monolog\\Logger::WARNING, 'context' => null, 'extra' => array(), 'channel' => 'lol');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\n/**\n * @covers Monolog\\Handler\\TestHandler\n */\nclass TestHandlerTest extends TestCase\n{\n    /**\n     * @dataProvider methodProvider\n     */\n    public function testHandler($method, $level)\n    {\n        $handler = new TestHandler;\n        $record = $this->getRecord($level, 'test'.$method);\n        $this->assertFalse($handler->hasRecords($level));\n        $this->assertFalse($handler->hasRecord($record, $level));\n        $this->assertFalse($handler->{'has'.$method}($record), 'has'.$method);\n        $this->assertFalse($handler->{'has'.$method.'ThatContains'}('test'), 'has'.$method.'ThatContains');\n        $this->assertFalse($handler->{'has'.$method.'ThatPasses'}(function ($rec) {\n            return true;\n        }), 'has'.$method.'ThatPasses');\n        $this->assertFalse($handler->{'has'.$method.'ThatMatches'}('/test\\w+/'));\n        $this->assertFalse($handler->{'has'.$method.'Records'}(), 'has'.$method.'Records');\n        $handler->handle($record);\n\n        $this->assertFalse($handler->{'has'.$method}('bar'), 'has'.$method);\n        $this->assertTrue($handler->hasRecords($level));\n        $this->assertTrue($handler->hasRecord($record, $level));\n        $this->assertTrue($handler->{'has'.$method}($record), 'has'.$method);\n        $this->assertTrue($handler->{'has'.$method}('test'.$method), 'has'.$method);\n        $this->assertTrue($handler->{'has'.$method.'ThatContains'}('test'), 'has'.$method.'ThatContains');\n        $this->assertTrue($handler->{'has'.$method.'ThatPasses'}(function ($rec) {\n            return true;\n        }), 'has'.$method.'ThatPasses');\n        $this->assertTrue($handler->{'has'.$method.'ThatMatches'}('/test\\w+/'));\n        $this->assertTrue($handler->{'has'.$method.'Records'}(), 'has'.$method.'Records');\n\n        $records = $handler->getRecords();\n        unset($records[0]['formatted']);\n        $this->assertEquals(array($record), $records);\n    }\n\n    public function methodProvider()\n    {\n        return array(\n            array('Emergency', Logger::EMERGENCY),\n            array('Alert'    , Logger::ALERT),\n            array('Critical' , Logger::CRITICAL),\n            array('Error'    , Logger::ERROR),\n            array('Warning'  , Logger::WARNING),\n            array('Info'     , Logger::INFO),\n            array('Notice'   , Logger::NOTICE),\n            array('Debug'    , Logger::DEBUG),\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Handler\\SyslogUdp\\UdpSocket;\n\n/**\n * @requires extension sockets\n */\nclass UdpSocketTest extends TestCase\n{\n    public function testWeDoNotTruncateShortMessages()\n    {\n        $socket = $this->getMock('\\Monolog\\Handler\\SyslogUdp\\UdpSocket', array('send'), array('lol', 'lol'));\n\n        $socket->expects($this->at(0))\n            ->method('send')\n            ->with(\"HEADER: The quick brown fox jumps over the lazy dog\");\n\n        $socket->write(\"The quick brown fox jumps over the lazy dog\", \"HEADER: \");\n    }\n\n    public function testLongMessagesAreTruncated()\n    {\n        $socket = $this->getMock('\\Monolog\\Handler\\SyslogUdp\\UdpSocket', array('send'), array('lol', 'lol'));\n\n        $truncatedString = str_repeat(\"derp\", 16254).'d';\n\n        $socket->expects($this->exactly(1))\n            ->method('send')\n            ->with(\"HEADER\" . $truncatedString);\n\n        $longString = str_repeat(\"derp\", 20000);\n\n        $socket->write($longString, \"HEADER\");\n    }\n\n    public function testDoubleCloseDoesNotError()\n    {\n        $socket = new UdpSocket('127.0.0.1', 514);\n        $socket->close();\n        $socket->close();\n    }\n\n    /**\n     * @expectedException LogicException\n     */\n    public function testWriteAfterCloseErrors()\n    {\n        $socket = new UdpSocket('127.0.0.1', 514);\n        $socket->close();\n        $socket->write('foo', \"HEADER\");\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\nuse Monolog\\Logger;\n\nclass WhatFailureGroupHandlerTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Handler\\WhatFailureGroupHandler::__construct\n     * @expectedException InvalidArgumentException\n     */\n    public function testConstructorOnlyTakesHandler()\n    {\n        new WhatFailureGroupHandler(array(new TestHandler(), \"foo\"));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\WhatFailureGroupHandler::__construct\n     * @covers Monolog\\Handler\\WhatFailureGroupHandler::handle\n     */\n    public function testHandle()\n    {\n        $testHandlers = array(new TestHandler(), new TestHandler());\n        $handler = new WhatFailureGroupHandler($testHandlers);\n        $handler->handle($this->getRecord(Logger::DEBUG));\n        $handler->handle($this->getRecord(Logger::INFO));\n        foreach ($testHandlers as $test) {\n            $this->assertTrue($test->hasDebugRecords());\n            $this->assertTrue($test->hasInfoRecords());\n            $this->assertTrue(count($test->getRecords()) === 2);\n        }\n    }\n\n    /**\n     * @covers Monolog\\Handler\\WhatFailureGroupHandler::handleBatch\n     */\n    public function testHandleBatch()\n    {\n        $testHandlers = array(new TestHandler(), new TestHandler());\n        $handler = new WhatFailureGroupHandler($testHandlers);\n        $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO)));\n        foreach ($testHandlers as $test) {\n            $this->assertTrue($test->hasDebugRecords());\n            $this->assertTrue($test->hasInfoRecords());\n            $this->assertTrue(count($test->getRecords()) === 2);\n        }\n    }\n\n    /**\n     * @covers Monolog\\Handler\\WhatFailureGroupHandler::isHandling\n     */\n    public function testIsHandling()\n    {\n        $testHandlers = array(new TestHandler(Logger::ERROR), new TestHandler(Logger::WARNING));\n        $handler = new WhatFailureGroupHandler($testHandlers);\n        $this->assertTrue($handler->isHandling($this->getRecord(Logger::ERROR)));\n        $this->assertTrue($handler->isHandling($this->getRecord(Logger::WARNING)));\n        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));\n    }\n\n    /**\n     * @covers Monolog\\Handler\\WhatFailureGroupHandler::handle\n     */\n    public function testHandleUsesProcessors()\n    {\n        $test = new TestHandler();\n        $handler = new WhatFailureGroupHandler(array($test));\n        $handler->pushProcessor(function ($record) {\n            $record['extra']['foo'] = true;\n\n            return $record;\n        });\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertTrue($test->hasWarningRecords());\n        $records = $test->getRecords();\n        $this->assertTrue($records[0]['extra']['foo']);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\WhatFailureGroupHandler::handle\n     */\n    public function testHandleException()\n    {\n        $test = new TestHandler();\n        $exception = new ExceptionTestHandler();\n        $handler = new WhatFailureGroupHandler(array($exception, $test, $exception));\n        $handler->pushProcessor(function ($record) {\n            $record['extra']['foo'] = true;\n\n            return $record;\n        });\n        $handler->handle($this->getRecord(Logger::WARNING));\n        $this->assertTrue($test->hasWarningRecords());\n        $records = $test->getRecords();\n        $this->assertTrue($records[0]['extra']['foo']);\n    }\n}\n\nclass ExceptionTestHandler extends TestHandler\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function handle(array $record)\n    {\n        parent::handle($record);\n\n        throw new \\Exception(\"ExceptionTestHandler::handle\");\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php",
    "content": "<?php\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Handler;\n\nuse Monolog\\TestCase;\n\nclass ZendMonitorHandlerTest extends TestCase\n{\n    protected $zendMonitorHandler;\n\n    public function setUp()\n    {\n        if (!function_exists('zend_monitor_custom_event')) {\n            $this->markTestSkipped('ZendServer is not installed');\n        }\n    }\n\n    /**\n     * @covers  Monolog\\Handler\\ZendMonitorHandler::write\n     */\n    public function testWrite()\n    {\n        $record = $this->getRecord();\n        $formatterResult = array(\n            'message' => $record['message'],\n        );\n\n        $zendMonitor = $this->getMockBuilder('Monolog\\Handler\\ZendMonitorHandler')\n            ->setMethods(array('writeZendMonitorCustomEvent', 'getDefaultFormatter'))\n            ->getMock();\n\n        $formatterMock = $this->getMockBuilder('Monolog\\Formatter\\NormalizerFormatter')\n            ->disableOriginalConstructor()\n            ->getMock();\n\n        $formatterMock->expects($this->once())\n            ->method('format')\n            ->will($this->returnValue($formatterResult));\n\n        $zendMonitor->expects($this->once())\n            ->method('getDefaultFormatter')\n            ->will($this->returnValue($formatterMock));\n\n        $levelMap = $zendMonitor->getLevelMap();\n\n        $zendMonitor->expects($this->once())\n            ->method('writeZendMonitorCustomEvent')\n            ->with($levelMap[$record['level']], $record['message'], $formatterResult);\n\n        $zendMonitor->handle($record);\n    }\n\n    /**\n     * @covers Monolog\\Handler\\ZendMonitorHandler::getDefaultFormatter\n     */\n    public function testGetDefaultFormatterReturnsNormalizerFormatter()\n    {\n        $zendMonitor = new ZendMonitorHandler();\n        $this->assertInstanceOf('Monolog\\Formatter\\NormalizerFormatter', $zendMonitor->getDefaultFormatter());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/LoggerTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse Monolog\\Processor\\WebProcessor;\nuse Monolog\\Handler\\TestHandler;\n\nclass LoggerTest extends \\PHPUnit_Framework_TestCase\n{\n    /**\n     * @covers Monolog\\Logger::getName\n     */\n    public function testGetName()\n    {\n        $logger = new Logger('foo');\n        $this->assertEquals('foo', $logger->getName());\n    }\n\n    /**\n     * @covers Monolog\\Logger::getLevelName\n     */\n    public function testGetLevelName()\n    {\n        $this->assertEquals('ERROR', Logger::getLevelName(Logger::ERROR));\n    }\n\n    /**\n     * @covers Monolog\\Logger::withName\n     */\n    public function testWithName()\n    {\n        $first = new Logger('first', array($handler = new TestHandler()));\n        $second = $first->withName('second');\n\n        $this->assertSame('first', $first->getName());\n        $this->assertSame('second', $second->getName());\n        $this->assertSame($handler, $second->popHandler());\n    }\n\n    /**\n     * @covers Monolog\\Logger::toMonologLevel\n     */\n    public function testConvertPSR3ToMonologLevel()\n    {\n        $this->assertEquals(Logger::toMonologLevel('debug'), 100);\n        $this->assertEquals(Logger::toMonologLevel('info'), 200);\n        $this->assertEquals(Logger::toMonologLevel('notice'), 250);\n        $this->assertEquals(Logger::toMonologLevel('warning'), 300);\n        $this->assertEquals(Logger::toMonologLevel('error'), 400);\n        $this->assertEquals(Logger::toMonologLevel('critical'), 500);\n        $this->assertEquals(Logger::toMonologLevel('alert'), 550);\n        $this->assertEquals(Logger::toMonologLevel('emergency'), 600);\n    }\n\n    /**\n     * @covers Monolog\\Logger::getLevelName\n     * @expectedException InvalidArgumentException\n     */\n    public function testGetLevelNameThrows()\n    {\n        Logger::getLevelName(5);\n    }\n\n    /**\n     * @covers Monolog\\Logger::__construct\n     */\n    public function testChannel()\n    {\n        $logger = new Logger('foo');\n        $handler = new TestHandler;\n        $logger->pushHandler($handler);\n        $logger->addWarning('test');\n        list($record) = $handler->getRecords();\n        $this->assertEquals('foo', $record['channel']);\n    }\n\n    /**\n     * @covers Monolog\\Logger::addRecord\n     */\n    public function testLog()\n    {\n        $logger = new Logger(__METHOD__);\n\n        $handler = $this->getMock('Monolog\\Handler\\NullHandler', array('handle'));\n        $handler->expects($this->once())\n            ->method('handle');\n        $logger->pushHandler($handler);\n\n        $this->assertTrue($logger->addWarning('test'));\n    }\n\n    /**\n     * @covers Monolog\\Logger::addRecord\n     */\n    public function testLogNotHandled()\n    {\n        $logger = new Logger(__METHOD__);\n\n        $handler = $this->getMock('Monolog\\Handler\\NullHandler', array('handle'), array(Logger::ERROR));\n        $handler->expects($this->never())\n            ->method('handle');\n        $logger->pushHandler($handler);\n\n        $this->assertFalse($logger->addWarning('test'));\n    }\n\n    public function testHandlersInCtor()\n    {\n        $handler1 = new TestHandler;\n        $handler2 = new TestHandler;\n        $logger = new Logger(__METHOD__, array($handler1, $handler2));\n\n        $this->assertEquals($handler1, $logger->popHandler());\n        $this->assertEquals($handler2, $logger->popHandler());\n    }\n\n    public function testProcessorsInCtor()\n    {\n        $processor1 = new WebProcessor;\n        $processor2 = new WebProcessor;\n        $logger = new Logger(__METHOD__, array(), array($processor1, $processor2));\n\n        $this->assertEquals($processor1, $logger->popProcessor());\n        $this->assertEquals($processor2, $logger->popProcessor());\n    }\n\n    /**\n     * @covers Monolog\\Logger::pushHandler\n     * @covers Monolog\\Logger::popHandler\n     * @expectedException LogicException\n     */\n    public function testPushPopHandler()\n    {\n        $logger = new Logger(__METHOD__);\n        $handler1 = new TestHandler;\n        $handler2 = new TestHandler;\n\n        $logger->pushHandler($handler1);\n        $logger->pushHandler($handler2);\n\n        $this->assertEquals($handler2, $logger->popHandler());\n        $this->assertEquals($handler1, $logger->popHandler());\n        $logger->popHandler();\n    }\n\n    /**\n     * @covers Monolog\\Logger::setHandlers\n     */\n    public function testSetHandlers()\n    {\n        $logger = new Logger(__METHOD__);\n        $handler1 = new TestHandler;\n        $handler2 = new TestHandler;\n\n        $logger->pushHandler($handler1);\n        $logger->setHandlers(array($handler2));\n\n        // handler1 has been removed\n        $this->assertEquals(array($handler2), $logger->getHandlers());\n\n        $logger->setHandlers(array(\n            \"AMapKey\" => $handler1,\n            \"Woop\" => $handler2,\n        ));\n\n        // Keys have been scrubbed\n        $this->assertEquals(array($handler1, $handler2), $logger->getHandlers());\n    }\n\n    /**\n     * @covers Monolog\\Logger::pushProcessor\n     * @covers Monolog\\Logger::popProcessor\n     * @expectedException LogicException\n     */\n    public function testPushPopProcessor()\n    {\n        $logger = new Logger(__METHOD__);\n        $processor1 = new WebProcessor;\n        $processor2 = new WebProcessor;\n\n        $logger->pushProcessor($processor1);\n        $logger->pushProcessor($processor2);\n\n        $this->assertEquals($processor2, $logger->popProcessor());\n        $this->assertEquals($processor1, $logger->popProcessor());\n        $logger->popProcessor();\n    }\n\n    /**\n     * @covers Monolog\\Logger::pushProcessor\n     * @expectedException InvalidArgumentException\n     */\n    public function testPushProcessorWithNonCallable()\n    {\n        $logger = new Logger(__METHOD__);\n\n        $logger->pushProcessor(new \\stdClass());\n    }\n\n    /**\n     * @covers Monolog\\Logger::addRecord\n     */\n    public function testProcessorsAreExecuted()\n    {\n        $logger = new Logger(__METHOD__);\n        $handler = new TestHandler;\n        $logger->pushHandler($handler);\n        $logger->pushProcessor(function ($record) {\n            $record['extra']['win'] = true;\n\n            return $record;\n        });\n        $logger->addError('test');\n        list($record) = $handler->getRecords();\n        $this->assertTrue($record['extra']['win']);\n    }\n\n    /**\n     * @covers Monolog\\Logger::addRecord\n     */\n    public function testProcessorsAreCalledOnlyOnce()\n    {\n        $logger = new Logger(__METHOD__);\n        $handler = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler->expects($this->any())\n            ->method('isHandling')\n            ->will($this->returnValue(true))\n        ;\n        $handler->expects($this->any())\n            ->method('handle')\n            ->will($this->returnValue(true))\n        ;\n        $logger->pushHandler($handler);\n\n        $processor = $this->getMockBuilder('Monolog\\Processor\\WebProcessor')\n            ->disableOriginalConstructor()\n            ->setMethods(array('__invoke'))\n            ->getMock()\n        ;\n        $processor->expects($this->once())\n            ->method('__invoke')\n            ->will($this->returnArgument(0))\n        ;\n        $logger->pushProcessor($processor);\n\n        $logger->addError('test');\n    }\n\n    /**\n     * @covers Monolog\\Logger::addRecord\n     */\n    public function testProcessorsNotCalledWhenNotHandled()\n    {\n        $logger = new Logger(__METHOD__);\n        $handler = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler->expects($this->once())\n            ->method('isHandling')\n            ->will($this->returnValue(false))\n        ;\n        $logger->pushHandler($handler);\n        $that = $this;\n        $logger->pushProcessor(function ($record) use ($that) {\n            $that->fail('The processor should not be called');\n        });\n        $logger->addAlert('test');\n    }\n\n    /**\n     * @covers Monolog\\Logger::addRecord\n     */\n    public function testHandlersNotCalledBeforeFirstHandling()\n    {\n        $logger = new Logger(__METHOD__);\n\n        $handler1 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler1->expects($this->never())\n            ->method('isHandling')\n            ->will($this->returnValue(false))\n        ;\n        $handler1->expects($this->once())\n            ->method('handle')\n            ->will($this->returnValue(false))\n        ;\n        $logger->pushHandler($handler1);\n\n        $handler2 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler2->expects($this->once())\n            ->method('isHandling')\n            ->will($this->returnValue(true))\n        ;\n        $handler2->expects($this->once())\n            ->method('handle')\n            ->will($this->returnValue(false))\n        ;\n        $logger->pushHandler($handler2);\n\n        $handler3 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler3->expects($this->once())\n            ->method('isHandling')\n            ->will($this->returnValue(false))\n        ;\n        $handler3->expects($this->never())\n            ->method('handle')\n        ;\n        $logger->pushHandler($handler3);\n\n        $logger->debug('test');\n    }\n\n    /**\n     * @covers Monolog\\Logger::addRecord\n     */\n    public function testHandlersNotCalledBeforeFirstHandlingWithAssocArray()\n    {\n        $handler1 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler1->expects($this->never())\n            ->method('isHandling')\n            ->will($this->returnValue(false))\n        ;\n        $handler1->expects($this->once())\n            ->method('handle')\n            ->will($this->returnValue(false))\n        ;\n\n        $handler2 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler2->expects($this->once())\n            ->method('isHandling')\n            ->will($this->returnValue(true))\n        ;\n        $handler2->expects($this->once())\n            ->method('handle')\n            ->will($this->returnValue(false))\n        ;\n\n        $handler3 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler3->expects($this->once())\n            ->method('isHandling')\n            ->will($this->returnValue(false))\n        ;\n        $handler3->expects($this->never())\n            ->method('handle')\n        ;\n\n        $logger = new Logger(__METHOD__, array('last' => $handler3, 'second' => $handler2, 'first' => $handler1));\n\n        $logger->debug('test');\n    }\n\n    /**\n     * @covers Monolog\\Logger::addRecord\n     */\n    public function testBubblingWhenTheHandlerReturnsFalse()\n    {\n        $logger = new Logger(__METHOD__);\n\n        $handler1 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler1->expects($this->any())\n            ->method('isHandling')\n            ->will($this->returnValue(true))\n        ;\n        $handler1->expects($this->once())\n            ->method('handle')\n            ->will($this->returnValue(false))\n        ;\n        $logger->pushHandler($handler1);\n\n        $handler2 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler2->expects($this->any())\n            ->method('isHandling')\n            ->will($this->returnValue(true))\n        ;\n        $handler2->expects($this->once())\n            ->method('handle')\n            ->will($this->returnValue(false))\n        ;\n        $logger->pushHandler($handler2);\n\n        $logger->debug('test');\n    }\n\n    /**\n     * @covers Monolog\\Logger::addRecord\n     */\n    public function testNotBubblingWhenTheHandlerReturnsTrue()\n    {\n        $logger = new Logger(__METHOD__);\n\n        $handler1 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler1->expects($this->any())\n            ->method('isHandling')\n            ->will($this->returnValue(true))\n        ;\n        $handler1->expects($this->never())\n            ->method('handle')\n        ;\n        $logger->pushHandler($handler1);\n\n        $handler2 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler2->expects($this->any())\n            ->method('isHandling')\n            ->will($this->returnValue(true))\n        ;\n        $handler2->expects($this->once())\n            ->method('handle')\n            ->will($this->returnValue(true))\n        ;\n        $logger->pushHandler($handler2);\n\n        $logger->debug('test');\n    }\n\n    /**\n     * @covers Monolog\\Logger::isHandling\n     */\n    public function testIsHandling()\n    {\n        $logger = new Logger(__METHOD__);\n\n        $handler1 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler1->expects($this->any())\n            ->method('isHandling')\n            ->will($this->returnValue(false))\n        ;\n\n        $logger->pushHandler($handler1);\n        $this->assertFalse($logger->isHandling(Logger::DEBUG));\n\n        $handler2 = $this->getMock('Monolog\\Handler\\HandlerInterface');\n        $handler2->expects($this->any())\n            ->method('isHandling')\n            ->will($this->returnValue(true))\n        ;\n\n        $logger->pushHandler($handler2);\n        $this->assertTrue($logger->isHandling(Logger::DEBUG));\n    }\n\n    /**\n     * @dataProvider logMethodProvider\n     * @covers Monolog\\Logger::addDebug\n     * @covers Monolog\\Logger::addInfo\n     * @covers Monolog\\Logger::addNotice\n     * @covers Monolog\\Logger::addWarning\n     * @covers Monolog\\Logger::addError\n     * @covers Monolog\\Logger::addCritical\n     * @covers Monolog\\Logger::addAlert\n     * @covers Monolog\\Logger::addEmergency\n     * @covers Monolog\\Logger::debug\n     * @covers Monolog\\Logger::info\n     * @covers Monolog\\Logger::notice\n     * @covers Monolog\\Logger::warn\n     * @covers Monolog\\Logger::err\n     * @covers Monolog\\Logger::crit\n     * @covers Monolog\\Logger::alert\n     * @covers Monolog\\Logger::emerg\n     */\n    public function testLogMethods($method, $expectedLevel)\n    {\n        $logger = new Logger('foo');\n        $handler = new TestHandler;\n        $logger->pushHandler($handler);\n        $logger->{$method}('test');\n        list($record) = $handler->getRecords();\n        $this->assertEquals($expectedLevel, $record['level']);\n    }\n\n    public function logMethodProvider()\n    {\n        return array(\n            // monolog methods\n            array('addDebug',     Logger::DEBUG),\n            array('addInfo',      Logger::INFO),\n            array('addNotice',    Logger::NOTICE),\n            array('addWarning',   Logger::WARNING),\n            array('addError',     Logger::ERROR),\n            array('addCritical',  Logger::CRITICAL),\n            array('addAlert',     Logger::ALERT),\n            array('addEmergency', Logger::EMERGENCY),\n\n            // ZF/Sf2 compat methods\n            array('debug',  Logger::DEBUG),\n            array('info',   Logger::INFO),\n            array('notice', Logger::NOTICE),\n            array('warn',   Logger::WARNING),\n            array('err',    Logger::ERROR),\n            array('crit',   Logger::CRITICAL),\n            array('alert',  Logger::ALERT),\n            array('emerg',  Logger::EMERGENCY),\n        );\n    }\n\n    /**\n     * @dataProvider setTimezoneProvider\n     * @covers Monolog\\Logger::setTimezone\n     */\n    public function testSetTimezone($tz)\n    {\n        Logger::setTimezone($tz);\n        $logger = new Logger('foo');\n        $handler = new TestHandler;\n        $logger->pushHandler($handler);\n        $logger->info('test');\n        list($record) = $handler->getRecords();\n        $this->assertEquals($tz, $record['datetime']->getTimezone());\n    }\n\n    public function setTimezoneProvider()\n    {\n        return array_map(\n            function ($tz) { return array(new \\DateTimeZone($tz)); },\n            \\DateTimeZone::listIdentifiers()\n        );\n    }\n\n    /**\n     * @dataProvider useMicrosecondTimestampsProvider\n     * @covers Monolog\\Logger::useMicrosecondTimestamps\n     * @covers Monolog\\Logger::addRecord\n     */\n    public function testUseMicrosecondTimestamps($micro, $assert)\n    {\n        $logger = new Logger('foo');\n        $logger->useMicrosecondTimestamps($micro);\n        $handler = new TestHandler;\n        $logger->pushHandler($handler);\n        $logger->info('test');\n        list($record) = $handler->getRecords();\n        $this->{$assert}('000000', $record['datetime']->format('u'));\n    }\n\n    public function useMicrosecondTimestampsProvider()\n    {\n        return array(\n            // this has a very small chance of a false negative (1/10^6)\n            'with microseconds' => array(true, 'assertNotSame'),\n            'without microseconds' => array(false, PHP_VERSION_ID >= 70100 ? 'assertNotSame' : 'assertSame'),\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\TestCase;\n\nclass GitProcessorTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Processor\\GitProcessor::__invoke\n     */\n    public function testProcessor()\n    {\n        $processor = new GitProcessor();\n        $record = $processor($this->getRecord());\n\n        $this->assertArrayHasKey('git', $record['extra']);\n        $this->assertTrue(!is_array($record['extra']['git']['branch']));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Acme;\n\nclass Tester\n{\n    public function test($handler, $record)\n    {\n        $handler->handle($record);\n    }\n}\n\nfunction tester($handler, $record)\n{\n    $handler->handle($record);\n}\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\Logger;\nuse Monolog\\TestCase;\nuse Monolog\\Handler\\TestHandler;\n\nclass IntrospectionProcessorTest extends TestCase\n{\n    public function getHandler()\n    {\n        $processor = new IntrospectionProcessor();\n        $handler = new TestHandler();\n        $handler->pushProcessor($processor);\n\n        return $handler;\n    }\n\n    public function testProcessorFromClass()\n    {\n        $handler = $this->getHandler();\n        $tester = new \\Acme\\Tester;\n        $tester->test($handler, $this->getRecord());\n        list($record) = $handler->getRecords();\n        $this->assertEquals(__FILE__, $record['extra']['file']);\n        $this->assertEquals(18, $record['extra']['line']);\n        $this->assertEquals('Acme\\Tester', $record['extra']['class']);\n        $this->assertEquals('test', $record['extra']['function']);\n    }\n\n    public function testProcessorFromFunc()\n    {\n        $handler = $this->getHandler();\n        \\Acme\\tester($handler, $this->getRecord());\n        list($record) = $handler->getRecords();\n        $this->assertEquals(__FILE__, $record['extra']['file']);\n        $this->assertEquals(24, $record['extra']['line']);\n        $this->assertEquals(null, $record['extra']['class']);\n        $this->assertEquals('Acme\\tester', $record['extra']['function']);\n    }\n\n    public function testLevelTooLow()\n    {\n        $input = array(\n            'level' => Logger::DEBUG,\n            'extra' => array(),\n        );\n\n        $expected = $input;\n\n        $processor = new IntrospectionProcessor(Logger::CRITICAL);\n        $actual = $processor($input);\n\n        $this->assertEquals($expected, $actual);\n    }\n\n    public function testLevelEqual()\n    {\n        $input = array(\n            'level' => Logger::CRITICAL,\n            'extra' => array(),\n        );\n\n        $expected = $input;\n        $expected['extra'] = array(\n            'file' => null,\n            'line' => null,\n            'class' => 'ReflectionMethod',\n            'function' => 'invokeArgs',\n        );\n\n        $processor = new IntrospectionProcessor(Logger::CRITICAL);\n        $actual = $processor($input);\n\n        $this->assertEquals($expected, $actual);\n    }\n\n    public function testLevelHigher()\n    {\n        $input = array(\n            'level' => Logger::EMERGENCY,\n            'extra' => array(),\n        );\n\n        $expected = $input;\n        $expected['extra'] = array(\n            'file' => null,\n            'line' => null,\n            'class' => 'ReflectionMethod',\n            'function' => 'invokeArgs',\n        );\n\n        $processor = new IntrospectionProcessor(Logger::CRITICAL);\n        $actual = $processor($input);\n\n        $this->assertEquals($expected, $actual);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\TestCase;\n\nclass MemoryPeakUsageProcessorTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Processor\\MemoryPeakUsageProcessor::__invoke\n     * @covers Monolog\\Processor\\MemoryProcessor::formatBytes\n     */\n    public function testProcessor()\n    {\n        $processor = new MemoryPeakUsageProcessor();\n        $record = $processor($this->getRecord());\n        $this->assertArrayHasKey('memory_peak_usage', $record['extra']);\n        $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_peak_usage']);\n    }\n\n    /**\n     * @covers Monolog\\Processor\\MemoryPeakUsageProcessor::__invoke\n     * @covers Monolog\\Processor\\MemoryProcessor::formatBytes\n     */\n    public function testProcessorWithoutFormatting()\n    {\n        $processor = new MemoryPeakUsageProcessor(true, false);\n        $record = $processor($this->getRecord());\n        $this->assertArrayHasKey('memory_peak_usage', $record['extra']);\n        $this->assertInternalType('int', $record['extra']['memory_peak_usage']);\n        $this->assertGreaterThan(0, $record['extra']['memory_peak_usage']);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\TestCase;\n\nclass MemoryUsageProcessorTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Processor\\MemoryUsageProcessor::__invoke\n     * @covers Monolog\\Processor\\MemoryProcessor::formatBytes\n     */\n    public function testProcessor()\n    {\n        $processor = new MemoryUsageProcessor();\n        $record = $processor($this->getRecord());\n        $this->assertArrayHasKey('memory_usage', $record['extra']);\n        $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_usage']);\n    }\n\n    /**\n     * @covers Monolog\\Processor\\MemoryUsageProcessor::__invoke\n     * @covers Monolog\\Processor\\MemoryProcessor::formatBytes\n     */\n    public function testProcessorWithoutFormatting()\n    {\n        $processor = new MemoryUsageProcessor(true, false);\n        $record = $processor($this->getRecord());\n        $this->assertArrayHasKey('memory_usage', $record['extra']);\n        $this->assertInternalType('int', $record['extra']['memory_usage']);\n        $this->assertGreaterThan(0, $record['extra']['memory_usage']);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/MercurialProcessorTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jonathan A. Schweder <jonathanschweder@gmail.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\TestCase;\n\nclass MercurialProcessorTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Processor\\MercurialProcessor::__invoke\n     */\n    public function testProcessor()\n    {\n        if (defined('PHP_WINDOWS_VERSION_BUILD')) {\n            exec(\"where hg 2>NUL\", $output, $result);\n        } else {\n            exec(\"which hg 2>/dev/null >/dev/null\", $output, $result);\n        }\n        if ($result != 0) {\n            $this->markTestSkipped('hg is missing');\n            return;\n        }\n\n        `hg init`;\n        $processor = new MercurialProcessor();\n        $record = $processor($this->getRecord());\n\n        $this->assertArrayHasKey('hg', $record['extra']);\n        $this->assertTrue(!is_array($record['extra']['hg']['branch']));\n        $this->assertTrue(!is_array($record['extra']['hg']['revision']));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\TestCase;\n\nclass ProcessIdProcessorTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Processor\\ProcessIdProcessor::__invoke\n     */\n    public function testProcessor()\n    {\n        $processor = new ProcessIdProcessor();\n        $record = $processor($this->getRecord());\n        $this->assertArrayHasKey('process_id', $record['extra']);\n        $this->assertInternalType('int', $record['extra']['process_id']);\n        $this->assertGreaterThan(0, $record['extra']['process_id']);\n        $this->assertEquals(getmypid(), $record['extra']['process_id']);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/PsrLogMessageProcessorTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nclass PsrLogMessageProcessorTest extends \\PHPUnit_Framework_TestCase\n{\n    /**\n     * @dataProvider getPairs\n     */\n    public function testReplacement($val, $expected)\n    {\n        $proc = new PsrLogMessageProcessor;\n\n        $message = $proc(array(\n            'message' => '{foo}',\n            'context' => array('foo' => $val),\n        ));\n        $this->assertEquals($expected, $message['message']);\n    }\n\n    public function getPairs()\n    {\n        return array(\n            array('foo',    'foo'),\n            array('3',      '3'),\n            array(3,        '3'),\n            array(null,     ''),\n            array(true,     '1'),\n            array(false,    ''),\n            array(new \\stdClass, '[object stdClass]'),\n            array(array(), '[array]'),\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\TestCase;\n\nclass TagProcessorTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Processor\\TagProcessor::__invoke\n     */\n    public function testProcessor()\n    {\n        $tags = array(1, 2, 3);\n        $processor = new TagProcessor($tags);\n        $record = $processor($this->getRecord());\n\n        $this->assertEquals($tags, $record['extra']['tags']);\n    }\n\n    /**\n     * @covers Monolog\\Processor\\TagProcessor::__invoke\n     */\n    public function testProcessorTagModification()\n    {\n        $tags = array(1, 2, 3);\n        $processor = new TagProcessor($tags);\n\n        $record = $processor($this->getRecord());\n        $this->assertEquals($tags, $record['extra']['tags']);\n\n        $processor->setTags(array('a', 'b'));\n        $record = $processor($this->getRecord());\n        $this->assertEquals(array('a', 'b'), $record['extra']['tags']);\n\n        $processor->addTags(array('a', 'c', 'foo' => 'bar'));\n        $record = $processor($this->getRecord());\n        $this->assertEquals(array('a', 'b', 'a', 'c', 'foo' => 'bar'), $record['extra']['tags']);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\TestCase;\n\nclass UidProcessorTest extends TestCase\n{\n    /**\n     * @covers Monolog\\Processor\\UidProcessor::__invoke\n     */\n    public function testProcessor()\n    {\n        $processor = new UidProcessor();\n        $record = $processor($this->getRecord());\n        $this->assertArrayHasKey('uid', $record['extra']);\n    }\n\n    public function testGetUid()\n    {\n        $processor = new UidProcessor(10);\n        $this->assertEquals(10, strlen($processor->getUid()));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog\\Processor;\n\nuse Monolog\\TestCase;\n\nclass WebProcessorTest extends TestCase\n{\n    public function testProcessor()\n    {\n        $server = array(\n            'REQUEST_URI'    => 'A',\n            'REMOTE_ADDR'    => 'B',\n            'REQUEST_METHOD' => 'C',\n            'HTTP_REFERER'   => 'D',\n            'SERVER_NAME'    => 'F',\n            'UNIQUE_ID'      => 'G',\n        );\n\n        $processor = new WebProcessor($server);\n        $record = $processor($this->getRecord());\n        $this->assertEquals($server['REQUEST_URI'], $record['extra']['url']);\n        $this->assertEquals($server['REMOTE_ADDR'], $record['extra']['ip']);\n        $this->assertEquals($server['REQUEST_METHOD'], $record['extra']['http_method']);\n        $this->assertEquals($server['HTTP_REFERER'], $record['extra']['referrer']);\n        $this->assertEquals($server['SERVER_NAME'], $record['extra']['server']);\n        $this->assertEquals($server['UNIQUE_ID'], $record['extra']['unique_id']);\n    }\n\n    public function testProcessorDoNothingIfNoRequestUri()\n    {\n        $server = array(\n            'REMOTE_ADDR'    => 'B',\n            'REQUEST_METHOD' => 'C',\n        );\n        $processor = new WebProcessor($server);\n        $record = $processor($this->getRecord());\n        $this->assertEmpty($record['extra']);\n    }\n\n    public function testProcessorReturnNullIfNoHttpReferer()\n    {\n        $server = array(\n            'REQUEST_URI'    => 'A',\n            'REMOTE_ADDR'    => 'B',\n            'REQUEST_METHOD' => 'C',\n            'SERVER_NAME'    => 'F',\n        );\n        $processor = new WebProcessor($server);\n        $record = $processor($this->getRecord());\n        $this->assertNull($record['extra']['referrer']);\n    }\n\n    public function testProcessorDoesNotAddUniqueIdIfNotPresent()\n    {\n        $server = array(\n            'REQUEST_URI'    => 'A',\n            'REMOTE_ADDR'    => 'B',\n            'REQUEST_METHOD' => 'C',\n            'SERVER_NAME'    => 'F',\n        );\n        $processor = new WebProcessor($server);\n        $record = $processor($this->getRecord());\n        $this->assertFalse(isset($record['extra']['unique_id']));\n    }\n\n    public function testProcessorAddsOnlyRequestedExtraFields()\n    {\n        $server = array(\n            'REQUEST_URI'    => 'A',\n            'REMOTE_ADDR'    => 'B',\n            'REQUEST_METHOD' => 'C',\n            'SERVER_NAME'    => 'F',\n        );\n\n        $processor = new WebProcessor($server, array('url', 'http_method'));\n        $record = $processor($this->getRecord());\n\n        $this->assertSame(array('url' => 'A', 'http_method' => 'C'), $record['extra']);\n    }\n\n    public function testProcessorConfiguringOfExtraFields()\n    {\n        $server = array(\n            'REQUEST_URI'    => 'A',\n            'REMOTE_ADDR'    => 'B',\n            'REQUEST_METHOD' => 'C',\n            'SERVER_NAME'    => 'F',\n        );\n\n        $processor = new WebProcessor($server, array('url' => 'REMOTE_ADDR'));\n        $record = $processor($this->getRecord());\n\n        $this->assertSame(array('url' => 'B'), $record['extra']);\n    }\n\n    /**\n     * @expectedException UnexpectedValueException\n     */\n    public function testInvalidData()\n    {\n        new WebProcessor(new \\stdClass);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nuse Monolog\\Handler\\TestHandler;\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Processor\\PsrLogMessageProcessor;\nuse Psr\\Log\\Test\\LoggerInterfaceTest;\n\nclass PsrLogCompatTest extends LoggerInterfaceTest\n{\n    private $handler;\n\n    public function getLogger()\n    {\n        $logger = new Logger('foo');\n        $logger->pushHandler($handler = new TestHandler);\n        $logger->pushProcessor(new PsrLogMessageProcessor);\n        $handler->setFormatter(new LineFormatter('%level_name% %message%'));\n\n        $this->handler = $handler;\n\n        return $logger;\n    }\n\n    public function getLogs()\n    {\n        $convert = function ($record) {\n            $lower = function ($match) {\n                return strtolower($match[0]);\n            };\n\n            return preg_replace_callback('{^[A-Z]+}', $lower, $record['formatted']);\n        };\n\n        return array_map($convert, $this->handler->getRecords());\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/RegistryTest.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nclass RegistryTest extends \\PHPUnit_Framework_TestCase\n{\n    protected function setUp()\n    {\n        Registry::clear();\n    }\n\n    /**\n     * @dataProvider hasLoggerProvider\n     * @covers Monolog\\Registry::hasLogger\n     */\n    public function testHasLogger(array $loggersToAdd, array $loggersToCheck, array $expectedResult)\n    {\n        foreach ($loggersToAdd as $loggerToAdd) {\n            Registry::addLogger($loggerToAdd);\n        }\n        foreach ($loggersToCheck as $index => $loggerToCheck) {\n            $this->assertSame($expectedResult[$index], Registry::hasLogger($loggerToCheck));\n        }\n    }\n\n    public function hasLoggerProvider()\n    {\n        $logger1 = new Logger('test1');\n        $logger2 = new Logger('test2');\n        $logger3 = new Logger('test3');\n\n        return array(\n            // only instances\n            array(\n                array($logger1),\n                array($logger1, $logger2),\n                array(true, false),\n            ),\n            // only names\n            array(\n                array($logger1),\n                array('test1', 'test2'),\n                array(true, false),\n            ),\n            // mixed case\n            array(\n                array($logger1, $logger2),\n                array('test1', $logger2, 'test3', $logger3),\n                array(true, true, false, false),\n            ),\n        );\n    }\n\n    /**\n     * @covers Monolog\\Registry::clear\n     */\n    public function testClearClears()\n    {\n        Registry::addLogger(new Logger('test1'), 'log');\n        Registry::clear();\n\n        $this->setExpectedException('\\InvalidArgumentException');\n        Registry::getInstance('log');\n    }\n\n    /**\n     * @dataProvider removedLoggerProvider\n     * @covers Monolog\\Registry::addLogger\n     * @covers Monolog\\Registry::removeLogger\n     */\n    public function testRemovesLogger($loggerToAdd, $remove)\n    {\n        Registry::addLogger($loggerToAdd);\n        Registry::removeLogger($remove);\n\n        $this->setExpectedException('\\InvalidArgumentException');\n        Registry::getInstance($loggerToAdd->getName());\n    }\n\n    public function removedLoggerProvider()\n    {\n        $logger1 = new Logger('test1');\n\n        return array(\n            array($logger1, $logger1),\n            array($logger1, 'test1'),\n        );\n    }\n\n    /**\n     * @covers Monolog\\Registry::addLogger\n     * @covers Monolog\\Registry::getInstance\n     * @covers Monolog\\Registry::__callStatic\n     */\n    public function testGetsSameLogger()\n    {\n        $logger1 = new Logger('test1');\n        $logger2 = new Logger('test2');\n\n        Registry::addLogger($logger1, 'test1');\n        Registry::addLogger($logger2);\n\n        $this->assertSame($logger1, Registry::getInstance('test1'));\n        $this->assertSame($logger2, Registry::test2());\n    }\n\n    /**\n     * @expectedException \\InvalidArgumentException\n     * @covers Monolog\\Registry::getInstance\n     */\n    public function testFailsOnNonExistantLogger()\n    {\n        Registry::getInstance('test1');\n    }\n\n    /**\n     * @covers Monolog\\Registry::addLogger\n     */\n    public function testReplacesLogger()\n    {\n        $log1 = new Logger('test1');\n        $log2 = new Logger('test2');\n\n        Registry::addLogger($log1, 'log');\n\n        Registry::addLogger($log2, 'log', true);\n\n        $this->assertSame($log2, Registry::getInstance('log'));\n    }\n\n    /**\n     * @expectedException \\InvalidArgumentException\n     * @covers Monolog\\Registry::addLogger\n     */\n    public function testFailsOnUnspecifiedReplacement()\n    {\n        $log1 = new Logger('test1');\n        $log2 = new Logger('test2');\n\n        Registry::addLogger($log1, 'log');\n\n        Registry::addLogger($log2, 'log');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/TestCase.php",
    "content": "<?php\n\n/*\n * This file is part of the Monolog package.\n *\n * (c) Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Monolog;\n\nclass TestCase extends \\PHPUnit_Framework_TestCase\n{\n    /**\n     * @return array Record\n     */\n    protected function getRecord($level = Logger::WARNING, $message = 'test', $context = array())\n    {\n        return array(\n            'message' => $message,\n            'context' => $context,\n            'level' => $level,\n            'level_name' => Logger::getLevelName($level),\n            'channel' => 'test',\n            'datetime' => \\DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true))),\n            'extra' => array(),\n        );\n    }\n\n    /**\n     * @return array\n     */\n    protected function getMultipleRecords()\n    {\n        return array(\n            $this->getRecord(Logger::DEBUG, 'debug message 1'),\n            $this->getRecord(Logger::DEBUG, 'debug message 2'),\n            $this->getRecord(Logger::INFO, 'information'),\n            $this->getRecord(Logger::WARNING, 'warning'),\n            $this->getRecord(Logger::ERROR, 'error'),\n        );\n    }\n\n    /**\n     * @return Monolog\\Formatter\\FormatterInterface\n     */\n    protected function getIdentityFormatter()\n    {\n        $formatter = $this->getMock('Monolog\\\\Formatter\\\\FormatterInterface');\n        $formatter->expects($this->any())\n            ->method('format')\n            ->will($this->returnCallback(function ($record) { return $record['message']; }));\n\n        return $formatter;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to this project will be documented in this file, in reverse chronological order by release.\n\n## 1.0.1 - 2016-08-06\n\n### Added\n\n- Nothing.\n\n### Deprecated\n\n- Nothing.\n\n### Removed\n\n- Nothing.\n\n### Fixed\n\n- Updated all `@return self` annotation references in interfaces to use\n  `@return static`, which more closelly follows the semantics of the\n  specification.\n- Updated the `MessageInterface::getHeaders()` return annotation to use the\n  value `string[][]`, indicating the format is a nested array of strings.\n- Updated the `@link` annotation for `RequestInterface::withRequestTarget()`\n  to point to the correct section of RFC 7230.\n- Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation\n  to add the parameter name (`$uploadedFiles`).\n- Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()`\n  method to correctly reference the method parameter (it was referencing an\n  incorrect parameter name previously).\n\n## 1.0.0 - 2016-05-18\n\nInitial stable release; reflects accepted PSR-7 specification.\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/LICENSE",
    "content": "Copyright (c) 2014 PHP Framework Interoperability Group\n\nPermission is hereby granted, free of charge, to any person obtaining a copy \nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights \nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in \nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/README.md",
    "content": "PSR Http Message\n================\n\nThis repository holds all interfaces/classes/traits related to\n[PSR-7](http://www.php-fig.org/psr/psr-7/).\n\nNote that this is not a HTTP message implementation of its own. It is merely an\ninterface that describes a HTTP message. See the specification for more details.\n\nUsage\n-----\n\nWe'll certainly need some stuff in here."
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/composer.json",
    "content": "{\n    \"name\": \"psr/http-message\",\n    \"description\": \"Common interface for HTTP messages\",\n    \"keywords\": [\"psr\", \"psr-7\", \"http\", \"http-message\", \"request\", \"response\"],\n    \"homepage\": \"https://github.com/php-fig/http-message\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"http://www.php-fig.org/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.3.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.0.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/src/MessageInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * HTTP messages consist of requests from a client to a server and responses\n * from a server to a client. This interface defines the methods common to\n * each.\n *\n * Messages are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n *\n * @link http://www.ietf.org/rfc/rfc7230.txt\n * @link http://www.ietf.org/rfc/rfc7231.txt\n */\ninterface MessageInterface\n{\n    /**\n     * Retrieves the HTTP protocol version as a string.\n     *\n     * The string MUST contain only the HTTP version number (e.g., \"1.1\", \"1.0\").\n     *\n     * @return string HTTP protocol version.\n     */\n    public function getProtocolVersion();\n\n    /**\n     * Return an instance with the specified HTTP protocol version.\n     *\n     * The version string MUST contain only the HTTP version number (e.g.,\n     * \"1.1\", \"1.0\").\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new protocol version.\n     *\n     * @param string $version HTTP protocol version\n     * @return static\n     */\n    public function withProtocolVersion($version);\n\n    /**\n     * Retrieves all message header values.\n     *\n     * The keys represent the header name as it will be sent over the wire, and\n     * each value is an array of strings associated with the header.\n     *\n     *     // Represent the headers as a string\n     *     foreach ($message->getHeaders() as $name => $values) {\n     *         echo $name . \": \" . implode(\", \", $values);\n     *     }\n     *\n     *     // Emit headers iteratively:\n     *     foreach ($message->getHeaders() as $name => $values) {\n     *         foreach ($values as $value) {\n     *             header(sprintf('%s: %s', $name, $value), false);\n     *         }\n     *     }\n     *\n     * While header names are not case-sensitive, getHeaders() will preserve the\n     * exact case in which headers were originally specified.\n     *\n     * @return string[][] Returns an associative array of the message's headers. Each\n     *     key MUST be a header name, and each value MUST be an array of strings\n     *     for that header.\n     */\n    public function getHeaders();\n\n    /**\n     * Checks if a header exists by the given case-insensitive name.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return bool Returns true if any header names match the given header\n     *     name using a case-insensitive string comparison. Returns false if\n     *     no matching header name is found in the message.\n     */\n    public function hasHeader($name);\n\n    /**\n     * Retrieves a message header value by the given case-insensitive name.\n     *\n     * This method returns an array of all the header values of the given\n     * case-insensitive header name.\n     *\n     * If the header does not appear in the message, this method MUST return an\n     * empty array.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return string[] An array of string values as provided for the given\n     *    header. If the header does not appear in the message, this method MUST\n     *    return an empty array.\n     */\n    public function getHeader($name);\n\n    /**\n     * Retrieves a comma-separated string of the values for a single header.\n     *\n     * This method returns all of the header values of the given\n     * case-insensitive header name as a string concatenated together using\n     * a comma.\n     *\n     * NOTE: Not all header values may be appropriately represented using\n     * comma concatenation. For such headers, use getHeader() instead\n     * and supply your own delimiter when concatenating.\n     *\n     * If the header does not appear in the message, this method MUST return\n     * an empty string.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return string A string of values as provided for the given header\n     *    concatenated together using a comma. If the header does not appear in\n     *    the message, this method MUST return an empty string.\n     */\n    public function getHeaderLine($name);\n\n    /**\n     * Return an instance with the provided value replacing the specified header.\n     *\n     * While header names are case-insensitive, the casing of the header will\n     * be preserved by this function, and returned from getHeaders().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new and/or updated header and value.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @param string|string[] $value Header value(s).\n     * @return static\n     * @throws \\InvalidArgumentException for invalid header names or values.\n     */\n    public function withHeader($name, $value);\n\n    /**\n     * Return an instance with the specified header appended with the given value.\n     *\n     * Existing values for the specified header will be maintained. The new\n     * value(s) will be appended to the existing list. If the header did not\n     * exist previously, it will be added.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new header and/or value.\n     *\n     * @param string $name Case-insensitive header field name to add.\n     * @param string|string[] $value Header value(s).\n     * @return static\n     * @throws \\InvalidArgumentException for invalid header names or values.\n     */\n    public function withAddedHeader($name, $value);\n\n    /**\n     * Return an instance without the specified header.\n     *\n     * Header resolution MUST be done without case-sensitivity.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that removes\n     * the named header.\n     *\n     * @param string $name Case-insensitive header field name to remove.\n     * @return static\n     */\n    public function withoutHeader($name);\n\n    /**\n     * Gets the body of the message.\n     *\n     * @return StreamInterface Returns the body as a stream.\n     */\n    public function getBody();\n\n    /**\n     * Return an instance with the specified message body.\n     *\n     * The body MUST be a StreamInterface object.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return a new instance that has the\n     * new body stream.\n     *\n     * @param StreamInterface $body Body.\n     * @return static\n     * @throws \\InvalidArgumentException When the body is not valid.\n     */\n    public function withBody(StreamInterface $body);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/src/RequestInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Representation of an outgoing, client-side request.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - HTTP method\n * - URI\n * - Headers\n * - Message body\n *\n * During construction, implementations MUST attempt to set the Host header from\n * a provided URI if no Host header is provided.\n *\n * Requests are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n */\ninterface RequestInterface extends MessageInterface\n{\n    /**\n     * Retrieves the message's request target.\n     *\n     * Retrieves the message's request-target either as it will appear (for\n     * clients), as it appeared at request (for servers), or as it was\n     * specified for the instance (see withRequestTarget()).\n     *\n     * In most cases, this will be the origin-form of the composed URI,\n     * unless a value was provided to the concrete implementation (see\n     * withRequestTarget() below).\n     *\n     * If no URI is available, and no request-target has been specifically\n     * provided, this method MUST return the string \"/\".\n     *\n     * @return string\n     */\n    public function getRequestTarget();\n\n    /**\n     * Return an instance with the specific request-target.\n     *\n     * If the request needs a non-origin-form request-target — e.g., for\n     * specifying an absolute-form, authority-form, or asterisk-form —\n     * this method may be used to create an instance with the specified\n     * request-target, verbatim.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * changed request target.\n     *\n     * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various\n     *     request-target forms allowed in request messages)\n     * @param mixed $requestTarget\n     * @return static\n     */\n    public function withRequestTarget($requestTarget);\n\n    /**\n     * Retrieves the HTTP method of the request.\n     *\n     * @return string Returns the request method.\n     */\n    public function getMethod();\n\n    /**\n     * Return an instance with the provided HTTP method.\n     *\n     * While HTTP method names are typically all uppercase characters, HTTP\n     * method names are case-sensitive and thus implementations SHOULD NOT\n     * modify the given string.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * changed request method.\n     *\n     * @param string $method Case-sensitive method.\n     * @return static\n     * @throws \\InvalidArgumentException for invalid HTTP methods.\n     */\n    public function withMethod($method);\n\n    /**\n     * Retrieves the URI instance.\n     *\n     * This method MUST return a UriInterface instance.\n     *\n     * @link http://tools.ietf.org/html/rfc3986#section-4.3\n     * @return UriInterface Returns a UriInterface instance\n     *     representing the URI of the request.\n     */\n    public function getUri();\n\n    /**\n     * Returns an instance with the provided URI.\n     *\n     * This method MUST update the Host header of the returned request by\n     * default if the URI contains a host component. If the URI does not\n     * contain a host component, any pre-existing Host header MUST be carried\n     * over to the returned request.\n     *\n     * You can opt-in to preserving the original state of the Host header by\n     * setting `$preserveHost` to `true`. When `$preserveHost` is set to\n     * `true`, this method interacts with the Host header in the following ways:\n     *\n     * - If the Host header is missing or empty, and the new URI contains\n     *   a host component, this method MUST update the Host header in the returned\n     *   request.\n     * - If the Host header is missing or empty, and the new URI does not contain a\n     *   host component, this method MUST NOT update the Host header in the returned\n     *   request.\n     * - If a Host header is present and non-empty, this method MUST NOT update\n     *   the Host header in the returned request.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new UriInterface instance.\n     *\n     * @link http://tools.ietf.org/html/rfc3986#section-4.3\n     * @param UriInterface $uri New request URI to use.\n     * @param bool $preserveHost Preserve the original state of the Host header.\n     * @return static\n     */\n    public function withUri(UriInterface $uri, $preserveHost = false);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/src/ResponseInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Representation of an outgoing, server-side response.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - Status code and reason phrase\n * - Headers\n * - Message body\n *\n * Responses are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n */\ninterface ResponseInterface extends MessageInterface\n{\n    /**\n     * Gets the response status code.\n     *\n     * The status code is a 3-digit integer result code of the server's attempt\n     * to understand and satisfy the request.\n     *\n     * @return int Status code.\n     */\n    public function getStatusCode();\n\n    /**\n     * Return an instance with the specified status code and, optionally, reason phrase.\n     *\n     * If no reason phrase is specified, implementations MAY choose to default\n     * to the RFC 7231 or IANA recommended reason phrase for the response's\n     * status code.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated status and reason phrase.\n     *\n     * @link http://tools.ietf.org/html/rfc7231#section-6\n     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n     * @param int $code The 3-digit integer result code to set.\n     * @param string $reasonPhrase The reason phrase to use with the\n     *     provided status code; if none is provided, implementations MAY\n     *     use the defaults as suggested in the HTTP specification.\n     * @return static\n     * @throws \\InvalidArgumentException For invalid status code arguments.\n     */\n    public function withStatus($code, $reasonPhrase = '');\n\n    /**\n     * Gets the response reason phrase associated with the status code.\n     *\n     * Because a reason phrase is not a required element in a response\n     * status line, the reason phrase value MAY be null. Implementations MAY\n     * choose to return the default RFC 7231 recommended reason phrase (or those\n     * listed in the IANA HTTP Status Code Registry) for the response's\n     * status code.\n     *\n     * @link http://tools.ietf.org/html/rfc7231#section-6\n     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n     * @return string Reason phrase; must return an empty string if none present.\n     */\n    public function getReasonPhrase();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/src/ServerRequestInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Representation of an incoming, server-side HTTP request.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - HTTP method\n * - URI\n * - Headers\n * - Message body\n *\n * Additionally, it encapsulates all data as it has arrived to the\n * application from the CGI and/or PHP environment, including:\n *\n * - The values represented in $_SERVER.\n * - Any cookies provided (generally via $_COOKIE)\n * - Query string arguments (generally via $_GET, or as parsed via parse_str())\n * - Upload files, if any (as represented by $_FILES)\n * - Deserialized body parameters (generally from $_POST)\n *\n * $_SERVER values MUST be treated as immutable, as they represent application\n * state at the time of request; as such, no methods are provided to allow\n * modification of those values. The other values provide such methods, as they\n * can be restored from $_SERVER or the request body, and may need treatment\n * during the application (e.g., body parameters may be deserialized based on\n * content type).\n *\n * Additionally, this interface recognizes the utility of introspecting a\n * request to derive and match additional parameters (e.g., via URI path\n * matching, decrypting cookie values, deserializing non-form-encoded body\n * content, matching authorization headers to users, etc). These parameters\n * are stored in an \"attributes\" property.\n *\n * Requests are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n */\ninterface ServerRequestInterface extends RequestInterface\n{\n    /**\n     * Retrieve server parameters.\n     *\n     * Retrieves data related to the incoming request environment,\n     * typically derived from PHP's $_SERVER superglobal. The data IS NOT\n     * REQUIRED to originate from $_SERVER.\n     *\n     * @return array\n     */\n    public function getServerParams();\n\n    /**\n     * Retrieve cookies.\n     *\n     * Retrieves cookies sent by the client to the server.\n     *\n     * The data MUST be compatible with the structure of the $_COOKIE\n     * superglobal.\n     *\n     * @return array\n     */\n    public function getCookieParams();\n\n    /**\n     * Return an instance with the specified cookies.\n     *\n     * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST\n     * be compatible with the structure of $_COOKIE. Typically, this data will\n     * be injected at instantiation.\n     *\n     * This method MUST NOT update the related Cookie header of the request\n     * instance, nor related values in the server params.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated cookie values.\n     *\n     * @param array $cookies Array of key/value pairs representing cookies.\n     * @return static\n     */\n    public function withCookieParams(array $cookies);\n\n    /**\n     * Retrieve query string arguments.\n     *\n     * Retrieves the deserialized query string arguments, if any.\n     *\n     * Note: the query params might not be in sync with the URI or server\n     * params. If you need to ensure you are only getting the original\n     * values, you may need to parse the query string from `getUri()->getQuery()`\n     * or from the `QUERY_STRING` server param.\n     *\n     * @return array\n     */\n    public function getQueryParams();\n\n    /**\n     * Return an instance with the specified query string arguments.\n     *\n     * These values SHOULD remain immutable over the course of the incoming\n     * request. They MAY be injected during instantiation, such as from PHP's\n     * $_GET superglobal, or MAY be derived from some other value such as the\n     * URI. In cases where the arguments are parsed from the URI, the data\n     * MUST be compatible with what PHP's parse_str() would return for\n     * purposes of how duplicate query parameters are handled, and how nested\n     * sets are handled.\n     *\n     * Setting query string arguments MUST NOT change the URI stored by the\n     * request, nor the values in the server params.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated query string arguments.\n     *\n     * @param array $query Array of query string arguments, typically from\n     *     $_GET.\n     * @return static\n     */\n    public function withQueryParams(array $query);\n\n    /**\n     * Retrieve normalized file upload data.\n     *\n     * This method returns upload metadata in a normalized tree, with each leaf\n     * an instance of Psr\\Http\\Message\\UploadedFileInterface.\n     *\n     * These values MAY be prepared from $_FILES or the message body during\n     * instantiation, or MAY be injected via withUploadedFiles().\n     *\n     * @return array An array tree of UploadedFileInterface instances; an empty\n     *     array MUST be returned if no data is present.\n     */\n    public function getUploadedFiles();\n\n    /**\n     * Create a new instance with the specified uploaded files.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated body parameters.\n     *\n     * @param array $uploadedFiles An array tree of UploadedFileInterface instances.\n     * @return static\n     * @throws \\InvalidArgumentException if an invalid structure is provided.\n     */\n    public function withUploadedFiles(array $uploadedFiles);\n\n    /**\n     * Retrieve any parameters provided in the request body.\n     *\n     * If the request Content-Type is either application/x-www-form-urlencoded\n     * or multipart/form-data, and the request method is POST, this method MUST\n     * return the contents of $_POST.\n     *\n     * Otherwise, this method may return any results of deserializing\n     * the request body content; as parsing returns structured content, the\n     * potential types MUST be arrays or objects only. A null value indicates\n     * the absence of body content.\n     *\n     * @return null|array|object The deserialized body parameters, if any.\n     *     These will typically be an array or object.\n     */\n    public function getParsedBody();\n\n    /**\n     * Return an instance with the specified body parameters.\n     *\n     * These MAY be injected during instantiation.\n     *\n     * If the request Content-Type is either application/x-www-form-urlencoded\n     * or multipart/form-data, and the request method is POST, use this method\n     * ONLY to inject the contents of $_POST.\n     *\n     * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of\n     * deserializing the request body content. Deserialization/parsing returns\n     * structured data, and, as such, this method ONLY accepts arrays or objects,\n     * or a null value if nothing was available to parse.\n     *\n     * As an example, if content negotiation determines that the request data\n     * is a JSON payload, this method could be used to create a request\n     * instance with the deserialized parameters.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated body parameters.\n     *\n     * @param null|array|object $data The deserialized body data. This will\n     *     typically be in an array or object.\n     * @return static\n     * @throws \\InvalidArgumentException if an unsupported argument type is\n     *     provided.\n     */\n    public function withParsedBody($data);\n\n    /**\n     * Retrieve attributes derived from the request.\n     *\n     * The request \"attributes\" may be used to allow injection of any\n     * parameters derived from the request: e.g., the results of path\n     * match operations; the results of decrypting cookies; the results of\n     * deserializing non-form-encoded message bodies; etc. Attributes\n     * will be application and request specific, and CAN be mutable.\n     *\n     * @return array Attributes derived from the request.\n     */\n    public function getAttributes();\n\n    /**\n     * Retrieve a single derived request attribute.\n     *\n     * Retrieves a single derived request attribute as described in\n     * getAttributes(). If the attribute has not been previously set, returns\n     * the default value as provided.\n     *\n     * This method obviates the need for a hasAttribute() method, as it allows\n     * specifying a default value to return if the attribute is not found.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @param mixed $default Default value to return if the attribute does not exist.\n     * @return mixed\n     */\n    public function getAttribute($name, $default = null);\n\n    /**\n     * Return an instance with the specified derived request attribute.\n     *\n     * This method allows setting a single derived request attribute as\n     * described in getAttributes().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated attribute.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @param mixed $value The value of the attribute.\n     * @return static\n     */\n    public function withAttribute($name, $value);\n\n    /**\n     * Return an instance that removes the specified derived request attribute.\n     *\n     * This method allows removing a single derived request attribute as\n     * described in getAttributes().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that removes\n     * the attribute.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @return static\n     */\n    public function withoutAttribute($name);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/src/StreamInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Describes a data stream.\n *\n * Typically, an instance will wrap a PHP stream; this interface provides\n * a wrapper around the most common operations, including serialization of\n * the entire stream to a string.\n */\ninterface StreamInterface\n{\n    /**\n     * Reads all data from the stream into a string, from the beginning to end.\n     *\n     * This method MUST attempt to seek to the beginning of the stream before\n     * reading data and read the stream until the end is reached.\n     *\n     * Warning: This could attempt to load a large amount of data into memory.\n     *\n     * This method MUST NOT raise an exception in order to conform with PHP's\n     * string casting operations.\n     *\n     * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring\n     * @return string\n     */\n    public function __toString();\n\n    /**\n     * Closes the stream and any underlying resources.\n     *\n     * @return void\n     */\n    public function close();\n\n    /**\n     * Separates any underlying resources from the stream.\n     *\n     * After the stream has been detached, the stream is in an unusable state.\n     *\n     * @return resource|null Underlying PHP stream, if any\n     */\n    public function detach();\n\n    /**\n     * Get the size of the stream if known.\n     *\n     * @return int|null Returns the size in bytes if known, or null if unknown.\n     */\n    public function getSize();\n\n    /**\n     * Returns the current position of the file read/write pointer\n     *\n     * @return int Position of the file pointer\n     * @throws \\RuntimeException on error.\n     */\n    public function tell();\n\n    /**\n     * Returns true if the stream is at the end of the stream.\n     *\n     * @return bool\n     */\n    public function eof();\n\n    /**\n     * Returns whether or not the stream is seekable.\n     *\n     * @return bool\n     */\n    public function isSeekable();\n\n    /**\n     * Seek to a position in the stream.\n     *\n     * @link http://www.php.net/manual/en/function.fseek.php\n     * @param int $offset Stream offset\n     * @param int $whence Specifies how the cursor position will be calculated\n     *     based on the seek offset. Valid values are identical to the built-in\n     *     PHP $whence values for `fseek()`.  SEEK_SET: Set position equal to\n     *     offset bytes SEEK_CUR: Set position to current location plus offset\n     *     SEEK_END: Set position to end-of-stream plus offset.\n     * @throws \\RuntimeException on failure.\n     */\n    public function seek($offset, $whence = SEEK_SET);\n\n    /**\n     * Seek to the beginning of the stream.\n     *\n     * If the stream is not seekable, this method will raise an exception;\n     * otherwise, it will perform a seek(0).\n     *\n     * @see seek()\n     * @link http://www.php.net/manual/en/function.fseek.php\n     * @throws \\RuntimeException on failure.\n     */\n    public function rewind();\n\n    /**\n     * Returns whether or not the stream is writable.\n     *\n     * @return bool\n     */\n    public function isWritable();\n\n    /**\n     * Write data to the stream.\n     *\n     * @param string $string The string that is to be written.\n     * @return int Returns the number of bytes written to the stream.\n     * @throws \\RuntimeException on failure.\n     */\n    public function write($string);\n\n    /**\n     * Returns whether or not the stream is readable.\n     *\n     * @return bool\n     */\n    public function isReadable();\n\n    /**\n     * Read data from the stream.\n     *\n     * @param int $length Read up to $length bytes from the object and return\n     *     them. Fewer than $length bytes may be returned if underlying stream\n     *     call returns fewer bytes.\n     * @return string Returns the data read from the stream, or an empty string\n     *     if no bytes are available.\n     * @throws \\RuntimeException if an error occurs.\n     */\n    public function read($length);\n\n    /**\n     * Returns the remaining contents in a string\n     *\n     * @return string\n     * @throws \\RuntimeException if unable to read or an error occurs while\n     *     reading.\n     */\n    public function getContents();\n\n    /**\n     * Get stream metadata as an associative array or retrieve a specific key.\n     *\n     * The keys returned are identical to the keys returned from PHP's\n     * stream_get_meta_data() function.\n     *\n     * @link http://php.net/manual/en/function.stream-get-meta-data.php\n     * @param string $key Specific metadata to retrieve.\n     * @return array|mixed|null Returns an associative array if no key is\n     *     provided. Returns a specific key value if a key is provided and the\n     *     value is found, or null if the key is not found.\n     */\n    public function getMetadata($key = null);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/src/UploadedFileInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Value object representing a file uploaded through an HTTP request.\n *\n * Instances of this interface are considered immutable; all methods that\n * might change state MUST be implemented such that they retain the internal\n * state of the current instance and return an instance that contains the\n * changed state.\n */\ninterface UploadedFileInterface\n{\n    /**\n     * Retrieve a stream representing the uploaded file.\n     *\n     * This method MUST return a StreamInterface instance, representing the\n     * uploaded file. The purpose of this method is to allow utilizing native PHP\n     * stream functionality to manipulate the file upload, such as\n     * stream_copy_to_stream() (though the result will need to be decorated in a\n     * native PHP stream wrapper to work with such functions).\n     *\n     * If the moveTo() method has been called previously, this method MUST raise\n     * an exception.\n     *\n     * @return StreamInterface Stream representation of the uploaded file.\n     * @throws \\RuntimeException in cases when no stream is available or can be\n     *     created.\n     */\n    public function getStream();\n\n    /**\n     * Move the uploaded file to a new location.\n     *\n     * Use this method as an alternative to move_uploaded_file(). This method is\n     * guaranteed to work in both SAPI and non-SAPI environments.\n     * Implementations must determine which environment they are in, and use the\n     * appropriate method (move_uploaded_file(), rename(), or a stream\n     * operation) to perform the operation.\n     *\n     * $targetPath may be an absolute path, or a relative path. If it is a\n     * relative path, resolution should be the same as used by PHP's rename()\n     * function.\n     *\n     * The original file or stream MUST be removed on completion.\n     *\n     * If this method is called more than once, any subsequent calls MUST raise\n     * an exception.\n     *\n     * When used in an SAPI environment where $_FILES is populated, when writing\n     * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be\n     * used to ensure permissions and upload status are verified correctly.\n     *\n     * If you wish to move to a stream, use getStream(), as SAPI operations\n     * cannot guarantee writing to stream destinations.\n     *\n     * @see http://php.net/is_uploaded_file\n     * @see http://php.net/move_uploaded_file\n     * @param string $targetPath Path to which to move the uploaded file.\n     * @throws \\InvalidArgumentException if the $targetPath specified is invalid.\n     * @throws \\RuntimeException on any error during the move operation, or on\n     *     the second or subsequent call to the method.\n     */\n    public function moveTo($targetPath);\n    \n    /**\n     * Retrieve the file size.\n     *\n     * Implementations SHOULD return the value stored in the \"size\" key of\n     * the file in the $_FILES array if available, as PHP calculates this based\n     * on the actual size transmitted.\n     *\n     * @return int|null The file size in bytes or null if unknown.\n     */\n    public function getSize();\n    \n    /**\n     * Retrieve the error associated with the uploaded file.\n     *\n     * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants.\n     *\n     * If the file was uploaded successfully, this method MUST return\n     * UPLOAD_ERR_OK.\n     *\n     * Implementations SHOULD return the value stored in the \"error\" key of\n     * the file in the $_FILES array.\n     *\n     * @see http://php.net/manual/en/features.file-upload.errors.php\n     * @return int One of PHP's UPLOAD_ERR_XXX constants.\n     */\n    public function getError();\n    \n    /**\n     * Retrieve the filename sent by the client.\n     *\n     * Do not trust the value returned by this method. A client could send\n     * a malicious filename with the intention to corrupt or hack your\n     * application.\n     *\n     * Implementations SHOULD return the value stored in the \"name\" key of\n     * the file in the $_FILES array.\n     *\n     * @return string|null The filename sent by the client or null if none\n     *     was provided.\n     */\n    public function getClientFilename();\n    \n    /**\n     * Retrieve the media type sent by the client.\n     *\n     * Do not trust the value returned by this method. A client could send\n     * a malicious media type with the intention to corrupt or hack your\n     * application.\n     *\n     * Implementations SHOULD return the value stored in the \"type\" key of\n     * the file in the $_FILES array.\n     *\n     * @return string|null The media type sent by the client or null if none\n     *     was provided.\n     */\n    public function getClientMediaType();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/src/UriInterface.php",
    "content": "<?php\nnamespace Psr\\Http\\Message;\n\n/**\n * Value object representing a URI.\n *\n * This interface is meant to represent URIs according to RFC 3986 and to\n * provide methods for most common operations. Additional functionality for\n * working with URIs can be provided on top of the interface or externally.\n * Its primary use is for HTTP requests, but may also be used in other\n * contexts.\n *\n * Instances of this interface are considered immutable; all methods that\n * might change state MUST be implemented such that they retain the internal\n * state of the current instance and return an instance that contains the\n * changed state.\n *\n * Typically the Host header will be also be present in the request message.\n * For server-side requests, the scheme will typically be discoverable in the\n * server parameters.\n *\n * @link http://tools.ietf.org/html/rfc3986 (the URI specification)\n */\ninterface UriInterface\n{\n    /**\n     * Retrieve the scheme component of the URI.\n     *\n     * If no scheme is present, this method MUST return an empty string.\n     *\n     * The value returned MUST be normalized to lowercase, per RFC 3986\n     * Section 3.1.\n     *\n     * The trailing \":\" character is not part of the scheme and MUST NOT be\n     * added.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-3.1\n     * @return string The URI scheme.\n     */\n    public function getScheme();\n\n    /**\n     * Retrieve the authority component of the URI.\n     *\n     * If no authority information is present, this method MUST return an empty\n     * string.\n     *\n     * The authority syntax of the URI is:\n     *\n     * <pre>\n     * [user-info@]host[:port]\n     * </pre>\n     *\n     * If the port component is not set or is the standard port for the current\n     * scheme, it SHOULD NOT be included.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-3.2\n     * @return string The URI authority, in \"[user-info@]host[:port]\" format.\n     */\n    public function getAuthority();\n\n    /**\n     * Retrieve the user information component of the URI.\n     *\n     * If no user information is present, this method MUST return an empty\n     * string.\n     *\n     * If a user is present in the URI, this will return that value;\n     * additionally, if the password is also present, it will be appended to the\n     * user value, with a colon (\":\") separating the values.\n     *\n     * The trailing \"@\" character is not part of the user information and MUST\n     * NOT be added.\n     *\n     * @return string The URI user information, in \"username[:password]\" format.\n     */\n    public function getUserInfo();\n\n    /**\n     * Retrieve the host component of the URI.\n     *\n     * If no host is present, this method MUST return an empty string.\n     *\n     * The value returned MUST be normalized to lowercase, per RFC 3986\n     * Section 3.2.2.\n     *\n     * @see http://tools.ietf.org/html/rfc3986#section-3.2.2\n     * @return string The URI host.\n     */\n    public function getHost();\n\n    /**\n     * Retrieve the port component of the URI.\n     *\n     * If a port is present, and it is non-standard for the current scheme,\n     * this method MUST return it as an integer. If the port is the standard port\n     * used with the current scheme, this method SHOULD return null.\n     *\n     * If no port is present, and no scheme is present, this method MUST return\n     * a null value.\n     *\n     * If no port is present, but a scheme is present, this method MAY return\n     * the standard port for that scheme, but SHOULD return null.\n     *\n     * @return null|int The URI port.\n     */\n    public function getPort();\n\n    /**\n     * Retrieve the path component of the URI.\n     *\n     * The path can either be empty or absolute (starting with a slash) or\n     * rootless (not starting with a slash). Implementations MUST support all\n     * three syntaxes.\n     *\n     * Normally, the empty path \"\" and absolute path \"/\" are considered equal as\n     * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically\n     * do this normalization because in contexts with a trimmed base path, e.g.\n     * the front controller, this difference becomes significant. It's the task\n     * of the user to handle both \"\" and \"/\".\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.3.\n     *\n     * As an example, if the value should include a slash (\"/\") not intended as\n     * delimiter between path segments, that value MUST be passed in encoded\n     * form (e.g., \"%2F\") to the instance.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-2\n     * @see https://tools.ietf.org/html/rfc3986#section-3.3\n     * @return string The URI path.\n     */\n    public function getPath();\n\n    /**\n     * Retrieve the query string of the URI.\n     *\n     * If no query string is present, this method MUST return an empty string.\n     *\n     * The leading \"?\" character is not part of the query and MUST NOT be\n     * added.\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.4.\n     *\n     * As an example, if a value in a key/value pair of the query string should\n     * include an ampersand (\"&\") not intended as a delimiter between values,\n     * that value MUST be passed in encoded form (e.g., \"%26\") to the instance.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-2\n     * @see https://tools.ietf.org/html/rfc3986#section-3.4\n     * @return string The URI query string.\n     */\n    public function getQuery();\n\n    /**\n     * Retrieve the fragment component of the URI.\n     *\n     * If no fragment is present, this method MUST return an empty string.\n     *\n     * The leading \"#\" character is not part of the fragment and MUST NOT be\n     * added.\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.5.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-2\n     * @see https://tools.ietf.org/html/rfc3986#section-3.5\n     * @return string The URI fragment.\n     */\n    public function getFragment();\n\n    /**\n     * Return an instance with the specified scheme.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified scheme.\n     *\n     * Implementations MUST support the schemes \"http\" and \"https\" case\n     * insensitively, and MAY accommodate other schemes if required.\n     *\n     * An empty scheme is equivalent to removing the scheme.\n     *\n     * @param string $scheme The scheme to use with the new instance.\n     * @return static A new instance with the specified scheme.\n     * @throws \\InvalidArgumentException for invalid or unsupported schemes.\n     */\n    public function withScheme($scheme);\n\n    /**\n     * Return an instance with the specified user information.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified user information.\n     *\n     * Password is optional, but the user information MUST include the\n     * user; an empty string for the user is equivalent to removing user\n     * information.\n     *\n     * @param string $user The user name to use for authority.\n     * @param null|string $password The password associated with $user.\n     * @return static A new instance with the specified user information.\n     */\n    public function withUserInfo($user, $password = null);\n\n    /**\n     * Return an instance with the specified host.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified host.\n     *\n     * An empty host value is equivalent to removing the host.\n     *\n     * @param string $host The hostname to use with the new instance.\n     * @return static A new instance with the specified host.\n     * @throws \\InvalidArgumentException for invalid hostnames.\n     */\n    public function withHost($host);\n\n    /**\n     * Return an instance with the specified port.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified port.\n     *\n     * Implementations MUST raise an exception for ports outside the\n     * established TCP and UDP port ranges.\n     *\n     * A null value provided for the port is equivalent to removing the port\n     * information.\n     *\n     * @param null|int $port The port to use with the new instance; a null value\n     *     removes the port information.\n     * @return static A new instance with the specified port.\n     * @throws \\InvalidArgumentException for invalid ports.\n     */\n    public function withPort($port);\n\n    /**\n     * Return an instance with the specified path.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified path.\n     *\n     * The path can either be empty or absolute (starting with a slash) or\n     * rootless (not starting with a slash). Implementations MUST support all\n     * three syntaxes.\n     *\n     * If the path is intended to be domain-relative rather than path relative then\n     * it must begin with a slash (\"/\"). Paths not starting with a slash (\"/\")\n     * are assumed to be relative to some base path known to the application or\n     * consumer.\n     *\n     * Users can provide both encoded and decoded path characters.\n     * Implementations ensure the correct encoding as outlined in getPath().\n     *\n     * @param string $path The path to use with the new instance.\n     * @return static A new instance with the specified path.\n     * @throws \\InvalidArgumentException for invalid paths.\n     */\n    public function withPath($path);\n\n    /**\n     * Return an instance with the specified query string.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified query string.\n     *\n     * Users can provide both encoded and decoded query characters.\n     * Implementations ensure the correct encoding as outlined in getQuery().\n     *\n     * An empty query string value is equivalent to removing the query string.\n     *\n     * @param string $query The query string to use with the new instance.\n     * @return static A new instance with the specified query string.\n     * @throws \\InvalidArgumentException for invalid query strings.\n     */\n    public function withQuery($query);\n\n    /**\n     * Return an instance with the specified URI fragment.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified URI fragment.\n     *\n     * Users can provide both encoded and decoded fragment characters.\n     * Implementations ensure the correct encoding as outlined in getFragment().\n     *\n     * An empty fragment value is equivalent to removing the fragment.\n     *\n     * @param string $fragment The fragment to use with the new instance.\n     * @return static A new instance with the specified fragment.\n     */\n    public function withFragment($fragment);\n\n    /**\n     * Return the string representation as a URI reference.\n     *\n     * Depending on which components of the URI are present, the resulting\n     * string is either a full URI or relative reference according to RFC 3986,\n     * Section 4.1. The method concatenates the various components of the URI,\n     * using the appropriate delimiters:\n     *\n     * - If a scheme is present, it MUST be suffixed by \":\".\n     * - If an authority is present, it MUST be prefixed by \"//\".\n     * - The path can be concatenated without delimiters. But there are two\n     *   cases where the path has to be adjusted to make the URI reference\n     *   valid as PHP does not allow to throw an exception in __toString():\n     *     - If the path is rootless and an authority is present, the path MUST\n     *       be prefixed by \"/\".\n     *     - If the path is starting with more than one \"/\" and no authority is\n     *       present, the starting slashes MUST be reduced to one.\n     * - If a query is present, it MUST be prefixed by \"?\".\n     * - If a fragment is present, it MUST be prefixed by \"#\".\n     *\n     * @see http://tools.ietf.org/html/rfc3986#section-4.1\n     * @return string\n     */\n    public function __toString();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/autoload.php",
    "content": "<?php\n\nfunction classLoaders($class)\n{\n    $path = str_replace('\\\\', DIRECTORY_SEPARATOR, $class);\n    $file = __DIR__ . '/src/' . $path . '.php';\n\n    if (file_exists($file)) {\n        require_once $file;\n    }\n}\nspl_autoload_register('classLoaders');\n\nrequire_once  __DIR__ . '/src/Qiniu/functions.php';\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Auth.php",
    "content": "<?php\nnamespace Qiniu;\n\nuse Qiniu\\Zone;\n\nfinal class Auth\n{\n    private $accessKey;\n    private $secretKey;\n\n    public function __construct($accessKey, $secretKey)\n    {\n        $this->accessKey = $accessKey;\n        $this->secretKey = $secretKey;\n    }\n\n    public function getAccessKey()\n    {\n        return $this->accessKey;\n    }\n\n    public function sign($data)\n    {\n        $hmac = hash_hmac('sha1', $data, $this->secretKey, true);\n        return $this->accessKey . ':' . \\Qiniu\\base64_urlSafeEncode($hmac);\n    }\n\n    public function signWithData($data)\n    {\n        $encodedData = \\Qiniu\\base64_urlSafeEncode($data);\n        return $this->sign($encodedData) . ':' . $encodedData;\n    }\n\n    public function signRequest($urlString, $body, $contentType = null)\n    {\n        $url = parse_url($urlString);\n        $data = '';\n        if (array_key_exists('path', $url)) {\n            $data = $url['path'];\n        }\n        if (array_key_exists('query', $url)) {\n            $data .= '?' . $url['query'];\n        }\n        $data .= \"\\n\";\n\n        if ($body !== null && $contentType === 'application/x-www-form-urlencoded') {\n            $data .= $body;\n        }\n        return $this->sign($data);\n    }\n\n    public function verifyCallback($contentType, $originAuthorization, $url, $body)\n    {\n        $authorization = 'QBox ' . $this->signRequest($url, $body, $contentType);\n        return $originAuthorization === $authorization;\n    }\n\n    public function privateDownloadUrl($baseUrl, $expires = 3600)\n    {\n        $deadline = time() + $expires;\n\n        $pos = strpos($baseUrl, '?');\n        if ($pos !== false) {\n            $baseUrl .= '&e=';\n        } else {\n            $baseUrl .= '?e=';\n        }\n        $baseUrl .= $deadline;\n\n        $token = $this->sign($baseUrl);\n        return \"$baseUrl&token=$token\";\n    }\n\n    public function uploadToken($bucket, $key = null, $expires = 3600, $policy = null, $strictPolicy = true)\n    {\n        $deadline = time() + $expires;\n        $scope = $bucket;\n        if ($key !== null) {\n            $scope .= ':' . $key;\n        }\n\n        $args = self::copyPolicy($args, $policy, $strictPolicy);\n        $args['scope'] = $scope;\n        $args['deadline'] = $deadline;\n\n        $b = json_encode($args);\n        return $this->signWithData($b);\n    }\n\n    /**\n     *上传策略，参数规格详见\n     *http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html\n     */\n    private static $policyFields = array(\n        'callbackUrl',\n        'callbackBody',\n        'callbackHost',\n        'callbackBodyType',\n        'callbackFetchKey',\n\n        'returnUrl',\n        'returnBody',\n\n        'endUser',\n        'saveKey',\n        'insertOnly',\n\n        'detectMime',\n        'mimeLimit',\n        'fsizeMin',\n        'fsizeLimit',\n\n        'persistentOps',\n        'persistentNotifyUrl',\n        'persistentPipeline',\n\n        'deleteAfterDays',\n        'fileType',\n        'isPrefixalScope',\n    );\n\n    private static function copyPolicy(&$policy, $originPolicy, $strictPolicy)\n    {\n        if ($originPolicy === null) {\n            return array();\n        }\n        foreach ($originPolicy as $key => $value) {\n            if (!$strictPolicy || in_array((string)$key, self::$policyFields, true)) {\n                $policy[$key] = $value;\n            }\n        }\n        return $policy;\n    }\n\n    public function authorization($url, $body = null, $contentType = null)\n    {\n        $authorization = 'QBox ' . $this->signRequest($url, $body, $contentType);\n        return array('Authorization' => $authorization);\n    }\n\n    public function authorizationV2($url, $method, $body = null, $contentType = null)\n    {\n        $urlItems = parse_url($url);\n        $host = $urlItems['host'];\n\n        if (isset($urlItems['port'])) {\n            $port = $urlItems['port'];\n        } else {\n            $port = '';\n        }\n\n        $path = $urlItems['path'];\n        if (isset($urlItems['query'])) {\n            $query = $urlItems['query'];\n        } else {\n            $query = '';\n        }\n\n        //write request uri\n        $toSignStr = $method . ' ' . $path;\n        if (!empty($query)) {\n            $toSignStr .= '?' . $query;\n        }\n\n        //write host and port\n        $toSignStr .= \"\\nHost: \" . $host;\n        if (!empty($port)) {\n            $toSignStr .= \":\" . $port;\n        }\n\n        //write content type\n        if (!empty($contentType)) {\n            $toSignStr .= \"\\nContent-Type: \" . $contentType;\n        }\n\n        $toSignStr .= \"\\n\\n\";\n\n        //write body\n        if (!empty($body)) {\n            $toSignStr .= $body;\n        }\n\n        $sign = $this->sign($toSignStr);\n        $auth = 'Qiniu ' . $sign;\n        return array('Authorization' => $auth);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Cdn/CdnManager.php",
    "content": "<?php\n\nnamespace Qiniu\\Cdn;\n\nuse Qiniu\\Auth;\nuse Qiniu\\Http\\Error;\nuse Qiniu\\Http\\Client;\n\nfinal class CdnManager\n{\n\n    private $auth;\n    private $server;\n\n    public function __construct(Auth $auth)\n    {\n        $this->auth = $auth;\n        $this->server = 'http://fusion.qiniuapi.com';\n    }\n\n    /**\n     * @param array $urls 待刷新的文件链接数组\n     * @return array\n     */\n    public function refreshUrls(array $urls)\n    {\n        return $this->refreshUrlsAndDirs($urls, array());\n    }\n\n    /**\n     * @param array $dirs 待刷新的文件链接数组\n     * @return array\n     * 目前客户默认没有目录刷新权限，刷新会有400038报错，参考：https://developer.qiniu.com/fusion/api/1229/cache-refresh\n     * 需要刷新目录请工单联系技术支持 https://support.qiniu.com/tickets/category\n     */\n    public function refreshDirs(array $dirs)\n    {\n        return $this->refreshUrlsAndDirs(array(), $dirs);\n    }\n\n    /**\n     * @param array $urls 待刷新的文件链接数组\n     * @param array $dirs 待刷新的目录链接数组\n     *\n     * @return array 刷新的请求回复和错误，参考 examples/cdn_manager.php 代码\n     * @link http://developer.qiniu.com/article/fusion/api/refresh.html\n     *\n     * 目前客户默认没有目录刷新权限，刷新会有400038报错，参考：https://developer.qiniu.com/fusion/api/1229/cache-refresh\n     * 需要刷新目录请工单联系技术支持 https://support.qiniu.com/tickets/category\n     */\n    public function refreshUrlsAndDirs(array $urls, array  $dirs)\n    {\n        $req = array();\n        if (!empty($urls)) {\n            $req['urls'] = $urls;\n        }\n        if (!empty($dirs)) {\n            $req['dirs'] = $dirs;\n        }\n\n        $url = $this->server . '/v2/tune/refresh';\n        $body = json_encode($req);\n        return $this->post($url, $body);\n    }\n\n    /**\n     * @param array $urls 待预取的文件链接数组\n     *\n     * @return array 预取的请求回复和错误，参考 examples/cdn_manager.php 代码\n     *\n     * @link http://developer.qiniu.com/article/fusion/api/refresh.html\n     */\n    public function prefetchUrls(array $urls)\n    {\n        $req = array(\n            'urls' => $urls,\n        );\n\n        $url = $this->server . '/v2/tune/prefetch';\n        $body = json_encode($req);\n        return $this->post($url, $body);\n    }\n\n    /**\n     * @param array $domains 待获取带宽数据的域名数组\n     * @param string $startDate 开始的日期，格式类似 2017-01-01\n     * @param string $endDate 结束的日期，格式类似 2017-01-01\n     * @param string $granularity 获取数据的时间间隔，可以是 5min, hour 或者 day\n     *\n     * @return array 带宽数据和错误信息，参考 examples/cdn_manager.php 代码\n     *\n     * @link http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html\n     */\n    public function getBandwidthData(array $domains, $startDate, $endDate, $granularity)\n    {\n        $req = array();\n        $req['domains'] = implode(';', $domains);\n        $req['startDate'] = $startDate;\n        $req['endDate'] = $endDate;\n        $req['granularity'] = $granularity;\n\n        $url = $this->server . '/v2/tune/bandwidth';\n        $body = json_encode($req);\n        return $this->post($url, $body);\n    }\n\n    /**\n     * @param array $domains 待获取流量数据的域名数组\n     * @param string $startDate 开始的日期，格式类似 2017-01-01\n     * @param string $endDate 结束的日期，格式类似 2017-01-01\n     * @param string $granularity 获取数据的时间间隔，可以是 5min, hour 或者 day\n     *\n     * @return array 流量数据和错误信息，参考 examples/cdn_manager.php 代码\n     *\n     * @link http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html\n     */\n    public function getFluxData(array $domains, $startDate, $endDate, $granularity)\n    {\n        $req = array();\n        $req['domains'] = implode(';', $domains);\n        $req['startDate'] = $startDate;\n        $req['endDate'] = $endDate;\n        $req['granularity'] = $granularity;\n\n        $url = $this->server . '/v2/tune/flux';\n        $body = json_encode($req);\n        return $this->post($url, $body);\n    }\n\n    /**\n     * @param array $domains 待获取日志下载链接的域名数组\n     * @param string $logDate 获取指定日期的日志下载链接，格式类似 2017-01-01\n     *\n     * @return array 日志下载链接数据和错误信息，参考 examples/cdn_manager.php 代码\n     *\n     * @link http://developer.qiniu.com/article/fusion/api/log.html\n     */\n    public function getCdnLogList(array $domains, $logDate)\n    {\n        $req = array();\n        $req['domains'] = implode(';', $domains);\n        $req['day'] = $logDate;\n\n        $url = $this->server . '/v2/tune/log/list';\n        $body = json_encode($req);\n        return $this->post($url, $body);\n    }\n\n    private function post($url, $body)\n    {\n        $headers = $this->auth->authorization($url, $body, 'application/json');\n        $headers['Content-Type'] = 'application/json';\n        $ret = Client::post($url, $body, $headers);\n        if (!$ret->ok()) {\n            return array(null, new Error($url, $ret));\n        }\n        $r = ($ret->body === null) ? array() : $ret->json();\n        return array($r, null);\n    }\n\n    /**\n     * 构建时间戳防盗链鉴权的访问外链\n     *\n     * @param string $rawUrl 需要签名的资源url\n     * @param string $encryptKey 时间戳防盗链密钥\n     * @param string $durationInSeconds 链接的有效期（以秒为单位）\n     *\n     * @return string 带鉴权信息的资源外链，参考 examples/cdn_timestamp_antileech.php 代码\n     */\n    public static function createTimestampAntiLeechUrl($rawUrl, $encryptKey, $durationInSeconds)\n    {\n\n        $parsedUrl = parse_url($rawUrl);\n\n        $deadline = time() + $durationInSeconds;\n        $expireHex = dechex($deadline);\n        $path = isset($parsedUrl['path']) ? $parsedUrl['path'] : '';\n\n        $strToSign = $encryptKey . $path . $expireHex;\n        $signStr = md5($strToSign);\n\n        if (isset($parsedUrl['query'])) {\n            $signedUrl = $rawUrl . '&sign=' . $signStr . '&t=' . $expireHex;\n        } else {\n            $signedUrl = $rawUrl . '?sign=' . $signStr . '&t=' . $expireHex;\n        }\n\n        return $signedUrl;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Config.php",
    "content": "<?php\nnamespace Qiniu;\n\nfinal class Config\n{\n    const SDK_VER = '7.2.3';\n\n    const BLOCK_SIZE = 4194304; //4*1024*1024 分块上传块大小，该参数为接口规格，不能修改\n\n    const RSF_HOST = 'rsf.qiniu.com';\n    const API_HOST = 'api.qiniu.com';\n    const RS_HOST = 'rs.qiniu.com';      //RS Host\n    const UC_HOST = 'https://api.qiniu.com';              //UC Host\n\n    // Zone 空间对应的机房\n    public $zone;\n    //BOOL 是否使用https域名\n    public $useHTTPS;\n    //BOOL 是否使用CDN加速上传域名\n    public $useCdnDomains;\n    // Zone Cache\n    private $zoneCache;\n\n    // 构造函数\n    public function __construct(Zone $z = null)\n    {\n        $this->zone = $z;\n        $this->useHTTPS = false;\n        $this->useCdnDomains = false;\n        $this->zoneCache = array();\n    }\n\n    public function getUpHost($accessKey, $bucket)\n    {\n        $zone = $this->getZone($accessKey, $bucket);\n        if ($this->useHTTPS === true) {\n            $scheme = \"https://\";\n        } else {\n            $scheme = \"http://\";\n        }\n\n        $host = $zone->srcUpHosts[0];\n        if ($this->useCdnDomains === true) {\n            $host = $zone->cdnUpHosts[0];\n        }\n\n        return $scheme . $host;\n    }\n\n    public function getUpBackupHost($accessKey, $bucket)\n    {\n        $zone = $this->getZone($accessKey, $bucket);\n        if ($this->useHTTPS === true) {\n            $scheme = \"https://\";\n        } else {\n            $scheme = \"http://\";\n        }\n\n        $host = $zone->cdnUpHosts[0];\n        if ($this->useCdnDomains === true) {\n            $host = $zone->srcUpHosts[0];\n        }\n\n        return $scheme . $host;\n    }\n\n    public function getRsHost($accessKey, $bucket)\n    {\n        $zone = $this->getZone($accessKey, $bucket);\n\n        if ($this->useHTTPS === true) {\n            $scheme = \"https://\";\n        } else {\n            $scheme = \"http://\";\n        }\n\n        return $scheme . $zone->rsHost;\n    }\n\n    public function getRsfHost($accessKey, $bucket)\n    {\n        $zone = $this->getZone($accessKey, $bucket);\n\n        if ($this->useHTTPS === true) {\n            $scheme = \"https://\";\n        } else {\n            $scheme = \"http://\";\n        }\n\n        return $scheme . $zone->rsfHost;\n    }\n\n    public function getIovipHost($accessKey, $bucket)\n    {\n        $zone = $this->getZone($accessKey, $bucket);\n\n        if ($this->useHTTPS === true) {\n            $scheme = \"https://\";\n        } else {\n            $scheme = \"http://\";\n        }\n\n        return $scheme . $zone->iovipHost;\n    }\n\n    public function getApiHost($accessKey, $bucket)\n    {\n        $zone = $this->getZone($accessKey, $bucket);\n\n        if ($this->useHTTPS === true) {\n            $scheme = \"https://\";\n        } else {\n            $scheme = \"http://\";\n        }\n\n        return $scheme . $zone->apiHost;\n    }\n\n    private function getZone($accessKey, $bucket)\n    {\n        $cacheId = \"$accessKey:$bucket\";\n\n        if (isset($this->zoneCache[$cacheId])) {\n            $zone = $this->zoneCache[$cacheId];\n        } elseif (isset($this->zone)) {\n            $zone = $this->zone;\n            $this->zoneCache[$cacheId] = $zone;\n        } else {\n            $zone = Zone::queryZone($accessKey, $bucket);\n            $this->zoneCache[$cacheId] = $zone;\n        }\n        return $zone;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Etag.php",
    "content": "<?php\n\nnamespace Qiniu;\n\nuse Qiniu\\Config;\n\nfinal class Etag\n{\n    private static function packArray($v, $a)\n    {\n        return call_user_func_array('pack', array_merge(array($v), (array)$a));\n    }\n\n    private static function blockCount($fsize)\n    {\n        return intval(($fsize + (Config::BLOCK_SIZE - 1)) / Config::BLOCK_SIZE);\n    }\n\n    private static function calcSha1($data)\n    {\n        $sha1Str = sha1($data, true);\n        $err = error_get_last();\n        if ($err !== null) {\n            return array(null, $err);\n        }\n        $byteArray = unpack('C*', $sha1Str);\n        return array($byteArray, null);\n    }\n\n\n    public static function sum($filename)\n    {\n        $fhandler = fopen($filename, 'r');\n        $err = error_get_last();\n        if ($err !== null) {\n            return array(null, $err);\n        }\n\n        $fstat = fstat($fhandler);\n        $fsize = $fstat['size'];\n        if ((int)$fsize === 0) {\n            fclose($fhandler);\n            return array('Fto5o-5ea0sNMlW_75VgGJCv2AcJ', null);\n        }\n        $blockCnt = self::blockCount($fsize);\n        $sha1Buf = array();\n\n        if ($blockCnt <= 1) {\n            array_push($sha1Buf, 0x16);\n            $fdata = fread($fhandler, Config::BLOCK_SIZE);\n            if ($err !== null) {\n                fclose($fhandler);\n                return array(null, $err);\n            }\n            list($sha1Code,) = self::calcSha1($fdata);\n            $sha1Buf = array_merge($sha1Buf, $sha1Code);\n        } else {\n            array_push($sha1Buf, 0x96);\n            $sha1BlockBuf = array();\n            for ($i = 0; $i < $blockCnt; $i++) {\n                $fdata = fread($fhandler, Config::BLOCK_SIZE);\n                list($sha1Code, $err) = self::calcSha1($fdata);\n                if ($err !== null) {\n                    fclose($fhandler);\n                    return array(null, $err);\n                }\n                $sha1BlockBuf = array_merge($sha1BlockBuf, $sha1Code);\n            }\n            $tmpData = self::packArray('C*', $sha1BlockBuf);\n            list($sha1Final,) = self::calcSha1($tmpData);\n            $sha1Buf = array_merge($sha1Buf, $sha1Final);\n        }\n        $etag = \\Qiniu\\base64_urlSafeEncode(self::packArray('C*', $sha1Buf));\n        return array($etag, null);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Http/Client.php",
    "content": "<?php\nnamespace Qiniu\\Http;\n\nuse Qiniu\\Config;\nuse Qiniu\\Http\\Request;\nuse Qiniu\\Http\\Response;\n\nfinal class Client\n{\n    public static function get($url, array $headers = array())\n    {\n        $request = new Request('GET', $url, $headers);\n        return self::sendRequest($request);\n    }\n\n    public static function post($url, $body, array $headers = array())\n    {\n        $request = new Request('POST', $url, $headers, $body);\n        return self::sendRequest($request);\n    }\n\n    public static function multipartPost(\n        $url,\n        $fields,\n        $name,\n        $fileName,\n        $fileBody,\n        $mimeType = null,\n        array $headers = array()\n    ) {\n        $data = array();\n        $mimeBoundary = md5(microtime());\n\n        foreach ($fields as $key => $val) {\n            array_push($data, '--' . $mimeBoundary);\n            array_push($data, \"Content-Disposition: form-data; name=\\\"$key\\\"\");\n            array_push($data, '');\n            array_push($data, $val);\n        }\n\n        array_push($data, '--' . $mimeBoundary);\n        $finalMimeType = empty($mimeType) ? 'application/octet-stream' : $mimeType;\n        $finalFileName = self::escapeQuotes($fileName);\n        array_push($data, \"Content-Disposition: form-data; name=\\\"$name\\\"; filename=\\\"$finalFileName\\\"\");\n        array_push($data, \"Content-Type: $finalMimeType\");\n        array_push($data, '');\n        array_push($data, $fileBody);\n\n        array_push($data, '--' . $mimeBoundary . '--');\n        array_push($data, '');\n\n        $body = implode(\"\\r\\n\", $data);\n        $contentType = 'multipart/form-data; boundary=' . $mimeBoundary;\n        $headers['Content-Type'] = $contentType;\n        $request = new Request('POST', $url, $headers, $body);\n        return self::sendRequest($request);\n    }\n\n    private static function userAgent()\n    {\n        $sdkInfo = \"QiniuPHP/\" . Config::SDK_VER;\n\n        $systemInfo = php_uname(\"s\");\n        $machineInfo = php_uname(\"m\");\n\n        $envInfo = \"($systemInfo/$machineInfo)\";\n\n        $phpVer = phpversion();\n\n        $ua = \"$sdkInfo $envInfo PHP/$phpVer\";\n        return $ua;\n    }\n\n    public static function sendRequest($request)\n    {\n        $t1 = microtime(true);\n        $ch = curl_init();\n        $options = array(\n            CURLOPT_USERAGENT => self::userAgent(),\n            CURLOPT_RETURNTRANSFER => true,\n            CURLOPT_SSL_VERIFYPEER => false,\n            CURLOPT_SSL_VERIFYHOST => false,\n            CURLOPT_HEADER => true,\n            CURLOPT_NOBODY => false,\n            CURLOPT_CUSTOMREQUEST => $request->method,\n            CURLOPT_URL => $request->url,\n        );\n\n        // Handle open_basedir & safe mode\n        if (!ini_get('safe_mode') && !ini_get('open_basedir')) {\n            $options[CURLOPT_FOLLOWLOCATION] = true;\n        }\n\n        if (!empty($request->headers)) {\n            $headers = array();\n            foreach ($request->headers as $key => $val) {\n                array_push($headers, \"$key: $val\");\n            }\n            $options[CURLOPT_HTTPHEADER] = $headers;\n        }\n        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));\n\n        if (!empty($request->body)) {\n            $options[CURLOPT_POSTFIELDS] = $request->body;\n        }\n        curl_setopt_array($ch, $options);\n        $result = curl_exec($ch);\n        $t2 = microtime(true);\n        $duration = round($t2 - $t1, 3);\n        $ret = curl_errno($ch);\n        if ($ret !== 0) {\n            $r = new Response(-1, $duration, array(), null, curl_error($ch));\n            curl_close($ch);\n            return $r;\n        }\n        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n        $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);\n        $headers = self::parseHeaders(substr($result, 0, $header_size));\n        $body = substr($result, $header_size);\n        curl_close($ch);\n        return new Response($code, $duration, $headers, $body, null);\n    }\n\n    private static function parseHeaders($raw)\n    {\n        $headers = array();\n        $headerLines = explode(\"\\r\\n\", $raw);\n        foreach ($headerLines as $line) {\n            $headerLine = trim($line);\n            $kv = explode(':', $headerLine);\n            if (count($kv) > 1) {\n                $kv[0] = ucwords($kv[0], '-');\n                $headers[$kv[0]] = trim($kv[1]);\n            }\n        }\n        return $headers;\n    }\n\n    private static function escapeQuotes($str)\n    {\n        $find = array(\"\\\\\", \"\\\"\");\n        $replace = array(\"\\\\\\\\\", \"\\\\\\\"\");\n        return str_replace($find, $replace, $str);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Http/Error.php",
    "content": "<?php\nnamespace Qiniu\\Http;\n\n/**\n * 七牛业务请求逻辑错误封装类，主要用来解析API请求返回如下的内容：\n * <pre>\n *     {\"error\" : \"detailed error message\"}\n * </pre>\n */\nfinal class Error\n{\n    private $url;\n    private $response;\n\n    public function __construct($url, $response)\n    {\n        $this->url = $url;\n        $this->response = $response;\n    }\n\n    public function code()\n    {\n        return $this->response->statusCode;\n    }\n\n    public function getResponse()\n    {\n        return $this->response;\n    }\n\n    public function message()\n    {\n        return $this->response->error;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Http/Request.php",
    "content": "<?php\nnamespace Qiniu\\Http;\n\nfinal class Request\n{\n    public $url;\n    public $headers;\n    public $body;\n    public $method;\n\n    public function __construct($method, $url, array $headers = array(), $body = null)\n    {\n        $this->method = strtoupper($method);\n        $this->url = $url;\n        $this->headers = $headers;\n        $this->body = $body;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Http/Response.php",
    "content": "<?php\n\nnamespace Qiniu\\Http;\n\n/**\n * HTTP response Object\n */\nfinal class Response\n{\n    public $statusCode;\n    public $headers;\n    public $body;\n    public $error;\n    private $jsonData;\n    public $duration;\n\n    /** @var array Mapping of status codes to reason phrases */\n    private static $statusTexts = array(\n        100 => 'Continue',\n        101 => 'Switching Protocols',\n        102 => 'Processing',\n        200 => 'OK',\n        201 => 'Created',\n        202 => 'Accepted',\n        203 => 'Non-Authoritative Information',\n        204 => 'No Content',\n        205 => 'Reset Content',\n        206 => 'Partial Content',\n        207 => 'Multi-Status',\n        208 => 'Already Reported',\n        226 => 'IM Used',\n        300 => 'Multiple Choices',\n        301 => 'Moved Permanently',\n        302 => 'Found',\n        303 => 'See Other',\n        304 => 'Not Modified',\n        305 => 'Use Proxy',\n        307 => 'Temporary Redirect',\n        308 => 'Permanent Redirect',\n        400 => 'Bad Request',\n        401 => 'Unauthorized',\n        402 => 'Payment Required',\n        403 => 'Forbidden',\n        404 => 'Not Found',\n        405 => 'Method Not Allowed',\n        406 => 'Not Acceptable',\n        407 => 'Proxy Authentication Required',\n        408 => 'Request Timeout',\n        409 => 'Conflict',\n        410 => 'Gone',\n        411 => 'Length Required',\n        412 => 'Precondition Failed',\n        413 => 'Request Entity Too Large',\n        414 => 'Request-URI Too Long',\n        415 => 'Unsupported Media Type',\n        416 => 'Requested Range Not Satisfiable',\n        417 => 'Expectation Failed',\n        422 => 'Unprocessable Entity',\n        423 => 'Locked',\n        424 => 'Failed Dependency',\n        425 => 'Reserved for WebDAV advanced collections expired proposal',\n        426 => 'Upgrade required',\n        428 => 'Precondition Required',\n        429 => 'Too Many Requests',\n        431 => 'Request Header Fields Too Large',\n        500 => 'Internal Server Error',\n        501 => 'Not Implemented',\n        502 => 'Bad Gateway',\n        503 => 'Service Unavailable',\n        504 => 'Gateway Timeout',\n        505 => 'HTTP Version Not Supported',\n        506 => 'Variant Also Negotiates (Experimental)',\n        507 => 'Insufficient Storage',\n        508 => 'Loop Detected',\n        510 => 'Not Extended',\n        511 => 'Network Authentication Required',\n    );\n\n    /**\n     * @param int $code 状态码\n     * @param double $duration 请求时长\n     * @param array $headers 响应头部\n     * @param string $body 响应内容\n     * @param string $error 错误描述\n     */\n    public function __construct($code, $duration, array $headers = array(), $body = null, $error = null)\n    {\n        $this->statusCode = $code;\n        $this->duration = $duration;\n        $this->headers = $headers;\n        $this->body = $body;\n        $this->error = $error;\n        $this->jsonData = null;\n        if ($error !== null) {\n            return;\n        }\n\n        if ($body === null) {\n            if ($code >= 400) {\n                $this->error = self::$statusTexts[$code];\n            }\n            return;\n        }\n        if (self::isJson($headers)) {\n            try {\n                $jsonData = self::bodyJson($body);\n                if ($code >= 400) {\n                    $this->error = $body;\n                    if ($jsonData['error'] !== null) {\n                        $this->error = $jsonData['error'];\n                    }\n                }\n                $this->jsonData = $jsonData;\n            } catch (\\InvalidArgumentException $e) {\n                $this->error = $body;\n                if ($code >= 200 && $code < 300) {\n                    $this->error = $e->getMessage();\n                }\n            }\n        } elseif ($code >= 400) {\n            $this->error = $body;\n        }\n        return;\n    }\n\n    public function json()\n    {\n        return $this->jsonData;\n    }\n\n    private static function bodyJson($body)\n    {\n        return \\Qiniu\\json_decode((string) $body, true, 512);\n    }\n\n    public function xVia()\n    {\n        $via = $this->headers['X-Via'];\n        if ($via === null) {\n            $via = $this->headers['X-Px'];\n        }\n        if ($via === null) {\n            $via = $this->headers['Fw-Via'];\n        }\n        return $via;\n    }\n\n    public function xLog()\n    {\n        return $this->headers['X-Log'];\n    }\n\n    public function xReqId()\n    {\n        return $this->headers['X-Reqid'];\n    }\n\n    public function ok()\n    {\n        return $this->statusCode >= 200 && $this->statusCode < 300 && $this->error === null;\n    }\n\n    public function needRetry()\n    {\n        $code = $this->statusCode;\n        if ($code < 0 || ($code / 100 === 5 and $code !== 579) || $code === 996) {\n            return true;\n        }\n    }\n\n    private static function isJson($headers)\n    {\n        return array_key_exists('Content-Type', $headers) &&\n        strpos($headers['Content-Type'], 'application/json') === 0;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Processing/ImageUrlBuilder.php",
    "content": "<?php\nnamespace Qiniu\\Processing;\n\nuse Qiniu;\n\n/**\n * 主要涉及图片链接拼接\n *\n * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/imageview2.html\n */\nfinal class ImageUrlBuilder\n{\n    /**\n     * mode合法范围值\n     *\n     * @var array\n     */\n    protected $modeArr = array(0, 1, 2, 3, 4, 5);\n\n    /**\n     * format合法值\n     *\n     * @var array\n     */\n    protected $formatArr = array('psd', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'bmp');\n\n    /**\n     * 水印图片位置合法值\n     *\n     * @var array\n     */\n    protected $gravityArr = array('NorthWest', 'North', 'NorthEast',\n        'West', 'Center', 'East', 'SouthWest', 'South', 'SouthEast');\n\n    /**\n     * 缩略图链接拼接\n     *\n     * @param  string $url 图片链接\n     * @param  int $mode 缩略模式\n     * @param  int $width 宽度\n     * @param  int $height 长度\n     * @param  string $format 输出类型\n     * @param  int $quality 图片质量\n     * @param  int $interlace 是否支持渐进显示\n     * @param  int $ignoreError 忽略结果\n     * @return string\n     * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/imageview2.html\n     * @author Sherlock Ren <sherlock_ren@icloud.com>\n     */\n    public function thumbnail(\n        $url,\n        $mode,\n        $width,\n        $height,\n        $format = null,\n        $interlace = null,\n        $quality = null,\n        $ignoreError = 1\n    ) {\n\n        // url合法效验\n        if (!$this->isUrl($url)) {\n            return $url;\n        }\n\n        // 参数合法性效验\n        if (!in_array(intval($mode), $this->modeArr, true)) {\n            return $url;\n        }\n\n        if (!$width || !$height) {\n            return $url;\n        }\n\n        $thumbStr = 'imageView2/' . $mode . '/w/' . $width . '/h/' . $height . '/';\n\n        // 拼接输出格式\n        if (!is_null($format)\n            && in_array($format, $this->formatArr)\n        ) {\n            $thumbStr .= 'format/' . $format . '/';\n        }\n\n        // 拼接渐进显示\n        if (!is_null($interlace)\n            && in_array(intval($interlace), array(0, 1), true)\n        ) {\n            $thumbStr .= 'interlace/' . $interlace . '/';\n        }\n\n        // 拼接图片质量\n        if (!is_null($quality)\n            && intval($quality) >= 0\n            && intval($quality) <= 100\n        ) {\n            $thumbStr .= 'q/' . $quality . '/';\n        }\n\n        $thumbStr .= 'ignore-error/' . $ignoreError . '/';\n\n        // 如果有query_string用|线分割实现多参数\n        return $url . ($this->hasQuery($url) ? '|' : '?') . $thumbStr;\n    }\n\n    /**\n     * 图片水印\n     *\n     * @param  string $url 图片链接\n     * @param  string $image 水印图片链接\n     * @param  numeric $dissolve 透明度\n     * @param  string $gravity 水印位置\n     * @param  numeric $dx 横轴边距\n     * @param  numeric $dy 纵轴边距\n     * @param  numeric $watermarkScale 自适应原图的短边比例\n     * @link   http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html\n     * @return string\n     * @author Sherlock Ren <sherlock_ren@icloud.com>\n     */\n    public function waterImg(\n        $url,\n        $image,\n        $dissolve = 100,\n        $gravity = 'SouthEast',\n        $dx = null,\n        $dy = null,\n        $watermarkScale = null\n    ) {\n        // url合法效验\n        if (!$this->isUrl($url)) {\n            return $url;\n        }\n\n        $waterStr = 'watermark/1/image/' . \\Qiniu\\base64_urlSafeEncode($image) . '/';\n\n        // 拼接水印透明度\n        if (is_numeric($dissolve)\n            && $dissolve <= 100\n        ) {\n            $waterStr .= 'dissolve/' . $dissolve . '/';\n        }\n\n        // 拼接水印位置\n        if (in_array($gravity, $this->gravityArr, true)) {\n            $waterStr .= 'gravity/' . $gravity . '/';\n        }\n\n        // 拼接横轴边距\n        if (!is_null($dx)\n            && is_numeric($dx)\n        ) {\n            $waterStr .= 'dx/' . $dx . '/';\n        }\n\n        // 拼接纵轴边距\n        if (!is_null($dy)\n            && is_numeric($dy)\n        ) {\n            $waterStr .= 'dy/' . $dy . '/';\n        }\n\n        // 拼接自适应原图的短边比例\n        if (!is_null($watermarkScale)\n            && is_numeric($watermarkScale)\n            && $watermarkScale > 0\n            && $watermarkScale < 1\n        ) {\n            $waterStr .= 'ws/' . $watermarkScale . '/';\n        }\n\n        // 如果有query_string用|线分割实现多参数\n        return $url . ($this->hasQuery($url) ? '|' : '?') . $waterStr;\n    }\n\n    /**\n     * 文字水印\n     *\n     * @param  string $url 图片链接\n     * @param  string $text 文字\n     * @param  string $font 文字字体\n     * @param  string $fontSize 文字字号\n     * @param  string $fontColor 文字颜色\n     * @param  numeric $dissolve 透明度\n     * @param  string $gravity 水印位置\n     * @param  numeric $dx 横轴边距\n     * @param  numeric $dy 纵轴边距\n     * @link   http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html#text-watermark\n     * @return string\n     * @author Sherlock Ren <sherlock_ren@icloud.com>\n     */\n    public function waterText(\n        $url,\n        $text,\n        $font = '黑体',\n        $fontSize = 0,\n        $fontColor = null,\n        $dissolve = 100,\n        $gravity = 'SouthEast',\n        $dx = null,\n        $dy = null\n    ) {\n        // url合法效验\n        if (!$this->isUrl($url)) {\n            return $url;\n        }\n\n        $waterStr = 'watermark/2/text/'\n            . \\Qiniu\\base64_urlSafeEncode($text) . '/font/'\n            . \\Qiniu\\base64_urlSafeEncode($font) . '/';\n\n        // 拼接文字大小\n        if (is_int($fontSize)) {\n            $waterStr .= 'fontsize/' . $fontSize . '/';\n        }\n\n        // 拼接文字颜色\n        if (!is_null($fontColor)\n            && $fontColor\n        ) {\n            $waterStr .= 'fill/' . \\Qiniu\\base64_urlSafeEncode($fontColor) . '/';\n        }\n\n        // 拼接水印透明度\n        if (is_numeric($dissolve)\n            && $dissolve <= 100\n        ) {\n            $waterStr .= 'dissolve/' . $dissolve . '/';\n        }\n\n        // 拼接水印位置\n        if (in_array($gravity, $this->gravityArr, true)) {\n            $waterStr .= 'gravity/' . $gravity . '/';\n        }\n\n        // 拼接横轴边距\n        if (!is_null($dx)\n            && is_numeric($dx)\n        ) {\n            $waterStr .= 'dx/' . $dx . '/';\n        }\n\n        // 拼接纵轴边距\n        if (!is_null($dy)\n            && is_numeric($dy)\n        ) {\n            $waterStr .= 'dy/' . $dy . '/';\n        }\n\n        // 如果有query_string用|线分割实现多参数\n        return $url . ($this->hasQuery($url) ? '|' : '?') . $waterStr;\n    }\n\n    /**\n     * 效验url合法性\n     *\n     * @param  string $url url链接\n     * @return string\n     * @author Sherlock Ren <sherlock_ren@icloud.com>\n     */\n    protected function isUrl($url)\n    {\n        $urlArr = parse_url($url);\n\n        return $urlArr['scheme']\n        && in_array($urlArr['scheme'], array('http', 'https'))\n        && $urlArr['host']\n        && $urlArr['path'];\n    }\n\n    /**\n     * 检测是否有query\n     *\n     * @param  string $url url链接\n     * @return string\n     * @author Sherlock Ren <sherlock_ren@icloud.com>\n     */\n    protected function hasQuery($url)\n    {\n        $urlArr = parse_url($url);\n\n        return !empty($urlArr['query']);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Processing/Operation.php",
    "content": "<?php\n\nnamespace Qiniu\\Processing;\n\nuse Qiniu\\Http\\Client;\nuse Qiniu\\Http\\Error;\n\nfinal class Operation\n{\n\n    private $auth;\n    private $token_expire;\n    private $domain;\n\n    public function __construct($domain, $auth = null, $token_expire = 3600)\n    {\n        $this->auth = $auth;\n        $this->domain = $domain;\n        $this->token_expire = $token_expire;\n    }\n\n\n    /**\n     * 对资源文件进行处理\n     *\n     * @param $key   待处理的资源文件名\n     * @param $fops   string|array  fop操作，多次fop操作以array的形式传入。\n     *                eg. imageView2/1/w/200/h/200, imageMogr2/thumbnail/!75px\n     *\n     * @return array 文件处理后的结果及错误。\n     *\n     * @link http://developer.qiniu.com/docs/v6/api/reference/fop/\n     */\n    public function execute($key, $fops)\n    {\n        $url = $this->buildUrl($key, $fops);\n        $resp = Client::get($url);\n        if (!$resp->ok()) {\n            return array(null, new Error($url, $resp));\n        }\n        if ($resp->json() !== null) {\n            return array($resp->json(), null);\n        }\n        return array($resp->body, null);\n    }\n\n    public function buildUrl($key, $fops, $protocol = 'http')\n    {\n        if (is_array($fops)) {\n            $fops = implode('|', $fops);\n        }\n\n        $url = $protocol . \"://$this->domain/$key?$fops\";\n        if ($this->auth !== null) {\n            $url = $this->auth->privateDownloadUrl($url, $this->token_expire);\n        }\n\n        return $url;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Processing/PersistentFop.php",
    "content": "<?php\nnamespace Qiniu\\Processing;\n\nuse Qiniu\\Config;\nuse Qiniu\\Http\\Client;\nuse Qiniu\\Http\\Error;\nuse Qiniu\\Processing\\Operation;\n\n/**\n * 持久化处理类,该类用于主动触发异步持久化操作.\n *\n * @link http://developer.qiniu.com/docs/v6/api/reference/fop/pfop/pfop.html\n */\nfinal class PersistentFop\n{\n    /**\n     * @var 账号管理密钥对，Auth对象\n     */\n    private $auth;\n\n    /*\n     * @var 配置对象，Config 对象\n     * */\n    private $config;\n\n\n    public function __construct($auth, $config = null)\n    {\n        $this->auth = $auth;\n        if ($config == null) {\n            $this->config = new Config();\n        } else {\n            $this->config = $config;\n        }\n    }\n\n    /**\n     * 对资源文件进行异步持久化处理\n     * @param $bucket     资源所在空间\n     * @param $key        待处理的源文件\n     * @param $fops       string|array  待处理的pfop操作，多个pfop操作以array的形式传入。\n     *                    eg. avthumb/mp3/ab/192k, vframe/jpg/offset/7/w/480/h/360\n     * @param $pipeline   资源处理队列\n     * @param $notify_url 处理结果通知地址\n     * @param $force      是否强制执行一次新的指令\n     *\n     *\n     * @return array 返回持久化处理的persistentId, 和返回的错误。\n     *\n     * @link http://developer.qiniu.com/docs/v6/api/reference/fop/\n     */\n    public function execute($bucket, $key, $fops, $pipeline = null, $notify_url = null, $force = false)\n    {\n        if (is_array($fops)) {\n            $fops = implode(';', $fops);\n        }\n        $params = array('bucket' => $bucket, 'key' => $key, 'fops' => $fops);\n        \\Qiniu\\setWithoutEmpty($params, 'pipeline', $pipeline);\n        \\Qiniu\\setWithoutEmpty($params, 'notifyURL', $notify_url);\n        if ($force) {\n            $params['force'] = 1;\n        }\n        $data = http_build_query($params);\n        $scheme = \"http://\";\n        if ($this->config->useHTTPS === true) {\n            $scheme = \"https://\";\n        }\n        $url = $scheme . Config::API_HOST . '/pfop/';\n        $headers = $this->auth->authorization($url, $data, 'application/x-www-form-urlencoded');\n        $headers['Content-Type'] = 'application/x-www-form-urlencoded';\n        $response = Client::post($url, $data, $headers);\n        if (!$response->ok()) {\n            return array(null, new Error($url, $response));\n        }\n        $r = $response->json();\n        $id = $r['persistentId'];\n        return array($id, null);\n    }\n\n    public function status($id)\n    {\n        $scheme = \"http://\";\n\n        if ($this->config->useHTTPS === true) {\n            $scheme = \"https://\";\n        }\n        $url = $scheme . Config::API_HOST . \"/status/get/prefop?id=$id\";\n        $response = Client::get($url);\n        if (!$response->ok()) {\n            return array(null, new Error($url, $response));\n        }\n        return array($response->json(), null);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Storage/BucketManager.php",
    "content": "<?php\nnamespace Qiniu\\Storage;\n\nuse Qiniu\\Auth;\nuse Qiniu\\Config;\nuse Qiniu\\Zone;\nuse Qiniu\\Http\\Client;\nuse Qiniu\\Http\\Error;\n\n/**\n * 主要涉及了空间资源管理及批量操作接口的实现，具体的接口规格可以参考\n *\n * @link https://developer.qiniu.com/kodo/api/1274/rs\n */\nfinal class BucketManager\n{\n    private $auth;\n    private $config;\n\n    public function __construct(Auth $auth, Config $config = null)\n    {\n        $this->auth = $auth;\n        if ($config == null) {\n            $this->config = new Config();\n        } else {\n            $this->config = $config;\n        }\n    }\n\n    /**\n     * 获取指定账号下所有的空间名。\n     *\n     * @return string[] 包含所有空间名\n     */\n    public function buckets($shared = true)\n    {\n        $includeShared = \"false\";\n        if ($shared === true) {\n            $includeShared = \"true\";\n        }\n        return $this->rsGet('/buckets?shared=' . $includeShared);\n    }\n\n    /**\n     * 获取指定空间绑定的所有的域名\n     *\n     * @return string[] 包含所有空间域名\n     */\n    public function domains($bucket)\n    {\n        return $this->apiGet('/v6/domain/list?tbl=' . $bucket);\n    }\n\n    /**\n     * 获取空间绑定的域名列表\n     * @return string[] 包含空间绑定的所有域名\n     */\n\n    /**\n     * 列取空间的文件列表\n     *\n     * @param $bucket     空间名\n     * @param $prefix     列举前缀\n     * @param $marker     列举标识符\n     * @param $limit      单次列举个数限制\n     * @param $delimiter  指定目录分隔符\n     *\n     * @return array    包含文件信息的数组，类似：[\n     *                                              {\n     *                                                 \"hash\" => \"<Hash string>\",\n     *                                                  \"key\" => \"<Key string>\",\n     *                                                  \"fsize\" => \"<file size>\",\n     *                                                  \"putTime\" => \"<file modify time>\"\n     *                                              },\n     *                                              ...\n     *                                            ]\n     * @link  http://developer.qiniu.com/docs/v6/api/reference/rs/list.html\n     */\n    public function listFiles($bucket, $prefix = null, $marker = null, $limit = 1000, $delimiter = null)\n    {\n        $query = array('bucket' => $bucket);\n        \\Qiniu\\setWithoutEmpty($query, 'prefix', $prefix);\n        \\Qiniu\\setWithoutEmpty($query, 'marker', $marker);\n        \\Qiniu\\setWithoutEmpty($query, 'limit', $limit);\n        \\Qiniu\\setWithoutEmpty($query, 'delimiter', $delimiter);\n        $url = $this->getRsfHost() . '/list?' . http_build_query($query);\n        return $this->get($url);\n    }\n\n    /**\n     * 获取资源的元信息，但不返回文件内容\n     *\n     * @param $bucket     待获取信息资源所在的空间\n     * @param $key        待获取资源的文件名\n     *\n     * @return array    包含文件信息的数组，类似：\n     *                                              [\n     *                                                  \"hash\" => \"<Hash string>\",\n     *                                                  \"key\" => \"<Key string>\",\n     *                                                  \"fsize\" => <file size>,\n     *                                                  \"putTime\" => \"<file modify time>\"\n     *                                                  \"fileType\" => <file type>\n     *                                              ]\n     *\n     * @link  http://developer.qiniu.com/docs/v6/api/reference/rs/stat.html\n     */\n    public function stat($bucket, $key)\n    {\n        $path = '/stat/' . \\Qiniu\\entry($bucket, $key);\n        return $this->rsGet($path);\n    }\n\n    /**\n     * 删除指定资源\n     *\n     * @param $bucket     待删除资源所在的空间\n     * @param $key        待删除资源的文件名\n     *\n     * @return mixed      成功返回NULL，失败返回对象Qiniu\\Http\\Error\n     * @link  http://developer.qiniu.com/docs/v6/api/reference/rs/delete.html\n     */\n    public function delete($bucket, $key)\n    {\n        $path = '/delete/' . \\Qiniu\\entry($bucket, $key);\n        list(, $error) = $this->rsPost($path);\n        return $error;\n    }\n\n\n    /**\n     * 给资源进行重命名，本质为move操作。\n     *\n     * @param $bucket     待操作资源所在空间\n     * @param $oldname    待操作资源文件名\n     * @param $newname    目标资源文件名\n     *\n     * @return mixed      成功返回NULL，失败返回对象Qiniu\\Http\\Error\n     */\n    public function rename($bucket, $oldname, $newname)\n    {\n        return $this->move($bucket, $oldname, $bucket, $newname);\n    }\n\n    /**\n     * 给资源进行重命名，本质为move操作。\n     *\n     * @param $from_bucket     待操作资源所在空间\n     * @param $from_key        待操作资源文件名\n     * @param $to_bucket       目标资源空间名\n     * @param $to_key          目标资源文件名\n     *\n     * @return mixed      成功返回NULL，失败返回对象Qiniu\\Http\\Error\n     * @link  http://developer.qiniu.com/docs/v6/api/reference/rs/copy.html\n     */\n    public function copy($from_bucket, $from_key, $to_bucket, $to_key, $force = false)\n    {\n        $from = \\Qiniu\\entry($from_bucket, $from_key);\n        $to = \\Qiniu\\entry($to_bucket, $to_key);\n        $path = '/copy/' . $from . '/' . $to;\n        if ($force === true) {\n            $path .= '/force/true';\n        }\n        list(, $error) = $this->rsPost($path);\n        return $error;\n    }\n\n    /**\n     * 将资源从一个空间到另一个空间\n     *\n     * @param $from_bucket     待操作资源所在空间\n     * @param $from_key        待操作资源文件名\n     * @param $to_bucket       目标资源空间名\n     * @param $to_key          目标资源文件名\n     *\n     * @return mixed      成功返回NULL，失败返回对象Qiniu\\Http\\Error\n     * @link  http://developer.qiniu.com/docs/v6/api/reference/rs/move.html\n     */\n    public function move($from_bucket, $from_key, $to_bucket, $to_key, $force = false)\n    {\n        $from = \\Qiniu\\entry($from_bucket, $from_key);\n        $to = \\Qiniu\\entry($to_bucket, $to_key);\n        $path = '/move/' . $from . '/' . $to;\n        if ($force) {\n            $path .= '/force/true';\n        }\n        list(, $error) = $this->rsPost($path);\n        return $error;\n    }\n\n    /**\n     * 主动修改指定资源的文件类型\n     *\n     * @param $bucket     待操作资源所在空间\n     * @param $key        待操作资源文件名\n     * @param $mime       待操作文件目标mimeType\n     *\n     * @return mixed      成功返回NULL，失败返回对象Qiniu\\Http\\Error\n     * @link  http://developer.qiniu.com/docs/v6/api/reference/rs/chgm.html\n     */\n    public function changeMime($bucket, $key, $mime)\n    {\n        $resource = \\Qiniu\\entry($bucket, $key);\n        $encode_mime = \\Qiniu\\base64_urlSafeEncode($mime);\n        $path = '/chgm/' . $resource . '/mime/' . $encode_mime;\n        list(, $error) = $this->rsPost($path);\n        return $error;\n    }\n\n\n    /**\n     * 修改指定资源的存储类型\n     *\n     * @param $bucket     待操作资源所在空间\n     * @param $key        待操作资源文件名\n     * @param $fileType       待操作文件目标文件类型\n     *\n     * @return mixed      成功返回NULL，失败返回对象Qiniu\\Http\\Error\n     * @link  https://developer.qiniu.com/kodo/api/3710/modify-the-file-type\n     */\n    public function changeType($bucket, $key, $fileType)\n    {\n        $resource = \\Qiniu\\entry($bucket, $key);\n        $path = '/chtype/' . $resource . '/type/' . $fileType;\n        list(, $error) = $this->rsPost($path);\n        return $error;\n    }\n\n\n    /**\n     * 从指定URL抓取资源，并将该资源存储到指定空间中\n     *\n     * @param $url        指定的URL\n     * @param $bucket     目标资源空间\n     * @param $key        目标资源文件名\n     *\n     * @return array    包含已拉取的文件信息。\n     *                         成功时：  [\n     *                                          [\n     *                                              \"hash\" => \"<Hash string>\",\n     *                                              \"key\" => \"<Key string>\"\n     *                                          ],\n     *                                          null\n     *                                  ]\n     *\n     *                         失败时：  [\n     *                                          null,\n     *                                         Qiniu/Http/Error\n     *                                  ]\n     * @link  http://developer.qiniu.com/docs/v6/api/reference/rs/fetch.html\n     */\n    public function fetch($url, $bucket, $key = null)\n    {\n\n        $resource = \\Qiniu\\base64_urlSafeEncode($url);\n        $to = \\Qiniu\\entry($bucket, $key);\n        $path = '/fetch/' . $resource . '/to/' . $to;\n\n        $ak = $this->auth->getAccessKey();\n        $ioHost = $this->config->getIovipHost($ak, $bucket);\n\n        $url = $ioHost . $path;\n        return $this->post($url, null);\n    }\n\n    /**\n     * 从镜像源站抓取资源到空间中，如果空间中已经存在，则覆盖该资源\n     *\n     * @param $bucket     待获取资源所在的空间\n     * @param $key        代获取资源文件名\n     *\n     * @return mixed      成功返回NULL，失败返回对象Qiniu\\Http\\Error\n     * @link  http://developer.qiniu.com/docs/v6/api/reference/rs/prefetch.html\n     */\n    public function prefetch($bucket, $key)\n    {\n        $resource = \\Qiniu\\entry($bucket, $key);\n        $path = '/prefetch/' . $resource;\n\n        $ak = $this->auth->getAccessKey();\n        $ioHost = $this->config->getIovipHost($ak, $bucket);\n\n        $url = $ioHost . $path;\n        list(, $error) = $this->post($url, null);\n        return $error;\n    }\n\n    /**\n     * 在单次请求中进行多个资源管理操作\n     *\n     * @param $operations     资源管理操作数组\n     *\n     * @return array 每个资源的处理情况，结果类似：\n     *              [\n     *                   { \"code\" => <HttpCode int>, \"data\" => <Data> },\n     *                   { \"code\" => <HttpCode int> },\n     *                   { \"code\" => <HttpCode int> },\n     *                   { \"code\" => <HttpCode int> },\n     *                   { \"code\" => <HttpCode int>, \"data\" => { \"error\": \"<ErrorMessage string>\" } },\n     *                   ...\n     *               ]\n     * @link http://developer.qiniu.com/docs/v6/api/reference/rs/batch.html\n     */\n    public function batch($operations)\n    {\n        $params = 'op=' . implode('&op=', $operations);\n        return $this->rsPost('/batch', $params);\n    }\n\n    /**\n     * 设置文件的生命周期\n     *\n     * @param $bucket 设置文件生命周期文件所在的空间\n     * @param $key    设置文件生命周期文件的文件名\n     * @param $days   设置该文件多少天后删除，当$days设置为0时表示取消该文件的生命周期\n     *\n     * @return Mixed\n     * @link https://developer.qiniu.com/kodo/api/update-file-lifecycle\n     */\n    public function deleteAfterDays($bucket, $key, $days)\n    {\n        $entry = \\Qiniu\\entry($bucket, $key);\n        $path = \"/deleteAfterDays/$entry/$days\";\n        list(, $error) = $this->rsPost($path);\n        return $error;\n    }\n\n    private function getRsfHost()\n    {\n        $scheme = \"http://\";\n        if ($this->config->useHTTPS == true) {\n            $scheme = \"https://\";\n        }\n        return $scheme . Config::RSF_HOST;\n    }\n\n    private function getRsHost()\n    {\n        $scheme = \"http://\";\n        if ($this->config->useHTTPS == true) {\n            $scheme = \"https://\";\n        }\n        return $scheme . Config::RS_HOST;\n    }\n\n    private function getApiHost()\n    {\n        $scheme = \"http://\";\n        if ($this->config->useHTTPS == true) {\n            $scheme = \"https://\";\n        }\n        return $scheme . Config::API_HOST;\n    }\n\n    private function rsPost($path, $body = null)\n    {\n        $url = $this->getRsHost() . $path;\n        return $this->post($url, $body);\n    }\n\n    private function apiGet($path)\n    {\n        $url = $this->getApiHost() . $path;\n        return $this->get($url);\n    }\n\n    private function rsGet($path)\n    {\n        $url = $this->getRsHost() . $path;\n        return $this->get($url);\n    }\n\n    private function get($url)\n    {\n        $headers = $this->auth->authorization($url);\n        $ret = Client::get($url, $headers);\n        if (!$ret->ok()) {\n            return array(null, new Error($url, $ret));\n        }\n        return array($ret->json(), null);\n    }\n\n    private function post($url, $body)\n    {\n        $headers = $this->auth->authorization($url, $body, 'application/x-www-form-urlencoded');\n        $ret = Client::post($url, $body, $headers);\n        if (!$ret->ok()) {\n            return array(null, new Error($url, $ret));\n        }\n        $r = ($ret->body === null) ? array() : $ret->json();\n        return array($r, null);\n    }\n\n    public static function buildBatchCopy($source_bucket, $key_pairs, $target_bucket, $force)\n    {\n        return self::twoKeyBatch('/copy', $source_bucket, $key_pairs, $target_bucket, $force);\n    }\n\n\n    public static function buildBatchRename($bucket, $key_pairs, $force)\n    {\n        return self::buildBatchMove($bucket, $key_pairs, $bucket, $force);\n    }\n\n\n    public static function buildBatchMove($source_bucket, $key_pairs, $target_bucket, $force)\n    {\n        return self::twoKeyBatch('/move', $source_bucket, $key_pairs, $target_bucket, $force);\n    }\n\n\n    public static function buildBatchDelete($bucket, $keys)\n    {\n        return self::oneKeyBatch('/delete', $bucket, $keys);\n    }\n\n\n    public static function buildBatchStat($bucket, $keys)\n    {\n        return self::oneKeyBatch('/stat', $bucket, $keys);\n    }\n\n    public static function buildBatchDeleteAfterDays($bucket, $key_day_pairs)\n    {\n        $data = array();\n        foreach ($key_day_pairs as $key => $day) {\n            array_push($data, '/deleteAfterDays/' . \\Qiniu\\entry($bucket, $key) . '/' . $day);\n        }\n        return $data;\n    }\n\n    public static function buildBatchChangeMime($bucket, $key_mime_pairs)\n    {\n        $data = array();\n        foreach ($key_mime_pairs as $key => $mime) {\n            array_push($data, '/chgm/' . \\Qiniu\\entry($bucket, $key) . '/mime/' . base64_encode($mime));\n        }\n        return $data;\n    }\n\n    public static function buildBatchChangeType($bucket, $key_type_pairs)\n    {\n        $data = array();\n        foreach ($key_type_pairs as $key => $type) {\n            array_push($data, '/chtype/' . \\Qiniu\\entry($bucket, $key) . '/type/' . $type);\n        }\n        return $data;\n    }\n\n    private static function oneKeyBatch($operation, $bucket, $keys)\n    {\n        $data = array();\n        foreach ($keys as $key) {\n            array_push($data, $operation . '/' . \\Qiniu\\entry($bucket, $key));\n        }\n        return $data;\n    }\n\n    private static function twoKeyBatch($operation, $source_bucket, $key_pairs, $target_bucket, $force)\n    {\n        if ($target_bucket === null) {\n            $target_bucket = $source_bucket;\n        }\n        $data = array();\n        $forceOp = \"false\";\n        if ($force) {\n            $forceOp = \"true\";\n        }\n        foreach ($key_pairs as $from_key => $to_key) {\n            $from = \\Qiniu\\entry($source_bucket, $from_key);\n            $to = \\Qiniu\\entry($target_bucket, $to_key);\n            array_push($data, $operation . '/' . $from . '/' . $to . \"/force/\" . $forceOp);\n        }\n        return $data;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Storage/FormUploader.php",
    "content": "<?php\nnamespace Qiniu\\Storage;\n\nuse Qiniu\\Http\\Client;\nuse Qiniu\\Http\\Error;\n\nfinal class FormUploader\n{\n\n    /**\n     * 上传二进制流到七牛, 内部使用\n     *\n     * @param $upToken    上传凭证\n     * @param $key        上传文件名\n     * @param $data       上传二进制流\n     * @param $config     上传配置\n     * @param $params     自定义变量，规格参考\n     *                    http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar\n     * @param $mime       上传数据的mimeType\n     *\n     * @return array    包含已上传文件的信息，类似：\n     *                                              [\n     *                                                  \"hash\" => \"<Hash string>\",\n     *                                                  \"key\" => \"<Key string>\"\n     *                                              ]\n     */\n    public static function put(\n        $upToken,\n        $key,\n        $data,\n        $config,\n        $params,\n        $mime,\n        $fname\n    ) {\n\n        $fields = array('token' => $upToken);\n        if ($key === null) {\n            $fname='nullkey';\n        } else {\n            $fields['key'] = $key;\n        }\n\n        //enable crc32 check by default\n        $fields['crc32'] = \\Qiniu\\crc32_data($data);\n\n        if ($params) {\n            foreach ($params as $k => $v) {\n                $fields[$k] = $v;\n            }\n        }\n\n        list($accessKey, $bucket, $err) = \\Qiniu\\explodeUpToken($upToken);\n        if ($err != null) {\n            return array(null, $err);\n        }\n\n        $upHost = $config->getUpHost($accessKey, $bucket);\n\n        $response = Client::multipartPost($upHost, $fields, 'file', $fname, $data, $mime);\n        if (!$response->ok()) {\n            return array(null, new Error($upHost, $response));\n        }\n        return array($response->json(), null);\n    }\n\n    /**\n     * 上传文件到七牛，内部使用\n     *\n     * @param $upToken    上传凭证\n     * @param $key        上传文件名\n     * @param $filePath   上传文件的路径\n     * @param $config     上传配置\n     * @param $params     自定义变量，规格参考\n     *                    http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar\n     * @param $mime       上传数据的mimeType\n     *\n     * @return array    包含已上传文件的信息，类似：\n     *                                              [\n     *                                                  \"hash\" => \"<Hash string>\",\n     *                                                  \"key\" => \"<Key string>\"\n     *                                              ]\n     */\n    public static function putFile(\n        $upToken,\n        $key,\n        $filePath,\n        $config,\n        $params,\n        $mime\n    ) {\n\n\n        $fields = array('token' => $upToken, 'file' => self::createFile($filePath, $mime));\n        if ($key !== null) {\n            $fields['key'] = $key;\n        }\n\n        $fields['crc32'] = \\Qiniu\\crc32_file($filePath);\n\n        if ($params) {\n            foreach ($params as $k => $v) {\n                $fields[$k] = $v;\n            }\n        }\n        $fields['key'] = $key;\n        $headers = array('Content-Type' => 'multipart/form-data');\n\n        list($accessKey, $bucket, $err) = \\Qiniu\\explodeUpToken($upToken);\n        if ($err != null) {\n            return array(null, $err);\n        }\n\n        $upHost = $config->getUpHost($accessKey, $bucket);\n\n        $response = Client::post($upHost, $fields, $headers);\n        if (!$response->ok()) {\n            return array(null, new Error($upHost, $response));\n        }\n        return array($response->json(), null);\n    }\n\n    private static function createFile($filename, $mime)\n    {\n        // PHP 5.5 introduced a CurlFile object that deprecates the old @filename syntax\n        // See: https://wiki.php.net/rfc/curl-file-upload\n        if (function_exists('curl_file_create')) {\n            return curl_file_create($filename, $mime);\n        }\n\n        // Use the old style if using an older version of PHP\n        $value = \"@{$filename}\";\n        if (!empty($mime)) {\n            $value .= ';type=' . $mime;\n        }\n\n        return $value;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Storage/ResumeUploader.php",
    "content": "<?php\nnamespace Qiniu\\Storage;\n\nuse Qiniu\\Config;\nuse Qiniu\\Http\\Client;\nuse Qiniu\\Http\\Error;\n\n/**\n * 断点续上传类, 该类主要实现了断点续上传中的分块上传,\n * 以及相应地创建块和创建文件过程.\n *\n * @link http://developer.qiniu.com/docs/v6/api/reference/up/mkblk.html\n * @link http://developer.qiniu.com/docs/v6/api/reference/up/mkfile.html\n */\nfinal class ResumeUploader\n{\n    private $upToken;\n    private $key;\n    private $inputStream;\n    private $size;\n    private $params;\n    private $mime;\n    private $contexts;\n    private $host;\n    private $currentUrl;\n    private $config;\n\n    /**\n     * 上传二进制流到七牛\n     *\n     * @param $upToken    上传凭证\n     * @param $key        上传文件名\n     * @param $inputStream 上传二进制流\n     * @param $size       上传流的大小\n     * @param $params     自定义变量\n     * @param $mime       上传数据的mimeType\n     *\n     * @link http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar\n     */\n    public function __construct(\n        $upToken,\n        $key,\n        $inputStream,\n        $size,\n        $params,\n        $mime,\n        $config\n    ) {\n\n        $this->upToken = $upToken;\n        $this->key = $key;\n        $this->inputStream = $inputStream;\n        $this->size = $size;\n        $this->params = $params;\n        $this->mime = $mime;\n        $this->contexts = array();\n        $this->config = $config;\n\n        list($accessKey, $bucket, $err) = \\Qiniu\\explodeUpToken($upToken);\n        if ($err != null) {\n            return array(null, $err);\n        }\n\n        $upHost = $config->getUpHost($accessKey, $bucket);\n        if ($err != null) {\n            throw new \\Exception($err->message(), 1);\n        }\n        $this->host = $upHost;\n    }\n\n    /**\n     * 上传操作\n     */\n    public function upload($fname)\n    {\n        $uploaded = 0;\n        while ($uploaded < $this->size) {\n            $blockSize = $this->blockSize($uploaded);\n            $data = fread($this->inputStream, $blockSize);\n            if ($data === false) {\n                throw new \\Exception(\"file read failed\", 1);\n            }\n            $crc = \\Qiniu\\crc32_data($data);\n            $response = $this->makeBlock($data, $blockSize);\n            $ret = null;\n            if ($response->ok() && $response->json() != null) {\n                $ret = $response->json();\n            }\n            if ($response->statusCode < 0) {\n                list($accessKey, $bucket, $err) = \\Qiniu\\explodeUpToken($this->upToken);\n                if ($err != null) {\n                    return array(null, $err);\n                }\n\n                $upHostBackup = $this->config->getUpBackupHost($accessKey, $bucket);\n                $this->host = $upHostBackup;\n            }\n            if ($response->needRetry() || !isset($ret['crc32']) || $crc != $ret['crc32']) {\n                $response = $this->makeBlock($data, $blockSize);\n                $ret = $response->json();\n            }\n\n            if (!$response->ok() || !isset($ret['crc32']) || $crc != $ret['crc32']) {\n                return array(null, new Error($this->currentUrl, $response));\n            }\n            array_push($this->contexts, $ret['ctx']);\n            $uploaded += $blockSize;\n        }\n        return $this->makeFile($fname);\n    }\n\n    /**\n     * 创建块\n     */\n    private function makeBlock($block, $blockSize)\n    {\n        $url = $this->host . '/mkblk/' . $blockSize;\n        return $this->post($url, $block);\n    }\n\n    private function fileUrl($fname)\n    {\n        $url = $this->host . '/mkfile/' . $this->size;\n        $url .= '/mimeType/' . \\Qiniu\\base64_urlSafeEncode($this->mime);\n        if ($this->key != null) {\n            $url .= '/key/' . \\Qiniu\\base64_urlSafeEncode($this->key);\n        }\n        $url .= '/fname/' . \\Qiniu\\base64_urlSafeEncode($fname);\n        if (!empty($this->params)) {\n            foreach ($this->params as $key => $value) {\n                $val = \\Qiniu\\base64_urlSafeEncode($value);\n                $url .= \"/$key/$val\";\n            }\n        }\n        return $url;\n    }\n\n    /**\n     * 创建文件\n     */\n    private function makeFile($fname)\n    {\n        $url = $this->fileUrl($fname);\n        $body = implode(',', $this->contexts);\n        $response = $this->post($url, $body);\n        if ($response->needRetry()) {\n            $response = $this->post($url, $body);\n        }\n        if (!$response->ok()) {\n            return array(null, new Error($this->currentUrl, $response));\n        }\n        return array($response->json(), null);\n    }\n\n    private function post($url, $data)\n    {\n        $this->currentUrl = $url;\n        $headers = array('Authorization' => 'UpToken ' . $this->upToken);\n        return Client::post($url, $data, $headers);\n    }\n\n    private function blockSize($uploaded)\n    {\n        if ($this->size < $uploaded + Config::BLOCK_SIZE) {\n            return $this->size - $uploaded;\n        }\n        return Config::BLOCK_SIZE;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Storage/UploadManager.php",
    "content": "<?php\nnamespace Qiniu\\Storage;\n\nuse Qiniu\\Config;\nuse Qiniu\\Http\\HttpClient;\nuse Qiniu\\Storage\\ResumeUploader;\nuse Qiniu\\Storage\\FormUploader;\n\n/**\n * 主要涉及了资源上传接口的实现\n *\n * @link http://developer.qiniu.com/docs/v6/api/reference/up/\n */\nfinal class UploadManager\n{\n    private $config;\n\n    public function __construct(Config $config = null)\n    {\n        if ($config === null) {\n            $config = new Config();\n        }\n        $this->config = $config;\n    }\n\n    /**\n     * 上传二进制流到七牛\n     *\n     * @param $upToken    上传凭证\n     * @param $key        上传文件名\n     * @param $data       上传二进制流\n     * @param $params     自定义变量，规格参考\n     *                    http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar\n     * @param $mime       上传数据的mimeType\n     * @param $checkCrc   是否校验crc32\n     *\n     * @return array    包含已上传文件的信息，类似：\n     *                                              [\n     *                                                  \"hash\" => \"<Hash string>\",\n     *                                                  \"key\" => \"<Key string>\"\n     *                                              ]\n     */\n    public function put(\n        $upToken,\n        $key,\n        $data,\n        $params = null,\n        $mime = 'application/octet-stream',\n        $fname = null\n    ) {\n    \n        $params = self::trimParams($params);\n        return FormUploader::put(\n            $upToken,\n            $key,\n            $data,\n            $this->config,\n            $params,\n            $mime,\n            $fname\n        );\n    }\n\n\n    /**\n     * 上传文件到七牛\n     *\n     * @param $upToken    上传凭证\n     * @param $key        上传文件名\n     * @param $filePath   上传文件的路径\n     * @param $params     自定义变量，规格参考\n     *                    http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar\n     * @param $mime       上传数据的mimeType\n     * @param $checkCrc   是否校验crc32\n     *\n     * @return array    包含已上传文件的信息，类似：\n     *                                              [\n     *                                                  \"hash\" => \"<Hash string>\",\n     *                                                  \"key\" => \"<Key string>\"\n     *                                              ]\n     */\n    public function putFile(\n        $upToken,\n        $key,\n        $filePath,\n        $params = null,\n        $mime = 'application/octet-stream',\n        $checkCrc = false\n    ) {\n    \n        $file = fopen($filePath, 'rb');\n        if ($file === false) {\n            throw new \\Exception(\"file can not open\", 1);\n        }\n        $params = self::trimParams($params);\n        $stat = fstat($file);\n        $size = $stat['size'];\n        if ($size <= Config::BLOCK_SIZE) {\n            $data = fread($file, $size);\n            fclose($file);\n            if ($data === false) {\n                throw new \\Exception(\"file can not read\", 1);\n            }\n            return FormUploader::put(\n                $upToken,\n                $key,\n                $data,\n                $this->config,\n                $params,\n                $mime,\n                $checkCrc,\n                basename($filePath)\n            );\n        }\n\n        $up = new ResumeUploader(\n            $upToken,\n            $key,\n            $file,\n            $size,\n            $params,\n            $mime,\n            $this->config\n        );\n        $ret = $up->upload(basename($filePath));\n        fclose($file);\n        return $ret;\n    }\n\n    public static function trimParams($params)\n    {\n        if ($params === null) {\n            return null;\n        }\n        $ret = array();\n        foreach ($params as $k => $v) {\n            $pos = strpos($k, 'x:');\n            if ($pos === 0 && !empty($v)) {\n                $ret[$k] = $v;\n            }\n        }\n        return $ret;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Zone.php",
    "content": "<?php\nnamespace Qiniu;\n\nuse Qiniu\\Http\\Client;\nuse Qiniu\\Http\\Error;\n\nfinal class Zone\n{\n\n    //源站上传域名\n    public $srcUpHosts;\n    //CDN加速上传域名\n    public $cdnUpHosts;\n    //资源管理域名\n    public $rsHost;\n    //资源列举域名\n    public $rsfHost;\n    //资源处理域名\n    public $apiHost;\n    //IOVIP域名\n    public $iovipHost;\n\n    //构造一个Zone对象\n    public function __construct(\n        $srcUpHosts = array(),\n        $cdnUpHosts = array(),\n        $rsHost = \"rs.qiniu.com\",\n        $rsfHost = \"rsf.qiniu.com\",\n        $apiHost = \"api.qiniu.com\",\n        $iovipHost = null\n    ) {\n\n        $this->srcUpHosts = $srcUpHosts;\n        $this->cdnUpHosts = $cdnUpHosts;\n        $this->rsHost = $rsHost;\n        $this->rsfHost = $rsfHost;\n        $this->apiHost = $apiHost;\n        $this->iovipHost = $iovipHost;\n    }\n\n    //华东机房\n    public static function zone0()\n    {\n        $Zone_z0 = new Zone(\n            array(\"up.qiniup.com\", 'up-jjh.qiniup.com', 'up-xs.qiniup.com'),\n            array('upload.qiniup.com', 'upload-jjh.qiniup.com', 'upload-xs.qiniup.com'),\n            'rs.qiniu.com',\n            'rsf.qiniu.com',\n            'api.qiniu.com',\n            'iovip.qbox.me'\n        );\n        return $Zone_z0;\n    }\n\n    //华北机房\n    public static function zone1()\n    {\n        $Zone_z1 = new Zone(\n            array('up-z1.qiniup.com'),\n            array('upload-z1.qiniup.com'),\n            \"rs-z1.qiniu.com\",\n            \"rsf-z1.qiniu.com\",\n            \"api-z1.qiniu.com\",\n            \"iovip-z1.qbox.me\"\n        );\n\n        return $Zone_z1;\n    }\n\n    //华南机房\n    public static function zone2()\n    {\n        $Zone_z2 = new Zone(\n            array('up-z2.qiniup.com', 'up-dg.qiniup.com', 'up-fs.qiniup.com'),\n            array('upload-z2.qiniup.com', 'upload-dg.qiniup.com', 'upload-fs.qiniup.com'),\n            \"rs-z2.qiniu.com\",\n            \"rsf-z2.qiniu.com\",\n            \"api-z2.qiniu.com\",\n            \"iovip-z2.qbox.me\"\n        );\n        return $Zone_z2;\n    }\n\n    //北美机房\n    public static function zoneNa0()\n    {\n        //北美机房\n        $Zone_na0 = new Zone(\n            array('up-na0.qiniup.com'),\n            array('upload-na0.qiniup.com'),\n            \"rs-na0.qiniu.com\",\n            \"rsf-na0.qiniu.com\",\n            \"api-na0.qiniu.com\",\n            \"iovip-na0.qbox.me\"\n        );\n        return $Zone_na0;\n    }\n\n    //新加坡机房\n    public static function zoneAs0()\n    {\n        //新加坡机房\n        $Zone_as0 = new Zone(\n            array('up-as0.qiniup.com'),\n            array('upload-as0.qiniup.com'),\n            \"rs-as0.qiniu.com\",\n            \"rsf-as0.qiniu.com\",\n            \"api-as0.qiniu.com\",\n            \"iovip-as0.qbox.me\"\n        );\n        return $Zone_as0;\n    }\n\n    /*\n     * GET /v2/query?ak=<ak>&&bucket=<bucket>\n     **/\n    public static function queryZone($ak, $bucket)\n    {\n        $zone = new Zone();\n        $url = Config::UC_HOST . '/v2/query' . \"?ak=$ak&bucket=$bucket\";\n        $ret = Client::Get($url);\n        if (!$ret->ok()) {\n            return array(null, new Error($url, $ret));\n        }\n        $r = ($ret->body === null) ? array() : $ret->json();\n        //print_r($ret);\n        //parse zone;\n\n        $iovipHost = $r['io']['src']['main'][0];\n        $zone->iovipHost = $iovipHost;\n        $accMain = $r['up']['acc']['main'][0];\n        array_push($zone->cdnUpHosts, $accMain);\n        if (isset($r['up']['acc']['backup'])) {\n            foreach ($r['up']['acc']['backup'] as $key => $value) {\n                array_push($zone->cdnUpHosts, $value);\n            }\n        }\n        $srcMain = $r['up']['src']['main'][0];\n        array_push($zone->srcUpHosts, $srcMain);\n        if (isset($r['up']['src']['backup'])) {\n            foreach ($r['up']['src']['backup'] as $key => $value) {\n                array_push($zone->srcUpHosts, $value);\n            }\n        }\n\n        //set specific hosts\n        if (strstr($zone->iovipHost, \"z1\") !== false) {\n            $zone->rsHost = \"rs-z1.qiniu.com\";\n            $zone->rsfHost = \"rsf-z1.qiniu.com\";\n            $zone->apiHost = \"api-z1.qiniu.com\";\n        } elseif (strstr($zone->iovipHost, \"z2\") !== false) {\n            $zone->rsHost = \"rs-z2.qiniu.com\";\n            $zone->rsfHost = \"rsf-z2.qiniu.com\";\n            $zone->apiHost = \"api-z2.qiniu.com\";\n        } elseif (strstr($zone->iovipHost, \"na0\") !== false) {\n            $zone->rsHost = \"rs-na0.qiniu.com\";\n            $zone->rsfHost = \"rsf-na0.qiniu.com\";\n            $zone->apiHost = \"api-na0.qiniu.com\";\n        } elseif (strstr($zone->iovipHost, \"as0\") !== false) {\n            $zone->rsHost = \"rs-as0.qiniu.com\";\n            $zone->rsfHost = \"rsf-as0.qiniu.com\";\n            $zone->apiHost = \"api-as0.qiniu.com\";\n        } else {\n            $zone->rsHost = \"rs.qiniu.com\";\n            $zone->rsfHost = \"rsf.qiniu.com\";\n            $zone->apiHost = \"api.qiniu.com\";\n        }\n\n        return $zone;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/functions.php",
    "content": "<?php\n\nnamespace Qiniu;\n\nuse Qiniu\\Config;\n\nif (!defined('QINIU_FUNCTIONS_VERSION')) {\n    define('QINIU_FUNCTIONS_VERSION', Config::SDK_VER);\n\n    /**\n     * 计算文件的crc32检验码:\n     *\n     * @param $file string  待计算校验码的文件路径\n     *\n     * @return string 文件内容的crc32校验码\n     */\n    function crc32_file($file)\n    {\n        $hash = hash_file('crc32b', $file);\n        $array = unpack('N', pack('H*', $hash));\n        return sprintf('%u', $array[1]);\n    }\n\n    /**\n     * 计算输入流的crc32检验码\n     *\n     * @param $data 待计算校验码的字符串\n     *\n     * @return string 输入字符串的crc32校验码\n     */\n    function crc32_data($data)\n    {\n        $hash = hash('crc32b', $data);\n        $array = unpack('N', pack('H*', $hash));\n        return sprintf('%u', $array[1]);\n    }\n\n    /**\n     * 对提供的数据进行urlsafe的base64编码。\n     *\n     * @param string $data 待编码的数据，一般为字符串\n     *\n     * @return string 编码后的字符串\n     * @link http://developer.qiniu.com/docs/v6/api/overview/appendix.html#urlsafe-base64\n     */\n    function base64_urlSafeEncode($data)\n    {\n        $find = array('+', '/');\n        $replace = array('-', '_');\n        return str_replace($find, $replace, base64_encode($data));\n    }\n\n    /**\n     * 对提供的urlsafe的base64编码的数据进行解码\n     *\n     * @param string $str 待解码的数据，一般为字符串\n     *\n     * @return string 解码后的字符串\n     */\n    function base64_urlSafeDecode($str)\n    {\n        $find = array('-', '_');\n        $replace = array('+', '/');\n        return base64_decode(str_replace($find, $replace, $str));\n    }\n\n    /**\n     * Wrapper for JSON decode that implements error detection with helpful\n     * error messages.\n     *\n     * @param string $json JSON data to parse\n     * @param bool $assoc When true, returned objects will be converted\n     *                        into associative arrays.\n     * @param int $depth User specified recursion depth.\n     *\n     * @return mixed\n     * @throws \\InvalidArgumentException if the JSON cannot be parsed.\n     * @link http://www.php.net/manual/en/function.json-decode.php\n     */\n    function json_decode($json, $assoc = false, $depth = 512)\n    {\n        static $jsonErrors = array(\n            JSON_ERROR_DEPTH => 'JSON_ERROR_DEPTH - Maximum stack depth exceeded',\n            JSON_ERROR_STATE_MISMATCH => 'JSON_ERROR_STATE_MISMATCH - Underflow or the modes mismatch',\n            JSON_ERROR_CTRL_CHAR => 'JSON_ERROR_CTRL_CHAR - Unexpected control character found',\n            JSON_ERROR_SYNTAX => 'JSON_ERROR_SYNTAX - Syntax error, malformed JSON',\n            JSON_ERROR_UTF8 => 'JSON_ERROR_UTF8 - Malformed UTF-8 characters, possibly incorrectly encoded'\n        );\n\n        if (empty($json)) {\n            return null;\n        }\n        $data = \\json_decode($json, $assoc, $depth);\n\n        if (JSON_ERROR_NONE !== json_last_error()) {\n            $last = json_last_error();\n            throw new \\InvalidArgumentException(\n                'Unable to parse JSON data: '\n                . (isset($jsonErrors[$last])\n                    ? $jsonErrors[$last]\n                    : 'Unknown error')\n            );\n        }\n\n        return $data;\n    }\n\n    /**\n     * 计算七牛API中的数据格式\n     *\n     * @param $bucket 待操作的空间名\n     * @param $key 待操作的文件名\n     *\n     * @return string  符合七牛API规格的数据格式\n     * @link http://developer.qiniu.com/docs/v6/api/reference/data-formats.html\n     */\n    function entry($bucket, $key)\n    {\n        $en = $bucket;\n        if (!empty($key)) {\n            $en = $bucket . ':' . $key;\n        }\n        return base64_urlSafeEncode($en);\n    }\n\n    /**\n     * array 辅助方法，无值时不set\n     *\n     * @param $array 待操作array\n     * @param $key key\n     * @param $value value 为null时 不设置\n     *\n     * @return array 原来的array，便于连续操作\n     */\n    function setWithoutEmpty(&$array, $key, $value)\n    {\n        if (!empty($value)) {\n            $array[$key] = $value;\n        }\n        return $array;\n    }\n\n    /**\n     * 缩略图链接拼接\n     *\n     * @param  string $url 图片链接\n     * @param  int $mode 缩略模式\n     * @param  int $width 宽度\n     * @param  int $height 长度\n     * @param  string $format 输出类型\n     * @param  int $quality 图片质量\n     * @param  int $interlace 是否支持渐进显示\n     * @param  int $ignoreError 忽略结果\n     * @return string\n     * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/imageview2.html\n     * @author Sherlock Ren <sherlock_ren@icloud.com>\n     */\n    function thumbnail(\n        $url,\n        $mode,\n        $width,\n        $height,\n        $format = null,\n        $quality = null,\n        $interlace = null,\n        $ignoreError = 1\n    ) {\n\n        static $imageUrlBuilder = null;\n        if (is_null($imageUrlBuilder)) {\n            $imageUrlBuilder = new \\Qiniu\\Processing\\ImageUrlBuilder;\n        }\n\n        return call_user_func_array(array($imageUrlBuilder, 'thumbnail'), func_get_args());\n    }\n\n    /**\n     * 图片水印\n     *\n     * @param  string $url 图片链接\n     * @param  string $image 水印图片链接\n     * @param  numeric $dissolve 透明度\n     * @param  string $gravity 水印位置\n     * @param  numeric $dx 横轴边距\n     * @param  numeric $dy 纵轴边距\n     * @param  numeric $watermarkScale 自适应原图的短边比例\n     * @link   http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html\n     * @return string\n     * @author Sherlock Ren <sherlock_ren@icloud.com>\n     */\n    function waterImg(\n        $url,\n        $image,\n        $dissolve = 100,\n        $gravity = 'SouthEast',\n        $dx = null,\n        $dy = null,\n        $watermarkScale = null\n    ) {\n\n        static $imageUrlBuilder = null;\n        if (is_null($imageUrlBuilder)) {\n            $imageUrlBuilder = new \\Qiniu\\Processing\\ImageUrlBuilder;\n        }\n\n        return call_user_func_array(array($imageUrlBuilder, 'waterImg'), func_get_args());\n    }\n\n    /**\n     * 文字水印\n     *\n     * @param  string $url 图片链接\n     * @param  string $text 文字\n     * @param  string $font 文字字体\n     * @param  string $fontSize 文字字号\n     * @param  string $fontColor 文字颜色\n     * @param  numeric $dissolve 透明度\n     * @param  string $gravity 水印位置\n     * @param  numeric $dx 横轴边距\n     * @param  numeric $dy 纵轴边距\n     * @link   http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html#text-watermark\n     * @return string\n     * @author Sherlock Ren <sherlock_ren@icloud.com>\n     */\n    function waterText(\n        $url,\n        $text,\n        $font = '黑体',\n        $fontSize = 0,\n        $fontColor = null,\n        $dissolve = 100,\n        $gravity = 'SouthEast',\n        $dx = null,\n        $dy = null\n    ) {\n\n        static $imageUrlBuilder = null;\n        if (is_null($imageUrlBuilder)) {\n            $imageUrlBuilder = new \\Qiniu\\Processing\\ImageUrlBuilder;\n        }\n\n        return call_user_func_array(array($imageUrlBuilder, 'waterText'), func_get_args());\n    }\n\n    /**\n     *  从uptoken解析accessKey和bucket\n     *\n     * @param $upToken\n     * @return array(ak,bucket,err=null)\n     */\n    function explodeUpToken($upToken)\n    {\n        $items = explode(':', $upToken);\n        if (count($items) != 3) {\n            return array(null, null, \"invalid uptoken\");\n        }\n        $accessKey = $items[0];\n        $putPolicy = json_decode(base64_decode($items[2]));\n        $scope = $putPolicy->scope;\n        $scopeItems = explode(':', $scope);\n        $bucket = $scopeItems[0];\n        return array($accessKey, $bucket, null);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/src/Upyun/Api/Form.php",
    "content": "<?php\n\nnamespace Upyun\\Api;\n\nuse Upyun\\Signature;\nuse Upyun\\Util;\nuse GuzzleHttp\\Client;\n\nclass Form extends Rest\n{\n    public function upload($path, $stream, $params)\n    {\n        $params['save-key'] = $path;\n        $params['service'] = $this->config->serviceName;\n        if (!isset($params['expiration'])) {\n            $params['expiration'] = time() + 30 * 60 * 60; // 30 分钟\n        }\n\n        $policy = Util::base64Json($params);\n        $method = 'POST';\n        $signature = Signature::getBodySignature($this->config, $method, '/' . $params['service'], null, $policy);\n        $client = new Client([\n            'timeout' => $this->config->timeout,\n        ]);\n\n        $response = $client->request($method, $this->endpoint, array(\n            'multipart' => array(\n                array(\n                    'name' => 'policy',\n                    'contents' => $policy,\n                ),\n                array(\n                    'name' => 'authorization',\n                    'contents' => $signature,\n                ),\n                array(\n                    'name' => 'file',\n                    'contents' => $stream,\n                )\n            )\n        ));\n        return $response->getStatusCode() === 200;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/src/Upyun/Api/Pretreat.php",
    "content": "<?php\nnamespace Upyun\\Api;\n\nuse GuzzleHttp\\Client;\nuse Upyun\\Config;\nuse Upyun\\Signature;\nuse Upyun\\Util;\n\nclass Pretreat\n{\n\n    /**\n     * @var Config\n     */\n    protected $config;\n\n    public function __construct(Config $config)\n    {\n        if (!$config->processNotifyUrl) {\n            throw new \\Exception(\"should config prosessNotifyUrl first.\");\n        }\n        $this->config = $config;\n    }\n\n    public function process($tasks, $optionalParams = array())\n    {\n        $encodedTasks = Util::base64Json($tasks);\n\n        $client = new Client([\n            'timeout' => $this->config->timeout,\n        ]);\n\n        $params = array(\n            'service' => $this->config->serviceName,\n            'notify_url' => $this->config->processNotifyUrl,\n            'tasks' => $encodedTasks,\n        );\n\n        $params = array_merge($params, $optionalParams);\n\n        $path = '/pretreatment/';\n        $method = 'POST';\n        $signedHeaders = Signature::getHeaderSign($this->config, $method, $path);\n\n        $url = $this->config->getPretreatEndPoint() . $path;\n        $response = $client->request($method, $url, [\n            'headers' => $signedHeaders,\n            'form_params' => $params\n        ]);\n\n        $body = $response->getBody()->getContents();\n        return json_decode($body, true);\n    }\n\n\n    public function query($taskIds, $path)\n    {\n        $client = new Client([\n            'timeout' => $this->config->timeout,\n        ]);\n\n        $params = array(\n            'service' => $this->config->serviceName,\n            'task_ids' => implode(',', $taskIds)\n        );\n        $path = $path . '?' . http_build_query($params);\n\n        $method = 'GET';\n        $url = $this->config->getPretreatEndPoint() . $path;\n        $signedHeaders = Signature::getHeaderSign($this->config, $method, $path);\n        $response = $client->request($method, $url, [\n            'headers' => $signedHeaders\n        ]);\n\n        if ($response->getStatusCode() === 200) {\n            $body = $response->getBody()->getContents();\n            $result = json_decode($body, true);\n            if (is_array($result)) {\n                return $result['tasks'];\n            }\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/src/Upyun/Api/Rest.php",
    "content": "<?php\n\nnamespace Upyun\\Api;\n\nuse GuzzleHttp\\Client;\nuse GuzzleHttp\\Psr7;\nuse Upyun\\Config;\nuse Upyun\\Signature;\nuse Upyun\\Util;\n\nclass Rest\n{\n    /**\n     * @var Config\n     */\n    protected $config;\n\n    protected $endpoint;\n    protected $method;\n    protected $storagePath;\n    public $headers = [];\n\n    /**\n     * @var Psr7\\Stream\n     */\n    protected $file;\n\n\n    public function __construct(Config $config)\n    {\n        $this->config   = $config;\n        $this->endpoint = $config->getProtocol() . Config::$restApiEndPoint . '/' . $config->serviceName;\n    }\n\n    public function request($method, $storagePath)\n    {\n        $this->method = strtoupper($method);\n        $this->storagePath = '/' . ltrim($storagePath, '/');\n        return $this;\n    }\n\n\n    /**\n     * @param string|resource $file\n     *\n     * @return $this\n     */\n    public function withFile($file)\n    {\n        $stream = Psr7\\stream_for($file);\n        $this->file = $stream;\n\n        return $this;\n    }\n\n    /**\n     * @return mixed|\\Psr\\Http\\Message\\ResponseInterface\n     */\n    public function send()\n    {\n        $client = new Client([\n            'timeout' => $this->config->timeout,\n        ]);\n\n        $url = $this->endpoint . $this->storagePath;\n        $body = null;\n        if ($this->file && $this->method === 'PUT') {\n            $body = $this->file;\n        }\n\n        $request = new Psr7\\Request(\n            $this->method,\n            Util::encodeURI($url),\n            $this->headers,\n            $body\n        );\n        $authHeader = Signature::getHeaderSign($this->config,\n            $this->method,\n            $request->getUri()->getPath()\n        );\n        foreach ($authHeader as $head => $value) {\n            $request = $request->withHeader($head, $value);\n        }\n        $response = $client->send($request, [\n            'debug' => $this->config->debug\n        ]);\n\n        return $response;\n    }\n\n    public function withHeader($header, $value)\n    {\n        $header = strtolower(trim($header));\n\n        $this->headers[$header] = $value;\n        return $this;\n    }\n\n    public function withHeaders($headers)\n    {\n        if (is_array($headers)) {\n            foreach ($headers as $header => $value) {\n                $this->withHeader($header, $value);\n            }\n        }\n        return $this;\n    }\n\n    public function toRequest()\n    {\n        $url = $this->endpoint . $this->storagePath;\n        $body = null;\n        if ($this->file && $this->method === 'PUT') {\n            $body = $this->file;\n        }\n\n        $request = new Psr7\\Request(\n            $this->method,\n            Util::encodeURI($url),\n            $this->headers,\n            $body\n        );\n        $authHeader = Signature::getHeaderSign($this->config,\n            $this->method,\n            $request->getUri()->getPath()\n        );\n        foreach ($authHeader as $head => $value) {\n            $request = $request->withHeader($head, $value);\n        }\n        return $request;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/src/Upyun/Api/SyncVideo.php",
    "content": "<?php\n/**\n * 同步视频处理\n */\n\nnamespace Upyun\\Api;\n\nuse GuzzleHttp\\Client;\nuse Upyun\\Config;\nuse Upyun\\Signature;\n\n\nclass SyncVideo {\n    /**\n     * @var Config\n     */\n    protected $config;\n\n    public function __construct(Config $config)\n    {\n        $this->config = $config;\n    }\n\n    public function process($params, $path) {\n        $client = new Client([\n            'timeout' => $this->config->timeout,\n        ]);\n\n        $path = '/' . $this->config->serviceName . $path;\n        $method = 'POST';\n        $signedHeaders = Signature::getHeaderSign($this->config, $method, $path);\n\n        $url = $this->config->getSyncVideoEndPoint() . $path;\n        $response = $client->request($method, $url, [\n            'headers' => $signedHeaders,\n            'json' => $params\n        ]);\n\n        $body = $response->getBody()->getContents();\n        return json_decode($body, true);\n    }\n}"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/src/Upyun/Config.php",
    "content": "<?php\nnamespace Upyun;\n\n/**\n * Class Config\n *\n * @package Upyun\n */\nclass Config\n{\n    /**\n     * @var string 服务名称，将会被弃用\n     */\n    public $bucketName;\n\n    /**\n     * @var string 服务名称\n     */\n    public $serviceName;\n    /**\n     * @var string 操作员名\n     */\n    public $operatorName;\n    /**\n     * @var string 操作员密码 md5 hash 值\n     */\n    public $operatorPassword;\n\n    /**\n     * @var bool 是否使用 https\n     */\n    public $useSsl;\n\n    /**\n     * @var string 上传使用的接口类型，可以设置为 `REST`：使用 rest api 上传，`AUTO` 根据文件大小自动判断，`BLOCK` 使用串行式断点续传，`BLOCK_PARALLEL` 使用并行式断点续传\n     * 当上传小文件时，不推荐使用断点续传；上传时如果设置了异步预处理`withAsyncProcess=true`，将会使用表单 api 上传\n     */\n    public $uploadType = 'AUTO';\n\n    /**\n     * @var int 上传的接口类型设置为 `AUTO` 时，文件大小的边界值：小于该值时，使用 rest api，否则使用断点续传。 默认 30M\n     */\n    public $sizeBoundary = 31457280;\n\n    /**\n     * @var int 并行式断点续传的并发数\n     */\n    public $concurrency = 5;\n\n    /**\n     * @var int request timeout seconds\n     */\n    public $timeout = 60;\n\n\n    /**\n     * @var string 异步云处理的回调通知地址\n     */\n    public $processNotifyUrl;\n\n    /**\n     * @var boolean curl debug\n     */\n    public $debug = false;\n\n    private $version = '3.0.0';\n\n\n\n    /**\n     * @var string 表单 api 的秘钥\n     */\n    private $formApiKey;\n\n    /**\n     * @var string rest api 和 form api 的接口地址\n     */\n    public static $restApiEndPoint;\n\n\n    /**\n     * rest api 和 form api 接口请求地址，详见：http://docs.upyun.com/api/rest_api/\n     */\n    const ED_AUTO            = 'v0.api.upyun.com';\n    const ED_TELECOM         = 'v1.api.upyun.com';\n    const ED_CNC             = 'v2.api.upyun.com';\n    const ED_CTT             = 'v3.api.upyun.com';\n\n    /**\n     * 异步云处理接口地址\n     */\n    const ED_VIDEO           = 'p0.api.upyun.com';\n\n    /**\n     * 刷新接口地址\n     */\n    const ED_PURGE           = 'http://purge.upyun.com/purge/';\n\n    /**\n     * 同步视频处理接口地址\n     */\n    const ED_SYNC_VIDEO           = 'p1.api.upyun.com';\n\n    public function __construct($serviceName, $operatorName, $operatorPassword)\n    {\n        $this->serviceName = $serviceName;\n        $this->bucketName = $serviceName;\n        $this->operatorName = $operatorName;\n        $this->setOperatorPassword($operatorPassword);\n        $this->useSsl          = false;\n        self::$restApiEndPoint = self::ED_AUTO;\n    }\n\n    public function setOperatorPassword($operatorPassword)\n    {\n        $this->operatorPassword = md5($operatorPassword);\n    }\n\n    public function getFormApiKey()\n    {\n        if (! $this->formApiKey) {\n            throw new \\Exception('form api key is empty.');\n        }\n\n        return $this->formApiKey;\n    }\n\n    public function setFormApiKey($key)\n    {\n        $this->formApiKey = $key;\n    }\n\n    public function getVersion()\n    {\n        return $this->version;\n    }\n\n    public function getPretreatEndPoint()\n    {\n        return $this->getProtocol() . self::ED_VIDEO;\n    }\n\n    public function getSyncVideoEndPoint()\n    {\n        return $this->getProtocol() . self::ED_SYNC_VIDEO;\n    }\n\n    public function getProtocol()\n    {\n        return $this->useSsl ? 'https://' : 'http://';\n    }\n\n    public function setUploadType($uploadType)\n    {\n        $this->uploadType = $uploadType;\n    }\n\n    public function setConcurrency($concurrency)\n    {\n        $this->concurrency = $concurrency;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/src/Upyun/Signature.php",
    "content": "<?php\nnamespace Upyun;\n\n/**\n * Class Signature\n * @package Upyun\n */\nclass Signature\n{\n    /**\n     * 获取分块上传接口的签名\n     */\n    const SIGN_MULTIPART     = 1;\n    /**\n     * 生成视频处理接口的签名\n     */\n    const SIGN_VIDEO         = 2;\n    /**\n     * 生成视频处理接口的签名（不需要操作员时使用）\n     */\n    const SIGN_VIDEO_NO_OPERATOR   = 3;\n\n    /**\n     * 获取 Header 签名需要的请求头\n     *\n     * @param Config $serviceConfig\n     * @param $method 请求方法\n     * @param $path  请求路径\n     * @param $contentMd5 文件内容 md5\n     *\n     * @return array\n     */\n    public static function getHeaderSign($serviceConfig, $method, $path, $contentMd5 = null)\n    {\n        $gmtDate = gmdate('D, d M Y H:i:s \\G\\M\\T');\n\n        $policy = null;\n        $sign = self::getBodySignature($serviceConfig, $method, $path, $gmtDate, $policy, $contentMd5);\n\n        $headers = array(\n            'Authorization' => $sign,\n            'Date' => $gmtDate,\n            'User-agent' => 'Php-Sdk/' . $serviceConfig->getVersion()\n        );\n        return $headers;\n    }\n\n    /**\n     * 获取请求缓存刷新接口需要的签名头\n     *\n     * @param Config $serviceConfig\n     * @param $urlString\n     *\n     * @return array\n     */\n    public static function getPurgeSignHeader(Config $serviceConfig, $urlString)\n    {\n        $gmtDate = gmdate('D, d M Y H:i:s \\G\\M\\T');\n        $sign = md5(\"$urlString&{$serviceConfig->serviceName}&$gmtDate&{$serviceConfig->operatorPassword}\");\n        return array(\n            'Authorization' => \"UpYun {$serviceConfig->serviceName}:{$serviceConfig->operatorName}:$sign\",\n            'Date' => $gmtDate,\n            'User-agent' => 'Php-Sdk/' . $serviceConfig->getVersion() . ' (purge api)'\n        );\n    }\n\n    /**\n     * 获取表单 API 需要的签名，依据 body 签名规则计算\n     * @param Config $serviceConfig\n     * @param $method 请求方法\n     * @param $uri 请求路径\n     * @param $date 请求时间\n     * @param $policy\n     * @param $contentMd5 请求 body 的 md5\n     *\n     * @return array\n     */\n    public static function getBodySignature(Config $serviceConfig, $method, $uri, $date = null, $policy = null, $contentMd5 = null)\n    {\n        $data = array(\n            $method,\n            $uri\n        );\n        if ($date) {\n            $data[] = $date;\n        }\n\n        if ($policy) {\n            $data[] = $policy;\n        }\n\n        if ($contentMd5) {\n            $data[] = $contentMd5;\n        }\n        $signature = base64_encode(hash_hmac('sha1', implode('&', $data), $serviceConfig->operatorPassword, true));\n        return 'UPYUN ' . $serviceConfig->operatorName . ':' . $signature;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/src/Upyun/Uploader.php",
    "content": "<?php\nnamespace Upyun;\n\nuse Upyun\\Api\\Rest;\nuse Upyun\\Api\\Form;\nuse GuzzleHttp\\Psr7;\nuse GuzzleHttp\\Pool;\nuse GuzzleHttp\\Client;\n\nclass Uploader\n{\n    /**\n     * @var Config\n     */\n    protected $config;\n\n    protected $useBlock = false;\n\n\n    public function __construct(Config $config)\n    {\n        $this->config = $config;\n    }\n\n    public function upload($path, $file, $params, $withAsyncProcess)\n    {\n        $stream = Psr7\\stream_for($file);\n        $size = $stream->getSize();\n        $useBlock = $this->needUseBlock($size);\n\n        if ($withAsyncProcess) {\n            $req = new Form($this->config);\n            return $req->upload($path, $stream, $params);\n        }\n\n        if (! $useBlock) {\n            $req = new Rest($this->config);\n            return $req->request('PUT', $path)\n                       ->withHeaders($params)\n                       ->withFile($stream)\n                       ->send();\n        } elseif ($this->config->uploadType === 'BLOCK_PARALLEL') {\n            return $this->concurrentPointUpload($path, $stream, $params);\n        } else {\n            return $this->pointUpload($path, $stream, $params);\n        }\n    }\n\n    /**\n     * 串行式断点续传\n     * @param $path\n     * @param $stream\n     * @param $params\n     *\n     * @return mixed|\\Psr\\Http\\Message\\ResponseInterface\n     * @throws \\Exception\n     */\n    private function pointUpload($path, $stream, $params)\n    {\n        $req = new Rest($this->config);\n        $headers = array();\n        if (is_array($params)) {\n            foreach ($params as $key => $val) {\n                $headers['X-Upyun-Meta-' . $key] = $val;\n            }\n        }\n        $res = $req->request('PUT', $path)\n            ->withHeaders(array_merge(array(\n                'X-Upyun-Multi-Stage' => 'initiate',\n                'X-Upyun-Multi-Type' => Psr7\\mimetype_from_filename($path),\n                'X-Upyun-Multi-Length' => $stream->getSize(),\n            ), $headers))\n            ->send();\n        if ($res->getStatusCode() !== 204) {\n            throw new \\Exception('init request failed when poinit upload!');\n        }\n\n        $init      = Util::getHeaderParams($res->getHeaders());\n        $uuid      = $init['x-upyun-multi-uuid'];\n        $blockSize = 1024 * 1024;\n        $partId    = 0;\n        do {\n            $fileBlock = $stream->read($blockSize);\n            $res = $req->request('PUT', $path)\n                ->withHeaders(array(\n                    'X-Upyun-Multi-Stage' => 'upload',\n                    'X-Upyun-Multi-Uuid' => $uuid,\n                    'X-Upyun-Part-Id' => $partId\n                ))\n                ->withFile(Psr7\\stream_for($fileBlock))\n                ->send();\n\n            if ($res->getStatusCode() !== 204) {\n                throw new \\Exception('upload request failed when poinit upload!');\n            }\n            $data   = Util::getHeaderParams($res->getHeaders());\n            $partId = $data['x-upyun-next-part-id'];\n        } while ($partId != -1);\n\n        $res = $req->request('PUT', $path)\n            ->withHeaders(array(\n                'X-Upyun-Multi-Uuid' => $uuid,\n                'X-Upyun-Multi-Stage' => 'complete'\n            ))\n            ->send();\n\n        if ($res->getStatusCode() != 204 && $res->getStatusCode() != 201) {\n            throw new \\Exception('end request failed when poinit upload!');\n        }\n        return $res;\n    }\n\n    private function needUseBlock($fileSize)\n    {\n        if ($this->config->uploadType === 'BLOCK' ||\n            $this->config->uploadType === 'BLOCK_PARALLEL') {\n            return true;\n        } elseif ($this->config->uploadType === 'AUTO' &&\n                  $fileSize >= $this->config->sizeBoundary) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * 并行式断点续传\n     * @param $path\n     * @param $stream\n     * @param $params\n     *\n     * @return mixed|\\Psr\\Http\\Message\\ResponseInterface\n     * @throws \\Exception\n     */\n    private function concurrentPointUpload($path, $stream, $params)\n    {\n        $req = new Rest($this->config);\n\n        $headers = array();\n        if (is_array($params)) {\n            foreach ($params as $key => $val) {\n                $headers['X-Upyun-Meta-' . $key] = $val;\n            }\n        }\n        $res = $req->request('PUT', $path)\n            ->withHeaders(array_merge(array(\n                'X-Upyun-Multi-Disorder' => 'true',\n                'X-Upyun-Multi-Stage' => 'initiate',\n                'X-Upyun-Multi-Type' => Psr7\\mimetype_from_filename($path),\n                'X-Upyun-Multi-Length' => $stream->getSize(),\n            ), $headers))\n            ->send();\n        if ($res->getStatusCode() !== 204) {\n            throw new \\Exception('init request failed when poinit upload!');\n        }\n\n        $init = Util::getHeaderParams($res->getHeaders());\n        $uuid = $init['x-upyun-multi-uuid'];\n        $requests = function ($req, $path, $stream, $uuid) {\n            $blockSize = 1024 * 1024;\n            $total = ceil($stream->getSize() / $blockSize);\n            for ($i = 0; $i < $total; $i++) {\n                $fileBlock = $stream->read($blockSize);\n                yield $req->request('PUT', $path)\n                    ->withHeaders(array(\n                        'X-Upyun-Multi-Stage' => 'upload',\n                        'X-Upyun-Multi-Uuid' => $uuid,\n                        'X-Upyun-Part-Id' => $i\n                    ))\n                    ->withFile(Psr7\\stream_for($fileBlock))\n                    ->toRequest();\n            }\n        };\n        $client = new Client([\n            'timeout' => $this->config->timeout,\n        ]);\n        $pool = new Pool($client, $requests($req, $path, $stream, $uuid), [\n            'concurrency' => $this->config->concurrency,\n            'fulfilled' => function ($res) {\n                if ($res->getStatusCode() !== 204) {\n                    throw new \\Exception('upload request failed when poinit upload!');\n                }\n            },\n            'rejected' => function () {\n                throw new \\Exception('upload request failed when poinit upload!');\n            },\n        ]);\n        $promise = $pool->promise();\n        $promise->wait();\n\n        $res = $req->request('PUT', $path)\n            ->withHeaders(array(\n                'X-Upyun-Multi-Uuid' => $uuid,\n                'X-Upyun-Multi-Stage' => 'complete'\n            ))\n            ->send();\n        if ($res->getStatusCode() != 204 && $res->getStatusCode() != 201) {\n            throw new \\Exception('end request failed when poinit upload!');\n        }\n        return $res;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/src/Upyun/Upyun.php",
    "content": "<?php\n/**\n * 又拍云 PHP-SDK\n */\nnamespace Upyun;\n\nuse Upyun\\Api\\Rest;\n\nuse GuzzleHttp\\Client;\nuse GuzzleHttp\\Psr7;\nuse GuzzleHttp;\n\n/**\n * Class Upyun\n *\n * 又拍云云存储、云处理接口\n *\n * Upyun 类实现了又拍云云存储和云处理的所有接口，通过该类可以实现文件上传、下载；图片视频等多媒体资源云处理。\n * 本文档中，提到的\"服务\"是指又拍云文件加速回又拍云源类型的服务（即原先的存储类空间）。\n *\n * @package Upyun\n */\nclass Upyun\n{\n\n    /**\n     * @var Config: 服务配置\n     */\n    protected $config;\n\n    // 异步云处理任务类型\n    /**\n     * @var string 异步音视频处理\n     */\n    public static $PROCESS_TYPE_MEDIA = 'media';\n    /**\n     * @var string 文件压缩\n     */\n    public static $PROCESS_TYPE_ZIP = 'zip-file';\n    /**\n     * @var string 解压缩\n     */\n    public static $PROCESS_TYPE_UNZIP = 'unzip-file';\n    /**\n     * @var string 文件拉取\n     */\n    public static $PROCESS_TYPE_SYNC_FILE = 'sync-remote-file-to-upyun';\n    /**\n     * @var string 文档转换\n     */\n    public static $PROCESS_TYPE_CONVERT = 'document-type-convert';\n    /**\n     * @var string 异步图片拼接\n     */\n    public static $PROCESS_TYPE_STITCH = 'picture-stitch';\n\n    /**\n     * Upyun constructor.\n     *\n     * @param Config $config 服务配置\n     */\n    public function __construct(Config $config)\n    {\n        $this->setConfig($config);\n    }\n\n    /**\n     * 配置服务信息\n     *\n     * 当需要操作的新的服务时，使用该方法传入新的服务配置即可\n     *\n     * @param Config $config 服务配置\n     *\n     * @return $this\n     */\n    public function setConfig(Config $config)\n    {\n        $this->config = $config;\n        return $this;\n    }\n\n    /**\n     * 上传一个文件到又拍云存储\n     *\n     * 上传的文件格式支持文件流或者字符串方式上传。除简单的文件上传外，针对多媒体资源（图片、音视频），还可以设置同步/异步预处理多媒体资源，例如：图片的裁剪缩放，音视频的转码截图等等众多又拍云强大的云处理功能\n     *\n     * @param string $path 被上传的文件在又拍云存储服务中保存的路径\n     * @param string|resource $content 被上传的文件内容（字符串），或者打开该文件获得的文件句柄（文件流）。当上传本地大文件时，推荐使用文件流的方式上传\n     * @param array $params 上传文件时，附加的自定义参数。支持 Content-MD5 Content-Type Content-Secret 等，详见 [上传参数](http://docs.upyun.com/api/rest_api/#_2)，例如：\n     * - 设置文件[保护秘钥](http://docs.upyun.com/api/rest_api/#Content-Secret) `write($path, $content, array('Content-Secret' => 'my-secret'))`；\n     * - 添加[文件元信息](http://docs.upyun.com/api/rest_api/#metadata) `write($path, $content, array('X-Upyun-Meta-Foo' =>\n     * 'bar'))`\n     * - [图片同步预处理](http://docs.upyun.com/cloud/image/#_5) `write($path, $content, array('x-gmkerl-thumb' => '/format/png'))`\n     * @param bool $withAsyncProcess  默认为 `false`，当上传图片或者音视频资源时，可以设置该参数为 `true`，开启图片音视频的[异步处理功能](http://docs.upyun.com/api/form_api/#_6) ，例如：\n     *```\n     * // 以下参数会将新上传的图片，再异步生成另一份 png 格式的图片，原图不受影响\n     * write($path, $content, array(\n     *    'apps' => array(\n     *        array(\n     *            'name' => 'thumb',         //异步图片处理任务\n     *            'x-gmkerl-thumb' => '/format/png', // 格式化图片为 png 格式\n     *            'save_as': '/iamge/png/new.png',   // 处理成功后的图片保存路径\n     *            'notify_url': 'http://your.notify.url'  // 异步任务完成后的回调地址\n     *        )\n     *    )\n     * ), true);\n     *```\n     *\n     *\n     *\n     * @return array|bool 若文件是图片则返回图片基本信息，如：`array('x-upyun-width' => 123, 'x-upyun-height' => 50, 'x-upyun-frames'\n     * => 1, 'x-upyun-file-type' => 'JPEG')`，否则返回空数组。当使用异步预处理功能时，返回结果为布尔值，成功为 `true`。\n     *\n     * @throws \\Exception 上传失败时，抛出异常\n     */\n    public function write($path, $content, $params = array(), $withAsyncProcess = false)\n    {\n        if (!$content) {\n            throw new \\Exception('write content can not be empty.');\n        }\n\n        $upload = new Uploader($this->config);\n        $response = $upload->upload($path, $content, $params, $withAsyncProcess);\n        if ($withAsyncProcess) {\n            return $response;\n        }\n        return Util::getHeaderParams($response->getHeaders());\n    }\n\n    /**\n     * 读取云存储文件/目录内容\n     *\n     * @param string $path 又拍云存储中的文件或者目录路径\n     * @param resource $saveHandler 文件内容写入本地文件流。例如 `$saveHandler = fopen('/local/file', 'w')\n     * `。当设置该参数时，将以文件流的方式，直接将又拍云中的文件写入本地的文件流，或其他可以写入的流\n     * @param array $params  可选参数，读取目录内容时，需要设置三个参数： `X-List-Iter` 分页开始位置（第一页不需要设置），`X-List-Limit` 获取的文件数量（默认 100，最大\n     * 10000），`X-List-Order` 结果以时间正序或者倒序\n     *\n     * @return mixed $return 当读取文件且没有设置 `$saveHandler` 参数时，返回一个字符串类型，表示文件内容；设置了 `$saveHandler` 参数时，返回布尔值\n     * `true`。当读取目录时，返回一个数组，表示目录下的文件列表。目录下文件内容过多时，需要通过判断返回数组中的 `is_end` 属性，进行分页读取内容\n     *\n     * @throws \\Exception\n     */\n    public function read($path, $saveHandler = null, $params = array())\n    {\n        $req = new Rest($this->config);\n        $response = $req->request('GET', $path)\n            ->withHeaders($params)\n            ->send();\n\n\n        $params = Util::getHeaderParams($response->getHeaders());\n\n\n        if (! isset($params['x-upyun-list-iter'])) {\n            if (is_resource($saveHandler)) {\n                Psr7\\copy_to_stream($response->getBody(), Psr7\\stream_for($saveHandler));\n                return true;\n            } else {\n                return $response->getBody()->getContents();\n            }\n        } else {\n            $files = Util::parseDir($response->getBody()->getContents());\n            return array('files' => $files, 'is_end' => $params['x-upyun-list-iter'] === 'g2gCZAAEbmV4dGQAA2VvZg', 'iter' => $params['x-upyun-list-iter']);\n        }\n    }\n\n    /**\n     * 判断文件是否存在于又拍云存储\n     *\n     * 注意: 对刚删除的文件, 立即调用该方法可能会返回 true, 因为服务端执行删除操作后可能会有很短暂的延迟.\n     *\n     * @param string $path 云存储的文件路径\n     *\n     * @return bool 存在时返回 `true`，否则返回 `false`\n     * @throws \\Exception\n     */\n    public function has($path)\n    {\n        $req = new Rest($this->config);\n        try {\n            $req->request('HEAD', $path)\n                            ->send();\n        } catch (GuzzleHttp\\Exception\\BadResponseException $e) {\n            $statusCode = $e->getResponse()->getStatusCode();\n            if ($statusCode === 404) {\n                return false;\n            } else {\n                throw $e;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * 获取云存储文件/目录的基本信息\n     *\n     * @param string $path 云存储的文件路径\n     * @param array $otherHeaders 设置了后，方法将返回其他 http header 中的信息，默认为空\n     *\n     * @return array 返回一个数组，默认包含以下 key\n     * - `x-upyun-file-type` 当 $path 是目录时，值为 *folder*，当 $path 是文件时，值为 *file*，\n     * - `x-upyun-file-size` 文件大小\n     * - `x-upyun-file-date` 文件的创建时间\n     */\n    public function info($path, $otherHeaders = array())\n    {\n        $req = new Rest($this->config);\n        $response = $req->request('HEAD', $path)\n                        ->send();\n        return Util::getHeaderParams($response->getHeaders(), $otherHeaders);\n    }\n\n    /**\n     * 获取文件的文档类型\n     * @param string $path 云存储文件路径\n     * @return string 文档类型，e.g: `appcation/json`，获取失败返回空字符串\n     */\n    public function getMimetype($path)\n    {\n        $params = $this->info($path, array('content-type'));\n        if (isset($params['content-type'])) {\n            return explode(';', $params['content-type'])[0];\n        }\n        return '';\n    }\n\n    /**\n     * 删除文件或者目录\n     *\n     * @param string $path 文件或目录在又拍云存储的路径\n     * @param bool $async 是否异步删除，默认为 false，表示同步删除。当需要批量删除大量文件时，必须选择异步删除\n     *\n     * @return bool 删除成功返回 true，否则 false\n     * @throws \\Exception 删除不存在的文件将会抛出异常\n     */\n    public function delete($path, $async = false)\n    {\n        $req = new Rest($this->config);\n        $req->request('DELETE', $path);\n        if ($async) {\n            $req->withHeader('x-upyun-async', 'true');\n        }\n        $res = $req->send();\n        return $res->getStatusCode() === 200;\n    }\n\n    /**\n     * 创建目录\n     *\n     * @param string $path 需要在又拍云存储创建的目录路径\n     *\n     * @return bool 创建成功返回 true，否则返回 false\n     * @throws \\Exception\n     */\n    public function createDir($path)\n    {\n        $path = rtrim($path, '/') . '/';\n        $req = new Rest($this->config);\n        $res = $req->request('POST', $path)\n            ->withHeader('folder', 'true')\n            ->send();\n        return $res->getStatusCode() === 200;\n    }\n\n    /**\n     * 删除文件或者目录\n     *\n     * @param string $path 需要被删除的云存储文件或目录路径\n     *\n     * @return bool 成功返回 true，否则 false\n     * @throws \\Exception\n     */\n    public function deleteDir($path)\n    {\n        return $this->delete($path);\n    }\n\n    /**\n     * 获取目录下存储使用量\n     *\n     * @param string $path 云存储目录路径，默认为根目录，表示整个云存储服务使用的空间大小\n     * @return string 存储使用量，单位字节\n     * @throws \\Exception\n     */\n    public function usage($path = '/')\n    {\n        $path = rtrim($path, '/') . '/';\n        $req = new Rest($this->config);\n        $response = $req->request('GET', $path . '?usage')\n            ->send();\n\n        return $response->getBody()->getContents();\n    }\n\n    /**\n     * 复制文件。只能操作文件，不能操作文件夹。\n     *\n     * @param string $source 源文件地址\n     * @param string $target 目标文件地址\n     * @return bool 复制成功返回 true，否则 false\n     * @throws \\Exception\n     */\n    public function copy($source, $target)\n    {\n        $source = '/' . $this->config->serviceName . '/' . ltrim($source, '/');\n        $req = new Rest($this->config);\n        $response = $req->request('PUT', $target)\n            ->withHeader('X-Upyun-Copy-Source', $source)\n            ->send();\n        return util::isSuccess($response->getStatusCode());\n    }\n\n    /**\n     * 移动文件。可以进行文件重命名、文件移动，只能操作文件，不能操作文件夹。\n     *\n     * @param string $source 源文件地址\n     * @param string $target 目标文件地址\n     * @return bool 移动成功返回 true，否则 false\n     * @throws \\Exception\n     */\n    public function move($source, $target)\n    {\n        $source = '/' . $this->config->serviceName . '/' . ltrim($source, '/');\n        $req = new Rest($this->config);\n        $response = $req->request('PUT', $target)\n            ->withHeader('X-Upyun-Move-Source', $source)\n            ->send();\n        return util::isSuccess($response->getStatusCode());\n    }\n\n    /**\n     * 刷新缓存\n     *\n     * @param array|string $urls 需要刷新的文件 url 列表\n     *\n     * @return array 刷新失败的 url 列表，若全部刷新成功则为空数组\n     */\n    public function purge($urls)\n    {\n        $urlString = $urls;\n        if (is_array($urls)) {\n            $urlString = implode(\"\\n\", $urls);\n        }\n\n        $client = new Client([\n            'timeout' => $this->config->timeout\n        ]);\n        $response = $client->request('POST', Config::ED_PURGE, [\n            'headers' =>  Signature::getPurgeSignHeader($this->config, $urlString),\n            'form_params' => ['purge' => $urlString]\n        ]);\n        $result = json_decode($response->getBody()->getContents(), true);\n        return $result['invalid_domain_of_url'];\n    }\n\n    /**\n     * 异步云处理\n     *\n     * 该方法是基于[又拍云云处理](http://docs.upyun.com/cloud/) 服务实现，可以实现音视频的转码、切片、剪辑；文件的压缩解压缩；文件拉取功能\n     *\n     * 注意：\n     * - 所有需要调用该方法处理的资源，必须已经上传到云存储服务\n     * - 使用 `process` 之前，必须配置 `config->processNotifyUrl`，否则会提交任务失败\n     *\n     * 例如视频转码：\n     * ```\n     *  process(array(\n     *    array(\n     *        'type' => 'video',  // video 表示视频任务, audio 表示音频任务\n     *        'avopts' => '/s/240p(4:3)/as/1/r/30', // 处理参数，`s` 表示输出的分辨率，`r` 表示视频帧率，`as` 表示是否自动调整分辨率\n     *        'save_as' => '/video/240/new.mp4', // 新视频在又拍云存储的保存路径\n     *    ),\n     *    ... // 同时还可以添加其他任务\n     * ), Upyun::$PROCESS_TYPE_MEDIA, $source)\n     * ```\n     *\n     * @param array $tasks 需要处理的任务\n     * @param string $type 异步云处理任务类型，可选值:\n     * - `Upyun::$PROCESS_TYPE_MEDIA` 异步音视频处理\n     * - `Upyun::$PROCESS_TYPE_ZIP` 文件压缩\n     * - `Upyun::$PROCESS_TYPE_UNZIP` 文件解压\n     * - `Upyun::$PROCESS_TYPE_SYNC_FILE` 文件拉取\n     * - `Upyun::$PROCESS_TYPE_STITCH` 图片拼接\n     * @param string $source 可选参数，处理异步音视频任务时，需要传递该参数，表示需要处理的文件路径\n     *\n     * @return array 任务 ID，提交了多少任务，便会返回多少任务 ID，与提交任务的顺序保持一致。可以通过任务 ID 查询处理进度。格式如下：\n     * ```\n     * array(\n     * '35f0148d414a688a275bf915ba7cebb2',\n     * '98adbaa52b2f63d6d7f327a0ff223348',\n     * )\n     * ```\n     * @throws \\Exception\n     */\n    public function process($tasks, $type, $source = '')\n    {\n        $video = new Api\\Pretreat($this->config);\n\n        $options = array();\n        switch($type) {\n            case self::$PROCESS_TYPE_MEDIA:\n                $options['accept'] = 'json';\n                $options['source'] = $source;\n                break;\n            case self::$PROCESS_TYPE_ZIP:\n                $options['app_name'] = 'compress';\n                break;\n            case self::$PROCESS_TYPE_UNZIP:\n                $options['app_name'] = 'depress';\n                break;\n            case self::$PROCESS_TYPE_SYNC_FILE:\n                $options['app_name'] = 'spiderman';\n                break;\n            case self::$PROCESS_TYPE_CONVERT:\n                $options['app_name'] = 'uconvert';\n                break;\n            case self::$PROCESS_TYPE_STITCH:\n                $options['app_name'] = 'jigsaw';\n                break;\n            default:\n                throw new \\Exception('upyun - not support process type.');\n\n        }\n        return $video->process($tasks, $options);\n    }\n\n    /**\n     * 查询异步云处理任务进度\n     *\n     * 根据 `process` 方法返回的任务 ID，通过该访问查询处理进度\n     *\n     * @param array $taskIds 任务 ID\n     *\n     * @return bool|array 查询失败返回布尔值 `false`，否则返回每个任务的百分比进度信息，格式如下：\n     * ```\n     * array(\n     *     '35f0148d414a688a275bf915ba7cebb2' => 100,  // 100 表示任务完成\n     *     'c3103189fa906a5354d29bd807e8dc51' => 35,\n     *     '98adbaa52b2f63d6d7f327a0ff223348' => null, // null 表示任务未开始，或异常\n     * )\n     * ```\n     */\n    public function queryProcessStatus($taskIds)\n    {\n        $video = new Api\\Pretreat($this->config);\n        return $video->query($taskIds, '/status/');\n    }\n\n    /**\n     *  查询异步云处理任务结果\n     *\n     * 根据 `process` 方法返回的任务 ID，通过该访问查询处理结果，会包含每个任务详细信息\n     * @param array $taskIds 任务 ID\n     *\n     * @return bool|mixed 查询失败返回 `false`，否则返回每个任务的处理结果，格式如下：\n     * ```\n     * array(\n     *    '9d9c32b63a1034834e77672c6f51f661' => array(\n     *         'path' => array('/v2.mp4'),\n     *         'signature' => '4042c1f07f546d28',\n     *         'status_code' => 200,\n     *         'service_name' => 'your_storage_service',\n     *         'description' => 'OK',\n     *         'task_id' => '9d9c32b63a1034834e77672c6f51f661',\n     *         'timestamp' => 1472010684\n     *    )\n     * )\n     * ```\n     */\n    public function queryProcessResult($taskIds)\n    {\n        $video = new Api\\Pretreat($this->config);\n        return $video->query($taskIds, '/result/');\n    }\n\n    /**\n     * 多个 m3u8 文件拼接\n     * @param array $files  保存在又拍云云存储中的多个 m3u8 文件路径\n     * @param string $saveAs 拼接生成的新 m3u8 文件保存路径\n     *\n     * @return array 见 [m3u8 拼接 - 响应](http://docs.upyun.com/cloud/sync_video/#_3)\n     */\n    public function m3u8Concat($files, $saveAs)\n    {\n        $p = new Api\\SyncVideo($this->config);\n        return $p->process([\n            'm3u8s' => $files,\n            'save_as' => $saveAs,\n        ], '/m3u8er/concat');\n    }\n\n    /**\n     * 单个 m3u8 文件剪辑\n     * @param string $file 需要剪辑的又拍云云存储中的 m3u8 文件路径\n     * @param string $saveAs 剪辑完成后新的 m3u8 文件保存路径\n     * @param array $slice 需要被保留或删除的片段。\n     * @param bool $isInclude 默认为 `true` 表示 `$slice` 参数描述的片段被保留，否则表示 `$slice` 参数描述的片段被删除\n     * @param bool $index 指定 `$slice` 参数的格式，默认为 `false` 表示使用时间范围描述片段，单位秒：`[<开始时间>, <结束时间>]`；`true` 表示使用 `m3u8` 文件的分片序号，从 0 开始，这种方式可以一次对多个片段操作\n     *\n     * @return array 见 [m3u8 剪辑 - 响应](http://docs.upyun.com/cloud/sync_video/#_6)\n     */\n    public function m3u8Clip($file, $saveAs, $slice = array(), $isInclude = true, $index = false)\n    {\n        $p = new Api\\SyncVideo($this->config);\n        $params = [\n            'm3u8' => $file,\n            'save_as' => $saveAs,\n            'index' => $index,\n        ];\n        if ($isInclude) {\n            $params['include'] = $slice;\n        } else {\n            $params['exclude'] = $slice;\n        }\n        return $p->process($params, '/m3u8er/clip');\n    }\n\n    /**\n     * 获取单个 m3u8 文件描述信息\n     * @param string $file 又拍云云存储的中的 m3u8 文件路径\n     *\n     * @return array 见 [获取 m3u8 信息 - 响应](http://docs.upyun.com/cloud/sync_video/#_6)\n     */\n    public function m3u8Meta($file)\n    {\n        $p = new Api\\SyncVideo($this->config);\n        return $p->process([\n            'm3u8' => $file,\n        ], '/m3u8er/get_meta');\n    }\n\n    /**\n     * 视频截图，可以对 mp4、m3u8 等视频文件进行截图\n     * @param string $file 需要截图的又拍云云存储中的视频文件路径\n     * @param string $saveAs 截图保存路径\n     * @param string $point 截图时间点，`HH:MM:SS` 格式\n     * @param string $size 截图尺寸 `宽x高` 格式的字符串。默认和视频尺寸一致\n     * @param string $format 截图保存的格式，默认根据 `$saveAs` 参数的后缀生成，可以指定 `jpg | png | webp` 三种格式\n     *\n     * @return array 见 [视频截图 - 响应](http://docs.upyun.com/cloud/sync_video/#m3u8_2)\n     */\n    public function snapshot($file, $saveAs, $point, $size = '', $format = '')\n    {\n        $p = new Api\\SyncVideo($this->config);\n        $params = [\n            'source' => $file,\n            'save_as' => $saveAs,\n            'point' => $point,\n        ];\n        if ($size) {\n            $params['size'] = $size;\n        }\n        if ($format) {\n            $params['format'] = $format;\n        }\n        return $p->process($params, '/snapshot');\n    }\n\n    /**\n     * 获取音视频文件元信息\n     * @param string $file 又拍云云存储的中的音视频文件路径\n     *\n     * @return array 见 [获取音视频文件信息 - 响应](http://docs.upyun.com/cloud/sync_video/#_16)\n     */\n    public function avMeta($file)\n    {\n        $p = new Api\\SyncVideo($this->config);\n        return $p->process([\n            'source' => $file,\n        ], '/avmeta/get_meta');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/src/Upyun/Util.php",
    "content": "<?php\nnamespace Upyun;\n\nclass Util\n{\n    public static function trim($str)\n    {\n        if (is_array($str)) {\n            return array_map(array('Util', 'trim'), $str);\n        } else {\n            return trim($str);\n        }\n    }\n\n    public static function getHeaderParams($headers, $otherParams = array())\n    {\n        $params = [];\n        $otherParams = array_map('strtolower', $otherParams);\n        foreach ($headers as $header => $value) {\n            $header = strtolower($header);\n            if (strpos($header, 'x-upyun-') !== false) {\n                $params[$header] = $value[0];\n            } else if (in_array($header, $otherParams)) {\n                $params[$header] = $value[0];\n            }\n        }\n        return $params;\n    }\n\n    public static function parseDir($body)\n    {\n        $files = array();\n        if (!$body) {\n            return array();\n        }\n\n        $lines = explode(\"\\n\", $body);\n        foreach ($lines as $line) {\n            $file = [];\n            list($file['name'], $file['type'], $file['size'], $file['time']) = explode(\"\\t\", $line, 4);\n            $files[] = $file;\n        }\n\n        return $files;\n    }\n\n    public static function base64Json($params)\n    {\n        return base64_encode(json_encode($params, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));\n    }\n\n    public static function stringifyHeaders($headers)\n    {\n        $return = array();\n        foreach ($headers as $key => $value) {\n            $return[] = \"$key: $value\";\n        }\n        return $return;\n    }\n\n    public static function md5Hash($resource)\n    {\n        rewind($resource);\n        $ctx = hash_init('md5');\n        hash_update_stream($ctx, $resource);\n        $md5 = hash_final($ctx);\n        return $md5;\n    }\n\n    /**\n     * GuzzleHttp\\Psr\\Uri use `parse_url`，not good for utf-8,\n     * So should `encodeURI` first, before `new Psr7\\Request`\n     * @see http://stackoverflow.com/questions/4929584/encodeuri-in-php\n     */\n    public static function encodeURI($url)\n    {\n        $unescaped = array(\n            '%2D'=>'-','%5F'=>'_','%2E'=>'.','%21'=>'!', '%7E'=>'~',\n            '%2A'=>'*', '%27'=>\"'\", '%28'=>'(', '%29'=>')'\n        );\n        $reserved = array(\n            '%3B'=>';','%2C'=>',','%2F'=>'/','%3F'=>'?','%3A'=>':',\n            '%40'=>'@','%26'=>'&','%3D'=>'=','%2B'=>'+','%24'=>'$'\n        );\n        $score = array(\n            '%23'=>'#'\n        );\n        return strtr(rawurlencode($url), array_merge($reserved, $unescaped, $score));\n    }\n\n    public static function isSuccess($code)\n    {\n        return $code >= 200 && $code < 300;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/autoload.php",
    "content": "<?php\n\n// autoload.php @generated by Composer\n\nrequire_once __DIR__ . '/composer/autoload_real.php';\n\nreturn ComposerAutoloaderInitca3246bd34aef60b57a2fdabc131a50c::getLoader();\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/composer/ClassLoader.php",
    "content": "<?php\n\n/*\n * This file is part of Composer.\n *\n * (c) Nils Adermann <naderman@naderman.de>\n *     Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Composer\\Autoload;\n\n/**\n * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.\n *\n *     $loader = new \\Composer\\Autoload\\ClassLoader();\n *\n *     // register classes with namespaces\n *     $loader->add('Symfony\\Component', __DIR__.'/component');\n *     $loader->add('Symfony',           __DIR__.'/framework');\n *\n *     // activate the autoloader\n *     $loader->register();\n *\n *     // to enable searching the include path (eg. for PEAR packages)\n *     $loader->setUseIncludePath(true);\n *\n * In this example, if you try to use a class in the Symfony\\Component\n * namespace or one of its children (Symfony\\Component\\Console for instance),\n * the autoloader will first look for the class under the component/\n * directory, and it will then fallback to the framework/ directory if not\n * found before giving up.\n *\n * This class is loosely based on the Symfony UniversalClassLoader.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @see    http://www.php-fig.org/psr/psr-0/\n * @see    http://www.php-fig.org/psr/psr-4/\n */\nclass ClassLoader\n{\n    // PSR-4\n    private $prefixLengthsPsr4 = array();\n    private $prefixDirsPsr4 = array();\n    private $fallbackDirsPsr4 = array();\n\n    // PSR-0\n    private $prefixesPsr0 = array();\n    private $fallbackDirsPsr0 = array();\n\n    private $useIncludePath = false;\n    private $classMap = array();\n    private $classMapAuthoritative = false;\n    private $missingClasses = array();\n    private $apcuPrefix;\n\n    public function getPrefixes()\n    {\n        if (!empty($this->prefixesPsr0)) {\n            return call_user_func_array('array_merge', $this->prefixesPsr0);\n        }\n\n        return array();\n    }\n\n    public function getPrefixesPsr4()\n    {\n        return $this->prefixDirsPsr4;\n    }\n\n    public function getFallbackDirs()\n    {\n        return $this->fallbackDirsPsr0;\n    }\n\n    public function getFallbackDirsPsr4()\n    {\n        return $this->fallbackDirsPsr4;\n    }\n\n    public function getClassMap()\n    {\n        return $this->classMap;\n    }\n\n    /**\n     * @param array $classMap Class to filename map\n     */\n    public function addClassMap(array $classMap)\n    {\n        if ($this->classMap) {\n            $this->classMap = array_merge($this->classMap, $classMap);\n        } else {\n            $this->classMap = $classMap;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix, either\n     * appending or prepending to the ones previously set for this prefix.\n     *\n     * @param string       $prefix  The prefix\n     * @param array|string $paths   The PSR-0 root directories\n     * @param bool         $prepend Whether to prepend the directories\n     */\n    public function add($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            if ($prepend) {\n                $this->fallbackDirsPsr0 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr0\n                );\n            } else {\n                $this->fallbackDirsPsr0 = array_merge(\n                    $this->fallbackDirsPsr0,\n                    (array) $paths\n                );\n            }\n\n            return;\n        }\n\n        $first = $prefix[0];\n        if (!isset($this->prefixesPsr0[$first][$prefix])) {\n            $this->prefixesPsr0[$first][$prefix] = (array) $paths;\n\n            return;\n        }\n        if ($prepend) {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixesPsr0[$first][$prefix]\n            );\n        } else {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                $this->prefixesPsr0[$first][$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace, either\n     * appending or prepending to the ones previously set for this namespace.\n     *\n     * @param string       $prefix  The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths   The PSR-4 base directories\n     * @param bool         $prepend Whether to prepend the directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function addPsr4($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            // Register directories for the root namespace.\n            if ($prepend) {\n                $this->fallbackDirsPsr4 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr4\n                );\n            } else {\n                $this->fallbackDirsPsr4 = array_merge(\n                    $this->fallbackDirsPsr4,\n                    (array) $paths\n                );\n            }\n        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {\n            // Register directories for a new namespace.\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        } elseif ($prepend) {\n            // Prepend directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixDirsPsr4[$prefix]\n            );\n        } else {\n            // Append directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                $this->prefixDirsPsr4[$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix,\n     * replacing any others previously set for this prefix.\n     *\n     * @param string       $prefix The prefix\n     * @param array|string $paths  The PSR-0 base directories\n     */\n    public function set($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr0 = (array) $paths;\n        } else {\n            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace,\n     * replacing any others previously set for this namespace.\n     *\n     * @param string       $prefix The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths  The PSR-4 base directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function setPsr4($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr4 = (array) $paths;\n        } else {\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Turns on searching the include path for class files.\n     *\n     * @param bool $useIncludePath\n     */\n    public function setUseIncludePath($useIncludePath)\n    {\n        $this->useIncludePath = $useIncludePath;\n    }\n\n    /**\n     * Can be used to check if the autoloader uses the include path to check\n     * for classes.\n     *\n     * @return bool\n     */\n    public function getUseIncludePath()\n    {\n        return $this->useIncludePath;\n    }\n\n    /**\n     * Turns off searching the prefix and fallback directories for classes\n     * that have not been registered with the class map.\n     *\n     * @param bool $classMapAuthoritative\n     */\n    public function setClassMapAuthoritative($classMapAuthoritative)\n    {\n        $this->classMapAuthoritative = $classMapAuthoritative;\n    }\n\n    /**\n     * Should class lookup fail if not found in the current class map?\n     *\n     * @return bool\n     */\n    public function isClassMapAuthoritative()\n    {\n        return $this->classMapAuthoritative;\n    }\n\n    /**\n     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.\n     *\n     * @param string|null $apcuPrefix\n     */\n    public function setApcuPrefix($apcuPrefix)\n    {\n        $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;\n    }\n\n    /**\n     * The APCu prefix in use, or null if APCu caching is not enabled.\n     *\n     * @return string|null\n     */\n    public function getApcuPrefix()\n    {\n        return $this->apcuPrefix;\n    }\n\n    /**\n     * Registers this instance as an autoloader.\n     *\n     * @param bool $prepend Whether to prepend the autoloader or not\n     */\n    public function register($prepend = false)\n    {\n        spl_autoload_register(array($this, 'loadClass'), true, $prepend);\n    }\n\n    /**\n     * Unregisters this instance as an autoloader.\n     */\n    public function unregister()\n    {\n        spl_autoload_unregister(array($this, 'loadClass'));\n    }\n\n    /**\n     * Loads the given class or interface.\n     *\n     * @param  string    $class The name of the class\n     * @return bool|null True if loaded, null otherwise\n     */\n    public function loadClass($class)\n    {\n        if ($file = $this->findFile($class)) {\n            includeFile($file);\n\n            return true;\n        }\n    }\n\n    /**\n     * Finds the path to the file where the class is defined.\n     *\n     * @param string $class The name of the class\n     *\n     * @return string|false The path if found, false otherwise\n     */\n    public function findFile($class)\n    {\n        // class map lookup\n        if (isset($this->classMap[$class])) {\n            return $this->classMap[$class];\n        }\n        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {\n            return false;\n        }\n        if (null !== $this->apcuPrefix) {\n            $file = apcu_fetch($this->apcuPrefix.$class, $hit);\n            if ($hit) {\n                return $file;\n            }\n        }\n\n        $file = $this->findFileWithExtension($class, '.php');\n\n        // Search for Hack files if we are running on HHVM\n        if (false === $file && defined('HHVM_VERSION')) {\n            $file = $this->findFileWithExtension($class, '.hh');\n        }\n\n        if (null !== $this->apcuPrefix) {\n            apcu_add($this->apcuPrefix.$class, $file);\n        }\n\n        if (false === $file) {\n            // Remember that this class does not exist.\n            $this->missingClasses[$class] = true;\n        }\n\n        return $file;\n    }\n\n    private function findFileWithExtension($class, $ext)\n    {\n        // PSR-4 lookup\n        $logicalPathPsr4 = strtr($class, '\\\\', DIRECTORY_SEPARATOR) . $ext;\n\n        $first = $class[0];\n        if (isset($this->prefixLengthsPsr4[$first])) {\n            $subPath = $class;\n            while (false !== $lastPos = strrpos($subPath, '\\\\')) {\n                $subPath = substr($subPath, 0, $lastPos);\n                $search = $subPath.'\\\\';\n                if (isset($this->prefixDirsPsr4[$search])) {\n                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);\n                    foreach ($this->prefixDirsPsr4[$search] as $dir) {\n                        if (file_exists($file = $dir . $pathEnd)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-4 fallback dirs\n        foreach ($this->fallbackDirsPsr4 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 lookup\n        if (false !== $pos = strrpos($class, '\\\\')) {\n            // namespaced class name\n            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)\n                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);\n        } else {\n            // PEAR-like class name\n            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;\n        }\n\n        if (isset($this->prefixesPsr0[$first])) {\n            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {\n                if (0 === strpos($class, $prefix)) {\n                    foreach ($dirs as $dir) {\n                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-0 fallback dirs\n        foreach ($this->fallbackDirsPsr0 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 include paths.\n        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {\n            return $file;\n        }\n\n        return false;\n    }\n}\n\n/**\n * Scope isolated include.\n *\n * Prevents access to $this/self from included files.\n */\nfunction includeFile($file)\n{\n    include $file;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/composer/LICENSE",
    "content": "\nCopyright (c) Nils Adermann, Jordi Boggiano\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/composer/autoload_classmap.php",
    "content": "<?php\n\n// autoload_classmap.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'GuzzleHttp\\\\Client' => $vendorDir . '/guzzlehttp/guzzle/src/Client.php',\n    'GuzzleHttp\\\\ClientInterface' => $vendorDir . '/guzzlehttp/guzzle/src/ClientInterface.php',\n    'GuzzleHttp\\\\Cookie\\\\CookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php',\n    'GuzzleHttp\\\\Cookie\\\\CookieJarInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php',\n    'GuzzleHttp\\\\Cookie\\\\FileCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php',\n    'GuzzleHttp\\\\Cookie\\\\SessionCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php',\n    'GuzzleHttp\\\\Cookie\\\\SetCookie' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php',\n    'GuzzleHttp\\\\Exception\\\\BadResponseException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php',\n    'GuzzleHttp\\\\Exception\\\\ClientException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ClientException.php',\n    'GuzzleHttp\\\\Exception\\\\ConnectException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ConnectException.php',\n    'GuzzleHttp\\\\Exception\\\\GuzzleException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php',\n    'GuzzleHttp\\\\Exception\\\\InvalidArgumentException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php',\n    'GuzzleHttp\\\\Exception\\\\RequestException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/RequestException.php',\n    'GuzzleHttp\\\\Exception\\\\SeekException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/SeekException.php',\n    'GuzzleHttp\\\\Exception\\\\ServerException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ServerException.php',\n    'GuzzleHttp\\\\Exception\\\\TooManyRedirectsException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php',\n    'GuzzleHttp\\\\Exception\\\\TransferException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TransferException.php',\n    'GuzzleHttp\\\\HandlerStack' => $vendorDir . '/guzzlehttp/guzzle/src/HandlerStack.php',\n    'GuzzleHttp\\\\Handler\\\\CurlFactory' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php',\n    'GuzzleHttp\\\\Handler\\\\CurlFactoryInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php',\n    'GuzzleHttp\\\\Handler\\\\CurlHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php',\n    'GuzzleHttp\\\\Handler\\\\CurlMultiHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php',\n    'GuzzleHttp\\\\Handler\\\\EasyHandle' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php',\n    'GuzzleHttp\\\\Handler\\\\MockHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/MockHandler.php',\n    'GuzzleHttp\\\\Handler\\\\Proxy' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/Proxy.php',\n    'GuzzleHttp\\\\Handler\\\\StreamHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php',\n    'GuzzleHttp\\\\MessageFormatter' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatter.php',\n    'GuzzleHttp\\\\Middleware' => $vendorDir . '/guzzlehttp/guzzle/src/Middleware.php',\n    'GuzzleHttp\\\\Pool' => $vendorDir . '/guzzlehttp/guzzle/src/Pool.php',\n    'GuzzleHttp\\\\PrepareBodyMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php',\n    'GuzzleHttp\\\\Promise\\\\AggregateException' => $vendorDir . '/guzzlehttp/promises/src/AggregateException.php',\n    'GuzzleHttp\\\\Promise\\\\CancellationException' => $vendorDir . '/guzzlehttp/promises/src/CancellationException.php',\n    'GuzzleHttp\\\\Promise\\\\Coroutine' => $vendorDir . '/guzzlehttp/promises/src/Coroutine.php',\n    'GuzzleHttp\\\\Promise\\\\EachPromise' => $vendorDir . '/guzzlehttp/promises/src/EachPromise.php',\n    'GuzzleHttp\\\\Promise\\\\FulfilledPromise' => $vendorDir . '/guzzlehttp/promises/src/FulfilledPromise.php',\n    'GuzzleHttp\\\\Promise\\\\Promise' => $vendorDir . '/guzzlehttp/promises/src/Promise.php',\n    'GuzzleHttp\\\\Promise\\\\PromiseInterface' => $vendorDir . '/guzzlehttp/promises/src/PromiseInterface.php',\n    'GuzzleHttp\\\\Promise\\\\PromisorInterface' => $vendorDir . '/guzzlehttp/promises/src/PromisorInterface.php',\n    'GuzzleHttp\\\\Promise\\\\RejectedPromise' => $vendorDir . '/guzzlehttp/promises/src/RejectedPromise.php',\n    'GuzzleHttp\\\\Promise\\\\RejectionException' => $vendorDir . '/guzzlehttp/promises/src/RejectionException.php',\n    'GuzzleHttp\\\\Promise\\\\TaskQueue' => $vendorDir . '/guzzlehttp/promises/src/TaskQueue.php',\n    'GuzzleHttp\\\\Promise\\\\TaskQueueInterface' => $vendorDir . '/guzzlehttp/promises/src/TaskQueueInterface.php',\n    'GuzzleHttp\\\\Psr7\\\\AppendStream' => $vendorDir . '/guzzlehttp/psr7/src/AppendStream.php',\n    'GuzzleHttp\\\\Psr7\\\\BufferStream' => $vendorDir . '/guzzlehttp/psr7/src/BufferStream.php',\n    'GuzzleHttp\\\\Psr7\\\\CachingStream' => $vendorDir . '/guzzlehttp/psr7/src/CachingStream.php',\n    'GuzzleHttp\\\\Psr7\\\\DroppingStream' => $vendorDir . '/guzzlehttp/psr7/src/DroppingStream.php',\n    'GuzzleHttp\\\\Psr7\\\\FnStream' => $vendorDir . '/guzzlehttp/psr7/src/FnStream.php',\n    'GuzzleHttp\\\\Psr7\\\\InflateStream' => $vendorDir . '/guzzlehttp/psr7/src/InflateStream.php',\n    'GuzzleHttp\\\\Psr7\\\\LazyOpenStream' => $vendorDir . '/guzzlehttp/psr7/src/LazyOpenStream.php',\n    'GuzzleHttp\\\\Psr7\\\\LimitStream' => $vendorDir . '/guzzlehttp/psr7/src/LimitStream.php',\n    'GuzzleHttp\\\\Psr7\\\\MessageTrait' => $vendorDir . '/guzzlehttp/psr7/src/MessageTrait.php',\n    'GuzzleHttp\\\\Psr7\\\\MultipartStream' => $vendorDir . '/guzzlehttp/psr7/src/MultipartStream.php',\n    'GuzzleHttp\\\\Psr7\\\\NoSeekStream' => $vendorDir . '/guzzlehttp/psr7/src/NoSeekStream.php',\n    'GuzzleHttp\\\\Psr7\\\\PumpStream' => $vendorDir . '/guzzlehttp/psr7/src/PumpStream.php',\n    'GuzzleHttp\\\\Psr7\\\\Request' => $vendorDir . '/guzzlehttp/psr7/src/Request.php',\n    'GuzzleHttp\\\\Psr7\\\\Response' => $vendorDir . '/guzzlehttp/psr7/src/Response.php',\n    'GuzzleHttp\\\\Psr7\\\\Rfc7230' => $vendorDir . '/guzzlehttp/psr7/src/Rfc7230.php',\n    'GuzzleHttp\\\\Psr7\\\\ServerRequest' => $vendorDir . '/guzzlehttp/psr7/src/ServerRequest.php',\n    'GuzzleHttp\\\\Psr7\\\\Stream' => $vendorDir . '/guzzlehttp/psr7/src/Stream.php',\n    'GuzzleHttp\\\\Psr7\\\\StreamDecoratorTrait' => $vendorDir . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php',\n    'GuzzleHttp\\\\Psr7\\\\StreamWrapper' => $vendorDir . '/guzzlehttp/psr7/src/StreamWrapper.php',\n    'GuzzleHttp\\\\Psr7\\\\UploadedFile' => $vendorDir . '/guzzlehttp/psr7/src/UploadedFile.php',\n    'GuzzleHttp\\\\Psr7\\\\Uri' => $vendorDir . '/guzzlehttp/psr7/src/Uri.php',\n    'GuzzleHttp\\\\Psr7\\\\UriNormalizer' => $vendorDir . '/guzzlehttp/psr7/src/UriNormalizer.php',\n    'GuzzleHttp\\\\Psr7\\\\UriResolver' => $vendorDir . '/guzzlehttp/psr7/src/UriResolver.php',\n    'GuzzleHttp\\\\RedirectMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RedirectMiddleware.php',\n    'GuzzleHttp\\\\RequestOptions' => $vendorDir . '/guzzlehttp/guzzle/src/RequestOptions.php',\n    'GuzzleHttp\\\\RetryMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RetryMiddleware.php',\n    'GuzzleHttp\\\\TransferStats' => $vendorDir . '/guzzlehttp/guzzle/src/TransferStats.php',\n    'GuzzleHttp\\\\UriTemplate' => $vendorDir . '/guzzlehttp/guzzle/src/UriTemplate.php',\n    'GuzzleHttp\\\\Utils' => $vendorDir . '/guzzlehttp/guzzle/src/Utils.php',\n    'Psr\\\\Http\\\\Message\\\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php',\n    'Psr\\\\Http\\\\Message\\\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php',\n    'Psr\\\\Http\\\\Message\\\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php',\n    'Psr\\\\Http\\\\Message\\\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php',\n    'Psr\\\\Http\\\\Message\\\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php',\n    'Psr\\\\Http\\\\Message\\\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php',\n    'Psr\\\\Http\\\\Message\\\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php',\n    'Symfony\\\\Polyfill\\\\Intl\\\\Idn\\\\Idn' => $vendorDir . '/symfony/polyfill-intl-idn/Idn.php',\n    'Symfony\\\\Polyfill\\\\Mbstring\\\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',\n    'Symfony\\\\Polyfill\\\\Php72\\\\Php72' => $vendorDir . '/symfony/polyfill-php72/Php72.php',\n    'Upyun\\\\Api\\\\Form' => $baseDir . '/src/Upyun/Api/Form.php',\n    'Upyun\\\\Api\\\\Pretreat' => $baseDir . '/src/Upyun/Api/Pretreat.php',\n    'Upyun\\\\Api\\\\Rest' => $baseDir . '/src/Upyun/Api/Rest.php',\n    'Upyun\\\\Api\\\\SyncVideo' => $baseDir . '/src/Upyun/Api/SyncVideo.php',\n    'Upyun\\\\Config' => $baseDir . '/src/Upyun/Config.php',\n    'Upyun\\\\Signature' => $baseDir . '/src/Upyun/Signature.php',\n    'Upyun\\\\Uploader' => $baseDir . '/src/Upyun/Uploader.php',\n    'Upyun\\\\Upyun' => $baseDir . '/src/Upyun/Upyun.php',\n    'Upyun\\\\Util' => $baseDir . '/src/Upyun/Util.php',\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/composer/autoload_files.php",
    "content": "<?php\n\n// autoload_files.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',\n    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',\n    '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',\n    'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',\n    'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',\n    'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',\n    '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/composer/autoload_namespaces.php",
    "content": "<?php\n\n// autoload_namespaces.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/composer/autoload_psr4.php",
    "content": "<?php\n\n// autoload_psr4.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'Upyun\\\\Tests\\\\' => array($baseDir . '/tests'),\n    'Upyun\\\\' => array($baseDir . '/src/Upyun'),\n    'Symfony\\\\Polyfill\\\\Php72\\\\' => array($vendorDir . '/symfony/polyfill-php72'),\n    'Symfony\\\\Polyfill\\\\Mbstring\\\\' => array($vendorDir . '/symfony/polyfill-mbstring'),\n    'Symfony\\\\Polyfill\\\\Intl\\\\Idn\\\\' => array($vendorDir . '/symfony/polyfill-intl-idn'),\n    'Psr\\\\Http\\\\Message\\\\' => array($vendorDir . '/psr/http-message/src'),\n    'GuzzleHttp\\\\Psr7\\\\' => array($vendorDir . '/guzzlehttp/psr7/src'),\n    'GuzzleHttp\\\\Promise\\\\' => array($vendorDir . '/guzzlehttp/promises/src'),\n    'GuzzleHttp\\\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),\n);\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/composer/autoload_real.php",
    "content": "<?php\n\n// autoload_real.php @generated by Composer\n\nclass ComposerAutoloaderInitca3246bd34aef60b57a2fdabc131a50c\n{\n    private static $loader;\n\n    public static function loadClassLoader($class)\n    {\n        if ('Composer\\Autoload\\ClassLoader' === $class) {\n            require __DIR__ . '/ClassLoader.php';\n        }\n    }\n\n    public static function getLoader()\n    {\n        if (null !== self::$loader) {\n            return self::$loader;\n        }\n\n        spl_autoload_register(array('ComposerAutoloaderInitca3246bd34aef60b57a2fdabc131a50c', 'loadClassLoader'), true, true);\n        self::$loader = $loader = new \\Composer\\Autoload\\ClassLoader();\n        spl_autoload_unregister(array('ComposerAutoloaderInitca3246bd34aef60b57a2fdabc131a50c', 'loadClassLoader'));\n\n        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());\n        if ($useStaticLoader) {\n            require_once __DIR__ . '/autoload_static.php';\n\n            call_user_func(\\Composer\\Autoload\\ComposerStaticInitca3246bd34aef60b57a2fdabc131a50c::getInitializer($loader));\n        } else {\n            $map = require __DIR__ . '/autoload_namespaces.php';\n            foreach ($map as $namespace => $path) {\n                $loader->set($namespace, $path);\n            }\n\n            $map = require __DIR__ . '/autoload_psr4.php';\n            foreach ($map as $namespace => $path) {\n                $loader->setPsr4($namespace, $path);\n            }\n\n            $classMap = require __DIR__ . '/autoload_classmap.php';\n            if ($classMap) {\n                $loader->addClassMap($classMap);\n            }\n        }\n\n        $loader->register(true);\n\n        if ($useStaticLoader) {\n            $includeFiles = Composer\\Autoload\\ComposerStaticInitca3246bd34aef60b57a2fdabc131a50c::$files;\n        } else {\n            $includeFiles = require __DIR__ . '/autoload_files.php';\n        }\n        foreach ($includeFiles as $fileIdentifier => $file) {\n            composerRequireca3246bd34aef60b57a2fdabc131a50c($fileIdentifier, $file);\n        }\n\n        return $loader;\n    }\n}\n\nfunction composerRequireca3246bd34aef60b57a2fdabc131a50c($fileIdentifier, $file)\n{\n    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {\n        require $file;\n\n        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/composer/autoload_static.php",
    "content": "<?php\n\n// autoload_static.php @generated by Composer\n\nnamespace Composer\\Autoload;\n\nclass ComposerStaticInitca3246bd34aef60b57a2fdabc131a50c\n{\n    public static $files = array (\n        '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',\n        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',\n        '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',\n        'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',\n        'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',\n        'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',\n        '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',\n    );\n\n    public static $prefixLengthsPsr4 = array (\n        'U' => \n        array (\n            'Upyun\\\\Tests\\\\' => 12,\n            'Upyun\\\\' => 6,\n        ),\n        'S' => \n        array (\n            'Symfony\\\\Polyfill\\\\Php72\\\\' => 23,\n            'Symfony\\\\Polyfill\\\\Mbstring\\\\' => 26,\n            'Symfony\\\\Polyfill\\\\Intl\\\\Idn\\\\' => 26,\n        ),\n        'P' => \n        array (\n            'Psr\\\\Http\\\\Message\\\\' => 17,\n        ),\n        'G' => \n        array (\n            'GuzzleHttp\\\\Psr7\\\\' => 16,\n            'GuzzleHttp\\\\Promise\\\\' => 19,\n            'GuzzleHttp\\\\' => 11,\n        ),\n    );\n\n    public static $prefixDirsPsr4 = array (\n        'Upyun\\\\Tests\\\\' => \n        array (\n            0 => __DIR__ . '/../..' . '/tests',\n        ),\n        'Upyun\\\\' => \n        array (\n            0 => __DIR__ . '/../..' . '/src/Upyun',\n        ),\n        'Symfony\\\\Polyfill\\\\Php72\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/polyfill-php72',\n        ),\n        'Symfony\\\\Polyfill\\\\Mbstring\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',\n        ),\n        'Symfony\\\\Polyfill\\\\Intl\\\\Idn\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn',\n        ),\n        'Psr\\\\Http\\\\Message\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/psr/http-message/src',\n        ),\n        'GuzzleHttp\\\\Psr7\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',\n        ),\n        'GuzzleHttp\\\\Promise\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/guzzlehttp/promises/src',\n        ),\n        'GuzzleHttp\\\\' => \n        array (\n            0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',\n        ),\n    );\n\n    public static $classMap = array (\n        'GuzzleHttp\\\\Client' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Client.php',\n        'GuzzleHttp\\\\ClientInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/ClientInterface.php',\n        'GuzzleHttp\\\\Cookie\\\\CookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php',\n        'GuzzleHttp\\\\Cookie\\\\CookieJarInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php',\n        'GuzzleHttp\\\\Cookie\\\\FileCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php',\n        'GuzzleHttp\\\\Cookie\\\\SessionCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php',\n        'GuzzleHttp\\\\Cookie\\\\SetCookie' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php',\n        'GuzzleHttp\\\\Exception\\\\BadResponseException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php',\n        'GuzzleHttp\\\\Exception\\\\ClientException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ClientException.php',\n        'GuzzleHttp\\\\Exception\\\\ConnectException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ConnectException.php',\n        'GuzzleHttp\\\\Exception\\\\GuzzleException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php',\n        'GuzzleHttp\\\\Exception\\\\InvalidArgumentException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php',\n        'GuzzleHttp\\\\Exception\\\\RequestException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/RequestException.php',\n        'GuzzleHttp\\\\Exception\\\\SeekException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/SeekException.php',\n        'GuzzleHttp\\\\Exception\\\\ServerException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ServerException.php',\n        'GuzzleHttp\\\\Exception\\\\TooManyRedirectsException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php',\n        'GuzzleHttp\\\\Exception\\\\TransferException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TransferException.php',\n        'GuzzleHttp\\\\HandlerStack' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/HandlerStack.php',\n        'GuzzleHttp\\\\Handler\\\\CurlFactory' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php',\n        'GuzzleHttp\\\\Handler\\\\CurlFactoryInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php',\n        'GuzzleHttp\\\\Handler\\\\CurlHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php',\n        'GuzzleHttp\\\\Handler\\\\CurlMultiHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php',\n        'GuzzleHttp\\\\Handler\\\\EasyHandle' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php',\n        'GuzzleHttp\\\\Handler\\\\MockHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/MockHandler.php',\n        'GuzzleHttp\\\\Handler\\\\Proxy' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/Proxy.php',\n        'GuzzleHttp\\\\Handler\\\\StreamHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php',\n        'GuzzleHttp\\\\MessageFormatter' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatter.php',\n        'GuzzleHttp\\\\Middleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Middleware.php',\n        'GuzzleHttp\\\\Pool' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Pool.php',\n        'GuzzleHttp\\\\PrepareBodyMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php',\n        'GuzzleHttp\\\\Promise\\\\AggregateException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/AggregateException.php',\n        'GuzzleHttp\\\\Promise\\\\CancellationException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/CancellationException.php',\n        'GuzzleHttp\\\\Promise\\\\Coroutine' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Coroutine.php',\n        'GuzzleHttp\\\\Promise\\\\EachPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/EachPromise.php',\n        'GuzzleHttp\\\\Promise\\\\FulfilledPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/FulfilledPromise.php',\n        'GuzzleHttp\\\\Promise\\\\Promise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Promise.php',\n        'GuzzleHttp\\\\Promise\\\\PromiseInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromiseInterface.php',\n        'GuzzleHttp\\\\Promise\\\\PromisorInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromisorInterface.php',\n        'GuzzleHttp\\\\Promise\\\\RejectedPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectedPromise.php',\n        'GuzzleHttp\\\\Promise\\\\RejectionException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectionException.php',\n        'GuzzleHttp\\\\Promise\\\\TaskQueue' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueue.php',\n        'GuzzleHttp\\\\Promise\\\\TaskQueueInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueueInterface.php',\n        'GuzzleHttp\\\\Psr7\\\\AppendStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/AppendStream.php',\n        'GuzzleHttp\\\\Psr7\\\\BufferStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/BufferStream.php',\n        'GuzzleHttp\\\\Psr7\\\\CachingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/CachingStream.php',\n        'GuzzleHttp\\\\Psr7\\\\DroppingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/DroppingStream.php',\n        'GuzzleHttp\\\\Psr7\\\\FnStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/FnStream.php',\n        'GuzzleHttp\\\\Psr7\\\\InflateStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/InflateStream.php',\n        'GuzzleHttp\\\\Psr7\\\\LazyOpenStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LazyOpenStream.php',\n        'GuzzleHttp\\\\Psr7\\\\LimitStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LimitStream.php',\n        'GuzzleHttp\\\\Psr7\\\\MessageTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MessageTrait.php',\n        'GuzzleHttp\\\\Psr7\\\\MultipartStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MultipartStream.php',\n        'GuzzleHttp\\\\Psr7\\\\NoSeekStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/NoSeekStream.php',\n        'GuzzleHttp\\\\Psr7\\\\PumpStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/PumpStream.php',\n        'GuzzleHttp\\\\Psr7\\\\Request' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Request.php',\n        'GuzzleHttp\\\\Psr7\\\\Response' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Response.php',\n        'GuzzleHttp\\\\Psr7\\\\Rfc7230' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Rfc7230.php',\n        'GuzzleHttp\\\\Psr7\\\\ServerRequest' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/ServerRequest.php',\n        'GuzzleHttp\\\\Psr7\\\\Stream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Stream.php',\n        'GuzzleHttp\\\\Psr7\\\\StreamDecoratorTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php',\n        'GuzzleHttp\\\\Psr7\\\\StreamWrapper' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamWrapper.php',\n        'GuzzleHttp\\\\Psr7\\\\UploadedFile' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UploadedFile.php',\n        'GuzzleHttp\\\\Psr7\\\\Uri' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Uri.php',\n        'GuzzleHttp\\\\Psr7\\\\UriNormalizer' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriNormalizer.php',\n        'GuzzleHttp\\\\Psr7\\\\UriResolver' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriResolver.php',\n        'GuzzleHttp\\\\RedirectMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RedirectMiddleware.php',\n        'GuzzleHttp\\\\RequestOptions' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RequestOptions.php',\n        'GuzzleHttp\\\\RetryMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RetryMiddleware.php',\n        'GuzzleHttp\\\\TransferStats' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/TransferStats.php',\n        'GuzzleHttp\\\\UriTemplate' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/UriTemplate.php',\n        'GuzzleHttp\\\\Utils' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Utils.php',\n        'Psr\\\\Http\\\\Message\\\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php',\n        'Psr\\\\Http\\\\Message\\\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php',\n        'Psr\\\\Http\\\\Message\\\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php',\n        'Psr\\\\Http\\\\Message\\\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php',\n        'Psr\\\\Http\\\\Message\\\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php',\n        'Psr\\\\Http\\\\Message\\\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php',\n        'Psr\\\\Http\\\\Message\\\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php',\n        'Symfony\\\\Polyfill\\\\Intl\\\\Idn\\\\Idn' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Idn.php',\n        'Symfony\\\\Polyfill\\\\Mbstring\\\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',\n        'Symfony\\\\Polyfill\\\\Php72\\\\Php72' => __DIR__ . '/..' . '/symfony/polyfill-php72/Php72.php',\n        'Upyun\\\\Api\\\\Form' => __DIR__ . '/../..' . '/src/Upyun/Api/Form.php',\n        'Upyun\\\\Api\\\\Pretreat' => __DIR__ . '/../..' . '/src/Upyun/Api/Pretreat.php',\n        'Upyun\\\\Api\\\\Rest' => __DIR__ . '/../..' . '/src/Upyun/Api/Rest.php',\n        'Upyun\\\\Api\\\\SyncVideo' => __DIR__ . '/../..' . '/src/Upyun/Api/SyncVideo.php',\n        'Upyun\\\\Config' => __DIR__ . '/../..' . '/src/Upyun/Config.php',\n        'Upyun\\\\Signature' => __DIR__ . '/../..' . '/src/Upyun/Signature.php',\n        'Upyun\\\\Uploader' => __DIR__ . '/../..' . '/src/Upyun/Uploader.php',\n        'Upyun\\\\Upyun' => __DIR__ . '/../..' . '/src/Upyun/Upyun.php',\n        'Upyun\\\\Util' => __DIR__ . '/../..' . '/src/Upyun/Util.php',\n    );\n\n    public static function getInitializer(ClassLoader $loader)\n    {\n        return \\Closure::bind(function () use ($loader) {\n            $loader->prefixLengthsPsr4 = ComposerStaticInitca3246bd34aef60b57a2fdabc131a50c::$prefixLengthsPsr4;\n            $loader->prefixDirsPsr4 = ComposerStaticInitca3246bd34aef60b57a2fdabc131a50c::$prefixDirsPsr4;\n            $loader->classMap = ComposerStaticInitca3246bd34aef60b57a2fdabc131a50c::$classMap;\n\n        }, null, ClassLoader::class);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/composer/installed.json",
    "content": "[\n    {\n        \"name\": \"guzzlehttp/guzzle\",\n        \"version\": \"6.5.5\",\n        \"version_normalized\": \"6.5.5.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/guzzle/guzzle.git\",\n            \"reference\": \"9d4290de1cfd701f38099ef7e183b64b4b7b0c5e\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e\",\n            \"reference\": \"9d4290de1cfd701f38099ef7e183b64b4b7b0c5e\",\n            \"shasum\": \"\",\n            \"mirrors\": [\n                {\n                    \"url\": \"https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%\",\n                    \"preferred\": true\n                }\n            ]\n        },\n        \"require\": {\n            \"ext-json\": \"*\",\n            \"guzzlehttp/promises\": \"^1.0\",\n            \"guzzlehttp/psr7\": \"^1.6.1\",\n            \"php\": \">=5.5\",\n            \"symfony/polyfill-intl-idn\": \"^1.17.0\"\n        },\n        \"require-dev\": {\n            \"ext-curl\": \"*\",\n            \"phpunit/phpunit\": \"^4.8.35 || ^5.7 || ^6.4 || ^7.0\",\n            \"psr/log\": \"^1.1\"\n        },\n        \"suggest\": {\n            \"psr/log\": \"Required for using the Log middleware\"\n        },\n        \"time\": \"2020-06-16T21:01:06+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"6.5-dev\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"GuzzleHttp\\\\\": \"src/\"\n            },\n            \"files\": [\n                \"src/functions_include.php\"\n            ]\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"Michael Dowling\",\n                \"email\": \"mtdowling@gmail.com\",\n                \"homepage\": \"https://github.com/mtdowling\"\n            }\n        ],\n        \"description\": \"Guzzle is a PHP HTTP client library\",\n        \"homepage\": \"http://guzzlephp.org/\",\n        \"keywords\": [\n            \"client\",\n            \"curl\",\n            \"framework\",\n            \"http\",\n            \"http client\",\n            \"rest\",\n            \"web service\"\n        ]\n    },\n    {\n        \"name\": \"guzzlehttp/promises\",\n        \"version\": \"v1.3.1\",\n        \"version_normalized\": \"1.3.1.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/guzzle/promises.git\",\n            \"reference\": \"a59da6cf61d80060647ff4d3eb2c03a2bc694646\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646\",\n            \"reference\": \"a59da6cf61d80060647ff4d3eb2c03a2bc694646\",\n            \"shasum\": \"\",\n            \"mirrors\": [\n                {\n                    \"url\": \"https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%\",\n                    \"preferred\": true\n                }\n            ]\n        },\n        \"require\": {\n            \"php\": \">=5.5.0\"\n        },\n        \"require-dev\": {\n            \"phpunit/phpunit\": \"^4.0\"\n        },\n        \"time\": \"2016-12-20T10:07:11+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"1.4-dev\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"GuzzleHttp\\\\Promise\\\\\": \"src/\"\n            },\n            \"files\": [\n                \"src/functions_include.php\"\n            ]\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"Michael Dowling\",\n                \"email\": \"mtdowling@gmail.com\",\n                \"homepage\": \"https://github.com/mtdowling\"\n            }\n        ],\n        \"description\": \"Guzzle promises library\",\n        \"keywords\": [\n            \"promise\"\n        ]\n    },\n    {\n        \"name\": \"guzzlehttp/psr7\",\n        \"version\": \"1.6.1\",\n        \"version_normalized\": \"1.6.1.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/guzzle/psr7.git\",\n            \"reference\": \"239400de7a173fe9901b9ac7c06497751f00727a\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a\",\n            \"reference\": \"239400de7a173fe9901b9ac7c06497751f00727a\",\n            \"shasum\": \"\",\n            \"mirrors\": [\n                {\n                    \"url\": \"https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%\",\n                    \"preferred\": true\n                }\n            ]\n        },\n        \"require\": {\n            \"php\": \">=5.4.0\",\n            \"psr/http-message\": \"~1.0\",\n            \"ralouphie/getallheaders\": \"^2.0.5 || ^3.0.0\"\n        },\n        \"provide\": {\n            \"psr/http-message-implementation\": \"1.0\"\n        },\n        \"require-dev\": {\n            \"ext-zlib\": \"*\",\n            \"phpunit/phpunit\": \"~4.8.36 || ^5.7.27 || ^6.5.8\"\n        },\n        \"suggest\": {\n            \"zendframework/zend-httphandlerrunner\": \"Emit PSR-7 responses\"\n        },\n        \"time\": \"2019-07-01T23:21:34+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"1.6-dev\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"GuzzleHttp\\\\Psr7\\\\\": \"src/\"\n            },\n            \"files\": [\n                \"src/functions_include.php\"\n            ]\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"Michael Dowling\",\n                \"email\": \"mtdowling@gmail.com\",\n                \"homepage\": \"https://github.com/mtdowling\"\n            },\n            {\n                \"name\": \"Tobias Schultze\",\n                \"homepage\": \"https://github.com/Tobion\"\n            }\n        ],\n        \"description\": \"PSR-7 message implementation that also provides common utility methods\",\n        \"keywords\": [\n            \"http\",\n            \"message\",\n            \"psr-7\",\n            \"request\",\n            \"response\",\n            \"stream\",\n            \"uri\",\n            \"url\"\n        ]\n    },\n    {\n        \"name\": \"psr/http-message\",\n        \"version\": \"1.0.1\",\n        \"version_normalized\": \"1.0.1.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/php-fig/http-message.git\",\n            \"reference\": \"f6561bf28d520154e4b0ec72be95418abe6d9363\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363\",\n            \"reference\": \"f6561bf28d520154e4b0ec72be95418abe6d9363\",\n            \"shasum\": \"\",\n            \"mirrors\": [\n                {\n                    \"url\": \"https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%\",\n                    \"preferred\": true\n                }\n            ]\n        },\n        \"require\": {\n            \"php\": \">=5.3.0\"\n        },\n        \"time\": \"2016-08-06T14:39:51+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"1.0.x-dev\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n            }\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"PHP-FIG\",\n                \"homepage\": \"http://www.php-fig.org/\"\n            }\n        ],\n        \"description\": \"Common interface for HTTP messages\",\n        \"homepage\": \"https://github.com/php-fig/http-message\",\n        \"keywords\": [\n            \"http\",\n            \"http-message\",\n            \"psr\",\n            \"psr-7\",\n            \"request\",\n            \"response\"\n        ]\n    },\n    {\n        \"name\": \"ralouphie/getallheaders\",\n        \"version\": \"3.0.3\",\n        \"version_normalized\": \"3.0.3.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/ralouphie/getallheaders.git\",\n            \"reference\": \"120b605dfeb996808c31b6477290a714d356e822\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822\",\n            \"reference\": \"120b605dfeb996808c31b6477290a714d356e822\",\n            \"shasum\": \"\",\n            \"mirrors\": [\n                {\n                    \"url\": \"https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%\",\n                    \"preferred\": true\n                }\n            ]\n        },\n        \"require\": {\n            \"php\": \">=5.6\"\n        },\n        \"require-dev\": {\n            \"php-coveralls/php-coveralls\": \"^2.1\",\n            \"phpunit/phpunit\": \"^5 || ^6.5\"\n        },\n        \"time\": \"2019-03-08T08:55:37+00:00\",\n        \"type\": \"library\",\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"files\": [\n                \"src/getallheaders.php\"\n            ]\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"Ralph Khattar\",\n                \"email\": \"ralph.khattar@gmail.com\"\n            }\n        ],\n        \"description\": \"A polyfill for getallheaders.\"\n    },\n    {\n        \"name\": \"symfony/polyfill-intl-idn\",\n        \"version\": \"v1.17.1\",\n        \"version_normalized\": \"1.17.1.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/symfony/polyfill-intl-idn.git\",\n            \"reference\": \"a57f8161502549a742a63c09f0a604997bf47027\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a57f8161502549a742a63c09f0a604997bf47027\",\n            \"reference\": \"a57f8161502549a742a63c09f0a604997bf47027\",\n            \"shasum\": \"\",\n            \"mirrors\": [\n                {\n                    \"url\": \"https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%\",\n                    \"preferred\": true\n                }\n            ]\n        },\n        \"require\": {\n            \"php\": \">=5.3.3\",\n            \"symfony/polyfill-mbstring\": \"^1.3\",\n            \"symfony/polyfill-php72\": \"^1.10\"\n        },\n        \"suggest\": {\n            \"ext-intl\": \"For best performance\"\n        },\n        \"time\": \"2020-06-06T08:46:27+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"1.17-dev\"\n            },\n            \"thanks\": {\n                \"name\": \"symfony/polyfill\",\n                \"url\": \"https://github.com/symfony/polyfill\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"Symfony\\\\Polyfill\\\\Intl\\\\Idn\\\\\": \"\"\n            },\n            \"files\": [\n                \"bootstrap.php\"\n            ]\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"Laurent Bassin\",\n                \"email\": \"laurent@bassin.info\"\n            },\n            {\n                \"name\": \"Symfony Community\",\n                \"homepage\": \"https://symfony.com/contributors\"\n            }\n        ],\n        \"description\": \"Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions\",\n        \"homepage\": \"https://symfony.com\",\n        \"keywords\": [\n            \"compatibility\",\n            \"idn\",\n            \"intl\",\n            \"polyfill\",\n            \"portable\",\n            \"shim\"\n        ]\n    },\n    {\n        \"name\": \"symfony/polyfill-mbstring\",\n        \"version\": \"v1.17.1\",\n        \"version_normalized\": \"1.17.1.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/symfony/polyfill-mbstring.git\",\n            \"reference\": \"7110338d81ce1cbc3e273136e4574663627037a7\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7110338d81ce1cbc3e273136e4574663627037a7\",\n            \"reference\": \"7110338d81ce1cbc3e273136e4574663627037a7\",\n            \"shasum\": \"\",\n            \"mirrors\": [\n                {\n                    \"url\": \"https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%\",\n                    \"preferred\": true\n                }\n            ]\n        },\n        \"require\": {\n            \"php\": \">=5.3.3\"\n        },\n        \"suggest\": {\n            \"ext-mbstring\": \"For best performance\"\n        },\n        \"time\": \"2020-06-06T08:46:27+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"1.17-dev\"\n            },\n            \"thanks\": {\n                \"name\": \"symfony/polyfill\",\n                \"url\": \"https://github.com/symfony/polyfill\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"Symfony\\\\Polyfill\\\\Mbstring\\\\\": \"\"\n            },\n            \"files\": [\n                \"bootstrap.php\"\n            ]\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"Nicolas Grekas\",\n                \"email\": \"p@tchwork.com\"\n            },\n            {\n                \"name\": \"Symfony Community\",\n                \"homepage\": \"https://symfony.com/contributors\"\n            }\n        ],\n        \"description\": \"Symfony polyfill for the Mbstring extension\",\n        \"homepage\": \"https://symfony.com\",\n        \"keywords\": [\n            \"compatibility\",\n            \"mbstring\",\n            \"polyfill\",\n            \"portable\",\n            \"shim\"\n        ]\n    },\n    {\n        \"name\": \"symfony/polyfill-php72\",\n        \"version\": \"v1.17.0\",\n        \"version_normalized\": \"1.17.0.0\",\n        \"source\": {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/symfony/polyfill-php72.git\",\n            \"reference\": \"f048e612a3905f34931127360bdd2def19a5e582\"\n        },\n        \"dist\": {\n            \"type\": \"zip\",\n            \"url\": \"https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582\",\n            \"reference\": \"f048e612a3905f34931127360bdd2def19a5e582\",\n            \"shasum\": \"\",\n            \"mirrors\": [\n                {\n                    \"url\": \"https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%\",\n                    \"preferred\": true\n                }\n            ]\n        },\n        \"require\": {\n            \"php\": \">=5.3.3\"\n        },\n        \"time\": \"2020-05-12T16:47:27+00:00\",\n        \"type\": \"library\",\n        \"extra\": {\n            \"branch-alias\": {\n                \"dev-master\": \"1.17-dev\"\n            }\n        },\n        \"installation-source\": \"dist\",\n        \"autoload\": {\n            \"psr-4\": {\n                \"Symfony\\\\Polyfill\\\\Php72\\\\\": \"\"\n            },\n            \"files\": [\n                \"bootstrap.php\"\n            ]\n        },\n        \"notification-url\": \"https://packagist.org/downloads/\",\n        \"license\": [\n            \"MIT\"\n        ],\n        \"authors\": [\n            {\n                \"name\": \"Nicolas Grekas\",\n                \"email\": \"p@tchwork.com\"\n            },\n            {\n                \"name\": \"Symfony Community\",\n                \"homepage\": \"https://symfony.com/contributors\"\n            }\n        ],\n        \"description\": \"Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions\",\n        \"homepage\": \"https://symfony.com\",\n        \"keywords\": [\n            \"compatibility\",\n            \"polyfill\",\n            \"portable\",\n            \"shim\"\n        ]\n    }\n]\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/.php_cs",
    "content": "<?php\n\n$config = PhpCsFixer\\Config::create()\n    ->setRiskyAllowed(true)\n    ->setRules([\n        '@PSR2' => true,\n        'array_syntax' => ['syntax' => 'short'],\n        'declare_strict_types' => false,\n        'concat_space' => ['spacing'=>'one'],\n        'php_unit_test_case_static_method_calls' => ['call_type' => 'self'],\n        'ordered_imports' => true,\n        // 'phpdoc_align' => ['align'=>'vertical'],\n        // 'native_function_invocation' => true,\n    ])\n    ->setFinder(\n        PhpCsFixer\\Finder::create()\n            ->in(__DIR__.'/src')\n            ->in(__DIR__.'/tests')\n            ->name('*.php')\n    )\n;\n\nreturn $config;\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/CHANGELOG.md",
    "content": "# Change Log\n\n## 6.5.5 - 2020-06-16\n\n* Unpin version constraint for `symfony/polyfill-intl-idn` [#2678](https://github.com/guzzle/guzzle/pull/2678)\n\n## 6.5.4 - 2020-05-25\n\n* Fix various intl icu issues [#2626](https://github.com/guzzle/guzzle/pull/2626)\n\n## 6.5.3 - 2020-04-18\n\n* Use Symfony intl-idn polyfill [#2550](https://github.com/guzzle/guzzle/pull/2550)\n* Remove use of internal functions [#2548](https://github.com/guzzle/guzzle/pull/2548)\n\n## 6.5.2 - 2019-12-23\n\n* idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489)\n\n## 6.5.1 - 2019-12-21\n\n* Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454)\n* IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424)\n\n## 6.5.0 - 2019-12-07\n\n* Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143)\n* Improvement: Added support to pass arbitrary options to `curl_multi_init`. [#2287](https://github.com/guzzle/guzzle/pull/2287)\n* Fix: Gracefully handle passing `null` to the `header` option. [#2132](https://github.com/guzzle/guzzle/pull/2132)\n* Fix: `RetryMiddleware` did not do exponential delay between retries due unit mismatch. [#2132](https://github.com/guzzle/guzzle/pull/2132)\n  Previously, `RetryMiddleware` would sleep for 1 millisecond, then 2 milliseconds, then 4 milliseconds.\n  **After this change, `RetryMiddleware` will sleep for 1 second, then 2 seconds, then 4 seconds.**\n  `Middleware::retry()` accepts a second callback parameter to override the default timeouts if needed.\n* Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348)\n* Deprecated `ClientInterface::VERSION`\n\n## 6.4.1 - 2019-10-23\n\n* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that \n* Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar`\n\n## 6.4.0 - 2019-10-23\n\n* Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108)\n* Fix: Test if response is readable before returning a summary in `RequestException::getResponseBodySummary()` [#2081](https://github.com/guzzle/guzzle/pull/2081)\n* Fix: Add support for GUZZLE_CURL_SELECT_TIMEOUT environment variable [#2161](https://github.com/guzzle/guzzle/pull/2161)\n* Improvement: Added `GuzzleHttp\\Exception\\InvalidArgumentException` [#2163](https://github.com/guzzle/guzzle/pull/2163)\n* Improvement: Added `GuzzleHttp\\_current_time()` to use `hrtime()` if that function exists. [#2242](https://github.com/guzzle/guzzle/pull/2242)\n* Improvement: Added curl's `appconnect_time` in `TransferStats` [#2284](https://github.com/guzzle/guzzle/pull/2284)\n* Improvement: Make GuzzleException extend Throwable wherever it's available [#2273](https://github.com/guzzle/guzzle/pull/2273)\n* Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335)\n* Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362)\n\n## 6.3.3 - 2018-04-22\n\n* Fix: Default headers when decode_content is specified\n\n\n## 6.3.2 - 2018-03-26\n\n* Fix: Release process\n\n\n## 6.3.1 - 2018-03-26\n\n* Bug fix: Parsing 0 epoch expiry times in cookies [#2014](https://github.com/guzzle/guzzle/pull/2014)\n* Improvement: Better ConnectException detection [#2012](https://github.com/guzzle/guzzle/pull/2012)\n* Bug fix: Malformed domain that contains a \"/\" [#1999](https://github.com/guzzle/guzzle/pull/1999)\n* Bug fix: Undefined offset when a cookie has no first key-value pair [#1998](https://github.com/guzzle/guzzle/pull/1998)\n* Improvement: Support PHPUnit 6 [#1953](https://github.com/guzzle/guzzle/pull/1953)\n* Bug fix: Support empty headers [#1915](https://github.com/guzzle/guzzle/pull/1915)\n* Bug fix: Ignore case during header modifications [#1916](https://github.com/guzzle/guzzle/pull/1916)\n\n+ Minor code cleanups, documentation fixes and clarifications.\n\n\n## 6.3.0 - 2017-06-22\n\n* Feature: force IP resolution (ipv4 or ipv6) [#1608](https://github.com/guzzle/guzzle/pull/1608), [#1659](https://github.com/guzzle/guzzle/pull/1659)\n* Improvement: Don't include summary in exception message when body is empty [#1621](https://github.com/guzzle/guzzle/pull/1621)\n* Improvement: Handle `on_headers` option in MockHandler [#1580](https://github.com/guzzle/guzzle/pull/1580)\n* Improvement: Added SUSE Linux CA path [#1609](https://github.com/guzzle/guzzle/issues/1609)\n* Improvement: Use class reference for getting the name of the class instead of using hardcoded strings [#1641](https://github.com/guzzle/guzzle/pull/1641)\n* Feature: Added `read_timeout` option [#1611](https://github.com/guzzle/guzzle/pull/1611)\n* 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)\n* Deprecation: BadResponseException instantiation without a response [#1642](https://github.com/guzzle/guzzle/pull/1642)\n* Feature: Added NTLM auth [#1569](https://github.com/guzzle/guzzle/pull/1569)\n* Feature: Track redirect HTTP status codes [#1711](https://github.com/guzzle/guzzle/pull/1711)\n* Improvement: Check handler type during construction [#1745](https://github.com/guzzle/guzzle/pull/1745)\n* Improvement: Always include the Content-Length if there's a body [#1721](https://github.com/guzzle/guzzle/pull/1721)\n* Feature: Added convenience method to access a cookie by name [#1318](https://github.com/guzzle/guzzle/pull/1318)\n* Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684)\n* Improvement:  \tUse `\\GuzzleHttp\\Promise\\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827)\n\n\n+ Minor code cleanups, documentation fixes and clarifications.\n\n## 6.2.3 - 2017-02-28\n\n* Fix deprecations with guzzle/psr7 version 1.4\n\n## 6.2.2 - 2016-10-08\n\n* Allow to pass nullable Response to delay callable\n* Only add scheme when host is present\n* Fix drain case where content-length is the literal string zero\n* Obfuscate in-URL credentials in exceptions\n\n## 6.2.1 - 2016-07-18\n\n* Address HTTP_PROXY security vulnerability, CVE-2016-5385:\n  https://httpoxy.org/\n* Fixing timeout bug with StreamHandler:\n  https://github.com/guzzle/guzzle/pull/1488\n* Only read up to `Content-Length` in PHP StreamHandler to avoid timeouts when\n  a server does not honor `Connection: close`.\n* Ignore URI fragment when sending requests.\n\n## 6.2.0 - 2016-03-21\n\n* Feature: added `GuzzleHttp\\json_encode` and `GuzzleHttp\\json_decode`.\n  https://github.com/guzzle/guzzle/pull/1389\n* Bug fix: Fix sleep calculation when waiting for delayed requests.\n  https://github.com/guzzle/guzzle/pull/1324\n* Feature: More flexible history containers.\n  https://github.com/guzzle/guzzle/pull/1373\n* Bug fix: defer sink stream opening in StreamHandler.\n  https://github.com/guzzle/guzzle/pull/1377\n* Bug fix: do not attempt to escape cookie values.\n  https://github.com/guzzle/guzzle/pull/1406\n* Feature: report original content encoding and length on decoded responses.\n  https://github.com/guzzle/guzzle/pull/1409\n* Bug fix: rewind seekable request bodies before dispatching to cURL.\n  https://github.com/guzzle/guzzle/pull/1422\n* Bug fix: provide an empty string to `http_build_query` for HHVM workaround.\n  https://github.com/guzzle/guzzle/pull/1367\n\n## 6.1.1 - 2015-11-22\n\n* Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler\n  https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f63e4e4\n* Feature: HandlerStack is now more generic.\n  https://github.com/guzzle/guzzle/commit/f2102941331cda544745eedd97fc8fd46e1ee33e\n* Bug fix: setting verify to false in the StreamHandler now disables peer\n  verification. https://github.com/guzzle/guzzle/issues/1256\n* Feature: Middleware now uses an exception factory, including more error\n  context. https://github.com/guzzle/guzzle/pull/1282\n* Feature: better support for disabled functions.\n  https://github.com/guzzle/guzzle/pull/1287\n* Bug fix: fixed regression where MockHandler was not using `sink`.\n  https://github.com/guzzle/guzzle/pull/1292\n\n## 6.1.0 - 2015-09-08\n\n* Feature: Added the `on_stats` request option to provide access to transfer\n  statistics for requests. https://github.com/guzzle/guzzle/pull/1202\n* Feature: Added the ability to persist session cookies in CookieJars.\n  https://github.com/guzzle/guzzle/pull/1195\n* Feature: Some compatibility updates for Google APP Engine\n  https://github.com/guzzle/guzzle/pull/1216\n* Feature: Added support for NO_PROXY to prevent the use of a proxy based on\n  a simple set of rules. https://github.com/guzzle/guzzle/pull/1197\n* Feature: Cookies can now contain square brackets.\n  https://github.com/guzzle/guzzle/pull/1237\n* Bug fix: Now correctly parsing `=` inside of quotes in Cookies.\n  https://github.com/guzzle/guzzle/pull/1232\n* Bug fix: Cusotm cURL options now correctly override curl options of the\n  same name. https://github.com/guzzle/guzzle/pull/1221\n* Bug fix: Content-Type header is now added when using an explicitly provided\n  multipart body. https://github.com/guzzle/guzzle/pull/1218\n* Bug fix: Now ignoring Set-Cookie headers that have no name.\n* Bug fix: Reason phrase is no longer cast to an int in some cases in the\n  cURL handler. https://github.com/guzzle/guzzle/pull/1187\n* Bug fix: Remove the Authorization header when redirecting if the Host\n  header changes. https://github.com/guzzle/guzzle/pull/1207\n* Bug fix: Cookie path matching fixes\n  https://github.com/guzzle/guzzle/issues/1129\n* Bug fix: Fixing the cURL `body_as_string` setting\n  https://github.com/guzzle/guzzle/pull/1201\n* Bug fix: quotes are no longer stripped when parsing cookies.\n  https://github.com/guzzle/guzzle/issues/1172\n* Bug fix: `form_params` and `query` now always uses the `&` separator.\n  https://github.com/guzzle/guzzle/pull/1163\n* Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set.\n  https://github.com/guzzle/guzzle/pull/1189\n\n## 6.0.2 - 2015-07-04\n\n* Fixed a memory leak in the curl handlers in which references to callbacks\n  were not being removed by `curl_reset`.\n* Cookies are now extracted properly before redirects.\n* Cookies now allow more character ranges.\n* Decoded Content-Encoding responses are now modified to correctly reflect\n  their state if the encoding was automatically removed by a handler. This\n  means that the `Content-Encoding` header may be removed an the\n  `Content-Length` modified to reflect the message size after removing the\n  encoding.\n* Added a more explicit error message when trying to use `form_params` and\n  `multipart` in the same request.\n* Several fixes for HHVM support.\n* Functions are now conditionally required using an additional level of\n  indirection to help with global Composer installations.\n\n## 6.0.1 - 2015-05-27\n\n* Fixed a bug with serializing the `query` request option where the `&`\n  separator was missing.\n* Added a better error message for when `body` is provided as an array. Please\n  use `form_params` or `multipart` instead.\n* Various doc fixes.\n\n## 6.0.0 - 2015-05-26\n\n* See the UPGRADING.md document for more information.\n* Added `multipart` and `form_params` request options.\n* Added `synchronous` request option.\n* Added the `on_headers` request option.\n* Fixed `expect` handling.\n* No longer adding default middlewares in the client ctor. These need to be\n  present on the provided handler in order to work.\n* Requests are no longer initiated when sending async requests with the\n  CurlMultiHandler. This prevents unexpected recursion from requests completing\n  while ticking the cURL loop.\n* Removed the semantics of setting `default` to `true`. This is no longer\n  required now that the cURL loop is not ticked for async requests.\n* Added request and response logging middleware.\n* No longer allowing self signed certificates when using the StreamHandler.\n* Ensuring that `sink` is valid if saving to a file.\n* Request exceptions now include a \"handler context\" which provides handler\n  specific contextual information.\n* Added `GuzzleHttp\\RequestOptions` to allow request options to be applied\n  using constants.\n* `$maxHandles` has been removed from CurlMultiHandler.\n* `MultipartPostBody` is now part of the `guzzlehttp/psr7` package.\n\n## 5.3.0 - 2015-05-19\n\n* Mock now supports `save_to`\n* Marked `AbstractRequestEvent::getTransaction()` as public.\n* Fixed a bug in which multiple headers using different casing would overwrite\n  previous headers in the associative array.\n* Added `Utils::getDefaultHandler()`\n* Marked `GuzzleHttp\\Client::getDefaultUserAgent` as deprecated.\n* URL scheme is now always lowercased.\n\n## 6.0.0-beta.1\n\n* Requires PHP >= 5.5\n* Updated to use PSR-7\n  * Requires immutable messages, which basically means an event based system\n    owned by a request instance is no longer possible.\n  * Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7).\n  * Removed the dependency on `guzzlehttp/streams`. These stream abstractions\n    are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\\Psr7`\n    namespace.\n* Added middleware and handler system\n  * Replaced the Guzzle event and subscriber system with a middleware system.\n  * No longer depends on RingPHP, but rather places the HTTP handlers directly\n    in Guzzle, operating on PSR-7 messages.\n  * Retry logic is now encapsulated in `GuzzleHttp\\Middleware::retry`, which\n    means the `guzzlehttp/retry-subscriber` is now obsolete.\n  * Mocking responses is now handled using `GuzzleHttp\\Handler\\MockHandler`.\n* Asynchronous responses\n  * No longer supports the `future` request option to send an async request.\n    Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`,\n    `getAsync`, etc.).\n  * Utilizing `GuzzleHttp\\Promise` instead of React's promise library to avoid\n    recursion required by chaining and forwarding react promises. See\n    https://github.com/guzzle/promises\n  * Added `requestAsync` and `sendAsync` to send request asynchronously.\n  * Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests\n    asynchronously.\n* Request options\n  * POST and form updates\n    * Added the `form_fields` and `form_files` request options.\n    * Removed the `GuzzleHttp\\Post` namespace.\n    * The `body` request option no longer accepts an array for POST requests.\n  * The `exceptions` request option has been deprecated in favor of the\n    `http_errors` request options.\n  * The `save_to` request option has been deprecated in favor of `sink` request\n    option.\n* Clients no longer accept an array of URI template string and variables for\n  URI variables. You will need to expand URI templates before passing them\n  into a client constructor or request method.\n* Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are\n  now magic methods that will send synchronous requests.\n* Replaced `Utils.php` with plain functions in `functions.php`.\n* Removed `GuzzleHttp\\Collection`.\n* Removed `GuzzleHttp\\BatchResults`. Batched pool results are now returned as\n  an array.\n* Removed `GuzzleHttp\\Query`. Query string handling is now handled using an\n  associative array passed into the `query` request option. The query string\n  is serialized using PHP's `http_build_query`. If you need more control, you\n  can pass the query string in as a string.\n* `GuzzleHttp\\QueryParser` has been replaced with the\n  `GuzzleHttp\\Psr7\\parse_query`.\n\n## 5.2.0 - 2015-01-27\n\n* Added `AppliesHeadersInterface` to make applying headers to a request based\n  on the body more generic and not specific to `PostBodyInterface`.\n* Reduced the number of stack frames needed to send requests.\n* Nested futures are now resolved in the client rather than the RequestFsm\n* Finishing state transitions is now handled in the RequestFsm rather than the\n  RingBridge.\n* Added a guard in the Pool class to not use recursion for request retries.\n\n## 5.1.0 - 2014-12-19\n\n* Pool class no longer uses recursion when a request is intercepted.\n* The size of a Pool can now be dynamically adjusted using a callback.\n  See https://github.com/guzzle/guzzle/pull/943.\n* Setting a request option to `null` when creating a request with a client will\n  ensure that the option is not set. This allows you to overwrite default\n  request options on a per-request basis.\n  See https://github.com/guzzle/guzzle/pull/937.\n* Added the ability to limit which protocols are allowed for redirects by\n  specifying a `protocols` array in the `allow_redirects` request option.\n* Nested futures due to retries are now resolved when waiting for synchronous\n  responses. See https://github.com/guzzle/guzzle/pull/947.\n* `\"0\"` is now an allowed URI path. See\n  https://github.com/guzzle/guzzle/pull/935.\n* `Query` no longer typehints on the `$query` argument in the constructor,\n  allowing for strings and arrays.\n* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle\n  specific exceptions if necessary.\n\n## 5.0.3 - 2014-11-03\n\nThis change updates query strings so that they are treated as un-encoded values\nby default where the value represents an un-encoded value to send over the\nwire. A Query object then encodes the value before sending over the wire. This\nmeans that even value query string values (e.g., \":\") are url encoded. This\nmakes the Query class match PHP's http_build_query function. However, if you\nwant to send requests over the wire using valid query string characters that do\nnot need to be encoded, then you can provide a string to Url::setQuery() and\npass true as the second argument to specify that the query string is a raw\nstring that should not be parsed or encoded (unless a call to getQuery() is\nsubsequently made, forcing the query-string to be converted into a Query\nobject).\n\n## 5.0.2 - 2014-10-30\n\n* Added a trailing `\\r\\n` to multipart/form-data payloads. See\n  https://github.com/guzzle/guzzle/pull/871\n* Added a `GuzzleHttp\\Pool::send()` convenience method to match the docs.\n* Status codes are now returned as integers. See\n  https://github.com/guzzle/guzzle/issues/881\n* No longer overwriting an existing `application/x-www-form-urlencoded` header\n  when sending POST requests, allowing for customized headers. See\n  https://github.com/guzzle/guzzle/issues/877\n* Improved path URL serialization.\n\n  * No longer double percent-encoding characters in the path or query string if\n    they are already encoded.\n  * Now properly encoding the supplied path to a URL object, instead of only\n    encoding ' ' and '?'.\n  * Note: This has been changed in 5.0.3 to now encode query string values by\n    default unless the `rawString` argument is provided when setting the query\n    string on a URL: Now allowing many more characters to be present in the\n    query string without being percent encoded. See http://tools.ietf.org/html/rfc3986#appendix-A\n\n## 5.0.1 - 2014-10-16\n\nBugfix release.\n\n* Fixed an issue where connection errors still returned response object in\n  error and end events event though the response is unusable. This has been\n  corrected so that a response is not returned in the `getResponse` method of\n  these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867\n* Fixed an issue where transfer statistics were not being populated in the\n  RingBridge. https://github.com/guzzle/guzzle/issues/866\n\n## 5.0.0 - 2014-10-12\n\nAdding support for non-blocking responses and some minor API cleanup.\n\n### New Features\n\n* Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`.\n* Added a public API for creating a default HTTP adapter.\n* Updated the redirect plugin to be non-blocking so that redirects are sent\n  concurrently. Other plugins like this can now be updated to be non-blocking.\n* Added a \"progress\" event so that you can get upload and download progress\n  events.\n* Added `GuzzleHttp\\Pool` which implements FutureInterface and transfers\n  requests concurrently using a capped pool size as efficiently as possible.\n* Added `hasListeners()` to EmitterInterface.\n* Removed `GuzzleHttp\\ClientInterface::sendAll` and marked\n  `GuzzleHttp\\Client::sendAll` as deprecated (it's still there, just not the\n  recommended way).\n\n### Breaking changes\n\nThe breaking changes in this release are relatively minor. The biggest thing to\nlook out for is that request and response objects no longer implement fluent\ninterfaces.\n\n* Removed the fluent interfaces (i.e., `return $this`) from requests,\n  responses, `GuzzleHttp\\Collection`, `GuzzleHttp\\Url`,\n  `GuzzleHttp\\Query`, `GuzzleHttp\\Post\\PostBody`, and\n  `GuzzleHttp\\Cookie\\SetCookie`. This blog post provides a good outline of\n  why I did this: http://ocramius.github.io/blog/fluent-interfaces-are-evil/.\n  This also makes the Guzzle message interfaces compatible with the current\n  PSR-7 message proposal.\n* Removed \"functions.php\", so that Guzzle is truly PSR-4 compliant. Except\n  for the HTTP request functions from function.php, these functions are now\n  implemented in `GuzzleHttp\\Utils` using camelCase. `GuzzleHttp\\json_decode`\n  moved to `GuzzleHttp\\Utils::jsonDecode`. `GuzzleHttp\\get_path` moved to\n  `GuzzleHttp\\Utils::getPath`. `GuzzleHttp\\set_path` moved to\n  `GuzzleHttp\\Utils::setPath`. `GuzzleHttp\\batch` should now be\n  `GuzzleHttp\\Pool::batch`, which returns an `objectStorage`. Using functions.php\n  caused problems for many users: they aren't PSR-4 compliant, require an\n  explicit include, and needed an if-guard to ensure that the functions are not\n  declared multiple times.\n* Rewrote adapter layer.\n    * Removing all classes from `GuzzleHttp\\Adapter`, these are now\n      implemented as callables that are stored in `GuzzleHttp\\Ring\\Client`.\n    * Removed the concept of \"parallel adapters\". Sending requests serially or\n      concurrently is now handled using a single adapter.\n    * Moved `GuzzleHttp\\Adapter\\Transaction` to `GuzzleHttp\\Transaction`. The\n      Transaction object now exposes the request, response, and client as public\n      properties. The getters and setters have been removed.\n* Removed the \"headers\" event. This event was only useful for changing the\n  body a response once the headers of the response were known. You can implement\n  a similar behavior in a number of ways. One example might be to use a\n  FnStream that has access to the transaction being sent. For example, when the\n  first byte is written, you could check if the response headers match your\n  expectations, and if so, change the actual stream body that is being\n  written to.\n* Removed the `asArray` parameter from\n  `GuzzleHttp\\Message\\MessageInterface::getHeader`. If you want to get a header\n  value as an array, then use the newly added `getHeaderAsArray()` method of\n  `MessageInterface`. This change makes the Guzzle interfaces compatible with\n  the PSR-7 interfaces.\n* `GuzzleHttp\\Message\\MessageFactory` no longer allows subclasses to add\n  custom request options using double-dispatch (this was an implementation\n  detail). Instead, you should now provide an associative array to the\n  constructor which is a mapping of the request option name mapping to a\n  function that applies the option value to a request.\n* Removed the concept of \"throwImmediately\" from exceptions and error events.\n  This control mechanism was used to stop a transfer of concurrent requests\n  from completing. This can now be handled by throwing the exception or by\n  cancelling a pool of requests or each outstanding future request individually.\n* Updated to \"GuzzleHttp\\Streams\" 3.0.\n    * `GuzzleHttp\\Stream\\StreamInterface::getContents()` no longer accepts a\n      `maxLen` parameter. This update makes the Guzzle streams project\n      compatible with the current PSR-7 proposal.\n    * `GuzzleHttp\\Stream\\Stream::__construct`,\n      `GuzzleHttp\\Stream\\Stream::factory`, and\n      `GuzzleHttp\\Stream\\Utils::create` no longer accept a size in the second\n      argument. They now accept an associative array of options, including the\n      \"size\" key and \"metadata\" key which can be used to provide custom metadata.\n\n## 4.2.2 - 2014-09-08\n\n* Fixed a memory leak in the CurlAdapter when reusing cURL handles.\n* No longer using `request_fulluri` in stream adapter proxies.\n* Relative redirects are now based on the last response, not the first response.\n\n## 4.2.1 - 2014-08-19\n\n* Ensuring that the StreamAdapter does not always add a Content-Type header\n* Adding automated github releases with a phar and zip\n\n## 4.2.0 - 2014-08-17\n\n* Now merging in default options using a case-insensitive comparison.\n  Closes https://github.com/guzzle/guzzle/issues/767\n* Added the ability to automatically decode `Content-Encoding` response bodies\n  using the `decode_content` request option. This is set to `true` by default\n  to decode the response body if it comes over the wire with a\n  `Content-Encoding`. Set this value to `false` to disable decoding the\n  response content, and pass a string to provide a request `Accept-Encoding`\n  header and turn on automatic response decoding. This feature now allows you\n  to pass an `Accept-Encoding` header in the headers of a request but still\n  disable automatic response decoding.\n  Closes https://github.com/guzzle/guzzle/issues/764\n* Added the ability to throw an exception immediately when transferring\n  requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760\n* Updating guzzlehttp/streams dependency to ~2.1\n* No longer utilizing the now deprecated namespaced methods from the stream\n  package.\n\n## 4.1.8 - 2014-08-14\n\n* Fixed an issue in the CurlFactory that caused setting the `stream=false`\n  request option to throw an exception.\n  See: https://github.com/guzzle/guzzle/issues/769\n* TransactionIterator now calls rewind on the inner iterator.\n  See: https://github.com/guzzle/guzzle/pull/765\n* You can now set the `Content-Type` header to `multipart/form-data`\n  when creating POST requests to force multipart bodies.\n  See https://github.com/guzzle/guzzle/issues/768\n\n## 4.1.7 - 2014-08-07\n\n* Fixed an error in the HistoryPlugin that caused the same request and response\n  to be logged multiple times when an HTTP protocol error occurs.\n* Ensuring that cURL does not add a default Content-Type when no Content-Type\n  has been supplied by the user. This prevents the adapter layer from modifying\n  the request that is sent over the wire after any listeners may have already\n  put the request in a desired state (e.g., signed the request).\n* Throwing an exception when you attempt to send requests that have the\n  \"stream\" set to true in parallel using the MultiAdapter.\n* Only calling curl_multi_select when there are active cURL handles. This was\n  previously changed and caused performance problems on some systems due to PHP\n  always selecting until the maximum select timeout.\n* Fixed a bug where multipart/form-data POST fields were not correctly\n  aggregated (e.g., values with \"&\").\n\n## 4.1.6 - 2014-08-03\n\n* Added helper methods to make it easier to represent messages as strings,\n  including getting the start line and getting headers as a string.\n\n## 4.1.5 - 2014-08-02\n\n* Automatically retrying cURL \"Connection died, retrying a fresh connect\"\n  errors when possible.\n* cURL implementation cleanup\n* Allowing multiple event subscriber listeners to be registered per event by\n  passing an array of arrays of listener configuration.\n\n## 4.1.4 - 2014-07-22\n\n* Fixed a bug that caused multi-part POST requests with more than one field to\n  serialize incorrectly.\n* Paths can now be set to \"0\"\n* `ResponseInterface::xml` now accepts a `libxml_options` option and added a\n  missing default argument that was required when parsing XML response bodies.\n* A `save_to` stream is now created lazily, which means that files are not\n  created on disk unless a request succeeds.\n\n## 4.1.3 - 2014-07-15\n\n* Various fixes to multipart/form-data POST uploads\n* Wrapping function.php in an if-statement to ensure Guzzle can be used\n  globally and in a Composer install\n* Fixed an issue with generating and merging in events to an event array\n* POST headers are only applied before sending a request to allow you to change\n  the query aggregator used before uploading\n* Added much more robust query string parsing\n* Fixed various parsing and normalization issues with URLs\n* Fixing an issue where multi-valued headers were not being utilized correctly\n  in the StreamAdapter\n\n## 4.1.2 - 2014-06-18\n\n* Added support for sending payloads with GET requests\n\n## 4.1.1 - 2014-06-08\n\n* Fixed an issue related to using custom message factory options in subclasses\n* Fixed an issue with nested form fields in a multi-part POST\n* Fixed an issue with using the `json` request option for POST requests\n* Added `ToArrayInterface` to `GuzzleHttp\\Cookie\\CookieJar`\n\n## 4.1.0 - 2014-05-27\n\n* Added a `json` request option to easily serialize JSON payloads.\n* Added a `GuzzleHttp\\json_decode()` wrapper to safely parse JSON.\n* Added `setPort()` and `getPort()` to `GuzzleHttp\\Message\\RequestInterface`.\n* Added the ability to provide an emitter to a client in the client constructor.\n* Added the ability to persist a cookie session using $_SESSION.\n* Added a trait that can be used to add event listeners to an iterator.\n* Removed request method constants from RequestInterface.\n* Fixed warning when invalid request start-lines are received.\n* Updated MessageFactory to work with custom request option methods.\n* Updated cacert bundle to latest build.\n\n4.0.2 (2014-04-16)\n------------------\n\n* Proxy requests using the StreamAdapter now properly use request_fulluri (#632)\n* Added the ability to set scalars as POST fields (#628)\n\n## 4.0.1 - 2014-04-04\n\n* The HTTP status code of a response is now set as the exception code of\n  RequestException objects.\n* 303 redirects will now correctly switch from POST to GET requests.\n* The default parallel adapter of a client now correctly uses the MultiAdapter.\n* HasDataTrait now initializes the internal data array as an empty array so\n  that the toArray() method always returns an array.\n\n## 4.0.0 - 2014-03-29\n\n* For more information on the 4.0 transition, see:\n  http://mtdowling.com/blog/2014/03/15/guzzle-4-rc/\n* For information on changes and upgrading, see:\n  https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40\n* Added `GuzzleHttp\\batch()` as a convenience function for sending requests in\n  parallel without needing to write asynchronous code.\n* Restructured how events are added to `GuzzleHttp\\ClientInterface::sendAll()`.\n  You can now pass a callable or an array of associative arrays where each\n  associative array contains the \"fn\", \"priority\", and \"once\" keys.\n\n## 4.0.0.rc-2 - 2014-03-25\n\n* Removed `getConfig()` and `setConfig()` from clients to avoid confusion\n  around whether things like base_url, message_factory, etc. should be able to\n  be retrieved or modified.\n* Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface\n* functions.php functions were renamed using snake_case to match PHP idioms\n* Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and\n  `GUZZLE_CURL_SELECT_TIMEOUT` environment variables\n* Added the ability to specify custom `sendAll()` event priorities\n* Added the ability to specify custom stream context options to the stream\n  adapter.\n* Added a functions.php function for `get_path()` and `set_path()`\n* CurlAdapter and MultiAdapter now use a callable to generate curl resources\n* MockAdapter now properly reads a body and emits a `headers` event\n* Updated Url class to check if a scheme and host are set before adding \":\"\n  and \"//\". This allows empty Url (e.g., \"\") to be serialized as \"\".\n* Parsing invalid XML no longer emits warnings\n* Curl classes now properly throw AdapterExceptions\n* Various performance optimizations\n* Streams are created with the faster `Stream\\create()` function\n* Marked deprecation_proxy() as internal\n* Test server is now a collection of static methods on a class\n\n## 4.0.0-rc.1 - 2014-03-15\n\n* See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40\n\n## 3.8.1 - 2014-01-28\n\n* Bug: Always using GET requests when redirecting from a 303 response\n* Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in\n  `Guzzle\\Http\\ClientInterface::setSslVerification()`\n* Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL\n* Bug: The body of a request can now be set to `\"0\"`\n* Sending PHP stream requests no longer forces `HTTP/1.0`\n* Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of\n  each sub-exception\n* Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than\n  clobbering everything).\n* Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators)\n* Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`.\n  For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`.\n* Now properly escaping the regular expression delimiter when matching Cookie domains.\n* Network access is now disabled when loading XML documents\n\n## 3.8.0 - 2013-12-05\n\n* Added the ability to define a POST name for a file\n* JSON response parsing now properly walks additionalProperties\n* cURL error code 18 is now retried automatically in the BackoffPlugin\n* Fixed a cURL error when URLs contain fragments\n* Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were\n  CurlExceptions\n* CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e)\n* Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS`\n* Fixed a bug that was encountered when parsing empty header parameters\n* UriTemplate now has a `setRegex()` method to match the docs\n* The `debug` request parameter now checks if it is truthy rather than if it exists\n* Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin\n* Added the ability to combine URLs using strict RFC 3986 compliance\n* Command objects can now return the validation errors encountered by the command\n* Various fixes to cache revalidation (#437 and 29797e5)\n* Various fixes to the AsyncPlugin\n* Cleaned up build scripts\n\n## 3.7.4 - 2013-10-02\n\n* Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430)\n* Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp\n  (see https://github.com/aws/aws-sdk-php/issues/147)\n* Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots\n* Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420)\n* Updated the bundled cacert.pem (#419)\n* OauthPlugin now supports adding authentication to headers or query string (#425)\n\n## 3.7.3 - 2013-09-08\n\n* Added the ability to get the exception associated with a request/command when using `MultiTransferException` and\n  `CommandTransferException`.\n* Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description\n* Schemas are only injected into response models when explicitly configured.\n* No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of\n  an EntityBody.\n* Bug fix: ChunkedIterator can now properly chunk a \\Traversable as well as an \\Iterator.\n* Bug fix: FilterIterator now relies on `\\Iterator` instead of `\\Traversable`.\n* Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody()\n* Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin\n* Bug fix: Visiting XML attributes first before visiting XML children when serializing requests\n* Bug fix: Properly parsing headers that contain commas contained in quotes\n* Bug fix: mimetype guessing based on a filename is now case-insensitive\n\n## 3.7.2 - 2013-08-02\n\n* Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander\n  See https://github.com/guzzle/guzzle/issues/371\n* Bug fix: Cookie domains are now matched correctly according to RFC 6265\n  See https://github.com/guzzle/guzzle/issues/377\n* Bug fix: GET parameters are now used when calculating an OAuth signature\n* Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted\n* `Guzzle\\Common\\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched\n* `Guzzle\\Http\\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input.\n  See https://github.com/guzzle/guzzle/issues/379\n* Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See\n  https://github.com/guzzle/guzzle/pull/380\n* cURL multi cleanup and optimizations\n\n## 3.7.1 - 2013-07-05\n\n* Bug fix: Setting default options on a client now works\n* Bug fix: Setting options on HEAD requests now works. See #352\n* Bug fix: Moving stream factory before send event to before building the stream. See #353\n* Bug fix: Cookies no longer match on IP addresses per RFC 6265\n* Bug fix: Correctly parsing header parameters that are in `<>` and quotes\n* Added `cert` and `ssl_key` as request options\n* `Host` header can now diverge from the host part of a URL if the header is set manually\n* `Guzzle\\Service\\Command\\LocationVisitor\\Request\\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter\n* OAuth parameters are only added via the plugin if they aren't already set\n* Exceptions are now thrown when a URL cannot be parsed\n* Returning `false` if `Guzzle\\Http\\EntityBody::getContentMd5()` fails\n* Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin\n\n## 3.7.0 - 2013-06-10\n\n* See UPGRADING.md for more information on how to upgrade.\n* Requests now support the ability to specify an array of $options when creating a request to more easily modify a\n  request. You can pass a 'request.options' configuration setting to a client to apply default request options to\n  every request created by a client (e.g. default query string variables, headers, curl options, etc.).\n* Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\\Guzzle`.\n  See `Guzzle\\Http\\StaticClient::mount`.\n* Added `command.request_options` to `Guzzle\\Service\\Command\\AbstractCommand` to pass request options to requests\n      created by a command (e.g. custom headers, query string variables, timeout settings, etc.).\n* Stream size in `Guzzle\\Stream\\PhpStreamRequestFactory` will now be set if Content-Length is returned in the\n  headers of a response\n* Added `Guzzle\\Common\\Collection::setPath($path, $value)` to set a value into an array using a nested key\n  (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`)\n* ServiceBuilders now support storing and retrieving arbitrary data\n* CachePlugin can now purge all resources for a given URI\n* CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource\n* CachePlugin now uses the Vary header to determine if a resource is a cache hit\n* `Guzzle\\Http\\Message\\Response` now implements `\\Serializable`\n* Added `Guzzle\\Cache\\CacheAdapterFactory::fromCache()` to more easily create cache adapters\n* `Guzzle\\Service\\ClientInterface::execute()` now accepts an array, single command, or Traversable\n* Fixed a bug in `Guzzle\\Http\\Message\\Header\\Link::addLink()`\n* Better handling of calculating the size of a stream in `Guzzle\\Stream\\Stream` using fstat() and caching the size\n* `Guzzle\\Common\\Exception\\ExceptionCollection` now creates a more readable exception message\n* Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older\n  Symfony users can still use the old version of Monolog.\n* Fixing BC break: Added the implementation back in for `Guzzle\\Http\\Message\\AbstractMessage::getTokenizedHeader()`.\n  Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`.\n* Several performance improvements to `Guzzle\\Common\\Collection`\n* Added an `$options` argument to the end of the following methods of `Guzzle\\Http\\ClientInterface`:\n  createRequest, head, delete, put, patch, post, options, prepareRequest\n* Added an `$options` argument to the end of `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface::createRequest()`\n* Added an `applyOptions()` method to `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface`\n* Changed `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $body = null)` to\n  `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a\n  resource, string, or EntityBody into the $options parameter to specify the download location of the response.\n* Changed `Guzzle\\Common\\Collection::__construct($data)` to no longer accepts a null value for `$data` but a\n  default `array()`\n* Added `Guzzle\\Stream\\StreamInterface::isRepeatable`\n* Removed `Guzzle\\Http\\ClientInterface::setDefaultHeaders(). Use\n  $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or\n  $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`.\n* Removed `Guzzle\\Http\\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`.\n* Removed `Guzzle\\Http\\ClientInterface::expandTemplate()`\n* Removed `Guzzle\\Http\\ClientInterface::setRequestFactory()`\n* Removed `Guzzle\\Http\\ClientInterface::getCurlMulti()`\n* Removed `Guzzle\\Http\\Message\\RequestInterface::canCache`\n* Removed `Guzzle\\Http\\Message\\RequestInterface::setIsRedirect`\n* Removed `Guzzle\\Http\\Message\\RequestInterface::isRedirect`\n* Made `Guzzle\\Http\\Client::expandTemplate` and `getUriTemplate` protected methods.\n* You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting\n  `Guzzle\\Common\\Version::$emitWarnings` to true.\n* Marked `Guzzle\\Http\\Message\\Request::isResponseBodyRepeatable()` as deprecated. Use\n      `$request->getResponseBody()->isRepeatable()` instead.\n* Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use\n  `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n* Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use\n  `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n* Marked `Guzzle\\Http\\Message\\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.\n* Marked `Guzzle\\Http\\Message\\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.\n* Marked `Guzzle\\Cache\\CacheAdapterFactory::factory()` as deprecated\n* Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand.\n  These will work through Guzzle 4.0\n* Marked 'request.params' for `Guzzle\\Http\\Client` as deprecated. Use [request.options][params].\n* Marked `Guzzle\\Service\\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\\Service\\Client.\n* Marked `Guzzle\\Service\\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`.\n* Marked `Guzzle\\Service\\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`.\n* Marked `Guzzle\\Parser\\Url\\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.\n* Marked `Guzzle\\Common\\Collection::inject()` as deprecated.\n* Marked `Guzzle\\Plugin\\CurlAuth\\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');`\n* CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a\n  CacheStorageInterface. These two objects and interface will be removed in a future version.\n* Always setting X-cache headers on cached responses\n* Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin\n* `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface\n  $request, Response $response);`\n* `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`\n* `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`\n* Added `CacheStorageInterface::purge($url)`\n* `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin\n  $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,\n  CanCacheStrategyInterface $canCache = null)`\n* Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`\n\n## 3.6.0 - 2013-05-29\n\n* ServiceDescription now implements ToArrayInterface\n* Added command.hidden_params to blacklist certain headers from being treated as additionalParameters\n* Guzzle can now correctly parse incomplete URLs\n* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.\n* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution\n* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().\n* Specific header implementations can be created for complex headers. When a message creates a header, it uses a\n  HeaderFactory which can map specific headers to specific header classes. There is now a Link header and\n  CacheControl header implementation.\n* Removed from interface: Guzzle\\Http\\ClientInterface::setUriTemplate\n* Removed from interface: Guzzle\\Http\\ClientInterface::setCurlMulti()\n* Removed Guzzle\\Http\\Message\\Request::receivedRequestHeader() and implemented this functionality in\n  Guzzle\\Http\\Curl\\RequestMediator\n* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.\n* Removed the optional $tryChunkedTransfer option from Guzzle\\Http\\Message\\EntityEnclosingRequestInterface\n* Removed the $asObjects argument from Guzzle\\Http\\Message\\MessageInterface::getHeaders()\n* Removed Guzzle\\Parser\\ParserRegister::get(). Use getParser()\n* Removed Guzzle\\Parser\\ParserRegister::set(). Use registerParser().\n* All response header helper functions return a string rather than mixing Header objects and strings inconsistently\n* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle\n  directly via interfaces\n* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist\n  but are a no-op until removed.\n* Most classes that used to require a `Guzzle\\Service\\Command\\CommandInterface` typehint now request a\n  `Guzzle\\Service\\Command\\ArrayCommandInterface`.\n* Added `Guzzle\\Http\\Message\\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response\n  on a request while the request is still being transferred\n* The ability to case-insensitively search for header values\n* Guzzle\\Http\\Message\\Header::hasExactHeader\n* Guzzle\\Http\\Message\\Header::raw. Use getAll()\n* Deprecated cache control specific methods on Guzzle\\Http\\Message\\AbstractMessage. Use the CacheControl header object\n  instead.\n* `Guzzle\\Service\\Command\\CommandInterface` now extends from ToArrayInterface and ArrayAccess\n* Added the ability to cast Model objects to a string to view debug information.\n\n## 3.5.0 - 2013-05-13\n\n* Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times\n* Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove\n  itself from the EventDispatcher)\n* Bug: `Guzzle\\Log\\MessageFormatter` now properly writes \"total_time\" and \"connect_time\" values\n* Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too\n* Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a\n  non-existent key\n* Bug: All __call() method arguments are now required (helps with mocking frameworks)\n* Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference\n  to help with refcount based garbage collection of resources created by sending a request\n* Deprecating ZF1 cache and log adapters. These will be removed in the next major version.\n* Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the\n  HistoryPlugin for a history.\n* Added a `responseBody` alias for the `response_body` location\n* Refactored internals to no longer rely on Response::getRequest()\n* HistoryPlugin can now be cast to a string\n* HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests\n  and responses that are sent over the wire\n* Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects\n\n## 3.4.3 - 2013-04-30\n\n* Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response\n* Added a check to re-extract the temp cacert bundle from the phar before sending each request\n\n## 3.4.2 - 2013-04-29\n\n* Bug fix: Stream objects now work correctly with \"a\" and \"a+\" modes\n* Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present\n* Bug fix: AsyncPlugin no longer forces HEAD requests\n* Bug fix: DateTime timezones are now properly handled when using the service description schema formatter\n* Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails\n* Setting a response on a request will write to the custom request body from the response body if one is specified\n* LogPlugin now writes to php://output when STDERR is undefined\n* Added the ability to set multiple POST files for the same key in a single call\n* application/x-www-form-urlencoded POSTs now use the utf-8 charset by default\n* Added the ability to queue CurlExceptions to the MockPlugin\n* Cleaned up how manual responses are queued on requests (removed \"queued_response\" and now using request.before_send)\n* Configuration loading now allows remote files\n\n## 3.4.1 - 2013-04-16\n\n* Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti\n  handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost.\n* Exceptions are now properly grouped when sending requests in parallel\n* Redirects are now properly aggregated when a multi transaction fails\n* Redirects now set the response on the original object even in the event of a failure\n* Bug fix: Model names are now properly set even when using $refs\n* Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax\n* Added support for oauth_callback in OAuth signatures\n* Added support for oauth_verifier in OAuth signatures\n* Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection\n\n## 3.4.0 - 2013-04-11\n\n* Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289\n* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289\n* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263\n* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264.\n* Bug fix: Added `number` type to service descriptions.\n* Bug fix: empty parameters are removed from an OAuth signature\n* Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header\n* Bug fix: Fixed \"array to string\" error when validating a union of types in a service description\n* Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream\n* Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin.\n* Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs.\n* The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections.\n* Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if\n  the Content-Type can be determined based on the entity body or the path of the request.\n* Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder.\n* Added support for a PSR-3 LogAdapter.\n* Added a `command.after_prepare` event\n* Added `oauth_callback` parameter to the OauthPlugin\n* Added the ability to create a custom stream class when using a stream factory\n* Added a CachingEntityBody decorator\n* Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized.\n* The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar.\n* You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies\n* POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This\n  means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use\n  POST fields or files (the latter is only used when emulating a form POST in the browser).\n* Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest\n\n## 3.3.1 - 2013-03-10\n\n* Added the ability to create PHP streaming responses from HTTP requests\n* Bug fix: Running any filters when parsing response headers with service descriptions\n* Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing\n* Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across\n  response location visitors.\n* Bug fix: Removed the possibility of creating configuration files with circular dependencies\n* RequestFactory::create() now uses the key of a POST file when setting the POST file name\n* Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set\n\n## 3.3.0 - 2013-03-03\n\n* A large number of performance optimizations have been made\n* Bug fix: Added 'wb' as a valid write mode for streams\n* Bug fix: `Guzzle\\Http\\Message\\Response::json()` now allows scalar values to be returned\n* Bug fix: Fixed bug in `Guzzle\\Http\\Message\\Response` where wrapping quotes were stripped from `getEtag()`\n* BC: Removed `Guzzle\\Http\\Utils` class\n* BC: Setting a service description on a client will no longer modify the client's command factories.\n* BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using\n  the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'\n* BC: `Guzzle\\Stream\\Stream::getWrapper()` and `Guzzle\\Stream\\Stream::getSteamType()` are no longer converted to\n  lowercase\n* Operation parameter objects are now lazy loaded internally\n* Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses\n* Added support for instantiating responseType=class responseClass classes. Classes must implement\n  `Guzzle\\Service\\Command\\ResponseClassInterface`\n* Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These\n  additional properties also support locations and can be used to parse JSON responses where the outermost part of the\n  JSON is an array\n* Added support for nested renaming of JSON models (rename sentAs to name)\n* CachePlugin\n    * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error\n    * Debug headers can now added to cached response in the CachePlugin\n\n## 3.2.0 - 2013-02-14\n\n* CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients.\n* URLs with no path no longer contain a \"/\" by default\n* Guzzle\\Http\\QueryString does no longer manages the leading \"?\". This is now handled in Guzzle\\Http\\Url.\n* BadResponseException no longer includes the full request and response message\n* Adding setData() to Guzzle\\Service\\Description\\ServiceDescriptionInterface\n* Adding getResponseBody() to Guzzle\\Http\\Message\\RequestInterface\n* Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription\n* Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list\n* xmlEncoding can now be customized for the XML declaration of a XML service description operation\n* Guzzle\\Http\\QueryString now uses Guzzle\\Http\\QueryAggregator\\QueryAggregatorInterface objects to add custom value\n  aggregation and no longer uses callbacks\n* The URL encoding implementation of Guzzle\\Http\\QueryString can now be customized\n* Bug fix: Filters were not always invoked for array service description parameters\n* Bug fix: Redirects now use a target response body rather than a temporary response body\n* Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded\n* Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives\n\n## 3.1.2 - 2013-01-27\n\n* Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the\n  response body. For example, the XmlVisitor now parses the XML response into an array in the before() method.\n* Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent\n* CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444)\n* Fixed a bug where redirect responses were not chained correctly using getPreviousResponse()\n* Setting default headers on a client after setting the user-agent will not erase the user-agent setting\n\n## 3.1.1 - 2013-01-20\n\n* Adding wildcard support to Guzzle\\Common\\Collection::getPath()\n* Adding alias support to ServiceBuilder configs\n* Adding Guzzle\\Service\\Resource\\CompositeResourceIteratorFactory and cleaning up factory interface\n\n## 3.1.0 - 2013-01-12\n\n* BC: CurlException now extends from RequestException rather than BadResponseException\n* BC: Renamed Guzzle\\Plugin\\Cache\\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse()\n* Added getData to ServiceDescriptionInterface\n* Added context array to RequestInterface::setState()\n* Bug: Removing hard dependency on the BackoffPlugin from Guzzle\\Http\n* Bug: Adding required content-type when JSON request visitor adds JSON to a command\n* Bug: Fixing the serialization of a service description with custom data\n* Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing\n  an array of successful and failed responses\n* Moved getPath from Guzzle\\Service\\Resource\\Model to Guzzle\\Common\\Collection\n* Added Guzzle\\Http\\IoEmittingEntityBody\n* Moved command filtration from validators to location visitors\n* Added `extends` attributes to service description parameters\n* Added getModels to ServiceDescriptionInterface\n\n## 3.0.7 - 2012-12-19\n\n* Fixing phar detection when forcing a cacert to system if null or true\n* Allowing filename to be passed to `Guzzle\\Http\\Message\\Request::setResponseBody()`\n* Cleaning up `Guzzle\\Common\\Collection::inject` method\n* Adding a response_body location to service descriptions\n\n## 3.0.6 - 2012-12-09\n\n* CurlMulti performance improvements\n* Adding setErrorResponses() to Operation\n* composer.json tweaks\n\n## 3.0.5 - 2012-11-18\n\n* Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin\n* Bug: Response body can now be a string containing \"0\"\n* Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert\n* Bug: QueryString::fromString now properly parses query string parameters that contain equal signs\n* Added support for XML attributes in service description responses\n* DefaultRequestSerializer now supports array URI parameter values for URI template expansion\n* Added better mimetype guessing to requests and post files\n\n## 3.0.4 - 2012-11-11\n\n* Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value\n* Bug: Cookies can now be added that have a name, domain, or value set to \"0\"\n* Bug: Using the system cacert bundle when using the Phar\n* Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures\n* Enhanced cookie jar de-duplication\n* Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added\n* Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies\n* Added the ability to create any sort of hash for a stream rather than just an MD5 hash\n\n## 3.0.3 - 2012-11-04\n\n* Implementing redirects in PHP rather than cURL\n* Added PECL URI template extension and using as default parser if available\n* Bug: Fixed Content-Length parsing of Response factory\n* Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams.\n* Adding ToArrayInterface throughout library\n* Fixing OauthPlugin to create unique nonce values per request\n\n## 3.0.2 - 2012-10-25\n\n* Magic methods are enabled by default on clients\n* Magic methods return the result of a command\n* Service clients no longer require a base_url option in the factory\n* Bug: Fixed an issue with URI templates where null template variables were being expanded\n\n## 3.0.1 - 2012-10-22\n\n* Models can now be used like regular collection objects by calling filter, map, etc.\n* Models no longer require a Parameter structure or initial data in the constructor\n* Added a custom AppendIterator to get around a PHP bug with the `\\AppendIterator`\n\n## 3.0.0 - 2012-10-15\n\n* Rewrote service description format to be based on Swagger\n    * Now based on JSON schema\n    * Added nested input structures and nested response models\n    * Support for JSON and XML input and output models\n    * Renamed `commands` to `operations`\n    * Removed dot class notation\n    * Removed custom types\n* Broke the project into smaller top-level namespaces to be more component friendly\n* Removed support for XML configs and descriptions. Use arrays or JSON files.\n* Removed the Validation component and Inspector\n* Moved all cookie code to Guzzle\\Plugin\\Cookie\n* Magic methods on a Guzzle\\Service\\Client now return the command un-executed.\n* Calling getResult() or getResponse() on a command will lazily execute the command if needed.\n* Now shipping with cURL's CA certs and using it by default\n* Added previousResponse() method to response objects\n* No longer sending Accept and Accept-Encoding headers on every request\n* Only sending an Expect header by default when a payload is greater than 1MB\n* Added/moved client options:\n    * curl.blacklist to curl.option.blacklist\n    * Added ssl.certificate_authority\n* Added a Guzzle\\Iterator component\n* Moved plugins from Guzzle\\Http\\Plugin to Guzzle\\Plugin\n* Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin)\n* Added a more robust caching plugin\n* Added setBody to response objects\n* Updating LogPlugin to use a more flexible MessageFormatter\n* Added a completely revamped build process\n* Cleaning up Collection class and removing default values from the get method\n* Fixed ZF2 cache adapters\n\n## 2.8.8 - 2012-10-15\n\n* Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did\n\n## 2.8.7 - 2012-09-30\n\n* Bug: Fixed config file aliases for JSON includes\n* Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests\n* Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload\n* Bug: Hardening request and response parsing to account for missing parts\n* Bug: Fixed PEAR packaging\n* Bug: Fixed Request::getInfo\n* Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail\n* Adding the ability for the namespace Iterator factory to look in multiple directories\n* Added more getters/setters/removers from service descriptions\n* Added the ability to remove POST fields from OAuth signatures\n* OAuth plugin now supports 2-legged OAuth\n\n## 2.8.6 - 2012-09-05\n\n* Added the ability to modify and build service descriptions\n* Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command\n* Added a `json` parameter location\n* Now allowing dot notation for classes in the CacheAdapterFactory\n* Using the union of two arrays rather than an array_merge when extending service builder services and service params\n* Ensuring that a service is a string before doing strpos() checks on it when substituting services for references\n  in service builder config files.\n* Services defined in two different config files that include one another will by default replace the previously\n  defined service, but you can now create services that extend themselves and merge their settings over the previous\n* The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like\n  '_default' with a default JSON configuration file.\n\n## 2.8.5 - 2012-08-29\n\n* Bug: Suppressed empty arrays from URI templates\n* Bug: Added the missing $options argument from ServiceDescription::factory to enable caching\n* Added support for HTTP responses that do not contain a reason phrase in the start-line\n* AbstractCommand commands are now invokable\n* Added a way to get the data used when signing an Oauth request before a request is sent\n\n## 2.8.4 - 2012-08-15\n\n* Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin\n* 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.\n* Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\\Common\\Stream\n* Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream\n* Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5())\n* Added additional response status codes\n* Removed SSL information from the default User-Agent header\n* DELETE requests can now send an entity body\n* Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries\n* Added the ability of the MockPlugin to consume mocked request bodies\n* LogPlugin now exposes request and response objects in the extras array\n\n## 2.8.3 - 2012-07-30\n\n* Bug: Fixed a case where empty POST requests were sent as GET requests\n* Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body\n* Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new\n* Added multiple inheritance to service description commands\n* Added an ApiCommandInterface and added `getParamNames()` and `hasParam()`\n* Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything\n* Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles\n\n## 2.8.2 - 2012-07-24\n\n* Bug: Query string values set to 0 are no longer dropped from the query string\n* Bug: A Collection object is no longer created each time a call is made to `Guzzle\\Service\\Command\\AbstractCommand::getRequestHeaders()`\n* Bug: `+` is now treated as an encoded space when parsing query strings\n* QueryString and Collection performance improvements\n* Allowing dot notation for class paths in filters attribute of a service descriptions\n\n## 2.8.1 - 2012-07-16\n\n* Loosening Event Dispatcher dependency\n* POST redirects can now be customized using CURLOPT_POSTREDIR\n\n## 2.8.0 - 2012-07-15\n\n* BC: Guzzle\\Http\\Query\n    * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl)\n    * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding()\n    * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool)\n    * Changed the aggregation functions of QueryString to be static methods\n    * Can now use fromString() with querystrings that have a leading ?\n* cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters\n* Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body\n* Cookies are no longer URL decoded by default\n* Bug: URI template variables set to null are no longer expanded\n\n## 2.7.2 - 2012-07-02\n\n* BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\\Http\\Parser to Guzzle\\Parser.\n* BC: Removing Guzzle\\Common\\Batch\\Batch::count() and replacing it with isEmpty()\n* CachePlugin now allows for a custom request parameter function to check if a request can be cached\n* Bug fix: CachePlugin now only caches GET and HEAD requests by default\n* Bug fix: Using header glue when transferring headers over the wire\n* Allowing deeply nested arrays for composite variables in URI templates\n* Batch divisors can now return iterators or arrays\n\n## 2.7.1 - 2012-06-26\n\n* Minor patch to update version number in UA string\n* Updating build process\n\n## 2.7.0 - 2012-06-25\n\n* BC: Inflection classes moved to Guzzle\\Inflection. No longer static methods. Can now inject custom inflectors into classes.\n* BC: Removed magic setX methods from commands\n* BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method\n* Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable.\n* Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity)\n* Guzzle\\Service\\Resource\\ResourceIteratorApplyBatched now internally uses the Guzzle\\Common\\Batch namespace\n* Added Guzzle\\Service\\Plugin namespace and a PluginCollectionPlugin\n* Added the ability to set POST fields and files in a service description\n* Guzzle\\Http\\EntityBody::factory() now accepts objects with a __toString() method\n* Adding a command.before_prepare event to clients\n* Added BatchClosureTransfer and BatchClosureDivisor\n* BatchTransferException now includes references to the batch divisor and transfer strategies\n* Fixed some tests so that they pass more reliably\n* Added Guzzle\\Common\\Log\\ArrayLogAdapter\n\n## 2.6.6 - 2012-06-10\n\n* BC: Removing Guzzle\\Http\\Plugin\\BatchQueuePlugin\n* BC: Removing Guzzle\\Service\\Command\\CommandSet\n* Adding generic batching system (replaces the batch queue plugin and command set)\n* Updating ZF cache and log adapters and now using ZF's composer repository\n* Bug: Setting the name of each ApiParam when creating through an ApiCommand\n* Adding result_type, result_doc, deprecated, and doc_url to service descriptions\n* Bug: Changed the default cookie header casing back to 'Cookie'\n\n## 2.6.5 - 2012-06-03\n\n* BC: Renaming Guzzle\\Http\\Message\\RequestInterface::getResourceUri() to getResource()\n* BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from\n* BC: Guzzle\\Http\\Cookie is now used to manage Set-Cookie data, not Cookie data\n* BC: Renaming methods in the CookieJarInterface\n* Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations\n* Making the default glue for HTTP headers ';' instead of ','\n* Adding a removeValue to Guzzle\\Http\\Message\\Header\n* Adding getCookies() to request interface.\n* Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber()\n\n## 2.6.4 - 2012-05-30\n\n* BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class.\n* BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand\n* Bug: Fixing magic method command calls on clients\n* Bug: Email constraint only validates strings\n* Bug: Aggregate POST fields when POST files are present in curl handle\n* Bug: Fixing default User-Agent header\n* Bug: Only appending or prepending parameters in commands if they are specified\n* Bug: Not requiring response reason phrases or status codes to match a predefined list of codes\n* Allowing the use of dot notation for class namespaces when using instance_of constraint\n* Added any_match validation constraint\n* Added an AsyncPlugin\n* Passing request object to the calculateWait method of the ExponentialBackoffPlugin\n* Allowing the result of a command object to be changed\n* Parsing location and type sub values when instantiating a service description rather than over and over at runtime\n\n## 2.6.3 - 2012-05-23\n\n* [BC] Guzzle\\Common\\FromConfigInterface no longer requires any config options.\n* [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields.\n* You can now use an array of data when creating PUT request bodies in the request factory.\n* Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable.\n* [Http] Adding support for Content-Type in multipart POST uploads per upload\n* [Http] Added support for uploading multiple files using the same name (foo[0], foo[1])\n* Adding more POST data operations for easier manipulation of POST data.\n* You can now set empty POST fields.\n* The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files.\n* Split the Guzzle\\Service\\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate.\n* CS updates\n\n## 2.6.2 - 2012-05-19\n\n* [Http] Better handling of nested scope requests in CurlMulti.  Requests are now always prepares in the send() method rather than the addRequest() method.\n\n## 2.6.1 - 2012-05-19\n\n* [BC] Removing 'path' support in service descriptions.  Use 'uri'.\n* [BC] Guzzle\\Service\\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache.\n* [BC] Removing Guzzle\\Common\\NullObject.  Use https://github.com/mtdowling/NullObject if you need it.\n* [BC] Removing Guzzle\\Common\\XmlElement.\n* All commands, both dynamic and concrete, have ApiCommand objects.\n* Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits.\n* Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored.\n* Making the method signature of Guzzle\\Service\\Builder\\ServiceBuilder::factory more flexible.\n\n## 2.6.0 - 2012-05-15\n\n* [BC] Moving Guzzle\\Service\\Builder to Guzzle\\Service\\Builder\\ServiceBuilder\n* [BC] Executing a Command returns the result of the command rather than the command\n* [BC] Moving all HTTP parsing logic to Guzzle\\Http\\Parsers. Allows for faster C implementations if needed.\n* [BC] Changing the Guzzle\\Http\\Message\\Response::setProtocol() method to accept a protocol and version in separate args.\n* [BC] Moving ResourceIterator* to Guzzle\\Service\\Resource\n* [BC] Completely refactored ResourceIterators to iterate over a cloned command object\n* [BC] Moved Guzzle\\Http\\UriTemplate to Guzzle\\Http\\Parser\\UriTemplate\\UriTemplate\n* [BC] Guzzle\\Guzzle is now deprecated\n* Moving Guzzle\\Common\\Guzzle::inject to Guzzle\\Common\\Collection::inject\n* Adding Guzzle\\Version class to give version information about Guzzle\n* Adding Guzzle\\Http\\Utils class to provide getDefaultUserAgent() and getHttpDate()\n* Adding Guzzle\\Curl\\CurlVersion to manage caching curl_version() data\n* ServiceDescription and ServiceBuilder are now cacheable using similar configs\n* Changing the format of XML and JSON service builder configs.  Backwards compatible.\n* Cleaned up Cookie parsing\n* Trimming the default Guzzle User-Agent header\n* Adding a setOnComplete() method to Commands that is called when a command completes\n* Keeping track of requests that were mocked in the MockPlugin\n* Fixed a caching bug in the CacheAdapterFactory\n* Inspector objects can be injected into a Command object\n* Refactoring a lot of code and tests to be case insensitive when dealing with headers\n* Adding Guzzle\\Http\\Message\\HeaderComparison for easy comparison of HTTP headers using a DSL\n* Adding the ability to set global option overrides to service builder configs\n* Adding the ability to include other service builder config files from within XML and JSON files\n* Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method.\n\n## 2.5.0 - 2012-05-08\n\n* Major performance improvements\n* [BC] Simplifying Guzzle\\Common\\Collection.  Please check to see if you are using features that are now deprecated.\n* [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component.\n* [BC] No longer supporting \"{{ }}\" for injecting into command or UriTemplates.  Use \"{}\"\n* Added the ability to passed parameters to all requests created by a client\n* Added callback functionality to the ExponentialBackoffPlugin\n* Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies.\n* Rewinding request stream bodies when retrying requests\n* Exception is thrown when JSON response body cannot be decoded\n* Added configurable magic method calls to clients and commands.  This is off by default.\n* Fixed a defect that added a hash to every parsed URL part\n* Fixed duplicate none generation for OauthPlugin.\n* Emitting an event each time a client is generated by a ServiceBuilder\n* Using an ApiParams object instead of a Collection for parameters of an ApiCommand\n* cache.* request parameters should be renamed to params.cache.*\n* Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle.\n* Added the ability to disable type validation of service descriptions\n* ServiceDescriptions and ServiceBuilders are now Serializable\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/Dockerfile",
    "content": "FROM composer:latest as setup\n\nRUN mkdir /guzzle\n\nWORKDIR /guzzle\n\nRUN set -xe \\\n    && composer init --name=guzzlehttp/test --description=\"Simple project for testing Guzzle scripts\" --author=\"Márk Sági-Kazár <mark.sagikazar@gmail.com>\" --no-interaction \\\n    && composer require guzzlehttp/guzzle\n\n\nFROM php:7.3\n\nRUN mkdir /guzzle\n\nWORKDIR /guzzle\n\nCOPY --from=setup /guzzle /guzzle\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/LICENSE",
    "content": "Copyright (c) 2011-2018 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/README.md",
    "content": "Guzzle, PHP HTTP client\n=======================\n\n[![Latest Version](https://img.shields.io/github/release/guzzle/guzzle.svg?style=flat-square)](https://github.com/guzzle/guzzle/releases)\n[![Build Status](https://img.shields.io/travis/guzzle/guzzle.svg?style=flat-square)](https://travis-ci.org/guzzle/guzzle)\n[![Total Downloads](https://img.shields.io/packagist/dt/guzzlehttp/guzzle.svg?style=flat-square)](https://packagist.org/packages/guzzlehttp/guzzle)\n\nGuzzle is a PHP HTTP client that makes it easy to send HTTP requests and\ntrivial to integrate with web services.\n\n- Simple interface for building query strings, POST requests, streaming large\n  uploads, streaming large downloads, using HTTP cookies, uploading JSON data,\n  etc...\n- Can send both synchronous and asynchronous requests using the same interface.\n- Uses PSR-7 interfaces for requests, responses, and streams. This allows you\n  to utilize other PSR-7 compatible libraries with Guzzle.\n- Abstracts away the underlying HTTP transport, allowing you to write\n  environment and transport agnostic code; i.e., no hard dependency on cURL,\n  PHP streams, sockets, or non-blocking event loops.\n- Middleware system allows you to augment and compose client behavior.\n\n```php\n$client = new \\GuzzleHttp\\Client();\n$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');\n\necho $response->getStatusCode(); # 200\necho $response->getHeaderLine('content-type'); # 'application/json; charset=utf8'\necho $response->getBody(); # '{\"id\": 1420053, \"name\": \"guzzle\", ...}'\n\n# Send an asynchronous request.\n$request = new \\GuzzleHttp\\Psr7\\Request('GET', 'http://httpbin.org');\n$promise = $client->sendAsync($request)->then(function ($response) {\n    echo 'I completed! ' . $response->getBody();\n});\n\n$promise->wait();\n```\n\n## Help and docs\n\n- [Documentation](http://guzzlephp.org/)\n- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle)\n- [Gitter](https://gitter.im/guzzle/guzzle)\n\n\n## Installing Guzzle\n\nThe recommended way to install Guzzle is through\n[Composer](http://getcomposer.org).\n\n```bash\n# Install Composer\ncurl -sS https://getcomposer.org/installer | php\n```\n\nNext, run the Composer command to install the latest stable version of Guzzle:\n\n```bash\ncomposer require guzzlehttp/guzzle\n```\n\nAfter installing, you need to require Composer's autoloader:\n\n```php\nrequire 'vendor/autoload.php';\n```\n\nYou can then later update Guzzle using composer:\n\n ```bash\ncomposer update\n ```\n\n\n## Version Guidance\n\n| Version | Status     | Packagist           | Namespace    | Repo                | Docs                | PSR-7 | PHP Version |\n|---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------|\n| 3.x     | EOL        | `guzzle/guzzle`     | `Guzzle`     | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No    | >= 5.3.3    |\n| 4.x     | EOL        | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A                 | No    | >= 5.4      |\n| 5.x     | EOL        | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No    | >= 5.4      |\n| 6.x     | Latest     | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes   | >= 5.5      |\n\n[guzzle-3-repo]: https://github.com/guzzle/guzzle3\n[guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x\n[guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3\n[guzzle-6-repo]: https://github.com/guzzle/guzzle\n[guzzle-3-docs]: http://guzzle3.readthedocs.org\n[guzzle-5-docs]: http://guzzle.readthedocs.org/en/5.3/\n[guzzle-6-docs]: http://guzzle.readthedocs.org/en/latest/\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/UPGRADING.md",
    "content": "Guzzle Upgrade Guide\n====================\n\n5.0 to 6.0\n----------\n\nGuzzle now uses [PSR-7](http://www.php-fig.org/psr/psr-7/) for HTTP messages.\nDue to the fact that these messages are immutable, this prompted a refactoring\nof Guzzle to use a middleware based system rather than an event system. Any\nHTTP message interaction (e.g., `GuzzleHttp\\Message\\Request`) need to be\nupdated to work with the new immutable PSR-7 request and response objects. Any\nevent listeners or subscribers need to be updated to become middleware\nfunctions that wrap handlers (or are injected into a\n`GuzzleHttp\\HandlerStack`).\n\n- Removed `GuzzleHttp\\BatchResults`\n- Removed `GuzzleHttp\\Collection`\n- Removed `GuzzleHttp\\HasDataTrait`\n- Removed `GuzzleHttp\\ToArrayInterface`\n- The `guzzlehttp/streams` dependency has been removed. Stream functionality\n  is now present in the `GuzzleHttp\\Psr7` namespace provided by the\n  `guzzlehttp/psr7` package.\n- Guzzle no longer uses ReactPHP promises and now uses the\n  `guzzlehttp/promises` library. We use a custom promise library for three\n  significant reasons:\n  1. React promises (at the time of writing this) are recursive. Promise\n     chaining and promise resolution will eventually blow the stack. Guzzle\n     promises are not recursive as they use a sort of trampolining technique.\n     Note: there has been movement in the React project to modify promises to\n     no longer utilize recursion.\n  2. Guzzle needs to have the ability to synchronously block on a promise to\n     wait for a result. Guzzle promises allows this functionality (and does\n     not require the use of recursion).\n  3. Because we need to be able to wait on a result, doing so using React\n     promises requires wrapping react promises with RingPHP futures. This\n     overhead is no longer needed, reducing stack sizes, reducing complexity,\n     and improving performance.\n- `GuzzleHttp\\Mimetypes` has been moved to a function in\n  `GuzzleHttp\\Psr7\\mimetype_from_extension` and\n  `GuzzleHttp\\Psr7\\mimetype_from_filename`.\n- `GuzzleHttp\\Query` and `GuzzleHttp\\QueryParser` have been removed. Query\n  strings must now be passed into request objects as strings, or provided to\n  the `query` request option when creating requests with clients. The `query`\n  option uses PHP's `http_build_query` to convert an array to a string. If you\n  need a different serialization technique, you will need to pass the query\n  string in as a string. There are a couple helper functions that will make\n  working with query strings easier: `GuzzleHttp\\Psr7\\parse_query` and\n  `GuzzleHttp\\Psr7\\build_query`.\n- Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware\n  system based on PSR-7, using RingPHP and it's middleware system as well adds\n  more complexity than the benefits it provides. All HTTP handlers that were\n  present in RingPHP have been modified to work directly with PSR-7 messages\n  and placed in the `GuzzleHttp\\Handler` namespace. This significantly reduces\n  complexity in Guzzle, removes a dependency, and improves performance. RingPHP\n  will be maintained for Guzzle 5 support, but will no longer be a part of\n  Guzzle 6.\n- As Guzzle now uses a middleware based systems the event system and RingPHP\n  integration has been removed. Note: while the event system has been removed,\n  it is possible to add your own type of event system that is powered by the\n  middleware system.\n  - Removed the `Event` namespace.\n  - Removed the `Subscriber` namespace.\n  - Removed `Transaction` class\n  - Removed `RequestFsm`\n  - Removed `RingBridge`\n  - `GuzzleHttp\\Subscriber\\Cookie` is now provided by\n    `GuzzleHttp\\Middleware::cookies`\n  - `GuzzleHttp\\Subscriber\\HttpError` is now provided by\n    `GuzzleHttp\\Middleware::httpError`\n  - `GuzzleHttp\\Subscriber\\History` is now provided by\n    `GuzzleHttp\\Middleware::history`\n  - `GuzzleHttp\\Subscriber\\Mock` is now provided by\n    `GuzzleHttp\\Handler\\MockHandler`\n  - `GuzzleHttp\\Subscriber\\Prepare` is now provided by\n    `GuzzleHttp\\PrepareBodyMiddleware`\n  - `GuzzleHttp\\Subscriber\\Redirect` is now provided by\n    `GuzzleHttp\\RedirectMiddleware`\n- Guzzle now uses `Psr\\Http\\Message\\UriInterface` (implements in\n  `GuzzleHttp\\Psr7\\Uri`) for URI support. `GuzzleHttp\\Url` is now gone.\n- Static functions in `GuzzleHttp\\Utils` have been moved to namespaced\n  functions under the `GuzzleHttp` namespace. This requires either a Composer\n  based autoloader or you to include functions.php.\n- `GuzzleHttp\\ClientInterface::getDefaultOption` has been renamed to\n  `GuzzleHttp\\ClientInterface::getConfig`.\n- `GuzzleHttp\\ClientInterface::setDefaultOption` has been removed.\n- The `json` and `xml` methods of response objects has been removed. With the\n  migration to strictly adhering to PSR-7 as the interface for Guzzle messages,\n  adding methods to message interfaces would actually require Guzzle messages\n  to extend from PSR-7 messages rather then work with them directly.\n\n## Migrating to middleware\n\nThe change to PSR-7 unfortunately required significant refactoring to Guzzle\ndue to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event\nsystem from plugins. The event system relied on mutability of HTTP messages and\nside effects in order to work. With immutable messages, you have to change your\nworkflow to become more about either returning a value (e.g., functional\nmiddlewares) or setting a value on an object. Guzzle v6 has chosen the\nfunctional middleware approach.\n\nInstead of using the event system to listen for things like the `before` event,\nyou now create a stack based middleware function that intercepts a request on\nthe way in and the promise of the response on the way out. This is a much\nsimpler and more predictable approach than the event system and works nicely\nwith PSR-7 middleware. Due to the use of promises, the middleware system is\nalso asynchronous.\n\nv5:\n\n```php\nuse GuzzleHttp\\Event\\BeforeEvent;\n$client = new GuzzleHttp\\Client();\n// Get the emitter and listen to the before event.\n$client->getEmitter()->on('before', function (BeforeEvent $e) {\n    // Guzzle v5 events relied on mutation\n    $e->getRequest()->setHeader('X-Foo', 'Bar');\n});\n```\n\nv6:\n\nIn v6, you can modify the request before it is sent using the `mapRequest`\nmiddleware. The idiomatic way in v6 to modify the request/response lifecycle is\nto setup a handler middleware stack up front and inject the handler into a\nclient.\n\n```php\nuse GuzzleHttp\\Middleware;\n// Create a handler stack that has all of the default middlewares attached\n$handler = GuzzleHttp\\HandlerStack::create();\n// Push the handler onto the handler stack\n$handler->push(Middleware::mapRequest(function (RequestInterface $request) {\n    // Notice that we have to return a request object\n    return $request->withHeader('X-Foo', 'Bar');\n}));\n// Inject the handler into the client\n$client = new GuzzleHttp\\Client(['handler' => $handler]);\n```\n\n## POST Requests\n\nThis version added the [`form_params`](http://guzzle.readthedocs.org/en/latest/request-options.html#form_params)\nand `multipart` request options. `form_params` is an associative array of\nstrings or array of strings and is used to serialize an\n`application/x-www-form-urlencoded` POST request. The\n[`multipart`](http://guzzle.readthedocs.org/en/latest/request-options.html#multipart)\noption is now used to send a multipart/form-data POST request.\n\n`GuzzleHttp\\Post\\PostFile` has been removed. Use the `multipart` option to add\nPOST files to a multipart/form-data request.\n\nThe `body` option no longer accepts an array to send POST requests. Please use\n`multipart` or `form_params` instead.\n\nThe `base_url` option has been renamed to `base_uri`.\n\n4.x to 5.0\n----------\n\n## Rewritten Adapter Layer\n\nGuzzle now uses [RingPHP](http://ringphp.readthedocs.org/en/latest) to send\nHTTP requests. The `adapter` option in a `GuzzleHttp\\Client` constructor\nis still supported, but it has now been renamed to `handler`. Instead of\npassing a `GuzzleHttp\\Adapter\\AdapterInterface`, you must now pass a PHP\n`callable` that follows the RingPHP specification.\n\n## Removed Fluent Interfaces\n\n[Fluent interfaces were removed](http://ocramius.github.io/blog/fluent-interfaces-are-evil)\nfrom the following classes:\n\n- `GuzzleHttp\\Collection`\n- `GuzzleHttp\\Url`\n- `GuzzleHttp\\Query`\n- `GuzzleHttp\\Post\\PostBody`\n- `GuzzleHttp\\Cookie\\SetCookie`\n\n## Removed functions.php\n\nRemoved \"functions.php\", so that Guzzle is truly PSR-4 compliant. The following\nfunctions can be used as replacements.\n\n- `GuzzleHttp\\json_decode` -> `GuzzleHttp\\Utils::jsonDecode`\n- `GuzzleHttp\\get_path` -> `GuzzleHttp\\Utils::getPath`\n- `GuzzleHttp\\Utils::setPath` -> `GuzzleHttp\\set_path`\n- `GuzzleHttp\\Pool::batch` -> `GuzzleHttp\\batch`. This function is, however,\n  deprecated in favor of using `GuzzleHttp\\Pool::batch()`.\n\nThe \"procedural\" global client has been removed with no replacement (e.g.,\n`GuzzleHttp\\get()`, `GuzzleHttp\\post()`, etc.). Use a `GuzzleHttp\\Client`\nobject as a replacement.\n\n## `throwImmediately` has been removed\n\nThe concept of \"throwImmediately\" has been removed from exceptions and error\nevents. This control mechanism was used to stop a transfer of concurrent\nrequests from completing. This can now be handled by throwing the exception or\nby cancelling a pool of requests or each outstanding future request\nindividually.\n\n## headers event has been removed\n\nRemoved the \"headers\" event. This event was only useful for changing the\nbody a response once the headers of the response were known. You can implement\na similar behavior in a number of ways. One example might be to use a\nFnStream that has access to the transaction being sent. For example, when the\nfirst byte is written, you could check if the response headers match your\nexpectations, and if so, change the actual stream body that is being\nwritten to.\n\n## Updates to HTTP Messages\n\nRemoved the `asArray` parameter from\n`GuzzleHttp\\Message\\MessageInterface::getHeader`. If you want to get a header\nvalue as an array, then use the newly added `getHeaderAsArray()` method of\n`MessageInterface`. This change makes the Guzzle interfaces compatible with\nthe PSR-7 interfaces.\n\n3.x to 4.0\n----------\n\n## Overarching changes:\n\n- Now requires PHP 5.4 or greater.\n- No longer requires cURL to send requests.\n- Guzzle no longer wraps every exception it throws. Only exceptions that are\n  recoverable are now wrapped by Guzzle.\n- Various namespaces have been removed or renamed.\n- No longer requiring the Symfony EventDispatcher. A custom event dispatcher\n  based on the Symfony EventDispatcher is\n  now utilized in `GuzzleHttp\\Event\\EmitterInterface` (resulting in significant\n  speed and functionality improvements).\n\nChanges per Guzzle 3.x namespace are described below.\n\n## Batch\n\nThe `Guzzle\\Batch` namespace has been removed. This is best left to\nthird-parties to implement on top of Guzzle's core HTTP library.\n\n## Cache\n\nThe `Guzzle\\Cache` namespace has been removed. (Todo: No suitable replacement\nhas been implemented yet, but hoping to utilize a PSR cache interface).\n\n## Common\n\n- Removed all of the wrapped exceptions. It's better to use the standard PHP\n  library for unrecoverable exceptions.\n- `FromConfigInterface` has been removed.\n- `Guzzle\\Common\\Version` has been removed. The VERSION constant can be found\n  at `GuzzleHttp\\ClientInterface::VERSION`.\n\n### Collection\n\n- `getAll` has been removed. Use `toArray` to convert a collection to an array.\n- `inject` has been removed.\n- `keySearch` has been removed.\n- `getPath` no longer supports wildcard expressions. Use something better like\n  JMESPath for this.\n- `setPath` now supports appending to an existing array via the `[]` notation.\n\n### Events\n\nGuzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses\n`GuzzleHttp\\Event\\Emitter`.\n\n- `Symfony\\Component\\EventDispatcher\\EventDispatcherInterface` is replaced by\n  `GuzzleHttp\\Event\\EmitterInterface`.\n- `Symfony\\Component\\EventDispatcher\\EventDispatcher` is replaced by\n  `GuzzleHttp\\Event\\Emitter`.\n- `Symfony\\Component\\EventDispatcher\\Event` is replaced by\n  `GuzzleHttp\\Event\\Event`, and Guzzle now has an EventInterface in\n  `GuzzleHttp\\Event\\EventInterface`.\n- `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and\n  `HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the\n  event emitter of a request, client, etc. now uses the `getEmitter` method\n  rather than the `getDispatcher` method.\n\n#### Emitter\n\n- Use the `once()` method to add a listener that automatically removes itself\n  the first time it is invoked.\n- Use the `listeners()` method to retrieve a list of event listeners rather than\n  the `getListeners()` method.\n- Use `emit()` instead of `dispatch()` to emit an event from an emitter.\n- Use `attach()` instead of `addSubscriber()` and `detach()` instead of\n  `removeSubscriber()`.\n\n```php\n$mock = new Mock();\n// 3.x\n$request->getEventDispatcher()->addSubscriber($mock);\n$request->getEventDispatcher()->removeSubscriber($mock);\n// 4.x\n$request->getEmitter()->attach($mock);\n$request->getEmitter()->detach($mock);\n```\n\nUse the `on()` method to add a listener rather than the `addListener()` method.\n\n```php\n// 3.x\n$request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } );\n// 4.x\n$request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } );\n```\n\n## Http\n\n### General changes\n\n- The cacert.pem certificate has been moved to `src/cacert.pem`.\n- Added the concept of adapters that are used to transfer requests over the\n  wire.\n- Simplified the event system.\n- Sending requests in parallel is still possible, but batching is no longer a\n  concept of the HTTP layer. Instead, you must use the `complete` and `error`\n  events to asynchronously manage parallel request transfers.\n- `Guzzle\\Http\\Url` has moved to `GuzzleHttp\\Url`.\n- `Guzzle\\Http\\QueryString` has moved to `GuzzleHttp\\Query`.\n- QueryAggregators have been rewritten so that they are simply callable\n  functions.\n- `GuzzleHttp\\StaticClient` has been removed. Use the functions provided in\n  `functions.php` for an easy to use static client instance.\n- Exceptions in `GuzzleHttp\\Exception` have been updated to all extend from\n  `GuzzleHttp\\Exception\\TransferException`.\n\n### Client\n\nCalling methods like `get()`, `post()`, `head()`, etc. no longer create and\nreturn a request, but rather creates a request, sends the request, and returns\nthe response.\n\n```php\n// 3.0\n$request = $client->get('/');\n$response = $request->send();\n\n// 4.0\n$response = $client->get('/');\n\n// or, to mirror the previous behavior\n$request = $client->createRequest('GET', '/');\n$response = $client->send($request);\n```\n\n`GuzzleHttp\\ClientInterface` has changed.\n\n- The `send` method no longer accepts more than one request. Use `sendAll` to\n  send multiple requests in parallel.\n- `setUserAgent()` has been removed. Use a default request option instead. You\n  could, for example, do something like:\n  `$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`.\n- `setSslVerification()` has been removed. Use default request options instead,\n  like `$client->setConfig('defaults/verify', true)`.\n\n`GuzzleHttp\\Client` has changed.\n\n- The constructor now accepts only an associative array. You can include a\n  `base_url` string or array to use a URI template as the base URL of a client.\n  You can also specify a `defaults` key that is an associative array of default\n  request options. You can pass an `adapter` to use a custom adapter,\n  `batch_adapter` to use a custom adapter for sending requests in parallel, or\n  a `message_factory` to change the factory used to create HTTP requests and\n  responses.\n- The client no longer emits a `client.create_request` event.\n- Creating requests with a client no longer automatically utilize a URI\n  template. You must pass an array into a creational method (e.g.,\n  `createRequest`, `get`, `put`, etc.) in order to expand a URI template.\n\n### Messages\n\nMessages no longer have references to their counterparts (i.e., a request no\nlonger has a reference to it's response, and a response no loger has a\nreference to its request). This association is now managed through a\n`GuzzleHttp\\Adapter\\TransactionInterface` object. You can get references to\nthese transaction objects using request events that are emitted over the\nlifecycle of a request.\n\n#### Requests with a body\n\n- `GuzzleHttp\\Message\\EntityEnclosingRequest` and\n  `GuzzleHttp\\Message\\EntityEnclosingRequestInterface` have been removed. The\n  separation between requests that contain a body and requests that do not\n  contain a body has been removed, and now `GuzzleHttp\\Message\\RequestInterface`\n  handles both use cases.\n- Any method that previously accepts a `GuzzleHttp\\Response` object now accept a\n  `GuzzleHttp\\Message\\ResponseInterface`.\n- `GuzzleHttp\\Message\\RequestFactoryInterface` has been renamed to\n  `GuzzleHttp\\Message\\MessageFactoryInterface`. This interface is used to create\n  both requests and responses and is implemented in\n  `GuzzleHttp\\Message\\MessageFactory`.\n- POST field and file methods have been removed from the request object. You\n  must now use the methods made available to `GuzzleHttp\\Post\\PostBodyInterface`\n  to control the format of a POST body. Requests that are created using a\n  standard `GuzzleHttp\\Message\\MessageFactoryInterface` will automatically use\n  a `GuzzleHttp\\Post\\PostBody` body if the body was passed as an array or if\n  the method is POST and no body is provided.\n\n```php\n$request = $client->createRequest('POST', '/');\n$request->getBody()->setField('foo', 'bar');\n$request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r')));\n```\n\n#### Headers\n\n- `GuzzleHttp\\Message\\Header` has been removed. Header values are now simply\n  represented by an array of values or as a string. Header values are returned\n  as a string by default when retrieving a header value from a message. You can\n  pass an optional argument of `true` to retrieve a header value as an array\n  of strings instead of a single concatenated string.\n- `GuzzleHttp\\PostFile` and `GuzzleHttp\\PostFileInterface` have been moved to\n  `GuzzleHttp\\Post`. This interface has been simplified and now allows the\n  addition of arbitrary headers.\n- Custom headers like `GuzzleHttp\\Message\\Header\\Link` have been removed. Most\n  of the custom headers are now handled separately in specific\n  subscribers/plugins, and `GuzzleHttp\\Message\\HeaderValues::parseParams()` has\n  been updated to properly handle headers that contain parameters (like the\n  `Link` header).\n\n#### Responses\n\n- `GuzzleHttp\\Message\\Response::getInfo()` and\n  `GuzzleHttp\\Message\\Response::setInfo()` have been removed. Use the event\n  system to retrieve this type of information.\n- `GuzzleHttp\\Message\\Response::getRawHeaders()` has been removed.\n- `GuzzleHttp\\Message\\Response::getMessage()` has been removed.\n- `GuzzleHttp\\Message\\Response::calculateAge()` and other cache specific\n  methods have moved to the CacheSubscriber.\n- Header specific helper functions like `getContentMd5()` have been removed.\n  Just use `getHeader('Content-MD5')` instead.\n- `GuzzleHttp\\Message\\Response::setRequest()` and\n  `GuzzleHttp\\Message\\Response::getRequest()` have been removed. Use the event\n  system to work with request and response objects as a transaction.\n- `GuzzleHttp\\Message\\Response::getRedirectCount()` has been removed. Use the\n  Redirect subscriber instead.\n- `GuzzleHttp\\Message\\Response::isSuccessful()` and other related methods have\n  been removed. Use `getStatusCode()` instead.\n\n#### Streaming responses\n\nStreaming requests can now be created by a client directly, returning a\n`GuzzleHttp\\Message\\ResponseInterface` object that contains a body stream\nreferencing an open PHP HTTP stream.\n\n```php\n// 3.0\nuse Guzzle\\Stream\\PhpStreamRequestFactory;\n$request = $client->get('/');\n$factory = new PhpStreamRequestFactory();\n$stream = $factory->fromRequest($request);\n$data = $stream->read(1024);\n\n// 4.0\n$response = $client->get('/', ['stream' => true]);\n// Read some data off of the stream in the response body\n$data = $response->getBody()->read(1024);\n```\n\n#### Redirects\n\nThe `configureRedirects()` method has been removed in favor of a\n`allow_redirects` request option.\n\n```php\n// Standard redirects with a default of a max of 5 redirects\n$request = $client->createRequest('GET', '/', ['allow_redirects' => true]);\n\n// Strict redirects with a custom number of redirects\n$request = $client->createRequest('GET', '/', [\n    'allow_redirects' => ['max' => 5, 'strict' => true]\n]);\n```\n\n#### EntityBody\n\nEntityBody interfaces and classes have been removed or moved to\n`GuzzleHttp\\Stream`. All classes and interfaces that once required\n`GuzzleHttp\\EntityBodyInterface` now require\n`GuzzleHttp\\Stream\\StreamInterface`. Creating a new body for a request no\nlonger uses `GuzzleHttp\\EntityBody::factory` but now uses\n`GuzzleHttp\\Stream\\Stream::factory` or even better:\n`GuzzleHttp\\Stream\\create()`.\n\n- `Guzzle\\Http\\EntityBodyInterface` is now `GuzzleHttp\\Stream\\StreamInterface`\n- `Guzzle\\Http\\EntityBody` is now `GuzzleHttp\\Stream\\Stream`\n- `Guzzle\\Http\\CachingEntityBody` is now `GuzzleHttp\\Stream\\CachingStream`\n- `Guzzle\\Http\\ReadLimitEntityBody` is now `GuzzleHttp\\Stream\\LimitStream`\n- `Guzzle\\Http\\IoEmittyinEntityBody` has been removed.\n\n#### Request lifecycle events\n\nRequests previously submitted a large number of requests. The number of events\nemitted over the lifecycle of a request has been significantly reduced to make\nit easier to understand how to extend the behavior of a request. All events\nemitted during the lifecycle of a request now emit a custom\n`GuzzleHttp\\Event\\EventInterface` object that contains context providing\nmethods and a way in which to modify the transaction at that specific point in\ntime (e.g., intercept the request and set a response on the transaction).\n\n- `request.before_send` has been renamed to `before` and now emits a\n  `GuzzleHttp\\Event\\BeforeEvent`\n- `request.complete` has been renamed to `complete` and now emits a\n  `GuzzleHttp\\Event\\CompleteEvent`.\n- `request.sent` has been removed. Use `complete`.\n- `request.success` has been removed. Use `complete`.\n- `error` is now an event that emits a `GuzzleHttp\\Event\\ErrorEvent`.\n- `request.exception` has been removed. Use `error`.\n- `request.receive.status_line` has been removed.\n- `curl.callback.progress` has been removed. Use a custom `StreamInterface` to\n  maintain a status update.\n- `curl.callback.write` has been removed. Use a custom `StreamInterface` to\n  intercept writes.\n- `curl.callback.read` has been removed. Use a custom `StreamInterface` to\n  intercept reads.\n\n`headers` is a new event that is emitted after the response headers of a\nrequest have been received before the body of the response is downloaded. This\nevent emits a `GuzzleHttp\\Event\\HeadersEvent`.\n\nYou can intercept a request and inject a response using the `intercept()` event\nof a `GuzzleHttp\\Event\\BeforeEvent`, `GuzzleHttp\\Event\\CompleteEvent`, and\n`GuzzleHttp\\Event\\ErrorEvent` event.\n\nSee: http://docs.guzzlephp.org/en/latest/events.html\n\n## Inflection\n\nThe `Guzzle\\Inflection` namespace has been removed. This is not a core concern\nof Guzzle.\n\n## Iterator\n\nThe `Guzzle\\Iterator` namespace has been removed.\n\n- `Guzzle\\Iterator\\AppendIterator`, `Guzzle\\Iterator\\ChunkedIterator`, and\n  `Guzzle\\Iterator\\MethodProxyIterator` are nice, but not a core requirement of\n  Guzzle itself.\n- `Guzzle\\Iterator\\FilterIterator` is no longer needed because an equivalent\n  class is shipped with PHP 5.4.\n- `Guzzle\\Iterator\\MapIterator` is not really needed when using PHP 5.5 because\n  it's easier to just wrap an iterator in a generator that maps values.\n\nFor a replacement of these iterators, see https://github.com/nikic/iter\n\n## Log\n\nThe LogPlugin has moved to https://github.com/guzzle/log-subscriber. The\n`Guzzle\\Log` namespace has been removed. Guzzle now relies on\n`Psr\\Log\\LoggerInterface` for all logging. The MessageFormatter class has been\nmoved to `GuzzleHttp\\Subscriber\\Log\\Formatter`.\n\n## Parser\n\nThe `Guzzle\\Parser` namespace has been removed. This was previously used to\nmake it possible to plug in custom parsers for cookies, messages, URI\ntemplates, and URLs; however, this level of complexity is not needed in Guzzle\nso it has been removed.\n\n- Cookie: Cookie parsing logic has been moved to\n  `GuzzleHttp\\Cookie\\SetCookie::fromString`.\n- Message: Message parsing logic for both requests and responses has been moved\n  to `GuzzleHttp\\Message\\MessageFactory::fromMessage`. Message parsing is only\n  used in debugging or deserializing messages, so it doesn't make sense for\n  Guzzle as a library to add this level of complexity to parsing messages.\n- UriTemplate: URI template parsing has been moved to\n  `GuzzleHttp\\UriTemplate`. The Guzzle library will automatically use the PECL\n  URI template library if it is installed.\n- Url: URL parsing is now performed in `GuzzleHttp\\Url::fromString` (previously\n  it was `Guzzle\\Http\\Url::factory()`). If custom URL parsing is necessary,\n  then developers are free to subclass `GuzzleHttp\\Url`.\n\n## Plugin\n\nThe `Guzzle\\Plugin` namespace has been renamed to `GuzzleHttp\\Subscriber`.\nSeveral plugins are shipping with the core Guzzle library under this namespace.\n\n- `GuzzleHttp\\Subscriber\\Cookie`: Replaces the old CookiePlugin. Cookie jar\n  code has moved to `GuzzleHttp\\Cookie`.\n- `GuzzleHttp\\Subscriber\\History`: Replaces the old HistoryPlugin.\n- `GuzzleHttp\\Subscriber\\HttpError`: Throws errors when a bad HTTP response is\n  received.\n- `GuzzleHttp\\Subscriber\\Mock`: Replaces the old MockPlugin.\n- `GuzzleHttp\\Subscriber\\Prepare`: Prepares the body of a request just before\n  sending. This subscriber is attached to all requests by default.\n- `GuzzleHttp\\Subscriber\\Redirect`: Replaces the RedirectPlugin.\n\nThe following plugins have been removed (third-parties are free to re-implement\nthese if needed):\n\n- `GuzzleHttp\\Plugin\\Async` has been removed.\n- `GuzzleHttp\\Plugin\\CurlAuth` has been removed.\n- `GuzzleHttp\\Plugin\\ErrorResponse\\ErrorResponsePlugin` has been removed. This\n  functionality should instead be implemented with event listeners that occur\n  after normal response parsing occurs in the guzzle/command package.\n\nThe following plugins are not part of the core Guzzle package, but are provided\nin separate repositories:\n\n- `Guzzle\\Http\\Plugin\\BackoffPlugin` has been rewritten to be much simpler\n  to build custom retry policies using simple functions rather than various\n  chained classes. See: https://github.com/guzzle/retry-subscriber\n- `Guzzle\\Http\\Plugin\\Cache\\CachePlugin` has moved to\n  https://github.com/guzzle/cache-subscriber\n- `Guzzle\\Http\\Plugin\\Log\\LogPlugin` has moved to\n  https://github.com/guzzle/log-subscriber\n- `Guzzle\\Http\\Plugin\\Md5\\Md5Plugin` has moved to\n  https://github.com/guzzle/message-integrity-subscriber\n- `Guzzle\\Http\\Plugin\\Mock\\MockPlugin` has moved to\n  `GuzzleHttp\\Subscriber\\MockSubscriber`.\n- `Guzzle\\Http\\Plugin\\Oauth\\OauthPlugin` has moved to\n  https://github.com/guzzle/oauth-subscriber\n\n## Service\n\nThe service description layer of Guzzle has moved into two separate packages:\n\n- http://github.com/guzzle/command Provides a high level abstraction over web\n  services by representing web service operations using commands.\n- http://github.com/guzzle/guzzle-services Provides an implementation of\n  guzzle/command that provides request serialization and response parsing using\n  Guzzle service descriptions.\n\n## Stream\n\nStream have moved to a separate package available at\nhttps://github.com/guzzle/streams.\n\n`Guzzle\\Stream\\StreamInterface` has been given a large update to cleanly take\non the responsibilities of `Guzzle\\Http\\EntityBody` and\n`Guzzle\\Http\\EntityBodyInterface` now that they have been removed. The number\nof methods implemented by the `StreamInterface` has been drastically reduced to\nallow developers to more easily extend and decorate stream behavior.\n\n## Removed methods from StreamInterface\n\n- `getStream` and `setStream` have been removed to better encapsulate streams.\n- `getMetadata` and `setMetadata` have been removed in favor of\n  `GuzzleHttp\\Stream\\MetadataStreamInterface`.\n- `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been\n  removed. This data is accessible when\n  using streams that implement `GuzzleHttp\\Stream\\MetadataStreamInterface`.\n- `rewind` has been removed. Use `seek(0)` for a similar behavior.\n\n## Renamed methods\n\n- `detachStream` has been renamed to `detach`.\n- `feof` has been renamed to `eof`.\n- `ftell` has been renamed to `tell`.\n- `readLine` has moved from an instance method to a static class method of\n  `GuzzleHttp\\Stream\\Stream`.\n\n## Metadata streams\n\n`GuzzleHttp\\Stream\\MetadataStreamInterface` has been added to denote streams\nthat contain additional metadata accessible via `getMetadata()`.\n`GuzzleHttp\\Stream\\StreamInterface::getMetadata` and\n`GuzzleHttp\\Stream\\StreamInterface::setMetadata` have been removed.\n\n## StreamRequestFactory\n\nThe entire concept of the StreamRequestFactory has been removed. The way this\nwas used in Guzzle 3 broke the actual interface of sending streaming requests\n(instead of getting back a Response, you got a StreamInterface). Streaming\nPHP requests are now implemented through the `GuzzleHttp\\Adapter\\StreamAdapter`.\n\n3.6 to 3.7\n----------\n\n### Deprecations\n\n- You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.:\n\n```php\n\\Guzzle\\Common\\Version::$emitWarnings = true;\n```\n\nThe following APIs and options have been marked as deprecated:\n\n- Marked `Guzzle\\Http\\Message\\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead.\n- Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n- Marked `Guzzle\\Http\\Message\\Request::canCache()` as deprecated. Use `Guzzle\\Plugin\\Cache\\DefaultCanCacheStrategy->canCacheRequest()` instead.\n- Marked `Guzzle\\Http\\Message\\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.\n- Marked `Guzzle\\Http\\Message\\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.\n- Marked `Guzzle\\Cache\\CacheAdapterFactory::factory()` as deprecated\n- Marked `Guzzle\\Service\\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\\Service\\Client.\n- Marked `Guzzle\\Parser\\Url\\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.\n- Marked `Guzzle\\Common\\Collection::inject()` as deprecated.\n- Marked `Guzzle\\Plugin\\CurlAuth\\CurlAuthPlugin` as deprecated. Use\n  `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or\n  `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));`\n\n3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational\nrequest methods. When paired with a client's configuration settings, these options allow you to specify default settings\nfor various aspects of a request. Because these options make other previous configuration options redundant, several\nconfiguration options and methods of a client and AbstractCommand have been deprecated.\n\n- Marked `Guzzle\\Service\\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`.\n- Marked `Guzzle\\Service\\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`.\n- Marked 'request.params' for `Guzzle\\Http\\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')`\n- Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0\n\n        $command = $client->getCommand('foo', array(\n            'command.headers' => array('Test' => '123'),\n            'command.response_body' => '/path/to/file'\n        ));\n\n        // Should be changed to:\n\n        $command = $client->getCommand('foo', array(\n            'command.request_options' => array(\n                'headers' => array('Test' => '123'),\n                'save_as' => '/path/to/file'\n            )\n        ));\n\n### Interface changes\n\nAdditions and changes (you will need to update any implementations or subclasses you may have created):\n\n- Added an `$options` argument to the end of the following methods of `Guzzle\\Http\\ClientInterface`:\n  createRequest, head, delete, put, patch, post, options, prepareRequest\n- Added an `$options` argument to the end of `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface::createRequest()`\n- Added an `applyOptions()` method to `Guzzle\\Http\\Message\\Request\\RequestFactoryInterface`\n- Changed `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $body = null)` to\n  `Guzzle\\Http\\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a\n  resource, string, or EntityBody into the $options parameter to specify the download location of the response.\n- Changed `Guzzle\\Common\\Collection::__construct($data)` to no longer accepts a null value for `$data` but a\n  default `array()`\n- Added `Guzzle\\Stream\\StreamInterface::isRepeatable`\n- Made `Guzzle\\Http\\Client::expandTemplate` and `getUriTemplate` protected methods.\n\nThe following methods were removed from interfaces. All of these methods are still available in the concrete classes\nthat implement them, but you should update your code to use alternative methods:\n\n- Removed `Guzzle\\Http\\ClientInterface::setDefaultHeaders(). Use\n  `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or\n  `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or\n  `$client->setDefaultOption('headers/{header_name}', 'value')`. or\n  `$client->setDefaultOption('headers', array('header_name' => 'value'))`.\n- Removed `Guzzle\\Http\\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`.\n- Removed `Guzzle\\Http\\ClientInterface::expandTemplate()`. This is an implementation detail.\n- Removed `Guzzle\\Http\\ClientInterface::setRequestFactory()`. This is an implementation detail.\n- Removed `Guzzle\\Http\\ClientInterface::getCurlMulti()`. This is a very specific implementation detail.\n- Removed `Guzzle\\Http\\Message\\RequestInterface::canCache`. Use the CachePlugin.\n- Removed `Guzzle\\Http\\Message\\RequestInterface::setIsRedirect`. Use the HistoryPlugin.\n- Removed `Guzzle\\Http\\Message\\RequestInterface::isRedirect`. Use the HistoryPlugin.\n\n### Cache plugin breaking changes\n\n- CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a\n  CacheStorageInterface. These two objects and interface will be removed in a future version.\n- Always setting X-cache headers on cached responses\n- Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin\n- `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface\n  $request, Response $response);`\n- `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`\n- `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`\n- Added `CacheStorageInterface::purge($url)`\n- `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin\n  $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,\n  CanCacheStrategyInterface $canCache = null)`\n- Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`\n\n3.5 to 3.6\n----------\n\n* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.\n* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution\n* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().\n  For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader().\n  Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request.\n* Specific header implementations can be created for complex headers. When a message creates a header, it uses a\n  HeaderFactory which can map specific headers to specific header classes. There is now a Link header and\n  CacheControl header implementation.\n* Moved getLinks() from Response to just be used on a Link header object.\n\nIf you previously relied on Guzzle\\Http\\Message\\Header::raw(), then you will need to update your code to use the\nHeaderInterface (e.g. toArray(), getAll(), etc.).\n\n### Interface changes\n\n* Removed from interface: Guzzle\\Http\\ClientInterface::setUriTemplate\n* Removed from interface: Guzzle\\Http\\ClientInterface::setCurlMulti()\n* Removed Guzzle\\Http\\Message\\Request::receivedRequestHeader() and implemented this functionality in\n  Guzzle\\Http\\Curl\\RequestMediator\n* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.\n* Removed the optional $tryChunkedTransfer option from Guzzle\\Http\\Message\\EntityEnclosingRequestInterface\n* Removed the $asObjects argument from Guzzle\\Http\\Message\\MessageInterface::getHeaders()\n\n### Removed deprecated functions\n\n* Removed Guzzle\\Parser\\ParserRegister::get(). Use getParser()\n* Removed Guzzle\\Parser\\ParserRegister::set(). Use registerParser().\n\n### Deprecations\n\n* The ability to case-insensitively search for header values\n* Guzzle\\Http\\Message\\Header::hasExactHeader\n* Guzzle\\Http\\Message\\Header::raw. Use getAll()\n* Deprecated cache control specific methods on Guzzle\\Http\\Message\\AbstractMessage. Use the CacheControl header object\n  instead.\n\n### Other changes\n\n* All response header helper functions return a string rather than mixing Header objects and strings inconsistently\n* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle\n  directly via interfaces\n* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist\n  but are a no-op until removed.\n* Most classes that used to require a `Guzzle\\Service\\Command\\CommandInterface` typehint now request a\n  `Guzzle\\Service\\Command\\ArrayCommandInterface`.\n* Added `Guzzle\\Http\\Message\\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response\n  on a request while the request is still being transferred\n* `Guzzle\\Service\\Command\\CommandInterface` now extends from ToArrayInterface and ArrayAccess\n\n3.3 to 3.4\n----------\n\nBase URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs.\n\n3.2 to 3.3\n----------\n\n### Response::getEtag() quote stripping removed\n\n`Guzzle\\Http\\Message\\Response::getEtag()` no longer strips quotes around the ETag response header\n\n### Removed `Guzzle\\Http\\Utils`\n\nThe `Guzzle\\Http\\Utils` class was removed. This class was only used for testing.\n\n### Stream wrapper and type\n\n`Guzzle\\Stream\\Stream::getWrapper()` and `Guzzle\\Stream\\Stream::getStreamType()` are no longer converted to lowercase.\n\n### curl.emit_io became emit_io\n\nEmitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the\n'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'\n\n3.1 to 3.2\n----------\n\n### CurlMulti is no longer reused globally\n\nBefore 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added\nto a single client can pollute requests dispatched from other clients.\n\nIf you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the\nServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is\ncreated.\n\n```php\n$multi = new Guzzle\\Http\\Curl\\CurlMulti();\n$builder = Guzzle\\Service\\Builder\\ServiceBuilder::factory('/path/to/config.json');\n$builder->addListener('service_builder.create_client', function ($event) use ($multi) {\n    $event['client']->setCurlMulti($multi);\n}\n});\n```\n\n### No default path\n\nURLs no longer have a default path value of '/' if no path was specified.\n\nBefore:\n\n```php\n$request = $client->get('http://www.foo.com');\necho $request->getUrl();\n// >> http://www.foo.com/\n```\n\nAfter:\n\n```php\n$request = $client->get('http://www.foo.com');\necho $request->getUrl();\n// >> http://www.foo.com\n```\n\n### Less verbose BadResponseException\n\nThe exception message for `Guzzle\\Http\\Exception\\BadResponseException` no longer contains the full HTTP request and\nresponse information. You can, however, get access to the request and response object by calling `getRequest()` or\n`getResponse()` on the exception object.\n\n### Query parameter aggregation\n\nMulti-valued query parameters are no longer aggregated using a callback function. `Guzzle\\Http\\Query` now has a\nsetAggregator() method that accepts a `Guzzle\\Http\\QueryAggregator\\QueryAggregatorInterface` object. This object is\nresponsible for handling the aggregation of multi-valued query string variables into a flattened hash.\n\n2.8 to 3.x\n----------\n\n### Guzzle\\Service\\Inspector\n\nChange `\\Guzzle\\Service\\Inspector::fromConfig` to `\\Guzzle\\Common\\Collection::fromConfig`\n\n**Before**\n\n```php\nuse Guzzle\\Service\\Inspector;\n\nclass YourClient extends \\Guzzle\\Service\\Client\n{\n    public static function factory($config = array())\n    {\n        $default = array();\n        $required = array('base_url', 'username', 'api_key');\n        $config = Inspector::fromConfig($config, $default, $required);\n\n        $client = new self(\n            $config->get('base_url'),\n            $config->get('username'),\n            $config->get('api_key')\n        );\n        $client->setConfig($config);\n\n        $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));\n\n        return $client;\n    }\n```\n\n**After**\n\n```php\nuse Guzzle\\Common\\Collection;\n\nclass YourClient extends \\Guzzle\\Service\\Client\n{\n    public static function factory($config = array())\n    {\n        $default = array();\n        $required = array('base_url', 'username', 'api_key');\n        $config = Collection::fromConfig($config, $default, $required);\n\n        $client = new self(\n            $config->get('base_url'),\n            $config->get('username'),\n            $config->get('api_key')\n        );\n        $client->setConfig($config);\n\n        $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));\n\n        return $client;\n    }\n```\n\n### Convert XML Service Descriptions to JSON\n\n**Before**\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<client>\n    <commands>\n        <!-- Groups -->\n        <command name=\"list_groups\" method=\"GET\" uri=\"groups.json\">\n            <doc>Get a list of groups</doc>\n        </command>\n        <command name=\"search_groups\" method=\"GET\" uri='search.json?query=\"{{query}} type:group\"'>\n            <doc>Uses a search query to get a list of groups</doc>\n            <param name=\"query\" type=\"string\" required=\"true\" />\n        </command>\n        <command name=\"create_group\" method=\"POST\" uri=\"groups.json\">\n            <doc>Create a group</doc>\n            <param name=\"data\" type=\"array\" location=\"body\" filters=\"json_encode\" doc=\"Group JSON\"/>\n            <param name=\"Content-Type\" location=\"header\" static=\"application/json\"/>\n        </command>\n        <command name=\"delete_group\" method=\"DELETE\" uri=\"groups/{{id}}.json\">\n            <doc>Delete a group by ID</doc>\n            <param name=\"id\" type=\"integer\" required=\"true\"/>\n        </command>\n        <command name=\"get_group\" method=\"GET\" uri=\"groups/{{id}}.json\">\n            <param name=\"id\" type=\"integer\" required=\"true\"/>\n        </command>\n        <command name=\"update_group\" method=\"PUT\" uri=\"groups/{{id}}.json\">\n            <doc>Update a group</doc>\n            <param name=\"id\" type=\"integer\" required=\"true\"/>\n            <param name=\"data\" type=\"array\" location=\"body\" filters=\"json_encode\" doc=\"Group JSON\"/>\n            <param name=\"Content-Type\" location=\"header\" static=\"application/json\"/>\n        </command>\n    </commands>\n</client>\n```\n\n**After**\n\n```json\n{\n    \"name\":       \"Zendesk REST API v2\",\n    \"apiVersion\": \"2012-12-31\",\n    \"description\":\"Provides access to Zendesk views, groups, tickets, ticket fields, and users\",\n    \"operations\": {\n        \"list_groups\":  {\n            \"httpMethod\":\"GET\",\n            \"uri\":       \"groups.json\",\n            \"summary\":   \"Get a list of groups\"\n        },\n        \"search_groups\":{\n            \"httpMethod\":\"GET\",\n            \"uri\":       \"search.json?query=\\\"{query} type:group\\\"\",\n            \"summary\":   \"Uses a search query to get a list of groups\",\n            \"parameters\":{\n                \"query\":{\n                    \"location\":   \"uri\",\n                    \"description\":\"Zendesk Search Query\",\n                    \"type\":       \"string\",\n                    \"required\":   true\n                }\n            }\n        },\n        \"create_group\": {\n            \"httpMethod\":\"POST\",\n            \"uri\":       \"groups.json\",\n            \"summary\":   \"Create a group\",\n            \"parameters\":{\n                \"data\":        {\n                    \"type\":       \"array\",\n                    \"location\":   \"body\",\n                    \"description\":\"Group JSON\",\n                    \"filters\":    \"json_encode\",\n                    \"required\":   true\n                },\n                \"Content-Type\":{\n                    \"type\":    \"string\",\n                    \"location\":\"header\",\n                    \"static\":  \"application/json\"\n                }\n            }\n        },\n        \"delete_group\": {\n            \"httpMethod\":\"DELETE\",\n            \"uri\":       \"groups/{id}.json\",\n            \"summary\":   \"Delete a group\",\n            \"parameters\":{\n                \"id\":{\n                    \"location\":   \"uri\",\n                    \"description\":\"Group to delete by ID\",\n                    \"type\":       \"integer\",\n                    \"required\":   true\n                }\n            }\n        },\n        \"get_group\":    {\n            \"httpMethod\":\"GET\",\n            \"uri\":       \"groups/{id}.json\",\n            \"summary\":   \"Get a ticket\",\n            \"parameters\":{\n                \"id\":{\n                    \"location\":   \"uri\",\n                    \"description\":\"Group to get by ID\",\n                    \"type\":       \"integer\",\n                    \"required\":   true\n                }\n            }\n        },\n        \"update_group\": {\n            \"httpMethod\":\"PUT\",\n            \"uri\":       \"groups/{id}.json\",\n            \"summary\":   \"Update a group\",\n            \"parameters\":{\n                \"id\":          {\n                    \"location\":   \"uri\",\n                    \"description\":\"Group to update by ID\",\n                    \"type\":       \"integer\",\n                    \"required\":   true\n                },\n                \"data\":        {\n                    \"type\":       \"array\",\n                    \"location\":   \"body\",\n                    \"description\":\"Group JSON\",\n                    \"filters\":    \"json_encode\",\n                    \"required\":   true\n                },\n                \"Content-Type\":{\n                    \"type\":    \"string\",\n                    \"location\":\"header\",\n                    \"static\":  \"application/json\"\n                }\n            }\n        }\n}\n```\n\n### Guzzle\\Service\\Description\\ServiceDescription\n\nCommands are now called Operations\n\n**Before**\n\n```php\nuse Guzzle\\Service\\Description\\ServiceDescription;\n\n$sd = new ServiceDescription();\n$sd->getCommands();     // @returns ApiCommandInterface[]\n$sd->hasCommand($name);\n$sd->getCommand($name); // @returns ApiCommandInterface|null\n$sd->addCommand($command); // @param ApiCommandInterface $command\n```\n\n**After**\n\n```php\nuse Guzzle\\Service\\Description\\ServiceDescription;\n\n$sd = new ServiceDescription();\n$sd->getOperations();           // @returns OperationInterface[]\n$sd->hasOperation($name);\n$sd->getOperation($name);       // @returns OperationInterface|null\n$sd->addOperation($operation);  // @param OperationInterface $operation\n```\n\n### Guzzle\\Common\\Inflection\\Inflector\n\nNamespace is now `Guzzle\\Inflection\\Inflector`\n\n### Guzzle\\Http\\Plugin\n\nNamespace is now `Guzzle\\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below.\n\n### Guzzle\\Http\\Plugin\\LogPlugin and Guzzle\\Common\\Log\n\nNow `Guzzle\\Plugin\\Log\\LogPlugin` and `Guzzle\\Log` respectively.\n\n**Before**\n\n```php\nuse Guzzle\\Common\\Log\\ClosureLogAdapter;\nuse Guzzle\\Http\\Plugin\\LogPlugin;\n\n/** @var \\Guzzle\\Http\\Client */\n$client;\n\n// $verbosity is an integer indicating desired message verbosity level\n$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE);\n```\n\n**After**\n\n```php\nuse Guzzle\\Log\\ClosureLogAdapter;\nuse Guzzle\\Log\\MessageFormatter;\nuse Guzzle\\Plugin\\Log\\LogPlugin;\n\n/** @var \\Guzzle\\Http\\Client */\n$client;\n\n// $format is a string indicating desired message format -- @see MessageFormatter\n$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT);\n```\n\n### Guzzle\\Http\\Plugin\\CurlAuthPlugin\n\nNow `Guzzle\\Plugin\\CurlAuth\\CurlAuthPlugin`.\n\n### Guzzle\\Http\\Plugin\\ExponentialBackoffPlugin\n\nNow `Guzzle\\Plugin\\Backoff\\BackoffPlugin`, and other changes.\n\n**Before**\n\n```php\nuse Guzzle\\Http\\Plugin\\ExponentialBackoffPlugin;\n\n$backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge(\n        ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429)\n    ));\n\n$client->addSubscriber($backoffPlugin);\n```\n\n**After**\n\n```php\nuse Guzzle\\Plugin\\Backoff\\BackoffPlugin;\nuse Guzzle\\Plugin\\Backoff\\HttpBackoffStrategy;\n\n// Use convenient factory method instead -- see implementation for ideas of what\n// you can do with chaining backoff strategies\n$backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge(\n        HttpBackoffStrategy::getDefaultFailureCodes(), array(429)\n    ));\n$client->addSubscriber($backoffPlugin);\n```\n\n### Known Issues\n\n#### [BUG] Accept-Encoding header behavior changed unintentionally.\n\n(See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e)\n\nIn version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to\nproperly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen.\nSee issue #217 for a workaround, or use a version containing the fix.\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/composer.json",
    "content": "{\n    \"name\": \"guzzlehttp/guzzle\",\n    \"type\": \"library\",\n    \"description\": \"Guzzle is a PHP HTTP client library\",\n    \"keywords\": [\n        \"framework\",\n        \"http\",\n        \"rest\",\n        \"web service\",\n        \"curl\",\n        \"client\",\n        \"HTTP client\"\n    ],\n    \"homepage\": \"http://guzzlephp.org/\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Michael Dowling\",\n            \"email\": \"mtdowling@gmail.com\",\n            \"homepage\": \"https://github.com/mtdowling\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.5\",\n        \"ext-json\": \"*\",\n        \"symfony/polyfill-intl-idn\": \"^1.17.0\",\n        \"guzzlehttp/promises\": \"^1.0\",\n        \"guzzlehttp/psr7\": \"^1.6.1\"\n    },\n    \"require-dev\": {\n        \"ext-curl\": \"*\",\n        \"phpunit/phpunit\": \"^4.8.35 || ^5.7 || ^6.4 || ^7.0\",\n        \"psr/log\": \"^1.1\"\n    },\n    \"suggest\": {\n        \"psr/log\": \"Required for using the Log middleware\"\n    },\n    \"config\": {\n        \"sort-packages\": true\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"6.5-dev\"\n        }\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\\": \"src/\"\n        },\n        \"files\": [\n            \"src/functions_include.php\"\n        ]\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Tests\\\\\": \"tests/\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Client.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Cookie\\CookieJar;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse GuzzleHttp\\Promise;\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * @method ResponseInterface get(string|UriInterface $uri, array $options = [])\n * @method ResponseInterface head(string|UriInterface $uri, array $options = [])\n * @method ResponseInterface put(string|UriInterface $uri, array $options = [])\n * @method ResponseInterface post(string|UriInterface $uri, array $options = [])\n * @method ResponseInterface patch(string|UriInterface $uri, array $options = [])\n * @method ResponseInterface delete(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface getAsync(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface headAsync(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface putAsync(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface postAsync(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface patchAsync(string|UriInterface $uri, array $options = [])\n * @method Promise\\PromiseInterface deleteAsync(string|UriInterface $uri, array $options = [])\n */\nclass Client implements ClientInterface\n{\n    /** @var array Default request options */\n    private $config;\n\n    /**\n     * Clients accept an array of constructor parameters.\n     *\n     * Here's an example of creating a client using a base_uri and an array of\n     * default request options to apply to each request:\n     *\n     *     $client = new Client([\n     *         'base_uri'        => 'http://www.foo.com/1.0/',\n     *         'timeout'         => 0,\n     *         'allow_redirects' => false,\n     *         'proxy'           => '192.168.16.1:10'\n     *     ]);\n     *\n     * Client configuration settings include the following options:\n     *\n     * - handler: (callable) Function that transfers HTTP requests over the\n     *   wire. The function is called with a Psr7\\Http\\Message\\RequestInterface\n     *   and array of transfer options, and must return a\n     *   GuzzleHttp\\Promise\\PromiseInterface that is fulfilled with a\n     *   Psr7\\Http\\Message\\ResponseInterface on success.\n     *   If no handler is provided, a default handler will be created\n     *   that enables all of the request options below by attaching all of the\n     *   default middleware to the handler.\n     * - base_uri: (string|UriInterface) Base URI of the client that is merged\n     *   into relative URIs. Can be a string or instance of UriInterface.\n     * - **: any request option\n     *\n     * @param array $config Client configuration settings.\n     *\n     * @see \\GuzzleHttp\\RequestOptions for a list of available request options.\n     */\n    public function __construct(array $config = [])\n    {\n        if (!isset($config['handler'])) {\n            $config['handler'] = HandlerStack::create();\n        } elseif (!is_callable($config['handler'])) {\n            throw new \\InvalidArgumentException('handler must be a callable');\n        }\n\n        // Convert the base_uri to a UriInterface\n        if (isset($config['base_uri'])) {\n            $config['base_uri'] = Psr7\\uri_for($config['base_uri']);\n        }\n\n        $this->configureDefaults($config);\n    }\n\n    /**\n     * @param string $method\n     * @param array  $args\n     *\n     * @return Promise\\PromiseInterface\n     */\n    public function __call($method, $args)\n    {\n        if (count($args) < 1) {\n            throw new \\InvalidArgumentException('Magic request methods require a URI and optional options array');\n        }\n\n        $uri = $args[0];\n        $opts = isset($args[1]) ? $args[1] : [];\n\n        return substr($method, -5) === 'Async'\n            ? $this->requestAsync(substr($method, 0, -5), $uri, $opts)\n            : $this->request($method, $uri, $opts);\n    }\n\n    /**\n     * Asynchronously send an HTTP request.\n     *\n     * @param array $options Request options to apply to the given\n     *                       request and to the transfer. See \\GuzzleHttp\\RequestOptions.\n     *\n     * @return Promise\\PromiseInterface\n     */\n    public function sendAsync(RequestInterface $request, array $options = [])\n    {\n        // Merge the base URI into the request URI if needed.\n        $options = $this->prepareDefaults($options);\n\n        return $this->transfer(\n            $request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')),\n            $options\n        );\n    }\n\n    /**\n     * Send an HTTP request.\n     *\n     * @param array $options Request options to apply to the given\n     *                       request and to the transfer. See \\GuzzleHttp\\RequestOptions.\n     *\n     * @return ResponseInterface\n     * @throws GuzzleException\n     */\n    public function send(RequestInterface $request, array $options = [])\n    {\n        $options[RequestOptions::SYNCHRONOUS] = true;\n        return $this->sendAsync($request, $options)->wait();\n    }\n\n    /**\n     * Create and send an asynchronous HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string              $method  HTTP method\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply. See \\GuzzleHttp\\RequestOptions.\n     *\n     * @return Promise\\PromiseInterface\n     */\n    public function requestAsync($method, $uri = '', array $options = [])\n    {\n        $options = $this->prepareDefaults($options);\n        // Remove request modifying parameter because it can be done up-front.\n        $headers = isset($options['headers']) ? $options['headers'] : [];\n        $body = isset($options['body']) ? $options['body'] : null;\n        $version = isset($options['version']) ? $options['version'] : '1.1';\n        // Merge the URI into the base URI.\n        $uri = $this->buildUri($uri, $options);\n        if (is_array($body)) {\n            $this->invalidBody();\n        }\n        $request = new Psr7\\Request($method, $uri, $headers, $body, $version);\n        // Remove the option so that they are not doubly-applied.\n        unset($options['headers'], $options['body'], $options['version']);\n\n        return $this->transfer($request, $options);\n    }\n\n    /**\n     * Create and send an HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string              $method  HTTP method.\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply. See \\GuzzleHttp\\RequestOptions.\n     *\n     * @return ResponseInterface\n     * @throws GuzzleException\n     */\n    public function request($method, $uri = '', array $options = [])\n    {\n        $options[RequestOptions::SYNCHRONOUS] = true;\n        return $this->requestAsync($method, $uri, $options)->wait();\n    }\n\n    /**\n     * Get a client configuration option.\n     *\n     * These options include default request options of the client, a \"handler\"\n     * (if utilized by the concrete client), and a \"base_uri\" if utilized by\n     * the concrete client.\n     *\n     * @param string|null $option The config option to retrieve.\n     *\n     * @return mixed\n     */\n    public function getConfig($option = null)\n    {\n        return $option === null\n            ? $this->config\n            : (isset($this->config[$option]) ? $this->config[$option] : null);\n    }\n\n    /**\n     * @param  string|null $uri\n     *\n     * @return UriInterface\n     */\n    private function buildUri($uri, array $config)\n    {\n        // for BC we accept null which would otherwise fail in uri_for\n        $uri = Psr7\\uri_for($uri === null ? '' : $uri);\n\n        if (isset($config['base_uri'])) {\n            $uri = Psr7\\UriResolver::resolve(Psr7\\uri_for($config['base_uri']), $uri);\n        }\n\n        if (isset($config['idn_conversion']) && ($config['idn_conversion'] !== false)) {\n            $idnOptions = ($config['idn_conversion'] === true) ? IDNA_DEFAULT : $config['idn_conversion'];\n            $uri = Utils::idnUriConvert($uri, $idnOptions);\n        }\n\n        return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri;\n    }\n\n    /**\n     * Configures the default options for a client.\n     *\n     * @param array $config\n     * @return void\n     */\n    private function configureDefaults(array $config)\n    {\n        $defaults = [\n            'allow_redirects' => RedirectMiddleware::$defaultSettings,\n            'http_errors'     => true,\n            'decode_content'  => true,\n            'verify'          => true,\n            'cookies'         => false,\n            'idn_conversion'  => true,\n        ];\n\n        // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.\n\n        // We can only trust the HTTP_PROXY environment variable in a CLI\n        // process due to the fact that PHP has no reliable mechanism to\n        // get environment variables that start with \"HTTP_\".\n        if (php_sapi_name() === 'cli' && getenv('HTTP_PROXY')) {\n            $defaults['proxy']['http'] = getenv('HTTP_PROXY');\n        }\n\n        if ($proxy = getenv('HTTPS_PROXY')) {\n            $defaults['proxy']['https'] = $proxy;\n        }\n\n        if ($noProxy = getenv('NO_PROXY')) {\n            $cleanedNoProxy = str_replace(' ', '', $noProxy);\n            $defaults['proxy']['no'] = explode(',', $cleanedNoProxy);\n        }\n\n        $this->config = $config + $defaults;\n\n        if (!empty($config['cookies']) && $config['cookies'] === true) {\n            $this->config['cookies'] = new CookieJar();\n        }\n\n        // Add the default user-agent header.\n        if (!isset($this->config['headers'])) {\n            $this->config['headers'] = ['User-Agent' => default_user_agent()];\n        } else {\n            // Add the User-Agent header if one was not already set.\n            foreach (array_keys($this->config['headers']) as $name) {\n                if (strtolower($name) === 'user-agent') {\n                    return;\n                }\n            }\n            $this->config['headers']['User-Agent'] = default_user_agent();\n        }\n    }\n\n    /**\n     * Merges default options into the array.\n     *\n     * @param array $options Options to modify by reference\n     *\n     * @return array\n     */\n    private function prepareDefaults(array $options)\n    {\n        $defaults = $this->config;\n\n        if (!empty($defaults['headers'])) {\n            // Default headers are only added if they are not present.\n            $defaults['_conditional'] = $defaults['headers'];\n            unset($defaults['headers']);\n        }\n\n        // Special handling for headers is required as they are added as\n        // conditional headers and as headers passed to a request ctor.\n        if (array_key_exists('headers', $options)) {\n            // Allows default headers to be unset.\n            if ($options['headers'] === null) {\n                $defaults['_conditional'] = [];\n                unset($options['headers']);\n            } elseif (!is_array($options['headers'])) {\n                throw new \\InvalidArgumentException('headers must be an array');\n            }\n        }\n\n        // Shallow merge defaults underneath options.\n        $result = $options + $defaults;\n\n        // Remove null values.\n        foreach ($result as $k => $v) {\n            if ($v === null) {\n                unset($result[$k]);\n            }\n        }\n\n        return $result;\n    }\n\n    /**\n     * Transfers the given request and applies request options.\n     *\n     * The URI of the request is not modified and the request options are used\n     * as-is without merging in default options.\n     *\n     * @param array $options See \\GuzzleHttp\\RequestOptions.\n     *\n     * @return Promise\\PromiseInterface\n     */\n    private function transfer(RequestInterface $request, array $options)\n    {\n        // save_to -> sink\n        if (isset($options['save_to'])) {\n            $options['sink'] = $options['save_to'];\n            unset($options['save_to']);\n        }\n\n        // exceptions -> http_errors\n        if (isset($options['exceptions'])) {\n            $options['http_errors'] = $options['exceptions'];\n            unset($options['exceptions']);\n        }\n\n        $request = $this->applyOptions($request, $options);\n        /** @var HandlerStack $handler */\n        $handler = $options['handler'];\n\n        try {\n            return Promise\\promise_for($handler($request, $options));\n        } catch (\\Exception $e) {\n            return Promise\\rejection_for($e);\n        }\n    }\n\n    /**\n     * Applies the array of request options to a request.\n     *\n     * @param RequestInterface $request\n     * @param array            $options\n     *\n     * @return RequestInterface\n     */\n    private function applyOptions(RequestInterface $request, array &$options)\n    {\n        $modify = [\n            'set_headers' => [],\n        ];\n\n        if (isset($options['headers'])) {\n            $modify['set_headers'] = $options['headers'];\n            unset($options['headers']);\n        }\n\n        if (isset($options['form_params'])) {\n            if (isset($options['multipart'])) {\n                throw new \\InvalidArgumentException('You cannot use '\n                    . 'form_params and multipart at the same time. Use the '\n                    . 'form_params option if you want to send application/'\n                    . 'x-www-form-urlencoded requests, and the multipart '\n                    . 'option to send multipart/form-data requests.');\n            }\n            $options['body'] = http_build_query($options['form_params'], '', '&');\n            unset($options['form_params']);\n            // Ensure that we don't have the header in different case and set the new value.\n            $options['_conditional'] = Psr7\\_caseless_remove(['Content-Type'], $options['_conditional']);\n            $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded';\n        }\n\n        if (isset($options['multipart'])) {\n            $options['body'] = new Psr7\\MultipartStream($options['multipart']);\n            unset($options['multipart']);\n        }\n\n        if (isset($options['json'])) {\n            $options['body'] = \\GuzzleHttp\\json_encode($options['json']);\n            unset($options['json']);\n            // Ensure that we don't have the header in different case and set the new value.\n            $options['_conditional'] = Psr7\\_caseless_remove(['Content-Type'], $options['_conditional']);\n            $options['_conditional']['Content-Type'] = 'application/json';\n        }\n\n        if (!empty($options['decode_content'])\n            && $options['decode_content'] !== true\n        ) {\n            // Ensure that we don't have the header in different case and set the new value.\n            $options['_conditional'] = Psr7\\_caseless_remove(['Accept-Encoding'], $options['_conditional']);\n            $modify['set_headers']['Accept-Encoding'] = $options['decode_content'];\n        }\n\n        if (isset($options['body'])) {\n            if (is_array($options['body'])) {\n                $this->invalidBody();\n            }\n            $modify['body'] = Psr7\\stream_for($options['body']);\n            unset($options['body']);\n        }\n\n        if (!empty($options['auth']) && is_array($options['auth'])) {\n            $value = $options['auth'];\n            $type = isset($value[2]) ? strtolower($value[2]) : 'basic';\n            switch ($type) {\n                case 'basic':\n                    // Ensure that we don't have the header in different case and set the new value.\n                    $modify['set_headers'] = Psr7\\_caseless_remove(['Authorization'], $modify['set_headers']);\n                    $modify['set_headers']['Authorization'] = 'Basic '\n                        . base64_encode(\"$value[0]:$value[1]\");\n                    break;\n                case 'digest':\n                    // @todo: Do not rely on curl\n                    $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_DIGEST;\n                    $options['curl'][CURLOPT_USERPWD] = \"$value[0]:$value[1]\";\n                    break;\n                case 'ntlm':\n                    $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_NTLM;\n                    $options['curl'][CURLOPT_USERPWD] = \"$value[0]:$value[1]\";\n                    break;\n            }\n        }\n\n        if (isset($options['query'])) {\n            $value = $options['query'];\n            if (is_array($value)) {\n                $value = http_build_query($value, null, '&', PHP_QUERY_RFC3986);\n            }\n            if (!is_string($value)) {\n                throw new \\InvalidArgumentException('query must be a string or array');\n            }\n            $modify['query'] = $value;\n            unset($options['query']);\n        }\n\n        // Ensure that sink is not an invalid value.\n        if (isset($options['sink'])) {\n            // TODO: Add more sink validation?\n            if (is_bool($options['sink'])) {\n                throw new \\InvalidArgumentException('sink must not be a boolean');\n            }\n        }\n\n        $request = Psr7\\modify_request($request, $modify);\n        if ($request->getBody() instanceof Psr7\\MultipartStream) {\n            // Use a multipart/form-data POST if a Content-Type is not set.\n            // Ensure that we don't have the header in different case and set the new value.\n            $options['_conditional'] = Psr7\\_caseless_remove(['Content-Type'], $options['_conditional']);\n            $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary='\n                . $request->getBody()->getBoundary();\n        }\n\n        // Merge in conditional headers if they are not present.\n        if (isset($options['_conditional'])) {\n            // Build up the changes so it's in a single clone of the message.\n            $modify = [];\n            foreach ($options['_conditional'] as $k => $v) {\n                if (!$request->hasHeader($k)) {\n                    $modify['set_headers'][$k] = $v;\n                }\n            }\n            $request = Psr7\\modify_request($request, $modify);\n            // Don't pass this internal value along to middleware/handlers.\n            unset($options['_conditional']);\n        }\n\n        return $request;\n    }\n\n    /**\n     * Throw Exception with pre-set message.\n     * @return void\n     * @throws \\InvalidArgumentException Invalid body.\n     */\n    private function invalidBody()\n    {\n        throw new \\InvalidArgumentException('Passing in the \"body\" request '\n            . 'option as an array to send a POST request has been deprecated. '\n            . 'Please use the \"form_params\" request option to send a '\n            . 'application/x-www-form-urlencoded request, or the \"multipart\" '\n            . 'request option to send a multipart/form-data request.');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/ClientInterface.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Client interface for sending HTTP requests.\n */\ninterface ClientInterface\n{\n    /**\n     * @deprecated Will be removed in Guzzle 7.0.0\n     */\n    const VERSION = '6.5.5';\n\n    /**\n     * Send an HTTP request.\n     *\n     * @param RequestInterface $request Request to send\n     * @param array            $options Request options to apply to the given\n     *                                  request and to the transfer.\n     *\n     * @return ResponseInterface\n     * @throws GuzzleException\n     */\n    public function send(RequestInterface $request, array $options = []);\n\n    /**\n     * Asynchronously send an HTTP request.\n     *\n     * @param RequestInterface $request Request to send\n     * @param array            $options Request options to apply to the given\n     *                                  request and to the transfer.\n     *\n     * @return PromiseInterface\n     */\n    public function sendAsync(RequestInterface $request, array $options = []);\n\n    /**\n     * Create and send an HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string              $method  HTTP method.\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @return ResponseInterface\n     * @throws GuzzleException\n     */\n    public function request($method, $uri, array $options = []);\n\n    /**\n     * Create and send an asynchronous HTTP request.\n     *\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string              $method  HTTP method\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     *\n     * @return PromiseInterface\n     */\n    public function requestAsync($method, $uri, array $options = []);\n\n    /**\n     * Get a client configuration option.\n     *\n     * These options include default request options of the client, a \"handler\"\n     * (if utilized by the concrete client), and a \"base_uri\" if utilized by\n     * the concrete client.\n     *\n     * @param string|null $option The config option to retrieve.\n     *\n     * @return mixed\n     */\n    public function getConfig($option = null);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php",
    "content": "<?php\nnamespace GuzzleHttp\\Cookie;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Cookie jar that stores cookies as an array\n */\nclass CookieJar implements CookieJarInterface\n{\n    /** @var SetCookie[] Loaded cookie data */\n    private $cookies = [];\n\n    /** @var bool */\n    private $strictMode;\n\n    /**\n     * @param bool $strictMode   Set to true to throw exceptions when invalid\n     *                           cookies are added to the cookie jar.\n     * @param array $cookieArray Array of SetCookie objects or a hash of\n     *                           arrays that can be used with the SetCookie\n     *                           constructor\n     */\n    public function __construct($strictMode = false, $cookieArray = [])\n    {\n        $this->strictMode = $strictMode;\n\n        foreach ($cookieArray as $cookie) {\n            if (!($cookie instanceof SetCookie)) {\n                $cookie = new SetCookie($cookie);\n            }\n            $this->setCookie($cookie);\n        }\n    }\n\n    /**\n     * Create a new Cookie jar from an associative array and domain.\n     *\n     * @param array  $cookies Cookies to create the jar from\n     * @param string $domain  Domain to set the cookies to\n     *\n     * @return self\n     */\n    public static function fromArray(array $cookies, $domain)\n    {\n        $cookieJar = new self();\n        foreach ($cookies as $name => $value) {\n            $cookieJar->setCookie(new SetCookie([\n                'Domain'  => $domain,\n                'Name'    => $name,\n                'Value'   => $value,\n                'Discard' => true\n            ]));\n        }\n\n        return $cookieJar;\n    }\n\n    /**\n     * @deprecated\n     */\n    public static function getCookieValue($value)\n    {\n        return $value;\n    }\n\n    /**\n     * Evaluate if this cookie should be persisted to storage\n     * that survives between requests.\n     *\n     * @param SetCookie $cookie Being evaluated.\n     * @param bool $allowSessionCookies If we should persist session cookies\n     * @return bool\n     */\n    public static function shouldPersist(\n        SetCookie $cookie,\n        $allowSessionCookies = false\n    ) {\n        if ($cookie->getExpires() || $allowSessionCookies) {\n            if (!$cookie->getDiscard()) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Finds and returns the cookie based on the name\n     *\n     * @param string $name cookie name to search for\n     * @return SetCookie|null cookie that was found or null if not found\n     */\n    public function getCookieByName($name)\n    {\n        // don't allow a non string name\n        if ($name === null || !is_scalar($name)) {\n            return null;\n        }\n        foreach ($this->cookies as $cookie) {\n            if ($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) {\n                return $cookie;\n            }\n        }\n\n        return null;\n    }\n\n    public function toArray()\n    {\n        return array_map(function (SetCookie $cookie) {\n            return $cookie->toArray();\n        }, $this->getIterator()->getArrayCopy());\n    }\n\n    public function clear($domain = null, $path = null, $name = null)\n    {\n        if (!$domain) {\n            $this->cookies = [];\n            return;\n        } elseif (!$path) {\n            $this->cookies = array_filter(\n                $this->cookies,\n                function (SetCookie $cookie) use ($domain) {\n                    return !$cookie->matchesDomain($domain);\n                }\n            );\n        } elseif (!$name) {\n            $this->cookies = array_filter(\n                $this->cookies,\n                function (SetCookie $cookie) use ($path, $domain) {\n                    return !($cookie->matchesPath($path) &&\n                        $cookie->matchesDomain($domain));\n                }\n            );\n        } else {\n            $this->cookies = array_filter(\n                $this->cookies,\n                function (SetCookie $cookie) use ($path, $domain, $name) {\n                    return !($cookie->getName() == $name &&\n                        $cookie->matchesPath($path) &&\n                        $cookie->matchesDomain($domain));\n                }\n            );\n        }\n    }\n\n    public function clearSessionCookies()\n    {\n        $this->cookies = array_filter(\n            $this->cookies,\n            function (SetCookie $cookie) {\n                return !$cookie->getDiscard() && $cookie->getExpires();\n            }\n        );\n    }\n\n    public function setCookie(SetCookie $cookie)\n    {\n        // If the name string is empty (but not 0), ignore the set-cookie\n        // string entirely.\n        $name = $cookie->getName();\n        if (!$name && $name !== '0') {\n            return false;\n        }\n\n        // Only allow cookies with set and valid domain, name, value\n        $result = $cookie->validate();\n        if ($result !== true) {\n            if ($this->strictMode) {\n                throw new \\RuntimeException('Invalid cookie: ' . $result);\n            } else {\n                $this->removeCookieIfEmpty($cookie);\n                return false;\n            }\n        }\n\n        // Resolve conflicts with previously set cookies\n        foreach ($this->cookies as $i => $c) {\n\n            // Two cookies are identical, when their path, and domain are\n            // identical.\n            if ($c->getPath() != $cookie->getPath() ||\n                $c->getDomain() != $cookie->getDomain() ||\n                $c->getName() != $cookie->getName()\n            ) {\n                continue;\n            }\n\n            // The previously set cookie is a discard cookie and this one is\n            // not so allow the new cookie to be set\n            if (!$cookie->getDiscard() && $c->getDiscard()) {\n                unset($this->cookies[$i]);\n                continue;\n            }\n\n            // If the new cookie's expiration is further into the future, then\n            // replace the old cookie\n            if ($cookie->getExpires() > $c->getExpires()) {\n                unset($this->cookies[$i]);\n                continue;\n            }\n\n            // If the value has changed, we better change it\n            if ($cookie->getValue() !== $c->getValue()) {\n                unset($this->cookies[$i]);\n                continue;\n            }\n\n            // The cookie exists, so no need to continue\n            return false;\n        }\n\n        $this->cookies[] = $cookie;\n\n        return true;\n    }\n\n    public function count()\n    {\n        return count($this->cookies);\n    }\n\n    public function getIterator()\n    {\n        return new \\ArrayIterator(array_values($this->cookies));\n    }\n\n    public function extractCookies(\n        RequestInterface $request,\n        ResponseInterface $response\n    ) {\n        if ($cookieHeader = $response->getHeader('Set-Cookie')) {\n            foreach ($cookieHeader as $cookie) {\n                $sc = SetCookie::fromString($cookie);\n                if (!$sc->getDomain()) {\n                    $sc->setDomain($request->getUri()->getHost());\n                }\n                if (0 !== strpos($sc->getPath(), '/')) {\n                    $sc->setPath($this->getCookiePathFromRequest($request));\n                }\n                $this->setCookie($sc);\n            }\n        }\n    }\n\n    /**\n     * Computes cookie path following RFC 6265 section 5.1.4\n     *\n     * @link https://tools.ietf.org/html/rfc6265#section-5.1.4\n     *\n     * @param RequestInterface $request\n     * @return string\n     */\n    private function getCookiePathFromRequest(RequestInterface $request)\n    {\n        $uriPath = $request->getUri()->getPath();\n        if (''  === $uriPath) {\n            return '/';\n        }\n        if (0 !== strpos($uriPath, '/')) {\n            return '/';\n        }\n        if ('/' === $uriPath) {\n            return '/';\n        }\n        if (0 === $lastSlashPos = strrpos($uriPath, '/')) {\n            return '/';\n        }\n\n        return substr($uriPath, 0, $lastSlashPos);\n    }\n\n    public function withCookieHeader(RequestInterface $request)\n    {\n        $values = [];\n        $uri = $request->getUri();\n        $scheme = $uri->getScheme();\n        $host = $uri->getHost();\n        $path = $uri->getPath() ?: '/';\n\n        foreach ($this->cookies as $cookie) {\n            if ($cookie->matchesPath($path) &&\n                $cookie->matchesDomain($host) &&\n                !$cookie->isExpired() &&\n                (!$cookie->getSecure() || $scheme === 'https')\n            ) {\n                $values[] = $cookie->getName() . '='\n                    . $cookie->getValue();\n            }\n        }\n\n        return $values\n            ? $request->withHeader('Cookie', implode('; ', $values))\n            : $request;\n    }\n\n    /**\n     * If a cookie already exists and the server asks to set it again with a\n     * null value, the cookie must be deleted.\n     *\n     * @param SetCookie $cookie\n     */\n    private function removeCookieIfEmpty(SetCookie $cookie)\n    {\n        $cookieValue = $cookie->getValue();\n        if ($cookieValue === null || $cookieValue === '') {\n            $this->clear(\n                $cookie->getDomain(),\n                $cookie->getPath(),\n                $cookie->getName()\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php",
    "content": "<?php\nnamespace GuzzleHttp\\Cookie;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Stores HTTP cookies.\n *\n * It extracts cookies from HTTP requests, and returns them in HTTP responses.\n * CookieJarInterface instances automatically expire contained cookies when\n * necessary. Subclasses are also responsible for storing and retrieving\n * cookies from a file, database, etc.\n *\n * @link http://docs.python.org/2/library/cookielib.html Inspiration\n */\ninterface CookieJarInterface extends \\Countable, \\IteratorAggregate\n{\n    /**\n     * Create a request with added cookie headers.\n     *\n     * If no matching cookies are found in the cookie jar, then no Cookie\n     * header is added to the request and the same request is returned.\n     *\n     * @param RequestInterface $request Request object to modify.\n     *\n     * @return RequestInterface returns the modified request.\n     */\n    public function withCookieHeader(RequestInterface $request);\n\n    /**\n     * Extract cookies from an HTTP response and store them in the CookieJar.\n     *\n     * @param RequestInterface  $request  Request that was sent\n     * @param ResponseInterface $response Response that was received\n     */\n    public function extractCookies(\n        RequestInterface $request,\n        ResponseInterface $response\n    );\n\n    /**\n     * Sets a cookie in the cookie jar.\n     *\n     * @param SetCookie $cookie Cookie to set.\n     *\n     * @return bool Returns true on success or false on failure\n     */\n    public function setCookie(SetCookie $cookie);\n\n    /**\n     * Remove cookies currently held in the cookie jar.\n     *\n     * Invoking this method without arguments will empty the whole cookie jar.\n     * If given a $domain argument only cookies belonging to that domain will\n     * be removed. If given a $domain and $path argument, cookies belonging to\n     * the specified path within that domain are removed. If given all three\n     * arguments, then the cookie with the specified name, path and domain is\n     * removed.\n     *\n     * @param string|null $domain Clears cookies matching a domain\n     * @param string|null $path   Clears cookies matching a domain and path\n     * @param string|null $name   Clears cookies matching a domain, path, and name\n     *\n     * @return CookieJarInterface\n     */\n    public function clear($domain = null, $path = null, $name = null);\n\n    /**\n     * Discard all sessions cookies.\n     *\n     * Removes cookies that don't have an expire field or a have a discard\n     * field set to true. To be called when the user agent shuts down according\n     * to RFC 2965.\n     */\n    public function clearSessionCookies();\n\n    /**\n     * Converts the cookie jar to an array.\n     *\n     * @return array\n     */\n    public function toArray();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php",
    "content": "<?php\nnamespace GuzzleHttp\\Cookie;\n\n/**\n * Persists non-session cookies using a JSON formatted file\n */\nclass FileCookieJar extends CookieJar\n{\n    /** @var string filename */\n    private $filename;\n\n    /** @var bool Control whether to persist session cookies or not. */\n    private $storeSessionCookies;\n\n    /**\n     * Create a new FileCookieJar object\n     *\n     * @param string $cookieFile        File to store the cookie data\n     * @param bool $storeSessionCookies Set to true to store session cookies\n     *                                  in the cookie jar.\n     *\n     * @throws \\RuntimeException if the file cannot be found or created\n     */\n    public function __construct($cookieFile, $storeSessionCookies = false)\n    {\n        parent::__construct();\n        $this->filename = $cookieFile;\n        $this->storeSessionCookies = $storeSessionCookies;\n\n        if (file_exists($cookieFile)) {\n            $this->load($cookieFile);\n        }\n    }\n\n    /**\n     * Saves the file when shutting down\n     */\n    public function __destruct()\n    {\n        $this->save($this->filename);\n    }\n\n    /**\n     * Saves the cookies to a file.\n     *\n     * @param string $filename File to save\n     * @throws \\RuntimeException if the file cannot be found or created\n     */\n    public function save($filename)\n    {\n        $json = [];\n        foreach ($this as $cookie) {\n            /** @var SetCookie $cookie */\n            if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {\n                $json[] = $cookie->toArray();\n            }\n        }\n\n        $jsonStr = \\GuzzleHttp\\json_encode($json);\n        if (false === file_put_contents($filename, $jsonStr, LOCK_EX)) {\n            throw new \\RuntimeException(\"Unable to save file {$filename}\");\n        }\n    }\n\n    /**\n     * Load cookies from a JSON formatted file.\n     *\n     * Old cookies are kept unless overwritten by newly loaded ones.\n     *\n     * @param string $filename Cookie file to load.\n     * @throws \\RuntimeException if the file cannot be loaded.\n     */\n    public function load($filename)\n    {\n        $json = file_get_contents($filename);\n        if (false === $json) {\n            throw new \\RuntimeException(\"Unable to load file {$filename}\");\n        } elseif ($json === '') {\n            return;\n        }\n\n        $data = \\GuzzleHttp\\json_decode($json, true);\n        if (is_array($data)) {\n            foreach (json_decode($json, true) as $cookie) {\n                $this->setCookie(new SetCookie($cookie));\n            }\n        } elseif (strlen($data)) {\n            throw new \\RuntimeException(\"Invalid cookie file: {$filename}\");\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php",
    "content": "<?php\nnamespace GuzzleHttp\\Cookie;\n\n/**\n * Persists cookies in the client session\n */\nclass SessionCookieJar extends CookieJar\n{\n    /** @var string session key */\n    private $sessionKey;\n    \n    /** @var bool Control whether to persist session cookies or not. */\n    private $storeSessionCookies;\n\n    /**\n     * Create a new SessionCookieJar object\n     *\n     * @param string $sessionKey        Session key name to store the cookie\n     *                                  data in session\n     * @param bool $storeSessionCookies Set to true to store session cookies\n     *                                  in the cookie jar.\n     */\n    public function __construct($sessionKey, $storeSessionCookies = false)\n    {\n        parent::__construct();\n        $this->sessionKey = $sessionKey;\n        $this->storeSessionCookies = $storeSessionCookies;\n        $this->load();\n    }\n\n    /**\n     * Saves cookies to session when shutting down\n     */\n    public function __destruct()\n    {\n        $this->save();\n    }\n\n    /**\n     * Save cookies to the client session\n     */\n    public function save()\n    {\n        $json = [];\n        foreach ($this as $cookie) {\n            /** @var SetCookie $cookie */\n            if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {\n                $json[] = $cookie->toArray();\n            }\n        }\n\n        $_SESSION[$this->sessionKey] = json_encode($json);\n    }\n\n    /**\n     * Load the contents of the client session into the data array\n     */\n    protected function load()\n    {\n        if (!isset($_SESSION[$this->sessionKey])) {\n            return;\n        }\n        $data = json_decode($_SESSION[$this->sessionKey], true);\n        if (is_array($data)) {\n            foreach ($data as $cookie) {\n                $this->setCookie(new SetCookie($cookie));\n            }\n        } elseif (strlen($data)) {\n            throw new \\RuntimeException(\"Invalid cookie data\");\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php",
    "content": "<?php\nnamespace GuzzleHttp\\Cookie;\n\n/**\n * Set-Cookie object\n */\nclass SetCookie\n{\n    /** @var array */\n    private static $defaults = [\n        'Name'     => null,\n        'Value'    => null,\n        'Domain'   => null,\n        'Path'     => '/',\n        'Max-Age'  => null,\n        'Expires'  => null,\n        'Secure'   => false,\n        'Discard'  => false,\n        'HttpOnly' => false\n    ];\n\n    /** @var array Cookie data */\n    private $data;\n\n    /**\n     * Create a new SetCookie object from a string\n     *\n     * @param string $cookie Set-Cookie header string\n     *\n     * @return self\n     */\n    public static function fromString($cookie)\n    {\n        // Create the default return array\n        $data = self::$defaults;\n        // Explode the cookie string using a series of semicolons\n        $pieces = array_filter(array_map('trim', explode(';', $cookie)));\n        // The name of the cookie (first kvp) must exist and include an equal sign.\n        if (empty($pieces[0]) || !strpos($pieces[0], '=')) {\n            return new self($data);\n        }\n\n        // Add the cookie pieces into the parsed data array\n        foreach ($pieces as $part) {\n            $cookieParts = explode('=', $part, 2);\n            $key = trim($cookieParts[0]);\n            $value = isset($cookieParts[1])\n                ? trim($cookieParts[1], \" \\n\\r\\t\\0\\x0B\")\n                : true;\n\n            // Only check for non-cookies when cookies have been found\n            if (empty($data['Name'])) {\n                $data['Name'] = $key;\n                $data['Value'] = $value;\n            } else {\n                foreach (array_keys(self::$defaults) as $search) {\n                    if (!strcasecmp($search, $key)) {\n                        $data[$search] = $value;\n                        continue 2;\n                    }\n                }\n                $data[$key] = $value;\n            }\n        }\n\n        return new self($data);\n    }\n\n    /**\n     * @param array $data Array of cookie data provided by a Cookie parser\n     */\n    public function __construct(array $data = [])\n    {\n        $this->data = array_replace(self::$defaults, $data);\n        // Extract the Expires value and turn it into a UNIX timestamp if needed\n        if (!$this->getExpires() && $this->getMaxAge()) {\n            // Calculate the Expires date\n            $this->setExpires(time() + $this->getMaxAge());\n        } elseif ($this->getExpires() && !is_numeric($this->getExpires())) {\n            $this->setExpires($this->getExpires());\n        }\n    }\n\n    public function __toString()\n    {\n        $str = $this->data['Name'] . '=' . $this->data['Value'] . '; ';\n        foreach ($this->data as $k => $v) {\n            if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) {\n                if ($k === 'Expires') {\n                    $str .= 'Expires=' . gmdate('D, d M Y H:i:s \\G\\M\\T', $v) . '; ';\n                } else {\n                    $str .= ($v === true ? $k : \"{$k}={$v}\") . '; ';\n                }\n            }\n        }\n\n        return rtrim($str, '; ');\n    }\n\n    public function toArray()\n    {\n        return $this->data;\n    }\n\n    /**\n     * Get the cookie name\n     *\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->data['Name'];\n    }\n\n    /**\n     * Set the cookie name\n     *\n     * @param string $name Cookie name\n     */\n    public function setName($name)\n    {\n        $this->data['Name'] = $name;\n    }\n\n    /**\n     * Get the cookie value\n     *\n     * @return string\n     */\n    public function getValue()\n    {\n        return $this->data['Value'];\n    }\n\n    /**\n     * Set the cookie value\n     *\n     * @param string $value Cookie value\n     */\n    public function setValue($value)\n    {\n        $this->data['Value'] = $value;\n    }\n\n    /**\n     * Get the domain\n     *\n     * @return string|null\n     */\n    public function getDomain()\n    {\n        return $this->data['Domain'];\n    }\n\n    /**\n     * Set the domain of the cookie\n     *\n     * @param string $domain\n     */\n    public function setDomain($domain)\n    {\n        $this->data['Domain'] = $domain;\n    }\n\n    /**\n     * Get the path\n     *\n     * @return string\n     */\n    public function getPath()\n    {\n        return $this->data['Path'];\n    }\n\n    /**\n     * Set the path of the cookie\n     *\n     * @param string $path Path of the cookie\n     */\n    public function setPath($path)\n    {\n        $this->data['Path'] = $path;\n    }\n\n    /**\n     * Maximum lifetime of the cookie in seconds\n     *\n     * @return int|null\n     */\n    public function getMaxAge()\n    {\n        return $this->data['Max-Age'];\n    }\n\n    /**\n     * Set the max-age of the cookie\n     *\n     * @param int $maxAge Max age of the cookie in seconds\n     */\n    public function setMaxAge($maxAge)\n    {\n        $this->data['Max-Age'] = $maxAge;\n    }\n\n    /**\n     * The UNIX timestamp when the cookie Expires\n     *\n     * @return mixed\n     */\n    public function getExpires()\n    {\n        return $this->data['Expires'];\n    }\n\n    /**\n     * Set the unix timestamp for which the cookie will expire\n     *\n     * @param int $timestamp Unix timestamp\n     */\n    public function setExpires($timestamp)\n    {\n        $this->data['Expires'] = is_numeric($timestamp)\n            ? (int) $timestamp\n            : strtotime($timestamp);\n    }\n\n    /**\n     * Get whether or not this is a secure cookie\n     *\n     * @return bool|null\n     */\n    public function getSecure()\n    {\n        return $this->data['Secure'];\n    }\n\n    /**\n     * Set whether or not the cookie is secure\n     *\n     * @param bool $secure Set to true or false if secure\n     */\n    public function setSecure($secure)\n    {\n        $this->data['Secure'] = $secure;\n    }\n\n    /**\n     * Get whether or not this is a session cookie\n     *\n     * @return bool|null\n     */\n    public function getDiscard()\n    {\n        return $this->data['Discard'];\n    }\n\n    /**\n     * Set whether or not this is a session cookie\n     *\n     * @param bool $discard Set to true or false if this is a session cookie\n     */\n    public function setDiscard($discard)\n    {\n        $this->data['Discard'] = $discard;\n    }\n\n    /**\n     * Get whether or not this is an HTTP only cookie\n     *\n     * @return bool\n     */\n    public function getHttpOnly()\n    {\n        return $this->data['HttpOnly'];\n    }\n\n    /**\n     * Set whether or not this is an HTTP only cookie\n     *\n     * @param bool $httpOnly Set to true or false if this is HTTP only\n     */\n    public function setHttpOnly($httpOnly)\n    {\n        $this->data['HttpOnly'] = $httpOnly;\n    }\n\n    /**\n     * Check if the cookie matches a path value.\n     *\n     * A request-path path-matches a given cookie-path if at least one of\n     * the following conditions holds:\n     *\n     * - The cookie-path and the request-path are identical.\n     * - The cookie-path is a prefix of the request-path, and the last\n     *   character of the cookie-path is %x2F (\"/\").\n     * - The cookie-path is a prefix of the request-path, and the first\n     *   character of the request-path that is not included in the cookie-\n     *   path is a %x2F (\"/\") character.\n     *\n     * @param string $requestPath Path to check against\n     *\n     * @return bool\n     */\n    public function matchesPath($requestPath)\n    {\n        $cookiePath = $this->getPath();\n\n        // Match on exact matches or when path is the default empty \"/\"\n        if ($cookiePath === '/' || $cookiePath == $requestPath) {\n            return true;\n        }\n\n        // Ensure that the cookie-path is a prefix of the request path.\n        if (0 !== strpos($requestPath, $cookiePath)) {\n            return false;\n        }\n\n        // Match if the last character of the cookie-path is \"/\"\n        if (substr($cookiePath, -1, 1) === '/') {\n            return true;\n        }\n\n        // Match if the first character not included in cookie path is \"/\"\n        return substr($requestPath, strlen($cookiePath), 1) === '/';\n    }\n\n    /**\n     * Check if the cookie matches a domain value\n     *\n     * @param string $domain Domain to check against\n     *\n     * @return bool\n     */\n    public function matchesDomain($domain)\n    {\n        // Remove the leading '.' as per spec in RFC 6265.\n        // http://tools.ietf.org/html/rfc6265#section-5.2.3\n        $cookieDomain = ltrim($this->getDomain(), '.');\n\n        // Domain not set or exact match.\n        if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) {\n            return true;\n        }\n\n        // Matching the subdomain according to RFC 6265.\n        // http://tools.ietf.org/html/rfc6265#section-5.1.3\n        if (filter_var($domain, FILTER_VALIDATE_IP)) {\n            return false;\n        }\n\n        return (bool) preg_match('/\\.' . preg_quote($cookieDomain, '/') . '$/', $domain);\n    }\n\n    /**\n     * Check if the cookie is expired\n     *\n     * @return bool\n     */\n    public function isExpired()\n    {\n        return $this->getExpires() !== null && time() > $this->getExpires();\n    }\n\n    /**\n     * Check if the cookie is valid according to RFC 6265\n     *\n     * @return bool|string Returns true if valid or an error message if invalid\n     */\n    public function validate()\n    {\n        // Names must not be empty, but can be 0\n        $name = $this->getName();\n        if (empty($name) && !is_numeric($name)) {\n            return 'The cookie name must not be empty';\n        }\n\n        // Check if any of the invalid characters are present in the cookie name\n        if (preg_match(\n            '/[\\x00-\\x20\\x22\\x28-\\x29\\x2c\\x2f\\x3a-\\x40\\x5c\\x7b\\x7d\\x7f]/',\n            $name\n        )) {\n            return 'Cookie name must not contain invalid characters: ASCII '\n                . 'Control characters (0-31;127), space, tab and the '\n                . 'following characters: ()<>@,;:\\\"/?={}';\n        }\n\n        // Value must not be empty, but can be 0\n        $value = $this->getValue();\n        if (empty($value) && !is_numeric($value)) {\n            return 'The cookie value must not be empty';\n        }\n\n        // Domains must not be empty, but can be 0\n        // A \"0\" is not a valid internet domain, but may be used as server name\n        // in a private network.\n        $domain = $this->getDomain();\n        if (empty($domain) && !is_numeric($domain)) {\n            return 'The cookie domain must not be empty';\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Exception when an HTTP error occurs (4xx or 5xx error)\n */\nclass BadResponseException extends RequestException\n{\n    public function __construct(\n        $message,\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        \\Exception $previous = null,\n        array $handlerContext = []\n    ) {\n        if (null === $response) {\n            @trigger_error(\n                'Instantiating the ' . __CLASS__ . ' class without a Response is deprecated since version 6.3 and will be removed in 7.0.',\n                E_USER_DEPRECATED\n            );\n        }\n        parent::__construct($message, $request, $response, $previous, $handlerContext);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\n/**\n * Exception when a client error is encountered (4xx codes)\n */\nclass ClientException extends BadResponseException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Exception thrown when a connection cannot be established.\n *\n * Note that no response is present for a ConnectException\n */\nclass ConnectException extends RequestException\n{\n    public function __construct(\n        $message,\n        RequestInterface $request,\n        \\Exception $previous = null,\n        array $handlerContext = []\n    ) {\n        parent::__construct($message, $request, null, $previous, $handlerContext);\n    }\n\n    /**\n     * @return null\n     */\n    public function getResponse()\n    {\n        return null;\n    }\n\n    /**\n     * @return bool\n     */\n    public function hasResponse()\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nuse Throwable;\n\nif (interface_exists(Throwable::class)) {\n    interface GuzzleException extends Throwable\n    {\n    }\n} else {\n    /**\n     * @method string getMessage()\n     * @method \\Throwable|null getPrevious()\n     * @method mixed getCode()\n     * @method string getFile()\n     * @method int getLine()\n     * @method array getTrace()\n     * @method string getTraceAsString()\n     */\n    interface GuzzleException\n    {\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Exception;\n\nfinal class InvalidArgumentException extends \\InvalidArgumentException implements GuzzleException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * HTTP Request exception\n */\nclass RequestException extends TransferException\n{\n    /** @var RequestInterface */\n    private $request;\n\n    /** @var ResponseInterface|null */\n    private $response;\n\n    /** @var array */\n    private $handlerContext;\n\n    public function __construct(\n        $message,\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        \\Exception $previous = null,\n        array $handlerContext = []\n    ) {\n        // Set the code of the exception if the response is set and not future.\n        $code = $response && !($response instanceof PromiseInterface)\n            ? $response->getStatusCode()\n            : 0;\n        parent::__construct($message, $code, $previous);\n        $this->request = $request;\n        $this->response = $response;\n        $this->handlerContext = $handlerContext;\n    }\n\n    /**\n     * Wrap non-RequestExceptions with a RequestException\n     *\n     * @param RequestInterface $request\n     * @param \\Exception       $e\n     *\n     * @return RequestException\n     */\n    public static function wrapException(RequestInterface $request, \\Exception $e)\n    {\n        return $e instanceof RequestException\n            ? $e\n            : new RequestException($e->getMessage(), $request, null, $e);\n    }\n\n    /**\n     * Factory method to create a new exception with a normalized error message\n     *\n     * @param RequestInterface  $request  Request\n     * @param ResponseInterface $response Response received\n     * @param \\Exception        $previous Previous exception\n     * @param array             $ctx      Optional handler context.\n     *\n     * @return self\n     */\n    public static function create(\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        \\Exception $previous = null,\n        array $ctx = []\n    ) {\n        if (!$response) {\n            return new self(\n                'Error completing request',\n                $request,\n                null,\n                $previous,\n                $ctx\n            );\n        }\n\n        $level = (int) floor($response->getStatusCode() / 100);\n        if ($level === 4) {\n            $label = 'Client error';\n            $className = ClientException::class;\n        } elseif ($level === 5) {\n            $label = 'Server error';\n            $className = ServerException::class;\n        } else {\n            $label = 'Unsuccessful request';\n            $className = __CLASS__;\n        }\n\n        $uri = $request->getUri();\n        $uri = static::obfuscateUri($uri);\n\n        // Client Error: `GET /` resulted in a `404 Not Found` response:\n        // <html> ... (truncated)\n        $message = sprintf(\n            '%s: `%s %s` resulted in a `%s %s` response',\n            $label,\n            $request->getMethod(),\n            $uri,\n            $response->getStatusCode(),\n            $response->getReasonPhrase()\n        );\n\n        $summary = static::getResponseBodySummary($response);\n\n        if ($summary !== null) {\n            $message .= \":\\n{$summary}\\n\";\n        }\n\n        return new $className($message, $request, $response, $previous, $ctx);\n    }\n\n    /**\n     * Get a short summary of the response\n     *\n     * Will return `null` if the response is not printable.\n     *\n     * @param ResponseInterface $response\n     *\n     * @return string|null\n     */\n    public static function getResponseBodySummary(ResponseInterface $response)\n    {\n        return \\GuzzleHttp\\Psr7\\get_message_body_summary($response);\n    }\n\n    /**\n     * Obfuscates URI if there is a username and a password present\n     *\n     * @param UriInterface $uri\n     *\n     * @return UriInterface\n     */\n    private static function obfuscateUri(UriInterface $uri)\n    {\n        $userInfo = $uri->getUserInfo();\n\n        if (false !== ($pos = strpos($userInfo, ':'))) {\n            return $uri->withUserInfo(substr($userInfo, 0, $pos), '***');\n        }\n\n        return $uri;\n    }\n\n    /**\n     * Get the request that caused the exception\n     *\n     * @return RequestInterface\n     */\n    public function getRequest()\n    {\n        return $this->request;\n    }\n\n    /**\n     * Get the associated response\n     *\n     * @return ResponseInterface|null\n     */\n    public function getResponse()\n    {\n        return $this->response;\n    }\n\n    /**\n     * Check if a response was received\n     *\n     * @return bool\n     */\n    public function hasResponse()\n    {\n        return $this->response !== null;\n    }\n\n    /**\n     * Get contextual information about the error from the underlying handler.\n     *\n     * The contents of this array will vary depending on which handler you are\n     * using. It may also be just an empty array. Relying on this data will\n     * couple you to a specific handler, but can give more debug information\n     * when needed.\n     *\n     * @return array\n     */\n    public function getHandlerContext()\n    {\n        return $this->handlerContext;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Exception thrown when a seek fails on a stream.\n */\nclass SeekException extends \\RuntimeException implements GuzzleException\n{\n    private $stream;\n\n    public function __construct(StreamInterface $stream, $pos = 0, $msg = '')\n    {\n        $this->stream = $stream;\n        $msg = $msg ?: 'Could not seek the stream to position ' . $pos;\n        parent::__construct($msg);\n    }\n\n    /**\n     * @return StreamInterface\n     */\n    public function getStream()\n    {\n        return $this->stream;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\n/**\n * Exception when a server error is encountered (5xx codes)\n */\nclass ServerException extends BadResponseException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nclass TooManyRedirectsException extends RequestException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Exception;\n\nclass TransferException extends \\RuntimeException implements GuzzleException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\ConnectException;\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Promise\\FulfilledPromise;\nuse GuzzleHttp\\Psr7;\nuse GuzzleHttp\\Psr7\\LazyOpenStream;\nuse GuzzleHttp\\TransferStats;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Creates curl resources from a request\n */\nclass CurlFactory implements CurlFactoryInterface\n{\n    const CURL_VERSION_STR = 'curl_version';\n    const LOW_CURL_VERSION_NUMBER = '7.21.2';\n\n    /** @var array */\n    private $handles = [];\n\n    /** @var int Total number of idle handles to keep in cache */\n    private $maxHandles;\n\n    /**\n     * @param int $maxHandles Maximum number of idle handles.\n     */\n    public function __construct($maxHandles)\n    {\n        $this->maxHandles = $maxHandles;\n    }\n\n    public function create(RequestInterface $request, array $options)\n    {\n        if (isset($options['curl']['body_as_string'])) {\n            $options['_body_as_string'] = $options['curl']['body_as_string'];\n            unset($options['curl']['body_as_string']);\n        }\n\n        $easy = new EasyHandle;\n        $easy->request = $request;\n        $easy->options = $options;\n        $conf = $this->getDefaultConf($easy);\n        $this->applyMethod($easy, $conf);\n        $this->applyHandlerOptions($easy, $conf);\n        $this->applyHeaders($easy, $conf);\n        unset($conf['_headers']);\n\n        // Add handler options from the request configuration options\n        if (isset($options['curl'])) {\n            $conf = array_replace($conf, $options['curl']);\n        }\n\n        $conf[CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy);\n        $easy->handle = $this->handles\n            ? array_pop($this->handles)\n            : curl_init();\n        curl_setopt_array($easy->handle, $conf);\n\n        return $easy;\n    }\n\n    public function release(EasyHandle $easy)\n    {\n        $resource = $easy->handle;\n        unset($easy->handle);\n\n        if (count($this->handles) >= $this->maxHandles) {\n            curl_close($resource);\n        } else {\n            // Remove all callback functions as they can hold onto references\n            // and are not cleaned up by curl_reset. Using curl_setopt_array\n            // does not work for some reason, so removing each one\n            // individually.\n            curl_setopt($resource, CURLOPT_HEADERFUNCTION, null);\n            curl_setopt($resource, CURLOPT_READFUNCTION, null);\n            curl_setopt($resource, CURLOPT_WRITEFUNCTION, null);\n            curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, null);\n            curl_reset($resource);\n            $this->handles[] = $resource;\n        }\n    }\n\n    /**\n     * Completes a cURL transaction, either returning a response promise or a\n     * rejected promise.\n     *\n     * @param callable             $handler\n     * @param EasyHandle           $easy\n     * @param CurlFactoryInterface $factory Dictates how the handle is released\n     *\n     * @return \\GuzzleHttp\\Promise\\PromiseInterface\n     */\n    public static function finish(\n        callable $handler,\n        EasyHandle $easy,\n        CurlFactoryInterface $factory\n    ) {\n        if (isset($easy->options['on_stats'])) {\n            self::invokeStats($easy);\n        }\n\n        if (!$easy->response || $easy->errno) {\n            return self::finishError($handler, $easy, $factory);\n        }\n\n        // Return the response if it is present and there is no error.\n        $factory->release($easy);\n\n        // Rewind the body of the response if possible.\n        $body = $easy->response->getBody();\n        if ($body->isSeekable()) {\n            $body->rewind();\n        }\n\n        return new FulfilledPromise($easy->response);\n    }\n\n    private static function invokeStats(EasyHandle $easy)\n    {\n        $curlStats = curl_getinfo($easy->handle);\n        $curlStats['appconnect_time'] = curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME);\n        $stats = new TransferStats(\n            $easy->request,\n            $easy->response,\n            $curlStats['total_time'],\n            $easy->errno,\n            $curlStats\n        );\n        call_user_func($easy->options['on_stats'], $stats);\n    }\n\n    private static function finishError(\n        callable $handler,\n        EasyHandle $easy,\n        CurlFactoryInterface $factory\n    ) {\n        // Get error information and release the handle to the factory.\n        $ctx = [\n            'errno' => $easy->errno,\n            'error' => curl_error($easy->handle),\n            'appconnect_time' => curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME),\n        ] + curl_getinfo($easy->handle);\n        $ctx[self::CURL_VERSION_STR] = curl_version()['version'];\n        $factory->release($easy);\n\n        // Retry when nothing is present or when curl failed to rewind.\n        if (empty($easy->options['_err_message'])\n            && (!$easy->errno || $easy->errno == 65)\n        ) {\n            return self::retryFailedRewind($handler, $easy, $ctx);\n        }\n\n        return self::createRejection($easy, $ctx);\n    }\n\n    private static function createRejection(EasyHandle $easy, array $ctx)\n    {\n        static $connectionErrors = [\n            CURLE_OPERATION_TIMEOUTED  => true,\n            CURLE_COULDNT_RESOLVE_HOST => true,\n            CURLE_COULDNT_CONNECT      => true,\n            CURLE_SSL_CONNECT_ERROR    => true,\n            CURLE_GOT_NOTHING          => true,\n        ];\n\n        // If an exception was encountered during the onHeaders event, then\n        // return a rejected promise that wraps that exception.\n        if ($easy->onHeadersException) {\n            return \\GuzzleHttp\\Promise\\rejection_for(\n                new RequestException(\n                    'An error was encountered during the on_headers event',\n                    $easy->request,\n                    $easy->response,\n                    $easy->onHeadersException,\n                    $ctx\n                )\n            );\n        }\n        if (version_compare($ctx[self::CURL_VERSION_STR], self::LOW_CURL_VERSION_NUMBER)) {\n            $message = sprintf(\n                'cURL error %s: %s (%s)',\n                $ctx['errno'],\n                $ctx['error'],\n                'see https://curl.haxx.se/libcurl/c/libcurl-errors.html'\n            );\n        } else {\n            $message = sprintf(\n                'cURL error %s: %s (%s) for %s',\n                $ctx['errno'],\n                $ctx['error'],\n                'see https://curl.haxx.se/libcurl/c/libcurl-errors.html',\n                $easy->request->getUri()\n            );\n        }\n\n        // Create a connection exception if it was a specific error code.\n        $error = isset($connectionErrors[$easy->errno])\n            ? new ConnectException($message, $easy->request, null, $ctx)\n            : new RequestException($message, $easy->request, $easy->response, null, $ctx);\n\n        return \\GuzzleHttp\\Promise\\rejection_for($error);\n    }\n\n    private function getDefaultConf(EasyHandle $easy)\n    {\n        $conf = [\n            '_headers'             => $easy->request->getHeaders(),\n            CURLOPT_CUSTOMREQUEST  => $easy->request->getMethod(),\n            CURLOPT_URL            => (string) $easy->request->getUri()->withFragment(''),\n            CURLOPT_RETURNTRANSFER => false,\n            CURLOPT_HEADER         => false,\n            CURLOPT_CONNECTTIMEOUT => 150,\n        ];\n\n        if (defined('CURLOPT_PROTOCOLS')) {\n            $conf[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS;\n        }\n\n        $version = $easy->request->getProtocolVersion();\n        if ($version == 1.1) {\n            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1;\n        } elseif ($version == 2.0) {\n            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2_0;\n        } else {\n            $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0;\n        }\n\n        return $conf;\n    }\n\n    private function applyMethod(EasyHandle $easy, array &$conf)\n    {\n        $body = $easy->request->getBody();\n        $size = $body->getSize();\n\n        if ($size === null || $size > 0) {\n            $this->applyBody($easy->request, $easy->options, $conf);\n            return;\n        }\n\n        $method = $easy->request->getMethod();\n        if ($method === 'PUT' || $method === 'POST') {\n            // See http://tools.ietf.org/html/rfc7230#section-3.3.2\n            if (!$easy->request->hasHeader('Content-Length')) {\n                $conf[CURLOPT_HTTPHEADER][] = 'Content-Length: 0';\n            }\n        } elseif ($method === 'HEAD') {\n            $conf[CURLOPT_NOBODY] = true;\n            unset(\n                $conf[CURLOPT_WRITEFUNCTION],\n                $conf[CURLOPT_READFUNCTION],\n                $conf[CURLOPT_FILE],\n                $conf[CURLOPT_INFILE]\n            );\n        }\n    }\n\n    private function applyBody(RequestInterface $request, array $options, array &$conf)\n    {\n        $size = $request->hasHeader('Content-Length')\n            ? (int) $request->getHeaderLine('Content-Length')\n            : null;\n\n        // Send the body as a string if the size is less than 1MB OR if the\n        // [curl][body_as_string] request value is set.\n        if (($size !== null && $size < 1000000) ||\n            !empty($options['_body_as_string'])\n        ) {\n            $conf[CURLOPT_POSTFIELDS] = (string) $request->getBody();\n            // Don't duplicate the Content-Length header\n            $this->removeHeader('Content-Length', $conf);\n            $this->removeHeader('Transfer-Encoding', $conf);\n        } else {\n            $conf[CURLOPT_UPLOAD] = true;\n            if ($size !== null) {\n                $conf[CURLOPT_INFILESIZE] = $size;\n                $this->removeHeader('Content-Length', $conf);\n            }\n            $body = $request->getBody();\n            if ($body->isSeekable()) {\n                $body->rewind();\n            }\n            $conf[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) {\n                return $body->read($length);\n            };\n        }\n\n        // If the Expect header is not present, prevent curl from adding it\n        if (!$request->hasHeader('Expect')) {\n            $conf[CURLOPT_HTTPHEADER][] = 'Expect:';\n        }\n\n        // cURL sometimes adds a content-type by default. Prevent this.\n        if (!$request->hasHeader('Content-Type')) {\n            $conf[CURLOPT_HTTPHEADER][] = 'Content-Type:';\n        }\n    }\n\n    private function applyHeaders(EasyHandle $easy, array &$conf)\n    {\n        foreach ($conf['_headers'] as $name => $values) {\n            foreach ($values as $value) {\n                $value = (string) $value;\n                if ($value === '') {\n                    // cURL requires a special format for empty headers.\n                    // See https://github.com/guzzle/guzzle/issues/1882 for more details.\n                    $conf[CURLOPT_HTTPHEADER][] = \"$name;\";\n                } else {\n                    $conf[CURLOPT_HTTPHEADER][] = \"$name: $value\";\n                }\n            }\n        }\n\n        // Remove the Accept header if one was not set\n        if (!$easy->request->hasHeader('Accept')) {\n            $conf[CURLOPT_HTTPHEADER][] = 'Accept:';\n        }\n    }\n\n    /**\n     * Remove a header from the options array.\n     *\n     * @param string $name    Case-insensitive header to remove\n     * @param array  $options Array of options to modify\n     */\n    private function removeHeader($name, array &$options)\n    {\n        foreach (array_keys($options['_headers']) as $key) {\n            if (!strcasecmp($key, $name)) {\n                unset($options['_headers'][$key]);\n                return;\n            }\n        }\n    }\n\n    private function applyHandlerOptions(EasyHandle $easy, array &$conf)\n    {\n        $options = $easy->options;\n        if (isset($options['verify'])) {\n            if ($options['verify'] === false) {\n                unset($conf[CURLOPT_CAINFO]);\n                $conf[CURLOPT_SSL_VERIFYHOST] = 0;\n                $conf[CURLOPT_SSL_VERIFYPEER] = false;\n            } else {\n                $conf[CURLOPT_SSL_VERIFYHOST] = 2;\n                $conf[CURLOPT_SSL_VERIFYPEER] = true;\n                if (is_string($options['verify'])) {\n                    // Throw an error if the file/folder/link path is not valid or doesn't exist.\n                    if (!file_exists($options['verify'])) {\n                        throw new \\InvalidArgumentException(\n                            \"SSL CA bundle not found: {$options['verify']}\"\n                        );\n                    }\n                    // If it's a directory or a link to a directory use CURLOPT_CAPATH.\n                    // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.\n                    if (is_dir($options['verify']) ||\n                        (is_link($options['verify']) && is_dir(readlink($options['verify'])))) {\n                        $conf[CURLOPT_CAPATH] = $options['verify'];\n                    } else {\n                        $conf[CURLOPT_CAINFO] = $options['verify'];\n                    }\n                }\n            }\n        }\n\n        if (!empty($options['decode_content'])) {\n            $accept = $easy->request->getHeaderLine('Accept-Encoding');\n            if ($accept) {\n                $conf[CURLOPT_ENCODING] = $accept;\n            } else {\n                $conf[CURLOPT_ENCODING] = '';\n                // Don't let curl send the header over the wire\n                $conf[CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';\n            }\n        }\n\n        if (isset($options['sink'])) {\n            $sink = $options['sink'];\n            if (!is_string($sink)) {\n                $sink = \\GuzzleHttp\\Psr7\\stream_for($sink);\n            } elseif (!is_dir(dirname($sink))) {\n                // Ensure that the directory exists before failing in curl.\n                throw new \\RuntimeException(sprintf(\n                    'Directory %s does not exist for sink value of %s',\n                    dirname($sink),\n                    $sink\n                ));\n            } else {\n                $sink = new LazyOpenStream($sink, 'w+');\n            }\n            $easy->sink = $sink;\n            $conf[CURLOPT_WRITEFUNCTION] = function ($ch, $write) use ($sink) {\n                return $sink->write($write);\n            };\n        } else {\n            // Use a default temp stream if no sink was set.\n            $conf[CURLOPT_FILE] = fopen('php://temp', 'w+');\n            $easy->sink = Psr7\\stream_for($conf[CURLOPT_FILE]);\n        }\n        $timeoutRequiresNoSignal = false;\n        if (isset($options['timeout'])) {\n            $timeoutRequiresNoSignal |= $options['timeout'] < 1;\n            $conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;\n        }\n\n        // CURL default value is CURL_IPRESOLVE_WHATEVER\n        if (isset($options['force_ip_resolve'])) {\n            if ('v4' === $options['force_ip_resolve']) {\n                $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;\n            } elseif ('v6' === $options['force_ip_resolve']) {\n                $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6;\n            }\n        }\n\n        if (isset($options['connect_timeout'])) {\n            $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1;\n            $conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;\n        }\n\n        if ($timeoutRequiresNoSignal && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') {\n            $conf[CURLOPT_NOSIGNAL] = true;\n        }\n\n        if (isset($options['proxy'])) {\n            if (!is_array($options['proxy'])) {\n                $conf[CURLOPT_PROXY] = $options['proxy'];\n            } else {\n                $scheme = $easy->request->getUri()->getScheme();\n                if (isset($options['proxy'][$scheme])) {\n                    $host = $easy->request->getUri()->getHost();\n                    if (!isset($options['proxy']['no']) ||\n                        !\\GuzzleHttp\\is_host_in_noproxy($host, $options['proxy']['no'])\n                    ) {\n                        $conf[CURLOPT_PROXY] = $options['proxy'][$scheme];\n                    }\n                }\n            }\n        }\n\n        if (isset($options['cert'])) {\n            $cert = $options['cert'];\n            if (is_array($cert)) {\n                $conf[CURLOPT_SSLCERTPASSWD] = $cert[1];\n                $cert = $cert[0];\n            }\n            if (!file_exists($cert)) {\n                throw new \\InvalidArgumentException(\n                    \"SSL certificate not found: {$cert}\"\n                );\n            }\n            $conf[CURLOPT_SSLCERT] = $cert;\n        }\n\n        if (isset($options['ssl_key'])) {\n            if (is_array($options['ssl_key'])) {\n                if (count($options['ssl_key']) === 2) {\n                    list($sslKey, $conf[CURLOPT_SSLKEYPASSWD]) = $options['ssl_key'];\n                } else {\n                    list($sslKey) = $options['ssl_key'];\n                }\n            }\n\n            $sslKey = isset($sslKey) ? $sslKey: $options['ssl_key'];\n\n            if (!file_exists($sslKey)) {\n                throw new \\InvalidArgumentException(\n                    \"SSL private key not found: {$sslKey}\"\n                );\n            }\n            $conf[CURLOPT_SSLKEY] = $sslKey;\n        }\n\n        if (isset($options['progress'])) {\n            $progress = $options['progress'];\n            if (!is_callable($progress)) {\n                throw new \\InvalidArgumentException(\n                    'progress client option must be callable'\n                );\n            }\n            $conf[CURLOPT_NOPROGRESS] = false;\n            $conf[CURLOPT_PROGRESSFUNCTION] = function () use ($progress) {\n                $args = func_get_args();\n                // PHP 5.5 pushed the handle onto the start of the args\n                if (is_resource($args[0])) {\n                    array_shift($args);\n                }\n                call_user_func_array($progress, $args);\n            };\n        }\n\n        if (!empty($options['debug'])) {\n            $conf[CURLOPT_STDERR] = \\GuzzleHttp\\debug_resource($options['debug']);\n            $conf[CURLOPT_VERBOSE] = true;\n        }\n    }\n\n    /**\n     * This function ensures that a response was set on a transaction. If one\n     * was not set, then the request is retried if possible. This error\n     * typically means you are sending a payload, curl encountered a\n     * \"Connection died, retrying a fresh connect\" error, tried to rewind the\n     * stream, and then encountered a \"necessary data rewind wasn't possible\"\n     * error, causing the request to be sent through curl_multi_info_read()\n     * without an error status.\n     */\n    private static function retryFailedRewind(\n        callable $handler,\n        EasyHandle $easy,\n        array $ctx\n    ) {\n        try {\n            // Only rewind if the body has been read from.\n            $body = $easy->request->getBody();\n            if ($body->tell() > 0) {\n                $body->rewind();\n            }\n        } catch (\\RuntimeException $e) {\n            $ctx['error'] = 'The connection unexpectedly failed without '\n                . 'providing an error. The request would have been retried, '\n                . 'but attempting to rewind the request body failed. '\n                . 'Exception: ' . $e;\n            return self::createRejection($easy, $ctx);\n        }\n\n        // Retry no more than 3 times before giving up.\n        if (!isset($easy->options['_curl_retries'])) {\n            $easy->options['_curl_retries'] = 1;\n        } elseif ($easy->options['_curl_retries'] == 2) {\n            $ctx['error'] = 'The cURL request was retried 3 times '\n                . 'and did not succeed. The most likely reason for the failure '\n                . 'is that cURL was unable to rewind the body of the request '\n                . 'and subsequent retries resulted in the same error. Turn on '\n                . 'the debug option to see what went wrong. See '\n                . 'https://bugs.php.net/bug.php?id=47204 for more information.';\n            return self::createRejection($easy, $ctx);\n        } else {\n            $easy->options['_curl_retries']++;\n        }\n\n        return $handler($easy->request, $easy->options);\n    }\n\n    private function createHeaderFn(EasyHandle $easy)\n    {\n        if (isset($easy->options['on_headers'])) {\n            $onHeaders = $easy->options['on_headers'];\n\n            if (!is_callable($onHeaders)) {\n                throw new \\InvalidArgumentException('on_headers must be callable');\n            }\n        } else {\n            $onHeaders = null;\n        }\n\n        return function ($ch, $h) use (\n            $onHeaders,\n            $easy,\n            &$startingResponse\n        ) {\n            $value = trim($h);\n            if ($value === '') {\n                $startingResponse = true;\n                $easy->createResponse();\n                if ($onHeaders !== null) {\n                    try {\n                        $onHeaders($easy->response);\n                    } catch (\\Exception $e) {\n                        // Associate the exception with the handle and trigger\n                        // a curl header write error by returning 0.\n                        $easy->onHeadersException = $e;\n                        return -1;\n                    }\n                }\n            } elseif ($startingResponse) {\n                $startingResponse = false;\n                $easy->headers = [$value];\n            } else {\n                $easy->headers[] = $value;\n            }\n            return strlen($h);\n        };\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse Psr\\Http\\Message\\RequestInterface;\n\ninterface CurlFactoryInterface\n{\n    /**\n     * Creates a cURL handle resource.\n     *\n     * @param RequestInterface $request Request\n     * @param array            $options Transfer options\n     *\n     * @return EasyHandle\n     * @throws \\RuntimeException when an option cannot be applied\n     */\n    public function create(RequestInterface $request, array $options);\n\n    /**\n     * Release an easy handle, allowing it to be reused or closed.\n     *\n     * This function must call unset on the easy handle's \"handle\" property.\n     *\n     * @param EasyHandle $easy\n     */\n    public function release(EasyHandle $easy);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * HTTP handler that uses cURL easy handles as a transport layer.\n *\n * When using the CurlHandler, custom curl options can be specified as an\n * associative array of curl option constants mapping to values in the\n * **curl** key of the \"client\" key of the request.\n */\nclass CurlHandler\n{\n    /** @var CurlFactoryInterface */\n    private $factory;\n\n    /**\n     * Accepts an associative array of options:\n     *\n     * - factory: Optional curl factory used to create cURL handles.\n     *\n     * @param array $options Array of options to use with the handler\n     */\n    public function __construct(array $options = [])\n    {\n        $this->factory = isset($options['handle_factory'])\n            ? $options['handle_factory']\n            : new CurlFactory(3);\n    }\n\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        if (isset($options['delay'])) {\n            usleep($options['delay'] * 1000);\n        }\n\n        $easy = $this->factory->create($request, $options);\n        curl_exec($easy->handle);\n        $easy->errno = curl_errno($easy->handle);\n\n        return CurlFactory::finish($this, $easy, $this->factory);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Promise as P;\nuse GuzzleHttp\\Promise\\Promise;\nuse GuzzleHttp\\Utils;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Returns an asynchronous response using curl_multi_* functions.\n *\n * When using the CurlMultiHandler, custom curl options can be specified as an\n * associative array of curl option constants mapping to values in the\n * **curl** key of the provided request options.\n *\n * @property resource $_mh Internal use only. Lazy loaded multi-handle.\n */\nclass CurlMultiHandler\n{\n    /** @var CurlFactoryInterface */\n    private $factory;\n    private $selectTimeout;\n    private $active;\n    private $handles = [];\n    private $delays = [];\n    private $options = [];\n\n    /**\n     * This handler accepts the following options:\n     *\n     * - handle_factory: An optional factory  used to create curl handles\n     * - select_timeout: Optional timeout (in seconds) to block before timing\n     *   out while selecting curl handles. Defaults to 1 second.\n     * - options: An associative array of CURLMOPT_* options and\n     *   corresponding values for curl_multi_setopt()\n     *\n     * @param array $options\n     */\n    public function __construct(array $options = [])\n    {\n        $this->factory = isset($options['handle_factory'])\n            ? $options['handle_factory'] : new CurlFactory(50);\n\n        if (isset($options['select_timeout'])) {\n            $this->selectTimeout = $options['select_timeout'];\n        } elseif ($selectTimeout = getenv('GUZZLE_CURL_SELECT_TIMEOUT')) {\n            $this->selectTimeout = $selectTimeout;\n        } else {\n            $this->selectTimeout = 1;\n        }\n\n        $this->options = isset($options['options']) ? $options['options'] : [];\n    }\n\n    public function __get($name)\n    {\n        if ($name === '_mh') {\n            $this->_mh = curl_multi_init();\n\n            foreach ($this->options as $option => $value) {\n                // A warning is raised in case of a wrong option.\n                curl_multi_setopt($this->_mh, $option, $value);\n            }\n\n            // Further calls to _mh will return the value directly, without entering the\n            // __get() method at all.\n            return $this->_mh;\n        }\n\n        throw new \\BadMethodCallException();\n    }\n\n    public function __destruct()\n    {\n        if (isset($this->_mh)) {\n            curl_multi_close($this->_mh);\n            unset($this->_mh);\n        }\n    }\n\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        $easy = $this->factory->create($request, $options);\n        $id = (int) $easy->handle;\n\n        $promise = new Promise(\n            [$this, 'execute'],\n            function () use ($id) {\n                return $this->cancel($id);\n            }\n        );\n\n        $this->addRequest(['easy' => $easy, 'deferred' => $promise]);\n\n        return $promise;\n    }\n\n    /**\n     * Ticks the curl event loop.\n     */\n    public function tick()\n    {\n        // Add any delayed handles if needed.\n        if ($this->delays) {\n            $currentTime = Utils::currentTime();\n            foreach ($this->delays as $id => $delay) {\n                if ($currentTime >= $delay) {\n                    unset($this->delays[$id]);\n                    curl_multi_add_handle(\n                        $this->_mh,\n                        $this->handles[$id]['easy']->handle\n                    );\n                }\n            }\n        }\n\n        // Step through the task queue which may add additional requests.\n        P\\queue()->run();\n\n        if ($this->active &&\n            curl_multi_select($this->_mh, $this->selectTimeout) === -1\n        ) {\n            // Perform a usleep if a select returns -1.\n            // See: https://bugs.php.net/bug.php?id=61141\n            usleep(250);\n        }\n\n        while (curl_multi_exec($this->_mh, $this->active) === CURLM_CALL_MULTI_PERFORM);\n\n        $this->processMessages();\n    }\n\n    /**\n     * Runs until all outstanding connections have completed.\n     */\n    public function execute()\n    {\n        $queue = P\\queue();\n\n        while ($this->handles || !$queue->isEmpty()) {\n            // If there are no transfers, then sleep for the next delay\n            if (!$this->active && $this->delays) {\n                usleep($this->timeToNext());\n            }\n            $this->tick();\n        }\n    }\n\n    private function addRequest(array $entry)\n    {\n        $easy = $entry['easy'];\n        $id = (int) $easy->handle;\n        $this->handles[$id] = $entry;\n        if (empty($easy->options['delay'])) {\n            curl_multi_add_handle($this->_mh, $easy->handle);\n        } else {\n            $this->delays[$id] = Utils::currentTime() + ($easy->options['delay'] / 1000);\n        }\n    }\n\n    /**\n     * Cancels a handle from sending and removes references to it.\n     *\n     * @param int $id Handle ID to cancel and remove.\n     *\n     * @return bool True on success, false on failure.\n     */\n    private function cancel($id)\n    {\n        // Cannot cancel if it has been processed.\n        if (!isset($this->handles[$id])) {\n            return false;\n        }\n\n        $handle = $this->handles[$id]['easy']->handle;\n        unset($this->delays[$id], $this->handles[$id]);\n        curl_multi_remove_handle($this->_mh, $handle);\n        curl_close($handle);\n\n        return true;\n    }\n\n    private function processMessages()\n    {\n        while ($done = curl_multi_info_read($this->_mh)) {\n            $id = (int) $done['handle'];\n            curl_multi_remove_handle($this->_mh, $done['handle']);\n\n            if (!isset($this->handles[$id])) {\n                // Probably was cancelled.\n                continue;\n            }\n\n            $entry = $this->handles[$id];\n            unset($this->handles[$id], $this->delays[$id]);\n            $entry['easy']->errno = $done['result'];\n            $entry['deferred']->resolve(\n                CurlFactory::finish(\n                    $this,\n                    $entry['easy'],\n                    $this->factory\n                )\n            );\n        }\n    }\n\n    private function timeToNext()\n    {\n        $currentTime = Utils::currentTime();\n        $nextTime = PHP_INT_MAX;\n        foreach ($this->delays as $time) {\n            if ($time < $nextTime) {\n                $nextTime = $time;\n            }\n        }\n\n        return max(0, $nextTime - $currentTime) * 1000000;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Represents a cURL easy handle and the data it populates.\n *\n * @internal\n */\nfinal class EasyHandle\n{\n    /** @var resource cURL resource */\n    public $handle;\n\n    /** @var StreamInterface Where data is being written */\n    public $sink;\n\n    /** @var array Received HTTP headers so far */\n    public $headers = [];\n\n    /** @var ResponseInterface Received response (if any) */\n    public $response;\n\n    /** @var RequestInterface Request being sent */\n    public $request;\n\n    /** @var array Request options */\n    public $options = [];\n\n    /** @var int cURL error number (if any) */\n    public $errno = 0;\n\n    /** @var \\Exception Exception during on_headers (if any) */\n    public $onHeadersException;\n\n    /**\n     * Attach a response to the easy handle based on the received headers.\n     *\n     * @throws \\RuntimeException if no headers have been received.\n     */\n    public function createResponse()\n    {\n        if (empty($this->headers)) {\n            throw new \\RuntimeException('No headers have been received');\n        }\n\n        // HTTP-version SP status-code SP reason-phrase\n        $startLine = explode(' ', array_shift($this->headers), 3);\n        $headers = \\GuzzleHttp\\headers_from_lines($this->headers);\n        $normalizedKeys = \\GuzzleHttp\\normalize_header_keys($headers);\n\n        if (!empty($this->options['decode_content'])\n            && isset($normalizedKeys['content-encoding'])\n        ) {\n            $headers['x-encoded-content-encoding']\n                = $headers[$normalizedKeys['content-encoding']];\n            unset($headers[$normalizedKeys['content-encoding']]);\n            if (isset($normalizedKeys['content-length'])) {\n                $headers['x-encoded-content-length']\n                    = $headers[$normalizedKeys['content-length']];\n\n                $bodyLength = (int) $this->sink->getSize();\n                if ($bodyLength) {\n                    $headers[$normalizedKeys['content-length']] = $bodyLength;\n                } else {\n                    unset($headers[$normalizedKeys['content-length']]);\n                }\n            }\n        }\n\n        // Attach a response to the easy handle with the parsed headers.\n        $this->response = new Response(\n            $startLine[1],\n            $headers,\n            $this->sink,\n            substr($startLine[0], 5),\n            isset($startLine[2]) ? (string) $startLine[2] : null\n        );\n    }\n\n    public function __get($name)\n    {\n        $msg = $name === 'handle'\n            ? 'The EasyHandle has been released'\n            : 'Invalid property: ' . $name;\n        throw new \\BadMethodCallException($msg);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\HandlerStack;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Promise\\RejectedPromise;\nuse GuzzleHttp\\TransferStats;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Handler that returns responses or throw exceptions from a queue.\n */\nclass MockHandler implements \\Countable\n{\n    private $queue = [];\n    private $lastRequest;\n    private $lastOptions;\n    private $onFulfilled;\n    private $onRejected;\n\n    /**\n     * Creates a new MockHandler that uses the default handler stack list of\n     * middlewares.\n     *\n     * @param array $queue Array of responses, callables, or exceptions.\n     * @param callable $onFulfilled Callback to invoke when the return value is fulfilled.\n     * @param callable $onRejected  Callback to invoke when the return value is rejected.\n     *\n     * @return HandlerStack\n     */\n    public static function createWithMiddleware(\n        array $queue = null,\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        return HandlerStack::create(new self($queue, $onFulfilled, $onRejected));\n    }\n\n    /**\n     * The passed in value must be an array of\n     * {@see Psr7\\Http\\Message\\ResponseInterface} objects, Exceptions,\n     * callables, or Promises.\n     *\n     * @param array $queue\n     * @param callable $onFulfilled Callback to invoke when the return value is fulfilled.\n     * @param callable $onRejected  Callback to invoke when the return value is rejected.\n     */\n    public function __construct(\n        array $queue = null,\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        $this->onFulfilled = $onFulfilled;\n        $this->onRejected = $onRejected;\n\n        if ($queue) {\n            call_user_func_array([$this, 'append'], $queue);\n        }\n    }\n\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        if (!$this->queue) {\n            throw new \\OutOfBoundsException('Mock queue is empty');\n        }\n\n        if (isset($options['delay']) && is_numeric($options['delay'])) {\n            usleep($options['delay'] * 1000);\n        }\n\n        $this->lastRequest = $request;\n        $this->lastOptions = $options;\n        $response = array_shift($this->queue);\n\n        if (isset($options['on_headers'])) {\n            if (!is_callable($options['on_headers'])) {\n                throw new \\InvalidArgumentException('on_headers must be callable');\n            }\n            try {\n                $options['on_headers']($response);\n            } catch (\\Exception $e) {\n                $msg = 'An error was encountered during the on_headers event';\n                $response = new RequestException($msg, $request, $response, $e);\n            }\n        }\n\n        if (is_callable($response)) {\n            $response = call_user_func($response, $request, $options);\n        }\n\n        $response = $response instanceof \\Exception\n            ? \\GuzzleHttp\\Promise\\rejection_for($response)\n            : \\GuzzleHttp\\Promise\\promise_for($response);\n\n        return $response->then(\n            function ($value) use ($request, $options) {\n                $this->invokeStats($request, $options, $value);\n                if ($this->onFulfilled) {\n                    call_user_func($this->onFulfilled, $value);\n                }\n                if (isset($options['sink'])) {\n                    $contents = (string) $value->getBody();\n                    $sink = $options['sink'];\n\n                    if (is_resource($sink)) {\n                        fwrite($sink, $contents);\n                    } elseif (is_string($sink)) {\n                        file_put_contents($sink, $contents);\n                    } elseif ($sink instanceof \\Psr\\Http\\Message\\StreamInterface) {\n                        $sink->write($contents);\n                    }\n                }\n\n                return $value;\n            },\n            function ($reason) use ($request, $options) {\n                $this->invokeStats($request, $options, null, $reason);\n                if ($this->onRejected) {\n                    call_user_func($this->onRejected, $reason);\n                }\n                return \\GuzzleHttp\\Promise\\rejection_for($reason);\n            }\n        );\n    }\n\n    /**\n     * Adds one or more variadic requests, exceptions, callables, or promises\n     * to the queue.\n     */\n    public function append()\n    {\n        foreach (func_get_args() as $value) {\n            if ($value instanceof ResponseInterface\n                || $value instanceof \\Exception\n                || $value instanceof PromiseInterface\n                || is_callable($value)\n            ) {\n                $this->queue[] = $value;\n            } else {\n                throw new \\InvalidArgumentException('Expected a response or '\n                    . 'exception. Found ' . \\GuzzleHttp\\describe_type($value));\n            }\n        }\n    }\n\n    /**\n     * Get the last received request.\n     *\n     * @return RequestInterface\n     */\n    public function getLastRequest()\n    {\n        return $this->lastRequest;\n    }\n\n    /**\n     * Get the last received request options.\n     *\n     * @return array\n     */\n    public function getLastOptions()\n    {\n        return $this->lastOptions;\n    }\n\n    /**\n     * Returns the number of remaining items in the queue.\n     *\n     * @return int\n     */\n    public function count()\n    {\n        return count($this->queue);\n    }\n\n    public function reset()\n    {\n        $this->queue = [];\n    }\n\n    private function invokeStats(\n        RequestInterface $request,\n        array $options,\n        ResponseInterface $response = null,\n        $reason = null\n    ) {\n        if (isset($options['on_stats'])) {\n            $transferTime = isset($options['transfer_time']) ? $options['transfer_time'] : 0;\n            $stats = new TransferStats($request, $response, $transferTime, $reason);\n            call_user_func($options['on_stats'], $stats);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\RequestOptions;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Provides basic proxies for handlers.\n */\nclass Proxy\n{\n    /**\n     * Sends synchronous requests to a specific handler while sending all other\n     * requests to another handler.\n     *\n     * @param callable $default Handler used for normal responses\n     * @param callable $sync    Handler used for synchronous responses.\n     *\n     * @return callable Returns the composed handler.\n     */\n    public static function wrapSync(\n        callable $default,\n        callable $sync\n    ) {\n        return function (RequestInterface $request, array $options) use ($default, $sync) {\n            return empty($options[RequestOptions::SYNCHRONOUS])\n                ? $default($request, $options)\n                : $sync($request, $options);\n        };\n    }\n\n    /**\n     * Sends streaming requests to a streaming compatible handler while sending\n     * all other requests to a default handler.\n     *\n     * This, for example, could be useful for taking advantage of the\n     * performance benefits of curl while still supporting true streaming\n     * through the StreamHandler.\n     *\n     * @param callable $default   Handler used for non-streaming responses\n     * @param callable $streaming Handler used for streaming responses\n     *\n     * @return callable Returns the composed handler.\n     */\n    public static function wrapStreaming(\n        callable $default,\n        callable $streaming\n    ) {\n        return function (RequestInterface $request, array $options) use ($default, $streaming) {\n            return empty($options['stream'])\n                ? $default($request, $options)\n                : $streaming($request, $options);\n        };\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php",
    "content": "<?php\nnamespace GuzzleHttp\\Handler;\n\nuse GuzzleHttp\\Exception\\ConnectException;\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Promise\\FulfilledPromise;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Psr7;\nuse GuzzleHttp\\TransferStats;\nuse GuzzleHttp\\Utils;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * HTTP handler that uses PHP's HTTP stream wrapper.\n */\nclass StreamHandler\n{\n    private $lastHeaders = [];\n\n    /**\n     * Sends an HTTP request.\n     *\n     * @param RequestInterface $request Request to send.\n     * @param array            $options Request transfer options.\n     *\n     * @return PromiseInterface\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        // Sleep if there is a delay specified.\n        if (isset($options['delay'])) {\n            usleep($options['delay'] * 1000);\n        }\n\n        $startTime = isset($options['on_stats']) ? Utils::currentTime() : null;\n\n        try {\n            // Does not support the expect header.\n            $request = $request->withoutHeader('Expect');\n\n            // Append a content-length header if body size is zero to match\n            // cURL's behavior.\n            if (0 === $request->getBody()->getSize()) {\n                $request = $request->withHeader('Content-Length', '0');\n            }\n\n            return $this->createResponse(\n                $request,\n                $options,\n                $this->createStream($request, $options),\n                $startTime\n            );\n        } catch (\\InvalidArgumentException $e) {\n            throw $e;\n        } catch (\\Exception $e) {\n            // Determine if the error was a networking error.\n            $message = $e->getMessage();\n            // This list can probably get more comprehensive.\n            if (strpos($message, 'getaddrinfo') // DNS lookup failed\n                || strpos($message, 'Connection refused')\n                || strpos($message, \"couldn't connect to host\") // error on HHVM\n                || strpos($message, \"connection attempt failed\")\n            ) {\n                $e = new ConnectException($e->getMessage(), $request, $e);\n            }\n            $e = RequestException::wrapException($request, $e);\n            $this->invokeStats($options, $request, $startTime, null, $e);\n\n            return \\GuzzleHttp\\Promise\\rejection_for($e);\n        }\n    }\n\n    private function invokeStats(\n        array $options,\n        RequestInterface $request,\n        $startTime,\n        ResponseInterface $response = null,\n        $error = null\n    ) {\n        if (isset($options['on_stats'])) {\n            $stats = new TransferStats(\n                $request,\n                $response,\n                Utils::currentTime() - $startTime,\n                $error,\n                []\n            );\n            call_user_func($options['on_stats'], $stats);\n        }\n    }\n\n    private function createResponse(\n        RequestInterface $request,\n        array $options,\n        $stream,\n        $startTime\n    ) {\n        $hdrs = $this->lastHeaders;\n        $this->lastHeaders = [];\n        $parts = explode(' ', array_shift($hdrs), 3);\n        $ver = explode('/', $parts[0])[1];\n        $status = $parts[1];\n        $reason = isset($parts[2]) ? $parts[2] : null;\n        $headers = \\GuzzleHttp\\headers_from_lines($hdrs);\n        list($stream, $headers) = $this->checkDecode($options, $headers, $stream);\n        $stream = Psr7\\stream_for($stream);\n        $sink = $stream;\n\n        if (strcasecmp('HEAD', $request->getMethod())) {\n            $sink = $this->createSink($stream, $options);\n        }\n\n        $response = new Psr7\\Response($status, $headers, $sink, $ver, $reason);\n\n        if (isset($options['on_headers'])) {\n            try {\n                $options['on_headers']($response);\n            } catch (\\Exception $e) {\n                $msg = 'An error was encountered during the on_headers event';\n                $ex = new RequestException($msg, $request, $response, $e);\n                return \\GuzzleHttp\\Promise\\rejection_for($ex);\n            }\n        }\n\n        // Do not drain when the request is a HEAD request because they have\n        // no body.\n        if ($sink !== $stream) {\n            $this->drain(\n                $stream,\n                $sink,\n                $response->getHeaderLine('Content-Length')\n            );\n        }\n\n        $this->invokeStats($options, $request, $startTime, $response, null);\n\n        return new FulfilledPromise($response);\n    }\n\n    private function createSink(StreamInterface $stream, array $options)\n    {\n        if (!empty($options['stream'])) {\n            return $stream;\n        }\n\n        $sink = isset($options['sink'])\n            ? $options['sink']\n            : fopen('php://temp', 'r+');\n\n        return is_string($sink)\n            ? new Psr7\\LazyOpenStream($sink, 'w+')\n            : Psr7\\stream_for($sink);\n    }\n\n    private function checkDecode(array $options, array $headers, $stream)\n    {\n        // Automatically decode responses when instructed.\n        if (!empty($options['decode_content'])) {\n            $normalizedKeys = \\GuzzleHttp\\normalize_header_keys($headers);\n            if (isset($normalizedKeys['content-encoding'])) {\n                $encoding = $headers[$normalizedKeys['content-encoding']];\n                if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') {\n                    $stream = new Psr7\\InflateStream(\n                        Psr7\\stream_for($stream)\n                    );\n                    $headers['x-encoded-content-encoding']\n                        = $headers[$normalizedKeys['content-encoding']];\n                    // Remove content-encoding header\n                    unset($headers[$normalizedKeys['content-encoding']]);\n                    // Fix content-length header\n                    if (isset($normalizedKeys['content-length'])) {\n                        $headers['x-encoded-content-length']\n                            = $headers[$normalizedKeys['content-length']];\n\n                        $length = (int) $stream->getSize();\n                        if ($length === 0) {\n                            unset($headers[$normalizedKeys['content-length']]);\n                        } else {\n                            $headers[$normalizedKeys['content-length']] = [$length];\n                        }\n                    }\n                }\n            }\n        }\n\n        return [$stream, $headers];\n    }\n\n    /**\n     * Drains the source stream into the \"sink\" client option.\n     *\n     * @param StreamInterface $source\n     * @param StreamInterface $sink\n     * @param string          $contentLength Header specifying the amount of\n     *                                       data to read.\n     *\n     * @return StreamInterface\n     * @throws \\RuntimeException when the sink option is invalid.\n     */\n    private function drain(\n        StreamInterface $source,\n        StreamInterface $sink,\n        $contentLength\n    ) {\n        // If a content-length header is provided, then stop reading once\n        // that number of bytes has been read. This can prevent infinitely\n        // reading from a stream when dealing with servers that do not honor\n        // Connection: Close headers.\n        Psr7\\copy_to_stream(\n            $source,\n            $sink,\n            (strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1\n        );\n\n        $sink->seek(0);\n        $source->close();\n\n        return $sink;\n    }\n\n    /**\n     * Create a resource and check to ensure it was created successfully\n     *\n     * @param callable $callback Callable that returns stream resource\n     *\n     * @return resource\n     * @throws \\RuntimeException on error\n     */\n    private function createResource(callable $callback)\n    {\n        $errors = null;\n        set_error_handler(function ($_, $msg, $file, $line) use (&$errors) {\n            $errors[] = [\n                'message' => $msg,\n                'file'    => $file,\n                'line'    => $line\n            ];\n            return true;\n        });\n\n        $resource = $callback();\n        restore_error_handler();\n\n        if (!$resource) {\n            $message = 'Error creating resource: ';\n            foreach ($errors as $err) {\n                foreach ($err as $key => $value) {\n                    $message .= \"[$key] $value\" . PHP_EOL;\n                }\n            }\n            throw new \\RuntimeException(trim($message));\n        }\n\n        return $resource;\n    }\n\n    private function createStream(RequestInterface $request, array $options)\n    {\n        static $methods;\n        if (!$methods) {\n            $methods = array_flip(get_class_methods(__CLASS__));\n        }\n\n        // HTTP/1.1 streams using the PHP stream wrapper require a\n        // Connection: close header\n        if ($request->getProtocolVersion() == '1.1'\n            && !$request->hasHeader('Connection')\n        ) {\n            $request = $request->withHeader('Connection', 'close');\n        }\n\n        // Ensure SSL is verified by default\n        if (!isset($options['verify'])) {\n            $options['verify'] = true;\n        }\n\n        $params = [];\n        $context = $this->getDefaultContext($request);\n\n        if (isset($options['on_headers']) && !is_callable($options['on_headers'])) {\n            throw new \\InvalidArgumentException('on_headers must be callable');\n        }\n\n        if (!empty($options)) {\n            foreach ($options as $key => $value) {\n                $method = \"add_{$key}\";\n                if (isset($methods[$method])) {\n                    $this->{$method}($request, $context, $value, $params);\n                }\n            }\n        }\n\n        if (isset($options['stream_context'])) {\n            if (!is_array($options['stream_context'])) {\n                throw new \\InvalidArgumentException('stream_context must be an array');\n            }\n            $context = array_replace_recursive(\n                $context,\n                $options['stream_context']\n            );\n        }\n\n        // Microsoft NTLM authentication only supported with curl handler\n        if (isset($options['auth'])\n            && is_array($options['auth'])\n            && isset($options['auth'][2])\n            && 'ntlm' == $options['auth'][2]\n        ) {\n            throw new \\InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler');\n        }\n\n        $uri = $this->resolveHost($request, $options);\n\n        $context = $this->createResource(\n            function () use ($context, $params) {\n                return stream_context_create($context, $params);\n            }\n        );\n\n        return $this->createResource(\n            function () use ($uri, &$http_response_header, $context, $options) {\n                $resource = fopen((string) $uri, 'r', null, $context);\n                $this->lastHeaders = $http_response_header;\n\n                if (isset($options['read_timeout'])) {\n                    $readTimeout = $options['read_timeout'];\n                    $sec = (int) $readTimeout;\n                    $usec = ($readTimeout - $sec) * 100000;\n                    stream_set_timeout($resource, $sec, $usec);\n                }\n\n                return $resource;\n            }\n        );\n    }\n\n    private function resolveHost(RequestInterface $request, array $options)\n    {\n        $uri = $request->getUri();\n\n        if (isset($options['force_ip_resolve']) && !filter_var($uri->getHost(), FILTER_VALIDATE_IP)) {\n            if ('v4' === $options['force_ip_resolve']) {\n                $records = dns_get_record($uri->getHost(), DNS_A);\n                if (!isset($records[0]['ip'])) {\n                    throw new ConnectException(\n                        sprintf(\n                            \"Could not resolve IPv4 address for host '%s'\",\n                            $uri->getHost()\n                        ),\n                        $request\n                    );\n                }\n                $uri = $uri->withHost($records[0]['ip']);\n            } elseif ('v6' === $options['force_ip_resolve']) {\n                $records = dns_get_record($uri->getHost(), DNS_AAAA);\n                if (!isset($records[0]['ipv6'])) {\n                    throw new ConnectException(\n                        sprintf(\n                            \"Could not resolve IPv6 address for host '%s'\",\n                            $uri->getHost()\n                        ),\n                        $request\n                    );\n                }\n                $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']');\n            }\n        }\n\n        return $uri;\n    }\n\n    private function getDefaultContext(RequestInterface $request)\n    {\n        $headers = '';\n        foreach ($request->getHeaders() as $name => $value) {\n            foreach ($value as $val) {\n                $headers .= \"$name: $val\\r\\n\";\n            }\n        }\n\n        $context = [\n            'http' => [\n                'method'           => $request->getMethod(),\n                'header'           => $headers,\n                'protocol_version' => $request->getProtocolVersion(),\n                'ignore_errors'    => true,\n                'follow_location'  => 0,\n            ],\n        ];\n\n        $body = (string) $request->getBody();\n\n        if (!empty($body)) {\n            $context['http']['content'] = $body;\n            // Prevent the HTTP handler from adding a Content-Type header.\n            if (!$request->hasHeader('Content-Type')) {\n                $context['http']['header'] .= \"Content-Type:\\r\\n\";\n            }\n        }\n\n        $context['http']['header'] = rtrim($context['http']['header']);\n\n        return $context;\n    }\n\n    private function add_proxy(RequestInterface $request, &$options, $value, &$params)\n    {\n        if (!is_array($value)) {\n            $options['http']['proxy'] = $value;\n        } else {\n            $scheme = $request->getUri()->getScheme();\n            if (isset($value[$scheme])) {\n                if (!isset($value['no'])\n                    || !\\GuzzleHttp\\is_host_in_noproxy(\n                        $request->getUri()->getHost(),\n                        $value['no']\n                    )\n                ) {\n                    $options['http']['proxy'] = $value[$scheme];\n                }\n            }\n        }\n    }\n\n    private function add_timeout(RequestInterface $request, &$options, $value, &$params)\n    {\n        if ($value > 0) {\n            $options['http']['timeout'] = $value;\n        }\n    }\n\n    private function add_verify(RequestInterface $request, &$options, $value, &$params)\n    {\n        if ($value === true) {\n            // PHP 5.6 or greater will find the system cert by default. When\n            // < 5.6, use the Guzzle bundled cacert.\n            if (PHP_VERSION_ID < 50600) {\n                $options['ssl']['cafile'] = \\GuzzleHttp\\default_ca_bundle();\n            }\n        } elseif (is_string($value)) {\n            $options['ssl']['cafile'] = $value;\n            if (!file_exists($value)) {\n                throw new \\RuntimeException(\"SSL CA bundle not found: $value\");\n            }\n        } elseif ($value === false) {\n            $options['ssl']['verify_peer'] = false;\n            $options['ssl']['verify_peer_name'] = false;\n            return;\n        } else {\n            throw new \\InvalidArgumentException('Invalid verify request option');\n        }\n\n        $options['ssl']['verify_peer'] = true;\n        $options['ssl']['verify_peer_name'] = true;\n        $options['ssl']['allow_self_signed'] = false;\n    }\n\n    private function add_cert(RequestInterface $request, &$options, $value, &$params)\n    {\n        if (is_array($value)) {\n            $options['ssl']['passphrase'] = $value[1];\n            $value = $value[0];\n        }\n\n        if (!file_exists($value)) {\n            throw new \\RuntimeException(\"SSL certificate not found: {$value}\");\n        }\n\n        $options['ssl']['local_cert'] = $value;\n    }\n\n    private function add_progress(RequestInterface $request, &$options, $value, &$params)\n    {\n        $this->addNotification(\n            $params,\n            function ($code, $a, $b, $c, $transferred, $total) use ($value) {\n                if ($code == STREAM_NOTIFY_PROGRESS) {\n                    $value($total, $transferred, null, null);\n                }\n            }\n        );\n    }\n\n    private function add_debug(RequestInterface $request, &$options, $value, &$params)\n    {\n        if ($value === false) {\n            return;\n        }\n\n        static $map = [\n            STREAM_NOTIFY_CONNECT       => 'CONNECT',\n            STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',\n            STREAM_NOTIFY_AUTH_RESULT   => 'AUTH_RESULT',\n            STREAM_NOTIFY_MIME_TYPE_IS  => 'MIME_TYPE_IS',\n            STREAM_NOTIFY_FILE_SIZE_IS  => 'FILE_SIZE_IS',\n            STREAM_NOTIFY_REDIRECTED    => 'REDIRECTED',\n            STREAM_NOTIFY_PROGRESS      => 'PROGRESS',\n            STREAM_NOTIFY_FAILURE       => 'FAILURE',\n            STREAM_NOTIFY_COMPLETED     => 'COMPLETED',\n            STREAM_NOTIFY_RESOLVE       => 'RESOLVE',\n        ];\n        static $args = ['severity', 'message', 'message_code',\n            'bytes_transferred', 'bytes_max'];\n\n        $value = \\GuzzleHttp\\debug_resource($value);\n        $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment('');\n        $this->addNotification(\n            $params,\n            function () use ($ident, $value, $map, $args) {\n                $passed = func_get_args();\n                $code = array_shift($passed);\n                fprintf($value, '<%s> [%s] ', $ident, $map[$code]);\n                foreach (array_filter($passed) as $i => $v) {\n                    fwrite($value, $args[$i] . ': \"' . $v . '\" ');\n                }\n                fwrite($value, \"\\n\");\n            }\n        );\n    }\n\n    private function addNotification(array &$params, callable $notify)\n    {\n        // Wrap the existing function if needed.\n        if (!isset($params['notification'])) {\n            $params['notification'] = $notify;\n        } else {\n            $params['notification'] = $this->callArray([\n                $params['notification'],\n                $notify\n            ]);\n        }\n    }\n\n    private function callArray(array $functions)\n    {\n        return function () use ($functions) {\n            $args = func_get_args();\n            foreach ($functions as $fn) {\n                call_user_func_array($fn, $args);\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/HandlerStack.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Creates a composed Guzzle handler function by stacking middlewares on top of\n * an HTTP handler function.\n */\nclass HandlerStack\n{\n    /** @var callable|null */\n    private $handler;\n\n    /** @var array */\n    private $stack = [];\n\n    /** @var callable|null */\n    private $cached;\n\n    /**\n     * Creates a default handler stack that can be used by clients.\n     *\n     * The returned handler will wrap the provided handler or use the most\n     * appropriate default handler for your system. The returned HandlerStack has\n     * support for cookies, redirects, HTTP error exceptions, and preparing a body\n     * before sending.\n     *\n     * The returned handler stack can be passed to a client in the \"handler\"\n     * option.\n     *\n     * @param callable $handler HTTP handler function to use with the stack. If no\n     *                          handler is provided, the best handler for your\n     *                          system will be utilized.\n     *\n     * @return HandlerStack\n     */\n    public static function create(callable $handler = null)\n    {\n        $stack = new self($handler ?: choose_handler());\n        $stack->push(Middleware::httpErrors(), 'http_errors');\n        $stack->push(Middleware::redirect(), 'allow_redirects');\n        $stack->push(Middleware::cookies(), 'cookies');\n        $stack->push(Middleware::prepareBody(), 'prepare_body');\n\n        return $stack;\n    }\n\n    /**\n     * @param callable $handler Underlying HTTP handler.\n     */\n    public function __construct(callable $handler = null)\n    {\n        $this->handler = $handler;\n    }\n\n    /**\n     * Invokes the handler stack as a composed handler\n     *\n     * @param RequestInterface $request\n     * @param array            $options\n     *\n     * @return ResponseInterface|PromiseInterface\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        $handler = $this->resolve();\n\n        return $handler($request, $options);\n    }\n\n    /**\n     * Dumps a string representation of the stack.\n     *\n     * @return string\n     */\n    public function __toString()\n    {\n        $depth = 0;\n        $stack = [];\n        if ($this->handler) {\n            $stack[] = \"0) Handler: \" . $this->debugCallable($this->handler);\n        }\n\n        $result = '';\n        foreach (array_reverse($this->stack) as $tuple) {\n            $depth++;\n            $str = \"{$depth}) Name: '{$tuple[1]}', \";\n            $str .= \"Function: \" . $this->debugCallable($tuple[0]);\n            $result = \"> {$str}\\n{$result}\";\n            $stack[] = $str;\n        }\n\n        foreach (array_keys($stack) as $k) {\n            $result .= \"< {$stack[$k]}\\n\";\n        }\n\n        return $result;\n    }\n\n    /**\n     * Set the HTTP handler that actually returns a promise.\n     *\n     * @param callable $handler Accepts a request and array of options and\n     *                          returns a Promise.\n     */\n    public function setHandler(callable $handler)\n    {\n        $this->handler = $handler;\n        $this->cached = null;\n    }\n\n    /**\n     * Returns true if the builder has a handler.\n     *\n     * @return bool\n     */\n    public function hasHandler()\n    {\n        return (bool) $this->handler;\n    }\n\n    /**\n     * Unshift a middleware to the bottom of the stack.\n     *\n     * @param callable $middleware Middleware function\n     * @param string   $name       Name to register for this middleware.\n     */\n    public function unshift(callable $middleware, $name = null)\n    {\n        array_unshift($this->stack, [$middleware, $name]);\n        $this->cached = null;\n    }\n\n    /**\n     * Push a middleware to the top of the stack.\n     *\n     * @param callable $middleware Middleware function\n     * @param string   $name       Name to register for this middleware.\n     */\n    public function push(callable $middleware, $name = '')\n    {\n        $this->stack[] = [$middleware, $name];\n        $this->cached = null;\n    }\n\n    /**\n     * Add a middleware before another middleware by name.\n     *\n     * @param string   $findName   Middleware to find\n     * @param callable $middleware Middleware function\n     * @param string   $withName   Name to register for this middleware.\n     */\n    public function before($findName, callable $middleware, $withName = '')\n    {\n        $this->splice($findName, $withName, $middleware, true);\n    }\n\n    /**\n     * Add a middleware after another middleware by name.\n     *\n     * @param string   $findName   Middleware to find\n     * @param callable $middleware Middleware function\n     * @param string   $withName   Name to register for this middleware.\n     */\n    public function after($findName, callable $middleware, $withName = '')\n    {\n        $this->splice($findName, $withName, $middleware, false);\n    }\n\n    /**\n     * Remove a middleware by instance or name from the stack.\n     *\n     * @param callable|string $remove Middleware to remove by instance or name.\n     */\n    public function remove($remove)\n    {\n        $this->cached = null;\n        $idx = is_callable($remove) ? 0 : 1;\n        $this->stack = array_values(array_filter(\n            $this->stack,\n            function ($tuple) use ($idx, $remove) {\n                return $tuple[$idx] !== $remove;\n            }\n        ));\n    }\n\n    /**\n     * Compose the middleware and handler into a single callable function.\n     *\n     * @return callable\n     */\n    public function resolve()\n    {\n        if (!$this->cached) {\n            if (!($prev = $this->handler)) {\n                throw new \\LogicException('No handler has been specified');\n            }\n\n            foreach (array_reverse($this->stack) as $fn) {\n                $prev = $fn[0]($prev);\n            }\n\n            $this->cached = $prev;\n        }\n\n        return $this->cached;\n    }\n\n    /**\n     * @param string $name\n     * @return int\n     */\n    private function findByName($name)\n    {\n        foreach ($this->stack as $k => $v) {\n            if ($v[1] === $name) {\n                return $k;\n            }\n        }\n\n        throw new \\InvalidArgumentException(\"Middleware not found: $name\");\n    }\n\n    /**\n     * Splices a function into the middleware list at a specific position.\n     *\n     * @param string   $findName\n     * @param string   $withName\n     * @param callable $middleware\n     * @param bool     $before\n     */\n    private function splice($findName, $withName, callable $middleware, $before)\n    {\n        $this->cached = null;\n        $idx = $this->findByName($findName);\n        $tuple = [$middleware, $withName];\n\n        if ($before) {\n            if ($idx === 0) {\n                array_unshift($this->stack, $tuple);\n            } else {\n                $replacement = [$tuple, $this->stack[$idx]];\n                array_splice($this->stack, $idx, 1, $replacement);\n            }\n        } elseif ($idx === count($this->stack) - 1) {\n            $this->stack[] = $tuple;\n        } else {\n            $replacement = [$this->stack[$idx], $tuple];\n            array_splice($this->stack, $idx, 1, $replacement);\n        }\n    }\n\n    /**\n     * Provides a debug string for a given callable.\n     *\n     * @param array|callable $fn Function to write as a string.\n     *\n     * @return string\n     */\n    private function debugCallable($fn)\n    {\n        if (is_string($fn)) {\n            return \"callable({$fn})\";\n        }\n\n        if (is_array($fn)) {\n            return is_string($fn[0])\n                ? \"callable({$fn[0]}::{$fn[1]})\"\n                : \"callable(['\" . get_class($fn[0]) . \"', '{$fn[1]}'])\";\n        }\n\n        return 'callable(' . spl_object_hash($fn) . ')';\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/MessageFormatter.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Formats log messages using variable substitutions for requests, responses,\n * and other transactional data.\n *\n * The following variable substitutions are supported:\n *\n * - {request}:        Full HTTP request message\n * - {response}:       Full HTTP response message\n * - {ts}:             ISO 8601 date in GMT\n * - {date_iso_8601}   ISO 8601 date in GMT\n * - {date_common_log} Apache common log date using the configured timezone.\n * - {host}:           Host of the request\n * - {method}:         Method of the request\n * - {uri}:            URI of the request\n * - {version}:        Protocol version\n * - {target}:         Request target of the request (path + query + fragment)\n * - {hostname}:       Hostname of the machine that sent the request\n * - {code}:           Status code of the response (if available)\n * - {phrase}:         Reason phrase of the response  (if available)\n * - {error}:          Any error messages (if available)\n * - {req_header_*}:   Replace `*` with the lowercased name of a request header to add to the message\n * - {res_header_*}:   Replace `*` with the lowercased name of a response header to add to the message\n * - {req_headers}:    Request headers\n * - {res_headers}:    Response headers\n * - {req_body}:       Request body\n * - {res_body}:       Response body\n */\nclass MessageFormatter\n{\n    /**\n     * Apache Common Log Format.\n     * @link http://httpd.apache.org/docs/2.4/logs.html#common\n     * @var string\n     */\n    const CLF = \"{hostname} {req_header_User-Agent} - [{date_common_log}] \\\"{method} {target} HTTP/{version}\\\" {code} {res_header_Content-Length}\";\n    const DEBUG = \">>>>>>>>\\n{request}\\n<<<<<<<<\\n{response}\\n--------\\n{error}\";\n    const SHORT = '[{ts}] \"{method} {target} HTTP/{version}\" {code}';\n\n    /** @var string Template used to format log messages */\n    private $template;\n\n    /**\n     * @param string $template Log message template\n     */\n    public function __construct($template = self::CLF)\n    {\n        $this->template = $template ?: self::CLF;\n    }\n\n    /**\n     * Returns a formatted message string.\n     *\n     * @param RequestInterface  $request  Request that was sent\n     * @param ResponseInterface $response Response that was received\n     * @param \\Exception        $error    Exception that was received\n     *\n     * @return string\n     */\n    public function format(\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        \\Exception $error = null\n    ) {\n        $cache = [];\n\n        return preg_replace_callback(\n            '/{\\s*([A-Za-z_\\-\\.0-9]+)\\s*}/',\n            function (array $matches) use ($request, $response, $error, &$cache) {\n                if (isset($cache[$matches[1]])) {\n                    return $cache[$matches[1]];\n                }\n\n                $result = '';\n                switch ($matches[1]) {\n                    case 'request':\n                        $result = Psr7\\str($request);\n                        break;\n                    case 'response':\n                        $result = $response ? Psr7\\str($response) : '';\n                        break;\n                    case 'req_headers':\n                        $result = trim($request->getMethod()\n                                . ' ' . $request->getRequestTarget())\n                            . ' HTTP/' . $request->getProtocolVersion() . \"\\r\\n\"\n                            . $this->headers($request);\n                        break;\n                    case 'res_headers':\n                        $result = $response ?\n                            sprintf(\n                                'HTTP/%s %d %s',\n                                $response->getProtocolVersion(),\n                                $response->getStatusCode(),\n                                $response->getReasonPhrase()\n                            ) . \"\\r\\n\" . $this->headers($response)\n                            : 'NULL';\n                        break;\n                    case 'req_body':\n                        $result = $request->getBody();\n                        break;\n                    case 'res_body':\n                        $result = $response ? $response->getBody() : 'NULL';\n                        break;\n                    case 'ts':\n                    case 'date_iso_8601':\n                        $result = gmdate('c');\n                        break;\n                    case 'date_common_log':\n                        $result = date('d/M/Y:H:i:s O');\n                        break;\n                    case 'method':\n                        $result = $request->getMethod();\n                        break;\n                    case 'version':\n                        $result = $request->getProtocolVersion();\n                        break;\n                    case 'uri':\n                    case 'url':\n                        $result = $request->getUri();\n                        break;\n                    case 'target':\n                        $result = $request->getRequestTarget();\n                        break;\n                    case 'req_version':\n                        $result = $request->getProtocolVersion();\n                        break;\n                    case 'res_version':\n                        $result = $response\n                            ? $response->getProtocolVersion()\n                            : 'NULL';\n                        break;\n                    case 'host':\n                        $result = $request->getHeaderLine('Host');\n                        break;\n                    case 'hostname':\n                        $result = gethostname();\n                        break;\n                    case 'code':\n                        $result = $response ? $response->getStatusCode() : 'NULL';\n                        break;\n                    case 'phrase':\n                        $result = $response ? $response->getReasonPhrase() : 'NULL';\n                        break;\n                    case 'error':\n                        $result = $error ? $error->getMessage() : 'NULL';\n                        break;\n                    default:\n                        // handle prefixed dynamic headers\n                        if (strpos($matches[1], 'req_header_') === 0) {\n                            $result = $request->getHeaderLine(substr($matches[1], 11));\n                        } elseif (strpos($matches[1], 'res_header_') === 0) {\n                            $result = $response\n                                ? $response->getHeaderLine(substr($matches[1], 11))\n                                : 'NULL';\n                        }\n                }\n\n                $cache[$matches[1]] = $result;\n                return $result;\n            },\n            $this->template\n        );\n    }\n\n    /**\n     * Get headers from message as string\n     *\n     * @return string\n     */\n    private function headers(MessageInterface $message)\n    {\n        $result = '';\n        foreach ($message->getHeaders() as $name => $values) {\n            $result .= $name . ': ' . implode(', ', $values) . \"\\r\\n\";\n        }\n\n        return trim($result);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Middleware.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Cookie\\CookieJarInterface;\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Promise\\RejectedPromise;\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Log\\LoggerInterface;\n\n/**\n * Functions used to create and wrap handlers with handler middleware.\n */\nfinal class Middleware\n{\n    /**\n     * Middleware that adds cookies to requests.\n     *\n     * The options array must be set to a CookieJarInterface in order to use\n     * cookies. This is typically handled for you by a client.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function cookies()\n    {\n        return function (callable $handler) {\n            return function ($request, array $options) use ($handler) {\n                if (empty($options['cookies'])) {\n                    return $handler($request, $options);\n                } elseif (!($options['cookies'] instanceof CookieJarInterface)) {\n                    throw new \\InvalidArgumentException('cookies must be an instance of GuzzleHttp\\Cookie\\CookieJarInterface');\n                }\n                $cookieJar = $options['cookies'];\n                $request = $cookieJar->withCookieHeader($request);\n                return $handler($request, $options)\n                    ->then(\n                        function ($response) use ($cookieJar, $request) {\n                            $cookieJar->extractCookies($request, $response);\n                            return $response;\n                        }\n                    );\n            };\n        };\n    }\n\n    /**\n     * Middleware that throws exceptions for 4xx or 5xx responses when the\n     * \"http_error\" request option is set to true.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function httpErrors()\n    {\n        return function (callable $handler) {\n            return function ($request, array $options) use ($handler) {\n                if (empty($options['http_errors'])) {\n                    return $handler($request, $options);\n                }\n                return $handler($request, $options)->then(\n                    function (ResponseInterface $response) use ($request) {\n                        $code = $response->getStatusCode();\n                        if ($code < 400) {\n                            return $response;\n                        }\n                        throw RequestException::create($request, $response);\n                    }\n                );\n            };\n        };\n    }\n\n    /**\n     * Middleware that pushes history data to an ArrayAccess container.\n     *\n     * @param array|\\ArrayAccess $container Container to hold the history (by reference).\n     *\n     * @return callable Returns a function that accepts the next handler.\n     * @throws \\InvalidArgumentException if container is not an array or ArrayAccess.\n     */\n    public static function history(&$container)\n    {\n        if (!is_array($container) && !$container instanceof \\ArrayAccess) {\n            throw new \\InvalidArgumentException('history container must be an array or object implementing ArrayAccess');\n        }\n\n        return function (callable $handler) use (&$container) {\n            return function ($request, array $options) use ($handler, &$container) {\n                return $handler($request, $options)->then(\n                    function ($value) use ($request, &$container, $options) {\n                        $container[] = [\n                            'request'  => $request,\n                            'response' => $value,\n                            'error'    => null,\n                            'options'  => $options\n                        ];\n                        return $value;\n                    },\n                    function ($reason) use ($request, &$container, $options) {\n                        $container[] = [\n                            'request'  => $request,\n                            'response' => null,\n                            'error'    => $reason,\n                            'options'  => $options\n                        ];\n                        return \\GuzzleHttp\\Promise\\rejection_for($reason);\n                    }\n                );\n            };\n        };\n    }\n\n    /**\n     * Middleware that invokes a callback before and after sending a request.\n     *\n     * The provided listener cannot modify or alter the response. It simply\n     * \"taps\" into the chain to be notified before returning the promise. The\n     * before listener accepts a request and options array, and the after\n     * listener accepts a request, options array, and response promise.\n     *\n     * @param callable $before Function to invoke before forwarding the request.\n     * @param callable $after  Function invoked after forwarding.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function tap(callable $before = null, callable $after = null)\n    {\n        return function (callable $handler) use ($before, $after) {\n            return function ($request, array $options) use ($handler, $before, $after) {\n                if ($before) {\n                    $before($request, $options);\n                }\n                $response = $handler($request, $options);\n                if ($after) {\n                    $after($request, $options, $response);\n                }\n                return $response;\n            };\n        };\n    }\n\n    /**\n     * Middleware that handles request redirects.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function redirect()\n    {\n        return function (callable $handler) {\n            return new RedirectMiddleware($handler);\n        };\n    }\n\n    /**\n     * Middleware that retries requests based on the boolean result of\n     * invoking the provided \"decider\" function.\n     *\n     * If no delay function is provided, a simple implementation of exponential\n     * backoff will be utilized.\n     *\n     * @param callable $decider Function that accepts the number of retries,\n     *                          a request, [response], and [exception] and\n     *                          returns true if the request is to be retried.\n     * @param callable $delay   Function that accepts the number of retries and\n     *                          returns the number of milliseconds to delay.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function retry(callable $decider, callable $delay = null)\n    {\n        return function (callable $handler) use ($decider, $delay) {\n            return new RetryMiddleware($decider, $handler, $delay);\n        };\n    }\n\n    /**\n     * Middleware that logs requests, responses, and errors using a message\n     * formatter.\n     *\n     * @param LoggerInterface  $logger Logs messages.\n     * @param MessageFormatter $formatter Formatter used to create message strings.\n     * @param string           $logLevel Level at which to log requests.\n     *\n     * @return callable Returns a function that accepts the next handler.\n     */\n    public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = 'info' /* \\Psr\\Log\\LogLevel::INFO */)\n    {\n        return function (callable $handler) use ($logger, $formatter, $logLevel) {\n            return function ($request, array $options) use ($handler, $logger, $formatter, $logLevel) {\n                return $handler($request, $options)->then(\n                    function ($response) use ($logger, $request, $formatter, $logLevel) {\n                        $message = $formatter->format($request, $response);\n                        $logger->log($logLevel, $message);\n                        return $response;\n                    },\n                    function ($reason) use ($logger, $request, $formatter) {\n                        $response = $reason instanceof RequestException\n                            ? $reason->getResponse()\n                            : null;\n                        $message = $formatter->format($request, $response, $reason);\n                        $logger->notice($message);\n                        return \\GuzzleHttp\\Promise\\rejection_for($reason);\n                    }\n                );\n            };\n        };\n    }\n\n    /**\n     * This middleware adds a default content-type if possible, a default\n     * content-length or transfer-encoding header, and the expect header.\n     *\n     * @return callable\n     */\n    public static function prepareBody()\n    {\n        return function (callable $handler) {\n            return new PrepareBodyMiddleware($handler);\n        };\n    }\n\n    /**\n     * Middleware that applies a map function to the request before passing to\n     * the next handler.\n     *\n     * @param callable $fn Function that accepts a RequestInterface and returns\n     *                     a RequestInterface.\n     * @return callable\n     */\n    public static function mapRequest(callable $fn)\n    {\n        return function (callable $handler) use ($fn) {\n            return function ($request, array $options) use ($handler, $fn) {\n                return $handler($fn($request), $options);\n            };\n        };\n    }\n\n    /**\n     * Middleware that applies a map function to the resolved promise's\n     * response.\n     *\n     * @param callable $fn Function that accepts a ResponseInterface and\n     *                     returns a ResponseInterface.\n     * @return callable\n     */\n    public static function mapResponse(callable $fn)\n    {\n        return function (callable $handler) use ($fn) {\n            return function ($request, array $options) use ($handler, $fn) {\n                return $handler($request, $options)->then($fn);\n            };\n        };\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Pool.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\EachPromise;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Promise\\PromisorInterface;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Sends an iterator of requests concurrently using a capped pool size.\n *\n * The pool will read from an iterator until it is cancelled or until the\n * iterator is consumed. When a request is yielded, the request is sent after\n * applying the \"request_options\" request options (if provided in the ctor).\n *\n * When a function is yielded by the iterator, the function is provided the\n * \"request_options\" array that should be merged on top of any existing\n * options, and the function MUST then return a wait-able promise.\n */\nclass Pool implements PromisorInterface\n{\n    /** @var EachPromise */\n    private $each;\n\n    /**\n     * @param ClientInterface $client   Client used to send the requests.\n     * @param array|\\Iterator $requests Requests or functions that return\n     *                                  requests to send concurrently.\n     * @param array           $config   Associative array of options\n     *     - concurrency: (int) Maximum number of requests to send concurrently\n     *     - options: Array of request options to apply to each request.\n     *     - fulfilled: (callable) Function to invoke when a request completes.\n     *     - rejected: (callable) Function to invoke when a request is rejected.\n     */\n    public function __construct(\n        ClientInterface $client,\n        $requests,\n        array $config = []\n    ) {\n        // Backwards compatibility.\n        if (isset($config['pool_size'])) {\n            $config['concurrency'] = $config['pool_size'];\n        } elseif (!isset($config['concurrency'])) {\n            $config['concurrency'] = 25;\n        }\n\n        if (isset($config['options'])) {\n            $opts = $config['options'];\n            unset($config['options']);\n        } else {\n            $opts = [];\n        }\n\n        $iterable = \\GuzzleHttp\\Promise\\iter_for($requests);\n        $requests = function () use ($iterable, $client, $opts) {\n            foreach ($iterable as $key => $rfn) {\n                if ($rfn instanceof RequestInterface) {\n                    yield $key => $client->sendAsync($rfn, $opts);\n                } elseif (is_callable($rfn)) {\n                    yield $key => $rfn($opts);\n                } else {\n                    throw new \\InvalidArgumentException('Each value yielded by '\n                        . 'the iterator must be a Psr7\\Http\\Message\\RequestInterface '\n                        . 'or a callable that returns a promise that fulfills '\n                        . 'with a Psr7\\Message\\Http\\ResponseInterface object.');\n                }\n            }\n        };\n\n        $this->each = new EachPromise($requests(), $config);\n    }\n\n    /**\n     * Get promise\n     *\n     * @return PromiseInterface\n     */\n    public function promise()\n    {\n        return $this->each->promise();\n    }\n\n    /**\n     * Sends multiple requests concurrently and returns an array of responses\n     * and exceptions that uses the same ordering as the provided requests.\n     *\n     * IMPORTANT: This method keeps every request and response in memory, and\n     * as such, is NOT recommended when sending a large number or an\n     * indeterminate number of requests concurrently.\n     *\n     * @param ClientInterface $client   Client used to send the requests\n     * @param array|\\Iterator $requests Requests to send concurrently.\n     * @param array           $options  Passes through the options available in\n     *                                  {@see GuzzleHttp\\Pool::__construct}\n     *\n     * @return array Returns an array containing the response or an exception\n     *               in the same order that the requests were sent.\n     * @throws \\InvalidArgumentException if the event format is incorrect.\n     */\n    public static function batch(\n        ClientInterface $client,\n        $requests,\n        array $options = []\n    ) {\n        $res = [];\n        self::cmpCallback($options, 'fulfilled', $res);\n        self::cmpCallback($options, 'rejected', $res);\n        $pool = new static($client, $requests, $options);\n        $pool->promise()->wait();\n        ksort($res);\n\n        return $res;\n    }\n\n    /**\n     * Execute callback(s)\n     *\n     * @return void\n     */\n    private static function cmpCallback(array &$options, $name, array &$results)\n    {\n        if (!isset($options[$name])) {\n            $options[$name] = function ($v, $k) use (&$results) {\n                $results[$k] = $v;\n            };\n        } else {\n            $currentFn = $options[$name];\n            $options[$name] = function ($v, $k) use (&$results, $currentFn) {\n                $currentFn($v, $k);\n                $results[$k] = $v;\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * Prepares requests that contain a body, adding the Content-Length,\n * Content-Type, and Expect headers.\n */\nclass PrepareBodyMiddleware\n{\n    /** @var callable  */\n    private $nextHandler;\n\n    /**\n     * @param callable $nextHandler Next handler to invoke.\n     */\n    public function __construct(callable $nextHandler)\n    {\n        $this->nextHandler = $nextHandler;\n    }\n\n    /**\n     * @param RequestInterface $request\n     * @param array            $options\n     *\n     * @return PromiseInterface\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        $fn = $this->nextHandler;\n\n        // Don't do anything if the request has no body.\n        if ($request->getBody()->getSize() === 0) {\n            return $fn($request, $options);\n        }\n\n        $modify = [];\n\n        // Add a default content-type if possible.\n        if (!$request->hasHeader('Content-Type')) {\n            if ($uri = $request->getBody()->getMetadata('uri')) {\n                if ($type = Psr7\\mimetype_from_filename($uri)) {\n                    $modify['set_headers']['Content-Type'] = $type;\n                }\n            }\n        }\n\n        // Add a default content-length or transfer-encoding header.\n        if (!$request->hasHeader('Content-Length')\n            && !$request->hasHeader('Transfer-Encoding')\n        ) {\n            $size = $request->getBody()->getSize();\n            if ($size !== null) {\n                $modify['set_headers']['Content-Length'] = $size;\n            } else {\n                $modify['set_headers']['Transfer-Encoding'] = 'chunked';\n            }\n        }\n\n        // Add the expect header if needed.\n        $this->addExpectHeader($request, $options, $modify);\n\n        return $fn(Psr7\\modify_request($request, $modify), $options);\n    }\n\n    /**\n     * Add expect header\n     *\n     * @return void\n     */\n    private function addExpectHeader(\n        RequestInterface $request,\n        array $options,\n        array &$modify\n    ) {\n        // Determine if the Expect header should be used\n        if ($request->hasHeader('Expect')) {\n            return;\n        }\n\n        $expect = isset($options['expect']) ? $options['expect'] : null;\n\n        // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0\n        if ($expect === false || $request->getProtocolVersion() < 1.1) {\n            return;\n        }\n\n        // The expect header is unconditionally enabled\n        if ($expect === true) {\n            $modify['set_headers']['Expect'] = '100-Continue';\n            return;\n        }\n\n        // By default, send the expect header when the payload is > 1mb\n        if ($expect === null) {\n            $expect = 1048576;\n        }\n\n        // Always add if the body cannot be rewound, the size cannot be\n        // determined, or the size is greater than the cutoff threshold\n        $body = $request->getBody();\n        $size = $body->getSize();\n\n        if ($size === null || $size >= (int) $expect || !$body->isSeekable()) {\n            $modify['set_headers']['Expect'] = '100-Continue';\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\BadResponseException;\nuse GuzzleHttp\\Exception\\TooManyRedirectsException;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Request redirect middleware.\n *\n * Apply this middleware like other middleware using\n * {@see \\GuzzleHttp\\Middleware::redirect()}.\n */\nclass RedirectMiddleware\n{\n    const HISTORY_HEADER = 'X-Guzzle-Redirect-History';\n\n    const STATUS_HISTORY_HEADER = 'X-Guzzle-Redirect-Status-History';\n\n    public static $defaultSettings = [\n        'max'             => 5,\n        'protocols'       => ['http', 'https'],\n        'strict'          => false,\n        'referer'         => false,\n        'track_redirects' => false,\n    ];\n\n    /** @var callable  */\n    private $nextHandler;\n\n    /**\n     * @param callable $nextHandler Next handler to invoke.\n     */\n    public function __construct(callable $nextHandler)\n    {\n        $this->nextHandler = $nextHandler;\n    }\n\n    /**\n     * @param RequestInterface $request\n     * @param array            $options\n     *\n     * @return PromiseInterface\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        $fn = $this->nextHandler;\n\n        if (empty($options['allow_redirects'])) {\n            return $fn($request, $options);\n        }\n\n        if ($options['allow_redirects'] === true) {\n            $options['allow_redirects'] = self::$defaultSettings;\n        } elseif (!is_array($options['allow_redirects'])) {\n            throw new \\InvalidArgumentException('allow_redirects must be true, false, or array');\n        } else {\n            // Merge the default settings with the provided settings\n            $options['allow_redirects'] += self::$defaultSettings;\n        }\n\n        if (empty($options['allow_redirects']['max'])) {\n            return $fn($request, $options);\n        }\n\n        return $fn($request, $options)\n            ->then(function (ResponseInterface $response) use ($request, $options) {\n                return $this->checkRedirect($request, $options, $response);\n            });\n    }\n\n    /**\n     * @param RequestInterface  $request\n     * @param array             $options\n     * @param ResponseInterface $response\n     *\n     * @return ResponseInterface|PromiseInterface\n     */\n    public function checkRedirect(\n        RequestInterface $request,\n        array $options,\n        ResponseInterface $response\n    ) {\n        if (substr($response->getStatusCode(), 0, 1) != '3'\n            || !$response->hasHeader('Location')\n        ) {\n            return $response;\n        }\n\n        $this->guardMax($request, $options);\n        $nextRequest = $this->modifyRequest($request, $options, $response);\n\n        if (isset($options['allow_redirects']['on_redirect'])) {\n            call_user_func(\n                $options['allow_redirects']['on_redirect'],\n                $request,\n                $response,\n                $nextRequest->getUri()\n            );\n        }\n\n        /** @var PromiseInterface|ResponseInterface $promise */\n        $promise = $this($nextRequest, $options);\n\n        // Add headers to be able to track history of redirects.\n        if (!empty($options['allow_redirects']['track_redirects'])) {\n            return $this->withTracking(\n                $promise,\n                (string) $nextRequest->getUri(),\n                $response->getStatusCode()\n            );\n        }\n\n        return $promise;\n    }\n\n    /**\n     * Enable tracking on promise.\n     *\n     * @return PromiseInterface\n     */\n    private function withTracking(PromiseInterface $promise, $uri, $statusCode)\n    {\n        return $promise->then(\n            function (ResponseInterface $response) use ($uri, $statusCode) {\n                // Note that we are pushing to the front of the list as this\n                // would be an earlier response than what is currently present\n                // in the history header.\n                $historyHeader = $response->getHeader(self::HISTORY_HEADER);\n                $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER);\n                array_unshift($historyHeader, $uri);\n                array_unshift($statusHeader, $statusCode);\n                return $response->withHeader(self::HISTORY_HEADER, $historyHeader)\n                                ->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader);\n            }\n        );\n    }\n\n    /**\n     * Check for too many redirects\n     *\n     * @return void\n     *\n     * @throws TooManyRedirectsException Too many redirects.\n     */\n    private function guardMax(RequestInterface $request, array &$options)\n    {\n        $current = isset($options['__redirect_count'])\n            ? $options['__redirect_count']\n            : 0;\n        $options['__redirect_count'] = $current + 1;\n        $max = $options['allow_redirects']['max'];\n\n        if ($options['__redirect_count'] > $max) {\n            throw new TooManyRedirectsException(\n                \"Will not follow more than {$max} redirects\",\n                $request\n            );\n        }\n    }\n\n    /**\n     * @param RequestInterface  $request\n     * @param array             $options\n     * @param ResponseInterface $response\n     *\n     * @return RequestInterface\n     */\n    public function modifyRequest(\n        RequestInterface $request,\n        array $options,\n        ResponseInterface $response\n    ) {\n        // Request modifications to apply.\n        $modify = [];\n        $protocols = $options['allow_redirects']['protocols'];\n\n        // Use a GET request if this is an entity enclosing request and we are\n        // not forcing RFC compliance, but rather emulating what all browsers\n        // would do.\n        $statusCode = $response->getStatusCode();\n        if ($statusCode == 303 ||\n            ($statusCode <= 302 && !$options['allow_redirects']['strict'])\n        ) {\n            $modify['method'] = 'GET';\n            $modify['body'] = '';\n        }\n\n        $uri = $this->redirectUri($request, $response, $protocols);\n        if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) {\n            $idnOptions = ($options['idn_conversion'] === true) ? IDNA_DEFAULT : $options['idn_conversion'];\n            $uri = Utils::idnUriConvert($uri, $idnOptions);\n        }\n\n        $modify['uri'] = $uri;\n        Psr7\\rewind_body($request);\n\n        // Add the Referer header if it is told to do so and only\n        // add the header if we are not redirecting from https to http.\n        if ($options['allow_redirects']['referer']\n            && $modify['uri']->getScheme() === $request->getUri()->getScheme()\n        ) {\n            $uri = $request->getUri()->withUserInfo('');\n            $modify['set_headers']['Referer'] = (string) $uri;\n        } else {\n            $modify['remove_headers'][] = 'Referer';\n        }\n\n        // Remove Authorization header if host is different.\n        if ($request->getUri()->getHost() !== $modify['uri']->getHost()) {\n            $modify['remove_headers'][] = 'Authorization';\n        }\n\n        return Psr7\\modify_request($request, $modify);\n    }\n\n    /**\n     * Set the appropriate URL on the request based on the location header\n     *\n     * @param RequestInterface  $request\n     * @param ResponseInterface $response\n     * @param array             $protocols\n     *\n     * @return UriInterface\n     */\n    private function redirectUri(\n        RequestInterface $request,\n        ResponseInterface $response,\n        array $protocols\n    ) {\n        $location = Psr7\\UriResolver::resolve(\n            $request->getUri(),\n            new Psr7\\Uri($response->getHeaderLine('Location'))\n        );\n\n        // Ensure that the redirect URI is allowed based on the protocols.\n        if (!in_array($location->getScheme(), $protocols)) {\n            throw new BadResponseException(\n                sprintf(\n                    'Redirect URI, %s, does not use one of the allowed redirect protocols: %s',\n                    $location,\n                    implode(', ', $protocols)\n                ),\n                $request,\n                $response\n            );\n        }\n\n        return $location;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/RequestOptions.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\n/**\n * This class contains a list of built-in Guzzle request options.\n *\n * More documentation for each option can be found at http://guzzlephp.org/.\n *\n * @link http://docs.guzzlephp.org/en/v6/request-options.html\n */\nfinal class RequestOptions\n{\n    /**\n     * allow_redirects: (bool|array) Controls redirect behavior. Pass false\n     * to disable redirects, pass true to enable redirects, pass an\n     * associative to provide custom redirect settings. Defaults to \"false\".\n     * This option only works if your handler has the RedirectMiddleware. When\n     * passing an associative array, you can provide the following key value\n     * pairs:\n     *\n     * - max: (int, default=5) maximum number of allowed redirects.\n     * - strict: (bool, default=false) Set to true to use strict redirects\n     *   meaning redirect POST requests with POST requests vs. doing what most\n     *   browsers do which is redirect POST requests with GET requests\n     * - referer: (bool, default=false) Set to true to enable the Referer\n     *   header.\n     * - protocols: (array, default=['http', 'https']) Allowed redirect\n     *   protocols.\n     * - on_redirect: (callable) PHP callable that is invoked when a redirect\n     *   is encountered. The callable is invoked with the request, the redirect\n     *   response that was received, and the effective URI. Any return value\n     *   from the on_redirect function is ignored.\n     */\n    const ALLOW_REDIRECTS = 'allow_redirects';\n\n    /**\n     * auth: (array) Pass an array of HTTP authentication parameters to use\n     * with the request. The array must contain the username in index [0],\n     * the password in index [1], and you can optionally provide a built-in\n     * authentication type in index [2]. Pass null to disable authentication\n     * for a request.\n     */\n    const AUTH = 'auth';\n\n    /**\n     * body: (resource|string|null|int|float|StreamInterface|callable|\\Iterator)\n     * Body to send in the request.\n     */\n    const BODY = 'body';\n\n    /**\n     * cert: (string|array) Set to a string to specify the path to a file\n     * containing a PEM formatted SSL client side certificate. If a password\n     * is required, then set cert to an array containing the path to the PEM\n     * file in the first array element followed by the certificate password\n     * in the second array element.\n     */\n    const CERT = 'cert';\n\n    /**\n     * cookies: (bool|GuzzleHttp\\Cookie\\CookieJarInterface, default=false)\n     * Specifies whether or not cookies are used in a request or what cookie\n     * jar to use or what cookies to send. This option only works if your\n     * handler has the `cookie` middleware. Valid values are `false` and\n     * an instance of {@see GuzzleHttp\\Cookie\\CookieJarInterface}.\n     */\n    const COOKIES = 'cookies';\n\n    /**\n     * connect_timeout: (float, default=0) Float describing the number of\n     * seconds to wait while trying to connect to a server. Use 0 to wait\n     * indefinitely (the default behavior).\n     */\n    const CONNECT_TIMEOUT = 'connect_timeout';\n\n    /**\n     * debug: (bool|resource) Set to true or set to a PHP stream returned by\n     * fopen()  enable debug output with the HTTP handler used to send a\n     * request.\n     */\n    const DEBUG = 'debug';\n\n    /**\n     * decode_content: (bool, default=true) Specify whether or not\n     * Content-Encoding responses (gzip, deflate, etc.) are automatically\n     * decoded.\n     */\n    const DECODE_CONTENT = 'decode_content';\n\n    /**\n     * delay: (int) The amount of time to delay before sending in milliseconds.\n     */\n    const DELAY = 'delay';\n\n    /**\n     * expect: (bool|integer) Controls the behavior of the\n     * \"Expect: 100-Continue\" header.\n     *\n     * Set to `true` to enable the \"Expect: 100-Continue\" header for all\n     * requests that sends a body. Set to `false` to disable the\n     * \"Expect: 100-Continue\" header for all requests. Set to a number so that\n     * the size of the payload must be greater than the number in order to send\n     * the Expect header. Setting to a number will send the Expect header for\n     * all requests in which the size of the payload cannot be determined or\n     * where the body is not rewindable.\n     *\n     * By default, Guzzle will add the \"Expect: 100-Continue\" header when the\n     * size of the body of a request is greater than 1 MB and a request is\n     * using HTTP/1.1.\n     */\n    const EXPECT = 'expect';\n\n    /**\n     * form_params: (array) Associative array of form field names to values\n     * where each value is a string or array of strings. Sets the Content-Type\n     * header to application/x-www-form-urlencoded when no Content-Type header\n     * is already present.\n     */\n    const FORM_PARAMS = 'form_params';\n\n    /**\n     * headers: (array) Associative array of HTTP headers. Each value MUST be\n     * a string or array of strings.\n     */\n    const HEADERS = 'headers';\n\n    /**\n     * http_errors: (bool, default=true) Set to false to disable exceptions\n     * when a non- successful HTTP response is received. By default,\n     * exceptions will be thrown for 4xx and 5xx responses. This option only\n     * works if your handler has the `httpErrors` middleware.\n     */\n    const HTTP_ERRORS = 'http_errors';\n\n    /**\n     * idn: (bool|int, default=true) A combination of IDNA_* constants for\n     * idn_to_ascii() PHP's function (see \"options\" parameter). Set to false to\n     * disable IDN support completely, or to true to use the default\n     * configuration (IDNA_DEFAULT constant).\n     */\n    const IDN_CONVERSION = 'idn_conversion';\n\n    /**\n     * json: (mixed) Adds JSON data to a request. The provided value is JSON\n     * encoded and a Content-Type header of application/json will be added to\n     * the request if no Content-Type header is already present.\n     */\n    const JSON = 'json';\n\n    /**\n     * multipart: (array) Array of associative arrays, each containing a\n     * required \"name\" key mapping to the form field, name, a required\n     * \"contents\" key mapping to a StreamInterface|resource|string, an\n     * optional \"headers\" associative array of custom headers, and an\n     * optional \"filename\" key mapping to a string to send as the filename in\n     * the part. If no \"filename\" key is present, then no \"filename\" attribute\n     * will be added to the part.\n     */\n    const MULTIPART = 'multipart';\n\n    /**\n     * on_headers: (callable) A callable that is invoked when the HTTP headers\n     * of the response have been received but the body has not yet begun to\n     * download.\n     */\n    const ON_HEADERS = 'on_headers';\n\n    /**\n     * on_stats: (callable) allows you to get access to transfer statistics of\n     * a request and access the lower level transfer details of the handler\n     * associated with your client. ``on_stats`` is a callable that is invoked\n     * when a handler has finished sending a request. The callback is invoked\n     * with transfer statistics about the request, the response received, or\n     * the error encountered. Included in the data is the total amount of time\n     * taken to send the request.\n     */\n    const ON_STATS = 'on_stats';\n\n    /**\n     * progress: (callable) Defines a function to invoke when transfer\n     * progress is made. The function accepts the following positional\n     * arguments: the total number of bytes expected to be downloaded, the\n     * number of bytes downloaded so far, the number of bytes expected to be\n     * uploaded, the number of bytes uploaded so far.\n     */\n    const PROGRESS = 'progress';\n\n    /**\n     * proxy: (string|array) Pass a string to specify an HTTP proxy, or an\n     * array to specify different proxies for different protocols (where the\n     * key is the protocol and the value is a proxy string).\n     */\n    const PROXY = 'proxy';\n\n    /**\n     * query: (array|string) Associative array of query string values to add\n     * to the request. This option uses PHP's http_build_query() to create\n     * the string representation. Pass a string value if you need more\n     * control than what this method provides\n     */\n    const QUERY = 'query';\n\n    /**\n     * sink: (resource|string|StreamInterface) Where the data of the\n     * response is written to. Defaults to a PHP temp stream. Providing a\n     * string will write data to a file by the given name.\n     */\n    const SINK = 'sink';\n\n    /**\n     * synchronous: (bool) Set to true to inform HTTP handlers that you intend\n     * on waiting on the response. This can be useful for optimizations. Note\n     * that a promise is still returned if you are using one of the async\n     * client methods.\n     */\n    const SYNCHRONOUS = 'synchronous';\n\n    /**\n     * ssl_key: (array|string) Specify the path to a file containing a private\n     * SSL key in PEM format. If a password is required, then set to an array\n     * containing the path to the SSL key in the first array element followed\n     * by the password required for the certificate in the second element.\n     */\n    const SSL_KEY = 'ssl_key';\n\n    /**\n     * stream: Set to true to attempt to stream a response rather than\n     * download it all up-front.\n     */\n    const STREAM = 'stream';\n\n    /**\n     * verify: (bool|string, default=true) Describes the SSL certificate\n     * verification behavior of a request. Set to true to enable SSL\n     * certificate verification using the system CA bundle when available\n     * (the default). Set to false to disable certificate verification (this\n     * is insecure!). Set to a string to provide the path to a CA bundle on\n     * disk to enable verification using a custom certificate.\n     */\n    const VERIFY = 'verify';\n\n    /**\n     * timeout: (float, default=0) Float describing the timeout of the\n     * request in seconds. Use 0 to wait indefinitely (the default behavior).\n     */\n    const TIMEOUT = 'timeout';\n\n    /**\n     * read_timeout: (float, default=default_socket_timeout ini setting) Float describing\n     * the body read timeout, for stream requests.\n     */\n    const READ_TIMEOUT = 'read_timeout';\n\n    /**\n     * version: (float) Specifies the HTTP protocol version to attempt to use.\n     */\n    const VERSION = 'version';\n\n    /**\n     * force_ip_resolve: (bool) Force client to use only ipv4 or ipv6 protocol\n     */\n    const FORCE_IP_RESOLVE = 'force_ip_resolve';\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse GuzzleHttp\\Promise\\RejectedPromise;\nuse GuzzleHttp\\Psr7;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * Middleware that retries requests based on the boolean result of\n * invoking the provided \"decider\" function.\n */\nclass RetryMiddleware\n{\n    /** @var callable  */\n    private $nextHandler;\n\n    /** @var callable */\n    private $decider;\n\n    /** @var callable */\n    private $delay;\n\n    /**\n     * @param callable $decider     Function that accepts the number of retries,\n     *                              a request, [response], and [exception] and\n     *                              returns true if the request is to be\n     *                              retried.\n     * @param callable $nextHandler Next handler to invoke.\n     * @param callable $delay       Function that accepts the number of retries\n     *                              and [response] and returns the number of\n     *                              milliseconds to delay.\n     */\n    public function __construct(\n        callable $decider,\n        callable $nextHandler,\n        callable $delay = null\n    ) {\n        $this->decider = $decider;\n        $this->nextHandler = $nextHandler;\n        $this->delay = $delay ?: __CLASS__ . '::exponentialDelay';\n    }\n\n    /**\n     * Default exponential backoff delay function.\n     *\n     * @param int $retries\n     *\n     * @return int milliseconds.\n     */\n    public static function exponentialDelay($retries)\n    {\n        return (int) pow(2, $retries - 1) * 1000;\n    }\n\n    /**\n     * @param RequestInterface $request\n     * @param array            $options\n     *\n     * @return PromiseInterface\n     */\n    public function __invoke(RequestInterface $request, array $options)\n    {\n        if (!isset($options['retries'])) {\n            $options['retries'] = 0;\n        }\n\n        $fn = $this->nextHandler;\n        return $fn($request, $options)\n            ->then(\n                $this->onFulfilled($request, $options),\n                $this->onRejected($request, $options)\n            );\n    }\n\n    /**\n     * Execute fulfilled closure\n     *\n     * @return mixed\n     */\n    private function onFulfilled(RequestInterface $req, array $options)\n    {\n        return function ($value) use ($req, $options) {\n            if (!call_user_func(\n                $this->decider,\n                $options['retries'],\n                $req,\n                $value,\n                null\n            )) {\n                return $value;\n            }\n            return $this->doRetry($req, $options, $value);\n        };\n    }\n\n    /**\n     * Execute rejected closure\n     *\n     * @return callable\n     */\n    private function onRejected(RequestInterface $req, array $options)\n    {\n        return function ($reason) use ($req, $options) {\n            if (!call_user_func(\n                $this->decider,\n                $options['retries'],\n                $req,\n                null,\n                $reason\n            )) {\n                return \\GuzzleHttp\\Promise\\rejection_for($reason);\n            }\n            return $this->doRetry($req, $options);\n        };\n    }\n\n    /**\n     * @return self\n     */\n    private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null)\n    {\n        $options['delay'] = call_user_func($this->delay, ++$options['retries'], $response);\n\n        return $this($request, $options);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/TransferStats.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Represents data at the point after it was transferred either successfully\n * or after a network error.\n */\nfinal class TransferStats\n{\n    private $request;\n    private $response;\n    private $transferTime;\n    private $handlerStats;\n    private $handlerErrorData;\n\n    /**\n     * @param RequestInterface       $request          Request that was sent.\n     * @param ResponseInterface|null $response         Response received (if any)\n     * @param float|null             $transferTime     Total handler transfer time.\n     * @param mixed                  $handlerErrorData Handler error data.\n     * @param array                  $handlerStats     Handler specific stats.\n     */\n    public function __construct(\n        RequestInterface $request,\n        ResponseInterface $response = null,\n        $transferTime = null,\n        $handlerErrorData = null,\n        $handlerStats = []\n    ) {\n        $this->request = $request;\n        $this->response = $response;\n        $this->transferTime = $transferTime;\n        $this->handlerErrorData = $handlerErrorData;\n        $this->handlerStats = $handlerStats;\n    }\n\n    /**\n     * @return RequestInterface\n     */\n    public function getRequest()\n    {\n        return $this->request;\n    }\n\n    /**\n     * Returns the response that was received (if any).\n     *\n     * @return ResponseInterface|null\n     */\n    public function getResponse()\n    {\n        return $this->response;\n    }\n\n    /**\n     * Returns true if a response was received.\n     *\n     * @return bool\n     */\n    public function hasResponse()\n    {\n        return $this->response !== null;\n    }\n\n    /**\n     * Gets handler specific error data.\n     *\n     * This might be an exception, a integer representing an error code, or\n     * anything else. Relying on this value assumes that you know what handler\n     * you are using.\n     *\n     * @return mixed\n     */\n    public function getHandlerErrorData()\n    {\n        return $this->handlerErrorData;\n    }\n\n    /**\n     * Get the effective URI the request was sent to.\n     *\n     * @return UriInterface\n     */\n    public function getEffectiveUri()\n    {\n        return $this->request->getUri();\n    }\n\n    /**\n     * Get the estimated time the request was being transferred by the handler.\n     *\n     * @return float|null Time in seconds.\n     */\n    public function getTransferTime()\n    {\n        return $this->transferTime;\n    }\n\n    /**\n     * Gets an array of all of the handler specific transfer data.\n     *\n     * @return array\n     */\n    public function getHandlerStats()\n    {\n        return $this->handlerStats;\n    }\n\n    /**\n     * Get a specific handler statistic from the handler by name.\n     *\n     * @param string $stat Handler specific transfer stat to retrieve.\n     *\n     * @return mixed|null\n     */\n    public function getHandlerStat($stat)\n    {\n        return isset($this->handlerStats[$stat])\n            ? $this->handlerStats[$stat]\n            : null;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/UriTemplate.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\n/**\n * Expands URI templates. Userland implementation of PECL uri_template.\n *\n * @link http://tools.ietf.org/html/rfc6570\n */\nclass UriTemplate\n{\n    /** @var string URI template */\n    private $template;\n\n    /** @var array Variables to use in the template expansion */\n    private $variables;\n\n    /** @var array Hash for quick operator lookups */\n    private static $operatorHash = [\n        ''  => ['prefix' => '',  'joiner' => ',', 'query' => false],\n        '+' => ['prefix' => '',  'joiner' => ',', 'query' => false],\n        '#' => ['prefix' => '#', 'joiner' => ',', 'query' => false],\n        '.' => ['prefix' => '.', 'joiner' => '.', 'query' => false],\n        '/' => ['prefix' => '/', 'joiner' => '/', 'query' => false],\n        ';' => ['prefix' => ';', 'joiner' => ';', 'query' => true],\n        '?' => ['prefix' => '?', 'joiner' => '&', 'query' => true],\n        '&' => ['prefix' => '&', 'joiner' => '&', 'query' => true]\n    ];\n\n    /** @var array Delimiters */\n    private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$',\n        '&', '\\'', '(', ')', '*', '+', ',', ';', '='];\n\n    /** @var array Percent encoded delimiters */\n    private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D',\n        '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C',\n        '%3B', '%3D'];\n\n    public function expand($template, array $variables)\n    {\n        if (false === strpos($template, '{')) {\n            return $template;\n        }\n\n        $this->template = $template;\n        $this->variables = $variables;\n\n        return preg_replace_callback(\n            '/\\{([^\\}]+)\\}/',\n            [$this, 'expandMatch'],\n            $this->template\n        );\n    }\n\n    /**\n     * Parse an expression into parts\n     *\n     * @param string $expression Expression to parse\n     *\n     * @return array Returns an associative array of parts\n     */\n    private function parseExpression($expression)\n    {\n        $result = [];\n\n        if (isset(self::$operatorHash[$expression[0]])) {\n            $result['operator'] = $expression[0];\n            $expression = substr($expression, 1);\n        } else {\n            $result['operator'] = '';\n        }\n\n        foreach (explode(',', $expression) as $value) {\n            $value = trim($value);\n            $varspec = [];\n            if ($colonPos = strpos($value, ':')) {\n                $varspec['value'] = substr($value, 0, $colonPos);\n                $varspec['modifier'] = ':';\n                $varspec['position'] = (int) substr($value, $colonPos + 1);\n            } elseif (substr($value, -1) === '*') {\n                $varspec['modifier'] = '*';\n                $varspec['value'] = substr($value, 0, -1);\n            } else {\n                $varspec['value'] = (string) $value;\n                $varspec['modifier'] = '';\n            }\n            $result['values'][] = $varspec;\n        }\n\n        return $result;\n    }\n\n    /**\n     * Process an expansion\n     *\n     * @param array $matches Matches met in the preg_replace_callback\n     *\n     * @return string Returns the replacement string\n     */\n    private function expandMatch(array $matches)\n    {\n        static $rfc1738to3986 = ['+' => '%20', '%7e' => '~'];\n\n        $replacements = [];\n        $parsed = self::parseExpression($matches[1]);\n        $prefix = self::$operatorHash[$parsed['operator']]['prefix'];\n        $joiner = self::$operatorHash[$parsed['operator']]['joiner'];\n        $useQuery = self::$operatorHash[$parsed['operator']]['query'];\n\n        foreach ($parsed['values'] as $value) {\n            if (!isset($this->variables[$value['value']])) {\n                continue;\n            }\n\n            $variable = $this->variables[$value['value']];\n            $actuallyUseQuery = $useQuery;\n            $expanded = '';\n\n            if (is_array($variable)) {\n                $isAssoc = $this->isAssoc($variable);\n                $kvp = [];\n                foreach ($variable as $key => $var) {\n                    if ($isAssoc) {\n                        $key = rawurlencode($key);\n                        $isNestedArray = is_array($var);\n                    } else {\n                        $isNestedArray = false;\n                    }\n\n                    if (!$isNestedArray) {\n                        $var = rawurlencode($var);\n                        if ($parsed['operator'] === '+' ||\n                            $parsed['operator'] === '#'\n                        ) {\n                            $var = $this->decodeReserved($var);\n                        }\n                    }\n\n                    if ($value['modifier'] === '*') {\n                        if ($isAssoc) {\n                            if ($isNestedArray) {\n                                // Nested arrays must allow for deeply nested\n                                // structures.\n                                $var = strtr(\n                                    http_build_query([$key => $var]),\n                                    $rfc1738to3986\n                                );\n                            } else {\n                                $var = $key . '=' . $var;\n                            }\n                        } elseif ($key > 0 && $actuallyUseQuery) {\n                            $var = $value['value'] . '=' . $var;\n                        }\n                    }\n\n                    $kvp[$key] = $var;\n                }\n\n                if (empty($variable)) {\n                    $actuallyUseQuery = false;\n                } elseif ($value['modifier'] === '*') {\n                    $expanded = implode($joiner, $kvp);\n                    if ($isAssoc) {\n                        // Don't prepend the value name when using the explode\n                        // modifier with an associative array.\n                        $actuallyUseQuery = false;\n                    }\n                } else {\n                    if ($isAssoc) {\n                        // When an associative array is encountered and the\n                        // explode modifier is not set, then the result must be\n                        // a comma separated list of keys followed by their\n                        // respective values.\n                        foreach ($kvp as $k => &$v) {\n                            $v = $k . ',' . $v;\n                        }\n                    }\n                    $expanded = implode(',', $kvp);\n                }\n            } else {\n                if ($value['modifier'] === ':') {\n                    $variable = substr($variable, 0, $value['position']);\n                }\n                $expanded = rawurlencode($variable);\n                if ($parsed['operator'] === '+' || $parsed['operator'] === '#') {\n                    $expanded = $this->decodeReserved($expanded);\n                }\n            }\n\n            if ($actuallyUseQuery) {\n                if (!$expanded && $joiner !== '&') {\n                    $expanded = $value['value'];\n                } else {\n                    $expanded = $value['value'] . '=' . $expanded;\n                }\n            }\n\n            $replacements[] = $expanded;\n        }\n\n        $ret = implode($joiner, $replacements);\n        if ($ret && $prefix) {\n            return $prefix . $ret;\n        }\n\n        return $ret;\n    }\n\n    /**\n     * Determines if an array is associative.\n     *\n     * This makes the assumption that input arrays are sequences or hashes.\n     * This assumption is a tradeoff for accuracy in favor of speed, but it\n     * should work in almost every case where input is supplied for a URI\n     * template.\n     *\n     * @param array $array Array to check\n     *\n     * @return bool\n     */\n    private function isAssoc(array $array)\n    {\n        return $array && array_keys($array)[0] !== 0;\n    }\n\n    /**\n     * Removes percent encoding on reserved characters (used with + and #\n     * modifiers).\n     *\n     * @param string $string String to fix\n     *\n     * @return string\n     */\n    private function decodeReserved($string)\n    {\n        return str_replace(self::$delimsPct, self::$delims, $string);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Utils.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Exception\\InvalidArgumentException;\nuse Psr\\Http\\Message\\UriInterface;\nuse Symfony\\Polyfill\\Intl\\Idn\\Idn;\n\nfinal class Utils\n{\n    /**\n     * Wrapper for the hrtime() or microtime() functions\n     * (depending on the PHP version, one of the two is used)\n     *\n     * @return float|mixed UNIX timestamp\n     *\n     * @internal\n     */\n    public static function currentTime()\n    {\n        return function_exists('hrtime') ? hrtime(true) / 1e9 : microtime(true);\n    }\n\n    /**\n     * @param int $options\n     *\n     * @return UriInterface\n     * @throws InvalidArgumentException\n     *\n     * @internal\n     */\n    public static function idnUriConvert(UriInterface $uri, $options = 0)\n    {\n        if ($uri->getHost()) {\n            $asciiHost = self::idnToAsci($uri->getHost(), $options, $info);\n            if ($asciiHost === false) {\n                $errorBitSet = isset($info['errors']) ? $info['errors'] : 0;\n\n                $errorConstants = array_filter(array_keys(get_defined_constants()), function ($name) {\n                    return substr($name, 0, 11) === 'IDNA_ERROR_';\n                });\n\n                $errors = [];\n                foreach ($errorConstants as $errorConstant) {\n                    if ($errorBitSet & constant($errorConstant)) {\n                        $errors[] = $errorConstant;\n                    }\n                }\n\n                $errorMessage = 'IDN conversion failed';\n                if ($errors) {\n                    $errorMessage .= ' (errors: ' . implode(', ', $errors) . ')';\n                }\n\n                throw new InvalidArgumentException($errorMessage);\n            } else {\n                if ($uri->getHost() !== $asciiHost) {\n                    // Replace URI only if the ASCII version is different\n                    $uri = $uri->withHost($asciiHost);\n                }\n            }\n        }\n\n        return $uri;\n    }\n\n    /**\n     * @param string $domain\n     * @param int    $options\n     * @param array  $info\n     *\n     * @return string|false\n     */\n    private static function idnToAsci($domain, $options, &$info = [])\n    {\n        if (\\preg_match('%^[ -~]+$%', $domain) === 1) {\n            return $domain;\n        }\n\n        if (\\extension_loaded('intl') && defined('INTL_IDNA_VARIANT_UTS46')) {\n            return \\idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $info);\n        }\n\n        /*\n         * The Idn class is marked as @internal. Verify that class and method exists.\n         */\n        if (method_exists(Idn::class, 'idn_to_ascii')) {\n            return Idn::idn_to_ascii($domain, $options, Idn::INTL_IDNA_VARIANT_UTS46, $info);\n        }\n\n        throw new \\RuntimeException('ext-intl or symfony/polyfill-intl-idn not loaded or too old');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/functions.php",
    "content": "<?php\nnamespace GuzzleHttp;\n\nuse GuzzleHttp\\Handler\\CurlHandler;\nuse GuzzleHttp\\Handler\\CurlMultiHandler;\nuse GuzzleHttp\\Handler\\Proxy;\nuse GuzzleHttp\\Handler\\StreamHandler;\n\n/**\n * Expands a URI template\n *\n * @param string $template  URI template\n * @param array  $variables Template variables\n *\n * @return string\n */\nfunction uri_template($template, array $variables)\n{\n    if (extension_loaded('uri_template')) {\n        // @codeCoverageIgnoreStart\n        return \\uri_template($template, $variables);\n        // @codeCoverageIgnoreEnd\n    }\n\n    static $uriTemplate;\n    if (!$uriTemplate) {\n        $uriTemplate = new UriTemplate();\n    }\n\n    return $uriTemplate->expand($template, $variables);\n}\n\n/**\n * Debug function used to describe the provided value type and class.\n *\n * @param mixed $input\n *\n * @return string Returns a string containing the type of the variable and\n *                if a class is provided, the class name.\n */\nfunction describe_type($input)\n{\n    switch (gettype($input)) {\n        case 'object':\n            return 'object(' . get_class($input) . ')';\n        case 'array':\n            return 'array(' . count($input) . ')';\n        default:\n            ob_start();\n            var_dump($input);\n            // normalize float vs double\n            return str_replace('double(', 'float(', rtrim(ob_get_clean()));\n    }\n}\n\n/**\n * Parses an array of header lines into an associative array of headers.\n *\n * @param iterable $lines Header lines array of strings in the following\n *                     format: \"Name: Value\"\n * @return array\n */\nfunction headers_from_lines($lines)\n{\n    $headers = [];\n\n    foreach ($lines as $line) {\n        $parts = explode(':', $line, 2);\n        $headers[trim($parts[0])][] = isset($parts[1])\n            ? trim($parts[1])\n            : null;\n    }\n\n    return $headers;\n}\n\n/**\n * Returns a debug stream based on the provided variable.\n *\n * @param mixed $value Optional value\n *\n * @return resource\n */\nfunction debug_resource($value = null)\n{\n    if (is_resource($value)) {\n        return $value;\n    } elseif (defined('STDOUT')) {\n        return STDOUT;\n    }\n\n    return fopen('php://output', 'w');\n}\n\n/**\n * Chooses and creates a default handler to use based on the environment.\n *\n * The returned handler is not wrapped by any default middlewares.\n *\n * @return callable Returns the best handler for the given system.\n * @throws \\RuntimeException if no viable Handler is available.\n */\nfunction choose_handler()\n{\n    $handler = null;\n    if (function_exists('curl_multi_exec') && function_exists('curl_exec')) {\n        $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler());\n    } elseif (function_exists('curl_exec')) {\n        $handler = new CurlHandler();\n    } elseif (function_exists('curl_multi_exec')) {\n        $handler = new CurlMultiHandler();\n    }\n\n    if (ini_get('allow_url_fopen')) {\n        $handler = $handler\n            ? Proxy::wrapStreaming($handler, new StreamHandler())\n            : new StreamHandler();\n    } elseif (!$handler) {\n        throw new \\RuntimeException('GuzzleHttp requires cURL, the '\n            . 'allow_url_fopen ini setting, or a custom HTTP handler.');\n    }\n\n    return $handler;\n}\n\n/**\n * Get the default User-Agent string to use with Guzzle\n *\n * @return string\n */\nfunction default_user_agent()\n{\n    static $defaultAgent = '';\n\n    if (!$defaultAgent) {\n        $defaultAgent = 'GuzzleHttp/' . Client::VERSION;\n        if (extension_loaded('curl') && function_exists('curl_version')) {\n            $defaultAgent .= ' curl/' . \\curl_version()['version'];\n        }\n        $defaultAgent .= ' PHP/' . PHP_VERSION;\n    }\n\n    return $defaultAgent;\n}\n\n/**\n * Returns the default cacert bundle for the current system.\n *\n * First, the openssl.cafile and curl.cainfo php.ini settings are checked.\n * If those settings are not configured, then the common locations for\n * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X\n * and Windows are checked. If any of these file locations are found on\n * disk, they will be utilized.\n *\n * Note: the result of this function is cached for subsequent calls.\n *\n * @return string\n * @throws \\RuntimeException if no bundle can be found.\n */\nfunction default_ca_bundle()\n{\n    static $cached = null;\n    static $cafiles = [\n        // Red Hat, CentOS, Fedora (provided by the ca-certificates package)\n        '/etc/pki/tls/certs/ca-bundle.crt',\n        // Ubuntu, Debian (provided by the ca-certificates package)\n        '/etc/ssl/certs/ca-certificates.crt',\n        // FreeBSD (provided by the ca_root_nss package)\n        '/usr/local/share/certs/ca-root-nss.crt',\n        // SLES 12 (provided by the ca-certificates package)\n        '/var/lib/ca-certificates/ca-bundle.pem',\n        // OS X provided by homebrew (using the default path)\n        '/usr/local/etc/openssl/cert.pem',\n        // Google app engine\n        '/etc/ca-certificates.crt',\n        // Windows?\n        'C:\\\\windows\\\\system32\\\\curl-ca-bundle.crt',\n        'C:\\\\windows\\\\curl-ca-bundle.crt',\n    ];\n\n    if ($cached) {\n        return $cached;\n    }\n\n    if ($ca = ini_get('openssl.cafile')) {\n        return $cached = $ca;\n    }\n\n    if ($ca = ini_get('curl.cainfo')) {\n        return $cached = $ca;\n    }\n\n    foreach ($cafiles as $filename) {\n        if (file_exists($filename)) {\n            return $cached = $filename;\n        }\n    }\n\n    throw new \\RuntimeException(\n        <<< EOT\nNo system CA bundle could be found in any of the the common system locations.\nPHP versions earlier than 5.6 are not properly configured to use the system's\nCA bundle by default. In order to verify peer certificates, you will need to\nsupply the path on disk to a certificate bundle to the 'verify' request\noption: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not\nneed a specific certificate bundle, then Mozilla provides a commonly used CA\nbundle which can be downloaded here (provided by the maintainer of cURL):\nhttps://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once\nyou have a CA bundle available on disk, you can set the 'openssl.cafile' PHP\nini setting to point to the path to the file, allowing you to omit the 'verify'\nrequest option. See http://curl.haxx.se/docs/sslcerts.html for more\ninformation.\nEOT\n    );\n}\n\n/**\n * Creates an associative array of lowercase header names to the actual\n * header casing.\n *\n * @param array $headers\n *\n * @return array\n */\nfunction normalize_header_keys(array $headers)\n{\n    $result = [];\n    foreach (array_keys($headers) as $key) {\n        $result[strtolower($key)] = $key;\n    }\n\n    return $result;\n}\n\n/**\n * Returns true if the provided host matches any of the no proxy areas.\n *\n * This method will strip a port from the host if it is present. Each pattern\n * can be matched with an exact match (e.g., \"foo.com\" == \"foo.com\") or a\n * partial match: (e.g., \"foo.com\" == \"baz.foo.com\" and \".foo.com\" ==\n * \"baz.foo.com\", but \".foo.com\" != \"foo.com\").\n *\n * Areas are matched in the following cases:\n * 1. \"*\" (without quotes) always matches any hosts.\n * 2. An exact match.\n * 3. The area starts with \".\" and the area is the last part of the host. e.g.\n *    '.mit.edu' will match any host that ends with '.mit.edu'.\n *\n * @param string $host         Host to check against the patterns.\n * @param array  $noProxyArray An array of host patterns.\n *\n * @return bool\n */\nfunction is_host_in_noproxy($host, array $noProxyArray)\n{\n    if (strlen($host) === 0) {\n        throw new \\InvalidArgumentException('Empty host provided');\n    }\n\n    // Strip port if present.\n    if (strpos($host, ':')) {\n        $host = explode($host, ':', 2)[0];\n    }\n\n    foreach ($noProxyArray as $area) {\n        // Always match on wildcards.\n        if ($area === '*') {\n            return true;\n        } elseif (empty($area)) {\n            // Don't match on empty values.\n            continue;\n        } elseif ($area === $host) {\n            // Exact matches.\n            return true;\n        } else {\n            // Special match if the area when prefixed with \".\". Remove any\n            // existing leading \".\" and add a new leading \".\".\n            $area = '.' . ltrim($area, '.');\n            if (substr($host, -(strlen($area))) === $area) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n}\n\n/**\n * Wrapper for json_decode that throws when an error occurs.\n *\n * @param string $json    JSON data to parse\n * @param bool $assoc     When true, returned objects will be converted\n *                        into associative arrays.\n * @param int    $depth   User specified recursion depth.\n * @param int    $options Bitmask of JSON decode options.\n *\n * @return mixed\n * @throws Exception\\InvalidArgumentException if the JSON cannot be decoded.\n * @link http://www.php.net/manual/en/function.json-decode.php\n */\nfunction json_decode($json, $assoc = false, $depth = 512, $options = 0)\n{\n    $data = \\json_decode($json, $assoc, $depth, $options);\n    if (JSON_ERROR_NONE !== json_last_error()) {\n        throw new Exception\\InvalidArgumentException(\n            'json_decode error: ' . json_last_error_msg()\n        );\n    }\n\n    return $data;\n}\n\n/**\n * Wrapper for JSON encoding that throws when an error occurs.\n *\n * @param mixed $value   The value being encoded\n * @param int    $options JSON encode option bitmask\n * @param int    $depth   Set the maximum depth. Must be greater than zero.\n *\n * @return string\n * @throws Exception\\InvalidArgumentException if the JSON cannot be encoded.\n * @link http://www.php.net/manual/en/function.json-encode.php\n */\nfunction json_encode($value, $options = 0, $depth = 512)\n{\n    $json = \\json_encode($value, $options, $depth);\n    if (JSON_ERROR_NONE !== json_last_error()) {\n        throw new Exception\\InvalidArgumentException(\n            'json_encode error: ' . json_last_error_msg()\n        );\n    }\n\n    return $json;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/functions_include.php",
    "content": "<?php\n\n// Don't redefine the functions if included multiple times.\nif (!function_exists('GuzzleHttp\\uri_template')) {\n    require __DIR__ . '/functions.php';\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/CHANGELOG.md",
    "content": "# CHANGELOG\n\n\n## 1.3.1 - 2016-12-20\n\n### Fixed\n\n- `wait()` foreign promise compatibility\n\n\n## 1.3.0 - 2016-11-18\n\n### Added\n\n- Adds support for custom task queues.\n\n### Fixed\n\n- Fixed coroutine promise memory leak.\n\n\n## 1.2.0 - 2016-05-18\n\n### Changed\n\n- Update to now catch `\\Throwable` on PHP 7+\n\n\n## 1.1.0 - 2016-03-07\n\n### Changed\n\n- Update EachPromise to prevent recurring on a iterator when advancing, as this\n  could trigger fatal generator errors.\n- Update Promise to allow recursive waiting without unwrapping exceptions.\n\n\n## 1.0.3 - 2015-10-15\n\n### Changed\n\n- Update EachPromise to immediately resolve when the underlying promise iterator\n  is empty. Previously, such a promise would throw an exception when its `wait`\n  function was called.\n\n\n## 1.0.2 - 2015-05-15\n\n### Changed\n\n- Conditionally require functions.php.\n\n\n## 1.0.1 - 2015-06-24\n\n### Changed\n\n- Updating EachPromise to call next on the underlying promise iterator as late\n  as possible to ensure that generators that generate new requests based on\n  callbacks are not iterated until after callbacks are invoked.\n\n\n## 1.0.0 - 2015-05-12\n\n- Initial release\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/LICENSE",
    "content": "Copyright (c) 2015-2016 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/Makefile",
    "content": "all: clean test\n\ntest:\n\tvendor/bin/phpunit\n\ncoverage:\n\tvendor/bin/phpunit --coverage-html=artifacts/coverage\n\nview-coverage:\n\topen artifacts/coverage/index.html\n\nclean:\n\trm -rf artifacts/*\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/README.md",
    "content": "# Guzzle Promises\n\n[Promises/A+](https://promisesaplus.com/) implementation that handles promise\nchaining and resolution iteratively, allowing for \"infinite\" promise chaining\nwhile keeping the stack size constant. Read [this blog post](https://blog.domenic.me/youre-missing-the-point-of-promises/)\nfor a general introduction to promises.\n\n- [Features](#features)\n- [Quick start](#quick-start)\n- [Synchronous wait](#synchronous-wait)\n- [Cancellation](#cancellation)\n- [API](#api)\n  - [Promise](#promise)\n  - [FulfilledPromise](#fulfilledpromise)\n  - [RejectedPromise](#rejectedpromise)\n- [Promise interop](#promise-interop)\n- [Implementation notes](#implementation-notes)\n\n\n# Features\n\n- [Promises/A+](https://promisesaplus.com/) implementation.\n- Promise resolution and chaining is handled iteratively, allowing for\n  \"infinite\" promise chaining.\n- Promises have a synchronous `wait` method.\n- Promises can be cancelled.\n- Works with any object that has a `then` function.\n- C# style async/await coroutine promises using\n  `GuzzleHttp\\Promise\\coroutine()`.\n\n\n# Quick start\n\nA *promise* represents the eventual result of an asynchronous operation. The\nprimary way of interacting with a promise is through its `then` method, which\nregisters callbacks to receive either a promise's eventual value or the reason\nwhy the promise cannot be fulfilled.\n\n\n## Callbacks\n\nCallbacks are registered with the `then` method by providing an optional \n`$onFulfilled` followed by an optional `$onRejected` function.\n\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise->then(\n    // $onFulfilled\n    function ($value) {\n        echo 'The promise was fulfilled.';\n    },\n    // $onRejected\n    function ($reason) {\n        echo 'The promise was rejected.';\n    }\n);\n```\n\n*Resolving* a promise means that you either fulfill a promise with a *value* or\nreject a promise with a *reason*. Resolving a promises triggers callbacks\nregistered with the promises's `then` method. These callbacks are triggered\nonly once and in the order in which they were added.\n\n\n## Resolving a promise\n\nPromises are fulfilled using the `resolve($value)` method. Resolving a promise\nwith any value other than a `GuzzleHttp\\Promise\\RejectedPromise` will trigger\nall of the onFulfilled callbacks (resolving a promise with a rejected promise\nwill reject the promise and trigger the `$onRejected` callbacks).\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise\n    ->then(function ($value) {\n        // Return a value and don't break the chain\n        return \"Hello, \" . $value;\n    })\n    // This then is executed after the first then and receives the value\n    // returned from the first then.\n    ->then(function ($value) {\n        echo $value;\n    });\n\n// Resolving the promise triggers the $onFulfilled callbacks and outputs\n// \"Hello, reader\".\n$promise->resolve('reader.');\n```\n\n\n## Promise forwarding\n\nPromises can be chained one after the other. Each then in the chain is a new\npromise. The return value of a promise is what's forwarded to the next\npromise in the chain. Returning a promise in a `then` callback will cause the\nsubsequent promises in the chain to only be fulfilled when the returned promise\nhas been fulfilled. The next promise in the chain will be invoked with the\nresolved value of the promise.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$nextPromise = new Promise();\n\n$promise\n    ->then(function ($value) use ($nextPromise) {\n        echo $value;\n        return $nextPromise;\n    })\n    ->then(function ($value) {\n        echo $value;\n    });\n\n// Triggers the first callback and outputs \"A\"\n$promise->resolve('A');\n// Triggers the second callback and outputs \"B\"\n$nextPromise->resolve('B');\n```\n\n## Promise rejection\n\nWhen a promise is rejected, the `$onRejected` callbacks are invoked with the\nrejection reason.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise->then(null, function ($reason) {\n    echo $reason;\n});\n\n$promise->reject('Error!');\n// Outputs \"Error!\"\n```\n\n## Rejection forwarding\n\nIf an exception is thrown in an `$onRejected` callback, subsequent\n`$onRejected` callbacks are invoked with the thrown exception as the reason.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise();\n$promise->then(null, function ($reason) {\n    throw new \\Exception($reason);\n})->then(null, function ($reason) {\n    assert($reason->getMessage() === 'Error!');\n});\n\n$promise->reject('Error!');\n```\n\nYou can also forward a rejection down the promise chain by returning a\n`GuzzleHttp\\Promise\\RejectedPromise` in either an `$onFulfilled` or\n`$onRejected` callback.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\nuse GuzzleHttp\\Promise\\RejectedPromise;\n\n$promise = new Promise();\n$promise->then(null, function ($reason) {\n    return new RejectedPromise($reason);\n})->then(null, function ($reason) {\n    assert($reason === 'Error!');\n});\n\n$promise->reject('Error!');\n```\n\nIf an exception is not thrown in a `$onRejected` callback and the callback\ndoes not return a rejected promise, downstream `$onFulfilled` callbacks are\ninvoked using the value returned from the `$onRejected` callback.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\nuse GuzzleHttp\\Promise\\RejectedPromise;\n\n$promise = new Promise();\n$promise\n    ->then(null, function ($reason) {\n        return \"It's ok\";\n    })\n    ->then(function ($value) {\n        assert($value === \"It's ok\");\n    });\n\n$promise->reject('Error!');\n```\n\n# Synchronous wait\n\nYou can synchronously force promises to complete using a promise's `wait`\nmethod. When creating a promise, you can provide a wait function that is used\nto synchronously force a promise to complete. When a wait function is invoked\nit is expected to deliver a value to the promise or reject the promise. If the\nwait function does not deliver a value, then an exception is thrown. The wait\nfunction provided to a promise constructor is invoked when the `wait` function\nof the promise is called.\n\n```php\n$promise = new Promise(function () use (&$promise) {\n    $promise->resolve('foo');\n});\n\n// Calling wait will return the value of the promise.\necho $promise->wait(); // outputs \"foo\"\n```\n\nIf an exception is encountered while invoking the wait function of a promise,\nthe promise is rejected with the exception and the exception is thrown.\n\n```php\n$promise = new Promise(function () use (&$promise) {\n    throw new \\Exception('foo');\n});\n\n$promise->wait(); // throws the exception.\n```\n\nCalling `wait` on a promise that has been fulfilled will not trigger the wait\nfunction. It will simply return the previously resolved value.\n\n```php\n$promise = new Promise(function () { die('this is not called!'); });\n$promise->resolve('foo');\necho $promise->wait(); // outputs \"foo\"\n```\n\nCalling `wait` on a promise that has been rejected will throw an exception. If\nthe rejection reason is an instance of `\\Exception` the reason is thrown.\nOtherwise, a `GuzzleHttp\\Promise\\RejectionException` is thrown and the reason\ncan be obtained by calling the `getReason` method of the exception.\n\n```php\n$promise = new Promise();\n$promise->reject('foo');\n$promise->wait();\n```\n\n> PHP Fatal error:  Uncaught exception 'GuzzleHttp\\Promise\\RejectionException' with message 'The promise was rejected with value: foo'\n\n\n## Unwrapping a promise\n\nWhen synchronously waiting on a promise, you are joining the state of the\npromise into the current state of execution (i.e., return the value of the\npromise if it was fulfilled or throw an exception if it was rejected). This is\ncalled \"unwrapping\" the promise. Waiting on a promise will by default unwrap\nthe promise state.\n\nYou can force a promise to resolve and *not* unwrap the state of the promise\nby passing `false` to the first argument of the `wait` function:\n\n```php\n$promise = new Promise();\n$promise->reject('foo');\n// This will not throw an exception. It simply ensures the promise has\n// been resolved.\n$promise->wait(false);\n```\n\nWhen unwrapping a promise, the resolved value of the promise will be waited\nupon until the unwrapped value is not a promise. This means that if you resolve\npromise A with a promise B and unwrap promise A, the value returned by the\nwait function will be the value delivered to promise B.\n\n**Note**: when you do not unwrap the promise, no value is returned.\n\n\n# Cancellation\n\nYou can cancel a promise that has not yet been fulfilled using the `cancel()`\nmethod of a promise. When creating a promise you can provide an optional\ncancel function that when invoked cancels the action of computing a resolution\nof the promise.\n\n\n# API\n\n\n## Promise\n\nWhen creating a promise object, you can provide an optional `$waitFn` and\n`$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is\nexpected to resolve the promise. `$cancelFn` is a function with no arguments\nthat is expected to cancel the computation of a promise. It is invoked when the\n`cancel()` method of a promise is called.\n\n```php\nuse GuzzleHttp\\Promise\\Promise;\n\n$promise = new Promise(\n    function () use (&$promise) {\n        $promise->resolve('waited');\n    },\n    function () {\n        // do something that will cancel the promise computation (e.g., close\n        // a socket, cancel a database query, etc...)\n    }\n);\n\nassert('waited' === $promise->wait());\n```\n\nA promise has the following methods:\n\n- `then(callable $onFulfilled, callable $onRejected) : PromiseInterface`\n  \n  Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler.\n\n- `otherwise(callable $onRejected) : PromiseInterface`\n  \n  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.\n\n- `wait($unwrap = true) : mixed`\n\n  Synchronously waits on the promise to complete.\n  \n  `$unwrap` controls whether or not the value of the promise is returned for a\n  fulfilled promise or if an exception is thrown if the promise is rejected.\n  This is set to `true` by default.\n\n- `cancel()`\n\n  Attempts to cancel the promise if possible. The promise being cancelled and\n  the parent most ancestor that has not yet been resolved will also be\n  cancelled. Any promises waiting on the cancelled promise to resolve will also\n  be cancelled.\n\n- `getState() : string`\n\n  Returns the state of the promise. One of `pending`, `fulfilled`, or\n  `rejected`.\n\n- `resolve($value)`\n\n  Fulfills the promise with the given `$value`.\n\n- `reject($reason)`\n\n  Rejects the promise with the given `$reason`.\n\n\n## FulfilledPromise\n\nA fulfilled promise can be created to represent a promise that has been\nfulfilled.\n\n```php\nuse GuzzleHttp\\Promise\\FulfilledPromise;\n\n$promise = new FulfilledPromise('value');\n\n// Fulfilled callbacks are immediately invoked.\n$promise->then(function ($value) {\n    echo $value;\n});\n```\n\n\n## RejectedPromise\n\nA rejected promise can be created to represent a promise that has been\nrejected.\n\n```php\nuse GuzzleHttp\\Promise\\RejectedPromise;\n\n$promise = new RejectedPromise('Error');\n\n// Rejected callbacks are immediately invoked.\n$promise->then(null, function ($reason) {\n    echo $reason;\n});\n```\n\n\n# Promise interop\n\nThis library works with foreign promises that have a `then` method. This means\nyou can use Guzzle promises with [React promises](https://github.com/reactphp/promise)\nfor example. When a foreign promise is returned inside of a then method\ncallback, promise resolution will occur recursively.\n\n```php\n// Create a React promise\n$deferred = new React\\Promise\\Deferred();\n$reactPromise = $deferred->promise();\n\n// Create a Guzzle promise that is fulfilled with a React promise.\n$guzzlePromise = new \\GuzzleHttp\\Promise\\Promise();\n$guzzlePromise->then(function ($value) use ($reactPromise) {\n    // Do something something with the value...\n    // Return the React promise\n    return $reactPromise;\n});\n```\n\nPlease note that wait and cancel chaining is no longer possible when forwarding\na foreign promise. You will need to wrap a third-party promise with a Guzzle\npromise in order to utilize wait and cancel functions with foreign promises.\n\n\n## Event Loop Integration\n\nIn order to keep the stack size constant, Guzzle promises are resolved\nasynchronously using a task queue. When waiting on promises synchronously, the\ntask queue will be automatically run to ensure that the blocking promise and\nany forwarded promises are resolved. When using promises asynchronously in an\nevent loop, you will need to run the task queue on each tick of the loop. If\nyou do not run the task queue, then promises will not be resolved.\n\nYou can run the task queue using the `run()` method of the global task queue\ninstance.\n\n```php\n// Get the global task queue\n$queue = \\GuzzleHttp\\Promise\\queue();\n$queue->run();\n```\n\nFor example, you could use Guzzle promises with React using a periodic timer:\n\n```php\n$loop = React\\EventLoop\\Factory::create();\n$loop->addPeriodicTimer(0, [$queue, 'run']);\n```\n\n*TODO*: Perhaps adding a `futureTick()` on each tick would be faster?\n\n\n# Implementation notes\n\n\n## Promise resolution and chaining is handled iteratively\n\nBy shuffling pending handlers from one owner to another, promises are\nresolved iteratively, allowing for \"infinite\" then chaining.\n\n```php\n<?php\nrequire 'vendor/autoload.php';\n\nuse GuzzleHttp\\Promise\\Promise;\n\n$parent = new Promise();\n$p = $parent;\n\nfor ($i = 0; $i < 1000; $i++) {\n    $p = $p->then(function ($v) {\n        // The stack size remains constant (a good thing)\n        echo xdebug_get_stack_depth() . ', ';\n        return $v + 1;\n    });\n}\n\n$parent->resolve(0);\nvar_dump($p->wait()); // int(1000)\n\n```\n\nWhen a promise is fulfilled or rejected with a non-promise value, the promise\nthen takes ownership of the handlers of each child promise and delivers values\ndown the chain without using recursion.\n\nWhen a promise is resolved with another promise, the original promise transfers\nall of its pending handlers to the new promise. When the new promise is\neventually resolved, all of the pending handlers are delivered the forwarded\nvalue.\n\n\n## A promise is the deferred.\n\nSome promise libraries implement promises using a deferred object to represent\na computation and a promise object to represent the delivery of the result of\nthe computation. This is a nice separation of computation and delivery because\nconsumers of the promise cannot modify the value that will be eventually\ndelivered.\n\nOne side effect of being able to implement promise resolution and chaining\niteratively is that you need to be able for one promise to reach into the state\nof another promise to shuffle around ownership of handlers. In order to achieve\nthis without making the handlers of a promise publicly mutable, a promise is\nalso the deferred value, allowing promises of the same parent class to reach\ninto and modify the private properties of promises of the same type. While this\ndoes allow consumers of the value to modify the resolution or rejection of the\ndeferred, it is a small price to pay for keeping the stack size constant.\n\n```php\n$promise = new Promise();\n$promise->then(function ($value) { echo $value; });\n// The promise is the deferred value, so you can deliver a value to it.\n$promise->resolve('foo');\n// prints \"foo\"\n```\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/composer.json",
    "content": "{\n    \"name\": \"guzzlehttp/promises\",\n    \"description\": \"Guzzle promises library\",\n    \"keywords\": [\"promise\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Michael Dowling\",\n            \"email\": \"mtdowling@gmail.com\",\n            \"homepage\": \"https://github.com/mtdowling\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.5.0\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"^4.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Promise\\\\\": \"src/\"\n        },\n        \"files\": [\"src/functions_include.php\"]\n    },\n    \"scripts\": {\n        \"test\": \"vendor/bin/phpunit\",\n        \"test-ci\": \"vendor/bin/phpunit --coverage-text\"\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.4-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/AggregateException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Exception thrown when too many errors occur in the some() or any() methods.\n */\nclass AggregateException extends RejectionException\n{\n    public function __construct($msg, array $reasons)\n    {\n        parent::__construct(\n            $reasons,\n            sprintf('%s; %d rejected promises', $msg, count($reasons))\n        );\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/CancellationException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Exception that is set as the reason for a promise that has been cancelled.\n */\nclass CancellationException extends RejectionException\n{\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/Coroutine.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\nuse Exception;\nuse Generator;\nuse Throwable;\n\n/**\n * Creates a promise that is resolved using a generator that yields values or\n * promises (somewhat similar to C#'s async keyword).\n *\n * When called, the coroutine function will start an instance of the generator\n * and returns a promise that is fulfilled with its final yielded value.\n *\n * Control is returned back to the generator when the yielded promise settles.\n * This can lead to less verbose code when doing lots of sequential async calls\n * with minimal processing in between.\n *\n *     use GuzzleHttp\\Promise;\n *\n *     function createPromise($value) {\n *         return new Promise\\FulfilledPromise($value);\n *     }\n *\n *     $promise = Promise\\coroutine(function () {\n *         $value = (yield createPromise('a'));\n *         try {\n *             $value = (yield createPromise($value . 'b'));\n *         } catch (\\Exception $e) {\n *             // The promise was rejected.\n *         }\n *         yield $value . 'c';\n *     });\n *\n *     // Outputs \"abc\"\n *     $promise->then(function ($v) { echo $v; });\n *\n * @param callable $generatorFn Generator function to wrap into a promise.\n *\n * @return Promise\n * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration\n */\nfinal class Coroutine implements PromiseInterface\n{\n    /**\n     * @var PromiseInterface|null\n     */\n    private $currentPromise;\n\n    /**\n     * @var Generator\n     */\n    private $generator;\n\n    /**\n     * @var Promise\n     */\n    private $result;\n\n    public function __construct(callable $generatorFn)\n    {\n        $this->generator = $generatorFn();\n        $this->result = new Promise(function () {\n            while (isset($this->currentPromise)) {\n                $this->currentPromise->wait();\n            }\n        });\n        $this->nextCoroutine($this->generator->current());\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        return $this->result->then($onFulfilled, $onRejected);\n    }\n\n    public function otherwise(callable $onRejected)\n    {\n        return $this->result->otherwise($onRejected);\n    }\n\n    public function wait($unwrap = true)\n    {\n        return $this->result->wait($unwrap);\n    }\n\n    public function getState()\n    {\n        return $this->result->getState();\n    }\n\n    public function resolve($value)\n    {\n        $this->result->resolve($value);\n    }\n\n    public function reject($reason)\n    {\n        $this->result->reject($reason);\n    }\n\n    public function cancel()\n    {\n        $this->currentPromise->cancel();\n        $this->result->cancel();\n    }\n\n    private function nextCoroutine($yielded)\n    {\n        $this->currentPromise = promise_for($yielded)\n            ->then([$this, '_handleSuccess'], [$this, '_handleFailure']);\n    }\n\n    /**\n     * @internal\n     */\n    public function _handleSuccess($value)\n    {\n        unset($this->currentPromise);\n        try {\n            $next = $this->generator->send($value);\n            if ($this->generator->valid()) {\n                $this->nextCoroutine($next);\n            } else {\n                $this->result->resolve($value);\n            }\n        } catch (Exception $exception) {\n            $this->result->reject($exception);\n        } catch (Throwable $throwable) {\n            $this->result->reject($throwable);\n        }\n    }\n\n    /**\n     * @internal\n     */\n    public function _handleFailure($reason)\n    {\n        unset($this->currentPromise);\n        try {\n            $nextYield = $this->generator->throw(exception_for($reason));\n            // The throw was caught, so keep iterating on the coroutine\n            $this->nextCoroutine($nextYield);\n        } catch (Exception $exception) {\n            $this->result->reject($exception);\n        } catch (Throwable $throwable) {\n            $this->result->reject($throwable);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/EachPromise.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Represents a promise that iterates over many promises and invokes\n * side-effect functions in the process.\n */\nclass EachPromise implements PromisorInterface\n{\n    private $pending = [];\n\n    /** @var \\Iterator */\n    private $iterable;\n\n    /** @var callable|int */\n    private $concurrency;\n\n    /** @var callable */\n    private $onFulfilled;\n\n    /** @var callable */\n    private $onRejected;\n\n    /** @var Promise */\n    private $aggregate;\n\n    /** @var bool */\n    private $mutex;\n\n    /**\n     * Configuration hash can include the following key value pairs:\n     *\n     * - fulfilled: (callable) Invoked when a promise fulfills. The function\n     *   is invoked with three arguments: the fulfillment value, the index\n     *   position from the iterable list of the promise, and the aggregate\n     *   promise that manages all of the promises. The aggregate promise may\n     *   be resolved from within the callback to short-circuit the promise.\n     * - rejected: (callable) Invoked when a promise is rejected. The\n     *   function is invoked with three arguments: the rejection reason, the\n     *   index position from the iterable list of the promise, and the\n     *   aggregate promise that manages all of the promises. The aggregate\n     *   promise may be resolved from within the callback to short-circuit\n     *   the promise.\n     * - concurrency: (integer) Pass this configuration option to limit the\n     *   allowed number of outstanding concurrently executing promises,\n     *   creating a capped pool of promises. There is no limit by default.\n     *\n     * @param mixed    $iterable Promises or values to iterate.\n     * @param array    $config   Configuration options\n     */\n    public function __construct($iterable, array $config = [])\n    {\n        $this->iterable = iter_for($iterable);\n\n        if (isset($config['concurrency'])) {\n            $this->concurrency = $config['concurrency'];\n        }\n\n        if (isset($config['fulfilled'])) {\n            $this->onFulfilled = $config['fulfilled'];\n        }\n\n        if (isset($config['rejected'])) {\n            $this->onRejected = $config['rejected'];\n        }\n    }\n\n    public function promise()\n    {\n        if ($this->aggregate) {\n            return $this->aggregate;\n        }\n\n        try {\n            $this->createPromise();\n            $this->iterable->rewind();\n            $this->refillPending();\n        } catch (\\Throwable $e) {\n            $this->aggregate->reject($e);\n        } catch (\\Exception $e) {\n            $this->aggregate->reject($e);\n        }\n\n        return $this->aggregate;\n    }\n\n    private function createPromise()\n    {\n        $this->mutex = false;\n        $this->aggregate = new Promise(function () {\n            reset($this->pending);\n            if (empty($this->pending) && !$this->iterable->valid()) {\n                $this->aggregate->resolve(null);\n                return;\n            }\n\n            // Consume a potentially fluctuating list of promises while\n            // ensuring that indexes are maintained (precluding array_shift).\n            while ($promise = current($this->pending)) {\n                next($this->pending);\n                $promise->wait();\n                if ($this->aggregate->getState() !== PromiseInterface::PENDING) {\n                    return;\n                }\n            }\n        });\n\n        // Clear the references when the promise is resolved.\n        $clearFn = function () {\n            $this->iterable = $this->concurrency = $this->pending = null;\n            $this->onFulfilled = $this->onRejected = null;\n        };\n\n        $this->aggregate->then($clearFn, $clearFn);\n    }\n\n    private function refillPending()\n    {\n        if (!$this->concurrency) {\n            // Add all pending promises.\n            while ($this->addPending() && $this->advanceIterator());\n            return;\n        }\n\n        // Add only up to N pending promises.\n        $concurrency = is_callable($this->concurrency)\n            ? call_user_func($this->concurrency, count($this->pending))\n            : $this->concurrency;\n        $concurrency = max($concurrency - count($this->pending), 0);\n        // Concurrency may be set to 0 to disallow new promises.\n        if (!$concurrency) {\n            return;\n        }\n        // Add the first pending promise.\n        $this->addPending();\n        // Note this is special handling for concurrency=1 so that we do\n        // not advance the iterator after adding the first promise. This\n        // helps work around issues with generators that might not have the\n        // next value to yield until promise callbacks are called.\n        while (--$concurrency\n            && $this->advanceIterator()\n            && $this->addPending());\n    }\n\n    private function addPending()\n    {\n        if (!$this->iterable || !$this->iterable->valid()) {\n            return false;\n        }\n\n        $promise = promise_for($this->iterable->current());\n        $idx = $this->iterable->key();\n\n        $this->pending[$idx] = $promise->then(\n            function ($value) use ($idx) {\n                if ($this->onFulfilled) {\n                    call_user_func(\n                        $this->onFulfilled, $value, $idx, $this->aggregate\n                    );\n                }\n                $this->step($idx);\n            },\n            function ($reason) use ($idx) {\n                if ($this->onRejected) {\n                    call_user_func(\n                        $this->onRejected, $reason, $idx, $this->aggregate\n                    );\n                }\n                $this->step($idx);\n            }\n        );\n\n        return true;\n    }\n\n    private function advanceIterator()\n    {\n        // Place a lock on the iterator so that we ensure to not recurse,\n        // preventing fatal generator errors.\n        if ($this->mutex) {\n            return false;\n        }\n\n        $this->mutex = true;\n\n        try {\n            $this->iterable->next();\n            $this->mutex = false;\n            return true;\n        } catch (\\Throwable $e) {\n            $this->aggregate->reject($e);\n            $this->mutex = false;\n            return false;\n        } catch (\\Exception $e) {\n            $this->aggregate->reject($e);\n            $this->mutex = false;\n            return false;\n        }\n    }\n\n    private function step($idx)\n    {\n        // If the promise was already resolved, then ignore this step.\n        if ($this->aggregate->getState() !== PromiseInterface::PENDING) {\n            return;\n        }\n\n        unset($this->pending[$idx]);\n\n        // Only refill pending promises if we are not locked, preventing the\n        // EachPromise to recursively invoke the provided iterator, which\n        // cause a fatal error: \"Cannot resume an already running generator\"\n        if ($this->advanceIterator() && !$this->checkIfFinished()) {\n            // Add more pending promises if possible.\n            $this->refillPending();\n        }\n    }\n\n    private function checkIfFinished()\n    {\n        if (!$this->pending && !$this->iterable->valid()) {\n            // Resolve the promise if there's nothing left to do.\n            $this->aggregate->resolve(null);\n            return true;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/FulfilledPromise.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise that has been fulfilled.\n *\n * Thenning off of this promise will invoke the onFulfilled callback\n * immediately and ignore other callbacks.\n */\nclass FulfilledPromise implements PromiseInterface\n{\n    private $value;\n\n    public function __construct($value)\n    {\n        if (method_exists($value, 'then')) {\n            throw new \\InvalidArgumentException(\n                'You cannot create a FulfilledPromise with a promise.');\n        }\n\n        $this->value = $value;\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        // Return itself if there is no onFulfilled function.\n        if (!$onFulfilled) {\n            return $this;\n        }\n\n        $queue = queue();\n        $p = new Promise([$queue, 'run']);\n        $value = $this->value;\n        $queue->add(static function () use ($p, $value, $onFulfilled) {\n            if ($p->getState() === self::PENDING) {\n                try {\n                    $p->resolve($onFulfilled($value));\n                } catch (\\Throwable $e) {\n                    $p->reject($e);\n                } catch (\\Exception $e) {\n                    $p->reject($e);\n                }\n            }\n        });\n\n        return $p;\n    }\n\n    public function otherwise(callable $onRejected)\n    {\n        return $this->then(null, $onRejected);\n    }\n\n    public function wait($unwrap = true, $defaultDelivery = null)\n    {\n        return $unwrap ? $this->value : null;\n    }\n\n    public function getState()\n    {\n        return self::FULFILLED;\n    }\n\n    public function resolve($value)\n    {\n        if ($value !== $this->value) {\n            throw new \\LogicException(\"Cannot resolve a fulfilled promise\");\n        }\n    }\n\n    public function reject($reason)\n    {\n        throw new \\LogicException(\"Cannot reject a fulfilled promise\");\n    }\n\n    public function cancel()\n    {\n        // pass\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/Promise.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Promises/A+ implementation that avoids recursion when possible.\n *\n * @link https://promisesaplus.com/\n */\nclass Promise implements PromiseInterface\n{\n    private $state = self::PENDING;\n    private $result;\n    private $cancelFn;\n    private $waitFn;\n    private $waitList;\n    private $handlers = [];\n\n    /**\n     * @param callable $waitFn   Fn that when invoked resolves the promise.\n     * @param callable $cancelFn Fn that when invoked cancels the promise.\n     */\n    public function __construct(\n        callable $waitFn = null,\n        callable $cancelFn = null\n    ) {\n        $this->waitFn = $waitFn;\n        $this->cancelFn = $cancelFn;\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        if ($this->state === self::PENDING) {\n            $p = new Promise(null, [$this, 'cancel']);\n            $this->handlers[] = [$p, $onFulfilled, $onRejected];\n            $p->waitList = $this->waitList;\n            $p->waitList[] = $this;\n            return $p;\n        }\n\n        // Return a fulfilled promise and immediately invoke any callbacks.\n        if ($this->state === self::FULFILLED) {\n            return $onFulfilled\n                ? promise_for($this->result)->then($onFulfilled)\n                : promise_for($this->result);\n        }\n\n        // It's either cancelled or rejected, so return a rejected promise\n        // and immediately invoke any callbacks.\n        $rejection = rejection_for($this->result);\n        return $onRejected ? $rejection->then(null, $onRejected) : $rejection;\n    }\n\n    public function otherwise(callable $onRejected)\n    {\n        return $this->then(null, $onRejected);\n    }\n\n    public function wait($unwrap = true)\n    {\n        $this->waitIfPending();\n\n        $inner = $this->result instanceof PromiseInterface\n            ? $this->result->wait($unwrap)\n            : $this->result;\n\n        if ($unwrap) {\n            if ($this->result instanceof PromiseInterface\n                || $this->state === self::FULFILLED\n            ) {\n                return $inner;\n            } else {\n                // It's rejected so \"unwrap\" and throw an exception.\n                throw exception_for($inner);\n            }\n        }\n    }\n\n    public function getState()\n    {\n        return $this->state;\n    }\n\n    public function cancel()\n    {\n        if ($this->state !== self::PENDING) {\n            return;\n        }\n\n        $this->waitFn = $this->waitList = null;\n\n        if ($this->cancelFn) {\n            $fn = $this->cancelFn;\n            $this->cancelFn = null;\n            try {\n                $fn();\n            } catch (\\Throwable $e) {\n                $this->reject($e);\n            } catch (\\Exception $e) {\n                $this->reject($e);\n            }\n        }\n\n        // Reject the promise only if it wasn't rejected in a then callback.\n        if ($this->state === self::PENDING) {\n            $this->reject(new CancellationException('Promise has been cancelled'));\n        }\n    }\n\n    public function resolve($value)\n    {\n        $this->settle(self::FULFILLED, $value);\n    }\n\n    public function reject($reason)\n    {\n        $this->settle(self::REJECTED, $reason);\n    }\n\n    private function settle($state, $value)\n    {\n        if ($this->state !== self::PENDING) {\n            // Ignore calls with the same resolution.\n            if ($state === $this->state && $value === $this->result) {\n                return;\n            }\n            throw $this->state === $state\n                ? new \\LogicException(\"The promise is already {$state}.\")\n                : new \\LogicException(\"Cannot change a {$this->state} promise to {$state}\");\n        }\n\n        if ($value === $this) {\n            throw new \\LogicException('Cannot fulfill or reject a promise with itself');\n        }\n\n        // Clear out the state of the promise but stash the handlers.\n        $this->state = $state;\n        $this->result = $value;\n        $handlers = $this->handlers;\n        $this->handlers = null;\n        $this->waitList = $this->waitFn = null;\n        $this->cancelFn = null;\n\n        if (!$handlers) {\n            return;\n        }\n\n        // If the value was not a settled promise or a thenable, then resolve\n        // it in the task queue using the correct ID.\n        if (!method_exists($value, 'then')) {\n            $id = $state === self::FULFILLED ? 1 : 2;\n            // It's a success, so resolve the handlers in the queue.\n            queue()->add(static function () use ($id, $value, $handlers) {\n                foreach ($handlers as $handler) {\n                    self::callHandler($id, $value, $handler);\n                }\n            });\n        } elseif ($value instanceof Promise\n            && $value->getState() === self::PENDING\n        ) {\n            // We can just merge our handlers onto the next promise.\n            $value->handlers = array_merge($value->handlers, $handlers);\n        } else {\n            // Resolve the handlers when the forwarded promise is resolved.\n            $value->then(\n                static function ($value) use ($handlers) {\n                    foreach ($handlers as $handler) {\n                        self::callHandler(1, $value, $handler);\n                    }\n                },\n                static function ($reason) use ($handlers) {\n                    foreach ($handlers as $handler) {\n                        self::callHandler(2, $reason, $handler);\n                    }\n                }\n            );\n        }\n    }\n\n    /**\n     * Call a stack of handlers using a specific callback index and value.\n     *\n     * @param int   $index   1 (resolve) or 2 (reject).\n     * @param mixed $value   Value to pass to the callback.\n     * @param array $handler Array of handler data (promise and callbacks).\n     *\n     * @return array Returns the next group to resolve.\n     */\n    private static function callHandler($index, $value, array $handler)\n    {\n        /** @var PromiseInterface $promise */\n        $promise = $handler[0];\n\n        // The promise may have been cancelled or resolved before placing\n        // this thunk in the queue.\n        if ($promise->getState() !== self::PENDING) {\n            return;\n        }\n\n        try {\n            if (isset($handler[$index])) {\n                $promise->resolve($handler[$index]($value));\n            } elseif ($index === 1) {\n                // Forward resolution values as-is.\n                $promise->resolve($value);\n            } else {\n                // Forward rejections down the chain.\n                $promise->reject($value);\n            }\n        } catch (\\Throwable $reason) {\n            $promise->reject($reason);\n        } catch (\\Exception $reason) {\n            $promise->reject($reason);\n        }\n    }\n\n    private function waitIfPending()\n    {\n        if ($this->state !== self::PENDING) {\n            return;\n        } elseif ($this->waitFn) {\n            $this->invokeWaitFn();\n        } elseif ($this->waitList) {\n            $this->invokeWaitList();\n        } else {\n            // If there's not wait function, then reject the promise.\n            $this->reject('Cannot wait on a promise that has '\n                . 'no internal wait function. You must provide a wait '\n                . 'function when constructing the promise to be able to '\n                . 'wait on a promise.');\n        }\n\n        queue()->run();\n\n        if ($this->state === self::PENDING) {\n            $this->reject('Invoking the wait callback did not resolve the promise');\n        }\n    }\n\n    private function invokeWaitFn()\n    {\n        try {\n            $wfn = $this->waitFn;\n            $this->waitFn = null;\n            $wfn(true);\n        } catch (\\Exception $reason) {\n            if ($this->state === self::PENDING) {\n                // The promise has not been resolved yet, so reject the promise\n                // with the exception.\n                $this->reject($reason);\n            } else {\n                // The promise was already resolved, so there's a problem in\n                // the application.\n                throw $reason;\n            }\n        }\n    }\n\n    private function invokeWaitList()\n    {\n        $waitList = $this->waitList;\n        $this->waitList = null;\n\n        foreach ($waitList as $result) {\n            while (true) {\n                $result->waitIfPending();\n\n                if ($result->result instanceof Promise) {\n                    $result = $result->result;\n                } else {\n                    if ($result->result instanceof PromiseInterface) {\n                        $result->result->wait(false);\n                    }\n                    break;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/PromiseInterface.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise represents the eventual result of an asynchronous operation.\n *\n * The primary way of interacting with a promise is through its then method,\n * which registers callbacks to receive either a promise’s eventual value or\n * the reason why the promise cannot be fulfilled.\n *\n * @link https://promisesaplus.com/\n */\ninterface PromiseInterface\n{\n    const PENDING = 'pending';\n    const FULFILLED = 'fulfilled';\n    const REJECTED = 'rejected';\n\n    /**\n     * Appends fulfillment and rejection handlers to the promise, and returns\n     * a new promise resolving to the return value of the called handler.\n     *\n     * @param callable $onFulfilled Invoked when the promise fulfills.\n     * @param callable $onRejected  Invoked when the promise is rejected.\n     *\n     * @return PromiseInterface\n     */\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    );\n\n    /**\n     * Appends a rejection handler callback to the promise, and returns a new\n     * promise resolving to the return value of the callback if it is called,\n     * or to its original fulfillment value if the promise is instead\n     * fulfilled.\n     *\n     * @param callable $onRejected Invoked when the promise is rejected.\n     *\n     * @return PromiseInterface\n     */\n    public function otherwise(callable $onRejected);\n\n    /**\n     * Get the state of the promise (\"pending\", \"rejected\", or \"fulfilled\").\n     *\n     * The three states can be checked against the constants defined on\n     * PromiseInterface: PENDING, FULFILLED, and REJECTED.\n     *\n     * @return string\n     */\n    public function getState();\n\n    /**\n     * Resolve the promise with the given value.\n     *\n     * @param mixed $value\n     * @throws \\RuntimeException if the promise is already resolved.\n     */\n    public function resolve($value);\n\n    /**\n     * Reject the promise with the given reason.\n     *\n     * @param mixed $reason\n     * @throws \\RuntimeException if the promise is already resolved.\n     */\n    public function reject($reason);\n\n    /**\n     * Cancels the promise if possible.\n     *\n     * @link https://github.com/promises-aplus/cancellation-spec/issues/7\n     */\n    public function cancel();\n\n    /**\n     * Waits until the promise completes if possible.\n     *\n     * Pass $unwrap as true to unwrap the result of the promise, either\n     * returning the resolved value or throwing the rejected exception.\n     *\n     * If the promise cannot be waited on, then the promise will be rejected.\n     *\n     * @param bool $unwrap\n     *\n     * @return mixed\n     * @throws \\LogicException if the promise has no wait function or if the\n     *                         promise does not settle after waiting.\n     */\n    public function wait($unwrap = true);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/PromisorInterface.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Interface used with classes that return a promise.\n */\ninterface PromisorInterface\n{\n    /**\n     * Returns a promise.\n     *\n     * @return PromiseInterface\n     */\n    public function promise();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/RejectedPromise.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A promise that has been rejected.\n *\n * Thenning off of this promise will invoke the onRejected callback\n * immediately and ignore other callbacks.\n */\nclass RejectedPromise implements PromiseInterface\n{\n    private $reason;\n\n    public function __construct($reason)\n    {\n        if (method_exists($reason, 'then')) {\n            throw new \\InvalidArgumentException(\n                'You cannot create a RejectedPromise with a promise.');\n        }\n\n        $this->reason = $reason;\n    }\n\n    public function then(\n        callable $onFulfilled = null,\n        callable $onRejected = null\n    ) {\n        // If there's no onRejected callback then just return self.\n        if (!$onRejected) {\n            return $this;\n        }\n\n        $queue = queue();\n        $reason = $this->reason;\n        $p = new Promise([$queue, 'run']);\n        $queue->add(static function () use ($p, $reason, $onRejected) {\n            if ($p->getState() === self::PENDING) {\n                try {\n                    // Return a resolved promise if onRejected does not throw.\n                    $p->resolve($onRejected($reason));\n                } catch (\\Throwable $e) {\n                    // onRejected threw, so return a rejected promise.\n                    $p->reject($e);\n                } catch (\\Exception $e) {\n                    // onRejected threw, so return a rejected promise.\n                    $p->reject($e);\n                }\n            }\n        });\n\n        return $p;\n    }\n\n    public function otherwise(callable $onRejected)\n    {\n        return $this->then(null, $onRejected);\n    }\n\n    public function wait($unwrap = true, $defaultDelivery = null)\n    {\n        if ($unwrap) {\n            throw exception_for($this->reason);\n        }\n    }\n\n    public function getState()\n    {\n        return self::REJECTED;\n    }\n\n    public function resolve($value)\n    {\n        throw new \\LogicException(\"Cannot resolve a rejected promise\");\n    }\n\n    public function reject($reason)\n    {\n        if ($reason !== $this->reason) {\n            throw new \\LogicException(\"Cannot reject a rejected promise\");\n        }\n    }\n\n    public function cancel()\n    {\n        // pass\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/RejectionException.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A special exception that is thrown when waiting on a rejected promise.\n *\n * The reason value is available via the getReason() method.\n */\nclass RejectionException extends \\RuntimeException\n{\n    /** @var mixed Rejection reason. */\n    private $reason;\n\n    /**\n     * @param mixed $reason       Rejection reason.\n     * @param string $description Optional description\n     */\n    public function __construct($reason, $description = null)\n    {\n        $this->reason = $reason;\n\n        $message = 'The promise was rejected';\n\n        if ($description) {\n            $message .= ' with reason: ' . $description;\n        } elseif (is_string($reason)\n            || (is_object($reason) && method_exists($reason, '__toString'))\n        ) {\n            $message .= ' with reason: ' . $this->reason;\n        } elseif ($reason instanceof \\JsonSerializable) {\n            $message .= ' with reason: '\n                . json_encode($this->reason, JSON_PRETTY_PRINT);\n        }\n\n        parent::__construct($message);\n    }\n\n    /**\n     * Returns the rejection reason.\n     *\n     * @return mixed\n     */\n    public function getReason()\n    {\n        return $this->reason;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/TaskQueue.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * A task queue that executes tasks in a FIFO order.\n *\n * This task queue class is used to settle promises asynchronously and\n * maintains a constant stack size. You can use the task queue asynchronously\n * by calling the `run()` function of the global task queue in an event loop.\n *\n *     GuzzleHttp\\Promise\\queue()->run();\n */\nclass TaskQueue implements TaskQueueInterface\n{\n    private $enableShutdown = true;\n    private $queue = [];\n\n    public function __construct($withShutdown = true)\n    {\n        if ($withShutdown) {\n            register_shutdown_function(function () {\n                if ($this->enableShutdown) {\n                    // Only run the tasks if an E_ERROR didn't occur.\n                    $err = error_get_last();\n                    if (!$err || ($err['type'] ^ E_ERROR)) {\n                        $this->run();\n                    }\n                }\n            });\n        }\n    }\n\n    public function isEmpty()\n    {\n        return !$this->queue;\n    }\n\n    public function add(callable $task)\n    {\n        $this->queue[] = $task;\n    }\n\n    public function run()\n    {\n        /** @var callable $task */\n        while ($task = array_shift($this->queue)) {\n            $task();\n        }\n    }\n\n    /**\n     * The task queue will be run and exhausted by default when the process\n     * exits IFF the exit is not the result of a PHP E_ERROR error.\n     *\n     * You can disable running the automatic shutdown of the queue by calling\n     * this function. If you disable the task queue shutdown process, then you\n     * MUST either run the task queue (as a result of running your event loop\n     * or manually using the run() method) or wait on each outstanding promise.\n     *\n     * Note: This shutdown will occur before any destructors are triggered.\n     */\n    public function disableShutdown()\n    {\n        $this->enableShutdown = false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/TaskQueueInterface.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\ninterface TaskQueueInterface\n{\n    /**\n     * Returns true if the queue is empty.\n     *\n     * @return bool\n     */\n    public function isEmpty();\n\n    /**\n     * Adds a task to the queue that will be executed the next time run is\n     * called.\n     *\n     * @param callable $task\n     */\n    public function add(callable $task);\n\n    /**\n     * Execute all of the pending task in the queue.\n     */\n    public function run();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/functions.php",
    "content": "<?php\nnamespace GuzzleHttp\\Promise;\n\n/**\n * Get the global task queue used for promise resolution.\n *\n * This task queue MUST be run in an event loop in order for promises to be\n * settled asynchronously. It will be automatically run when synchronously\n * waiting on a promise.\n *\n * <code>\n * while ($eventLoop->isRunning()) {\n *     GuzzleHttp\\Promise\\queue()->run();\n * }\n * </code>\n *\n * @param TaskQueueInterface $assign Optionally specify a new queue instance.\n *\n * @return TaskQueueInterface\n */\nfunction queue(TaskQueueInterface $assign = null)\n{\n    static $queue;\n\n    if ($assign) {\n        $queue = $assign;\n    } elseif (!$queue) {\n        $queue = new TaskQueue();\n    }\n\n    return $queue;\n}\n\n/**\n * Adds a function to run in the task queue when it is next `run()` and returns\n * a promise that is fulfilled or rejected with the result.\n *\n * @param callable $task Task function to run.\n *\n * @return PromiseInterface\n */\nfunction task(callable $task)\n{\n    $queue = queue();\n    $promise = new Promise([$queue, 'run']);\n    $queue->add(function () use ($task, $promise) {\n        try {\n            $promise->resolve($task());\n        } catch (\\Throwable $e) {\n            $promise->reject($e);\n        } catch (\\Exception $e) {\n            $promise->reject($e);\n        }\n    });\n\n    return $promise;\n}\n\n/**\n * Creates a promise for a value if the value is not a promise.\n *\n * @param mixed $value Promise or value.\n *\n * @return PromiseInterface\n */\nfunction promise_for($value)\n{\n    if ($value instanceof PromiseInterface) {\n        return $value;\n    }\n\n    // Return a Guzzle promise that shadows the given promise.\n    if (method_exists($value, 'then')) {\n        $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null;\n        $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null;\n        $promise = new Promise($wfn, $cfn);\n        $value->then([$promise, 'resolve'], [$promise, 'reject']);\n        return $promise;\n    }\n\n    return new FulfilledPromise($value);\n}\n\n/**\n * Creates a rejected promise for a reason if the reason is not a promise. If\n * the provided reason is a promise, then it is returned as-is.\n *\n * @param mixed $reason Promise or reason.\n *\n * @return PromiseInterface\n */\nfunction rejection_for($reason)\n{\n    if ($reason instanceof PromiseInterface) {\n        return $reason;\n    }\n\n    return new RejectedPromise($reason);\n}\n\n/**\n * Create an exception for a rejected promise value.\n *\n * @param mixed $reason\n *\n * @return \\Exception|\\Throwable\n */\nfunction exception_for($reason)\n{\n    return $reason instanceof \\Exception || $reason instanceof \\Throwable\n        ? $reason\n        : new RejectionException($reason);\n}\n\n/**\n * Returns an iterator for the given value.\n *\n * @param mixed $value\n *\n * @return \\Iterator\n */\nfunction iter_for($value)\n{\n    if ($value instanceof \\Iterator) {\n        return $value;\n    } elseif (is_array($value)) {\n        return new \\ArrayIterator($value);\n    } else {\n        return new \\ArrayIterator([$value]);\n    }\n}\n\n/**\n * Synchronously waits on a promise to resolve and returns an inspection state\n * array.\n *\n * Returns a state associative array containing a \"state\" key mapping to a\n * valid promise state. If the state of the promise is \"fulfilled\", the array\n * will contain a \"value\" key mapping to the fulfilled value of the promise. If\n * the promise is rejected, the array will contain a \"reason\" key mapping to\n * the rejection reason of the promise.\n *\n * @param PromiseInterface $promise Promise or value.\n *\n * @return array\n */\nfunction inspect(PromiseInterface $promise)\n{\n    try {\n        return [\n            'state' => PromiseInterface::FULFILLED,\n            'value' => $promise->wait()\n        ];\n    } catch (RejectionException $e) {\n        return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()];\n    } catch (\\Throwable $e) {\n        return ['state' => PromiseInterface::REJECTED, 'reason' => $e];\n    } catch (\\Exception $e) {\n        return ['state' => PromiseInterface::REJECTED, 'reason' => $e];\n    }\n}\n\n/**\n * Waits on all of the provided promises, but does not unwrap rejected promises\n * as thrown exception.\n *\n * Returns an array of inspection state arrays.\n *\n * @param PromiseInterface[] $promises Traversable of promises to wait upon.\n *\n * @return array\n * @see GuzzleHttp\\Promise\\inspect for the inspection state array format.\n */\nfunction inspect_all($promises)\n{\n    $results = [];\n    foreach ($promises as $key => $promise) {\n        $results[$key] = inspect($promise);\n    }\n\n    return $results;\n}\n\n/**\n * Waits on all of the provided promises and returns the fulfilled values.\n *\n * Returns an array that contains the value of each promise (in the same order\n * the promises were provided). An exception is thrown if any of the promises\n * are rejected.\n *\n * @param mixed $promises Iterable of PromiseInterface objects to wait on.\n *\n * @return array\n * @throws \\Exception on error\n * @throws \\Throwable on error in PHP >=7\n */\nfunction unwrap($promises)\n{\n    $results = [];\n    foreach ($promises as $key => $promise) {\n        $results[$key] = $promise->wait();\n    }\n\n    return $results;\n}\n\n/**\n * Given an array of promises, return a promise that is fulfilled when all the\n * items in the array are fulfilled.\n *\n * The promise's fulfillment value is an array with fulfillment values at\n * respective positions to the original array. If any promise in the array\n * rejects, the returned promise is rejected with the rejection reason.\n *\n * @param mixed $promises Promises or values.\n *\n * @return PromiseInterface\n */\nfunction all($promises)\n{\n    $results = [];\n    return each(\n        $promises,\n        function ($value, $idx) use (&$results) {\n            $results[$idx] = $value;\n        },\n        function ($reason, $idx, Promise $aggregate) {\n            $aggregate->reject($reason);\n        }\n    )->then(function () use (&$results) {\n        ksort($results);\n        return $results;\n    });\n}\n\n/**\n * Initiate a competitive race between multiple promises or values (values will\n * become immediately fulfilled promises).\n *\n * When count amount of promises have been fulfilled, the returned promise is\n * fulfilled with an array that contains the fulfillment values of the winners\n * in order of resolution.\n *\n * This prommise is rejected with a {@see GuzzleHttp\\Promise\\AggregateException}\n * if the number of fulfilled promises is less than the desired $count.\n *\n * @param int   $count    Total number of promises.\n * @param mixed $promises Promises or values.\n *\n * @return PromiseInterface\n */\nfunction some($count, $promises)\n{\n    $results = [];\n    $rejections = [];\n\n    return each(\n        $promises,\n        function ($value, $idx, PromiseInterface $p) use (&$results, $count) {\n            if ($p->getState() !== PromiseInterface::PENDING) {\n                return;\n            }\n            $results[$idx] = $value;\n            if (count($results) >= $count) {\n                $p->resolve(null);\n            }\n        },\n        function ($reason) use (&$rejections) {\n            $rejections[] = $reason;\n        }\n    )->then(\n        function () use (&$results, &$rejections, $count) {\n            if (count($results) !== $count) {\n                throw new AggregateException(\n                    'Not enough promises to fulfill count',\n                    $rejections\n                );\n            }\n            ksort($results);\n            return array_values($results);\n        }\n    );\n}\n\n/**\n * Like some(), with 1 as count. However, if the promise fulfills, the\n * fulfillment value is not an array of 1 but the value directly.\n *\n * @param mixed $promises Promises or values.\n *\n * @return PromiseInterface\n */\nfunction any($promises)\n{\n    return some(1, $promises)->then(function ($values) { return $values[0]; });\n}\n\n/**\n * Returns a promise that is fulfilled when all of the provided promises have\n * been fulfilled or rejected.\n *\n * The returned promise is fulfilled with an array of inspection state arrays.\n *\n * @param mixed $promises Promises or values.\n *\n * @return PromiseInterface\n * @see GuzzleHttp\\Promise\\inspect for the inspection state array format.\n */\nfunction settle($promises)\n{\n    $results = [];\n\n    return each(\n        $promises,\n        function ($value, $idx) use (&$results) {\n            $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value];\n        },\n        function ($reason, $idx) use (&$results) {\n            $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason];\n        }\n    )->then(function () use (&$results) {\n        ksort($results);\n        return $results;\n    });\n}\n\n/**\n * Given an iterator that yields promises or values, returns a promise that is\n * fulfilled with a null value when the iterator has been consumed or the\n * aggregate promise has been fulfilled or rejected.\n *\n * $onFulfilled is a function that accepts the fulfilled value, iterator\n * index, and the aggregate promise. The callback can invoke any necessary side\n * effects and choose to resolve or reject the aggregate promise if needed.\n *\n * $onRejected is a function that accepts the rejection reason, iterator\n * index, and the aggregate promise. The callback can invoke any necessary side\n * effects and choose to resolve or reject the aggregate promise if needed.\n *\n * @param mixed    $iterable    Iterator or array to iterate over.\n * @param callable $onFulfilled\n * @param callable $onRejected\n *\n * @return PromiseInterface\n */\nfunction each(\n    $iterable,\n    callable $onFulfilled = null,\n    callable $onRejected = null\n) {\n    return (new EachPromise($iterable, [\n        'fulfilled' => $onFulfilled,\n        'rejected'  => $onRejected\n    ]))->promise();\n}\n\n/**\n * Like each, but only allows a certain number of outstanding promises at any\n * given time.\n *\n * $concurrency may be an integer or a function that accepts the number of\n * pending promises and returns a numeric concurrency limit value to allow for\n * dynamic a concurrency size.\n *\n * @param mixed        $iterable\n * @param int|callable $concurrency\n * @param callable     $onFulfilled\n * @param callable     $onRejected\n *\n * @return PromiseInterface\n */\nfunction each_limit(\n    $iterable,\n    $concurrency,\n    callable $onFulfilled = null,\n    callable $onRejected = null\n) {\n    return (new EachPromise($iterable, [\n        'fulfilled'   => $onFulfilled,\n        'rejected'    => $onRejected,\n        'concurrency' => $concurrency\n    ]))->promise();\n}\n\n/**\n * Like each_limit, but ensures that no promise in the given $iterable argument\n * is rejected. If any promise is rejected, then the aggregate promise is\n * rejected with the encountered rejection.\n *\n * @param mixed        $iterable\n * @param int|callable $concurrency\n * @param callable     $onFulfilled\n *\n * @return PromiseInterface\n */\nfunction each_limit_all(\n    $iterable,\n    $concurrency,\n    callable $onFulfilled = null\n) {\n    return each_limit(\n        $iterable,\n        $concurrency,\n        $onFulfilled,\n        function ($reason, $idx, PromiseInterface $aggregate) {\n            $aggregate->reject($reason);\n        }\n    );\n}\n\n/**\n * Returns true if a promise is fulfilled.\n *\n * @param PromiseInterface $promise\n *\n * @return bool\n */\nfunction is_fulfilled(PromiseInterface $promise)\n{\n    return $promise->getState() === PromiseInterface::FULFILLED;\n}\n\n/**\n * Returns true if a promise is rejected.\n *\n * @param PromiseInterface $promise\n *\n * @return bool\n */\nfunction is_rejected(PromiseInterface $promise)\n{\n    return $promise->getState() === PromiseInterface::REJECTED;\n}\n\n/**\n * Returns true if a promise is fulfilled or rejected.\n *\n * @param PromiseInterface $promise\n *\n * @return bool\n */\nfunction is_settled(PromiseInterface $promise)\n{\n    return $promise->getState() !== PromiseInterface::PENDING;\n}\n\n/**\n * @see Coroutine\n *\n * @param callable $generatorFn\n *\n * @return PromiseInterface\n */\nfunction coroutine(callable $generatorFn)\n{\n    return new Coroutine($generatorFn);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/functions_include.php",
    "content": "<?php\n\n// Don't redefine the functions if included multiple times.\nif (!function_exists('GuzzleHttp\\Promise\\promise_for')) {\n    require __DIR__ . '/functions.php';\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/CHANGELOG.md",
    "content": "# Change Log\n\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)\nand this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).\n\n\n## [Unreleased]\n\n\n## [1.6.0]\n\n### Added\n\n- Allowed version `^3.0` of `ralouphie/getallheaders` dependency (#244)\n- Added MIME type for WEBP image format (#246)\n- Added more validation of values according to PSR-7 and RFC standards, e.g. status code range (#250, #272)\n\n### Changed\n\n- Tests don't pass with HHVM 4.0, so HHVM support got dropped. Other libraries like composer have done the same. (#262)\n- Accept port number 0 to be valid (#270)\n\n### Fixed\n\n- Fixed subsequent reads from `php://input` in ServerRequest (#247)\n- Fixed readable/writable detection for certain stream modes (#248)\n- Fixed encoding of special characters in the `userInfo` component of an URI (#253)\n\n\n## [1.5.2] - 2018-12-04\n\n### Fixed\n\n- Check body size when getting the message summary\n\n\n## [1.5.1] - 2018-12-04\n\n### Fixed\n\n- Get the summary of a body only if it is readable\n\n\n## [1.5.0] - 2018-12-03\n\n### Added\n\n- Response first-line to response string exception (fixes #145)\n- A test for #129 behavior\n- `get_message_body_summary` function in order to get the message summary\n- `3gp` and `mkv` mime types\n\n### Changed\n\n- Clarify exception message when stream is detached\n\n### Deprecated\n\n- Deprecated parsing folded header lines as per RFC 7230\n\n### Fixed\n\n- Fix `AppendStream::detach` to not close streams\n- `InflateStream` preserves `isSeekable` attribute of the underlying stream\n- `ServerRequest::getUriFromGlobals` to support URLs in query parameters\n\n\nSeveral other fixes and improvements.\n\n\n## [1.4.2] - 2017-03-20\n\n### Fixed\n\n- Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing\n  calls to `trigger_error` when deprecated methods are invoked.\n\n\n## [1.4.1] - 2017-02-27\n\n### Added\n\n- Rriggering of silenced deprecation warnings.\n\n### Fixed\n\n- Reverted BC break by reintroducing behavior to automagically fix a URI with a\n  relative path and an authority by adding a leading slash to the path. It's only\n  deprecated now.\n\n\n## [1.4.0] - 2017-02-21\n\n### Added\n\n- Added common URI utility methods based on RFC 3986 (see documentation in the readme):\n  - `Uri::isDefaultPort`\n  - `Uri::isAbsolute`\n  - `Uri::isNetworkPathReference`\n  - `Uri::isAbsolutePathReference`\n  - `Uri::isRelativePathReference`\n  - `Uri::isSameDocumentReference`\n  - `Uri::composeComponents`\n  - `UriNormalizer::normalize`\n  - `UriNormalizer::isEquivalent`\n  - `UriResolver::relativize`\n\n### Changed\n\n- Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form.\n- Allow `parse_response` to parse a response without delimiting space and reason.\n- Ensure each URI modification results in a valid URI according to PSR-7 discussions.\n  Invalid modifications will throw an exception instead of returning a wrong URI or\n  doing some magic.\n  - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception\n    because the path of a URI with an authority must start with a slash \"/\" or be empty\n  - `(new Uri())->withScheme('http')` will return `'http://localhost'`\n\n### Deprecated\n\n- `Uri::resolve` in favor of `UriResolver::resolve`\n- `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments`\n\n### Fixed\n\n- `Stream::read` when length parameter <= 0.\n- `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory.\n- `ServerRequest::getUriFromGlobals` when `Host` header contains port.\n- Compatibility of URIs with `file` scheme and empty host.\n\n\n## [1.3.1] - 2016-06-25\n\n### Fixed\n\n- `Uri::__toString` for network path references, e.g. `//example.org`.\n- Missing lowercase normalization for host.\n- Handling of URI components in case they are `'0'` in a lot of places,\n  e.g. as a user info password.\n- `Uri::withAddedHeader` to correctly merge headers with different case.\n- Trimming of header values in `Uri::withAddedHeader`. Header values may\n  be surrounded by whitespace which should be ignored according to RFC 7230\n  Section 3.2.4. This does not apply to header names.\n- `Uri::withAddedHeader` with an array of header values.\n- `Uri::resolve` when base path has no slash and handling of fragment.\n- Handling of encoding in `Uri::with(out)QueryValue` so one can pass the\n  key/value both in encoded as well as decoded form to those methods. This is\n  consistent with withPath, withQuery etc.\n- `ServerRequest::withoutAttribute` when attribute value is null.\n\n\n## [1.3.0] - 2016-04-13\n\n### Added\n\n- Remaining interfaces needed for full PSR7 compatibility\n  (ServerRequestInterface, UploadedFileInterface, etc.).\n- Support for stream_for from scalars.\n\n### Changed\n\n- Can now extend Uri.\n\n### Fixed\n- A bug in validating request methods by making it more permissive.\n\n\n## [1.2.3] - 2016-02-18\n\n### Fixed\n\n- Support in `GuzzleHttp\\Psr7\\CachingStream` for seeking forward on remote\n  streams, which can sometimes return fewer bytes than requested with `fread`.\n- Handling of gzipped responses with FNAME headers.\n\n\n## [1.2.2] - 2016-01-22\n\n### Added\n\n- Support for URIs without any authority.\n- Support for HTTP 451 'Unavailable For Legal Reasons.'\n- Support for using '0' as a filename.\n- Support for including non-standard ports in Host headers.\n\n\n## [1.2.1] - 2015-11-02\n\n### Changes\n\n- Now supporting negative offsets when seeking to SEEK_END.\n\n\n## [1.2.0] - 2015-08-15\n\n### Changed\n\n- Body as `\"0\"` is now properly added to a response.\n- Now allowing forward seeking in CachingStream.\n- Now properly parsing HTTP requests that contain proxy targets in\n  `parse_request`.\n- functions.php is now conditionally required.\n- user-info is no longer dropped when resolving URIs.\n\n\n## [1.1.0] - 2015-06-24\n\n### Changed\n\n- URIs can now be relative.\n- `multipart/form-data` headers are now overridden case-insensitively.\n- URI paths no longer encode the following characters because they are allowed\n  in URIs: \"(\", \")\", \"*\", \"!\", \"'\"\n- A port is no longer added to a URI when the scheme is missing and no port is\n  present.\n\n\n## 1.0.0 - 2015-05-19\n\nInitial release.\n\nCurrently unsupported:\n\n- `Psr\\Http\\Message\\ServerRequestInterface`\n- `Psr\\Http\\Message\\UploadedFileInterface`\n\n\n\n[Unreleased]: https://github.com/guzzle/psr7/compare/1.6.0...HEAD\n[1.6.0]: https://github.com/guzzle/psr7/compare/1.5.2...1.6.0\n[1.5.2]: https://github.com/guzzle/psr7/compare/1.5.1...1.5.2\n[1.5.1]: https://github.com/guzzle/psr7/compare/1.5.0...1.5.1\n[1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0\n[1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2\n[1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1\n[1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0\n[1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1\n[1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0\n[1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3\n[1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2\n[1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1\n[1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0\n[1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/LICENSE",
    "content": "Copyright (c) 2015 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/README.md",
    "content": "# PSR-7 Message Implementation\n\nThis repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/)\nmessage implementation, several stream decorators, and some helpful\nfunctionality like query string parsing.\n\n\n[![Build Status](https://travis-ci.org/guzzle/psr7.svg?branch=master)](https://travis-ci.org/guzzle/psr7)\n\n\n# Stream implementation\n\nThis package comes with a number of stream implementations and stream\ndecorators.\n\n\n## AppendStream\n\n`GuzzleHttp\\Psr7\\AppendStream`\n\nReads from multiple streams, one after the other.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$a = Psr7\\stream_for('abc, ');\n$b = Psr7\\stream_for('123.');\n$composed = new Psr7\\AppendStream([$a, $b]);\n\n$composed->addStream(Psr7\\stream_for(' Above all listen to me'));\n\necho $composed; // abc, 123. Above all listen to me.\n```\n\n\n## BufferStream\n\n`GuzzleHttp\\Psr7\\BufferStream`\n\nProvides a buffer stream that can be written to fill a buffer, and read\nfrom to remove bytes from the buffer.\n\nThis stream returns a \"hwm\" metadata value that tells upstream consumers\nwhat the configured high water mark of the stream is, or the maximum\npreferred size of the buffer.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n// When more than 1024 bytes are in the buffer, it will begin returning\n// false to writes. This is an indication that writers should slow down.\n$buffer = new Psr7\\BufferStream(1024);\n```\n\n\n## CachingStream\n\nThe CachingStream is used to allow seeking over previously read bytes on\nnon-seekable streams. This can be useful when transferring a non-seekable\nentity body fails due to needing to rewind the stream (for example, resulting\nfrom a redirect). Data that is read from the remote stream will be buffered in\na PHP temp stream so that previously read bytes are cached first in memory,\nthen on disk.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\stream_for(fopen('http://www.google.com', 'r'));\n$stream = new Psr7\\CachingStream($original);\n\n$stream->read(1024);\necho $stream->tell();\n// 1024\n\n$stream->seek(0);\necho $stream->tell();\n// 0\n```\n\n\n## DroppingStream\n\n`GuzzleHttp\\Psr7\\DroppingStream`\n\nStream decorator that begins dropping data once the size of the underlying\nstream becomes too full.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n// Create an empty stream\n$stream = Psr7\\stream_for();\n\n// Start dropping data when the stream has more than 10 bytes\n$dropping = new Psr7\\DroppingStream($stream, 10);\n\n$dropping->write('01234567890123456789');\necho $stream; // 0123456789\n```\n\n\n## FnStream\n\n`GuzzleHttp\\Psr7\\FnStream`\n\nCompose stream implementations based on a hash of functions.\n\nAllows for easy testing and extension of a provided stream without needing\nto create a concrete class for a simple extension point.\n\n```php\n\nuse GuzzleHttp\\Psr7;\n\n$stream = Psr7\\stream_for('hi');\n$fnStream = Psr7\\FnStream::decorate($stream, [\n    'rewind' => function () use ($stream) {\n        echo 'About to rewind - ';\n        $stream->rewind();\n        echo 'rewound!';\n    }\n]);\n\n$fnStream->rewind();\n// Outputs: About to rewind - rewound!\n```\n\n\n## InflateStream\n\n`GuzzleHttp\\Psr7\\InflateStream`\n\nUses PHP's zlib.inflate filter to inflate deflate or gzipped content.\n\nThis stream decorator skips the first 10 bytes of the given stream to remove\nthe gzip header, converts the provided stream to a PHP stream resource,\nthen appends the zlib.inflate filter. The stream is then converted back\nto a Guzzle stream resource to be used as a Guzzle stream.\n\n\n## LazyOpenStream\n\n`GuzzleHttp\\Psr7\\LazyOpenStream`\n\nLazily reads or writes to a file that is opened only after an IO operation\ntake place on the stream.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$stream = new Psr7\\LazyOpenStream('/path/to/file', 'r');\n// The file has not yet been opened...\n\necho $stream->read(10);\n// The file is opened and read from only when needed.\n```\n\n\n## LimitStream\n\n`GuzzleHttp\\Psr7\\LimitStream`\n\nLimitStream can be used to read a subset or slice of an existing stream object.\nThis can be useful for breaking a large file into smaller pieces to be sent in\nchunks (e.g. Amazon S3's multipart upload API).\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\stream_for(fopen('/tmp/test.txt', 'r+'));\necho $original->getSize();\n// >>> 1048576\n\n// Limit the size of the body to 1024 bytes and start reading from byte 2048\n$stream = new Psr7\\LimitStream($original, 1024, 2048);\necho $stream->getSize();\n// >>> 1024\necho $stream->tell();\n// >>> 0\n```\n\n\n## MultipartStream\n\n`GuzzleHttp\\Psr7\\MultipartStream`\n\nStream that when read returns bytes for a streaming multipart or\nmultipart/form-data stream.\n\n\n## NoSeekStream\n\n`GuzzleHttp\\Psr7\\NoSeekStream`\n\nNoSeekStream wraps a stream and does not allow seeking.\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\stream_for('foo');\n$noSeek = new Psr7\\NoSeekStream($original);\n\necho $noSeek->read(3);\n// foo\nvar_export($noSeek->isSeekable());\n// false\n$noSeek->seek(0);\nvar_export($noSeek->read(3));\n// NULL\n```\n\n\n## PumpStream\n\n`GuzzleHttp\\Psr7\\PumpStream`\n\nProvides a read only stream that pumps data from a PHP callable.\n\nWhen invoking the provided callable, the PumpStream will pass the amount of\ndata requested to read to the callable. The callable can choose to ignore\nthis value and return fewer or more bytes than requested. Any extra data\nreturned by the provided callable is buffered internally until drained using\nthe read() function of the PumpStream. The provided callable MUST return\nfalse when there is no more data to read.\n\n\n## Implementing stream decorators\n\nCreating a stream decorator is very easy thanks to the\n`GuzzleHttp\\Psr7\\StreamDecoratorTrait`. This trait provides methods that\nimplement `Psr\\Http\\Message\\StreamInterface` by proxying to an underlying\nstream. Just `use` the `StreamDecoratorTrait` and implement your custom\nmethods.\n\nFor example, let's say we wanted to call a specific function each time the last\nbyte is read from a stream. This could be implemented by overriding the\n`read()` method.\n\n```php\nuse Psr\\Http\\Message\\StreamInterface;\nuse GuzzleHttp\\Psr7\\StreamDecoratorTrait;\n\nclass EofCallbackStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    private $callback;\n\n    public function __construct(StreamInterface $stream, callable $cb)\n    {\n        $this->stream = $stream;\n        $this->callback = $cb;\n    }\n\n    public function read($length)\n    {\n        $result = $this->stream->read($length);\n\n        // Invoke the callback when EOF is hit.\n        if ($this->eof()) {\n            call_user_func($this->callback);\n        }\n\n        return $result;\n    }\n}\n```\n\nThis decorator could be added to any existing stream and used like so:\n\n```php\nuse GuzzleHttp\\Psr7;\n\n$original = Psr7\\stream_for('foo');\n\n$eofStream = new EofCallbackStream($original, function () {\n    echo 'EOF!';\n});\n\n$eofStream->read(2);\n$eofStream->read(1);\n// echoes \"EOF!\"\n$eofStream->seek(0);\n$eofStream->read(3);\n// echoes \"EOF!\"\n```\n\n\n## PHP StreamWrapper\n\nYou can use the `GuzzleHttp\\Psr7\\StreamWrapper` class if you need to use a\nPSR-7 stream as a PHP stream resource.\n\nUse the `GuzzleHttp\\Psr7\\StreamWrapper::getResource()` method to create a PHP\nstream from a PSR-7 stream.\n\n```php\nuse GuzzleHttp\\Psr7\\StreamWrapper;\n\n$stream = GuzzleHttp\\Psr7\\stream_for('hello!');\n$resource = StreamWrapper::getResource($stream);\necho fread($resource, 6); // outputs hello!\n```\n\n\n# Function API\n\nThere are various functions available under the `GuzzleHttp\\Psr7` namespace.\n\n\n## `function str`\n\n`function str(MessageInterface $message)`\n\nReturns the string representation of an HTTP message.\n\n```php\n$request = new GuzzleHttp\\Psr7\\Request('GET', 'http://example.com');\necho GuzzleHttp\\Psr7\\str($request);\n```\n\n\n## `function uri_for`\n\n`function uri_for($uri)`\n\nThis function accepts a string or `Psr\\Http\\Message\\UriInterface` and returns a\nUriInterface for the given value. If the value is already a `UriInterface`, it\nis returned as-is.\n\n```php\n$uri = GuzzleHttp\\Psr7\\uri_for('http://example.com');\nassert($uri === GuzzleHttp\\Psr7\\uri_for($uri));\n```\n\n\n## `function stream_for`\n\n`function stream_for($resource = '', array $options = [])`\n\nCreate a new stream based on the input type.\n\nOptions is an associative array that can contain the following keys:\n\n* - metadata: Array of custom metadata.\n* - size: Size of the stream.\n\nThis method accepts the following `$resource` types:\n\n- `Psr\\Http\\Message\\StreamInterface`: Returns the value as-is.\n- `string`: Creates a stream object that uses the given string as the contents.\n- `resource`: Creates a stream object that wraps the given PHP stream resource.\n- `Iterator`: If the provided value implements `Iterator`, then a read-only\n  stream object will be created that wraps the given iterable. Each time the\n  stream is read from, data from the iterator will fill a buffer and will be\n  continuously called until the buffer is equal to the requested read size.\n  Subsequent read calls will first read from the buffer and then call `next`\n  on the underlying iterator until it is exhausted.\n- `object` with `__toString()`: If the object has the `__toString()` method,\n  the object will be cast to a string and then a stream will be returned that\n  uses the string value.\n- `NULL`: When `null` is passed, an empty stream object is returned.\n- `callable` When a callable is passed, a read-only stream object will be\n  created that invokes the given callable. The callable is invoked with the\n  number of suggested bytes to read. The callable can return any number of\n  bytes, but MUST return `false` when there is no more data to return. The\n  stream object that wraps the callable will invoke the callable until the\n  number of requested bytes are available. Any additional bytes will be\n  buffered and used in subsequent reads.\n\n```php\n$stream = GuzzleHttp\\Psr7\\stream_for('foo');\n$stream = GuzzleHttp\\Psr7\\stream_for(fopen('/path/to/file', 'r'));\n\n$generator = function ($bytes) {\n    for ($i = 0; $i < $bytes; $i++) {\n        yield ' ';\n    }\n}\n\n$stream = GuzzleHttp\\Psr7\\stream_for($generator(100));\n```\n\n\n## `function parse_header`\n\n`function parse_header($header)`\n\nParse an array of header values containing \";\" separated data into an array of\nassociative arrays representing the header key value pair data of the header.\nWhen a parameter does not contain a value, but just contains a key, this\nfunction will inject a key with a '' string value.\n\n\n## `function normalize_header`\n\n`function normalize_header($header)`\n\nConverts an array of header values that may contain comma separated headers\ninto an array of headers with no comma separated values.\n\n\n## `function modify_request`\n\n`function modify_request(RequestInterface $request, array $changes)`\n\nClone and modify a request with the given changes. This method is useful for\nreducing the number of clones needed to mutate a message.\n\nThe changes can be one of:\n\n- method: (string) Changes the HTTP method.\n- set_headers: (array) Sets the given headers.\n- remove_headers: (array) Remove the given headers.\n- body: (mixed) Sets the given body.\n- uri: (UriInterface) Set the URI.\n- query: (string) Set the query string value of the URI.\n- version: (string) Set the protocol version.\n\n\n## `function rewind_body`\n\n`function rewind_body(MessageInterface $message)`\n\nAttempts to rewind a message body and throws an exception on failure. The body\nof the message will only be rewound if a call to `tell()` returns a value other\nthan `0`.\n\n\n## `function try_fopen`\n\n`function try_fopen($filename, $mode)`\n\nSafely opens a PHP stream resource using a filename.\n\nWhen fopen fails, PHP normally raises a warning. This function adds an error\nhandler that checks for errors and throws an exception instead.\n\n\n## `function copy_to_string`\n\n`function copy_to_string(StreamInterface $stream, $maxLen = -1)`\n\nCopy the contents of a stream into a string until the given number of bytes\nhave been read.\n\n\n## `function copy_to_stream`\n\n`function copy_to_stream(StreamInterface $source, StreamInterface $dest, $maxLen = -1)`\n\nCopy the contents of a stream into another stream until the given number of\nbytes have been read.\n\n\n## `function hash`\n\n`function hash(StreamInterface $stream, $algo, $rawOutput = false)`\n\nCalculate a hash of a Stream. This method reads the entire stream to calculate\na rolling hash (based on PHP's hash_init functions).\n\n\n## `function readline`\n\n`function readline(StreamInterface $stream, $maxLength = null)`\n\nRead a line from the stream up to the maximum allowed buffer length.\n\n\n## `function parse_request`\n\n`function parse_request($message)`\n\nParses a request message string into a request object.\n\n\n## `function parse_response`\n\n`function parse_response($message)`\n\nParses a response message string into a response object.\n\n\n## `function parse_query`\n\n`function parse_query($str, $urlEncoding = true)`\n\nParse a query string into an associative array.\n\nIf multiple values are found for the same key, the value of that key value pair\nwill become an array. This function does not parse nested PHP style arrays into\nan associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed into\n`['foo[a]' => '1', 'foo[b]' => '2']`).\n\n\n## `function build_query`\n\n`function build_query(array $params, $encoding = PHP_QUERY_RFC3986)`\n\nBuild a query string from an array of key value pairs.\n\nThis function can use the return value of parse_query() to build a query string.\nThis function does not modify the provided keys when an array is encountered\n(like http_build_query would).\n\n\n## `function mimetype_from_filename`\n\n`function mimetype_from_filename($filename)`\n\nDetermines the mimetype of a file by looking at its extension.\n\n\n## `function mimetype_from_extension`\n\n`function mimetype_from_extension($extension)`\n\nMaps a file extensions to a mimetype.\n\n\n# Additional URI Methods\n\nAside from the standard `Psr\\Http\\Message\\UriInterface` implementation in form of the `GuzzleHttp\\Psr7\\Uri` class,\nthis library also provides additional functionality when working with URIs as static methods.\n\n## URI Types\n\nAn instance of `Psr\\Http\\Message\\UriInterface` can either be an absolute URI or a relative reference.\nAn absolute URI has a scheme. A relative reference is used to express a URI relative to another URI,\nthe base URI. Relative references can be divided into several forms according to\n[RFC 3986 Section 4.2](https://tools.ietf.org/html/rfc3986#section-4.2):\n\n- network-path references, e.g. `//example.com/path`\n- absolute-path references, e.g. `/path`\n- relative-path references, e.g. `subpath`\n\nThe following methods can be used to identify the type of the URI.\n\n### `GuzzleHttp\\Psr7\\Uri::isAbsolute`\n\n`public static function isAbsolute(UriInterface $uri): bool`\n\nWhether the URI is absolute, i.e. it has a scheme.\n\n### `GuzzleHttp\\Psr7\\Uri::isNetworkPathReference`\n\n`public static function isNetworkPathReference(UriInterface $uri): bool`\n\nWhether the URI is a network-path reference. A relative reference that begins with two slash characters is\ntermed an network-path reference.\n\n### `GuzzleHttp\\Psr7\\Uri::isAbsolutePathReference`\n\n`public static function isAbsolutePathReference(UriInterface $uri): bool`\n\nWhether the URI is a absolute-path reference. A relative reference that begins with a single slash character is\ntermed an absolute-path reference.\n\n### `GuzzleHttp\\Psr7\\Uri::isRelativePathReference`\n\n`public static function isRelativePathReference(UriInterface $uri): bool`\n\nWhether the URI is a relative-path reference. A relative reference that does not begin with a slash character is\ntermed a relative-path reference.\n\n### `GuzzleHttp\\Psr7\\Uri::isSameDocumentReference`\n\n`public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool`\n\nWhether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its\nfragment component, identical to the base URI. When no base URI is given, only an empty URI reference\n(apart from its fragment) is considered a same-document reference.\n\n## URI Components\n\nAdditional methods to work with URI components.\n\n### `GuzzleHttp\\Psr7\\Uri::isDefaultPort`\n\n`public static function isDefaultPort(UriInterface $uri): bool`\n\nWhether the URI has the default port of the current scheme. `Psr\\Http\\Message\\UriInterface::getPort` may return null\nor the standard port. This method can be used independently of the implementation.\n\n### `GuzzleHttp\\Psr7\\Uri::composeComponents`\n\n`public static function composeComponents($scheme, $authority, $path, $query, $fragment): string`\n\nComposes a URI reference string from its various components according to\n[RFC 3986 Section 5.3](https://tools.ietf.org/html/rfc3986#section-5.3). Usually this method does not need to be called\nmanually but instead is used indirectly via `Psr\\Http\\Message\\UriInterface::__toString`.\n\n### `GuzzleHttp\\Psr7\\Uri::fromParts`\n\n`public static function fromParts(array $parts): UriInterface`\n\nCreates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components.\n\n\n### `GuzzleHttp\\Psr7\\Uri::withQueryValue`\n\n`public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface`\n\nCreates a new URI with a specific query string value. Any existing query string values that exactly match the\nprovided key are removed and replaced with the given key value pair. A value of null will set the query string\nkey without a value, e.g. \"key\" instead of \"key=value\".\n\n### `GuzzleHttp\\Psr7\\Uri::withQueryValues`\n\n`public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface`\n\nCreates a new URI with multiple query string values. It has the same behavior as `withQueryValue()` but for an\nassociative array of key => value.\n\n### `GuzzleHttp\\Psr7\\Uri::withoutQueryValue`\n\n`public static function withoutQueryValue(UriInterface $uri, $key): UriInterface`\n\nCreates a new URI with a specific query string value removed. Any existing query string values that exactly match the\nprovided key are removed.\n\n## Reference Resolution\n\n`GuzzleHttp\\Psr7\\UriResolver` provides methods to resolve a URI reference in the context of a base URI according\nto [RFC 3986 Section 5](https://tools.ietf.org/html/rfc3986#section-5). This is for example also what web browsers\ndo when resolving a link in a website based on the current request URI.\n\n### `GuzzleHttp\\Psr7\\UriResolver::resolve`\n\n`public static function resolve(UriInterface $base, UriInterface $rel): UriInterface`\n\nConverts the relative URI into a new URI that is resolved against the base URI.\n\n### `GuzzleHttp\\Psr7\\UriResolver::removeDotSegments`\n\n`public static function removeDotSegments(string $path): string`\n\nRemoves dot segments from a path and returns the new path according to\n[RFC 3986 Section 5.2.4](https://tools.ietf.org/html/rfc3986#section-5.2.4).\n\n### `GuzzleHttp\\Psr7\\UriResolver::relativize`\n\n`public static function relativize(UriInterface $base, UriInterface $target): UriInterface`\n\nReturns the target URI as a relative reference from the base URI. This method is the counterpart to resolve():\n\n```php\n(string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))\n```\n\nOne use-case is to use the current request URI as base URI and then generate relative links in your documents\nto reduce the document size or offer self-contained downloadable document archives.\n\n```php\n$base = new Uri('http://example.com/a/b/');\necho UriResolver::relativize($base, new Uri('http://example.com/a/b/c'));  // prints 'c'.\necho UriResolver::relativize($base, new Uri('http://example.com/a/x/y'));  // prints '../x/y'.\necho UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.\necho UriResolver::relativize($base, new Uri('http://example.org/a/b/'));   // prints '//example.org/a/b/'.\n```\n\n## Normalization and Comparison\n\n`GuzzleHttp\\Psr7\\UriNormalizer` provides methods to normalize and compare URIs according to\n[RFC 3986 Section 6](https://tools.ietf.org/html/rfc3986#section-6).\n\n### `GuzzleHttp\\Psr7\\UriNormalizer::normalize`\n\n`public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface`\n\nReturns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.\nThis methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask\nof normalizations to apply. The following normalizations are available:\n\n- `UriNormalizer::PRESERVING_NORMALIZATIONS`\n\n    Default normalizations which only include the ones that preserve semantics.\n\n- `UriNormalizer::CAPITALIZE_PERCENT_ENCODING`\n\n    All letters within a percent-encoding triplet (e.g., \"%3A\") are case-insensitive, and should be capitalized.\n\n    Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b`\n\n- `UriNormalizer::DECODE_UNRESERVED_CHARACTERS`\n\n    Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of\n    ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should\n    not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved\n    characters by URI normalizers.\n\n    Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/`\n\n- `UriNormalizer::CONVERT_EMPTY_PATH`\n\n    Converts the empty path to \"/\" for http and https URIs.\n\n    Example: `http://example.org` → `http://example.org/`\n\n- `UriNormalizer::REMOVE_DEFAULT_HOST`\n\n    Removes the default host of the given URI scheme from the URI. Only the \"file\" scheme defines the default host\n    \"localhost\". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to\n    RFC 3986.\n\n    Example: `file://localhost/myfile` → `file:///myfile`\n\n- `UriNormalizer::REMOVE_DEFAULT_PORT`\n\n    Removes the default port of the given URI scheme from the URI.\n\n    Example: `http://example.org:80/` → `http://example.org/`\n\n- `UriNormalizer::REMOVE_DOT_SEGMENTS`\n\n    Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would\n    change the semantics of the URI reference.\n\n    Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html`\n\n- `UriNormalizer::REMOVE_DUPLICATE_SLASHES`\n\n    Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes\n    and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization\n    may change the semantics. Encoded slashes (%2F) are not removed.\n\n    Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html`\n\n- `UriNormalizer::SORT_QUERY_PARAMETERS`\n\n    Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be\n    significant (this is not defined by the standard). So this normalization is not safe and may change the semantics\n    of the URI.\n\n    Example: `?lang=en&article=fred` → `?article=fred&lang=en`\n\n### `GuzzleHttp\\Psr7\\UriNormalizer::isEquivalent`\n\n`public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool`\n\nWhether two URIs can be considered equivalent. Both URIs are normalized automatically before comparison with the given\n`$normalizations` bitmask. The method also accepts relative URI references and returns true when they are equivalent.\nThis of course assumes they will be resolved against the same base URI. If this is not the case, determination of\nequivalence or difference of relative references does not mean anything.\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/composer.json",
    "content": "{\n    \"name\": \"guzzlehttp/psr7\",\n    \"type\": \"library\",\n    \"description\": \"PSR-7 message implementation that also provides common utility methods\",\n    \"keywords\": [\"request\", \"response\", \"message\", \"stream\", \"http\", \"uri\", \"url\", \"psr-7\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Michael Dowling\",\n            \"email\": \"mtdowling@gmail.com\",\n            \"homepage\": \"https://github.com/mtdowling\"\n        },\n        {\n            \"name\": \"Tobias Schultze\",\n            \"homepage\": \"https://github.com/Tobion\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.4.0\",\n        \"psr/http-message\": \"~1.0\",\n        \"ralouphie/getallheaders\": \"^2.0.5 || ^3.0.0\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"~4.8.36 || ^5.7.27 || ^6.5.8\",\n        \"ext-zlib\": \"*\"\n    },\n    \"provide\": {\n        \"psr/http-message-implementation\": \"1.0\"\n    },\n    \"suggest\": {\n        \"zendframework/zend-httphandlerrunner\": \"Emit PSR-7 responses\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Psr7\\\\\": \"src/\"\n        },\n        \"files\": [\"src/functions_include.php\"]\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"GuzzleHttp\\\\Tests\\\\Psr7\\\\\": \"tests/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.6-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/AppendStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Reads from multiple streams, one after the other.\n *\n * This is a read-only stream decorator.\n */\nclass AppendStream implements StreamInterface\n{\n    /** @var StreamInterface[] Streams being decorated */\n    private $streams = [];\n\n    private $seekable = true;\n    private $current = 0;\n    private $pos = 0;\n\n    /**\n     * @param StreamInterface[] $streams Streams to decorate. Each stream must\n     *                                   be readable.\n     */\n    public function __construct(array $streams = [])\n    {\n        foreach ($streams as $stream) {\n            $this->addStream($stream);\n        }\n    }\n\n    public function __toString()\n    {\n        try {\n            $this->rewind();\n            return $this->getContents();\n        } catch (\\Exception $e) {\n            return '';\n        }\n    }\n\n    /**\n     * Add a stream to the AppendStream\n     *\n     * @param StreamInterface $stream Stream to append. Must be readable.\n     *\n     * @throws \\InvalidArgumentException if the stream is not readable\n     */\n    public function addStream(StreamInterface $stream)\n    {\n        if (!$stream->isReadable()) {\n            throw new \\InvalidArgumentException('Each stream must be readable');\n        }\n\n        // The stream is only seekable if all streams are seekable\n        if (!$stream->isSeekable()) {\n            $this->seekable = false;\n        }\n\n        $this->streams[] = $stream;\n    }\n\n    public function getContents()\n    {\n        return copy_to_string($this);\n    }\n\n    /**\n     * Closes each attached stream.\n     *\n     * {@inheritdoc}\n     */\n    public function close()\n    {\n        $this->pos = $this->current = 0;\n        $this->seekable = true;\n\n        foreach ($this->streams as $stream) {\n            $stream->close();\n        }\n\n        $this->streams = [];\n    }\n\n    /**\n     * Detaches each attached stream.\n     *\n     * Returns null as it's not clear which underlying stream resource to return.\n     *\n     * {@inheritdoc}\n     */\n    public function detach()\n    {\n        $this->pos = $this->current = 0;\n        $this->seekable = true;\n\n        foreach ($this->streams as $stream) {\n            $stream->detach();\n        }\n\n        $this->streams = [];\n    }\n\n    public function tell()\n    {\n        return $this->pos;\n    }\n\n    /**\n     * Tries to calculate the size by adding the size of each stream.\n     *\n     * If any of the streams do not return a valid number, then the size of the\n     * append stream cannot be determined and null is returned.\n     *\n     * {@inheritdoc}\n     */\n    public function getSize()\n    {\n        $size = 0;\n\n        foreach ($this->streams as $stream) {\n            $s = $stream->getSize();\n            if ($s === null) {\n                return null;\n            }\n            $size += $s;\n        }\n\n        return $size;\n    }\n\n    public function eof()\n    {\n        return !$this->streams ||\n            ($this->current >= count($this->streams) - 1 &&\n             $this->streams[$this->current]->eof());\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    /**\n     * Attempts to seek to the given position. Only supports SEEK_SET.\n     *\n     * {@inheritdoc}\n     */\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        if (!$this->seekable) {\n            throw new \\RuntimeException('This AppendStream is not seekable');\n        } elseif ($whence !== SEEK_SET) {\n            throw new \\RuntimeException('The AppendStream can only seek with SEEK_SET');\n        }\n\n        $this->pos = $this->current = 0;\n\n        // Rewind each stream\n        foreach ($this->streams as $i => $stream) {\n            try {\n                $stream->rewind();\n            } catch (\\Exception $e) {\n                throw new \\RuntimeException('Unable to seek stream '\n                    . $i . ' of the AppendStream', 0, $e);\n            }\n        }\n\n        // Seek to the actual position by reading from each stream\n        while ($this->pos < $offset && !$this->eof()) {\n            $result = $this->read(min(8096, $offset - $this->pos));\n            if ($result === '') {\n                break;\n            }\n        }\n    }\n\n    /**\n     * Reads from all of the appended streams until the length is met or EOF.\n     *\n     * {@inheritdoc}\n     */\n    public function read($length)\n    {\n        $buffer = '';\n        $total = count($this->streams) - 1;\n        $remaining = $length;\n        $progressToNext = false;\n\n        while ($remaining > 0) {\n\n            // Progress to the next stream if needed.\n            if ($progressToNext || $this->streams[$this->current]->eof()) {\n                $progressToNext = false;\n                if ($this->current === $total) {\n                    break;\n                }\n                $this->current++;\n            }\n\n            $result = $this->streams[$this->current]->read($remaining);\n\n            // Using a loose comparison here to match on '', false, and null\n            if ($result == null) {\n                $progressToNext = true;\n                continue;\n            }\n\n            $buffer .= $result;\n            $remaining = $length - strlen($buffer);\n        }\n\n        $this->pos += strlen($buffer);\n\n        return $buffer;\n    }\n\n    public function isReadable()\n    {\n        return true;\n    }\n\n    public function isWritable()\n    {\n        return false;\n    }\n\n    public function isSeekable()\n    {\n        return $this->seekable;\n    }\n\n    public function write($string)\n    {\n        throw new \\RuntimeException('Cannot write to an AppendStream');\n    }\n\n    public function getMetadata($key = null)\n    {\n        return $key ? null : [];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/BufferStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Provides a buffer stream that can be written to to fill a buffer, and read\n * from to remove bytes from the buffer.\n *\n * This stream returns a \"hwm\" metadata value that tells upstream consumers\n * what the configured high water mark of the stream is, or the maximum\n * preferred size of the buffer.\n */\nclass BufferStream implements StreamInterface\n{\n    private $hwm;\n    private $buffer = '';\n\n    /**\n     * @param int $hwm High water mark, representing the preferred maximum\n     *                 buffer size. If the size of the buffer exceeds the high\n     *                 water mark, then calls to write will continue to succeed\n     *                 but will return false to inform writers to slow down\n     *                 until the buffer has been drained by reading from it.\n     */\n    public function __construct($hwm = 16384)\n    {\n        $this->hwm = $hwm;\n    }\n\n    public function __toString()\n    {\n        return $this->getContents();\n    }\n\n    public function getContents()\n    {\n        $buffer = $this->buffer;\n        $this->buffer = '';\n\n        return $buffer;\n    }\n\n    public function close()\n    {\n        $this->buffer = '';\n    }\n\n    public function detach()\n    {\n        $this->close();\n    }\n\n    public function getSize()\n    {\n        return strlen($this->buffer);\n    }\n\n    public function isReadable()\n    {\n        return true;\n    }\n\n    public function isWritable()\n    {\n        return true;\n    }\n\n    public function isSeekable()\n    {\n        return false;\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        throw new \\RuntimeException('Cannot seek a BufferStream');\n    }\n\n    public function eof()\n    {\n        return strlen($this->buffer) === 0;\n    }\n\n    public function tell()\n    {\n        throw new \\RuntimeException('Cannot determine the position of a BufferStream');\n    }\n\n    /**\n     * Reads data from the buffer.\n     */\n    public function read($length)\n    {\n        $currentLength = strlen($this->buffer);\n\n        if ($length >= $currentLength) {\n            // No need to slice the buffer because we don't have enough data.\n            $result = $this->buffer;\n            $this->buffer = '';\n        } else {\n            // Slice up the result to provide a subset of the buffer.\n            $result = substr($this->buffer, 0, $length);\n            $this->buffer = substr($this->buffer, $length);\n        }\n\n        return $result;\n    }\n\n    /**\n     * Writes data to the buffer.\n     */\n    public function write($string)\n    {\n        $this->buffer .= $string;\n\n        // TODO: What should happen here?\n        if (strlen($this->buffer) >= $this->hwm) {\n            return false;\n        }\n\n        return strlen($string);\n    }\n\n    public function getMetadata($key = null)\n    {\n        if ($key == 'hwm') {\n            return $this->hwm;\n        }\n\n        return $key ? null : [];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/CachingStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator that can cache previously read bytes from a sequentially\n * read stream.\n */\nclass CachingStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var StreamInterface Stream being wrapped */\n    private $remoteStream;\n\n    /** @var int Number of bytes to skip reading due to a write on the buffer */\n    private $skipReadBytes = 0;\n\n    /**\n     * We will treat the buffer object as the body of the stream\n     *\n     * @param StreamInterface $stream Stream to cache\n     * @param StreamInterface $target Optionally specify where data is cached\n     */\n    public function __construct(\n        StreamInterface $stream,\n        StreamInterface $target = null\n    ) {\n        $this->remoteStream = $stream;\n        $this->stream = $target ?: new Stream(fopen('php://temp', 'r+'));\n    }\n\n    public function getSize()\n    {\n        return max($this->stream->getSize(), $this->remoteStream->getSize());\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        if ($whence == SEEK_SET) {\n            $byte = $offset;\n        } elseif ($whence == SEEK_CUR) {\n            $byte = $offset + $this->tell();\n        } elseif ($whence == SEEK_END) {\n            $size = $this->remoteStream->getSize();\n            if ($size === null) {\n                $size = $this->cacheEntireStream();\n            }\n            $byte = $size + $offset;\n        } else {\n            throw new \\InvalidArgumentException('Invalid whence');\n        }\n\n        $diff = $byte - $this->stream->getSize();\n\n        if ($diff > 0) {\n            // Read the remoteStream until we have read in at least the amount\n            // of bytes requested, or we reach the end of the file.\n            while ($diff > 0 && !$this->remoteStream->eof()) {\n                $this->read($diff);\n                $diff = $byte - $this->stream->getSize();\n            }\n        } else {\n            // We can just do a normal seek since we've already seen this byte.\n            $this->stream->seek($byte);\n        }\n    }\n\n    public function read($length)\n    {\n        // Perform a regular read on any previously read data from the buffer\n        $data = $this->stream->read($length);\n        $remaining = $length - strlen($data);\n\n        // More data was requested so read from the remote stream\n        if ($remaining) {\n            // If data was written to the buffer in a position that would have\n            // been filled from the remote stream, then we must skip bytes on\n            // the remote stream to emulate overwriting bytes from that\n            // position. This mimics the behavior of other PHP stream wrappers.\n            $remoteData = $this->remoteStream->read(\n                $remaining + $this->skipReadBytes\n            );\n\n            if ($this->skipReadBytes) {\n                $len = strlen($remoteData);\n                $remoteData = substr($remoteData, $this->skipReadBytes);\n                $this->skipReadBytes = max(0, $this->skipReadBytes - $len);\n            }\n\n            $data .= $remoteData;\n            $this->stream->write($remoteData);\n        }\n\n        return $data;\n    }\n\n    public function write($string)\n    {\n        // When appending to the end of the currently read stream, you'll want\n        // to skip bytes from being read from the remote stream to emulate\n        // other stream wrappers. Basically replacing bytes of data of a fixed\n        // length.\n        $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell();\n        if ($overflow > 0) {\n            $this->skipReadBytes += $overflow;\n        }\n\n        return $this->stream->write($string);\n    }\n\n    public function eof()\n    {\n        return $this->stream->eof() && $this->remoteStream->eof();\n    }\n\n    /**\n     * Close both the remote stream and buffer stream\n     */\n    public function close()\n    {\n        $this->remoteStream->close() && $this->stream->close();\n    }\n\n    private function cacheEntireStream()\n    {\n        $target = new FnStream(['write' => 'strlen']);\n        copy_to_stream($this, $target);\n\n        return $this->tell();\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/DroppingStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator that begins dropping data once the size of the underlying\n * stream becomes too full.\n */\nclass DroppingStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    private $maxLength;\n\n    /**\n     * @param StreamInterface $stream    Underlying stream to decorate.\n     * @param int             $maxLength Maximum size before dropping data.\n     */\n    public function __construct(StreamInterface $stream, $maxLength)\n    {\n        $this->stream = $stream;\n        $this->maxLength = $maxLength;\n    }\n\n    public function write($string)\n    {\n        $diff = $this->maxLength - $this->stream->getSize();\n\n        // Begin returning 0 when the underlying stream is too large.\n        if ($diff <= 0) {\n            return 0;\n        }\n\n        // Write the stream or a subset of the stream if needed.\n        if (strlen($string) < $diff) {\n            return $this->stream->write($string);\n        }\n\n        return $this->stream->write(substr($string, 0, $diff));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/FnStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Compose stream implementations based on a hash of functions.\n *\n * Allows for easy testing and extension of a provided stream without needing\n * to create a concrete class for a simple extension point.\n */\nclass FnStream implements StreamInterface\n{\n    /** @var array */\n    private $methods;\n\n    /** @var array Methods that must be implemented in the given array */\n    private static $slots = ['__toString', 'close', 'detach', 'rewind',\n        'getSize', 'tell', 'eof', 'isSeekable', 'seek', 'isWritable', 'write',\n        'isReadable', 'read', 'getContents', 'getMetadata'];\n\n    /**\n     * @param array $methods Hash of method name to a callable.\n     */\n    public function __construct(array $methods)\n    {\n        $this->methods = $methods;\n\n        // Create the functions on the class\n        foreach ($methods as $name => $fn) {\n            $this->{'_fn_' . $name} = $fn;\n        }\n    }\n\n    /**\n     * Lazily determine which methods are not implemented.\n     * @throws \\BadMethodCallException\n     */\n    public function __get($name)\n    {\n        throw new \\BadMethodCallException(str_replace('_fn_', '', $name)\n            . '() is not implemented in the FnStream');\n    }\n\n    /**\n     * The close method is called on the underlying stream only if possible.\n     */\n    public function __destruct()\n    {\n        if (isset($this->_fn_close)) {\n            call_user_func($this->_fn_close);\n        }\n    }\n\n    /**\n     * An unserialize would allow the __destruct to run when the unserialized value goes out of scope.\n     * @throws \\LogicException\n     */\n    public function __wakeup()\n    {\n        throw new \\LogicException('FnStream should never be unserialized');\n    }\n\n    /**\n     * Adds custom functionality to an underlying stream by intercepting\n     * specific method calls.\n     *\n     * @param StreamInterface $stream  Stream to decorate\n     * @param array           $methods Hash of method name to a closure\n     *\n     * @return FnStream\n     */\n    public static function decorate(StreamInterface $stream, array $methods)\n    {\n        // If any of the required methods were not provided, then simply\n        // proxy to the decorated stream.\n        foreach (array_diff(self::$slots, array_keys($methods)) as $diff) {\n            $methods[$diff] = [$stream, $diff];\n        }\n\n        return new self($methods);\n    }\n\n    public function __toString()\n    {\n        return call_user_func($this->_fn___toString);\n    }\n\n    public function close()\n    {\n        return call_user_func($this->_fn_close);\n    }\n\n    public function detach()\n    {\n        return call_user_func($this->_fn_detach);\n    }\n\n    public function getSize()\n    {\n        return call_user_func($this->_fn_getSize);\n    }\n\n    public function tell()\n    {\n        return call_user_func($this->_fn_tell);\n    }\n\n    public function eof()\n    {\n        return call_user_func($this->_fn_eof);\n    }\n\n    public function isSeekable()\n    {\n        return call_user_func($this->_fn_isSeekable);\n    }\n\n    public function rewind()\n    {\n        call_user_func($this->_fn_rewind);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        call_user_func($this->_fn_seek, $offset, $whence);\n    }\n\n    public function isWritable()\n    {\n        return call_user_func($this->_fn_isWritable);\n    }\n\n    public function write($string)\n    {\n        return call_user_func($this->_fn_write, $string);\n    }\n\n    public function isReadable()\n    {\n        return call_user_func($this->_fn_isReadable);\n    }\n\n    public function read($length)\n    {\n        return call_user_func($this->_fn_read, $length);\n    }\n\n    public function getContents()\n    {\n        return call_user_func($this->_fn_getContents);\n    }\n\n    public function getMetadata($key = null)\n    {\n        return call_user_func($this->_fn_getMetadata, $key);\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/InflateStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Uses PHP's zlib.inflate filter to inflate deflate or gzipped content.\n *\n * This stream decorator skips the first 10 bytes of the given stream to remove\n * the gzip header, converts the provided stream to a PHP stream resource,\n * then appends the zlib.inflate filter. The stream is then converted back\n * to a Guzzle stream resource to be used as a Guzzle stream.\n *\n * @link http://tools.ietf.org/html/rfc1952\n * @link http://php.net/manual/en/filters.compression.php\n */\nclass InflateStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    public function __construct(StreamInterface $stream)\n    {\n        // read the first 10 bytes, ie. gzip header\n        $header = $stream->read(10);\n        $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header);\n        // Skip the header, that is 10 + length of filename + 1 (nil) bytes\n        $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength);\n        $resource = StreamWrapper::getResource($stream);\n        stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ);\n        $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource));\n    }\n\n    /**\n     * @param StreamInterface $stream\n     * @param $header\n     * @return int\n     */\n    private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header)\n    {\n        $filename_header_length = 0;\n\n        if (substr(bin2hex($header), 6, 2) === '08') {\n            // we have a filename, read until nil\n            $filename_header_length = 1;\n            while ($stream->read(1) !== chr(0)) {\n                $filename_header_length++;\n            }\n        }\n\n        return $filename_header_length;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/LazyOpenStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Lazily reads or writes to a file that is opened only after an IO operation\n * take place on the stream.\n */\nclass LazyOpenStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var string File to open */\n    private $filename;\n\n    /** @var string $mode */\n    private $mode;\n\n    /**\n     * @param string $filename File to lazily open\n     * @param string $mode     fopen mode to use when opening the stream\n     */\n    public function __construct($filename, $mode)\n    {\n        $this->filename = $filename;\n        $this->mode = $mode;\n    }\n\n    /**\n     * Creates the underlying stream lazily when required.\n     *\n     * @return StreamInterface\n     */\n    protected function createStream()\n    {\n        return stream_for(try_fopen($this->filename, $this->mode));\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/LimitStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n\n/**\n * Decorator used to return only a subset of a stream\n */\nclass LimitStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    /** @var int Offset to start reading from */\n    private $offset;\n\n    /** @var int Limit the number of bytes that can be read */\n    private $limit;\n\n    /**\n     * @param StreamInterface $stream Stream to wrap\n     * @param int             $limit  Total number of bytes to allow to be read\n     *                                from the stream. Pass -1 for no limit.\n     * @param int             $offset Position to seek to before reading (only\n     *                                works on seekable streams).\n     */\n    public function __construct(\n        StreamInterface $stream,\n        $limit = -1,\n        $offset = 0\n    ) {\n        $this->stream = $stream;\n        $this->setLimit($limit);\n        $this->setOffset($offset);\n    }\n\n    public function eof()\n    {\n        // Always return true if the underlying stream is EOF\n        if ($this->stream->eof()) {\n            return true;\n        }\n\n        // No limit and the underlying stream is not at EOF\n        if ($this->limit == -1) {\n            return false;\n        }\n\n        return $this->stream->tell() >= $this->offset + $this->limit;\n    }\n\n    /**\n     * Returns the size of the limited subset of data\n     * {@inheritdoc}\n     */\n    public function getSize()\n    {\n        if (null === ($length = $this->stream->getSize())) {\n            return null;\n        } elseif ($this->limit == -1) {\n            return $length - $this->offset;\n        } else {\n            return min($this->limit, $length - $this->offset);\n        }\n    }\n\n    /**\n     * Allow for a bounded seek on the read limited stream\n     * {@inheritdoc}\n     */\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        if ($whence !== SEEK_SET || $offset < 0) {\n            throw new \\RuntimeException(sprintf(\n                'Cannot seek to offset %s with whence %s',\n                $offset,\n                $whence\n            ));\n        }\n\n        $offset += $this->offset;\n\n        if ($this->limit !== -1) {\n            if ($offset > $this->offset + $this->limit) {\n                $offset = $this->offset + $this->limit;\n            }\n        }\n\n        $this->stream->seek($offset);\n    }\n\n    /**\n     * Give a relative tell()\n     * {@inheritdoc}\n     */\n    public function tell()\n    {\n        return $this->stream->tell() - $this->offset;\n    }\n\n    /**\n     * Set the offset to start limiting from\n     *\n     * @param int $offset Offset to seek to and begin byte limiting from\n     *\n     * @throws \\RuntimeException if the stream cannot be seeked.\n     */\n    public function setOffset($offset)\n    {\n        $current = $this->stream->tell();\n\n        if ($current !== $offset) {\n            // If the stream cannot seek to the offset position, then read to it\n            if ($this->stream->isSeekable()) {\n                $this->stream->seek($offset);\n            } elseif ($current > $offset) {\n                throw new \\RuntimeException(\"Could not seek to stream offset $offset\");\n            } else {\n                $this->stream->read($offset - $current);\n            }\n        }\n\n        $this->offset = $offset;\n    }\n\n    /**\n     * Set the limit of bytes that the decorator allows to be read from the\n     * stream.\n     *\n     * @param int $limit Number of bytes to allow to be read from the stream.\n     *                   Use -1 for no limit.\n     */\n    public function setLimit($limit)\n    {\n        $this->limit = $limit;\n    }\n\n    public function read($length)\n    {\n        if ($this->limit == -1) {\n            return $this->stream->read($length);\n        }\n\n        // Check if the current position is less than the total allowed\n        // bytes + original offset\n        $remaining = ($this->offset + $this->limit) - $this->stream->tell();\n        if ($remaining > 0) {\n            // Only return the amount of requested data, ensuring that the byte\n            // limit is not exceeded\n            return $this->stream->read(min($remaining, $length));\n        }\n\n        return '';\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/MessageTrait.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Trait implementing functionality common to requests and responses.\n */\ntrait MessageTrait\n{\n    /** @var array Map of all registered headers, as original name => array of values */\n    private $headers = [];\n\n    /** @var array Map of lowercase header name => original name at registration */\n    private $headerNames  = [];\n\n    /** @var string */\n    private $protocol = '1.1';\n\n    /** @var StreamInterface */\n    private $stream;\n\n    public function getProtocolVersion()\n    {\n        return $this->protocol;\n    }\n\n    public function withProtocolVersion($version)\n    {\n        if ($this->protocol === $version) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->protocol = $version;\n        return $new;\n    }\n\n    public function getHeaders()\n    {\n        return $this->headers;\n    }\n\n    public function hasHeader($header)\n    {\n        return isset($this->headerNames[strtolower($header)]);\n    }\n\n    public function getHeader($header)\n    {\n        $header = strtolower($header);\n\n        if (!isset($this->headerNames[$header])) {\n            return [];\n        }\n\n        $header = $this->headerNames[$header];\n\n        return $this->headers[$header];\n    }\n\n    public function getHeaderLine($header)\n    {\n        return implode(', ', $this->getHeader($header));\n    }\n\n    public function withHeader($header, $value)\n    {\n        $this->assertHeader($header);\n        $value = $this->normalizeHeaderValue($value);\n        $normalized = strtolower($header);\n\n        $new = clone $this;\n        if (isset($new->headerNames[$normalized])) {\n            unset($new->headers[$new->headerNames[$normalized]]);\n        }\n        $new->headerNames[$normalized] = $header;\n        $new->headers[$header] = $value;\n\n        return $new;\n    }\n\n    public function withAddedHeader($header, $value)\n    {\n        $this->assertHeader($header);\n        $value = $this->normalizeHeaderValue($value);\n        $normalized = strtolower($header);\n\n        $new = clone $this;\n        if (isset($new->headerNames[$normalized])) {\n            $header = $this->headerNames[$normalized];\n            $new->headers[$header] = array_merge($this->headers[$header], $value);\n        } else {\n            $new->headerNames[$normalized] = $header;\n            $new->headers[$header] = $value;\n        }\n\n        return $new;\n    }\n\n    public function withoutHeader($header)\n    {\n        $normalized = strtolower($header);\n\n        if (!isset($this->headerNames[$normalized])) {\n            return $this;\n        }\n\n        $header = $this->headerNames[$normalized];\n\n        $new = clone $this;\n        unset($new->headers[$header], $new->headerNames[$normalized]);\n\n        return $new;\n    }\n\n    public function getBody()\n    {\n        if (!$this->stream) {\n            $this->stream = stream_for('');\n        }\n\n        return $this->stream;\n    }\n\n    public function withBody(StreamInterface $body)\n    {\n        if ($body === $this->stream) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->stream = $body;\n        return $new;\n    }\n\n    private function setHeaders(array $headers)\n    {\n        $this->headerNames = $this->headers = [];\n        foreach ($headers as $header => $value) {\n            if (is_int($header)) {\n                // Numeric array keys are converted to int by PHP but having a header name '123' is not forbidden by the spec\n                // and also allowed in withHeader(). So we need to cast it to string again for the following assertion to pass.\n                $header = (string) $header;\n            }\n            $this->assertHeader($header);\n            $value = $this->normalizeHeaderValue($value);\n            $normalized = strtolower($header);\n            if (isset($this->headerNames[$normalized])) {\n                $header = $this->headerNames[$normalized];\n                $this->headers[$header] = array_merge($this->headers[$header], $value);\n            } else {\n                $this->headerNames[$normalized] = $header;\n                $this->headers[$header] = $value;\n            }\n        }\n    }\n\n    private function normalizeHeaderValue($value)\n    {\n        if (!is_array($value)) {\n            return $this->trimHeaderValues([$value]);\n        }\n\n        if (count($value) === 0) {\n            throw new \\InvalidArgumentException('Header value can not be an empty array.');\n        }\n\n        return $this->trimHeaderValues($value);\n    }\n\n    /**\n     * Trims whitespace from the header values.\n     *\n     * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field.\n     *\n     * header-field = field-name \":\" OWS field-value OWS\n     * OWS          = *( SP / HTAB )\n     *\n     * @param string[] $values Header values\n     *\n     * @return string[] Trimmed header values\n     *\n     * @see https://tools.ietf.org/html/rfc7230#section-3.2.4\n     */\n    private function trimHeaderValues(array $values)\n    {\n        return array_map(function ($value) {\n            if (!is_scalar($value) && null !== $value) {\n                throw new \\InvalidArgumentException(sprintf(\n                    'Header value must be scalar or null but %s provided.',\n                    is_object($value) ? get_class($value) : gettype($value)\n                ));\n            }\n\n            return trim((string) $value, \" \\t\");\n        }, $values);\n    }\n\n    private function assertHeader($header)\n    {\n        if (!is_string($header)) {\n            throw new \\InvalidArgumentException(sprintf(\n                'Header name must be a string but %s provided.',\n                is_object($header) ? get_class($header) : gettype($header)\n            ));\n        }\n\n        if ($header === '') {\n            throw new \\InvalidArgumentException('Header name can not be empty.');\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/MultipartStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream that when read returns bytes for a streaming multipart or\n * multipart/form-data stream.\n */\nclass MultipartStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    private $boundary;\n\n    /**\n     * @param array  $elements Array of associative arrays, each containing a\n     *                         required \"name\" key mapping to the form field,\n     *                         name, a required \"contents\" key mapping to a\n     *                         StreamInterface/resource/string, an optional\n     *                         \"headers\" associative array of custom headers,\n     *                         and an optional \"filename\" key mapping to a\n     *                         string to send as the filename in the part.\n     * @param string $boundary You can optionally provide a specific boundary\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function __construct(array $elements = [], $boundary = null)\n    {\n        $this->boundary = $boundary ?: sha1(uniqid('', true));\n        $this->stream = $this->createStream($elements);\n    }\n\n    /**\n     * Get the boundary\n     *\n     * @return string\n     */\n    public function getBoundary()\n    {\n        return $this->boundary;\n    }\n\n    public function isWritable()\n    {\n        return false;\n    }\n\n    /**\n     * Get the headers needed before transferring the content of a POST file\n     */\n    private function getHeaders(array $headers)\n    {\n        $str = '';\n        foreach ($headers as $key => $value) {\n            $str .= \"{$key}: {$value}\\r\\n\";\n        }\n\n        return \"--{$this->boundary}\\r\\n\" . trim($str) . \"\\r\\n\\r\\n\";\n    }\n\n    /**\n     * Create the aggregate stream that will be used to upload the POST data\n     */\n    protected function createStream(array $elements)\n    {\n        $stream = new AppendStream();\n\n        foreach ($elements as $element) {\n            $this->addElement($stream, $element);\n        }\n\n        // Add the trailing boundary with CRLF\n        $stream->addStream(stream_for(\"--{$this->boundary}--\\r\\n\"));\n\n        return $stream;\n    }\n\n    private function addElement(AppendStream $stream, array $element)\n    {\n        foreach (['contents', 'name'] as $key) {\n            if (!array_key_exists($key, $element)) {\n                throw new \\InvalidArgumentException(\"A '{$key}' key is required\");\n            }\n        }\n\n        $element['contents'] = stream_for($element['contents']);\n\n        if (empty($element['filename'])) {\n            $uri = $element['contents']->getMetadata('uri');\n            if (substr($uri, 0, 6) !== 'php://') {\n                $element['filename'] = $uri;\n            }\n        }\n\n        list($body, $headers) = $this->createElement(\n            $element['name'],\n            $element['contents'],\n            isset($element['filename']) ? $element['filename'] : null,\n            isset($element['headers']) ? $element['headers'] : []\n        );\n\n        $stream->addStream(stream_for($this->getHeaders($headers)));\n        $stream->addStream($body);\n        $stream->addStream(stream_for(\"\\r\\n\"));\n    }\n\n    /**\n     * @return array\n     */\n    private function createElement($name, StreamInterface $stream, $filename, array $headers)\n    {\n        // Set a default content-disposition header if one was no provided\n        $disposition = $this->getHeader($headers, 'content-disposition');\n        if (!$disposition) {\n            $headers['Content-Disposition'] = ($filename === '0' || $filename)\n                ? sprintf('form-data; name=\"%s\"; filename=\"%s\"',\n                    $name,\n                    basename($filename))\n                : \"form-data; name=\\\"{$name}\\\"\";\n        }\n\n        // Set a default content-length header if one was no provided\n        $length = $this->getHeader($headers, 'content-length');\n        if (!$length) {\n            if ($length = $stream->getSize()) {\n                $headers['Content-Length'] = (string) $length;\n            }\n        }\n\n        // Set a default Content-Type if one was not supplied\n        $type = $this->getHeader($headers, 'content-type');\n        if (!$type && ($filename === '0' || $filename)) {\n            if ($type = mimetype_from_filename($filename)) {\n                $headers['Content-Type'] = $type;\n            }\n        }\n\n        return [$stream, $headers];\n    }\n\n    private function getHeader(array $headers, $key)\n    {\n        $lowercaseHeader = strtolower($key);\n        foreach ($headers as $k => $v) {\n            if (strtolower($k) === $lowercaseHeader) {\n                return $v;\n            }\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/NoSeekStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator that prevents a stream from being seeked\n */\nclass NoSeekStream implements StreamInterface\n{\n    use StreamDecoratorTrait;\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        throw new \\RuntimeException('Cannot seek a NoSeekStream');\n    }\n\n    public function isSeekable()\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/PumpStream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Provides a read only stream that pumps data from a PHP callable.\n *\n * When invoking the provided callable, the PumpStream will pass the amount of\n * data requested to read to the callable. The callable can choose to ignore\n * this value and return fewer or more bytes than requested. Any extra data\n * returned by the provided callable is buffered internally until drained using\n * the read() function of the PumpStream. The provided callable MUST return\n * false when there is no more data to read.\n */\nclass PumpStream implements StreamInterface\n{\n    /** @var callable */\n    private $source;\n\n    /** @var int */\n    private $size;\n\n    /** @var int */\n    private $tellPos = 0;\n\n    /** @var array */\n    private $metadata;\n\n    /** @var BufferStream */\n    private $buffer;\n\n    /**\n     * @param callable $source Source of the stream data. The callable MAY\n     *                         accept an integer argument used to control the\n     *                         amount of data to return. The callable MUST\n     *                         return a string when called, or false on error\n     *                         or EOF.\n     * @param array $options   Stream options:\n     *                         - metadata: Hash of metadata to use with stream.\n     *                         - size: Size of the stream, if known.\n     */\n    public function __construct(callable $source, array $options = [])\n    {\n        $this->source = $source;\n        $this->size = isset($options['size']) ? $options['size'] : null;\n        $this->metadata = isset($options['metadata']) ? $options['metadata'] : [];\n        $this->buffer = new BufferStream();\n    }\n\n    public function __toString()\n    {\n        try {\n            return copy_to_string($this);\n        } catch (\\Exception $e) {\n            return '';\n        }\n    }\n\n    public function close()\n    {\n        $this->detach();\n    }\n\n    public function detach()\n    {\n        $this->tellPos = false;\n        $this->source = null;\n    }\n\n    public function getSize()\n    {\n        return $this->size;\n    }\n\n    public function tell()\n    {\n        return $this->tellPos;\n    }\n\n    public function eof()\n    {\n        return !$this->source;\n    }\n\n    public function isSeekable()\n    {\n        return false;\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        throw new \\RuntimeException('Cannot seek a PumpStream');\n    }\n\n    public function isWritable()\n    {\n        return false;\n    }\n\n    public function write($string)\n    {\n        throw new \\RuntimeException('Cannot write to a PumpStream');\n    }\n\n    public function isReadable()\n    {\n        return true;\n    }\n\n    public function read($length)\n    {\n        $data = $this->buffer->read($length);\n        $readLen = strlen($data);\n        $this->tellPos += $readLen;\n        $remaining = $length - $readLen;\n\n        if ($remaining) {\n            $this->pump($remaining);\n            $data .= $this->buffer->read($remaining);\n            $this->tellPos += strlen($data) - $readLen;\n        }\n\n        return $data;\n    }\n\n    public function getContents()\n    {\n        $result = '';\n        while (!$this->eof()) {\n            $result .= $this->read(1000000);\n        }\n\n        return $result;\n    }\n\n    public function getMetadata($key = null)\n    {\n        if (!$key) {\n            return $this->metadata;\n        }\n\n        return isset($this->metadata[$key]) ? $this->metadata[$key] : null;\n    }\n\n    private function pump($length)\n    {\n        if ($this->source) {\n            do {\n                $data = call_user_func($this->source, $length);\n                if ($data === false || $data === null) {\n                    $this->source = null;\n                    return;\n                }\n                $this->buffer->write($data);\n                $length -= strlen($data);\n            } while ($length > 0);\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/Request.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * PSR-7 request implementation.\n */\nclass Request implements RequestInterface\n{\n    use MessageTrait;\n\n    /** @var string */\n    private $method;\n\n    /** @var null|string */\n    private $requestTarget;\n\n    /** @var UriInterface */\n    private $uri;\n\n    /**\n     * @param string                               $method  HTTP method\n     * @param string|UriInterface                  $uri     URI\n     * @param array                                $headers Request headers\n     * @param string|null|resource|StreamInterface $body    Request body\n     * @param string                               $version Protocol version\n     */\n    public function __construct(\n        $method,\n        $uri,\n        array $headers = [],\n        $body = null,\n        $version = '1.1'\n    ) {\n        $this->assertMethod($method);\n        if (!($uri instanceof UriInterface)) {\n            $uri = new Uri($uri);\n        }\n\n        $this->method = strtoupper($method);\n        $this->uri = $uri;\n        $this->setHeaders($headers);\n        $this->protocol = $version;\n\n        if (!isset($this->headerNames['host'])) {\n            $this->updateHostFromUri();\n        }\n\n        if ($body !== '' && $body !== null) {\n            $this->stream = stream_for($body);\n        }\n    }\n\n    public function getRequestTarget()\n    {\n        if ($this->requestTarget !== null) {\n            return $this->requestTarget;\n        }\n\n        $target = $this->uri->getPath();\n        if ($target == '') {\n            $target = '/';\n        }\n        if ($this->uri->getQuery() != '') {\n            $target .= '?' . $this->uri->getQuery();\n        }\n\n        return $target;\n    }\n\n    public function withRequestTarget($requestTarget)\n    {\n        if (preg_match('#\\s#', $requestTarget)) {\n            throw new InvalidArgumentException(\n                'Invalid request target provided; cannot contain whitespace'\n            );\n        }\n\n        $new = clone $this;\n        $new->requestTarget = $requestTarget;\n        return $new;\n    }\n\n    public function getMethod()\n    {\n        return $this->method;\n    }\n\n    public function withMethod($method)\n    {\n        $this->assertMethod($method);\n        $new = clone $this;\n        $new->method = strtoupper($method);\n        return $new;\n    }\n\n    public function getUri()\n    {\n        return $this->uri;\n    }\n\n    public function withUri(UriInterface $uri, $preserveHost = false)\n    {\n        if ($uri === $this->uri) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->uri = $uri;\n\n        if (!$preserveHost || !isset($this->headerNames['host'])) {\n            $new->updateHostFromUri();\n        }\n\n        return $new;\n    }\n\n    private function updateHostFromUri()\n    {\n        $host = $this->uri->getHost();\n\n        if ($host == '') {\n            return;\n        }\n\n        if (($port = $this->uri->getPort()) !== null) {\n            $host .= ':' . $port;\n        }\n\n        if (isset($this->headerNames['host'])) {\n            $header = $this->headerNames['host'];\n        } else {\n            $header = 'Host';\n            $this->headerNames['host'] = 'Host';\n        }\n        // Ensure Host is the first header.\n        // See: http://tools.ietf.org/html/rfc7230#section-5.4\n        $this->headers = [$header => [$host]] + $this->headers;\n    }\n\n    private function assertMethod($method)\n    {\n        if (!is_string($method) || $method === '') {\n            throw new \\InvalidArgumentException('Method must be a non-empty string.');\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/Response.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * PSR-7 response implementation.\n */\nclass Response implements ResponseInterface\n{\n    use MessageTrait;\n\n    /** @var array Map of standard HTTP status code/reason phrases */\n    private static $phrases = [\n        100 => 'Continue',\n        101 => 'Switching Protocols',\n        102 => 'Processing',\n        200 => 'OK',\n        201 => 'Created',\n        202 => 'Accepted',\n        203 => 'Non-Authoritative Information',\n        204 => 'No Content',\n        205 => 'Reset Content',\n        206 => 'Partial Content',\n        207 => 'Multi-status',\n        208 => 'Already Reported',\n        300 => 'Multiple Choices',\n        301 => 'Moved Permanently',\n        302 => 'Found',\n        303 => 'See Other',\n        304 => 'Not Modified',\n        305 => 'Use Proxy',\n        306 => 'Switch Proxy',\n        307 => 'Temporary Redirect',\n        400 => 'Bad Request',\n        401 => 'Unauthorized',\n        402 => 'Payment Required',\n        403 => 'Forbidden',\n        404 => 'Not Found',\n        405 => 'Method Not Allowed',\n        406 => 'Not Acceptable',\n        407 => 'Proxy Authentication Required',\n        408 => 'Request Time-out',\n        409 => 'Conflict',\n        410 => 'Gone',\n        411 => 'Length Required',\n        412 => 'Precondition Failed',\n        413 => 'Request Entity Too Large',\n        414 => 'Request-URI Too Large',\n        415 => 'Unsupported Media Type',\n        416 => 'Requested range not satisfiable',\n        417 => 'Expectation Failed',\n        418 => 'I\\'m a teapot',\n        422 => 'Unprocessable Entity',\n        423 => 'Locked',\n        424 => 'Failed Dependency',\n        425 => 'Unordered Collection',\n        426 => 'Upgrade Required',\n        428 => 'Precondition Required',\n        429 => 'Too Many Requests',\n        431 => 'Request Header Fields Too Large',\n        451 => 'Unavailable For Legal Reasons',\n        500 => 'Internal Server Error',\n        501 => 'Not Implemented',\n        502 => 'Bad Gateway',\n        503 => 'Service Unavailable',\n        504 => 'Gateway Time-out',\n        505 => 'HTTP Version not supported',\n        506 => 'Variant Also Negotiates',\n        507 => 'Insufficient Storage',\n        508 => 'Loop Detected',\n        511 => 'Network Authentication Required',\n    ];\n\n    /** @var string */\n    private $reasonPhrase = '';\n\n    /** @var int */\n    private $statusCode = 200;\n\n    /**\n     * @param int                                  $status  Status code\n     * @param array                                $headers Response headers\n     * @param string|null|resource|StreamInterface $body    Response body\n     * @param string                               $version Protocol version\n     * @param string|null                          $reason  Reason phrase (when empty a default will be used based on the status code)\n     */\n    public function __construct(\n        $status = 200,\n        array $headers = [],\n        $body = null,\n        $version = '1.1',\n        $reason = null\n    ) {\n        $this->assertStatusCodeIsInteger($status);\n        $status = (int) $status;\n        $this->assertStatusCodeRange($status);\n\n        $this->statusCode = $status;\n\n        if ($body !== '' && $body !== null) {\n            $this->stream = stream_for($body);\n        }\n\n        $this->setHeaders($headers);\n        if ($reason == '' && isset(self::$phrases[$this->statusCode])) {\n            $this->reasonPhrase = self::$phrases[$this->statusCode];\n        } else {\n            $this->reasonPhrase = (string) $reason;\n        }\n\n        $this->protocol = $version;\n    }\n\n    public function getStatusCode()\n    {\n        return $this->statusCode;\n    }\n\n    public function getReasonPhrase()\n    {\n        return $this->reasonPhrase;\n    }\n\n    public function withStatus($code, $reasonPhrase = '')\n    {\n        $this->assertStatusCodeIsInteger($code);\n        $code = (int) $code;\n        $this->assertStatusCodeRange($code);\n\n        $new = clone $this;\n        $new->statusCode = $code;\n        if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) {\n            $reasonPhrase = self::$phrases[$new->statusCode];\n        }\n        $new->reasonPhrase = $reasonPhrase;\n        return $new;\n    }\n\n    private function assertStatusCodeIsInteger($statusCode)\n    {\n        if (filter_var($statusCode, FILTER_VALIDATE_INT) === false) {\n            throw new \\InvalidArgumentException('Status code must be an integer value.');\n        }\n    }\n\n    private function assertStatusCodeRange($statusCode)\n    {\n        if ($statusCode < 100 || $statusCode >= 600) {\n            throw new \\InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.');\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/Rfc7230.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Psr7;\n\nfinal class Rfc7230\n{\n    /**\n     * Header related regular expressions (copied from amphp/http package)\n     * (Note: once we require PHP 7.x we could just depend on the upstream package)\n     *\n     * Note: header delimiter (\\r\\n) is modified to \\r?\\n to accept line feed only delimiters for BC reasons.\n     *\n     * @link    https://github.com/amphp/http/blob/v1.0.1/src/Rfc7230.php#L12-L15\n     * @license https://github.com/amphp/http/blob/v1.0.1/LICENSE\n     */\n    const HEADER_REGEX = \"(^([^()<>@,;:\\\\\\\"/[\\]?={}\\x01-\\x20\\x7F]++):[ \\t]*+((?:[ \\t]*+[\\x21-\\x7E\\x80-\\xFF]++)*+)[ \\t]*+\\r?\\n)m\";\n    const HEADER_FOLD_REGEX = \"(\\r?\\n[ \\t]++)\";\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/ServerRequest.php",
    "content": "<?php\n\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Psr\\Http\\Message\\UriInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UploadedFileInterface;\n\n/**\n * Server-side HTTP request\n *\n * Extends the Request definition to add methods for accessing incoming data,\n * specifically server parameters, cookies, matched path parameters, query\n * string arguments, body parameters, and upload file information.\n *\n * \"Attributes\" are discovered via decomposing the request (and usually\n * specifically the URI path), and typically will be injected by the application.\n *\n * Requests are considered immutable; all methods that might change state are\n * implemented such that they retain the internal state of the current\n * message and return a new instance that contains the changed state.\n */\nclass ServerRequest extends Request implements ServerRequestInterface\n{\n    /**\n     * @var array\n     */\n    private $attributes = [];\n\n    /**\n     * @var array\n     */\n    private $cookieParams = [];\n\n    /**\n     * @var null|array|object\n     */\n    private $parsedBody;\n\n    /**\n     * @var array\n     */\n    private $queryParams = [];\n\n    /**\n     * @var array\n     */\n    private $serverParams;\n\n    /**\n     * @var array\n     */\n    private $uploadedFiles = [];\n\n    /**\n     * @param string                               $method       HTTP method\n     * @param string|UriInterface                  $uri          URI\n     * @param array                                $headers      Request headers\n     * @param string|null|resource|StreamInterface $body         Request body\n     * @param string                               $version      Protocol version\n     * @param array                                $serverParams Typically the $_SERVER superglobal\n     */\n    public function __construct(\n        $method,\n        $uri,\n        array $headers = [],\n        $body = null,\n        $version = '1.1',\n        array $serverParams = []\n    ) {\n        $this->serverParams = $serverParams;\n\n        parent::__construct($method, $uri, $headers, $body, $version);\n    }\n\n    /**\n     * Return an UploadedFile instance array.\n     *\n     * @param array $files A array which respect $_FILES structure\n     * @throws InvalidArgumentException for unrecognized values\n     * @return array\n     */\n    public static function normalizeFiles(array $files)\n    {\n        $normalized = [];\n\n        foreach ($files as $key => $value) {\n            if ($value instanceof UploadedFileInterface) {\n                $normalized[$key] = $value;\n            } elseif (is_array($value) && isset($value['tmp_name'])) {\n                $normalized[$key] = self::createUploadedFileFromSpec($value);\n            } elseif (is_array($value)) {\n                $normalized[$key] = self::normalizeFiles($value);\n                continue;\n            } else {\n                throw new InvalidArgumentException('Invalid value in files specification');\n            }\n        }\n\n        return $normalized;\n    }\n\n    /**\n     * Create and return an UploadedFile instance from a $_FILES specification.\n     *\n     * If the specification represents an array of values, this method will\n     * delegate to normalizeNestedFileSpec() and return that return value.\n     *\n     * @param array $value $_FILES struct\n     * @return array|UploadedFileInterface\n     */\n    private static function createUploadedFileFromSpec(array $value)\n    {\n        if (is_array($value['tmp_name'])) {\n            return self::normalizeNestedFileSpec($value);\n        }\n\n        return new UploadedFile(\n            $value['tmp_name'],\n            (int) $value['size'],\n            (int) $value['error'],\n            $value['name'],\n            $value['type']\n        );\n    }\n\n    /**\n     * Normalize an array of file specifications.\n     *\n     * Loops through all nested files and returns a normalized array of\n     * UploadedFileInterface instances.\n     *\n     * @param array $files\n     * @return UploadedFileInterface[]\n     */\n    private static function normalizeNestedFileSpec(array $files = [])\n    {\n        $normalizedFiles = [];\n\n        foreach (array_keys($files['tmp_name']) as $key) {\n            $spec = [\n                'tmp_name' => $files['tmp_name'][$key],\n                'size'     => $files['size'][$key],\n                'error'    => $files['error'][$key],\n                'name'     => $files['name'][$key],\n                'type'     => $files['type'][$key],\n            ];\n            $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec);\n        }\n\n        return $normalizedFiles;\n    }\n\n    /**\n     * Return a ServerRequest populated with superglobals:\n     * $_GET\n     * $_POST\n     * $_COOKIE\n     * $_FILES\n     * $_SERVER\n     *\n     * @return ServerRequestInterface\n     */\n    public static function fromGlobals()\n    {\n        $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';\n        $headers = getallheaders();\n        $uri = self::getUriFromGlobals();\n        $body = new CachingStream(new LazyOpenStream('php://input', 'r+'));\n        $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1';\n\n        $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER);\n\n        return $serverRequest\n            ->withCookieParams($_COOKIE)\n            ->withQueryParams($_GET)\n            ->withParsedBody($_POST)\n            ->withUploadedFiles(self::normalizeFiles($_FILES));\n    }\n\n    private static function extractHostAndPortFromAuthority($authority)\n    {\n        $uri = 'http://'.$authority;\n        $parts = parse_url($uri);\n        if (false === $parts) {\n            return [null, null];\n        }\n\n        $host = isset($parts['host']) ? $parts['host'] : null;\n        $port = isset($parts['port']) ? $parts['port'] : null;\n\n        return [$host, $port];\n    }\n\n    /**\n     * Get a Uri populated with values from $_SERVER.\n     *\n     * @return UriInterface\n     */\n    public static function getUriFromGlobals()\n    {\n        $uri = new Uri('');\n\n        $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http');\n\n        $hasPort = false;\n        if (isset($_SERVER['HTTP_HOST'])) {\n            list($host, $port) = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']);\n            if ($host !== null) {\n                $uri = $uri->withHost($host);\n            }\n\n            if ($port !== null) {\n                $hasPort = true;\n                $uri = $uri->withPort($port);\n            }\n        } elseif (isset($_SERVER['SERVER_NAME'])) {\n            $uri = $uri->withHost($_SERVER['SERVER_NAME']);\n        } elseif (isset($_SERVER['SERVER_ADDR'])) {\n            $uri = $uri->withHost($_SERVER['SERVER_ADDR']);\n        }\n\n        if (!$hasPort && isset($_SERVER['SERVER_PORT'])) {\n            $uri = $uri->withPort($_SERVER['SERVER_PORT']);\n        }\n\n        $hasQuery = false;\n        if (isset($_SERVER['REQUEST_URI'])) {\n            $requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2);\n            $uri = $uri->withPath($requestUriParts[0]);\n            if (isset($requestUriParts[1])) {\n                $hasQuery = true;\n                $uri = $uri->withQuery($requestUriParts[1]);\n            }\n        }\n\n        if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) {\n            $uri = $uri->withQuery($_SERVER['QUERY_STRING']);\n        }\n\n        return $uri;\n    }\n\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getServerParams()\n    {\n        return $this->serverParams;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getUploadedFiles()\n    {\n        return $this->uploadedFiles;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withUploadedFiles(array $uploadedFiles)\n    {\n        $new = clone $this;\n        $new->uploadedFiles = $uploadedFiles;\n\n        return $new;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getCookieParams()\n    {\n        return $this->cookieParams;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withCookieParams(array $cookies)\n    {\n        $new = clone $this;\n        $new->cookieParams = $cookies;\n\n        return $new;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getQueryParams()\n    {\n        return $this->queryParams;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withQueryParams(array $query)\n    {\n        $new = clone $this;\n        $new->queryParams = $query;\n\n        return $new;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getParsedBody()\n    {\n        return $this->parsedBody;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withParsedBody($data)\n    {\n        $new = clone $this;\n        $new->parsedBody = $data;\n\n        return $new;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getAttributes()\n    {\n        return $this->attributes;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getAttribute($attribute, $default = null)\n    {\n        if (false === array_key_exists($attribute, $this->attributes)) {\n            return $default;\n        }\n\n        return $this->attributes[$attribute];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withAttribute($attribute, $value)\n    {\n        $new = clone $this;\n        $new->attributes[$attribute] = $value;\n\n        return $new;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function withoutAttribute($attribute)\n    {\n        if (false === array_key_exists($attribute, $this->attributes)) {\n            return $this;\n        }\n\n        $new = clone $this;\n        unset($new->attributes[$attribute]);\n\n        return $new;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/Stream.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * PHP stream implementation.\n *\n * @var $stream\n */\nclass Stream implements StreamInterface\n{\n    /**\n     * Resource modes.\n     *\n     * @var string\n     *\n     * @see http://php.net/manual/function.fopen.php\n     * @see http://php.net/manual/en/function.gzopen.php\n     */\n    const READABLE_MODES = '/r|a\\+|ab\\+|w\\+|wb\\+|x\\+|xb\\+|c\\+|cb\\+/';\n    const WRITABLE_MODES = '/a|w|r\\+|rb\\+|rw|x|c/';\n\n    private $stream;\n    private $size;\n    private $seekable;\n    private $readable;\n    private $writable;\n    private $uri;\n    private $customMetadata;\n\n    /**\n     * This constructor accepts an associative array of options.\n     *\n     * - size: (int) If a read stream would otherwise have an indeterminate\n     *   size, but the size is known due to foreknowledge, then you can\n     *   provide that size, in bytes.\n     * - metadata: (array) Any additional metadata to return when the metadata\n     *   of the stream is accessed.\n     *\n     * @param resource $stream  Stream resource to wrap.\n     * @param array    $options Associative array of options.\n     *\n     * @throws \\InvalidArgumentException if the stream is not a stream resource\n     */\n    public function __construct($stream, $options = [])\n    {\n        if (!is_resource($stream)) {\n            throw new \\InvalidArgumentException('Stream must be a resource');\n        }\n\n        if (isset($options['size'])) {\n            $this->size = $options['size'];\n        }\n\n        $this->customMetadata = isset($options['metadata'])\n            ? $options['metadata']\n            : [];\n\n        $this->stream = $stream;\n        $meta = stream_get_meta_data($this->stream);\n        $this->seekable = $meta['seekable'];\n        $this->readable = (bool)preg_match(self::READABLE_MODES, $meta['mode']);\n        $this->writable = (bool)preg_match(self::WRITABLE_MODES, $meta['mode']);\n        $this->uri = $this->getMetadata('uri');\n    }\n\n    /**\n     * Closes the stream when the destructed\n     */\n    public function __destruct()\n    {\n        $this->close();\n    }\n\n    public function __toString()\n    {\n        try {\n            $this->seek(0);\n            return (string) stream_get_contents($this->stream);\n        } catch (\\Exception $e) {\n            return '';\n        }\n    }\n\n    public function getContents()\n    {\n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n\n        $contents = stream_get_contents($this->stream);\n\n        if ($contents === false) {\n            throw new \\RuntimeException('Unable to read stream contents');\n        }\n\n        return $contents;\n    }\n\n    public function close()\n    {\n        if (isset($this->stream)) {\n            if (is_resource($this->stream)) {\n                fclose($this->stream);\n            }\n            $this->detach();\n        }\n    }\n\n    public function detach()\n    {\n        if (!isset($this->stream)) {\n            return null;\n        }\n\n        $result = $this->stream;\n        unset($this->stream);\n        $this->size = $this->uri = null;\n        $this->readable = $this->writable = $this->seekable = false;\n\n        return $result;\n    }\n\n    public function getSize()\n    {\n        if ($this->size !== null) {\n            return $this->size;\n        }\n\n        if (!isset($this->stream)) {\n            return null;\n        }\n\n        // Clear the stat cache if the stream has a URI\n        if ($this->uri) {\n            clearstatcache(true, $this->uri);\n        }\n\n        $stats = fstat($this->stream);\n        if (isset($stats['size'])) {\n            $this->size = $stats['size'];\n            return $this->size;\n        }\n\n        return null;\n    }\n\n    public function isReadable()\n    {\n        return $this->readable;\n    }\n\n    public function isWritable()\n    {\n        return $this->writable;\n    }\n\n    public function isSeekable()\n    {\n        return $this->seekable;\n    }\n\n    public function eof()\n    {\n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n\n        return feof($this->stream);\n    }\n\n    public function tell()\n    {\n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n\n        $result = ftell($this->stream);\n\n        if ($result === false) {\n            throw new \\RuntimeException('Unable to determine stream position');\n        }\n\n        return $result;\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        $whence = (int) $whence;\n        \n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n        if (!$this->seekable) {\n            throw new \\RuntimeException('Stream is not seekable');\n        }\n        if (fseek($this->stream, $offset, $whence) === -1) {\n            throw new \\RuntimeException('Unable to seek to stream position '\n                . $offset . ' with whence ' . var_export($whence, true));\n        }\n    }\n\n    public function read($length)\n    {\n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n        if (!$this->readable) {\n            throw new \\RuntimeException('Cannot read from non-readable stream');\n        }\n        if ($length < 0) {\n            throw new \\RuntimeException('Length parameter cannot be negative');\n        }\n\n        if (0 === $length) {\n            return '';\n        }\n\n        $string = fread($this->stream, $length);\n        if (false === $string) {\n            throw new \\RuntimeException('Unable to read from stream');\n        }\n\n        return $string;\n    }\n\n    public function write($string)\n    {\n        if (!isset($this->stream)) {\n            throw new \\RuntimeException('Stream is detached');\n        }\n        if (!$this->writable) {\n            throw new \\RuntimeException('Cannot write to a non-writable stream');\n        }\n\n        // We can't know the size after writing anything\n        $this->size = null;\n        $result = fwrite($this->stream, $string);\n\n        if ($result === false) {\n            throw new \\RuntimeException('Unable to write to stream');\n        }\n\n        return $result;\n    }\n\n    public function getMetadata($key = null)\n    {\n        if (!isset($this->stream)) {\n            return $key ? null : [];\n        } elseif (!$key) {\n            return $this->customMetadata + stream_get_meta_data($this->stream);\n        } elseif (isset($this->customMetadata[$key])) {\n            return $this->customMetadata[$key];\n        }\n\n        $meta = stream_get_meta_data($this->stream);\n\n        return isset($meta[$key]) ? $meta[$key] : null;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Stream decorator trait\n * @property StreamInterface stream\n */\ntrait StreamDecoratorTrait\n{\n    /**\n     * @param StreamInterface $stream Stream to decorate\n     */\n    public function __construct(StreamInterface $stream)\n    {\n        $this->stream = $stream;\n    }\n\n    /**\n     * Magic method used to create a new stream if streams are not added in\n     * the constructor of a decorator (e.g., LazyOpenStream).\n     *\n     * @param string $name Name of the property (allows \"stream\" only).\n     *\n     * @return StreamInterface\n     */\n    public function __get($name)\n    {\n        if ($name == 'stream') {\n            $this->stream = $this->createStream();\n            return $this->stream;\n        }\n\n        throw new \\UnexpectedValueException(\"$name not found on class\");\n    }\n\n    public function __toString()\n    {\n        try {\n            if ($this->isSeekable()) {\n                $this->seek(0);\n            }\n            return $this->getContents();\n        } catch (\\Exception $e) {\n            // Really, PHP? https://bugs.php.net/bug.php?id=53648\n            trigger_error('StreamDecorator::__toString exception: '\n                . (string) $e, E_USER_ERROR);\n            return '';\n        }\n    }\n\n    public function getContents()\n    {\n        return copy_to_string($this);\n    }\n\n    /**\n     * Allow decorators to implement custom methods\n     *\n     * @param string $method Missing method name\n     * @param array  $args   Method arguments\n     *\n     * @return mixed\n     */\n    public function __call($method, array $args)\n    {\n        $result = call_user_func_array([$this->stream, $method], $args);\n\n        // Always return the wrapped object if the result is a return $this\n        return $result === $this->stream ? $this : $result;\n    }\n\n    public function close()\n    {\n        $this->stream->close();\n    }\n\n    public function getMetadata($key = null)\n    {\n        return $this->stream->getMetadata($key);\n    }\n\n    public function detach()\n    {\n        return $this->stream->detach();\n    }\n\n    public function getSize()\n    {\n        return $this->stream->getSize();\n    }\n\n    public function eof()\n    {\n        return $this->stream->eof();\n    }\n\n    public function tell()\n    {\n        return $this->stream->tell();\n    }\n\n    public function isReadable()\n    {\n        return $this->stream->isReadable();\n    }\n\n    public function isWritable()\n    {\n        return $this->stream->isWritable();\n    }\n\n    public function isSeekable()\n    {\n        return $this->stream->isSeekable();\n    }\n\n    public function rewind()\n    {\n        $this->seek(0);\n    }\n\n    public function seek($offset, $whence = SEEK_SET)\n    {\n        $this->stream->seek($offset, $whence);\n    }\n\n    public function read($length)\n    {\n        return $this->stream->read($length);\n    }\n\n    public function write($string)\n    {\n        return $this->stream->write($string);\n    }\n\n    /**\n     * Implement in subclasses to dynamically create streams when requested.\n     *\n     * @return StreamInterface\n     * @throws \\BadMethodCallException\n     */\n    protected function createStream()\n    {\n        throw new \\BadMethodCallException('Not implemented');\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/StreamWrapper.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\StreamInterface;\n\n/**\n * Converts Guzzle streams into PHP stream resources.\n */\nclass StreamWrapper\n{\n    /** @var resource */\n    public $context;\n\n    /** @var StreamInterface */\n    private $stream;\n\n    /** @var string r, r+, or w */\n    private $mode;\n\n    /**\n     * Returns a resource representing the stream.\n     *\n     * @param StreamInterface $stream The stream to get a resource for\n     *\n     * @return resource\n     * @throws \\InvalidArgumentException if stream is not readable or writable\n     */\n    public static function getResource(StreamInterface $stream)\n    {\n        self::register();\n\n        if ($stream->isReadable()) {\n            $mode = $stream->isWritable() ? 'r+' : 'r';\n        } elseif ($stream->isWritable()) {\n            $mode = 'w';\n        } else {\n            throw new \\InvalidArgumentException('The stream must be readable, '\n                . 'writable, or both.');\n        }\n\n        return fopen('guzzle://stream', $mode, null, self::createStreamContext($stream));\n    }\n\n    /**\n     * Creates a stream context that can be used to open a stream as a php stream resource.\n     *\n     * @param StreamInterface $stream\n     *\n     * @return resource\n     */\n    public static function createStreamContext(StreamInterface $stream)\n    {\n        return stream_context_create([\n            'guzzle' => ['stream' => $stream]\n        ]);\n    }\n\n    /**\n     * Registers the stream wrapper if needed\n     */\n    public static function register()\n    {\n        if (!in_array('guzzle', stream_get_wrappers())) {\n            stream_wrapper_register('guzzle', __CLASS__);\n        }\n    }\n\n    public function stream_open($path, $mode, $options, &$opened_path)\n    {\n        $options = stream_context_get_options($this->context);\n\n        if (!isset($options['guzzle']['stream'])) {\n            return false;\n        }\n\n        $this->mode = $mode;\n        $this->stream = $options['guzzle']['stream'];\n\n        return true;\n    }\n\n    public function stream_read($count)\n    {\n        return $this->stream->read($count);\n    }\n\n    public function stream_write($data)\n    {\n        return (int) $this->stream->write($data);\n    }\n\n    public function stream_tell()\n    {\n        return $this->stream->tell();\n    }\n\n    public function stream_eof()\n    {\n        return $this->stream->eof();\n    }\n\n    public function stream_seek($offset, $whence)\n    {\n        $this->stream->seek($offset, $whence);\n\n        return true;\n    }\n\n    public function stream_cast($cast_as)\n    {\n        $stream = clone($this->stream);\n\n        return $stream->detach();\n    }\n\n    public function stream_stat()\n    {\n        static $modeMap = [\n            'r'  => 33060,\n            'rb' => 33060,\n            'r+' => 33206,\n            'w'  => 33188,\n            'wb' => 33188\n        ];\n\n        return [\n            'dev'     => 0,\n            'ino'     => 0,\n            'mode'    => $modeMap[$this->mode],\n            'nlink'   => 0,\n            'uid'     => 0,\n            'gid'     => 0,\n            'rdev'    => 0,\n            'size'    => $this->stream->getSize() ?: 0,\n            'atime'   => 0,\n            'mtime'   => 0,\n            'ctime'   => 0,\n            'blksize' => 0,\n            'blocks'  => 0\n        ];\n    }\n\n    public function url_stat($path, $flags)\n    {\n        return [\n            'dev'     => 0,\n            'ino'     => 0,\n            'mode'    => 0,\n            'nlink'   => 0,\n            'uid'     => 0,\n            'gid'     => 0,\n            'rdev'    => 0,\n            'size'    => 0,\n            'atime'   => 0,\n            'mtime'   => 0,\n            'ctime'   => 0,\n            'blksize' => 0,\n            'blocks'  => 0\n        ];\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/UploadedFile.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse InvalidArgumentException;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UploadedFileInterface;\nuse RuntimeException;\n\nclass UploadedFile implements UploadedFileInterface\n{\n    /**\n     * @var int[]\n     */\n    private static $errors = [\n        UPLOAD_ERR_OK,\n        UPLOAD_ERR_INI_SIZE,\n        UPLOAD_ERR_FORM_SIZE,\n        UPLOAD_ERR_PARTIAL,\n        UPLOAD_ERR_NO_FILE,\n        UPLOAD_ERR_NO_TMP_DIR,\n        UPLOAD_ERR_CANT_WRITE,\n        UPLOAD_ERR_EXTENSION,\n    ];\n\n    /**\n     * @var string\n     */\n    private $clientFilename;\n\n    /**\n     * @var string\n     */\n    private $clientMediaType;\n\n    /**\n     * @var int\n     */\n    private $error;\n\n    /**\n     * @var null|string\n     */\n    private $file;\n\n    /**\n     * @var bool\n     */\n    private $moved = false;\n\n    /**\n     * @var int\n     */\n    private $size;\n\n    /**\n     * @var StreamInterface|null\n     */\n    private $stream;\n\n    /**\n     * @param StreamInterface|string|resource $streamOrFile\n     * @param int $size\n     * @param int $errorStatus\n     * @param string|null $clientFilename\n     * @param string|null $clientMediaType\n     */\n    public function __construct(\n        $streamOrFile,\n        $size,\n        $errorStatus,\n        $clientFilename = null,\n        $clientMediaType = null\n    ) {\n        $this->setError($errorStatus);\n        $this->setSize($size);\n        $this->setClientFilename($clientFilename);\n        $this->setClientMediaType($clientMediaType);\n\n        if ($this->isOk()) {\n            $this->setStreamOrFile($streamOrFile);\n        }\n    }\n\n    /**\n     * Depending on the value set file or stream variable\n     *\n     * @param mixed $streamOrFile\n     * @throws InvalidArgumentException\n     */\n    private function setStreamOrFile($streamOrFile)\n    {\n        if (is_string($streamOrFile)) {\n            $this->file = $streamOrFile;\n        } elseif (is_resource($streamOrFile)) {\n            $this->stream = new Stream($streamOrFile);\n        } elseif ($streamOrFile instanceof StreamInterface) {\n            $this->stream = $streamOrFile;\n        } else {\n            throw new InvalidArgumentException(\n                'Invalid stream or file provided for UploadedFile'\n            );\n        }\n    }\n\n    /**\n     * @param int $error\n     * @throws InvalidArgumentException\n     */\n    private function setError($error)\n    {\n        if (false === is_int($error)) {\n            throw new InvalidArgumentException(\n                'Upload file error status must be an integer'\n            );\n        }\n\n        if (false === in_array($error, UploadedFile::$errors)) {\n            throw new InvalidArgumentException(\n                'Invalid error status for UploadedFile'\n            );\n        }\n\n        $this->error = $error;\n    }\n\n    /**\n     * @param int $size\n     * @throws InvalidArgumentException\n     */\n    private function setSize($size)\n    {\n        if (false === is_int($size)) {\n            throw new InvalidArgumentException(\n                'Upload file size must be an integer'\n            );\n        }\n\n        $this->size = $size;\n    }\n\n    /**\n     * @param mixed $param\n     * @return boolean\n     */\n    private function isStringOrNull($param)\n    {\n        return in_array(gettype($param), ['string', 'NULL']);\n    }\n\n    /**\n     * @param mixed $param\n     * @return boolean\n     */\n    private function isStringNotEmpty($param)\n    {\n        return is_string($param) && false === empty($param);\n    }\n\n    /**\n     * @param string|null $clientFilename\n     * @throws InvalidArgumentException\n     */\n    private function setClientFilename($clientFilename)\n    {\n        if (false === $this->isStringOrNull($clientFilename)) {\n            throw new InvalidArgumentException(\n                'Upload file client filename must be a string or null'\n            );\n        }\n\n        $this->clientFilename = $clientFilename;\n    }\n\n    /**\n     * @param string|null $clientMediaType\n     * @throws InvalidArgumentException\n     */\n    private function setClientMediaType($clientMediaType)\n    {\n        if (false === $this->isStringOrNull($clientMediaType)) {\n            throw new InvalidArgumentException(\n                'Upload file client media type must be a string or null'\n            );\n        }\n\n        $this->clientMediaType = $clientMediaType;\n    }\n\n    /**\n     * Return true if there is no upload error\n     *\n     * @return boolean\n     */\n    private function isOk()\n    {\n        return $this->error === UPLOAD_ERR_OK;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function isMoved()\n    {\n        return $this->moved;\n    }\n\n    /**\n     * @throws RuntimeException if is moved or not ok\n     */\n    private function validateActive()\n    {\n        if (false === $this->isOk()) {\n            throw new RuntimeException('Cannot retrieve stream due to upload error');\n        }\n\n        if ($this->isMoved()) {\n            throw new RuntimeException('Cannot retrieve stream after it has already been moved');\n        }\n    }\n\n    /**\n     * {@inheritdoc}\n     * @throws RuntimeException if the upload was not successful.\n     */\n    public function getStream()\n    {\n        $this->validateActive();\n\n        if ($this->stream instanceof StreamInterface) {\n            return $this->stream;\n        }\n\n        return new LazyOpenStream($this->file, 'r+');\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @see http://php.net/is_uploaded_file\n     * @see http://php.net/move_uploaded_file\n     * @param string $targetPath Path to which to move the uploaded file.\n     * @throws RuntimeException if the upload was not successful.\n     * @throws InvalidArgumentException if the $path specified is invalid.\n     * @throws RuntimeException on any error during the move operation, or on\n     *     the second or subsequent call to the method.\n     */\n    public function moveTo($targetPath)\n    {\n        $this->validateActive();\n\n        if (false === $this->isStringNotEmpty($targetPath)) {\n            throw new InvalidArgumentException(\n                'Invalid path provided for move operation; must be a non-empty string'\n            );\n        }\n\n        if ($this->file) {\n            $this->moved = php_sapi_name() == 'cli'\n                ? rename($this->file, $targetPath)\n                : move_uploaded_file($this->file, $targetPath);\n        } else {\n            copy_to_stream(\n                $this->getStream(),\n                new LazyOpenStream($targetPath, 'w')\n            );\n\n            $this->moved = true;\n        }\n\n        if (false === $this->moved) {\n            throw new RuntimeException(\n                sprintf('Uploaded file could not be moved to %s', $targetPath)\n            );\n        }\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @return int|null The file size in bytes or null if unknown.\n     */\n    public function getSize()\n    {\n        return $this->size;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @see http://php.net/manual/en/features.file-upload.errors.php\n     * @return int One of PHP's UPLOAD_ERR_XXX constants.\n     */\n    public function getError()\n    {\n        return $this->error;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @return string|null The filename sent by the client or null if none\n     *     was provided.\n     */\n    public function getClientFilename()\n    {\n        return $this->clientFilename;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getClientMediaType()\n    {\n        return $this->clientMediaType;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/Uri.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * PSR-7 URI implementation.\n *\n * @author Michael Dowling\n * @author Tobias Schultze\n * @author Matthew Weier O'Phinney\n */\nclass Uri implements UriInterface\n{\n    /**\n     * Absolute http and https URIs require a host per RFC 7230 Section 2.7\n     * but in generic URIs the host can be empty. So for http(s) URIs\n     * we apply this default host when no host is given yet to form a\n     * valid URI.\n     */\n    const HTTP_DEFAULT_HOST = 'localhost';\n\n    private static $defaultPorts = [\n        'http'  => 80,\n        'https' => 443,\n        'ftp' => 21,\n        'gopher' => 70,\n        'nntp' => 119,\n        'news' => 119,\n        'telnet' => 23,\n        'tn3270' => 23,\n        'imap' => 143,\n        'pop' => 110,\n        'ldap' => 389,\n    ];\n\n    private static $charUnreserved = 'a-zA-Z0-9_\\-\\.~';\n    private static $charSubDelims = '!\\$&\\'\\(\\)\\*\\+,;=';\n    private static $replaceQuery = ['=' => '%3D', '&' => '%26'];\n\n    /** @var string Uri scheme. */\n    private $scheme = '';\n\n    /** @var string Uri user info. */\n    private $userInfo = '';\n\n    /** @var string Uri host. */\n    private $host = '';\n\n    /** @var int|null Uri port. */\n    private $port;\n\n    /** @var string Uri path. */\n    private $path = '';\n\n    /** @var string Uri query string. */\n    private $query = '';\n\n    /** @var string Uri fragment. */\n    private $fragment = '';\n\n    /**\n     * @param string $uri URI to parse\n     */\n    public function __construct($uri = '')\n    {\n        // weak type check to also accept null until we can add scalar type hints\n        if ($uri != '') {\n            $parts = parse_url($uri);\n            if ($parts === false) {\n                throw new \\InvalidArgumentException(\"Unable to parse URI: $uri\");\n            }\n            $this->applyParts($parts);\n        }\n    }\n\n    public function __toString()\n    {\n        return self::composeComponents(\n            $this->scheme,\n            $this->getAuthority(),\n            $this->path,\n            $this->query,\n            $this->fragment\n        );\n    }\n\n    /**\n     * Composes a URI reference string from its various components.\n     *\n     * Usually this method does not need to be called manually but instead is used indirectly via\n     * `Psr\\Http\\Message\\UriInterface::__toString`.\n     *\n     * PSR-7 UriInterface treats an empty component the same as a missing component as\n     * getQuery(), getFragment() etc. always return a string. This explains the slight\n     * difference to RFC 3986 Section 5.3.\n     *\n     * Another adjustment is that the authority separator is added even when the authority is missing/empty\n     * for the \"file\" scheme. This is because PHP stream functions like `file_get_contents` only work with\n     * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But\n     * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to\n     * that format).\n     *\n     * @param string $scheme\n     * @param string $authority\n     * @param string $path\n     * @param string $query\n     * @param string $fragment\n     *\n     * @return string\n     *\n     * @link https://tools.ietf.org/html/rfc3986#section-5.3\n     */\n    public static function composeComponents($scheme, $authority, $path, $query, $fragment)\n    {\n        $uri = '';\n\n        // weak type checks to also accept null until we can add scalar type hints\n        if ($scheme != '') {\n            $uri .= $scheme . ':';\n        }\n\n        if ($authority != ''|| $scheme === 'file') {\n            $uri .= '//' . $authority;\n        }\n\n        $uri .= $path;\n\n        if ($query != '') {\n            $uri .= '?' . $query;\n        }\n\n        if ($fragment != '') {\n            $uri .= '#' . $fragment;\n        }\n\n        return $uri;\n    }\n\n    /**\n     * Whether the URI has the default port of the current scheme.\n     *\n     * `Psr\\Http\\Message\\UriInterface::getPort` may return null or the standard port. This method can be used\n     * independently of the implementation.\n     *\n     * @param UriInterface $uri\n     *\n     * @return bool\n     */\n    public static function isDefaultPort(UriInterface $uri)\n    {\n        return $uri->getPort() === null\n            || (isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]);\n    }\n\n    /**\n     * Whether the URI is absolute, i.e. it has a scheme.\n     *\n     * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true\n     * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative\n     * to another URI, the base URI. Relative references can be divided into several forms:\n     * - network-path references, e.g. '//example.com/path'\n     * - absolute-path references, e.g. '/path'\n     * - relative-path references, e.g. 'subpath'\n     *\n     * @param UriInterface $uri\n     *\n     * @return bool\n     * @see Uri::isNetworkPathReference\n     * @see Uri::isAbsolutePathReference\n     * @see Uri::isRelativePathReference\n     * @link https://tools.ietf.org/html/rfc3986#section-4\n     */\n    public static function isAbsolute(UriInterface $uri)\n    {\n        return $uri->getScheme() !== '';\n    }\n\n    /**\n     * Whether the URI is a network-path reference.\n     *\n     * A relative reference that begins with two slash characters is termed an network-path reference.\n     *\n     * @param UriInterface $uri\n     *\n     * @return bool\n     * @link https://tools.ietf.org/html/rfc3986#section-4.2\n     */\n    public static function isNetworkPathReference(UriInterface $uri)\n    {\n        return $uri->getScheme() === '' && $uri->getAuthority() !== '';\n    }\n\n    /**\n     * Whether the URI is a absolute-path reference.\n     *\n     * A relative reference that begins with a single slash character is termed an absolute-path reference.\n     *\n     * @param UriInterface $uri\n     *\n     * @return bool\n     * @link https://tools.ietf.org/html/rfc3986#section-4.2\n     */\n    public static function isAbsolutePathReference(UriInterface $uri)\n    {\n        return $uri->getScheme() === ''\n            && $uri->getAuthority() === ''\n            && isset($uri->getPath()[0])\n            && $uri->getPath()[0] === '/';\n    }\n\n    /**\n     * Whether the URI is a relative-path reference.\n     *\n     * A relative reference that does not begin with a slash character is termed a relative-path reference.\n     *\n     * @param UriInterface $uri\n     *\n     * @return bool\n     * @link https://tools.ietf.org/html/rfc3986#section-4.2\n     */\n    public static function isRelativePathReference(UriInterface $uri)\n    {\n        return $uri->getScheme() === ''\n            && $uri->getAuthority() === ''\n            && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/');\n    }\n\n    /**\n     * Whether the URI is a same-document reference.\n     *\n     * A same-document reference refers to a URI that is, aside from its fragment\n     * component, identical to the base URI. When no base URI is given, only an empty\n     * URI reference (apart from its fragment) is considered a same-document reference.\n     *\n     * @param UriInterface      $uri  The URI to check\n     * @param UriInterface|null $base An optional base URI to compare against\n     *\n     * @return bool\n     * @link https://tools.ietf.org/html/rfc3986#section-4.4\n     */\n    public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null)\n    {\n        if ($base !== null) {\n            $uri = UriResolver::resolve($base, $uri);\n\n            return ($uri->getScheme() === $base->getScheme())\n                && ($uri->getAuthority() === $base->getAuthority())\n                && ($uri->getPath() === $base->getPath())\n                && ($uri->getQuery() === $base->getQuery());\n        }\n\n        return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === '';\n    }\n\n    /**\n     * Removes dot segments from a path and returns the new path.\n     *\n     * @param string $path\n     *\n     * @return string\n     *\n     * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead.\n     * @see UriResolver::removeDotSegments\n     */\n    public static function removeDotSegments($path)\n    {\n        return UriResolver::removeDotSegments($path);\n    }\n\n    /**\n     * Converts the relative URI into a new URI that is resolved against the base URI.\n     *\n     * @param UriInterface        $base Base URI\n     * @param string|UriInterface $rel  Relative URI\n     *\n     * @return UriInterface\n     *\n     * @deprecated since version 1.4. Use UriResolver::resolve instead.\n     * @see UriResolver::resolve\n     */\n    public static function resolve(UriInterface $base, $rel)\n    {\n        if (!($rel instanceof UriInterface)) {\n            $rel = new self($rel);\n        }\n\n        return UriResolver::resolve($base, $rel);\n    }\n\n    /**\n     * Creates a new URI with a specific query string value removed.\n     *\n     * Any existing query string values that exactly match the provided key are\n     * removed.\n     *\n     * @param UriInterface $uri URI to use as a base.\n     * @param string       $key Query string key to remove.\n     *\n     * @return UriInterface\n     */\n    public static function withoutQueryValue(UriInterface $uri, $key)\n    {\n        $result = self::getFilteredQueryString($uri, [$key]);\n\n        return $uri->withQuery(implode('&', $result));\n    }\n\n    /**\n     * Creates a new URI with a specific query string value.\n     *\n     * Any existing query string values that exactly match the provided key are\n     * removed and replaced with the given key value pair.\n     *\n     * A value of null will set the query string key without a value, e.g. \"key\"\n     * instead of \"key=value\".\n     *\n     * @param UriInterface $uri   URI to use as a base.\n     * @param string       $key   Key to set.\n     * @param string|null  $value Value to set\n     *\n     * @return UriInterface\n     */\n    public static function withQueryValue(UriInterface $uri, $key, $value)\n    {\n        $result = self::getFilteredQueryString($uri, [$key]);\n\n        $result[] = self::generateQueryString($key, $value);\n\n        return $uri->withQuery(implode('&', $result));\n    }\n\n    /**\n     * Creates a new URI with multiple specific query string values.\n     *\n     * It has the same behavior as withQueryValue() but for an associative array of key => value.\n     *\n     * @param UriInterface $uri           URI to use as a base.\n     * @param array        $keyValueArray Associative array of key and values\n     *\n     * @return UriInterface\n     */\n    public static function withQueryValues(UriInterface $uri, array $keyValueArray)\n    {\n        $result = self::getFilteredQueryString($uri, array_keys($keyValueArray));\n\n        foreach ($keyValueArray as $key => $value) {\n            $result[] = self::generateQueryString($key, $value);\n        }\n\n        return $uri->withQuery(implode('&', $result));\n    }\n\n    /**\n     * Creates a URI from a hash of `parse_url` components.\n     *\n     * @param array $parts\n     *\n     * @return UriInterface\n     * @link http://php.net/manual/en/function.parse-url.php\n     *\n     * @throws \\InvalidArgumentException If the components do not form a valid URI.\n     */\n    public static function fromParts(array $parts)\n    {\n        $uri = new self();\n        $uri->applyParts($parts);\n        $uri->validateState();\n\n        return $uri;\n    }\n\n    public function getScheme()\n    {\n        return $this->scheme;\n    }\n\n    public function getAuthority()\n    {\n        $authority = $this->host;\n        if ($this->userInfo !== '') {\n            $authority = $this->userInfo . '@' . $authority;\n        }\n\n        if ($this->port !== null) {\n            $authority .= ':' . $this->port;\n        }\n\n        return $authority;\n    }\n\n    public function getUserInfo()\n    {\n        return $this->userInfo;\n    }\n\n    public function getHost()\n    {\n        return $this->host;\n    }\n\n    public function getPort()\n    {\n        return $this->port;\n    }\n\n    public function getPath()\n    {\n        return $this->path;\n    }\n\n    public function getQuery()\n    {\n        return $this->query;\n    }\n\n    public function getFragment()\n    {\n        return $this->fragment;\n    }\n\n    public function withScheme($scheme)\n    {\n        $scheme = $this->filterScheme($scheme);\n\n        if ($this->scheme === $scheme) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->scheme = $scheme;\n        $new->removeDefaultPort();\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withUserInfo($user, $password = null)\n    {\n        $info = $this->filterUserInfoComponent($user);\n        if ($password !== null) {\n            $info .= ':' . $this->filterUserInfoComponent($password);\n        }\n\n        if ($this->userInfo === $info) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->userInfo = $info;\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withHost($host)\n    {\n        $host = $this->filterHost($host);\n\n        if ($this->host === $host) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->host = $host;\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withPort($port)\n    {\n        $port = $this->filterPort($port);\n\n        if ($this->port === $port) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->port = $port;\n        $new->removeDefaultPort();\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withPath($path)\n    {\n        $path = $this->filterPath($path);\n\n        if ($this->path === $path) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->path = $path;\n        $new->validateState();\n\n        return $new;\n    }\n\n    public function withQuery($query)\n    {\n        $query = $this->filterQueryAndFragment($query);\n\n        if ($this->query === $query) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->query = $query;\n\n        return $new;\n    }\n\n    public function withFragment($fragment)\n    {\n        $fragment = $this->filterQueryAndFragment($fragment);\n\n        if ($this->fragment === $fragment) {\n            return $this;\n        }\n\n        $new = clone $this;\n        $new->fragment = $fragment;\n\n        return $new;\n    }\n\n    /**\n     * Apply parse_url parts to a URI.\n     *\n     * @param array $parts Array of parse_url parts to apply.\n     */\n    private function applyParts(array $parts)\n    {\n        $this->scheme = isset($parts['scheme'])\n            ? $this->filterScheme($parts['scheme'])\n            : '';\n        $this->userInfo = isset($parts['user'])\n            ? $this->filterUserInfoComponent($parts['user'])\n            : '';\n        $this->host = isset($parts['host'])\n            ? $this->filterHost($parts['host'])\n            : '';\n        $this->port = isset($parts['port'])\n            ? $this->filterPort($parts['port'])\n            : null;\n        $this->path = isset($parts['path'])\n            ? $this->filterPath($parts['path'])\n            : '';\n        $this->query = isset($parts['query'])\n            ? $this->filterQueryAndFragment($parts['query'])\n            : '';\n        $this->fragment = isset($parts['fragment'])\n            ? $this->filterQueryAndFragment($parts['fragment'])\n            : '';\n        if (isset($parts['pass'])) {\n            $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']);\n        }\n\n        $this->removeDefaultPort();\n    }\n\n    /**\n     * @param string $scheme\n     *\n     * @return string\n     *\n     * @throws \\InvalidArgumentException If the scheme is invalid.\n     */\n    private function filterScheme($scheme)\n    {\n        if (!is_string($scheme)) {\n            throw new \\InvalidArgumentException('Scheme must be a string');\n        }\n\n        return strtolower($scheme);\n    }\n\n    /**\n     * @param string $component\n     *\n     * @return string\n     *\n     * @throws \\InvalidArgumentException If the user info is invalid.\n     */\n    private function filterUserInfoComponent($component)\n    {\n        if (!is_string($component)) {\n            throw new \\InvalidArgumentException('User info must be a string');\n        }\n\n        return preg_replace_callback(\n            '/(?:[^%' . self::$charUnreserved . self::$charSubDelims . ']+|%(?![A-Fa-f0-9]{2}))/',\n            [$this, 'rawurlencodeMatchZero'],\n            $component\n        );\n    }\n\n    /**\n     * @param string $host\n     *\n     * @return string\n     *\n     * @throws \\InvalidArgumentException If the host is invalid.\n     */\n    private function filterHost($host)\n    {\n        if (!is_string($host)) {\n            throw new \\InvalidArgumentException('Host must be a string');\n        }\n\n        return strtolower($host);\n    }\n\n    /**\n     * @param int|null $port\n     *\n     * @return int|null\n     *\n     * @throws \\InvalidArgumentException If the port is invalid.\n     */\n    private function filterPort($port)\n    {\n        if ($port === null) {\n            return null;\n        }\n\n        $port = (int) $port;\n        if (0 > $port || 0xffff < $port) {\n            throw new \\InvalidArgumentException(\n                sprintf('Invalid port: %d. Must be between 0 and 65535', $port)\n            );\n        }\n\n        return $port;\n    }\n\n    /**\n     * @param UriInterface $uri\n     * @param array        $keys\n     * \n     * @return array\n     */\n    private static function getFilteredQueryString(UriInterface $uri, array $keys)\n    {\n        $current = $uri->getQuery();\n\n        if ($current === '') {\n            return [];\n        }\n\n        $decodedKeys = array_map('rawurldecode', $keys);\n\n        return array_filter(explode('&', $current), function ($part) use ($decodedKeys) {\n            return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true);\n        });\n    }\n\n    /**\n     * @param string      $key\n     * @param string|null $value\n     * \n     * @return string\n     */\n    private static function generateQueryString($key, $value)\n    {\n        // Query string separators (\"=\", \"&\") within the key or value need to be encoded\n        // (while preventing double-encoding) before setting the query string. All other\n        // chars that need percent-encoding will be encoded by withQuery().\n        $queryString = strtr($key, self::$replaceQuery);\n\n        if ($value !== null) {\n            $queryString .= '=' . strtr($value, self::$replaceQuery);\n        }\n\n        return $queryString;\n    }\n\n    private function removeDefaultPort()\n    {\n        if ($this->port !== null && self::isDefaultPort($this)) {\n            $this->port = null;\n        }\n    }\n\n    /**\n     * Filters the path of a URI\n     *\n     * @param string $path\n     *\n     * @return string\n     *\n     * @throws \\InvalidArgumentException If the path is invalid.\n     */\n    private function filterPath($path)\n    {\n        if (!is_string($path)) {\n            throw new \\InvalidArgumentException('Path must be a string');\n        }\n\n        return preg_replace_callback(\n            '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\\/]++|%(?![A-Fa-f0-9]{2}))/',\n            [$this, 'rawurlencodeMatchZero'],\n            $path\n        );\n    }\n\n    /**\n     * Filters the query string or fragment of a URI.\n     *\n     * @param string $str\n     *\n     * @return string\n     *\n     * @throws \\InvalidArgumentException If the query or fragment is invalid.\n     */\n    private function filterQueryAndFragment($str)\n    {\n        if (!is_string($str)) {\n            throw new \\InvalidArgumentException('Query and fragment must be a string');\n        }\n\n        return preg_replace_callback(\n            '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\\/\\?]++|%(?![A-Fa-f0-9]{2}))/',\n            [$this, 'rawurlencodeMatchZero'],\n            $str\n        );\n    }\n\n    private function rawurlencodeMatchZero(array $match)\n    {\n        return rawurlencode($match[0]);\n    }\n\n    private function validateState()\n    {\n        if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) {\n            $this->host = self::HTTP_DEFAULT_HOST;\n        }\n\n        if ($this->getAuthority() === '') {\n            if (0 === strpos($this->path, '//')) {\n                throw new \\InvalidArgumentException('The path of a URI without an authority must not start with two slashes \"//\"');\n            }\n            if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) {\n                throw new \\InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon');\n            }\n        } elseif (isset($this->path[0]) && $this->path[0] !== '/') {\n            @trigger_error(\n                'The path of a URI with an authority must start with a slash \"/\" or be empty. Automagically fixing the URI ' .\n                'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.',\n                E_USER_DEPRECATED\n            );\n            $this->path = '/'. $this->path;\n            //throw new \\InvalidArgumentException('The path of a URI with an authority must start with a slash \"/\" or be empty');\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/UriNormalizer.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Provides methods to normalize and compare URIs.\n *\n * @author Tobias Schultze\n *\n * @link https://tools.ietf.org/html/rfc3986#section-6\n */\nfinal class UriNormalizer\n{\n    /**\n     * Default normalizations which only include the ones that preserve semantics.\n     *\n     * self::CAPITALIZE_PERCENT_ENCODING | self::DECODE_UNRESERVED_CHARACTERS | self::CONVERT_EMPTY_PATH |\n     * self::REMOVE_DEFAULT_HOST | self::REMOVE_DEFAULT_PORT | self::REMOVE_DOT_SEGMENTS\n     */\n    const PRESERVING_NORMALIZATIONS = 63;\n\n    /**\n     * All letters within a percent-encoding triplet (e.g., \"%3A\") are case-insensitive, and should be capitalized.\n     *\n     * Example: http://example.org/a%c2%b1b → http://example.org/a%C2%B1b\n     */\n    const CAPITALIZE_PERCENT_ENCODING = 1;\n\n    /**\n     * Decodes percent-encoded octets of unreserved characters.\n     *\n     * For consistency, percent-encoded octets in the ranges of ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39),\n     * hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should not be created by URI producers and,\n     * when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers.\n     *\n     * Example: http://example.org/%7Eusern%61me/ → http://example.org/~username/\n     */\n    const DECODE_UNRESERVED_CHARACTERS = 2;\n\n    /**\n     * Converts the empty path to \"/\" for http and https URIs.\n     *\n     * Example: http://example.org → http://example.org/\n     */\n    const CONVERT_EMPTY_PATH = 4;\n\n    /**\n     * Removes the default host of the given URI scheme from the URI.\n     *\n     * Only the \"file\" scheme defines the default host \"localhost\".\n     * All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile`\n     * are equivalent according to RFC 3986. The first format is not accepted\n     * by PHPs stream functions and thus already normalized implicitly to the\n     * second format in the Uri class. See `GuzzleHttp\\Psr7\\Uri::composeComponents`.\n     *\n     * Example: file://localhost/myfile → file:///myfile\n     */\n    const REMOVE_DEFAULT_HOST = 8;\n\n    /**\n     * Removes the default port of the given URI scheme from the URI.\n     *\n     * Example: http://example.org:80/ → http://example.org/\n     */\n    const REMOVE_DEFAULT_PORT = 16;\n\n    /**\n     * Removes unnecessary dot-segments.\n     *\n     * Dot-segments in relative-path references are not removed as it would\n     * change the semantics of the URI reference.\n     *\n     * Example: http://example.org/../a/b/../c/./d.html → http://example.org/a/c/d.html\n     */\n    const REMOVE_DOT_SEGMENTS = 32;\n\n    /**\n     * Paths which include two or more adjacent slashes are converted to one.\n     *\n     * Webservers usually ignore duplicate slashes and treat those URIs equivalent.\n     * But in theory those URIs do not need to be equivalent. So this normalization\n     * may change the semantics. Encoded slashes (%2F) are not removed.\n     *\n     * Example: http://example.org//foo///bar.html → http://example.org/foo/bar.html\n     */\n    const REMOVE_DUPLICATE_SLASHES = 64;\n\n    /**\n     * Sort query parameters with their values in alphabetical order.\n     *\n     * However, the order of parameters in a URI may be significant (this is not defined by the standard).\n     * So this normalization is not safe and may change the semantics of the URI.\n     *\n     * Example: ?lang=en&article=fred → ?article=fred&lang=en\n     *\n     * Note: The sorting is neither locale nor Unicode aware (the URI query does not get decoded at all) as the\n     * purpose is to be able to compare URIs in a reproducible way, not to have the params sorted perfectly.\n     */\n    const SORT_QUERY_PARAMETERS = 128;\n\n    /**\n     * Returns a normalized URI.\n     *\n     * The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.\n     * This methods adds additional normalizations that can be configured with the $flags parameter.\n     *\n     * PSR-7 UriInterface cannot distinguish between an empty component and a missing component as\n     * getQuery(), getFragment() etc. always return a string. This means the URIs \"/?#\" and \"/\" are\n     * treated equivalent which is not necessarily true according to RFC 3986. But that difference\n     * is highly uncommon in reality. So this potential normalization is implied in PSR-7 as well.\n     *\n     * @param UriInterface $uri   The URI to normalize\n     * @param int          $flags A bitmask of normalizations to apply, see constants\n     *\n     * @return UriInterface The normalized URI\n     * @link https://tools.ietf.org/html/rfc3986#section-6.2\n     */\n    public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS)\n    {\n        if ($flags & self::CAPITALIZE_PERCENT_ENCODING) {\n            $uri = self::capitalizePercentEncoding($uri);\n        }\n\n        if ($flags & self::DECODE_UNRESERVED_CHARACTERS) {\n            $uri = self::decodeUnreservedCharacters($uri);\n        }\n\n        if ($flags & self::CONVERT_EMPTY_PATH && $uri->getPath() === '' &&\n            ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')\n        ) {\n            $uri = $uri->withPath('/');\n        }\n\n        if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') {\n            $uri = $uri->withHost('');\n        }\n\n        if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) {\n            $uri = $uri->withPort(null);\n        }\n\n        if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) {\n            $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath()));\n        }\n\n        if ($flags & self::REMOVE_DUPLICATE_SLASHES) {\n            $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath()));\n        }\n\n        if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') {\n            $queryKeyValues = explode('&', $uri->getQuery());\n            sort($queryKeyValues);\n            $uri = $uri->withQuery(implode('&', $queryKeyValues));\n        }\n\n        return $uri;\n    }\n\n    /**\n     * Whether two URIs can be considered equivalent.\n     *\n     * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also\n     * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be\n     * resolved against the same base URI. If this is not the case, determination of equivalence or difference of\n     * relative references does not mean anything.\n     *\n     * @param UriInterface $uri1           An URI to compare\n     * @param UriInterface $uri2           An URI to compare\n     * @param int          $normalizations A bitmask of normalizations to apply, see constants\n     *\n     * @return bool\n     * @link https://tools.ietf.org/html/rfc3986#section-6.1\n     */\n    public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS)\n    {\n        return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations);\n    }\n\n    private static function capitalizePercentEncoding(UriInterface $uri)\n    {\n        $regex = '/(?:%[A-Fa-f0-9]{2})++/';\n\n        $callback = function (array $match) {\n            return strtoupper($match[0]);\n        };\n\n        return\n            $uri->withPath(\n                preg_replace_callback($regex, $callback, $uri->getPath())\n            )->withQuery(\n                preg_replace_callback($regex, $callback, $uri->getQuery())\n            );\n    }\n\n    private static function decodeUnreservedCharacters(UriInterface $uri)\n    {\n        $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i';\n\n        $callback = function (array $match) {\n            return rawurldecode($match[0]);\n        };\n\n        return\n            $uri->withPath(\n                preg_replace_callback($regex, $callback, $uri->getPath())\n            )->withQuery(\n                preg_replace_callback($regex, $callback, $uri->getQuery())\n            );\n    }\n\n    private function __construct()\n    {\n        // cannot be instantiated\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/UriResolver.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Resolves a URI reference in the context of a base URI and the opposite way.\n *\n * @author Tobias Schultze\n *\n * @link https://tools.ietf.org/html/rfc3986#section-5\n */\nfinal class UriResolver\n{\n    /**\n     * Removes dot segments from a path and returns the new path.\n     *\n     * @param string $path\n     *\n     * @return string\n     * @link http://tools.ietf.org/html/rfc3986#section-5.2.4\n     */\n    public static function removeDotSegments($path)\n    {\n        if ($path === '' || $path === '/') {\n            return $path;\n        }\n\n        $results = [];\n        $segments = explode('/', $path);\n        foreach ($segments as $segment) {\n            if ($segment === '..') {\n                array_pop($results);\n            } elseif ($segment !== '.') {\n                $results[] = $segment;\n            }\n        }\n\n        $newPath = implode('/', $results);\n\n        if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) {\n            // Re-add the leading slash if necessary for cases like \"/..\"\n            $newPath = '/' . $newPath;\n        } elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) {\n            // Add the trailing slash if necessary\n            // If newPath is not empty, then $segment must be set and is the last segment from the foreach\n            $newPath .= '/';\n        }\n\n        return $newPath;\n    }\n\n    /**\n     * Converts the relative URI into a new URI that is resolved against the base URI.\n     *\n     * @param UriInterface $base Base URI\n     * @param UriInterface $rel  Relative URI\n     *\n     * @return UriInterface\n     * @link http://tools.ietf.org/html/rfc3986#section-5.2\n     */\n    public static function resolve(UriInterface $base, UriInterface $rel)\n    {\n        if ((string) $rel === '') {\n            // we can simply return the same base URI instance for this same-document reference\n            return $base;\n        }\n\n        if ($rel->getScheme() != '') {\n            return $rel->withPath(self::removeDotSegments($rel->getPath()));\n        }\n\n        if ($rel->getAuthority() != '') {\n            $targetAuthority = $rel->getAuthority();\n            $targetPath = self::removeDotSegments($rel->getPath());\n            $targetQuery = $rel->getQuery();\n        } else {\n            $targetAuthority = $base->getAuthority();\n            if ($rel->getPath() === '') {\n                $targetPath = $base->getPath();\n                $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery();\n            } else {\n                if ($rel->getPath()[0] === '/') {\n                    $targetPath = $rel->getPath();\n                } else {\n                    if ($targetAuthority != '' && $base->getPath() === '') {\n                        $targetPath = '/' . $rel->getPath();\n                    } else {\n                        $lastSlashPos = strrpos($base->getPath(), '/');\n                        if ($lastSlashPos === false) {\n                            $targetPath = $rel->getPath();\n                        } else {\n                            $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath();\n                        }\n                    }\n                }\n                $targetPath = self::removeDotSegments($targetPath);\n                $targetQuery = $rel->getQuery();\n            }\n        }\n\n        return new Uri(Uri::composeComponents(\n            $base->getScheme(),\n            $targetAuthority,\n            $targetPath,\n            $targetQuery,\n            $rel->getFragment()\n        ));\n    }\n\n    /**\n     * Returns the target URI as a relative reference from the base URI.\n     *\n     * This method is the counterpart to resolve():\n     *\n     *    (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))\n     *\n     * One use-case is to use the current request URI as base URI and then generate relative links in your documents\n     * to reduce the document size or offer self-contained downloadable document archives.\n     *\n     *    $base = new Uri('http://example.com/a/b/');\n     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c'));  // prints 'c'.\n     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y'));  // prints '../x/y'.\n     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.\n     *    echo UriResolver::relativize($base, new Uri('http://example.org/a/b/'));   // prints '//example.org/a/b/'.\n     *\n     * This method also accepts a target that is already relative and will try to relativize it further. Only a\n     * relative-path reference will be returned as-is.\n     *\n     *    echo UriResolver::relativize($base, new Uri('/a/b/c'));  // prints 'c' as well\n     *\n     * @param UriInterface $base   Base URI\n     * @param UriInterface $target Target URI\n     *\n     * @return UriInterface The relative URI reference\n     */\n    public static function relativize(UriInterface $base, UriInterface $target)\n    {\n        if ($target->getScheme() !== '' &&\n            ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')\n        ) {\n            return $target;\n        }\n\n        if (Uri::isRelativePathReference($target)) {\n            // As the target is already highly relative we return it as-is. It would be possible to resolve\n            // the target with `$target = self::resolve($base, $target);` and then try make it more relative\n            // by removing a duplicate query. But let's not do that automatically.\n            return $target;\n        }\n\n        if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) {\n            return $target->withScheme('');\n        }\n\n        // We must remove the path before removing the authority because if the path starts with two slashes, the URI\n        // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also\n        // invalid.\n        $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost('');\n\n        if ($base->getPath() !== $target->getPath()) {\n            return $emptyPathUri->withPath(self::getRelativePath($base, $target));\n        }\n\n        if ($base->getQuery() === $target->getQuery()) {\n            // Only the target fragment is left. And it must be returned even if base and target fragment are the same.\n            return $emptyPathUri->withQuery('');\n        }\n\n        // If the base URI has a query but the target has none, we cannot return an empty path reference as it would\n        // inherit the base query component when resolving.\n        if ($target->getQuery() === '') {\n            $segments = explode('/', $target->getPath());\n            $lastSegment = end($segments);\n\n            return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment);\n        }\n\n        return $emptyPathUri;\n    }\n\n    private static function getRelativePath(UriInterface $base, UriInterface $target)\n    {\n        $sourceSegments = explode('/', $base->getPath());\n        $targetSegments = explode('/', $target->getPath());\n        array_pop($sourceSegments);\n        $targetLastSegment = array_pop($targetSegments);\n        foreach ($sourceSegments as $i => $segment) {\n            if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) {\n                unset($sourceSegments[$i], $targetSegments[$i]);\n            } else {\n                break;\n            }\n        }\n        $targetSegments[] = $targetLastSegment;\n        $relativePath = str_repeat('../', count($sourceSegments)) . implode('/', $targetSegments);\n\n        // A reference to am empty last segment or an empty first sub-segment must be prefixed with \"./\".\n        // This also applies to a segment with a colon character (e.g., \"file:colon\") that cannot be used\n        // as the first segment of a relative-path reference, as it would be mistaken for a scheme name.\n        if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) {\n            $relativePath = \"./$relativePath\";\n        } elseif ('/' === $relativePath[0]) {\n            if ($base->getAuthority() != '' && $base->getPath() === '') {\n                // In this case an extra slash is added by resolve() automatically. So we must not add one here.\n                $relativePath = \".$relativePath\";\n            } else {\n                $relativePath = \"./$relativePath\";\n            }\n        }\n\n        return $relativePath;\n    }\n\n    private function __construct()\n    {\n        // cannot be instantiated\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/functions.php",
    "content": "<?php\nnamespace GuzzleHttp\\Psr7;\n\nuse Psr\\Http\\Message\\MessageInterface;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\ServerRequestInterface;\nuse Psr\\Http\\Message\\StreamInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\n/**\n * Returns the string representation of an HTTP message.\n *\n * @param MessageInterface $message Message to convert to a string.\n *\n * @return string\n */\nfunction str(MessageInterface $message)\n{\n    if ($message instanceof RequestInterface) {\n        $msg = trim($message->getMethod() . ' '\n                . $message->getRequestTarget())\n            . ' HTTP/' . $message->getProtocolVersion();\n        if (!$message->hasHeader('host')) {\n            $msg .= \"\\r\\nHost: \" . $message->getUri()->getHost();\n        }\n    } elseif ($message instanceof ResponseInterface) {\n        $msg = 'HTTP/' . $message->getProtocolVersion() . ' '\n            . $message->getStatusCode() . ' '\n            . $message->getReasonPhrase();\n    } else {\n        throw new \\InvalidArgumentException('Unknown message type');\n    }\n\n    foreach ($message->getHeaders() as $name => $values) {\n        $msg .= \"\\r\\n{$name}: \" . implode(', ', $values);\n    }\n\n    return \"{$msg}\\r\\n\\r\\n\" . $message->getBody();\n}\n\n/**\n * Returns a UriInterface for the given value.\n *\n * This function accepts a string or {@see Psr\\Http\\Message\\UriInterface} and\n * returns a UriInterface for the given value. If the value is already a\n * `UriInterface`, it is returned as-is.\n *\n * @param string|UriInterface $uri\n *\n * @return UriInterface\n * @throws \\InvalidArgumentException\n */\nfunction uri_for($uri)\n{\n    if ($uri instanceof UriInterface) {\n        return $uri;\n    } elseif (is_string($uri)) {\n        return new Uri($uri);\n    }\n\n    throw new \\InvalidArgumentException('URI must be a string or UriInterface');\n}\n\n/**\n * Create a new stream based on the input type.\n *\n * Options is an associative array that can contain the following keys:\n * - metadata: Array of custom metadata.\n * - size: Size of the stream.\n *\n * @param resource|string|null|int|float|bool|StreamInterface|callable|\\Iterator $resource Entity body data\n * @param array                                                                  $options  Additional options\n *\n * @return StreamInterface\n * @throws \\InvalidArgumentException if the $resource arg is not valid.\n */\nfunction stream_for($resource = '', array $options = [])\n{\n    if (is_scalar($resource)) {\n        $stream = fopen('php://temp', 'r+');\n        if ($resource !== '') {\n            fwrite($stream, $resource);\n            fseek($stream, 0);\n        }\n        return new Stream($stream, $options);\n    }\n\n    switch (gettype($resource)) {\n        case 'resource':\n            return new Stream($resource, $options);\n        case 'object':\n            if ($resource instanceof StreamInterface) {\n                return $resource;\n            } elseif ($resource instanceof \\Iterator) {\n                return new PumpStream(function () use ($resource) {\n                    if (!$resource->valid()) {\n                        return false;\n                    }\n                    $result = $resource->current();\n                    $resource->next();\n                    return $result;\n                }, $options);\n            } elseif (method_exists($resource, '__toString')) {\n                return stream_for((string) $resource, $options);\n            }\n            break;\n        case 'NULL':\n            return new Stream(fopen('php://temp', 'r+'), $options);\n    }\n\n    if (is_callable($resource)) {\n        return new PumpStream($resource, $options);\n    }\n\n    throw new \\InvalidArgumentException('Invalid resource type: ' . gettype($resource));\n}\n\n/**\n * Parse an array of header values containing \";\" separated data into an\n * array of associative arrays representing the header key value pair\n * data of the header. When a parameter does not contain a value, but just\n * contains a key, this function will inject a key with a '' string value.\n *\n * @param string|array $header Header to parse into components.\n *\n * @return array Returns the parsed header values.\n */\nfunction parse_header($header)\n{\n    static $trimmed = \"\\\"'  \\n\\t\\r\";\n    $params = $matches = [];\n\n    foreach (normalize_header($header) as $val) {\n        $part = [];\n        foreach (preg_split('/;(?=([^\"]*\"[^\"]*\")*[^\"]*$)/', $val) as $kvp) {\n            if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {\n                $m = $matches[0];\n                if (isset($m[1])) {\n                    $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed);\n                } else {\n                    $part[] = trim($m[0], $trimmed);\n                }\n            }\n        }\n        if ($part) {\n            $params[] = $part;\n        }\n    }\n\n    return $params;\n}\n\n/**\n * Converts an array of header values that may contain comma separated\n * headers into an array of headers with no comma separated values.\n *\n * @param string|array $header Header to normalize.\n *\n * @return array Returns the normalized header field values.\n */\nfunction normalize_header($header)\n{\n    if (!is_array($header)) {\n        return array_map('trim', explode(',', $header));\n    }\n\n    $result = [];\n    foreach ($header as $value) {\n        foreach ((array) $value as $v) {\n            if (strpos($v, ',') === false) {\n                $result[] = $v;\n                continue;\n            }\n            foreach (preg_split('/,(?=([^\"]*\"[^\"]*\")*[^\"]*$)/', $v) as $vv) {\n                $result[] = trim($vv);\n            }\n        }\n    }\n\n    return $result;\n}\n\n/**\n * Clone and modify a request with the given changes.\n *\n * The changes can be one of:\n * - method: (string) Changes the HTTP method.\n * - set_headers: (array) Sets the given headers.\n * - remove_headers: (array) Remove the given headers.\n * - body: (mixed) Sets the given body.\n * - uri: (UriInterface) Set the URI.\n * - query: (string) Set the query string value of the URI.\n * - version: (string) Set the protocol version.\n *\n * @param RequestInterface $request Request to clone and modify.\n * @param array            $changes Changes to apply.\n *\n * @return RequestInterface\n */\nfunction modify_request(RequestInterface $request, array $changes)\n{\n    if (!$changes) {\n        return $request;\n    }\n\n    $headers = $request->getHeaders();\n\n    if (!isset($changes['uri'])) {\n        $uri = $request->getUri();\n    } else {\n        // Remove the host header if one is on the URI\n        if ($host = $changes['uri']->getHost()) {\n            $changes['set_headers']['Host'] = $host;\n\n            if ($port = $changes['uri']->getPort()) {\n                $standardPorts = ['http' => 80, 'https' => 443];\n                $scheme = $changes['uri']->getScheme();\n                if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) {\n                    $changes['set_headers']['Host'] .= ':'.$port;\n                }\n            }\n        }\n        $uri = $changes['uri'];\n    }\n\n    if (!empty($changes['remove_headers'])) {\n        $headers = _caseless_remove($changes['remove_headers'], $headers);\n    }\n\n    if (!empty($changes['set_headers'])) {\n        $headers = _caseless_remove(array_keys($changes['set_headers']), $headers);\n        $headers = $changes['set_headers'] + $headers;\n    }\n\n    if (isset($changes['query'])) {\n        $uri = $uri->withQuery($changes['query']);\n    }\n\n    if ($request instanceof ServerRequestInterface) {\n        return (new ServerRequest(\n            isset($changes['method']) ? $changes['method'] : $request->getMethod(),\n            $uri,\n            $headers,\n            isset($changes['body']) ? $changes['body'] : $request->getBody(),\n            isset($changes['version'])\n                ? $changes['version']\n                : $request->getProtocolVersion(),\n            $request->getServerParams()\n        ))\n        ->withParsedBody($request->getParsedBody())\n        ->withQueryParams($request->getQueryParams())\n        ->withCookieParams($request->getCookieParams())\n        ->withUploadedFiles($request->getUploadedFiles());\n    }\n\n    return new Request(\n        isset($changes['method']) ? $changes['method'] : $request->getMethod(),\n        $uri,\n        $headers,\n        isset($changes['body']) ? $changes['body'] : $request->getBody(),\n        isset($changes['version'])\n            ? $changes['version']\n            : $request->getProtocolVersion()\n    );\n}\n\n/**\n * Attempts to rewind a message body and throws an exception on failure.\n *\n * The body of the message will only be rewound if a call to `tell()` returns a\n * value other than `0`.\n *\n * @param MessageInterface $message Message to rewind\n *\n * @throws \\RuntimeException\n */\nfunction rewind_body(MessageInterface $message)\n{\n    $body = $message->getBody();\n\n    if ($body->tell()) {\n        $body->rewind();\n    }\n}\n\n/**\n * Safely opens a PHP stream resource using a filename.\n *\n * When fopen fails, PHP normally raises a warning. This function adds an\n * error handler that checks for errors and throws an exception instead.\n *\n * @param string $filename File to open\n * @param string $mode     Mode used to open the file\n *\n * @return resource\n * @throws \\RuntimeException if the file cannot be opened\n */\nfunction try_fopen($filename, $mode)\n{\n    $ex = null;\n    set_error_handler(function () use ($filename, $mode, &$ex) {\n        $ex = new \\RuntimeException(sprintf(\n            'Unable to open %s using mode %s: %s',\n            $filename,\n            $mode,\n            func_get_args()[1]\n        ));\n    });\n\n    $handle = fopen($filename, $mode);\n    restore_error_handler();\n\n    if ($ex) {\n        /** @var $ex \\RuntimeException */\n        throw $ex;\n    }\n\n    return $handle;\n}\n\n/**\n * Copy the contents of a stream into a string until the given number of\n * bytes have been read.\n *\n * @param StreamInterface $stream Stream to read\n * @param int             $maxLen Maximum number of bytes to read. Pass -1\n *                                to read the entire stream.\n * @return string\n * @throws \\RuntimeException on error.\n */\nfunction copy_to_string(StreamInterface $stream, $maxLen = -1)\n{\n    $buffer = '';\n\n    if ($maxLen === -1) {\n        while (!$stream->eof()) {\n            $buf = $stream->read(1048576);\n            // Using a loose equality here to match on '' and false.\n            if ($buf == null) {\n                break;\n            }\n            $buffer .= $buf;\n        }\n        return $buffer;\n    }\n\n    $len = 0;\n    while (!$stream->eof() && $len < $maxLen) {\n        $buf = $stream->read($maxLen - $len);\n        // Using a loose equality here to match on '' and false.\n        if ($buf == null) {\n            break;\n        }\n        $buffer .= $buf;\n        $len = strlen($buffer);\n    }\n\n    return $buffer;\n}\n\n/**\n * Copy the contents of a stream into another stream until the given number\n * of bytes have been read.\n *\n * @param StreamInterface $source Stream to read from\n * @param StreamInterface $dest   Stream to write to\n * @param int             $maxLen Maximum number of bytes to read. Pass -1\n *                                to read the entire stream.\n *\n * @throws \\RuntimeException on error.\n */\nfunction copy_to_stream(\n    StreamInterface $source,\n    StreamInterface $dest,\n    $maxLen = -1\n) {\n    $bufferSize = 8192;\n\n    if ($maxLen === -1) {\n        while (!$source->eof()) {\n            if (!$dest->write($source->read($bufferSize))) {\n                break;\n            }\n        }\n    } else {\n        $remaining = $maxLen;\n        while ($remaining > 0 && !$source->eof()) {\n            $buf = $source->read(min($bufferSize, $remaining));\n            $len = strlen($buf);\n            if (!$len) {\n                break;\n            }\n            $remaining -= $len;\n            $dest->write($buf);\n        }\n    }\n}\n\n/**\n * Calculate a hash of a Stream\n *\n * @param StreamInterface $stream    Stream to calculate the hash for\n * @param string          $algo      Hash algorithm (e.g. md5, crc32, etc)\n * @param bool            $rawOutput Whether or not to use raw output\n *\n * @return string Returns the hash of the stream\n * @throws \\RuntimeException on error.\n */\nfunction hash(\n    StreamInterface $stream,\n    $algo,\n    $rawOutput = false\n) {\n    $pos = $stream->tell();\n\n    if ($pos > 0) {\n        $stream->rewind();\n    }\n\n    $ctx = hash_init($algo);\n    while (!$stream->eof()) {\n        hash_update($ctx, $stream->read(1048576));\n    }\n\n    $out = hash_final($ctx, (bool) $rawOutput);\n    $stream->seek($pos);\n\n    return $out;\n}\n\n/**\n * Read a line from the stream up to the maximum allowed buffer length\n *\n * @param StreamInterface $stream    Stream to read from\n * @param int             $maxLength Maximum buffer length\n *\n * @return string\n */\nfunction readline(StreamInterface $stream, $maxLength = null)\n{\n    $buffer = '';\n    $size = 0;\n\n    while (!$stream->eof()) {\n        // Using a loose equality here to match on '' and false.\n        if (null == ($byte = $stream->read(1))) {\n            return $buffer;\n        }\n        $buffer .= $byte;\n        // Break when a new line is found or the max length - 1 is reached\n        if ($byte === \"\\n\" || ++$size === $maxLength - 1) {\n            break;\n        }\n    }\n\n    return $buffer;\n}\n\n/**\n * Parses a request message string into a request object.\n *\n * @param string $message Request message string.\n *\n * @return Request\n */\nfunction parse_request($message)\n{\n    $data = _parse_message($message);\n    $matches = [];\n    if (!preg_match('/^[\\S]+\\s+([a-zA-Z]+:\\/\\/|\\/).*/', $data['start-line'], $matches)) {\n        throw new \\InvalidArgumentException('Invalid request string');\n    }\n    $parts = explode(' ', $data['start-line'], 3);\n    $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1';\n\n    $request = new Request(\n        $parts[0],\n        $matches[1] === '/' ? _parse_request_uri($parts[1], $data['headers']) : $parts[1],\n        $data['headers'],\n        $data['body'],\n        $version\n    );\n\n    return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]);\n}\n\n/**\n * Parses a response message string into a response object.\n *\n * @param string $message Response message string.\n *\n * @return Response\n */\nfunction parse_response($message)\n{\n    $data = _parse_message($message);\n    // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space\n    // between status-code and reason-phrase is required. But browsers accept\n    // responses without space and reason as well.\n    if (!preg_match('/^HTTP\\/.* [0-9]{3}( .*|$)/', $data['start-line'])) {\n        throw new \\InvalidArgumentException('Invalid response string: ' . $data['start-line']);\n    }\n    $parts = explode(' ', $data['start-line'], 3);\n\n    return new Response(\n        $parts[1],\n        $data['headers'],\n        $data['body'],\n        explode('/', $parts[0])[1],\n        isset($parts[2]) ? $parts[2] : null\n    );\n}\n\n/**\n * Parse a query string into an associative array.\n *\n * If multiple values are found for the same key, the value of that key\n * value pair will become an array. This function does not parse nested\n * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will\n * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']).\n *\n * @param string   $str         Query string to parse\n * @param int|bool $urlEncoding How the query string is encoded\n *\n * @return array\n */\nfunction parse_query($str, $urlEncoding = true)\n{\n    $result = [];\n\n    if ($str === '') {\n        return $result;\n    }\n\n    if ($urlEncoding === true) {\n        $decoder = function ($value) {\n            return rawurldecode(str_replace('+', ' ', $value));\n        };\n    } elseif ($urlEncoding === PHP_QUERY_RFC3986) {\n        $decoder = 'rawurldecode';\n    } elseif ($urlEncoding === PHP_QUERY_RFC1738) {\n        $decoder = 'urldecode';\n    } else {\n        $decoder = function ($str) { return $str; };\n    }\n\n    foreach (explode('&', $str) as $kvp) {\n        $parts = explode('=', $kvp, 2);\n        $key = $decoder($parts[0]);\n        $value = isset($parts[1]) ? $decoder($parts[1]) : null;\n        if (!isset($result[$key])) {\n            $result[$key] = $value;\n        } else {\n            if (!is_array($result[$key])) {\n                $result[$key] = [$result[$key]];\n            }\n            $result[$key][] = $value;\n        }\n    }\n\n    return $result;\n}\n\n/**\n * Build a query string from an array of key value pairs.\n *\n * This function can use the return value of parse_query() to build a query\n * string. This function does not modify the provided keys when an array is\n * encountered (like http_build_query would).\n *\n * @param array     $params   Query string parameters.\n * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986\n *                            to encode using RFC3986, or PHP_QUERY_RFC1738\n *                            to encode using RFC1738.\n * @return string\n */\nfunction build_query(array $params, $encoding = PHP_QUERY_RFC3986)\n{\n    if (!$params) {\n        return '';\n    }\n\n    if ($encoding === false) {\n        $encoder = function ($str) { return $str; };\n    } elseif ($encoding === PHP_QUERY_RFC3986) {\n        $encoder = 'rawurlencode';\n    } elseif ($encoding === PHP_QUERY_RFC1738) {\n        $encoder = 'urlencode';\n    } else {\n        throw new \\InvalidArgumentException('Invalid type');\n    }\n\n    $qs = '';\n    foreach ($params as $k => $v) {\n        $k = $encoder($k);\n        if (!is_array($v)) {\n            $qs .= $k;\n            if ($v !== null) {\n                $qs .= '=' . $encoder($v);\n            }\n            $qs .= '&';\n        } else {\n            foreach ($v as $vv) {\n                $qs .= $k;\n                if ($vv !== null) {\n                    $qs .= '=' . $encoder($vv);\n                }\n                $qs .= '&';\n            }\n        }\n    }\n\n    return $qs ? (string) substr($qs, 0, -1) : '';\n}\n\n/**\n * Determines the mimetype of a file by looking at its extension.\n *\n * @param $filename\n *\n * @return null|string\n */\nfunction mimetype_from_filename($filename)\n{\n    return mimetype_from_extension(pathinfo($filename, PATHINFO_EXTENSION));\n}\n\n/**\n * Maps a file extensions to a mimetype.\n *\n * @param $extension string The file extension.\n *\n * @return string|null\n * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types\n */\nfunction mimetype_from_extension($extension)\n{\n    static $mimetypes = [\n        '3gp' => 'video/3gpp',\n        '7z' => 'application/x-7z-compressed',\n        'aac' => 'audio/x-aac',\n        'ai' => 'application/postscript',\n        'aif' => 'audio/x-aiff',\n        'asc' => 'text/plain',\n        'asf' => 'video/x-ms-asf',\n        'atom' => 'application/atom+xml',\n        'avi' => 'video/x-msvideo',\n        'bmp' => 'image/bmp',\n        'bz2' => 'application/x-bzip2',\n        'cer' => 'application/pkix-cert',\n        'crl' => 'application/pkix-crl',\n        'crt' => 'application/x-x509-ca-cert',\n        'css' => 'text/css',\n        'csv' => 'text/csv',\n        'cu' => 'application/cu-seeme',\n        'deb' => 'application/x-debian-package',\n        'doc' => 'application/msword',\n        'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n        'dvi' => 'application/x-dvi',\n        'eot' => 'application/vnd.ms-fontobject',\n        'eps' => 'application/postscript',\n        'epub' => 'application/epub+zip',\n        'etx' => 'text/x-setext',\n        'flac' => 'audio/flac',\n        'flv' => 'video/x-flv',\n        'gif' => 'image/gif',\n        'gz' => 'application/gzip',\n        'htm' => 'text/html',\n        'html' => 'text/html',\n        'ico' => 'image/x-icon',\n        'ics' => 'text/calendar',\n        'ini' => 'text/plain',\n        'iso' => 'application/x-iso9660-image',\n        'jar' => 'application/java-archive',\n        'jpe' => 'image/jpeg',\n        'jpeg' => 'image/jpeg',\n        'jpg' => 'image/jpeg',\n        'js' => 'text/javascript',\n        'json' => 'application/json',\n        'latex' => 'application/x-latex',\n        'log' => 'text/plain',\n        'm4a' => 'audio/mp4',\n        'm4v' => 'video/mp4',\n        'mid' => 'audio/midi',\n        'midi' => 'audio/midi',\n        'mov' => 'video/quicktime',\n        'mkv' => 'video/x-matroska',\n        'mp3' => 'audio/mpeg',\n        'mp4' => 'video/mp4',\n        'mp4a' => 'audio/mp4',\n        'mp4v' => 'video/mp4',\n        'mpe' => 'video/mpeg',\n        'mpeg' => 'video/mpeg',\n        'mpg' => 'video/mpeg',\n        'mpg4' => 'video/mp4',\n        'oga' => 'audio/ogg',\n        'ogg' => 'audio/ogg',\n        'ogv' => 'video/ogg',\n        'ogx' => 'application/ogg',\n        'pbm' => 'image/x-portable-bitmap',\n        'pdf' => 'application/pdf',\n        'pgm' => 'image/x-portable-graymap',\n        'png' => 'image/png',\n        'pnm' => 'image/x-portable-anymap',\n        'ppm' => 'image/x-portable-pixmap',\n        'ppt' => 'application/vnd.ms-powerpoint',\n        'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n        'ps' => 'application/postscript',\n        'qt' => 'video/quicktime',\n        'rar' => 'application/x-rar-compressed',\n        'ras' => 'image/x-cmu-raster',\n        'rss' => 'application/rss+xml',\n        'rtf' => 'application/rtf',\n        'sgm' => 'text/sgml',\n        'sgml' => 'text/sgml',\n        'svg' => 'image/svg+xml',\n        'swf' => 'application/x-shockwave-flash',\n        'tar' => 'application/x-tar',\n        'tif' => 'image/tiff',\n        'tiff' => 'image/tiff',\n        'torrent' => 'application/x-bittorrent',\n        'ttf' => 'application/x-font-ttf',\n        'txt' => 'text/plain',\n        'wav' => 'audio/x-wav',\n        'webm' => 'video/webm',\n        'webp' => 'image/webp',\n        'wma' => 'audio/x-ms-wma',\n        'wmv' => 'video/x-ms-wmv',\n        'woff' => 'application/x-font-woff',\n        'wsdl' => 'application/wsdl+xml',\n        'xbm' => 'image/x-xbitmap',\n        'xls' => 'application/vnd.ms-excel',\n        'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n        'xml' => 'application/xml',\n        'xpm' => 'image/x-xpixmap',\n        'xwd' => 'image/x-xwindowdump',\n        'yaml' => 'text/yaml',\n        'yml' => 'text/yaml',\n        'zip' => 'application/zip',\n    ];\n\n    $extension = strtolower($extension);\n\n    return isset($mimetypes[$extension])\n        ? $mimetypes[$extension]\n        : null;\n}\n\n/**\n * Parses an HTTP message into an associative array.\n *\n * The array contains the \"start-line\" key containing the start line of\n * the message, \"headers\" key containing an associative array of header\n * array values, and a \"body\" key containing the body of the message.\n *\n * @param string $message HTTP request or response to parse.\n *\n * @return array\n * @internal\n */\nfunction _parse_message($message)\n{\n    if (!$message) {\n        throw new \\InvalidArgumentException('Invalid message');\n    }\n\n    $message = ltrim($message, \"\\r\\n\");\n\n    $messageParts = preg_split(\"/\\r?\\n\\r?\\n/\", $message, 2);\n\n    if ($messageParts === false || count($messageParts) !== 2) {\n        throw new \\InvalidArgumentException('Invalid message: Missing header delimiter');\n    }\n\n    list($rawHeaders, $body) = $messageParts;\n    $rawHeaders .= \"\\r\\n\"; // Put back the delimiter we split previously\n    $headerParts = preg_split(\"/\\r?\\n/\", $rawHeaders, 2);\n\n    if ($headerParts === false || count($headerParts) !== 2) {\n        throw new \\InvalidArgumentException('Invalid message: Missing status line');\n    }\n\n    list($startLine, $rawHeaders) = $headerParts;\n\n    if (preg_match(\"/(?:^HTTP\\/|^[A-Z]+ \\S+ HTTP\\/)(\\d+(?:\\.\\d+)?)/i\", $startLine, $matches) && $matches[1] === '1.0') {\n        // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0\n        $rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders);\n    }\n\n    /** @var array[] $headerLines */\n    $count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER);\n\n    // If these aren't the same, then one line didn't match and there's an invalid header.\n    if ($count !== substr_count($rawHeaders, \"\\n\")) {\n        // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4\n        if (preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) {\n            throw new \\InvalidArgumentException('Invalid header syntax: Obsolete line folding');\n        }\n\n        throw new \\InvalidArgumentException('Invalid header syntax');\n    }\n\n    $headers = [];\n\n    foreach ($headerLines as $headerLine) {\n        $headers[$headerLine[1]][] = $headerLine[2];\n    }\n\n    return [\n        'start-line' => $startLine,\n        'headers' => $headers,\n        'body' => $body,\n    ];\n}\n\n/**\n * Constructs a URI for an HTTP request message.\n *\n * @param string $path    Path from the start-line\n * @param array  $headers Array of headers (each value an array).\n *\n * @return string\n * @internal\n */\nfunction _parse_request_uri($path, array $headers)\n{\n    $hostKey = array_filter(array_keys($headers), function ($k) {\n        return strtolower($k) === 'host';\n    });\n\n    // If no host is found, then a full URI cannot be constructed.\n    if (!$hostKey) {\n        return $path;\n    }\n\n    $host = $headers[reset($hostKey)][0];\n    $scheme = substr($host, -4) === ':443' ? 'https' : 'http';\n\n    return $scheme . '://' . $host . '/' . ltrim($path, '/');\n}\n\n/**\n * Get a short summary of the message body\n *\n * Will return `null` if the response is not printable.\n *\n * @param MessageInterface $message    The message to get the body summary\n * @param int              $truncateAt The maximum allowed size of the summary\n *\n * @return null|string\n */\nfunction get_message_body_summary(MessageInterface $message, $truncateAt = 120)\n{\n    $body = $message->getBody();\n\n    if (!$body->isSeekable() || !$body->isReadable()) {\n        return null;\n    }\n\n    $size = $body->getSize();\n\n    if ($size === 0) {\n        return null;\n    }\n\n    $summary = $body->read($truncateAt);\n    $body->rewind();\n\n    if ($size > $truncateAt) {\n        $summary .= ' (truncated...)';\n    }\n\n    // Matches any printable character, including unicode characters:\n    // letters, marks, numbers, punctuation, spacing, and separators.\n    if (preg_match('/[^\\pL\\pM\\pN\\pP\\pS\\pZ\\n\\r\\t]/', $summary)) {\n        return null;\n    }\n\n    return $summary;\n}\n\n/** @internal */\nfunction _caseless_remove($keys, array $data)\n{\n    $result = [];\n\n    foreach ($keys as &$key) {\n        $key = strtolower($key);\n    }\n\n    foreach ($data as $k => $v) {\n        if (!in_array(strtolower($k), $keys)) {\n            $result[$k] = $v;\n        }\n    }\n\n    return $result;\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/functions_include.php",
    "content": "<?php\n\n// Don't redefine the functions if included multiple times.\nif (!function_exists('GuzzleHttp\\Psr7\\str')) {\n    require __DIR__ . '/functions.php';\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to this project will be documented in this file, in reverse chronological order by release.\n\n## 1.0.1 - 2016-08-06\n\n### Added\n\n- Nothing.\n\n### Deprecated\n\n- Nothing.\n\n### Removed\n\n- Nothing.\n\n### Fixed\n\n- Updated all `@return self` annotation references in interfaces to use\n  `@return static`, which more closelly follows the semantics of the\n  specification.\n- Updated the `MessageInterface::getHeaders()` return annotation to use the\n  value `string[][]`, indicating the format is a nested array of strings.\n- Updated the `@link` annotation for `RequestInterface::withRequestTarget()`\n  to point to the correct section of RFC 7230.\n- Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation\n  to add the parameter name (`$uploadedFiles`).\n- Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()`\n  method to correctly reference the method parameter (it was referencing an\n  incorrect parameter name previously).\n\n## 1.0.0 - 2016-05-18\n\nInitial stable release; reflects accepted PSR-7 specification.\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/LICENSE",
    "content": "Copyright (c) 2014 PHP Framework Interoperability Group\n\nPermission is hereby granted, free of charge, to any person obtaining a copy \nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights \nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in \nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/README.md",
    "content": "PSR Http Message\n================\n\nThis repository holds all interfaces/classes/traits related to\n[PSR-7](http://www.php-fig.org/psr/psr-7/).\n\nNote that this is not a HTTP message implementation of its own. It is merely an\ninterface that describes a HTTP message. See the specification for more details.\n\nUsage\n-----\n\nWe'll certainly need some stuff in here."
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/composer.json",
    "content": "{\n    \"name\": \"psr/http-message\",\n    \"description\": \"Common interface for HTTP messages\",\n    \"keywords\": [\"psr\", \"psr-7\", \"http\", \"http-message\", \"request\", \"response\"],\n    \"homepage\": \"https://github.com/php-fig/http-message\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"http://www.php-fig.org/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.3.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.0.x-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/src/MessageInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * HTTP messages consist of requests from a client to a server and responses\n * from a server to a client. This interface defines the methods common to\n * each.\n *\n * Messages are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n *\n * @link http://www.ietf.org/rfc/rfc7230.txt\n * @link http://www.ietf.org/rfc/rfc7231.txt\n */\ninterface MessageInterface\n{\n    /**\n     * Retrieves the HTTP protocol version as a string.\n     *\n     * The string MUST contain only the HTTP version number (e.g., \"1.1\", \"1.0\").\n     *\n     * @return string HTTP protocol version.\n     */\n    public function getProtocolVersion();\n\n    /**\n     * Return an instance with the specified HTTP protocol version.\n     *\n     * The version string MUST contain only the HTTP version number (e.g.,\n     * \"1.1\", \"1.0\").\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new protocol version.\n     *\n     * @param string $version HTTP protocol version\n     * @return static\n     */\n    public function withProtocolVersion($version);\n\n    /**\n     * Retrieves all message header values.\n     *\n     * The keys represent the header name as it will be sent over the wire, and\n     * each value is an array of strings associated with the header.\n     *\n     *     // Represent the headers as a string\n     *     foreach ($message->getHeaders() as $name => $values) {\n     *         echo $name . \": \" . implode(\", \", $values);\n     *     }\n     *\n     *     // Emit headers iteratively:\n     *     foreach ($message->getHeaders() as $name => $values) {\n     *         foreach ($values as $value) {\n     *             header(sprintf('%s: %s', $name, $value), false);\n     *         }\n     *     }\n     *\n     * While header names are not case-sensitive, getHeaders() will preserve the\n     * exact case in which headers were originally specified.\n     *\n     * @return string[][] Returns an associative array of the message's headers. Each\n     *     key MUST be a header name, and each value MUST be an array of strings\n     *     for that header.\n     */\n    public function getHeaders();\n\n    /**\n     * Checks if a header exists by the given case-insensitive name.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return bool Returns true if any header names match the given header\n     *     name using a case-insensitive string comparison. Returns false if\n     *     no matching header name is found in the message.\n     */\n    public function hasHeader($name);\n\n    /**\n     * Retrieves a message header value by the given case-insensitive name.\n     *\n     * This method returns an array of all the header values of the given\n     * case-insensitive header name.\n     *\n     * If the header does not appear in the message, this method MUST return an\n     * empty array.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return string[] An array of string values as provided for the given\n     *    header. If the header does not appear in the message, this method MUST\n     *    return an empty array.\n     */\n    public function getHeader($name);\n\n    /**\n     * Retrieves a comma-separated string of the values for a single header.\n     *\n     * This method returns all of the header values of the given\n     * case-insensitive header name as a string concatenated together using\n     * a comma.\n     *\n     * NOTE: Not all header values may be appropriately represented using\n     * comma concatenation. For such headers, use getHeader() instead\n     * and supply your own delimiter when concatenating.\n     *\n     * If the header does not appear in the message, this method MUST return\n     * an empty string.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return string A string of values as provided for the given header\n     *    concatenated together using a comma. If the header does not appear in\n     *    the message, this method MUST return an empty string.\n     */\n    public function getHeaderLine($name);\n\n    /**\n     * Return an instance with the provided value replacing the specified header.\n     *\n     * While header names are case-insensitive, the casing of the header will\n     * be preserved by this function, and returned from getHeaders().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new and/or updated header and value.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @param string|string[] $value Header value(s).\n     * @return static\n     * @throws \\InvalidArgumentException for invalid header names or values.\n     */\n    public function withHeader($name, $value);\n\n    /**\n     * Return an instance with the specified header appended with the given value.\n     *\n     * Existing values for the specified header will be maintained. The new\n     * value(s) will be appended to the existing list. If the header did not\n     * exist previously, it will be added.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new header and/or value.\n     *\n     * @param string $name Case-insensitive header field name to add.\n     * @param string|string[] $value Header value(s).\n     * @return static\n     * @throws \\InvalidArgumentException for invalid header names or values.\n     */\n    public function withAddedHeader($name, $value);\n\n    /**\n     * Return an instance without the specified header.\n     *\n     * Header resolution MUST be done without case-sensitivity.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that removes\n     * the named header.\n     *\n     * @param string $name Case-insensitive header field name to remove.\n     * @return static\n     */\n    public function withoutHeader($name);\n\n    /**\n     * Gets the body of the message.\n     *\n     * @return StreamInterface Returns the body as a stream.\n     */\n    public function getBody();\n\n    /**\n     * Return an instance with the specified message body.\n     *\n     * The body MUST be a StreamInterface object.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return a new instance that has the\n     * new body stream.\n     *\n     * @param StreamInterface $body Body.\n     * @return static\n     * @throws \\InvalidArgumentException When the body is not valid.\n     */\n    public function withBody(StreamInterface $body);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/src/RequestInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Representation of an outgoing, client-side request.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - HTTP method\n * - URI\n * - Headers\n * - Message body\n *\n * During construction, implementations MUST attempt to set the Host header from\n * a provided URI if no Host header is provided.\n *\n * Requests are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n */\ninterface RequestInterface extends MessageInterface\n{\n    /**\n     * Retrieves the message's request target.\n     *\n     * Retrieves the message's request-target either as it will appear (for\n     * clients), as it appeared at request (for servers), or as it was\n     * specified for the instance (see withRequestTarget()).\n     *\n     * In most cases, this will be the origin-form of the composed URI,\n     * unless a value was provided to the concrete implementation (see\n     * withRequestTarget() below).\n     *\n     * If no URI is available, and no request-target has been specifically\n     * provided, this method MUST return the string \"/\".\n     *\n     * @return string\n     */\n    public function getRequestTarget();\n\n    /**\n     * Return an instance with the specific request-target.\n     *\n     * If the request needs a non-origin-form request-target — e.g., for\n     * specifying an absolute-form, authority-form, or asterisk-form —\n     * this method may be used to create an instance with the specified\n     * request-target, verbatim.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * changed request target.\n     *\n     * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various\n     *     request-target forms allowed in request messages)\n     * @param mixed $requestTarget\n     * @return static\n     */\n    public function withRequestTarget($requestTarget);\n\n    /**\n     * Retrieves the HTTP method of the request.\n     *\n     * @return string Returns the request method.\n     */\n    public function getMethod();\n\n    /**\n     * Return an instance with the provided HTTP method.\n     *\n     * While HTTP method names are typically all uppercase characters, HTTP\n     * method names are case-sensitive and thus implementations SHOULD NOT\n     * modify the given string.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * changed request method.\n     *\n     * @param string $method Case-sensitive method.\n     * @return static\n     * @throws \\InvalidArgumentException for invalid HTTP methods.\n     */\n    public function withMethod($method);\n\n    /**\n     * Retrieves the URI instance.\n     *\n     * This method MUST return a UriInterface instance.\n     *\n     * @link http://tools.ietf.org/html/rfc3986#section-4.3\n     * @return UriInterface Returns a UriInterface instance\n     *     representing the URI of the request.\n     */\n    public function getUri();\n\n    /**\n     * Returns an instance with the provided URI.\n     *\n     * This method MUST update the Host header of the returned request by\n     * default if the URI contains a host component. If the URI does not\n     * contain a host component, any pre-existing Host header MUST be carried\n     * over to the returned request.\n     *\n     * You can opt-in to preserving the original state of the Host header by\n     * setting `$preserveHost` to `true`. When `$preserveHost` is set to\n     * `true`, this method interacts with the Host header in the following ways:\n     *\n     * - If the Host header is missing or empty, and the new URI contains\n     *   a host component, this method MUST update the Host header in the returned\n     *   request.\n     * - If the Host header is missing or empty, and the new URI does not contain a\n     *   host component, this method MUST NOT update the Host header in the returned\n     *   request.\n     * - If a Host header is present and non-empty, this method MUST NOT update\n     *   the Host header in the returned request.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new UriInterface instance.\n     *\n     * @link http://tools.ietf.org/html/rfc3986#section-4.3\n     * @param UriInterface $uri New request URI to use.\n     * @param bool $preserveHost Preserve the original state of the Host header.\n     * @return static\n     */\n    public function withUri(UriInterface $uri, $preserveHost = false);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/src/ResponseInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Representation of an outgoing, server-side response.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - Status code and reason phrase\n * - Headers\n * - Message body\n *\n * Responses are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n */\ninterface ResponseInterface extends MessageInterface\n{\n    /**\n     * Gets the response status code.\n     *\n     * The status code is a 3-digit integer result code of the server's attempt\n     * to understand and satisfy the request.\n     *\n     * @return int Status code.\n     */\n    public function getStatusCode();\n\n    /**\n     * Return an instance with the specified status code and, optionally, reason phrase.\n     *\n     * If no reason phrase is specified, implementations MAY choose to default\n     * to the RFC 7231 or IANA recommended reason phrase for the response's\n     * status code.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated status and reason phrase.\n     *\n     * @link http://tools.ietf.org/html/rfc7231#section-6\n     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n     * @param int $code The 3-digit integer result code to set.\n     * @param string $reasonPhrase The reason phrase to use with the\n     *     provided status code; if none is provided, implementations MAY\n     *     use the defaults as suggested in the HTTP specification.\n     * @return static\n     * @throws \\InvalidArgumentException For invalid status code arguments.\n     */\n    public function withStatus($code, $reasonPhrase = '');\n\n    /**\n     * Gets the response reason phrase associated with the status code.\n     *\n     * Because a reason phrase is not a required element in a response\n     * status line, the reason phrase value MAY be null. Implementations MAY\n     * choose to return the default RFC 7231 recommended reason phrase (or those\n     * listed in the IANA HTTP Status Code Registry) for the response's\n     * status code.\n     *\n     * @link http://tools.ietf.org/html/rfc7231#section-6\n     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n     * @return string Reason phrase; must return an empty string if none present.\n     */\n    public function getReasonPhrase();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/src/ServerRequestInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Representation of an incoming, server-side HTTP request.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - HTTP method\n * - URI\n * - Headers\n * - Message body\n *\n * Additionally, it encapsulates all data as it has arrived to the\n * application from the CGI and/or PHP environment, including:\n *\n * - The values represented in $_SERVER.\n * - Any cookies provided (generally via $_COOKIE)\n * - Query string arguments (generally via $_GET, or as parsed via parse_str())\n * - Upload files, if any (as represented by $_FILES)\n * - Deserialized body parameters (generally from $_POST)\n *\n * $_SERVER values MUST be treated as immutable, as they represent application\n * state at the time of request; as such, no methods are provided to allow\n * modification of those values. The other values provide such methods, as they\n * can be restored from $_SERVER or the request body, and may need treatment\n * during the application (e.g., body parameters may be deserialized based on\n * content type).\n *\n * Additionally, this interface recognizes the utility of introspecting a\n * request to derive and match additional parameters (e.g., via URI path\n * matching, decrypting cookie values, deserializing non-form-encoded body\n * content, matching authorization headers to users, etc). These parameters\n * are stored in an \"attributes\" property.\n *\n * Requests are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n */\ninterface ServerRequestInterface extends RequestInterface\n{\n    /**\n     * Retrieve server parameters.\n     *\n     * Retrieves data related to the incoming request environment,\n     * typically derived from PHP's $_SERVER superglobal. The data IS NOT\n     * REQUIRED to originate from $_SERVER.\n     *\n     * @return array\n     */\n    public function getServerParams();\n\n    /**\n     * Retrieve cookies.\n     *\n     * Retrieves cookies sent by the client to the server.\n     *\n     * The data MUST be compatible with the structure of the $_COOKIE\n     * superglobal.\n     *\n     * @return array\n     */\n    public function getCookieParams();\n\n    /**\n     * Return an instance with the specified cookies.\n     *\n     * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST\n     * be compatible with the structure of $_COOKIE. Typically, this data will\n     * be injected at instantiation.\n     *\n     * This method MUST NOT update the related Cookie header of the request\n     * instance, nor related values in the server params.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated cookie values.\n     *\n     * @param array $cookies Array of key/value pairs representing cookies.\n     * @return static\n     */\n    public function withCookieParams(array $cookies);\n\n    /**\n     * Retrieve query string arguments.\n     *\n     * Retrieves the deserialized query string arguments, if any.\n     *\n     * Note: the query params might not be in sync with the URI or server\n     * params. If you need to ensure you are only getting the original\n     * values, you may need to parse the query string from `getUri()->getQuery()`\n     * or from the `QUERY_STRING` server param.\n     *\n     * @return array\n     */\n    public function getQueryParams();\n\n    /**\n     * Return an instance with the specified query string arguments.\n     *\n     * These values SHOULD remain immutable over the course of the incoming\n     * request. They MAY be injected during instantiation, such as from PHP's\n     * $_GET superglobal, or MAY be derived from some other value such as the\n     * URI. In cases where the arguments are parsed from the URI, the data\n     * MUST be compatible with what PHP's parse_str() would return for\n     * purposes of how duplicate query parameters are handled, and how nested\n     * sets are handled.\n     *\n     * Setting query string arguments MUST NOT change the URI stored by the\n     * request, nor the values in the server params.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated query string arguments.\n     *\n     * @param array $query Array of query string arguments, typically from\n     *     $_GET.\n     * @return static\n     */\n    public function withQueryParams(array $query);\n\n    /**\n     * Retrieve normalized file upload data.\n     *\n     * This method returns upload metadata in a normalized tree, with each leaf\n     * an instance of Psr\\Http\\Message\\UploadedFileInterface.\n     *\n     * These values MAY be prepared from $_FILES or the message body during\n     * instantiation, or MAY be injected via withUploadedFiles().\n     *\n     * @return array An array tree of UploadedFileInterface instances; an empty\n     *     array MUST be returned if no data is present.\n     */\n    public function getUploadedFiles();\n\n    /**\n     * Create a new instance with the specified uploaded files.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated body parameters.\n     *\n     * @param array $uploadedFiles An array tree of UploadedFileInterface instances.\n     * @return static\n     * @throws \\InvalidArgumentException if an invalid structure is provided.\n     */\n    public function withUploadedFiles(array $uploadedFiles);\n\n    /**\n     * Retrieve any parameters provided in the request body.\n     *\n     * If the request Content-Type is either application/x-www-form-urlencoded\n     * or multipart/form-data, and the request method is POST, this method MUST\n     * return the contents of $_POST.\n     *\n     * Otherwise, this method may return any results of deserializing\n     * the request body content; as parsing returns structured content, the\n     * potential types MUST be arrays or objects only. A null value indicates\n     * the absence of body content.\n     *\n     * @return null|array|object The deserialized body parameters, if any.\n     *     These will typically be an array or object.\n     */\n    public function getParsedBody();\n\n    /**\n     * Return an instance with the specified body parameters.\n     *\n     * These MAY be injected during instantiation.\n     *\n     * If the request Content-Type is either application/x-www-form-urlencoded\n     * or multipart/form-data, and the request method is POST, use this method\n     * ONLY to inject the contents of $_POST.\n     *\n     * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of\n     * deserializing the request body content. Deserialization/parsing returns\n     * structured data, and, as such, this method ONLY accepts arrays or objects,\n     * or a null value if nothing was available to parse.\n     *\n     * As an example, if content negotiation determines that the request data\n     * is a JSON payload, this method could be used to create a request\n     * instance with the deserialized parameters.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated body parameters.\n     *\n     * @param null|array|object $data The deserialized body data. This will\n     *     typically be in an array or object.\n     * @return static\n     * @throws \\InvalidArgumentException if an unsupported argument type is\n     *     provided.\n     */\n    public function withParsedBody($data);\n\n    /**\n     * Retrieve attributes derived from the request.\n     *\n     * The request \"attributes\" may be used to allow injection of any\n     * parameters derived from the request: e.g., the results of path\n     * match operations; the results of decrypting cookies; the results of\n     * deserializing non-form-encoded message bodies; etc. Attributes\n     * will be application and request specific, and CAN be mutable.\n     *\n     * @return array Attributes derived from the request.\n     */\n    public function getAttributes();\n\n    /**\n     * Retrieve a single derived request attribute.\n     *\n     * Retrieves a single derived request attribute as described in\n     * getAttributes(). If the attribute has not been previously set, returns\n     * the default value as provided.\n     *\n     * This method obviates the need for a hasAttribute() method, as it allows\n     * specifying a default value to return if the attribute is not found.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @param mixed $default Default value to return if the attribute does not exist.\n     * @return mixed\n     */\n    public function getAttribute($name, $default = null);\n\n    /**\n     * Return an instance with the specified derived request attribute.\n     *\n     * This method allows setting a single derived request attribute as\n     * described in getAttributes().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated attribute.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @param mixed $value The value of the attribute.\n     * @return static\n     */\n    public function withAttribute($name, $value);\n\n    /**\n     * Return an instance that removes the specified derived request attribute.\n     *\n     * This method allows removing a single derived request attribute as\n     * described in getAttributes().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that removes\n     * the attribute.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @return static\n     */\n    public function withoutAttribute($name);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/src/StreamInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Describes a data stream.\n *\n * Typically, an instance will wrap a PHP stream; this interface provides\n * a wrapper around the most common operations, including serialization of\n * the entire stream to a string.\n */\ninterface StreamInterface\n{\n    /**\n     * Reads all data from the stream into a string, from the beginning to end.\n     *\n     * This method MUST attempt to seek to the beginning of the stream before\n     * reading data and read the stream until the end is reached.\n     *\n     * Warning: This could attempt to load a large amount of data into memory.\n     *\n     * This method MUST NOT raise an exception in order to conform with PHP's\n     * string casting operations.\n     *\n     * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring\n     * @return string\n     */\n    public function __toString();\n\n    /**\n     * Closes the stream and any underlying resources.\n     *\n     * @return void\n     */\n    public function close();\n\n    /**\n     * Separates any underlying resources from the stream.\n     *\n     * After the stream has been detached, the stream is in an unusable state.\n     *\n     * @return resource|null Underlying PHP stream, if any\n     */\n    public function detach();\n\n    /**\n     * Get the size of the stream if known.\n     *\n     * @return int|null Returns the size in bytes if known, or null if unknown.\n     */\n    public function getSize();\n\n    /**\n     * Returns the current position of the file read/write pointer\n     *\n     * @return int Position of the file pointer\n     * @throws \\RuntimeException on error.\n     */\n    public function tell();\n\n    /**\n     * Returns true if the stream is at the end of the stream.\n     *\n     * @return bool\n     */\n    public function eof();\n\n    /**\n     * Returns whether or not the stream is seekable.\n     *\n     * @return bool\n     */\n    public function isSeekable();\n\n    /**\n     * Seek to a position in the stream.\n     *\n     * @link http://www.php.net/manual/en/function.fseek.php\n     * @param int $offset Stream offset\n     * @param int $whence Specifies how the cursor position will be calculated\n     *     based on the seek offset. Valid values are identical to the built-in\n     *     PHP $whence values for `fseek()`.  SEEK_SET: Set position equal to\n     *     offset bytes SEEK_CUR: Set position to current location plus offset\n     *     SEEK_END: Set position to end-of-stream plus offset.\n     * @throws \\RuntimeException on failure.\n     */\n    public function seek($offset, $whence = SEEK_SET);\n\n    /**\n     * Seek to the beginning of the stream.\n     *\n     * If the stream is not seekable, this method will raise an exception;\n     * otherwise, it will perform a seek(0).\n     *\n     * @see seek()\n     * @link http://www.php.net/manual/en/function.fseek.php\n     * @throws \\RuntimeException on failure.\n     */\n    public function rewind();\n\n    /**\n     * Returns whether or not the stream is writable.\n     *\n     * @return bool\n     */\n    public function isWritable();\n\n    /**\n     * Write data to the stream.\n     *\n     * @param string $string The string that is to be written.\n     * @return int Returns the number of bytes written to the stream.\n     * @throws \\RuntimeException on failure.\n     */\n    public function write($string);\n\n    /**\n     * Returns whether or not the stream is readable.\n     *\n     * @return bool\n     */\n    public function isReadable();\n\n    /**\n     * Read data from the stream.\n     *\n     * @param int $length Read up to $length bytes from the object and return\n     *     them. Fewer than $length bytes may be returned if underlying stream\n     *     call returns fewer bytes.\n     * @return string Returns the data read from the stream, or an empty string\n     *     if no bytes are available.\n     * @throws \\RuntimeException if an error occurs.\n     */\n    public function read($length);\n\n    /**\n     * Returns the remaining contents in a string\n     *\n     * @return string\n     * @throws \\RuntimeException if unable to read or an error occurs while\n     *     reading.\n     */\n    public function getContents();\n\n    /**\n     * Get stream metadata as an associative array or retrieve a specific key.\n     *\n     * The keys returned are identical to the keys returned from PHP's\n     * stream_get_meta_data() function.\n     *\n     * @link http://php.net/manual/en/function.stream-get-meta-data.php\n     * @param string $key Specific metadata to retrieve.\n     * @return array|mixed|null Returns an associative array if no key is\n     *     provided. Returns a specific key value if a key is provided and the\n     *     value is found, or null if the key is not found.\n     */\n    public function getMetadata($key = null);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/src/UploadedFileInterface.php",
    "content": "<?php\n\nnamespace Psr\\Http\\Message;\n\n/**\n * Value object representing a file uploaded through an HTTP request.\n *\n * Instances of this interface are considered immutable; all methods that\n * might change state MUST be implemented such that they retain the internal\n * state of the current instance and return an instance that contains the\n * changed state.\n */\ninterface UploadedFileInterface\n{\n    /**\n     * Retrieve a stream representing the uploaded file.\n     *\n     * This method MUST return a StreamInterface instance, representing the\n     * uploaded file. The purpose of this method is to allow utilizing native PHP\n     * stream functionality to manipulate the file upload, such as\n     * stream_copy_to_stream() (though the result will need to be decorated in a\n     * native PHP stream wrapper to work with such functions).\n     *\n     * If the moveTo() method has been called previously, this method MUST raise\n     * an exception.\n     *\n     * @return StreamInterface Stream representation of the uploaded file.\n     * @throws \\RuntimeException in cases when no stream is available or can be\n     *     created.\n     */\n    public function getStream();\n\n    /**\n     * Move the uploaded file to a new location.\n     *\n     * Use this method as an alternative to move_uploaded_file(). This method is\n     * guaranteed to work in both SAPI and non-SAPI environments.\n     * Implementations must determine which environment they are in, and use the\n     * appropriate method (move_uploaded_file(), rename(), or a stream\n     * operation) to perform the operation.\n     *\n     * $targetPath may be an absolute path, or a relative path. If it is a\n     * relative path, resolution should be the same as used by PHP's rename()\n     * function.\n     *\n     * The original file or stream MUST be removed on completion.\n     *\n     * If this method is called more than once, any subsequent calls MUST raise\n     * an exception.\n     *\n     * When used in an SAPI environment where $_FILES is populated, when writing\n     * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be\n     * used to ensure permissions and upload status are verified correctly.\n     *\n     * If you wish to move to a stream, use getStream(), as SAPI operations\n     * cannot guarantee writing to stream destinations.\n     *\n     * @see http://php.net/is_uploaded_file\n     * @see http://php.net/move_uploaded_file\n     * @param string $targetPath Path to which to move the uploaded file.\n     * @throws \\InvalidArgumentException if the $targetPath specified is invalid.\n     * @throws \\RuntimeException on any error during the move operation, or on\n     *     the second or subsequent call to the method.\n     */\n    public function moveTo($targetPath);\n    \n    /**\n     * Retrieve the file size.\n     *\n     * Implementations SHOULD return the value stored in the \"size\" key of\n     * the file in the $_FILES array if available, as PHP calculates this based\n     * on the actual size transmitted.\n     *\n     * @return int|null The file size in bytes or null if unknown.\n     */\n    public function getSize();\n    \n    /**\n     * Retrieve the error associated with the uploaded file.\n     *\n     * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants.\n     *\n     * If the file was uploaded successfully, this method MUST return\n     * UPLOAD_ERR_OK.\n     *\n     * Implementations SHOULD return the value stored in the \"error\" key of\n     * the file in the $_FILES array.\n     *\n     * @see http://php.net/manual/en/features.file-upload.errors.php\n     * @return int One of PHP's UPLOAD_ERR_XXX constants.\n     */\n    public function getError();\n    \n    /**\n     * Retrieve the filename sent by the client.\n     *\n     * Do not trust the value returned by this method. A client could send\n     * a malicious filename with the intention to corrupt or hack your\n     * application.\n     *\n     * Implementations SHOULD return the value stored in the \"name\" key of\n     * the file in the $_FILES array.\n     *\n     * @return string|null The filename sent by the client or null if none\n     *     was provided.\n     */\n    public function getClientFilename();\n    \n    /**\n     * Retrieve the media type sent by the client.\n     *\n     * Do not trust the value returned by this method. A client could send\n     * a malicious media type with the intention to corrupt or hack your\n     * application.\n     *\n     * Implementations SHOULD return the value stored in the \"type\" key of\n     * the file in the $_FILES array.\n     *\n     * @return string|null The media type sent by the client or null if none\n     *     was provided.\n     */\n    public function getClientMediaType();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/src/UriInterface.php",
    "content": "<?php\nnamespace Psr\\Http\\Message;\n\n/**\n * Value object representing a URI.\n *\n * This interface is meant to represent URIs according to RFC 3986 and to\n * provide methods for most common operations. Additional functionality for\n * working with URIs can be provided on top of the interface or externally.\n * Its primary use is for HTTP requests, but may also be used in other\n * contexts.\n *\n * Instances of this interface are considered immutable; all methods that\n * might change state MUST be implemented such that they retain the internal\n * state of the current instance and return an instance that contains the\n * changed state.\n *\n * Typically the Host header will be also be present in the request message.\n * For server-side requests, the scheme will typically be discoverable in the\n * server parameters.\n *\n * @link http://tools.ietf.org/html/rfc3986 (the URI specification)\n */\ninterface UriInterface\n{\n    /**\n     * Retrieve the scheme component of the URI.\n     *\n     * If no scheme is present, this method MUST return an empty string.\n     *\n     * The value returned MUST be normalized to lowercase, per RFC 3986\n     * Section 3.1.\n     *\n     * The trailing \":\" character is not part of the scheme and MUST NOT be\n     * added.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-3.1\n     * @return string The URI scheme.\n     */\n    public function getScheme();\n\n    /**\n     * Retrieve the authority component of the URI.\n     *\n     * If no authority information is present, this method MUST return an empty\n     * string.\n     *\n     * The authority syntax of the URI is:\n     *\n     * <pre>\n     * [user-info@]host[:port]\n     * </pre>\n     *\n     * If the port component is not set or is the standard port for the current\n     * scheme, it SHOULD NOT be included.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-3.2\n     * @return string The URI authority, in \"[user-info@]host[:port]\" format.\n     */\n    public function getAuthority();\n\n    /**\n     * Retrieve the user information component of the URI.\n     *\n     * If no user information is present, this method MUST return an empty\n     * string.\n     *\n     * If a user is present in the URI, this will return that value;\n     * additionally, if the password is also present, it will be appended to the\n     * user value, with a colon (\":\") separating the values.\n     *\n     * The trailing \"@\" character is not part of the user information and MUST\n     * NOT be added.\n     *\n     * @return string The URI user information, in \"username[:password]\" format.\n     */\n    public function getUserInfo();\n\n    /**\n     * Retrieve the host component of the URI.\n     *\n     * If no host is present, this method MUST return an empty string.\n     *\n     * The value returned MUST be normalized to lowercase, per RFC 3986\n     * Section 3.2.2.\n     *\n     * @see http://tools.ietf.org/html/rfc3986#section-3.2.2\n     * @return string The URI host.\n     */\n    public function getHost();\n\n    /**\n     * Retrieve the port component of the URI.\n     *\n     * If a port is present, and it is non-standard for the current scheme,\n     * this method MUST return it as an integer. If the port is the standard port\n     * used with the current scheme, this method SHOULD return null.\n     *\n     * If no port is present, and no scheme is present, this method MUST return\n     * a null value.\n     *\n     * If no port is present, but a scheme is present, this method MAY return\n     * the standard port for that scheme, but SHOULD return null.\n     *\n     * @return null|int The URI port.\n     */\n    public function getPort();\n\n    /**\n     * Retrieve the path component of the URI.\n     *\n     * The path can either be empty or absolute (starting with a slash) or\n     * rootless (not starting with a slash). Implementations MUST support all\n     * three syntaxes.\n     *\n     * Normally, the empty path \"\" and absolute path \"/\" are considered equal as\n     * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically\n     * do this normalization because in contexts with a trimmed base path, e.g.\n     * the front controller, this difference becomes significant. It's the task\n     * of the user to handle both \"\" and \"/\".\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.3.\n     *\n     * As an example, if the value should include a slash (\"/\") not intended as\n     * delimiter between path segments, that value MUST be passed in encoded\n     * form (e.g., \"%2F\") to the instance.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-2\n     * @see https://tools.ietf.org/html/rfc3986#section-3.3\n     * @return string The URI path.\n     */\n    public function getPath();\n\n    /**\n     * Retrieve the query string of the URI.\n     *\n     * If no query string is present, this method MUST return an empty string.\n     *\n     * The leading \"?\" character is not part of the query and MUST NOT be\n     * added.\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.4.\n     *\n     * As an example, if a value in a key/value pair of the query string should\n     * include an ampersand (\"&\") not intended as a delimiter between values,\n     * that value MUST be passed in encoded form (e.g., \"%26\") to the instance.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-2\n     * @see https://tools.ietf.org/html/rfc3986#section-3.4\n     * @return string The URI query string.\n     */\n    public function getQuery();\n\n    /**\n     * Retrieve the fragment component of the URI.\n     *\n     * If no fragment is present, this method MUST return an empty string.\n     *\n     * The leading \"#\" character is not part of the fragment and MUST NOT be\n     * added.\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.5.\n     *\n     * @see https://tools.ietf.org/html/rfc3986#section-2\n     * @see https://tools.ietf.org/html/rfc3986#section-3.5\n     * @return string The URI fragment.\n     */\n    public function getFragment();\n\n    /**\n     * Return an instance with the specified scheme.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified scheme.\n     *\n     * Implementations MUST support the schemes \"http\" and \"https\" case\n     * insensitively, and MAY accommodate other schemes if required.\n     *\n     * An empty scheme is equivalent to removing the scheme.\n     *\n     * @param string $scheme The scheme to use with the new instance.\n     * @return static A new instance with the specified scheme.\n     * @throws \\InvalidArgumentException for invalid or unsupported schemes.\n     */\n    public function withScheme($scheme);\n\n    /**\n     * Return an instance with the specified user information.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified user information.\n     *\n     * Password is optional, but the user information MUST include the\n     * user; an empty string for the user is equivalent to removing user\n     * information.\n     *\n     * @param string $user The user name to use for authority.\n     * @param null|string $password The password associated with $user.\n     * @return static A new instance with the specified user information.\n     */\n    public function withUserInfo($user, $password = null);\n\n    /**\n     * Return an instance with the specified host.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified host.\n     *\n     * An empty host value is equivalent to removing the host.\n     *\n     * @param string $host The hostname to use with the new instance.\n     * @return static A new instance with the specified host.\n     * @throws \\InvalidArgumentException for invalid hostnames.\n     */\n    public function withHost($host);\n\n    /**\n     * Return an instance with the specified port.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified port.\n     *\n     * Implementations MUST raise an exception for ports outside the\n     * established TCP and UDP port ranges.\n     *\n     * A null value provided for the port is equivalent to removing the port\n     * information.\n     *\n     * @param null|int $port The port to use with the new instance; a null value\n     *     removes the port information.\n     * @return static A new instance with the specified port.\n     * @throws \\InvalidArgumentException for invalid ports.\n     */\n    public function withPort($port);\n\n    /**\n     * Return an instance with the specified path.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified path.\n     *\n     * The path can either be empty or absolute (starting with a slash) or\n     * rootless (not starting with a slash). Implementations MUST support all\n     * three syntaxes.\n     *\n     * If the path is intended to be domain-relative rather than path relative then\n     * it must begin with a slash (\"/\"). Paths not starting with a slash (\"/\")\n     * are assumed to be relative to some base path known to the application or\n     * consumer.\n     *\n     * Users can provide both encoded and decoded path characters.\n     * Implementations ensure the correct encoding as outlined in getPath().\n     *\n     * @param string $path The path to use with the new instance.\n     * @return static A new instance with the specified path.\n     * @throws \\InvalidArgumentException for invalid paths.\n     */\n    public function withPath($path);\n\n    /**\n     * Return an instance with the specified query string.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified query string.\n     *\n     * Users can provide both encoded and decoded query characters.\n     * Implementations ensure the correct encoding as outlined in getQuery().\n     *\n     * An empty query string value is equivalent to removing the query string.\n     *\n     * @param string $query The query string to use with the new instance.\n     * @return static A new instance with the specified query string.\n     * @throws \\InvalidArgumentException for invalid query strings.\n     */\n    public function withQuery($query);\n\n    /**\n     * Return an instance with the specified URI fragment.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified URI fragment.\n     *\n     * Users can provide both encoded and decoded fragment characters.\n     * Implementations ensure the correct encoding as outlined in getFragment().\n     *\n     * An empty fragment value is equivalent to removing the fragment.\n     *\n     * @param string $fragment The fragment to use with the new instance.\n     * @return static A new instance with the specified fragment.\n     */\n    public function withFragment($fragment);\n\n    /**\n     * Return the string representation as a URI reference.\n     *\n     * Depending on which components of the URI are present, the resulting\n     * string is either a full URI or relative reference according to RFC 3986,\n     * Section 4.1. The method concatenates the various components of the URI,\n     * using the appropriate delimiters:\n     *\n     * - If a scheme is present, it MUST be suffixed by \":\".\n     * - If an authority is present, it MUST be prefixed by \"//\".\n     * - The path can be concatenated without delimiters. But there are two\n     *   cases where the path has to be adjusted to make the URI reference\n     *   valid as PHP does not allow to throw an exception in __toString():\n     *     - If the path is rootless and an authority is present, the path MUST\n     *       be prefixed by \"/\".\n     *     - If the path is starting with more than one \"/\" and no authority is\n     *       present, the starting slashes MUST be reduced to one.\n     * - If a query is present, it MUST be prefixed by \"?\".\n     * - If a fragment is present, it MUST be prefixed by \"#\".\n     *\n     * @see http://tools.ietf.org/html/rfc3986#section-4.1\n     * @return string\n     */\n    public function __toString();\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/ralouphie/getallheaders/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Ralph Khattar\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/ralouphie/getallheaders/README.md",
    "content": "getallheaders\n=============\n\nPHP `getallheaders()` polyfill. Compatible with PHP >= 5.3.\n\n[![Build Status](https://travis-ci.org/ralouphie/getallheaders.svg?branch=master)](https://travis-ci.org/ralouphie/getallheaders)\n[![Coverage Status](https://coveralls.io/repos/ralouphie/getallheaders/badge.png?branch=master)](https://coveralls.io/r/ralouphie/getallheaders?branch=master)\n[![Latest Stable Version](https://poser.pugx.org/ralouphie/getallheaders/v/stable.png)](https://packagist.org/packages/ralouphie/getallheaders)\n[![Latest Unstable Version](https://poser.pugx.org/ralouphie/getallheaders/v/unstable.png)](https://packagist.org/packages/ralouphie/getallheaders)\n[![License](https://poser.pugx.org/ralouphie/getallheaders/license.png)](https://packagist.org/packages/ralouphie/getallheaders)\n\n\nThis is a simple polyfill for [`getallheaders()`](http://www.php.net/manual/en/function.getallheaders.php).\n\n## Install\n\nFor PHP version **`>= 5.6`**:\n\n```\ncomposer require ralouphie/getallheaders\n```\n\nFor PHP version **`< 5.6`**:\n\n```\ncomposer require ralouphie/getallheaders \"^2\"\n```\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/ralouphie/getallheaders/composer.json",
    "content": "{\n\t\"name\": \"ralouphie/getallheaders\",\n\t\"description\": \"A polyfill for getallheaders.\",\n\t\"license\": \"MIT\",\n\t\"authors\": [\n\t\t{\n\t\t\t\"name\": \"Ralph Khattar\",\n\t\t\t\"email\": \"ralph.khattar@gmail.com\"\n\t\t}\n\t],\n\t\"require\": {\n\t\t\"php\": \">=5.6\"\n\t},\n\t\"require-dev\": {\n\t\t\"phpunit/phpunit\": \"^5 || ^6.5\",\n\t\t\"php-coveralls/php-coveralls\": \"^2.1\"\n\t},\n\t\"autoload\": {\n\t\t\"files\": [\"src/getallheaders.php\"]\n\t},\n\t\"autoload-dev\": {\n\t\t\"psr-4\": {\n\t\t\t\"getallheaders\\\\Tests\\\\\": \"tests/\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/ralouphie/getallheaders/src/getallheaders.php",
    "content": "<?php\n\nif (!function_exists('getallheaders')) {\n\n    /**\n     * Get all HTTP header key/values as an associative array for the current request.\n     *\n     * @return string[string] The HTTP header key/value pairs.\n     */\n    function getallheaders()\n    {\n        $headers = array();\n\n        $copy_server = array(\n            'CONTENT_TYPE'   => 'Content-Type',\n            'CONTENT_LENGTH' => 'Content-Length',\n            'CONTENT_MD5'    => 'Content-Md5',\n        );\n\n        foreach ($_SERVER as $key => $value) {\n            if (substr($key, 0, 5) === 'HTTP_') {\n                $key = substr($key, 5);\n                if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) {\n                    $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key))));\n                    $headers[$key] = $value;\n                }\n            } elseif (isset($copy_server[$key])) {\n                $headers[$copy_server[$key]] = $value;\n            }\n        }\n\n        if (!isset($headers['Authorization'])) {\n            if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {\n                $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];\n            } elseif (isset($_SERVER['PHP_AUTH_USER'])) {\n                $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : '';\n                $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass);\n            } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) {\n                $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST'];\n            }\n        }\n\n        return $headers;\n    }\n\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-intl-idn/Idn.php",
    "content": "<?php\n\n/*\n * Copyright (c) 2014 TrueServer B.V.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * Originally forked from\n * https://github.com/true/php-punycode/blob/v2.1.1/src/Punycode.php\n */\n\nnamespace Symfony\\Polyfill\\Intl\\Idn;\n\n/**\n * Partial intl implementation in pure PHP.\n *\n * Implemented:\n * - idn_to_ascii - Convert domain name to IDNA ASCII form\n * - idn_to_utf8  - Convert domain name from IDNA ASCII to Unicode\n *\n * @author Renan Gonçalves <renan.saddam@gmail.com>\n * @author Sebastian Kroczek <sk@xbug.de>\n * @author Dmitry Lukashin <dmitry@lukashin.ru>\n * @author Laurent Bassin <laurent@bassin.info>\n *\n * @internal\n */\nfinal class Idn\n{\n    const INTL_IDNA_VARIANT_2003 = 0;\n    const INTL_IDNA_VARIANT_UTS46 = 1;\n\n    private static $encodeTable = array(\n        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',\n        'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',\n        'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n    );\n\n    private static $decodeTable = array(\n        'a' => 0, 'b' => 1, 'c' => 2, 'd' => 3, 'e' => 4, 'f' => 5,\n        'g' => 6, 'h' => 7, 'i' => 8, 'j' => 9, 'k' => 10, 'l' => 11,\n        'm' => 12, 'n' => 13, 'o' => 14, 'p' => 15, 'q' => 16, 'r' => 17,\n        's' => 18, 't' => 19, 'u' => 20, 'v' => 21, 'w' => 22, 'x' => 23,\n        'y' => 24, 'z' => 25, '0' => 26, '1' => 27, '2' => 28, '3' => 29,\n        '4' => 30, '5' => 31, '6' => 32, '7' => 33, '8' => 34, '9' => 35,\n    );\n\n    public static function idn_to_ascii($domain, $options, $variant, &$idna_info = array())\n    {\n        if (\\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) {\n            @trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', E_USER_DEPRECATED);\n        }\n\n        if (self::INTL_IDNA_VARIANT_UTS46 === $variant) {\n            $domain = mb_strtolower($domain, 'utf-8');\n        }\n\n        $parts = explode('.', $domain);\n\n        foreach ($parts as $i => &$part) {\n            if ('' === $part && \\count($parts) > 1 + $i) {\n                return false;\n            }\n            if (false === $part = self::encodePart($part)) {\n                return false;\n            }\n        }\n\n        $output = implode('.', $parts);\n\n        $idna_info = array(\n            'result' => \\strlen($output) > 255 ? false : $output,\n            'isTransitionalDifferent' => false,\n            'errors' => 0,\n        );\n\n        return $idna_info['result'];\n    }\n\n    public static function idn_to_utf8($domain, $options, $variant, &$idna_info = array())\n    {\n        if (\\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) {\n            @trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', E_USER_DEPRECATED);\n        }\n\n        $parts = explode('.', $domain);\n\n        foreach ($parts as &$part) {\n            $length = \\strlen($part);\n            if ($length < 1 || 63 < $length) {\n                continue;\n            }\n            if (0 !== strpos($part, 'xn--')) {\n                continue;\n            }\n\n            $part = substr($part, 4);\n            $part = self::decodePart($part);\n        }\n\n        $output = implode('.', $parts);\n\n        $idna_info = array(\n            'result' => \\strlen($output) > 255 ? false : $output,\n            'isTransitionalDifferent' => false,\n            'errors' => 0,\n        );\n\n        return $idna_info['result'];\n    }\n\n    private static function encodePart($input)\n    {\n        if (\\substr($input, 0, 1) === '-' || \\substr($input, -1) === '-') {\n            return false;\n        }\n\n        $codePoints = self::listCodePoints($input);\n\n        $n = 128;\n        $bias = 72;\n        $delta = 0;\n        $h = $b = \\count($codePoints['basic']);\n\n        $output = '';\n        foreach ($codePoints['basic'] as $code) {\n            $output .= mb_chr($code, 'utf-8');\n        }\n        if ($input === $output) {\n            return $output;\n        }\n        if ($b > 0) {\n            $output .= '-';\n        }\n\n        $codePoints['nonBasic'] = array_unique($codePoints['nonBasic']);\n        sort($codePoints['nonBasic']);\n\n        $i = 0;\n        $length = mb_strlen($input, 'utf-8');\n        while ($h < $length) {\n            $m = $codePoints['nonBasic'][$i++];\n            $delta += ($m - $n) * ($h + 1);\n            $n = $m;\n\n            foreach ($codePoints['all'] as $c) {\n                if ($c < $n || $c < 128) {\n                    ++$delta;\n                }\n                if ($c === $n) {\n                    $q = $delta;\n                    for ($k = 36;; $k += 36) {\n                        $t = self::calculateThreshold($k, $bias);\n                        if ($q < $t) {\n                            break;\n                        }\n\n                        $code = $t + (($q - $t) % (36 - $t));\n                        $output .= self::$encodeTable[$code];\n\n                        $q = ($q - $t) / (36 - $t);\n                    }\n\n                    $output .= self::$encodeTable[$q];\n                    $bias = self::adapt($delta, $h + 1, ($h === $b));\n                    $delta = 0;\n                    ++$h;\n                }\n            }\n\n            ++$delta;\n            ++$n;\n        }\n\n        $output = 'xn--'.$output;\n\n        return \\strlen($output) < 1 || 63 < \\strlen($output) ? false : strtolower($output);\n    }\n\n    private static function listCodePoints($input)\n    {\n        $codePoints = array(\n            'all' => array(),\n            'basic' => array(),\n            'nonBasic' => array(),\n        );\n\n        $length = mb_strlen($input, 'utf-8');\n        for ($i = 0; $i < $length; ++$i) {\n            $char = mb_substr($input, $i, 1, 'utf-8');\n            $code = mb_ord($char, 'utf-8');\n            if ($code < 128) {\n                $codePoints['all'][] = $codePoints['basic'][] = $code;\n            } else {\n                $codePoints['all'][] = $codePoints['nonBasic'][] = $code;\n            }\n        }\n\n        return $codePoints;\n    }\n\n    private static function calculateThreshold($k, $bias)\n    {\n        if ($k <= $bias + 1) {\n            return 1;\n        }\n        if ($k >= $bias + 26) {\n            return 26;\n        }\n\n        return $k - $bias;\n    }\n\n    private static function adapt($delta, $numPoints, $firstTime)\n    {\n        $delta = (int) ($firstTime ? $delta / 700 : $delta / 2);\n        $delta += (int) ($delta / $numPoints);\n\n        $k = 0;\n        while ($delta > 35 * 13) {\n            $delta = (int) ($delta / 35);\n            $k = $k + 36;\n        }\n\n        return $k + (int) (36 * $delta / ($delta + 38));\n    }\n\n    private static function decodePart($input)\n    {\n        $n = 128;\n        $i = 0;\n        $bias = 72;\n        $output = '';\n\n        $pos = strrpos($input, '-');\n        if (false !== $pos) {\n            $output = substr($input, 0, $pos++);\n        } else {\n            $pos = 0;\n        }\n\n        $outputLength = \\strlen($output);\n        $inputLength = \\strlen($input);\n\n        while ($pos < $inputLength) {\n            $oldi = $i;\n            $w = 1;\n\n            for ($k = 36;; $k += 36) {\n                $digit = self::$decodeTable[$input[$pos++]];\n                $i += $digit * $w;\n                $t = self::calculateThreshold($k, $bias);\n\n                if ($digit < $t) {\n                    break;\n                }\n\n                $w *= 36 - $t;\n            }\n\n            $bias = self::adapt($i - $oldi, ++$outputLength, 0 === $oldi);\n            $n = $n + (int) ($i / $outputLength);\n            $i = $i % $outputLength;\n            $output = mb_substr($output, 0, $i, 'utf-8').mb_chr($n, 'utf-8').mb_substr($output, $i, $outputLength - 1, 'utf-8');\n\n            ++$i;\n        }\n\n        return $output;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-intl-idn/LICENSE",
    "content": "Copyright (c) 2018-2019 Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-intl-idn/README.md",
    "content": "Symfony Polyfill / Intl: Idn\n============================\n\nThis 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.\n\nMore information can be found in the\n[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).\n\nLicense\n=======\n\nThis library is released under the [MIT license](LICENSE).\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-intl-idn/bootstrap.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Intl\\Idn as p;\n\nif (extension_loaded('intl')) {\n    return;\n}\n\nif (!defined('U_IDNA_PROHIBITED_ERROR')) {\n    define('U_IDNA_PROHIBITED_ERROR', 66560);\n}\nif (!defined('U_IDNA_ERROR_START')) {\n    define('U_IDNA_ERROR_START', 66560);\n}\nif (!defined('U_IDNA_UNASSIGNED_ERROR')) {\n    define('U_IDNA_UNASSIGNED_ERROR', 66561);\n}\nif (!defined('U_IDNA_CHECK_BIDI_ERROR')) {\n    define('U_IDNA_CHECK_BIDI_ERROR', 66562);\n}\nif (!defined('U_IDNA_STD3_ASCII_RULES_ERROR')) {\n    define('U_IDNA_STD3_ASCII_RULES_ERROR', 66563);\n}\nif (!defined('U_IDNA_ACE_PREFIX_ERROR')) {\n    define('U_IDNA_ACE_PREFIX_ERROR', 66564);\n}\nif (!defined('U_IDNA_VERIFICATION_ERROR')) {\n    define('U_IDNA_VERIFICATION_ERROR', 66565);\n}\nif (!defined('U_IDNA_LABEL_TOO_LONG_ERROR')) {\n    define('U_IDNA_LABEL_TOO_LONG_ERROR', 66566);\n}\nif (!defined('U_IDNA_ZERO_LENGTH_LABEL_ERROR')) {\n    define('U_IDNA_ZERO_LENGTH_LABEL_ERROR', 66567);\n}\nif (!defined('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR')) {\n    define('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR', 66568);\n}\nif (!defined('U_IDNA_ERROR_LIMIT')) {\n    define('U_IDNA_ERROR_LIMIT', 66569);\n}\nif (!defined('U_STRINGPREP_PROHIBITED_ERROR')) {\n    define('U_STRINGPREP_PROHIBITED_ERROR', 66560);\n}\nif (!defined('U_STRINGPREP_UNASSIGNED_ERROR')) {\n    define('U_STRINGPREP_UNASSIGNED_ERROR', 66561);\n}\nif (!defined('U_STRINGPREP_CHECK_BIDI_ERROR')) {\n    define('U_STRINGPREP_CHECK_BIDI_ERROR', 66562);\n}\nif (!defined('IDNA_DEFAULT')) {\n    define('IDNA_DEFAULT', 0);\n}\nif (!defined('IDNA_ALLOW_UNASSIGNED')) {\n    define('IDNA_ALLOW_UNASSIGNED', 1);\n}\nif (!defined('IDNA_USE_STD3_RULES')) {\n    define('IDNA_USE_STD3_RULES', 2);\n}\nif (!defined('IDNA_CHECK_BIDI')) {\n    define('IDNA_CHECK_BIDI', 4);\n}\nif (!defined('IDNA_CHECK_CONTEXTJ')) {\n    define('IDNA_CHECK_CONTEXTJ', 8);\n}\nif (!defined('IDNA_NONTRANSITIONAL_TO_ASCII')) {\n    define('IDNA_NONTRANSITIONAL_TO_ASCII', 16);\n}\nif (!defined('IDNA_NONTRANSITIONAL_TO_UNICODE')) {\n    define('IDNA_NONTRANSITIONAL_TO_UNICODE', 32);\n}\nif (!defined('INTL_IDNA_VARIANT_2003')) {\n    define('INTL_IDNA_VARIANT_2003', 0);\n}\nif (!defined('INTL_IDNA_VARIANT_UTS46')) {\n    define('INTL_IDNA_VARIANT_UTS46', 1);\n}\nif (!defined('IDNA_ERROR_EMPTY_LABEL')) {\n    define('IDNA_ERROR_EMPTY_LABEL', 1);\n}\nif (!defined('IDNA_ERROR_LABEL_TOO_LONG')) {\n    define('IDNA_ERROR_LABEL_TOO_LONG', 2);\n}\nif (!defined('IDNA_ERROR_DOMAIN_NAME_TOO_LONG')) {\n    define('IDNA_ERROR_DOMAIN_NAME_TOO_LONG', 4);\n}\nif (!defined('IDNA_ERROR_LEADING_HYPHEN')) {\n    define('IDNA_ERROR_LEADING_HYPHEN', 8);\n}\nif (!defined('IDNA_ERROR_TRAILING_HYPHEN')) {\n    define('IDNA_ERROR_TRAILING_HYPHEN', 16);\n}\nif (!defined('IDNA_ERROR_HYPHEN_3_4')) {\n    define('IDNA_ERROR_HYPHEN_3_4', 32);\n}\nif (!defined('IDNA_ERROR_LEADING_COMBINING_MARK')) {\n    define('IDNA_ERROR_LEADING_COMBINING_MARK', 64);\n}\nif (!defined('IDNA_ERROR_DISALLOWED')) {\n    define('IDNA_ERROR_DISALLOWED', 128);\n}\nif (!defined('IDNA_ERROR_PUNYCODE')) {\n    define('IDNA_ERROR_PUNYCODE', 256);\n}\nif (!defined('IDNA_ERROR_LABEL_HAS_DOT')) {\n    define('IDNA_ERROR_LABEL_HAS_DOT', 512);\n}\nif (!defined('IDNA_ERROR_INVALID_ACE_LABEL')) {\n    define('IDNA_ERROR_INVALID_ACE_LABEL', 1024);\n}\nif (!defined('IDNA_ERROR_BIDI')) {\n    define('IDNA_ERROR_BIDI', 2048);\n}\nif (!defined('IDNA_ERROR_CONTEXTJ')) {\n    define('IDNA_ERROR_CONTEXTJ', 4096);\n}\n\nif (PHP_VERSION_ID < 70400) {\n    if (!function_exists('idn_to_ascii')) {\n        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); }\n    }\n    if (!function_exists('idn_to_utf8')) {\n        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); }\n    }\n} else {\n    if (!function_exists('idn_to_ascii')) {\n        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); }\n    }\n    if (!function_exists('idn_to_utf8')) {\n        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); }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-intl-idn/composer.json",
    "content": "{\n    \"name\": \"symfony/polyfill-intl-idn\",\n    \"type\": \"library\",\n    \"description\": \"Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions\",\n    \"keywords\": [\"polyfill\", \"shim\", \"compatibility\", \"portable\", \"intl\", \"idn\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Laurent Bassin\",\n            \"email\": \"laurent@bassin.info\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.3.3\",\n        \"symfony/polyfill-mbstring\": \"^1.3\",\n        \"symfony/polyfill-php72\": \"^1.10\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Polyfill\\\\Intl\\\\Idn\\\\\": \"\" },\n        \"files\": [ \"bootstrap.php\" ]\n    },\n    \"suggest\": {\n        \"ext-intl\": \"For best performance\"\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.17-dev\"\n        },\n        \"thanks\": {\n            \"name\": \"symfony/polyfill\",\n            \"url\": \"https://github.com/symfony/polyfill\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/LICENSE",
    "content": "Copyright (c) 2015-2019 Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/Mbstring.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Polyfill\\Mbstring;\n\n/**\n * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.\n *\n * Implemented:\n * - mb_chr                  - Returns a specific character from its Unicode code point\n * - mb_convert_encoding     - Convert character encoding\n * - mb_convert_variables    - Convert character code in variable(s)\n * - mb_decode_mimeheader    - Decode string in MIME header field\n * - mb_encode_mimeheader    - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED\n * - mb_decode_numericentity - Decode HTML numeric string reference to character\n * - mb_encode_numericentity - Encode character to HTML numeric string reference\n * - mb_convert_case         - Perform case folding on a string\n * - mb_detect_encoding      - Detect character encoding\n * - mb_get_info             - Get internal settings of mbstring\n * - mb_http_input           - Detect HTTP input character encoding\n * - mb_http_output          - Set/Get HTTP output character encoding\n * - mb_internal_encoding    - Set/Get internal character encoding\n * - mb_list_encodings       - Returns an array of all supported encodings\n * - mb_ord                  - Returns the Unicode code point of a character\n * - mb_output_handler       - Callback function converts character encoding in output buffer\n * - mb_scrub                - Replaces ill-formed byte sequences with substitute characters\n * - mb_strlen               - Get string length\n * - mb_strpos               - Find position of first occurrence of string in a string\n * - mb_strrpos              - Find position of last occurrence of a string in a string\n * - mb_str_split            - Convert a string to an array\n * - mb_strtolower           - Make a string lowercase\n * - mb_strtoupper           - Make a string uppercase\n * - mb_substitute_character - Set/Get substitution character\n * - mb_substr               - Get part of string\n * - mb_stripos              - Finds position of first occurrence of a string within another, case insensitive\n * - mb_stristr              - Finds first occurrence of a string within another, case insensitive\n * - mb_strrchr              - Finds the last occurrence of a character in a string within another\n * - mb_strrichr             - Finds the last occurrence of a character in a string within another, case insensitive\n * - mb_strripos             - Finds position of last occurrence of a string within another, case insensitive\n * - mb_strstr               - Finds first occurrence of a string within another\n * - mb_strwidth             - Return width of string\n * - mb_substr_count         - Count the number of substring occurrences\n *\n * Not implemented:\n * - mb_convert_kana         - Convert \"kana\" one from another (\"zen-kaku\", \"han-kaku\" and more)\n * - mb_ereg_*               - Regular expression with multibyte support\n * - mb_parse_str            - Parse GET/POST/COOKIE data and set global variable\n * - mb_preferred_mime_name  - Get MIME charset string\n * - mb_regex_encoding       - Returns current encoding for multibyte regex as string\n * - mb_regex_set_options    - Set/Get the default options for mbregex functions\n * - mb_send_mail            - Send encoded mail\n * - mb_split                - Split multibyte string using regular expression\n * - mb_strcut               - Get part of string\n * - mb_strimwidth           - Get truncated string with specified width\n *\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nfinal class Mbstring\n{\n    const MB_CASE_FOLD = PHP_INT_MAX;\n\n    private static $encodingList = array('ASCII', 'UTF-8');\n    private static $language = 'neutral';\n    private static $internalEncoding = 'UTF-8';\n    private static $caseFold = array(\n        array('µ', 'ſ', \"\\xCD\\x85\", 'ς', \"\\xCF\\x90\", \"\\xCF\\x91\", \"\\xCF\\x95\", \"\\xCF\\x96\", \"\\xCF\\xB0\", \"\\xCF\\xB1\", \"\\xCF\\xB5\", \"\\xE1\\xBA\\x9B\", \"\\xE1\\xBE\\xBE\"),\n        array('μ', 's', 'ι',        'σ', 'β',        'θ',        'φ',        'π',        'κ',        'ρ',        'ε',        \"\\xE1\\xB9\\xA1\", 'ι'),\n    );\n\n    public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)\n    {\n        if (\\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {\n            $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);\n        } else {\n            $fromEncoding = self::getEncoding($fromEncoding);\n        }\n\n        $toEncoding = self::getEncoding($toEncoding);\n\n        if ('BASE64' === $fromEncoding) {\n            $s = base64_decode($s);\n            $fromEncoding = $toEncoding;\n        }\n\n        if ('BASE64' === $toEncoding) {\n            return base64_encode($s);\n        }\n\n        if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {\n            if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {\n                $fromEncoding = 'Windows-1252';\n            }\n            if ('UTF-8' !== $fromEncoding) {\n                $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);\n            }\n\n            return preg_replace_callback('/[\\x80-\\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);\n        }\n\n        if ('HTML-ENTITIES' === $fromEncoding) {\n            $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');\n            $fromEncoding = 'UTF-8';\n        }\n\n        return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);\n    }\n\n    public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)\n    {\n        $vars = array(&$a, &$b, &$c, &$d, &$e, &$f);\n\n        $ok = true;\n        array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {\n            if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {\n                $ok = false;\n            }\n        });\n\n        return $ok ? $fromEncoding : false;\n    }\n\n    public static function mb_decode_mimeheader($s)\n    {\n        return iconv_mime_decode($s, 2, self::$internalEncoding);\n    }\n\n    public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)\n    {\n        trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);\n    }\n\n    public static function mb_decode_numericentity($s, $convmap, $encoding = null)\n    {\n        if (null !== $s && !\\is_scalar($s) && !(\\is_object($s) && \\method_exists($s, '__toString'))) {\n            trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\\gettype($s).' given', E_USER_WARNING);\n\n            return null;\n        }\n\n        if (!\\is_array($convmap) || !$convmap) {\n            return false;\n        }\n\n        if (null !== $encoding && !\\is_scalar($encoding)) {\n            trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\\gettype($s).' given', E_USER_WARNING);\n\n            return '';  // Instead of null (cf. mb_encode_numericentity).\n        }\n\n        $s = (string) $s;\n        if ('' === $s) {\n            return '';\n        }\n\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $encoding) {\n            $encoding = null;\n            if (!preg_match('//u', $s)) {\n                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);\n            }\n        } else {\n            $s = iconv($encoding, 'UTF-8//IGNORE', $s);\n        }\n\n        $cnt = floor(\\count($convmap) / 4) * 4;\n\n        for ($i = 0; $i < $cnt; $i += 4) {\n            // collector_decode_htmlnumericentity ignores $convmap[$i + 3]\n            $convmap[$i] += $convmap[$i + 2];\n            $convmap[$i + 1] += $convmap[$i + 2];\n        }\n\n        $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) {\n            $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];\n            for ($i = 0; $i < $cnt; $i += 4) {\n                if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {\n                    return Mbstring::mb_chr($c - $convmap[$i + 2]);\n                }\n            }\n\n            return $m[0];\n        }, $s);\n\n        if (null === $encoding) {\n            return $s;\n        }\n\n        return iconv('UTF-8', $encoding.'//IGNORE', $s);\n    }\n\n    public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)\n    {\n        if (null !== $s && !\\is_scalar($s) && !(\\is_object($s) && \\method_exists($s, '__toString'))) {\n            trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\\gettype($s).' given', E_USER_WARNING);\n\n            return null;\n        }\n\n        if (!\\is_array($convmap) || !$convmap) {\n            return false;\n        }\n\n        if (null !== $encoding && !\\is_scalar($encoding)) {\n            trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\\gettype($s).' given', E_USER_WARNING);\n\n            return null;  // Instead of '' (cf. mb_decode_numericentity).\n        }\n\n        if (null !== $is_hex && !\\is_scalar($is_hex)) {\n            trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\\gettype($s).' given', E_USER_WARNING);\n\n            return null;\n        }\n\n        $s = (string) $s;\n        if ('' === $s) {\n            return '';\n        }\n\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $encoding) {\n            $encoding = null;\n            if (!preg_match('//u', $s)) {\n                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);\n            }\n        } else {\n            $s = iconv($encoding, 'UTF-8//IGNORE', $s);\n        }\n\n        static $ulenMask = array(\"\\xC0\" => 2, \"\\xD0\" => 2, \"\\xE0\" => 3, \"\\xF0\" => 4);\n\n        $cnt = floor(\\count($convmap) / 4) * 4;\n        $i = 0;\n        $len = \\strlen($s);\n        $result = '';\n\n        while ($i < $len) {\n            $ulen = $s[$i] < \"\\x80\" ? 1 : $ulenMask[$s[$i] & \"\\xF0\"];\n            $uchr = substr($s, $i, $ulen);\n            $i += $ulen;\n            $c = self::mb_ord($uchr);\n\n            for ($j = 0; $j < $cnt; $j += 4) {\n                if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {\n                    $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];\n                    $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';';\n                    continue 2;\n                }\n            }\n            $result .= $uchr;\n        }\n\n        if (null === $encoding) {\n            return $result;\n        }\n\n        return iconv('UTF-8', $encoding.'//IGNORE', $result);\n    }\n\n    public static function mb_convert_case($s, $mode, $encoding = null)\n    {\n        $s = (string) $s;\n        if ('' === $s) {\n            return '';\n        }\n\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $encoding) {\n            $encoding = null;\n            if (!preg_match('//u', $s)) {\n                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);\n            }\n        } else {\n            $s = iconv($encoding, 'UTF-8//IGNORE', $s);\n        }\n\n        if (MB_CASE_TITLE == $mode) {\n            static $titleRegexp = null;\n            if (null === $titleRegexp) {\n                $titleRegexp = self::getData('titleCaseRegexp');\n            }\n            $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s);\n        } else {\n            if (MB_CASE_UPPER == $mode) {\n                static $upper = null;\n                if (null === $upper) {\n                    $upper = self::getData('upperCase');\n                }\n                $map = $upper;\n            } else {\n                if (self::MB_CASE_FOLD === $mode) {\n                    $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);\n                }\n\n                static $lower = null;\n                if (null === $lower) {\n                    $lower = self::getData('lowerCase');\n                }\n                $map = $lower;\n            }\n\n            static $ulenMask = array(\"\\xC0\" => 2, \"\\xD0\" => 2, \"\\xE0\" => 3, \"\\xF0\" => 4);\n\n            $i = 0;\n            $len = \\strlen($s);\n\n            while ($i < $len) {\n                $ulen = $s[$i] < \"\\x80\" ? 1 : $ulenMask[$s[$i] & \"\\xF0\"];\n                $uchr = substr($s, $i, $ulen);\n                $i += $ulen;\n\n                if (isset($map[$uchr])) {\n                    $uchr = $map[$uchr];\n                    $nlen = \\strlen($uchr);\n\n                    if ($nlen == $ulen) {\n                        $nlen = $i;\n                        do {\n                            $s[--$nlen] = $uchr[--$ulen];\n                        } while ($ulen);\n                    } else {\n                        $s = substr_replace($s, $uchr, $i - $ulen, $ulen);\n                        $len += $nlen - $ulen;\n                        $i += $nlen - $ulen;\n                    }\n                }\n            }\n        }\n\n        if (null === $encoding) {\n            return $s;\n        }\n\n        return iconv('UTF-8', $encoding.'//IGNORE', $s);\n    }\n\n    public static function mb_internal_encoding($encoding = null)\n    {\n        if (null === $encoding) {\n            return self::$internalEncoding;\n        }\n\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) {\n            self::$internalEncoding = $encoding;\n\n            return true;\n        }\n\n        return false;\n    }\n\n    public static function mb_language($lang = null)\n    {\n        if (null === $lang) {\n            return self::$language;\n        }\n\n        switch ($lang = strtolower($lang)) {\n            case 'uni':\n            case 'neutral':\n                self::$language = $lang;\n\n                return true;\n        }\n\n        return false;\n    }\n\n    public static function mb_list_encodings()\n    {\n        return array('UTF-8');\n    }\n\n    public static function mb_encoding_aliases($encoding)\n    {\n        switch (strtoupper($encoding)) {\n            case 'UTF8':\n            case 'UTF-8':\n                return array('utf8');\n        }\n\n        return false;\n    }\n\n    public static function mb_check_encoding($var = null, $encoding = null)\n    {\n        if (null === $encoding) {\n            if (null === $var) {\n                return false;\n            }\n            $encoding = self::$internalEncoding;\n        }\n\n        return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var);\n    }\n\n    public static function mb_detect_encoding($str, $encodingList = null, $strict = false)\n    {\n        if (null === $encodingList) {\n            $encodingList = self::$encodingList;\n        } else {\n            if (!\\is_array($encodingList)) {\n                $encodingList = array_map('trim', explode(',', $encodingList));\n            }\n            $encodingList = array_map('strtoupper', $encodingList);\n        }\n\n        foreach ($encodingList as $enc) {\n            switch ($enc) {\n                case 'ASCII':\n                    if (!preg_match('/[\\x80-\\xFF]/', $str)) {\n                        return $enc;\n                    }\n                    break;\n\n                case 'UTF8':\n                case 'UTF-8':\n                    if (preg_match('//u', $str)) {\n                        return 'UTF-8';\n                    }\n                    break;\n\n                default:\n                    if (0 === strncmp($enc, 'ISO-8859-', 9)) {\n                        return $enc;\n                    }\n            }\n        }\n\n        return false;\n    }\n\n    public static function mb_detect_order($encodingList = null)\n    {\n        if (null === $encodingList) {\n            return self::$encodingList;\n        }\n\n        if (!\\is_array($encodingList)) {\n            $encodingList = array_map('trim', explode(',', $encodingList));\n        }\n        $encodingList = array_map('strtoupper', $encodingList);\n\n        foreach ($encodingList as $enc) {\n            switch ($enc) {\n                default:\n                    if (strncmp($enc, 'ISO-8859-', 9)) {\n                        return false;\n                    }\n                    // no break\n                case 'ASCII':\n                case 'UTF8':\n                case 'UTF-8':\n            }\n        }\n\n        self::$encodingList = $encodingList;\n\n        return true;\n    }\n\n    public static function mb_strlen($s, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return \\strlen($s);\n        }\n\n        return @iconv_strlen($s, $encoding);\n    }\n\n    public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return strpos($haystack, $needle, $offset);\n        }\n\n        $needle = (string) $needle;\n        if ('' === $needle) {\n            trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);\n\n            return false;\n        }\n\n        return iconv_strpos($haystack, $needle, $offset, $encoding);\n    }\n\n    public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return strrpos($haystack, $needle, $offset);\n        }\n\n        if ($offset != (int) $offset) {\n            $offset = 0;\n        } elseif ($offset = (int) $offset) {\n            if ($offset < 0) {\n                if (0 > $offset += self::mb_strlen($needle)) {\n                    $haystack = self::mb_substr($haystack, 0, $offset, $encoding);\n                }\n                $offset = 0;\n            } else {\n                $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);\n            }\n        }\n\n        $pos = iconv_strrpos($haystack, $needle, $encoding);\n\n        return false !== $pos ? $offset + $pos : false;\n    }\n\n    public static function mb_str_split($string, $split_length = 1, $encoding = null)\n    {\n        if (null !== $string && !\\is_scalar($string) && !(\\is_object($string) && \\method_exists($string, '__toString'))) {\n            trigger_error('mb_str_split() expects parameter 1 to be string, '.\\gettype($string).' given', E_USER_WARNING);\n\n            return null;\n        }\n\n        if (1 > $split_length = (int) $split_length) {\n            trigger_error('The length of each segment must be greater than zero', E_USER_WARNING);\n\n            return false;\n        }\n\n        if (null === $encoding) {\n            $encoding = mb_internal_encoding();\n        }\n\n        if ('UTF-8' === $encoding = self::getEncoding($encoding)) {\n            $rx = '/(';\n            while (65535 < $split_length) {\n                $rx .= '.{65535}';\n                $split_length -= 65535;\n            }\n            $rx .= '.{'.$split_length.'})/us';\n\n            return preg_split($rx, $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);\n        }\n\n        $result = array();\n        $length = mb_strlen($string, $encoding);\n\n        for ($i = 0; $i < $length; $i += $split_length) {\n            $result[] = mb_substr($string, $i, $split_length, $encoding);\n        }\n\n        return $result;\n    }\n\n    public static function mb_strtolower($s, $encoding = null)\n    {\n        return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);\n    }\n\n    public static function mb_strtoupper($s, $encoding = null)\n    {\n        return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);\n    }\n\n    public static function mb_substitute_character($c = null)\n    {\n        if (0 === strcasecmp($c, 'none')) {\n            return true;\n        }\n\n        return null !== $c ? false : 'none';\n    }\n\n    public static function mb_substr($s, $start, $length = null, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return (string) substr($s, $start, null === $length ? 2147483647 : $length);\n        }\n\n        if ($start < 0) {\n            $start = iconv_strlen($s, $encoding) + $start;\n            if ($start < 0) {\n                $start = 0;\n            }\n        }\n\n        if (null === $length) {\n            $length = 2147483647;\n        } elseif ($length < 0) {\n            $length = iconv_strlen($s, $encoding) + $length - $start;\n            if ($length < 0) {\n                return '';\n            }\n        }\n\n        return (string) iconv_substr($s, $start, $length, $encoding);\n    }\n\n    public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);\n        $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);\n\n        return self::mb_strpos($haystack, $needle, $offset, $encoding);\n    }\n\n    public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $pos = self::mb_stripos($haystack, $needle, 0, $encoding);\n\n        return self::getSubpart($pos, $part, $haystack, $encoding);\n    }\n\n    public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return strrchr($haystack, $needle, $part);\n        }\n        $needle = self::mb_substr($needle, 0, 1, $encoding);\n        $pos = iconv_strrpos($haystack, $needle, $encoding);\n\n        return self::getSubpart($pos, $part, $haystack, $encoding);\n    }\n\n    public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $needle = self::mb_substr($needle, 0, 1, $encoding);\n        $pos = self::mb_strripos($haystack, $needle, $encoding);\n\n        return self::getSubpart($pos, $part, $haystack, $encoding);\n    }\n\n    public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);\n        $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);\n\n        return self::mb_strrpos($haystack, $needle, $offset, $encoding);\n    }\n\n    public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $pos = strpos($haystack, $needle);\n        if (false === $pos) {\n            return false;\n        }\n        if ($part) {\n            return substr($haystack, 0, $pos);\n        }\n\n        return substr($haystack, $pos);\n    }\n\n    public static function mb_get_info($type = 'all')\n    {\n        $info = array(\n            'internal_encoding' => self::$internalEncoding,\n            'http_output' => 'pass',\n            'http_output_conv_mimetypes' => '^(text/|application/xhtml\\+xml)',\n            'func_overload' => 0,\n            'func_overload_list' => 'no overload',\n            'mail_charset' => 'UTF-8',\n            'mail_header_encoding' => 'BASE64',\n            'mail_body_encoding' => 'BASE64',\n            'illegal_chars' => 0,\n            'encoding_translation' => 'Off',\n            'language' => self::$language,\n            'detect_order' => self::$encodingList,\n            'substitute_character' => 'none',\n            'strict_detection' => 'Off',\n        );\n\n        if ('all' === $type) {\n            return $info;\n        }\n        if (isset($info[$type])) {\n            return $info[$type];\n        }\n\n        return false;\n    }\n\n    public static function mb_http_input($type = '')\n    {\n        return false;\n    }\n\n    public static function mb_http_output($encoding = null)\n    {\n        return null !== $encoding ? 'pass' === $encoding : 'pass';\n    }\n\n    public static function mb_strwidth($s, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' !== $encoding) {\n            $s = iconv($encoding, 'UTF-8//IGNORE', $s);\n        }\n\n        $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);\n\n        return ($wide << 1) + iconv_strlen($s, 'UTF-8');\n    }\n\n    public static function mb_substr_count($haystack, $needle, $encoding = null)\n    {\n        return substr_count($haystack, $needle);\n    }\n\n    public static function mb_output_handler($contents, $status)\n    {\n        return $contents;\n    }\n\n    public static function mb_chr($code, $encoding = null)\n    {\n        if (0x80 > $code %= 0x200000) {\n            $s = \\chr($code);\n        } elseif (0x800 > $code) {\n            $s = \\chr(0xC0 | $code >> 6).\\chr(0x80 | $code & 0x3F);\n        } elseif (0x10000 > $code) {\n            $s = \\chr(0xE0 | $code >> 12).\\chr(0x80 | $code >> 6 & 0x3F).\\chr(0x80 | $code & 0x3F);\n        } else {\n            $s = \\chr(0xF0 | $code >> 18).\\chr(0x80 | $code >> 12 & 0x3F).\\chr(0x80 | $code >> 6 & 0x3F).\\chr(0x80 | $code & 0x3F);\n        }\n\n        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {\n            $s = mb_convert_encoding($s, $encoding, 'UTF-8');\n        }\n\n        return $s;\n    }\n\n    public static function mb_ord($s, $encoding = null)\n    {\n        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {\n            $s = mb_convert_encoding($s, 'UTF-8', $encoding);\n        }\n\n        if (1 === \\strlen($s)) {\n            return \\ord($s);\n        }\n\n        $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;\n        if (0xF0 <= $code) {\n            return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;\n        }\n        if (0xE0 <= $code) {\n            return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;\n        }\n        if (0xC0 <= $code) {\n            return (($code - 0xC0) << 6) + $s[2] - 0x80;\n        }\n\n        return $code;\n    }\n\n    private static function getSubpart($pos, $part, $haystack, $encoding)\n    {\n        if (false === $pos) {\n            return false;\n        }\n        if ($part) {\n            return self::mb_substr($haystack, 0, $pos, $encoding);\n        }\n\n        return self::mb_substr($haystack, $pos, null, $encoding);\n    }\n\n    private static function html_encoding_callback(array $m)\n    {\n        $i = 1;\n        $entities = '';\n        $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8'));\n\n        while (isset($m[$i])) {\n            if (0x80 > $m[$i]) {\n                $entities .= \\chr($m[$i++]);\n                continue;\n            }\n            if (0xF0 <= $m[$i]) {\n                $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;\n            } elseif (0xE0 <= $m[$i]) {\n                $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;\n            } else {\n                $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;\n            }\n\n            $entities .= '&#'.$c.';';\n        }\n\n        return $entities;\n    }\n\n    private static function title_case(array $s)\n    {\n        return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8');\n    }\n\n    private static function getData($file)\n    {\n        if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {\n            return require $file;\n        }\n\n        return false;\n    }\n\n    private static function getEncoding($encoding)\n    {\n        if (null === $encoding) {\n            return self::$internalEncoding;\n        }\n\n        if ('UTF-8' === $encoding) {\n            return 'UTF-8';\n        }\n\n        $encoding = strtoupper($encoding);\n\n        if ('8BIT' === $encoding || 'BINARY' === $encoding) {\n            return 'CP850';\n        }\n\n        if ('UTF8' === $encoding) {\n            return 'UTF-8';\n        }\n\n        return $encoding;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/README.md",
    "content": "Symfony Polyfill / Mbstring\n===========================\n\nThis component provides a partial, native PHP implementation for the\n[Mbstring](https://php.net/mbstring) extension.\n\nMore information can be found in the\n[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).\n\nLicense\n=======\n\nThis library is released under the [MIT license](LICENSE).\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php",
    "content": "<?php\n\nreturn array (\n  'A' => 'a',\n  'B' => 'b',\n  'C' => 'c',\n  'D' => 'd',\n  'E' => 'e',\n  'F' => 'f',\n  'G' => 'g',\n  'H' => 'h',\n  'I' => 'i',\n  'J' => 'j',\n  'K' => 'k',\n  'L' => 'l',\n  'M' => 'm',\n  'N' => 'n',\n  'O' => 'o',\n  'P' => 'p',\n  'Q' => 'q',\n  'R' => 'r',\n  'S' => 's',\n  'T' => 't',\n  'U' => 'u',\n  'V' => 'v',\n  'W' => 'w',\n  'X' => 'x',\n  'Y' => 'y',\n  'Z' => 'z',\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  'İ' => '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  'Ƥ' => 'ƥ',\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  'Ȱ' => 'ȱ',\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  'Ͼ' => 'ͼ',\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  'Ґ' => 'ґ',\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  'Ԝ' => 'ԝ',\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  'Ⴖ' => 'ⴖ',\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  'Ꮤ' => 'ꮤ',\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  'Ჴ' => 'ჴ',\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  'Ṹ' => 'ṹ',\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  'Ἆ' => 'ἆ',\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  'ᾼ' => 'ᾳ',\n  'Ὲ' => 'ὲ',\n  'Έ' => 'έ',\n  'Ὴ' => 'ὴ',\n  'Ή' => 'ή',\n  'ῌ' => 'ῃ',\n  'Ῐ' => 'ῐ',\n  'Ῑ' => 'ῑ',\n  'Ὶ' => 'ὶ',\n  'Ί' => 'ί',\n  'Ῠ' => 'ῠ',\n  'Ῡ' => 'ῡ',\n  'Ὺ' => 'ὺ',\n  'Ύ' => 'ύ',\n  'Ῥ' => 'ῥ',\n  'Ὸ' => 'ὸ',\n  'Ό' => 'ό',\n  'Ὼ' => 'ὼ',\n  'Ώ' => 'ώ',\n  'ῼ' => 'ῳ',\n  'Ω' => 'ω',\n  'K' => 'k',\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  'Ⱈ' => 'ⱈ',\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  'Ⳁ' => 'ⳁ',\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  'Ꜽ' => 'ꜽ',\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  'Ａ' => 'ａ',\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  '𐒴' => '𐓜',\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  '𐲦' => '𐳦',\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  '𖹙' => '𖹹',\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"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php",
    "content": "<?php\n\n// from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt\n\nreturn '/(?<![\\x{0027}\\x{002E}\\x{003A}\\x{005E}\\x{0060}\\x{00A8}\\x{00AD}\\x{00AF}\\x{00B4}\\x{00B7}\\x{00B8}\\x{02B0}-\\x{02C1}\\x{02C2}-\\x{02C5}\\x{02C6}-\\x{02D1}\\x{02D2}-\\x{02DF}\\x{02E0}-\\x{02E4}\\x{02E5}-\\x{02EB}\\x{02EC}\\x{02ED}\\x{02EE}\\x{02EF}-\\x{02FF}\\x{0300}-\\x{036F}\\x{0374}\\x{0375}\\x{037A}\\x{0384}-\\x{0385}\\x{0387}\\x{0483}-\\x{0487}\\x{0488}-\\x{0489}\\x{0559}\\x{0591}-\\x{05BD}\\x{05BF}\\x{05C1}-\\x{05C2}\\x{05C4}-\\x{05C5}\\x{05C7}\\x{05F4}\\x{0600}-\\x{0605}\\x{0610}-\\x{061A}\\x{061C}\\x{0640}\\x{064B}-\\x{065F}\\x{0670}\\x{06D6}-\\x{06DC}\\x{06DD}\\x{06DF}-\\x{06E4}\\x{06E5}-\\x{06E6}\\x{06E7}-\\x{06E8}\\x{06EA}-\\x{06ED}\\x{070F}\\x{0711}\\x{0730}-\\x{074A}\\x{07A6}-\\x{07B0}\\x{07EB}-\\x{07F3}\\x{07F4}-\\x{07F5}\\x{07FA}\\x{07FD}\\x{0816}-\\x{0819}\\x{081A}\\x{081B}-\\x{0823}\\x{0824}\\x{0825}-\\x{0827}\\x{0828}\\x{0829}-\\x{082D}\\x{0859}-\\x{085B}\\x{08D3}-\\x{08E1}\\x{08E2}\\x{08E3}-\\x{0902}\\x{093A}\\x{093C}\\x{0941}-\\x{0948}\\x{094D}\\x{0951}-\\x{0957}\\x{0962}-\\x{0963}\\x{0971}\\x{0981}\\x{09BC}\\x{09C1}-\\x{09C4}\\x{09CD}\\x{09E2}-\\x{09E3}\\x{09FE}\\x{0A01}-\\x{0A02}\\x{0A3C}\\x{0A41}-\\x{0A42}\\x{0A47}-\\x{0A48}\\x{0A4B}-\\x{0A4D}\\x{0A51}\\x{0A70}-\\x{0A71}\\x{0A75}\\x{0A81}-\\x{0A82}\\x{0ABC}\\x{0AC1}-\\x{0AC5}\\x{0AC7}-\\x{0AC8}\\x{0ACD}\\x{0AE2}-\\x{0AE3}\\x{0AFA}-\\x{0AFF}\\x{0B01}\\x{0B3C}\\x{0B3F}\\x{0B41}-\\x{0B44}\\x{0B4D}\\x{0B56}\\x{0B62}-\\x{0B63}\\x{0B82}\\x{0BC0}\\x{0BCD}\\x{0C00}\\x{0C04}\\x{0C3E}-\\x{0C40}\\x{0C46}-\\x{0C48}\\x{0C4A}-\\x{0C4D}\\x{0C55}-\\x{0C56}\\x{0C62}-\\x{0C63}\\x{0C81}\\x{0CBC}\\x{0CBF}\\x{0CC6}\\x{0CCC}-\\x{0CCD}\\x{0CE2}-\\x{0CE3}\\x{0D00}-\\x{0D01}\\x{0D3B}-\\x{0D3C}\\x{0D41}-\\x{0D44}\\x{0D4D}\\x{0D62}-\\x{0D63}\\x{0DCA}\\x{0DD2}-\\x{0DD4}\\x{0DD6}\\x{0E31}\\x{0E34}-\\x{0E3A}\\x{0E46}\\x{0E47}-\\x{0E4E}\\x{0EB1}\\x{0EB4}-\\x{0EB9}\\x{0EBB}-\\x{0EBC}\\x{0EC6}\\x{0EC8}-\\x{0ECD}\\x{0F18}-\\x{0F19}\\x{0F35}\\x{0F37}\\x{0F39}\\x{0F71}-\\x{0F7E}\\x{0F80}-\\x{0F84}\\x{0F86}-\\x{0F87}\\x{0F8D}-\\x{0F97}\\x{0F99}-\\x{0FBC}\\x{0FC6}\\x{102D}-\\x{1030}\\x{1032}-\\x{1037}\\x{1039}-\\x{103A}\\x{103D}-\\x{103E}\\x{1058}-\\x{1059}\\x{105E}-\\x{1060}\\x{1071}-\\x{1074}\\x{1082}\\x{1085}-\\x{1086}\\x{108D}\\x{109D}\\x{10FC}\\x{135D}-\\x{135F}\\x{1712}-\\x{1714}\\x{1732}-\\x{1734}\\x{1752}-\\x{1753}\\x{1772}-\\x{1773}\\x{17B4}-\\x{17B5}\\x{17B7}-\\x{17BD}\\x{17C6}\\x{17C9}-\\x{17D3}\\x{17D7}\\x{17DD}\\x{180B}-\\x{180D}\\x{180E}\\x{1843}\\x{1885}-\\x{1886}\\x{18A9}\\x{1920}-\\x{1922}\\x{1927}-\\x{1928}\\x{1932}\\x{1939}-\\x{193B}\\x{1A17}-\\x{1A18}\\x{1A1B}\\x{1A56}\\x{1A58}-\\x{1A5E}\\x{1A60}\\x{1A62}\\x{1A65}-\\x{1A6C}\\x{1A73}-\\x{1A7C}\\x{1A7F}\\x{1AA7}\\x{1AB0}-\\x{1ABD}\\x{1ABE}\\x{1B00}-\\x{1B03}\\x{1B34}\\x{1B36}-\\x{1B3A}\\x{1B3C}\\x{1B42}\\x{1B6B}-\\x{1B73}\\x{1B80}-\\x{1B81}\\x{1BA2}-\\x{1BA5}\\x{1BA8}-\\x{1BA9}\\x{1BAB}-\\x{1BAD}\\x{1BE6}\\x{1BE8}-\\x{1BE9}\\x{1BED}\\x{1BEF}-\\x{1BF1}\\x{1C2C}-\\x{1C33}\\x{1C36}-\\x{1C37}\\x{1C78}-\\x{1C7D}\\x{1CD0}-\\x{1CD2}\\x{1CD4}-\\x{1CE0}\\x{1CE2}-\\x{1CE8}\\x{1CED}\\x{1CF4}\\x{1CF8}-\\x{1CF9}\\x{1D2C}-\\x{1D6A}\\x{1D78}\\x{1D9B}-\\x{1DBF}\\x{1DC0}-\\x{1DF9}\\x{1DFB}-\\x{1DFF}\\x{1FBD}\\x{1FBF}-\\x{1FC1}\\x{1FCD}-\\x{1FCF}\\x{1FDD}-\\x{1FDF}\\x{1FED}-\\x{1FEF}\\x{1FFD}-\\x{1FFE}\\x{200B}-\\x{200F}\\x{2018}\\x{2019}\\x{2024}\\x{2027}\\x{202A}-\\x{202E}\\x{2060}-\\x{2064}\\x{2066}-\\x{206F}\\x{2071}\\x{207F}\\x{2090}-\\x{209C}\\x{20D0}-\\x{20DC}\\x{20DD}-\\x{20E0}\\x{20E1}\\x{20E2}-\\x{20E4}\\x{20E5}-\\x{20F0}\\x{2C7C}-\\x{2C7D}\\x{2CEF}-\\x{2CF1}\\x{2D6F}\\x{2D7F}\\x{2DE0}-\\x{2DFF}\\x{2E2F}\\x{3005}\\x{302A}-\\x{302D}\\x{3031}-\\x{3035}\\x{303B}\\x{3099}-\\x{309A}\\x{309B}-\\x{309C}\\x{309D}-\\x{309E}\\x{30FC}-\\x{30FE}\\x{A015}\\x{A4F8}-\\x{A4FD}\\x{A60C}\\x{A66F}\\x{A670}-\\x{A672}\\x{A674}-\\x{A67D}\\x{A67F}\\x{A69C}-\\x{A69D}\\x{A69E}-\\x{A69F}\\x{A6F0}-\\x{A6F1}\\x{A700}-\\x{A716}\\x{A717}-\\x{A71F}\\x{A720}-\\x{A721}\\x{A770}\\x{A788}\\x{A789}-\\x{A78A}\\x{A7F8}-\\x{A7F9}\\x{A802}\\x{A806}\\x{A80B}\\x{A825}-\\x{A826}\\x{A8C4}-\\x{A8C5}\\x{A8E0}-\\x{A8F1}\\x{A8FF}\\x{A926}-\\x{A92D}\\x{A947}-\\x{A951}\\x{A980}-\\x{A982}\\x{A9B3}\\x{A9B6}-\\x{A9B9}\\x{A9BC}\\x{A9CF}\\x{A9E5}\\x{A9E6}\\x{AA29}-\\x{AA2E}\\x{AA31}-\\x{AA32}\\x{AA35}-\\x{AA36}\\x{AA43}\\x{AA4C}\\x{AA70}\\x{AA7C}\\x{AAB0}\\x{AAB2}-\\x{AAB4}\\x{AAB7}-\\x{AAB8}\\x{AABE}-\\x{AABF}\\x{AAC1}\\x{AADD}\\x{AAEC}-\\x{AAED}\\x{AAF3}-\\x{AAF4}\\x{AAF6}\\x{AB5B}\\x{AB5C}-\\x{AB5F}\\x{ABE5}\\x{ABE8}\\x{ABED}\\x{FB1E}\\x{FBB2}-\\x{FBC1}\\x{FE00}-\\x{FE0F}\\x{FE13}\\x{FE20}-\\x{FE2F}\\x{FE52}\\x{FE55}\\x{FEFF}\\x{FF07}\\x{FF0E}\\x{FF1A}\\x{FF3E}\\x{FF40}\\x{FF70}\\x{FF9E}-\\x{FF9F}\\x{FFE3}\\x{FFF9}-\\x{FFFB}\\x{101FD}\\x{102E0}\\x{10376}-\\x{1037A}\\x{10A01}-\\x{10A03}\\x{10A05}-\\x{10A06}\\x{10A0C}-\\x{10A0F}\\x{10A38}-\\x{10A3A}\\x{10A3F}\\x{10AE5}-\\x{10AE6}\\x{10D24}-\\x{10D27}\\x{10F46}-\\x{10F50}\\x{11001}\\x{11038}-\\x{11046}\\x{1107F}-\\x{11081}\\x{110B3}-\\x{110B6}\\x{110B9}-\\x{110BA}\\x{110BD}\\x{110CD}\\x{11100}-\\x{11102}\\x{11127}-\\x{1112B}\\x{1112D}-\\x{11134}\\x{11173}\\x{11180}-\\x{11181}\\x{111B6}-\\x{111BE}\\x{111C9}-\\x{111CC}\\x{1122F}-\\x{11231}\\x{11234}\\x{11236}-\\x{11237}\\x{1123E}\\x{112DF}\\x{112E3}-\\x{112EA}\\x{11300}-\\x{11301}\\x{1133B}-\\x{1133C}\\x{11340}\\x{11366}-\\x{1136C}\\x{11370}-\\x{11374}\\x{11438}-\\x{1143F}\\x{11442}-\\x{11444}\\x{11446}\\x{1145E}\\x{114B3}-\\x{114B8}\\x{114BA}\\x{114BF}-\\x{114C0}\\x{114C2}-\\x{114C3}\\x{115B2}-\\x{115B5}\\x{115BC}-\\x{115BD}\\x{115BF}-\\x{115C0}\\x{115DC}-\\x{115DD}\\x{11633}-\\x{1163A}\\x{1163D}\\x{1163F}-\\x{11640}\\x{116AB}\\x{116AD}\\x{116B0}-\\x{116B5}\\x{116B7}\\x{1171D}-\\x{1171F}\\x{11722}-\\x{11725}\\x{11727}-\\x{1172B}\\x{1182F}-\\x{11837}\\x{11839}-\\x{1183A}\\x{11A01}-\\x{11A0A}\\x{11A33}-\\x{11A38}\\x{11A3B}-\\x{11A3E}\\x{11A47}\\x{11A51}-\\x{11A56}\\x{11A59}-\\x{11A5B}\\x{11A8A}-\\x{11A96}\\x{11A98}-\\x{11A99}\\x{11C30}-\\x{11C36}\\x{11C38}-\\x{11C3D}\\x{11C3F}\\x{11C92}-\\x{11CA7}\\x{11CAA}-\\x{11CB0}\\x{11CB2}-\\x{11CB3}\\x{11CB5}-\\x{11CB6}\\x{11D31}-\\x{11D36}\\x{11D3A}\\x{11D3C}-\\x{11D3D}\\x{11D3F}-\\x{11D45}\\x{11D47}\\x{11D90}-\\x{11D91}\\x{11D95}\\x{11D97}\\x{11EF3}-\\x{11EF4}\\x{16AF0}-\\x{16AF4}\\x{16B30}-\\x{16B36}\\x{16B40}-\\x{16B43}\\x{16F8F}-\\x{16F92}\\x{16F93}-\\x{16F9F}\\x{16FE0}-\\x{16FE1}\\x{1BC9D}-\\x{1BC9E}\\x{1BCA0}-\\x{1BCA3}\\x{1D167}-\\x{1D169}\\x{1D173}-\\x{1D17A}\\x{1D17B}-\\x{1D182}\\x{1D185}-\\x{1D18B}\\x{1D1AA}-\\x{1D1AD}\\x{1D242}-\\x{1D244}\\x{1DA00}-\\x{1DA36}\\x{1DA3B}-\\x{1DA6C}\\x{1DA75}\\x{1DA84}\\x{1DA9B}-\\x{1DA9F}\\x{1DAA1}-\\x{1DAAF}\\x{1E000}-\\x{1E006}\\x{1E008}-\\x{1E018}\\x{1E01B}-\\x{1E021}\\x{1E023}-\\x{1E024}\\x{1E026}-\\x{1E02A}\\x{1E8D0}-\\x{1E8D6}\\x{1E944}-\\x{1E94A}\\x{1F3FB}-\\x{1F3FF}\\x{E0001}\\x{E0020}-\\x{E007F}\\x{E0100}-\\x{E01EF}])(\\pL)(\\pL*+)/u';\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php",
    "content": "<?php\n\nreturn array (\n  'a' => 'A',\n  'b' => 'B',\n  'c' => 'C',\n  'd' => 'D',\n  'e' => 'E',\n  'f' => 'F',\n  'g' => 'G',\n  'h' => 'H',\n  'i' => 'I',\n  'j' => 'J',\n  'k' => 'K',\n  'l' => 'L',\n  'm' => 'M',\n  'n' => 'N',\n  'o' => 'O',\n  'p' => 'P',\n  'q' => 'Q',\n  'r' => 'R',\n  's' => 'S',\n  't' => 'T',\n  'u' => 'U',\n  'v' => 'V',\n  'w' => 'W',\n  'x' => 'X',\n  'y' => 'Y',\n  'z' => 'Z',\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  'ı' => '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  'ſ' => 'S',\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  'ȥ' => 'Ȥ',\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  'ζ' => 'Ζ',\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  'х' => 'Х',\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  'ҿ' => 'Ҿ',\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  'ծ' => 'Ծ',\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  'ჿ' => 'Ჿ',\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  'ṧ' => 'Ṧ',\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  'ỻ' => 'Ỻ',\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  'ᾅ' => 'ᾍ',\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  'ⓦ' => 'Ⓦ',\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  'ⲗ' => 'Ⲗ',\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  'ⴜ' => 'Ⴜ',\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  'ꝏ' => 'Ꝏ',\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  'ꮅ' => 'Ꮅ',\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  'ｌ' => 'Ｌ',\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  '𐓧' => '𐒿',\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  '𐳱' => '𐲱',\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  '𞤦' => '𞤄',\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"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/bootstrap.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Mbstring as p;\n\nif (!function_exists('mb_convert_encoding')) {\n    function mb_convert_encoding($s, $to, $from = null) { return p\\Mbstring::mb_convert_encoding($s, $to, $from); }\n}\nif (!function_exists('mb_decode_mimeheader')) {\n    function mb_decode_mimeheader($s) { return p\\Mbstring::mb_decode_mimeheader($s); }\n}\nif (!function_exists('mb_encode_mimeheader')) {\n    function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null) { return p\\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent); }\n}\nif (!function_exists('mb_decode_numericentity')) {\n    function mb_decode_numericentity($s, $convmap, $enc = null) { return p\\Mbstring::mb_decode_numericentity($s, $convmap, $enc); }\n}\nif (!function_exists('mb_encode_numericentity')) {\n    function mb_encode_numericentity($s, $convmap, $enc = null, $is_hex = false) { return p\\Mbstring::mb_encode_numericentity($s, $convmap, $enc, $is_hex); }\n}\nif (!function_exists('mb_convert_case')) {\n    function mb_convert_case($s, $mode, $enc = null) { return p\\Mbstring::mb_convert_case($s, $mode, $enc); }\n}\nif (!function_exists('mb_internal_encoding')) {\n    function mb_internal_encoding($enc = null) { return p\\Mbstring::mb_internal_encoding($enc); }\n}\nif (!function_exists('mb_language')) {\n    function mb_language($lang = null) { return p\\Mbstring::mb_language($lang); }\n}\nif (!function_exists('mb_list_encodings')) {\n    function mb_list_encodings() { return p\\Mbstring::mb_list_encodings(); }\n}\nif (!function_exists('mb_encoding_aliases')) {\n    function mb_encoding_aliases($encoding) { return p\\Mbstring::mb_encoding_aliases($encoding); }\n}\nif (!function_exists('mb_check_encoding')) {\n    function mb_check_encoding($var = null, $encoding = null) { return p\\Mbstring::mb_check_encoding($var, $encoding); }\n}\nif (!function_exists('mb_detect_encoding')) {\n    function mb_detect_encoding($str, $encodingList = null, $strict = false) { return p\\Mbstring::mb_detect_encoding($str, $encodingList, $strict); }\n}\nif (!function_exists('mb_detect_order')) {\n    function mb_detect_order($encodingList = null) { return p\\Mbstring::mb_detect_order($encodingList); }\n}\nif (!function_exists('mb_parse_str')) {\n    function mb_parse_str($s, &$result = array()) { parse_str($s, $result); }\n}\nif (!function_exists('mb_strlen')) {\n    function mb_strlen($s, $enc = null) { return p\\Mbstring::mb_strlen($s, $enc); }\n}\nif (!function_exists('mb_strpos')) {\n    function mb_strpos($s, $needle, $offset = 0, $enc = null) { return p\\Mbstring::mb_strpos($s, $needle, $offset, $enc); }\n}\nif (!function_exists('mb_strtolower')) {\n    function mb_strtolower($s, $enc = null) { return p\\Mbstring::mb_strtolower($s, $enc); }\n}\nif (!function_exists('mb_strtoupper')) {\n    function mb_strtoupper($s, $enc = null) { return p\\Mbstring::mb_strtoupper($s, $enc); }\n}\nif (!function_exists('mb_substitute_character')) {\n    function mb_substitute_character($char = null) { return p\\Mbstring::mb_substitute_character($char); }\n}\nif (!function_exists('mb_substr')) {\n    function mb_substr($s, $start, $length = 2147483647, $enc = null) { return p\\Mbstring::mb_substr($s, $start, $length, $enc); }\n}\nif (!function_exists('mb_stripos')) {\n    function mb_stripos($s, $needle, $offset = 0, $enc = null) { return p\\Mbstring::mb_stripos($s, $needle, $offset, $enc); }\n}\nif (!function_exists('mb_stristr')) {\n    function mb_stristr($s, $needle, $part = false, $enc = null) { return p\\Mbstring::mb_stristr($s, $needle, $part, $enc); }\n}\nif (!function_exists('mb_strrchr')) {\n    function mb_strrchr($s, $needle, $part = false, $enc = null) { return p\\Mbstring::mb_strrchr($s, $needle, $part, $enc); }\n}\nif (!function_exists('mb_strrichr')) {\n    function mb_strrichr($s, $needle, $part = false, $enc = null) { return p\\Mbstring::mb_strrichr($s, $needle, $part, $enc); }\n}\nif (!function_exists('mb_strripos')) {\n    function mb_strripos($s, $needle, $offset = 0, $enc = null) { return p\\Mbstring::mb_strripos($s, $needle, $offset, $enc); }\n}\nif (!function_exists('mb_strrpos')) {\n    function mb_strrpos($s, $needle, $offset = 0, $enc = null) { return p\\Mbstring::mb_strrpos($s, $needle, $offset, $enc); }\n}\nif (!function_exists('mb_strstr')) {\n    function mb_strstr($s, $needle, $part = false, $enc = null) { return p\\Mbstring::mb_strstr($s, $needle, $part, $enc); }\n}\nif (!function_exists('mb_get_info')) {\n    function mb_get_info($type = 'all') { return p\\Mbstring::mb_get_info($type); }\n}\nif (!function_exists('mb_http_output')) {\n    function mb_http_output($enc = null) { return p\\Mbstring::mb_http_output($enc); }\n}\nif (!function_exists('mb_strwidth')) {\n    function mb_strwidth($s, $enc = null) { return p\\Mbstring::mb_strwidth($s, $enc); }\n}\nif (!function_exists('mb_substr_count')) {\n    function mb_substr_count($haystack, $needle, $enc = null) { return p\\Mbstring::mb_substr_count($haystack, $needle, $enc); }\n}\nif (!function_exists('mb_output_handler')) {\n    function mb_output_handler($contents, $status) { return p\\Mbstring::mb_output_handler($contents, $status); }\n}\nif (!function_exists('mb_http_input')) {\n    function mb_http_input($type = '') { return p\\Mbstring::mb_http_input($type); }\n}\nif (!function_exists('mb_convert_variables')) {\n    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); }\n}\nif (!function_exists('mb_ord')) {\n    function mb_ord($s, $enc = null) { return p\\Mbstring::mb_ord($s, $enc); }\n}\nif (!function_exists('mb_chr')) {\n    function mb_chr($code, $enc = null) { return p\\Mbstring::mb_chr($code, $enc); }\n}\nif (!function_exists('mb_scrub')) {\n    function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); }\n}\nif (!function_exists('mb_str_split')) {\n    function mb_str_split($string, $split_length = 1, $encoding = null) { return p\\Mbstring::mb_str_split($string, $split_length, $encoding); }\n}\n\nif (extension_loaded('mbstring')) {\n    return;\n}\n\nif (!defined('MB_CASE_UPPER')) {\n    define('MB_CASE_UPPER', 0);\n}\nif (!defined('MB_CASE_LOWER')) {\n    define('MB_CASE_LOWER', 1);\n}\nif (!defined('MB_CASE_TITLE')) {\n    define('MB_CASE_TITLE', 2);\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/composer.json",
    "content": "{\n    \"name\": \"symfony/polyfill-mbstring\",\n    \"type\": \"library\",\n    \"description\": \"Symfony polyfill for the Mbstring extension\",\n    \"keywords\": [\"polyfill\", \"shim\", \"compatibility\", \"portable\", \"mbstring\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.3.3\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Polyfill\\\\Mbstring\\\\\": \"\" },\n        \"files\": [ \"bootstrap.php\" ]\n    },\n    \"suggest\": {\n        \"ext-mbstring\": \"For best performance\"\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.17-dev\"\n        },\n        \"thanks\": {\n            \"name\": \"symfony/polyfill\",\n            \"url\": \"https://github.com/symfony/polyfill\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-php72/LICENSE",
    "content": "Copyright (c) 2015-2019 Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-php72/Php72.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Polyfill\\Php72;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>\n *\n * @internal\n */\nfinal class Php72\n{\n    private static $hashMask;\n\n    public static function utf8_encode($s)\n    {\n        $s .= $s;\n        $len = \\strlen($s);\n\n        for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) {\n            switch (true) {\n                case $s[$i] < \"\\x80\": $s[$j] = $s[$i]; break;\n                case $s[$i] < \"\\xC0\": $s[$j] = \"\\xC2\"; $s[++$j] = $s[$i]; break;\n                default: $s[$j] = \"\\xC3\"; $s[++$j] = \\chr(\\ord($s[$i]) - 64); break;\n            }\n        }\n\n        return substr($s, 0, $j);\n    }\n\n    public static function utf8_decode($s)\n    {\n        $s = (string) $s;\n        $len = \\strlen($s);\n\n        for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) {\n            switch ($s[$i] & \"\\xF0\") {\n                case \"\\xC0\":\n                case \"\\xD0\":\n                    $c = (\\ord($s[$i] & \"\\x1F\") << 6) | \\ord($s[++$i] & \"\\x3F\");\n                    $s[$j] = $c < 256 ? \\chr($c) : '?';\n                    break;\n\n                case \"\\xF0\":\n                    ++$i;\n                    // no break\n\n                case \"\\xE0\":\n                    $s[$j] = '?';\n                    $i += 2;\n                    break;\n\n                default:\n                    $s[$j] = $s[$i];\n            }\n        }\n\n        return substr($s, 0, $j);\n    }\n\n    public static function php_os_family()\n    {\n        if ('\\\\' === \\DIRECTORY_SEPARATOR) {\n            return 'Windows';\n        }\n\n        $map = array(\n            'Darwin' => 'Darwin',\n            'DragonFly' => 'BSD',\n            'FreeBSD' => 'BSD',\n            'NetBSD' => 'BSD',\n            'OpenBSD' => 'BSD',\n            'Linux' => 'Linux',\n            'SunOS' => 'Solaris',\n        );\n\n        return isset($map[PHP_OS]) ? $map[PHP_OS] : 'Unknown';\n    }\n\n    public static function spl_object_id($object)\n    {\n        if (null === self::$hashMask) {\n            self::initHashMask();\n        }\n        if (null === $hash = spl_object_hash($object)) {\n            return;\n        }\n\n        // On 32-bit systems, PHP_INT_SIZE is 4,\n        return self::$hashMask ^ hexdec(substr($hash, 16 - (\\PHP_INT_SIZE * 2 - 1), (\\PHP_INT_SIZE * 2 - 1)));\n    }\n\n    public static function sapi_windows_vt100_support($stream, $enable = null)\n    {\n        if (!\\is_resource($stream)) {\n            trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, '.\\gettype($stream).' given', E_USER_WARNING);\n\n            return false;\n        }\n\n        $meta = stream_get_meta_data($stream);\n\n        if ('STDIO' !== $meta['stream_type']) {\n            trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', E_USER_WARNING);\n\n            return false;\n        }\n\n        // We cannot actually disable vt100 support if it is set\n        if (false === $enable || !self::stream_isatty($stream)) {\n            return false;\n        }\n\n        // The native function does not apply to stdin\n        $meta = array_map('strtolower', $meta);\n        $stdin = 'php://stdin' === $meta['uri'] || 'php://fd/0' === $meta['uri'];\n\n        return !$stdin\n            && (false !== getenv('ANSICON')\n            || 'ON' === getenv('ConEmuANSI')\n            || 'xterm' === getenv('TERM')\n            || 'Hyper' === getenv('TERM_PROGRAM'));\n    }\n\n    public static function stream_isatty($stream)\n    {\n        if (!\\is_resource($stream)) {\n            trigger_error('stream_isatty() expects parameter 1 to be resource, '.\\gettype($stream).' given', E_USER_WARNING);\n\n            return false;\n        }\n\n        if ('\\\\' === \\DIRECTORY_SEPARATOR) {\n            $stat = @fstat($stream);\n            // Check if formatted mode is S_IFCHR\n            return $stat ? 0020000 === ($stat['mode'] & 0170000) : false;\n        }\n\n        return \\function_exists('posix_isatty') && @posix_isatty($stream);\n    }\n\n    private static function initHashMask()\n    {\n        $obj = (object) array();\n        self::$hashMask = -1;\n\n        // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below\n        $obFuncs = array('ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush');\n        foreach (debug_backtrace(\\PHP_VERSION_ID >= 50400 ? DEBUG_BACKTRACE_IGNORE_ARGS : false) as $frame) {\n            if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \\in_array($frame['function'], $obFuncs)) {\n                $frame['line'] = 0;\n                break;\n            }\n        }\n        if (!empty($frame['line'])) {\n            ob_start();\n            debug_zval_dump($obj);\n            self::$hashMask = (int) substr(ob_get_clean(), 17);\n        }\n\n        self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\\PHP_INT_SIZE * 2 - 1), (\\PHP_INT_SIZE * 2 - 1)));\n    }\n\n    public static function mb_chr($code, $encoding = null)\n    {\n        if (0x80 > $code %= 0x200000) {\n            $s = \\chr($code);\n        } elseif (0x800 > $code) {\n            $s = \\chr(0xC0 | $code >> 6).\\chr(0x80 | $code & 0x3F);\n        } elseif (0x10000 > $code) {\n            $s = \\chr(0xE0 | $code >> 12).\\chr(0x80 | $code >> 6 & 0x3F).\\chr(0x80 | $code & 0x3F);\n        } else {\n            $s = \\chr(0xF0 | $code >> 18).\\chr(0x80 | $code >> 12 & 0x3F).\\chr(0x80 | $code >> 6 & 0x3F).\\chr(0x80 | $code & 0x3F);\n        }\n\n        if ('UTF-8' !== $encoding) {\n            $s = mb_convert_encoding($s, $encoding, 'UTF-8');\n        }\n\n        return $s;\n    }\n\n    public static function mb_ord($s, $encoding = null)\n    {\n        if (null == $encoding) {\n            $s = mb_convert_encoding($s, 'UTF-8');\n        } elseif ('UTF-8' !== $encoding) {\n            $s = mb_convert_encoding($s, 'UTF-8', $encoding);\n        }\n\n        if (1 === \\strlen($s)) {\n            return \\ord($s);\n        }\n\n        $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;\n        if (0xF0 <= $code) {\n            return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;\n        }\n        if (0xE0 <= $code) {\n            return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;\n        }\n        if (0xC0 <= $code) {\n            return (($code - 0xC0) << 6) + $s[2] - 0x80;\n        }\n\n        return $code;\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-php72/README.md",
    "content": "Symfony Polyfill / Php72\n========================\n\nThis component provides functions added to PHP 7.2 core:\n\n- [`spl_object_id`](https://php.net/spl_object_id)\n- [`stream_isatty`](https://php.net/stream_isatty)\n\nOn Windows only:\n\n- [`sapi_windows_vt100_support`](https://php.net/sapi_windows_vt100_support)\n\nMoved to core since 7.2 (was in the optional XML extension earlier):\n\n- [`utf8_encode`](https://php.net/utf8_encode)\n- [`utf8_decode`](https://php.net/utf8_decode)\n\nAlso, it provides constants added to PHP 7.2:\n- [`PHP_FLOAT_*`](https://php.net/reserved.constants#constant.php-float-dig)\n- [`PHP_OS_FAMILY`](https://php.net/reserved.constants#constant.php-os-family)\n\nMore information can be found in the\n[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).\n\nLicense\n=======\n\nThis library is released under the [MIT license](LICENSE).\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-php72/bootstrap.php",
    "content": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Php72 as p;\n\nif (PHP_VERSION_ID >= 70200) {\n    return;\n}\n\nif (!defined('PHP_FLOAT_DIG')) {\n    define('PHP_FLOAT_DIG', 15);\n}\nif (!defined('PHP_FLOAT_EPSILON')) {\n    define('PHP_FLOAT_EPSILON', 2.2204460492503E-16);\n}\nif (!defined('PHP_FLOAT_MIN')) {\n    define('PHP_FLOAT_MIN', 2.2250738585072E-308);\n}\nif (!defined('PHP_FLOAT_MAX')) {\n    define('PHP_FLOAT_MAX', 1.7976931348623157E+308);\n}\nif (!defined('PHP_OS_FAMILY')) {\n    define('PHP_OS_FAMILY', p\\Php72::php_os_family());\n}\n\nif ('\\\\' === DIRECTORY_SEPARATOR && !function_exists('sapi_windows_vt100_support')) {\n    function sapi_windows_vt100_support($stream, $enable = null) { return p\\Php72::sapi_windows_vt100_support($stream, $enable); }\n}\nif (!function_exists('stream_isatty')) {\n    function stream_isatty($stream) { return p\\Php72::stream_isatty($stream); }\n}\nif (!function_exists('utf8_encode')) {\n    function utf8_encode($s) { return p\\Php72::utf8_encode($s); }\n}\nif (!function_exists('utf8_decode')) {\n    function utf8_decode($s) { return p\\Php72::utf8_decode($s); }\n}\nif (!function_exists('spl_object_id')) {\n    function spl_object_id($s) { return p\\Php72::spl_object_id($s); }\n}\nif (!function_exists('mb_ord')) {\n    function mb_ord($s, $enc = null) { return p\\Php72::mb_ord($s, $enc); }\n}\nif (!function_exists('mb_chr')) {\n    function mb_chr($code, $enc = null) { return p\\Php72::mb_chr($code, $enc); }\n}\nif (!function_exists('mb_scrub')) {\n    function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); }\n}\n"
  },
  {
    "path": "配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-php72/composer.json",
    "content": "{\n    \"name\": \"symfony/polyfill-php72\",\n    \"type\": \"library\",\n    \"description\": \"Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions\",\n    \"keywords\": [\"polyfill\", \"shim\", \"compatibility\", \"portable\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.3.3\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Polyfill\\\\Php72\\\\\": \"\" },\n        \"files\": [ \"bootstrap.php\" ]\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"1.17-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "配套插件/BsCore/pages/panel.php",
    "content": "<?php\nif (!defined('__TYPECHO_ROOT_DIR__')) exit;\nrequire_once 'header.php';\nrequire_once 'menu.php';\n\nuse \\Typecho\\Widget;\nuse \\TypechoPlugin\\BsCore\\Plugin;\n\n$current = $request->get('act', 'index');\n$theme = $request->get('file', 'owner.html');\nif($theme == 'owner.html'){\n    $themeText = '博主所收到的评论邮件模板';\n}\nelseif($theme == 'guest.html'){\n    $themeText = '访客所收到的评论邮件模板';\n}\nelseif($theme == 'friendlink_approved.html'){\n    $themeText = '友链审核通过的邮件模板';\n}\nelseif($theme == 'friendlink_notify.html'){\n    $themeText = '提醒博主审核友链的邮件模板';\n}\nelseif($theme == 'friendlink_reject.html'){\n    $themeText = '友链审核不通过的邮件模板';\n}\nelse{\n    $themeText = '未知邮件模板';\n}\n$title = $current == 'index' ? $menu->title : '邮件发送模板 ' . $theme.'（'.$themeText.'）';\n?>\n<div class=\"main\">\n    <div class=\"body container\">\n        <div class=\"typecho-page-title\">\n            <h2><?= $title ?></h2>\n        </div>\n        <div class=\"row typecho-page-main\" role=\"main\">\n            <!-- MENU -->\n            <div class=\"col-mb-12\">\n                <ul class=\"typecho-option-tabs fix-tabs clearfix\">\n\n                    <li <?= ($current == 'editemailtemplates' || 'index' ? ' class=\"current\"' : '') ?>>\n                        <a href=\"<?php $options->adminUrl('extending.php?panel=' . Plugin::$_panel . '&act=editemailtemplates'); ?>\">\n                            <?php _e('邮件发送模板'); ?>\n                        </a>\n                    </li>\n                    <li>\n                        <a href=\"<?php $options->adminUrl('options-theme.php') ?>\"><?php _e('主题控制中心'); ?></a>\n                    </li>\n                </ul>\n            </div>\n      \n            <?php Widget::widget('TypechoPlugin\\BsCore\\Console')->to($files);?>\n    \n                <div class=\"typecho-edit-theme\">\n                           \n                    \n                    \n                    <div class=\"col-mb-12 col-tb-8 col-9 content\">\n                        \n                        <form method=\"post\" name=\"theme\" id=\"theme\" action=\"<?php $options->index('/action/' . Plugin::$action); ?>\">\n                            <label for=\"content\" class=\"sr-only\"><?php _e('编辑模板'); ?></label>\n                            <textarea name=\"content\" id=\"content\" class=\"w-100 mono\" <?php if (!$files->currentIsWriteable()) echo 'readonly'; ?>><?php echo $files->currentContent(); ?></textarea>\n                            <p class=\"submit\">\n                                <?php if ($files->currentIsWriteable()) : ?>\n                                    <input type=\"hidden\" name=\"do\" value=\"editEmailTemplate\" />\n                                    <input type=\"hidden\" name=\"edit\" value=\"<?php echo $files->currentFile(); ?>\" />\n                                    <button type=\"submit\" class=\"btn primary\"><?php _e('保存模板'); ?></button>\n                                <?php else : ?>\n                                    <em><?php _e('文件无写入权限'); ?></em>\n                                <?php endif; ?>\n                            </p>\n                        </form>\n                    </div>\n                      <ul class=\"col-mb-12 col-tb-4 col-3\">\n                        <li><strong>模板文件</strong></li>\n                        <?php while ($files->next()) : ?>\n                            <li <?php if ($files->current) echo \"class='current'\"; ?>>\n                                <a href=\"<?php $options->adminUrl('extending.php?panel=' . Plugin::$_panel . '&act=theme' . '&file=' . $files->file); ?>\">\n                                    <?php $files->file(); ?>\n                                </a>\n                            </li>\n                        <?php endwhile; ?>\n                    </ul>   \n                </div>\n                \n          \n        </div>\n    </div>\n</div>\n\n<?php\nrequire_once 'copyright.php';\nrequire_once 'common-js.php';\nrequire_once 'footer.php';\n?>"
  }
]